diff --git a/changelog.md b/changelog.md index 4d0165e..09a4403 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,13 @@ # Changelog +## 2026-03-14 - 1.12.1 - fix(storage) +rename S3 configuration and change stream interfaces to storage-oriented types + +- Renames public config APIs from setS3Config/getS3Config/hasS3 to setStorageConfig/getStorageConfig/hasStorage. +- Replaces shared S3 interfaces with storage equivalents such as IStorageConfig, IStorageObject, IStorageChangeEvent, and storage subscription request types. +- Updates frontend integration to use dees-storage-browser and the new storage data provider and change stream types. +- Refreshes dependency versions and documentation to match the new storage-oriented naming. + ## 2026-03-12 - 1.12.0 - feat(web) replace custom S3 browser components with dees-s3-browser integration diff --git a/package.json b/package.json index 55ff00d..3b86062 100644 --- a/package.json +++ b/package.json @@ -20,35 +20,35 @@ "tsview": "cli.js" }, "devDependencies": { - "@api.global/typedsocket": "^4.1.0", - "@git.zone/tsbuild": "^4.1.2", - "@git.zone/tsbundle": "^2.8.3", + "@api.global/typedsocket": "^4.1.2", + "@git.zone/tsbuild": "^4.3.0", + "@git.zone/tsbundle": "^2.9.1", "@git.zone/tsrun": "^2.0.1", - "@git.zone/tstest": "^3.1.8", - "@git.zone/tswatch": "3.0.1", + "@git.zone/tstest": "^3.3.2", + "@git.zone/tswatch": "^3.3.0", "@push.rocks/smartrx": "^3.0.10", - "@types/node": "^25.0.10" + "@types/node": "^25.5.0" }, "dependencies": { - "@api.global/typedrequest": "^3.2.5", + "@api.global/typedrequest": "^3.3.0", "@api.global/typedrequest-interfaces": "^3.0.19", - "@api.global/typedserver": "^8.3.0", - "@aws-sdk/client-s3": "^3.975.0", - "@design.estate/dees-catalog": "^3.41.2", - "@design.estate/dees-element": "^2.1.6", + "@api.global/typedserver": "^8.4.2", + "@aws-sdk/client-s3": "^3.1009.0", + "@design.estate/dees-catalog": "^3.48.5", + "@design.estate/dees-element": "^2.2.3", "@push.rocks/early": "^4.0.4", "@push.rocks/npmextra": "^5.3.3", - "@push.rocks/smartbucket": "^4.4.1", + "@push.rocks/smartbucket": "^4.5.1", "@push.rocks/smartcli": "^4.0.20", - "@push.rocks/smartdata": "^7.0.15", + "@push.rocks/smartdata": "^7.1.0", "@push.rocks/smartfile": "^13.1.2", - "@push.rocks/smartlog": "^3.1.10", + "@push.rocks/smartlog": "^3.2.1", "@push.rocks/smartlog-destination-local": "^9.0.2", "@push.rocks/smartnetwork": "^4.4.0", "@push.rocks/smartopen": "^2.0.0", "@push.rocks/smartpath": "^6.0.0", "@push.rocks/smartpromise": "^4.2.3", - "mongodb": "^7.0.0" + "mongodb": "^7.1.0" }, "files": [ "ts/**/*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 278f88e..6c38b24 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,23 +9,23 @@ importers: .: dependencies: '@api.global/typedrequest': - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 '@api.global/typedrequest-interfaces': specifier: ^3.0.19 version: 3.0.19 '@api.global/typedserver': - specifier: ^8.3.0 - version: 8.3.0(@tiptap/pm@2.27.2) + specifier: ^8.4.2 + version: 8.4.2(@tiptap/pm@2.27.2) '@aws-sdk/client-s3': - specifier: ^3.975.0 - version: 3.975.0 + specifier: ^3.1009.0 + version: 3.1009.0 '@design.estate/dees-catalog': - specifier: ^3.41.2 - version: 3.41.2(@tiptap/pm@2.27.2) + specifier: ^3.48.5 + version: 3.48.5(@tiptap/pm@2.27.2) '@design.estate/dees-element': - specifier: ^2.1.6 - version: 2.1.6 + specifier: ^2.2.3 + version: 2.2.3 '@push.rocks/early': specifier: ^4.0.4 version: 4.0.4 @@ -33,20 +33,20 @@ importers: specifier: ^5.3.3 version: 5.3.3 '@push.rocks/smartbucket': - specifier: ^4.4.1 - version: 4.4.1 + specifier: ^4.5.1 + version: 4.5.1 '@push.rocks/smartcli': specifier: ^4.0.20 version: 4.0.20 '@push.rocks/smartdata': - specifier: ^7.0.15 - version: 7.0.15(socks@2.8.7) + specifier: ^7.1.0 + version: 7.1.0(socks@2.8.7) '@push.rocks/smartfile': specifier: ^13.1.2 version: 13.1.2 '@push.rocks/smartlog': - specifier: ^3.1.10 - version: 3.1.10 + specifier: ^3.2.1 + version: 3.2.1 '@push.rocks/smartlog-destination-local': specifier: ^9.0.2 version: 9.0.2 @@ -63,33 +63,33 @@ importers: specifier: ^4.2.3 version: 4.2.3 mongodb: - specifier: ^7.0.0 - version: 7.0.0(socks@2.8.7) + specifier: ^7.1.0 + version: 7.1.0(socks@2.8.7) devDependencies: '@api.global/typedsocket': - specifier: ^4.1.0 - version: 4.1.0(@push.rocks/smartserve@2.0.1) - '@git.zone/tsbuild': specifier: ^4.1.2 - version: 4.1.2 + version: 4.1.2(@push.rocks/smartserve@2.0.1) + '@git.zone/tsbuild': + specifier: ^4.3.0 + version: 4.3.0 '@git.zone/tsbundle': - specifier: ^2.8.3 - version: 2.8.3 + specifier: ^2.9.1 + version: 2.9.1 '@git.zone/tsrun': specifier: ^2.0.1 version: 2.0.1 '@git.zone/tstest': - specifier: ^3.1.8 - version: 3.1.8(@push.rocks/smartserve@2.0.1)(socks@2.8.7)(typescript@5.9.3) + specifier: ^3.3.2 + version: 3.3.2(socks@2.8.7)(typescript@5.9.3) '@git.zone/tswatch': - specifier: 3.0.1 - version: 3.0.1(@tiptap/pm@2.27.2) + specifier: ^3.3.0 + version: 3.3.0(@tiptap/pm@2.27.2) '@push.rocks/smartrx': specifier: ^3.0.10 version: 3.0.10 '@types/node': - specifier: ^25.0.10 - version: 25.0.10 + specifier: ^25.5.0 + version: 25.5.0 packages: @@ -99,25 +99,14 @@ packages: '@api.global/typedrequest-interfaces@3.0.19': resolution: {integrity: sha512-uuHUXJeOy/inWSDrwD0Cwax2rovpxYllDhM2RWh+6mVpQuNmZ3uw6IVg6dA2G1rOe24Ebs+Y9SzEogo+jYN7vw==} - '@api.global/typedrequest@3.2.5': - resolution: {integrity: sha512-LM/sUTuYnU5xY4gNZrN6ERMiKr+SpDZuSxJkAZz1YazC7ymGfo6uQ8sCnN8eNNQNFqIOkC+BtfYRayfbGwYLLg==} + '@api.global/typedrequest@3.3.0': + resolution: {integrity: sha512-Jwobqla+9k2IBG0duwrCFtc6GU6wsvHS3f0gJJsxTrpapylBW1YSF7NnGHPGs7F9hbATsO6IoUBpR2ScoKyGJA==} - '@api.global/typedserver@3.0.80': - resolution: {integrity: sha512-dcp0oXsjBL+XdFg1wUUP08uJQid5bQ0Yv3V3Y3lnI2QCbat0FU+Tsb0TZRnZ4+P150Vj/ITBqJUgDzFsF34grA==} + '@api.global/typedserver@8.4.2': + resolution: {integrity: sha512-eESOcWvrbqkshR4s4OeTX1AK74bNCeGgiRebKgjxIzJ+b0+rkPQyn2DOaMtyXjFZRNgRHyytLm5Iqj5fdazeqw==} - '@api.global/typedserver@8.3.0': - resolution: {integrity: sha512-Uh2sQkoQXbsKFb/fhSm7P9oCCEnawGY7R5/9VgCLQUuFV30G0FL0oBTKZNqFli0CNNDDs0nQHE+dpdf4VHhlXQ==} - - '@api.global/typedsocket@3.1.1': - resolution: {integrity: sha512-Wkz3NlhmfdZMKqXXI2c2dMtGGmSmhdOegZiziL+9b2mqPYdc7Gd8AZRdEOKvbSoIvc9G22/5BEadIWHrfq66TA==} - peerDependencies: - '@push.rocks/smartserve': '>=1.0.0' - peerDependenciesMeta: - '@push.rocks/smartserve': - optional: true - - '@api.global/typedsocket@4.1.0': - resolution: {integrity: sha512-ttmoU5BNHmLAkAF/o+Ta8F5O4F7CUmkFo6LK7NKHQvuYJvodPMYWdhJ6yCINTF4pfCgljkMDUqoVKobm6ea4mQ==} + '@api.global/typedsocket@4.1.2': + resolution: {integrity: sha512-fZFuJY9ucFCICjF4wi6OvK8drsv6UcwVVsfamOT1HxFj7OBOYw6QHOceQ+cAQ8IrWbX817sf8gzlesl+jlG8JA==} peerDependencies: '@push.rocks/smartserve': '>=1.1.0' @@ -144,147 +133,127 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.975.0': - resolution: {integrity: sha512-aF1M/iMD29BPcpxjqoym0YFa4WR9Xie1/IhVumwOGH6TB45DaqYO7vLwantDBcYNRn/cZH6DFHksO7RmwTFBhw==} + '@aws-sdk/client-s3@3.1009.0': + resolution: {integrity: sha512-luy8CxallkoiGWTqU86ca/BbvkWJjs0oala7uIIRN1JtQxMb5i4Yl/PBZVcQFhbK9kQi0PK0GfD8gIpLkI91fw==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-sso@3.974.0': - resolution: {integrity: sha512-ci+GiM0c4ULo4D79UMcY06LcOLcfvUfiyt8PzNY0vbt5O8BfCPYf4QomwVgkNcLLCYmroO4ge2Yy1EsLUlcD6g==} + '@aws-sdk/core@3.973.20': + resolution: {integrity: sha512-i3GuX+lowD892F3IuJf8o6AbyDupMTdyTxQrCJGcn71ni5hTZ82L4nQhcdumxZ7XPJRJJVHS/CR3uYOIIs0PVA==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.972.0': - resolution: {integrity: sha512-nEeUW2M9F+xdIaD98F5MBcQ4ITtykj3yKbgFZ6J0JtL3bq+Z90szQ6Yy8H/BLPYXTs3V4n9ifnBo8cprRDiE6A==} + '@aws-sdk/crc64-nvme@3.972.5': + resolution: {integrity: sha512-2VbTstbjKdT+yKi8m7b3a9CiVac+pL/IY2PHJwsaGkkHmuuqkJZIErPck1h6P3T9ghQMLSdMPyW6Qp7Di5swFg==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.973.1': - resolution: {integrity: sha512-Ocubx42QsMyVs9ANSmFpRm0S+hubWljpPLjOi9UFrtcnVJjrVJTzQ51sN0e5g4e8i8QZ7uY73zosLmgYL7kZTQ==} + '@aws-sdk/credential-provider-env@3.972.18': + resolution: {integrity: sha512-X0B8AlQY507i5DwjLByeU2Af4ARsl9Vr84koDcXCbAkplmU+1xBFWxEPrWRAoh56waBne/yJqEloSwvRf4x6XA==} engines: {node: '>=20.0.0'} - '@aws-sdk/crc64-nvme@3.972.0': - resolution: {integrity: sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==} + '@aws-sdk/credential-provider-http@3.972.20': + resolution: {integrity: sha512-ey9Lelj001+oOfrbKmS6R2CJAiXX7QKY4Vj9VJv6L2eE6/VjD8DocHIoYqztTm70xDLR4E1jYPTKfIui+eRNDA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.972.1': - resolution: {integrity: sha512-/etNHqnx96phy/SjI0HRC588o4vKH5F0xfkZ13yAATV7aNrb+5gYGNE6ePWafP+FuZ3HkULSSlJFj0AxgrAqYw==} + '@aws-sdk/credential-provider-ini@3.972.20': + resolution: {integrity: sha512-5flXSnKHMloObNF+9N0cupKegnH1Z37cdVlpETVgx8/rAhCe+VNlkcZH3HDg2SDn9bI765S+rhNPXGDJJPfbtA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.972.2': - resolution: {integrity: sha512-mXgdaUfe5oM+tWKyeZ7Vh/iQ94FrkMky1uuzwTOmFADiRcSk5uHy/e3boEFedXiT/PRGzgBmqvJVK4F6lUISCg==} + '@aws-sdk/credential-provider-login@3.972.20': + resolution: {integrity: sha512-gEWo54nfqp2jABMu6HNsjVC4hDLpg9HC8IKSJnp0kqWtxIJYHTmiLSsIfI4ScQjxEwpB+jOOH8dOLax1+hy/Hw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.1': - resolution: {integrity: sha512-OdbJA3v+XlNDsrYzNPRUwr8l7gw1r/nR8l4r96MDzSBDU8WEo8T6C06SvwaXR8SpzsjO3sq5KMP86wXWg7Rj4g==} + '@aws-sdk/credential-provider-node@3.972.21': + resolution: {integrity: sha512-hah8if3/B/Q+LBYN5FukyQ1Mym6PLPDsBOBsIgNEYD6wLyZg0UmUF/OKIVC3nX9XH8TfTPuITK+7N/jenVACWA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.1': - resolution: {integrity: sha512-CccqDGL6ZrF3/EFWZefvKW7QwwRdxlHUO8NVBKNVcNq6womrPDvqB6xc9icACtE0XB0a7PLoSTkAg8bQVkTO2w==} + '@aws-sdk/credential-provider-process@3.972.18': + resolution: {integrity: sha512-Tpl7SRaPoOLT32jbTWchPsn52hYYgJ0kpiFgnwk8pxTANQdUymVSZkzFvv1+oOgZm1CrbQUP9MBeoMZ9IzLZjA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.1': - resolution: {integrity: sha512-DwXPk9GfuU/xG9tmCyXFVkCr6X3W8ZCoL5Ptb0pbltEx1/LCcg7T+PBqDlPiiinNCD6ilIoMJDWsnJ8ikzZA7Q==} + '@aws-sdk/credential-provider-sso@3.972.20': + resolution: {integrity: sha512-p+R+PYR5Z7Gjqf/6pvbCnzEHcqPCpLzR7Yf127HjJ6EAb4hUcD+qsNRnuww1sB/RmSeCLxyay8FMyqREw4p1RA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.1': - resolution: {integrity: sha512-bi47Zigu3692SJwdBvo8y1dEwE6B61stCwCFnuRWJVTfiM84B+VTSCV661CSWJmIZzmcy7J5J3kWyxL02iHj0w==} + '@aws-sdk/credential-provider-web-identity@3.972.20': + resolution: {integrity: sha512-rWCmh8o7QY4CsUj63qopzMzkDq/yPpkrpb+CnjBEFSOg/02T/we7sSTVg4QsDiVS9uwZ8VyONhq98qt+pIh3KA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.1': - resolution: {integrity: sha512-dLZVNhM7wSgVUFsgVYgI5hb5Z/9PUkT46pk/SHrSmUqfx6YDvoV4YcPtaiRqviPpEGGiRtdQMEadyOKIRqulUQ==} + '@aws-sdk/middleware-bucket-endpoint@3.972.8': + resolution: {integrity: sha512-WR525Rr2QJSETa9a050isktyWi/4yIGcmY3BQ1kpHqb0LqUglQHCS8R27dTJxxWNZvQ0RVGtEZjTCbZJpyF3Aw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.1': - resolution: {integrity: sha512-YMDeYgi0u687Ay0dAq/pFPKuijrlKTgsaB/UATbxCs/FzZfMiG4If5ksywHmmW7MiYUF8VVv+uou3TczvLrN4w==} + '@aws-sdk/middleware-expect-continue@3.972.8': + resolution: {integrity: sha512-5DTBTiotEES1e2jOHAq//zyzCjeMB78lEHd35u15qnrid4Nxm7diqIf9fQQ3Ov0ChH1V3Vvt13thOnrACmfGVQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.972.1': - resolution: {integrity: sha512-YVvoitBdE8WOpHqIXvv49efT73F4bJ99XH2bi3Dn3mx7WngI4RwHwn/zF5i0q1Wdi5frGSCNF3vuh+pY817//w==} + '@aws-sdk/middleware-flexible-checksums@3.973.6': + resolution: {integrity: sha512-0nYEgkJH7Yt9k+nZJyllTghnkKaz17TWFcr5Mi0XMVMzYlF4ytDZADQpF2/iJo36cKL5AYSzRsvlykE4M/ErTA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-expect-continue@3.972.1': - resolution: {integrity: sha512-6lfl2/J/kutzw/RLu1kjbahsz4vrGPysrdxWaw8fkjLYG+6M6AswocIAZFS/LgAVi/IWRwPTx9YC0/NH2wDrSw==} + '@aws-sdk/middleware-host-header@3.972.8': + resolution: {integrity: sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.972.1': - resolution: {integrity: sha512-kjVVREpqeUkYQsXr78AcsJbEUlxGH7+H6yS7zkjrnu6HyEVxbdSndkKX6VpKneFOihjCAhIXlk4wf3butDHkNQ==} + '@aws-sdk/middleware-location-constraint@3.972.8': + resolution: {integrity: sha512-KaUoFuoFPziIa98DSQsTPeke1gvGXlc5ZGMhy+b+nLxZ4A7jmJgLzjEF95l8aOQN2T/qlPP3MrAyELm8ExXucw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-host-header@3.972.1': - resolution: {integrity: sha512-/R82lXLPmZ9JaUGSUdKtBp2k/5xQxvBT3zZWyKiBOhyulFotlfvdlrO8TnqstBimsl4lYEYySDL+W6ldFh6ALg==} + '@aws-sdk/middleware-logger@3.972.8': + resolution: {integrity: sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-location-constraint@3.972.1': - resolution: {integrity: sha512-YisPaCbvBk9gY5aUI8jDMDKXsLZ9Fet0WYj1MviK8tZYMgxBIYHM6l3O/OHaAIujojZvamd9F3haYYYWp5/V3w==} + '@aws-sdk/middleware-recursion-detection@3.972.8': + resolution: {integrity: sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-logger@3.972.1': - resolution: {integrity: sha512-JGgFl6cHg9G2FHu4lyFIzmFN8KESBiRr84gLC3Aeni0Gt1nKm+KxWLBuha/RPcXxJygGXCcMM4AykkIwxor8RA==} + '@aws-sdk/middleware-sdk-s3@3.972.20': + resolution: {integrity: sha512-yhva/xL5H4tWQgsBjwV+RRD0ByCzg0TcByDCLp3GXdn/wlyRNfy8zsswDtCvr1WSKQkSQYlyEzPuWkJG0f5HvQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-recursion-detection@3.972.1': - resolution: {integrity: sha512-taGzNRe8vPHjnliqXIHp9kBgIemLE/xCaRTMH1NH0cncHeaPcjxtnCroAAM9aOlPuKvBe2CpZESyvM1+D8oI7Q==} + '@aws-sdk/middleware-ssec@3.972.8': + resolution: {integrity: sha512-wqlK0yO/TxEC2UsY9wIlqeeutF6jjLe0f96Pbm40XscTo57nImUk9lBcw0dPgsm0sppFtAkSlDrfpK+pC30Wqw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.972.0': - resolution: {integrity: sha512-0bcKFXWx+NZ7tIlOo7KjQ+O2rydiHdIQahrq+fN6k9Osky29v17guy68urUKfhTobR6iY6KvxkroFWaFtTgS5w==} + '@aws-sdk/middleware-user-agent@3.972.21': + resolution: {integrity: sha512-62XRl1GDYPpkt7cx1AX1SPy9wgNE9Iw/NPuurJu4lmhCWS7sGKO+kS53TQ8eRmIxy3skmvNInnk0ZbWrU5Dpyg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.972.2': - resolution: {integrity: sha512-5f9x9/G+StE8+7wd9EVDF3d+J74xK+WBA3FhZwLSkf3pHFGLKzlmUfxJJE1kkXkbj/j/H+Dh3zL/hrtQE9hNsg==} + '@aws-sdk/nested-clients@3.996.10': + resolution: {integrity: sha512-SlDol5Z+C7Ivnc2rKGqiqfSUmUZzY1qHfVs9myt/nxVwswgfpjdKahyTzLTx802Zfq0NFRs7AejwKzzzl5Co2w==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-ssec@3.972.1': - resolution: {integrity: sha512-fLtRTPd/MxJT2drJKft2GVGKm35PiNEeQ1Dvz1vc/WhhgAteYrp4f1SfSgjgLaYWGMExESJL4bt8Dxqp6tVsog==} + '@aws-sdk/region-config-resolver@3.972.8': + resolution: {integrity: sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.972.2': - resolution: {integrity: sha512-d+Exq074wy0X6wvShg/kmZVtkah+28vMuqCtuY3cydg8LUZOJBtbAolCpEJizSyb8mJJZF9BjWaTANXL4OYnkg==} + '@aws-sdk/signature-v4-multi-region@3.996.8': + resolution: {integrity: sha512-n1qYFD+tbqZuyskVaxUE+t10AUz9g3qzDw3Tp6QZDKmqsjfDmZBd4GIk2EKJJNtcCBtE5YiUjDYA+3djFAFBBg==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.974.0': - resolution: {integrity: sha512-k3dwdo/vOiHMJc9gMnkPl1BA5aQfTrZbz+8fiDkWrPagqAioZgmo5oiaOaeX0grObfJQKDtcpPFR4iWf8cgl8Q==} + '@aws-sdk/token-providers@3.1009.0': + resolution: {integrity: sha512-KCPLuTqN9u0Rr38Arln78fRG9KXpzsPWmof+PZzfAHMMQq2QED6YjQrkrfiH7PDefLWEposY1o4/eGwrmKA4JA==} engines: {node: '>=20.0.0'} - '@aws-sdk/region-config-resolver@3.972.1': - resolution: {integrity: sha512-voIY8RORpxLAEgEkYaTFnkaIuRwVBEc+RjVZYcSSllPV+ZEKAacai6kNhJeE3D70Le+JCfvRb52tng/AVHY+jQ==} + '@aws-sdk/types@3.973.6': + resolution: {integrity: sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==} engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.972.0': - resolution: {integrity: sha512-2udiRijmjpN81Pvajje4TsjbXDZNP6K9bYUanBYH8hXa/tZG5qfGCySD+TyX0sgDxCQmEDMg3LaQdfjNHBDEgQ==} + '@aws-sdk/util-arn-parser@3.972.3': + resolution: {integrity: sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.974.0': - resolution: {integrity: sha512-cBykL0LiccKIgNhGWvQRTPvsBLPZxnmJU3pYxG538jpFX8lQtrCy1L7mmIHNEdxIdIGEPgAEHF8/JQxgBToqUQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/types@3.972.0': - resolution: {integrity: sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/types@3.973.0': - resolution: {integrity: sha512-jYIdB7a7jhRTvyb378nsjyvJh1Si+zVduJ6urMNGpz8RjkmHZ+9vM2H07XaIB2Cfq0GhJRZYOfUCH8uqQhqBkQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-arn-parser@3.972.0': - resolution: {integrity: sha512-RM5Mmo/KJ593iMSrALlHEOcc9YOIyOsDmS5x2NLOMdEmzv1o00fcpAkCQ02IGu1eFneBFT7uX0Mpag0HI+Cz2g==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-arn-parser@3.972.1': - resolution: {integrity: sha512-XnNit6H9PPHhqUXW/usjX6JeJ6Pm8ZNqivTjmNjgWHeOfVpblUc/MTic02UmCNR0jJLPjQ3mBKiMen0tnkNQjQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-endpoints@3.972.0': - resolution: {integrity: sha512-6JHsl1V/a1ZW8D8AFfd4R52fwZPnZ5H4U6DS8m/bWT8qad72NvbOFAC7U2cDtFs2TShqUO3TEiX/EJibtY3ijg==} + '@aws-sdk/util-endpoints@3.996.5': + resolution: {integrity: sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==} engines: {node: '>=20.0.0'} '@aws-sdk/util-locate-window@3.965.3': resolution: {integrity: sha512-FNUqAjlKAGA7GM05kywE99q8wiPHPZqrzhq3wXRga6PRD6A0kzT85Pb0AzYBVTBRpSrKyyr6M92Y6bnSBVp2BA==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-user-agent-browser@3.972.1': - resolution: {integrity: sha512-IgF55NFmJX8d9Wql9M0nEpk2eYbuD8G4781FN4/fFgwTXBn86DvlZJuRWDCMcMqZymnBVX7HW9r+3r9ylqfW0w==} + '@aws-sdk/util-user-agent-browser@3.972.8': + resolution: {integrity: sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==} - '@aws-sdk/util-user-agent-node@3.972.1': - resolution: {integrity: sha512-oIs4JFcADzoZ0c915R83XvK2HltWupxNsXUIuZse2rgk7b97zTpkxaqXiH0h9ylh31qtgo/t8hp4tIqcsMrEbQ==} + '@aws-sdk/util-user-agent-node@3.973.7': + resolution: {integrity: sha512-Hz6EZMUAEzqUd7e+vZ9LE7mn+5gMbxltXy18v+YSFY+9LBJz15wkNZvw5JqfX3z0FS9n3bgUtz3L5rAsfh4YlA==} engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -292,12 +261,8 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.972.0': - resolution: {integrity: sha512-POaGMcXnozzqBUyJM3HLUZ9GR6OKJWPGJEmhtTnxZXt8B6JcJ/6K3xRJ5H/j8oovVLz8Wg6vFxAHv8lvuASxMg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/xml-builder@3.972.1': - resolution: {integrity: sha512-6zZGlPOqn7Xb+25MAXGb1JhgvaC5HjZj6GzszuVrnEgbhvzBRFGKYemuHBV4bho+dtqeYKPgaZUv7/e80hIGNg==} + '@aws-sdk/xml-builder@3.972.11': + resolution: {integrity: sha512-iitV/gZKQMvY9d7ovmyFnFuTHbBAtrmLnvaSb/3X8vOKyevwtpmEtyc8AdhVWZe0pI/1GsHxlEvQeOePFzy7KQ==} engines: {node: '>=20.0.0'} '@aws/lambda-invoke-store@0.2.3': @@ -322,26 +287,23 @@ packages: '@cfworker/json-schema@4.1.1': resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} - '@cloudflare/workers-types@4.20260123.0': - resolution: {integrity: sha512-pQccZ8IDLFKkvdKBXZRPkbMtWtS7vVz1giJGkAAZ5cZH2RHK5Bs6p1OoVZA8Z2Sry8Q0tZbZ5Yjud4R7SrG3KQ==} - '@cloudflare/workers-types@4.20260127.0': resolution: {integrity: sha512-4M1HLcWViSdT/pAeDGEB5x5P3sqW7UIi34QrBRnxXbqjAY9if8vBU/lWRWnM+UqKzxWGB2LYjEVOzZrp0jZL+w==} '@configvault.io/interfaces@1.0.17': resolution: {integrity: sha512-bEcCUR2VBDJsTin8HQh8Uw/mlYl2v8A3jMIaQ+MTB9Hrqd6CZL2dL7iJdWyFl/3EIX+LDxWFR+Oq7liIq7w+1Q==} - '@design.estate/dees-catalog@3.41.2': - resolution: {integrity: sha512-G6b7TbqkEupHwty3q+Y42xbmwkfFBf3S5JBrMLAw1S0kR88ZCio0dOBcvmvQTQ5pQBz6TDRkx1prXpoQbZDt7A==} + '@design.estate/dees-catalog@3.48.5': + resolution: {integrity: sha512-4BTKpofEL77k4GfJhrb7Zv9Y0vCJ/40Fn262p2bKAGwkQ+SnFEtqOKlNIgjogNggIfTMSBt3THtWPfonveVcuw==} '@design.estate/dees-comms@1.0.30': resolution: {integrity: sha512-KchMlklJfKAjQiJiR0xmofXtQ27VgZtBIxcMwPE9d+h3jJRv+lPZxzBQVOM0eyM0uS44S5vJMZ11IeV4uDXSHg==} - '@design.estate/dees-domtools@2.3.8': - resolution: {integrity: sha512-jUG9GMvPxKMwmRIZ9oLTL3c8hHvHuiwIk8cTrYnuZzGO/uJJ5/czk9o6LRXUuCOOG7TRLtqgOpK8EEQgaadfZA==} + '@design.estate/dees-domtools@2.5.1': + resolution: {integrity: sha512-ojzRSkOpQvxpd4drCNF1wadvPwthI6xIJpYjBbOwlgxkFCrlgxlOxHzRKEVnj5wWeUPqykKhddKp33LKW9mydw==} - '@design.estate/dees-element@2.1.6': - resolution: {integrity: sha512-7zyHkUjB8UEQgT9VbB2IJtc/yuPt9CI5JGel3b6BxA1kecY64ceIjFvof1uIkc0QP8q2fMLLY45r1c+9zDTjzg==} + '@design.estate/dees-element@2.2.3': + resolution: {integrity: sha512-MpAvJPrJDTDad8hUtdOzMgMFRE7n84O7INhvSlkTTLB3b84j8EKjwfUCMErGAo7Bq5zfw4LG7NnKhLYXXXjkXA==} '@design.estate/dees-wcctools@3.8.0': resolution: {integrity: sha512-CC14iVKUrguzD9jIrdPBd9fZ4egVJEZMxl5y8iy0l7WLumeoYvGsoXj5INVkRPLRVLqziIdi4Je1hXqHt2NU+g==} @@ -511,54 +473,207 @@ packages: cpu: [x64] os: [win32] - '@fortawesome/fontawesome-common-types@7.1.0': - resolution: {integrity: sha512-l/BQM7fYntsCI//du+6sEnHOP6a74UixFyOYUyz2DLMXKx+6DEhfR3F2NYGE45XH1JJuIamacb4IZs9S0ZOWLA==} + '@fortawesome/fontawesome-common-types@7.2.0': + resolution: {integrity: sha512-IpR0bER9FY25p+e7BmFH25MZKEwFHTfRAfhOyJubgiDnoJNsSvJ7nigLraHtp4VOG/cy8D7uiV0dLkHOne5Fhw==} engines: {node: '>=6'} - '@fortawesome/fontawesome-svg-core@7.1.0': - resolution: {integrity: sha512-fNxRUk1KhjSbnbuBxlWSnBLKLBNun52ZBTcs22H/xEEzM6Ap81ZFTQ4bZBxVQGQgVY0xugKGoRcCbaKjLQ3XZA==} + '@fortawesome/fontawesome-svg-core@7.2.0': + resolution: {integrity: sha512-6639htZMjEkwskf3J+e6/iar+4cTNM9qhoWuRfj9F3eJD6r7iCzV1SWnQr2Mdv0QT0suuqU8BoJCZUyCtP9R4Q==} engines: {node: '>=6'} - '@fortawesome/free-brands-svg-icons@7.1.0': - resolution: {integrity: sha512-9byUd9bgNfthsZAjBl6GxOu1VPHgBuRUP9juI7ZoM98h8xNPTCTagfwUFyYscdZq4Hr7gD1azMfM9s5tIWKZZA==} + '@fortawesome/free-brands-svg-icons@7.2.0': + resolution: {integrity: sha512-VNG8xqOip1JuJcC3zsVsKRQ60oXG9+oYNDCosjoU/H9pgYmLTEwWw8pE0jhPz/JWdHeUuK6+NQ3qsM4gIbdbYQ==} engines: {node: '>=6'} - '@fortawesome/free-regular-svg-icons@7.1.0': - resolution: {integrity: sha512-0e2fdEyB4AR+e6kU4yxwA/MonnYcw/CsMEP9lH82ORFi9svA6/RhDyhxIv5mlJaldmaHLLYVTb+3iEr+PDSZuQ==} + '@fortawesome/free-regular-svg-icons@7.2.0': + resolution: {integrity: sha512-iycmlN51EULlQ4D/UU9WZnHiN0CvjJ2TuuCrAh+1MVdzD+4ViKYH2deNAll4XAAYlZa8WAefHR5taSK8hYmSMw==} engines: {node: '>=6'} - '@fortawesome/free-solid-svg-icons@7.1.0': - resolution: {integrity: sha512-Udu3K7SzAo9N013qt7qmm22/wo2hADdheXtBfxFTecp+ogsc0caQNRKEb7pkvvagUGOpG9wJC1ViH6WXs8oXIA==} + '@fortawesome/free-solid-svg-icons@7.2.0': + resolution: {integrity: sha512-YTVITFGN0/24PxzXrwqCgnyd7njDuzp5ZvaCx5nq/jg55kUYd94Nj8UTchBdBofi/L0nwRfjGOg0E41d2u9T1w==} engines: {node: '>=6'} - '@git.zone/tsbuild@4.1.2': - resolution: {integrity: sha512-S518ulKveO76pS6jrAELrnFaCw5nDAIZD9j6QzVmLYDiZuJmlRwPK3/2E8ugQ+b7ffpkwJ9MT685ooEGDcWQ4Q==} + '@git.zone/tsbuild@4.3.0': + resolution: {integrity: sha512-lb6eMQ8RQPaJqAB4kC++GIElOiTAH1pClmoND/q7XHuiMZxv6cXz2/U/sZt339mon2c40dXRG2tkLF2jRsP0pQ==} hasBin: true - '@git.zone/tsbundle@2.8.3': - resolution: {integrity: sha512-9q+KbVGKUTDNND+jDiJuk4bPH/mtiA2B0EWtV+/NyvgZfIbpe/ItHemyIvXB4RAqncMdBhzXquCFCvGjAhwVIQ==} + '@git.zone/tsbundle@2.9.1': + resolution: {integrity: sha512-JW1xjSv7UjAm2lwAQPxhCWs14wqs+UIq5FqIGUPuI6rrDBWIMT2d0gpP6iP6TqXqgm6XpBlfU4rHcHheUXzXbQ==} hasBin: true - '@git.zone/tspublish@1.11.0': - resolution: {integrity: sha512-dkgaDBTzZJ53lAV72r7OW/W7l/KqpkncFuPojr11JO35OKAbjjDhZbAwPv4oGX9NplyXrhC5VJRPNX/orqNTHA==} + '@git.zone/tspublish@1.11.2': + resolution: {integrity: sha512-BcGap1OzXDgXpfQXMh9W17r/CkWNhPsJ3WzjG2wrGE+ePUJCJAm9w6+J8G5WdZZcZKPqTB07cp707LbSiksc5A==} hasBin: true '@git.zone/tsrun@2.0.1': resolution: {integrity: sha512-NEcnsjvlC1o3Z6SS3VhKCf6Ev+Sh4EAinmggslrIR/ppMrvjDbXNFXoyr3PB+GLeSAR0JRZ1fGvVYjpEzjBdIg==} hasBin: true - '@git.zone/tstest@3.1.8': - resolution: {integrity: sha512-nmiLGeOkKMkLDyIk5BUBLx5ExskFbKHKlPdrWCARPVFkU4cAAiuIyJWVfLwISoS0TO/zSInLqArPwIc76yvaNw==} + '@git.zone/tstest@3.3.2': + resolution: {integrity: sha512-1R3VMEg+VMeMlSTIzIYTAsRIHuZMlpWmG1j4Q1cPSSw3jOp79OD7sJxfHkqy4bO/nTTcKMGXs5DD1nhT7Xno8w==} hasBin: true - '@git.zone/tswatch@3.0.1': - resolution: {integrity: sha512-vrAkKM5ff/e1BLNkrIRXnTIkMyjl/uW49c1cYaw2nYGloM6/wT1FSwYjwh6BcDkHIYMnzS30SOy9jSYRptW/iw==} + '@git.zone/tswatch@3.3.0': + resolution: {integrity: sha512-2d5G4L6RpEGW7d16xz6Gg6P/JnrMncNRDy74WaFrNjdn2fe5yIPtqoiQ/9LTbxqk67snj0gN2xtlQTXiN+Xa/w==} hasBin: true '@happy-dom/global-registrator@15.11.7': resolution: {integrity: sha512-mfOoUlIw8VBiJYPrl5RZfMzkXC/z7gbSpi2ecycrj/gRWLq2CMV+Q+0G+JPjeOmuNFgg0skEIzkVFzVYFP6URw==} engines: {node: '>=18.0.0'} + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@inquirer/checkbox@3.0.1': resolution: {integrity: sha512-0hm2nrToWUdD6/UHnel/UKGdk1//ke5zGUpHIvk5ZWmaKezlGxZkOJXNSWsdxO/rEqTkbB3lNC2J6nBElV2aAQ==} engines: {node: '>=18'} @@ -627,6 +742,118 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@jimp/core@1.6.0': + resolution: {integrity: sha512-EQQlKU3s9QfdJqiSrZWNTxBs3rKXgO2W+GxNXDtwchF3a4IqxDheFX1ti+Env9hdJXDiYLp2jTRjlxhPthsk8w==} + engines: {node: '>=18'} + + '@jimp/diff@1.6.0': + resolution: {integrity: sha512-+yUAQ5gvRC5D1WHYxjBHZI7JBRusGGSLf8AmPRPCenTzh4PA+wZ1xv2+cYqQwTfQHU5tXYOhA0xDytfHUf1Zyw==} + engines: {node: '>=18'} + + '@jimp/file-ops@1.6.0': + resolution: {integrity: sha512-Dx/bVDmgnRe1AlniRpCKrGRm5YvGmUwbDzt+MAkgmLGf+jvBT75hmMEZ003n9HQI/aPnm/YKnXjg/hOpzNCpHQ==} + engines: {node: '>=18'} + + '@jimp/js-bmp@1.6.0': + resolution: {integrity: sha512-FU6Q5PC/e3yzLyBDXupR3SnL3htU7S3KEs4e6rjDP6gNEOXRFsWs6YD3hXuXd50jd8ummy+q2WSwuGkr8wi+Gw==} + engines: {node: '>=18'} + + '@jimp/js-gif@1.6.0': + resolution: {integrity: sha512-N9CZPHOrJTsAUoWkWZstLPpwT5AwJ0wge+47+ix3++SdSL/H2QzyMqxbcDYNFe4MoI5MIhATfb0/dl/wmX221g==} + engines: {node: '>=18'} + + '@jimp/js-jpeg@1.6.0': + resolution: {integrity: sha512-6vgFDqeusblf5Pok6B2DUiMXplH8RhIKAryj1yn+007SIAQ0khM1Uptxmpku/0MfbClx2r7pnJv9gWpAEJdMVA==} + engines: {node: '>=18'} + + '@jimp/js-png@1.6.0': + resolution: {integrity: sha512-AbQHScy3hDDgMRNfG0tPjL88AV6qKAILGReIa3ATpW5QFjBKpisvUaOqhzJ7Reic1oawx3Riyv152gaPfqsBVg==} + engines: {node: '>=18'} + + '@jimp/js-tiff@1.6.0': + resolution: {integrity: sha512-zhReR8/7KO+adijj3h0ZQUOiun3mXUv79zYEAKvE0O+rP7EhgtKvWJOZfRzdZSNv0Pu1rKtgM72qgtwe2tFvyw==} + engines: {node: '>=18'} + + '@jimp/plugin-blit@1.6.0': + resolution: {integrity: sha512-M+uRWl1csi7qilnSK8uxK4RJMSuVeBiO1AY0+7APnfUbQNZm6hCe0CCFv1Iyw1D/Dhb8ph8fQgm5mwM0eSxgVA==} + engines: {node: '>=18'} + + '@jimp/plugin-blur@1.6.0': + resolution: {integrity: sha512-zrM7iic1OTwUCb0g/rN5y+UnmdEsT3IfuCXCJJNs8SZzP0MkZ1eTvuwK9ZidCuMo4+J3xkzCidRwYXB5CyGZTw==} + engines: {node: '>=18'} + + '@jimp/plugin-circle@1.6.0': + resolution: {integrity: sha512-xt1Gp+LtdMKAXfDp3HNaG30SPZW6AQ7dtAtTnoRKorRi+5yCJjKqXRgkewS5bvj8DEh87Ko1ydJfzqS3P2tdWw==} + engines: {node: '>=18'} + + '@jimp/plugin-color@1.6.0': + resolution: {integrity: sha512-J5q8IVCpkBsxIXM+45XOXTrsyfblyMZg3a9eAo0P7VPH4+CrvyNQwaYatbAIamSIN1YzxmO3DkIZXzRjFSz1SA==} + engines: {node: '>=18'} + + '@jimp/plugin-contain@1.6.0': + resolution: {integrity: sha512-oN/n+Vdq/Qg9bB4yOBOxtY9IPAtEfES8J1n9Ddx+XhGBYT1/QTU/JYkGaAkIGoPnyYvmLEDqMz2SGihqlpqfzQ==} + engines: {node: '>=18'} + + '@jimp/plugin-cover@1.6.0': + resolution: {integrity: sha512-Iow0h6yqSC269YUJ8HC3Q/MpCi2V55sMlbkkTTx4zPvd8mWZlC0ykrNDeAy9IJegrQ7v5E99rJwmQu25lygKLA==} + engines: {node: '>=18'} + + '@jimp/plugin-crop@1.6.0': + resolution: {integrity: sha512-KqZkEhvs+21USdySCUDI+GFa393eDIzbi1smBqkUPTE+pRwSWMAf01D5OC3ZWB+xZsNla93BDS9iCkLHA8wang==} + engines: {node: '>=18'} + + '@jimp/plugin-displace@1.6.0': + resolution: {integrity: sha512-4Y10X9qwr5F+Bo5ME356XSACEF55485j5nGdiyJ9hYzjQP9nGgxNJaZ4SAOqpd+k5sFaIeD7SQ0Occ26uIng5Q==} + engines: {node: '>=18'} + + '@jimp/plugin-dither@1.6.0': + resolution: {integrity: sha512-600d1RxY0pKwgyU0tgMahLNKsqEcxGdbgXadCiVCoGd6V6glyCvkNrnnwC0n5aJ56Htkj88PToSdF88tNVZEEQ==} + engines: {node: '>=18'} + + '@jimp/plugin-fisheye@1.6.0': + resolution: {integrity: sha512-E5QHKWSCBFtpgZarlmN3Q6+rTQxjirFqo44ohoTjzYVrDI6B6beXNnPIThJgPr0Y9GwfzgyarKvQuQuqCnnfbA==} + engines: {node: '>=18'} + + '@jimp/plugin-flip@1.6.0': + resolution: {integrity: sha512-/+rJVDuBIVOgwoyVkBjUFHtP+wmW0r+r5OQ2GpatQofToPVbJw1DdYWXlwviSx7hvixTWLKVgRWQ5Dw862emDg==} + engines: {node: '>=18'} + + '@jimp/plugin-hash@1.6.0': + resolution: {integrity: sha512-wWzl0kTpDJgYVbZdajTf+4NBSKvmI3bRI8q6EH9CVeIHps9VWVsUvEyb7rpbcwVLWYuzDtP2R0lTT6WeBNQH9Q==} + engines: {node: '>=18'} + + '@jimp/plugin-mask@1.6.0': + resolution: {integrity: sha512-Cwy7ExSJMZszvkad8NV8o/Z92X2kFUFM8mcDAhNVxU0Q6tA0op2UKRJY51eoK8r6eds/qak3FQkXakvNabdLnA==} + engines: {node: '>=18'} + + '@jimp/plugin-print@1.6.0': + resolution: {integrity: sha512-zarTIJi8fjoGMSI/M3Xh5yY9T65p03XJmPsuNet19K/Q7mwRU6EV2pfj+28++2PV2NJ+htDF5uecAlnGyxFN2A==} + engines: {node: '>=18'} + + '@jimp/plugin-quantize@1.6.0': + resolution: {integrity: sha512-EmzZ/s9StYQwbpG6rUGBCisc3f64JIhSH+ncTJd+iFGtGo0YvSeMdAd+zqgiHpfZoOL54dNavZNjF4otK+mvlg==} + engines: {node: '>=18'} + + '@jimp/plugin-resize@1.6.0': + resolution: {integrity: sha512-uSUD1mqXN9i1SGSz5ov3keRZ7S9L32/mAQG08wUwZiEi5FpbV0K8A8l1zkazAIZi9IJzLlTauRNU41Mi8IF9fA==} + engines: {node: '>=18'} + + '@jimp/plugin-rotate@1.6.0': + resolution: {integrity: sha512-JagdjBLnUZGSG4xjCLkIpQOZZ3Mjbg8aGCCi4G69qR+OjNpOeGI7N2EQlfK/WE8BEHOW5vdjSyglNqcYbQBWRw==} + engines: {node: '>=18'} + + '@jimp/plugin-threshold@1.6.0': + resolution: {integrity: sha512-M59m5dzLoHOVWdM41O8z9SyySzcDn43xHseOH0HavjsfQsT56GGCC4QzU1banJidbUrePhzoEdS42uFE8Fei8w==} + engines: {node: '>=18'} + + '@jimp/types@1.6.0': + resolution: {integrity: sha512-7UfRsiKo5GZTAATxm2qQ7jqmUXP0DxTArztllTcYdyw6Xi5oT4RaoXynVtCD4UyLK5gJgkZJcwonoijrhYFKfg==} + engines: {node: '>=18'} + + '@jimp/utils@1.6.0': + resolution: {integrity: sha512-gqFTGEosKbOkYF/WFj26jMHOI5OH2jeP1MmC/zbK6BF6VJBf8rIC5898dPfSzZEbSA0wbbV5slbntWVc5PKLFA==} + engines: {node: '>=18'} + '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} @@ -689,30 +916,35 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@napi-rs/canvas-linux-arm64-musl@0.1.89': resolution: {integrity: sha512-UQQkIEzV12/l60j1ziMjZ+mtodICNUbrd205uAhbyTw0t60CrC/EsKb5/aJWGq1wM0agvcgZV72JJCKfLS6+4w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@napi-rs/canvas-linux-riscv64-gnu@0.1.89': resolution: {integrity: sha512-1/VmEoFaIO6ONeeEMGoWF17wOYZOl5hxDC1ios2Bkz/oQjbJJ8DY/X22vWTmvuUKWWhBVlo63pxLGZbjJU/heA==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] + libc: [glibc] '@napi-rs/canvas-linux-x64-gnu@0.1.89': resolution: {integrity: sha512-ebLuqkCuaPIkKgKH9q4+pqWi1tkPOfiTk5PM1LKR1tB9iO9sFNVSIgwEp+SJreTSbA2DK5rW8lQXiN78SjtcvA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@napi-rs/canvas-linux-x64-musl@0.1.89': resolution: {integrity: sha512-w+5qxHzplvA4BkHhCaizNMLLXiI+CfP84YhpHm/PqMub4u8J0uOAv+aaGv40rYEYra5hHRWr9LUd6cfW32o9/A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@napi-rs/canvas-win32-arm64-msvc@0.1.89': resolution: {integrity: sha512-DmyXa5lJHcjOsDC78BM3bnEECqbK3xASVMrKfvtT/7S7Z8NGQOugvu+L7b41V6cexCd34mBWgMOsjoEBceeB1Q==} @@ -814,6 +1046,9 @@ packages: '@push.rocks/lik@6.2.2': resolution: {integrity: sha512-j64FFPPyMXeeUorjKJVF6PWaJUfiIrF3pc41iJH4lOh0UUpBAHpcNzHVxTR58orwbVA/h3Hz+DQd4b1Rq0dFDQ==} + '@push.rocks/lik@6.3.1': + resolution: {integrity: sha512-UWDwGBaVx5yPtAFXqDDBtQZCzETUOA/7myQIXb+YBsuiIw4yQuhNZ23uY2ChQH2Zn6DLqdNSgQcYC0WywMZBNQ==} + '@push.rocks/mongodump@1.1.0': resolution: {integrity: sha512-kW0ZUGyf1e4nwloVwBQjNId+MzgTcNS834C+RxH21i1NqyOubbpWZtJtPP+K+s35nSJRyCTy3ICfBMdDBTAm2w==} @@ -826,14 +1061,14 @@ packages: '@push.rocks/smartarchive@4.2.4': resolution: {integrity: sha512-uiqVAXPxmr8G5rv3uZvZFMOCt8l7cZC3nzvsy4YQqKf/VkPhKIEX+b7LkAeNlxPSYUiBQUkNRoawg9+5BaMcHg==} - '@push.rocks/smartbrowser@2.0.8': - resolution: {integrity: sha512-0KWRZj3TuKo/sNwgPbiSE6WL+TMeR19t1JmXBZWh9n8iA2mpc4HhMrQAndEUdRCkx5ofSaHWojIRVFzGChj0Dg==} + '@push.rocks/smartbrowser@2.0.11': + resolution: {integrity: sha512-Rj3+VodlFbW7CkvXqYxH4dEhtbYy987gVY7wsM76B+ipvnkSfjfEGuKUeMfKe4DscUBSmhlbJVYEYaH8RafUoQ==} '@push.rocks/smartbucket@3.3.10': resolution: {integrity: sha512-0H2MioALspC8Aj0Q1FPCs2w4k2u9oJg7Q5yM8+1TZo7aRfrdxgM5HQ7z3apUaqC3ZEDewW6vSlttjHFHhMEC3A==} - '@push.rocks/smartbucket@4.4.1': - resolution: {integrity: sha512-68GFLgJKW+LXvuN+yuV8O/FozGMecraoT+PkI5whdRPFe7N3u2iYIHWAUjvQvVU4ygpdJv0kih2JDf5k3PYycw==} + '@push.rocks/smartbucket@4.5.1': + resolution: {integrity: sha512-mce9x7YH68ZgNLJU0ZWflt03AlS+jMe9BNZNhwM0N5T87q1uhNFvjFzkvyhBj8XO6g4CTQvQGxPuJXZqD5aUsg==} '@push.rocks/smartbuffer@3.0.5': resolution: {integrity: sha512-pWYF08Mn8s/KF/9nHRk7pZPzuMjmYVQay2c5gGexdayxn1W4eCSYYhWH73vR2JBfGeGq/izbRNuUuEaIEeTIKA==} @@ -841,10 +1076,6 @@ packages: '@push.rocks/smartcache@1.0.18': resolution: {integrity: sha512-3+cmLu9chbnmi4yD4kjlFP/Tn4NReaZIoicEcGTtwbcokTrSDMs3YPdJzIpDZkAs83PW7OcVSHa3Ak5KU5OWzA==} - '@push.rocks/smartchok@1.2.0': - resolution: {integrity: sha512-I5fR++k6nR1wiMQUwcTYzO0g8FwD6gN+3HwfIzpQlolrM91i6Q5TaoMlt3aysbvKCSNvkL3FlJLOfUHNGWoWkA==} - deprecated: This package has been renamed. Please use @push.rocks/smartwatch instead. - '@push.rocks/smartcli@4.0.20': resolution: {integrity: sha512-gCo4ItvsPj8WoVAJw/6vkuoGA5FtIoACux2ktcCeH0nrFe7/xGR6waJ1aZcYAi7QN4gi52TlsgwuKz7BzXqhmQ==} @@ -857,8 +1088,8 @@ packages: '@push.rocks/smartdata@5.16.7': resolution: {integrity: sha512-bu/YSIjQcwxWXkAsuhqE6zs7eT+bTIKV8+/H7TbbjpzeioLCyB3dZ/41cLZk37c/EYt4d4GHgZ0ww80OiKOUMg==} - '@push.rocks/smartdata@7.0.15': - resolution: {integrity: sha512-j09BUekmjiGZuvXmdGBiIpBTXFFnxrzG4rOBjZvPO/hG1BwNrvSkIVq20mIwdYomn8JGgya6oJ4Y7NL+FKTqEA==} + '@push.rocks/smartdata@7.1.0': + resolution: {integrity: sha512-ots0g7/96R2xs4ww4F2/2rIwAOPT5AmzP3ciD31YsF02o5WA4Gg6C5laLBUjV3hXCjazhzFsRVQTfwbjmPQe4w==} '@push.rocks/smartdelay@3.0.5': resolution: {integrity: sha512-mUuI7kj2f7ztjpic96FvRIlf2RsKBa5arw81AHNsndbxO6asRcxuWL8dTVxouEIK8YsBUlj0AsrCkHhMbLQdHw==} @@ -878,6 +1109,9 @@ packages: '@push.rocks/smartexit@1.1.0': resolution: {integrity: sha512-GD8VLIbxQuwvhPXwK4eH162XAYSj+M3wGKWGNO3i1iY4bj8P3BARcgsWx6/ntN3aCo5ygWtrevrfD5iecYY2Ng==} + '@push.rocks/smartexit@2.0.3': + resolution: {integrity: sha512-ZWpZ3Elorpv/rKtUcCUejUHG4BIE5B3QWysBAgb7lTcA7y0vGdFY32Y5/Q5tHpZM6PPxl/WTdUOYtSojQTq+pA==} + '@push.rocks/smartexpect@2.5.0': resolution: {integrity: sha512-yoyuCoQ3tTiAriuvF+/09fNbVfFnacudL2SwHSzPhX/ugaE7VTSWXQ9A34eKOWvil0MPyDcOY36fVZDxvrPd8A==} @@ -896,6 +1130,9 @@ packages: '@push.rocks/smartfs@1.3.1': resolution: {integrity: sha512-ZSduVS8tM+/erbyCTvRRvc9gLWwbpqN5xdIIkMr+gub7fowSeJb7tR2rnGwySa63DyimU0q2KTp79VV9YqGLeg==} + '@push.rocks/smartfs@1.5.0': + resolution: {integrity: sha512-QwMD44HgX3d9PPxUwR0uS+0PEMtesKvKbZR+s4pezL2er6oPneKJMLkO6TJPvJ38nug6Lmlk9Bu7UrwR2kS3Vw==} + '@push.rocks/smartguard@3.1.0': resolution: {integrity: sha512-J23q84f1O+TwFGmd4lrO9XLHUh2DaLXo9PN/9VmTWYzTkQDv5JehmifXVI0esophXcCIfbdIu6hbt7/aHlDF4A==} @@ -908,9 +1145,15 @@ packages: '@push.rocks/smartinteract@2.0.16': resolution: {integrity: sha512-eltvVRRUKBKd77DSFA4DPY2g4V4teZLNe8A93CDy/WglglYcUjxMoLY/b0DFTWCWKYT+yjk6Fe6p0FRrvX9Yvg==} + '@push.rocks/smartjimp@1.2.0': + resolution: {integrity: sha512-SPz8p2ZuphNqIXK/UDsNFrnpJn/jr6FbuBSMQc0V2v2ffQIF32ZqktKQpXpitiqD1K5JEYS56JAhlYHgrAu7yw==} + '@push.rocks/smartjson@5.2.0': resolution: {integrity: sha512-710e8UwovRfPgUtaBHcd6unaODUjV5fjxtGcGCqtaTcmvOV6VpasdVfT66xMDzQmWH2E9ZfHDJeso9HdDQzNQA==} + '@push.rocks/smartjson@6.0.0': + resolution: {integrity: sha512-FYfJnmukt66WePn6xrVZ3BLmRQl9W82LcsICK3VU9sGW7kasig090jKXPm+yX8ibQcZAO/KyR/Q8tMIYZNxGew==} + '@push.rocks/smartlog-destination-devtools@1.0.12': resolution: {integrity: sha512-zvsIkrqByc0JRaBgIyhh+PSz2SY/e/bmhZdUcr/OW6pudgAcqe2sso68EzrKux0w9OMl1P9ZnzF3FpCZPFWD/A==} @@ -920,8 +1163,8 @@ packages: '@push.rocks/smartlog-interfaces@3.0.2': resolution: {integrity: sha512-8hGRTJehbsFSJxLhCQkA018mZtXVPxPTblbg9VaE/EqISRzUw+eosJ2EJV7M4Qu0eiTJZjnWnNLn8CkD77ziWw==} - '@push.rocks/smartlog@3.1.10': - resolution: {integrity: sha512-5pf5JyzOE2WTCUislNIW4EHePo1a7hiXB+jbil38+N5hW71AEwcPFe6oGxbp5w9ALlz66hV2+E+25R0SsxN+fQ==} + '@push.rocks/smartlog@3.2.1': + resolution: {integrity: sha512-x9/P59pfzY6HOGYmYrhqmoRl/pliTVx44g2Vbb8dIr/0zA39cAJHlPze1+UGncn37XKGmutK2iLSsJLEsexD0A==} '@push.rocks/smartmanifest@2.0.2': resolution: {integrity: sha512-QGc5C9vunjfUbYsPGz5bynV/mVmPHkrQDkWp8ZO8VJtK1GZe+njgbrNyxn2SUHR0IhSAbSXl1j4JvBqYf5eTVg==} @@ -938,6 +1181,9 @@ packages: '@push.rocks/smartmongo@2.0.14': resolution: {integrity: sha512-fvfPeCDDy5JaDBpVnsMKednsOoRzuYC0OszO8OoLOX/RaR755zIbRppCCK8Cez0hqd6eNkJGQeWdX/vXlJOPBA==} + '@push.rocks/smartmongo@5.1.0': + resolution: {integrity: sha512-2tpKf8K+SMdLHOEpafgKPIN+ypWTLwHc33hCUDNMQ1KaL7vokkavA44+fHxQydOGPMtDi22tSMFeVMCcUSzs4w==} + '@push.rocks/smartnetwork@4.4.0': resolution: {integrity: sha512-OvFtz41cvQ7lcXwaIOhghNUUlNoMxvwKDctbDvMyuZyEH08SpLjhyv2FuKbKL/mgwA/WxakTbohoC8SW7t+kiw==} @@ -959,8 +1205,8 @@ packages: '@push.rocks/smartpath@6.0.0': resolution: {integrity: sha512-r94u1MbBaIOSy+517PZp2P7SuZPSe9LkwJ8l3dXQKHeIOri/zDxk/RQPiFM+j4N9301ztkRyhvRj7xgUDroOsg==} - '@push.rocks/smartpdf@3.3.0': - resolution: {integrity: sha512-k4mBZAIl/TVBHDYQXaBZAgC8DdmHXsIZ3hRrLY3ysLr143YJ1VkwqQ2poqWh3A2SZQDrVfpKRYliUtjFRFrYVw==} + '@push.rocks/smartpdf@4.2.0': + resolution: {integrity: sha512-+egzby5QKJGO10MDvWp+N69cJ8i5M354l9ntc+uLRpxuq/FEY9kigpRwMvRYF5qwOBTuGTLqvmvILzlLtboAQg==} '@push.rocks/smartping@1.0.8': resolution: {integrity: sha512-Fvx1Db6hSsDOI6pdiCuS9GjtOX8ugx865YQrPg5vK2iw6Qj/srwyXcWLFYt+19WVKtvtWDJIAKbW+q3bXFsCeA==} @@ -983,11 +1229,15 @@ packages: '@push.rocks/smartrouter@1.3.3': resolution: {integrity: sha512-1+xZEnWlhzqLWAaJ1zFNhQ0zgbfCWQl1DBT72LygLxTs+P0K8AwJKgqo/IX6CT55kGCFnPAZIYSbVJlGsgrB0w==} + '@push.rocks/smartrust@1.3.1': + resolution: {integrity: sha512-3ApbgF6yGeE2TRQxBY9Y48H1JlpcRheIp7QDBLSSfk80Uoe6fjdgBAfNz3Ir8hW3RZ3b7hA3sm1ZshCok58SEA==} + '@push.rocks/smartrx@3.0.10': resolution: {integrity: sha512-USjIYcsSfzn14cwOsxgq/bBmWDTTzy3ouWAnW5NdMyRRzEbmeNrvmy6TRqNeDlJ2PsYNTt1rr/zGUqvIy72ITg==} - '@push.rocks/smarts3@3.0.3': - resolution: {integrity: sha512-Y9nXMwurthJ9Z7yi0RwjhPFUC58aY8Mhia8kFo6Xj1tBM4LE8Oxg/ydejF7otHqQGr3QyqV5C4YrDEG17rUuzg==} + '@push.rocks/smarts3@5.3.0': + resolution: {integrity: sha512-6bo55ovCDEylbTxwPFZYDrZrz2babQEUmxHIexmVcP2j+6LYRHDbGYnWoyKdtqniqDFZ04pFkOoZ85hUzU5xCw==} + deprecated: This package has been renamed to @push.rocks/smartstorage. Please install @push.rocks/smartstorage instead. '@push.rocks/smartserve@2.0.1': resolution: {integrity: sha512-YQb2qexfCzCqOlLWBBXKMg6xG4zahCPAxomz/KEKAwHtW6wMTtuHKSTSkRTQ0vl9jssLMAmRz2OyafiL9XGJXQ==} @@ -995,27 +1245,33 @@ packages: '@push.rocks/smartshell@3.3.0': resolution: {integrity: sha512-m0w618H6YBs+vXGz1CgS4nPi5CUAnqRtckcS9/koGwfcIx1IpjqmiP47BoCTbdgcv0IPUxQVBG1IXTHPuZ8Z5g==} + '@push.rocks/smartshell@3.3.7': + resolution: {integrity: sha512-b3st2+FjHUVhZZRlXfw93+SQA0UMVlURqe55uVpWdjJX7jeGXTTeszuYygtiR99zC5iZ8WZhGDct3N2L1qc/qw==} + '@push.rocks/smartsitemap@2.0.4': resolution: {integrity: sha512-76dYWG/o/EjV4vYCK7ZKM35T9xgrI+oHEiiIE6E2MDaFIU6QnSfciTfbscH5nc0vxx8Ah+I0HPEJO94BM2S39w==} - '@push.rocks/smartsocket@2.1.0': - resolution: {integrity: sha512-etOGyfiDFQz/1WJnD3jFL2N7ykujTjiudAz6qZTz82xE5oabKuKX+Cn8SdM9dOwzyWmBUKbUdll8QhovAXjn+g==} - '@push.rocks/smartspawn@3.0.3': resolution: {integrity: sha512-DyrGPV69wwOiJgKkyruk5hS3UEGZ99xFAqBE9O2nM8VXCRLbbty3xt1Ug5Z092ZZmJYaaGMSnMw3ijyZJFCT0Q==} - '@push.rocks/smartstate@2.0.27': - resolution: {integrity: sha512-q4UKir7GV3hakJWXQR4DoA4tUVwT5GRkJ/MtanHYF0wZLHfS19+nGmyO9y974zk3eT9hmy3+Lq5cKtU2W6+Y3w==} + '@push.rocks/smartstate@2.2.1': + resolution: {integrity: sha512-fLrilAJNI6QOs0hcBRD9eTwU2Rlo6NlDCKQo9N/zyp0VJ6AV1UVdEZcVIQILu1CO0RUHX9aBAbFunJrb2+Zrkg==} '@push.rocks/smartstream@3.2.5': resolution: {integrity: sha512-PLGGIFDy8JLNVUnnntMSIYN4W081YSbNC7Y/sWpvUT8PAXtbEXXUiDFgK5o3gcI0ptpKQxHAwxhzNlPj0sbFVg==} + '@push.rocks/smartstream@3.4.0': + resolution: {integrity: sha512-kePb44W9n5K96zj2Ms3K4xnYbNXP5AfxDd86zZMDQ1/T10nvkIpL9m5w4lG/VJ4KAsWFs81S87BkkcjhhrY5Kw==} + '@push.rocks/smartstring@4.1.0': resolution: {integrity: sha512-Q4py/Nm3KTDhQ9EiC75yBtSTLR0KLMwhKM+8gGcutgKotZT6wJ3gncjmtD8LKFfNhb4lSaFMgPJgLrCHTOH6Iw==} '@push.rocks/smarttime@4.1.1': resolution: {integrity: sha512-Ha/3J/G+zfTl4ahpZgF6oUOZnUjpLhrBja0OQ2cloFxF9sKT8I1COaSqIfBGDtoK2Nly4UD4aTJ3JcJNOg/kgA==} + '@push.rocks/smarttime@4.2.3': + resolution: {integrity: sha512-8gMg8RUkrCG4p9NcEUZV7V6KpL24+jAMK02g7qyhfA6giz/JJWD0+8w8xjSR+G7qe16KVQ2y3RbvAL9TxmO36g==} + '@push.rocks/smartunique@3.0.9': resolution: {integrity: sha512-q6DYQgT7/dqdWi9HusvtWCjdsFzLFXY9LTtaZV6IYNJt6teZOonoygxTdNt9XLn6niBSbLYrHSKvJNTRH/uK+g==} @@ -1047,6 +1303,9 @@ packages: '@push.rocks/webrequest@4.0.1': resolution: {integrity: sha512-I60XZZLVf8W5I7YdmUVVu4G92teE3rg3/aKaV00BRg8vJ3VXx3wc59Qj4em7zxQ5o0HvL8m1Aezw3RFMDPyVgA==} + '@push.rocks/webrequest@4.0.5': + resolution: {integrity: sha512-wVSCaXqJ9Vh+rbwVz0wDl46dYz4rnwwSrm5vbVXKbuH6oKTPF0YRoujeJPqRltIn64RVGdLeY9/6ix+ZCrzhsg==} + '@push.rocks/websetup@3.0.19': resolution: {integrity: sha512-iKJDwXdMmQdu5siOIgziPRxM51lN1AU9HOr+yMteu1YMDkZT7HKCyisDAr4gC9WZ9a7FzsG8zgthm4dMeA8NTw==} @@ -1126,24 +1385,28 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.0.0-beta.52': resolution: {integrity: sha512-ENLmSQCWqSA/+YN45V2FqTIemg7QspaiTjlm327eUAMeOLdqmSOVVyrQexJGNTQ5M8sDYCgVAig2Kk01Ggmqaw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@rolldown/binding-linux-x64-gnu@1.0.0-beta.52': resolution: {integrity: sha512-klahlb2EIFltSUubn/VLjuc3qxp1E7th8ukayPfdkcKvvYcQ5rJztgx8JsJSuAKVzKtNTqUGOhy4On71BuyV8g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-x64-musl@1.0.0-beta.52': resolution: {integrity: sha512-UuA+JqQIgqtkgGN2c/AQ5wi8M6mJHrahz/wciENPTeI6zEIbbLGoth5XN+sQe2pJDejEVofN9aOAp0kaazwnVg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@rolldown/binding-openharmony-arm64@1.0.0-beta.52': resolution: {integrity: sha512-1BNQW8u4ro8bsN1+tgKENJiqmvc+WfuaUhXzMImOVSMw28pkBKdfZtX2qJPADV3terx+vNJtlsgSGeb3+W6Jiw==} @@ -1191,21 +1454,25 @@ packages: resolution: {integrity: sha512-SodEX3+1/GLz0LobX9cY1QdjJ1NftSEh4C2vGpr71iA3MS9HyXuw4giqSeRQ4DpCybqpdS/3RLjVqFQEfGpcnw==} cpu: [arm64] os: [linux] + libc: [glibc] '@rspack/binding-linux-arm64-musl@1.7.3': resolution: {integrity: sha512-ydD2fNdEy+G7EYJ/a3FfdFZPfrLj/UnZocCNlZTTSHEhu+jURdQk0hwV11CvL+sjnKU5e/8IVMGUzhu3Gu8Ghg==} cpu: [arm64] os: [linux] + libc: [musl] '@rspack/binding-linux-x64-gnu@1.7.3': resolution: {integrity: sha512-adnDbUqafSAI6/N6vZ+iONSo1W3yUpnNtJqP3rVp7+YdABhUpbOhtaY37qpIJ3uFajXctYFyISPrb4MWl1M9Yg==} cpu: [x64] os: [linux] + libc: [glibc] '@rspack/binding-linux-x64-musl@1.7.3': resolution: {integrity: sha512-5jnjdODk5HCUFPN6rTaFukynDU4Fn9eCL+4TSp6mqo6YAnfnJEuzDjfetA8t3aQFcAs7WriQfNwvdcA4HvYtbA==} cpu: [x64] os: [linux] + libc: [musl] '@rspack/binding-wasm32-wasi@1.7.3': resolution: {integrity: sha512-WLQK0ksUzMkVeGoHAMIxenmeEU5tMvFDK36Aip7VRj7T6vZTcAwvbMwc38QrIAvlG7dqWoxgPQi35ba1igNNDw==} @@ -1248,250 +1515,222 @@ packages: resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} - '@smithy/abort-controller@4.2.8': - resolution: {integrity: sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==} + '@smithy/abort-controller@4.2.12': + resolution: {integrity: sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q==} engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader-native@4.2.1': - resolution: {integrity: sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==} + '@smithy/chunked-blob-reader-native@4.2.3': + resolution: {integrity: sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw==} engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader@5.2.0': - resolution: {integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==} + '@smithy/chunked-blob-reader@5.2.2': + resolution: {integrity: sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.4.6': - resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} + '@smithy/config-resolver@4.4.11': + resolution: {integrity: sha512-YxFiiG4YDAtX7WMN7RuhHZLeTmRRAOyCbr+zB8e3AQzHPnUhS8zXjB1+cniPVQI3xbWsQPM0X2aaIkO/ME0ymw==} engines: {node: '>=18.0.0'} - '@smithy/core@3.21.1': - resolution: {integrity: sha512-NUH8R4O6FkN8HKMojzbGg/5pNjsfTjlMmeFclyPfPaXXUrbr5TzhWgbf7t92wfrpCHRgpjyz7ffASIS3wX28aA==} + '@smithy/core@3.23.11': + resolution: {integrity: sha512-952rGf7hBRnhUIaeLp6q4MptKW8sPFe5VvkoZ5qIzFAtx6c/QZ/54FS3yootsyUSf9gJX/NBqEBNdNR7jMIlpQ==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.2.8': - resolution: {integrity: sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==} + '@smithy/credential-provider-imds@4.2.12': + resolution: {integrity: sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.2.8': - resolution: {integrity: sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==} + '@smithy/eventstream-codec@4.2.12': + resolution: {integrity: sha512-FE3bZdEl62ojmy8x4FHqxq2+BuOHlcxiH5vaZ6aqHJr3AIZzwF5jfx8dEiU/X0a8RboyNDjmXjlbr8AdEyLgiA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.2.8': - resolution: {integrity: sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==} + '@smithy/eventstream-serde-browser@4.2.12': + resolution: {integrity: sha512-XUSuMxlTxV5pp4VpqZf6Sa3vT/Q75FVkLSpSSE3KkWBvAQWeuWt1msTv8fJfgA4/jcJhrbrbMzN1AC/hvPmm5A==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@4.3.8': - resolution: {integrity: sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==} + '@smithy/eventstream-serde-config-resolver@4.3.12': + resolution: {integrity: sha512-7epsAZ3QvfHkngz6RXQYseyZYHlmWXSTPOfPmXkiS+zA6TBNo1awUaMFL9vxyXlGdoELmCZyZe1nQE+imbmV+Q==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@4.2.8': - resolution: {integrity: sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==} + '@smithy/eventstream-serde-node@4.2.12': + resolution: {integrity: sha512-D1pFuExo31854eAvg89KMn9Oab/wEeJR6Buy32B49A9Ogdtx5fwZPqBHUlDzaCDpycTFk2+fSQgX689Qsk7UGA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@4.2.8': - resolution: {integrity: sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==} + '@smithy/eventstream-serde-universal@4.2.12': + resolution: {integrity: sha512-+yNuTiyBACxOJUTvbsNsSOfH9G9oKbaJE1lNL3YHpGcuucl6rPZMi3nrpehpVOVR2E07YqFFmtwpImtpzlouHQ==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.3.9': - resolution: {integrity: sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==} + '@smithy/fetch-http-handler@5.3.15': + resolution: {integrity: sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==} engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@4.2.9': - resolution: {integrity: sha512-m80d/iicI7DlBDxyQP6Th7BW/ejDGiF0bgI754+tiwK0lgMkcaIBgvwwVc7OFbY4eUzpGtnig52MhPAEJ7iNYg==} + '@smithy/hash-blob-browser@4.2.13': + resolution: {integrity: sha512-YrF4zWKh+ghLuquldj6e/RzE3xZYL8wIPfkt0MqCRphVICjyyjH8OwKD7LLlKpVEbk4FLizFfC1+gwK6XQdR3g==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.2.8': - resolution: {integrity: sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==} + '@smithy/hash-node@4.2.12': + resolution: {integrity: sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==} engines: {node: '>=18.0.0'} - '@smithy/hash-stream-node@4.2.8': - resolution: {integrity: sha512-v0FLTXgHrTeheYZFGhR+ehX5qUm4IQsjAiL9qehad2cyjMWcN2QG6/4mSwbSgEQzI7jwfoXj7z4fxZUx/Mhj2w==} + '@smithy/hash-stream-node@4.2.12': + resolution: {integrity: sha512-O3YbmGExeafuM/kP7Y8r6+1y0hIh3/zn6GROx0uNlB54K9oihAL75Qtc+jFfLNliTi6pxOAYZrRKD9A7iA6UFw==} engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@4.2.8': - resolution: {integrity: sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==} + '@smithy/invalid-dependency@4.2.12': + resolution: {integrity: sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/is-array-buffer@4.2.0': - resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} + '@smithy/is-array-buffer@4.2.2': + resolution: {integrity: sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==} engines: {node: '>=18.0.0'} - '@smithy/md5-js@4.2.8': - resolution: {integrity: sha512-oGMaLj4tVZzLi3itBa9TCswgMBr7k9b+qKYowQ6x1rTyTuO1IU2YHdHUa+891OsOH+wCsH7aTPRsTJO3RMQmjQ==} + '@smithy/md5-js@4.2.12': + resolution: {integrity: sha512-W/oIpHCpWU2+iAkfZYyGWE+qkpuf3vEXHLxQQDx9FPNZTTdnul0dZ2d/gUFrtQ5je1G2kp4cjG0/24YueG2LbQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@4.2.8': - resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==} + '@smithy/middleware-content-length@4.2.12': + resolution: {integrity: sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.4.11': - resolution: {integrity: sha512-/WqsrycweGGfb9sSzME4CrsuayjJF6BueBmkKlcbeU5q18OhxRrvvKlmfw3tpDsK5ilx2XUJvoukwxHB0nHs/Q==} + '@smithy/middleware-endpoint@4.4.25': + resolution: {integrity: sha512-dqjLwZs2eBxIUG6Qtw8/YZ4DvzHGIf0DA18wrgtfP6a50UIO7e2nY0FPdcbv5tVJKqWCCU5BmGMOUwT7Puan+A==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.27': - resolution: {integrity: sha512-xFUYCGRVsfgiN5EjsJJSzih9+yjStgMTCLANPlf0LVQkPDYCe0hz97qbdTZosFOiYlGBlHYityGRxrQ/hxhfVQ==} + '@smithy/middleware-retry@4.4.42': + resolution: {integrity: sha512-vbwyqHRIpIZutNXZpLAozakzamcINaRCpEy1MYmK6xBeW3xN+TyPRA123GjXnuxZIjc9848MRRCugVMTXxC4Eg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.2.9': - resolution: {integrity: sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==} + '@smithy/middleware-serde@4.2.14': + resolution: {integrity: sha512-+CcaLoLa5apzSRtloOyG7lQvkUw2ZDml3hRh4QiG9WyEPfW5Ke/3tPOPiPjUneuT59Tpn8+c3RVaUvvkkwqZwg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.2.8': - resolution: {integrity: sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==} + '@smithy/middleware-stack@4.2.12': + resolution: {integrity: sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.3.8': - resolution: {integrity: sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==} + '@smithy/node-config-provider@4.3.12': + resolution: {integrity: sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.4.8': - resolution: {integrity: sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==} + '@smithy/node-http-handler@4.4.16': + resolution: {integrity: sha512-ULC8UCS/HivdCB3jhi+kLFYe4B5gxH2gi9vHBfEIiRrT2jfKiZNiETJSlzRtE6B26XbBHjPtc8iZKSNqMol9bw==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.2.8': - resolution: {integrity: sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==} + '@smithy/property-provider@4.2.12': + resolution: {integrity: sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.3.8': - resolution: {integrity: sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==} + '@smithy/protocol-http@5.3.12': + resolution: {integrity: sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.2.8': - resolution: {integrity: sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==} + '@smithy/querystring-builder@4.2.12': + resolution: {integrity: sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.2.8': - resolution: {integrity: sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==} + '@smithy/querystring-parser@4.2.12': + resolution: {integrity: sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.2.8': - resolution: {integrity: sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==} + '@smithy/service-error-classification@4.2.12': + resolution: {integrity: sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.4.3': - resolution: {integrity: sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==} + '@smithy/shared-ini-file-loader@4.4.7': + resolution: {integrity: sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.3.8': - resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==} + '@smithy/signature-v4@5.3.12': + resolution: {integrity: sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.10.12': - resolution: {integrity: sha512-VKO/HKoQ5OrSHW6AJUmEnUKeXI1/5LfCwO9cwyao7CmLvGnZeM1i36Lyful3LK1XU7HwTVieTqO1y2C/6t3qtA==} + '@smithy/smithy-client@4.12.5': + resolution: {integrity: sha512-UqwYawyqSr/aog8mnLnfbPurS0gi4G7IYDcD28cUIBhsvWs1+rQcL2IwkUQ+QZ7dibaoRzhNF99fAQ9AUcO00w==} engines: {node: '>=18.0.0'} - '@smithy/types@4.12.0': - resolution: {integrity: sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==} + '@smithy/types@4.13.1': + resolution: {integrity: sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.2.8': - resolution: {integrity: sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==} + '@smithy/url-parser@4.2.12': + resolution: {integrity: sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==} engines: {node: '>=18.0.0'} - '@smithy/util-base64@4.3.0': - resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} + '@smithy/util-base64@4.3.2': + resolution: {integrity: sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@4.2.0': - resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} + '@smithy/util-body-length-browser@4.2.2': + resolution: {integrity: sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-node@4.2.1': - resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} + '@smithy/util-body-length-node@4.2.3': + resolution: {integrity: sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==} engines: {node: '>=18.0.0'} '@smithy/util-buffer-from@2.2.0': resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} - '@smithy/util-buffer-from@4.2.0': - resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} + '@smithy/util-buffer-from@4.2.2': + resolution: {integrity: sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==} engines: {node: '>=18.0.0'} - '@smithy/util-config-provider@4.2.0': - resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} + '@smithy/util-config-provider@4.2.2': + resolution: {integrity: sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.3.26': - resolution: {integrity: sha512-vva0dzYUTgn7DdE0uaha10uEdAgmdLnNFowKFjpMm6p2R0XDk5FHPX3CBJLzWQkQXuEprsb0hGz9YwbicNWhjw==} + '@smithy/util-defaults-mode-browser@4.3.41': + resolution: {integrity: sha512-M1w1Ux0rSVvBOxIIiqbxvZvhnjQ+VUjJrugtORE90BbadSTH+jsQL279KRL3Hv0w69rE7EuYkV/4Lepz/NBW9g==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.2.29': - resolution: {integrity: sha512-c6D7IUBsZt/aNnTBHMTf+OVh+h/JcxUUgfTcIJaWRe6zhOum1X+pNKSZtZ+7fbOn5I99XVFtmrnXKv8yHHErTQ==} + '@smithy/util-defaults-mode-node@4.2.44': + resolution: {integrity: sha512-YPze3/lD1KmWuZsl9JlfhcgGLX7AXhSoaCDtiPntUjNW5/YY0lOHjkcgxyE9x/h5vvS1fzDifMGjzqnNlNiqOQ==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.2.8': - resolution: {integrity: sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==} + '@smithy/util-endpoints@3.3.3': + resolution: {integrity: sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==} engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@4.2.0': - resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} + '@smithy/util-hex-encoding@4.2.2': + resolution: {integrity: sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.2.8': - resolution: {integrity: sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==} + '@smithy/util-middleware@4.2.12': + resolution: {integrity: sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.2.8': - resolution: {integrity: sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==} + '@smithy/util-retry@4.2.12': + resolution: {integrity: sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.5.10': - resolution: {integrity: sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==} + '@smithy/util-stream@4.5.19': + resolution: {integrity: sha512-v4sa+3xTweL1CLO2UP0p7tvIMH/Rq1X4KKOxd568mpe6LSLMQCnDHs4uv7m3ukpl3HvcN2JH6jiCS0SNRXKP/w==} engines: {node: '>=18.0.0'} - '@smithy/util-uri-escape@4.2.0': - resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} + '@smithy/util-uri-escape@4.2.2': + resolution: {integrity: sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==} engines: {node: '>=18.0.0'} '@smithy/util-utf8@2.3.0': resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} - '@smithy/util-utf8@4.2.0': - resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + '@smithy/util-utf8@4.2.2': + resolution: {integrity: sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==} engines: {node: '>=18.0.0'} - '@smithy/util-waiter@4.2.8': - resolution: {integrity: sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg==} + '@smithy/util-waiter@4.2.13': + resolution: {integrity: sha512-2zdZ9DTHngRtcYxJK1GUDxruNr53kv5W2Lupe0LMU+Imr6ohQg8M2T14MNkj1Y0wS3FFwpgpGQyvuaMF7CiTmQ==} engines: {node: '>=18.0.0'} - '@smithy/uuid@1.1.0': - resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} + '@smithy/uuid@1.1.2': + resolution: {integrity: sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==} engines: {node: '>=18.0.0'} - '@socket.io/component-emitter@3.1.2': - resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - - '@svgdotjs/svg.draggable.js@3.0.6': - resolution: {integrity: sha512-7iJFm9lL3C40HQcqzEfezK2l+dW2CpoVY3b77KQGqc8GXWa6LhhmX5Ckv7alQfUXBuZbjpICZ+Dvq1czlGx7gA==} - peerDependencies: - '@svgdotjs/svg.js': ^3.2.4 - - '@svgdotjs/svg.filter.js@3.0.9': - resolution: {integrity: sha512-/69XMRCDoam2HgC4ldHIaDgeQf1ViHIsa0Ld4uWgiXtZ+E24DWHe/9Ib6kbNiZ7WRIdlVokUDR1Fg0kjIpkfbw==} - engines: {node: '>= 0.8.0'} - - '@svgdotjs/svg.js@3.2.5': - resolution: {integrity: sha512-/VNHWYhNu+BS7ktbYoVGrCmsXDh+chFMaONMwGNdIBcFHrWqk2jY8fNyr3DLdtQUIalvkPfM554ZSFa3dm3nxQ==} - - '@svgdotjs/svg.resize.js@2.0.5': - resolution: {integrity: sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA==} - engines: {node: '>= 14.18'} - peerDependencies: - '@svgdotjs/svg.js': ^3.2.4 - '@svgdotjs/svg.select.js': ^4.0.1 - - '@svgdotjs/svg.select.js@4.0.3': - resolution: {integrity: sha512-qkMgso1sd2hXKd1FZ1weO7ANq12sNmQJeGDjs46QwDVsxSRcHmvWKL2NDF7Yimpwf3sl5esOLkPqtV2bQ3v/Jg==} - engines: {node: '>= 14.18'} - peerDependencies: - '@svgdotjs/svg.js': ^3.2.4 - '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} @@ -1664,27 +1903,21 @@ packages: '@tsclass/tsclass@9.3.0': resolution: {integrity: sha512-KD3oTUN3RGu67tgjNHgWWZGsdYipr1RUDxQ9MMKSgIJ6oNZ4q5m2rg0ibrgyHWkAjTPlHVa6kHP3uVOY+8bnHw==} + '@tsclass/tsclass@9.4.0': + resolution: {integrity: sha512-VqSafIzAGxKBKQk6Q4t4vy6ldZ71I0q9T1rWnuQjvRwJEVWWL1nW7B3dfOzZq3YhOfUeOl03LGENsl0DUjUlbg==} + '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} '@types/bn.js@5.2.0': resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} - '@types/body-parser@1.19.6': - resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} - '@types/buffer-json@2.0.3': resolution: {integrity: sha512-ItD4UfF3Q5jA+PEV6ZUWEHvlWaXJbd0rpuBKOIrEebM053FHaJddKsgUf0vy7nLSTs44nqFj3Mh8J3TiT0xv4g==} '@types/clean-css@4.2.11': resolution: {integrity: sha512-Y8n81lQVTAfP2TOdtJJEsCoYl1AnOkqDqMvXb9/7pfgZZ7r8YrEyurrAvAoAjHOGXKRybay+5CsExqIH6liccw==} - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/cors@2.8.19': - resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} - '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -1694,12 +1927,6 @@ packages: '@types/elliptic@6.4.18': resolution: {integrity: sha512-UseG6H5vjRiNpQvrhy4VF/JXdA3V/Fp5amvveaL+fs28BZ6xIKJBPnUPRlEaZpysD9MbpfaLi8lbl7PGUAkpWw==} - '@types/express-serve-static-core@5.1.1': - resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==} - - '@types/express@5.0.6': - resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} - '@types/fs-extra@11.0.4': resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} @@ -1712,9 +1939,6 @@ packages: '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - '@types/http-errors@2.0.5': - resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - '@types/js-yaml@3.12.10': resolution: {integrity: sha512-/Mtaq/wf+HxXpvhzFYzrzCqNRcA958sW++7JOFC8nPrZcvfi/TrzOaaGbvt27ltJB2NQbHVAg5a1wUCsyMH7NA==} @@ -1751,36 +1975,27 @@ packages: '@types/node-forge@1.3.14': resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} + '@types/node@16.9.1': + resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==} + '@types/node@22.19.7': resolution: {integrity: sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==} - '@types/node@25.0.10': - resolution: {integrity: sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==} + '@types/node@25.5.0': + resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} '@types/ping@0.4.4': resolution: {integrity: sha512-ifvo6w2f5eJYlXm+HiVx67iJe8WZp87sfa683nlqED5Vnt9Z93onkokNoWqOG21EaE8fMxyKPobE+mkPEyxsdw==} - '@types/qs@6.14.0': - resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} - '@types/randomatic@3.1.5': resolution: {integrity: sha512-VCwCTw6qh1pRRw+5rNTAwqPmf6A+hdrkdM7dBpZVmhl7g+em3ONXlYK/bWPVKqVGMWgP0d1bog8Vc/X6zRwRRQ==} - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/relateurl@0.2.33': resolution: {integrity: sha512-bTQCKsVbIdzLqZhLkF5fcJQreE4y1ro4DIyVrlDNSCJRRwHhB8Z+4zXXa8jN6eDvc2HbRsEYgbvrnGvi54EpSw==} '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} - '@types/send@1.2.1': - resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} - - '@types/serve-static@2.2.0': - resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} - '@types/symbol-tree@3.2.5': resolution: {integrity: sha512-zXnnyENt1TYQcS21MkPaJCVjfcPq7p7yc5mo5JACuumXp6sly5jnlS0IokHd+xmmuCbx6V7JqkMBpswR+nZAcw==} @@ -1829,16 +2044,9 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@yr/monotone-cubic-spline@1.0.3': - resolution: {integrity: sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==} - - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - - accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} acme-client@5.4.0: resolution: {integrity: sha512-mORqg60S8iML6XSmVjqjGHJkINrCGLMj2QvDmFzI9vIlv1RGlyjmw3nrzaINJjkNsYXC41XhhD5pfy7CtuGcbA==} @@ -1876,8 +2084,11 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - apexcharts@5.3.6: - resolution: {integrity: sha512-sVEPw+J0Gp0IHQabKu8cfdsxlfME0e36Wid7RIaPclGM2OUt+O7O4+6mfAmTUYhy5bDk8cNHzEhPfVtLCIXEJA==} + any-base@1.1.0: + resolution: {integrity: sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==} + + apexcharts@5.10.4: + resolution: {integrity: sha512-gt0VUqZ2+mr25ScbUcKZgJr96jKYm4vjOcxEWCEh/E5F4dWqhyo3dBhPRvNNnkKiWxkMd2cBwj3ZYH3rK39fkA==} argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -1899,6 +2110,10 @@ packages: asynckit@0.4.0: resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} + await-to-js@3.0.0: + resolution: {integrity: sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==} + engines: {node: '>=6.0.0'} + axios@1.13.2: resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} @@ -1916,6 +2131,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + bare-events@2.8.2: resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} peerDependencies: @@ -1957,21 +2176,16 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - basic-ftp@5.1.0: resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} engines: {node: '>=10.0.0'} + bmp-ts@1.0.9: + resolution: {integrity: sha512-cTEHk2jLrPyi+12M3dhpEbnnPOsaZuq7C45ylbbQIiWgDFZq4UVYPEY5mlqjvsj/6gJv9qX5sa+ebDzLXT28Vw==} + bn.js@4.12.2: resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} - body-parser@2.2.2: - resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} - engines: {node: '>=18'} - bowser@2.13.1: resolution: {integrity: sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==} @@ -1981,6 +2195,10 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.4: + resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} + engines: {node: 18 || 20 || >=22} + broadcast-channel@7.3.0: resolution: {integrity: sha512-UHPhLBQKfQ8OmMFMpmPfO5dRakyA1vsfiDGWTYNvChYol65tbuhivPEGgZZiuetorvExdvxaWiBy/ym1Ty08yA==} @@ -2004,10 +2222,6 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} engines: {node: '>=14.16'} @@ -2105,26 +2319,6 @@ packages: config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - content-disposition@1.0.1: - resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} - engines: {node: '>=18'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - - cors@2.8.6: - resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} - engines: {node: '>= 0.10'} - cosmiconfig@9.0.0: resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} @@ -2137,6 +2331,10 @@ packages: crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + croner@10.0.1: + resolution: {integrity: sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==} + engines: {node: '>=18.0'} + croner@9.1.0: resolution: {integrity: sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==} engines: {node: '>=18.0'} @@ -2159,15 +2357,6 @@ packages: dayjs@1.11.19: resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -2212,14 +2401,14 @@ packages: resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} engines: {node: '>=0.4.0'} - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -2240,9 +2429,6 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ee-first@1.1.1: - resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} - elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} @@ -2252,24 +2438,9 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - engine.io-client@6.6.4: - resolution: {integrity: sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==} - - engine.io-parser@5.2.3: - resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} - engines: {node: '>=10.0.0'} - - engine.io@6.6.4: - resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} - engines: {node: '>=10.2.0'} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -2306,9 +2477,6 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-html@1.0.3: - resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2339,9 +2507,9 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - etag@1.8.1: - resolution: {integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=} - engines: {node: '>= 0.6'} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} @@ -2349,13 +2517,12 @@ packages: events-universal@1.0.1: resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} - express-force-ssl@0.3.2: - resolution: {integrity: sha1-AbK0mK5v0uQRUrIrV6Phc3c69n4=} - engines: {node: '>=0.2.2'} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} - express@5.2.1: - resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} - engines: {node: '>= 18'} + exif-parser@0.1.12: + resolution: {integrity: sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==} extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -2386,18 +2553,21 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-xml-builder@1.1.3: + resolution: {integrity: sha512-1o60KoFw2+LWKQu3IdcfcFlGTW4dpqEWmjhYec6H82AYZU2TVBXep6tMl8Z1Y+wM+ZrzCwe3BZ9Vyd9N2rIvmg==} + fast-xml-parser@4.5.3: resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} hasBin: true - fast-xml-parser@5.2.5: - resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} - hasBin: true - fast-xml-parser@5.3.3: resolution: {integrity: sha512-2O3dkPAAC6JavuMm8+4+pgTk+5hoAs+CjZ+sWcQLkX9+/tHRuTkQh/Oaifr8qDmZ8iEHb771Ea6G8CdwkrgvYA==} hasBin: true + fast-xml-parser@5.4.1: + resolution: {integrity: sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==} + hasBin: true + fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} @@ -2411,6 +2581,10 @@ packages: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} + file-type@16.5.4: + resolution: {integrity: sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==} + engines: {node: '>=10'} + file-type@19.6.0: resolution: {integrity: sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==} engines: {node: '>=18'} @@ -2419,10 +2593,6 @@ packages: resolution: {integrity: sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA==} engines: {node: '>=20'} - finalhandler@2.1.1: - resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} - engines: {node: '>= 18.0.0'} - find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} @@ -2460,14 +2630,6 @@ packages: resolution: {integrity: sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=} engines: {node: '>=0.4.x'} - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} - fs-extra@11.3.3: resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} engines: {node: '>=14.14'} @@ -2514,6 +2676,9 @@ packages: resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} engines: {node: '>= 14'} + gifwrap@0.10.1: + resolution: {integrity: sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw==} + glob@11.1.0: resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} engines: {node: 20 || >=22} @@ -2589,10 +2754,6 @@ packages: http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} - http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -2615,13 +2776,12 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} - engines: {node: '>=0.10.0'} - ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + image-q@4.0.0: + resolution: {integrity: sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -2643,10 +2803,6 @@ packages: resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - is-arrayish@0.2.1: resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} @@ -2675,9 +2831,6 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - is-stream@4.0.1: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} @@ -2701,6 +2854,10 @@ packages: resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} engines: {node: '>=16'} + isexe@4.0.0: + resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} + engines: {node: '>=20'} + isopen@1.3.0: resolution: {integrity: sha512-AN6Q9J0UlqHFl1fN/2xJCHCBLCBCFDjZhpGBO1gh3wzgRPsFSFBUL36I2Lbfd9qkuoj58axmE7j83iejTQsk8Q==} @@ -2708,6 +2865,13 @@ packages: resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} engines: {node: 20 || >=22} + jimp@1.6.0: + resolution: {integrity: sha512-YcwCHw1kiqEeI5xRpDlPPBGL2EOpBKLwO4yIBJcXWHPj5PnA5urGq0jbyhM5KoNpypQ6VboSoxc9D8HyfvngSg==} + engines: {node: '>=18'} + + jpeg-js@0.4.4: + resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} + js-base64@3.7.8: resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} @@ -2760,42 +2924,9 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} - lodash._baseassign@3.2.0: - resolution: {integrity: sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=} - - lodash._basecopy@3.0.1: - resolution: {integrity: sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=} - - lodash._bindcallback@3.0.1: - resolution: {integrity: sha1-5THCdkTPi1epnhftlbNcdIeJOS4=} - - lodash._createassigner@3.1.1: - resolution: {integrity: sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=} - - lodash._getnative@3.9.1: - resolution: {integrity: sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=} - - lodash._isiterateecall@3.0.9: - resolution: {integrity: sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=} - - lodash.assign@3.2.0: - resolution: {integrity: sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=} - lodash.clonedeep@4.5.0: resolution: {integrity: sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=} - lodash.isarguments@3.1.0: - resolution: {integrity: sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=} - - lodash.isarray@3.0.4: - resolution: {integrity: sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=} - - lodash.keys@3.1.2: - resolution: {integrity: sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=} - - lodash.restparam@3.6.1: - resolution: {integrity: sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=} - longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -2814,8 +2945,8 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - lucide@0.563.0: - resolution: {integrity: sha512-2zBzDJ5n2Plj3d0ksj6h9TWPOSiKu9gtxJxnBAye11X/8gfWied6IYJn6ADYBp1NPoJmgpyOYP3wMrVx69+2AA==} + lucide@0.577.0: + resolution: {integrity: sha512-PpC/m5eOItp/WU/GlQPFBXDOhq6HibL73KzYP37OX3LM7VmzWQF8voEj8QRWUFvy9FIKfeDQkWYoyS1D/MdWFA==} make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} @@ -2892,17 +3023,9 @@ packages: mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} - memory-pager@1.5.0: resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} - merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} - micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -2994,17 +3117,14 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime-types@3.0.2: - resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} - engines: {node: '>=18'} + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true mime@4.1.0: resolution: {integrity: sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==} @@ -3019,6 +3139,9 @@ packages: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + mingo@7.2.0: + resolution: {integrity: sha512-UeX942qZpofn5L97h295SkS7j/ADf7Qac8gdRCMBPxi0/1m70aeB2owLFvWbyuMj1dowonlivlVRQVDx+6h+7Q==} + minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -3029,6 +3152,10 @@ packages: resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} + minimatch@10.2.4: + resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -3091,8 +3218,8 @@ packages: socks: optional: true - mongodb@7.0.0: - resolution: {integrity: sha512-vG/A5cQrvGGvZm2mTnCSz1LUcbOPl83hfB6bxULKQ8oFZauyox/2xbZOoGNl+64m8VBrETkdGCDBdOsCr3F3jg==} + mongodb@7.1.0: + resolution: {integrity: sha512-kMfnKunbolQYwCIyrkxNJFB4Ypy91pYqua5NargS/f8ODNSJxT03ZU3n1JqL4mCzbSih8tvmMEMLpKTT7x5gCg==} engines: {node: '>=20.19.0'} peerDependencies: '@aws-sdk/credential-providers': ^3.806.0 @@ -3130,14 +3257,6 @@ packages: engines: {node: ^14 || ^16 || >=18} hasBin: true - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} - netmask@2.0.2: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} @@ -3161,10 +3280,6 @@ packages: resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==} engines: {node: '>=14.16'} - object-assign@4.1.1: - resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} - engines: {node: '>=0.10.0'} - object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -3180,9 +3295,8 @@ packages: observable-fns@0.6.1: resolution: {integrity: sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==} - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + omggif@1.0.10: + resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} once@1.4.0: resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} @@ -3251,6 +3365,15 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-bmfont-ascii@1.0.6: + resolution: {integrity: sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==} + + parse-bmfont-binary@1.0.6: + resolution: {integrity: sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==} + + parse-bmfont-xml@1.1.6: + resolution: {integrity: sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -3259,14 +3382,14 @@ packages: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-expression-matcher@1.1.3: + resolution: {integrity: sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==} + engines: {node: '>=14.0.0'} + path-is-absolute@1.0.1: resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} engines: {node: '>=0.10.0'} @@ -3285,8 +3408,8 @@ packages: pdf-lib@1.17.1: resolution: {integrity: sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==} - pdf2json@3.2.0: - resolution: {integrity: sha512-5RJYU5zWFXTQ5iRXAo75vlhK5ybZOyqEyg/szw2VtHc6ZOPcC7ruX4nnXk1OqqlY56Z7XT+WCFhV+/XPj4QwtQ==} + pdf2json@4.0.2: + resolution: {integrity: sha512-iiRSuRmLihoEJ4YGkoqSq3/r4MR0OmkMTYDda0Pq7DAWqJwMylTilXu46T16gfS3DUp3fhiVuz7NtRMbk3uBhw==} engines: {node: '>=20.18.0'} hasBin: true bundledDependencies: [] @@ -3295,6 +3418,10 @@ packages: resolution: {integrity: sha512-/Y3fcFrXEAsMjJXeL9J8+ZG9U01LbuWaYypvDW2ycW1jL269L3js3DVBjDJ0Up9Np1uqDXsDrRihHANhZOlwdQ==} engines: {node: '>=20'} + peek-readable@4.1.0: + resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} + engines: {node: '>=8'} + peek-readable@5.4.2: resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} engines: {node: '>=14.16'} @@ -3313,14 +3440,30 @@ packages: resolution: {integrity: sha512-56ZMC0j7SCsMMLdOoUg12VZCfj/+ZO+yfOSjaNCRrmZZr6GLbN2X/Ui56T15dI8NhiHckaw5X2pvyfAomanwqQ==} engines: {node: '>=4.0.0'} + pixelmatch@5.3.0: + resolution: {integrity: sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==} + hasBin: true + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + pngjs@6.0.0: + resolution: {integrity: sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==} + engines: {node: '>=12.13.0'} + + pngjs@7.0.0: + resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} + engines: {node: '>=14.19.0'} + pretty-ms@9.3.0: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} + process@0.11.10: + resolution: {integrity: sha1-czIwDoQBYb2j5podHZGn1LwW8YI=} + engines: {node: '>= 0.6.0'} + progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -3389,10 +3532,6 @@ packages: proto-list@1.2.4: resolution: {integrity: sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=} - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - proxy-agent@6.5.0: resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} engines: {node: '>= 14'} @@ -3442,14 +3581,6 @@ packages: resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} engines: {node: '>= 0.10.0'} - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@3.0.2: - resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} - engines: {node: '>= 0.10'} - rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -3458,6 +3589,14 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readable-web-to-node-stream@3.0.4: + resolution: {integrity: sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==} + engines: {node: '>=8'} + readdirp@5.0.0: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} @@ -3526,10 +3665,6 @@ packages: rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} - router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} - run-async@3.0.0: resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} engines: {node: '>=0.12.0'} @@ -3543,6 +3678,10 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sax@1.5.0: + resolution: {integrity: sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==} + engines: {node: '>=11.0.0'} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -3552,20 +3691,13 @@ packages: engines: {node: '>=10'} hasBin: true - send@1.2.1: - resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} - engines: {node: '>= 18'} - - serve-static@2.2.1: - resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} - engines: {node: '>= 18'} - set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -3598,25 +3730,14 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-xml-to-json@1.2.3: + resolution: {integrity: sha512-kWJDCr9EWtZ+/EYYM5MareWj2cRnZGF93YDNpH4jQiHB+hBIZnfPFSQiVMzZOdk+zXWqTZ/9fTeQNu2DqeiudA==} + engines: {node: '>=20.12.2'} + smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - socket.io-adapter@2.5.6: - resolution: {integrity: sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==} - - socket.io-client@4.8.1: - resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} - engines: {node: '>=10.0.0'} - - socket.io-parser@4.2.5: - resolution: {integrity: sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==} - engines: {node: '>=10.0.0'} - - socket.io@4.8.1: - resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} - engines: {node: '>=10.2.0'} - socks-proxy-agent@8.0.5: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} @@ -3642,10 +3763,6 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} - streamx@2.23.0: resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} @@ -3689,6 +3806,10 @@ packages: resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} engines: {node: '>=18'} + strtok3@6.3.0: + resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==} + engines: {node: '>=10'} + strtok3@9.1.1: resolution: {integrity: sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==} engines: {node: '>=16'} @@ -3705,6 +3826,10 @@ packages: os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] hasBin: true + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + tar-fs@3.1.1: resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} @@ -3723,13 +3848,16 @@ packages: tiny-worker@2.3.0: resolution: {integrity: sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==} + tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + token-types@4.2.1: + resolution: {integrity: sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==} + engines: {node: '>=10'} token-types@6.1.2: resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} @@ -3782,9 +3910,9 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - type-is@2.0.1: - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} - engines: {node: '>= 0.6'} + type-fest@5.4.4: + resolution: {integrity: sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==} + engines: {node: '>=20'} typed-query-selector@2.12.0: resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} @@ -3809,8 +3937,8 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -3837,10 +3965,6 @@ packages: unload@2.4.1: resolution: {integrity: sha512-IViSAm8Z3sRBYA+9wc0fLQmU9Nrxb16rcDmIiR6Y9LJSZzI7QY5QsDhqPpKOjAn0O9/kfK1TfNEMMAGPTIraPw==} - unpipe@1.0.0: - resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=} - engines: {node: '>= 0.8'} - upper-case@1.1.3: resolution: {integrity: sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=} @@ -3848,6 +3972,9 @@ packages: resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} engines: {node: '>= 0.4'} + utif2@4.1.0: + resolution: {integrity: sha512-+oknB9FHrJ7oW7A2WZYajOcv4FcDR4CfoGB0dPNfxbi4GO05RRnFmt5oa23+9w32EanrYcSJWspUiJkLMs+37w==} + util-deprecate@1.0.2: resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} @@ -3855,10 +3982,6 @@ packages: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true - vary@1.1.2: - resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=} - engines: {node: '>= 0.8'} - vfile-message@4.0.3: resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} @@ -3893,6 +4016,11 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true + which@6.0.1: + resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -3908,30 +4036,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} - ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.19.0: resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} engines: {node: '>=10.0.0'} @@ -3944,9 +4048,16 @@ packages: utf-8-validate: optional: true - xmlhttprequest-ssl@2.1.2: - resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} - engines: {node: '>=0.4.0'} + xml-parse-from-string@1.0.1: + resolution: {integrity: sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==} + + xml2js@0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} xterm-addon-fit@0.8.0: resolution: {integrity: sha512-yj3Np7XlvxxhYF/EJ7p3KHaMt6OdwQ+HDu573Vx1lRXsVxOcnVJs51RgjZOouIZOczTsskaS+CpXspK81/DLqw==} @@ -4000,73 +4111,25 @@ snapshots: '@api.global/typedrequest-interfaces@3.0.19': {} - '@api.global/typedrequest@3.2.5': + '@api.global/typedrequest@3.3.0': dependencies: '@api.global/typedrequest-interfaces': 3.0.19 '@push.rocks/isounique': 1.0.5 - '@push.rocks/lik': 6.2.2 + '@push.rocks/lik': 6.3.1 '@push.rocks/smartbuffer': 3.0.5 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartguard': 3.1.0 '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/webrequest': 3.0.37 + '@push.rocks/webrequest': 4.0.5 '@push.rocks/webstream': 1.0.10 - '@api.global/typedserver@3.0.80(@push.rocks/smartserve@2.0.1)': + '@api.global/typedserver@8.4.2(@tiptap/pm@2.27.2)': dependencies: - '@api.global/typedrequest': 3.2.5 + '@api.global/typedrequest': 3.3.0 '@api.global/typedrequest-interfaces': 3.0.19 - '@api.global/typedsocket': 3.1.1(@push.rocks/smartserve@2.0.1) + '@api.global/typedsocket': 4.1.2(@push.rocks/smartserve@2.0.1) '@cloudflare/workers-types': 4.20260127.0 - '@design.estate/dees-comms': 1.0.30 - '@push.rocks/lik': 6.2.2 - '@push.rocks/smartchok': 1.2.0 - '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartenv': 5.0.13 - '@push.rocks/smartfeed': 1.4.0 - '@push.rocks/smartfile': 11.2.7 - '@push.rocks/smartjson': 5.2.0 - '@push.rocks/smartlog': 3.1.10 - '@push.rocks/smartlog-destination-devtools': 1.0.12 - '@push.rocks/smartlog-interfaces': 3.0.2 - '@push.rocks/smartmanifest': 2.0.2 - '@push.rocks/smartmatch': 2.0.0 - '@push.rocks/smartmime': 2.0.4 - '@push.rocks/smartntml': 2.0.8 - '@push.rocks/smartopen': 2.0.0 - '@push.rocks/smartpath': 6.0.0 - '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrequest': 4.4.2 - '@push.rocks/smartrx': 3.0.10 - '@push.rocks/smartsitemap': 2.0.4 - '@push.rocks/smartstream': 3.2.5 - '@push.rocks/smarttime': 4.1.1 - '@push.rocks/taskbuffer': 3.5.0 - '@push.rocks/webrequest': 3.0.37 - '@push.rocks/webstore': 2.0.20 - '@tsclass/tsclass': 9.3.0 - '@types/express': 5.0.6 - body-parser: 2.2.2 - cors: 2.8.6 - express: 5.2.1 - express-force-ssl: 0.3.2 - lit: 3.3.2 - transitivePeerDependencies: - - '@nuxt/kit' - - '@push.rocks/smartserve' - - bufferutil - - react - - supports-color - - utf-8-validate - - vue - - '@api.global/typedserver@8.3.0(@tiptap/pm@2.27.2)': - dependencies: - '@api.global/typedrequest': 3.2.5 - '@api.global/typedrequest-interfaces': 3.0.19 - '@api.global/typedsocket': 4.1.0(@push.rocks/smartserve@2.0.1) - '@cloudflare/workers-types': 4.20260123.0 - '@design.estate/dees-catalog': 3.41.2(@tiptap/pm@2.27.2) + '@design.estate/dees-catalog': 3.48.5(@tiptap/pm@2.27.2) '@design.estate/dees-comms': 1.0.30 '@push.rocks/lik': 6.2.2 '@push.rocks/smartdelay': 3.0.5 @@ -4075,7 +4138,7 @@ snapshots: '@push.rocks/smartfile': 13.1.2 '@push.rocks/smartfs': 1.3.1 '@push.rocks/smartjson': 5.2.0 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartlog-destination-devtools': 1.0.12 '@push.rocks/smartlog-interfaces': 3.0.2 '@push.rocks/smartmanifest': 2.0.2 @@ -4106,29 +4169,9 @@ snapshots: - utf-8-validate - vue - '@api.global/typedsocket@3.1.1(@push.rocks/smartserve@2.0.1)': + '@api.global/typedsocket@4.1.2(@push.rocks/smartserve@2.0.1)': dependencies: - '@api.global/typedrequest': 3.2.5 - '@api.global/typedrequest-interfaces': 3.0.19 - '@push.rocks/isohash': 2.0.1 - '@push.rocks/smartjson': 5.2.0 - '@push.rocks/smartrx': 3.0.10 - '@push.rocks/smartsocket': 2.1.0 - '@push.rocks/smartstring': 4.1.0 - '@push.rocks/smarturl': 3.1.0 - optionalDependencies: - '@push.rocks/smartserve': 2.0.1 - transitivePeerDependencies: - - '@nuxt/kit' - - bufferutil - - react - - supports-color - - utf-8-validate - - vue - - '@api.global/typedsocket@4.1.0(@push.rocks/smartserve@2.0.1)': - dependencies: - '@api.global/typedrequest': 3.2.5 + '@api.global/typedrequest': 3.3.0 '@api.global/typedrequest-interfaces': 3.0.19 '@push.rocks/isohash': 2.0.1 '@push.rocks/smartdelay': 3.0.5 @@ -4142,20 +4185,20 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.0 + '@aws-sdk/types': 3.973.6 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.0 + '@aws-sdk/types': 3.973.6 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.0 + '@aws-sdk/types': 3.973.6 '@aws-sdk/util-locate-window': 3.965.3 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -4165,7 +4208,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.0 + '@aws-sdk/types': 3.973.6 '@aws-sdk/util-locate-window': 3.965.3 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -4173,7 +4216,7 @@ snapshots: '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.0 + '@aws-sdk/types': 3.973.6 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -4182,492 +4225,403 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.973.0 + '@aws-sdk/types': 3.973.6 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.975.0': + '@aws-sdk/client-s3@3.1009.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.1 - '@aws-sdk/credential-provider-node': 3.972.1 - '@aws-sdk/middleware-bucket-endpoint': 3.972.1 - '@aws-sdk/middleware-expect-continue': 3.972.1 - '@aws-sdk/middleware-flexible-checksums': 3.972.1 - '@aws-sdk/middleware-host-header': 3.972.1 - '@aws-sdk/middleware-location-constraint': 3.972.1 - '@aws-sdk/middleware-logger': 3.972.1 - '@aws-sdk/middleware-recursion-detection': 3.972.1 - '@aws-sdk/middleware-sdk-s3': 3.972.2 - '@aws-sdk/middleware-ssec': 3.972.1 - '@aws-sdk/middleware-user-agent': 3.972.2 - '@aws-sdk/region-config-resolver': 3.972.1 - '@aws-sdk/signature-v4-multi-region': 3.972.0 - '@aws-sdk/types': 3.973.0 - '@aws-sdk/util-endpoints': 3.972.0 - '@aws-sdk/util-user-agent-browser': 3.972.1 - '@aws-sdk/util-user-agent-node': 3.972.1 - '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.21.1 - '@smithy/eventstream-serde-browser': 4.2.8 - '@smithy/eventstream-serde-config-resolver': 4.3.8 - '@smithy/eventstream-serde-node': 4.2.8 - '@smithy/fetch-http-handler': 5.3.9 - '@smithy/hash-blob-browser': 4.2.9 - '@smithy/hash-node': 4.2.8 - '@smithy/hash-stream-node': 4.2.8 - '@smithy/invalid-dependency': 4.2.8 - '@smithy/md5-js': 4.2.8 - '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.11 - '@smithy/middleware-retry': 4.4.27 - '@smithy/middleware-serde': 4.2.9 - '@smithy/middleware-stack': 4.2.8 - '@smithy/node-config-provider': 4.3.8 - '@smithy/node-http-handler': 4.4.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.12 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.26 - '@smithy/util-defaults-mode-node': 4.2.29 - '@smithy/util-endpoints': 3.2.8 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-retry': 4.2.8 - '@smithy/util-stream': 4.5.10 - '@smithy/util-utf8': 4.2.0 - '@smithy/util-waiter': 4.2.8 + '@aws-sdk/core': 3.973.20 + '@aws-sdk/credential-provider-node': 3.972.21 + '@aws-sdk/middleware-bucket-endpoint': 3.972.8 + '@aws-sdk/middleware-expect-continue': 3.972.8 + '@aws-sdk/middleware-flexible-checksums': 3.973.6 + '@aws-sdk/middleware-host-header': 3.972.8 + '@aws-sdk/middleware-location-constraint': 3.972.8 + '@aws-sdk/middleware-logger': 3.972.8 + '@aws-sdk/middleware-recursion-detection': 3.972.8 + '@aws-sdk/middleware-sdk-s3': 3.972.20 + '@aws-sdk/middleware-ssec': 3.972.8 + '@aws-sdk/middleware-user-agent': 3.972.21 + '@aws-sdk/region-config-resolver': 3.972.8 + '@aws-sdk/signature-v4-multi-region': 3.996.8 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-endpoints': 3.996.5 + '@aws-sdk/util-user-agent-browser': 3.972.8 + '@aws-sdk/util-user-agent-node': 3.973.7 + '@smithy/config-resolver': 4.4.11 + '@smithy/core': 3.23.11 + '@smithy/eventstream-serde-browser': 4.2.12 + '@smithy/eventstream-serde-config-resolver': 4.3.12 + '@smithy/eventstream-serde-node': 4.2.12 + '@smithy/fetch-http-handler': 5.3.15 + '@smithy/hash-blob-browser': 4.2.13 + '@smithy/hash-node': 4.2.12 + '@smithy/hash-stream-node': 4.2.12 + '@smithy/invalid-dependency': 4.2.12 + '@smithy/md5-js': 4.2.12 + '@smithy/middleware-content-length': 4.2.12 + '@smithy/middleware-endpoint': 4.4.25 + '@smithy/middleware-retry': 4.4.42 + '@smithy/middleware-serde': 4.2.14 + '@smithy/middleware-stack': 4.2.12 + '@smithy/node-config-provider': 4.3.12 + '@smithy/node-http-handler': 4.4.16 + '@smithy/protocol-http': 5.3.12 + '@smithy/smithy-client': 4.12.5 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.41 + '@smithy/util-defaults-mode-node': 4.2.44 + '@smithy/util-endpoints': 3.3.3 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-retry': 4.2.12 + '@smithy/util-stream': 4.5.19 + '@smithy/util-utf8': 4.2.2 + '@smithy/util-waiter': 4.2.13 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.974.0': + '@aws-sdk/core@3.973.20': dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.1 - '@aws-sdk/middleware-host-header': 3.972.1 - '@aws-sdk/middleware-logger': 3.972.1 - '@aws-sdk/middleware-recursion-detection': 3.972.1 - '@aws-sdk/middleware-user-agent': 3.972.2 - '@aws-sdk/region-config-resolver': 3.972.1 - '@aws-sdk/types': 3.973.0 - '@aws-sdk/util-endpoints': 3.972.0 - '@aws-sdk/util-user-agent-browser': 3.972.1 - '@aws-sdk/util-user-agent-node': 3.972.1 - '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.21.1 - '@smithy/fetch-http-handler': 5.3.9 - '@smithy/hash-node': 4.2.8 - '@smithy/invalid-dependency': 4.2.8 - '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.11 - '@smithy/middleware-retry': 4.4.27 - '@smithy/middleware-serde': 4.2.9 - '@smithy/middleware-stack': 4.2.8 - '@smithy/node-config-provider': 4.3.8 - '@smithy/node-http-handler': 4.4.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.12 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.26 - '@smithy/util-defaults-mode-node': 4.2.29 - '@smithy/util-endpoints': 3.2.8 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-retry': 4.2.8 - '@smithy/util-utf8': 4.2.0 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/xml-builder': 3.972.11 + '@smithy/core': 3.23.11 + '@smithy/node-config-provider': 4.3.12 + '@smithy/property-provider': 4.2.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/signature-v4': 5.3.12 + '@smithy/smithy-client': 4.12.5 + '@smithy/types': 4.13.1 + '@smithy/util-base64': 4.3.2 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + + '@aws-sdk/crc64-nvme@3.972.5': + dependencies: + '@smithy/types': 4.13.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.972.18': + dependencies: + '@aws-sdk/core': 3.973.20 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.972.20': + dependencies: + '@aws-sdk/core': 3.973.20 + '@aws-sdk/types': 3.973.6 + '@smithy/fetch-http-handler': 5.3.15 + '@smithy/node-http-handler': 4.4.16 + '@smithy/property-provider': 4.2.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/smithy-client': 4.12.5 + '@smithy/types': 4.13.1 + '@smithy/util-stream': 4.5.19 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.972.20': + dependencies: + '@aws-sdk/core': 3.973.20 + '@aws-sdk/credential-provider-env': 3.972.18 + '@aws-sdk/credential-provider-http': 3.972.20 + '@aws-sdk/credential-provider-login': 3.972.20 + '@aws-sdk/credential-provider-process': 3.972.18 + '@aws-sdk/credential-provider-sso': 3.972.20 + '@aws-sdk/credential-provider-web-identity': 3.972.20 + '@aws-sdk/nested-clients': 3.996.10 + '@aws-sdk/types': 3.973.6 + '@smithy/credential-provider-imds': 4.2.12 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.972.0': + '@aws-sdk/credential-provider-login@3.972.20': dependencies: - '@aws-sdk/types': 3.972.0 - '@aws-sdk/xml-builder': 3.972.0 - '@smithy/core': 3.21.1 - '@smithy/node-config-provider': 4.3.8 - '@smithy/property-provider': 4.2.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.10.12 - '@smithy/types': 4.12.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/core@3.973.1': - dependencies: - '@aws-sdk/types': 3.973.0 - '@aws-sdk/xml-builder': 3.972.1 - '@smithy/core': 3.21.1 - '@smithy/node-config-provider': 4.3.8 - '@smithy/property-provider': 4.2.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.10.12 - '@smithy/types': 4.12.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/crc64-nvme@3.972.0': - dependencies: - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-env@3.972.1': - dependencies: - '@aws-sdk/core': 3.973.1 - '@aws-sdk/types': 3.973.0 - '@smithy/property-provider': 4.2.8 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-http@3.972.2': - dependencies: - '@aws-sdk/core': 3.973.1 - '@aws-sdk/types': 3.973.0 - '@smithy/fetch-http-handler': 5.3.9 - '@smithy/node-http-handler': 4.4.8 - '@smithy/property-provider': 4.2.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.12 - '@smithy/types': 4.12.0 - '@smithy/util-stream': 4.5.10 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-ini@3.972.1': - dependencies: - '@aws-sdk/core': 3.973.1 - '@aws-sdk/credential-provider-env': 3.972.1 - '@aws-sdk/credential-provider-http': 3.972.2 - '@aws-sdk/credential-provider-login': 3.972.1 - '@aws-sdk/credential-provider-process': 3.972.1 - '@aws-sdk/credential-provider-sso': 3.972.1 - '@aws-sdk/credential-provider-web-identity': 3.972.1 - '@aws-sdk/nested-clients': 3.974.0 - '@aws-sdk/types': 3.973.0 - '@smithy/credential-provider-imds': 4.2.8 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 + '@aws-sdk/core': 3.973.20 + '@aws-sdk/nested-clients': 3.996.10 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-login@3.972.1': + '@aws-sdk/credential-provider-node@3.972.21': dependencies: - '@aws-sdk/core': 3.973.1 - '@aws-sdk/nested-clients': 3.974.0 - '@aws-sdk/types': 3.973.0 - '@smithy/property-provider': 4.2.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 + '@aws-sdk/credential-provider-env': 3.972.18 + '@aws-sdk/credential-provider-http': 3.972.20 + '@aws-sdk/credential-provider-ini': 3.972.20 + '@aws-sdk/credential-provider-process': 3.972.18 + '@aws-sdk/credential-provider-sso': 3.972.20 + '@aws-sdk/credential-provider-web-identity': 3.972.20 + '@aws-sdk/types': 3.973.6 + '@smithy/credential-provider-imds': 4.2.12 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.972.1': + '@aws-sdk/credential-provider-process@3.972.18': dependencies: - '@aws-sdk/credential-provider-env': 3.972.1 - '@aws-sdk/credential-provider-http': 3.972.2 - '@aws-sdk/credential-provider-ini': 3.972.1 - '@aws-sdk/credential-provider-process': 3.972.1 - '@aws-sdk/credential-provider-sso': 3.972.1 - '@aws-sdk/credential-provider-web-identity': 3.972.1 - '@aws-sdk/types': 3.973.0 - '@smithy/credential-provider-imds': 4.2.8 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 + '@aws-sdk/core': 3.973.20 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.972.20': + dependencies: + '@aws-sdk/core': 3.973.20 + '@aws-sdk/nested-clients': 3.996.10 + '@aws-sdk/token-providers': 3.1009.0 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.972.1': + '@aws-sdk/credential-provider-web-identity@3.972.20': dependencies: - '@aws-sdk/core': 3.973.1 - '@aws-sdk/types': 3.973.0 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-sso@3.972.1': - dependencies: - '@aws-sdk/client-sso': 3.974.0 - '@aws-sdk/core': 3.973.1 - '@aws-sdk/token-providers': 3.974.0 - '@aws-sdk/types': 3.973.0 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 + '@aws-sdk/core': 3.973.20 + '@aws-sdk/nested-clients': 3.996.10 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.972.1': + '@aws-sdk/middleware-bucket-endpoint@3.972.8': dependencies: - '@aws-sdk/core': 3.973.1 - '@aws-sdk/nested-clients': 3.974.0 - '@aws-sdk/types': 3.973.0 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/middleware-bucket-endpoint@3.972.1': - dependencies: - '@aws-sdk/types': 3.973.0 - '@aws-sdk/util-arn-parser': 3.972.1 - '@smithy/node-config-provider': 4.3.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 - '@smithy/util-config-provider': 4.2.0 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-arn-parser': 3.972.3 + '@smithy/node-config-provider': 4.3.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-config-provider': 4.2.2 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.972.1': + '@aws-sdk/middleware-expect-continue@3.972.8': dependencies: - '@aws-sdk/types': 3.973.0 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 + '@aws-sdk/types': 3.973.6 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.972.1': + '@aws-sdk/middleware-flexible-checksums@3.973.6': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.973.1 - '@aws-sdk/crc64-nvme': 3.972.0 - '@aws-sdk/types': 3.973.0 - '@smithy/is-array-buffer': 4.2.0 - '@smithy/node-config-provider': 4.3.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.10 - '@smithy/util-utf8': 4.2.0 + '@aws-sdk/core': 3.973.20 + '@aws-sdk/crc64-nvme': 3.972.5 + '@aws-sdk/types': 3.973.6 + '@smithy/is-array-buffer': 4.2.2 + '@smithy/node-config-provider': 4.3.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-stream': 4.5.19 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.972.1': + '@aws-sdk/middleware-host-header@3.972.8': dependencies: - '@aws-sdk/types': 3.973.0 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 + '@aws-sdk/types': 3.973.6 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.972.1': + '@aws-sdk/middleware-location-constraint@3.972.8': dependencies: - '@aws-sdk/types': 3.973.0 - '@smithy/types': 4.12.0 + '@aws-sdk/types': 3.973.6 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.972.1': + '@aws-sdk/middleware-logger@3.972.8': dependencies: - '@aws-sdk/types': 3.973.0 - '@smithy/types': 4.12.0 + '@aws-sdk/types': 3.973.6 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.972.1': + '@aws-sdk/middleware-recursion-detection@3.972.8': dependencies: - '@aws-sdk/types': 3.973.0 + '@aws-sdk/types': 3.973.6 '@aws/lambda-invoke-store': 0.2.3 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.972.0': + '@aws-sdk/middleware-sdk-s3@3.972.20': dependencies: - '@aws-sdk/core': 3.972.0 - '@aws-sdk/types': 3.972.0 - '@aws-sdk/util-arn-parser': 3.972.0 - '@smithy/core': 3.21.1 - '@smithy/node-config-provider': 4.3.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.10.12 - '@smithy/types': 4.12.0 - '@smithy/util-config-provider': 4.2.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.10 - '@smithy/util-utf8': 4.2.0 + '@aws-sdk/core': 3.973.20 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-arn-parser': 3.972.3 + '@smithy/core': 3.23.11 + '@smithy/node-config-provider': 4.3.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/signature-v4': 5.3.12 + '@smithy/smithy-client': 4.12.5 + '@smithy/types': 4.13.1 + '@smithy/util-config-provider': 4.2.2 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-stream': 4.5.19 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.972.2': + '@aws-sdk/middleware-ssec@3.972.8': dependencies: - '@aws-sdk/core': 3.973.1 - '@aws-sdk/types': 3.973.0 - '@aws-sdk/util-arn-parser': 3.972.1 - '@smithy/core': 3.21.1 - '@smithy/node-config-provider': 4.3.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.10.12 - '@smithy/types': 4.12.0 - '@smithy/util-config-provider': 4.2.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.10 - '@smithy/util-utf8': 4.2.0 + '@aws-sdk/types': 3.973.6 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.972.1': + '@aws-sdk/middleware-user-agent@3.972.21': dependencies: - '@aws-sdk/types': 3.973.0 - '@smithy/types': 4.12.0 + '@aws-sdk/core': 3.973.20 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-endpoints': 3.996.5 + '@smithy/core': 3.23.11 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-retry': 4.2.12 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.972.2': - dependencies: - '@aws-sdk/core': 3.973.1 - '@aws-sdk/types': 3.973.0 - '@aws-sdk/util-endpoints': 3.972.0 - '@smithy/core': 3.21.1 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/nested-clients@3.974.0': + '@aws-sdk/nested-clients@3.996.10': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.1 - '@aws-sdk/middleware-host-header': 3.972.1 - '@aws-sdk/middleware-logger': 3.972.1 - '@aws-sdk/middleware-recursion-detection': 3.972.1 - '@aws-sdk/middleware-user-agent': 3.972.2 - '@aws-sdk/region-config-resolver': 3.972.1 - '@aws-sdk/types': 3.973.0 - '@aws-sdk/util-endpoints': 3.972.0 - '@aws-sdk/util-user-agent-browser': 3.972.1 - '@aws-sdk/util-user-agent-node': 3.972.1 - '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.21.1 - '@smithy/fetch-http-handler': 5.3.9 - '@smithy/hash-node': 4.2.8 - '@smithy/invalid-dependency': 4.2.8 - '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.11 - '@smithy/middleware-retry': 4.4.27 - '@smithy/middleware-serde': 4.2.9 - '@smithy/middleware-stack': 4.2.8 - '@smithy/node-config-provider': 4.3.8 - '@smithy/node-http-handler': 4.4.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.12 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.26 - '@smithy/util-defaults-mode-node': 4.2.29 - '@smithy/util-endpoints': 3.2.8 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-retry': 4.2.8 - '@smithy/util-utf8': 4.2.0 + '@aws-sdk/core': 3.973.20 + '@aws-sdk/middleware-host-header': 3.972.8 + '@aws-sdk/middleware-logger': 3.972.8 + '@aws-sdk/middleware-recursion-detection': 3.972.8 + '@aws-sdk/middleware-user-agent': 3.972.21 + '@aws-sdk/region-config-resolver': 3.972.8 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-endpoints': 3.996.5 + '@aws-sdk/util-user-agent-browser': 3.972.8 + '@aws-sdk/util-user-agent-node': 3.973.7 + '@smithy/config-resolver': 4.4.11 + '@smithy/core': 3.23.11 + '@smithy/fetch-http-handler': 5.3.15 + '@smithy/hash-node': 4.2.12 + '@smithy/invalid-dependency': 4.2.12 + '@smithy/middleware-content-length': 4.2.12 + '@smithy/middleware-endpoint': 4.4.25 + '@smithy/middleware-retry': 4.4.42 + '@smithy/middleware-serde': 4.2.14 + '@smithy/middleware-stack': 4.2.12 + '@smithy/node-config-provider': 4.3.12 + '@smithy/node-http-handler': 4.4.16 + '@smithy/protocol-http': 5.3.12 + '@smithy/smithy-client': 4.12.5 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.41 + '@smithy/util-defaults-mode-node': 4.2.44 + '@smithy/util-endpoints': 3.3.3 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-retry': 4.2.12 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.972.1': + '@aws-sdk/region-config-resolver@3.972.8': dependencies: - '@aws-sdk/types': 3.973.0 - '@smithy/config-resolver': 4.4.6 - '@smithy/node-config-provider': 4.3.8 - '@smithy/types': 4.12.0 + '@aws-sdk/types': 3.973.6 + '@smithy/config-resolver': 4.4.11 + '@smithy/node-config-provider': 4.3.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.972.0': + '@aws-sdk/signature-v4-multi-region@3.996.8': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.972.0 - '@aws-sdk/types': 3.972.0 - '@smithy/protocol-http': 5.3.8 - '@smithy/signature-v4': 5.3.8 - '@smithy/types': 4.12.0 + '@aws-sdk/middleware-sdk-s3': 3.972.20 + '@aws-sdk/types': 3.973.6 + '@smithy/protocol-http': 5.3.12 + '@smithy/signature-v4': 5.3.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/token-providers@3.974.0': + '@aws-sdk/token-providers@3.1009.0': dependencies: - '@aws-sdk/core': 3.973.1 - '@aws-sdk/nested-clients': 3.974.0 - '@aws-sdk/types': 3.973.0 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 + '@aws-sdk/core': 3.973.20 + '@aws-sdk/nested-clients': 3.996.10 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.972.0': + '@aws-sdk/types@3.973.6': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/types@3.973.0': - dependencies: - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/util-arn-parser@3.972.0': + '@aws-sdk/util-arn-parser@3.972.3': dependencies: tslib: 2.8.1 - '@aws-sdk/util-arn-parser@3.972.1': + '@aws-sdk/util-endpoints@3.996.5': dependencies: - tslib: 2.8.1 - - '@aws-sdk/util-endpoints@3.972.0': - dependencies: - '@aws-sdk/types': 3.972.0 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-endpoints': 3.2.8 + '@aws-sdk/types': 3.973.6 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 + '@smithy/util-endpoints': 3.3.3 tslib: 2.8.1 '@aws-sdk/util-locate-window@3.965.3': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.972.1': + '@aws-sdk/util-user-agent-browser@3.972.8': dependencies: - '@aws-sdk/types': 3.973.0 - '@smithy/types': 4.12.0 + '@aws-sdk/types': 3.973.6 + '@smithy/types': 4.13.1 bowser: 2.13.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.972.1': + '@aws-sdk/util-user-agent-node@3.973.7': dependencies: - '@aws-sdk/middleware-user-agent': 3.972.2 - '@aws-sdk/types': 3.973.0 - '@smithy/node-config-provider': 4.3.8 - '@smithy/types': 4.12.0 + '@aws-sdk/middleware-user-agent': 3.972.21 + '@aws-sdk/types': 3.973.6 + '@smithy/node-config-provider': 4.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-config-provider': 4.2.2 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.0': + '@aws-sdk/xml-builder@3.972.11': dependencies: - '@smithy/types': 4.12.0 - fast-xml-parser: 5.2.5 - tslib: 2.8.1 - - '@aws-sdk/xml-builder@3.972.1': - dependencies: - '@smithy/types': 4.12.0 - fast-xml-parser: 5.2.5 + '@smithy/types': 4.13.1 + fast-xml-parser: 5.4.1 tslib: 2.8.1 '@aws/lambda-invoke-store@0.2.3': {} @@ -4686,23 +4640,21 @@ snapshots: '@cfworker/json-schema@4.1.1': {} - '@cloudflare/workers-types@4.20260123.0': {} - '@cloudflare/workers-types@4.20260127.0': {} '@configvault.io/interfaces@1.0.17': dependencies: '@api.global/typedrequest-interfaces': 3.0.19 - '@design.estate/dees-catalog@3.41.2(@tiptap/pm@2.27.2)': + '@design.estate/dees-catalog@3.48.5(@tiptap/pm@2.27.2)': dependencies: - '@design.estate/dees-domtools': 2.3.8 - '@design.estate/dees-element': 2.1.6 + '@design.estate/dees-domtools': 2.5.1 + '@design.estate/dees-element': 2.2.3 '@design.estate/dees-wcctools': 3.8.0 - '@fortawesome/fontawesome-svg-core': 7.1.0 - '@fortawesome/free-brands-svg-icons': 7.1.0 - '@fortawesome/free-regular-svg-icons': 7.1.0 - '@fortawesome/free-solid-svg-icons': 7.1.0 + '@fortawesome/fontawesome-svg-core': 7.2.0 + '@fortawesome/free-brands-svg-icons': 7.2.0 + '@fortawesome/free-regular-svg-icons': 7.2.0 + '@fortawesome/free-solid-svg-icons': 7.2.0 '@push.rocks/smarti18n': 1.0.4 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartstring': 4.1.0 @@ -4714,10 +4666,10 @@ snapshots: '@tiptap/extension-underline': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) '@tiptap/starter-kit': 2.27.2 '@tsclass/tsclass': 9.3.0 - apexcharts: 5.3.6 + apexcharts: 5.10.4 highlight.js: 11.11.1 ibantools: 4.5.1 - lucide: 0.563.0 + lucide: 0.577.0 monaco-editor: 0.55.1 pdfjs-dist: 4.10.38 xterm: 5.3.0 @@ -4731,26 +4683,26 @@ snapshots: '@design.estate/dees-comms@1.0.30': dependencies: - '@api.global/typedrequest': 3.2.5 + '@api.global/typedrequest': 3.3.0 '@api.global/typedrequest-interfaces': 3.0.19 '@push.rocks/smartdelay': 3.0.5 broadcast-channel: 7.3.0 - '@design.estate/dees-domtools@2.3.8': + '@design.estate/dees-domtools@2.5.1': dependencies: - '@api.global/typedrequest': 3.2.5 + '@api.global/typedrequest': 3.3.0 '@design.estate/dees-comms': 1.0.30 - '@push.rocks/lik': 6.2.2 + '@push.rocks/lik': 6.3.1 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartjson': 6.0.0 '@push.rocks/smartmarkdown': 3.0.3 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrouter': 1.3.3 '@push.rocks/smartrx': 3.0.10 - '@push.rocks/smartstate': 2.0.27 + '@push.rocks/smartstate': 2.2.1 '@push.rocks/smartstring': 4.1.0 '@push.rocks/smarturl': 3.1.0 - '@push.rocks/webrequest': 3.0.37 + '@push.rocks/webrequest': 4.0.5 '@push.rocks/websetup': 3.0.19 '@push.rocks/webstore': 2.0.20 '@tempfix/lenis': 1.3.20 @@ -4762,9 +4714,9 @@ snapshots: - supports-color - vue - '@design.estate/dees-element@2.1.6': + '@design.estate/dees-element@2.2.3': dependencies: - '@design.estate/dees-domtools': 2.3.8 + '@design.estate/dees-domtools': 2.5.1 '@push.rocks/isounique': 1.0.5 '@push.rocks/smartrx': 3.0.10 lit: 3.3.2 @@ -4776,8 +4728,8 @@ snapshots: '@design.estate/dees-wcctools@3.8.0': dependencies: - '@design.estate/dees-domtools': 2.3.8 - '@design.estate/dees-element': 2.1.6 + '@design.estate/dees-domtools': 2.5.1 + '@design.estate/dees-element': 2.2.3 '@push.rocks/smartdelay': 3.0.5 lit: 3.3.2 transitivePeerDependencies: @@ -4880,33 +4832,33 @@ snapshots: '@esbuild/win32-x64@0.27.2': optional: true - '@fortawesome/fontawesome-common-types@7.1.0': {} + '@fortawesome/fontawesome-common-types@7.2.0': {} - '@fortawesome/fontawesome-svg-core@7.1.0': + '@fortawesome/fontawesome-svg-core@7.2.0': dependencies: - '@fortawesome/fontawesome-common-types': 7.1.0 + '@fortawesome/fontawesome-common-types': 7.2.0 - '@fortawesome/free-brands-svg-icons@7.1.0': + '@fortawesome/free-brands-svg-icons@7.2.0': dependencies: - '@fortawesome/fontawesome-common-types': 7.1.0 + '@fortawesome/fontawesome-common-types': 7.2.0 - '@fortawesome/free-regular-svg-icons@7.1.0': + '@fortawesome/free-regular-svg-icons@7.2.0': dependencies: - '@fortawesome/fontawesome-common-types': 7.1.0 + '@fortawesome/fontawesome-common-types': 7.2.0 - '@fortawesome/free-solid-svg-icons@7.1.0': + '@fortawesome/free-solid-svg-icons@7.2.0': dependencies: - '@fortawesome/fontawesome-common-types': 7.1.0 + '@fortawesome/fontawesome-common-types': 7.2.0 - '@git.zone/tsbuild@4.1.2': + '@git.zone/tsbuild@4.3.0': dependencies: - '@git.zone/tspublish': 1.11.0 + '@git.zone/tspublish': 1.11.2 '@push.rocks/early': 4.0.4 '@push.rocks/smartcli': 4.0.20 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartfile': 13.1.2 - '@push.rocks/smartfs': 1.3.1 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartfs': 1.5.0 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 typescript: 5.9.3 @@ -4919,7 +4871,7 @@ snapshots: - supports-color - vue - '@git.zone/tsbundle@2.8.3': + '@git.zone/tsbundle@2.9.1': dependencies: '@push.rocks/early': 4.0.4 '@push.rocks/npmextra': 5.3.3 @@ -4927,7 +4879,7 @@ snapshots: '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartfs': 1.3.1 '@push.rocks/smartinteract': 2.0.16 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartlog-destination-local': 9.0.2 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 @@ -4945,19 +4897,19 @@ snapshots: - supports-color - vue - '@git.zone/tspublish@1.11.0': + '@git.zone/tspublish@1.11.2': dependencies: '@push.rocks/consolecolor': 2.0.3 '@push.rocks/npmextra': 5.3.3 '@push.rocks/smartcli': 4.0.20 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartfile': 13.1.2 - '@push.rocks/smartfs': 1.3.1 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartfs': 1.5.0 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartnpm': 2.0.6 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartrequest': 5.0.1 - '@push.rocks/smartshell': 3.3.0 + '@push.rocks/smartshell': 3.3.7 transitivePeerDependencies: - '@nuxt/kit' - aws-crt @@ -4973,30 +4925,31 @@ snapshots: '@push.rocks/smartshell': 3.3.0 tsx: 4.21.0 - '@git.zone/tstest@3.1.8(@push.rocks/smartserve@2.0.1)(socks@2.8.7)(typescript@5.9.3)': + '@git.zone/tstest@3.3.2(socks@2.8.7)(typescript@5.9.3)': dependencies: - '@api.global/typedserver': 3.0.80(@push.rocks/smartserve@2.0.1) - '@git.zone/tsbundle': 2.8.3 + '@git.zone/tsbundle': 2.9.1 '@git.zone/tsrun': 2.0.1 '@push.rocks/consolecolor': 2.0.3 '@push.rocks/qenv': 6.1.3 - '@push.rocks/smartbrowser': 2.0.8(typescript@5.9.3) - '@push.rocks/smartchok': 1.2.0 + '@push.rocks/smartbrowser': 2.0.11(typescript@5.9.3) '@push.rocks/smartcrypto': 2.0.4 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartenv': 6.0.0 '@push.rocks/smartexpect': 2.5.0 - '@push.rocks/smartfile': 11.2.7 - '@push.rocks/smartjson': 5.2.0 - '@push.rocks/smartlog': 3.1.10 - '@push.rocks/smartmongo': 2.0.14(socks@2.8.7) + '@push.rocks/smartfile': 13.1.2 + '@push.rocks/smartfs': 1.5.0 + '@push.rocks/smartjson': 6.0.0 + '@push.rocks/smartlog': 3.2.1 + '@push.rocks/smartmongo': 5.1.0(socks@2.8.7) '@push.rocks/smartnetwork': 4.4.0 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrequest': 5.0.1 - '@push.rocks/smarts3': 3.0.3 - '@push.rocks/smartshell': 3.3.0 - '@push.rocks/smarttime': 4.1.1 + '@push.rocks/smarts3': 5.3.0 + '@push.rocks/smartserve': 2.0.1 + '@push.rocks/smartshell': 3.3.7 + '@push.rocks/smarttime': 4.2.3 + '@push.rocks/smartwatch': 6.3.0 '@types/ws': 8.18.1 figures: 6.1.0 ws: 8.19.0 @@ -5004,7 +4957,6 @@ snapshots: - '@aws-sdk/credential-providers' - '@mongodb-js/zstd' - '@nuxt/kit' - - '@push.rocks/smartserve' - '@swc/helpers' - aws-crt - bare-abort-controller @@ -5022,23 +4974,23 @@ snapshots: - utf-8-validate - vue - '@git.zone/tswatch@3.0.1(@tiptap/pm@2.27.2)': + '@git.zone/tswatch@3.3.0(@tiptap/pm@2.27.2)': dependencies: - '@api.global/typedserver': 8.3.0(@tiptap/pm@2.27.2) - '@git.zone/tsbundle': 2.8.3 + '@api.global/typedserver': 8.4.2(@tiptap/pm@2.27.2) + '@git.zone/tsbundle': 2.9.1 '@git.zone/tsrun': 2.0.1 '@push.rocks/early': 4.0.4 - '@push.rocks/lik': 6.2.2 + '@push.rocks/lik': 6.3.1 '@push.rocks/npmextra': 5.3.3 '@push.rocks/smartcli': 4.0.20 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartfs': 1.3.1 + '@push.rocks/smartexit': 2.0.3 + '@push.rocks/smartfs': 1.5.0 '@push.rocks/smartinteract': 2.0.16 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartlog-destination-local': 9.0.2 - '@push.rocks/smartshell': 3.3.0 + '@push.rocks/smartshell': 3.3.7 '@push.rocks/smartwatch': 6.3.0 - '@push.rocks/taskbuffer': 3.5.0 transitivePeerDependencies: - '@nuxt/kit' - '@swc/helpers' @@ -5053,6 +5005,102 @@ snapshots: dependencies: happy-dom: 15.11.7 + '@img/colour@1.1.0': {} + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.8.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + '@inquirer/checkbox@3.0.1': dependencies: '@inquirer/core': 9.2.1 @@ -5164,6 +5212,195 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jimp/core@1.6.0': + dependencies: + '@jimp/file-ops': 1.6.0 + '@jimp/types': 1.6.0 + '@jimp/utils': 1.6.0 + await-to-js: 3.0.0 + exif-parser: 0.1.12 + file-type: 16.5.4 + mime: 3.0.0 + + '@jimp/diff@1.6.0': + dependencies: + '@jimp/plugin-resize': 1.6.0 + '@jimp/types': 1.6.0 + '@jimp/utils': 1.6.0 + pixelmatch: 5.3.0 + + '@jimp/file-ops@1.6.0': {} + + '@jimp/js-bmp@1.6.0': + dependencies: + '@jimp/core': 1.6.0 + '@jimp/types': 1.6.0 + '@jimp/utils': 1.6.0 + bmp-ts: 1.0.9 + + '@jimp/js-gif@1.6.0': + dependencies: + '@jimp/core': 1.6.0 + '@jimp/types': 1.6.0 + gifwrap: 0.10.1 + omggif: 1.0.10 + + '@jimp/js-jpeg@1.6.0': + dependencies: + '@jimp/core': 1.6.0 + '@jimp/types': 1.6.0 + jpeg-js: 0.4.4 + + '@jimp/js-png@1.6.0': + dependencies: + '@jimp/core': 1.6.0 + '@jimp/types': 1.6.0 + pngjs: 7.0.0 + + '@jimp/js-tiff@1.6.0': + dependencies: + '@jimp/core': 1.6.0 + '@jimp/types': 1.6.0 + utif2: 4.1.0 + + '@jimp/plugin-blit@1.6.0': + dependencies: + '@jimp/types': 1.6.0 + '@jimp/utils': 1.6.0 + zod: 3.25.76 + + '@jimp/plugin-blur@1.6.0': + dependencies: + '@jimp/core': 1.6.0 + '@jimp/utils': 1.6.0 + + '@jimp/plugin-circle@1.6.0': + dependencies: + '@jimp/types': 1.6.0 + zod: 3.25.76 + + '@jimp/plugin-color@1.6.0': + dependencies: + '@jimp/core': 1.6.0 + '@jimp/types': 1.6.0 + '@jimp/utils': 1.6.0 + tinycolor2: 1.6.0 + zod: 3.25.76 + + '@jimp/plugin-contain@1.6.0': + dependencies: + '@jimp/core': 1.6.0 + '@jimp/plugin-blit': 1.6.0 + '@jimp/plugin-resize': 1.6.0 + '@jimp/types': 1.6.0 + '@jimp/utils': 1.6.0 + zod: 3.25.76 + + '@jimp/plugin-cover@1.6.0': + dependencies: + '@jimp/core': 1.6.0 + '@jimp/plugin-crop': 1.6.0 + '@jimp/plugin-resize': 1.6.0 + '@jimp/types': 1.6.0 + zod: 3.25.76 + + '@jimp/plugin-crop@1.6.0': + dependencies: + '@jimp/core': 1.6.0 + '@jimp/types': 1.6.0 + '@jimp/utils': 1.6.0 + zod: 3.25.76 + + '@jimp/plugin-displace@1.6.0': + dependencies: + '@jimp/types': 1.6.0 + '@jimp/utils': 1.6.0 + zod: 3.25.76 + + '@jimp/plugin-dither@1.6.0': + dependencies: + '@jimp/types': 1.6.0 + + '@jimp/plugin-fisheye@1.6.0': + dependencies: + '@jimp/types': 1.6.0 + '@jimp/utils': 1.6.0 + zod: 3.25.76 + + '@jimp/plugin-flip@1.6.0': + dependencies: + '@jimp/types': 1.6.0 + zod: 3.25.76 + + '@jimp/plugin-hash@1.6.0': + dependencies: + '@jimp/core': 1.6.0 + '@jimp/js-bmp': 1.6.0 + '@jimp/js-jpeg': 1.6.0 + '@jimp/js-png': 1.6.0 + '@jimp/js-tiff': 1.6.0 + '@jimp/plugin-color': 1.6.0 + '@jimp/plugin-resize': 1.6.0 + '@jimp/types': 1.6.0 + '@jimp/utils': 1.6.0 + any-base: 1.1.0 + + '@jimp/plugin-mask@1.6.0': + dependencies: + '@jimp/types': 1.6.0 + zod: 3.25.76 + + '@jimp/plugin-print@1.6.0': + dependencies: + '@jimp/core': 1.6.0 + '@jimp/js-jpeg': 1.6.0 + '@jimp/js-png': 1.6.0 + '@jimp/plugin-blit': 1.6.0 + '@jimp/types': 1.6.0 + parse-bmfont-ascii: 1.0.6 + parse-bmfont-binary: 1.0.6 + parse-bmfont-xml: 1.1.6 + simple-xml-to-json: 1.2.3 + zod: 3.25.76 + + '@jimp/plugin-quantize@1.6.0': + dependencies: + image-q: 4.0.0 + zod: 3.25.76 + + '@jimp/plugin-resize@1.6.0': + dependencies: + '@jimp/core': 1.6.0 + '@jimp/types': 1.6.0 + zod: 3.25.76 + + '@jimp/plugin-rotate@1.6.0': + dependencies: + '@jimp/core': 1.6.0 + '@jimp/plugin-crop': 1.6.0 + '@jimp/plugin-resize': 1.6.0 + '@jimp/types': 1.6.0 + '@jimp/utils': 1.6.0 + zod: 3.25.76 + + '@jimp/plugin-threshold@1.6.0': + dependencies: + '@jimp/core': 1.6.0 + '@jimp/plugin-color': 1.6.0 + '@jimp/plugin-hash': 1.6.0 + '@jimp/types': 1.6.0 + '@jimp/utils': 1.6.0 + zod: 3.25.76 + + '@jimp/types@1.6.0': + dependencies: + zod: 3.25.76 + + '@jimp/utils@1.6.0': + dependencies: + '@jimp/types': 1.6.0 + tinycolor2: 1.6.0 + '@leichtgewicht/ip-codec@2.0.5': {} '@lit-labs/ssr-dom-shim@1.5.1': {} @@ -5441,6 +5678,17 @@ snapshots: '@types/symbol-tree': 3.2.5 symbol-tree: 3.2.4 + '@push.rocks/lik@6.3.1': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartmatch': 2.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smarttime': 4.2.3 + '@types/minimatch': 5.1.2 + '@types/symbol-tree': 3.2.5 + symbol-tree: 3.2.4 + '@push.rocks/mongodump@1.1.0(socks@2.8.7)': dependencies: '@push.rocks/lik': 6.2.2 @@ -5464,7 +5712,7 @@ snapshots: '@push.rocks/qenv': 6.1.3 '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartjson': 5.2.0 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.10 @@ -5478,10 +5726,10 @@ snapshots: '@push.rocks/qenv@6.1.3': dependencies: - '@api.global/typedrequest': 3.2.5 + '@api.global/typedrequest': 3.3.0 '@configvault.io/interfaces': 1.0.17 '@push.rocks/smartfile': 11.2.7 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartarchive@4.2.4': @@ -5504,24 +5752,28 @@ snapshots: - react-native-b4a - supports-color - '@push.rocks/smartbrowser@2.0.8(typescript@5.9.3)': + '@push.rocks/smartbrowser@2.0.11(typescript@5.9.3)': dependencies: '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartpdf': 3.3.0(typescript@5.9.3) + '@push.rocks/smartpdf': 4.2.0(typescript@5.9.3) '@push.rocks/smartpuppeteer': 2.0.5(typescript@5.9.3) '@push.rocks/smartunique': 3.0.9 transitivePeerDependencies: + - '@nuxt/kit' + - aws-crt - bare-abort-controller - bare-buffer - bufferutil + - react - react-native-b4a - supports-color - typescript - utf-8-validate + - vue '@push.rocks/smartbucket@3.3.10': dependencies: - '@aws-sdk/client-s3': 3.975.0 + '@aws-sdk/client-s3': 3.1009.0 '@push.rocks/smartmime': 2.0.4 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 @@ -5533,18 +5785,18 @@ snapshots: transitivePeerDependencies: - aws-crt - '@push.rocks/smartbucket@4.4.1': + '@push.rocks/smartbucket@4.5.1': dependencies: - '@aws-sdk/client-s3': 3.975.0 + '@aws-sdk/client-s3': 3.1009.0 '@push.rocks/smartmime': 2.0.4 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.10 - '@push.rocks/smartstream': 3.2.5 + '@push.rocks/smartstream': 3.4.0 '@push.rocks/smartstring': 4.1.0 '@push.rocks/smartunique': 3.0.9 - '@tsclass/tsclass': 9.3.0 - minimatch: 10.1.1 + '@tsclass/tsclass': 9.4.0 + minimatch: 10.2.4 transitivePeerDependencies: - aws-crt @@ -5560,18 +5812,10 @@ snapshots: '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smarttime': 4.1.1 - '@push.rocks/smartchok@1.2.0': - dependencies: - '@push.rocks/lik': 6.2.2 - '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrx': 3.0.10 - chokidar: 5.0.0 - picomatch: 4.0.3 - '@push.rocks/smartcli@4.0.20': dependencies: '@push.rocks/lik': 6.2.2 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartobject': 1.0.12 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.10 @@ -5596,12 +5840,12 @@ snapshots: dependencies: '@push.rocks/lik': 6.2.2 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartmongo': 2.0.14(socks@2.8.7) '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.10 '@push.rocks/smartstring': 4.1.0 - '@push.rocks/smarttime': 4.1.1 + '@push.rocks/smarttime': 4.2.3 '@push.rocks/smartunique': 3.0.9 '@push.rocks/taskbuffer': 3.5.0 '@tsclass/tsclass': 9.3.0 @@ -5621,11 +5865,11 @@ snapshots: - supports-color - vue - '@push.rocks/smartdata@7.0.15(socks@2.8.7)': + '@push.rocks/smartdata@7.1.0(socks@2.8.7)': dependencies: '@push.rocks/lik': 6.2.2 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartmongo': 2.0.14(socks@2.8.7) '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.10 @@ -5634,7 +5878,7 @@ snapshots: '@push.rocks/smartunique': 3.0.9 '@push.rocks/taskbuffer': 3.5.0 '@tsclass/tsclass': 9.3.0 - mongodb: 7.0.0(socks@2.8.7) + mongodb: 7.1.0(socks@2.8.7) transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@mongodb-js/zstd' @@ -5690,6 +5934,11 @@ snapshots: '@push.rocks/smartpromise': 4.2.3 tree-kill: 1.2.2 + '@push.rocks/smartexit@2.0.3': + dependencies: + '@push.rocks/lik': 6.3.1 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartexpect@2.5.0': dependencies: '@push.rocks/smartdelay': 3.0.5 @@ -5742,6 +5991,11 @@ snapshots: dependencies: '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartfs@1.5.0': + dependencies: + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartrust': 1.3.1 + '@push.rocks/smartguard@3.1.0': dependencies: '@push.rocks/smartpromise': 4.2.3 @@ -5764,6 +6018,22 @@ snapshots: '@push.rocks/smartpromise': 4.2.3 inquirer: 11.1.0 + '@push.rocks/smartjimp@1.2.0': + dependencies: + '@push.rocks/levelcache': 3.2.0 + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smarthash': 3.2.6 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartrequest': 4.4.2 + jimp: 1.6.0 + sharp: 0.34.5 + transitivePeerDependencies: + - '@nuxt/kit' + - aws-crt + - react + - supports-color + - vue + '@push.rocks/smartjson@5.2.0': dependencies: '@push.rocks/smartenv': 5.0.13 @@ -5771,6 +6041,13 @@ snapshots: fast-json-stable-stringify: 2.1.0 lodash.clonedeep: 4.5.0 + '@push.rocks/smartjson@6.0.0': + dependencies: + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartstring': 4.1.0 + fast-json-stable-stringify: 2.1.0 + lodash.clonedeep: 4.5.0 + '@push.rocks/smartlog-destination-devtools@1.0.12': dependencies: '@push.rocks/smartlog-interfaces': 3.0.2 @@ -5786,7 +6063,7 @@ snapshots: '@api.global/typedrequest-interfaces': 2.0.2 '@tsclass/tsclass': 4.4.4 - '@push.rocks/smartlog@3.1.10': + '@push.rocks/smartlog@3.2.1': dependencies: '@api.global/typedrequest-interfaces': 3.0.19 '@push.rocks/consolecolor': 2.0.3 @@ -5796,7 +6073,7 @@ snapshots: '@push.rocks/smarthash': 3.2.6 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smarttime': 4.1.1 - '@push.rocks/webrequest': 3.0.37 + '@push.rocks/webrequest': 4.0.1 '@tsclass/tsclass': 9.3.0 '@push.rocks/smartmanifest@2.0.2': {} @@ -5848,6 +6125,32 @@ snapshots: - supports-color - vue + '@push.rocks/smartmongo@5.1.0(socks@2.8.7)': + dependencies: + '@push.rocks/mongodump': 1.1.0(socks@2.8.7) + '@push.rocks/smartdata': 5.16.7(socks@2.8.7) + '@push.rocks/smartfs': 1.5.0 + '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + bson: 6.10.4 + mingo: 7.2.0 + mongodb-memory-server: 10.4.3(socks@2.8.7) + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - '@nuxt/kit' + - bare-abort-controller + - gcp-metadata + - kerberos + - mongodb-client-encryption + - react + - react-native-b4a + - snappy + - socks + - supports-color + - vue + '@push.rocks/smartnetwork@4.4.0': dependencies: '@push.rocks/smartdns': 7.6.1 @@ -5882,7 +6185,7 @@ snapshots: '@push.rocks/smartntml@2.0.8': dependencies: - '@design.estate/dees-element': 2.1.6 + '@design.estate/dees-element': 2.2.3 '@happy-dom/global-registrator': 15.11.7 '@push.rocks/smartpromise': 4.2.3 fake-indexeddb: 6.2.5 @@ -5905,29 +6208,33 @@ snapshots: '@push.rocks/smartpath@6.0.0': {} - '@push.rocks/smartpdf@3.3.0(typescript@5.9.3)': + '@push.rocks/smartpdf@4.2.0(typescript@5.9.3)': dependencies: '@push.rocks/smartbuffer': 3.0.5 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartfs': 1.5.0 + '@push.rocks/smartjimp': 1.2.0 '@push.rocks/smartnetwork': 4.4.0 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartpuppeteer': 2.0.5(typescript@5.9.3) + '@push.rocks/smartserve': 2.0.1 '@push.rocks/smartunique': 3.0.9 '@tsclass/tsclass': 9.3.0 - '@types/express': 5.0.6 - express: 5.2.1 pdf-lib: 1.17.1 - pdf2json: 3.2.0 + pdf2json: 4.0.2 transitivePeerDependencies: + - '@nuxt/kit' + - aws-crt - bare-abort-controller - bare-buffer - bufferutil + - react - react-native-b4a - supports-color - typescript - utf-8-validate + - vue '@push.rocks/smartping@1.0.8': dependencies: @@ -5939,7 +6246,7 @@ snapshots: '@push.rocks/smartpuppeteer@2.0.5(typescript@5.9.3)': dependencies: '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartshell': 3.3.0 + '@push.rocks/smartshell': 3.3.7 puppeteer: 24.36.0(typescript@5.9.3) tree-kill: 1.2.2 transitivePeerDependencies: @@ -5978,32 +6285,32 @@ snapshots: '@push.rocks/smartrouter@1.3.3': dependencies: - '@push.rocks/lik': 6.2.2 + '@push.rocks/lik': 6.3.1 '@push.rocks/smartrx': 3.0.10 path-to-regexp: 8.3.0 + '@push.rocks/smartrust@1.3.1': + dependencies: + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartrx@3.0.10': dependencies: '@push.rocks/smartpromise': 4.2.3 rxjs: 7.8.2 - '@push.rocks/smarts3@3.0.3': + '@push.rocks/smarts3@5.3.0': dependencies: - '@push.rocks/smartbucket': 4.4.1 - '@push.rocks/smartfs': 1.3.1 '@push.rocks/smartpath': 6.0.0 - '@push.rocks/smartxml': 2.0.0 + '@push.rocks/smartrust': 1.3.1 '@tsclass/tsclass': 9.3.0 - transitivePeerDependencies: - - aws-crt '@push.rocks/smartserve@2.0.1': dependencies: - '@api.global/typedrequest': 3.2.5 + '@api.global/typedrequest': 3.3.0 '@cfworker/json-schema': 4.1.1 '@push.rocks/lik': 6.2.2 '@push.rocks/smartenv': 6.0.0 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartpath': 6.0.0 ws: 8.19.0 transitivePeerDependencies: @@ -6019,6 +6326,14 @@ snapshots: tree-kill: 1.2.2 which: 5.0.0 + '@push.rocks/smartshell@3.3.7': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartexit': 2.0.3 + '@push.rocks/smartpromise': 4.2.3 + '@types/which': 3.0.4 + which: 6.0.1 + '@push.rocks/smartsitemap@2.0.4': dependencies: '@push.rocks/smartcache': 1.0.18 @@ -6028,31 +6343,6 @@ snapshots: '@push.rocks/webrequest': 4.0.1 '@tsclass/tsclass': 9.3.0 - '@push.rocks/smartsocket@2.1.0': - dependencies: - '@api.global/typedrequest-interfaces': 3.0.19 - '@api.global/typedserver': 3.0.80(@push.rocks/smartserve@2.0.1) - '@push.rocks/isohash': 2.0.1 - '@push.rocks/isounique': 1.0.5 - '@push.rocks/lik': 6.2.2 - '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartenv': 5.0.13 - '@push.rocks/smartjson': 5.2.0 - '@push.rocks/smartlog': 3.1.10 - '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrx': 3.0.10 - '@push.rocks/smarttime': 4.1.1 - engine.io: 6.6.4 - socket.io: 4.8.1 - socket.io-client: 4.8.1 - transitivePeerDependencies: - - '@nuxt/kit' - - bufferutil - - react - - supports-color - - utf-8-validate - - vue - '@push.rocks/smartspawn@3.0.3': dependencies: '@push.rocks/smartpromise': 4.2.3 @@ -6062,11 +6352,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@push.rocks/smartstate@2.0.27': + '@push.rocks/smartstate@2.2.1': dependencies: - '@push.rocks/lik': 6.2.2 '@push.rocks/smarthash': 3.2.6 - '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartjson': 6.0.0 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.10 '@push.rocks/webstore': 2.0.20 @@ -6078,6 +6367,13 @@ snapshots: '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstream@3.4.0': + dependencies: + '@push.rocks/lik': 6.3.1 + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstring@4.1.0': dependencies: '@push.rocks/isounique': 1.0.5 @@ -6093,6 +6389,17 @@ snapshots: is-nan: 1.3.2 pretty-ms: 9.3.0 + '@push.rocks/smarttime@4.2.3': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartpromise': 4.2.3 + croner: 10.0.1 + date-fns: 4.1.0 + dayjs: 1.11.19 + is-nan: 1.3.2 + pretty-ms: 9.3.0 + '@push.rocks/smartunique@3.0.9': dependencies: '@types/uuid': 9.0.8 @@ -6130,10 +6437,10 @@ snapshots: '@push.rocks/taskbuffer@3.5.0': dependencies: - '@design.estate/dees-element': 2.1.6 + '@design.estate/dees-element': 2.2.3 '@push.rocks/lik': 6.2.2 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.10 '@push.rocks/smarttime': 4.1.1 @@ -6160,6 +6467,14 @@ snapshots: '@push.rocks/smartpromise': 4.2.3 '@push.rocks/webstore': 2.0.20 + '@push.rocks/webrequest@4.0.5': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartjson': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/webstore': 2.0.20 + '@push.rocks/websetup@3.0.19': dependencies: '@pushrocks/smartdelay': 3.0.1 @@ -6328,254 +6643,255 @@ snapshots: '@sindresorhus/is@5.6.0': {} - '@smithy/abort-controller@4.2.8': + '@smithy/abort-controller@4.2.12': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/chunked-blob-reader-native@4.2.1': + '@smithy/chunked-blob-reader-native@4.2.3': dependencies: - '@smithy/util-base64': 4.3.0 + '@smithy/util-base64': 4.3.2 tslib: 2.8.1 - '@smithy/chunked-blob-reader@5.2.0': + '@smithy/chunked-blob-reader@5.2.2': dependencies: tslib: 2.8.1 - '@smithy/config-resolver@4.4.6': + '@smithy/config-resolver@4.4.11': dependencies: - '@smithy/node-config-provider': 4.3.8 - '@smithy/types': 4.12.0 - '@smithy/util-config-provider': 4.2.0 - '@smithy/util-endpoints': 3.2.8 - '@smithy/util-middleware': 4.2.8 + '@smithy/node-config-provider': 4.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-config-provider': 4.2.2 + '@smithy/util-endpoints': 3.3.3 + '@smithy/util-middleware': 4.2.12 tslib: 2.8.1 - '@smithy/core@3.21.1': + '@smithy/core@3.23.11': dependencies: - '@smithy/middleware-serde': 4.2.9 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.10 - '@smithy/util-utf8': 4.2.0 - '@smithy/uuid': 1.1.0 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-stream': 4.5.19 + '@smithy/util-utf8': 4.2.2 + '@smithy/uuid': 1.1.2 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.2.8': + '@smithy/credential-provider-imds@4.2.12': dependencies: - '@smithy/node-config-provider': 4.3.8 - '@smithy/property-provider': 4.2.8 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 + '@smithy/node-config-provider': 4.3.12 + '@smithy/property-provider': 4.2.12 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 tslib: 2.8.1 - '@smithy/eventstream-codec@4.2.8': + '@smithy/eventstream-codec@4.2.12': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.12.0 - '@smithy/util-hex-encoding': 4.2.0 + '@smithy/types': 4.13.1 + '@smithy/util-hex-encoding': 4.2.2 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.2.8': + '@smithy/eventstream-serde-browser@4.2.12': dependencies: - '@smithy/eventstream-serde-universal': 4.2.8 - '@smithy/types': 4.12.0 + '@smithy/eventstream-serde-universal': 4.2.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.3.8': + '@smithy/eventstream-serde-config-resolver@4.3.12': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/eventstream-serde-node@4.2.8': + '@smithy/eventstream-serde-node@4.2.12': dependencies: - '@smithy/eventstream-serde-universal': 4.2.8 - '@smithy/types': 4.12.0 + '@smithy/eventstream-serde-universal': 4.2.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.2.8': + '@smithy/eventstream-serde-universal@4.2.12': dependencies: - '@smithy/eventstream-codec': 4.2.8 - '@smithy/types': 4.12.0 + '@smithy/eventstream-codec': 4.2.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.3.9': + '@smithy/fetch-http-handler@5.3.15': dependencies: - '@smithy/protocol-http': 5.3.8 - '@smithy/querystring-builder': 4.2.8 - '@smithy/types': 4.12.0 - '@smithy/util-base64': 4.3.0 + '@smithy/protocol-http': 5.3.12 + '@smithy/querystring-builder': 4.2.12 + '@smithy/types': 4.13.1 + '@smithy/util-base64': 4.3.2 tslib: 2.8.1 - '@smithy/hash-blob-browser@4.2.9': + '@smithy/hash-blob-browser@4.2.13': dependencies: - '@smithy/chunked-blob-reader': 5.2.0 - '@smithy/chunked-blob-reader-native': 4.2.1 - '@smithy/types': 4.12.0 + '@smithy/chunked-blob-reader': 5.2.2 + '@smithy/chunked-blob-reader-native': 4.2.3 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/hash-node@4.2.8': + '@smithy/hash-node@4.2.12': dependencies: - '@smithy/types': 4.12.0 - '@smithy/util-buffer-from': 4.2.0 - '@smithy/util-utf8': 4.2.0 + '@smithy/types': 4.13.1 + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/hash-stream-node@4.2.8': + '@smithy/hash-stream-node@4.2.12': dependencies: - '@smithy/types': 4.12.0 - '@smithy/util-utf8': 4.2.0 + '@smithy/types': 4.13.1 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/invalid-dependency@4.2.8': + '@smithy/invalid-dependency@4.2.12': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/is-array-buffer@4.2.0': + '@smithy/is-array-buffer@4.2.2': dependencies: tslib: 2.8.1 - '@smithy/md5-js@4.2.8': + '@smithy/md5-js@4.2.12': dependencies: - '@smithy/types': 4.12.0 - '@smithy/util-utf8': 4.2.0 + '@smithy/types': 4.13.1 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/middleware-content-length@4.2.8': + '@smithy/middleware-content-length@4.2.12': dependencies: - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.4.11': + '@smithy/middleware-endpoint@4.4.25': dependencies: - '@smithy/core': 3.21.1 - '@smithy/middleware-serde': 4.2.9 - '@smithy/node-config-provider': 4.3.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-middleware': 4.2.8 + '@smithy/core': 3.23.11 + '@smithy/middleware-serde': 4.2.14 + '@smithy/node-config-provider': 4.3.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 + '@smithy/util-middleware': 4.2.12 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.27': + '@smithy/middleware-retry@4.4.42': dependencies: - '@smithy/node-config-provider': 4.3.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/service-error-classification': 4.2.8 - '@smithy/smithy-client': 4.10.12 - '@smithy/types': 4.12.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-retry': 4.2.8 - '@smithy/uuid': 1.1.0 + '@smithy/node-config-provider': 4.3.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/service-error-classification': 4.2.12 + '@smithy/smithy-client': 4.12.5 + '@smithy/types': 4.13.1 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-retry': 4.2.12 + '@smithy/uuid': 1.1.2 tslib: 2.8.1 - '@smithy/middleware-serde@4.2.9': + '@smithy/middleware-serde@4.2.14': dependencies: - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 + '@smithy/core': 3.23.11 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/middleware-stack@4.2.8': + '@smithy/middleware-stack@4.2.12': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/node-config-provider@4.3.8': + '@smithy/node-config-provider@4.3.12': dependencies: - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/node-http-handler@4.4.8': + '@smithy/node-http-handler@4.4.16': dependencies: - '@smithy/abort-controller': 4.2.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/querystring-builder': 4.2.8 - '@smithy/types': 4.12.0 + '@smithy/abort-controller': 4.2.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/querystring-builder': 4.2.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/property-provider@4.2.8': + '@smithy/property-provider@4.2.12': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/protocol-http@5.3.8': + '@smithy/protocol-http@5.3.12': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/querystring-builder@4.2.8': + '@smithy/querystring-builder@4.2.12': dependencies: - '@smithy/types': 4.12.0 - '@smithy/util-uri-escape': 4.2.0 + '@smithy/types': 4.13.1 + '@smithy/util-uri-escape': 4.2.2 tslib: 2.8.1 - '@smithy/querystring-parser@4.2.8': + '@smithy/querystring-parser@4.2.12': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/service-error-classification@4.2.8': + '@smithy/service-error-classification@4.2.12': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.1 - '@smithy/shared-ini-file-loader@4.4.3': + '@smithy/shared-ini-file-loader@4.4.7': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/signature-v4@5.3.8': + '@smithy/signature-v4@5.3.12': dependencies: - '@smithy/is-array-buffer': 4.2.0 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 - '@smithy/util-hex-encoding': 4.2.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-uri-escape': 4.2.0 - '@smithy/util-utf8': 4.2.0 + '@smithy/is-array-buffer': 4.2.2 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-hex-encoding': 4.2.2 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-uri-escape': 4.2.2 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/smithy-client@4.10.12': + '@smithy/smithy-client@4.12.5': dependencies: - '@smithy/core': 3.21.1 - '@smithy/middleware-endpoint': 4.4.11 - '@smithy/middleware-stack': 4.2.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 - '@smithy/util-stream': 4.5.10 + '@smithy/core': 3.23.11 + '@smithy/middleware-endpoint': 4.4.25 + '@smithy/middleware-stack': 4.2.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-stream': 4.5.19 tslib: 2.8.1 - '@smithy/types@4.12.0': + '@smithy/types@4.13.1': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.2.8': + '@smithy/url-parser@4.2.12': dependencies: - '@smithy/querystring-parser': 4.2.8 - '@smithy/types': 4.12.0 + '@smithy/querystring-parser': 4.2.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/util-base64@4.3.0': + '@smithy/util-base64@4.3.2': dependencies: - '@smithy/util-buffer-from': 4.2.0 - '@smithy/util-utf8': 4.2.0 + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/util-body-length-browser@4.2.0': + '@smithy/util-body-length-browser@4.2.2': dependencies: tslib: 2.8.1 - '@smithy/util-body-length-node@4.2.1': + '@smithy/util-body-length-node@4.2.3': dependencies: tslib: 2.8.1 @@ -6584,65 +6900,65 @@ snapshots: '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 - '@smithy/util-buffer-from@4.2.0': + '@smithy/util-buffer-from@4.2.2': dependencies: - '@smithy/is-array-buffer': 4.2.0 + '@smithy/is-array-buffer': 4.2.2 tslib: 2.8.1 - '@smithy/util-config-provider@4.2.0': + '@smithy/util-config-provider@4.2.2': dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.3.26': + '@smithy/util-defaults-mode-browser@4.3.41': dependencies: - '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.10.12 - '@smithy/types': 4.12.0 + '@smithy/property-provider': 4.2.12 + '@smithy/smithy-client': 4.12.5 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.2.29': + '@smithy/util-defaults-mode-node@4.2.44': dependencies: - '@smithy/config-resolver': 4.4.6 - '@smithy/credential-provider-imds': 4.2.8 - '@smithy/node-config-provider': 4.3.8 - '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.10.12 - '@smithy/types': 4.12.0 + '@smithy/config-resolver': 4.4.11 + '@smithy/credential-provider-imds': 4.2.12 + '@smithy/node-config-provider': 4.3.12 + '@smithy/property-provider': 4.2.12 + '@smithy/smithy-client': 4.12.5 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/util-endpoints@3.2.8': + '@smithy/util-endpoints@3.3.3': dependencies: - '@smithy/node-config-provider': 4.3.8 - '@smithy/types': 4.12.0 + '@smithy/node-config-provider': 4.3.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/util-hex-encoding@4.2.0': + '@smithy/util-hex-encoding@4.2.2': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.2.8': + '@smithy/util-middleware@4.2.12': dependencies: - '@smithy/types': 4.12.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/util-retry@4.2.8': + '@smithy/util-retry@4.2.12': dependencies: - '@smithy/service-error-classification': 4.2.8 - '@smithy/types': 4.12.0 + '@smithy/service-error-classification': 4.2.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/util-stream@4.5.10': + '@smithy/util-stream@4.5.19': dependencies: - '@smithy/fetch-http-handler': 5.3.9 - '@smithy/node-http-handler': 4.4.8 - '@smithy/types': 4.12.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-buffer-from': 4.2.0 - '@smithy/util-hex-encoding': 4.2.0 - '@smithy/util-utf8': 4.2.0 + '@smithy/fetch-http-handler': 5.3.15 + '@smithy/node-http-handler': 4.4.16 + '@smithy/types': 4.13.1 + '@smithy/util-base64': 4.3.2 + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-hex-encoding': 4.2.2 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/util-uri-escape@4.2.0': + '@smithy/util-uri-escape@4.2.2': dependencies: tslib: 2.8.1 @@ -6651,42 +6967,21 @@ snapshots: '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 - '@smithy/util-utf8@4.2.0': + '@smithy/util-utf8@4.2.2': dependencies: - '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-buffer-from': 4.2.2 tslib: 2.8.1 - '@smithy/util-waiter@4.2.8': + '@smithy/util-waiter@4.2.13': dependencies: - '@smithy/abort-controller': 4.2.8 - '@smithy/types': 4.12.0 + '@smithy/abort-controller': 4.2.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/uuid@1.1.0': + '@smithy/uuid@1.1.2': dependencies: tslib: 2.8.1 - '@socket.io/component-emitter@3.1.2': {} - - '@svgdotjs/svg.draggable.js@3.0.6(@svgdotjs/svg.js@3.2.5)': - dependencies: - '@svgdotjs/svg.js': 3.2.5 - - '@svgdotjs/svg.filter.js@3.0.9': - dependencies: - '@svgdotjs/svg.js': 3.2.5 - - '@svgdotjs/svg.js@3.2.5': {} - - '@svgdotjs/svg.resize.js@2.0.5(@svgdotjs/svg.js@3.2.5)(@svgdotjs/svg.select.js@4.0.3(@svgdotjs/svg.js@3.2.5))': - dependencies: - '@svgdotjs/svg.js': 3.2.5 - '@svgdotjs/svg.select.js': 4.0.3(@svgdotjs/svg.js@3.2.5) - - '@svgdotjs/svg.select.js@4.0.3(@svgdotjs/svg.js@3.2.5)': - dependencies: - '@svgdotjs/svg.js': 3.2.5 - '@szmarczak/http-timer@5.0.1': dependencies: defer-to-connect: 2.0.1 @@ -6864,6 +7159,10 @@ snapshots: dependencies: type-fest: 4.41.0 + '@tsclass/tsclass@9.4.0': + dependencies: + type-fest: 5.4.4 + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 @@ -6871,57 +7170,31 @@ snapshots: '@types/bn.js@5.2.0': dependencies: - '@types/node': 25.0.10 - - '@types/body-parser@1.19.6': - dependencies: - '@types/connect': 3.4.38 - '@types/node': 25.0.10 + '@types/node': 25.5.0 '@types/buffer-json@2.0.3': {} '@types/clean-css@4.2.11': dependencies: - '@types/node': 25.0.10 + '@types/node': 25.5.0 source-map: 0.6.1 - '@types/connect@3.4.38': - dependencies: - '@types/node': 25.0.10 - - '@types/cors@2.8.19': - dependencies: - '@types/node': 25.0.10 - '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 '@types/dns-packet@5.6.5': dependencies: - '@types/node': 25.0.10 + '@types/node': 25.5.0 '@types/elliptic@6.4.18': dependencies: '@types/bn.js': 5.2.0 - '@types/express-serve-static-core@5.1.1': - dependencies: - '@types/node': 25.0.10 - '@types/qs': 6.14.0 - '@types/range-parser': 1.2.7 - '@types/send': 1.2.1 - - '@types/express@5.0.6': - dependencies: - '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 5.1.1 - '@types/serve-static': 2.2.0 - '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 25.0.10 + '@types/node': 25.5.0 '@types/hast@3.0.4': dependencies: @@ -6935,15 +7208,13 @@ snapshots: '@types/http-cache-semantics@4.0.4': {} - '@types/http-errors@2.0.5': {} - '@types/js-yaml@3.12.10': {} '@types/js-yaml@4.0.9': {} '@types/jsonfile@6.1.4': dependencies: - '@types/node': 25.0.10 + '@types/node': 25.5.0 '@types/linkify-it@5.0.0': {} @@ -6966,50 +7237,39 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 25.0.10 + '@types/node': 25.5.0 '@types/node-forge@1.3.14': dependencies: - '@types/node': 25.0.10 + '@types/node': 25.5.0 + + '@types/node@16.9.1': {} '@types/node@22.19.7': dependencies: undici-types: 6.21.0 - '@types/node@25.0.10': + '@types/node@25.5.0': dependencies: - undici-types: 7.16.0 + undici-types: 7.18.2 '@types/ping@0.4.4': {} - '@types/qs@6.14.0': {} - '@types/randomatic@3.1.5': {} - '@types/range-parser@1.2.7': {} - '@types/relateurl@0.2.33': {} '@types/semver@7.7.1': {} - '@types/send@1.2.1': - dependencies: - '@types/node': 25.0.10 - - '@types/serve-static@2.2.0': - dependencies: - '@types/http-errors': 2.0.5 - '@types/node': 25.0.10 - '@types/symbol-tree@3.2.5': {} '@types/tar-stream@3.1.4': dependencies: - '@types/node': 25.0.10 + '@types/node': 25.5.0 '@types/through2@2.0.41': dependencies: - '@types/node': 25.0.10 + '@types/node': 25.5.0 '@types/trusted-types@2.0.7': {} @@ -7039,26 +7299,18 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 25.0.10 + '@types/node': 25.5.0 '@types/yauzl@2.10.3': dependencies: - '@types/node': 25.0.10 + '@types/node': 25.5.0 optional: true '@ungap/structured-clone@1.3.0': {} - '@yr/monotone-cubic-spline@1.0.3': {} - - accepts@1.3.8: + abort-controller@3.0.0: dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - accepts@2.0.0: - dependencies: - mime-types: 3.0.2 - negotiator: 1.0.0 + event-target-shim: 5.0.1 acme-client@5.4.0: dependencies: @@ -7092,14 +7344,9 @@ snapshots: ansi-styles@6.2.3: {} - apexcharts@5.3.6: - dependencies: - '@svgdotjs/svg.draggable.js': 3.0.6(@svgdotjs/svg.js@3.2.5) - '@svgdotjs/svg.filter.js': 3.0.9 - '@svgdotjs/svg.js': 3.2.5 - '@svgdotjs/svg.resize.js': 2.0.5(@svgdotjs/svg.js@3.2.5)(@svgdotjs/svg.select.js@4.0.3(@svgdotjs/svg.js@3.2.5)) - '@svgdotjs/svg.select.js': 4.0.3(@svgdotjs/svg.js@3.2.5) - '@yr/monotone-cubic-spline': 1.0.3 + any-base@1.1.0: {} + + apexcharts@5.10.4: {} argparse@1.0.10: dependencies: @@ -7123,6 +7370,8 @@ snapshots: asynckit@0.4.0: {} + await-to-js@3.0.0: {} + axios@1.13.2(debug@4.4.3): dependencies: follow-redirects: 1.15.11(debug@4.4.3) @@ -7137,6 +7386,8 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + bare-events@2.8.2: {} bare-fs@4.5.3: @@ -7176,25 +7427,11 @@ snapshots: base64-js@1.5.1: {} - base64id@2.0.0: {} - basic-ftp@5.1.0: {} - bn.js@4.12.2: {} + bmp-ts@1.0.9: {} - body-parser@2.2.2: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 4.4.3 - http-errors: 2.0.1 - iconv-lite: 0.7.2 - on-finished: 2.4.1 - qs: 6.14.1 - raw-body: 3.0.2 - type-is: 2.0.1 - transitivePeerDependencies: - - supports-color + bn.js@4.12.2: {} bowser@2.13.1: {} @@ -7207,6 +7444,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.4: + dependencies: + balanced-match: 4.0.4 + broadcast-channel@7.3.0: dependencies: '@babel/runtime': 7.28.6 @@ -7229,8 +7470,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bytes@3.1.2: {} - cacheable-lookup@7.0.0: {} cacheable-request@10.2.14: @@ -7326,19 +7565,6 @@ snapshots: ini: 1.3.8 proto-list: 1.2.4 - content-disposition@1.0.1: {} - - content-type@1.0.5: {} - - cookie-signature@1.2.2: {} - - cookie@0.7.2: {} - - cors@2.8.6: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - cosmiconfig@9.0.0(typescript@5.9.3): dependencies: env-paths: 2.2.1 @@ -7350,6 +7576,8 @@ snapshots: crelt@1.0.6: {} + croner@10.0.1: {} + croner@9.1.0: {} cross-spawn@7.0.6: @@ -7368,10 +7596,6 @@ snapshots: dayjs@1.11.19: {} - debug@4.3.7: - dependencies: - ms: 2.1.3 - debug@4.4.3: dependencies: ms: 2.1.3 @@ -7410,10 +7634,10 @@ snapshots: delayed-stream@1.0.0: {} - depd@2.0.0: {} - dequal@2.0.3: {} + detect-libc@2.1.2: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -7436,8 +7660,6 @@ snapshots: eastasianwidth@0.2.0: {} - ee-first@1.1.1: {} - elliptic@6.6.1: dependencies: bn.js: 4.12.2 @@ -7452,42 +7674,10 @@ snapshots: emoji-regex@9.2.2: {} - encodeurl@2.0.0: {} - end-of-stream@1.4.5: dependencies: once: 1.4.0 - engine.io-client@6.6.4: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.4.3 - engine.io-parser: 5.2.3 - ws: 8.18.3 - xmlhttprequest-ssl: 2.1.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - engine.io-parser@5.2.3: {} - - engine.io@6.6.4: - dependencies: - '@types/cors': 2.8.19 - '@types/node': 25.0.10 - accepts: 1.3.8 - base64id: 2.0.0 - cookie: 0.7.2 - cors: 2.8.6 - debug: 4.3.7 - engine.io-parser: 5.2.3 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - entities@4.5.0: {} env-paths@2.2.1: {} @@ -7542,8 +7732,6 @@ snapshots: escalade@3.2.0: {} - escape-html@1.0.3: {} - escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} @@ -7564,7 +7752,7 @@ snapshots: esutils@2.0.3: {} - etag@1.8.1: {} + event-target-shim@5.0.1: {} eventemitter3@4.0.7: {} @@ -7574,42 +7762,9 @@ snapshots: transitivePeerDependencies: - bare-abort-controller - express-force-ssl@0.3.2: - dependencies: - lodash.assign: 3.2.0 + events@3.3.0: {} - express@5.2.1: - dependencies: - accepts: 2.0.0 - body-parser: 2.2.2 - content-disposition: 1.0.1 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.2.2 - debug: 4.4.3 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.1 - fresh: 2.0.0 - http-errors: 2.0.1 - merge-descriptors: 2.0.0 - mime-types: 3.0.2 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.14.1 - range-parser: 1.2.1 - router: 2.2.0 - send: 1.2.1 - serve-static: 2.2.1 - statuses: 2.0.2 - type-is: 2.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color + exif-parser@0.1.12: {} extend@3.0.2: {} @@ -7639,16 +7794,21 @@ snapshots: fast-json-stable-stringify@2.1.0: {} + fast-xml-builder@1.1.3: + dependencies: + path-expression-matcher: 1.1.3 + fast-xml-parser@4.5.3: dependencies: strnum: 1.1.2 - fast-xml-parser@5.2.5: + fast-xml-parser@5.3.3: dependencies: strnum: 2.1.2 - fast-xml-parser@5.3.3: + fast-xml-parser@5.4.1: dependencies: + fast-xml-builder: 1.1.3 strnum: 2.1.2 fault@2.0.1: @@ -7665,6 +7825,12 @@ snapshots: dependencies: is-unicode-supported: 2.1.0 + file-type@16.5.4: + dependencies: + readable-web-to-node-stream: 3.0.4 + strtok3: 6.3.0 + token-types: 4.2.1 + file-type@19.6.0: dependencies: get-stream: 9.0.1 @@ -7681,17 +7847,6 @@ snapshots: transitivePeerDependencies: - supports-color - finalhandler@2.1.1: - dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - find-cache-dir@3.3.2: dependencies: commondir: 1.0.1 @@ -7729,10 +7884,6 @@ snapshots: format@0.2.2: {} - forwarded@0.2.0: {} - - fresh@2.0.0: {} - fs-extra@11.3.3: dependencies: graceful-fs: 4.2.11 @@ -7789,6 +7940,11 @@ snapshots: transitivePeerDependencies: - supports-color + gifwrap@0.10.1: + dependencies: + image-q: 4.0.0 + omggif: 1.0.10 + glob@11.1.0: dependencies: foreground-child: 3.3.1 @@ -7900,14 +8056,6 @@ snapshots: http-cache-semantics@4.2.0: {} - http-errors@2.0.1: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.2 - toidentifier: 1.0.1 - http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 @@ -7937,12 +8085,12 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.7.2: - dependencies: - safer-buffer: 2.1.2 - ieee754@1.2.1: {} + image-q@4.0.0: + dependencies: + '@types/node': 16.9.1 + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -7970,8 +8118,6 @@ snapshots: ip-address@10.1.0: {} - ipaddr.js@1.9.1: {} - is-arrayish@0.2.1: {} is-docker@2.2.1: {} @@ -7989,8 +8135,6 @@ snapshots: is-plain-obj@4.1.0: {} - is-promise@4.0.0: {} - is-stream@4.0.1: {} is-unicode-supported@2.1.0: {} @@ -8005,12 +8149,46 @@ snapshots: isexe@3.1.1: {} + isexe@4.0.0: {} + isopen@1.3.0: {} jackspeak@4.1.1: dependencies: '@isaacs/cliui': 8.0.2 + jimp@1.6.0: + dependencies: + '@jimp/core': 1.6.0 + '@jimp/diff': 1.6.0 + '@jimp/js-bmp': 1.6.0 + '@jimp/js-gif': 1.6.0 + '@jimp/js-jpeg': 1.6.0 + '@jimp/js-png': 1.6.0 + '@jimp/js-tiff': 1.6.0 + '@jimp/plugin-blit': 1.6.0 + '@jimp/plugin-blur': 1.6.0 + '@jimp/plugin-circle': 1.6.0 + '@jimp/plugin-color': 1.6.0 + '@jimp/plugin-contain': 1.6.0 + '@jimp/plugin-cover': 1.6.0 + '@jimp/plugin-crop': 1.6.0 + '@jimp/plugin-displace': 1.6.0 + '@jimp/plugin-dither': 1.6.0 + '@jimp/plugin-fisheye': 1.6.0 + '@jimp/plugin-flip': 1.6.0 + '@jimp/plugin-hash': 1.6.0 + '@jimp/plugin-mask': 1.6.0 + '@jimp/plugin-print': 1.6.0 + '@jimp/plugin-quantize': 1.6.0 + '@jimp/plugin-resize': 1.6.0 + '@jimp/plugin-rotate': 1.6.0 + '@jimp/plugin-threshold': 1.6.0 + '@jimp/types': 1.6.0 + '@jimp/utils': 1.6.0 + + jpeg-js@0.4.4: {} + js-base64@3.7.8: {} js-tokens@4.0.0: {} @@ -8068,45 +8246,8 @@ snapshots: dependencies: p-locate: 4.1.0 - lodash._baseassign@3.2.0: - dependencies: - lodash._basecopy: 3.0.1 - lodash.keys: 3.1.2 - - lodash._basecopy@3.0.1: {} - - lodash._bindcallback@3.0.1: {} - - lodash._createassigner@3.1.1: - dependencies: - lodash._bindcallback: 3.0.1 - lodash._isiterateecall: 3.0.9 - lodash.restparam: 3.6.1 - - lodash._getnative@3.9.1: {} - - lodash._isiterateecall@3.0.9: {} - - lodash.assign@3.2.0: - dependencies: - lodash._baseassign: 3.2.0 - lodash._createassigner: 3.1.1 - lodash.keys: 3.1.2 - lodash.clonedeep@4.5.0: {} - lodash.isarguments@3.1.0: {} - - lodash.isarray@3.0.4: {} - - lodash.keys@3.1.2: - dependencies: - lodash._getnative: 3.9.1 - lodash.isarguments: 3.1.0 - lodash.isarray: 3.0.4 - - lodash.restparam@3.6.1: {} - longest-streak@3.1.0: {} lower-case@1.1.4: {} @@ -8117,7 +8258,7 @@ snapshots: lru-cache@7.18.3: {} - lucide@0.563.0: {} + lucide@0.577.0: {} make-dir@3.1.0: dependencies: @@ -8277,12 +8418,8 @@ snapshots: mdurl@2.0.0: {} - media-typer@1.1.0: {} - memory-pager@1.5.0: {} - merge-descriptors@2.0.0: {} - micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.3.0 @@ -8483,15 +8620,11 @@ snapshots: mime-db@1.52.0: {} - mime-db@1.54.0: {} - mime-types@2.1.35: dependencies: mime-db: 1.52.0 - mime-types@3.0.2: - dependencies: - mime-db: 1.54.0 + mime@3.0.0: {} mime@4.1.0: {} @@ -8499,6 +8632,8 @@ snapshots: mimic-response@4.0.0: {} + mingo@7.2.0: {} + minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} @@ -8507,6 +8642,10 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.0 + minimatch@10.2.4: + dependencies: + brace-expansion: 5.0.4 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -8586,7 +8725,7 @@ snapshots: optionalDependencies: socks: 2.8.7 - mongodb@7.0.0(socks@2.8.7): + mongodb@7.1.0(socks@2.8.7): dependencies: '@mongodb-js/saslprep': 1.4.5 bson: 7.1.1 @@ -8600,10 +8739,6 @@ snapshots: nanoid@4.0.2: {} - negotiator@0.6.3: {} - - negotiator@1.0.0: {} - netmask@2.0.2: {} new-find-package-json@2.0.0: @@ -8624,8 +8759,6 @@ snapshots: normalize-url@8.1.1: {} - object-assign@4.1.1: {} - object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -8634,9 +8767,7 @@ snapshots: observable-fns@0.6.1: {} - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 + omggif@1.0.10: {} once@1.4.0: dependencies: @@ -8712,6 +8843,15 @@ snapshots: dependencies: callsites: 3.1.0 + parse-bmfont-ascii@1.0.6: {} + + parse-bmfont-binary@1.0.6: {} + + parse-bmfont-xml@1.1.6: + dependencies: + xml-parse-from-string: 1.0.1 + xml2js: 0.5.0 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.28.6 @@ -8721,10 +8861,10 @@ snapshots: parse-ms@4.0.0: {} - parseurl@1.3.3: {} - path-exists@4.0.0: {} + path-expression-matcher@1.1.3: {} + path-is-absolute@1.0.1: {} path-key@3.1.1: {} @@ -8743,12 +8883,14 @@ snapshots: pako: 1.0.11 tslib: 1.14.1 - pdf2json@3.2.0: {} + pdf2json@4.0.2: {} pdfjs-dist@4.10.38: optionalDependencies: '@napi-rs/canvas': 0.1.89 + peek-readable@4.1.0: {} + peek-readable@5.4.2: {} pend@1.2.0: {} @@ -8759,14 +8901,24 @@ snapshots: ping@0.4.4: {} + pixelmatch@5.3.0: + dependencies: + pngjs: 6.0.0 + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 + pngjs@6.0.0: {} + + pngjs@7.0.0: {} + pretty-ms@9.3.0: dependencies: parse-ms: 4.0.0 + process@0.11.10: {} + progress@2.0.3: {} property-information@7.1.0: {} @@ -8876,11 +9028,6 @@ snapshots: proto-list@1.2.4: {} - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - proxy-agent@6.5.0: dependencies: agent-base: 7.1.4 @@ -8959,15 +9106,6 @@ snapshots: kind-of: 6.0.3 math-random: 1.0.4 - range-parser@1.2.1: {} - - raw-body@3.0.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.7.2 - unpipe: 1.0.0 - rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -8981,6 +9119,18 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readable-web-to-node-stream@3.0.4: + dependencies: + readable-stream: 4.7.0 + readdirp@5.0.0: {} reflect-metadata@0.2.2: {} @@ -9078,16 +9228,6 @@ snapshots: rope-sequence@1.3.4: {} - router@2.2.0: - dependencies: - debug: 4.4.3 - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.3.0 - transitivePeerDependencies: - - supports-color - run-async@3.0.0: {} rxjs@7.8.2: @@ -9098,35 +9238,12 @@ snapshots: safer-buffer@2.1.2: {} + sax@1.5.0: {} + semver@6.3.1: {} semver@7.7.3: {} - send@1.2.1: - dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.1 - mime-types: 3.0.2 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - serve-static@2.2.1: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.1 - transitivePeerDependencies: - - supports-color - set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -9136,7 +9253,36 @@ snapshots: gopd: 1.2.0 has-property-descriptors: 1.0.2 - setprototypeof@1.2.0: {} + sharp@0.34.5: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.7.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 shebang-command@2.0.0: dependencies: @@ -9176,49 +9322,10 @@ snapshots: signal-exit@4.1.0: {} + simple-xml-to-json@1.2.3: {} + smart-buffer@4.2.0: {} - socket.io-adapter@2.5.6: - dependencies: - debug: 4.4.3 - ws: 8.18.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - socket.io-client@4.8.1: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.7 - engine.io-client: 6.6.4 - socket.io-parser: 4.2.5 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - socket.io-parser@4.2.5: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - socket.io@4.8.1: - dependencies: - accepts: 1.3.8 - base64id: 2.0.0 - cors: 2.8.6 - debug: 4.3.7 - engine.io: 6.6.4 - socket.io-adapter: 2.5.6 - socket.io-parser: 4.2.5 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.4 @@ -9251,8 +9358,6 @@ snapshots: sprintf-js@1.0.3: {} - statuses@2.0.2: {} - streamx@2.23.0: dependencies: events-universal: 1.0.1 @@ -9303,6 +9408,11 @@ snapshots: dependencies: '@tokenizer/token': 0.3.0 + strtok3@6.3.0: + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 4.1.0 + strtok3@9.1.1: dependencies: '@tokenizer/token': 0.3.0 @@ -9314,6 +9424,8 @@ snapshots: systeminformation@5.30.5: {} + tagged-tag@1.0.0: {} + tar-fs@3.1.1: dependencies: pump: 3.0.3 @@ -9360,11 +9472,16 @@ snapshots: dependencies: esm: 3.2.25 + tinycolor2@1.6.0: {} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - toidentifier@1.0.1: {} + token-types@4.2.1: + dependencies: + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 token-types@6.1.2: dependencies: @@ -9409,11 +9526,9 @@ snapshots: type-fest@4.41.0: {} - type-is@2.0.1: + type-fest@5.4.4: dependencies: - content-type: 1.0.5 - media-typer: 1.1.0 - mime-types: 3.0.2 + tagged-tag: 1.0.0 typed-query-selector@2.12.0: {} @@ -9427,7 +9542,7 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.16.0: {} + undici-types@7.18.2: {} unified@11.0.5: dependencies: @@ -9466,8 +9581,6 @@ snapshots: unload@2.4.1: {} - unpipe@1.0.0: {} - upper-case@1.1.3: {} url@0.11.4: @@ -9475,12 +9588,14 @@ snapshots: punycode: 1.4.1 qs: 6.14.1 + utif2@4.1.0: + dependencies: + pako: 1.0.11 + util-deprecate@1.0.2: {} uuid@9.0.1: {} - vary@1.1.2: {} - vfile-message@4.0.3: dependencies: '@types/unist': 3.0.3 @@ -9512,6 +9627,10 @@ snapshots: dependencies: isexe: 3.1.1 + which@6.0.1: + dependencies: + isexe: 4.0.0 + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -9532,13 +9651,16 @@ snapshots: wrappy@1.0.2: {} - ws@8.17.1: {} - - ws@8.18.3: {} - ws@8.19.0: {} - xmlhttprequest-ssl@2.1.2: {} + xml-parse-from-string@1.0.1: {} + + xml2js@0.5.0: + dependencies: + sax: 1.5.0 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} xterm-addon-fit@0.8.0(xterm@5.3.0): dependencies: diff --git a/readme.md b/readme.md index 5dfd47b..a750b29 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,6 @@ # @git.zone/tsview -A powerful developer tool for browsing and managing S3-compatible storage and MongoDB databases through a sleek web UI — with real-time change streaming baked in. Built with TypeScript, designed for developers who need quick, visual access to their data stores. 🚀 +A powerful developer tool for browsing and managing S3-compatible storage and MongoDB databases through a sleek web UI — with real-time change streaming baked in. Built with TypeScript, designed for developers who need quick, visual access to their data stores. ## Issue Reporting and Security @@ -16,31 +16,34 @@ pnpm add -g @git.zone/tsview pnpm add @git.zone/tsview ``` -## Features ✨ +## Features -### 🗄️ S3 Storage Browser +### S3 Storage Browser + +Powered by the `dees-storage-browser` component from `@design.estate/dees-catalog`: - **Column View Navigation** — Mac Finder-style interface with resizable columns - **List View** — Traditional key-based view with hierarchical navigation - **Real-time Preview** — View images, JSON, text files, code, and more directly in the browser - **Bucket Management** — Create, delete, and switch between buckets -- **File Operations** — Upload, download, delete objects +- **File Operations** — Upload, download, delete, move, and copy objects - **In-place Text Editing** — Edit text files directly in the browser with change tracking - **Smart Content Type Detection** — Automatic recognition for 20+ file types - **Breadcrumb Navigation** — Clickable path traversal -### 🍃 MongoDB Browser +### MongoDB Browser - **Database Explorer** — Hierarchical navigation through databases and collections - **Database Overview** — Collection counts, data sizes, index stats at a glance - **Document Viewer** — Paginated table view with JSON filter support - **Document Editor** — Full CRUD with syntax-highlighted code editor and change tracking - **Index Management** — View, create, and drop indexes +- **Aggregation Pipeline** — Run aggregation queries directly - **Collection Stats** — Document counts, sizes, storage metrics - **Server Status** — Connection info, version, uptime - **Show/Hide System Databases** — Toggle visibility of `admin`, `local`, `config` -### ⚡ Real-Time Change Streaming +### Real-Time Change Streaming - **MongoDB Change Streams** — Live updates via native MongoDB change streams - **S3 Change Detection** — Polling-based bucket monitoring with ETag comparison (5s intervals) @@ -49,14 +52,14 @@ pnpm add @git.zone/tsview - **WebSocket Subscriptions** — Per-collection, per-bucket, or global activity feed - **Auto-Reconnect** — Subscriptions automatically restored after connection loss -### 🎨 Modern Web UI +### Modern Web UI -- 🌙 Dark theme designed for developer comfort -- 📱 Responsive layout with resizable panels -- ⌨️ Context menus for quick actions -- 🔌 Everything bundled — zero external runtime dependencies in the browser +- Dark theme designed for developer comfort +- Responsive layout with resizable panels +- Context menus for quick actions +- Everything bundled — zero external runtime dependencies in the browser -## Quick Start 🚀 +## Quick Start ### 1. Configure Your Connection @@ -80,7 +83,7 @@ Create a `.nogit/env.json` file in your project root: tsview ``` -That's it! 🎉 Your browser will automatically open to the viewer interface. +That's it! Your browser will automatically open to the viewer interface. ## CLI Usage @@ -206,15 +209,15 @@ Or use individual variables: tsview works with any S3-compatible storage: -| Provider | Status | -| ----------------------- | --------------------------- | -| **MinIO** | ✅ Perfect for local dev | -| **AWS S3** | ✅ Amazon's object storage | -| **DigitalOcean Spaces** | ✅ Simple object storage | -| **Backblaze B2** | ✅ S3-compatible API | -| **Cloudflare R2** | ✅ Zero egress fees | -| **Wasabi** | ✅ Hot cloud storage | -| **Self-hosted** | ✅ Any S3-compatible server | +| Provider | Status | +| ----------------------- | -------------------------- | +| **MinIO** | Perfect for local dev | +| **AWS S3** | Amazon's object storage | +| **DigitalOcean Spaces** | Simple object storage | +| **Backblaze B2** | S3-compatible API | +| **Cloudflare R2** | Zero egress fees | +| **Wasabi** | Hot cloud storage | +| **Self-hosted** | Any S3-compatible server | ## Supported File Types for Preview @@ -244,9 +247,10 @@ tsview/ ├── ts_web/ # Frontend │ ├── elements/ # Web components (LitElement) │ │ ├── tsview-app.ts # App shell + navigation -│ │ ├── tsview-s3-*.ts # S3 browser components │ │ ├── tsview-mongo-*.ts # MongoDB browser components │ │ └── tsview-activity-stream.ts # Real-time activity feed +│ ├── adapters/ # Data provider adapters +│ │ └── s3-data-provider.ts # IStorageDataProvider for dees-storage-browser │ ├── services/ # API + WebSocket clients │ ├── styles/ # Dark theme │ └── utilities/ # Formatting helpers @@ -257,7 +261,7 @@ tsview/ 1. **Backend** — A `TypedServer` serves the bundled web UI and exposes a typed API via `TypedRequest` over HTTP. A `TypedSocket` WebSocket layer handles real-time streaming subscriptions. -2. **Frontend** — LitElement-based web components communicate with the backend via `TypedRequest`. The `ChangeStreamService` connects over WebSocket and distributes real-time events to active views via RxJS Subjects. +2. **Frontend** — LitElement-based web components communicate with the backend via `TypedRequest`. The S3 browser uses `dees-storage-browser` from `@design.estate/dees-catalog` with a custom `IStorageDataProvider` adapter. The `ChangeStreamService` connects over WebSocket and distributes real-time events to active views via RxJS Subjects. 3. **Streaming** — The `ChangeStreamManager` creates MongoDB Change Streams and S3 BucketWatchers on demand (one per subscribed resource). Changes are pushed to subscribed clients and accumulated in a 1000-event ring buffer for the Activity Stream view. diff --git a/test/test.tsview.ts b/test/test.tsview.ts index 6343daf..6ed07f4 100644 --- a/test/test.tsview.ts +++ b/test/test.tsview.ts @@ -14,8 +14,8 @@ tap.test('should create TsView instance', async () => { tap.test('should have config methods', async () => { const viewer = new tsview.TsView(); - // Set S3 config - viewer.setS3Config({ + // Set storage config + viewer.setStorageConfig({ endpoint: 'localhost', port: 9000, accessKey: 'test', @@ -23,7 +23,7 @@ tap.test('should have config methods', async () => { useSsl: false, }); - expect(viewer.config.hasS3()).toBeTrue(); + expect(viewer.config.hasStorage()).toBeTrue(); expect(viewer.config.hasMongo()).toBeFalse(); // Set MongoDB config diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index c18f4e6..f13e83b 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@git.zone/tsview', - version: '1.12.0', + version: '1.12.1', description: 'A CLI tool for viewing S3 and MongoDB data with a web UI' } diff --git a/ts/api/handlers.s3.ts b/ts/api/handlers.s3.ts index f60d929..b12f58b 100644 --- a/ts/api/handlers.s3.ts +++ b/ts/api/handlers.s3.ts @@ -119,7 +119,7 @@ export async function registerS3Handlers( } } - const objects: interfaces.IS3Object[] = []; + const objects: interfaces.IStorageObject[] = []; const prefixSet = new Set(); // List files in current directory diff --git a/ts/bundled_ui.ts b/ts/bundled_ui.ts index 0918789..756daa9 100644 --- a/ts/bundled_ui.ts +++ b/ts/bundled_ui.ts @@ -2,7 +2,7 @@ export const files: { path: string; contentBase64: string }[] = [ { "path": "bundle.js", - "contentBase64": "dmFyIF9fY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTsKdmFyIF9fZnJlZXplID0gT2JqZWN0LmZyZWV6ZTsKdmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKdmFyIF9fZ2V0T3duUHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwp2YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lczsKdmFyIF9fZ2V0UHJvdG9PZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsKdmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CnZhciBfX2tub3duU3ltYm9sID0gKG5hbWUsIHN5bWJvbCkgPT4gKHN5bWJvbCA9IFN5bWJvbFtuYW1lXSkgPyBzeW1ib2wgOiAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcigiU3ltYm9sLiIgKyBuYW1lKTsKdmFyIF9fdHlwZUVycm9yID0gKG1zZykgPT4gewogIHRocm93IFR5cGVFcnJvcihtc2cpOwp9Owp2YXIgX19kZWZOb3JtYWxQcm9wID0gKG9iaiwga2V5MiwgdmFsdWUyKSA9PiBrZXkyIGluIG9iaiA/IF9fZGVmUHJvcChvYmosIGtleTIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlMiB9KSA6IG9ialtrZXkyXSA9IHZhbHVlMjsKdmFyIF9fbmFtZSA9ICh0YXJnZXQsIHZhbHVlMikgPT4gX19kZWZQcm9wKHRhcmdldCwgIm5hbWUiLCB7IHZhbHVlOiB2YWx1ZTIsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKdmFyIF9fcmVxdWlyZSA9IC8qIEBfX1BVUkVfXyAqLyAoKHgzKSA9PiB0eXBlb2YgcmVxdWlyZSAhPT0gInVuZGVmaW5lZCIgPyByZXF1aXJlIDogdHlwZW9mIFByb3h5ICE9PSAidW5kZWZpbmVkIiA/IG5ldyBQcm94eSh4MywgewogIGdldDogKGE1LCBiNSkgPT4gKHR5cGVvZiByZXF1aXJlICE9PSAidW5kZWZpbmVkIiA/IHJlcXVpcmUgOiBhNSlbYjVdCn0pIDogeDMpKGZ1bmN0aW9uKHgzKSB7CiAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAidW5kZWZpbmVkIikgcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB0aHJvdyBFcnJvcignRHluYW1pYyByZXF1aXJlIG9mICInICsgeDMgKyAnIiBpcyBub3Qgc3VwcG9ydGVkJyk7Cn0pOwp2YXIgX19lc20gPSAoZm4sIHJlcykgPT4gZnVuY3Rpb24gX19pbml0KCkgewogIHJldHVybiBmbiAmJiAocmVzID0gKDAsIGZuW19fZ2V0T3duUHJvcE5hbWVzKGZuKVswXV0pKGZuID0gMCkpLCByZXM7Cn07CnZhciBfX2NvbW1vbkpTID0gKGNiLCBtb2QpID0+IGZ1bmN0aW9uIF9fcmVxdWlyZTIoKSB7CiAgcmV0dXJuIG1vZCB8fCAoMCwgY2JbX19nZXRPd25Qcm9wTmFtZXMoY2IpWzBdXSkoKG1vZCA9IHsgZXhwb3J0czoge30gfSkuZXhwb3J0cywgbW9kKSwgbW9kLmV4cG9ydHM7Cn07CnZhciBfX2V4cG9ydCA9ICh0YXJnZXQsIGFsbDMpID0+IHsKICBmb3IgKHZhciBuYW1lIGluIGFsbDMpCiAgICBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7IGdldDogYWxsM1tuYW1lXSwgZW51bWVyYWJsZTogdHJ1ZSB9KTsKfTsKdmFyIF9fY29weVByb3BzID0gKHRvMiwgZnJvbTIsIGV4Y2VwdCwgZGVzYykgPT4gewogIGlmIChmcm9tMiAmJiB0eXBlb2YgZnJvbTIgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBmcm9tMiA9PT0gImZ1bmN0aW9uIikgewogICAgZm9yIChsZXQga2V5MiBvZiBfX2dldE93blByb3BOYW1lcyhmcm9tMikpCiAgICAgIGlmICghX19oYXNPd25Qcm9wLmNhbGwodG8yLCBrZXkyKSAmJiBrZXkyICE9PSBleGNlcHQpCiAgICAgICAgX19kZWZQcm9wKHRvMiwga2V5MiwgeyBnZXQ6ICgpID0+IGZyb20yW2tleTJdLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20yLCBrZXkyKSkgfHwgZGVzYy5lbnVtZXJhYmxlIH0pOwogIH0KICByZXR1cm4gdG8yOwp9Owp2YXIgX190b0VTTSA9IChtb2QsIGlzTm9kZU1vZGUsIHRhcmdldCkgPT4gKHRhcmdldCA9IG1vZCAhPSBudWxsID8gX19jcmVhdGUoX19nZXRQcm90b09mKG1vZCkpIDoge30sIF9fY29weVByb3BzKAogIC8vIElmIHRoZSBpbXBvcnRlciBpcyBpbiBub2RlIGNvbXBhdGliaWxpdHkgbW9kZSBvciB0aGlzIGlzIG5vdCBhbiBFU00KICAvLyBmaWxlIHRoYXQgaGFzIGJlZW4gY29udmVydGVkIHRvIGEgQ29tbW9uSlMgZmlsZSB1c2luZyBhIEJhYmVsLQogIC8vIGNvbXBhdGlibGUgdHJhbnNmb3JtIChpLmUuICJfX2VzTW9kdWxlIiBoYXMgbm90IGJlZW4gc2V0KSwgdGhlbiBzZXQKICAvLyAiZGVmYXVsdCIgdG8gdGhlIENvbW1vbkpTICJtb2R1bGUuZXhwb3J0cyIgZm9yIG5vZGUgY29tcGF0aWJpbGl0eS4KICBpc05vZGVNb2RlIHx8ICFtb2QgfHwgIW1vZC5fX2VzTW9kdWxlID8gX19kZWZQcm9wKHRhcmdldCwgImRlZmF1bHQiLCB7IHZhbHVlOiBtb2QsIGVudW1lcmFibGU6IHRydWUgfSkgOiB0YXJnZXQsCiAgbW9kCikpOwp2YXIgX19kZWNvcmF0b3JTdGFydCA9IChiYXNlKSA9PiBbLCAsICwgX19jcmVhdGUoYmFzZT8uW19fa25vd25TeW1ib2woIm1ldGFkYXRhIildID8/IG51bGwpXTsKdmFyIF9fZGVjb3JhdG9yU3RyaW5ncyA9IFsiY2xhc3MiLCAibWV0aG9kIiwgImdldHRlciIsICJzZXR0ZXIiLCAiYWNjZXNzb3IiLCAiZmllbGQiLCAidmFsdWUiLCAiZ2V0IiwgInNldCJdOwp2YXIgX19leHBlY3RGbiA9IChmbikgPT4gZm4gIT09IHZvaWQgMCAmJiB0eXBlb2YgZm4gIT09ICJmdW5jdGlvbiIgPyBfX3R5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKSA6IGZuOwp2YXIgX19kZWNvcmF0b3JDb250ZXh0ID0gKGtpbmQsIG5hbWUsIGRvbmUsIG1ldGFkYXRhLCBmbnMpID0+ICh7IGtpbmQ6IF9fZGVjb3JhdG9yU3RyaW5nc1traW5kXSwgbmFtZSwgbWV0YWRhdGEsIGFkZEluaXRpYWxpemVyOiAoZm4pID0+IGRvbmUuXyA/IF9fdHlwZUVycm9yKCJBbHJlYWR5IGluaXRpYWxpemVkIikgOiBmbnMucHVzaChfX2V4cGVjdEZuKGZuIHx8IG51bGwpKSB9KTsKdmFyIF9fZGVjb3JhdG9yTWV0YWRhdGEgPSAoYXJyYXksIHRhcmdldCkgPT4gX19kZWZOb3JtYWxQcm9wKHRhcmdldCwgX19rbm93blN5bWJvbCgibWV0YWRhdGEiKSwgYXJyYXlbM10pOwp2YXIgX19ydW5Jbml0aWFsaXplcnMgPSAoYXJyYXksIGZsYWdzLCBzZWxmMiwgdmFsdWUyKSA9PiB7CiAgZm9yICh2YXIgaTExID0gMCwgZm5zID0gYXJyYXlbZmxhZ3MgPj4gMV0sIG4xMyA9IGZucyAmJiBmbnMubGVuZ3RoOyBpMTEgPCBuMTM7IGkxMSsrKSBmbGFncyAmIDEgPyBmbnNbaTExXS5jYWxsKHNlbGYyKSA6IHZhbHVlMiA9IGZuc1tpMTFdLmNhbGwoc2VsZjIsIHZhbHVlMik7CiAgcmV0dXJuIHZhbHVlMjsKfTsKdmFyIF9fZGVjb3JhdGVFbGVtZW50ID0gKGFycmF5LCBmbGFncywgbmFtZSwgZGVjb3JhdG9ycywgdGFyZ2V0LCBleHRyYSkgPT4gewogIHZhciBmbiwgaXQsIGRvbmUsIGN0eCwgYWNjZXNzLCBrNCA9IGZsYWdzICYgNywgczkgPSAhIShmbGFncyAmIDgpLCBwNyA9ICEhKGZsYWdzICYgMTYpOwogIHZhciBqNCA9IGs0ID4gMyA/IGFycmF5Lmxlbmd0aCArIDEgOiBrNCA/IHM5ID8gMSA6IDIgOiAwLCBrZXkyID0gX19kZWNvcmF0b3JTdHJpbmdzW2s0ICsgNV07CiAgdmFyIGluaXRpYWxpemVycyA9IGs0ID4gMyAmJiAoYXJyYXlbajQgLSAxXSA9IFtdKSwgZXh0cmFJbml0aWFsaXplcnMgPSBhcnJheVtqNF0gfHwgKGFycmF5W2o0XSA9IFtdKTsKICB2YXIgZGVzYyA9IGs0ICYmICghcDcgJiYgIXM5ICYmICh0YXJnZXQgPSB0YXJnZXQucHJvdG90eXBlKSwgazQgPCA1ICYmIChrNCA+IDMgfHwgIXA3KSAmJiBfX2dldE93blByb3BEZXNjKGs0IDwgNCA/IHRhcmdldCA6IHsgZ2V0IFtuYW1lXSgpIHsKICAgIHJldHVybiBfX3ByaXZhdGVHZXQodGhpcywgZXh0cmEpOwogIH0sIHNldCBbbmFtZV0oeDMpIHsKICAgIHJldHVybiBfX3ByaXZhdGVTZXQodGhpcywgZXh0cmEsIHgzKTsKICB9IH0sIG5hbWUpKTsKICBrNCA/IHA3ICYmIGs0IDwgNCAmJiBfX25hbWUoZXh0cmEsIChrNCA+IDIgPyAic2V0ICIgOiBrNCA+IDEgPyAiZ2V0ICIgOiAiIikgKyBuYW1lKSA6IF9fbmFtZSh0YXJnZXQsIG5hbWUpOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICBjdHggPSBfX2RlY29yYXRvckNvbnRleHQoazQsIG5hbWUsIGRvbmUgPSB7fSwgYXJyYXlbM10sIGV4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIGlmIChrNCkgewogICAgICBjdHguc3RhdGljID0gczksIGN0eC5wcml2YXRlID0gcDcsIGFjY2VzcyA9IGN0eC5hY2Nlc3MgPSB7IGhhczogcDcgPyAoeDMpID0+IF9fcHJpdmF0ZUluKHRhcmdldCwgeDMpIDogKHgzKSA9PiBuYW1lIGluIHgzIH07CiAgICAgIGlmIChrNCBeIDMpIGFjY2Vzcy5nZXQgPSBwNyA/ICh4MykgPT4gKGs0IF4gMSA/IF9fcHJpdmF0ZUdldCA6IF9fcHJpdmF0ZU1ldGhvZCkoeDMsIHRhcmdldCwgazQgXiA0ID8gZXh0cmEgOiBkZXNjLmdldCkgOiAoeDMpID0+IHgzW25hbWVdOwogICAgICBpZiAoazQgPiAyKSBhY2Nlc3Muc2V0ID0gcDcgPyAoeDMsIHk1KSA9PiBfX3ByaXZhdGVTZXQoeDMsIHRhcmdldCwgeTUsIGs0IF4gNCA/IGV4dHJhIDogZGVzYy5zZXQpIDogKHgzLCB5NSkgPT4geDNbbmFtZV0gPSB5NTsKICAgIH0KICAgIGl0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoazQgPyBrNCA8IDQgPyBwNyA/IGV4dHJhIDogZGVzY1trZXkyXSA6IGs0ID4gNCA/IHZvaWQgMCA6IHsgZ2V0OiBkZXNjLmdldCwgc2V0OiBkZXNjLnNldCB9IDogdGFyZ2V0LCBjdHgpLCBkb25lLl8gPSAxOwogICAgaWYgKGs0IF4gNCB8fCBpdCA9PT0gdm9pZCAwKSBfX2V4cGVjdEZuKGl0KSAmJiAoazQgPiA0ID8gaW5pdGlhbGl6ZXJzLnVuc2hpZnQoaXQpIDogazQgPyBwNyA/IGV4dHJhID0gaXQgOiBkZXNjW2tleTJdID0gaXQgOiB0YXJnZXQgPSBpdCk7CiAgICBlbHNlIGlmICh0eXBlb2YgaXQgIT09ICJvYmplY3QiIHx8IGl0ID09PSBudWxsKSBfX3R5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICBlbHNlIF9fZXhwZWN0Rm4oZm4gPSBpdC5nZXQpICYmIChkZXNjLmdldCA9IGZuKSwgX19leHBlY3RGbihmbiA9IGl0LnNldCkgJiYgKGRlc2Muc2V0ID0gZm4pLCBfX2V4cGVjdEZuKGZuID0gaXQuaW5pdCkgJiYgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoZm4pOwogIH0KICByZXR1cm4gazQgfHwgX19kZWNvcmF0b3JNZXRhZGF0YShhcnJheSwgdGFyZ2V0KSwgZGVzYyAmJiBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCBkZXNjKSwgcDcgPyBrNCBeIDQgPyBleHRyYSA6IGRlc2MgOiB0YXJnZXQ7Cn07CnZhciBfX3B1YmxpY0ZpZWxkID0gKG9iaiwga2V5MiwgdmFsdWUyKSA9PiBfX2RlZk5vcm1hbFByb3Aob2JqLCB0eXBlb2Yga2V5MiAhPT0gInN5bWJvbCIgPyBrZXkyICsgIiIgOiBrZXkyLCB2YWx1ZTIpOwp2YXIgX19hY2Nlc3NDaGVjayA9IChvYmosIG1lbWJlciwgbXNnKSA9PiBtZW1iZXIuaGFzKG9iaikgfHwgX190eXBlRXJyb3IoIkNhbm5vdCAiICsgbXNnKTsKdmFyIF9fcHJpdmF0ZUluID0gKG1lbWJlciwgb2JqKSA9PiBPYmplY3Qob2JqKSAhPT0gb2JqID8gX190eXBlRXJyb3IoJ0Nhbm5vdCB1c2UgdGhlICJpbiIgb3BlcmF0b3Igb24gdGhpcyB2YWx1ZScpIDogbWVtYmVyLmhhcyhvYmopOwp2YXIgX19wcml2YXRlR2V0ID0gKG9iaiwgbWVtYmVyLCBnZXR0ZXIpID0+IChfX2FjY2Vzc0NoZWNrKG9iaiwgbWVtYmVyLCAicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSwgZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IG1lbWJlci5nZXQob2JqKSk7CnZhciBfX3ByaXZhdGVBZGQgPSAob2JqLCBtZW1iZXIsIHZhbHVlMikgPT4gbWVtYmVyLmhhcyhvYmopID8gX190eXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKSA6IG1lbWJlciBpbnN0YW5jZW9mIFdlYWtTZXQgPyBtZW1iZXIuYWRkKG9iaikgOiBtZW1iZXIuc2V0KG9iaiwgdmFsdWUyKTsKdmFyIF9fcHJpdmF0ZVNldCA9IChvYmosIG1lbWJlciwgdmFsdWUyLCBzZXR0ZXIpID0+IChfX2FjY2Vzc0NoZWNrKG9iaiwgbWVtYmVyLCAid3JpdGUgdG8gcHJpdmF0ZSBmaWVsZCIpLCBzZXR0ZXIgPyBzZXR0ZXIuY2FsbChvYmosIHZhbHVlMikgOiBtZW1iZXIuc2V0KG9iaiwgdmFsdWUyKSwgdmFsdWUyKTsKdmFyIF9fcHJpdmF0ZU1ldGhvZCA9IChvYmosIG1lbWJlciwgbWV0aG9kKSA9PiAoX19hY2Nlc3NDaGVjayhvYmosIG1lbWJlciwgImFjY2VzcyBwcml2YXRlIG1ldGhvZCIpLCBtZXRob2QpOwp2YXIgX190ZW1wbGF0ZSA9IChjb29rZWQsIHJhdzIpID0+IF9fZnJlZXplKF9fZGVmUHJvcChjb29rZWQsICJyYXciLCB7IHZhbHVlOiBfX2ZyZWV6ZShyYXcyIHx8IGNvb2tlZC5zbGljZSgpKSB9KSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvY3NzLXRhZy5qcwp2YXIgdCwgZSwgcywgbywgbiwgciwgaSwgUywgYzsKdmFyIGluaXRfY3NzX3RhZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2Nzcy10YWcuanMiKCkgewogICAgdCA9IGdsb2JhbFRoaXMsIGUgPSB0LlNoYWRvd1Jvb3QgJiYgKHZvaWQgMCA9PT0gdC5TaGFkeUNTUyB8fCB0LlNoYWR5Q1NTLm5hdGl2ZVNoYWRvdykgJiYgImFkb3B0ZWRTdHlsZVNoZWV0cyIgaW4gRG9jdW1lbnQucHJvdG90eXBlICYmICJyZXBsYWNlIiBpbiBDU1NTdHlsZVNoZWV0LnByb3RvdHlwZSwgcyA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woKSwgbyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogICAgbiA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IodDksIGUxMSwgbzEzKSB7CiAgICAgICAgaWYgKHRoaXMuXyRjc3NSZXN1bHQkID0gdHJ1ZSwgbzEzICE9PSBzKSB0aHJvdyBFcnJvcigiQ1NTUmVzdWx0IGlzIG5vdCBjb25zdHJ1Y3RhYmxlLiBVc2UgYHVuc2FmZUNTU2Agb3IgYGNzc2AgaW5zdGVhZC4iKTsKICAgICAgICB0aGlzLmNzc1RleHQgPSB0OSwgdGhpcy50ID0gZTExOwogICAgICB9CiAgICAgIGdldCBzdHlsZVNoZWV0KCkgewogICAgICAgIGxldCB0OSA9IHRoaXMubzsKICAgICAgICBjb25zdCBzOSA9IHRoaXMudDsKICAgICAgICBpZiAoZSAmJiB2b2lkIDAgPT09IHQ5KSB7CiAgICAgICAgICBjb25zdCBlMTEgPSB2b2lkIDAgIT09IHM5ICYmIDEgPT09IHM5Lmxlbmd0aDsKICAgICAgICAgIGUxMSAmJiAodDkgPSBvLmdldChzOSkpLCB2b2lkIDAgPT09IHQ5ICYmICgodGhpcy5vID0gdDkgPSBuZXcgQ1NTU3R5bGVTaGVldCgpKS5yZXBsYWNlU3luYyh0aGlzLmNzc1RleHQpLCBlMTEgJiYgby5zZXQoczksIHQ5KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0OTsKICAgICAgfQogICAgICB0b1N0cmluZygpIHsKICAgICAgICByZXR1cm4gdGhpcy5jc3NUZXh0OwogICAgICB9CiAgICB9OwogICAgciA9ICh0OSkgPT4gbmV3IG4oInN0cmluZyIgPT0gdHlwZW9mIHQ5ID8gdDkgOiB0OSArICIiLCB2b2lkIDAsIHMpLCBpID0gKHQ5LCAuLi5lMTEpID0+IHsKICAgICAgY29uc3QgbzEzID0gMSA9PT0gdDkubGVuZ3RoID8gdDlbMF0gOiBlMTEucmVkdWNlKChlMTIsIHM5LCBvMTQpID0+IGUxMiArICgodDEwKSA9PiB7CiAgICAgICAgaWYgKHRydWUgPT09IHQxMC5fJGNzc1Jlc3VsdCQpIHJldHVybiB0MTAuY3NzVGV4dDsKICAgICAgICBpZiAoIm51bWJlciIgPT0gdHlwZW9mIHQxMCkgcmV0dXJuIHQxMDsKICAgICAgICB0aHJvdyBFcnJvcigiVmFsdWUgcGFzc2VkIHRvICdjc3MnIGZ1bmN0aW9uIG11c3QgYmUgYSAnY3NzJyBmdW5jdGlvbiByZXN1bHQ6ICIgKyB0MTAgKyAiLiBVc2UgJ3Vuc2FmZUNTUycgdG8gcGFzcyBub24tbGl0ZXJhbCB2YWx1ZXMsIGJ1dCB0YWtlIGNhcmUgdG8gZW5zdXJlIHBhZ2Ugc2VjdXJpdHkuIik7CiAgICAgIH0pKHM5KSArIHQ5W28xNCArIDFdLCB0OVswXSk7CiAgICAgIHJldHVybiBuZXcgbihvMTMsIHQ5LCBzKTsKICAgIH0sIFMgPSAoczksIG8xMykgPT4gewogICAgICBpZiAoZSkgczkuYWRvcHRlZFN0eWxlU2hlZXRzID0gbzEzLm1hcCgodDkpID0+IHQ5IGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldCA/IHQ5IDogdDkuc3R5bGVTaGVldCk7CiAgICAgIGVsc2UgZm9yIChjb25zdCBlMTEgb2YgbzEzKSB7CiAgICAgICAgY29uc3QgbzE0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSwgbjEzID0gdC5saXROb25jZTsKICAgICAgICB2b2lkIDAgIT09IG4xMyAmJiBvMTQuc2V0QXR0cmlidXRlKCJub25jZSIsIG4xMyksIG8xNC50ZXh0Q29udGVudCA9IGUxMS5jc3NUZXh0LCBzOS5hcHBlbmRDaGlsZChvMTQpOwogICAgICB9CiAgICB9LCBjID0gZSA/ICh0OSkgPT4gdDkgOiAodDkpID0+IHQ5IGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldCA/ICgodDEwKSA9PiB7CiAgICAgIGxldCBlMTEgPSAiIjsKICAgICAgZm9yIChjb25zdCBzOSBvZiB0MTAuY3NzUnVsZXMpIGUxMSArPSBzOS5jc3NUZXh0OwogICAgICByZXR1cm4gcihlMTEpOwogICAgfSkodDkpIDogdDk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9yZWFjdGl2ZS1lbGVtZW50LmpzCnZhciBpMiwgZTIsIGgsIHIyLCBvMiwgbjIsIGEsIGMyLCBsLCBwLCBkLCB1LCBmLCBiLCB5Owp2YXIgaW5pdF9yZWFjdGl2ZV9lbGVtZW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvcmVhY3RpdmUtZWxlbWVudC5qcyIoKSB7CiAgICBpbml0X2Nzc190YWcoKTsKICAgIGluaXRfY3NzX3RhZygpOwogICAgKHsgaXM6IGkyLCBkZWZpbmVQcm9wZXJ0eTogZTIsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogaCwgZ2V0T3duUHJvcGVydHlOYW1lczogcjIsIGdldE93blByb3BlcnR5U3ltYm9sczogbzIsIGdldFByb3RvdHlwZU9mOiBuMiB9ID0gT2JqZWN0KSwgYSA9IGdsb2JhbFRoaXMsIGMyID0gYS50cnVzdGVkVHlwZXMsIGwgPSBjMiA/IGMyLmVtcHR5U2NyaXB0IDogIiIsIHAgPSBhLnJlYWN0aXZlRWxlbWVudFBvbHlmaWxsU3VwcG9ydCwgZCA9ICh0OSwgczkpID0+IHQ5LCB1ID0geyB0b0F0dHJpYnV0ZSh0OSwgczkpIHsKICAgICAgc3dpdGNoIChzOSkgewogICAgICAgIGNhc2UgQm9vbGVhbjoKICAgICAgICAgIHQ5ID0gdDkgPyBsIDogbnVsbDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT2JqZWN0OgogICAgICAgIGNhc2UgQXJyYXk6CiAgICAgICAgICB0OSA9IG51bGwgPT0gdDkgPyB0OSA6IEpTT04uc3RyaW5naWZ5KHQ5KTsKICAgICAgfQogICAgICByZXR1cm4gdDk7CiAgICB9LCBmcm9tQXR0cmlidXRlKHQ5LCBzOSkgewogICAgICBsZXQgaTExID0gdDk7CiAgICAgIHN3aXRjaCAoczkpIHsKICAgICAgICBjYXNlIEJvb2xlYW46CiAgICAgICAgICBpMTEgPSBudWxsICE9PSB0OTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTnVtYmVyOgogICAgICAgICAgaTExID0gbnVsbCA9PT0gdDkgPyBudWxsIDogTnVtYmVyKHQ5KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT2JqZWN0OgogICAgICAgIGNhc2UgQXJyYXk6CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBpMTEgPSBKU09OLnBhcnNlKHQ5KTsKICAgICAgICAgIH0gY2F0Y2ggKHQxMCkgewogICAgICAgICAgICBpMTEgPSBudWxsOwogICAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBpMTE7CiAgICB9IH0sIGYgPSAodDksIHM5KSA9PiAhaTIodDksIHM5KSwgYiA9IHsgYXR0cmlidXRlOiB0cnVlLCB0eXBlOiBTdHJpbmcsIGNvbnZlcnRlcjogdSwgcmVmbGVjdDogZmFsc2UsIHVzZURlZmF1bHQ6IGZhbHNlLCBoYXNDaGFuZ2VkOiBmIH07CiAgICBTeW1ib2wubWV0YWRhdGEgPz89IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woIm1ldGFkYXRhIiksIGEubGl0UHJvcGVydHlNZXRhZGF0YSA/Pz0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CiAgICB5ID0gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgICAgIHN0YXRpYyBhZGRJbml0aWFsaXplcih0OSkgewogICAgICAgIHRoaXMuXyRFaSgpLCAodGhpcy5sID8/PSBbXSkucHVzaCh0OSk7CiAgICAgIH0KICAgICAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUoKSwgdGhpcy5fJEVoICYmIFsuLi50aGlzLl8kRWgua2V5cygpXTsKICAgICAgfQogICAgICBzdGF0aWMgY3JlYXRlUHJvcGVydHkodDksIHM5ID0gYikgewogICAgICAgIGlmIChzOS5zdGF0ZSAmJiAoczkuYXR0cmlidXRlID0gZmFsc2UpLCB0aGlzLl8kRWkoKSwgdGhpcy5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkodDkpICYmICgoczkgPSBPYmplY3QuY3JlYXRlKHM5KSkud3JhcHBlZCA9IHRydWUpLCB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzLnNldCh0OSwgczkpLCAhczkubm9BY2Nlc3NvcikgewogICAgICAgICAgY29uc3QgaTExID0gLyogQF9fUFVSRV9fICovIFN5bWJvbCgpLCBoOSA9IHRoaXMuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHQ5LCBpMTEsIHM5KTsKICAgICAgICAgIHZvaWQgMCAhPT0gaDkgJiYgZTIodGhpcy5wcm90b3R5cGUsIHQ5LCBoOSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0YXRpYyBnZXRQcm9wZXJ0eURlc2NyaXB0b3IodDksIHM5LCBpMTEpIHsKICAgICAgICBjb25zdCB7IGdldDogZTExLCBzZXQ6IHIxMSB9ID0gaCh0aGlzLnByb3RvdHlwZSwgdDkpID8/IHsgZ2V0KCkgewogICAgICAgICAgcmV0dXJuIHRoaXNbczldOwogICAgICAgIH0sIHNldCh0MTApIHsKICAgICAgICAgIHRoaXNbczldID0gdDEwOwogICAgICAgIH0gfTsKICAgICAgICByZXR1cm4geyBnZXQ6IGUxMSwgc2V0KHMxMCkgewogICAgICAgICAgY29uc3QgaDkgPSBlMTE/LmNhbGwodGhpcyk7CiAgICAgICAgICByMTE/LmNhbGwodGhpcywgczEwKSwgdGhpcy5yZXF1ZXN0VXBkYXRlKHQ5LCBoOSwgaTExKTsKICAgICAgICB9LCBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUgfTsKICAgICAgfQogICAgICBzdGF0aWMgZ2V0UHJvcGVydHlPcHRpb25zKHQ5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFByb3BlcnRpZXMuZ2V0KHQ5KSA/PyBiOwogICAgICB9CiAgICAgIHN0YXRpYyBfJEVpKCkgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGQoImVsZW1lbnRQcm9wZXJ0aWVzIikpKSByZXR1cm47CiAgICAgICAgY29uc3QgdDkgPSBuMih0aGlzKTsKICAgICAgICB0OS5maW5hbGl6ZSgpLCB2b2lkIDAgIT09IHQ5LmwgJiYgKHRoaXMubCA9IFsuLi50OS5sXSksIHRoaXMuZWxlbWVudFByb3BlcnRpZXMgPSBuZXcgTWFwKHQ5LmVsZW1lbnRQcm9wZXJ0aWVzKTsKICAgICAgfQogICAgICBzdGF0aWMgZmluYWxpemUoKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZCgiZmluYWxpemVkIikpKSByZXR1cm47CiAgICAgICAgaWYgKHRoaXMuZmluYWxpemVkID0gdHJ1ZSwgdGhpcy5fJEVpKCksIHRoaXMuaGFzT3duUHJvcGVydHkoZCgicHJvcGVydGllcyIpKSkgewogICAgICAgICAgY29uc3QgdDEwID0gdGhpcy5wcm9wZXJ0aWVzLCBzOSA9IFsuLi5yMih0MTApLCAuLi5vMih0MTApXTsKICAgICAgICAgIGZvciAoY29uc3QgaTExIG9mIHM5KSB0aGlzLmNyZWF0ZVByb3BlcnR5KGkxMSwgdDEwW2kxMV0pOwogICAgICAgIH0KICAgICAgICBjb25zdCB0OSA9IHRoaXNbU3ltYm9sLm1ldGFkYXRhXTsKICAgICAgICBpZiAobnVsbCAhPT0gdDkpIHsKICAgICAgICAgIGNvbnN0IHM5ID0gbGl0UHJvcGVydHlNZXRhZGF0YS5nZXQodDkpOwogICAgICAgICAgaWYgKHZvaWQgMCAhPT0gczkpIGZvciAoY29uc3QgW3QxMCwgaTExXSBvZiBzOSkgdGhpcy5lbGVtZW50UHJvcGVydGllcy5zZXQodDEwLCBpMTEpOwogICAgICAgIH0KICAgICAgICB0aGlzLl8kRWggPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICAgIGZvciAoY29uc3QgW3QxMCwgczldIG9mIHRoaXMuZWxlbWVudFByb3BlcnRpZXMpIHsKICAgICAgICAgIGNvbnN0IGkxMSA9IHRoaXMuXyRFdSh0MTAsIHM5KTsKICAgICAgICAgIHZvaWQgMCAhPT0gaTExICYmIHRoaXMuXyRFaC5zZXQoaTExLCB0MTApOwogICAgICAgIH0KICAgICAgICB0aGlzLmVsZW1lbnRTdHlsZXMgPSB0aGlzLmZpbmFsaXplU3R5bGVzKHRoaXMuc3R5bGVzKTsKICAgICAgfQogICAgICBzdGF0aWMgZmluYWxpemVTdHlsZXMoczkpIHsKICAgICAgICBjb25zdCBpMTEgPSBbXTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzOSkpIHsKICAgICAgICAgIGNvbnN0IGUxMSA9IG5ldyBTZXQoczkuZmxhdCgxIC8gMCkucmV2ZXJzZSgpKTsKICAgICAgICAgIGZvciAoY29uc3QgczEwIG9mIGUxMSkgaTExLnVuc2hpZnQoYyhzMTApKTsKICAgICAgICB9IGVsc2Ugdm9pZCAwICE9PSBzOSAmJiBpMTEucHVzaChjKHM5KSk7CiAgICAgICAgcmV0dXJuIGkxMTsKICAgICAgfQogICAgICBzdGF0aWMgXyRFdSh0OSwgczkpIHsKICAgICAgICBjb25zdCBpMTEgPSBzOS5hdHRyaWJ1dGU7CiAgICAgICAgcmV0dXJuIGZhbHNlID09PSBpMTEgPyB2b2lkIDAgOiAic3RyaW5nIiA9PSB0eXBlb2YgaTExID8gaTExIDogInN0cmluZyIgPT0gdHlwZW9mIHQ5ID8gdDkudG9Mb3dlckNhc2UoKSA6IHZvaWQgMDsKICAgICAgfQogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpLCB0aGlzLl8kRXAgPSB2b2lkIDAsIHRoaXMuaXNVcGRhdGVQZW5kaW5nID0gZmFsc2UsIHRoaXMuaGFzVXBkYXRlZCA9IGZhbHNlLCB0aGlzLl8kRW0gPSBudWxsLCB0aGlzLl8kRXYoKTsKICAgICAgfQogICAgICBfJEV2KCkgewogICAgICAgIHRoaXMuXyRFUyA9IG5ldyBQcm9taXNlKCh0OSkgPT4gdGhpcy5lbmFibGVVcGRhdGluZyA9IHQ5KSwgdGhpcy5fJEFMID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgdGhpcy5fJEVfKCksIHRoaXMucmVxdWVzdFVwZGF0ZSgpLCB0aGlzLmNvbnN0cnVjdG9yLmw/LmZvckVhY2goKHQ5KSA9PiB0OSh0aGlzKSk7CiAgICAgIH0KICAgICAgYWRkQ29udHJvbGxlcih0OSkgewogICAgICAgICh0aGlzLl8kRU8gPz89IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpLmFkZCh0OSksIHZvaWQgMCAhPT0gdGhpcy5yZW5kZXJSb290ICYmIHRoaXMuaXNDb25uZWN0ZWQgJiYgdDkuaG9zdENvbm5lY3RlZD8uKCk7CiAgICAgIH0KICAgICAgcmVtb3ZlQ29udHJvbGxlcih0OSkgewogICAgICAgIHRoaXMuXyRFTz8uZGVsZXRlKHQ5KTsKICAgICAgfQogICAgICBfJEVfKCkgewogICAgICAgIGNvbnN0IHQ5ID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgczkgPSB0aGlzLmNvbnN0cnVjdG9yLmVsZW1lbnRQcm9wZXJ0aWVzOwogICAgICAgIGZvciAoY29uc3QgaTExIG9mIHM5LmtleXMoKSkgdGhpcy5oYXNPd25Qcm9wZXJ0eShpMTEpICYmICh0OS5zZXQoaTExLCB0aGlzW2kxMV0pLCBkZWxldGUgdGhpc1tpMTFdKTsKICAgICAgICB0OS5zaXplID4gMCAmJiAodGhpcy5fJEVwID0gdDkpOwogICAgICB9CiAgICAgIGNyZWF0ZVJlbmRlclJvb3QoKSB7CiAgICAgICAgY29uc3QgdDkgPSB0aGlzLnNoYWRvd1Jvb3QgPz8gdGhpcy5hdHRhY2hTaGFkb3codGhpcy5jb25zdHJ1Y3Rvci5zaGFkb3dSb290T3B0aW9ucyk7CiAgICAgICAgcmV0dXJuIFModDksIHRoaXMuY29uc3RydWN0b3IuZWxlbWVudFN0eWxlcyksIHQ5OwogICAgICB9CiAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHRoaXMucmVuZGVyUm9vdCA/Pz0gdGhpcy5jcmVhdGVSZW5kZXJSb290KCksIHRoaXMuZW5hYmxlVXBkYXRpbmcodHJ1ZSksIHRoaXMuXyRFTz8uZm9yRWFjaCgodDkpID0+IHQ5Lmhvc3RDb25uZWN0ZWQ/LigpKTsKICAgICAgfQogICAgICBlbmFibGVVcGRhdGluZyh0OSkgewogICAgICB9CiAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHRoaXMuXyRFTz8uZm9yRWFjaCgodDkpID0+IHQ5Lmhvc3REaXNjb25uZWN0ZWQ/LigpKTsKICAgICAgfQogICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodDksIHM5LCBpMTEpIHsKICAgICAgICB0aGlzLl8kQUsodDksIGkxMSk7CiAgICAgIH0KICAgICAgXyRFVCh0OSwgczkpIHsKICAgICAgICBjb25zdCBpMTEgPSB0aGlzLmNvbnN0cnVjdG9yLmVsZW1lbnRQcm9wZXJ0aWVzLmdldCh0OSksIGUxMSA9IHRoaXMuY29uc3RydWN0b3IuXyRFdSh0OSwgaTExKTsKICAgICAgICBpZiAodm9pZCAwICE9PSBlMTEgJiYgdHJ1ZSA9PT0gaTExLnJlZmxlY3QpIHsKICAgICAgICAgIGNvbnN0IGg5ID0gKHZvaWQgMCAhPT0gaTExLmNvbnZlcnRlcj8udG9BdHRyaWJ1dGUgPyBpMTEuY29udmVydGVyIDogdSkudG9BdHRyaWJ1dGUoczksIGkxMS50eXBlKTsKICAgICAgICAgIHRoaXMuXyRFbSA9IHQ5LCBudWxsID09IGg5ID8gdGhpcy5yZW1vdmVBdHRyaWJ1dGUoZTExKSA6IHRoaXMuc2V0QXR0cmlidXRlKGUxMSwgaDkpLCB0aGlzLl8kRW0gPSBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgICBfJEFLKHQ5LCBzOSkgewogICAgICAgIGNvbnN0IGkxMSA9IHRoaXMuY29uc3RydWN0b3IsIGUxMSA9IGkxMS5fJEVoLmdldCh0OSk7CiAgICAgICAgaWYgKHZvaWQgMCAhPT0gZTExICYmIHRoaXMuXyRFbSAhPT0gZTExKSB7CiAgICAgICAgICBjb25zdCB0MTAgPSBpMTEuZ2V0UHJvcGVydHlPcHRpb25zKGUxMSksIGg5ID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgdDEwLmNvbnZlcnRlciA/IHsgZnJvbUF0dHJpYnV0ZTogdDEwLmNvbnZlcnRlciB9IDogdm9pZCAwICE9PSB0MTAuY29udmVydGVyPy5mcm9tQXR0cmlidXRlID8gdDEwLmNvbnZlcnRlciA6IHU7CiAgICAgICAgICB0aGlzLl8kRW0gPSBlMTE7CiAgICAgICAgICBjb25zdCByMTEgPSBoOS5mcm9tQXR0cmlidXRlKHM5LCB0MTAudHlwZSk7CiAgICAgICAgICB0aGlzW2UxMV0gPSByMTEgPz8gdGhpcy5fJEVqPy5nZXQoZTExKSA/PyByMTEsIHRoaXMuXyRFbSA9IG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlcXVlc3RVcGRhdGUodDksIHM5LCBpMTEsIGUxMSA9IGZhbHNlLCBoOSkgewogICAgICAgIGlmICh2b2lkIDAgIT09IHQ5KSB7CiAgICAgICAgICBjb25zdCByMTEgPSB0aGlzLmNvbnN0cnVjdG9yOwogICAgICAgICAgaWYgKGZhbHNlID09PSBlMTEgJiYgKGg5ID0gdGhpc1t0OV0pLCBpMTEgPz89IHIxMS5nZXRQcm9wZXJ0eU9wdGlvbnModDkpLCAhKChpMTEuaGFzQ2hhbmdlZCA/PyBmKShoOSwgczkpIHx8IGkxMS51c2VEZWZhdWx0ICYmIGkxMS5yZWZsZWN0ICYmIGg5ID09PSB0aGlzLl8kRWo/LmdldCh0OSkgJiYgIXRoaXMuaGFzQXR0cmlidXRlKHIxMS5fJEV1KHQ5LCBpMTEpKSkpIHJldHVybjsKICAgICAgICAgIHRoaXMuQyh0OSwgczksIGkxMSk7CiAgICAgICAgfQogICAgICAgIGZhbHNlID09PSB0aGlzLmlzVXBkYXRlUGVuZGluZyAmJiAodGhpcy5fJEVTID0gdGhpcy5fJEVQKCkpOwogICAgICB9CiAgICAgIEModDksIHM5LCB7IHVzZURlZmF1bHQ6IGkxMSwgcmVmbGVjdDogZTExLCB3cmFwcGVkOiBoOSB9LCByMTEpIHsKICAgICAgICBpMTEgJiYgISh0aGlzLl8kRWogPz89IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkpLmhhcyh0OSkgJiYgKHRoaXMuXyRFai5zZXQodDksIHIxMSA/PyBzOSA/PyB0aGlzW3Q5XSksIHRydWUgIT09IGg5IHx8IHZvaWQgMCAhPT0gcjExKSB8fCAodGhpcy5fJEFMLmhhcyh0OSkgfHwgKHRoaXMuaGFzVXBkYXRlZCB8fCBpMTEgfHwgKHM5ID0gdm9pZCAwKSwgdGhpcy5fJEFMLnNldCh0OSwgczkpKSwgdHJ1ZSA9PT0gZTExICYmIHRoaXMuXyRFbSAhPT0gdDkgJiYgKHRoaXMuXyRFcSA/Pz0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSkuYWRkKHQ5KSk7CiAgICAgIH0KICAgICAgYXN5bmMgXyRFUCgpIHsKICAgICAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyA9IHRydWU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGF3YWl0IHRoaXMuXyRFUzsKICAgICAgICB9IGNhdGNoICh0MTApIHsKICAgICAgICAgIFByb21pc2UucmVqZWN0KHQxMCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHQ5ID0gdGhpcy5zY2hlZHVsZVVwZGF0ZSgpOwogICAgICAgIHJldHVybiBudWxsICE9IHQ5ICYmIGF3YWl0IHQ5LCAhdGhpcy5pc1VwZGF0ZVBlbmRpbmc7CiAgICAgIH0KICAgICAgc2NoZWR1bGVVcGRhdGUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucGVyZm9ybVVwZGF0ZSgpOwogICAgICB9CiAgICAgIHBlcmZvcm1VcGRhdGUoKSB7CiAgICAgICAgaWYgKCF0aGlzLmlzVXBkYXRlUGVuZGluZykgcmV0dXJuOwogICAgICAgIGlmICghdGhpcy5oYXNVcGRhdGVkKSB7CiAgICAgICAgICBpZiAodGhpcy5yZW5kZXJSb290ID8/PSB0aGlzLmNyZWF0ZVJlbmRlclJvb3QoKSwgdGhpcy5fJEVwKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgW3QxMSwgczEwXSBvZiB0aGlzLl8kRXApIHRoaXNbdDExXSA9IHMxMDsKICAgICAgICAgICAgdGhpcy5fJEVwID0gdm9pZCAwOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgdDEwID0gdGhpcy5jb25zdHJ1Y3Rvci5lbGVtZW50UHJvcGVydGllczsKICAgICAgICAgIGlmICh0MTAuc2l6ZSA+IDApIGZvciAoY29uc3QgW3MxMCwgaTExXSBvZiB0MTApIHsKICAgICAgICAgICAgY29uc3QgeyB3cmFwcGVkOiB0MTEgfSA9IGkxMSwgZTExID0gdGhpc1tzMTBdOwogICAgICAgICAgICB0cnVlICE9PSB0MTEgfHwgdGhpcy5fJEFMLmhhcyhzMTApIHx8IHZvaWQgMCA9PT0gZTExIHx8IHRoaXMuQyhzMTAsIHZvaWQgMCwgaTExLCBlMTEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgdDkgPSBmYWxzZTsKICAgICAgICBjb25zdCBzOSA9IHRoaXMuXyRBTDsKICAgICAgICB0cnkgewogICAgICAgICAgdDkgPSB0aGlzLnNob3VsZFVwZGF0ZShzOSksIHQ5ID8gKHRoaXMud2lsbFVwZGF0ZShzOSksIHRoaXMuXyRFTz8uZm9yRWFjaCgodDEwKSA9PiB0MTAuaG9zdFVwZGF0ZT8uKCkpLCB0aGlzLnVwZGF0ZShzOSkpIDogdGhpcy5fJEVNKCk7CiAgICAgICAgfSBjYXRjaCAoczEwKSB7CiAgICAgICAgICB0aHJvdyB0OSA9IGZhbHNlLCB0aGlzLl8kRU0oKSwgczEwOwogICAgICAgIH0KICAgICAgICB0OSAmJiB0aGlzLl8kQUUoczkpOwogICAgICB9CiAgICAgIHdpbGxVcGRhdGUodDkpIHsKICAgICAgfQogICAgICBfJEFFKHQ5KSB7CiAgICAgICAgdGhpcy5fJEVPPy5mb3JFYWNoKCh0MTApID0+IHQxMC5ob3N0VXBkYXRlZD8uKCkpLCB0aGlzLmhhc1VwZGF0ZWQgfHwgKHRoaXMuaGFzVXBkYXRlZCA9IHRydWUsIHRoaXMuZmlyc3RVcGRhdGVkKHQ5KSksIHRoaXMudXBkYXRlZCh0OSk7CiAgICAgIH0KICAgICAgXyRFTSgpIHsKICAgICAgICB0aGlzLl8kQUwgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCB0aGlzLmlzVXBkYXRlUGVuZGluZyA9IGZhbHNlOwogICAgICB9CiAgICAgIGdldCB1cGRhdGVDb21wbGV0ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRVcGRhdGVDb21wbGV0ZSgpOwogICAgICB9CiAgICAgIGdldFVwZGF0ZUNvbXBsZXRlKCkgewogICAgICAgIHJldHVybiB0aGlzLl8kRVM7CiAgICAgIH0KICAgICAgc2hvdWxkVXBkYXRlKHQ5KSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgdXBkYXRlKHQ5KSB7CiAgICAgICAgdGhpcy5fJEVxICYmPSB0aGlzLl8kRXEuZm9yRWFjaCgodDEwKSA9PiB0aGlzLl8kRVQodDEwLCB0aGlzW3QxMF0pKSwgdGhpcy5fJEVNKCk7CiAgICAgIH0KICAgICAgdXBkYXRlZCh0OSkgewogICAgICB9CiAgICAgIGZpcnN0VXBkYXRlZCh0OSkgewogICAgICB9CiAgICB9OwogICAgeS5lbGVtZW50U3R5bGVzID0gW10sIHkuc2hhZG93Um9vdE9wdGlvbnMgPSB7IG1vZGU6ICJvcGVuIiB9LCB5W2QoImVsZW1lbnRQcm9wZXJ0aWVzIildID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgeVtkKCJmaW5hbGl6ZWQiKV0gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBwPy4oeyBSZWFjdGl2ZUVsZW1lbnQ6IHkgfSksIChhLnJlYWN0aXZlRWxlbWVudFZlcnNpb25zID8/PSBbXSkucHVzaCgiMi4xLjIiKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9saXQtaHRtbC5qcwpmdW5jdGlvbiBWKHQ5LCBpMTEpIHsKICBpZiAoIXUyKHQ5KSB8fCAhdDkuaGFzT3duUHJvcGVydHkoInJhdyIpKSB0aHJvdyBFcnJvcigiaW52YWxpZCB0ZW1wbGF0ZSBzdHJpbmdzIGFycmF5Iik7CiAgcmV0dXJuIHZvaWQgMCAhPT0gZTMgPyBlMy5jcmVhdGVIVE1MKGkxMSkgOiBpMTE7Cn0KZnVuY3Rpb24gTSh0OSwgaTExLCBzOSA9IHQ5LCBlMTEpIHsKICBpZiAoaTExID09PSBFKSByZXR1cm4gaTExOwogIGxldCBoOSA9IHZvaWQgMCAhPT0gZTExID8gczkuXyRDbz8uW2UxMV0gOiBzOS5fJENsOwogIGNvbnN0IG8xMyA9IGEyKGkxMSkgPyB2b2lkIDAgOiBpMTEuXyRsaXREaXJlY3RpdmUkOwogIHJldHVybiBoOT8uY29uc3RydWN0b3IgIT09IG8xMyAmJiAoaDk/Ll8kQU8/LihmYWxzZSksIHZvaWQgMCA9PT0gbzEzID8gaDkgPSB2b2lkIDAgOiAoaDkgPSBuZXcgbzEzKHQ5KSwgaDkuXyRBVCh0OSwgczksIGUxMSkpLCB2b2lkIDAgIT09IGUxMSA/IChzOS5fJENvID8/PSBbXSlbZTExXSA9IGg5IDogczkuXyRDbCA9IGg5KSwgdm9pZCAwICE9PSBoOSAmJiAoaTExID0gTSh0OSwgaDkuXyRBUyh0OSwgaTExLnZhbHVlcyksIGg5LCBlMTEpKSwgaTExOwp9CnZhciB0MiwgaTMsIHMyLCBlMywgaDIsIG8zLCBuMywgcjMsIGwyLCBjMywgYTIsIHUyLCBkMiwgZjIsIHYsIF8sIG0sIHAyLCBnLCAkLCB5MiwgeCwgYjIsIHcsIFQsIEUsIEEsIEMsIFAsIE4sIFMyLCBSLCBrLCBILCBJLCBMLCB6LCBaLCBqLCBCLCBEOwp2YXIgaW5pdF9saXRfaHRtbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9saXQtaHRtbC5qcyIoKSB7CiAgICB0MiA9IGdsb2JhbFRoaXMsIGkzID0gKHQ5KSA9PiB0OSwgczIgPSB0Mi50cnVzdGVkVHlwZXMsIGUzID0gczIgPyBzMi5jcmVhdGVQb2xpY3koImxpdC1odG1sIiwgeyBjcmVhdGVIVE1MOiAodDkpID0+IHQ5IH0pIDogdm9pZCAwLCBoMiA9ICIkbGl0JCIsIG8zID0gYGxpdCQke01hdGgucmFuZG9tKCkudG9GaXhlZCg5KS5zbGljZSgyKX0kYCwgbjMgPSAiPyIgKyBvMywgcjMgPSBgPCR7bjN9PmAsIGwyID0gZG9jdW1lbnQsIGMzID0gKCkgPT4gbDIuY3JlYXRlQ29tbWVudCgiIiksIGEyID0gKHQ5KSA9PiBudWxsID09PSB0OSB8fCAib2JqZWN0IiAhPSB0eXBlb2YgdDkgJiYgImZ1bmN0aW9uIiAhPSB0eXBlb2YgdDksIHUyID0gQXJyYXkuaXNBcnJheSwgZDIgPSAodDkpID0+IHUyKHQ5KSB8fCAiZnVuY3Rpb24iID09IHR5cGVvZiB0OT8uW1N5bWJvbC5pdGVyYXRvcl0sIGYyID0gIlsgCVxuXGZccl0iLCB2ID0gLzwoPzooIS0tfFwvW15hLXpBLVpdKXwoXC8/W2EtekEtWl1bXj5cc10qKXwoXC8/JCkpL2csIF8gPSAvLS0+L2csIG0gPSAvPi9nLCBwMiA9IFJlZ0V4cChgPnwke2YyfSg/OihbXlxccyInPj0vXSspKCR7ZjJ9Kj0ke2YyfSooPzpbXiAJClxmXHIiJ1xgPD49XXwoInwnKXwpKXwkKWAsICJnIiksIGcgPSAvJy9nLCAkID0gLyIvZywgeTIgPSAvXig/OnNjcmlwdHxzdHlsZXx0ZXh0YXJlYXx0aXRsZSkkL2ksIHggPSAodDkpID0+IChpMTEsIC4uLnM5KSA9PiAoeyBfJGxpdFR5cGUkOiB0OSwgc3RyaW5nczogaTExLCB2YWx1ZXM6IHM5IH0pLCBiMiA9IHgoMSksIHcgPSB4KDIpLCBUID0geCgzKSwgRSA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2wuZm9yKCJsaXQtbm9DaGFuZ2UiKSwgQSA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2wuZm9yKCJsaXQtbm90aGluZyIpLCBDID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCksIFAgPSBsMi5jcmVhdGVUcmVlV2Fsa2VyKGwyLCAxMjkpOwogICAgTiA9ICh0OSwgaTExKSA9PiB7CiAgICAgIGNvbnN0IHM5ID0gdDkubGVuZ3RoIC0gMSwgZTExID0gW107CiAgICAgIGxldCBuMTMsIGw2ID0gMiA9PT0gaTExID8gIjxzdmc+IiA6IDMgPT09IGkxMSA/ICI8bWF0aD4iIDogIiIsIGMxMSA9IHY7CiAgICAgIGZvciAobGV0IGkxMiA9IDA7IGkxMiA8IHM5OyBpMTIrKykgewogICAgICAgIGNvbnN0IHMxMCA9IHQ5W2kxMl07CiAgICAgICAgbGV0IGE1LCB1NywgZDYgPSAtMSwgZjcgPSAwOwogICAgICAgIGZvciAoOyBmNyA8IHMxMC5sZW5ndGggJiYgKGMxMS5sYXN0SW5kZXggPSBmNywgdTcgPSBjMTEuZXhlYyhzMTApLCBudWxsICE9PSB1Nyk7ICkgZjcgPSBjMTEubGFzdEluZGV4LCBjMTEgPT09IHYgPyAiIS0tIiA9PT0gdTdbMV0gPyBjMTEgPSBfIDogdm9pZCAwICE9PSB1N1sxXSA/IGMxMSA9IG0gOiB2b2lkIDAgIT09IHU3WzJdID8gKHkyLnRlc3QodTdbMl0pICYmIChuMTMgPSBSZWdFeHAoIjwvIiArIHU3WzJdLCAiZyIpKSwgYzExID0gcDIpIDogdm9pZCAwICE9PSB1N1szXSAmJiAoYzExID0gcDIpIDogYzExID09PSBwMiA/ICI+IiA9PT0gdTdbMF0gPyAoYzExID0gbjEzID8/IHYsIGQ2ID0gLTEpIDogdm9pZCAwID09PSB1N1sxXSA/IGQ2ID0gLTIgOiAoZDYgPSBjMTEubGFzdEluZGV4IC0gdTdbMl0ubGVuZ3RoLCBhNSA9IHU3WzFdLCBjMTEgPSB2b2lkIDAgPT09IHU3WzNdID8gcDIgOiAnIicgPT09IHU3WzNdID8gJCA6IGcpIDogYzExID09PSAkIHx8IGMxMSA9PT0gZyA/IGMxMSA9IHAyIDogYzExID09PSBfIHx8IGMxMSA9PT0gbSA/IGMxMSA9IHYgOiAoYzExID0gcDIsIG4xMyA9IHZvaWQgMCk7CiAgICAgICAgY29uc3QgeDMgPSBjMTEgPT09IHAyICYmIHQ5W2kxMiArIDFdLnN0YXJ0c1dpdGgoIi8+IikgPyAiICIgOiAiIjsKICAgICAgICBsNiArPSBjMTEgPT09IHYgPyBzMTAgKyByMyA6IGQ2ID49IDAgPyAoZTExLnB1c2goYTUpLCBzMTAuc2xpY2UoMCwgZDYpICsgaDIgKyBzMTAuc2xpY2UoZDYpICsgbzMgKyB4MykgOiBzMTAgKyBvMyArICgtMiA9PT0gZDYgPyBpMTIgOiB4Myk7CiAgICAgIH0KICAgICAgcmV0dXJuIFtWKHQ5LCBsNiArICh0OVtzOV0gfHwgIjw/PiIpICsgKDIgPT09IGkxMSA/ICI8L3N2Zz4iIDogMyA9PT0gaTExID8gIjwvbWF0aD4iIDogIiIpKSwgZTExXTsKICAgIH07CiAgICBTMiA9IGNsYXNzIF9TIHsKICAgICAgY29uc3RydWN0b3IoeyBzdHJpbmdzOiB0OSwgXyRsaXRUeXBlJDogaTExIH0sIGUxMSkgewogICAgICAgIGxldCByMTE7CiAgICAgICAgdGhpcy5wYXJ0cyA9IFtdOwogICAgICAgIGxldCBsNiA9IDAsIGE1ID0gMDsKICAgICAgICBjb25zdCB1NyA9IHQ5Lmxlbmd0aCAtIDEsIGQ2ID0gdGhpcy5wYXJ0cywgW2Y3LCB2NV0gPSBOKHQ5LCBpMTEpOwogICAgICAgIGlmICh0aGlzLmVsID0gX1MuY3JlYXRlRWxlbWVudChmNywgZTExKSwgUC5jdXJyZW50Tm9kZSA9IHRoaXMuZWwuY29udGVudCwgMiA9PT0gaTExIHx8IDMgPT09IGkxMSkgewogICAgICAgICAgY29uc3QgdDEwID0gdGhpcy5lbC5jb250ZW50LmZpcnN0Q2hpbGQ7CiAgICAgICAgICB0MTAucmVwbGFjZVdpdGgoLi4udDEwLmNoaWxkTm9kZXMpOwogICAgICAgIH0KICAgICAgICBmb3IgKDsgbnVsbCAhPT0gKHIxMSA9IFAubmV4dE5vZGUoKSkgJiYgZDYubGVuZ3RoIDwgdTc7ICkgewogICAgICAgICAgaWYgKDEgPT09IHIxMS5ub2RlVHlwZSkgewogICAgICAgICAgICBpZiAocjExLmhhc0F0dHJpYnV0ZXMoKSkgZm9yIChjb25zdCB0MTAgb2YgcjExLmdldEF0dHJpYnV0ZU5hbWVzKCkpIGlmICh0MTAuZW5kc1dpdGgoaDIpKSB7CiAgICAgICAgICAgICAgY29uc3QgaTEyID0gdjVbYTUrK10sIHM5ID0gcjExLmdldEF0dHJpYnV0ZSh0MTApLnNwbGl0KG8zKSwgZTEyID0gLyhbLj9AXSk/KC4qKS8uZXhlYyhpMTIpOwogICAgICAgICAgICAgIGQ2LnB1c2goeyB0eXBlOiAxLCBpbmRleDogbDYsIG5hbWU6IGUxMlsyXSwgc3RyaW5nczogczksIGN0b3I6ICIuIiA9PT0gZTEyWzFdID8gSSA6ICI/IiA9PT0gZTEyWzFdID8gTCA6ICJAIiA9PT0gZTEyWzFdID8geiA6IEggfSksIHIxMS5yZW1vdmVBdHRyaWJ1dGUodDEwKTsKICAgICAgICAgICAgfSBlbHNlIHQxMC5zdGFydHNXaXRoKG8zKSAmJiAoZDYucHVzaCh7IHR5cGU6IDYsIGluZGV4OiBsNiB9KSwgcjExLnJlbW92ZUF0dHJpYnV0ZSh0MTApKTsKICAgICAgICAgICAgaWYgKHkyLnRlc3QocjExLnRhZ05hbWUpKSB7CiAgICAgICAgICAgICAgY29uc3QgdDEwID0gcjExLnRleHRDb250ZW50LnNwbGl0KG8zKSwgaTEyID0gdDEwLmxlbmd0aCAtIDE7CiAgICAgICAgICAgICAgaWYgKGkxMiA+IDApIHsKICAgICAgICAgICAgICAgIHIxMS50ZXh0Q29udGVudCA9IHMyID8gczIuZW1wdHlTY3JpcHQgOiAiIjsKICAgICAgICAgICAgICAgIGZvciAobGV0IHM5ID0gMDsgczkgPCBpMTI7IHM5KyspIHIxMS5hcHBlbmQodDEwW3M5XSwgYzMoKSksIFAubmV4dE5vZGUoKSwgZDYucHVzaCh7IHR5cGU6IDIsIGluZGV4OiArK2w2IH0pOwogICAgICAgICAgICAgICAgcjExLmFwcGVuZCh0MTBbaTEyXSwgYzMoKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKDggPT09IHIxMS5ub2RlVHlwZSkgaWYgKHIxMS5kYXRhID09PSBuMykgZDYucHVzaCh7IHR5cGU6IDIsIGluZGV4OiBsNiB9KTsKICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBsZXQgdDEwID0gLTE7CiAgICAgICAgICAgIGZvciAoOyAtMSAhPT0gKHQxMCA9IHIxMS5kYXRhLmluZGV4T2YobzMsIHQxMCArIDEpKTsgKSBkNi5wdXNoKHsgdHlwZTogNywgaW5kZXg6IGw2IH0pLCB0MTAgKz0gbzMubGVuZ3RoIC0gMTsKICAgICAgICAgIH0KICAgICAgICAgIGw2Kys7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0YXRpYyBjcmVhdGVFbGVtZW50KHQ5LCBpMTEpIHsKICAgICAgICBjb25zdCBzOSA9IGwyLmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7CiAgICAgICAgcmV0dXJuIHM5LmlubmVySFRNTCA9IHQ5LCBzOTsKICAgICAgfQogICAgfTsKICAgIFIgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKHQ5LCBpMTEpIHsKICAgICAgICB0aGlzLl8kQVYgPSBbXSwgdGhpcy5fJEFOID0gdm9pZCAwLCB0aGlzLl8kQUQgPSB0OSwgdGhpcy5fJEFNID0gaTExOwogICAgICB9CiAgICAgIGdldCBwYXJlbnROb2RlKCkgewogICAgICAgIHJldHVybiB0aGlzLl8kQU0ucGFyZW50Tm9kZTsKICAgICAgfQogICAgICBnZXQgXyRBVSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fJEFNLl8kQVU7CiAgICAgIH0KICAgICAgdSh0OSkgewogICAgICAgIGNvbnN0IHsgZWw6IHsgY29udGVudDogaTExIH0sIHBhcnRzOiBzOSB9ID0gdGhpcy5fJEFELCBlMTEgPSAodDk/LmNyZWF0aW9uU2NvcGUgPz8gbDIpLmltcG9ydE5vZGUoaTExLCB0cnVlKTsKICAgICAgICBQLmN1cnJlbnROb2RlID0gZTExOwogICAgICAgIGxldCBoOSA9IFAubmV4dE5vZGUoKSwgbzEzID0gMCwgbjEzID0gMCwgcjExID0gczlbMF07CiAgICAgICAgZm9yICg7IHZvaWQgMCAhPT0gcjExOyApIHsKICAgICAgICAgIGlmIChvMTMgPT09IHIxMS5pbmRleCkgewogICAgICAgICAgICBsZXQgaTEyOwogICAgICAgICAgICAyID09PSByMTEudHlwZSA/IGkxMiA9IG5ldyBrKGg5LCBoOS5uZXh0U2libGluZywgdGhpcywgdDkpIDogMSA9PT0gcjExLnR5cGUgPyBpMTIgPSBuZXcgcjExLmN0b3IoaDksIHIxMS5uYW1lLCByMTEuc3RyaW5ncywgdGhpcywgdDkpIDogNiA9PT0gcjExLnR5cGUgJiYgKGkxMiA9IG5ldyBaKGg5LCB0aGlzLCB0OSkpLCB0aGlzLl8kQVYucHVzaChpMTIpLCByMTEgPSBzOVsrK24xM107CiAgICAgICAgICB9CiAgICAgICAgICBvMTMgIT09IHIxMT8uaW5kZXggJiYgKGg5ID0gUC5uZXh0Tm9kZSgpLCBvMTMrKyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBQLmN1cnJlbnROb2RlID0gbDIsIGUxMTsKICAgICAgfQogICAgICBwKHQ5KSB7CiAgICAgICAgbGV0IGkxMSA9IDA7CiAgICAgICAgZm9yIChjb25zdCBzOSBvZiB0aGlzLl8kQVYpIHZvaWQgMCAhPT0gczkgJiYgKHZvaWQgMCAhPT0gczkuc3RyaW5ncyA/IChzOS5fJEFJKHQ5LCBzOSwgaTExKSwgaTExICs9IHM5LnN0cmluZ3MubGVuZ3RoIC0gMikgOiBzOS5fJEFJKHQ5W2kxMV0pKSwgaTExKys7CiAgICAgIH0KICAgIH07CiAgICBrID0gY2xhc3MgX2sgewogICAgICBnZXQgXyRBVSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fJEFNPy5fJEFVID8/IHRoaXMuXyRDdjsKICAgICAgfQogICAgICBjb25zdHJ1Y3Rvcih0OSwgaTExLCBzOSwgZTExKSB7CiAgICAgICAgdGhpcy50eXBlID0gMiwgdGhpcy5fJEFIID0gQSwgdGhpcy5fJEFOID0gdm9pZCAwLCB0aGlzLl8kQUEgPSB0OSwgdGhpcy5fJEFCID0gaTExLCB0aGlzLl8kQU0gPSBzOSwgdGhpcy5vcHRpb25zID0gZTExLCB0aGlzLl8kQ3YgPSBlMTE/LmlzQ29ubmVjdGVkID8/IHRydWU7CiAgICAgIH0KICAgICAgZ2V0IHBhcmVudE5vZGUoKSB7CiAgICAgICAgbGV0IHQ5ID0gdGhpcy5fJEFBLnBhcmVudE5vZGU7CiAgICAgICAgY29uc3QgaTExID0gdGhpcy5fJEFNOwogICAgICAgIHJldHVybiB2b2lkIDAgIT09IGkxMSAmJiAxMSA9PT0gdDk/Lm5vZGVUeXBlICYmICh0OSA9IGkxMS5wYXJlbnROb2RlKSwgdDk7CiAgICAgIH0KICAgICAgZ2V0IHN0YXJ0Tm9kZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fJEFBOwogICAgICB9CiAgICAgIGdldCBlbmROb2RlKCkgewogICAgICAgIHJldHVybiB0aGlzLl8kQUI7CiAgICAgIH0KICAgICAgXyRBSSh0OSwgaTExID0gdGhpcykgewogICAgICAgIHQ5ID0gTSh0aGlzLCB0OSwgaTExKSwgYTIodDkpID8gdDkgPT09IEEgfHwgbnVsbCA9PSB0OSB8fCAiIiA9PT0gdDkgPyAodGhpcy5fJEFIICE9PSBBICYmIHRoaXMuXyRBUigpLCB0aGlzLl8kQUggPSBBKSA6IHQ5ICE9PSB0aGlzLl8kQUggJiYgdDkgIT09IEUgJiYgdGhpcy5fKHQ5KSA6IHZvaWQgMCAhPT0gdDkuXyRsaXRUeXBlJCA/IHRoaXMuJCh0OSkgOiB2b2lkIDAgIT09IHQ5Lm5vZGVUeXBlID8gdGhpcy5UKHQ5KSA6IGQyKHQ5KSA/IHRoaXMuayh0OSkgOiB0aGlzLl8odDkpOwogICAgICB9CiAgICAgIE8odDkpIHsKICAgICAgICByZXR1cm4gdGhpcy5fJEFBLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQ5LCB0aGlzLl8kQUIpOwogICAgICB9CiAgICAgIFQodDkpIHsKICAgICAgICB0aGlzLl8kQUggIT09IHQ5ICYmICh0aGlzLl8kQVIoKSwgdGhpcy5fJEFIID0gdGhpcy5PKHQ5KSk7CiAgICAgIH0KICAgICAgXyh0OSkgewogICAgICAgIHRoaXMuXyRBSCAhPT0gQSAmJiBhMih0aGlzLl8kQUgpID8gdGhpcy5fJEFBLm5leHRTaWJsaW5nLmRhdGEgPSB0OSA6IHRoaXMuVChsMi5jcmVhdGVUZXh0Tm9kZSh0OSkpLCB0aGlzLl8kQUggPSB0OTsKICAgICAgfQogICAgICAkKHQ5KSB7CiAgICAgICAgY29uc3QgeyB2YWx1ZXM6IGkxMSwgXyRsaXRUeXBlJDogczkgfSA9IHQ5LCBlMTEgPSAibnVtYmVyIiA9PSB0eXBlb2YgczkgPyB0aGlzLl8kQUModDkpIDogKHZvaWQgMCA9PT0gczkuZWwgJiYgKHM5LmVsID0gUzIuY3JlYXRlRWxlbWVudChWKHM5LmgsIHM5LmhbMF0pLCB0aGlzLm9wdGlvbnMpKSwgczkpOwogICAgICAgIGlmICh0aGlzLl8kQUg/Ll8kQUQgPT09IGUxMSkgdGhpcy5fJEFILnAoaTExKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGNvbnN0IHQxMCA9IG5ldyBSKGUxMSwgdGhpcyksIHMxMCA9IHQxMC51KHRoaXMub3B0aW9ucyk7CiAgICAgICAgICB0MTAucChpMTEpLCB0aGlzLlQoczEwKSwgdGhpcy5fJEFIID0gdDEwOwogICAgICAgIH0KICAgICAgfQogICAgICBfJEFDKHQ5KSB7CiAgICAgICAgbGV0IGkxMSA9IEMuZ2V0KHQ5LnN0cmluZ3MpOwogICAgICAgIHJldHVybiB2b2lkIDAgPT09IGkxMSAmJiBDLnNldCh0OS5zdHJpbmdzLCBpMTEgPSBuZXcgUzIodDkpKSwgaTExOwogICAgICB9CiAgICAgIGsodDkpIHsKICAgICAgICB1Mih0aGlzLl8kQUgpIHx8ICh0aGlzLl8kQUggPSBbXSwgdGhpcy5fJEFSKCkpOwogICAgICAgIGNvbnN0IGkxMSA9IHRoaXMuXyRBSDsKICAgICAgICBsZXQgczksIGUxMSA9IDA7CiAgICAgICAgZm9yIChjb25zdCBoOSBvZiB0OSkgZTExID09PSBpMTEubGVuZ3RoID8gaTExLnB1c2goczkgPSBuZXcgX2sodGhpcy5PKGMzKCkpLCB0aGlzLk8oYzMoKSksIHRoaXMsIHRoaXMub3B0aW9ucykpIDogczkgPSBpMTFbZTExXSwgczkuXyRBSShoOSksIGUxMSsrOwogICAgICAgIGUxMSA8IGkxMS5sZW5ndGggJiYgKHRoaXMuXyRBUihzOSAmJiBzOS5fJEFCLm5leHRTaWJsaW5nLCBlMTEpLCBpMTEubGVuZ3RoID0gZTExKTsKICAgICAgfQogICAgICBfJEFSKHQ5ID0gdGhpcy5fJEFBLm5leHRTaWJsaW5nLCBzOSkgewogICAgICAgIGZvciAodGhpcy5fJEFQPy4oZmFsc2UsIHRydWUsIHM5KTsgdDkgIT09IHRoaXMuXyRBQjsgKSB7CiAgICAgICAgICBjb25zdCBzMTAgPSBpMyh0OSkubmV4dFNpYmxpbmc7CiAgICAgICAgICBpMyh0OSkucmVtb3ZlKCksIHQ5ID0gczEwOwogICAgICAgIH0KICAgICAgfQogICAgICBzZXRDb25uZWN0ZWQodDkpIHsKICAgICAgICB2b2lkIDAgPT09IHRoaXMuXyRBTSAmJiAodGhpcy5fJEN2ID0gdDksIHRoaXMuXyRBUD8uKHQ5KSk7CiAgICAgIH0KICAgIH07CiAgICBIID0gY2xhc3MgewogICAgICBnZXQgdGFnTmFtZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LnRhZ05hbWU7CiAgICAgIH0KICAgICAgZ2V0IF8kQVUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuXyRBTS5fJEFVOwogICAgICB9CiAgICAgIGNvbnN0cnVjdG9yKHQ5LCBpMTEsIHM5LCBlMTEsIGg5KSB7CiAgICAgICAgdGhpcy50eXBlID0gMSwgdGhpcy5fJEFIID0gQSwgdGhpcy5fJEFOID0gdm9pZCAwLCB0aGlzLmVsZW1lbnQgPSB0OSwgdGhpcy5uYW1lID0gaTExLCB0aGlzLl8kQU0gPSBlMTEsIHRoaXMub3B0aW9ucyA9IGg5LCBzOS5sZW5ndGggPiAyIHx8ICIiICE9PSBzOVswXSB8fCAiIiAhPT0gczlbMV0gPyAodGhpcy5fJEFIID0gQXJyYXkoczkubGVuZ3RoIC0gMSkuZmlsbChuZXcgU3RyaW5nKCkpLCB0aGlzLnN0cmluZ3MgPSBzOSkgOiB0aGlzLl8kQUggPSBBOwogICAgICB9CiAgICAgIF8kQUkodDksIGkxMSA9IHRoaXMsIHM5LCBlMTEpIHsKICAgICAgICBjb25zdCBoOSA9IHRoaXMuc3RyaW5nczsKICAgICAgICBsZXQgbzEzID0gZmFsc2U7CiAgICAgICAgaWYgKHZvaWQgMCA9PT0gaDkpIHQ5ID0gTSh0aGlzLCB0OSwgaTExLCAwKSwgbzEzID0gIWEyKHQ5KSB8fCB0OSAhPT0gdGhpcy5fJEFIICYmIHQ5ICE9PSBFLCBvMTMgJiYgKHRoaXMuXyRBSCA9IHQ5KTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGNvbnN0IGUxMiA9IHQ5OwogICAgICAgICAgbGV0IG4xMywgcjExOwogICAgICAgICAgZm9yICh0OSA9IGg5WzBdLCBuMTMgPSAwOyBuMTMgPCBoOS5sZW5ndGggLSAxOyBuMTMrKykgcjExID0gTSh0aGlzLCBlMTJbczkgKyBuMTNdLCBpMTEsIG4xMyksIHIxMSA9PT0gRSAmJiAocjExID0gdGhpcy5fJEFIW24xM10pLCBvMTMgfHw9ICFhMihyMTEpIHx8IHIxMSAhPT0gdGhpcy5fJEFIW24xM10sIHIxMSA9PT0gQSA/IHQ5ID0gQSA6IHQ5ICE9PSBBICYmICh0OSArPSAocjExID8/ICIiKSArIGg5W24xMyArIDFdKSwgdGhpcy5fJEFIW24xM10gPSByMTE7CiAgICAgICAgfQogICAgICAgIG8xMyAmJiAhZTExICYmIHRoaXMuaih0OSk7CiAgICAgIH0KICAgICAgaih0OSkgewogICAgICAgIHQ5ID09PSBBID8gdGhpcy5lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSh0aGlzLm5hbWUpIDogdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSh0aGlzLm5hbWUsIHQ5ID8/ICIiKTsKICAgICAgfQogICAgfTsKICAgIEkgPSBjbGFzcyBleHRlbmRzIEggewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLnR5cGUgPSAzOwogICAgICB9CiAgICAgIGoodDkpIHsKICAgICAgICB0aGlzLmVsZW1lbnRbdGhpcy5uYW1lXSA9IHQ5ID09PSBBID8gdm9pZCAwIDogdDk7CiAgICAgIH0KICAgIH07CiAgICBMID0gY2xhc3MgZXh0ZW5kcyBIIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy50eXBlID0gNDsKICAgICAgfQogICAgICBqKHQ5KSB7CiAgICAgICAgdGhpcy5lbGVtZW50LnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLm5hbWUsICEhdDkgJiYgdDkgIT09IEEpOwogICAgICB9CiAgICB9OwogICAgeiA9IGNsYXNzIGV4dGVuZHMgSCB7CiAgICAgIGNvbnN0cnVjdG9yKHQ5LCBpMTEsIHM5LCBlMTEsIGg5KSB7CiAgICAgICAgc3VwZXIodDksIGkxMSwgczksIGUxMSwgaDkpLCB0aGlzLnR5cGUgPSA1OwogICAgICB9CiAgICAgIF8kQUkodDksIGkxMSA9IHRoaXMpIHsKICAgICAgICBpZiAoKHQ5ID0gTSh0aGlzLCB0OSwgaTExLCAwKSA/PyBBKSA9PT0gRSkgcmV0dXJuOwogICAgICAgIGNvbnN0IHM5ID0gdGhpcy5fJEFILCBlMTEgPSB0OSA9PT0gQSAmJiBzOSAhPT0gQSB8fCB0OS5jYXB0dXJlICE9PSBzOS5jYXB0dXJlIHx8IHQ5Lm9uY2UgIT09IHM5Lm9uY2UgfHwgdDkucGFzc2l2ZSAhPT0gczkucGFzc2l2ZSwgaDkgPSB0OSAhPT0gQSAmJiAoczkgPT09IEEgfHwgZTExKTsKICAgICAgICBlMTEgJiYgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5uYW1lLCB0aGlzLCBzOSksIGg5ICYmIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMubmFtZSwgdGhpcywgdDkpLCB0aGlzLl8kQUggPSB0OTsKICAgICAgfQogICAgICBoYW5kbGVFdmVudCh0OSkgewogICAgICAgICJmdW5jdGlvbiIgPT0gdHlwZW9mIHRoaXMuXyRBSCA/IHRoaXMuXyRBSC5jYWxsKHRoaXMub3B0aW9ucz8uaG9zdCA/PyB0aGlzLmVsZW1lbnQsIHQ5KSA6IHRoaXMuXyRBSC5oYW5kbGVFdmVudCh0OSk7CiAgICAgIH0KICAgIH07CiAgICBaID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3Rvcih0OSwgaTExLCBzOSkgewogICAgICAgIHRoaXMuZWxlbWVudCA9IHQ5LCB0aGlzLnR5cGUgPSA2LCB0aGlzLl8kQU4gPSB2b2lkIDAsIHRoaXMuXyRBTSA9IGkxMSwgdGhpcy5vcHRpb25zID0gczk7CiAgICAgIH0KICAgICAgZ2V0IF8kQVUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuXyRBTS5fJEFVOwogICAgICB9CiAgICAgIF8kQUkodDkpIHsKICAgICAgICBNKHRoaXMsIHQ5KTsKICAgICAgfQogICAgfTsKICAgIGogPSB7IE06IGgyLCBQOiBvMywgQTogbjMsIEM6IDEsIEw6IE4sIFIsIEQ6IGQyLCBWOiBNLCBJOiBrLCBILCBOOiBMLCBVOiB6LCBCOiBJLCBGOiBaIH0sIEIgPSB0Mi5saXRIdG1sUG9seWZpbGxTdXBwb3J0OwogICAgQj8uKFMyLCBrKSwgKHQyLmxpdEh0bWxWZXJzaW9ucyA/Pz0gW10pLnB1c2goIjMuMy4yIik7CiAgICBEID0gKHQ5LCBpMTEsIHM5KSA9PiB7CiAgICAgIGNvbnN0IGUxMSA9IHM5Py5yZW5kZXJCZWZvcmUgPz8gaTExOwogICAgICBsZXQgaDkgPSBlMTEuXyRsaXRQYXJ0JDsKICAgICAgaWYgKHZvaWQgMCA9PT0gaDkpIHsKICAgICAgICBjb25zdCB0MTAgPSBzOT8ucmVuZGVyQmVmb3JlID8/IG51bGw7CiAgICAgICAgZTExLl8kbGl0UGFydCQgPSBoOSA9IG5ldyBrKGkxMS5pbnNlcnRCZWZvcmUoYzMoKSwgdDEwKSwgdDEwLCB2b2lkIDAsIHM5ID8/IHt9KTsKICAgICAgfQogICAgICByZXR1cm4gaDkuXyRBSSh0OSksIGg5OwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1lbGVtZW50QDQuMi4yL25vZGVfbW9kdWxlcy9saXQtZWxlbWVudC9saXQtZWxlbWVudC5qcwp2YXIgczMsIGk0LCBvNCwgbjQ7CnZhciBpbml0X2xpdF9lbGVtZW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbGl0LWVsZW1lbnRANC4yLjIvbm9kZV9tb2R1bGVzL2xpdC1lbGVtZW50L2xpdC1lbGVtZW50LmpzIigpIHsKICAgIGluaXRfcmVhY3RpdmVfZWxlbWVudCgpOwogICAgaW5pdF9yZWFjdGl2ZV9lbGVtZW50KCk7CiAgICBpbml0X2xpdF9odG1sKCk7CiAgICBpbml0X2xpdF9odG1sKCk7CiAgICBzMyA9IGdsb2JhbFRoaXM7CiAgICBpNCA9IGNsYXNzIGV4dGVuZHMgeSB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMucmVuZGVyT3B0aW9ucyA9IHsgaG9zdDogdGhpcyB9LCB0aGlzLl8kRG8gPSB2b2lkIDA7CiAgICAgIH0KICAgICAgY3JlYXRlUmVuZGVyUm9vdCgpIHsKICAgICAgICBjb25zdCB0OSA9IHN1cGVyLmNyZWF0ZVJlbmRlclJvb3QoKTsKICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJPcHRpb25zLnJlbmRlckJlZm9yZSA/Pz0gdDkuZmlyc3RDaGlsZCwgdDk7CiAgICAgIH0KICAgICAgdXBkYXRlKHQ5KSB7CiAgICAgICAgY29uc3QgcjExID0gdGhpcy5yZW5kZXIoKTsKICAgICAgICB0aGlzLmhhc1VwZGF0ZWQgfHwgKHRoaXMucmVuZGVyT3B0aW9ucy5pc0Nvbm5lY3RlZCA9IHRoaXMuaXNDb25uZWN0ZWQpLCBzdXBlci51cGRhdGUodDkpLCB0aGlzLl8kRG8gPSBEKHIxMSwgdGhpcy5yZW5kZXJSb290LCB0aGlzLnJlbmRlck9wdGlvbnMpOwogICAgICB9CiAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCksIHRoaXMuXyREbz8uc2V0Q29ubmVjdGVkKHRydWUpOwogICAgICB9CiAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCksIHRoaXMuXyREbz8uc2V0Q29ubmVjdGVkKGZhbHNlKTsKICAgICAgfQogICAgICByZW5kZXIoKSB7CiAgICAgICAgcmV0dXJuIEU7CiAgICAgIH0KICAgIH07CiAgICBpNC5fJGxpdEVsZW1lbnQkID0gdHJ1ZSwgaTRbImZpbmFsaXplZCJdID0gdHJ1ZSwgczMubGl0RWxlbWVudEh5ZHJhdGVTdXBwb3J0Py4oeyBMaXRFbGVtZW50OiBpNCB9KTsKICAgIG80ID0gczMubGl0RWxlbWVudFBvbHlmaWxsU3VwcG9ydDsKICAgIG80Py4oeyBMaXRFbGVtZW50OiBpNCB9KTsKICAgIG40ID0geyBfJEFLOiAodDksIGUxMSwgcjExKSA9PiB7CiAgICAgIHQ5Ll8kQUsoZTExLCByMTEpOwogICAgfSwgXyRBTDogKHQ5KSA9PiB0OS5fJEFMIH07CiAgICAoczMubGl0RWxlbWVudFZlcnNpb25zID8/PSBbXSkucHVzaCgiNC4yLjIiKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9pcy1zZXJ2ZXIuanMKdmFyIG81Owp2YXIgaW5pdF9pc19zZXJ2ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXQtaHRtbEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvaXMtc2VydmVyLmpzIigpIHsKICAgIG81ID0gZmFsc2U7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9saXRAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC9pbmRleC5qcwp2YXIgaW5pdF9saXQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXRAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC9pbmRleC5qcyIoKSB7CiAgICBpbml0X3JlYWN0aXZlX2VsZW1lbnQoKTsKICAgIGluaXRfbGl0X2h0bWwoKTsKICAgIGluaXRfbGl0X2VsZW1lbnQoKTsKICAgIGluaXRfaXNfc2VydmVyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcytpc291bmlxdWVAMS4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2lzb3VuaXF1ZS9kaXN0X3RzL2luZGV4LmpzCnZhciByZXF1aXJlX2Rpc3RfdHMgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2lzb3VuaXF1ZUAxLjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvaXNvdW5pcXVlL2Rpc3RfdHMvaW5kZXguanMiKGV4cG9ydHMpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzLnVuaSA9IHZvaWQgMDsKICAgIHZhciB1bmkzID0gKHByZWZpeDQgPSAidW5pIikgPT4gewogICAgICByZXR1cm4gYCR7cHJlZml4NH1fJHtgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4YC5yZXBsYWNlKC9beHldL2csIChjMTEpID0+IHsKICAgICAgICBjb25zdCByMTEgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwOwogICAgICAgIGNvbnN0IHY1ID0gYzExID09PSAieCIgPyByMTEgOiByMTEgJiAzIHwgODsKICAgICAgICByZXR1cm4gdjUudG9TdHJpbmcoMTYpOwogICAgICB9KX1gOwogICAgfTsKICAgIGV4cG9ydHMudW5pID0gdW5pMzsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cHJvbWlzZUA0LjIuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRwcm9taXNlL2Rpc3RfdHMvc21hcnRwcm9taXNlLmNsYXNzZXMuZGVmZXJyZWQuanMKdmFyIERlZmVycmVkLCBkZWZlcjsKdmFyIGluaXRfc21hcnRwcm9taXNlX2NsYXNzZXNfZGVmZXJyZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHByb21pc2VANC4yLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cHJvbWlzZS9kaXN0X3RzL3NtYXJ0cHJvbWlzZS5jbGFzc2VzLmRlZmVycmVkLmpzIigpIHsKICAgIERlZmVycmVkID0gY2xhc3MgewogICAgICBjbGFpbSgpIHsKICAgICAgICBpZiAodGhpcy5jbGFpbWVkKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkRlZmVycmVkIGFscmVhZHkgY2xhaW1lZCIpOwogICAgICAgIH0KICAgICAgICB0aGlzLmNsYWltZWQgPSB0cnVlOwogICAgICB9CiAgICAgIGdldCBkdXJhdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5zdG9wcGVkQXQpIHsKICAgICAgICAgIHJldHVybiB0aGlzLnN0b3BwZWRBdCAtIHRoaXMuc3RhcnRlZEF0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gRGF0ZS5ub3coKSAtIHRoaXMuc3RhcnRlZEF0OwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLmNsYWltZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdCkgPT4gewogICAgICAgICAgdGhpcy5yZXNvbHZlID0gKHZhbHVlQXJnKSA9PiB7CiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gImZ1bGZpbGxlZCI7CiAgICAgICAgICAgIHRoaXMuc3RvcHBlZEF0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgcmVzb2x2ZTIodmFsdWVBcmcpOwogICAgICAgICAgfTsKICAgICAgICAgIHRoaXMucmVqZWN0ID0gKHJlYXNvbikgPT4gewogICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICJyZWplY3RlZCI7CiAgICAgICAgICAgIHRoaXMuc3RvcHBlZEF0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7CiAgICAgICAgICB9OwogICAgICAgICAgdGhpcy5zdGFydGVkQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgdGhpcy5zdGF0dXMgPSAicGVuZGluZyI7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICBkZWZlciA9ICgpID0+IHsKICAgICAgcmV0dXJuIG5ldyBEZWZlcnJlZCgpOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cHJvbWlzZUA0LjIuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRwcm9taXNlL2Rpc3RfdHMvc21hcnRwcm9taXNlLmNsYXNzZXMuY3VtdWxhdGl2ZWRlZmVycmVkLmpzCnZhciBDdW11bGF0aXZlRGVmZXJyZWQsIGN1bXVsYXRpdmVEZWZlcjsKdmFyIGluaXRfc21hcnRwcm9taXNlX2NsYXNzZXNfY3VtdWxhdGl2ZWRlZmVycmVkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRwcm9taXNlQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9zbWFydHByb21pc2UuY2xhc3Nlcy5jdW11bGF0aXZlZGVmZXJyZWQuanMiKCkgewogICAgaW5pdF9zbWFydHByb21pc2VfY2xhc3Nlc19kZWZlcnJlZCgpOwogICAgQ3VtdWxhdGl2ZURlZmVycmVkID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLmFjY3VtdWxhdGVkUHJvbWlzZXMgPSBbXTsKICAgICAgICB0aGlzLmRlZmVycmVkID0gZGVmZXIoKTsKICAgICAgICB0aGlzLnByb21pc2UgPSB0aGlzLmRlZmVycmVkLnByb21pc2U7CiAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7CiAgICAgICAgICB3aGlsZSAodGhpcy5hY2N1bXVsYXRlZFByb21pc2VzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgY29uc3QgcG9wcGVkUHJvbWlzZSA9IHRoaXMuYWNjdW11bGF0ZWRQcm9taXNlcy5zaGlmdCgpOwogICAgICAgICAgICBhd2FpdCBwb3BwZWRQcm9taXNlOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5kZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgfSwgMCk7CiAgICAgIH0KICAgICAgc3ViRGVmZXIoKSB7CiAgICAgICAgY29uc3QgZG9uZSA9IGRlZmVyKCk7CiAgICAgICAgdGhpcy5hZGRQcm9taXNlKGRvbmUucHJvbWlzZSk7CiAgICAgICAgcmV0dXJuIGRvbmU7CiAgICAgIH0KICAgICAgYWRkUHJvbWlzZShwcm9taXNlQXJnKSB7CiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZFByb21pc2VzLnB1c2gocHJvbWlzZUFyZyk7CiAgICAgIH0KICAgIH07CiAgICBjdW11bGF0aXZlRGVmZXIgPSAoKSA9PiB7CiAgICAgIHJldHVybiBuZXcgQ3VtdWxhdGl2ZURlZmVycmVkKCk7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRwcm9taXNlQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0cywgewogIEN1bXVsYXRpdmVEZWZlcnJlZDogKCkgPT4gQ3VtdWxhdGl2ZURlZmVycmVkLAogIERlZmVycmVkOiAoKSA9PiBEZWZlcnJlZCwKICBjdW11bGF0aXZlRGVmZXI6ICgpID0+IGN1bXVsYXRpdmVEZWZlciwKICBkZWZlcjogKCkgPT4gZGVmZXIsCiAgZnJvbUNhbGxiYWNrOiAoKSA9PiBmcm9tQ2FsbGJhY2ssCiAgZ2V0Rmlyc3RUcnVlT3JGYWxzZTogKCkgPT4gZ2V0Rmlyc3RUcnVlT3JGYWxzZSwKICBtYXA6ICgpID0+IG1hcCwKICByZWplY3RlZFByb21pc2U6ICgpID0+IHJlamVjdGVkUHJvbWlzZSwKICByZXNvbHZlZFByb21pc2U6ICgpID0+IHJlc29sdmVkUHJvbWlzZSwKICB0aW1lb3V0QW5kQ29udGludWU6ICgpID0+IHRpbWVvdXRBbmRDb250aW51ZSwKICB0aW1lb3V0V3JhcDogKCkgPT4gdGltZW91dFdyYXAKfSk7CnZhciByZXNvbHZlZFByb21pc2UsIHJlamVjdGVkUHJvbWlzZSwgbWFwLCB0aW1lb3V0V3JhcCwgdGltZW91dEFuZENvbnRpbnVlLCBnZXRGaXJzdFRydWVPckZhbHNlLCBmcm9tQ2FsbGJhY2s7CnZhciBpbml0X2Rpc3RfdHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHByb21pc2VANC4yLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cHJvbWlzZS9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfc21hcnRwcm9taXNlX2NsYXNzZXNfZGVmZXJyZWQoKTsKICAgIGluaXRfc21hcnRwcm9taXNlX2NsYXNzZXNfY3VtdWxhdGl2ZWRlZmVycmVkKCk7CiAgICBpbml0X3NtYXJ0cHJvbWlzZV9jbGFzc2VzX2RlZmVycmVkKCk7CiAgICByZXNvbHZlZFByb21pc2UgPSAodmFsdWUyKSA9PiB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUyKTsKICAgIH07CiAgICByZWplY3RlZFByb21pc2UgPSAoZXJyKSA9PiB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpOwogICAgfTsKICAgIG1hcCA9IGFzeW5jIChpbnB1dEFyZywgZnVuY3Rpb25BcmcpID0+IHsKICAgICAgY29uc3QgcHJvbWlzZUFycmF5ID0gW107CiAgICAgIGNvbnN0IHJlc3VsdEFycmF5ID0gW107CiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpbnB1dEFyZykgewogICAgICAgIGNvbnN0IHByb21pc2UgPSBmdW5jdGlvbkFyZyhpdGVtKTsKICAgICAgICBwcm9taXNlQXJyYXkucHVzaChwcm9taXNlKTsKICAgICAgICBwcm9taXNlLnRoZW4oKHgzKSA9PiB7CiAgICAgICAgICByZXN1bHRBcnJheS5wdXNoKHgzKTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlQXJyYXkpOwogICAgICByZXR1cm4gcmVzdWx0QXJyYXk7CiAgICB9OwogICAgdGltZW91dFdyYXAgPSBhc3luYyAocHJvbWlzZUFyZywgdGltZW91dEluTXNBcmcsIHJlamVjdEFyZyA9IHRydWUpID0+IHsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0KSA9PiB7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICBpZiAocmVqZWN0QXJnKSB7CiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoInRpbWVvdXQiKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXNvbHZlMihudWxsKTsKICAgICAgICAgIH0KICAgICAgICB9LCB0aW1lb3V0SW5Nc0FyZyk7CiAgICAgICAgcHJvbWlzZUFyZy50aGVuKHJlc29sdmUyLCByZWplY3QpOwogICAgICB9KTsKICAgIH07CiAgICB0aW1lb3V0QW5kQ29udGludWUgPSBhc3luYyAocHJvbWlzZUFyZywgdGltZW91dEluTXNBcmcgPSA2ZTQpID0+IHsKICAgICAgcmV0dXJuIHRpbWVvdXRXcmFwKHByb21pc2VBcmcsIHRpbWVvdXRJbk1zQXJnLCBmYWxzZSk7CiAgICB9OwogICAgZ2V0Rmlyc3RUcnVlT3JGYWxzZSA9IGFzeW5jIChwcm9taXNlc0FyZykgPT4gewogICAgICBjb25zdCBkb25lID0gZGVmZXIoKTsKICAgICAgZm9yIChjb25zdCBwcm9taXNlQXJnIG9mIHByb21pc2VzQXJnKSB7CiAgICAgICAgcHJvbWlzZUFyZy50aGVuKChyZXN1bHRBcmcpID0+IHsKICAgICAgICAgIGlmIChyZXN1bHRBcmcgPT09IHRydWUpIHsKICAgICAgICAgICAgZG9uZS5yZXNvbHZlKHRydWUpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIFByb21pc2UuYWxsKHByb21pc2VzQXJnKS50aGVuKCgpID0+IHsKICAgICAgICBkb25lLnJlc29sdmUoZmFsc2UpOwogICAgICB9KTsKICAgICAgcmV0dXJuIGRvbmUucHJvbWlzZTsKICAgIH07CiAgICBmcm9tQ2FsbGJhY2sgPSAoZm4pID0+IHsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0KSA9PiB7CiAgICAgICAgZm4oKGVyciwgcmVzdWx0KSA9PiB7CiAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzb2x2ZTIocmVzdWx0KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyeEAzLjAuMTAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cngvZGlzdF90cy9zbWFydHJ4LnBsdWdpbnMuanMKdmFyIGluaXRfc21hcnRyeF9wbHVnaW5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyeEAzLjAuMTAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cngvZGlzdF90cy9zbWFydHJ4LnBsdWdpbnMuanMiKCkgewogICAgaW5pdF9kaXN0X3RzKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS90c2xpYkAyLjguMS9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2Lm1qcwpmdW5jdGlvbiBfX2V4dGVuZHMoZDYsIGI1KSB7CiAgaWYgKHR5cGVvZiBiNSAhPT0gImZ1bmN0aW9uIiAmJiBiNSAhPT0gbnVsbCkKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNsYXNzIGV4dGVuZHMgdmFsdWUgIiArIFN0cmluZyhiNSkgKyAiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGwiKTsKICBleHRlbmRTdGF0aWNzKGQ2LCBiNSk7CiAgZnVuY3Rpb24gX18oKSB7CiAgICB0aGlzLmNvbnN0cnVjdG9yID0gZDY7CiAgfQogIGQ2LnByb3RvdHlwZSA9IGI1ID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiNSkgOiAoX18ucHJvdG90eXBlID0gYjUucHJvdG90eXBlLCBuZXcgX18oKSk7Cn0KZnVuY3Rpb24gX19yZXN0KHM5LCBlMTEpIHsKICB2YXIgdDkgPSB7fTsKICBmb3IgKHZhciBwNyBpbiBzOSkgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzOSwgcDcpICYmIGUxMS5pbmRleE9mKHA3KSA8IDApCiAgICB0OVtwN10gPSBzOVtwN107CiAgaWYgKHM5ICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICJmdW5jdGlvbiIpCiAgICBmb3IgKHZhciBpMTEgPSAwLCBwNyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoczkpOyBpMTEgPCBwNy5sZW5ndGg7IGkxMSsrKSB7CiAgICAgIGlmIChlMTEuaW5kZXhPZihwN1tpMTFdKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHM5LCBwN1tpMTFdKSkKICAgICAgICB0OVtwN1tpMTFdXSA9IHM5W3A3W2kxMV1dOwogICAgfQogIHJldHVybiB0OTsKfQpmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5MiwgZGVzYykgewogIHZhciBjMTEgPSBhcmd1bWVudHMubGVuZ3RoLCByMTEgPSBjMTEgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5MikgOiBkZXNjLCBkNjsKICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJvYmplY3QiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSAiZnVuY3Rpb24iKSByMTEgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5MiwgZGVzYyk7CiAgZWxzZSBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgaWYgKGQ2ID0gZGVjb3JhdG9yc1tpMTFdKSByMTEgPSAoYzExIDwgMyA/IGQ2KHIxMSkgOiBjMTEgPiAzID8gZDYodGFyZ2V0LCBrZXkyLCByMTEpIDogZDYodGFyZ2V0LCBrZXkyKSkgfHwgcjExOwogIHJldHVybiBjMTEgPiAzICYmIHIxMSAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXkyLCByMTEpLCByMTE7Cn0KZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHsKICByZXR1cm4gZnVuY3Rpb24odGFyZ2V0LCBrZXkyKSB7CiAgICBkZWNvcmF0b3IodGFyZ2V0LCBrZXkyLCBwYXJhbUluZGV4KTsKICB9Owp9CmZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn0KZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnMyKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9CmZ1bmN0aW9uIF9fcHJvcEtleSh4MykgewogIHJldHVybiB0eXBlb2YgeDMgPT09ICJzeW1ib2wiID8geDMgOiAiIi5jb25jYXQoeDMpOwp9CmZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGY3LCBuYW1lLCBwcmVmaXg0KSB7CiAgaWYgKHR5cGVvZiBuYW1lID09PSAic3ltYm9sIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyAiWyIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sICJdIikgOiAiIjsKICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGY3LCAibmFtZSIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4NCA/ICIiLmNvbmNhdChwcmVmaXg0LCAiICIsIG5hbWUpIDogbmFtZSB9KTsKfQpmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7CiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAib2JqZWN0IiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpOwp9CmZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQNCwgZ2VuZXJhdG9yKSB7CiAgZnVuY3Rpb24gYWRvcHQodmFsdWUyKSB7CiAgICByZXR1cm4gdmFsdWUyIGluc3RhbmNlb2YgUDQgPyB2YWx1ZTIgOiBuZXcgUDQoZnVuY3Rpb24ocmVzb2x2ZTIpIHsKICAgICAgcmVzb2x2ZTIodmFsdWUyKTsKICAgIH0pOwogIH0KICByZXR1cm4gbmV3IChQNCB8fCAoUDQgPSBQcm9taXNlKSkoZnVuY3Rpb24ocmVzb2x2ZTIsIHJlamVjdCkgewogICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlMikgewogICAgICB0cnkgewogICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUyKSk7CiAgICAgIH0gY2F0Y2ggKGUxMSkgewogICAgICAgIHJlamVjdChlMTEpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZTIpIHsKICAgICAgdHJ5IHsKICAgICAgICBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZTIpKTsKICAgICAgfSBjYXRjaCAoZTExKSB7CiAgICAgICAgcmVqZWN0KGUxMSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7CiAgICAgIHJlc3VsdC5kb25lID8gcmVzb2x2ZTIocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsKICAgIH0KICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTsKICB9KTsKfQpmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5MykgewogIHZhciBfNCA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKHQ5WzBdICYgMSkgdGhyb3cgdDlbMV07CiAgICByZXR1cm4gdDlbMV07CiAgfSwgdHJ5czogW10sIG9wczogW10gfSwgZjcsIHk1LCB0OSwgZzQgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09ICJmdW5jdGlvbiIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTsKICByZXR1cm4gZzQubmV4dCA9IHZlcmIoMCksIGc0WyJ0aHJvdyJdID0gdmVyYigxKSwgZzRbInJldHVybiJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiAoZzRbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSksIGc0OwogIGZ1bmN0aW9uIHZlcmIobjEzKSB7CiAgICByZXR1cm4gZnVuY3Rpb24odjUpIHsKICAgICAgcmV0dXJuIHN0ZXAoW24xMywgdjVdKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHN0ZXAob3ApIHsKICAgIGlmIChmNykgdGhyb3cgbmV3IFR5cGVFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLiIpOwogICAgd2hpbGUgKGc0ICYmIChnNCA9IDAsIG9wWzBdICYmIChfNCA9IDApKSwgXzQpIHRyeSB7CiAgICAgIGlmIChmNyA9IDEsIHk1ICYmICh0OSA9IG9wWzBdICYgMiA/IHk1WyJyZXR1cm4iXSA6IG9wWzBdID8geTVbInRocm93Il0gfHwgKCh0OSA9IHk1WyJyZXR1cm4iXSkgJiYgdDkuY2FsbCh5NSksIDApIDogeTUubmV4dCkgJiYgISh0OSA9IHQ5LmNhbGwoeTUsIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ5OwogICAgICBpZiAoeTUgPSAwLCB0OSkgb3AgPSBbb3BbMF0gJiAyLCB0OS52YWx1ZV07CiAgICAgIHN3aXRjaCAob3BbMF0pIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgdDkgPSBvcDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgIF80LmxhYmVsKys7CiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07CiAgICAgICAgY2FzZSA1OgogICAgICAgICAgXzQubGFiZWwrKzsKICAgICAgICAgIHk1ID0gb3BbMV07CiAgICAgICAgICBvcCA9IFswXTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNhc2UgNzoKICAgICAgICAgIG9wID0gXzQub3BzLnBvcCgpOwogICAgICAgICAgXzQudHJ5cy5wb3AoKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpZiAoISh0OSA9IF80LnRyeXMsIHQ5ID0gdDkubGVuZ3RoID4gMCAmJiB0OVt0OS5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgewogICAgICAgICAgICBfNCA9IDA7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdDkgfHwgb3BbMV0gPiB0OVswXSAmJiBvcFsxXSA8IHQ5WzNdKSkgewogICAgICAgICAgICBfNC5sYWJlbCA9IG9wWzFdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfNC5sYWJlbCA8IHQ5WzFdKSB7CiAgICAgICAgICAgIF80LmxhYmVsID0gdDlbMV07CiAgICAgICAgICAgIHQ5ID0gb3A7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHQ5ICYmIF80LmxhYmVsIDwgdDlbMl0pIHsKICAgICAgICAgICAgXzQubGFiZWwgPSB0OVsyXTsKICAgICAgICAgICAgXzQub3BzLnB1c2gob3ApOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0OVsyXSkgXzQub3BzLnBvcCgpOwogICAgICAgICAgXzQudHJ5cy5wb3AoKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIG9wID0gYm9keTMuY2FsbCh0aGlzQXJnLCBfNCk7CiAgICB9IGNhdGNoIChlMTEpIHsKICAgICAgb3AgPSBbNiwgZTExXTsKICAgICAgeTUgPSAwOwogICAgfSBmaW5hbGx5IHsKICAgICAgZjcgPSB0OSA9IDA7CiAgICB9CiAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsKICAgIHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07CiAgfQp9CmZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtNiwgbzEzKSB7CiAgZm9yICh2YXIgcDcgaW4gbTYpIGlmIChwNyAhPT0gImRlZmF1bHQiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobzEzLCBwNykpIF9fY3JlYXRlQmluZGluZyhvMTMsIG02LCBwNyk7Cn0KZnVuY3Rpb24gX192YWx1ZXMobzEzKSB7CiAgdmFyIHM5ID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG02ID0gczkgJiYgbzEzW3M5XSwgaTExID0gMDsKICBpZiAobTYpIHJldHVybiBtNi5jYWxsKG8xMyk7CiAgaWYgKG8xMyAmJiB0eXBlb2YgbzEzLmxlbmd0aCA9PT0gIm51bWJlciIpIHJldHVybiB7CiAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKG8xMyAmJiBpMTEgPj0gbzEzLmxlbmd0aCkgbzEzID0gdm9pZCAwOwogICAgICByZXR1cm4geyB2YWx1ZTogbzEzICYmIG8xM1tpMTErK10sIGRvbmU6ICFvMTMgfTsKICAgIH0KICB9OwogIHRocm93IG5ldyBUeXBlRXJyb3IoczkgPyAiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iIDogIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKfQpmdW5jdGlvbiBfX3JlYWQobzEzLCBuMTMpIHsKICB2YXIgbTYgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG8xM1tTeW1ib2wuaXRlcmF0b3JdOwogIGlmICghbTYpIHJldHVybiBvMTM7CiAgdmFyIGkxMSA9IG02LmNhbGwobzEzKSwgcjExLCBhciA9IFtdLCBlMTE7CiAgdHJ5IHsKICAgIHdoaWxlICgobjEzID09PSB2b2lkIDAgfHwgbjEzLS0gPiAwKSAmJiAhKHIxMSA9IGkxMS5uZXh0KCkpLmRvbmUpIGFyLnB1c2gocjExLnZhbHVlKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgZTExID0geyBlcnJvciB9OwogIH0gZmluYWxseSB7CiAgICB0cnkgewogICAgICBpZiAocjExICYmICFyMTEuZG9uZSAmJiAobTYgPSBpMTFbInJldHVybiJdKSkgbTYuY2FsbChpMTEpOwogICAgfSBmaW5hbGx5IHsKICAgICAgaWYgKGUxMSkgdGhyb3cgZTExLmVycm9yOwogICAgfQogIH0KICByZXR1cm4gYXI7Cn0KZnVuY3Rpb24gX19zcHJlYWQoKSB7CiAgZm9yICh2YXIgYXIgPSBbXSwgaTExID0gMDsgaTExIDwgYXJndW1lbnRzLmxlbmd0aDsgaTExKyspCiAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2kxMV0pKTsKICByZXR1cm4gYXI7Cn0KZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7CiAgZm9yICh2YXIgczkgPSAwLCBpMTEgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkxMSA8IGlsOyBpMTErKykgczkgKz0gYXJndW1lbnRzW2kxMV0ubGVuZ3RoOwogIGZvciAodmFyIHIxMSA9IEFycmF5KHM5KSwgazQgPSAwLCBpMTEgPSAwOyBpMTEgPCBpbDsgaTExKyspCiAgICBmb3IgKHZhciBhNSA9IGFyZ3VtZW50c1tpMTFdLCBqNCA9IDAsIGpsID0gYTUubGVuZ3RoOyBqNCA8IGpsOyBqNCsrLCBrNCsrKQogICAgICByMTFbazRdID0gYTVbajRdOwogIHJldHVybiByMTE7Cn0KZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bzIsIGZyb20yLCBwYWNrKSB7CiAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaTExID0gMCwgbDYgPSBmcm9tMi5sZW5ndGgsIGFyOyBpMTEgPCBsNjsgaTExKyspIHsKICAgIGlmIChhciB8fCAhKGkxMSBpbiBmcm9tMikpIHsKICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tMiwgMCwgaTExKTsKICAgICAgYXJbaTExXSA9IGZyb20yW2kxMV07CiAgICB9CiAgfQogIHJldHVybiB0bzIuY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20yKSk7Cn0KZnVuY3Rpb24gX19hd2FpdCh2NSkgewogIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2NSwgdGhpcykgOiBuZXcgX19hd2FpdCh2NSk7Cn0KZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHsKICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKICB2YXIgZzQgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGkxMSwgcTIgPSBbXTsKICByZXR1cm4gaTExID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09ICJmdW5jdGlvbiIgPyBBc3luY0l0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpLCB2ZXJiKCJuZXh0IiksIHZlcmIoInRocm93IiksIHZlcmIoInJldHVybiIsIGF3YWl0UmV0dXJuKSwgaTExW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSwgaTExOwogIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGY3KSB7CiAgICByZXR1cm4gZnVuY3Rpb24odjUpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2NSkudGhlbihmNywgcmVqZWN0KTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHZlcmIobjEzLCBmNykgewogICAgaWYgKGc0W24xM10pIHsKICAgICAgaTExW24xM10gPSBmdW5jdGlvbih2NSkgewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihhNSwgYjUpIHsKICAgICAgICAgIHEyLnB1c2goW24xMywgdjUsIGE1LCBiNV0pID4gMSB8fCByZXN1bWUobjEzLCB2NSk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIGlmIChmNykgaTExW24xM10gPSBmNyhpMTFbbjEzXSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHJlc3VtZShuMTMsIHY1KSB7CiAgICB0cnkgewogICAgICBzdGVwKGc0W24xM10odjUpKTsKICAgIH0gY2F0Y2ggKGUxMSkgewogICAgICBzZXR0bGUocTJbMF1bM10sIGUxMSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHN0ZXAocjExKSB7CiAgICByMTEudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIxMS52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocTJbMF1bMl0sIHIxMSk7CiAgfQogIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUyKSB7CiAgICByZXN1bWUoIm5leHQiLCB2YWx1ZTIpOwogIH0KICBmdW5jdGlvbiByZWplY3QodmFsdWUyKSB7CiAgICByZXN1bWUoInRocm93IiwgdmFsdWUyKTsKICB9CiAgZnVuY3Rpb24gc2V0dGxlKGY3LCB2NSkgewogICAgaWYgKGY3KHY1KSwgcTIuc2hpZnQoKSwgcTIubGVuZ3RoKSByZXN1bWUocTJbMF1bMF0sIHEyWzBdWzFdKTsKICB9Cn0KZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvMTMpIHsKICB2YXIgaTExLCBwNzsKICByZXR1cm4gaTExID0ge30sIHZlcmIoIm5leHQiKSwgdmVyYigidGhyb3ciLCBmdW5jdGlvbihlMTEpIHsKICAgIHRocm93IGUxMTsKICB9KSwgdmVyYigicmV0dXJuIiksIGkxMVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpczsKICB9LCBpMTE7CiAgZnVuY3Rpb24gdmVyYihuMTMsIGY3KSB7CiAgICBpMTFbbjEzXSA9IG8xM1tuMTNdID8gZnVuY3Rpb24odjUpIHsKICAgICAgcmV0dXJuIChwNyA9ICFwNykgPyB7IHZhbHVlOiBfX2F3YWl0KG8xM1tuMTNdKHY1KSksIGRvbmU6IGZhbHNlIH0gOiBmNyA/IGY3KHY1KSA6IHY1OwogICAgfSA6IGY3OwogIH0KfQpmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8xMykgewogIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpOwogIHZhciBtNiA9IG8xM1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGkxMTsKICByZXR1cm4gbTYgPyBtNi5jYWxsKG8xMykgOiAobzEzID0gdHlwZW9mIF9fdmFsdWVzID09PSAiZnVuY3Rpb24iID8gX192YWx1ZXMobzEzKSA6IG8xM1tTeW1ib2wuaXRlcmF0b3JdKCksIGkxMSA9IHt9LCB2ZXJiKCJuZXh0IiksIHZlcmIoInRocm93IiksIHZlcmIoInJldHVybiIpLCBpMTFbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpczsKICB9LCBpMTEpOwogIGZ1bmN0aW9uIHZlcmIobjEzKSB7CiAgICBpMTFbbjEzXSA9IG8xM1tuMTNdICYmIGZ1bmN0aW9uKHY1KSB7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlMiwgcmVqZWN0KSB7CiAgICAgICAgdjUgPSBvMTNbbjEzXSh2NSksIHNldHRsZShyZXNvbHZlMiwgcmVqZWN0LCB2NS5kb25lLCB2NS52YWx1ZSk7CiAgICAgIH0pOwogICAgfTsKICB9CiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUyLCByZWplY3QsIGQ2LCB2NSkgewogICAgUHJvbWlzZS5yZXNvbHZlKHY1KS50aGVuKGZ1bmN0aW9uKHY2KSB7CiAgICAgIHJlc29sdmUyKHsgdmFsdWU6IHY2LCBkb25lOiBkNiB9KTsKICAgIH0sIHJlamVjdCk7CiAgfQp9CmZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3MikgewogIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsICJyYXciLCB7IHZhbHVlOiByYXcyIH0pOwogIH0gZWxzZSB7CiAgICBjb29rZWQucmF3ID0gcmF3MjsKICB9CiAgcmV0dXJuIGNvb2tlZDsKfQpmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7CiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDsKICB2YXIgcmVzdWx0ID0ge307CiAgaWYgKG1vZCAhPSBudWxsKSB7CiAgICBmb3IgKHZhciBrNCA9IG93bktleXMobW9kKSwgaTExID0gMDsgaTExIDwgazQubGVuZ3RoOyBpMTErKykgaWYgKGs0W2kxMV0gIT09ICJkZWZhdWx0IikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrNFtpMTFdKTsKICB9CiAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTsKICByZXR1cm4gcmVzdWx0Owp9CmZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHsKICByZXR1cm4gbW9kICYmIG1vZC5fX2VzTW9kdWxlID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTsKfQpmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZTEwLCBraW5kLCBmNykgewogIGlmIChraW5kID09PSAiYSIgJiYgIWY3KSB0aHJvdyBuZXcgVHlwZUVycm9yKCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXIiKTsKICBpZiAodHlwZW9mIHN0YXRlMTAgPT09ICJmdW5jdGlvbiIgPyByZWNlaXZlciAhPT0gc3RhdGUxMCB8fCAhZjcgOiAhc3RhdGUxMC5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXQiKTsKICByZXR1cm4ga2luZCA9PT0gIm0iID8gZjcgOiBraW5kID09PSAiYSIgPyBmNy5jYWxsKHJlY2VpdmVyKSA6IGY3ID8gZjcudmFsdWUgOiBzdGF0ZTEwLmdldChyZWNlaXZlcik7Cn0KZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUxMCwgdmFsdWUyLCBraW5kLCBmNykgewogIGlmIChraW5kID09PSAibSIpIHRocm93IG5ldyBUeXBlRXJyb3IoIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZSIpOwogIGlmIChraW5kID09PSAiYSIgJiYgIWY3KSB0aHJvdyBuZXcgVHlwZUVycm9yKCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXIiKTsKICBpZiAodHlwZW9mIHN0YXRlMTAgPT09ICJmdW5jdGlvbiIgPyByZWNlaXZlciAhPT0gc3RhdGUxMCB8fCAhZjcgOiAhc3RhdGUxMC5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdCIpOwogIHJldHVybiBraW5kID09PSAiYSIgPyBmNy5jYWxsKHJlY2VpdmVyLCB2YWx1ZTIpIDogZjcgPyBmNy52YWx1ZSA9IHZhbHVlMiA6IHN0YXRlMTAuc2V0KHJlY2VpdmVyLCB2YWx1ZTIpLCB2YWx1ZTI7Cn0KZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlMTAsIHJlY2VpdmVyKSB7CiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8IHR5cGVvZiByZWNlaXZlciAhPT0gIm9iamVjdCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdCIpOwogIHJldHVybiB0eXBlb2Ygc3RhdGUxMCA9PT0gImZ1bmN0aW9uIiA/IHJlY2VpdmVyID09PSBzdGF0ZTEwIDogc3RhdGUxMC5oYXMocmVjZWl2ZXIpOwp9CmZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudjIsIHZhbHVlMiwgYXN5bmMyKSB7CiAgaWYgKHZhbHVlMiAhPT0gbnVsbCAmJiB2YWx1ZTIgIT09IHZvaWQgMCkgewogICAgaWYgKHR5cGVvZiB2YWx1ZTIgIT09ICJvYmplY3QiICYmIHR5cGVvZiB2YWx1ZTIgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZC4iKTsKICAgIHZhciBkaXNwb3NlLCBpbm5lcjsKICAgIGlmIChhc3luYzIpIHsKICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLiIpOwogICAgICBkaXNwb3NlID0gdmFsdWUyW1N5bWJvbC5hc3luY0Rpc3Bvc2VdOwogICAgfQogICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkgewogICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC4iKTsKICAgICAgZGlzcG9zZSA9IHZhbHVlMltTeW1ib2wuZGlzcG9zZV07CiAgICAgIGlmIChhc3luYzIpIGlubmVyID0gZGlzcG9zZTsKICAgIH0KICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLiIpOwogICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7CiAgICAgIHRyeSB7CiAgICAgICAgaW5uZXIuY2FsbCh0aGlzKTsKICAgICAgfSBjYXRjaCAoZTExKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUxMSk7CiAgICAgIH0KICAgIH07CiAgICBlbnYyLnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUyLCBkaXNwb3NlLCBhc3luYzogYXN5bmMyIH0pOwogIH0gZWxzZSBpZiAoYXN5bmMyKSB7CiAgICBlbnYyLnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTsKICB9CiAgcmV0dXJuIHZhbHVlMjsKfQpmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52MikgewogIGZ1bmN0aW9uIGZhaWwoZTExKSB7CiAgICBlbnYyLmVycm9yID0gZW52Mi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUxMSwgZW52Mi5lcnJvciwgIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC4iKSA6IGUxMTsKICAgIGVudjIuaGFzRXJyb3IgPSB0cnVlOwogIH0KICB2YXIgcjExLCBzOSA9IDA7CiAgZnVuY3Rpb24gbmV4dDIoKSB7CiAgICB3aGlsZSAocjExID0gZW52Mi5zdGFjay5wb3AoKSkgewogICAgICB0cnkgewogICAgICAgIGlmICghcjExLmFzeW5jICYmIHM5ID09PSAxKSByZXR1cm4gczkgPSAwLCBlbnYyLnN0YWNrLnB1c2gocjExKSwgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihuZXh0Mik7CiAgICAgICAgaWYgKHIxMS5kaXNwb3NlKSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gcjExLmRpc3Bvc2UuY2FsbChyMTEudmFsdWUpOwogICAgICAgICAgaWYgKHIxMS5hc3luYykgcmV0dXJuIHM5IHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dDIsIGZ1bmN0aW9uKGUxMSkgewogICAgICAgICAgICBmYWlsKGUxMSk7CiAgICAgICAgICAgIHJldHVybiBuZXh0MigpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHM5IHw9IDE7CiAgICAgIH0gY2F0Y2ggKGUxMSkgewogICAgICAgIGZhaWwoZTExKTsKICAgICAgfQogICAgfQogICAgaWYgKHM5ID09PSAxKSByZXR1cm4gZW52Mi5oYXNFcnJvciA/IFByb21pc2UucmVqZWN0KGVudjIuZXJyb3IpIDogUHJvbWlzZS5yZXNvbHZlKCk7CiAgICBpZiAoZW52Mi5oYXNFcnJvcikgdGhyb3cgZW52Mi5lcnJvcjsKICB9CiAgcmV0dXJuIG5leHQyKCk7Cn0KZnVuY3Rpb24gX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24ocGF0aDIsIHByZXNlcnZlSnN4KSB7CiAgaWYgKHR5cGVvZiBwYXRoMiA9PT0gInN0cmluZyIgJiYgL15cLlwuP1wvLy50ZXN0KHBhdGgyKSkgewogICAgcmV0dXJuIHBhdGgyLnJlcGxhY2UoL1wuKHRzeCkkfCgoPzpcLmQpPykoKD86XC5bXi4vXSs/KT8pXC4oW2NtXT8pdHMkL2ksIGZ1bmN0aW9uKG02LCB0c3gsIGQ2LCBleHQsIGNtKSB7CiAgICAgIHJldHVybiB0c3ggPyBwcmVzZXJ2ZUpzeCA/ICIuanN4IiA6ICIuanMiIDogZDYgJiYgKCFleHQgfHwgIWNtKSA/IG02IDogZDYgKyBleHQgKyAiLiIgKyBjbS50b0xvd2VyQ2FzZSgpICsgImpzIjsKICAgIH0pOwogIH0KICByZXR1cm4gcGF0aDI7Cn0KdmFyIGV4dGVuZFN0YXRpY3MsIF9fYXNzaWduLCBfX2NyZWF0ZUJpbmRpbmcsIF9fc2V0TW9kdWxlRGVmYXVsdCwgb3duS2V5cywgX1N1cHByZXNzZWRFcnJvciwgdHNsaWJfZXM2X2RlZmF1bHQ7CnZhciBpbml0X3RzbGliX2VzNiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3RzbGliQDIuOC4xL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIigpIHsKICAgIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkNiwgYjUpIHsKICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQ3LCBiNikgewogICAgICAgIGQ3Ll9fcHJvdG9fXyA9IGI2OwogICAgICB9IHx8IGZ1bmN0aW9uKGQ3LCBiNikgewogICAgICAgIGZvciAodmFyIHA3IGluIGI2KSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGI2LCBwNykpIGQ3W3A3XSA9IGI2W3A3XTsKICAgICAgfTsKICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZDYsIGI1KTsKICAgIH07CiAgICBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkgewogICAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24yKHQ5KSB7CiAgICAgICAgZm9yICh2YXIgczksIGkxMSA9IDEsIG4xMyA9IGFyZ3VtZW50cy5sZW5ndGg7IGkxMSA8IG4xMzsgaTExKyspIHsKICAgICAgICAgIHM5ID0gYXJndW1lbnRzW2kxMV07CiAgICAgICAgICBmb3IgKHZhciBwNyBpbiBzOSkgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzOSwgcDcpKSB0OVtwN10gPSBzOVtwN107CiAgICAgICAgfQogICAgICAgIHJldHVybiB0OTsKICAgICAgfTsKICAgICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogICAgOwogICAgOwogICAgOwogICAgOwogICAgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvMTMsIG02LCBrNCwgazIyKSB7CiAgICAgIGlmIChrMjIgPT09IHZvaWQgMCkgazIyID0gazQ7CiAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtNiwgazQpOwogICAgICBpZiAoIWRlc2MgfHwgKCJnZXQiIGluIGRlc2MgPyAhbTYuX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7CiAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBtNltrNF07CiAgICAgICAgfSB9OwogICAgICB9CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvMTMsIGsyMiwgZGVzYyk7CiAgICB9KSA6IChmdW5jdGlvbihvMTMsIG02LCBrNCwgazIyKSB7CiAgICAgIGlmIChrMjIgPT09IHZvaWQgMCkgazIyID0gazQ7CiAgICAgIG8xM1trMjJdID0gbTZbazRdOwogICAgfSk7CiAgICA7CiAgICBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8xMywgdjUpIHsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8xMywgImRlZmF1bHQiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2NSB9KTsKICAgIH0pIDogZnVuY3Rpb24obzEzLCB2NSkgewogICAgICBvMTNbImRlZmF1bHQiXSA9IHY1OwogICAgfTsKICAgIG93bktleXMgPSBmdW5jdGlvbihvMTMpIHsKICAgICAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uKG8xNCkgewogICAgICAgIHZhciBhciA9IFtdOwogICAgICAgIGZvciAodmFyIGs0IGluIG8xNCkgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvMTQsIGs0KSkgYXJbYXIubGVuZ3RoXSA9IGs0OwogICAgICAgIHJldHVybiBhcjsKICAgICAgfTsKICAgICAgcmV0dXJuIG93bktleXMobzEzKTsKICAgIH07CiAgICBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gImZ1bmN0aW9uIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlMikgewogICAgICB2YXIgZTExID0gbmV3IEVycm9yKG1lc3NhZ2UyKTsKICAgICAgcmV0dXJuIGUxMS5uYW1lID0gIlN1cHByZXNzZWRFcnJvciIsIGUxMS5lcnJvciA9IGVycm9yLCBlMTEuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGUxMTsKICAgIH07CiAgICB0c2xpYl9lczZfZGVmYXVsdCA9IHsKICAgICAgX19leHRlbmRzLAogICAgICBfX2Fzc2lnbiwKICAgICAgX19yZXN0LAogICAgICBfX2RlY29yYXRlLAogICAgICBfX3BhcmFtLAogICAgICBfX2VzRGVjb3JhdGUsCiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzOiBfX3J1bkluaXRpYWxpemVyczIsCiAgICAgIF9fcHJvcEtleSwKICAgICAgX19zZXRGdW5jdGlvbk5hbWUsCiAgICAgIF9fbWV0YWRhdGEsCiAgICAgIF9fYXdhaXRlciwKICAgICAgX19nZW5lcmF0b3IsCiAgICAgIF9fY3JlYXRlQmluZGluZywKICAgICAgX19leHBvcnRTdGFyLAogICAgICBfX3ZhbHVlcywKICAgICAgX19yZWFkLAogICAgICBfX3NwcmVhZCwKICAgICAgX19zcHJlYWRBcnJheXMsCiAgICAgIF9fc3ByZWFkQXJyYXksCiAgICAgIF9fYXdhaXQsCiAgICAgIF9fYXN5bmNHZW5lcmF0b3IsCiAgICAgIF9fYXN5bmNEZWxlZ2F0b3IsCiAgICAgIF9fYXN5bmNWYWx1ZXMsCiAgICAgIF9fbWFrZVRlbXBsYXRlT2JqZWN0LAogICAgICBfX2ltcG9ydFN0YXIsCiAgICAgIF9faW1wb3J0RGVmYXVsdCwKICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCwKICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCwKICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZEluLAogICAgICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSwKICAgICAgX19kaXNwb3NlUmVzb3VyY2VzLAogICAgICBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbgogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNGdW5jdGlvbi5qcwpmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlMikgewogIHJldHVybiB0eXBlb2YgdmFsdWUyID09PSAiZnVuY3Rpb24iOwp9CnZhciBpbml0X2lzRnVuY3Rpb24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzRnVuY3Rpb24uanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9jcmVhdGVFcnJvckNsYXNzLmpzCmZ1bmN0aW9uIGNyZWF0ZUVycm9yQ2xhc3MoY3JlYXRlSW1wbCkgewogIHZhciBfc3VwZXIgPSBmdW5jdGlvbihpbnN0YW5jZSkgewogICAgRXJyb3IuY2FsbChpbnN0YW5jZSk7CiAgICBpbnN0YW5jZS5zdGFjayA9IG5ldyBFcnJvcigpLnN0YWNrOwogIH07CiAgdmFyIGN0b3JGdW5jID0gY3JlYXRlSW1wbChfc3VwZXIpOwogIGN0b3JGdW5jLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTsKICBjdG9yRnVuYy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yRnVuYzsKICByZXR1cm4gY3RvckZ1bmM7Cn0KdmFyIGluaXRfY3JlYXRlRXJyb3JDbGFzcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvY3JlYXRlRXJyb3JDbGFzcy5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL1Vuc3Vic2NyaXB0aW9uRXJyb3IuanMKdmFyIFVuc3Vic2NyaXB0aW9uRXJyb3I7CnZhciBpbml0X1Vuc3Vic2NyaXB0aW9uRXJyb3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL1Vuc3Vic2NyaXB0aW9uRXJyb3IuanMiKCkgewogICAgaW5pdF9jcmVhdGVFcnJvckNsYXNzKCk7CiAgICBVbnN1YnNjcmlwdGlvbkVycm9yID0gY3JlYXRlRXJyb3JDbGFzcyhmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIFVuc3Vic2NyaXB0aW9uRXJyb3JJbXBsKGVycm9ycykgewogICAgICAgIF9zdXBlcih0aGlzKTsKICAgICAgICB0aGlzLm1lc3NhZ2UgPSBlcnJvcnMgPyBlcnJvcnMubGVuZ3RoICsgIiBlcnJvcnMgb2NjdXJyZWQgZHVyaW5nIHVuc3Vic2NyaXB0aW9uOlxuIiArIGVycm9ycy5tYXAoZnVuY3Rpb24oZXJyLCBpMTEpIHsKICAgICAgICAgIHJldHVybiBpMTEgKyAxICsgIikgIiArIGVyci50b1N0cmluZygpOwogICAgICAgIH0pLmpvaW4oIlxuICAiKSA6ICIiOwogICAgICAgIHRoaXMubmFtZSA9ICJVbnN1YnNjcmlwdGlvbkVycm9yIjsKICAgICAgICB0aGlzLmVycm9ycyA9IGVycm9yczsKICAgICAgfTsKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9hcnJSZW1vdmUuanMKZnVuY3Rpb24gYXJyUmVtb3ZlKGFyciwgaXRlbSkgewogIGlmIChhcnIpIHsKICAgIHZhciBpbmRleDIgPSBhcnIuaW5kZXhPZihpdGVtKTsKICAgIDAgPD0gaW5kZXgyICYmIGFyci5zcGxpY2UoaW5kZXgyLCAxKTsKICB9Cn0KdmFyIGluaXRfYXJyUmVtb3ZlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9hcnJSZW1vdmUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvU3Vic2NyaXB0aW9uLmpzCmZ1bmN0aW9uIGlzU3Vic2NyaXB0aW9uKHZhbHVlMikgewogIHJldHVybiB2YWx1ZTIgaW5zdGFuY2VvZiBTdWJzY3JpcHRpb24gfHwgdmFsdWUyICYmICJjbG9zZWQiIGluIHZhbHVlMiAmJiBpc0Z1bmN0aW9uKHZhbHVlMi5yZW1vdmUpICYmIGlzRnVuY3Rpb24odmFsdWUyLmFkZCkgJiYgaXNGdW5jdGlvbih2YWx1ZTIudW5zdWJzY3JpYmUpOwp9CmZ1bmN0aW9uIGV4ZWNGaW5hbGl6ZXIoZmluYWxpemVyKSB7CiAgaWYgKGlzRnVuY3Rpb24oZmluYWxpemVyKSkgewogICAgZmluYWxpemVyKCk7CiAgfSBlbHNlIHsKICAgIGZpbmFsaXplci51bnN1YnNjcmliZSgpOwogIH0KfQp2YXIgU3Vic2NyaXB0aW9uLCBFTVBUWV9TVUJTQ1JJUFRJT047CnZhciBpbml0X1N1YnNjcmlwdGlvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL1N1YnNjcmlwdGlvbi5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgaW5pdF9pc0Z1bmN0aW9uKCk7CiAgICBpbml0X1Vuc3Vic2NyaXB0aW9uRXJyb3IoKTsKICAgIGluaXRfYXJyUmVtb3ZlKCk7CiAgICBTdWJzY3JpcHRpb24gPSAoZnVuY3Rpb24oKSB7CiAgICAgIGZ1bmN0aW9uIFN1YnNjcmlwdGlvbjIoaW5pdGlhbFRlYXJkb3duKSB7CiAgICAgICAgdGhpcy5pbml0aWFsVGVhcmRvd24gPSBpbml0aWFsVGVhcmRvd247CiAgICAgICAgdGhpcy5jbG9zZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLl9wYXJlbnRhZ2UgPSBudWxsOwogICAgICAgIHRoaXMuX2ZpbmFsaXplcnMgPSBudWxsOwogICAgICB9CiAgICAgIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGVfMSwgX2ExMiwgZV8yLCBfYjsKICAgICAgICB2YXIgZXJyb3JzOwogICAgICAgIGlmICghdGhpcy5jbG9zZWQpIHsKICAgICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTsKICAgICAgICAgIHZhciBfcGFyZW50YWdlID0gdGhpcy5fcGFyZW50YWdlOwogICAgICAgICAgaWYgKF9wYXJlbnRhZ2UpIHsKICAgICAgICAgICAgdGhpcy5fcGFyZW50YWdlID0gbnVsbDsKICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoX3BhcmVudGFnZSkpIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgX3BhcmVudGFnZV8xID0gX192YWx1ZXMoX3BhcmVudGFnZSksIF9wYXJlbnRhZ2VfMV8xID0gX3BhcmVudGFnZV8xLm5leHQoKTsgIV9wYXJlbnRhZ2VfMV8xLmRvbmU7IF9wYXJlbnRhZ2VfMV8xID0gX3BhcmVudGFnZV8xLm5leHQoKSkgewogICAgICAgICAgICAgICAgICB2YXIgcGFyZW50XzEgPSBfcGFyZW50YWdlXzFfMS52YWx1ZTsKICAgICAgICAgICAgICAgICAgcGFyZW50XzEucmVtb3ZlKHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gY2F0Y2ggKGVfMV8xKSB7CiAgICAgICAgICAgICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OwogICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICBpZiAoX3BhcmVudGFnZV8xXzEgJiYgIV9wYXJlbnRhZ2VfMV8xLmRvbmUgJiYgKF9hMTIgPSBfcGFyZW50YWdlXzEucmV0dXJuKSkgX2ExMi5jYWxsKF9wYXJlbnRhZ2VfMSk7CiAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIF9wYXJlbnRhZ2UucmVtb3ZlKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgaW5pdGlhbEZpbmFsaXplciA9IHRoaXMuaW5pdGlhbFRlYXJkb3duOwogICAgICAgICAgaWYgKGlzRnVuY3Rpb24oaW5pdGlhbEZpbmFsaXplcikpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBpbml0aWFsRmluYWxpemVyKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUxMSkgewogICAgICAgICAgICAgIGVycm9ycyA9IGUxMSBpbnN0YW5jZW9mIFVuc3Vic2NyaXB0aW9uRXJyb3IgPyBlMTEuZXJyb3JzIDogW2UxMV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHZhciBfZmluYWxpemVycyA9IHRoaXMuX2ZpbmFsaXplcnM7CiAgICAgICAgICBpZiAoX2ZpbmFsaXplcnMpIHsKICAgICAgICAgICAgdGhpcy5fZmluYWxpemVycyA9IG51bGw7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgX2ZpbmFsaXplcnNfMSA9IF9fdmFsdWVzKF9maW5hbGl6ZXJzKSwgX2ZpbmFsaXplcnNfMV8xID0gX2ZpbmFsaXplcnNfMS5uZXh0KCk7ICFfZmluYWxpemVyc18xXzEuZG9uZTsgX2ZpbmFsaXplcnNfMV8xID0gX2ZpbmFsaXplcnNfMS5uZXh0KCkpIHsKICAgICAgICAgICAgICAgIHZhciBmaW5hbGl6ZXIgPSBfZmluYWxpemVyc18xXzEudmFsdWU7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICBleGVjRmluYWxpemVyKGZpbmFsaXplcik7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzICE9PSBudWxsICYmIGVycm9ycyAhPT0gdm9pZCAwID8gZXJyb3JzIDogW107CiAgICAgICAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBVbnN1YnNjcmlwdGlvbkVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoZXJyb3JzKSksIF9fcmVhZChlcnIuZXJyb3JzKSk7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goZXJyKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoZV8yXzEpIHsKICAgICAgICAgICAgICBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OwogICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoX2ZpbmFsaXplcnNfMV8xICYmICFfZmluYWxpemVyc18xXzEuZG9uZSAmJiAoX2IgPSBfZmluYWxpemVyc18xLnJldHVybikpIF9iLmNhbGwoX2ZpbmFsaXplcnNfMSk7CiAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChlcnJvcnMpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3Vic2NyaXB0aW9uRXJyb3IoZXJyb3JzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CiAgICAgIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKHRlYXJkb3duKSB7CiAgICAgICAgdmFyIF9hMTI7CiAgICAgICAgaWYgKHRlYXJkb3duICYmIHRlYXJkb3duICE9PSB0aGlzKSB7CiAgICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgICAgICAgZXhlY0ZpbmFsaXplcih0ZWFyZG93bik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAodGVhcmRvd24gaW5zdGFuY2VvZiBTdWJzY3JpcHRpb24yKSB7CiAgICAgICAgICAgICAgaWYgKHRlYXJkb3duLmNsb3NlZCB8fCB0ZWFyZG93bi5faGFzUGFyZW50KHRoaXMpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRlYXJkb3duLl9hZGRQYXJlbnQodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKHRoaXMuX2ZpbmFsaXplcnMgPSAoX2ExMiA9IHRoaXMuX2ZpbmFsaXplcnMpICE9PSBudWxsICYmIF9hMTIgIT09IHZvaWQgMCA/IF9hMTIgOiBbXSkucHVzaCh0ZWFyZG93bik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5faGFzUGFyZW50ID0gZnVuY3Rpb24ocGFyZW50KSB7CiAgICAgICAgdmFyIF9wYXJlbnRhZ2UgPSB0aGlzLl9wYXJlbnRhZ2U7CiAgICAgICAgcmV0dXJuIF9wYXJlbnRhZ2UgPT09IHBhcmVudCB8fCBBcnJheS5pc0FycmF5KF9wYXJlbnRhZ2UpICYmIF9wYXJlbnRhZ2UuaW5jbHVkZXMocGFyZW50KTsKICAgICAgfTsKICAgICAgU3Vic2NyaXB0aW9uMi5wcm90b3R5cGUuX2FkZFBhcmVudCA9IGZ1bmN0aW9uKHBhcmVudCkgewogICAgICAgIHZhciBfcGFyZW50YWdlID0gdGhpcy5fcGFyZW50YWdlOwogICAgICAgIHRoaXMuX3BhcmVudGFnZSA9IEFycmF5LmlzQXJyYXkoX3BhcmVudGFnZSkgPyAoX3BhcmVudGFnZS5wdXNoKHBhcmVudCksIF9wYXJlbnRhZ2UpIDogX3BhcmVudGFnZSA/IFtfcGFyZW50YWdlLCBwYXJlbnRdIDogcGFyZW50OwogICAgICB9OwogICAgICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5fcmVtb3ZlUGFyZW50ID0gZnVuY3Rpb24ocGFyZW50KSB7CiAgICAgICAgdmFyIF9wYXJlbnRhZ2UgPSB0aGlzLl9wYXJlbnRhZ2U7CiAgICAgICAgaWYgKF9wYXJlbnRhZ2UgPT09IHBhcmVudCkgewogICAgICAgICAgdGhpcy5fcGFyZW50YWdlID0gbnVsbDsKICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoX3BhcmVudGFnZSkpIHsKICAgICAgICAgIGFyclJlbW92ZShfcGFyZW50YWdlLCBwYXJlbnQpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgU3Vic2NyaXB0aW9uMi5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24odGVhcmRvd24pIHsKICAgICAgICB2YXIgX2ZpbmFsaXplcnMgPSB0aGlzLl9maW5hbGl6ZXJzOwogICAgICAgIF9maW5hbGl6ZXJzICYmIGFyclJlbW92ZShfZmluYWxpemVycywgdGVhcmRvd24pOwogICAgICAgIGlmICh0ZWFyZG93biBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbjIpIHsKICAgICAgICAgIHRlYXJkb3duLl9yZW1vdmVQYXJlbnQodGhpcyk7CiAgICAgICAgfQogICAgICB9OwogICAgICBTdWJzY3JpcHRpb24yLkVNUFRZID0gKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBlbXB0eTQgPSBuZXcgU3Vic2NyaXB0aW9uMigpOwogICAgICAgIGVtcHR5NC5jbG9zZWQgPSB0cnVlOwogICAgICAgIHJldHVybiBlbXB0eTQ7CiAgICAgIH0pKCk7CiAgICAgIHJldHVybiBTdWJzY3JpcHRpb24yOwogICAgfSkoKTsKICAgIEVNUFRZX1NVQlNDUklQVElPTiA9IFN1YnNjcmlwdGlvbi5FTVBUWTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL2NvbmZpZy5qcwp2YXIgY29uZmlnOwp2YXIgaW5pdF9jb25maWcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9jb25maWcuanMiKCkgewogICAgY29uZmlnID0gewogICAgICBvblVuaGFuZGxlZEVycm9yOiBudWxsLAogICAgICBvblN0b3BwZWROb3RpZmljYXRpb246IG51bGwsCiAgICAgIFByb21pc2U6IHZvaWQgMCwKICAgICAgdXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZzogZmFsc2UsCiAgICAgIHVzZURlcHJlY2F0ZWROZXh0Q29udGV4dDogZmFsc2UKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvdGltZW91dFByb3ZpZGVyLmpzCnZhciB0aW1lb3V0UHJvdmlkZXI7CnZhciBpbml0X3RpbWVvdXRQcm92aWRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci90aW1lb3V0UHJvdmlkZXIuanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIHRpbWVvdXRQcm92aWRlciA9IHsKICAgICAgc2V0VGltZW91dDogZnVuY3Rpb24oaGFuZGxlcjIsIHRpbWVvdXQyKSB7CiAgICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgICAgYXJnc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTsKICAgICAgICB9CiAgICAgICAgdmFyIGRlbGVnYXRlID0gdGltZW91dFByb3ZpZGVyLmRlbGVnYXRlOwogICAgICAgIGlmIChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUuc2V0VGltZW91dCkgewogICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnNldFRpbWVvdXQuYXBwbHkoZGVsZWdhdGUsIF9fc3ByZWFkQXJyYXkoW2hhbmRsZXIyLCB0aW1lb3V0Ml0sIF9fcmVhZChhcmdzKSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2V0VGltZW91dC5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW2hhbmRsZXIyLCB0aW1lb3V0Ml0sIF9fcmVhZChhcmdzKSkpOwogICAgICB9LAogICAgICBjbGVhclRpbWVvdXQ6IGZ1bmN0aW9uKGhhbmRsZTMpIHsKICAgICAgICB2YXIgZGVsZWdhdGUgPSB0aW1lb3V0UHJvdmlkZXIuZGVsZWdhdGU7CiAgICAgICAgcmV0dXJuICgoZGVsZWdhdGUgPT09IG51bGwgfHwgZGVsZWdhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGVnYXRlLmNsZWFyVGltZW91dCkgfHwgY2xlYXJUaW1lb3V0KShoYW5kbGUzKTsKICAgICAgfSwKICAgICAgZGVsZWdhdGU6IHZvaWQgMAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvcmVwb3J0VW5oYW5kbGVkRXJyb3IuanMKZnVuY3Rpb24gcmVwb3J0VW5oYW5kbGVkRXJyb3IoZXJyKSB7CiAgdGltZW91dFByb3ZpZGVyLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICB2YXIgb25VbmhhbmRsZWRFcnJvciA9IGNvbmZpZy5vblVuaGFuZGxlZEVycm9yOwogICAgaWYgKG9uVW5oYW5kbGVkRXJyb3IpIHsKICAgICAgb25VbmhhbmRsZWRFcnJvcihlcnIpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgZXJyOwogICAgfQogIH0pOwp9CnZhciBpbml0X3JlcG9ydFVuaGFuZGxlZEVycm9yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9yZXBvcnRVbmhhbmRsZWRFcnJvci5qcyIoKSB7CiAgICBpbml0X2NvbmZpZygpOwogICAgaW5pdF90aW1lb3V0UHJvdmlkZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvbm9vcC5qcwpmdW5jdGlvbiBub29wKCkgewp9CnZhciBpbml0X25vb3AgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL25vb3AuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvTm90aWZpY2F0aW9uRmFjdG9yaWVzLmpzCmZ1bmN0aW9uIGVycm9yTm90aWZpY2F0aW9uKGVycm9yKSB7CiAgcmV0dXJuIGNyZWF0ZU5vdGlmaWNhdGlvbigiRSIsIHZvaWQgMCwgZXJyb3IpOwp9CmZ1bmN0aW9uIG5leHROb3RpZmljYXRpb24odmFsdWUyKSB7CiAgcmV0dXJuIGNyZWF0ZU5vdGlmaWNhdGlvbigiTiIsIHZhbHVlMiwgdm9pZCAwKTsKfQpmdW5jdGlvbiBjcmVhdGVOb3RpZmljYXRpb24oa2luZCwgdmFsdWUyLCBlcnJvcikgewogIHJldHVybiB7CiAgICBraW5kLAogICAgdmFsdWU6IHZhbHVlMiwKICAgIGVycm9yCiAgfTsKfQp2YXIgQ09NUExFVEVfTk9USUZJQ0FUSU9OOwp2YXIgaW5pdF9Ob3RpZmljYXRpb25GYWN0b3JpZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9Ob3RpZmljYXRpb25GYWN0b3JpZXMuanMiKCkgewogICAgQ09NUExFVEVfTk9USUZJQ0FUSU9OID0gKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gY3JlYXRlTm90aWZpY2F0aW9uKCJDIiwgdm9pZCAwLCB2b2lkIDApOwogICAgfSkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvZXJyb3JDb250ZXh0LmpzCmZ1bmN0aW9uIGVycm9yQ29udGV4dChjYikgewogIGlmIChjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykgewogICAgdmFyIGlzUm9vdCA9ICFjb250ZXh0OwogICAgaWYgKGlzUm9vdCkgewogICAgICBjb250ZXh0ID0geyBlcnJvclRocm93bjogZmFsc2UsIGVycm9yOiBudWxsIH07CiAgICB9CiAgICBjYigpOwogICAgaWYgKGlzUm9vdCkgewogICAgICB2YXIgX2ExMiA9IGNvbnRleHQsIGVycm9yVGhyb3duID0gX2ExMi5lcnJvclRocm93biwgZXJyb3IgPSBfYTEyLmVycm9yOwogICAgICBjb250ZXh0ID0gbnVsbDsKICAgICAgaWYgKGVycm9yVGhyb3duKSB7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgIH0KICAgIH0KICB9IGVsc2UgewogICAgY2IoKTsKICB9Cn0KZnVuY3Rpb24gY2FwdHVyZUVycm9yKGVycikgewogIGlmIChjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZyAmJiBjb250ZXh0KSB7CiAgICBjb250ZXh0LmVycm9yVGhyb3duID0gdHJ1ZTsKICAgIGNvbnRleHQuZXJyb3IgPSBlcnI7CiAgfQp9CnZhciBjb250ZXh0Owp2YXIgaW5pdF9lcnJvckNvbnRleHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2Vycm9yQ29udGV4dC5qcyIoKSB7CiAgICBpbml0X2NvbmZpZygpOwogICAgY29udGV4dCA9IG51bGw7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9TdWJzY3JpYmVyLmpzCmZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHsKICByZXR1cm4gX2JpbmQuY2FsbChmbiwgdGhpc0FyZyk7Cn0KZnVuY3Rpb24gaGFuZGxlVW5oYW5kbGVkRXJyb3IoZXJyb3IpIHsKICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpIHsKICAgIGNhcHR1cmVFcnJvcihlcnJvcik7CiAgfSBlbHNlIHsKICAgIHJlcG9ydFVuaGFuZGxlZEVycm9yKGVycm9yKTsKICB9Cn0KZnVuY3Rpb24gZGVmYXVsdEVycm9ySGFuZGxlcihlcnIpIHsKICB0aHJvdyBlcnI7Cn0KZnVuY3Rpb24gaGFuZGxlU3RvcHBlZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIHN1YnNjcmliZXIpIHsKICB2YXIgb25TdG9wcGVkTm90aWZpY2F0aW9uID0gY29uZmlnLm9uU3RvcHBlZE5vdGlmaWNhdGlvbjsKICBvblN0b3BwZWROb3RpZmljYXRpb24gJiYgdGltZW91dFByb3ZpZGVyLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gb25TdG9wcGVkTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgc3Vic2NyaWJlcik7CiAgfSk7Cn0KdmFyIFN1YnNjcmliZXIsIF9iaW5kLCBDb25zdW1lck9ic2VydmVyLCBTYWZlU3Vic2NyaWJlciwgRU1QVFlfT0JTRVJWRVI7CnZhciBpbml0X1N1YnNjcmliZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9TdWJzY3JpYmVyLmpzIigpIHsKICAgIGluaXRfdHNsaWJfZXM2KCk7CiAgICBpbml0X2lzRnVuY3Rpb24oKTsKICAgIGluaXRfU3Vic2NyaXB0aW9uKCk7CiAgICBpbml0X2NvbmZpZygpOwogICAgaW5pdF9yZXBvcnRVbmhhbmRsZWRFcnJvcigpOwogICAgaW5pdF9ub29wKCk7CiAgICBpbml0X05vdGlmaWNhdGlvbkZhY3RvcmllcygpOwogICAgaW5pdF90aW1lb3V0UHJvdmlkZXIoKTsKICAgIGluaXRfZXJyb3JDb250ZXh0KCk7CiAgICBTdWJzY3JpYmVyID0gKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoU3Vic2NyaWJlcjIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIFN1YnNjcmliZXIyKGRlc3RpbmF0aW9uKSB7CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICBfdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTsKICAgICAgICBpZiAoZGVzdGluYXRpb24pIHsKICAgICAgICAgIF90aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247CiAgICAgICAgICBpZiAoaXNTdWJzY3JpcHRpb24oZGVzdGluYXRpb24pKSB7CiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmFkZChfdGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF90aGlzLmRlc3RpbmF0aW9uID0gRU1QVFlfT0JTRVJWRVI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfdGhpczsKICAgICAgfQogICAgICBTdWJzY3JpYmVyMi5jcmVhdGUgPSBmdW5jdGlvbihuZXh0MiwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICAgICAgcmV0dXJuIG5ldyBTYWZlU3Vic2NyaWJlcihuZXh0MiwgZXJyb3IsIGNvbXBsZXRlKTsKICAgICAgfTsKICAgICAgU3Vic2NyaWJlcjIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgIGhhbmRsZVN0b3BwZWROb3RpZmljYXRpb24obmV4dE5vdGlmaWNhdGlvbih2YWx1ZTIpLCB0aGlzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5fbmV4dCh2YWx1ZTIpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgU3Vic2NyaWJlcjIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKGVycm9yTm90aWZpY2F0aW9uKGVyciksIHRoaXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICAgICAgICB0aGlzLl9lcnJvcihlcnIpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgU3Vic2NyaWJlcjIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKENPTVBMRVRFX05PVElGSUNBVElPTiwgdGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuX2NvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICB9OwogICAgICBTdWJzY3JpYmVyMi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIXRoaXMuY2xvc2VkKSB7CiAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlLmNhbGwodGhpcyk7CiAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gbnVsbDsKICAgICAgICB9CiAgICAgIH07CiAgICAgIFN1YnNjcmliZXIyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uKHZhbHVlMikgewogICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZTIpOwogICAgICB9OwogICAgICBTdWJzY3JpYmVyMi5wcm90b3R5cGUuX2Vycm9yID0gZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgU3Vic2NyaWJlcjIucHJvdG90eXBlLl9jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJldHVybiBTdWJzY3JpYmVyMjsKICAgIH0pKFN1YnNjcmlwdGlvbik7CiAgICBfYmluZCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kOwogICAgQ29uc3VtZXJPYnNlcnZlciA9IChmdW5jdGlvbigpIHsKICAgICAgZnVuY3Rpb24gQ29uc3VtZXJPYnNlcnZlcjIocGFydGlhbE9ic2VydmVyKSB7CiAgICAgICAgdGhpcy5wYXJ0aWFsT2JzZXJ2ZXIgPSBwYXJ0aWFsT2JzZXJ2ZXI7CiAgICAgIH0KICAgICAgQ29uc3VtZXJPYnNlcnZlcjIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgICB2YXIgcGFydGlhbE9ic2VydmVyID0gdGhpcy5wYXJ0aWFsT2JzZXJ2ZXI7CiAgICAgICAgaWYgKHBhcnRpYWxPYnNlcnZlci5uZXh0KSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIubmV4dCh2YWx1ZTIpOwogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgaGFuZGxlVW5oYW5kbGVkRXJyb3IoZXJyb3IpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgQ29uc3VtZXJPYnNlcnZlcjIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgdmFyIHBhcnRpYWxPYnNlcnZlciA9IHRoaXMucGFydGlhbE9ic2VydmVyOwogICAgICAgIGlmIChwYXJ0aWFsT2JzZXJ2ZXIuZXJyb3IpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHBhcnRpYWxPYnNlcnZlci5lcnJvcihlcnIpOwogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgaGFuZGxlVW5oYW5kbGVkRXJyb3IoZXJyb3IpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBoYW5kbGVVbmhhbmRsZWRFcnJvcihlcnIpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ29uc3VtZXJPYnNlcnZlcjIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHBhcnRpYWxPYnNlcnZlciA9IHRoaXMucGFydGlhbE9ic2VydmVyOwogICAgICAgIGlmIChwYXJ0aWFsT2JzZXJ2ZXIuY29tcGxldGUpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHBhcnRpYWxPYnNlcnZlci5jb21wbGV0ZSgpOwogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgaGFuZGxlVW5oYW5kbGVkRXJyb3IoZXJyb3IpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIENvbnN1bWVyT2JzZXJ2ZXIyOwogICAgfSkoKTsKICAgIFNhZmVTdWJzY3JpYmVyID0gKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoU2FmZVN1YnNjcmliZXIyLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBTYWZlU3Vic2NyaWJlcjIob2JzZXJ2ZXJPck5leHQsIGVycm9yLCBjb21wbGV0ZSkgewogICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgdmFyIHBhcnRpYWxPYnNlcnZlcjsKICAgICAgICBpZiAoaXNGdW5jdGlvbihvYnNlcnZlck9yTmV4dCkgfHwgIW9ic2VydmVyT3JOZXh0KSB7CiAgICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIgPSB7CiAgICAgICAgICAgIG5leHQ6IG9ic2VydmVyT3JOZXh0ICE9PSBudWxsICYmIG9ic2VydmVyT3JOZXh0ICE9PSB2b2lkIDAgPyBvYnNlcnZlck9yTmV4dCA6IHZvaWQgMCwKICAgICAgICAgICAgZXJyb3I6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6IHZvaWQgMCwKICAgICAgICAgICAgY29tcGxldGU6IGNvbXBsZXRlICE9PSBudWxsICYmIGNvbXBsZXRlICE9PSB2b2lkIDAgPyBjb21wbGV0ZSA6IHZvaWQgMAogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGNvbnRleHRfMTsKICAgICAgICAgIGlmIChfdGhpcyAmJiBjb25maWcudXNlRGVwcmVjYXRlZE5leHRDb250ZXh0KSB7CiAgICAgICAgICAgIGNvbnRleHRfMSA9IE9iamVjdC5jcmVhdGUob2JzZXJ2ZXJPck5leHQpOwogICAgICAgICAgICBjb250ZXh0XzEudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICByZXR1cm4gX3RoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcGFydGlhbE9ic2VydmVyID0gewogICAgICAgICAgICAgIG5leHQ6IG9ic2VydmVyT3JOZXh0Lm5leHQgJiYgYmluZChvYnNlcnZlck9yTmV4dC5uZXh0LCBjb250ZXh0XzEpLAogICAgICAgICAgICAgIGVycm9yOiBvYnNlcnZlck9yTmV4dC5lcnJvciAmJiBiaW5kKG9ic2VydmVyT3JOZXh0LmVycm9yLCBjb250ZXh0XzEpLAogICAgICAgICAgICAgIGNvbXBsZXRlOiBvYnNlcnZlck9yTmV4dC5jb21wbGV0ZSAmJiBiaW5kKG9ic2VydmVyT3JOZXh0LmNvbXBsZXRlLCBjb250ZXh0XzEpCiAgICAgICAgICAgIH07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIgPSBvYnNlcnZlck9yTmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBuZXcgQ29uc3VtZXJPYnNlcnZlcihwYXJ0aWFsT2JzZXJ2ZXIpOwogICAgICAgIHJldHVybiBfdGhpczsKICAgICAgfQogICAgICByZXR1cm4gU2FmZVN1YnNjcmliZXIyOwogICAgfSkoU3Vic2NyaWJlcik7CiAgICBFTVBUWV9PQlNFUlZFUiA9IHsKICAgICAgY2xvc2VkOiB0cnVlLAogICAgICBuZXh0OiBub29wLAogICAgICBlcnJvcjogZGVmYXVsdEVycm9ySGFuZGxlciwKICAgICAgY29tcGxldGU6IG5vb3AKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zeW1ib2wvb2JzZXJ2YWJsZS5qcwp2YXIgb2JzZXJ2YWJsZTsKdmFyIGluaXRfb2JzZXJ2YWJsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3N5bWJvbC9vYnNlcnZhYmxlLmpzIigpIHsKICAgIG9ic2VydmFibGUgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5vYnNlcnZhYmxlIHx8ICJAQG9ic2VydmFibGUiOwogICAgfSkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaWRlbnRpdHkuanMKZnVuY3Rpb24gaWRlbnRpdHkoeDMpIHsKICByZXR1cm4geDM7Cn0KdmFyIGluaXRfaWRlbnRpdHkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lkZW50aXR5LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvcGlwZS5qcwpmdW5jdGlvbiBwaXBlKCkgewogIHZhciBmbnMgPSBbXTsKICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgZm5zW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgfQogIHJldHVybiBwaXBlRnJvbUFycmF5KGZucyk7Cn0KZnVuY3Rpb24gcGlwZUZyb21BcnJheShmbnMpIHsKICBpZiAoZm5zLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIGlkZW50aXR5OwogIH0KICBpZiAoZm5zLmxlbmd0aCA9PT0gMSkgewogICAgcmV0dXJuIGZuc1swXTsKICB9CiAgcmV0dXJuIGZ1bmN0aW9uIHBpcGVkKGlucHV0KSB7CiAgICByZXR1cm4gZm5zLnJlZHVjZShmdW5jdGlvbihwcmV2LCBmbikgewogICAgICByZXR1cm4gZm4ocHJldik7CiAgICB9LCBpbnB1dCk7CiAgfTsKfQp2YXIgaW5pdF9waXBlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9waXBlLmpzIigpIHsKICAgIGluaXRfaWRlbnRpdHkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL09ic2VydmFibGUuanMKZnVuY3Rpb24gZ2V0UHJvbWlzZUN0b3IocHJvbWlzZUN0b3IpIHsKICB2YXIgX2ExMjsKICByZXR1cm4gKF9hMTIgPSBwcm9taXNlQ3RvciAhPT0gbnVsbCAmJiBwcm9taXNlQ3RvciAhPT0gdm9pZCAwID8gcHJvbWlzZUN0b3IgOiBjb25maWcuUHJvbWlzZSkgIT09IG51bGwgJiYgX2ExMiAhPT0gdm9pZCAwID8gX2ExMiA6IFByb21pc2U7Cn0KZnVuY3Rpb24gaXNPYnNlcnZlcih2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyICYmIGlzRnVuY3Rpb24odmFsdWUyLm5leHQpICYmIGlzRnVuY3Rpb24odmFsdWUyLmVycm9yKSAmJiBpc0Z1bmN0aW9uKHZhbHVlMi5jb21wbGV0ZSk7Cn0KZnVuY3Rpb24gaXNTdWJzY3JpYmVyKHZhbHVlMikgewogIHJldHVybiB2YWx1ZTIgJiYgdmFsdWUyIGluc3RhbmNlb2YgU3Vic2NyaWJlciB8fCBpc09ic2VydmVyKHZhbHVlMikgJiYgaXNTdWJzY3JpcHRpb24odmFsdWUyKTsKfQp2YXIgT2JzZXJ2YWJsZTsKdmFyIGluaXRfT2JzZXJ2YWJsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL09ic2VydmFibGUuanMiKCkgewogICAgaW5pdF9TdWJzY3JpYmVyKCk7CiAgICBpbml0X1N1YnNjcmlwdGlvbigpOwogICAgaW5pdF9vYnNlcnZhYmxlKCk7CiAgICBpbml0X3BpcGUoKTsKICAgIGluaXRfY29uZmlnKCk7CiAgICBpbml0X2lzRnVuY3Rpb24oKTsKICAgIGluaXRfZXJyb3JDb250ZXh0KCk7CiAgICBPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKCkgewogICAgICBmdW5jdGlvbiBPYnNlcnZhYmxlMihzdWJzY3JpYmUyKSB7CiAgICAgICAgaWYgKHN1YnNjcmliZTIpIHsKICAgICAgICAgIHRoaXMuX3N1YnNjcmliZSA9IHN1YnNjcmliZTI7CiAgICAgICAgfQogICAgICB9CiAgICAgIE9ic2VydmFibGUyLnByb3RvdHlwZS5saWZ0ID0gZnVuY3Rpb24ob3BlcmF0b3IpIHsKICAgICAgICB2YXIgb2JzZXJ2YWJsZTIgPSBuZXcgT2JzZXJ2YWJsZTIoKTsKICAgICAgICBvYnNlcnZhYmxlMi5zb3VyY2UgPSB0aGlzOwogICAgICAgIG9ic2VydmFibGUyLm9wZXJhdG9yID0gb3BlcmF0b3I7CiAgICAgICAgcmV0dXJuIG9ic2VydmFibGUyOwogICAgICB9OwogICAgICBPYnNlcnZhYmxlMi5wcm90b3R5cGUuc3Vic2NyaWJlID0gZnVuY3Rpb24ob2JzZXJ2ZXJPck5leHQsIGVycm9yLCBjb21wbGV0ZSkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdmFyIHN1YnNjcmliZXIgPSBpc1N1YnNjcmliZXIob2JzZXJ2ZXJPck5leHQpID8gb2JzZXJ2ZXJPck5leHQgOiBuZXcgU2FmZVN1YnNjcmliZXIob2JzZXJ2ZXJPck5leHQsIGVycm9yLCBjb21wbGV0ZSk7CiAgICAgICAgZXJyb3JDb250ZXh0KGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIF9hMTIgPSBfdGhpcywgb3BlcmF0b3IgPSBfYTEyLm9wZXJhdG9yLCBzb3VyY2UgPSBfYTEyLnNvdXJjZTsKICAgICAgICAgIHN1YnNjcmliZXIuYWRkKG9wZXJhdG9yID8gb3BlcmF0b3IuY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIDogc291cmNlID8gX3RoaXMuX3N1YnNjcmliZShzdWJzY3JpYmVyKSA6IF90aGlzLl90cnlTdWJzY3JpYmUoc3Vic2NyaWJlcikpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBzdWJzY3JpYmVyOwogICAgICB9OwogICAgICBPYnNlcnZhYmxlMi5wcm90b3R5cGUuX3RyeVN1YnNjcmliZSA9IGZ1bmN0aW9uKHNpbmspIHsKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX3N1YnNjcmliZShzaW5rKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgIHNpbmsuZXJyb3IoZXJyKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIE9ic2VydmFibGUyLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24obmV4dDIsIHByb21pc2VDdG9yKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBwcm9taXNlQ3RvciA9IGdldFByb21pc2VDdG9yKHByb21pc2VDdG9yKTsKICAgICAgICByZXR1cm4gbmV3IHByb21pc2VDdG9yKGZ1bmN0aW9uKHJlc29sdmUyLCByZWplY3QpIHsKICAgICAgICAgIHZhciBzdWJzY3JpYmVyID0gbmV3IFNhZmVTdWJzY3JpYmVyKHsKICAgICAgICAgICAgbmV4dDogZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIG5leHQyKHZhbHVlMik7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgIHN1YnNjcmliZXIudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVycm9yOiByZWplY3QsCiAgICAgICAgICAgIGNvbXBsZXRlOiByZXNvbHZlMgogICAgICAgICAgfSk7CiAgICAgICAgICBfdGhpcy5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIE9ic2VydmFibGUyLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIHZhciBfYTEyOwogICAgICAgIHJldHVybiAoX2ExMiA9IHRoaXMuc291cmNlKSA9PT0gbnVsbCB8fCBfYTEyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTEyLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgICAgfTsKICAgICAgT2JzZXJ2YWJsZTIucHJvdG90eXBlW29ic2VydmFibGVdID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH07CiAgICAgIE9ic2VydmFibGUyLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG9wZXJhdGlvbnMgPSBbXTsKICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgICAgb3BlcmF0aW9uc1tfaV0gPSBhcmd1bWVudHNbX2ldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGlwZUZyb21BcnJheShvcGVyYXRpb25zKSh0aGlzKTsKICAgICAgfTsKICAgICAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLnRvUHJvbWlzZSA9IGZ1bmN0aW9uKHByb21pc2VDdG9yKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBwcm9taXNlQ3RvciA9IGdldFByb21pc2VDdG9yKHByb21pc2VDdG9yKTsKICAgICAgICByZXR1cm4gbmV3IHByb21pc2VDdG9yKGZ1bmN0aW9uKHJlc29sdmUyLCByZWplY3QpIHsKICAgICAgICAgIHZhciB2YWx1ZTI7CiAgICAgICAgICBfdGhpcy5zdWJzY3JpYmUoZnVuY3Rpb24oeDMpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlMiA9IHgzOwogICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTsKICAgICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gcmVzb2x2ZTIodmFsdWUyKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBPYnNlcnZhYmxlMi5jcmVhdGUgPSBmdW5jdGlvbihzdWJzY3JpYmUyKSB7CiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlMihzdWJzY3JpYmUyKTsKICAgICAgfTsKICAgICAgcmV0dXJuIE9ic2VydmFibGUyOwogICAgfSkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvbGlmdC5qcwpmdW5jdGlvbiBoYXNMaWZ0KHNvdXJjZSkgewogIHJldHVybiBpc0Z1bmN0aW9uKHNvdXJjZSA9PT0gbnVsbCB8fCBzb3VyY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNvdXJjZS5saWZ0KTsKfQpmdW5jdGlvbiBvcGVyYXRlKGluaXQpIHsKICByZXR1cm4gZnVuY3Rpb24oc291cmNlKSB7CiAgICBpZiAoaGFzTGlmdChzb3VyY2UpKSB7CiAgICAgIHJldHVybiBzb3VyY2UubGlmdChmdW5jdGlvbihsaWZ0ZWRTb3VyY2UpIHsKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIGluaXQobGlmdGVkU291cmNlLCB0aGlzKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgIHRoaXMuZXJyb3IoZXJyKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5hYmxlIHRvIGxpZnQgdW5rbm93biBPYnNlcnZhYmxlIHR5cGUiKTsKICB9Owp9CnZhciBpbml0X2xpZnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2xpZnQuanMiKCkgewogICAgaW5pdF9pc0Z1bmN0aW9uKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvT3BlcmF0b3JTdWJzY3JpYmVyLmpzCmZ1bmN0aW9uIGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgb25OZXh0LCBvbkNvbXBsZXRlLCBvbkVycm9yLCBvbkZpbmFsaXplKSB7CiAgcmV0dXJuIG5ldyBPcGVyYXRvclN1YnNjcmliZXIoZGVzdGluYXRpb24sIG9uTmV4dCwgb25Db21wbGV0ZSwgb25FcnJvciwgb25GaW5hbGl6ZSk7Cn0KdmFyIE9wZXJhdG9yU3Vic2NyaWJlcjsKdmFyIGluaXRfT3BlcmF0b3JTdWJzY3JpYmVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL09wZXJhdG9yU3Vic2NyaWJlci5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgaW5pdF9TdWJzY3JpYmVyKCk7CiAgICBPcGVyYXRvclN1YnNjcmliZXIgPSAoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhPcGVyYXRvclN1YnNjcmliZXIyLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBPcGVyYXRvclN1YnNjcmliZXIyKGRlc3RpbmF0aW9uLCBvbk5leHQsIG9uQ29tcGxldGUsIG9uRXJyb3IsIG9uRmluYWxpemUsIHNob3VsZFVuc3Vic2NyaWJlKSB7CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pIHx8IHRoaXM7CiAgICAgICAgX3RoaXMub25GaW5hbGl6ZSA9IG9uRmluYWxpemU7CiAgICAgICAgX3RoaXMuc2hvdWxkVW5zdWJzY3JpYmUgPSBzaG91bGRVbnN1YnNjcmliZTsKICAgICAgICBfdGhpcy5fbmV4dCA9IG9uTmV4dCA/IGZ1bmN0aW9uKHZhbHVlMikgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgb25OZXh0KHZhbHVlMik7CiAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICAgIH0KICAgICAgICB9IDogX3N1cGVyLnByb3RvdHlwZS5fbmV4dDsKICAgICAgICBfdGhpcy5fZXJyb3IgPSBvbkVycm9yID8gZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBvbkVycm9yKGVycik7CiAgICAgICAgICB9IGNhdGNoIChlcnIyKSB7CiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmVycm9yKGVycjIpOwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgICAgfQogICAgICAgIH0gOiBfc3VwZXIucHJvdG90eXBlLl9lcnJvcjsKICAgICAgICBfdGhpcy5fY29tcGxldGUgPSBvbkNvbXBsZXRlID8gZnVuY3Rpb24oKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBvbkNvbXBsZXRlKCk7CiAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgIH0KICAgICAgICB9IDogX3N1cGVyLnByb3RvdHlwZS5fY29tcGxldGU7CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIE9wZXJhdG9yU3Vic2NyaWJlcjIucHJvdG90eXBlLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIF9hMTI7CiAgICAgICAgaWYgKCF0aGlzLnNob3VsZFVuc3Vic2NyaWJlIHx8IHRoaXMuc2hvdWxkVW5zdWJzY3JpYmUoKSkgewogICAgICAgICAgdmFyIGNsb3NlZF8xID0gdGhpcy5jbG9zZWQ7CiAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlLmNhbGwodGhpcyk7CiAgICAgICAgICAhY2xvc2VkXzEgJiYgKChfYTEyID0gdGhpcy5vbkZpbmFsaXplKSA9PT0gbnVsbCB8fCBfYTEyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTEyLmNhbGwodGhpcykpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIE9wZXJhdG9yU3Vic2NyaWJlcjI7CiAgICB9KShTdWJzY3JpYmVyKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9yZWZDb3VudC5qcwpmdW5jdGlvbiByZWZDb3VudCgpIHsKICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHZhciBjb25uZWN0aW9uID0gbnVsbDsKICAgIHNvdXJjZS5fcmVmQ291bnQrKzsKICAgIHZhciByZWZDb3VudGVyID0gY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICBpZiAoIXNvdXJjZSB8fCBzb3VyY2UuX3JlZkNvdW50IDw9IDAgfHwgMCA8IC0tc291cmNlLl9yZWZDb3VudCkgewogICAgICAgIGNvbm5lY3Rpb24gPSBudWxsOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgc2hhcmVkQ29ubmVjdGlvbiA9IHNvdXJjZS5fY29ubmVjdGlvbjsKICAgICAgdmFyIGNvbm4gPSBjb25uZWN0aW9uOwogICAgICBjb25uZWN0aW9uID0gbnVsbDsKICAgICAgaWYgKHNoYXJlZENvbm5lY3Rpb24gJiYgKCFjb25uIHx8IHNoYXJlZENvbm5lY3Rpb24gPT09IGNvbm4pKSB7CiAgICAgICAgc2hhcmVkQ29ubmVjdGlvbi51bnN1YnNjcmliZSgpOwogICAgICB9CiAgICAgIHN1YnNjcmliZXIudW5zdWJzY3JpYmUoKTsKICAgIH0pOwogICAgc291cmNlLnN1YnNjcmliZShyZWZDb3VudGVyKTsKICAgIGlmICghcmVmQ291bnRlci5jbG9zZWQpIHsKICAgICAgY29ubmVjdGlvbiA9IHNvdXJjZS5jb25uZWN0KCk7CiAgICB9CiAgfSk7Cn0KdmFyIGluaXRfcmVmQ291bnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcmVmQ291bnQuanMiKCkgewogICAgaW5pdF9saWZ0KCk7CiAgICBpbml0X09wZXJhdG9yU3Vic2NyaWJlcigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9Db25uZWN0YWJsZU9ic2VydmFibGUuanMKdmFyIENvbm5lY3RhYmxlT2JzZXJ2YWJsZTsKdmFyIGluaXRfQ29ubmVjdGFibGVPYnNlcnZhYmxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9Db25uZWN0YWJsZU9ic2VydmFibGUuanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGluaXRfT2JzZXJ2YWJsZSgpOwogICAgaW5pdF9TdWJzY3JpcHRpb24oKTsKICAgIGluaXRfcmVmQ291bnQoKTsKICAgIGluaXRfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICBpbml0X2xpZnQoKTsKICAgIENvbm5lY3RhYmxlT2JzZXJ2YWJsZSA9IChmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKENvbm5lY3RhYmxlT2JzZXJ2YWJsZTIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIENvbm5lY3RhYmxlT2JzZXJ2YWJsZTIoc291cmNlLCBzdWJqZWN0RmFjdG9yeSkgewogICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgX3RoaXMuc291cmNlID0gc291cmNlOwogICAgICAgIF90aGlzLnN1YmplY3RGYWN0b3J5ID0gc3ViamVjdEZhY3Rvcnk7CiAgICAgICAgX3RoaXMuX3N1YmplY3QgPSBudWxsOwogICAgICAgIF90aGlzLl9yZWZDb3VudCA9IDA7CiAgICAgICAgX3RoaXMuX2Nvbm5lY3Rpb24gPSBudWxsOwogICAgICAgIGlmIChoYXNMaWZ0KHNvdXJjZSkpIHsKICAgICAgICAgIF90aGlzLmxpZnQgPSBzb3VyY2UubGlmdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIENvbm5lY3RhYmxlT2JzZXJ2YWJsZTIucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgICAgfTsKICAgICAgQ29ubmVjdGFibGVPYnNlcnZhYmxlMi5wcm90b3R5cGUuZ2V0U3ViamVjdCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzdWJqZWN0ID0gdGhpcy5fc3ViamVjdDsKICAgICAgICBpZiAoIXN1YmplY3QgfHwgc3ViamVjdC5pc1N0b3BwZWQpIHsKICAgICAgICAgIHRoaXMuX3N1YmplY3QgPSB0aGlzLnN1YmplY3RGYWN0b3J5KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9zdWJqZWN0OwogICAgICB9OwogICAgICBDb25uZWN0YWJsZU9ic2VydmFibGUyLnByb3RvdHlwZS5fdGVhcmRvd24gPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9yZWZDb3VudCA9IDA7CiAgICAgICAgdmFyIF9jb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbjsKICAgICAgICB0aGlzLl9zdWJqZWN0ID0gdGhpcy5fY29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgX2Nvbm5lY3Rpb24gPT09IG51bGwgfHwgX2Nvbm5lY3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jb25uZWN0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgIH07CiAgICAgIENvbm5lY3RhYmxlT2JzZXJ2YWJsZTIucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHZhciBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbjsKICAgICAgICBpZiAoIWNvbm5lY3Rpb24pIHsKICAgICAgICAgIGNvbm5lY3Rpb24gPSB0aGlzLl9jb25uZWN0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpOwogICAgICAgICAgdmFyIHN1YmplY3RfMSA9IHRoaXMuZ2V0U3ViamVjdCgpOwogICAgICAgICAgY29ubmVjdGlvbi5hZGQodGhpcy5zb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJqZWN0XzEsIHZvaWQgMCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIF90aGlzLl90ZWFyZG93bigpOwogICAgICAgICAgICBzdWJqZWN0XzEuY29tcGxldGUoKTsKICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICBfdGhpcy5fdGVhcmRvd24oKTsKICAgICAgICAgICAgc3ViamVjdF8xLmVycm9yKGVycik7CiAgICAgICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIF90aGlzLl90ZWFyZG93bigpOwogICAgICAgICAgfSkpKTsKICAgICAgICAgIGlmIChjb25uZWN0aW9uLmNsb3NlZCkgewogICAgICAgICAgICB0aGlzLl9jb25uZWN0aW9uID0gbnVsbDsKICAgICAgICAgICAgY29ubmVjdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247CiAgICAgIH07CiAgICAgIENvbm5lY3RhYmxlT2JzZXJ2YWJsZTIucHJvdG90eXBlLnJlZkNvdW50ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHJlZkNvdW50KCkodGhpcyk7CiAgICAgIH07CiAgICAgIHJldHVybiBDb25uZWN0YWJsZU9ic2VydmFibGUyOwogICAgfSkoT2JzZXJ2YWJsZSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvcGVyZm9ybWFuY2VUaW1lc3RhbXBQcm92aWRlci5qcwp2YXIgcGVyZm9ybWFuY2VUaW1lc3RhbXBQcm92aWRlcjsKdmFyIGluaXRfcGVyZm9ybWFuY2VUaW1lc3RhbXBQcm92aWRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9wZXJmb3JtYW5jZVRpbWVzdGFtcFByb3ZpZGVyLmpzIigpIHsKICAgIHBlcmZvcm1hbmNlVGltZXN0YW1wUHJvdmlkZXIgPSB7CiAgICAgIG5vdzogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIChwZXJmb3JtYW5jZVRpbWVzdGFtcFByb3ZpZGVyLmRlbGVnYXRlIHx8IHBlcmZvcm1hbmNlKS5ub3coKTsKICAgICAgfSwKICAgICAgZGVsZWdhdGU6IHZvaWQgMAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9hbmltYXRpb25GcmFtZVByb3ZpZGVyLmpzCnZhciBhbmltYXRpb25GcmFtZVByb3ZpZGVyOwp2YXIgaW5pdF9hbmltYXRpb25GcmFtZVByb3ZpZGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL2FuaW1hdGlvbkZyYW1lUHJvdmlkZXIuanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGluaXRfU3Vic2NyaXB0aW9uKCk7CiAgICBhbmltYXRpb25GcmFtZVByb3ZpZGVyID0gewogICAgICBzY2hlZHVsZTogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgICB2YXIgcmVxdWVzdCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZTsKICAgICAgICB2YXIgY2FuY2VsID0gY2FuY2VsQW5pbWF0aW9uRnJhbWU7CiAgICAgICAgdmFyIGRlbGVnYXRlID0gYW5pbWF0aW9uRnJhbWVQcm92aWRlci5kZWxlZ2F0ZTsKICAgICAgICBpZiAoZGVsZWdhdGUpIHsKICAgICAgICAgIHJlcXVlc3QgPSBkZWxlZ2F0ZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7CiAgICAgICAgICBjYW5jZWwgPSBkZWxlZ2F0ZS5jYW5jZWxBbmltYXRpb25GcmFtZTsKICAgICAgICB9CiAgICAgICAgdmFyIGhhbmRsZTMgPSByZXF1ZXN0KGZ1bmN0aW9uKHRpbWVzdGFtcDIpIHsKICAgICAgICAgIGNhbmNlbCA9IHZvaWQgMDsKICAgICAgICAgIGNhbGxiYWNrKHRpbWVzdGFtcDIpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGNhbmNlbCA9PT0gbnVsbCB8fCBjYW5jZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNhbmNlbChoYW5kbGUzKTsKICAgICAgICB9KTsKICAgICAgfSwKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYXJncyA9IFtdOwogICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgICAgfQogICAgICAgIHZhciBkZWxlZ2F0ZSA9IGFuaW1hdGlvbkZyYW1lUHJvdmlkZXIuZGVsZWdhdGU7CiAgICAgICAgcmV0dXJuICgoZGVsZWdhdGUgPT09IG51bGwgfHwgZGVsZWdhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGVnYXRlLnJlcXVlc3RBbmltYXRpb25GcmFtZSkgfHwgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKS5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChhcmdzKSkpOwogICAgICB9LAogICAgICBjYW5jZWxBbmltYXRpb25GcmFtZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldOwogICAgICAgIH0KICAgICAgICB2YXIgZGVsZWdhdGUgPSBhbmltYXRpb25GcmFtZVByb3ZpZGVyLmRlbGVnYXRlOwogICAgICAgIHJldHVybiAoKGRlbGVnYXRlID09PSBudWxsIHx8IGRlbGVnYXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWxlZ2F0ZS5jYW5jZWxBbmltYXRpb25GcmFtZSkgfHwgY2FuY2VsQW5pbWF0aW9uRnJhbWUpLmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGFyZ3MpKSk7CiAgICAgIH0sCiAgICAgIGRlbGVnYXRlOiB2b2lkIDAKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2RvbS9hbmltYXRpb25GcmFtZXMuanMKZnVuY3Rpb24gYW5pbWF0aW9uRnJhbWVzKHRpbWVzdGFtcFByb3ZpZGVyKSB7CiAgcmV0dXJuIHRpbWVzdGFtcFByb3ZpZGVyID8gYW5pbWF0aW9uRnJhbWVzRmFjdG9yeSh0aW1lc3RhbXBQcm92aWRlcikgOiBERUZBVUxUX0FOSU1BVElPTl9GUkFNRVM7Cn0KZnVuY3Rpb24gYW5pbWF0aW9uRnJhbWVzRmFjdG9yeSh0aW1lc3RhbXBQcm92aWRlcikgewogIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICB2YXIgcHJvdmlkZXIgPSB0aW1lc3RhbXBQcm92aWRlciB8fCBwZXJmb3JtYW5jZVRpbWVzdGFtcFByb3ZpZGVyOwogICAgdmFyIHN0YXJ0ID0gcHJvdmlkZXIubm93KCk7CiAgICB2YXIgaWQgPSAwOwogICAgdmFyIHJ1biA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgaWQgPSBhbmltYXRpb25GcmFtZVByb3ZpZGVyLnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbih0aW1lc3RhbXAyKSB7CiAgICAgICAgICBpZCA9IDA7CiAgICAgICAgICB2YXIgbm93MiA9IHByb3ZpZGVyLm5vdygpOwogICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHsKICAgICAgICAgICAgdGltZXN0YW1wOiB0aW1lc3RhbXBQcm92aWRlciA/IG5vdzIgOiB0aW1lc3RhbXAyLAogICAgICAgICAgICBlbGFwc2VkOiBub3cyIC0gc3RhcnQKICAgICAgICAgIH0pOwogICAgICAgICAgcnVuKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICBydW4oKTsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgaWYgKGlkKSB7CiAgICAgICAgYW5pbWF0aW9uRnJhbWVQcm92aWRlci5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CiAgICAgIH0KICAgIH07CiAgfSk7Cn0KdmFyIERFRkFVTFRfQU5JTUFUSU9OX0ZSQU1FUzsKdmFyIGluaXRfYW5pbWF0aW9uRnJhbWVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9kb20vYW5pbWF0aW9uRnJhbWVzLmpzIigpIHsKICAgIGluaXRfT2JzZXJ2YWJsZSgpOwogICAgaW5pdF9wZXJmb3JtYW5jZVRpbWVzdGFtcFByb3ZpZGVyKCk7CiAgICBpbml0X2FuaW1hdGlvbkZyYW1lUHJvdmlkZXIoKTsKICAgIERFRkFVTFRfQU5JTUFUSU9OX0ZSQU1FUyA9IGFuaW1hdGlvbkZyYW1lc0ZhY3RvcnkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IuanMKdmFyIE9iamVjdFVuc3Vic2NyaWJlZEVycm9yOwp2YXIgaW5pdF9PYmplY3RVbnN1YnNjcmliZWRFcnJvciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IuanMiKCkgewogICAgaW5pdF9jcmVhdGVFcnJvckNsYXNzKCk7CiAgICBPYmplY3RVbnN1YnNjcmliZWRFcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3MoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiBPYmplY3RVbnN1YnNjcmliZWRFcnJvckltcGwoKSB7CiAgICAgICAgX3N1cGVyKHRoaXMpOwogICAgICAgIHRoaXMubmFtZSA9ICJPYmplY3RVbnN1YnNjcmliZWRFcnJvciI7CiAgICAgICAgdGhpcy5tZXNzYWdlID0gIm9iamVjdCB1bnN1YnNjcmliZWQiOwogICAgICB9OwogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9TdWJqZWN0LmpzCnZhciBTdWJqZWN0LCBBbm9ueW1vdXNTdWJqZWN0Owp2YXIgaW5pdF9TdWJqZWN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvU3ViamVjdC5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgaW5pdF9PYnNlcnZhYmxlKCk7CiAgICBpbml0X1N1YnNjcmlwdGlvbigpOwogICAgaW5pdF9PYmplY3RVbnN1YnNjcmliZWRFcnJvcigpOwogICAgaW5pdF9hcnJSZW1vdmUoKTsKICAgIGluaXRfZXJyb3JDb250ZXh0KCk7CiAgICBTdWJqZWN0ID0gKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoU3ViamVjdDIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIFN1YmplY3QyKCkgewogICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgX3RoaXMuY2xvc2VkID0gZmFsc2U7CiAgICAgICAgX3RoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7CiAgICAgICAgX3RoaXMub2JzZXJ2ZXJzID0gW107CiAgICAgICAgX3RoaXMuaXNTdG9wcGVkID0gZmFsc2U7CiAgICAgICAgX3RoaXMuaGFzRXJyb3IgPSBmYWxzZTsKICAgICAgICBfdGhpcy50aHJvd25FcnJvciA9IG51bGw7CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIFN1YmplY3QyLnByb3RvdHlwZS5saWZ0ID0gZnVuY3Rpb24ob3BlcmF0b3IpIHsKICAgICAgICB2YXIgc3ViamVjdCA9IG5ldyBBbm9ueW1vdXNTdWJqZWN0KHRoaXMsIHRoaXMpOwogICAgICAgIHN1YmplY3Qub3BlcmF0b3IgPSBvcGVyYXRvcjsKICAgICAgICByZXR1cm4gc3ViamVjdDsKICAgICAgfTsKICAgICAgU3ViamVjdDIucHJvdG90eXBlLl90aHJvd0lmQ2xvc2VkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IoKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIFN1YmplY3QyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBlcnJvckNvbnRleHQoZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgZV8xLCBfYTEyOwogICAgICAgICAgX3RoaXMuX3Rocm93SWZDbG9zZWQoKTsKICAgICAgICAgIGlmICghX3RoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICAgIGlmICghX3RoaXMuY3VycmVudE9ic2VydmVycykgewogICAgICAgICAgICAgIF90aGlzLmN1cnJlbnRPYnNlcnZlcnMgPSBBcnJheS5mcm9tKF90aGlzLm9ic2VydmVycyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKF90aGlzLmN1cnJlbnRPYnNlcnZlcnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7CiAgICAgICAgICAgICAgICB2YXIgb2JzZXJ2ZXIgPSBfYy52YWx1ZTsKICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQodmFsdWUyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKGVfMV8xKSB7CiAgICAgICAgICAgICAgZV8xID0geyBlcnJvcjogZV8xXzEgfTsKICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYTEyID0gX2IucmV0dXJuKSkgX2ExMi5jYWxsKF9iKTsKICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9OwogICAgICBTdWJqZWN0Mi5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbihlcnIpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIGVycm9yQ29udGV4dChmdW5jdGlvbigpIHsKICAgICAgICAgIF90aGlzLl90aHJvd0lmQ2xvc2VkKCk7CiAgICAgICAgICBpZiAoIV90aGlzLmlzU3RvcHBlZCkgewogICAgICAgICAgICBfdGhpcy5oYXNFcnJvciA9IF90aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICAgICAgICAgIF90aGlzLnRocm93bkVycm9yID0gZXJyOwogICAgICAgICAgICB2YXIgb2JzZXJ2ZXJzID0gX3RoaXMub2JzZXJ2ZXJzOwogICAgICAgICAgICB3aGlsZSAob2JzZXJ2ZXJzLmxlbmd0aCkgewogICAgICAgICAgICAgIG9ic2VydmVycy5zaGlmdCgpLmVycm9yKGVycik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfTsKICAgICAgU3ViamVjdDIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBlcnJvckNvbnRleHQoZnVuY3Rpb24oKSB7CiAgICAgICAgICBfdGhpcy5fdGhyb3dJZkNsb3NlZCgpOwogICAgICAgICAgaWYgKCFfdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgX3RoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgICAgICAgdmFyIG9ic2VydmVycyA9IF90aGlzLm9ic2VydmVyczsKICAgICAgICAgICAgd2hpbGUgKG9ic2VydmVycy5sZW5ndGgpIHsKICAgICAgICAgICAgICBvYnNlcnZlcnMuc2hpZnQoKS5jb21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIFN1YmplY3QyLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdGhpcy5jbG9zZWQgPSB0cnVlOwogICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gdGhpcy5jdXJyZW50T2JzZXJ2ZXJzID0gbnVsbDsKICAgICAgfTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN1YmplY3QyLnByb3RvdHlwZSwgIm9ic2VydmVkIiwgewogICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgX2ExMjsKICAgICAgICAgIHJldHVybiAoKF9hMTIgPSB0aGlzLm9ic2VydmVycykgPT09IG51bGwgfHwgX2ExMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ExMi5sZW5ndGgpID4gMDsKICAgICAgICB9LAogICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9KTsKICAgICAgU3ViamVjdDIucHJvdG90eXBlLl90cnlTdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgdGhpcy5fdGhyb3dJZkNsb3NlZCgpOwogICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLl90cnlTdWJzY3JpYmUuY2FsbCh0aGlzLCBzdWJzY3JpYmVyKTsKICAgICAgfTsKICAgICAgU3ViamVjdDIucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgdGhpcy5fdGhyb3dJZkNsb3NlZCgpOwogICAgICAgIHRoaXMuX2NoZWNrRmluYWxpemVkU3RhdHVzZXMoc3Vic2NyaWJlcik7CiAgICAgICAgcmV0dXJuIHRoaXMuX2lubmVyU3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICB9OwogICAgICBTdWJqZWN0Mi5wcm90b3R5cGUuX2lubmVyU3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdmFyIF9hMTIgPSB0aGlzLCBoYXNFcnJvciA9IF9hMTIuaGFzRXJyb3IsIGlzU3RvcHBlZCA9IF9hMTIuaXNTdG9wcGVkLCBvYnNlcnZlcnMgPSBfYTEyLm9ic2VydmVyczsKICAgICAgICBpZiAoaGFzRXJyb3IgfHwgaXNTdG9wcGVkKSB7CiAgICAgICAgICByZXR1cm4gRU1QVFlfU1VCU0NSSVBUSU9OOwogICAgICAgIH0KICAgICAgICB0aGlzLmN1cnJlbnRPYnNlcnZlcnMgPSBudWxsOwogICAgICAgIG9ic2VydmVycy5wdXNoKHN1YnNjcmliZXIpOwogICAgICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKGZ1bmN0aW9uKCkgewogICAgICAgICAgX3RoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7CiAgICAgICAgICBhcnJSZW1vdmUob2JzZXJ2ZXJzLCBzdWJzY3JpYmVyKTsKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgU3ViamVjdDIucHJvdG90eXBlLl9jaGVja0ZpbmFsaXplZFN0YXR1c2VzID0gZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIHZhciBfYTEyID0gdGhpcywgaGFzRXJyb3IgPSBfYTEyLmhhc0Vycm9yLCB0aHJvd25FcnJvciA9IF9hMTIudGhyb3duRXJyb3IsIGlzU3RvcHBlZCA9IF9hMTIuaXNTdG9wcGVkOwogICAgICAgIGlmIChoYXNFcnJvcikgewogICAgICAgICAgc3Vic2NyaWJlci5lcnJvcih0aHJvd25FcnJvcik7CiAgICAgICAgfSBlbHNlIGlmIChpc1N0b3BwZWQpIHsKICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIFN1YmplY3QyLnByb3RvdHlwZS5hc09ic2VydmFibGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgb2JzZXJ2YWJsZTIgPSBuZXcgT2JzZXJ2YWJsZSgpOwogICAgICAgIG9ic2VydmFibGUyLnNvdXJjZSA9IHRoaXM7CiAgICAgICAgcmV0dXJuIG9ic2VydmFibGUyOwogICAgICB9OwogICAgICBTdWJqZWN0Mi5jcmVhdGUgPSBmdW5jdGlvbihkZXN0aW5hdGlvbiwgc291cmNlKSB7CiAgICAgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNTdWJqZWN0KGRlc3RpbmF0aW9uLCBzb3VyY2UpOwogICAgICB9OwogICAgICByZXR1cm4gU3ViamVjdDI7CiAgICB9KShPYnNlcnZhYmxlKTsKICAgIEFub255bW91c1N1YmplY3QgPSAoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhBbm9ueW1vdXNTdWJqZWN0MiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gQW5vbnltb3VzU3ViamVjdDIoZGVzdGluYXRpb24sIHNvdXJjZSkgewogICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKICAgICAgICBfdGhpcy5zb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIEFub255bW91c1N1YmplY3QyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgICAgdmFyIF9hMTIsIF9iOwogICAgICAgIChfYiA9IChfYTEyID0gdGhpcy5kZXN0aW5hdGlvbikgPT09IG51bGwgfHwgX2ExMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ExMi5uZXh0KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYTEyLCB2YWx1ZTIpOwogICAgICB9OwogICAgICBBbm9ueW1vdXNTdWJqZWN0Mi5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbihlcnIpIHsKICAgICAgICB2YXIgX2ExMiwgX2I7CiAgICAgICAgKF9iID0gKF9hMTIgPSB0aGlzLmRlc3RpbmF0aW9uKSA9PT0gbnVsbCB8fCBfYTEyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTEyLmVycm9yKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYTEyLCBlcnIpOwogICAgICB9OwogICAgICBBbm9ueW1vdXNTdWJqZWN0Mi5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2ExMiwgX2I7CiAgICAgICAgKF9iID0gKF9hMTIgPSB0aGlzLmRlc3RpbmF0aW9uKSA9PT0gbnVsbCB8fCBfYTEyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTEyLmNvbXBsZXRlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYTEyKTsKICAgICAgfTsKICAgICAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIF9hMTIsIF9iOwogICAgICAgIHJldHVybiAoX2IgPSAoX2ExMiA9IHRoaXMuc291cmNlKSA9PT0gbnVsbCB8fCBfYTEyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTEyLnN1YnNjcmliZShzdWJzY3JpYmVyKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogRU1QVFlfU1VCU0NSSVBUSU9OOwogICAgICB9OwogICAgICByZXR1cm4gQW5vbnltb3VzU3ViamVjdDI7CiAgICB9KShTdWJqZWN0KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL0JlaGF2aW9yU3ViamVjdC5qcwp2YXIgQmVoYXZpb3JTdWJqZWN0Owp2YXIgaW5pdF9CZWhhdmlvclN1YmplY3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9CZWhhdmlvclN1YmplY3QuanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGluaXRfU3ViamVjdCgpOwogICAgQmVoYXZpb3JTdWJqZWN0ID0gKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoQmVoYXZpb3JTdWJqZWN0MiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gQmVoYXZpb3JTdWJqZWN0MihfdmFsdWUpIHsKICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgIF90aGlzLl92YWx1ZSA9IF92YWx1ZTsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJlaGF2aW9yU3ViamVjdDIucHJvdG90eXBlLCAidmFsdWUiLCB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlKCk7CiAgICAgICAgfSwKICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICAgIEJlaGF2aW9yU3ViamVjdDIucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IF9zdXBlci5wcm90b3R5cGUuX3N1YnNjcmliZS5jYWxsKHRoaXMsIHN1YnNjcmliZXIpOwogICAgICAgICFzdWJzY3JpcHRpb24uY2xvc2VkICYmIHN1YnNjcmliZXIubmV4dCh0aGlzLl92YWx1ZSk7CiAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICAgICAgfTsKICAgICAgQmVoYXZpb3JTdWJqZWN0Mi5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2ExMiA9IHRoaXMsIGhhc0Vycm9yID0gX2ExMi5oYXNFcnJvciwgdGhyb3duRXJyb3IgPSBfYTEyLnRocm93bkVycm9yLCBfdmFsdWUgPSBfYTEyLl92YWx1ZTsKICAgICAgICBpZiAoaGFzRXJyb3IpIHsKICAgICAgICAgIHRocm93IHRocm93bkVycm9yOwogICAgICAgIH0KICAgICAgICB0aGlzLl90aHJvd0lmQ2xvc2VkKCk7CiAgICAgICAgcmV0dXJuIF92YWx1ZTsKICAgICAgfTsKICAgICAgQmVoYXZpb3JTdWJqZWN0Mi5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHZhbHVlMikgewogICAgICAgIF9zdXBlci5wcm90b3R5cGUubmV4dC5jYWxsKHRoaXMsIHRoaXMuX3ZhbHVlID0gdmFsdWUyKTsKICAgICAgfTsKICAgICAgcmV0dXJuIEJlaGF2aW9yU3ViamVjdDI7CiAgICB9KShTdWJqZWN0KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9kYXRlVGltZXN0YW1wUHJvdmlkZXIuanMKdmFyIGRhdGVUaW1lc3RhbXBQcm92aWRlcjsKdmFyIGluaXRfZGF0ZVRpbWVzdGFtcFByb3ZpZGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL2RhdGVUaW1lc3RhbXBQcm92aWRlci5qcyIoKSB7CiAgICBkYXRlVGltZXN0YW1wUHJvdmlkZXIgPSB7CiAgICAgIG5vdzogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIChkYXRlVGltZXN0YW1wUHJvdmlkZXIuZGVsZWdhdGUgfHwgRGF0ZSkubm93KCk7CiAgICAgIH0sCiAgICAgIGRlbGVnYXRlOiB2b2lkIDAKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9SZXBsYXlTdWJqZWN0LmpzCnZhciBSZXBsYXlTdWJqZWN0Owp2YXIgaW5pdF9SZXBsYXlTdWJqZWN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvUmVwbGF5U3ViamVjdC5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgaW5pdF9TdWJqZWN0KCk7CiAgICBpbml0X2RhdGVUaW1lc3RhbXBQcm92aWRlcigpOwogICAgUmVwbGF5U3ViamVjdCA9IChmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKFJlcGxheVN1YmplY3QyLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBSZXBsYXlTdWJqZWN0MihfYnVmZmVyU2l6ZSwgX3dpbmRvd1RpbWUsIF90aW1lc3RhbXBQcm92aWRlcikgewogICAgICAgIGlmIChfYnVmZmVyU2l6ZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBfYnVmZmVyU2l6ZSA9IEluZmluaXR5OwogICAgICAgIH0KICAgICAgICBpZiAoX3dpbmRvd1RpbWUgPT09IHZvaWQgMCkgewogICAgICAgICAgX3dpbmRvd1RpbWUgPSBJbmZpbml0eTsKICAgICAgICB9CiAgICAgICAgaWYgKF90aW1lc3RhbXBQcm92aWRlciA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBfdGltZXN0YW1wUHJvdmlkZXIgPSBkYXRlVGltZXN0YW1wUHJvdmlkZXI7CiAgICAgICAgfQogICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgX3RoaXMuX2J1ZmZlclNpemUgPSBfYnVmZmVyU2l6ZTsKICAgICAgICBfdGhpcy5fd2luZG93VGltZSA9IF93aW5kb3dUaW1lOwogICAgICAgIF90aGlzLl90aW1lc3RhbXBQcm92aWRlciA9IF90aW1lc3RhbXBQcm92aWRlcjsKICAgICAgICBfdGhpcy5fYnVmZmVyID0gW107CiAgICAgICAgX3RoaXMuX2luZmluaXRlVGltZVdpbmRvdyA9IHRydWU7CiAgICAgICAgX3RoaXMuX2luZmluaXRlVGltZVdpbmRvdyA9IF93aW5kb3dUaW1lID09PSBJbmZpbml0eTsKICAgICAgICBfdGhpcy5fYnVmZmVyU2l6ZSA9IE1hdGgubWF4KDEsIF9idWZmZXJTaXplKTsKICAgICAgICBfdGhpcy5fd2luZG93VGltZSA9IE1hdGgubWF4KDEsIF93aW5kb3dUaW1lKTsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgUmVwbGF5U3ViamVjdDIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgICB2YXIgX2ExMiA9IHRoaXMsIGlzU3RvcHBlZCA9IF9hMTIuaXNTdG9wcGVkLCBfYnVmZmVyID0gX2ExMi5fYnVmZmVyLCBfaW5maW5pdGVUaW1lV2luZG93ID0gX2ExMi5faW5maW5pdGVUaW1lV2luZG93LCBfdGltZXN0YW1wUHJvdmlkZXIgPSBfYTEyLl90aW1lc3RhbXBQcm92aWRlciwgX3dpbmRvd1RpbWUgPSBfYTEyLl93aW5kb3dUaW1lOwogICAgICAgIGlmICghaXNTdG9wcGVkKSB7CiAgICAgICAgICBfYnVmZmVyLnB1c2godmFsdWUyKTsKICAgICAgICAgICFfaW5maW5pdGVUaW1lV2luZG93ICYmIF9idWZmZXIucHVzaChfdGltZXN0YW1wUHJvdmlkZXIubm93KCkgKyBfd2luZG93VGltZSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3RyaW1CdWZmZXIoKTsKICAgICAgICBfc3VwZXIucHJvdG90eXBlLm5leHQuY2FsbCh0aGlzLCB2YWx1ZTIpOwogICAgICB9OwogICAgICBSZXBsYXlTdWJqZWN0Mi5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgICAgICB0aGlzLl90aHJvd0lmQ2xvc2VkKCk7CiAgICAgICAgdGhpcy5fdHJpbUJ1ZmZlcigpOwogICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGlzLl9pbm5lclN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgICAgICB2YXIgX2ExMiA9IHRoaXMsIF9pbmZpbml0ZVRpbWVXaW5kb3cgPSBfYTEyLl9pbmZpbml0ZVRpbWVXaW5kb3csIF9idWZmZXIgPSBfYTEyLl9idWZmZXI7CiAgICAgICAgdmFyIGNvcHkgPSBfYnVmZmVyLnNsaWNlKCk7CiAgICAgICAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgY29weS5sZW5ndGggJiYgIXN1YnNjcmliZXIuY2xvc2VkOyBpMTEgKz0gX2luZmluaXRlVGltZVdpbmRvdyA/IDEgOiAyKSB7CiAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoY29weVtpMTFdKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fY2hlY2tGaW5hbGl6ZWRTdGF0dXNlcyhzdWJzY3JpYmVyKTsKICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwogICAgICB9OwogICAgICBSZXBsYXlTdWJqZWN0Mi5wcm90b3R5cGUuX3RyaW1CdWZmZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2ExMiA9IHRoaXMsIF9idWZmZXJTaXplID0gX2ExMi5fYnVmZmVyU2l6ZSwgX3RpbWVzdGFtcFByb3ZpZGVyID0gX2ExMi5fdGltZXN0YW1wUHJvdmlkZXIsIF9idWZmZXIgPSBfYTEyLl9idWZmZXIsIF9pbmZpbml0ZVRpbWVXaW5kb3cgPSBfYTEyLl9pbmZpbml0ZVRpbWVXaW5kb3c7CiAgICAgICAgdmFyIGFkanVzdGVkQnVmZmVyU2l6ZSA9IChfaW5maW5pdGVUaW1lV2luZG93ID8gMSA6IDIpICogX2J1ZmZlclNpemU7CiAgICAgICAgX2J1ZmZlclNpemUgPCBJbmZpbml0eSAmJiBhZGp1c3RlZEJ1ZmZlclNpemUgPCBfYnVmZmVyLmxlbmd0aCAmJiBfYnVmZmVyLnNwbGljZSgwLCBfYnVmZmVyLmxlbmd0aCAtIGFkanVzdGVkQnVmZmVyU2l6ZSk7CiAgICAgICAgaWYgKCFfaW5maW5pdGVUaW1lV2luZG93KSB7CiAgICAgICAgICB2YXIgbm93MiA9IF90aW1lc3RhbXBQcm92aWRlci5ub3coKTsKICAgICAgICAgIHZhciBsYXN0MyA9IDA7CiAgICAgICAgICBmb3IgKHZhciBpMTEgPSAxOyBpMTEgPCBfYnVmZmVyLmxlbmd0aCAmJiBfYnVmZmVyW2kxMV0gPD0gbm93MjsgaTExICs9IDIpIHsKICAgICAgICAgICAgbGFzdDMgPSBpMTE7CiAgICAgICAgICB9CiAgICAgICAgICBsYXN0MyAmJiBfYnVmZmVyLnNwbGljZSgwLCBsYXN0MyArIDEpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIFJlcGxheVN1YmplY3QyOwogICAgfSkoU3ViamVjdCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9Bc3luY1N1YmplY3QuanMKdmFyIEFzeW5jU3ViamVjdDsKdmFyIGluaXRfQXN5bmNTdWJqZWN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvQXN5bmNTdWJqZWN0LmpzIigpIHsKICAgIGluaXRfdHNsaWJfZXM2KCk7CiAgICBpbml0X1N1YmplY3QoKTsKICAgIEFzeW5jU3ViamVjdCA9IChmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKEFzeW5jU3ViamVjdDIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIEFzeW5jU3ViamVjdDIoKSB7CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgX3RoaXMuX3ZhbHVlID0gbnVsbDsKICAgICAgICBfdGhpcy5faGFzVmFsdWUgPSBmYWxzZTsKICAgICAgICBfdGhpcy5faXNDb21wbGV0ZSA9IGZhbHNlOwogICAgICAgIHJldHVybiBfdGhpczsKICAgICAgfQogICAgICBBc3luY1N1YmplY3QyLnByb3RvdHlwZS5fY2hlY2tGaW5hbGl6ZWRTdGF0dXNlcyA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgX2ExMiA9IHRoaXMsIGhhc0Vycm9yID0gX2ExMi5oYXNFcnJvciwgX2hhc1ZhbHVlID0gX2ExMi5faGFzVmFsdWUsIF92YWx1ZSA9IF9hMTIuX3ZhbHVlLCB0aHJvd25FcnJvciA9IF9hMTIudGhyb3duRXJyb3IsIGlzU3RvcHBlZCA9IF9hMTIuaXNTdG9wcGVkLCBfaXNDb21wbGV0ZSA9IF9hMTIuX2lzQ29tcGxldGU7CiAgICAgICAgaWYgKGhhc0Vycm9yKSB7CiAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKHRocm93bkVycm9yKTsKICAgICAgICB9IGVsc2UgaWYgKGlzU3RvcHBlZCB8fCBfaXNDb21wbGV0ZSkgewogICAgICAgICAgX2hhc1ZhbHVlICYmIHN1YnNjcmliZXIubmV4dChfdmFsdWUpOwogICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQXN5bmNTdWJqZWN0Mi5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHZhbHVlMikgewogICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWUyOwogICAgICAgICAgdGhpcy5faGFzVmFsdWUgPSB0cnVlOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQXN5bmNTdWJqZWN0Mi5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2ExMiA9IHRoaXMsIF9oYXNWYWx1ZSA9IF9hMTIuX2hhc1ZhbHVlLCBfdmFsdWUgPSBfYTEyLl92YWx1ZSwgX2lzQ29tcGxldGUgPSBfYTEyLl9pc0NvbXBsZXRlOwogICAgICAgIGlmICghX2lzQ29tcGxldGUpIHsKICAgICAgICAgIHRoaXMuX2lzQ29tcGxldGUgPSB0cnVlOwogICAgICAgICAgX2hhc1ZhbHVlICYmIF9zdXBlci5wcm90b3R5cGUubmV4dC5jYWxsKHRoaXMsIF92YWx1ZSk7CiAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmNvbXBsZXRlLmNhbGwodGhpcyk7CiAgICAgICAgfQogICAgICB9OwogICAgICByZXR1cm4gQXN5bmNTdWJqZWN0MjsKICAgIH0pKFN1YmplY3QpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL0FjdGlvbi5qcwp2YXIgQWN0aW9uOwp2YXIgaW5pdF9BY3Rpb24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvQWN0aW9uLmpzIigpIHsKICAgIGluaXRfdHNsaWJfZXM2KCk7CiAgICBpbml0X1N1YnNjcmlwdGlvbigpOwogICAgQWN0aW9uID0gKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoQWN0aW9uMiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gQWN0aW9uMihzY2hlZHVsZXIsIHdvcmspIHsKICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgfQogICAgICBBY3Rpb24yLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uKHN0YXRlMTAsIGRlbGF5MikgewogICAgICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgICAgICAgZGVsYXkyID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH07CiAgICAgIHJldHVybiBBY3Rpb24yOwogICAgfSkoU3Vic2NyaXB0aW9uKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9pbnRlcnZhbFByb3ZpZGVyLmpzCnZhciBpbnRlcnZhbFByb3ZpZGVyOwp2YXIgaW5pdF9pbnRlcnZhbFByb3ZpZGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL2ludGVydmFsUHJvdmlkZXIuanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGludGVydmFsUHJvdmlkZXIgPSB7CiAgICAgIHNldEludGVydmFsOiBmdW5jdGlvbihoYW5kbGVyMiwgdGltZW91dDIpIHsKICAgICAgICB2YXIgYXJncyA9IFtdOwogICAgICAgIGZvciAodmFyIF9pID0gMjsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICBhcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldOwogICAgICAgIH0KICAgICAgICB2YXIgZGVsZWdhdGUgPSBpbnRlcnZhbFByb3ZpZGVyLmRlbGVnYXRlOwogICAgICAgIGlmIChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUuc2V0SW50ZXJ2YWwpIHsKICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5zZXRJbnRlcnZhbC5hcHBseShkZWxlZ2F0ZSwgX19zcHJlYWRBcnJheShbaGFuZGxlcjIsIHRpbWVvdXQyXSwgX19yZWFkKGFyZ3MpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzZXRJbnRlcnZhbC5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW2hhbmRsZXIyLCB0aW1lb3V0Ml0sIF9fcmVhZChhcmdzKSkpOwogICAgICB9LAogICAgICBjbGVhckludGVydmFsOiBmdW5jdGlvbihoYW5kbGUzKSB7CiAgICAgICAgdmFyIGRlbGVnYXRlID0gaW50ZXJ2YWxQcm92aWRlci5kZWxlZ2F0ZTsKICAgICAgICByZXR1cm4gKChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUuY2xlYXJJbnRlcnZhbCkgfHwgY2xlYXJJbnRlcnZhbCkoaGFuZGxlMyk7CiAgICAgIH0sCiAgICAgIGRlbGVnYXRlOiB2b2lkIDAKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvQXN5bmNBY3Rpb24uanMKdmFyIEFzeW5jQWN0aW9uOwp2YXIgaW5pdF9Bc3luY0FjdGlvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9Bc3luY0FjdGlvbi5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgaW5pdF9BY3Rpb24oKTsKICAgIGluaXRfaW50ZXJ2YWxQcm92aWRlcigpOwogICAgaW5pdF9hcnJSZW1vdmUoKTsKICAgIEFzeW5jQWN0aW9uID0gKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoQXN5bmNBY3Rpb24yLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBBc3luY0FjdGlvbjIoc2NoZWR1bGVyLCB3b3JrKSB7CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc2NoZWR1bGVyLCB3b3JrKSB8fCB0aGlzOwogICAgICAgIF90aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKICAgICAgICBfdGhpcy53b3JrID0gd29yazsKICAgICAgICBfdGhpcy5wZW5kaW5nID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIEFzeW5jQWN0aW9uMi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbihzdGF0ZTEwLCBkZWxheTIpIHsKICAgICAgICB2YXIgX2ExMjsKICAgICAgICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHsKICAgICAgICAgIGRlbGF5MiA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTEwOwogICAgICAgIHZhciBpZCA9IHRoaXMuaWQ7CiAgICAgICAgdmFyIHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyOwogICAgICAgIGlmIChpZCAhPSBudWxsKSB7CiAgICAgICAgICB0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheTIpOwogICAgICAgIH0KICAgICAgICB0aGlzLnBlbmRpbmcgPSB0cnVlOwogICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTI7CiAgICAgICAgdGhpcy5pZCA9IChfYTEyID0gdGhpcy5pZCkgIT09IG51bGwgJiYgX2ExMiAhPT0gdm9pZCAwID8gX2ExMiA6IHRoaXMucmVxdWVzdEFzeW5jSWQoc2NoZWR1bGVyLCB0aGlzLmlkLCBkZWxheTIpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9OwogICAgICBBc3luY0FjdGlvbjIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkID0gZnVuY3Rpb24oc2NoZWR1bGVyLCBfaWQsIGRlbGF5MikgewogICAgICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgICAgICAgZGVsYXkyID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGludGVydmFsUHJvdmlkZXIuc2V0SW50ZXJ2YWwoc2NoZWR1bGVyLmZsdXNoLmJpbmQoc2NoZWR1bGVyLCB0aGlzKSwgZGVsYXkyKTsKICAgICAgfTsKICAgICAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZCA9IGZ1bmN0aW9uKF9zY2hlZHVsZXIsIGlkLCBkZWxheTIpIHsKICAgICAgICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHsKICAgICAgICAgIGRlbGF5MiA9IDA7CiAgICAgICAgfQogICAgICAgIGlmIChkZWxheTIgIT0gbnVsbCAmJiB0aGlzLmRlbGF5ID09PSBkZWxheTIgJiYgdGhpcy5wZW5kaW5nID09PSBmYWxzZSkgewogICAgICAgICAgcmV0dXJuIGlkOwogICAgICAgIH0KICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewogICAgICAgICAgaW50ZXJ2YWxQcm92aWRlci5jbGVhckludGVydmFsKGlkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgfTsKICAgICAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24oc3RhdGUxMCwgZGVsYXkyKSB7CiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCJleGVjdXRpbmcgYSBjYW5jZWxsZWQgYWN0aW9uIik7CiAgICAgICAgfQogICAgICAgIHRoaXMucGVuZGluZyA9IGZhbHNlOwogICAgICAgIHZhciBlcnJvciA9IHRoaXMuX2V4ZWN1dGUoc3RhdGUxMCwgZGVsYXkyKTsKICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgIHJldHVybiBlcnJvcjsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGVuZGluZyA9PT0gZmFsc2UgJiYgdGhpcy5pZCAhPSBudWxsKSB7CiAgICAgICAgICB0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZCh0aGlzLnNjaGVkdWxlciwgdGhpcy5pZCwgbnVsbCk7CiAgICAgICAgfQogICAgICB9OwogICAgICBBc3luY0FjdGlvbjIucHJvdG90eXBlLl9leGVjdXRlID0gZnVuY3Rpb24oc3RhdGUxMCwgX2RlbGF5KSB7CiAgICAgICAgdmFyIGVycm9yZWQgPSBmYWxzZTsKICAgICAgICB2YXIgZXJyb3JWYWx1ZTsKICAgICAgICB0cnkgewogICAgICAgICAgdGhpcy53b3JrKHN0YXRlMTApOwogICAgICAgIH0gY2F0Y2ggKGUxMSkgewogICAgICAgICAgZXJyb3JlZCA9IHRydWU7CiAgICAgICAgICBlcnJvclZhbHVlID0gZTExID8gZTExIDogbmV3IEVycm9yKCJTY2hlZHVsZWQgYWN0aW9uIHRocmV3IGZhbHN5IGVycm9yIik7CiAgICAgICAgfQogICAgICAgIGlmIChlcnJvcmVkKSB7CiAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICByZXR1cm4gZXJyb3JWYWx1ZTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIEFzeW5jQWN0aW9uMi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIXRoaXMuY2xvc2VkKSB7CiAgICAgICAgICB2YXIgX2ExMiA9IHRoaXMsIGlkID0gX2ExMi5pZCwgc2NoZWR1bGVyID0gX2ExMi5zY2hlZHVsZXI7CiAgICAgICAgICB2YXIgYWN0aW9ucyA9IHNjaGVkdWxlci5hY3Rpb25zOwogICAgICAgICAgdGhpcy53b3JrID0gdGhpcy5zdGF0ZSA9IHRoaXMuc2NoZWR1bGVyID0gbnVsbDsKICAgICAgICAgIHRoaXMucGVuZGluZyA9IGZhbHNlOwogICAgICAgICAgYXJyUmVtb3ZlKGFjdGlvbnMsIHRoaXMpOwogICAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQoc2NoZWR1bGVyLCBpZCwgbnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmRlbGF5ID0gbnVsbDsKICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJldHVybiBBc3luY0FjdGlvbjI7CiAgICB9KShBY3Rpb24pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9JbW1lZGlhdGUuanMKZnVuY3Rpb24gZmluZEFuZENsZWFySGFuZGxlKGhhbmRsZTMpIHsKICBpZiAoaGFuZGxlMyBpbiBhY3RpdmVIYW5kbGVzKSB7CiAgICBkZWxldGUgYWN0aXZlSGFuZGxlc1toYW5kbGUzXTsKICAgIHJldHVybiB0cnVlOwogIH0KICByZXR1cm4gZmFsc2U7Cn0KdmFyIG5leHRIYW5kbGUsIHJlc29sdmVkLCBhY3RpdmVIYW5kbGVzLCBJbW1lZGlhdGUsIFRlc3RUb29sczsKdmFyIGluaXRfSW1tZWRpYXRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9JbW1lZGlhdGUuanMiKCkgewogICAgbmV4dEhhbmRsZSA9IDE7CiAgICBhY3RpdmVIYW5kbGVzID0ge307CiAgICBJbW1lZGlhdGUgPSB7CiAgICAgIHNldEltbWVkaWF0ZTogZnVuY3Rpb24oY2IpIHsKICAgICAgICB2YXIgaGFuZGxlMyA9IG5leHRIYW5kbGUrKzsKICAgICAgICBhY3RpdmVIYW5kbGVzW2hhbmRsZTNdID0gdHJ1ZTsKICAgICAgICBpZiAoIXJlc29sdmVkKSB7CiAgICAgICAgICByZXNvbHZlZCA9IFByb21pc2UucmVzb2x2ZSgpOwogICAgICAgIH0KICAgICAgICByZXNvbHZlZC50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGZpbmRBbmRDbGVhckhhbmRsZShoYW5kbGUzKSAmJiBjYigpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBoYW5kbGUzOwogICAgICB9LAogICAgICBjbGVhckltbWVkaWF0ZTogZnVuY3Rpb24oaGFuZGxlMykgewogICAgICAgIGZpbmRBbmRDbGVhckhhbmRsZShoYW5kbGUzKTsKICAgICAgfQogICAgfTsKICAgIFRlc3RUb29scyA9IHsKICAgICAgcGVuZGluZzogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGFjdGl2ZUhhbmRsZXMpLmxlbmd0aDsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9pbW1lZGlhdGVQcm92aWRlci5qcwp2YXIgc2V0SW1tZWRpYXRlLCBjbGVhckltbWVkaWF0ZSwgaW1tZWRpYXRlUHJvdmlkZXI7CnZhciBpbml0X2ltbWVkaWF0ZVByb3ZpZGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL2ltbWVkaWF0ZVByb3ZpZGVyLmpzIigpIHsKICAgIGluaXRfdHNsaWJfZXM2KCk7CiAgICBpbml0X0ltbWVkaWF0ZSgpOwogICAgc2V0SW1tZWRpYXRlID0gSW1tZWRpYXRlLnNldEltbWVkaWF0ZSwgY2xlYXJJbW1lZGlhdGUgPSBJbW1lZGlhdGUuY2xlYXJJbW1lZGlhdGU7CiAgICBpbW1lZGlhdGVQcm92aWRlciA9IHsKICAgICAgc2V0SW1tZWRpYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYXJncyA9IFtdOwogICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgICAgfQogICAgICAgIHZhciBkZWxlZ2F0ZSA9IGltbWVkaWF0ZVByb3ZpZGVyLmRlbGVnYXRlOwogICAgICAgIHJldHVybiAoKGRlbGVnYXRlID09PSBudWxsIHx8IGRlbGVnYXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWxlZ2F0ZS5zZXRJbW1lZGlhdGUpIHx8IHNldEltbWVkaWF0ZSkuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoYXJncykpKTsKICAgICAgfSwKICAgICAgY2xlYXJJbW1lZGlhdGU6IGZ1bmN0aW9uKGhhbmRsZTMpIHsKICAgICAgICB2YXIgZGVsZWdhdGUgPSBpbW1lZGlhdGVQcm92aWRlci5kZWxlZ2F0ZTsKICAgICAgICByZXR1cm4gKChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUuY2xlYXJJbW1lZGlhdGUpIHx8IGNsZWFySW1tZWRpYXRlKShoYW5kbGUzKTsKICAgICAgfSwKICAgICAgZGVsZWdhdGU6IHZvaWQgMAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9Bc2FwQWN0aW9uLmpzCnZhciBBc2FwQWN0aW9uOwp2YXIgaW5pdF9Bc2FwQWN0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL0FzYXBBY3Rpb24uanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGluaXRfQXN5bmNBY3Rpb24oKTsKICAgIGluaXRfaW1tZWRpYXRlUHJvdmlkZXIoKTsKICAgIEFzYXBBY3Rpb24gPSAoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhBc2FwQWN0aW9uMiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gQXNhcEFjdGlvbjIoc2NoZWR1bGVyLCB3b3JrKSB7CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc2NoZWR1bGVyLCB3b3JrKSB8fCB0aGlzOwogICAgICAgIF90aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKICAgICAgICBfdGhpcy53b3JrID0gd29yazsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgQXNhcEFjdGlvbjIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkID0gZnVuY3Rpb24oc2NoZWR1bGVyLCBpZCwgZGVsYXkyKSB7CiAgICAgICAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBkZWxheTIgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoZGVsYXkyICE9PSBudWxsICYmIGRlbGF5MiA+IDApIHsKICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkLmNhbGwodGhpcywgc2NoZWR1bGVyLCBpZCwgZGVsYXkyKTsKICAgICAgICB9CiAgICAgICAgc2NoZWR1bGVyLmFjdGlvbnMucHVzaCh0aGlzKTsKICAgICAgICByZXR1cm4gc2NoZWR1bGVyLl9zY2hlZHVsZWQgfHwgKHNjaGVkdWxlci5fc2NoZWR1bGVkID0gaW1tZWRpYXRlUHJvdmlkZXIuc2V0SW1tZWRpYXRlKHNjaGVkdWxlci5mbHVzaC5iaW5kKHNjaGVkdWxlciwgdm9pZCAwKSkpOwogICAgICB9OwogICAgICBBc2FwQWN0aW9uMi5wcm90b3R5cGUucmVjeWNsZUFzeW5jSWQgPSBmdW5jdGlvbihzY2hlZHVsZXIsIGlkLCBkZWxheTIpIHsKICAgICAgICB2YXIgX2ExMjsKICAgICAgICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHsKICAgICAgICAgIGRlbGF5MiA9IDA7CiAgICAgICAgfQogICAgICAgIGlmIChkZWxheTIgIT0gbnVsbCA/IGRlbGF5MiA+IDAgOiB0aGlzLmRlbGF5ID4gMCkgewogICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUucmVjeWNsZUFzeW5jSWQuY2FsbCh0aGlzLCBzY2hlZHVsZXIsIGlkLCBkZWxheTIpOwogICAgICAgIH0KICAgICAgICB2YXIgYWN0aW9ucyA9IHNjaGVkdWxlci5hY3Rpb25zOwogICAgICAgIGlmIChpZCAhPSBudWxsICYmICgoX2ExMiA9IGFjdGlvbnNbYWN0aW9ucy5sZW5ndGggLSAxXSkgPT09IG51bGwgfHwgX2ExMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ExMi5pZCkgIT09IGlkKSB7CiAgICAgICAgICBpbW1lZGlhdGVQcm92aWRlci5jbGVhckltbWVkaWF0ZShpZCk7CiAgICAgICAgICBpZiAoc2NoZWR1bGVyLl9zY2hlZHVsZWQgPT09IGlkKSB7CiAgICAgICAgICAgIHNjaGVkdWxlci5fc2NoZWR1bGVkID0gdm9pZCAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICB9OwogICAgICByZXR1cm4gQXNhcEFjdGlvbjI7CiAgICB9KShBc3luY0FjdGlvbik7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9TY2hlZHVsZXIuanMKdmFyIFNjaGVkdWxlcjsKdmFyIGluaXRfU2NoZWR1bGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvU2NoZWR1bGVyLmpzIigpIHsKICAgIGluaXRfZGF0ZVRpbWVzdGFtcFByb3ZpZGVyKCk7CiAgICBTY2hlZHVsZXIgPSAoZnVuY3Rpb24oKSB7CiAgICAgIGZ1bmN0aW9uIFNjaGVkdWxlcjIoc2NoZWR1bGVyQWN0aW9uQ3Rvciwgbm93MikgewogICAgICAgIGlmIChub3cyID09PSB2b2lkIDApIHsKICAgICAgICAgIG5vdzIgPSBTY2hlZHVsZXIyLm5vdzsKICAgICAgICB9CiAgICAgICAgdGhpcy5zY2hlZHVsZXJBY3Rpb25DdG9yID0gc2NoZWR1bGVyQWN0aW9uQ3RvcjsKICAgICAgICB0aGlzLm5vdyA9IG5vdzI7CiAgICAgIH0KICAgICAgU2NoZWR1bGVyMi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbih3b3JrLCBkZWxheTIsIHN0YXRlMTApIHsKICAgICAgICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHsKICAgICAgICAgIGRlbGF5MiA9IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgdGhpcy5zY2hlZHVsZXJBY3Rpb25DdG9yKHRoaXMsIHdvcmspLnNjaGVkdWxlKHN0YXRlMTAsIGRlbGF5Mik7CiAgICAgIH07CiAgICAgIFNjaGVkdWxlcjIubm93ID0gZGF0ZVRpbWVzdGFtcFByb3ZpZGVyLm5vdzsKICAgICAgcmV0dXJuIFNjaGVkdWxlcjI7CiAgICB9KSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL0FzeW5jU2NoZWR1bGVyLmpzCnZhciBBc3luY1NjaGVkdWxlcjsKdmFyIGluaXRfQXN5bmNTY2hlZHVsZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvQXN5bmNTY2hlZHVsZXIuanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGluaXRfU2NoZWR1bGVyKCk7CiAgICBBc3luY1NjaGVkdWxlciA9IChmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKEFzeW5jU2NoZWR1bGVyMiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gQXN5bmNTY2hlZHVsZXIyKFNjaGVkdWxlckFjdGlvbiwgbm93MikgewogICAgICAgIGlmIChub3cyID09PSB2b2lkIDApIHsKICAgICAgICAgIG5vdzIgPSBTY2hlZHVsZXIubm93OwogICAgICAgIH0KICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBTY2hlZHVsZXJBY3Rpb24sIG5vdzIpIHx8IHRoaXM7CiAgICAgICAgX3RoaXMuYWN0aW9ucyA9IFtdOwogICAgICAgIF90aGlzLl9hY3RpdmUgPSBmYWxzZTsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgQXN5bmNTY2hlZHVsZXIyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKGFjdGlvbikgewogICAgICAgIHZhciBhY3Rpb25zID0gdGhpcy5hY3Rpb25zOwogICAgICAgIGlmICh0aGlzLl9hY3RpdmUpIHsKICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZXJyb3I7CiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTsKICAgICAgICBkbyB7CiAgICAgICAgICBpZiAoZXJyb3IgPSBhY3Rpb24uZXhlY3V0ZShhY3Rpb24uc3RhdGUsIGFjdGlvbi5kZWxheSkpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAoYWN0aW9uID0gYWN0aW9ucy5zaGlmdCgpKTsKICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTsKICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgIHdoaWxlIChhY3Rpb24gPSBhY3Rpb25zLnNoaWZ0KCkpIHsKICAgICAgICAgICAgYWN0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJldHVybiBBc3luY1NjaGVkdWxlcjI7CiAgICB9KShTY2hlZHVsZXIpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL0FzYXBTY2hlZHVsZXIuanMKdmFyIEFzYXBTY2hlZHVsZXI7CnZhciBpbml0X0FzYXBTY2hlZHVsZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvQXNhcFNjaGVkdWxlci5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgaW5pdF9Bc3luY1NjaGVkdWxlcigpOwogICAgQXNhcFNjaGVkdWxlciA9IChmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKEFzYXBTY2hlZHVsZXIyLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBBc2FwU2NoZWR1bGVyMigpIHsKICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgIH0KICAgICAgQXNhcFNjaGVkdWxlcjIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oYWN0aW9uKSB7CiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTsKICAgICAgICB2YXIgZmx1c2hJZCA9IHRoaXMuX3NjaGVkdWxlZDsKICAgICAgICB0aGlzLl9zY2hlZHVsZWQgPSB2b2lkIDA7CiAgICAgICAgdmFyIGFjdGlvbnMgPSB0aGlzLmFjdGlvbnM7CiAgICAgICAgdmFyIGVycm9yOwogICAgICAgIGFjdGlvbiA9IGFjdGlvbiB8fCBhY3Rpb25zLnNoaWZ0KCk7CiAgICAgICAgZG8gewogICAgICAgICAgaWYgKGVycm9yID0gYWN0aW9uLmV4ZWN1dGUoYWN0aW9uLnN0YXRlLCBhY3Rpb24uZGVsYXkpKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKChhY3Rpb24gPSBhY3Rpb25zWzBdKSAmJiBhY3Rpb24uaWQgPT09IGZsdXNoSWQgJiYgYWN0aW9ucy5zaGlmdCgpKTsKICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTsKICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgIHdoaWxlICgoYWN0aW9uID0gYWN0aW9uc1swXSkgJiYgYWN0aW9uLmlkID09PSBmbHVzaElkICYmIGFjdGlvbnMuc2hpZnQoKSkgewogICAgICAgICAgICBhY3Rpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIEFzYXBTY2hlZHVsZXIyOwogICAgfSkoQXN5bmNTY2hlZHVsZXIpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL2FzYXAuanMKdmFyIGFzYXBTY2hlZHVsZXIsIGFzYXA7CnZhciBpbml0X2FzYXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvYXNhcC5qcyIoKSB7CiAgICBpbml0X0FzYXBBY3Rpb24oKTsKICAgIGluaXRfQXNhcFNjaGVkdWxlcigpOwogICAgYXNhcFNjaGVkdWxlciA9IG5ldyBBc2FwU2NoZWR1bGVyKEFzYXBBY3Rpb24pOwogICAgYXNhcCA9IGFzYXBTY2hlZHVsZXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvYXN5bmMuanMKdmFyIGFzeW5jU2NoZWR1bGVyLCBhc3luYzsKdmFyIGluaXRfYXN5bmMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvYXN5bmMuanMiKCkgewogICAgaW5pdF9Bc3luY0FjdGlvbigpOwogICAgaW5pdF9Bc3luY1NjaGVkdWxlcigpOwogICAgYXN5bmNTY2hlZHVsZXIgPSBuZXcgQXN5bmNTY2hlZHVsZXIoQXN5bmNBY3Rpb24pOwogICAgYXN5bmMgPSBhc3luY1NjaGVkdWxlcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9RdWV1ZUFjdGlvbi5qcwp2YXIgUXVldWVBY3Rpb247CnZhciBpbml0X1F1ZXVlQWN0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL1F1ZXVlQWN0aW9uLmpzIigpIHsKICAgIGluaXRfdHNsaWJfZXM2KCk7CiAgICBpbml0X0FzeW5jQWN0aW9uKCk7CiAgICBRdWV1ZUFjdGlvbiA9IChmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKFF1ZXVlQWN0aW9uMiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gUXVldWVBY3Rpb24yKHNjaGVkdWxlciwgd29yaykgewogICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNjaGVkdWxlciwgd29yaykgfHwgdGhpczsKICAgICAgICBfdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CiAgICAgICAgX3RoaXMud29yayA9IHdvcms7CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIFF1ZXVlQWN0aW9uMi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbihzdGF0ZTEwLCBkZWxheTIpIHsKICAgICAgICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHsKICAgICAgICAgIGRlbGF5MiA9IDA7CiAgICAgICAgfQogICAgICAgIGlmIChkZWxheTIgPiAwKSB7CiAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5zY2hlZHVsZS5jYWxsKHRoaXMsIHN0YXRlMTAsIGRlbGF5Mik7CiAgICAgICAgfQogICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTI7CiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlMTA7CiAgICAgICAgdGhpcy5zY2hlZHVsZXIuZmx1c2godGhpcyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH07CiAgICAgIFF1ZXVlQWN0aW9uMi5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uKHN0YXRlMTAsIGRlbGF5MikgewogICAgICAgIHJldHVybiBkZWxheTIgPiAwIHx8IHRoaXMuY2xvc2VkID8gX3N1cGVyLnByb3RvdHlwZS5leGVjdXRlLmNhbGwodGhpcywgc3RhdGUxMCwgZGVsYXkyKSA6IHRoaXMuX2V4ZWN1dGUoc3RhdGUxMCwgZGVsYXkyKTsKICAgICAgfTsKICAgICAgUXVldWVBY3Rpb24yLnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZCA9IGZ1bmN0aW9uKHNjaGVkdWxlciwgaWQsIGRlbGF5MikgewogICAgICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgICAgICAgZGVsYXkyID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKGRlbGF5MiAhPSBudWxsICYmIGRlbGF5MiA+IDAgfHwgZGVsYXkyID09IG51bGwgJiYgdGhpcy5kZWxheSA+IDApIHsKICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkLmNhbGwodGhpcywgc2NoZWR1bGVyLCBpZCwgZGVsYXkyKTsKICAgICAgICB9CiAgICAgICAgc2NoZWR1bGVyLmZsdXNoKHRoaXMpOwogICAgICAgIHJldHVybiAwOwogICAgICB9OwogICAgICByZXR1cm4gUXVldWVBY3Rpb24yOwogICAgfSkoQXN5bmNBY3Rpb24pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL1F1ZXVlU2NoZWR1bGVyLmpzCnZhciBRdWV1ZVNjaGVkdWxlcjsKdmFyIGluaXRfUXVldWVTY2hlZHVsZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvUXVldWVTY2hlZHVsZXIuanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGluaXRfQXN5bmNTY2hlZHVsZXIoKTsKICAgIFF1ZXVlU2NoZWR1bGVyID0gKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoUXVldWVTY2hlZHVsZXIyLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBRdWV1ZVNjaGVkdWxlcjIoKSB7CiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICB9CiAgICAgIHJldHVybiBRdWV1ZVNjaGVkdWxlcjI7CiAgICB9KShBc3luY1NjaGVkdWxlcik7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvcXVldWUuanMKdmFyIHF1ZXVlU2NoZWR1bGVyLCBxdWV1ZTsKdmFyIGluaXRfcXVldWUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvcXVldWUuanMiKCkgewogICAgaW5pdF9RdWV1ZUFjdGlvbigpOwogICAgaW5pdF9RdWV1ZVNjaGVkdWxlcigpOwogICAgcXVldWVTY2hlZHVsZXIgPSBuZXcgUXVldWVTY2hlZHVsZXIoUXVldWVBY3Rpb24pOwogICAgcXVldWUgPSBxdWV1ZVNjaGVkdWxlcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9BbmltYXRpb25GcmFtZUFjdGlvbi5qcwp2YXIgQW5pbWF0aW9uRnJhbWVBY3Rpb247CnZhciBpbml0X0FuaW1hdGlvbkZyYW1lQWN0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL0FuaW1hdGlvbkZyYW1lQWN0aW9uLmpzIigpIHsKICAgIGluaXRfdHNsaWJfZXM2KCk7CiAgICBpbml0X0FzeW5jQWN0aW9uKCk7CiAgICBpbml0X2FuaW1hdGlvbkZyYW1lUHJvdmlkZXIoKTsKICAgIEFuaW1hdGlvbkZyYW1lQWN0aW9uID0gKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoQW5pbWF0aW9uRnJhbWVBY3Rpb24yLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBBbmltYXRpb25GcmFtZUFjdGlvbjIoc2NoZWR1bGVyLCB3b3JrKSB7CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc2NoZWR1bGVyLCB3b3JrKSB8fCB0aGlzOwogICAgICAgIF90aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKICAgICAgICBfdGhpcy53b3JrID0gd29yazsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgQW5pbWF0aW9uRnJhbWVBY3Rpb24yLnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZCA9IGZ1bmN0aW9uKHNjaGVkdWxlciwgaWQsIGRlbGF5MikgewogICAgICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgICAgICAgZGVsYXkyID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKGRlbGF5MiAhPT0gbnVsbCAmJiBkZWxheTIgPiAwKSB7CiAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZC5jYWxsKHRoaXMsIHNjaGVkdWxlciwgaWQsIGRlbGF5Mik7CiAgICAgICAgfQogICAgICAgIHNjaGVkdWxlci5hY3Rpb25zLnB1c2godGhpcyk7CiAgICAgICAgcmV0dXJuIHNjaGVkdWxlci5fc2NoZWR1bGVkIHx8IChzY2hlZHVsZXIuX3NjaGVkdWxlZCA9IGFuaW1hdGlvbkZyYW1lUHJvdmlkZXIucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHNjaGVkdWxlci5mbHVzaCh2b2lkIDApOwogICAgICAgIH0pKTsKICAgICAgfTsKICAgICAgQW5pbWF0aW9uRnJhbWVBY3Rpb24yLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZCA9IGZ1bmN0aW9uKHNjaGVkdWxlciwgaWQsIGRlbGF5MikgewogICAgICAgIHZhciBfYTEyOwogICAgICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgICAgICAgZGVsYXkyID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKGRlbGF5MiAhPSBudWxsID8gZGVsYXkyID4gMCA6IHRoaXMuZGVsYXkgPiAwKSB7CiAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZC5jYWxsKHRoaXMsIHNjaGVkdWxlciwgaWQsIGRlbGF5Mik7CiAgICAgICAgfQogICAgICAgIHZhciBhY3Rpb25zID0gc2NoZWR1bGVyLmFjdGlvbnM7CiAgICAgICAgaWYgKGlkICE9IG51bGwgJiYgaWQgPT09IHNjaGVkdWxlci5fc2NoZWR1bGVkICYmICgoX2ExMiA9IGFjdGlvbnNbYWN0aW9ucy5sZW5ndGggLSAxXSkgPT09IG51bGwgfHwgX2ExMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ExMi5pZCkgIT09IGlkKSB7CiAgICAgICAgICBhbmltYXRpb25GcmFtZVByb3ZpZGVyLmNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTsKICAgICAgICAgIHNjaGVkdWxlci5fc2NoZWR1bGVkID0gdm9pZCAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICB9OwogICAgICByZXR1cm4gQW5pbWF0aW9uRnJhbWVBY3Rpb24yOwogICAgfSkoQXN5bmNBY3Rpb24pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL0FuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLmpzCnZhciBBbmltYXRpb25GcmFtZVNjaGVkdWxlcjsKdmFyIGluaXRfQW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvQW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIuanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGluaXRfQXN5bmNTY2hlZHVsZXIoKTsKICAgIEFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyID0gKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoQW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIyLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBBbmltYXRpb25GcmFtZVNjaGVkdWxlcjIoKSB7CiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICB9CiAgICAgIEFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyMi5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbihhY3Rpb24pIHsKICAgICAgICB0aGlzLl9hY3RpdmUgPSB0cnVlOwogICAgICAgIHZhciBmbHVzaElkOwogICAgICAgIGlmIChhY3Rpb24pIHsKICAgICAgICAgIGZsdXNoSWQgPSBhY3Rpb24uaWQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZsdXNoSWQgPSB0aGlzLl9zY2hlZHVsZWQ7CiAgICAgICAgICB0aGlzLl9zY2hlZHVsZWQgPSB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIHZhciBhY3Rpb25zID0gdGhpcy5hY3Rpb25zOwogICAgICAgIHZhciBlcnJvcjsKICAgICAgICBhY3Rpb24gPSBhY3Rpb24gfHwgYWN0aW9ucy5zaGlmdCgpOwogICAgICAgIGRvIHsKICAgICAgICAgIGlmIChlcnJvciA9IGFjdGlvbi5leGVjdXRlKGFjdGlvbi5zdGF0ZSwgYWN0aW9uLmRlbGF5KSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlICgoYWN0aW9uID0gYWN0aW9uc1swXSkgJiYgYWN0aW9uLmlkID09PSBmbHVzaElkICYmIGFjdGlvbnMuc2hpZnQoKSk7CiAgICAgICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7CiAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICB3aGlsZSAoKGFjdGlvbiA9IGFjdGlvbnNbMF0pICYmIGFjdGlvbi5pZCA9PT0gZmx1c2hJZCAmJiBhY3Rpb25zLnNoaWZ0KCkpIHsKICAgICAgICAgICAgYWN0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJldHVybiBBbmltYXRpb25GcmFtZVNjaGVkdWxlcjI7CiAgICB9KShBc3luY1NjaGVkdWxlcik7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvYW5pbWF0aW9uRnJhbWUuanMKdmFyIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCBhbmltYXRpb25GcmFtZTsKdmFyIGluaXRfYW5pbWF0aW9uRnJhbWUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvYW5pbWF0aW9uRnJhbWUuanMiKCkgewogICAgaW5pdF9BbmltYXRpb25GcmFtZUFjdGlvbigpOwogICAgaW5pdF9BbmltYXRpb25GcmFtZVNjaGVkdWxlcigpOwogICAgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIgPSBuZXcgQW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIoQW5pbWF0aW9uRnJhbWVBY3Rpb24pOwogICAgYW5pbWF0aW9uRnJhbWUgPSBhbmltYXRpb25GcmFtZVNjaGVkdWxlcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9WaXJ0dWFsVGltZVNjaGVkdWxlci5qcwp2YXIgVmlydHVhbFRpbWVTY2hlZHVsZXIsIFZpcnR1YWxBY3Rpb247CnZhciBpbml0X1ZpcnR1YWxUaW1lU2NoZWR1bGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL1ZpcnR1YWxUaW1lU2NoZWR1bGVyLmpzIigpIHsKICAgIGluaXRfdHNsaWJfZXM2KCk7CiAgICBpbml0X0FzeW5jQWN0aW9uKCk7CiAgICBpbml0X1N1YnNjcmlwdGlvbigpOwogICAgaW5pdF9Bc3luY1NjaGVkdWxlcigpOwogICAgVmlydHVhbFRpbWVTY2hlZHVsZXIgPSAoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhWaXJ0dWFsVGltZVNjaGVkdWxlcjIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIFZpcnR1YWxUaW1lU2NoZWR1bGVyMihzY2hlZHVsZXJBY3Rpb25DdG9yLCBtYXhGcmFtZXMpIHsKICAgICAgICBpZiAoc2NoZWR1bGVyQWN0aW9uQ3RvciA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBzY2hlZHVsZXJBY3Rpb25DdG9yID0gVmlydHVhbEFjdGlvbjsKICAgICAgICB9CiAgICAgICAgaWYgKG1heEZyYW1lcyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBtYXhGcmFtZXMgPSBJbmZpbml0eTsKICAgICAgICB9CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc2NoZWR1bGVyQWN0aW9uQ3RvciwgZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gX3RoaXMuZnJhbWU7CiAgICAgICAgfSkgfHwgdGhpczsKICAgICAgICBfdGhpcy5tYXhGcmFtZXMgPSBtYXhGcmFtZXM7CiAgICAgICAgX3RoaXMuZnJhbWUgPSAwOwogICAgICAgIF90aGlzLmluZGV4ID0gLTE7CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIFZpcnR1YWxUaW1lU2NoZWR1bGVyMi5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2ExMiA9IHRoaXMsIGFjdGlvbnMgPSBfYTEyLmFjdGlvbnMsIG1heEZyYW1lcyA9IF9hMTIubWF4RnJhbWVzOwogICAgICAgIHZhciBlcnJvcjsKICAgICAgICB2YXIgYWN0aW9uOwogICAgICAgIHdoaWxlICgoYWN0aW9uID0gYWN0aW9uc1swXSkgJiYgYWN0aW9uLmRlbGF5IDw9IG1heEZyYW1lcykgewogICAgICAgICAgYWN0aW9ucy5zaGlmdCgpOwogICAgICAgICAgdGhpcy5mcmFtZSA9IGFjdGlvbi5kZWxheTsKICAgICAgICAgIGlmIChlcnJvciA9IGFjdGlvbi5leGVjdXRlKGFjdGlvbi5zdGF0ZSwgYWN0aW9uLmRlbGF5KSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICB3aGlsZSAoYWN0aW9uID0gYWN0aW9ucy5zaGlmdCgpKSB7CiAgICAgICAgICAgIGFjdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgfQogICAgICB9OwogICAgICBWaXJ0dWFsVGltZVNjaGVkdWxlcjIuZnJhbWVUaW1lRmFjdG9yID0gMTA7CiAgICAgIHJldHVybiBWaXJ0dWFsVGltZVNjaGVkdWxlcjI7CiAgICB9KShBc3luY1NjaGVkdWxlcik7CiAgICBWaXJ0dWFsQWN0aW9uID0gKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoVmlydHVhbEFjdGlvbjIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIFZpcnR1YWxBY3Rpb24yKHNjaGVkdWxlciwgd29yaywgaW5kZXgyKSB7CiAgICAgICAgaWYgKGluZGV4MiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBpbmRleDIgPSBzY2hlZHVsZXIuaW5kZXggKz0gMTsKICAgICAgICB9CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc2NoZWR1bGVyLCB3b3JrKSB8fCB0aGlzOwogICAgICAgIF90aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKICAgICAgICBfdGhpcy53b3JrID0gd29yazsKICAgICAgICBfdGhpcy5pbmRleCA9IGluZGV4MjsKICAgICAgICBfdGhpcy5hY3RpdmUgPSB0cnVlOwogICAgICAgIF90aGlzLmluZGV4ID0gc2NoZWR1bGVyLmluZGV4ID0gaW5kZXgyOwogICAgICAgIHJldHVybiBfdGhpczsKICAgICAgfQogICAgICBWaXJ0dWFsQWN0aW9uMi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbihzdGF0ZTEwLCBkZWxheTIpIHsKICAgICAgICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHsKICAgICAgICAgIGRlbGF5MiA9IDA7CiAgICAgICAgfQogICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoZGVsYXkyKSkgewogICAgICAgICAgaWYgKCF0aGlzLmlkKSB7CiAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnNjaGVkdWxlLmNhbGwodGhpcywgc3RhdGUxMCwgZGVsYXkyKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7CiAgICAgICAgICB2YXIgYWN0aW9uID0gbmV3IFZpcnR1YWxBY3Rpb24yKHRoaXMuc2NoZWR1bGVyLCB0aGlzLndvcmspOwogICAgICAgICAgdGhpcy5hZGQoYWN0aW9uKTsKICAgICAgICAgIHJldHVybiBhY3Rpb24uc2NoZWR1bGUoc3RhdGUxMCwgZGVsYXkyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIFZpcnR1YWxBY3Rpb24yLnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZCA9IGZ1bmN0aW9uKHNjaGVkdWxlciwgaWQsIGRlbGF5MikgewogICAgICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgICAgICAgZGVsYXkyID0gMDsKICAgICAgICB9CiAgICAgICAgdGhpcy5kZWxheSA9IHNjaGVkdWxlci5mcmFtZSArIGRlbGF5MjsKICAgICAgICB2YXIgYWN0aW9ucyA9IHNjaGVkdWxlci5hY3Rpb25zOwogICAgICAgIGFjdGlvbnMucHVzaCh0aGlzKTsKICAgICAgICBhY3Rpb25zLnNvcnQoVmlydHVhbEFjdGlvbjIuc29ydEFjdGlvbnMpOwogICAgICAgIHJldHVybiAxOwogICAgICB9OwogICAgICBWaXJ0dWFsQWN0aW9uMi5wcm90b3R5cGUucmVjeWNsZUFzeW5jSWQgPSBmdW5jdGlvbihzY2hlZHVsZXIsIGlkLCBkZWxheTIpIHsKICAgICAgICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHsKICAgICAgICAgIGRlbGF5MiA9IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH07CiAgICAgIFZpcnR1YWxBY3Rpb24yLnByb3RvdHlwZS5fZXhlY3V0ZSA9IGZ1bmN0aW9uKHN0YXRlMTAsIGRlbGF5MikgewogICAgICAgIGlmICh0aGlzLmFjdGl2ZSA9PT0gdHJ1ZSkgewogICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuX2V4ZWN1dGUuY2FsbCh0aGlzLCBzdGF0ZTEwLCBkZWxheTIpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgVmlydHVhbEFjdGlvbjIuc29ydEFjdGlvbnMgPSBmdW5jdGlvbihhNSwgYjUpIHsKICAgICAgICBpZiAoYTUuZGVsYXkgPT09IGI1LmRlbGF5KSB7CiAgICAgICAgICBpZiAoYTUuaW5kZXggPT09IGI1LmluZGV4KSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfSBlbHNlIGlmIChhNS5pbmRleCA+IGI1LmluZGV4KSB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoYTUuZGVsYXkgPiBiNS5kZWxheSkgewogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJldHVybiBWaXJ0dWFsQWN0aW9uMjsKICAgIH0pKEFzeW5jQWN0aW9uKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZW1wdHkuanMKZnVuY3Rpb24gZW1wdHkoc2NoZWR1bGVyKSB7CiAgcmV0dXJuIHNjaGVkdWxlciA/IGVtcHR5U2NoZWR1bGVkKHNjaGVkdWxlcikgOiBFTVBUWTsKfQpmdW5jdGlvbiBlbXB0eVNjaGVkdWxlZChzY2hlZHVsZXIpIHsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgcmV0dXJuIHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgIH0pOwogIH0pOwp9CnZhciBFTVBUWTsKdmFyIGluaXRfZW1wdHkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2VtcHR5LmpzIigpIHsKICAgIGluaXRfT2JzZXJ2YWJsZSgpOwogICAgRU1QVFkgPSBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgIHJldHVybiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNTY2hlZHVsZXIuanMKZnVuY3Rpb24gaXNTY2hlZHVsZXIodmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMiAmJiBpc0Z1bmN0aW9uKHZhbHVlMi5zY2hlZHVsZSk7Cn0KdmFyIGluaXRfaXNTY2hlZHVsZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzU2NoZWR1bGVyLmpzIigpIHsKICAgIGluaXRfaXNGdW5jdGlvbigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9hcmdzLmpzCmZ1bmN0aW9uIGxhc3QoYXJyKSB7CiAgcmV0dXJuIGFyclthcnIubGVuZ3RoIC0gMV07Cn0KZnVuY3Rpb24gcG9wUmVzdWx0U2VsZWN0b3IoYXJncykgewogIHJldHVybiBpc0Z1bmN0aW9uKGxhc3QoYXJncykpID8gYXJncy5wb3AoKSA6IHZvaWQgMDsKfQpmdW5jdGlvbiBwb3BTY2hlZHVsZXIoYXJncykgewogIHJldHVybiBpc1NjaGVkdWxlcihsYXN0KGFyZ3MpKSA/IGFyZ3MucG9wKCkgOiB2b2lkIDA7Cn0KZnVuY3Rpb24gcG9wTnVtYmVyKGFyZ3MsIGRlZmF1bHRWYWx1ZSkgewogIHJldHVybiB0eXBlb2YgbGFzdChhcmdzKSA9PT0gIm51bWJlciIgPyBhcmdzLnBvcCgpIDogZGVmYXVsdFZhbHVlOwp9CnZhciBpbml0X2FyZ3MgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2FyZ3MuanMiKCkgewogICAgaW5pdF9pc0Z1bmN0aW9uKCk7CiAgICBpbml0X2lzU2NoZWR1bGVyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzQXJyYXlMaWtlLmpzCnZhciBpc0FycmF5TGlrZTsKdmFyIGluaXRfaXNBcnJheUxpa2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzQXJyYXlMaWtlLmpzIigpIHsKICAgIGlzQXJyYXlMaWtlID0gKGZ1bmN0aW9uKHgzKSB7CiAgICAgIHJldHVybiB4MyAmJiB0eXBlb2YgeDMubGVuZ3RoID09PSAibnVtYmVyIiAmJiB0eXBlb2YgeDMgIT09ICJmdW5jdGlvbiI7CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNQcm9taXNlLmpzCmZ1bmN0aW9uIGlzUHJvbWlzZSh2YWx1ZTIpIHsKICByZXR1cm4gaXNGdW5jdGlvbih2YWx1ZTIgPT09IG51bGwgfHwgdmFsdWUyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB2YWx1ZTIudGhlbik7Cn0KdmFyIGluaXRfaXNQcm9taXNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc1Byb21pc2UuanMiKCkgewogICAgaW5pdF9pc0Z1bmN0aW9uKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzSW50ZXJvcE9ic2VydmFibGUuanMKZnVuY3Rpb24gaXNJbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCkgewogIHJldHVybiBpc0Z1bmN0aW9uKGlucHV0W29ic2VydmFibGVdKTsKfQp2YXIgaW5pdF9pc0ludGVyb3BPYnNlcnZhYmxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc0ludGVyb3BPYnNlcnZhYmxlLmpzIigpIHsKICAgIGluaXRfb2JzZXJ2YWJsZSgpOwogICAgaW5pdF9pc0Z1bmN0aW9uKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzQXN5bmNJdGVyYWJsZS5qcwpmdW5jdGlvbiBpc0FzeW5jSXRlcmFibGUob2JqKSB7CiAgcmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yICYmIGlzRnVuY3Rpb24ob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSk7Cn0KdmFyIGluaXRfaXNBc3luY0l0ZXJhYmxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc0FzeW5jSXRlcmFibGUuanMiKCkgewogICAgaW5pdF9pc0Z1bmN0aW9uKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL3Rocm93VW5vYnNlcnZhYmxlRXJyb3IuanMKZnVuY3Rpb24gY3JlYXRlSW52YWxpZE9ic2VydmFibGVUeXBlRXJyb3IoaW5wdXQpIHsKICByZXR1cm4gbmV3IFR5cGVFcnJvcigiWW91IHByb3ZpZGVkICIgKyAoaW5wdXQgIT09IG51bGwgJiYgdHlwZW9mIGlucHV0ID09PSAib2JqZWN0IiA/ICJhbiBpbnZhbGlkIG9iamVjdCIgOiAiJyIgKyBpbnB1dCArICInIikgKyAiIHdoZXJlIGEgc3RyZWFtIHdhcyBleHBlY3RlZC4gWW91IGNhbiBwcm92aWRlIGFuIE9ic2VydmFibGUsIFByb21pc2UsIFJlYWRhYmxlU3RyZWFtLCBBcnJheSwgQXN5bmNJdGVyYWJsZSwgb3IgSXRlcmFibGUuIik7Cn0KdmFyIGluaXRfdGhyb3dVbm9ic2VydmFibGVFcnJvciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvdGhyb3dVbm9ic2VydmFibGVFcnJvci5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zeW1ib2wvaXRlcmF0b3IuanMKZnVuY3Rpb24gZ2V0U3ltYm9sSXRlcmF0b3IoKSB7CiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICJmdW5jdGlvbiIgfHwgIVN5bWJvbC5pdGVyYXRvcikgewogICAgcmV0dXJuICJAQGl0ZXJhdG9yIjsKICB9CiAgcmV0dXJuIFN5bWJvbC5pdGVyYXRvcjsKfQp2YXIgaXRlcmF0b3I7CnZhciBpbml0X2l0ZXJhdG9yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc3ltYm9sL2l0ZXJhdG9yLmpzIigpIHsKICAgIGl0ZXJhdG9yID0gZ2V0U3ltYm9sSXRlcmF0b3IoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNJdGVyYWJsZS5qcwpmdW5jdGlvbiBpc0l0ZXJhYmxlKGlucHV0KSB7CiAgcmV0dXJuIGlzRnVuY3Rpb24oaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGlucHV0W2l0ZXJhdG9yXSk7Cn0KdmFyIGluaXRfaXNJdGVyYWJsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNJdGVyYWJsZS5qcyIoKSB7CiAgICBpbml0X2l0ZXJhdG9yKCk7CiAgICBpbml0X2lzRnVuY3Rpb24oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNSZWFkYWJsZVN0cmVhbUxpa2UuanMKZnVuY3Rpb24gcmVhZGFibGVTdHJlYW1MaWtlVG9Bc3luY0dlbmVyYXRvcihyZWFkYWJsZVN0cmVhbSkgewogIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24gcmVhZGFibGVTdHJlYW1MaWtlVG9Bc3luY0dlbmVyYXRvcl8xKCkgewogICAgdmFyIHJlYWRlciwgX2ExMiwgdmFsdWUyLCBkb25lOwogICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9iKSB7CiAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICByZWFkZXIgPSByZWFkYWJsZVN0cmVhbS5nZXRSZWFkZXIoKTsKICAgICAgICAgIF9iLmxhYmVsID0gMTsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICBfYi50cnlzLnB1c2goWzEsICwgOSwgMTBdKTsKICAgICAgICAgIF9iLmxhYmVsID0gMjsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICBpZiAoZmFsc2UpIHJldHVybiBbMywgOF07CiAgICAgICAgICByZXR1cm4gWzQsIF9fYXdhaXQocmVhZGVyLnJlYWQoKSldOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgIF9hMTIgPSBfYi5zZW50KCksIHZhbHVlMiA9IF9hMTIudmFsdWUsIGRvbmUgPSBfYTEyLmRvbmU7CiAgICAgICAgICBpZiAoIWRvbmUpIHJldHVybiBbMywgNV07CiAgICAgICAgICByZXR1cm4gWzQsIF9fYXdhaXQodm9pZCAwKV07CiAgICAgICAgY2FzZSA0OgogICAgICAgICAgcmV0dXJuIFsyLCBfYi5zZW50KCldOwogICAgICAgIGNhc2UgNToKICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdCh2YWx1ZTIpXTsKICAgICAgICBjYXNlIDY6CiAgICAgICAgICByZXR1cm4gWzQsIF9iLnNlbnQoKV07CiAgICAgICAgY2FzZSA3OgogICAgICAgICAgX2Iuc2VudCgpOwogICAgICAgICAgcmV0dXJuIFszLCAyXTsKICAgICAgICBjYXNlIDg6CiAgICAgICAgICByZXR1cm4gWzMsIDEwXTsKICAgICAgICBjYXNlIDk6CiAgICAgICAgICByZWFkZXIucmVsZWFzZUxvY2soKTsKICAgICAgICAgIHJldHVybiBbN107CiAgICAgICAgY2FzZSAxMDoKICAgICAgICAgIHJldHVybiBbMl07CiAgICAgIH0KICAgIH0pOwogIH0pOwp9CmZ1bmN0aW9uIGlzUmVhZGFibGVTdHJlYW1MaWtlKG9iaikgewogIHJldHVybiBpc0Z1bmN0aW9uKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9iai5nZXRSZWFkZXIpOwp9CnZhciBpbml0X2lzUmVhZGFibGVTdHJlYW1MaWtlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc1JlYWRhYmxlU3RyZWFtTGlrZS5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgaW5pdF9pc0Z1bmN0aW9uKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2lubmVyRnJvbS5qcwpmdW5jdGlvbiBpbm5lckZyb20oaW5wdXQpIHsKICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7CiAgICByZXR1cm4gaW5wdXQ7CiAgfQogIGlmIChpbnB1dCAhPSBudWxsKSB7CiAgICBpZiAoaXNJbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCkpIHsKICAgICAgcmV0dXJuIGZyb21JbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCk7CiAgICB9CiAgICBpZiAoaXNBcnJheUxpa2UoaW5wdXQpKSB7CiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKGlucHV0KTsKICAgIH0KICAgIGlmIChpc1Byb21pc2UoaW5wdXQpKSB7CiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShpbnB1dCk7CiAgICB9CiAgICBpZiAoaXNBc3luY0l0ZXJhYmxlKGlucHV0KSkgewogICAgICByZXR1cm4gZnJvbUFzeW5jSXRlcmFibGUoaW5wdXQpOwogICAgfQogICAgaWYgKGlzSXRlcmFibGUoaW5wdXQpKSB7CiAgICAgIHJldHVybiBmcm9tSXRlcmFibGUoaW5wdXQpOwogICAgfQogICAgaWYgKGlzUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0KSkgewogICAgICByZXR1cm4gZnJvbVJlYWRhYmxlU3RyZWFtTGlrZShpbnB1dCk7CiAgICB9CiAgfQogIHRocm93IGNyZWF0ZUludmFsaWRPYnNlcnZhYmxlVHlwZUVycm9yKGlucHV0KTsKfQpmdW5jdGlvbiBmcm9tSW50ZXJvcE9ic2VydmFibGUob2JqKSB7CiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgIHZhciBvYnMgPSBvYmpbb2JzZXJ2YWJsZV0oKTsKICAgIGlmIChpc0Z1bmN0aW9uKG9icy5zdWJzY3JpYmUpKSB7CiAgICAgIHJldHVybiBvYnMuc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgfQogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiUHJvdmlkZWQgb2JqZWN0IGRvZXMgbm90IGNvcnJlY3RseSBpbXBsZW1lbnQgU3ltYm9sLm9ic2VydmFibGUiKTsKICB9KTsKfQpmdW5jdGlvbiBmcm9tQXJyYXlMaWtlKGFycmF5KSB7CiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGFycmF5Lmxlbmd0aCAmJiAhc3Vic2NyaWJlci5jbG9zZWQ7IGkxMSsrKSB7CiAgICAgIHN1YnNjcmliZXIubmV4dChhcnJheVtpMTFdKTsKICAgIH0KICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICB9KTsKfQpmdW5jdGlvbiBmcm9tUHJvbWlzZShwcm9taXNlKSB7CiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgIHByb21pc2UudGhlbihmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkgewogICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZTIpOwogICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgfQogICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgIHJldHVybiBzdWJzY3JpYmVyLmVycm9yKGVycik7CiAgICB9KS50aGVuKG51bGwsIHJlcG9ydFVuaGFuZGxlZEVycm9yKTsKICB9KTsKfQpmdW5jdGlvbiBmcm9tSXRlcmFibGUoaXRlcmFibGUpIHsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgdmFyIGVfMSwgX2ExMjsKICAgIHRyeSB7CiAgICAgIGZvciAodmFyIGl0ZXJhYmxlXzEgPSBfX3ZhbHVlcyhpdGVyYWJsZSksIGl0ZXJhYmxlXzFfMSA9IGl0ZXJhYmxlXzEubmV4dCgpOyAhaXRlcmFibGVfMV8xLmRvbmU7IGl0ZXJhYmxlXzFfMSA9IGl0ZXJhYmxlXzEubmV4dCgpKSB7CiAgICAgICAgdmFyIHZhbHVlMiA9IGl0ZXJhYmxlXzFfMS52YWx1ZTsKICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUyKTsKICAgICAgICBpZiAoc3Vic2NyaWJlci5jbG9zZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVfMV8xKSB7CiAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07CiAgICB9IGZpbmFsbHkgewogICAgICB0cnkgewogICAgICAgIGlmIChpdGVyYWJsZV8xXzEgJiYgIWl0ZXJhYmxlXzFfMS5kb25lICYmIChfYTEyID0gaXRlcmFibGVfMS5yZXR1cm4pKSBfYTEyLmNhbGwoaXRlcmFibGVfMSk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOwogICAgICB9CiAgICB9CiAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgfSk7Cn0KZnVuY3Rpb24gZnJvbUFzeW5jSXRlcmFibGUoYXN5bmNJdGVyYWJsZSkgewogIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICBwcm9jZXNzMihhc3luY0l0ZXJhYmxlLCBzdWJzY3JpYmVyKS5jYXRjaChmdW5jdGlvbihlcnIpIHsKICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsKICAgIH0pOwogIH0pOwp9CmZ1bmN0aW9uIGZyb21SZWFkYWJsZVN0cmVhbUxpa2UocmVhZGFibGVTdHJlYW0pIHsKICByZXR1cm4gZnJvbUFzeW5jSXRlcmFibGUocmVhZGFibGVTdHJlYW1MaWtlVG9Bc3luY0dlbmVyYXRvcihyZWFkYWJsZVN0cmVhbSkpOwp9CmZ1bmN0aW9uIHByb2Nlc3MyKGFzeW5jSXRlcmFibGUsIHN1YnNjcmliZXIpIHsKICB2YXIgYXN5bmNJdGVyYWJsZV8xLCBhc3luY0l0ZXJhYmxlXzFfMTsKICB2YXIgZV8yLCBfYTEyOwogIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgdmFyIHZhbHVlMiwgZV8yXzE7CiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX2IpIHsKICAgICAgc3dpdGNoIChfYi5sYWJlbCkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIF9iLnRyeXMucHVzaChbMCwgNSwgNiwgMTFdKTsKICAgICAgICAgIGFzeW5jSXRlcmFibGVfMSA9IF9fYXN5bmNWYWx1ZXMoYXN5bmNJdGVyYWJsZSk7CiAgICAgICAgICBfYi5sYWJlbCA9IDE7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgcmV0dXJuIFs0LCBhc3luY0l0ZXJhYmxlXzEubmV4dCgpXTsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICBpZiAoIShhc3luY0l0ZXJhYmxlXzFfMSA9IF9iLnNlbnQoKSwgIWFzeW5jSXRlcmFibGVfMV8xLmRvbmUpKSByZXR1cm4gWzMsIDRdOwogICAgICAgICAgdmFsdWUyID0gYXN5bmNJdGVyYWJsZV8xXzEudmFsdWU7CiAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUyKTsKICAgICAgICAgIGlmIChzdWJzY3JpYmVyLmNsb3NlZCkgewogICAgICAgICAgICByZXR1cm4gWzJdOwogICAgICAgICAgfQogICAgICAgICAgX2IubGFiZWwgPSAzOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgIHJldHVybiBbMywgMV07CiAgICAgICAgY2FzZSA0OgogICAgICAgICAgcmV0dXJuIFszLCAxMV07CiAgICAgICAgY2FzZSA1OgogICAgICAgICAgZV8yXzEgPSBfYi5zZW50KCk7CiAgICAgICAgICBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OwogICAgICAgICAgcmV0dXJuIFszLCAxMV07CiAgICAgICAgY2FzZSA2OgogICAgICAgICAgX2IudHJ5cy5wdXNoKFs2LCAsIDksIDEwXSk7CiAgICAgICAgICBpZiAoIShhc3luY0l0ZXJhYmxlXzFfMSAmJiAhYXN5bmNJdGVyYWJsZV8xXzEuZG9uZSAmJiAoX2ExMiA9IGFzeW5jSXRlcmFibGVfMS5yZXR1cm4pKSkgcmV0dXJuIFszLCA4XTsKICAgICAgICAgIHJldHVybiBbNCwgX2ExMi5jYWxsKGFzeW5jSXRlcmFibGVfMSldOwogICAgICAgIGNhc2UgNzoKICAgICAgICAgIF9iLnNlbnQoKTsKICAgICAgICAgIF9iLmxhYmVsID0gODsKICAgICAgICBjYXNlIDg6CiAgICAgICAgICByZXR1cm4gWzMsIDEwXTsKICAgICAgICBjYXNlIDk6CiAgICAgICAgICBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7CiAgICAgICAgICByZXR1cm4gWzddOwogICAgICAgIGNhc2UgMTA6CiAgICAgICAgICByZXR1cm4gWzddOwogICAgICAgIGNhc2UgMTE6CiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICByZXR1cm4gWzJdOwogICAgICB9CiAgICB9KTsKICB9KTsKfQp2YXIgaW5pdF9pbm5lckZyb20gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2lubmVyRnJvbS5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgaW5pdF9pc0FycmF5TGlrZSgpOwogICAgaW5pdF9pc1Byb21pc2UoKTsKICAgIGluaXRfT2JzZXJ2YWJsZSgpOwogICAgaW5pdF9pc0ludGVyb3BPYnNlcnZhYmxlKCk7CiAgICBpbml0X2lzQXN5bmNJdGVyYWJsZSgpOwogICAgaW5pdF90aHJvd1Vub2JzZXJ2YWJsZUVycm9yKCk7CiAgICBpbml0X2lzSXRlcmFibGUoKTsKICAgIGluaXRfaXNSZWFkYWJsZVN0cmVhbUxpa2UoKTsKICAgIGluaXRfaXNGdW5jdGlvbigpOwogICAgaW5pdF9yZXBvcnRVbmhhbmRsZWRFcnJvcigpOwogICAgaW5pdF9vYnNlcnZhYmxlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2V4ZWN1dGVTY2hlZHVsZS5qcwpmdW5jdGlvbiBleGVjdXRlU2NoZWR1bGUocGFyZW50U3Vic2NyaXB0aW9uLCBzY2hlZHVsZXIsIHdvcmssIGRlbGF5MiwgcmVwZWF0MykgewogIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgZGVsYXkyID0gMDsKICB9CiAgaWYgKHJlcGVhdDMgPT09IHZvaWQgMCkgewogICAgcmVwZWF0MyA9IGZhbHNlOwogIH0KICB2YXIgc2NoZWR1bGVTdWJzY3JpcHRpb24gPSBzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24oKSB7CiAgICB3b3JrKCk7CiAgICBpZiAocmVwZWF0MykgewogICAgICBwYXJlbnRTdWJzY3JpcHRpb24uYWRkKHRoaXMuc2NoZWR1bGUobnVsbCwgZGVsYXkyKSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICB9CiAgfSwgZGVsYXkyKTsKICBwYXJlbnRTdWJzY3JpcHRpb24uYWRkKHNjaGVkdWxlU3Vic2NyaXB0aW9uKTsKICBpZiAoIXJlcGVhdDMpIHsKICAgIHJldHVybiBzY2hlZHVsZVN1YnNjcmlwdGlvbjsKICB9Cn0KdmFyIGluaXRfZXhlY3V0ZVNjaGVkdWxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9leGVjdXRlU2NoZWR1bGUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL29ic2VydmVPbi5qcwpmdW5jdGlvbiBvYnNlcnZlT24oc2NoZWR1bGVyLCBkZWxheTIpIHsKICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHsKICAgIGRlbGF5MiA9IDA7CiAgfQogIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIHJldHVybiBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5uZXh0KHZhbHVlMik7CiAgICAgIH0sIGRlbGF5Mik7CiAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgIH0sIGRlbGF5Mik7CiAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgcmV0dXJuIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBzdWJzY3JpYmVyLmVycm9yKGVycik7CiAgICAgIH0sIGRlbGF5Mik7CiAgICB9KSk7CiAgfSk7Cn0KdmFyIGluaXRfb2JzZXJ2ZU9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL29ic2VydmVPbi5qcyIoKSB7CiAgICBpbml0X2V4ZWN1dGVTY2hlZHVsZSgpOwogICAgaW5pdF9saWZ0KCk7CiAgICBpbml0X09wZXJhdG9yU3Vic2NyaWJlcigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3N1YnNjcmliZU9uLmpzCmZ1bmN0aW9uIHN1YnNjcmliZU9uKHNjaGVkdWxlciwgZGVsYXkyKSB7CiAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7CiAgICBkZWxheTIgPSAwOwogIH0KICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHN1YnNjcmliZXIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICB9LCBkZWxheTIpKTsKICB9KTsKfQp2YXIgaW5pdF9zdWJzY3JpYmVPbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9zdWJzY3JpYmVPbi5qcyIoKSB7CiAgICBpbml0X2xpZnQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZU9ic2VydmFibGUuanMKZnVuY3Rpb24gc2NoZWR1bGVPYnNlcnZhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHsKICByZXR1cm4gaW5uZXJGcm9tKGlucHV0KS5waXBlKHN1YnNjcmliZU9uKHNjaGVkdWxlciksIG9ic2VydmVPbihzY2hlZHVsZXIpKTsKfQp2YXIgaW5pdF9zY2hlZHVsZU9ic2VydmFibGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVPYnNlcnZhYmxlLmpzIigpIHsKICAgIGluaXRfaW5uZXJGcm9tKCk7CiAgICBpbml0X29ic2VydmVPbigpOwogICAgaW5pdF9zdWJzY3JpYmVPbigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlUHJvbWlzZS5qcwpmdW5jdGlvbiBzY2hlZHVsZVByb21pc2UoaW5wdXQsIHNjaGVkdWxlcikgewogIHJldHVybiBpbm5lckZyb20oaW5wdXQpLnBpcGUoc3Vic2NyaWJlT24oc2NoZWR1bGVyKSwgb2JzZXJ2ZU9uKHNjaGVkdWxlcikpOwp9CnZhciBpbml0X3NjaGVkdWxlUHJvbWlzZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZVByb21pc2UuanMiKCkgewogICAgaW5pdF9pbm5lckZyb20oKTsKICAgIGluaXRfb2JzZXJ2ZU9uKCk7CiAgICBpbml0X3N1YnNjcmliZU9uKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVBcnJheS5qcwpmdW5jdGlvbiBzY2hlZHVsZUFycmF5KGlucHV0LCBzY2hlZHVsZXIpIHsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgdmFyIGkxMSA9IDA7CiAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uKCkgewogICAgICBpZiAoaTExID09PSBpbnB1dC5sZW5ndGgpIHsKICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3Vic2NyaWJlci5uZXh0KGlucHV0W2kxMSsrXSk7CiAgICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkgewogICAgICAgICAgdGhpcy5zY2hlZHVsZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgfSk7Cn0KdmFyIGluaXRfc2NoZWR1bGVBcnJheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZUFycmF5LmpzIigpIHsKICAgIGluaXRfT2JzZXJ2YWJsZSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlSXRlcmFibGUuanMKZnVuY3Rpb24gc2NoZWR1bGVJdGVyYWJsZShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgIHZhciBpdGVyYXRvcjI7CiAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHsKICAgICAgaXRlcmF0b3IyID0gaW5wdXRbaXRlcmF0b3JdKCk7CiAgICAgIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBfYTEyOwogICAgICAgIHZhciB2YWx1ZTI7CiAgICAgICAgdmFyIGRvbmU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIF9hMTIgPSBpdGVyYXRvcjIubmV4dCgpLCB2YWx1ZTIgPSBfYTEyLnZhbHVlLCBkb25lID0gX2ExMi5kb25lOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnIpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoZG9uZSkgewogICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUyKTsKICAgICAgICB9CiAgICAgIH0sIDAsIHRydWUpOwogICAgfSk7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBpc0Z1bmN0aW9uKGl0ZXJhdG9yMiA9PT0gbnVsbCB8fCBpdGVyYXRvcjIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGl0ZXJhdG9yMi5yZXR1cm4pICYmIGl0ZXJhdG9yMi5yZXR1cm4oKTsKICAgIH07CiAgfSk7Cn0KdmFyIGluaXRfc2NoZWR1bGVJdGVyYWJsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZUl0ZXJhYmxlLmpzIigpIHsKICAgIGluaXRfT2JzZXJ2YWJsZSgpOwogICAgaW5pdF9pdGVyYXRvcigpOwogICAgaW5pdF9pc0Z1bmN0aW9uKCk7CiAgICBpbml0X2V4ZWN1dGVTY2hlZHVsZSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlQXN5bmNJdGVyYWJsZS5qcwpmdW5jdGlvbiBzY2hlZHVsZUFzeW5jSXRlcmFibGUoaW5wdXQsIHNjaGVkdWxlcikgewogIGlmICghaW5wdXQpIHsKICAgIHRocm93IG5ldyBFcnJvcigiSXRlcmFibGUgY2Fubm90IGJlIG51bGwiKTsKICB9CiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkgewogICAgICB2YXIgaXRlcmF0b3IyID0gaW5wdXRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7CiAgICAgIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkgewogICAgICAgIGl0ZXJhdG9yMi5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkgewogICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQocmVzdWx0LnZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSwgMCwgdHJ1ZSk7CiAgICB9KTsKICB9KTsKfQp2YXIgaW5pdF9zY2hlZHVsZUFzeW5jSXRlcmFibGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVBc3luY0l0ZXJhYmxlLmpzIigpIHsKICAgIGluaXRfT2JzZXJ2YWJsZSgpOwogICAgaW5pdF9leGVjdXRlU2NoZWR1bGUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZVJlYWRhYmxlU3RyZWFtTGlrZS5qcwpmdW5jdGlvbiBzY2hlZHVsZVJlYWRhYmxlU3RyZWFtTGlrZShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgcmV0dXJuIHNjaGVkdWxlQXN5bmNJdGVyYWJsZShyZWFkYWJsZVN0cmVhbUxpa2VUb0FzeW5jR2VuZXJhdG9yKGlucHV0KSwgc2NoZWR1bGVyKTsKfQp2YXIgaW5pdF9zY2hlZHVsZVJlYWRhYmxlU3RyZWFtTGlrZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZVJlYWRhYmxlU3RyZWFtTGlrZS5qcyIoKSB7CiAgICBpbml0X3NjaGVkdWxlQXN5bmNJdGVyYWJsZSgpOwogICAgaW5pdF9pc1JlYWRhYmxlU3RyZWFtTGlrZSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlZC5qcwpmdW5jdGlvbiBzY2hlZHVsZWQoaW5wdXQsIHNjaGVkdWxlcikgewogIGlmIChpbnB1dCAhPSBudWxsKSB7CiAgICBpZiAoaXNJbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCkpIHsKICAgICAgcmV0dXJuIHNjaGVkdWxlT2JzZXJ2YWJsZShpbnB1dCwgc2NoZWR1bGVyKTsKICAgIH0KICAgIGlmIChpc0FycmF5TGlrZShpbnB1dCkpIHsKICAgICAgcmV0dXJuIHNjaGVkdWxlQXJyYXkoaW5wdXQsIHNjaGVkdWxlcik7CiAgICB9CiAgICBpZiAoaXNQcm9taXNlKGlucHV0KSkgewogICAgICByZXR1cm4gc2NoZWR1bGVQcm9taXNlKGlucHV0LCBzY2hlZHVsZXIpOwogICAgfQogICAgaWYgKGlzQXN5bmNJdGVyYWJsZShpbnB1dCkpIHsKICAgICAgcmV0dXJuIHNjaGVkdWxlQXN5bmNJdGVyYWJsZShpbnB1dCwgc2NoZWR1bGVyKTsKICAgIH0KICAgIGlmIChpc0l0ZXJhYmxlKGlucHV0KSkgewogICAgICByZXR1cm4gc2NoZWR1bGVJdGVyYWJsZShpbnB1dCwgc2NoZWR1bGVyKTsKICAgIH0KICAgIGlmIChpc1JlYWRhYmxlU3RyZWFtTGlrZShpbnB1dCkpIHsKICAgICAgcmV0dXJuIHNjaGVkdWxlUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0LCBzY2hlZHVsZXIpOwogICAgfQogIH0KICB0aHJvdyBjcmVhdGVJbnZhbGlkT2JzZXJ2YWJsZVR5cGVFcnJvcihpbnB1dCk7Cn0KdmFyIGluaXRfc2NoZWR1bGVkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlZC5qcyIoKSB7CiAgICBpbml0X3NjaGVkdWxlT2JzZXJ2YWJsZSgpOwogICAgaW5pdF9zY2hlZHVsZVByb21pc2UoKTsKICAgIGluaXRfc2NoZWR1bGVBcnJheSgpOwogICAgaW5pdF9zY2hlZHVsZUl0ZXJhYmxlKCk7CiAgICBpbml0X3NjaGVkdWxlQXN5bmNJdGVyYWJsZSgpOwogICAgaW5pdF9pc0ludGVyb3BPYnNlcnZhYmxlKCk7CiAgICBpbml0X2lzUHJvbWlzZSgpOwogICAgaW5pdF9pc0FycmF5TGlrZSgpOwogICAgaW5pdF9pc0l0ZXJhYmxlKCk7CiAgICBpbml0X2lzQXN5bmNJdGVyYWJsZSgpOwogICAgaW5pdF90aHJvd1Vub2JzZXJ2YWJsZUVycm9yKCk7CiAgICBpbml0X2lzUmVhZGFibGVTdHJlYW1MaWtlKCk7CiAgICBpbml0X3NjaGVkdWxlUmVhZGFibGVTdHJlYW1MaWtlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb20uanMKZnVuY3Rpb24gZnJvbShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgcmV0dXJuIHNjaGVkdWxlciA/IHNjaGVkdWxlZChpbnB1dCwgc2NoZWR1bGVyKSA6IGlubmVyRnJvbShpbnB1dCk7Cn0KdmFyIGluaXRfZnJvbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZnJvbS5qcyIoKSB7CiAgICBpbml0X3NjaGVkdWxlZCgpOwogICAgaW5pdF9pbm5lckZyb20oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvb2YuanMKZnVuY3Rpb24gb2YoKSB7CiAgdmFyIGFyZ3MgPSBbXTsKICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldOwogIH0KICB2YXIgc2NoZWR1bGVyID0gcG9wU2NoZWR1bGVyKGFyZ3MpOwogIHJldHVybiBmcm9tKGFyZ3MsIHNjaGVkdWxlcik7Cn0KdmFyIGluaXRfb2YgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL29mLmpzIigpIHsKICAgIGluaXRfYXJncygpOwogICAgaW5pdF9mcm9tKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3Rocm93RXJyb3IuanMKZnVuY3Rpb24gdGhyb3dFcnJvcihlcnJvck9yRXJyb3JGYWN0b3J5LCBzY2hlZHVsZXIpIHsKICB2YXIgZXJyb3JGYWN0b3J5ID0gaXNGdW5jdGlvbihlcnJvck9yRXJyb3JGYWN0b3J5KSA/IGVycm9yT3JFcnJvckZhY3RvcnkgOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBlcnJvck9yRXJyb3JGYWN0b3J5OwogIH07CiAgdmFyIGluaXQgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICByZXR1cm4gc3Vic2NyaWJlci5lcnJvcihlcnJvckZhY3RvcnkoKSk7CiAgfTsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoc2NoZWR1bGVyID8gZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgcmV0dXJuIHNjaGVkdWxlci5zY2hlZHVsZShpbml0LCAwLCBzdWJzY3JpYmVyKTsKICB9IDogaW5pdCk7Cn0KdmFyIGluaXRfdGhyb3dFcnJvciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvdGhyb3dFcnJvci5qcyIoKSB7CiAgICBpbml0X09ic2VydmFibGUoKTsKICAgIGluaXRfaXNGdW5jdGlvbigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvTm90aWZpY2F0aW9uLmpzCmZ1bmN0aW9uIG9ic2VydmVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBvYnNlcnZlcikgewogIHZhciBfYTEyLCBfYiwgX2M7CiAgdmFyIF9kID0gbm90aWZpY2F0aW9uLCBraW5kID0gX2Qua2luZCwgdmFsdWUyID0gX2QudmFsdWUsIGVycm9yID0gX2QuZXJyb3I7CiAgaWYgKHR5cGVvZiBraW5kICE9PSAic3RyaW5nIikgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBub3RpZmljYXRpb24sIG1pc3NpbmcgImtpbmQiJyk7CiAgfQogIGtpbmQgPT09ICJOIiA/IChfYTEyID0gb2JzZXJ2ZXIubmV4dCkgPT09IG51bGwgfHwgX2ExMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ExMi5jYWxsKG9ic2VydmVyLCB2YWx1ZTIpIDoga2luZCA9PT0gIkUiID8gKF9iID0gb2JzZXJ2ZXIuZXJyb3IpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKG9ic2VydmVyLCBlcnJvcikgOiAoX2MgPSBvYnNlcnZlci5jb21wbGV0ZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmNhbGwob2JzZXJ2ZXIpOwp9CnZhciBOb3RpZmljYXRpb25LaW5kLCBOb3RpZmljYXRpb247CnZhciBpbml0X05vdGlmaWNhdGlvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL05vdGlmaWNhdGlvbi5qcyIoKSB7CiAgICBpbml0X2VtcHR5KCk7CiAgICBpbml0X29mKCk7CiAgICBpbml0X3Rocm93RXJyb3IoKTsKICAgIGluaXRfaXNGdW5jdGlvbigpOwogICAgKGZ1bmN0aW9uKE5vdGlmaWNhdGlvbktpbmQyKSB7CiAgICAgIE5vdGlmaWNhdGlvbktpbmQyWyJORVhUIl0gPSAiTiI7CiAgICAgIE5vdGlmaWNhdGlvbktpbmQyWyJFUlJPUiJdID0gIkUiOwogICAgICBOb3RpZmljYXRpb25LaW5kMlsiQ09NUExFVEUiXSA9ICJDIjsKICAgIH0pKE5vdGlmaWNhdGlvbktpbmQgfHwgKE5vdGlmaWNhdGlvbktpbmQgPSB7fSkpOwogICAgTm90aWZpY2F0aW9uID0gKGZ1bmN0aW9uKCkgewogICAgICBmdW5jdGlvbiBOb3RpZmljYXRpb24yKGtpbmQsIHZhbHVlMiwgZXJyb3IpIHsKICAgICAgICB0aGlzLmtpbmQgPSBraW5kOwogICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTI7CiAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yOwogICAgICAgIHRoaXMuaGFzVmFsdWUgPSBraW5kID09PSAiTiI7CiAgICAgIH0KICAgICAgTm90aWZpY2F0aW9uMi5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uKG9ic2VydmVyKSB7CiAgICAgICAgcmV0dXJuIG9ic2VydmVOb3RpZmljYXRpb24odGhpcywgb2JzZXJ2ZXIpOwogICAgICB9OwogICAgICBOb3RpZmljYXRpb24yLnByb3RvdHlwZS5kbyA9IGZ1bmN0aW9uKG5leHRIYW5kbGVyLCBlcnJvckhhbmRsZXIsIGNvbXBsZXRlSGFuZGxlcikgewogICAgICAgIHZhciBfYTEyID0gdGhpcywga2luZCA9IF9hMTIua2luZCwgdmFsdWUyID0gX2ExMi52YWx1ZSwgZXJyb3IgPSBfYTEyLmVycm9yOwogICAgICAgIHJldHVybiBraW5kID09PSAiTiIgPyBuZXh0SGFuZGxlciA9PT0gbnVsbCB8fCBuZXh0SGFuZGxlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmV4dEhhbmRsZXIodmFsdWUyKSA6IGtpbmQgPT09ICJFIiA/IGVycm9ySGFuZGxlciA9PT0gbnVsbCB8fCBlcnJvckhhbmRsZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9ySGFuZGxlcihlcnJvcikgOiBjb21wbGV0ZUhhbmRsZXIgPT09IG51bGwgfHwgY29tcGxldGVIYW5kbGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb21wbGV0ZUhhbmRsZXIoKTsKICAgICAgfTsKICAgICAgTm90aWZpY2F0aW9uMi5wcm90b3R5cGUuYWNjZXB0ID0gZnVuY3Rpb24obmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSkgewogICAgICAgIHZhciBfYTEyOwogICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKChfYTEyID0gbmV4dE9yT2JzZXJ2ZXIpID09PSBudWxsIHx8IF9hMTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hMTIubmV4dCkgPyB0aGlzLm9ic2VydmUobmV4dE9yT2JzZXJ2ZXIpIDogdGhpcy5kbyhuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlKTsKICAgICAgfTsKICAgICAgTm90aWZpY2F0aW9uMi5wcm90b3R5cGUudG9PYnNlcnZhYmxlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIF9hMTIgPSB0aGlzLCBraW5kID0gX2ExMi5raW5kLCB2YWx1ZTIgPSBfYTEyLnZhbHVlLCBlcnJvciA9IF9hMTIuZXJyb3I7CiAgICAgICAgdmFyIHJlc3VsdCA9IGtpbmQgPT09ICJOIiA/IG9mKHZhbHVlMikgOiBraW5kID09PSAiRSIgPyB0aHJvd0Vycm9yKGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGVycm9yOwogICAgICAgIH0pIDoga2luZCA9PT0gIkMiID8gRU1QVFkgOiAwOwogICAgICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmV4cGVjdGVkIG5vdGlmaWNhdGlvbiBraW5kICIgKyBraW5kKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgTm90aWZpY2F0aW9uMi5jcmVhdGVOZXh0ID0gZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIG5ldyBOb3RpZmljYXRpb24yKCJOIiwgdmFsdWUyKTsKICAgICAgfTsKICAgICAgTm90aWZpY2F0aW9uMi5jcmVhdGVFcnJvciA9IGZ1bmN0aW9uKGVycikgewogICAgICAgIHJldHVybiBuZXcgTm90aWZpY2F0aW9uMigiRSIsIHZvaWQgMCwgZXJyKTsKICAgICAgfTsKICAgICAgTm90aWZpY2F0aW9uMi5jcmVhdGVDb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBOb3RpZmljYXRpb24yLmNvbXBsZXRlTm90aWZpY2F0aW9uOwogICAgICB9OwogICAgICBOb3RpZmljYXRpb24yLmNvbXBsZXRlTm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbjIoIkMiKTsKICAgICAgcmV0dXJuIE5vdGlmaWNhdGlvbjI7CiAgICB9KSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc09ic2VydmFibGUuanMKdmFyIGluaXRfaXNPYnNlcnZhYmxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc09ic2VydmFibGUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9FbXB0eUVycm9yLmpzCnZhciBFbXB0eUVycm9yOwp2YXIgaW5pdF9FbXB0eUVycm9yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9FbXB0eUVycm9yLmpzIigpIHsKICAgIGluaXRfY3JlYXRlRXJyb3JDbGFzcygpOwogICAgRW1wdHlFcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3MoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiBFbXB0eUVycm9ySW1wbCgpIHsKICAgICAgICBfc3VwZXIodGhpcyk7CiAgICAgICAgdGhpcy5uYW1lID0gIkVtcHR5RXJyb3IiOwogICAgICAgIHRoaXMubWVzc2FnZSA9ICJubyBlbGVtZW50cyBpbiBzZXF1ZW5jZSI7CiAgICAgIH07CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL2xhc3RWYWx1ZUZyb20uanMKdmFyIGluaXRfbGFzdFZhbHVlRnJvbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL2xhc3RWYWx1ZUZyb20uanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvZmlyc3RWYWx1ZUZyb20uanMKdmFyIGluaXRfZmlyc3RWYWx1ZUZyb20gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9maXJzdFZhbHVlRnJvbS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL0FyZ3VtZW50T3V0T2ZSYW5nZUVycm9yLmpzCnZhciBBcmd1bWVudE91dE9mUmFuZ2VFcnJvcjsKdmFyIGluaXRfQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL0FyZ3VtZW50T3V0T2ZSYW5nZUVycm9yLmpzIigpIHsKICAgIGluaXRfY3JlYXRlRXJyb3JDbGFzcygpOwogICAgQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IgPSBjcmVhdGVFcnJvckNsYXNzKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICByZXR1cm4gZnVuY3Rpb24gQXJndW1lbnRPdXRPZlJhbmdlRXJyb3JJbXBsKCkgewogICAgICAgIF9zdXBlcih0aGlzKTsKICAgICAgICB0aGlzLm5hbWUgPSAiQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IiOwogICAgICAgIHRoaXMubWVzc2FnZSA9ICJhcmd1bWVudCBvdXQgb2YgcmFuZ2UiOwogICAgICB9OwogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL05vdEZvdW5kRXJyb3IuanMKdmFyIE5vdEZvdW5kRXJyb3I7CnZhciBpbml0X05vdEZvdW5kRXJyb3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL05vdEZvdW5kRXJyb3IuanMiKCkgewogICAgaW5pdF9jcmVhdGVFcnJvckNsYXNzKCk7CiAgICBOb3RGb3VuZEVycm9yID0gY3JlYXRlRXJyb3JDbGFzcyhmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIE5vdEZvdW5kRXJyb3JJbXBsKG1lc3NhZ2UyKSB7CiAgICAgICAgX3N1cGVyKHRoaXMpOwogICAgICAgIHRoaXMubmFtZSA9ICJOb3RGb3VuZEVycm9yIjsKICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlMjsKICAgICAgfTsKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9TZXF1ZW5jZUVycm9yLmpzCnZhciBTZXF1ZW5jZUVycm9yOwp2YXIgaW5pdF9TZXF1ZW5jZUVycm9yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9TZXF1ZW5jZUVycm9yLmpzIigpIHsKICAgIGluaXRfY3JlYXRlRXJyb3JDbGFzcygpOwogICAgU2VxdWVuY2VFcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3MoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiBTZXF1ZW5jZUVycm9ySW1wbChtZXNzYWdlMikgewogICAgICAgIF9zdXBlcih0aGlzKTsKICAgICAgICB0aGlzLm5hbWUgPSAiU2VxdWVuY2VFcnJvciI7CiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTI7CiAgICAgIH07CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNEYXRlLmpzCmZ1bmN0aW9uIGlzVmFsaWREYXRlKHZhbHVlMikgewogIHJldHVybiB2YWx1ZTIgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTih2YWx1ZTIpOwp9CnZhciBpbml0X2lzRGF0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNEYXRlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90aW1lb3V0LmpzCmZ1bmN0aW9uIHRpbWVvdXQoY29uZmlnMywgc2NoZWR1bGVyQXJnKSB7CiAgdmFyIF9hMTIgPSBpc1ZhbGlkRGF0ZShjb25maWczKSA/IHsgZmlyc3Q6IGNvbmZpZzMgfSA6IHR5cGVvZiBjb25maWczID09PSAibnVtYmVyIiA/IHsgZWFjaDogY29uZmlnMyB9IDogY29uZmlnMywgZmlyc3QyID0gX2ExMi5maXJzdCwgZWFjaCA9IF9hMTIuZWFjaCwgX2IgPSBfYTEyLndpdGgsIF93aXRoID0gX2IgPT09IHZvaWQgMCA/IHRpbWVvdXRFcnJvckZhY3RvcnkgOiBfYiwgX2MgPSBfYTEyLnNjaGVkdWxlciwgc2NoZWR1bGVyID0gX2MgPT09IHZvaWQgMCA/IHNjaGVkdWxlckFyZyAhPT0gbnVsbCAmJiBzY2hlZHVsZXJBcmcgIT09IHZvaWQgMCA/IHNjaGVkdWxlckFyZyA6IGFzeW5jU2NoZWR1bGVyIDogX2MsIF9kID0gX2ExMi5tZXRhLCBtZXRhID0gX2QgPT09IHZvaWQgMCA/IG51bGwgOiBfZDsKICBpZiAoZmlyc3QyID09IG51bGwgJiYgZWFjaCA9PSBudWxsKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJObyB0aW1lb3V0IHByb3ZpZGVkLiIpOwogIH0KICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHZhciBvcmlnaW5hbFNvdXJjZVN1YnNjcmlwdGlvbjsKICAgIHZhciB0aW1lclN1YnNjcmlwdGlvbjsKICAgIHZhciBsYXN0VmFsdWUgPSBudWxsOwogICAgdmFyIHNlZW4gPSAwOwogICAgdmFyIHN0YXJ0VGltZXIgPSBmdW5jdGlvbihkZWxheTIpIHsKICAgICAgdGltZXJTdWJzY3JpcHRpb24gPSBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHsKICAgICAgICB0cnkgewogICAgICAgICAgb3JpZ2luYWxTb3VyY2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgIGlubmVyRnJvbShfd2l0aCh7CiAgICAgICAgICAgIG1ldGEsCiAgICAgICAgICAgIGxhc3RWYWx1ZSwKICAgICAgICAgICAgc2VlbgogICAgICAgICAgfSkpLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsKICAgICAgICB9CiAgICAgIH0sIGRlbGF5Mik7CiAgICB9OwogICAgb3JpZ2luYWxTb3VyY2VTdWJzY3JpcHRpb24gPSBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgdGltZXJTdWJzY3JpcHRpb24gPT09IG51bGwgfHwgdGltZXJTdWJzY3JpcHRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRpbWVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgIHNlZW4rKzsKICAgICAgc3Vic2NyaWJlci5uZXh0KGxhc3RWYWx1ZSA9IHZhbHVlMik7CiAgICAgIGVhY2ggPiAwICYmIHN0YXJ0VGltZXIoZWFjaCk7CiAgICB9LCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24oKSB7CiAgICAgIGlmICghKHRpbWVyU3Vic2NyaXB0aW9uID09PSBudWxsIHx8IHRpbWVyU3Vic2NyaXB0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0aW1lclN1YnNjcmlwdGlvbi5jbG9zZWQpKSB7CiAgICAgICAgdGltZXJTdWJzY3JpcHRpb24gPT09IG51bGwgfHwgdGltZXJTdWJzY3JpcHRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRpbWVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgIH0KICAgICAgbGFzdFZhbHVlID0gbnVsbDsKICAgIH0pKTsKICAgICFzZWVuICYmIHN0YXJ0VGltZXIoZmlyc3QyICE9IG51bGwgPyB0eXBlb2YgZmlyc3QyID09PSAibnVtYmVyIiA/IGZpcnN0MiA6ICtmaXJzdDIgLSBzY2hlZHVsZXIubm93KCkgOiBlYWNoKTsKICB9KTsKfQpmdW5jdGlvbiB0aW1lb3V0RXJyb3JGYWN0b3J5KGluZm8pIHsKICB0aHJvdyBuZXcgVGltZW91dEVycm9yKGluZm8pOwp9CnZhciBUaW1lb3V0RXJyb3I7CnZhciBpbml0X3RpbWVvdXQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGltZW91dC5qcyIoKSB7CiAgICBpbml0X2FzeW5jKCk7CiAgICBpbml0X2lzRGF0ZSgpOwogICAgaW5pdF9saWZ0KCk7CiAgICBpbml0X2lubmVyRnJvbSgpOwogICAgaW5pdF9jcmVhdGVFcnJvckNsYXNzKCk7CiAgICBpbml0X09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgaW5pdF9leGVjdXRlU2NoZWR1bGUoKTsKICAgIFRpbWVvdXRFcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3MoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiBUaW1lb3V0RXJyb3JJbXBsKGluZm8pIHsKICAgICAgICBpZiAoaW5mbyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBpbmZvID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgX3N1cGVyKHRoaXMpOwogICAgICAgIHRoaXMubWVzc2FnZSA9ICJUaW1lb3V0IGhhcyBvY2N1cnJlZCI7CiAgICAgICAgdGhpcy5uYW1lID0gIlRpbWVvdXRFcnJvciI7CiAgICAgICAgdGhpcy5pbmZvID0gaW5mbzsKICAgICAgfTsKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21hcC5qcwpmdW5jdGlvbiBtYXAyKHByb2plY3QsIHRoaXNBcmcpIHsKICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHZhciBpbmRleDIgPSAwOwogICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIHN1YnNjcmliZXIubmV4dChwcm9qZWN0LmNhbGwodGhpc0FyZywgdmFsdWUyLCBpbmRleDIrKykpOwogICAgfSkpOwogIH0pOwp9CnZhciBpbml0X21hcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tYXAuanMiKCkgewogICAgaW5pdF9saWZ0KCk7CiAgICBpbml0X09wZXJhdG9yU3Vic2NyaWJlcigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9tYXBPbmVPck1hbnlBcmdzLmpzCmZ1bmN0aW9uIGNhbGxPckFwcGx5KGZuLCBhcmdzKSB7CiAgcmV0dXJuIGlzQXJyYXkoYXJncykgPyBmbi5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChhcmdzKSkpIDogZm4oYXJncyk7Cn0KZnVuY3Rpb24gbWFwT25lT3JNYW55QXJncyhmbikgewogIHJldHVybiBtYXAyKGZ1bmN0aW9uKGFyZ3MpIHsKICAgIHJldHVybiBjYWxsT3JBcHBseShmbiwgYXJncyk7CiAgfSk7Cn0KdmFyIGlzQXJyYXk7CnZhciBpbml0X21hcE9uZU9yTWFueUFyZ3MgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL21hcE9uZU9yTWFueUFyZ3MuanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGluaXRfbWFwKCk7CiAgICBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvYmluZENhbGxiYWNrLmpzCnZhciBpbml0X2JpbmRDYWxsYmFjayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvYmluZENhbGxiYWNrLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvYmluZE5vZGVDYWxsYmFjay5qcwp2YXIgaW5pdF9iaW5kTm9kZUNhbGxiYWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9iaW5kTm9kZUNhbGxiYWNrLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvY29tYmluZUxhdGVzdC5qcwp2YXIgaW5pdF9jb21iaW5lTGF0ZXN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9jb21iaW5lTGF0ZXN0LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZUludGVybmFscy5qcwpmdW5jdGlvbiBtZXJnZUludGVybmFscyhzb3VyY2UsIHN1YnNjcmliZXIsIHByb2plY3QsIGNvbmN1cnJlbnQsIG9uQmVmb3JlTmV4dCwgZXhwYW5kMiwgaW5uZXJTdWJTY2hlZHVsZXIsIGFkZGl0aW9uYWxGaW5hbGl6ZXIpIHsKICB2YXIgYnVmZmVyMiA9IFtdOwogIHZhciBhY3RpdmUgPSAwOwogIHZhciBpbmRleDIgPSAwOwogIHZhciBpc0NvbXBsZXRlID0gZmFsc2U7CiAgdmFyIGNoZWNrQ29tcGxldGUgPSBmdW5jdGlvbigpIHsKICAgIGlmIChpc0NvbXBsZXRlICYmICFidWZmZXIyLmxlbmd0aCAmJiAhYWN0aXZlKSB7CiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgIH0KICB9OwogIHZhciBvdXRlck5leHQgPSBmdW5jdGlvbih2YWx1ZTIpIHsKICAgIHJldHVybiBhY3RpdmUgPCBjb25jdXJyZW50ID8gZG9Jbm5lclN1Yih2YWx1ZTIpIDogYnVmZmVyMi5wdXNoKHZhbHVlMik7CiAgfTsKICB2YXIgZG9Jbm5lclN1YiA9IGZ1bmN0aW9uKHZhbHVlMikgewogICAgZXhwYW5kMiAmJiBzdWJzY3JpYmVyLm5leHQodmFsdWUyKTsKICAgIGFjdGl2ZSsrOwogICAgdmFyIGlubmVyQ29tcGxldGUgPSBmYWxzZTsKICAgIGlubmVyRnJvbShwcm9qZWN0KHZhbHVlMiwgaW5kZXgyKyspKS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKGlubmVyVmFsdWUpIHsKICAgICAgb25CZWZvcmVOZXh0ID09PSBudWxsIHx8IG9uQmVmb3JlTmV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CZWZvcmVOZXh0KGlubmVyVmFsdWUpOwogICAgICBpZiAoZXhwYW5kMikgewogICAgICAgIG91dGVyTmV4dChpbm5lclZhbHVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdWJzY3JpYmVyLm5leHQoaW5uZXJWYWx1ZSk7CiAgICAgIH0KICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICBpbm5lckNvbXBsZXRlID0gdHJ1ZTsKICAgIH0sIHZvaWQgMCwgZnVuY3Rpb24oKSB7CiAgICAgIGlmIChpbm5lckNvbXBsZXRlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGFjdGl2ZS0tOwogICAgICAgICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGJ1ZmZlcmVkVmFsdWUgPSBidWZmZXIyLnNoaWZ0KCk7CiAgICAgICAgICAgIGlmIChpbm5lclN1YlNjaGVkdWxlcikgewogICAgICAgICAgICAgIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBpbm5lclN1YlNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZG9Jbm5lclN1YihidWZmZXJlZFZhbHVlKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBkb0lubmVyU3ViKGJ1ZmZlcmVkVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgd2hpbGUgKGJ1ZmZlcjIubGVuZ3RoICYmIGFjdGl2ZSA8IGNvbmN1cnJlbnQpIHsKICAgICAgICAgICAgX2xvb3BfMSgpOwogICAgICAgICAgfQogICAgICAgICAgY2hlY2tDb21wbGV0ZSgpOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnIpOwogICAgICAgIH0KICAgICAgfQogICAgfSkpOwogIH07CiAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgb3V0ZXJOZXh0LCBmdW5jdGlvbigpIHsKICAgIGlzQ29tcGxldGUgPSB0cnVlOwogICAgY2hlY2tDb21wbGV0ZSgpOwogIH0pKTsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICBhZGRpdGlvbmFsRmluYWxpemVyID09PSBudWxsIHx8IGFkZGl0aW9uYWxGaW5hbGl6ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFkZGl0aW9uYWxGaW5hbGl6ZXIoKTsKICB9Owp9CnZhciBpbml0X21lcmdlSW50ZXJuYWxzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlSW50ZXJuYWxzLmpzIigpIHsKICAgIGluaXRfaW5uZXJGcm9tKCk7CiAgICBpbml0X2V4ZWN1dGVTY2hlZHVsZSgpOwogICAgaW5pdF9PcGVyYXRvclN1YnNjcmliZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZU1hcC5qcwpmdW5jdGlvbiBtZXJnZU1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3RvciwgY29uY3VycmVudCkgewogIGlmIChjb25jdXJyZW50ID09PSB2b2lkIDApIHsKICAgIGNvbmN1cnJlbnQgPSBJbmZpbml0eTsKICB9CiAgaWYgKGlzRnVuY3Rpb24ocmVzdWx0U2VsZWN0b3IpKSB7CiAgICByZXR1cm4gbWVyZ2VNYXAoZnVuY3Rpb24oYTUsIGkxMSkgewogICAgICByZXR1cm4gbWFwMihmdW5jdGlvbihiNSwgaWkpIHsKICAgICAgICByZXR1cm4gcmVzdWx0U2VsZWN0b3IoYTUsIGI1LCBpMTEsIGlpKTsKICAgICAgfSkoaW5uZXJGcm9tKHByb2plY3QoYTUsIGkxMSkpKTsKICAgIH0sIGNvbmN1cnJlbnQpOwogIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdFNlbGVjdG9yID09PSAibnVtYmVyIikgewogICAgY29uY3VycmVudCA9IHJlc3VsdFNlbGVjdG9yOwogIH0KICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHJldHVybiBtZXJnZUludGVybmFscyhzb3VyY2UsIHN1YnNjcmliZXIsIHByb2plY3QsIGNvbmN1cnJlbnQpOwogIH0pOwp9CnZhciBpbml0X21lcmdlTWFwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlTWFwLmpzIigpIHsKICAgIGluaXRfbWFwKCk7CiAgICBpbml0X2lubmVyRnJvbSgpOwogICAgaW5pdF9saWZ0KCk7CiAgICBpbml0X21lcmdlSW50ZXJuYWxzKCk7CiAgICBpbml0X2lzRnVuY3Rpb24oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZUFsbC5qcwpmdW5jdGlvbiBtZXJnZUFsbChjb25jdXJyZW50KSB7CiAgaWYgKGNvbmN1cnJlbnQgPT09IHZvaWQgMCkgewogICAgY29uY3VycmVudCA9IEluZmluaXR5OwogIH0KICByZXR1cm4gbWVyZ2VNYXAoaWRlbnRpdHksIGNvbmN1cnJlbnQpOwp9CnZhciBpbml0X21lcmdlQWxsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlQWxsLmpzIigpIHsKICAgIGluaXRfbWVyZ2VNYXAoKTsKICAgIGluaXRfaWRlbnRpdHkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb25jYXRBbGwuanMKZnVuY3Rpb24gY29uY2F0QWxsKCkgewogIHJldHVybiBtZXJnZUFsbCgxKTsKfQp2YXIgaW5pdF9jb25jYXRBbGwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvY29uY2F0QWxsLmpzIigpIHsKICAgIGluaXRfbWVyZ2VBbGwoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvY29uY2F0LmpzCmZ1bmN0aW9uIGNvbmNhdCgpIHsKICB2YXIgYXJncyA9IFtdOwogIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgfQogIHJldHVybiBjb25jYXRBbGwoKShmcm9tKGFyZ3MsIHBvcFNjaGVkdWxlcihhcmdzKSkpOwp9CnZhciBpbml0X2NvbmNhdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvY29uY2F0LmpzIigpIHsKICAgIGluaXRfY29uY2F0QWxsKCk7CiAgICBpbml0X2FyZ3MoKTsKICAgIGluaXRfZnJvbSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9kZWZlci5qcwp2YXIgaW5pdF9kZWZlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZGVmZXIuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9jb25uZWN0YWJsZS5qcwp2YXIgaW5pdF9jb25uZWN0YWJsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvY29ubmVjdGFibGUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mb3JrSm9pbi5qcwp2YXIgaW5pdF9mb3JrSm9pbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZm9ya0pvaW4uanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mcm9tRXZlbnQuanMKZnVuY3Rpb24gZnJvbUV2ZW50KHRhcmdldCwgZXZlbnROYW1lLCBvcHRpb25zLCByZXN1bHRTZWxlY3RvcikgewogIGlmIChpc0Z1bmN0aW9uKG9wdGlvbnMpKSB7CiAgICByZXN1bHRTZWxlY3RvciA9IG9wdGlvbnM7CiAgICBvcHRpb25zID0gdm9pZCAwOwogIH0KICBpZiAocmVzdWx0U2VsZWN0b3IpIHsKICAgIHJldHVybiBmcm9tRXZlbnQodGFyZ2V0LCBldmVudE5hbWUsIG9wdGlvbnMpLnBpcGUobWFwT25lT3JNYW55QXJncyhyZXN1bHRTZWxlY3RvcikpOwogIH0KICB2YXIgX2ExMiA9IF9fcmVhZChpc0V2ZW50VGFyZ2V0KHRhcmdldCkgPyBldmVudFRhcmdldE1ldGhvZHMubWFwKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbihoYW5kbGVyMikgewogICAgICByZXR1cm4gdGFyZ2V0W21ldGhvZE5hbWVdKGV2ZW50TmFtZSwgaGFuZGxlcjIsIG9wdGlvbnMpOwogICAgfTsKICB9KSA6IGlzTm9kZVN0eWxlRXZlbnRFbWl0dGVyKHRhcmdldCkgPyBub2RlRXZlbnRFbWl0dGVyTWV0aG9kcy5tYXAodG9Db21tb25IYW5kbGVyUmVnaXN0cnkodGFyZ2V0LCBldmVudE5hbWUpKSA6IGlzSlF1ZXJ5U3R5bGVFdmVudEVtaXR0ZXIodGFyZ2V0KSA/IGpxdWVyeU1ldGhvZHMubWFwKHRvQ29tbW9uSGFuZGxlclJlZ2lzdHJ5KHRhcmdldCwgZXZlbnROYW1lKSkgOiBbXSwgMiksIGFkZDMgPSBfYTEyWzBdLCByZW1vdmUyID0gX2ExMlsxXTsKICBpZiAoIWFkZDMpIHsKICAgIGlmIChpc0FycmF5TGlrZSh0YXJnZXQpKSB7CiAgICAgIHJldHVybiBtZXJnZU1hcChmdW5jdGlvbihzdWJUYXJnZXQpIHsKICAgICAgICByZXR1cm4gZnJvbUV2ZW50KHN1YlRhcmdldCwgZXZlbnROYW1lLCBvcHRpb25zKTsKICAgICAgfSkoaW5uZXJGcm9tKHRhcmdldCkpOwogICAgfQogIH0KICBpZiAoIWFkZDMpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgZXZlbnQgdGFyZ2V0Iik7CiAgfQogIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICB2YXIgaGFuZGxlcjIgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgIH0KICAgICAgcmV0dXJuIHN1YnNjcmliZXIubmV4dCgxIDwgYXJncy5sZW5ndGggPyBhcmdzIDogYXJnc1swXSk7CiAgICB9OwogICAgYWRkMyhoYW5kbGVyMik7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiByZW1vdmUyKGhhbmRsZXIyKTsKICAgIH07CiAgfSk7Cn0KZnVuY3Rpb24gdG9Db21tb25IYW5kbGVyUmVnaXN0cnkodGFyZ2V0LCBldmVudE5hbWUpIHsKICByZXR1cm4gZnVuY3Rpb24obWV0aG9kTmFtZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKGhhbmRsZXIyKSB7CiAgICAgIHJldHVybiB0YXJnZXRbbWV0aG9kTmFtZV0oZXZlbnROYW1lLCBoYW5kbGVyMik7CiAgICB9OwogIH07Cn0KZnVuY3Rpb24gaXNOb2RlU3R5bGVFdmVudEVtaXR0ZXIodGFyZ2V0KSB7CiAgcmV0dXJuIGlzRnVuY3Rpb24odGFyZ2V0LmFkZExpc3RlbmVyKSAmJiBpc0Z1bmN0aW9uKHRhcmdldC5yZW1vdmVMaXN0ZW5lcik7Cn0KZnVuY3Rpb24gaXNKUXVlcnlTdHlsZUV2ZW50RW1pdHRlcih0YXJnZXQpIHsKICByZXR1cm4gaXNGdW5jdGlvbih0YXJnZXQub24pICYmIGlzRnVuY3Rpb24odGFyZ2V0Lm9mZik7Cn0KZnVuY3Rpb24gaXNFdmVudFRhcmdldCh0YXJnZXQpIHsKICByZXR1cm4gaXNGdW5jdGlvbih0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcikgJiYgaXNGdW5jdGlvbih0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcik7Cn0KdmFyIG5vZGVFdmVudEVtaXR0ZXJNZXRob2RzLCBldmVudFRhcmdldE1ldGhvZHMsIGpxdWVyeU1ldGhvZHM7CnZhciBpbml0X2Zyb21FdmVudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZnJvbUV2ZW50LmpzIigpIHsKICAgIGluaXRfdHNsaWJfZXM2KCk7CiAgICBpbml0X2lubmVyRnJvbSgpOwogICAgaW5pdF9PYnNlcnZhYmxlKCk7CiAgICBpbml0X21lcmdlTWFwKCk7CiAgICBpbml0X2lzQXJyYXlMaWtlKCk7CiAgICBpbml0X2lzRnVuY3Rpb24oKTsKICAgIGluaXRfbWFwT25lT3JNYW55QXJncygpOwogICAgbm9kZUV2ZW50RW1pdHRlck1ldGhvZHMgPSBbImFkZExpc3RlbmVyIiwgInJlbW92ZUxpc3RlbmVyIl07CiAgICBldmVudFRhcmdldE1ldGhvZHMgPSBbImFkZEV2ZW50TGlzdGVuZXIiLCAicmVtb3ZlRXZlbnRMaXN0ZW5lciJdOwogICAganF1ZXJ5TWV0aG9kcyA9IFsib24iLCAib2ZmIl07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb21FdmVudFBhdHRlcm4uanMKdmFyIGluaXRfZnJvbUV2ZW50UGF0dGVybiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZnJvbUV2ZW50UGF0dGVybi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2dlbmVyYXRlLmpzCnZhciBpbml0X2dlbmVyYXRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9nZW5lcmF0ZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2lpZi5qcwp2YXIgaW5pdF9paWYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2lpZi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3RpbWVyLmpzCmZ1bmN0aW9uIHRpbWVyKGR1ZVRpbWUsIGludGVydmFsT3JTY2hlZHVsZXIsIHNjaGVkdWxlcikgewogIGlmIChkdWVUaW1lID09PSB2b2lkIDApIHsKICAgIGR1ZVRpbWUgPSAwOwogIH0KICBpZiAoc2NoZWR1bGVyID09PSB2b2lkIDApIHsKICAgIHNjaGVkdWxlciA9IGFzeW5jOwogIH0KICB2YXIgaW50ZXJ2YWxEdXJhdGlvbiA9IC0xOwogIGlmIChpbnRlcnZhbE9yU2NoZWR1bGVyICE9IG51bGwpIHsKICAgIGlmIChpc1NjaGVkdWxlcihpbnRlcnZhbE9yU2NoZWR1bGVyKSkgewogICAgICBzY2hlZHVsZXIgPSBpbnRlcnZhbE9yU2NoZWR1bGVyOwogICAgfSBlbHNlIHsKICAgICAgaW50ZXJ2YWxEdXJhdGlvbiA9IGludGVydmFsT3JTY2hlZHVsZXI7CiAgICB9CiAgfQogIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICB2YXIgZHVlID0gaXNWYWxpZERhdGUoZHVlVGltZSkgPyArZHVlVGltZSAtIHNjaGVkdWxlci5ub3coKSA6IGR1ZVRpbWU7CiAgICBpZiAoZHVlIDwgMCkgewogICAgICBkdWUgPSAwOwogICAgfQogICAgdmFyIG4xMyA9IDA7CiAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uKCkgewogICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgc3Vic2NyaWJlci5uZXh0KG4xMysrKTsKICAgICAgICBpZiAoMCA8PSBpbnRlcnZhbER1cmF0aW9uKSB7CiAgICAgICAgICB0aGlzLnNjaGVkdWxlKHZvaWQgMCwgaW50ZXJ2YWxEdXJhdGlvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sIGR1ZSk7CiAgfSk7Cn0KdmFyIGluaXRfdGltZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3RpbWVyLmpzIigpIHsKICAgIGluaXRfT2JzZXJ2YWJsZSgpOwogICAgaW5pdF9hc3luYygpOwogICAgaW5pdF9pc1NjaGVkdWxlcigpOwogICAgaW5pdF9pc0RhdGUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvaW50ZXJ2YWwuanMKdmFyIGluaXRfaW50ZXJ2YWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2ludGVydmFsLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvbWVyZ2UuanMKdmFyIGluaXRfbWVyZ2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL21lcmdlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvbmV2ZXIuanMKZnVuY3Rpb24gbmV2ZXIoKSB7CiAgcmV0dXJuIE5FVkVSOwp9CnZhciBORVZFUjsKdmFyIGluaXRfbmV2ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL25ldmVyLmpzIigpIHsKICAgIGluaXRfT2JzZXJ2YWJsZSgpOwogICAgaW5pdF9ub29wKCk7CiAgICBORVZFUiA9IG5ldyBPYnNlcnZhYmxlKG5vb3ApOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9vbkVycm9yUmVzdW1lTmV4dC5qcwp2YXIgaW5pdF9vbkVycm9yUmVzdW1lTmV4dCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvb25FcnJvclJlc3VtZU5leHQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9wYWlycy5qcwp2YXIgaW5pdF9wYWlycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvcGFpcnMuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpbHRlci5qcwpmdW5jdGlvbiBmaWx0ZXIocHJlZGljYXRlLCB0aGlzQXJnKSB7CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICB2YXIgaW5kZXgyID0gMDsKICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlMikgewogICAgICByZXR1cm4gcHJlZGljYXRlLmNhbGwodGhpc0FyZywgdmFsdWUyLCBpbmRleDIrKykgJiYgc3Vic2NyaWJlci5uZXh0KHZhbHVlMik7CiAgICB9KSk7CiAgfSk7Cn0KdmFyIGluaXRfZmlsdGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpbHRlci5qcyIoKSB7CiAgICBpbml0X2xpZnQoKTsKICAgIGluaXRfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3BhcnRpdGlvbi5qcwp2YXIgaW5pdF9wYXJ0aXRpb24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3BhcnRpdGlvbi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3JhY2UuanMKdmFyIGluaXRfcmFjZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvcmFjZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3JhbmdlLmpzCnZhciBpbml0X3JhbmdlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9yYW5nZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3VzaW5nLmpzCnZhciBpbml0X3VzaW5nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS91c2luZy5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3ppcC5qcwp2YXIgaW5pdF96aXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3ppcC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC90eXBlcy5qcwp2YXIgaW5pdF90eXBlcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3R5cGVzLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9hdWRpdC5qcwp2YXIgaW5pdF9hdWRpdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9hdWRpdC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvYXVkaXRUaW1lLmpzCnZhciBpbml0X2F1ZGl0VGltZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9hdWRpdFRpbWUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2J1ZmZlci5qcwpmdW5jdGlvbiBidWZmZXIoY2xvc2luZ05vdGlmaWVyKSB7CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICB2YXIgY3VycmVudEJ1ZmZlciA9IFtdOwogICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIHJldHVybiBjdXJyZW50QnVmZmVyLnB1c2godmFsdWUyKTsKICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICBzdWJzY3JpYmVyLm5leHQoY3VycmVudEJ1ZmZlcik7CiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgIH0pKTsKICAgIGlubmVyRnJvbShjbG9zaW5nTm90aWZpZXIpLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oKSB7CiAgICAgIHZhciBiNSA9IGN1cnJlbnRCdWZmZXI7CiAgICAgIGN1cnJlbnRCdWZmZXIgPSBbXTsKICAgICAgc3Vic2NyaWJlci5uZXh0KGI1KTsKICAgIH0sIG5vb3ApKTsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgY3VycmVudEJ1ZmZlciA9IG51bGw7CiAgICB9OwogIH0pOwp9CnZhciBpbml0X2J1ZmZlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9idWZmZXIuanMiKCkgewogICAgaW5pdF9saWZ0KCk7CiAgICBpbml0X25vb3AoKTsKICAgIGluaXRfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICBpbml0X2lubmVyRnJvbSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2J1ZmZlckNvdW50LmpzCmZ1bmN0aW9uIGJ1ZmZlckNvdW50KGJ1ZmZlclNpemUsIHN0YXJ0QnVmZmVyRXZlcnkpIHsKICBpZiAoc3RhcnRCdWZmZXJFdmVyeSA9PT0gdm9pZCAwKSB7CiAgICBzdGFydEJ1ZmZlckV2ZXJ5ID0gbnVsbDsKICB9CiAgc3RhcnRCdWZmZXJFdmVyeSA9IHN0YXJ0QnVmZmVyRXZlcnkgIT09IG51bGwgJiYgc3RhcnRCdWZmZXJFdmVyeSAhPT0gdm9pZCAwID8gc3RhcnRCdWZmZXJFdmVyeSA6IGJ1ZmZlclNpemU7CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICB2YXIgYnVmZmVycyA9IFtdOwogICAgdmFyIGNvdW50MiA9IDA7CiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgdmFyIGVfMSwgX2ExMiwgZV8yLCBfYjsKICAgICAgdmFyIHRvRW1pdCA9IG51bGw7CiAgICAgIGlmIChjb3VudDIrKyAlIHN0YXJ0QnVmZmVyRXZlcnkgPT09IDApIHsKICAgICAgICBidWZmZXJzLnB1c2goW10pOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgZm9yICh2YXIgYnVmZmVyc18xID0gX192YWx1ZXMoYnVmZmVycyksIGJ1ZmZlcnNfMV8xID0gYnVmZmVyc18xLm5leHQoKTsgIWJ1ZmZlcnNfMV8xLmRvbmU7IGJ1ZmZlcnNfMV8xID0gYnVmZmVyc18xLm5leHQoKSkgewogICAgICAgICAgdmFyIGJ1ZmZlcjIgPSBidWZmZXJzXzFfMS52YWx1ZTsKICAgICAgICAgIGJ1ZmZlcjIucHVzaCh2YWx1ZTIpOwogICAgICAgICAgaWYgKGJ1ZmZlclNpemUgPD0gYnVmZmVyMi5sZW5ndGgpIHsKICAgICAgICAgICAgdG9FbWl0ID0gdG9FbWl0ICE9PSBudWxsICYmIHRvRW1pdCAhPT0gdm9pZCAwID8gdG9FbWl0IDogW107CiAgICAgICAgICAgIHRvRW1pdC5wdXNoKGJ1ZmZlcjIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZV8xXzEpIHsKICAgICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAoYnVmZmVyc18xXzEgJiYgIWJ1ZmZlcnNfMV8xLmRvbmUgJiYgKF9hMTIgPSBidWZmZXJzXzEucmV0dXJuKSkgX2ExMi5jYWxsKGJ1ZmZlcnNfMSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRvRW1pdCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBmb3IgKHZhciB0b0VtaXRfMSA9IF9fdmFsdWVzKHRvRW1pdCksIHRvRW1pdF8xXzEgPSB0b0VtaXRfMS5uZXh0KCk7ICF0b0VtaXRfMV8xLmRvbmU7IHRvRW1pdF8xXzEgPSB0b0VtaXRfMS5uZXh0KCkpIHsKICAgICAgICAgICAgdmFyIGJ1ZmZlcjIgPSB0b0VtaXRfMV8xLnZhbHVlOwogICAgICAgICAgICBhcnJSZW1vdmUoYnVmZmVycywgYnVmZmVyMik7CiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChidWZmZXIyKTsKICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlXzJfMSkgewogICAgICAgICAgZV8yID0geyBlcnJvcjogZV8yXzEgfTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKHRvRW1pdF8xXzEgJiYgIXRvRW1pdF8xXzEuZG9uZSAmJiAoX2IgPSB0b0VtaXRfMS5yZXR1cm4pKSBfYi5jYWxsKHRvRW1pdF8xKTsKICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICB2YXIgZV8zLCBfYTEyOwogICAgICB0cnkgewogICAgICAgIGZvciAodmFyIGJ1ZmZlcnNfMiA9IF9fdmFsdWVzKGJ1ZmZlcnMpLCBidWZmZXJzXzJfMSA9IGJ1ZmZlcnNfMi5uZXh0KCk7ICFidWZmZXJzXzJfMS5kb25lOyBidWZmZXJzXzJfMSA9IGJ1ZmZlcnNfMi5uZXh0KCkpIHsKICAgICAgICAgIHZhciBidWZmZXIyID0gYnVmZmVyc18yXzEudmFsdWU7CiAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoYnVmZmVyMik7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlXzNfMSkgewogICAgICAgIGVfMyA9IHsgZXJyb3I6IGVfM18xIH07CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmIChidWZmZXJzXzJfMSAmJiAhYnVmZmVyc18yXzEuZG9uZSAmJiAoX2ExMiA9IGJ1ZmZlcnNfMi5yZXR1cm4pKSBfYTEyLmNhbGwoYnVmZmVyc18yKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgaWYgKGVfMykgdGhyb3cgZV8zLmVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICBidWZmZXJzID0gbnVsbDsKICAgIH0pKTsKICB9KTsKfQp2YXIgaW5pdF9idWZmZXJDb3VudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9idWZmZXJDb3VudC5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgaW5pdF9saWZ0KCk7CiAgICBpbml0X09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgaW5pdF9hcnJSZW1vdmUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9idWZmZXJUaW1lLmpzCmZ1bmN0aW9uIGJ1ZmZlclRpbWUoYnVmZmVyVGltZVNwYW4pIHsKICB2YXIgX2ExMiwgX2I7CiAgdmFyIG90aGVyQXJncyA9IFtdOwogIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICBvdGhlckFyZ3NbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07CiAgfQogIHZhciBzY2hlZHVsZXIgPSAoX2ExMiA9IHBvcFNjaGVkdWxlcihvdGhlckFyZ3MpKSAhPT0gbnVsbCAmJiBfYTEyICE9PSB2b2lkIDAgPyBfYTEyIDogYXN5bmNTY2hlZHVsZXI7CiAgdmFyIGJ1ZmZlckNyZWF0aW9uSW50ZXJ2YWwgPSAoX2IgPSBvdGhlckFyZ3NbMF0pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG51bGw7CiAgdmFyIG1heEJ1ZmZlclNpemUgPSBvdGhlckFyZ3NbMV0gfHwgSW5maW5pdHk7CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICB2YXIgYnVmZmVyUmVjb3JkcyA9IFtdOwogICAgdmFyIHJlc3RhcnRPbkVtaXQgPSBmYWxzZTsKICAgIHZhciBlbWl0ID0gZnVuY3Rpb24ocmVjb3JkKSB7CiAgICAgIHZhciBidWZmZXIyID0gcmVjb3JkLmJ1ZmZlciwgc3VicyA9IHJlY29yZC5zdWJzOwogICAgICBzdWJzLnVuc3Vic2NyaWJlKCk7CiAgICAgIGFyclJlbW92ZShidWZmZXJSZWNvcmRzLCByZWNvcmQpOwogICAgICBzdWJzY3JpYmVyLm5leHQoYnVmZmVyMik7CiAgICAgIHJlc3RhcnRPbkVtaXQgJiYgc3RhcnRCdWZmZXIoKTsKICAgIH07CiAgICB2YXIgc3RhcnRCdWZmZXIgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKGJ1ZmZlclJlY29yZHMpIHsKICAgICAgICB2YXIgc3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTsKICAgICAgICBzdWJzY3JpYmVyLmFkZChzdWJzKTsKICAgICAgICB2YXIgYnVmZmVyMiA9IFtdOwogICAgICAgIHZhciByZWNvcmRfMSA9IHsKICAgICAgICAgIGJ1ZmZlcjogYnVmZmVyMiwKICAgICAgICAgIHN1YnMKICAgICAgICB9OwogICAgICAgIGJ1ZmZlclJlY29yZHMucHVzaChyZWNvcmRfMSk7CiAgICAgICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnMsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gZW1pdChyZWNvcmRfMSk7CiAgICAgICAgfSwgYnVmZmVyVGltZVNwYW4pOwogICAgICB9CiAgICB9OwogICAgaWYgKGJ1ZmZlckNyZWF0aW9uSW50ZXJ2YWwgIT09IG51bGwgJiYgYnVmZmVyQ3JlYXRpb25JbnRlcnZhbCA+PSAwKSB7CiAgICAgIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIHN0YXJ0QnVmZmVyLCBidWZmZXJDcmVhdGlvbkludGVydmFsLCB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3RhcnRPbkVtaXQgPSB0cnVlOwogICAgfQogICAgc3RhcnRCdWZmZXIoKTsKICAgIHZhciBidWZmZXJUaW1lU3Vic2NyaWJlciA9IGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgdmFyIGVfMSwgX2ExMzsKICAgICAgdmFyIHJlY29yZHNDb3B5ID0gYnVmZmVyUmVjb3Jkcy5zbGljZSgpOwogICAgICB0cnkgewogICAgICAgIGZvciAodmFyIHJlY29yZHNDb3B5XzEgPSBfX3ZhbHVlcyhyZWNvcmRzQ29weSksIHJlY29yZHNDb3B5XzFfMSA9IHJlY29yZHNDb3B5XzEubmV4dCgpOyAhcmVjb3Jkc0NvcHlfMV8xLmRvbmU7IHJlY29yZHNDb3B5XzFfMSA9IHJlY29yZHNDb3B5XzEubmV4dCgpKSB7CiAgICAgICAgICB2YXIgcmVjb3JkID0gcmVjb3Jkc0NvcHlfMV8xLnZhbHVlOwogICAgICAgICAgdmFyIGJ1ZmZlcjIgPSByZWNvcmQuYnVmZmVyOwogICAgICAgICAgYnVmZmVyMi5wdXNoKHZhbHVlMik7CiAgICAgICAgICBtYXhCdWZmZXJTaXplIDw9IGJ1ZmZlcjIubGVuZ3RoICYmIGVtaXQocmVjb3JkKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVfMV8xKSB7CiAgICAgICAgZV8xID0geyBlcnJvcjogZV8xXzEgfTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKHJlY29yZHNDb3B5XzFfMSAmJiAhcmVjb3Jkc0NvcHlfMV8xLmRvbmUgJiYgKF9hMTMgPSByZWNvcmRzQ29weV8xLnJldHVybikpIF9hMTMuY2FsbChyZWNvcmRzQ29weV8xKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgIHdoaWxlIChidWZmZXJSZWNvcmRzID09PSBudWxsIHx8IGJ1ZmZlclJlY29yZHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJ1ZmZlclJlY29yZHMubGVuZ3RoKSB7CiAgICAgICAgc3Vic2NyaWJlci5uZXh0KGJ1ZmZlclJlY29yZHMuc2hpZnQoKS5idWZmZXIpOwogICAgICB9CiAgICAgIGJ1ZmZlclRpbWVTdWJzY3JpYmVyID09PSBudWxsIHx8IGJ1ZmZlclRpbWVTdWJzY3JpYmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBidWZmZXJUaW1lU3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgIHN1YnNjcmliZXIudW5zdWJzY3JpYmUoKTsKICAgIH0sIHZvaWQgMCwgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBidWZmZXJSZWNvcmRzID0gbnVsbDsKICAgIH0pOwogICAgc291cmNlLnN1YnNjcmliZShidWZmZXJUaW1lU3Vic2NyaWJlcik7CiAgfSk7Cn0KdmFyIGluaXRfYnVmZmVyVGltZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9idWZmZXJUaW1lLmpzIigpIHsKICAgIGluaXRfdHNsaWJfZXM2KCk7CiAgICBpbml0X1N1YnNjcmlwdGlvbigpOwogICAgaW5pdF9saWZ0KCk7CiAgICBpbml0X09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgaW5pdF9hcnJSZW1vdmUoKTsKICAgIGluaXRfYXN5bmMoKTsKICAgIGluaXRfYXJncygpOwogICAgaW5pdF9leGVjdXRlU2NoZWR1bGUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9idWZmZXJUb2dnbGUuanMKdmFyIGluaXRfYnVmZmVyVG9nZ2xlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2J1ZmZlclRvZ2dsZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvYnVmZmVyV2hlbi5qcwp2YXIgaW5pdF9idWZmZXJXaGVuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2J1ZmZlcldoZW4uanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NhdGNoRXJyb3IuanMKdmFyIGluaXRfY2F0Y2hFcnJvciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jYXRjaEVycm9yLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9yZWR1Y2UuanMKdmFyIGluaXRfcmVkdWNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3JlZHVjZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdG9BcnJheS5qcwp2YXIgaW5pdF90b0FycmF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3RvQXJyYXkuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NvbWJpbmVMYXRlc3RBbGwuanMKdmFyIGluaXRfY29tYmluZUxhdGVzdEFsbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb21iaW5lTGF0ZXN0QWxsLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb21iaW5lQWxsLmpzCnZhciBpbml0X2NvbWJpbmVBbGwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvY29tYmluZUFsbC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvY29tYmluZUxhdGVzdC5qcwp2YXIgaW5pdF9jb21iaW5lTGF0ZXN0MiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb21iaW5lTGF0ZXN0LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb21iaW5lTGF0ZXN0V2l0aC5qcwp2YXIgaW5pdF9jb21iaW5lTGF0ZXN0V2l0aCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb21iaW5lTGF0ZXN0V2l0aC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvY29uY2F0TWFwLmpzCnZhciBpbml0X2NvbmNhdE1hcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb25jYXRNYXAuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NvbmNhdE1hcFRvLmpzCnZhciBpbml0X2NvbmNhdE1hcFRvID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NvbmNhdE1hcFRvLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb25jYXQuanMKdmFyIGluaXRfY29uY2F0MiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb25jYXQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NvbmNhdFdpdGguanMKdmFyIGluaXRfY29uY2F0V2l0aCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb25jYXRXaXRoLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb25uZWN0LmpzCnZhciBpbml0X2Nvbm5lY3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvY29ubmVjdC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvY291bnQuanMKdmFyIGluaXRfY291bnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvY291bnQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2RlYm91bmNlLmpzCmZ1bmN0aW9uIGRlYm91bmNlKGR1cmF0aW9uU2VsZWN0b3IpIHsKICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHZhciBoYXNWYWx1ZSA9IGZhbHNlOwogICAgdmFyIGxhc3RWYWx1ZSA9IG51bGw7CiAgICB2YXIgZHVyYXRpb25TdWJzY3JpYmVyID0gbnVsbDsKICAgIHZhciBlbWl0ID0gZnVuY3Rpb24oKSB7CiAgICAgIGR1cmF0aW9uU3Vic2NyaWJlciA9PT0gbnVsbCB8fCBkdXJhdGlvblN1YnNjcmliZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGR1cmF0aW9uU3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgICBkdXJhdGlvblN1YnNjcmliZXIgPSBudWxsOwogICAgICBpZiAoaGFzVmFsdWUpIHsKICAgICAgICBoYXNWYWx1ZSA9IGZhbHNlOwogICAgICAgIHZhciB2YWx1ZTIgPSBsYXN0VmFsdWU7CiAgICAgICAgbGFzdFZhbHVlID0gbnVsbDsKICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUyKTsKICAgICAgfQogICAgfTsKICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlMikgewogICAgICBkdXJhdGlvblN1YnNjcmliZXIgPT09IG51bGwgfHwgZHVyYXRpb25TdWJzY3JpYmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkdXJhdGlvblN1YnNjcmliZXIudW5zdWJzY3JpYmUoKTsKICAgICAgaGFzVmFsdWUgPSB0cnVlOwogICAgICBsYXN0VmFsdWUgPSB2YWx1ZTI7CiAgICAgIGR1cmF0aW9uU3Vic2NyaWJlciA9IGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBlbWl0LCBub29wKTsKICAgICAgaW5uZXJGcm9tKGR1cmF0aW9uU2VsZWN0b3IodmFsdWUyKSkuc3Vic2NyaWJlKGR1cmF0aW9uU3Vic2NyaWJlcik7CiAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgZW1pdCgpOwogICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICBsYXN0VmFsdWUgPSBkdXJhdGlvblN1YnNjcmliZXIgPSBudWxsOwogICAgfSkpOwogIH0pOwp9CnZhciBpbml0X2RlYm91bmNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2RlYm91bmNlLmpzIigpIHsKICAgIGluaXRfbGlmdCgpOwogICAgaW5pdF9ub29wKCk7CiAgICBpbml0X09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgaW5pdF9pbm5lckZyb20oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9kZWJvdW5jZVRpbWUuanMKZnVuY3Rpb24gZGVib3VuY2VUaW1lKGR1ZVRpbWUsIHNjaGVkdWxlcikgewogIGlmIChzY2hlZHVsZXIgPT09IHZvaWQgMCkgewogICAgc2NoZWR1bGVyID0gYXN5bmNTY2hlZHVsZXI7CiAgfQogIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgdmFyIGFjdGl2ZVRhc2sgPSBudWxsOwogICAgdmFyIGxhc3RWYWx1ZSA9IG51bGw7CiAgICB2YXIgbGFzdFRpbWUgPSBudWxsOwogICAgdmFyIGVtaXQgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKGFjdGl2ZVRhc2spIHsKICAgICAgICBhY3RpdmVUYXNrLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgYWN0aXZlVGFzayA9IG51bGw7CiAgICAgICAgdmFyIHZhbHVlMiA9IGxhc3RWYWx1ZTsKICAgICAgICBsYXN0VmFsdWUgPSBudWxsOwogICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZTIpOwogICAgICB9CiAgICB9OwogICAgZnVuY3Rpb24gZW1pdFdoZW5JZGxlKCkgewogICAgICB2YXIgdGFyZ2V0VGltZSA9IGxhc3RUaW1lICsgZHVlVGltZTsKICAgICAgdmFyIG5vdzIgPSBzY2hlZHVsZXIubm93KCk7CiAgICAgIGlmIChub3cyIDwgdGFyZ2V0VGltZSkgewogICAgICAgIGFjdGl2ZVRhc2sgPSB0aGlzLnNjaGVkdWxlKHZvaWQgMCwgdGFyZ2V0VGltZSAtIG5vdzIpOwogICAgICAgIHN1YnNjcmliZXIuYWRkKGFjdGl2ZVRhc2spOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbWl0KCk7CiAgICB9CiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgbGFzdFZhbHVlID0gdmFsdWUyOwogICAgICBsYXN0VGltZSA9IHNjaGVkdWxlci5ub3coKTsKICAgICAgaWYgKCFhY3RpdmVUYXNrKSB7CiAgICAgICAgYWN0aXZlVGFzayA9IHNjaGVkdWxlci5zY2hlZHVsZShlbWl0V2hlbklkbGUsIGR1ZVRpbWUpOwogICAgICAgIHN1YnNjcmliZXIuYWRkKGFjdGl2ZVRhc2spOwogICAgICB9CiAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgZW1pdCgpOwogICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uKCkgewogICAgICBsYXN0VmFsdWUgPSBhY3RpdmVUYXNrID0gbnVsbDsKICAgIH0pKTsKICB9KTsKfQp2YXIgaW5pdF9kZWJvdW5jZVRpbWUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGVib3VuY2VUaW1lLmpzIigpIHsKICAgIGluaXRfYXN5bmMoKTsKICAgIGluaXRfbGlmdCgpOwogICAgaW5pdF9PcGVyYXRvclN1YnNjcmliZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9kZWZhdWx0SWZFbXB0eS5qcwp2YXIgaW5pdF9kZWZhdWx0SWZFbXB0eSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9kZWZhdWx0SWZFbXB0eS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGFrZS5qcwp2YXIgaW5pdF90YWtlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rha2UuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2lnbm9yZUVsZW1lbnRzLmpzCnZhciBpbml0X2lnbm9yZUVsZW1lbnRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2lnbm9yZUVsZW1lbnRzLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tYXBUby5qcwp2YXIgaW5pdF9tYXBUbyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tYXBUby5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGVsYXlXaGVuLmpzCnZhciBpbml0X2RlbGF5V2hlbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9kZWxheVdoZW4uanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2RlbGF5LmpzCnZhciBpbml0X2RlbGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2RlbGF5LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9kZW1hdGVyaWFsaXplLmpzCnZhciBpbml0X2RlbWF0ZXJpYWxpemUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGVtYXRlcmlhbGl6ZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGlzdGluY3QuanMKdmFyIGluaXRfZGlzdGluY3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGlzdGluY3QuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2Rpc3RpbmN0VW50aWxDaGFuZ2VkLmpzCnZhciBpbml0X2Rpc3RpbmN0VW50aWxDaGFuZ2VkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2Rpc3RpbmN0VW50aWxDaGFuZ2VkLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9kaXN0aW5jdFVudGlsS2V5Q2hhbmdlZC5qcwp2YXIgaW5pdF9kaXN0aW5jdFVudGlsS2V5Q2hhbmdlZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9kaXN0aW5jdFVudGlsS2V5Q2hhbmdlZC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGhyb3dJZkVtcHR5LmpzCnZhciBpbml0X3Rocm93SWZFbXB0eSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90aHJvd0lmRW1wdHkuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2VsZW1lbnRBdC5qcwp2YXIgaW5pdF9lbGVtZW50QXQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZWxlbWVudEF0LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9lbmRXaXRoLmpzCnZhciBpbml0X2VuZFdpdGggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZW5kV2l0aC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZXZlcnkuanMKdmFyIGluaXRfZXZlcnkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZXZlcnkuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2V4aGF1c3RNYXAuanMKdmFyIGluaXRfZXhoYXVzdE1hcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9leGhhdXN0TWFwLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9leGhhdXN0QWxsLmpzCnZhciBpbml0X2V4aGF1c3RBbGwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZXhoYXVzdEFsbC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZXhoYXVzdC5qcwp2YXIgaW5pdF9leGhhdXN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2V4aGF1c3QuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2V4cGFuZC5qcwp2YXIgaW5pdF9leHBhbmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZXhwYW5kLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9maW5hbGl6ZS5qcwp2YXIgaW5pdF9maW5hbGl6ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9maW5hbGl6ZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZmluZC5qcwp2YXIgaW5pdF9maW5kID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpbmQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpbmRJbmRleC5qcwp2YXIgaW5pdF9maW5kSW5kZXggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZmluZEluZGV4LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9maXJzdC5qcwp2YXIgaW5pdF9maXJzdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9maXJzdC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZ3JvdXBCeS5qcwp2YXIgaW5pdF9ncm91cEJ5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2dyb3VwQnkuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2lzRW1wdHkuanMKdmFyIGluaXRfaXNFbXB0eSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9pc0VtcHR5LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90YWtlTGFzdC5qcwp2YXIgaW5pdF90YWtlTGFzdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90YWtlTGFzdC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbGFzdC5qcwp2YXIgaW5pdF9sYXN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2xhc3QuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21hdGVyaWFsaXplLmpzCnZhciBpbml0X21hdGVyaWFsaXplID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21hdGVyaWFsaXplLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tYXguanMKdmFyIGluaXRfbWF4ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21heC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZmxhdE1hcC5qcwp2YXIgaW5pdF9mbGF0TWFwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2ZsYXRNYXAuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlTWFwVG8uanMKdmFyIGluaXRfbWVyZ2VNYXBUbyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZU1hcFRvLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZVNjYW4uanMKdmFyIGluaXRfbWVyZ2VTY2FuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlU2Nhbi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWVyZ2UuanMKdmFyIGluaXRfbWVyZ2UyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZVdpdGguanMKdmFyIGluaXRfbWVyZ2VXaXRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlV2l0aC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWluLmpzCnZhciBpbml0X21pbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9taW4uanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL211bHRpY2FzdC5qcwp2YXIgaW5pdF9tdWx0aWNhc3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbXVsdGljYXN0LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9vbkVycm9yUmVzdW1lTmV4dFdpdGguanMKdmFyIGluaXRfb25FcnJvclJlc3VtZU5leHRXaXRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL29uRXJyb3JSZXN1bWVOZXh0V2l0aC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcGFpcndpc2UuanMKdmFyIGluaXRfcGFpcndpc2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcGFpcndpc2UuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3BsdWNrLmpzCnZhciBpbml0X3BsdWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3BsdWNrLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9wdWJsaXNoLmpzCnZhciBpbml0X3B1Ymxpc2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcHVibGlzaC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcHVibGlzaEJlaGF2aW9yLmpzCnZhciBpbml0X3B1Ymxpc2hCZWhhdmlvciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9wdWJsaXNoQmVoYXZpb3IuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3B1Ymxpc2hMYXN0LmpzCnZhciBpbml0X3B1Ymxpc2hMYXN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3B1Ymxpc2hMYXN0LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9wdWJsaXNoUmVwbGF5LmpzCnZhciBpbml0X3B1Ymxpc2hSZXBsYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcHVibGlzaFJlcGxheS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcmFjZVdpdGguanMKdmFyIGluaXRfcmFjZVdpdGggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcmFjZVdpdGguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3JlcGVhdC5qcwp2YXIgaW5pdF9yZXBlYXQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcmVwZWF0LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9yZXBlYXRXaGVuLmpzCnZhciBpbml0X3JlcGVhdFdoZW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcmVwZWF0V2hlbi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcmV0cnkuanMKdmFyIGluaXRfcmV0cnkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcmV0cnkuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3JldHJ5V2hlbi5qcwp2YXIgaW5pdF9yZXRyeVdoZW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcmV0cnlXaGVuLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9zYW1wbGUuanMKdmFyIGluaXRfc2FtcGxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3NhbXBsZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc2FtcGxlVGltZS5qcwp2YXIgaW5pdF9zYW1wbGVUaW1lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3NhbXBsZVRpbWUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3NjYW4uanMKdmFyIGluaXRfc2NhbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9zY2FuLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9zZXF1ZW5jZUVxdWFsLmpzCnZhciBpbml0X3NlcXVlbmNlRXF1YWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc2VxdWVuY2VFcXVhbC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc2hhcmUuanMKdmFyIGluaXRfc2hhcmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc2hhcmUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3NoYXJlUmVwbGF5LmpzCnZhciBpbml0X3NoYXJlUmVwbGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3NoYXJlUmVwbGF5LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9zaW5nbGUuanMKdmFyIGluaXRfc2luZ2xlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3NpbmdsZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc2tpcC5qcwp2YXIgaW5pdF9za2lwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3NraXAuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3NraXBMYXN0LmpzCnZhciBpbml0X3NraXBMYXN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3NraXBMYXN0LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9za2lwVW50aWwuanMKdmFyIGluaXRfc2tpcFVudGlsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3NraXBVbnRpbC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc2tpcFdoaWxlLmpzCnZhciBpbml0X3NraXBXaGlsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9za2lwV2hpbGUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3N0YXJ0V2l0aC5qcwpmdW5jdGlvbiBzdGFydFdpdGgoKSB7CiAgdmFyIHZhbHVlcyA9IFtdOwogIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICB2YWx1ZXNbX2ldID0gYXJndW1lbnRzW19pXTsKICB9CiAgdmFyIHNjaGVkdWxlciA9IHBvcFNjaGVkdWxlcih2YWx1ZXMpOwogIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgKHNjaGVkdWxlciA/IGNvbmNhdCh2YWx1ZXMsIHNvdXJjZSwgc2NoZWR1bGVyKSA6IGNvbmNhdCh2YWx1ZXMsIHNvdXJjZSkpLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICB9KTsKfQp2YXIgaW5pdF9zdGFydFdpdGggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc3RhcnRXaXRoLmpzIigpIHsKICAgIGluaXRfY29uY2F0KCk7CiAgICBpbml0X2FyZ3MoKTsKICAgIGluaXRfbGlmdCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3N3aXRjaE1hcC5qcwp2YXIgaW5pdF9zd2l0Y2hNYXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc3dpdGNoTWFwLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9zd2l0Y2hBbGwuanMKdmFyIGluaXRfc3dpdGNoQWxsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3N3aXRjaEFsbC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc3dpdGNoTWFwVG8uanMKdmFyIGluaXRfc3dpdGNoTWFwVG8gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc3dpdGNoTWFwVG8uanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3N3aXRjaFNjYW4uanMKdmFyIGluaXRfc3dpdGNoU2NhbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9zd2l0Y2hTY2FuLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90YWtlVW50aWwuanMKZnVuY3Rpb24gdGFrZVVudGlsKG5vdGlmaWVyKSB7CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICBpbm5lckZyb20obm90aWZpZXIpLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9LCBub29wKSk7CiAgICAhc3Vic2NyaWJlci5jbG9zZWQgJiYgc291cmNlLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICB9KTsKfQp2YXIgaW5pdF90YWtlVW50aWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGFrZVVudGlsLmpzIigpIHsKICAgIGluaXRfbGlmdCgpOwogICAgaW5pdF9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGluaXRfaW5uZXJGcm9tKCk7CiAgICBpbml0X25vb3AoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90YWtlV2hpbGUuanMKdmFyIGluaXRfdGFrZVdoaWxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rha2VXaGlsZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGFwLmpzCnZhciBpbml0X3RhcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90YXAuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rocm90dGxlLmpzCmZ1bmN0aW9uIHRocm90dGxlKGR1cmF0aW9uU2VsZWN0b3IsIGNvbmZpZzMpIHsKICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHZhciBfYTEyID0gY29uZmlnMyAhPT0gbnVsbCAmJiBjb25maWczICE9PSB2b2lkIDAgPyBjb25maWczIDoge30sIF9iID0gX2ExMi5sZWFkaW5nLCBsZWFkaW5nID0gX2IgPT09IHZvaWQgMCA/IHRydWUgOiBfYiwgX2MgPSBfYTEyLnRyYWlsaW5nLCB0cmFpbGluZyA9IF9jID09PSB2b2lkIDAgPyBmYWxzZSA6IF9jOwogICAgdmFyIGhhc1ZhbHVlID0gZmFsc2U7CiAgICB2YXIgc2VuZFZhbHVlID0gbnVsbDsKICAgIHZhciB0aHJvdHRsZWQgPSBudWxsOwogICAgdmFyIGlzQ29tcGxldGUgPSBmYWxzZTsKICAgIHZhciBlbmRUaHJvdHRsaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgIHRocm90dGxlZCA9PT0gbnVsbCB8fCB0aHJvdHRsZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRocm90dGxlZC51bnN1YnNjcmliZSgpOwogICAgICB0aHJvdHRsZWQgPSBudWxsOwogICAgICBpZiAodHJhaWxpbmcpIHsKICAgICAgICBzZW5kKCk7CiAgICAgICAgaXNDb21wbGV0ZSAmJiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgY2xlYW51cFRocm90dGxpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgdGhyb3R0bGVkID0gbnVsbDsKICAgICAgaXNDb21wbGV0ZSAmJiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9OwogICAgdmFyIHN0YXJ0VGhyb3R0bGUgPSBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgcmV0dXJuIHRocm90dGxlZCA9IGlubmVyRnJvbShkdXJhdGlvblNlbGVjdG9yKHZhbHVlMikpLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZW5kVGhyb3R0bGluZywgY2xlYW51cFRocm90dGxpbmcpKTsKICAgIH07CiAgICB2YXIgc2VuZCA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAoaGFzVmFsdWUpIHsKICAgICAgICBoYXNWYWx1ZSA9IGZhbHNlOwogICAgICAgIHZhciB2YWx1ZTIgPSBzZW5kVmFsdWU7CiAgICAgICAgc2VuZFZhbHVlID0gbnVsbDsKICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUyKTsKICAgICAgICAhaXNDb21wbGV0ZSAmJiBzdGFydFRocm90dGxlKHZhbHVlMik7CiAgICAgIH0KICAgIH07CiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgaGFzVmFsdWUgPSB0cnVlOwogICAgICBzZW5kVmFsdWUgPSB2YWx1ZTI7CiAgICAgICEodGhyb3R0bGVkICYmICF0aHJvdHRsZWQuY2xvc2VkKSAmJiAobGVhZGluZyA/IHNlbmQoKSA6IHN0YXJ0VGhyb3R0bGUodmFsdWUyKSk7CiAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgaXNDb21wbGV0ZSA9IHRydWU7CiAgICAgICEodHJhaWxpbmcgJiYgaGFzVmFsdWUgJiYgdGhyb3R0bGVkICYmICF0aHJvdHRsZWQuY2xvc2VkKSAmJiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9KSk7CiAgfSk7Cn0KdmFyIGluaXRfdGhyb3R0bGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGhyb3R0bGUuanMiKCkgewogICAgaW5pdF9saWZ0KCk7CiAgICBpbml0X09wZXJhdG9yU3Vic2NyaWJlcigpOwogICAgaW5pdF9pbm5lckZyb20oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90aHJvdHRsZVRpbWUuanMKZnVuY3Rpb24gdGhyb3R0bGVUaW1lKGR1cmF0aW9uLCBzY2hlZHVsZXIsIGNvbmZpZzMpIHsKICBpZiAoc2NoZWR1bGVyID09PSB2b2lkIDApIHsKICAgIHNjaGVkdWxlciA9IGFzeW5jU2NoZWR1bGVyOwogIH0KICB2YXIgZHVyYXRpb24kID0gdGltZXIoZHVyYXRpb24sIHNjaGVkdWxlcik7CiAgcmV0dXJuIHRocm90dGxlKGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGR1cmF0aW9uJDsKICB9LCBjb25maWczKTsKfQp2YXIgaW5pdF90aHJvdHRsZVRpbWUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGhyb3R0bGVUaW1lLmpzIigpIHsKICAgIGluaXRfYXN5bmMoKTsKICAgIGluaXRfdGhyb3R0bGUoKTsKICAgIGluaXRfdGltZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90aW1lSW50ZXJ2YWwuanMKdmFyIGluaXRfdGltZUludGVydmFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3RpbWVJbnRlcnZhbC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGltZW91dFdpdGguanMKdmFyIGluaXRfdGltZW91dFdpdGggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGltZW91dFdpdGguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3RpbWVzdGFtcC5qcwp2YXIgaW5pdF90aW1lc3RhbXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGltZXN0YW1wLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy93aW5kb3cuanMKdmFyIGluaXRfd2luZG93ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3dpbmRvdy5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvd2luZG93Q291bnQuanMKdmFyIGluaXRfd2luZG93Q291bnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvd2luZG93Q291bnQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3dpbmRvd1RpbWUuanMKdmFyIGluaXRfd2luZG93VGltZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy93aW5kb3dUaW1lLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy93aW5kb3dUb2dnbGUuanMKdmFyIGluaXRfd2luZG93VG9nZ2xlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3dpbmRvd1RvZ2dsZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvd2luZG93V2hlbi5qcwp2YXIgaW5pdF93aW5kb3dXaGVuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3dpbmRvd1doZW4uanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3dpdGhMYXRlc3RGcm9tLmpzCnZhciBpbml0X3dpdGhMYXRlc3RGcm9tID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3dpdGhMYXRlc3RGcm9tLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy96aXBBbGwuanMKdmFyIGluaXRfemlwQWxsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3ppcEFsbC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvemlwLmpzCnZhciBpbml0X3ppcDIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvemlwLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy96aXBXaXRoLmpzCnZhciBpbml0X3ppcFdpdGggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvemlwV2l0aC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbmRleC5qcwp2YXIgaW5pdF9lc201ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW5kZXguanMiKCkgewogICAgaW5pdF9PYnNlcnZhYmxlKCk7CiAgICBpbml0X0Nvbm5lY3RhYmxlT2JzZXJ2YWJsZSgpOwogICAgaW5pdF9vYnNlcnZhYmxlKCk7CiAgICBpbml0X2FuaW1hdGlvbkZyYW1lcygpOwogICAgaW5pdF9TdWJqZWN0KCk7CiAgICBpbml0X0JlaGF2aW9yU3ViamVjdCgpOwogICAgaW5pdF9SZXBsYXlTdWJqZWN0KCk7CiAgICBpbml0X0FzeW5jU3ViamVjdCgpOwogICAgaW5pdF9hc2FwKCk7CiAgICBpbml0X2FzeW5jKCk7CiAgICBpbml0X3F1ZXVlKCk7CiAgICBpbml0X2FuaW1hdGlvbkZyYW1lKCk7CiAgICBpbml0X1ZpcnR1YWxUaW1lU2NoZWR1bGVyKCk7CiAgICBpbml0X1NjaGVkdWxlcigpOwogICAgaW5pdF9TdWJzY3JpcHRpb24oKTsKICAgIGluaXRfU3Vic2NyaWJlcigpOwogICAgaW5pdF9Ob3RpZmljYXRpb24oKTsKICAgIGluaXRfcGlwZSgpOwogICAgaW5pdF9ub29wKCk7CiAgICBpbml0X2lkZW50aXR5KCk7CiAgICBpbml0X2lzT2JzZXJ2YWJsZSgpOwogICAgaW5pdF9sYXN0VmFsdWVGcm9tKCk7CiAgICBpbml0X2ZpcnN0VmFsdWVGcm9tKCk7CiAgICBpbml0X0FyZ3VtZW50T3V0T2ZSYW5nZUVycm9yKCk7CiAgICBpbml0X0VtcHR5RXJyb3IoKTsKICAgIGluaXRfTm90Rm91bmRFcnJvcigpOwogICAgaW5pdF9PYmplY3RVbnN1YnNjcmliZWRFcnJvcigpOwogICAgaW5pdF9TZXF1ZW5jZUVycm9yKCk7CiAgICBpbml0X3RpbWVvdXQoKTsKICAgIGluaXRfVW5zdWJzY3JpcHRpb25FcnJvcigpOwogICAgaW5pdF9iaW5kQ2FsbGJhY2soKTsKICAgIGluaXRfYmluZE5vZGVDYWxsYmFjaygpOwogICAgaW5pdF9jb21iaW5lTGF0ZXN0KCk7CiAgICBpbml0X2NvbmNhdCgpOwogICAgaW5pdF9jb25uZWN0YWJsZSgpOwogICAgaW5pdF9kZWZlcigpOwogICAgaW5pdF9lbXB0eSgpOwogICAgaW5pdF9mb3JrSm9pbigpOwogICAgaW5pdF9mcm9tKCk7CiAgICBpbml0X2Zyb21FdmVudCgpOwogICAgaW5pdF9mcm9tRXZlbnRQYXR0ZXJuKCk7CiAgICBpbml0X2dlbmVyYXRlKCk7CiAgICBpbml0X2lpZigpOwogICAgaW5pdF9pbnRlcnZhbCgpOwogICAgaW5pdF9tZXJnZSgpOwogICAgaW5pdF9uZXZlcigpOwogICAgaW5pdF9vZigpOwogICAgaW5pdF9vbkVycm9yUmVzdW1lTmV4dCgpOwogICAgaW5pdF9wYWlycygpOwogICAgaW5pdF9wYXJ0aXRpb24oKTsKICAgIGluaXRfcmFjZSgpOwogICAgaW5pdF9yYW5nZSgpOwogICAgaW5pdF90aHJvd0Vycm9yKCk7CiAgICBpbml0X3RpbWVyKCk7CiAgICBpbml0X3VzaW5nKCk7CiAgICBpbml0X3ppcCgpOwogICAgaW5pdF9zY2hlZHVsZWQoKTsKICAgIGluaXRfZW1wdHkoKTsKICAgIGluaXRfbmV2ZXIoKTsKICAgIGluaXRfdHlwZXMoKTsKICAgIGluaXRfY29uZmlnKCk7CiAgICBpbml0X2F1ZGl0KCk7CiAgICBpbml0X2F1ZGl0VGltZSgpOwogICAgaW5pdF9idWZmZXIoKTsKICAgIGluaXRfYnVmZmVyQ291bnQoKTsKICAgIGluaXRfYnVmZmVyVGltZSgpOwogICAgaW5pdF9idWZmZXJUb2dnbGUoKTsKICAgIGluaXRfYnVmZmVyV2hlbigpOwogICAgaW5pdF9jYXRjaEVycm9yKCk7CiAgICBpbml0X2NvbWJpbmVBbGwoKTsKICAgIGluaXRfY29tYmluZUxhdGVzdEFsbCgpOwogICAgaW5pdF9jb21iaW5lTGF0ZXN0V2l0aCgpOwogICAgaW5pdF9jb25jYXRBbGwoKTsKICAgIGluaXRfY29uY2F0TWFwKCk7CiAgICBpbml0X2NvbmNhdE1hcFRvKCk7CiAgICBpbml0X2NvbmNhdFdpdGgoKTsKICAgIGluaXRfY29ubmVjdCgpOwogICAgaW5pdF9jb3VudCgpOwogICAgaW5pdF9kZWJvdW5jZSgpOwogICAgaW5pdF9kZWJvdW5jZVRpbWUoKTsKICAgIGluaXRfZGVmYXVsdElmRW1wdHkoKTsKICAgIGluaXRfZGVsYXkoKTsKICAgIGluaXRfZGVsYXlXaGVuKCk7CiAgICBpbml0X2RlbWF0ZXJpYWxpemUoKTsKICAgIGluaXRfZGlzdGluY3QoKTsKICAgIGluaXRfZGlzdGluY3RVbnRpbENoYW5nZWQoKTsKICAgIGluaXRfZGlzdGluY3RVbnRpbEtleUNoYW5nZWQoKTsKICAgIGluaXRfZWxlbWVudEF0KCk7CiAgICBpbml0X2VuZFdpdGgoKTsKICAgIGluaXRfZXZlcnkoKTsKICAgIGluaXRfZXhoYXVzdCgpOwogICAgaW5pdF9leGhhdXN0QWxsKCk7CiAgICBpbml0X2V4aGF1c3RNYXAoKTsKICAgIGluaXRfZXhwYW5kKCk7CiAgICBpbml0X2ZpbHRlcigpOwogICAgaW5pdF9maW5hbGl6ZSgpOwogICAgaW5pdF9maW5kKCk7CiAgICBpbml0X2ZpbmRJbmRleCgpOwogICAgaW5pdF9maXJzdCgpOwogICAgaW5pdF9ncm91cEJ5KCk7CiAgICBpbml0X2lnbm9yZUVsZW1lbnRzKCk7CiAgICBpbml0X2lzRW1wdHkoKTsKICAgIGluaXRfbGFzdCgpOwogICAgaW5pdF9tYXAoKTsKICAgIGluaXRfbWFwVG8oKTsKICAgIGluaXRfbWF0ZXJpYWxpemUoKTsKICAgIGluaXRfbWF4KCk7CiAgICBpbml0X21lcmdlQWxsKCk7CiAgICBpbml0X2ZsYXRNYXAoKTsKICAgIGluaXRfbWVyZ2VNYXAoKTsKICAgIGluaXRfbWVyZ2VNYXBUbygpOwogICAgaW5pdF9tZXJnZVNjYW4oKTsKICAgIGluaXRfbWVyZ2VXaXRoKCk7CiAgICBpbml0X21pbigpOwogICAgaW5pdF9tdWx0aWNhc3QoKTsKICAgIGluaXRfb2JzZXJ2ZU9uKCk7CiAgICBpbml0X29uRXJyb3JSZXN1bWVOZXh0V2l0aCgpOwogICAgaW5pdF9wYWlyd2lzZSgpOwogICAgaW5pdF9wbHVjaygpOwogICAgaW5pdF9wdWJsaXNoKCk7CiAgICBpbml0X3B1Ymxpc2hCZWhhdmlvcigpOwogICAgaW5pdF9wdWJsaXNoTGFzdCgpOwogICAgaW5pdF9wdWJsaXNoUmVwbGF5KCk7CiAgICBpbml0X3JhY2VXaXRoKCk7CiAgICBpbml0X3JlZHVjZSgpOwogICAgaW5pdF9yZXBlYXQoKTsKICAgIGluaXRfcmVwZWF0V2hlbigpOwogICAgaW5pdF9yZXRyeSgpOwogICAgaW5pdF9yZXRyeVdoZW4oKTsKICAgIGluaXRfcmVmQ291bnQoKTsKICAgIGluaXRfc2FtcGxlKCk7CiAgICBpbml0X3NhbXBsZVRpbWUoKTsKICAgIGluaXRfc2NhbigpOwogICAgaW5pdF9zZXF1ZW5jZUVxdWFsKCk7CiAgICBpbml0X3NoYXJlKCk7CiAgICBpbml0X3NoYXJlUmVwbGF5KCk7CiAgICBpbml0X3NpbmdsZSgpOwogICAgaW5pdF9za2lwKCk7CiAgICBpbml0X3NraXBMYXN0KCk7CiAgICBpbml0X3NraXBVbnRpbCgpOwogICAgaW5pdF9za2lwV2hpbGUoKTsKICAgIGluaXRfc3RhcnRXaXRoKCk7CiAgICBpbml0X3N1YnNjcmliZU9uKCk7CiAgICBpbml0X3N3aXRjaEFsbCgpOwogICAgaW5pdF9zd2l0Y2hNYXAoKTsKICAgIGluaXRfc3dpdGNoTWFwVG8oKTsKICAgIGluaXRfc3dpdGNoU2NhbigpOwogICAgaW5pdF90YWtlKCk7CiAgICBpbml0X3Rha2VMYXN0KCk7CiAgICBpbml0X3Rha2VVbnRpbCgpOwogICAgaW5pdF90YWtlV2hpbGUoKTsKICAgIGluaXRfdGFwKCk7CiAgICBpbml0X3Rocm90dGxlKCk7CiAgICBpbml0X3Rocm90dGxlVGltZSgpOwogICAgaW5pdF90aHJvd0lmRW1wdHkoKTsKICAgIGluaXRfdGltZUludGVydmFsKCk7CiAgICBpbml0X3RpbWVvdXQoKTsKICAgIGluaXRfdGltZW91dFdpdGgoKTsKICAgIGluaXRfdGltZXN0YW1wKCk7CiAgICBpbml0X3RvQXJyYXkoKTsKICAgIGluaXRfd2luZG93KCk7CiAgICBpbml0X3dpbmRvd0NvdW50KCk7CiAgICBpbml0X3dpbmRvd1RpbWUoKTsKICAgIGluaXRfd2luZG93VG9nZ2xlKCk7CiAgICBpbml0X3dpbmRvd1doZW4oKTsKICAgIGluaXRfd2l0aExhdGVzdEZyb20oKTsKICAgIGluaXRfemlwQWxsKCk7CiAgICBpbml0X3ppcFdpdGgoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9wYXJ0aXRpb24uanMKdmFyIGluaXRfcGFydGl0aW9uMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9wYXJ0aXRpb24uanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3JhY2UuanMKdmFyIGluaXRfcmFjZTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcmFjZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9vcGVyYXRvcnMvaW5kZXguanMKdmFyIGluaXRfb3BlcmF0b3JzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvb3BlcmF0b3JzL2luZGV4LmpzIigpIHsKICAgIGluaXRfYXVkaXQoKTsKICAgIGluaXRfYXVkaXRUaW1lKCk7CiAgICBpbml0X2J1ZmZlcigpOwogICAgaW5pdF9idWZmZXJDb3VudCgpOwogICAgaW5pdF9idWZmZXJUaW1lKCk7CiAgICBpbml0X2J1ZmZlclRvZ2dsZSgpOwogICAgaW5pdF9idWZmZXJXaGVuKCk7CiAgICBpbml0X2NhdGNoRXJyb3IoKTsKICAgIGluaXRfY29tYmluZUFsbCgpOwogICAgaW5pdF9jb21iaW5lTGF0ZXN0QWxsKCk7CiAgICBpbml0X2NvbWJpbmVMYXRlc3QyKCk7CiAgICBpbml0X2NvbWJpbmVMYXRlc3RXaXRoKCk7CiAgICBpbml0X2NvbmNhdDIoKTsKICAgIGluaXRfY29uY2F0QWxsKCk7CiAgICBpbml0X2NvbmNhdE1hcCgpOwogICAgaW5pdF9jb25jYXRNYXBUbygpOwogICAgaW5pdF9jb25jYXRXaXRoKCk7CiAgICBpbml0X2Nvbm5lY3QoKTsKICAgIGluaXRfY291bnQoKTsKICAgIGluaXRfZGVib3VuY2UoKTsKICAgIGluaXRfZGVib3VuY2VUaW1lKCk7CiAgICBpbml0X2RlZmF1bHRJZkVtcHR5KCk7CiAgICBpbml0X2RlbGF5KCk7CiAgICBpbml0X2RlbGF5V2hlbigpOwogICAgaW5pdF9kZW1hdGVyaWFsaXplKCk7CiAgICBpbml0X2Rpc3RpbmN0KCk7CiAgICBpbml0X2Rpc3RpbmN0VW50aWxDaGFuZ2VkKCk7CiAgICBpbml0X2Rpc3RpbmN0VW50aWxLZXlDaGFuZ2VkKCk7CiAgICBpbml0X2VsZW1lbnRBdCgpOwogICAgaW5pdF9lbmRXaXRoKCk7CiAgICBpbml0X2V2ZXJ5KCk7CiAgICBpbml0X2V4aGF1c3QoKTsKICAgIGluaXRfZXhoYXVzdEFsbCgpOwogICAgaW5pdF9leGhhdXN0TWFwKCk7CiAgICBpbml0X2V4cGFuZCgpOwogICAgaW5pdF9maWx0ZXIoKTsKICAgIGluaXRfZmluYWxpemUoKTsKICAgIGluaXRfZmluZCgpOwogICAgaW5pdF9maW5kSW5kZXgoKTsKICAgIGluaXRfZmlyc3QoKTsKICAgIGluaXRfZ3JvdXBCeSgpOwogICAgaW5pdF9pZ25vcmVFbGVtZW50cygpOwogICAgaW5pdF9pc0VtcHR5KCk7CiAgICBpbml0X2xhc3QoKTsKICAgIGluaXRfbWFwKCk7CiAgICBpbml0X21hcFRvKCk7CiAgICBpbml0X21hdGVyaWFsaXplKCk7CiAgICBpbml0X21heCgpOwogICAgaW5pdF9tZXJnZTIoKTsKICAgIGluaXRfbWVyZ2VBbGwoKTsKICAgIGluaXRfZmxhdE1hcCgpOwogICAgaW5pdF9tZXJnZU1hcCgpOwogICAgaW5pdF9tZXJnZU1hcFRvKCk7CiAgICBpbml0X21lcmdlU2NhbigpOwogICAgaW5pdF9tZXJnZVdpdGgoKTsKICAgIGluaXRfbWluKCk7CiAgICBpbml0X211bHRpY2FzdCgpOwogICAgaW5pdF9vYnNlcnZlT24oKTsKICAgIGluaXRfb25FcnJvclJlc3VtZU5leHRXaXRoKCk7CiAgICBpbml0X3BhaXJ3aXNlKCk7CiAgICBpbml0X3BhcnRpdGlvbjIoKTsKICAgIGluaXRfcGx1Y2soKTsKICAgIGluaXRfcHVibGlzaCgpOwogICAgaW5pdF9wdWJsaXNoQmVoYXZpb3IoKTsKICAgIGluaXRfcHVibGlzaExhc3QoKTsKICAgIGluaXRfcHVibGlzaFJlcGxheSgpOwogICAgaW5pdF9yYWNlMigpOwogICAgaW5pdF9yYWNlV2l0aCgpOwogICAgaW5pdF9yZWR1Y2UoKTsKICAgIGluaXRfcmVwZWF0KCk7CiAgICBpbml0X3JlcGVhdFdoZW4oKTsKICAgIGluaXRfcmV0cnkoKTsKICAgIGluaXRfcmV0cnlXaGVuKCk7CiAgICBpbml0X3JlZkNvdW50KCk7CiAgICBpbml0X3NhbXBsZSgpOwogICAgaW5pdF9zYW1wbGVUaW1lKCk7CiAgICBpbml0X3NjYW4oKTsKICAgIGluaXRfc2VxdWVuY2VFcXVhbCgpOwogICAgaW5pdF9zaGFyZSgpOwogICAgaW5pdF9zaGFyZVJlcGxheSgpOwogICAgaW5pdF9zaW5nbGUoKTsKICAgIGluaXRfc2tpcCgpOwogICAgaW5pdF9za2lwTGFzdCgpOwogICAgaW5pdF9za2lwVW50aWwoKTsKICAgIGluaXRfc2tpcFdoaWxlKCk7CiAgICBpbml0X3N0YXJ0V2l0aCgpOwogICAgaW5pdF9zdWJzY3JpYmVPbigpOwogICAgaW5pdF9zd2l0Y2hBbGwoKTsKICAgIGluaXRfc3dpdGNoTWFwKCk7CiAgICBpbml0X3N3aXRjaE1hcFRvKCk7CiAgICBpbml0X3N3aXRjaFNjYW4oKTsKICAgIGluaXRfdGFrZSgpOwogICAgaW5pdF90YWtlTGFzdCgpOwogICAgaW5pdF90YWtlVW50aWwoKTsKICAgIGluaXRfdGFrZVdoaWxlKCk7CiAgICBpbml0X3RhcCgpOwogICAgaW5pdF90aHJvdHRsZSgpOwogICAgaW5pdF90aHJvdHRsZVRpbWUoKTsKICAgIGluaXRfdGhyb3dJZkVtcHR5KCk7CiAgICBpbml0X3RpbWVJbnRlcnZhbCgpOwogICAgaW5pdF90aW1lb3V0KCk7CiAgICBpbml0X3RpbWVvdXRXaXRoKCk7CiAgICBpbml0X3RpbWVzdGFtcCgpOwogICAgaW5pdF90b0FycmF5KCk7CiAgICBpbml0X3dpbmRvdygpOwogICAgaW5pdF93aW5kb3dDb3VudCgpOwogICAgaW5pdF93aW5kb3dUaW1lKCk7CiAgICBpbml0X3dpbmRvd1RvZ2dsZSgpOwogICAgaW5pdF93aW5kb3dXaGVuKCk7CiAgICBpbml0X3dpdGhMYXRlc3RGcm9tKCk7CiAgICBpbml0X3ppcDIoKTsKICAgIGluaXRfemlwQWxsKCk7CiAgICBpbml0X3ppcFdpdGgoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cnhAMy4wLjEwL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHJ4L2Rpc3RfdHMvc21hcnRyeC5wbHVnaW5zLnJ4anMuanMKdmFyIHNtYXJ0cnhfcGx1Z2luc19yeGpzX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoc21hcnRyeF9wbHVnaW5zX3J4anNfZXhwb3J0cywgewogIE9ic2VydmFibGU6ICgpID0+IE9ic2VydmFibGUsCiAgUmVwbGF5U3ViamVjdDogKCkgPT4gUmVwbGF5U3ViamVjdCwKICBTdWJqZWN0OiAoKSA9PiBTdWJqZWN0LAogIFN1YnNjcmlwdGlvbjogKCkgPT4gU3Vic2NyaXB0aW9uLAogIGZyb206ICgpID0+IGZyb20sCiAgZnJvbUV2ZW50OiAoKSA9PiBmcm9tRXZlbnQsCiAgb2Y6ICgpID0+IG9mLAogIG9wczogKCkgPT4gb3BzCn0pOwp2YXIgb3BzOwp2YXIgaW5pdF9zbWFydHJ4X3BsdWdpbnNfcnhqcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cnhAMy4wLjEwL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHJ4L2Rpc3RfdHMvc21hcnRyeC5wbHVnaW5zLnJ4anMuanMiKCkgewogICAgaW5pdF9lc201KCk7CiAgICBpbml0X29wZXJhdG9ycygpOwogICAgb3BzID0gewogICAgICBidWZmZXIsCiAgICAgIGJ1ZmZlckNvdW50LAogICAgICBidWZmZXJUaW1lLAogICAgICBkZWJvdW5jZSwKICAgICAgZGVib3VuY2VUaW1lLAogICAgICBmaWx0ZXIsCiAgICAgIG1hcDogbWFwMiwKICAgICAgc3RhcnRXaXRoLAogICAgICB0YWtlVW50aWwsCiAgICAgIHRocm90dGxlVGltZQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cnhAMy4wLjEwL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHJ4L2Rpc3RfdHMvc21hcnRyeC5jbGFzc2VzLm9ic2VydmFibGVtYXAuanMKdmFyIE9ic2VydmFibGVtYXA7CnZhciBpbml0X3NtYXJ0cnhfY2xhc3Nlc19vYnNlcnZhYmxlbWFwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyeEAzLjAuMTAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cngvZGlzdF90cy9zbWFydHJ4LmNsYXNzZXMub2JzZXJ2YWJsZW1hcC5qcyIoKSB7CiAgICBpbml0X3NtYXJ0cnhfcGx1Z2lucygpOwogICAgaW5pdF9zbWFydHJ4X3BsdWdpbnNfcnhqcygpOwogICAgT2JzZXJ2YWJsZW1hcCA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5vYnNlcnZhYmxlRXZlbnRFbWl0dGVyQnVuZGxlQXJyYXkgPSBuZXcgQXJyYXkoKTsKICAgICAgICB0aGlzLm9ic2VydmFibGVFdmVudFRhcmdldEJ1bmRsZUFycmF5ID0gbmV3IEFycmF5KCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNyZWF0ZXMgYSBob3Qgc3ViamVjdCBpZiBub3QgeWV0IHJlZ2lzdGVyZWQgZm9yIHRoZSBldmVudC4KICAgICAgICogSW4gY2FzZSBldmVudCBoYXMgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgc2FtZSBvYnNlcnZhYmxlIGlzIHJldHVybmVkLgogICAgICAgKi8KICAgICAgZ2V0U3ViamVjdEZvckVtaXR0ZXJFdmVudChlbWl0dGVyQXJnLCBldmVudEFyZykgewogICAgICAgIGNvbnN0IGV4aXN0aW5nQnVuZGxlID0gdGhpcy5vYnNlcnZhYmxlRXZlbnRFbWl0dGVyQnVuZGxlQXJyYXkuZmluZCgoYnVuZGxlQXJnKSA9PiB7CiAgICAgICAgICByZXR1cm4gYnVuZGxlQXJnLmV2ZW50UmVmID09PSBlbWl0dGVyQXJnICYmIGJ1bmRsZUFyZy5ldmVudCA9PT0gZXZlbnRBcmc7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGV4aXN0aW5nQnVuZGxlKSB7CiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdCdW5kbGUuc3ViamVjdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgZW1pdHRlck9ic2VydmFibGUgPSBmcm9tRXZlbnQoZW1pdHRlckFyZywgZXZlbnRBcmcpOwogICAgICAgICAgY29uc3QgZW1pdHRlclN1YmplY3QgPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgZW1pdHRlck9ic2VydmFibGUuc3Vic2NyaWJlKGVtaXR0ZXJTdWJqZWN0KTsKICAgICAgICAgIGNvbnN0IG5ld0J1bmRsZSA9IHsKICAgICAgICAgICAgc3ViamVjdDogZW1pdHRlclN1YmplY3QsCiAgICAgICAgICAgIGV2ZW50UmVmOiBlbWl0dGVyQXJnLAogICAgICAgICAgICBldmVudDogZXZlbnRBcmcKICAgICAgICAgIH07CiAgICAgICAgICB0aGlzLm9ic2VydmFibGVFdmVudEVtaXR0ZXJCdW5kbGVBcnJheS5wdXNoKG5ld0J1bmRsZSk7CiAgICAgICAgICByZXR1cm4gbmV3QnVuZGxlLnN1YmplY3Q7CiAgICAgICAgfQogICAgICB9CiAgICAgIGdldFN1YmplY3RGb3JFdmVudFRhcmdldChldmVudFRhcmdldEFyZywgZXZlbnROYW1lQXJnKSB7CiAgICAgICAgY29uc3QgZXhpc3RpbmdCdW5kbGUgPSB0aGlzLm9ic2VydmFibGVFdmVudFRhcmdldEJ1bmRsZUFycmF5LmZpbmQoKGJ1bmRsZUFyZykgPT4gewogICAgICAgICAgcmV0dXJuIGJ1bmRsZUFyZy5ldmVudFJlZiA9PT0gZXZlbnRUYXJnZXRBcmcgJiYgYnVuZGxlQXJnLmV2ZW50ID09PSBldmVudE5hbWVBcmc7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGV4aXN0aW5nQnVuZGxlKSB7CiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdCdW5kbGUuc3ViamVjdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgZW1pdHRlclN1YmplY3QgPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgY29uc3QgbmV3QnVuZGxlID0gewogICAgICAgICAgICBzdWJqZWN0OiBlbWl0dGVyU3ViamVjdCwKICAgICAgICAgICAgZXZlbnRSZWY6IGV2ZW50VGFyZ2V0QXJnLAogICAgICAgICAgICBldmVudDogZXZlbnROYW1lQXJnCiAgICAgICAgICB9OwogICAgICAgICAgdGhpcy5vYnNlcnZhYmxlRXZlbnRUYXJnZXRCdW5kbGVBcnJheS5wdXNoKG5ld0J1bmRsZSk7CiAgICAgICAgICByZXR1cm4gbmV3QnVuZGxlLnN1YmplY3Q7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyeEAzLjAuMTAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cngvZGlzdF90cy9zbWFydHJ4LmNsYXNzZXMub2JzZXJ2YWJsZWludGFrZS5qcwp2YXIgT2JzZXJ2YWJsZUludGFrZTsKdmFyIGluaXRfc21hcnRyeF9jbGFzc2VzX29ic2VydmFibGVpbnRha2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJ4QDMuMC4xMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyeC9kaXN0X3RzL3NtYXJ0cnguY2xhc3Nlcy5vYnNlcnZhYmxlaW50YWtlLmpzIigpIHsKICAgIGluaXRfc21hcnRyeF9wbHVnaW5zKCk7CiAgICBpbml0X3NtYXJ0cnhfcGx1Z2luc19yeGpzKCk7CiAgICBPYnNlcnZhYmxlSW50YWtlID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLm9ic2VydmFibGVGdW5jdGlvbnMgPSB7CiAgICAgICAgICBuZXh0OiAocGF5bG9hZEFyZykgPT4gewogICAgICAgICAgfSwKICAgICAgICAgIGNvbXBsZXRlOiAocGF5bG9hZEFyZykgPT4gewogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdGhpcy5nZW5lcmF0b3IgPSBudWxsOwogICAgICAgIHRoaXMuYnVmZmVyZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLnBheWxvYWRCdWZmZXIgPSBbXTsKICAgICAgICB0aGlzLm9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXJBcmcpID0+IHsKICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZUZ1bmN0aW9ucy5uZXh0ID0gKC4uLmFyZ3MpID0+IHsKICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyQXJnLm5leHQoYXJncyk7CiAgICAgICAgICB9OwogICAgICAgICAgdGhpcy5vYnNlcnZhYmxlRnVuY3Rpb25zLmNvbXBsZXRlID0gKCkgPT4gewogICAgICAgICAgICB0aGlzLmNvbXBsZXRlZERlZmZlcmVkLnJlc29sdmUoKTsKICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyQXJnLmNvbXBsZXRlKCk7CiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICAgIHRoaXMuY29tcGxldGVkRGVmZmVyZWQgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgICAgICB0aGlzLmNvbXBsZXRlZCA9IHRoaXMuY29tcGxldGVkRGVmZmVyZWQucHJvbWlzZTsKICAgICAgfQogICAgICBzZXRPYnNlcnZhYmxlKG9ic2VydmFibGVGdW5jKSB7CiAgICAgICAgdGhpcy5vYnNlcnZhYmxlID0gb2JzZXJ2YWJsZUZ1bmM7CiAgICAgIH0KICAgICAgcHVzaChwYXlsb2FkQXJnKSB7CiAgICAgICAgaWYgKHRoaXMuYnVmZmVyZWQpIHsKICAgICAgICAgIHRoaXMucGF5bG9hZEJ1ZmZlci5wdXNoKHBheWxvYWRBcmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmludGVybmFsUHVzaChwYXlsb2FkQXJnKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHB1c2hlcyBtYW55IHBheWxvYWRzIGFzIGFycmF5CiAgICAgICAqIEBwYXJhbSBwYXlsb2FkQXJnQXJyYXkKICAgICAgICovCiAgICAgIHB1c2hNYW55KHBheWxvYWRBcmdBcnJheSkgewogICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXlsb2FkQXJnQXJyYXkpIHsKICAgICAgICAgIHRoaXMucHVzaChpdGVtKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHNldHMgYSBnZW5lcmF0b3IgdG8gcXVlcnkgdGhlIG5leHQgcHVzaGVkIHZhbHVlCiAgICAgICAqIEBwYXJhbSBnZW5lcmF0b3JBcmcKICAgICAgICovCiAgICAgIHNldEdlbmVyYXRvcihnZW5lcmF0b3JBcmcpIHsKICAgICAgICB0aGlzLmdlbmVyYXRvciA9IGdlbmVyYXRvckFyZzsKICAgICAgfQogICAgICBtYWtlQnVmZmVyZWQoKSB7CiAgICAgICAgdGhpcy5idWZmZXJlZCA9IHRydWU7CiAgICAgIH0KICAgICAgc3Vic2NyaWJlKC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZhYmxlLnN1YnNjcmliZSguLi5hcmdzKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogcmVxdWVzdCB0aGUgbmV4dCB2YWx1ZXMgaW4gdGhlIHF1YW50aXR5IHNwZWNpZmllZAogICAgICAgKiBAcGFyYW0gaG93TWFueUFyZyBpZiBhIGdlbmVyYXRvciBpcyBzZXQsIG9mIGEgYnVmZmVyIGV4aXN0cywgdGhpcyBhbGxvd3MgcmV0cmlldmluZyB2YWx1ZXMKICAgICAgICovCiAgICAgIHJlcXVlc3QoaG93TWFueUFyZykgewogICAgICAgIGlmIChob3dNYW55QXJnID09PSAwKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvciAobGV0IGkxMSA9IDA7IGkxMSAhPT0gaG93TWFueUFyZzsgaTExKyspIHsKICAgICAgICAgICAgaWYgKHRoaXMucGF5bG9hZEJ1ZmZlci5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFB1c2godGhpcy5wYXlsb2FkQnVmZmVyLnNoaWZ0KCkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGNvbnN0IG5leHRQYXlsb2FkID0gdGhpcy5nZW5lcmF0b3IubmV4dCgpOwogICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxQdXNoKG5leHRQYXlsb2FkLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogc2lnbmFscyB0aGUgY29tcGxldGlvbiBvZiB0aGlzIG9ic2VydmFibGUKICAgICAgICovCiAgICAgIHNpZ25hbENvbXBsZXRlKCkgewogICAgICAgIHRoaXMub2JzZXJ2YWJsZUZ1bmN0aW9ucy5jb21wbGV0ZSgpOwogICAgICB9CiAgICAgIGludGVybmFsUHVzaChwYXlsb2FkQXJnKSB7CiAgICAgICAgdGhpcy5vYnNlcnZhYmxlRnVuY3Rpb25zLm5leHQocGF5bG9hZEFyZyk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJ4QDMuMC4xMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyeC9kaXN0X3RzL3NtYXJ0cnguZnVuY3Rpb25zLmpzCmZ1bmN0aW9uIGZyb21TdHJlYW1XaXRoQmFja3ByZXNzdXJlKHN0cmVhbSkgewogIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoc3Vic2NyaWJlcikgPT4gewogICAgY29uc3QgcGF1c2VTdHJlYW0gPSAoKSA9PiBzdHJlYW0ucGF1c2UoKTsKICAgIGNvbnN0IHJlc3VtZVN0cmVhbSA9ICgpID0+IHByb2Nlc3MubmV4dFRpY2soKCkgPT4gc3RyZWFtLnJlc3VtZSgpKTsKICAgIGNvbnN0IG9uRGF0YSA9IChkYXRhKSA9PiB7CiAgICAgIHBhdXNlU3RyZWFtKCk7CiAgICAgIHN1YnNjcmliZXIubmV4dChkYXRhKTsKICAgICAgcmVzdW1lU3RyZWFtKCk7CiAgICB9OwogICAgc3RyZWFtLm9uKCJkYXRhIiwgb25EYXRhKTsKICAgIHN0cmVhbS5vbigiZXJyb3IiLCAoZXJyb3IpID0+IHN1YnNjcmliZXIuZXJyb3IoZXJyb3IpKTsKICAgIHN0cmVhbS5vbigiZW5kIiwgKCkgPT4gc3Vic2NyaWJlci5jb21wbGV0ZSgpKTsKICAgIHN0cmVhbS5vbigiY2xvc2UiLCAoKSA9PiBzdWJzY3JpYmVyLmNvbXBsZXRlKCkpOwogICAgcmV0dXJuICgpID0+IHsKICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCJkYXRhIiwgb25EYXRhKTsKICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsIHN1YnNjcmliZXIuZXJyb3IpOwogICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoImVuZCIsIHN1YnNjcmliZXIuY29tcGxldGUpOwogICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoImNsb3NlIiwgc3Vic2NyaWJlci5jb21wbGV0ZSk7CiAgICB9OwogIH0pOwp9CnZhciBpbml0X3NtYXJ0cnhfZnVuY3Rpb25zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyeEAzLjAuMTAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cngvZGlzdF90cy9zbWFydHJ4LmZ1bmN0aW9ucy5qcyIoKSB7CiAgICBpbml0X2VzbTUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cnhAMy4wLjEwL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHJ4L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czIgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMiwgewogIE9ic2VydmFibGVJbnRha2U6ICgpID0+IE9ic2VydmFibGVJbnRha2UsCiAgT2JzZXJ2YWJsZW1hcDogKCkgPT4gT2JzZXJ2YWJsZW1hcCwKICBmcm9tU3RyZWFtV2l0aEJhY2twcmVzc3VyZTogKCkgPT4gZnJvbVN0cmVhbVdpdGhCYWNrcHJlc3N1cmUsCiAgcnhqczogKCkgPT4gc21hcnRyeF9wbHVnaW5zX3J4anNfZXhwb3J0cwp9KTsKdmFyIGluaXRfZGlzdF90czIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJ4QDMuMC4xMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyeC9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfc21hcnRyeF9wbHVnaW5zKCk7CiAgICBpbml0X3NtYXJ0cnhfY2xhc3Nlc19vYnNlcnZhYmxlbWFwKCk7CiAgICBpbml0X3NtYXJ0cnhfY2xhc3Nlc19vYnNlcnZhYmxlaW50YWtlKCk7CiAgICBpbml0X3NtYXJ0cnhfZnVuY3Rpb25zKCk7CiAgICBpbml0X3NtYXJ0cnhfcGx1Z2luc19yeGpzKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3Byb3BlcnR5LmpzCmZ1bmN0aW9uIG41KHQ5KSB7CiAgcmV0dXJuIChlMTEsIG8xMykgPT4gIm9iamVjdCIgPT0gdHlwZW9mIG8xMyA/IHI0KHQ5LCBlMTEsIG8xMykgOiAoKHQxMCwgZTEyLCBvMTQpID0+IHsKICAgIGNvbnN0IHIxMSA9IGUxMi5oYXNPd25Qcm9wZXJ0eShvMTQpOwogICAgcmV0dXJuIGUxMi5jb25zdHJ1Y3Rvci5jcmVhdGVQcm9wZXJ0eShvMTQsIHQxMCksIHIxMSA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZTEyLCBvMTQpIDogdm9pZCAwOwogIH0pKHQ5LCBlMTEsIG8xMyk7Cn0KdmFyIG82LCByNDsKdmFyIGluaXRfcHJvcGVydHkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3Byb3BlcnR5LmpzIigpIHsKICAgIGluaXRfcmVhY3RpdmVfZWxlbWVudCgpOwogICAgbzYgPSB7IGF0dHJpYnV0ZTogdHJ1ZSwgdHlwZTogU3RyaW5nLCBjb252ZXJ0ZXI6IHUsIHJlZmxlY3Q6IGZhbHNlLCBoYXNDaGFuZ2VkOiBmIH0sIHI0ID0gKHQ5ID0gbzYsIGUxMSwgcjExKSA9PiB7CiAgICAgIGNvbnN0IHsga2luZDogbjEzLCBtZXRhZGF0YTogaTExIH0gPSByMTE7CiAgICAgIGxldCBzOSA9IGdsb2JhbFRoaXMubGl0UHJvcGVydHlNZXRhZGF0YS5nZXQoaTExKTsKICAgICAgaWYgKHZvaWQgMCA9PT0gczkgJiYgZ2xvYmFsVGhpcy5saXRQcm9wZXJ0eU1ldGFkYXRhLnNldChpMTEsIHM5ID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSksICJzZXR0ZXIiID09PSBuMTMgJiYgKCh0OSA9IE9iamVjdC5jcmVhdGUodDkpKS53cmFwcGVkID0gdHJ1ZSksIHM5LnNldChyMTEubmFtZSwgdDkpLCAiYWNjZXNzb3IiID09PSBuMTMpIHsKICAgICAgICBjb25zdCB7IG5hbWU6IG8xMyB9ID0gcjExOwogICAgICAgIHJldHVybiB7IHNldChyMTIpIHsKICAgICAgICAgIGNvbnN0IG4xNCA9IGUxMS5nZXQuY2FsbCh0aGlzKTsKICAgICAgICAgIGUxMS5zZXQuY2FsbCh0aGlzLCByMTIpLCB0aGlzLnJlcXVlc3RVcGRhdGUobzEzLCBuMTQsIHQ5LCB0cnVlLCByMTIpOwogICAgICAgIH0sIGluaXQoZTEyKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwICE9PSBlMTIgJiYgdGhpcy5DKG8xMywgdm9pZCAwLCB0OSwgZTEyKSwgZTEyOwogICAgICAgIH0gfTsKICAgICAgfQogICAgICBpZiAoInNldHRlciIgPT09IG4xMykgewogICAgICAgIGNvbnN0IHsgbmFtZTogbzEzIH0gPSByMTE7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHIxMikgewogICAgICAgICAgY29uc3QgbjE0ID0gdGhpc1tvMTNdOwogICAgICAgICAgZTExLmNhbGwodGhpcywgcjEyKSwgdGhpcy5yZXF1ZXN0VXBkYXRlKG8xMywgbjE0LCB0OSwgdHJ1ZSwgcjEyKTsKICAgICAgICB9OwogICAgICB9CiAgICAgIHRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBkZWNvcmF0b3IgbG9jYXRpb246ICIgKyBuMTMpOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0L2RlY29yYXRvcnMvcHJvcGVydHkuanMKdmFyIGluaXRfcHJvcGVydHkyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbGl0QDMuMy4yL25vZGVfbW9kdWxlcy9saXQvZGVjb3JhdG9ycy9wcm9wZXJ0eS5qcyIoKSB7CiAgICBpbml0X3Byb3BlcnR5KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuMy44L25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuY29sb3JzLmpzCnZhciBpbml0X2RvbXRvb2xzX2NvbG9ycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi4zLjgvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5jb2xvcnMuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRkZWxheUAzLjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRkZWxheS9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMzID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czMsIHsKICBUaW1lb3V0OiAoKSA9PiBUaW1lb3V0LAogIGRlbGF5Rm9yOiAoKSA9PiBkZWxheUZvciwKICBkZWxheUZvclJhbmRvbTogKCkgPT4gZGVsYXlGb3JSYW5kb20KfSk7CnZhciBkZWxheUZvciwgZGVsYXlGb3JSYW5kb20sIFRpbWVvdXQ7CnZhciBpbml0X2Rpc3RfdHMzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRkZWxheUAzLjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRkZWxheS9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfZGlzdF90cygpOwogICAgZGVsYXlGb3IgPSBhc3luYyAodGltZUluTWlsbGlzZWNvbmRBcmcsIHBhc3NPbkFyZywgdW5yZWZlZEFyZyA9IGZhbHNlKSA9PiB7CiAgICAgIGNvbnN0IHRpbWVvdXQyID0gbmV3IFRpbWVvdXQodGltZUluTWlsbGlzZWNvbmRBcmcsIG51bGwsIHVucmVmZWRBcmcpOwogICAgICBhd2FpdCB0aW1lb3V0Mi5wcm9taXNlOwogICAgICByZXR1cm4gcGFzc09uQXJnOwogICAgfTsKICAgIGRlbGF5Rm9yUmFuZG9tID0gYXN5bmMgKHRpbWVNaW5Jbk1pbGxpc2Vjb25kQXJnLCB0aW1lTWF4SW5NaWxsaXNlY29uZEFyZywgcGFzc09uQXJnLCB1bnJlZmVkQXJnID0gZmFsc2UpID0+IHsKICAgICAgYXdhaXQgZGVsYXlGb3IoTWF0aC5yYW5kb20oKSAqICh0aW1lTWF4SW5NaWxsaXNlY29uZEFyZyAtIHRpbWVNaW5Jbk1pbGxpc2Vjb25kQXJnKSArIHRpbWVNaW5Jbk1pbGxpc2Vjb25kQXJnLCBudWxsLCB1bnJlZmVkQXJnKTsKICAgICAgcmV0dXJuIHBhc3NPbkFyZzsKICAgIH07CiAgICBUaW1lb3V0ID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3Rvcih0aW1lSW5NaWxsaXNlY29uZEFyZywgcGFzc09uLCB1bnJlZmVkQXJnID0gZmFsc2UpIHsKICAgICAgICB0aGlzLl9jYW5jZWxsZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLnRpbWVvdXRJbk1pbGxpcyA9IHRpbWVJbk1pbGxpc2Vjb25kQXJnOwogICAgICAgIHRoaXMuX2RlZmVycmVkID0gZGVmZXIoKTsKICAgICAgICB0aGlzLnByb21pc2UgPSB0aGlzLl9kZWZlcnJlZC5wcm9taXNlOwogICAgICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgIGlmICghdGhpcy5fY2FuY2VsbGVkKSB7CiAgICAgICAgICAgIHRoaXMuX2RlZmVycmVkLnJlc29sdmUocGFzc09uKTsKICAgICAgICAgIH0KICAgICAgICB9LCB0aW1lSW5NaWxsaXNlY29uZEFyZyk7CiAgICAgICAgdGhpcy5zdGFydGVkID0gRGF0ZS5ub3coKTsKICAgICAgICBpZiAodW5yZWZlZEFyZykgewogICAgICAgICAgdGhpcy5tYWtlVW5yZWZlZCgpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogdW5yZWZmaW5nIGEgdGltZW91dCBjYXVzZXMgdGhlIG5vZGUgcHJvY2VzcyB0byBub3Qgd2FpdCBmb3IgY29tcGxldGlvbiBiZWZvcmUgZXhpdAogICAgICAgKi8KICAgICAgbWFrZVVucmVmZWQoKSB7CiAgICAgICAgdGhpcy5fdGltZW91dC51bnJlZigpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBjYW5jZWxzIHRoZSB0aW1lcgogICAgICAgKi8KICAgICAgY2FuY2VsKCkgewogICAgICAgIHRoaXMuX2NhbmNlbGxlZCA9IHRydWU7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpOwogICAgICB9CiAgICAgIGdldFRpbWVMZWZ0KCkgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc3RhcnRlZCArIHRoaXMudGltZW91dEluTWlsbGlzIC0gRGF0ZS5ub3coKTsKICAgICAgICByZXR1cm4gcmVzdWx0ID4gMCA/IHJlc3VsdCA6IDA7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3QtaW50ZXJmYWNlc0AzLjAuMTkvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC1pbnRlcmZhY2VzL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czQgPSB7fTsKdmFyIGluaXRfZGlzdF90czQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3QtaW50ZXJmYWNlc0AzLjAuMTkvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC1pbnRlcmZhY2VzL2Rpc3RfdHMvaW5kZXguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZXNjYXBlLXN0cmluZy1yZWdleHBANS4wLjAvbm9kZV9tb2R1bGVzL2VzY2FwZS1zdHJpbmctcmVnZXhwL2luZGV4LmpzCmZ1bmN0aW9uIGVzY2FwZVN0cmluZ1JlZ2V4cChzdHJpbmczKSB7CiAgaWYgKHR5cGVvZiBzdHJpbmczICE9PSAic3RyaW5nIikgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBzdHJpbmciKTsKICB9CiAgcmV0dXJuIHN0cmluZzMucmVwbGFjZSgvW3xcXHt9KClbXF1eJCsqPy5dL2csICJcXCQmIikucmVwbGFjZSgvLS9nLCAiXFx4MmQiKTsKfQp2YXIgaW5pdF9lc2NhcGVfc3RyaW5nX3JlZ2V4cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2VzY2FwZS1zdHJpbmctcmVnZXhwQDUuMC4wL25vZGVfbW9kdWxlcy9lc2NhcGUtc3RyaW5nLXJlZ2V4cC9pbmRleC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tYXRjaGVyQDUuMC4wL25vZGVfbW9kdWxlcy9tYXRjaGVyL2luZGV4LmpzCnZhciBtYXRjaGVyX2V4cG9ydHMgPSB7fTsKX19leHBvcnQobWF0Y2hlcl9leHBvcnRzLCB7CiAgaXNNYXRjaDogKCkgPT4gaXNNYXRjaCwKICBtYXRjaGVyOiAoKSA9PiBtYXRjaGVyCn0pOwpmdW5jdGlvbiBtYXRjaGVyKGlucHV0cywgcGF0dGVybnMyLCBvcHRpb25zKSB7CiAgcmV0dXJuIGJhc2VNYXRjaGVyKGlucHV0cywgcGF0dGVybnMyLCBvcHRpb25zLCBmYWxzZSk7Cn0KZnVuY3Rpb24gaXNNYXRjaChpbnB1dHMsIHBhdHRlcm5zMiwgb3B0aW9ucykgewogIHJldHVybiBiYXNlTWF0Y2hlcihpbnB1dHMsIHBhdHRlcm5zMiwgb3B0aW9ucywgdHJ1ZSkubGVuZ3RoID4gMDsKfQp2YXIgcmVnZXhwQ2FjaGUsIHNhbml0aXplQXJyYXksIG1ha2VSZWdleHAsIGJhc2VNYXRjaGVyOwp2YXIgaW5pdF9tYXRjaGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWF0Y2hlckA1LjAuMC9ub2RlX21vZHVsZXMvbWF0Y2hlci9pbmRleC5qcyIoKSB7CiAgICBpbml0X2VzY2FwZV9zdHJpbmdfcmVnZXhwKCk7CiAgICByZWdleHBDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBzYW5pdGl6ZUFycmF5ID0gKGlucHV0LCBpbnB1dE5hbWUpID0+IHsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0KSkgewogICAgICAgIHN3aXRjaCAodHlwZW9mIGlucHV0KSB7CiAgICAgICAgICBjYXNlICJzdHJpbmciOgogICAgICAgICAgICBpbnB1dCA9IFtpbnB1dF07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAidW5kZWZpbmVkIjoKICAgICAgICAgICAgaW5wdXQgPSBbXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAnJHtpbnB1dE5hbWV9JyB0byBiZSBhIHN0cmluZyBvciBhbiBhcnJheSwgYnV0IGdvdCBhIHR5cGUgb2YgJyR7dHlwZW9mIGlucHV0fSdgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGlucHV0LmZpbHRlcigoc3RyaW5nMykgPT4gewogICAgICAgIGlmICh0eXBlb2Ygc3RyaW5nMyAhPT0gInN0cmluZyIpIHsKICAgICAgICAgIGlmICh0eXBlb2Ygc3RyaW5nMyA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgJyR7aW5wdXROYW1lfScgdG8gYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncywgYnV0IGZvdW5kIGEgdHlwZSBvZiAnJHt0eXBlb2Ygc3RyaW5nM30nIGluIHRoZSBhcnJheWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSk7CiAgICB9OwogICAgbWFrZVJlZ2V4cCA9IChwYXR0ZXJuLCBvcHRpb25zKSA9PiB7CiAgICAgIG9wdGlvbnMgPSB7CiAgICAgICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UsCiAgICAgICAgLi4ub3B0aW9ucwogICAgICB9OwogICAgICBjb25zdCBjYWNoZUtleSA9IHBhdHRlcm4gKyBKU09OLnN0cmluZ2lmeShvcHRpb25zKTsKICAgICAgaWYgKHJlZ2V4cENhY2hlLmhhcyhjYWNoZUtleSkpIHsKICAgICAgICByZXR1cm4gcmVnZXhwQ2FjaGUuZ2V0KGNhY2hlS2V5KTsKICAgICAgfQogICAgICBjb25zdCBuZWdhdGVkID0gcGF0dGVyblswXSA9PT0gIiEiOwogICAgICBpZiAobmVnYXRlZCkgewogICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKDEpOwogICAgICB9CiAgICAgIHBhdHRlcm4gPSBlc2NhcGVTdHJpbmdSZWdleHAocGF0dGVybikucmVwbGFjZSgvXFxcKi9nLCAiW1xcc1xcU10qIik7CiAgICAgIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoYF4ke3BhdHRlcm59JGAsIG9wdGlvbnMuY2FzZVNlbnNpdGl2ZSA/ICIiIDogImkiKTsKICAgICAgcmVnZXhwLm5lZ2F0ZWQgPSBuZWdhdGVkOwogICAgICByZWdleHBDYWNoZS5zZXQoY2FjaGVLZXksIHJlZ2V4cCk7CiAgICAgIHJldHVybiByZWdleHA7CiAgICB9OwogICAgYmFzZU1hdGNoZXIgPSAoaW5wdXRzLCBwYXR0ZXJuczIsIG9wdGlvbnMsIGZpcnN0TWF0Y2hPbmx5KSA9PiB7CiAgICAgIGlucHV0cyA9IHNhbml0aXplQXJyYXkoaW5wdXRzLCAiaW5wdXRzIik7CiAgICAgIHBhdHRlcm5zMiA9IHNhbml0aXplQXJyYXkocGF0dGVybnMyLCAicGF0dGVybnMiKTsKICAgICAgaWYgKHBhdHRlcm5zMi5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgICAgcGF0dGVybnMyID0gcGF0dGVybnMyLm1hcCgocGF0dGVybikgPT4gbWFrZVJlZ2V4cChwYXR0ZXJuLCBvcHRpb25zKSk7CiAgICAgIGNvbnN0IHsgYWxsUGF0dGVybnMgfSA9IG9wdGlvbnMgfHwge307CiAgICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgICBmb3IgKGNvbnN0IGlucHV0IG9mIGlucHV0cykgewogICAgICAgIGxldCBtYXRjaGVzOwogICAgICAgIGNvbnN0IGRpZEZpdCA9IFsuLi5wYXR0ZXJuczJdLmZpbGwoZmFsc2UpOwogICAgICAgIGZvciAoY29uc3QgW2luZGV4MiwgcGF0dGVybl0gb2YgcGF0dGVybnMyLmVudHJpZXMoKSkgewogICAgICAgICAgaWYgKHBhdHRlcm4udGVzdChpbnB1dCkpIHsKICAgICAgICAgICAgZGlkRml0W2luZGV4Ml0gPSB0cnVlOwogICAgICAgICAgICBtYXRjaGVzID0gIXBhdHRlcm4ubmVnYXRlZDsKICAgICAgICAgICAgaWYgKCFtYXRjaGVzKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCEobWF0Y2hlcyA9PT0gZmFsc2UgfHwgbWF0Y2hlcyA9PT0gdm9pZCAwICYmIHBhdHRlcm5zMi5zb21lKChwYXR0ZXJuKSA9PiAhcGF0dGVybi5uZWdhdGVkKSB8fCBhbGxQYXR0ZXJucyAmJiBkaWRGaXQuc29tZSgoeWVzLCBpbmRleDIpID0+ICF5ZXMgJiYgIXBhdHRlcm5zMltpbmRleDJdLm5lZ2F0ZWQpKSkgewogICAgICAgICAgcmVzdWx0LnB1c2goaW5wdXQpOwogICAgICAgICAgaWYgKGZpcnN0TWF0Y2hPbmx5KSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0bWF0Y2hAMi4wLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0bWF0Y2gvZGlzdF90cy9zbWFydG1hdGNoLnBsdWdpbnMuanMKdmFyIGluaXRfc21hcnRtYXRjaF9wbHVnaW5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRtYXRjaEAyLjAuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRtYXRjaC9kaXN0X3RzL3NtYXJ0bWF0Y2gucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X21hdGNoZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0bWF0Y2hAMi4wLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0bWF0Y2gvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzNSA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHM1LCB7CiAgU21hcnRNYXRjaDogKCkgPT4gU21hcnRNYXRjaAp9KTsKdmFyIFNtYXJ0TWF0Y2g7CnZhciBpbml0X2Rpc3RfdHM1ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRtYXRjaEAyLjAuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRtYXRjaC9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfc21hcnRtYXRjaF9wbHVnaW5zKCk7CiAgICBTbWFydE1hdGNoID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3Rvcih3aWxkY2FyZEFyZykgewogICAgICAgIHRoaXMud2lsZGNhcmQgPSB3aWxkY2FyZEFyZzsKICAgICAgfQogICAgICBtYXRjaChtYXRjaFN0cmluZ0FyZykgewogICAgICAgIHJldHVybiBtYXRjaGVyX2V4cG9ydHMuaXNNYXRjaChtYXRjaFN0cmluZ0FyZywgdGhpcy53aWxkY2FyZCk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9jcm9uZXJAOS4xLjAvbm9kZV9tb2R1bGVzL2Nyb25lci9kaXN0L2Nyb25lci5qcwp2YXIgY3JvbmVyX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoY3JvbmVyX2V4cG9ydHMsIHsKICBDcm9uOiAoKSA9PiBSMiwKICBDcm9uRGF0ZTogKCkgPT4gZjMsCiAgQ3JvblBhdHRlcm46ICgpID0+IGQzLAogIHNjaGVkdWxlZEpvYnM6ICgpID0+IHkzCn0pOwpmdW5jdGlvbiBoMyhuMTMsIHQ5LCBlMTEsIHIxMSwgczksIGkxMSwgYTUsIGw2KSB7CiAgcmV0dXJuIGgzLmZyb21UWihoMy50cChuMTMsIHQ5LCBlMTEsIHIxMSwgczksIGkxMSwgYTUpLCBsNik7Cn0KZnVuY3Rpb24gRDIobjEzLCB0OSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKSB7CiAgbGV0IGUxMSA9IHQ5LnRvTG9jYWxlU3RyaW5nKCJlbi1VUyIsIHsgdGltZVpvbmU6IG4xMywgdGltZVpvbmVOYW1lOiAic2hvcnRPZmZzZXQiIH0pLnNwbGl0KCIgIikuc2xpY2UoLTEpWzBdLCByMTEgPSB0OS50b0xvY2FsZVN0cmluZygiZW4tVVMiKS5yZXBsYWNlKC9bXHUyMDJmXS8sICIgIik7CiAgcmV0dXJuIERhdGUucGFyc2UoYCR7cjExfSBHTVRgKSAtIERhdGUucGFyc2UoYCR7cjExfSAke2UxMX1gKTsKfQpmdW5jdGlvbiBrMihuMTMsIHQ5KSB7CiAgbGV0IGUxMSA9IG5ldyBEYXRlKERhdGUucGFyc2UobjEzKSk7CiAgaWYgKGlzTmFOKGUxMSkpIHRocm93IG5ldyBFcnJvcigibWluaXR6OiBJbnZhbGlkIElTTzg2MDEgcGFzc2VkIHRvIHBhcnNlci4iKTsKICBsZXQgcjExID0gbjEzLnN1YnN0cmluZyg5KTsKICByZXR1cm4gbjEzLmluY2x1ZGVzKCJaIikgfHwgcjExLmluY2x1ZGVzKCItIikgfHwgcjExLmluY2x1ZGVzKCIrIikgPyBoMy50cChlMTEuZ2V0VVRDRnVsbFllYXIoKSwgZTExLmdldFVUQ01vbnRoKCkgKyAxLCBlMTEuZ2V0VVRDRGF0ZSgpLCBlMTEuZ2V0VVRDSG91cnMoKSwgZTExLmdldFVUQ01pbnV0ZXMoKSwgZTExLmdldFVUQ1NlY29uZHMoKSwgIkV0Yy9VVEMiKSA6IGgzLnRwKGUxMS5nZXRGdWxsWWVhcigpLCBlMTEuZ2V0TW9udGgoKSArIDEsIGUxMS5nZXREYXRlKCksIGUxMS5nZXRIb3VycygpLCBlMTEuZ2V0TWludXRlcygpLCBlMTEuZ2V0U2Vjb25kcygpLCB0OSk7Cn0KZnVuY3Rpb24gTjIobjEzKSB7CiAgaWYgKG4xMyA9PT0gdm9pZCAwICYmIChuMTMgPSB7fSksIGRlbGV0ZSBuMTMubmFtZSwgbjEzLmxlZ2FjeU1vZGUgPSBuMTMubGVnYWN5TW9kZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IG4xMy5sZWdhY3lNb2RlLCBuMTMucGF1c2VkID0gbjEzLnBhdXNlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBuMTMucGF1c2VkLCBuMTMubWF4UnVucyA9IG4xMy5tYXhSdW5zID09PSB2b2lkIDAgPyAxIC8gMCA6IG4xMy5tYXhSdW5zLCBuMTMuY2F0Y2ggPSBuMTMuY2F0Y2ggPT09IHZvaWQgMCA/IGZhbHNlIDogbjEzLmNhdGNoLCBuMTMuaW50ZXJ2YWwgPSBuMTMuaW50ZXJ2YWwgPT09IHZvaWQgMCA/IDAgOiBwYXJzZUludChuMTMuaW50ZXJ2YWwudG9TdHJpbmcoKSwgMTApLCBuMTMudXRjT2Zmc2V0ID0gbjEzLnV0Y09mZnNldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyc2VJbnQobjEzLnV0Y09mZnNldC50b1N0cmluZygpLCAxMCksIG4xMy51bnJlZiA9IG4xMy51bnJlZiA9PT0gdm9pZCAwID8gZmFsc2UgOiBuMTMudW5yZWYsIG4xMy5zdGFydEF0ICYmIChuMTMuc3RhcnRBdCA9IG5ldyBmMyhuMTMuc3RhcnRBdCwgbjEzLnRpbWV6b25lKSksIG4xMy5zdG9wQXQgJiYgKG4xMy5zdG9wQXQgPSBuZXcgZjMobjEzLnN0b3BBdCwgbjEzLnRpbWV6b25lKSksIG4xMy5pbnRlcnZhbCAhPT0gbnVsbCkgewogICAgaWYgKGlzTmFOKG4xMy5pbnRlcnZhbCkpIHRocm93IG5ldyBFcnJvcigiQ3Jvbk9wdGlvbnM6IFN1cHBsaWVkIHZhbHVlIGZvciBpbnRlcnZhbCBpcyBub3QgYSBudW1iZXIiKTsKICAgIGlmIChuMTMuaW50ZXJ2YWwgPCAwKSB0aHJvdyBuZXcgRXJyb3IoIkNyb25PcHRpb25zOiBTdXBwbGllZCB2YWx1ZSBmb3IgaW50ZXJ2YWwgY2FuIG5vdCBiZSBuZWdhdGl2ZSIpOwogIH0KICBpZiAobjEzLnV0Y09mZnNldCAhPT0gdm9pZCAwKSB7CiAgICBpZiAoaXNOYU4objEzLnV0Y09mZnNldCkpIHRocm93IG5ldyBFcnJvcigiQ3Jvbk9wdGlvbnM6IEludmFsaWQgdmFsdWUgcGFzc2VkIGZvciB1dGNPZmZzZXQsIHNob3VsZCBiZSBudW1iZXIgcmVwcmVzZW50aW5nIG1pbnV0ZXMgb2Zmc2V0IGZyb20gVVRDLiIpOwogICAgaWYgKG4xMy51dGNPZmZzZXQgPCAtODcwIHx8IG4xMy51dGNPZmZzZXQgPiA4NzApIHRocm93IG5ldyBFcnJvcigiQ3Jvbk9wdGlvbnM6IHV0Y09mZnNldCBvdXQgb2YgYm91bmRzLiIpOwogICAgaWYgKG4xMy51dGNPZmZzZXQgIT09IHZvaWQgMCAmJiBuMTMudGltZXpvbmUpIHRocm93IG5ldyBFcnJvcigiQ3Jvbk9wdGlvbnM6IENvbWJpbmluZyAndXRjT2Zmc2V0JyB3aXRoICd0aW1lem9uZScgaXMgbm90IGFsbG93ZWQuIik7CiAgfQogIGlmIChuMTMudW5yZWYgIT09IHRydWUgJiYgbjEzLnVucmVmICE9PSBmYWxzZSkgdGhyb3cgbmV3IEVycm9yKCJDcm9uT3B0aW9uczogVW5yZWYgc2hvdWxkIGJlIGVpdGhlciB0cnVlLCBmYWxzZSBvciB1bmRlZmluZWQoZmFsc2UpLiIpOwogIHJldHVybiBuMTM7Cn0KZnVuY3Rpb24gZzIobjEzKSB7CiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuMTMpID09PSAiW29iamVjdCBGdW5jdGlvbl0iIHx8IHR5cGVvZiBuMTMgPT0gImZ1bmN0aW9uIiB8fCBuMTMgaW5zdGFuY2VvZiBGdW5jdGlvbjsKfQpmdW5jdGlvbiBTMyhuMTMpIHsKICByZXR1cm4gZzIobjEzKTsKfQpmdW5jdGlvbiBQMihuMTMpIHsKICB0eXBlb2YgRGVubyA8ICJ1IiAmJiB0eXBlb2YgRGVuby51bnJlZlRpbWVyIDwgInUiID8gRGVuby51bnJlZlRpbWVyKG4xMykgOiBuMTMgJiYgdHlwZW9mIG4xMy51bnJlZiA8ICJ1IiAmJiBuMTMudW5yZWYoKTsKfQp2YXIgYjMsIHAzLCB2MiwgZDMsIE8sIG0yLCBmMywgXzIsIHkzLCBSMjsKdmFyIGluaXRfY3JvbmVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vY3JvbmVyQDkuMS4wL25vZGVfbW9kdWxlcy9jcm9uZXIvZGlzdC9jcm9uZXIuanMiKCkgewogICAgaDMuZnJvbVRaSVNPID0gKG4xMywgdDksIGUxMSkgPT4gaDMuZnJvbVRaKGsyKG4xMywgdDkpLCBlMTEpOwogICAgaDMuZnJvbVRaID0gZnVuY3Rpb24objEzLCB0OSkgewogICAgICBsZXQgZTExID0gbmV3IERhdGUoRGF0ZS5VVEMobjEzLnksIG4xMy5tIC0gMSwgbjEzLmQsIG4xMy5oLCBuMTMuaSwgbjEzLnMpKSwgcjExID0gRDIobjEzLnR6LCBlMTEpLCBzOSA9IG5ldyBEYXRlKGUxMS5nZXRUaW1lKCkgLSByMTEpLCBpMTEgPSBEMihuMTMudHosIHM5KTsKICAgICAgaWYgKGkxMSAtIHIxMSA9PT0gMCkgcmV0dXJuIHM5OwogICAgICB7CiAgICAgICAgbGV0IGE1ID0gbmV3IERhdGUoZTExLmdldFRpbWUoKSAtIGkxMSksIGw2ID0gRDIobjEzLnR6LCBhNSk7CiAgICAgICAgaWYgKGw2IC0gaTExID09PSAwKSByZXR1cm4gYTU7CiAgICAgICAgaWYgKCF0OSAmJiBsNiAtIGkxMSA+IDApIHJldHVybiBhNTsKICAgICAgICBpZiAodDkpIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBkYXRlIHBhc3NlZCB0byBmcm9tVFooKSIpOwogICAgICAgIHJldHVybiBzOTsKICAgICAgfQogICAgfTsKICAgIGgzLnRvVFogPSBmdW5jdGlvbihuMTMsIHQ5KSB7CiAgICAgIGxldCBlMTEgPSBuMTMudG9Mb2NhbGVTdHJpbmcoImVuLVVTIiwgeyB0aW1lWm9uZTogdDkgfSkucmVwbGFjZSgvW1x1MjAyZl0vLCAiICIpLCByMTEgPSBuZXcgRGF0ZShlMTEpOwogICAgICByZXR1cm4geyB5OiByMTEuZ2V0RnVsbFllYXIoKSwgbTogcjExLmdldE1vbnRoKCkgKyAxLCBkOiByMTEuZ2V0RGF0ZSgpLCBoOiByMTEuZ2V0SG91cnMoKSwgaTogcjExLmdldE1pbnV0ZXMoKSwgczogcjExLmdldFNlY29uZHMoKSwgdHo6IHQ5IH07CiAgICB9OwogICAgaDMudHAgPSAobjEzLCB0OSwgZTExLCByMTEsIHM5LCBpMTEsIGE1KSA9PiAoeyB5OiBuMTMsIG06IHQ5LCBkOiBlMTEsIGg6IHIxMSwgaTogczksIHM6IGkxMSwgdHo6IGE1IH0pOwogICAgaDMubWluaXR6ID0gaDM7CiAgICBiMyA9IDMyLCBwMyA9IDMxIHwgYjMsIHYyID0gWzEsIDIsIDQsIDgsIDE2XSwgZDMgPSBjbGFzcyB7CiAgICAgIHBhdHRlcm47CiAgICAgIHRpbWV6b25lOwogICAgICBzZWNvbmQ7CiAgICAgIG1pbnV0ZTsKICAgICAgaG91cjsKICAgICAgZGF5OwogICAgICBtb250aDsKICAgICAgZGF5T2ZXZWVrOwogICAgICBsYXN0RGF5T2ZNb250aDsKICAgICAgc3RhckRPTTsKICAgICAgc3RhckRPVzsKICAgICAgY29uc3RydWN0b3IodDksIGUxMSkgewogICAgICAgIHRoaXMucGF0dGVybiA9IHQ5LCB0aGlzLnRpbWV6b25lID0gZTExLCB0aGlzLnNlY29uZCA9IEFycmF5KDYwKS5maWxsKDApLCB0aGlzLm1pbnV0ZSA9IEFycmF5KDYwKS5maWxsKDApLCB0aGlzLmhvdXIgPSBBcnJheSgyNCkuZmlsbCgwKSwgdGhpcy5kYXkgPSBBcnJheSgzMSkuZmlsbCgwKSwgdGhpcy5tb250aCA9IEFycmF5KDEyKS5maWxsKDApLCB0aGlzLmRheU9mV2VlayA9IEFycmF5KDcpLmZpbGwoMCksIHRoaXMubGFzdERheU9mTW9udGggPSBmYWxzZSwgdGhpcy5zdGFyRE9NID0gZmFsc2UsIHRoaXMuc3RhckRPVyA9IGZhbHNlLCB0aGlzLnBhcnNlKCk7CiAgICAgIH0KICAgICAgcGFyc2UoKSB7CiAgICAgICAgaWYgKCEodHlwZW9mIHRoaXMucGF0dGVybiA9PSAic3RyaW5nIiB8fCB0aGlzLnBhdHRlcm4gaW5zdGFuY2VvZiBTdHJpbmcpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogUGF0dGVybiBoYXMgdG8gYmUgb2YgdHlwZSBzdHJpbmcuIik7CiAgICAgICAgdGhpcy5wYXR0ZXJuLmluZGV4T2YoIkAiKSA+PSAwICYmICh0aGlzLnBhdHRlcm4gPSB0aGlzLmhhbmRsZU5pY2tuYW1lcyh0aGlzLnBhdHRlcm4pLnRyaW0oKSk7CiAgICAgICAgbGV0IHQ5ID0gdGhpcy5wYXR0ZXJuLnJlcGxhY2UoL1xzKy9nLCAiICIpLnNwbGl0KCIgIik7CiAgICAgICAgaWYgKHQ5Lmxlbmd0aCA8IDUgfHwgdDkubGVuZ3RoID4gNikgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IGludmFsaWQgY29uZmlndXJhdGlvbiBmb3JtYXQgKCciICsgdGhpcy5wYXR0ZXJuICsgIicpLCBleGFjdGx5IGZpdmUgb3Igc2l4IHNwYWNlIHNlcGFyYXRlZCBwYXJ0cyBhcmUgcmVxdWlyZWQuIik7CiAgICAgICAgaWYgKHQ5Lmxlbmd0aCA9PT0gNSAmJiB0OS51bnNoaWZ0KCIwIiksIHQ5WzNdLmluZGV4T2YoIkwiKSA+PSAwICYmICh0OVszXSA9IHQ5WzNdLnJlcGxhY2UoIkwiLCAiIiksIHRoaXMubGFzdERheU9mTW9udGggPSB0cnVlKSwgdDlbM10gPT0gIioiICYmICh0aGlzLnN0YXJET00gPSB0cnVlKSwgdDlbNF0ubGVuZ3RoID49IDMgJiYgKHQ5WzRdID0gdGhpcy5yZXBsYWNlQWxwaGFNb250aHModDlbNF0pKSwgdDlbNV0ubGVuZ3RoID49IDMgJiYgKHQ5WzVdID0gdGhpcy5yZXBsYWNlQWxwaGFEYXlzKHQ5WzVdKSksIHQ5WzVdID09ICIqIiAmJiAodGhpcy5zdGFyRE9XID0gdHJ1ZSksIHRoaXMucGF0dGVybi5pbmRleE9mKCI/IikgPj0gMCkgewogICAgICAgICAgbGV0IGUxMSA9IG5ldyBmMygvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSwgdGhpcy50aW1lem9uZSkuZ2V0RGF0ZSh0cnVlKTsKICAgICAgICAgIHQ5WzBdID0gdDlbMF0ucmVwbGFjZSgiPyIsIGUxMS5nZXRTZWNvbmRzKCkudG9TdHJpbmcoKSksIHQ5WzFdID0gdDlbMV0ucmVwbGFjZSgiPyIsIGUxMS5nZXRNaW51dGVzKCkudG9TdHJpbmcoKSksIHQ5WzJdID0gdDlbMl0ucmVwbGFjZSgiPyIsIGUxMS5nZXRIb3VycygpLnRvU3RyaW5nKCkpLCB0aGlzLnN0YXJET00gfHwgKHQ5WzNdID0gdDlbM10ucmVwbGFjZSgiPyIsIGUxMS5nZXREYXRlKCkudG9TdHJpbmcoKSkpLCB0OVs0XSA9IHQ5WzRdLnJlcGxhY2UoIj8iLCAoZTExLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpKSwgdGhpcy5zdGFyRE9XIHx8ICh0OVs1XSA9IHQ5WzVdLnJlcGxhY2UoIj8iLCBlMTEuZ2V0RGF5KCkudG9TdHJpbmcoKSkpOwogICAgICAgIH0KICAgICAgICB0aGlzLnRocm93QXRJbGxlZ2FsQ2hhcmFjdGVycyh0OSksIHRoaXMucGFydFRvQXJyYXkoInNlY29uZCIsIHQ5WzBdLCAwLCAxKSwgdGhpcy5wYXJ0VG9BcnJheSgibWludXRlIiwgdDlbMV0sIDAsIDEpLCB0aGlzLnBhcnRUb0FycmF5KCJob3VyIiwgdDlbMl0sIDAsIDEpLCB0aGlzLnBhcnRUb0FycmF5KCJkYXkiLCB0OVszXSwgLTEsIDEpLCB0aGlzLnBhcnRUb0FycmF5KCJtb250aCIsIHQ5WzRdLCAtMSwgMSksIHRoaXMucGFydFRvQXJyYXkoImRheU9mV2VlayIsIHQ5WzVdLCAwLCBwMyksIHRoaXMuZGF5T2ZXZWVrWzddICYmICh0aGlzLmRheU9mV2Vla1swXSA9IHRoaXMuZGF5T2ZXZWVrWzddKTsKICAgICAgfQogICAgICBwYXJ0VG9BcnJheSh0OSwgZTExLCByMTEsIHM5KSB7CiAgICAgICAgbGV0IGkxMSA9IHRoaXNbdDldLCBhNSA9IHQ5ID09PSAiZGF5IiAmJiB0aGlzLmxhc3REYXlPZk1vbnRoOwogICAgICAgIGlmIChlMTEgPT09ICIiICYmICFhNSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IGNvbmZpZ3VyYXRpb24gZW50cnkgIiArIHQ5ICsgIiAoIiArIGUxMSArICIpIGlzIGVtcHR5LCBjaGVjayBmb3IgdHJhaWxpbmcgc3BhY2VzLiIpOwogICAgICAgIGlmIChlMTEgPT09ICIqIikgcmV0dXJuIGkxMS5maWxsKHM5KTsKICAgICAgICBsZXQgbDYgPSBlMTEuc3BsaXQoIiwiKTsKICAgICAgICBpZiAobDYubGVuZ3RoID4gMSkgZm9yIChsZXQgbzEzID0gMDsgbzEzIDwgbDYubGVuZ3RoOyBvMTMrKykgdGhpcy5wYXJ0VG9BcnJheSh0OSwgbDZbbzEzXSwgcjExLCBzOSk7CiAgICAgICAgZWxzZSBlMTEuaW5kZXhPZigiLSIpICE9PSAtMSAmJiBlMTEuaW5kZXhPZigiLyIpICE9PSAtMSA/IHRoaXMuaGFuZGxlUmFuZ2VXaXRoU3RlcHBpbmcoZTExLCB0OSwgcjExLCBzOSkgOiBlMTEuaW5kZXhPZigiLSIpICE9PSAtMSA/IHRoaXMuaGFuZGxlUmFuZ2UoZTExLCB0OSwgcjExLCBzOSkgOiBlMTEuaW5kZXhPZigiLyIpICE9PSAtMSA/IHRoaXMuaGFuZGxlU3RlcHBpbmcoZTExLCB0OSwgcjExLCBzOSkgOiBlMTEgIT09ICIiICYmIHRoaXMuaGFuZGxlTnVtYmVyKGUxMSwgdDksIHIxMSwgczkpOwogICAgICB9CiAgICAgIHRocm93QXRJbGxlZ2FsQ2hhcmFjdGVycyh0OSkgewogICAgICAgIGZvciAobGV0IGUxMSA9IDA7IGUxMSA8IHQ5Lmxlbmd0aDsgZTExKyspIGlmICgoZTExID09PSA1ID8gL1teLyowLTksXC0jTF0rLyA6IC9bXi8qMC05LC1dKy8pLnRlc3QodDlbZTExXSkpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBjb25maWd1cmF0aW9uIGVudHJ5ICIgKyBlMTEgKyAiICgiICsgdDlbZTExXSArICIpIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVycy4iKTsKICAgICAgfQogICAgICBoYW5kbGVOdW1iZXIodDksIGUxMSwgcjExLCBzOSkgewogICAgICAgIGxldCBpMTEgPSB0aGlzLmV4dHJhY3ROdGgodDksIGUxMSksIGE1ID0gcGFyc2VJbnQoaTExWzBdLCAxMCkgKyByMTE7CiAgICAgICAgaWYgKGlzTmFOKGE1KSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46ICIgKyBlMTEgKyAiIGlzIG5vdCBhIG51bWJlcjogJyIgKyB0OSArICInIik7CiAgICAgICAgdGhpcy5zZXRQYXJ0KGUxMSwgYTUsIGkxMVsxXSB8fCBzOSk7CiAgICAgIH0KICAgICAgc2V0UGFydCh0OSwgZTExLCByMTEpIHsKICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCB0OSkpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBJbnZhbGlkIHBhcnQgc3BlY2lmaWVkOiAiICsgdDkpOwogICAgICAgIGlmICh0OSA9PT0gImRheU9mV2VlayIpIHsKICAgICAgICAgIGlmIChlMTEgPT09IDcgJiYgKGUxMSA9IDApLCBlMTEgPCAwIHx8IGUxMSA+IDYpIHRocm93IG5ldyBSYW5nZUVycm9yKCJDcm9uUGF0dGVybjogSW52YWxpZCB2YWx1ZSBmb3IgZGF5T2ZXZWVrOiAiICsgZTExKTsKICAgICAgICAgIHRoaXMuc2V0TnRoV2Vla2RheU9mTW9udGgoZTExLCByMTEpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodDkgPT09ICJzZWNvbmQiIHx8IHQ5ID09PSAibWludXRlIikgewogICAgICAgICAgaWYgKGUxMSA8IDAgfHwgZTExID49IDYwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQ3JvblBhdHRlcm46IEludmFsaWQgdmFsdWUgZm9yICIgKyB0OSArICI6ICIgKyBlMTEpOwogICAgICAgIH0gZWxzZSBpZiAodDkgPT09ICJob3VyIikgewogICAgICAgICAgaWYgKGUxMSA8IDAgfHwgZTExID49IDI0KSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQ3JvblBhdHRlcm46IEludmFsaWQgdmFsdWUgZm9yICIgKyB0OSArICI6ICIgKyBlMTEpOwogICAgICAgIH0gZWxzZSBpZiAodDkgPT09ICJkYXkiKSB7CiAgICAgICAgICBpZiAoZTExIDwgMCB8fCBlMTEgPj0gMzEpIHRocm93IG5ldyBSYW5nZUVycm9yKCJDcm9uUGF0dGVybjogSW52YWxpZCB2YWx1ZSBmb3IgIiArIHQ5ICsgIjogIiArIGUxMSk7CiAgICAgICAgfSBlbHNlIGlmICh0OSA9PT0gIm1vbnRoIiAmJiAoZTExIDwgMCB8fCBlMTEgPj0gMTIpKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQ3JvblBhdHRlcm46IEludmFsaWQgdmFsdWUgZm9yICIgKyB0OSArICI6ICIgKyBlMTEpOwogICAgICAgIHRoaXNbdDldW2UxMV0gPSByMTE7CiAgICAgIH0KICAgICAgaGFuZGxlUmFuZ2VXaXRoU3RlcHBpbmcodDksIGUxMSwgcjExLCBzOSkgewogICAgICAgIGxldCBpMTEgPSB0aGlzLmV4dHJhY3ROdGgodDksIGUxMSksIGE1ID0gaTExWzBdLm1hdGNoKC9eKFxkKyktKFxkKylcLyhcZCspJC8pOwogICAgICAgIGlmIChhNSA9PT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgaWxsZWdhbCByYW5nZSB3aXRoIHN0ZXBwaW5nOiAnIiArIHQ5ICsgIiciKTsKICAgICAgICBsZXQgWywgbDYsIG8xMywgdTddID0gYTUsIGMxMSA9IHBhcnNlSW50KGw2LCAxMCkgKyByMTEsIHczID0gcGFyc2VJbnQobzEzLCAxMCkgKyByMTEsIEMzID0gcGFyc2VJbnQodTcsIDEwKTsKICAgICAgICBpZiAoaXNOYU4oYzExKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgaWxsZWdhbCBsb3dlciByYW5nZSAoTmFOKSIpOwogICAgICAgIGlmIChpc05hTih3MykpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIGlsbGVnYWwgdXBwZXIgcmFuZ2UgKE5hTikiKTsKICAgICAgICBpZiAoaXNOYU4oQzMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIHN0ZXBwaW5nOiAoTmFOKSIpOwogICAgICAgIGlmIChDMyA9PT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgaWxsZWdhbCBzdGVwcGluZzogMCIpOwogICAgICAgIGlmIChDMyA+IHRoaXNbZTExXS5sZW5ndGgpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIHN0ZXBzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gbWF4aW11bSB2YWx1ZSBvZiBwYXJ0ICgiICsgdGhpc1tlMTFdLmxlbmd0aCArICIpIik7CiAgICAgICAgaWYgKGMxMSA+IHczKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogRnJvbSB2YWx1ZSBpcyBsYXJnZXIgdGhhbiB0byB2YWx1ZTogJyIgKyB0OSArICInIik7CiAgICAgICAgZm9yIChsZXQgVDMgPSBjMTE7IFQzIDw9IHczOyBUMyArPSBDMykgdGhpcy5zZXRQYXJ0KGUxMSwgVDMsIGkxMVsxXSB8fCBzOSk7CiAgICAgIH0KICAgICAgZXh0cmFjdE50aCh0OSwgZTExKSB7CiAgICAgICAgbGV0IHIxMSA9IHQ5LCBzOTsKICAgICAgICBpZiAocjExLmluY2x1ZGVzKCIjIikpIHsKICAgICAgICAgIGlmIChlMTEgIT09ICJkYXlPZldlZWsiKSB0aHJvdyBuZXcgRXJyb3IoIkNyb25QYXR0ZXJuOiBudGggKCMpIG9ubHkgYWxsb3dlZCBpbiBkYXktb2Ytd2VlayBmaWVsZCIpOwogICAgICAgICAgczkgPSByMTEuc3BsaXQoIiMiKVsxXSwgcjExID0gcjExLnNwbGl0KCIjIilbMF07CiAgICAgICAgfQogICAgICAgIHJldHVybiBbcjExLCBzOV07CiAgICAgIH0KICAgICAgaGFuZGxlUmFuZ2UodDksIGUxMSwgcjExLCBzOSkgewogICAgICAgIGxldCBpMTEgPSB0aGlzLmV4dHJhY3ROdGgodDksIGUxMSksIGE1ID0gaTExWzBdLnNwbGl0KCItIik7CiAgICAgICAgaWYgKGE1Lmxlbmd0aCAhPT0gMikgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgaWxsZWdhbCByYW5nZTogJyIgKyB0OSArICInIik7CiAgICAgICAgbGV0IGw2ID0gcGFyc2VJbnQoYTVbMF0sIDEwKSArIHIxMSwgbzEzID0gcGFyc2VJbnQoYTVbMV0sIDEwKSArIHIxMTsKICAgICAgICBpZiAoaXNOYU4obDYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIGxvd2VyIHJhbmdlIChOYU4pIik7CiAgICAgICAgaWYgKGlzTmFOKG8xMykpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIGlsbGVnYWwgdXBwZXIgcmFuZ2UgKE5hTikiKTsKICAgICAgICBpZiAobDYgPiBvMTMpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBGcm9tIHZhbHVlIGlzIGxhcmdlciB0aGFuIHRvIHZhbHVlOiAnIiArIHQ5ICsgIiciKTsKICAgICAgICBmb3IgKGxldCB1NyA9IGw2OyB1NyA8PSBvMTM7IHU3KyspIHRoaXMuc2V0UGFydChlMTEsIHU3LCBpMTFbMV0gfHwgczkpOwogICAgICB9CiAgICAgIGhhbmRsZVN0ZXBwaW5nKHQ5LCBlMTEsIHIxMSwgczkpIHsKICAgICAgICBsZXQgaTExID0gdGhpcy5leHRyYWN0TnRoKHQ5LCBlMTEpLCBhNSA9IGkxMVswXS5zcGxpdCgiLyIpOwogICAgICAgIGlmIChhNS5sZW5ndGggIT09IDIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIGlsbGVnYWwgc3RlcHBpbmc6ICciICsgdDkgKyAiJyIpOwogICAgICAgIGE1WzBdID09PSAiIiAmJiAoYTVbMF0gPSAiKiIpOwogICAgICAgIGxldCBsNiA9IDA7CiAgICAgICAgYTVbMF0gIT09ICIqIiAmJiAobDYgPSBwYXJzZUludChhNVswXSwgMTApICsgcjExKTsKICAgICAgICBsZXQgbzEzID0gcGFyc2VJbnQoYTVbMV0sIDEwKTsKICAgICAgICBpZiAoaXNOYU4obzEzKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgaWxsZWdhbCBzdGVwcGluZzogKE5hTikiKTsKICAgICAgICBpZiAobzEzID09PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIHN0ZXBwaW5nOiAwIik7CiAgICAgICAgaWYgKG8xMyA+IHRoaXNbZTExXS5sZW5ndGgpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIG1heCBzdGVwcyBmb3IgcGFydCBpcyAoIiArIHRoaXNbZTExXS5sZW5ndGggKyAiKSIpOwogICAgICAgIGZvciAobGV0IHU3ID0gbDY7IHU3IDwgdGhpc1tlMTFdLmxlbmd0aDsgdTcgKz0gbzEzKSB0aGlzLnNldFBhcnQoZTExLCB1NywgaTExWzFdIHx8IHM5KTsKICAgICAgfQogICAgICByZXBsYWNlQWxwaGFEYXlzKHQ5KSB7CiAgICAgICAgcmV0dXJuIHQ5LnJlcGxhY2UoLy1zdW4vZ2ksICItNyIpLnJlcGxhY2UoL3N1bi9naSwgIjAiKS5yZXBsYWNlKC9tb24vZ2ksICIxIikucmVwbGFjZSgvdHVlL2dpLCAiMiIpLnJlcGxhY2UoL3dlZC9naSwgIjMiKS5yZXBsYWNlKC90aHUvZ2ksICI0IikucmVwbGFjZSgvZnJpL2dpLCAiNSIpLnJlcGxhY2UoL3NhdC9naSwgIjYiKTsKICAgICAgfQogICAgICByZXBsYWNlQWxwaGFNb250aHModDkpIHsKICAgICAgICByZXR1cm4gdDkucmVwbGFjZSgvamFuL2dpLCAiMSIpLnJlcGxhY2UoL2ZlYi9naSwgIjIiKS5yZXBsYWNlKC9tYXIvZ2ksICIzIikucmVwbGFjZSgvYXByL2dpLCAiNCIpLnJlcGxhY2UoL21heS9naSwgIjUiKS5yZXBsYWNlKC9qdW4vZ2ksICI2IikucmVwbGFjZSgvanVsL2dpLCAiNyIpLnJlcGxhY2UoL2F1Zy9naSwgIjgiKS5yZXBsYWNlKC9zZXAvZ2ksICI5IikucmVwbGFjZSgvb2N0L2dpLCAiMTAiKS5yZXBsYWNlKC9ub3YvZ2ksICIxMSIpLnJlcGxhY2UoL2RlYy9naSwgIjEyIik7CiAgICAgIH0KICAgICAgaGFuZGxlTmlja25hbWVzKHQ5KSB7CiAgICAgICAgbGV0IGUxMSA9IHQ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogICAgICAgIHJldHVybiBlMTEgPT09ICJAeWVhcmx5IiB8fCBlMTEgPT09ICJAYW5udWFsbHkiID8gIjAgMCAxIDEgKiIgOiBlMTEgPT09ICJAbW9udGhseSIgPyAiMCAwIDEgKiAqIiA6IGUxMSA9PT0gIkB3ZWVrbHkiID8gIjAgMCAqICogMCIgOiBlMTEgPT09ICJAZGFpbHkiID8gIjAgMCAqICogKiIgOiBlMTEgPT09ICJAaG91cmx5IiA/ICIwICogKiAqICoiIDogdDk7CiAgICAgIH0KICAgICAgc2V0TnRoV2Vla2RheU9mTW9udGgodDksIGUxMSkgewogICAgICAgIGlmICh0eXBlb2YgZTExICE9ICJudW1iZXIiICYmIGUxMSA9PT0gIkwiKSB0aGlzLmRheU9mV2Vla1t0OV0gPSB0aGlzLmRheU9mV2Vla1t0OV0gfCBiMzsKICAgICAgICBlbHNlIGlmIChlMTEgPT09IHAzKSB0aGlzLmRheU9mV2Vla1t0OV0gPSBwMzsKICAgICAgICBlbHNlIGlmIChlMTEgPCA2ICYmIGUxMSA+IDApIHRoaXMuZGF5T2ZXZWVrW3Q5XSA9IHRoaXMuZGF5T2ZXZWVrW3Q5XSB8IHYyW2UxMSAtIDFdOwogICAgICAgIGVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ3JvblBhdHRlcm46IG50aCB3ZWVrZGF5IG91dCBvZiByYW5nZSwgc2hvdWxkIGJlIDEtNSBvciBMLiBWYWx1ZTogJHtlMTF9LCBUeXBlOiAke3R5cGVvZiBlMTF9YCk7CiAgICAgIH0KICAgIH07CiAgICBPID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdLCBtMiA9IFtbIm1vbnRoIiwgInllYXIiLCAwXSwgWyJkYXkiLCAibW9udGgiLCAtMV0sIFsiaG91ciIsICJkYXkiLCAwXSwgWyJtaW51dGUiLCAiaG91ciIsIDBdLCBbInNlY29uZCIsICJtaW51dGUiLCAwXV0sIGYzID0gY2xhc3MgbjYgewogICAgICB0ejsKICAgICAgbXM7CiAgICAgIHNlY29uZDsKICAgICAgbWludXRlOwogICAgICBob3VyOwogICAgICBkYXk7CiAgICAgIG1vbnRoOwogICAgICB5ZWFyOwogICAgICBjb25zdHJ1Y3Rvcih0OSwgZTExKSB7CiAgICAgICAgaWYgKHRoaXMudHogPSBlMTEsIHQ5ICYmIHQ5IGluc3RhbmNlb2YgRGF0ZSkgaWYgKCFpc05hTih0OSkpIHRoaXMuZnJvbURhdGUodDkpOwogICAgICAgIGVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvbkRhdGU6IEludmFsaWQgZGF0ZSBwYXNzZWQgdG8gQ3JvbkRhdGUgY29uc3RydWN0b3IiKTsKICAgICAgICBlbHNlIGlmICh0OSA9PT0gdm9pZCAwKSB0aGlzLmZyb21EYXRlKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKTsKICAgICAgICBlbHNlIGlmICh0OSAmJiB0eXBlb2YgdDkgPT0gInN0cmluZyIpIHRoaXMuZnJvbVN0cmluZyh0OSk7CiAgICAgICAgZWxzZSBpZiAodDkgaW5zdGFuY2VvZiBuNikgdGhpcy5mcm9tQ3JvbkRhdGUodDkpOwogICAgICAgIGVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvbkRhdGU6IEludmFsaWQgdHlwZSAoIiArIHR5cGVvZiB0OSArICIpIHBhc3NlZCB0byBDcm9uRGF0ZSBjb25zdHJ1Y3RvciIpOwogICAgICB9CiAgICAgIGlzTnRoV2Vla2RheU9mTW9udGgodDksIGUxMSwgcjExLCBzOSkgewogICAgICAgIGxldCBhNSA9IG5ldyBEYXRlKERhdGUuVVRDKHQ5LCBlMTEsIHIxMSkpLmdldFVUQ0RheSgpLCBsNiA9IDA7CiAgICAgICAgZm9yIChsZXQgbzEzID0gMTsgbzEzIDw9IHIxMTsgbzEzKyspIG5ldyBEYXRlKERhdGUuVVRDKHQ5LCBlMTEsIG8xMykpLmdldFVUQ0RheSgpID09PSBhNSAmJiBsNisrOwogICAgICAgIGlmIChzOSAmIHAzICYmIHYyW2w2IC0gMV0gJiBzOSkgcmV0dXJuIHRydWU7CiAgICAgICAgaWYgKHM5ICYgYjMpIHsKICAgICAgICAgIGxldCBvMTMgPSBuZXcgRGF0ZShEYXRlLlVUQyh0OSwgZTExICsgMSwgMCkpLmdldFVUQ0RhdGUoKTsKICAgICAgICAgIGZvciAobGV0IHU3ID0gcjExICsgMTsgdTcgPD0gbzEzOyB1NysrKSBpZiAobmV3IERhdGUoRGF0ZS5VVEModDksIGUxMSwgdTcpKS5nZXRVVENEYXkoKSA9PT0gYTUpIHJldHVybiBmYWxzZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgZnJvbURhdGUodDkpIHsKICAgICAgICBpZiAodGhpcy50eiAhPT0gdm9pZCAwKSBpZiAodHlwZW9mIHRoaXMudHogPT0gIm51bWJlciIpIHRoaXMubXMgPSB0OS5nZXRVVENNaWxsaXNlY29uZHMoKSwgdGhpcy5zZWNvbmQgPSB0OS5nZXRVVENTZWNvbmRzKCksIHRoaXMubWludXRlID0gdDkuZ2V0VVRDTWludXRlcygpICsgdGhpcy50eiwgdGhpcy5ob3VyID0gdDkuZ2V0VVRDSG91cnMoKSwgdGhpcy5kYXkgPSB0OS5nZXRVVENEYXRlKCksIHRoaXMubW9udGggPSB0OS5nZXRVVENNb250aCgpLCB0aGlzLnllYXIgPSB0OS5nZXRVVENGdWxsWWVhcigpLCB0aGlzLmFwcGx5KCk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBsZXQgZTExID0gaDMudG9UWih0OSwgdGhpcy50eik7CiAgICAgICAgICB0aGlzLm1zID0gdDkuZ2V0TWlsbGlzZWNvbmRzKCksIHRoaXMuc2Vjb25kID0gZTExLnMsIHRoaXMubWludXRlID0gZTExLmksIHRoaXMuaG91ciA9IGUxMS5oLCB0aGlzLmRheSA9IGUxMS5kLCB0aGlzLm1vbnRoID0gZTExLm0gLSAxLCB0aGlzLnllYXIgPSBlMTEueTsKICAgICAgICB9CiAgICAgICAgZWxzZSB0aGlzLm1zID0gdDkuZ2V0TWlsbGlzZWNvbmRzKCksIHRoaXMuc2Vjb25kID0gdDkuZ2V0U2Vjb25kcygpLCB0aGlzLm1pbnV0ZSA9IHQ5LmdldE1pbnV0ZXMoKSwgdGhpcy5ob3VyID0gdDkuZ2V0SG91cnMoKSwgdGhpcy5kYXkgPSB0OS5nZXREYXRlKCksIHRoaXMubW9udGggPSB0OS5nZXRNb250aCgpLCB0aGlzLnllYXIgPSB0OS5nZXRGdWxsWWVhcigpOwogICAgICB9CiAgICAgIGZyb21Dcm9uRGF0ZSh0OSkgewogICAgICAgIHRoaXMudHogPSB0OS50eiwgdGhpcy55ZWFyID0gdDkueWVhciwgdGhpcy5tb250aCA9IHQ5Lm1vbnRoLCB0aGlzLmRheSA9IHQ5LmRheSwgdGhpcy5ob3VyID0gdDkuaG91ciwgdGhpcy5taW51dGUgPSB0OS5taW51dGUsIHRoaXMuc2Vjb25kID0gdDkuc2Vjb25kLCB0aGlzLm1zID0gdDkubXM7CiAgICAgIH0KICAgICAgYXBwbHkoKSB7CiAgICAgICAgaWYgKHRoaXMubW9udGggPiAxMSB8fCB0aGlzLmRheSA+IE9bdGhpcy5tb250aF0gfHwgdGhpcy5ob3VyID4gNTkgfHwgdGhpcy5taW51dGUgPiA1OSB8fCB0aGlzLnNlY29uZCA+IDU5IHx8IHRoaXMuaG91ciA8IDAgfHwgdGhpcy5taW51dGUgPCAwIHx8IHRoaXMuc2Vjb25kIDwgMCkgewogICAgICAgICAgbGV0IHQ5ID0gbmV3IERhdGUoRGF0ZS5VVEModGhpcy55ZWFyLCB0aGlzLm1vbnRoLCB0aGlzLmRheSwgdGhpcy5ob3VyLCB0aGlzLm1pbnV0ZSwgdGhpcy5zZWNvbmQsIHRoaXMubXMpKTsKICAgICAgICAgIHJldHVybiB0aGlzLm1zID0gdDkuZ2V0VVRDTWlsbGlzZWNvbmRzKCksIHRoaXMuc2Vjb25kID0gdDkuZ2V0VVRDU2Vjb25kcygpLCB0aGlzLm1pbnV0ZSA9IHQ5LmdldFVUQ01pbnV0ZXMoKSwgdGhpcy5ob3VyID0gdDkuZ2V0VVRDSG91cnMoKSwgdGhpcy5kYXkgPSB0OS5nZXRVVENEYXRlKCksIHRoaXMubW9udGggPSB0OS5nZXRVVENNb250aCgpLCB0aGlzLnllYXIgPSB0OS5nZXRVVENGdWxsWWVhcigpLCB0cnVlOwogICAgICAgIH0gZWxzZSByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgZnJvbVN0cmluZyh0OSkgewogICAgICAgIGlmICh0eXBlb2YgdGhpcy50eiA9PSAibnVtYmVyIikgewogICAgICAgICAgbGV0IGUxMSA9IGgzLmZyb21UWklTTyh0OSk7CiAgICAgICAgICB0aGlzLm1zID0gZTExLmdldFVUQ01pbGxpc2Vjb25kcygpLCB0aGlzLnNlY29uZCA9IGUxMS5nZXRVVENTZWNvbmRzKCksIHRoaXMubWludXRlID0gZTExLmdldFVUQ01pbnV0ZXMoKSwgdGhpcy5ob3VyID0gZTExLmdldFVUQ0hvdXJzKCksIHRoaXMuZGF5ID0gZTExLmdldFVUQ0RhdGUoKSwgdGhpcy5tb250aCA9IGUxMS5nZXRVVENNb250aCgpLCB0aGlzLnllYXIgPSBlMTEuZ2V0VVRDRnVsbFllYXIoKSwgdGhpcy5hcHBseSgpOwogICAgICAgIH0gZWxzZSByZXR1cm4gdGhpcy5mcm9tRGF0ZShoMy5mcm9tVFpJU08odDksIHRoaXMudHopKTsKICAgICAgfQogICAgICBmaW5kTmV4dCh0OSwgZTExLCByMTEsIHM5KSB7CiAgICAgICAgbGV0IGkxMSA9IHRoaXNbZTExXSwgYTU7CiAgICAgICAgcjExLmxhc3REYXlPZk1vbnRoICYmICh0aGlzLm1vbnRoICE9PSAxID8gYTUgPSBPW3RoaXMubW9udGhdIDogYTUgPSBuZXcgRGF0ZShEYXRlLlVUQyh0aGlzLnllYXIsIHRoaXMubW9udGggKyAxLCAwLCAwLCAwLCAwLCAwKSkuZ2V0VVRDRGF0ZSgpKTsKICAgICAgICBsZXQgbDYgPSAhcjExLnN0YXJET1cgJiYgZTExID09ICJkYXkiID8gbmV3IERhdGUoRGF0ZS5VVEModGhpcy55ZWFyLCB0aGlzLm1vbnRoLCAxLCAwLCAwLCAwLCAwKSkuZ2V0VVRDRGF5KCkgOiB2b2lkIDA7CiAgICAgICAgZm9yIChsZXQgbzEzID0gdGhpc1tlMTFdICsgczk7IG8xMyA8IHIxMVtlMTFdLmxlbmd0aDsgbzEzKyspIHsKICAgICAgICAgIGxldCB1NyA9IHIxMVtlMTFdW28xM107CiAgICAgICAgICBpZiAoZTExID09PSAiZGF5IiAmJiByMTEubGFzdERheU9mTW9udGggJiYgbzEzIC0gczkgPT0gYTUgJiYgKHU3ID0gMSksIGUxMSA9PT0gImRheSIgJiYgIXIxMS5zdGFyRE9XKSB7CiAgICAgICAgICAgIGxldCBjMTEgPSByMTEuZGF5T2ZXZWVrWyhsNiArIChvMTMgLSBzOSAtIDEpKSAlIDddOwogICAgICAgICAgICBpZiAoYzExICYmIGMxMSAmIHAzKSBjMTEgPSB0aGlzLmlzTnRoV2Vla2RheU9mTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoLCBvMTMgLSBzOSwgYzExKSA/IDEgOiAwOwogICAgICAgICAgICBlbHNlIGlmIChjMTEpIHRocm93IG5ldyBFcnJvcihgQ3JvbkRhdGU6IEludmFsaWQgdmFsdWUgZm9yIGRheU9mV2VlayBlbmNvdW50ZXJlZC4gJHtjMTF9YCk7CiAgICAgICAgICAgIHQ5LmxlZ2FjeU1vZGUgJiYgIXIxMS5zdGFyRE9NID8gdTcgPSB1NyB8fCBjMTEgOiB1NyA9IHU3ICYmIGMxMTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh1NykgcmV0dXJuIHRoaXNbZTExXSA9IG8xMyAtIHM5LCBpMTEgIT09IHRoaXNbZTExXSA/IDIgOiAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMzsKICAgICAgfQogICAgICByZWN1cnNlKHQ5LCBlMTEsIHIxMSkgewogICAgICAgIGxldCBzOSA9IHRoaXMuZmluZE5leHQoZTExLCBtMltyMTFdWzBdLCB0OSwgbTJbcjExXVsyXSk7CiAgICAgICAgaWYgKHM5ID4gMSkgewogICAgICAgICAgbGV0IGkxMSA9IHIxMSArIDE7CiAgICAgICAgICBmb3IgKDsgaTExIDwgbTIubGVuZ3RoOyApIHRoaXNbbTJbaTExXVswXV0gPSAtbTJbaTExXVsyXSwgaTExKys7CiAgICAgICAgICBpZiAoczkgPT09IDMpIHJldHVybiB0aGlzW20yW3IxMV1bMV1dKyssIHRoaXNbbTJbcjExXVswXV0gPSAtbTJbcjExXVsyXSwgdGhpcy5hcHBseSgpLCB0aGlzLnJlY3Vyc2UodDksIGUxMSwgMCk7CiAgICAgICAgICBpZiAodGhpcy5hcHBseSgpKSByZXR1cm4gdGhpcy5yZWN1cnNlKHQ5LCBlMTEsIHIxMSAtIDEpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcjExICs9IDEsIHIxMSA+PSBtMi5sZW5ndGggPyB0aGlzIDogdGhpcy55ZWFyID49IDNlMyA/IG51bGwgOiB0aGlzLnJlY3Vyc2UodDksIGUxMSwgcjExKTsKICAgICAgfQogICAgICBpbmNyZW1lbnQodDksIGUxMSwgcjExKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2Vjb25kICs9IGUxMS5pbnRlcnZhbCAhPT0gdm9pZCAwICYmIGUxMS5pbnRlcnZhbCA+IDEgJiYgcjExID8gZTExLmludGVydmFsIDogMSwgdGhpcy5tcyA9IDAsIHRoaXMuYXBwbHkoKSwgdGhpcy5yZWN1cnNlKHQ5LCBlMTEsIDApOwogICAgICB9CiAgICAgIGdldERhdGUodDkpIHsKICAgICAgICByZXR1cm4gdDkgfHwgdGhpcy50eiA9PT0gdm9pZCAwID8gbmV3IERhdGUodGhpcy55ZWFyLCB0aGlzLm1vbnRoLCB0aGlzLmRheSwgdGhpcy5ob3VyLCB0aGlzLm1pbnV0ZSwgdGhpcy5zZWNvbmQsIHRoaXMubXMpIDogdHlwZW9mIHRoaXMudHogPT0gIm51bWJlciIgPyBuZXcgRGF0ZShEYXRlLlVUQyh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF5LCB0aGlzLmhvdXIsIHRoaXMubWludXRlIC0gdGhpcy50eiwgdGhpcy5zZWNvbmQsIHRoaXMubXMpKSA6IGgzLmZyb21UWihoMy50cCh0aGlzLnllYXIsIHRoaXMubW9udGggKyAxLCB0aGlzLmRheSwgdGhpcy5ob3VyLCB0aGlzLm1pbnV0ZSwgdGhpcy5zZWNvbmQsIHRoaXMudHopLCBmYWxzZSk7CiAgICAgIH0KICAgICAgZ2V0VGltZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXREYXRlKGZhbHNlKS5nZXRUaW1lKCk7CiAgICAgIH0KICAgIH07CiAgICBfMiA9IDMwICogMWUzLCB5MyA9IFtdLCBSMiA9IGNsYXNzIHsKICAgICAgbmFtZTsKICAgICAgb3B0aW9uczsKICAgICAgX3N0YXRlczsKICAgICAgZm47CiAgICAgIGNvbnN0cnVjdG9yKHQ5LCBlMTEsIHIxMSkgewogICAgICAgIGxldCBzOSwgaTExOwogICAgICAgIGlmIChnMihlMTEpKSBpMTEgPSBlMTE7CiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGUxMSA9PSAib2JqZWN0IikgczkgPSBlMTE7CiAgICAgICAgZWxzZSBpZiAoZTExICE9PSB2b2lkIDApIHRocm93IG5ldyBFcnJvcigiQ3JvbjogSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgZm9yIG9wdGlvbnNJbi4gU2hvdWxkIGJlIG9uZSBvZiBmdW5jdGlvbiwgb3Igb2JqZWN0IChvcHRpb25zKS4iKTsKICAgICAgICBpZiAoZzIocjExKSkgaTExID0gcjExOwogICAgICAgIGVsc2UgaWYgKHR5cGVvZiByMTEgPT0gIm9iamVjdCIpIHM5ID0gcjExOwogICAgICAgIGVsc2UgaWYgKHIxMSAhPT0gdm9pZCAwKSB0aHJvdyBuZXcgRXJyb3IoIkNyb246IEludmFsaWQgYXJndW1lbnQgcGFzc2VkIGZvciBmdW5jSW4uIFNob3VsZCBiZSBvbmUgb2YgZnVuY3Rpb24sIG9yIG9iamVjdCAob3B0aW9ucykuIik7CiAgICAgICAgaWYgKHRoaXMubmFtZSA9IHM5Py5uYW1lLCB0aGlzLm9wdGlvbnMgPSBOMihzOSksIHRoaXMuX3N0YXRlcyA9IHsga2lsbDogZmFsc2UsIGJsb2NraW5nOiBmYWxzZSwgcHJldmlvdXNSdW46IHZvaWQgMCwgY3VycmVudFJ1bjogdm9pZCAwLCBvbmNlOiB2b2lkIDAsIGN1cnJlbnRUaW1lb3V0OiB2b2lkIDAsIG1heFJ1bnM6IHM5ID8gczkubWF4UnVucyA6IHZvaWQgMCwgcGF1c2VkOiBzOSA/IHM5LnBhdXNlZCA6IGZhbHNlLCBwYXR0ZXJuOiBuZXcgZDMoIiogKiAqICogKiIpIH0sIHQ5ICYmICh0OSBpbnN0YW5jZW9mIERhdGUgfHwgdHlwZW9mIHQ5ID09ICJzdHJpbmciICYmIHQ5LmluZGV4T2YoIjoiKSA+IDApID8gdGhpcy5fc3RhdGVzLm9uY2UgPSBuZXcgZjModDksIHRoaXMub3B0aW9ucy50aW1lem9uZSB8fCB0aGlzLm9wdGlvbnMudXRjT2Zmc2V0KSA6IHRoaXMuX3N0YXRlcy5wYXR0ZXJuID0gbmV3IGQzKHQ5LCB0aGlzLm9wdGlvbnMudGltZXpvbmUpLCB0aGlzLm5hbWUpIHsKICAgICAgICAgIGlmICh5My5maW5kKChsNikgPT4gbDYubmFtZSA9PT0gdGhpcy5uYW1lKSkgdGhyb3cgbmV3IEVycm9yKCJDcm9uOiBUcmllZCB0byBpbml0aWFsaXplIG5ldyBuYW1lZCBqb2IgJyIgKyB0aGlzLm5hbWUgKyAiJywgYnV0IG5hbWUgYWxyZWFkeSB0YWtlbi4iKTsKICAgICAgICAgIHkzLnB1c2godGhpcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpMTEgIT09IHZvaWQgMCAmJiBTMyhpMTEpICYmICh0aGlzLmZuID0gaTExLCB0aGlzLnNjaGVkdWxlKCkpLCB0aGlzOwogICAgICB9CiAgICAgIG5leHRSdW4odDkpIHsKICAgICAgICBsZXQgZTExID0gdGhpcy5fbmV4dCh0OSk7CiAgICAgICAgcmV0dXJuIGUxMSA/IGUxMS5nZXREYXRlKGZhbHNlKSA6IG51bGw7CiAgICAgIH0KICAgICAgbmV4dFJ1bnModDksIGUxMSkgewogICAgICAgIHRoaXMuX3N0YXRlcy5tYXhSdW5zICE9PSB2b2lkIDAgJiYgdDkgPiB0aGlzLl9zdGF0ZXMubWF4UnVucyAmJiAodDkgPSB0aGlzLl9zdGF0ZXMubWF4UnVucyk7CiAgICAgICAgbGV0IHIxMSA9IFtdLCBzOSA9IGUxMSB8fCB0aGlzLl9zdGF0ZXMuY3VycmVudFJ1biB8fCB2b2lkIDA7CiAgICAgICAgZm9yICg7IHQ5LS0gJiYgKHM5ID0gdGhpcy5uZXh0UnVuKHM5KSk7ICkgcjExLnB1c2goczkpOwogICAgICAgIHJldHVybiByMTE7CiAgICAgIH0KICAgICAgZ2V0UGF0dGVybigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGVzLnBhdHRlcm4gPyB0aGlzLl9zdGF0ZXMucGF0dGVybi5wYXR0ZXJuIDogdm9pZCAwOwogICAgICB9CiAgICAgIGlzUnVubmluZygpIHsKICAgICAgICBsZXQgdDkgPSB0aGlzLm5leHRSdW4odGhpcy5fc3RhdGVzLmN1cnJlbnRSdW4pLCBlMTEgPSAhdGhpcy5fc3RhdGVzLnBhdXNlZCwgcjExID0gdGhpcy5mbiAhPT0gdm9pZCAwLCBzOSA9ICF0aGlzLl9zdGF0ZXMua2lsbDsKICAgICAgICByZXR1cm4gZTExICYmIHIxMSAmJiBzOSAmJiB0OSAhPT0gbnVsbDsKICAgICAgfQogICAgICBpc1N0b3BwZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5raWxsOwogICAgICB9CiAgICAgIGlzQnVzeSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGVzLmJsb2NraW5nOwogICAgICB9CiAgICAgIGN1cnJlbnRSdW4oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5jdXJyZW50UnVuID8gdGhpcy5fc3RhdGVzLmN1cnJlbnRSdW4uZ2V0RGF0ZSgpIDogbnVsbDsKICAgICAgfQogICAgICBwcmV2aW91c1J1bigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGVzLnByZXZpb3VzUnVuID8gdGhpcy5fc3RhdGVzLnByZXZpb3VzUnVuLmdldERhdGUoKSA6IG51bGw7CiAgICAgIH0KICAgICAgbXNUb05leHQodDkpIHsKICAgICAgICBsZXQgZTExID0gdGhpcy5fbmV4dCh0OSk7CiAgICAgICAgcmV0dXJuIGUxMSA/IHQ5IGluc3RhbmNlb2YgZjMgfHwgdDkgaW5zdGFuY2VvZiBEYXRlID8gZTExLmdldFRpbWUoKSAtIHQ5LmdldFRpbWUoKSA6IGUxMS5nZXRUaW1lKCkgLSBuZXcgZjModDkpLmdldFRpbWUoKSA6IG51bGw7CiAgICAgIH0KICAgICAgc3RvcCgpIHsKICAgICAgICB0aGlzLl9zdGF0ZXMua2lsbCA9IHRydWUsIHRoaXMuX3N0YXRlcy5jdXJyZW50VGltZW91dCAmJiBjbGVhclRpbWVvdXQodGhpcy5fc3RhdGVzLmN1cnJlbnRUaW1lb3V0KTsKICAgICAgICBsZXQgdDkgPSB5My5pbmRleE9mKHRoaXMpOwogICAgICAgIHQ5ID49IDAgJiYgeTMuc3BsaWNlKHQ5LCAxKTsKICAgICAgfQogICAgICBwYXVzZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGVzLnBhdXNlZCA9IHRydWUsICF0aGlzLl9zdGF0ZXMua2lsbDsKICAgICAgfQogICAgICByZXN1bWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5wYXVzZWQgPSBmYWxzZSwgIXRoaXMuX3N0YXRlcy5raWxsOwogICAgICB9CiAgICAgIHNjaGVkdWxlKHQ5KSB7CiAgICAgICAgaWYgKHQ5ICYmIHRoaXMuZm4pIHRocm93IG5ldyBFcnJvcigiQ3JvbjogSXQgaXMgbm90IGFsbG93ZWQgdG8gc2NoZWR1bGUgdHdvIGZ1bmN0aW9ucyB1c2luZyB0aGUgc2FtZSBDcm9uZXIgaW5zdGFuY2UuIik7CiAgICAgICAgdDkgJiYgKHRoaXMuZm4gPSB0OSk7CiAgICAgICAgbGV0IGUxMSA9IHRoaXMubXNUb05leHQoKSwgcjExID0gdGhpcy5uZXh0UnVuKHRoaXMuX3N0YXRlcy5jdXJyZW50UnVuKTsKICAgICAgICByZXR1cm4gZTExID09IG51bGwgfHwgaXNOYU4oZTExKSB8fCByMTEgPT09IG51bGwgPyB0aGlzIDogKGUxMSA+IF8yICYmIChlMTEgPSBfMiksIHRoaXMuX3N0YXRlcy5jdXJyZW50VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fY2hlY2tUcmlnZ2VyKHIxMSksIGUxMSksIHRoaXMuX3N0YXRlcy5jdXJyZW50VGltZW91dCAmJiB0aGlzLm9wdGlvbnMudW5yZWYgJiYgUDIodGhpcy5fc3RhdGVzLmN1cnJlbnRUaW1lb3V0KSwgdGhpcyk7CiAgICAgIH0KICAgICAgYXN5bmMgX3RyaWdnZXIodDkpIHsKICAgICAgICBpZiAodGhpcy5fc3RhdGVzLmJsb2NraW5nID0gdHJ1ZSwgdGhpcy5fc3RhdGVzLmN1cnJlbnRSdW4gPSBuZXcgZjModm9pZCAwLCB0aGlzLm9wdGlvbnMudGltZXpvbmUgfHwgdGhpcy5vcHRpb25zLnV0Y09mZnNldCksIHRoaXMub3B0aW9ucy5jYXRjaCkgdHJ5IHsKICAgICAgICAgIHRoaXMuZm4gIT09IHZvaWQgMCAmJiBhd2FpdCB0aGlzLmZuKHRoaXMsIHRoaXMub3B0aW9ucy5jb250ZXh0KTsKICAgICAgICB9IGNhdGNoIChlMTEpIHsKICAgICAgICAgIGcyKHRoaXMub3B0aW9ucy5jYXRjaCkgJiYgdGhpcy5vcHRpb25zLmNhdGNoKGUxMSwgdGhpcyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgdGhpcy5mbiAhPT0gdm9pZCAwICYmIGF3YWl0IHRoaXMuZm4odGhpcywgdGhpcy5vcHRpb25zLmNvbnRleHQpOwogICAgICAgIHRoaXMuX3N0YXRlcy5wcmV2aW91c1J1biA9IG5ldyBmMyh0OSwgdGhpcy5vcHRpb25zLnRpbWV6b25lIHx8IHRoaXMub3B0aW9ucy51dGNPZmZzZXQpLCB0aGlzLl9zdGF0ZXMuYmxvY2tpbmcgPSBmYWxzZTsKICAgICAgfQogICAgICBhc3luYyB0cmlnZ2VyKCkgewogICAgICAgIGF3YWl0IHRoaXMuX3RyaWdnZXIoKTsKICAgICAgfQogICAgICBydW5zTGVmdCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGVzLm1heFJ1bnM7CiAgICAgIH0KICAgICAgX2NoZWNrVHJpZ2dlcih0OSkgewogICAgICAgIGxldCBlMTEgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSwgcjExID0gIXRoaXMuX3N0YXRlcy5wYXVzZWQgJiYgZTExLmdldFRpbWUoKSA+PSB0OS5nZXRUaW1lKCksIHM5ID0gdGhpcy5fc3RhdGVzLmJsb2NraW5nICYmIHRoaXMub3B0aW9ucy5wcm90ZWN0OwogICAgICAgIHIxMSAmJiAhczkgPyAodGhpcy5fc3RhdGVzLm1heFJ1bnMgIT09IHZvaWQgMCAmJiB0aGlzLl9zdGF0ZXMubWF4UnVucy0tLCB0aGlzLl90cmlnZ2VyKCkpIDogcjExICYmIHM5ICYmIGcyKHRoaXMub3B0aW9ucy5wcm90ZWN0KSAmJiBzZXRUaW1lb3V0KCgpID0+IHRoaXMub3B0aW9ucy5wcm90ZWN0KHRoaXMpLCAwKSwgdGhpcy5zY2hlZHVsZSgpOwogICAgICB9CiAgICAgIF9uZXh0KHQ5KSB7CiAgICAgICAgbGV0IGUxMSA9ICEhKHQ5IHx8IHRoaXMuX3N0YXRlcy5jdXJyZW50UnVuKSwgcjExID0gZmFsc2U7CiAgICAgICAgIXQ5ICYmIHRoaXMub3B0aW9ucy5zdGFydEF0ICYmIHRoaXMub3B0aW9ucy5pbnRlcnZhbCAmJiAoW3Q5LCBlMTFdID0gdGhpcy5fY2FsY3VsYXRlUHJldmlvdXNSdW4odDksIGUxMSksIHIxMSA9ICF0OSksIHQ5ID0gbmV3IGYzKHQ5LCB0aGlzLm9wdGlvbnMudGltZXpvbmUgfHwgdGhpcy5vcHRpb25zLnV0Y09mZnNldCksIHRoaXMub3B0aW9ucy5zdGFydEF0ICYmIHQ5ICYmIHQ5LmdldFRpbWUoKSA8IHRoaXMub3B0aW9ucy5zdGFydEF0LmdldFRpbWUoKSAmJiAodDkgPSB0aGlzLm9wdGlvbnMuc3RhcnRBdCk7CiAgICAgICAgbGV0IHM5ID0gdGhpcy5fc3RhdGVzLm9uY2UgfHwgbmV3IGYzKHQ5LCB0aGlzLm9wdGlvbnMudGltZXpvbmUgfHwgdGhpcy5vcHRpb25zLnV0Y09mZnNldCk7CiAgICAgICAgcmV0dXJuICFyMTEgJiYgczkgIT09IHRoaXMuX3N0YXRlcy5vbmNlICYmIChzOSA9IHM5LmluY3JlbWVudCh0aGlzLl9zdGF0ZXMucGF0dGVybiwgdGhpcy5vcHRpb25zLCBlMTEpKSwgdGhpcy5fc3RhdGVzLm9uY2UgJiYgdGhpcy5fc3RhdGVzLm9uY2UuZ2V0VGltZSgpIDw9IHQ5LmdldFRpbWUoKSB8fCBzOSA9PT0gbnVsbCB8fCB0aGlzLl9zdGF0ZXMubWF4UnVucyAhPT0gdm9pZCAwICYmIHRoaXMuX3N0YXRlcy5tYXhSdW5zIDw9IDAgfHwgdGhpcy5fc3RhdGVzLmtpbGwgfHwgdGhpcy5vcHRpb25zLnN0b3BBdCAmJiBzOS5nZXRUaW1lKCkgPj0gdGhpcy5vcHRpb25zLnN0b3BBdC5nZXRUaW1lKCkgPyBudWxsIDogczk7CiAgICAgIH0KICAgICAgX2NhbGN1bGF0ZVByZXZpb3VzUnVuKHQ5LCBlMTEpIHsKICAgICAgICBsZXQgcjExID0gbmV3IGYzKHZvaWQgMCwgdGhpcy5vcHRpb25zLnRpbWV6b25lIHx8IHRoaXMub3B0aW9ucy51dGNPZmZzZXQpLCBzOSA9IHQ5OwogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3RhcnRBdC5nZXRUaW1lKCkgPD0gcjExLmdldFRpbWUoKSkgewogICAgICAgICAgczkgPSB0aGlzLm9wdGlvbnMuc3RhcnRBdDsKICAgICAgICAgIGxldCBpMTEgPSBzOS5nZXRUaW1lKCkgKyB0aGlzLm9wdGlvbnMuaW50ZXJ2YWwgKiAxZTM7CiAgICAgICAgICBmb3IgKDsgaTExIDw9IHIxMS5nZXRUaW1lKCk7ICkgczkgPSBuZXcgZjMoczksIHRoaXMub3B0aW9ucy50aW1lem9uZSB8fCB0aGlzLm9wdGlvbnMudXRjT2Zmc2V0KS5pbmNyZW1lbnQodGhpcy5fc3RhdGVzLnBhdHRlcm4sIHRoaXMub3B0aW9ucywgdHJ1ZSksIGkxMSA9IHM5LmdldFRpbWUoKSArIHRoaXMub3B0aW9ucy5pbnRlcnZhbCAqIDFlMzsKICAgICAgICAgIGUxMSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzOSA9PT0gbnVsbCAmJiAoczkgPSB2b2lkIDApLCBbczksIGUxMV07CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29uc3RhbnRzLmpzCnZhciBkYXlzSW5XZWVrLCBkYXlzSW5ZZWFyLCBtYXhUaW1lLCBtaW5UaW1lLCBtaWxsaXNlY29uZHNJbldlZWssIG1pbGxpc2Vjb25kc0luRGF5LCBtaWxsaXNlY29uZHNJbk1pbnV0ZSwgbWlsbGlzZWNvbmRzSW5Ib3VyLCBtaWxsaXNlY29uZHNJblNlY29uZCwgbWludXRlc0luWWVhciwgbWludXRlc0luTW9udGgsIG1pbnV0ZXNJbkRheSwgbWludXRlc0luSG91ciwgbW9udGhzSW5RdWFydGVyLCBtb250aHNJblllYXIsIHF1YXJ0ZXJzSW5ZZWFyLCBzZWNvbmRzSW5Ib3VyLCBzZWNvbmRzSW5NaW51dGUsIHNlY29uZHNJbkRheSwgc2Vjb25kc0luV2Vlaywgc2Vjb25kc0luWWVhciwgc2Vjb25kc0luTW9udGgsIHNlY29uZHNJblF1YXJ0ZXIsIGNvbnN0cnVjdEZyb21TeW1ib2w7CnZhciBpbml0X2NvbnN0YW50cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb25zdGFudHMuanMiKCkgewogICAgZGF5c0luV2VlayA9IDc7CiAgICBkYXlzSW5ZZWFyID0gMzY1LjI0MjU7CiAgICBtYXhUaW1lID0gTWF0aC5wb3coMTAsIDgpICogMjQgKiA2MCAqIDYwICogMWUzOwogICAgbWluVGltZSA9IC1tYXhUaW1lOwogICAgbWlsbGlzZWNvbmRzSW5XZWVrID0gNjA0OGU1OwogICAgbWlsbGlzZWNvbmRzSW5EYXkgPSA4NjRlNTsKICAgIG1pbGxpc2Vjb25kc0luTWludXRlID0gNmU0OwogICAgbWlsbGlzZWNvbmRzSW5Ib3VyID0gMzZlNTsKICAgIG1pbGxpc2Vjb25kc0luU2Vjb25kID0gMWUzOwogICAgbWludXRlc0luWWVhciA9IDUyNTYwMDsKICAgIG1pbnV0ZXNJbk1vbnRoID0gNDMyMDA7CiAgICBtaW51dGVzSW5EYXkgPSAxNDQwOwogICAgbWludXRlc0luSG91ciA9IDYwOwogICAgbW9udGhzSW5RdWFydGVyID0gMzsKICAgIG1vbnRoc0luWWVhciA9IDEyOwogICAgcXVhcnRlcnNJblllYXIgPSA0OwogICAgc2Vjb25kc0luSG91ciA9IDM2MDA7CiAgICBzZWNvbmRzSW5NaW51dGUgPSA2MDsKICAgIHNlY29uZHNJbkRheSA9IHNlY29uZHNJbkhvdXIgKiAyNDsKICAgIHNlY29uZHNJbldlZWsgPSBzZWNvbmRzSW5EYXkgKiA3OwogICAgc2Vjb25kc0luWWVhciA9IHNlY29uZHNJbkRheSAqIGRheXNJblllYXI7CiAgICBzZWNvbmRzSW5Nb250aCA9IHNlY29uZHNJblllYXIgLyAxMjsKICAgIHNlY29uZHNJblF1YXJ0ZXIgPSBzZWNvbmRzSW5Nb250aCAqIDM7CiAgICBjb25zdHJ1Y3RGcm9tU3ltYm9sID0gLyogQF9fUFVSRV9fICovIFN5bWJvbC5mb3IoImNvbnN0cnVjdERhdGVGcm9tIik7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29uc3RydWN0RnJvbS5qcwpmdW5jdGlvbiBjb25zdHJ1Y3RGcm9tKGRhdGUsIHZhbHVlMikgewogIGlmICh0eXBlb2YgZGF0ZSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIGRhdGUodmFsdWUyKTsKICBpZiAoZGF0ZSAmJiB0eXBlb2YgZGF0ZSA9PT0gIm9iamVjdCIgJiYgY29uc3RydWN0RnJvbVN5bWJvbCBpbiBkYXRlKQogICAgcmV0dXJuIGRhdGVbY29uc3RydWN0RnJvbVN5bWJvbF0odmFsdWUyKTsKICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBuZXcgZGF0ZS5jb25zdHJ1Y3Rvcih2YWx1ZTIpOwogIHJldHVybiBuZXcgRGF0ZSh2YWx1ZTIpOwp9CnZhciBjb25zdHJ1Y3RGcm9tX2RlZmF1bHQ7CnZhciBpbml0X2NvbnN0cnVjdEZyb20gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29uc3RydWN0RnJvbS5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgY29uc3RydWN0RnJvbV9kZWZhdWx0ID0gY29uc3RydWN0RnJvbTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy90b0RhdGUuanMKZnVuY3Rpb24gdG9EYXRlKGFyZ3VtZW50LCBjb250ZXh0MikgewogIHJldHVybiBjb25zdHJ1Y3RGcm9tKGNvbnRleHQyIHx8IGFyZ3VtZW50LCBhcmd1bWVudCk7Cn0KdmFyIHRvRGF0ZV9kZWZhdWx0Owp2YXIgaW5pdF90b0RhdGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvdG9EYXRlLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgdG9EYXRlX2RlZmF1bHQgPSB0b0RhdGU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkRGF5cy5qcwpmdW5jdGlvbiBhZGREYXlzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBpZiAoaXNOYU4oYW1vdW50KSkgcmV0dXJuIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgTmFOKTsKICBpZiAoIWFtb3VudCkgcmV0dXJuIF9kYXRlOwogIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpICsgYW1vdW50KTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIGFkZERheXNfZGVmYXVsdDsKdmFyIGluaXRfYWRkRGF5cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGREYXlzLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGFkZERheXNfZGVmYXVsdCA9IGFkZERheXM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkTW9udGhzLmpzCmZ1bmN0aW9uIGFkZE1vbnRocyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgaWYgKGlzTmFOKGFtb3VudCkpIHJldHVybiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIE5hTik7CiAgaWYgKCFhbW91bnQpIHsKICAgIHJldHVybiBfZGF0ZTsKICB9CiAgY29uc3QgZGF5T2ZNb250aCA9IF9kYXRlLmdldERhdGUoKTsKICBjb25zdCBlbmRPZkRlc2lyZWRNb250aCA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgX2RhdGUuZ2V0VGltZSgpKTsKICBlbmRPZkRlc2lyZWRNb250aC5zZXRNb250aChfZGF0ZS5nZXRNb250aCgpICsgYW1vdW50ICsgMSwgMCk7CiAgY29uc3QgZGF5c0luTW9udGggPSBlbmRPZkRlc2lyZWRNb250aC5nZXREYXRlKCk7CiAgaWYgKGRheU9mTW9udGggPj0gZGF5c0luTW9udGgpIHsKICAgIHJldHVybiBlbmRPZkRlc2lyZWRNb250aDsKICB9IGVsc2UgewogICAgX2RhdGUuc2V0RnVsbFllYXIoCiAgICAgIGVuZE9mRGVzaXJlZE1vbnRoLmdldEZ1bGxZZWFyKCksCiAgICAgIGVuZE9mRGVzaXJlZE1vbnRoLmdldE1vbnRoKCksCiAgICAgIGRheU9mTW9udGgKICAgICk7CiAgICByZXR1cm4gX2RhdGU7CiAgfQp9CnZhciBhZGRNb250aHNfZGVmYXVsdDsKdmFyIGluaXRfYWRkTW9udGhzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZE1vbnRocy5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBhZGRNb250aHNfZGVmYXVsdCA9IGFkZE1vbnRoczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGQuanMKZnVuY3Rpb24gYWRkKGRhdGUsIGR1cmF0aW9uLCBvcHRpb25zKSB7CiAgY29uc3QgewogICAgeWVhcnMgPSAwLAogICAgbW9udGhzOiBtb250aHMyID0gMCwKICAgIHdlZWtzID0gMCwKICAgIGRheXM6IGRheXMyID0gMCwKICAgIGhvdXJzID0gMCwKICAgIG1pbnV0ZXMgPSAwLAogICAgc2Vjb25kcyA9IDAKICB9ID0gZHVyYXRpb247CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGRhdGVXaXRoTW9udGhzID0gbW9udGhzMiB8fCB5ZWFycyA/IGFkZE1vbnRocyhfZGF0ZSwgbW9udGhzMiArIHllYXJzICogMTIpIDogX2RhdGU7CiAgY29uc3QgZGF0ZVdpdGhEYXlzID0gZGF5czIgfHwgd2Vla3MgPyBhZGREYXlzKGRhdGVXaXRoTW9udGhzLCBkYXlzMiArIHdlZWtzICogNykgOiBkYXRlV2l0aE1vbnRoczsKICBjb25zdCBtaW51dGVzVG9BZGQgPSBtaW51dGVzICsgaG91cnMgKiA2MDsKICBjb25zdCBzZWNvbmRzVG9BZGQgPSBzZWNvbmRzICsgbWludXRlc1RvQWRkICogNjA7CiAgY29uc3QgbXNUb0FkZCA9IHNlY29uZHNUb0FkZCAqIDFlMzsKICByZXR1cm4gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCArZGF0ZVdpdGhEYXlzICsgbXNUb0FkZCk7Cn0KdmFyIGFkZF9kZWZhdWx0Owp2YXIgaW5pdF9hZGQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkLmpzIigpIHsKICAgIGluaXRfYWRkRGF5cygpOwogICAgaW5pdF9hZGRNb250aHMoKTsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGFkZF9kZWZhdWx0ID0gYWRkOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2F0dXJkYXkuanMKZnVuY3Rpb24gaXNTYXR1cmRheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbikuZ2V0RGF5KCkgPT09IDY7Cn0KdmFyIGlzU2F0dXJkYXlfZGVmYXVsdDsKdmFyIGluaXRfaXNTYXR1cmRheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhdHVyZGF5LmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpc1NhdHVyZGF5X2RlZmF1bHQgPSBpc1NhdHVyZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU3VuZGF5LmpzCmZ1bmN0aW9uIGlzU3VuZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKSA9PT0gMDsKfQp2YXIgaXNTdW5kYXlfZGVmYXVsdDsKdmFyIGluaXRfaXNTdW5kYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTdW5kYXkuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGlzU3VuZGF5X2RlZmF1bHQgPSBpc1N1bmRheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1dlZWtlbmQuanMKZnVuY3Rpb24gaXNXZWVrZW5kKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXkgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldERheSgpOwogIHJldHVybiBkYXkgPT09IDAgfHwgZGF5ID09PSA2Owp9CnZhciBpc1dlZWtlbmRfZGVmYXVsdDsKdmFyIGluaXRfaXNXZWVrZW5kID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzV2Vla2VuZC5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgaXNXZWVrZW5kX2RlZmF1bHQgPSBpc1dlZWtlbmQ7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkQnVzaW5lc3NEYXlzLmpzCmZ1bmN0aW9uIGFkZEJ1c2luZXNzRGF5cyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3Qgc3RhcnRlZE9uV2Vla2VuZCA9IGlzV2Vla2VuZChfZGF0ZSwgb3B0aW9ucyk7CiAgaWYgKGlzTmFOKGFtb3VudCkpIHJldHVybiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluLCBOYU4pOwogIGNvbnN0IGhvdXJzID0gX2RhdGUuZ2V0SG91cnMoKTsKICBjb25zdCBzaWduID0gYW1vdW50IDwgMCA/IC0xIDogMTsKICBjb25zdCBmdWxsV2Vla3MgPSBNYXRoLnRydW5jKGFtb3VudCAvIDUpOwogIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpICsgZnVsbFdlZWtzICogNyk7CiAgbGV0IHJlc3REYXlzID0gTWF0aC5hYnMoYW1vdW50ICUgNSk7CiAgd2hpbGUgKHJlc3REYXlzID4gMCkgewogICAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgKyBzaWduKTsKICAgIGlmICghaXNXZWVrZW5kKF9kYXRlLCBvcHRpb25zKSkgcmVzdERheXMgLT0gMTsKICB9CiAgaWYgKHN0YXJ0ZWRPbldlZWtlbmQgJiYgaXNXZWVrZW5kKF9kYXRlLCBvcHRpb25zKSAmJiBhbW91bnQgIT09IDApIHsKICAgIGlmIChpc1NhdHVyZGF5KF9kYXRlLCBvcHRpb25zKSkKICAgICAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgKyAoc2lnbiA8IDAgPyAyIDogLTEpKTsKICAgIGlmIChpc1N1bmRheShfZGF0ZSwgb3B0aW9ucykpCiAgICAgIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpICsgKHNpZ24gPCAwID8gMSA6IC0yKSk7CiAgfQogIF9kYXRlLnNldEhvdXJzKGhvdXJzKTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIGFkZEJ1c2luZXNzRGF5c19kZWZhdWx0Owp2YXIgaW5pdF9hZGRCdXNpbmVzc0RheXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkQnVzaW5lc3NEYXlzLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF9pc1NhdHVyZGF5KCk7CiAgICBpbml0X2lzU3VuZGF5KCk7CiAgICBpbml0X2lzV2Vla2VuZCgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGFkZEJ1c2luZXNzRGF5c19kZWZhdWx0ID0gYWRkQnVzaW5lc3NEYXlzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZE1pbGxpc2Vjb25kcy5qcwpmdW5jdGlvbiBhZGRNaWxsaXNlY29uZHMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7CiAgcmV0dXJuIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgK3RvRGF0ZShkYXRlKSArIGFtb3VudCk7Cn0KdmFyIGFkZE1pbGxpc2Vjb25kc19kZWZhdWx0Owp2YXIgaW5pdF9hZGRNaWxsaXNlY29uZHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkTWlsbGlzZWNvbmRzLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGFkZE1pbGxpc2Vjb25kc19kZWZhdWx0ID0gYWRkTWlsbGlzZWNvbmRzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZEhvdXJzLmpzCmZ1bmN0aW9uIGFkZEhvdXJzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRNaWxsaXNlY29uZHMoZGF0ZSwgYW1vdW50ICogbWlsbGlzZWNvbmRzSW5Ib3VyLCBvcHRpb25zKTsKfQp2YXIgYWRkSG91cnNfZGVmYXVsdDsKdmFyIGluaXRfYWRkSG91cnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkSG91cnMuanMiKCkgewogICAgaW5pdF9hZGRNaWxsaXNlY29uZHMoKTsKICAgIGluaXRfY29uc3RhbnRzKCk7CiAgICBhZGRIb3Vyc19kZWZhdWx0ID0gYWRkSG91cnM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9kZWZhdWx0T3B0aW9ucy5qcwpmdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9ucygpIHsKICByZXR1cm4gZGVmYXVsdE9wdGlvbnM7Cn0KZnVuY3Rpb24gc2V0RGVmYXVsdE9wdGlvbnMobmV3T3B0aW9ucykgewogIGRlZmF1bHRPcHRpb25zID0gbmV3T3B0aW9uczsKfQp2YXIgZGVmYXVsdE9wdGlvbnM7CnZhciBpbml0X2RlZmF1bHRPcHRpb25zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZGVmYXVsdE9wdGlvbnMuanMiKCkgewogICAgZGVmYXVsdE9wdGlvbnMgPSB7fTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mV2Vlay5qcwpmdW5jdGlvbiBzdGFydE9mV2VlayhkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCB3ZWVrU3RhcnRzT24gPSBvcHRpb25zPy53ZWVrU3RhcnRzT24gPz8gb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz8gZGVmYXVsdE9wdGlvbnMyLndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz8gMDsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgZGF5ID0gX2RhdGUuZ2V0RGF5KCk7CiAgY29uc3QgZGlmZiA9IChkYXkgPCB3ZWVrU3RhcnRzT24gPyA3IDogMCkgKyBkYXkgLSB3ZWVrU3RhcnRzT247CiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgLSBkaWZmKTsKICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIHN0YXJ0T2ZXZWVrX2RlZmF1bHQ7CnZhciBpbml0X3N0YXJ0T2ZXZWVrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZXZWVrLmpzIigpIHsKICAgIGluaXRfZGVmYXVsdE9wdGlvbnMoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzdGFydE9mV2Vla19kZWZhdWx0ID0gc3RhcnRPZldlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZklTT1dlZWsuanMKZnVuY3Rpb24gc3RhcnRPZklTT1dlZWsoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBzdGFydE9mV2VlayhkYXRlLCB7IC4uLm9wdGlvbnMsIHdlZWtTdGFydHNPbjogMSB9KTsKfQp2YXIgc3RhcnRPZklTT1dlZWtfZGVmYXVsdDsKdmFyIGluaXRfc3RhcnRPZklTT1dlZWsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZklTT1dlZWsuanMiKCkgewogICAgaW5pdF9zdGFydE9mV2VlaygpOwogICAgc3RhcnRPZklTT1dlZWtfZGVmYXVsdCA9IHN0YXJ0T2ZJU09XZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT1dlZWtZZWFyLmpzCmZ1bmN0aW9uIGdldElTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhciA9IGNvbnN0cnVjdEZyb20oX2RhdGUsIDApOwogIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDQpOwogIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgY29uc3Qgc3RhcnRPZk5leHRZZWFyID0gc3RhcnRPZklTT1dlZWsoZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhcik7CiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhciA9IGNvbnN0cnVjdEZyb20oX2RhdGUsIDApOwogIGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIuc2V0RnVsbFllYXIoeWVhciwgMCwgNCk7CiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBjb25zdCBzdGFydE9mVGhpc1llYXIgPSBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnlPZlRoaXNZZWFyKTsKICBpZiAoX2RhdGUuZ2V0VGltZSgpID49IHN0YXJ0T2ZOZXh0WWVhci5nZXRUaW1lKCkpIHsKICAgIHJldHVybiB5ZWFyICsgMTsKICB9IGVsc2UgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mVGhpc1llYXIuZ2V0VGltZSgpKSB7CiAgICByZXR1cm4geWVhcjsKICB9IGVsc2UgewogICAgcmV0dXJuIHllYXIgLSAxOwogIH0KfQp2YXIgZ2V0SVNPV2Vla1llYXJfZGVmYXVsdDsKdmFyIGluaXRfZ2V0SVNPV2Vla1llYXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SVNPV2Vla1llYXIuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X3N0YXJ0T2ZJU09XZWVrKCk7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZ2V0SVNPV2Vla1llYXJfZGVmYXVsdCA9IGdldElTT1dlZWtZZWFyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcy5qcwpmdW5jdGlvbiBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGRhdGUpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlKTsKICBjb25zdCB1dGNEYXRlID0gbmV3IERhdGUoCiAgICBEYXRlLlVUQygKICAgICAgX2RhdGUuZ2V0RnVsbFllYXIoKSwKICAgICAgX2RhdGUuZ2V0TW9udGgoKSwKICAgICAgX2RhdGUuZ2V0RGF0ZSgpLAogICAgICBfZGF0ZS5nZXRIb3VycygpLAogICAgICBfZGF0ZS5nZXRNaW51dGVzKCksCiAgICAgIF9kYXRlLmdldFNlY29uZHMoKSwKICAgICAgX2RhdGUuZ2V0TWlsbGlzZWNvbmRzKCkKICAgICkKICApOwogIHV0Y0RhdGUuc2V0VVRDRnVsbFllYXIoX2RhdGUuZ2V0RnVsbFllYXIoKSk7CiAgcmV0dXJuICtkYXRlIC0gK3V0Y0RhdGU7Cn0KdmFyIGluaXRfZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL25vcm1hbGl6ZURhdGVzLmpzCmZ1bmN0aW9uIG5vcm1hbGl6ZURhdGVzKGNvbnRleHQyLCAuLi5kYXRlcykgewogIGNvbnN0IG5vcm1hbGl6ZTQgPSBjb25zdHJ1Y3RGcm9tLmJpbmQoCiAgICBudWxsLAogICAgY29udGV4dDIgfHwgZGF0ZXMuZmluZCgoZGF0ZSkgPT4gdHlwZW9mIGRhdGUgPT09ICJvYmplY3QiKQogICk7CiAgcmV0dXJuIGRhdGVzLm1hcChub3JtYWxpemU0KTsKfQp2YXIgaW5pdF9ub3JtYWxpemVEYXRlcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL25vcm1hbGl6ZURhdGVzLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZEYXkuanMKZnVuY3Rpb24gc3RhcnRPZkRheShkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiBfZGF0ZTsKfQp2YXIgc3RhcnRPZkRheV9kZWZhdWx0Owp2YXIgaW5pdF9zdGFydE9mRGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZEYXkuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIHN0YXJ0T2ZEYXlfZGVmYXVsdCA9IHN0YXJ0T2ZEYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGNvbnN0IGxhdGVyU3RhcnRPZkRheSA9IHN0YXJ0T2ZEYXkobGF0ZXJEYXRlXyk7CiAgY29uc3QgZWFybGllclN0YXJ0T2ZEYXkgPSBzdGFydE9mRGF5KGVhcmxpZXJEYXRlXyk7CiAgY29uc3QgbGF0ZXJUaW1lc3RhbXAgPSArbGF0ZXJTdGFydE9mRGF5IC0gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhsYXRlclN0YXJ0T2ZEYXkpOwogIGNvbnN0IGVhcmxpZXJUaW1lc3RhbXAgPSArZWFybGllclN0YXJ0T2ZEYXkgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGVhcmxpZXJTdGFydE9mRGF5KTsKICByZXR1cm4gTWF0aC5yb3VuZCgobGF0ZXJUaW1lc3RhbXAgLSBlYXJsaWVyVGltZXN0YW1wKSAvIG1pbGxpc2Vjb25kc0luRGF5KTsKfQp2YXIgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzX2RlZmF1bHQ7CnZhciBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMuanMiKCkgewogICAgaW5pdF9nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKCk7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgaW5pdF9zdGFydE9mRGF5KCk7CiAgICBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXNfZGVmYXVsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5czsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mSVNPV2Vla1llYXIuanMKZnVuY3Rpb24gc3RhcnRPZklTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCB5ZWFyID0gZ2V0SVNPV2Vla1llYXIoZGF0ZSwgb3B0aW9ucyk7CiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5ID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTsKICBmb3VydGhPZkphbnVhcnkuc2V0RnVsbFllYXIoeWVhciwgMCwgNCk7CiAgZm91cnRoT2ZKYW51YXJ5LnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnkpOwp9CnZhciBzdGFydE9mSVNPV2Vla1llYXJfZGVmYXVsdDsKdmFyIGluaXRfc3RhcnRPZklTT1dlZWtZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZJU09XZWVrWWVhci5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfZ2V0SVNPV2Vla1llYXIoKTsKICAgIGluaXRfc3RhcnRPZklTT1dlZWsoKTsKICAgIHN0YXJ0T2ZJU09XZWVrWWVhcl9kZWZhdWx0ID0gc3RhcnRPZklTT1dlZWtZZWFyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldElTT1dlZWtZZWFyLmpzCmZ1bmN0aW9uIHNldElTT1dlZWtZZWFyKGRhdGUsIHdlZWtZZWFyLCBvcHRpb25zKSB7CiAgbGV0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKAogICAgX2RhdGUsCiAgICBzdGFydE9mSVNPV2Vla1llYXIoX2RhdGUsIG9wdGlvbnMpCiAgKTsKICBjb25zdCBmb3VydGhPZkphbnVhcnkgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApOwogIGZvdXJ0aE9mSmFudWFyeS5zZXRGdWxsWWVhcih3ZWVrWWVhciwgMCwgNCk7CiAgZm91cnRoT2ZKYW51YXJ5LnNldEhvdXJzKDAsIDAsIDAsIDApOwogIF9kYXRlID0gc3RhcnRPZklTT1dlZWtZZWFyKGZvdXJ0aE9mSmFudWFyeSk7CiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgKyBkaWZmKTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIHNldElTT1dlZWtZZWFyX2RlZmF1bHQ7CnZhciBpbml0X3NldElTT1dlZWtZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldElTT1dlZWtZZWFyLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoKTsKICAgIGluaXRfc3RhcnRPZklTT1dlZWtZZWFyKCk7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgc2V0SVNPV2Vla1llYXJfZGVmYXVsdCA9IHNldElTT1dlZWtZZWFyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZElTT1dlZWtZZWFycy5qcwpmdW5jdGlvbiBhZGRJU09XZWVrWWVhcnMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7CiAgcmV0dXJuIHNldElTT1dlZWtZZWFyKGRhdGUsIGdldElTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpICsgYW1vdW50LCBvcHRpb25zKTsKfQp2YXIgYWRkSVNPV2Vla1llYXJzX2RlZmF1bHQ7CnZhciBpbml0X2FkZElTT1dlZWtZZWFycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRJU09XZWVrWWVhcnMuanMiKCkgewogICAgaW5pdF9nZXRJU09XZWVrWWVhcigpOwogICAgaW5pdF9zZXRJU09XZWVrWWVhcigpOwogICAgYWRkSVNPV2Vla1llYXJzX2RlZmF1bHQgPSBhZGRJU09XZWVrWWVhcnM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkTWludXRlcy5qcwpmdW5jdGlvbiBhZGRNaW51dGVzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRUaW1lKF9kYXRlLmdldFRpbWUoKSArIGFtb3VudCAqIG1pbGxpc2Vjb25kc0luTWludXRlKTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIGFkZE1pbnV0ZXNfZGVmYXVsdDsKdmFyIGluaXRfYWRkTWludXRlcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRNaW51dGVzLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzKCk7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgYWRkTWludXRlc19kZWZhdWx0ID0gYWRkTWludXRlczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRRdWFydGVycy5qcwpmdW5jdGlvbiBhZGRRdWFydGVycyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkTW9udGhzKGRhdGUsIGFtb3VudCAqIDMsIG9wdGlvbnMpOwp9CnZhciBhZGRRdWFydGVyc19kZWZhdWx0Owp2YXIgaW5pdF9hZGRRdWFydGVycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRRdWFydGVycy5qcyIoKSB7CiAgICBpbml0X2FkZE1vbnRocygpOwogICAgYWRkUXVhcnRlcnNfZGVmYXVsdCA9IGFkZFF1YXJ0ZXJzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZFNlY29uZHMuanMKZnVuY3Rpb24gYWRkU2Vjb25kcyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkTWlsbGlzZWNvbmRzKGRhdGUsIGFtb3VudCAqIDFlMywgb3B0aW9ucyk7Cn0KdmFyIGFkZFNlY29uZHNfZGVmYXVsdDsKdmFyIGluaXRfYWRkU2Vjb25kcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRTZWNvbmRzLmpzIigpIHsKICAgIGluaXRfYWRkTWlsbGlzZWNvbmRzKCk7CiAgICBhZGRTZWNvbmRzX2RlZmF1bHQgPSBhZGRTZWNvbmRzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZFdlZWtzLmpzCmZ1bmN0aW9uIGFkZFdlZWtzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGREYXlzKGRhdGUsIGFtb3VudCAqIDcsIG9wdGlvbnMpOwp9CnZhciBhZGRXZWVrc19kZWZhdWx0Owp2YXIgaW5pdF9hZGRXZWVrcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRXZWVrcy5qcyIoKSB7CiAgICBpbml0X2FkZERheXMoKTsKICAgIGFkZFdlZWtzX2RlZmF1bHQgPSBhZGRXZWVrczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRZZWFycy5qcwpmdW5jdGlvbiBhZGRZZWFycyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkTW9udGhzKGRhdGUsIGFtb3VudCAqIDEyLCBvcHRpb25zKTsKfQp2YXIgYWRkWWVhcnNfZGVmYXVsdDsKdmFyIGluaXRfYWRkWWVhcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkWWVhcnMuanMiKCkgewogICAgaW5pdF9hZGRNb250aHMoKTsKICAgIGFkZFllYXJzX2RlZmF1bHQgPSBhZGRZZWFyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hcmVJbnRlcnZhbHNPdmVybGFwcGluZy5qcwpmdW5jdGlvbiBhcmVJbnRlcnZhbHNPdmVybGFwcGluZyhpbnRlcnZhbExlZnQsIGludGVydmFsUmlnaHQsIG9wdGlvbnMpIHsKICBjb25zdCBbbGVmdFN0YXJ0VGltZSwgbGVmdEVuZFRpbWVdID0gWwogICAgK3RvRGF0ZShpbnRlcnZhbExlZnQuc3RhcnQsIG9wdGlvbnM/LmluKSwKICAgICt0b0RhdGUoaW50ZXJ2YWxMZWZ0LmVuZCwgb3B0aW9ucz8uaW4pCiAgXS5zb3J0KChhNSwgYjUpID0+IGE1IC0gYjUpOwogIGNvbnN0IFtyaWdodFN0YXJ0VGltZSwgcmlnaHRFbmRUaW1lXSA9IFsKICAgICt0b0RhdGUoaW50ZXJ2YWxSaWdodC5zdGFydCwgb3B0aW9ucz8uaW4pLAogICAgK3RvRGF0ZShpbnRlcnZhbFJpZ2h0LmVuZCwgb3B0aW9ucz8uaW4pCiAgXS5zb3J0KChhNSwgYjUpID0+IGE1IC0gYjUpOwogIGlmIChvcHRpb25zPy5pbmNsdXNpdmUpCiAgICByZXR1cm4gbGVmdFN0YXJ0VGltZSA8PSByaWdodEVuZFRpbWUgJiYgcmlnaHRTdGFydFRpbWUgPD0gbGVmdEVuZFRpbWU7CiAgcmV0dXJuIGxlZnRTdGFydFRpbWUgPCByaWdodEVuZFRpbWUgJiYgcmlnaHRTdGFydFRpbWUgPCBsZWZ0RW5kVGltZTsKfQp2YXIgYXJlSW50ZXJ2YWxzT3ZlcmxhcHBpbmdfZGVmYXVsdDsKdmFyIGluaXRfYXJlSW50ZXJ2YWxzT3ZlcmxhcHBpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYXJlSW50ZXJ2YWxzT3ZlcmxhcHBpbmcuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGFyZUludGVydmFsc092ZXJsYXBwaW5nX2RlZmF1bHQgPSBhcmVJbnRlcnZhbHNPdmVybGFwcGluZzsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9tYXguanMKZnVuY3Rpb24gbWF4MihkYXRlcywgb3B0aW9ucykgewogIGxldCByZXN1bHQ7CiAgbGV0IGNvbnRleHQyID0gb3B0aW9ucz8uaW47CiAgZGF0ZXMuZm9yRWFjaCgoZGF0ZSkgPT4gewogICAgaWYgKCFjb250ZXh0MiAmJiB0eXBlb2YgZGF0ZSA9PT0gIm9iamVjdCIpCiAgICAgIGNvbnRleHQyID0gY29uc3RydWN0RnJvbS5iaW5kKG51bGwsIGRhdGUpOwogICAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgY29udGV4dDIpOwogICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0IDwgZGF0ZV8gfHwgaXNOYU4oK2RhdGVfKSkgcmVzdWx0ID0gZGF0ZV87CiAgfSk7CiAgcmV0dXJuIGNvbnN0cnVjdEZyb20oY29udGV4dDIsIHJlc3VsdCB8fCBOYU4pOwp9CnZhciBtYXhfZGVmYXVsdDsKdmFyIGluaXRfbWF4MiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9tYXguanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgbWF4X2RlZmF1bHQgPSBtYXgyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21pbi5qcwpmdW5jdGlvbiBtaW4yKGRhdGVzLCBvcHRpb25zKSB7CiAgbGV0IHJlc3VsdDsKICBsZXQgY29udGV4dDIgPSBvcHRpb25zPy5pbjsKICBkYXRlcy5mb3JFYWNoKChkYXRlKSA9PiB7CiAgICBpZiAoIWNvbnRleHQyICYmIHR5cGVvZiBkYXRlID09PSAib2JqZWN0IikKICAgICAgY29udGV4dDIgPSBjb25zdHJ1Y3RGcm9tLmJpbmQobnVsbCwgZGF0ZSk7CiAgICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBjb250ZXh0Mik7CiAgICBpZiAoIXJlc3VsdCB8fCByZXN1bHQgPiBkYXRlXyB8fCBpc05hTigrZGF0ZV8pKSByZXN1bHQgPSBkYXRlXzsKICB9KTsKICByZXR1cm4gY29uc3RydWN0RnJvbShjb250ZXh0MiwgcmVzdWx0IHx8IE5hTik7Cn0KdmFyIG1pbl9kZWZhdWx0Owp2YXIgaW5pdF9taW4yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21pbi5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBtaW5fZGVmYXVsdCA9IG1pbjI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY2xhbXAuanMKZnVuY3Rpb24gY2xhbXAoZGF0ZSwgaW50ZXJ2YWwzLCBvcHRpb25zKSB7CiAgY29uc3QgW2RhdGVfLCBzdGFydCwgZW5kM10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgZGF0ZSwKICAgIGludGVydmFsMy5zdGFydCwKICAgIGludGVydmFsMy5lbmQKICApOwogIHJldHVybiBtaW4yKFttYXgyKFtkYXRlXywgc3RhcnRdLCBvcHRpb25zKSwgZW5kM10sIG9wdGlvbnMpOwp9CnZhciBjbGFtcF9kZWZhdWx0Owp2YXIgaW5pdF9jbGFtcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jbGFtcC5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBpbml0X21heDIoKTsKICAgIGluaXRfbWluMigpOwogICAgY2xhbXBfZGVmYXVsdCA9IGNsYW1wOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Nsb3Nlc3RJbmRleFRvLmpzCmZ1bmN0aW9uIGNsb3Nlc3RJbmRleFRvKGRhdGVUb0NvbXBhcmUsIGRhdGVzKSB7CiAgY29uc3QgdGltZVRvQ29tcGFyZSA9ICt0b0RhdGUoZGF0ZVRvQ29tcGFyZSk7CiAgaWYgKGlzTmFOKHRpbWVUb0NvbXBhcmUpKSByZXR1cm4gTmFOOwogIGxldCByZXN1bHQ7CiAgbGV0IG1pbkRpc3RhbmNlOwogIGRhdGVzLmZvckVhY2goKGRhdGUsIGluZGV4MikgPT4gewogICAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSk7CiAgICBpZiAoaXNOYU4oK2RhdGVfKSkgewogICAgICByZXN1bHQgPSBOYU47CiAgICAgIG1pbkRpc3RhbmNlID0gTmFOOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKHRpbWVUb0NvbXBhcmUgLSArZGF0ZV8pOwogICAgaWYgKHJlc3VsdCA9PSBudWxsIHx8IGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpIHsKICAgICAgcmVzdWx0ID0gaW5kZXgyOwogICAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlOwogICAgfQogIH0pOwogIHJldHVybiByZXN1bHQ7Cn0KdmFyIGNsb3Nlc3RJbmRleFRvX2RlZmF1bHQ7CnZhciBpbml0X2Nsb3Nlc3RJbmRleFRvID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Nsb3Nlc3RJbmRleFRvLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBjbG9zZXN0SW5kZXhUb19kZWZhdWx0ID0gY2xvc2VzdEluZGV4VG87CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY2xvc2VzdFRvLmpzCmZ1bmN0aW9uIGNsb3Nlc3RUbyhkYXRlVG9Db21wYXJlLCBkYXRlcywgb3B0aW9ucykgewogIGNvbnN0IFtkYXRlVG9Db21wYXJlXywgLi4uZGF0ZXNfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBkYXRlVG9Db21wYXJlLAogICAgLi4uZGF0ZXMKICApOwogIGNvbnN0IGluZGV4MiA9IGNsb3Nlc3RJbmRleFRvKGRhdGVUb0NvbXBhcmVfLCBkYXRlc18pOwogIGlmICh0eXBlb2YgaW5kZXgyID09PSAibnVtYmVyIiAmJiBpc05hTihpbmRleDIpKQogICAgcmV0dXJuIGNvbnN0cnVjdEZyb20oZGF0ZVRvQ29tcGFyZV8sIE5hTik7CiAgaWYgKGluZGV4MiAhPT0gdm9pZCAwKSByZXR1cm4gZGF0ZXNfW2luZGV4Ml07Cn0KdmFyIGNsb3Nlc3RUb19kZWZhdWx0Owp2YXIgaW5pdF9jbG9zZXN0VG8gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY2xvc2VzdFRvLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplRGF0ZXMoKTsKICAgIGluaXRfY2xvc2VzdEluZGV4VG8oKTsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgY2xvc2VzdFRvX2RlZmF1bHQgPSBjbG9zZXN0VG87CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29tcGFyZUFzYy5qcwpmdW5jdGlvbiBjb21wYXJlQXNjKGRhdGVMZWZ0LCBkYXRlUmlnaHQpIHsKICBjb25zdCBkaWZmID0gK3RvRGF0ZShkYXRlTGVmdCkgLSArdG9EYXRlKGRhdGVSaWdodCk7CiAgaWYgKGRpZmYgPCAwKSByZXR1cm4gLTE7CiAgZWxzZSBpZiAoZGlmZiA+IDApIHJldHVybiAxOwogIHJldHVybiBkaWZmOwp9CnZhciBjb21wYXJlQXNjX2RlZmF1bHQ7CnZhciBpbml0X2NvbXBhcmVBc2MgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29tcGFyZUFzYy5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgY29tcGFyZUFzY19kZWZhdWx0ID0gY29tcGFyZUFzYzsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb21wYXJlRGVzYy5qcwpmdW5jdGlvbiBjb21wYXJlRGVzYyhkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7CiAgY29uc3QgZGlmZiA9ICt0b0RhdGUoZGF0ZUxlZnQpIC0gK3RvRGF0ZShkYXRlUmlnaHQpOwogIGlmIChkaWZmID4gMCkgcmV0dXJuIC0xOwogIGVsc2UgaWYgKGRpZmYgPCAwKSByZXR1cm4gMTsKICByZXR1cm4gZGlmZjsKfQp2YXIgY29tcGFyZURlc2NfZGVmYXVsdDsKdmFyIGluaXRfY29tcGFyZURlc2MgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29tcGFyZURlc2MuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGNvbXBhcmVEZXNjX2RlZmF1bHQgPSBjb21wYXJlRGVzYzsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb25zdHJ1Y3ROb3cuanMKZnVuY3Rpb24gY29uc3RydWN0Tm93KGRhdGUpIHsKICByZXR1cm4gY29uc3RydWN0RnJvbShkYXRlLCBEYXRlLm5vdygpKTsKfQp2YXIgY29uc3RydWN0Tm93X2RlZmF1bHQ7CnZhciBpbml0X2NvbnN0cnVjdE5vdyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb25zdHJ1Y3ROb3cuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBjb25zdHJ1Y3ROb3dfZGVmYXVsdCA9IGNvbnN0cnVjdE5vdzsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kYXlzVG9XZWVrcy5qcwpmdW5jdGlvbiBkYXlzVG9XZWVrcyhkYXlzMikgewogIGNvbnN0IHJlc3VsdCA9IE1hdGgudHJ1bmMoZGF5czIgLyBkYXlzSW5XZWVrKTsKICByZXR1cm4gcmVzdWx0ID09PSAwID8gMCA6IHJlc3VsdDsKfQp2YXIgZGF5c1RvV2Vla3NfZGVmYXVsdDsKdmFyIGluaXRfZGF5c1RvV2Vla3MgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGF5c1RvV2Vla3MuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIGRheXNUb1dlZWtzX2RlZmF1bHQgPSBkYXlzVG9XZWVrczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVEYXkuanMKZnVuY3Rpb24gaXNTYW1lRGF5KGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbZGF0ZUxlZnRfLCBkYXRlUmlnaHRfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgcmV0dXJuICtzdGFydE9mRGF5KGRhdGVMZWZ0XykgPT09ICtzdGFydE9mRGF5KGRhdGVSaWdodF8pOwp9CnZhciBpc1NhbWVEYXlfZGVmYXVsdDsKdmFyIGluaXRfaXNTYW1lRGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZURheS5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBpbml0X3N0YXJ0T2ZEYXkoKTsKICAgIGlzU2FtZURheV9kZWZhdWx0ID0gaXNTYW1lRGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzRGF0ZS5qcwpmdW5jdGlvbiBpc0RhdGUodmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMiBpbnN0YW5jZW9mIERhdGUgfHwgdHlwZW9mIHZhbHVlMiA9PT0gIm9iamVjdCIgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlMikgPT09ICJbb2JqZWN0IERhdGVdIjsKfQp2YXIgaXNEYXRlX2RlZmF1bHQ7CnZhciBpbml0X2lzRGF0ZTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNEYXRlLmpzIigpIHsKICAgIGlzRGF0ZV9kZWZhdWx0ID0gaXNEYXRlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVmFsaWQuanMKZnVuY3Rpb24gaXNWYWxpZChkYXRlKSB7CiAgcmV0dXJuICEoIWlzRGF0ZShkYXRlKSAmJiB0eXBlb2YgZGF0ZSAhPT0gIm51bWJlciIgfHwgaXNOYU4oK3RvRGF0ZShkYXRlKSkpOwp9CnZhciBpc1ZhbGlkX2RlZmF1bHQ7CnZhciBpbml0X2lzVmFsaWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNWYWxpZC5qcyIoKSB7CiAgICBpbml0X2lzRGF0ZTIoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpc1ZhbGlkX2RlZmF1bHQgPSBpc1ZhbGlkOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkJ1c2luZXNzRGF5cy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5CdXNpbmVzc0RheXMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICBpZiAoIWlzVmFsaWQobGF0ZXJEYXRlXykgfHwgIWlzVmFsaWQoZWFybGllckRhdGVfKSkgcmV0dXJuIE5hTjsKICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgY29uc3Qgc2lnbiA9IGRpZmYgPCAwID8gLTEgOiAxOwogIGNvbnN0IHdlZWtzID0gTWF0aC50cnVuYyhkaWZmIC8gNyk7CiAgbGV0IHJlc3VsdCA9IHdlZWtzICogNTsKICBsZXQgbW92aW5nRGF0ZSA9IGFkZERheXMoZWFybGllckRhdGVfLCB3ZWVrcyAqIDcpOwogIHdoaWxlICghaXNTYW1lRGF5KGxhdGVyRGF0ZV8sIG1vdmluZ0RhdGUpKSB7CiAgICByZXN1bHQgKz0gaXNXZWVrZW5kKG1vdmluZ0RhdGUsIG9wdGlvbnMpID8gMCA6IHNpZ247CiAgICBtb3ZpbmdEYXRlID0gYWRkRGF5cyhtb3ZpbmdEYXRlLCBzaWduKTsKICB9CiAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7Cn0KdmFyIGRpZmZlcmVuY2VJbkJ1c2luZXNzRGF5c19kZWZhdWx0Owp2YXIgaW5pdF9kaWZmZXJlbmNlSW5CdXNpbmVzc0RheXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQnVzaW5lc3NEYXlzLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplRGF0ZXMoKTsKICAgIGluaXRfYWRkRGF5cygpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoKTsKICAgIGluaXRfaXNTYW1lRGF5KCk7CiAgICBpbml0X2lzVmFsaWQoKTsKICAgIGluaXRfaXNXZWVrZW5kKCk7CiAgICBkaWZmZXJlbmNlSW5CdXNpbmVzc0RheXNfZGVmYXVsdCA9IGRpZmZlcmVuY2VJbkJ1c2luZXNzRGF5czsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtZZWFycy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtZZWFycyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIHJldHVybiBnZXRJU09XZWVrWWVhcihsYXRlckRhdGVfLCBvcHRpb25zKSAtIGdldElTT1dlZWtZZWFyKGVhcmxpZXJEYXRlXywgb3B0aW9ucyk7Cn0KdmFyIGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla1llYXJzX2RlZmF1bHQ7CnZhciBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla1llYXJzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla1llYXJzLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplRGF0ZXMoKTsKICAgIGluaXRfZ2V0SVNPV2Vla1llYXIoKTsKICAgIGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla1llYXJzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtZZWFyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla3MobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICBjb25zdCBzdGFydE9mSVNPV2Vla0xlZnQgPSBzdGFydE9mSVNPV2VlayhsYXRlckRhdGVfKTsKICBjb25zdCBzdGFydE9mSVNPV2Vla1JpZ2h0ID0gc3RhcnRPZklTT1dlZWsoZWFybGllckRhdGVfKTsKICBjb25zdCB0aW1lc3RhbXBMZWZ0ID0gK3N0YXJ0T2ZJU09XZWVrTGVmdCAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoc3RhcnRPZklTT1dlZWtMZWZ0KTsKICBjb25zdCB0aW1lc3RhbXBSaWdodCA9ICtzdGFydE9mSVNPV2Vla1JpZ2h0IC0gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhzdGFydE9mSVNPV2Vla1JpZ2h0KTsKICByZXR1cm4gTWF0aC5yb3VuZCgodGltZXN0YW1wTGVmdCAtIHRpbWVzdGFtcFJpZ2h0KSAvIG1pbGxpc2Vjb25kc0luV2Vlayk7Cn0KdmFyIGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla3NfZGVmYXVsdDsKdmFyIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtzLmpzIigpIHsKICAgIGluaXRfZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcygpOwogICAgaW5pdF9ub3JtYWxpemVEYXRlcygpOwogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIGluaXRfc3RhcnRPZklTT1dlZWsoKTsKICAgIGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla3NfZGVmYXVsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla3M7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMuanMKZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICBjb25zdCB5ZWFyc0RpZmYgPSBsYXRlckRhdGVfLmdldEZ1bGxZZWFyKCkgLSBlYXJsaWVyRGF0ZV8uZ2V0RnVsbFllYXIoKTsKICBjb25zdCBtb250aHNEaWZmID0gbGF0ZXJEYXRlXy5nZXRNb250aCgpIC0gZWFybGllckRhdGVfLmdldE1vbnRoKCk7CiAgcmV0dXJuIHllYXJzRGlmZiAqIDEyICsgbW9udGhzRGlmZjsKfQp2YXIgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHNfZGVmYXVsdDsKdmFyIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMuanMiKCkgewogICAgaW5pdF9ub3JtYWxpemVEYXRlcygpOwogICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHNfZGVmYXVsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFF1YXJ0ZXIuanMKZnVuY3Rpb24gZ2V0UXVhcnRlcihkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IHF1YXJ0ZXIgPSBNYXRoLnRydW5jKF9kYXRlLmdldE1vbnRoKCkgLyAzKSArIDE7CiAgcmV0dXJuIHF1YXJ0ZXI7Cn0KdmFyIGdldFF1YXJ0ZXJfZGVmYXVsdDsKdmFyIGluaXRfZ2V0UXVhcnRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRRdWFydGVyLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBnZXRRdWFydGVyX2RlZmF1bHQgPSBnZXRRdWFydGVyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMuanMKZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGNvbnN0IHllYXJzRGlmZiA9IGxhdGVyRGF0ZV8uZ2V0RnVsbFllYXIoKSAtIGVhcmxpZXJEYXRlXy5nZXRGdWxsWWVhcigpOwogIGNvbnN0IHF1YXJ0ZXJzRGlmZiA9IGdldFF1YXJ0ZXIobGF0ZXJEYXRlXykgLSBnZXRRdWFydGVyKGVhcmxpZXJEYXRlXyk7CiAgcmV0dXJuIHllYXJzRGlmZiAqIDQgKyBxdWFydGVyc0RpZmY7Cn0KdmFyIGRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnNfZGVmYXVsdDsKdmFyIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplRGF0ZXMoKTsKICAgIGluaXRfZ2V0UXVhcnRlcigpOwogICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVyc19kZWZhdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICBjb25zdCBsYXRlclN0YXJ0T2ZXZWVrID0gc3RhcnRPZldlZWsobGF0ZXJEYXRlXywgb3B0aW9ucyk7CiAgY29uc3QgZWFybGllclN0YXJ0T2ZXZWVrID0gc3RhcnRPZldlZWsoZWFybGllckRhdGVfLCBvcHRpb25zKTsKICBjb25zdCBsYXRlclRpbWVzdGFtcCA9ICtsYXRlclN0YXJ0T2ZXZWVrIC0gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhsYXRlclN0YXJ0T2ZXZWVrKTsKICBjb25zdCBlYXJsaWVyVGltZXN0YW1wID0gK2VhcmxpZXJTdGFydE9mV2VlayAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoZWFybGllclN0YXJ0T2ZXZWVrKTsKICByZXR1cm4gTWF0aC5yb3VuZCgobGF0ZXJUaW1lc3RhbXAgLSBlYXJsaWVyVGltZXN0YW1wKSAvIG1pbGxpc2Vjb25kc0luV2Vlayk7Cn0KdmFyIGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3NfZGVmYXVsdDsKdmFyIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzLmpzIigpIHsKICAgIGluaXRfZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcygpOwogICAgaW5pdF9ub3JtYWxpemVEYXRlcygpOwogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIGluaXRfc3RhcnRPZldlZWsoKTsKICAgIGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3NfZGVmYXVsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3M7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgcmV0dXJuIGxhdGVyRGF0ZV8uZ2V0RnVsbFllYXIoKSAtIGVhcmxpZXJEYXRlXy5nZXRGdWxsWWVhcigpOwp9CnZhciBkaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzX2RlZmF1bHQ7CnZhciBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycy5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBkaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkRheXMuanMKZnVuY3Rpb24gZGlmZmVyZW5jZUluRGF5cyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGNvbnN0IHNpZ24gPSBjb21wYXJlTG9jYWxBc2MobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoCiAgICBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKQogICk7CiAgbGF0ZXJEYXRlXy5zZXREYXRlKGxhdGVyRGF0ZV8uZ2V0RGF0ZSgpIC0gc2lnbiAqIGRpZmZlcmVuY2UpOwogIGNvbnN0IGlzTGFzdERheU5vdEZ1bGwgPSBOdW1iZXIoCiAgICBjb21wYXJlTG9jYWxBc2MobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKSA9PT0gLXNpZ24KICApOwogIGNvbnN0IHJlc3VsdCA9IHNpZ24gKiAoZGlmZmVyZW5jZSAtIGlzTGFzdERheU5vdEZ1bGwpOwogIHJldHVybiByZXN1bHQgPT09IDAgPyAwIDogcmVzdWx0Owp9CmZ1bmN0aW9uIGNvbXBhcmVMb2NhbEFzYyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlKSB7CiAgY29uc3QgZGlmZiA9IGxhdGVyRGF0ZS5nZXRGdWxsWWVhcigpIC0gZWFybGllckRhdGUuZ2V0RnVsbFllYXIoKSB8fCBsYXRlckRhdGUuZ2V0TW9udGgoKSAtIGVhcmxpZXJEYXRlLmdldE1vbnRoKCkgfHwgbGF0ZXJEYXRlLmdldERhdGUoKSAtIGVhcmxpZXJEYXRlLmdldERhdGUoKSB8fCBsYXRlckRhdGUuZ2V0SG91cnMoKSAtIGVhcmxpZXJEYXRlLmdldEhvdXJzKCkgfHwgbGF0ZXJEYXRlLmdldE1pbnV0ZXMoKSAtIGVhcmxpZXJEYXRlLmdldE1pbnV0ZXMoKSB8fCBsYXRlckRhdGUuZ2V0U2Vjb25kcygpIC0gZWFybGllckRhdGUuZ2V0U2Vjb25kcygpIHx8IGxhdGVyRGF0ZS5nZXRNaWxsaXNlY29uZHMoKSAtIGVhcmxpZXJEYXRlLmdldE1pbGxpc2Vjb25kcygpOwogIGlmIChkaWZmIDwgMCkgcmV0dXJuIC0xOwogIGlmIChkaWZmID4gMCkgcmV0dXJuIDE7CiAgcmV0dXJuIGRpZmY7Cn0KdmFyIGRpZmZlcmVuY2VJbkRheXNfZGVmYXVsdDsKdmFyIGluaXRfZGlmZmVyZW5jZUluRGF5cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5EYXlzLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplRGF0ZXMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKCk7CiAgICBkaWZmZXJlbmNlSW5EYXlzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5EYXlzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZ2V0Um91bmRpbmdNZXRob2QuanMKZnVuY3Rpb24gZ2V0Um91bmRpbmdNZXRob2QobWV0aG9kKSB7CiAgcmV0dXJuIChudW1iZXIyKSA9PiB7CiAgICBjb25zdCByb3VuZCA9IG1ldGhvZCA/IE1hdGhbbWV0aG9kXSA6IE1hdGgudHJ1bmM7CiAgICBjb25zdCByZXN1bHQgPSByb3VuZChudW1iZXIyKTsKICAgIHJldHVybiByZXN1bHQgPT09IDAgPyAwIDogcmVzdWx0OwogIH07Cn0KdmFyIGluaXRfZ2V0Um91bmRpbmdNZXRob2QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9nZXRSb3VuZGluZ01ldGhvZC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluSG91cnMuanMKZnVuY3Rpb24gZGlmZmVyZW5jZUluSG91cnMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICBjb25zdCBkaWZmID0gKCtsYXRlckRhdGVfIC0gK2VhcmxpZXJEYXRlXykgLyBtaWxsaXNlY29uZHNJbkhvdXI7CiAgcmV0dXJuIGdldFJvdW5kaW5nTWV0aG9kKG9wdGlvbnM/LnJvdW5kaW5nTWV0aG9kKShkaWZmKTsKfQp2YXIgZGlmZmVyZW5jZUluSG91cnNfZGVmYXVsdDsKdmFyIGluaXRfZGlmZmVyZW5jZUluSG91cnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluSG91cnMuanMiKCkgewogICAgaW5pdF9nZXRSb3VuZGluZ01ldGhvZCgpOwogICAgaW5pdF9ub3JtYWxpemVEYXRlcygpOwogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIGRpZmZlcmVuY2VJbkhvdXJzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5Ib3VyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJJU09XZWVrWWVhcnMuanMKZnVuY3Rpb24gc3ViSVNPV2Vla1llYXJzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRJU09XZWVrWWVhcnMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1YklTT1dlZWtZZWFyc19kZWZhdWx0Owp2YXIgaW5pdF9zdWJJU09XZWVrWWVhcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViSVNPV2Vla1llYXJzLmpzIigpIHsKICAgIGluaXRfYWRkSVNPV2Vla1llYXJzKCk7CiAgICBzdWJJU09XZWVrWWVhcnNfZGVmYXVsdCA9IHN1YklTT1dlZWtZZWFyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5JU09XZWVrWWVhcnMuanMKZnVuY3Rpb24gZGlmZmVyZW5jZUluSVNPV2Vla1llYXJzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgY29uc3Qgc2lnbiA9IGNvbXBhcmVBc2MobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICBjb25zdCBkaWZmID0gTWF0aC5hYnMoCiAgICBkaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtZZWFycyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8sIG9wdGlvbnMpCiAgKTsKICBjb25zdCBhZGp1c3RlZERhdGUgPSBzdWJJU09XZWVrWWVhcnMobGF0ZXJEYXRlXywgc2lnbiAqIGRpZmYsIG9wdGlvbnMpOwogIGNvbnN0IGlzTGFzdElTT1dlZWtZZWFyTm90RnVsbCA9IE51bWJlcigKICAgIGNvbXBhcmVBc2MoYWRqdXN0ZWREYXRlLCBlYXJsaWVyRGF0ZV8pID09PSAtc2lnbgogICk7CiAgY29uc3QgcmVzdWx0ID0gc2lnbiAqIChkaWZmIC0gaXNMYXN0SVNPV2Vla1llYXJOb3RGdWxsKTsKICByZXR1cm4gcmVzdWx0ID09PSAwID8gMCA6IHJlc3VsdDsKfQp2YXIgZGlmZmVyZW5jZUluSVNPV2Vla1llYXJzX2RlZmF1bHQ7CnZhciBpbml0X2RpZmZlcmVuY2VJbklTT1dlZWtZZWFycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5JU09XZWVrWWVhcnMuanMiKCkgewogICAgaW5pdF9ub3JtYWxpemVEYXRlcygpOwogICAgaW5pdF9jb21wYXJlQXNjKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla1llYXJzKCk7CiAgICBpbml0X3N1YklTT1dlZWtZZWFycygpOwogICAgZGlmZmVyZW5jZUluSVNPV2Vla1llYXJzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5JU09XZWVrWWVhcnM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbk1pbGxpc2Vjb25kcyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlKSB7CiAgcmV0dXJuICt0b0RhdGUobGF0ZXJEYXRlKSAtICt0b0RhdGUoZWFybGllckRhdGUpOwp9CnZhciBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHNfZGVmYXVsdDsKdmFyIGluaXRfZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbk1pbGxpc2Vjb25kcy5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluTWludXRlcy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5NaW51dGVzKGRhdGVMZWZ0LCBkYXRlUmlnaHQsIG9wdGlvbnMpIHsKICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzKGRhdGVMZWZ0LCBkYXRlUmlnaHQpIC8gbWlsbGlzZWNvbmRzSW5NaW51dGU7CiAgcmV0dXJuIGdldFJvdW5kaW5nTWV0aG9kKG9wdGlvbnM/LnJvdW5kaW5nTWV0aG9kKShkaWZmKTsKfQp2YXIgZGlmZmVyZW5jZUluTWludXRlc19kZWZhdWx0Owp2YXIgaW5pdF9kaWZmZXJlbmNlSW5NaW51dGVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbk1pbnV0ZXMuanMiKCkgewogICAgaW5pdF9nZXRSb3VuZGluZ01ldGhvZCgpOwogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzKCk7CiAgICBkaWZmZXJlbmNlSW5NaW51dGVzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5NaW51dGVzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mRGF5LmpzCmZ1bmN0aW9uIGVuZE9mRGF5KGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgX2RhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIGVuZE9mRGF5X2RlZmF1bHQ7CnZhciBpbml0X2VuZE9mRGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mRGF5LmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBlbmRPZkRheV9kZWZhdWx0ID0gZW5kT2ZEYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZNb250aC5qcwpmdW5jdGlvbiBlbmRPZk1vbnRoKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgbW9udGggPSBfZGF0ZS5nZXRNb250aCgpOwogIF9kYXRlLnNldEZ1bGxZZWFyKF9kYXRlLmdldEZ1bGxZZWFyKCksIG1vbnRoICsgMSwgMCk7CiAgX2RhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIGVuZE9mTW9udGhfZGVmYXVsdDsKdmFyIGluaXRfZW5kT2ZNb250aCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZk1vbnRoLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBlbmRPZk1vbnRoX2RlZmF1bHQgPSBlbmRPZk1vbnRoOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzTGFzdERheU9mTW9udGguanMKZnVuY3Rpb24gaXNMYXN0RGF5T2ZNb250aChkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIHJldHVybiArZW5kT2ZEYXkoX2RhdGUsIG9wdGlvbnMpID09PSArZW5kT2ZNb250aChfZGF0ZSwgb3B0aW9ucyk7Cn0KdmFyIGlzTGFzdERheU9mTW9udGhfZGVmYXVsdDsKdmFyIGluaXRfaXNMYXN0RGF5T2ZNb250aCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0xhc3REYXlPZk1vbnRoLmpzIigpIHsKICAgIGluaXRfZW5kT2ZEYXkoKTsKICAgIGluaXRfZW5kT2ZNb250aCgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGlzTGFzdERheU9mTW9udGhfZGVmYXVsdCA9IGlzTGFzdERheU9mTW9udGg7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluTW9udGhzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbk1vbnRocyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIHdvcmtpbmdMYXRlckRhdGUsIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGNvbnN0IHNpZ24gPSBjb21wYXJlQXNjKHdvcmtpbmdMYXRlckRhdGUsIGVhcmxpZXJEYXRlXyk7CiAgY29uc3QgZGlmZmVyZW5jZSA9IE1hdGguYWJzKAogICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMod29ya2luZ0xhdGVyRGF0ZSwgZWFybGllckRhdGVfKQogICk7CiAgaWYgKGRpZmZlcmVuY2UgPCAxKSByZXR1cm4gMDsKICBpZiAod29ya2luZ0xhdGVyRGF0ZS5nZXRNb250aCgpID09PSAxICYmIHdvcmtpbmdMYXRlckRhdGUuZ2V0RGF0ZSgpID4gMjcpCiAgICB3b3JraW5nTGF0ZXJEYXRlLnNldERhdGUoMzApOwogIHdvcmtpbmdMYXRlckRhdGUuc2V0TW9udGgod29ya2luZ0xhdGVyRGF0ZS5nZXRNb250aCgpIC0gc2lnbiAqIGRpZmZlcmVuY2UpOwogIGxldCBpc0xhc3RNb250aE5vdEZ1bGwgPSBjb21wYXJlQXNjKHdvcmtpbmdMYXRlckRhdGUsIGVhcmxpZXJEYXRlXykgPT09IC1zaWduOwogIGlmIChpc0xhc3REYXlPZk1vbnRoKGxhdGVyRGF0ZV8pICYmIGRpZmZlcmVuY2UgPT09IDEgJiYgY29tcGFyZUFzYyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pID09PSAxKSB7CiAgICBpc0xhc3RNb250aE5vdEZ1bGwgPSBmYWxzZTsKICB9CiAgY29uc3QgcmVzdWx0ID0gc2lnbiAqIChkaWZmZXJlbmNlIC0gK2lzTGFzdE1vbnRoTm90RnVsbCk7CiAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7Cn0KdmFyIGRpZmZlcmVuY2VJbk1vbnRoc19kZWZhdWx0Owp2YXIgaW5pdF9kaWZmZXJlbmNlSW5Nb250aHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluTW9udGhzLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplRGF0ZXMoKTsKICAgIGluaXRfY29tcGFyZUFzYygpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocygpOwogICAgaW5pdF9pc0xhc3REYXlPZk1vbnRoKCk7CiAgICBkaWZmZXJlbmNlSW5Nb250aHNfZGVmYXVsdCA9IGRpZmZlcmVuY2VJbk1vbnRoczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5RdWFydGVycy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5RdWFydGVycyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGlmZiA9IGRpZmZlcmVuY2VJbk1vbnRocyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSAvIDM7CiAgcmV0dXJuIGdldFJvdW5kaW5nTWV0aG9kKG9wdGlvbnM/LnJvdW5kaW5nTWV0aG9kKShkaWZmKTsKfQp2YXIgZGlmZmVyZW5jZUluUXVhcnRlcnNfZGVmYXVsdDsKdmFyIGluaXRfZGlmZmVyZW5jZUluUXVhcnRlcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluUXVhcnRlcnMuanMiKCkgewogICAgaW5pdF9nZXRSb3VuZGluZ01ldGhvZCgpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5Nb250aHMoKTsKICAgIGRpZmZlcmVuY2VJblF1YXJ0ZXJzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5RdWFydGVyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5TZWNvbmRzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJblNlY29uZHMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRpZmYgPSBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSkgLyAxZTM7CiAgcmV0dXJuIGdldFJvdW5kaW5nTWV0aG9kKG9wdGlvbnM/LnJvdW5kaW5nTWV0aG9kKShkaWZmKTsKfQp2YXIgZGlmZmVyZW5jZUluU2Vjb25kc19kZWZhdWx0Owp2YXIgaW5pdF9kaWZmZXJlbmNlSW5TZWNvbmRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJblNlY29uZHMuanMiKCkgewogICAgaW5pdF9nZXRSb3VuZGluZ01ldGhvZCgpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMoKTsKICAgIGRpZmZlcmVuY2VJblNlY29uZHNfZGVmYXVsdCA9IGRpZmZlcmVuY2VJblNlY29uZHM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluV2Vla3MuanMKZnVuY3Rpb24gZGlmZmVyZW5jZUluV2Vla3MobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRpZmYgPSBkaWZmZXJlbmNlSW5EYXlzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIC8gNzsKICByZXR1cm4gZ2V0Um91bmRpbmdNZXRob2Qob3B0aW9ucz8ucm91bmRpbmdNZXRob2QpKGRpZmYpOwp9CnZhciBkaWZmZXJlbmNlSW5XZWVrc19kZWZhdWx0Owp2YXIgaW5pdF9kaWZmZXJlbmNlSW5XZWVrcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5XZWVrcy5qcyIoKSB7CiAgICBpbml0X2dldFJvdW5kaW5nTWV0aG9kKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkRheXMoKTsKICAgIGRpZmZlcmVuY2VJbldlZWtzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5XZWVrczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5ZZWFycy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5ZZWFycyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGNvbnN0IHNpZ24gPSBjb21wYXJlQXNjKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgY29uc3QgZGlmZiA9IE1hdGguYWJzKGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKSk7CiAgbGF0ZXJEYXRlXy5zZXRGdWxsWWVhcigxNTg0KTsKICBlYXJsaWVyRGF0ZV8uc2V0RnVsbFllYXIoMTU4NCk7CiAgY29uc3QgcGFydGlhbCA9IGNvbXBhcmVBc2MobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKSA9PT0gLXNpZ247CiAgY29uc3QgcmVzdWx0ID0gc2lnbiAqIChkaWZmIC0gK3BhcnRpYWwpOwogIHJldHVybiByZXN1bHQgPT09IDAgPyAwIDogcmVzdWx0Owp9CnZhciBkaWZmZXJlbmNlSW5ZZWFyc19kZWZhdWx0Owp2YXIgaW5pdF9kaWZmZXJlbmNlSW5ZZWFycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5ZZWFycy5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBpbml0X2NvbXBhcmVBc2MoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycygpOwogICAgZGlmZmVyZW5jZUluWWVhcnNfZGVmYXVsdCA9IGRpZmZlcmVuY2VJblllYXJzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvbm9ybWFsaXplSW50ZXJ2YWwuanMKZnVuY3Rpb24gbm9ybWFsaXplSW50ZXJ2YWwoY29udGV4dDIsIGludGVydmFsMykgewogIGNvbnN0IFtzdGFydCwgZW5kM10gPSBub3JtYWxpemVEYXRlcyhjb250ZXh0MiwgaW50ZXJ2YWwzLnN0YXJ0LCBpbnRlcnZhbDMuZW5kKTsKICByZXR1cm4geyBzdGFydCwgZW5kOiBlbmQzIH07Cn0KdmFyIGluaXRfbm9ybWFsaXplSW50ZXJ2YWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9ub3JtYWxpemVJbnRlcnZhbC5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaERheU9mSW50ZXJ2YWwuanMKZnVuY3Rpb24gZWFjaERheU9mSW50ZXJ2YWwoaW50ZXJ2YWwzLCBvcHRpb25zKSB7CiAgY29uc3QgeyBzdGFydCwgZW5kOiBlbmQzIH0gPSBub3JtYWxpemVJbnRlcnZhbChvcHRpb25zPy5pbiwgaW50ZXJ2YWwzKTsKICBsZXQgcmV2ZXJzZWQgPSArc3RhcnQgPiArZW5kMzsKICBjb25zdCBlbmRUaW1lID0gcmV2ZXJzZWQgPyArc3RhcnQgOiArZW5kMzsKICBjb25zdCBkYXRlID0gcmV2ZXJzZWQgPyBlbmQzIDogc3RhcnQ7CiAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBsZXQgc3RlcCA9IG9wdGlvbnM/LnN0ZXAgPz8gMTsKICBpZiAoIXN0ZXApIHJldHVybiBbXTsKICBpZiAoc3RlcCA8IDApIHsKICAgIHN0ZXAgPSAtc3RlcDsKICAgIHJldmVyc2VkID0gIXJldmVyc2VkOwogIH0KICBjb25zdCBkYXRlcyA9IFtdOwogIHdoaWxlICgrZGF0ZSA8PSBlbmRUaW1lKSB7CiAgICBkYXRlcy5wdXNoKGNvbnN0cnVjdEZyb20oc3RhcnQsIGRhdGUpKTsKICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIHN0ZXApOwogICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICB9CiAgcmV0dXJuIHJldmVyc2VkID8gZGF0ZXMucmV2ZXJzZSgpIDogZGF0ZXM7Cn0KdmFyIGVhY2hEYXlPZkludGVydmFsX2RlZmF1bHQ7CnZhciBpbml0X2VhY2hEYXlPZkludGVydmFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VhY2hEYXlPZkludGVydmFsLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplSW50ZXJ2YWwoKTsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgZWFjaERheU9mSW50ZXJ2YWxfZGVmYXVsdCA9IGVhY2hEYXlPZkludGVydmFsOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VhY2hIb3VyT2ZJbnRlcnZhbC5qcwpmdW5jdGlvbiBlYWNoSG91ck9mSW50ZXJ2YWwoaW50ZXJ2YWwzLCBvcHRpb25zKSB7CiAgY29uc3QgeyBzdGFydCwgZW5kOiBlbmQzIH0gPSBub3JtYWxpemVJbnRlcnZhbChvcHRpb25zPy5pbiwgaW50ZXJ2YWwzKTsKICBsZXQgcmV2ZXJzZWQgPSArc3RhcnQgPiArZW5kMzsKICBjb25zdCBlbmRUaW1lID0gcmV2ZXJzZWQgPyArc3RhcnQgOiArZW5kMzsKICBjb25zdCBkYXRlID0gcmV2ZXJzZWQgPyBlbmQzIDogc3RhcnQ7CiAgZGF0ZS5zZXRNaW51dGVzKDAsIDAsIDApOwogIGxldCBzdGVwID0gb3B0aW9ucz8uc3RlcCA/PyAxOwogIGlmICghc3RlcCkgcmV0dXJuIFtdOwogIGlmIChzdGVwIDwgMCkgewogICAgc3RlcCA9IC1zdGVwOwogICAgcmV2ZXJzZWQgPSAhcmV2ZXJzZWQ7CiAgfQogIGNvbnN0IGRhdGVzID0gW107CiAgd2hpbGUgKCtkYXRlIDw9IGVuZFRpbWUpIHsKICAgIGRhdGVzLnB1c2goY29uc3RydWN0RnJvbShzdGFydCwgZGF0ZSkpOwogICAgZGF0ZS5zZXRIb3VycyhkYXRlLmdldEhvdXJzKCkgKyBzdGVwKTsKICB9CiAgcmV0dXJuIHJldmVyc2VkID8gZGF0ZXMucmV2ZXJzZSgpIDogZGF0ZXM7Cn0KdmFyIGVhY2hIb3VyT2ZJbnRlcnZhbF9kZWZhdWx0Owp2YXIgaW5pdF9lYWNoSG91ck9mSW50ZXJ2YWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaEhvdXJPZkludGVydmFsLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplSW50ZXJ2YWwoKTsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgZWFjaEhvdXJPZkludGVydmFsX2RlZmF1bHQgPSBlYWNoSG91ck9mSW50ZXJ2YWw7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaE1pbnV0ZU9mSW50ZXJ2YWwuanMKZnVuY3Rpb24gZWFjaE1pbnV0ZU9mSW50ZXJ2YWwoaW50ZXJ2YWwzLCBvcHRpb25zKSB7CiAgY29uc3QgeyBzdGFydCwgZW5kOiBlbmQzIH0gPSBub3JtYWxpemVJbnRlcnZhbChvcHRpb25zPy5pbiwgaW50ZXJ2YWwzKTsKICBzdGFydC5zZXRTZWNvbmRzKDAsIDApOwogIGxldCByZXZlcnNlZCA9ICtzdGFydCA+ICtlbmQzOwogIGNvbnN0IGVuZFRpbWUgPSByZXZlcnNlZCA/ICtzdGFydCA6ICtlbmQzOwogIGxldCBkYXRlID0gcmV2ZXJzZWQgPyBlbmQzIDogc3RhcnQ7CiAgbGV0IHN0ZXAgPSBvcHRpb25zPy5zdGVwID8/IDE7CiAgaWYgKCFzdGVwKSByZXR1cm4gW107CiAgaWYgKHN0ZXAgPCAwKSB7CiAgICBzdGVwID0gLXN0ZXA7CiAgICByZXZlcnNlZCA9ICFyZXZlcnNlZDsKICB9CiAgY29uc3QgZGF0ZXMgPSBbXTsKICB3aGlsZSAoK2RhdGUgPD0gZW5kVGltZSkgewogICAgZGF0ZXMucHVzaChjb25zdHJ1Y3RGcm9tKHN0YXJ0LCBkYXRlKSk7CiAgICBkYXRlID0gYWRkTWludXRlcyhkYXRlLCBzdGVwKTsKICB9CiAgcmV0dXJuIHJldmVyc2VkID8gZGF0ZXMucmV2ZXJzZSgpIDogZGF0ZXM7Cn0KdmFyIGVhY2hNaW51dGVPZkludGVydmFsX2RlZmF1bHQ7CnZhciBpbml0X2VhY2hNaW51dGVPZkludGVydmFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VhY2hNaW51dGVPZkludGVydmFsLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplSW50ZXJ2YWwoKTsKICAgIGluaXRfYWRkTWludXRlcygpOwogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBlYWNoTWludXRlT2ZJbnRlcnZhbF9kZWZhdWx0ID0gZWFjaE1pbnV0ZU9mSW50ZXJ2YWw7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaE1vbnRoT2ZJbnRlcnZhbC5qcwpmdW5jdGlvbiBlYWNoTW9udGhPZkludGVydmFsKGludGVydmFsMywgb3B0aW9ucykgewogIGNvbnN0IHsgc3RhcnQsIGVuZDogZW5kMyB9ID0gbm9ybWFsaXplSW50ZXJ2YWwob3B0aW9ucz8uaW4sIGludGVydmFsMyk7CiAgbGV0IHJldmVyc2VkID0gK3N0YXJ0ID4gK2VuZDM7CiAgY29uc3QgZW5kVGltZSA9IHJldmVyc2VkID8gK3N0YXJ0IDogK2VuZDM7CiAgY29uc3QgZGF0ZSA9IHJldmVyc2VkID8gZW5kMyA6IHN0YXJ0OwogIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgZGF0ZS5zZXREYXRlKDEpOwogIGxldCBzdGVwID0gb3B0aW9ucz8uc3RlcCA/PyAxOwogIGlmICghc3RlcCkgcmV0dXJuIFtdOwogIGlmIChzdGVwIDwgMCkgewogICAgc3RlcCA9IC1zdGVwOwogICAgcmV2ZXJzZWQgPSAhcmV2ZXJzZWQ7CiAgfQogIGNvbnN0IGRhdGVzID0gW107CiAgd2hpbGUgKCtkYXRlIDw9IGVuZFRpbWUpIHsKICAgIGRhdGVzLnB1c2goY29uc3RydWN0RnJvbShzdGFydCwgZGF0ZSkpOwogICAgZGF0ZS5zZXRNb250aChkYXRlLmdldE1vbnRoKCkgKyBzdGVwKTsKICB9CiAgcmV0dXJuIHJldmVyc2VkID8gZGF0ZXMucmV2ZXJzZSgpIDogZGF0ZXM7Cn0KdmFyIGVhY2hNb250aE9mSW50ZXJ2YWxfZGVmYXVsdDsKdmFyIGluaXRfZWFjaE1vbnRoT2ZJbnRlcnZhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoTW9udGhPZkludGVydmFsLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplSW50ZXJ2YWwoKTsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgZWFjaE1vbnRoT2ZJbnRlcnZhbF9kZWZhdWx0ID0gZWFjaE1vbnRoT2ZJbnRlcnZhbDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mUXVhcnRlci5qcwpmdW5jdGlvbiBzdGFydE9mUXVhcnRlcihkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGN1cnJlbnRNb250aCA9IF9kYXRlLmdldE1vbnRoKCk7CiAgY29uc3QgbW9udGggPSBjdXJyZW50TW9udGggLSBjdXJyZW50TW9udGggJSAzOwogIF9kYXRlLnNldE1vbnRoKG1vbnRoLCAxKTsKICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIHN0YXJ0T2ZRdWFydGVyX2RlZmF1bHQ7CnZhciBpbml0X3N0YXJ0T2ZRdWFydGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZRdWFydGVyLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzdGFydE9mUXVhcnRlcl9kZWZhdWx0ID0gc3RhcnRPZlF1YXJ0ZXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaFF1YXJ0ZXJPZkludGVydmFsLmpzCmZ1bmN0aW9uIGVhY2hRdWFydGVyT2ZJbnRlcnZhbChpbnRlcnZhbDMsIG9wdGlvbnMpIHsKICBjb25zdCB7IHN0YXJ0LCBlbmQ6IGVuZDMgfSA9IG5vcm1hbGl6ZUludGVydmFsKG9wdGlvbnM/LmluLCBpbnRlcnZhbDMpOwogIGxldCByZXZlcnNlZCA9ICtzdGFydCA+ICtlbmQzOwogIGNvbnN0IGVuZFRpbWUgPSByZXZlcnNlZCA/ICtzdGFydE9mUXVhcnRlcihzdGFydCkgOiArc3RhcnRPZlF1YXJ0ZXIoZW5kMyk7CiAgbGV0IGRhdGUgPSByZXZlcnNlZCA/IHN0YXJ0T2ZRdWFydGVyKGVuZDMpIDogc3RhcnRPZlF1YXJ0ZXIoc3RhcnQpOwogIGxldCBzdGVwID0gb3B0aW9ucz8uc3RlcCA/PyAxOwogIGlmICghc3RlcCkgcmV0dXJuIFtdOwogIGlmIChzdGVwIDwgMCkgewogICAgc3RlcCA9IC1zdGVwOwogICAgcmV2ZXJzZWQgPSAhcmV2ZXJzZWQ7CiAgfQogIGNvbnN0IGRhdGVzID0gW107CiAgd2hpbGUgKCtkYXRlIDw9IGVuZFRpbWUpIHsKICAgIGRhdGVzLnB1c2goY29uc3RydWN0RnJvbShzdGFydCwgZGF0ZSkpOwogICAgZGF0ZSA9IGFkZFF1YXJ0ZXJzKGRhdGUsIHN0ZXApOwogIH0KICByZXR1cm4gcmV2ZXJzZWQgPyBkYXRlcy5yZXZlcnNlKCkgOiBkYXRlczsKfQp2YXIgZWFjaFF1YXJ0ZXJPZkludGVydmFsX2RlZmF1bHQ7CnZhciBpbml0X2VhY2hRdWFydGVyT2ZJbnRlcnZhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoUXVhcnRlck9mSW50ZXJ2YWwuanMiKCkgewogICAgaW5pdF9ub3JtYWxpemVJbnRlcnZhbCgpOwogICAgaW5pdF9hZGRRdWFydGVycygpOwogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X3N0YXJ0T2ZRdWFydGVyKCk7CiAgICBlYWNoUXVhcnRlck9mSW50ZXJ2YWxfZGVmYXVsdCA9IGVhY2hRdWFydGVyT2ZJbnRlcnZhbDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoV2Vla09mSW50ZXJ2YWwuanMKZnVuY3Rpb24gZWFjaFdlZWtPZkludGVydmFsKGludGVydmFsMywgb3B0aW9ucykgewogIGNvbnN0IHsgc3RhcnQsIGVuZDogZW5kMyB9ID0gbm9ybWFsaXplSW50ZXJ2YWwob3B0aW9ucz8uaW4sIGludGVydmFsMyk7CiAgbGV0IHJldmVyc2VkID0gK3N0YXJ0ID4gK2VuZDM7CiAgY29uc3Qgc3RhcnREYXRlV2VlayA9IHJldmVyc2VkID8gc3RhcnRPZldlZWsoZW5kMywgb3B0aW9ucykgOiBzdGFydE9mV2VlayhzdGFydCwgb3B0aW9ucyk7CiAgY29uc3QgZW5kRGF0ZVdlZWsgPSByZXZlcnNlZCA/IHN0YXJ0T2ZXZWVrKHN0YXJ0LCBvcHRpb25zKSA6IHN0YXJ0T2ZXZWVrKGVuZDMsIG9wdGlvbnMpOwogIHN0YXJ0RGF0ZVdlZWsuc2V0SG91cnMoMTUpOwogIGVuZERhdGVXZWVrLnNldEhvdXJzKDE1KTsKICBjb25zdCBlbmRUaW1lID0gK2VuZERhdGVXZWVrLmdldFRpbWUoKTsKICBsZXQgY3VycmVudERhdGUgPSBzdGFydERhdGVXZWVrOwogIGxldCBzdGVwID0gb3B0aW9ucz8uc3RlcCA/PyAxOwogIGlmICghc3RlcCkgcmV0dXJuIFtdOwogIGlmIChzdGVwIDwgMCkgewogICAgc3RlcCA9IC1zdGVwOwogICAgcmV2ZXJzZWQgPSAhcmV2ZXJzZWQ7CiAgfQogIGNvbnN0IGRhdGVzID0gW107CiAgd2hpbGUgKCtjdXJyZW50RGF0ZSA8PSBlbmRUaW1lKSB7CiAgICBjdXJyZW50RGF0ZS5zZXRIb3VycygwKTsKICAgIGRhdGVzLnB1c2goY29uc3RydWN0RnJvbShzdGFydCwgY3VycmVudERhdGUpKTsKICAgIGN1cnJlbnREYXRlID0gYWRkV2Vla3MoY3VycmVudERhdGUsIHN0ZXApOwogICAgY3VycmVudERhdGUuc2V0SG91cnMoMTUpOwogIH0KICByZXR1cm4gcmV2ZXJzZWQgPyBkYXRlcy5yZXZlcnNlKCkgOiBkYXRlczsKfQp2YXIgZWFjaFdlZWtPZkludGVydmFsX2RlZmF1bHQ7CnZhciBpbml0X2VhY2hXZWVrT2ZJbnRlcnZhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoV2Vla09mSW50ZXJ2YWwuanMiKCkgewogICAgaW5pdF9ub3JtYWxpemVJbnRlcnZhbCgpOwogICAgaW5pdF9hZGRXZWVrcygpOwogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X3N0YXJ0T2ZXZWVrKCk7CiAgICBlYWNoV2Vla09mSW50ZXJ2YWxfZGVmYXVsdCA9IGVhY2hXZWVrT2ZJbnRlcnZhbDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoV2Vla2VuZE9mSW50ZXJ2YWwuanMKZnVuY3Rpb24gZWFjaFdlZWtlbmRPZkludGVydmFsKGludGVydmFsMywgb3B0aW9ucykgewogIGNvbnN0IHsgc3RhcnQsIGVuZDogZW5kMyB9ID0gbm9ybWFsaXplSW50ZXJ2YWwob3B0aW9ucz8uaW4sIGludGVydmFsMyk7CiAgY29uc3QgZGF0ZUludGVydmFsID0gZWFjaERheU9mSW50ZXJ2YWwoeyBzdGFydCwgZW5kOiBlbmQzIH0sIG9wdGlvbnMpOwogIGNvbnN0IHdlZWtlbmRzID0gW107CiAgbGV0IGluZGV4MiA9IDA7CiAgd2hpbGUgKGluZGV4MiA8IGRhdGVJbnRlcnZhbC5sZW5ndGgpIHsKICAgIGNvbnN0IGRhdGUgPSBkYXRlSW50ZXJ2YWxbaW5kZXgyKytdOwogICAgaWYgKGlzV2Vla2VuZChkYXRlKSkgd2Vla2VuZHMucHVzaChjb25zdHJ1Y3RGcm9tKHN0YXJ0LCBkYXRlKSk7CiAgfQogIHJldHVybiB3ZWVrZW5kczsKfQp2YXIgZWFjaFdlZWtlbmRPZkludGVydmFsX2RlZmF1bHQ7CnZhciBpbml0X2VhY2hXZWVrZW5kT2ZJbnRlcnZhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoV2Vla2VuZE9mSW50ZXJ2YWwuanMiKCkgewogICAgaW5pdF9ub3JtYWxpemVJbnRlcnZhbCgpOwogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X2VhY2hEYXlPZkludGVydmFsKCk7CiAgICBpbml0X2lzV2Vla2VuZCgpOwogICAgZWFjaFdlZWtlbmRPZkludGVydmFsX2RlZmF1bHQgPSBlYWNoV2Vla2VuZE9mSW50ZXJ2YWw7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZk1vbnRoLmpzCmZ1bmN0aW9uIHN0YXJ0T2ZNb250aChkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIF9kYXRlLnNldERhdGUoMSk7CiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBzdGFydE9mTW9udGhfZGVmYXVsdDsKdmFyIGluaXRfc3RhcnRPZk1vbnRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZNb250aC5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgc3RhcnRPZk1vbnRoX2RlZmF1bHQgPSBzdGFydE9mTW9udGg7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaFdlZWtlbmRPZk1vbnRoLmpzCmZ1bmN0aW9uIGVhY2hXZWVrZW5kT2ZNb250aChkYXRlLCBvcHRpb25zKSB7CiAgY29uc3Qgc3RhcnQgPSBzdGFydE9mTW9udGgoZGF0ZSwgb3B0aW9ucyk7CiAgY29uc3QgZW5kMyA9IGVuZE9mTW9udGgoZGF0ZSwgb3B0aW9ucyk7CiAgcmV0dXJuIGVhY2hXZWVrZW5kT2ZJbnRlcnZhbCh7IHN0YXJ0LCBlbmQ6IGVuZDMgfSwgb3B0aW9ucyk7Cn0KdmFyIGVhY2hXZWVrZW5kT2ZNb250aF9kZWZhdWx0Owp2YXIgaW5pdF9lYWNoV2Vla2VuZE9mTW9udGggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaFdlZWtlbmRPZk1vbnRoLmpzIigpIHsKICAgIGluaXRfZWFjaFdlZWtlbmRPZkludGVydmFsKCk7CiAgICBpbml0X2VuZE9mTW9udGgoKTsKICAgIGluaXRfc3RhcnRPZk1vbnRoKCk7CiAgICBlYWNoV2Vla2VuZE9mTW9udGhfZGVmYXVsdCA9IGVhY2hXZWVrZW5kT2ZNb250aDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZlllYXIuanMKZnVuY3Rpb24gZW5kT2ZZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7CiAgX2RhdGUuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDApOwogIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBlbmRPZlllYXJfZGVmYXVsdDsKdmFyIGluaXRfZW5kT2ZZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mWWVhci5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZW5kT2ZZZWFyX2RlZmF1bHQgPSBlbmRPZlllYXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZlllYXIuanMKZnVuY3Rpb24gc3RhcnRPZlllYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBkYXRlXy5zZXRGdWxsWWVhcihkYXRlXy5nZXRGdWxsWWVhcigpLCAwLCAxKTsKICBkYXRlXy5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gZGF0ZV87Cn0KdmFyIHN0YXJ0T2ZZZWFyX2RlZmF1bHQ7CnZhciBpbml0X3N0YXJ0T2ZZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZZZWFyLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzdGFydE9mWWVhcl9kZWZhdWx0ID0gc3RhcnRPZlllYXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaFdlZWtlbmRPZlllYXIuanMKZnVuY3Rpb24gZWFjaFdlZWtlbmRPZlllYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IHN0YXJ0ID0gc3RhcnRPZlllYXIoZGF0ZSwgb3B0aW9ucyk7CiAgY29uc3QgZW5kMyA9IGVuZE9mWWVhcihkYXRlLCBvcHRpb25zKTsKICByZXR1cm4gZWFjaFdlZWtlbmRPZkludGVydmFsKHsgc3RhcnQsIGVuZDogZW5kMyB9LCBvcHRpb25zKTsKfQp2YXIgZWFjaFdlZWtlbmRPZlllYXJfZGVmYXVsdDsKdmFyIGluaXRfZWFjaFdlZWtlbmRPZlllYXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaFdlZWtlbmRPZlllYXIuanMiKCkgewogICAgaW5pdF9lYWNoV2Vla2VuZE9mSW50ZXJ2YWwoKTsKICAgIGluaXRfZW5kT2ZZZWFyKCk7CiAgICBpbml0X3N0YXJ0T2ZZZWFyKCk7CiAgICBlYWNoV2Vla2VuZE9mWWVhcl9kZWZhdWx0ID0gZWFjaFdlZWtlbmRPZlllYXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaFllYXJPZkludGVydmFsLmpzCmZ1bmN0aW9uIGVhY2hZZWFyT2ZJbnRlcnZhbChpbnRlcnZhbDMsIG9wdGlvbnMpIHsKICBjb25zdCB7IHN0YXJ0LCBlbmQ6IGVuZDMgfSA9IG5vcm1hbGl6ZUludGVydmFsKG9wdGlvbnM/LmluLCBpbnRlcnZhbDMpOwogIGxldCByZXZlcnNlZCA9ICtzdGFydCA+ICtlbmQzOwogIGNvbnN0IGVuZFRpbWUgPSByZXZlcnNlZCA/ICtzdGFydCA6ICtlbmQzOwogIGNvbnN0IGRhdGUgPSByZXZlcnNlZCA/IGVuZDMgOiBzdGFydDsKICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIGRhdGUuc2V0TW9udGgoMCwgMSk7CiAgbGV0IHN0ZXAgPSBvcHRpb25zPy5zdGVwID8/IDE7CiAgaWYgKCFzdGVwKSByZXR1cm4gW107CiAgaWYgKHN0ZXAgPCAwKSB7CiAgICBzdGVwID0gLXN0ZXA7CiAgICByZXZlcnNlZCA9ICFyZXZlcnNlZDsKICB9CiAgY29uc3QgZGF0ZXMgPSBbXTsKICB3aGlsZSAoK2RhdGUgPD0gZW5kVGltZSkgewogICAgZGF0ZXMucHVzaChjb25zdHJ1Y3RGcm9tKHN0YXJ0LCBkYXRlKSk7CiAgICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIHN0ZXApOwogIH0KICByZXR1cm4gcmV2ZXJzZWQgPyBkYXRlcy5yZXZlcnNlKCkgOiBkYXRlczsKfQp2YXIgZWFjaFllYXJPZkludGVydmFsX2RlZmF1bHQ7CnZhciBpbml0X2VhY2hZZWFyT2ZJbnRlcnZhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoWWVhck9mSW50ZXJ2YWwuanMiKCkgewogICAgaW5pdF9ub3JtYWxpemVJbnRlcnZhbCgpOwogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBlYWNoWWVhck9mSW50ZXJ2YWxfZGVmYXVsdCA9IGVhY2hZZWFyT2ZJbnRlcnZhbDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZkRlY2FkZS5qcwpmdW5jdGlvbiBlbmRPZkRlY2FkZShkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IHllYXIgPSBfZGF0ZS5nZXRGdWxsWWVhcigpOwogIGNvbnN0IGRlY2FkZSA9IDkgKyBNYXRoLmZsb29yKHllYXIgLyAxMCkgKiAxMDsKICBfZGF0ZS5zZXRGdWxsWWVhcihkZWNhZGUsIDExLCAzMSk7CiAgX2RhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIGVuZE9mRGVjYWRlX2RlZmF1bHQ7CnZhciBpbml0X2VuZE9mRGVjYWRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mRGVjYWRlLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBlbmRPZkRlY2FkZV9kZWZhdWx0ID0gZW5kT2ZEZWNhZGU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZIb3VyLmpzCmZ1bmN0aW9uIGVuZE9mSG91cihkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIF9kYXRlLnNldE1pbnV0ZXMoNTksIDU5LCA5OTkpOwogIHJldHVybiBfZGF0ZTsKfQp2YXIgZW5kT2ZIb3VyX2RlZmF1bHQ7CnZhciBpbml0X2VuZE9mSG91ciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZkhvdXIuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGVuZE9mSG91cl9kZWZhdWx0ID0gZW5kT2ZIb3VyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mV2Vlay5qcwpmdW5jdGlvbiBlbmRPZldlZWsoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRlZmF1bHRPcHRpb25zMiA9IGdldERlZmF1bHRPcHRpb25zKCk7CiAgY29uc3Qgd2Vla1N0YXJ0c09uID0gb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi53ZWVrU3RhcnRzT24gPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IDA7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGRheSA9IF9kYXRlLmdldERheSgpOwogIGNvbnN0IGRpZmYgPSAoZGF5IDwgd2Vla1N0YXJ0c09uID8gLTcgOiAwKSArIDYgLSAoZGF5IC0gd2Vla1N0YXJ0c09uKTsKICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSArIGRpZmYpOwogIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBlbmRPZldlZWtfZGVmYXVsdDsKdmFyIGluaXRfZW5kT2ZXZWVrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mV2Vlay5qcyIoKSB7CiAgICBpbml0X2RlZmF1bHRPcHRpb25zKCk7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZW5kT2ZXZWVrX2RlZmF1bHQgPSBlbmRPZldlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZJU09XZWVrLmpzCmZ1bmN0aW9uIGVuZE9mSVNPV2VlayhkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGVuZE9mV2VlayhkYXRlLCB7IC4uLm9wdGlvbnMsIHdlZWtTdGFydHNPbjogMSB9KTsKfQp2YXIgZW5kT2ZJU09XZWVrX2RlZmF1bHQ7CnZhciBpbml0X2VuZE9mSVNPV2VlayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZklTT1dlZWsuanMiKCkgewogICAgaW5pdF9lbmRPZldlZWsoKTsKICAgIGVuZE9mSVNPV2Vla19kZWZhdWx0ID0gZW5kT2ZJU09XZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mSVNPV2Vla1llYXIuanMKZnVuY3Rpb24gZW5kT2ZJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgeWVhciA9IGdldElTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpOwogIGNvbnN0IGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApOwogIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDQpOwogIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgY29uc3QgX2RhdGUgPSBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyLCBvcHRpb25zKTsKICBfZGF0ZS5zZXRNaWxsaXNlY29uZHMoX2RhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgLSAxKTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIGVuZE9mSVNPV2Vla1llYXJfZGVmYXVsdDsKdmFyIGluaXRfZW5kT2ZJU09XZWVrWWVhciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZklTT1dlZWtZZWFyLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF9nZXRJU09XZWVrWWVhcigpOwogICAgaW5pdF9zdGFydE9mSVNPV2VlaygpOwogICAgZW5kT2ZJU09XZWVrWWVhcl9kZWZhdWx0ID0gZW5kT2ZJU09XZWVrWWVhcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZk1pbnV0ZS5qcwpmdW5jdGlvbiBlbmRPZk1pbnV0ZShkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIF9kYXRlLnNldFNlY29uZHMoNTksIDk5OSk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBlbmRPZk1pbnV0ZV9kZWZhdWx0Owp2YXIgaW5pdF9lbmRPZk1pbnV0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZk1pbnV0ZS5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZW5kT2ZNaW51dGVfZGVmYXVsdCA9IGVuZE9mTWludXRlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mUXVhcnRlci5qcwpmdW5jdGlvbiBlbmRPZlF1YXJ0ZXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBjdXJyZW50TW9udGggPSBfZGF0ZS5nZXRNb250aCgpOwogIGNvbnN0IG1vbnRoID0gY3VycmVudE1vbnRoIC0gY3VycmVudE1vbnRoICUgMyArIDM7CiAgX2RhdGUuc2V0TW9udGgobW9udGgsIDApOwogIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBlbmRPZlF1YXJ0ZXJfZGVmYXVsdDsKdmFyIGluaXRfZW5kT2ZRdWFydGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mUXVhcnRlci5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZW5kT2ZRdWFydGVyX2RlZmF1bHQgPSBlbmRPZlF1YXJ0ZXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZTZWNvbmQuanMKZnVuY3Rpb24gZW5kT2ZTZWNvbmQoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRNaWxsaXNlY29uZHMoOTk5KTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIGVuZE9mU2Vjb25kX2RlZmF1bHQ7CnZhciBpbml0X2VuZE9mU2Vjb25kID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mU2Vjb25kLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBlbmRPZlNlY29uZF9kZWZhdWx0ID0gZW5kT2ZTZWNvbmQ7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZUb2RheS5qcwpmdW5jdGlvbiBlbmRPZlRvZGF5KG9wdGlvbnMpIHsKICByZXR1cm4gZW5kT2ZEYXkoRGF0ZS5ub3coKSwgb3B0aW9ucyk7Cn0KdmFyIGVuZE9mVG9kYXlfZGVmYXVsdDsKdmFyIGluaXRfZW5kT2ZUb2RheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZlRvZGF5LmpzIigpIHsKICAgIGluaXRfZW5kT2ZEYXkoKTsKICAgIGVuZE9mVG9kYXlfZGVmYXVsdCA9IGVuZE9mVG9kYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZUb21vcnJvdy5qcwpmdW5jdGlvbiBlbmRPZlRvbW9ycm93KG9wdGlvbnMpIHsKICBjb25zdCBub3cyID0gY29uc3RydWN0Tm93KG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gbm93Mi5nZXRGdWxsWWVhcigpOwogIGNvbnN0IG1vbnRoID0gbm93Mi5nZXRNb250aCgpOwogIGNvbnN0IGRheSA9IG5vdzIuZ2V0RGF0ZSgpOwogIGNvbnN0IGRhdGUgPSBjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4pOwogIGRhdGUuc2V0RnVsbFllYXIoeWVhciwgbW9udGgsIGRheSArIDEpOwogIGRhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTsKICByZXR1cm4gb3B0aW9ucz8uaW4gPyBvcHRpb25zLmluKGRhdGUpIDogZGF0ZTsKfQp2YXIgZW5kT2ZUb21vcnJvd19kZWZhdWx0Owp2YXIgaW5pdF9lbmRPZlRvbW9ycm93ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mVG9tb3Jyb3cuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3ROb3coKTsKICAgIGVuZE9mVG9tb3Jyb3dfZGVmYXVsdCA9IGVuZE9mVG9tb3Jyb3c7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZZZXN0ZXJkYXkuanMKZnVuY3Rpb24gZW5kT2ZZZXN0ZXJkYXkob3B0aW9ucykgewogIGNvbnN0IG5vdzIgPSBjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4pOwogIGNvbnN0IGRhdGUgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluLCAwKTsKICBkYXRlLnNldEZ1bGxZZWFyKG5vdzIuZ2V0RnVsbFllYXIoKSwgbm93Mi5nZXRNb250aCgpLCBub3cyLmdldERhdGUoKSAtIDEpOwogIGRhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTsKICByZXR1cm4gZGF0ZTsKfQp2YXIgZW5kT2ZZZXN0ZXJkYXlfZGVmYXVsdDsKdmFyIGluaXRfZW5kT2ZZZXN0ZXJkYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZZZXN0ZXJkYXkuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X2NvbnN0cnVjdE5vdygpOwogICAgZW5kT2ZZZXN0ZXJkYXlfZGVmYXVsdCA9IGVuZE9mWWVzdGVyZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlLmpzCnZhciBmb3JtYXREaXN0YW5jZUxvY2FsZSwgZm9ybWF0RGlzdGFuY2U7CnZhciBpbml0X2Zvcm1hdERpc3RhbmNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlLmpzIigpIHsKICAgIGZvcm1hdERpc3RhbmNlTG9jYWxlID0gewogICAgICBsZXNzVGhhblhTZWNvbmRzOiB7CiAgICAgICAgb25lOiAibGVzcyB0aGFuIGEgc2Vjb25kIiwKICAgICAgICBvdGhlcjogImxlc3MgdGhhbiB7e2NvdW50fX0gc2Vjb25kcyIKICAgICAgfSwKICAgICAgeFNlY29uZHM6IHsKICAgICAgICBvbmU6ICIxIHNlY29uZCIsCiAgICAgICAgb3RoZXI6ICJ7e2NvdW50fX0gc2Vjb25kcyIKICAgICAgfSwKICAgICAgaGFsZkFNaW51dGU6ICJoYWxmIGEgbWludXRlIiwKICAgICAgbGVzc1RoYW5YTWludXRlczogewogICAgICAgIG9uZTogImxlc3MgdGhhbiBhIG1pbnV0ZSIsCiAgICAgICAgb3RoZXI6ICJsZXNzIHRoYW4ge3tjb3VudH19IG1pbnV0ZXMiCiAgICAgIH0sCiAgICAgIHhNaW51dGVzOiB7CiAgICAgICAgb25lOiAiMSBtaW51dGUiLAogICAgICAgIG90aGVyOiAie3tjb3VudH19IG1pbnV0ZXMiCiAgICAgIH0sCiAgICAgIGFib3V0WEhvdXJzOiB7CiAgICAgICAgb25lOiAiYWJvdXQgMSBob3VyIiwKICAgICAgICBvdGhlcjogImFib3V0IHt7Y291bnR9fSBob3VycyIKICAgICAgfSwKICAgICAgeEhvdXJzOiB7CiAgICAgICAgb25lOiAiMSBob3VyIiwKICAgICAgICBvdGhlcjogInt7Y291bnR9fSBob3VycyIKICAgICAgfSwKICAgICAgeERheXM6IHsKICAgICAgICBvbmU6ICIxIGRheSIsCiAgICAgICAgb3RoZXI6ICJ7e2NvdW50fX0gZGF5cyIKICAgICAgfSwKICAgICAgYWJvdXRYV2Vla3M6IHsKICAgICAgICBvbmU6ICJhYm91dCAxIHdlZWsiLAogICAgICAgIG90aGVyOiAiYWJvdXQge3tjb3VudH19IHdlZWtzIgogICAgICB9LAogICAgICB4V2Vla3M6IHsKICAgICAgICBvbmU6ICIxIHdlZWsiLAogICAgICAgIG90aGVyOiAie3tjb3VudH19IHdlZWtzIgogICAgICB9LAogICAgICBhYm91dFhNb250aHM6IHsKICAgICAgICBvbmU6ICJhYm91dCAxIG1vbnRoIiwKICAgICAgICBvdGhlcjogImFib3V0IHt7Y291bnR9fSBtb250aHMiCiAgICAgIH0sCiAgICAgIHhNb250aHM6IHsKICAgICAgICBvbmU6ICIxIG1vbnRoIiwKICAgICAgICBvdGhlcjogInt7Y291bnR9fSBtb250aHMiCiAgICAgIH0sCiAgICAgIGFib3V0WFllYXJzOiB7CiAgICAgICAgb25lOiAiYWJvdXQgMSB5ZWFyIiwKICAgICAgICBvdGhlcjogImFib3V0IHt7Y291bnR9fSB5ZWFycyIKICAgICAgfSwKICAgICAgeFllYXJzOiB7CiAgICAgICAgb25lOiAiMSB5ZWFyIiwKICAgICAgICBvdGhlcjogInt7Y291bnR9fSB5ZWFycyIKICAgICAgfSwKICAgICAgb3ZlclhZZWFyczogewogICAgICAgIG9uZTogIm92ZXIgMSB5ZWFyIiwKICAgICAgICBvdGhlcjogIm92ZXIge3tjb3VudH19IHllYXJzIgogICAgICB9LAogICAgICBhbG1vc3RYWWVhcnM6IHsKICAgICAgICBvbmU6ICJhbG1vc3QgMSB5ZWFyIiwKICAgICAgICBvdGhlcjogImFsbW9zdCB7e2NvdW50fX0geWVhcnMiCiAgICAgIH0KICAgIH07CiAgICBmb3JtYXREaXN0YW5jZSA9ICh0b2tlbiwgY291bnQyLCBvcHRpb25zKSA9PiB7CiAgICAgIGxldCByZXN1bHQ7CiAgICAgIGNvbnN0IHRva2VuVmFsdWUgPSBmb3JtYXREaXN0YW5jZUxvY2FsZVt0b2tlbl07CiAgICAgIGlmICh0eXBlb2YgdG9rZW5WYWx1ZSA9PT0gInN0cmluZyIpIHsKICAgICAgICByZXN1bHQgPSB0b2tlblZhbHVlOwogICAgICB9IGVsc2UgaWYgKGNvdW50MiA9PT0gMSkgewogICAgICAgIHJlc3VsdCA9IHRva2VuVmFsdWUub25lOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdCA9IHRva2VuVmFsdWUub3RoZXIucmVwbGFjZSgie3tjb3VudH19IiwgY291bnQyLnRvU3RyaW5nKCkpOwogICAgICB9CiAgICAgIGlmIChvcHRpb25zPy5hZGRTdWZmaXgpIHsKICAgICAgICBpZiAob3B0aW9ucy5jb21wYXJpc29uICYmIG9wdGlvbnMuY29tcGFyaXNvbiA+IDApIHsKICAgICAgICAgIHJldHVybiAiaW4gIiArIHJlc3VsdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHJlc3VsdCArICIgYWdvIjsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRGb3JtYXRMb25nRm4uanMKZnVuY3Rpb24gYnVpbGRGb3JtYXRMb25nRm4oYXJncykgewogIHJldHVybiAob3B0aW9ucyA9IHt9KSA9PiB7CiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBhcmdzLmRlZmF1bHRXaWR0aDsKICAgIGNvbnN0IGZvcm1hdDIgPSBhcmdzLmZvcm1hdHNbd2lkdGhdIHx8IGFyZ3MuZm9ybWF0c1thcmdzLmRlZmF1bHRXaWR0aF07CiAgICByZXR1cm4gZm9ybWF0MjsKICB9Owp9CnZhciBpbml0X2J1aWxkRm9ybWF0TG9uZ0ZuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXRMb25nLmpzCnZhciBkYXRlRm9ybWF0cywgdGltZUZvcm1hdHMsIGRhdGVUaW1lRm9ybWF0cywgZm9ybWF0TG9uZzsKdmFyIGluaXRfZm9ybWF0TG9uZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXRMb25nLmpzIigpIHsKICAgIGluaXRfYnVpbGRGb3JtYXRMb25nRm4oKTsKICAgIGRhdGVGb3JtYXRzID0gewogICAgICBmdWxsOiAiRUVFRSwgTU1NTSBkbywgeSIsCiAgICAgIGxvbmc6ICJNTU1NIGRvLCB5IiwKICAgICAgbWVkaXVtOiAiTU1NIGQsIHkiLAogICAgICBzaG9ydDogIk1NL2RkL3l5eXkiCiAgICB9OwogICAgdGltZUZvcm1hdHMgPSB7CiAgICAgIGZ1bGw6ICJoOm1tOnNzIGEgenp6eiIsCiAgICAgIGxvbmc6ICJoOm1tOnNzIGEgeiIsCiAgICAgIG1lZGl1bTogImg6bW06c3MgYSIsCiAgICAgIHNob3J0OiAiaDptbSBhIgogICAgfTsKICAgIGRhdGVUaW1lRm9ybWF0cyA9IHsKICAgICAgZnVsbDogInt7ZGF0ZX19ICdhdCcge3t0aW1lfX0iLAogICAgICBsb25nOiAie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fSIsCiAgICAgIG1lZGl1bTogInt7ZGF0ZX19LCB7e3RpbWV9fSIsCiAgICAgIHNob3J0OiAie3tkYXRlfX0sIHt7dGltZX19IgogICAgfTsKICAgIGZvcm1hdExvbmcgPSB7CiAgICAgIGRhdGU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHsKICAgICAgICBmb3JtYXRzOiBkYXRlRm9ybWF0cywKICAgICAgICBkZWZhdWx0V2lkdGg6ICJmdWxsIgogICAgICB9KSwKICAgICAgdGltZTogYnVpbGRGb3JtYXRMb25nRm4oewogICAgICAgIGZvcm1hdHM6IHRpbWVGb3JtYXRzLAogICAgICAgIGRlZmF1bHRXaWR0aDogImZ1bGwiCiAgICAgIH0pLAogICAgICBkYXRlVGltZTogYnVpbGRGb3JtYXRMb25nRm4oewogICAgICAgIGZvcm1hdHM6IGRhdGVUaW1lRm9ybWF0cywKICAgICAgICBkZWZhdWx0V2lkdGg6ICJmdWxsIgogICAgICB9KQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXRSZWxhdGl2ZS5qcwp2YXIgZm9ybWF0UmVsYXRpdmVMb2NhbGUsIGZvcm1hdFJlbGF0aXZlOwp2YXIgaW5pdF9mb3JtYXRSZWxhdGl2ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXRSZWxhdGl2ZS5qcyIoKSB7CiAgICBmb3JtYXRSZWxhdGl2ZUxvY2FsZSA9IHsKICAgICAgbGFzdFdlZWs6ICInbGFzdCcgZWVlZSAnYXQnIHAiLAogICAgICB5ZXN0ZXJkYXk6ICIneWVzdGVyZGF5IGF0JyBwIiwKICAgICAgdG9kYXk6ICIndG9kYXkgYXQnIHAiLAogICAgICB0b21vcnJvdzogIid0b21vcnJvdyBhdCcgcCIsCiAgICAgIG5leHRXZWVrOiAiZWVlZSAnYXQnIHAiLAogICAgICBvdGhlcjogIlAiCiAgICB9OwogICAgZm9ybWF0UmVsYXRpdmUgPSAodG9rZW4sIF9kYXRlLCBfYmFzZURhdGUsIF9vcHRpb25zKSA9PiBmb3JtYXRSZWxhdGl2ZUxvY2FsZVt0b2tlbl07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRMb2NhbGl6ZUZuLmpzCmZ1bmN0aW9uIGJ1aWxkTG9jYWxpemVGbihhcmdzKSB7CiAgcmV0dXJuICh2YWx1ZTIsIG9wdGlvbnMpID0+IHsKICAgIGNvbnN0IGNvbnRleHQyID0gb3B0aW9ucz8uY29udGV4dCA/IFN0cmluZyhvcHRpb25zLmNvbnRleHQpIDogInN0YW5kYWxvbmUiOwogICAgbGV0IHZhbHVlc0FycmF5OwogICAgaWYgKGNvbnRleHQyID09PSAiZm9ybWF0dGluZyIgJiYgYXJncy5mb3JtYXR0aW5nVmFsdWVzKSB7CiAgICAgIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGFyZ3MuZGVmYXVsdEZvcm1hdHRpbmdXaWR0aCB8fCBhcmdzLmRlZmF1bHRXaWR0aDsKICAgICAgY29uc3Qgd2lkdGggPSBvcHRpb25zPy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGRlZmF1bHRXaWR0aDsKICAgICAgdmFsdWVzQXJyYXkgPSBhcmdzLmZvcm1hdHRpbmdWYWx1ZXNbd2lkdGhdIHx8IGFyZ3MuZm9ybWF0dGluZ1ZhbHVlc1tkZWZhdWx0V2lkdGhdOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gYXJncy5kZWZhdWx0V2lkdGg7CiAgICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucz8ud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBhcmdzLmRlZmF1bHRXaWR0aDsKICAgICAgdmFsdWVzQXJyYXkgPSBhcmdzLnZhbHVlc1t3aWR0aF0gfHwgYXJncy52YWx1ZXNbZGVmYXVsdFdpZHRoXTsKICAgIH0KICAgIGNvbnN0IGluZGV4MiA9IGFyZ3MuYXJndW1lbnRDYWxsYmFjayA/IGFyZ3MuYXJndW1lbnRDYWxsYmFjayh2YWx1ZTIpIDogdmFsdWUyOwogICAgcmV0dXJuIHZhbHVlc0FycmF5W2luZGV4Ml07CiAgfTsKfQp2YXIgaW5pdF9idWlsZExvY2FsaXplRm4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRMb2NhbGl6ZUZuLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9sb2NhbGl6ZS5qcwp2YXIgZXJhVmFsdWVzLCBxdWFydGVyVmFsdWVzLCBtb250aFZhbHVlcywgZGF5VmFsdWVzLCBkYXlQZXJpb2RWYWx1ZXMsIGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMsIG9yZGluYWxOdW1iZXIsIGxvY2FsaXplOwp2YXIgaW5pdF9sb2NhbGl6ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9sb2NhbGl6ZS5qcyIoKSB7CiAgICBpbml0X2J1aWxkTG9jYWxpemVGbigpOwogICAgZXJhVmFsdWVzID0gewogICAgICBuYXJyb3c6IFsiQiIsICJBIl0sCiAgICAgIGFiYnJldmlhdGVkOiBbIkJDIiwgIkFEIl0sCiAgICAgIHdpZGU6IFsiQmVmb3JlIENocmlzdCIsICJBbm5vIERvbWluaSJdCiAgICB9OwogICAgcXVhcnRlclZhbHVlcyA9IHsKICAgICAgbmFycm93OiBbIjEiLCAiMiIsICIzIiwgIjQiXSwKICAgICAgYWJicmV2aWF0ZWQ6IFsiUTEiLCAiUTIiLCAiUTMiLCAiUTQiXSwKICAgICAgd2lkZTogWyIxc3QgcXVhcnRlciIsICIybmQgcXVhcnRlciIsICIzcmQgcXVhcnRlciIsICI0dGggcXVhcnRlciJdCiAgICB9OwogICAgbW9udGhWYWx1ZXMgPSB7CiAgICAgIG5hcnJvdzogWyJKIiwgIkYiLCAiTSIsICJBIiwgIk0iLCAiSiIsICJKIiwgIkEiLCAiUyIsICJPIiwgIk4iLCAiRCJdLAogICAgICBhYmJyZXZpYXRlZDogWwogICAgICAgICJKYW4iLAogICAgICAgICJGZWIiLAogICAgICAgICJNYXIiLAogICAgICAgICJBcHIiLAogICAgICAgICJNYXkiLAogICAgICAgICJKdW4iLAogICAgICAgICJKdWwiLAogICAgICAgICJBdWciLAogICAgICAgICJTZXAiLAogICAgICAgICJPY3QiLAogICAgICAgICJOb3YiLAogICAgICAgICJEZWMiCiAgICAgIF0sCiAgICAgIHdpZGU6IFsKICAgICAgICAiSmFudWFyeSIsCiAgICAgICAgIkZlYnJ1YXJ5IiwKICAgICAgICAiTWFyY2giLAogICAgICAgICJBcHJpbCIsCiAgICAgICAgIk1heSIsCiAgICAgICAgIkp1bmUiLAogICAgICAgICJKdWx5IiwKICAgICAgICAiQXVndXN0IiwKICAgICAgICAiU2VwdGVtYmVyIiwKICAgICAgICAiT2N0b2JlciIsCiAgICAgICAgIk5vdmVtYmVyIiwKICAgICAgICAiRGVjZW1iZXIiCiAgICAgIF0KICAgIH07CiAgICBkYXlWYWx1ZXMgPSB7CiAgICAgIG5hcnJvdzogWyJTIiwgIk0iLCAiVCIsICJXIiwgIlQiLCAiRiIsICJTIl0sCiAgICAgIHNob3J0OiBbIlN1IiwgIk1vIiwgIlR1IiwgIldlIiwgIlRoIiwgIkZyIiwgIlNhIl0sCiAgICAgIGFiYnJldmlhdGVkOiBbIlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCJdLAogICAgICB3aWRlOiBbCiAgICAgICAgIlN1bmRheSIsCiAgICAgICAgIk1vbmRheSIsCiAgICAgICAgIlR1ZXNkYXkiLAogICAgICAgICJXZWRuZXNkYXkiLAogICAgICAgICJUaHVyc2RheSIsCiAgICAgICAgIkZyaWRheSIsCiAgICAgICAgIlNhdHVyZGF5IgogICAgICBdCiAgICB9OwogICAgZGF5UGVyaW9kVmFsdWVzID0gewogICAgICBuYXJyb3c6IHsKICAgICAgICBhbTogImEiLAogICAgICAgIHBtOiAicCIsCiAgICAgICAgbWlkbmlnaHQ6ICJtaSIsCiAgICAgICAgbm9vbjogIm4iLAogICAgICAgIG1vcm5pbmc6ICJtb3JuaW5nIiwKICAgICAgICBhZnRlcm5vb246ICJhZnRlcm5vb24iLAogICAgICAgIGV2ZW5pbmc6ICJldmVuaW5nIiwKICAgICAgICBuaWdodDogIm5pZ2h0IgogICAgICB9LAogICAgICBhYmJyZXZpYXRlZDogewogICAgICAgIGFtOiAiQU0iLAogICAgICAgIHBtOiAiUE0iLAogICAgICAgIG1pZG5pZ2h0OiAibWlkbmlnaHQiLAogICAgICAgIG5vb246ICJub29uIiwKICAgICAgICBtb3JuaW5nOiAibW9ybmluZyIsCiAgICAgICAgYWZ0ZXJub29uOiAiYWZ0ZXJub29uIiwKICAgICAgICBldmVuaW5nOiAiZXZlbmluZyIsCiAgICAgICAgbmlnaHQ6ICJuaWdodCIKICAgICAgfSwKICAgICAgd2lkZTogewogICAgICAgIGFtOiAiYS5tLiIsCiAgICAgICAgcG06ICJwLm0uIiwKICAgICAgICBtaWRuaWdodDogIm1pZG5pZ2h0IiwKICAgICAgICBub29uOiAibm9vbiIsCiAgICAgICAgbW9ybmluZzogIm1vcm5pbmciLAogICAgICAgIGFmdGVybm9vbjogImFmdGVybm9vbiIsCiAgICAgICAgZXZlbmluZzogImV2ZW5pbmciLAogICAgICAgIG5pZ2h0OiAibmlnaHQiCiAgICAgIH0KICAgIH07CiAgICBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzID0gewogICAgICBuYXJyb3c6IHsKICAgICAgICBhbTogImEiLAogICAgICAgIHBtOiAicCIsCiAgICAgICAgbWlkbmlnaHQ6ICJtaSIsCiAgICAgICAgbm9vbjogIm4iLAogICAgICAgIG1vcm5pbmc6ICJpbiB0aGUgbW9ybmluZyIsCiAgICAgICAgYWZ0ZXJub29uOiAiaW4gdGhlIGFmdGVybm9vbiIsCiAgICAgICAgZXZlbmluZzogImluIHRoZSBldmVuaW5nIiwKICAgICAgICBuaWdodDogImF0IG5pZ2h0IgogICAgICB9LAogICAgICBhYmJyZXZpYXRlZDogewogICAgICAgIGFtOiAiQU0iLAogICAgICAgIHBtOiAiUE0iLAogICAgICAgIG1pZG5pZ2h0OiAibWlkbmlnaHQiLAogICAgICAgIG5vb246ICJub29uIiwKICAgICAgICBtb3JuaW5nOiAiaW4gdGhlIG1vcm5pbmciLAogICAgICAgIGFmdGVybm9vbjogImluIHRoZSBhZnRlcm5vb24iLAogICAgICAgIGV2ZW5pbmc6ICJpbiB0aGUgZXZlbmluZyIsCiAgICAgICAgbmlnaHQ6ICJhdCBuaWdodCIKICAgICAgfSwKICAgICAgd2lkZTogewogICAgICAgIGFtOiAiYS5tLiIsCiAgICAgICAgcG06ICJwLm0uIiwKICAgICAgICBtaWRuaWdodDogIm1pZG5pZ2h0IiwKICAgICAgICBub29uOiAibm9vbiIsCiAgICAgICAgbW9ybmluZzogImluIHRoZSBtb3JuaW5nIiwKICAgICAgICBhZnRlcm5vb246ICJpbiB0aGUgYWZ0ZXJub29uIiwKICAgICAgICBldmVuaW5nOiAiaW4gdGhlIGV2ZW5pbmciLAogICAgICAgIG5pZ2h0OiAiYXQgbmlnaHQiCiAgICAgIH0KICAgIH07CiAgICBvcmRpbmFsTnVtYmVyID0gKGRpcnR5TnVtYmVyLCBfb3B0aW9ucykgPT4gewogICAgICBjb25zdCBudW1iZXIyID0gTnVtYmVyKGRpcnR5TnVtYmVyKTsKICAgICAgY29uc3QgcmVtMTAwID0gbnVtYmVyMiAlIDEwMDsKICAgICAgaWYgKHJlbTEwMCA+IDIwIHx8IHJlbTEwMCA8IDEwKSB7CiAgICAgICAgc3dpdGNoIChyZW0xMDAgJSAxMCkgewogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICByZXR1cm4gbnVtYmVyMiArICJzdCI7CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIHJldHVybiBudW1iZXIyICsgIm5kIjsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgcmV0dXJuIG51bWJlcjIgKyAicmQiOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbnVtYmVyMiArICJ0aCI7CiAgICB9OwogICAgbG9jYWxpemUgPSB7CiAgICAgIG9yZGluYWxOdW1iZXIsCiAgICAgIGVyYTogYnVpbGRMb2NhbGl6ZUZuKHsKICAgICAgICB2YWx1ZXM6IGVyYVZhbHVlcywKICAgICAgICBkZWZhdWx0V2lkdGg6ICJ3aWRlIgogICAgICB9KSwKICAgICAgcXVhcnRlcjogYnVpbGRMb2NhbGl6ZUZuKHsKICAgICAgICB2YWx1ZXM6IHF1YXJ0ZXJWYWx1ZXMsCiAgICAgICAgZGVmYXVsdFdpZHRoOiAid2lkZSIsCiAgICAgICAgYXJndW1lbnRDYWxsYmFjazogKHF1YXJ0ZXIpID0+IHF1YXJ0ZXIgLSAxCiAgICAgIH0pLAogICAgICBtb250aDogYnVpbGRMb2NhbGl6ZUZuKHsKICAgICAgICB2YWx1ZXM6IG1vbnRoVmFsdWVzLAogICAgICAgIGRlZmF1bHRXaWR0aDogIndpZGUiCiAgICAgIH0pLAogICAgICBkYXk6IGJ1aWxkTG9jYWxpemVGbih7CiAgICAgICAgdmFsdWVzOiBkYXlWYWx1ZXMsCiAgICAgICAgZGVmYXVsdFdpZHRoOiAid2lkZSIKICAgICAgfSksCiAgICAgIGRheVBlcmlvZDogYnVpbGRMb2NhbGl6ZUZuKHsKICAgICAgICB2YWx1ZXM6IGRheVBlcmlvZFZhbHVlcywKICAgICAgICBkZWZhdWx0V2lkdGg6ICJ3aWRlIiwKICAgICAgICBmb3JtYXR0aW5nVmFsdWVzOiBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzLAogICAgICAgIGRlZmF1bHRGb3JtYXR0aW5nV2lkdGg6ICJ3aWRlIgogICAgICB9KQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZE1hdGNoRm4uanMKZnVuY3Rpb24gYnVpbGRNYXRjaEZuKGFyZ3MpIHsKICByZXR1cm4gKHN0cmluZzMsIG9wdGlvbnMgPSB7fSkgPT4gewogICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoOwogICAgY29uc3QgbWF0Y2hQYXR0ZXJuID0gd2lkdGggJiYgYXJncy5tYXRjaFBhdHRlcm5zW3dpZHRoXSB8fCBhcmdzLm1hdGNoUGF0dGVybnNbYXJncy5kZWZhdWx0TWF0Y2hXaWR0aF07CiAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHN0cmluZzMubWF0Y2gobWF0Y2hQYXR0ZXJuKTsKICAgIGlmICghbWF0Y2hSZXN1bHQpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07CiAgICBjb25zdCBwYXJzZVBhdHRlcm5zID0gd2lkdGggJiYgYXJncy5wYXJzZVBhdHRlcm5zW3dpZHRoXSB8fCBhcmdzLnBhcnNlUGF0dGVybnNbYXJncy5kZWZhdWx0UGFyc2VXaWR0aF07CiAgICBjb25zdCBrZXkyID0gQXJyYXkuaXNBcnJheShwYXJzZVBhdHRlcm5zKSA/IGZpbmRJbmRleDIocGFyc2VQYXR0ZXJucywgKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKSkgOiAoCiAgICAgIC8vIFtUT0RPXSAtLSBJIGNoYWxsZW5nZSB5b3UgdG8gZml4IHRoZSB0eXBlCiAgICAgIGZpbmRLZXkocGFyc2VQYXR0ZXJucywgKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKSkKICAgICk7CiAgICBsZXQgdmFsdWUyOwogICAgdmFsdWUyID0gYXJncy52YWx1ZUNhbGxiYWNrID8gYXJncy52YWx1ZUNhbGxiYWNrKGtleTIpIDoga2V5MjsKICAgIHZhbHVlMiA9IG9wdGlvbnMudmFsdWVDYWxsYmFjayA/ICgKICAgICAgLy8gW1RPRE9dIC0tIEkgY2hhbGxlbmdlIHlvdSB0byBmaXggdGhlIHR5cGUKICAgICAgb3B0aW9ucy52YWx1ZUNhbGxiYWNrKHZhbHVlMikKICAgICkgOiB2YWx1ZTI7CiAgICBjb25zdCByZXN0ID0gc3RyaW5nMy5zbGljZShtYXRjaGVkU3RyaW5nLmxlbmd0aCk7CiAgICByZXR1cm4geyB2YWx1ZTogdmFsdWUyLCByZXN0IH07CiAgfTsKfQpmdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgcHJlZGljYXRlKSB7CiAgZm9yIChjb25zdCBrZXkyIGluIG9iamVjdCkgewogICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleTIpICYmIHByZWRpY2F0ZShvYmplY3Rba2V5Ml0pKSB7CiAgICAgIHJldHVybiBrZXkyOwogICAgfQogIH0KICByZXR1cm4gdm9pZCAwOwp9CmZ1bmN0aW9uIGZpbmRJbmRleDIoYXJyYXksIHByZWRpY2F0ZSkgewogIGZvciAobGV0IGtleTIgPSAwOyBrZXkyIDwgYXJyYXkubGVuZ3RoOyBrZXkyKyspIHsKICAgIGlmIChwcmVkaWNhdGUoYXJyYXlba2V5Ml0pKSB7CiAgICAgIHJldHVybiBrZXkyOwogICAgfQogIH0KICByZXR1cm4gdm9pZCAwOwp9CnZhciBpbml0X2J1aWxkTWF0Y2hGbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZE1hdGNoRm4uanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4uanMKZnVuY3Rpb24gYnVpbGRNYXRjaFBhdHRlcm5GbihhcmdzKSB7CiAgcmV0dXJuIChzdHJpbmczLCBvcHRpb25zID0ge30pID0+IHsKICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gc3RyaW5nMy5tYXRjaChhcmdzLm1hdGNoUGF0dGVybik7CiAgICBpZiAoIW1hdGNoUmVzdWx0KSByZXR1cm4gbnVsbDsKICAgIGNvbnN0IG1hdGNoZWRTdHJpbmcgPSBtYXRjaFJlc3VsdFswXTsKICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gc3RyaW5nMy5tYXRjaChhcmdzLnBhcnNlUGF0dGVybik7CiAgICBpZiAoIXBhcnNlUmVzdWx0KSByZXR1cm4gbnVsbDsKICAgIGxldCB2YWx1ZTIgPSBhcmdzLnZhbHVlQ2FsbGJhY2sgPyBhcmdzLnZhbHVlQ2FsbGJhY2socGFyc2VSZXN1bHRbMF0pIDogcGFyc2VSZXN1bHRbMF07CiAgICB2YWx1ZTIgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2sgPyBvcHRpb25zLnZhbHVlQ2FsbGJhY2sodmFsdWUyKSA6IHZhbHVlMjsKICAgIGNvbnN0IHJlc3QgPSBzdHJpbmczLnNsaWNlKG1hdGNoZWRTdHJpbmcubGVuZ3RoKTsKICAgIHJldHVybiB7IHZhbHVlOiB2YWx1ZTIsIHJlc3QgfTsKICB9Owp9CnZhciBpbml0X2J1aWxkTWF0Y2hQYXR0ZXJuRm4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRNYXRjaFBhdHRlcm5Gbi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvbWF0Y2guanMKdmFyIG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4sIHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4sIG1hdGNoRXJhUGF0dGVybnMsIHBhcnNlRXJhUGF0dGVybnMsIG1hdGNoUXVhcnRlclBhdHRlcm5zLCBwYXJzZVF1YXJ0ZXJQYXR0ZXJucywgbWF0Y2hNb250aFBhdHRlcm5zLCBwYXJzZU1vbnRoUGF0dGVybnMsIG1hdGNoRGF5UGF0dGVybnMsIHBhcnNlRGF5UGF0dGVybnMsIG1hdGNoRGF5UGVyaW9kUGF0dGVybnMsIHBhcnNlRGF5UGVyaW9kUGF0dGVybnMsIG1hdGNoOwp2YXIgaW5pdF9tYXRjaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9tYXRjaC5qcyIoKSB7CiAgICBpbml0X2J1aWxkTWF0Y2hGbigpOwogICAgaW5pdF9idWlsZE1hdGNoUGF0dGVybkZuKCk7CiAgICBtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuID0gL14oXGQrKSh0aHxzdHxuZHxyZCk/L2k7CiAgICBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuID0gL1xkKy9pOwogICAgbWF0Y2hFcmFQYXR0ZXJucyA9IHsKICAgICAgbmFycm93OiAvXihifGEpL2ksCiAgICAgIGFiYnJldmlhdGVkOiAvXihiXC4/XHM/Y1wuP3xiXC4/XHM/Y1wuP1xzP2VcLj98YVwuP1xzP2RcLj98Y1wuP1xzP2VcLj8pL2ksCiAgICAgIHdpZGU6IC9eKGJlZm9yZSBjaHJpc3R8YmVmb3JlIGNvbW1vbiBlcmF8YW5ubyBkb21pbml8Y29tbW9uIGVyYSkvaQogICAgfTsKICAgIHBhcnNlRXJhUGF0dGVybnMgPSB7CiAgICAgIGFueTogWy9eYi9pLCAvXihhfGMpL2ldCiAgICB9OwogICAgbWF0Y2hRdWFydGVyUGF0dGVybnMgPSB7CiAgICAgIG5hcnJvdzogL15bMTIzNF0vaSwKICAgICAgYWJicmV2aWF0ZWQ6IC9ecVsxMjM0XS9pLAogICAgICB3aWRlOiAvXlsxMjM0XSh0aHxzdHxuZHxyZCk/IHF1YXJ0ZXIvaQogICAgfTsKICAgIHBhcnNlUXVhcnRlclBhdHRlcm5zID0gewogICAgICBhbnk6IFsvMS9pLCAvMi9pLCAvMy9pLCAvNC9pXQogICAgfTsKICAgIG1hdGNoTW9udGhQYXR0ZXJucyA9IHsKICAgICAgbmFycm93OiAvXltqZm1hc29uZF0vaSwKICAgICAgYWJicmV2aWF0ZWQ6IC9eKGphbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwfG9jdHxub3Z8ZGVjKS9pLAogICAgICB3aWRlOiAvXihqYW51YXJ5fGZlYnJ1YXJ5fG1hcmNofGFwcmlsfG1heXxqdW5lfGp1bHl8YXVndXN0fHNlcHRlbWJlcnxvY3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyKS9pCiAgICB9OwogICAgcGFyc2VNb250aFBhdHRlcm5zID0gewogICAgICBuYXJyb3c6IFsKICAgICAgICAvXmovaSwKICAgICAgICAvXmYvaSwKICAgICAgICAvXm0vaSwKICAgICAgICAvXmEvaSwKICAgICAgICAvXm0vaSwKICAgICAgICAvXmovaSwKICAgICAgICAvXmovaSwKICAgICAgICAvXmEvaSwKICAgICAgICAvXnMvaSwKICAgICAgICAvXm8vaSwKICAgICAgICAvXm4vaSwKICAgICAgICAvXmQvaQogICAgICBdLAogICAgICBhbnk6IFsKICAgICAgICAvXmphL2ksCiAgICAgICAgL15mL2ksCiAgICAgICAgL15tYXIvaSwKICAgICAgICAvXmFwL2ksCiAgICAgICAgL15tYXkvaSwKICAgICAgICAvXmp1bi9pLAogICAgICAgIC9eanVsL2ksCiAgICAgICAgL15hdS9pLAogICAgICAgIC9ecy9pLAogICAgICAgIC9eby9pLAogICAgICAgIC9ebi9pLAogICAgICAgIC9eZC9pCiAgICAgIF0KICAgIH07CiAgICBtYXRjaERheVBhdHRlcm5zID0gewogICAgICBuYXJyb3c6IC9eW3NtdHdmXS9pLAogICAgICBzaG9ydDogL14oc3V8bW98dHV8d2V8dGh8ZnJ8c2EpL2ksCiAgICAgIGFiYnJldmlhdGVkOiAvXihzdW58bW9ufHR1ZXx3ZWR8dGh1fGZyaXxzYXQpL2ksCiAgICAgIHdpZGU6IC9eKHN1bmRheXxtb25kYXl8dHVlc2RheXx3ZWRuZXNkYXl8dGh1cnNkYXl8ZnJpZGF5fHNhdHVyZGF5KS9pCiAgICB9OwogICAgcGFyc2VEYXlQYXR0ZXJucyA9IHsKICAgICAgbmFycm93OiBbL15zL2ksIC9ebS9pLCAvXnQvaSwgL153L2ksIC9edC9pLCAvXmYvaSwgL15zL2ldLAogICAgICBhbnk6IFsvXnN1L2ksIC9ebS9pLCAvXnR1L2ksIC9edy9pLCAvXnRoL2ksIC9eZi9pLCAvXnNhL2ldCiAgICB9OwogICAgbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyA9IHsKICAgICAgbmFycm93OiAvXihhfHB8bWl8bnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksCiAgICAgIGFueTogL14oW2FwXVwuP1xzP21cLj98bWlkbmlnaHR8bm9vbnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2kKICAgIH07CiAgICBwYXJzZURheVBlcmlvZFBhdHRlcm5zID0gewogICAgICBhbnk6IHsKICAgICAgICBhbTogL15hL2ksCiAgICAgICAgcG06IC9ecC9pLAogICAgICAgIG1pZG5pZ2h0OiAvXm1pL2ksCiAgICAgICAgbm9vbjogL15uby9pLAogICAgICAgIG1vcm5pbmc6IC9tb3JuaW5nL2ksCiAgICAgICAgYWZ0ZXJub29uOiAvYWZ0ZXJub29uL2ksCiAgICAgICAgZXZlbmluZzogL2V2ZW5pbmcvaSwKICAgICAgICBuaWdodDogL25pZ2h0L2kKICAgICAgfQogICAgfTsKICAgIG1hdGNoID0gewogICAgICBvcmRpbmFsTnVtYmVyOiBidWlsZE1hdGNoUGF0dGVybkZuKHsKICAgICAgICBtYXRjaFBhdHRlcm46IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4sCiAgICAgICAgcGFyc2VQYXR0ZXJuOiBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuLAogICAgICAgIHZhbHVlQ2FsbGJhY2s6ICh2YWx1ZTIpID0+IHBhcnNlSW50KHZhbHVlMiwgMTApCiAgICAgIH0pLAogICAgICBlcmE6IGJ1aWxkTWF0Y2hGbih7CiAgICAgICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hFcmFQYXR0ZXJucywKICAgICAgICBkZWZhdWx0TWF0Y2hXaWR0aDogIndpZGUiLAogICAgICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRXJhUGF0dGVybnMsCiAgICAgICAgZGVmYXVsdFBhcnNlV2lkdGg6ICJhbnkiCiAgICAgIH0pLAogICAgICBxdWFydGVyOiBidWlsZE1hdGNoRm4oewogICAgICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoUXVhcnRlclBhdHRlcm5zLAogICAgICAgIGRlZmF1bHRNYXRjaFdpZHRoOiAid2lkZSIsCiAgICAgICAgcGFyc2VQYXR0ZXJuczogcGFyc2VRdWFydGVyUGF0dGVybnMsCiAgICAgICAgZGVmYXVsdFBhcnNlV2lkdGg6ICJhbnkiLAogICAgICAgIHZhbHVlQ2FsbGJhY2s6IChpbmRleDIpID0+IGluZGV4MiArIDEKICAgICAgfSksCiAgICAgIG1vbnRoOiBidWlsZE1hdGNoRm4oewogICAgICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoTW9udGhQYXR0ZXJucywKICAgICAgICBkZWZhdWx0TWF0Y2hXaWR0aDogIndpZGUiLAogICAgICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlTW9udGhQYXR0ZXJucywKICAgICAgICBkZWZhdWx0UGFyc2VXaWR0aDogImFueSIKICAgICAgfSksCiAgICAgIGRheTogYnVpbGRNYXRjaEZuKHsKICAgICAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBhdHRlcm5zLAogICAgICAgIGRlZmF1bHRNYXRjaFdpZHRoOiAid2lkZSIsCiAgICAgICAgcGFyc2VQYXR0ZXJuczogcGFyc2VEYXlQYXR0ZXJucywKICAgICAgICBkZWZhdWx0UGFyc2VXaWR0aDogImFueSIKICAgICAgfSksCiAgICAgIGRheVBlcmlvZDogYnVpbGRNYXRjaEZuKHsKICAgICAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBlcmlvZFBhdHRlcm5zLAogICAgICAgIGRlZmF1bHRNYXRjaFdpZHRoOiAiYW55IiwKICAgICAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBlcmlvZFBhdHRlcm5zLAogICAgICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAiYW55IgogICAgICB9KQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMuanMKdmFyIGVuVVMsIGVuX1VTX2RlZmF1bHQ7CnZhciBpbml0X2VuX1VTID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy5qcyIoKSB7CiAgICBpbml0X2Zvcm1hdERpc3RhbmNlKCk7CiAgICBpbml0X2Zvcm1hdExvbmcoKTsKICAgIGluaXRfZm9ybWF0UmVsYXRpdmUoKTsKICAgIGluaXRfbG9jYWxpemUoKTsKICAgIGluaXRfbWF0Y2goKTsKICAgIGVuVVMgPSB7CiAgICAgIGNvZGU6ICJlbi1VUyIsCiAgICAgIGZvcm1hdERpc3RhbmNlLAogICAgICBmb3JtYXRMb25nLAogICAgICBmb3JtYXRSZWxhdGl2ZSwKICAgICAgbG9jYWxpemUsCiAgICAgIG1hdGNoLAogICAgICBvcHRpb25zOiB7CiAgICAgICAgd2Vla1N0YXJ0c09uOiAwLAogICAgICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogMQogICAgICB9CiAgICB9OwogICAgZW5fVVNfZGVmYXVsdCA9IGVuVVM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9kZWZhdWx0TG9jYWxlLmpzCnZhciBpbml0X2RlZmF1bHRMb2NhbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9kZWZhdWx0TG9jYWxlLmpzIigpIHsKICAgIGluaXRfZW5fVVMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREYXlPZlllYXIuanMKZnVuY3Rpb24gZ2V0RGF5T2ZZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgZGlmZiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhfZGF0ZSwgc3RhcnRPZlllYXIoX2RhdGUpKTsKICBjb25zdCBkYXlPZlllYXIgPSBkaWZmICsgMTsKICByZXR1cm4gZGF5T2ZZZWFyOwp9CnZhciBnZXREYXlPZlllYXJfZGVmYXVsdDsKdmFyIGluaXRfZ2V0RGF5T2ZZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERheU9mWWVhci5qcyIoKSB7CiAgICBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cygpOwogICAgaW5pdF9zdGFydE9mWWVhcigpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGdldERheU9mWWVhcl9kZWZhdWx0ID0gZ2V0RGF5T2ZZZWFyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT1dlZWsuanMKZnVuY3Rpb24gZ2V0SVNPV2VlayhkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGRpZmYgPSArc3RhcnRPZklTT1dlZWsoX2RhdGUpIC0gK3N0YXJ0T2ZJU09XZWVrWWVhcihfZGF0ZSk7CiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIG1pbGxpc2Vjb25kc0luV2VlaykgKyAxOwp9CnZhciBnZXRJU09XZWVrX2RlZmF1bHQ7CnZhciBpbml0X2dldElTT1dlZWsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SVNPV2Vlay5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgaW5pdF9zdGFydE9mSVNPV2VlaygpOwogICAgaW5pdF9zdGFydE9mSVNPV2Vla1llYXIoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBnZXRJU09XZWVrX2RlZmF1bHQgPSBnZXRJU09XZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFdlZWtZZWFyLmpzCmZ1bmN0aW9uIGdldFdlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCBmaXJzdFdlZWtDb250YWluc0RhdGUgPSBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gZGVmYXVsdE9wdGlvbnMyLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gMTsKICBjb25zdCBmaXJzdFdlZWtPZk5leHRZZWFyID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTsKICBmaXJzdFdlZWtPZk5leHRZZWFyLnNldEZ1bGxZZWFyKHllYXIgKyAxLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpOwogIGZpcnN0V2Vla09mTmV4dFllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgY29uc3Qgc3RhcnRPZk5leHRZZWFyID0gc3RhcnRPZldlZWsoZmlyc3RXZWVrT2ZOZXh0WWVhciwgb3B0aW9ucyk7CiAgY29uc3QgZmlyc3RXZWVrT2ZUaGlzWWVhciA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgMCk7CiAgZmlyc3RXZWVrT2ZUaGlzWWVhci5zZXRGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpOwogIGZpcnN0V2Vla09mVGhpc1llYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgY29uc3Qgc3RhcnRPZlRoaXNZZWFyID0gc3RhcnRPZldlZWsoZmlyc3RXZWVrT2ZUaGlzWWVhciwgb3B0aW9ucyk7CiAgaWYgKCtfZGF0ZSA+PSArc3RhcnRPZk5leHRZZWFyKSB7CiAgICByZXR1cm4geWVhciArIDE7CiAgfSBlbHNlIGlmICgrX2RhdGUgPj0gK3N0YXJ0T2ZUaGlzWWVhcikgewogICAgcmV0dXJuIHllYXI7CiAgfSBlbHNlIHsKICAgIHJldHVybiB5ZWFyIC0gMTsKICB9Cn0KdmFyIGdldFdlZWtZZWFyX2RlZmF1bHQ7CnZhciBpbml0X2dldFdlZWtZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFdlZWtZZWFyLmpzIigpIHsKICAgIGluaXRfZGVmYXVsdE9wdGlvbnMoKTsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF9zdGFydE9mV2VlaygpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGdldFdlZWtZZWFyX2RlZmF1bHQgPSBnZXRXZWVrWWVhcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mV2Vla1llYXIuanMKZnVuY3Rpb24gc3RhcnRPZldlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBkZWZhdWx0T3B0aW9uczIuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyAxOwogIGNvbnN0IHllYXIgPSBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKTsKICBjb25zdCBmaXJzdFdlZWsgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApOwogIGZpcnN0V2Vlay5zZXRGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpOwogIGZpcnN0V2Vlay5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBjb25zdCBfZGF0ZSA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vlaywgb3B0aW9ucyk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBzdGFydE9mV2Vla1llYXJfZGVmYXVsdDsKdmFyIGluaXRfc3RhcnRPZldlZWtZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZXZWVrWWVhci5qcyIoKSB7CiAgICBpbml0X2RlZmF1bHRPcHRpb25zKCk7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfZ2V0V2Vla1llYXIoKTsKICAgIGluaXRfc3RhcnRPZldlZWsoKTsKICAgIHN0YXJ0T2ZXZWVrWWVhcl9kZWZhdWx0ID0gc3RhcnRPZldlZWtZZWFyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFdlZWsuanMKZnVuY3Rpb24gZ2V0V2VlayhkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGRpZmYgPSArc3RhcnRPZldlZWsoX2RhdGUsIG9wdGlvbnMpIC0gK3N0YXJ0T2ZXZWVrWWVhcihfZGF0ZSwgb3B0aW9ucyk7CiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIG1pbGxpc2Vjb25kc0luV2VlaykgKyAxOwp9CnZhciBnZXRXZWVrX2RlZmF1bHQ7CnZhciBpbml0X2dldFdlZWsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0V2Vlay5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgaW5pdF9zdGFydE9mV2VlaygpOwogICAgaW5pdF9zdGFydE9mV2Vla1llYXIoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBnZXRXZWVrX2RlZmF1bHQgPSBnZXRXZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvYWRkTGVhZGluZ1plcm9zLmpzCmZ1bmN0aW9uIGFkZExlYWRpbmdaZXJvcyhudW1iZXIyLCB0YXJnZXRMZW5ndGgpIHsKICBjb25zdCBzaWduID0gbnVtYmVyMiA8IDAgPyAiLSIgOiAiIjsKICBjb25zdCBvdXRwdXQgPSBNYXRoLmFicyhudW1iZXIyKS50b1N0cmluZygpLnBhZFN0YXJ0KHRhcmdldExlbmd0aCwgIjAiKTsKICByZXR1cm4gc2lnbiArIG91dHB1dDsKfQp2YXIgaW5pdF9hZGRMZWFkaW5nWmVyb3MgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9hZGRMZWFkaW5nWmVyb3MuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZm9ybWF0L2xpZ2h0Rm9ybWF0dGVycy5qcwp2YXIgbGlnaHRGb3JtYXR0ZXJzOwp2YXIgaW5pdF9saWdodEZvcm1hdHRlcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9mb3JtYXQvbGlnaHRGb3JtYXR0ZXJzLmpzIigpIHsKICAgIGluaXRfYWRkTGVhZGluZ1plcm9zKCk7CiAgICBsaWdodEZvcm1hdHRlcnMgPSB7CiAgICAgIC8vIFllYXIKICAgICAgeShkYXRlLCB0b2tlbikgewogICAgICAgIGNvbnN0IHNpZ25lZFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CiAgICAgICAgY29uc3QgeWVhciA9IHNpZ25lZFllYXIgPiAwID8gc2lnbmVkWWVhciA6IDEgLSBzaWduZWRZZWFyOwogICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3ModG9rZW4gPT09ICJ5eSIgPyB5ZWFyICUgMTAwIDogeWVhciwgdG9rZW4ubGVuZ3RoKTsKICAgICAgfSwKICAgICAgLy8gTW9udGgKICAgICAgTShkYXRlLCB0b2tlbikgewogICAgICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpOwogICAgICAgIHJldHVybiB0b2tlbiA9PT0gIk0iID8gU3RyaW5nKG1vbnRoICsgMSkgOiBhZGRMZWFkaW5nWmVyb3MobW9udGggKyAxLCAyKTsKICAgICAgfSwKICAgICAgLy8gRGF5IG9mIHRoZSBtb250aAogICAgICBkKGRhdGUsIHRva2VuKSB7CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldERhdGUoKSwgdG9rZW4ubGVuZ3RoKTsKICAgICAgfSwKICAgICAgLy8gQU0gb3IgUE0KICAgICAgYShkYXRlLCB0b2tlbikgewogICAgICAgIGNvbnN0IGRheVBlcmlvZEVudW1WYWx1ZSA9IGRhdGUuZ2V0SG91cnMoKSAvIDEyID49IDEgPyAicG0iIDogImFtIjsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICBjYXNlICJhIjoKICAgICAgICAgIGNhc2UgImFhIjoKICAgICAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgY2FzZSAiYWFhIjoKICAgICAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZTsKICAgICAgICAgIGNhc2UgImFhYWFhIjoKICAgICAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZVswXTsKICAgICAgICAgIGNhc2UgImFhYWEiOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZSA9PT0gImFtIiA/ICJhLm0uIiA6ICJwLm0uIjsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIEhvdXIgWzEtMTJdCiAgICAgIGgoZGF0ZSwgdG9rZW4pIHsKICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0SG91cnMoKSAlIDEyIHx8IDEyLCB0b2tlbi5sZW5ndGgpOwogICAgICB9LAogICAgICAvLyBIb3VyIFswLTIzXQogICAgICBIKGRhdGUsIHRva2VuKSB7CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldEhvdXJzKCksIHRva2VuLmxlbmd0aCk7CiAgICAgIH0sCiAgICAgIC8vIE1pbnV0ZQogICAgICBtKGRhdGUsIHRva2VuKSB7CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldE1pbnV0ZXMoKSwgdG9rZW4ubGVuZ3RoKTsKICAgICAgfSwKICAgICAgLy8gU2Vjb25kCiAgICAgIHMoZGF0ZSwgdG9rZW4pIHsKICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0U2Vjb25kcygpLCB0b2tlbi5sZW5ndGgpOwogICAgICB9LAogICAgICAvLyBGcmFjdGlvbiBvZiBzZWNvbmQKICAgICAgUyhkYXRlLCB0b2tlbikgewogICAgICAgIGNvbnN0IG51bWJlck9mRGlnaXRzID0gdG9rZW4ubGVuZ3RoOwogICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kczIgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpOwogICAgICAgIGNvbnN0IGZyYWN0aW9uYWxTZWNvbmRzID0gTWF0aC50cnVuYygKICAgICAgICAgIG1pbGxpc2Vjb25kczIgKiBNYXRoLnBvdygxMCwgbnVtYmVyT2ZEaWdpdHMgLSAzKQogICAgICAgICk7CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhmcmFjdGlvbmFsU2Vjb25kcywgdG9rZW4ubGVuZ3RoKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2Zvcm1hdC9mb3JtYXR0ZXJzLmpzCmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lU2hvcnQob2Zmc2V0LCBkZWxpbWl0ZXIgPSAiIikgewogIGNvbnN0IHNpZ24gPSBvZmZzZXQgPiAwID8gIi0iIDogIisiOwogIGNvbnN0IGFic09mZnNldCA9IE1hdGguYWJzKG9mZnNldCk7CiAgY29uc3QgaG91cnMgPSBNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKTsKICBjb25zdCBtaW51dGVzID0gYWJzT2Zmc2V0ICUgNjA7CiAgaWYgKG1pbnV0ZXMgPT09IDApIHsKICAgIHJldHVybiBzaWduICsgU3RyaW5nKGhvdXJzKTsKICB9CiAgcmV0dXJuIHNpZ24gKyBTdHJpbmcoaG91cnMpICsgZGVsaW1pdGVyICsgYWRkTGVhZGluZ1plcm9zKG1pbnV0ZXMsIDIpOwp9CmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyhvZmZzZXQsIGRlbGltaXRlcikgewogIGlmIChvZmZzZXQgJSA2MCA9PT0gMCkgewogICAgY29uc3Qgc2lnbiA9IG9mZnNldCA+IDAgPyAiLSIgOiAiKyI7CiAgICByZXR1cm4gc2lnbiArIGFkZExlYWRpbmdaZXJvcyhNYXRoLmFicyhvZmZzZXQpIC8gNjAsIDIpOwogIH0KICByZXR1cm4gZm9ybWF0VGltZXpvbmUob2Zmc2V0LCBkZWxpbWl0ZXIpOwp9CmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lKG9mZnNldCwgZGVsaW1pdGVyID0gIiIpIHsKICBjb25zdCBzaWduID0gb2Zmc2V0ID4gMCA/ICItIiA6ICIrIjsKICBjb25zdCBhYnNPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpOwogIGNvbnN0IGhvdXJzID0gYWRkTGVhZGluZ1plcm9zKE1hdGgudHJ1bmMoYWJzT2Zmc2V0IC8gNjApLCAyKTsKICBjb25zdCBtaW51dGVzID0gYWRkTGVhZGluZ1plcm9zKGFic09mZnNldCAlIDYwLCAyKTsKICByZXR1cm4gc2lnbiArIGhvdXJzICsgZGVsaW1pdGVyICsgbWludXRlczsKfQp2YXIgZGF5UGVyaW9kRW51bSwgZm9ybWF0dGVyczsKdmFyIGluaXRfZm9ybWF0dGVycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2Zvcm1hdC9mb3JtYXR0ZXJzLmpzIigpIHsKICAgIGluaXRfZ2V0RGF5T2ZZZWFyKCk7CiAgICBpbml0X2dldElTT1dlZWsoKTsKICAgIGluaXRfZ2V0SVNPV2Vla1llYXIoKTsKICAgIGluaXRfZ2V0V2VlaygpOwogICAgaW5pdF9nZXRXZWVrWWVhcigpOwogICAgaW5pdF9hZGRMZWFkaW5nWmVyb3MoKTsKICAgIGluaXRfbGlnaHRGb3JtYXR0ZXJzKCk7CiAgICBkYXlQZXJpb2RFbnVtID0gewogICAgICBhbTogImFtIiwKICAgICAgcG06ICJwbSIsCiAgICAgIG1pZG5pZ2h0OiAibWlkbmlnaHQiLAogICAgICBub29uOiAibm9vbiIsCiAgICAgIG1vcm5pbmc6ICJtb3JuaW5nIiwKICAgICAgYWZ0ZXJub29uOiAiYWZ0ZXJub29uIiwKICAgICAgZXZlbmluZzogImV2ZW5pbmciLAogICAgICBuaWdodDogIm5pZ2h0IgogICAgfTsKICAgIGZvcm1hdHRlcnMgPSB7CiAgICAgIC8vIEVyYQogICAgICBHOiBmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICAgICAgY29uc3QgZXJhID0gZGF0ZS5nZXRGdWxsWWVhcigpID4gMCA/IDEgOiAwOwogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIC8vIEFELCBCQwogICAgICAgICAgY2FzZSAiRyI6CiAgICAgICAgICBjYXNlICJHRyI6CiAgICAgICAgICBjYXNlICJHR0ciOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmVyYShlcmEsIHsgd2lkdGg6ICJhYmJyZXZpYXRlZCIgfSk7CiAgICAgICAgICAvLyBBLCBCCiAgICAgICAgICBjYXNlICJHR0dHRyI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZXJhKGVyYSwgeyB3aWR0aDogIm5hcnJvdyIgfSk7CiAgICAgICAgICAvLyBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdAogICAgICAgICAgY2FzZSAiR0dHRyI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmVyYShlcmEsIHsgd2lkdGg6ICJ3aWRlIiB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIFllYXIKICAgICAgeTogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgICAgIGlmICh0b2tlbiA9PT0gInlvIikgewogICAgICAgICAgY29uc3Qgc2lnbmVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgICAgICAgIGNvbnN0IHllYXIgPSBzaWduZWRZZWFyID4gMCA/IHNpZ25lZFllYXIgOiAxIC0gc2lnbmVkWWVhcjsKICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcih5ZWFyLCB7IHVuaXQ6ICJ5ZWFyIiB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy55KGRhdGUsIHRva2VuKTsKICAgICAgfSwKICAgICAgLy8gTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhcgogICAgICBZOiBmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyLCBvcHRpb25zKSB7CiAgICAgICAgY29uc3Qgc2lnbmVkV2Vla1llYXIgPSBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKTsKICAgICAgICBjb25zdCB3ZWVrWWVhciA9IHNpZ25lZFdlZWtZZWFyID4gMCA/IHNpZ25lZFdlZWtZZWFyIDogMSAtIHNpZ25lZFdlZWtZZWFyOwogICAgICAgIGlmICh0b2tlbiA9PT0gIllZIikgewogICAgICAgICAgY29uc3QgdHdvRGlnaXRZZWFyID0gd2Vla1llYXIgJSAxMDA7CiAgICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHR3b0RpZ2l0WWVhciwgMik7CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlbiA9PT0gIllvIikgewogICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKHdlZWtZZWFyLCB7IHVuaXQ6ICJ5ZWFyIiB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh3ZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTsKICAgICAgfSwKICAgICAgLy8gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIKICAgICAgUjogZnVuY3Rpb24oZGF0ZSwgdG9rZW4pIHsKICAgICAgICBjb25zdCBpc29XZWVrWWVhciA9IGdldElTT1dlZWtZZWFyKGRhdGUpOwogICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaXNvV2Vla1llYXIsIHRva2VuLmxlbmd0aCk7CiAgICAgIH0sCiAgICAgIC8vIEV4dGVuZGVkIHllYXIuIFRoaXMgaXMgYSBzaW5nbGUgbnVtYmVyIGRlc2lnbmF0aW5nIHRoZSB5ZWFyIG9mIHRoaXMgY2FsZW5kYXIgc3lzdGVtLgogICAgICAvLyBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gYHlgIGFuZCBgdWAgbG9jYWxpemVycyBhcmUgQi5DLiB5ZWFyczoKICAgICAgLy8gfCBZZWFyIHwgYHlgIHwgYHVgIHwKICAgICAgLy8gfC0tLS0tLXwtLS0tLXwtLS0tLXwKICAgICAgLy8gfCBBQyAxIHwgICAxIHwgICAxIHwKICAgICAgLy8gfCBCQyAxIHwgICAxIHwgICAwIHwKICAgICAgLy8gfCBCQyAyIHwgICAyIHwgIC0xIHwKICAgICAgLy8gQWxzbyBgeXlgIGFsd2F5cyByZXR1cm5zIHRoZSBsYXN0IHR3byBkaWdpdHMgb2YgYSB5ZWFyLAogICAgICAvLyB3aGlsZSBgdXVgIHBhZHMgc2luZ2xlIGRpZ2l0IHllYXJzIHRvIDIgY2hhcmFjdGVycyBhbmQgcmV0dXJucyBvdGhlciB5ZWFycyB1bmNoYW5nZWQuCiAgICAgIHU6IGZ1bmN0aW9uKGRhdGUsIHRva2VuKSB7CiAgICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHllYXIsIHRva2VuLmxlbmd0aCk7CiAgICAgIH0sCiAgICAgIC8vIFF1YXJ0ZXIKICAgICAgUTogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgICAgIGNvbnN0IHF1YXJ0ZXIgPSBNYXRoLmNlaWwoKGRhdGUuZ2V0TW9udGgoKSArIDEpIC8gMyk7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgLy8gMSwgMiwgMywgNAogICAgICAgICAgY2FzZSAiUSI6CiAgICAgICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7CiAgICAgICAgICAvLyAwMSwgMDIsIDAzLCAwNAogICAgICAgICAgY2FzZSAiUVEiOgogICAgICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHF1YXJ0ZXIsIDIpOwogICAgICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoCiAgICAgICAgICBjYXNlICJRbyI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihxdWFydGVyLCB7IHVuaXQ6ICJxdWFydGVyIiB9KTsKICAgICAgICAgIC8vIFExLCBRMiwgUTMsIFE0CiAgICAgICAgICBjYXNlICJRUVEiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLnF1YXJ0ZXIocXVhcnRlciwgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKQogICAgICAgICAgY2FzZSAiUVFRUVEiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLnF1YXJ0ZXIocXVhcnRlciwgewogICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLgogICAgICAgICAgY2FzZSAiUVFRUSI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLnF1YXJ0ZXIocXVhcnRlciwgewogICAgICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgLy8gU3RhbmQtYWxvbmUgcXVhcnRlcgogICAgICBxOiBmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICAgICAgY29uc3QgcXVhcnRlciA9IE1hdGguY2VpbCgoZGF0ZS5nZXRNb250aCgpICsgMSkgLyAzKTsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAvLyAxLCAyLCAzLCA0CiAgICAgICAgICBjYXNlICJxIjoKICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhxdWFydGVyKTsKICAgICAgICAgIC8vIDAxLCAwMiwgMDMsIDA0CiAgICAgICAgICBjYXNlICJxcSI6CiAgICAgICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MocXVhcnRlciwgMik7CiAgICAgICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGgKICAgICAgICAgIGNhc2UgInFvIjoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKHF1YXJ0ZXIsIHsgdW5pdDogInF1YXJ0ZXIiIH0pOwogICAgICAgICAgLy8gUTEsIFEyLCBRMywgUTQKICAgICAgICAgIGNhc2UgInFxcSI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIucXVhcnRlcihxdWFydGVyLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgICAgIH0pOwogICAgICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpCiAgICAgICAgICBjYXNlICJxcXFxcSI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIucXVhcnRlcihxdWFydGVyLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uCiAgICAgICAgICBjYXNlICJxcXFxIjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIucXVhcnRlcihxdWFydGVyLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICAvLyBNb250aAogICAgICBNOiBmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICAgICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgY2FzZSAiTSI6CiAgICAgICAgICBjYXNlICJNTSI6CiAgICAgICAgICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuTShkYXRlLCB0b2tlbik7CiAgICAgICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoCiAgICAgICAgICBjYXNlICJNbyI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihtb250aCArIDEsIHsgdW5pdDogIm1vbnRoIiB9KTsKICAgICAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlYwogICAgICAgICAgY2FzZSAiTU1NIjoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5tb250aChtb250aCwgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIEosIEYsIC4uLiwgRAogICAgICAgICAgY2FzZSAiTU1NTU0iOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLm1vbnRoKG1vbnRoLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyCiAgICAgICAgICBjYXNlICJNTU1NIjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIubW9udGgobW9udGgsIHsgd2lkdGg6ICJ3aWRlIiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgLy8gU3RhbmQtYWxvbmUgbW9udGgKICAgICAgTDogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpOwogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIC8vIDEsIDIsIC4uLiwgMTIKICAgICAgICAgIGNhc2UgIkwiOgogICAgICAgICAgICByZXR1cm4gU3RyaW5nKG1vbnRoICsgMSk7CiAgICAgICAgICAvLyAwMSwgMDIsIC4uLiwgMTIKICAgICAgICAgIGNhc2UgIkxMIjoKICAgICAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhtb250aCArIDEsIDIpOwogICAgICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aAogICAgICAgICAgY2FzZSAiTG8iOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6ICJtb250aCIgfSk7CiAgICAgICAgICAvLyBKYW4sIEZlYiwgLi4uLCBEZWMKICAgICAgICAgIGNhc2UgIkxMTCI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIubW9udGgobW9udGgsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyBKLCBGLCAuLi4sIEQKICAgICAgICAgIGNhc2UgIkxMTExMIjoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5tb250aChtb250aCwgewogICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlcgogICAgICAgICAgY2FzZSAiTExMTCI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiAid2lkZSIsIGNvbnRleHQ6ICJzdGFuZGFsb25lIiB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIExvY2FsIHdlZWsgb2YgeWVhcgogICAgICB3OiBmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyLCBvcHRpb25zKSB7CiAgICAgICAgY29uc3Qgd2VlayA9IGdldFdlZWsoZGF0ZSwgb3B0aW9ucyk7CiAgICAgICAgaWYgKHRva2VuID09PSAid28iKSB7CiAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIod2VlaywgeyB1bml0OiAid2VlayIgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3Mod2VlaywgdG9rZW4ubGVuZ3RoKTsKICAgICAgfSwKICAgICAgLy8gSVNPIHdlZWsgb2YgeWVhcgogICAgICBJOiBmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICAgICAgY29uc3QgaXNvV2VlayA9IGdldElTT1dlZWsoZGF0ZSk7CiAgICAgICAgaWYgKHRva2VuID09PSAiSW8iKSB7CiAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIoaXNvV2VlaywgeyB1bml0OiAid2VlayIgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaXNvV2VlaywgdG9rZW4ubGVuZ3RoKTsKICAgICAgfSwKICAgICAgLy8gRGF5IG9mIHRoZSBtb250aAogICAgICBkOiBmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICAgICAgaWYgKHRva2VuID09PSAiZG8iKSB7CiAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXREYXRlKCksIHsgdW5pdDogImRhdGUiIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLmQoZGF0ZSwgdG9rZW4pOwogICAgICB9LAogICAgICAvLyBEYXkgb2YgeWVhcgogICAgICBEOiBmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICAgICAgY29uc3QgZGF5T2ZZZWFyID0gZ2V0RGF5T2ZZZWFyKGRhdGUpOwogICAgICAgIGlmICh0b2tlbiA9PT0gIkRvIikgewogICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGRheU9mWWVhciwgeyB1bml0OiAiZGF5T2ZZZWFyIiB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXlPZlllYXIsIHRva2VuLmxlbmd0aCk7CiAgICAgIH0sCiAgICAgIC8vIERheSBvZiB3ZWVrCiAgICAgIEU6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgICAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpOwogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIC8vIFR1ZQogICAgICAgICAgY2FzZSAiRSI6CiAgICAgICAgICBjYXNlICJFRSI6CiAgICAgICAgICBjYXNlICJFRUUiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyBUCiAgICAgICAgICBjYXNlICJFRUVFRSI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyBUdQogICAgICAgICAgY2FzZSAiRUVFRUVFIjoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXkoZGF5T2ZXZWVrLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJzaG9ydCIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgICAgLy8gVHVlc2RheQogICAgICAgICAgY2FzZSAiRUVFRSI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgICAgICB3aWR0aDogIndpZGUiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIExvY2FsIGRheSBvZiB3ZWVrCiAgICAgIGU6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIsIG9wdGlvbnMpIHsKICAgICAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpOwogICAgICAgIGNvbnN0IGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgLy8gTnVtZXJpY2FsIHZhbHVlIChOdGggZGF5IG9mIHdlZWsgd2l0aCBjdXJyZW50IGxvY2FsZSBvciB3ZWVrU3RhcnRzT24pCiAgICAgICAgICBjYXNlICJlIjoKICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhsb2NhbERheU9mV2Vlayk7CiAgICAgICAgICAvLyBQYWRkZWQgbnVtZXJpY2FsIHZhbHVlCiAgICAgICAgICBjYXNlICJlZSI6CiAgICAgICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MobG9jYWxEYXlPZldlZWssIDIpOwogICAgICAgICAgLy8gMXN0LCAybmQsIC4uLiwgN3RoCiAgICAgICAgICBjYXNlICJlbyI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiAiZGF5IiB9KTsKICAgICAgICAgIGNhc2UgImVlZSI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIFQKICAgICAgICAgIGNhc2UgImVlZWVlIjoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXkoZGF5T2ZXZWVrLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIFR1CiAgICAgICAgICBjYXNlICJlZWVlZWUiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgICAgICB3aWR0aDogInNob3J0IiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyBUdWVzZGF5CiAgICAgICAgICBjYXNlICJlZWVlIjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgLy8gU3RhbmQtYWxvbmUgbG9jYWwgZGF5IG9mIHdlZWsKICAgICAgYzogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMiwgb3B0aW9ucykgewogICAgICAgIGNvbnN0IGRheU9mV2VlayA9IGRhdGUuZ2V0RGF5KCk7CiAgICAgICAgY29uc3QgbG9jYWxEYXlPZldlZWsgPSAoZGF5T2ZXZWVrIC0gb3B0aW9ucy53ZWVrU3RhcnRzT24gKyA4KSAlIDcgfHwgNzsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAvLyBOdW1lcmljYWwgdmFsdWUgKHNhbWUgYXMgaW4gYGVgKQogICAgICAgICAgY2FzZSAiYyI6CiAgICAgICAgICAgIHJldHVybiBTdHJpbmcobG9jYWxEYXlPZldlZWspOwogICAgICAgICAgLy8gUGFkZGVkIG51bWVyaWNhbCB2YWx1ZQogICAgICAgICAgY2FzZSAiY2MiOgogICAgICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGxvY2FsRGF5T2ZXZWVrLCB0b2tlbi5sZW5ndGgpOwogICAgICAgICAgLy8gMXN0LCAybmQsIC4uLiwgN3RoCiAgICAgICAgICBjYXNlICJjbyI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiAiZGF5IiB9KTsKICAgICAgICAgIGNhc2UgImNjYyI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIFQKICAgICAgICAgIGNhc2UgImNjY2NjIjoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXkoZGF5T2ZXZWVrLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIFR1CiAgICAgICAgICBjYXNlICJjY2NjY2MiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgICAgICB3aWR0aDogInNob3J0IiwKICAgICAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyBUdWVzZGF5CiAgICAgICAgICBjYXNlICJjY2NjIjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgLy8gSVNPIGRheSBvZiB3ZWVrCiAgICAgIGk6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgICAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpOwogICAgICAgIGNvbnN0IGlzb0RheU9mV2VlayA9IGRheU9mV2VlayA9PT0gMCA/IDcgOiBkYXlPZldlZWs7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgLy8gMgogICAgICAgICAgY2FzZSAiaSI6CiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoaXNvRGF5T2ZXZWVrKTsKICAgICAgICAgIC8vIDAyCiAgICAgICAgICBjYXNlICJpaSI6CiAgICAgICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaXNvRGF5T2ZXZWVrLCB0b2tlbi5sZW5ndGgpOwogICAgICAgICAgLy8gMm5kCiAgICAgICAgICBjYXNlICJpbyI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihpc29EYXlPZldlZWssIHsgdW5pdDogImRheSIgfSk7CiAgICAgICAgICAvLyBUdWUKICAgICAgICAgIGNhc2UgImlpaSI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIFQKICAgICAgICAgIGNhc2UgImlpaWlpIjoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXkoZGF5T2ZXZWVrLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIFR1CiAgICAgICAgICBjYXNlICJpaWlpaWkiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgICAgICB3aWR0aDogInNob3J0IiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyBUdWVzZGF5CiAgICAgICAgICBjYXNlICJpaWlpIjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgLy8gQU0gb3IgUE0KICAgICAgYTogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpOwogICAgICAgIGNvbnN0IGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/ICJwbSIgOiAiYW0iOwogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIGNhc2UgImEiOgogICAgICAgICAgY2FzZSAiYWEiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlICJhYWEiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSkudG9Mb3dlckNhc2UoKTsKICAgICAgICAgIGNhc2UgImFhYWFhIjoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIGNhc2UgImFhYWEiOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICAvLyBBTSwgUE0sIG1pZG5pZ2h0LCBub29uCiAgICAgIGI6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgICAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTsKICAgICAgICBsZXQgZGF5UGVyaW9kRW51bVZhbHVlOwogICAgICAgIGlmIChob3VycyA9PT0gMTIpIHsKICAgICAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubm9vbjsKICAgICAgICB9IGVsc2UgaWYgKGhvdXJzID09PSAwKSB7CiAgICAgICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm1pZG5pZ2h0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBob3VycyAvIDEyID49IDEgPyAicG0iIDogImFtIjsKICAgICAgICB9CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgY2FzZSAiYiI6CiAgICAgICAgICBjYXNlICJiYiI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIGNhc2UgImJiYiI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgY2FzZSAiYmJiYmIiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAiYmJiYiI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgICAgICB3aWR0aDogIndpZGUiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIGluIHRoZSBtb3JuaW5nLCBpbiB0aGUgYWZ0ZXJub29uLCBpbiB0aGUgZXZlbmluZywgYXQgbmlnaHQKICAgICAgQjogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpOwogICAgICAgIGxldCBkYXlQZXJpb2RFbnVtVmFsdWU7CiAgICAgICAgaWYgKGhvdXJzID49IDE3KSB7CiAgICAgICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmV2ZW5pbmc7CiAgICAgICAgfSBlbHNlIGlmIChob3VycyA+PSAxMikgewogICAgICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5hZnRlcm5vb247CiAgICAgICAgfSBlbHNlIGlmIChob3VycyA+PSA0KSB7CiAgICAgICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm1vcm5pbmc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubmlnaHQ7CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIGNhc2UgIkIiOgogICAgICAgICAgY2FzZSAiQkIiOgogICAgICAgICAgY2FzZSAiQkJCIjoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAiQkJCQkIiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAiQkJCQiI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgICAgICB3aWR0aDogIndpZGUiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIEhvdXIgWzEtMTJdCiAgICAgIGg6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgICAgICBpZiAodG9rZW4gPT09ICJobyIpIHsKICAgICAgICAgIGxldCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKSAlIDEyOwogICAgICAgICAgaWYgKGhvdXJzID09PSAwKSBob3VycyA9IDEyOwogICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6ICJob3VyIiB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5oKGRhdGUsIHRva2VuKTsKICAgICAgfSwKICAgICAgLy8gSG91ciBbMC0yM10KICAgICAgSDogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgICAgIGlmICh0b2tlbiA9PT0gIkhvIikgewogICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0SG91cnMoKSwgeyB1bml0OiAiaG91ciIgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuSChkYXRlLCB0b2tlbik7CiAgICAgIH0sCiAgICAgIC8vIEhvdXIgWzAtMTFdCiAgICAgIEs6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgICAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKSAlIDEyOwogICAgICAgIGlmICh0b2tlbiA9PT0gIktvIikgewogICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6ICJob3VyIiB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhob3VycywgdG9rZW4ubGVuZ3RoKTsKICAgICAgfSwKICAgICAgLy8gSG91ciBbMS0yNF0KICAgICAgazogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgICAgIGxldCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTsKICAgICAgICBpZiAoaG91cnMgPT09IDApIGhvdXJzID0gMjQ7CiAgICAgICAgaWYgKHRva2VuID09PSAia28iKSB7CiAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIoaG91cnMsIHsgdW5pdDogImhvdXIiIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGhvdXJzLCB0b2tlbi5sZW5ndGgpOwogICAgICB9LAogICAgICAvLyBNaW51dGUKICAgICAgbTogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgICAgIGlmICh0b2tlbiA9PT0gIm1vIikgewogICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0TWludXRlcygpLCB7IHVuaXQ6ICJtaW51dGUiIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLm0oZGF0ZSwgdG9rZW4pOwogICAgICB9LAogICAgICAvLyBTZWNvbmQKICAgICAgczogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgICAgIGlmICh0b2tlbiA9PT0gInNvIikgewogICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0U2Vjb25kcygpLCB7IHVuaXQ6ICJzZWNvbmQiIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLnMoZGF0ZSwgdG9rZW4pOwogICAgICB9LAogICAgICAvLyBGcmFjdGlvbiBvZiBzZWNvbmQKICAgICAgUzogZnVuY3Rpb24oZGF0ZSwgdG9rZW4pIHsKICAgICAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLlMoZGF0ZSwgdG9rZW4pOwogICAgICB9LAogICAgICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYWx3YXlzIGAnWidgKQogICAgICBYOiBmdW5jdGlvbihkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7CiAgICAgICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICAgICAgaWYgKHRpbWV6b25lT2Zmc2V0ID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gIloiOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAvLyBIb3VycyBhbmQgb3B0aW9uYWwgbWludXRlcwogICAgICAgICAgY2FzZSAiWCI6CiAgICAgICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpOwogICAgICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aG91dCBgOmAgZGVsaW1pdGVyCiAgICAgICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0cwogICAgICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgWFhgCiAgICAgICAgICBjYXNlICJYWFhYIjoKICAgICAgICAgIGNhc2UgIlhYIjoKICAgICAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0KTsKICAgICAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlcgogICAgICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHMKICAgICAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYFhYWGAKICAgICAgICAgIGNhc2UgIlhYWFhYIjoKICAgICAgICAgIGNhc2UgIlhYWCI6CiAgICAgICAgICAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXIKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgIjoiKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIFRpbWV6b25lIChJU08tODYwMS4gSWYgb2Zmc2V0IGlzIDAsIG91dHB1dCBpcyBgJyswMDowMCdgIG9yIGVxdWl2YWxlbnQpCiAgICAgIHg6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHsKICAgICAgICBjb25zdCB0aW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAvLyBIb3VycyBhbmQgb3B0aW9uYWwgbWludXRlcwogICAgICAgICAgY2FzZSAieCI6CiAgICAgICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpOwogICAgICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aG91dCBgOmAgZGVsaW1pdGVyCiAgICAgICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0cwogICAgICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgeHhgCiAgICAgICAgICBjYXNlICJ4eHh4IjoKICAgICAgICAgIGNhc2UgInh4IjoKICAgICAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0KTsKICAgICAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlcgogICAgICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHMKICAgICAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYHh4eGAKICAgICAgICAgIGNhc2UgInh4eHh4IjoKICAgICAgICAgIGNhc2UgInh4eCI6CiAgICAgICAgICAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXIKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgIjoiKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIFRpbWV6b25lIChHTVQpCiAgICAgIE86IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHsKICAgICAgICBjb25zdCB0aW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAvLyBTaG9ydAogICAgICAgICAgY2FzZSAiTyI6CiAgICAgICAgICBjYXNlICJPTyI6CiAgICAgICAgICBjYXNlICJPT08iOgogICAgICAgICAgICByZXR1cm4gIkdNVCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCAiOiIpOwogICAgICAgICAgLy8gTG9uZwogICAgICAgICAgY2FzZSAiT09PTyI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gIkdNVCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgIjoiKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXRpb24pCiAgICAgIHo6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHsKICAgICAgICBjb25zdCB0aW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAvLyBTaG9ydAogICAgICAgICAgY2FzZSAieiI6CiAgICAgICAgICBjYXNlICJ6eiI6CiAgICAgICAgICBjYXNlICJ6enoiOgogICAgICAgICAgICByZXR1cm4gIkdNVCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCAiOiIpOwogICAgICAgICAgLy8gTG9uZwogICAgICAgICAgY2FzZSAienp6eiI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gIkdNVCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgIjoiKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIFNlY29uZHMgdGltZXN0YW1wCiAgICAgIHQ6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHsKICAgICAgICBjb25zdCB0aW1lc3RhbXAyID0gTWF0aC50cnVuYygrZGF0ZSAvIDFlMyk7CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh0aW1lc3RhbXAyLCB0b2tlbi5sZW5ndGgpOwogICAgICB9LAogICAgICAvLyBNaWxsaXNlY29uZHMgdGltZXN0YW1wCiAgICAgIFQ6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHsKICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKCtkYXRlLCB0b2tlbi5sZW5ndGgpOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZm9ybWF0L2xvbmdGb3JtYXR0ZXJzLmpzCnZhciBkYXRlTG9uZ0Zvcm1hdHRlciwgdGltZUxvbmdGb3JtYXR0ZXIsIGRhdGVUaW1lTG9uZ0Zvcm1hdHRlciwgbG9uZ0Zvcm1hdHRlcnM7CnZhciBpbml0X2xvbmdGb3JtYXR0ZXJzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZm9ybWF0L2xvbmdGb3JtYXR0ZXJzLmpzIigpIHsKICAgIGRhdGVMb25nRm9ybWF0dGVyID0gKHBhdHRlcm4sIGZvcm1hdExvbmcyKSA9PiB7CiAgICAgIHN3aXRjaCAocGF0dGVybikgewogICAgICAgIGNhc2UgIlAiOgogICAgICAgICAgcmV0dXJuIGZvcm1hdExvbmcyLmRhdGUoeyB3aWR0aDogInNob3J0IiB9KTsKICAgICAgICBjYXNlICJQUCI6CiAgICAgICAgICByZXR1cm4gZm9ybWF0TG9uZzIuZGF0ZSh7IHdpZHRoOiAibWVkaXVtIiB9KTsKICAgICAgICBjYXNlICJQUFAiOgogICAgICAgICAgcmV0dXJuIGZvcm1hdExvbmcyLmRhdGUoeyB3aWR0aDogImxvbmciIH0pOwogICAgICAgIGNhc2UgIlBQUFAiOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gZm9ybWF0TG9uZzIuZGF0ZSh7IHdpZHRoOiAiZnVsbCIgfSk7CiAgICAgIH0KICAgIH07CiAgICB0aW1lTG9uZ0Zvcm1hdHRlciA9IChwYXR0ZXJuLCBmb3JtYXRMb25nMikgPT4gewogICAgICBzd2l0Y2ggKHBhdHRlcm4pIHsKICAgICAgICBjYXNlICJwIjoKICAgICAgICAgIHJldHVybiBmb3JtYXRMb25nMi50aW1lKHsgd2lkdGg6ICJzaG9ydCIgfSk7CiAgICAgICAgY2FzZSAicHAiOgogICAgICAgICAgcmV0dXJuIGZvcm1hdExvbmcyLnRpbWUoeyB3aWR0aDogIm1lZGl1bSIgfSk7CiAgICAgICAgY2FzZSAicHBwIjoKICAgICAgICAgIHJldHVybiBmb3JtYXRMb25nMi50aW1lKHsgd2lkdGg6ICJsb25nIiB9KTsKICAgICAgICBjYXNlICJwcHBwIjoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIGZvcm1hdExvbmcyLnRpbWUoeyB3aWR0aDogImZ1bGwiIH0pOwogICAgICB9CiAgICB9OwogICAgZGF0ZVRpbWVMb25nRm9ybWF0dGVyID0gKHBhdHRlcm4sIGZvcm1hdExvbmcyKSA9PiB7CiAgICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gcGF0dGVybi5tYXRjaCgvKFArKShwKyk/LykgfHwgW107CiAgICAgIGNvbnN0IGRhdGVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMV07CiAgICAgIGNvbnN0IHRpbWVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMl07CiAgICAgIGlmICghdGltZVBhdHRlcm4pIHsKICAgICAgICByZXR1cm4gZGF0ZUxvbmdGb3JtYXR0ZXIocGF0dGVybiwgZm9ybWF0TG9uZzIpOwogICAgICB9CiAgICAgIGxldCBkYXRlVGltZUZvcm1hdDsKICAgICAgc3dpdGNoIChkYXRlUGF0dGVybikgewogICAgICAgIGNhc2UgIlAiOgogICAgICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nMi5kYXRlVGltZSh7IHdpZHRoOiAic2hvcnQiIH0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiUFAiOgogICAgICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nMi5kYXRlVGltZSh7IHdpZHRoOiAibWVkaXVtIiB9KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlBQUCI6CiAgICAgICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcyLmRhdGVUaW1lKHsgd2lkdGg6ICJsb25nIiB9KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlBQUFAiOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcyLmRhdGVUaW1lKHsgd2lkdGg6ICJmdWxsIiB9KTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHJldHVybiBkYXRlVGltZUZvcm1hdC5yZXBsYWNlKCJ7e2RhdGV9fSIsIGRhdGVMb25nRm9ybWF0dGVyKGRhdGVQYXR0ZXJuLCBmb3JtYXRMb25nMikpLnJlcGxhY2UoInt7dGltZX19IiwgdGltZUxvbmdGb3JtYXR0ZXIodGltZVBhdHRlcm4sIGZvcm1hdExvbmcyKSk7CiAgICB9OwogICAgbG9uZ0Zvcm1hdHRlcnMgPSB7CiAgICAgIHA6IHRpbWVMb25nRm9ybWF0dGVyLAogICAgICBQOiBkYXRlVGltZUxvbmdGb3JtYXR0ZXIKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9wcm90ZWN0ZWRUb2tlbnMuanMKZnVuY3Rpb24gaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbih0b2tlbikgewogIHJldHVybiBkYXlPZlllYXJUb2tlblJFLnRlc3QodG9rZW4pOwp9CmZ1bmN0aW9uIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikgewogIHJldHVybiB3ZWVrWWVhclRva2VuUkUudGVzdCh0b2tlbik7Cn0KZnVuY3Rpb24gd2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvcih0b2tlbiwgZm9ybWF0MiwgaW5wdXQpIHsKICBjb25zdCBfbWVzc2FnZSA9IG1lc3NhZ2UodG9rZW4sIGZvcm1hdDIsIGlucHV0KTsKICBjb25zb2xlLndhcm4oX21lc3NhZ2UpOwogIGlmICh0aHJvd1Rva2Vucy5pbmNsdWRlcyh0b2tlbikpIHRocm93IG5ldyBSYW5nZUVycm9yKF9tZXNzYWdlKTsKfQpmdW5jdGlvbiBtZXNzYWdlKHRva2VuLCBmb3JtYXQyLCBpbnB1dCkgewogIGNvbnN0IHN1YmplY3QgPSB0b2tlblswXSA9PT0gIlkiID8gInllYXJzIiA6ICJkYXlzIG9mIHRoZSBtb250aCI7CiAgcmV0dXJuIGBVc2UgXGAke3Rva2VuLnRvTG93ZXJDYXNlKCl9XGAgaW5zdGVhZCBvZiBcYCR7dG9rZW59XGAgKGluIFxgJHtmb3JtYXQyfVxgKSBmb3IgZm9ybWF0dGluZyAke3N1YmplY3R9IHRvIHRoZSBpbnB1dCBcYCR7aW5wdXR9XGA7IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZGA7Cn0KdmFyIGRheU9mWWVhclRva2VuUkUsIHdlZWtZZWFyVG9rZW5SRSwgdGhyb3dUb2tlbnM7CnZhciBpbml0X3Byb3RlY3RlZFRva2VucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL3Byb3RlY3RlZFRva2Vucy5qcyIoKSB7CiAgICBkYXlPZlllYXJUb2tlblJFID0gL15EKyQvOwogICAgd2Vla1llYXJUb2tlblJFID0gL15ZKyQvOwogICAgdGhyb3dUb2tlbnMgPSBbIkQiLCAiREQiLCAiWVkiLCAiWVlZWSJdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdC5qcwpmdW5jdGlvbiBmb3JtYXQoZGF0ZSwgZm9ybWF0U3RyLCBvcHRpb25zKSB7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZSA/PyBlblVTOwogIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBkZWZhdWx0T3B0aW9uczIuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyAxOwogIGNvbnN0IHdlZWtTdGFydHNPbiA9IG9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyAwOwogIGNvbnN0IG9yaWdpbmFsRGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgaWYgKCFpc1ZhbGlkKG9yaWdpbmFsRGF0ZSkpIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHRpbWUgdmFsdWUiKTsKICB9CiAgbGV0IHBhcnRzID0gZm9ybWF0U3RyLm1hdGNoKGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwKS5tYXAoKHN1YnN0cmluZykgPT4gewogICAgY29uc3QgZmlyc3RDaGFyYWN0ZXIgPSBzdWJzdHJpbmdbMF07CiAgICBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09ICJwIiB8fCBmaXJzdENoYXJhY3RlciA9PT0gIlAiKSB7CiAgICAgIGNvbnN0IGxvbmdGb3JtYXR0ZXIgPSBsb25nRm9ybWF0dGVyc1tmaXJzdENoYXJhY3Rlcl07CiAgICAgIHJldHVybiBsb25nRm9ybWF0dGVyKHN1YnN0cmluZywgbG9jYWxlLmZvcm1hdExvbmcpOwogICAgfQogICAgcmV0dXJuIHN1YnN0cmluZzsKICB9KS5qb2luKCIiKS5tYXRjaChmb3JtYXR0aW5nVG9rZW5zUmVnRXhwKS5tYXAoKHN1YnN0cmluZykgPT4gewogICAgaWYgKHN1YnN0cmluZyA9PT0gIicnIikgewogICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6ICInIiB9OwogICAgfQogICAgY29uc3QgZmlyc3RDaGFyYWN0ZXIgPSBzdWJzdHJpbmdbMF07CiAgICBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09ICInIikgewogICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IGNsZWFuRXNjYXBlZFN0cmluZyhzdWJzdHJpbmcpIH07CiAgICB9CiAgICBpZiAoZm9ybWF0dGVyc1tmaXJzdENoYXJhY3Rlcl0pIHsKICAgICAgcmV0dXJuIHsgaXNUb2tlbjogdHJ1ZSwgdmFsdWU6IHN1YnN0cmluZyB9OwogICAgfQogICAgaWYgKGZpcnN0Q2hhcmFjdGVyLm1hdGNoKHVuZXNjYXBlZExhdGluQ2hhcmFjdGVyUmVnRXhwKSkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigKICAgICAgICAiRm9ybWF0IHN0cmluZyBjb250YWlucyBhbiB1bmVzY2FwZWQgbGF0aW4gYWxwaGFiZXQgY2hhcmFjdGVyIGAiICsgZmlyc3RDaGFyYWN0ZXIgKyAiYCIKICAgICAgKTsKICAgIH0KICAgIHJldHVybiB7IGlzVG9rZW46IGZhbHNlLCB2YWx1ZTogc3Vic3RyaW5nIH07CiAgfSk7CiAgaWYgKGxvY2FsZS5sb2NhbGl6ZS5wcmVwcm9jZXNzb3IpIHsKICAgIHBhcnRzID0gbG9jYWxlLmxvY2FsaXplLnByZXByb2Nlc3NvcihvcmlnaW5hbERhdGUsIHBhcnRzKTsKICB9CiAgY29uc3QgZm9ybWF0dGVyT3B0aW9ucyA9IHsKICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSwKICAgIHdlZWtTdGFydHNPbiwKICAgIGxvY2FsZQogIH07CiAgcmV0dXJuIHBhcnRzLm1hcCgocGFydCkgPT4gewogICAgaWYgKCFwYXJ0LmlzVG9rZW4pIHJldHVybiBwYXJ0LnZhbHVlOwogICAgY29uc3QgdG9rZW4gPSBwYXJ0LnZhbHVlOwogICAgaWYgKCFvcHRpb25zPy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnMgJiYgaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuKHRva2VuKSB8fCAhb3B0aW9ucz8udXNlQWRkaXRpb25hbERheU9mWWVhclRva2VucyAmJiBpc1Byb3RlY3RlZERheU9mWWVhclRva2VuKHRva2VuKSkgewogICAgICB3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yKHRva2VuLCBmb3JtYXRTdHIsIFN0cmluZyhkYXRlKSk7CiAgICB9CiAgICBjb25zdCBmb3JtYXR0ZXIyID0gZm9ybWF0dGVyc1t0b2tlblswXV07CiAgICByZXR1cm4gZm9ybWF0dGVyMihvcmlnaW5hbERhdGUsIHRva2VuLCBsb2NhbGUubG9jYWxpemUsIGZvcm1hdHRlck9wdGlvbnMpOwogIH0pLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIGNsZWFuRXNjYXBlZFN0cmluZyhpbnB1dCkgewogIGNvbnN0IG1hdGNoZWQgPSBpbnB1dC5tYXRjaChlc2NhcGVkU3RyaW5nUmVnRXhwKTsKICBpZiAoIW1hdGNoZWQpIHsKICAgIHJldHVybiBpbnB1dDsKICB9CiAgcmV0dXJuIG1hdGNoZWRbMV0ucmVwbGFjZShkb3VibGVRdW90ZVJlZ0V4cCwgIiciKTsKfQp2YXIgZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCwgbG9uZ0Zvcm1hdHRpbmdUb2tlbnNSZWdFeHAsIGVzY2FwZWRTdHJpbmdSZWdFeHAsIGRvdWJsZVF1b3RlUmVnRXhwLCB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCwgZm9ybWF0X2RlZmF1bHQ7CnZhciBpbml0X2Zvcm1hdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXQuanMiKCkgewogICAgaW5pdF9kZWZhdWx0TG9jYWxlKCk7CiAgICBpbml0X2RlZmF1bHRPcHRpb25zKCk7CiAgICBpbml0X2Zvcm1hdHRlcnMoKTsKICAgIGluaXRfbG9uZ0Zvcm1hdHRlcnMoKTsKICAgIGluaXRfcHJvdGVjdGVkVG9rZW5zKCk7CiAgICBpbml0X2lzVmFsaWQoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBmb3JtYXR0aW5nVG9rZW5zUmVnRXhwID0gL1t5WVFxTUx3SWREZWNpaEhLa21zXW98KFx3KVwxKnwnJ3wnKCcnfFteJ10pKygnfCQpfC4vZzsKICAgIGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwID0gL1ArcCt8UCt8cCt8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7CiAgICBlc2NhcGVkU3RyaW5nUmVnRXhwID0gL14nKFteXSo/KSc/JC87CiAgICBkb3VibGVRdW90ZVJlZ0V4cCA9IC8nJy9nOwogICAgdW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHAgPSAvW2EtekEtWl0vOwogICAgZm9ybWF0X2RlZmF1bHQgPSBmb3JtYXQ7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0RGlzdGFuY2UuanMKZnVuY3Rpb24gZm9ybWF0RGlzdGFuY2UyKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IGxvY2FsZSA9IG9wdGlvbnM/LmxvY2FsZSA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlID8/IGVuVVM7CiAgY29uc3QgbWludXRlc0luQWxtb3N0VHdvRGF5cyA9IDI1MjA7CiAgY29uc3QgY29tcGFyaXNvbiA9IGNvbXBhcmVBc2MobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSk7CiAgaWYgKGlzTmFOKGNvbXBhcmlzb24pKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0aW1lIHZhbHVlIik7CiAgY29uc3QgbG9jYWxpemVPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywgewogICAgYWRkU3VmZml4OiBvcHRpb25zPy5hZGRTdWZmaXgsCiAgICBjb21wYXJpc29uCiAgfSk7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgLi4uY29tcGFyaXNvbiA+IDAgPyBbZWFybGllckRhdGUsIGxhdGVyRGF0ZV0gOiBbbGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZV0KICApOwogIGNvbnN0IHNlY29uZHMgPSBkaWZmZXJlbmNlSW5TZWNvbmRzKGVhcmxpZXJEYXRlXywgbGF0ZXJEYXRlXyk7CiAgY29uc3Qgb2Zmc2V0SW5TZWNvbmRzID0gKGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoZWFybGllckRhdGVfKSAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMobGF0ZXJEYXRlXykpIC8gMWUzOwogIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLnJvdW5kKChzZWNvbmRzIC0gb2Zmc2V0SW5TZWNvbmRzKSAvIDYwKTsKICBsZXQgbW9udGhzMjsKICBpZiAobWludXRlcyA8IDIpIHsKICAgIGlmIChvcHRpb25zPy5pbmNsdWRlU2Vjb25kcykgewogICAgICBpZiAoc2Vjb25kcyA8IDUpIHsKICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJsZXNzVGhhblhTZWNvbmRzIiwgNSwgbG9jYWxpemVPcHRpb25zKTsKICAgICAgfSBlbHNlIGlmIChzZWNvbmRzIDwgMTApIHsKICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJsZXNzVGhhblhTZWNvbmRzIiwgMTAsIGxvY2FsaXplT3B0aW9ucyk7CiAgICAgIH0gZWxzZSBpZiAoc2Vjb25kcyA8IDIwKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgibGVzc1RoYW5YU2Vjb25kcyIsIDIwLCBsb2NhbGl6ZU9wdGlvbnMpOwogICAgICB9IGVsc2UgaWYgKHNlY29uZHMgPCA0MCkgewogICAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoImhhbGZBTWludXRlIiwgMCwgbG9jYWxpemVPcHRpb25zKTsKICAgICAgfSBlbHNlIGlmIChzZWNvbmRzIDwgNjApIHsKICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJsZXNzVGhhblhNaW51dGVzIiwgMSwgbG9jYWxpemVPcHRpb25zKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJ4TWludXRlcyIsIDEsIGxvY2FsaXplT3B0aW9ucyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChtaW51dGVzID09PSAwKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgibGVzc1RoYW5YTWludXRlcyIsIDEsIGxvY2FsaXplT3B0aW9ucyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieE1pbnV0ZXMiLCBtaW51dGVzLCBsb2NhbGl6ZU9wdGlvbnMpOwogICAgICB9CiAgICB9CiAgfSBlbHNlIGlmIChtaW51dGVzIDwgNDUpIHsKICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoInhNaW51dGVzIiwgbWludXRlcywgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKG1pbnV0ZXMgPCA5MCkgewogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgiYWJvdXRYSG91cnMiLCAxLCBsb2NhbGl6ZU9wdGlvbnMpOwogIH0gZWxzZSBpZiAobWludXRlcyA8IG1pbnV0ZXNJbkRheSkgewogICAgY29uc3QgaG91cnMgPSBNYXRoLnJvdW5kKG1pbnV0ZXMgLyA2MCk7CiAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJhYm91dFhIb3VycyIsIGhvdXJzLCBsb2NhbGl6ZU9wdGlvbnMpOwogIH0gZWxzZSBpZiAobWludXRlcyA8IG1pbnV0ZXNJbkFsbW9zdFR3b0RheXMpIHsKICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoInhEYXlzIiwgMSwgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKG1pbnV0ZXMgPCBtaW51dGVzSW5Nb250aCkgewogICAgY29uc3QgZGF5czIgPSBNYXRoLnJvdW5kKG1pbnV0ZXMgLyBtaW51dGVzSW5EYXkpOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieERheXMiLCBkYXlzMiwgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKG1pbnV0ZXMgPCBtaW51dGVzSW5Nb250aCAqIDIpIHsKICAgIG1vbnRoczIgPSBNYXRoLnJvdW5kKG1pbnV0ZXMgLyBtaW51dGVzSW5Nb250aCk7CiAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJhYm91dFhNb250aHMiLCBtb250aHMyLCBsb2NhbGl6ZU9wdGlvbnMpOwogIH0KICBtb250aHMyID0gZGlmZmVyZW5jZUluTW9udGhzKGVhcmxpZXJEYXRlXywgbGF0ZXJEYXRlXyk7CiAgaWYgKG1vbnRoczIgPCAxMikgewogICAgY29uc3QgbmVhcmVzdE1vbnRoID0gTWF0aC5yb3VuZChtaW51dGVzIC8gbWludXRlc0luTW9udGgpOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieE1vbnRocyIsIG5lYXJlc3RNb250aCwgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgewogICAgY29uc3QgbW9udGhzU2luY2VTdGFydE9mWWVhciA9IG1vbnRoczIgJSAxMjsKICAgIGNvbnN0IHllYXJzID0gTWF0aC50cnVuYyhtb250aHMyIC8gMTIpOwogICAgaWYgKG1vbnRoc1NpbmNlU3RhcnRPZlllYXIgPCAzKSB7CiAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoImFib3V0WFllYXJzIiwgeWVhcnMsIGxvY2FsaXplT3B0aW9ucyk7CiAgICB9IGVsc2UgaWYgKG1vbnRoc1NpbmNlU3RhcnRPZlllYXIgPCA5KSB7CiAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoIm92ZXJYWWVhcnMiLCB5ZWFycywgbG9jYWxpemVPcHRpb25zKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoImFsbW9zdFhZZWFycyIsIHllYXJzICsgMSwgbG9jYWxpemVPcHRpb25zKTsKICAgIH0KICB9Cn0KdmFyIGZvcm1hdERpc3RhbmNlX2RlZmF1bHQ7CnZhciBpbml0X2Zvcm1hdERpc3RhbmNlMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXREaXN0YW5jZS5qcyIoKSB7CiAgICBpbml0X2RlZmF1bHRMb2NhbGUoKTsKICAgIGluaXRfZGVmYXVsdE9wdGlvbnMoKTsKICAgIGluaXRfZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcygpOwogICAgaW5pdF9ub3JtYWxpemVEYXRlcygpOwogICAgaW5pdF9jb21wYXJlQXNjKCk7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5Nb250aHMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluU2Vjb25kcygpOwogICAgZm9ybWF0RGlzdGFuY2VfZGVmYXVsdCA9IGZvcm1hdERpc3RhbmNlMjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXREaXN0YW5jZVN0cmljdC5qcwpmdW5jdGlvbiBmb3JtYXREaXN0YW5jZVN0cmljdChsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZSA/PyBlblVTOwogIGNvbnN0IGNvbXBhcmlzb24gPSBjb21wYXJlQXNjKGxhdGVyRGF0ZSwgZWFybGllckRhdGUpOwogIGlmIChpc05hTihjb21wYXJpc29uKSkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdGltZSB2YWx1ZSIpOwogIH0KICBjb25zdCBsb2NhbGl6ZU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7CiAgICBhZGRTdWZmaXg6IG9wdGlvbnM/LmFkZFN1ZmZpeCwKICAgIGNvbXBhcmlzb24KICB9KTsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICAuLi5jb21wYXJpc29uID4gMCA/IFtlYXJsaWVyRGF0ZSwgbGF0ZXJEYXRlXSA6IFtsYXRlckRhdGUsIGVhcmxpZXJEYXRlXQogICk7CiAgY29uc3Qgcm91bmRpbmdNZXRob2QgPSBnZXRSb3VuZGluZ01ldGhvZChvcHRpb25zPy5yb3VuZGluZ01ldGhvZCA/PyAicm91bmQiKTsKICBjb25zdCBtaWxsaXNlY29uZHMyID0gZWFybGllckRhdGVfLmdldFRpbWUoKSAtIGxhdGVyRGF0ZV8uZ2V0VGltZSgpOwogIGNvbnN0IG1pbnV0ZXMgPSBtaWxsaXNlY29uZHMyIC8gbWlsbGlzZWNvbmRzSW5NaW51dGU7CiAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGVhcmxpZXJEYXRlXykgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGxhdGVyRGF0ZV8pOwogIGNvbnN0IGRzdE5vcm1hbGl6ZWRNaW51dGVzID0gKG1pbGxpc2Vjb25kczIgLSB0aW1lem9uZU9mZnNldCkgLyBtaWxsaXNlY29uZHNJbk1pbnV0ZTsKICBjb25zdCBkZWZhdWx0VW5pdCA9IG9wdGlvbnM/LnVuaXQ7CiAgbGV0IHVuaXQ7CiAgaWYgKCFkZWZhdWx0VW5pdCkgewogICAgaWYgKG1pbnV0ZXMgPCAxKSB7CiAgICAgIHVuaXQgPSAic2Vjb25kIjsKICAgIH0gZWxzZSBpZiAobWludXRlcyA8IDYwKSB7CiAgICAgIHVuaXQgPSAibWludXRlIjsKICAgIH0gZWxzZSBpZiAobWludXRlcyA8IG1pbnV0ZXNJbkRheSkgewogICAgICB1bml0ID0gImhvdXIiOwogICAgfSBlbHNlIGlmIChkc3ROb3JtYWxpemVkTWludXRlcyA8IG1pbnV0ZXNJbk1vbnRoKSB7CiAgICAgIHVuaXQgPSAiZGF5IjsKICAgIH0gZWxzZSBpZiAoZHN0Tm9ybWFsaXplZE1pbnV0ZXMgPCBtaW51dGVzSW5ZZWFyKSB7CiAgICAgIHVuaXQgPSAibW9udGgiOwogICAgfSBlbHNlIHsKICAgICAgdW5pdCA9ICJ5ZWFyIjsKICAgIH0KICB9IGVsc2UgewogICAgdW5pdCA9IGRlZmF1bHRVbml0OwogIH0KICBpZiAodW5pdCA9PT0gInNlY29uZCIpIHsKICAgIGNvbnN0IHNlY29uZHMgPSByb3VuZGluZ01ldGhvZChtaWxsaXNlY29uZHMyIC8gMWUzKTsKICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoInhTZWNvbmRzIiwgc2Vjb25kcywgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKHVuaXQgPT09ICJtaW51dGUiKSB7CiAgICBjb25zdCByb3VuZGVkTWludXRlcyA9IHJvdW5kaW5nTWV0aG9kKG1pbnV0ZXMpOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieE1pbnV0ZXMiLCByb3VuZGVkTWludXRlcywgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKHVuaXQgPT09ICJob3VyIikgewogICAgY29uc3QgaG91cnMgPSByb3VuZGluZ01ldGhvZChtaW51dGVzIC8gNjApOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieEhvdXJzIiwgaG91cnMsIGxvY2FsaXplT3B0aW9ucyk7CiAgfSBlbHNlIGlmICh1bml0ID09PSAiZGF5IikgewogICAgY29uc3QgZGF5czIgPSByb3VuZGluZ01ldGhvZChkc3ROb3JtYWxpemVkTWludXRlcyAvIG1pbnV0ZXNJbkRheSk7CiAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJ4RGF5cyIsIGRheXMyLCBsb2NhbGl6ZU9wdGlvbnMpOwogIH0gZWxzZSBpZiAodW5pdCA9PT0gIm1vbnRoIikgewogICAgY29uc3QgbW9udGhzMiA9IHJvdW5kaW5nTWV0aG9kKGRzdE5vcm1hbGl6ZWRNaW51dGVzIC8gbWludXRlc0luTW9udGgpOwogICAgcmV0dXJuIG1vbnRoczIgPT09IDEyICYmIGRlZmF1bHRVbml0ICE9PSAibW9udGgiID8gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJ4WWVhcnMiLCAxLCBsb2NhbGl6ZU9wdGlvbnMpIDogbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJ4TW9udGhzIiwgbW9udGhzMiwgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgewogICAgY29uc3QgeWVhcnMgPSByb3VuZGluZ01ldGhvZChkc3ROb3JtYWxpemVkTWludXRlcyAvIG1pbnV0ZXNJblllYXIpOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieFllYXJzIiwgeWVhcnMsIGxvY2FsaXplT3B0aW9ucyk7CiAgfQp9CnZhciBmb3JtYXREaXN0YW5jZVN0cmljdF9kZWZhdWx0Owp2YXIgaW5pdF9mb3JtYXREaXN0YW5jZVN0cmljdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXREaXN0YW5jZVN0cmljdC5qcyIoKSB7CiAgICBpbml0X2RlZmF1bHRMb2NhbGUoKTsKICAgIGluaXRfZGVmYXVsdE9wdGlvbnMoKTsKICAgIGluaXRfZ2V0Um91bmRpbmdNZXRob2QoKTsKICAgIGluaXRfZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcygpOwogICAgaW5pdF9ub3JtYWxpemVEYXRlcygpOwogICAgaW5pdF9jb21wYXJlQXNjKCk7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgZm9ybWF0RGlzdGFuY2VTdHJpY3RfZGVmYXVsdCA9IGZvcm1hdERpc3RhbmNlU3RyaWN0OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdERpc3RhbmNlVG9Ob3cuanMKZnVuY3Rpb24gZm9ybWF0RGlzdGFuY2VUb05vdyhkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGZvcm1hdERpc3RhbmNlMihkYXRlLCBjb25zdHJ1Y3ROb3coZGF0ZSksIG9wdGlvbnMpOwp9CnZhciBmb3JtYXREaXN0YW5jZVRvTm93X2RlZmF1bHQ7CnZhciBpbml0X2Zvcm1hdERpc3RhbmNlVG9Ob3cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0RGlzdGFuY2VUb05vdy5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdE5vdygpOwogICAgaW5pdF9mb3JtYXREaXN0YW5jZTIoKTsKICAgIGZvcm1hdERpc3RhbmNlVG9Ob3dfZGVmYXVsdCA9IGZvcm1hdERpc3RhbmNlVG9Ob3c7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0RGlzdGFuY2VUb05vd1N0cmljdC5qcwpmdW5jdGlvbiBmb3JtYXREaXN0YW5jZVRvTm93U3RyaWN0KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gZm9ybWF0RGlzdGFuY2VTdHJpY3QoZGF0ZSwgY29uc3RydWN0Tm93KGRhdGUpLCBvcHRpb25zKTsKfQp2YXIgZm9ybWF0RGlzdGFuY2VUb05vd1N0cmljdF9kZWZhdWx0Owp2YXIgaW5pdF9mb3JtYXREaXN0YW5jZVRvTm93U3RyaWN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3QuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3ROb3coKTsKICAgIGluaXRfZm9ybWF0RGlzdGFuY2VTdHJpY3QoKTsKICAgIGZvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3RfZGVmYXVsdCA9IGZvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3Q7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0RHVyYXRpb24uanMKZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24oZHVyYXRpb24sIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IGxvY2FsZSA9IG9wdGlvbnM/LmxvY2FsZSA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlID8/IGVuVVM7CiAgY29uc3QgZm9ybWF0MiA9IG9wdGlvbnM/LmZvcm1hdCA/PyBkZWZhdWx0Rm9ybWF0OwogIGNvbnN0IHplcm8gPSBvcHRpb25zPy56ZXJvID8/IGZhbHNlOwogIGNvbnN0IGRlbGltaXRlciA9IG9wdGlvbnM/LmRlbGltaXRlciA/PyAiICI7CiAgaWYgKCFsb2NhbGUuZm9ybWF0RGlzdGFuY2UpIHsKICAgIHJldHVybiAiIjsKICB9CiAgY29uc3QgcmVzdWx0ID0gZm9ybWF0Mi5yZWR1Y2UoKGFjYywgdW5pdCkgPT4gewogICAgY29uc3QgdG9rZW4gPSBgeCR7dW5pdC5yZXBsYWNlKC8oXi4pLywgKG02KSA9PiBtNi50b1VwcGVyQ2FzZSgpKX1gOwogICAgY29uc3QgdmFsdWUyID0gZHVyYXRpb25bdW5pdF07CiAgICBpZiAodmFsdWUyICE9PSB2b2lkIDAgJiYgKHplcm8gfHwgZHVyYXRpb25bdW5pdF0pKSB7CiAgICAgIHJldHVybiBhY2MuY29uY2F0KGxvY2FsZS5mb3JtYXREaXN0YW5jZSh0b2tlbiwgdmFsdWUyKSk7CiAgICB9CiAgICByZXR1cm4gYWNjOwogIH0sIFtdKS5qb2luKGRlbGltaXRlcik7CiAgcmV0dXJuIHJlc3VsdDsKfQp2YXIgZGVmYXVsdEZvcm1hdCwgZm9ybWF0RHVyYXRpb25fZGVmYXVsdDsKdmFyIGluaXRfZm9ybWF0RHVyYXRpb24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0RHVyYXRpb24uanMiKCkgewogICAgaW5pdF9kZWZhdWx0TG9jYWxlKCk7CiAgICBpbml0X2RlZmF1bHRPcHRpb25zKCk7CiAgICBkZWZhdWx0Rm9ybWF0ID0gWwogICAgICAieWVhcnMiLAogICAgICAibW9udGhzIiwKICAgICAgIndlZWtzIiwKICAgICAgImRheXMiLAogICAgICAiaG91cnMiLAogICAgICAibWludXRlcyIsCiAgICAgICJzZWNvbmRzIgogICAgXTsKICAgIGZvcm1hdER1cmF0aW9uX2RlZmF1bHQgPSBmb3JtYXREdXJhdGlvbjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXRJU08uanMKZnVuY3Rpb24gZm9ybWF0SVNPKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgaWYgKGlzTmFOKCtkYXRlXykpIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHRpbWUgdmFsdWUiKTsKICB9CiAgY29uc3QgZm9ybWF0MiA9IG9wdGlvbnM/LmZvcm1hdCA/PyAiZXh0ZW5kZWQiOwogIGNvbnN0IHJlcHJlc2VudGF0aW9uID0gb3B0aW9ucz8ucmVwcmVzZW50YXRpb24gPz8gImNvbXBsZXRlIjsKICBsZXQgcmVzdWx0ID0gIiI7CiAgbGV0IHR6T2Zmc2V0ID0gIiI7CiAgY29uc3QgZGF0ZURlbGltaXRlciA9IGZvcm1hdDIgPT09ICJleHRlbmRlZCIgPyAiLSIgOiAiIjsKICBjb25zdCB0aW1lRGVsaW1pdGVyID0gZm9ybWF0MiA9PT0gImV4dGVuZGVkIiA/ICI6IiA6ICIiOwogIGlmIChyZXByZXNlbnRhdGlvbiAhPT0gInRpbWUiKSB7CiAgICBjb25zdCBkYXkgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0RGF0ZSgpLCAyKTsKICAgIGNvbnN0IG1vbnRoID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldE1vbnRoKCkgKyAxLCAyKTsKICAgIGNvbnN0IHllYXIgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0RnVsbFllYXIoKSwgNCk7CiAgICByZXN1bHQgPSBgJHt5ZWFyfSR7ZGF0ZURlbGltaXRlcn0ke21vbnRofSR7ZGF0ZURlbGltaXRlcn0ke2RheX1gOwogIH0KICBpZiAocmVwcmVzZW50YXRpb24gIT09ICJkYXRlIikgewogICAgY29uc3Qgb2Zmc2V0ID0gZGF0ZV8uZ2V0VGltZXpvbmVPZmZzZXQoKTsKICAgIGlmIChvZmZzZXQgIT09IDApIHsKICAgICAgY29uc3QgYWJzb2x1dGVPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpOwogICAgICBjb25zdCBob3VyT2Zmc2V0ID0gYWRkTGVhZGluZ1plcm9zKE1hdGgudHJ1bmMoYWJzb2x1dGVPZmZzZXQgLyA2MCksIDIpOwogICAgICBjb25zdCBtaW51dGVPZmZzZXQgPSBhZGRMZWFkaW5nWmVyb3MoYWJzb2x1dGVPZmZzZXQgJSA2MCwgMik7CiAgICAgIGNvbnN0IHNpZ24gPSBvZmZzZXQgPCAwID8gIisiIDogIi0iOwogICAgICB0ek9mZnNldCA9IGAke3NpZ259JHtob3VyT2Zmc2V0fToke21pbnV0ZU9mZnNldH1gOwogICAgfSBlbHNlIHsKICAgICAgdHpPZmZzZXQgPSAiWiI7CiAgICB9CiAgICBjb25zdCBob3VyID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldEhvdXJzKCksIDIpOwogICAgY29uc3QgbWludXRlID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldE1pbnV0ZXMoKSwgMik7CiAgICBjb25zdCBzZWNvbmQgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0U2Vjb25kcygpLCAyKTsKICAgIGNvbnN0IHNlcGFyYXRvciA9IHJlc3VsdCA9PT0gIiIgPyAiIiA6ICJUIjsKICAgIGNvbnN0IHRpbWUgPSBbaG91ciwgbWludXRlLCBzZWNvbmRdLmpvaW4odGltZURlbGltaXRlcik7CiAgICByZXN1bHQgPSBgJHtyZXN1bHR9JHtzZXBhcmF0b3J9JHt0aW1lfSR7dHpPZmZzZXR9YDsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQp2YXIgZm9ybWF0SVNPX2RlZmF1bHQ7CnZhciBpbml0X2Zvcm1hdElTTyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXRJU08uanMiKCkgewogICAgaW5pdF9hZGRMZWFkaW5nWmVyb3MoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBmb3JtYXRJU09fZGVmYXVsdCA9IGZvcm1hdElTTzsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXRJU085MDc1LmpzCmZ1bmN0aW9uIGZvcm1hdElTTzkwNzUoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBpZiAoIWlzVmFsaWQoZGF0ZV8pKSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0aW1lIHZhbHVlIik7CiAgfQogIGNvbnN0IGZvcm1hdDIgPSBvcHRpb25zPy5mb3JtYXQgPz8gImV4dGVuZGVkIjsKICBjb25zdCByZXByZXNlbnRhdGlvbiA9IG9wdGlvbnM/LnJlcHJlc2VudGF0aW9uID8/ICJjb21wbGV0ZSI7CiAgbGV0IHJlc3VsdCA9ICIiOwogIGNvbnN0IGRhdGVEZWxpbWl0ZXIgPSBmb3JtYXQyID09PSAiZXh0ZW5kZWQiID8gIi0iIDogIiI7CiAgY29uc3QgdGltZURlbGltaXRlciA9IGZvcm1hdDIgPT09ICJleHRlbmRlZCIgPyAiOiIgOiAiIjsKICBpZiAocmVwcmVzZW50YXRpb24gIT09ICJ0aW1lIikgewogICAgY29uc3QgZGF5ID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldERhdGUoKSwgMik7CiAgICBjb25zdCBtb250aCA9IGFkZExlYWRpbmdaZXJvcyhkYXRlXy5nZXRNb250aCgpICsgMSwgMik7CiAgICBjb25zdCB5ZWFyID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldEZ1bGxZZWFyKCksIDQpOwogICAgcmVzdWx0ID0gYCR7eWVhcn0ke2RhdGVEZWxpbWl0ZXJ9JHttb250aH0ke2RhdGVEZWxpbWl0ZXJ9JHtkYXl9YDsKICB9CiAgaWYgKHJlcHJlc2VudGF0aW9uICE9PSAiZGF0ZSIpIHsKICAgIGNvbnN0IGhvdXIgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0SG91cnMoKSwgMik7CiAgICBjb25zdCBtaW51dGUgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0TWludXRlcygpLCAyKTsKICAgIGNvbnN0IHNlY29uZCA9IGFkZExlYWRpbmdaZXJvcyhkYXRlXy5nZXRTZWNvbmRzKCksIDIpOwogICAgY29uc3Qgc2VwYXJhdG9yID0gcmVzdWx0ID09PSAiIiA/ICIiIDogIiAiOwogICAgcmVzdWx0ID0gYCR7cmVzdWx0fSR7c2VwYXJhdG9yfSR7aG91cn0ke3RpbWVEZWxpbWl0ZXJ9JHttaW51dGV9JHt0aW1lRGVsaW1pdGVyfSR7c2Vjb25kfWA7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KdmFyIGZvcm1hdElTTzkwNzVfZGVmYXVsdDsKdmFyIGluaXRfZm9ybWF0SVNPOTA3NSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXRJU085MDc1LmpzIigpIHsKICAgIGluaXRfYWRkTGVhZGluZ1plcm9zKCk7CiAgICBpbml0X2lzVmFsaWQoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBmb3JtYXRJU085MDc1X2RlZmF1bHQgPSBmb3JtYXRJU085MDc1OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdElTT0R1cmF0aW9uLmpzCmZ1bmN0aW9uIGZvcm1hdElTT0R1cmF0aW9uKGR1cmF0aW9uKSB7CiAgY29uc3QgewogICAgeWVhcnMgPSAwLAogICAgbW9udGhzOiBtb250aHMyID0gMCwKICAgIGRheXM6IGRheXMyID0gMCwKICAgIGhvdXJzID0gMCwKICAgIG1pbnV0ZXMgPSAwLAogICAgc2Vjb25kcyA9IDAKICB9ID0gZHVyYXRpb247CiAgcmV0dXJuIGBQJHt5ZWFyc31ZJHttb250aHMyfU0ke2RheXMyfURUJHtob3Vyc31IJHttaW51dGVzfU0ke3NlY29uZHN9U2A7Cn0KdmFyIGZvcm1hdElTT0R1cmF0aW9uX2RlZmF1bHQ7CnZhciBpbml0X2Zvcm1hdElTT0R1cmF0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdElTT0R1cmF0aW9uLmpzIigpIHsKICAgIGZvcm1hdElTT0R1cmF0aW9uX2RlZmF1bHQgPSBmb3JtYXRJU09EdXJhdGlvbjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXRSRkMzMzM5LmpzCmZ1bmN0aW9uIGZvcm1hdFJGQzMzMzkoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBpZiAoIWlzVmFsaWQoZGF0ZV8pKSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0aW1lIHZhbHVlIik7CiAgfQogIGNvbnN0IGZyYWN0aW9uRGlnaXRzID0gb3B0aW9ucz8uZnJhY3Rpb25EaWdpdHMgPz8gMDsKICBjb25zdCBkYXkgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0RGF0ZSgpLCAyKTsKICBjb25zdCBtb250aCA9IGFkZExlYWRpbmdaZXJvcyhkYXRlXy5nZXRNb250aCgpICsgMSwgMik7CiAgY29uc3QgeWVhciA9IGRhdGVfLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgaG91ciA9IGFkZExlYWRpbmdaZXJvcyhkYXRlXy5nZXRIb3VycygpLCAyKTsKICBjb25zdCBtaW51dGUgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0TWludXRlcygpLCAyKTsKICBjb25zdCBzZWNvbmQgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0U2Vjb25kcygpLCAyKTsKICBsZXQgZnJhY3Rpb25hbFNlY29uZCA9ICIiOwogIGlmIChmcmFjdGlvbkRpZ2l0cyA+IDApIHsKICAgIGNvbnN0IG1pbGxpc2Vjb25kczIgPSBkYXRlXy5nZXRNaWxsaXNlY29uZHMoKTsKICAgIGNvbnN0IGZyYWN0aW9uYWxTZWNvbmRzID0gTWF0aC50cnVuYygKICAgICAgbWlsbGlzZWNvbmRzMiAqIE1hdGgucG93KDEwLCBmcmFjdGlvbkRpZ2l0cyAtIDMpCiAgICApOwogICAgZnJhY3Rpb25hbFNlY29uZCA9ICIuIiArIGFkZExlYWRpbmdaZXJvcyhmcmFjdGlvbmFsU2Vjb25kcywgZnJhY3Rpb25EaWdpdHMpOwogIH0KICBsZXQgb2Zmc2V0ID0gIiI7CiAgY29uc3QgdHpPZmZzZXQgPSBkYXRlXy5nZXRUaW1lem9uZU9mZnNldCgpOwogIGlmICh0ek9mZnNldCAhPT0gMCkgewogICAgY29uc3QgYWJzb2x1dGVPZmZzZXQgPSBNYXRoLmFicyh0ek9mZnNldCk7CiAgICBjb25zdCBob3VyT2Zmc2V0ID0gYWRkTGVhZGluZ1plcm9zKE1hdGgudHJ1bmMoYWJzb2x1dGVPZmZzZXQgLyA2MCksIDIpOwogICAgY29uc3QgbWludXRlT2Zmc2V0ID0gYWRkTGVhZGluZ1plcm9zKGFic29sdXRlT2Zmc2V0ICUgNjAsIDIpOwogICAgY29uc3Qgc2lnbiA9IHR6T2Zmc2V0IDwgMCA/ICIrIiA6ICItIjsKICAgIG9mZnNldCA9IGAke3NpZ259JHtob3VyT2Zmc2V0fToke21pbnV0ZU9mZnNldH1gOwogIH0gZWxzZSB7CiAgICBvZmZzZXQgPSAiWiI7CiAgfQogIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1UJHtob3VyfToke21pbnV0ZX06JHtzZWNvbmR9JHtmcmFjdGlvbmFsU2Vjb25kfSR7b2Zmc2V0fWA7Cn0KdmFyIGZvcm1hdFJGQzMzMzlfZGVmYXVsdDsKdmFyIGluaXRfZm9ybWF0UkZDMzMzOSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXRSRkMzMzM5LmpzIigpIHsKICAgIGluaXRfYWRkTGVhZGluZ1plcm9zKCk7CiAgICBpbml0X2lzVmFsaWQoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBmb3JtYXRSRkMzMzM5X2RlZmF1bHQgPSBmb3JtYXRSRkMzMzM5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdFJGQzcyMzEuanMKZnVuY3Rpb24gZm9ybWF0UkZDNzIzMShkYXRlKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSk7CiAgaWYgKCFpc1ZhbGlkKF9kYXRlKSkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdGltZSB2YWx1ZSIpOwogIH0KICBjb25zdCBkYXlOYW1lID0gZGF5c1tfZGF0ZS5nZXRVVENEYXkoKV07CiAgY29uc3QgZGF5T2ZNb250aCA9IGFkZExlYWRpbmdaZXJvcyhfZGF0ZS5nZXRVVENEYXRlKCksIDIpOwogIGNvbnN0IG1vbnRoTmFtZSA9IG1vbnRoc1tfZGF0ZS5nZXRVVENNb250aCgpXTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0VVRDRnVsbFllYXIoKTsKICBjb25zdCBob3VyID0gYWRkTGVhZGluZ1plcm9zKF9kYXRlLmdldFVUQ0hvdXJzKCksIDIpOwogIGNvbnN0IG1pbnV0ZSA9IGFkZExlYWRpbmdaZXJvcyhfZGF0ZS5nZXRVVENNaW51dGVzKCksIDIpOwogIGNvbnN0IHNlY29uZCA9IGFkZExlYWRpbmdaZXJvcyhfZGF0ZS5nZXRVVENTZWNvbmRzKCksIDIpOwogIHJldHVybiBgJHtkYXlOYW1lfSwgJHtkYXlPZk1vbnRofSAke21vbnRoTmFtZX0gJHt5ZWFyfSAke2hvdXJ9OiR7bWludXRlfToke3NlY29uZH0gR01UYDsKfQp2YXIgZGF5cywgbW9udGhzLCBmb3JtYXRSRkM3MjMxX2RlZmF1bHQ7CnZhciBpbml0X2Zvcm1hdFJGQzcyMzEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0UkZDNzIzMS5qcyIoKSB7CiAgICBpbml0X2FkZExlYWRpbmdaZXJvcygpOwogICAgaW5pdF9pc1ZhbGlkKCk7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZGF5cyA9IFsiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0Il07CiAgICBtb250aHMgPSBbCiAgICAgICJKYW4iLAogICAgICAiRmViIiwKICAgICAgIk1hciIsCiAgICAgICJBcHIiLAogICAgICAiTWF5IiwKICAgICAgIkp1biIsCiAgICAgICJKdWwiLAogICAgICAiQXVnIiwKICAgICAgIlNlcCIsCiAgICAgICJPY3QiLAogICAgICAiTm92IiwKICAgICAgIkRlYyIKICAgIF07CiAgICBmb3JtYXRSRkM3MjMxX2RlZmF1bHQgPSBmb3JtYXRSRkM3MjMxOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdFJlbGF0aXZlLmpzCmZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlMihkYXRlLCBiYXNlRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtkYXRlXywgYmFzZURhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKG9wdGlvbnM/LmluLCBkYXRlLCBiYXNlRGF0ZSk7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZSA/PyBlblVTOwogIGNvbnN0IHdlZWtTdGFydHNPbiA9IG9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyAwOwogIGNvbnN0IGRpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZGF0ZV8sIGJhc2VEYXRlXyk7CiAgaWYgKGlzTmFOKGRpZmYpKSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0aW1lIHZhbHVlIik7CiAgfQogIGxldCB0b2tlbjsKICBpZiAoZGlmZiA8IC02KSB7CiAgICB0b2tlbiA9ICJvdGhlciI7CiAgfSBlbHNlIGlmIChkaWZmIDwgLTEpIHsKICAgIHRva2VuID0gImxhc3RXZWVrIjsKICB9IGVsc2UgaWYgKGRpZmYgPCAwKSB7CiAgICB0b2tlbiA9ICJ5ZXN0ZXJkYXkiOwogIH0gZWxzZSBpZiAoZGlmZiA8IDEpIHsKICAgIHRva2VuID0gInRvZGF5IjsKICB9IGVsc2UgaWYgKGRpZmYgPCAyKSB7CiAgICB0b2tlbiA9ICJ0b21vcnJvdyI7CiAgfSBlbHNlIGlmIChkaWZmIDwgNykgewogICAgdG9rZW4gPSAibmV4dFdlZWsiOwogIH0gZWxzZSB7CiAgICB0b2tlbiA9ICJvdGhlciI7CiAgfQogIGNvbnN0IGZvcm1hdFN0ciA9IGxvY2FsZS5mb3JtYXRSZWxhdGl2ZSh0b2tlbiwgZGF0ZV8sIGJhc2VEYXRlXywgewogICAgbG9jYWxlLAogICAgd2Vla1N0YXJ0c09uCiAgfSk7CiAgcmV0dXJuIGZvcm1hdChkYXRlXywgZm9ybWF0U3RyLCB7IGxvY2FsZSwgd2Vla1N0YXJ0c09uIH0pOwp9CnZhciBmb3JtYXRSZWxhdGl2ZV9kZWZhdWx0Owp2YXIgaW5pdF9mb3JtYXRSZWxhdGl2ZTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0UmVsYXRpdmUuanMiKCkgewogICAgaW5pdF9kZWZhdWx0TG9jYWxlKCk7CiAgICBpbml0X2RlZmF1bHRPcHRpb25zKCk7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cygpOwogICAgaW5pdF9mb3JtYXQoKTsKICAgIGZvcm1hdFJlbGF0aXZlX2RlZmF1bHQgPSBmb3JtYXRSZWxhdGl2ZTI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZnJvbVVuaXhUaW1lLmpzCmZ1bmN0aW9uIGZyb21Vbml4VGltZSh1bml4VGltZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUodW5peFRpbWUgKiAxZTMsIG9wdGlvbnM/LmluKTsKfQp2YXIgZnJvbVVuaXhUaW1lX2RlZmF1bHQ7CnZhciBpbml0X2Zyb21Vbml4VGltZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mcm9tVW5peFRpbWUuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGZyb21Vbml4VGltZV9kZWZhdWx0ID0gZnJvbVVuaXhUaW1lOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERhdGUuanMKZnVuY3Rpb24gZ2V0RGF0ZShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbikuZ2V0RGF0ZSgpOwp9CnZhciBnZXREYXRlX2RlZmF1bHQ7CnZhciBpbml0X2dldERhdGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGF0ZS5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZ2V0RGF0ZV9kZWZhdWx0ID0gZ2V0RGF0ZTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREYXkuanMKZnVuY3Rpb24gZ2V0RGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKTsKfQp2YXIgZ2V0RGF5X2RlZmF1bHQ7CnZhciBpbml0X2dldERheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREYXkuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGdldERheV9kZWZhdWx0ID0gZ2V0RGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERheXNJbk1vbnRoLmpzCmZ1bmN0aW9uIGdldERheXNJbk1vbnRoKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgbW9udGhJbmRleCA9IF9kYXRlLmdldE1vbnRoKCk7CiAgY29uc3QgbGFzdERheU9mTW9udGgyID0gY29uc3RydWN0RnJvbShfZGF0ZSwgMCk7CiAgbGFzdERheU9mTW9udGgyLnNldEZ1bGxZZWFyKHllYXIsIG1vbnRoSW5kZXggKyAxLCAwKTsKICBsYXN0RGF5T2ZNb250aDIuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgcmV0dXJuIGxhc3REYXlPZk1vbnRoMi5nZXREYXRlKCk7Cn0KdmFyIGdldERheXNJbk1vbnRoX2RlZmF1bHQ7CnZhciBpbml0X2dldERheXNJbk1vbnRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERheXNJbk1vbnRoLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGdldERheXNJbk1vbnRoX2RlZmF1bHQgPSBnZXREYXlzSW5Nb250aDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0xlYXBZZWFyLmpzCmZ1bmN0aW9uIGlzTGVhcFllYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTsKICByZXR1cm4geWVhciAlIDQwMCA9PT0gMCB8fCB5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwOwp9CnZhciBpc0xlYXBZZWFyX2RlZmF1bHQ7CnZhciBpbml0X2lzTGVhcFllYXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNMZWFwWWVhci5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgaXNMZWFwWWVhcl9kZWZhdWx0ID0gaXNMZWFwWWVhcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREYXlzSW5ZZWFyLmpzCmZ1bmN0aW9uIGdldERheXNJblllYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBpZiAoTnVtYmVyLmlzTmFOKCtfZGF0ZSkpIHJldHVybiBOYU47CiAgcmV0dXJuIGlzTGVhcFllYXIoX2RhdGUpID8gMzY2IDogMzY1Owp9CnZhciBnZXREYXlzSW5ZZWFyX2RlZmF1bHQ7CnZhciBpbml0X2dldERheXNJblllYXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGF5c0luWWVhci5qcyIoKSB7CiAgICBpbml0X2lzTGVhcFllYXIoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBnZXREYXlzSW5ZZWFyX2RlZmF1bHQgPSBnZXREYXlzSW5ZZWFyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERlY2FkZS5qcwpmdW5jdGlvbiBnZXREZWNhZGUoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTsKICBjb25zdCBkZWNhZGUgPSBNYXRoLmZsb29yKHllYXIgLyAxMCkgKiAxMDsKICByZXR1cm4gZGVjYWRlOwp9CnZhciBnZXREZWNhZGVfZGVmYXVsdDsKdmFyIGluaXRfZ2V0RGVjYWRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERlY2FkZS5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZ2V0RGVjYWRlX2RlZmF1bHQgPSBnZXREZWNhZGU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGVmYXVsdE9wdGlvbnMuanMKZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnMyKCkgewogIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBnZXREZWZhdWx0T3B0aW9ucygpKTsKfQp2YXIgZ2V0RGVmYXVsdE9wdGlvbnNfZGVmYXVsdDsKdmFyIGluaXRfZ2V0RGVmYXVsdE9wdGlvbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGVmYXVsdE9wdGlvbnMuanMiKCkgewogICAgaW5pdF9kZWZhdWx0T3B0aW9ucygpOwogICAgZ2V0RGVmYXVsdE9wdGlvbnNfZGVmYXVsdCA9IGdldERlZmF1bHRPcHRpb25zMjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRIb3Vycy5qcwpmdW5jdGlvbiBnZXRIb3VycyhkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbikuZ2V0SG91cnMoKTsKfQp2YXIgZ2V0SG91cnNfZGVmYXVsdDsKdmFyIGluaXRfZ2V0SG91cnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SG91cnMuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGdldEhvdXJzX2RlZmF1bHQgPSBnZXRIb3VyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRJU09EYXkuanMKZnVuY3Rpb24gZ2V0SVNPRGF5KGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXkgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldERheSgpOwogIHJldHVybiBkYXkgPT09IDAgPyA3IDogZGF5Owp9CnZhciBnZXRJU09EYXlfZGVmYXVsdDsKdmFyIGluaXRfZ2V0SVNPRGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT0RheS5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZ2V0SVNPRGF5X2RlZmF1bHQgPSBnZXRJU09EYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SVNPV2Vla3NJblllYXIuanMKZnVuY3Rpb24gZ2V0SVNPV2Vla3NJblllYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IHRoaXNZZWFyID0gc3RhcnRPZklTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpOwogIGNvbnN0IG5leHRZZWFyID0gc3RhcnRPZklTT1dlZWtZZWFyKGFkZFdlZWtzKHRoaXNZZWFyLCA2MCkpOwogIGNvbnN0IGRpZmYgPSArbmV4dFllYXIgLSArdGhpc1llYXI7CiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIG1pbGxpc2Vjb25kc0luV2Vlayk7Cn0KdmFyIGdldElTT1dlZWtzSW5ZZWFyX2RlZmF1bHQ7CnZhciBpbml0X2dldElTT1dlZWtzSW5ZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT1dlZWtzSW5ZZWFyLmpzIigpIHsKICAgIGluaXRfYWRkV2Vla3MoKTsKICAgIGluaXRfY29uc3RhbnRzKCk7CiAgICBpbml0X3N0YXJ0T2ZJU09XZWVrWWVhcigpOwogICAgZ2V0SVNPV2Vla3NJblllYXJfZGVmYXVsdCA9IGdldElTT1dlZWtzSW5ZZWFyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldE1pbGxpc2Vjb25kcy5qcwpmdW5jdGlvbiBnZXRNaWxsaXNlY29uZHMoZGF0ZSkgewogIHJldHVybiB0b0RhdGUoZGF0ZSkuZ2V0TWlsbGlzZWNvbmRzKCk7Cn0KdmFyIGdldE1pbGxpc2Vjb25kc19kZWZhdWx0Owp2YXIgaW5pdF9nZXRNaWxsaXNlY29uZHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0TWlsbGlzZWNvbmRzLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBnZXRNaWxsaXNlY29uZHNfZGVmYXVsdCA9IGdldE1pbGxpc2Vjb25kczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRNaW51dGVzLmpzCmZ1bmN0aW9uIGdldE1pbnV0ZXMoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldE1pbnV0ZXMoKTsKfQp2YXIgZ2V0TWludXRlc19kZWZhdWx0Owp2YXIgaW5pdF9nZXRNaW51dGVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldE1pbnV0ZXMuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGdldE1pbnV0ZXNfZGVmYXVsdCA9IGdldE1pbnV0ZXM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0TW9udGguanMKZnVuY3Rpb24gZ2V0TW9udGgoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldE1vbnRoKCk7Cn0KdmFyIGdldE1vbnRoX2RlZmF1bHQ7CnZhciBpbml0X2dldE1vbnRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldE1vbnRoLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBnZXRNb250aF9kZWZhdWx0ID0gZ2V0TW9udGg7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0T3ZlcmxhcHBpbmdEYXlzSW5JbnRlcnZhbHMuanMKZnVuY3Rpb24gZ2V0T3ZlcmxhcHBpbmdEYXlzSW5JbnRlcnZhbHMoaW50ZXJ2YWxMZWZ0LCBpbnRlcnZhbFJpZ2h0KSB7CiAgY29uc3QgW2xlZnRTdGFydCwgbGVmdEVuZF0gPSBbCiAgICArdG9EYXRlKGludGVydmFsTGVmdC5zdGFydCksCiAgICArdG9EYXRlKGludGVydmFsTGVmdC5lbmQpCiAgXS5zb3J0KChhNSwgYjUpID0+IGE1IC0gYjUpOwogIGNvbnN0IFtyaWdodFN0YXJ0LCByaWdodEVuZF0gPSBbCiAgICArdG9EYXRlKGludGVydmFsUmlnaHQuc3RhcnQpLAogICAgK3RvRGF0ZShpbnRlcnZhbFJpZ2h0LmVuZCkKICBdLnNvcnQoKGE1LCBiNSkgPT4gYTUgLSBiNSk7CiAgY29uc3QgaXNPdmVybGFwcGluZyA9IGxlZnRTdGFydCA8IHJpZ2h0RW5kICYmIHJpZ2h0U3RhcnQgPCBsZWZ0RW5kOwogIGlmICghaXNPdmVybGFwcGluZykgcmV0dXJuIDA7CiAgY29uc3Qgb3ZlcmxhcExlZnQgPSByaWdodFN0YXJ0IDwgbGVmdFN0YXJ0ID8gbGVmdFN0YXJ0IDogcmlnaHRTdGFydDsKICBjb25zdCBsZWZ0ID0gb3ZlcmxhcExlZnQgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKG92ZXJsYXBMZWZ0KTsKICBjb25zdCBvdmVybGFwUmlnaHQgPSByaWdodEVuZCA+IGxlZnRFbmQgPyBsZWZ0RW5kIDogcmlnaHRFbmQ7CiAgY29uc3QgcmlnaHQgPSBvdmVybGFwUmlnaHQgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKG92ZXJsYXBSaWdodCk7CiAgcmV0dXJuIE1hdGguY2VpbCgocmlnaHQgLSBsZWZ0KSAvIG1pbGxpc2Vjb25kc0luRGF5KTsKfQp2YXIgZ2V0T3ZlcmxhcHBpbmdEYXlzSW5JbnRlcnZhbHNfZGVmYXVsdDsKdmFyIGluaXRfZ2V0T3ZlcmxhcHBpbmdEYXlzSW5JbnRlcnZhbHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0T3ZlcmxhcHBpbmdEYXlzSW5JbnRlcnZhbHMuanMiKCkgewogICAgaW5pdF9nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKCk7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGdldE92ZXJsYXBwaW5nRGF5c0luSW50ZXJ2YWxzX2RlZmF1bHQgPSBnZXRPdmVybGFwcGluZ0RheXNJbkludGVydmFsczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRTZWNvbmRzLmpzCmZ1bmN0aW9uIGdldFNlY29uZHMoZGF0ZSkgewogIHJldHVybiB0b0RhdGUoZGF0ZSkuZ2V0U2Vjb25kcygpOwp9CnZhciBnZXRTZWNvbmRzX2RlZmF1bHQ7CnZhciBpbml0X2dldFNlY29uZHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0U2Vjb25kcy5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZ2V0U2Vjb25kc19kZWZhdWx0ID0gZ2V0U2Vjb25kczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRUaW1lLmpzCmZ1bmN0aW9uIGdldFRpbWUoZGF0ZSkgewogIHJldHVybiArdG9EYXRlKGRhdGUpOwp9CnZhciBnZXRUaW1lX2RlZmF1bHQ7CnZhciBpbml0X2dldFRpbWUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0VGltZS5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZ2V0VGltZV9kZWZhdWx0ID0gZ2V0VGltZTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRVbml4VGltZS5qcwpmdW5jdGlvbiBnZXRVbml4VGltZShkYXRlKSB7CiAgcmV0dXJuIE1hdGgudHJ1bmMoK3RvRGF0ZShkYXRlKSAvIDFlMyk7Cn0KdmFyIGdldFVuaXhUaW1lX2RlZmF1bHQ7CnZhciBpbml0X2dldFVuaXhUaW1lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFVuaXhUaW1lLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBnZXRVbml4VGltZV9kZWZhdWx0ID0gZ2V0VW5peFRpbWU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0V2Vla09mTW9udGguanMKZnVuY3Rpb24gZ2V0V2Vla09mTW9udGgoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRlZmF1bHRPcHRpb25zMiA9IGdldERlZmF1bHRPcHRpb25zKCk7CiAgY29uc3Qgd2Vla1N0YXJ0c09uID0gb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi53ZWVrU3RhcnRzT24gPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IDA7CiAgY29uc3QgY3VycmVudERheU9mTW9udGggPSBnZXREYXRlKHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbikpOwogIGlmIChpc05hTihjdXJyZW50RGF5T2ZNb250aCkpIHJldHVybiBOYU47CiAgY29uc3Qgc3RhcnRXZWVrRGF5ID0gZ2V0RGF5KHN0YXJ0T2ZNb250aChkYXRlLCBvcHRpb25zKSk7CiAgbGV0IGxhc3REYXlPZkZpcnN0V2VlayA9IHdlZWtTdGFydHNPbiAtIHN0YXJ0V2Vla0RheTsKICBpZiAobGFzdERheU9mRmlyc3RXZWVrIDw9IDApIGxhc3REYXlPZkZpcnN0V2VlayArPSA3OwogIGNvbnN0IHJlbWFpbmluZ0RheXNBZnRlckZpcnN0V2VlayA9IGN1cnJlbnREYXlPZk1vbnRoIC0gbGFzdERheU9mRmlyc3RXZWVrOwogIHJldHVybiBNYXRoLmNlaWwocmVtYWluaW5nRGF5c0FmdGVyRmlyc3RXZWVrIC8gNykgKyAxOwp9CnZhciBnZXRXZWVrT2ZNb250aF9kZWZhdWx0Owp2YXIgaW5pdF9nZXRXZWVrT2ZNb250aCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRXZWVrT2ZNb250aC5qcyIoKSB7CiAgICBpbml0X2RlZmF1bHRPcHRpb25zKCk7CiAgICBpbml0X2dldERhdGUoKTsKICAgIGluaXRfZ2V0RGF5KCk7CiAgICBpbml0X3N0YXJ0T2ZNb250aCgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGdldFdlZWtPZk1vbnRoX2RlZmF1bHQgPSBnZXRXZWVrT2ZNb250aDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sYXN0RGF5T2ZNb250aC5qcwpmdW5jdGlvbiBsYXN0RGF5T2ZNb250aChkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IG1vbnRoID0gX2RhdGUuZ2V0TW9udGgoKTsKICBfZGF0ZS5zZXRGdWxsWWVhcihfZGF0ZS5nZXRGdWxsWWVhcigpLCBtb250aCArIDEsIDApOwogIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiB0b0RhdGUoX2RhdGUsIG9wdGlvbnM/LmluKTsKfQp2YXIgbGFzdERheU9mTW9udGhfZGVmYXVsdDsKdmFyIGluaXRfbGFzdERheU9mTW9udGggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbGFzdERheU9mTW9udGguanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGxhc3REYXlPZk1vbnRoX2RlZmF1bHQgPSBsYXN0RGF5T2ZNb250aDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRXZWVrc0luTW9udGguanMKZnVuY3Rpb24gZ2V0V2Vla3NJbk1vbnRoKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBjb250ZXh0RGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgcmV0dXJuIGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MoCiAgICBsYXN0RGF5T2ZNb250aChjb250ZXh0RGF0ZSwgb3B0aW9ucyksCiAgICBzdGFydE9mTW9udGgoY29udGV4dERhdGUsIG9wdGlvbnMpLAogICAgb3B0aW9ucwogICkgKyAxOwp9CnZhciBnZXRXZWVrc0luTW9udGhfZGVmYXVsdDsKdmFyIGluaXRfZ2V0V2Vla3NJbk1vbnRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFdlZWtzSW5Nb250aC5qcyIoKSB7CiAgICBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MoKTsKICAgIGluaXRfbGFzdERheU9mTW9udGgoKTsKICAgIGluaXRfc3RhcnRPZk1vbnRoKCk7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZ2V0V2Vla3NJbk1vbnRoX2RlZmF1bHQgPSBnZXRXZWVrc0luTW9udGg7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0WWVhci5qcwpmdW5jdGlvbiBnZXRZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXRGdWxsWWVhcigpOwp9CnZhciBnZXRZZWFyX2RlZmF1bHQ7CnZhciBpbml0X2dldFllYXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0WWVhci5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZ2V0WWVhcl9kZWZhdWx0ID0gZ2V0WWVhcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9ob3Vyc1RvTWlsbGlzZWNvbmRzLmpzCmZ1bmN0aW9uIGhvdXJzVG9NaWxsaXNlY29uZHMoaG91cnMpIHsKICByZXR1cm4gTWF0aC50cnVuYyhob3VycyAqIG1pbGxpc2Vjb25kc0luSG91cik7Cn0KdmFyIGhvdXJzVG9NaWxsaXNlY29uZHNfZGVmYXVsdDsKdmFyIGluaXRfaG91cnNUb01pbGxpc2Vjb25kcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9ob3Vyc1RvTWlsbGlzZWNvbmRzLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzKCk7CiAgICBob3Vyc1RvTWlsbGlzZWNvbmRzX2RlZmF1bHQgPSBob3Vyc1RvTWlsbGlzZWNvbmRzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2hvdXJzVG9NaW51dGVzLmpzCmZ1bmN0aW9uIGhvdXJzVG9NaW51dGVzKGhvdXJzKSB7CiAgcmV0dXJuIE1hdGgudHJ1bmMoaG91cnMgKiBtaW51dGVzSW5Ib3VyKTsKfQp2YXIgaG91cnNUb01pbnV0ZXNfZGVmYXVsdDsKdmFyIGluaXRfaG91cnNUb01pbnV0ZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaG91cnNUb01pbnV0ZXMuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIGhvdXJzVG9NaW51dGVzX2RlZmF1bHQgPSBob3Vyc1RvTWludXRlczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9ob3Vyc1RvU2Vjb25kcy5qcwpmdW5jdGlvbiBob3Vyc1RvU2Vjb25kcyhob3VycykgewogIHJldHVybiBNYXRoLnRydW5jKGhvdXJzICogc2Vjb25kc0luSG91cik7Cn0KdmFyIGhvdXJzVG9TZWNvbmRzX2RlZmF1bHQ7CnZhciBpbml0X2hvdXJzVG9TZWNvbmRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2hvdXJzVG9TZWNvbmRzLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzKCk7CiAgICBob3Vyc1RvU2Vjb25kc19kZWZhdWx0ID0gaG91cnNUb1NlY29uZHM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaW50ZXJ2YWwuanMKZnVuY3Rpb24gaW50ZXJ2YWwyKHN0YXJ0LCBlbmQzLCBvcHRpb25zKSB7CiAgY29uc3QgW19zdGFydCwgX2VuZF0gPSBub3JtYWxpemVEYXRlcyhvcHRpb25zPy5pbiwgc3RhcnQsIGVuZDMpOwogIGlmIChpc05hTigrX3N0YXJ0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3RhcnQgZGF0ZSBpcyBpbnZhbGlkIik7CiAgaWYgKGlzTmFOKCtfZW5kKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiRW5kIGRhdGUgaXMgaW52YWxpZCIpOwogIGlmIChvcHRpb25zPy5hc3NlcnRQb3NpdGl2ZSAmJiArX3N0YXJ0ID4gK19lbmQpCiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFbmQgZGF0ZSBtdXN0IGJlIGFmdGVyIHN0YXJ0IGRhdGUiKTsKICByZXR1cm4geyBzdGFydDogX3N0YXJ0LCBlbmQ6IF9lbmQgfTsKfQp2YXIgaW50ZXJ2YWxfZGVmYXVsdDsKdmFyIGluaXRfaW50ZXJ2YWwyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2ludGVydmFsLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplRGF0ZXMoKTsKICAgIGludGVydmFsX2RlZmF1bHQgPSBpbnRlcnZhbDI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaW50ZXJ2YWxUb0R1cmF0aW9uLmpzCmZ1bmN0aW9uIGludGVydmFsVG9EdXJhdGlvbihpbnRlcnZhbDMsIG9wdGlvbnMpIHsKICBjb25zdCB7IHN0YXJ0LCBlbmQ6IGVuZDMgfSA9IG5vcm1hbGl6ZUludGVydmFsKG9wdGlvbnM/LmluLCBpbnRlcnZhbDMpOwogIGNvbnN0IGR1cmF0aW9uID0ge307CiAgY29uc3QgeWVhcnMgPSBkaWZmZXJlbmNlSW5ZZWFycyhlbmQzLCBzdGFydCk7CiAgaWYgKHllYXJzKSBkdXJhdGlvbi55ZWFycyA9IHllYXJzOwogIGNvbnN0IHJlbWFpbmluZ01vbnRocyA9IGFkZChzdGFydCwgeyB5ZWFyczogZHVyYXRpb24ueWVhcnMgfSk7CiAgY29uc3QgbW9udGhzMiA9IGRpZmZlcmVuY2VJbk1vbnRocyhlbmQzLCByZW1haW5pbmdNb250aHMpOwogIGlmIChtb250aHMyKSBkdXJhdGlvbi5tb250aHMgPSBtb250aHMyOwogIGNvbnN0IHJlbWFpbmluZ0RheXMgPSBhZGQocmVtYWluaW5nTW9udGhzLCB7IG1vbnRoczogZHVyYXRpb24ubW9udGhzIH0pOwogIGNvbnN0IGRheXMyID0gZGlmZmVyZW5jZUluRGF5cyhlbmQzLCByZW1haW5pbmdEYXlzKTsKICBpZiAoZGF5czIpIGR1cmF0aW9uLmRheXMgPSBkYXlzMjsKICBjb25zdCByZW1haW5pbmdIb3VycyA9IGFkZChyZW1haW5pbmdEYXlzLCB7IGRheXM6IGR1cmF0aW9uLmRheXMgfSk7CiAgY29uc3QgaG91cnMgPSBkaWZmZXJlbmNlSW5Ib3VycyhlbmQzLCByZW1haW5pbmdIb3Vycyk7CiAgaWYgKGhvdXJzKSBkdXJhdGlvbi5ob3VycyA9IGhvdXJzOwogIGNvbnN0IHJlbWFpbmluZ01pbnV0ZXMgPSBhZGQocmVtYWluaW5nSG91cnMsIHsgaG91cnM6IGR1cmF0aW9uLmhvdXJzIH0pOwogIGNvbnN0IG1pbnV0ZXMgPSBkaWZmZXJlbmNlSW5NaW51dGVzKGVuZDMsIHJlbWFpbmluZ01pbnV0ZXMpOwogIGlmIChtaW51dGVzKSBkdXJhdGlvbi5taW51dGVzID0gbWludXRlczsKICBjb25zdCByZW1haW5pbmdTZWNvbmRzID0gYWRkKHJlbWFpbmluZ01pbnV0ZXMsIHsgbWludXRlczogZHVyYXRpb24ubWludXRlcyB9KTsKICBjb25zdCBzZWNvbmRzID0gZGlmZmVyZW5jZUluU2Vjb25kcyhlbmQzLCByZW1haW5pbmdTZWNvbmRzKTsKICBpZiAoc2Vjb25kcykgZHVyYXRpb24uc2Vjb25kcyA9IHNlY29uZHM7CiAgcmV0dXJuIGR1cmF0aW9uOwp9CnZhciBpbnRlcnZhbFRvRHVyYXRpb25fZGVmYXVsdDsKdmFyIGluaXRfaW50ZXJ2YWxUb0R1cmF0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2ludGVydmFsVG9EdXJhdGlvbi5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZUludGVydmFsKCk7CiAgICBpbml0X2FkZCgpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5EYXlzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkhvdXJzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbk1pbnV0ZXMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluTW9udGhzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJblNlY29uZHMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluWWVhcnMoKTsKICAgIGludGVydmFsVG9EdXJhdGlvbl9kZWZhdWx0ID0gaW50ZXJ2YWxUb0R1cmF0aW9uOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2ludGxGb3JtYXQuanMKZnVuY3Rpb24gaW50bEZvcm1hdChkYXRlLCBmb3JtYXRPckxvY2FsZSwgbG9jYWxlT3B0aW9ucykgewogIGxldCBmb3JtYXRPcHRpb25zOwogIGlmIChpc0Zvcm1hdE9wdGlvbnMoZm9ybWF0T3JMb2NhbGUpKSB7CiAgICBmb3JtYXRPcHRpb25zID0gZm9ybWF0T3JMb2NhbGU7CiAgfSBlbHNlIHsKICAgIGxvY2FsZU9wdGlvbnMgPSBmb3JtYXRPckxvY2FsZTsKICB9CiAgcmV0dXJuIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZU9wdGlvbnM/LmxvY2FsZSwgZm9ybWF0T3B0aW9ucykuZm9ybWF0KAogICAgdG9EYXRlKGRhdGUpCiAgKTsKfQpmdW5jdGlvbiBpc0Zvcm1hdE9wdGlvbnMob3B0cykgewogIHJldHVybiBvcHRzICE9PSB2b2lkIDAgJiYgISgibG9jYWxlIiBpbiBvcHRzKTsKfQp2YXIgaW50bEZvcm1hdF9kZWZhdWx0Owp2YXIgaW5pdF9pbnRsRm9ybWF0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2ludGxGb3JtYXQuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGludGxGb3JtYXRfZGVmYXVsdCA9IGludGxGb3JtYXQ7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaW50bEZvcm1hdERpc3RhbmNlLmpzCmZ1bmN0aW9uIGludGxGb3JtYXREaXN0YW5jZShsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgbGV0IHZhbHVlMiA9IDA7CiAgbGV0IHVuaXQ7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGlmICghb3B0aW9ucz8udW5pdCkgewogICAgY29uc3QgZGlmZkluU2Vjb25kcyA9IGRpZmZlcmVuY2VJblNlY29uZHMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgIGlmIChNYXRoLmFicyhkaWZmSW5TZWNvbmRzKSA8IHNlY29uZHNJbk1pbnV0ZSkgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5TZWNvbmRzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgICAgIHVuaXQgPSAic2Vjb25kIjsKICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoZGlmZkluU2Vjb25kcykgPCBzZWNvbmRzSW5Ib3VyKSB7CiAgICAgIHZhbHVlMiA9IGRpZmZlcmVuY2VJbk1pbnV0ZXMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgICAgdW5pdCA9ICJtaW51dGUiOwogICAgfSBlbHNlIGlmIChNYXRoLmFicyhkaWZmSW5TZWNvbmRzKSA8IHNlY29uZHNJbkRheSAmJiBNYXRoLmFicyhkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKSkgPCAxKSB7CiAgICAgIHZhbHVlMiA9IGRpZmZlcmVuY2VJbkhvdXJzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgICAgIHVuaXQgPSAiaG91ciI7CiAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGRpZmZJblNlY29uZHMpIDwgc2Vjb25kc0luV2VlayAmJiAodmFsdWUyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXykpICYmIE1hdGguYWJzKHZhbHVlMikgPCA3KSB7CiAgICAgIHVuaXQgPSAiZGF5IjsKICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoZGlmZkluU2Vjb25kcykgPCBzZWNvbmRzSW5Nb250aCkgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgICAgIHVuaXQgPSAid2VlayI7CiAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGRpZmZJblNlY29uZHMpIDwgc2Vjb25kc0luUXVhcnRlcikgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgICB1bml0ID0gIm1vbnRoIjsKICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoZGlmZkluU2Vjb25kcykgPCBzZWNvbmRzSW5ZZWFyKSB7CiAgICAgIGlmIChkaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXykgPCA0KSB7CiAgICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgICAgIHVuaXQgPSAicXVhcnRlciI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgICAgIHVuaXQgPSAieWVhciI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlMiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgICAgdW5pdCA9ICJ5ZWFyIjsKICAgIH0KICB9IGVsc2UgewogICAgdW5pdCA9IG9wdGlvbnM/LnVuaXQ7CiAgICBpZiAodW5pdCA9PT0gInNlY29uZCIpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluU2Vjb25kcyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgfSBlbHNlIGlmICh1bml0ID09PSAibWludXRlIikgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5NaW51dGVzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgICB9IGVsc2UgaWYgKHVuaXQgPT09ICJob3VyIikgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5Ib3VycyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgfSBlbHNlIGlmICh1bml0ID09PSAiZGF5IikgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgIH0gZWxzZSBpZiAodW5pdCA9PT0gIndlZWsiKSB7CiAgICAgIHZhbHVlMiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgIH0gZWxzZSBpZiAodW5pdCA9PT0gIm1vbnRoIikgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgfSBlbHNlIGlmICh1bml0ID09PSAicXVhcnRlciIpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgfSBlbHNlIGlmICh1bml0ID09PSAieWVhciIpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgfQogIH0KICBjb25zdCBydGYgPSBuZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQob3B0aW9ucz8ubG9jYWxlLCB7CiAgICBudW1lcmljOiAiYXV0byIsCiAgICAuLi5vcHRpb25zCiAgfSk7CiAgcmV0dXJuIHJ0Zi5mb3JtYXQodmFsdWUyLCB1bml0KTsKfQp2YXIgaW50bEZvcm1hdERpc3RhbmNlX2RlZmF1bHQ7CnZhciBpbml0X2ludGxGb3JtYXREaXN0YW5jZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pbnRsRm9ybWF0RGlzdGFuY2UuanMiKCkgewogICAgaW5pdF9ub3JtYWxpemVEYXRlcygpOwogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcygpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkhvdXJzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbk1pbnV0ZXMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluU2Vjb25kcygpOwogICAgaW50bEZvcm1hdERpc3RhbmNlX2RlZmF1bHQgPSBpbnRsRm9ybWF0RGlzdGFuY2U7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNBZnRlci5qcwpmdW5jdGlvbiBpc0FmdGVyKGRhdGUsIGRhdGVUb0NvbXBhcmUpIHsKICByZXR1cm4gK3RvRGF0ZShkYXRlKSA+ICt0b0RhdGUoZGF0ZVRvQ29tcGFyZSk7Cn0KdmFyIGlzQWZ0ZXJfZGVmYXVsdDsKdmFyIGluaXRfaXNBZnRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0FmdGVyLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpc0FmdGVyX2RlZmF1bHQgPSBpc0FmdGVyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzQmVmb3JlLmpzCmZ1bmN0aW9uIGlzQmVmb3JlKGRhdGUsIGRhdGVUb0NvbXBhcmUpIHsKICByZXR1cm4gK3RvRGF0ZShkYXRlKSA8ICt0b0RhdGUoZGF0ZVRvQ29tcGFyZSk7Cn0KdmFyIGlzQmVmb3JlX2RlZmF1bHQ7CnZhciBpbml0X2lzQmVmb3JlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzQmVmb3JlLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpc0JlZm9yZV9kZWZhdWx0ID0gaXNCZWZvcmU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNFcXVhbC5qcwpmdW5jdGlvbiBpc0VxdWFsKGxlZnREYXRlLCByaWdodERhdGUpIHsKICByZXR1cm4gK3RvRGF0ZShsZWZ0RGF0ZSkgPT09ICt0b0RhdGUocmlnaHREYXRlKTsKfQp2YXIgaXNFcXVhbF9kZWZhdWx0Owp2YXIgaW5pdF9pc0VxdWFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzRXF1YWwuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGlzRXF1YWxfZGVmYXVsdCA9IGlzRXF1YWw7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNFeGlzdHMuanMKZnVuY3Rpb24gaXNFeGlzdHMoeWVhciwgbW9udGgsIGRheSkgewogIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5KTsKICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpID09PSB5ZWFyICYmIGRhdGUuZ2V0TW9udGgoKSA9PT0gbW9udGggJiYgZGF0ZS5nZXREYXRlKCkgPT09IGRheTsKfQp2YXIgaXNFeGlzdHNfZGVmYXVsdDsKdmFyIGluaXRfaXNFeGlzdHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNFeGlzdHMuanMiKCkgewogICAgaXNFeGlzdHNfZGVmYXVsdCA9IGlzRXhpc3RzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzRmlyc3REYXlPZk1vbnRoLmpzCmZ1bmN0aW9uIGlzRmlyc3REYXlPZk1vbnRoKGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXRlKCkgPT09IDE7Cn0KdmFyIGlzRmlyc3REYXlPZk1vbnRoX2RlZmF1bHQ7CnZhciBpbml0X2lzRmlyc3REYXlPZk1vbnRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzRmlyc3REYXlPZk1vbnRoLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpc0ZpcnN0RGF5T2ZNb250aF9kZWZhdWx0ID0gaXNGaXJzdERheU9mTW9udGg7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNGcmlkYXkuanMKZnVuY3Rpb24gaXNGcmlkYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldERheSgpID09PSA1Owp9CnZhciBpc0ZyaWRheV9kZWZhdWx0Owp2YXIgaW5pdF9pc0ZyaWRheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0ZyaWRheS5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgaXNGcmlkYXlfZGVmYXVsdCA9IGlzRnJpZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzRnV0dXJlLmpzCmZ1bmN0aW9uIGlzRnV0dXJlKGRhdGUpIHsKICByZXR1cm4gK3RvRGF0ZShkYXRlKSA+IERhdGUubm93KCk7Cn0KdmFyIGlzRnV0dXJlX2RlZmF1bHQ7CnZhciBpbml0X2lzRnV0dXJlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzRnV0dXJlLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpc0Z1dHVyZV9kZWZhdWx0ID0gaXNGdXR1cmU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvdHJhbnNwb3NlLmpzCmZ1bmN0aW9uIHRyYW5zcG9zZShkYXRlLCBjb25zdHJ1Y3RvcikgewogIGNvbnN0IGRhdGVfID0gaXNDb25zdHJ1Y3Rvcihjb25zdHJ1Y3RvcikgPyBuZXcgY29uc3RydWN0b3IoMCkgOiBjb25zdHJ1Y3RGcm9tKGNvbnN0cnVjdG9yLCAwKTsKICBkYXRlXy5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpOwogIGRhdGVfLnNldEhvdXJzKAogICAgZGF0ZS5nZXRIb3VycygpLAogICAgZGF0ZS5nZXRNaW51dGVzKCksCiAgICBkYXRlLmdldFNlY29uZHMoKSwKICAgIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkKICApOwogIHJldHVybiBkYXRlXzsKfQpmdW5jdGlvbiBpc0NvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKSB7CiAgcmV0dXJuIHR5cGVvZiBjb25zdHJ1Y3RvciA9PT0gImZ1bmN0aW9uIiAmJiBjb25zdHJ1Y3Rvci5wcm90b3R5cGU/LmNvbnN0cnVjdG9yID09PSBjb25zdHJ1Y3RvcjsKfQp2YXIgdHJhbnNwb3NlX2RlZmF1bHQ7CnZhciBpbml0X3RyYW5zcG9zZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy90cmFuc3Bvc2UuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICB0cmFuc3Bvc2VfZGVmYXVsdCA9IHRyYW5zcG9zZTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL1NldHRlci5qcwp2YXIgVElNRVpPTkVfVU5JVF9QUklPUklUWSwgU2V0dGVyLCBWYWx1ZVNldHRlciwgRGF0ZVRpbWV6b25lU2V0dGVyOwp2YXIgaW5pdF9TZXR0ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9TZXR0ZXIuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X3RyYW5zcG9zZSgpOwogICAgVElNRVpPTkVfVU5JVF9QUklPUklUWSA9IDEwOwogICAgU2V0dGVyID0gY2xhc3MgewogICAgICBzdWJQcmlvcml0eSA9IDA7CiAgICAgIHZhbGlkYXRlKF91dGNEYXRlLCBfb3B0aW9ucykgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9OwogICAgVmFsdWVTZXR0ZXIgPSBjbGFzcyBleHRlbmRzIFNldHRlciB7CiAgICAgIGNvbnN0cnVjdG9yKHZhbHVlMiwgdmFsaWRhdGVWYWx1ZSwgc2V0VmFsdWUsIHByaW9yaXR5LCBzdWJQcmlvcml0eSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlMjsKICAgICAgICB0aGlzLnZhbGlkYXRlVmFsdWUgPSB2YWxpZGF0ZVZhbHVlOwogICAgICAgIHRoaXMuc2V0VmFsdWUgPSBzZXRWYWx1ZTsKICAgICAgICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7CiAgICAgICAgaWYgKHN1YlByaW9yaXR5KSB7CiAgICAgICAgICB0aGlzLnN1YlByaW9yaXR5ID0gc3ViUHJpb3JpdHk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhbGlkYXRlKGRhdGUsIG9wdGlvbnMpIHsKICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVZhbHVlKGRhdGUsIHRoaXMudmFsdWUsIG9wdGlvbnMpOwogICAgICB9CiAgICAgIHNldChkYXRlLCBmbGFncywgb3B0aW9ucykgewogICAgICAgIHJldHVybiB0aGlzLnNldFZhbHVlKGRhdGUsIGZsYWdzLCB0aGlzLnZhbHVlLCBvcHRpb25zKTsKICAgICAgfQogICAgfTsKICAgIERhdGVUaW1lem9uZVNldHRlciA9IGNsYXNzIGV4dGVuZHMgU2V0dGVyIHsKICAgICAgcHJpb3JpdHkgPSBUSU1FWk9ORV9VTklUX1BSSU9SSVRZOwogICAgICBzdWJQcmlvcml0eSA9IC0xOwogICAgICBjb25zdHJ1Y3Rvcihjb250ZXh0MiwgcmVmZXJlbmNlKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0MiB8fCAoKGRhdGUpID0+IGNvbnN0cnVjdEZyb20ocmVmZXJlbmNlLCBkYXRlKSk7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIGZsYWdzKSB7CiAgICAgICAgaWYgKGZsYWdzLnRpbWVzdGFtcElzU2V0KSByZXR1cm4gZGF0ZTsKICAgICAgICByZXR1cm4gY29uc3RydWN0RnJvbShkYXRlLCB0cmFuc3Bvc2UoZGF0ZSwgdGhpcy5jb250ZXh0KSk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9QYXJzZXIuanMKdmFyIFBhcnNlcjsKdmFyIGluaXRfUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvUGFyc2VyLmpzIigpIHsKICAgIGluaXRfU2V0dGVyKCk7CiAgICBQYXJzZXIgPSBjbGFzcyB7CiAgICAgIHJ1bihkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyLCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyLCBvcHRpb25zKTsKICAgICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICBzZXR0ZXI6IG5ldyBWYWx1ZVNldHRlcigKICAgICAgICAgICAgcmVzdWx0LnZhbHVlLAogICAgICAgICAgICB0aGlzLnZhbGlkYXRlLAogICAgICAgICAgICB0aGlzLnNldCwKICAgICAgICAgICAgdGhpcy5wcmlvcml0eSwKICAgICAgICAgICAgdGhpcy5zdWJQcmlvcml0eQogICAgICAgICAgKSwKICAgICAgICAgIHJlc3Q6IHJlc3VsdC5yZXN0CiAgICAgICAgfTsKICAgICAgfQogICAgICB2YWxpZGF0ZShfdXRjRGF0ZSwgX3ZhbHVlLCBfb3B0aW9ucykgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9FcmFQYXJzZXIuanMKdmFyIEVyYVBhcnNlcjsKdmFyIGluaXRfRXJhUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9FcmFQYXJzZXIuanMiKCkgewogICAgaW5pdF9QYXJzZXIoKTsKICAgIEVyYVBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSAxNDA7CiAgICAgIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAvLyBBRCwgQkMKICAgICAgICAgIGNhc2UgIkciOgogICAgICAgICAgY2FzZSAiR0ciOgogICAgICAgICAgY2FzZSAiR0dHIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5lcmEoZGF0ZVN0cmluZywgeyB3aWR0aDogImFiYnJldmlhdGVkIiB9KSB8fCBtYXRjaDIuZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciIH0pOwogICAgICAgICAgLy8gQSwgQgogICAgICAgICAgY2FzZSAiR0dHR0ciOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmVyYShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiB9KTsKICAgICAgICAgIC8vIEFubm8gRG9taW5pLCBCZWZvcmUgQ2hyaXN0CiAgICAgICAgICBjYXNlICJHR0dHIjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIuZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJ3aWRlIiB9KSB8fCBtYXRjaDIuZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJhYmJyZXZpYXRlZCIgfSkgfHwgbWF0Y2gyLmVyYShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBmbGFncy5lcmEgPSB2YWx1ZTI7CiAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcih2YWx1ZTIsIDAsIDEpOwogICAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICAgICAgcmV0dXJuIGRhdGU7CiAgICAgIH0KICAgICAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJSIiwgInUiLCAidCIsICJUIl07CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvY29uc3RhbnRzLmpzCnZhciBudW1lcmljUGF0dGVybnMsIHRpbWV6b25lUGF0dGVybnM7CnZhciBpbml0X2NvbnN0YW50czIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9jb25zdGFudHMuanMiKCkgewogICAgbnVtZXJpY1BhdHRlcm5zID0gewogICAgICBtb250aDogL14oMVswLTJdfDA/XGQpLywKICAgICAgLy8gMCB0byAxMgogICAgICBkYXRlOiAvXigzWzAtMV18WzAtMl0/XGQpLywKICAgICAgLy8gMCB0byAzMQogICAgICBkYXlPZlllYXI6IC9eKDM2WzAtNl18M1swLTVdXGR8WzAtMl0/XGQ/XGQpLywKICAgICAgLy8gMCB0byAzNjYKICAgICAgd2VlazogL14oNVswLTNdfFswLTRdP1xkKS8sCiAgICAgIC8vIDAgdG8gNTMKICAgICAgaG91cjIzaDogL14oMlswLTNdfFswLTFdP1xkKS8sCiAgICAgIC8vIDAgdG8gMjMKICAgICAgaG91cjI0aDogL14oMlswLTRdfFswLTFdP1xkKS8sCiAgICAgIC8vIDAgdG8gMjQKICAgICAgaG91cjExaDogL14oMVswLTFdfDA/XGQpLywKICAgICAgLy8gMCB0byAxMQogICAgICBob3VyMTJoOiAvXigxWzAtMl18MD9cZCkvLAogICAgICAvLyAwIHRvIDEyCiAgICAgIG1pbnV0ZTogL15bMC01XT9cZC8sCiAgICAgIC8vIDAgdG8gNTkKICAgICAgc2Vjb25kOiAvXlswLTVdP1xkLywKICAgICAgLy8gMCB0byA1OQogICAgICBzaW5nbGVEaWdpdDogL15cZC8sCiAgICAgIC8vIDAgdG8gOQogICAgICB0d29EaWdpdHM6IC9eXGR7MSwyfS8sCiAgICAgIC8vIDAgdG8gOTkKICAgICAgdGhyZWVEaWdpdHM6IC9eXGR7MSwzfS8sCiAgICAgIC8vIDAgdG8gOTk5CiAgICAgIGZvdXJEaWdpdHM6IC9eXGR7MSw0fS8sCiAgICAgIC8vIDAgdG8gOTk5OQogICAgICBhbnlEaWdpdHNTaWduZWQ6IC9eLT9cZCsvLAogICAgICBzaW5nbGVEaWdpdFNpZ25lZDogL14tP1xkLywKICAgICAgLy8gMCB0byA5LCAtMCB0byAtOQogICAgICB0d29EaWdpdHNTaWduZWQ6IC9eLT9cZHsxLDJ9LywKICAgICAgLy8gMCB0byA5OSwgLTAgdG8gLTk5CiAgICAgIHRocmVlRGlnaXRzU2lnbmVkOiAvXi0/XGR7MSwzfS8sCiAgICAgIC8vIDAgdG8gOTk5LCAtMCB0byAtOTk5CiAgICAgIGZvdXJEaWdpdHNTaWduZWQ6IC9eLT9cZHsxLDR9LwogICAgICAvLyAwIHRvIDk5OTksIC0wIHRvIC05OTk5CiAgICB9OwogICAgdGltZXpvbmVQYXR0ZXJucyA9IHsKICAgICAgYmFzaWNPcHRpb25hbE1pbnV0ZXM6IC9eKFsrLV0pKFxkezJ9KShcZHsyfSk/fFovLAogICAgICBiYXNpYzogL14oWystXSkoXGR7Mn0pKFxkezJ9KXxaLywKICAgICAgYmFzaWNPcHRpb25hbFNlY29uZHM6IC9eKFsrLV0pKFxkezJ9KShcZHsyfSkoKFxkezJ9KSk/fFovLAogICAgICBleHRlbmRlZDogL14oWystXSkoXGR7Mn0pOihcZHsyfSl8Wi8sCiAgICAgIGV4dGVuZGVkT3B0aW9uYWxTZWNvbmRzOiAvXihbKy1dKShcZHsyfSk6KFxkezJ9KSg6KFxkezJ9KSk/fFovCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvdXRpbHMuanMKZnVuY3Rpb24gbWFwVmFsdWUocGFyc2VGblJlc3VsdCwgbWFwRm4pIHsKICBpZiAoIXBhcnNlRm5SZXN1bHQpIHsKICAgIHJldHVybiBwYXJzZUZuUmVzdWx0OwogIH0KICByZXR1cm4gewogICAgdmFsdWU6IG1hcEZuKHBhcnNlRm5SZXN1bHQudmFsdWUpLAogICAgcmVzdDogcGFyc2VGblJlc3VsdC5yZXN0CiAgfTsKfQpmdW5jdGlvbiBwYXJzZU51bWVyaWNQYXR0ZXJuKHBhdHRlcm4sIGRhdGVTdHJpbmcpIHsKICBjb25zdCBtYXRjaFJlc3VsdCA9IGRhdGVTdHJpbmcubWF0Y2gocGF0dGVybik7CiAgaWYgKCFtYXRjaFJlc3VsdCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiB7CiAgICB2YWx1ZTogcGFyc2VJbnQobWF0Y2hSZXN1bHRbMF0sIDEwKSwKICAgIHJlc3Q6IGRhdGVTdHJpbmcuc2xpY2UobWF0Y2hSZXN1bHRbMF0ubGVuZ3RoKQogIH07Cn0KZnVuY3Rpb24gcGFyc2VUaW1lem9uZVBhdHRlcm4ocGF0dGVybiwgZGF0ZVN0cmluZykgewogIGNvbnN0IG1hdGNoUmVzdWx0ID0gZGF0ZVN0cmluZy5tYXRjaChwYXR0ZXJuKTsKICBpZiAoIW1hdGNoUmVzdWx0KSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgaWYgKG1hdGNoUmVzdWx0WzBdID09PSAiWiIpIHsKICAgIHJldHVybiB7CiAgICAgIHZhbHVlOiAwLAogICAgICByZXN0OiBkYXRlU3RyaW5nLnNsaWNlKDEpCiAgICB9OwogIH0KICBjb25zdCBzaWduID0gbWF0Y2hSZXN1bHRbMV0gPT09ICIrIiA/IDEgOiAtMTsKICBjb25zdCBob3VycyA9IG1hdGNoUmVzdWx0WzJdID8gcGFyc2VJbnQobWF0Y2hSZXN1bHRbMl0sIDEwKSA6IDA7CiAgY29uc3QgbWludXRlcyA9IG1hdGNoUmVzdWx0WzNdID8gcGFyc2VJbnQobWF0Y2hSZXN1bHRbM10sIDEwKSA6IDA7CiAgY29uc3Qgc2Vjb25kcyA9IG1hdGNoUmVzdWx0WzVdID8gcGFyc2VJbnQobWF0Y2hSZXN1bHRbNV0sIDEwKSA6IDA7CiAgcmV0dXJuIHsKICAgIHZhbHVlOiBzaWduICogKGhvdXJzICogbWlsbGlzZWNvbmRzSW5Ib3VyICsgbWludXRlcyAqIG1pbGxpc2Vjb25kc0luTWludXRlICsgc2Vjb25kcyAqIG1pbGxpc2Vjb25kc0luU2Vjb25kKSwKICAgIHJlc3Q6IGRhdGVTdHJpbmcuc2xpY2UobWF0Y2hSZXN1bHRbMF0ubGVuZ3RoKQogIH07Cn0KZnVuY3Rpb24gcGFyc2VBbnlEaWdpdHNTaWduZWQoZGF0ZVN0cmluZykgewogIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5hbnlEaWdpdHNTaWduZWQsIGRhdGVTdHJpbmcpOwp9CmZ1bmN0aW9uIHBhcnNlTkRpZ2l0cyhuMTMsIGRhdGVTdHJpbmcpIHsKICBzd2l0Y2ggKG4xMykgewogICAgY2FzZSAxOgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuc2luZ2xlRGlnaXQsIGRhdGVTdHJpbmcpOwogICAgY2FzZSAyOgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMudHdvRGlnaXRzLCBkYXRlU3RyaW5nKTsKICAgIGNhc2UgMzoKICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLnRocmVlRGlnaXRzLCBkYXRlU3RyaW5nKTsKICAgIGNhc2UgNDoKICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLmZvdXJEaWdpdHMsIGRhdGVTdHJpbmcpOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obmV3IFJlZ0V4cCgiXlxcZHsxLCIgKyBuMTMgKyAifSIpLCBkYXRlU3RyaW5nKTsKICB9Cn0KZnVuY3Rpb24gcGFyc2VORGlnaXRzU2lnbmVkKG4xMywgZGF0ZVN0cmluZykgewogIHN3aXRjaCAobjEzKSB7CiAgICBjYXNlIDE6CiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5zaW5nbGVEaWdpdFNpZ25lZCwgZGF0ZVN0cmluZyk7CiAgICBjYXNlIDI6CiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy50d29EaWdpdHNTaWduZWQsIGRhdGVTdHJpbmcpOwogICAgY2FzZSAzOgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMudGhyZWVEaWdpdHNTaWduZWQsIGRhdGVTdHJpbmcpOwogICAgY2FzZSA0OgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuZm91ckRpZ2l0c1NpZ25lZCwgZGF0ZVN0cmluZyk7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihuZXcgUmVnRXhwKCJeLT9cXGR7MSwiICsgbjEzICsgIn0iKSwgZGF0ZVN0cmluZyk7CiAgfQp9CmZ1bmN0aW9uIGRheVBlcmlvZEVudW1Ub0hvdXJzKGRheVBlcmlvZCkgewogIHN3aXRjaCAoZGF5UGVyaW9kKSB7CiAgICBjYXNlICJtb3JuaW5nIjoKICAgICAgcmV0dXJuIDQ7CiAgICBjYXNlICJldmVuaW5nIjoKICAgICAgcmV0dXJuIDE3OwogICAgY2FzZSAicG0iOgogICAgY2FzZSAibm9vbiI6CiAgICBjYXNlICJhZnRlcm5vb24iOgogICAgICByZXR1cm4gMTI7CiAgICBjYXNlICJhbSI6CiAgICBjYXNlICJtaWRuaWdodCI6CiAgICBjYXNlICJuaWdodCI6CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gMDsKICB9Cn0KZnVuY3Rpb24gbm9ybWFsaXplVHdvRGlnaXRZZWFyKHR3b0RpZ2l0WWVhciwgY3VycmVudFllYXIpIHsKICBjb25zdCBpc0NvbW1vbkVyYSA9IGN1cnJlbnRZZWFyID4gMDsKICBjb25zdCBhYnNDdXJyZW50WWVhciA9IGlzQ29tbW9uRXJhID8gY3VycmVudFllYXIgOiAxIC0gY3VycmVudFllYXI7CiAgbGV0IHJlc3VsdDsKICBpZiAoYWJzQ3VycmVudFllYXIgPD0gNTApIHsKICAgIHJlc3VsdCA9IHR3b0RpZ2l0WWVhciB8fCAxMDA7CiAgfSBlbHNlIHsKICAgIGNvbnN0IHJhbmdlRW5kID0gYWJzQ3VycmVudFllYXIgKyA1MDsKICAgIGNvbnN0IHJhbmdlRW5kQ2VudHVyeSA9IE1hdGgudHJ1bmMocmFuZ2VFbmQgLyAxMDApICogMTAwOwogICAgY29uc3QgaXNQcmV2aW91c0NlbnR1cnkgPSB0d29EaWdpdFllYXIgPj0gcmFuZ2VFbmQgJSAxMDA7CiAgICByZXN1bHQgPSB0d29EaWdpdFllYXIgKyByYW5nZUVuZENlbnR1cnkgLSAoaXNQcmV2aW91c0NlbnR1cnkgPyAxMDAgOiAwKTsKICB9CiAgcmV0dXJuIGlzQ29tbW9uRXJhID8gcmVzdWx0IDogMSAtIHJlc3VsdDsKfQpmdW5jdGlvbiBpc0xlYXBZZWFySW5kZXgoeWVhcikgewogIHJldHVybiB5ZWFyICUgNDAwID09PSAwIHx8IHllYXIgJSA0ID09PSAwICYmIHllYXIgJSAxMDAgIT09IDA7Cn0KdmFyIGluaXRfdXRpbHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi91dGlscy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgaW5pdF9jb25zdGFudHMyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1llYXJQYXJzZXIuanMKdmFyIFllYXJQYXJzZXI7CnZhciBpbml0X1llYXJQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1llYXJQYXJzZXIuanMiKCkgewogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIFllYXJQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgICAgIHByaW9yaXR5ID0gMTMwOwogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbIlkiLCAiUiIsICJ1IiwgInciLCAiSSIsICJpIiwgImUiLCAiYyIsICJ0IiwgIlQiXTsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAoeWVhcikgPT4gKHsKICAgICAgICAgIHllYXIsCiAgICAgICAgICBpc1R3b0RpZ2l0WWVhcjogdG9rZW4gPT09ICJ5eSIKICAgICAgICB9KTsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICBjYXNlICJ5IjoKICAgICAgICAgICAgcmV0dXJuIG1hcFZhbHVlKHBhcnNlTkRpZ2l0cyg0LCBkYXRlU3RyaW5nKSwgdmFsdWVDYWxsYmFjayk7CiAgICAgICAgICBjYXNlICJ5byI6CiAgICAgICAgICAgIHJldHVybiBtYXBWYWx1ZSgKICAgICAgICAgICAgICBtYXRjaDIub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgICB1bml0OiAieWVhciIKICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgICAgICk7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbWFwVmFsdWUocGFyc2VORGlnaXRzKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyksIHZhbHVlQ2FsbGJhY2spOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMi5pc1R3b0RpZ2l0WWVhciB8fCB2YWx1ZTIueWVhciA+IDA7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBjb25zdCBjdXJyZW50WWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgICAgICBpZiAodmFsdWUyLmlzVHdvRGlnaXRZZWFyKSB7CiAgICAgICAgICBjb25zdCBub3JtYWxpemVkVHdvRGlnaXRZZWFyID0gbm9ybWFsaXplVHdvRGlnaXRZZWFyKAogICAgICAgICAgICB2YWx1ZTIueWVhciwKICAgICAgICAgICAgY3VycmVudFllYXIKICAgICAgICAgICk7CiAgICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKG5vcm1hbGl6ZWRUd29EaWdpdFllYXIsIDAsIDEpOwogICAgICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgICAgICAgIHJldHVybiBkYXRlOwogICAgICAgIH0KICAgICAgICBjb25zdCB5ZWFyID0gISgiZXJhIiBpbiBmbGFncykgfHwgZmxhZ3MuZXJhID09PSAxID8gdmFsdWUyLnllYXIgOiAxIC0gdmFsdWUyLnllYXI7CiAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcih5ZWFyLCAwLCAxKTsKICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Mb2NhbFdlZWtZZWFyUGFyc2VyLmpzCnZhciBMb2NhbFdlZWtZZWFyUGFyc2VyOwp2YXIgaW5pdF9Mb2NhbFdlZWtZZWFyUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Mb2NhbFdlZWtZZWFyUGFyc2VyLmpzIigpIHsKICAgIGluaXRfZ2V0V2Vla1llYXIoKTsKICAgIGluaXRfc3RhcnRPZldlZWsoKTsKICAgIGluaXRfUGFyc2VyKCk7CiAgICBpbml0X3V0aWxzKCk7CiAgICBMb2NhbFdlZWtZZWFyUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDEzMDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAoeWVhcikgPT4gKHsKICAgICAgICAgIHllYXIsCiAgICAgICAgICBpc1R3b0RpZ2l0WWVhcjogdG9rZW4gPT09ICJZWSIKICAgICAgICB9KTsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICBjYXNlICJZIjoKICAgICAgICAgICAgcmV0dXJuIG1hcFZhbHVlKHBhcnNlTkRpZ2l0cyg0LCBkYXRlU3RyaW5nKSwgdmFsdWVDYWxsYmFjayk7CiAgICAgICAgICBjYXNlICJZbyI6CiAgICAgICAgICAgIHJldHVybiBtYXBWYWx1ZSgKICAgICAgICAgICAgICBtYXRjaDIub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgICB1bml0OiAieWVhciIKICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgICAgICk7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbWFwVmFsdWUocGFyc2VORGlnaXRzKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyksIHZhbHVlQ2FsbGJhY2spOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMi5pc1R3b0RpZ2l0WWVhciB8fCB2YWx1ZTIueWVhciA+IDA7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZTIsIG9wdGlvbnMpIHsKICAgICAgICBjb25zdCBjdXJyZW50WWVhciA9IGdldFdlZWtZZWFyKGRhdGUsIG9wdGlvbnMpOwogICAgICAgIGlmICh2YWx1ZTIuaXNUd29EaWdpdFllYXIpIHsKICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUd29EaWdpdFllYXIgPSBub3JtYWxpemVUd29EaWdpdFllYXIoCiAgICAgICAgICAgIHZhbHVlMi55ZWFyLAogICAgICAgICAgICBjdXJyZW50WWVhcgogICAgICAgICAgKTsKICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIoCiAgICAgICAgICAgIG5vcm1hbGl6ZWRUd29EaWdpdFllYXIsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlCiAgICAgICAgICApOwogICAgICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgICAgICAgIHJldHVybiBzdGFydE9mV2VlayhkYXRlLCBvcHRpb25zKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgeWVhciA9ICEoImVyYSIgaW4gZmxhZ3MpIHx8IGZsYWdzLmVyYSA9PT0gMSA/IHZhbHVlMi55ZWFyIDogMSAtIHZhbHVlMi55ZWFyOwogICAgICAgIGRhdGUuc2V0RnVsbFllYXIoeWVhciwgMCwgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUpOwogICAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICAgICAgcmV0dXJuIHN0YXJ0T2ZXZWVrKGRhdGUsIG9wdGlvbnMpOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICAgICAieSIsCiAgICAgICAgIlIiLAogICAgICAgICJ1IiwKICAgICAgICAiUSIsCiAgICAgICAgInEiLAogICAgICAgICJNIiwKICAgICAgICAiTCIsCiAgICAgICAgIkkiLAogICAgICAgICJkIiwKICAgICAgICAiRCIsCiAgICAgICAgImkiLAogICAgICAgICJ0IiwKICAgICAgICAiVCIKICAgICAgXTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT1dlZWtZZWFyUGFyc2VyLmpzCnZhciBJU09XZWVrWWVhclBhcnNlcjsKdmFyIGluaXRfSVNPV2Vla1llYXJQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT1dlZWtZZWFyUGFyc2VyLmpzIigpIHsKICAgIGluaXRfc3RhcnRPZklTT1dlZWsoKTsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIElTT1dlZWtZZWFyUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDEzMDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4pIHsKICAgICAgICBpZiAodG9rZW4gPT09ICJSIikgewogICAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0c1NpZ25lZCg0LCBkYXRlU3RyaW5nKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0c1NpZ25lZCh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgICAgIGNvbnN0IGZpcnN0V2Vla09mWWVhciA9IGNvbnN0cnVjdEZyb20oZGF0ZSwgMCk7CiAgICAgICAgZmlyc3RXZWVrT2ZZZWFyLnNldEZ1bGxZZWFyKHZhbHVlMiwgMCwgNCk7CiAgICAgICAgZmlyc3RXZWVrT2ZZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIHJldHVybiBzdGFydE9mSVNPV2VlayhmaXJzdFdlZWtPZlllYXIpOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICAgICAiRyIsCiAgICAgICAgInkiLAogICAgICAgICJZIiwKICAgICAgICAidSIsCiAgICAgICAgIlEiLAogICAgICAgICJxIiwKICAgICAgICAiTSIsCiAgICAgICAgIkwiLAogICAgICAgICJ3IiwKICAgICAgICAiZCIsCiAgICAgICAgIkQiLAogICAgICAgICJlIiwKICAgICAgICAiYyIsCiAgICAgICAgInQiLAogICAgICAgICJUIgogICAgICBdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRXh0ZW5kZWRZZWFyUGFyc2VyLmpzCnZhciBFeHRlbmRlZFllYXJQYXJzZXI7CnZhciBpbml0X0V4dGVuZGVkWWVhclBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRXh0ZW5kZWRZZWFyUGFyc2VyLmpzIigpIHsKICAgIGluaXRfUGFyc2VyKCk7CiAgICBpbml0X3V0aWxzKCk7CiAgICBFeHRlbmRlZFllYXJQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgICAgIHByaW9yaXR5ID0gMTMwOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbikgewogICAgICAgIGlmICh0b2tlbiA9PT0gInUiKSB7CiAgICAgICAgICByZXR1cm4gcGFyc2VORGlnaXRzU2lnbmVkKDQsIGRhdGVTdHJpbmcpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFyc2VORGlnaXRzU2lnbmVkKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcih2YWx1ZTIsIDAsIDEpOwogICAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICAgICAgcmV0dXJuIGRhdGU7CiAgICAgIH0KICAgICAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJHIiwgInkiLCAiWSIsICJSIiwgInciLCAiSSIsICJpIiwgImUiLCAiYyIsICJ0IiwgIlQiXTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1F1YXJ0ZXJQYXJzZXIuanMKdmFyIFF1YXJ0ZXJQYXJzZXI7CnZhciBpbml0X1F1YXJ0ZXJQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1F1YXJ0ZXJQYXJzZXIuanMiKCkgewogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIFF1YXJ0ZXJQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgICAgIHByaW9yaXR5ID0gMTIwOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgLy8gMSwgMiwgMywgNAogICAgICAgICAgY2FzZSAiUSI6CiAgICAgICAgICBjYXNlICJRUSI6CiAgICAgICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgICAgICAgIC8vIDFzdCwgMm5kLCAzcmQsIDR0aAogICAgICAgICAgY2FzZSAiUW8iOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAicXVhcnRlciIgfSk7CiAgICAgICAgICAvLyBRMSwgUTIsIFEzLCBRNAogICAgICAgICAgY2FzZSAiUVFRIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLnF1YXJ0ZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyAxLCAyLCAzLCA0IChuYXJyb3cgcXVhcnRlcjsgY291bGQgYmUgbm90IG51bWVyaWNhbCkKICAgICAgICAgIGNhc2UgIlFRUVFRIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgICAgLy8gMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4KICAgICAgICAgIGNhc2UgIlFRUVEiOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogIndpZGUiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KSB8fCBtYXRjaDIucXVhcnRlcihkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMiA+PSAxICYmIHZhbHVlMiA8PSA0OwogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgICAgIGRhdGUuc2V0TW9udGgoKHZhbHVlMiAtIDEpICogMywgMSk7CiAgICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbCiAgICAgICAgIlkiLAogICAgICAgICJSIiwKICAgICAgICAicSIsCiAgICAgICAgIk0iLAogICAgICAgICJMIiwKICAgICAgICAidyIsCiAgICAgICAgIkkiLAogICAgICAgICJkIiwKICAgICAgICAiRCIsCiAgICAgICAgImkiLAogICAgICAgICJlIiwKICAgICAgICAiYyIsCiAgICAgICAgInQiLAogICAgICAgICJUIgogICAgICBdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIuanMKdmFyIFN0YW5kQWxvbmVRdWFydGVyUGFyc2VyOwp2YXIgaW5pdF9TdGFuZEFsb25lUXVhcnRlclBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIuanMiKCkgewogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIFN0YW5kQWxvbmVRdWFydGVyUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDEyMDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIC8vIDEsIDIsIDMsIDQKICAgICAgICAgIGNhc2UgInEiOgogICAgICAgICAgY2FzZSAicXEiOgogICAgICAgICAgICByZXR1cm4gcGFyc2VORGlnaXRzKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7CiAgICAgICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGgKICAgICAgICAgIGNhc2UgInFvIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogInF1YXJ0ZXIiIH0pOwogICAgICAgICAgLy8gUTEsIFEyLCBRMywgUTQKICAgICAgICAgIGNhc2UgInFxcSI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIucXVhcnRlcihkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgICAgIH0pOwogICAgICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpCiAgICAgICAgICBjYXNlICJxcXFxcSI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIucXVhcnRlcihkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uCiAgICAgICAgICBjYXNlICJxcXFxIjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIucXVhcnRlcihkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLnF1YXJ0ZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgICAgICB9KSB8fCBtYXRjaDIucXVhcnRlcihkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gNDsKICAgICAgfQogICAgICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBkYXRlLnNldE1vbnRoKCh2YWx1ZTIgLSAxKSAqIDMsIDEpOwogICAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICAgICAgcmV0dXJuIGRhdGU7CiAgICAgIH0KICAgICAgaW5jb21wYXRpYmxlVG9rZW5zID0gWwogICAgICAgICJZIiwKICAgICAgICAiUiIsCiAgICAgICAgIlEiLAogICAgICAgICJNIiwKICAgICAgICAiTCIsCiAgICAgICAgInciLAogICAgICAgICJJIiwKICAgICAgICAiZCIsCiAgICAgICAgIkQiLAogICAgICAgICJpIiwKICAgICAgICAiZSIsCiAgICAgICAgImMiLAogICAgICAgICJ0IiwKICAgICAgICAiVCIKICAgICAgXTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL01vbnRoUGFyc2VyLmpzCnZhciBNb250aFBhcnNlcjsKdmFyIGluaXRfTW9udGhQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL01vbnRoUGFyc2VyLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzMigpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIE1vbnRoUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbCiAgICAgICAgIlkiLAogICAgICAgICJSIiwKICAgICAgICAicSIsCiAgICAgICAgIlEiLAogICAgICAgICJMIiwKICAgICAgICAidyIsCiAgICAgICAgIkkiLAogICAgICAgICJEIiwKICAgICAgICAiaSIsCiAgICAgICAgImUiLAogICAgICAgICJjIiwKICAgICAgICAidCIsCiAgICAgICAgIlQiCiAgICAgIF07CiAgICAgIHByaW9yaXR5ID0gMTEwOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICAgICAgY29uc3QgdmFsdWVDYWxsYmFjayA9ICh2YWx1ZTIpID0+IHZhbHVlMiAtIDE7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgLy8gMSwgMiwgLi4uLCAxMgogICAgICAgICAgY2FzZSAiTSI6CiAgICAgICAgICAgIHJldHVybiBtYXBWYWx1ZSgKICAgICAgICAgICAgICBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5tb250aCwgZGF0ZVN0cmluZyksCiAgICAgICAgICAgICAgdmFsdWVDYWxsYmFjawogICAgICAgICAgICApOwogICAgICAgICAgLy8gMDEsIDAyLCAuLi4sIDEyCiAgICAgICAgICBjYXNlICJNTSI6CiAgICAgICAgICAgIHJldHVybiBtYXBWYWx1ZShwYXJzZU5EaWdpdHMoMiwgZGF0ZVN0cmluZyksIHZhbHVlQ2FsbGJhY2spOwogICAgICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aAogICAgICAgICAgY2FzZSAiTW8iOgogICAgICAgICAgICByZXR1cm4gbWFwVmFsdWUoCiAgICAgICAgICAgICAgbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgICAgdW5pdDogIm1vbnRoIgogICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgIHZhbHVlQ2FsbGJhY2sKICAgICAgICAgICAgKTsKICAgICAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlYwogICAgICAgICAgY2FzZSAiTU1NIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5tb250aChkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5tb250aChkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pOwogICAgICAgICAgLy8gSiwgRiwgLi4uLCBECiAgICAgICAgICBjYXNlICJNTU1NTSI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIubW9udGgoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlcgogICAgICAgICAgY2FzZSAiTU1NTSI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJ3aWRlIiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pIHx8IG1hdGNoMi5tb250aChkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5tb250aChkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSAxMTsKICAgICAgfQogICAgICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBkYXRlLnNldE1vbnRoKHZhbHVlMiwgMSk7CiAgICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZU1vbnRoUGFyc2VyLmpzCnZhciBTdGFuZEFsb25lTW9udGhQYXJzZXI7CnZhciBpbml0X1N0YW5kQWxvbmVNb250aFBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZU1vbnRoUGFyc2VyLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzMigpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIFN0YW5kQWxvbmVNb250aFBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSAxMTA7CiAgICAgIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgICAgICBjb25zdCB2YWx1ZUNhbGxiYWNrID0gKHZhbHVlMikgPT4gdmFsdWUyIC0gMTsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAvLyAxLCAyLCAuLi4sIDEyCiAgICAgICAgICBjYXNlICJMIjoKICAgICAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgICAgIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLm1vbnRoLCBkYXRlU3RyaW5nKSwKICAgICAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgICAgICk7CiAgICAgICAgICAvLyAwMSwgMDIsIC4uLiwgMTIKICAgICAgICAgIGNhc2UgIkxMIjoKICAgICAgICAgICAgcmV0dXJuIG1hcFZhbHVlKHBhcnNlTkRpZ2l0cygyLCBkYXRlU3RyaW5nKSwgdmFsdWVDYWxsYmFjayk7CiAgICAgICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoCiAgICAgICAgICBjYXNlICJMbyI6CiAgICAgICAgICAgIHJldHVybiBtYXBWYWx1ZSgKICAgICAgICAgICAgICBtYXRjaDIub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgICB1bml0OiAibW9udGgiCiAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgdmFsdWVDYWxsYmFjawogICAgICAgICAgICApOwogICAgICAgICAgLy8gSmFuLCBGZWIsIC4uLiwgRGVjCiAgICAgICAgICBjYXNlICJMTEwiOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLm1vbnRoKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciLCBjb250ZXh0OiAic3RhbmRhbG9uZSIgfSk7CiAgICAgICAgICAvLyBKLCBGLCAuLi4sIEQKICAgICAgICAgIGNhc2UgIkxMTExMIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5tb250aChkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyCiAgICAgICAgICBjYXNlICJMTExMIjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIubW9udGgoZGF0ZVN0cmluZywgeyB3aWR0aDogIndpZGUiLCBjb250ZXh0OiAic3RhbmRhbG9uZSIgfSkgfHwgbWF0Y2gyLm1vbnRoKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciLCBjb250ZXh0OiAic3RhbmRhbG9uZSIgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgICAgICByZXR1cm4gdmFsdWUyID49IDAgJiYgdmFsdWUyIDw9IDExOwogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgICAgIGRhdGUuc2V0TW9udGgodmFsdWUyLCAxKTsKICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICAgICAiWSIsCiAgICAgICAgIlIiLAogICAgICAgICJxIiwKICAgICAgICAiUSIsCiAgICAgICAgIk0iLAogICAgICAgICJ3IiwKICAgICAgICAiSSIsCiAgICAgICAgIkQiLAogICAgICAgICJpIiwKICAgICAgICAiZSIsCiAgICAgICAgImMiLAogICAgICAgICJ0IiwKICAgICAgICAiVCIKICAgICAgXTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0V2Vlay5qcwpmdW5jdGlvbiBzZXRXZWVrKGRhdGUsIHdlZWssIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgZGlmZiA9IGdldFdlZWsoZGF0ZV8sIG9wdGlvbnMpIC0gd2VlazsKICBkYXRlXy5zZXREYXRlKGRhdGVfLmdldERhdGUoKSAtIGRpZmYgKiA3KTsKICByZXR1cm4gdG9EYXRlKGRhdGVfLCBvcHRpb25zPy5pbik7Cn0KdmFyIHNldFdlZWtfZGVmYXVsdDsKdmFyIGluaXRfc2V0V2VlayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRXZWVrLmpzIigpIHsKICAgIGluaXRfZ2V0V2VlaygpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIHNldFdlZWtfZGVmYXVsdCA9IHNldFdlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0xvY2FsV2Vla1BhcnNlci5qcwp2YXIgTG9jYWxXZWVrUGFyc2VyOwp2YXIgaW5pdF9Mb2NhbFdlZWtQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0xvY2FsV2Vla1BhcnNlci5qcyIoKSB7CiAgICBpbml0X3NldFdlZWsoKTsKICAgIGluaXRfc3RhcnRPZldlZWsoKTsKICAgIGluaXRfY29uc3RhbnRzMigpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIExvY2FsV2Vla1BhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSAxMDA7CiAgICAgIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICBjYXNlICJ3IjoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLndlZWssIGRhdGVTdHJpbmcpOwogICAgICAgICAgY2FzZSAid28iOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAid2VlayIgfSk7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gcGFyc2VORGlnaXRzKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgICAgICByZXR1cm4gdmFsdWUyID49IDEgJiYgdmFsdWUyIDw9IDUzOwogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMiwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBzdGFydE9mV2VlayhzZXRXZWVrKGRhdGUsIHZhbHVlMiwgb3B0aW9ucyksIG9wdGlvbnMpOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICAgICAieSIsCiAgICAgICAgIlIiLAogICAgICAgICJ1IiwKICAgICAgICAicSIsCiAgICAgICAgIlEiLAogICAgICAgICJNIiwKICAgICAgICAiTCIsCiAgICAgICAgIkkiLAogICAgICAgICJkIiwKICAgICAgICAiRCIsCiAgICAgICAgImkiLAogICAgICAgICJ0IiwKICAgICAgICAiVCIKICAgICAgXTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0SVNPV2Vlay5qcwpmdW5jdGlvbiBzZXRJU09XZWVrKGRhdGUsIHdlZWssIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgZGlmZiA9IGdldElTT1dlZWsoX2RhdGUsIG9wdGlvbnMpIC0gd2VlazsKICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSAtIGRpZmYgKiA3KTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIHNldElTT1dlZWtfZGVmYXVsdDsKdmFyIGluaXRfc2V0SVNPV2VlayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRJU09XZWVrLmpzIigpIHsKICAgIGluaXRfZ2V0SVNPV2VlaygpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIHNldElTT1dlZWtfZGVmYXVsdCA9IHNldElTT1dlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT1dlZWtQYXJzZXIuanMKdmFyIElTT1dlZWtQYXJzZXI7CnZhciBpbml0X0lTT1dlZWtQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT1dlZWtQYXJzZXIuanMiKCkgewogICAgaW5pdF9zZXRJU09XZWVrKCk7CiAgICBpbml0X3N0YXJ0T2ZJU09XZWVrKCk7CiAgICBpbml0X2NvbnN0YW50czIoKTsKICAgIGluaXRfUGFyc2VyKCk7CiAgICBpbml0X3V0aWxzKCk7CiAgICBJU09XZWVrUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDEwMDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIGNhc2UgIkkiOgogICAgICAgICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMud2VlaywgZGF0ZVN0cmluZyk7CiAgICAgICAgICBjYXNlICJJbyI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6ICJ3ZWVrIiB9KTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gNTM7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHN0YXJ0T2ZJU09XZWVrKHNldElTT1dlZWsoZGF0ZSwgdmFsdWUyKSk7CiAgICAgIH0KICAgICAgaW5jb21wYXRpYmxlVG9rZW5zID0gWwogICAgICAgICJ5IiwKICAgICAgICAiWSIsCiAgICAgICAgInUiLAogICAgICAgICJxIiwKICAgICAgICAiUSIsCiAgICAgICAgIk0iLAogICAgICAgICJMIiwKICAgICAgICAidyIsCiAgICAgICAgImQiLAogICAgICAgICJEIiwKICAgICAgICAiZSIsCiAgICAgICAgImMiLAogICAgICAgICJ0IiwKICAgICAgICAiVCIKICAgICAgXTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0RhdGVQYXJzZXIuanMKdmFyIERBWVNfSU5fTU9OVEgsIERBWVNfSU5fTU9OVEhfTEVBUF9ZRUFSLCBEYXRlUGFyc2VyOwp2YXIgaW5pdF9EYXRlUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9EYXRlUGFyc2VyLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzMigpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIERBWVNfSU5fTU9OVEggPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07CiAgICBEQVlTX0lOX01PTlRIX0xFQVBfWUVBUiA9IFsKICAgICAgMzEsCiAgICAgIDI5LAogICAgICAzMSwKICAgICAgMzAsCiAgICAgIDMxLAogICAgICAzMCwKICAgICAgMzEsCiAgICAgIDMxLAogICAgICAzMCwKICAgICAgMzEsCiAgICAgIDMwLAogICAgICAzMQogICAgXTsKICAgIERhdGVQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgICAgIHByaW9yaXR5ID0gOTA7CiAgICAgIHN1YlByaW9yaXR5ID0gMTsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIGNhc2UgImQiOgogICAgICAgICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuZGF0ZSwgZGF0ZVN0cmluZyk7CiAgICAgICAgICBjYXNlICJkbyI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6ICJkYXRlIiB9KTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFsaWRhdGUoZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgICAgICBjb25zdCBpc0xlYXBZZWFyMiA9IGlzTGVhcFllYXJJbmRleCh5ZWFyKTsKICAgICAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTsKICAgICAgICBpZiAoaXNMZWFwWWVhcjIpIHsKICAgICAgICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gREFZU19JTl9NT05USF9MRUFQX1lFQVJbbW9udGhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gdmFsdWUyID49IDEgJiYgdmFsdWUyIDw9IERBWVNfSU5fTU9OVEhbbW9udGhdOwogICAgICAgIH0KICAgICAgfQogICAgICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBkYXRlLnNldERhdGUodmFsdWUyKTsKICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICAgICAiWSIsCiAgICAgICAgIlIiLAogICAgICAgICJxIiwKICAgICAgICAiUSIsCiAgICAgICAgInciLAogICAgICAgICJJIiwKICAgICAgICAiRCIsCiAgICAgICAgImkiLAogICAgICAgICJlIiwKICAgICAgICAiYyIsCiAgICAgICAgInQiLAogICAgICAgICJUIgogICAgICBdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF5T2ZZZWFyUGFyc2VyLmpzCnZhciBEYXlPZlllYXJQYXJzZXI7CnZhciBpbml0X0RheU9mWWVhclBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF5T2ZZZWFyUGFyc2VyLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzMigpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIERheU9mWWVhclBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSA5MDsKICAgICAgc3VicHJpb3JpdHkgPSAxOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgY2FzZSAiRCI6CiAgICAgICAgICBjYXNlICJERCI6CiAgICAgICAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5kYXlPZlllYXIsIGRhdGVTdHJpbmcpOwogICAgICAgICAgY2FzZSAiRG8iOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAiZGF0ZSIgfSk7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gcGFyc2VORGlnaXRzKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhbGlkYXRlKGRhdGUsIHZhbHVlMikgewogICAgICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CiAgICAgICAgY29uc3QgaXNMZWFwWWVhcjIgPSBpc0xlYXBZZWFySW5kZXgoeWVhcik7CiAgICAgICAgaWYgKGlzTGVhcFllYXIyKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWUyID49IDEgJiYgdmFsdWUyIDw9IDM2NjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHZhbHVlMiA+PSAxICYmIHZhbHVlMiA8PSAzNjU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgICAgIGRhdGUuc2V0TW9udGgoMCwgdmFsdWUyKTsKICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICAgICAiWSIsCiAgICAgICAgIlIiLAogICAgICAgICJxIiwKICAgICAgICAiUSIsCiAgICAgICAgIk0iLAogICAgICAgICJMIiwKICAgICAgICAidyIsCiAgICAgICAgIkkiLAogICAgICAgICJkIiwKICAgICAgICAiRSIsCiAgICAgICAgImkiLAogICAgICAgICJlIiwKICAgICAgICAiYyIsCiAgICAgICAgInQiLAogICAgICAgICJUIgogICAgICBdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXREYXkuanMKZnVuY3Rpb24gc2V0RGF5KGRhdGUsIGRheSwgb3B0aW9ucykgewogIGNvbnN0IGRlZmF1bHRPcHRpb25zMiA9IGdldERlZmF1bHRPcHRpb25zKCk7CiAgY29uc3Qgd2Vla1N0YXJ0c09uID0gb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi53ZWVrU3RhcnRzT24gPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IDA7CiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGN1cnJlbnREYXkgPSBkYXRlXy5nZXREYXkoKTsKICBjb25zdCByZW1haW5kZXIgPSBkYXkgJSA3OwogIGNvbnN0IGRheUluZGV4ID0gKHJlbWFpbmRlciArIDcpICUgNzsKICBjb25zdCBkZWx0YSA9IDcgLSB3ZWVrU3RhcnRzT247CiAgY29uc3QgZGlmZiA9IGRheSA8IDAgfHwgZGF5ID4gNiA/IGRheSAtIChjdXJyZW50RGF5ICsgZGVsdGEpICUgNyA6IChkYXlJbmRleCArIGRlbHRhKSAlIDcgLSAoY3VycmVudERheSArIGRlbHRhKSAlIDc7CiAgcmV0dXJuIGFkZERheXMoZGF0ZV8sIGRpZmYsIG9wdGlvbnMpOwp9CnZhciBzZXREYXlfZGVmYXVsdDsKdmFyIGluaXRfc2V0RGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldERheS5qcyIoKSB7CiAgICBpbml0X2RlZmF1bHRPcHRpb25zKCk7CiAgICBpbml0X2FkZERheXMoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzZXREYXlfZGVmYXVsdCA9IHNldERheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF5UGFyc2VyLmpzCnZhciBEYXlQYXJzZXI7CnZhciBpbml0X0RheVBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF5UGFyc2VyLmpzIigpIHsKICAgIGluaXRfc2V0RGF5KCk7CiAgICBpbml0X1BhcnNlcigpOwogICAgRGF5UGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDkwOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgLy8gVHVlCiAgICAgICAgICBjYXNlICJFIjoKICAgICAgICAgIGNhc2UgIkVFIjoKICAgICAgICAgIGNhc2UgIkVFRSI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAic2hvcnQiLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pOwogICAgICAgICAgLy8gVAogICAgICAgICAgY2FzZSAiRUVFRUUiOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIFR1CiAgICAgICAgICBjYXNlICJFRUVFRUUiOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAic2hvcnQiLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pOwogICAgICAgICAgLy8gVHVlc2RheQogICAgICAgICAgY2FzZSAiRUVFRSI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAid2lkZSIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAic2hvcnQiLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSA2OwogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMiwgb3B0aW9ucykgewogICAgICAgIGRhdGUgPSBzZXREYXkoZGF0ZSwgdmFsdWUyLCBvcHRpb25zKTsKICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsiRCIsICJpIiwgImUiLCAiYyIsICJ0IiwgIlQiXTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0xvY2FsRGF5UGFyc2VyLmpzCnZhciBMb2NhbERheVBhcnNlcjsKdmFyIGluaXRfTG9jYWxEYXlQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0xvY2FsRGF5UGFyc2VyLmpzIigpIHsKICAgIGluaXRfc2V0RGF5KCk7CiAgICBpbml0X1BhcnNlcigpOwogICAgaW5pdF91dGlscygpOwogICAgTG9jYWxEYXlQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgICAgIHByaW9yaXR5ID0gOTA7CiAgICAgIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIsIG9wdGlvbnMpIHsKICAgICAgICBjb25zdCB2YWx1ZUNhbGxiYWNrID0gKHZhbHVlMikgPT4gewogICAgICAgICAgY29uc3Qgd2hvbGVXZWVrRGF5cyA9IE1hdGguZmxvb3IoKHZhbHVlMiAtIDEpIC8gNykgKiA3OwogICAgICAgICAgcmV0dXJuICh2YWx1ZTIgKyBvcHRpb25zLndlZWtTdGFydHNPbiArIDYpICUgNyArIHdob2xlV2Vla0RheXM7CiAgICAgICAgfTsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAvLyAzCiAgICAgICAgICBjYXNlICJlIjoKICAgICAgICAgIGNhc2UgImVlIjoKICAgICAgICAgICAgcmV0dXJuIG1hcFZhbHVlKHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpLCB2YWx1ZUNhbGxiYWNrKTsKICAgICAgICAgIC8vIDNyZAogICAgICAgICAgY2FzZSAiZW8iOgogICAgICAgICAgICByZXR1cm4gbWFwVmFsdWUoCiAgICAgICAgICAgICAgbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgICAgdW5pdDogImRheSIKICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgICAgICk7CiAgICAgICAgICAvLyBUdWUKICAgICAgICAgIGNhc2UgImVlZSI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAic2hvcnQiLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pOwogICAgICAgICAgLy8gVAogICAgICAgICAgY2FzZSAiZWVlZWUiOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIFR1CiAgICAgICAgICBjYXNlICJlZWVlZWUiOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAic2hvcnQiLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pOwogICAgICAgICAgLy8gVHVlc2RheQogICAgICAgICAgY2FzZSAiZWVlZSI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAid2lkZSIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAic2hvcnQiLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSA2OwogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMiwgb3B0aW9ucykgewogICAgICAgIGRhdGUgPSBzZXREYXkoZGF0ZSwgdmFsdWUyLCBvcHRpb25zKTsKICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICAgICAieSIsCiAgICAgICAgIlIiLAogICAgICAgICJ1IiwKICAgICAgICAicSIsCiAgICAgICAgIlEiLAogICAgICAgICJNIiwKICAgICAgICAiTCIsCiAgICAgICAgIkkiLAogICAgICAgICJkIiwKICAgICAgICAiRCIsCiAgICAgICAgIkUiLAogICAgICAgICJpIiwKICAgICAgICAiYyIsCiAgICAgICAgInQiLAogICAgICAgICJUIgogICAgICBdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyLmpzCnZhciBTdGFuZEFsb25lTG9jYWxEYXlQYXJzZXI7CnZhciBpbml0X1N0YW5kQWxvbmVMb2NhbERheVBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyLmpzIigpIHsKICAgIGluaXRfc2V0RGF5KCk7CiAgICBpbml0X1BhcnNlcigpOwogICAgaW5pdF91dGlscygpOwogICAgU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDkwOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyLCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgdmFsdWVDYWxsYmFjayA9ICh2YWx1ZTIpID0+IHsKICAgICAgICAgIGNvbnN0IHdob2xlV2Vla0RheXMgPSBNYXRoLmZsb29yKCh2YWx1ZTIgLSAxKSAvIDcpICogNzsKICAgICAgICAgIHJldHVybiAodmFsdWUyICsgb3B0aW9ucy53ZWVrU3RhcnRzT24gKyA2KSAlIDcgKyB3aG9sZVdlZWtEYXlzOwogICAgICAgIH07CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgLy8gMwogICAgICAgICAgY2FzZSAiYyI6CiAgICAgICAgICBjYXNlICJjYyI6CiAgICAgICAgICAgIHJldHVybiBtYXBWYWx1ZShwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKSwgdmFsdWVDYWxsYmFjayk7CiAgICAgICAgICAvLyAzcmQKICAgICAgICAgIGNhc2UgImNvIjoKICAgICAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgICAgIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICAgIHVuaXQ6ICJkYXkiCiAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgdmFsdWVDYWxsYmFjawogICAgICAgICAgICApOwogICAgICAgICAgLy8gVHVlCiAgICAgICAgICBjYXNlICJjY2MiOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogInNob3J0IiwgY29udGV4dDogInN0YW5kYWxvbmUiIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogIm5hcnJvdyIsIGNvbnRleHQ6ICJzdGFuZGFsb25lIiB9KTsKICAgICAgICAgIC8vIFQKICAgICAgICAgIGNhc2UgImNjY2NjIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyBUdQogICAgICAgICAgY2FzZSAiY2NjY2NjIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogInNob3J0IiwgY29udGV4dDogInN0YW5kYWxvbmUiIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogIm5hcnJvdyIsIGNvbnRleHQ6ICJzdGFuZGFsb25lIiB9KTsKICAgICAgICAgIC8vIFR1ZXNkYXkKICAgICAgICAgIGNhc2UgImNjY2MiOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogIndpZGUiLCBjb250ZXh0OiAic3RhbmRhbG9uZSIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogInNob3J0IiwgY29udGV4dDogInN0YW5kYWxvbmUiIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogIm5hcnJvdyIsIGNvbnRleHQ6ICJzdGFuZGFsb25lIiB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgICAgIHJldHVybiB2YWx1ZTIgPj0gMCAmJiB2YWx1ZTIgPD0gNjsKICAgICAgfQogICAgICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIsIG9wdGlvbnMpIHsKICAgICAgICBkYXRlID0gc2V0RGF5KGRhdGUsIHZhbHVlMiwgb3B0aW9ucyk7CiAgICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbCiAgICAgICAgInkiLAogICAgICAgICJSIiwKICAgICAgICAidSIsCiAgICAgICAgInEiLAogICAgICAgICJRIiwKICAgICAgICAiTSIsCiAgICAgICAgIkwiLAogICAgICAgICJJIiwKICAgICAgICAiZCIsCiAgICAgICAgIkQiLAogICAgICAgICJFIiwKICAgICAgICAiaSIsCiAgICAgICAgImUiLAogICAgICAgICJ0IiwKICAgICAgICAiVCIKICAgICAgXTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0SVNPRGF5LmpzCmZ1bmN0aW9uIHNldElTT0RheShkYXRlLCBkYXksIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgY3VycmVudERheSA9IGdldElTT0RheShkYXRlXywgb3B0aW9ucyk7CiAgY29uc3QgZGlmZiA9IGRheSAtIGN1cnJlbnREYXk7CiAgcmV0dXJuIGFkZERheXMoZGF0ZV8sIGRpZmYsIG9wdGlvbnMpOwp9CnZhciBzZXRJU09EYXlfZGVmYXVsdDsKdmFyIGluaXRfc2V0SVNPRGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldElTT0RheS5qcyIoKSB7CiAgICBpbml0X2FkZERheXMoKTsKICAgIGluaXRfZ2V0SVNPRGF5KCk7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgc2V0SVNPRGF5X2RlZmF1bHQgPSBzZXRJU09EYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT0RheVBhcnNlci5qcwp2YXIgSVNPRGF5UGFyc2VyOwp2YXIgaW5pdF9JU09EYXlQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT0RheVBhcnNlci5qcyIoKSB7CiAgICBpbml0X3NldElTT0RheSgpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIElTT0RheVBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSA5MDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAodmFsdWUyKSA9PiB7CiAgICAgICAgICBpZiAodmFsdWUyID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiA3OwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHZhbHVlMjsKICAgICAgICB9OwogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIC8vIDIKICAgICAgICAgIGNhc2UgImkiOgogICAgICAgICAgY2FzZSAiaWkiOgogICAgICAgICAgICByZXR1cm4gcGFyc2VORGlnaXRzKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7CiAgICAgICAgICAvLyAybmQKICAgICAgICAgIGNhc2UgImlvIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogImRheSIgfSk7CiAgICAgICAgICAvLyBUdWUKICAgICAgICAgIGNhc2UgImlpaSI6CiAgICAgICAgICAgIHJldHVybiBtYXBWYWx1ZSgKICAgICAgICAgICAgICBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgICB3aWR0aDogInNob3J0IiwKICAgICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgdmFsdWVDYWxsYmFjawogICAgICAgICAgICApOwogICAgICAgICAgLy8gVAogICAgICAgICAgY2FzZSAiaWlpaWkiOgogICAgICAgICAgICByZXR1cm4gbWFwVmFsdWUoCiAgICAgICAgICAgICAgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgICAgICk7CiAgICAgICAgICAvLyBUdQogICAgICAgICAgY2FzZSAiaWlpaWlpIjoKICAgICAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgICAgIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgICAgd2lkdGg6ICJzaG9ydCIsCiAgICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgICB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgIHZhbHVlQ2FsbGJhY2sKICAgICAgICAgICAgKTsKICAgICAgICAgIC8vIFR1ZXNkYXkKICAgICAgICAgIGNhc2UgImlpaWkiOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgICAgIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgICB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICAgIHdpZHRoOiAic2hvcnQiLAogICAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgICAgICByZXR1cm4gdmFsdWUyID49IDEgJiYgdmFsdWUyIDw9IDc7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICAgICAgZGF0ZSA9IHNldElTT0RheShkYXRlLCB2YWx1ZTIpOwogICAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICAgICAgcmV0dXJuIGRhdGU7CiAgICAgIH0KICAgICAgaW5jb21wYXRpYmxlVG9rZW5zID0gWwogICAgICAgICJ5IiwKICAgICAgICAiWSIsCiAgICAgICAgInUiLAogICAgICAgICJxIiwKICAgICAgICAiUSIsCiAgICAgICAgIk0iLAogICAgICAgICJMIiwKICAgICAgICAidyIsCiAgICAgICAgImQiLAogICAgICAgICJEIiwKICAgICAgICAiRSIsCiAgICAgICAgImUiLAogICAgICAgICJjIiwKICAgICAgICAidCIsCiAgICAgICAgIlQiCiAgICAgIF07CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9BTVBNUGFyc2VyLmpzCnZhciBBTVBNUGFyc2VyOwp2YXIgaW5pdF9BTVBNUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9BTVBNUGFyc2VyLmpzIigpIHsKICAgIGluaXRfUGFyc2VyKCk7CiAgICBpbml0X3V0aWxzKCk7CiAgICBBTVBNUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDgwOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgY2FzZSAiYSI6CiAgICAgICAgICBjYXNlICJhYSI6CiAgICAgICAgICBjYXNlICJhYWEiOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlICJhYWFhYSI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAiYWFhYSI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgICAgIGRhdGUuc2V0SG91cnMoZGF5UGVyaW9kRW51bVRvSG91cnModmFsdWUyKSwgMCwgMCwgMCk7CiAgICAgICAgcmV0dXJuIGRhdGU7CiAgICAgIH0KICAgICAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJiIiwgIkIiLCAiSCIsICJrIiwgInQiLCAiVCJdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvQU1QTU1pZG5pZ2h0UGFyc2VyLmpzCnZhciBBTVBNTWlkbmlnaHRQYXJzZXI7CnZhciBpbml0X0FNUE1NaWRuaWdodFBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvQU1QTU1pZG5pZ2h0UGFyc2VyLmpzIigpIHsKICAgIGluaXRfUGFyc2VyKCk7CiAgICBpbml0X3V0aWxzKCk7CiAgICBBTVBNTWlkbmlnaHRQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgICAgIHByaW9yaXR5ID0gODA7CiAgICAgIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICBjYXNlICJiIjoKICAgICAgICAgIGNhc2UgImJiIjoKICAgICAgICAgIGNhc2UgImJiYiI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIGNhc2UgImJiYmJiIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlICJiYmJiIjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogIndpZGUiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KSB8fCBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICAgICAgZGF0ZS5zZXRIb3VycyhkYXlQZXJpb2RFbnVtVG9Ib3Vycyh2YWx1ZTIpLCAwLCAwLCAwKTsKICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbImEiLCAiQiIsICJIIiwgImsiLCAidCIsICJUIl07CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9EYXlQZXJpb2RQYXJzZXIuanMKdmFyIERheVBlcmlvZFBhcnNlcjsKdmFyIGluaXRfRGF5UGVyaW9kUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9EYXlQZXJpb2RQYXJzZXIuanMiKCkgewogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIERheVBlcmlvZFBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSA4MDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIGNhc2UgIkIiOgogICAgICAgICAgY2FzZSAiQkIiOgogICAgICAgICAgY2FzZSAiQkJCIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KSB8fCBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAiQkJCQkIiOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIGNhc2UgIkJCQkIiOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KSB8fCBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBkYXRlLnNldEhvdXJzKGRheVBlcmlvZEVudW1Ub0hvdXJzKHZhbHVlMiksIDAsIDAsIDApOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsiYSIsICJiIiwgInQiLCAiVCJdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSG91cjF0bzEyUGFyc2VyLmpzCnZhciBIb3VyMXRvMTJQYXJzZXI7CnZhciBpbml0X0hvdXIxdG8xMlBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSG91cjF0bzEyUGFyc2VyLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzMigpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIEhvdXIxdG8xMlBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSA3MDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIGNhc2UgImgiOgogICAgICAgICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuaG91cjEyaCwgZGF0ZVN0cmluZyk7CiAgICAgICAgICBjYXNlICJobyI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6ICJob3VyIiB9KTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gMTI7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICAgICAgY29uc3QgaXNQTSA9IGRhdGUuZ2V0SG91cnMoKSA+PSAxMjsKICAgICAgICBpZiAoaXNQTSAmJiB2YWx1ZTIgPCAxMikgewogICAgICAgICAgZGF0ZS5zZXRIb3Vycyh2YWx1ZTIgKyAxMiwgMCwgMCwgMCk7CiAgICAgICAgfSBlbHNlIGlmICghaXNQTSAmJiB2YWx1ZTIgPT09IDEyKSB7CiAgICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkYXRlLnNldEhvdXJzKHZhbHVlMiwgMCwgMCwgMCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsiSCIsICJLIiwgImsiLCAidCIsICJUIl07CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Ib3VyMHRvMjNQYXJzZXIuanMKdmFyIEhvdXIwdG8yM1BhcnNlcjsKdmFyIGluaXRfSG91cjB0bzIzUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Ib3VyMHRvMjNQYXJzZXIuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMyKCk7CiAgICBpbml0X1BhcnNlcigpOwogICAgaW5pdF91dGlscygpOwogICAgSG91cjB0bzIzUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDcwOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgY2FzZSAiSCI6CiAgICAgICAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5ob3VyMjNoLCBkYXRlU3RyaW5nKTsKICAgICAgICAgIGNhc2UgIkhvIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogImhvdXIiIH0pOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSAyMzsKICAgICAgfQogICAgICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBkYXRlLnNldEhvdXJzKHZhbHVlMiwgMCwgMCwgMCk7CiAgICAgICAgcmV0dXJuIGRhdGU7CiAgICAgIH0KICAgICAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJhIiwgImIiLCAiaCIsICJLIiwgImsiLCAidCIsICJUIl07CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Ib3VyMFRvMTFQYXJzZXIuanMKdmFyIEhvdXIwVG8xMVBhcnNlcjsKdmFyIGluaXRfSG91cjBUbzExUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Ib3VyMFRvMTFQYXJzZXIuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMyKCk7CiAgICBpbml0X1BhcnNlcigpOwogICAgaW5pdF91dGlscygpOwogICAgSG91cjBUbzExUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDcwOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgY2FzZSAiSyI6CiAgICAgICAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5ob3VyMTFoLCBkYXRlU3RyaW5nKTsKICAgICAgICAgIGNhc2UgIktvIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogImhvdXIiIH0pOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSAxMTsKICAgICAgfQogICAgICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBjb25zdCBpc1BNID0gZGF0ZS5nZXRIb3VycygpID49IDEyOwogICAgICAgIGlmIChpc1BNICYmIHZhbHVlMiA8IDEyKSB7CiAgICAgICAgICBkYXRlLnNldEhvdXJzKHZhbHVlMiArIDEyLCAwLCAwLCAwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGF0ZS5zZXRIb3Vycyh2YWx1ZTIsIDAsIDAsIDApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbImgiLCAiSCIsICJrIiwgInQiLCAiVCJdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSG91cjFUbzI0UGFyc2VyLmpzCnZhciBIb3VyMVRvMjRQYXJzZXI7CnZhciBpbml0X0hvdXIxVG8yNFBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSG91cjFUbzI0UGFyc2VyLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzMigpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIEhvdXIxVG8yNFBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSA3MDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIGNhc2UgImsiOgogICAgICAgICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuaG91cjI0aCwgZGF0ZVN0cmluZyk7CiAgICAgICAgICBjYXNlICJrbyI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6ICJob3VyIiB9KTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gMjQ7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICAgICAgY29uc3QgaG91cnMgPSB2YWx1ZTIgPD0gMjQgPyB2YWx1ZTIgJSAyNCA6IHZhbHVlMjsKICAgICAgICBkYXRlLnNldEhvdXJzKGhvdXJzLCAwLCAwLCAwKTsKICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbImEiLCAiYiIsICJoIiwgIkgiLCAiSyIsICJ0IiwgIlQiXTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL01pbnV0ZVBhcnNlci5qcwp2YXIgTWludXRlUGFyc2VyOwp2YXIgaW5pdF9NaW51dGVQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL01pbnV0ZVBhcnNlci5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50czIoKTsKICAgIGluaXRfUGFyc2VyKCk7CiAgICBpbml0X3V0aWxzKCk7CiAgICBNaW51dGVQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgICAgIHByaW9yaXR5ID0gNjA7CiAgICAgIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICBjYXNlICJtIjoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLm1pbnV0ZSwgZGF0ZVN0cmluZyk7CiAgICAgICAgICBjYXNlICJtbyI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6ICJtaW51dGUiIH0pOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSA1OTsKICAgICAgfQogICAgICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBkYXRlLnNldE1pbnV0ZXModmFsdWUyLCAwLCAwKTsKICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbInQiLCAiVCJdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU2Vjb25kUGFyc2VyLmpzCnZhciBTZWNvbmRQYXJzZXI7CnZhciBpbml0X1NlY29uZFBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU2Vjb25kUGFyc2VyLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzMigpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIFNlY29uZFBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSA1MDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIGNhc2UgInMiOgogICAgICAgICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuc2Vjb25kLCBkYXRlU3RyaW5nKTsKICAgICAgICAgIGNhc2UgInNvIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogInNlY29uZCIgfSk7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gcGFyc2VORGlnaXRzKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgICAgICByZXR1cm4gdmFsdWUyID49IDAgJiYgdmFsdWUyIDw9IDU5OwogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgICAgIGRhdGUuc2V0U2Vjb25kcyh2YWx1ZTIsIDApOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsidCIsICJUIl07CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9GcmFjdGlvbk9mU2Vjb25kUGFyc2VyLmpzCnZhciBGcmFjdGlvbk9mU2Vjb25kUGFyc2VyOwp2YXIgaW5pdF9GcmFjdGlvbk9mU2Vjb25kUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9GcmFjdGlvbk9mU2Vjb25kUGFyc2VyLmpzIigpIHsKICAgIGluaXRfUGFyc2VyKCk7CiAgICBpbml0X3V0aWxzKCk7CiAgICBGcmFjdGlvbk9mU2Vjb25kUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDMwOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbikgewogICAgICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAodmFsdWUyKSA9PiBNYXRoLnRydW5jKHZhbHVlMiAqIE1hdGgucG93KDEwLCAtdG9rZW4ubGVuZ3RoICsgMykpOwogICAgICAgIHJldHVybiBtYXBWYWx1ZShwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKSwgdmFsdWVDYWxsYmFjayk7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICAgICAgZGF0ZS5zZXRNaWxsaXNlY29uZHModmFsdWUyKTsKICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbInQiLCAiVCJdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSVNPVGltZXpvbmVXaXRoWlBhcnNlci5qcwp2YXIgSVNPVGltZXpvbmVXaXRoWlBhcnNlcjsKdmFyIGluaXRfSVNPVGltZXpvbmVXaXRoWlBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSVNPVGltZXpvbmVXaXRoWlBhcnNlci5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcygpOwogICAgaW5pdF9jb25zdGFudHMyKCk7CiAgICBpbml0X1BhcnNlcigpOwogICAgaW5pdF91dGlscygpOwogICAgSVNPVGltZXpvbmVXaXRoWlBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSAxMDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4pIHsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICBjYXNlICJYIjoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKAogICAgICAgICAgICAgIHRpbWV6b25lUGF0dGVybnMuYmFzaWNPcHRpb25hbE1pbnV0ZXMsCiAgICAgICAgICAgICAgZGF0ZVN0cmluZwogICAgICAgICAgICApOwogICAgICAgICAgY2FzZSAiWFgiOgogICAgICAgICAgICByZXR1cm4gcGFyc2VUaW1lem9uZVBhdHRlcm4odGltZXpvbmVQYXR0ZXJucy5iYXNpYywgZGF0ZVN0cmluZyk7CiAgICAgICAgICBjYXNlICJYWFhYIjoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKAogICAgICAgICAgICAgIHRpbWV6b25lUGF0dGVybnMuYmFzaWNPcHRpb25hbFNlY29uZHMsCiAgICAgICAgICAgICAgZGF0ZVN0cmluZwogICAgICAgICAgICApOwogICAgICAgICAgY2FzZSAiWFhYWFgiOgogICAgICAgICAgICByZXR1cm4gcGFyc2VUaW1lem9uZVBhdHRlcm4oCiAgICAgICAgICAgICAgdGltZXpvbmVQYXR0ZXJucy5leHRlbmRlZE9wdGlvbmFsU2Vjb25kcywKICAgICAgICAgICAgICBkYXRlU3RyaW5nCiAgICAgICAgICAgICk7CiAgICAgICAgICBjYXNlICJYWFgiOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKHRpbWV6b25lUGF0dGVybnMuZXh0ZW5kZWQsIGRhdGVTdHJpbmcpOwogICAgICAgIH0KICAgICAgfQogICAgICBzZXQoZGF0ZSwgZmxhZ3MsIHZhbHVlMikgewogICAgICAgIGlmIChmbGFncy50aW1lc3RhbXBJc1NldCkgcmV0dXJuIGRhdGU7CiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdEZyb20oCiAgICAgICAgICBkYXRlLAogICAgICAgICAgZGF0ZS5nZXRUaW1lKCkgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGRhdGUpIC0gdmFsdWUyCiAgICAgICAgKTsKICAgICAgfQogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbInQiLCAiVCIsICJ4Il07CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9JU09UaW1lem9uZVBhcnNlci5qcwp2YXIgSVNPVGltZXpvbmVQYXJzZXI7CnZhciBpbml0X0lTT1RpbWV6b25lUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9JU09UaW1lem9uZVBhcnNlci5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcygpOwogICAgaW5pdF9jb25zdGFudHMyKCk7CiAgICBpbml0X1BhcnNlcigpOwogICAgaW5pdF91dGlscygpOwogICAgSVNPVGltZXpvbmVQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgICAgIHByaW9yaXR5ID0gMTA7CiAgICAgIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuKSB7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgY2FzZSAieCI6CiAgICAgICAgICAgIHJldHVybiBwYXJzZVRpbWV6b25lUGF0dGVybigKICAgICAgICAgICAgICB0aW1lem9uZVBhdHRlcm5zLmJhc2ljT3B0aW9uYWxNaW51dGVzLAogICAgICAgICAgICAgIGRhdGVTdHJpbmcKICAgICAgICAgICAgKTsKICAgICAgICAgIGNhc2UgInh4IjoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKHRpbWV6b25lUGF0dGVybnMuYmFzaWMsIGRhdGVTdHJpbmcpOwogICAgICAgICAgY2FzZSAieHh4eCI6CiAgICAgICAgICAgIHJldHVybiBwYXJzZVRpbWV6b25lUGF0dGVybigKICAgICAgICAgICAgICB0aW1lem9uZVBhdHRlcm5zLmJhc2ljT3B0aW9uYWxTZWNvbmRzLAogICAgICAgICAgICAgIGRhdGVTdHJpbmcKICAgICAgICAgICAgKTsKICAgICAgICAgIGNhc2UgInh4eHh4IjoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKAogICAgICAgICAgICAgIHRpbWV6b25lUGF0dGVybnMuZXh0ZW5kZWRPcHRpb25hbFNlY29uZHMsCiAgICAgICAgICAgICAgZGF0ZVN0cmluZwogICAgICAgICAgICApOwogICAgICAgICAgY2FzZSAieHh4IjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBwYXJzZVRpbWV6b25lUGF0dGVybih0aW1lem9uZVBhdHRlcm5zLmV4dGVuZGVkLCBkYXRlU3RyaW5nKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBpZiAoZmxhZ3MudGltZXN0YW1wSXNTZXQpIHJldHVybiBkYXRlOwogICAgICAgIHJldHVybiBjb25zdHJ1Y3RGcm9tKAogICAgICAgICAgZGF0ZSwKICAgICAgICAgIGRhdGUuZ2V0VGltZSgpIC0gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhkYXRlKSAtIHZhbHVlMgogICAgICAgICk7CiAgICAgIH0KICAgICAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJ0IiwgIlQiLCAiWCJdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvVGltZXN0YW1wU2Vjb25kc1BhcnNlci5qcwp2YXIgVGltZXN0YW1wU2Vjb25kc1BhcnNlcjsKdmFyIGluaXRfVGltZXN0YW1wU2Vjb25kc1BhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvVGltZXN0YW1wU2Vjb25kc1BhcnNlci5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfUGFyc2VyKCk7CiAgICBpbml0X3V0aWxzKCk7CiAgICBUaW1lc3RhbXBTZWNvbmRzUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDQwOwogICAgICBwYXJzZShkYXRlU3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlQW55RGlnaXRzU2lnbmVkKGRhdGVTdHJpbmcpOwogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgICAgIHJldHVybiBbY29uc3RydWN0RnJvbShkYXRlLCB2YWx1ZTIgKiAxZTMpLCB7IHRpbWVzdGFtcElzU2V0OiB0cnVlIH1dOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9ICIqIjsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1RpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlci5qcwp2YXIgVGltZXN0YW1wTWlsbGlzZWNvbmRzUGFyc2VyOwp2YXIgaW5pdF9UaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1RpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlci5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfUGFyc2VyKCk7CiAgICBpbml0X3V0aWxzKCk7CiAgICBUaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgICAgIHByaW9yaXR5ID0gMjA7CiAgICAgIHBhcnNlKGRhdGVTdHJpbmcpIHsKICAgICAgICByZXR1cm4gcGFyc2VBbnlEaWdpdHNTaWduZWQoZGF0ZVN0cmluZyk7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIFtjb25zdHJ1Y3RGcm9tKGRhdGUsIHZhbHVlMiksIHsgdGltZXN0YW1wSXNTZXQ6IHRydWUgfV07CiAgICAgIH0KICAgICAgaW5jb21wYXRpYmxlVG9rZW5zID0gIioiOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMuanMKdmFyIHBhcnNlcnM7CnZhciBpbml0X3BhcnNlcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzLmpzIigpIHsKICAgIGluaXRfRXJhUGFyc2VyKCk7CiAgICBpbml0X1llYXJQYXJzZXIoKTsKICAgIGluaXRfTG9jYWxXZWVrWWVhclBhcnNlcigpOwogICAgaW5pdF9JU09XZWVrWWVhclBhcnNlcigpOwogICAgaW5pdF9FeHRlbmRlZFllYXJQYXJzZXIoKTsKICAgIGluaXRfUXVhcnRlclBhcnNlcigpOwogICAgaW5pdF9TdGFuZEFsb25lUXVhcnRlclBhcnNlcigpOwogICAgaW5pdF9Nb250aFBhcnNlcigpOwogICAgaW5pdF9TdGFuZEFsb25lTW9udGhQYXJzZXIoKTsKICAgIGluaXRfTG9jYWxXZWVrUGFyc2VyKCk7CiAgICBpbml0X0lTT1dlZWtQYXJzZXIoKTsKICAgIGluaXRfRGF0ZVBhcnNlcigpOwogICAgaW5pdF9EYXlPZlllYXJQYXJzZXIoKTsKICAgIGluaXRfRGF5UGFyc2VyKCk7CiAgICBpbml0X0xvY2FsRGF5UGFyc2VyKCk7CiAgICBpbml0X1N0YW5kQWxvbmVMb2NhbERheVBhcnNlcigpOwogICAgaW5pdF9JU09EYXlQYXJzZXIoKTsKICAgIGluaXRfQU1QTVBhcnNlcigpOwogICAgaW5pdF9BTVBNTWlkbmlnaHRQYXJzZXIoKTsKICAgIGluaXRfRGF5UGVyaW9kUGFyc2VyKCk7CiAgICBpbml0X0hvdXIxdG8xMlBhcnNlcigpOwogICAgaW5pdF9Ib3VyMHRvMjNQYXJzZXIoKTsKICAgIGluaXRfSG91cjBUbzExUGFyc2VyKCk7CiAgICBpbml0X0hvdXIxVG8yNFBhcnNlcigpOwogICAgaW5pdF9NaW51dGVQYXJzZXIoKTsKICAgIGluaXRfU2Vjb25kUGFyc2VyKCk7CiAgICBpbml0X0ZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIoKTsKICAgIGluaXRfSVNPVGltZXpvbmVXaXRoWlBhcnNlcigpOwogICAgaW5pdF9JU09UaW1lem9uZVBhcnNlcigpOwogICAgaW5pdF9UaW1lc3RhbXBTZWNvbmRzUGFyc2VyKCk7CiAgICBpbml0X1RpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlcigpOwogICAgcGFyc2VycyA9IHsKICAgICAgRzogbmV3IEVyYVBhcnNlcigpLAogICAgICB5OiBuZXcgWWVhclBhcnNlcigpLAogICAgICBZOiBuZXcgTG9jYWxXZWVrWWVhclBhcnNlcigpLAogICAgICBSOiBuZXcgSVNPV2Vla1llYXJQYXJzZXIoKSwKICAgICAgdTogbmV3IEV4dGVuZGVkWWVhclBhcnNlcigpLAogICAgICBROiBuZXcgUXVhcnRlclBhcnNlcigpLAogICAgICBxOiBuZXcgU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIoKSwKICAgICAgTTogbmV3IE1vbnRoUGFyc2VyKCksCiAgICAgIEw6IG5ldyBTdGFuZEFsb25lTW9udGhQYXJzZXIoKSwKICAgICAgdzogbmV3IExvY2FsV2Vla1BhcnNlcigpLAogICAgICBJOiBuZXcgSVNPV2Vla1BhcnNlcigpLAogICAgICBkOiBuZXcgRGF0ZVBhcnNlcigpLAogICAgICBEOiBuZXcgRGF5T2ZZZWFyUGFyc2VyKCksCiAgICAgIEU6IG5ldyBEYXlQYXJzZXIoKSwKICAgICAgZTogbmV3IExvY2FsRGF5UGFyc2VyKCksCiAgICAgIGM6IG5ldyBTdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIoKSwKICAgICAgaTogbmV3IElTT0RheVBhcnNlcigpLAogICAgICBhOiBuZXcgQU1QTVBhcnNlcigpLAogICAgICBiOiBuZXcgQU1QTU1pZG5pZ2h0UGFyc2VyKCksCiAgICAgIEI6IG5ldyBEYXlQZXJpb2RQYXJzZXIoKSwKICAgICAgaDogbmV3IEhvdXIxdG8xMlBhcnNlcigpLAogICAgICBIOiBuZXcgSG91cjB0bzIzUGFyc2VyKCksCiAgICAgIEs6IG5ldyBIb3VyMFRvMTFQYXJzZXIoKSwKICAgICAgazogbmV3IEhvdXIxVG8yNFBhcnNlcigpLAogICAgICBtOiBuZXcgTWludXRlUGFyc2VyKCksCiAgICAgIHM6IG5ldyBTZWNvbmRQYXJzZXIoKSwKICAgICAgUzogbmV3IEZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIoKSwKICAgICAgWDogbmV3IElTT1RpbWV6b25lV2l0aFpQYXJzZXIoKSwKICAgICAgeDogbmV3IElTT1RpbWV6b25lUGFyc2VyKCksCiAgICAgIHQ6IG5ldyBUaW1lc3RhbXBTZWNvbmRzUGFyc2VyKCksCiAgICAgIFQ6IG5ldyBUaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIoKQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS5qcwpmdW5jdGlvbiBwYXJzZShkYXRlU3RyLCBmb3JtYXRTdHIsIHJlZmVyZW5jZURhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBpbnZhbGlkRGF0ZSA9ICgpID0+IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgcmVmZXJlbmNlRGF0ZSwgTmFOKTsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9uczIoKTsKICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZSA/PyBlblVTOwogIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBkZWZhdWx0T3B0aW9uczIuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyAxOwogIGNvbnN0IHdlZWtTdGFydHNPbiA9IG9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyAwOwogIGlmICghZm9ybWF0U3RyKQogICAgcmV0dXJuIGRhdGVTdHIgPyBpbnZhbGlkRGF0ZSgpIDogdG9EYXRlKHJlZmVyZW5jZURhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBzdWJGbk9wdGlvbnMgPSB7CiAgICBmaXJzdFdlZWtDb250YWluc0RhdGUsCiAgICB3ZWVrU3RhcnRzT24sCiAgICBsb2NhbGUKICB9OwogIGNvbnN0IHNldHRlcnMgPSBbbmV3IERhdGVUaW1lem9uZVNldHRlcihvcHRpb25zPy5pbiwgcmVmZXJlbmNlRGF0ZSldOwogIGNvbnN0IHRva2VucyA9IGZvcm1hdFN0ci5tYXRjaChsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cDIpLm1hcCgoc3Vic3RyaW5nKSA9PiB7CiAgICBjb25zdCBmaXJzdENoYXJhY3RlciA9IHN1YnN0cmluZ1swXTsKICAgIGlmIChmaXJzdENoYXJhY3RlciBpbiBsb25nRm9ybWF0dGVycykgewogICAgICBjb25zdCBsb25nRm9ybWF0dGVyID0gbG9uZ0Zvcm1hdHRlcnNbZmlyc3RDaGFyYWN0ZXJdOwogICAgICByZXR1cm4gbG9uZ0Zvcm1hdHRlcihzdWJzdHJpbmcsIGxvY2FsZS5mb3JtYXRMb25nKTsKICAgIH0KICAgIHJldHVybiBzdWJzdHJpbmc7CiAgfSkuam9pbigiIikubWF0Y2goZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cDIpOwogIGNvbnN0IHVzZWRUb2tlbnMgPSBbXTsKICBmb3IgKGxldCB0b2tlbiBvZiB0b2tlbnMpIHsKICAgIGlmICghb3B0aW9ucz8udXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zICYmIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikpIHsKICAgICAgd2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvcih0b2tlbiwgZm9ybWF0U3RyLCBkYXRlU3RyKTsKICAgIH0KICAgIGlmICghb3B0aW9ucz8udXNlQWRkaXRpb25hbERheU9mWWVhclRva2VucyAmJiBpc1Byb3RlY3RlZERheU9mWWVhclRva2VuKHRva2VuKSkgewogICAgICB3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yKHRva2VuLCBmb3JtYXRTdHIsIGRhdGVTdHIpOwogICAgfQogICAgY29uc3QgZmlyc3RDaGFyYWN0ZXIgPSB0b2tlblswXTsKICAgIGNvbnN0IHBhcnNlciA9IHBhcnNlcnNbZmlyc3RDaGFyYWN0ZXJdOwogICAgaWYgKHBhcnNlcikgewogICAgICBjb25zdCB7IGluY29tcGF0aWJsZVRva2VucyB9ID0gcGFyc2VyOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShpbmNvbXBhdGlibGVUb2tlbnMpKSB7CiAgICAgICAgY29uc3QgaW5jb21wYXRpYmxlVG9rZW4gPSB1c2VkVG9rZW5zLmZpbmQoCiAgICAgICAgICAodXNlZFRva2VuKSA9PiBpbmNvbXBhdGlibGVUb2tlbnMuaW5jbHVkZXModXNlZFRva2VuLnRva2VuKSB8fCB1c2VkVG9rZW4udG9rZW4gPT09IGZpcnN0Q2hhcmFjdGVyCiAgICAgICAgKTsKICAgICAgICBpZiAoaW5jb21wYXRpYmxlVG9rZW4pIHsKICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKAogICAgICAgICAgICBgVGhlIGZvcm1hdCBzdHJpbmcgbXVzdG4ndCBjb250YWluIFxgJHtpbmNvbXBhdGlibGVUb2tlbi5mdWxsVG9rZW59XGAgYW5kIFxgJHt0b2tlbn1cYCBhdCB0aGUgc2FtZSB0aW1lYAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAocGFyc2VyLmluY29tcGF0aWJsZVRva2VucyA9PT0gIioiICYmIHVzZWRUb2tlbnMubGVuZ3RoID4gMCkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKAogICAgICAgICAgYFRoZSBmb3JtYXQgc3RyaW5nIG11c3RuJ3QgY29udGFpbiBcYCR7dG9rZW59XGAgYW5kIGFueSBvdGhlciB0b2tlbiBhdCB0aGUgc2FtZSB0aW1lYAogICAgICAgICk7CiAgICAgIH0KICAgICAgdXNlZFRva2Vucy5wdXNoKHsgdG9rZW46IGZpcnN0Q2hhcmFjdGVyLCBmdWxsVG9rZW46IHRva2VuIH0pOwogICAgICBjb25zdCBwYXJzZVJlc3VsdCA9IHBhcnNlci5ydW4oCiAgICAgICAgZGF0ZVN0ciwKICAgICAgICB0b2tlbiwKICAgICAgICBsb2NhbGUubWF0Y2gsCiAgICAgICAgc3ViRm5PcHRpb25zCiAgICAgICk7CiAgICAgIGlmICghcGFyc2VSZXN1bHQpIHsKICAgICAgICByZXR1cm4gaW52YWxpZERhdGUoKTsKICAgICAgfQogICAgICBzZXR0ZXJzLnB1c2gocGFyc2VSZXN1bHQuc2V0dGVyKTsKICAgICAgZGF0ZVN0ciA9IHBhcnNlUmVzdWx0LnJlc3Q7CiAgICB9IGVsc2UgewogICAgICBpZiAoZmlyc3RDaGFyYWN0ZXIubWF0Y2godW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHAyKSkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKAogICAgICAgICAgIkZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlciBgIiArIGZpcnN0Q2hhcmFjdGVyICsgImAiCiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAodG9rZW4gPT09ICInJyIpIHsKICAgICAgICB0b2tlbiA9ICInIjsKICAgICAgfSBlbHNlIGlmIChmaXJzdENoYXJhY3RlciA9PT0gIiciKSB7CiAgICAgICAgdG9rZW4gPSBjbGVhbkVzY2FwZWRTdHJpbmcyKHRva2VuKTsKICAgICAgfQogICAgICBpZiAoZGF0ZVN0ci5pbmRleE9mKHRva2VuKSA9PT0gMCkgewogICAgICAgIGRhdGVTdHIgPSBkYXRlU3RyLnNsaWNlKHRva2VuLmxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGludmFsaWREYXRlKCk7CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKGRhdGVTdHIubGVuZ3RoID4gMCAmJiBub3RXaGl0ZXNwYWNlUmVnRXhwLnRlc3QoZGF0ZVN0cikpIHsKICAgIHJldHVybiBpbnZhbGlkRGF0ZSgpOwogIH0KICBjb25zdCB1bmlxdWVQcmlvcml0eVNldHRlcnMgPSBzZXR0ZXJzLm1hcCgoc2V0dGVyKSA9PiBzZXR0ZXIucHJpb3JpdHkpLnNvcnQoKGE1LCBiNSkgPT4gYjUgLSBhNSkuZmlsdGVyKChwcmlvcml0eSwgaW5kZXgyLCBhcnJheSkgPT4gYXJyYXkuaW5kZXhPZihwcmlvcml0eSkgPT09IGluZGV4MikubWFwKAogICAgKHByaW9yaXR5KSA9PiBzZXR0ZXJzLmZpbHRlcigoc2V0dGVyKSA9PiBzZXR0ZXIucHJpb3JpdHkgPT09IHByaW9yaXR5KS5zb3J0KChhNSwgYjUpID0+IGI1LnN1YlByaW9yaXR5IC0gYTUuc3ViUHJpb3JpdHkpCiAgKS5tYXAoKHNldHRlckFycmF5KSA9PiBzZXR0ZXJBcnJheVswXSk7CiAgbGV0IGRhdGUgPSB0b0RhdGUocmVmZXJlbmNlRGF0ZSwgb3B0aW9ucz8uaW4pOwogIGlmIChpc05hTigrZGF0ZSkpIHJldHVybiBpbnZhbGlkRGF0ZSgpOwogIGNvbnN0IGZsYWdzID0ge307CiAgZm9yIChjb25zdCBzZXR0ZXIgb2YgdW5pcXVlUHJpb3JpdHlTZXR0ZXJzKSB7CiAgICBpZiAoIXNldHRlci52YWxpZGF0ZShkYXRlLCBzdWJGbk9wdGlvbnMpKSB7CiAgICAgIHJldHVybiBpbnZhbGlkRGF0ZSgpOwogICAgfQogICAgY29uc3QgcmVzdWx0ID0gc2V0dGVyLnNldChkYXRlLCBmbGFncywgc3ViRm5PcHRpb25zKTsKICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHsKICAgICAgZGF0ZSA9IHJlc3VsdFswXTsKICAgICAgT2JqZWN0LmFzc2lnbihmbGFncywgcmVzdWx0WzFdKTsKICAgIH0gZWxzZSB7CiAgICAgIGRhdGUgPSByZXN1bHQ7CiAgICB9CiAgfQogIHJldHVybiBkYXRlOwp9CmZ1bmN0aW9uIGNsZWFuRXNjYXBlZFN0cmluZzIoaW5wdXQpIHsKICByZXR1cm4gaW5wdXQubWF0Y2goZXNjYXBlZFN0cmluZ1JlZ0V4cDIpWzFdLnJlcGxhY2UoZG91YmxlUXVvdGVSZWdFeHAyLCAiJyIpOwp9CnZhciBmb3JtYXR0aW5nVG9rZW5zUmVnRXhwMiwgbG9uZ0Zvcm1hdHRpbmdUb2tlbnNSZWdFeHAyLCBlc2NhcGVkU3RyaW5nUmVnRXhwMiwgZG91YmxlUXVvdGVSZWdFeHAyLCBub3RXaGl0ZXNwYWNlUmVnRXhwLCB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cDIsIHBhcnNlX2RlZmF1bHQ7CnZhciBpbml0X3BhcnNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlLmpzIigpIHsKICAgIGluaXRfZGVmYXVsdExvY2FsZSgpOwogICAgaW5pdF9sb25nRm9ybWF0dGVycygpOwogICAgaW5pdF9wcm90ZWN0ZWRUb2tlbnMoKTsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF9nZXREZWZhdWx0T3B0aW9ucygpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGluaXRfU2V0dGVyKCk7CiAgICBpbml0X3BhcnNlcnMoKTsKICAgIGZvcm1hdHRpbmdUb2tlbnNSZWdFeHAyID0gL1t5WVFxTUx3SWREZWNpaEhLa21zXW98KFx3KVwxKnwnJ3wnKCcnfFteJ10pKygnfCQpfC4vZzsKICAgIGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwMiA9IC9QK3ArfFArfHArfCcnfCcoJyd8W14nXSkrKCd8JCl8Li9nOwogICAgZXNjYXBlZFN0cmluZ1JlZ0V4cDIgPSAvXicoW15dKj8pJz8kLzsKICAgIGRvdWJsZVF1b3RlUmVnRXhwMiA9IC8nJy9nOwogICAgbm90V2hpdGVzcGFjZVJlZ0V4cCA9IC9cUy87CiAgICB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cDIgPSAvW2EtekEtWl0vOwogICAgcGFyc2VfZGVmYXVsdCA9IHBhcnNlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzTWF0Y2guanMKZnVuY3Rpb24gaXNNYXRjaDIoZGF0ZVN0ciwgZm9ybWF0U3RyLCBvcHRpb25zKSB7CiAgcmV0dXJuIGlzVmFsaWQocGFyc2UoZGF0ZVN0ciwgZm9ybWF0U3RyLCAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSwgb3B0aW9ucykpOwp9CnZhciBpc01hdGNoX2RlZmF1bHQ7CnZhciBpbml0X2lzTWF0Y2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNNYXRjaC5qcyIoKSB7CiAgICBpbml0X2lzVmFsaWQoKTsKICAgIGluaXRfcGFyc2UoKTsKICAgIGlzTWF0Y2hfZGVmYXVsdCA9IGlzTWF0Y2gyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzTW9uZGF5LmpzCmZ1bmN0aW9uIGlzTW9uZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKSA9PT0gMTsKfQp2YXIgaXNNb25kYXlfZGVmYXVsdDsKdmFyIGluaXRfaXNNb25kYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNNb25kYXkuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGlzTW9uZGF5X2RlZmF1bHQgPSBpc01vbmRheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1Bhc3QuanMKZnVuY3Rpb24gaXNQYXN0KGRhdGUpIHsKICByZXR1cm4gK3RvRGF0ZShkYXRlKSA8IERhdGUubm93KCk7Cn0KdmFyIGlzUGFzdF9kZWZhdWx0Owp2YXIgaW5pdF9pc1Bhc3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNQYXN0LmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpc1Bhc3RfZGVmYXVsdCA9IGlzUGFzdDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mSG91ci5qcwpmdW5jdGlvbiBzdGFydE9mSG91cihkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIF9kYXRlLnNldE1pbnV0ZXMoMCwgMCwgMCk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBzdGFydE9mSG91cl9kZWZhdWx0Owp2YXIgaW5pdF9zdGFydE9mSG91ciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mSG91ci5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgc3RhcnRPZkhvdXJfZGVmYXVsdCA9IHN0YXJ0T2ZIb3VyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZUhvdXIuanMKZnVuY3Rpb24gaXNTYW1lSG91cihkYXRlTGVmdCwgZGF0ZVJpZ2h0LCBvcHRpb25zKSB7CiAgY29uc3QgW2RhdGVMZWZ0XywgZGF0ZVJpZ2h0X10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgZGF0ZUxlZnQsCiAgICBkYXRlUmlnaHQKICApOwogIHJldHVybiArc3RhcnRPZkhvdXIoZGF0ZUxlZnRfKSA9PT0gK3N0YXJ0T2ZIb3VyKGRhdGVSaWdodF8pOwp9CnZhciBpc1NhbWVIb3VyX2RlZmF1bHQ7CnZhciBpbml0X2lzU2FtZUhvdXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lSG91ci5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBpbml0X3N0YXJ0T2ZIb3VyKCk7CiAgICBpc1NhbWVIb3VyX2RlZmF1bHQgPSBpc1NhbWVIb3VyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZVdlZWsuanMKZnVuY3Rpb24gaXNTYW1lV2VlayhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIHJldHVybiArc3RhcnRPZldlZWsobGF0ZXJEYXRlXywgb3B0aW9ucykgPT09ICtzdGFydE9mV2VlayhlYXJsaWVyRGF0ZV8sIG9wdGlvbnMpOwp9CnZhciBpc1NhbWVXZWVrX2RlZmF1bHQ7CnZhciBpbml0X2lzU2FtZVdlZWsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lV2Vlay5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBpbml0X3N0YXJ0T2ZXZWVrKCk7CiAgICBpc1NhbWVXZWVrX2RlZmF1bHQgPSBpc1NhbWVXZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZUlTT1dlZWsuanMKZnVuY3Rpb24gaXNTYW1lSVNPV2VlayhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGlzU2FtZVdlZWsobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgeyAuLi5vcHRpb25zLCB3ZWVrU3RhcnRzT246IDEgfSk7Cn0KdmFyIGlzU2FtZUlTT1dlZWtfZGVmYXVsdDsKdmFyIGluaXRfaXNTYW1lSVNPV2VlayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVJU09XZWVrLmpzIigpIHsKICAgIGluaXRfaXNTYW1lV2VlaygpOwogICAgaXNTYW1lSVNPV2Vla19kZWZhdWx0ID0gaXNTYW1lSVNPV2VlazsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVJU09XZWVrWWVhci5qcwpmdW5jdGlvbiBpc1NhbWVJU09XZWVrWWVhcihsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIHJldHVybiArc3RhcnRPZklTT1dlZWtZZWFyKGxhdGVyRGF0ZV8pID09PSArc3RhcnRPZklTT1dlZWtZZWFyKGVhcmxpZXJEYXRlXyk7Cn0KdmFyIGlzU2FtZUlTT1dlZWtZZWFyX2RlZmF1bHQ7CnZhciBpbml0X2lzU2FtZUlTT1dlZWtZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZUlTT1dlZWtZZWFyLmpzIigpIHsKICAgIGluaXRfc3RhcnRPZklTT1dlZWtZZWFyKCk7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBpc1NhbWVJU09XZWVrWWVhcl9kZWZhdWx0ID0gaXNTYW1lSVNPV2Vla1llYXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZk1pbnV0ZS5qcwpmdW5jdGlvbiBzdGFydE9mTWludXRlKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgZGF0ZV8uc2V0U2Vjb25kcygwLCAwKTsKICByZXR1cm4gZGF0ZV87Cn0KdmFyIHN0YXJ0T2ZNaW51dGVfZGVmYXVsdDsKdmFyIGluaXRfc3RhcnRPZk1pbnV0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mTWludXRlLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzdGFydE9mTWludXRlX2RlZmF1bHQgPSBzdGFydE9mTWludXRlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZU1pbnV0ZS5qcwpmdW5jdGlvbiBpc1NhbWVNaW51dGUobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSkgewogIHJldHVybiArc3RhcnRPZk1pbnV0ZShsYXRlckRhdGUpID09PSArc3RhcnRPZk1pbnV0ZShlYXJsaWVyRGF0ZSk7Cn0KdmFyIGlzU2FtZU1pbnV0ZV9kZWZhdWx0Owp2YXIgaW5pdF9pc1NhbWVNaW51dGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lTWludXRlLmpzIigpIHsKICAgIGluaXRfc3RhcnRPZk1pbnV0ZSgpOwogICAgaXNTYW1lTWludXRlX2RlZmF1bHQgPSBpc1NhbWVNaW51dGU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lTW9udGguanMKZnVuY3Rpb24gaXNTYW1lTW9udGgobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICByZXR1cm4gbGF0ZXJEYXRlXy5nZXRGdWxsWWVhcigpID09PSBlYXJsaWVyRGF0ZV8uZ2V0RnVsbFllYXIoKSAmJiBsYXRlckRhdGVfLmdldE1vbnRoKCkgPT09IGVhcmxpZXJEYXRlXy5nZXRNb250aCgpOwp9CnZhciBpc1NhbWVNb250aF9kZWZhdWx0Owp2YXIgaW5pdF9pc1NhbWVNb250aCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVNb250aC5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBpc1NhbWVNb250aF9kZWZhdWx0ID0gaXNTYW1lTW9udGg7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lUXVhcnRlci5qcwpmdW5jdGlvbiBpc1NhbWVRdWFydGVyKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbZGF0ZUxlZnRfLCBkYXRlUmlnaHRfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgcmV0dXJuICtzdGFydE9mUXVhcnRlcihkYXRlTGVmdF8pID09PSArc3RhcnRPZlF1YXJ0ZXIoZGF0ZVJpZ2h0Xyk7Cn0KdmFyIGlzU2FtZVF1YXJ0ZXJfZGVmYXVsdDsKdmFyIGluaXRfaXNTYW1lUXVhcnRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVRdWFydGVyLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplRGF0ZXMoKTsKICAgIGluaXRfc3RhcnRPZlF1YXJ0ZXIoKTsKICAgIGlzU2FtZVF1YXJ0ZXJfZGVmYXVsdCA9IGlzU2FtZVF1YXJ0ZXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZlNlY29uZC5qcwpmdW5jdGlvbiBzdGFydE9mU2Vjb25kKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgZGF0ZV8uc2V0TWlsbGlzZWNvbmRzKDApOwogIHJldHVybiBkYXRlXzsKfQp2YXIgc3RhcnRPZlNlY29uZF9kZWZhdWx0Owp2YXIgaW5pdF9zdGFydE9mU2Vjb25kID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZTZWNvbmQuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIHN0YXJ0T2ZTZWNvbmRfZGVmYXVsdCA9IHN0YXJ0T2ZTZWNvbmQ7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lU2Vjb25kLmpzCmZ1bmN0aW9uIGlzU2FtZVNlY29uZChsYXRlckRhdGUsIGVhcmxpZXJEYXRlKSB7CiAgcmV0dXJuICtzdGFydE9mU2Vjb25kKGxhdGVyRGF0ZSkgPT09ICtzdGFydE9mU2Vjb25kKGVhcmxpZXJEYXRlKTsKfQp2YXIgaXNTYW1lU2Vjb25kX2RlZmF1bHQ7CnZhciBpbml0X2lzU2FtZVNlY29uZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVTZWNvbmQuanMiKCkgewogICAgaW5pdF9zdGFydE9mU2Vjb25kKCk7CiAgICBpc1NhbWVTZWNvbmRfZGVmYXVsdCA9IGlzU2FtZVNlY29uZDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVZZWFyLmpzCmZ1bmN0aW9uIGlzU2FtZVllYXIobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICByZXR1cm4gbGF0ZXJEYXRlXy5nZXRGdWxsWWVhcigpID09PSBlYXJsaWVyRGF0ZV8uZ2V0RnVsbFllYXIoKTsKfQp2YXIgaXNTYW1lWWVhcl9kZWZhdWx0Owp2YXIgaW5pdF9pc1NhbWVZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZVllYXIuanMiKCkgewogICAgaW5pdF9ub3JtYWxpemVEYXRlcygpOwogICAgaXNTYW1lWWVhcl9kZWZhdWx0ID0gaXNTYW1lWWVhcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNIb3VyLmpzCmZ1bmN0aW9uIGlzVGhpc0hvdXIoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBpc1NhbWVIb3VyKAogICAgdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKSwKICAgIGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbiB8fCBkYXRlKQogICk7Cn0KdmFyIGlzVGhpc0hvdXJfZGVmYXVsdDsKdmFyIGluaXRfaXNUaGlzSG91ciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNIb3VyLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0Tm93KCk7CiAgICBpbml0X2lzU2FtZUhvdXIoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpc1RoaXNIb3VyX2RlZmF1bHQgPSBpc1RoaXNIb3VyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGhpc0lTT1dlZWsuanMKZnVuY3Rpb24gaXNUaGlzSVNPV2VlayhkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGlzU2FtZUlTT1dlZWsoCiAgICBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIGRhdGUpLAogICAgY29uc3RydWN0Tm93KG9wdGlvbnM/LmluIHx8IGRhdGUpCiAgKTsKfQp2YXIgaXNUaGlzSVNPV2Vla19kZWZhdWx0Owp2YXIgaW5pdF9pc1RoaXNJU09XZWVrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGhpc0lTT1dlZWsuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X2NvbnN0cnVjdE5vdygpOwogICAgaW5pdF9pc1NhbWVJU09XZWVrKCk7CiAgICBpc1RoaXNJU09XZWVrX2RlZmF1bHQgPSBpc1RoaXNJU09XZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGhpc01pbnV0ZS5qcwpmdW5jdGlvbiBpc1RoaXNNaW51dGUoZGF0ZSkgewogIHJldHVybiBpc1NhbWVNaW51dGUoZGF0ZSwgY29uc3RydWN0Tm93KGRhdGUpKTsKfQp2YXIgaXNUaGlzTWludXRlX2RlZmF1bHQ7CnZhciBpbml0X2lzVGhpc01pbnV0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNNaW51dGUuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3ROb3coKTsKICAgIGluaXRfaXNTYW1lTWludXRlKCk7CiAgICBpc1RoaXNNaW51dGVfZGVmYXVsdCA9IGlzVGhpc01pbnV0ZTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNNb250aC5qcwpmdW5jdGlvbiBpc1RoaXNNb250aChkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGlzU2FtZU1vbnRoKAogICAgY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBkYXRlKSwKICAgIGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbiB8fCBkYXRlKQogICk7Cn0KdmFyIGlzVGhpc01vbnRoX2RlZmF1bHQ7CnZhciBpbml0X2lzVGhpc01vbnRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGhpc01vbnRoLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF9jb25zdHJ1Y3ROb3coKTsKICAgIGluaXRfaXNTYW1lTW9udGgoKTsKICAgIGlzVGhpc01vbnRoX2RlZmF1bHQgPSBpc1RoaXNNb250aDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNRdWFydGVyLmpzCmZ1bmN0aW9uIGlzVGhpc1F1YXJ0ZXIoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBpc1NhbWVRdWFydGVyKAogICAgY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBkYXRlKSwKICAgIGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbiB8fCBkYXRlKQogICk7Cn0KdmFyIGlzVGhpc1F1YXJ0ZXJfZGVmYXVsdDsKdmFyIGluaXRfaXNUaGlzUXVhcnRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNRdWFydGVyLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF9jb25zdHJ1Y3ROb3coKTsKICAgIGluaXRfaXNTYW1lUXVhcnRlcigpOwogICAgaXNUaGlzUXVhcnRlcl9kZWZhdWx0ID0gaXNUaGlzUXVhcnRlcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNTZWNvbmQuanMKZnVuY3Rpb24gaXNUaGlzU2Vjb25kKGRhdGUpIHsKICByZXR1cm4gaXNTYW1lU2Vjb25kKGRhdGUsIGNvbnN0cnVjdE5vdyhkYXRlKSk7Cn0KdmFyIGlzVGhpc1NlY29uZF9kZWZhdWx0Owp2YXIgaW5pdF9pc1RoaXNTZWNvbmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNUaGlzU2Vjb25kLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0Tm93KCk7CiAgICBpbml0X2lzU2FtZVNlY29uZCgpOwogICAgaXNUaGlzU2Vjb25kX2RlZmF1bHQgPSBpc1RoaXNTZWNvbmQ7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNUaGlzV2Vlay5qcwpmdW5jdGlvbiBpc1RoaXNXZWVrKGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gaXNTYW1lV2VlaygKICAgIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgZGF0ZSksCiAgICBjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4gfHwgZGF0ZSksCiAgICBvcHRpb25zCiAgKTsKfQp2YXIgaXNUaGlzV2Vla19kZWZhdWx0Owp2YXIgaW5pdF9pc1RoaXNXZWVrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGhpc1dlZWsuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X2NvbnN0cnVjdE5vdygpOwogICAgaW5pdF9pc1NhbWVXZWVrKCk7CiAgICBpc1RoaXNXZWVrX2RlZmF1bHQgPSBpc1RoaXNXZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGhpc1llYXIuanMKZnVuY3Rpb24gaXNUaGlzWWVhcihkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGlzU2FtZVllYXIoCiAgICBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIGRhdGUpLAogICAgY29uc3RydWN0Tm93KG9wdGlvbnM/LmluIHx8IGRhdGUpCiAgKTsKfQp2YXIgaXNUaGlzWWVhcl9kZWZhdWx0Owp2YXIgaW5pdF9pc1RoaXNZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGhpc1llYXIuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X2NvbnN0cnVjdE5vdygpOwogICAgaW5pdF9pc1NhbWVZZWFyKCk7CiAgICBpc1RoaXNZZWFyX2RlZmF1bHQgPSBpc1RoaXNZZWFyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGh1cnNkYXkuanMKZnVuY3Rpb24gaXNUaHVyc2RheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbikuZ2V0RGF5KCkgPT09IDQ7Cn0KdmFyIGlzVGh1cnNkYXlfZGVmYXVsdDsKdmFyIGluaXRfaXNUaHVyc2RheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RodXJzZGF5LmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpc1RodXJzZGF5X2RlZmF1bHQgPSBpc1RodXJzZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVG9kYXkuanMKZnVuY3Rpb24gaXNUb2RheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGlzU2FtZURheSgKICAgIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgZGF0ZSksCiAgICBjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4gfHwgZGF0ZSkKICApOwp9CnZhciBpc1RvZGF5X2RlZmF1bHQ7CnZhciBpbml0X2lzVG9kYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNUb2RheS5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfY29uc3RydWN0Tm93KCk7CiAgICBpbml0X2lzU2FtZURheSgpOwogICAgaXNUb2RheV9kZWZhdWx0ID0gaXNUb2RheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RvbW9ycm93LmpzCmZ1bmN0aW9uIGlzVG9tb3Jyb3coZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBpc1NhbWVEYXkoCiAgICBkYXRlLAogICAgYWRkRGF5cyhjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4gfHwgZGF0ZSksIDEpLAogICAgb3B0aW9ucwogICk7Cn0KdmFyIGlzVG9tb3Jyb3dfZGVmYXVsdDsKdmFyIGluaXRfaXNUb21vcnJvdyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RvbW9ycm93LmpzIigpIHsKICAgIGluaXRfYWRkRGF5cygpOwogICAgaW5pdF9jb25zdHJ1Y3ROb3coKTsKICAgIGluaXRfaXNTYW1lRGF5KCk7CiAgICBpc1RvbW9ycm93X2RlZmF1bHQgPSBpc1RvbW9ycm93OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVHVlc2RheS5qcwpmdW5jdGlvbiBpc1R1ZXNkYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldERheSgpID09PSAyOwp9CnZhciBpc1R1ZXNkYXlfZGVmYXVsdDsKdmFyIGluaXRfaXNUdWVzZGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVHVlc2RheS5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgaXNUdWVzZGF5X2RlZmF1bHQgPSBpc1R1ZXNkYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNXZWRuZXNkYXkuanMKZnVuY3Rpb24gaXNXZWRuZXNkYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldERheSgpID09PSAzOwp9CnZhciBpc1dlZG5lc2RheV9kZWZhdWx0Owp2YXIgaW5pdF9pc1dlZG5lc2RheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1dlZG5lc2RheS5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgaXNXZWRuZXNkYXlfZGVmYXVsdCA9IGlzV2VkbmVzZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzV2l0aGluSW50ZXJ2YWwuanMKZnVuY3Rpb24gaXNXaXRoaW5JbnRlcnZhbChkYXRlLCBpbnRlcnZhbDMsIG9wdGlvbnMpIHsKICBjb25zdCB0aW1lID0gK3RvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgW3N0YXJ0VGltZSwgZW5kVGltZV0gPSBbCiAgICArdG9EYXRlKGludGVydmFsMy5zdGFydCwgb3B0aW9ucz8uaW4pLAogICAgK3RvRGF0ZShpbnRlcnZhbDMuZW5kLCBvcHRpb25zPy5pbikKICBdLnNvcnQoKGE1LCBiNSkgPT4gYTUgLSBiNSk7CiAgcmV0dXJuIHRpbWUgPj0gc3RhcnRUaW1lICYmIHRpbWUgPD0gZW5kVGltZTsKfQp2YXIgaXNXaXRoaW5JbnRlcnZhbF9kZWZhdWx0Owp2YXIgaW5pdF9pc1dpdGhpbkludGVydmFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzV2l0aGluSW50ZXJ2YWwuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGlzV2l0aGluSW50ZXJ2YWxfZGVmYXVsdCA9IGlzV2l0aGluSW50ZXJ2YWw7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViRGF5cy5qcwpmdW5jdGlvbiBzdWJEYXlzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGREYXlzKGRhdGUsIC1hbW91bnQsIG9wdGlvbnMpOwp9CnZhciBzdWJEYXlzX2RlZmF1bHQ7CnZhciBpbml0X3N1YkRheXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViRGF5cy5qcyIoKSB7CiAgICBpbml0X2FkZERheXMoKTsKICAgIHN1YkRheXNfZGVmYXVsdCA9IHN1YkRheXM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNZZXN0ZXJkYXkuanMKZnVuY3Rpb24gaXNZZXN0ZXJkYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBpc1NhbWVEYXkoCiAgICBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIGRhdGUpLAogICAgc3ViRGF5cyhjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4gfHwgZGF0ZSksIDEpCiAgKTsKfQp2YXIgaXNZZXN0ZXJkYXlfZGVmYXVsdDsKdmFyIGluaXRfaXNZZXN0ZXJkYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNZZXN0ZXJkYXkuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X2NvbnN0cnVjdE5vdygpOwogICAgaW5pdF9pc1NhbWVEYXkoKTsKICAgIGluaXRfc3ViRGF5cygpOwogICAgaXNZZXN0ZXJkYXlfZGVmYXVsdCA9IGlzWWVzdGVyZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xhc3REYXlPZkRlY2FkZS5qcwpmdW5jdGlvbiBsYXN0RGF5T2ZEZWNhZGUoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTsKICBjb25zdCBkZWNhZGUgPSA5ICsgTWF0aC5mbG9vcih5ZWFyIC8gMTApICogMTA7CiAgX2RhdGUuc2V0RnVsbFllYXIoZGVjYWRlICsgMSwgMCwgMCk7CiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgcmV0dXJuIHRvRGF0ZShfZGF0ZSwgb3B0aW9ucz8uaW4pOwp9CnZhciBsYXN0RGF5T2ZEZWNhZGVfZGVmYXVsdDsKdmFyIGluaXRfbGFzdERheU9mRGVjYWRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xhc3REYXlPZkRlY2FkZS5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgbGFzdERheU9mRGVjYWRlX2RlZmF1bHQgPSBsYXN0RGF5T2ZEZWNhZGU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbGFzdERheU9mV2Vlay5qcwpmdW5jdGlvbiBsYXN0RGF5T2ZXZWVrKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IHdlZWtTdGFydHNPbiA9IG9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyAwOwogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBkYXkgPSBfZGF0ZS5nZXREYXkoKTsKICBjb25zdCBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IC03IDogMCkgKyA2IC0gKGRheSAtIHdlZWtTdGFydHNPbik7CiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgKyBkaWZmKTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIGxhc3REYXlPZldlZWtfZGVmYXVsdDsKdmFyIGluaXRfbGFzdERheU9mV2VlayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sYXN0RGF5T2ZXZWVrLmpzIigpIHsKICAgIGluaXRfZGVmYXVsdE9wdGlvbnMoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBsYXN0RGF5T2ZXZWVrX2RlZmF1bHQgPSBsYXN0RGF5T2ZXZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xhc3REYXlPZklTT1dlZWsuanMKZnVuY3Rpb24gbGFzdERheU9mSVNPV2VlayhkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGxhc3REYXlPZldlZWsoZGF0ZSwgeyAuLi5vcHRpb25zLCB3ZWVrU3RhcnRzT246IDEgfSk7Cn0KdmFyIGxhc3REYXlPZklTT1dlZWtfZGVmYXVsdDsKdmFyIGluaXRfbGFzdERheU9mSVNPV2VlayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sYXN0RGF5T2ZJU09XZWVrLmpzIigpIHsKICAgIGluaXRfbGFzdERheU9mV2VlaygpOwogICAgbGFzdERheU9mSVNPV2Vla19kZWZhdWx0ID0gbGFzdERheU9mSVNPV2VlazsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sYXN0RGF5T2ZJU09XZWVrWWVhci5qcwpmdW5jdGlvbiBsYXN0RGF5T2ZJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgeWVhciA9IGdldElTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpOwogIGNvbnN0IGZvdXJ0aE9mSmFudWFyeSA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgMCk7CiAgZm91cnRoT2ZKYW51YXJ5LnNldEZ1bGxZZWFyKHllYXIgKyAxLCAwLCA0KTsKICBmb3VydGhPZkphbnVhcnkuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgY29uc3QgZGF0ZV8gPSBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnksIG9wdGlvbnMpOwogIGRhdGVfLnNldERhdGUoZGF0ZV8uZ2V0RGF0ZSgpIC0gMSk7CiAgcmV0dXJuIGRhdGVfOwp9CnZhciBsYXN0RGF5T2ZJU09XZWVrWWVhcl9kZWZhdWx0Owp2YXIgaW5pdF9sYXN0RGF5T2ZJU09XZWVrWWVhciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sYXN0RGF5T2ZJU09XZWVrWWVhci5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfZ2V0SVNPV2Vla1llYXIoKTsKICAgIGluaXRfc3RhcnRPZklTT1dlZWsoKTsKICAgIGxhc3REYXlPZklTT1dlZWtZZWFyX2RlZmF1bHQgPSBsYXN0RGF5T2ZJU09XZWVrWWVhcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sYXN0RGF5T2ZRdWFydGVyLmpzCmZ1bmN0aW9uIGxhc3REYXlPZlF1YXJ0ZXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBjdXJyZW50TW9udGggPSBkYXRlXy5nZXRNb250aCgpOwogIGNvbnN0IG1vbnRoID0gY3VycmVudE1vbnRoIC0gY3VycmVudE1vbnRoICUgMyArIDM7CiAgZGF0ZV8uc2V0TW9udGgobW9udGgsIDApOwogIGRhdGVfLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiBkYXRlXzsKfQp2YXIgbGFzdERheU9mUXVhcnRlcl9kZWZhdWx0Owp2YXIgaW5pdF9sYXN0RGF5T2ZRdWFydGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xhc3REYXlPZlF1YXJ0ZXIuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGxhc3REYXlPZlF1YXJ0ZXJfZGVmYXVsdCA9IGxhc3REYXlPZlF1YXJ0ZXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbGFzdERheU9mWWVhci5qcwpmdW5jdGlvbiBsYXN0RGF5T2ZZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IGRhdGVfLmdldEZ1bGxZZWFyKCk7CiAgZGF0ZV8uc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDApOwogIGRhdGVfLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiBkYXRlXzsKfQp2YXIgbGFzdERheU9mWWVhcl9kZWZhdWx0Owp2YXIgaW5pdF9sYXN0RGF5T2ZZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xhc3REYXlPZlllYXIuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGxhc3REYXlPZlllYXJfZGVmYXVsdCA9IGxhc3REYXlPZlllYXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbGlnaHRGb3JtYXQuanMKZnVuY3Rpb24gbGlnaHRGb3JtYXQoZGF0ZSwgZm9ybWF0U3RyKSB7CiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSk7CiAgaWYgKCFpc1ZhbGlkKGRhdGVfKSkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdGltZSB2YWx1ZSIpOwogIH0KICBjb25zdCB0b2tlbnMgPSBmb3JtYXRTdHIubWF0Y2goZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cDMpOwogIGlmICghdG9rZW5zKSByZXR1cm4gIiI7CiAgY29uc3QgcmVzdWx0ID0gdG9rZW5zLm1hcCgoc3Vic3RyaW5nKSA9PiB7CiAgICBpZiAoc3Vic3RyaW5nID09PSAiJyciKSB7CiAgICAgIHJldHVybiAiJyI7CiAgICB9CiAgICBjb25zdCBmaXJzdENoYXJhY3RlciA9IHN1YnN0cmluZ1swXTsKICAgIGlmIChmaXJzdENoYXJhY3RlciA9PT0gIiciKSB7CiAgICAgIHJldHVybiBjbGVhbkVzY2FwZWRTdHJpbmczKHN1YnN0cmluZyk7CiAgICB9CiAgICBjb25zdCBmb3JtYXR0ZXIyID0gbGlnaHRGb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXTsKICAgIGlmIChmb3JtYXR0ZXIyKSB7CiAgICAgIHJldHVybiBmb3JtYXR0ZXIyKGRhdGVfLCBzdWJzdHJpbmcpOwogICAgfQogICAgaWYgKGZpcnN0Q2hhcmFjdGVyLm1hdGNoKHVuZXNjYXBlZExhdGluQ2hhcmFjdGVyUmVnRXhwMykpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoCiAgICAgICAgIkZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlciBgIiArIGZpcnN0Q2hhcmFjdGVyICsgImAiCiAgICAgICk7CiAgICB9CiAgICByZXR1cm4gc3Vic3RyaW5nOwogIH0pLmpvaW4oIiIpOwogIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gY2xlYW5Fc2NhcGVkU3RyaW5nMyhpbnB1dCkgewogIGNvbnN0IG1hdGNoZXMgPSBpbnB1dC5tYXRjaChlc2NhcGVkU3RyaW5nUmVnRXhwMyk7CiAgaWYgKCFtYXRjaGVzKSByZXR1cm4gaW5wdXQ7CiAgcmV0dXJuIG1hdGNoZXNbMV0ucmVwbGFjZShkb3VibGVRdW90ZVJlZ0V4cDMsICInIik7Cn0KdmFyIGZvcm1hdHRpbmdUb2tlbnNSZWdFeHAzLCBlc2NhcGVkU3RyaW5nUmVnRXhwMywgZG91YmxlUXVvdGVSZWdFeHAzLCB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cDMsIGxpZ2h0Rm9ybWF0X2RlZmF1bHQ7CnZhciBpbml0X2xpZ2h0Rm9ybWF0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xpZ2h0Rm9ybWF0LmpzIigpIHsKICAgIGluaXRfbGlnaHRGb3JtYXR0ZXJzKCk7CiAgICBpbml0X2lzVmFsaWQoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBmb3JtYXR0aW5nVG9rZW5zUmVnRXhwMyA9IC8oXHcpXDEqfCcnfCcoJyd8W14nXSkrKCd8JCl8Li9nOwogICAgZXNjYXBlZFN0cmluZ1JlZ0V4cDMgPSAvXicoW15dKj8pJz8kLzsKICAgIGRvdWJsZVF1b3RlUmVnRXhwMyA9IC8nJy9nOwogICAgdW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHAzID0gL1thLXpBLVpdLzsKICAgIGxpZ2h0Rm9ybWF0X2RlZmF1bHQgPSBsaWdodEZvcm1hdDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taWxsaXNlY29uZHMuanMKZnVuY3Rpb24gbWlsbGlzZWNvbmRzKHsKICB5ZWFycywKICBtb250aHM6IG1vbnRoczIsCiAgd2Vla3MsCiAgZGF5czogZGF5czIsCiAgaG91cnMsCiAgbWludXRlcywKICBzZWNvbmRzCn0pIHsKICBsZXQgdG90YWxEYXlzID0gMDsKICBpZiAoeWVhcnMpIHRvdGFsRGF5cyArPSB5ZWFycyAqIGRheXNJblllYXI7CiAgaWYgKG1vbnRoczIpIHRvdGFsRGF5cyArPSBtb250aHMyICogKGRheXNJblllYXIgLyAxMik7CiAgaWYgKHdlZWtzKSB0b3RhbERheXMgKz0gd2Vla3MgKiA3OwogIGlmIChkYXlzMikgdG90YWxEYXlzICs9IGRheXMyOwogIGxldCB0b3RhbFNlY29uZHMgPSB0b3RhbERheXMgKiAyNCAqIDYwICogNjA7CiAgaWYgKGhvdXJzKSB0b3RhbFNlY29uZHMgKz0gaG91cnMgKiA2MCAqIDYwOwogIGlmIChtaW51dGVzKSB0b3RhbFNlY29uZHMgKz0gbWludXRlcyAqIDYwOwogIGlmIChzZWNvbmRzKSB0b3RhbFNlY29uZHMgKz0gc2Vjb25kczsKICByZXR1cm4gTWF0aC50cnVuYyh0b3RhbFNlY29uZHMgKiAxZTMpOwp9CnZhciBtaWxsaXNlY29uZHNfZGVmYXVsdDsKdmFyIGluaXRfbWlsbGlzZWNvbmRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21pbGxpc2Vjb25kcy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgbWlsbGlzZWNvbmRzX2RlZmF1bHQgPSBtaWxsaXNlY29uZHM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbWlsbGlzZWNvbmRzVG9Ib3Vycy5qcwpmdW5jdGlvbiBtaWxsaXNlY29uZHNUb0hvdXJzKG1pbGxpc2Vjb25kczIpIHsKICBjb25zdCBob3VycyA9IG1pbGxpc2Vjb25kczIgLyBtaWxsaXNlY29uZHNJbkhvdXI7CiAgcmV0dXJuIE1hdGgudHJ1bmMoaG91cnMpOwp9CnZhciBtaWxsaXNlY29uZHNUb0hvdXJzX2RlZmF1bHQ7CnZhciBpbml0X21pbGxpc2Vjb25kc1RvSG91cnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbWlsbGlzZWNvbmRzVG9Ib3Vycy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgbWlsbGlzZWNvbmRzVG9Ib3Vyc19kZWZhdWx0ID0gbWlsbGlzZWNvbmRzVG9Ib3VyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taWxsaXNlY29uZHNUb01pbnV0ZXMuanMKZnVuY3Rpb24gbWlsbGlzZWNvbmRzVG9NaW51dGVzKG1pbGxpc2Vjb25kczIpIHsKICBjb25zdCBtaW51dGVzID0gbWlsbGlzZWNvbmRzMiAvIG1pbGxpc2Vjb25kc0luTWludXRlOwogIHJldHVybiBNYXRoLnRydW5jKG1pbnV0ZXMpOwp9CnZhciBtaWxsaXNlY29uZHNUb01pbnV0ZXNfZGVmYXVsdDsKdmFyIGluaXRfbWlsbGlzZWNvbmRzVG9NaW51dGVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21pbGxpc2Vjb25kc1RvTWludXRlcy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgbWlsbGlzZWNvbmRzVG9NaW51dGVzX2RlZmF1bHQgPSBtaWxsaXNlY29uZHNUb01pbnV0ZXM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbWlsbGlzZWNvbmRzVG9TZWNvbmRzLmpzCmZ1bmN0aW9uIG1pbGxpc2Vjb25kc1RvU2Vjb25kcyhtaWxsaXNlY29uZHMyKSB7CiAgY29uc3Qgc2Vjb25kcyA9IG1pbGxpc2Vjb25kczIgLyBtaWxsaXNlY29uZHNJblNlY29uZDsKICByZXR1cm4gTWF0aC50cnVuYyhzZWNvbmRzKTsKfQp2YXIgbWlsbGlzZWNvbmRzVG9TZWNvbmRzX2RlZmF1bHQ7CnZhciBpbml0X21pbGxpc2Vjb25kc1RvU2Vjb25kcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taWxsaXNlY29uZHNUb1NlY29uZHMuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIG1pbGxpc2Vjb25kc1RvU2Vjb25kc19kZWZhdWx0ID0gbWlsbGlzZWNvbmRzVG9TZWNvbmRzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21pbnV0ZXNUb0hvdXJzLmpzCmZ1bmN0aW9uIG1pbnV0ZXNUb0hvdXJzKG1pbnV0ZXMpIHsKICBjb25zdCBob3VycyA9IG1pbnV0ZXMgLyBtaW51dGVzSW5Ib3VyOwogIHJldHVybiBNYXRoLnRydW5jKGhvdXJzKTsKfQp2YXIgbWludXRlc1RvSG91cnNfZGVmYXVsdDsKdmFyIGluaXRfbWludXRlc1RvSG91cnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbWludXRlc1RvSG91cnMuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIG1pbnV0ZXNUb0hvdXJzX2RlZmF1bHQgPSBtaW51dGVzVG9Ib3VyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taW51dGVzVG9NaWxsaXNlY29uZHMuanMKZnVuY3Rpb24gbWludXRlc1RvTWlsbGlzZWNvbmRzKG1pbnV0ZXMpIHsKICByZXR1cm4gTWF0aC50cnVuYyhtaW51dGVzICogbWlsbGlzZWNvbmRzSW5NaW51dGUpOwp9CnZhciBtaW51dGVzVG9NaWxsaXNlY29uZHNfZGVmYXVsdDsKdmFyIGluaXRfbWludXRlc1RvTWlsbGlzZWNvbmRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21pbnV0ZXNUb01pbGxpc2Vjb25kcy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgbWludXRlc1RvTWlsbGlzZWNvbmRzX2RlZmF1bHQgPSBtaW51dGVzVG9NaWxsaXNlY29uZHM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbWludXRlc1RvU2Vjb25kcy5qcwpmdW5jdGlvbiBtaW51dGVzVG9TZWNvbmRzKG1pbnV0ZXMpIHsKICByZXR1cm4gTWF0aC50cnVuYyhtaW51dGVzICogc2Vjb25kc0luTWludXRlKTsKfQp2YXIgbWludXRlc1RvU2Vjb25kc19kZWZhdWx0Owp2YXIgaW5pdF9taW51dGVzVG9TZWNvbmRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21pbnV0ZXNUb1NlY29uZHMuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIG1pbnV0ZXNUb1NlY29uZHNfZGVmYXVsdCA9IG1pbnV0ZXNUb1NlY29uZHM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbW9udGhzVG9RdWFydGVycy5qcwpmdW5jdGlvbiBtb250aHNUb1F1YXJ0ZXJzKG1vbnRoczIpIHsKICBjb25zdCBxdWFydGVycyA9IG1vbnRoczIgLyBtb250aHNJblF1YXJ0ZXI7CiAgcmV0dXJuIE1hdGgudHJ1bmMocXVhcnRlcnMpOwp9CnZhciBtb250aHNUb1F1YXJ0ZXJzX2RlZmF1bHQ7CnZhciBpbml0X21vbnRoc1RvUXVhcnRlcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbW9udGhzVG9RdWFydGVycy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgbW9udGhzVG9RdWFydGVyc19kZWZhdWx0ID0gbW9udGhzVG9RdWFydGVyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9tb250aHNUb1llYXJzLmpzCmZ1bmN0aW9uIG1vbnRoc1RvWWVhcnMobW9udGhzMikgewogIGNvbnN0IHllYXJzID0gbW9udGhzMiAvIG1vbnRoc0luWWVhcjsKICByZXR1cm4gTWF0aC50cnVuYyh5ZWFycyk7Cn0KdmFyIG1vbnRoc1RvWWVhcnNfZGVmYXVsdDsKdmFyIGluaXRfbW9udGhzVG9ZZWFycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9tb250aHNUb1llYXJzLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzKCk7CiAgICBtb250aHNUb1llYXJzX2RlZmF1bHQgPSBtb250aHNUb1llYXJzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHREYXkuanMKZnVuY3Rpb24gbmV4dERheShkYXRlLCBkYXksIG9wdGlvbnMpIHsKICBsZXQgZGVsdGEgPSBkYXkgLSBnZXREYXkoZGF0ZSwgb3B0aW9ucyk7CiAgaWYgKGRlbHRhIDw9IDApIGRlbHRhICs9IDc7CiAgcmV0dXJuIGFkZERheXMoZGF0ZSwgZGVsdGEsIG9wdGlvbnMpOwp9CnZhciBuZXh0RGF5X2RlZmF1bHQ7CnZhciBpbml0X25leHREYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dERheS5qcyIoKSB7CiAgICBpbml0X2FkZERheXMoKTsKICAgIGluaXRfZ2V0RGF5KCk7CiAgICBuZXh0RGF5X2RlZmF1bHQgPSBuZXh0RGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHRGcmlkYXkuanMKZnVuY3Rpb24gbmV4dEZyaWRheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIG5leHREYXkoZGF0ZSwgNSwgb3B0aW9ucyk7Cn0KdmFyIG5leHRGcmlkYXlfZGVmYXVsdDsKdmFyIGluaXRfbmV4dEZyaWRheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9uZXh0RnJpZGF5LmpzIigpIHsKICAgIGluaXRfbmV4dERheSgpOwogICAgbmV4dEZyaWRheV9kZWZhdWx0ID0gbmV4dEZyaWRheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9uZXh0TW9uZGF5LmpzCmZ1bmN0aW9uIG5leHRNb25kYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBuZXh0RGF5KGRhdGUsIDEsIG9wdGlvbnMpOwp9CnZhciBuZXh0TW9uZGF5X2RlZmF1bHQ7CnZhciBpbml0X25leHRNb25kYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dE1vbmRheS5qcyIoKSB7CiAgICBpbml0X25leHREYXkoKTsKICAgIG5leHRNb25kYXlfZGVmYXVsdCA9IG5leHRNb25kYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dFNhdHVyZGF5LmpzCmZ1bmN0aW9uIG5leHRTYXR1cmRheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIG5leHREYXkoZGF0ZSwgNiwgb3B0aW9ucyk7Cn0KdmFyIG5leHRTYXR1cmRheV9kZWZhdWx0Owp2YXIgaW5pdF9uZXh0U2F0dXJkYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dFNhdHVyZGF5LmpzIigpIHsKICAgIGluaXRfbmV4dERheSgpOwogICAgbmV4dFNhdHVyZGF5X2RlZmF1bHQgPSBuZXh0U2F0dXJkYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dFN1bmRheS5qcwpmdW5jdGlvbiBuZXh0U3VuZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gbmV4dERheShkYXRlLCAwLCBvcHRpb25zKTsKfQp2YXIgbmV4dFN1bmRheV9kZWZhdWx0Owp2YXIgaW5pdF9uZXh0U3VuZGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHRTdW5kYXkuanMiKCkgewogICAgaW5pdF9uZXh0RGF5KCk7CiAgICBuZXh0U3VuZGF5X2RlZmF1bHQgPSBuZXh0U3VuZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHRUaHVyc2RheS5qcwpmdW5jdGlvbiBuZXh0VGh1cnNkYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBuZXh0RGF5KGRhdGUsIDQsIG9wdGlvbnMpOwp9CnZhciBuZXh0VGh1cnNkYXlfZGVmYXVsdDsKdmFyIGluaXRfbmV4dFRodXJzZGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHRUaHVyc2RheS5qcyIoKSB7CiAgICBpbml0X25leHREYXkoKTsKICAgIG5leHRUaHVyc2RheV9kZWZhdWx0ID0gbmV4dFRodXJzZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHRUdWVzZGF5LmpzCmZ1bmN0aW9uIG5leHRUdWVzZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gbmV4dERheShkYXRlLCAyLCBvcHRpb25zKTsKfQp2YXIgbmV4dFR1ZXNkYXlfZGVmYXVsdDsKdmFyIGluaXRfbmV4dFR1ZXNkYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dFR1ZXNkYXkuanMiKCkgewogICAgaW5pdF9uZXh0RGF5KCk7CiAgICBuZXh0VHVlc2RheV9kZWZhdWx0ID0gbmV4dFR1ZXNkYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dFdlZG5lc2RheS5qcwpmdW5jdGlvbiBuZXh0V2VkbmVzZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gbmV4dERheShkYXRlLCAzLCBvcHRpb25zKTsKfQp2YXIgbmV4dFdlZG5lc2RheV9kZWZhdWx0Owp2YXIgaW5pdF9uZXh0V2VkbmVzZGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHRXZWRuZXNkYXkuanMiKCkgewogICAgaW5pdF9uZXh0RGF5KCk7CiAgICBuZXh0V2VkbmVzZGF5X2RlZmF1bHQgPSBuZXh0V2VkbmVzZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlSVNPLmpzCmZ1bmN0aW9uIHBhcnNlSVNPKGFyZ3VtZW50LCBvcHRpb25zKSB7CiAgY29uc3QgaW52YWxpZERhdGUgPSAoKSA9PiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluLCBOYU4pOwogIGNvbnN0IGFkZGl0aW9uYWxEaWdpdHMgPSBvcHRpb25zPy5hZGRpdGlvbmFsRGlnaXRzID8/IDI7CiAgY29uc3QgZGF0ZVN0cmluZ3MgPSBzcGxpdERhdGVTdHJpbmcoYXJndW1lbnQpOwogIGxldCBkYXRlOwogIGlmIChkYXRlU3RyaW5ncy5kYXRlKSB7CiAgICBjb25zdCBwYXJzZVllYXJSZXN1bHQgPSBwYXJzZVllYXIoZGF0ZVN0cmluZ3MuZGF0ZSwgYWRkaXRpb25hbERpZ2l0cyk7CiAgICBkYXRlID0gcGFyc2VEYXRlKHBhcnNlWWVhclJlc3VsdC5yZXN0RGF0ZVN0cmluZywgcGFyc2VZZWFyUmVzdWx0LnllYXIpOwogIH0KICBpZiAoIWRhdGUgfHwgaXNOYU4oK2RhdGUpKSByZXR1cm4gaW52YWxpZERhdGUoKTsKICBjb25zdCB0aW1lc3RhbXAyID0gK2RhdGU7CiAgbGV0IHRpbWUgPSAwOwogIGxldCBvZmZzZXQ7CiAgaWYgKGRhdGVTdHJpbmdzLnRpbWUpIHsKICAgIHRpbWUgPSBwYXJzZVRpbWUoZGF0ZVN0cmluZ3MudGltZSk7CiAgICBpZiAoaXNOYU4odGltZSkpIHJldHVybiBpbnZhbGlkRGF0ZSgpOwogIH0KICBpZiAoZGF0ZVN0cmluZ3MudGltZXpvbmUpIHsKICAgIG9mZnNldCA9IHBhcnNlVGltZXpvbmUoZGF0ZVN0cmluZ3MudGltZXpvbmUpOwogICAgaWYgKGlzTmFOKG9mZnNldCkpIHJldHVybiBpbnZhbGlkRGF0ZSgpOwogIH0gZWxzZSB7CiAgICBjb25zdCB0bXBEYXRlID0gbmV3IERhdGUodGltZXN0YW1wMiArIHRpbWUpOwogICAgY29uc3QgcmVzdWx0ID0gdG9EYXRlKDAsIG9wdGlvbnM/LmluKTsKICAgIHJlc3VsdC5zZXRGdWxsWWVhcigKICAgICAgdG1wRGF0ZS5nZXRVVENGdWxsWWVhcigpLAogICAgICB0bXBEYXRlLmdldFVUQ01vbnRoKCksCiAgICAgIHRtcERhdGUuZ2V0VVRDRGF0ZSgpCiAgICApOwogICAgcmVzdWx0LnNldEhvdXJzKAogICAgICB0bXBEYXRlLmdldFVUQ0hvdXJzKCksCiAgICAgIHRtcERhdGUuZ2V0VVRDTWludXRlcygpLAogICAgICB0bXBEYXRlLmdldFVUQ1NlY29uZHMoKSwKICAgICAgdG1wRGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKQogICAgKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIHJldHVybiB0b0RhdGUodGltZXN0YW1wMiArIHRpbWUgKyBvZmZzZXQsIG9wdGlvbnM/LmluKTsKfQpmdW5jdGlvbiBzcGxpdERhdGVTdHJpbmcoZGF0ZVN0cmluZykgewogIGNvbnN0IGRhdGVTdHJpbmdzID0ge307CiAgY29uc3QgYXJyYXkgPSBkYXRlU3RyaW5nLnNwbGl0KHBhdHRlcm5zLmRhdGVUaW1lRGVsaW1pdGVyKTsKICBsZXQgdGltZVN0cmluZzsKICBpZiAoYXJyYXkubGVuZ3RoID4gMikgewogICAgcmV0dXJuIGRhdGVTdHJpbmdzOwogIH0KICBpZiAoLzovLnRlc3QoYXJyYXlbMF0pKSB7CiAgICB0aW1lU3RyaW5nID0gYXJyYXlbMF07CiAgfSBlbHNlIHsKICAgIGRhdGVTdHJpbmdzLmRhdGUgPSBhcnJheVswXTsKICAgIHRpbWVTdHJpbmcgPSBhcnJheVsxXTsKICAgIGlmIChwYXR0ZXJucy50aW1lWm9uZURlbGltaXRlci50ZXN0KGRhdGVTdHJpbmdzLmRhdGUpKSB7CiAgICAgIGRhdGVTdHJpbmdzLmRhdGUgPSBkYXRlU3RyaW5nLnNwbGl0KHBhdHRlcm5zLnRpbWVab25lRGVsaW1pdGVyKVswXTsKICAgICAgdGltZVN0cmluZyA9IGRhdGVTdHJpbmcuc3Vic3RyKAogICAgICAgIGRhdGVTdHJpbmdzLmRhdGUubGVuZ3RoLAogICAgICAgIGRhdGVTdHJpbmcubGVuZ3RoCiAgICAgICk7CiAgICB9CiAgfQogIGlmICh0aW1lU3RyaW5nKSB7CiAgICBjb25zdCB0b2tlbiA9IHBhdHRlcm5zLnRpbWV6b25lLmV4ZWModGltZVN0cmluZyk7CiAgICBpZiAodG9rZW4pIHsKICAgICAgZGF0ZVN0cmluZ3MudGltZSA9IHRpbWVTdHJpbmcucmVwbGFjZSh0b2tlblsxXSwgIiIpOwogICAgICBkYXRlU3RyaW5ncy50aW1lem9uZSA9IHRva2VuWzFdOwogICAgfSBlbHNlIHsKICAgICAgZGF0ZVN0cmluZ3MudGltZSA9IHRpbWVTdHJpbmc7CiAgICB9CiAgfQogIHJldHVybiBkYXRlU3RyaW5nczsKfQpmdW5jdGlvbiBwYXJzZVllYXIoZGF0ZVN0cmluZywgYWRkaXRpb25hbERpZ2l0cykgewogIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCgKICAgICJeKD86KFxcZHs0fXxbKy1dXFxkeyIgKyAoNCArIGFkZGl0aW9uYWxEaWdpdHMpICsgIn0pfChcXGR7Mn18WystXVxcZHsiICsgKDIgKyBhZGRpdGlvbmFsRGlnaXRzKSArICJ9KSQpIgogICk7CiAgY29uc3QgY2FwdHVyZXMgPSBkYXRlU3RyaW5nLm1hdGNoKHJlZ2V4KTsKICBpZiAoIWNhcHR1cmVzKSByZXR1cm4geyB5ZWFyOiBOYU4sIHJlc3REYXRlU3RyaW5nOiAiIiB9OwogIGNvbnN0IHllYXIgPSBjYXB0dXJlc1sxXSA/IHBhcnNlSW50KGNhcHR1cmVzWzFdKSA6IG51bGw7CiAgY29uc3QgY2VudHVyeSA9IGNhcHR1cmVzWzJdID8gcGFyc2VJbnQoY2FwdHVyZXNbMl0pIDogbnVsbDsKICByZXR1cm4gewogICAgeWVhcjogY2VudHVyeSA9PT0gbnVsbCA/IHllYXIgOiBjZW50dXJ5ICogMTAwLAogICAgcmVzdERhdGVTdHJpbmc6IGRhdGVTdHJpbmcuc2xpY2UoKGNhcHR1cmVzWzFdIHx8IGNhcHR1cmVzWzJdKS5sZW5ndGgpCiAgfTsKfQpmdW5jdGlvbiBwYXJzZURhdGUoZGF0ZVN0cmluZywgeWVhcikgewogIGlmICh5ZWFyID09PSBudWxsKSByZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKE5hTik7CiAgY29uc3QgY2FwdHVyZXMgPSBkYXRlU3RyaW5nLm1hdGNoKGRhdGVSZWdleCk7CiAgaWYgKCFjYXB0dXJlcykgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZShOYU4pOwogIGNvbnN0IGlzV2Vla0RhdGUgPSAhIWNhcHR1cmVzWzRdOwogIGNvbnN0IGRheU9mWWVhciA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbMV0pOwogIGNvbnN0IG1vbnRoID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1syXSkgLSAxOwogIGNvbnN0IGRheSA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbM10pOwogIGNvbnN0IHdlZWsgPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzRdKTsKICBjb25zdCBkYXlPZldlZWsgPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzVdKSAtIDE7CiAgaWYgKGlzV2Vla0RhdGUpIHsKICAgIGlmICghdmFsaWRhdGVXZWVrRGF0ZSh5ZWFyLCB3ZWVrLCBkYXlPZldlZWspKSB7CiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoTmFOKTsKICAgIH0KICAgIHJldHVybiBkYXlPZklTT1dlZWtZZWFyKHllYXIsIHdlZWssIGRheU9mV2Vlayk7CiAgfSBlbHNlIHsKICAgIGNvbnN0IGRhdGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoMCk7CiAgICBpZiAoIXZhbGlkYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF5KSB8fCAhdmFsaWRhdGVEYXlPZlllYXJEYXRlKHllYXIsIGRheU9mWWVhcikpIHsKICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZShOYU4pOwogICAgfQogICAgZGF0ZS5zZXRVVENGdWxsWWVhcih5ZWFyLCBtb250aCwgTWF0aC5tYXgoZGF5T2ZZZWFyLCBkYXkpKTsKICAgIHJldHVybiBkYXRlOwogIH0KfQpmdW5jdGlvbiBwYXJzZURhdGVVbml0KHZhbHVlMikgewogIHJldHVybiB2YWx1ZTIgPyBwYXJzZUludCh2YWx1ZTIpIDogMTsKfQpmdW5jdGlvbiBwYXJzZVRpbWUodGltZVN0cmluZykgewogIGNvbnN0IGNhcHR1cmVzID0gdGltZVN0cmluZy5tYXRjaCh0aW1lUmVnZXgpOwogIGlmICghY2FwdHVyZXMpIHJldHVybiBOYU47CiAgY29uc3QgaG91cnMgPSBwYXJzZVRpbWVVbml0KGNhcHR1cmVzWzFdKTsKICBjb25zdCBtaW51dGVzID0gcGFyc2VUaW1lVW5pdChjYXB0dXJlc1syXSk7CiAgY29uc3Qgc2Vjb25kcyA9IHBhcnNlVGltZVVuaXQoY2FwdHVyZXNbM10pOwogIGlmICghdmFsaWRhdGVUaW1lKGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKSkgewogICAgcmV0dXJuIE5hTjsKICB9CiAgcmV0dXJuIGhvdXJzICogbWlsbGlzZWNvbmRzSW5Ib3VyICsgbWludXRlcyAqIG1pbGxpc2Vjb25kc0luTWludXRlICsgc2Vjb25kcyAqIDFlMzsKfQpmdW5jdGlvbiBwYXJzZVRpbWVVbml0KHZhbHVlMikgewogIHJldHVybiB2YWx1ZTIgJiYgcGFyc2VGbG9hdCh2YWx1ZTIucmVwbGFjZSgiLCIsICIuIikpIHx8IDA7Cn0KZnVuY3Rpb24gcGFyc2VUaW1lem9uZSh0aW1lem9uZVN0cmluZykgewogIGlmICh0aW1lem9uZVN0cmluZyA9PT0gIloiKSByZXR1cm4gMDsKICBjb25zdCBjYXB0dXJlcyA9IHRpbWV6b25lU3RyaW5nLm1hdGNoKHRpbWV6b25lUmVnZXgpOwogIGlmICghY2FwdHVyZXMpIHJldHVybiAwOwogIGNvbnN0IHNpZ24gPSBjYXB0dXJlc1sxXSA9PT0gIisiID8gLTEgOiAxOwogIGNvbnN0IGhvdXJzID0gcGFyc2VJbnQoY2FwdHVyZXNbMl0pOwogIGNvbnN0IG1pbnV0ZXMgPSBjYXB0dXJlc1szXSAmJiBwYXJzZUludChjYXB0dXJlc1szXSkgfHwgMDsKICBpZiAoIXZhbGlkYXRlVGltZXpvbmUoaG91cnMsIG1pbnV0ZXMpKSB7CiAgICByZXR1cm4gTmFOOwogIH0KICByZXR1cm4gc2lnbiAqIChob3VycyAqIG1pbGxpc2Vjb25kc0luSG91ciArIG1pbnV0ZXMgKiBtaWxsaXNlY29uZHNJbk1pbnV0ZSk7Cn0KZnVuY3Rpb24gZGF5T2ZJU09XZWVrWWVhcihpc29XZWVrWWVhciwgd2VlaywgZGF5KSB7CiAgY29uc3QgZGF0ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgwKTsKICBkYXRlLnNldFVUQ0Z1bGxZZWFyKGlzb1dlZWtZZWFyLCAwLCA0KTsKICBjb25zdCBmb3VydGhPZkphbnVhcnlEYXkgPSBkYXRlLmdldFVUQ0RheSgpIHx8IDc7CiAgY29uc3QgZGlmZiA9ICh3ZWVrIC0gMSkgKiA3ICsgZGF5ICsgMSAtIGZvdXJ0aE9mSmFudWFyeURheTsKICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBkaWZmKTsKICByZXR1cm4gZGF0ZTsKfQpmdW5jdGlvbiBpc0xlYXBZZWFySW5kZXgyKHllYXIpIHsKICByZXR1cm4geWVhciAlIDQwMCA9PT0gMCB8fCB5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwOwp9CmZ1bmN0aW9uIHZhbGlkYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSkgewogIHJldHVybiBtb250aCA+PSAwICYmIG1vbnRoIDw9IDExICYmIGRhdGUgPj0gMSAmJiBkYXRlIDw9IChkYXlzSW5Nb250aHNbbW9udGhdIHx8IChpc0xlYXBZZWFySW5kZXgyKHllYXIpID8gMjkgOiAyOCkpOwp9CmZ1bmN0aW9uIHZhbGlkYXRlRGF5T2ZZZWFyRGF0ZSh5ZWFyLCBkYXlPZlllYXIpIHsKICByZXR1cm4gZGF5T2ZZZWFyID49IDEgJiYgZGF5T2ZZZWFyIDw9IChpc0xlYXBZZWFySW5kZXgyKHllYXIpID8gMzY2IDogMzY1KTsKfQpmdW5jdGlvbiB2YWxpZGF0ZVdlZWtEYXRlKF95ZWFyLCB3ZWVrLCBkYXkpIHsKICByZXR1cm4gd2VlayA+PSAxICYmIHdlZWsgPD0gNTMgJiYgZGF5ID49IDAgJiYgZGF5IDw9IDY7Cn0KZnVuY3Rpb24gdmFsaWRhdGVUaW1lKGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKSB7CiAgaWYgKGhvdXJzID09PSAyNCkgewogICAgcmV0dXJuIG1pbnV0ZXMgPT09IDAgJiYgc2Vjb25kcyA9PT0gMDsKICB9CiAgcmV0dXJuIHNlY29uZHMgPj0gMCAmJiBzZWNvbmRzIDwgNjAgJiYgbWludXRlcyA+PSAwICYmIG1pbnV0ZXMgPCA2MCAmJiBob3VycyA+PSAwICYmIGhvdXJzIDwgMjU7Cn0KZnVuY3Rpb24gdmFsaWRhdGVUaW1lem9uZShfaG91cnMsIG1pbnV0ZXMpIHsKICByZXR1cm4gbWludXRlcyA+PSAwICYmIG1pbnV0ZXMgPD0gNTk7Cn0KdmFyIHBhdHRlcm5zLCBkYXRlUmVnZXgsIHRpbWVSZWdleCwgdGltZXpvbmVSZWdleCwgZGF5c0luTW9udGhzLCBwYXJzZUlTT19kZWZhdWx0Owp2YXIgaW5pdF9wYXJzZUlTTyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZUlTTy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgcGF0dGVybnMgPSB7CiAgICAgIGRhdGVUaW1lRGVsaW1pdGVyOiAvW1QgXS8sCiAgICAgIHRpbWVab25lRGVsaW1pdGVyOiAvW1ogXS9pLAogICAgICB0aW1lem9uZTogLyhbWistXS4qKSQvCiAgICB9OwogICAgZGF0ZVJlZ2V4ID0gL14tPyg/OihcZHszfSl8KFxkezJ9KSg/Oi0/KFxkezJ9KSk/fFcoXGR7Mn0pKD86LT8oXGR7MX0pKT98KSQvOwogICAgdGltZVJlZ2V4ID0gL14oXGR7Mn0oPzpbLixdXGQqKT8pKD86Oj8oXGR7Mn0oPzpbLixdXGQqKT8pKT8oPzo6PyhcZHsyfSg/OlsuLF1cZCopPykpPyQvOwogICAgdGltZXpvbmVSZWdleCA9IC9eKFsrLV0pKFxkezJ9KSg/Ojo/KFxkezJ9KSk/JC87CiAgICBkYXlzSW5Nb250aHMgPSBbMzEsIG51bGwsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTsKICAgIHBhcnNlSVNPX2RlZmF1bHQgPSBwYXJzZUlTTzsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZUpTT04uanMKZnVuY3Rpb24gcGFyc2VKU09OKGRhdGVTdHIsIG9wdGlvbnMpIHsKICBjb25zdCBwYXJ0cyA9IGRhdGVTdHIubWF0Y2goCiAgICAvKFxkezR9KS0oXGR7Mn0pLShcZHsyfSlbVCBdKFxkezJ9KTooXGR7Mn0pOihcZHsyfSkoPzpcLihcZHswLDd9KSk/KD86WnwoLikoXGR7Mn0pOj8oXGR7Mn0pPyk/LwogICk7CiAgaWYgKCFwYXJ0cykgcmV0dXJuIHRvRGF0ZShOYU4sIG9wdGlvbnM/LmluKTsKICByZXR1cm4gdG9EYXRlKAogICAgRGF0ZS5VVEMoCiAgICAgICtwYXJ0c1sxXSwKICAgICAgK3BhcnRzWzJdIC0gMSwKICAgICAgK3BhcnRzWzNdLAogICAgICArcGFydHNbNF0gLSAoK3BhcnRzWzldIHx8IDApICogKHBhcnRzWzhdID09ICItIiA/IC0xIDogMSksCiAgICAgICtwYXJ0c1s1XSAtICgrcGFydHNbMTBdIHx8IDApICogKHBhcnRzWzhdID09ICItIiA/IC0xIDogMSksCiAgICAgICtwYXJ0c1s2XSwKICAgICAgKygocGFydHNbN10gfHwgIjAiKSArICIwMCIpLnN1YnN0cmluZygwLCAzKQogICAgKSwKICAgIG9wdGlvbnM/LmluCiAgKTsKfQp2YXIgcGFyc2VKU09OX2RlZmF1bHQ7CnZhciBpbml0X3BhcnNlSlNPTiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZUpTT04uanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIHBhcnNlSlNPTl9kZWZhdWx0ID0gcGFyc2VKU09OOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzRGF5LmpzCmZ1bmN0aW9uIHByZXZpb3VzRGF5KGRhdGUsIGRheSwgb3B0aW9ucykgewogIGxldCBkZWx0YSA9IGdldERheShkYXRlLCBvcHRpb25zKSAtIGRheTsKICBpZiAoZGVsdGEgPD0gMCkgZGVsdGEgKz0gNzsKICByZXR1cm4gc3ViRGF5cyhkYXRlLCBkZWx0YSwgb3B0aW9ucyk7Cn0KdmFyIHByZXZpb3VzRGF5X2RlZmF1bHQ7CnZhciBpbml0X3ByZXZpb3VzRGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzRGF5LmpzIigpIHsKICAgIGluaXRfZ2V0RGF5KCk7CiAgICBpbml0X3N1YkRheXMoKTsKICAgIHByZXZpb3VzRGF5X2RlZmF1bHQgPSBwcmV2aW91c0RheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wcmV2aW91c0ZyaWRheS5qcwpmdW5jdGlvbiBwcmV2aW91c0ZyaWRheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHByZXZpb3VzRGF5KGRhdGUsIDUsIG9wdGlvbnMpOwp9CnZhciBwcmV2aW91c0ZyaWRheV9kZWZhdWx0Owp2YXIgaW5pdF9wcmV2aW91c0ZyaWRheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wcmV2aW91c0ZyaWRheS5qcyIoKSB7CiAgICBpbml0X3ByZXZpb3VzRGF5KCk7CiAgICBwcmV2aW91c0ZyaWRheV9kZWZhdWx0ID0gcHJldmlvdXNGcmlkYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcHJldmlvdXNNb25kYXkuanMKZnVuY3Rpb24gcHJldmlvdXNNb25kYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBwcmV2aW91c0RheShkYXRlLCAxLCBvcHRpb25zKTsKfQp2YXIgcHJldmlvdXNNb25kYXlfZGVmYXVsdDsKdmFyIGluaXRfcHJldmlvdXNNb25kYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcHJldmlvdXNNb25kYXkuanMiKCkgewogICAgaW5pdF9wcmV2aW91c0RheSgpOwogICAgcHJldmlvdXNNb25kYXlfZGVmYXVsdCA9IHByZXZpb3VzTW9uZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzU2F0dXJkYXkuanMKZnVuY3Rpb24gcHJldmlvdXNTYXR1cmRheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHByZXZpb3VzRGF5KGRhdGUsIDYsIG9wdGlvbnMpOwp9CnZhciBwcmV2aW91c1NhdHVyZGF5X2RlZmF1bHQ7CnZhciBpbml0X3ByZXZpb3VzU2F0dXJkYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcHJldmlvdXNTYXR1cmRheS5qcyIoKSB7CiAgICBpbml0X3ByZXZpb3VzRGF5KCk7CiAgICBwcmV2aW91c1NhdHVyZGF5X2RlZmF1bHQgPSBwcmV2aW91c1NhdHVyZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzU3VuZGF5LmpzCmZ1bmN0aW9uIHByZXZpb3VzU3VuZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gcHJldmlvdXNEYXkoZGF0ZSwgMCwgb3B0aW9ucyk7Cn0KdmFyIHByZXZpb3VzU3VuZGF5X2RlZmF1bHQ7CnZhciBpbml0X3ByZXZpb3VzU3VuZGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzU3VuZGF5LmpzIigpIHsKICAgIGluaXRfcHJldmlvdXNEYXkoKTsKICAgIHByZXZpb3VzU3VuZGF5X2RlZmF1bHQgPSBwcmV2aW91c1N1bmRheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wcmV2aW91c1RodXJzZGF5LmpzCmZ1bmN0aW9uIHByZXZpb3VzVGh1cnNkYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBwcmV2aW91c0RheShkYXRlLCA0LCBvcHRpb25zKTsKfQp2YXIgcHJldmlvdXNUaHVyc2RheV9kZWZhdWx0Owp2YXIgaW5pdF9wcmV2aW91c1RodXJzZGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzVGh1cnNkYXkuanMiKCkgewogICAgaW5pdF9wcmV2aW91c0RheSgpOwogICAgcHJldmlvdXNUaHVyc2RheV9kZWZhdWx0ID0gcHJldmlvdXNUaHVyc2RheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wcmV2aW91c1R1ZXNkYXkuanMKZnVuY3Rpb24gcHJldmlvdXNUdWVzZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gcHJldmlvdXNEYXkoZGF0ZSwgMiwgb3B0aW9ucyk7Cn0KdmFyIHByZXZpb3VzVHVlc2RheV9kZWZhdWx0Owp2YXIgaW5pdF9wcmV2aW91c1R1ZXNkYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcHJldmlvdXNUdWVzZGF5LmpzIigpIHsKICAgIGluaXRfcHJldmlvdXNEYXkoKTsKICAgIHByZXZpb3VzVHVlc2RheV9kZWZhdWx0ID0gcHJldmlvdXNUdWVzZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzV2VkbmVzZGF5LmpzCmZ1bmN0aW9uIHByZXZpb3VzV2VkbmVzZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gcHJldmlvdXNEYXkoZGF0ZSwgMywgb3B0aW9ucyk7Cn0KdmFyIHByZXZpb3VzV2VkbmVzZGF5X2RlZmF1bHQ7CnZhciBpbml0X3ByZXZpb3VzV2VkbmVzZGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzV2VkbmVzZGF5LmpzIigpIHsKICAgIGluaXRfcHJldmlvdXNEYXkoKTsKICAgIHByZXZpb3VzV2VkbmVzZGF5X2RlZmF1bHQgPSBwcmV2aW91c1dlZG5lc2RheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9xdWFydGVyc1RvTW9udGhzLmpzCmZ1bmN0aW9uIHF1YXJ0ZXJzVG9Nb250aHMocXVhcnRlcnMpIHsKICByZXR1cm4gTWF0aC50cnVuYyhxdWFydGVycyAqIG1vbnRoc0luUXVhcnRlcik7Cn0KdmFyIHF1YXJ0ZXJzVG9Nb250aHNfZGVmYXVsdDsKdmFyIGluaXRfcXVhcnRlcnNUb01vbnRocyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9xdWFydGVyc1RvTW9udGhzLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzKCk7CiAgICBxdWFydGVyc1RvTW9udGhzX2RlZmF1bHQgPSBxdWFydGVyc1RvTW9udGhzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3F1YXJ0ZXJzVG9ZZWFycy5qcwpmdW5jdGlvbiBxdWFydGVyc1RvWWVhcnMocXVhcnRlcnMpIHsKICBjb25zdCB5ZWFycyA9IHF1YXJ0ZXJzIC8gcXVhcnRlcnNJblllYXI7CiAgcmV0dXJuIE1hdGgudHJ1bmMoeWVhcnMpOwp9CnZhciBxdWFydGVyc1RvWWVhcnNfZGVmYXVsdDsKdmFyIGluaXRfcXVhcnRlcnNUb1llYXJzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3F1YXJ0ZXJzVG9ZZWFycy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgcXVhcnRlcnNUb1llYXJzX2RlZmF1bHQgPSBxdWFydGVyc1RvWWVhcnM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcm91bmRUb05lYXJlc3RIb3Vycy5qcwpmdW5jdGlvbiByb3VuZFRvTmVhcmVzdEhvdXJzKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBuZWFyZXN0VG8gPSBvcHRpb25zPy5uZWFyZXN0VG8gPz8gMTsKICBpZiAobmVhcmVzdFRvIDwgMSB8fCBuZWFyZXN0VG8gPiAxMikKICAgIHJldHVybiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIE5hTik7CiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGZyYWN0aW9uYWxNaW51dGVzID0gZGF0ZV8uZ2V0TWludXRlcygpIC8gNjA7CiAgY29uc3QgZnJhY3Rpb25hbFNlY29uZHMgPSBkYXRlXy5nZXRTZWNvbmRzKCkgLyA2MCAvIDYwOwogIGNvbnN0IGZyYWN0aW9uYWxNaWxsaXNlY29uZHMgPSBkYXRlXy5nZXRNaWxsaXNlY29uZHMoKSAvIDFlMyAvIDYwIC8gNjA7CiAgY29uc3QgaG91cnMgPSBkYXRlXy5nZXRIb3VycygpICsgZnJhY3Rpb25hbE1pbnV0ZXMgKyBmcmFjdGlvbmFsU2Vjb25kcyArIGZyYWN0aW9uYWxNaWxsaXNlY29uZHM7CiAgY29uc3QgbWV0aG9kID0gb3B0aW9ucz8ucm91bmRpbmdNZXRob2QgPz8gInJvdW5kIjsKICBjb25zdCByb3VuZGluZ01ldGhvZCA9IGdldFJvdW5kaW5nTWV0aG9kKG1ldGhvZCk7CiAgY29uc3Qgcm91bmRlZEhvdXJzID0gcm91bmRpbmdNZXRob2QoaG91cnMgLyBuZWFyZXN0VG8pICogbmVhcmVzdFRvOwogIGRhdGVfLnNldEhvdXJzKHJvdW5kZWRIb3VycywgMCwgMCwgMCk7CiAgcmV0dXJuIGRhdGVfOwp9CnZhciByb3VuZFRvTmVhcmVzdEhvdXJzX2RlZmF1bHQ7CnZhciBpbml0X3JvdW5kVG9OZWFyZXN0SG91cnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcm91bmRUb05lYXJlc3RIb3Vycy5qcyIoKSB7CiAgICBpbml0X2dldFJvdW5kaW5nTWV0aG9kKCk7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICByb3VuZFRvTmVhcmVzdEhvdXJzX2RlZmF1bHQgPSByb3VuZFRvTmVhcmVzdEhvdXJzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3JvdW5kVG9OZWFyZXN0TWludXRlcy5qcwpmdW5jdGlvbiByb3VuZFRvTmVhcmVzdE1pbnV0ZXMoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IG5lYXJlc3RUbyA9IG9wdGlvbnM/Lm5lYXJlc3RUbyA/PyAxOwogIGlmIChuZWFyZXN0VG8gPCAxIHx8IG5lYXJlc3RUbyA+IDMwKSByZXR1cm4gY29uc3RydWN0RnJvbShkYXRlLCBOYU4pOwogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBmcmFjdGlvbmFsU2Vjb25kcyA9IGRhdGVfLmdldFNlY29uZHMoKSAvIDYwOwogIGNvbnN0IGZyYWN0aW9uYWxNaWxsaXNlY29uZHMgPSBkYXRlXy5nZXRNaWxsaXNlY29uZHMoKSAvIDFlMyAvIDYwOwogIGNvbnN0IG1pbnV0ZXMgPSBkYXRlXy5nZXRNaW51dGVzKCkgKyBmcmFjdGlvbmFsU2Vjb25kcyArIGZyYWN0aW9uYWxNaWxsaXNlY29uZHM7CiAgY29uc3QgbWV0aG9kID0gb3B0aW9ucz8ucm91bmRpbmdNZXRob2QgPz8gInJvdW5kIjsKICBjb25zdCByb3VuZGluZ01ldGhvZCA9IGdldFJvdW5kaW5nTWV0aG9kKG1ldGhvZCk7CiAgY29uc3Qgcm91bmRlZE1pbnV0ZXMgPSByb3VuZGluZ01ldGhvZChtaW51dGVzIC8gbmVhcmVzdFRvKSAqIG5lYXJlc3RUbzsKICBkYXRlXy5zZXRNaW51dGVzKHJvdW5kZWRNaW51dGVzLCAwLCAwKTsKICByZXR1cm4gZGF0ZV87Cn0KdmFyIHJvdW5kVG9OZWFyZXN0TWludXRlc19kZWZhdWx0Owp2YXIgaW5pdF9yb3VuZFRvTmVhcmVzdE1pbnV0ZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcm91bmRUb05lYXJlc3RNaW51dGVzLmpzIigpIHsKICAgIGluaXRfZ2V0Um91bmRpbmdNZXRob2QoKTsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIHJvdW5kVG9OZWFyZXN0TWludXRlc19kZWZhdWx0ID0gcm91bmRUb05lYXJlc3RNaW51dGVzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NlY29uZHNUb0hvdXJzLmpzCmZ1bmN0aW9uIHNlY29uZHNUb0hvdXJzKHNlY29uZHMpIHsKICBjb25zdCBob3VycyA9IHNlY29uZHMgLyBzZWNvbmRzSW5Ib3VyOwogIHJldHVybiBNYXRoLnRydW5jKGhvdXJzKTsKfQp2YXIgc2Vjb25kc1RvSG91cnNfZGVmYXVsdDsKdmFyIGluaXRfc2Vjb25kc1RvSG91cnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2Vjb25kc1RvSG91cnMuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIHNlY29uZHNUb0hvdXJzX2RlZmF1bHQgPSBzZWNvbmRzVG9Ib3VyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZWNvbmRzVG9NaWxsaXNlY29uZHMuanMKZnVuY3Rpb24gc2Vjb25kc1RvTWlsbGlzZWNvbmRzKHNlY29uZHMpIHsKICByZXR1cm4gc2Vjb25kcyAqIG1pbGxpc2Vjb25kc0luU2Vjb25kOwp9CnZhciBzZWNvbmRzVG9NaWxsaXNlY29uZHNfZGVmYXVsdDsKdmFyIGluaXRfc2Vjb25kc1RvTWlsbGlzZWNvbmRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NlY29uZHNUb01pbGxpc2Vjb25kcy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgc2Vjb25kc1RvTWlsbGlzZWNvbmRzX2RlZmF1bHQgPSBzZWNvbmRzVG9NaWxsaXNlY29uZHM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2Vjb25kc1RvTWludXRlcy5qcwpmdW5jdGlvbiBzZWNvbmRzVG9NaW51dGVzKHNlY29uZHMpIHsKICBjb25zdCBtaW51dGVzID0gc2Vjb25kcyAvIHNlY29uZHNJbk1pbnV0ZTsKICByZXR1cm4gTWF0aC50cnVuYyhtaW51dGVzKTsKfQp2YXIgc2Vjb25kc1RvTWludXRlc19kZWZhdWx0Owp2YXIgaW5pdF9zZWNvbmRzVG9NaW51dGVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NlY29uZHNUb01pbnV0ZXMuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIHNlY29uZHNUb01pbnV0ZXNfZGVmYXVsdCA9IHNlY29uZHNUb01pbnV0ZXM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0TW9udGguanMKZnVuY3Rpb24gc2V0TW9udGgoZGF0ZSwgbW9udGgsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgZGF5ID0gX2RhdGUuZ2V0RGF0ZSgpOwogIGNvbnN0IG1pZE1vbnRoID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTsKICBtaWRNb250aC5zZXRGdWxsWWVhcih5ZWFyLCBtb250aCwgMTUpOwogIG1pZE1vbnRoLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIGNvbnN0IGRheXNJbk1vbnRoID0gZ2V0RGF5c0luTW9udGgobWlkTW9udGgpOwogIF9kYXRlLnNldE1vbnRoKG1vbnRoLCBNYXRoLm1pbihkYXksIGRheXNJbk1vbnRoKSk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBzZXRNb250aF9kZWZhdWx0Owp2YXIgaW5pdF9zZXRNb250aCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRNb250aC5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfZ2V0RGF5c0luTW9udGgoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzZXRNb250aF9kZWZhdWx0ID0gc2V0TW9udGg7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0LmpzCmZ1bmN0aW9uIHNldChkYXRlLCB2YWx1ZXMsIG9wdGlvbnMpIHsKICBsZXQgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGlmIChpc05hTigrX2RhdGUpKSByZXR1cm4gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBOYU4pOwogIGlmICh2YWx1ZXMueWVhciAhPSBudWxsKSBfZGF0ZS5zZXRGdWxsWWVhcih2YWx1ZXMueWVhcik7CiAgaWYgKHZhbHVlcy5tb250aCAhPSBudWxsKSBfZGF0ZSA9IHNldE1vbnRoKF9kYXRlLCB2YWx1ZXMubW9udGgpOwogIGlmICh2YWx1ZXMuZGF0ZSAhPSBudWxsKSBfZGF0ZS5zZXREYXRlKHZhbHVlcy5kYXRlKTsKICBpZiAodmFsdWVzLmhvdXJzICE9IG51bGwpIF9kYXRlLnNldEhvdXJzKHZhbHVlcy5ob3Vycyk7CiAgaWYgKHZhbHVlcy5taW51dGVzICE9IG51bGwpIF9kYXRlLnNldE1pbnV0ZXModmFsdWVzLm1pbnV0ZXMpOwogIGlmICh2YWx1ZXMuc2Vjb25kcyAhPSBudWxsKSBfZGF0ZS5zZXRTZWNvbmRzKHZhbHVlcy5zZWNvbmRzKTsKICBpZiAodmFsdWVzLm1pbGxpc2Vjb25kcyAhPSBudWxsKSBfZGF0ZS5zZXRNaWxsaXNlY29uZHModmFsdWVzLm1pbGxpc2Vjb25kcyk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBzZXRfZGVmYXVsdDsKdmFyIGluaXRfc2V0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldC5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfc2V0TW9udGgoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzZXRfZGVmYXVsdCA9IHNldDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXREYXRlLmpzCmZ1bmN0aW9uIHNldERhdGUoZGF0ZSwgZGF5T2ZNb250aCwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXREYXRlKGRheU9mTW9udGgpOwogIHJldHVybiBfZGF0ZTsKfQp2YXIgc2V0RGF0ZV9kZWZhdWx0Owp2YXIgaW5pdF9zZXREYXRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldERhdGUuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIHNldERhdGVfZGVmYXVsdCA9IHNldERhdGU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0RGF5T2ZZZWFyLmpzCmZ1bmN0aW9uIHNldERheU9mWWVhcihkYXRlLCBkYXlPZlllYXIsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgZGF0ZV8uc2V0TW9udGgoMCk7CiAgZGF0ZV8uc2V0RGF0ZShkYXlPZlllYXIpOwogIHJldHVybiBkYXRlXzsKfQp2YXIgc2V0RGF5T2ZZZWFyX2RlZmF1bHQ7CnZhciBpbml0X3NldERheU9mWWVhciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXREYXlPZlllYXIuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIHNldERheU9mWWVhcl9kZWZhdWx0ID0gc2V0RGF5T2ZZZWFyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldERlZmF1bHRPcHRpb25zLmpzCmZ1bmN0aW9uIHNldERlZmF1bHRPcHRpb25zMihvcHRpb25zKSB7CiAgY29uc3QgcmVzdWx0ID0ge307CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBmb3IgKGNvbnN0IHByb3BlcnR5OSBpbiBkZWZhdWx0T3B0aW9uczIpIHsKICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVmYXVsdE9wdGlvbnMyLCBwcm9wZXJ0eTkpKSB7CiAgICAgIHJlc3VsdFtwcm9wZXJ0eTldID0gZGVmYXVsdE9wdGlvbnMyW3Byb3BlcnR5OV07CiAgICB9CiAgfQogIGZvciAoY29uc3QgcHJvcGVydHk5IGluIG9wdGlvbnMpIHsKICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgcHJvcGVydHk5KSkgewogICAgICBpZiAob3B0aW9uc1twcm9wZXJ0eTldID09PSB2b2lkIDApIHsKICAgICAgICBkZWxldGUgcmVzdWx0W3Byb3BlcnR5OV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0W3Byb3BlcnR5OV0gPSBvcHRpb25zW3Byb3BlcnR5OV07CiAgICAgIH0KICAgIH0KICB9CiAgc2V0RGVmYXVsdE9wdGlvbnMocmVzdWx0KTsKfQp2YXIgc2V0RGVmYXVsdE9wdGlvbnNfZGVmYXVsdDsKdmFyIGluaXRfc2V0RGVmYXVsdE9wdGlvbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0RGVmYXVsdE9wdGlvbnMuanMiKCkgewogICAgaW5pdF9kZWZhdWx0T3B0aW9ucygpOwogICAgc2V0RGVmYXVsdE9wdGlvbnNfZGVmYXVsdCA9IHNldERlZmF1bHRPcHRpb25zMjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRIb3Vycy5qcwpmdW5jdGlvbiBzZXRIb3VycyhkYXRlLCBob3Vycywgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRIb3Vycyhob3Vycyk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBzZXRIb3Vyc19kZWZhdWx0Owp2YXIgaW5pdF9zZXRIb3VycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRIb3Vycy5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgc2V0SG91cnNfZGVmYXVsdCA9IHNldEhvdXJzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldE1pbGxpc2Vjb25kcy5qcwpmdW5jdGlvbiBzZXRNaWxsaXNlY29uZHMoZGF0ZSwgbWlsbGlzZWNvbmRzMiwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRNaWxsaXNlY29uZHMobWlsbGlzZWNvbmRzMik7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBzZXRNaWxsaXNlY29uZHNfZGVmYXVsdDsKdmFyIGluaXRfc2V0TWlsbGlzZWNvbmRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldE1pbGxpc2Vjb25kcy5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgc2V0TWlsbGlzZWNvbmRzX2RlZmF1bHQgPSBzZXRNaWxsaXNlY29uZHM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0TWludXRlcy5qcwpmdW5jdGlvbiBzZXRNaW51dGVzKGRhdGUsIG1pbnV0ZXMsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgZGF0ZV8uc2V0TWludXRlcyhtaW51dGVzKTsKICByZXR1cm4gZGF0ZV87Cn0KdmFyIHNldE1pbnV0ZXNfZGVmYXVsdDsKdmFyIGluaXRfc2V0TWludXRlcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRNaW51dGVzLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzZXRNaW51dGVzX2RlZmF1bHQgPSBzZXRNaW51dGVzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldFF1YXJ0ZXIuanMKZnVuY3Rpb24gc2V0UXVhcnRlcihkYXRlLCBxdWFydGVyLCBvcHRpb25zKSB7CiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IG9sZFF1YXJ0ZXIgPSBNYXRoLnRydW5jKGRhdGVfLmdldE1vbnRoKCkgLyAzKSArIDE7CiAgY29uc3QgZGlmZiA9IHF1YXJ0ZXIgLSBvbGRRdWFydGVyOwogIHJldHVybiBzZXRNb250aChkYXRlXywgZGF0ZV8uZ2V0TW9udGgoKSArIGRpZmYgKiAzKTsKfQp2YXIgc2V0UXVhcnRlcl9kZWZhdWx0Owp2YXIgaW5pdF9zZXRRdWFydGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldFF1YXJ0ZXIuanMiKCkgewogICAgaW5pdF9zZXRNb250aCgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIHNldFF1YXJ0ZXJfZGVmYXVsdCA9IHNldFF1YXJ0ZXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0U2Vjb25kcy5qcwpmdW5jdGlvbiBzZXRTZWNvbmRzKGRhdGUsIHNlY29uZHMsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgX2RhdGUuc2V0U2Vjb25kcyhzZWNvbmRzKTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIHNldFNlY29uZHNfZGVmYXVsdDsKdmFyIGluaXRfc2V0U2Vjb25kcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRTZWNvbmRzLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzZXRTZWNvbmRzX2RlZmF1bHQgPSBzZXRTZWNvbmRzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldFdlZWtZZWFyLmpzCmZ1bmN0aW9uIHNldFdlZWtZZWFyKGRhdGUsIHdlZWtZZWFyLCBvcHRpb25zKSB7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCBmaXJzdFdlZWtDb250YWluc0RhdGUgPSBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gZGVmYXVsdE9wdGlvbnMyLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gMTsKICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKAogICAgdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKSwKICAgIHN0YXJ0T2ZXZWVrWWVhcihkYXRlLCBvcHRpb25zKSwKICAgIG9wdGlvbnMKICApOwogIGNvbnN0IGZpcnN0V2VlayA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgMCk7CiAgZmlyc3RXZWVrLnNldEZ1bGxZZWFyKHdlZWtZZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpOwogIGZpcnN0V2Vlay5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBjb25zdCBkYXRlXyA9IHN0YXJ0T2ZXZWVrWWVhcihmaXJzdFdlZWssIG9wdGlvbnMpOwogIGRhdGVfLnNldERhdGUoZGF0ZV8uZ2V0RGF0ZSgpICsgZGlmZik7CiAgcmV0dXJuIGRhdGVfOwp9CnZhciBzZXRXZWVrWWVhcl9kZWZhdWx0Owp2YXIgaW5pdF9zZXRXZWVrWWVhciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRXZWVrWWVhci5qcyIoKSB7CiAgICBpbml0X2RlZmF1bHRPcHRpb25zKCk7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKCk7CiAgICBpbml0X3N0YXJ0T2ZXZWVrWWVhcigpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIHNldFdlZWtZZWFyX2RlZmF1bHQgPSBzZXRXZWVrWWVhcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRZZWFyLmpzCmZ1bmN0aW9uIHNldFllYXIoZGF0ZSwgeWVhciwgb3B0aW9ucykgewogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBpZiAoaXNOYU4oK2RhdGVfKSkgcmV0dXJuIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgTmFOKTsKICBkYXRlXy5zZXRGdWxsWWVhcih5ZWFyKTsKICByZXR1cm4gZGF0ZV87Cn0KdmFyIHNldFllYXJfZGVmYXVsdDsKdmFyIGluaXRfc2V0WWVhciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRZZWFyLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIHNldFllYXJfZGVmYXVsdCA9IHNldFllYXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZkRlY2FkZS5qcwpmdW5jdGlvbiBzdGFydE9mRGVjYWRlKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgZGVjYWRlID0gTWF0aC5mbG9vcih5ZWFyIC8gMTApICogMTA7CiAgX2RhdGUuc2V0RnVsbFllYXIoZGVjYWRlLCAwLCAxKTsKICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIHN0YXJ0T2ZEZWNhZGVfZGVmYXVsdDsKdmFyIGluaXRfc3RhcnRPZkRlY2FkZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mRGVjYWRlLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzdGFydE9mRGVjYWRlX2RlZmF1bHQgPSBzdGFydE9mRGVjYWRlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZUb2RheS5qcwpmdW5jdGlvbiBzdGFydE9mVG9kYXkob3B0aW9ucykgewogIHJldHVybiBzdGFydE9mRGF5KERhdGUubm93KCksIG9wdGlvbnMpOwp9CnZhciBzdGFydE9mVG9kYXlfZGVmYXVsdDsKdmFyIGluaXRfc3RhcnRPZlRvZGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZUb2RheS5qcyIoKSB7CiAgICBpbml0X3N0YXJ0T2ZEYXkoKTsKICAgIHN0YXJ0T2ZUb2RheV9kZWZhdWx0ID0gc3RhcnRPZlRvZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZUb21vcnJvdy5qcwpmdW5jdGlvbiBzdGFydE9mVG9tb3Jyb3cob3B0aW9ucykgewogIGNvbnN0IG5vdzIgPSBjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4pOwogIGNvbnN0IHllYXIgPSBub3cyLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgbW9udGggPSBub3cyLmdldE1vbnRoKCk7CiAgY29uc3QgZGF5ID0gbm93Mi5nZXREYXRlKCk7CiAgY29uc3QgZGF0ZSA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4sIDApOwogIGRhdGUuc2V0RnVsbFllYXIoeWVhciwgbW9udGgsIGRheSArIDEpOwogIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgcmV0dXJuIGRhdGU7Cn0KdmFyIHN0YXJ0T2ZUb21vcnJvd19kZWZhdWx0Owp2YXIgaW5pdF9zdGFydE9mVG9tb3Jyb3cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZlRvbW9ycm93LmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF9jb25zdHJ1Y3ROb3coKTsKICAgIHN0YXJ0T2ZUb21vcnJvd19kZWZhdWx0ID0gc3RhcnRPZlRvbW9ycm93OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZZZXN0ZXJkYXkuanMKZnVuY3Rpb24gc3RhcnRPZlllc3RlcmRheShvcHRpb25zKSB7CiAgY29uc3Qgbm93MiA9IGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IG5vdzIuZ2V0RnVsbFllYXIoKTsKICBjb25zdCBtb250aCA9IG5vdzIuZ2V0TW9udGgoKTsKICBjb25zdCBkYXkgPSBub3cyLmdldERhdGUoKTsKICBjb25zdCBkYXRlID0gY29uc3RydWN0Tm93KG9wdGlvbnM/LmluKTsKICBkYXRlLnNldEZ1bGxZZWFyKHllYXIsIG1vbnRoLCBkYXkgLSAxKTsKICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiBkYXRlOwp9CnZhciBzdGFydE9mWWVzdGVyZGF5X2RlZmF1bHQ7CnZhciBpbml0X3N0YXJ0T2ZZZXN0ZXJkYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZlllc3RlcmRheS5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdE5vdygpOwogICAgc3RhcnRPZlllc3RlcmRheV9kZWZhdWx0ID0gc3RhcnRPZlllc3RlcmRheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJNb250aHMuanMKZnVuY3Rpb24gc3ViTW9udGhzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRNb250aHMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1Yk1vbnRoc19kZWZhdWx0Owp2YXIgaW5pdF9zdWJNb250aHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViTW9udGhzLmpzIigpIHsKICAgIGluaXRfYWRkTW9udGhzKCk7CiAgICBzdWJNb250aHNfZGVmYXVsdCA9IHN1Yk1vbnRoczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWIuanMKZnVuY3Rpb24gc3ViKGRhdGUsIGR1cmF0aW9uLCBvcHRpb25zKSB7CiAgY29uc3QgewogICAgeWVhcnMgPSAwLAogICAgbW9udGhzOiBtb250aHMyID0gMCwKICAgIHdlZWtzID0gMCwKICAgIGRheXM6IGRheXMyID0gMCwKICAgIGhvdXJzID0gMCwKICAgIG1pbnV0ZXMgPSAwLAogICAgc2Vjb25kcyA9IDAKICB9ID0gZHVyYXRpb247CiAgY29uc3Qgd2l0aG91dE1vbnRocyA9IHN1Yk1vbnRocyhkYXRlLCBtb250aHMyICsgeWVhcnMgKiAxMiwgb3B0aW9ucyk7CiAgY29uc3Qgd2l0aG91dERheXMgPSBzdWJEYXlzKHdpdGhvdXRNb250aHMsIGRheXMyICsgd2Vla3MgKiA3LCBvcHRpb25zKTsKICBjb25zdCBtaW51dGVzVG9TdWIgPSBtaW51dGVzICsgaG91cnMgKiA2MDsKICBjb25zdCBzZWNvbmRzVG9TdWIgPSBzZWNvbmRzICsgbWludXRlc1RvU3ViICogNjA7CiAgY29uc3QgbXNUb1N1YiA9IHNlY29uZHNUb1N1YiAqIDFlMzsKICByZXR1cm4gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCArd2l0aG91dERheXMgLSBtc1RvU3ViKTsKfQp2YXIgc3ViX2RlZmF1bHQ7CnZhciBpbml0X3N1YiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWIuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X3N1YkRheXMoKTsKICAgIGluaXRfc3ViTW9udGhzKCk7CiAgICBzdWJfZGVmYXVsdCA9IHN1YjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJCdXNpbmVzc0RheXMuanMKZnVuY3Rpb24gc3ViQnVzaW5lc3NEYXlzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRCdXNpbmVzc0RheXMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1YkJ1c2luZXNzRGF5c19kZWZhdWx0Owp2YXIgaW5pdF9zdWJCdXNpbmVzc0RheXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViQnVzaW5lc3NEYXlzLmpzIigpIHsKICAgIGluaXRfYWRkQnVzaW5lc3NEYXlzKCk7CiAgICBzdWJCdXNpbmVzc0RheXNfZGVmYXVsdCA9IHN1YkJ1c2luZXNzRGF5czsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJIb3Vycy5qcwpmdW5jdGlvbiBzdWJIb3VycyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkSG91cnMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1YkhvdXJzX2RlZmF1bHQ7CnZhciBpbml0X3N1YkhvdXJzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YkhvdXJzLmpzIigpIHsKICAgIGluaXRfYWRkSG91cnMoKTsKICAgIHN1YkhvdXJzX2RlZmF1bHQgPSBzdWJIb3VyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJNaWxsaXNlY29uZHMuanMKZnVuY3Rpb24gc3ViTWlsbGlzZWNvbmRzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRNaWxsaXNlY29uZHMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1Yk1pbGxpc2Vjb25kc19kZWZhdWx0Owp2YXIgaW5pdF9zdWJNaWxsaXNlY29uZHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViTWlsbGlzZWNvbmRzLmpzIigpIHsKICAgIGluaXRfYWRkTWlsbGlzZWNvbmRzKCk7CiAgICBzdWJNaWxsaXNlY29uZHNfZGVmYXVsdCA9IHN1Yk1pbGxpc2Vjb25kczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJNaW51dGVzLmpzCmZ1bmN0aW9uIHN1Yk1pbnV0ZXMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7CiAgcmV0dXJuIGFkZE1pbnV0ZXMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1Yk1pbnV0ZXNfZGVmYXVsdDsKdmFyIGluaXRfc3ViTWludXRlcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJNaW51dGVzLmpzIigpIHsKICAgIGluaXRfYWRkTWludXRlcygpOwogICAgc3ViTWludXRlc19kZWZhdWx0ID0gc3ViTWludXRlczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJRdWFydGVycy5qcwpmdW5jdGlvbiBzdWJRdWFydGVycyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkUXVhcnRlcnMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1YlF1YXJ0ZXJzX2RlZmF1bHQ7CnZhciBpbml0X3N1YlF1YXJ0ZXJzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YlF1YXJ0ZXJzLmpzIigpIHsKICAgIGluaXRfYWRkUXVhcnRlcnMoKTsKICAgIHN1YlF1YXJ0ZXJzX2RlZmF1bHQgPSBzdWJRdWFydGVyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJTZWNvbmRzLmpzCmZ1bmN0aW9uIHN1YlNlY29uZHMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7CiAgcmV0dXJuIGFkZFNlY29uZHMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1YlNlY29uZHNfZGVmYXVsdDsKdmFyIGluaXRfc3ViU2Vjb25kcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJTZWNvbmRzLmpzIigpIHsKICAgIGluaXRfYWRkU2Vjb25kcygpOwogICAgc3ViU2Vjb25kc19kZWZhdWx0ID0gc3ViU2Vjb25kczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJXZWVrcy5qcwpmdW5jdGlvbiBzdWJXZWVrcyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkV2Vla3MoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1YldlZWtzX2RlZmF1bHQ7CnZhciBpbml0X3N1YldlZWtzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YldlZWtzLmpzIigpIHsKICAgIGluaXRfYWRkV2Vla3MoKTsKICAgIHN1YldlZWtzX2RlZmF1bHQgPSBzdWJXZWVrczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJZZWFycy5qcwpmdW5jdGlvbiBzdWJZZWFycyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkWWVhcnMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1YlllYXJzX2RlZmF1bHQ7CnZhciBpbml0X3N1YlllYXJzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YlllYXJzLmpzIigpIHsKICAgIGluaXRfYWRkWWVhcnMoKTsKICAgIHN1YlllYXJzX2RlZmF1bHQgPSBzdWJZZWFyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy93ZWVrc1RvRGF5cy5qcwpmdW5jdGlvbiB3ZWVrc1RvRGF5cyh3ZWVrcykgewogIHJldHVybiBNYXRoLnRydW5jKHdlZWtzICogZGF5c0luV2Vlayk7Cn0KdmFyIHdlZWtzVG9EYXlzX2RlZmF1bHQ7CnZhciBpbml0X3dlZWtzVG9EYXlzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3dlZWtzVG9EYXlzLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzKCk7CiAgICB3ZWVrc1RvRGF5c19kZWZhdWx0ID0gd2Vla3NUb0RheXM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMveWVhcnNUb0RheXMuanMKZnVuY3Rpb24geWVhcnNUb0RheXMoeWVhcnMpIHsKICByZXR1cm4gTWF0aC50cnVuYyh5ZWFycyAqIGRheXNJblllYXIpOwp9CnZhciB5ZWFyc1RvRGF5c19kZWZhdWx0Owp2YXIgaW5pdF95ZWFyc1RvRGF5cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy95ZWFyc1RvRGF5cy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgeWVhcnNUb0RheXNfZGVmYXVsdCA9IHllYXJzVG9EYXlzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3llYXJzVG9Nb250aHMuanMKZnVuY3Rpb24geWVhcnNUb01vbnRocyh5ZWFycykgewogIHJldHVybiBNYXRoLnRydW5jKHllYXJzICogbW9udGhzSW5ZZWFyKTsKfQp2YXIgeWVhcnNUb01vbnRoc19kZWZhdWx0Owp2YXIgaW5pdF95ZWFyc1RvTW9udGhzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3llYXJzVG9Nb250aHMuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIHllYXJzVG9Nb250aHNfZGVmYXVsdCA9IHllYXJzVG9Nb250aHM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMveWVhcnNUb1F1YXJ0ZXJzLmpzCmZ1bmN0aW9uIHllYXJzVG9RdWFydGVycyh5ZWFycykgewogIHJldHVybiBNYXRoLnRydW5jKHllYXJzICogcXVhcnRlcnNJblllYXIpOwp9CnZhciB5ZWFyc1RvUXVhcnRlcnNfZGVmYXVsdDsKdmFyIGluaXRfeWVhcnNUb1F1YXJ0ZXJzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3llYXJzVG9RdWFydGVycy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgeWVhcnNUb1F1YXJ0ZXJzX2RlZmF1bHQgPSB5ZWFyc1RvUXVhcnRlcnM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaW5kZXguanMKdmFyIGRhdGVfZm5zX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoZGF0ZV9mbnNfZXhwb3J0cywgewogIGFkZDogKCkgPT4gYWRkLAogIGFkZEJ1c2luZXNzRGF5czogKCkgPT4gYWRkQnVzaW5lc3NEYXlzLAogIGFkZERheXM6ICgpID0+IGFkZERheXMsCiAgYWRkSG91cnM6ICgpID0+IGFkZEhvdXJzLAogIGFkZElTT1dlZWtZZWFyczogKCkgPT4gYWRkSVNPV2Vla1llYXJzLAogIGFkZE1pbGxpc2Vjb25kczogKCkgPT4gYWRkTWlsbGlzZWNvbmRzLAogIGFkZE1pbnV0ZXM6ICgpID0+IGFkZE1pbnV0ZXMsCiAgYWRkTW9udGhzOiAoKSA9PiBhZGRNb250aHMsCiAgYWRkUXVhcnRlcnM6ICgpID0+IGFkZFF1YXJ0ZXJzLAogIGFkZFNlY29uZHM6ICgpID0+IGFkZFNlY29uZHMsCiAgYWRkV2Vla3M6ICgpID0+IGFkZFdlZWtzLAogIGFkZFllYXJzOiAoKSA9PiBhZGRZZWFycywKICBhcmVJbnRlcnZhbHNPdmVybGFwcGluZzogKCkgPT4gYXJlSW50ZXJ2YWxzT3ZlcmxhcHBpbmcsCiAgY2xhbXA6ICgpID0+IGNsYW1wLAogIGNsb3Nlc3RJbmRleFRvOiAoKSA9PiBjbG9zZXN0SW5kZXhUbywKICBjbG9zZXN0VG86ICgpID0+IGNsb3Nlc3RUbywKICBjb21wYXJlQXNjOiAoKSA9PiBjb21wYXJlQXNjLAogIGNvbXBhcmVEZXNjOiAoKSA9PiBjb21wYXJlRGVzYywKICBjb25zdHJ1Y3RGcm9tOiAoKSA9PiBjb25zdHJ1Y3RGcm9tLAogIGNvbnN0cnVjdE5vdzogKCkgPT4gY29uc3RydWN0Tm93LAogIGRheXNUb1dlZWtzOiAoKSA9PiBkYXlzVG9XZWVrcywKICBkaWZmZXJlbmNlSW5CdXNpbmVzc0RheXM6ICgpID0+IGRpZmZlcmVuY2VJbkJ1c2luZXNzRGF5cywKICBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXM6ICgpID0+IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cywKICBkaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtZZWFyczogKCkgPT4gZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrWWVhcnMsCiAgZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrczogKCkgPT4gZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrcywKICBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRoczogKCkgPT4gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMsCiAgZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVyczogKCkgPT4gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycywKICBkaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzOiAoKSA9PiBkaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzLAogIGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnM6ICgpID0+IGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMsCiAgZGlmZmVyZW5jZUluRGF5czogKCkgPT4gZGlmZmVyZW5jZUluRGF5cywKICBkaWZmZXJlbmNlSW5Ib3VyczogKCkgPT4gZGlmZmVyZW5jZUluSG91cnMsCiAgZGlmZmVyZW5jZUluSVNPV2Vla1llYXJzOiAoKSA9PiBkaWZmZXJlbmNlSW5JU09XZWVrWWVhcnMsCiAgZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzOiAoKSA9PiBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMsCiAgZGlmZmVyZW5jZUluTWludXRlczogKCkgPT4gZGlmZmVyZW5jZUluTWludXRlcywKICBkaWZmZXJlbmNlSW5Nb250aHM6ICgpID0+IGRpZmZlcmVuY2VJbk1vbnRocywKICBkaWZmZXJlbmNlSW5RdWFydGVyczogKCkgPT4gZGlmZmVyZW5jZUluUXVhcnRlcnMsCiAgZGlmZmVyZW5jZUluU2Vjb25kczogKCkgPT4gZGlmZmVyZW5jZUluU2Vjb25kcywKICBkaWZmZXJlbmNlSW5XZWVrczogKCkgPT4gZGlmZmVyZW5jZUluV2Vla3MsCiAgZGlmZmVyZW5jZUluWWVhcnM6ICgpID0+IGRpZmZlcmVuY2VJblllYXJzLAogIGVhY2hEYXlPZkludGVydmFsOiAoKSA9PiBlYWNoRGF5T2ZJbnRlcnZhbCwKICBlYWNoSG91ck9mSW50ZXJ2YWw6ICgpID0+IGVhY2hIb3VyT2ZJbnRlcnZhbCwKICBlYWNoTWludXRlT2ZJbnRlcnZhbDogKCkgPT4gZWFjaE1pbnV0ZU9mSW50ZXJ2YWwsCiAgZWFjaE1vbnRoT2ZJbnRlcnZhbDogKCkgPT4gZWFjaE1vbnRoT2ZJbnRlcnZhbCwKICBlYWNoUXVhcnRlck9mSW50ZXJ2YWw6ICgpID0+IGVhY2hRdWFydGVyT2ZJbnRlcnZhbCwKICBlYWNoV2Vla09mSW50ZXJ2YWw6ICgpID0+IGVhY2hXZWVrT2ZJbnRlcnZhbCwKICBlYWNoV2Vla2VuZE9mSW50ZXJ2YWw6ICgpID0+IGVhY2hXZWVrZW5kT2ZJbnRlcnZhbCwKICBlYWNoV2Vla2VuZE9mTW9udGg6ICgpID0+IGVhY2hXZWVrZW5kT2ZNb250aCwKICBlYWNoV2Vla2VuZE9mWWVhcjogKCkgPT4gZWFjaFdlZWtlbmRPZlllYXIsCiAgZWFjaFllYXJPZkludGVydmFsOiAoKSA9PiBlYWNoWWVhck9mSW50ZXJ2YWwsCiAgZW5kT2ZEYXk6ICgpID0+IGVuZE9mRGF5LAogIGVuZE9mRGVjYWRlOiAoKSA9PiBlbmRPZkRlY2FkZSwKICBlbmRPZkhvdXI6ICgpID0+IGVuZE9mSG91ciwKICBlbmRPZklTT1dlZWs6ICgpID0+IGVuZE9mSVNPV2VlaywKICBlbmRPZklTT1dlZWtZZWFyOiAoKSA9PiBlbmRPZklTT1dlZWtZZWFyLAogIGVuZE9mTWludXRlOiAoKSA9PiBlbmRPZk1pbnV0ZSwKICBlbmRPZk1vbnRoOiAoKSA9PiBlbmRPZk1vbnRoLAogIGVuZE9mUXVhcnRlcjogKCkgPT4gZW5kT2ZRdWFydGVyLAogIGVuZE9mU2Vjb25kOiAoKSA9PiBlbmRPZlNlY29uZCwKICBlbmRPZlRvZGF5OiAoKSA9PiBlbmRPZlRvZGF5LAogIGVuZE9mVG9tb3Jyb3c6ICgpID0+IGVuZE9mVG9tb3Jyb3csCiAgZW5kT2ZXZWVrOiAoKSA9PiBlbmRPZldlZWssCiAgZW5kT2ZZZWFyOiAoKSA9PiBlbmRPZlllYXIsCiAgZW5kT2ZZZXN0ZXJkYXk6ICgpID0+IGVuZE9mWWVzdGVyZGF5LAogIGZvcm1hdDogKCkgPT4gZm9ybWF0LAogIGZvcm1hdERhdGU6ICgpID0+IGZvcm1hdCwKICBmb3JtYXREaXN0YW5jZTogKCkgPT4gZm9ybWF0RGlzdGFuY2UyLAogIGZvcm1hdERpc3RhbmNlU3RyaWN0OiAoKSA9PiBmb3JtYXREaXN0YW5jZVN0cmljdCwKICBmb3JtYXREaXN0YW5jZVRvTm93OiAoKSA9PiBmb3JtYXREaXN0YW5jZVRvTm93LAogIGZvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3Q6ICgpID0+IGZvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3QsCiAgZm9ybWF0RHVyYXRpb246ICgpID0+IGZvcm1hdER1cmF0aW9uLAogIGZvcm1hdElTTzogKCkgPT4gZm9ybWF0SVNPLAogIGZvcm1hdElTTzkwNzU6ICgpID0+IGZvcm1hdElTTzkwNzUsCiAgZm9ybWF0SVNPRHVyYXRpb246ICgpID0+IGZvcm1hdElTT0R1cmF0aW9uLAogIGZvcm1hdFJGQzMzMzk6ICgpID0+IGZvcm1hdFJGQzMzMzksCiAgZm9ybWF0UkZDNzIzMTogKCkgPT4gZm9ybWF0UkZDNzIzMSwKICBmb3JtYXRSZWxhdGl2ZTogKCkgPT4gZm9ybWF0UmVsYXRpdmUyLAogIGZvcm1hdHRlcnM6ICgpID0+IGZvcm1hdHRlcnMsCiAgZnJvbVVuaXhUaW1lOiAoKSA9PiBmcm9tVW5peFRpbWUsCiAgZ2V0RGF0ZTogKCkgPT4gZ2V0RGF0ZSwKICBnZXREYXk6ICgpID0+IGdldERheSwKICBnZXREYXlPZlllYXI6ICgpID0+IGdldERheU9mWWVhciwKICBnZXREYXlzSW5Nb250aDogKCkgPT4gZ2V0RGF5c0luTW9udGgsCiAgZ2V0RGF5c0luWWVhcjogKCkgPT4gZ2V0RGF5c0luWWVhciwKICBnZXREZWNhZGU6ICgpID0+IGdldERlY2FkZSwKICBnZXREZWZhdWx0T3B0aW9uczogKCkgPT4gZ2V0RGVmYXVsdE9wdGlvbnMyLAogIGdldEhvdXJzOiAoKSA9PiBnZXRIb3VycywKICBnZXRJU09EYXk6ICgpID0+IGdldElTT0RheSwKICBnZXRJU09XZWVrOiAoKSA9PiBnZXRJU09XZWVrLAogIGdldElTT1dlZWtZZWFyOiAoKSA9PiBnZXRJU09XZWVrWWVhciwKICBnZXRJU09XZWVrc0luWWVhcjogKCkgPT4gZ2V0SVNPV2Vla3NJblllYXIsCiAgZ2V0TWlsbGlzZWNvbmRzOiAoKSA9PiBnZXRNaWxsaXNlY29uZHMsCiAgZ2V0TWludXRlczogKCkgPT4gZ2V0TWludXRlcywKICBnZXRNb250aDogKCkgPT4gZ2V0TW9udGgsCiAgZ2V0T3ZlcmxhcHBpbmdEYXlzSW5JbnRlcnZhbHM6ICgpID0+IGdldE92ZXJsYXBwaW5nRGF5c0luSW50ZXJ2YWxzLAogIGdldFF1YXJ0ZXI6ICgpID0+IGdldFF1YXJ0ZXIsCiAgZ2V0U2Vjb25kczogKCkgPT4gZ2V0U2Vjb25kcywKICBnZXRUaW1lOiAoKSA9PiBnZXRUaW1lLAogIGdldFVuaXhUaW1lOiAoKSA9PiBnZXRVbml4VGltZSwKICBnZXRXZWVrOiAoKSA9PiBnZXRXZWVrLAogIGdldFdlZWtPZk1vbnRoOiAoKSA9PiBnZXRXZWVrT2ZNb250aCwKICBnZXRXZWVrWWVhcjogKCkgPT4gZ2V0V2Vla1llYXIsCiAgZ2V0V2Vla3NJbk1vbnRoOiAoKSA9PiBnZXRXZWVrc0luTW9udGgsCiAgZ2V0WWVhcjogKCkgPT4gZ2V0WWVhciwKICBob3Vyc1RvTWlsbGlzZWNvbmRzOiAoKSA9PiBob3Vyc1RvTWlsbGlzZWNvbmRzLAogIGhvdXJzVG9NaW51dGVzOiAoKSA9PiBob3Vyc1RvTWludXRlcywKICBob3Vyc1RvU2Vjb25kczogKCkgPT4gaG91cnNUb1NlY29uZHMsCiAgaW50ZXJ2YWw6ICgpID0+IGludGVydmFsMiwKICBpbnRlcnZhbFRvRHVyYXRpb246ICgpID0+IGludGVydmFsVG9EdXJhdGlvbiwKICBpbnRsRm9ybWF0OiAoKSA9PiBpbnRsRm9ybWF0LAogIGludGxGb3JtYXREaXN0YW5jZTogKCkgPT4gaW50bEZvcm1hdERpc3RhbmNlLAogIGlzQWZ0ZXI6ICgpID0+IGlzQWZ0ZXIsCiAgaXNCZWZvcmU6ICgpID0+IGlzQmVmb3JlLAogIGlzRGF0ZTogKCkgPT4gaXNEYXRlLAogIGlzRXF1YWw6ICgpID0+IGlzRXF1YWwsCiAgaXNFeGlzdHM6ICgpID0+IGlzRXhpc3RzLAogIGlzRmlyc3REYXlPZk1vbnRoOiAoKSA9PiBpc0ZpcnN0RGF5T2ZNb250aCwKICBpc0ZyaWRheTogKCkgPT4gaXNGcmlkYXksCiAgaXNGdXR1cmU6ICgpID0+IGlzRnV0dXJlLAogIGlzTGFzdERheU9mTW9udGg6ICgpID0+IGlzTGFzdERheU9mTW9udGgsCiAgaXNMZWFwWWVhcjogKCkgPT4gaXNMZWFwWWVhciwKICBpc01hdGNoOiAoKSA9PiBpc01hdGNoMiwKICBpc01vbmRheTogKCkgPT4gaXNNb25kYXksCiAgaXNQYXN0OiAoKSA9PiBpc1Bhc3QsCiAgaXNTYW1lRGF5OiAoKSA9PiBpc1NhbWVEYXksCiAgaXNTYW1lSG91cjogKCkgPT4gaXNTYW1lSG91ciwKICBpc1NhbWVJU09XZWVrOiAoKSA9PiBpc1NhbWVJU09XZWVrLAogIGlzU2FtZUlTT1dlZWtZZWFyOiAoKSA9PiBpc1NhbWVJU09XZWVrWWVhciwKICBpc1NhbWVNaW51dGU6ICgpID0+IGlzU2FtZU1pbnV0ZSwKICBpc1NhbWVNb250aDogKCkgPT4gaXNTYW1lTW9udGgsCiAgaXNTYW1lUXVhcnRlcjogKCkgPT4gaXNTYW1lUXVhcnRlciwKICBpc1NhbWVTZWNvbmQ6ICgpID0+IGlzU2FtZVNlY29uZCwKICBpc1NhbWVXZWVrOiAoKSA9PiBpc1NhbWVXZWVrLAogIGlzU2FtZVllYXI6ICgpID0+IGlzU2FtZVllYXIsCiAgaXNTYXR1cmRheTogKCkgPT4gaXNTYXR1cmRheSwKICBpc1N1bmRheTogKCkgPT4gaXNTdW5kYXksCiAgaXNUaGlzSG91cjogKCkgPT4gaXNUaGlzSG91ciwKICBpc1RoaXNJU09XZWVrOiAoKSA9PiBpc1RoaXNJU09XZWVrLAogIGlzVGhpc01pbnV0ZTogKCkgPT4gaXNUaGlzTWludXRlLAogIGlzVGhpc01vbnRoOiAoKSA9PiBpc1RoaXNNb250aCwKICBpc1RoaXNRdWFydGVyOiAoKSA9PiBpc1RoaXNRdWFydGVyLAogIGlzVGhpc1NlY29uZDogKCkgPT4gaXNUaGlzU2Vjb25kLAogIGlzVGhpc1dlZWs6ICgpID0+IGlzVGhpc1dlZWssCiAgaXNUaGlzWWVhcjogKCkgPT4gaXNUaGlzWWVhciwKICBpc1RodXJzZGF5OiAoKSA9PiBpc1RodXJzZGF5LAogIGlzVG9kYXk6ICgpID0+IGlzVG9kYXksCiAgaXNUb21vcnJvdzogKCkgPT4gaXNUb21vcnJvdywKICBpc1R1ZXNkYXk6ICgpID0+IGlzVHVlc2RheSwKICBpc1ZhbGlkOiAoKSA9PiBpc1ZhbGlkLAogIGlzV2VkbmVzZGF5OiAoKSA9PiBpc1dlZG5lc2RheSwKICBpc1dlZWtlbmQ6ICgpID0+IGlzV2Vla2VuZCwKICBpc1dpdGhpbkludGVydmFsOiAoKSA9PiBpc1dpdGhpbkludGVydmFsLAogIGlzWWVzdGVyZGF5OiAoKSA9PiBpc1llc3RlcmRheSwKICBsYXN0RGF5T2ZEZWNhZGU6ICgpID0+IGxhc3REYXlPZkRlY2FkZSwKICBsYXN0RGF5T2ZJU09XZWVrOiAoKSA9PiBsYXN0RGF5T2ZJU09XZWVrLAogIGxhc3REYXlPZklTT1dlZWtZZWFyOiAoKSA9PiBsYXN0RGF5T2ZJU09XZWVrWWVhciwKICBsYXN0RGF5T2ZNb250aDogKCkgPT4gbGFzdERheU9mTW9udGgsCiAgbGFzdERheU9mUXVhcnRlcjogKCkgPT4gbGFzdERheU9mUXVhcnRlciwKICBsYXN0RGF5T2ZXZWVrOiAoKSA9PiBsYXN0RGF5T2ZXZWVrLAogIGxhc3REYXlPZlllYXI6ICgpID0+IGxhc3REYXlPZlllYXIsCiAgbGlnaHRGb3JtYXQ6ICgpID0+IGxpZ2h0Rm9ybWF0LAogIGxpZ2h0Rm9ybWF0dGVyczogKCkgPT4gbGlnaHRGb3JtYXR0ZXJzLAogIGxvbmdGb3JtYXR0ZXJzOiAoKSA9PiBsb25nRm9ybWF0dGVycywKICBtYXg6ICgpID0+IG1heDIsCiAgbWlsbGlzZWNvbmRzOiAoKSA9PiBtaWxsaXNlY29uZHMsCiAgbWlsbGlzZWNvbmRzVG9Ib3VyczogKCkgPT4gbWlsbGlzZWNvbmRzVG9Ib3VycywKICBtaWxsaXNlY29uZHNUb01pbnV0ZXM6ICgpID0+IG1pbGxpc2Vjb25kc1RvTWludXRlcywKICBtaWxsaXNlY29uZHNUb1NlY29uZHM6ICgpID0+IG1pbGxpc2Vjb25kc1RvU2Vjb25kcywKICBtaW46ICgpID0+IG1pbjIsCiAgbWludXRlc1RvSG91cnM6ICgpID0+IG1pbnV0ZXNUb0hvdXJzLAogIG1pbnV0ZXNUb01pbGxpc2Vjb25kczogKCkgPT4gbWludXRlc1RvTWlsbGlzZWNvbmRzLAogIG1pbnV0ZXNUb1NlY29uZHM6ICgpID0+IG1pbnV0ZXNUb1NlY29uZHMsCiAgbW9udGhzVG9RdWFydGVyczogKCkgPT4gbW9udGhzVG9RdWFydGVycywKICBtb250aHNUb1llYXJzOiAoKSA9PiBtb250aHNUb1llYXJzLAogIG5leHREYXk6ICgpID0+IG5leHREYXksCiAgbmV4dEZyaWRheTogKCkgPT4gbmV4dEZyaWRheSwKICBuZXh0TW9uZGF5OiAoKSA9PiBuZXh0TW9uZGF5LAogIG5leHRTYXR1cmRheTogKCkgPT4gbmV4dFNhdHVyZGF5LAogIG5leHRTdW5kYXk6ICgpID0+IG5leHRTdW5kYXksCiAgbmV4dFRodXJzZGF5OiAoKSA9PiBuZXh0VGh1cnNkYXksCiAgbmV4dFR1ZXNkYXk6ICgpID0+IG5leHRUdWVzZGF5LAogIG5leHRXZWRuZXNkYXk6ICgpID0+IG5leHRXZWRuZXNkYXksCiAgcGFyc2U6ICgpID0+IHBhcnNlLAogIHBhcnNlSVNPOiAoKSA9PiBwYXJzZUlTTywKICBwYXJzZUpTT046ICgpID0+IHBhcnNlSlNPTiwKICBwYXJzZXJzOiAoKSA9PiBwYXJzZXJzLAogIHByZXZpb3VzRGF5OiAoKSA9PiBwcmV2aW91c0RheSwKICBwcmV2aW91c0ZyaWRheTogKCkgPT4gcHJldmlvdXNGcmlkYXksCiAgcHJldmlvdXNNb25kYXk6ICgpID0+IHByZXZpb3VzTW9uZGF5LAogIHByZXZpb3VzU2F0dXJkYXk6ICgpID0+IHByZXZpb3VzU2F0dXJkYXksCiAgcHJldmlvdXNTdW5kYXk6ICgpID0+IHByZXZpb3VzU3VuZGF5LAogIHByZXZpb3VzVGh1cnNkYXk6ICgpID0+IHByZXZpb3VzVGh1cnNkYXksCiAgcHJldmlvdXNUdWVzZGF5OiAoKSA9PiBwcmV2aW91c1R1ZXNkYXksCiAgcHJldmlvdXNXZWRuZXNkYXk6ICgpID0+IHByZXZpb3VzV2VkbmVzZGF5LAogIHF1YXJ0ZXJzVG9Nb250aHM6ICgpID0+IHF1YXJ0ZXJzVG9Nb250aHMsCiAgcXVhcnRlcnNUb1llYXJzOiAoKSA9PiBxdWFydGVyc1RvWWVhcnMsCiAgcm91bmRUb05lYXJlc3RIb3VyczogKCkgPT4gcm91bmRUb05lYXJlc3RIb3VycywKICByb3VuZFRvTmVhcmVzdE1pbnV0ZXM6ICgpID0+IHJvdW5kVG9OZWFyZXN0TWludXRlcywKICBzZWNvbmRzVG9Ib3VyczogKCkgPT4gc2Vjb25kc1RvSG91cnMsCiAgc2Vjb25kc1RvTWlsbGlzZWNvbmRzOiAoKSA9PiBzZWNvbmRzVG9NaWxsaXNlY29uZHMsCiAgc2Vjb25kc1RvTWludXRlczogKCkgPT4gc2Vjb25kc1RvTWludXRlcywKICBzZXQ6ICgpID0+IHNldCwKICBzZXREYXRlOiAoKSA9PiBzZXREYXRlLAogIHNldERheTogKCkgPT4gc2V0RGF5LAogIHNldERheU9mWWVhcjogKCkgPT4gc2V0RGF5T2ZZZWFyLAogIHNldERlZmF1bHRPcHRpb25zOiAoKSA9PiBzZXREZWZhdWx0T3B0aW9uczIsCiAgc2V0SG91cnM6ICgpID0+IHNldEhvdXJzLAogIHNldElTT0RheTogKCkgPT4gc2V0SVNPRGF5LAogIHNldElTT1dlZWs6ICgpID0+IHNldElTT1dlZWssCiAgc2V0SVNPV2Vla1llYXI6ICgpID0+IHNldElTT1dlZWtZZWFyLAogIHNldE1pbGxpc2Vjb25kczogKCkgPT4gc2V0TWlsbGlzZWNvbmRzLAogIHNldE1pbnV0ZXM6ICgpID0+IHNldE1pbnV0ZXMsCiAgc2V0TW9udGg6ICgpID0+IHNldE1vbnRoLAogIHNldFF1YXJ0ZXI6ICgpID0+IHNldFF1YXJ0ZXIsCiAgc2V0U2Vjb25kczogKCkgPT4gc2V0U2Vjb25kcywKICBzZXRXZWVrOiAoKSA9PiBzZXRXZWVrLAogIHNldFdlZWtZZWFyOiAoKSA9PiBzZXRXZWVrWWVhciwKICBzZXRZZWFyOiAoKSA9PiBzZXRZZWFyLAogIHN0YXJ0T2ZEYXk6ICgpID0+IHN0YXJ0T2ZEYXksCiAgc3RhcnRPZkRlY2FkZTogKCkgPT4gc3RhcnRPZkRlY2FkZSwKICBzdGFydE9mSG91cjogKCkgPT4gc3RhcnRPZkhvdXIsCiAgc3RhcnRPZklTT1dlZWs6ICgpID0+IHN0YXJ0T2ZJU09XZWVrLAogIHN0YXJ0T2ZJU09XZWVrWWVhcjogKCkgPT4gc3RhcnRPZklTT1dlZWtZZWFyLAogIHN0YXJ0T2ZNaW51dGU6ICgpID0+IHN0YXJ0T2ZNaW51dGUsCiAgc3RhcnRPZk1vbnRoOiAoKSA9PiBzdGFydE9mTW9udGgsCiAgc3RhcnRPZlF1YXJ0ZXI6ICgpID0+IHN0YXJ0T2ZRdWFydGVyLAogIHN0YXJ0T2ZTZWNvbmQ6ICgpID0+IHN0YXJ0T2ZTZWNvbmQsCiAgc3RhcnRPZlRvZGF5OiAoKSA9PiBzdGFydE9mVG9kYXksCiAgc3RhcnRPZlRvbW9ycm93OiAoKSA9PiBzdGFydE9mVG9tb3Jyb3csCiAgc3RhcnRPZldlZWs6ICgpID0+IHN0YXJ0T2ZXZWVrLAogIHN0YXJ0T2ZXZWVrWWVhcjogKCkgPT4gc3RhcnRPZldlZWtZZWFyLAogIHN0YXJ0T2ZZZWFyOiAoKSA9PiBzdGFydE9mWWVhciwKICBzdGFydE9mWWVzdGVyZGF5OiAoKSA9PiBzdGFydE9mWWVzdGVyZGF5LAogIHN1YjogKCkgPT4gc3ViLAogIHN1YkJ1c2luZXNzRGF5czogKCkgPT4gc3ViQnVzaW5lc3NEYXlzLAogIHN1YkRheXM6ICgpID0+IHN1YkRheXMsCiAgc3ViSG91cnM6ICgpID0+IHN1YkhvdXJzLAogIHN1YklTT1dlZWtZZWFyczogKCkgPT4gc3ViSVNPV2Vla1llYXJzLAogIHN1Yk1pbGxpc2Vjb25kczogKCkgPT4gc3ViTWlsbGlzZWNvbmRzLAogIHN1Yk1pbnV0ZXM6ICgpID0+IHN1Yk1pbnV0ZXMsCiAgc3ViTW9udGhzOiAoKSA9PiBzdWJNb250aHMsCiAgc3ViUXVhcnRlcnM6ICgpID0+IHN1YlF1YXJ0ZXJzLAogIHN1YlNlY29uZHM6ICgpID0+IHN1YlNlY29uZHMsCiAgc3ViV2Vla3M6ICgpID0+IHN1YldlZWtzLAogIHN1YlllYXJzOiAoKSA9PiBzdWJZZWFycywKICB0b0RhdGU6ICgpID0+IHRvRGF0ZSwKICB0cmFuc3Bvc2U6ICgpID0+IHRyYW5zcG9zZSwKICB3ZWVrc1RvRGF5czogKCkgPT4gd2Vla3NUb0RheXMsCiAgeWVhcnNUb0RheXM6ICgpID0+IHllYXJzVG9EYXlzLAogIHllYXJzVG9Nb250aHM6ICgpID0+IHllYXJzVG9Nb250aHMsCiAgeWVhcnNUb1F1YXJ0ZXJzOiAoKSA9PiB5ZWFyc1RvUXVhcnRlcnMKfSk7CnZhciBpbml0X2RhdGVfZm5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2luZGV4LmpzIigpIHsKICAgIGluaXRfYWRkKCk7CiAgICBpbml0X2FkZEJ1c2luZXNzRGF5cygpOwogICAgaW5pdF9hZGREYXlzKCk7CiAgICBpbml0X2FkZEhvdXJzKCk7CiAgICBpbml0X2FkZElTT1dlZWtZZWFycygpOwogICAgaW5pdF9hZGRNaWxsaXNlY29uZHMoKTsKICAgIGluaXRfYWRkTWludXRlcygpOwogICAgaW5pdF9hZGRNb250aHMoKTsKICAgIGluaXRfYWRkUXVhcnRlcnMoKTsKICAgIGluaXRfYWRkU2Vjb25kcygpOwogICAgaW5pdF9hZGRXZWVrcygpOwogICAgaW5pdF9hZGRZZWFycygpOwogICAgaW5pdF9hcmVJbnRlcnZhbHNPdmVybGFwcGluZygpOwogICAgaW5pdF9jbGFtcCgpOwogICAgaW5pdF9jbG9zZXN0SW5kZXhUbygpOwogICAgaW5pdF9jbG9zZXN0VG8oKTsKICAgIGluaXRfY29tcGFyZUFzYygpOwogICAgaW5pdF9jb21wYXJlRGVzYygpOwogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X2NvbnN0cnVjdE5vdygpOwogICAgaW5pdF9kYXlzVG9XZWVrcygpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5CdXNpbmVzc0RheXMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla1llYXJzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla3MoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycygpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluRGF5cygpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5Ib3VycygpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5JU09XZWVrWWVhcnMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbk1pbnV0ZXMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluTW9udGhzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJblF1YXJ0ZXJzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJblNlY29uZHMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluV2Vla3MoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluWWVhcnMoKTsKICAgIGluaXRfZWFjaERheU9mSW50ZXJ2YWwoKTsKICAgIGluaXRfZWFjaEhvdXJPZkludGVydmFsKCk7CiAgICBpbml0X2VhY2hNaW51dGVPZkludGVydmFsKCk7CiAgICBpbml0X2VhY2hNb250aE9mSW50ZXJ2YWwoKTsKICAgIGluaXRfZWFjaFF1YXJ0ZXJPZkludGVydmFsKCk7CiAgICBpbml0X2VhY2hXZWVrT2ZJbnRlcnZhbCgpOwogICAgaW5pdF9lYWNoV2Vla2VuZE9mSW50ZXJ2YWwoKTsKICAgIGluaXRfZWFjaFdlZWtlbmRPZk1vbnRoKCk7CiAgICBpbml0X2VhY2hXZWVrZW5kT2ZZZWFyKCk7CiAgICBpbml0X2VhY2hZZWFyT2ZJbnRlcnZhbCgpOwogICAgaW5pdF9lbmRPZkRheSgpOwogICAgaW5pdF9lbmRPZkRlY2FkZSgpOwogICAgaW5pdF9lbmRPZkhvdXIoKTsKICAgIGluaXRfZW5kT2ZJU09XZWVrKCk7CiAgICBpbml0X2VuZE9mSVNPV2Vla1llYXIoKTsKICAgIGluaXRfZW5kT2ZNaW51dGUoKTsKICAgIGluaXRfZW5kT2ZNb250aCgpOwogICAgaW5pdF9lbmRPZlF1YXJ0ZXIoKTsKICAgIGluaXRfZW5kT2ZTZWNvbmQoKTsKICAgIGluaXRfZW5kT2ZUb2RheSgpOwogICAgaW5pdF9lbmRPZlRvbW9ycm93KCk7CiAgICBpbml0X2VuZE9mV2VlaygpOwogICAgaW5pdF9lbmRPZlllYXIoKTsKICAgIGluaXRfZW5kT2ZZZXN0ZXJkYXkoKTsKICAgIGluaXRfZm9ybWF0KCk7CiAgICBpbml0X2Zvcm1hdERpc3RhbmNlMigpOwogICAgaW5pdF9mb3JtYXREaXN0YW5jZVN0cmljdCgpOwogICAgaW5pdF9mb3JtYXREaXN0YW5jZVRvTm93KCk7CiAgICBpbml0X2Zvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3QoKTsKICAgIGluaXRfZm9ybWF0RHVyYXRpb24oKTsKICAgIGluaXRfZm9ybWF0SVNPKCk7CiAgICBpbml0X2Zvcm1hdElTTzkwNzUoKTsKICAgIGluaXRfZm9ybWF0SVNPRHVyYXRpb24oKTsKICAgIGluaXRfZm9ybWF0UkZDMzMzOSgpOwogICAgaW5pdF9mb3JtYXRSRkM3MjMxKCk7CiAgICBpbml0X2Zvcm1hdFJlbGF0aXZlMigpOwogICAgaW5pdF9mcm9tVW5peFRpbWUoKTsKICAgIGluaXRfZ2V0RGF0ZSgpOwogICAgaW5pdF9nZXREYXkoKTsKICAgIGluaXRfZ2V0RGF5T2ZZZWFyKCk7CiAgICBpbml0X2dldERheXNJbk1vbnRoKCk7CiAgICBpbml0X2dldERheXNJblllYXIoKTsKICAgIGluaXRfZ2V0RGVjYWRlKCk7CiAgICBpbml0X2dldERlZmF1bHRPcHRpb25zKCk7CiAgICBpbml0X2dldEhvdXJzKCk7CiAgICBpbml0X2dldElTT0RheSgpOwogICAgaW5pdF9nZXRJU09XZWVrKCk7CiAgICBpbml0X2dldElTT1dlZWtZZWFyKCk7CiAgICBpbml0X2dldElTT1dlZWtzSW5ZZWFyKCk7CiAgICBpbml0X2dldE1pbGxpc2Vjb25kcygpOwogICAgaW5pdF9nZXRNaW51dGVzKCk7CiAgICBpbml0X2dldE1vbnRoKCk7CiAgICBpbml0X2dldE92ZXJsYXBwaW5nRGF5c0luSW50ZXJ2YWxzKCk7CiAgICBpbml0X2dldFF1YXJ0ZXIoKTsKICAgIGluaXRfZ2V0U2Vjb25kcygpOwogICAgaW5pdF9nZXRUaW1lKCk7CiAgICBpbml0X2dldFVuaXhUaW1lKCk7CiAgICBpbml0X2dldFdlZWsoKTsKICAgIGluaXRfZ2V0V2Vla09mTW9udGgoKTsKICAgIGluaXRfZ2V0V2Vla1llYXIoKTsKICAgIGluaXRfZ2V0V2Vla3NJbk1vbnRoKCk7CiAgICBpbml0X2dldFllYXIoKTsKICAgIGluaXRfaG91cnNUb01pbGxpc2Vjb25kcygpOwogICAgaW5pdF9ob3Vyc1RvTWludXRlcygpOwogICAgaW5pdF9ob3Vyc1RvU2Vjb25kcygpOwogICAgaW5pdF9pbnRlcnZhbDIoKTsKICAgIGluaXRfaW50ZXJ2YWxUb0R1cmF0aW9uKCk7CiAgICBpbml0X2ludGxGb3JtYXQoKTsKICAgIGluaXRfaW50bEZvcm1hdERpc3RhbmNlKCk7CiAgICBpbml0X2lzQWZ0ZXIoKTsKICAgIGluaXRfaXNCZWZvcmUoKTsKICAgIGluaXRfaXNEYXRlMigpOwogICAgaW5pdF9pc0VxdWFsKCk7CiAgICBpbml0X2lzRXhpc3RzKCk7CiAgICBpbml0X2lzRmlyc3REYXlPZk1vbnRoKCk7CiAgICBpbml0X2lzRnJpZGF5KCk7CiAgICBpbml0X2lzRnV0dXJlKCk7CiAgICBpbml0X2lzTGFzdERheU9mTW9udGgoKTsKICAgIGluaXRfaXNMZWFwWWVhcigpOwogICAgaW5pdF9pc01hdGNoKCk7CiAgICBpbml0X2lzTW9uZGF5KCk7CiAgICBpbml0X2lzUGFzdCgpOwogICAgaW5pdF9pc1NhbWVEYXkoKTsKICAgIGluaXRfaXNTYW1lSG91cigpOwogICAgaW5pdF9pc1NhbWVJU09XZWVrKCk7CiAgICBpbml0X2lzU2FtZUlTT1dlZWtZZWFyKCk7CiAgICBpbml0X2lzU2FtZU1pbnV0ZSgpOwogICAgaW5pdF9pc1NhbWVNb250aCgpOwogICAgaW5pdF9pc1NhbWVRdWFydGVyKCk7CiAgICBpbml0X2lzU2FtZVNlY29uZCgpOwogICAgaW5pdF9pc1NhbWVXZWVrKCk7CiAgICBpbml0X2lzU2FtZVllYXIoKTsKICAgIGluaXRfaXNTYXR1cmRheSgpOwogICAgaW5pdF9pc1N1bmRheSgpOwogICAgaW5pdF9pc1RoaXNIb3VyKCk7CiAgICBpbml0X2lzVGhpc0lTT1dlZWsoKTsKICAgIGluaXRfaXNUaGlzTWludXRlKCk7CiAgICBpbml0X2lzVGhpc01vbnRoKCk7CiAgICBpbml0X2lzVGhpc1F1YXJ0ZXIoKTsKICAgIGluaXRfaXNUaGlzU2Vjb25kKCk7CiAgICBpbml0X2lzVGhpc1dlZWsoKTsKICAgIGluaXRfaXNUaGlzWWVhcigpOwogICAgaW5pdF9pc1RodXJzZGF5KCk7CiAgICBpbml0X2lzVG9kYXkoKTsKICAgIGluaXRfaXNUb21vcnJvdygpOwogICAgaW5pdF9pc1R1ZXNkYXkoKTsKICAgIGluaXRfaXNWYWxpZCgpOwogICAgaW5pdF9pc1dlZG5lc2RheSgpOwogICAgaW5pdF9pc1dlZWtlbmQoKTsKICAgIGluaXRfaXNXaXRoaW5JbnRlcnZhbCgpOwogICAgaW5pdF9pc1llc3RlcmRheSgpOwogICAgaW5pdF9sYXN0RGF5T2ZEZWNhZGUoKTsKICAgIGluaXRfbGFzdERheU9mSVNPV2VlaygpOwogICAgaW5pdF9sYXN0RGF5T2ZJU09XZWVrWWVhcigpOwogICAgaW5pdF9sYXN0RGF5T2ZNb250aCgpOwogICAgaW5pdF9sYXN0RGF5T2ZRdWFydGVyKCk7CiAgICBpbml0X2xhc3REYXlPZldlZWsoKTsKICAgIGluaXRfbGFzdERheU9mWWVhcigpOwogICAgaW5pdF9saWdodEZvcm1hdCgpOwogICAgaW5pdF9tYXgyKCk7CiAgICBpbml0X21pbGxpc2Vjb25kcygpOwogICAgaW5pdF9taWxsaXNlY29uZHNUb0hvdXJzKCk7CiAgICBpbml0X21pbGxpc2Vjb25kc1RvTWludXRlcygpOwogICAgaW5pdF9taWxsaXNlY29uZHNUb1NlY29uZHMoKTsKICAgIGluaXRfbWluMigpOwogICAgaW5pdF9taW51dGVzVG9Ib3VycygpOwogICAgaW5pdF9taW51dGVzVG9NaWxsaXNlY29uZHMoKTsKICAgIGluaXRfbWludXRlc1RvU2Vjb25kcygpOwogICAgaW5pdF9tb250aHNUb1F1YXJ0ZXJzKCk7CiAgICBpbml0X21vbnRoc1RvWWVhcnMoKTsKICAgIGluaXRfbmV4dERheSgpOwogICAgaW5pdF9uZXh0RnJpZGF5KCk7CiAgICBpbml0X25leHRNb25kYXkoKTsKICAgIGluaXRfbmV4dFNhdHVyZGF5KCk7CiAgICBpbml0X25leHRTdW5kYXkoKTsKICAgIGluaXRfbmV4dFRodXJzZGF5KCk7CiAgICBpbml0X25leHRUdWVzZGF5KCk7CiAgICBpbml0X25leHRXZWRuZXNkYXkoKTsKICAgIGluaXRfcGFyc2UoKTsKICAgIGluaXRfcGFyc2VJU08oKTsKICAgIGluaXRfcGFyc2VKU09OKCk7CiAgICBpbml0X3ByZXZpb3VzRGF5KCk7CiAgICBpbml0X3ByZXZpb3VzRnJpZGF5KCk7CiAgICBpbml0X3ByZXZpb3VzTW9uZGF5KCk7CiAgICBpbml0X3ByZXZpb3VzU2F0dXJkYXkoKTsKICAgIGluaXRfcHJldmlvdXNTdW5kYXkoKTsKICAgIGluaXRfcHJldmlvdXNUaHVyc2RheSgpOwogICAgaW5pdF9wcmV2aW91c1R1ZXNkYXkoKTsKICAgIGluaXRfcHJldmlvdXNXZWRuZXNkYXkoKTsKICAgIGluaXRfcXVhcnRlcnNUb01vbnRocygpOwogICAgaW5pdF9xdWFydGVyc1RvWWVhcnMoKTsKICAgIGluaXRfcm91bmRUb05lYXJlc3RIb3VycygpOwogICAgaW5pdF9yb3VuZFRvTmVhcmVzdE1pbnV0ZXMoKTsKICAgIGluaXRfc2Vjb25kc1RvSG91cnMoKTsKICAgIGluaXRfc2Vjb25kc1RvTWlsbGlzZWNvbmRzKCk7CiAgICBpbml0X3NlY29uZHNUb01pbnV0ZXMoKTsKICAgIGluaXRfc2V0KCk7CiAgICBpbml0X3NldERhdGUoKTsKICAgIGluaXRfc2V0RGF5KCk7CiAgICBpbml0X3NldERheU9mWWVhcigpOwogICAgaW5pdF9zZXREZWZhdWx0T3B0aW9ucygpOwogICAgaW5pdF9zZXRIb3VycygpOwogICAgaW5pdF9zZXRJU09EYXkoKTsKICAgIGluaXRfc2V0SVNPV2VlaygpOwogICAgaW5pdF9zZXRJU09XZWVrWWVhcigpOwogICAgaW5pdF9zZXRNaWxsaXNlY29uZHMoKTsKICAgIGluaXRfc2V0TWludXRlcygpOwogICAgaW5pdF9zZXRNb250aCgpOwogICAgaW5pdF9zZXRRdWFydGVyKCk7CiAgICBpbml0X3NldFNlY29uZHMoKTsKICAgIGluaXRfc2V0V2VlaygpOwogICAgaW5pdF9zZXRXZWVrWWVhcigpOwogICAgaW5pdF9zZXRZZWFyKCk7CiAgICBpbml0X3N0YXJ0T2ZEYXkoKTsKICAgIGluaXRfc3RhcnRPZkRlY2FkZSgpOwogICAgaW5pdF9zdGFydE9mSG91cigpOwogICAgaW5pdF9zdGFydE9mSVNPV2VlaygpOwogICAgaW5pdF9zdGFydE9mSVNPV2Vla1llYXIoKTsKICAgIGluaXRfc3RhcnRPZk1pbnV0ZSgpOwogICAgaW5pdF9zdGFydE9mTW9udGgoKTsKICAgIGluaXRfc3RhcnRPZlF1YXJ0ZXIoKTsKICAgIGluaXRfc3RhcnRPZlNlY29uZCgpOwogICAgaW5pdF9zdGFydE9mVG9kYXkoKTsKICAgIGluaXRfc3RhcnRPZlRvbW9ycm93KCk7CiAgICBpbml0X3N0YXJ0T2ZXZWVrKCk7CiAgICBpbml0X3N0YXJ0T2ZXZWVrWWVhcigpOwogICAgaW5pdF9zdGFydE9mWWVhcigpOwogICAgaW5pdF9zdGFydE9mWWVzdGVyZGF5KCk7CiAgICBpbml0X3N1YigpOwogICAgaW5pdF9zdWJCdXNpbmVzc0RheXMoKTsKICAgIGluaXRfc3ViRGF5cygpOwogICAgaW5pdF9zdWJIb3VycygpOwogICAgaW5pdF9zdWJJU09XZWVrWWVhcnMoKTsKICAgIGluaXRfc3ViTWlsbGlzZWNvbmRzKCk7CiAgICBpbml0X3N1Yk1pbnV0ZXMoKTsKICAgIGluaXRfc3ViTW9udGhzKCk7CiAgICBpbml0X3N1YlF1YXJ0ZXJzKCk7CiAgICBpbml0X3N1YlNlY29uZHMoKTsKICAgIGluaXRfc3ViV2Vla3MoKTsKICAgIGluaXRfc3ViWWVhcnMoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpbml0X3RyYW5zcG9zZSgpOwogICAgaW5pdF93ZWVrc1RvRGF5cygpOwogICAgaW5pdF95ZWFyc1RvRGF5cygpOwogICAgaW5pdF95ZWFyc1RvTW9udGhzKCk7CiAgICBpbml0X3llYXJzVG9RdWFydGVycygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4xOS9ub2RlX21vZHVsZXMvZGF5anMvZGF5anMubWluLmpzCnZhciByZXF1aXJlX2RheWpzX21pbiA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4xOS9ub2RlX21vZHVsZXMvZGF5anMvZGF5anMubWluLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICEoZnVuY3Rpb24odDksIGUxMSkgewogICAgICAib2JqZWN0IiA9PSB0eXBlb2YgZXhwb3J0cyAmJiAidW5kZWZpbmVkIiAhPSB0eXBlb2YgbW9kdWxlID8gbW9kdWxlLmV4cG9ydHMgPSBlMTEoKSA6ICJmdW5jdGlvbiIgPT0gdHlwZW9mIGRlZmluZSAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGUxMSkgOiAodDkgPSAidW5kZWZpbmVkIiAhPSB0eXBlb2YgZ2xvYmFsVGhpcyA/IGdsb2JhbFRoaXMgOiB0OSB8fCBzZWxmKS5kYXlqcyA9IGUxMSgpOwogICAgfSkoZXhwb3J0cywgKGZ1bmN0aW9uKCkgewogICAgICAidXNlIHN0cmljdCI7CiAgICAgIHZhciB0OSA9IDFlMywgZTExID0gNmU0LCBuMTMgPSAzNmU1LCByMTEgPSAibWlsbGlzZWNvbmQiLCBpMTEgPSAic2Vjb25kIiwgczkgPSAibWludXRlIiwgdTcgPSAiaG91ciIsIGE1ID0gImRheSIsIG8xMyA9ICJ3ZWVrIiwgYzExID0gIm1vbnRoIiwgZjcgPSAicXVhcnRlciIsIGg5ID0gInllYXIiLCBkNiA9ICJkYXRlIiwgbDYgPSAiSW52YWxpZCBEYXRlIiwgJDMgPSAvXihcZHs0fSlbLS9dPyhcZHsxLDJ9KT9bLS9dPyhcZHswLDJ9KVtUdFxzXSooXGR7MSwyfSk/Oj8oXGR7MSwyfSk/Oj8oXGR7MSwyfSk/Wy46XT8oXGQrKT8kLywgeTUgPSAvXFsoW15cXV0rKV18WXsxLDR9fE17MSw0fXxEezEsMn18ZHsxLDR9fEh7MSwyfXxoezEsMn18YXxBfG17MSwyfXxzezEsMn18WnsxLDJ9fFNTUy9nLCBNMyA9IHsgbmFtZTogImVuIiwgd2Vla2RheXM6ICJTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheSIuc3BsaXQoIl8iKSwgbW9udGhzOiAiSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlciIuc3BsaXQoIl8iKSwgb3JkaW5hbDogZnVuY3Rpb24odDEwKSB7CiAgICAgICAgdmFyIGUxMiA9IFsidGgiLCAic3QiLCAibmQiLCAicmQiXSwgbjE0ID0gdDEwICUgMTAwOwogICAgICAgIHJldHVybiAiWyIgKyB0MTAgKyAoZTEyWyhuMTQgLSAyMCkgJSAxMF0gfHwgZTEyW24xNF0gfHwgZTEyWzBdKSArICJdIjsKICAgICAgfSB9LCBtNiA9IGZ1bmN0aW9uKHQxMCwgZTEyLCBuMTQpIHsKICAgICAgICB2YXIgcjEyID0gU3RyaW5nKHQxMCk7CiAgICAgICAgcmV0dXJuICFyMTIgfHwgcjEyLmxlbmd0aCA+PSBlMTIgPyB0MTAgOiAiIiArIEFycmF5KGUxMiArIDEgLSByMTIubGVuZ3RoKS5qb2luKG4xNCkgKyB0MTA7CiAgICAgIH0sIHY1ID0geyBzOiBtNiwgejogZnVuY3Rpb24odDEwKSB7CiAgICAgICAgdmFyIGUxMiA9IC10MTAudXRjT2Zmc2V0KCksIG4xNCA9IE1hdGguYWJzKGUxMiksIHIxMiA9IE1hdGguZmxvb3IobjE0IC8gNjApLCBpMTIgPSBuMTQgJSA2MDsKICAgICAgICByZXR1cm4gKGUxMiA8PSAwID8gIisiIDogIi0iKSArIG02KHIxMiwgMiwgIjAiKSArICI6IiArIG02KGkxMiwgMiwgIjAiKTsKICAgICAgfSwgbTogZnVuY3Rpb24gdDEwKGUxMiwgbjE0KSB7CiAgICAgICAgaWYgKGUxMi5kYXRlKCkgPCBuMTQuZGF0ZSgpKSByZXR1cm4gLXQxMChuMTQsIGUxMik7CiAgICAgICAgdmFyIHIxMiA9IDEyICogKG4xNC55ZWFyKCkgLSBlMTIueWVhcigpKSArIChuMTQubW9udGgoKSAtIGUxMi5tb250aCgpKSwgaTEyID0gZTEyLmNsb25lKCkuYWRkKHIxMiwgYzExKSwgczEwID0gbjE0IC0gaTEyIDwgMCwgdTggPSBlMTIuY2xvbmUoKS5hZGQocjEyICsgKHMxMCA/IC0xIDogMSksIGMxMSk7CiAgICAgICAgcmV0dXJuICsoLShyMTIgKyAobjE0IC0gaTEyKSAvIChzMTAgPyBpMTIgLSB1OCA6IHU4IC0gaTEyKSkgfHwgMCk7CiAgICAgIH0sIGE6IGZ1bmN0aW9uKHQxMCkgewogICAgICAgIHJldHVybiB0MTAgPCAwID8gTWF0aC5jZWlsKHQxMCkgfHwgMCA6IE1hdGguZmxvb3IodDEwKTsKICAgICAgfSwgcDogZnVuY3Rpb24odDEwKSB7CiAgICAgICAgcmV0dXJuIHsgTTogYzExLCB5OiBoOSwgdzogbzEzLCBkOiBhNSwgRDogZDYsIGg6IHU3LCBtOiBzOSwgczogaTExLCBtczogcjExLCBROiBmNyB9W3QxMF0gfHwgU3RyaW5nKHQxMCB8fCAiIikudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9zJC8sICIiKTsKICAgICAgfSwgdTogZnVuY3Rpb24odDEwKSB7CiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdDEwOwogICAgICB9IH0sIGc0ID0gImVuIiwgRDQgPSB7fTsKICAgICAgRDRbZzRdID0gTTM7CiAgICAgIHZhciBwNyA9ICIkaXNEYXlqc09iamVjdCIsIFM1ID0gZnVuY3Rpb24odDEwKSB7CiAgICAgICAgcmV0dXJuIHQxMCBpbnN0YW5jZW9mIF80IHx8ICEoIXQxMCB8fCAhdDEwW3A3XSk7CiAgICAgIH0sIHczID0gZnVuY3Rpb24gdDEwKGUxMiwgbjE0LCByMTIpIHsKICAgICAgICB2YXIgaTEyOwogICAgICAgIGlmICghZTEyKSByZXR1cm4gZzQ7CiAgICAgICAgaWYgKCJzdHJpbmciID09IHR5cGVvZiBlMTIpIHsKICAgICAgICAgIHZhciBzMTAgPSBlMTIudG9Mb3dlckNhc2UoKTsKICAgICAgICAgIEQ0W3MxMF0gJiYgKGkxMiA9IHMxMCksIG4xNCAmJiAoRDRbczEwXSA9IG4xNCwgaTEyID0gczEwKTsKICAgICAgICAgIHZhciB1OCA9IGUxMi5zcGxpdCgiLSIpOwogICAgICAgICAgaWYgKCFpMTIgJiYgdTgubGVuZ3RoID4gMSkgcmV0dXJuIHQxMCh1OFswXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBhNiA9IGUxMi5uYW1lOwogICAgICAgICAgRDRbYTZdID0gZTEyLCBpMTIgPSBhNjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICFyMTIgJiYgaTEyICYmIChnNCA9IGkxMiksIGkxMiB8fCAhcjEyICYmIGc0OwogICAgICB9LCBPMiA9IGZ1bmN0aW9uKHQxMCwgZTEyKSB7CiAgICAgICAgaWYgKFM1KHQxMCkpIHJldHVybiB0MTAuY2xvbmUoKTsKICAgICAgICB2YXIgbjE0ID0gIm9iamVjdCIgPT0gdHlwZW9mIGUxMiA/IGUxMiA6IHt9OwogICAgICAgIHJldHVybiBuMTQuZGF0ZSA9IHQxMCwgbjE0LmFyZ3MgPSBhcmd1bWVudHMsIG5ldyBfNChuMTQpOwogICAgICB9LCBiNSA9IHY1OwogICAgICBiNS5sID0gdzMsIGI1LmkgPSBTNSwgYjUudyA9IGZ1bmN0aW9uKHQxMCwgZTEyKSB7CiAgICAgICAgcmV0dXJuIE8yKHQxMCwgeyBsb2NhbGU6IGUxMi4kTCwgdXRjOiBlMTIuJHUsIHg6IGUxMi4keCwgJG9mZnNldDogZTEyLiRvZmZzZXQgfSk7CiAgICAgIH07CiAgICAgIHZhciBfNCA9IChmdW5jdGlvbigpIHsKICAgICAgICBmdW5jdGlvbiBNNCh0MTApIHsKICAgICAgICAgIHRoaXMuJEwgPSB3Myh0MTAubG9jYWxlLCBudWxsLCB0cnVlKSwgdGhpcy5wYXJzZSh0MTApLCB0aGlzLiR4ID0gdGhpcy4keCB8fCB0MTAueCB8fCB7fSwgdGhpc1twN10gPSB0cnVlOwogICAgICAgIH0KICAgICAgICB2YXIgbTcgPSBNNC5wcm90b3R5cGU7CiAgICAgICAgcmV0dXJuIG03LnBhcnNlID0gZnVuY3Rpb24odDEwKSB7CiAgICAgICAgICB0aGlzLiRkID0gKGZ1bmN0aW9uKHQxMSkgewogICAgICAgICAgICB2YXIgZTEyID0gdDExLmRhdGUsIG4xNCA9IHQxMS51dGM7CiAgICAgICAgICAgIGlmIChudWxsID09PSBlMTIpIHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoTmFOKTsKICAgICAgICAgICAgaWYgKGI1LnUoZTEyKSkgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpOwogICAgICAgICAgICBpZiAoZTEyIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIG5ldyBEYXRlKGUxMik7CiAgICAgICAgICAgIGlmICgic3RyaW5nIiA9PSB0eXBlb2YgZTEyICYmICEvWiQvaS50ZXN0KGUxMikpIHsKICAgICAgICAgICAgICB2YXIgcjEyID0gZTEyLm1hdGNoKCQzKTsKICAgICAgICAgICAgICBpZiAocjEyKSB7CiAgICAgICAgICAgICAgICB2YXIgaTEyID0gcjEyWzJdIC0gMSB8fCAwLCBzMTAgPSAocjEyWzddIHx8ICIwIikuc3Vic3RyaW5nKDAsIDMpOwogICAgICAgICAgICAgICAgcmV0dXJuIG4xNCA/IG5ldyBEYXRlKERhdGUuVVRDKHIxMlsxXSwgaTEyLCByMTJbM10gfHwgMSwgcjEyWzRdIHx8IDAsIHIxMls1XSB8fCAwLCByMTJbNl0gfHwgMCwgczEwKSkgOiBuZXcgRGF0ZShyMTJbMV0sIGkxMiwgcjEyWzNdIHx8IDEsIHIxMls0XSB8fCAwLCByMTJbNV0gfHwgMCwgcjEyWzZdIHx8IDAsIHMxMCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShlMTIpOwogICAgICAgICAgfSkodDEwKSwgdGhpcy5pbml0KCk7CiAgICAgICAgfSwgbTcuaW5pdCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIHQxMCA9IHRoaXMuJGQ7CiAgICAgICAgICB0aGlzLiR5ID0gdDEwLmdldEZ1bGxZZWFyKCksIHRoaXMuJE0gPSB0MTAuZ2V0TW9udGgoKSwgdGhpcy4kRCA9IHQxMC5nZXREYXRlKCksIHRoaXMuJFcgPSB0MTAuZ2V0RGF5KCksIHRoaXMuJEggPSB0MTAuZ2V0SG91cnMoKSwgdGhpcy4kbSA9IHQxMC5nZXRNaW51dGVzKCksIHRoaXMuJHMgPSB0MTAuZ2V0U2Vjb25kcygpLCB0aGlzLiRtcyA9IHQxMC5nZXRNaWxsaXNlY29uZHMoKTsKICAgICAgICB9LCBtNy4kdXRpbHMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBiNTsKICAgICAgICB9LCBtNy5pc1ZhbGlkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gISh0aGlzLiRkLnRvU3RyaW5nKCkgPT09IGw2KTsKICAgICAgICB9LCBtNy5pc1NhbWUgPSBmdW5jdGlvbih0MTAsIGUxMikgewogICAgICAgICAgdmFyIG4xNCA9IE8yKHQxMCk7CiAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydE9mKGUxMikgPD0gbjE0ICYmIG4xNCA8PSB0aGlzLmVuZE9mKGUxMik7CiAgICAgICAgfSwgbTcuaXNBZnRlciA9IGZ1bmN0aW9uKHQxMCwgZTEyKSB7CiAgICAgICAgICByZXR1cm4gTzIodDEwKSA8IHRoaXMuc3RhcnRPZihlMTIpOwogICAgICAgIH0sIG03LmlzQmVmb3JlID0gZnVuY3Rpb24odDEwLCBlMTIpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmVuZE9mKGUxMikgPCBPMih0MTApOwogICAgICAgIH0sIG03LiRnID0gZnVuY3Rpb24odDEwLCBlMTIsIG4xNCkgewogICAgICAgICAgcmV0dXJuIGI1LnUodDEwKSA/IHRoaXNbZTEyXSA6IHRoaXMuc2V0KG4xNCwgdDEwKTsKICAgICAgICB9LCBtNy51bml4ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKSAvIDFlMyk7CiAgICAgICAgfSwgbTcudmFsdWVPZiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuJGQuZ2V0VGltZSgpOwogICAgICAgIH0sIG03LnN0YXJ0T2YgPSBmdW5jdGlvbih0MTAsIGUxMikgewogICAgICAgICAgdmFyIG4xNCA9IHRoaXMsIHIxMiA9ICEhYjUudShlMTIpIHx8IGUxMiwgZjggPSBiNS5wKHQxMCksIGw3ID0gZnVuY3Rpb24odDExLCBlMTMpIHsKICAgICAgICAgICAgdmFyIGkxMiA9IGI1LncobjE0LiR1ID8gRGF0ZS5VVEMobjE0LiR5LCBlMTMsIHQxMSkgOiBuZXcgRGF0ZShuMTQuJHksIGUxMywgdDExKSwgbjE0KTsKICAgICAgICAgICAgcmV0dXJuIHIxMiA/IGkxMiA6IGkxMi5lbmRPZihhNSk7CiAgICAgICAgICB9LCAkNCA9IGZ1bmN0aW9uKHQxMSwgZTEzKSB7CiAgICAgICAgICAgIHJldHVybiBiNS53KG4xNC50b0RhdGUoKVt0MTFdLmFwcGx5KG4xNC50b0RhdGUoInMiKSwgKHIxMiA/IFswLCAwLCAwLCAwXSA6IFsyMywgNTksIDU5LCA5OTldKS5zbGljZShlMTMpKSwgbjE0KTsKICAgICAgICAgIH0sIHk2ID0gdGhpcy4kVywgTTUgPSB0aGlzLiRNLCBtOCA9IHRoaXMuJEQsIHY2ID0gInNldCIgKyAodGhpcy4kdSA/ICJVVEMiIDogIiIpOwogICAgICAgICAgc3dpdGNoIChmOCkgewogICAgICAgICAgICBjYXNlIGg5OgogICAgICAgICAgICAgIHJldHVybiByMTIgPyBsNygxLCAwKSA6IGw3KDMxLCAxMSk7CiAgICAgICAgICAgIGNhc2UgYzExOgogICAgICAgICAgICAgIHJldHVybiByMTIgPyBsNygxLCBNNSkgOiBsNygwLCBNNSArIDEpOwogICAgICAgICAgICBjYXNlIG8xMzoKICAgICAgICAgICAgICB2YXIgZzUgPSB0aGlzLiRsb2NhbGUoKS53ZWVrU3RhcnQgfHwgMCwgRDUgPSAoeTYgPCBnNSA/IHk2ICsgNyA6IHk2KSAtIGc1OwogICAgICAgICAgICAgIHJldHVybiBsNyhyMTIgPyBtOCAtIEQ1IDogbTggKyAoNiAtIEQ1KSwgTTUpOwogICAgICAgICAgICBjYXNlIGE1OgogICAgICAgICAgICBjYXNlIGQ2OgogICAgICAgICAgICAgIHJldHVybiAkNCh2NiArICJIb3VycyIsIDApOwogICAgICAgICAgICBjYXNlIHU3OgogICAgICAgICAgICAgIHJldHVybiAkNCh2NiArICJNaW51dGVzIiwgMSk7CiAgICAgICAgICAgIGNhc2Ugczk6CiAgICAgICAgICAgICAgcmV0dXJuICQ0KHY2ICsgIlNlY29uZHMiLCAyKTsKICAgICAgICAgICAgY2FzZSBpMTE6CiAgICAgICAgICAgICAgcmV0dXJuICQ0KHY2ICsgIk1pbGxpc2Vjb25kcyIsIDMpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb25lKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgbTcuZW5kT2YgPSBmdW5jdGlvbih0MTApIHsKICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0T2YodDEwLCBmYWxzZSk7CiAgICAgICAgfSwgbTcuJHNldCA9IGZ1bmN0aW9uKHQxMCwgZTEyKSB7CiAgICAgICAgICB2YXIgbjE0LCBvMTQgPSBiNS5wKHQxMCksIGY4ID0gInNldCIgKyAodGhpcy4kdSA/ICJVVEMiIDogIiIpLCBsNyA9IChuMTQgPSB7fSwgbjE0W2E1XSA9IGY4ICsgIkRhdGUiLCBuMTRbZDZdID0gZjggKyAiRGF0ZSIsIG4xNFtjMTFdID0gZjggKyAiTW9udGgiLCBuMTRbaDldID0gZjggKyAiRnVsbFllYXIiLCBuMTRbdTddID0gZjggKyAiSG91cnMiLCBuMTRbczldID0gZjggKyAiTWludXRlcyIsIG4xNFtpMTFdID0gZjggKyAiU2Vjb25kcyIsIG4xNFtyMTFdID0gZjggKyAiTWlsbGlzZWNvbmRzIiwgbjE0KVtvMTRdLCAkNCA9IG8xNCA9PT0gYTUgPyB0aGlzLiREICsgKGUxMiAtIHRoaXMuJFcpIDogZTEyOwogICAgICAgICAgaWYgKG8xNCA9PT0gYzExIHx8IG8xNCA9PT0gaDkpIHsKICAgICAgICAgICAgdmFyIHk2ID0gdGhpcy5jbG9uZSgpLnNldChkNiwgMSk7CiAgICAgICAgICAgIHk2LiRkW2w3XSgkNCksIHk2LmluaXQoKSwgdGhpcy4kZCA9IHk2LnNldChkNiwgTWF0aC5taW4odGhpcy4kRCwgeTYuZGF5c0luTW9udGgoKSkpLiRkOwogICAgICAgICAgfSBlbHNlIGw3ICYmIHRoaXMuJGRbbDddKCQ0KTsKICAgICAgICAgIHJldHVybiB0aGlzLmluaXQoKSwgdGhpczsKICAgICAgICB9LCBtNy5zZXQgPSBmdW5jdGlvbih0MTAsIGUxMikgewogICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS4kc2V0KHQxMCwgZTEyKTsKICAgICAgICB9LCBtNy5nZXQgPSBmdW5jdGlvbih0MTApIHsKICAgICAgICAgIHJldHVybiB0aGlzW2I1LnAodDEwKV0oKTsKICAgICAgICB9LCBtNy5hZGQgPSBmdW5jdGlvbihyMTIsIGY4KSB7CiAgICAgICAgICB2YXIgZDcsIGw3ID0gdGhpczsKICAgICAgICAgIHIxMiA9IE51bWJlcihyMTIpOwogICAgICAgICAgdmFyICQ0ID0gYjUucChmOCksIHk2ID0gZnVuY3Rpb24odDEwKSB7CiAgICAgICAgICAgIHZhciBlMTIgPSBPMihsNyk7CiAgICAgICAgICAgIHJldHVybiBiNS53KGUxMi5kYXRlKGUxMi5kYXRlKCkgKyBNYXRoLnJvdW5kKHQxMCAqIHIxMikpLCBsNyk7CiAgICAgICAgICB9OwogICAgICAgICAgaWYgKCQ0ID09PSBjMTEpIHJldHVybiB0aGlzLnNldChjMTEsIHRoaXMuJE0gKyByMTIpOwogICAgICAgICAgaWYgKCQ0ID09PSBoOSkgcmV0dXJuIHRoaXMuc2V0KGg5LCB0aGlzLiR5ICsgcjEyKTsKICAgICAgICAgIGlmICgkNCA9PT0gYTUpIHJldHVybiB5NigxKTsKICAgICAgICAgIGlmICgkNCA9PT0gbzEzKSByZXR1cm4geTYoNyk7CiAgICAgICAgICB2YXIgTTUgPSAoZDcgPSB7fSwgZDdbczldID0gZTExLCBkN1t1N10gPSBuMTMsIGQ3W2kxMV0gPSB0OSwgZDcpWyQ0XSB8fCAxLCBtOCA9IHRoaXMuJGQuZ2V0VGltZSgpICsgcjEyICogTTU7CiAgICAgICAgICByZXR1cm4gYjUudyhtOCwgdGhpcyk7CiAgICAgICAgfSwgbTcuc3VidHJhY3QgPSBmdW5jdGlvbih0MTAsIGUxMikgewogICAgICAgICAgcmV0dXJuIHRoaXMuYWRkKC0xICogdDEwLCBlMTIpOwogICAgICAgIH0sIG03LmZvcm1hdCA9IGZ1bmN0aW9uKHQxMCkgewogICAgICAgICAgdmFyIGUxMiA9IHRoaXMsIG4xNCA9IHRoaXMuJGxvY2FsZSgpOwogICAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkgcmV0dXJuIG4xNC5pbnZhbGlkRGF0ZSB8fCBsNjsKICAgICAgICAgIHZhciByMTIgPSB0MTAgfHwgIllZWVktTU0tRERUSEg6bW06c3NaIiwgaTEyID0gYjUueih0aGlzKSwgczEwID0gdGhpcy4kSCwgdTggPSB0aGlzLiRtLCBhNiA9IHRoaXMuJE0sIG8xNCA9IG4xNC53ZWVrZGF5cywgYzEyID0gbjE0Lm1vbnRocywgZjggPSBuMTQubWVyaWRpZW0sIGgxMCA9IGZ1bmN0aW9uKHQxMSwgbjE1LCBpMTMsIHMxMSkgewogICAgICAgICAgICByZXR1cm4gdDExICYmICh0MTFbbjE1XSB8fCB0MTEoZTEyLCByMTIpKSB8fCBpMTNbbjE1XS5zbGljZSgwLCBzMTEpOwogICAgICAgICAgfSwgZDcgPSBmdW5jdGlvbih0MTEpIHsKICAgICAgICAgICAgcmV0dXJuIGI1LnMoczEwICUgMTIgfHwgMTIsIHQxMSwgIjAiKTsKICAgICAgICAgIH0sICQ0ID0gZjggfHwgZnVuY3Rpb24odDExLCBlMTMsIG4xNSkgewogICAgICAgICAgICB2YXIgcjEzID0gdDExIDwgMTIgPyAiQU0iIDogIlBNIjsKICAgICAgICAgICAgcmV0dXJuIG4xNSA/IHIxMy50b0xvd2VyQ2FzZSgpIDogcjEzOwogICAgICAgICAgfTsKICAgICAgICAgIHJldHVybiByMTIucmVwbGFjZSh5NSwgKGZ1bmN0aW9uKHQxMSwgcjEzKSB7CiAgICAgICAgICAgIHJldHVybiByMTMgfHwgKGZ1bmN0aW9uKHQxMikgewogICAgICAgICAgICAgIHN3aXRjaCAodDEyKSB7CiAgICAgICAgICAgICAgICBjYXNlICJZWSI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZTEyLiR5KS5zbGljZSgtMik7CiAgICAgICAgICAgICAgICBjYXNlICJZWVlZIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGI1LnMoZTEyLiR5LCA0LCAiMCIpOwogICAgICAgICAgICAgICAgY2FzZSAiTSI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBhNiArIDE7CiAgICAgICAgICAgICAgICBjYXNlICJNTSI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBiNS5zKGE2ICsgMSwgMiwgIjAiKTsKICAgICAgICAgICAgICAgIGNhc2UgIk1NTSI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBoMTAobjE0Lm1vbnRoc1Nob3J0LCBhNiwgYzEyLCAzKTsKICAgICAgICAgICAgICAgIGNhc2UgIk1NTU0iOgogICAgICAgICAgICAgICAgICByZXR1cm4gaDEwKGMxMiwgYTYpOwogICAgICAgICAgICAgICAgY2FzZSAiRCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBlMTIuJEQ7CiAgICAgICAgICAgICAgICBjYXNlICJERCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBiNS5zKGUxMi4kRCwgMiwgIjAiKTsKICAgICAgICAgICAgICAgIGNhc2UgImQiOgogICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGUxMi4kVyk7CiAgICAgICAgICAgICAgICBjYXNlICJkZCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBoMTAobjE0LndlZWtkYXlzTWluLCBlMTIuJFcsIG8xNCwgMik7CiAgICAgICAgICAgICAgICBjYXNlICJkZGQiOgogICAgICAgICAgICAgICAgICByZXR1cm4gaDEwKG4xNC53ZWVrZGF5c1Nob3J0LCBlMTIuJFcsIG8xNCwgMyk7CiAgICAgICAgICAgICAgICBjYXNlICJkZGRkIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIG8xNFtlMTIuJFddOwogICAgICAgICAgICAgICAgY2FzZSAiSCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoczEwKTsKICAgICAgICAgICAgICAgIGNhc2UgIkhIIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGI1LnMoczEwLCAyLCAiMCIpOwogICAgICAgICAgICAgICAgY2FzZSAiaCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBkNygxKTsKICAgICAgICAgICAgICAgIGNhc2UgImhoIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ3KDIpOwogICAgICAgICAgICAgICAgY2FzZSAiYSI6CiAgICAgICAgICAgICAgICAgIHJldHVybiAkNChzMTAsIHU4LCB0cnVlKTsKICAgICAgICAgICAgICAgIGNhc2UgIkEiOgogICAgICAgICAgICAgICAgICByZXR1cm4gJDQoczEwLCB1OCwgZmFsc2UpOwogICAgICAgICAgICAgICAgY2FzZSAibSI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodTgpOwogICAgICAgICAgICAgICAgY2FzZSAibW0iOgogICAgICAgICAgICAgICAgICByZXR1cm4gYjUucyh1OCwgMiwgIjAiKTsKICAgICAgICAgICAgICAgIGNhc2UgInMiOgogICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGUxMi4kcyk7CiAgICAgICAgICAgICAgICBjYXNlICJzcyI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBiNS5zKGUxMi4kcywgMiwgIjAiKTsKICAgICAgICAgICAgICAgIGNhc2UgIlNTUyI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBiNS5zKGUxMi4kbXMsIDMsICIwIik7CiAgICAgICAgICAgICAgICBjYXNlICJaIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGkxMjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0pKHQxMSkgfHwgaTEyLnJlcGxhY2UoIjoiLCAiIik7CiAgICAgICAgICB9KSk7CiAgICAgICAgfSwgbTcudXRjT2Zmc2V0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gMTUgKiAtTWF0aC5yb3VuZCh0aGlzLiRkLmdldFRpbWV6b25lT2Zmc2V0KCkgLyAxNSk7CiAgICAgICAgfSwgbTcuZGlmZiA9IGZ1bmN0aW9uKHIxMiwgZDcsIGw3KSB7CiAgICAgICAgICB2YXIgJDQsIHk2ID0gdGhpcywgTTUgPSBiNS5wKGQ3KSwgbTggPSBPMihyMTIpLCB2NiA9IChtOC51dGNPZmZzZXQoKSAtIHRoaXMudXRjT2Zmc2V0KCkpICogZTExLCBnNSA9IHRoaXMgLSBtOCwgRDUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGI1Lm0oeTYsIG04KTsKICAgICAgICAgIH07CiAgICAgICAgICBzd2l0Y2ggKE01KSB7CiAgICAgICAgICAgIGNhc2UgaDk6CiAgICAgICAgICAgICAgJDQgPSBENSgpIC8gMTI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgYzExOgogICAgICAgICAgICAgICQ0ID0gRDUoKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBmNzoKICAgICAgICAgICAgICAkNCA9IEQ1KCkgLyAzOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIG8xMzoKICAgICAgICAgICAgICAkNCA9IChnNSAtIHY2KSAvIDYwNDhlNTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBhNToKICAgICAgICAgICAgICAkNCA9IChnNSAtIHY2KSAvIDg2NGU1OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHU3OgogICAgICAgICAgICAgICQ0ID0gZzUgLyBuMTM7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2Ugczk6CiAgICAgICAgICAgICAgJDQgPSBnNSAvIGUxMTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBpMTE6CiAgICAgICAgICAgICAgJDQgPSBnNSAvIHQ5OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICQ0ID0gZzU7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbDcgPyAkNCA6IGI1LmEoJDQpOwogICAgICAgIH0sIG03LmRheXNJbk1vbnRoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5lbmRPZihjMTEpLiREOwogICAgICAgIH0sIG03LiRsb2NhbGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBENFt0aGlzLiRMXTsKICAgICAgICB9LCBtNy5sb2NhbGUgPSBmdW5jdGlvbih0MTAsIGUxMikgewogICAgICAgICAgaWYgKCF0MTApIHJldHVybiB0aGlzLiRMOwogICAgICAgICAgdmFyIG4xNCA9IHRoaXMuY2xvbmUoKSwgcjEyID0gdzModDEwLCBlMTIsIHRydWUpOwogICAgICAgICAgcmV0dXJuIHIxMiAmJiAobjE0LiRMID0gcjEyKSwgbjE0OwogICAgICAgIH0sIG03LmNsb25lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gYjUudyh0aGlzLiRkLCB0aGlzKTsKICAgICAgICB9LCBtNy50b0RhdGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSk7CiAgICAgICAgfSwgbTcudG9KU09OID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLnRvSVNPU3RyaW5nKCkgOiBudWxsOwogICAgICAgIH0sIG03LnRvSVNPU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4kZC50b0lTT1N0cmluZygpOwogICAgICAgIH0sIG03LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4kZC50b1VUQ1N0cmluZygpOwogICAgICAgIH0sIE00OwogICAgICB9KSgpLCBrNCA9IF80LnByb3RvdHlwZTsKICAgICAgcmV0dXJuIE8yLnByb3RvdHlwZSA9IGs0LCBbWyIkbXMiLCByMTFdLCBbIiRzIiwgaTExXSwgWyIkbSIsIHM5XSwgWyIkSCIsIHU3XSwgWyIkVyIsIGE1XSwgWyIkTSIsIGMxMV0sIFsiJHkiLCBoOV0sIFsiJEQiLCBkNl1dLmZvckVhY2goKGZ1bmN0aW9uKHQxMCkgewogICAgICAgIGs0W3QxMFsxXV0gPSBmdW5jdGlvbihlMTIpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiRnKGUxMiwgdDEwWzBdLCB0MTBbMV0pOwogICAgICAgIH07CiAgICAgIH0pKSwgTzIuZXh0ZW5kID0gZnVuY3Rpb24odDEwLCBlMTIpIHsKICAgICAgICByZXR1cm4gdDEwLiRpIHx8ICh0MTAoZTEyLCBfNCwgTzIpLCB0MTAuJGkgPSB0cnVlKSwgTzI7CiAgICAgIH0sIE8yLmxvY2FsZSA9IHczLCBPMi5pc0RheWpzID0gUzUsIE8yLnVuaXggPSBmdW5jdGlvbih0MTApIHsKICAgICAgICByZXR1cm4gTzIoMWUzICogdDEwKTsKICAgICAgfSwgTzIuZW4gPSBENFtnNF0sIE8yLkxzID0gRDQsIE8yLnAgPSB7fSwgTzI7CiAgICB9KSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXlqc0AxLjExLjE5L25vZGVfbW9kdWxlcy9kYXlqcy9wbHVnaW4vaXNUb2RheS5qcwp2YXIgcmVxdWlyZV9pc1RvZGF5ID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXlqc0AxLjExLjE5L25vZGVfbW9kdWxlcy9kYXlqcy9wbHVnaW4vaXNUb2RheS5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAhKGZ1bmN0aW9uKGUxMSwgbzEzKSB7CiAgICAgICJvYmplY3QiID09IHR5cGVvZiBleHBvcnRzICYmICJ1bmRlZmluZWQiICE9IHR5cGVvZiBtb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA9IG8xMygpIDogImZ1bmN0aW9uIiA9PSB0eXBlb2YgZGVmaW5lICYmIGRlZmluZS5hbWQgPyBkZWZpbmUobzEzKSA6IChlMTEgPSAidW5kZWZpbmVkIiAhPSB0eXBlb2YgZ2xvYmFsVGhpcyA/IGdsb2JhbFRoaXMgOiBlMTEgfHwgc2VsZikuZGF5anNfcGx1Z2luX2lzVG9kYXkgPSBvMTMoKTsKICAgIH0pKGV4cG9ydHMsIChmdW5jdGlvbigpIHsKICAgICAgInVzZSBzdHJpY3QiOwogICAgICByZXR1cm4gZnVuY3Rpb24oZTExLCBvMTMsIHQ5KSB7CiAgICAgICAgbzEzLnByb3RvdHlwZS5pc1RvZGF5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgZTEyID0gIllZWVktTU0tREQiLCBvMTQgPSB0OSgpOwogICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KGUxMikgPT09IG8xNC5mb3JtYXQoZTEyKTsKICAgICAgICB9OwogICAgICB9OwogICAgfSkpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcGFyc2UtbXNANC4wLjAvbm9kZV9tb2R1bGVzL3BhcnNlLW1zL2luZGV4LmpzCmZ1bmN0aW9uIHBhcnNlTnVtYmVyKG1pbGxpc2Vjb25kczIpIHsKICByZXR1cm4gewogICAgZGF5czogTWF0aC50cnVuYyhtaWxsaXNlY29uZHMyIC8gODY0ZTUpLAogICAgaG91cnM6IE1hdGgudHJ1bmMobWlsbGlzZWNvbmRzMiAvIDM2ZTUgJSAyNCksCiAgICBtaW51dGVzOiBNYXRoLnRydW5jKG1pbGxpc2Vjb25kczIgLyA2ZTQgJSA2MCksCiAgICBzZWNvbmRzOiBNYXRoLnRydW5jKG1pbGxpc2Vjb25kczIgLyAxZTMgJSA2MCksCiAgICBtaWxsaXNlY29uZHM6IE1hdGgudHJ1bmMobWlsbGlzZWNvbmRzMiAlIDFlMyksCiAgICBtaWNyb3NlY29uZHM6IE1hdGgudHJ1bmModG9aZXJvSWZJbmZpbml0eShtaWxsaXNlY29uZHMyICogMWUzKSAlIDFlMyksCiAgICBuYW5vc2Vjb25kczogTWF0aC50cnVuYyh0b1plcm9JZkluZmluaXR5KG1pbGxpc2Vjb25kczIgKiAxZTYpICUgMWUzKQogIH07Cn0KZnVuY3Rpb24gcGFyc2VCaWdpbnQobWlsbGlzZWNvbmRzMikgewogIHJldHVybiB7CiAgICBkYXlzOiBtaWxsaXNlY29uZHMyIC8gODY0MDAwMDBuLAogICAgaG91cnM6IG1pbGxpc2Vjb25kczIgLyAzNjAwMDAwbiAlIDI0biwKICAgIG1pbnV0ZXM6IG1pbGxpc2Vjb25kczIgLyA2MDAwMG4gJSA2MG4sCiAgICBzZWNvbmRzOiBtaWxsaXNlY29uZHMyIC8gMTAwMG4gJSA2MG4sCiAgICBtaWxsaXNlY29uZHM6IG1pbGxpc2Vjb25kczIgJSAxMDAwbiwKICAgIG1pY3Jvc2Vjb25kczogMG4sCiAgICBuYW5vc2Vjb25kczogMG4KICB9Owp9CmZ1bmN0aW9uIHBhcnNlTWlsbGlzZWNvbmRzKG1pbGxpc2Vjb25kczIpIHsKICBzd2l0Y2ggKHR5cGVvZiBtaWxsaXNlY29uZHMyKSB7CiAgICBjYXNlICJudW1iZXIiOiB7CiAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUobWlsbGlzZWNvbmRzMikpIHsKICAgICAgICByZXR1cm4gcGFyc2VOdW1iZXIobWlsbGlzZWNvbmRzMik7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlICJiaWdpbnQiOiB7CiAgICAgIHJldHVybiBwYXJzZUJpZ2ludChtaWxsaXNlY29uZHMyKTsKICAgIH0KICB9CiAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBmaW5pdGUgbnVtYmVyIG9yIGJpZ2ludCIpOwp9CnZhciB0b1plcm9JZkluZmluaXR5Owp2YXIgaW5pdF9wYXJzZV9tcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3BhcnNlLW1zQDQuMC4wL25vZGVfbW9kdWxlcy9wYXJzZS1tcy9pbmRleC5qcyIoKSB7CiAgICB0b1plcm9JZkluZmluaXR5ID0gKHZhbHVlMikgPT4gTnVtYmVyLmlzRmluaXRlKHZhbHVlMikgPyB2YWx1ZTIgOiAwOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LW1zQDkuMy4wL25vZGVfbW9kdWxlcy9wcmV0dHktbXMvaW5kZXguanMKZnVuY3Rpb24gcHJldHR5TWlsbGlzZWNvbmRzKG1pbGxpc2Vjb25kczIsIG9wdGlvbnMpIHsKICBjb25zdCBpc0JpZ0ludCA9IHR5cGVvZiBtaWxsaXNlY29uZHMyID09PSAiYmlnaW50IjsKICBpZiAoIWlzQmlnSW50ICYmICFOdW1iZXIuaXNGaW5pdGUobWlsbGlzZWNvbmRzMikpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZmluaXRlIG51bWJlciBvciBiaWdpbnQiKTsKICB9CiAgb3B0aW9ucyA9IHsgLi4ub3B0aW9ucyB9OwogIGNvbnN0IHNpZ24gPSBtaWxsaXNlY29uZHMyIDwgMCA/ICItIiA6ICIiOwogIG1pbGxpc2Vjb25kczIgPSBtaWxsaXNlY29uZHMyIDwgMCA/IC1taWxsaXNlY29uZHMyIDogbWlsbGlzZWNvbmRzMjsKICBpZiAob3B0aW9ucy5jb2xvbk5vdGF0aW9uKSB7CiAgICBvcHRpb25zLmNvbXBhY3QgPSBmYWxzZTsKICAgIG9wdGlvbnMuZm9ybWF0U3ViTWlsbGlzZWNvbmRzID0gZmFsc2U7CiAgICBvcHRpb25zLnNlcGFyYXRlTWlsbGlzZWNvbmRzID0gZmFsc2U7CiAgICBvcHRpb25zLnZlcmJvc2UgPSBmYWxzZTsKICB9CiAgaWYgKG9wdGlvbnMuY29tcGFjdCkgewogICAgb3B0aW9ucy51bml0Q291bnQgPSAxOwogICAgb3B0aW9ucy5zZWNvbmRzRGVjaW1hbERpZ2l0cyA9IDA7CiAgICBvcHRpb25zLm1pbGxpc2Vjb25kc0RlY2ltYWxEaWdpdHMgPSAwOwogIH0KICBsZXQgcmVzdWx0ID0gW107CiAgY29uc3QgZmxvb3JEZWNpbWFscyA9ICh2YWx1ZTIsIGRlY2ltYWxEaWdpdHMpID0+IHsKICAgIGNvbnN0IGZsb29yZWRJbnRlcmltVmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlMiAqIDEwICoqIGRlY2ltYWxEaWdpdHMgKyBTRUNPTkRfUk9VTkRJTkdfRVBTSUxPTik7CiAgICBjb25zdCBmbG9vcmVkVmFsdWUgPSBNYXRoLnJvdW5kKGZsb29yZWRJbnRlcmltVmFsdWUpIC8gMTAgKiogZGVjaW1hbERpZ2l0czsKICAgIHJldHVybiBmbG9vcmVkVmFsdWUudG9GaXhlZChkZWNpbWFsRGlnaXRzKTsKICB9OwogIGNvbnN0IGFkZDMgPSAodmFsdWUyLCBsb25nLCBzaG9ydCwgdmFsdWVTdHJpbmcpID0+IHsKICAgIGlmICgocmVzdWx0Lmxlbmd0aCA9PT0gMCB8fCAhb3B0aW9ucy5jb2xvbk5vdGF0aW9uKSAmJiBpc1plcm8odmFsdWUyKSAmJiAhKG9wdGlvbnMuY29sb25Ob3RhdGlvbiAmJiBzaG9ydCA9PT0gIm0iKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB2YWx1ZVN0cmluZyA/Pz0gU3RyaW5nKHZhbHVlMik7CiAgICBpZiAob3B0aW9ucy5jb2xvbk5vdGF0aW9uKSB7CiAgICAgIGNvbnN0IHdob2xlRGlnaXRzID0gdmFsdWVTdHJpbmcuaW5jbHVkZXMoIi4iKSA/IHZhbHVlU3RyaW5nLnNwbGl0KCIuIilbMF0ubGVuZ3RoIDogdmFsdWVTdHJpbmcubGVuZ3RoOwogICAgICBjb25zdCBtaW5MZW5ndGggPSByZXN1bHQubGVuZ3RoID4gMCA/IDIgOiAxOwogICAgICB2YWx1ZVN0cmluZyA9ICIwIi5yZXBlYXQoTWF0aC5tYXgoMCwgbWluTGVuZ3RoIC0gd2hvbGVEaWdpdHMpKSArIHZhbHVlU3RyaW5nOwogICAgfSBlbHNlIHsKICAgICAgdmFsdWVTdHJpbmcgKz0gb3B0aW9ucy52ZXJib3NlID8gIiAiICsgcGx1cmFsaXplKGxvbmcsIHZhbHVlMikgOiBzaG9ydDsKICAgIH0KICAgIHJlc3VsdC5wdXNoKHZhbHVlU3RyaW5nKTsKICB9OwogIGNvbnN0IHBhcnNlZCA9IHBhcnNlTWlsbGlzZWNvbmRzKG1pbGxpc2Vjb25kczIpOwogIGNvbnN0IGRheXMyID0gQmlnSW50KHBhcnNlZC5kYXlzKTsKICBpZiAob3B0aW9ucy5oaWRlWWVhckFuZERheXMpIHsKICAgIGFkZDMoQmlnSW50KGRheXMyKSAqIDI0biArIEJpZ0ludChwYXJzZWQuaG91cnMpLCAiaG91ciIsICJoIik7CiAgfSBlbHNlIHsKICAgIGlmIChvcHRpb25zLmhpZGVZZWFyKSB7CiAgICAgIGFkZDMoZGF5czIsICJkYXkiLCAiZCIpOwogICAgfSBlbHNlIHsKICAgICAgYWRkMyhkYXlzMiAvIDM2NW4sICJ5ZWFyIiwgInkiKTsKICAgICAgYWRkMyhkYXlzMiAlIDM2NW4sICJkYXkiLCAiZCIpOwogICAgfQogICAgYWRkMyhOdW1iZXIocGFyc2VkLmhvdXJzKSwgImhvdXIiLCAiaCIpOwogIH0KICBhZGQzKE51bWJlcihwYXJzZWQubWludXRlcyksICJtaW51dGUiLCAibSIpOwogIGlmICghb3B0aW9ucy5oaWRlU2Vjb25kcykgewogICAgaWYgKG9wdGlvbnMuc2VwYXJhdGVNaWxsaXNlY29uZHMgfHwgb3B0aW9ucy5mb3JtYXRTdWJNaWxsaXNlY29uZHMgfHwgIW9wdGlvbnMuY29sb25Ob3RhdGlvbiAmJiBtaWxsaXNlY29uZHMyIDwgMWUzICYmICFvcHRpb25zLnN1YlNlY29uZHNBc0RlY2ltYWxzKSB7CiAgICAgIGNvbnN0IHNlY29uZHMgPSBOdW1iZXIocGFyc2VkLnNlY29uZHMpOwogICAgICBjb25zdCBtaWxsaXNlY29uZHMzID0gTnVtYmVyKHBhcnNlZC5taWxsaXNlY29uZHMpOwogICAgICBjb25zdCBtaWNyb3NlY29uZHMgPSBOdW1iZXIocGFyc2VkLm1pY3Jvc2Vjb25kcyk7CiAgICAgIGNvbnN0IG5hbm9zZWNvbmRzID0gTnVtYmVyKHBhcnNlZC5uYW5vc2Vjb25kcyk7CiAgICAgIGFkZDMoc2Vjb25kcywgInNlY29uZCIsICJzIik7CiAgICAgIGlmIChvcHRpb25zLmZvcm1hdFN1Yk1pbGxpc2Vjb25kcykgewogICAgICAgIGFkZDMobWlsbGlzZWNvbmRzMywgIm1pbGxpc2Vjb25kIiwgIm1zIik7CiAgICAgICAgYWRkMyhtaWNyb3NlY29uZHMsICJtaWNyb3NlY29uZCIsICJceEI1cyIpOwogICAgICAgIGFkZDMobmFub3NlY29uZHMsICJuYW5vc2Vjb25kIiwgIm5zIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgbWlsbGlzZWNvbmRzQW5kQmVsb3cgPSBtaWxsaXNlY29uZHMzICsgbWljcm9zZWNvbmRzIC8gMWUzICsgbmFub3NlY29uZHMgLyAxZTY7CiAgICAgICAgY29uc3QgbWlsbGlzZWNvbmRzRGVjaW1hbERpZ2l0cyA9IHR5cGVvZiBvcHRpb25zLm1pbGxpc2Vjb25kc0RlY2ltYWxEaWdpdHMgPT09ICJudW1iZXIiID8gb3B0aW9ucy5taWxsaXNlY29uZHNEZWNpbWFsRGlnaXRzIDogMDsKICAgICAgICBjb25zdCByb3VuZGVkTWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzQW5kQmVsb3cgPj0gMSA/IE1hdGgucm91bmQobWlsbGlzZWNvbmRzQW5kQmVsb3cpIDogTWF0aC5jZWlsKG1pbGxpc2Vjb25kc0FuZEJlbG93KTsKICAgICAgICBjb25zdCBtaWxsaXNlY29uZHNTdHJpbmcgPSBtaWxsaXNlY29uZHNEZWNpbWFsRGlnaXRzID8gbWlsbGlzZWNvbmRzQW5kQmVsb3cudG9GaXhlZChtaWxsaXNlY29uZHNEZWNpbWFsRGlnaXRzKSA6IHJvdW5kZWRNaWxsaXNlY29uZHM7CiAgICAgICAgYWRkMygKICAgICAgICAgIE51bWJlci5wYXJzZUZsb2F0KG1pbGxpc2Vjb25kc1N0cmluZyksCiAgICAgICAgICAibWlsbGlzZWNvbmQiLAogICAgICAgICAgIm1zIiwKICAgICAgICAgIG1pbGxpc2Vjb25kc1N0cmluZwogICAgICAgICk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHNlY29uZHMgPSAoaXNCaWdJbnQgPyBOdW1iZXIobWlsbGlzZWNvbmRzMiAlIE9ORV9EQVlfSU5fTUlMTElTRUNPTkRTKSA6IG1pbGxpc2Vjb25kczIpIC8gMWUzICUgNjA7CiAgICAgIGNvbnN0IHNlY29uZHNEZWNpbWFsRGlnaXRzID0gdHlwZW9mIG9wdGlvbnMuc2Vjb25kc0RlY2ltYWxEaWdpdHMgPT09ICJudW1iZXIiID8gb3B0aW9ucy5zZWNvbmRzRGVjaW1hbERpZ2l0cyA6IDE7CiAgICAgIGNvbnN0IHNlY29uZHNGaXhlZCA9IGZsb29yRGVjaW1hbHMoc2Vjb25kcywgc2Vjb25kc0RlY2ltYWxEaWdpdHMpOwogICAgICBjb25zdCBzZWNvbmRzU3RyaW5nID0gb3B0aW9ucy5rZWVwRGVjaW1hbHNPbldob2xlU2Vjb25kcyA/IHNlY29uZHNGaXhlZCA6IHNlY29uZHNGaXhlZC5yZXBsYWNlKC9cLjArJC8sICIiKTsKICAgICAgYWRkMyhOdW1iZXIucGFyc2VGbG9hdChzZWNvbmRzU3RyaW5nKSwgInNlY29uZCIsICJzIiwgc2Vjb25kc1N0cmluZyk7CiAgICB9CiAgfQogIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4gc2lnbiArICIwIiArIChvcHRpb25zLnZlcmJvc2UgPyAiIG1pbGxpc2Vjb25kcyIgOiAibXMiKTsKICB9CiAgY29uc3Qgc2VwYXJhdG9yID0gb3B0aW9ucy5jb2xvbk5vdGF0aW9uID8gIjoiIDogIiAiOwogIGlmICh0eXBlb2Ygb3B0aW9ucy51bml0Q291bnQgPT09ICJudW1iZXIiKSB7CiAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgTWF0aC5tYXgob3B0aW9ucy51bml0Q291bnQsIDEpKTsKICB9CiAgcmV0dXJuIHNpZ24gKyByZXN1bHQuam9pbihzZXBhcmF0b3IpOwp9CnZhciBpc1plcm8sIHBsdXJhbGl6ZSwgU0VDT05EX1JPVU5ESU5HX0VQU0lMT04sIE9ORV9EQVlfSU5fTUlMTElTRUNPTkRTOwp2YXIgaW5pdF9wcmV0dHlfbXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9wcmV0dHktbXNAOS4zLjAvbm9kZV9tb2R1bGVzL3ByZXR0eS1tcy9pbmRleC5qcyIoKSB7CiAgICBpbml0X3BhcnNlX21zKCk7CiAgICBpc1plcm8gPSAodmFsdWUyKSA9PiB2YWx1ZTIgPT09IDAgfHwgdmFsdWUyID09PSAwbjsKICAgIHBsdXJhbGl6ZSA9ICh3b3JkLCBjb3VudDIpID0+IGNvdW50MiA9PT0gMSB8fCBjb3VudDIgPT09IDFuID8gd29yZCA6IGAke3dvcmR9c2A7CiAgICBTRUNPTkRfUk9VTkRJTkdfRVBTSUxPTiA9IDFlLTc7CiAgICBPTkVfREFZX0lOX01JTExJU0VDT05EUyA9IDI0biAqIDYwbiAqIDYwbiAqIDEwMDBuOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMS4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUucGx1Z2lucy5qcwp2YXIgaW1wb3J0X2RheWpzLCBpbXBvcnRfaXNUb2RheTsKdmFyIGluaXRfc21hcnR0aW1lX3BsdWdpbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4xLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5wbHVnaW5zLmpzIigpIHsKICAgIGluaXRfZGlzdF90czcoKTsKICAgIGluaXRfZGlzdF90czMoKTsKICAgIGluaXRfZGlzdF90cygpOwogICAgaW5pdF9jcm9uZXIoKTsKICAgIGluaXRfZGF0ZV9mbnMoKTsKICAgIGltcG9ydF9kYXlqcyA9IF9fdG9FU00ocmVxdWlyZV9kYXlqc19taW4oKSwgMSk7CiAgICBpbXBvcnRfaXNUb2RheSA9IF9fdG9FU00ocmVxdWlyZV9pc1RvZGF5KCksIDEpOwogICAgaW5pdF9wcmV0dHlfbXMoKTsKICAgIGltcG9ydF9kYXlqcy5kZWZhdWx0LmV4dGVuZChpbXBvcnRfaXNUb2RheS5kZWZhdWx0KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjEuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuY3JvbnBhcnNlci5qcwp2YXIgQ3JvblBhcnNlcjsKdmFyIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfY3JvbnBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjEuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuY3JvbnBhcnNlci5qcyIoKSB7CiAgICBpbml0X3NtYXJ0dGltZV9wbHVnaW5zKCk7CiAgICBDcm9uUGFyc2VyID0gY2xhc3MgewogICAgICBnZXQgY3JvbkFycmF5KCkgewogICAgICAgIHJldHVybiB0aGlzLmNyb25FeHByZXNzaW9uLnNwbGl0KCIgIik7CiAgICAgIH0KICAgICAgY29uc3RydWN0b3IoY3JvbkV4cHJlc3Npb25BcmcpIHsKICAgICAgICB0aGlzLmNyb25FeHByZXNzaW9uID0gY3JvbkV4cHJlc3Npb25Bcmc7CiAgICAgICAgaWYgKHRoaXMuY3JvbkFycmF5Lmxlbmd0aCA8IDYpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ3JvblBhcnNlciBuZWVkcyBzZWNvbmQgbGV2ZWwgYWNjdXJhY3kiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZ2V0TmV4dFBhcnRNYXRjaChjcm9uUGFydCwgc3RhcnRWYWx1ZSwgbW9kdWxvQXJnKSB7CiAgICAgICAgaWYgKGNyb25QYXJ0ID09PSAiKiIpIHsKICAgICAgICAgIHJldHVybiBzdGFydFZhbHVlOwogICAgICAgIH0KICAgICAgICBpZiAoY3JvblBhcnQuaW5jbHVkZXMoIi8iKSkgewogICAgICAgICAgY29uc3QgZXZlcnkzID0gcGFyc2VJbnQoY3JvblBhcnQuc3BsaXQoIi8iKVsxXSwgMTApOwogICAgICAgICAgY29uc3QgZmluZEV2ZW5NYXRjaCA9IChyZWN1cnNpb25TdGFydEFyZykgPT4gewogICAgICAgICAgICBpZiAocmVjdXJzaW9uU3RhcnRBcmcgJSBldmVyeTMgPT09IDApIHsKICAgICAgICAgICAgICByZXR1cm4gcmVjdXJzaW9uU3RhcnRBcmc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZpbmRFdmVuTWF0Y2gocmVjdXJzaW9uU3RhcnRBcmcgKyAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIHJldHVybiBmaW5kRXZlbk1hdGNoKHN0YXJ0VmFsdWUpOwogICAgICAgIH0KICAgICAgICBpZiAocGFyc2VJbnQoY3JvblBhcnQsIDEwKSB8fCBjcm9uUGFydCA9PT0gIjAiKSB7CiAgICAgICAgICBjb25zdCBtYXRjaDIgPSBwYXJzZUludChjcm9uUGFydCwgMTApOwogICAgICAgICAgcmV0dXJuIG1hdGNoMjsKICAgICAgICB9CiAgICAgIH0KICAgICAgbXNUb05leHQoKSB7CiAgICAgICAgY29uc3QgY3JvbkFycmF5ID0gdGhpcy5jcm9uQXJyYXk7CiAgICAgICAgY29uc3Qgc2Vjb25kRXhwcmVzc2lvbiA9IGNyb25BcnJheVswXTsKICAgICAgICBjb25zdCBtaW51dGVFeHByZXNzaW9uID0gY3JvbkFycmF5WzFdOwogICAgICAgIGNvbnN0IGhvdXJFeHByZXNzaW9uID0gY3JvbkFycmF5WzJdOwogICAgICAgIGNvbnN0IGRheUV4cHJlc3Npb24gPSBjcm9uQXJyYXlbM107CiAgICAgICAgY29uc3QgbW9udGhFeHByZXNzaW9uID0gY3JvbkFycmF5WzRdOwogICAgICAgIGNvbnN0IHllYXJFeHByZXNzaW9uID0gY3JvbkFycmF5WzVdOwogICAgICAgIGxldCBjdXJyZW50RGF0ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpOwogICAgICAgIGxldCBjdXJyZW50U2Vjb25kID0gY3VycmVudERhdGUuZ2V0U2Vjb25kcygpICsgMTsKICAgICAgICBsZXQgY3VycmVudE1pbnV0ZSA9IGN1cnJlbnREYXRlLmdldE1pbnV0ZXMoKTsKICAgICAgICBsZXQgY3VycmVudEhvdXIgPSBjdXJyZW50RGF0ZS5nZXRIb3VycygpOwogICAgICAgIGxldCBjdXJyZW50RGF5ID0gY3VycmVudERhdGUuZ2V0RGF0ZSgpOwogICAgICAgIGxldCBjdXJyZW50TW9udGggPSBjdXJyZW50RGF0ZS5nZXRNb250aCgpOwogICAgICAgIGxldCBjdXJyZW50WWVhciA9IGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCk7CiAgICAgICAgY29uc3QgdGFyZ2V0U2Vjb25kID0gdGhpcy5nZXROZXh0UGFydE1hdGNoKHNlY29uZEV4cHJlc3Npb24sIGN1cnJlbnRTZWNvbmQsIDU5KTsKICAgICAgICBpZiAodGFyZ2V0U2Vjb25kIDwgY3VycmVudFNlY29uZCkgewogICAgICAgICAgY3VycmVudE1pbnV0ZSA9IChjdXJyZW50TWludXRlICsgMSkgJSA1OTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdGFyZ2V0TWludXRlID0gdGhpcy5nZXROZXh0UGFydE1hdGNoKG1pbnV0ZUV4cHJlc3Npb24sIGN1cnJlbnRNaW51dGUsIDU5KTsKICAgICAgICBpZiAodGFyZ2V0TWludXRlIDwgY3VycmVudE1pbnV0ZSkgewogICAgICAgICAgY3VycmVudEhvdXIgPSAoY3VycmVudEhvdXIgKyAxKSAlIDIzOwogICAgICAgIH0KICAgICAgICBjb25zdCB0YXJnZXRIb3VyID0gdGhpcy5nZXROZXh0UGFydE1hdGNoKGhvdXJFeHByZXNzaW9uLCBjdXJyZW50SG91ciwgMjMpOwogICAgICAgIGlmICh0YXJnZXRIb3VyIDwgY3VycmVudEhvdXIpIHsKICAgICAgICAgIGN1cnJlbnREYXkgPSAoY3VycmVudERheSArIDEpICUgMzA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHRhcmdldERheSA9IGN1cnJlbnREYXk7CiAgICAgICAgaWYgKHRhcmdldERheSA8IGN1cnJlbnREYXkpIHsKICAgICAgICAgIGN1cnJlbnRNb250aCA9IChjdXJyZW50TW9udGggKyAxKSAlIDExOwogICAgICAgIH0KICAgICAgICBjb25zdCB0YXJnZXRNb250aCA9IGN1cnJlbnRNb250aDsKICAgICAgICBpZiAodGFyZ2V0TW9udGggPCBjdXJyZW50TW9udGgpIHsKICAgICAgICAgIGN1cnJlbnRZZWFyID0gY3VycmVudFllYXIgKyAxOwogICAgICAgIH0KICAgICAgICBjb25zdCB0YXJnZXRZZWFyID0gY3VycmVudFllYXI7CiAgICAgICAgY29uc3QgdGFyZ2V0RGF0ZSA9IG5ldyBEYXRlKHRhcmdldFllYXIsIHRhcmdldE1vbnRoLCB0YXJnZXREYXksIHRhcmdldEhvdXIsIHRhcmdldE1pbnV0ZSwgdGFyZ2V0U2Vjb25kKTsKICAgICAgICBjb25zdCB0YXJnZXRUaW1lID0gdGFyZ2V0RGF0ZS5nZXRUaW1lKCk7CiAgICAgICAgcmV0dXJuIHRhcmdldFRpbWUgLSBEYXRlLm5vdygpOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMS4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUuY2xhc3Nlcy5jcm9uam9iLmpzCnZhciBDcm9uSm9iOwp2YXIgaW5pdF9zbWFydHRpbWVfY2xhc3Nlc19jcm9uam9iID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMS4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUuY2xhc3Nlcy5jcm9uam9iLmpzIigpIHsKICAgIGluaXRfc21hcnR0aW1lX3BsdWdpbnMoKTsKICAgIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfY3Jvbm1hbmFnZXIoKTsKICAgIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfY3JvbnBhcnNlcigpOwogICAgQ3JvbkpvYiA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoY3Jvbk1hbmFnZXIsIGNyb25FeHByZXNzaW9uQXJnLCBqb2JGdW5jdGlvbikgewogICAgICAgIHRoaXMuc3RhdHVzID0gImluaXRpYWwiOwogICAgICAgIHRoaXMubmV4dEV4ZWN1dGlvblVuaXggPSAwOwogICAgICAgIHRoaXMuY3JvbkV4cHJlc3Npb24gPSBjcm9uRXhwcmVzc2lvbkFyZzsKICAgICAgICB0aGlzLmpvYkZ1bmN0aW9uID0gam9iRnVuY3Rpb247CiAgICAgICAgdGhpcy5jcm9uUGFyc2VyID0gbmV3IGNyb25lcl9leHBvcnRzLkNyb24oY3JvbkV4cHJlc3Npb25BcmcpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBjaGVja3Mgd2V0aGVyIHRoZSBjcm9uam9iIG5lZWRzIHRvIGJlIGV4ZWN1dGVkCiAgICAgICAqLwogICAgICBjaGVja0V4ZWN1dGlvbigpIHsKICAgICAgICBpZiAodGhpcy5uZXh0RXhlY3V0aW9uVW5peCA9PT0gMCkgewogICAgICAgICAgdGhpcy5nZXROZXh0RXhlY3V0aW9uVGltZSgpOwogICAgICAgIH0KICAgICAgICBpZiAoRGF0ZS5ub3coKSA+IHRoaXMubmV4dEV4ZWN1dGlvblVuaXgpIHsKICAgICAgICAgIGNvbnN0IG1heWJlUHJvbWlzZSA9IHRoaXMuam9iRnVuY3Rpb24odGhpcy5uZXh0RXhlY3V0aW9uVW5peCk7CiAgICAgICAgICBpZiAobWF5YmVQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkgewogICAgICAgICAgICBtYXliZVByb21pc2UuY2F0Y2goKGUxMSkgPT4gY29uc29sZS5sb2coZTExKSk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLm5leHRFeGVjdXRpb25Vbml4ID0gdGhpcy5nZXROZXh0RXhlY3V0aW9uVGltZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5uZXh0RXhlY3V0aW9uVW5peDsKICAgICAgfQogICAgICBnZXROZXh0RXhlY3V0aW9uVGltZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5uZXh0RXhlY3V0aW9uVW5peCA9IERhdGUubm93KCkgKyB0aGlzLmdldFRpbWVUb05leHRFeGVjdXRpb24oKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogZ2V0cyB0aGUgdGltZSB0byBuZXh0IGV4ZWN1dGlvbgogICAgICAgKi8KICAgICAgZ2V0VGltZVRvTmV4dEV4ZWN1dGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5jcm9uUGFyc2VyLm1zVG9OZXh0KCk7CiAgICAgIH0KICAgICAgc3RhcnQoKSB7CiAgICAgICAgdGhpcy5zdGF0dXMgPSAic3RhcnRlZCI7CiAgICAgIH0KICAgICAgc3RvcCgpIHsKICAgICAgICB0aGlzLnN0YXR1cyA9ICJzdG9wcGVkIjsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjEuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLnVuaXRzLmpzCnZhciB1bml0cywgZ2V0TWlsbGlTZWNvbmRzRnJvbVVuaXRzLCBnZXRNaWxsaVNlY29uZHNBc0h1bWFuUmVhZGFibGVTdHJpbmcsIGdldE1pbGxpU2Vjb25kc0FzSHVtYW5SZWFkYWJsZUFnb1RpbWU7CnZhciBpbml0X3NtYXJ0dGltZV91bml0cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjEuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLnVuaXRzLmpzIigpIHsKICAgIGluaXRfc21hcnR0aW1lX3BsdWdpbnMoKTsKICAgIHVuaXRzID0gewogICAgICB5ZWFyczogKHRpbWVzQXJnID0gMSkgPT4gewogICAgICAgIHJldHVybiB0aW1lc0FyZyAqIDMxNTRlNzsKICAgICAgfSwKICAgICAgbW9udGhzOiAodGltZXNBcmcgPSAxKSA9PiB7CiAgICAgICAgcmV0dXJuIHRpbWVzQXJnICogMjYyOGU2OwogICAgICB9LAogICAgICB3ZWVrczogKHRpbWVzQXJnID0gMSkgPT4gewogICAgICAgIHJldHVybiB0aW1lc0FyZyAqIDYwNDhlNTsKICAgICAgfSwKICAgICAgZGF5czogKHRpbWVzQXJnID0gMSkgPT4gewogICAgICAgIHJldHVybiB0aW1lc0FyZyAqIDg2NGU1OwogICAgICB9LAogICAgICBob3VyczogKHRpbWVzQXJnID0gMSkgPT4gewogICAgICAgIHJldHVybiB0aW1lc0FyZyAqIDM2ZTU7CiAgICAgIH0sCiAgICAgIG1pbnV0ZXM6ICh0aW1lc0FyZyA9IDEpID0+IHsKICAgICAgICByZXR1cm4gdGltZXNBcmcgKiA2ZTQ7CiAgICAgIH0sCiAgICAgIHNlY29uZHM6ICh0aW1lc0FyZyA9IDEpID0+IHsKICAgICAgICByZXR1cm4gdGltZXNBcmcgKiAxZTM7CiAgICAgIH0KICAgIH07CiAgICBnZXRNaWxsaVNlY29uZHNGcm9tVW5pdHMgPSAoY29tYmluYXRpb25BcmcpID0+IHsKICAgICAgbGV0IHRpbWVJbk1pbGxpc2Vjb25kcyA9IDA7CiAgICAgIGxldCBhZGRNaWxsaVNlY29uZHMgPSAobWlsbGlTZWNvbmRzQXJnKSA9PiB7CiAgICAgICAgdGltZUluTWlsbGlzZWNvbmRzID0gdGltZUluTWlsbGlzZWNvbmRzICsgbWlsbGlTZWNvbmRzQXJnOwogICAgICB9OwogICAgICBpZiAoY29tYmluYXRpb25BcmcueWVhcnMpIHsKICAgICAgICBhZGRNaWxsaVNlY29uZHModW5pdHMueWVhcnMoY29tYmluYXRpb25BcmcueWVhcnMpKTsKICAgICAgfQogICAgICBpZiAoY29tYmluYXRpb25BcmcubW9udGhzKSB7CiAgICAgICAgYWRkTWlsbGlTZWNvbmRzKHVuaXRzLm1vbnRocyhjb21iaW5hdGlvbkFyZy5tb250aHMpKTsKICAgICAgfQogICAgICBpZiAoY29tYmluYXRpb25Bcmcud2Vla3MpIHsKICAgICAgICBhZGRNaWxsaVNlY29uZHModW5pdHMud2Vla3MoY29tYmluYXRpb25Bcmcud2Vla3MpKTsKICAgICAgfQogICAgICBpZiAoY29tYmluYXRpb25BcmcuZGF5cykgewogICAgICAgIGFkZE1pbGxpU2Vjb25kcyh1bml0cy5kYXlzKGNvbWJpbmF0aW9uQXJnLmRheXMpKTsKICAgICAgfQogICAgICBpZiAoY29tYmluYXRpb25BcmcuaG91cnMpIHsKICAgICAgICBhZGRNaWxsaVNlY29uZHModW5pdHMuaG91cnMoY29tYmluYXRpb25BcmcuaG91cnMpKTsKICAgICAgfQogICAgICBpZiAoY29tYmluYXRpb25BcmcubWludXRlcykgewogICAgICAgIGFkZE1pbGxpU2Vjb25kcyh1bml0cy5taW51dGVzKGNvbWJpbmF0aW9uQXJnLm1pbnV0ZXMpKTsKICAgICAgfQogICAgICBpZiAoY29tYmluYXRpb25Bcmcuc2Vjb25kcykgewogICAgICAgIGFkZE1pbGxpU2Vjb25kcyh1bml0cy5zZWNvbmRzKGNvbWJpbmF0aW9uQXJnLnNlY29uZHMpKTsKICAgICAgfQogICAgICByZXR1cm4gdGltZUluTWlsbGlzZWNvbmRzOwogICAgfTsKICAgIGdldE1pbGxpU2Vjb25kc0FzSHVtYW5SZWFkYWJsZVN0cmluZyA9IChtaWxsaVNlY29uZHNBcmcpID0+IHsKICAgICAgcmV0dXJuIHByZXR0eU1pbGxpc2Vjb25kcyhtaWxsaVNlY29uZHNBcmcpOwogICAgfTsKICAgIGdldE1pbGxpU2Vjb25kc0FzSHVtYW5SZWFkYWJsZUFnb1RpbWUgPSAodGltZVN0YW1wQXJnKSA9PiB7CiAgICAgIHJldHVybiBkYXRlX2Zuc19leHBvcnRzLmZvcm1hdERpc3RhbmNlVG9Ob3cobmV3IERhdGUodGltZVN0YW1wQXJnKSk7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMS4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUuY2xhc3Nlcy5jcm9ubWFuYWdlci5qcwp2YXIgQ3Jvbk1hbmFnZXI7CnZhciBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX2Nyb25tYW5hZ2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMS4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUuY2xhc3Nlcy5jcm9ubWFuYWdlci5qcyIoKSB7CiAgICBpbml0X3NtYXJ0dGltZV9wbHVnaW5zKCk7CiAgICBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX2Nyb25qb2IoKTsKICAgIGluaXRfc21hcnR0aW1lX3VuaXRzKCk7CiAgICBDcm9uTWFuYWdlciA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5zdGF0dXMgPSAic3RvcHBlZCI7CiAgICAgICAgdGhpcy5jcm9uam9icyA9IG5ldyBkaXN0X3RzX2V4cG9ydHM2Lk9iamVjdE1hcCgpOwogICAgICB9CiAgICAgIGFkZENyb25qb2IoY3JvbklkZW50aWZpZXJBcmcsIGNyb25GdW5jdGlvbkFyZykgewogICAgICAgIGNvbnN0IG5ld0Nyb25Kb2IgPSBuZXcgQ3JvbkpvYih0aGlzLCBjcm9uSWRlbnRpZmllckFyZywgY3JvbkZ1bmN0aW9uQXJnKTsKICAgICAgICB0aGlzLmNyb25qb2JzLmFkZChuZXdDcm9uSm9iKTsKICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09ICJzdGFydGVkIikgewogICAgICAgICAgbmV3Q3JvbkpvYi5zdGFydCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3Q3JvbkpvYjsKICAgICAgfQogICAgICByZW1vdmVDcm9uam9iKGNyb25qb2JBcmcpIHsKICAgICAgICBjcm9uam9iQXJnLnN0b3AoKTsKICAgICAgICB0aGlzLmNyb25qb2JzLnJlbW92ZShjcm9uam9iQXJnKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogc3RhcnRzIHRoZSBjcm9uam9iCiAgICAgICAqLwogICAgICBzdGFydCgpIHsKICAgICAgICBpZiAodGhpcy5zdGF0dXMgIT09ICJzdGFydGVkIikgewogICAgICAgICAgdGhpcy5zdGF0dXMgPSAic3RhcnRlZCI7CiAgICAgICAgICBmb3IgKGNvbnN0IGNyb25Kb2Igb2YgdGhpcy5jcm9uam9icy5nZXRBcnJheSgpKSB7CiAgICAgICAgICAgIGNyb25Kb2Iuc3RhcnQoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMucnVuQ3JvbkN5Y2xlKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIHJ1bkNyb25DeWNsZSgpIHsKICAgICAgICB0aGlzLmV4ZWN1dGlvblRpbWVvdXQgPSBuZXcgZGlzdF90c19leHBvcnRzMy5UaW1lb3V0KDApOwogICAgICAgIGRvIHsKICAgICAgICAgIGxldCBuZXh0UnVubmluZ0Nyb25qb2I7CiAgICAgICAgICBmb3IgKGNvbnN0IGNyb25Kb2Igb2YgdGhpcy5jcm9uam9icy5nZXRBcnJheSgpKSB7CiAgICAgICAgICAgIGNyb25Kb2IuY2hlY2tFeGVjdXRpb24oKTsKICAgICAgICAgICAgaWYgKCFuZXh0UnVubmluZ0Nyb25qb2IgfHwgY3JvbkpvYi5nZXRUaW1lVG9OZXh0RXhlY3V0aW9uKCkgPCBuZXh0UnVubmluZ0Nyb25qb2IuZ2V0VGltZVRvTmV4dEV4ZWN1dGlvbigpKSB7CiAgICAgICAgICAgICAgbmV4dFJ1bm5pbmdDcm9uam9iID0gY3JvbkpvYjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKG5leHRSdW5uaW5nQ3JvbmpvYikgewogICAgICAgICAgICB0aGlzLmV4ZWN1dGlvblRpbWVvdXQgPSBuZXcgZGlzdF90c19leHBvcnRzMy5UaW1lb3V0KG5leHRSdW5uaW5nQ3JvbmpvYi5nZXRUaW1lVG9OZXh0RXhlY3V0aW9uKCkpOwogICAgICAgICAgICBjb25zb2xlLmxvZyhgTmV4dCBDcm9uSm9iIHNjaGVkdWxlZCBpbiAke2dldE1pbGxpU2Vjb25kc0FzSHVtYW5SZWFkYWJsZVN0cmluZyh0aGlzLmV4ZWN1dGlvblRpbWVvdXQuZ2V0VGltZUxlZnQoKSl9YCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLmV4ZWN1dGlvblRpbWVvdXQgPSBuZXcgZGlzdF90c19leHBvcnRzMy5UaW1lb3V0KDFlMyk7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJubyBjcm9uam9icyBzcGVjaWZpZWQhIENoZWNraW5nIGFnYWluIGluIDEgc2Vjb25kIik7CiAgICAgICAgICB9CiAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGlvblRpbWVvdXQucHJvbWlzZTsKICAgICAgICB9IHdoaWxlICh0aGlzLnN0YXR1cyA9PT0gInN0YXJ0ZWQiKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogc3RvcHMgYWxsIGNyb25qb2JzCiAgICAgICAqLwogICAgICBzdG9wKCkgewogICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gInN0YXJ0ZWQiKSB7CiAgICAgICAgICB0aGlzLnN0YXR1cyA9ICJzdG9wcGVkIjsKICAgICAgICAgIHRoaXMuZXhlY3V0aW9uVGltZW91dC5jYW5jZWwoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc29sZS5sb2coYFlvdSB0cmllZCB0byBzdG9wIGEgQ3Jvbk1hbmFnZXIgdGhhdCB3YXMgbm90IGFjdHVhbGx5IHN0YXJ0ZWQuYCk7CiAgICAgICAgfQogICAgICAgIGZvciAoY29uc3QgY3JvbiBvZiB0aGlzLmNyb25qb2JzLmdldEFycmF5KCkpIHsKICAgICAgICAgIGNyb24uc3RvcCgpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjEuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuZXh0ZW5kZWRkYXRlLmpzCnZhciBFeHRlbmRlZERhdGU7CnZhciBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX2V4dGVuZGVkZGF0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjEuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuZXh0ZW5kZWRkYXRlLmpzIigpIHsKICAgIGluaXRfc21hcnR0aW1lX3BsdWdpbnMoKTsKICAgIGluaXRfc21hcnR0aW1lX3VuaXRzKCk7CiAgICBFeHRlbmRlZERhdGUgPSBjbGFzcyBfRXh0ZW5kZWREYXRlIGV4dGVuZHMgRGF0ZSB7CiAgICAgIC8vIFNUQVRJQyBmYWN0b3JpZXMKICAgICAgc3RhdGljIGZyb21NaWxsaXMobWlsbGlTZWNvbmRzKSB7CiAgICAgICAgcmV0dXJuIG5ldyBfRXh0ZW5kZWREYXRlKG1pbGxpU2Vjb25kcyk7CiAgICAgIH0KICAgICAgc3RhdGljIGZyb21EYXRlKGRhdGVBcmcpIHsKICAgICAgICByZXR1cm4gbmV3IF9FeHRlbmRlZERhdGUoZGF0ZUFyZy5nZXRUaW1lKCkpOwogICAgICB9CiAgICAgIHN0YXRpYyBmcm9tRXVyb3BlYW5EYXRlKGV1cm9wZWFuRGF0ZSkgewogICAgICAgIGNvbnN0IGRhdGVBcnJheSA9IC8oLiopXC4oLiopXC4oLiopLy5leGVjKGV1cm9wZWFuRGF0ZSk7CiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKAogICAgICAgICAgcGFyc2VGbG9hdChkYXRlQXJyYXlbM10pLAogICAgICAgICAgLy8geWVhcgogICAgICAgICAgcGFyc2VGbG9hdChkYXRlQXJyYXlbMl0pIC0gMSwKICAgICAgICAgIC8vIG1vbnRoCiAgICAgICAgICBwYXJzZUZsb2F0KGRhdGVBcnJheVsxXSkKICAgICAgICAgIC8vIGRheQogICAgICAgICk7CiAgICAgICAgY29uc3QgdW5peE1pbGxpID0gZGF0ZS5nZXRUaW1lKCk7CiAgICAgICAgcmV0dXJuIG5ldyBfRXh0ZW5kZWREYXRlKHVuaXhNaWxsaSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNyZWF0ZXMgYW4gRXh0ZW5kZWQgZGF0ZSBmcm9tIGEgaHlwZWREYXRlIGxpa2UgIjIwMTgtMDMtMjgiCiAgICAgICAqIEBwYXJhbSBkYXRlU3RyaW5nCiAgICAgICAqLwogICAgICBzdGF0aWMgZnJvbUh5cGhlZERhdGUoZGF0ZVN0cmluZykgewogICAgICAgIGNvbnN0IGRhdGVNaWxsaXMgPSBuZXcgRGF0ZShkYXRlU3RyaW5nKS5nZXRUaW1lKCk7CiAgICAgICAgcmV0dXJuIG5ldyBfRXh0ZW5kZWREYXRlKGRhdGVNaWxsaXMpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBTYW1lIGFzIC5mcm9tRXVyb3BlYW5EYXRlKCksIGJ1dCBhY2NlcHRzIGFkZGl0aW9uYWwgdGltZUFyZyBhbmQgem9uZUFyZwogICAgICAgKi8KICAgICAgc3RhdGljIGZyb21FdXJvcGVhbkRhdGVBbmRUaW1lKGV1cm9wZWFuRGF0ZUFyZywgdGltZUFyZyA9ICIxMjowMDowMCIsIHpvbmVBcmcgPSAiRXVyb3BlL0JlcmxpbiIpIHsKICAgICAgICBjb25zdCBkYXRlQXJyYXkgPSAvKC4qKVwuKC4qKVwuKC4qKS8uZXhlYyhldXJvcGVhbkRhdGVBcmcpOwogICAgICAgIGNvbnN0IHNsaWNlRGF0ZSA9IChkYXRlU3RyaW5nKSA9PiB7CiAgICAgICAgICByZXR1cm4gYDAke2RhdGVTdHJpbmd9YC5zbGljZSgtMik7CiAgICAgICAgfTsKICAgICAgICBjb25zdCBkYXRlVGltZVN0cmluZyA9IGAke2RhdGVBcnJheVszXX0tJHtzbGljZURhdGUoZGF0ZUFycmF5WzJdKX0tJHtzbGljZURhdGUoZGF0ZUFycmF5WzFdKX1UJHt0aW1lQXJnfWA7CiAgICAgICAgY29uc3QgZGF0ZSA9IGltcG9ydF9kYXlqcy5kZWZhdWx0KGRhdGVUaW1lU3RyaW5nKTsKICAgICAgICBjb25zdCB1bml4TWlsbGkgPSBkYXRlLnRvRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICByZXR1cm4gbmV3IF9FeHRlbmRlZERhdGUodW5peE1pbGxpKTsKICAgICAgfQogICAgICBjb25zdHJ1Y3Rvcih1bml4TWlsbGkgPSBEYXRlLm5vdygpKSB7CiAgICAgICAgc3VwZXIodW5peE1pbGxpKTsKICAgICAgfQogICAgICAvLwogICAgICBleHBvcnRUb0V1cm9wZWFuRGF0ZSgpIHsKICAgICAgICBjb25zdCB1bml0czIgPSB0aGlzLmV4cG9ydFRvVW5pdHMoKTsKICAgICAgICByZXR1cm4gYCR7dW5pdHMyLmRheVN0cmluZ30uJHt1bml0czIubW9udGhTdHJpbmd9LiR7dW5pdHMyLnllYXJTdHJpbmd9YDsKICAgICAgfQogICAgICBleHBvcnRUb0h5cGhlZFNvcnRhYmxlRGF0ZSgpIHsKICAgICAgICBjb25zdCB1bml0czIgPSB0aGlzLmV4cG9ydFRvVW5pdHMoKTsKICAgICAgICByZXR1cm4gYCR7dW5pdHMyLnllYXJTdHJpbmd9LSR7dW5pdHMyLm1vbnRoU3RyaW5nfS0ke3VuaXRzMi5kYXlTdHJpbmd9YDsKICAgICAgfQogICAgICAvKioKICAgICAgICogZXhwb3J0cyB1bml0cwogICAgICAgKi8KICAgICAgZXhwb3J0VG9Vbml0cygpIHsKICAgICAgICBjb25zdCBtb250aHNBcnJheSA9IFsKICAgICAgICAgICJKYW51YXJ5IiwKICAgICAgICAgICJGZWJydWFyeSIsCiAgICAgICAgICAiTWFyY2giLAogICAgICAgICAgIkFwcmlsIiwKICAgICAgICAgICJNYXkiLAogICAgICAgICAgIkp1bmUiLAogICAgICAgICAgIkp1bHkiLAogICAgICAgICAgIkF1Z3VzdCIsCiAgICAgICAgICAiU2VwdGVtYmVyIiwKICAgICAgICAgICJPY3RvYmVyIiwKICAgICAgICAgICJOb3ZlbWJlciIsCiAgICAgICAgICAiRGVjZW1iZXIiCiAgICAgICAgXTsKICAgICAgICBjb25zdCBkYXlzQXJyYXkgPSBbCiAgICAgICAgICAiTW9uZGF5IiwKICAgICAgICAgICJUdWVzZGF5IiwKICAgICAgICAgICJXZWRuZXNkYXkiLAogICAgICAgICAgIlRodXJzZGF5IiwKICAgICAgICAgICJGcmlkYXkiLAogICAgICAgICAgIlNhdHVyZGF5IiwKICAgICAgICAgICJTdW5kYXkiCiAgICAgICAgXTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgeWVhcjogdGhpcy5nZXRGdWxsWWVhcigpLAogICAgICAgICAgeWVhclN0cmluZzogYCR7dGhpcy5nZXRGdWxsWWVhcigpfWAsCiAgICAgICAgICBtb250aDogdGhpcy5nZXRNb250aCgpICsgMSwKICAgICAgICAgIG1vbnRoU3RyaW5nOiAoIjAiICsgKHRoaXMuZ2V0TW9udGgoKSArIDEpKS5zbGljZSgtMiksCiAgICAgICAgICBtb250aE5hbWU6IG1vbnRoc0FycmF5W3RoaXMuZ2V0TW9udGgoKV0sCiAgICAgICAgICBkYXk6IHRoaXMuZ2V0RGF0ZSgpLAogICAgICAgICAgZGF5U3RyaW5nOiAoIjAiICsgdGhpcy5nZXREYXRlKCkpLnNsaWNlKC0yKSwKICAgICAgICAgIGRheU9mVGhlV2VlazogdGhpcy5nZXREYXkoKSwKICAgICAgICAgIGRheU9mVGhlV2Vla05hbWU6IGRheXNBcnJheVt0aGlzLmdldERheSgpXQogICAgICAgIH07CiAgICAgIH0KICAgICAgZm9ybWF0KGZvcm1hdEFyZykgewogICAgICAgIHJldHVybiBpbXBvcnRfZGF5anMuZGVmYXVsdCh0aGlzLmdldFRpbWUoKSkuZm9ybWF0KGZvcm1hdEFyZyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGJvb2xlYW4gY2hlY2tzCiAgICAgICAqLwogICAgICBpc1RvZGF5KCkgewogICAgICAgIHJldHVybiBpbXBvcnRfZGF5anMuZGVmYXVsdCh0aGlzLmdldFRpbWUoKSkuaXNUb2RheSgpOwogICAgICB9CiAgICAgIGxlc3NUaW1lUGFzc2VkVG9Ob3codW5pdEFyZ3MpIHsKICAgICAgICBjb25zdCBtYXhQYXNzZWRVbml4VGltZSA9IGdldE1pbGxpU2Vjb25kc0Zyb21Vbml0cyh1bml0QXJncyk7CiAgICAgICAgY29uc3QgYWN0dWFsUGFzc2VkVW5peFRpbWUgPSBEYXRlLm5vdygpIC0gdGhpcy5nZXRUaW1lKCk7CiAgICAgICAgcmV0dXJuIGFjdHVhbFBhc3NlZFVuaXhUaW1lIDwgbWF4UGFzc2VkVW5peFRpbWU7CiAgICAgIH0KICAgICAgbW9yZVRpbWVQYXNzZWRUb05vdyh1bml0QXJncykgewogICAgICAgIHJldHVybiAhdGhpcy5sZXNzVGltZVBhc3NlZFRvTm93KHVuaXRBcmdzKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjEuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuaHJ0bWVhc3VyZW1lbnQuanMKdmFyIEhydE1lYXN1cmVtZW50Owp2YXIgaW5pdF9zbWFydHRpbWVfY2xhc3Nlc19ocnRtZWFzdXJlbWVudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjEuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuaHJ0bWVhc3VyZW1lbnQuanMiKCkgewogICAgSHJ0TWVhc3VyZW1lbnQgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMubmFub1NlY29uZHMgPSBudWxsOwogICAgICAgIHRoaXMubWlsbGlTZWNvbmRzID0gbnVsbDsKICAgICAgICB0aGlzLl9taWxsaVN0YXJ0ID0gbnVsbDsKICAgICAgICB0aGlzLl9taWxsaURpZmYgPSBudWxsOwogICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogc3RhcnQgdGhlIG1lYXN1cmVtZW50CiAgICAgICAqLwogICAgICBzdGFydCgpIHsKICAgICAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZTsKICAgICAgICB0aGlzLl9taWxsaVN0YXJ0ID0gRGF0ZS5ub3coKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogc3RvcCB0aGUgbWVhc3VyZW1lbnQKICAgICAgICovCiAgICAgIHN0b3AoKSB7CiAgICAgICAgaWYgKHRoaXMuX3N0YXJ0ZWQgPT09IGZhbHNlKSB7CiAgICAgICAgICBjb25zb2xlLmxvZygiSGFzbid0IHN0YXJ0ZWQgeWV0Iik7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuX21pbGxpRGlmZiA9IERhdGUubm93KCkgLSB0aGlzLl9taWxsaVN0YXJ0OwogICAgICAgIHRoaXMubmFub1NlY29uZHMgPSB0aGlzLl9taWxsaURpZmYgKiAxZTM7CiAgICAgICAgdGhpcy5taWxsaVNlY29uZHMgPSB0aGlzLl9taWxsaURpZmY7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHJlc2V0IHRoZSBtZWFzdXJlbWVudAogICAgICAgKi8KICAgICAgcmVzZXQoKSB7CiAgICAgICAgdGhpcy5uYW5vU2Vjb25kcyA9IG51bGw7CiAgICAgICAgdGhpcy5taWxsaVNlY29uZHMgPSBudWxsOwogICAgICAgIHRoaXMuX21pbGxpU3RhcnQgPSBudWxsOwogICAgICAgIHRoaXMuX21pbGxpRGlmZiA9IG51bGw7CiAgICAgICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMS4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUuY2xhc3Nlcy5pbnRlcnZhbC5qcwp2YXIgSW50ZXJ2YWw7CnZhciBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX2ludGVydmFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMS4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUuY2xhc3Nlcy5pbnRlcnZhbC5qcyIoKSB7CiAgICBpbml0X3NtYXJ0dGltZV9wbHVnaW5zKCk7CiAgICBJbnRlcnZhbCA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoaW50ZXJ2YWxNaWxsaXNlbmNvbmRzQXJnKSB7CiAgICAgICAgdGhpcy5zdGF0dXMgPSAiaW5pdGlhbCI7CiAgICAgICAgdGhpcy5zdGF0dXNBdXRob3JpemF0aW9uID0gbnVsbDsKICAgICAgICB0aGlzLmludGVydmFsSm9icyA9IFtdOwogICAgICAgIHRoaXMuaW50ZXJ2YWxNaWxsaXNlY29uZHMgPSBpbnRlcnZhbE1pbGxpc2VuY29uZHNBcmc7CiAgICAgIH0KICAgICAgc3RhcnQoKSB7CiAgICAgICAgdGhpcy5zdGF0dXMgPSAic3RhcnRlZCI7CiAgICAgICAgY29uc3Qgc3RhdHVzQXV0aCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpOwogICAgICAgIHRoaXMuc3RhdHVzQXV0aG9yaXphdGlvbiA9IHN0YXR1c0F1dGg7CiAgICAgICAgY29uc3QgcnVuSW50ZXJ2YWwgPSBhc3luYyAoKSA9PiB7CiAgICAgICAgICB3aGlsZSAodGhpcy5zdGF0dXMgPT09ICJzdGFydGVkIiAmJiB0aGlzLnN0YXR1c0F1dGhvcml6YXRpb24gPT09IHN0YXR1c0F1dGgpIHsKICAgICAgICAgICAgYXdhaXQgZGlzdF90c19leHBvcnRzMy5kZWxheUZvcih0aGlzLmludGVydmFsTWlsbGlzZWNvbmRzKTsKICAgICAgICAgICAgdGhpcy5leGVjdXRlSW50ZXJ2YWxKb2JzKCk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBydW5JbnRlcnZhbCgpOwogICAgICB9CiAgICAgIHN0b3AoKSB7CiAgICAgICAgdGhpcy5zdGF0dXMgPSAic3RvcHBlZCI7CiAgICAgICAgdGhpcy5zdGF0dXNBdXRob3JpemF0aW9uID0gbnVsbDsKICAgICAgfQogICAgICBhZGRJbnRlcnZhbEpvYihmdW5jQXJnKSB7CiAgICAgICAgdGhpcy5pbnRlcnZhbEpvYnMucHVzaChmdW5jQXJnKTsKICAgICAgfQogICAgICBleGVjdXRlSW50ZXJ2YWxKb2JzKCkgewogICAgICAgIGZvciAoY29uc3QgZnVuY0FyZyBvZiB0aGlzLmludGVydmFsSm9icykgewogICAgICAgICAgZnVuY0FyZygpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjEuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMudGltZXN0YW1wLmpzCnZhciBUaW1lU3RhbXA7CnZhciBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX3RpbWVzdGFtcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjEuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMudGltZXN0YW1wLmpzIigpIHsKICAgIGluaXRfc21hcnR0aW1lX3BsdWdpbnMoKTsKICAgIFRpbWVTdGFtcCA9IGNsYXNzIF9UaW1lU3RhbXAgewogICAgICAvKioKICAgICAgICogcmV0dXJucyBuZXcgVGltZVN0YW1wIGZyb20gbWlsbGlzZWNvbmRzCiAgICAgICAqLwogICAgICBzdGF0aWMgZnJvbU1pbGxpU2Vjb25kcyhtaWxsaVNlY29uZHNBcmcpIHsKICAgICAgICByZXR1cm4gbmV3IF9UaW1lU3RhbXAobWlsbGlTZWNvbmRzQXJnKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogcmV0dXJucyBuZXcgVGltZVN0YW1wIGZvciBub3cgd2l0aCBjaGFuZ2Ugc2V0CiAgICAgICAqIEBwYXJhbSB0aW1lU3RhbXBBcmcKICAgICAgICovCiAgICAgIHN0YXRpYyBmcm9tVGltZVN0YW1wKHRpbWVTdGFtcEFyZykgewogICAgICAgIGNvbnN0IGxvY2FsVGltZVN0YW1wID0gbmV3IF9UaW1lU3RhbXAoKTsKICAgICAgICBsb2NhbFRpbWVTdGFtcC5jaGFuZ2UgPSBsb2NhbFRpbWVTdGFtcC5taWxsaVNlY29uZHMgLSB0aW1lU3RhbXBBcmcubWlsbGlTZWNvbmRzOwogICAgICAgIHJldHVybiBsb2NhbFRpbWVTdGFtcDsKICAgICAgfQogICAgICBjb25zdHJ1Y3RvcihjcmVhdG9yQXJnKSB7CiAgICAgICAgdGhpcy5jaGFuZ2UgPSBudWxsOwogICAgICAgIGlmICghY3JlYXRvckFyZykgewogICAgICAgICAgdGhpcy5kYXRlID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY3JlYXRvckFyZyA9PT0gIm51bWJlciIpIHsKICAgICAgICAgIHRoaXMuZGF0ZSA9IG5ldyBEYXRlKGNyZWF0b3JBcmcpOwogICAgICAgIH0KICAgICAgICB0aGlzLm1pbGxpU2Vjb25kcyA9IHRoaXMuZGF0ZS5nZXRUaW1lKCk7CiAgICAgICAgdGhpcy5lcG9jaHRpbWUgPSBNYXRoLmZsb29yKHRoaXMubWlsbGlTZWNvbmRzIC8gMWUzKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogcmV0dXJucyBhIGJvb2xlYW4gZm9yIHdldGhlciB0aGUgdGltZXN0YW1wIGlzIG9sZGVyIHRoYW4gYW5vdGhlciB0aW1lc3RhbXAKICAgICAgICogQHBhcmFtIFRpbWVTdGFtcEFyZwogICAgICAgKiBAcGFyYW0gdHJlc2hvbGRUaW1lQXJnCiAgICAgICAqLwogICAgICBpc09sZGVyVGhhbk90aGVyVGltZVN0YW1wKFRpbWVTdGFtcEFyZywgdHJlc2hvbGRUaW1lQXJnID0gMCkgewogICAgICAgIGlmICh0aGlzLm1pbGxpU2Vjb25kcyA8IFRpbWVTdGFtcEFyZy5taWxsaVNlY29uZHMgLSB0cmVzaG9sZFRpbWVBcmcpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJcyB0aGUgY3VycmVudCBpbnN0YW5jZSBvbGRlciB0aGFuIHRoZSBhcmd1bWVudAogICAgICAgKiBAcGFyYW0gVGltZVN0YW1wQXJnCiAgICAgICAqLwogICAgICBpc09sZGVyVGhhbihUaW1lU3RhbXBBcmcsIHRyZXNob2xkVGltZUFyZyA9IDApIHsKICAgICAgICBpZiAodGhpcy5taWxsaVNlY29uZHMgKyB0cmVzaG9sZFRpbWVBcmcgPCBUaW1lU3RhbXBBcmcubWlsbGlTZWNvbmRzKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogcmV0dXJucyBhIGJvb2xlYW4gZm9yIHdldGhlciB0aGUgdGltZXN0YW1wIGlzIHlvdW5nZXIgdGhhbiBhbm90aGVyIHRpbWVzdGFtcAogICAgICAgKiBAcGFyYW0gVGltZVN0YW1wQXJnCiAgICAgICAqIEBwYXJhbSB0cmVzaG9sZFRpbWVBcmcKICAgICAgICovCiAgICAgIGlzWW91bmdlclRoYW5PdGhlclRpbWVTdGFtcChUaW1lU3RhbXBBcmcsIHRyZXNob2xkVGltZUFyZyA9IDApIHsKICAgICAgICBpZiAodGhpcy5taWxsaVNlY29uZHMgPiBUaW1lU3RhbXBBcmcubWlsbGlTZWNvbmRzICsgdHJlc2hvbGRUaW1lQXJnKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICBpc1lvdW5nZXJUaGFuTWlsbGlTZWNvbmRzKG1pbGxpc2Vjb25kQXJnKSB7CiAgICAgICAgY29uc3Qgbm93VGltZVN0YW1wID0gbmV3IF9UaW1lU3RhbXAoKTsKICAgICAgICBjb25zdCBjb21wYXJlRXBvY2hUaW1lID0gbm93VGltZVN0YW1wLmVwb2NodGltZSAtIG1pbGxpc2Vjb25kQXJnOwogICAgICAgIGNvbnN0IGNvbXBhcmVUaW1lU3RhbXAgPSBuZXcgX1RpbWVTdGFtcChjb21wYXJlRXBvY2hUaW1lKTsKICAgICAgICByZXR1cm4gdGhpcy5pc1lvdW5nZXJUaGFuT3RoZXJUaW1lU3RhbXAoY29tcGFyZVRpbWVTdGFtcCk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4xLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLnRpbWVyLmpzCnZhciBUaW1lcjsKdmFyIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfdGltZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4xLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLnRpbWVyLmpzIigpIHsKICAgIGluaXRfc21hcnR0aW1lX3BsdWdpbnMoKTsKICAgIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfdGltZXN0YW1wKCk7CiAgICBUaW1lciA9IGNsYXNzIHsKICAgICAgZ2V0IHRpbWVMZWZ0KCkgewogICAgICAgIHJldHVybiB0aGlzLnRpbWVJbk1pbGxpc2Vjb25kcyAtIHRoaXMucGF1c2VkQXQuY2hhbmdlOwogICAgICB9CiAgICAgIGNvbnN0cnVjdG9yKHRpbWVJbk1pbGxpc2Vjb25kc0FyZykgewogICAgICAgIHRoaXMuc3RhdGUgPSAiaW5pdGlhdGVkIjsKICAgICAgICB0aGlzLmNvbXBsZXRlZERlZmVycmVkID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICAgICAgdGhpcy50aW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lSW5NaWxsaXNlY29uZHNBcmc7CiAgICAgICAgdGhpcy5jb21wbGV0ZWQgPSB0aGlzLmNvbXBsZXRlZERlZmVycmVkLnByb21pc2U7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHN0YXJ0cyB0aGUgdGltZXIKICAgICAgICovCiAgICAgIHN0YXJ0KCkgewogICAgICAgIGlmICghdGhpcy5zdGFydGVkQXQpIHsKICAgICAgICAgIHRoaXMuY3VycmVudFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgdGhpcy5jb21wbGV0ZWREZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICB9LCB0aGlzLnRpbWVJbk1pbGxpc2Vjb25kcyk7CiAgICAgICAgICB0aGlzLnN0YXJ0ZWRBdCA9IG5ldyBUaW1lU3RhbXAoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ0aW1lciBoYXMgYmVlbiBzdGFydGVkIGJlZm9yZS4gUGxlYXNlIHVzZSByZXN1bWUgaW5zdGVhZCIpOwogICAgICAgIH0KICAgICAgfQogICAgICBwYXVzZSgpIHsKICAgICAgICBpZiAodGhpcy5zdGFydGVkQXQpIHsKICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmN1cnJlbnRUaW1lb3V0KTsKICAgICAgICAgIHRoaXMuY3VycmVudFRpbWVvdXQgPSBudWxsOwogICAgICAgICAgdGhpcy5wYXVzZWRBdCA9IFRpbWVTdGFtcC5mcm9tVGltZVN0YW1wKHRoaXMuc3RhcnRlZEF0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmVzdW1lKCkgewogICAgICAgIGlmICh0aGlzLnN0YXJ0ZWRBdCkgewogICAgICAgICAgdGhpcy5jdXJyZW50VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICB0aGlzLmNvbXBsZXRlZERlZmVycmVkLnJlc29sdmUoKTsKICAgICAgICAgIH0sIHRoaXMudGltZUxlZnQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInRpbWVyIGhhcyBOT1QgYmVlbiBzdGFydGVkIGJlZm9yZS4gUGxlYXNlIHVzZSAuc3RhcnQoKSBpbnN0ZWFkIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlc2V0KCkgewogICAgICAgIHRoaXMucGF1c2UoKTsKICAgICAgICB0aGlzLnN0YXJ0ZWRBdCA9IG51bGw7CiAgICAgICAgdGhpcy5wYXVzZWRBdCA9IG51bGw7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4xLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHM3ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czcsIHsKICBDcm9uSm9iOiAoKSA9PiBDcm9uSm9iLAogIENyb25NYW5hZ2VyOiAoKSA9PiBDcm9uTWFuYWdlciwKICBFeHRlbmRlZERhdGU6ICgpID0+IEV4dGVuZGVkRGF0ZSwKICBIcnRNZWFzdXJlbWVudDogKCkgPT4gSHJ0TWVhc3VyZW1lbnQsCiAgSW50ZXJ2YWw6ICgpID0+IEludGVydmFsLAogIFRpbWVTdGFtcDogKCkgPT4gVGltZVN0YW1wLAogIFRpbWVyOiAoKSA9PiBUaW1lciwKICBnZXRNaWxsaVNlY29uZHNBc0h1bWFuUmVhZGFibGVBZ29UaW1lOiAoKSA9PiBnZXRNaWxsaVNlY29uZHNBc0h1bWFuUmVhZGFibGVBZ29UaW1lLAogIGdldE1pbGxpU2Vjb25kc0FzSHVtYW5SZWFkYWJsZVN0cmluZzogKCkgPT4gZ2V0TWlsbGlTZWNvbmRzQXNIdW1hblJlYWRhYmxlU3RyaW5nLAogIGdldE1pbGxpU2Vjb25kc0Zyb21Vbml0czogKCkgPT4gZ2V0TWlsbGlTZWNvbmRzRnJvbVVuaXRzLAogIHVuaXRzOiAoKSA9PiB1bml0cwp9KTsKdmFyIGluaXRfZGlzdF90czYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4xLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfY3Jvbm1hbmFnZXIoKTsKICAgIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfY3JvbmpvYigpOwogICAgaW5pdF9zbWFydHRpbWVfY2xhc3Nlc19leHRlbmRlZGRhdGUoKTsKICAgIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfaHJ0bWVhc3VyZW1lbnQoKTsKICAgIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfaW50ZXJ2YWwoKTsKICAgIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfdGltZXIoKTsKICAgIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfdGltZXN0YW1wKCk7CiAgICBpbml0X3NtYXJ0dGltZV91bml0cygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vc3ltYm9sLXRyZWVAMy4yLjQvbm9kZV9tb2R1bGVzL3N5bWJvbC10cmVlL2xpYi9TeW1ib2xUcmVlTm9kZS5qcwp2YXIgcmVxdWlyZV9TeW1ib2xUcmVlTm9kZSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vc3ltYm9sLXRyZWVAMy4yLjQvbm9kZV9tb2R1bGVzL3N5bWJvbC10cmVlL2xpYi9TeW1ib2xUcmVlTm9kZS5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBtb2R1bGUuZXhwb3J0cyA9IGNsYXNzIFN5bWJvbFRyZWVOb2RlIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsOwogICAgICAgIHRoaXMucHJldmlvdXNTaWJsaW5nID0gbnVsbDsKICAgICAgICB0aGlzLm5leHRTaWJsaW5nID0gbnVsbDsKICAgICAgICB0aGlzLmZpcnN0Q2hpbGQgPSBudWxsOwogICAgICAgIHRoaXMubGFzdENoaWxkID0gbnVsbDsKICAgICAgICB0aGlzLmNoaWxkcmVuVmVyc2lvbiA9IDA7CiAgICAgICAgdGhpcy5jaGlsZEluZGV4Q2FjaGVkVXBUbyA9IG51bGw7CiAgICAgICAgdGhpcy5jYWNoZWRJbmRleCA9IC0xOwogICAgICAgIHRoaXMuY2FjaGVkSW5kZXhWZXJzaW9uID0gTmFOOwogICAgICB9CiAgICAgIGdldCBpc0F0dGFjaGVkKCkgewogICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMucGFyZW50IHx8IHRoaXMucHJldmlvdXNTaWJsaW5nIHx8IHRoaXMubmV4dFNpYmxpbmcpOwogICAgICB9CiAgICAgIGdldCBoYXNDaGlsZHJlbigpIHsKICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLmZpcnN0Q2hpbGQpOwogICAgICB9CiAgICAgIGNoaWxkcmVuQ2hhbmdlZCgpIHsKICAgICAgICB0aGlzLmNoaWxkcmVuVmVyc2lvbiA9IHRoaXMuY2hpbGRyZW5WZXJzaW9uICsgMSAmIDQyOTQ5NjcyOTU7CiAgICAgICAgdGhpcy5jaGlsZEluZGV4Q2FjaGVkVXBUbyA9IG51bGw7CiAgICAgIH0KICAgICAgZ2V0Q2FjaGVkSW5kZXgocGFyZW50Tm9kZSkgewogICAgICAgIGlmICh0aGlzLmNhY2hlZEluZGV4VmVyc2lvbiAhPT0gcGFyZW50Tm9kZS5jaGlsZHJlblZlcnNpb24pIHsKICAgICAgICAgIHRoaXMuY2FjaGVkSW5kZXhWZXJzaW9uID0gTmFOOwogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRJbmRleDsKICAgICAgfQogICAgICBzZXRDYWNoZWRJbmRleChwYXJlbnROb2RlLCBpbmRleDIpIHsKICAgICAgICB0aGlzLmNhY2hlZEluZGV4VmVyc2lvbiA9IHBhcmVudE5vZGUuY2hpbGRyZW5WZXJzaW9uOwogICAgICAgIHRoaXMuY2FjaGVkSW5kZXggPSBpbmRleDI7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zeW1ib2wtdHJlZUAzLjIuNC9ub2RlX21vZHVsZXMvc3ltYm9sLXRyZWUvbGliL1RyZWVQb3NpdGlvbi5qcwp2YXIgcmVxdWlyZV9UcmVlUG9zaXRpb24gPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3N5bWJvbC10cmVlQDMuMi40L25vZGVfbW9kdWxlcy9zeW1ib2wtdHJlZS9saWIvVHJlZVBvc2l0aW9uLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIG1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmZyZWV6ZSh7CiAgICAgIC8vIHNhbWUgYXMgRE9NIERPQ1VNRU5UX1BPU0lUSU9OXwogICAgICBESVNDT05ORUNURUQ6IDEsCiAgICAgIFBSRUNFRElORzogMiwKICAgICAgRk9MTE9XSU5HOiA0LAogICAgICBDT05UQUlOUzogOCwKICAgICAgQ09OVEFJTkVEX0JZOiAxNgogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zeW1ib2wtdHJlZUAzLjIuNC9ub2RlX21vZHVsZXMvc3ltYm9sLXRyZWUvbGliL1RyZWVJdGVyYXRvci5qcwp2YXIgcmVxdWlyZV9UcmVlSXRlcmF0b3IgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3N5bWJvbC10cmVlQDMuMi40L25vZGVfbW9kdWxlcy9zeW1ib2wtdHJlZS9saWIvVHJlZUl0ZXJhdG9yLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBUUkVFID0gLyogQF9fUFVSRV9fICovIFN5bWJvbCgpOwogICAgdmFyIFJPT1QgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKCk7CiAgICB2YXIgTkVYVCA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woKTsKICAgIHZhciBJVEVSQVRFX0ZVTkMgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKCk7CiAgICB2YXIgVHJlZUl0ZXJhdG9yID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3Rvcih0cmVlLCByb290NiwgZmlyc3RSZXN1bHQsIGl0ZXJhdGVGdW5jdGlvbikgewogICAgICAgIHRoaXNbVFJFRV0gPSB0cmVlOwogICAgICAgIHRoaXNbUk9PVF0gPSByb290NjsKICAgICAgICB0aGlzW05FWFRdID0gZmlyc3RSZXN1bHQ7CiAgICAgICAgdGhpc1tJVEVSQVRFX0ZVTkNdID0gaXRlcmF0ZUZ1bmN0aW9uOwogICAgICB9CiAgICAgIG5leHQoKSB7CiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXNbVFJFRV07CiAgICAgICAgY29uc3QgaXRlcmF0ZUZ1bmMgPSB0aGlzW0lURVJBVEVfRlVOQ107CiAgICAgICAgY29uc3Qgcm9vdDYgPSB0aGlzW1JPT1RdOwogICAgICAgIGlmICghdGhpc1tORVhUXSkgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgZG9uZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHJvb3Q2CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjb25zdCB2YWx1ZTIgPSB0aGlzW05FWFRdOwogICAgICAgIGlmIChpdGVyYXRlRnVuYyA9PT0gMSkgewogICAgICAgICAgdGhpc1tORVhUXSA9IHRyZWUuX25vZGUodmFsdWUyKS5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgfSBlbHNlIGlmIChpdGVyYXRlRnVuYyA9PT0gMikgewogICAgICAgICAgdGhpc1tORVhUXSA9IHRyZWUuX25vZGUodmFsdWUyKS5uZXh0U2libGluZzsKICAgICAgICB9IGVsc2UgaWYgKGl0ZXJhdGVGdW5jID09PSAzKSB7CiAgICAgICAgICB0aGlzW05FWFRdID0gdHJlZS5fbm9kZSh2YWx1ZTIpLnBhcmVudDsKICAgICAgICB9IGVsc2UgaWYgKGl0ZXJhdGVGdW5jID09PSA0KSB7CiAgICAgICAgICB0aGlzW05FWFRdID0gdHJlZS5wcmVjZWRpbmcodmFsdWUyLCB7IHJvb3Q6IHJvb3Q2IH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzW05FWFRdID0gdHJlZS5mb2xsb3dpbmcodmFsdWUyLCB7IHJvb3Q6IHJvb3Q2IH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgZG9uZTogZmFsc2UsCiAgICAgICAgICB2YWx1ZTogdmFsdWUyCiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUcmVlSXRlcmF0b3IucHJvdG90eXBlLCBTeW1ib2wuaXRlcmF0b3IsIHsKICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LAogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgVHJlZUl0ZXJhdG9yLlBSRVYgPSAxOwogICAgVHJlZUl0ZXJhdG9yLk5FWFQgPSAyOwogICAgVHJlZUl0ZXJhdG9yLlBBUkVOVCA9IDM7CiAgICBUcmVlSXRlcmF0b3IuUFJFQ0VESU5HID0gNDsKICAgIFRyZWVJdGVyYXRvci5GT0xMT1dJTkcgPSA1OwogICAgT2JqZWN0LmZyZWV6ZShUcmVlSXRlcmF0b3IpOwogICAgT2JqZWN0LmZyZWV6ZShUcmVlSXRlcmF0b3IucHJvdG90eXBlKTsKICAgIG1vZHVsZS5leHBvcnRzID0gVHJlZUl0ZXJhdG9yOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vc3ltYm9sLXRyZWVAMy4yLjQvbm9kZV9tb2R1bGVzL3N5bWJvbC10cmVlL2xpYi9TeW1ib2xUcmVlLmpzCnZhciByZXF1aXJlX1N5bWJvbFRyZWUgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3N5bWJvbC10cmVlQDMuMi40L25vZGVfbW9kdWxlcy9zeW1ib2wtdHJlZS9saWIvU3ltYm9sVHJlZS5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgU3ltYm9sVHJlZU5vZGUgPSByZXF1aXJlX1N5bWJvbFRyZWVOb2RlKCk7CiAgICB2YXIgVHJlZVBvc2l0aW9uID0gcmVxdWlyZV9UcmVlUG9zaXRpb24oKTsKICAgIHZhciBUcmVlSXRlcmF0b3IgPSByZXF1aXJlX1RyZWVJdGVyYXRvcigpOwogICAgZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiByZXZlcnNlQXJyYXlJbmRleChhcnJheSwgcmV2ZXJzZUluZGV4KSB7CiAgICAgIHJldHVybiBhcnJheVthcnJheS5sZW5ndGggLSAxIC0gcmV2ZXJzZUluZGV4XTsKICAgIH0KICAgIHZhciBTeW1ib2xUcmVlID0gY2xhc3MgewogICAgICAvKioKICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAqIEBhbGlhcyBtb2R1bGU6c3ltYm9sLXRyZWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbj0nU3ltYm9sVHJlZSBkYXRhJ10gRGVzY3JpcHRpb24gdXNlZCBmb3IgdGhlIFN5bWJvbAogICAgICAgKi8KICAgICAgY29uc3RydWN0b3IoZGVzY3JpcHRpb24pIHsKICAgICAgICB0aGlzLnN5bWJvbCA9IFN5bWJvbChkZXNjcmlwdGlvbiB8fCAiU3ltYm9sVHJlZSBkYXRhIik7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gKG9wdGlvbmFsbHkpIGluaXRpYWxpemUgYW4gb2JqZWN0IHJpZ2h0IGFmdGVyIGl0cyBjcmVhdGlvbiwKICAgICAgICogdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgVjgncyBmYXN0IHByb3BlcnRpZXMuIEFsc28gdXNlZnVsIGlmIHlvdSB3b3VsZCBsaWtlIHRvCiAgICAgICAqIGZyZWV6ZSB5b3VyIG9iamVjdC4KICAgICAgICoKICAgICAgICogYE8oMSlgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QKICAgICAgICogQGFsaWFzIG1vZHVsZTpzeW1ib2wtdHJlZSNpbml0aWFsaXplCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHJldHVybiB7T2JqZWN0fSBvYmplY3QKICAgICAgICovCiAgICAgIGluaXRpYWxpemUob2JqZWN0KSB7CiAgICAgICAgdGhpcy5fbm9kZShvYmplY3QpOwogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgIH0KICAgICAgX25vZGUob2JqZWN0KSB7CiAgICAgICAgaWYgKCFvYmplY3QpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBub2RlMiA9IG9iamVjdFt0aGlzLnN5bWJvbF07CiAgICAgICAgaWYgKG5vZGUyKSB7CiAgICAgICAgICByZXR1cm4gbm9kZTI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmplY3RbdGhpcy5zeW1ib2xdID0gbmV3IFN5bWJvbFRyZWVOb2RlKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3QgaGFzIGFueSBjaGlsZHJlbi4gT3RoZXJ3aXNlIGl0IHJldHVybnMgYGZhbHNlYC4KICAgICAgICoKICAgICAgICogKiBgTygxKWAKICAgICAgICoKICAgICAgICogQG1ldGhvZCBoYXNDaGlsZHJlbgogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59CiAgICAgICAqLwogICAgICBoYXNDaGlsZHJlbihvYmplY3QpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbm9kZShvYmplY3QpLmhhc0NoaWxkcmVuOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgogICAgICAgKgogICAgICAgKiAqIGBPKDEpYAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGZpcnN0Q2hpbGQKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdAogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgICAqLwogICAgICBmaXJzdENoaWxkKG9iamVjdCkgewogICAgICAgIHJldHVybiB0aGlzLl9ub2RlKG9iamVjdCkuZmlyc3RDaGlsZDsKICAgICAgfQogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgbGFzdCBjaGlsZCBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgogICAgICAgKgogICAgICAgKiAqIGBPKDEpYAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGxhc3RDaGlsZAogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICovCiAgICAgIGxhc3RDaGlsZChvYmplY3QpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbm9kZShvYmplY3QpLmxhc3RDaGlsZDsKICAgICAgfQogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgcHJldmlvdXMgc2libGluZyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgogICAgICAgKgogICAgICAgKiAqIGBPKDEpYAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHByZXZpb3VzU2libGluZwogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICovCiAgICAgIHByZXZpb3VzU2libGluZyhvYmplY3QpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbm9kZShvYmplY3QpLnByZXZpb3VzU2libGluZzsKICAgICAgfQogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgbmV4dCBzaWJsaW5nIG9mIHRoZSBnaXZlbiBvYmplY3QuCiAgICAgICAqCiAgICAgICAqICogYE8oMSlgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgbmV4dFNpYmxpbmcKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdAogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgICAqLwogICAgICBuZXh0U2libGluZyhvYmplY3QpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbm9kZShvYmplY3QpLm5leHRTaWJsaW5nOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm4gdGhlIHBhcmVudCBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgogICAgICAgKgogICAgICAgKiAqIGBPKDEpYAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHBhcmVudAogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICovCiAgICAgIHBhcmVudChvYmplY3QpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbm9kZShvYmplY3QpLnBhcmVudDsKICAgICAgfQogICAgICAvKioKICAgICAgICogRmluZCB0aGUgaW5jbHVzaXZlIGRlc2NlbmRhbnQgdGhhdCBpcyBsYXN0IGluIHRyZWUgb3JkZXIgb2YgdGhlIGdpdmVuIG9iamVjdC4KICAgICAgICoKICAgICAgICogKiBgTyhuKWAgKHdvcnN0IGNhc2UpIHdoZXJlIGBuYCBpcyB0aGUgZGVwdGggb2YgdGhlIHN1YnRyZWUgb2YgYG9iamVjdGAKICAgICAgICoKICAgICAgICogQG1ldGhvZCBsYXN0SW5jbHVzaXZlRGVzY2VuZGFudAogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge09iamVjdH0KICAgICAgICovCiAgICAgIGxhc3RJbmNsdXNpdmVEZXNjZW5kYW50KG9iamVjdCkgewogICAgICAgIGxldCBsYXN0Q2hpbGQ7CiAgICAgICAgbGV0IGN1cnJlbnQgPSBvYmplY3Q7CiAgICAgICAgd2hpbGUgKGxhc3RDaGlsZCA9IHRoaXMuX25vZGUoY3VycmVudCkubGFzdENoaWxkKSB7CiAgICAgICAgICBjdXJyZW50ID0gbGFzdENoaWxkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY3VycmVudDsKICAgICAgfQogICAgICAvKioKICAgICAgICogRmluZCB0aGUgcHJlY2VkaW5nIG9iamVjdCAoQSkgb2YgdGhlIGdpdmVuIG9iamVjdCAoQikuCiAgICAgICAqIEFuIG9iamVjdCBBIGlzIHByZWNlZGluZyBhbiBvYmplY3QgQiBpZiBBIGFuZCBCIGFyZSBpbiB0aGUgc2FtZSB0cmVlCiAgICAgICAqIGFuZCBBIGNvbWVzIGJlZm9yZSBCIGluIHRyZWUgb3JkZXIuCiAgICAgICAqCiAgICAgICAqICogYE8obilgICh3b3JzdCBjYXNlKQogICAgICAgKiAqIGBPKDEpYCAoYW1vcnRpemVkIHdoZW4gd2Fsa2luZyB0aGUgZW50aXJlIHRyZWUpCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgcHJlY2VkaW5nCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucm9vdF0gSWYgc2V0LCBgcm9vdGAgbXVzdCBiZSBhbiBpbmNsdXNpdmUgYW5jZXN0b3IKICAgICAgICogICAgICAgIG9mIHRoZSByZXR1cm4gdmFsdWUgKG9yIGVsc2UgbnVsbCBpcyByZXR1cm5lZCkuIFRoaXMgY2hlY2sgX2Fzc3VtZXNfCiAgICAgICAqICAgICAgICB0aGF0IGByb290YCBpcyBhbHNvIGFuIGluY2x1c2l2ZSBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gYG9iamVjdGAKICAgICAgICogQHJldHVybiB7P09iamVjdH0KICAgICAgICovCiAgICAgIHByZWNlZGluZyhvYmplY3QsIG9wdGlvbnMpIHsKICAgICAgICBjb25zdCB0cmVlUm9vdCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5yb290OwogICAgICAgIGlmIChvYmplY3QgPT09IHRyZWVSb290KSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgY29uc3QgcHJldmlvdXNTaWJsaW5nID0gdGhpcy5fbm9kZShvYmplY3QpLnByZXZpb3VzU2libGluZzsKICAgICAgICBpZiAocHJldmlvdXNTaWJsaW5nKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5sYXN0SW5jbHVzaXZlRGVzY2VuZGFudChwcmV2aW91c1NpYmxpbmcpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fbm9kZShvYmplY3QpLnBhcmVudDsKICAgICAgfQogICAgICAvKioKICAgICAgICogRmluZCB0aGUgZm9sbG93aW5nIG9iamVjdCAoQSkgb2YgdGhlIGdpdmVuIG9iamVjdCAoQikuCiAgICAgICAqIEFuIG9iamVjdCBBIGlzIGZvbGxvd2luZyBhbiBvYmplY3QgQiBpZiBBIGFuZCBCIGFyZSBpbiB0aGUgc2FtZSB0cmVlCiAgICAgICAqIGFuZCBBIGNvbWVzIGFmdGVyIEIgaW4gdHJlZSBvcmRlci4KICAgICAgICoKICAgICAgICogKiBgTyhuKWAgKHdvcnN0IGNhc2UpIHdoZXJlIGBuYCBpcyB0aGUgYW1vdW50IG9mIG9iamVjdHMgaW4gdGhlIGVudGlyZSB0cmVlCiAgICAgICAqICogYE8oMSlgIChhbW9ydGl6ZWQgd2hlbiB3YWxraW5nIHRoZSBlbnRpcmUgdHJlZSkKICAgICAgICoKICAgICAgICogQG1ldGhvZCBmb2xsb3dpbmcKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBvYmplY3QKICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucm9vdF0gSWYgc2V0LCBgcm9vdGAgbXVzdCBiZSBhbiBpbmNsdXNpdmUgYW5jZXN0b3IKICAgICAgICogICAgICAgIG9mIHRoZSByZXR1cm4gdmFsdWUgKG9yIGVsc2UgbnVsbCBpcyByZXR1cm5lZCkuIFRoaXMgY2hlY2sgX2Fzc3VtZXNfCiAgICAgICAqICAgICAgICB0aGF0IGByb290YCBpcyBhbHNvIGFuIGluY2x1c2l2ZSBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gYG9iamVjdGAKICAgICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5za2lwQ2hpbGRyZW49ZmFsc2VdIElmIHNldCwgaWdub3JlIHRoZSBjaGlsZHJlbiBvZiBgb2JqZWN0YAogICAgICAgKiBAcmV0dXJuIHs/T2JqZWN0fQogICAgICAgKi8KICAgICAgZm9sbG93aW5nKG9iamVjdCwgb3B0aW9ucykgewogICAgICAgIGNvbnN0IHRyZWVSb290ID0gb3B0aW9ucyAmJiBvcHRpb25zLnJvb3Q7CiAgICAgICAgY29uc3Qgc2tpcENoaWxkcmVuID0gb3B0aW9ucyAmJiBvcHRpb25zLnNraXBDaGlsZHJlbjsKICAgICAgICBjb25zdCBmaXJzdENoaWxkID0gIXNraXBDaGlsZHJlbiAmJiB0aGlzLl9ub2RlKG9iamVjdCkuZmlyc3RDaGlsZDsKICAgICAgICBpZiAoZmlyc3RDaGlsZCkgewogICAgICAgICAgcmV0dXJuIGZpcnN0Q2hpbGQ7CiAgICAgICAgfQogICAgICAgIGxldCBjdXJyZW50ID0gb2JqZWN0OwogICAgICAgIGRvIHsKICAgICAgICAgIGlmIChjdXJyZW50ID09PSB0cmVlUm9vdCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gdGhpcy5fbm9kZShjdXJyZW50KS5uZXh0U2libGluZzsKICAgICAgICAgIGlmIChuZXh0U2libGluZykgewogICAgICAgICAgICByZXR1cm4gbmV4dFNpYmxpbmc7CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyZW50ID0gdGhpcy5fbm9kZShjdXJyZW50KS5wYXJlbnQ7CiAgICAgICAgfSB3aGlsZSAoY3VycmVudCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEFwcGVuZCBhbGwgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIG9iamVjdCB0byBhbiBhcnJheS4KICAgICAgICoKICAgICAgICogKiBgTyhuKWAgd2hlcmUgYG5gIGlzIHRoZSBhbW91bnQgb2YgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIGBwYXJlbnRgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgY2hpbGRyZW5Ub0FycmF5CiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnQKICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogICAgICAgKiBAcGFyYW0ge09iamVjdFtdfSBbb3B0aW9ucy5hcnJheT1bXV0KICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZmlsdGVyXSBGdW5jdGlvbiB0byB0ZXN0IGVhY2ggb2JqZWN0IGJlZm9yZSBpdCBpcyBhZGRlZCB0byB0aGUgYXJyYXkuCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludm9rZWQgd2l0aCBhcmd1bWVudHMgKG9iamVjdCkuIFNob3VsZCByZXR1cm4gYHRydWVgIGlmIGFuIG9iamVjdAogICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0byBiZSBpbmNsdWRlZC4KICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9ucy50aGlzQXJnXSBWYWx1ZSB0byB1c2UgYXMgYHRoaXNgIHdoZW4gZXhlY3V0aW5nIGBmaWx0ZXJgLgogICAgICAgKiBAcmV0dXJuIHtPYmplY3RbXX0KICAgICAgICovCiAgICAgIGNoaWxkcmVuVG9BcnJheShwYXJlbnQsIG9wdGlvbnMpIHsKICAgICAgICBjb25zdCBhcnJheSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5hcnJheSB8fCBbXTsKICAgICAgICBjb25zdCBmaWx0ZXIyID0gb3B0aW9ucyAmJiBvcHRpb25zLmZpbHRlciB8fCByZXR1cm5UcnVlOwogICAgICAgIGNvbnN0IHRoaXNBcmcgPSBvcHRpb25zICYmIG9wdGlvbnMudGhpc0FyZyB8fCB2b2lkIDA7CiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX25vZGUocGFyZW50KTsKICAgICAgICBsZXQgb2JqZWN0ID0gcGFyZW50Tm9kZS5maXJzdENoaWxkOwogICAgICAgIGxldCBpbmRleDIgPSAwOwogICAgICAgIHdoaWxlIChvYmplY3QpIHsKICAgICAgICAgIGNvbnN0IG5vZGUyID0gdGhpcy5fbm9kZShvYmplY3QpOwogICAgICAgICAgbm9kZTIuc2V0Q2FjaGVkSW5kZXgocGFyZW50Tm9kZSwgaW5kZXgyKTsKICAgICAgICAgIGlmIChmaWx0ZXIyLmNhbGwodGhpc0FyZywgb2JqZWN0KSkgewogICAgICAgICAgICBhcnJheS5wdXNoKG9iamVjdCk7CiAgICAgICAgICB9CiAgICAgICAgICBvYmplY3QgPSBub2RlMi5uZXh0U2libGluZzsKICAgICAgICAgICsraW5kZXgyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEFwcGVuZCBhbGwgaW5jbHVzaXZlIGFuY2VzdG9ycyBvZiB0aGUgZ2l2ZW4gb2JqZWN0IHRvIGFuIGFycmF5LgogICAgICAgKgogICAgICAgKiAqIGBPKG4pYCB3aGVyZSBgbmAgaXMgdGhlIGFtb3VudCBvZiBhbmNlc3RvcnMgb2YgdGhlIGdpdmVuIGBvYmplY3RgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgYW5jZXN0b3JzVG9BcnJheQogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgICAgICogQHBhcmFtIHtPYmplY3RbXX0gW29wdGlvbnMuYXJyYXk9W11dCiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmZpbHRlcl0gRnVuY3Rpb24gdG8gdGVzdCBlYWNoIG9iamVjdCBiZWZvcmUgaXQgaXMgYWRkZWQgdG8gdGhlIGFycmF5LgogICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZva2VkIHdpdGggYXJndW1lbnRzIChvYmplY3QpLiBTaG91bGQgcmV0dXJuIGB0cnVlYCBpZiBhbiBvYmplY3QKICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdG8gYmUgaW5jbHVkZWQuCiAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnMudGhpc0FyZ10gVmFsdWUgdG8gdXNlIGFzIGB0aGlzYCB3aGVuIGV4ZWN1dGluZyBgZmlsdGVyYC4KICAgICAgICogQHJldHVybiB7T2JqZWN0W119CiAgICAgICAqLwogICAgICBhbmNlc3RvcnNUb0FycmF5KG9iamVjdCwgb3B0aW9ucykgewogICAgICAgIGNvbnN0IGFycmF5ID0gb3B0aW9ucyAmJiBvcHRpb25zLmFycmF5IHx8IFtdOwogICAgICAgIGNvbnN0IGZpbHRlcjIgPSBvcHRpb25zICYmIG9wdGlvbnMuZmlsdGVyIHx8IHJldHVyblRydWU7CiAgICAgICAgY29uc3QgdGhpc0FyZyA9IG9wdGlvbnMgJiYgb3B0aW9ucy50aGlzQXJnIHx8IHZvaWQgMDsKICAgICAgICBsZXQgYW5jZXN0b3IgPSBvYmplY3Q7CiAgICAgICAgd2hpbGUgKGFuY2VzdG9yKSB7CiAgICAgICAgICBpZiAoZmlsdGVyMi5jYWxsKHRoaXNBcmcsIGFuY2VzdG9yKSkgewogICAgICAgICAgICBhcnJheS5wdXNoKGFuY2VzdG9yKTsKICAgICAgICAgIH0KICAgICAgICAgIGFuY2VzdG9yID0gdGhpcy5fbm9kZShhbmNlc3RvcikucGFyZW50OwogICAgICAgIH0KICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEFwcGVuZCBhbGwgZGVzY2VuZGFudHMgb2YgdGhlIGdpdmVuIG9iamVjdCB0byBhbiBhcnJheSAoaW4gdHJlZSBvcmRlcikuCiAgICAgICAqCiAgICAgICAqICogYE8obilgIHdoZXJlIGBuYCBpcyB0aGUgYW1vdW50IG9mIG9iamVjdHMgaW4gdGhlIHN1Yi10cmVlIG9mIHRoZSBnaXZlbiBgb2JqZWN0YAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHRyZWVUb0FycmF5CiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByb290CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgICAgICogQHBhcmFtIHtPYmplY3RbXX0gW29wdGlvbnMuYXJyYXk9W11dCiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmZpbHRlcl0gRnVuY3Rpb24gdG8gdGVzdCBlYWNoIG9iamVjdCBiZWZvcmUgaXQgaXMgYWRkZWQgdG8gdGhlIGFycmF5LgogICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZva2VkIHdpdGggYXJndW1lbnRzIChvYmplY3QpLiBTaG91bGQgcmV0dXJuIGB0cnVlYCBpZiBhbiBvYmplY3QKICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdG8gYmUgaW5jbHVkZWQuCiAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnMudGhpc0FyZ10gVmFsdWUgdG8gdXNlIGFzIGB0aGlzYCB3aGVuIGV4ZWN1dGluZyBgZmlsdGVyYC4KICAgICAgICogQHJldHVybiB7T2JqZWN0W119CiAgICAgICAqLwogICAgICB0cmVlVG9BcnJheShyb290Niwgb3B0aW9ucykgewogICAgICAgIGNvbnN0IGFycmF5ID0gb3B0aW9ucyAmJiBvcHRpb25zLmFycmF5IHx8IFtdOwogICAgICAgIGNvbnN0IGZpbHRlcjIgPSBvcHRpb25zICYmIG9wdGlvbnMuZmlsdGVyIHx8IHJldHVyblRydWU7CiAgICAgICAgY29uc3QgdGhpc0FyZyA9IG9wdGlvbnMgJiYgb3B0aW9ucy50aGlzQXJnIHx8IHZvaWQgMDsKICAgICAgICBsZXQgb2JqZWN0ID0gcm9vdDY7CiAgICAgICAgd2hpbGUgKG9iamVjdCkgewogICAgICAgICAgaWYgKGZpbHRlcjIuY2FsbCh0aGlzQXJnLCBvYmplY3QpKSB7CiAgICAgICAgICAgIGFycmF5LnB1c2gob2JqZWN0KTsKICAgICAgICAgIH0KICAgICAgICAgIG9iamVjdCA9IHRoaXMuZm9sbG93aW5nKG9iamVjdCwgeyByb290OiByb290NiB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJdGVyYXRlIG92ZXIgYWxsIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBvYmplY3QKICAgICAgICoKICAgICAgICogKiBgTygxKWAgZm9yIGEgc2luZ2xlIGl0ZXJhdGlvbgogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGNoaWxkcmVuSXRlcmF0b3IKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmV2ZXJzZT1mYWxzZV0KICAgICAgICogQHJldHVybiB7T2JqZWN0fSBBbiBpdGVyYWJsZSBpdGVyYXRvciAoRVM2KQogICAgICAgKi8KICAgICAgY2hpbGRyZW5JdGVyYXRvcihwYXJlbnQsIG9wdGlvbnMpIHsKICAgICAgICBjb25zdCByZXZlcnNlID0gb3B0aW9ucyAmJiBvcHRpb25zLnJldmVyc2U7CiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX25vZGUocGFyZW50KTsKICAgICAgICByZXR1cm4gbmV3IFRyZWVJdGVyYXRvcigKICAgICAgICAgIHRoaXMsCiAgICAgICAgICBwYXJlbnQsCiAgICAgICAgICByZXZlcnNlID8gcGFyZW50Tm9kZS5sYXN0Q2hpbGQgOiBwYXJlbnROb2RlLmZpcnN0Q2hpbGQsCiAgICAgICAgICByZXZlcnNlID8gVHJlZUl0ZXJhdG9yLlBSRVYgOiBUcmVlSXRlcmF0b3IuTkVYVAogICAgICAgICk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHByZXZpb3VzIHNpYmxpbmdzIG9mIHRoZSBnaXZlbiBvYmplY3QuIChpbiByZXZlcnNlIHRyZWUgb3JkZXIpCiAgICAgICAqCiAgICAgICAqICogYE8oMSlgIGZvciBhIHNpbmdsZSBpdGVyYXRpb24KICAgICAgICoKICAgICAgICogQG1ldGhvZCBwcmV2aW91c1NpYmxpbmdzSXRlcmF0b3IKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdAogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEFuIGl0ZXJhYmxlIGl0ZXJhdG9yIChFUzYpCiAgICAgICAqLwogICAgICBwcmV2aW91c1NpYmxpbmdzSXRlcmF0b3Iob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3IoCiAgICAgICAgICB0aGlzLAogICAgICAgICAgb2JqZWN0LAogICAgICAgICAgdGhpcy5fbm9kZShvYmplY3QpLnByZXZpb3VzU2libGluZywKICAgICAgICAgIFRyZWVJdGVyYXRvci5QUkVWCiAgICAgICAgKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgbmV4dCBzaWJsaW5ncyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LiAoaW4gdHJlZSBvcmRlcikKICAgICAgICoKICAgICAgICogKiBgTygxKWAgZm9yIGEgc2luZ2xlIGl0ZXJhdGlvbgogICAgICAgKgogICAgICAgKiBAbWV0aG9kIG5leHRTaWJsaW5nc0l0ZXJhdG9yCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHJldHVybiB7T2JqZWN0fSBBbiBpdGVyYWJsZSBpdGVyYXRvciAoRVM2KQogICAgICAgKi8KICAgICAgbmV4dFNpYmxpbmdzSXRlcmF0b3Iob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3IoCiAgICAgICAgICB0aGlzLAogICAgICAgICAgb2JqZWN0LAogICAgICAgICAgdGhpcy5fbm9kZShvYmplY3QpLm5leHRTaWJsaW5nLAogICAgICAgICAgVHJlZUl0ZXJhdG9yLk5FWFQKICAgICAgICApOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJdGVyYXRlIG92ZXIgYWxsIGluY2x1c2l2ZSBhbmNlc3RvcnMgb2YgdGhlIGdpdmVuIG9iamVjdAogICAgICAgKgogICAgICAgKiAqIGBPKDEpYCBmb3IgYSBzaW5nbGUgaXRlcmF0aW9uCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgYW5jZXN0b3JzSXRlcmF0b3IKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdAogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEFuIGl0ZXJhYmxlIGl0ZXJhdG9yIChFUzYpCiAgICAgICAqLwogICAgICBhbmNlc3RvcnNJdGVyYXRvcihvYmplY3QpIHsKICAgICAgICByZXR1cm4gbmV3IFRyZWVJdGVyYXRvcigKICAgICAgICAgIHRoaXMsCiAgICAgICAgICBvYmplY3QsCiAgICAgICAgICBvYmplY3QsCiAgICAgICAgICBUcmVlSXRlcmF0b3IuUEFSRU5UCiAgICAgICAgKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogSXRlcmF0ZSBvdmVyIGFsbCBkZXNjZW5kYW50cyBvZiB0aGUgZ2l2ZW4gb2JqZWN0IChpbiB0cmVlIG9yZGVyKS4KICAgICAgICoKICAgICAgICogV2hlcmUgYG5gIGlzIHRoZSBhbW91bnQgb2Ygb2JqZWN0cyBpbiB0aGUgc3ViLXRyZWUgb2YgdGhlIGdpdmVuIGByb290YDoKICAgICAgICoKICAgICAgICogKiBgTyhuKWAgKHdvcnN0IGNhc2UgZm9yIGEgc2luZ2xlIGl0ZXJhdGlvbikKICAgICAgICogKiBgTyhuKWAgKGFtb3J0aXplZCwgd2hlbiBjb21wbGV0aW5nIHRoZSBpdGVyYXRvcikKICAgICAgICoKICAgICAgICogQG1ldGhvZCB0cmVlSXRlcmF0b3IKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJvb3QKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICAgICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yZXZlcnNlPWZhbHNlXQogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEFuIGl0ZXJhYmxlIGl0ZXJhdG9yIChFUzYpCiAgICAgICAqLwogICAgICB0cmVlSXRlcmF0b3Iocm9vdDYsIG9wdGlvbnMpIHsKICAgICAgICBjb25zdCByZXZlcnNlID0gb3B0aW9ucyAmJiBvcHRpb25zLnJldmVyc2U7CiAgICAgICAgcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3IoCiAgICAgICAgICB0aGlzLAogICAgICAgICAgcm9vdDYsCiAgICAgICAgICByZXZlcnNlID8gdGhpcy5sYXN0SW5jbHVzaXZlRGVzY2VuZGFudChyb290NikgOiByb290NiwKICAgICAgICAgIHJldmVyc2UgPyBUcmVlSXRlcmF0b3IuUFJFQ0VESU5HIDogVHJlZUl0ZXJhdG9yLkZPTExPV0lORwogICAgICAgICk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBvYmplY3QgKHRoZSBudW1iZXIgb2YgcHJlY2VkaW5nIHNpYmxpbmdzKS4KICAgICAgICoKICAgICAgICogKiBgTyhuKWAgd2hlcmUgYG5gIGlzIHRoZSBhbW91bnQgb2YgcHJlY2VkaW5nIHNpYmxpbmdzCiAgICAgICAqICogYE8oMSlgIChhbW9ydGl6ZWQsIGlmIHRoZSB0cmVlIGlzIG5vdCBtb2RpZmllZCkKICAgICAgICoKICAgICAgICogQG1ldGhvZCBpbmRleAogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2hpbGQKICAgICAgICogQHJldHVybiB7TnVtYmVyfSBUaGUgbnVtYmVyIG9mIHByZWNlZGluZyBzaWJsaW5ncywgb3IgLTEgaWYgdGhlIG9iamVjdCBoYXMgbm8gcGFyZW50CiAgICAgICAqLwogICAgICBpbmRleChjaGlsZCkgewogICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHRoaXMuX25vZGUoY2hpbGQpOwogICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9ub2RlKGNoaWxkTm9kZS5wYXJlbnQpOwogICAgICAgIGlmICghcGFyZW50Tm9kZSkgewogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBsZXQgY3VycmVudEluZGV4ID0gY2hpbGROb2RlLmdldENhY2hlZEluZGV4KHBhcmVudE5vZGUpOwogICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gMCkgewogICAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDsKICAgICAgICB9CiAgICAgICAgY3VycmVudEluZGV4ID0gMDsKICAgICAgICBsZXQgb2JqZWN0ID0gcGFyZW50Tm9kZS5maXJzdENoaWxkOwogICAgICAgIGlmIChwYXJlbnROb2RlLmNoaWxkSW5kZXhDYWNoZWRVcFRvKSB7CiAgICAgICAgICBjb25zdCBjYWNoZWRVcFRvTm9kZSA9IHRoaXMuX25vZGUocGFyZW50Tm9kZS5jaGlsZEluZGV4Q2FjaGVkVXBUbyk7CiAgICAgICAgICBvYmplY3QgPSBjYWNoZWRVcFRvTm9kZS5uZXh0U2libGluZzsKICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGNhY2hlZFVwVG9Ob2RlLmdldENhY2hlZEluZGV4KHBhcmVudE5vZGUpICsgMTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKG9iamVjdCkgewogICAgICAgICAgY29uc3Qgbm9kZTIgPSB0aGlzLl9ub2RlKG9iamVjdCk7CiAgICAgICAgICBub2RlMi5zZXRDYWNoZWRJbmRleChwYXJlbnROb2RlLCBjdXJyZW50SW5kZXgpOwogICAgICAgICAgaWYgKG9iamVjdCA9PT0gY2hpbGQpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICArK2N1cnJlbnRJbmRleDsKICAgICAgICAgIG9iamVjdCA9IG5vZGUyLm5leHRTaWJsaW5nOwogICAgICAgIH0KICAgICAgICBwYXJlbnROb2RlLmNoaWxkSW5kZXhDYWNoZWRVcFRvID0gY2hpbGQ7CiAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDsKICAgICAgfQogICAgICAvKioKICAgICAgICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4uCiAgICAgICAqCiAgICAgICAqICogYE8obilgIHdoZXJlIGBuYCBpcyB0aGUgYW1vdW50IG9mIGNoaWxkcmVuCiAgICAgICAqICogYE8oMSlgIChhbW9ydGl6ZWQsIGlmIHRoZSB0cmVlIGlzIG5vdCBtb2RpZmllZCkKICAgICAgICoKICAgICAgICogQG1ldGhvZCBjaGlsZHJlbkNvdW50CiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnQKICAgICAgICogQHJldHVybiB7TnVtYmVyfQogICAgICAgKi8KICAgICAgY2hpbGRyZW5Db3VudChwYXJlbnQpIHsKICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fbm9kZShwYXJlbnQpOwogICAgICAgIGlmICghcGFyZW50Tm9kZS5sYXN0Q2hpbGQpIHsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5pbmRleChwYXJlbnROb2RlLmxhc3RDaGlsZCkgKyAxOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDb21wYXJlIHRoZSBwb3NpdGlvbiBvZiBhbiBvYmplY3QgcmVsYXRpdmUgdG8gYW5vdGhlciBvYmplY3QuIEEgYml0IHNldCBpcyByZXR1cm5lZDoKICAgICAgICoKICAgICAgICogPHVsPgogICAgICAgKiAgICAgPGxpPkRJU0NPTk5FQ1RFRCA6IDE8L2xpPgogICAgICAgKiAgICAgPGxpPlBSRUNFRElORyA6IDI8L2xpPgogICAgICAgKiAgICAgPGxpPkZPTExPV0lORyA6IDQ8L2xpPgogICAgICAgKiAgICAgPGxpPkNPTlRBSU5TIDogODwvbGk+CiAgICAgICAqICAgICA8bGk+Q09OVEFJTkVEX0JZIDogMTY8L2xpPgogICAgICAgKiA8L3VsPgogICAgICAgKgogICAgICAgKiBUaGUgc2VtYW50aWNzIGFyZSB0aGUgc2FtZSBhcyBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiBpbiBET00sIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0CiAgICAgICAqIERJU0NPTk5FQ1RFRCBuZXZlciBvY2N1cnMgd2l0aCBhbnkgb3RoZXIgYml0LgogICAgICAgKgogICAgICAgKiB3aGVyZSBgbmAgYW5kIGBtYCBhcmUgdGhlIGFtb3VudCBvZiBhbmNlc3RvcnMgb2YgYGxlZnRgIGFuZCBgcmlnaHRgOwogICAgICAgKiB3aGVyZSBgb2AgaXMgdGhlIGFtb3VudCBvZiBjaGlsZHJlbiBvZiB0aGUgbG93ZXN0IGNvbW1vbiBhbmNlc3RvciBvZiBgbGVmdGAgYW5kIGByaWdodGA6CiAgICAgICAqCiAgICAgICAqICogYE8obiArIG0gKyBvKWAgKHdvcnN0IGNhc2UpCiAgICAgICAqICogYE8obiArIG0pYCAoYW1vcnRpemVkLCBpZiB0aGUgdHJlZSBpcyBub3QgbW9kaWZpZWQpCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgY29tcGFyZVRyZWVQb3NpdGlvbgogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gbGVmdAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmlnaHQKICAgICAgICogQHJldHVybiB7TnVtYmVyfQogICAgICAgKi8KICAgICAgY29tcGFyZVRyZWVQb3NpdGlvbihsZWZ0LCByaWdodCkgewogICAgICAgIGlmIChsZWZ0ID09PSByaWdodCkgewogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxlZnRBbmNlc3RvcnMgPSBbXTsKICAgICAgICB7CiAgICAgICAgICBsZXQgbGVmdEFuY2VzdG9yID0gbGVmdDsKICAgICAgICAgIHdoaWxlIChsZWZ0QW5jZXN0b3IpIHsKICAgICAgICAgICAgaWYgKGxlZnRBbmNlc3RvciA9PT0gcmlnaHQpIHsKICAgICAgICAgICAgICByZXR1cm4gVHJlZVBvc2l0aW9uLkNPTlRBSU5TIHwgVHJlZVBvc2l0aW9uLlBSRUNFRElORzsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZWZ0QW5jZXN0b3JzLnB1c2gobGVmdEFuY2VzdG9yKTsKICAgICAgICAgICAgbGVmdEFuY2VzdG9yID0gdGhpcy5wYXJlbnQobGVmdEFuY2VzdG9yKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgcmlnaHRBbmNlc3RvcnMgPSBbXTsKICAgICAgICB7CiAgICAgICAgICBsZXQgcmlnaHRBbmNlc3RvciA9IHJpZ2h0OwogICAgICAgICAgd2hpbGUgKHJpZ2h0QW5jZXN0b3IpIHsKICAgICAgICAgICAgaWYgKHJpZ2h0QW5jZXN0b3IgPT09IGxlZnQpIHsKICAgICAgICAgICAgICByZXR1cm4gVHJlZVBvc2l0aW9uLkNPTlRBSU5FRF9CWSB8IFRyZWVQb3NpdGlvbi5GT0xMT1dJTkc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmlnaHRBbmNlc3RvcnMucHVzaChyaWdodEFuY2VzdG9yKTsKICAgICAgICAgICAgcmlnaHRBbmNlc3RvciA9IHRoaXMucGFyZW50KHJpZ2h0QW5jZXN0b3IpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCByb290NiA9IHJldmVyc2VBcnJheUluZGV4KGxlZnRBbmNlc3RvcnMsIDApOwogICAgICAgIGlmICghcm9vdDYgfHwgcm9vdDYgIT09IHJldmVyc2VBcnJheUluZGV4KHJpZ2h0QW5jZXN0b3JzLCAwKSkgewogICAgICAgICAgcmV0dXJuIFRyZWVQb3NpdGlvbi5ESVNDT05ORUNURUQ7CiAgICAgICAgfQogICAgICAgIGxldCBjb21tb25BbmNlc3RvckluZGV4ID0gMDsKICAgICAgICBjb25zdCBhbmNlc3RvcnNNaW5MZW5ndGggPSBNYXRoLm1pbihsZWZ0QW5jZXN0b3JzLmxlbmd0aCwgcmlnaHRBbmNlc3RvcnMubGVuZ3RoKTsKICAgICAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBhbmNlc3RvcnNNaW5MZW5ndGg7ICsraTExKSB7CiAgICAgICAgICBjb25zdCBsZWZ0QW5jZXN0b3IgPSByZXZlcnNlQXJyYXlJbmRleChsZWZ0QW5jZXN0b3JzLCBpMTEpOwogICAgICAgICAgY29uc3QgcmlnaHRBbmNlc3RvciA9IHJldmVyc2VBcnJheUluZGV4KHJpZ2h0QW5jZXN0b3JzLCBpMTEpOwogICAgICAgICAgaWYgKGxlZnRBbmNlc3RvciAhPT0gcmlnaHRBbmNlc3RvcikgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNvbW1vbkFuY2VzdG9ySW5kZXggPSBpMTE7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxlZnRJbmRleCA9IHRoaXMuaW5kZXgocmV2ZXJzZUFycmF5SW5kZXgobGVmdEFuY2VzdG9ycywgY29tbW9uQW5jZXN0b3JJbmRleCArIDEpKTsKICAgICAgICBjb25zdCByaWdodEluZGV4ID0gdGhpcy5pbmRleChyZXZlcnNlQXJyYXlJbmRleChyaWdodEFuY2VzdG9ycywgY29tbW9uQW5jZXN0b3JJbmRleCArIDEpKTsKICAgICAgICByZXR1cm4gcmlnaHRJbmRleCA8IGxlZnRJbmRleCA/IFRyZWVQb3NpdGlvbi5QUkVDRURJTkcgOiBUcmVlUG9zaXRpb24uRk9MTE9XSU5HOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZW1vdmUgdGhlIG9iamVjdCBmcm9tIHRoaXMgdHJlZS4KICAgICAgICogSGFzIG5vIGVmZmVjdCBpZiBhbHJlYWR5IHJlbW92ZWQuCiAgICAgICAqCiAgICAgICAqICogYE8oMSlgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgcmVtb3ZlCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZW1vdmVPYmplY3QKICAgICAgICogQHJldHVybiB7T2JqZWN0fSByZW1vdmVPYmplY3QKICAgICAgICovCiAgICAgIHJlbW92ZShyZW1vdmVPYmplY3QpIHsKICAgICAgICBjb25zdCByZW1vdmVOb2RlID0gdGhpcy5fbm9kZShyZW1vdmVPYmplY3QpOwogICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9ub2RlKHJlbW92ZU5vZGUucGFyZW50KTsKICAgICAgICBjb25zdCBwcmV2Tm9kZSA9IHRoaXMuX25vZGUocmVtb3ZlTm9kZS5wcmV2aW91c1NpYmxpbmcpOwogICAgICAgIGNvbnN0IG5leHROb2RlID0gdGhpcy5fbm9kZShyZW1vdmVOb2RlLm5leHRTaWJsaW5nKTsKICAgICAgICBpZiAocGFyZW50Tm9kZSkgewogICAgICAgICAgaWYgKHBhcmVudE5vZGUuZmlyc3RDaGlsZCA9PT0gcmVtb3ZlT2JqZWN0KSB7CiAgICAgICAgICAgIHBhcmVudE5vZGUuZmlyc3RDaGlsZCA9IHJlbW92ZU5vZGUubmV4dFNpYmxpbmc7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocGFyZW50Tm9kZS5sYXN0Q2hpbGQgPT09IHJlbW92ZU9iamVjdCkgewogICAgICAgICAgICBwYXJlbnROb2RlLmxhc3RDaGlsZCA9IHJlbW92ZU5vZGUucHJldmlvdXNTaWJsaW5nOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocHJldk5vZGUpIHsKICAgICAgICAgIHByZXZOb2RlLm5leHRTaWJsaW5nID0gcmVtb3ZlTm9kZS5uZXh0U2libGluZzsKICAgICAgICB9CiAgICAgICAgaWYgKG5leHROb2RlKSB7CiAgICAgICAgICBuZXh0Tm9kZS5wcmV2aW91c1NpYmxpbmcgPSByZW1vdmVOb2RlLnByZXZpb3VzU2libGluZzsKICAgICAgICB9CiAgICAgICAgcmVtb3ZlTm9kZS5wYXJlbnQgPSBudWxsOwogICAgICAgIHJlbW92ZU5vZGUucHJldmlvdXNTaWJsaW5nID0gbnVsbDsKICAgICAgICByZW1vdmVOb2RlLm5leHRTaWJsaW5nID0gbnVsbDsKICAgICAgICByZW1vdmVOb2RlLmNhY2hlZEluZGV4ID0gLTE7CiAgICAgICAgcmVtb3ZlTm9kZS5jYWNoZWRJbmRleFZlcnNpb24gPSBOYU47CiAgICAgICAgaWYgKHBhcmVudE5vZGUpIHsKICAgICAgICAgIHBhcmVudE5vZGUuY2hpbGRyZW5DaGFuZ2VkKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZW1vdmVPYmplY3Q7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEluc2VydCB0aGUgZ2l2ZW4gb2JqZWN0IGJlZm9yZSB0aGUgcmVmZXJlbmNlIG9iamVjdC4KICAgICAgICogYG5ld09iamVjdGAgaXMgbm93IHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mIGByZWZlcmVuY2VPYmplY3RgLgogICAgICAgKgogICAgICAgKiAqIGBPKDEpYAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGluc2VydEJlZm9yZQogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVmZXJlbmNlT2JqZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuZXdPYmplY3QKICAgICAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBuZXdPYmplY3QgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgU3ltYm9sVHJlZQogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IG5ld09iamVjdAogICAgICAgKi8KICAgICAgaW5zZXJ0QmVmb3JlKHJlZmVyZW5jZU9iamVjdCwgbmV3T2JqZWN0KSB7CiAgICAgICAgY29uc3QgcmVmZXJlbmNlTm9kZSA9IHRoaXMuX25vZGUocmVmZXJlbmNlT2JqZWN0KTsKICAgICAgICBjb25zdCBwcmV2Tm9kZSA9IHRoaXMuX25vZGUocmVmZXJlbmNlTm9kZS5wcmV2aW91c1NpYmxpbmcpOwogICAgICAgIGNvbnN0IG5ld05vZGUgPSB0aGlzLl9ub2RlKG5ld09iamVjdCk7CiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX25vZGUocmVmZXJlbmNlTm9kZS5wYXJlbnQpOwogICAgICAgIGlmIChuZXdOb2RlLmlzQXR0YWNoZWQpIHsKICAgICAgICAgIHRocm93IEVycm9yKCJHaXZlbiBvYmplY3QgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgU3ltYm9sVHJlZSwgcmVtb3ZlIGl0IGZpcnN0Iik7CiAgICAgICAgfQogICAgICAgIG5ld05vZGUucGFyZW50ID0gcmVmZXJlbmNlTm9kZS5wYXJlbnQ7CiAgICAgICAgbmV3Tm9kZS5wcmV2aW91c1NpYmxpbmcgPSByZWZlcmVuY2VOb2RlLnByZXZpb3VzU2libGluZzsKICAgICAgICBuZXdOb2RlLm5leHRTaWJsaW5nID0gcmVmZXJlbmNlT2JqZWN0OwogICAgICAgIHJlZmVyZW5jZU5vZGUucHJldmlvdXNTaWJsaW5nID0gbmV3T2JqZWN0OwogICAgICAgIGlmIChwcmV2Tm9kZSkgewogICAgICAgICAgcHJldk5vZGUubmV4dFNpYmxpbmcgPSBuZXdPYmplY3Q7CiAgICAgICAgfQogICAgICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUuZmlyc3RDaGlsZCA9PT0gcmVmZXJlbmNlT2JqZWN0KSB7CiAgICAgICAgICBwYXJlbnROb2RlLmZpcnN0Q2hpbGQgPSBuZXdPYmplY3Q7CiAgICAgICAgfQogICAgICAgIGlmIChwYXJlbnROb2RlKSB7CiAgICAgICAgICBwYXJlbnROb2RlLmNoaWxkcmVuQ2hhbmdlZCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3T2JqZWN0OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJbnNlcnQgdGhlIGdpdmVuIG9iamVjdCBhZnRlciB0aGUgcmVmZXJlbmNlIG9iamVjdC4KICAgICAgICogYG5ld09iamVjdGAgaXMgbm93IHRoZSBuZXh0IHNpYmxpbmcgb2YgYHJlZmVyZW5jZU9iamVjdGAuCiAgICAgICAqCiAgICAgICAqICogYE8oMSlgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgaW5zZXJ0QWZ0ZXIKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlZmVyZW5jZU9iamVjdAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmV3T2JqZWN0CiAgICAgICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgbmV3T2JqZWN0IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIFN5bWJvbFRyZWUKICAgICAgICogQHJldHVybiB7T2JqZWN0fSBuZXdPYmplY3QKICAgICAgICovCiAgICAgIGluc2VydEFmdGVyKHJlZmVyZW5jZU9iamVjdCwgbmV3T2JqZWN0KSB7CiAgICAgICAgY29uc3QgcmVmZXJlbmNlTm9kZSA9IHRoaXMuX25vZGUocmVmZXJlbmNlT2JqZWN0KTsKICAgICAgICBjb25zdCBuZXh0Tm9kZSA9IHRoaXMuX25vZGUocmVmZXJlbmNlTm9kZS5uZXh0U2libGluZyk7CiAgICAgICAgY29uc3QgbmV3Tm9kZSA9IHRoaXMuX25vZGUobmV3T2JqZWN0KTsKICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fbm9kZShyZWZlcmVuY2VOb2RlLnBhcmVudCk7CiAgICAgICAgaWYgKG5ld05vZGUuaXNBdHRhY2hlZCkgewogICAgICAgICAgdGhyb3cgRXJyb3IoIkdpdmVuIG9iamVjdCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBTeW1ib2xUcmVlLCByZW1vdmUgaXQgZmlyc3QiKTsKICAgICAgICB9CiAgICAgICAgbmV3Tm9kZS5wYXJlbnQgPSByZWZlcmVuY2VOb2RlLnBhcmVudDsKICAgICAgICBuZXdOb2RlLnByZXZpb3VzU2libGluZyA9IHJlZmVyZW5jZU9iamVjdDsKICAgICAgICBuZXdOb2RlLm5leHRTaWJsaW5nID0gcmVmZXJlbmNlTm9kZS5uZXh0U2libGluZzsKICAgICAgICByZWZlcmVuY2VOb2RlLm5leHRTaWJsaW5nID0gbmV3T2JqZWN0OwogICAgICAgIGlmIChuZXh0Tm9kZSkgewogICAgICAgICAgbmV4dE5vZGUucHJldmlvdXNTaWJsaW5nID0gbmV3T2JqZWN0OwogICAgICAgIH0KICAgICAgICBpZiAocGFyZW50Tm9kZSAmJiBwYXJlbnROb2RlLmxhc3RDaGlsZCA9PT0gcmVmZXJlbmNlT2JqZWN0KSB7CiAgICAgICAgICBwYXJlbnROb2RlLmxhc3RDaGlsZCA9IG5ld09iamVjdDsKICAgICAgICB9CiAgICAgICAgaWYgKHBhcmVudE5vZGUpIHsKICAgICAgICAgIHBhcmVudE5vZGUuY2hpbGRyZW5DaGFuZ2VkKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdPYmplY3Q7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEluc2VydCB0aGUgZ2l2ZW4gb2JqZWN0IGFzIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgZ2l2ZW4gcmVmZXJlbmNlIG9iamVjdC4KICAgICAgICogYG5ld09iamVjdGAgaXMgbm93IHRoZSBmaXJzdCBjaGlsZCBvZiBgcmVmZXJlbmNlT2JqZWN0YC4KICAgICAgICoKICAgICAgICogKiBgTygxKWAKICAgICAgICoKICAgICAgICogQG1ldGhvZCBwcmVwZW5kQ2hpbGQKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlZmVyZW5jZU9iamVjdAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmV3T2JqZWN0CiAgICAgICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgbmV3T2JqZWN0IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIFN5bWJvbFRyZWUKICAgICAgICogQHJldHVybiB7T2JqZWN0fSBuZXdPYmplY3QKICAgICAgICovCiAgICAgIHByZXBlbmRDaGlsZChyZWZlcmVuY2VPYmplY3QsIG5ld09iamVjdCkgewogICAgICAgIGNvbnN0IHJlZmVyZW5jZU5vZGUgPSB0aGlzLl9ub2RlKHJlZmVyZW5jZU9iamVjdCk7CiAgICAgICAgY29uc3QgbmV3Tm9kZSA9IHRoaXMuX25vZGUobmV3T2JqZWN0KTsKICAgICAgICBpZiAobmV3Tm9kZS5pc0F0dGFjaGVkKSB7CiAgICAgICAgICB0aHJvdyBFcnJvcigiR2l2ZW4gb2JqZWN0IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIFN5bWJvbFRyZWUsIHJlbW92ZSBpdCBmaXJzdCIpOwogICAgICAgIH0KICAgICAgICBpZiAocmVmZXJlbmNlTm9kZS5oYXNDaGlsZHJlbikgewogICAgICAgICAgdGhpcy5pbnNlcnRCZWZvcmUocmVmZXJlbmNlTm9kZS5maXJzdENoaWxkLCBuZXdPYmplY3QpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXdOb2RlLnBhcmVudCA9IHJlZmVyZW5jZU9iamVjdDsKICAgICAgICAgIHJlZmVyZW5jZU5vZGUuZmlyc3RDaGlsZCA9IG5ld09iamVjdDsKICAgICAgICAgIHJlZmVyZW5jZU5vZGUubGFzdENoaWxkID0gbmV3T2JqZWN0OwogICAgICAgICAgcmVmZXJlbmNlTm9kZS5jaGlsZHJlbkNoYW5nZWQoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ld09iamVjdDsKICAgICAgfQogICAgICAvKioKICAgICAgICogSW5zZXJ0IHRoZSBnaXZlbiBvYmplY3QgYXMgdGhlIGxhc3QgY2hpbGQgb2YgdGhlIGdpdmVuIHJlZmVyZW5jZSBvYmplY3QuCiAgICAgICAqIGBuZXdPYmplY3RgIGlzIG5vdyB0aGUgbGFzdCBjaGlsZCBvZiBgcmVmZXJlbmNlT2JqZWN0YC4KICAgICAgICoKICAgICAgICogKiBgTygxKWAKICAgICAgICoKICAgICAgICogQG1ldGhvZCBhcHBlbmRDaGlsZAogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVmZXJlbmNlT2JqZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuZXdPYmplY3QKICAgICAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBuZXdPYmplY3QgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgU3ltYm9sVHJlZQogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IG5ld09iamVjdAogICAgICAgKi8KICAgICAgYXBwZW5kQ2hpbGQocmVmZXJlbmNlT2JqZWN0LCBuZXdPYmplY3QpIHsKICAgICAgICBjb25zdCByZWZlcmVuY2VOb2RlID0gdGhpcy5fbm9kZShyZWZlcmVuY2VPYmplY3QpOwogICAgICAgIGNvbnN0IG5ld05vZGUgPSB0aGlzLl9ub2RlKG5ld09iamVjdCk7CiAgICAgICAgaWYgKG5ld05vZGUuaXNBdHRhY2hlZCkgewogICAgICAgICAgdGhyb3cgRXJyb3IoIkdpdmVuIG9iamVjdCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBTeW1ib2xUcmVlLCByZW1vdmUgaXQgZmlyc3QiKTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlZmVyZW5jZU5vZGUuaGFzQ2hpbGRyZW4pIHsKICAgICAgICAgIHRoaXMuaW5zZXJ0QWZ0ZXIocmVmZXJlbmNlTm9kZS5sYXN0Q2hpbGQsIG5ld09iamVjdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5ld05vZGUucGFyZW50ID0gcmVmZXJlbmNlT2JqZWN0OwogICAgICAgICAgcmVmZXJlbmNlTm9kZS5maXJzdENoaWxkID0gbmV3T2JqZWN0OwogICAgICAgICAgcmVmZXJlbmNlTm9kZS5sYXN0Q2hpbGQgPSBuZXdPYmplY3Q7CiAgICAgICAgICByZWZlcmVuY2VOb2RlLmNoaWxkcmVuQ2hhbmdlZCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3T2JqZWN0OwogICAgICB9CiAgICB9OwogICAgbW9kdWxlLmV4cG9ydHMgPSBTeW1ib2xUcmVlOwogICAgU3ltYm9sVHJlZS5UcmVlUG9zaXRpb24gPSBUcmVlUG9zaXRpb247CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMucGx1Z2lucy5qcwp2YXIgaW1wb3J0X3N5bWJvbF90cmVlOwp2YXIgaW5pdF9jbGFzc2VzX3BsdWdpbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMzKCk7CiAgICBpbml0X2Rpc3RfdHM1KCk7CiAgICBpbml0X2Rpc3RfdHMoKTsKICAgIGluaXRfZGlzdF90czIoKTsKICAgIGluaXRfZGlzdF90czYoKTsKICAgIGltcG9ydF9zeW1ib2xfdHJlZSA9IF9fdG9FU00ocmVxdWlyZV9TeW1ib2xUcmVlKCksIDEpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMi4yL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLmFzeW5jZXhlY3V0aW9uc3RhY2suanMKdmFyIEFzeW5jRXhlY3V0aW9uU3RhY2s7CnZhciBpbml0X2NsYXNzZXNfYXN5bmNleGVjdXRpb25zdGFjayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5hc3luY2V4ZWN1dGlvbnN0YWNrLmpzIigpIHsKICAgIGluaXRfY2xhc3Nlc19wbHVnaW5zKCk7CiAgICBBc3luY0V4ZWN1dGlvblN0YWNrID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLmV4ZWN1dGlvblNsb3RzID0gW107CiAgICAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTsKICAgICAgICB0aGlzLm5vbkV4Y2x1c2l2ZU1heENvbmN1cnJlbmN5ID0gSW5maW5pdHk7CiAgICAgICAgdGhpcy5ub25FeGNsdXNpdmVDdXJyZW50Q291bnQgPSAwOwogICAgICAgIHRoaXMubm9uRXhjbHVzaXZlUGVuZGluZ1F1ZXVlID0gW107CiAgICAgIH0KICAgICAgYXN5bmMgZ2V0RXhjbHVzaXZlRXhlY3V0aW9uU2xvdChmdW5jQXJnLCB0aW1lb3V0QXJnKSB7CiAgICAgICAgY29uc3QgZXhlY3V0aW9uRGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgICAgICBjb25zdCBleGVjdXRpb25TbG90ID0gewogICAgICAgICAgZnVuY1RvRXhlY3V0ZTogZnVuY0FyZywKICAgICAgICAgIGV4ZWN1dGlvbkRlZmVycmVkLAogICAgICAgICAgdGltZW91dDogdGltZW91dEFyZywKICAgICAgICAgIG1vZGU6ICJleGNsdXNpdmUiCiAgICAgICAgfTsKICAgICAgICB0aGlzLmV4ZWN1dGlvblNsb3RzLnB1c2goZXhlY3V0aW9uU2xvdCk7CiAgICAgICAgdGhpcy5wcm9jZXNzRXhlY3V0aW9uU2xvdHMoKTsKICAgICAgICByZXR1cm4gZXhlY3V0aW9uRGVmZXJyZWQucHJvbWlzZTsKICAgICAgfQogICAgICBhc3luYyBnZXROb25FeGNsdXNpdmVFeGVjdXRpb25TbG90KGZ1bmNBcmcsIHRpbWVvdXRBcmcpIHsKICAgICAgICBjb25zdCBleGVjdXRpb25EZWZlcnJlZCA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgICAgIGNvbnN0IGV4ZWN1dGlvblNsb3QgPSB7CiAgICAgICAgICBmdW5jVG9FeGVjdXRlOiBmdW5jQXJnLAogICAgICAgICAgZXhlY3V0aW9uRGVmZXJyZWQsCiAgICAgICAgICB0aW1lb3V0OiB0aW1lb3V0QXJnLAogICAgICAgICAgbW9kZTogIm5vbmV4Y2x1c2l2ZSIKICAgICAgICB9OwogICAgICAgIHRoaXMuZXhlY3V0aW9uU2xvdHMucHVzaChleGVjdXRpb25TbG90KTsKICAgICAgICB0aGlzLnByb2Nlc3NFeGVjdXRpb25TbG90cygpOwogICAgICAgIHJldHVybiBleGVjdXRpb25EZWZlcnJlZC5wcm9taXNlOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgbm9uLWV4Y2x1c2l2ZSB0YXNrcy4KICAgICAgICogQHBhcmFtIGNvbmN1cnJlbmN5IG1pbmltdW0gMSAoSW5maW5pdHkgbWVhbnMgdW5saW1pdGVkKQogICAgICAgKi8KICAgICAgc2V0Tm9uRXhjbHVzaXZlTWF4Q29uY3VycmVuY3koY29uY3VycmVuY3kpIHsKICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShjb25jdXJyZW5jeSkgfHwgY29uY3VycmVuY3kgPCAxKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIm5vbkV4Y2x1c2l2ZU1heENvbmN1cnJlbmN5IG11c3QgYmUgYSBmaW5pdGUgbnVtYmVyID49IDEiKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5ub25FeGNsdXNpdmVNYXhDb25jdXJyZW5jeSA9IGNvbmN1cnJlbmN5OwogICAgICB9CiAgICAgIC8qKiBHZXQgdGhlIGNvbmZpZ3VyZWQgbWF4IGNvbmN1cnJlbmN5IGZvciBub24tZXhjbHVzaXZlIHRhc2tzICovCiAgICAgIGdldE5vbkV4Y2x1c2l2ZU1heENvbmN1cnJlbmN5KCkgewogICAgICAgIHJldHVybiB0aGlzLm5vbkV4Y2x1c2l2ZU1heENvbmN1cnJlbmN5OwogICAgICB9CiAgICAgIC8qKiBOdW1iZXIgb2Ygbm9uLWV4Y2x1c2l2ZSB0YXNrcyBjdXJyZW50bHkgcnVubmluZyAqLwogICAgICBnZXRBY3RpdmVOb25FeGNsdXNpdmVDb3VudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub25FeGNsdXNpdmVDdXJyZW50Q291bnQ7CiAgICAgIH0KICAgICAgLyoqIE51bWJlciBvZiBub24tZXhjbHVzaXZlIHRhc2tzIHdhaXRpbmcgZm9yIGEgZnJlZSBzbG90ICovCiAgICAgIGdldFBlbmRpbmdOb25FeGNsdXNpdmVDb3VudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub25FeGNsdXNpdmVQZW5kaW5nUXVldWUubGVuZ3RoOwogICAgICB9CiAgICAgIGFzeW5jIHByb2Nlc3NFeGVjdXRpb25TbG90cygpIHsKICAgICAgICBpZiAodGhpcy5pc1Byb2Nlc3NpbmcpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSB0cnVlOwogICAgICAgIHdoaWxlICh0aGlzLmV4ZWN1dGlvblNsb3RzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGNvbnN0IGN1cnJlbnRTbG90ID0gdGhpcy5leGVjdXRpb25TbG90c1swXTsKICAgICAgICAgIGlmIChjdXJyZW50U2xvdC5tb2RlID09PSAiZXhjbHVzaXZlIikgewogICAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVFeGNsdXNpdmVTbG90KGN1cnJlbnRTbG90KTsKICAgICAgICAgICAgdGhpcy5leGVjdXRpb25TbG90cy5zaGlmdCgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3Qgbm9uRXhjbHVzaXZlU2xvdHMgPSBbXTsKICAgICAgICAgICAgd2hpbGUgKHRoaXMuZXhlY3V0aW9uU2xvdHMubGVuZ3RoID4gMCAmJiB0aGlzLmV4ZWN1dGlvblNsb3RzWzBdLm1vZGUgPT09ICJub25leGNsdXNpdmUiKSB7CiAgICAgICAgICAgICAgbm9uRXhjbHVzaXZlU2xvdHMucHVzaCh0aGlzLmV4ZWN1dGlvblNsb3RzLnNoaWZ0KCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZU5vbkV4Y2x1c2l2ZVNsb3RzKG5vbkV4Y2x1c2l2ZVNsb3RzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTsKICAgICAgfQogICAgICBhc3luYyBleGVjdXRlRXhjbHVzaXZlU2xvdChzbG90KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmIChzbG90LnRpbWVvdXQpIHsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFsKICAgICAgICAgICAgICBzbG90LmZ1bmNUb0V4ZWN1dGUoKSwKICAgICAgICAgICAgICBkaXN0X3RzX2V4cG9ydHMzLmRlbGF5Rm9yKHNsb3QudGltZW91dCkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRpbWVvdXQgcmVhY2hlZCIpOwogICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIF0pOwogICAgICAgICAgICBzbG90LmV4ZWN1dGlvbkRlZmVycmVkLnJlc29sdmUocmVzdWx0KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNsb3QuZnVuY1RvRXhlY3V0ZSgpOwogICAgICAgICAgICBzbG90LmV4ZWN1dGlvbkRlZmVycmVkLnJlc29sdmUocmVzdWx0KTsKICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgc2xvdC5leGVjdXRpb25EZWZlcnJlZC5yZWplY3QoZXJyb3IpOwogICAgICAgIH0KICAgICAgfQogICAgICBhc3luYyBleGVjdXRlTm9uRXhjbHVzaXZlU2xvdHMoc2xvdHMpIHsKICAgICAgICBjb25zdCBwcm9taXNlcyA9IHNsb3RzLm1hcChhc3luYyAoc2xvdCkgPT4gewogICAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yTm9uRXhjbHVzaXZlU2xvdCgpOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKHNsb3QudGltZW91dCkgewogICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbCiAgICAgICAgICAgICAgICBzbG90LmZ1bmNUb0V4ZWN1dGUoKSwKICAgICAgICAgICAgICAgIGRpc3RfdHNfZXhwb3J0czMuZGVsYXlGb3Ioc2xvdC50aW1lb3V0KS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaW1lb3V0IHJlYWNoZWQiKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgc2xvdC5leGVjdXRpb25EZWZlcnJlZC5yZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2xvdC5mdW5jVG9FeGVjdXRlKCk7CiAgICAgICAgICAgICAgc2xvdC5leGVjdXRpb25EZWZlcnJlZC5yZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHNsb3QuZXhlY3V0aW9uRGVmZXJyZWQucmVqZWN0KGVycm9yKTsKICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHRoaXMucmVsZWFzZU5vbkV4Y2x1c2l2ZVNsb3QoKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFdhaXQgdW50aWwgYSBub24tZXhjbHVzaXZlIHNsb3QgaXMgYXZhaWxhYmxlIChyZXNwZWN0cyBtYXggY29uY3VycmVuY3kpLgogICAgICAgKi8KICAgICAgd2FpdEZvck5vbkV4Y2x1c2l2ZVNsb3QoKSB7CiAgICAgICAgaWYgKHRoaXMubm9uRXhjbHVzaXZlQ3VycmVudENvdW50IDwgdGhpcy5ub25FeGNsdXNpdmVNYXhDb25jdXJyZW5jeSkgewogICAgICAgICAgdGhpcy5ub25FeGNsdXNpdmVDdXJyZW50Q291bnQrKzsKICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlMikgPT4gewogICAgICAgICAgdGhpcy5ub25FeGNsdXNpdmVQZW5kaW5nUXVldWUucHVzaCgoKSA9PiB7CiAgICAgICAgICAgIHRoaXMubm9uRXhjbHVzaXZlQ3VycmVudENvdW50Kys7CiAgICAgICAgICAgIHJlc29sdmUyKCk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICAvKiogUmVsZWFzZSBhIG5vbi1leGNsdXNpdmUgc2xvdCBhbmQgd2FrZSB0aGUgbmV4dCB3YWl0ZXIsIGlmIGFueS4gKi8KICAgICAgcmVsZWFzZU5vbkV4Y2x1c2l2ZVNsb3QoKSB7CiAgICAgICAgdGhpcy5ub25FeGNsdXNpdmVDdXJyZW50Q291bnQtLTsKICAgICAgICBjb25zdCBuZXh0MiA9IHRoaXMubm9uRXhjbHVzaXZlUGVuZGluZ1F1ZXVlLnNoaWZ0KCk7CiAgICAgICAgaWYgKG5leHQyKSB7CiAgICAgICAgICBuZXh0MigpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5iYWNrcHJlc3N1cmVkYXJyYXkuanMKdmFyIEJhY2twcmVzc3VyZWRBcnJheTsKdmFyIGluaXRfY2xhc3Nlc19iYWNrcHJlc3N1cmVkYXJyYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMuYmFja3ByZXNzdXJlZGFycmF5LmpzIigpIHsKICAgIGluaXRfY2xhc3Nlc19wbHVnaW5zKCk7CiAgICBCYWNrcHJlc3N1cmVkQXJyYXkgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKGhpZ2hXYXRlck1hcmsgPSAxNikgewogICAgICAgIHRoaXMuaGFzU3BhY2UgPSBuZXcgZGlzdF90c19leHBvcnRzMi5yeGpzLlN1YmplY3QoKTsKICAgICAgICB0aGlzLml0ZW1zQXZhaWxhYmxlID0gbmV3IGRpc3RfdHNfZXhwb3J0czIucnhqcy5TdWJqZWN0KCk7CiAgICAgICAgdGhpcy5kYXRhID0gW107CiAgICAgICAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFyazsKICAgICAgfQogICAgICBwdXNoKGl0ZW0pIHsKICAgICAgICB0aGlzLmRhdGEucHVzaChpdGVtKTsKICAgICAgICB0aGlzLml0ZW1zQXZhaWxhYmxlLm5leHQoIml0ZW1zQXZhaWxhYmxlIik7CiAgICAgICAgY29uc3Qgc3BhY2VBdmFpbGFibGUgPSB0aGlzLmNoZWNrU3BhY2VBdmFpbGFibGUoKTsKICAgICAgICBpZiAoc3BhY2VBdmFpbGFibGUpIHsKICAgICAgICAgIHRoaXMuaGFzU3BhY2UubmV4dCgiaGFzU3BhY2UiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNwYWNlQXZhaWxhYmxlOwogICAgICB9CiAgICAgIHNoaWZ0KCkgewogICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmRhdGEuc2hpZnQoKTsKICAgICAgICBpZiAodGhpcy5jaGVja1NwYWNlQXZhaWxhYmxlKCkpIHsKICAgICAgICAgIHRoaXMuaGFzU3BhY2UubmV4dCgiaGFzU3BhY2UiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGl0ZW07CiAgICAgIH0KICAgICAgY2hlY2tTcGFjZUF2YWlsYWJsZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aCA8IHRoaXMuaGlnaFdhdGVyTWFyazsKICAgICAgfQogICAgICBjaGVja0hhc0l0ZW1zKCkgewogICAgICAgIHJldHVybiB0aGlzLmRhdGEubGVuZ3RoID4gMDsKICAgICAgfQogICAgICB3YWl0Rm9yU3BhY2UoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlMikgPT4gewogICAgICAgICAgaWYgKHRoaXMuY2hlY2tTcGFjZUF2YWlsYWJsZSgpKSB7CiAgICAgICAgICAgIHJlc29sdmUyKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLmhhc1NwYWNlLnN1YnNjcmliZSgoKSA9PiB7CiAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgcmVzb2x2ZTIoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgd2FpdEZvckl0ZW1zKCkgewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHsKICAgICAgICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgICByZXNvbHZlMigpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5pdGVtc0F2YWlsYWJsZS5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgIHJlc29sdmUyKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMi4yL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLmZhc3RtYXAuanMKdmFyIEZhc3RNYXA7CnZhciBpbml0X2NsYXNzZXNfZmFzdG1hcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5mYXN0bWFwLmpzIigpIHsKICAgIGluaXRfY2xhc3Nlc19wbHVnaW5zKCk7CiAgICBGYXN0TWFwID0gY2xhc3MgX0Zhc3RNYXAgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLm1hcE9iamVjdCA9IHt9OwogICAgICB9CiAgICAgIGlzVW5pcXVlS2V5KGtleUFyZykgewogICAgICAgIHJldHVybiB0aGlzLm1hcE9iamVjdFtrZXlBcmddID8gZmFsc2UgOiB0cnVlOwogICAgICB9CiAgICAgIGFkZFRvTWFwKGtleUFyZywgb2JqZWN0QXJnLCBvcHRpb25zQXJnKSB7CiAgICAgICAgaWYgKHRoaXMuaXNVbmlxdWVLZXkoa2V5QXJnKSB8fCBvcHRpb25zQXJnICYmIG9wdGlvbnNBcmcuZm9yY2UpIHsKICAgICAgICAgIHRoaXMubWFwT2JqZWN0W2tleUFyZ10gPSBvYmplY3RBcmc7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICBnZXRCeUtleShrZXlBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5tYXBPYmplY3Rba2V5QXJnXTsKICAgICAgfQogICAgICByZW1vdmVGcm9tTWFwKGtleUFyZykgewogICAgICAgIGNvbnN0IHJlbW92ZWRJdGVtID0gdGhpcy5nZXRCeUtleShrZXlBcmcpOwogICAgICAgIGRlbGV0ZSB0aGlzLm1hcE9iamVjdFtrZXlBcmddOwogICAgICAgIHJldHVybiByZW1vdmVkSXRlbTsKICAgICAgfQogICAgICBnZXRLZXlzKCkgewogICAgICAgIGNvbnN0IGtleXMyID0gW107CiAgICAgICAgZm9yIChjb25zdCBrZXlBcmcgaW4gdGhpcy5tYXBPYmplY3QpIHsKICAgICAgICAgIGlmICh0aGlzLm1hcE9iamVjdFtrZXlBcmddKSB7CiAgICAgICAgICAgIGtleXMyLnB1c2goa2V5QXJnKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGtleXMyOwogICAgICB9CiAgICAgIGNsZWFuKCkgewogICAgICAgIHRoaXMubWFwT2JqZWN0ID0ge307CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHJldHVybnMgYSBuZXcgRmFzdG1hcCB0aGF0IGluY2x1ZGVzIGFsbCB2YWx1ZXMgZnJvbSB0aGlzIGFuZCBhbGwgZnJvbSB0aGUgZmFzdG1hcCBpbiB0aGUgYXJndW1lbnQKICAgICAgICovCiAgICAgIGNvbmNhdChmYXN0TWFwQXJnKSB7CiAgICAgICAgY29uc3QgY29uY2F0ZWRGYXN0bWFwID0gbmV3IF9GYXN0TWFwKCk7CiAgICAgICAgZm9yIChjb25zdCBrZXkyIG9mIHRoaXMuZ2V0S2V5cygpKSB7CiAgICAgICAgICBjb25jYXRlZEZhc3RtYXAuYWRkVG9NYXAoa2V5MiwgdGhpcy5nZXRCeUtleShrZXkyKSk7CiAgICAgICAgfQogICAgICAgIGZvciAoY29uc3Qga2V5MiBvZiBmYXN0TWFwQXJnLmdldEtleXMoKSkgewogICAgICAgICAgY29uY2F0ZWRGYXN0bWFwLmFkZFRvTWFwKGtleTIsIGZhc3RNYXBBcmcuZ2V0QnlLZXkoa2V5MiksIHsKICAgICAgICAgICAgZm9yY2U6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29uY2F0ZWRGYXN0bWFwOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiB0cmllcyB0byBtZXJnZSBhbm90aGVyIEZhc3RtYXAKICAgICAgICogTm90ZTogdW5pcXVlS2V5Q29sbGlzaW9ucyB3aWxsIGNhdXNlIG92ZXJ3cml0ZQogICAgICAgKiBAcGFyYW0gZmFzdE1hcEFyZwogICAgICAgKi8KICAgICAgYWRkQWxsRnJvbU90aGVyKGZhc3RNYXBBcmcpIHsKICAgICAgICBmb3IgKGNvbnN0IGtleTIgb2YgZmFzdE1hcEFyZy5nZXRLZXlzKCkpIHsKICAgICAgICAgIHRoaXMuYWRkVG9NYXAoa2V5MiwgZmFzdE1hcEFyZy5nZXRCeUtleShrZXkyKSwgewogICAgICAgICAgICBmb3JjZTogdHJ1ZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIGZpbmQoZmluZEZ1bmN0aW9uQXJnKSB7CiAgICAgICAgZm9yIChjb25zdCBrZXkyIG9mIHRoaXMuZ2V0S2V5cygpKSB7CiAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRCeUtleShrZXkyKTsKICAgICAgICAgIGNvbnN0IGZpbmRGdW5jdGlvblJlc3VsdCA9IGF3YWl0IGZpbmRGdW5jdGlvbkFyZyhpdGVtKTsKICAgICAgICAgIGlmIChmaW5kRnVuY3Rpb25SZXN1bHQpIHsKICAgICAgICAgICAgcmV0dXJuIGl0ZW07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMi4yL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLm9iamVjdG1hcC5qcwp2YXIgdW5pLCBPYmplY3RNYXA7CnZhciBpbml0X2NsYXNzZXNfb2JqZWN0bWFwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMi4yL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLm9iamVjdG1hcC5qcyIoKSB7CiAgICBpbml0X2NsYXNzZXNfcGx1Z2lucygpOwogICAgaW5pdF9jbGFzc2VzX2Zhc3RtYXAoKTsKICAgIHVuaSA9IChwcmVmaXg0ID0gInVuaSIpID0+IHsKICAgICAgcmV0dXJuIGAke3ByZWZpeDR9eHh4eHh4eHh4eHhgLnJlcGxhY2UoL1t4eV0vZywgKGMxMSkgPT4gewogICAgICAgIGNvbnN0IHIxMSA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7CiAgICAgICAgY29uc3QgdjUgPSBjMTEgPT09ICJ4IiA/IHIxMSA6IHIxMSAmIDMgfCA4OwogICAgICAgIHJldHVybiB2NS50b1N0cmluZygxNik7CiAgICAgIH0pOwogICAgfTsKICAgIE9iamVjdE1hcCA9IGNsYXNzIF9PYmplY3RNYXAgewogICAgICAvKioKICAgICAgICogcmV0dXJucyBhIG5ldyBpbnN0YW5jZQogICAgICAgKi8KICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5mYXN0TWFwID0gbmV3IEZhc3RNYXAoKTsKICAgICAgICB0aGlzLmV2ZW50U3ViamVjdCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMyLnJ4anMuU3ViamVjdCgpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBhZGRzIGFuIG9iamVjdCBtYXBwZWQgdG8gYSBzdHJpbmcKICAgICAgICogdGhlIHN0cmluZyBtdXN0IGJlIHVuaXF1ZQogICAgICAgKi8KICAgICAgYWRkTWFwcGVkVW5pcXVlKHVuaXF1ZUtleUFyZywgb2JqZWN0QXJnKSB7CiAgICAgICAgdGhpcy5mYXN0TWFwLmFkZFRvTWFwKHVuaXF1ZUtleUFyZywgb2JqZWN0QXJnKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogZmFzdGVzdCB3YXkgdG8gZ2V0IGFuIG9iamVjdCBmcm9tIHRoZSBtYXAKICAgICAgICogQHBhcmFtIHVuaXF1ZUtleQogICAgICAgKi8KICAgICAgZ2V0TWFwcGVkVW5pcXVlKHVuaXF1ZUtleUFyZykgewogICAgICAgIHJldHVybiB0aGlzLmZhc3RNYXAuZ2V0QnlLZXkodW5pcXVlS2V5QXJnKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogcmVtb3ZlIGtleQogICAgICAgKiBAcGFyYW0gZnVuY3Rpb25BcmcKICAgICAgICovCiAgICAgIHJlbW92ZU1hcHBlZFVuaXF1ZSh1bmlxdWVLZXkpIHsKICAgICAgICBjb25zdCBvYmplY3QgPSB0aGlzLmdldE1hcHBlZFVuaXF1ZSh1bmlxdWVLZXkpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBhZGQgb2JqZWN0IHRvIE9iamVjdG1hcAogICAgICAgKiByZXR1cm5zIGZhbHNlIGlmIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBpbiB0aGUgbWFwCiAgICAgICAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IHdhcyBhZGRlZCBzdWNjZXNzZnVsbHkKICAgICAgICovCiAgICAgIGFkZChvYmplY3RBcmcpIHsKICAgICAgICBmb3IgKGNvbnN0IGtleUFyZyBvZiB0aGlzLmZhc3RNYXAuZ2V0S2V5cygpKSB7CiAgICAgICAgICBjb25zdCBvYmplY3QgPSB0aGlzLmZhc3RNYXAuZ2V0QnlLZXkoa2V5QXJnKTsKICAgICAgICAgIGlmIChvYmplY3QgPT09IG9iamVjdEFyZykgewogICAgICAgICAgICByZXR1cm4ga2V5QXJnOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCB1bmlxdWVLZXkgPSB1bmkoImtleSIpOwogICAgICAgIHRoaXMuYWRkTWFwcGVkVW5pcXVlKHVuaXF1ZUtleSwgb2JqZWN0QXJnKTsKICAgICAgICB0aGlzLmV2ZW50U3ViamVjdC5uZXh0KHsKICAgICAgICAgIG9wZXJhdGlvbjogImFkZCIsCiAgICAgICAgICBwYXlsb2FkOiBvYmplY3RBcmcKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdW5pcXVlS2V5OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBsaWtlIC5hZGQgYnV0IGFkZHMgYW4gd2hvbGUgYXJyYXkgb2Ygb2JqZWN0cwogICAgICAgKi8KICAgICAgYWRkQXJyYXkob2JqZWN0QXJyYXlBcmcpIHsKICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygb2JqZWN0QXJyYXlBcmcpIHsKICAgICAgICAgIHRoaXMuYWRkKGl0ZW0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogY2hlY2sgaWYgb2JqZWN0IGlzIGluIE9iamVjdG1hcAogICAgICAgKi8KICAgICAgY2hlY2tGb3JPYmplY3Qob2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuICEhdGhpcy5nZXRLZXlGb3JPYmplY3Qob2JqZWN0QXJnKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogZ2V0IGtleSBmb3Igb2JqZWN0CiAgICAgICAqIEBwYXJhbSBmaW5kRnVuY3Rpb24KICAgICAgICovCiAgICAgIGdldEtleUZvck9iamVjdChvYmplY3RBcmcpIHsKICAgICAgICBsZXQgZm91bmRLZXkgPSBudWxsOwogICAgICAgIGZvciAoY29uc3Qga2V5QXJnIG9mIHRoaXMuZmFzdE1hcC5nZXRLZXlzKCkpIHsKICAgICAgICAgIGlmICghZm91bmRLZXkgJiYgdGhpcy5mYXN0TWFwLmdldEJ5S2V5KGtleUFyZykgPT09IG9iamVjdEFyZykgewogICAgICAgICAgICBmb3VuZEtleSA9IGtleUFyZzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZm91bmRLZXk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGZpbmQgb2JqZWN0CiAgICAgICAqLwogICAgICBhc3luYyBmaW5kKGZpbmRGdW5jdGlvbikgewogICAgICAgIHJldHVybiB0aGlzLmZhc3RNYXAuZmluZChmaW5kRnVuY3Rpb24pOwogICAgICB9CiAgICAgIGZpbmRTeW5jKGZpbmRGdW5jdGlvbikgewogICAgICAgIGZvciAoY29uc3Qga2V5QXJnIG9mIHRoaXMuZmFzdE1hcC5nZXRLZXlzKCkpIHsKICAgICAgICAgIGlmIChmaW5kRnVuY3Rpb24odGhpcy5mYXN0TWFwLmdldEJ5S2V5KGtleUFyZykpKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldE1hcHBlZFVuaXF1ZShrZXlBcmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogZmluZHMgYSBzcGVjaWZpYyBlbGVtZW50IGFuZCB0aGVuIHJlbW92ZXMgaXQKICAgICAgICovCiAgICAgIGFzeW5jIGZpbmRPbmVBbmRSZW1vdmUoZmluZEZ1bmN0aW9uKSB7CiAgICAgICAgY29uc3QgZm91bmRFbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kKGZpbmRGdW5jdGlvbik7CiAgICAgICAgaWYgKGZvdW5kRWxlbWVudCkgewogICAgICAgICAgdGhpcy5yZW1vdmUoZm91bmRFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZvdW5kRWxlbWVudDsKICAgICAgfQogICAgICBmaW5kT25lQW5kUmVtb3ZlU3luYyhmaW5kRnVuY3Rpb24pIHsKICAgICAgICBjb25zdCBmb3VuZEVsZW1lbnQgPSB0aGlzLmZpbmRTeW5jKGZpbmRGdW5jdGlvbik7CiAgICAgICAgaWYgKGZvdW5kRWxlbWVudCkgewogICAgICAgICAgdGhpcy5yZW1vdmUoZm91bmRFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZvdW5kRWxlbWVudDsKICAgICAgfQogICAgICAvKioKICAgICAgICogcnVuIGZ1bmN0aW9uIGZvciBlYWNoIGl0ZW0gaW4gT2JqZWN0bWFwCiAgICAgICAqLwogICAgICBhc3luYyBmb3JFYWNoKGZ1bmN0aW9uQXJnKSB7CiAgICAgICAgZm9yIChjb25zdCBrZXlBcmcgb2YgdGhpcy5mYXN0TWFwLmdldEtleXMoKSkgewogICAgICAgICAgYXdhaXQgZnVuY3Rpb25BcmcodGhpcy5mYXN0TWFwLmdldEJ5S2V5KGtleUFyZykpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogZ2V0cyBhbiBvYmplY3QgaW4gdGhlIE9ic2VydmFibGVtYXAgYW5kIHJlbW92ZXMgaXQsIHNvIGl0IGNhbid0IGJlIHJldHJpZXZlZCBhZ2FpbgogICAgICAgKi8KICAgICAgZ2V0T25lQW5kUmVtb3ZlKCkgewogICAgICAgIGNvbnN0IGtleXMyID0gdGhpcy5mYXN0TWFwLmdldEtleXMoKTsKICAgICAgICBpZiAoa2V5czIubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3Qga2V5VG9Vc2UgPSBrZXlzMlswXTsKICAgICAgICAgIGNvbnN0IHJlbW92ZWRJdGVtID0gdGhpcy5mYXN0TWFwLnJlbW92ZUZyb21NYXAoa2V5VG9Vc2UpOwogICAgICAgICAgdGhpcy5ldmVudFN1YmplY3QubmV4dCh7CiAgICAgICAgICAgIG9wZXJhdGlvbjogInJlbW92ZSIsCiAgICAgICAgICAgIHBheWxvYWQ6IHJlbW92ZWRJdGVtCiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybiByZW1vdmVkSXRlbTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHJldHVybnMgYSBjbG9uZWQgYXJyYXkgb2YgYWxsIHRoZSBvYmplY3RzIGN1cnJlbnRseSBpbiB0aGUgT2JqZWN0bWFwCiAgICAgICAqLwogICAgICBnZXRBcnJheSgpIHsKICAgICAgICBjb25zdCByZXR1cm5BcnJheSA9IFtdOwogICAgICAgIGZvciAoY29uc3Qga2V5QXJnIG9mIHRoaXMuZmFzdE1hcC5nZXRLZXlzKCkpIHsKICAgICAgICAgIHJldHVybkFycmF5LnB1c2godGhpcy5mYXN0TWFwLmdldEJ5S2V5KGtleUFyZykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0dXJuQXJyYXk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNoZWNrIGlmIE9iamVjdG1hcCBpc3QgZW1wdHkKICAgICAgICovCiAgICAgIGlzRW1wdHkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZmFzdE1hcC5nZXRLZXlzKCkubGVuZ3RoID09PSAwOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiByZW1vdmUgb2JqZWN0IGZyb20gT2JqZWN0bWFwCiAgICAgICAqLwogICAgICByZW1vdmUob2JqZWN0QXJnKSB7CiAgICAgICAgaWYgKHRoaXMuY2hlY2tGb3JPYmplY3Qob2JqZWN0QXJnKSkgewogICAgICAgICAgY29uc3Qga2V5QXJnID0gdGhpcy5nZXRLZXlGb3JPYmplY3Qob2JqZWN0QXJnKTsKICAgICAgICAgIGNvbnN0IHJlbW92ZWRPYmplY3QgPSB0aGlzLmZhc3RNYXAucmVtb3ZlRnJvbU1hcChrZXlBcmcpOwogICAgICAgICAgdGhpcy5ldmVudFN1YmplY3QubmV4dCh7CiAgICAgICAgICAgIG9wZXJhdGlvbjogInJlbW92ZSIsCiAgICAgICAgICAgIHBheWxvYWQ6IHJlbW92ZWRPYmplY3QKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIHJlbW92ZWRPYmplY3Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiB3aXBlIE9iamVjdG1hcAogICAgICAgKi8KICAgICAgd2lwZSgpIHsKICAgICAgICBmb3IgKGNvbnN0IGtleUFyZyBvZiB0aGlzLmZhc3RNYXAuZ2V0S2V5cygpKSB7CiAgICAgICAgICB0aGlzLmZhc3RNYXAucmVtb3ZlRnJvbU1hcChrZXlBcmcpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogcmV0dXJucyBhIG5ldyBPYmplY3RtYXAgdGhhdCBpbmNsdWRlcwogICAgICAgKi8KICAgICAgY29uY2F0KG9iamVjdE1hcEFyZykgewogICAgICAgIGNvbnN0IGNvbmNhdHRlZE9iamVjdE1hcCA9IG5ldyBfT2JqZWN0TWFwKCk7CiAgICAgICAgY29uY2F0dGVkT2JqZWN0TWFwLmZhc3RNYXAuYWRkQWxsRnJvbU90aGVyKHRoaXMuZmFzdE1hcCk7CiAgICAgICAgY29uY2F0dGVkT2JqZWN0TWFwLmZhc3RNYXAuYWRkQWxsRnJvbU90aGVyKG9iamVjdE1hcEFyZy5mYXN0TWFwKTsKICAgICAgICByZXR1cm4gY29uY2F0dGVkT2JqZWN0TWFwOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiB0cmllcyB0byBtZXJnZSBhbm90aGVyIE9iamVjdG1hcAogICAgICAgKiBOb3RlOiB1bmlxdWVLZXlDb2xsaXNpb25zIHdpbGwgY2F1c2Ugb3ZlcndyaXRlCiAgICAgICAqIEBwYXJhbSBvYmplY3RNYXBBcmcKICAgICAgICovCiAgICAgIGFkZEFsbEZyb21PdGhlcihvYmplY3RNYXBBcmcpIHsKICAgICAgICB0aGlzLmZhc3RNYXAuYWRkQWxsRnJvbU90aGVyKG9iamVjdE1hcEFyZy5mYXN0TWFwKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5pbnRlcmVzdG1hcC5pbnRlcmVzdC5qcwp2YXIgSW50ZXJlc3Q7CnZhciBpbml0X2NsYXNzZXNfaW50ZXJlc3RtYXBfaW50ZXJlc3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMuaW50ZXJlc3RtYXAuaW50ZXJlc3QuanMiKCkgewogICAgaW5pdF9jbGFzc2VzX3BsdWdpbnMoKTsKICAgIGluaXRfY2xhc3Nlc19pbnRlcmVzdG1hcCgpOwogICAgSW50ZXJlc3QgPSBjbGFzcyB7CiAgICAgIC8qKgogICAgICAgKiBxdWljayBhY2Nlc3MgdG8gYSBzdHJpbmcgdGhhdCBtYWtlcyB0aGUgaW50ZXJlc3QgY29tcGFyYWJsZSBmb3IgY2hlY2tpbmcgZm9yIHNpbWlsYXIgaW50ZXJlc3RzCiAgICAgICAqLwogICAgICBnZXQgY29tcGFyaXNvblN0cmluZygpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJpc29uRnVuYyh0aGlzLm9yaWdpbmFsSW50ZXJlc3QpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBmdWxsZmlsbCB0aGUgaW50ZXJlc3QKICAgICAgICovCiAgICAgIGZ1bGxmaWxsSW50ZXJlc3Qob2JqZWN0QXJnKSB7CiAgICAgICAgdGhpcy5pc0Z1bGxmaWxsZWQgPSB0cnVlOwogICAgICAgIHRoaXMuZnVsbGZpbGxtZW50U3RvcmUgPSBbXTsKICAgICAgICB0aGlzLmludGVyZXN0RGVmZXJyZWQucmVzb2x2ZShvYmplY3RBcmcpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKgogICAgICAgKi8KICAgICAgY29uc3RydWN0b3IoaW50ZXJlc3RNYXBBcmcsIGludGVyZXN0QXJnLCBjb21wYXJpc29uRnVuY0FyZywgb3B0aW9uc0FyZykgewogICAgICAgIHRoaXMuZGVzdHJ1Y3Rpb25UaW1lciA9IG5ldyBkaXN0X3RzX2V4cG9ydHM3LlRpbWVyKDFlNCk7CiAgICAgICAgdGhpcy5pc0Z1bGxmaWxsZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLmZ1bGxmaWxsbWVudFN0b3JlID0gW107CiAgICAgICAgdGhpcy5pbnRlcmVzdERlZmVycmVkID0gbmV3IGRpc3RfdHNfZXhwb3J0cy5EZWZlcnJlZCgpOwogICAgICAgIHRoaXMuaW50ZXJlc3RGdWxsZmlsbGVkID0gdGhpcy5pbnRlcmVzdERlZmVycmVkLnByb21pc2U7CiAgICAgICAgdGhpcy5pbnRlcmVzdE1hcFJlZiA9IGludGVyZXN0TWFwQXJnOwogICAgICAgIHRoaXMub3JpZ2luYWxJbnRlcmVzdCA9IGludGVyZXN0QXJnOwogICAgICAgIHRoaXMuY29tcGFyaXNvbkZ1bmMgPSBjb21wYXJpc29uRnVuY0FyZzsKICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zQXJnOwogICAgICAgIHRoaXMuZGVzdHJ1Y3Rpb25UaW1lci5jb21wbGV0ZWQudGhlbigoKSA9PiB7CiAgICAgICAgICB0aGlzLmRlc3Ryb3koKTsKICAgICAgICB9KTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zPy5tYXJrTG9zdEFmdGVyRGVmYXVsdCkgewogICAgICAgICAgZGlzdF90c19leHBvcnRzMy5kZWxheUZvcih0aGlzLm9wdGlvbnMubWFya0xvc3RBZnRlckRlZmF1bHQpLnRoZW4odGhpcy5tYXJrTG9zdCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgLy8gTElGRUNZQ0xFIE1BTkFHRU1FTlQKICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAvKioKICAgICAgICogc2VsZiBkZXN0cnVjdHMgdGhlIGludGVyZXN0CiAgICAgICAqLwogICAgICBkZXN0cm95KCkgewogICAgICAgIHRoaXMuaW50ZXJlc3RNYXBSZWYucmVtb3ZlSW50ZXJlc3QodGhpcyk7CiAgICAgICAgaWYgKCF0aGlzLmlzRnVsbGZpbGxlZCAmJiB0aGlzLm9wdGlvbnMuZGVmYXVsdEZ1bGxmaWxsbWVudCkgewogICAgICAgICAgdGhpcy5mdWxsZmlsbEludGVyZXN0KHRoaXMub3B0aW9ucy5kZWZhdWx0RnVsbGZpbGxtZW50KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIG5vdGlmaWVzIHRoZSBpbnRlcmVzdCB0aGF0IHRoZSBpbnRlcmVzdCBpbiBpdCBoYXMgYmVlbiBsb3N0CiAgICAgICAqLwogICAgICBtYXJrTG9zdCgpIHsKICAgICAgICB0aGlzLmRlc3RydWN0aW9uVGltZXIuc3RhcnQoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogbm90aWZpZXMgdGhlIGludGVyZXN0IHRoYXQgdGhlIGludGVyZXN0IGluIGl0IGhhcyBiZWVuIHJlc3RvcmVkCiAgICAgICAqLwogICAgICByZW5ldygpIHsKICAgICAgICB0aGlzLmRlc3RydWN0aW9uVGltZXIucmVzZXQoKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5pbnRlcmVzdG1hcC5qcwp2YXIgSW50ZXJlc3RNYXA7CnZhciBpbml0X2NsYXNzZXNfaW50ZXJlc3RtYXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMuaW50ZXJlc3RtYXAuanMiKCkgewogICAgaW5pdF9jbGFzc2VzX3BsdWdpbnMoKTsKICAgIGluaXRfY2xhc3Nlc19vYmplY3RtYXAoKTsKICAgIGluaXRfY2xhc3Nlc19pbnRlcmVzdG1hcF9pbnRlcmVzdCgpOwogICAgSW50ZXJlc3RNYXAgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKGNvbXBhcmlzb25GdW5jQXJnLCBvcHRpb25zQXJnID0ge30pIHsKICAgICAgICB0aGlzLmludGVyZXN0T2JqZWN0TWFwID0gbmV3IE9iamVjdE1hcCgpOwogICAgICAgIHRoaXMuaW50ZXJlc3RPYnNlcnZhYmxlID0gbmV3IGRpc3RfdHNfZXhwb3J0czIuT2JzZXJ2YWJsZUludGFrZSgpOwogICAgICAgIHRoaXMuY29tcGFyaXNvbkZ1bmMgPSBjb21wYXJpc29uRnVuY0FyZzsKICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zQXJnOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBhZGRzIGFuIGludGVyZXN0IHRvIHRoZSBJbnRlcmVzdE1hcAogICAgICAgKiBAcGFyYW0gaW50ZXJlc3RJZAogICAgICAgKi8KICAgICAgYXN5bmMgYWRkSW50ZXJlc3QoaW50ZXJlc3RJZCwgZGVmYXVsdEZ1bGxmaWxsbWVudEFyZykgewogICAgICAgIGNvbnN0IGNvbXBhcmlzb25TdHJpbmcgPSB0aGlzLmNvbXBhcmlzb25GdW5jKGludGVyZXN0SWQpOwogICAgICAgIGxldCByZXR1cm5JbnRlcmVzdDsKICAgICAgICBjb25zdCBuZXdJbnRlcmVzdCA9IG5ldyBJbnRlcmVzdCh0aGlzLCBpbnRlcmVzdElkLCB0aGlzLmNvbXBhcmlzb25GdW5jLCB7CiAgICAgICAgICBtYXJrTG9zdEFmdGVyRGVmYXVsdDogdGhpcy5vcHRpb25zLm1hcmtMb3N0QWZ0ZXJEZWZhdWx0LAogICAgICAgICAgZGVmYXVsdEZ1bGxmaWxsbWVudDogZGVmYXVsdEZ1bGxmaWxsbWVudEFyZwogICAgICAgIH0pOwogICAgICAgIGxldCBpbnRlcmVzdEV4aXN0cyA9IGZhbHNlOwogICAgICAgIGF3YWl0IHRoaXMuaW50ZXJlc3RPYmplY3RNYXAuZm9yRWFjaCgoaW50ZXJlc3RBcmcpID0+IHsKICAgICAgICAgIGlmICghaW50ZXJlc3RFeGlzdHMgJiYgaW50ZXJlc3RBcmcuY29tcGFyaXNvblN0cmluZyA9PT0gbmV3SW50ZXJlc3QuY29tcGFyaXNvblN0cmluZykgewogICAgICAgICAgICBjb25zb2xlLmxvZygiaW5mbyIsIGBpbnRlcmVzdCBhbHJlYWR5IGV4aXN0cyBmb3IgJHtuZXdJbnRlcmVzdC5jb21wYXJpc29uU3RyaW5nfWApOwogICAgICAgICAgICBpbnRlcmVzdEV4aXN0cyA9IHRydWU7CiAgICAgICAgICAgIHJldHVybkludGVyZXN0ID0gaW50ZXJlc3RBcmc7CiAgICAgICAgICAgIHJldHVybkludGVyZXN0LnJlbmV3KCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKCFyZXR1cm5JbnRlcmVzdCkgewogICAgICAgICAgcmV0dXJuSW50ZXJlc3QgPSBuZXdJbnRlcmVzdDsKICAgICAgICAgIHRoaXMuaW50ZXJlc3RPYmplY3RNYXAuYWRkKHJldHVybkludGVyZXN0KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5pbnRlcmVzdE9ic2VydmFibGUucHVzaChyZXR1cm5JbnRlcmVzdCk7CiAgICAgICAgcmV0dXJuIHJldHVybkludGVyZXN0OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiByZW1vdmVzIGFuIGludGVyZXN0IGZyb20gdGhlIGludGVyZXN0IG1hcAogICAgICAgKi8KICAgICAgcmVtb3ZlSW50ZXJlc3QoaW50ZXJlc3RBcmcpIHsKICAgICAgICBjb25zdCBpbnRlcmVzdFRvUmVtb3ZlID0gdGhpcy5pbnRlcmVzdE9iamVjdE1hcC5maW5kT25lQW5kUmVtb3ZlU3luYygoaW50ZXJlc3RBcmcyKSA9PiB7CiAgICAgICAgICByZXR1cm4gaW50ZXJlc3RBcmcuY29tcGFyaXNvblN0cmluZyA9PT0gaW50ZXJlc3RBcmcyLmNvbXBhcmlzb25TdHJpbmc7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNoZWNrIGludGVyZXN0CiAgICAgICAqLwogICAgICBjaGVja0ludGVyZXN0KG9iamVjdEFyZykgewogICAgICAgIGNvbnN0IGNvbXBhcmlzb25TdHJpbmcgPSB0aGlzLmNvbXBhcmlzb25GdW5jKG9iamVjdEFyZyk7CiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tJbnRlcmVzdEJ5U3RyaW5nKGNvbXBhcmlzb25TdHJpbmcpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBjaGVja3MgYW4gaW50ZXJlc3QKICAgICAgICogQHBhcmFtIGNvbXBhcmlzb25TdHJpbmdBcmcKICAgICAgICovCiAgICAgIGNoZWNrSW50ZXJlc3RCeVN0cmluZyhjb21wYXJpc29uU3RyaW5nQXJnKSB7CiAgICAgICAgY29uc3QgZm91bmRJbnRlcmVzdCA9IHRoaXMuaW50ZXJlc3RPYmplY3RNYXAuZmluZFN5bmMoKGludGVyZXN0KSA9PiB7CiAgICAgICAgICByZXR1cm4gaW50ZXJlc3QuY29tcGFyaXNvblN0cmluZyA9PT0gY29tcGFyaXNvblN0cmluZ0FyZzsKICAgICAgICB9KTsKICAgICAgICBpZiAoZm91bmRJbnRlcmVzdCkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGluZm9ybSBsb3N0IGludGVyZXN0CiAgICAgICAqIEBwYXJhbSBpbnRlcmVzdElkCiAgICAgICAqLwogICAgICBpbmZvcm1Mb3N0SW50ZXJlc3QoaW50ZXJlc3RJZCkgewogICAgICAgIGNvbnN0IHdhbnRlZEludGVyZXN0ID0gdGhpcy5maW5kSW50ZXJlc3QoaW50ZXJlc3RJZCk7CiAgICAgICAgaWYgKHdhbnRlZEludGVyZXN0KSB7CiAgICAgICAgICB3YW50ZWRJbnRlcmVzdC5tYXJrTG9zdCgpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogZmluZHMgYW4gaW50ZXJlc3QKICAgICAgICogQHBhcmFtIGludGVyZXN0SWQKICAgICAgICovCiAgICAgIGZpbmRJbnRlcmVzdChpbnRlcmVzdElkKSB7CiAgICAgICAgY29uc3QgY29tcGFyYWJsZVN0cmluZyA9IHRoaXMuY29tcGFyaXNvbkZ1bmMoaW50ZXJlc3RJZCk7CiAgICAgICAgY29uc3QgaW50ZXJlc3QgPSB0aGlzLmludGVyZXN0T2JqZWN0TWFwLmZpbmRTeW5jKChpbnRlcmVzdEFyZykgPT4gewogICAgICAgICAgcmV0dXJuIGludGVyZXN0QXJnLmNvbXBhcmlzb25TdHJpbmcgPT09IGNvbXBhcmFibGVTdHJpbmc7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGludGVyZXN0OwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMi4yL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLmxpbWl0ZWRhcnJheS5qcwp2YXIgTGltaXRlZEFycmF5Owp2YXIgaW5pdF9jbGFzc2VzX2xpbWl0ZWRhcnJheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5saW1pdGVkYXJyYXkuanMiKCkgewogICAgaW5pdF9jbGFzc2VzX3BsdWdpbnMoKTsKICAgIExpbWl0ZWRBcnJheSA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IobGltaXRBcmcpIHsKICAgICAgICB0aGlzLmFycmF5ID0gW107CiAgICAgICAgdGhpcy5hcnJheUxpbWl0ID0gbGltaXRBcmc7CiAgICAgIH0KICAgICAgYWRkT25lKG9iamVjdEFyZykgewogICAgICAgIHRoaXMuYXJyYXkudW5zaGlmdChvYmplY3RBcmcpOwogICAgICAgIGlmICh0aGlzLmFycmF5Lmxlbmd0aCA+IHRoaXMuYXJyYXlMaW1pdCkgewogICAgICAgICAgdGhpcy5hcnJheS5sZW5ndGggPSB0aGlzLmFycmF5TGltaXQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFkZE1hbnkob2JqZWN0QXJyYXlBcmcpIHsKICAgICAgICBmb3IgKGxldCBvYmplY3RBcmcgb2Ygb2JqZWN0QXJyYXlBcmcpIHsKICAgICAgICAgIHRoaXMuYWRkT25lKG9iamVjdEFyZyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHNldExpbWl0KGxpbWl0QXJnKSB7CiAgICAgICAgdGhpcy5hcnJheUxpbWl0ID0gbGltaXRBcmc7CiAgICAgICAgaWYgKHRoaXMuYXJyYXkubGVuZ3RoID4gdGhpcy5hcnJheUxpbWl0KSB7CiAgICAgICAgICB0aGlzLmFycmF5Lmxlbmd0aCA9IHRoaXMuYXJyYXlMaW1pdDsKICAgICAgICB9CiAgICAgIH0KICAgICAgZ2V0QXZlcmFnZSgpIHsKICAgICAgICBpZiAodHlwZW9mIHRoaXMuYXJyYXlbMF0gPT09ICJudW1iZXIiKSB7CiAgICAgICAgICBsZXQgc3VtID0gMDsKICAgICAgICAgIGZvciAobGV0IGxvY2FsTnVtYmVyIG9mIHRoaXMuYXJyYXkpIHsKICAgICAgICAgICAgbGV0IGxvY2FsTnVtYmVyQW55ID0gbG9jYWxOdW1iZXI7CiAgICAgICAgICAgIHN1bSA9IHN1bSArIGxvY2FsTnVtYmVyQW55OwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHN1bSAvIHRoaXMuYXJyYXkubGVuZ3RoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMubG9vcHRyYWNrZXIuanMKdmFyIExvb3BUcmFja2VyOwp2YXIgaW5pdF9jbGFzc2VzX2xvb3B0cmFja2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMi4yL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLmxvb3B0cmFja2VyLmpzIigpIHsKICAgIGluaXRfY2xhc3Nlc19wbHVnaW5zKCk7CiAgICBpbml0X2NsYXNzZXNfb2JqZWN0bWFwKCk7CiAgICBMb29wVHJhY2tlciA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5yZWZlcmVuY2VPYmplY3RNYXAgPSBuZXcgT2JqZWN0TWFwKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNoZWNrcyBhbmQgdHJhY2tzIGFuIG9iamVjdAogICAgICAgKiBAcGFyYW0gb2JqZWN0QXJnCiAgICAgICAqLwogICAgICBjaGVja0FuZFRyYWNrKG9iamVjdEFyZykgewogICAgICAgIGlmICghdGhpcy5yZWZlcmVuY2VPYmplY3RNYXAuY2hlY2tGb3JPYmplY3Qob2JqZWN0QXJnKSkgewogICAgICAgICAgdGhpcy5yZWZlcmVuY2VPYmplY3RNYXAuYWRkKG9iamVjdEFyZyk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5zdHJpbmdtYXAuanMKdmFyIFN0cmluZ21hcDsKdmFyIGluaXRfY2xhc3Nlc19zdHJpbmdtYXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMuc3RyaW5nbWFwLmpzIigpIHsKICAgIGluaXRfY2xhc3Nlc19wbHVnaW5zKCk7CiAgICBTdHJpbmdtYXAgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuX3N0cmluZ0FycmF5ID0gW107CiAgICAgICAgdGhpcy5fdHJpZ2dlclVudGlsVHJ1ZUZ1bmN0aW9uQXJyYXkgPSBbXTsKICAgICAgfQogICAgICAvKioKICAgICAgICogYWRkIGEgc3RyaW5nIHRvIHRoZSBTdHJpbmdtYXAKICAgICAgICovCiAgICAgIGFkZFN0cmluZyhzdHJpbmdBcmcpIHsKICAgICAgICB0aGlzLl9zdHJpbmdBcnJheS5wdXNoKHN0cmluZ0FyZyk7CiAgICAgICAgdGhpcy5ub3RpZnlUcmlnZ2VyKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGxpa2UgYWRkU3RyaW5nLCBidXQgYWNjZXB0cyBhbiBhcnJheSBvZiBzdHJpbmdzCiAgICAgICAqLwogICAgICBhZGRTdHJpbmdBcnJheShzdHJpbmdBcnJheUFyZykgewogICAgICAgIGZvciAoY29uc3Qgc3RyaW5nSXRlbSBvZiBzdHJpbmdBcnJheUFyZykgewogICAgICAgICAgdGhpcy5hZGRTdHJpbmcoc3RyaW5nSXRlbSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiByZW1vdmVzIGEgc3RyaW5nIGZyb20gU3RyaW5nbWFwCiAgICAgICAqLwogICAgICByZW1vdmVTdHJpbmcoc3RyaW5nQXJnKSB7CiAgICAgICAgZm9yIChjb25zdCBrZXlBcmcgaW4gdGhpcy5fc3RyaW5nQXJyYXkpIHsKICAgICAgICAgIGlmICh0aGlzLl9zdHJpbmdBcnJheVtrZXlBcmddID09PSBzdHJpbmdBcmcpIHsKICAgICAgICAgICAgdGhpcy5fc3RyaW5nQXJyYXkuc3BsaWNlKHBhcnNlSW50KGtleUFyZyksIDEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLm5vdGlmeVRyaWdnZXIoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogd2lwZXMgdGhlIFN0cmluZ21hcAogICAgICAgKi8KICAgICAgd2lwZSgpIHsKICAgICAgICB0aGlzLl9zdHJpbmdBcnJheSA9IFtdOwogICAgICAgIHRoaXMubm90aWZ5VHJpZ2dlcigpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBjaGVjayBpZiBzdHJpbmcgaXMgaW4gU3RyaW5nbWFwCiAgICAgICAqLwogICAgICBjaGVja1N0cmluZyhzdHJpbmdBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc3RyaW5nQXJyYXkuaW5kZXhPZihzdHJpbmdBcmcpICE9PSAtMTsKICAgICAgfQogICAgICAvKioKICAgICAgICogY2hlY2tzIHN0cmluZ1ByZXNlbmNlIHdpdGggbWluaW1hdGNoCiAgICAgICAqLwogICAgICBjaGVja01pbmltYXRjaChtaW5pTWF0Y2hTdHJpbmdBcmcpIHsKICAgICAgICBjb25zdCBzbWFydE1hdGNoSW5zdGFuY2UgPSBuZXcgZGlzdF90c19leHBvcnRzNS5TbWFydE1hdGNoKG1pbmlNYXRjaFN0cmluZ0FyZyk7CiAgICAgICAgbGV0IGZvdW5kTWF0Y2ggPSBmYWxzZTsKICAgICAgICBmb3IgKGNvbnN0IHN0cmluZ0l0ZW0gb2YgdGhpcy5fc3RyaW5nQXJyYXkpIHsKICAgICAgICAgIGlmIChzbWFydE1hdGNoSW5zdGFuY2UubWF0Y2goc3RyaW5nSXRlbSkpIHsKICAgICAgICAgICAgZm91bmRNYXRjaCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmb3VuZE1hdGNoOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBjaGVja3MgaWYgdGhlIFN0cmluZ21hcCBpcyBlbXB0eQogICAgICAgKi8KICAgICAgY2hlY2tJc0VtcHR5KCkgewogICAgICAgIHJldHVybiB0aGlzLl9zdHJpbmdBcnJheS5sZW5ndGggPT09IDA7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGdldHMgYSBjbG9uZWQgY29weSBvZiB0aGUgY3VycmVudCBzdHJpbmcgQXJyYXkKICAgICAgICovCiAgICAgIGdldFN0cmluZ0FycmF5KCkgewogICAgICAgIGNvbnN0IHJldHVybkFycmF5ID0gW107CiAgICAgICAgZm9yIChjb25zdCBzdHJpbmdJdGVtIG9mIHRoaXMuX3N0cmluZ0FycmF5KSB7CiAgICAgICAgICByZXR1cm5BcnJheS5wdXNoKHN0cmluZ0l0ZW0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0dXJuQXJyYXk7CiAgICAgIH0KICAgICAgLy8gdHJpZ2dlciByZWdpc3RlcmluZwogICAgICAvKioKICAgICAgICogcmVnaXN0ZXIgYSBuZXcgdHJpZ2dlcgogICAgICAgKi8KICAgICAgcmVnaXN0ZXJVbnRpbFRydWUoZnVuY3Rpb25BcmcsIGNhbGxiYWNrQXJnKSB7CiAgICAgICAgY29uc3QgdHJ1ZURlZmVycmVkID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICAgICAgdGhpcy5fdHJpZ2dlclVudGlsVHJ1ZUZ1bmN0aW9uQXJyYXkucHVzaCgoKSA9PiB7CiAgICAgICAgICBjb25zdCByZXN1bHQgPSBmdW5jdGlvbkFyZyh0aGlzLmdldFN0cmluZ0FycmF5KCkpOwogICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkgewogICAgICAgICAgICBpZiAoY2FsbGJhY2tBcmcpIHsKICAgICAgICAgICAgICBjYWxsYmFja0FyZygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRydWVEZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0pOwogICAgICAgIHRoaXMubm90aWZ5VHJpZ2dlcigpOwogICAgICAgIHJldHVybiB0cnVlRGVmZXJyZWQucHJvbWlzZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogbm90aWZpZXMgdHJpZ2dlcnMKICAgICAgICovCiAgICAgIG5vdGlmeVRyaWdnZXIoKSB7CiAgICAgICAgY29uc3QgZmlsdGVyZWRBcnJheSA9IHRoaXMuX3RyaWdnZXJVbnRpbFRydWVGdW5jdGlvbkFycmF5LmZpbHRlcigoZnVuY3Rpb25BcmcpID0+IHsKICAgICAgICAgIHJldHVybiAhZnVuY3Rpb25BcmcoKTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLl90cmlnZ2VyVW50aWxUcnVlRnVuY3Rpb25BcnJheSA9IGZpbHRlcmVkQXJyYXk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMudGltZWRhZ2dyZWdhdG9yLmpzCnZhciBUaW1lZEFnZ3JlZ3RvcjsKdmFyIGluaXRfY2xhc3Nlc190aW1lZGFnZ3JlZ2F0b3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMudGltZWRhZ2dyZWdhdG9yLmpzIigpIHsKICAgIGluaXRfY2xhc3Nlc19wbHVnaW5zKCk7CiAgICBUaW1lZEFnZ3JlZ3RvciA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3Iob3B0aW9uc0FyZykgewogICAgICAgIHRoaXMuc3RvcmFnZUFycmF5ID0gW107CiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc0FyZzsKICAgICAgfQogICAgICBjaGVja0FnZ3JlZ2F0aW9uU3RhdHVzKCkgewogICAgICAgIGNvbnN0IGFkZEFnZ3JlZ2F0aW9uVGltZXIgPSAoKSA9PiB7CiAgICAgICAgICB0aGlzLmFnZ3JlZ2F0aW9uVGltZXIgPSBuZXcgZGlzdF90c19leHBvcnRzNy5UaW1lcih0aGlzLm9wdGlvbnMuYWdncmVnYXRpb25JbnRlcnZhbEluTWlsbGlzKTsKICAgICAgICAgIHRoaXMuYWdncmVnYXRpb25UaW1lci5jb21wbGV0ZWQudGhlbigoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGFnZ3JlZ2F0ZUZvclByb2Nlc3NpbmcgPSB0aGlzLnN0b3JhZ2VBcnJheTsKICAgICAgICAgICAgaWYgKGFnZ3JlZ2F0ZUZvclByb2Nlc3NpbmcubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5hZ2dyZWdhdGlvblRpbWVyID0gbnVsbDsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5zdG9yYWdlQXJyYXkgPSBbXTsKICAgICAgICAgICAgYWRkQWdncmVnYXRpb25UaW1lcigpOwogICAgICAgICAgICB0aGlzLm9wdGlvbnMuZnVuY3Rpb25Gb3JBZ2dyZWdhdGlvbihhZ2dyZWdhdGVGb3JQcm9jZXNzaW5nKTsKICAgICAgICAgIH0pOwogICAgICAgICAgdGhpcy5hZ2dyZWdhdGlvblRpbWVyLnN0YXJ0KCk7CiAgICAgICAgfTsKICAgICAgICBpZiAoIXRoaXMuYWdncmVnYXRpb25UaW1lcikgewogICAgICAgICAgYWRkQWdncmVnYXRpb25UaW1lcigpOwogICAgICAgIH0KICAgICAgfQogICAgICBhZGQoYWdncmVnYXRpb25BcmcpIHsKICAgICAgICB0aGlzLnN0b3JhZ2VBcnJheS5wdXNoKGFnZ3JlZ2F0aW9uQXJnKTsKICAgICAgICB0aGlzLmNoZWNrQWdncmVnYXRpb25TdGF0dXMoKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy50cmVlLmpzCnZhciBUcmVlOwp2YXIgaW5pdF9jbGFzc2VzX3RyZWUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMudHJlZS5qcyIoKSB7CiAgICBpbml0X2NsYXNzZXNfcGx1Z2lucygpOwogICAgVHJlZSA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5zeW1ib2xUcmVlID0gbmV3IGltcG9ydF9zeW1ib2xfdHJlZS5kZWZhdWx0KCk7CiAgICAgIH0KICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIC8vIEZ1bmN0aW9ucyB0aGF0IG1hcCB0byB0aGUgZnVuY3Rpb25hbGl0eSBvZiBzeW1ib2wtdHJlZQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgLyoqCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSBvYmplY3RBcmcKICAgICAgICovCiAgICAgIGluaXRpYWxpemUob2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5pbml0aWFsaXplKG9iamVjdEFyZyk7CiAgICAgIH0KICAgICAgaGFzQ2hpbGRyZW4ob2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5oYXNDaGlsZHJlbihvYmplY3RBcmcpOwogICAgICB9CiAgICAgIGZpcnN0Q2hpbGQob2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5maXJzdENoaWxkKG9iamVjdEFyZyk7CiAgICAgIH0KICAgICAgbGFzdENoaWxkKG9iamVjdEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUubGFzdENoaWxkKG9iamVjdEFyZyk7CiAgICAgIH0KICAgICAgcHJldmlvdXNTaWJsaW5nKG9iamVjdEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUucHJldmlvdXNTaWJsaW5nKG9iamVjdEFyZyk7CiAgICAgIH0KICAgICAgbmV4dFNpYmxpbmcob2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5uZXh0U2libGluZyhvYmplY3RBcmcpOwogICAgICB9CiAgICAgIHBhcmVudChvYmplY3RBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLnBhcmVudChvYmplY3RBcmcpOwogICAgICB9CiAgICAgIGxhc3RJbmNsdXNpdmVEZXNjZW5kYW50KG9iamVjdEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUubGFzdEluY2x1c2l2ZURlc2NlbmRhbnQob2JqZWN0QXJnKTsKICAgICAgfQogICAgICBwcmVjZWRpbmcob2JqZWN0QXJnLCBvcHRpb25zQXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5wcmVjZWRpbmcob2JqZWN0QXJnLCBvcHRpb25zQXJnKTsKICAgICAgfQogICAgICBmb2xsb3dpbmcob2JqZWN0LCBvcHRpb25zQXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5mb2xsb3dpbmcob2JqZWN0LCBvcHRpb25zQXJnKTsKICAgICAgfQogICAgICBjaGlsZHJlblRvQXJyYXkocGFyZW50QXJnLCBvcHRpb25zQXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5jaGlsZHJlblRvQXJyYXkocGFyZW50QXJnLCBvcHRpb25zQXJnKTsKICAgICAgfQogICAgICBhbmNlc3RvcnNUb0FycmF5KG9iamVjdEFyZywgb3B0aW9uc0FyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuYW5jZXN0b3JzVG9BcnJheShvYmplY3RBcmcsIG9wdGlvbnNBcmcpOwogICAgICB9CiAgICAgIHRyZWVUb0FycmF5KHJvb3RBcmcsIG9wdGlvbnNBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLnRyZWVUb0FycmF5KHJvb3RBcmcsIG9wdGlvbnNBcmcpOwogICAgICB9CiAgICAgIGNoaWxkcmVuSXRlcmF0b3IocGFyZW50QXJnLCBvcHRpb25zQXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5jaGlsZHJlbkl0ZXJhdG9yKHBhcmVudEFyZywgb3B0aW9uc0FyZyk7CiAgICAgIH0KICAgICAgcHJldmlvdXNTaWJsaW5nc0l0ZXJhdG9yKG9iamVjdEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUucHJldmlvdXNTaWJsaW5nc0l0ZXJhdG9yKG9iamVjdEFyZyk7CiAgICAgIH0KICAgICAgbmV4dFNpYmxpbmdzSXRlcmF0b3Iob2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5uZXh0U2libGluZ3NJdGVyYXRvcigpOwogICAgICB9CiAgICAgIGFuY2VzdG9yc0l0ZXJhdG9yKG9iamVjdEFyZykgewogICAgICAgIHRoaXMuc3ltYm9sVHJlZS5hbmNlc3RvcnNJdGVyYXRvcigpOwogICAgICB9CiAgICAgIHRyZWVJdGVyYXRvcihyb290QXJnLCBvcHRpb25zQXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS50cmVlSXRlcmF0b3Iocm9vdEFyZyk7CiAgICAgIH0KICAgICAgaW5kZXgoY2hpbGRBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmluZGV4KGNoaWxkQXJnKTsKICAgICAgfQogICAgICBjaGlsZHJlbkNvdW50KHBhcmVudEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuY2hpbGRyZW5Db3VudChwYXJlbnRBcmcpOwogICAgICB9CiAgICAgIGNvbXBhcmVUcmVlUG9zaXRpb24obGVmdEFyZywgcmlnaHRBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlVHJlZVBvc2l0aW9uKGxlZnRBcmcsIHJpZ2h0QXJnKTsKICAgICAgfQogICAgICByZW1vdmUocmVtb3ZlT2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5yZW1vdmUocmVtb3ZlT2JqZWN0QXJnKTsKICAgICAgfQogICAgICBpbnNlcnRCZWZvcmUocmVmZXJlbmNlT2JqZWN0QXJnLCBuZXdPYmplY3RBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmluc2VydEJlZm9yZShyZWZlcmVuY2VPYmplY3RBcmcsIG5ld09iamVjdEFyZyk7CiAgICAgIH0KICAgICAgaW5zZXJ0QWZ0ZXIocmVmZXJlbmNlT2JqZWN0LCBuZXdPYmplY3RBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmluc2VydEFmdGVyKHJlZmVyZW5jZU9iamVjdCwgbmV3T2JqZWN0QXJnKTsKICAgICAgfQogICAgICBwcmVwZW5kQ2hpbGQocmVmZXJlbmNlT2JqZWN0QXJnLCBuZXdPYmplY3RBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLnByZXBlbmRDaGlsZChyZWZlcmVuY2VPYmplY3RBcmcsIG5ld09iamVjdEFyZyk7CiAgICAgIH0KICAgICAgYXBwZW5kQ2hpbGQocmVmZXJlbmNlT2JqZWN0QXJnLCBuZXdPYmplY3RBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmFwcGVuZENoaWxkKHJlZmVyZW5jZU9iamVjdEFyZywgbmV3T2JqZWN0QXJnKTsKICAgICAgfQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIC8vIEZ1bmN0aW9uaW9uYWxpdHkgdGhhdCBleHRlbmRzIHN5bWJvbC10cmVlCiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgLyoqCiAgICAgICAqIHJldHVybnMgYSBicmFuY2ggb2YgdGhlIHRyZWUgYXMgSlNPTgogICAgICAgKiBjYW4gYmUgdXNlcgogICAgICAgKi8KICAgICAgdG9Kc29uV2l0aEhpZXJhY2h5KHJvb3RFbGVtZW50KSB7CiAgICAgICAgY29uc3QgdHJlZUl0ZXJhYmxlID0gdGhpcy50cmVlSXRlcmF0b3Iocm9vdEVsZW1lbnQsIHt9KTsKICAgICAgICBmb3IgKGNvbnN0IHRyZWVJdGVtIG9mIHRyZWVJdGVyYWJsZSkgewogICAgICAgICAgY29uc29sZS5sb2codHJlZUl0ZW0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogYnVpbGRzIGEgdHJlZSBmcm9tIGEgSlNPTiB3aXRoIGhpZXJhY2h5CiAgICAgICAqIEBwYXJhbSByb290RWxlbWVudAogICAgICAgKi8KICAgICAgZnJvbUpzb25XaXRoSGllcmFjaHkocm9vdEVsZW1lbnQpIHsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czYgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzNiwgewogIEFzeW5jRXhlY3V0aW9uU3RhY2s6ICgpID0+IEFzeW5jRXhlY3V0aW9uU3RhY2ssCiAgQmFja3ByZXNzdXJlZEFycmF5OiAoKSA9PiBCYWNrcHJlc3N1cmVkQXJyYXksCiAgRmFzdE1hcDogKCkgPT4gRmFzdE1hcCwKICBJbnRlcmVzdDogKCkgPT4gSW50ZXJlc3QsCiAgSW50ZXJlc3RNYXA6ICgpID0+IEludGVyZXN0TWFwLAogIExpbWl0ZWRBcnJheTogKCkgPT4gTGltaXRlZEFycmF5LAogIExvb3BUcmFja2VyOiAoKSA9PiBMb29wVHJhY2tlciwKICBPYmplY3RNYXA6ICgpID0+IE9iamVjdE1hcCwKICBTdHJpbmdtYXA6ICgpID0+IFN0cmluZ21hcCwKICBUaW1lZEFnZ3JlZ3RvcjogKCkgPT4gVGltZWRBZ2dyZWd0b3IsCiAgVHJlZTogKCkgPT4gVHJlZSwKICB1bmk6ICgpID0+IHVuaQp9KTsKdmFyIGluaXRfZGlzdF90czcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfY2xhc3Nlc19hc3luY2V4ZWN1dGlvbnN0YWNrKCk7CiAgICBpbml0X2NsYXNzZXNfYmFja3ByZXNzdXJlZGFycmF5KCk7CiAgICBpbml0X2NsYXNzZXNfZmFzdG1hcCgpOwogICAgaW5pdF9jbGFzc2VzX2ludGVyZXN0bWFwKCk7CiAgICBpbml0X2NsYXNzZXNfaW50ZXJlc3RtYXBfaW50ZXJlc3QoKTsKICAgIGluaXRfY2xhc3Nlc19saW1pdGVkYXJyYXkoKTsKICAgIGluaXRfY2xhc3Nlc19sb29wdHJhY2tlcigpOwogICAgaW5pdF9jbGFzc2VzX29iamVjdG1hcCgpOwogICAgaW5pdF9jbGFzc2VzX3N0cmluZ21hcCgpOwogICAgaW5pdF9jbGFzc2VzX3RpbWVkYWdncmVnYXRvcigpOwogICAgaW5pdF9jbGFzc2VzX3RyZWUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VpbnQ4YXJyYXktZXh0cmFzQDEuNS4wL25vZGVfbW9kdWxlcy91aW50OGFycmF5LWV4dHJhcy9pbmRleC5qcwp2YXIgdWludDhhcnJheV9leHRyYXNfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydCh1aW50OGFycmF5X2V4dHJhc19leHBvcnRzLCB7CiAgYXJlVWludDhBcnJheXNFcXVhbDogKCkgPT4gYXJlVWludDhBcnJheXNFcXVhbCwKICBhc3NlcnRVaW50OEFycmF5OiAoKSA9PiBhc3NlcnRVaW50OEFycmF5LAogIGFzc2VydFVpbnQ4QXJyYXlPckFycmF5QnVmZmVyOiAoKSA9PiBhc3NlcnRVaW50OEFycmF5T3JBcnJheUJ1ZmZlciwKICBiYXNlNjRUb1N0cmluZzogKCkgPT4gYmFzZTY0VG9TdHJpbmcsCiAgYmFzZTY0VG9VaW50OEFycmF5OiAoKSA9PiBiYXNlNjRUb1VpbnQ4QXJyYXksCiAgY29tcGFyZVVpbnQ4QXJyYXlzOiAoKSA9PiBjb21wYXJlVWludDhBcnJheXMsCiAgY29uY2F0VWludDhBcnJheXM6ICgpID0+IGNvbmNhdFVpbnQ4QXJyYXlzLAogIGdldFVpbnRCRTogKCkgPT4gZ2V0VWludEJFLAogIGhleFRvVWludDhBcnJheTogKCkgPT4gaGV4VG9VaW50OEFycmF5LAogIGluY2x1ZGVzOiAoKSA9PiBpbmNsdWRlcywKICBpbmRleE9mOiAoKSA9PiBpbmRleE9mLAogIGlzVWludDhBcnJheTogKCkgPT4gaXNVaW50OEFycmF5LAogIHN0cmluZ1RvQmFzZTY0OiAoKSA9PiBzdHJpbmdUb0Jhc2U2NCwKICBzdHJpbmdUb1VpbnQ4QXJyYXk6ICgpID0+IHN0cmluZ1RvVWludDhBcnJheSwKICB0b1VpbnQ4QXJyYXk6ICgpID0+IHRvVWludDhBcnJheSwKICB1aW50OEFycmF5VG9CYXNlNjQ6ICgpID0+IHVpbnQ4QXJyYXlUb0Jhc2U2NCwKICB1aW50OEFycmF5VG9IZXg6ICgpID0+IHVpbnQ4QXJyYXlUb0hleCwKICB1aW50OEFycmF5VG9TdHJpbmc6ICgpID0+IHVpbnQ4QXJyYXlUb1N0cmluZwp9KTsKZnVuY3Rpb24gaXNUeXBlKHZhbHVlMiwgdHlwZUNvbnN0cnVjdG9yLCB0eXBlU3RyaW5naWZpZWQpIHsKICBpZiAoIXZhbHVlMikgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZiAodmFsdWUyLmNvbnN0cnVjdG9yID09PSB0eXBlQ29uc3RydWN0b3IpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICByZXR1cm4gb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZTIpID09PSB0eXBlU3RyaW5naWZpZWQ7Cn0KZnVuY3Rpb24gaXNVaW50OEFycmF5KHZhbHVlMikgewogIHJldHVybiBpc1R5cGUodmFsdWUyLCBVaW50OEFycmF5LCB1aW50OEFycmF5U3RyaW5naWZpZWQpOwp9CmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIodmFsdWUyKSB7CiAgcmV0dXJuIGlzVHlwZSh2YWx1ZTIsIEFycmF5QnVmZmVyLCBhcnJheUJ1ZmZlclN0cmluZ2lmaWVkKTsKfQpmdW5jdGlvbiBpc1VpbnQ4QXJyYXlPckFycmF5QnVmZmVyKHZhbHVlMikgewogIHJldHVybiBpc1VpbnQ4QXJyYXkodmFsdWUyKSB8fCBpc0FycmF5QnVmZmVyKHZhbHVlMik7Cn0KZnVuY3Rpb24gYXNzZXJ0VWludDhBcnJheSh2YWx1ZTIpIHsKICBpZiAoIWlzVWludDhBcnJheSh2YWx1ZTIpKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcYFVpbnQ4QXJyYXlcYCwgZ290IFxgJHt0eXBlb2YgdmFsdWUyfVxgYCk7CiAgfQp9CmZ1bmN0aW9uIGFzc2VydFVpbnQ4QXJyYXlPckFycmF5QnVmZmVyKHZhbHVlMikgewogIGlmICghaXNVaW50OEFycmF5T3JBcnJheUJ1ZmZlcih2YWx1ZTIpKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcYFVpbnQ4QXJyYXlcYCBvciBcYEFycmF5QnVmZmVyXGAsIGdvdCBcYCR7dHlwZW9mIHZhbHVlMn1cYGApOwogIH0KfQpmdW5jdGlvbiB0b1VpbnQ4QXJyYXkodmFsdWUyKSB7CiAgaWYgKHZhbHVlMiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodmFsdWUyKTsKICB9CiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZTIpKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodmFsdWUyLmJ1ZmZlciwgdmFsdWUyLmJ5dGVPZmZzZXQsIHZhbHVlMi5ieXRlTGVuZ3RoKTsKICB9CiAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5zdXBwb3J0ZWQgdmFsdWUsIGdvdCBcYCR7dHlwZW9mIHZhbHVlMn1cYC5gKTsKfQpmdW5jdGlvbiBjb25jYXRVaW50OEFycmF5cyhhcnJheXMsIHRvdGFsTGVuZ3RoKSB7CiAgaWYgKGFycmF5cy5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTsKICB9CiAgdG90YWxMZW5ndGggPz89IGFycmF5cy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50VmFsdWUpID0+IGFjY3VtdWxhdG9yICsgY3VycmVudFZhbHVlLmxlbmd0aCwgMCk7CiAgY29uc3QgcmV0dXJuVmFsdWUgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7CiAgbGV0IG9mZnNldCA9IDA7CiAgZm9yIChjb25zdCBhcnJheSBvZiBhcnJheXMpIHsKICAgIGFzc2VydFVpbnQ4QXJyYXkoYXJyYXkpOwogICAgcmV0dXJuVmFsdWUuc2V0KGFycmF5LCBvZmZzZXQpOwogICAgb2Zmc2V0ICs9IGFycmF5Lmxlbmd0aDsKICB9CiAgcmV0dXJuIHJldHVyblZhbHVlOwp9CmZ1bmN0aW9uIGFyZVVpbnQ4QXJyYXlzRXF1YWwoYTUsIGI1KSB7CiAgYXNzZXJ0VWludDhBcnJheShhNSk7CiAgYXNzZXJ0VWludDhBcnJheShiNSk7CiAgaWYgKGE1ID09PSBiNSkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIGlmIChhNS5sZW5ndGggIT09IGI1Lmxlbmd0aCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBmb3IgKGxldCBpbmRleDIgPSAwOyBpbmRleDIgPCBhNS5sZW5ndGg7IGluZGV4MisrKSB7CiAgICBpZiAoYTVbaW5kZXgyXSAhPT0gYjVbaW5kZXgyXSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIHJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIGNvbXBhcmVVaW50OEFycmF5cyhhNSwgYjUpIHsKICBhc3NlcnRVaW50OEFycmF5KGE1KTsKICBhc3NlcnRVaW50OEFycmF5KGI1KTsKICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihhNS5sZW5ndGgsIGI1Lmxlbmd0aCk7CiAgZm9yIChsZXQgaW5kZXgyID0gMDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIrKykgewogICAgY29uc3QgZGlmZiA9IGE1W2luZGV4Ml0gLSBiNVtpbmRleDJdOwogICAgaWYgKGRpZmYgIT09IDApIHsKICAgICAgcmV0dXJuIE1hdGguc2lnbihkaWZmKTsKICAgIH0KICB9CiAgcmV0dXJuIE1hdGguc2lnbihhNS5sZW5ndGggLSBiNS5sZW5ndGgpOwp9CmZ1bmN0aW9uIHVpbnQ4QXJyYXlUb1N0cmluZyhhcnJheSwgZW5jb2RpbmcgPSAidXRmOCIpIHsKICBhc3NlcnRVaW50OEFycmF5T3JBcnJheUJ1ZmZlcihhcnJheSk7CiAgY2FjaGVkRGVjb2RlcnNbZW5jb2RpbmddID8/PSBuZXcgZ2xvYmFsVGhpcy5UZXh0RGVjb2RlcihlbmNvZGluZyk7CiAgcmV0dXJuIGNhY2hlZERlY29kZXJzW2VuY29kaW5nXS5kZWNvZGUoYXJyYXkpOwp9CmZ1bmN0aW9uIGFzc2VydFN0cmluZyh2YWx1ZTIpIHsKICBpZiAodHlwZW9mIHZhbHVlMiAhPT0gInN0cmluZyIpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxgc3RyaW5nXGAsIGdvdCBcYCR7dHlwZW9mIHZhbHVlMn1cYGApOwogIH0KfQpmdW5jdGlvbiBzdHJpbmdUb1VpbnQ4QXJyYXkoc3RyaW5nMykgewogIGFzc2VydFN0cmluZyhzdHJpbmczKTsKICByZXR1cm4gY2FjaGVkRW5jb2Rlci5lbmNvZGUoc3RyaW5nMyk7Cn0KZnVuY3Rpb24gYmFzZTY0VG9CYXNlNjRVcmwoYmFzZTY0MikgewogIHJldHVybiBiYXNlNjQyLnJlcGxhY2VBbGwoIisiLCAiLSIpLnJlcGxhY2VBbGwoIi8iLCAiXyIpLnJlcGxhY2UoLz0rJC8sICIiKTsKfQpmdW5jdGlvbiBiYXNlNjRVcmxUb0Jhc2U2NChiYXNlNjR1cmwpIHsKICBjb25zdCBiYXNlNjQyID0gYmFzZTY0dXJsLnJlcGxhY2VBbGwoIi0iLCAiKyIpLnJlcGxhY2VBbGwoIl8iLCAiLyIpOwogIGNvbnN0IHBhZGRpbmcgPSAoNCAtIGJhc2U2NDIubGVuZ3RoICUgNCkgJSA0OwogIHJldHVybiBiYXNlNjQyICsgIj0iLnJlcGVhdChwYWRkaW5nKTsKfQpmdW5jdGlvbiB1aW50OEFycmF5VG9CYXNlNjQoYXJyYXksIHsgdXJsU2FmZSA9IGZhbHNlIH0gPSB7fSkgewogIGFzc2VydFVpbnQ4QXJyYXkoYXJyYXkpOwogIGxldCBiYXNlNjQyID0gIiI7CiAgZm9yIChsZXQgaW5kZXgyID0gMDsgaW5kZXgyIDwgYXJyYXkubGVuZ3RoOyBpbmRleDIgKz0gTUFYX0JMT0NLX1NJWkUpIHsKICAgIGNvbnN0IGNodW5rID0gYXJyYXkuc3ViYXJyYXkoaW5kZXgyLCBpbmRleDIgKyBNQVhfQkxPQ0tfU0laRSk7CiAgICBiYXNlNjQyICs9IGdsb2JhbFRoaXMuYnRvYShTdHJpbmcuZnJvbUNvZGVQb2ludC5hcHBseSh2b2lkIDAsIGNodW5rKSk7CiAgfQogIHJldHVybiB1cmxTYWZlID8gYmFzZTY0VG9CYXNlNjRVcmwoYmFzZTY0MikgOiBiYXNlNjQyOwp9CmZ1bmN0aW9uIGJhc2U2NFRvVWludDhBcnJheShiYXNlNjRTdHJpbmcpIHsKICBhc3NlcnRTdHJpbmcoYmFzZTY0U3RyaW5nKTsKICByZXR1cm4gVWludDhBcnJheS5mcm9tKGdsb2JhbFRoaXMuYXRvYihiYXNlNjRVcmxUb0Jhc2U2NChiYXNlNjRTdHJpbmcpKSwgKHgzKSA9PiB4My5jb2RlUG9pbnRBdCgwKSk7Cn0KZnVuY3Rpb24gc3RyaW5nVG9CYXNlNjQoc3RyaW5nMywgeyB1cmxTYWZlID0gZmFsc2UgfSA9IHt9KSB7CiAgYXNzZXJ0U3RyaW5nKHN0cmluZzMpOwogIHJldHVybiB1aW50OEFycmF5VG9CYXNlNjQoc3RyaW5nVG9VaW50OEFycmF5KHN0cmluZzMpLCB7IHVybFNhZmUgfSk7Cn0KZnVuY3Rpb24gYmFzZTY0VG9TdHJpbmcoYmFzZTY0U3RyaW5nKSB7CiAgYXNzZXJ0U3RyaW5nKGJhc2U2NFN0cmluZyk7CiAgcmV0dXJuIHVpbnQ4QXJyYXlUb1N0cmluZyhiYXNlNjRUb1VpbnQ4QXJyYXkoYmFzZTY0U3RyaW5nKSk7Cn0KZnVuY3Rpb24gdWludDhBcnJheVRvSGV4KGFycmF5KSB7CiAgYXNzZXJ0VWludDhBcnJheShhcnJheSk7CiAgbGV0IGhleFN0cmluZyA9ICIiOwogIGZvciAobGV0IGluZGV4MiA9IDA7IGluZGV4MiA8IGFycmF5Lmxlbmd0aDsgaW5kZXgyKyspIHsKICAgIGhleFN0cmluZyArPSBieXRlVG9IZXhMb29rdXBUYWJsZVthcnJheVtpbmRleDJdXTsKICB9CiAgcmV0dXJuIGhleFN0cmluZzsKfQpmdW5jdGlvbiBoZXhUb1VpbnQ4QXJyYXkoaGV4U3RyaW5nKSB7CiAgYXNzZXJ0U3RyaW5nKGhleFN0cmluZyk7CiAgaWYgKGhleFN0cmluZy5sZW5ndGggJSAyICE9PSAwKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgSGV4IHN0cmluZyBsZW5ndGguIik7CiAgfQogIGNvbnN0IHJlc3VsdExlbmd0aCA9IGhleFN0cmluZy5sZW5ndGggLyAyOwogIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkocmVzdWx0TGVuZ3RoKTsKICBmb3IgKGxldCBpbmRleDIgPSAwOyBpbmRleDIgPCByZXN1bHRMZW5ndGg7IGluZGV4MisrKSB7CiAgICBjb25zdCBoaWdoTmliYmxlID0gaGV4VG9EZWNpbWFsTG9va3VwVGFibGVbaGV4U3RyaW5nW2luZGV4MiAqIDJdXTsKICAgIGNvbnN0IGxvd05pYmJsZSA9IGhleFRvRGVjaW1hbExvb2t1cFRhYmxlW2hleFN0cmluZ1tpbmRleDIgKiAyICsgMV1dOwogICAgaWYgKGhpZ2hOaWJibGUgPT09IHZvaWQgMCB8fCBsb3dOaWJibGUgPT09IHZvaWQgMCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgSGV4IGNoYXJhY3RlciBlbmNvdW50ZXJlZCBhdCBwb3NpdGlvbiAke2luZGV4MiAqIDJ9YCk7CiAgICB9CiAgICBieXRlc1tpbmRleDJdID0gaGlnaE5pYmJsZSA8PCA0IHwgbG93TmliYmxlOwogIH0KICByZXR1cm4gYnl0ZXM7Cn0KZnVuY3Rpb24gZ2V0VWludEJFKHZpZXcpIHsKICBjb25zdCB7IGJ5dGVMZW5ndGggfSA9IHZpZXc7CiAgaWYgKGJ5dGVMZW5ndGggPT09IDYpIHsKICAgIHJldHVybiB2aWV3LmdldFVpbnQxNigwKSAqIDIgKiogMzIgKyB2aWV3LmdldFVpbnQzMigyKTsKICB9CiAgaWYgKGJ5dGVMZW5ndGggPT09IDUpIHsKICAgIHJldHVybiB2aWV3LmdldFVpbnQ4KDApICogMiAqKiAzMiArIHZpZXcuZ2V0VWludDMyKDEpOwogIH0KICBpZiAoYnl0ZUxlbmd0aCA9PT0gNCkgewogICAgcmV0dXJuIHZpZXcuZ2V0VWludDMyKDApOwogIH0KICBpZiAoYnl0ZUxlbmd0aCA9PT0gMykgewogICAgcmV0dXJuIHZpZXcuZ2V0VWludDgoMCkgKiAyICoqIDE2ICsgdmlldy5nZXRVaW50MTYoMSk7CiAgfQogIGlmIChieXRlTGVuZ3RoID09PSAyKSB7CiAgICByZXR1cm4gdmlldy5nZXRVaW50MTYoMCk7CiAgfQogIGlmIChieXRlTGVuZ3RoID09PSAxKSB7CiAgICByZXR1cm4gdmlldy5nZXRVaW50OCgwKTsKICB9Cn0KZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUyKSB7CiAgY29uc3QgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7CiAgY29uc3QgdmFsdWVMZW5ndGggPSB2YWx1ZTIubGVuZ3RoOwogIGlmICh2YWx1ZUxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIC0xOwogIH0KICBpZiAodmFsdWVMZW5ndGggPiBhcnJheUxlbmd0aCkgewogICAgcmV0dXJuIC0xOwogIH0KICBjb25zdCB2YWxpZE9mZnNldExlbmd0aCA9IGFycmF5TGVuZ3RoIC0gdmFsdWVMZW5ndGg7CiAgZm9yIChsZXQgaW5kZXgyID0gMDsgaW5kZXgyIDw9IHZhbGlkT2Zmc2V0TGVuZ3RoOyBpbmRleDIrKykgewogICAgbGV0IGlzTWF0Y2gzID0gdHJ1ZTsKICAgIGZvciAobGV0IGluZGV4MjIgPSAwOyBpbmRleDIyIDwgdmFsdWVMZW5ndGg7IGluZGV4MjIrKykgewogICAgICBpZiAoYXJyYXlbaW5kZXgyICsgaW5kZXgyMl0gIT09IHZhbHVlMltpbmRleDIyXSkgewogICAgICAgIGlzTWF0Y2gzID0gZmFsc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc01hdGNoMykgewogICAgICByZXR1cm4gaW5kZXgyOwogICAgfQogIH0KICByZXR1cm4gLTE7Cn0KZnVuY3Rpb24gaW5jbHVkZXMoYXJyYXksIHZhbHVlMikgewogIHJldHVybiBpbmRleE9mKGFycmF5LCB2YWx1ZTIpICE9PSAtMTsKfQp2YXIgb2JqZWN0VG9TdHJpbmcsIHVpbnQ4QXJyYXlTdHJpbmdpZmllZCwgYXJyYXlCdWZmZXJTdHJpbmdpZmllZCwgY2FjaGVkRGVjb2RlcnMsIGNhY2hlZEVuY29kZXIsIE1BWF9CTE9DS19TSVpFLCBieXRlVG9IZXhMb29rdXBUYWJsZSwgaGV4VG9EZWNpbWFsTG9va3VwVGFibGU7CnZhciBpbml0X3VpbnQ4YXJyYXlfZXh0cmFzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdWludDhhcnJheS1leHRyYXNAMS41LjAvbm9kZV9tb2R1bGVzL3VpbnQ4YXJyYXktZXh0cmFzL2luZGV4LmpzIigpIHsKICAgIG9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKICAgIHVpbnQ4QXJyYXlTdHJpbmdpZmllZCA9ICJbb2JqZWN0IFVpbnQ4QXJyYXldIjsKICAgIGFycmF5QnVmZmVyU3RyaW5naWZpZWQgPSAiW29iamVjdCBBcnJheUJ1ZmZlcl0iOwogICAgY2FjaGVkRGVjb2RlcnMgPSB7CiAgICAgIHV0Zjg6IG5ldyBnbG9iYWxUaGlzLlRleHREZWNvZGVyKCJ1dGY4IikKICAgIH07CiAgICBjYWNoZWRFbmNvZGVyID0gbmV3IGdsb2JhbFRoaXMuVGV4dEVuY29kZXIoKTsKICAgIE1BWF9CTE9DS19TSVpFID0gNjU1MzU7CiAgICBieXRlVG9IZXhMb29rdXBUYWJsZSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDI1NiB9LCAoXzQsIGluZGV4MikgPT4gaW5kZXgyLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAiMCIpKTsKICAgIGhleFRvRGVjaW1hbExvb2t1cFRhYmxlID0gewogICAgICAwOiAwLAogICAgICAxOiAxLAogICAgICAyOiAyLAogICAgICAzOiAzLAogICAgICA0OiA0LAogICAgICA1OiA1LAogICAgICA2OiA2LAogICAgICA3OiA3LAogICAgICA4OiA4LAogICAgICA5OiA5LAogICAgICBhOiAxMCwKICAgICAgYjogMTEsCiAgICAgIGM6IDEyLAogICAgICBkOiAxMywKICAgICAgZTogMTQsCiAgICAgIGY6IDE1LAogICAgICBBOiAxMCwKICAgICAgQjogMTEsCiAgICAgIEM6IDEyLAogICAgICBEOiAxMywKICAgICAgRTogMTQsCiAgICAgIEY6IDE1CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRidWZmZXJAMy4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0YnVmZmVyL2Rpc3RfdHMvc21hcnRidWZmZXIucGx1Z2lucy5qcwp2YXIgaW5pdF9zbWFydGJ1ZmZlcl9wbHVnaW5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRidWZmZXJAMy4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0YnVmZmVyL2Rpc3RfdHMvc21hcnRidWZmZXIucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X3VpbnQ4YXJyYXlfZXh0cmFzKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGJ1ZmZlckAzLjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRidWZmZXIvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzOCA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHM4LCB7CiAgYmFzZTY0VG9VaW50OEFycmF5OiAoKSA9PiBiYXNlNjRUb1VpbnQ4QXJyYXkyLAogIGVuc3VyZVB1cmVVaW50OEFycmF5OiAoKSA9PiBlbnN1cmVQdXJlVWludDhBcnJheSwKICBpc0J1ZmZlckxpa2U6ICgpID0+IGlzQnVmZmVyTGlrZSwKICBpc1VpbnQ4QXJyYXk6ICgpID0+IGlzVWludDhBcnJheTIsCiAgdUludDhBcnJheUV4dHJhczogKCkgPT4gdUludDhBcnJheUV4dHJhcywKICB1SW50OEFycmF5VG9CYXNlNjQ6ICgpID0+IHVJbnQ4QXJyYXlUb0Jhc2U2NAp9KTsKZnVuY3Rpb24gdUludDhBcnJheVRvQmFzZTY0KHVJbnQ4QXJyYXkpIHsKICByZXR1cm4gdWludDhhcnJheV9leHRyYXNfZXhwb3J0cy51aW50OEFycmF5VG9CYXNlNjQodUludDhBcnJheSk7Cn0KZnVuY3Rpb24gYmFzZTY0VG9VaW50OEFycmF5MihiYXNlNjQyKSB7CiAgcmV0dXJuIHVpbnQ4YXJyYXlfZXh0cmFzX2V4cG9ydHMuYmFzZTY0VG9VaW50OEFycmF5KGJhc2U2NDIpOwp9CmZ1bmN0aW9uIGlzQnVmZmVyTGlrZShvYmopIHsKICBpZiAob2JqICYmIHR5cGVvZiBvYmouYnl0ZUxlbmd0aCA9PT0gIm51bWJlciIpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gInVuZGVmaW5lZCIgJiYgQnVmZmVyLmlzQnVmZmVyKSB7CiAgICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaik7CiAgfQogIHJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBlbnN1cmVQdXJlVWludDhBcnJheShidWZmZXJBcmcpIHsKICBjb25zdCB1aW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyQXJnLmxlbmd0aCk7CiAgdWludDhBcnJheS5zZXQoYnVmZmVyQXJnKTsKICByZXR1cm4gdWludDhBcnJheTsKfQp2YXIgdUludDhBcnJheUV4dHJhcywgaXNVaW50OEFycmF5MjsKdmFyIGluaXRfZGlzdF90czggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGJ1ZmZlckAzLjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRidWZmZXIvZGlzdF90cy9pbmRleC5qcyIoKSB7CiAgICBpbml0X3NtYXJ0YnVmZmVyX3BsdWdpbnMoKTsKICAgIHVJbnQ4QXJyYXlFeHRyYXMgPSB1aW50OGFycmF5X2V4dHJhc19leHBvcnRzOwogICAgaXNVaW50OEFycmF5MiA9IChvYmopID0+IHsKICAgICAgcmV0dXJuIHVpbnQ4YXJyYXlfZXh0cmFzX2V4cG9ydHMuaXNVaW50OEFycmF5KG9iaik7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRndWFyZEAzLjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRndWFyZC9kaXN0X3RzL3NtYXJ0Z3VhcmQucGx1Z2lucy5qcwp2YXIgaW5pdF9zbWFydGd1YXJkX3BsdWdpbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGd1YXJkQDMuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGd1YXJkL2Rpc3RfdHMvc21hcnRndWFyZC5wbHVnaW5zLmpzIigpIHsKICAgIGluaXRfZGlzdF90cygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRndWFyZEAzLjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRndWFyZC9kaXN0X3RzL2NsYXNzZXMuZ3VhcmQuanMKdmFyIEd1YXJkOwp2YXIgaW5pdF9jbGFzc2VzX2d1YXJkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRndWFyZEAzLjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRndWFyZC9kaXN0X3RzL2NsYXNzZXMuZ3VhcmQuanMiKCkgewogICAgaW5pdF9zbWFydGd1YXJkX3BsdWdpbnMoKTsKICAgIEd1YXJkID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcihndWFyZEZ1bmN0aW9uQXJnLCBvcHRpb25zQXJnKSB7CiAgICAgICAgdGhpcy5ndWFyZEZ1bmN0aW9uID0gZ3VhcmRGdW5jdGlvbkFyZzsKICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zQXJnOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBleGVjdXRlcyB0aGUgZ3VhcmQgYWdhaW5zdCBhIGRhdGEgYXJndW1lbnQ7CiAgICAgICAqIEBwYXJhbSBkYXRhQXJnCiAgICAgICAqLwogICAgICBhc3luYyBleGVjKGRhdGFBcmcpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmd1YXJkRnVuY3Rpb24oZGF0YUFyZyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBhc3luYyBnZXRGYWlsZWRIaW50KGRhdGFBcmcpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWMoZGF0YUFyZyk7CiAgICAgICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmFpbGVkSGludDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRndWFyZEAzLjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRndWFyZC9kaXN0X3RzL2NsYXNzZXMuZ3VhcmRlcnJvci5qcwp2YXIgR3VhcmRFcnJvcjsKdmFyIGluaXRfY2xhc3Nlc19ndWFyZGVycm9yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRndWFyZEAzLjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRndWFyZC9kaXN0X3RzL2NsYXNzZXMuZ3VhcmRlcnJvci5qcyIoKSB7CiAgICBpbml0X3NtYXJ0Z3VhcmRfcGx1Z2lucygpOwogICAgR3VhcmRFcnJvciA9IGNsYXNzIGV4dGVuZHMgRXJyb3IgewogICAgICBjb25zdHJ1Y3RvcihtZXNzYWdlMikgewogICAgICAgIHN1cGVyKG1lc3NhZ2UyKTsKICAgICAgICB0aGlzLm5hbWUgPSAiR3VhcmRFcnJvciI7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGd1YXJkQDMuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGd1YXJkL2Rpc3RfdHMvY2xhc3Nlcy5ndWFyZHNldC5qcwp2YXIgR3VhcmRTZXQ7CnZhciBpbml0X2NsYXNzZXNfZ3VhcmRzZXQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGd1YXJkQDMuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGd1YXJkL2Rpc3RfdHMvY2xhc3Nlcy5ndWFyZHNldC5qcyIoKSB7CiAgICBpbml0X3NtYXJ0Z3VhcmRfcGx1Z2lucygpOwogICAgaW5pdF9jbGFzc2VzX2d1YXJkKCk7CiAgICBHdWFyZFNldCA9IGNsYXNzIGV4dGVuZHMgR3VhcmQgewogICAgICBjb25zdHJ1Y3RvcihndWFyZEFycmF5ID0gW10pIHsKICAgICAgICBzdXBlcihhc3luYyAoZGF0YUFyZykgPT4gewogICAgICAgICAgcmV0dXJuIHRoaXMuYWxsR3VhcmRzUGFzcyhkYXRhQXJnKTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLmd1YXJkcyA9IGd1YXJkQXJyYXk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGV4ZWN1dGVzIGFsbCBndWFyZHMgaW4gYWxsIGd1YXJkU2V0cyBhZ2FpbnN0IGEgZGF0YSBhcmd1bWVudAogICAgICAgKiBAcGFyYW0gZGF0YUFyZwogICAgICAgKi8KICAgICAgYXN5bmMgZXhlY0FsbFdpdGhEYXRhKGRhdGFBcmcsIG9wdGlvbnNBcmcgPSB7CiAgICAgICAgbW9kZTogInBhcmFsbGVsIiwKICAgICAgICBzdG9wT25GYWlsOiBmYWxzZQogICAgICB9KSB7CiAgICAgICAgY29uc3QgcmVzdWx0UHJvbWlzZXMgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGd1YXJkIG9mIHRoaXMuZ3VhcmRzKSB7CiAgICAgICAgICBjb25zdCBndWFyZFJlc3VsdFByb21pc2UgPSBndWFyZC5leGVjKGRhdGFBcmcpOwogICAgICAgICAgaWYgKG9wdGlvbnNBcmcubW9kZSA9PT0gInNlcmlhbCIpIHsKICAgICAgICAgICAgYXdhaXQgZ3VhcmRSZXN1bHRQcm9taXNlOwogICAgICAgICAgfQogICAgICAgICAgcmVzdWx0UHJvbWlzZXMucHVzaChndWFyZFJlc3VsdFByb21pc2UpOwogICAgICAgICAgaWYgKG9wdGlvbnNBcmcuc3RvcE9uRmFpbCkgewogICAgICAgICAgICBpZiAoIWF3YWl0IGd1YXJkUmVzdWx0UHJvbWlzZSkgewogICAgICAgICAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChyZXN1bHRQcm9taXNlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHJlc3VsdFByb21pc2VzKTsKICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgICAgfQogICAgICAvKioKICAgICAgICogY2hlY2tzIGlmIGFsbCBndWFyZHMgcGFzcwogICAgICAgKiBAcGFyYW0gZGF0YUFyZwogICAgICAgKi8KICAgICAgYXN5bmMgYWxsR3VhcmRzUGFzcyhkYXRhQXJnLCBvcHRpb25zQXJnID0gewogICAgICAgIG1vZGU6ICJwYXJhbGxlbCIsCiAgICAgICAgc3RvcE9uRmFpbDogZmFsc2UKICAgICAgfSkgewogICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmV4ZWNBbGxXaXRoRGF0YShkYXRhQXJnLCBvcHRpb25zQXJnKTsKICAgICAgICByZXR1cm4gcmVzdWx0cy5ldmVyeSgocmVzdWx0KSA9PiByZXN1bHQpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBjaGVja3MgaWYgYW55IGd1YXJkIHBhc3NlcwogICAgICAgKiBAcGFyYW0gZGF0YUFyZwogICAgICAgKi8KICAgICAgYXN5bmMgYW55R3VhcmRzUGFzcyhkYXRhQXJnKSB7CiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuZXhlY0FsbFdpdGhEYXRhKGRhdGFBcmcsIHsKICAgICAgICAgIG1vZGU6ICJwYXJhbGxlbCIsCiAgICAgICAgICBzdG9wT25GYWlsOiBmYWxzZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiByZXN1bHRzLnNvbWUoKHJlc3VsdCkgPT4gcmVzdWx0KTsKICAgICAgfQogICAgICAvKioKICAgICAgICogcmV0dXJucyB0aGUgZmlyc3QgcmVhc29uIGZvciB3aHkgc29tZXRoaW5nIGZhaWxzCiAgICAgICAqIEBwYXJhbSBkYXRhQXJnCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqLwogICAgICBnZXRGYWlsZWRIaW50KGRhdGFBcmcpIHsKICAgICAgICBmb3IgKGNvbnN0IGd1YXJkIG9mIHRoaXMuZ3VhcmRzKSB7CiAgICAgICAgICBjb25zdCBmYWlsZWRIaW50ID0gZ3VhcmQuZ2V0RmFpbGVkSGludChkYXRhQXJnKTsKICAgICAgICAgIGlmIChmYWlsZWRIaW50KSB7CiAgICAgICAgICAgIHJldHVybiBmYWlsZWRIaW50OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0Z3VhcmRAMy4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0Z3VhcmQvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzOSA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHM5LCB7CiAgR3VhcmQ6ICgpID0+IEd1YXJkLAogIEd1YXJkRXJyb3I6ICgpID0+IEd1YXJkRXJyb3IsCiAgR3VhcmRTZXQ6ICgpID0+IEd1YXJkU2V0LAogIHBhc3NHdWFyZHNPclJlamVjdDogKCkgPT4gcGFzc0d1YXJkc09yUmVqZWN0Cn0pOwp2YXIgcGFzc0d1YXJkc09yUmVqZWN0Owp2YXIgaW5pdF9kaXN0X3RzOSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0Z3VhcmRAMy4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0Z3VhcmQvZGlzdF90cy9pbmRleC5qcyIoKSB7CiAgICBpbml0X3NtYXJ0Z3VhcmRfcGx1Z2lucygpOwogICAgaW5pdF9jbGFzc2VzX2d1YXJkKCk7CiAgICBpbml0X2NsYXNzZXNfZ3VhcmRlcnJvcigpOwogICAgaW5pdF9jbGFzc2VzX2d1YXJkKCk7CiAgICBpbml0X2NsYXNzZXNfZ3VhcmRzZXQoKTsKICAgIGluaXRfY2xhc3Nlc19ndWFyZHNldCgpOwogICAgaW5pdF9jbGFzc2VzX2d1YXJkZXJyb3IoKTsKICAgIHBhc3NHdWFyZHNPclJlamVjdCA9IGFzeW5jIChkYXRhQXJnLCBndWFyZHMpID0+IHsKICAgICAgY29uc3QgZ3VhcmRTZXQgPSBuZXcgR3VhcmRTZXQoZ3VhcmRzKTsKICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ3VhcmRTZXQuYWxsR3VhcmRzUGFzcyhkYXRhQXJnKTsKICAgICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICBjb25zdCBmYWlsZWRIaW50ID0gYXdhaXQgZ3VhcmRTZXQuZ2V0RmFpbGVkSGludChkYXRhQXJnKTsKICAgICAgICB0aHJvdyBuZXcgR3VhcmRFcnJvcihgR3VhcmRzIGZhaWxlZDoKJHtmYWlsZWRIaW50fQogICAgYCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0ZW52QDUuMC4xMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRlbnYvZGlzdF90cy9zbWFydGVudi5wbHVnaW5zLmpzCnZhciBpbml0X3NtYXJ0ZW52X3BsdWdpbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGVudkA1LjAuMTMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0ZW52L2Rpc3RfdHMvc21hcnRlbnYucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0ZW52QDUuMC4xMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRlbnYvZGlzdF90cy9pbnRlcmZhY2VzL2luZGV4LmpzCnZhciBpbml0X2ludGVyZmFjZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGVudkA1LjAuMTMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0ZW52L2Rpc3RfdHMvaW50ZXJmYWNlcy9pbmRleC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGVudkA1LjAuMTMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0ZW52L2Rpc3RfdHMvc21hcnRlbnYuY2xhc3Nlcy5zbWFydGVudi5qcwp2YXIgU21hcnRlbnY7CnZhciBpbml0X3NtYXJ0ZW52X2NsYXNzZXNfc21hcnRlbnYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGVudkA1LjAuMTMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0ZW52L2Rpc3RfdHMvc21hcnRlbnYuY2xhc3Nlcy5zbWFydGVudi5qcyIoKSB7CiAgICBpbml0X3NtYXJ0ZW52X3BsdWdpbnMoKTsKICAgIGluaXRfaW50ZXJmYWNlcygpOwogICAgU21hcnRlbnYgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMubG9hZGVkU2NyaXB0cyA9IFtdOwogICAgICB9CiAgICAgIGFzeW5jIGdldEVudkF3YXJlTW9kdWxlKG9wdGlvbnNBcmcpIHsKICAgICAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgICAgIGNvbnN0IG1vZHVsZVJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0U2FmZU5vZGVNb2R1bGUob3B0aW9uc0FyZy5ub2RlTW9kdWxlTmFtZSk7CiAgICAgICAgICByZXR1cm4gbW9kdWxlUmVzdWx0OwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0Jyb3dzZXIpIHsKICAgICAgICAgIGNvbnN0IG1vZHVsZVJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0U2FmZVdlYk1vZHVsZShvcHRpb25zQXJnLndlYlVybEFyZywgb3B0aW9uc0FyZy5nZXRGdW5jdGlvbik7CiAgICAgICAgICByZXR1cm4gbW9kdWxlUmVzdWx0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCJwbGF0Zm9ybSBmb3IgbG9hZGluZyBub3Qgc3VwcG9ydGVkIGJ5IHNtYXJ0ZW52Iik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIGdldFNhZmVOb2RlTW9kdWxlKG1vZHVsZU5hbWVBcmcsIHJ1bkFmdGVyRnVuYykgewogICAgICAgIGlmICghdGhpcy5pc05vZGUpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFlvdSB0cmllZCB0byBsb2FkIGEgbm9kZSBtb2R1bGUgaW4gYSB3cm9uZyBjb250ZXh0OiAke21vZHVsZU5hbWVBcmd9LiBUaGlzIGRvZXMgbm90IHRocm93LmApOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGF3YWl0IG5ldyBGdW5jdGlvbihgcmV0dXJuIGltcG9ydCgnJHttb2R1bGVOYW1lQXJnfScpYCkoKTsKICAgICAgICBpZiAocnVuQWZ0ZXJGdW5jKSB7CiAgICAgICAgICBhd2FpdCBydW5BZnRlckZ1bmMocmV0dXJuVmFsdWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CiAgICAgIH0KICAgICAgYXN5bmMgZ2V0U2FmZVdlYk1vZHVsZSh1cmxBcmcsIGdldEZ1bmN0aW9uQXJnKSB7CiAgICAgICAgaWYgKCF0aGlzLmlzQnJvd3NlcikgewogICAgICAgICAgY29uc29sZS5lcnJvcigiWW91IHRyaWVkIHRvIGxvYWQgYSB3ZWIgbW9kdWxlIGluIGEgd3JvbmcgY29udGV4dCIpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5sb2FkZWRTY3JpcHRzLmluY2x1ZGVzKHVybEFyZykpIHsKICAgICAgICAgIHJldHVybiBnZXRGdW5jdGlvbkFyZygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmxvYWRlZFNjcmlwdHMucHVzaCh1cmxBcmcpOwogICAgICAgIH0KICAgICAgICBjb25zdCBkb25lID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICAgICAgaWYgKGdsb2JhbFRoaXMuaW1wb3J0U2NyaXB0cykgewogICAgICAgICAgZ2xvYmFsVGhpcy5pbXBvcnRTY3JpcHRzKHVybEFyZyk7CiAgICAgICAgICBkb25lLnJlc29sdmUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4gewogICAgICAgICAgICBkb25lLnJlc29sdmUoKTsKICAgICAgICAgIH07CiAgICAgICAgICBzY3JpcHQuc3JjID0gdXJsQXJnOwogICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgICAgIH0KICAgICAgICBhd2FpdCBkb25lLnByb21pc2U7CiAgICAgICAgcmV0dXJuIGdldEZ1bmN0aW9uQXJnKCk7CiAgICAgIH0KICAgICAgZ2V0IHJ1bnRpbWVFbnYoKSB7CiAgICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgcmV0dXJuICJub2RlIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuICJicm93c2VyIjsKICAgICAgICB9CiAgICAgIH0KICAgICAgZ2V0IGlzQnJvd3NlcigpIHsKICAgICAgICByZXR1cm4gIXRoaXMuaXNOb2RlOwogICAgICB9CiAgICAgIGdldCB1c2VyQWdlbnQoKSB7CiAgICAgICAgaWYgKHRoaXMuaXNCcm93c2VyKSB7CiAgICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuICJ1bmRlZmluZWQiOwogICAgICAgIH0KICAgICAgfQogICAgICBnZXQgaXNOb2RlKCkgewogICAgICAgIHJldHVybiB0aGlzLnJ1bnRpbWVFbnYgPT09ICJub2RlIjsKICAgICAgfQogICAgICBnZXQgbm9kZVZlcnNpb24oKSB7CiAgICAgICAgcmV0dXJuIHByb2Nlc3MudmVyc2lvbjsKICAgICAgfQogICAgICBnZXQgaXNDSSgpIHsKICAgICAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5DSSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICBhc3luYyBpc01hY0FzeW5jKCkgewogICAgICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICAgICAgY29uc3Qgb3MgPSBhd2FpdCB0aGlzLmdldFNhZmVOb2RlTW9kdWxlKCJvcyIpOwogICAgICAgICAgcmV0dXJuIG9zLnBsYXRmb3JtKCkgPT09ICJkYXJ3aW4iOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIGlzV2luZG93c0FzeW5jKCkgewogICAgICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICAgICAgY29uc3Qgb3MgPSBhd2FpdCB0aGlzLmdldFNhZmVOb2RlTW9kdWxlKCJvcyIpOwogICAgICAgICAgcmV0dXJuIG9zLnBsYXRmb3JtKCkgPT09ICJ3aW4zMiI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYXN5bmMgaXNMaW51eEFzeW5jKCkgewogICAgICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICAgICAgY29uc3Qgb3MgPSBhd2FpdCB0aGlzLmdldFNhZmVOb2RlTW9kdWxlKCJvcyIpOwogICAgICAgICAgcmV0dXJuIG9zLnBsYXRmb3JtKCkgPT09ICJsaW51eCI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHByaW50cyB0aGUgZW52aXJvbm1lbnQgdG8gY29uc29sZQogICAgICAgKi8KICAgICAgYXN5bmMgcHJpbnRFbnYoKSB7CiAgICAgICAgaWYgKHRoaXMuaXNOb2RlKSB7CiAgICAgICAgICBjb25zb2xlLmxvZygicnVubmluZyBvbiBOT0RFIik7CiAgICAgICAgICBjb25zb2xlLmxvZygibm9kZSB2ZXJzaW9uIGlzICIgKyB0aGlzLm5vZGVWZXJzaW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc29sZS5sb2coInJ1bm5pbmcgb24gQlJPV1NFUiIpOwogICAgICAgICAgY29uc29sZS5sb2coImJyb3dzZXIgaXMgIiArIHRoaXMudXNlckFnZW50KTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGVudkA1LjAuMTMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0ZW52L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czEwID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czEwLCB7CiAgU21hcnRlbnY6ICgpID0+IFNtYXJ0ZW52Cn0pOwp2YXIgaW5pdF9kaXN0X3RzMTAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGVudkA1LjAuMTMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0ZW52L2Rpc3RfdHMvaW5kZXguanMiKCkgewogICAgaW5pdF9zbWFydGVudl9jbGFzc2VzX3NtYXJ0ZW52KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0cmluZ0A0LjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdHJpbmcvZGlzdF90cy9zbWFydHN0cmluZy5wbHVnaW5zLmpzCnZhciBpc291bmlxdWU7CnZhciBpbml0X3NtYXJ0c3RyaW5nX3BsdWdpbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0cmluZ0A0LjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdHJpbmcvZGlzdF90cy9zbWFydHN0cmluZy5wbHVnaW5zLmpzIigpIHsKICAgIGlzb3VuaXF1ZSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0X3RzKCksIDEpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuY3JlYXRlLmpzCnZhciBzbWFydHN0cmluZ19jcmVhdGVfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChzbWFydHN0cmluZ19jcmVhdGVfZXhwb3J0cywgewogIGNyZWF0ZUNyeXB0b1JhbmRvbVN0cmluZzogKCkgPT4gY3JlYXRlQ3J5cHRvUmFuZG9tU3RyaW5nLAogIGNyZWF0ZVJhbmRvbVN0cmluZzogKCkgPT4gY3JlYXRlUmFuZG9tU3RyaW5nCn0pOwp2YXIgZ2V0UmFuZG9tSW50LCBjdXN0b21SYW5kb21hdGljLCBjcmVhdGVSYW5kb21TdHJpbmcsIGNyZWF0ZUNyeXB0b1JhbmRvbVN0cmluZzsKdmFyIGluaXRfc21hcnRzdHJpbmdfY3JlYXRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuY3JlYXRlLmpzIigpIHsKICAgIGluaXRfc21hcnRzdHJpbmdfcGx1Z2lucygpOwogICAgZ2V0UmFuZG9tSW50ID0gKG1pbjMsIG1heDMpID0+IHsKICAgICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAidW5kZWZpbmVkIiAmJiBnbG9iYWxUaGlzLmNyeXB0byAmJiBnbG9iYWxUaGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHsKICAgICAgICBjb25zdCByYW5nZTIgPSBtYXgzIC0gbWluMzsKICAgICAgICBjb25zdCBhcnJheSA9IG5ldyBVaW50MzJBcnJheSgxKTsKICAgICAgICBnbG9iYWxUaGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpOwogICAgICAgIHJldHVybiBtaW4zICsgYXJyYXlbMF0gJSByYW5nZTI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXgzIC0gbWluMykpICsgbWluMzsKICAgICAgfQogICAgfTsKICAgIGN1c3RvbVJhbmRvbWF0aWMgPSAocGF0dGVybiwgbGVuZ3RoLCBvcHRpb25zKSA9PiB7CiAgICAgIGNvbnN0IGNoYXJTZXRzID0gewogICAgICAgICJBIjogIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIiwKICAgICAgICAiYSI6ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsCiAgICAgICAgIjAiOiAiMDEyMzQ1Njc4OSIsCiAgICAgICAgIiEiOiAiIUAjJCVeJiooKV8rLT1bXXt9fDs6LC48Pj8iLAogICAgICAgICIqIjogIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IUAjJCVeJiooKV8rLT1bXXt9fDs6LC48Pj8iCiAgICAgIH07CiAgICAgIGxldCBhY3R1YWxQYXR0ZXJuID0gcGF0dGVybjsKICAgICAgaWYgKGxlbmd0aCAmJiBsZW5ndGggPiBwYXR0ZXJuLmxlbmd0aCkgewogICAgICAgIGFjdHVhbFBhdHRlcm4gPSBwYXR0ZXJuLnJlcGVhdChNYXRoLmNlaWwobGVuZ3RoIC8gcGF0dGVybi5sZW5ndGgpKS5zbGljZSgwLCBsZW5ndGgpOwogICAgICB9IGVsc2UgaWYgKGxlbmd0aCkgewogICAgICAgIGFjdHVhbFBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKDAsIGxlbmd0aCk7CiAgICAgIH0KICAgICAgbGV0IHJlc3VsdCA9ICIiOwogICAgICBmb3IgKGNvbnN0IGNoYXIgb2YgYWN0dWFsUGF0dGVybikgewogICAgICAgIGlmIChjaGFyU2V0c1tjaGFyXSkgewogICAgICAgICAgY29uc3QgY2hhclNldCA9IGNoYXJTZXRzW2NoYXJdOwogICAgICAgICAgY29uc3QgcmFuZG9tSW5kZXggPSBnZXRSYW5kb21JbnQoMCwgY2hhclNldC5sZW5ndGgpOwogICAgICAgICAgcmVzdWx0ICs9IGNoYXJTZXRbcmFuZG9tSW5kZXhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQgKz0gY2hhcjsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CiAgICBjcmVhdGVSYW5kb21TdHJpbmcgPSAocGF0dGVybkFyZywgbGVuZ3RoQXJnLCBvcHRpb25zQXJnKSA9PiB7CiAgICAgIHJldHVybiBjdXN0b21SYW5kb21hdGljKHBhdHRlcm5BcmcsIGxlbmd0aEFyZywgb3B0aW9uc0FyZyk7CiAgICB9OwogICAgY3JlYXRlQ3J5cHRvUmFuZG9tU3RyaW5nID0gKCkgPT4gewogICAgICByZXR1cm4gaXNvdW5pcXVlLnVuaSgpOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL3NtYXJ0c3RyaW5nLmRvY2tlci5qcwp2YXIgc21hcnRzdHJpbmdfZG9ja2VyX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoc21hcnRzdHJpbmdfZG9ja2VyX2V4cG9ydHMsIHsKICBtYWtlRW52T2JqZWN0OiAoKSA9PiBtYWtlRW52T2JqZWN0Cn0pOwp2YXIgbWFrZUVudk9iamVjdDsKdmFyIGluaXRfc21hcnRzdHJpbmdfZG9ja2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuZG9ja2VyLmpzIigpIHsKICAgIGluaXRfc21hcnRzdHJpbmdfcGx1Z2lucygpOwogICAgbWFrZUVudk9iamVjdCA9IGZ1bmN0aW9uKGVudkFycmF5QXJnKSB7CiAgICAgIGxldCByZXR1cm5PYmplY3QgPSB7fTsKICAgICAgbGV0IHJlZ2V4U3RyaW5nID0gLyguKik9KC4qKS87CiAgICAgIGlmICh0eXBlb2YgZW52QXJyYXlBcmcgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgZm9yIChsZXQgZW52S2V5IGluIGVudkFycmF5QXJnKSB7CiAgICAgICAgICBsZXQgcmVnZXhNYXRjaGVzID0gcmVnZXhTdHJpbmcuZXhlYyhlbnZBcnJheUFyZ1tlbnZLZXldKTsKICAgICAgICAgIHJldHVybk9iamVjdFtyZWdleE1hdGNoZXNbMV1dID0gcmVnZXhNYXRjaGVzWzJdOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmV0dXJuT2JqZWN0OwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL3NtYXJ0c3RyaW5nLmluZGVudC5qcwp2YXIgc21hcnRzdHJpbmdfaW5kZW50X2V4cG9ydHMgPSB7fTsKX19leHBvcnQoc21hcnRzdHJpbmdfaW5kZW50X2V4cG9ydHMsIHsKICBpbmRlbnQ6ICgpID0+IGluZGVudCwKICBpbmRlbnRXaXRoUHJlZml4OiAoKSA9PiBpbmRlbnRXaXRoUHJlZml4LAogIG5vcm1hbGl6ZTogKCkgPT4gbm9ybWFsaXplCn0pOwp2YXIgc3BsaXRTdHJpbmdBdExpbmVCcmVhaywgam9pblN0cmluZ1dpdGhMaW5lQnJlYWtzLCBjbGVhblN0cmluZ0FycmF5LCBpbmRlbnQsIGluZGVudFdpdGhQcmVmaXgsIG5vcm1hbGl6ZTsKdmFyIGluaXRfc21hcnRzdHJpbmdfaW5kZW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuaW5kZW50LmpzIigpIHsKICAgIGluaXRfc21hcnRzdHJpbmdfcGx1Z2lucygpOwogICAgc3BsaXRTdHJpbmdBdExpbmVCcmVhayA9IChzdHJpbmdBcmcpID0+IHsKICAgICAgbGV0IHJlc3VsdEFycmF5ID0gc3RyaW5nQXJnLnNwbGl0KCJcbiIpOwogICAgICByZXR1cm4gY2xlYW5TdHJpbmdBcnJheShyZXN1bHRBcnJheSk7CiAgICB9OwogICAgam9pblN0cmluZ1dpdGhMaW5lQnJlYWtzID0gKHN0cmluZ0FycmF5QXJnKSA9PiB7CiAgICAgIGxldCByZXN1bHRTdHJpbmcgPSAiIjsKICAgICAgZm9yIChsZXQgbGluZSBvZiBzdHJpbmdBcnJheUFyZykgewogICAgICAgIHJlc3VsdFN0cmluZyA9IHJlc3VsdFN0cmluZyArIGxpbmUgKyAiXG4iOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHRTdHJpbmc7CiAgICB9OwogICAgY2xlYW5TdHJpbmdBcnJheSA9IChzdHJpbmdBcnJheUFyZykgPT4gewogICAgICBsZXQgdGVzdFJlZ2V4ID0gL15bXHNdKiQvOwogICAgICBpZiAodGVzdFJlZ2V4LnRlc3Qoc3RyaW5nQXJyYXlBcmdbMF0pKSB7CiAgICAgICAgc3RyaW5nQXJyYXlBcmcuc2hpZnQoKTsKICAgICAgfQogICAgICBpZiAodGVzdFJlZ2V4LnRlc3Qoc3RyaW5nQXJyYXlBcmdbc3RyaW5nQXJyYXlBcmcubGVuZ3RoIC0gMV0pKSB7CiAgICAgICAgc3RyaW5nQXJyYXlBcmcucG9wKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0cmluZ0FycmF5QXJnOwogICAgfTsKICAgIGluZGVudCA9IChzdHJpbmdBcmcsIHNwYWNlQW1vdW50KSA9PiB7CiAgICAgIGxldCBsb2NhbFN0cmluZ0FycmF5ID0gc3BsaXRTdHJpbmdBdExpbmVCcmVhayhzdHJpbmdBcmcpOwogICAgICBmb3IgKGxldCBzdHJpbmdBcmcyIG9mIGxvY2FsU3RyaW5nQXJyYXkpIHsKICAgICAgICBzdHJpbmdBcmcyID0gIiAiLnJlcGVhdChzcGFjZUFtb3VudCkgKyBzdHJpbmdBcmcyOwogICAgICB9CiAgICAgIGxldCByZXN1bHRTdHJpbmcgPSBqb2luU3RyaW5nV2l0aExpbmVCcmVha3MobG9jYWxTdHJpbmdBcnJheSk7CiAgICAgIHJldHVybiByZXN1bHRTdHJpbmc7CiAgICB9OwogICAgaW5kZW50V2l0aFByZWZpeCA9IChzdHJpbmdBcmcsIHByZWZpeEFyZykgPT4gewogICAgICBsZXQgcmVzdWx0U3RyaW5nOwogICAgICBsZXQgc3RyaW5nQXJyYXkgPSBzcGxpdFN0cmluZ0F0TGluZUJyZWFrKHN0cmluZ0FyZyk7CiAgICAgIGxldCByZXN1bHRBcnJheSA9IFtdOwogICAgICBmb3IgKGxldCBzdHJpbmdJdGVtIG9mIHN0cmluZ0FycmF5KSB7CiAgICAgICAgcmVzdWx0QXJyYXkucHVzaChwcmVmaXhBcmcgKyBzdHJpbmdJdGVtKTsKICAgICAgfQogICAgICByZXN1bHRTdHJpbmcgPSBqb2luU3RyaW5nV2l0aExpbmVCcmVha3MocmVzdWx0QXJyYXkpOwogICAgICByZXR1cm4gcmVzdWx0U3RyaW5nOwogICAgfTsKICAgIG5vcm1hbGl6ZSA9IChzdHJpbmdBcmcpID0+IHsKICAgICAgbGV0IHJlc3VsdFN0cmluZzsKICAgICAgbGV0IHNwbGl0U3RyaW5nQXJyYXkgPSBzcGxpdFN0cmluZ0F0TGluZUJyZWFrKHN0cmluZ0FyZyk7CiAgICAgIGxldCBtaW5Db21tb25MZWZ0T2Zmc2V0OwogICAgICBjb25zdCBkZUluZGVudFJlZ2V4ID0gL14oXHMqKS87CiAgICAgIGNvbnN0IGVtcHR5TGluZVJlZ2V4ID0gL14oXHMqKSQvOwogICAgICBmb3IgKGxldCBzdHJpbmdJdGVtIG9mIHNwbGl0U3RyaW5nQXJyYXkpIHsKICAgICAgICBsZXQgb2Zmc2V0U3RyaW5nID0gZGVJbmRlbnRSZWdleC5leGVjKHN0cmluZ0l0ZW0pWzFdOwogICAgICAgIGlmICgodHlwZW9mIG1pbkNvbW1vbkxlZnRPZmZzZXQgPT09ICJ1bmRlZmluZWQiIHx8IG9mZnNldFN0cmluZy5sZW5ndGggPCBtaW5Db21tb25MZWZ0T2Zmc2V0KSAmJiAhZW1wdHlMaW5lUmVnZXgudGVzdChzdHJpbmdJdGVtKSkgewogICAgICAgICAgbWluQ29tbW9uTGVmdE9mZnNldCA9IG9mZnNldFN0cmluZy5sZW5ndGg7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxldCByZXN1bHRTcGxpdFN0cmluZ0FycmF5ID0gW107CiAgICAgIGZvciAobGV0IHN0cmluZ0l0ZW0gb2Ygc3BsaXRTdHJpbmdBcnJheSkgewogICAgICAgIHJlc3VsdFNwbGl0U3RyaW5nQXJyYXkucHVzaChzdHJpbmdJdGVtLnN1YnN0cihtaW5Db21tb25MZWZ0T2Zmc2V0KSk7CiAgICAgIH0KICAgICAgcmVzdWx0U3RyaW5nID0gam9pblN0cmluZ1dpdGhMaW5lQnJlYWtzKHJlc3VsdFNwbGl0U3RyaW5nQXJyYXkpOwogICAgICByZXR1cm4gcmVzdWx0U3RyaW5nOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL3NtYXJ0c3RyaW5nLm5vcm1hbGl6ZS5qcwp2YXIgc21hcnRzdHJpbmdfbm9ybWFsaXplX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoc21hcnRzdHJpbmdfbm9ybWFsaXplX2V4cG9ydHMsIHsKICByZXBsYWNlQWxsOiAoKSA9PiByZXBsYWNlQWxsLAogIHN0YW5kYXJkOiAoKSA9PiBzdGFuZGFyZAp9KTsKdmFyIHJlcGxhY2VBbGwsIHN0cmlwSW5kZW50LCBzdGFuZGFyZDsKdmFyIGluaXRfc21hcnRzdHJpbmdfbm9ybWFsaXplID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcubm9ybWFsaXplLmpzIigpIHsKICAgIHJlcGxhY2VBbGwgPSAoc3RyaW5nQXJnLCBzZWFyY2hQYXR0ZXJuLCByZXBsYWNlbWVudFN0cmluZykgPT4gewogICAgICByZXR1cm4gc3RyaW5nQXJnLnJlcGxhY2UobmV3IFJlZ0V4cChzZWFyY2hQYXR0ZXJuLCAiZyIpLCByZXBsYWNlbWVudFN0cmluZyk7CiAgICB9OwogICAgc3RyaXBJbmRlbnQgPSAoc3RyKSA9PiB7CiAgICAgIGNvbnN0IGxpbmVzID0gc3RyLnNwbGl0KCJcbiIpOwogICAgICBsZXQgbWluSW5kZW50ID0gSW5maW5pdHk7CiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykgewogICAgICAgIGlmIChsaW5lLnRyaW0oKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICBjb25zdCBtYXRjaDIgPSBsaW5lLm1hdGNoKC9eKFxzKikvKTsKICAgICAgICAgIGlmIChtYXRjaDIpIHsKICAgICAgICAgICAgbWluSW5kZW50ID0gTWF0aC5taW4obWluSW5kZW50LCBtYXRjaDJbMV0ubGVuZ3RoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG1pbkluZGVudCA9PT0gSW5maW5pdHkgfHwgbWluSW5kZW50ID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgfQogICAgICByZXR1cm4gbGluZXMubWFwKChsaW5lKSA9PiB7CiAgICAgICAgaWYgKGxpbmUubGVuZ3RoID49IG1pbkluZGVudCkgewogICAgICAgICAgcmV0dXJuIGxpbmUuc2xpY2UobWluSW5kZW50KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpbmU7CiAgICAgIH0pLmpvaW4oIlxuIik7CiAgICB9OwogICAgc3RhbmRhcmQgPSAoc3RyaW5nQXJnLCBvcHRpb25zKSA9PiB7CiAgICAgIGxldCByZXN1bHQgPSBzdHJpbmdBcmc7CiAgICAgIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnN0cmlwSW5kZW50KSB7CiAgICAgICAgcmVzdWx0ID0gc3RyaXBJbmRlbnQocmVzdWx0KTsKICAgICAgfQogICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5ub3JtYWxpemVOZXdsaW5lKSB7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1xyXG4vZywgIlxuIik7CiAgICAgIH0KICAgICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMucmVwbGFjZVRhYnMpIHsKICAgICAgICByZXN1bHQgPSByZXBsYWNlQWxsKHJlc3VsdCwgIgkvIiwgIiAiKTsKICAgICAgfQogICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5zdHJpcExlYWRpbmdUcmFpbGluZ0VtcHR5TGluZXMpIHsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxzKltcclxuXS9nbSwgIiIpLnJlcGxhY2UoL1xzKltcclxuXSQvZ20sICIiKTsKICAgICAgfQogICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5zdHJpcEFsbEVtcHR5TGluZXMpIHsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxzKltcclxuXS9nbSwgIiIpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuYmFzZTY0LmpzCnZhciB1bml2ZXJzYWxCYXNlNjQsIEJhc2U2NCwgYmFzZTY0Owp2YXIgaW5pdF9zbWFydHN0cmluZ19iYXNlNjQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0cmluZ0A0LjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdHJpbmcvZGlzdF90cy9zbWFydHN0cmluZy5iYXNlNjQuanMiKCkgewogICAgdW5pdmVyc2FsQmFzZTY0ID0gewogICAgICBlbmNvZGU6IChzdHIpID0+IHsKICAgICAgICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShzdHIsICJ1dGY4IikudG9TdHJpbmcoImJhc2U2NCIpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGJ0b2EgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICBjb25zdCB1dGY4Qnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKTsKICAgICAgICAgIGNvbnN0IGJpbmFyeVN0cmluZyA9IEFycmF5LmZyb20odXRmOEJ5dGVzLCAoYnl0ZSkgPT4gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKSkuam9pbigiIik7CiAgICAgICAgICByZXR1cm4gYnRvYShiaW5hcnlTdHJpbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBjaGFycyA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKICAgICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHN0cik7CiAgICAgICAgICBsZXQgcmVzdWx0ID0gIiI7CiAgICAgICAgICBsZXQgaTExID0gMDsKICAgICAgICAgIHdoaWxlIChpMTEgPCBieXRlcy5sZW5ndGgpIHsKICAgICAgICAgICAgY29uc3QgYTUgPSBieXRlc1tpMTErK107CiAgICAgICAgICAgIGNvbnN0IGI1ID0gaTExIDwgYnl0ZXMubGVuZ3RoID8gYnl0ZXNbaTExKytdIDogMDsKICAgICAgICAgICAgY29uc3QgYzExID0gaTExIDwgYnl0ZXMubGVuZ3RoID8gYnl0ZXNbaTExKytdIDogMDsKICAgICAgICAgICAgY29uc3QgYml0bWFwID0gYTUgPDwgMTYgfCBiNSA8PCA4IHwgYzExOwogICAgICAgICAgICByZXN1bHQgKz0gY2hhcnMuY2hhckF0KGJpdG1hcCA+PiAxOCAmIDYzKTsKICAgICAgICAgICAgcmVzdWx0ICs9IGNoYXJzLmNoYXJBdChiaXRtYXAgPj4gMTIgJiA2Myk7CiAgICAgICAgICAgIHJlc3VsdCArPSBpMTEgLSAyIDwgYnl0ZXMubGVuZ3RoID8gY2hhcnMuY2hhckF0KGJpdG1hcCA+PiA2ICYgNjMpIDogIj0iOwogICAgICAgICAgICByZXN1bHQgKz0gaTExIC0gMSA8IGJ5dGVzLmxlbmd0aCA/IGNoYXJzLmNoYXJBdChiaXRtYXAgJiA2MykgOiAiPSI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgfSwKICAgICAgZGVjb2RlOiAoc3RyKSA9PiB7CiAgICAgICAgY29uc3QgYmFzZTY0U3RyaW5nID0gc3RyLnJlcGxhY2UoLy0vZywgIisiKS5yZXBsYWNlKC9fL2csICIvIikucGFkRW5kKHN0ci5sZW5ndGggKyAoNCAtIHN0ci5sZW5ndGggJSA0KSAlIDQsICI9Iik7CiAgICAgICAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYmFzZTY0U3RyaW5nLCAiYmFzZTY0IikudG9TdHJpbmcoInV0ZjgiKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhdG9iICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgY29uc3QgYmluYXJ5U3RyaW5nID0gYXRvYihiYXNlNjRTdHJpbmcpOwogICAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnlTdHJpbmcubGVuZ3RoKTsKICAgICAgICAgIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IGJpbmFyeVN0cmluZy5sZW5ndGg7IGkxMSsrKSB7CiAgICAgICAgICAgIGJ5dGVzW2kxMV0gPSBiaW5hcnlTdHJpbmcuY2hhckNvZGVBdChpMTEpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShieXRlcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGNoYXJzID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwogICAgICAgICAgbGV0IGJ5dGVzID0gW107CiAgICAgICAgICBsZXQgaTExID0gMDsKICAgICAgICAgIHdoaWxlIChpMTEgPCBiYXNlNjRTdHJpbmcubGVuZ3RoKSB7CiAgICAgICAgICAgIGNvbnN0IGVuY29kZWQxID0gY2hhcnMuaW5kZXhPZihiYXNlNjRTdHJpbmcuY2hhckF0KGkxMSsrKSk7CiAgICAgICAgICAgIGNvbnN0IGVuY29kZWQyID0gY2hhcnMuaW5kZXhPZihiYXNlNjRTdHJpbmcuY2hhckF0KGkxMSsrKSk7CiAgICAgICAgICAgIGNvbnN0IGVuY29kZWQzID0gY2hhcnMuaW5kZXhPZihiYXNlNjRTdHJpbmcuY2hhckF0KGkxMSsrKSk7CiAgICAgICAgICAgIGNvbnN0IGVuY29kZWQ0ID0gY2hhcnMuaW5kZXhPZihiYXNlNjRTdHJpbmcuY2hhckF0KGkxMSsrKSk7CiAgICAgICAgICAgIGNvbnN0IGJpdG1hcCA9IGVuY29kZWQxIDw8IDE4IHwgZW5jb2RlZDIgPDwgMTIgfCBlbmNvZGVkMyA8PCA2IHwgZW5jb2RlZDQ7CiAgICAgICAgICAgIGJ5dGVzLnB1c2goYml0bWFwID4+IDE2ICYgMjU1KTsKICAgICAgICAgICAgaWYgKGVuY29kZWQzICE9PSA2NCkKICAgICAgICAgICAgICBieXRlcy5wdXNoKGJpdG1hcCA+PiA4ICYgMjU1KTsKICAgICAgICAgICAgaWYgKGVuY29kZWQ0ICE9PSA2NCkKICAgICAgICAgICAgICBieXRlcy5wdXNoKGJpdG1hcCAmIDI1NSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKG5ldyBVaW50OEFycmF5KGJ5dGVzKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgQmFzZTY0ID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcihpbnB1dFN0cmluZ0FyZywgdHlwZUFyZykgewogICAgICAgIHN3aXRjaCAodHlwZUFyZykgewogICAgICAgICAgY2FzZSAic3RyaW5nIjoKICAgICAgICAgICAgdGhpcy5yZWZTdHJpbmcgPSBpbnB1dFN0cmluZ0FyZzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJiYXNlNjQiOgogICAgICAgICAgICB0aGlzLnJlZlN0cmluZyA9IGJhc2U2NC5kZWNvZGUoaW5wdXRTdHJpbmdBcmcpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImJhc2U2NHVyaSI6CiAgICAgICAgICAgIHRoaXMucmVmU3RyaW5nID0gYmFzZTY0LmRlY29kZShpbnB1dFN0cmluZ0FyZyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiB0aGUgc2ltcGxlIHN0cmluZyAodW5lbmNvZGVkKQogICAgICAgKi8KICAgICAgZ2V0IHNpbXBsZVN0cmluZygpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZWZTdHJpbmc7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHRoZSBiYXNlNjQgZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbCBzdHJpbmcKICAgICAgICovCiAgICAgIGdldCBiYXNlNjRTdHJpbmcoKSB7CiAgICAgICAgcmV0dXJuIGJhc2U2NC5lbmNvZGUodGhpcy5yZWZTdHJpbmcpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiB0aGUgYmFzZTY0dXJpIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgb3JpZ2luYWwgc3RyaW5nCiAgICAgICAqLwogICAgICBnZXQgYmFzZTY0VXJpU3RyaW5nKCkgewogICAgICAgIHJldHVybiBiYXNlNjQuZW5jb2RlVXJpKHRoaXMucmVmU3RyaW5nKTsKICAgICAgfQogICAgfTsKICAgIGJhc2U2NCA9IHsKICAgICAgLyoqCiAgICAgICAqIGVuY29kZXMgdGhlIHN0cmluZwogICAgICAgKi8KICAgICAgZW5jb2RlOiAoc3RyaW5nQXJnKSA9PiB7CiAgICAgICAgcmV0dXJuIHVuaXZlcnNhbEJhc2U2NC5lbmNvZGUoc3RyaW5nQXJnKTsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIGVuY29kZXMgYSBzdHJpbmdBcmcgdG8gYmFzZTY0IHVyaSBzdHlsZQogICAgICAgKi8KICAgICAgZW5jb2RlVXJpOiAoc3RyaW5nQXJnKSA9PiB7CiAgICAgICAgcmV0dXJuIHVuaXZlcnNhbEJhc2U2NC5lbmNvZGUoc3RyaW5nQXJnKS5yZXBsYWNlKC9cKy9nLCAiLSIpLnJlcGxhY2UoL1wvL2csICJfIikucmVwbGFjZSgvPS9nLCAiIik7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBkZWNvZGVzIGEgYmFzZTY0IGVuY29kZWQgc3RyaW5nCiAgICAgICAqLwogICAgICBkZWNvZGU6IChzdHJpbmdBcmcpID0+IHsKICAgICAgICByZXR1cm4gdW5pdmVyc2FsQmFzZTY0LmRlY29kZShzdHJpbmdBcmcpOwogICAgICB9LAogICAgICAvKioKICAgICAgICoKICAgICAgICogQHBhcmFtIHN0cmluZ0FyZwogICAgICAgKiBjaGVja3Mgd2V0aGVyIHRoZSBzdHJpbmcgaXMgYmFzZTY0IGVuY29kZWQKICAgICAgICovCiAgICAgIGlzQmFzZTY0OiAoc3RyaW5nQXJnKSA9PiB7CiAgICAgICAgY29uc3QgcmVnZXggPSAvXihbQS1aYS16MC05Ky9dezR9KSooW0EtWmEtejAtOSsvXXszfT18W0EtWmEtejAtOSsvXXsyfT09KT8kLzsKICAgICAgICByZXR1cm4gcmVnZXgudGVzdChzdHJpbmdBcmcpOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcudHlwZS5qcwp2YXIgc21hcnRzdHJpbmdfdHlwZV9leHBvcnRzID0ge307Cl9fZXhwb3J0KHNtYXJ0c3RyaW5nX3R5cGVfZXhwb3J0cywgewogIGlzQmFzZTY0OiAoKSA9PiBpc0Jhc2U2NCwKICBpc1V0Zjg6ICgpID0+IGlzVXRmOAp9KTsKdmFyIGlzVXRmOCwgaXNCYXNlNjQ7CnZhciBpbml0X3NtYXJ0c3RyaW5nX3R5cGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0cmluZ0A0LjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdHJpbmcvZGlzdF90cy9zbWFydHN0cmluZy50eXBlLmpzIigpIHsKICAgIGluaXRfc21hcnRzdHJpbmdfcGx1Z2lucygpOwogICAgaW5pdF9zbWFydHN0cmluZ19iYXNlNjQoKTsKICAgIGlzVXRmOCA9IChzdHJpbmdBcmcpID0+IHsKICAgICAgY29uc3QgZW5jb2RlcjIgPSBuZXcgVGV4dEVuY29kZXIoKTsKICAgICAgY29uc3QgYnl0ZXMgPSBlbmNvZGVyMi5lbmNvZGUoc3RyaW5nQXJnKTsKICAgICAgbGV0IGkxMSA9IDA7CiAgICAgIHdoaWxlIChpMTEgPCBieXRlcy5sZW5ndGgpIHsKICAgICAgICBpZiAoCiAgICAgICAgICAvLyBBU0NJSQogICAgICAgICAgYnl0ZXNbaTExXSA9PT0gOSB8fCBieXRlc1tpMTFdID09PSAxMCB8fCBieXRlc1tpMTFdID09PSAxMyB8fCAzMiA8PSBieXRlc1tpMTFdICYmIGJ5dGVzW2kxMV0gPD0gMTI2CiAgICAgICAgKSB7CiAgICAgICAgICBpMTEgKz0gMTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoCiAgICAgICAgICAvLyBub24tb3ZlcmxvbmcgMi1ieXRlCiAgICAgICAgICAxOTQgPD0gYnl0ZXNbaTExXSAmJiBieXRlc1tpMTFdIDw9IDIyMyAmJiAxMjggPD0gYnl0ZXNbaTExICsgMV0gJiYgYnl0ZXNbaTExICsgMV0gPD0gMTkxCiAgICAgICAgKSB7CiAgICAgICAgICBpMTEgKz0gMjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoCiAgICAgICAgICAvLyBleGNsdWRpbmcgb3ZlcmxvbmdzCiAgICAgICAgICBieXRlc1tpMTFdID09PSAyMjQgJiYgMTYwIDw9IGJ5dGVzW2kxMSArIDFdICYmIGJ5dGVzW2kxMSArIDFdIDw9IDE5MSAmJiAxMjggPD0gYnl0ZXNbaTExICsgMl0gJiYgYnl0ZXNbaTExICsgMl0gPD0gMTkxIHx8IC8vIHN0cmFpZ2h0IDMtYnl0ZQogICAgICAgICAgKDIyNSA8PSBieXRlc1tpMTFdICYmIGJ5dGVzW2kxMV0gPD0gMjM2IHx8IGJ5dGVzW2kxMV0gPT09IDIzOCB8fCBieXRlc1tpMTFdID09PSAyMzkpICYmIDEyOCA8PSBieXRlc1tpMTEgKyAxXSAmJiBieXRlc1tpMTEgKyAxXSA8PSAxOTEgJiYgMTI4IDw9IGJ5dGVzW2kxMSArIDJdICYmIGJ5dGVzW2kxMSArIDJdIDw9IDE5MSB8fCAvLyBleGNsdWRpbmcgc3Vycm9nYXRlcwogICAgICAgICAgYnl0ZXNbaTExXSA9PT0gMjM3ICYmIDEyOCA8PSBieXRlc1tpMTEgKyAxXSAmJiBieXRlc1tpMTEgKyAxXSA8PSAxNTkgJiYgMTI4IDw9IGJ5dGVzW2kxMSArIDJdICYmIGJ5dGVzW2kxMSArIDJdIDw9IDE5MQogICAgICAgICkgewogICAgICAgICAgaTExICs9IDM7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKAogICAgICAgICAgLy8gcGxhbmVzIDEtMwogICAgICAgICAgYnl0ZXNbaTExXSA9PT0gMjQwICYmIDE0NCA8PSBieXRlc1tpMTEgKyAxXSAmJiBieXRlc1tpMTEgKyAxXSA8PSAxOTEgJiYgMTI4IDw9IGJ5dGVzW2kxMSArIDJdICYmIGJ5dGVzW2kxMSArIDJdIDw9IDE5MSAmJiAxMjggPD0gYnl0ZXNbaTExICsgM10gJiYgYnl0ZXNbaTExICsgM10gPD0gMTkxIHx8IC8vIHBsYW5lcyA0LTE1CiAgICAgICAgICAyNDEgPD0gYnl0ZXNbaTExXSAmJiBieXRlc1tpMTFdIDw9IDI0MyAmJiAxMjggPD0gYnl0ZXNbaTExICsgMV0gJiYgYnl0ZXNbaTExICsgMV0gPD0gMTkxICYmIDEyOCA8PSBieXRlc1tpMTEgKyAyXSAmJiBieXRlc1tpMTEgKyAyXSA8PSAxOTEgJiYgMTI4IDw9IGJ5dGVzW2kxMSArIDNdICYmIGJ5dGVzW2kxMSArIDNdIDw9IDE5MSB8fCAvLyBwbGFuZSAxNgogICAgICAgICAgYnl0ZXNbaTExXSA9PT0gMjQ0ICYmIDEyOCA8PSBieXRlc1tpMTEgKyAxXSAmJiBieXRlc1tpMTEgKyAxXSA8PSAxNDMgJiYgMTI4IDw9IGJ5dGVzW2kxMSArIDJdICYmIGJ5dGVzW2kxMSArIDJdIDw9IDE5MSAmJiAxMjggPD0gYnl0ZXNbaTExICsgM10gJiYgYnl0ZXNbaTExICsgM10gPD0gMTkxCiAgICAgICAgKSB7CiAgICAgICAgICBpMTEgKz0gNDsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9OwogICAgaXNCYXNlNjQgPSAoc3RyaW5nQXJnKSA9PiB7CiAgICAgIGNvbnN0IG5vdEJhc2U2NCA9IC9bXkEtWjAtOStcLz1dL2k7CiAgICAgIGNvbnN0IGxlbiA9IHN0cmluZ0FyZy5sZW5ndGg7CiAgICAgIGlmICghbGVuIHx8IGxlbiAlIDQgIT09IDAgfHwgbm90QmFzZTY0LnRlc3Qoc3RyaW5nQXJnKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBjb25zdCBmaXJzdFBhZGRpbmdDaGFyID0gc3RyaW5nQXJnLmluZGV4T2YoIj0iKTsKICAgICAgcmV0dXJuIGZpcnN0UGFkZGluZ0NoYXIgPT09IC0xIHx8IGZpcnN0UGFkZGluZ0NoYXIgPT09IGxlbiAtIDEgfHwgZmlyc3RQYWRkaW5nQ2hhciA9PT0gbGVuIC0gMiAmJiBzdHJpbmdBcmdbbGVuIC0gMV0gPT09ICI9IjsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0cmluZ0A0LjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdHJpbmcvZGlzdF90cy9zbWFydHN0cmluZy5kb21haW4uanMKdmFyIERvbWFpbjsKdmFyIGluaXRfc21hcnRzdHJpbmdfZG9tYWluID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuZG9tYWluLmpzIigpIHsKICAgIERvbWFpbiA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoZG9tYWluU3RyaW5nQXJnKSB7CiAgICAgICAgdGhpcy5wcm90b2NvbCA9IHRoaXMuX3Byb3RvY29sUmVnZXgoZG9tYWluU3RyaW5nQXJnKTsKICAgICAgICBpZiAoIXRoaXMucHJvdG9jb2wpIHsKICAgICAgICAgIGRvbWFpblN0cmluZ0FyZyA9IGBodHRwczovLyR7ZG9tYWluU3RyaW5nQXJnfWA7CiAgICAgICAgfQogICAgICAgIHRoaXMubm9kZVBhcnNlZFVybCA9IG5ldyBVUkwoZG9tYWluU3RyaW5nQXJnKTsKICAgICAgICB0aGlzLnBvcnQgPSB0aGlzLm5vZGVQYXJzZWRVcmwucG9ydDsKICAgICAgICBjb25zdCByZWdleE1hdGNoZXMgPSB0aGlzLl9kb21haW5SZWdleChkb21haW5TdHJpbmdBcmcucmVwbGFjZSh0aGlzLm5vZGVQYXJzZWRVcmwucGF0aG5hbWUsICIiKSk7CiAgICAgICAgdGhpcy5mdWxsTmFtZSA9ICIiOwogICAgICAgIGZvciAobGV0IGkxMSA9IDE7IGkxMSA8PSA1OyBpMTErKykgewogICAgICAgICAgaWYgKHJlZ2V4TWF0Y2hlc1tpMTEgLSAxXSkgewogICAgICAgICAgICBjb25zdCBsb2NhbE1hdGNoID0gcmVnZXhNYXRjaGVzW2kxMSAtIDFdOwogICAgICAgICAgICB0aGlzWyJsZXZlbCIgKyBpMTEudG9TdHJpbmcoKV0gPSBsb2NhbE1hdGNoOwogICAgICAgICAgICBpZiAodGhpcy5mdWxsTmFtZSA9PT0gIiIpIHsKICAgICAgICAgICAgICB0aGlzLmZ1bGxOYW1lID0gbG9jYWxNYXRjaDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLmZ1bGxOYW1lID0gbG9jYWxNYXRjaCArICIuIiArIHRoaXMuZnVsbE5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXNbImxldmVsIiArIGkxMS50b1N0cmluZygpXSA9IHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy56b25lTmFtZSA9IHRoaXMubGV2ZWwyICsgIi4iICsgdGhpcy5sZXZlbDE7CiAgICAgICAgdGhpcy50b3BMZXZlbCA9IHRoaXMubGV2ZWwxOwogICAgICAgIHRoaXMuZG9tYWluTmFtZSA9IHRoaXMubGV2ZWwyOwogICAgICAgIHRoaXMuc3ViRG9tYWluID0gdGhpcy5sZXZlbDM7CiAgICAgIH0KICAgICAgLy8gaGVscGVyIGZ1bmN0aW9ucwogICAgICAvKiogKi8KICAgICAgX2RvbWFpblJlZ2V4KHN0cmluZ0FyZykgewogICAgICAgIGNvbnN0IHJlZ2V4U3RyaW5nID0gLyhbYS16QS1aMC05XC1cX10qKVwuezAsMX0oW2EtekEtWjAtOVwtXF9dKilcLnswLDF9KFthLXpBLVowLTlcLVxfXSopXC57MCwxfShbYS16QS1aMC05XC1cX10qKVwuezAsMX0oW2EtekEtWjAtOVwtXF9dKilcLnswLDF9JC87CiAgICAgICAgY29uc3QgcmVnZXhNYXRjaGVzID0gcmVnZXhTdHJpbmcuZXhlYyhzdHJpbmdBcmcpOwogICAgICAgIHJlZ2V4TWF0Y2hlcy5yZXZlcnNlKCk7CiAgICAgICAgcmVnZXhNYXRjaGVzLnBvcCgpOwogICAgICAgIGNvbnN0IHJlZ2V4TWF0Y2hlc0ZpbHRlcmVkID0gcmVnZXhNYXRjaGVzLmZpbHRlcihmdW5jdGlvbihzdHJpbmdBcmcyKSB7CiAgICAgICAgICByZXR1cm4gc3RyaW5nQXJnMiAhPT0gIiI7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlZ2V4TWF0Y2hlc0ZpbHRlcmVkOwogICAgICB9CiAgICAgIF9wcm90b2NvbFJlZ2V4KHN0cmluZ0FyZykgewogICAgICAgIGNvbnN0IHJlZ2V4U3RyaW5nID0gL14oW2EtekEtWjAtOV0qKTpcL1wvLzsKICAgICAgICBjb25zdCByZWdleE1hdGNoZXMgPSByZWdleFN0cmluZy5leGVjKHN0cmluZ0FyZyk7CiAgICAgICAgaWYgKHJlZ2V4TWF0Y2hlcykgewogICAgICAgICAgcmV0dXJuIHJlZ2V4TWF0Y2hlc1sxXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgIH0KICAgICAgX3BvcnRSZWdleChzdHJpbmdBcmcpIHsKICAgICAgICBjb25zdCByZWdleFN0cmluZyA9IC9eKFthLXpBLVowLTldKik6XC9cLy87CiAgICAgICAgY29uc3QgcmVnZXhNYXRjaGVzID0gcmVnZXhTdHJpbmcuZXhlYyhzdHJpbmdBcmcpOwogICAgICAgIGlmIChyZWdleE1hdGNoZXMpIHsKICAgICAgICAgIHJldHVybiByZWdleE1hdGNoZXNbMV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuZ2l0LmpzCnZhciBHaXRSZXBvLCBnaXRSZWdleCwgZ2l0TGluazsKdmFyIGluaXRfc21hcnRzdHJpbmdfZ2l0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuZ2l0LmpzIigpIHsKICAgIGluaXRfc21hcnRzdHJpbmdfcGx1Z2lucygpOwogICAgR2l0UmVwbyA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3Ioc3RyaW5nQXJnLCB0b2tlbkFyZykgewogICAgICAgIGxldCByZWdleE1hdGNoZXMgPSBnaXRSZWdleChzdHJpbmdBcmcpOwogICAgICAgIHRoaXMuaG9zdCA9IHJlZ2V4TWF0Y2hlc1sxXTsKICAgICAgICB0aGlzLnVzZXIgPSByZWdleE1hdGNoZXNbMl07CiAgICAgICAgdGhpcy5yZXBvID0gcmVnZXhNYXRjaGVzWzNdOwogICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSB0b2tlbkFyZzsKICAgICAgICB0aGlzLnNzaFVybCA9IGdpdExpbmsodGhpcy5ob3N0LCB0aGlzLnVzZXIsIHRoaXMucmVwbywgdGhpcy5hY2Nlc3NUb2tlbiwgInNzaCIpOwogICAgICAgIHRoaXMuaHR0cHNVcmwgPSBnaXRMaW5rKHRoaXMuaG9zdCwgdGhpcy51c2VyLCB0aGlzLnJlcG8sIHRoaXMuYWNjZXNzVG9rZW4sICJodHRwcyIpOwogICAgICB9CiAgICB9OwogICAgZ2l0UmVnZXggPSBmdW5jdGlvbihzdHJpbmdBcmcpIHsKICAgICAgY29uc3QgcmVnZXhTdHJpbmcgPSAvKFthLXpBLVowLTlcLV9cLl0qKSg/OlwvfFw6KShbYS16QS1aMC05XC1fXC5dKikoPzpcLykoW2EtekEtWjAtOVwtX1wuXSopKD86XC5naXQpLzsKICAgICAgbGV0IHJlZ2V4TWF0Y2hlcyA9IHJlZ2V4U3RyaW5nLmV4ZWMoc3RyaW5nQXJnKTsKICAgICAgcmV0dXJuIHJlZ2V4TWF0Y2hlczsKICAgIH07CiAgICBnaXRMaW5rID0gZnVuY3Rpb24oaG9zdEFyZywgdXNlckFyZywgcmVwb0FyZywgdG9rZW5BcmcgPSAiIiwgbGlua1R5cGVBcmcpIHsKICAgICAgbGV0IHJldHVyblN0cmluZzsKICAgICAgaWYgKHRva2VuQXJnICE9PSAiIikgewogICAgICAgIHRva2VuQXJnID0gdG9rZW5BcmcgKyAiQCI7CiAgICAgIH0KICAgICAgc3dpdGNoIChsaW5rVHlwZUFyZykgewogICAgICAgIGNhc2UgImh0dHBzIjoKICAgICAgICAgIHJldHVyblN0cmluZyA9ICJodHRwczovLyIgKyB0b2tlbkFyZyArIGhvc3RBcmcgKyAiLyIgKyB1c2VyQXJnICsgIi8iICsgcmVwb0FyZyArICIuZ2l0IjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInNzaCI6CiAgICAgICAgICByZXR1cm5TdHJpbmcgPSAiZ2l0QCIgKyBob3N0QXJnICsgIjoiICsgdXNlckFyZyArICIvIiArIHJlcG9BcmcgKyAiLmdpdCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgY29uc29sZS5lcnJvcigiTGluayBUeXBlICIgKyBsaW5rVHlwZUFyZyArICIgbm90IGtub3duIik7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICByZXR1cm4gcmV0dXJuU3RyaW5nOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMxMSA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMxMSwgewogIEJhc2U2NDogKCkgPT4gQmFzZTY0LAogIERvbWFpbjogKCkgPT4gRG9tYWluLAogIEdpdFJlcG86ICgpID0+IEdpdFJlcG8sCiAgYmFzZTY0OiAoKSA9PiBiYXNlNjQsCiAgY3JlYXRlOiAoKSA9PiBzbWFydHN0cmluZ19jcmVhdGVfZXhwb3J0cywKICBkb2NrZXI6ICgpID0+IHNtYXJ0c3RyaW5nX2RvY2tlcl9leHBvcnRzLAogIGluZGVudDogKCkgPT4gc21hcnRzdHJpbmdfaW5kZW50X2V4cG9ydHMsCiAgbm9ybWFsaXplOiAoKSA9PiBzbWFydHN0cmluZ19ub3JtYWxpemVfZXhwb3J0cywKICB0eXBlOiAoKSA9PiBzbWFydHN0cmluZ190eXBlX2V4cG9ydHMKfSk7CnZhciBpbml0X2Rpc3RfdHMxMSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfc21hcnRzdHJpbmdfY3JlYXRlKCk7CiAgICBpbml0X3NtYXJ0c3RyaW5nX2RvY2tlcigpOwogICAgaW5pdF9zbWFydHN0cmluZ19pbmRlbnQoKTsKICAgIGluaXRfc21hcnRzdHJpbmdfbm9ybWFsaXplKCk7CiAgICBpbml0X3NtYXJ0c3RyaW5nX3R5cGUoKTsKICAgIGluaXRfc21hcnRzdHJpbmdfYmFzZTY0KCk7CiAgICBpbml0X3NtYXJ0c3RyaW5nX2RvbWFpbigpOwogICAgaW5pdF9zbWFydHN0cmluZ19naXQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaC5jbG9uZWRlZXBANC41LjAvbm9kZV9tb2R1bGVzL2xvZGFzaC5jbG9uZWRlZXAvaW5kZXguanMKdmFyIHJlcXVpcmVfbG9kYXNoID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2guY2xvbmVkZWVwQDQuNS4wL25vZGVfbW9kdWxlcy9sb2Rhc2guY2xvbmVkZWVwL2luZGV4LmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgIHZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwOwogICAgdmFyIEhBU0hfVU5ERUZJTkVEID0gIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iOwogICAgdmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxOwogICAgdmFyIGFyZ3NUYWcgPSAiW29iamVjdCBBcmd1bWVudHNdIiwgYXJyYXlUYWcgPSAiW29iamVjdCBBcnJheV0iLCBib29sVGFnID0gIltvYmplY3QgQm9vbGVhbl0iLCBkYXRlVGFnID0gIltvYmplY3QgRGF0ZV0iLCBlcnJvclRhZyA9ICJbb2JqZWN0IEVycm9yXSIsIGZ1bmNUYWcgPSAiW29iamVjdCBGdW5jdGlvbl0iLCBnZW5UYWcgPSAiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLCBtYXBUYWcgPSAiW29iamVjdCBNYXBdIiwgbnVtYmVyVGFnID0gIltvYmplY3QgTnVtYmVyXSIsIG9iamVjdFRhZyA9ICJbb2JqZWN0IE9iamVjdF0iLCBwcm9taXNlVGFnID0gIltvYmplY3QgUHJvbWlzZV0iLCByZWdleHBUYWcgPSAiW29iamVjdCBSZWdFeHBdIiwgc2V0VGFnID0gIltvYmplY3QgU2V0XSIsIHN0cmluZ1RhZyA9ICJbb2JqZWN0IFN0cmluZ10iLCBzeW1ib2xUYWcgPSAiW29iamVjdCBTeW1ib2xdIiwgd2Vha01hcFRhZyA9ICJbb2JqZWN0IFdlYWtNYXBdIjsKICAgIHZhciBhcnJheUJ1ZmZlclRhZyA9ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIsIGRhdGFWaWV3VGFnID0gIltvYmplY3QgRGF0YVZpZXddIiwgZmxvYXQzMlRhZyA9ICJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLCBmbG9hdDY0VGFnID0gIltvYmplY3QgRmxvYXQ2NEFycmF5XSIsIGludDhUYWcgPSAiW29iamVjdCBJbnQ4QXJyYXldIiwgaW50MTZUYWcgPSAiW29iamVjdCBJbnQxNkFycmF5XSIsIGludDMyVGFnID0gIltvYmplY3QgSW50MzJBcnJheV0iLCB1aW50OFRhZyA9ICJbb2JqZWN0IFVpbnQ4QXJyYXldIiwgdWludDhDbGFtcGVkVGFnID0gIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIiwgdWludDE2VGFnID0gIltvYmplY3QgVWludDE2QXJyYXldIiwgdWludDMyVGFnID0gIltvYmplY3QgVWludDMyQXJyYXldIjsKICAgIHZhciByZVJlZ0V4cENoYXIgPSAvW1xcXiQuKis/KClbXF17fXxdL2c7CiAgICB2YXIgcmVGbGFncyA9IC9cdyokLzsKICAgIHZhciByZUlzSG9zdEN0b3IgPSAvXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLzsKICAgIHZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxkKikkLzsKICAgIHZhciBjbG9uZWFibGVUYWdzID0ge307CiAgICBjbG9uZWFibGVUYWdzW2FyZ3NUYWddID0gY2xvbmVhYmxlVGFnc1thcnJheVRhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0YVZpZXdUYWddID0gY2xvbmVhYmxlVGFnc1tib29sVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0ZVRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWddID0gY2xvbmVhYmxlVGFnc1tmbG9hdDY0VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW2ludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MzJUYWddID0gY2xvbmVhYmxlVGFnc1ttYXBUYWddID0gY2xvbmVhYmxlVGFnc1tudW1iZXJUYWddID0gY2xvbmVhYmxlVGFnc1tvYmplY3RUYWddID0gY2xvbmVhYmxlVGFnc1tyZWdleHBUYWddID0gY2xvbmVhYmxlVGFnc1tzZXRUYWddID0gY2xvbmVhYmxlVGFnc1tzdHJpbmdUYWddID0gY2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQxNlRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQzMlRhZ10gPSB0cnVlOwogICAgY2xvbmVhYmxlVGFnc1tlcnJvclRhZ10gPSBjbG9uZWFibGVUYWdzW2Z1bmNUYWddID0gY2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlOwogICAgdmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICJvYmplY3QiICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsOwogICAgdmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gIm9iamVjdCIgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7CiAgICB2YXIgcm9vdDYgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCk7CiAgICB2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7CiAgICB2YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlOwogICAgdmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7CiAgICBmdW5jdGlvbiBhZGRNYXBFbnRyeShtYXA3LCBwYWlyKSB7CiAgICAgIG1hcDcuc2V0KHBhaXJbMF0sIHBhaXJbMV0pOwogICAgICByZXR1cm4gbWFwNzsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZFNldEVudHJ5KHNldDMsIHZhbHVlMikgewogICAgICBzZXQzLmFkZCh2YWx1ZTIpOwogICAgICByZXR1cm4gc2V0MzsKICAgIH0KICAgIGZ1bmN0aW9uIGFycmF5RWFjaChhcnJheSwgaXRlcmF0ZWUpIHsKICAgICAgdmFyIGluZGV4MiA9IC0xLCBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7CiAgICAgIHdoaWxlICgrK2luZGV4MiA8IGxlbmd0aCkgewogICAgICAgIGlmIChpdGVyYXRlZShhcnJheVtpbmRleDJdLCBpbmRleDIsIGFycmF5KSA9PT0gZmFsc2UpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYXJyYXk7CiAgICB9CiAgICBmdW5jdGlvbiBhcnJheVB1c2goYXJyYXksIHZhbHVlcykgewogICAgICB2YXIgaW5kZXgyID0gLTEsIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsIG9mZnNldCA9IGFycmF5Lmxlbmd0aDsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbGVuZ3RoKSB7CiAgICAgICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXgyXSA9IHZhbHVlc1tpbmRleDJdOwogICAgICB9CiAgICAgIHJldHVybiBhcnJheTsKICAgIH0KICAgIGZ1bmN0aW9uIGFycmF5UmVkdWNlKGFycmF5LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSkgewogICAgICB2YXIgaW5kZXgyID0gLTEsIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDsKICAgICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHsKICAgICAgICBhY2N1bXVsYXRvciA9IGFycmF5WysraW5kZXgyXTsKICAgICAgfQogICAgICB3aGlsZSAoKytpbmRleDIgPCBsZW5ndGgpIHsKICAgICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleDJdLCBpbmRleDIsIGFycmF5KTsKICAgICAgfQogICAgICByZXR1cm4gYWNjdW11bGF0b3I7CiAgICB9CiAgICBmdW5jdGlvbiBiYXNlVGltZXMobjEzLCBpdGVyYXRlZSkgewogICAgICB2YXIgaW5kZXgyID0gLTEsIHJlc3VsdCA9IEFycmF5KG4xMyk7CiAgICAgIHdoaWxlICgrK2luZGV4MiA8IG4xMykgewogICAgICAgIHJlc3VsdFtpbmRleDJdID0gaXRlcmF0ZWUoaW5kZXgyKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkyKSB7CiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHZvaWQgMCA6IG9iamVjdFtrZXkyXTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzSG9zdE9iamVjdCh2YWx1ZTIpIHsKICAgICAgdmFyIHJlc3VsdCA9IGZhbHNlOwogICAgICBpZiAodmFsdWUyICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlMi50b1N0cmluZyAhPSAiZnVuY3Rpb24iKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJlc3VsdCA9ICEhKHZhbHVlMiArICIiKTsKICAgICAgICB9IGNhdGNoIChlMTEpIHsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwNykgewogICAgICB2YXIgaW5kZXgyID0gLTEsIHJlc3VsdCA9IEFycmF5KG1hcDcuc2l6ZSk7CiAgICAgIG1hcDcuZm9yRWFjaChmdW5jdGlvbih2YWx1ZTIsIGtleTIpIHsKICAgICAgICByZXN1bHRbKytpbmRleDJdID0gW2tleTIsIHZhbHVlMl07CiAgICAgIH0pOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0yKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihhcmcpIHsKICAgICAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0yKGFyZykpOwogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc2V0VG9BcnJheShzZXQzKSB7CiAgICAgIHZhciBpbmRleDIgPSAtMSwgcmVzdWx0ID0gQXJyYXkoc2V0My5zaXplKTsKICAgICAgc2V0My5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlMikgewogICAgICAgIHJlc3VsdFsrK2luZGV4Ml0gPSB2YWx1ZTI7CiAgICAgIH0pOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgdmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSwgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlOwogICAgdmFyIGNvcmVKc0RhdGEgPSByb290NlsiX19jb3JlLWpzX3NoYXJlZF9fIl07CiAgICB2YXIgbWFza1NyY0tleSA9IChmdW5jdGlvbigpIHsKICAgICAgdmFyIHVpZCA9IC9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSAmJiBjb3JlSnNEYXRhLmtleXMgJiYgY29yZUpzRGF0YS5rZXlzLklFX1BST1RPIHx8ICIiKTsKICAgICAgcmV0dXJuIHVpZCA/ICJTeW1ib2woc3JjKV8xLiIgKyB1aWQgOiAiIjsKICAgIH0pKCk7CiAgICB2YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nOwogICAgdmFyIGhhc093blByb3BlcnR5MyA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5OwogICAgdmFyIG9iamVjdFRvU3RyaW5nMiA9IG9iamVjdFByb3RvLnRvU3RyaW5nOwogICAgdmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoCiAgICAgICJeIiArIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5MykucmVwbGFjZShyZVJlZ0V4cENoYXIsICJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywgIiQxLio/IikgKyAiJCIKICAgICk7CiAgICB2YXIgQnVmZmVyMiA9IG1vZHVsZUV4cG9ydHMgPyByb290Ni5CdWZmZXIgOiB2b2lkIDAsIFN5bWJvbDIgPSByb290Ni5TeW1ib2wsIFVpbnQ4QXJyYXkyID0gcm9vdDYuVWludDhBcnJheSwgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCksIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGUsIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsIHNwbGljZTIgPSBhcnJheVByb3RvLnNwbGljZTsKICAgIHZhciBuYXRpdmVHZXRTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scywgbmF0aXZlSXNCdWZmZXIgPSBCdWZmZXIyID8gQnVmZmVyMi5pc0J1ZmZlciA6IHZvaWQgMCwgbmF0aXZlS2V5cyA9IG92ZXJBcmcoT2JqZWN0LmtleXMsIE9iamVjdCk7CiAgICB2YXIgRGF0YVZpZXcyID0gZ2V0TmF0aXZlKHJvb3Q2LCAiRGF0YVZpZXciKSwgTWFwMiA9IGdldE5hdGl2ZShyb290NiwgIk1hcCIpLCBQcm9taXNlMiA9IGdldE5hdGl2ZShyb290NiwgIlByb21pc2UiKSwgU2V0MiA9IGdldE5hdGl2ZShyb290NiwgIlNldCIpLCBXZWFrTWFwMiA9IGdldE5hdGl2ZShyb290NiwgIldlYWtNYXAiKSwgbmF0aXZlQ3JlYXRlID0gZ2V0TmF0aXZlKE9iamVjdCwgImNyZWF0ZSIpOwogICAgdmFyIGRhdGFWaWV3Q3RvclN0cmluZyA9IHRvU291cmNlKERhdGFWaWV3MiksIG1hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShNYXAyKSwgcHJvbWlzZUN0b3JTdHJpbmcgPSB0b1NvdXJjZShQcm9taXNlMiksIHNldEN0b3JTdHJpbmcgPSB0b1NvdXJjZShTZXQyKSwgd2Vha01hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShXZWFrTWFwMik7CiAgICB2YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wyID8gU3ltYm9sMi5wcm90b3R5cGUgOiB2b2lkIDAsIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB2b2lkIDA7CiAgICBmdW5jdGlvbiBIYXNoKGVudHJpZXMpIHsKICAgICAgdmFyIGluZGV4MiA9IC0xLCBsZW5ndGggPSBlbnRyaWVzID8gZW50cmllcy5sZW5ndGggOiAwOwogICAgICB0aGlzLmNsZWFyKCk7CiAgICAgIHdoaWxlICgrK2luZGV4MiA8IGxlbmd0aCkgewogICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXgyXTsKICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBoYXNoQ2xlYXIoKSB7CiAgICAgIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTsKICAgIH0KICAgIGZ1bmN0aW9uIGhhc2hEZWxldGUoa2V5MikgewogICAgICByZXR1cm4gdGhpcy5oYXMoa2V5MikgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5Ml07CiAgICB9CiAgICBmdW5jdGlvbiBoYXNoR2V0KGtleTIpIHsKICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fOwogICAgICBpZiAobmF0aXZlQ3JlYXRlKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5Ml07CiAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB2b2lkIDAgOiByZXN1bHQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5My5jYWxsKGRhdGEsIGtleTIpID8gZGF0YVtrZXkyXSA6IHZvaWQgMDsKICAgIH0KICAgIGZ1bmN0aW9uIGhhc2hIYXMoa2V5MikgewogICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187CiAgICAgIHJldHVybiBuYXRpdmVDcmVhdGUgPyBkYXRhW2tleTJdICE9PSB2b2lkIDAgOiBoYXNPd25Qcm9wZXJ0eTMuY2FsbChkYXRhLCBrZXkyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGhhc2hTZXQoa2V5MiwgdmFsdWUyKSB7CiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXzsKICAgICAgZGF0YVtrZXkyXSA9IG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZTIgPT09IHZvaWQgMCA/IEhBU0hfVU5ERUZJTkVEIDogdmFsdWUyOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIEhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyOwogICAgSGFzaC5wcm90b3R5cGVbImRlbGV0ZSJdID0gaGFzaERlbGV0ZTsKICAgIEhhc2gucHJvdG90eXBlLmdldCA9IGhhc2hHZXQ7CiAgICBIYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzOwogICAgSGFzaC5wcm90b3R5cGUuc2V0ID0gaGFzaFNldDsKICAgIGZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7CiAgICAgIHZhciBpbmRleDIgPSAtMSwgbGVuZ3RoID0gZW50cmllcyA/IGVudHJpZXMubGVuZ3RoIDogMDsKICAgICAgdGhpcy5jbGVhcigpOwogICAgICB3aGlsZSAoKytpbmRleDIgPCBsZW5ndGgpIHsKICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4Ml07CiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7CiAgICAgIHRoaXMuX19kYXRhX18gPSBbXTsKICAgIH0KICAgIGZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkyKSB7CiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXywgaW5kZXgyID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleTIpOwogICAgICBpZiAoaW5kZXgyIDwgMCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxOwogICAgICBpZiAoaW5kZXgyID09IGxhc3RJbmRleCkgewogICAgICAgIGRhdGEucG9wKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3BsaWNlMi5jYWxsKGRhdGEsIGluZGV4MiwgMSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5MikgewogICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sIGluZGV4MiA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkyKTsKICAgICAgcmV0dXJuIGluZGV4MiA8IDAgPyB2b2lkIDAgOiBkYXRhW2luZGV4Ml1bMV07CiAgICB9CiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5MikgewogICAgICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleTIpID4gLTE7CiAgICB9CiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5MiwgdmFsdWUyKSB7CiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXywgaW5kZXgyID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleTIpOwogICAgICBpZiAoaW5kZXgyIDwgMCkgewogICAgICAgIGRhdGEucHVzaChba2V5MiwgdmFsdWUyXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGF0YVtpbmRleDJdWzFdID0gdmFsdWUyOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyOwogICAgTGlzdENhY2hlLnByb3RvdHlwZVsiZGVsZXRlIl0gPSBsaXN0Q2FjaGVEZWxldGU7CiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDsKICAgIExpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzOwogICAgTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7CiAgICBmdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKSB7CiAgICAgIHZhciBpbmRleDIgPSAtMSwgbGVuZ3RoID0gZW50cmllcyA/IGVudHJpZXMubGVuZ3RoIDogMDsKICAgICAgdGhpcy5jbGVhcigpOwogICAgICB3aGlsZSAoKytpbmRleDIgPCBsZW5ndGgpIHsKICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4Ml07CiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHsKICAgICAgdGhpcy5fX2RhdGFfXyA9IHsKICAgICAgICAiaGFzaCI6IG5ldyBIYXNoKCksCiAgICAgICAgIm1hcCI6IG5ldyAoTWFwMiB8fCBMaXN0Q2FjaGUpKCksCiAgICAgICAgInN0cmluZyI6IG5ldyBIYXNoKCkKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleTIpIHsKICAgICAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5MilbImRlbGV0ZSJdKGtleTIpOwogICAgfQogICAgZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5MikgewogICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkyKS5nZXQoa2V5Mik7CiAgICB9CiAgICBmdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkyKSB7CiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleTIpLmhhcyhrZXkyKTsKICAgIH0KICAgIGZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleTIsIHZhbHVlMikgewogICAgICBnZXRNYXBEYXRhKHRoaXMsIGtleTIpLnNldChrZXkyLCB2YWx1ZTIpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIE1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7CiAgICBNYXBDYWNoZS5wcm90b3R5cGVbImRlbGV0ZSJdID0gbWFwQ2FjaGVEZWxldGU7CiAgICBNYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7CiAgICBNYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7CiAgICBNYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7CiAgICBmdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7CiAgICAgIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlKGVudHJpZXMpOwogICAgfQogICAgZnVuY3Rpb24gc3RhY2tDbGVhcigpIHsKICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoKTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleTIpIHsKICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX19bImRlbGV0ZSJdKGtleTIpOwogICAgfQogICAgZnVuY3Rpb24gc3RhY2tHZXQoa2V5MikgewogICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5Mik7CiAgICB9CiAgICBmdW5jdGlvbiBzdGFja0hhcyhrZXkyKSB7CiAgICAgIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyhrZXkyKTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0YWNrU2V0KGtleTIsIHZhbHVlMikgewogICAgICB2YXIgY2FjaGUgPSB0aGlzLl9fZGF0YV9fOwogICAgICBpZiAoY2FjaGUgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpIHsKICAgICAgICB2YXIgcGFpcnMyID0gY2FjaGUuX19kYXRhX187CiAgICAgICAgaWYgKCFNYXAyIHx8IHBhaXJzMi5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkgewogICAgICAgICAgcGFpcnMyLnB1c2goW2tleTIsIHZhbHVlMl0pOwogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIGNhY2hlID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZShwYWlyczIpOwogICAgICB9CiAgICAgIGNhY2hlLnNldChrZXkyLCB2YWx1ZTIpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIFN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7CiAgICBTdGFjay5wcm90b3R5cGVbImRlbGV0ZSJdID0gc3RhY2tEZWxldGU7CiAgICBTdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7CiAgICBTdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7CiAgICBTdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7CiAgICBmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlMiwgaW5oZXJpdGVkKSB7CiAgICAgIHZhciByZXN1bHQgPSBpc0FycmF5Myh2YWx1ZTIpIHx8IGlzQXJndW1lbnRzKHZhbHVlMikgPyBiYXNlVGltZXModmFsdWUyLmxlbmd0aCwgU3RyaW5nKSA6IFtdOwogICAgICB2YXIgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aCwgc2tpcEluZGV4ZXMgPSAhIWxlbmd0aDsKICAgICAgZm9yICh2YXIga2V5MiBpbiB2YWx1ZTIpIHsKICAgICAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eTMuY2FsbCh2YWx1ZTIsIGtleTIpKSAmJiAhKHNraXBJbmRleGVzICYmIChrZXkyID09ICJsZW5ndGgiIHx8IGlzSW5kZXgoa2V5MiwgbGVuZ3RoKSkpKSB7CiAgICAgICAgICByZXN1bHQucHVzaChrZXkyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCwga2V5MiwgdmFsdWUyKSB7CiAgICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXkyXTsKICAgICAgaWYgKCEoaGFzT3duUHJvcGVydHkzLmNhbGwob2JqZWN0LCBrZXkyKSAmJiBlcShvYmpWYWx1ZSwgdmFsdWUyKSkgfHwgdmFsdWUyID09PSB2b2lkIDAgJiYgIShrZXkyIGluIG9iamVjdCkpIHsKICAgICAgICBvYmplY3Rba2V5Ml0gPSB2YWx1ZTI7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5MikgewogICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKICAgICAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5MikpIHsKICAgICAgICAgIHJldHVybiBsZW5ndGg7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LCBzb3VyY2UpIHsKICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5czIoc291cmNlKSwgb2JqZWN0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZTIsIGlzRGVlcCwgaXNGdWxsLCBjdXN0b21pemVyLCBrZXkyLCBvYmplY3QsIHN0YWNrKSB7CiAgICAgIHZhciByZXN1bHQ7CiAgICAgIGlmIChjdXN0b21pemVyKSB7CiAgICAgICAgcmVzdWx0ID0gb2JqZWN0ID8gY3VzdG9taXplcih2YWx1ZTIsIGtleTIsIG9iamVjdCwgc3RhY2spIDogY3VzdG9taXplcih2YWx1ZTIpOwogICAgICB9CiAgICAgIGlmIChyZXN1bHQgIT09IHZvaWQgMCkgewogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgaWYgKCFpc09iamVjdDModmFsdWUyKSkgewogICAgICAgIHJldHVybiB2YWx1ZTI7CiAgICAgIH0KICAgICAgdmFyIGlzQXJyID0gaXNBcnJheTModmFsdWUyKTsKICAgICAgaWYgKGlzQXJyKSB7CiAgICAgICAgcmVzdWx0ID0gaW5pdENsb25lQXJyYXkodmFsdWUyKTsKICAgICAgICBpZiAoIWlzRGVlcCkgewogICAgICAgICAgcmV0dXJuIGNvcHlBcnJheSh2YWx1ZTIsIHJlc3VsdCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUyKSwgaXNGdW5jID0gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZzsKICAgICAgICBpZiAoaXNCdWZmZXIodmFsdWUyKSkgewogICAgICAgICAgcmV0dXJuIGNsb25lQnVmZmVyKHZhbHVlMiwgaXNEZWVwKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRhZyA9PSBvYmplY3RUYWcgfHwgdGFnID09IGFyZ3NUYWcgfHwgaXNGdW5jICYmICFvYmplY3QpIHsKICAgICAgICAgIGlmIChpc0hvc3RPYmplY3QodmFsdWUyKSkgewogICAgICAgICAgICByZXR1cm4gb2JqZWN0ID8gdmFsdWUyIDoge307CiAgICAgICAgICB9CiAgICAgICAgICByZXN1bHQgPSBpbml0Q2xvbmVPYmplY3QoaXNGdW5jID8ge30gOiB2YWx1ZTIpOwogICAgICAgICAgaWYgKCFpc0RlZXApIHsKICAgICAgICAgICAgcmV0dXJuIGNvcHlTeW1ib2xzKHZhbHVlMiwgYmFzZUFzc2lnbihyZXN1bHQsIHZhbHVlMikpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIWNsb25lYWJsZVRhZ3NbdGFnXSkgewogICAgICAgICAgICByZXR1cm4gb2JqZWN0ID8gdmFsdWUyIDoge307CiAgICAgICAgICB9CiAgICAgICAgICByZXN1bHQgPSBpbml0Q2xvbmVCeVRhZyh2YWx1ZTIsIHRhZywgYmFzZUNsb25lLCBpc0RlZXApOwogICAgICAgIH0KICAgICAgfQogICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2soKSk7CiAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KHZhbHVlMik7CiAgICAgIGlmIChzdGFja2VkKSB7CiAgICAgICAgcmV0dXJuIHN0YWNrZWQ7CiAgICAgIH0KICAgICAgc3RhY2suc2V0KHZhbHVlMiwgcmVzdWx0KTsKICAgICAgaWYgKCFpc0FycikgewogICAgICAgIHZhciBwcm9wcyA9IGlzRnVsbCA/IGdldEFsbEtleXModmFsdWUyKSA6IGtleXMyKHZhbHVlMik7CiAgICAgIH0KICAgICAgYXJyYXlFYWNoKHByb3BzIHx8IHZhbHVlMiwgZnVuY3Rpb24oc3ViVmFsdWUsIGtleTMpIHsKICAgICAgICBpZiAocHJvcHMpIHsKICAgICAgICAgIGtleTMgPSBzdWJWYWx1ZTsKICAgICAgICAgIHN1YlZhbHVlID0gdmFsdWUyW2tleTNdOwogICAgICAgIH0KICAgICAgICBhc3NpZ25WYWx1ZShyZXN1bHQsIGtleTMsIGJhc2VDbG9uZShzdWJWYWx1ZSwgaXNEZWVwLCBpc0Z1bGwsIGN1c3RvbWl6ZXIsIGtleTMsIHZhbHVlMiwgc3RhY2spKTsKICAgICAgfSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBiYXNlQ3JlYXRlKHByb3RvKSB7CiAgICAgIHJldHVybiBpc09iamVjdDMocHJvdG8pID8gb2JqZWN0Q3JlYXRlKHByb3RvKSA6IHt9OwogICAgfQogICAgZnVuY3Rpb24gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzRnVuYywgc3ltYm9sc0Z1bmMpIHsKICAgICAgdmFyIHJlc3VsdCA9IGtleXNGdW5jKG9iamVjdCk7CiAgICAgIHJldHVybiBpc0FycmF5MyhvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7CiAgICB9CiAgICBmdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlMikgewogICAgICByZXR1cm4gb2JqZWN0VG9TdHJpbmcyLmNhbGwodmFsdWUyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZTIpIHsKICAgICAgaWYgKCFpc09iamVjdDModmFsdWUyKSB8fCBpc01hc2tlZCh2YWx1ZTIpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbjIodmFsdWUyKSB8fCBpc0hvc3RPYmplY3QodmFsdWUyKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7CiAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUyKSk7CiAgICB9CiAgICBmdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHsKICAgICAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7CiAgICAgICAgcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTsKICAgICAgfQogICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgIGZvciAodmFyIGtleTIgaW4gT2JqZWN0KG9iamVjdCkpIHsKICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkzLmNhbGwob2JqZWN0LCBrZXkyKSAmJiBrZXkyICE9ICJjb25zdHJ1Y3RvciIpIHsKICAgICAgICAgIHJlc3VsdC5wdXNoKGtleTIpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyMiwgaXNEZWVwKSB7CiAgICAgIGlmIChpc0RlZXApIHsKICAgICAgICByZXR1cm4gYnVmZmVyMi5zbGljZSgpOwogICAgICB9CiAgICAgIHZhciByZXN1bHQgPSBuZXcgYnVmZmVyMi5jb25zdHJ1Y3RvcihidWZmZXIyLmxlbmd0aCk7CiAgICAgIGJ1ZmZlcjIuY29weShyZXN1bHQpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcikgewogICAgICB2YXIgcmVzdWx0ID0gbmV3IGFycmF5QnVmZmVyLmNvbnN0cnVjdG9yKGFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpOwogICAgICBuZXcgVWludDhBcnJheTIocmVzdWx0KS5zZXQobmV3IFVpbnQ4QXJyYXkyKGFycmF5QnVmZmVyKSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBjbG9uZURhdGFWaWV3KGRhdGFWaWV3LCBpc0RlZXApIHsKICAgICAgdmFyIGJ1ZmZlcjIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKGRhdGFWaWV3LmJ1ZmZlcikgOiBkYXRhVmlldy5idWZmZXI7CiAgICAgIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyMiwgZGF0YVZpZXcuYnl0ZU9mZnNldCwgZGF0YVZpZXcuYnl0ZUxlbmd0aCk7CiAgICB9CiAgICBmdW5jdGlvbiBjbG9uZU1hcChtYXA3LCBpc0RlZXAsIGNsb25lRnVuYykgewogICAgICB2YXIgYXJyYXkgPSBpc0RlZXAgPyBjbG9uZUZ1bmMobWFwVG9BcnJheShtYXA3KSwgdHJ1ZSkgOiBtYXBUb0FycmF5KG1hcDcpOwogICAgICByZXR1cm4gYXJyYXlSZWR1Y2UoYXJyYXksIGFkZE1hcEVudHJ5LCBuZXcgbWFwNy5jb25zdHJ1Y3RvcigpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkgewogICAgICB2YXIgcmVzdWx0ID0gbmV3IHJlZ2V4cC5jb25zdHJ1Y3RvcihyZWdleHAuc291cmNlLCByZUZsYWdzLmV4ZWMocmVnZXhwKSk7CiAgICAgIHJlc3VsdC5sYXN0SW5kZXggPSByZWdleHAubGFzdEluZGV4OwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gY2xvbmVTZXQoc2V0MywgaXNEZWVwLCBjbG9uZUZ1bmMpIHsKICAgICAgdmFyIGFycmF5ID0gaXNEZWVwID8gY2xvbmVGdW5jKHNldFRvQXJyYXkoc2V0MyksIHRydWUpIDogc2V0VG9BcnJheShzZXQzKTsKICAgICAgcmV0dXJuIGFycmF5UmVkdWNlKGFycmF5LCBhZGRTZXRFbnRyeSwgbmV3IHNldDMuY29uc3RydWN0b3IoKSk7CiAgICB9CiAgICBmdW5jdGlvbiBjbG9uZVN5bWJvbChzeW1ib2wpIHsKICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307CiAgICB9CiAgICBmdW5jdGlvbiBjbG9uZVR5cGVkQXJyYXkodHlwZWRBcnJheSwgaXNEZWVwKSB7CiAgICAgIHZhciBidWZmZXIyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcikgOiB0eXBlZEFycmF5LmJ1ZmZlcjsKICAgICAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlcjIsIHR5cGVkQXJyYXkuYnl0ZU9mZnNldCwgdHlwZWRBcnJheS5sZW5ndGgpOwogICAgfQogICAgZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHsKICAgICAgdmFyIGluZGV4MiA9IC0xLCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoOwogICAgICBhcnJheSB8fCAoYXJyYXkgPSBBcnJheShsZW5ndGgpKTsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbGVuZ3RoKSB7CiAgICAgICAgYXJyYXlbaW5kZXgyXSA9IHNvdXJjZVtpbmRleDJdOwogICAgICB9CiAgICAgIHJldHVybiBhcnJheTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLCBwcm9wcywgb2JqZWN0LCBjdXN0b21pemVyKSB7CiAgICAgIG9iamVjdCB8fCAob2JqZWN0ID0ge30pOwogICAgICB2YXIgaW5kZXgyID0gLTEsIGxlbmd0aCA9IHByb3BzLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIGtleTIgPSBwcm9wc1tpbmRleDJdOwogICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKG9iamVjdFtrZXkyXSwgc291cmNlW2tleTJdLCBrZXkyLCBvYmplY3QsIHNvdXJjZSkgOiB2b2lkIDA7CiAgICAgICAgYXNzaWduVmFsdWUob2JqZWN0LCBrZXkyLCBuZXdWYWx1ZSA9PT0gdm9pZCAwID8gc291cmNlW2tleTJdIDogbmV3VmFsdWUpOwogICAgICB9CiAgICAgIHJldHVybiBvYmplY3Q7CiAgICB9CiAgICBmdW5jdGlvbiBjb3B5U3ltYm9scyhzb3VyY2UsIG9iamVjdCkgewogICAgICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHMoc291cmNlKSwgb2JqZWN0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7CiAgICAgIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXMyLCBnZXRTeW1ib2xzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldE1hcERhdGEobWFwNywga2V5MikgewogICAgICB2YXIgZGF0YSA9IG1hcDcuX19kYXRhX187CiAgICAgIHJldHVybiBpc0tleWFibGUoa2V5MikgPyBkYXRhW3R5cGVvZiBrZXkyID09ICJzdHJpbmciID8gInN0cmluZyIgOiAiaGFzaCJdIDogZGF0YS5tYXA7CiAgICB9CiAgICBmdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkyKSB7CiAgICAgIHZhciB2YWx1ZTIgPSBnZXRWYWx1ZShvYmplY3QsIGtleTIpOwogICAgICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlMikgPyB2YWx1ZTIgOiB2b2lkIDA7CiAgICB9CiAgICB2YXIgZ2V0U3ltYm9scyA9IG5hdGl2ZUdldFN5bWJvbHMgPyBvdmVyQXJnKG5hdGl2ZUdldFN5bWJvbHMsIE9iamVjdCkgOiBzdHViQXJyYXk7CiAgICB2YXIgZ2V0VGFnID0gYmFzZUdldFRhZzsKICAgIGlmIChEYXRhVmlldzIgJiYgZ2V0VGFnKG5ldyBEYXRhVmlldzIobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcgfHwgTWFwMiAmJiBnZXRUYWcobmV3IE1hcDIoKSkgIT0gbWFwVGFnIHx8IFByb21pc2UyICYmIGdldFRhZyhQcm9taXNlMi5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcgfHwgU2V0MiAmJiBnZXRUYWcobmV3IFNldDIoKSkgIT0gc2V0VGFnIHx8IFdlYWtNYXAyICYmIGdldFRhZyhuZXcgV2Vha01hcDIoKSkgIT0gd2Vha01hcFRhZykgewogICAgICBnZXRUYWcgPSBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgICB2YXIgcmVzdWx0ID0gb2JqZWN0VG9TdHJpbmcyLmNhbGwodmFsdWUyKSwgQ3RvciA9IHJlc3VsdCA9PSBvYmplY3RUYWcgPyB2YWx1ZTIuY29uc3RydWN0b3IgOiB2b2lkIDAsIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiB2b2lkIDA7CiAgICAgICAgaWYgKGN0b3JTdHJpbmcpIHsKICAgICAgICAgIHN3aXRjaCAoY3RvclN0cmluZykgewogICAgICAgICAgICBjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzoKICAgICAgICAgICAgICByZXR1cm4gZGF0YVZpZXdUYWc7CiAgICAgICAgICAgIGNhc2UgbWFwQ3RvclN0cmluZzoKICAgICAgICAgICAgICByZXR1cm4gbWFwVGFnOwogICAgICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOgogICAgICAgICAgICAgIHJldHVybiBwcm9taXNlVGFnOwogICAgICAgICAgICBjYXNlIHNldEN0b3JTdHJpbmc6CiAgICAgICAgICAgICAgcmV0dXJuIHNldFRhZzsKICAgICAgICAgICAgY2FzZSB3ZWFrTWFwQ3RvclN0cmluZzoKICAgICAgICAgICAgICByZXR1cm4gd2Vha01hcFRhZzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7CiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsIHJlc3VsdCA9IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7CiAgICAgIGlmIChsZW5ndGggJiYgdHlwZW9mIGFycmF5WzBdID09ICJzdHJpbmciICYmIGhhc093blByb3BlcnR5My5jYWxsKGFycmF5LCAiaW5kZXgiKSkgewogICAgICAgIHJlc3VsdC5pbmRleCA9IGFycmF5LmluZGV4OwogICAgICAgIHJlc3VsdC5pbnB1dCA9IGFycmF5LmlucHV0OwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qob2JqZWN0KSB7CiAgICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0LmNvbnN0cnVjdG9yID09ICJmdW5jdGlvbiIgJiYgIWlzUHJvdG90eXBlKG9iamVjdCkgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKSA6IHt9OwogICAgfQogICAgZnVuY3Rpb24gaW5pdENsb25lQnlUYWcob2JqZWN0LCB0YWcsIGNsb25lRnVuYywgaXNEZWVwKSB7CiAgICAgIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yOwogICAgICBzd2l0Y2ggKHRhZykgewogICAgICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6CiAgICAgICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpOwogICAgICAgIGNhc2UgYm9vbFRhZzoKICAgICAgICBjYXNlIGRhdGVUYWc6CiAgICAgICAgICByZXR1cm4gbmV3IEN0b3IoK29iamVjdCk7CiAgICAgICAgY2FzZSBkYXRhVmlld1RhZzoKICAgICAgICAgIHJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCwgaXNEZWVwKTsKICAgICAgICBjYXNlIGZsb2F0MzJUYWc6CiAgICAgICAgY2FzZSBmbG9hdDY0VGFnOgogICAgICAgIGNhc2UgaW50OFRhZzoKICAgICAgICBjYXNlIGludDE2VGFnOgogICAgICAgIGNhc2UgaW50MzJUYWc6CiAgICAgICAgY2FzZSB1aW50OFRhZzoKICAgICAgICBjYXNlIHVpbnQ4Q2xhbXBlZFRhZzoKICAgICAgICBjYXNlIHVpbnQxNlRhZzoKICAgICAgICBjYXNlIHVpbnQzMlRhZzoKICAgICAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApOwogICAgICAgIGNhc2UgbWFwVGFnOgogICAgICAgICAgcmV0dXJuIGNsb25lTWFwKG9iamVjdCwgaXNEZWVwLCBjbG9uZUZ1bmMpOwogICAgICAgIGNhc2UgbnVtYmVyVGFnOgogICAgICAgIGNhc2Ugc3RyaW5nVGFnOgogICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7CiAgICAgICAgY2FzZSByZWdleHBUYWc6CiAgICAgICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTsKICAgICAgICBjYXNlIHNldFRhZzoKICAgICAgICAgIHJldHVybiBjbG9uZVNldChvYmplY3QsIGlzRGVlcCwgY2xvbmVGdW5jKTsKICAgICAgICBjYXNlIHN5bWJvbFRhZzoKICAgICAgICAgIHJldHVybiBjbG9uZVN5bWJvbChvYmplY3QpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBpc0luZGV4KHZhbHVlMiwgbGVuZ3RoKSB7CiAgICAgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDsKICAgICAgcmV0dXJuICEhbGVuZ3RoICYmICh0eXBlb2YgdmFsdWUyID09ICJudW1iZXIiIHx8IHJlSXNVaW50LnRlc3QodmFsdWUyKSkgJiYgKHZhbHVlMiA+IC0xICYmIHZhbHVlMiAlIDEgPT0gMCAmJiB2YWx1ZTIgPCBsZW5ndGgpOwogICAgfQogICAgZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlMikgewogICAgICB2YXIgdHlwZTUgPSB0eXBlb2YgdmFsdWUyOwogICAgICByZXR1cm4gdHlwZTUgPT0gInN0cmluZyIgfHwgdHlwZTUgPT0gIm51bWJlciIgfHwgdHlwZTUgPT0gInN5bWJvbCIgfHwgdHlwZTUgPT0gImJvb2xlYW4iID8gdmFsdWUyICE9PSAiX19wcm90b19fIiA6IHZhbHVlMiA9PT0gbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHsKICAgICAgcmV0dXJuICEhbWFza1NyY0tleSAmJiBtYXNrU3JjS2V5IGluIGZ1bmM7CiAgICB9CiAgICBmdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZTIpIHsKICAgICAgdmFyIEN0b3IgPSB2YWx1ZTIgJiYgdmFsdWUyLmNvbnN0cnVjdG9yLCBwcm90byA9IHR5cGVvZiBDdG9yID09ICJmdW5jdGlvbiIgJiYgQ3Rvci5wcm90b3R5cGUgfHwgb2JqZWN0UHJvdG87CiAgICAgIHJldHVybiB2YWx1ZTIgPT09IHByb3RvOwogICAgfQogICAgZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykgewogICAgICBpZiAoZnVuYyAhPSBudWxsKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTsKICAgICAgICB9IGNhdGNoIChlMTEpIHsKICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJldHVybiBmdW5jICsgIiI7CiAgICAgICAgfSBjYXRjaCAoZTExKSB7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGZ1bmN0aW9uIGNsb25lRGVlcCh2YWx1ZTIpIHsKICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZTIsIHRydWUsIHRydWUpOwogICAgfQogICAgZnVuY3Rpb24gZXEodmFsdWUyLCBvdGhlcikgewogICAgICByZXR1cm4gdmFsdWUyID09PSBvdGhlciB8fCB2YWx1ZTIgIT09IHZhbHVlMiAmJiBvdGhlciAhPT0gb3RoZXI7CiAgICB9CiAgICBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZTIpIHsKICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlMikgJiYgaGFzT3duUHJvcGVydHkzLmNhbGwodmFsdWUyLCAiY2FsbGVlIikgJiYgKCFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlMiwgImNhbGxlZSIpIHx8IG9iamVjdFRvU3RyaW5nMi5jYWxsKHZhbHVlMikgPT0gYXJnc1RhZyk7CiAgICB9CiAgICB2YXIgaXNBcnJheTMgPSBBcnJheS5pc0FycmF5OwogICAgZnVuY3Rpb24gaXNBcnJheUxpa2UyKHZhbHVlMikgewogICAgICByZXR1cm4gdmFsdWUyICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUyLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24yKHZhbHVlMik7CiAgICB9CiAgICBmdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZTIpIHsKICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZTIpICYmIGlzQXJyYXlMaWtlMih2YWx1ZTIpOwogICAgfQogICAgdmFyIGlzQnVmZmVyID0gbmF0aXZlSXNCdWZmZXIgfHwgc3R1YkZhbHNlOwogICAgZnVuY3Rpb24gaXNGdW5jdGlvbjIodmFsdWUyKSB7CiAgICAgIHZhciB0YWcgPSBpc09iamVjdDModmFsdWUyKSA/IG9iamVjdFRvU3RyaW5nMi5jYWxsKHZhbHVlMikgOiAiIjsKICAgICAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWc7CiAgICB9CiAgICBmdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZTIpIHsKICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZTIgPT0gIm51bWJlciIgJiYgdmFsdWUyID4gLTEgJiYgdmFsdWUyICUgMSA9PSAwICYmIHZhbHVlMiA8PSBNQVhfU0FGRV9JTlRFR0VSOwogICAgfQogICAgZnVuY3Rpb24gaXNPYmplY3QzKHZhbHVlMikgewogICAgICB2YXIgdHlwZTUgPSB0eXBlb2YgdmFsdWUyOwogICAgICByZXR1cm4gISF2YWx1ZTIgJiYgKHR5cGU1ID09ICJvYmplY3QiIHx8IHR5cGU1ID09ICJmdW5jdGlvbiIpOwogICAgfQogICAgZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlMikgewogICAgICByZXR1cm4gISF2YWx1ZTIgJiYgdHlwZW9mIHZhbHVlMiA9PSAib2JqZWN0IjsKICAgIH0KICAgIGZ1bmN0aW9uIGtleXMyKG9iamVjdCkgewogICAgICByZXR1cm4gaXNBcnJheUxpa2UyKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpOwogICAgfQogICAgZnVuY3Rpb24gc3R1YkFycmF5KCkgewogICAgICByZXR1cm4gW107CiAgICB9CiAgICBmdW5jdGlvbiBzdHViRmFsc2UoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIG1vZHVsZS5leHBvcnRzID0gY2xvbmVEZWVwOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnlAMi4xLjAvbm9kZV9tb2R1bGVzL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5L2luZGV4LmpzCnZhciByZXF1aXJlX2Zhc3RfanNvbl9zdGFibGVfc3RyaW5naWZ5ID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeUAyLjEuMC9ub2RlX21vZHVsZXMvZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkvaW5kZXguanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkYXRhLCBvcHRzKSB7CiAgICAgIGlmICghb3B0cykgb3B0cyA9IHt9OwogICAgICBpZiAodHlwZW9mIG9wdHMgPT09ICJmdW5jdGlvbiIpIG9wdHMgPSB7IGNtcDogb3B0cyB9OwogICAgICB2YXIgY3ljbGVzID0gdHlwZW9mIG9wdHMuY3ljbGVzID09PSAiYm9vbGVhbiIgPyBvcHRzLmN5Y2xlcyA6IGZhbHNlOwogICAgICB2YXIgY21wID0gb3B0cy5jbXAgJiYgLyogQF9fUFVSRV9fICovIChmdW5jdGlvbihmNykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihub2RlMikgewogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGE1LCBiNSkgewogICAgICAgICAgICB2YXIgYW9iaiA9IHsga2V5OiBhNSwgdmFsdWU6IG5vZGUyW2E1XSB9OwogICAgICAgICAgICB2YXIgYm9iaiA9IHsga2V5OiBiNSwgdmFsdWU6IG5vZGUyW2I1XSB9OwogICAgICAgICAgICByZXR1cm4gZjcoYW9iaiwgYm9iaik7CiAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgIH0pKG9wdHMuY21wKTsKICAgICAgdmFyIHNlZW4gPSBbXTsKICAgICAgcmV0dXJuIChmdW5jdGlvbiBzdHJpbmdpZnk1KG5vZGUyKSB7CiAgICAgICAgaWYgKG5vZGUyICYmIG5vZGUyLnRvSlNPTiAmJiB0eXBlb2Ygbm9kZTIudG9KU09OID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICBub2RlMiA9IG5vZGUyLnRvSlNPTigpOwogICAgICAgIH0KICAgICAgICBpZiAobm9kZTIgPT09IHZvaWQgMCkgcmV0dXJuOwogICAgICAgIGlmICh0eXBlb2Ygbm9kZTIgPT0gIm51bWJlciIpIHJldHVybiBpc0Zpbml0ZShub2RlMikgPyAiIiArIG5vZGUyIDogIm51bGwiOwogICAgICAgIGlmICh0eXBlb2Ygbm9kZTIgIT09ICJvYmplY3QiKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkobm9kZTIpOwogICAgICAgIHZhciBpMTEsIG91dDsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlMikpIHsKICAgICAgICAgIG91dCA9ICJbIjsKICAgICAgICAgIGZvciAoaTExID0gMDsgaTExIDwgbm9kZTIubGVuZ3RoOyBpMTErKykgewogICAgICAgICAgICBpZiAoaTExKSBvdXQgKz0gIiwiOwogICAgICAgICAgICBvdXQgKz0gc3RyaW5naWZ5NShub2RlMltpMTFdKSB8fCAibnVsbCI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gb3V0ICsgIl0iOwogICAgICAgIH0KICAgICAgICBpZiAobm9kZTIgPT09IG51bGwpIHJldHVybiAibnVsbCI7CiAgICAgICAgaWYgKHNlZW4uaW5kZXhPZihub2RlMikgIT09IC0xKSB7CiAgICAgICAgICBpZiAoY3ljbGVzKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkoIl9fY3ljbGVfXyIpOwogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSlNPTiIpOwogICAgICAgIH0KICAgICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5wdXNoKG5vZGUyKSAtIDE7CiAgICAgICAgdmFyIGtleXMyID0gT2JqZWN0LmtleXMobm9kZTIpLnNvcnQoY21wICYmIGNtcChub2RlMikpOwogICAgICAgIG91dCA9ICIiOwogICAgICAgIGZvciAoaTExID0gMDsgaTExIDwga2V5czIubGVuZ3RoOyBpMTErKykgewogICAgICAgICAgdmFyIGtleTIgPSBrZXlzMltpMTFdOwogICAgICAgICAgdmFyIHZhbHVlMiA9IHN0cmluZ2lmeTUobm9kZTJba2V5Ml0pOwogICAgICAgICAgaWYgKCF2YWx1ZTIpIGNvbnRpbnVlOwogICAgICAgICAgaWYgKG91dCkgb3V0ICs9ICIsIjsKICAgICAgICAgIG91dCArPSBKU09OLnN0cmluZ2lmeShrZXkyKSArICI6IiArIHZhbHVlMjsKICAgICAgICB9CiAgICAgICAgc2Vlbi5zcGxpY2Uoc2VlbkluZGV4LCAxKTsKICAgICAgICByZXR1cm4gInsiICsgb3V0ICsgIn0iOwogICAgICB9KShkYXRhKTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGpzb25ANS4yLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0anNvbi9kaXN0X3RzL3NtYXJ0anNvbi5wbHVnaW5zLmpzCnZhciBpbXBvcnRfbG9kYXNoLCBpbXBvcnRfZmFzdF9qc29uX3N0YWJsZV9zdHJpbmdpZnksIHN0YWJsZUpzb247CnZhciBpbml0X3NtYXJ0anNvbl9wbHVnaW5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRqc29uQDUuMi4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGpzb24vZGlzdF90cy9zbWFydGpzb24ucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMxMCgpOwogICAgaW5pdF9kaXN0X3RzMTEoKTsKICAgIGltcG9ydF9sb2Rhc2ggPSBfX3RvRVNNKHJlcXVpcmVfbG9kYXNoKCksIDEpOwogICAgaW1wb3J0X2Zhc3RfanNvbl9zdGFibGVfc3RyaW5naWZ5ID0gX190b0VTTShyZXF1aXJlX2Zhc3RfanNvbl9zdGFibGVfc3RyaW5naWZ5KCksIDEpOwogICAgc3RhYmxlSnNvbiA9IGltcG9ydF9mYXN0X2pzb25fc3RhYmxlX3N0cmluZ2lmeS5kZWZhdWx0OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRqc29uQDUuMi4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGpzb24vZGlzdF90cy9idWZmZXJoYW5kbGluZy5qcwpmdW5jdGlvbiBiYXNlNjRFbmNvZGUoZGF0YSkgewogIGlmICh0eXBlb2YgQnVmZmVyICE9PSAidW5kZWZpbmVkIikgewogICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRhdGEpLnRvU3RyaW5nKCJiYXNlNjQiKTsKICB9CiAgcmV0dXJuIGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5kYXRhKSk7Cn0KZnVuY3Rpb24gYmFzZTY0RGVjb2RlKHN0cikgewogIGlmICh0eXBlb2YgQnVmZmVyICE9PSAidW5kZWZpbmVkIikgewogICAgY29uc3QgYnVmID0gQnVmZmVyLmZyb20oc3RyLCAiYmFzZTY0Iik7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ1ZmZlciwgYnVmLmJ5dGVPZmZzZXQsIGJ1Zi5ieXRlTGVuZ3RoKTsKICB9CiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEFycmF5LmZyb20oYXRvYihzdHIpKS5tYXAoKGNoYXIpID0+IGNoYXIuY2hhckNvZGVBdCgwKSkpOwp9CmZ1bmN0aW9uIHN0cmluZ2lmeSh2YWx1ZTIsIHNwYWNlMikgewogIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZTIsIHJlcGxhY2VyLCBzcGFjZTIpOwp9CmZ1bmN0aW9uIHBhcnNlMih0ZXh0OSkgewogIHJldHVybiBKU09OLnBhcnNlKHRleHQ5LCByZXZpdmVyKTsKfQpmdW5jdGlvbiBpc0VuY29kZWRCdWZmZXIoeDMpIHsKICByZXR1cm4gaXNPYmplY3QoeDMpICYmIHgzLnR5cGUgPT09ICJFbmNvZGVkQnVmZmVyIiAmJiBpc1N0cmluZyh4My5kYXRhKTsKfQpmdW5jdGlvbiBpc0J1ZmZlckxpa2UyKHgzKSB7CiAgcmV0dXJuIGlzT2JqZWN0KHgzKSAmJiAoeDMudHlwZSA9PT0gIkJ1ZmZlciIgJiYgKGlzQXJyYXkyKHgzLmRhdGEpIHx8IGlzU3RyaW5nKHgzLmRhdGEpKSkgfHwgeDMgaW5zdGFuY2VvZiBVaW50OEFycmF5Owp9CmZ1bmN0aW9uIGlzQXJyYXkyKHgzKSB7CiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoeDMpOwp9CmZ1bmN0aW9uIGlzU3RyaW5nKHgzKSB7CiAgcmV0dXJuIHR5cGVvZiB4MyA9PT0gInN0cmluZyI7Cn0KZnVuY3Rpb24gaXNPYmplY3QoeDMpIHsKICByZXR1cm4gdHlwZW9mIHgzID09PSAib2JqZWN0IiAmJiB4MyAhPT0gbnVsbDsKfQp2YXIgcmVwbGFjZXIsIHJldml2ZXI7CnZhciBpbml0X2J1ZmZlcmhhbmRsaW5nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRqc29uQDUuMi4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGpzb24vZGlzdF90cy9idWZmZXJoYW5kbGluZy5qcyIoKSB7CiAgICBpbml0X3NtYXJ0anNvbl9wbHVnaW5zKCk7CiAgICByZXBsYWNlciA9IChrZXkyLCB2YWx1ZTIpID0+IHsKICAgICAgaWYgKGlzQnVmZmVyTGlrZTIodmFsdWUyKSkgewogICAgICAgIGxldCBidWZmZXJEYXRhOwogICAgICAgIGlmICgiZGF0YSIgaW4gdmFsdWUyICYmIGlzQXJyYXkyKHZhbHVlMi5kYXRhKSkgewogICAgICAgICAgYnVmZmVyRGF0YSA9IG5ldyBVaW50OEFycmF5KHZhbHVlMi5kYXRhKTsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlMiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKICAgICAgICAgIGJ1ZmZlckRhdGEgPSB2YWx1ZTI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGJhc2U2NERhdGEgPSAiYmFzZTY0OiIgKyBiYXNlNjRFbmNvZGUoYnVmZmVyRGF0YSk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6ICJFbmNvZGVkQnVmZmVyIiwKICAgICAgICAgIGRhdGE6IGJhc2U2NERhdGEKICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiB2YWx1ZTI7CiAgICB9OwogICAgcmV2aXZlciA9IChrZXkyLCB2YWx1ZTIpID0+IHsKICAgICAgaWYgKGlzRW5jb2RlZEJ1ZmZlcih2YWx1ZTIpKSB7CiAgICAgICAgaWYgKGlzU3RyaW5nKHZhbHVlMi5kYXRhKSAmJiB2YWx1ZTIuZGF0YS5zdGFydHNXaXRoKCJiYXNlNjQ6IikpIHsKICAgICAgICAgIGNvbnN0IGJhc2U2NERhdGEgPSB2YWx1ZTIuZGF0YS5zbGljZSg3KTsKICAgICAgICAgIGNvbnN0IGJ1ZmZlcjIgPSBiYXNlNjREZWNvZGUoYmFzZTY0RGF0YSk7CiAgICAgICAgICByZXR1cm4gYnVmZmVyMjsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlMjsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGpzb25ANS4yLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0anNvbi9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMxMiA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMxMiwgewogIFNtYXJ0anNvbjogKCkgPT4gU21hcnRqc29uLAogIGRlZXBFcXVhbEpzb25MU3RyaW5nczogKCkgPT4gZGVlcEVxdWFsSnNvbkxTdHJpbmdzLAogIGRlZXBFcXVhbE9iamVjdHM6ICgpID0+IGRlZXBFcXVhbE9iamVjdHMsCiAgZm9sZERlYzogKCkgPT4gZm9sZERlYywKICBwYXJzZTogKCkgPT4gcGFyc2UzLAogIHBhcnNlQmFzZTY0OiAoKSA9PiBwYXJzZUJhc2U2NCwKICBwYXJzZUpzb25MOiAoKSA9PiBwYXJzZUpzb25MLAogIHN0YWJsZU9uZVdheVN0cmluZ2lmeTogKCkgPT4gc3RhYmxlT25lV2F5U3RyaW5naWZ5LAogIHN0cmluZ2lmeTogKCkgPT4gc3RyaW5naWZ5MiwKICBzdHJpbmdpZnlCYXNlNjQ6ICgpID0+IHN0cmluZ2lmeUJhc2U2NCwKICBzdHJpbmdpZnlKc29uTDogKCkgPT4gc3RyaW5naWZ5SnNvbkwsCiAgc3RyaW5naWZ5UHJldHR5OiAoKSA9PiBzdHJpbmdpZnlQcmV0dHkKfSk7CnZhciBwYXJzZTMsIHBhcnNlSnNvbkwsIHN0cmluZ2lmeUpzb25MLCBzdGFibGVPbmVXYXlTdHJpbmdpZnksIHN0cmluZ2lmeTIsIHN0cmluZ2lmeVByZXR0eSwgc3RyaW5naWZ5QmFzZTY0LCBwYXJzZUJhc2U2NCwgU21hcnRqc29uLCBmb2xkRGVjLCBkZWVwRXF1YWxPYmplY3RzLCBkZWVwRXF1YWxKc29uTFN0cmluZ3M7CnZhciBpbml0X2Rpc3RfdHMxMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA1LjIuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvaW5kZXguanMiKCkgewogICAgaW5pdF9zbWFydGpzb25fcGx1Z2lucygpOwogICAgaW5pdF9idWZmZXJoYW5kbGluZygpOwogICAgcGFyc2UzID0gcGFyc2UyOwogICAgcGFyc2VKc29uTCA9IChqc29ubERhdGEpID0+IHsKICAgICAgY29uc3QgbGluZXMgPSBqc29ubERhdGEuc3BsaXQoIlxuIik7CiAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSBsaW5lcy5yZWR1Y2UoKGFjYywgbGluZSkgPT4gewogICAgICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTsKICAgICAgICBpZiAodHJpbW1lZC5sZW5ndGggPiAwKSB7CiAgICAgICAgICBhY2MucHVzaChwYXJzZTModHJpbW1lZCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWNjOwogICAgICB9LCBbXSk7CiAgICAgIHJldHVybiBwYXJzZWREYXRhOwogICAgfTsKICAgIHN0cmluZ2lmeUpzb25MID0gKGl0ZW1zKSA9PiB7CiAgICAgIHJldHVybiBpdGVtcy5tYXAoKGl0ZW0pID0+IHN0cmluZ2lmeTIoaXRlbSkpLmpvaW4oIlxuIik7CiAgICB9OwogICAgc3RhYmxlT25lV2F5U3RyaW5naWZ5ID0gKG9iakFyZywgc2ltcGxlT3JkZXJBcnJheSwgb3B0aW9uc0FyZyA9IHt9KSA9PiB7CiAgICAgIGNvbnN0IHZpc2l0ZWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtTZXQoKTsKICAgICAgY29uc3Qgc2FuaXRpemUyID0gKHZhbCkgPT4gewogICAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdHlwZW9mIHZhbCAhPT0gIm9iamVjdCIpIHsKICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlcGxhY2VkID0gcmVwbGFjZXIoIiIsIHZhbCk7CiAgICAgICAgaWYgKHJlcGxhY2VkICYmIHJlcGxhY2VkLnR5cGUgPT09ICJFbmNvZGVkQnVmZmVyIiAmJiB0eXBlb2YgcmVwbGFjZWQuZGF0YSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIHJldHVybiByZXBsYWNlZDsKICAgICAgICB9CiAgICAgICAgaWYgKHZpc2l0ZWQuaGFzKHZhbCkpIHsKICAgICAgICAgIHJldHVybiAiX19jeWNsZV9fIjsKICAgICAgICB9CiAgICAgICAgdmlzaXRlZC5hZGQodmFsKTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7CiAgICAgICAgICByZXR1cm4gdmFsLm1hcCgoaXRlbSkgPT4gc2FuaXRpemUyKGl0ZW0pKTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgb3V0ID0ge307CiAgICAgICAgZm9yIChjb25zdCBrZXkyIG9mIE9iamVjdC5rZXlzKHZhbCkpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIG91dFtrZXkyXSA9IHNhbml0aXplMih2YWxba2V5Ml0pOwogICAgICAgICAgfSBjYXRjaCAoZTExKSB7CiAgICAgICAgICAgIG91dFtrZXkyXSA9ICJfX3Vuc2VyaWFsaXphYmxlX18iOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gb3V0OwogICAgICB9OwogICAgICBjb25zdCBvYmogPSBzYW5pdGl6ZTIob2JqQXJnKTsKICAgICAgY29uc3Qgb3B0aW9ucyA9IHsKICAgICAgICAuLi5vcHRpb25zQXJnLAogICAgICAgIGN5Y2xlczogdHJ1ZQogICAgICB9OwogICAgICBpZiAoc2ltcGxlT3JkZXJBcnJheSAmJiAhb3B0aW9ucy5jbXApIHsKICAgICAgICBjb25zdCBvcmRlcjIgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICAgIHNpbXBsZU9yZGVyQXJyYXkuZm9yRWFjaCgoa2V5MiwgaWR4KSA9PiBvcmRlcjIuc2V0KGtleTIsIGlkeCkpOwogICAgICAgIG9wdGlvbnMuY21wID0gKGE1LCBiNSkgPT4gewogICAgICAgICAgY29uc3QgYUlkeCA9IG9yZGVyMi5oYXMoYTUua2V5KSA/IG9yZGVyMi5nZXQoYTUua2V5KSA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgICAgIGNvbnN0IGJJZHggPSBvcmRlcjIuaGFzKGI1LmtleSkgPyBvcmRlcjIuZ2V0KGI1LmtleSkgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICAgICAgICBpZiAoYUlkeCAhPT0gYklkeCkKICAgICAgICAgICAgcmV0dXJuIGFJZHggLSBiSWR4OwogICAgICAgICAgcmV0dXJuIGE1LmtleSA8IGI1LmtleSA/IC0xIDogYTUua2V5ID4gYjUua2V5ID8gMSA6IDA7CiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gc3RhYmxlSnNvbihvYmosIG9wdGlvbnMpOwogICAgfTsKICAgIHN0cmluZ2lmeTIgPSAob2JqQXJnLCBzaW1wbGVPcmRlckFycmF5LCBvcHRpb25zQXJnID0ge30pID0+IHsKICAgICAgY29uc3QgYnVmZmVyZWRKc29uID0gc3RyaW5naWZ5KG9iakFyZyk7CiAgICAgIG9iakFyZyA9IEpTT04ucGFyc2UoYnVmZmVyZWRKc29uKTsKICAgICAgbGV0IG9wdGlvbnMgPSB7IC4uLm9wdGlvbnNBcmcgfTsKICAgICAgaWYgKHNpbXBsZU9yZGVyQXJyYXkgJiYgIW9wdGlvbnMuY21wKSB7CiAgICAgICAgY29uc3Qgb3JkZXIyID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgICBzaW1wbGVPcmRlckFycmF5LmZvckVhY2goKGtleTIsIGlkeCkgPT4gb3JkZXIyLnNldChrZXkyLCBpZHgpKTsKICAgICAgICBvcHRpb25zLmNtcCA9IChhNSwgYjUpID0+IHsKICAgICAgICAgIGNvbnN0IGFJZHggPSBvcmRlcjIuaGFzKGE1LmtleSkgPyBvcmRlcjIuZ2V0KGE1LmtleSkgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICAgICAgICBjb25zdCBiSWR4ID0gb3JkZXIyLmhhcyhiNS5rZXkpID8gb3JkZXIyLmdldChiNS5rZXkpIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgICAgICAgaWYgKGFJZHggIT09IGJJZHgpCiAgICAgICAgICAgIHJldHVybiBhSWR4IC0gYklkeDsKICAgICAgICAgIHJldHVybiBhNS5rZXkgPCBiNS5rZXkgPyAtMSA6IGE1LmtleSA+IGI1LmtleSA/IDEgOiAwOwogICAgICAgIH07CiAgICAgIH0KICAgICAgbGV0IHJldHVybkpzb24gPSBzdGFibGVKc29uKG9iakFyZywgb3B0aW9ucyk7CiAgICAgIHJldHVybiByZXR1cm5Kc29uOwogICAgfTsKICAgIHN0cmluZ2lmeVByZXR0eSA9IChvYmplY3RBcmcpID0+IHsKICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnkyKG9iamVjdEFyZyk7CiAgICAgIGNvbnN0IG9iamVjdCA9IEpTT04ucGFyc2Uoc3RyaW5naWZpZWQpOwogICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqZWN0LCBudWxsLCAyKTsKICAgIH07CiAgICBzdHJpbmdpZnlCYXNlNjQgPSAoLi4uYXJncykgPT4gewogICAgICBjb25zdCBzdHJpbmdpZmllZFJlc3VsdCA9IHN0cmluZ2lmeTIoLi4uYXJncyk7CiAgICAgIHJldHVybiBkaXN0X3RzX2V4cG9ydHMxMS5iYXNlNjQuZW5jb2RlVXJpKHN0cmluZ2lmaWVkUmVzdWx0KTsKICAgIH07CiAgICBwYXJzZUJhc2U2NCA9IChiYXNlNjRKc29uU3RyaW5nQXJnKSA9PiB7CiAgICAgIGNvbnN0IGJhc2U2NDIgPSBkaXN0X3RzX2V4cG9ydHMxMS5iYXNlNjQ7CiAgICAgIGNvbnN0IGRlY29kZUZuID0gYmFzZTY0Mi5kZWNvZGVVcmkgfHwgYmFzZTY0Mi5kZWNvZGU7CiAgICAgIGNvbnN0IHNpbXBsZVN0cmluZ2lmaWVkID0gZGVjb2RlRm4oYmFzZTY0SnNvblN0cmluZ0FyZyk7CiAgICAgIHJldHVybiBwYXJzZTMoc2ltcGxlU3RyaW5naWZpZWQpOwogICAgfTsKICAgIFNtYXJ0anNvbiA9IGNsYXNzIF9TbWFydGpzb24gewogICAgICAvKioKICAgICAgICogZW5mb2xkcyBkYXRhIGZyb20gYW4gb2JqZWN0CiAgICAgICAqLwogICAgICBzdGF0aWMgZW5mb2xkRnJvbU9iamVjdChvYmplY3RBcmcpIHsKICAgICAgICBjb25zdCBuZXdJbnN0YW5jZSA9IG5ldyB0aGlzKCk7CiAgICAgICAgY29uc3Qgc2F2ZWFibGVzID0gbmV3SW5zdGFuY2Uuc2F2ZWFibGVQcm9wZXJ0aWVzIHx8IFtdOwogICAgICAgIGZvciAoY29uc3Qga2V5TmFtZSBpbiBvYmplY3RBcmcpIHsKICAgICAgICAgIGlmIChzYXZlYWJsZXMuaW5kZXhPZihrZXlOYW1lKSAhPT0gLTEpIHsKICAgICAgICAgICAgbmV3SW5zdGFuY2Vba2V5TmFtZV0gPSBvYmplY3RBcmdba2V5TmFtZV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdJbnN0YW5jZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogZW5mb2xkIGZyb20ganNvbgogICAgICAgKi8KICAgICAgc3RhdGljIGVuZm9sZEZyb21Kc29uKGpzb25BcmcpIHsKICAgICAgICBjb25zdCBvYmplY3RGcm9tSnNvbiA9IHBhcnNlMyhqc29uQXJnKTsKICAgICAgICByZXR1cm4gdGhpcy5lbmZvbGRGcm9tT2JqZWN0KG9iamVjdEZyb21Kc29uKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogZm9sZHMgYSBjbGFzcyBpbnRvIGFuIG9iamVjdAogICAgICAgKi8KICAgICAgZm9sZFRvT2JqZWN0KCkgewogICAgICAgIGNvbnN0IHRyYWNrU2V0ID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgICAgICB0cmFja1NldC5hZGQodGhpcyk7CiAgICAgICAgcmV0dXJuIHRoaXMuZm9sZFRvT2JqZWN0SW50ZXJuYWwodHJhY2tTZXQpOwogICAgICB9CiAgICAgIGZvbGRUb09iamVjdEludGVybmFsKHRyYWNrU2V0KSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307CiAgICAgICAgY29uc3QgZm9sZFZhbHVlID0gKHZhbCkgPT4gewogICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIF9TbWFydGpzb24pIHsKICAgICAgICAgICAgaWYgKHRyYWNrU2V0Lmhhcyh2YWwpKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJjeWNsZSBkZXRlY3RlZCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyYWNrU2V0LmFkZCh2YWwpOwogICAgICAgICAgICByZXR1cm4gdmFsLmZvbGRUb09iamVjdEludGVybmFsKHRyYWNrU2V0KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAoKGl0ZW0pID0+IGZvbGRWYWx1ZShpdGVtKSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gaW1wb3J0X2xvZGFzaC5kZWZhdWx0KHZhbCk7CiAgICAgICAgfTsKICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuc2F2ZWFibGVQcm9wZXJ0aWVzIHx8IFtdOwogICAgICAgIGZvciAoY29uc3Qga2V5TmFtZSBvZiBwcm9wcykgewogICAgICAgICAgY29uc3QgdmFsdWUyID0gdGhpc1trZXlOYW1lXTsKICAgICAgICAgIHJlc3VsdFtrZXlOYW1lXSA9IGZvbGRWYWx1ZSh2YWx1ZTIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBmb2xkcyBhIGNsYXNzIGludG8gYW4gb2JqZWN0CiAgICAgICAqLwogICAgICBmb2xkVG9Kc29uKCkgewogICAgICAgIGNvbnN0IGZvbGRlZE9iamVjdCA9IHRoaXMuZm9sZFRvT2JqZWN0KCk7CiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeTIoZm9sZGVkT2JqZWN0KTsKICAgICAgfQogICAgfTsKICAgIGZvbGREZWMgPSAoKSA9PiB7CiAgICAgIHJldHVybiAodGFyZ2V0LCBrZXkyKSA9PiB7CiAgICAgICAgaWYgKCF0YXJnZXQuc2F2ZWFibGVQcm9wZXJ0aWVzKSB7CiAgICAgICAgICB0YXJnZXQuc2F2ZWFibGVQcm9wZXJ0aWVzID0gW107CiAgICAgICAgfQogICAgICAgIHRhcmdldC5zYXZlYWJsZVByb3BlcnRpZXMucHVzaChrZXkyKTsKICAgICAgfTsKICAgIH07CiAgICBkZWVwRXF1YWxPYmplY3RzID0gKG9iamVjdDEsIG9iamVjdDIpID0+IHsKICAgICAgY29uc3Qgb2JqZWN0MVN0cmluZyA9IHN0cmluZ2lmeTIob2JqZWN0MSk7CiAgICAgIGNvbnN0IG9iamVjdDJTdHJpbmcgPSBzdHJpbmdpZnkyKG9iamVjdDIpOwogICAgICByZXR1cm4gb2JqZWN0MVN0cmluZyA9PT0gb2JqZWN0MlN0cmluZzsKICAgIH07CiAgICBkZWVwRXF1YWxKc29uTFN0cmluZ3MgPSAoanNvbkxTdHJpbmcxLCBqc29uTFN0cmluZzIpID0+IHsKICAgICAgY29uc3QgZmlyc3RBcnJheSA9IHBhcnNlSnNvbkwoanNvbkxTdHJpbmcxKTsKICAgICAgY29uc3Qgc2Vjb25kQXJyYXkgPSBwYXJzZUpzb25MKGpzb25MU3RyaW5nMik7CiAgICAgIHJldHVybiBkZWVwRXF1YWxPYmplY3RzKGZpcnN0QXJyYXksIHNlY29uZEFycmF5KTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCtpZGJAOC4wLjMvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L2lkYi9idWlsZC9pbmRleC5qcwp2YXIgYnVpbGRfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChidWlsZF9leHBvcnRzLCB7CiAgZGVsZXRlREI6ICgpID0+IGRlbGV0ZURCLAogIG9wZW5EQjogKCkgPT4gb3BlbkRCLAogIHVud3JhcDogKCkgPT4gdW53cmFwLAogIHdyYXA6ICgpID0+IHdyYXAKfSk7CmZ1bmN0aW9uIGdldElkYlByb3h5YWJsZVR5cGVzKCkgewogIHJldHVybiBpZGJQcm94eWFibGVUeXBlcyB8fCAoaWRiUHJveHlhYmxlVHlwZXMgPSBbCiAgICBJREJEYXRhYmFzZSwKICAgIElEQk9iamVjdFN0b3JlLAogICAgSURCSW5kZXgsCiAgICBJREJDdXJzb3IsCiAgICBJREJUcmFuc2FjdGlvbgogIF0pOwp9CmZ1bmN0aW9uIGdldEN1cnNvckFkdmFuY2VNZXRob2RzKCkgewogIHJldHVybiBjdXJzb3JBZHZhbmNlTWV0aG9kcyB8fCAoY3Vyc29yQWR2YW5jZU1ldGhvZHMgPSBbCiAgICBJREJDdXJzb3IucHJvdG90eXBlLmFkdmFuY2UsCiAgICBJREJDdXJzb3IucHJvdG90eXBlLmNvbnRpbnVlLAogICAgSURCQ3Vyc29yLnByb3RvdHlwZS5jb250aW51ZVByaW1hcnlLZXkKICBdKTsKfQpmdW5jdGlvbiBwcm9taXNpZnlSZXF1ZXN0KHJlcXVlc3QpIHsKICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgIGNvbnN0IHVubGlzdGVuID0gKCkgPT4gewogICAgICByZXF1ZXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInN1Y2Nlc3MiLCBzdWNjZXNzKTsKICAgICAgcmVxdWVzdC5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsIGVycm9yKTsKICAgIH07CiAgICBjb25zdCBzdWNjZXNzID0gKCkgPT4gewogICAgICByZXNvbHZlMih3cmFwKHJlcXVlc3QucmVzdWx0KSk7CiAgICAgIHVubGlzdGVuKCk7CiAgICB9OwogICAgY29uc3QgZXJyb3IgPSAoKSA9PiB7CiAgICAgIHJlamVjdChyZXF1ZXN0LmVycm9yKTsKICAgICAgdW5saXN0ZW4oKTsKICAgIH07CiAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoInN1Y2Nlc3MiLCBzdWNjZXNzKTsKICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBlcnJvcik7CiAgfSk7CiAgcmV2ZXJzZVRyYW5zZm9ybUNhY2hlLnNldChwcm9taXNlLCByZXF1ZXN0KTsKICByZXR1cm4gcHJvbWlzZTsKfQpmdW5jdGlvbiBjYWNoZURvbmVQcm9taXNlRm9yVHJhbnNhY3Rpb24odHgpIHsKICBpZiAodHJhbnNhY3Rpb25Eb25lTWFwLmhhcyh0eCkpCiAgICByZXR1cm47CiAgY29uc3QgZG9uZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0KSA9PiB7CiAgICBjb25zdCB1bmxpc3RlbiA9ICgpID0+IHsKICAgICAgdHgucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLCBjb21wbGV0ZSk7CiAgICAgIHR4LnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIiwgZXJyb3IpOwogICAgICB0eC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsIGVycm9yKTsKICAgIH07CiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHsKICAgICAgcmVzb2x2ZTIoKTsKICAgICAgdW5saXN0ZW4oKTsKICAgIH07CiAgICBjb25zdCBlcnJvciA9ICgpID0+IHsKICAgICAgcmVqZWN0KHR4LmVycm9yIHx8IG5ldyBET01FeGNlcHRpb24oIkFib3J0RXJyb3IiLCAiQWJvcnRFcnJvciIpKTsKICAgICAgdW5saXN0ZW4oKTsKICAgIH07CiAgICB0eC5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsIGNvbXBsZXRlKTsKICAgIHR4LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwgZXJyb3IpOwogICAgdHguYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCBlcnJvcik7CiAgfSk7CiAgdHJhbnNhY3Rpb25Eb25lTWFwLnNldCh0eCwgZG9uZSk7Cn0KZnVuY3Rpb24gcmVwbGFjZVRyYXBzKGNhbGxiYWNrKSB7CiAgaWRiUHJveHlUcmFwcyA9IGNhbGxiYWNrKGlkYlByb3h5VHJhcHMpOwp9CmZ1bmN0aW9uIHdyYXBGdW5jdGlvbihmdW5jKSB7CiAgaWYgKGdldEN1cnNvckFkdmFuY2VNZXRob2RzKCkuaW5jbHVkZXMoZnVuYykpIHsKICAgIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7CiAgICAgIGZ1bmMuYXBwbHkodW53cmFwKHRoaXMpLCBhcmdzKTsKICAgICAgcmV0dXJuIHdyYXAodGhpcy5yZXF1ZXN0KTsKICAgIH07CiAgfQogIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7CiAgICByZXR1cm4gd3JhcChmdW5jLmFwcGx5KHVud3JhcCh0aGlzKSwgYXJncykpOwogIH07Cn0KZnVuY3Rpb24gdHJhbnNmb3JtQ2FjaGFibGVWYWx1ZSh2YWx1ZTIpIHsKICBpZiAodHlwZW9mIHZhbHVlMiA9PT0gImZ1bmN0aW9uIikKICAgIHJldHVybiB3cmFwRnVuY3Rpb24odmFsdWUyKTsKICBpZiAodmFsdWUyIGluc3RhbmNlb2YgSURCVHJhbnNhY3Rpb24pCiAgICBjYWNoZURvbmVQcm9taXNlRm9yVHJhbnNhY3Rpb24odmFsdWUyKTsKICBpZiAoaW5zdGFuY2VPZkFueSh2YWx1ZTIsIGdldElkYlByb3h5YWJsZVR5cGVzKCkpKQogICAgcmV0dXJuIG5ldyBQcm94eSh2YWx1ZTIsIGlkYlByb3h5VHJhcHMpOwogIHJldHVybiB2YWx1ZTI7Cn0KZnVuY3Rpb24gd3JhcCh2YWx1ZTIpIHsKICBpZiAodmFsdWUyIGluc3RhbmNlb2YgSURCUmVxdWVzdCkKICAgIHJldHVybiBwcm9taXNpZnlSZXF1ZXN0KHZhbHVlMik7CiAgaWYgKHRyYW5zZm9ybUNhY2hlLmhhcyh2YWx1ZTIpKQogICAgcmV0dXJuIHRyYW5zZm9ybUNhY2hlLmdldCh2YWx1ZTIpOwogIGNvbnN0IG5ld1ZhbHVlID0gdHJhbnNmb3JtQ2FjaGFibGVWYWx1ZSh2YWx1ZTIpOwogIGlmIChuZXdWYWx1ZSAhPT0gdmFsdWUyKSB7CiAgICB0cmFuc2Zvcm1DYWNoZS5zZXQodmFsdWUyLCBuZXdWYWx1ZSk7CiAgICByZXZlcnNlVHJhbnNmb3JtQ2FjaGUuc2V0KG5ld1ZhbHVlLCB2YWx1ZTIpOwogIH0KICByZXR1cm4gbmV3VmFsdWU7Cn0KZnVuY3Rpb24gb3BlbkRCKG5hbWUsIHZlcnNpb24yLCB7IGJsb2NrZWQsIHVwZ3JhZGUsIGJsb2NraW5nLCB0ZXJtaW5hdGVkIH0gPSB7fSkgewogIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihuYW1lLCB2ZXJzaW9uMik7CiAgY29uc3Qgb3BlblByb21pc2UgPSB3cmFwKHJlcXVlc3QpOwogIGlmICh1cGdyYWRlKSB7CiAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoInVwZ3JhZGVuZWVkZWQiLCAoZXZlbnQpID0+IHsKICAgICAgdXBncmFkZSh3cmFwKHJlcXVlc3QucmVzdWx0KSwgZXZlbnQub2xkVmVyc2lvbiwgZXZlbnQubmV3VmVyc2lvbiwgd3JhcChyZXF1ZXN0LnRyYW5zYWN0aW9uKSwgZXZlbnQpOwogICAgfSk7CiAgfQogIGlmIChibG9ja2VkKSB7CiAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoImJsb2NrZWQiLCAoZXZlbnQpID0+IGJsb2NrZWQoCiAgICAgIC8vIENhc3RpbmcgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC1ET00tbGliLWdlbmVyYXRvci9wdWxsLzE0MDUKICAgICAgZXZlbnQub2xkVmVyc2lvbiwKICAgICAgZXZlbnQubmV3VmVyc2lvbiwKICAgICAgZXZlbnQKICAgICkpOwogIH0KICBvcGVuUHJvbWlzZS50aGVuKChkYikgPT4gewogICAgaWYgKHRlcm1pbmF0ZWQpCiAgICAgIGRiLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwgKCkgPT4gdGVybWluYXRlZCgpKTsKICAgIGlmIChibG9ja2luZykgewogICAgICBkYi5hZGRFdmVudExpc3RlbmVyKCJ2ZXJzaW9uY2hhbmdlIiwgKGV2ZW50KSA9PiBibG9ja2luZyhldmVudC5vbGRWZXJzaW9uLCBldmVudC5uZXdWZXJzaW9uLCBldmVudCkpOwogICAgfQogIH0pLmNhdGNoKCgpID0+IHsKICB9KTsKICByZXR1cm4gb3BlblByb21pc2U7Cn0KZnVuY3Rpb24gZGVsZXRlREIobmFtZSwgeyBibG9ja2VkIH0gPSB7fSkgewogIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIuZGVsZXRlRGF0YWJhc2UobmFtZSk7CiAgaWYgKGJsb2NrZWQpIHsKICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigiYmxvY2tlZCIsIChldmVudCkgPT4gYmxvY2tlZCgKICAgICAgLy8gQ2FzdGluZyBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0LURPTS1saWItZ2VuZXJhdG9yL3B1bGwvMTQwNQogICAgICBldmVudC5vbGRWZXJzaW9uLAogICAgICBldmVudAogICAgKSk7CiAgfQogIHJldHVybiB3cmFwKHJlcXVlc3QpLnRoZW4oKCkgPT4gdm9pZCAwKTsKfQpmdW5jdGlvbiBnZXRNZXRob2QodGFyZ2V0LCBwcm9wKSB7CiAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSURCRGF0YWJhc2UgJiYgIShwcm9wIGluIHRhcmdldCkgJiYgdHlwZW9mIHByb3AgPT09ICJzdHJpbmciKSkgewogICAgcmV0dXJuOwogIH0KICBpZiAoY2FjaGVkTWV0aG9kcy5nZXQocHJvcCkpCiAgICByZXR1cm4gY2FjaGVkTWV0aG9kcy5nZXQocHJvcCk7CiAgY29uc3QgdGFyZ2V0RnVuY05hbWUgPSBwcm9wLnJlcGxhY2UoL0Zyb21JbmRleCQvLCAiIik7CiAgY29uc3QgdXNlSW5kZXggPSBwcm9wICE9PSB0YXJnZXRGdW5jTmFtZTsKICBjb25zdCBpc1dyaXRlID0gd3JpdGVNZXRob2RzLmluY2x1ZGVzKHRhcmdldEZ1bmNOYW1lKTsKICBpZiAoCiAgICAvLyBCYWlsIGlmIHRoZSB0YXJnZXQgZG9lc24ndCBleGlzdCBvbiB0aGUgdGFyZ2V0LiBFZywgZ2V0QWxsIGlzbid0IGluIEVkZ2UuCiAgICAhKHRhcmdldEZ1bmNOYW1lIGluICh1c2VJbmRleCA/IElEQkluZGV4IDogSURCT2JqZWN0U3RvcmUpLnByb3RvdHlwZSkgfHwgIShpc1dyaXRlIHx8IHJlYWRNZXRob2RzLmluY2x1ZGVzKHRhcmdldEZ1bmNOYW1lKSkKICApIHsKICAgIHJldHVybjsKICB9CiAgY29uc3QgbWV0aG9kID0gYXN5bmMgZnVuY3Rpb24oc3RvcmVOYW1lLCAuLi5hcmdzKSB7CiAgICBjb25zdCB0eCA9IHRoaXMudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCBpc1dyaXRlID8gInJlYWR3cml0ZSIgOiAicmVhZG9ubHkiKTsKICAgIGxldCB0YXJnZXQyID0gdHguc3RvcmU7CiAgICBpZiAodXNlSW5kZXgpCiAgICAgIHRhcmdldDIgPSB0YXJnZXQyLmluZGV4KGFyZ3Muc2hpZnQoKSk7CiAgICByZXR1cm4gKGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgdGFyZ2V0Mlt0YXJnZXRGdW5jTmFtZV0oLi4uYXJncyksCiAgICAgIGlzV3JpdGUgJiYgdHguZG9uZQogICAgXSkpWzBdOwogIH07CiAgY2FjaGVkTWV0aG9kcy5zZXQocHJvcCwgbWV0aG9kKTsKICByZXR1cm4gbWV0aG9kOwp9CmFzeW5jIGZ1bmN0aW9uKiBpdGVyYXRlKC4uLmFyZ3MpIHsKICBsZXQgY3Vyc29yID0gdGhpczsKICBpZiAoIShjdXJzb3IgaW5zdGFuY2VvZiBJREJDdXJzb3IpKSB7CiAgICBjdXJzb3IgPSBhd2FpdCBjdXJzb3Iub3BlbkN1cnNvciguLi5hcmdzKTsKICB9CiAgaWYgKCFjdXJzb3IpCiAgICByZXR1cm47CiAgY3Vyc29yID0gY3Vyc29yOwogIGNvbnN0IHByb3hpZWRDdXJzb3IgPSBuZXcgUHJveHkoY3Vyc29yLCBjdXJzb3JJdGVyYXRvclRyYXBzKTsKICBpdHRyUHJveGllZEN1cnNvclRvT3JpZ2luYWxQcm94eS5zZXQocHJveGllZEN1cnNvciwgY3Vyc29yKTsKICByZXZlcnNlVHJhbnNmb3JtQ2FjaGUuc2V0KHByb3hpZWRDdXJzb3IsIHVud3JhcChjdXJzb3IpKTsKICB3aGlsZSAoY3Vyc29yKSB7CiAgICB5aWVsZCBwcm94aWVkQ3Vyc29yOwogICAgY3Vyc29yID0gYXdhaXQgKGFkdmFuY2VSZXN1bHRzLmdldChwcm94aWVkQ3Vyc29yKSB8fCBjdXJzb3IuY29udGludWUoKSk7CiAgICBhZHZhbmNlUmVzdWx0cy5kZWxldGUocHJveGllZEN1cnNvcik7CiAgfQp9CmZ1bmN0aW9uIGlzSXRlcmF0b3JQcm9wKHRhcmdldCwgcHJvcCkgewogIHJldHVybiBwcm9wID09PSBTeW1ib2wuYXN5bmNJdGVyYXRvciAmJiBpbnN0YW5jZU9mQW55KHRhcmdldCwgW0lEQkluZGV4LCBJREJPYmplY3RTdG9yZSwgSURCQ3Vyc29yXSkgfHwgcHJvcCA9PT0gIml0ZXJhdGUiICYmIGluc3RhbmNlT2ZBbnkodGFyZ2V0LCBbSURCSW5kZXgsIElEQk9iamVjdFN0b3JlXSk7Cn0KdmFyIGluc3RhbmNlT2ZBbnksIGlkYlByb3h5YWJsZVR5cGVzLCBjdXJzb3JBZHZhbmNlTWV0aG9kcywgdHJhbnNhY3Rpb25Eb25lTWFwLCB0cmFuc2Zvcm1DYWNoZSwgcmV2ZXJzZVRyYW5zZm9ybUNhY2hlLCBpZGJQcm94eVRyYXBzLCB1bndyYXAsIHJlYWRNZXRob2RzLCB3cml0ZU1ldGhvZHMsIGNhY2hlZE1ldGhvZHMsIGFkdmFuY2VNZXRob2RQcm9wcywgbWV0aG9kTWFwLCBhZHZhbmNlUmVzdWx0cywgaXR0clByb3hpZWRDdXJzb3JUb09yaWdpbmFsUHJveHksIGN1cnNvckl0ZXJhdG9yVHJhcHM7CnZhciBpbml0X2J1aWxkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgraWRiQDguMC4zL25vZGVfbW9kdWxlcy9AdGVtcGZpeC9pZGIvYnVpbGQvaW5kZXguanMiKCkgewogICAgaW5zdGFuY2VPZkFueSA9IChvYmplY3QsIGNvbnN0cnVjdG9ycykgPT4gY29uc3RydWN0b3JzLnNvbWUoKGMxMSkgPT4gb2JqZWN0IGluc3RhbmNlb2YgYzExKTsKICAgIHRyYW5zYWN0aW9uRG9uZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogICAgdHJhbnNmb3JtQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTsKICAgIHJldmVyc2VUcmFuc2Zvcm1DYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogICAgaWRiUHJveHlUcmFwcyA9IHsKICAgICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHsKICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURCVHJhbnNhY3Rpb24pIHsKICAgICAgICAgIGlmIChwcm9wID09PSAiZG9uZSIpCiAgICAgICAgICAgIHJldHVybiB0cmFuc2FjdGlvbkRvbmVNYXAuZ2V0KHRhcmdldCk7CiAgICAgICAgICBpZiAocHJvcCA9PT0gInN0b3JlIikgewogICAgICAgICAgICByZXR1cm4gcmVjZWl2ZXIub2JqZWN0U3RvcmVOYW1lc1sxXSA/IHZvaWQgMCA6IHJlY2VpdmVyLm9iamVjdFN0b3JlKHJlY2VpdmVyLm9iamVjdFN0b3JlTmFtZXNbMF0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gd3JhcCh0YXJnZXRbcHJvcF0pOwogICAgICB9LAogICAgICBzZXQodGFyZ2V0LCBwcm9wLCB2YWx1ZTIpIHsKICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTI7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0sCiAgICAgIGhhcyh0YXJnZXQsIHByb3ApIHsKICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURCVHJhbnNhY3Rpb24gJiYgKHByb3AgPT09ICJkb25lIiB8fCBwcm9wID09PSAic3RvcmUiKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm9wIGluIHRhcmdldDsKICAgICAgfQogICAgfTsKICAgIHVud3JhcCA9ICh2YWx1ZTIpID0+IHJldmVyc2VUcmFuc2Zvcm1DYWNoZS5nZXQodmFsdWUyKTsKICAgIHJlYWRNZXRob2RzID0gWyJnZXQiLCAiZ2V0S2V5IiwgImdldEFsbCIsICJnZXRBbGxLZXlzIiwgImNvdW50Il07CiAgICB3cml0ZU1ldGhvZHMgPSBbInB1dCIsICJhZGQiLCAiZGVsZXRlIiwgImNsZWFyIl07CiAgICBjYWNoZWRNZXRob2RzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIHJlcGxhY2VUcmFwcygob2xkVHJhcHMpID0+ICh7CiAgICAgIC4uLm9sZFRyYXBzLAogICAgICBnZXQ6ICh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSA9PiBnZXRNZXRob2QodGFyZ2V0LCBwcm9wKSB8fCBvbGRUcmFwcy5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlciksCiAgICAgIGhhczogKHRhcmdldCwgcHJvcCkgPT4gISFnZXRNZXRob2QodGFyZ2V0LCBwcm9wKSB8fCBvbGRUcmFwcy5oYXModGFyZ2V0LCBwcm9wKQogICAgfSkpOwogICAgYWR2YW5jZU1ldGhvZFByb3BzID0gWyJjb250aW51ZSIsICJjb250aW51ZVByaW1hcnlLZXkiLCAiYWR2YW5jZSJdOwogICAgbWV0aG9kTWFwID0ge307CiAgICBhZHZhbmNlUmVzdWx0cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogICAgaXR0clByb3hpZWRDdXJzb3JUb09yaWdpbmFsUHJveHkgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTsKICAgIGN1cnNvckl0ZXJhdG9yVHJhcHMgPSB7CiAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICBpZiAoIWFkdmFuY2VNZXRob2RQcm9wcy5pbmNsdWRlcyhwcm9wKSkKICAgICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07CiAgICAgICAgbGV0IGNhY2hlZEZ1bmMgPSBtZXRob2RNYXBbcHJvcF07CiAgICAgICAgaWYgKCFjYWNoZWRGdW5jKSB7CiAgICAgICAgICBjYWNoZWRGdW5jID0gbWV0aG9kTWFwW3Byb3BdID0gZnVuY3Rpb24oLi4uYXJncykgewogICAgICAgICAgICBhZHZhbmNlUmVzdWx0cy5zZXQodGhpcywgaXR0clByb3hpZWRDdXJzb3JUb09yaWdpbmFsUHJveHkuZ2V0KHRoaXMpW3Byb3BdKC4uLmFyZ3MpKTsKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBjYWNoZWRGdW5jOwogICAgICB9CiAgICB9OwogICAgcmVwbGFjZVRyYXBzKChvbGRUcmFwcykgPT4gKHsKICAgICAgLi4ub2xkVHJhcHMsCiAgICAgIGdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7CiAgICAgICAgaWYgKGlzSXRlcmF0b3JQcm9wKHRhcmdldCwgcHJvcCkpCiAgICAgICAgICByZXR1cm4gaXRlcmF0ZTsKICAgICAgICByZXR1cm4gb2xkVHJhcHMuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpOwogICAgICB9LAogICAgICBoYXModGFyZ2V0LCBwcm9wKSB7CiAgICAgICAgcmV0dXJuIGlzSXRlcmF0b3JQcm9wKHRhcmdldCwgcHJvcCkgfHwgb2xkVHJhcHMuaGFzKHRhcmdldCwgcHJvcCk7CiAgICAgIH0KICAgIH0pKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnN0b3JlQDIuMC4yMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic3RvcmUvZGlzdF90cy93ZWJzdG9yZS5wbHVnaW5zLmpzCnZhciBpbml0X3dlYnN0b3JlX3BsdWdpbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzdG9yZUAyLjAuMjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnN0b3JlL2Rpc3RfdHMvd2Vic3RvcmUucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHM3KCk7CiAgICBpbml0X2Rpc3RfdHMxMCgpOwogICAgaW5pdF9kaXN0X3RzMTIoKTsKICAgIGluaXRfZGlzdF90cygpOwogICAgaW5pdF9kaXN0X3RzMigpOwogICAgaW5pdF9kaXN0X3RzNCgpOwogICAgaW5pdF9idWlsZCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2Vic3RvcmVAMi4wLjIwL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJzdG9yZS9kaXN0X3RzL3dlYnN0b3JlLmNsYXNzZXMud2Vic3RvcmUuanMKdmFyIFdlYlN0b3JlOwp2YXIgaW5pdF93ZWJzdG9yZV9jbGFzc2VzX3dlYnN0b3JlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2Vic3RvcmVAMi4wLjIwL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJzdG9yZS9kaXN0X3RzL3dlYnN0b3JlLmNsYXNzZXMud2Vic3RvcmUuanMiKCkgewogICAgaW5pdF93ZWJzdG9yZV9wbHVnaW5zKCk7CiAgICBXZWJTdG9yZSA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3Iob3B0aW9uc0FyZykgewogICAgICAgIHRoaXMuaW5pdENhbGxlZCA9IGZhbHNlOwogICAgICAgIHRoaXMucmVhZHlEZWZlcnJlZCA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNBcmc7CiAgICAgIH0KICAgICAgYXN5bmMgaW5pdCgpIHsKICAgICAgICBpZiAodGhpcy5pbml0Q2FsbGVkKSB7CiAgICAgICAgICBhd2FpdCB0aGlzLnJlYWR5RGVmZXJyZWQucHJvbWlzZTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5pbml0Q2FsbGVkID0gdHJ1ZTsKICAgICAgICBjb25zdCBzbWFydGVudiA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxMC5TbWFydGVudigpOwogICAgICAgIGlmICghc21hcnRlbnYuaXNCcm93c2VyICYmICFnbG9iYWxUaGlzLmluZGV4ZWREQikgewogICAgICAgICAgY29uc29sZS5sb2coImhleSIpOwogICAgICAgICAgY29uc29sZS5sb2coZ2xvYmFsVGhpcy5pbmRleGVkREIpOwogICAgICAgICAgYXdhaXQgc21hcnRlbnYuZ2V0U2FmZU5vZGVNb2R1bGUoImZha2UtaW5kZXhlZGRiL2F1dG8iKTsKICAgICAgICAgIGlmICghZ2xvYmFsVGhpcy5pbmRleGVkREIpIHsKICAgICAgICAgICAgY29uc3QgbW9kID0gYXdhaXQgc21hcnRlbnYuZ2V0U2FmZU5vZGVNb2R1bGUoImZha2UtaW5kZXhlZGRiIik7CiAgICAgICAgICAgIGdsb2JhbFRoaXMuaW5kZXhlZERCID0gbmV3IG1vZC5JREJGYWN0b3J5KCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuZGIgPSBhd2FpdCBidWlsZF9leHBvcnRzLm9wZW5EQih0aGlzLm9wdGlvbnMuZGJOYW1lLCAxLCB7CiAgICAgICAgICB1cGdyYWRlOiAoZGIpID0+IHsKICAgICAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUodGhpcy5vcHRpb25zLnN0b3JlTmFtZSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5yZWFkeURlZmVycmVkLnJlc29sdmUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgYXN5bmMgZ2V0KGtleTIpIHsKICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTsKICAgICAgICByZXR1cm4gdGhpcy5kYi5nZXQodGhpcy5vcHRpb25zLnN0b3JlTmFtZSwga2V5Mik7CiAgICAgIH0KICAgICAgYXN5bmMgY2hlY2soa2V5QXJnKSB7CiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQoa2V5QXJnKTsKICAgICAgICByZXR1cm4gISFyZXN1bHQ7CiAgICAgIH0KICAgICAgYXN5bmMgc2V0KGtleTIsIHZhbCkgewogICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpOwogICAgICAgIHJldHVybiB0aGlzLmRiLnB1dCh0aGlzLm9wdGlvbnMuc3RvcmVOYW1lLCB2YWwsIGtleTIpOwogICAgICB9CiAgICAgIGFzeW5jIGRlbGV0ZShrZXkyKSB7CiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7CiAgICAgICAgcmV0dXJuIHRoaXMuZGIuZGVsZXRlKHRoaXMub3B0aW9ucy5zdG9yZU5hbWUsIGtleTIpOwogICAgICB9CiAgICAgIGFzeW5jIGNsZWFyKCkgewogICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpOwogICAgICAgIHJldHVybiB0aGlzLmRiLmNsZWFyKHRoaXMub3B0aW9ucy5zdG9yZU5hbWUpOwogICAgICB9CiAgICAgIGFzeW5jIGtleXMoKSB7CiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7CiAgICAgICAgcmV0dXJuIHRoaXMuZGIuZ2V0QWxsS2V5cyh0aGlzLm9wdGlvbnMuc3RvcmVOYW1lKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnN0b3JlQDIuMC4yMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic3RvcmUvZGlzdF90cy93ZWJzdG9yZS5jbGFzc2VzLnR5cGVkcmVxdWVzdGNhY2hlLmpzCnZhciBUeXBlZHJlcXVlc3RDYWNoZTsKdmFyIGluaXRfd2Vic3RvcmVfY2xhc3Nlc190eXBlZHJlcXVlc3RjYWNoZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnN0b3JlQDIuMC4yMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic3RvcmUvZGlzdF90cy93ZWJzdG9yZS5jbGFzc2VzLnR5cGVkcmVxdWVzdGNhY2hlLmpzIigpIHsKICAgIGluaXRfd2Vic3RvcmVfY2xhc3Nlc193ZWJzdG9yZSgpOwogICAgaW5pdF93ZWJzdG9yZV9wbHVnaW5zKCk7CiAgICBUeXBlZHJlcXVlc3RDYWNoZSA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoZG9tYWluQXJnID0gImRlZmF1bHQiKSB7CiAgICAgICAgdGhpcy53ZWJzdG9yZSA9IG5ldyBXZWJTdG9yZSh7CiAgICAgICAgICBkYk5hbWU6ICJ0clN0b3JlIiwKICAgICAgICAgIHN0b3JlTmFtZTogYHRyU3RvcmUtJHtkb21haW5Bcmd9YAogICAgICAgIH0pOwogICAgICB9CiAgICAgIGJ1aWxkS2V5KHJlcXVlc3RBcmcpIHsKICAgICAgICByZXR1cm4gZGlzdF90c19leHBvcnRzMTIuc3RyaW5naWZ5KHsKICAgICAgICAgIG1ldGhvZDogcmVxdWVzdEFyZy5tZXRob2QsCiAgICAgICAgICByZXF1ZXN0OiByZXF1ZXN0QXJnLnJlcXVlc3QKICAgICAgICB9KTsKICAgICAgfQogICAgICAvKioKICAgICAgICogc3RvcmVzIGJ5IHJlcXVlc3QKICAgICAgICogQHBhcmFtIHR5cGVkcmVxdWVzdGFyZwogICAgICAgKi8KICAgICAgYXN5bmMgc2V0QnlSZXF1ZXN0KHR5cGVkcmVxdWVzdEFyZykgewogICAgICAgIGlmICghdHlwZWRyZXF1ZXN0QXJnLnJlc3BvbnNlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIllvdSBjYW5ub3Qgc3RvcmUgcmVxdWVzdHMgd2l0aG91dCBhIHJlc3BvbnNlIHByZXNlbnQiKTsKICAgICAgICB9CiAgICAgICAgYXdhaXQgdGhpcy53ZWJzdG9yZS5zZXQodGhpcy5idWlsZEtleSh0eXBlZHJlcXVlc3RBcmcpLCB0eXBlZHJlcXVlc3RBcmcpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBnZXQgYnkgZnVsbCB0eW9lZHJlcXVlc3QgYnkgcGFydGlhbCB0eXBlZHJlcXVlc3QKICAgICAgICogQHBhcmFtIHR5cGVkcmVxdWVzdGFyZwogICAgICAgKi8KICAgICAgYXN5bmMgZ2V0QnlSZXF1ZXN0KHR5cGVkcmVxdWVzdEFyZykgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMud2Vic3RvcmUuZ2V0KHRoaXMuYnVpbGRLZXkodHlwZWRyZXF1ZXN0QXJnKSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnN0b3JlQDIuMC4yMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic3RvcmUvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMTMgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMTMsIHsKICBUeXBlZHJlcXVlc3RDYWNoZTogKCkgPT4gVHlwZWRyZXF1ZXN0Q2FjaGUsCiAgV2ViU3RvcmU6ICgpID0+IFdlYlN0b3JlCn0pOwp2YXIgaW5pdF9kaXN0X3RzMTMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzdG9yZUAyLjAuMjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnN0b3JlL2Rpc3RfdHMvaW5kZXguanMiKCkgewogICAgaW5pdF93ZWJzdG9yZV9jbGFzc2VzX3R5cGVkcmVxdWVzdGNhY2hlKCk7CiAgICBpbml0X3dlYnN0b3JlX2NsYXNzZXNfd2Vic3RvcmUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnJlcXVlc3RAMy4wLjM3L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvd2VicmVxdWVzdC5wbHVnaW5zLmpzCnZhciBpbml0X3dlYnJlcXVlc3RfcGx1Z2lucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnJlcXVlc3RAMy4wLjM3L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvd2VicmVxdWVzdC5wbHVnaW5zLmpzIigpIHsKICAgIGluaXRfZGlzdF90czMoKTsKICAgIGluaXRfZGlzdF90czEwKCk7CiAgICBpbml0X2Rpc3RfdHMxMigpOwogICAgaW5pdF9kaXN0X3RzKCk7CiAgICBpbml0X2Rpc3RfdHMxMygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2VicmVxdWVzdEAzLjAuMzcvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnJlcXVlc3QvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMTQgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMTQsIHsKICBXZWJSZXF1ZXN0OiAoKSA9PiBXZWJSZXF1ZXN0Cn0pOwp2YXIgV2ViUmVxdWVzdDsKdmFyIGluaXRfZGlzdF90czE0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2VicmVxdWVzdEAzLjAuMzcvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnJlcXVlc3QvZGlzdF90cy9pbmRleC5qcyIoKSB7CiAgICBpbml0X3dlYnJlcXVlc3RfcGx1Z2lucygpOwogICAgV2ViUmVxdWVzdCA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3Iob3B0aW9uc0FyZyA9IHt9KSB7CiAgICAgICAgdGhpcy5vcHRpb25zQXJnID0gb3B0aW9uc0FyZzsKICAgICAgICB0aGlzLmNhY2hlU3RvcmUgPSBuZXcgZGlzdF90c19leHBvcnRzMTMuV2ViU3RvcmUoewogICAgICAgICAgZGJOYW1lOiAid2VicmVxdWVzdCIsCiAgICAgICAgICBzdG9yZU5hbWU6ICJ3ZWJyZXF1ZXN0IgogICAgICAgIH0pOwogICAgICAgIHRoaXMub3B0aW9ucyA9IHsKICAgICAgICAgIGxvZ2dpbmc6IHRydWUsCiAgICAgICAgICAuLi5vcHRpb25zQXJnCiAgICAgICAgfTsKICAgICAgfQogICAgICBhc3luYyBnZXRKc29uKHVybEFyZywgdXNlQ2FjaGVBcmcgPSBmYWxzZSkgewogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybEFyZywgewogICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICAgIHVzZUNhY2hlOiB1c2VDYWNoZUFyZwogICAgICAgIH0pOwogICAgICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTsKICAgICAgICBjb25zdCByZXNwb25zZVJlc3VsdCA9IGRpc3RfdHNfZXhwb3J0czEyLnBhcnNlKHJlc3BvbnNlVGV4dCk7CiAgICAgICAgcmV0dXJuIHJlc3BvbnNlUmVzdWx0OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBwb3N0SnNvbgogICAgICAgKi8KICAgICAgYXN5bmMgcG9zdEpzb24odXJsQXJnLCByZXF1ZXN0Qm9keSwgdXNlQ2FjaGVBcmcgPSBmYWxzZSkgewogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybEFyZywgewogICAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiIKICAgICAgICAgIH0sCiAgICAgICAgICBib2R5OiBkaXN0X3RzX2V4cG9ydHMxMi5zdHJpbmdpZnkocmVxdWVzdEJvZHkpLAogICAgICAgICAgdXNlQ2FjaGU6IHVzZUNhY2hlQXJnCiAgICAgICAgfSk7CiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpOwogICAgICAgIGNvbnN0IHJlc3BvbnNlUmVzdWx0ID0gZGlzdF90c19leHBvcnRzMTIucGFyc2UocmVzcG9uc2VUZXh0KTsKICAgICAgICByZXR1cm4gcmVzcG9uc2VSZXN1bHQ7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHB1dCBqcwogICAgICAgKi8KICAgICAgYXN5bmMgcHV0SnNvbih1cmxBcmcsIHJlcXVlc3RCb2R5LCB1c2VTdG9yZUFzRmFsbGJhY2sgPSBmYWxzZSkgewogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybEFyZywgewogICAgICAgICAgbWV0aG9kOiAiUFVUIiwKICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIgogICAgICAgICAgfSwKICAgICAgICAgIGJvZHk6IGRpc3RfdHNfZXhwb3J0czEyLnN0cmluZ2lmeShyZXF1ZXN0Qm9keSkKICAgICAgICB9KTsKICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgY29uc3QgcmVzcG9uc2VSZXN1bHQgPSBkaXN0X3RzX2V4cG9ydHMxMi5wYXJzZShyZXNwb25zZVRleHQpOwogICAgICAgIHJldHVybiByZXNwb25zZVJlc3VsdDsKICAgICAgfQogICAgICAvKioKICAgICAgICogcHV0IGpzCiAgICAgICAqLwogICAgICBhc3luYyBkZWxldGVKc29uKHVybEFyZywgdXNlU3RvcmVBc0ZhbGxiYWNrID0gZmFsc2UpIHsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdCh1cmxBcmcsIHsKICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIgogICAgICAgICAgfSwKICAgICAgICAgIG1ldGhvZDogIkdFVCIKICAgICAgICB9KTsKICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgY29uc3QgcmVzcG9uc2VSZXN1bHQgPSBkaXN0X3RzX2V4cG9ydHMxMi5wYXJzZShyZXNwb25zZVRleHQpOwogICAgICAgIHJldHVybiByZXNwb25zZVJlc3VsdDsKICAgICAgfQogICAgICBhc3luYyByZXF1ZXN0KHVybEFyZywgb3B0aW9uc0FyZykgewogICAgICAgIG9wdGlvbnNBcmcgPSB7CiAgICAgICAgICB0aW1lb3V0TXM6IDZlNCwKICAgICAgICAgIHVzZUNhY2hlOiBmYWxzZSwKICAgICAgICAgIC4uLm9wdGlvbnNBcmcKICAgICAgICB9OwogICAgICAgIGxldCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwogICAgICAgIGRpc3RfdHNfZXhwb3J0czMuZGVsYXlGb3Iob3B0aW9uc0FyZy50aW1lb3V0TXMpLnRoZW4oKCkgPT4gewogICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIH0pOwogICAgICAgIGxldCBjYWNoZWRSZXNwb25zZURlZmVycmVkID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICAgICAgbGV0IGNhY2hlVXNlZCA9IGZhbHNlOwogICAgICAgIGlmIChvcHRpb25zQXJnLnVzZUNhY2hlICYmIGF3YWl0IHRoaXMuY2FjaGVTdG9yZS5jaGVjayh1cmxBcmcpKSB7CiAgICAgICAgICBjb25zdCByZXNwb25zZUJ1ZmZlciA9IGF3YWl0IHRoaXMuY2FjaGVTdG9yZS5nZXQodXJsQXJnKTsKICAgICAgICAgIGNhY2hlZFJlc3BvbnNlRGVmZXJyZWQucmVzb2x2ZShuZXcgUmVzcG9uc2UocmVzcG9uc2VCdWZmZXIsIHt9KSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNhY2hlZFJlc3BvbnNlRGVmZXJyZWQucmVzb2x2ZShudWxsKTsKICAgICAgICB9CiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsQXJnLCB7CiAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLAogICAgICAgICAgbWV0aG9kOiBvcHRpb25zQXJnLm1ldGhvZCwKICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgLi4ub3B0aW9uc0FyZy5oZWFkZXJzIHx8IHt9CiAgICAgICAgICB9LAogICAgICAgICAgYm9keTogb3B0aW9uc0FyZy5ib2R5CiAgICAgICAgfSkuY2F0Y2goYXN5bmMgKGVycikgPT4gewogICAgICAgICAgaWYgKG9wdGlvbnNBcmcudXNlQ2FjaGUgJiYgYXdhaXQgY2FjaGVkUmVzcG9uc2VEZWZlcnJlZC5wcm9taXNlKSB7CiAgICAgICAgICAgIGNhY2hlVXNlZCA9IHRydWU7CiAgICAgICAgICAgIGNvbnN0IGNhY2hlZFJlc3BvbnNlID0gY2FjaGVkUmVzcG9uc2VEZWZlcnJlZC5wcm9taXNlOwogICAgICAgICAgICByZXR1cm4gY2FjaGVkUmVzcG9uc2U7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmIChvcHRpb25zQXJnLnVzZUNhY2hlICYmIGF3YWl0IGNhY2hlZFJlc3BvbnNlRGVmZXJyZWQucHJvbWlzZSAmJiByZXNwb25zZS5zdGF0dXMgPT09IDUwMCkgewogICAgICAgICAgY2FjaGVVc2VkID0gdHJ1ZTsKICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY2FjaGVkUmVzcG9uc2VEZWZlcnJlZC5wcm9taXNlOwogICAgICAgIH0KICAgICAgICBpZiAoIWNhY2hlVXNlZCAmJiBvcHRpb25zQXJnLnVzZUNhY2hlICYmIHJlc3BvbnNlLnN0YXR1cyA8IDMwMCkgewogICAgICAgICAgY29uc3QgYnVmZmVyMiA9IGF3YWl0IHJlc3BvbnNlLmNsb25lKCkuYXJyYXlCdWZmZXIoKTsKICAgICAgICAgIGF3YWl0IHRoaXMuY2FjaGVTdG9yZS5zZXQodXJsQXJnLCBidWZmZXIyKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5sb2coYCR7dXJsQXJnfSBhbnN3ZXJzIHdpdGggc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTsKICAgICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGEgbXVsdGkgZW5kcG9pbnQsIGZhdWx0IHRvbGVyYW50IHJlcXVlc3QgZnVuY3Rpb24KICAgICAgICovCiAgICAgIGFzeW5jIHJlcXVlc3RNdWx0aUVuZHBvaW50KHVybEFyZywgb3B0aW9uc0FyZykgewogICAgICAgIGxldCBhbGxVcmxzOwogICAgICAgIGxldCB1c2VkVXJsSW5kZXggPSAwOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHVybEFyZykpIHsKICAgICAgICAgIGFsbFVybHMgPSB1cmxBcmc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFsbFVybHMgPSBbdXJsQXJnXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVxdWVzdEhpc3RvcnkgPSBbXTsKICAgICAgICBjb25zdCBkb0hpc3RvcnlDaGVjayA9IGFzeW5jIChoaXN0b3J5RW50cnlUeXBlQXJnKSA9PiB7CiAgICAgICAgICByZXF1ZXN0SGlzdG9yeS5wdXNoKGhpc3RvcnlFbnRyeVR5cGVBcmcpOwogICAgICAgICAgaWYgKGhpc3RvcnlFbnRyeVR5cGVBcmcgPT09ICI0MjkiKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJnb3QgNDI5LCBzbyB3YWl0aW5nIGEgbGl0dGxlIGJpdC4iKTsKICAgICAgICAgICAgYXdhaXQgZGlzdF90c19leHBvcnRzMy5kZWxheUZvcihNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoMmUzIC0gMWUzICsgMSkpICsgMWUzKTsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBudW1PZkhpc3RvcnlUeXBlID0gMDsKICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgcmVxdWVzdEhpc3RvcnkpIHsKICAgICAgICAgICAgaWYgKGVudHJ5ID09PSBoaXN0b3J5RW50cnlUeXBlQXJnKQogICAgICAgICAgICAgIG51bU9mSGlzdG9yeVR5cGUrKzsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChudW1PZkhpc3RvcnlUeXBlID4gMiAqIGFsbFVybHMubGVuZ3RoICogdXNlZFVybEluZGV4KSB7CiAgICAgICAgICAgIHVzZWRVcmxJbmRleCsrOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgY29uc3QgZG9SZXF1ZXN0ID0gYXN5bmMgKHVybFRvVXNlKSA9PiB7CiAgICAgICAgICBpZiAoIXVybFRvVXNlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigicmVxdWVzdCBmYWlsZWQgcGVybWFuZW50bHkiKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMubG9nKGBHZXR0aW5nICR7dXJsVG9Vc2V9IHdpdGggbWV0aG9kICR7b3B0aW9uc0FyZy5tZXRob2R9YCk7CiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybFRvVXNlLCB7CiAgICAgICAgICAgIG1ldGhvZDogb3B0aW9uc0FyZy5tZXRob2QsCiAgICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgICAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICAgICAgIC4uLm9wdGlvbnNBcmcuaGVhZGVycyB8fCB7fQogICAgICAgICAgICB9LAogICAgICAgICAgICBib2R5OiBvcHRpb25zQXJnLmJvZHkKICAgICAgICAgIH0pOwogICAgICAgICAgdGhpcy5sb2coYCR7dXJsVG9Vc2V9IGFuc3dlcnMgd2l0aCBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApOwogICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiYgcmVzcG9uc2Uuc3RhdHVzIDwgMzAwKSB7CiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGF3YWl0IGRvSGlzdG9yeUNoZWNrKHJlc3BvbnNlLnN0YXR1cy50b1N0cmluZygpKTsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZG9SZXF1ZXN0KGFsbFVybHNbdXNlZFVybEluZGV4XSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBjb25zdCBmaW5hbFJlc3BvbnNlID0gYXdhaXQgZG9SZXF1ZXN0KGFsbFVybHNbdXNlZFVybEluZGV4XSk7CiAgICAgICAgcmV0dXJuIGZpbmFsUmVzcG9uc2U7CiAgICAgIH0KICAgICAgbG9nKGxvZ0FyZykgewogICAgICAgIGlmICh0aGlzLm9wdGlvbnMubG9nZ2luZykgewogICAgICAgICAgY29uc29sZS5sb2cobG9nQXJnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4yLjUvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL3BsdWdpbnMuanMKdmFyIGlzb3VuaXF1ZTI7CnZhciBpbml0X3BsdWdpbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4yLjUvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL3BsdWdpbnMuanMiKCkgewogICAgaW5pdF9kaXN0X3RzNCgpOwogICAgaXNvdW5pcXVlMiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0X3RzKCksIDEpOwogICAgaW5pdF9kaXN0X3RzNygpOwogICAgaW5pdF9kaXN0X3RzOCgpOwogICAgaW5pdF9kaXN0X3RzMygpOwogICAgaW5pdF9kaXN0X3RzOSgpOwogICAgaW5pdF9kaXN0X3RzKCk7CiAgICBpbml0X2Rpc3RfdHMxNCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGFwaS5nbG9iYWwrdHlwZWRyZXF1ZXN0QDMuMi41L25vZGVfbW9kdWxlcy9AYXBpLmdsb2JhbC90eXBlZHJlcXVlc3QvZGlzdF90cy9jbGFzc2VzLnR5cGVkcmVzcG9uc2VlcnJvci5qcwp2YXIgVHlwZWRSZXNwb25zZUVycm9yOwp2YXIgaW5pdF9jbGFzc2VzX3R5cGVkcmVzcG9uc2VlcnJvciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkcmVxdWVzdEAzLjIuNS9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRyZXF1ZXN0L2Rpc3RfdHMvY2xhc3Nlcy50eXBlZHJlc3BvbnNlZXJyb3IuanMiKCkgewogICAgaW5pdF9wbHVnaW5zKCk7CiAgICBUeXBlZFJlc3BvbnNlRXJyb3IgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKGVycm9yVGV4dEFyZywgZXJyb3JEYXRhQXJnKSB7CiAgICAgICAgdGhpcy5lcnJvclRleHQgPSBlcnJvclRleHRBcmc7CiAgICAgICAgdGhpcy5lcnJvckRhdGEgPSBlcnJvckRhdGFBcmc7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4yLjUvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2NsYXNzZXMudHlwZWR0b29scy5qcwp2YXIgVHlwZWRUb29sczsKdmFyIGluaXRfY2xhc3Nlc190eXBlZHRvb2xzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGFwaS5nbG9iYWwrdHlwZWRyZXF1ZXN0QDMuMi41L25vZGVfbW9kdWxlcy9AYXBpLmdsb2JhbC90eXBlZHJlcXVlc3QvZGlzdF90cy9jbGFzc2VzLnR5cGVkdG9vbHMuanMiKCkgewogICAgaW5pdF9jbGFzc2VzX3R5cGVkcmVzcG9uc2VlcnJvcigpOwogICAgaW5pdF9wbHVnaW5zKCk7CiAgICBUeXBlZFRvb2xzID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLmxvY2FsRGF0YSA9IHt9OwogICAgICB9CiAgICAgIGFzeW5jIHBhc3NHdWFyZHMoZ3VhcmRzQXJnLCBkYXRhQXJnKSB7CiAgICAgICAgY29uc3QgZ3VhcmRTZXQgPSBuZXcgZGlzdF90c19leHBvcnRzOS5HdWFyZFNldChndWFyZHNBcmcpOwogICAgICAgIGNvbnN0IGd1YXJkUmVzdWx0ID0gYXdhaXQgZ3VhcmRTZXQuYWxsR3VhcmRzUGFzcyhkYXRhQXJnKTsKICAgICAgICBpZiAoIWd1YXJkUmVzdWx0KSB7CiAgICAgICAgICBjb25zdCBmYWlsZWRIaW50ID0gYXdhaXQgZ3VhcmRTZXQuZ2V0RmFpbGVkSGludChkYXRhQXJnKTsKICAgICAgICAgIHRocm93IG5ldyBUeXBlZFJlc3BvbnNlRXJyb3IoYGd1YXJkIGZhaWxlZDogJHtmYWlsZWRIaW50fWAsIHsgZmFpbGVkSGludCB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4yLjUvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2NsYXNzZXMudHlwZWRoYW5kbGVyLmpzCnZhciBUeXBlZEhhbmRsZXI7CnZhciBpbml0X2NsYXNzZXNfdHlwZWRoYW5kbGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGFwaS5nbG9iYWwrdHlwZWRyZXF1ZXN0QDMuMi41L25vZGVfbW9kdWxlcy9AYXBpLmdsb2JhbC90eXBlZHJlcXVlc3QvZGlzdF90cy9jbGFzc2VzLnR5cGVkaGFuZGxlci5qcyIoKSB7CiAgICBpbml0X3BsdWdpbnMoKTsKICAgIGluaXRfY2xhc3Nlc190eXBlZHJlc3BvbnNlZXJyb3IoKTsKICAgIGluaXRfY2xhc3Nlc190eXBlZHRvb2xzKCk7CiAgICBUeXBlZEhhbmRsZXIgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKG1ldGhvZEFyZywgaGFuZGxlckZ1bmN0aW9uQXJnKSB7CiAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2RBcmc7CiAgICAgICAgdGhpcy5oYW5kbGVyRnVuY3Rpb24gPSBoYW5kbGVyRnVuY3Rpb25Bcmc7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGFkZHMgYSByZXNwb25zZSB0byB0aGUgdHlwZWRSZXF1ZXN0CiAgICAgICAqIEBwYXJhbSB0eXBlZFJlcXVlc3RBcmcKICAgICAgICovCiAgICAgIGFzeW5jIGFkZFJlc3BvbnNlKHR5cGVkUmVxdWVzdEFyZykgewogICAgICAgIGlmICh0eXBlZFJlcXVlc3RBcmcubWV0aG9kICE9PSB0aGlzLm1ldGhvZCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ0aGlzIGhhbmRsZXIgaGFzIGJlZW4gZ2l2ZW4gYSB3cm9uZyBtZXRob2QgdG8gYW5zd2VyIHRvLiBQbGVhc2UgdXNlIGEgVHlwZWRSb3V0ZXIgdG8gZmlsdGVyIHJlcXVlc3RzIik7CiAgICAgICAgfQogICAgICAgIGxldCB0eXBlZFJlc3BvbnNlRXJyb3I7CiAgICAgICAgY29uc3QgdHlwZWR0b29sc0luc3RhbmNlID0gbmV3IFR5cGVkVG9vbHMoKTsKICAgICAgICBpZiAodHlwZWRSZXF1ZXN0QXJnLmxvY2FsRGF0YSkgewogICAgICAgICAgdHlwZWR0b29sc0luc3RhbmNlLmxvY2FsRGF0YSA9IHR5cGVkUmVxdWVzdEFyZy5sb2NhbERhdGE7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5oYW5kbGVyRnVuY3Rpb24odHlwZWRSZXF1ZXN0QXJnLnJlcXVlc3QsIHR5cGVkdG9vbHNJbnN0YW5jZSkuY2F0Y2goKGUxMSkgPT4gewogICAgICAgICAgaWYgKGUxMSBpbnN0YW5jZW9mIFR5cGVkUmVzcG9uc2VFcnJvcikgewogICAgICAgICAgICB0eXBlZFJlc3BvbnNlRXJyb3IgPSBlMTE7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZyhlMTEpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmICh0eXBlZFJlc3BvbnNlRXJyb3IpIHsKICAgICAgICAgIHR5cGVkUmVxdWVzdEFyZy5lcnJvciA9IHsKICAgICAgICAgICAgdGV4dDogdHlwZWRSZXNwb25zZUVycm9yLmVycm9yVGV4dCwKICAgICAgICAgICAgZGF0YTogdHlwZWRSZXNwb25zZUVycm9yLmVycm9yRGF0YQogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlc3BvbnNlKSB7CiAgICAgICAgICB0eXBlZFJlcXVlc3RBcmcucmVzcG9uc2UgPSByZXNwb25zZTsKICAgICAgICB9CiAgICAgICAgdHlwZWRSZXF1ZXN0QXJnPy5jb3JyZWxhdGlvbj8ucGhhc2UgPyB0eXBlZFJlcXVlc3RBcmcuY29ycmVsYXRpb24ucGhhc2UgPSAicmVzcG9uc2UiIDogbnVsbDsKICAgICAgICByZXR1cm4gdHlwZWRSZXF1ZXN0QXJnOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGFwaS5nbG9iYWwrdHlwZWRyZXF1ZXN0QDMuMi41L25vZGVfbW9kdWxlcy9AYXBpLmdsb2JhbC90eXBlZHJlcXVlc3QvZGlzdF90cy9jbGFzc2VzLnR5cGVkcm91dGVyLmpzCnZhciBUeXBlZFJvdXRlcjsKdmFyIGluaXRfY2xhc3Nlc190eXBlZHJvdXRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkcmVxdWVzdEAzLjIuNS9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRyZXF1ZXN0L2Rpc3RfdHMvY2xhc3Nlcy50eXBlZHJvdXRlci5qcyIoKSB7CiAgICBpbml0X3BsdWdpbnMoKTsKICAgIGluaXRfY2xhc3Nlc192aXJ0dWFsc3RyZWFtKCk7CiAgICBpbml0X2NsYXNzZXNfdHlwZWRoYW5kbGVyKCk7CiAgICBpbml0X2NsYXNzZXNfdHlwZWRyZXF1ZXN0KCk7CiAgICBUeXBlZFJvdXRlciA9IGNsYXNzIF9UeXBlZFJvdXRlciB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuaG9va3MgPSB7fTsKICAgICAgICB0aGlzLnJvdXRlck1hcCA9IG5ldyBkaXN0X3RzX2V4cG9ydHM2Lk9iamVjdE1hcCgpOwogICAgICAgIHRoaXMuaGFuZGxlck1hcCA9IG5ldyBkaXN0X3RzX2V4cG9ydHM2Lk9iamVjdE1hcCgpOwogICAgICAgIHRoaXMucmVnaXN0ZXJlZFZpcnR1YWxTdHJlYW1zID0gbmV3IGRpc3RfdHNfZXhwb3J0czYuT2JqZWN0TWFwKCk7CiAgICAgICAgdGhpcy5maXJlRXZlbnRJbnRlcmVzdE1hcCA9IG5ldyBkaXN0X3RzX2V4cG9ydHM2LkludGVyZXN0TWFwKChjb3JyZWxhdGlvbklkKSA9PiBjb3JyZWxhdGlvbklkKTsKICAgICAgfQogICAgICAvLyBVc2UgZ2xvYmFsVGhpcyBmb3IgY3Jvc3MtYnVuZGxlIGhvb2sgc2hhcmluZwogICAgICBzdGF0aWMgZ2V0IGdsb2JhbEhvb2tzKCkgewogICAgICAgIGlmICghZ2xvYmFsVGhpcy5fX3R5cGVkUm91dGVyR2xvYmFsSG9va3MpIHsKICAgICAgICAgIGdsb2JhbFRoaXMuX190eXBlZFJvdXRlckdsb2JhbEhvb2tzID0ge307CiAgICAgICAgfQogICAgICAgIHJldHVybiBnbG9iYWxUaGlzLl9fdHlwZWRSb3V0ZXJHbG9iYWxIb29rczsKICAgICAgfQogICAgICBzdGF0aWMgc2V0IGdsb2JhbEhvb2tzKHZhbHVlMikgewogICAgICAgIGdsb2JhbFRoaXMuX190eXBlZFJvdXRlckdsb2JhbEhvb2tzID0gdmFsdWUyOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBTZXQgZ2xvYmFsIGhvb2tzIGZvciBtb25pdG9yaW5nIGFsbCBUeXBlZFJlcXVlc3QgdHJhZmZpYwogICAgICAgKiBIb29rcyBhcmUgc2hhcmVkIGFjcm9zcyBhbGwgYnVuZGxlcyB2aWEgZ2xvYmFsVGhpcwogICAgICAgKi8KICAgICAgc3RhdGljIHNldEdsb2JhbEhvb2tzKGhvb2tzOCkgewogICAgICAgIGNvbnN0IGN1cnJlbnQgPSBfVHlwZWRSb3V0ZXIuZ2xvYmFsSG9va3M7CiAgICAgICAgX1R5cGVkUm91dGVyLmdsb2JhbEhvb2tzID0geyAuLi5jdXJyZW50LCAuLi5ob29rczggfTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQ2xlYXIgYWxsIGdsb2JhbCBob29rcwogICAgICAgKi8KICAgICAgc3RhdGljIGNsZWFyR2xvYmFsSG9va3MoKSB7CiAgICAgICAgZ2xvYmFsVGhpcy5fX3R5cGVkUm91dGVyR2xvYmFsSG9va3MgPSB7fTsKICAgICAgfQogICAgICAvKioKICAgICAgICogU2V0IGluc3RhbmNlLWxldmVsIGhvb2tzIGZvciBtb25pdG9yaW5nIHRyYWZmaWMgdGhyb3VnaCB0aGlzIHJvdXRlcgogICAgICAgKi8KICAgICAgc2V0SG9va3MoaG9va3M4KSB7CiAgICAgICAgdGhpcy5ob29rcyA9IHsgLi4udGhpcy5ob29rcywgLi4uaG9va3M4IH07CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEhlbHBlciB0byBjYWxsIGJvdGggZ2xvYmFsIGFuZCBpbnN0YW5jZSBob29rcwogICAgICAgKi8KICAgICAgY2FsbEhvb2soaG9va05hbWUsIGVudHJ5KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIF9UeXBlZFJvdXRlci5nbG9iYWxIb29rc1tob29rTmFtZV0/LihlbnRyeSk7CiAgICAgICAgICB0aGlzLmhvb2tzW2hvb2tOYW1lXT8uKGVudHJ5KTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFR5cGVkUm91dGVyIGhvb2sgZXJyb3IgKCR7aG9va05hbWV9KTpgLCBlcnIpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogYWRkcyB0aGUgaGFuZGxlciB0byB0aGUgcm91dGluZyBtYXAKICAgICAgICogQHBhcmFtIHR5cGVkSGFuZGxlckFyZwogICAgICAgKi8KICAgICAgYWRkVHlwZWRIYW5kbGVyKHR5cGVkSGFuZGxlckFyZykgewogICAgICAgIGNvbnN0IGV4aXN0aW5nVHlwZWRIYW5kbGVyID0gdGhpcy5nZXRUeXBlZEhhbmRsZXJGb3JNZXRob2QodHlwZWRIYW5kbGVyQXJnLm1ldGhvZCk7CiAgICAgICAgaWYgKGV4aXN0aW5nVHlwZWRIYW5kbGVyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGEgVHlwZWRIYW5kbGVyIGZvciAke3R5cGVkSGFuZGxlckFyZy5tZXRob2R9IGFscmVkeSBleGlzdHMhIENhbid0IGFkZCBhbm90aGVyIG9uZS5gKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5oYW5kbGVyTWFwLmFkZCh0eXBlZEhhbmRsZXJBcmcpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBhZGRzIGFub3RoZXIgc3ViIHR5cGVkUm91dGVyCiAgICAgICAqIEBwYXJhbSB0eXBlZFJlcXVlc3QKICAgICAgICovCiAgICAgIGFkZFR5cGVkUm91dGVyKHR5cGVkUm91dGVyQXJnKSB7CiAgICAgICAgY29uc3Qgcm91dGVyRXhpc3RzID0gdGhpcy5yb3V0ZXJNYXAuZmluZFN5bmMoKHJvdXRlckFyZykgPT4gcm91dGVyQXJnID09PSB0eXBlZFJvdXRlckFyZyk7CiAgICAgICAgaWYgKCFyb3V0ZXJFeGlzdHMpIHsKICAgICAgICAgIHRoaXMucm91dGVyTWFwLmFkZCh0eXBlZFJvdXRlckFyZyk7CiAgICAgICAgICB0eXBlZFJvdXRlckFyZy5hZGRUeXBlZFJvdXRlcih0aGlzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2hlY2tGb3JUeXBlZEhhbmRsZXIobWV0aG9kQXJnKSB7CiAgICAgICAgcmV0dXJuICEhdGhpcy5nZXRUeXBlZEhhbmRsZXJGb3JNZXRob2QobWV0aG9kQXJnKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogZ2V0cyBhIHR5cGVkIFJvdXRlciBmcm9tIHRoZSByb3V0ZXIgY2hhaW4sIHVwc3RyZWFtIGFuZCBkb3duc3RyZWFtCiAgICAgICAqIEBwYXJhbSBtZXRob2RBcmcKICAgICAgICogQHBhcmFtIGNoZWNrVXBzdHJlYW1Sb3V0ZXIKICAgICAgICovCiAgICAgIGdldFR5cGVkSGFuZGxlckZvck1ldGhvZChtZXRob2RBcmcsIGNoZWNrZWRSb3V0ZXJzID0gW10pIHsKICAgICAgICBjaGVja2VkUm91dGVycy5wdXNoKHRoaXMpOwogICAgICAgIGxldCB0eXBlZEhhbmRsZXI7CiAgICAgICAgdHlwZWRIYW5kbGVyID0gdGhpcy5oYW5kbGVyTWFwLmZpbmRTeW5jKChoYW5kbGVyMikgPT4gewogICAgICAgICAgcmV0dXJuIGhhbmRsZXIyLm1ldGhvZCA9PT0gbWV0aG9kQXJnOwogICAgICAgIH0pOwogICAgICAgIGlmICghdHlwZWRIYW5kbGVyKSB7CiAgICAgICAgICB0aGlzLnJvdXRlck1hcC5nZXRBcnJheSgpLmZvckVhY2goKHR5cGVkUm91dGVyQXJnKSA9PiB7CiAgICAgICAgICAgIGlmICghdHlwZWRIYW5kbGVyICYmICFjaGVja2VkUm91dGVycy5pbmNsdWRlcyh0eXBlZFJvdXRlckFyZykpIHsKICAgICAgICAgICAgICB0eXBlZEhhbmRsZXIgPSB0eXBlZFJvdXRlckFyZy5nZXRUeXBlZEhhbmRsZXJGb3JNZXRob2QobWV0aG9kQXJnLCBjaGVja2VkUm91dGVycyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHlwZWRIYW5kbGVyOwogICAgICB9CiAgICAgIHN0YXRpYyB7CiAgICAgICAgdGhpcy5kZWZhdWx0Um91dGVPcHRpb25zID0gewogICAgICAgICAgbG9jYWxSZXF1ZXN0OiBmYWxzZSwKICAgICAgICAgIHNraXBIb29rczogZmFsc2UKICAgICAgICB9OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBpZiB0eXBlZHJlcXVlc3Qgb2JqZWN0IGhhcyBjb3JyZWxhdGlvbi5waGFzZSA9PT0gJ3JlcXVlc3QnIC0+IHJvdXRlcyBhIHR5cGVkIHJlcXVlc3Qgb2JqZWN0IHRvIGEgaGFuZGxlcgogICAgICAgKiBpZiB0eXBlZHJlcXVlc3Qgb2JqZWN0IGhhcyBjb3JyZWxhdGlvbi5waGFzZSA9PT0gJ3Jlc3BvbnNlJyAtPiByb3V0ZXMgYSB0eXBlZCByZXF1ZXN0IG9iamVjdCB0byByZXF1ZXN0IGZpcmUgZXZlbnQKICAgICAgICogQHBhcmFtIHR5cGVkUmVxdWVzdEFyZwogICAgICAgKiBAcGFyYW0gb3B0aW9uc0FyZyAtIE9wdGlvbnMgb2JqZWN0IHdpdGg6CiAgICAgICAqICAgLSBsb2NhbFJlcXVlc3Q6IHRyZWF0IGFzIGxvY2FsIHJlcXVlc3QgKGRlZmF1bHQ6IGZhbHNlKQogICAgICAgKiAgIC0gc2tpcEhvb2tzOiBza2lwIGNhbGxpbmcgaG9va3MgZm9yIHRoaXMgcm91dGluZyAoZGVmYXVsdDogZmFsc2UsIHVzZSBmb3IgYnJvYWRjYXN0LXJlY2VpdmVkIG1lc3NhZ2VzKQogICAgICAgKi8KICAgICAgYXN5bmMgcm91dGVBbmRBZGRSZXNwb25zZSh0eXBlZFJlcXVlc3RBcmcsIG9wdGlvbnNBcmcgPSB7fSkgewogICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLl9UeXBlZFJvdXRlci5kZWZhdWx0Um91dGVPcHRpb25zLCAuLi5vcHRpb25zQXJnIH07CiAgICAgICAgdHlwZWRSZXF1ZXN0QXJnID0gVmlydHVhbFN0cmVhbS5kZWNvZGVQYXlsb2FkRnJvbU5ldHdvcmsodHlwZWRSZXF1ZXN0QXJnLCB7CiAgICAgICAgICB0eXBlZHJvdXRlcjogdGhpcwogICAgICAgIH0pOwogICAgICAgIHR5cGVkUmVxdWVzdEFyZy5sb2NhbERhdGEgPSB0eXBlZFJlcXVlc3RBcmcubG9jYWxEYXRhIHx8IHt9OwogICAgICAgIHR5cGVkUmVxdWVzdEFyZy5sb2NhbERhdGEuZmlyc3RUeXBlZHJvdXRlciA9IHRoaXM7CiAgICAgICAgaWYgKHR5cGVkUmVxdWVzdEFyZy5tZXRob2QgPT09ICIjI1ZpcnR1YWxTdHJlYW0jIyIpIHsKICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaGFuZGxlU3RyZWFtVHlwZWRSZXF1ZXN0KHR5cGVkUmVxdWVzdEFyZyk7CiAgICAgICAgICByZXN1bHQubG9jYWxEYXRhID0gbnVsbDsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlZFJlcXVlc3RBcmc/LmNvcnJlbGF0aW9uPy5waGFzZSA9PT0gInJlcXVlc3QiIHx8IG9wdGlvbnMubG9jYWxSZXF1ZXN0KSB7CiAgICAgICAgICBjb25zdCByZXF1ZXN0U3RhcnRUaW1lID0gRGF0ZS5ub3coKTsKICAgICAgICAgIGlmICghb3B0aW9ucy5za2lwSG9va3MpIHsKICAgICAgICAgICAgdGhpcy5jYWxsSG9vaygib25JbmNvbWluZ1JlcXVlc3QiLCB7CiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogdHlwZWRSZXF1ZXN0QXJnLmNvcnJlbGF0aW9uPy5pZCB8fCAidW5rbm93biIsCiAgICAgICAgICAgICAgbWV0aG9kOiB0eXBlZFJlcXVlc3RBcmcubWV0aG9kLAogICAgICAgICAgICAgIGRpcmVjdGlvbjogImluY29taW5nIiwKICAgICAgICAgICAgICBwaGFzZTogInJlcXVlc3QiLAogICAgICAgICAgICAgIHRpbWVzdGFtcDogcmVxdWVzdFN0YXJ0VGltZSwKICAgICAgICAgICAgICBwYXlsb2FkOiB0eXBlZFJlcXVlc3RBcmcucmVxdWVzdAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHR5cGVkSGFuZGxlciA9IHRoaXMuZ2V0VHlwZWRIYW5kbGVyRm9yTWV0aG9kKHR5cGVkUmVxdWVzdEFyZy5tZXRob2QpOwogICAgICAgICAgaWYgKCF0eXBlZEhhbmRsZXIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coYENhbm5vdCBmaW5kIGhhbmRsZXIgZm9yIG1ldGhvZG5hbWUgJHt0eXBlZFJlcXVlc3RBcmcubWV0aG9kfWApOwogICAgICAgICAgICB0eXBlZFJlcXVlc3RBcmcuZXJyb3IgPSB7CiAgICAgICAgICAgICAgdGV4dDogIlRoZXJlIGlzIG5vIGF2YWlsYWJsZSBtZXRob2QgZm9yIHRoaXMgY2FsbCBvbiB0aGUgc2VydmVyIHNpZGUiLAogICAgICAgICAgICAgIGRhdGE6IHt9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHR5cGVkUmVxdWVzdEFyZy5jb3JyZWxhdGlvbi5waGFzZSA9ICJyZXNwb25zZSI7CiAgICAgICAgICAgIHR5cGVkUmVxdWVzdEFyZy5sb2NhbERhdGEgPSBudWxsOwogICAgICAgICAgICB0eXBlZFJlcXVlc3RBcmcgPSBWaXJ0dWFsU3RyZWFtLmVuY29kZVBheWxvYWRGb3JOZXR3b3JrKHR5cGVkUmVxdWVzdEFyZywgewogICAgICAgICAgICAgIHR5cGVkcm91dGVyOiB0aGlzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAoIW9wdGlvbnMuc2tpcEhvb2tzKSB7CiAgICAgICAgICAgICAgdGhpcy5jYWxsSG9vaygib25PdXRnb2luZ1Jlc3BvbnNlIiwgewogICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogdHlwZWRSZXF1ZXN0QXJnLmNvcnJlbGF0aW9uPy5pZCB8fCAidW5rbm93biIsCiAgICAgICAgICAgICAgICBtZXRob2Q6IHR5cGVkUmVxdWVzdEFyZy5tZXRob2QsCiAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICJvdXRnb2luZyIsCiAgICAgICAgICAgICAgICBwaGFzZTogInJlc3BvbnNlIiwKICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSwKICAgICAgICAgICAgICAgIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSByZXF1ZXN0U3RhcnRUaW1lLAogICAgICAgICAgICAgICAgcGF5bG9hZDogdHlwZWRSZXF1ZXN0QXJnLnJlc3BvbnNlLAogICAgICAgICAgICAgICAgZXJyb3I6IHR5cGVkUmVxdWVzdEFyZy5lcnJvcj8udGV4dAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0eXBlZFJlcXVlc3RBcmc7CiAgICAgICAgICB9CiAgICAgICAgICB0eXBlZFJlcXVlc3RBcmcgPSBhd2FpdCB0eXBlZEhhbmRsZXIuYWRkUmVzcG9uc2UodHlwZWRSZXF1ZXN0QXJnKTsKICAgICAgICAgIHR5cGVkUmVxdWVzdEFyZy5sb2NhbERhdGEgPSBudWxsOwogICAgICAgICAgdHlwZWRSZXF1ZXN0QXJnID0gVmlydHVhbFN0cmVhbS5lbmNvZGVQYXlsb2FkRm9yTmV0d29yayh0eXBlZFJlcXVlc3RBcmcsIHsKICAgICAgICAgICAgdHlwZWRyb3V0ZXI6IHRoaXMKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKCFvcHRpb25zLnNraXBIb29rcykgewogICAgICAgICAgICB0aGlzLmNhbGxIb29rKCJvbk91dGdvaW5nUmVzcG9uc2UiLCB7CiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogdHlwZWRSZXF1ZXN0QXJnLmNvcnJlbGF0aW9uPy5pZCB8fCAidW5rbm93biIsCiAgICAgICAgICAgICAgbWV0aG9kOiB0eXBlZFJlcXVlc3RBcmcubWV0aG9kLAogICAgICAgICAgICAgIGRpcmVjdGlvbjogIm91dGdvaW5nIiwKICAgICAgICAgICAgICBwaGFzZTogInJlc3BvbnNlIiwKICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksCiAgICAgICAgICAgICAgZHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHJlcXVlc3RTdGFydFRpbWUsCiAgICAgICAgICAgICAgcGF5bG9hZDogdHlwZWRSZXF1ZXN0QXJnLnJlc3BvbnNlLAogICAgICAgICAgICAgIGVycm9yOiB0eXBlZFJlcXVlc3RBcmcuZXJyb3I/LnRleHQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHlwZWRSZXF1ZXN0QXJnOwogICAgICAgIH0gZWxzZSBpZiAodHlwZWRSZXF1ZXN0QXJnPy5jb3JyZWxhdGlvbj8ucGhhc2UgPT09ICJyZXNwb25zZSIpIHsKICAgICAgICAgIGlmICghb3B0aW9ucy5za2lwSG9va3MpIHsKICAgICAgICAgICAgdGhpcy5jYWxsSG9vaygib25JbmNvbWluZ1Jlc3BvbnNlIiwgewogICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHR5cGVkUmVxdWVzdEFyZy5jb3JyZWxhdGlvbj8uaWQgfHwgInVua25vd24iLAogICAgICAgICAgICAgIG1ldGhvZDogdHlwZWRSZXF1ZXN0QXJnLm1ldGhvZCwKICAgICAgICAgICAgICBkaXJlY3Rpb246ICJpbmNvbWluZyIsCiAgICAgICAgICAgICAgcGhhc2U6ICJyZXNwb25zZSIsCiAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLAogICAgICAgICAgICAgIHBheWxvYWQ6IHR5cGVkUmVxdWVzdEFyZy5yZXNwb25zZSwKICAgICAgICAgICAgICBlcnJvcjogdHlwZWRSZXF1ZXN0QXJnLmVycm9yPy50ZXh0CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5maXJlRXZlbnRJbnRlcmVzdE1hcC5maW5kSW50ZXJlc3QodHlwZWRSZXF1ZXN0QXJnLmNvcnJlbGF0aW9uLmlkKT8uZnVsbGZpbGxJbnRlcmVzdCh0eXBlZFJlcXVlc3RBcmcpOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnNvbGUubG9nKCJyZWNlaXZlZCB3ZWlyZGx5IHNoYXBlZCByZXF1ZXN0Iik7CiAgICAgICAgICBjb25zb2xlLmxvZyh0eXBlZFJlcXVlc3RBcmcpOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBoYW5kbGUgc3RyZWFtaW5nCiAgICAgICAqIEBwYXJhbSBzdHJlYW1UckFyZwogICAgICAgKi8KICAgICAgYXN5bmMgaGFuZGxlU3RyZWFtVHlwZWRSZXF1ZXN0KHN0cmVhbVRyQXJnKSB7CiAgICAgICAgY29uc3QgcmVsZXZhbnRWaXJ0dWFsU3RyZWFtID0gYXdhaXQgdGhpcy5yZWdpc3RlcmVkVmlydHVhbFN0cmVhbXMuZmluZChhc3luYyAodmlydHVhbFN0cmVhbUFyZykgPT4gewogICAgICAgICAgcmV0dXJuIHZpcnR1YWxTdHJlYW1Bcmcuc3RyZWFtSWQgPT09IHN0cmVhbVRyQXJnLnJlcXVlc3Quc3RyZWFtSWQ7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKCFyZWxldmFudFZpcnR1YWxTdHJlYW0pIHsKICAgICAgICAgIGNvbnNvbGUubG9nKGBubyByZWxldmFudCB2aXJ0dWFsIHN0cmVhbSBmb3VuZCBmb3Igc3RyZWFtIHdpdGggaWQgJHtzdHJlYW1UckFyZy5yZXF1ZXN0LnN0cmVhbUlkfWApOwogICAgICAgICAgY29uc29sZS5sb2codGhpcy5yZWdpc3RlcmVkVmlydHVhbFN0cmVhbXMuZ2V0QXJyYXkoKSk7CiAgICAgICAgICByZXR1cm4gc3RyZWFtVHJBcmc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnNvbGUubG9nKGBzdWNjZXNzOiBmb3VuZCByZWxldmFudCB2aXJ0dWFsIHN0cmVhbSB3aXRoIGlkICR7c3RyZWFtVHJBcmcucmVxdWVzdC5zdHJlYW1JZH1gKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVsZXZhbnRWaXJ0dWFsU3RyZWFtLmhhbmRsZVN0cmVhbVRyKHN0cmVhbVRyQXJnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGFwaS5nbG9iYWwrdHlwZWRyZXF1ZXN0QDMuMi41L25vZGVfbW9kdWxlcy9AYXBpLmdsb2JhbC90eXBlZHJlcXVlc3QvZGlzdF90cy9jbGFzc2VzLnZpcnR1YWxzdHJlYW0uanMKdmFyIGNsb3NpbmdCaXQsIFZpcnR1YWxTdHJlYW07CnZhciBpbml0X2NsYXNzZXNfdmlydHVhbHN0cmVhbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkcmVxdWVzdEAzLjIuNS9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRyZXF1ZXN0L2Rpc3RfdHMvY2xhc3Nlcy52aXJ0dWFsc3RyZWFtLmpzIigpIHsKICAgIGluaXRfcGx1Z2lucygpOwogICAgaW5pdF9jbGFzc2VzX3R5cGVkcm91dGVyKCk7CiAgICBjbG9zaW5nQml0ID0gIiMjIyMjIyMjIyMjIyNDTE9TSU5HIEJJVCMjIyMjIyMjIyMjIyMiOwogICAgVmlydHVhbFN0cmVhbSA9IGNsYXNzIF9WaXJ0dWFsU3RyZWFtIHsKICAgICAgLy8gU1RBVElDCiAgICAgIHN0YXRpYyBlbmNvZGVQYXlsb2FkRm9yTmV0d29yayhvYmplY3RQYXlsb2FkLCBjb21tRnVuY3Rpb25zLCBvcmlnaW5hbFBheWxvYWQsIHBhdGgyID0gW10pIHsKICAgICAgICBpZiAoIW9iamVjdFBheWxvYWQpIHsKICAgICAgICAgIHJldHVybiBvYmplY3RQYXlsb2FkOwogICAgICAgIH0KICAgICAgICBpZiAoZGlzdF90c19leHBvcnRzOC5pc0J1ZmZlckxpa2Uob2JqZWN0UGF5bG9hZCkpIHsKICAgICAgICAgIHJldHVybiBvYmplY3RQYXlsb2FkOwogICAgICAgIH0KICAgICAgICBpZiAob2JqZWN0UGF5bG9hZCBpbnN0YW5jZW9mIF9WaXJ0dWFsU3RyZWFtKSB7CiAgICAgICAgICBpZiAoIW9iamVjdFBheWxvYWQuc2lkZSAmJiBjb21tRnVuY3Rpb25zLnNlbmRNZXRob2QpIHsKICAgICAgICAgICAgb2JqZWN0UGF5bG9hZC5zaWRlID0gInJlcXVlc3RpbmciOwogICAgICAgICAgICBvYmplY3RQYXlsb2FkLnNlbmRNZXRob2QgPSBjb21tRnVuY3Rpb25zLnNlbmRNZXRob2Q7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIW9iamVjdFBheWxvYWQuc2lkZSAmJiBjb21tRnVuY3Rpb25zLnR5cGVkcm91dGVyKSB7CiAgICAgICAgICAgIG9iamVjdFBheWxvYWQuc2lkZSA9ICJyZXNwb25kaW5nIjsKICAgICAgICAgICAgb2JqZWN0UGF5bG9hZC50eXBlZHJvdXRlciA9IGNvbW1GdW5jdGlvbnMudHlwZWRyb3V0ZXI7CiAgICAgICAgICAgIGNvbW1GdW5jdGlvbnMudHlwZWRyb3V0ZXIucmVnaXN0ZXJlZFZpcnR1YWxTdHJlYW1zLmFkZChvYmplY3RQYXlsb2FkKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghb3JpZ2luYWxQYXlsb2FkLnJlc3BvbnNlIHx8IHBhdGgyLmluY2x1ZGVzKCJyZXNwb25zZSIpKSB7CiAgICAgICAgICAgIG9iamVjdFBheWxvYWQuc3RhcnRLZWVwQWxpdmVMb29wKCk7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgX2lzVmlydHVhbFN0cmVhbTogdHJ1ZSwKICAgICAgICAgICAgICBzdHJlYW1JZDogb2JqZWN0UGF5bG9hZC5zdHJlYW1JZAogICAgICAgICAgICB9OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBfT0JNSVRURURfVklSVFVBTF9TVFJFQU06IHRydWUsCiAgICAgICAgICAgICAgcmVhc29uOiAicGF0aCBpcyB1bmRlciAucmVxdWVzdDogb2JtaXR0ZWQgZm9yIGRlZHVwbGljYXRpb24gcmVhc29ucyBpbiByZXNwb25zZSBjeWNsZS4iCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iamVjdFBheWxvYWQpKSB7CiAgICAgICAgICByZXR1cm4gb2JqZWN0UGF5bG9hZC5tYXAoKGl0ZW0sIGluZGV4MikgPT4gX1ZpcnR1YWxTdHJlYW0uZW5jb2RlUGF5bG9hZEZvck5ldHdvcmsoCiAgICAgICAgICAgIGl0ZW0sCiAgICAgICAgICAgIGNvbW1GdW5jdGlvbnMsCiAgICAgICAgICAgIG9yaWdpbmFsUGF5bG9hZCB8fCBvYmplY3RQYXlsb2FkLAogICAgICAgICAgICBwYXRoMi5jb25jYXQoU3RyaW5nKGluZGV4MikpCiAgICAgICAgICAgIC8vIENvbnZlcnQgaW5kZXggdG8gc3RyaW5nIGFuZCBjb25jYXRlbmF0ZSB0byBwYXRoCiAgICAgICAgICApKTsKICAgICAgICB9IGVsc2UgaWYgKG9iamVjdFBheWxvYWQgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdFBheWxvYWQgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMob2JqZWN0UGF5bG9hZCkucmVkdWNlKChhY2MsIFtrZXkyLCB2YWx1ZTJdKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IG5ld1BhdGggPSBwYXRoMi5jb25jYXQoa2V5Mik7CiAgICAgICAgICAgIGFjY1trZXkyXSA9IF9WaXJ0dWFsU3RyZWFtLmVuY29kZVBheWxvYWRGb3JOZXR3b3JrKHZhbHVlMiwgY29tbUZ1bmN0aW9ucywgb3JpZ2luYWxQYXlsb2FkIHx8IG9iamVjdFBheWxvYWQsIG5ld1BhdGgpOwogICAgICAgICAgICByZXR1cm4gYWNjOwogICAgICAgICAgfSwge30pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gb2JqZWN0UGF5bG9hZDsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhdGljIGRlY29kZVBheWxvYWRGcm9tTmV0d29yayhvYmplY3RQYXlsb2FkLCBjb21tRnVuY3Rpb25zKSB7CiAgICAgICAgaWYgKGRpc3RfdHNfZXhwb3J0czguaXNCdWZmZXJMaWtlKG9iamVjdFBheWxvYWQpIHx8IG9iamVjdFBheWxvYWQgaW5zdGFuY2VvZiBUeXBlZFJvdXRlcikgewogICAgICAgICAgcmV0dXJuIG9iamVjdFBheWxvYWQ7CiAgICAgICAgfQogICAgICAgIGlmIChvYmplY3RQYXlsb2FkICE9PSBudWxsICYmIHR5cGVvZiBvYmplY3RQYXlsb2FkID09PSAib2JqZWN0IikgewogICAgICAgICAgaWYgKG9iamVjdFBheWxvYWQgaW5zdGFuY2VvZiBTZXQgfHwgb2JqZWN0UGF5bG9hZCBpbnN0YW5jZW9mIE1hcCB8fCBvYmplY3RQYXlsb2FkIGluc3RhbmNlb2YgRGF0ZSB8fCBvYmplY3RQYXlsb2FkIGluc3RhbmNlb2YgUmVnRXhwIHx8IG9iamVjdFBheWxvYWQgaW5zdGFuY2VvZiBFcnJvciB8fCBvYmplY3RQYXlsb2FkIGluc3RhbmNlb2YgUHJvbWlzZSB8fCB0eXBlb2Ygb2JqZWN0UGF5bG9hZC50aGVuID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIHJldHVybiBvYmplY3RQYXlsb2FkOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9iamVjdFBheWxvYWQuX2lzVmlydHVhbFN0cmVhbSkgewogICAgICAgICAgICBjb25zdCB2aXJ0dWFsU3RyZWFtID0gbmV3IF9WaXJ0dWFsU3RyZWFtKCk7CiAgICAgICAgICAgIHZpcnR1YWxTdHJlYW0uc3RyZWFtSWQgPSBvYmplY3RQYXlsb2FkLnN0cmVhbUlkOwogICAgICAgICAgICBpZiAoIXZpcnR1YWxTdHJlYW0uc2lkZSAmJiBjb21tRnVuY3Rpb25zLnNlbmRNZXRob2QpIHsKICAgICAgICAgICAgICB2aXJ0dWFsU3RyZWFtLnNpZGUgPSAicmVxdWVzdGluZyI7CiAgICAgICAgICAgICAgdmlydHVhbFN0cmVhbS5zZW5kTWV0aG9kID0gY29tbUZ1bmN0aW9ucy5zZW5kTWV0aG9kOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdmlydHVhbFN0cmVhbS5zaWRlICYmIGNvbW1GdW5jdGlvbnMudHlwZWRyb3V0ZXIpIHsKICAgICAgICAgICAgICB2aXJ0dWFsU3RyZWFtLnNpZGUgPSAicmVzcG9uZGluZyI7CiAgICAgICAgICAgICAgdmlydHVhbFN0cmVhbS50eXBlZHJvdXRlciA9IGNvbW1GdW5jdGlvbnMudHlwZWRyb3V0ZXI7CiAgICAgICAgICAgICAgY29tbUZ1bmN0aW9ucy50eXBlZHJvdXRlci5yZWdpc3RlcmVkVmlydHVhbFN0cmVhbXMuYWRkKHZpcnR1YWxTdHJlYW0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZpcnR1YWxTdHJlYW0uc3RhcnRLZWVwQWxpdmVMb29wKCk7CiAgICAgICAgICAgIHJldHVybiB2aXJ0dWFsU3RyZWFtOwogICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iamVjdFBheWxvYWQpKSB7CiAgICAgICAgICAgIGNvbnN0IHJldHVybkFycmF5ID0gW107CiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBvYmplY3RQYXlsb2FkKSB7CiAgICAgICAgICAgICAgcmV0dXJuQXJyYXkucHVzaChfVmlydHVhbFN0cmVhbS5kZWNvZGVQYXlsb2FkRnJvbU5ldHdvcmsoaXRlbSwgY29tbUZ1bmN0aW9ucykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXR1cm5BcnJheTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3RQYXlsb2FkKS5yZWR1Y2UoKGFjYywga2V5MikgPT4gewogICAgICAgICAgICAgIGFjY1trZXkyXSA9IF9WaXJ0dWFsU3RyZWFtLmRlY29kZVBheWxvYWRGcm9tTmV0d29yayhvYmplY3RQYXlsb2FkW2tleTJdLCBjb21tRnVuY3Rpb25zKTsKICAgICAgICAgICAgICByZXR1cm4gYWNjOwogICAgICAgICAgICB9LCB7fSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBvYmplY3RQYXlsb2FkOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLnN0cmVhbUlkID0gaXNvdW5pcXVlMi51bmkoKTsKICAgICAgICB0aGlzLmtlZXBBbGl2ZSA9IHRydWU7CiAgICAgICAgdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5ID0gbmV3IGRpc3RfdHNfZXhwb3J0czYuQmFja3ByZXNzdXJlZEFycmF5KDE2KTsKICAgICAgICB0aGlzLnJlY2VpdmVCYWNrcHJlc3N1cmVkQXJyYXkgPSBuZXcgZGlzdF90c19leHBvcnRzNi5CYWNrcHJlc3N1cmVkQXJyYXkoMTYpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiB0YWtlcyBjYXJlIG9mIHNlbmRpbmcKICAgICAgICovCiAgICAgIGFzeW5jIHdvcmtPblF1ZXVlKCkgewogICAgICAgIGlmICh0aGlzLndvcmtpbmdEZWZlcnJlZCkgewogICAgICAgICAgcmV0dXJuIHRoaXMud29ya2luZ0RlZmVycmVkLnByb21pc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMud29ya2luZ0RlZmVycmVkID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnNpZGUgPT09ICJyZXF1ZXN0aW5nIikgewogICAgICAgICAgbGV0IHRoaXNTaWRlSXNCYWNrcHJlc3N1cmVkID0gIXRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheS5jaGVja1NwYWNlQXZhaWxhYmxlKCk7CiAgICAgICAgICBsZXQgb3RoZXJTaWRlSGFzTmV4dCA9IGZhbHNlOwogICAgICAgICAgbGV0IG90aGVyU2lkZUlzQmFja3ByZXNzdXJlZCA9IGZhbHNlOwogICAgICAgICAgY29uc3QgZ2V0RmVlZGJhY2sgPSBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHN0cmVhbVRyID0gYXdhaXQgdGhpcy5zZW5kTWV0aG9kKHsKICAgICAgICAgICAgICBtZXRob2Q6ICIjI1ZpcnR1YWxTdHJlYW0jIyIsCiAgICAgICAgICAgICAgcmVxdWVzdDogewogICAgICAgICAgICAgICAgc3RyZWFtSWQ6IHRoaXMuc3RyZWFtSWQsCiAgICAgICAgICAgICAgICBjeWNsZUlkOiBpc291bmlxdWUyLnVuaSgpLAogICAgICAgICAgICAgICAgY3ljbGU6ICJyZXF1ZXN0IiwKICAgICAgICAgICAgICAgIG1haW5QdXJwb3NlOiAiZmVlZGJhY2siLAogICAgICAgICAgICAgICAgbmV4dDogdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LmRhdGEubGVuZ3RoID4gMCwKICAgICAgICAgICAgICAgIGJhY2twcmVzc3VyZTogIXRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheS5jaGVja1NwYWNlQXZhaWxhYmxlKCkKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHJlc3BvbnNlOiBudWxsCiAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHsKICAgICAgICAgICAgICBjb25zb2xlLmxvZygic3RyZWFtIGVuZGVkIGltbWF0dXJlbHkiKTsKICAgICAgICAgICAgICB0aGlzLmtlZXBBbGl2ZSA9IGZhbHNlOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKHN0cmVhbVRyICYmIHN0cmVhbVRyLnJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgb3RoZXJTaWRlSXNCYWNrcHJlc3N1cmVkID0gc3RyZWFtVHIucmVzcG9uc2UuYmFja3ByZXNzdXJlOwogICAgICAgICAgICAgIG90aGVyU2lkZUhhc05leHQgPSBzdHJlYW1Uci5yZXNwb25zZS5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgYXdhaXQgZ2V0RmVlZGJhY2soKTsKICAgICAgICAgIHdoaWxlICh0aGlzLnNlbmRCYWNrcHJlc3N1cmVkQXJyYXkuZGF0YS5sZW5ndGggPiAwIHx8IG90aGVyU2lkZUhhc05leHQpIHsKICAgICAgICAgICAgaWYgKG90aGVyU2lkZUlzQmFja3ByZXNzdXJlZCkgewogICAgICAgICAgICAgIHdoaWxlIChvdGhlclNpZGVJc0JhY2twcmVzc3VyZWQpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJ3YWl0aW5nIGZvciBmZWVkYmFjayBiZWNhdXNlIG9mIGJhY2twcmVzc3VyZS4uLiIpOwogICAgICAgICAgICAgICAgYXdhaXQgZGlzdF90c19leHBvcnRzMy5kZWxheUZvcig1MCk7CiAgICAgICAgICAgICAgICBhd2FpdCBnZXRGZWVkYmFjaygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgZGF0YUFyZzsKICAgICAgICAgICAgaWYgKHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS5kYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICBkYXRhQXJnID0gdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LnNoaWZ0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHN0cmVhbVRyOwogICAgICAgICAgICBzdHJlYW1UciA9IGF3YWl0IHRoaXMuc2VuZE1ldGhvZCh7CiAgICAgICAgICAgICAgbWV0aG9kOiAiIyNWaXJ0dWFsU3RyZWFtIyMiLAogICAgICAgICAgICAgIHJlcXVlc3Q6IHsKICAgICAgICAgICAgICAgIHN0cmVhbUlkOiB0aGlzLnN0cmVhbUlkLAogICAgICAgICAgICAgICAgY3ljbGVJZDogaXNvdW5pcXVlMi51bmkoKSwKICAgICAgICAgICAgICAgIGN5Y2xlOiAicmVxdWVzdCIsCiAgICAgICAgICAgICAgICBtYWluUHVycG9zZTogZGF0YUFyZyA/ICJjaHVuayIgOiAicmVhZCIsCiAgICAgICAgICAgICAgICBiYWNrcHJlc3N1cmU6IHRoaXNTaWRlSXNCYWNrcHJlc3N1cmVkLAogICAgICAgICAgICAgICAgbmV4dDogdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LmRhdGEubGVuZ3RoID4gMCwKICAgICAgICAgICAgICAgIC4uLmRhdGFBcmcgPyB7IGNodW5rRGF0YTogZGF0YUFyZyB9IDoge30KICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHJlc3BvbnNlOiBudWxsCiAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHsKICAgICAgICAgICAgICBjb25zb2xlLmxvZygic3RyZWFtIGVuZGVkIGltbWF0dXJlbHkiKTsKICAgICAgICAgICAgICB0aGlzLmtlZXBBbGl2ZSA9IGZhbHNlOwogICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKHN0cmVhbVRyICYmIHN0cmVhbVRyLnJlc3BvbnNlICYmIHN0cmVhbVRyLnJlc3BvbnNlLmNodW5rRGF0YSkgewogICAgICAgICAgICAgIHRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheS5wdXNoKHN0cmVhbVRyLnJlc3BvbnNlLmNodW5rRGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3RoZXJTaWRlSXNCYWNrcHJlc3N1cmVkID0gc3RyZWFtVHIgJiYgc3RyZWFtVHIucmVzcG9uc2UgJiYgc3RyZWFtVHIucmVzcG9uc2UuYmFja3ByZXNzdXJlOwogICAgICAgICAgICB0aGlzU2lkZUlzQmFja3ByZXNzdXJlZCA9ICF0aGlzLnJlY2VpdmVCYWNrcHJlc3N1cmVkQXJyYXkuY2hlY2tTcGFjZUF2YWlsYWJsZSgpOwogICAgICAgICAgICBvdGhlclNpZGVIYXNOZXh0ID0gc3RyZWFtVHIgJiYgc3RyZWFtVHIucmVzcG9uc2UgJiYgc3RyZWFtVHIucmVzcG9uc2UubmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy53b3JraW5nRGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgIHRoaXMud29ya2luZ0RlZmVycmVkID0gbnVsbDsKICAgICAgfQogICAgICAvKioKICAgICAgICogVGhpcyBtZXRob2QgaGFuZGxlcyB0aGUgc3RyZWFtIG9ubHkgb24gdGhlIHJlc3BvbmRpbmcgc2lkZQogICAgICAgKiBAcGFyYW0gc3RyZWFtVHJBcmcKICAgICAgICogQHJldHVybnMKICAgICAgICovCiAgICAgIGFzeW5jIGhhbmRsZVN0cmVhbVRyKHN0cmVhbVRyQXJnKSB7CiAgICAgICAgaWYgKHN0cmVhbVRyQXJnLnJlcXVlc3Qua2VlcEFsaXZlID09PSB0cnVlICYmIHRoaXMua2VlcEFsaXZlID09PSB0cnVlKSB7CiAgICAgICAgICB0aGlzLmxhc3RLZWVwQWxpdmVFdmVudCA9IERhdGUubm93KCk7CiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW1UckFyZy5yZXF1ZXN0LmtlZXBBbGl2ZSA9PT0gZmFsc2UpIHsKICAgICAgICAgIHRoaXMua2VlcEFsaXZlID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1UckFyZy5yZXF1ZXN0Lm1haW5QdXJwb3NlID09PSAia2VlcEFsaXZlIikgewogICAgICAgICAgc3RyZWFtVHJBcmcucmVzcG9uc2UgPSB7CiAgICAgICAgICAgIHN0cmVhbUlkOiB0aGlzLnN0cmVhbUlkLAogICAgICAgICAgICBjeWNsZUlkOiBzdHJlYW1UckFyZy5yZXF1ZXN0LmN5Y2xlSWQsCiAgICAgICAgICAgIGN5Y2xlOiAicmVzcG9uc2UiLAogICAgICAgICAgICBtYWluUHVycG9zZTogImtlZXBBbGl2ZSIsCiAgICAgICAgICAgIGtlZXBBbGl2ZTogdGhpcy5rZWVwQWxpdmUsCiAgICAgICAgICAgIG5leHQ6IHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS5kYXRhLmxlbmd0aCA+IDAsCiAgICAgICAgICAgIGJhY2twcmVzc3VyZTogIXRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheS5jaGVja1NwYWNlQXZhaWxhYmxlKCkKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1UckFyZy5yZXF1ZXN0Lm1haW5QdXJwb3NlID09PSAiZmVlZGJhY2siKSB7CiAgICAgICAgICBzdHJlYW1UckFyZy5yZXNwb25zZSA9IHsKICAgICAgICAgICAgc3RyZWFtSWQ6IHRoaXMuc3RyZWFtSWQsCiAgICAgICAgICAgIGN5Y2xlSWQ6IHN0cmVhbVRyQXJnLnJlcXVlc3QuY3ljbGVJZCwKICAgICAgICAgICAgY3ljbGU6ICJyZXNwb25zZSIsCiAgICAgICAgICAgIG1haW5QdXJwb3NlOiAiZmVlZGJhY2siLAogICAgICAgICAgICBuZXh0OiB0aGlzLnNlbmRCYWNrcHJlc3N1cmVkQXJyYXkuZGF0YS5sZW5ndGggPiAwLAogICAgICAgICAgICBiYWNrcHJlc3N1cmU6ICF0aGlzLnJlY2VpdmVCYWNrcHJlc3N1cmVkQXJyYXkuY2hlY2tTcGFjZUF2YWlsYWJsZSgpCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtVHJBcmcucmVxdWVzdC5tYWluUHVycG9zZSA9PT0gImNodW5rIikgewogICAgICAgICAgdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LnB1c2goc3RyZWFtVHJBcmcucmVxdWVzdC5jaHVua0RhdGEpOwogICAgICAgICAgaWYgKHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS5kYXRhLmxlbmd0aCA+IDAgJiYgc3RyZWFtVHJBcmcucmVzcG9uc2UuYmFja3ByZXNzdXJlID09PSBmYWxzZSkgewogICAgICAgICAgICBjb25zdCBkYXRhQXJnID0gdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LnNoaWZ0KCk7CiAgICAgICAgICAgIHN0cmVhbVRyQXJnLnJlc3BvbnNlID0gewogICAgICAgICAgICAgIHN0cmVhbUlkOiB0aGlzLnN0cmVhbUlkLAogICAgICAgICAgICAgIGN5Y2xlSWQ6IHN0cmVhbVRyQXJnLnJlcXVlc3QuY3ljbGVJZCwKICAgICAgICAgICAgICBjeWNsZTogInJlc3BvbnNlIiwKICAgICAgICAgICAgICBtYWluUHVycG9zZTogImNodW5rIiwKICAgICAgICAgICAgICBuZXh0OiB0aGlzLnNlbmRCYWNrcHJlc3N1cmVkQXJyYXkuZGF0YS5sZW5ndGggPiAxLAogICAgICAgICAgICAgIC8vIDEgYW5kIG5vdCAwIGJlY2F1c2Ugd2UgY2FsbCBzaGlmdCBhIGZldyBsaW5lcyBkb3duCiAgICAgICAgICAgICAgYmFja3ByZXNzdXJlOiAhdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LmNoZWNrU3BhY2VBdmFpbGFibGUoKSwKICAgICAgICAgICAgICBjaHVua0RhdGE6IHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS5zaGlmdCgpCiAgICAgICAgICAgIH07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW1UckFyZy5yZXNwb25zZSA9IHsKICAgICAgICAgICAgICBzdHJlYW1JZDogdGhpcy5zdHJlYW1JZCwKICAgICAgICAgICAgICBjeWNsZUlkOiBzdHJlYW1UckFyZy5yZXF1ZXN0LmN5Y2xlSWQsCiAgICAgICAgICAgICAgY3ljbGU6ICJyZXNwb25zZSIsCiAgICAgICAgICAgICAgbWFpblB1cnBvc2U6ICJmZWVkYmFjayIsCiAgICAgICAgICAgICAgbmV4dDogdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LmRhdGEubGVuZ3RoID4gMCwKICAgICAgICAgICAgICBiYWNrcHJlc3N1cmU6ICF0aGlzLnJlY2VpdmVCYWNrcHJlc3N1cmVkQXJyYXkuY2hlY2tTcGFjZUF2YWlsYWJsZSgpCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgICBzdHJlYW1UckFyZy5yZXF1ZXN0ID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0cmVhbVRyQXJnOwogICAgICB9CiAgICAgIC8vIGxpZmVjeWNsZSBtZXRob2RzCiAgICAgIC8qKgogICAgICAgKiBjbG9zZXMgdGhlIHZpcnR1YWwgc3RyZWFtCiAgICAgICAqLwogICAgICBhc3luYyBjbGVhbnVwKCkgewogICAgICAgIGlmICh0aGlzLnR5cGVkcm91dGVyKSB7CiAgICAgICAgICB0aGlzLnR5cGVkcm91dGVyLnJlZ2lzdGVyZWRWaXJ0dWFsU3RyZWFtcy5yZW1vdmUodGhpcyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBhIGtlZXBBbGl2ZSBsb29wIHRoYXQgd29ya3MgYWNyb3NzIHRlY2hub2xvZ2llcwogICAgICAgKi8KICAgICAgYXN5bmMgc3RhcnRLZWVwQWxpdmVMb29wKCkgewogICAgICAgIGlmICh0aGlzLnNpZGUgPT09ICJyZXNwb25kaW5nIikgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBhd2FpdCBkaXN0X3RzX2V4cG9ydHMzLmRlbGF5Rm9yKDApOwogICAgICAgIGNvbnNvbGUubG9nKGBzdGFydGluZyBrZWVwYWxpdmUgbG9vcCBvbiBzaWRlICR7dGhpcy5zaWRlfWApOwogICAgICAgIGxldCBjb3VudGVyMiA9IDA7CiAgICAgICAga2VlcEFsaXZlTG9vcDogd2hpbGUgKHRoaXMua2VlcEFsaXZlKSB7CiAgICAgICAgICBhd2FpdCB0aGlzLnRyaWdnZXJLZWVwQWxpdmUoKTsKICAgICAgICAgIGF3YWl0IGRpc3RfdHNfZXhwb3J0czMuZGVsYXlGb3IoMWUzKTsKICAgICAgICB9CiAgICAgICAgYXdhaXQgZGlzdF90c19leHBvcnRzMy5kZWxheUZvcigxZTMpOwogICAgICAgIGF3YWl0IHRoaXMuY2xlYW51cCgpOwogICAgICAgIGNvbnNvbGUubG9nKGBjbGVhbmVkIHVwIGZvciBzdHJlYW0gJHt0aGlzLnN0cmVhbUlkfWApOwogICAgICB9CiAgICAgIGFzeW5jIHRyaWdnZXJLZWVwQWxpdmUoKSB7CiAgICAgICAgaWYgKHRoaXMuc2lkZSA9PT0gInJlcXVlc3RpbmciKSB7CiAgICAgICAgICBjb25zb2xlLmxvZyhga2VlcGFsaXZlIHNlbnQuYCk7CiAgICAgICAgICBjb25zdCBzdHJlYW1UciA9IGF3YWl0IHRoaXMuc2VuZE1ldGhvZCh7CiAgICAgICAgICAgIG1ldGhvZDogIiMjVmlydHVhbFN0cmVhbSMjIiwKICAgICAgICAgICAgcmVxdWVzdDogewogICAgICAgICAgICAgIHN0cmVhbUlkOiB0aGlzLnN0cmVhbUlkLAogICAgICAgICAgICAgIGN5Y2xlSWQ6IGlzb3VuaXF1ZTIudW5pKCksCiAgICAgICAgICAgICAgY3ljbGU6ICJyZXF1ZXN0IiwKICAgICAgICAgICAgICBtYWluUHVycG9zZTogImtlZXBBbGl2ZSIsCiAgICAgICAgICAgICAga2VlcEFsaXZlOiB0aGlzLmtlZXBBbGl2ZQogICAgICAgICAgICB9LAogICAgICAgICAgICByZXNwb25zZTogbnVsbAogICAgICAgICAgfSkuY2F0Y2goKCkgPT4gewogICAgICAgICAgICB0aGlzLmtlZXBBbGl2ZSA9IGZhbHNlOwogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoc3RyZWFtVHIgJiYgc3RyZWFtVHIucmVzcG9uc2UgJiYgc3RyZWFtVHIucmVzcG9uc2Uua2VlcEFsaXZlID09PSBmYWxzZSkgewogICAgICAgICAgICB0aGlzLmtlZXBBbGl2ZSA9IGZhbHNlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5sYXN0S2VlcEFsaXZlRXZlbnQgPSBEYXRlLm5vdygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0cmVhbVRyICYmIHN0cmVhbVRyLnJlc3BvbnNlICYmIHN0cmVhbVRyLnJlc3BvbnNlLm5leHQpIHsKICAgICAgICAgICAgdGhpcy53b3JrT25RdWV1ZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMubGFzdEtlZXBBbGl2ZUV2ZW50ID4gMWU0KSB7CiAgICAgICAgICBjb25zb2xlLmxvZyhgY2xvc2luZyBzdHJlYW0gZm9yICR7dGhpcy5zdHJlYW1JZH1gKTsKICAgICAgICAgIHRoaXMua2VlcEFsaXZlID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIERhdGEgc2VuZGluZyBhbmQgcmVjZWl2aW5nCiAgICAgIGFzeW5jIHNlbmREYXRhKGRhdGFBcmcpIHsKICAgICAgICB0aGlzLnNlbmRCYWNrcHJlc3N1cmVkQXJyYXkucHVzaChkYXRhQXJnKTsKICAgICAgICB0aGlzLndvcmtPblF1ZXVlKCk7CiAgICAgICAgYXdhaXQgdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LndhaXRGb3JTcGFjZSgpOwogICAgICB9CiAgICAgIGFzeW5jIGZldGNoRGF0YSgpIHsKICAgICAgICBpZiAodGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5Lmhhc1NwYWNlKSB7CiAgICAgICAgfQogICAgICAgIGF3YWl0IHRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheS53YWl0Rm9ySXRlbXMoKTsKICAgICAgICBjb25zdCBkYXRhUGFja2FnZSA9IHRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheS5zaGlmdCgpOwogICAgICAgIHJldHVybiBkYXRhUGFja2FnZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogcmVhZHMgZnJvbSBhIFJlYWRhYmxlIGFuZCBzZW5kcyBpdCB0byB0aGUgb3RoZXIgc2lkZQogICAgICAgKiBAcGFyYW0gcmVhZGFibGVTdHJlYW1BcmcKICAgICAgICovCiAgICAgIGFzeW5jIHJlYWRGcm9tV2Vic3RyZWFtKHJlYWRhYmxlU3RyZWFtQXJnLCBjbG9zZUFmdGVyUmVhZGluZyA9IHRydWUpIHsKICAgICAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZVN0cmVhbUFyZy5nZXRSZWFkZXIoKTsKICAgICAgICBsZXQgc3RyZWFtSXNEb25lID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKCFzdHJlYW1Jc0RvbmUpIHsKICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IHZhbHVlMiwgZG9uZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTsKICAgICAgICAgIGlmICh2YWx1ZTIpIHsKICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kRGF0YSh2YWx1ZTIpOwogICAgICAgICAgfQogICAgICAgICAgc3RyZWFtSXNEb25lID0gZG9uZTsKICAgICAgICB9CiAgICAgICAgaWYgKGNsb3NlQWZ0ZXJSZWFkaW5nKSB7CiAgICAgICAgICBhd2FpdCB0aGlzLmNsb3NlKHRydWUpOwogICAgICAgIH0KICAgICAgfQogICAgICBhc3luYyB3cml0ZVRvV2Vic3RyZWFtKHdyaXRhYmxlU3RyZWFtQXJnKSB7CiAgICAgICAgY29uc3Qgd3JpdGVyID0gd3JpdGFibGVTdHJlYW1BcmcuZ2V0V3JpdGVyKCk7CiAgICAgICAgd2hpbGUgKHRoaXMua2VlcEFsaXZlIHx8IHRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheS5jaGVja0hhc0l0ZW1zKCkpIHsKICAgICAgICAgIGNvbnN0IHZhbHVlMiA9IGF3YWl0IHRoaXMuZmV0Y2hEYXRhKCk7CiAgICAgICAgICBpZiAodmFsdWUyID09PSBjbG9zaW5nQml0KSB7CiAgICAgICAgICAgIHdyaXRlci5yZWxlYXNlTG9jaygpOwogICAgICAgICAgICBhd2FpdCB3cml0YWJsZVN0cmVhbUFyZy5jbG9zZSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGF3YWl0IHdyaXRlci53cml0ZSh2YWx1ZTIpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogY2xvc2VzIHRoZSBzdHJlYW0KICAgICAgICogaWYgc2VuZENsb3NpbmdCaXRBcmcgaXMgdHJ1ZSwgdGhlIHN0cmVhbSB3aWxsIHNlbmQgYSBjbG9zaW5nIGJpdAogICAgICAgKiBAcGFyYW0gc2VuZENsb3NpbmdCaXRBcmcKICAgICAgICovCiAgICAgIGFzeW5jIGNsb3NlKHNlbmRDbG9zaW5nQml0QXJnID0gZmFsc2UpIHsKICAgICAgICBpZiAoc2VuZENsb3NpbmdCaXRBcmcpIHsKICAgICAgICAgIHRoaXMuc2VuZERhdGEoY2xvc2luZ0JpdCk7CiAgICAgICAgfQogICAgICAgIHRoaXMua2VlcEFsaXZlID0gZmFsc2U7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4yLjUvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2NsYXNzZXMudHlwZWR0YXJnZXQuanMKdmFyIFR5cGVkVGFyZ2V0Owp2YXIgaW5pdF9jbGFzc2VzX3R5cGVkdGFyZ2V0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGFwaS5nbG9iYWwrdHlwZWRyZXF1ZXN0QDMuMi41L25vZGVfbW9kdWxlcy9AYXBpLmdsb2JhbC90eXBlZHJlcXVlc3QvZGlzdF90cy9jbGFzc2VzLnR5cGVkdGFyZ2V0LmpzIigpIHsKICAgIGluaXRfY2xhc3Nlc190eXBlZHJvdXRlcigpOwogICAgaW5pdF9wbHVnaW5zKCk7CiAgICBUeXBlZFRhcmdldCA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3Iob3B0aW9uc0FyZykgewogICAgICAgIGlmIChvcHRpb25zQXJnLnBvc3RNZXRob2RXaXRoVHlwZWRSb3V0ZXIgJiYgIW9wdGlvbnNBcmcudHlwZWRSb3V0ZXJSZWYpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigieW91IGhhdmUgdG8gc3BlY2lmeSBhIHR5cGVkcm91dGVyIHdoZW4gdXNpbmcgcG9zdG1ldGhvZCB3aXRoIHR5cGVkcm91dGVyIik7CiAgICAgICAgfQogICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNBcmc7CiAgICAgIH0KICAgICAgYXN5bmMgcG9zdChwYXlsb2FkQXJnKSB7CiAgICAgICAgbGV0IHJlc3BvbnNlSW50ZXJlc3Q7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50eXBlZFJvdXRlclJlZikgewogICAgICAgICAgcmVzcG9uc2VJbnRlcmVzdCA9IGF3YWl0IHRoaXMub3B0aW9ucy50eXBlZFJvdXRlclJlZi5maXJlRXZlbnRJbnRlcmVzdE1hcC5hZGRJbnRlcmVzdChwYXlsb2FkQXJnLmNvcnJlbGF0aW9uLmlkLCBwYXlsb2FkQXJnKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcG9zdE1ldGhvZCA9IHRoaXMub3B0aW9ucy5wb3N0TWV0aG9kIHx8IHRoaXMub3B0aW9ucy5wb3N0TWV0aG9kV2l0aFR5cGVkUm91dGVyOwogICAgICAgIGNvbnN0IHBvc3RNZXRob2RSZXR1cm5WYWx1ZSA9IGF3YWl0IHBvc3RNZXRob2QocGF5bG9hZEFyZyk7CiAgICAgICAgbGV0IHJlc3BvbnNlQm9keTsKICAgICAgICBpZiAocmVzcG9uc2VJbnRlcmVzdCkgewogICAgICAgICAgcmVzcG9uc2VCb2R5ID0gYXdhaXQgcmVzcG9uc2VJbnRlcmVzdC5pbnRlcmVzdEZ1bGxmaWxsZWQ7CiAgICAgICAgfSBlbHNlIGlmIChwb3N0TWV0aG9kUmV0dXJuVmFsdWUpIHsKICAgICAgICAgIHJlc3BvbnNlQm9keSA9IHBvc3RNZXRob2RSZXR1cm5WYWx1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzcG9uc2VCb2R5ID0gcGF5bG9hZEFyZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3BvbnNlQm9keTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkcmVxdWVzdEAzLjIuNS9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRyZXF1ZXN0L2Rpc3RfdHMvY2xhc3Nlcy50eXBlZHJlcXVlc3QuanMKZnVuY3Rpb24gY2FsbEdsb2JhbEhvb2soaG9va05hbWUsIGVudHJ5KSB7CiAgdHJ5IHsKICAgIFR5cGVkUm91dGVyLmdsb2JhbEhvb2tzW2hvb2tOYW1lXT8uKGVudHJ5KTsKICB9IGNhdGNoIChlcnIpIHsKICAgIGNvbnNvbGUuZXJyb3IoYFR5cGVkUmVxdWVzdCBob29rIGVycm9yICgke2hvb2tOYW1lfSk6YCwgZXJyKTsKICB9Cn0KdmFyIHdlYnJlcXVlc3RJbnN0YW5jZSwgVHlwZWRSZXF1ZXN0Owp2YXIgaW5pdF9jbGFzc2VzX3R5cGVkcmVxdWVzdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkcmVxdWVzdEAzLjIuNS9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRyZXF1ZXN0L2Rpc3RfdHMvY2xhc3Nlcy50eXBlZHJlcXVlc3QuanMiKCkgewogICAgaW5pdF9wbHVnaW5zKCk7CiAgICBpbml0X2NsYXNzZXNfdmlydHVhbHN0cmVhbSgpOwogICAgaW5pdF9jbGFzc2VzX3R5cGVkcmVzcG9uc2VlcnJvcigpOwogICAgaW5pdF9jbGFzc2VzX3R5cGVkcm91dGVyKCk7CiAgICBpbml0X2NsYXNzZXNfdHlwZWR0YXJnZXQoKTsKICAgIHdlYnJlcXVlc3RJbnN0YW5jZSA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxNC5XZWJSZXF1ZXN0KCk7CiAgICBUeXBlZFJlcXVlc3QgPSBjbGFzcyB7CiAgICAgIC8qKgogICAgICAgKiBAcGFyYW0gcG9zdEVuZFBvaW50QXJnCiAgICAgICAqIEBwYXJhbSBtZXRob2RBcmcKICAgICAgICovCiAgICAgIGNvbnN0cnVjdG9yKHBvc3RUYXJnZXQsIG1ldGhvZEFyZykgewogICAgICAgIHRoaXMuc2tpcEhvb2tzID0gZmFsc2U7CiAgICAgICAgaWYgKHR5cGVvZiBwb3N0VGFyZ2V0ID09PSAic3RyaW5nIikgewogICAgICAgICAgdGhpcy51cmxFbmRQb2ludCA9IHBvc3RUYXJnZXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMudHlwZWRUYXJnZXQgPSBwb3N0VGFyZ2V0OwogICAgICAgIH0KICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZEFyZzsKICAgICAgfQogICAgICAvKioKICAgICAgICogZmlyZXMgdGhlIHJlcXVlc3QKICAgICAgICovCiAgICAgIGFzeW5jIGZpcmUoZmlyZUFyZywgdXNlQ2FjaGVBcmcgPSBmYWxzZSkgewogICAgICAgIGNvbnN0IHJlcXVlc3RTdGFydFRpbWUgPSBEYXRlLm5vdygpOwogICAgICAgIGxldCBwYXlsb2FkU2VuZGluZyA9IHsKICAgICAgICAgIG1ldGhvZDogdGhpcy5tZXRob2QsCiAgICAgICAgICByZXF1ZXN0OiBmaXJlQXJnLAogICAgICAgICAgcmVzcG9uc2U6IG51bGwsCiAgICAgICAgICBjb3JyZWxhdGlvbjogewogICAgICAgICAgICBpZDogaXNvdW5pcXVlMi51bmkoKSwKICAgICAgICAgICAgcGhhc2U6ICJyZXF1ZXN0IgogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcGF5bG9hZFNlbmRpbmcgPSBWaXJ0dWFsU3RyZWFtLmVuY29kZVBheWxvYWRGb3JOZXR3b3JrKHBheWxvYWRTZW5kaW5nLCB7CiAgICAgICAgICBzZW5kTWV0aG9kOiAocGF5bG9hZEFyZykgPT4gewogICAgICAgICAgICByZXR1cm4gdGhpcy5wb3N0VHJPYmplY3QocGF5bG9hZEFyZyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKCF0aGlzLnNraXBIb29rcykgewogICAgICAgICAgY2FsbEdsb2JhbEhvb2soIm9uT3V0Z29pbmdSZXF1ZXN0IiwgewogICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBwYXlsb2FkU2VuZGluZy5jb3JyZWxhdGlvbi5pZCwKICAgICAgICAgICAgbWV0aG9kOiB0aGlzLm1ldGhvZCwKICAgICAgICAgICAgZGlyZWN0aW9uOiAib3V0Z29pbmciLAogICAgICAgICAgICBwaGFzZTogInJlcXVlc3QiLAogICAgICAgICAgICB0aW1lc3RhbXA6IHJlcXVlc3RTdGFydFRpbWUsCiAgICAgICAgICAgIHBheWxvYWQ6IGZpcmVBcmcKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBsZXQgcGF5bG9hZFJlY2VpdmluZzsKICAgICAgICBwYXlsb2FkUmVjZWl2aW5nID0gYXdhaXQgdGhpcy5wb3N0VHJPYmplY3QocGF5bG9hZFNlbmRpbmcsIHVzZUNhY2hlQXJnKTsKICAgICAgICBwYXlsb2FkUmVjZWl2aW5nID0gVmlydHVhbFN0cmVhbS5kZWNvZGVQYXlsb2FkRnJvbU5ldHdvcmsocGF5bG9hZFJlY2VpdmluZywgewogICAgICAgICAgc2VuZE1ldGhvZDogKHBheWxvYWRBcmcpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zdFRyT2JqZWN0KHBheWxvYWRBcmcpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmICghdGhpcy5za2lwSG9va3MpIHsKICAgICAgICAgIGNhbGxHbG9iYWxIb29rKCJvbkluY29taW5nUmVzcG9uc2UiLCB7CiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHBheWxvYWRTZW5kaW5nLmNvcnJlbGF0aW9uLmlkLAogICAgICAgICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLAogICAgICAgICAgICBkaXJlY3Rpb246ICJpbmNvbWluZyIsCiAgICAgICAgICAgIHBoYXNlOiAicmVzcG9uc2UiLAogICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksCiAgICAgICAgICAgIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSByZXF1ZXN0U3RhcnRUaW1lLAogICAgICAgICAgICBwYXlsb2FkOiBwYXlsb2FkUmVjZWl2aW5nPy5yZXNwb25zZSwKICAgICAgICAgICAgZXJyb3I6IHBheWxvYWRSZWNlaXZpbmc/LmVycm9yPy50ZXh0CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBheWxvYWRSZWNlaXZpbmcucmVzcG9uc2U7CiAgICAgIH0KICAgICAgYXN5bmMgcG9zdFRyT2JqZWN0KHBheWxvYWRTZW5kaW5nQXJnLCB1c2VDYWNoZUFyZyA9IGZhbHNlKSB7CiAgICAgICAgbGV0IHBheWxvYWRSZWNlaXZpbmc7CiAgICAgICAgaWYgKHRoaXMudXJsRW5kUG9pbnQpIHsKICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2VicmVxdWVzdEluc3RhbmNlLnBvc3RKc29uKHRoaXMudXJsRW5kUG9pbnQsIHBheWxvYWRTZW5kaW5nQXJnLCB1c2VDYWNoZUFyZyk7CiAgICAgICAgICBwYXlsb2FkUmVjZWl2aW5nID0gcmVzcG9uc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHBheWxvYWRSZWNlaXZpbmcgPSBhd2FpdCB0aGlzLnR5cGVkVGFyZ2V0LnBvc3QocGF5bG9hZFNlbmRpbmdBcmcpOwogICAgICAgIH0KICAgICAgICBpZiAocGF5bG9hZFJlY2VpdmluZy5lcnJvcikgewogICAgICAgICAgY29uc29sZS5lcnJvcihgbWV0aG9kOiA+PiR7dGhpcy5tZXRob2R9PDwgZ290IGFuIEVSUk9SOiAiJHtwYXlsb2FkUmVjZWl2aW5nLmVycm9yLnRleHR9IiB3aXRoIGRhdGEgJHtKU09OLnN0cmluZ2lmeShwYXlsb2FkUmVjZWl2aW5nLmVycm9yLmRhdGEsIG51bGwsIDIpfWApOwogICAgICAgICAgaWYgKCFwYXlsb2FkUmVjZWl2aW5nLnJldHJ5KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlZFJlc3BvbnNlRXJyb3IocGF5bG9hZFJlY2VpdmluZy5lcnJvci50ZXh0LCBwYXlsb2FkUmVjZWl2aW5nLmVycm9yLmRhdGEpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChwYXlsb2FkUmVjZWl2aW5nLnJldHJ5KSB7CiAgICAgICAgICBjb25zb2xlLmxvZyhgc2VydmVyIHJlcXVlc3RlZCByZXRyeSBmb3IgdGhlIGZvbGxvd2luZyByZWFzb246ICR7cGF5bG9hZFJlY2VpdmluZy5yZXRyeS5yZWFzb259YCk7CiAgICAgICAgICBhd2FpdCBkaXN0X3RzX2V4cG9ydHMzLmRlbGF5Rm9yKHBheWxvYWRSZWNlaXZpbmcucmV0cnkud2FpdEZvck1zKTsKICAgICAgICAgIHBheWxvYWRSZWNlaXZpbmcgPSBhd2FpdCB0aGlzLnBvc3RUck9iamVjdChwYXlsb2FkU2VuZGluZ0FyZywgdXNlQ2FjaGVBcmcpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGF5bG9hZFJlY2VpdmluZzsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkcmVxdWVzdEAzLjIuNS9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRyZXF1ZXN0L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czE1ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czE1LCB7CiAgVHlwZWRIYW5kbGVyOiAoKSA9PiBUeXBlZEhhbmRsZXIsCiAgVHlwZWRSZXF1ZXN0OiAoKSA9PiBUeXBlZFJlcXVlc3QsCiAgVHlwZWRSZXNwb25zZUVycm9yOiAoKSA9PiBUeXBlZFJlc3BvbnNlRXJyb3IsCiAgVHlwZWRSb3V0ZXI6ICgpID0+IFR5cGVkUm91dGVyLAogIFR5cGVkVGFyZ2V0OiAoKSA9PiBUeXBlZFRhcmdldCwKICBWaXJ0dWFsU3RyZWFtOiAoKSA9PiBWaXJ0dWFsU3RyZWFtCn0pOwp2YXIgaW5pdF9kaXN0X3RzMTUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4yLjUvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfY2xhc3Nlc190eXBlZHJlcXVlc3QoKTsKICAgIGluaXRfY2xhc3Nlc190eXBlZGhhbmRsZXIoKTsKICAgIGluaXRfY2xhc3Nlc190eXBlZHJvdXRlcigpOwogICAgaW5pdF9jbGFzc2VzX3R5cGVkcmVzcG9uc2VlcnJvcigpOwogICAgaW5pdF9jbGFzc2VzX3R5cGVkdGFyZ2V0KCk7CiAgICBpbml0X2NsYXNzZXNfdmlydHVhbHN0cmVhbSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL3V0aWwuanMKZnVuY3Rpb24gaXNQcm9taXNlMihvYmopIHsKICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmoudGhlbiA9PT0gImZ1bmN0aW9uIjsKfQpmdW5jdGlvbiBzbGVlcCh0aW1lLCByZXNvbHZlV2l0aCkgewogIGlmICghdGltZSkgdGltZSA9IDA7CiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcykgewogICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiByZXMocmVzb2x2ZVdpdGgpOwogICAgfSwgdGltZSk7CiAgfSk7Cn0KZnVuY3Rpb24gcmFuZG9tSW50KG1pbjMsIG1heDMpIHsKICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heDMgLSBtaW4zICsgMSkgKyBtaW4zKTsKfQpmdW5jdGlvbiByYW5kb21Ub2tlbigpIHsKICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIpOwp9CmZ1bmN0aW9uIG1pY3JvU2Vjb25kcygpIHsKICB2YXIgcmV0ID0gRGF0ZS5ub3coKSAqIDFlMzsKICBpZiAocmV0IDw9IGxhc3RNcykgewogICAgcmV0ID0gbGFzdE1zICsgMTsKICB9CiAgbGFzdE1zID0gcmV0OwogIHJldHVybiByZXQ7Cn0KZnVuY3Rpb24gc3VwcG9ydHNXZWJMb2NrQVBJKCkgewogIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgbmF2aWdhdG9yLmxvY2tzICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgbmF2aWdhdG9yLmxvY2tzLnJlcXVlc3QgPT09ICJmdW5jdGlvbiIpIHsKICAgIHJldHVybiB0cnVlOwogIH0gZWxzZSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CnZhciBQUk9NSVNFX1JFU09MVkVEX0ZBTFNFLCBQUk9NSVNFX1JFU09MVkVEX1RSVUUsIFBST01JU0VfUkVTT0xWRURfVk9JRCwgbGFzdE1zOwp2YXIgaW5pdF91dGlsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL3V0aWwuanMiKCkgewogICAgUFJPTUlTRV9SRVNPTFZFRF9GQUxTRSA9IFByb21pc2UucmVzb2x2ZShmYWxzZSk7CiAgICBQUk9NSVNFX1JFU09MVkVEX1RSVUUgPSBQcm9taXNlLnJlc29sdmUodHJ1ZSk7CiAgICBQUk9NSVNFX1JFU09MVkVEX1ZPSUQgPSBQcm9taXNlLnJlc29sdmUoKTsKICAgIGxhc3RNcyA9IDA7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvbWV0aG9kcy9uYXRpdmUuanMKZnVuY3Rpb24gY3JlYXRlKGNoYW5uZWxOYW1lKSB7CiAgdmFyIHN0YXRlMTAgPSB7CiAgICB0aW1lOiBtaWNyb1NlY29uZHMoKSwKICAgIG1lc3NhZ2VzQ2FsbGJhY2s6IG51bGwsCiAgICBiYzogbmV3IEJyb2FkY2FzdENoYW5uZWwoY2hhbm5lbE5hbWUpLAogICAgc3ViRm5zOiBbXQogICAgLy8gc3Vic2NyaWJlckZ1bmN0aW9ucwogIH07CiAgc3RhdGUxMC5iYy5vbm1lc3NhZ2UgPSBmdW5jdGlvbihtc2dFdmVudCkgewogICAgaWYgKHN0YXRlMTAubWVzc2FnZXNDYWxsYmFjaykgewogICAgICBzdGF0ZTEwLm1lc3NhZ2VzQ2FsbGJhY2sobXNnRXZlbnQuZGF0YSk7CiAgICB9CiAgfTsKICByZXR1cm4gc3RhdGUxMDsKfQpmdW5jdGlvbiBjbG9zZShjaGFubmVsU3RhdGUpIHsKICBjaGFubmVsU3RhdGUuYmMuY2xvc2UoKTsKICBjaGFubmVsU3RhdGUuc3ViRm5zID0gW107Cn0KZnVuY3Rpb24gcG9zdE1lc3NhZ2UoY2hhbm5lbFN0YXRlLCBtZXNzYWdlSnNvbikgewogIHRyeSB7CiAgICBjaGFubmVsU3RhdGUuYmMucG9zdE1lc3NhZ2UobWVzc2FnZUpzb24sIGZhbHNlKTsKICAgIHJldHVybiBQUk9NSVNFX1JFU09MVkVEX1ZPSUQ7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTsKICB9Cn0KZnVuY3Rpb24gb25NZXNzYWdlKGNoYW5uZWxTdGF0ZSwgZm4pIHsKICBjaGFubmVsU3RhdGUubWVzc2FnZXNDYWxsYmFjayA9IGZuOwp9CmZ1bmN0aW9uIGNhbkJlVXNlZCgpIHsKICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICJ1bmRlZmluZWQiICYmIGdsb2JhbFRoaXMuRGVubyAmJiBnbG9iYWxUaGlzLkRlbm8uYXJncykgewogICAgcmV0dXJuIHRydWU7CiAgfQogIGlmICgodHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgfHwgdHlwZW9mIHNlbGYgIT09ICJ1bmRlZmluZWQiKSAmJiB0eXBlb2YgQnJvYWRjYXN0Q2hhbm5lbCA9PT0gImZ1bmN0aW9uIikgewogICAgaWYgKEJyb2FkY2FzdENoYW5uZWwuX3B1YmtleSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkJyb2FkY2FzdENoYW5uZWw6IERvIG5vdCBvdmVyd3JpdGUgd2luZG93LkJyb2FkY2FzdENoYW5uZWwgd2l0aCB0aGlzIG1vZHVsZSwgdGhpcyBpcyBub3QgYSBwb2x5ZmlsbCIpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfSBlbHNlIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KZnVuY3Rpb24gYXZlcmFnZVJlc3BvbnNlVGltZSgpIHsKICByZXR1cm4gMTUwOwp9CnZhciBtaWNyb1NlY29uZHMyLCB0eXBlLCBOYXRpdmVNZXRob2Q7CnZhciBpbml0X25hdGl2ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2Jyb2FkY2FzdC1jaGFubmVsQDcuMy4wL25vZGVfbW9kdWxlcy9icm9hZGNhc3QtY2hhbm5lbC9kaXN0L2VzYnJvd3Nlci9tZXRob2RzL25hdGl2ZS5qcyIoKSB7CiAgICBpbml0X3V0aWwoKTsKICAgIG1pY3JvU2Vjb25kczIgPSBtaWNyb1NlY29uZHM7CiAgICB0eXBlID0gIm5hdGl2ZSI7CiAgICBOYXRpdmVNZXRob2QgPSB7CiAgICAgIGNyZWF0ZSwKICAgICAgY2xvc2UsCiAgICAgIG9uTWVzc2FnZSwKICAgICAgcG9zdE1lc3NhZ2UsCiAgICAgIGNhbkJlVXNlZCwKICAgICAgdHlwZSwKICAgICAgYXZlcmFnZVJlc3BvbnNlVGltZSwKICAgICAgbWljcm9TZWNvbmRzOiBtaWNyb1NlY29uZHMyCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vb2JsaXZpb3VzLXNldEAyLjAuMC9ub2RlX21vZHVsZXMvb2JsaXZpb3VzLXNldC9kaXN0L2VzbS9zcmMvaW5kZXguanMKZnVuY3Rpb24gcmVtb3ZlVG9vT2xkVmFsdWVzKG9ibGl2aW91c1NldCkgewogIGNvbnN0IG9sZGVyVGhlbiA9IG5vdygpIC0gb2JsaXZpb3VzU2V0LnR0bDsKICBjb25zdCBpdGVyYXRvcjIgPSBvYmxpdmlvdXNTZXQubWFwW1N5bWJvbC5pdGVyYXRvcl0oKTsKICB3aGlsZSAodHJ1ZSkgewogICAgY29uc3QgbmV4dDIgPSBpdGVyYXRvcjIubmV4dCgpLnZhbHVlOwogICAgaWYgKCFuZXh0MikgewogICAgICBicmVhazsKICAgIH0KICAgIGNvbnN0IHZhbHVlMiA9IG5leHQyWzBdOwogICAgY29uc3QgdGltZSA9IG5leHQyWzFdOwogICAgaWYgKHRpbWUgPCBvbGRlclRoZW4pIHsKICAgICAgb2JsaXZpb3VzU2V0Lm1hcC5kZWxldGUodmFsdWUyKTsKICAgIH0gZWxzZSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KfQpmdW5jdGlvbiBub3coKSB7CiAgcmV0dXJuIERhdGUubm93KCk7Cn0KdmFyIE9ibGl2aW91c1NldDsKdmFyIGluaXRfc3JjID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vb2JsaXZpb3VzLXNldEAyLjAuMC9ub2RlX21vZHVsZXMvb2JsaXZpb3VzLXNldC9kaXN0L2VzbS9zcmMvaW5kZXguanMiKCkgewogICAgT2JsaXZpb3VzU2V0ID0gY2xhc3MgewogICAgICB0dGw7CiAgICAgIG1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgIC8qKgogICAgICAgKiBDcmVhdGluZyBjYWxscyB0byBzZXRUaW1lb3V0KCkgaXMgZXhwZW5zaXZlLAogICAgICAgKiBzbyB3ZSBvbmx5IGRvIHRoYXQgaWYgdGhlcmUgaXMgbm90IHRpbWVvdXQgYWxyZWFkeSBvcGVuLgogICAgICAgKi8KICAgICAgX3RvID0gZmFsc2U7CiAgICAgIGNvbnN0cnVjdG9yKHR0bCkgewogICAgICAgIHRoaXMudHRsID0gdHRsOwogICAgICB9CiAgICAgIGhhcyh2YWx1ZTIpIHsKICAgICAgICBjb25zdCB2YWx1ZVRpbWUgPSB0aGlzLm1hcC5nZXQodmFsdWUyKTsKICAgICAgICBpZiAodHlwZW9mIHZhbHVlVGltZSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlVGltZSA8IG5vdygpIC0gdGhpcy50dGwpIHsKICAgICAgICAgIHRoaXMubWFwLmRlbGV0ZSh2YWx1ZTIpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBhZGQodmFsdWUyKSB7CiAgICAgICAgdGhpcy5tYXAuZGVsZXRlKHZhbHVlMik7CiAgICAgICAgdGhpcy5tYXAuc2V0KHZhbHVlMiwgbm93KCkpOwogICAgICAgIGlmICghdGhpcy5fdG8pIHsKICAgICAgICAgIHRoaXMuX3RvID0gdHJ1ZTsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICB0aGlzLl90byA9IGZhbHNlOwogICAgICAgICAgICByZW1vdmVUb29PbGRWYWx1ZXModGhpcyk7CiAgICAgICAgICB9LCAwKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2xlYXIoKSB7CiAgICAgICAgdGhpcy5tYXAuY2xlYXIoKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Jyb2FkY2FzdC1jaGFubmVsQDcuMy4wL25vZGVfbW9kdWxlcy9icm9hZGNhc3QtY2hhbm5lbC9kaXN0L2VzYnJvd3Nlci9vcHRpb25zLmpzCmZ1bmN0aW9uIGZpbGxPcHRpb25zV2l0aERlZmF1bHRzKCkgewogIHZhciBvcmlnaW5hbE9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1swXSA6IHt9OwogIHZhciBvcHRpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvcmlnaW5hbE9wdGlvbnMpKTsKICBpZiAodHlwZW9mIG9wdGlvbnMud2ViV29ya2VyU3VwcG9ydCA9PT0gInVuZGVmaW5lZCIpIG9wdGlvbnMud2ViV29ya2VyU3VwcG9ydCA9IHRydWU7CiAgaWYgKCFvcHRpb25zLmlkYikgb3B0aW9ucy5pZGIgPSB7fTsKICBpZiAoIW9wdGlvbnMuaWRiLnR0bCkgb3B0aW9ucy5pZGIudHRsID0gMWUzICogNDU7CiAgaWYgKCFvcHRpb25zLmlkYi5mYWxsYmFja0ludGVydmFsKSBvcHRpb25zLmlkYi5mYWxsYmFja0ludGVydmFsID0gMTUwOwogIGlmIChvcmlnaW5hbE9wdGlvbnMuaWRiICYmIHR5cGVvZiBvcmlnaW5hbE9wdGlvbnMuaWRiLm9uY2xvc2UgPT09ICJmdW5jdGlvbiIpIG9wdGlvbnMuaWRiLm9uY2xvc2UgPSBvcmlnaW5hbE9wdGlvbnMuaWRiLm9uY2xvc2U7CiAgaWYgKCFvcHRpb25zLmxvY2Fsc3RvcmFnZSkgb3B0aW9ucy5sb2NhbHN0b3JhZ2UgPSB7fTsKICBpZiAoIW9wdGlvbnMubG9jYWxzdG9yYWdlLnJlbW92ZVRpbWVvdXQpIG9wdGlvbnMubG9jYWxzdG9yYWdlLnJlbW92ZVRpbWVvdXQgPSAxZTMgKiA2MDsKICBpZiAob3JpZ2luYWxPcHRpb25zLm1ldGhvZHMpIG9wdGlvbnMubWV0aG9kcyA9IG9yaWdpbmFsT3B0aW9ucy5tZXRob2RzOwogIGlmICghb3B0aW9ucy5ub2RlKSBvcHRpb25zLm5vZGUgPSB7fTsKICBpZiAoIW9wdGlvbnMubm9kZS50dGwpIG9wdGlvbnMubm9kZS50dGwgPSAxZTMgKiA2MCAqIDI7CiAgaWYgKCFvcHRpb25zLm5vZGUubWF4UGFyYWxsZWxXcml0ZXMpIG9wdGlvbnMubm9kZS5tYXhQYXJhbGxlbFdyaXRlcyA9IDIwNDg7CiAgaWYgKHR5cGVvZiBvcHRpb25zLm5vZGUudXNlRmFzdFBhdGggPT09ICJ1bmRlZmluZWQiKSBvcHRpb25zLm5vZGUudXNlRmFzdFBhdGggPSB0cnVlOwogIHJldHVybiBvcHRpb25zOwp9CnZhciBpbml0X29wdGlvbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvb3B0aW9ucy5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvbWV0aG9kcy9pbmRleGVkLWRiLmpzCmZ1bmN0aW9uIGdldElkYigpIHsKICBpZiAodHlwZW9mIGluZGV4ZWREQiAhPT0gInVuZGVmaW5lZCIpIHJldHVybiBpbmRleGVkREI7CiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiKSB7CiAgICBpZiAodHlwZW9mIHdpbmRvdy5tb3pJbmRleGVkREIgIT09ICJ1bmRlZmluZWQiKSByZXR1cm4gd2luZG93Lm1vekluZGV4ZWREQjsKICAgIGlmICh0eXBlb2Ygd2luZG93LndlYmtpdEluZGV4ZWREQiAhPT0gInVuZGVmaW5lZCIpIHJldHVybiB3aW5kb3cud2Via2l0SW5kZXhlZERCOwogICAgaWYgKHR5cGVvZiB3aW5kb3cubXNJbmRleGVkREIgIT09ICJ1bmRlZmluZWQiKSByZXR1cm4gd2luZG93Lm1zSW5kZXhlZERCOwogIH0KICByZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gY29tbWl0SW5kZXhlZERCVHJhbnNhY3Rpb24odHgpIHsKICBpZiAodHguY29tbWl0KSB7CiAgICB0eC5jb21taXQoKTsKICB9Cn0KZnVuY3Rpb24gY3JlYXRlRGF0YWJhc2UoY2hhbm5lbE5hbWUpIHsKICB2YXIgSW5kZXhlZERCID0gZ2V0SWRiKCk7CiAgdmFyIGRiTmFtZSA9IERCX1BSRUZJWCArIGNoYW5uZWxOYW1lOwogIHZhciBvcGVuUmVxdWVzdCA9IEluZGV4ZWREQi5vcGVuKGRiTmFtZSk7CiAgb3BlblJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gZnVuY3Rpb24oZXYpIHsKICAgIHZhciBkYiA9IGV2LnRhcmdldC5yZXN1bHQ7CiAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShPQkpFQ1RfU1RPUkVfSUQsIHsKICAgICAga2V5UGF0aDogImlkIiwKICAgICAgYXV0b0luY3JlbWVudDogdHJ1ZQogICAgfSk7CiAgfTsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzLCByZWopIHsKICAgIG9wZW5SZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbihldikgewogICAgICByZXR1cm4gcmVqKGV2KTsKICAgIH07CiAgICBvcGVuUmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbigpIHsKICAgICAgcmVzKG9wZW5SZXF1ZXN0LnJlc3VsdCk7CiAgICB9OwogIH0pOwp9CmZ1bmN0aW9uIHdyaXRlTWVzc2FnZShkYiwgcmVhZGVyVXVpZCwgbWVzc2FnZUpzb24pIHsKICB2YXIgdGltZSA9IERhdGUubm93KCk7CiAgdmFyIHdyaXRlT2JqZWN0ID0gewogICAgdXVpZDogcmVhZGVyVXVpZCwKICAgIHRpbWUsCiAgICBkYXRhOiBtZXNzYWdlSnNvbgogIH07CiAgdmFyIHR4ID0gZGIudHJhbnNhY3Rpb24oW09CSkVDVF9TVE9SRV9JRF0sICJyZWFkd3JpdGUiLCBUUkFOU0FDVElPTl9TRVRUSU5HUyk7CiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcywgcmVqKSB7CiAgICB0eC5vbmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiByZXMoKTsKICAgIH07CiAgICB0eC5vbmVycm9yID0gZnVuY3Rpb24oZXYpIHsKICAgICAgcmV0dXJuIHJlaihldik7CiAgICB9OwogICAgdmFyIG9iamVjdFN0b3JlID0gdHgub2JqZWN0U3RvcmUoT0JKRUNUX1NUT1JFX0lEKTsKICAgIG9iamVjdFN0b3JlLmFkZCh3cml0ZU9iamVjdCk7CiAgICBjb21taXRJbmRleGVkREJUcmFuc2FjdGlvbih0eCk7CiAgfSk7Cn0KZnVuY3Rpb24gZ2V0QWxsTWVzc2FnZXMoZGIpIHsKICB2YXIgdHggPSBkYi50cmFuc2FjdGlvbihPQkpFQ1RfU1RPUkVfSUQsICJyZWFkb25seSIsIFRSQU5TQUNUSU9OX1NFVFRJTkdTKTsKICB2YXIgb2JqZWN0U3RvcmUgPSB0eC5vYmplY3RTdG9yZShPQkpFQ1RfU1RPUkVfSUQpOwogIHZhciByZXQgPSBbXTsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzKSB7CiAgICBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKCkub25zdWNjZXNzID0gZnVuY3Rpb24oZXYpIHsKICAgICAgdmFyIGN1cnNvciA9IGV2LnRhcmdldC5yZXN1bHQ7CiAgICAgIGlmIChjdXJzb3IpIHsKICAgICAgICByZXQucHVzaChjdXJzb3IudmFsdWUpOwogICAgICAgIGN1cnNvclsiY29udGludWUiXSgpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbW1pdEluZGV4ZWREQlRyYW5zYWN0aW9uKHR4KTsKICAgICAgICByZXMocmV0KTsKICAgICAgfQogICAgfTsKICB9KTsKfQpmdW5jdGlvbiBnZXRNZXNzYWdlc0hpZ2hlclRoYW4oZGIsIGxhc3RDdXJzb3JJZCkgewogIHZhciB0eCA9IGRiLnRyYW5zYWN0aW9uKE9CSkVDVF9TVE9SRV9JRCwgInJlYWRvbmx5IiwgVFJBTlNBQ1RJT05fU0VUVElOR1MpOwogIHZhciBvYmplY3RTdG9yZSA9IHR4Lm9iamVjdFN0b3JlKE9CSkVDVF9TVE9SRV9JRCk7CiAgdmFyIHJldCA9IFtdOwogIHZhciBrZXlSYW5nZVZhbHVlID0gSURCS2V5UmFuZ2UuYm91bmQobGFzdEN1cnNvcklkICsgMSwgSW5maW5pdHkpOwogIGlmIChvYmplY3RTdG9yZS5nZXRBbGwpIHsKICAgIHZhciBnZXRBbGxSZXF1ZXN0ID0gb2JqZWN0U3RvcmUuZ2V0QWxsKGtleVJhbmdlVmFsdWUpOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcywgcmVqKSB7CiAgICAgIGdldEFsbFJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uKGVycikgewogICAgICAgIHJldHVybiByZWooZXJyKTsKICAgICAgfTsKICAgICAgZ2V0QWxsUmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbihlMTEpIHsKICAgICAgICByZXMoZTExLnRhcmdldC5yZXN1bHQpOwogICAgICB9OwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIG9wZW5DdXJzb3IoKSB7CiAgICB0cnkgewogICAgICBrZXlSYW5nZVZhbHVlID0gSURCS2V5UmFuZ2UuYm91bmQobGFzdEN1cnNvcklkICsgMSwgSW5maW5pdHkpOwogICAgICByZXR1cm4gb2JqZWN0U3RvcmUub3BlbkN1cnNvcihrZXlSYW5nZVZhbHVlKTsKICAgIH0gY2F0Y2ggKGUxMSkgewogICAgICByZXR1cm4gb2JqZWN0U3RvcmUub3BlbkN1cnNvcigpOwogICAgfQogIH0KICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzLCByZWopIHsKICAgIHZhciBvcGVuQ3Vyc29yUmVxdWVzdCA9IG9wZW5DdXJzb3IoKTsKICAgIG9wZW5DdXJzb3JSZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbihlcnIpIHsKICAgICAgcmV0dXJuIHJlaihlcnIpOwogICAgfTsKICAgIG9wZW5DdXJzb3JSZXF1ZXN0Lm9uc3VjY2VzcyA9IGZ1bmN0aW9uKGV2KSB7CiAgICAgIHZhciBjdXJzb3IgPSBldi50YXJnZXQucmVzdWx0OwogICAgICBpZiAoY3Vyc29yKSB7CiAgICAgICAgaWYgKGN1cnNvci52YWx1ZS5pZCA8IGxhc3RDdXJzb3JJZCArIDEpIHsKICAgICAgICAgIGN1cnNvclsiY29udGludWUiXShsYXN0Q3Vyc29ySWQgKyAxKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0LnB1c2goY3Vyc29yLnZhbHVlKTsKICAgICAgICAgIGN1cnNvclsiY29udGludWUiXSgpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb21taXRJbmRleGVkREJUcmFuc2FjdGlvbih0eCk7CiAgICAgICAgcmVzKHJldCk7CiAgICAgIH0KICAgIH07CiAgfSk7Cn0KZnVuY3Rpb24gcmVtb3ZlTWVzc2FnZXNCeUlkKGNoYW5uZWxTdGF0ZSwgaWRzKSB7CiAgaWYgKGNoYW5uZWxTdGF0ZS5jbG9zZWQpIHsKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pOwogIH0KICB2YXIgdHggPSBjaGFubmVsU3RhdGUuZGIudHJhbnNhY3Rpb24oT0JKRUNUX1NUT1JFX0lELCAicmVhZHdyaXRlIiwgVFJBTlNBQ1RJT05fU0VUVElOR1MpOwogIHZhciBvYmplY3RTdG9yZSA9IHR4Lm9iamVjdFN0b3JlKE9CSkVDVF9TVE9SRV9JRCk7CiAgcmV0dXJuIFByb21pc2UuYWxsKGlkcy5tYXAoZnVuY3Rpb24oaWQpIHsKICAgIHZhciBkZWxldGVSZXF1ZXN0ID0gb2JqZWN0U3RvcmVbImRlbGV0ZSJdKGlkKTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMpIHsKICAgICAgZGVsZXRlUmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcmVzKCk7CiAgICAgIH07CiAgICB9KTsKICB9KSk7Cn0KZnVuY3Rpb24gZ2V0T2xkTWVzc2FnZXMoZGIsIHR0bCkgewogIHZhciBvbGRlclRoZW4gPSBEYXRlLm5vdygpIC0gdHRsOwogIHZhciB0eCA9IGRiLnRyYW5zYWN0aW9uKE9CSkVDVF9TVE9SRV9JRCwgInJlYWRvbmx5IiwgVFJBTlNBQ1RJT05fU0VUVElOR1MpOwogIHZhciBvYmplY3RTdG9yZSA9IHR4Lm9iamVjdFN0b3JlKE9CSkVDVF9TVE9SRV9JRCk7CiAgdmFyIHJldCA9IFtdOwogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMpIHsKICAgIG9iamVjdFN0b3JlLm9wZW5DdXJzb3IoKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbihldikgewogICAgICB2YXIgY3Vyc29yID0gZXYudGFyZ2V0LnJlc3VsdDsKICAgICAgaWYgKGN1cnNvcikgewogICAgICAgIHZhciBtc2dPYmsgPSBjdXJzb3IudmFsdWU7CiAgICAgICAgaWYgKG1zZ09iay50aW1lIDwgb2xkZXJUaGVuKSB7CiAgICAgICAgICByZXQucHVzaChtc2dPYmspOwogICAgICAgICAgY3Vyc29yWyJjb250aW51ZSJdKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbW1pdEluZGV4ZWREQlRyYW5zYWN0aW9uKHR4KTsKICAgICAgICAgIHJlcyhyZXQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXMocmV0KTsKICAgICAgfQogICAgfTsKICB9KTsKfQpmdW5jdGlvbiBjbGVhbk9sZE1lc3NhZ2VzKGNoYW5uZWxTdGF0ZSkgewogIHJldHVybiBnZXRPbGRNZXNzYWdlcyhjaGFubmVsU3RhdGUuZGIsIGNoYW5uZWxTdGF0ZS5vcHRpb25zLmlkYi50dGwpLnRoZW4oZnVuY3Rpb24odG9vT2xkKSB7CiAgICByZXR1cm4gcmVtb3ZlTWVzc2FnZXNCeUlkKGNoYW5uZWxTdGF0ZSwgdG9vT2xkLm1hcChmdW5jdGlvbihtc2cpIHsKICAgICAgcmV0dXJuIG1zZy5pZDsKICAgIH0pKTsKICB9KTsKfQpmdW5jdGlvbiBjcmVhdGUyKGNoYW5uZWxOYW1lLCBvcHRpb25zKSB7CiAgb3B0aW9ucyA9IGZpbGxPcHRpb25zV2l0aERlZmF1bHRzKG9wdGlvbnMpOwogIHJldHVybiBjcmVhdGVEYXRhYmFzZShjaGFubmVsTmFtZSkudGhlbihmdW5jdGlvbihkYikgewogICAgdmFyIHN0YXRlMTAgPSB7CiAgICAgIGNsb3NlZDogZmFsc2UsCiAgICAgIGxhc3RDdXJzb3JJZDogMCwKICAgICAgY2hhbm5lbE5hbWUsCiAgICAgIG9wdGlvbnMsCiAgICAgIHV1aWQ6IHJhbmRvbVRva2VuKCksCiAgICAgIC8qKgogICAgICAgKiBlbWl0dGVkTWVzc2FnZXNJZHMKICAgICAgICogY29udGFpbnMgYWxsIG1lc3NhZ2VzIHRoYXQgaGF2ZSBiZWVuIGVtaXR0ZWQgYmVmb3JlCiAgICAgICAqIEB0eXBlIHtPYmxpdmlvdXNTZXR9CiAgICAgICAqLwogICAgICBlTUlzOiBuZXcgT2JsaXZpb3VzU2V0KG9wdGlvbnMuaWRiLnR0bCAqIDIpLAogICAgICAvLyBlbnN1cmVzIHdlIGRvIG5vdCByZWFkIG1lc3NhZ2VzIGluIHBhcmFsbGVsCiAgICAgIHdyaXRlQmxvY2tQcm9taXNlOiBQUk9NSVNFX1JFU09MVkVEX1ZPSUQsCiAgICAgIG1lc3NhZ2VzQ2FsbGJhY2s6IG51bGwsCiAgICAgIHJlYWRRdWV1ZVByb21pc2VzOiBbXSwKICAgICAgZGIKICAgIH07CiAgICBkYi5vbmNsb3NlID0gZnVuY3Rpb24oKSB7CiAgICAgIHN0YXRlMTAuY2xvc2VkID0gdHJ1ZTsKICAgICAgaWYgKG9wdGlvbnMuaWRiLm9uY2xvc2UpIG9wdGlvbnMuaWRiLm9uY2xvc2UoKTsKICAgIH07CiAgICBfcmVhZExvb3Aoc3RhdGUxMCk7CiAgICByZXR1cm4gc3RhdGUxMDsKICB9KTsKfQpmdW5jdGlvbiBfcmVhZExvb3Aoc3RhdGUxMCkgewogIGlmIChzdGF0ZTEwLmNsb3NlZCkgcmV0dXJuOwogIHJlYWROZXdNZXNzYWdlcyhzdGF0ZTEwKS50aGVuKGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHNsZWVwKHN0YXRlMTAub3B0aW9ucy5pZGIuZmFsbGJhY2tJbnRlcnZhbCk7CiAgfSkudGhlbihmdW5jdGlvbigpIHsKICAgIHJldHVybiBfcmVhZExvb3Aoc3RhdGUxMCk7CiAgfSk7Cn0KZnVuY3Rpb24gX2ZpbHRlck1lc3NhZ2UobXNnT2JqLCBzdGF0ZTEwKSB7CiAgaWYgKG1zZ09iai51dWlkID09PSBzdGF0ZTEwLnV1aWQpIHJldHVybiBmYWxzZTsKICBpZiAoc3RhdGUxMC5lTUlzLmhhcyhtc2dPYmouaWQpKSByZXR1cm4gZmFsc2U7CiAgaWYgKG1zZ09iai5kYXRhLnRpbWUgPCBzdGF0ZTEwLm1lc3NhZ2VzQ2FsbGJhY2tUaW1lKSByZXR1cm4gZmFsc2U7CiAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gcmVhZE5ld01lc3NhZ2VzKHN0YXRlMTApIHsKICBpZiAoc3RhdGUxMC5jbG9zZWQpIHJldHVybiBQUk9NSVNFX1JFU09MVkVEX1ZPSUQ7CiAgaWYgKCFzdGF0ZTEwLm1lc3NhZ2VzQ2FsbGJhY2spIHJldHVybiBQUk9NSVNFX1JFU09MVkVEX1ZPSUQ7CiAgcmV0dXJuIGdldE1lc3NhZ2VzSGlnaGVyVGhhbihzdGF0ZTEwLmRiLCBzdGF0ZTEwLmxhc3RDdXJzb3JJZCkudGhlbihmdW5jdGlvbihuZXdlck1lc3NhZ2VzKSB7CiAgICB2YXIgdXNlTWVzc2FnZXMgPSBuZXdlck1lc3NhZ2VzLmZpbHRlcihmdW5jdGlvbihtc2dPYmopIHsKICAgICAgcmV0dXJuICEhbXNnT2JqOwogICAgfSkubWFwKGZ1bmN0aW9uKG1zZ09iaikgewogICAgICBpZiAobXNnT2JqLmlkID4gc3RhdGUxMC5sYXN0Q3Vyc29ySWQpIHsKICAgICAgICBzdGF0ZTEwLmxhc3RDdXJzb3JJZCA9IG1zZ09iai5pZDsKICAgICAgfQogICAgICByZXR1cm4gbXNnT2JqOwogICAgfSkuZmlsdGVyKGZ1bmN0aW9uKG1zZ09iaikgewogICAgICByZXR1cm4gX2ZpbHRlck1lc3NhZ2UobXNnT2JqLCBzdGF0ZTEwKTsKICAgIH0pLnNvcnQoZnVuY3Rpb24obXNnT2JqQSwgbXNnT2JqQikgewogICAgICByZXR1cm4gbXNnT2JqQS50aW1lIC0gbXNnT2JqQi50aW1lOwogICAgfSk7CiAgICB1c2VNZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uKG1zZ09iaikgewogICAgICBpZiAoc3RhdGUxMC5tZXNzYWdlc0NhbGxiYWNrKSB7CiAgICAgICAgc3RhdGUxMC5lTUlzLmFkZChtc2dPYmouaWQpOwogICAgICAgIHN0YXRlMTAubWVzc2FnZXNDYWxsYmFjayhtc2dPYmouZGF0YSk7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIFBST01JU0VfUkVTT0xWRURfVk9JRDsKICB9KTsKfQpmdW5jdGlvbiBjbG9zZTIoY2hhbm5lbFN0YXRlKSB7CiAgY2hhbm5lbFN0YXRlLmNsb3NlZCA9IHRydWU7CiAgY2hhbm5lbFN0YXRlLmRiLmNsb3NlKCk7Cn0KZnVuY3Rpb24gcG9zdE1lc3NhZ2UyKGNoYW5uZWxTdGF0ZSwgbWVzc2FnZUpzb24pIHsKICBjaGFubmVsU3RhdGUud3JpdGVCbG9ja1Byb21pc2UgPSBjaGFubmVsU3RhdGUud3JpdGVCbG9ja1Byb21pc2UudGhlbihmdW5jdGlvbigpIHsKICAgIHJldHVybiB3cml0ZU1lc3NhZ2UoY2hhbm5lbFN0YXRlLmRiLCBjaGFubmVsU3RhdGUudXVpZCwgbWVzc2FnZUpzb24pOwogIH0pLnRoZW4oZnVuY3Rpb24oKSB7CiAgICBpZiAocmFuZG9tSW50KDAsIDEwKSA9PT0gMCkgewogICAgICBjbGVhbk9sZE1lc3NhZ2VzKGNoYW5uZWxTdGF0ZSk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIGNoYW5uZWxTdGF0ZS53cml0ZUJsb2NrUHJvbWlzZTsKfQpmdW5jdGlvbiBvbk1lc3NhZ2UyKGNoYW5uZWxTdGF0ZSwgZm4sIHRpbWUpIHsKICBjaGFubmVsU3RhdGUubWVzc2FnZXNDYWxsYmFja1RpbWUgPSB0aW1lOwogIGNoYW5uZWxTdGF0ZS5tZXNzYWdlc0NhbGxiYWNrID0gZm47CiAgcmVhZE5ld01lc3NhZ2VzKGNoYW5uZWxTdGF0ZSk7Cn0KZnVuY3Rpb24gY2FuQmVVc2VkMigpIHsKICByZXR1cm4gISFnZXRJZGIoKTsKfQpmdW5jdGlvbiBhdmVyYWdlUmVzcG9uc2VUaW1lMihvcHRpb25zKSB7CiAgcmV0dXJuIG9wdGlvbnMuaWRiLmZhbGxiYWNrSW50ZXJ2YWwgKiAyOwp9CnZhciBtaWNyb1NlY29uZHMzLCBEQl9QUkVGSVgsIE9CSkVDVF9TVE9SRV9JRCwgVFJBTlNBQ1RJT05fU0VUVElOR1MsIHR5cGUyLCBJbmRleGVkREJNZXRob2Q7CnZhciBpbml0X2luZGV4ZWRfZGIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvbWV0aG9kcy9pbmRleGVkLWRiLmpzIigpIHsKICAgIGluaXRfdXRpbCgpOwogICAgaW5pdF9zcmMoKTsKICAgIGluaXRfb3B0aW9ucygpOwogICAgbWljcm9TZWNvbmRzMyA9IG1pY3JvU2Vjb25kczsKICAgIERCX1BSRUZJWCA9ICJwdWJrZXkuYnJvYWRjYXN0LWNoYW5uZWwtMC0iOwogICAgT0JKRUNUX1NUT1JFX0lEID0gIm1lc3NhZ2VzIjsKICAgIFRSQU5TQUNUSU9OX1NFVFRJTkdTID0gewogICAgICBkdXJhYmlsaXR5OiAicmVsYXhlZCIKICAgIH07CiAgICB0eXBlMiA9ICJpZGIiOwogICAgSW5kZXhlZERCTWV0aG9kID0gewogICAgICBjcmVhdGU6IGNyZWF0ZTIsCiAgICAgIGNsb3NlOiBjbG9zZTIsCiAgICAgIG9uTWVzc2FnZTogb25NZXNzYWdlMiwKICAgICAgcG9zdE1lc3NhZ2U6IHBvc3RNZXNzYWdlMiwKICAgICAgY2FuQmVVc2VkOiBjYW5CZVVzZWQyLAogICAgICB0eXBlOiB0eXBlMiwKICAgICAgYXZlcmFnZVJlc3BvbnNlVGltZTogYXZlcmFnZVJlc3BvbnNlVGltZTIsCiAgICAgIG1pY3JvU2Vjb25kczogbWljcm9TZWNvbmRzMwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Jyb2FkY2FzdC1jaGFubmVsQDcuMy4wL25vZGVfbW9kdWxlcy9icm9hZGNhc3QtY2hhbm5lbC9kaXN0L2VzYnJvd3Nlci9tZXRob2RzL2xvY2Fsc3RvcmFnZS5qcwpmdW5jdGlvbiBnZXRMb2NhbFN0b3JhZ2UoKSB7CiAgdmFyIGxvY2FsU3RvcmFnZTI7CiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICJ1bmRlZmluZWQiKSByZXR1cm4gbnVsbDsKICB0cnkgewogICAgbG9jYWxTdG9yYWdlMiA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7CiAgICBsb2NhbFN0b3JhZ2UyID0gd2luZG93WyJpZTgtZXZlbnRsaXN0ZW5lci9zdG9yYWdlIl0gfHwgd2luZG93LmxvY2FsU3RvcmFnZTsKICB9IGNhdGNoIChlMTEpIHsKICB9CiAgcmV0dXJuIGxvY2FsU3RvcmFnZTI7Cn0KZnVuY3Rpb24gc3RvcmFnZUtleShjaGFubmVsTmFtZSkgewogIHJldHVybiBLRVlfUFJFRklYICsgY2hhbm5lbE5hbWU7Cn0KZnVuY3Rpb24gcG9zdE1lc3NhZ2UzKGNoYW5uZWxTdGF0ZSwgbWVzc2FnZUpzb24pIHsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzKSB7CiAgICBzbGVlcCgpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgIHZhciBrZXkyID0gc3RvcmFnZUtleShjaGFubmVsU3RhdGUuY2hhbm5lbE5hbWUpOwogICAgICB2YXIgd3JpdGVPYmogPSB7CiAgICAgICAgdG9rZW46IHJhbmRvbVRva2VuKCksCiAgICAgICAgdGltZTogRGF0ZS5ub3coKSwKICAgICAgICBkYXRhOiBtZXNzYWdlSnNvbiwKICAgICAgICB1dWlkOiBjaGFubmVsU3RhdGUudXVpZAogICAgICB9OwogICAgICB2YXIgdmFsdWUyID0gSlNPTi5zdHJpbmdpZnkod3JpdGVPYmopOwogICAgICBnZXRMb2NhbFN0b3JhZ2UoKS5zZXRJdGVtKGtleTIsIHZhbHVlMik7CiAgICAgIHZhciBldiA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpOwogICAgICBldi5pbml0RXZlbnQoInN0b3JhZ2UiLCB0cnVlLCB0cnVlKTsKICAgICAgZXYua2V5ID0ga2V5MjsKICAgICAgZXYubmV3VmFsdWUgPSB2YWx1ZTI7CiAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2KTsKICAgICAgcmVzKCk7CiAgICB9KTsKICB9KTsKfQpmdW5jdGlvbiBhZGRTdG9yYWdlRXZlbnRMaXN0ZW5lcihjaGFubmVsTmFtZSwgZm4pIHsKICB2YXIga2V5MiA9IHN0b3JhZ2VLZXkoY2hhbm5lbE5hbWUpOwogIHZhciBsaXN0ZW5lcjIgPSBmdW5jdGlvbiBsaXN0ZW5lcjMoZXYpIHsKICAgIGlmIChldi5rZXkgPT09IGtleTIpIHsKICAgICAgZm4oSlNPTi5wYXJzZShldi5uZXdWYWx1ZSkpOwogICAgfQogIH07CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInN0b3JhZ2UiLCBsaXN0ZW5lcjIpOwogIHJldHVybiBsaXN0ZW5lcjI7Cn0KZnVuY3Rpb24gcmVtb3ZlU3RvcmFnZUV2ZW50TGlzdGVuZXIobGlzdGVuZXIyKSB7CiAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInN0b3JhZ2UiLCBsaXN0ZW5lcjIpOwp9CmZ1bmN0aW9uIGNyZWF0ZTMoY2hhbm5lbE5hbWUsIG9wdGlvbnMpIHsKICBvcHRpb25zID0gZmlsbE9wdGlvbnNXaXRoRGVmYXVsdHMob3B0aW9ucyk7CiAgaWYgKCFjYW5CZVVzZWQzKCkpIHsKICAgIHRocm93IG5ldyBFcnJvcigiQnJvYWRjYXN0Q2hhbm5lbDogbG9jYWxzdG9yYWdlIGNhbm5vdCBiZSB1c2VkIik7CiAgfQogIHZhciB1dWlkID0gcmFuZG9tVG9rZW4oKTsKICB2YXIgZU1JcyA9IG5ldyBPYmxpdmlvdXNTZXQob3B0aW9ucy5sb2NhbHN0b3JhZ2UucmVtb3ZlVGltZW91dCk7CiAgdmFyIHN0YXRlMTAgPSB7CiAgICBjaGFubmVsTmFtZSwKICAgIHV1aWQsCiAgICBlTUlzCiAgICAvLyBlbWl0dGVkTWVzc2FnZXNJZHMKICB9OwogIHN0YXRlMTAubGlzdGVuZXIgPSBhZGRTdG9yYWdlRXZlbnRMaXN0ZW5lcihjaGFubmVsTmFtZSwgZnVuY3Rpb24obXNnT2JqKSB7CiAgICBpZiAoIXN0YXRlMTAubWVzc2FnZXNDYWxsYmFjaykgcmV0dXJuOwogICAgaWYgKG1zZ09iai51dWlkID09PSB1dWlkKSByZXR1cm47CiAgICBpZiAoIW1zZ09iai50b2tlbiB8fCBlTUlzLmhhcyhtc2dPYmoudG9rZW4pKSByZXR1cm47CiAgICBpZiAobXNnT2JqLmRhdGEudGltZSAmJiBtc2dPYmouZGF0YS50aW1lIDwgc3RhdGUxMC5tZXNzYWdlc0NhbGxiYWNrVGltZSkgcmV0dXJuOwogICAgZU1Jcy5hZGQobXNnT2JqLnRva2VuKTsKICAgIHN0YXRlMTAubWVzc2FnZXNDYWxsYmFjayhtc2dPYmouZGF0YSk7CiAgfSk7CiAgcmV0dXJuIHN0YXRlMTA7Cn0KZnVuY3Rpb24gY2xvc2UzKGNoYW5uZWxTdGF0ZSkgewogIHJlbW92ZVN0b3JhZ2VFdmVudExpc3RlbmVyKGNoYW5uZWxTdGF0ZS5saXN0ZW5lcik7Cn0KZnVuY3Rpb24gb25NZXNzYWdlMyhjaGFubmVsU3RhdGUsIGZuLCB0aW1lKSB7CiAgY2hhbm5lbFN0YXRlLm1lc3NhZ2VzQ2FsbGJhY2tUaW1lID0gdGltZTsKICBjaGFubmVsU3RhdGUubWVzc2FnZXNDYWxsYmFjayA9IGZuOwp9CmZ1bmN0aW9uIGNhbkJlVXNlZDMoKSB7CiAgdmFyIGxzID0gZ2V0TG9jYWxTdG9yYWdlKCk7CiAgaWYgKCFscykgcmV0dXJuIGZhbHNlOwogIHRyeSB7CiAgICB2YXIga2V5MiA9ICJfX2Jyb2FkY2FzdGNoYW5uZWxfY2hlY2siOwogICAgbHMuc2V0SXRlbShrZXkyLCAid29ya3MiKTsKICAgIGxzLnJlbW92ZUl0ZW0oa2V5Mik7CiAgfSBjYXRjaCAoZTExKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIGF2ZXJhZ2VSZXNwb25zZVRpbWUzKCkgewogIHZhciBkZWZhdWx0VGltZSA9IDEyMDsKICB2YXIgdXNlckFnZW50MiA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKICBpZiAodXNlckFnZW50Mi5pbmNsdWRlcygic2FmYXJpIikgJiYgIXVzZXJBZ2VudDIuaW5jbHVkZXMoImNocm9tZSIpKSB7CiAgICByZXR1cm4gZGVmYXVsdFRpbWUgKiAyOwogIH0KICByZXR1cm4gZGVmYXVsdFRpbWU7Cn0KdmFyIG1pY3JvU2Vjb25kczQsIEtFWV9QUkVGSVgsIHR5cGUzLCBMb2NhbHN0b3JhZ2VNZXRob2Q7CnZhciBpbml0X2xvY2Fsc3RvcmFnZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2Jyb2FkY2FzdC1jaGFubmVsQDcuMy4wL25vZGVfbW9kdWxlcy9icm9hZGNhc3QtY2hhbm5lbC9kaXN0L2VzYnJvd3Nlci9tZXRob2RzL2xvY2Fsc3RvcmFnZS5qcyIoKSB7CiAgICBpbml0X3NyYygpOwogICAgaW5pdF9vcHRpb25zKCk7CiAgICBpbml0X3V0aWwoKTsKICAgIG1pY3JvU2Vjb25kczQgPSBtaWNyb1NlY29uZHM7CiAgICBLRVlfUFJFRklYID0gInB1YmtleS5icm9hZGNhc3RDaGFubmVsLSI7CiAgICB0eXBlMyA9ICJsb2NhbHN0b3JhZ2UiOwogICAgTG9jYWxzdG9yYWdlTWV0aG9kID0gewogICAgICBjcmVhdGU6IGNyZWF0ZTMsCiAgICAgIGNsb3NlOiBjbG9zZTMsCiAgICAgIG9uTWVzc2FnZTogb25NZXNzYWdlMywKICAgICAgcG9zdE1lc3NhZ2U6IHBvc3RNZXNzYWdlMywKICAgICAgY2FuQmVVc2VkOiBjYW5CZVVzZWQzLAogICAgICB0eXBlOiB0eXBlMywKICAgICAgYXZlcmFnZVJlc3BvbnNlVGltZTogYXZlcmFnZVJlc3BvbnNlVGltZTMsCiAgICAgIG1pY3JvU2Vjb25kczogbWljcm9TZWNvbmRzNAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Jyb2FkY2FzdC1jaGFubmVsQDcuMy4wL25vZGVfbW9kdWxlcy9icm9hZGNhc3QtY2hhbm5lbC9kaXN0L2VzYnJvd3Nlci9tZXRob2RzL3NpbXVsYXRlLmpzCmZ1bmN0aW9uIGNyZWF0ZTQoY2hhbm5lbE5hbWUpIHsKICB2YXIgc3RhdGUxMCA9IHsKICAgIHRpbWU6IG1pY3JvU2Vjb25kczUoKSwKICAgIG5hbWU6IGNoYW5uZWxOYW1lLAogICAgbWVzc2FnZXNDYWxsYmFjazogbnVsbAogIH07CiAgU0lNVUxBVEVfQ0hBTk5FTFMuYWRkKHN0YXRlMTApOwogIHJldHVybiBzdGF0ZTEwOwp9CmZ1bmN0aW9uIGNsb3NlNChjaGFubmVsU3RhdGUpIHsKICBTSU1VTEFURV9DSEFOTkVMU1siZGVsZXRlIl0oY2hhbm5lbFN0YXRlKTsKfQpmdW5jdGlvbiBwb3N0TWVzc2FnZTQoY2hhbm5lbFN0YXRlLCBtZXNzYWdlSnNvbikgewogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMpIHsKICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICB2YXIgY2hhbm5lbEFycmF5ID0gQXJyYXkuZnJvbShTSU1VTEFURV9DSEFOTkVMUyk7CiAgICAgIGNoYW5uZWxBcnJheS5mb3JFYWNoKGZ1bmN0aW9uKGNoYW5uZWwpIHsKICAgICAgICBpZiAoY2hhbm5lbC5uYW1lID09PSBjaGFubmVsU3RhdGUubmFtZSAmJiAvLyBoYXMgc2FtZSBuYW1lCiAgICAgICAgY2hhbm5lbCAhPT0gY2hhbm5lbFN0YXRlICYmIC8vIG5vdCBvd24gY2hhbm5lbAogICAgICAgICEhY2hhbm5lbC5tZXNzYWdlc0NhbGxiYWNrICYmIC8vIGhhcyBzdWJzY3JpYmVycwogICAgICAgIGNoYW5uZWwudGltZSA8IG1lc3NhZ2VKc29uLnRpbWUpIHsKICAgICAgICAgIGNoYW5uZWwubWVzc2FnZXNDYWxsYmFjayhtZXNzYWdlSnNvbik7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmVzKCk7CiAgICB9LCBTSU1VTEFURV9ERUxBWV9USU1FKTsKICB9KTsKfQpmdW5jdGlvbiBvbk1lc3NhZ2U0KGNoYW5uZWxTdGF0ZSwgZm4pIHsKICBjaGFubmVsU3RhdGUubWVzc2FnZXNDYWxsYmFjayA9IGZuOwp9CmZ1bmN0aW9uIGNhbkJlVXNlZDQoKSB7CiAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gYXZlcmFnZVJlc3BvbnNlVGltZTQoKSB7CiAgcmV0dXJuIFNJTVVMQVRFX0RFTEFZX1RJTUU7Cn0KdmFyIG1pY3JvU2Vjb25kczUsIHR5cGU0LCBTSU1VTEFURV9DSEFOTkVMUywgU0lNVUxBVEVfREVMQVlfVElNRSwgU2ltdWxhdGVNZXRob2Q7CnZhciBpbml0X3NpbXVsYXRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL21ldGhvZHMvc2ltdWxhdGUuanMiKCkgewogICAgaW5pdF91dGlsKCk7CiAgICBtaWNyb1NlY29uZHM1ID0gbWljcm9TZWNvbmRzOwogICAgdHlwZTQgPSAic2ltdWxhdGUiOwogICAgU0lNVUxBVEVfQ0hBTk5FTFMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgU0lNVUxBVEVfREVMQVlfVElNRSA9IDU7CiAgICBTaW11bGF0ZU1ldGhvZCA9IHsKICAgICAgY3JlYXRlOiBjcmVhdGU0LAogICAgICBjbG9zZTogY2xvc2U0LAogICAgICBvbk1lc3NhZ2U6IG9uTWVzc2FnZTQsCiAgICAgIHBvc3RNZXNzYWdlOiBwb3N0TWVzc2FnZTQsCiAgICAgIGNhbkJlVXNlZDogY2FuQmVVc2VkNCwKICAgICAgdHlwZTogdHlwZTQsCiAgICAgIGF2ZXJhZ2VSZXNwb25zZVRpbWU6IGF2ZXJhZ2VSZXNwb25zZVRpbWU0LAogICAgICBtaWNyb1NlY29uZHM6IG1pY3JvU2Vjb25kczUKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvbWV0aG9kLWNob29zZXIuanMKZnVuY3Rpb24gY2hvb3NlTWV0aG9kKG9wdGlvbnMpIHsKICB2YXIgY2hvb3NlTWV0aG9kcyA9IFtdLmNvbmNhdChvcHRpb25zLm1ldGhvZHMsIE1FVEhPRFMpLmZpbHRlcihCb29sZWFuKTsKICBpZiAob3B0aW9ucy50eXBlKSB7CiAgICBpZiAob3B0aW9ucy50eXBlID09PSAic2ltdWxhdGUiKSB7CiAgICAgIHJldHVybiBTaW11bGF0ZU1ldGhvZDsKICAgIH0KICAgIHZhciByZXQgPSBjaG9vc2VNZXRob2RzLmZpbmQoZnVuY3Rpb24obTYpIHsKICAgICAgcmV0dXJuIG02LnR5cGUgPT09IG9wdGlvbnMudHlwZTsKICAgIH0pOwogICAgaWYgKCFyZXQpIHRocm93IG5ldyBFcnJvcigibWV0aG9kLXR5cGUgIiArIG9wdGlvbnMudHlwZSArICIgbm90IGZvdW5kIik7CiAgICBlbHNlIHJldHVybiByZXQ7CiAgfQogIGlmICghb3B0aW9ucy53ZWJXb3JrZXJTdXBwb3J0KSB7CiAgICBjaG9vc2VNZXRob2RzID0gY2hvb3NlTWV0aG9kcy5maWx0ZXIoZnVuY3Rpb24obTYpIHsKICAgICAgcmV0dXJuIG02LnR5cGUgIT09ICJpZGIiOwogICAgfSk7CiAgfQogIHZhciB1c2VNZXRob2QgPSBjaG9vc2VNZXRob2RzLmZpbmQoZnVuY3Rpb24obWV0aG9kKSB7CiAgICByZXR1cm4gbWV0aG9kLmNhbkJlVXNlZCgpOwogIH0pOwogIGlmICghdXNlTWV0aG9kKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIk5vIHVzYWJsZSBtZXRob2QgZm91bmQgaW4gIiArIEpTT04uc3RyaW5naWZ5KE1FVEhPRFMubWFwKGZ1bmN0aW9uKG02KSB7CiAgICAgIHJldHVybiBtNi50eXBlOwogICAgfSkpKTsKICB9IGVsc2UgewogICAgcmV0dXJuIHVzZU1ldGhvZDsKICB9Cn0KdmFyIE1FVEhPRFM7CnZhciBpbml0X21ldGhvZF9jaG9vc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL21ldGhvZC1jaG9vc2VyLmpzIigpIHsKICAgIGluaXRfbmF0aXZlKCk7CiAgICBpbml0X2luZGV4ZWRfZGIoKTsKICAgIGluaXRfbG9jYWxzdG9yYWdlKCk7CiAgICBpbml0X3NpbXVsYXRlKCk7CiAgICBNRVRIT0RTID0gWwogICAgICBOYXRpdmVNZXRob2QsCiAgICAgIC8vIGZhc3Rlc3QKICAgICAgSW5kZXhlZERCTWV0aG9kLAogICAgICBMb2NhbHN0b3JhZ2VNZXRob2QKICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvYnJvYWRjYXN0LWNoYW5uZWwuanMKZnVuY3Rpb24gY2xlYXJOb2RlRm9sZGVyKG9wdGlvbnMpIHsKICBvcHRpb25zID0gZmlsbE9wdGlvbnNXaXRoRGVmYXVsdHMob3B0aW9ucyk7CiAgdmFyIG1ldGhvZCA9IGNob29zZU1ldGhvZChvcHRpb25zKTsKICBpZiAobWV0aG9kLnR5cGUgPT09ICJub2RlIikgewogICAgcmV0dXJuIG1ldGhvZC5jbGVhck5vZGVGb2xkZXIoKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0pOwogIH0gZWxzZSB7CiAgICByZXR1cm4gUFJPTUlTRV9SRVNPTFZFRF9GQUxTRTsKICB9Cn0KZnVuY3Rpb24gZW5mb3JjZU9wdGlvbnMob3B0aW9ucykgewogIEVORk9SQ0VEX09QVElPTlMgPSBvcHRpb25zOwp9CmZ1bmN0aW9uIF9wb3N0KGJyb2FkY2FzdENoYW5uZWwsIHR5cGU1LCBtc2cpIHsKICB2YXIgdGltZSA9IGJyb2FkY2FzdENoYW5uZWwubWV0aG9kLm1pY3JvU2Vjb25kcygpOwogIHZhciBtc2dPYmogPSB7CiAgICB0aW1lLAogICAgdHlwZTogdHlwZTUsCiAgICBkYXRhOiBtc2cKICB9OwogIHZhciBhd2FpdFByZXBhcmUgPSBicm9hZGNhc3RDaGFubmVsLl9wcmVwUCA/IGJyb2FkY2FzdENoYW5uZWwuX3ByZXBQIDogUFJPTUlTRV9SRVNPTFZFRF9WT0lEOwogIHJldHVybiBhd2FpdFByZXBhcmUudGhlbihmdW5jdGlvbigpIHsKICAgIHZhciBzZW5kUHJvbWlzZSA9IGJyb2FkY2FzdENoYW5uZWwubWV0aG9kLnBvc3RNZXNzYWdlKGJyb2FkY2FzdENoYW5uZWwuX3N0YXRlLCBtc2dPYmopOwogICAgYnJvYWRjYXN0Q2hhbm5lbC5fdU1QLmFkZChzZW5kUHJvbWlzZSk7CiAgICBzZW5kUHJvbWlzZVsiY2F0Y2giXSgpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBicm9hZGNhc3RDaGFubmVsLl91TVBbImRlbGV0ZSJdKHNlbmRQcm9taXNlKTsKICAgIH0pOwogICAgcmV0dXJuIHNlbmRQcm9taXNlOwogIH0pOwp9CmZ1bmN0aW9uIF9wcmVwYXJlQ2hhbm5lbChjaGFubmVsKSB7CiAgdmFyIG1heWJlUHJvbWlzZSA9IGNoYW5uZWwubWV0aG9kLmNyZWF0ZShjaGFubmVsLm5hbWUsIGNoYW5uZWwub3B0aW9ucyk7CiAgaWYgKGlzUHJvbWlzZTIobWF5YmVQcm9taXNlKSkgewogICAgY2hhbm5lbC5fcHJlcFAgPSBtYXliZVByb21pc2U7CiAgICBtYXliZVByb21pc2UudGhlbihmdW5jdGlvbihzOSkgewogICAgICBjaGFubmVsLl9zdGF0ZSA9IHM5OwogICAgfSk7CiAgfSBlbHNlIHsKICAgIGNoYW5uZWwuX3N0YXRlID0gbWF5YmVQcm9taXNlOwogIH0KfQpmdW5jdGlvbiBfaGFzTWVzc2FnZUxpc3RlbmVycyhjaGFubmVsKSB7CiAgaWYgKGNoYW5uZWwuX2FkZEVMLm1lc3NhZ2UubGVuZ3RoID4gMCkgcmV0dXJuIHRydWU7CiAgaWYgKGNoYW5uZWwuX2FkZEVMLmludGVybmFsLmxlbmd0aCA+IDApIHJldHVybiB0cnVlOwogIHJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBfYWRkTGlzdGVuZXJPYmplY3QoY2hhbm5lbCwgdHlwZTUsIG9iaikgewogIGNoYW5uZWwuX2FkZEVMW3R5cGU1XS5wdXNoKG9iaik7CiAgX3N0YXJ0TGlzdGVuaW5nKGNoYW5uZWwpOwp9CmZ1bmN0aW9uIF9yZW1vdmVMaXN0ZW5lck9iamVjdChjaGFubmVsLCB0eXBlNSwgb2JqKSB7CiAgY2hhbm5lbC5fYWRkRUxbdHlwZTVdID0gY2hhbm5lbC5fYWRkRUxbdHlwZTVdLmZpbHRlcihmdW5jdGlvbihvMTMpIHsKICAgIHJldHVybiBvMTMgIT09IG9iajsKICB9KTsKICBfc3RvcExpc3RlbmluZyhjaGFubmVsKTsKfQpmdW5jdGlvbiBfc3RhcnRMaXN0ZW5pbmcoY2hhbm5lbCkgewogIGlmICghY2hhbm5lbC5faUwgJiYgX2hhc01lc3NhZ2VMaXN0ZW5lcnMoY2hhbm5lbCkpIHsKICAgIHZhciBsaXN0ZW5lckZuID0gZnVuY3Rpb24gbGlzdGVuZXJGbjIobXNnT2JqKSB7CiAgICAgIGNoYW5uZWwuX2FkZEVMW21zZ09iai50eXBlXS5mb3JFYWNoKGZ1bmN0aW9uKGxpc3RlbmVyT2JqZWN0KSB7CiAgICAgICAgaWYgKG1zZ09iai50aW1lID49IGxpc3RlbmVyT2JqZWN0LnRpbWUpIHsKICAgICAgICAgIGxpc3RlbmVyT2JqZWN0LmZuKG1zZ09iai5kYXRhKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfTsKICAgIHZhciB0aW1lID0gY2hhbm5lbC5tZXRob2QubWljcm9TZWNvbmRzKCk7CiAgICBpZiAoY2hhbm5lbC5fcHJlcFApIHsKICAgICAgY2hhbm5lbC5fcHJlcFAudGhlbihmdW5jdGlvbigpIHsKICAgICAgICBjaGFubmVsLl9pTCA9IHRydWU7CiAgICAgICAgY2hhbm5lbC5tZXRob2Qub25NZXNzYWdlKGNoYW5uZWwuX3N0YXRlLCBsaXN0ZW5lckZuLCB0aW1lKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBjaGFubmVsLl9pTCA9IHRydWU7CiAgICAgIGNoYW5uZWwubWV0aG9kLm9uTWVzc2FnZShjaGFubmVsLl9zdGF0ZSwgbGlzdGVuZXJGbiwgdGltZSk7CiAgICB9CiAgfQp9CmZ1bmN0aW9uIF9zdG9wTGlzdGVuaW5nKGNoYW5uZWwpIHsKICBpZiAoY2hhbm5lbC5faUwgJiYgIV9oYXNNZXNzYWdlTGlzdGVuZXJzKGNoYW5uZWwpKSB7CiAgICBjaGFubmVsLl9pTCA9IGZhbHNlOwogICAgdmFyIHRpbWUgPSBjaGFubmVsLm1ldGhvZC5taWNyb1NlY29uZHMoKTsKICAgIGNoYW5uZWwubWV0aG9kLm9uTWVzc2FnZShjaGFubmVsLl9zdGF0ZSwgbnVsbCwgdGltZSk7CiAgfQp9CnZhciBPUEVOX0JST0FEQ0FTVF9DSEFOTkVMUywgbGFzdElkLCBCcm9hZGNhc3RDaGFubmVsMiwgRU5GT1JDRURfT1BUSU9OUzsKdmFyIGluaXRfYnJvYWRjYXN0X2NoYW5uZWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvYnJvYWRjYXN0LWNoYW5uZWwuanMiKCkgewogICAgaW5pdF91dGlsKCk7CiAgICBpbml0X21ldGhvZF9jaG9vc2VyKCk7CiAgICBpbml0X29wdGlvbnMoKTsKICAgIE9QRU5fQlJPQURDQVNUX0NIQU5ORUxTID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgIGxhc3RJZCA9IDA7CiAgICBCcm9hZGNhc3RDaGFubmVsMiA9IGZ1bmN0aW9uIEJyb2FkY2FzdENoYW5uZWwzKG5hbWUsIG9wdGlvbnMpIHsKICAgICAgdGhpcy5pZCA9IGxhc3RJZCsrOwogICAgICBPUEVOX0JST0FEQ0FTVF9DSEFOTkVMUy5hZGQodGhpcyk7CiAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgIGlmIChFTkZPUkNFRF9PUFRJT05TKSB7CiAgICAgICAgb3B0aW9ucyA9IEVORk9SQ0VEX09QVElPTlM7CiAgICAgIH0KICAgICAgdGhpcy5vcHRpb25zID0gZmlsbE9wdGlvbnNXaXRoRGVmYXVsdHMob3B0aW9ucyk7CiAgICAgIHRoaXMubWV0aG9kID0gY2hvb3NlTWV0aG9kKHRoaXMub3B0aW9ucyk7CiAgICAgIHRoaXMuX2lMID0gZmFsc2U7CiAgICAgIHRoaXMuX29uTUwgPSBudWxsOwogICAgICB0aGlzLl9hZGRFTCA9IHsKICAgICAgICBtZXNzYWdlOiBbXSwKICAgICAgICBpbnRlcm5hbDogW10KICAgICAgfTsKICAgICAgdGhpcy5fdU1QID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgICAgdGhpcy5fYmVmQyA9IFtdOwogICAgICB0aGlzLl9wcmVwUCA9IG51bGw7CiAgICAgIF9wcmVwYXJlQ2hhbm5lbCh0aGlzKTsKICAgIH07CiAgICBCcm9hZGNhc3RDaGFubmVsMi5fcHVia2V5ID0gdHJ1ZTsKICAgIEJyb2FkY2FzdENoYW5uZWwyLnByb3RvdHlwZSA9IHsKICAgICAgcG9zdE1lc3NhZ2U6IGZ1bmN0aW9uIHBvc3RNZXNzYWdlNShtc2cpIHsKICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQnJvYWRjYXN0Q2hhbm5lbC5wb3N0TWVzc2FnZSgpOiBDYW5ub3QgcG9zdCBtZXNzYWdlIGFmdGVyIGNoYW5uZWwgaGFzIGNsb3NlZCAiICsgLyoqCiAgICAgICAgICAgKiBJbiB0aGUgcGFzdCB3aGVuIHRoaXMgZXJyb3IgYXBwZWFyZWQsIGl0IHdhcyByZWFsbHkgaGFyZCB0byBkZWJ1Zy4KICAgICAgICAgICAqIFNvIG5vdyB3ZSBsb2cgdGhlIG1zZyB0b2dldGhlciB3aXRoIHRoZSBlcnJvciBzbyBpdCBhdCBsZWFzdAogICAgICAgICAgICogZ2l2ZXMgc29tZSBjbHVlIGFib3V0IHdoZXJlIGluIHlvdXIgYXBwbGljYXRpb24gdGhpcyBoYXBwZW5zLgogICAgICAgICAgICovCiAgICAgICAgICBKU09OLnN0cmluZ2lmeShtc2cpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9wb3N0KHRoaXMsICJtZXNzYWdlIiwgbXNnKTsKICAgICAgfSwKICAgICAgcG9zdEludGVybmFsOiBmdW5jdGlvbiBwb3N0SW50ZXJuYWwobXNnKSB7CiAgICAgICAgcmV0dXJuIF9wb3N0KHRoaXMsICJpbnRlcm5hbCIsIG1zZyk7CiAgICAgIH0sCiAgICAgIHNldCBvbm1lc3NhZ2UoZm4pIHsKICAgICAgICB2YXIgdGltZSA9IHRoaXMubWV0aG9kLm1pY3JvU2Vjb25kcygpOwogICAgICAgIHZhciBsaXN0ZW5PYmogPSB7CiAgICAgICAgICB0aW1lLAogICAgICAgICAgZm4KICAgICAgICB9OwogICAgICAgIF9yZW1vdmVMaXN0ZW5lck9iamVjdCh0aGlzLCAibWVzc2FnZSIsIHRoaXMuX29uTUwpOwogICAgICAgIGlmIChmbiAmJiB0eXBlb2YgZm4gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIHRoaXMuX29uTUwgPSBsaXN0ZW5PYmo7CiAgICAgICAgICBfYWRkTGlzdGVuZXJPYmplY3QodGhpcywgIm1lc3NhZ2UiLCBsaXN0ZW5PYmopOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9vbk1MID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIodHlwZTUsIGZuKSB7CiAgICAgICAgdmFyIHRpbWUgPSB0aGlzLm1ldGhvZC5taWNyb1NlY29uZHMoKTsKICAgICAgICB2YXIgbGlzdGVuT2JqID0gewogICAgICAgICAgdGltZSwKICAgICAgICAgIGZuCiAgICAgICAgfTsKICAgICAgICBfYWRkTGlzdGVuZXJPYmplY3QodGhpcywgdHlwZTUsIGxpc3Rlbk9iaik7CiAgICAgIH0sCiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZTUsIGZuKSB7CiAgICAgICAgdmFyIG9iaiA9IHRoaXMuX2FkZEVMW3R5cGU1XS5maW5kKGZ1bmN0aW9uKG9iajIpIHsKICAgICAgICAgIHJldHVybiBvYmoyLmZuID09PSBmbjsKICAgICAgICB9KTsKICAgICAgICBfcmVtb3ZlTGlzdGVuZXJPYmplY3QodGhpcywgdHlwZTUsIG9iaik7CiAgICAgIH0sCiAgICAgIGNsb3NlOiBmdW5jdGlvbiBjbG9zZTUoKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgT1BFTl9CUk9BRENBU1RfQ0hBTk5FTFNbImRlbGV0ZSJdKHRoaXMpOwogICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTsKICAgICAgICB2YXIgYXdhaXRQcmVwYXJlID0gdGhpcy5fcHJlcFAgPyB0aGlzLl9wcmVwUCA6IFBST01JU0VfUkVTT0xWRURfVk9JRDsKICAgICAgICB0aGlzLl9vbk1MID0gbnVsbDsKICAgICAgICB0aGlzLl9hZGRFTC5tZXNzYWdlID0gW107CiAgICAgICAgcmV0dXJuIGF3YWl0UHJlcGFyZS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKEFycmF5LmZyb20oX3RoaXMuX3VNUCkpOwogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoX3RoaXMuX2JlZkMubWFwKGZ1bmN0aW9uKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmbigpOwogICAgICAgICAgfSkpOwogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gX3RoaXMubWV0aG9kLmNsb3NlKF90aGlzLl9zdGF0ZSk7CiAgICAgICAgfSk7CiAgICAgIH0sCiAgICAgIGdldCB0eXBlKCkgewogICAgICAgIHJldHVybiB0aGlzLm1ldGhvZC50eXBlOwogICAgICB9LAogICAgICBnZXQgaXNDbG9zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvc2VkOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdW5sb2FkQDIuNC4xL25vZGVfbW9kdWxlcy91bmxvYWQvZGlzdC9lcy9icm93c2VyLmpzCmZ1bmN0aW9uIGFkZEJyb3dzZXIoZm4pIHsKICBpZiAodHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlID09PSAiZnVuY3Rpb24iICYmIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSkgewogICAgdmFyIG9sZENsb3NlID0gc2VsZi5jbG9zZS5iaW5kKHNlbGYpOwogICAgc2VsZi5jbG9zZSA9IGZ1bmN0aW9uKCkgewogICAgICBmbigpOwogICAgICByZXR1cm4gb2xkQ2xvc2UoKTsKICAgIH07CiAgfSBlbHNlIHsKICAgIGlmICh0eXBlb2Ygd2luZG93LmFkZEV2ZW50TGlzdGVuZXIgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsIGZ1bmN0aW9uKCkgewogICAgICBmbigpOwogICAgfSwgdHJ1ZSk7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwgZnVuY3Rpb24oKSB7CiAgICAgIGZuKCk7CiAgICB9LCB0cnVlKTsKICB9Cn0KdmFyIGluaXRfYnJvd3NlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3VubG9hZEAyLjQuMS9ub2RlX21vZHVsZXMvdW5sb2FkL2Rpc3QvZXMvYnJvd3Nlci5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS91bmxvYWRAMi40LjEvbm9kZV9tb2R1bGVzL3VubG9hZC9kaXN0L2VzL25vZGUuanMKZnVuY3Rpb24gYWRkTm9kZShmbikgewogIHByb2Nlc3Mub24oImV4aXQiLCBmdW5jdGlvbigpIHsKICAgIHJldHVybiBmbigpOwogIH0pOwogIHByb2Nlc3Mub24oImJlZm9yZUV4aXQiLCBmdW5jdGlvbigpIHsKICAgIHJldHVybiBmbigpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBwcm9jZXNzLmV4aXQoKTsKICAgIH0pOwogIH0pOwogIHByb2Nlc3Mub24oIlNJR0lOVCIsIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGZuKCkudGhlbihmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHByb2Nlc3MuZXhpdCgpOwogICAgfSk7CiAgfSk7CiAgcHJvY2Vzcy5vbigidW5jYXVnaHRFeGNlcHRpb24iLCBmdW5jdGlvbihlcnIpIHsKICAgIHJldHVybiBmbigpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgIGNvbnNvbGUudHJhY2UoZXJyKTsKICAgICAgcHJvY2Vzcy5leGl0KDEwMSk7CiAgICB9KTsKICB9KTsKfQp2YXIgaW5pdF9ub2RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdW5sb2FkQDIuNC4xL25vZGVfbW9kdWxlcy91bmxvYWQvZGlzdC9lcy9ub2RlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VubG9hZEAyLjQuMS9ub2RlX21vZHVsZXMvdW5sb2FkL2Rpc3QvZXMvaW5kZXguanMKZnVuY3Rpb24gc3RhcnRMaXN0ZW5pbmcoKSB7CiAgaWYgKHN0YXJ0ZWRMaXN0ZW5pbmcpIHsKICAgIHJldHVybjsKICB9CiAgc3RhcnRlZExpc3RlbmluZyA9IHRydWU7CiAgVVNFX01FVEhPRChydW5BbGwpOwp9CmZ1bmN0aW9uIGFkZDIoZm4pIHsKICBzdGFydExpc3RlbmluZygpOwogIGlmICh0eXBlb2YgZm4gIT09ICJmdW5jdGlvbiIpIHsKICAgIHRocm93IG5ldyBFcnJvcigiTGlzdGVuZXIgaXMgbm8gZnVuY3Rpb24iKTsKICB9CiAgTElTVEVORVJTLmFkZChmbik7CiAgdmFyIGFkZFJldHVybiA9IHsKICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlMigpIHsKICAgICAgcmV0dXJuIExJU1RFTkVSU1siZGVsZXRlIl0oZm4pOwogICAgfSwKICAgIHJ1bjogZnVuY3Rpb24gcnVuKCkgewogICAgICBMSVNURU5FUlNbImRlbGV0ZSJdKGZuKTsKICAgICAgcmV0dXJuIGZuKCk7CiAgICB9CiAgfTsKICByZXR1cm4gYWRkUmV0dXJuOwp9CmZ1bmN0aW9uIHJ1bkFsbCgpIHsKICB2YXIgcHJvbWlzZXMgPSBbXTsKICBMSVNURU5FUlMuZm9yRWFjaChmdW5jdGlvbihmbikgewogICAgcHJvbWlzZXMucHVzaChmbigpKTsKICAgIExJU1RFTkVSU1siZGVsZXRlIl0oZm4pOwogIH0pOwogIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7Cn0KZnVuY3Rpb24gcmVtb3ZlQWxsKCkgewogIExJU1RFTkVSUy5jbGVhcigpOwp9CmZ1bmN0aW9uIGdldFNpemUoKSB7CiAgcmV0dXJuIExJU1RFTkVSUy5zaXplOwp9CnZhciBpc05vZGUsIFVTRV9NRVRIT0QsIExJU1RFTkVSUywgc3RhcnRlZExpc3RlbmluZzsKdmFyIGluaXRfZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS91bmxvYWRAMi40LjEvbm9kZV9tb2R1bGVzL3VubG9hZC9kaXN0L2VzL2luZGV4LmpzIigpIHsKICAgIGluaXRfYnJvd3NlcigpOwogICAgaW5pdF9ub2RlKCk7CiAgICBpc05vZGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodHlwZW9mIHByb2Nlc3MgIT09ICJ1bmRlZmluZWQiID8gcHJvY2VzcyA6IDApID09PSAiW29iamVjdCBwcm9jZXNzXSI7CiAgICBVU0VfTUVUSE9EID0gaXNOb2RlID8gYWRkTm9kZSA6IGFkZEJyb3dzZXI7CiAgICBMSVNURU5FUlMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgc3RhcnRlZExpc3RlbmluZyA9IGZhbHNlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL2xlYWRlci1lbGVjdGlvbi11dGlsLmpzCmZ1bmN0aW9uIHNlbmRMZWFkZXJNZXNzYWdlKGxlYWRlckVsZWN0b3IsIGFjdGlvbikgewogIHZhciBtc2dKc29uID0gewogICAgY29udGV4dDogImxlYWRlciIsCiAgICBhY3Rpb24sCiAgICB0b2tlbjogbGVhZGVyRWxlY3Rvci50b2tlbgogIH07CiAgcmV0dXJuIGxlYWRlckVsZWN0b3IuYnJvYWRjYXN0Q2hhbm5lbC5wb3N0SW50ZXJuYWwobXNnSnNvbik7Cn0KZnVuY3Rpb24gYmVMZWFkZXIobGVhZGVyRWxlY3RvcikgewogIGxlYWRlckVsZWN0b3IuaXNMZWFkZXIgPSB0cnVlOwogIGxlYWRlckVsZWN0b3IuX2hhc0xlYWRlciA9IHRydWU7CiAgdmFyIHVubG9hZEZuID0gYWRkMihmdW5jdGlvbigpIHsKICAgIHJldHVybiBsZWFkZXJFbGVjdG9yLmRpZSgpOwogIH0pOwogIGxlYWRlckVsZWN0b3IuX3VubC5wdXNoKHVubG9hZEZuKTsKICB2YXIgaXNMZWFkZXJMaXN0ZW5lciA9IGZ1bmN0aW9uIGlzTGVhZGVyTGlzdGVuZXIyKG1zZykgewogICAgaWYgKG1zZy5jb250ZXh0ID09PSAibGVhZGVyIiAmJiBtc2cuYWN0aW9uID09PSAiYXBwbHkiKSB7CiAgICAgIHNlbmRMZWFkZXJNZXNzYWdlKGxlYWRlckVsZWN0b3IsICJ0ZWxsIik7CiAgICB9CiAgICBpZiAobXNnLmNvbnRleHQgPT09ICJsZWFkZXIiICYmIG1zZy5hY3Rpb24gPT09ICJ0ZWxsIiAmJiAhbGVhZGVyRWxlY3Rvci5fZHBMQykgewogICAgICBsZWFkZXJFbGVjdG9yLl9kcExDID0gdHJ1ZTsKICAgICAgbGVhZGVyRWxlY3Rvci5fZHBMKCk7CiAgICAgIHNlbmRMZWFkZXJNZXNzYWdlKGxlYWRlckVsZWN0b3IsICJ0ZWxsIik7CiAgICB9CiAgfTsKICBsZWFkZXJFbGVjdG9yLmJyb2FkY2FzdENoYW5uZWwuYWRkRXZlbnRMaXN0ZW5lcigiaW50ZXJuYWwiLCBpc0xlYWRlckxpc3RlbmVyKTsKICBsZWFkZXJFbGVjdG9yLl9sc3Rucy5wdXNoKGlzTGVhZGVyTGlzdGVuZXIpOwogIHJldHVybiBzZW5kTGVhZGVyTWVzc2FnZShsZWFkZXJFbGVjdG9yLCAidGVsbCIpOwp9CnZhciBpbml0X2xlYWRlcl9lbGVjdGlvbl91dGlsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL2xlYWRlci1lbGVjdGlvbi11dGlsLmpzIigpIHsKICAgIGluaXRfZXMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Jyb2FkY2FzdC1jaGFubmVsQDcuMy4wL25vZGVfbW9kdWxlcy9icm9hZGNhc3QtY2hhbm5lbC9kaXN0L2VzYnJvd3Nlci9sZWFkZXItZWxlY3Rpb24td2ViLWxvY2suanMKdmFyIExlYWRlckVsZWN0aW9uV2ViTG9jaywgTEVBREVSX0RJRV9BQk9SVF9TSUdOQUxfTUVTU0FHRTsKdmFyIGluaXRfbGVhZGVyX2VsZWN0aW9uX3dlYl9sb2NrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL2xlYWRlci1lbGVjdGlvbi13ZWItbG9jay5qcyIoKSB7CiAgICBpbml0X3V0aWwoKTsKICAgIGluaXRfbGVhZGVyX2VsZWN0aW9uX3V0aWwoKTsKICAgIExlYWRlckVsZWN0aW9uV2ViTG9jayA9IGZ1bmN0aW9uIExlYWRlckVsZWN0aW9uV2ViTG9jazIoYnJvYWRjYXN0Q2hhbm5lbCwgb3B0aW9ucykgewogICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICB0aGlzLmJyb2FkY2FzdENoYW5uZWwgPSBicm9hZGNhc3RDaGFubmVsOwogICAgICBicm9hZGNhc3RDaGFubmVsLl9iZWZDLnB1c2goZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIF90aGlzLmRpZSgpOwogICAgICB9KTsKICAgICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgIHRoaXMuaXNMZWFkZXIgPSBmYWxzZTsKICAgICAgdGhpcy5pc0RlYWQgPSBmYWxzZTsKICAgICAgdGhpcy50b2tlbiA9IHJhbmRvbVRva2VuKCk7CiAgICAgIHRoaXMuX2xzdG5zID0gW107CiAgICAgIHRoaXMuX3VubCA9IFtdOwogICAgICB0aGlzLl9kcEwgPSBmdW5jdGlvbigpIHsKICAgICAgfTsKICAgICAgdGhpcy5fZHBMQyA9IGZhbHNlOwogICAgICB0aGlzLl93S01DID0ge307CiAgICAgIHRoaXMubE4gPSAicHVia2V5LWJjfHwiICsgYnJvYWRjYXN0Q2hhbm5lbC5tZXRob2QudHlwZSArICJ8fCIgKyBicm9hZGNhc3RDaGFubmVsLm5hbWU7CiAgICB9OwogICAgTEVBREVSX0RJRV9BQk9SVF9TSUdOQUxfTUVTU0FHRSA9ICJMZWFkZXJFbGVjdGlvbldlYkxvY2suZGllKCkgY2FsbGVkIjsKICAgIExlYWRlckVsZWN0aW9uV2ViTG9jay5wcm90b3R5cGUgPSB7CiAgICAgIGhhc0xlYWRlcjogZnVuY3Rpb24gaGFzTGVhZGVyKCkgewogICAgICAgIHZhciBfdGhpczIgPSB0aGlzOwogICAgICAgIHJldHVybiBuYXZpZ2F0b3IubG9ja3MucXVlcnkoKS50aGVuKGZ1bmN0aW9uKGxvY2tzKSB7CiAgICAgICAgICB2YXIgcmVsZXZhbnRMb2NrcyA9IGxvY2tzLmhlbGQgPyBsb2Nrcy5oZWxkLmZpbHRlcihmdW5jdGlvbihsb2NrKSB7CiAgICAgICAgICAgIHJldHVybiBsb2NrLm5hbWUgPT09IF90aGlzMi5sTjsKICAgICAgICAgIH0pIDogW107CiAgICAgICAgICBpZiAocmVsZXZhbnRMb2NrcyAmJiByZWxldmFudExvY2tzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0sCiAgICAgIGF3YWl0TGVhZGVyc2hpcDogZnVuY3Rpb24gYXdhaXRMZWFkZXJzaGlwKCkgewogICAgICAgIHZhciBfdGhpczMgPSB0aGlzOwogICAgICAgIGlmICghdGhpcy5fd0xNUCkgewogICAgICAgICAgdGhpcy5fd0tNQy5jID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwogICAgICAgICAgdmFyIHJldHVyblByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMsIHJlaikgewogICAgICAgICAgICBfdGhpczMuX3dLTUMucmVzID0gcmVzOwogICAgICAgICAgICBfdGhpczMuX3dLTUMucmVqID0gcmVqOwogICAgICAgICAgfSk7CiAgICAgICAgICB0aGlzLl93TE1QID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzLCByZWplY3QpIHsKICAgICAgICAgICAgbmF2aWdhdG9yLmxvY2tzLnJlcXVlc3QoX3RoaXMzLmxOLCB7CiAgICAgICAgICAgICAgc2lnbmFsOiBfdGhpczMuX3dLTUMuYy5zaWduYWwKICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgX3RoaXMzLl93S01DLmMgPSB2b2lkIDA7CiAgICAgICAgICAgICAgYmVMZWFkZXIoX3RoaXMzKTsKICAgICAgICAgICAgICByZXMoKTsKICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuUHJvbWlzZTsKICAgICAgICAgICAgfSlbImNhdGNoIl0oZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgaWYgKGVyci5tZXNzYWdlICYmIGVyci5tZXNzYWdlID09PSBMRUFERVJfRElFX0FCT1JUX1NJR05BTF9NRVNTQUdFKSB7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChfdGhpczMuX3dLTUMucmVqKSB7CiAgICAgICAgICAgICAgICAgIF90aGlzMy5fd0tNQy5yZWooZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX3dMTVA7CiAgICAgIH0sCiAgICAgIHNldCBvbmR1cGxpY2F0ZShfZm4pIHsKICAgICAgfSwKICAgICAgZGllOiBmdW5jdGlvbiBkaWUoKSB7CiAgICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CiAgICAgICAgdGhpcy5fbHN0bnMuZm9yRWFjaChmdW5jdGlvbihsaXN0ZW5lcjIpIHsKICAgICAgICAgIHJldHVybiBfdGhpczQuYnJvYWRjYXN0Q2hhbm5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCJpbnRlcm5hbCIsIGxpc3RlbmVyMik7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5fbHN0bnMgPSBbXTsKICAgICAgICB0aGlzLl91bmwuZm9yRWFjaChmdW5jdGlvbih1Rm4pIHsKICAgICAgICAgIHJldHVybiB1Rm4ucmVtb3ZlKCk7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5fdW5sID0gW107CiAgICAgICAgaWYgKHRoaXMuaXNMZWFkZXIpIHsKICAgICAgICAgIHRoaXMuaXNMZWFkZXIgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5pc0RlYWQgPSB0cnVlOwogICAgICAgIGlmICh0aGlzLl93S01DLnJlcykgewogICAgICAgICAgdGhpcy5fd0tNQy5yZXMoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX3dLTUMuYykgewogICAgICAgICAgdGhpcy5fd0tNQy5jLmFib3J0KG5ldyBFcnJvcihMRUFERVJfRElFX0FCT1JUX1NJR05BTF9NRVNTQUdFKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzZW5kTGVhZGVyTWVzc2FnZSh0aGlzLCAiZGVhdGgiKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Jyb2FkY2FzdC1jaGFubmVsQDcuMy4wL25vZGVfbW9kdWxlcy9icm9hZGNhc3QtY2hhbm5lbC9kaXN0L2VzYnJvd3Nlci9sZWFkZXItZWxlY3Rpb24uanMKZnVuY3Rpb24gX2F3YWl0TGVhZGVyc2hpcE9uY2UobGVhZGVyRWxlY3RvcikgewogIGlmIChsZWFkZXJFbGVjdG9yLmlzTGVhZGVyKSB7CiAgICByZXR1cm4gUFJPTUlTRV9SRVNPTFZFRF9WT0lEOwogIH0KICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzKSB7CiAgICB2YXIgcmVzb2x2ZWQyID0gZmFsc2U7CiAgICBmdW5jdGlvbiBmaW5pc2goKSB7CiAgICAgIGlmIChyZXNvbHZlZDIpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgcmVzb2x2ZWQyID0gdHJ1ZTsKICAgICAgbGVhZGVyRWxlY3Rvci5icm9hZGNhc3RDaGFubmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImludGVybmFsIiwgd2hlbkRlYXRoTGlzdGVuZXIpOwogICAgICByZXModHJ1ZSk7CiAgICB9CiAgICBsZWFkZXJFbGVjdG9yLmFwcGx5T25jZSgpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgIGlmIChsZWFkZXJFbGVjdG9yLmlzTGVhZGVyKSB7CiAgICAgICAgZmluaXNoKCk7CiAgICAgIH0KICAgIH0pOwogICAgdmFyIF90cnlPbkZhbGxCYWNrID0gZnVuY3Rpb24gdHJ5T25GYWxsQmFjaygpIHsKICAgICAgcmV0dXJuIHNsZWVwKGxlYWRlckVsZWN0b3IuX29wdGlvbnMuZmFsbGJhY2tJbnRlcnZhbCkudGhlbihmdW5jdGlvbigpIHsKICAgICAgICBpZiAobGVhZGVyRWxlY3Rvci5pc0RlYWQgfHwgcmVzb2x2ZWQyKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChsZWFkZXJFbGVjdG9yLmlzTGVhZGVyKSB7CiAgICAgICAgICBmaW5pc2goKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGxlYWRlckVsZWN0b3IuYXBwbHlPbmNlKHRydWUpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmIChsZWFkZXJFbGVjdG9yLmlzTGVhZGVyKSB7CiAgICAgICAgICAgICAgZmluaXNoKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX3RyeU9uRmFsbEJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH07CiAgICBfdHJ5T25GYWxsQmFjaygpOwogICAgdmFyIHdoZW5EZWF0aExpc3RlbmVyID0gZnVuY3Rpb24gd2hlbkRlYXRoTGlzdGVuZXIyKG1zZykgewogICAgICBpZiAobXNnLmNvbnRleHQgPT09ICJsZWFkZXIiICYmIG1zZy5hY3Rpb24gPT09ICJkZWF0aCIpIHsKICAgICAgICBsZWFkZXJFbGVjdG9yLl9oYXNMZWFkZXIgPSBmYWxzZTsKICAgICAgICBsZWFkZXJFbGVjdG9yLmFwcGx5T25jZSgpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAobGVhZGVyRWxlY3Rvci5pc0xlYWRlcikgewogICAgICAgICAgICBmaW5pc2goKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIGxlYWRlckVsZWN0b3IuYnJvYWRjYXN0Q2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJpbnRlcm5hbCIsIHdoZW5EZWF0aExpc3RlbmVyKTsKICAgIGxlYWRlckVsZWN0b3IuX2xzdG5zLnB1c2god2hlbkRlYXRoTGlzdGVuZXIpOwogIH0pOwp9CmZ1bmN0aW9uIGZpbGxPcHRpb25zV2l0aERlZmF1bHRzMihvcHRpb25zLCBjaGFubmVsKSB7CiAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307CiAgb3B0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob3B0aW9ucykpOwogIGlmICghb3B0aW9ucy5mYWxsYmFja0ludGVydmFsKSB7CiAgICBvcHRpb25zLmZhbGxiYWNrSW50ZXJ2YWwgPSAzZTM7CiAgfQogIGlmICghb3B0aW9ucy5yZXNwb25zZVRpbWUpIHsKICAgIG9wdGlvbnMucmVzcG9uc2VUaW1lID0gY2hhbm5lbC5tZXRob2QuYXZlcmFnZVJlc3BvbnNlVGltZShjaGFubmVsLm9wdGlvbnMpOwogIH0KICByZXR1cm4gb3B0aW9uczsKfQpmdW5jdGlvbiBjcmVhdGVMZWFkZXJFbGVjdGlvbihjaGFubmVsLCBvcHRpb25zKSB7CiAgaWYgKGNoYW5uZWwuX2xlYWRlckVsZWN0b3IpIHsKICAgIHRocm93IG5ldyBFcnJvcigiQnJvYWRjYXN0Q2hhbm5lbCBhbHJlYWR5IGhhcyBhIGxlYWRlci1lbGVjdG9yIik7CiAgfQogIG9wdGlvbnMgPSBmaWxsT3B0aW9uc1dpdGhEZWZhdWx0czIob3B0aW9ucywgY2hhbm5lbCk7CiAgdmFyIGVsZWN0b3IgPSBzdXBwb3J0c1dlYkxvY2tBUEkoKSA/IG5ldyBMZWFkZXJFbGVjdGlvbldlYkxvY2soY2hhbm5lbCwgb3B0aW9ucykgOiBuZXcgTGVhZGVyRWxlY3Rpb24oY2hhbm5lbCwgb3B0aW9ucyk7CiAgY2hhbm5lbC5fYmVmQy5wdXNoKGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGVsZWN0b3IuZGllKCk7CiAgfSk7CiAgY2hhbm5lbC5fbGVhZGVyRWxlY3RvciA9IGVsZWN0b3I7CiAgcmV0dXJuIGVsZWN0b3I7Cn0KdmFyIExlYWRlckVsZWN0aW9uOwp2YXIgaW5pdF9sZWFkZXJfZWxlY3Rpb24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvbGVhZGVyLWVsZWN0aW9uLmpzIigpIHsKICAgIGluaXRfdXRpbCgpOwogICAgaW5pdF9sZWFkZXJfZWxlY3Rpb25fdXRpbCgpOwogICAgaW5pdF9sZWFkZXJfZWxlY3Rpb25fd2ViX2xvY2soKTsKICAgIExlYWRlckVsZWN0aW9uID0gZnVuY3Rpb24gTGVhZGVyRWxlY3Rpb24yKGJyb2FkY2FzdENoYW5uZWwsIG9wdGlvbnMpIHsKICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgdGhpcy5icm9hZGNhc3RDaGFubmVsID0gYnJvYWRjYXN0Q2hhbm5lbDsKICAgICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgIHRoaXMuaXNMZWFkZXIgPSBmYWxzZTsKICAgICAgdGhpcy5faGFzTGVhZGVyID0gZmFsc2U7CiAgICAgIHRoaXMuaXNEZWFkID0gZmFsc2U7CiAgICAgIHRoaXMudG9rZW4gPSByYW5kb21Ub2tlbigpOwogICAgICB0aGlzLl9hcGxRID0gUFJPTUlTRV9SRVNPTFZFRF9WT0lEOwogICAgICB0aGlzLl9hcGxRQyA9IDA7CiAgICAgIHRoaXMuX3VubCA9IFtdOwogICAgICB0aGlzLl9sc3RucyA9IFtdOwogICAgICB0aGlzLl9kcEwgPSBmdW5jdGlvbigpIHsKICAgICAgfTsKICAgICAgdGhpcy5fZHBMQyA9IGZhbHNlOwogICAgICB2YXIgaGFzTGVhZGVyTGlzdGVuZXIgPSBmdW5jdGlvbiBoYXNMZWFkZXJMaXN0ZW5lcjIobXNnKSB7CiAgICAgICAgaWYgKG1zZy5jb250ZXh0ID09PSAibGVhZGVyIikgewogICAgICAgICAgaWYgKG1zZy5hY3Rpb24gPT09ICJkZWF0aCIpIHsKICAgICAgICAgICAgX3RoaXMuX2hhc0xlYWRlciA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG1zZy5hY3Rpb24gPT09ICJ0ZWxsIikgewogICAgICAgICAgICBfdGhpcy5faGFzTGVhZGVyID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CiAgICAgIHRoaXMuYnJvYWRjYXN0Q2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJpbnRlcm5hbCIsIGhhc0xlYWRlckxpc3RlbmVyKTsKICAgICAgdGhpcy5fbHN0bnMucHVzaChoYXNMZWFkZXJMaXN0ZW5lcik7CiAgICB9OwogICAgTGVhZGVyRWxlY3Rpb24ucHJvdG90eXBlID0gewogICAgICBoYXNMZWFkZXI6IGZ1bmN0aW9uIGhhc0xlYWRlcjIoKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9oYXNMZWFkZXIpOwogICAgICB9LAogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBpbnN0YW5jZSBpcyBsZWFkZXIsCiAgICAgICAqIGZhbHNlIGlmIG5vdC4KICAgICAgICogQGFzeW5jCiAgICAgICAqLwogICAgICBhcHBseU9uY2U6IGZ1bmN0aW9uIGFwcGx5T25jZShpc0Zyb21GYWxsYmFja0ludGVydmFsKSB7CiAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CiAgICAgICAgaWYgKHRoaXMuaXNMZWFkZXIpIHsKICAgICAgICAgIHJldHVybiBzbGVlcCgwLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuaXNEZWFkKSB7CiAgICAgICAgICByZXR1cm4gc2xlZXAoMCwgZmFsc2UpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fYXBsUUMgPiAxKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fYXBsUTsKICAgICAgICB9CiAgICAgICAgdmFyIGFwcGx5UnVuID0gZnVuY3Rpb24gYXBwbHlSdW4yKCkgewogICAgICAgICAgaWYgKF90aGlzMi5pc0xlYWRlcikgewogICAgICAgICAgICByZXR1cm4gUFJPTUlTRV9SRVNPTFZFRF9UUlVFOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHN0b3BDcml0ZXJpYSA9IGZhbHNlOwogICAgICAgICAgdmFyIHN0b3BDcml0ZXJpYVByb21pc2VSZXNvbHZlOwogICAgICAgICAgdmFyIHN0b3BDcml0ZXJpYVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgc3RvcENyaXRlcmlhUHJvbWlzZVJlc29sdmUgPSBmdW5jdGlvbiBzdG9wQ3JpdGVyaWFQcm9taXNlUmVzb2x2ZTIoKSB7CiAgICAgICAgICAgICAgc3RvcENyaXRlcmlhID0gdHJ1ZTsKICAgICAgICAgICAgICByZXMoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgIH0pOwogICAgICAgICAgdmFyIGhhbmRsZU1lc3NhZ2UgPSBmdW5jdGlvbiBoYW5kbGVNZXNzYWdlMihtc2cpIHsKICAgICAgICAgICAgaWYgKG1zZy5jb250ZXh0ID09PSAibGVhZGVyIiAmJiBtc2cudG9rZW4gIT0gX3RoaXMyLnRva2VuKSB7CiAgICAgICAgICAgICAgaWYgKG1zZy5hY3Rpb24gPT09ICJhcHBseSIpIHsKICAgICAgICAgICAgICAgIGlmIChtc2cudG9rZW4gPiBfdGhpczIudG9rZW4pIHsKICAgICAgICAgICAgICAgICAgc3RvcENyaXRlcmlhUHJvbWlzZVJlc29sdmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKG1zZy5hY3Rpb24gPT09ICJ0ZWxsIikgewogICAgICAgICAgICAgICAgc3RvcENyaXRlcmlhUHJvbWlzZVJlc29sdmUoKTsKICAgICAgICAgICAgICAgIF90aGlzMi5faGFzTGVhZGVyID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICBfdGhpczIuYnJvYWRjYXN0Q2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJpbnRlcm5hbCIsIGhhbmRsZU1lc3NhZ2UpOwogICAgICAgICAgdmFyIHdhaXRGb3JBbnN3ZXJUaW1lID0gaXNGcm9tRmFsbGJhY2tJbnRlcnZhbCA/IF90aGlzMi5fb3B0aW9ucy5yZXNwb25zZVRpbWUgKiA0IDogX3RoaXMyLl9vcHRpb25zLnJlc3BvbnNlVGltZTsKICAgICAgICAgIHJldHVybiBzZW5kTGVhZGVyTWVzc2FnZShfdGhpczIsICJhcHBseSIpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJhY2UoW3NsZWVwKHdhaXRGb3JBbnN3ZXJUaW1lKSwgc3RvcENyaXRlcmlhUHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoKSk7CiAgICAgICAgICAgIH0pXSk7CiAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gc2VuZExlYWRlck1lc3NhZ2UoX3RoaXMyLCAiYXBwbHkiKTsKICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJhY2UoW3NsZWVwKHdhaXRGb3JBbnN3ZXJUaW1lKSwgc3RvcENyaXRlcmlhUHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoKSk7CiAgICAgICAgICAgIH0pXSk7CiAgICAgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbigpIHsKICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIF90aGlzMi5icm9hZGNhc3RDaGFubmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImludGVybmFsIiwgaGFuZGxlTWVzc2FnZSk7CiAgICAgICAgICAgIGlmICghc3RvcENyaXRlcmlhKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGJlTGVhZGVyKF90aGlzMikudGhlbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICB0aGlzLl9hcGxRQyA9IHRoaXMuX2FwbFFDICsgMTsKICAgICAgICB0aGlzLl9hcGxRID0gdGhpcy5fYXBsUS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGFwcGx5UnVuKCk7CiAgICAgICAgfSkudGhlbihmdW5jdGlvbigpIHsKICAgICAgICAgIF90aGlzMi5fYXBsUUMgPSBfdGhpczIuX2FwbFFDIC0gMTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdGhpcy5fYXBsUS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIF90aGlzMi5pc0xlYWRlcjsKICAgICAgICB9KTsKICAgICAgfSwKICAgICAgYXdhaXRMZWFkZXJzaGlwOiBmdW5jdGlvbiBhd2FpdExlYWRlcnNoaXAyKCkgewogICAgICAgIGlmICgKICAgICAgICAgIC8qIF9hd2FpdExlYWRlcnNoaXBQcm9taXNlICovCiAgICAgICAgICAhdGhpcy5fYUxQCiAgICAgICAgKSB7CiAgICAgICAgICB0aGlzLl9hTFAgPSBfYXdhaXRMZWFkZXJzaGlwT25jZSh0aGlzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2FMUDsKICAgICAgfSwKICAgICAgc2V0IG9uZHVwbGljYXRlKGZuKSB7CiAgICAgICAgdGhpcy5fZHBMID0gZm47CiAgICAgIH0sCiAgICAgIGRpZTogZnVuY3Rpb24gZGllMigpIHsKICAgICAgICB2YXIgX3RoaXMzID0gdGhpczsKICAgICAgICB0aGlzLl9sc3Rucy5mb3JFYWNoKGZ1bmN0aW9uKGxpc3RlbmVyMikgewogICAgICAgICAgcmV0dXJuIF90aGlzMy5icm9hZGNhc3RDaGFubmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImludGVybmFsIiwgbGlzdGVuZXIyKTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLl9sc3RucyA9IFtdOwogICAgICAgIHRoaXMuX3VubC5mb3JFYWNoKGZ1bmN0aW9uKHVGbikgewogICAgICAgICAgcmV0dXJuIHVGbi5yZW1vdmUoKTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLl91bmwgPSBbXTsKICAgICAgICBpZiAodGhpcy5pc0xlYWRlcikgewogICAgICAgICAgdGhpcy5faGFzTGVhZGVyID0gZmFsc2U7CiAgICAgICAgICB0aGlzLmlzTGVhZGVyID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHRoaXMuaXNEZWFkID0gdHJ1ZTsKICAgICAgICByZXR1cm4gc2VuZExlYWRlck1lc3NhZ2UodGhpcywgImRlYXRoIik7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvaW5kZXguanMKdmFyIGluaXRfZXNicm93c2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL2luZGV4LmpzIigpIHsKICAgIGluaXRfYnJvYWRjYXN0X2NoYW5uZWwoKTsKICAgIGluaXRfbGVhZGVyX2VsZWN0aW9uKCk7CiAgICBpbml0X2xlYWRlcl9lbGVjdGlvbl91dGlsKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNvbW1zQDEuMC4zMC9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jb21tcy9kaXN0X3RzL2RlZXMtY29tbXMucGx1Z2lucy5qcwp2YXIgaW5pdF9kZWVzX2NvbW1zX3BsdWdpbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNvbW1zQDEuMC4zMC9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jb21tcy9kaXN0X3RzL2RlZXMtY29tbXMucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMzKCk7CiAgICBpbml0X2Rpc3RfdHM0KCk7CiAgICBpbml0X2Rpc3RfdHMxNSgpOwogICAgaW5pdF9lc2Jyb3dzZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY29tbXNAMS4wLjMwL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNvbW1zL2Rpc3RfdHMvZGVlcy1jb21tcy5jbGFzc2VzLmRlZXNjb21tcy5qcwp2YXIgQnJvYWRjYXN0Q2hhbm5lbDQsIERlZXNDb21tczsKdmFyIGluaXRfZGVlc19jb21tc19jbGFzc2VzX2RlZXNjb21tcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY29tbXNAMS4wLjMwL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNvbW1zL2Rpc3RfdHMvZGVlcy1jb21tcy5jbGFzc2VzLmRlZXNjb21tcy5qcyIoKSB7CiAgICBpbml0X2RlZXNfY29tbXNfcGx1Z2lucygpOwogICAgQnJvYWRjYXN0Q2hhbm5lbDQgPSBnbG9iYWxUaGlzLkJyb2FkY2FzdENoYW5uZWw7CiAgICBpZiAoIUJyb2FkY2FzdENoYW5uZWw0KSB7CiAgICAgIEJyb2FkY2FzdENoYW5uZWw0ID0gQnJvYWRjYXN0Q2hhbm5lbDI7CiAgICB9CiAgICBEZWVzQ29tbXMgPSBjbGFzcyB7CiAgICAgIC8vIHJlY2VpdmluZyBtZXNzYWdlcwogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLmJyb2FkY2FzdENoYW5uZWwgPSBuZXcgQnJvYWRjYXN0Q2hhbm5lbDQoImRlZXMtY29tbXMiKTsKICAgICAgICB0aGlzLnR5cGVkcm91dGVyID0gbmV3IGRpc3RfdHNfZXhwb3J0czE1LlR5cGVkUm91dGVyKCk7CiAgICAgICAgdGhpcy50eXBlZHRhcmdldCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxNS5UeXBlZFRhcmdldCh7CiAgICAgICAgICBwb3N0TWV0aG9kV2l0aFR5cGVkUm91dGVyOiBhc3luYyAobWVzc2FnZUFyZykgPT4gewogICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKG1lc3NhZ2VBcmcpOwogICAgICAgICAgfSwKICAgICAgICAgIHR5cGVkUm91dGVyUmVmOiB0aGlzLnR5cGVkcm91dGVyCiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5icm9hZGNhc3RDaGFubmVsLm9ubWVzc2FnZSA9IGFzeW5jIChldmVudEFyZykgPT4gewogICAgICAgICAgY29uc3QgbWVzc2FnZTIgPSBldmVudEFyZy5tZXRob2QgPyBldmVudEFyZyA6IGV2ZW50QXJnLmRhdGE7CiAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShtZXNzYWdlMikpOwogICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnR5cGVkcm91dGVyLnJvdXRlQW5kQWRkUmVzcG9uc2UobWVzc2FnZTIsIHsgc2tpcEhvb2tzOiB0cnVlIH0pOwogICAgICAgICAgaWYgKHJlc3BvbnNlICYmICFyZXNwb25zZS5lcnJvcikgewogICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKHJlc3BvbnNlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQogICAgICAvKioKICAgICAgICogY3JlYXRlcyBhIHR5cGVkcmVxdWVzdCB3aXRoIHRoaXMgY2xhc3NlcyBwb3N0TWVzc2FnZSBhcyBwb3N0TWV0aG9kCiAgICAgICAqLwogICAgICBjcmVhdGVUeXBlZFJlcXVlc3QobWV0aG9kTmFtZSkgewogICAgICAgIGNvbnN0IHR5cGVkcmVxdWVzdCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxNS5UeXBlZFJlcXVlc3QodGhpcy50eXBlZHRhcmdldCwgbWV0aG9kTmFtZSk7CiAgICAgICAgcmV0dXJuIHR5cGVkcmVxdWVzdDsKICAgICAgfQogICAgICAvKioKICAgICAgICogcG9zdHMgYSB0eXBlZHJlcXVlc3RtZXNzYWdlCiAgICAgICAqLwogICAgICBhc3luYyBwb3N0TWVzc2FnZShtZXNzYWdlQXJnKSB7CiAgICAgICAgdGhpcy5icm9hZGNhc3RDaGFubmVsLnBvc3RNZXNzYWdlKG1lc3NhZ2VBcmcpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBzdWJzY3JpYmUgdG8gbWVzc2FnZXMKICAgICAgICovCiAgICAgIGFzeW5jIGNyZWF0ZVR5cGVkSGFuZGxlcihtZXRob2RBcmcsIGhhbmRsZXJGdW5jdGlvbikgewogICAgICAgIHRoaXMudHlwZWRyb3V0ZXIuYWRkVHlwZWRIYW5kbGVyKG5ldyBkaXN0X3RzX2V4cG9ydHMxNS5UeXBlZEhhbmRsZXIobWV0aG9kQXJnLCBoYW5kbGVyRnVuY3Rpb24pKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY29tbXNAMS4wLjMwL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNvbW1zL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czE2ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czE2LCB7CiAgRGVlc0NvbW1zOiAoKSA9PiBEZWVzQ29tbXMKfSk7CnZhciBpbml0X2Rpc3RfdHMxNiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY29tbXNAMS4wLjMwL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNvbW1zL2Rpc3RfdHMvaW5kZXguanMiKCkgewogICAgaW5pdF9kZWVzX2NvbW1zX2NsYXNzZXNfZGVlc2NvbW1zKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9jb21tb24uanMKdmFyIHJlcXVpcmVfY29tbW9uID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9jb21tb24uanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgZnVuY3Rpb24gaXNOb3RoaW5nKHN1YmplY3QpIHsKICAgICAgcmV0dXJuIHR5cGVvZiBzdWJqZWN0ID09PSAidW5kZWZpbmVkIiB8fCBzdWJqZWN0ID09PSBudWxsOwogICAgfQogICAgZnVuY3Rpb24gaXNPYmplY3QzKHN1YmplY3QpIHsKICAgICAgcmV0dXJuIHR5cGVvZiBzdWJqZWN0ID09PSAib2JqZWN0IiAmJiBzdWJqZWN0ICE9PSBudWxsOwogICAgfQogICAgZnVuY3Rpb24gdG9BcnJheTMoc2VxdWVuY2UpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VxdWVuY2UpKSByZXR1cm4gc2VxdWVuY2U7CiAgICAgIGVsc2UgaWYgKGlzTm90aGluZyhzZXF1ZW5jZSkpIHJldHVybiBbXTsKICAgICAgcmV0dXJuIFtzZXF1ZW5jZV07CiAgICB9CiAgICBmdW5jdGlvbiBleHRlbmQzKHRhcmdldCwgc291cmNlKSB7CiAgICAgIHZhciBpbmRleDIsIGxlbmd0aCwga2V5Miwgc291cmNlS2V5czsKICAgICAgaWYgKHNvdXJjZSkgewogICAgICAgIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOwogICAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gc291cmNlS2V5cy5sZW5ndGg7IGluZGV4MiA8IGxlbmd0aDsgaW5kZXgyICs9IDEpIHsKICAgICAgICAgIGtleTIgPSBzb3VyY2VLZXlzW2luZGV4Ml07CiAgICAgICAgICB0YXJnZXRba2V5Ml0gPSBzb3VyY2Vba2V5Ml07CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CiAgICBmdW5jdGlvbiByZXBlYXQzKHN0cmluZzMsIGNvdW50MikgewogICAgICB2YXIgcmVzdWx0ID0gIiIsIGN5Y2xlOwogICAgICBmb3IgKGN5Y2xlID0gMDsgY3ljbGUgPCBjb3VudDI7IGN5Y2xlICs9IDEpIHsKICAgICAgICByZXN1bHQgKz0gc3RyaW5nMzsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gaXNOZWdhdGl2ZVplcm8obnVtYmVyMikgewogICAgICByZXR1cm4gbnVtYmVyMiA9PT0gMCAmJiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPT09IDEgLyBudW1iZXIyOwogICAgfQogICAgbW9kdWxlLmV4cG9ydHMuaXNOb3RoaW5nID0gaXNOb3RoaW5nOwogICAgbW9kdWxlLmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDM7CiAgICBtb2R1bGUuZXhwb3J0cy50b0FycmF5ID0gdG9BcnJheTM7CiAgICBtb2R1bGUuZXhwb3J0cy5yZXBlYXQgPSByZXBlYXQzOwogICAgbW9kdWxlLmV4cG9ydHMuaXNOZWdhdGl2ZVplcm8gPSBpc05lZ2F0aXZlWmVybzsKICAgIG1vZHVsZS5leHBvcnRzLmV4dGVuZCA9IGV4dGVuZDM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9leGNlcHRpb24uanMKdmFyIHJlcXVpcmVfZXhjZXB0aW9uID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9leGNlcHRpb24uanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgZnVuY3Rpb24gWUFNTEV4Y2VwdGlvbihyZWFzb24sIG1hcmsyKSB7CiAgICAgIEVycm9yLmNhbGwodGhpcyk7CiAgICAgIHRoaXMubmFtZSA9ICJZQU1MRXhjZXB0aW9uIjsKICAgICAgdGhpcy5yZWFzb24gPSByZWFzb247CiAgICAgIHRoaXMubWFyayA9IG1hcmsyOwogICAgICB0aGlzLm1lc3NhZ2UgPSAodGhpcy5yZWFzb24gfHwgIih1bmtub3duIHJlYXNvbikiKSArICh0aGlzLm1hcmsgPyAiICIgKyB0aGlzLm1hcmsudG9TdHJpbmcoKSA6ICIiKTsKICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7CiAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5zdGFjayA9IG5ldyBFcnJvcigpLnN0YWNrIHx8ICIiOwogICAgICB9CiAgICB9CiAgICBZQU1MRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTsKICAgIFlBTUxFeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gWUFNTEV4Y2VwdGlvbjsKICAgIFlBTUxFeGNlcHRpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmczKGNvbXBhY3QpIHsKICAgICAgdmFyIHJlc3VsdCA9IHRoaXMubmFtZSArICI6ICI7CiAgICAgIHJlc3VsdCArPSB0aGlzLnJlYXNvbiB8fCAiKHVua25vd24gcmVhc29uKSI7CiAgICAgIGlmICghY29tcGFjdCAmJiB0aGlzLm1hcmspIHsKICAgICAgICByZXN1bHQgKz0gIiAiICsgdGhpcy5tYXJrLnRvU3RyaW5nKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CiAgICBtb2R1bGUuZXhwb3J0cyA9IFlBTUxFeGNlcHRpb247CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9tYXJrLmpzCnZhciByZXF1aXJlX21hcmsgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL21hcmsuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGNvbW1vbiA9IHJlcXVpcmVfY29tbW9uKCk7CiAgICBmdW5jdGlvbiBNYXJrKG5hbWUsIGJ1ZmZlcjIsIHBvc2l0aW9uMywgbGluZSwgY29sdW1uKSB7CiAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyMjsKICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uMzsKICAgICAgdGhpcy5saW5lID0gbGluZTsKICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICB9CiAgICBNYXJrLnByb3RvdHlwZS5nZXRTbmlwcGV0ID0gZnVuY3Rpb24gZ2V0U25pcHBldChpbmRlbnQzLCBtYXhMZW5ndGgpIHsKICAgICAgdmFyIGhlYWQyLCBzdGFydCwgdGFpbCwgZW5kMywgc25pcHBldDsKICAgICAgaWYgKCF0aGlzLmJ1ZmZlcikgcmV0dXJuIG51bGw7CiAgICAgIGluZGVudDMgPSBpbmRlbnQzIHx8IDQ7CiAgICAgIG1heExlbmd0aCA9IG1heExlbmd0aCB8fCA3NTsKICAgICAgaGVhZDIgPSAiIjsKICAgICAgc3RhcnQgPSB0aGlzLnBvc2l0aW9uOwogICAgICB3aGlsZSAoc3RhcnQgPiAwICYmICJcMFxyXG5ceDg1XHUyMDI4XHUyMDI5Ii5pbmRleE9mKHRoaXMuYnVmZmVyLmNoYXJBdChzdGFydCAtIDEpKSA9PT0gLTEpIHsKICAgICAgICBzdGFydCAtPSAxOwogICAgICAgIGlmICh0aGlzLnBvc2l0aW9uIC0gc3RhcnQgPiBtYXhMZW5ndGggLyAyIC0gMSkgewogICAgICAgICAgaGVhZDIgPSAiIC4uLiAiOwogICAgICAgICAgc3RhcnQgKz0gNTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICB0YWlsID0gIiI7CiAgICAgIGVuZDMgPSB0aGlzLnBvc2l0aW9uOwogICAgICB3aGlsZSAoZW5kMyA8IHRoaXMuYnVmZmVyLmxlbmd0aCAmJiAiXDBcclxuXHg4NVx1MjAyOFx1MjAyOSIuaW5kZXhPZih0aGlzLmJ1ZmZlci5jaGFyQXQoZW5kMykpID09PSAtMSkgewogICAgICAgIGVuZDMgKz0gMTsKICAgICAgICBpZiAoZW5kMyAtIHRoaXMucG9zaXRpb24gPiBtYXhMZW5ndGggLyAyIC0gMSkgewogICAgICAgICAgdGFpbCA9ICIgLi4uICI7CiAgICAgICAgICBlbmQzIC09IDU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgc25pcHBldCA9IHRoaXMuYnVmZmVyLnNsaWNlKHN0YXJ0LCBlbmQzKTsKICAgICAgcmV0dXJuIGNvbW1vbi5yZXBlYXQoIiAiLCBpbmRlbnQzKSArIGhlYWQyICsgc25pcHBldCArIHRhaWwgKyAiXG4iICsgY29tbW9uLnJlcGVhdCgiICIsIGluZGVudDMgKyB0aGlzLnBvc2l0aW9uIC0gc3RhcnQgKyBoZWFkMi5sZW5ndGgpICsgIl4iOwogICAgfTsKICAgIE1hcmsucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmczKGNvbXBhY3QpIHsKICAgICAgdmFyIHNuaXBwZXQsIHdoZXJlID0gIiI7CiAgICAgIGlmICh0aGlzLm5hbWUpIHsKICAgICAgICB3aGVyZSArPSAnaW4gIicgKyB0aGlzLm5hbWUgKyAnIiAnOwogICAgICB9CiAgICAgIHdoZXJlICs9ICJhdCBsaW5lICIgKyAodGhpcy5saW5lICsgMSkgKyAiLCBjb2x1bW4gIiArICh0aGlzLmNvbHVtbiArIDEpOwogICAgICBpZiAoIWNvbXBhY3QpIHsKICAgICAgICBzbmlwcGV0ID0gdGhpcy5nZXRTbmlwcGV0KCk7CiAgICAgICAgaWYgKHNuaXBwZXQpIHsKICAgICAgICAgIHdoZXJlICs9ICI6XG4iICsgc25pcHBldDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHdoZXJlOwogICAgfTsKICAgIG1vZHVsZS5leHBvcnRzID0gTWFyazsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUuanMKdmFyIHJlcXVpcmVfdHlwZSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgWUFNTEV4Y2VwdGlvbiA9IHJlcXVpcmVfZXhjZXB0aW9uKCk7CiAgICB2YXIgVFlQRV9DT05TVFJVQ1RPUl9PUFRJT05TID0gWwogICAgICAia2luZCIsCiAgICAgICJyZXNvbHZlIiwKICAgICAgImNvbnN0cnVjdCIsCiAgICAgICJpbnN0YW5jZU9mIiwKICAgICAgInByZWRpY2F0ZSIsCiAgICAgICJyZXByZXNlbnQiLAogICAgICAiZGVmYXVsdFN0eWxlIiwKICAgICAgInN0eWxlQWxpYXNlcyIKICAgIF07CiAgICB2YXIgWUFNTF9OT0RFX0tJTkRTID0gWwogICAgICAic2NhbGFyIiwKICAgICAgInNlcXVlbmNlIiwKICAgICAgIm1hcHBpbmciCiAgICBdOwogICAgZnVuY3Rpb24gY29tcGlsZVN0eWxlQWxpYXNlcyhtYXA3KSB7CiAgICAgIHZhciByZXN1bHQgPSB7fTsKICAgICAgaWYgKG1hcDcgIT09IG51bGwpIHsKICAgICAgICBPYmplY3Qua2V5cyhtYXA3KS5mb3JFYWNoKGZ1bmN0aW9uKHN0eWxlKSB7CiAgICAgICAgICBtYXA3W3N0eWxlXS5mb3JFYWNoKGZ1bmN0aW9uKGFsaWFzKSB7CiAgICAgICAgICAgIHJlc3VsdFtTdHJpbmcoYWxpYXMpXSA9IHN0eWxlOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGZ1bmN0aW9uIFR5cGUodGFnLCBvcHRpb25zKSB7CiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICBPYmplY3Qua2V5cyhvcHRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICBpZiAoVFlQRV9DT05TVFJVQ1RPUl9PUFRJT05TLmluZGV4T2YobmFtZSkgPT09IC0xKSB7CiAgICAgICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignVW5rbm93biBvcHRpb24gIicgKyBuYW1lICsgJyIgaXMgbWV0IGluIGRlZmluaXRpb24gb2YgIicgKyB0YWcgKyAnIiBZQU1MIHR5cGUuJyk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdGhpcy50YWcgPSB0YWc7CiAgICAgIHRoaXMua2luZCA9IG9wdGlvbnNbImtpbmQiXSB8fCBudWxsOwogICAgICB0aGlzLnJlc29sdmUgPSBvcHRpb25zWyJyZXNvbHZlIl0gfHwgZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH07CiAgICAgIHRoaXMuY29uc3RydWN0ID0gb3B0aW9uc1siY29uc3RydWN0Il0gfHwgZnVuY3Rpb24oZGF0YSkgewogICAgICAgIHJldHVybiBkYXRhOwogICAgICB9OwogICAgICB0aGlzLmluc3RhbmNlT2YgPSBvcHRpb25zWyJpbnN0YW5jZU9mIl0gfHwgbnVsbDsKICAgICAgdGhpcy5wcmVkaWNhdGUgPSBvcHRpb25zWyJwcmVkaWNhdGUiXSB8fCBudWxsOwogICAgICB0aGlzLnJlcHJlc2VudCA9IG9wdGlvbnNbInJlcHJlc2VudCJdIHx8IG51bGw7CiAgICAgIHRoaXMuZGVmYXVsdFN0eWxlID0gb3B0aW9uc1siZGVmYXVsdFN0eWxlIl0gfHwgbnVsbDsKICAgICAgdGhpcy5zdHlsZUFsaWFzZXMgPSBjb21waWxlU3R5bGVBbGlhc2VzKG9wdGlvbnNbInN0eWxlQWxpYXNlcyJdIHx8IG51bGwpOwogICAgICBpZiAoWUFNTF9OT0RFX0tJTkRTLmluZGV4T2YodGhpcy5raW5kKSA9PT0gLTEpIHsKICAgICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignVW5rbm93biBraW5kICInICsgdGhpcy5raW5kICsgJyIgaXMgc3BlY2lmaWVkIGZvciAiJyArIHRhZyArICciIFlBTUwgdHlwZS4nKTsKICAgICAgfQogICAgfQogICAgbW9kdWxlLmV4cG9ydHMgPSBUeXBlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hLmpzCnZhciByZXF1aXJlX3NjaGVtYSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBjb21tb24gPSByZXF1aXJlX2NvbW1vbigpOwogICAgdmFyIFlBTUxFeGNlcHRpb24gPSByZXF1aXJlX2V4Y2VwdGlvbigpOwogICAgdmFyIFR5cGUgPSByZXF1aXJlX3R5cGUoKTsKICAgIGZ1bmN0aW9uIGNvbXBpbGVMaXN0KHNjaGVtYSwgbmFtZSwgcmVzdWx0KSB7CiAgICAgIHZhciBleGNsdWRlID0gW107CiAgICAgIHNjaGVtYS5pbmNsdWRlLmZvckVhY2goZnVuY3Rpb24oaW5jbHVkZWRTY2hlbWEpIHsKICAgICAgICByZXN1bHQgPSBjb21waWxlTGlzdChpbmNsdWRlZFNjaGVtYSwgbmFtZSwgcmVzdWx0KTsKICAgICAgfSk7CiAgICAgIHNjaGVtYVtuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uKGN1cnJlbnRUeXBlKSB7CiAgICAgICAgcmVzdWx0LmZvckVhY2goZnVuY3Rpb24ocHJldmlvdXNUeXBlLCBwcmV2aW91c0luZGV4KSB7CiAgICAgICAgICBpZiAocHJldmlvdXNUeXBlLnRhZyA9PT0gY3VycmVudFR5cGUudGFnICYmIHByZXZpb3VzVHlwZS5raW5kID09PSBjdXJyZW50VHlwZS5raW5kKSB7CiAgICAgICAgICAgIGV4Y2x1ZGUucHVzaChwcmV2aW91c0luZGV4KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXN1bHQucHVzaChjdXJyZW50VHlwZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gcmVzdWx0LmZpbHRlcihmdW5jdGlvbih0eXBlNSwgaW5kZXgyKSB7CiAgICAgICAgcmV0dXJuIGV4Y2x1ZGUuaW5kZXhPZihpbmRleDIpID09PSAtMTsKICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBjb21waWxlTWFwKCkgewogICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgIHNjYWxhcjoge30sCiAgICAgICAgc2VxdWVuY2U6IHt9LAogICAgICAgIG1hcHBpbmc6IHt9LAogICAgICAgIGZhbGxiYWNrOiB7fQogICAgICB9LCBpbmRleDIsIGxlbmd0aDsKICAgICAgZnVuY3Rpb24gY29sbGVjdFR5cGUodHlwZTUpIHsKICAgICAgICByZXN1bHRbdHlwZTUua2luZF1bdHlwZTUudGFnXSA9IHJlc3VsdFsiZmFsbGJhY2siXVt0eXBlNS50YWddID0gdHlwZTU7CiAgICAgIH0KICAgICAgZm9yIChpbmRleDIgPSAwLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgYXJndW1lbnRzW2luZGV4Ml0uZm9yRWFjaChjb2xsZWN0VHlwZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGZ1bmN0aW9uIFNjaGVtYTIoZGVmaW5pdGlvbjMpIHsKICAgICAgdGhpcy5pbmNsdWRlID0gZGVmaW5pdGlvbjMuaW5jbHVkZSB8fCBbXTsKICAgICAgdGhpcy5pbXBsaWNpdCA9IGRlZmluaXRpb24zLmltcGxpY2l0IHx8IFtdOwogICAgICB0aGlzLmV4cGxpY2l0ID0gZGVmaW5pdGlvbjMuZXhwbGljaXQgfHwgW107CiAgICAgIHRoaXMuaW1wbGljaXQuZm9yRWFjaChmdW5jdGlvbih0eXBlNSkgewogICAgICAgIGlmICh0eXBlNS5sb2FkS2luZCAmJiB0eXBlNS5sb2FkS2luZCAhPT0gInNjYWxhciIpIHsKICAgICAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCJUaGVyZSBpcyBhIG5vbi1zY2FsYXIgdHlwZSBpbiB0aGUgaW1wbGljaXQgbGlzdCBvZiBhIHNjaGVtYS4gSW1wbGljaXQgcmVzb2x2aW5nIG9mIHN1Y2ggdHlwZXMgaXMgbm90IHN1cHBvcnRlZC4iKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLmNvbXBpbGVkSW1wbGljaXQgPSBjb21waWxlTGlzdCh0aGlzLCAiaW1wbGljaXQiLCBbXSk7CiAgICAgIHRoaXMuY29tcGlsZWRFeHBsaWNpdCA9IGNvbXBpbGVMaXN0KHRoaXMsICJleHBsaWNpdCIsIFtdKTsKICAgICAgdGhpcy5jb21waWxlZFR5cGVNYXAgPSBjb21waWxlTWFwKHRoaXMuY29tcGlsZWRJbXBsaWNpdCwgdGhpcy5jb21waWxlZEV4cGxpY2l0KTsKICAgIH0KICAgIFNjaGVtYTIuREVGQVVMVCA9IG51bGw7CiAgICBTY2hlbWEyLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZVNjaGVtYSgpIHsKICAgICAgdmFyIHNjaGVtYXMsIHR5cGVzOwogICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICBzY2hlbWFzID0gU2NoZW1hMi5ERUZBVUxUOwogICAgICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMF07CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICBzY2hlbWFzID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMV07CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIFNjaGVtYS5jcmVhdGUgZnVuY3Rpb24iKTsKICAgICAgfQogICAgICBzY2hlbWFzID0gY29tbW9uLnRvQXJyYXkoc2NoZW1hcyk7CiAgICAgIHR5cGVzID0gY29tbW9uLnRvQXJyYXkodHlwZXMpOwogICAgICBpZiAoIXNjaGVtYXMuZXZlcnkoZnVuY3Rpb24oc2NoZW1hKSB7CiAgICAgICAgcmV0dXJuIHNjaGVtYSBpbnN0YW5jZW9mIFNjaGVtYTI7CiAgICAgIH0pKSB7CiAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oIlNwZWNpZmllZCBsaXN0IG9mIHN1cGVyIHNjaGVtYXMgKG9yIGEgc2luZ2xlIFNjaGVtYSBvYmplY3QpIGNvbnRhaW5zIGEgbm9uLVNjaGVtYSBvYmplY3QuIik7CiAgICAgIH0KICAgICAgaWYgKCF0eXBlcy5ldmVyeShmdW5jdGlvbih0eXBlNSkgewogICAgICAgIHJldHVybiB0eXBlNSBpbnN0YW5jZW9mIFR5cGU7CiAgICAgIH0pKSB7CiAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oIlNwZWNpZmllZCBsaXN0IG9mIFlBTUwgdHlwZXMgKG9yIGEgc2luZ2xlIFR5cGUgb2JqZWN0KSBjb250YWlucyBhIG5vbi1UeXBlIG9iamVjdC4iKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFNjaGVtYTIoewogICAgICAgIGluY2x1ZGU6IHNjaGVtYXMsCiAgICAgICAgZXhwbGljaXQ6IHR5cGVzCiAgICAgIH0pOwogICAgfTsKICAgIG1vZHVsZS5leHBvcnRzID0gU2NoZW1hMjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc3RyLmpzCnZhciByZXF1aXJlX3N0ciA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zdHIuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUgPSByZXF1aXJlX3R5cGUoKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOnN0ciIsIHsKICAgICAga2luZDogInNjYWxhciIsCiAgICAgIGNvbnN0cnVjdDogZnVuY3Rpb24oZGF0YSkgewogICAgICAgIHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6ICIiOwogICAgICB9CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc2VxLmpzCnZhciByZXF1aXJlX3NlcSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zZXEuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUgPSByZXF1aXJlX3R5cGUoKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOnNlcSIsIHsKICAgICAga2luZDogInNlcXVlbmNlIiwKICAgICAgY29uc3RydWN0OiBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDogW107CiAgICAgIH0KICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tYXAuanMKdmFyIHJlcXVpcmVfbWFwID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL21hcC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6bWFwIiwgewogICAgICBraW5kOiAibWFwcGluZyIsCiAgICAgIGNvbnN0cnVjdDogZnVuY3Rpb24oZGF0YSkgewogICAgICAgIHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IHt9OwogICAgICB9CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9mYWlsc2FmZS5qcwp2YXIgcmVxdWlyZV9mYWlsc2FmZSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBTY2hlbWEyID0gcmVxdWlyZV9zY2hlbWEoKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYTIoewogICAgICBleHBsaWNpdDogWwogICAgICAgIHJlcXVpcmVfc3RyKCksCiAgICAgICAgcmVxdWlyZV9zZXEoKSwKICAgICAgICByZXF1aXJlX21hcCgpCiAgICAgIF0KICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9udWxsLmpzCnZhciByZXF1aXJlX251bGwgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbnVsbC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxOdWxsKGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlOwogICAgICB2YXIgbWF4MyA9IGRhdGEubGVuZ3RoOwogICAgICByZXR1cm4gbWF4MyA9PT0gMSAmJiBkYXRhID09PSAifiIgfHwgbWF4MyA9PT0gNCAmJiAoZGF0YSA9PT0gIm51bGwiIHx8IGRhdGEgPT09ICJOdWxsIiB8fCBkYXRhID09PSAiTlVMTCIpOwogICAgfQogICAgZnVuY3Rpb24gY29uc3RydWN0WWFtbE51bGwoKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZnVuY3Rpb24gaXNOdWxsKG9iamVjdCkgewogICAgICByZXR1cm4gb2JqZWN0ID09PSBudWxsOwogICAgfQogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6bnVsbCIsIHsKICAgICAga2luZDogInNjYWxhciIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVZYW1sTnVsbCwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sTnVsbCwKICAgICAgcHJlZGljYXRlOiBpc051bGwsCiAgICAgIHJlcHJlc2VudDogewogICAgICAgIGNhbm9uaWNhbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gIn4iOwogICAgICAgIH0sCiAgICAgICAgbG93ZXJjYXNlOiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiAibnVsbCI7CiAgICAgICAgfSwKICAgICAgICB1cHBlcmNhc2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuICJOVUxMIjsKICAgICAgICB9LAogICAgICAgIGNhbWVsY2FzZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gIk51bGwiOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZGVmYXVsdFN0eWxlOiAibG93ZXJjYXNlIgogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Jvb2wuanMKdmFyIHJlcXVpcmVfYm9vbCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9ib29sLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBUeXBlID0gcmVxdWlyZV90eXBlKCk7CiAgICBmdW5jdGlvbiByZXNvbHZlWWFtbEJvb2xlYW4oZGF0YSkgewogICAgICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICB2YXIgbWF4MyA9IGRhdGEubGVuZ3RoOwogICAgICByZXR1cm4gbWF4MyA9PT0gNCAmJiAoZGF0YSA9PT0gInRydWUiIHx8IGRhdGEgPT09ICJUcnVlIiB8fCBkYXRhID09PSAiVFJVRSIpIHx8IG1heDMgPT09IDUgJiYgKGRhdGEgPT09ICJmYWxzZSIgfHwgZGF0YSA9PT0gIkZhbHNlIiB8fCBkYXRhID09PSAiRkFMU0UiKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxCb29sZWFuKGRhdGEpIHsKICAgICAgcmV0dXJuIGRhdGEgPT09ICJ0cnVlIiB8fCBkYXRhID09PSAiVHJ1ZSIgfHwgZGF0YSA9PT0gIlRSVUUiOwogICAgfQogICAgZnVuY3Rpb24gaXNCb29sZWFuKG9iamVjdCkgewogICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICJbb2JqZWN0IEJvb2xlYW5dIjsKICAgIH0KICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOmJvb2wiLCB7CiAgICAgIGtpbmQ6ICJzY2FsYXIiLAogICAgICByZXNvbHZlOiByZXNvbHZlWWFtbEJvb2xlYW4sCiAgICAgIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEJvb2xlYW4sCiAgICAgIHByZWRpY2F0ZTogaXNCb29sZWFuLAogICAgICByZXByZXNlbnQ6IHsKICAgICAgICBsb3dlcmNhc2U6IGZ1bmN0aW9uKG9iamVjdCkgewogICAgICAgICAgcmV0dXJuIG9iamVjdCA/ICJ0cnVlIiA6ICJmYWxzZSI7CiAgICAgICAgfSwKICAgICAgICB1cHBlcmNhc2U6IGZ1bmN0aW9uKG9iamVjdCkgewogICAgICAgICAgcmV0dXJuIG9iamVjdCA/ICJUUlVFIiA6ICJGQUxTRSI7CiAgICAgICAgfSwKICAgICAgICBjYW1lbGNhc2U6IGZ1bmN0aW9uKG9iamVjdCkgewogICAgICAgICAgcmV0dXJuIG9iamVjdCA/ICJUcnVlIiA6ICJGYWxzZSI7CiAgICAgICAgfQogICAgICB9LAogICAgICBkZWZhdWx0U3R5bGU6ICJsb3dlcmNhc2UiCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvaW50LmpzCnZhciByZXF1aXJlX2ludCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9pbnQuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGNvbW1vbiA9IHJlcXVpcmVfY29tbW9uKCk7CiAgICB2YXIgVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgZnVuY3Rpb24gaXNIZXhDb2RlKGMxMSkgewogICAgICByZXR1cm4gNDggPD0gYzExICYmIGMxMSA8PSA1NyB8fCA2NSA8PSBjMTEgJiYgYzExIDw9IDcwIHx8IDk3IDw9IGMxMSAmJiBjMTEgPD0gMTAyOwogICAgfQogICAgZnVuY3Rpb24gaXNPY3RDb2RlKGMxMSkgewogICAgICByZXR1cm4gNDggPD0gYzExICYmIGMxMSA8PSA1NTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzRGVjQ29kZShjMTEpIHsKICAgICAgcmV0dXJuIDQ4IDw9IGMxMSAmJiBjMTEgPD0gNTc7CiAgICB9CiAgICBmdW5jdGlvbiByZXNvbHZlWWFtbEludGVnZXIoZGF0YSkgewogICAgICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICB2YXIgbWF4MyA9IGRhdGEubGVuZ3RoLCBpbmRleDIgPSAwLCBoYXNEaWdpdHMgPSBmYWxzZSwgY2g7CiAgICAgIGlmICghbWF4MykgcmV0dXJuIGZhbHNlOwogICAgICBjaCA9IGRhdGFbaW5kZXgyXTsKICAgICAgaWYgKGNoID09PSAiLSIgfHwgY2ggPT09ICIrIikgewogICAgICAgIGNoID0gZGF0YVsrK2luZGV4Ml07CiAgICAgIH0KICAgICAgaWYgKGNoID09PSAiMCIpIHsKICAgICAgICBpZiAoaW5kZXgyICsgMSA9PT0gbWF4MykgcmV0dXJuIHRydWU7CiAgICAgICAgY2ggPSBkYXRhWysraW5kZXgyXTsKICAgICAgICBpZiAoY2ggPT09ICJiIikgewogICAgICAgICAgaW5kZXgyKys7CiAgICAgICAgICBmb3IgKDsgaW5kZXgyIDwgbWF4MzsgaW5kZXgyKyspIHsKICAgICAgICAgICAgY2ggPSBkYXRhW2luZGV4Ml07CiAgICAgICAgICAgIGlmIChjaCA9PT0gIl8iKSBjb250aW51ZTsKICAgICAgICAgICAgaWYgKGNoICE9PSAiMCIgJiYgY2ggIT09ICIxIikgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICBoYXNEaWdpdHMgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGhhc0RpZ2l0cyAmJiBjaCAhPT0gIl8iOwogICAgICAgIH0KICAgICAgICBpZiAoY2ggPT09ICJ4IikgewogICAgICAgICAgaW5kZXgyKys7CiAgICAgICAgICBmb3IgKDsgaW5kZXgyIDwgbWF4MzsgaW5kZXgyKyspIHsKICAgICAgICAgICAgY2ggPSBkYXRhW2luZGV4Ml07CiAgICAgICAgICAgIGlmIChjaCA9PT0gIl8iKSBjb250aW51ZTsKICAgICAgICAgICAgaWYgKCFpc0hleENvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4MikpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIGhhc0RpZ2l0cyA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gaGFzRGlnaXRzICYmIGNoICE9PSAiXyI7CiAgICAgICAgfQogICAgICAgIGZvciAoOyBpbmRleDIgPCBtYXgzOyBpbmRleDIrKykgewogICAgICAgICAgY2ggPSBkYXRhW2luZGV4Ml07CiAgICAgICAgICBpZiAoY2ggPT09ICJfIikgY29udGludWU7CiAgICAgICAgICBpZiAoIWlzT2N0Q29kZShkYXRhLmNoYXJDb2RlQXQoaW5kZXgyKSkpIHJldHVybiBmYWxzZTsKICAgICAgICAgIGhhc0RpZ2l0cyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBoYXNEaWdpdHMgJiYgY2ggIT09ICJfIjsKICAgICAgfQogICAgICBpZiAoY2ggPT09ICJfIikgcmV0dXJuIGZhbHNlOwogICAgICBmb3IgKDsgaW5kZXgyIDwgbWF4MzsgaW5kZXgyKyspIHsKICAgICAgICBjaCA9IGRhdGFbaW5kZXgyXTsKICAgICAgICBpZiAoY2ggPT09ICJfIikgY29udGludWU7CiAgICAgICAgaWYgKGNoID09PSAiOiIpIGJyZWFrOwogICAgICAgIGlmICghaXNEZWNDb2RlKGRhdGEuY2hhckNvZGVBdChpbmRleDIpKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBoYXNEaWdpdHMgPSB0cnVlOwogICAgICB9CiAgICAgIGlmICghaGFzRGlnaXRzIHx8IGNoID09PSAiXyIpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKGNoICE9PSAiOiIpIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gL14oOlswLTVdP1swLTldKSskLy50ZXN0KGRhdGEuc2xpY2UoaW5kZXgyKSk7CiAgICB9CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RZYW1sSW50ZWdlcihkYXRhKSB7CiAgICAgIHZhciB2YWx1ZTIgPSBkYXRhLCBzaWduID0gMSwgY2gsIGJhc2UsIGRpZ2l0cyA9IFtdOwogICAgICBpZiAodmFsdWUyLmluZGV4T2YoIl8iKSAhPT0gLTEpIHsKICAgICAgICB2YWx1ZTIgPSB2YWx1ZTIucmVwbGFjZSgvXy9nLCAiIik7CiAgICAgIH0KICAgICAgY2ggPSB2YWx1ZTJbMF07CiAgICAgIGlmIChjaCA9PT0gIi0iIHx8IGNoID09PSAiKyIpIHsKICAgICAgICBpZiAoY2ggPT09ICItIikgc2lnbiA9IC0xOwogICAgICAgIHZhbHVlMiA9IHZhbHVlMi5zbGljZSgxKTsKICAgICAgICBjaCA9IHZhbHVlMlswXTsKICAgICAgfQogICAgICBpZiAodmFsdWUyID09PSAiMCIpIHJldHVybiAwOwogICAgICBpZiAoY2ggPT09ICIwIikgewogICAgICAgIGlmICh2YWx1ZTJbMV0gPT09ICJiIikgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZTIuc2xpY2UoMiksIDIpOwogICAgICAgIGlmICh2YWx1ZTJbMV0gPT09ICJ4IikgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZTIsIDE2KTsKICAgICAgICByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlMiwgOCk7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlMi5pbmRleE9mKCI6IikgIT09IC0xKSB7CiAgICAgICAgdmFsdWUyLnNwbGl0KCI6IikuZm9yRWFjaChmdW5jdGlvbih2NSkgewogICAgICAgICAgZGlnaXRzLnVuc2hpZnQocGFyc2VJbnQodjUsIDEwKSk7CiAgICAgICAgfSk7CiAgICAgICAgdmFsdWUyID0gMDsKICAgICAgICBiYXNlID0gMTsKICAgICAgICBkaWdpdHMuZm9yRWFjaChmdW5jdGlvbihkNikgewogICAgICAgICAgdmFsdWUyICs9IGQ2ICogYmFzZTsKICAgICAgICAgIGJhc2UgKj0gNjA7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHNpZ24gKiB2YWx1ZTI7CiAgICAgIH0KICAgICAgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZTIsIDEwKTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzSW50ZWdlcihvYmplY3QpIHsKICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAiW29iamVjdCBOdW1iZXJdIiAmJiAob2JqZWN0ICUgMSA9PT0gMCAmJiAhY29tbW9uLmlzTmVnYXRpdmVaZXJvKG9iamVjdCkpOwogICAgfQogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6aW50IiwgewogICAgICBraW5kOiAic2NhbGFyIiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxJbnRlZ2VyLAogICAgICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxJbnRlZ2VyLAogICAgICBwcmVkaWNhdGU6IGlzSW50ZWdlciwKICAgICAgcmVwcmVzZW50OiB7CiAgICAgICAgYmluYXJ5OiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgIHJldHVybiBvYmogPj0gMCA/ICIwYiIgKyBvYmoudG9TdHJpbmcoMikgOiAiLTBiIiArIG9iai50b1N0cmluZygyKS5zbGljZSgxKTsKICAgICAgICB9LAogICAgICAgIG9jdGFsOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgIHJldHVybiBvYmogPj0gMCA/ICIwIiArIG9iai50b1N0cmluZyg4KSA6ICItMCIgKyBvYmoudG9TdHJpbmcoOCkuc2xpY2UoMSk7CiAgICAgICAgfSwKICAgICAgICBkZWNpbWFsOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgIHJldHVybiBvYmoudG9TdHJpbmcoMTApOwogICAgICAgIH0sCiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqLwogICAgICAgIGhleGFkZWNpbWFsOiBmdW5jdGlvbihvYmopIHsKICAgICAgICAgIHJldHVybiBvYmogPj0gMCA/ICIweCIgKyBvYmoudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkgOiAiLTB4IiArIG9iai50b1N0cmluZygxNikudG9VcHBlckNhc2UoKS5zbGljZSgxKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGRlZmF1bHRTdHlsZTogImRlY2ltYWwiLAogICAgICBzdHlsZUFsaWFzZXM6IHsKICAgICAgICBiaW5hcnk6IFsyLCAiYmluIl0sCiAgICAgICAgb2N0YWw6IFs4LCAib2N0Il0sCiAgICAgICAgZGVjaW1hbDogWzEwLCAiZGVjIl0sCiAgICAgICAgaGV4YWRlY2ltYWw6IFsxNiwgImhleCJdCiAgICAgIH0KICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9mbG9hdC5qcwp2YXIgcmVxdWlyZV9mbG9hdCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9mbG9hdC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgY29tbW9uID0gcmVxdWlyZV9jb21tb24oKTsKICAgIHZhciBUeXBlID0gcmVxdWlyZV90eXBlKCk7CiAgICB2YXIgWUFNTF9GTE9BVF9QQVRURVJOID0gbmV3IFJlZ0V4cCgKICAgICAgLy8gMi41ZTQsIDIuNSBhbmQgaW50ZWdlcnMKICAgICAgIl4oPzpbLStdPyg/OjB8WzEtOV1bMC05X10qKSg/OlxcLlswLTlfXSopPyg/OltlRV1bLStdP1swLTldKyk/fFxcLlswLTlfXSsoPzpbZUVdWy0rXT9bMC05XSspP3xbLStdP1swLTldWzAtOV9dKig/OjpbMC01XT9bMC05XSkrXFwuWzAtOV9dKnxbLStdP1xcLig/OmluZnxJbmZ8SU5GKXxcXC4oPzpuYW58TmFOfE5BTikpJCIKICAgICk7CiAgICBmdW5jdGlvbiByZXNvbHZlWWFtbEZsb2F0KGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKCFZQU1MX0ZMT0FUX1BBVFRFUk4udGVzdChkYXRhKSB8fCAvLyBRdWljayBoYWNrIHRvIG5vdCBhbGxvdyBpbnRlZ2VycyBlbmQgd2l0aCBgX2AKICAgICAgLy8gUHJvYmFibHkgc2hvdWxkIHVwZGF0ZSByZWdleHAgJiBjaGVjayBzcGVlZAogICAgICBkYXRhW2RhdGEubGVuZ3RoIC0gMV0gPT09ICJfIikgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxGbG9hdChkYXRhKSB7CiAgICAgIHZhciB2YWx1ZTIsIHNpZ24sIGJhc2UsIGRpZ2l0czsKICAgICAgdmFsdWUyID0gZGF0YS5yZXBsYWNlKC9fL2csICIiKS50b0xvd2VyQ2FzZSgpOwogICAgICBzaWduID0gdmFsdWUyWzBdID09PSAiLSIgPyAtMSA6IDE7CiAgICAgIGRpZ2l0cyA9IFtdOwogICAgICBpZiAoIistIi5pbmRleE9mKHZhbHVlMlswXSkgPj0gMCkgewogICAgICAgIHZhbHVlMiA9IHZhbHVlMi5zbGljZSgxKTsKICAgICAgfQogICAgICBpZiAodmFsdWUyID09PSAiLmluZiIpIHsKICAgICAgICByZXR1cm4gc2lnbiA9PT0gMSA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTsKICAgICAgfSBlbHNlIGlmICh2YWx1ZTIgPT09ICIubmFuIikgewogICAgICAgIHJldHVybiBOYU47CiAgICAgIH0gZWxzZSBpZiAodmFsdWUyLmluZGV4T2YoIjoiKSA+PSAwKSB7CiAgICAgICAgdmFsdWUyLnNwbGl0KCI6IikuZm9yRWFjaChmdW5jdGlvbih2NSkgewogICAgICAgICAgZGlnaXRzLnVuc2hpZnQocGFyc2VGbG9hdCh2NSwgMTApKTsKICAgICAgICB9KTsKICAgICAgICB2YWx1ZTIgPSAwOwogICAgICAgIGJhc2UgPSAxOwogICAgICAgIGRpZ2l0cy5mb3JFYWNoKGZ1bmN0aW9uKGQ2KSB7CiAgICAgICAgICB2YWx1ZTIgKz0gZDYgKiBiYXNlOwogICAgICAgICAgYmFzZSAqPSA2MDsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gc2lnbiAqIHZhbHVlMjsKICAgICAgfQogICAgICByZXR1cm4gc2lnbiAqIHBhcnNlRmxvYXQodmFsdWUyLCAxMCk7CiAgICB9CiAgICB2YXIgU0NJRU5USUZJQ19XSVRIT1VUX0RPVCA9IC9eWy0rXT9bMC05XStlLzsKICAgIGZ1bmN0aW9uIHJlcHJlc2VudFlhbWxGbG9hdChvYmplY3QsIHN0eWxlKSB7CiAgICAgIHZhciByZXM7CiAgICAgIGlmIChpc05hTihvYmplY3QpKSB7CiAgICAgICAgc3dpdGNoIChzdHlsZSkgewogICAgICAgICAgY2FzZSAibG93ZXJjYXNlIjoKICAgICAgICAgICAgcmV0dXJuICIubmFuIjsKICAgICAgICAgIGNhc2UgInVwcGVyY2FzZSI6CiAgICAgICAgICAgIHJldHVybiAiLk5BTiI7CiAgICAgICAgICBjYXNlICJjYW1lbGNhc2UiOgogICAgICAgICAgICByZXR1cm4gIi5OYU4iOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgPT09IG9iamVjdCkgewogICAgICAgIHN3aXRjaCAoc3R5bGUpIHsKICAgICAgICAgIGNhc2UgImxvd2VyY2FzZSI6CiAgICAgICAgICAgIHJldHVybiAiLmluZiI7CiAgICAgICAgICBjYXNlICJ1cHBlcmNhc2UiOgogICAgICAgICAgICByZXR1cm4gIi5JTkYiOwogICAgICAgICAgY2FzZSAiY2FtZWxjYXNlIjoKICAgICAgICAgICAgcmV0dXJuICIuSW5mIjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZID09PSBvYmplY3QpIHsKICAgICAgICBzd2l0Y2ggKHN0eWxlKSB7CiAgICAgICAgICBjYXNlICJsb3dlcmNhc2UiOgogICAgICAgICAgICByZXR1cm4gIi0uaW5mIjsKICAgICAgICAgIGNhc2UgInVwcGVyY2FzZSI6CiAgICAgICAgICAgIHJldHVybiAiLS5JTkYiOwogICAgICAgICAgY2FzZSAiY2FtZWxjYXNlIjoKICAgICAgICAgICAgcmV0dXJuICItLkluZiI7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKSB7CiAgICAgICAgcmV0dXJuICItMC4wIjsKICAgICAgfQogICAgICByZXMgPSBvYmplY3QudG9TdHJpbmcoMTApOwogICAgICByZXR1cm4gU0NJRU5USUZJQ19XSVRIT1VUX0RPVC50ZXN0KHJlcykgPyByZXMucmVwbGFjZSgiZSIsICIuZSIpIDogcmVzOwogICAgfQogICAgZnVuY3Rpb24gaXNGbG9hdChvYmplY3QpIHsKICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAiW29iamVjdCBOdW1iZXJdIiAmJiAob2JqZWN0ICUgMSAhPT0gMCB8fCBjb21tb24uaXNOZWdhdGl2ZVplcm8ob2JqZWN0KSk7CiAgICB9CiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCJ0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCIsIHsKICAgICAga2luZDogInNjYWxhciIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVZYW1sRmxvYXQsCiAgICAgIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEZsb2F0LAogICAgICBwcmVkaWNhdGU6IGlzRmxvYXQsCiAgICAgIHJlcHJlc2VudDogcmVwcmVzZW50WWFtbEZsb2F0LAogICAgICBkZWZhdWx0U3R5bGU6ICJsb3dlcmNhc2UiCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9qc29uLmpzCnZhciByZXF1aXJlX2pzb24gPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9qc29uLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBTY2hlbWEyID0gcmVxdWlyZV9zY2hlbWEoKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYTIoewogICAgICBpbmNsdWRlOiBbCiAgICAgICAgcmVxdWlyZV9mYWlsc2FmZSgpCiAgICAgIF0sCiAgICAgIGltcGxpY2l0OiBbCiAgICAgICAgcmVxdWlyZV9udWxsKCksCiAgICAgICAgcmVxdWlyZV9ib29sKCksCiAgICAgICAgcmVxdWlyZV9pbnQoKSwKICAgICAgICByZXF1aXJlX2Zsb2F0KCkKICAgICAgXQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvY29yZS5qcwp2YXIgcmVxdWlyZV9jb3JlID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvY29yZS5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgU2NoZW1hMiA9IHJlcXVpcmVfc2NoZW1hKCk7CiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEyKHsKICAgICAgaW5jbHVkZTogWwogICAgICAgIHJlcXVpcmVfanNvbigpCiAgICAgIF0KICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS90aW1lc3RhbXAuanMKdmFyIHJlcXVpcmVfdGltZXN0YW1wID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3RpbWVzdGFtcC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgdmFyIFlBTUxfREFURV9SRUdFWFAgPSBuZXcgUmVnRXhwKAogICAgICAiXihbMC05XVswLTldWzAtOV1bMC05XSktKFswLTldWzAtOV0pLShbMC05XVswLTldKSQiCiAgICApOwogICAgdmFyIFlBTUxfVElNRVNUQU1QX1JFR0VYUCA9IG5ldyBSZWdFeHAoCiAgICAgICJeKFswLTldWzAtOV1bMC05XVswLTldKS0oWzAtOV1bMC05XT8pLShbMC05XVswLTldPykoPzpbVHRdfFsgXFx0XSspKFswLTldWzAtOV0/KTooWzAtOV1bMC05XSk6KFswLTldWzAtOV0pKD86XFwuKFswLTldKikpPyg/OlsgXFx0XSooWnwoWy0rXSkoWzAtOV1bMC05XT8pKD86OihbMC05XVswLTldKSk/KSk/JCIKICAgICk7CiAgICBmdW5jdGlvbiByZXNvbHZlWWFtbFRpbWVzdGFtcChkYXRhKSB7CiAgICAgIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChZQU1MX0RBVEVfUkVHRVhQLmV4ZWMoZGF0YSkgIT09IG51bGwpIHJldHVybiB0cnVlOwogICAgICBpZiAoWUFNTF9USU1FU1RBTVBfUkVHRVhQLmV4ZWMoZGF0YSkgIT09IG51bGwpIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RZYW1sVGltZXN0YW1wKGRhdGEpIHsKICAgICAgdmFyIG1hdGNoMiwgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIGZyYWN0aW9uID0gMCwgZGVsdGEgPSBudWxsLCB0el9ob3VyLCB0el9taW51dGUsIGRhdGU7CiAgICAgIG1hdGNoMiA9IFlBTUxfREFURV9SRUdFWFAuZXhlYyhkYXRhKTsKICAgICAgaWYgKG1hdGNoMiA9PT0gbnVsbCkgbWF0Y2gyID0gWUFNTF9USU1FU1RBTVBfUkVHRVhQLmV4ZWMoZGF0YSk7CiAgICAgIGlmIChtYXRjaDIgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcigiRGF0ZSByZXNvbHZlIGVycm9yIik7CiAgICAgIHllYXIgPSArbWF0Y2gyWzFdOwogICAgICBtb250aCA9ICttYXRjaDJbMl0gLSAxOwogICAgICBkYXkgPSArbWF0Y2gyWzNdOwogICAgICBpZiAoIW1hdGNoMls0XSkgewogICAgICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5KSk7CiAgICAgIH0KICAgICAgaG91ciA9ICttYXRjaDJbNF07CiAgICAgIG1pbnV0ZSA9ICttYXRjaDJbNV07CiAgICAgIHNlY29uZCA9ICttYXRjaDJbNl07CiAgICAgIGlmIChtYXRjaDJbN10pIHsKICAgICAgICBmcmFjdGlvbiA9IG1hdGNoMls3XS5zbGljZSgwLCAzKTsKICAgICAgICB3aGlsZSAoZnJhY3Rpb24ubGVuZ3RoIDwgMykgewogICAgICAgICAgZnJhY3Rpb24gKz0gIjAiOwogICAgICAgIH0KICAgICAgICBmcmFjdGlvbiA9ICtmcmFjdGlvbjsKICAgICAgfQogICAgICBpZiAobWF0Y2gyWzldKSB7CiAgICAgICAgdHpfaG91ciA9ICttYXRjaDJbMTBdOwogICAgICAgIHR6X21pbnV0ZSA9ICsobWF0Y2gyWzExXSB8fCAwKTsKICAgICAgICBkZWx0YSA9ICh0el9ob3VyICogNjAgKyB0el9taW51dGUpICogNmU0OwogICAgICAgIGlmIChtYXRjaDJbOV0gPT09ICItIikgZGVsdGEgPSAtZGVsdGE7CiAgICAgIH0KICAgICAgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbikpOwogICAgICBpZiAoZGVsdGEpIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSAtIGRlbHRhKTsKICAgICAgcmV0dXJuIGRhdGU7CiAgICB9CiAgICBmdW5jdGlvbiByZXByZXNlbnRZYW1sVGltZXN0YW1wKG9iamVjdCkgewogICAgICByZXR1cm4gb2JqZWN0LnRvSVNPU3RyaW5nKCk7CiAgICB9CiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCJ0YWc6eWFtbC5vcmcsMjAwMjp0aW1lc3RhbXAiLCB7CiAgICAgIGtpbmQ6ICJzY2FsYXIiLAogICAgICByZXNvbHZlOiByZXNvbHZlWWFtbFRpbWVzdGFtcCwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sVGltZXN0YW1wLAogICAgICBpbnN0YW5jZU9mOiBEYXRlLAogICAgICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxUaW1lc3RhbXAKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tZXJnZS5qcwp2YXIgcmVxdWlyZV9tZXJnZSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tZXJnZS5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxNZXJnZShkYXRhKSB7CiAgICAgIHJldHVybiBkYXRhID09PSAiPDwiIHx8IGRhdGEgPT09IG51bGw7CiAgICB9CiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCJ0YWc6eWFtbC5vcmcsMjAwMjptZXJnZSIsIHsKICAgICAga2luZDogInNjYWxhciIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVZYW1sTWVyZ2UKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9iaW5hcnkuanMKdmFyIHJlcXVpcmVfYmluYXJ5ID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2JpbmFyeS5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgTm9kZUJ1ZmZlcjsKICAgIHRyeSB7CiAgICAgIF9yZXF1aXJlID0gX19yZXF1aXJlOwogICAgICBOb2RlQnVmZmVyID0gX3JlcXVpcmUoImJ1ZmZlciIpLkJ1ZmZlcjsKICAgIH0gY2F0Y2ggKF9fKSB7CiAgICB9CiAgICB2YXIgVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgdmFyIEJBU0U2NF9NQVAgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cblxyIjsKICAgIGZ1bmN0aW9uIHJlc29sdmVZYW1sQmluYXJ5KGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgdmFyIGNvZGU0LCBpZHgsIGJpdGxlbiA9IDAsIG1heDMgPSBkYXRhLmxlbmd0aCwgbWFwNyA9IEJBU0U2NF9NQVA7CiAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbWF4MzsgaWR4KyspIHsKICAgICAgICBjb2RlNCA9IG1hcDcuaW5kZXhPZihkYXRhLmNoYXJBdChpZHgpKTsKICAgICAgICBpZiAoY29kZTQgPiA2NCkgY29udGludWU7CiAgICAgICAgaWYgKGNvZGU0IDwgMCkgcmV0dXJuIGZhbHNlOwogICAgICAgIGJpdGxlbiArPSA2OwogICAgICB9CiAgICAgIHJldHVybiBiaXRsZW4gJSA4ID09PSAwOwogICAgfQogICAgZnVuY3Rpb24gY29uc3RydWN0WWFtbEJpbmFyeShkYXRhKSB7CiAgICAgIHZhciBpZHgsIHRhaWxiaXRzLCBpbnB1dCA9IGRhdGEucmVwbGFjZSgvW1xyXG49XS9nLCAiIiksIG1heDMgPSBpbnB1dC5sZW5ndGgsIG1hcDcgPSBCQVNFNjRfTUFQLCBiaXRzID0gMCwgcmVzdWx0ID0gW107CiAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbWF4MzsgaWR4KyspIHsKICAgICAgICBpZiAoaWR4ICUgNCA9PT0gMCAmJiBpZHgpIHsKICAgICAgICAgIHJlc3VsdC5wdXNoKGJpdHMgPj4gMTYgJiAyNTUpOwogICAgICAgICAgcmVzdWx0LnB1c2goYml0cyA+PiA4ICYgMjU1KTsKICAgICAgICAgIHJlc3VsdC5wdXNoKGJpdHMgJiAyNTUpOwogICAgICAgIH0KICAgICAgICBiaXRzID0gYml0cyA8PCA2IHwgbWFwNy5pbmRleE9mKGlucHV0LmNoYXJBdChpZHgpKTsKICAgICAgfQogICAgICB0YWlsYml0cyA9IG1heDMgJSA0ICogNjsKICAgICAgaWYgKHRhaWxiaXRzID09PSAwKSB7CiAgICAgICAgcmVzdWx0LnB1c2goYml0cyA+PiAxNiAmIDI1NSk7CiAgICAgICAgcmVzdWx0LnB1c2goYml0cyA+PiA4ICYgMjU1KTsKICAgICAgICByZXN1bHQucHVzaChiaXRzICYgMjU1KTsKICAgICAgfSBlbHNlIGlmICh0YWlsYml0cyA9PT0gMTgpIHsKICAgICAgICByZXN1bHQucHVzaChiaXRzID4+IDEwICYgMjU1KTsKICAgICAgICByZXN1bHQucHVzaChiaXRzID4+IDIgJiAyNTUpOwogICAgICB9IGVsc2UgaWYgKHRhaWxiaXRzID09PSAxMikgewogICAgICAgIHJlc3VsdC5wdXNoKGJpdHMgPj4gNCAmIDI1NSk7CiAgICAgIH0KICAgICAgaWYgKE5vZGVCdWZmZXIpIHsKICAgICAgICByZXR1cm4gTm9kZUJ1ZmZlci5mcm9tID8gTm9kZUJ1ZmZlci5mcm9tKHJlc3VsdCkgOiBuZXcgTm9kZUJ1ZmZlcihyZXN1bHQpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiByZXByZXNlbnRZYW1sQmluYXJ5KG9iamVjdCkgewogICAgICB2YXIgcmVzdWx0ID0gIiIsIGJpdHMgPSAwLCBpZHgsIHRhaWwsIG1heDMgPSBvYmplY3QubGVuZ3RoLCBtYXA3ID0gQkFTRTY0X01BUDsKICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBtYXgzOyBpZHgrKykgewogICAgICAgIGlmIChpZHggJSAzID09PSAwICYmIGlkeCkgewogICAgICAgICAgcmVzdWx0ICs9IG1hcDdbYml0cyA+PiAxOCAmIDYzXTsKICAgICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgPj4gMTIgJiA2M107CiAgICAgICAgICByZXN1bHQgKz0gbWFwN1tiaXRzID4+IDYgJiA2M107CiAgICAgICAgICByZXN1bHQgKz0gbWFwN1tiaXRzICYgNjNdOwogICAgICAgIH0KICAgICAgICBiaXRzID0gKGJpdHMgPDwgOCkgKyBvYmplY3RbaWR4XTsKICAgICAgfQogICAgICB0YWlsID0gbWF4MyAlIDM7CiAgICAgIGlmICh0YWlsID09PSAwKSB7CiAgICAgICAgcmVzdWx0ICs9IG1hcDdbYml0cyA+PiAxOCAmIDYzXTsKICAgICAgICByZXN1bHQgKz0gbWFwN1tiaXRzID4+IDEyICYgNjNdOwogICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgPj4gNiAmIDYzXTsKICAgICAgICByZXN1bHQgKz0gbWFwN1tiaXRzICYgNjNdOwogICAgICB9IGVsc2UgaWYgKHRhaWwgPT09IDIpIHsKICAgICAgICByZXN1bHQgKz0gbWFwN1tiaXRzID4+IDEwICYgNjNdOwogICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgPj4gNCAmIDYzXTsKICAgICAgICByZXN1bHQgKz0gbWFwN1tiaXRzIDw8IDIgJiA2M107CiAgICAgICAgcmVzdWx0ICs9IG1hcDdbNjRdOwogICAgICB9IGVsc2UgaWYgKHRhaWwgPT09IDEpIHsKICAgICAgICByZXN1bHQgKz0gbWFwN1tiaXRzID4+IDIgJiA2M107CiAgICAgICAgcmVzdWx0ICs9IG1hcDdbYml0cyA8PCA0ICYgNjNdOwogICAgICAgIHJlc3VsdCArPSBtYXA3WzY0XTsKICAgICAgICByZXN1bHQgKz0gbWFwN1s2NF07CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGZ1bmN0aW9uIGlzQmluYXJ5KG9iamVjdCkgewogICAgICByZXR1cm4gTm9kZUJ1ZmZlciAmJiBOb2RlQnVmZmVyLmlzQnVmZmVyKG9iamVjdCk7CiAgICB9CiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCJ0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnkiLCB7CiAgICAgIGtpbmQ6ICJzY2FsYXIiLAogICAgICByZXNvbHZlOiByZXNvbHZlWWFtbEJpbmFyeSwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sQmluYXJ5LAogICAgICBwcmVkaWNhdGU6IGlzQmluYXJ5LAogICAgICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxCaW5hcnkKICAgIH0pOwogICAgdmFyIF9yZXF1aXJlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9vbWFwLmpzCnZhciByZXF1aXJlX29tYXAgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvb21hcC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgdmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CiAgICB2YXIgX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKICAgIGZ1bmN0aW9uIHJlc29sdmVZYW1sT21hcChkYXRhKSB7CiAgICAgIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgdmFyIG9iamVjdEtleXMgPSBbXSwgaW5kZXgyLCBsZW5ndGgsIHBhaXIsIHBhaXJLZXksIHBhaXJIYXNLZXksIG9iamVjdCA9IGRhdGE7CiAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIHBhaXIgPSBvYmplY3RbaW5kZXgyXTsKICAgICAgICBwYWlySGFzS2V5ID0gZmFsc2U7CiAgICAgICAgaWYgKF90b1N0cmluZy5jYWxsKHBhaXIpICE9PSAiW29iamVjdCBPYmplY3RdIikgcmV0dXJuIGZhbHNlOwogICAgICAgIGZvciAocGFpcktleSBpbiBwYWlyKSB7CiAgICAgICAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwocGFpciwgcGFpcktleSkpIHsKICAgICAgICAgICAgaWYgKCFwYWlySGFzS2V5KSBwYWlySGFzS2V5ID0gdHJ1ZTsKICAgICAgICAgICAgZWxzZSByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghcGFpckhhc0tleSkgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChvYmplY3RLZXlzLmluZGV4T2YocGFpcktleSkgPT09IC0xKSBvYmplY3RLZXlzLnB1c2gocGFpcktleSk7CiAgICAgICAgZWxzZSByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RZYW1sT21hcChkYXRhKSB7CiAgICAgIHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IFtdOwogICAgfQogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgidGFnOnlhbWwub3JnLDIwMDI6b21hcCIsIHsKICAgICAga2luZDogInNlcXVlbmNlIiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxPbWFwLAogICAgICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxPbWFwCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvcGFpcnMuanMKdmFyIHJlcXVpcmVfcGFpcnMgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvcGFpcnMuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUgPSByZXF1aXJlX3R5cGUoKTsKICAgIHZhciBfdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxQYWlycyhkYXRhKSB7CiAgICAgIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgdmFyIGluZGV4MiwgbGVuZ3RoLCBwYWlyLCBrZXlzMiwgcmVzdWx0LCBvYmplY3QgPSBkYXRhOwogICAgICByZXN1bHQgPSBuZXcgQXJyYXkob2JqZWN0Lmxlbmd0aCk7CiAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIHBhaXIgPSBvYmplY3RbaW5kZXgyXTsKICAgICAgICBpZiAoX3RvU3RyaW5nLmNhbGwocGFpcikgIT09ICJbb2JqZWN0IE9iamVjdF0iKSByZXR1cm4gZmFsc2U7CiAgICAgICAga2V5czIgPSBPYmplY3Qua2V5cyhwYWlyKTsKICAgICAgICBpZiAoa2V5czIubGVuZ3RoICE9PSAxKSByZXR1cm4gZmFsc2U7CiAgICAgICAgcmVzdWx0W2luZGV4Ml0gPSBba2V5czJbMF0sIHBhaXJba2V5czJbMF1dXTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxQYWlycyhkYXRhKSB7CiAgICAgIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gW107CiAgICAgIHZhciBpbmRleDIsIGxlbmd0aCwgcGFpciwga2V5czIsIHJlc3VsdCwgb2JqZWN0ID0gZGF0YTsKICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KG9iamVjdC5sZW5ndGgpOwogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4MiA8IGxlbmd0aDsgaW5kZXgyICs9IDEpIHsKICAgICAgICBwYWlyID0gb2JqZWN0W2luZGV4Ml07CiAgICAgICAga2V5czIgPSBPYmplY3Qua2V5cyhwYWlyKTsKICAgICAgICByZXN1bHRbaW5kZXgyXSA9IFtrZXlzMlswXSwgcGFpcltrZXlzMlswXV1dOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCJ0YWc6eWFtbC5vcmcsMjAwMjpwYWlycyIsIHsKICAgICAga2luZDogInNlcXVlbmNlIiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxQYWlycywKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sUGFpcnMKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zZXQuanMKdmFyIHJlcXVpcmVfc2V0ID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3NldC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgdmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CiAgICBmdW5jdGlvbiByZXNvbHZlWWFtbFNldChkYXRhKSB7CiAgICAgIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgdmFyIGtleTIsIG9iamVjdCA9IGRhdGE7CiAgICAgIGZvciAoa2V5MiBpbiBvYmplY3QpIHsKICAgICAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkyKSkgewogICAgICAgICAgaWYgKG9iamVjdFtrZXkyXSAhPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxTZXQoZGF0YSkgewogICAgICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiB7fTsKICAgIH0KICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOnNldCIsIHsKICAgICAga2luZDogIm1hcHBpbmciLAogICAgICByZXNvbHZlOiByZXNvbHZlWWFtbFNldCwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sU2V0CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X3NhZmUuanMKdmFyIHJlcXVpcmVfZGVmYXVsdF9zYWZlID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9zYWZlLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBTY2hlbWEyID0gcmVxdWlyZV9zY2hlbWEoKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYTIoewogICAgICBpbmNsdWRlOiBbCiAgICAgICAgcmVxdWlyZV9jb3JlKCkKICAgICAgXSwKICAgICAgaW1wbGljaXQ6IFsKICAgICAgICByZXF1aXJlX3RpbWVzdGFtcCgpLAogICAgICAgIHJlcXVpcmVfbWVyZ2UoKQogICAgICBdLAogICAgICBleHBsaWNpdDogWwogICAgICAgIHJlcXVpcmVfYmluYXJ5KCksCiAgICAgICAgcmVxdWlyZV9vbWFwKCksCiAgICAgICAgcmVxdWlyZV9wYWlycygpLAogICAgICAgIHJlcXVpcmVfc2V0KCkKICAgICAgXQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL3VuZGVmaW5lZC5qcwp2YXIgcmVxdWlyZV91bmRlZmluZWQgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvdW5kZWZpbmVkLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBUeXBlID0gcmVxdWlyZV90eXBlKCk7CiAgICBmdW5jdGlvbiByZXNvbHZlSmF2YXNjcmlwdFVuZGVmaW5lZCgpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0VW5kZWZpbmVkKCkgewogICAgICByZXR1cm4gdm9pZCAwOwogICAgfQogICAgZnVuY3Rpb24gcmVwcmVzZW50SmF2YXNjcmlwdFVuZGVmaW5lZCgpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgZnVuY3Rpb24gaXNVbmRlZmluZWQob2JqZWN0KSB7CiAgICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAidW5kZWZpbmVkIjsKICAgIH0KICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOmpzL3VuZGVmaW5lZCIsIHsKICAgICAga2luZDogInNjYWxhciIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVKYXZhc2NyaXB0VW5kZWZpbmVkLAogICAgICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdEphdmFzY3JpcHRVbmRlZmluZWQsCiAgICAgIHByZWRpY2F0ZTogaXNVbmRlZmluZWQsCiAgICAgIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdFVuZGVmaW5lZAogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL3JlZ2V4cC5qcwp2YXIgcmVxdWlyZV9yZWdleHAgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvcmVnZXhwLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBUeXBlID0gcmVxdWlyZV90eXBlKCk7CiAgICBmdW5jdGlvbiByZXNvbHZlSmF2YXNjcmlwdFJlZ0V4cChkYXRhKSB7CiAgICAgIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlOwogICAgICB2YXIgcmVnZXhwID0gZGF0YSwgdGFpbCA9IC9cLyhbZ2ltXSopJC8uZXhlYyhkYXRhKSwgbW9kaWZpZXJzID0gIiI7CiAgICAgIGlmIChyZWdleHBbMF0gPT09ICIvIikgewogICAgICAgIGlmICh0YWlsKSBtb2RpZmllcnMgPSB0YWlsWzFdOwogICAgICAgIGlmIChtb2RpZmllcnMubGVuZ3RoID4gMykgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChyZWdleHBbcmVnZXhwLmxlbmd0aCAtIG1vZGlmaWVycy5sZW5ndGggLSAxXSAhPT0gIi8iKSByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0UmVnRXhwKGRhdGEpIHsKICAgICAgdmFyIHJlZ2V4cCA9IGRhdGEsIHRhaWwgPSAvXC8oW2dpbV0qKSQvLmV4ZWMoZGF0YSksIG1vZGlmaWVycyA9ICIiOwogICAgICBpZiAocmVnZXhwWzBdID09PSAiLyIpIHsKICAgICAgICBpZiAodGFpbCkgbW9kaWZpZXJzID0gdGFpbFsxXTsKICAgICAgICByZWdleHAgPSByZWdleHAuc2xpY2UoMSwgcmVnZXhwLmxlbmd0aCAtIG1vZGlmaWVycy5sZW5ndGggLSAxKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFJlZ0V4cChyZWdleHAsIG1vZGlmaWVycyk7CiAgICB9CiAgICBmdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0UmVnRXhwKG9iamVjdCkgewogICAgICB2YXIgcmVzdWx0ID0gIi8iICsgb2JqZWN0LnNvdXJjZSArICIvIjsKICAgICAgaWYgKG9iamVjdC5nbG9iYWwpIHJlc3VsdCArPSAiZyI7CiAgICAgIGlmIChvYmplY3QubXVsdGlsaW5lKSByZXN1bHQgKz0gIm0iOwogICAgICBpZiAob2JqZWN0Lmlnbm9yZUNhc2UpIHJlc3VsdCArPSAiaSI7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBpc1JlZ0V4cChvYmplY3QpIHsKICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAiW29iamVjdCBSZWdFeHBdIjsKICAgIH0KICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOmpzL3JlZ2V4cCIsIHsKICAgICAga2luZDogInNjYWxhciIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVKYXZhc2NyaXB0UmVnRXhwLAogICAgICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdEphdmFzY3JpcHRSZWdFeHAsCiAgICAgIHByZWRpY2F0ZTogaXNSZWdFeHAsCiAgICAgIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdFJlZ0V4cAogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL2Z1bmN0aW9uLmpzCnZhciByZXF1aXJlX2Z1bmN0aW9uID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL2Z1bmN0aW9uLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBlc3ByaW1hOwogICAgdHJ5IHsKICAgICAgX3JlcXVpcmUgPSBfX3JlcXVpcmU7CiAgICAgIGVzcHJpbWEgPSBfcmVxdWlyZSgiZXNwcmltYSIpOwogICAgfSBjYXRjaCAoXzQpIHsKICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiKSBlc3ByaW1hID0gd2luZG93LmVzcHJpbWE7CiAgICB9CiAgICB2YXIgVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgZnVuY3Rpb24gcmVzb2x2ZUphdmFzY3JpcHRGdW5jdGlvbihkYXRhKSB7CiAgICAgIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHNvdXJjZSA9ICIoIiArIGRhdGEgKyAiKSIsIGFzdCA9IGVzcHJpbWEucGFyc2Uoc291cmNlLCB7IHJhbmdlOiB0cnVlIH0pOwogICAgICAgIGlmIChhc3QudHlwZSAhPT0gIlByb2dyYW0iIHx8IGFzdC5ib2R5Lmxlbmd0aCAhPT0gMSB8fCBhc3QuYm9keVswXS50eXBlICE9PSAiRXhwcmVzc2lvblN0YXRlbWVudCIgfHwgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlICE9PSAiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iICYmIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZSAhPT0gIkZ1bmN0aW9uRXhwcmVzc2lvbiIpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gY29uc3RydWN0SmF2YXNjcmlwdEZ1bmN0aW9uKGRhdGEpIHsKICAgICAgdmFyIHNvdXJjZSA9ICIoIiArIGRhdGEgKyAiKSIsIGFzdCA9IGVzcHJpbWEucGFyc2Uoc291cmNlLCB7IHJhbmdlOiB0cnVlIH0pLCBwYXJhbXMyID0gW10sIGJvZHkzOwogICAgICBpZiAoYXN0LnR5cGUgIT09ICJQcm9ncmFtIiB8fCBhc3QuYm9keS5sZW5ndGggIT09IDEgfHwgYXN0LmJvZHlbMF0udHlwZSAhPT0gIkV4cHJlc3Npb25TdGF0ZW1lbnQiIHx8IGFzdC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZSAhPT0gIkFycm93RnVuY3Rpb25FeHByZXNzaW9uIiAmJiBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgIT09ICJGdW5jdGlvbkV4cHJlc3Npb24iKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gcmVzb2x2ZSBmdW5jdGlvbiIpOwogICAgICB9CiAgICAgIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24ucGFyYW1zLmZvckVhY2goZnVuY3Rpb24ocGFyYW0pIHsKICAgICAgICBwYXJhbXMyLnB1c2gocGFyYW0ubmFtZSk7CiAgICAgIH0pOwogICAgICBib2R5MyA9IGFzdC5ib2R5WzBdLmV4cHJlc3Npb24uYm9keS5yYW5nZTsKICAgICAgaWYgKGFzdC5ib2R5WzBdLmV4cHJlc3Npb24uYm9keS50eXBlID09PSAiQmxvY2tTdGF0ZW1lbnQiKSB7CiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbihwYXJhbXMyLCBzb3VyY2Uuc2xpY2UoYm9keTNbMF0gKyAxLCBib2R5M1sxXSAtIDEpKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKHBhcmFtczIsICJyZXR1cm4gIiArIHNvdXJjZS5zbGljZShib2R5M1swXSwgYm9keTNbMV0pKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRGdW5jdGlvbihvYmplY3QpIHsKICAgICAgcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwogICAgfQogICAgZnVuY3Rpb24gaXNGdW5jdGlvbjIob2JqZWN0KSB7CiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gIltvYmplY3QgRnVuY3Rpb25dIjsKICAgIH0KICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoInRhZzp5YW1sLm9yZywyMDAyOmpzL2Z1bmN0aW9uIiwgewogICAgICBraW5kOiAic2NhbGFyIiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRGdW5jdGlvbiwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RKYXZhc2NyaXB0RnVuY3Rpb24sCiAgICAgIHByZWRpY2F0ZTogaXNGdW5jdGlvbjIsCiAgICAgIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdEZ1bmN0aW9uCiAgICB9KTsKICAgIHZhciBfcmVxdWlyZTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwuanMKdmFyIHJlcXVpcmVfZGVmYXVsdF9mdWxsID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9mdWxsLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBTY2hlbWEyID0gcmVxdWlyZV9zY2hlbWEoKTsKICAgIG1vZHVsZS5leHBvcnRzID0gU2NoZW1hMi5ERUZBVUxUID0gbmV3IFNjaGVtYTIoewogICAgICBpbmNsdWRlOiBbCiAgICAgICAgcmVxdWlyZV9kZWZhdWx0X3NhZmUoKQogICAgICBdLAogICAgICBleHBsaWNpdDogWwogICAgICAgIHJlcXVpcmVfdW5kZWZpbmVkKCksCiAgICAgICAgcmVxdWlyZV9yZWdleHAoKSwKICAgICAgICByZXF1aXJlX2Z1bmN0aW9uKCkKICAgICAgXQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9sb2FkZXIuanMKdmFyIHJlcXVpcmVfbG9hZGVyID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9sb2FkZXIuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGNvbW1vbiA9IHJlcXVpcmVfY29tbW9uKCk7CiAgICB2YXIgWUFNTEV4Y2VwdGlvbiA9IHJlcXVpcmVfZXhjZXB0aW9uKCk7CiAgICB2YXIgTWFyayA9IHJlcXVpcmVfbWFyaygpOwogICAgdmFyIERFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlX2RlZmF1bHRfc2FmZSgpOwogICAgdmFyIERFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlX2RlZmF1bHRfZnVsbCgpOwogICAgdmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CiAgICB2YXIgQ09OVEVYVF9GTE9XX0lOID0gMTsKICAgIHZhciBDT05URVhUX0ZMT1dfT1VUID0gMjsKICAgIHZhciBDT05URVhUX0JMT0NLX0lOID0gMzsKICAgIHZhciBDT05URVhUX0JMT0NLX09VVCA9IDQ7CiAgICB2YXIgQ0hPTVBJTkdfQ0xJUCA9IDE7CiAgICB2YXIgQ0hPTVBJTkdfU1RSSVAgPSAyOwogICAgdmFyIENIT01QSU5HX0tFRVAgPSAzOwogICAgdmFyIFBBVFRFUk5fTk9OX1BSSU5UQUJMRSA9IC9bXHgwMC1ceDA4XHgwQlx4MENceDBFLVx4MUZceDdGLVx4ODRceDg2LVx4OUZcdUZGRkVcdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXS87CiAgICB2YXIgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MgPSAvW1x4ODVcdTIwMjhcdTIwMjldLzsKICAgIHZhciBQQVRURVJOX0ZMT1dfSU5ESUNBVE9SUyA9IC9bLFxbXF1ce1x9XS87CiAgICB2YXIgUEFUVEVSTl9UQUdfSEFORExFID0gL14oPzohfCEhfCFbYS16XC1dKyEpJC9pOwogICAgdmFyIFBBVFRFUk5fVEFHX1VSSSA9IC9eKD86IXxbXixcW1xdXHtcfV0pKD86JVswLTlhLWZdezJ9fFswLTlhLXpcLSM7XC9cPzpAJj1cK1wkLF9cLiF+XConXChcKVxbXF1dKSokL2k7CiAgICBmdW5jdGlvbiBfY2xhc3Mob2JqKSB7CiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzX0VPTChjMTEpIHsKICAgICAgcmV0dXJuIGMxMSA9PT0gMTAgfHwgYzExID09PSAxMzsKICAgIH0KICAgIGZ1bmN0aW9uIGlzX1dISVRFX1NQQUNFKGMxMSkgewogICAgICByZXR1cm4gYzExID09PSA5IHx8IGMxMSA9PT0gMzI7CiAgICB9CiAgICBmdW5jdGlvbiBpc19XU19PUl9FT0woYzExKSB7CiAgICAgIHJldHVybiBjMTEgPT09IDkgfHwgYzExID09PSAzMiB8fCBjMTEgPT09IDEwIHx8IGMxMSA9PT0gMTM7CiAgICB9CiAgICBmdW5jdGlvbiBpc19GTE9XX0lORElDQVRPUihjMTEpIHsKICAgICAgcmV0dXJuIGMxMSA9PT0gNDQgfHwgYzExID09PSA5MSB8fCBjMTEgPT09IDkzIHx8IGMxMSA9PT0gMTIzIHx8IGMxMSA9PT0gMTI1OwogICAgfQogICAgZnVuY3Rpb24gZnJvbUhleENvZGUoYzExKSB7CiAgICAgIHZhciBsYzsKICAgICAgaWYgKDQ4IDw9IGMxMSAmJiBjMTEgPD0gNTcpIHsKICAgICAgICByZXR1cm4gYzExIC0gNDg7CiAgICAgIH0KICAgICAgbGMgPSBjMTEgfCAzMjsKICAgICAgaWYgKDk3IDw9IGxjICYmIGxjIDw9IDEwMikgewogICAgICAgIHJldHVybiBsYyAtIDk3ICsgMTA7CiAgICAgIH0KICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZnVuY3Rpb24gZXNjYXBlZEhleExlbihjMTEpIHsKICAgICAgaWYgKGMxMSA9PT0gMTIwKSB7CiAgICAgICAgcmV0dXJuIDI7CiAgICAgIH0KICAgICAgaWYgKGMxMSA9PT0gMTE3KSB7CiAgICAgICAgcmV0dXJuIDQ7CiAgICAgIH0KICAgICAgaWYgKGMxMSA9PT0gODUpIHsKICAgICAgICByZXR1cm4gODsKICAgICAgfQogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb21EZWNpbWFsQ29kZShjMTEpIHsKICAgICAgaWYgKDQ4IDw9IGMxMSAmJiBjMTEgPD0gNTcpIHsKICAgICAgICByZXR1cm4gYzExIC0gNDg7CiAgICAgIH0KICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZnVuY3Rpb24gc2ltcGxlRXNjYXBlU2VxdWVuY2UoYzExKSB7CiAgICAgIHJldHVybiBjMTEgPT09IDQ4ID8gIlwwIiA6IGMxMSA9PT0gOTcgPyAiXHgwNyIgOiBjMTEgPT09IDk4ID8gIlxiIiA6IGMxMSA9PT0gMTE2ID8gIgkiIDogYzExID09PSA5ID8gIgkiIDogYzExID09PSAxMTAgPyAiXG4iIDogYzExID09PSAxMTggPyAiXHYiIDogYzExID09PSAxMDIgPyAiXGYiIDogYzExID09PSAxMTQgPyAiXHIiIDogYzExID09PSAxMDEgPyAiXHgxQiIgOiBjMTEgPT09IDMyID8gIiAiIDogYzExID09PSAzNCA/ICciJyA6IGMxMSA9PT0gNDcgPyAiLyIgOiBjMTEgPT09IDkyID8gIlxcIiA6IGMxMSA9PT0gNzggPyAiXHg4NSIgOiBjMTEgPT09IDk1ID8gIlx4QTAiIDogYzExID09PSA3NiA/ICJcdTIwMjgiIDogYzExID09PSA4MCA/ICJcdTIwMjkiIDogIiI7CiAgICB9CiAgICBmdW5jdGlvbiBjaGFyRnJvbUNvZGVwb2ludChjMTEpIHsKICAgICAgaWYgKGMxMSA8PSA2NTUzNSkgewogICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGMxMSk7CiAgICAgIH0KICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoCiAgICAgICAgKGMxMSAtIDY1NTM2ID4+IDEwKSArIDU1Mjk2LAogICAgICAgIChjMTEgLSA2NTUzNiAmIDEwMjMpICsgNTYzMjAKICAgICAgKTsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFByb3BlcnR5KG9iamVjdCwga2V5MiwgdmFsdWUyKSB7CiAgICAgIGlmIChrZXkyID09PSAiX19wcm90b19fIikgewogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleTIsIHsKICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICAgIHZhbHVlOiB2YWx1ZTIKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvYmplY3Rba2V5Ml0gPSB2YWx1ZTI7CiAgICAgIH0KICAgIH0KICAgIHZhciBzaW1wbGVFc2NhcGVDaGVjayA9IG5ldyBBcnJheSgyNTYpOwogICAgdmFyIHNpbXBsZUVzY2FwZU1hcCA9IG5ldyBBcnJheSgyNTYpOwogICAgZm9yIChpMTEgPSAwOyBpMTEgPCAyNTY7IGkxMSsrKSB7CiAgICAgIHNpbXBsZUVzY2FwZUNoZWNrW2kxMV0gPSBzaW1wbGVFc2NhcGVTZXF1ZW5jZShpMTEpID8gMSA6IDA7CiAgICAgIHNpbXBsZUVzY2FwZU1hcFtpMTFdID0gc2ltcGxlRXNjYXBlU2VxdWVuY2UoaTExKTsKICAgIH0KICAgIGZ1bmN0aW9uIFN0YXRlKGlucHV0LCBvcHRpb25zKSB7CiAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKICAgICAgdGhpcy5maWxlbmFtZSA9IG9wdGlvbnNbImZpbGVuYW1lIl0gfHwgbnVsbDsKICAgICAgdGhpcy5zY2hlbWEgPSBvcHRpb25zWyJzY2hlbWEiXSB8fCBERUZBVUxUX0ZVTExfU0NIRU1BOwogICAgICB0aGlzLm9uV2FybmluZyA9IG9wdGlvbnNbIm9uV2FybmluZyJdIHx8IG51bGw7CiAgICAgIHRoaXMubGVnYWN5ID0gb3B0aW9uc1sibGVnYWN5Il0gfHwgZmFsc2U7CiAgICAgIHRoaXMuanNvbiA9IG9wdGlvbnNbImpzb24iXSB8fCBmYWxzZTsKICAgICAgdGhpcy5saXN0ZW5lciA9IG9wdGlvbnNbImxpc3RlbmVyIl0gfHwgbnVsbDsKICAgICAgdGhpcy5pbXBsaWNpdFR5cGVzID0gdGhpcy5zY2hlbWEuY29tcGlsZWRJbXBsaWNpdDsKICAgICAgdGhpcy50eXBlTWFwID0gdGhpcy5zY2hlbWEuY29tcGlsZWRUeXBlTWFwOwogICAgICB0aGlzLmxlbmd0aCA9IGlucHV0Lmxlbmd0aDsKICAgICAgdGhpcy5wb3NpdGlvbiA9IDA7CiAgICAgIHRoaXMubGluZSA9IDA7CiAgICAgIHRoaXMubGluZVN0YXJ0ID0gMDsKICAgICAgdGhpcy5saW5lSW5kZW50ID0gMDsKICAgICAgdGhpcy5kb2N1bWVudHMgPSBbXTsKICAgIH0KICAgIGZ1bmN0aW9uIGdlbmVyYXRlRXJyb3Ioc3RhdGUxMCwgbWVzc2FnZTIpIHsKICAgICAgcmV0dXJuIG5ldyBZQU1MRXhjZXB0aW9uKAogICAgICAgIG1lc3NhZ2UyLAogICAgICAgIG5ldyBNYXJrKHN0YXRlMTAuZmlsZW5hbWUsIHN0YXRlMTAuaW5wdXQsIHN0YXRlMTAucG9zaXRpb24sIHN0YXRlMTAubGluZSwgc3RhdGUxMC5wb3NpdGlvbiAtIHN0YXRlMTAubGluZVN0YXJ0KQogICAgICApOwogICAgfQogICAgZnVuY3Rpb24gdGhyb3dFcnJvcjIoc3RhdGUxMCwgbWVzc2FnZTIpIHsKICAgICAgdGhyb3cgZ2VuZXJhdGVFcnJvcihzdGF0ZTEwLCBtZXNzYWdlMik7CiAgICB9CiAgICBmdW5jdGlvbiB0aHJvd1dhcm5pbmcoc3RhdGUxMCwgbWVzc2FnZTIpIHsKICAgICAgaWYgKHN0YXRlMTAub25XYXJuaW5nKSB7CiAgICAgICAgc3RhdGUxMC5vbldhcm5pbmcuY2FsbChudWxsLCBnZW5lcmF0ZUVycm9yKHN0YXRlMTAsIG1lc3NhZ2UyKSk7CiAgICAgIH0KICAgIH0KICAgIHZhciBkaXJlY3RpdmVIYW5kbGVycyA9IHsKICAgICAgWUFNTDogZnVuY3Rpb24gaGFuZGxlWWFtbERpcmVjdGl2ZShzdGF0ZTEwLCBuYW1lLCBhcmdzKSB7CiAgICAgICAgdmFyIG1hdGNoMiwgbWFqb3IsIG1pbm9yOwogICAgICAgIGlmIChzdGF0ZTEwLnZlcnNpb24gIT09IG51bGwpIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJkdXBsaWNhdGlvbiBvZiAlWUFNTCBkaXJlY3RpdmUiKTsKICAgICAgICB9CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAxKSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiWUFNTCBkaXJlY3RpdmUgYWNjZXB0cyBleGFjdGx5IG9uZSBhcmd1bWVudCIpOwogICAgICAgIH0KICAgICAgICBtYXRjaDIgPSAvXihbMC05XSspXC4oWzAtOV0rKSQvLmV4ZWMoYXJnc1swXSk7CiAgICAgICAgaWYgKG1hdGNoMiA9PT0gbnVsbCkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgImlsbC1mb3JtZWQgYXJndW1lbnQgb2YgdGhlIFlBTUwgZGlyZWN0aXZlIik7CiAgICAgICAgfQogICAgICAgIG1ham9yID0gcGFyc2VJbnQobWF0Y2gyWzFdLCAxMCk7CiAgICAgICAgbWlub3IgPSBwYXJzZUludChtYXRjaDJbMl0sIDEwKTsKICAgICAgICBpZiAobWFqb3IgIT09IDEpIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJ1bmFjY2VwdGFibGUgWUFNTCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCIpOwogICAgICAgIH0KICAgICAgICBzdGF0ZTEwLnZlcnNpb24gPSBhcmdzWzBdOwogICAgICAgIHN0YXRlMTAuY2hlY2tMaW5lQnJlYWtzID0gbWlub3IgPCAyOwogICAgICAgIGlmIChtaW5vciAhPT0gMSAmJiBtaW5vciAhPT0gMikgewogICAgICAgICAgdGhyb3dXYXJuaW5nKHN0YXRlMTAsICJ1bnN1cHBvcnRlZCBZQU1MIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICBUQUc6IGZ1bmN0aW9uIGhhbmRsZVRhZ0RpcmVjdGl2ZShzdGF0ZTEwLCBuYW1lLCBhcmdzKSB7CiAgICAgICAgdmFyIGhhbmRsZTMsIHByZWZpeDQ7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiVEFHIGRpcmVjdGl2ZSBhY2NlcHRzIGV4YWN0bHkgdHdvIGFyZ3VtZW50cyIpOwogICAgICAgIH0KICAgICAgICBoYW5kbGUzID0gYXJnc1swXTsKICAgICAgICBwcmVmaXg0ID0gYXJnc1sxXTsKICAgICAgICBpZiAoIVBBVFRFUk5fVEFHX0hBTkRMRS50ZXN0KGhhbmRsZTMpKSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiaWxsLWZvcm1lZCB0YWcgaGFuZGxlIChmaXJzdCBhcmd1bWVudCkgb2YgdGhlIFRBRyBkaXJlY3RpdmUiKTsKICAgICAgICB9CiAgICAgICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlMTAudGFnTWFwLCBoYW5kbGUzKSkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgJ3RoZXJlIGlzIGEgcHJldmlvdXNseSBkZWNsYXJlZCBzdWZmaXggZm9yICInICsgaGFuZGxlMyArICciIHRhZyBoYW5kbGUnKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFQQVRURVJOX1RBR19VUkkudGVzdChwcmVmaXg0KSkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgImlsbC1mb3JtZWQgdGFnIHByZWZpeCAoc2Vjb25kIGFyZ3VtZW50KSBvZiB0aGUgVEFHIGRpcmVjdGl2ZSIpOwogICAgICAgIH0KICAgICAgICBzdGF0ZTEwLnRhZ01hcFtoYW5kbGUzXSA9IHByZWZpeDQ7CiAgICAgIH0KICAgIH07CiAgICBmdW5jdGlvbiBjYXB0dXJlU2VnbWVudChzdGF0ZTEwLCBzdGFydCwgZW5kMywgY2hlY2tKc29uKSB7CiAgICAgIHZhciBfcG9zaXRpb24sIF9sZW5ndGgsIF9jaGFyYWN0ZXIsIF9yZXN1bHQ7CiAgICAgIGlmIChzdGFydCA8IGVuZDMpIHsKICAgICAgICBfcmVzdWx0ID0gc3RhdGUxMC5pbnB1dC5zbGljZShzdGFydCwgZW5kMyk7CiAgICAgICAgaWYgKGNoZWNrSnNvbikgewogICAgICAgICAgZm9yIChfcG9zaXRpb24gPSAwLCBfbGVuZ3RoID0gX3Jlc3VsdC5sZW5ndGg7IF9wb3NpdGlvbiA8IF9sZW5ndGg7IF9wb3NpdGlvbiArPSAxKSB7CiAgICAgICAgICAgIF9jaGFyYWN0ZXIgPSBfcmVzdWx0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTsKICAgICAgICAgICAgaWYgKCEoX2NoYXJhY3RlciA9PT0gOSB8fCAzMiA8PSBfY2hhcmFjdGVyICYmIF9jaGFyYWN0ZXIgPD0gMTExNDExMSkpIHsKICAgICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiZXhwZWN0ZWQgdmFsaWQgSlNPTiBjaGFyYWN0ZXIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoUEFUVEVSTl9OT05fUFJJTlRBQkxFLnRlc3QoX3Jlc3VsdCkpIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJ0aGUgc3RyZWFtIGNvbnRhaW5zIG5vbi1wcmludGFibGUgY2hhcmFjdGVycyIpOwogICAgICAgIH0KICAgICAgICBzdGF0ZTEwLnJlc3VsdCArPSBfcmVzdWx0OwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBtZXJnZU1hcHBpbmdzKHN0YXRlMTAsIGRlc3RpbmF0aW9uLCBzb3VyY2UsIG92ZXJyaWRhYmxlS2V5cykgewogICAgICB2YXIgc291cmNlS2V5cywga2V5MiwgaW5kZXgyLCBxdWFudGl0eTsKICAgICAgaWYgKCFjb21tb24uaXNPYmplY3Qoc291cmNlKSkgewogICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJjYW5ub3QgbWVyZ2UgbWFwcGluZ3M7IHRoZSBwcm92aWRlZCBzb3VyY2Ugb2JqZWN0IGlzIHVuYWNjZXB0YWJsZSIpOwogICAgICB9CiAgICAgIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOwogICAgICBmb3IgKGluZGV4MiA9IDAsIHF1YW50aXR5ID0gc291cmNlS2V5cy5sZW5ndGg7IGluZGV4MiA8IHF1YW50aXR5OyBpbmRleDIgKz0gMSkgewogICAgICAgIGtleTIgPSBzb3VyY2VLZXlzW2luZGV4Ml07CiAgICAgICAgaWYgKCFfaGFzT3duUHJvcGVydHkuY2FsbChkZXN0aW5hdGlvbiwga2V5MikpIHsKICAgICAgICAgIHNldFByb3BlcnR5KGRlc3RpbmF0aW9uLCBrZXkyLCBzb3VyY2Vba2V5Ml0pOwogICAgICAgICAgb3ZlcnJpZGFibGVLZXlzW2tleTJdID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUxMCwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSwgc3RhcnRMaW5lLCBzdGFydFBvcykgewogICAgICB2YXIgaW5kZXgyLCBxdWFudGl0eTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5Tm9kZSkpIHsKICAgICAgICBrZXlOb2RlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoa2V5Tm9kZSk7CiAgICAgICAgZm9yIChpbmRleDIgPSAwLCBxdWFudGl0eSA9IGtleU5vZGUubGVuZ3RoOyBpbmRleDIgPCBxdWFudGl0eTsgaW5kZXgyICs9IDEpIHsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleU5vZGVbaW5kZXgyXSkpIHsKICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgIm5lc3RlZCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGtleXMiKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0eXBlb2Yga2V5Tm9kZSA9PT0gIm9iamVjdCIgJiYgX2NsYXNzKGtleU5vZGVbaW5kZXgyXSkgPT09ICJbb2JqZWN0IE9iamVjdF0iKSB7CiAgICAgICAgICAgIGtleU5vZGVbaW5kZXgyXSA9ICJbb2JqZWN0IE9iamVjdF0iOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodHlwZW9mIGtleU5vZGUgPT09ICJvYmplY3QiICYmIF9jbGFzcyhrZXlOb2RlKSA9PT0gIltvYmplY3QgT2JqZWN0XSIpIHsKICAgICAgICBrZXlOb2RlID0gIltvYmplY3QgT2JqZWN0XSI7CiAgICAgIH0KICAgICAga2V5Tm9kZSA9IFN0cmluZyhrZXlOb2RlKTsKICAgICAgaWYgKF9yZXN1bHQgPT09IG51bGwpIHsKICAgICAgICBfcmVzdWx0ID0ge307CiAgICAgIH0KICAgICAgaWYgKGtleVRhZyA9PT0gInRhZzp5YW1sLm9yZywyMDAyOm1lcmdlIikgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlTm9kZSkpIHsKICAgICAgICAgIGZvciAoaW5kZXgyID0gMCwgcXVhbnRpdHkgPSB2YWx1ZU5vZGUubGVuZ3RoOyBpbmRleDIgPCBxdWFudGl0eTsgaW5kZXgyICs9IDEpIHsKICAgICAgICAgICAgbWVyZ2VNYXBwaW5ncyhzdGF0ZTEwLCBfcmVzdWx0LCB2YWx1ZU5vZGVbaW5kZXgyXSwgb3ZlcnJpZGFibGVLZXlzKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWVyZ2VNYXBwaW5ncyhzdGF0ZTEwLCBfcmVzdWx0LCB2YWx1ZU5vZGUsIG92ZXJyaWRhYmxlS2V5cyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmICghc3RhdGUxMC5qc29uICYmICFfaGFzT3duUHJvcGVydHkuY2FsbChvdmVycmlkYWJsZUtleXMsIGtleU5vZGUpICYmIF9oYXNPd25Qcm9wZXJ0eS5jYWxsKF9yZXN1bHQsIGtleU5vZGUpKSB7CiAgICAgICAgICBzdGF0ZTEwLmxpbmUgPSBzdGFydExpbmUgfHwgc3RhdGUxMC5saW5lOwogICAgICAgICAgc3RhdGUxMC5wb3NpdGlvbiA9IHN0YXJ0UG9zIHx8IHN0YXRlMTAucG9zaXRpb247CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiZHVwbGljYXRlZCBtYXBwaW5nIGtleSIpOwogICAgICAgIH0KICAgICAgICBzZXRQcm9wZXJ0eShfcmVzdWx0LCBrZXlOb2RlLCB2YWx1ZU5vZGUpOwogICAgICAgIGRlbGV0ZSBvdmVycmlkYWJsZUtleXNba2V5Tm9kZV07CiAgICAgIH0KICAgICAgcmV0dXJuIF9yZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiByZWFkTGluZUJyZWFrKHN0YXRlMTApIHsKICAgICAgdmFyIGNoOwogICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgaWYgKGNoID09PSAxMCkgewogICAgICAgIHN0YXRlMTAucG9zaXRpb24rKzsKICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMTMpIHsKICAgICAgICBzdGF0ZTEwLnBvc2l0aW9uKys7CiAgICAgICAgaWYgKHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uKSA9PT0gMTApIHsKICAgICAgICAgIHN0YXRlMTAucG9zaXRpb24rKzsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgImEgbGluZSBicmVhayBpcyBleHBlY3RlZCIpOwogICAgICB9CiAgICAgIHN0YXRlMTAubGluZSArPSAxOwogICAgICBzdGF0ZTEwLmxpbmVTdGFydCA9IHN0YXRlMTAucG9zaXRpb247CiAgICB9CiAgICBmdW5jdGlvbiBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlMTAsIGFsbG93Q29tbWVudHMsIGNoZWNrSW5kZW50KSB7CiAgICAgIHZhciBsaW5lQnJlYWtzID0gMCwgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgIHdoaWxlIChjaCAhPT0gMCkgewogICAgICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHsKICAgICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgfQogICAgICAgIGlmIChhbGxvd0NvbW1lbnRzICYmIGNoID09PSAzNSkgewogICAgICAgICAgZG8gewogICAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgICAgfSB3aGlsZSAoY2ggIT09IDEwICYmIGNoICE9PSAxMyAmJiBjaCAhPT0gMCk7CiAgICAgICAgfQogICAgICAgIGlmIChpc19FT0woY2gpKSB7CiAgICAgICAgICByZWFkTGluZUJyZWFrKHN0YXRlMTApOwogICAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgICBsaW5lQnJlYWtzKys7CiAgICAgICAgICBzdGF0ZTEwLmxpbmVJbmRlbnQgPSAwOwogICAgICAgICAgd2hpbGUgKGNoID09PSAzMikgewogICAgICAgICAgICBzdGF0ZTEwLmxpbmVJbmRlbnQrKzsKICAgICAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjaGVja0luZGVudCAhPT0gLTEgJiYgbGluZUJyZWFrcyAhPT0gMCAmJiBzdGF0ZTEwLmxpbmVJbmRlbnQgPCBjaGVja0luZGVudCkgewogICAgICAgIHRocm93V2FybmluZyhzdGF0ZTEwLCAiZGVmaWNpZW50IGluZGVudGF0aW9uIik7CiAgICAgIH0KICAgICAgcmV0dXJuIGxpbmVCcmVha3M7CiAgICB9CiAgICBmdW5jdGlvbiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUxMCkgewogICAgICB2YXIgX3Bvc2l0aW9uID0gc3RhdGUxMC5wb3NpdGlvbiwgY2g7CiAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7CiAgICAgIGlmICgoY2ggPT09IDQ1IHx8IGNoID09PSA0NikgJiYgY2ggPT09IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24gKyAxKSAmJiBjaCA9PT0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbiArIDIpKSB7CiAgICAgICAgX3Bvc2l0aW9uICs9IDM7CiAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTsKICAgICAgICBpZiAoY2ggPT09IDAgfHwgaXNfV1NfT1JfRU9MKGNoKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZ1bmN0aW9uIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUxMCwgY291bnQyKSB7CiAgICAgIGlmIChjb3VudDIgPT09IDEpIHsKICAgICAgICBzdGF0ZTEwLnJlc3VsdCArPSAiICI7CiAgICAgIH0gZWxzZSBpZiAoY291bnQyID4gMSkgewogICAgICAgIHN0YXRlMTAucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoIlxuIiwgY291bnQyIC0gMSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRQbGFpblNjYWxhcihzdGF0ZTEwLCBub2RlSW5kZW50LCB3aXRoaW5GbG93Q29sbGVjdGlvbikgewogICAgICB2YXIgcHJlY2VkaW5nLCBmb2xsb3dpbmcsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgaGFzUGVuZGluZ0NvbnRlbnQsIF9saW5lLCBfbGluZVN0YXJ0LCBfbGluZUluZGVudCwgX2tpbmQgPSBzdGF0ZTEwLmtpbmQsIF9yZXN1bHQgPSBzdGF0ZTEwLnJlc3VsdCwgY2g7CiAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pOwogICAgICBpZiAoaXNfV1NfT1JfRU9MKGNoKSB8fCBpc19GTE9XX0lORElDQVRPUihjaCkgfHwgY2ggPT09IDM1IHx8IGNoID09PSAzOCB8fCBjaCA9PT0gNDIgfHwgY2ggPT09IDMzIHx8IGNoID09PSAxMjQgfHwgY2ggPT09IDYyIHx8IGNoID09PSAzOSB8fCBjaCA9PT0gMzQgfHwgY2ggPT09IDM3IHx8IGNoID09PSA2NCB8fCBjaCA9PT0gOTYpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGNoID09PSA2MyB8fCBjaCA9PT0gNDUpIHsKICAgICAgICBmb2xsb3dpbmcgPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbiArIDEpOwogICAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSB8fCB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihmb2xsb3dpbmcpKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0YXRlMTAua2luZCA9ICJzY2FsYXIiOwogICAgICBzdGF0ZTEwLnJlc3VsdCA9ICIiOwogICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUxMC5wb3NpdGlvbjsKICAgICAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTsKICAgICAgd2hpbGUgKGNoICE9PSAwKSB7CiAgICAgICAgaWYgKGNoID09PSA1OCkgewogICAgICAgICAgZm9sbG93aW5nID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24gKyAxKTsKICAgICAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSB8fCB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihmb2xsb3dpbmcpKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDM1KSB7CiAgICAgICAgICBwcmVjZWRpbmcgPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbiAtIDEpOwogICAgICAgICAgaWYgKGlzX1dTX09SX0VPTChwcmVjZWRpbmcpKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RhdGUxMC5wb3NpdGlvbiA9PT0gc3RhdGUxMC5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlMTApIHx8IHdpdGhpbkZsb3dDb2xsZWN0aW9uICYmIGlzX0ZMT1dfSU5ESUNBVE9SKGNoKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7CiAgICAgICAgICBfbGluZSA9IHN0YXRlMTAubGluZTsKICAgICAgICAgIF9saW5lU3RhcnQgPSBzdGF0ZTEwLmxpbmVTdGFydDsKICAgICAgICAgIF9saW5lSW5kZW50ID0gc3RhdGUxMC5saW5lSW5kZW50OwogICAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZTEwLCBmYWxzZSwgLTEpOwogICAgICAgICAgaWYgKHN0YXRlMTAubGluZUluZGVudCA+PSBub2RlSW5kZW50KSB7CiAgICAgICAgICAgIGhhc1BlbmRpbmdDb250ZW50ID0gdHJ1ZTsKICAgICAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdGUxMC5wb3NpdGlvbiA9IGNhcHR1cmVFbmQ7CiAgICAgICAgICAgIHN0YXRlMTAubGluZSA9IF9saW5lOwogICAgICAgICAgICBzdGF0ZTEwLmxpbmVTdGFydCA9IF9saW5lU3RhcnQ7CiAgICAgICAgICAgIHN0YXRlMTAubGluZUluZGVudCA9IF9saW5lSW5kZW50OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGhhc1BlbmRpbmdDb250ZW50KSB7CiAgICAgICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZTEwLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIGZhbHNlKTsKICAgICAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUxMCwgc3RhdGUxMC5saW5lIC0gX2xpbmUpOwogICAgICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlMTAucG9zaXRpb247CiAgICAgICAgICBoYXNQZW5kaW5nQ29udGVudCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzX1dISVRFX1NQQUNFKGNoKSkgewogICAgICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlMTAucG9zaXRpb24gKyAxOwogICAgICAgIH0KICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICB9CiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlMTAsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgZmFsc2UpOwogICAgICBpZiAoc3RhdGUxMC5yZXN1bHQpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBzdGF0ZTEwLmtpbmQgPSBfa2luZDsKICAgICAgc3RhdGUxMC5yZXN1bHQgPSBfcmVzdWx0OwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBmdW5jdGlvbiByZWFkU2luZ2xlUXVvdGVkU2NhbGFyKHN0YXRlMTAsIG5vZGVJbmRlbnQpIHsKICAgICAgdmFyIGNoLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQ7CiAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pOwogICAgICBpZiAoY2ggIT09IDM5KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHN0YXRlMTAua2luZCA9ICJzY2FsYXIiOwogICAgICBzdGF0ZTEwLnJlc3VsdCA9ICIiOwogICAgICBzdGF0ZTEwLnBvc2l0aW9uKys7CiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZTEwLnBvc2l0aW9uOwogICAgICB3aGlsZSAoKGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pKSAhPT0gMCkgewogICAgICAgIGlmIChjaCA9PT0gMzkpIHsKICAgICAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlMTAsIGNhcHR1cmVTdGFydCwgc3RhdGUxMC5wb3NpdGlvbiwgdHJ1ZSk7CiAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgICAgaWYgKGNoID09PSAzOSkgewogICAgICAgICAgICBjYXB0dXJlU3RhcnQgPSBzdGF0ZTEwLnBvc2l0aW9uOwogICAgICAgICAgICBzdGF0ZTEwLnBvc2l0aW9uKys7CiAgICAgICAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZTEwLnBvc2l0aW9uOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7CiAgICAgICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZTEwLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIHRydWUpOwogICAgICAgICAgd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZTEwLCBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlMTAsIGZhbHNlLCBub2RlSW5kZW50KSk7CiAgICAgICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUxMC5wb3NpdGlvbjsKICAgICAgICB9IGVsc2UgaWYgKHN0YXRlMTAucG9zaXRpb24gPT09IHN0YXRlMTAubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZTEwKSkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgInVuZXhwZWN0ZWQgZW5kIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gYSBzaW5nbGUgcXVvdGVkIHNjYWxhciIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdGF0ZTEwLnBvc2l0aW9uKys7CiAgICAgICAgICBjYXB0dXJlRW5kID0gc3RhdGUxMC5wb3NpdGlvbjsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgInVuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgc2luZ2xlIHF1b3RlZCBzY2FsYXIiKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWREb3VibGVRdW90ZWRTY2FsYXIoc3RhdGUxMCwgbm9kZUluZGVudCkgewogICAgICB2YXIgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBoZXhMZW5ndGgsIGhleFJlc3VsdCwgdG1wLCBjaDsKICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgIGlmIChjaCAhPT0gMzQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgc3RhdGUxMC5raW5kID0gInNjYWxhciI7CiAgICAgIHN0YXRlMTAucmVzdWx0ID0gIiI7CiAgICAgIHN0YXRlMTAucG9zaXRpb24rKzsKICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlMTAucG9zaXRpb247CiAgICAgIHdoaWxlICgoY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbikpICE9PSAwKSB7CiAgICAgICAgaWYgKGNoID09PSAzNCkgewogICAgICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUxMCwgY2FwdHVyZVN0YXJ0LCBzdGF0ZTEwLnBvc2l0aW9uLCB0cnVlKTsKICAgICAgICAgIHN0YXRlMTAucG9zaXRpb24rKzsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDkyKSB7CiAgICAgICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZTEwLCBjYXB0dXJlU3RhcnQsIHN0YXRlMTAucG9zaXRpb24sIHRydWUpOwogICAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgICAgIGlmIChpc19FT0woY2gpKSB7CiAgICAgICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgZmFsc2UsIG5vZGVJbmRlbnQpOwogICAgICAgICAgfSBlbHNlIGlmIChjaCA8IDI1NiAmJiBzaW1wbGVFc2NhcGVDaGVja1tjaF0pIHsKICAgICAgICAgICAgc3RhdGUxMC5yZXN1bHQgKz0gc2ltcGxlRXNjYXBlTWFwW2NoXTsKICAgICAgICAgICAgc3RhdGUxMC5wb3NpdGlvbisrOwogICAgICAgICAgfSBlbHNlIGlmICgodG1wID0gZXNjYXBlZEhleExlbihjaCkpID4gMCkgewogICAgICAgICAgICBoZXhMZW5ndGggPSB0bXA7CiAgICAgICAgICAgIGhleFJlc3VsdCA9IDA7CiAgICAgICAgICAgIGZvciAoOyBoZXhMZW5ndGggPiAwOyBoZXhMZW5ndGgtLSkgewogICAgICAgICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgICAgICAgaWYgKCh0bXAgPSBmcm9tSGV4Q29kZShjaCkpID49IDApIHsKICAgICAgICAgICAgICAgIGhleFJlc3VsdCA9IChoZXhSZXN1bHQgPDwgNCkgKyB0bXA7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJleHBlY3RlZCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUxMC5yZXN1bHQgKz0gY2hhckZyb21Db2RlcG9pbnQoaGV4UmVzdWx0KTsKICAgICAgICAgICAgc3RhdGUxMC5wb3NpdGlvbisrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgInVua25vd24gZXNjYXBlIHNlcXVlbmNlIik7CiAgICAgICAgICB9CiAgICAgICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUxMC5wb3NpdGlvbjsKICAgICAgICB9IGVsc2UgaWYgKGlzX0VPTChjaCkpIHsKICAgICAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlMTAsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgdHJ1ZSk7CiAgICAgICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlMTAsIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgZmFsc2UsIG5vZGVJbmRlbnQpKTsKICAgICAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZTEwLnBvc2l0aW9uOwogICAgICAgIH0gZWxzZSBpZiAoc3RhdGUxMC5wb3NpdGlvbiA9PT0gc3RhdGUxMC5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlMTApKSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAidW5leHBlY3RlZCBlbmQgb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBhIGRvdWJsZSBxdW90ZWQgc2NhbGFyIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0YXRlMTAucG9zaXRpb24rKzsKICAgICAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZTEwLnBvc2l0aW9uOwogICAgICAgIH0KICAgICAgfQogICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAidW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBkb3VibGUgcXVvdGVkIHNjYWxhciIpOwogICAgfQogICAgZnVuY3Rpb24gcmVhZEZsb3dDb2xsZWN0aW9uKHN0YXRlMTAsIG5vZGVJbmRlbnQpIHsKICAgICAgdmFyIHJlYWROZXh0ID0gdHJ1ZSwgX2xpbmUsIF90YWcgPSBzdGF0ZTEwLnRhZywgX3Jlc3VsdCwgX2FuY2hvciA9IHN0YXRlMTAuYW5jaG9yLCBmb2xsb3dpbmcsIHRlcm1pbmF0b3IsIGlzUGFpciwgaXNFeHBsaWNpdFBhaXIsIGlzTWFwcGluZywgb3ZlcnJpZGFibGVLZXlzID0ge30sIGtleU5vZGUsIGtleVRhZywgdmFsdWVOb2RlLCBjaDsKICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgIGlmIChjaCA9PT0gOTEpIHsKICAgICAgICB0ZXJtaW5hdG9yID0gOTM7CiAgICAgICAgaXNNYXBwaW5nID0gZmFsc2U7CiAgICAgICAgX3Jlc3VsdCA9IFtdOwogICAgICB9IGVsc2UgaWYgKGNoID09PSAxMjMpIHsKICAgICAgICB0ZXJtaW5hdG9yID0gMTI1OwogICAgICAgIGlzTWFwcGluZyA9IHRydWU7CiAgICAgICAgX3Jlc3VsdCA9IHt9OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAoc3RhdGUxMC5hbmNob3IgIT09IG51bGwpIHsKICAgICAgICBzdGF0ZTEwLmFuY2hvck1hcFtzdGF0ZTEwLmFuY2hvcl0gPSBfcmVzdWx0OwogICAgICB9CiAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgIHdoaWxlIChjaCAhPT0gMCkgewogICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgbm9kZUluZGVudCk7CiAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgaWYgKGNoID09PSB0ZXJtaW5hdG9yKSB7CiAgICAgICAgICBzdGF0ZTEwLnBvc2l0aW9uKys7CiAgICAgICAgICBzdGF0ZTEwLnRhZyA9IF90YWc7CiAgICAgICAgICBzdGF0ZTEwLmFuY2hvciA9IF9hbmNob3I7CiAgICAgICAgICBzdGF0ZTEwLmtpbmQgPSBpc01hcHBpbmcgPyAibWFwcGluZyIgOiAic2VxdWVuY2UiOwogICAgICAgICAgc3RhdGUxMC5yZXN1bHQgPSBfcmVzdWx0OwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIGlmICghcmVhZE5leHQpIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJtaXNzZWQgY29tbWEgYmV0d2VlbiBmbG93IGNvbGxlY3Rpb24gZW50cmllcyIpOwogICAgICAgIH0KICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDsKICAgICAgICBpc1BhaXIgPSBpc0V4cGxpY2l0UGFpciA9IGZhbHNlOwogICAgICAgIGlmIChjaCA9PT0gNjMpIHsKICAgICAgICAgIGZvbGxvd2luZyA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uICsgMSk7CiAgICAgICAgICBpZiAoaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHsKICAgICAgICAgICAgaXNQYWlyID0gaXNFeHBsaWNpdFBhaXIgPSB0cnVlOwogICAgICAgICAgICBzdGF0ZTEwLnBvc2l0aW9uKys7CiAgICAgICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgbm9kZUluZGVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9saW5lID0gc3RhdGUxMC5saW5lOwogICAgICAgIGNvbXBvc2VOb2RlKHN0YXRlMTAsIG5vZGVJbmRlbnQsIENPTlRFWFRfRkxPV19JTiwgZmFsc2UsIHRydWUpOwogICAgICAgIGtleVRhZyA9IHN0YXRlMTAudGFnOwogICAgICAgIGtleU5vZGUgPSBzdGF0ZTEwLnJlc3VsdDsKICAgICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlMTAsIHRydWUsIG5vZGVJbmRlbnQpOwogICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pOwogICAgICAgIGlmICgoaXNFeHBsaWNpdFBhaXIgfHwgc3RhdGUxMC5saW5lID09PSBfbGluZSkgJiYgY2ggPT09IDU4KSB7CiAgICAgICAgICBpc1BhaXIgPSB0cnVlOwogICAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgbm9kZUluZGVudCk7CiAgICAgICAgICBjb21wb3NlTm9kZShzdGF0ZTEwLCBub2RlSW5kZW50LCBDT05URVhUX0ZMT1dfSU4sIGZhbHNlLCB0cnVlKTsKICAgICAgICAgIHZhbHVlTm9kZSA9IHN0YXRlMTAucmVzdWx0OwogICAgICAgIH0KICAgICAgICBpZiAoaXNNYXBwaW5nKSB7CiAgICAgICAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlMTAsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUpOwogICAgICAgIH0gZWxzZSBpZiAoaXNQYWlyKSB7CiAgICAgICAgICBfcmVzdWx0LnB1c2goc3RvcmVNYXBwaW5nUGFpcihzdGF0ZTEwLCBudWxsLCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF9yZXN1bHQucHVzaChrZXlOb2RlKTsKICAgICAgICB9CiAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZTEwLCB0cnVlLCBub2RlSW5kZW50KTsKICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgICBpZiAoY2ggPT09IDQ0KSB7CiAgICAgICAgICByZWFkTmV4dCA9IHRydWU7CiAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZWFkTmV4dCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAidW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBmbG93IGNvbGxlY3Rpb24iKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRCbG9ja1NjYWxhcihzdGF0ZTEwLCBub2RlSW5kZW50KSB7CiAgICAgIHZhciBjYXB0dXJlU3RhcnQsIGZvbGRpbmcsIGNob21waW5nID0gQ0hPTVBJTkdfQ0xJUCwgZGlkUmVhZENvbnRlbnQgPSBmYWxzZSwgZGV0ZWN0ZWRJbmRlbnQgPSBmYWxzZSwgdGV4dEluZGVudCA9IG5vZGVJbmRlbnQsIGVtcHR5TGluZXMgPSAwLCBhdE1vcmVJbmRlbnRlZCA9IGZhbHNlLCB0bXAsIGNoOwogICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgaWYgKGNoID09PSAxMjQpIHsKICAgICAgICBmb2xkaW5nID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDYyKSB7CiAgICAgICAgZm9sZGluZyA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHN0YXRlMTAua2luZCA9ICJzY2FsYXIiOwogICAgICBzdGF0ZTEwLnJlc3VsdCA9ICIiOwogICAgICB3aGlsZSAoY2ggIT09IDApIHsKICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgIGlmIChjaCA9PT0gNDMgfHwgY2ggPT09IDQ1KSB7CiAgICAgICAgICBpZiAoQ0hPTVBJTkdfQ0xJUCA9PT0gY2hvbXBpbmcpIHsKICAgICAgICAgICAgY2hvbXBpbmcgPSBjaCA9PT0gNDMgPyBDSE9NUElOR19LRUVQIDogQ0hPTVBJTkdfU1RSSVA7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAicmVwZWF0IG9mIGEgY2hvbXBpbmcgbW9kZSBpZGVudGlmaWVyIik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICgodG1wID0gZnJvbURlY2ltYWxDb2RlKGNoKSkgPj0gMCkgewogICAgICAgICAgaWYgKHRtcCA9PT0gMCkgewogICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiYmFkIGV4cGxpY2l0IGluZGVudGF0aW9uIHdpZHRoIG9mIGEgYmxvY2sgc2NhbGFyOyBpdCBjYW5ub3QgYmUgbGVzcyB0aGFuIG9uZSIpOwogICAgICAgICAgfSBlbHNlIGlmICghZGV0ZWN0ZWRJbmRlbnQpIHsKICAgICAgICAgICAgdGV4dEluZGVudCA9IG5vZGVJbmRlbnQgKyB0bXAgLSAxOwogICAgICAgICAgICBkZXRlY3RlZEluZGVudCA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAicmVwZWF0IG9mIGFuIGluZGVudGF0aW9uIHdpZHRoIGlkZW50aWZpZXIiKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpc19XSElURV9TUEFDRShjaCkpIHsKICAgICAgICBkbyB7CiAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgIH0gd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSk7CiAgICAgICAgaWYgKGNoID09PSAzNSkgewogICAgICAgICAgZG8gewogICAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgICAgfSB3aGlsZSAoIWlzX0VPTChjaCkgJiYgY2ggIT09IDApOwogICAgICAgIH0KICAgICAgfQogICAgICB3aGlsZSAoY2ggIT09IDApIHsKICAgICAgICByZWFkTGluZUJyZWFrKHN0YXRlMTApOwogICAgICAgIHN0YXRlMTAubGluZUluZGVudCA9IDA7CiAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgd2hpbGUgKCghZGV0ZWN0ZWRJbmRlbnQgfHwgc3RhdGUxMC5saW5lSW5kZW50IDwgdGV4dEluZGVudCkgJiYgY2ggPT09IDMyKSB7CiAgICAgICAgICBzdGF0ZTEwLmxpbmVJbmRlbnQrKzsKICAgICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgfQogICAgICAgIGlmICghZGV0ZWN0ZWRJbmRlbnQgJiYgc3RhdGUxMC5saW5lSW5kZW50ID4gdGV4dEluZGVudCkgewogICAgICAgICAgdGV4dEluZGVudCA9IHN0YXRlMTAubGluZUluZGVudDsKICAgICAgICB9CiAgICAgICAgaWYgKGlzX0VPTChjaCkpIHsKICAgICAgICAgIGVtcHR5TGluZXMrKzsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoc3RhdGUxMC5saW5lSW5kZW50IDwgdGV4dEluZGVudCkgewogICAgICAgICAgaWYgKGNob21waW5nID09PSBDSE9NUElOR19LRUVQKSB7CiAgICAgICAgICAgIHN0YXRlMTAucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoIlxuIiwgZGlkUmVhZENvbnRlbnQgPyAxICsgZW1wdHlMaW5lcyA6IGVtcHR5TGluZXMpOwogICAgICAgICAgfSBlbHNlIGlmIChjaG9tcGluZyA9PT0gQ0hPTVBJTkdfQ0xJUCkgewogICAgICAgICAgICBpZiAoZGlkUmVhZENvbnRlbnQpIHsKICAgICAgICAgICAgICBzdGF0ZTEwLnJlc3VsdCArPSAiXG4iOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGZvbGRpbmcpIHsKICAgICAgICAgIGlmIChpc19XSElURV9TUEFDRShjaCkpIHsKICAgICAgICAgICAgYXRNb3JlSW5kZW50ZWQgPSB0cnVlOwogICAgICAgICAgICBzdGF0ZTEwLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCJcbiIsIGRpZFJlYWRDb250ZW50ID8gMSArIGVtcHR5TGluZXMgOiBlbXB0eUxpbmVzKTsKICAgICAgICAgIH0gZWxzZSBpZiAoYXRNb3JlSW5kZW50ZWQpIHsKICAgICAgICAgICAgYXRNb3JlSW5kZW50ZWQgPSBmYWxzZTsKICAgICAgICAgICAgc3RhdGUxMC5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgiXG4iLCBlbXB0eUxpbmVzICsgMSk7CiAgICAgICAgICB9IGVsc2UgaWYgKGVtcHR5TGluZXMgPT09IDApIHsKICAgICAgICAgICAgaWYgKGRpZFJlYWRDb250ZW50KSB7CiAgICAgICAgICAgICAgc3RhdGUxMC5yZXN1bHQgKz0gIiAiOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGF0ZTEwLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCJcbiIsIGVtcHR5TGluZXMpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdGF0ZTEwLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCJcbiIsIGRpZFJlYWRDb250ZW50ID8gMSArIGVtcHR5TGluZXMgOiBlbXB0eUxpbmVzKTsKICAgICAgICB9CiAgICAgICAgZGlkUmVhZENvbnRlbnQgPSB0cnVlOwogICAgICAgIGRldGVjdGVkSW5kZW50ID0gdHJ1ZTsKICAgICAgICBlbXB0eUxpbmVzID0gMDsKICAgICAgICBjYXB0dXJlU3RhcnQgPSBzdGF0ZTEwLnBvc2l0aW9uOwogICAgICAgIHdoaWxlICghaXNfRU9MKGNoKSAmJiBjaCAhPT0gMCkgewogICAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgICB9CiAgICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUxMCwgY2FwdHVyZVN0YXJ0LCBzdGF0ZTEwLnBvc2l0aW9uLCBmYWxzZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiByZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZTEwLCBub2RlSW5kZW50KSB7CiAgICAgIHZhciBfbGluZSwgX3RhZyA9IHN0YXRlMTAudGFnLCBfYW5jaG9yID0gc3RhdGUxMC5hbmNob3IsIF9yZXN1bHQgPSBbXSwgZm9sbG93aW5nLCBkZXRlY3RlZCA9IGZhbHNlLCBjaDsKICAgICAgaWYgKHN0YXRlMTAuYW5jaG9yICE9PSBudWxsKSB7CiAgICAgICAgc3RhdGUxMC5hbmNob3JNYXBbc3RhdGUxMC5hbmNob3JdID0gX3Jlc3VsdDsKICAgICAgfQogICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgd2hpbGUgKGNoICE9PSAwKSB7CiAgICAgICAgaWYgKGNoICE9PSA0NSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGZvbGxvd2luZyA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uICsgMSk7CiAgICAgICAgaWYgKCFpc19XU19PUl9FT0woZm9sbG93aW5nKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGRldGVjdGVkID0gdHJ1ZTsKICAgICAgICBzdGF0ZTEwLnBvc2l0aW9uKys7CiAgICAgICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgLTEpKSB7CiAgICAgICAgICBpZiAoc3RhdGUxMC5saW5lSW5kZW50IDw9IG5vZGVJbmRlbnQpIHsKICAgICAgICAgICAgX3Jlc3VsdC5wdXNoKG51bGwpOwogICAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9saW5lID0gc3RhdGUxMC5saW5lOwogICAgICAgIGNvbXBvc2VOb2RlKHN0YXRlMTAsIG5vZGVJbmRlbnQsIENPTlRFWFRfQkxPQ0tfSU4sIGZhbHNlLCB0cnVlKTsKICAgICAgICBfcmVzdWx0LnB1c2goc3RhdGUxMC5yZXN1bHQpOwogICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgLTEpOwogICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pOwogICAgICAgIGlmICgoc3RhdGUxMC5saW5lID09PSBfbGluZSB8fCBzdGF0ZTEwLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50KSAmJiBjaCAhPT0gMCkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgImJhZCBpbmRlbnRhdGlvbiBvZiBhIHNlcXVlbmNlIGVudHJ5Iik7CiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZTEwLmxpbmVJbmRlbnQgPCBub2RlSW5kZW50KSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRldGVjdGVkKSB7CiAgICAgICAgc3RhdGUxMC50YWcgPSBfdGFnOwogICAgICAgIHN0YXRlMTAuYW5jaG9yID0gX2FuY2hvcjsKICAgICAgICBzdGF0ZTEwLmtpbmQgPSAic2VxdWVuY2UiOwogICAgICAgIHN0YXRlMTAucmVzdWx0ID0gX3Jlc3VsdDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBmdW5jdGlvbiByZWFkQmxvY2tNYXBwaW5nKHN0YXRlMTAsIG5vZGVJbmRlbnQsIGZsb3dJbmRlbnQpIHsKICAgICAgdmFyIGZvbGxvd2luZywgYWxsb3dDb21wYWN0LCBfbGluZSwgX3BvcywgX3RhZyA9IHN0YXRlMTAudGFnLCBfYW5jaG9yID0gc3RhdGUxMC5hbmNob3IsIF9yZXN1bHQgPSB7fSwgb3ZlcnJpZGFibGVLZXlzID0ge30sIGtleVRhZyA9IG51bGwsIGtleU5vZGUgPSBudWxsLCB2YWx1ZU5vZGUgPSBudWxsLCBhdEV4cGxpY2l0S2V5ID0gZmFsc2UsIGRldGVjdGVkID0gZmFsc2UsIGNoOwogICAgICBpZiAoc3RhdGUxMC5hbmNob3IgIT09IG51bGwpIHsKICAgICAgICBzdGF0ZTEwLmFuY2hvck1hcFtzdGF0ZTEwLmFuY2hvcl0gPSBfcmVzdWx0OwogICAgICB9CiAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pOwogICAgICB3aGlsZSAoY2ggIT09IDApIHsKICAgICAgICBmb2xsb3dpbmcgPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbiArIDEpOwogICAgICAgIF9saW5lID0gc3RhdGUxMC5saW5lOwogICAgICAgIF9wb3MgPSBzdGF0ZTEwLnBvc2l0aW9uOwogICAgICAgIGlmICgoY2ggPT09IDYzIHx8IGNoID09PSA1OCkgJiYgaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHsKICAgICAgICAgIGlmIChjaCA9PT0gNjMpIHsKICAgICAgICAgICAgaWYgKGF0RXhwbGljaXRLZXkpIHsKICAgICAgICAgICAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlMTAsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTsKICAgICAgICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXRlY3RlZCA9IHRydWU7CiAgICAgICAgICAgIGF0RXhwbGljaXRLZXkgPSB0cnVlOwogICAgICAgICAgICBhbGxvd0NvbXBhY3QgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIGlmIChhdEV4cGxpY2l0S2V5KSB7CiAgICAgICAgICAgIGF0RXhwbGljaXRLZXkgPSBmYWxzZTsKICAgICAgICAgICAgYWxsb3dDb21wYWN0ID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJpbmNvbXBsZXRlIGV4cGxpY2l0IG1hcHBpbmcgcGFpcjsgYSBrZXkgbm9kZSBpcyBtaXNzZWQ7IG9yIGZvbGxvd2VkIGJ5IGEgbm9uLXRhYnVsYXRlZCBlbXB0eSBsaW5lIik7CiAgICAgICAgICB9CiAgICAgICAgICBzdGF0ZTEwLnBvc2l0aW9uICs9IDE7CiAgICAgICAgICBjaCA9IGZvbGxvd2luZzsKICAgICAgICB9IGVsc2UgaWYgKGNvbXBvc2VOb2RlKHN0YXRlMTAsIGZsb3dJbmRlbnQsIENPTlRFWFRfRkxPV19PVVQsIGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgaWYgKHN0YXRlMTAubGluZSA9PT0gX2xpbmUpIHsKICAgICAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHsKICAgICAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjaCA9PT0gNTgpIHsKICAgICAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgICAgICAgIGlmICghaXNfV1NfT1JfRU9MKGNoKSkgewogICAgICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgImEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgZXhwZWN0ZWQgYWZ0ZXIgdGhlIGtleS12YWx1ZSBzZXBhcmF0b3Igd2l0aGluIGEgYmxvY2sgbWFwcGluZyIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkgewogICAgICAgICAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZTEwLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgbnVsbCk7CiAgICAgICAgICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZGV0ZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgIGF0RXhwbGljaXRLZXkgPSBmYWxzZTsKICAgICAgICAgICAgICBhbGxvd0NvbXBhY3QgPSBmYWxzZTsKICAgICAgICAgICAgICBrZXlUYWcgPSBzdGF0ZTEwLnRhZzsKICAgICAgICAgICAgICBrZXlOb2RlID0gc3RhdGUxMC5yZXN1bHQ7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGV0ZWN0ZWQpIHsKICAgICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiY2FuIG5vdCByZWFkIGFuIGltcGxpY2l0IG1hcHBpbmcgcGFpcjsgYSBjb2xvbiBpcyBtaXNzZWQiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzdGF0ZTEwLnRhZyA9IF90YWc7CiAgICAgICAgICAgICAgc3RhdGUxMC5hbmNob3IgPSBfYW5jaG9yOwogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKGRldGVjdGVkKSB7CiAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJjYW4gbm90IHJlYWQgYSBibG9jayBtYXBwaW5nIGVudHJ5OyBhIG11bHRpbGluZSBrZXkgbWF5IG5vdCBiZSBhbiBpbXBsaWNpdCBrZXkiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YXRlMTAudGFnID0gX3RhZzsKICAgICAgICAgICAgc3RhdGUxMC5hbmNob3IgPSBfYW5jaG9yOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZTEwLmxpbmUgPT09IF9saW5lIHx8IHN0YXRlMTAubGluZUluZGVudCA+IG5vZGVJbmRlbnQpIHsKICAgICAgICAgIGlmIChjb21wb3NlTm9kZShzdGF0ZTEwLCBub2RlSW5kZW50LCBDT05URVhUX0JMT0NLX09VVCwgdHJ1ZSwgYWxsb3dDb21wYWN0KSkgewogICAgICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkgewogICAgICAgICAgICAgIGtleU5vZGUgPSBzdGF0ZTEwLnJlc3VsdDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YWx1ZU5vZGUgPSBzdGF0ZTEwLnJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKCFhdEV4cGxpY2l0S2V5KSB7CiAgICAgICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUxMCwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSwgX2xpbmUsIF9wb3MpOwogICAgICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgLTEpOwogICAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZTEwLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50ICYmIGNoICE9PSAwKSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiYmFkIGluZGVudGF0aW9uIG9mIGEgbWFwcGluZyBlbnRyeSIpOwogICAgICAgIH0gZWxzZSBpZiAoc3RhdGUxMC5saW5lSW5kZW50IDwgbm9kZUluZGVudCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChhdEV4cGxpY2l0S2V5KSB7CiAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZTEwLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgbnVsbCk7CiAgICAgIH0KICAgICAgaWYgKGRldGVjdGVkKSB7CiAgICAgICAgc3RhdGUxMC50YWcgPSBfdGFnOwogICAgICAgIHN0YXRlMTAuYW5jaG9yID0gX2FuY2hvcjsKICAgICAgICBzdGF0ZTEwLmtpbmQgPSAibWFwcGluZyI7CiAgICAgICAgc3RhdGUxMC5yZXN1bHQgPSBfcmVzdWx0OwogICAgICB9CiAgICAgIHJldHVybiBkZXRlY3RlZDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRUYWdQcm9wZXJ0eShzdGF0ZTEwKSB7CiAgICAgIHZhciBfcG9zaXRpb24sIGlzVmVyYmF0aW0gPSBmYWxzZSwgaXNOYW1lZCA9IGZhbHNlLCB0YWdIYW5kbGUsIHRhZ05hbWUsIGNoOwogICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgaWYgKGNoICE9PSAzMykgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoc3RhdGUxMC50YWcgIT09IG51bGwpIHsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiZHVwbGljYXRpb24gb2YgYSB0YWcgcHJvcGVydHkiKTsKICAgICAgfQogICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICBpZiAoY2ggPT09IDYwKSB7CiAgICAgICAgaXNWZXJiYXRpbSA9IHRydWU7CiAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMzMpIHsKICAgICAgICBpc05hbWVkID0gdHJ1ZTsKICAgICAgICB0YWdIYW5kbGUgPSAiISEiOwogICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGFnSGFuZGxlID0gIiEiOwogICAgICB9CiAgICAgIF9wb3NpdGlvbiA9IHN0YXRlMTAucG9zaXRpb247CiAgICAgIGlmIChpc1ZlcmJhdGltKSB7CiAgICAgICAgZG8gewogICAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgICB9IHdoaWxlIChjaCAhPT0gMCAmJiBjaCAhPT0gNjIpOwogICAgICAgIGlmIChzdGF0ZTEwLnBvc2l0aW9uIDwgc3RhdGUxMC5sZW5ndGgpIHsKICAgICAgICAgIHRhZ05hbWUgPSBzdGF0ZTEwLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAidW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSB2ZXJiYXRpbSB0YWciKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7CiAgICAgICAgICBpZiAoY2ggPT09IDMzKSB7CiAgICAgICAgICAgIGlmICghaXNOYW1lZCkgewogICAgICAgICAgICAgIHRhZ0hhbmRsZSA9IHN0YXRlMTAuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uIC0gMSwgc3RhdGUxMC5wb3NpdGlvbiArIDEpOwogICAgICAgICAgICAgIGlmICghUEFUVEVSTl9UQUdfSEFORExFLnRlc3QodGFnSGFuZGxlKSkgewogICAgICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgIm5hbWVkIHRhZyBoYW5kbGUgY2Fubm90IGNvbnRhaW4gc3VjaCBjaGFyYWN0ZXJzIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlzTmFtZWQgPSB0cnVlOwogICAgICAgICAgICAgIF9wb3NpdGlvbiA9IHN0YXRlMTAucG9zaXRpb24gKyAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJ0YWcgc3VmZml4IGNhbm5vdCBjb250YWluIGV4Y2xhbWF0aW9uIG1hcmtzIik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgfQogICAgICAgIHRhZ05hbWUgPSBzdGF0ZTEwLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgaWYgKFBBVFRFUk5fRkxPV19JTkRJQ0FUT1JTLnRlc3QodGFnTmFtZSkpIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJ0YWcgc3VmZml4IGNhbm5vdCBjb250YWluIGZsb3cgaW5kaWNhdG9yIGNoYXJhY3RlcnMiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRhZ05hbWUgJiYgIVBBVFRFUk5fVEFHX1VSSS50ZXN0KHRhZ05hbWUpKSB7CiAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgInRhZyBuYW1lIGNhbm5vdCBjb250YWluIHN1Y2ggY2hhcmFjdGVyczogIiArIHRhZ05hbWUpOwogICAgICB9CiAgICAgIGlmIChpc1ZlcmJhdGltKSB7CiAgICAgICAgc3RhdGUxMC50YWcgPSB0YWdOYW1lOwogICAgICB9IGVsc2UgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlMTAudGFnTWFwLCB0YWdIYW5kbGUpKSB7CiAgICAgICAgc3RhdGUxMC50YWcgPSBzdGF0ZTEwLnRhZ01hcFt0YWdIYW5kbGVdICsgdGFnTmFtZTsKICAgICAgfSBlbHNlIGlmICh0YWdIYW5kbGUgPT09ICIhIikgewogICAgICAgIHN0YXRlMTAudGFnID0gIiEiICsgdGFnTmFtZTsKICAgICAgfSBlbHNlIGlmICh0YWdIYW5kbGUgPT09ICIhISIpIHsKICAgICAgICBzdGF0ZTEwLnRhZyA9ICJ0YWc6eWFtbC5vcmcsMjAwMjoiICsgdGFnTmFtZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAndW5kZWNsYXJlZCB0YWcgaGFuZGxlICInICsgdGFnSGFuZGxlICsgJyInKTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRBbmNob3JQcm9wZXJ0eShzdGF0ZTEwKSB7CiAgICAgIHZhciBfcG9zaXRpb24sIGNoOwogICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgaWYgKGNoICE9PSAzOCkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoc3RhdGUxMC5hbmNob3IgIT09IG51bGwpIHsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiZHVwbGljYXRpb24gb2YgYW4gYW5jaG9yIHByb3BlcnR5Iik7CiAgICAgIH0KICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgX3Bvc2l0aW9uID0gc3RhdGUxMC5wb3NpdGlvbjsKICAgICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpICYmICFpc19GTE9XX0lORElDQVRPUihjaCkpIHsKICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICB9CiAgICAgIGlmIChzdGF0ZTEwLnBvc2l0aW9uID09PSBfcG9zaXRpb24pIHsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAibmFtZSBvZiBhbiBhbmNob3Igbm9kZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXJhY3RlciIpOwogICAgICB9CiAgICAgIHN0YXRlMTAuYW5jaG9yID0gc3RhdGUxMC5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlMTAucG9zaXRpb24pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRBbGlhcyhzdGF0ZTEwKSB7CiAgICAgIHZhciBfcG9zaXRpb24sIGFsaWFzLCBjaDsKICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgIGlmIChjaCAhPT0gNDIpIHJldHVybiBmYWxzZTsKICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgX3Bvc2l0aW9uID0gc3RhdGUxMC5wb3NpdGlvbjsKICAgICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpICYmICFpc19GTE9XX0lORElDQVRPUihjaCkpIHsKICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICB9CiAgICAgIGlmIChzdGF0ZTEwLnBvc2l0aW9uID09PSBfcG9zaXRpb24pIHsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAibmFtZSBvZiBhbiBhbGlhcyBub2RlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIik7CiAgICAgIH0KICAgICAgYWxpYXMgPSBzdGF0ZTEwLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgIGlmICghX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUxMC5hbmNob3JNYXAsIGFsaWFzKSkgewogICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICd1bmlkZW50aWZpZWQgYWxpYXMgIicgKyBhbGlhcyArICciJyk7CiAgICAgIH0KICAgICAgc3RhdGUxMC5yZXN1bHQgPSBzdGF0ZTEwLmFuY2hvck1hcFthbGlhc107CiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgLTEpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbXBvc2VOb2RlKHN0YXRlMTAsIHBhcmVudEluZGVudCwgbm9kZUNvbnRleHQsIGFsbG93VG9TZWVrLCBhbGxvd0NvbXBhY3QpIHsKICAgICAgdmFyIGFsbG93QmxvY2tTdHlsZXMsIGFsbG93QmxvY2tTY2FsYXJzLCBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMsIGluZGVudFN0YXR1cyA9IDEsIGF0TmV3TGluZSA9IGZhbHNlLCBoYXNDb250ZW50ID0gZmFsc2UsIHR5cGVJbmRleCwgdHlwZVF1YW50aXR5LCB0eXBlNSwgZmxvd0luZGVudCwgYmxvY2tJbmRlbnQ7CiAgICAgIGlmIChzdGF0ZTEwLmxpc3RlbmVyICE9PSBudWxsKSB7CiAgICAgICAgc3RhdGUxMC5saXN0ZW5lcigib3BlbiIsIHN0YXRlMTApOwogICAgICB9CiAgICAgIHN0YXRlMTAudGFnID0gbnVsbDsKICAgICAgc3RhdGUxMC5hbmNob3IgPSBudWxsOwogICAgICBzdGF0ZTEwLmtpbmQgPSBudWxsOwogICAgICBzdGF0ZTEwLnJlc3VsdCA9IG51bGw7CiAgICAgIGFsbG93QmxvY2tTdHlsZXMgPSBhbGxvd0Jsb2NrU2NhbGFycyA9IGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IENPTlRFWFRfQkxPQ0tfT1VUID09PSBub2RlQ29udGV4dCB8fCBDT05URVhUX0JMT0NLX0lOID09PSBub2RlQ29udGV4dDsKICAgICAgaWYgKGFsbG93VG9TZWVrKSB7CiAgICAgICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgLTEpKSB7CiAgICAgICAgICBhdE5ld0xpbmUgPSB0cnVlOwogICAgICAgICAgaWYgKHN0YXRlMTAubGluZUluZGVudCA+IHBhcmVudEluZGVudCkgewogICAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAxOwogICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZTEwLmxpbmVJbmRlbnQgPT09IHBhcmVudEluZGVudCkgewogICAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAwOwogICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZTEwLmxpbmVJbmRlbnQgPCBwYXJlbnRJbmRlbnQpIHsKICAgICAgICAgICAgaW5kZW50U3RhdHVzID0gLTE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpbmRlbnRTdGF0dXMgPT09IDEpIHsKICAgICAgICB3aGlsZSAocmVhZFRhZ1Byb3BlcnR5KHN0YXRlMTApIHx8IHJlYWRBbmNob3JQcm9wZXJ0eShzdGF0ZTEwKSkgewogICAgICAgICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgLTEpKSB7CiAgICAgICAgICAgIGF0TmV3TGluZSA9IHRydWU7CiAgICAgICAgICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IGFsbG93QmxvY2tTdHlsZXM7CiAgICAgICAgICAgIGlmIChzdGF0ZTEwLmxpbmVJbmRlbnQgPiBwYXJlbnRJbmRlbnQpIHsKICAgICAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAxOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlMTAubGluZUluZGVudCA9PT0gcGFyZW50SW5kZW50KSB7CiAgICAgICAgICAgICAgaW5kZW50U3RhdHVzID0gMDsKICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZTEwLmxpbmVJbmRlbnQgPCBwYXJlbnRJbmRlbnQpIHsKICAgICAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChhbGxvd0Jsb2NrQ29sbGVjdGlvbnMpIHsKICAgICAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPSBhdE5ld0xpbmUgfHwgYWxsb3dDb21wYWN0OwogICAgICB9CiAgICAgIGlmIChpbmRlbnRTdGF0dXMgPT09IDEgfHwgQ09OVEVYVF9CTE9DS19PVVQgPT09IG5vZGVDb250ZXh0KSB7CiAgICAgICAgaWYgKENPTlRFWFRfRkxPV19JTiA9PT0gbm9kZUNvbnRleHQgfHwgQ09OVEVYVF9GTE9XX09VVCA9PT0gbm9kZUNvbnRleHQpIHsKICAgICAgICAgIGZsb3dJbmRlbnQgPSBwYXJlbnRJbmRlbnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZsb3dJbmRlbnQgPSBwYXJlbnRJbmRlbnQgKyAxOwogICAgICAgIH0KICAgICAgICBibG9ja0luZGVudCA9IHN0YXRlMTAucG9zaXRpb24gLSBzdGF0ZTEwLmxpbmVTdGFydDsKICAgICAgICBpZiAoaW5kZW50U3RhdHVzID09PSAxKSB7CiAgICAgICAgICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmIChyZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZTEwLCBibG9ja0luZGVudCkgfHwgcmVhZEJsb2NrTWFwcGluZyhzdGF0ZTEwLCBibG9ja0luZGVudCwgZmxvd0luZGVudCkpIHx8IHJlYWRGbG93Q29sbGVjdGlvbihzdGF0ZTEwLCBmbG93SW5kZW50KSkgewogICAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChhbGxvd0Jsb2NrU2NhbGFycyAmJiByZWFkQmxvY2tTY2FsYXIoc3RhdGUxMCwgZmxvd0luZGVudCkgfHwgcmVhZFNpbmdsZVF1b3RlZFNjYWxhcihzdGF0ZTEwLCBmbG93SW5kZW50KSB8fCByZWFkRG91YmxlUXVvdGVkU2NhbGFyKHN0YXRlMTAsIGZsb3dJbmRlbnQpKSB7CiAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVhZEFsaWFzKHN0YXRlMTApKSB7CiAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7CiAgICAgICAgICAgICAgaWYgKHN0YXRlMTAudGFnICE9PSBudWxsIHx8IHN0YXRlMTAuYW5jaG9yICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiYWxpYXMgbm9kZSBzaG91bGQgbm90IGhhdmUgYW55IHByb3BlcnRpZXMiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVhZFBsYWluU2NhbGFyKHN0YXRlMTAsIGZsb3dJbmRlbnQsIENPTlRFWFRfRkxPV19JTiA9PT0gbm9kZUNvbnRleHQpKSB7CiAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7CiAgICAgICAgICAgICAgaWYgKHN0YXRlMTAudGFnID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBzdGF0ZTEwLnRhZyA9ICI/IjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0YXRlMTAuYW5jaG9yICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgc3RhdGUxMC5hbmNob3JNYXBbc3RhdGUxMC5hbmNob3JdID0gc3RhdGUxMC5yZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGluZGVudFN0YXR1cyA9PT0gMCkgewogICAgICAgICAgaGFzQ29udGVudCA9IGFsbG93QmxvY2tDb2xsZWN0aW9ucyAmJiByZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZTEwLCBibG9ja0luZGVudCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdGF0ZTEwLnRhZyAhPT0gbnVsbCAmJiBzdGF0ZTEwLnRhZyAhPT0gIiEiKSB7CiAgICAgICAgaWYgKHN0YXRlMTAudGFnID09PSAiPyIpIHsKICAgICAgICAgIGlmIChzdGF0ZTEwLnJlc3VsdCAhPT0gbnVsbCAmJiBzdGF0ZTEwLmtpbmQgIT09ICJzY2FsYXIiKSB7CiAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICd1bmFjY2VwdGFibGUgbm9kZSBraW5kIGZvciAhPD8+IHRhZzsgaXQgc2hvdWxkIGJlICJzY2FsYXIiLCBub3QgIicgKyBzdGF0ZTEwLmtpbmQgKyAnIicpOwogICAgICAgICAgfQogICAgICAgICAgZm9yICh0eXBlSW5kZXggPSAwLCB0eXBlUXVhbnRpdHkgPSBzdGF0ZTEwLmltcGxpY2l0VHlwZXMubGVuZ3RoOyB0eXBlSW5kZXggPCB0eXBlUXVhbnRpdHk7IHR5cGVJbmRleCArPSAxKSB7CiAgICAgICAgICAgIHR5cGU1ID0gc3RhdGUxMC5pbXBsaWNpdFR5cGVzW3R5cGVJbmRleF07CiAgICAgICAgICAgIGlmICh0eXBlNS5yZXNvbHZlKHN0YXRlMTAucmVzdWx0KSkgewogICAgICAgICAgICAgIHN0YXRlMTAucmVzdWx0ID0gdHlwZTUuY29uc3RydWN0KHN0YXRlMTAucmVzdWx0KTsKICAgICAgICAgICAgICBzdGF0ZTEwLnRhZyA9IHR5cGU1LnRhZzsKICAgICAgICAgICAgICBpZiAoc3RhdGUxMC5hbmNob3IgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHN0YXRlMTAuYW5jaG9yTWFwW3N0YXRlMTAuYW5jaG9yXSA9IHN0YXRlMTAucmVzdWx0OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUxMC50eXBlTWFwW3N0YXRlMTAua2luZCB8fCAiZmFsbGJhY2siXSwgc3RhdGUxMC50YWcpKSB7CiAgICAgICAgICB0eXBlNSA9IHN0YXRlMTAudHlwZU1hcFtzdGF0ZTEwLmtpbmQgfHwgImZhbGxiYWNrIl1bc3RhdGUxMC50YWddOwogICAgICAgICAgaWYgKHN0YXRlMTAucmVzdWx0ICE9PSBudWxsICYmIHR5cGU1LmtpbmQgIT09IHN0YXRlMTAua2luZCkgewogICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAidW5hY2NlcHRhYmxlIG5vZGUga2luZCBmb3IgITwiICsgc3RhdGUxMC50YWcgKyAnPiB0YWc7IGl0IHNob3VsZCBiZSAiJyArIHR5cGU1LmtpbmQgKyAnIiwgbm90ICInICsgc3RhdGUxMC5raW5kICsgJyInKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdHlwZTUucmVzb2x2ZShzdGF0ZTEwLnJlc3VsdCkpIHsKICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgImNhbm5vdCByZXNvbHZlIGEgbm9kZSB3aXRoICE8IiArIHN0YXRlMTAudGFnICsgIj4gZXhwbGljaXQgdGFnIik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGF0ZTEwLnJlc3VsdCA9IHR5cGU1LmNvbnN0cnVjdChzdGF0ZTEwLnJlc3VsdCk7CiAgICAgICAgICAgIGlmIChzdGF0ZTEwLmFuY2hvciAhPT0gbnVsbCkgewogICAgICAgICAgICAgIHN0YXRlMTAuYW5jaG9yTWFwW3N0YXRlMTAuYW5jaG9yXSA9IHN0YXRlMTAucmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJ1bmtub3duIHRhZyAhPCIgKyBzdGF0ZTEwLnRhZyArICI+Iik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdGF0ZTEwLmxpc3RlbmVyICE9PSBudWxsKSB7CiAgICAgICAgc3RhdGUxMC5saXN0ZW5lcigiY2xvc2UiLCBzdGF0ZTEwKTsKICAgICAgfQogICAgICByZXR1cm4gc3RhdGUxMC50YWcgIT09IG51bGwgfHwgc3RhdGUxMC5hbmNob3IgIT09IG51bGwgfHwgaGFzQ29udGVudDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWREb2N1bWVudChzdGF0ZTEwKSB7CiAgICAgIHZhciBkb2N1bWVudFN0YXJ0ID0gc3RhdGUxMC5wb3NpdGlvbiwgX3Bvc2l0aW9uLCBkaXJlY3RpdmVOYW1lLCBkaXJlY3RpdmVBcmdzLCBoYXNEaXJlY3RpdmVzID0gZmFsc2UsIGNoOwogICAgICBzdGF0ZTEwLnZlcnNpb24gPSBudWxsOwogICAgICBzdGF0ZTEwLmNoZWNrTGluZUJyZWFrcyA9IHN0YXRlMTAubGVnYWN5OwogICAgICBzdGF0ZTEwLnRhZ01hcCA9IHt9OwogICAgICBzdGF0ZTEwLmFuY2hvck1hcCA9IHt9OwogICAgICB3aGlsZSAoKGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pKSAhPT0gMCkgewogICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgLTEpOwogICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pOwogICAgICAgIGlmIChzdGF0ZTEwLmxpbmVJbmRlbnQgPiAwIHx8IGNoICE9PSAzNykgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGhhc0RpcmVjdGl2ZXMgPSB0cnVlOwogICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgX3Bvc2l0aW9uID0gc3RhdGUxMC5wb3NpdGlvbjsKICAgICAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHsKICAgICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgfQogICAgICAgIGRpcmVjdGl2ZU5hbWUgPSBzdGF0ZTEwLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgZGlyZWN0aXZlQXJncyA9IFtdOwogICAgICAgIGlmIChkaXJlY3RpdmVOYW1lLmxlbmd0aCA8IDEpIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJkaXJlY3RpdmUgbmFtZSBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gb25lIGNoYXJhY3RlciBpbiBsZW5ndGgiKTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKGNoICE9PSAwKSB7CiAgICAgICAgICB3aGlsZSAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7CiAgICAgICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY2ggPT09IDM1KSB7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgICAgICB9IHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfRU9MKGNoKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzX0VPTChjaCkpIGJyZWFrOwogICAgICAgICAgX3Bvc2l0aW9uID0gc3RhdGUxMC5wb3NpdGlvbjsKICAgICAgICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSkgewogICAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgICAgfQogICAgICAgICAgZGlyZWN0aXZlQXJncy5wdXNoKHN0YXRlMTAuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZTEwLnBvc2l0aW9uKSk7CiAgICAgICAgfQogICAgICAgIGlmIChjaCAhPT0gMCkgcmVhZExpbmVCcmVhayhzdGF0ZTEwKTsKICAgICAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoZGlyZWN0aXZlSGFuZGxlcnMsIGRpcmVjdGl2ZU5hbWUpKSB7CiAgICAgICAgICBkaXJlY3RpdmVIYW5kbGVyc1tkaXJlY3RpdmVOYW1lXShzdGF0ZTEwLCBkaXJlY3RpdmVOYW1lLCBkaXJlY3RpdmVBcmdzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3dXYXJuaW5nKHN0YXRlMTAsICd1bmtub3duIGRvY3VtZW50IGRpcmVjdGl2ZSAiJyArIGRpcmVjdGl2ZU5hbWUgKyAnIicpOwogICAgICAgIH0KICAgICAgfQogICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlMTAsIHRydWUsIC0xKTsKICAgICAgaWYgKHN0YXRlMTAubGluZUluZGVudCA9PT0gMCAmJiBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbikgPT09IDQ1ICYmIHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uICsgMSkgPT09IDQ1ICYmIHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uICsgMikgPT09IDQ1KSB7CiAgICAgICAgc3RhdGUxMC5wb3NpdGlvbiArPSAzOwogICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgLTEpOwogICAgICB9IGVsc2UgaWYgKGhhc0RpcmVjdGl2ZXMpIHsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiZGlyZWN0aXZlcyBlbmQgbWFyayBpcyBleHBlY3RlZCIpOwogICAgICB9CiAgICAgIGNvbXBvc2VOb2RlKHN0YXRlMTAsIHN0YXRlMTAubGluZUluZGVudCAtIDEsIENPTlRFWFRfQkxPQ0tfT1VULCBmYWxzZSwgdHJ1ZSk7CiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgLTEpOwogICAgICBpZiAoc3RhdGUxMC5jaGVja0xpbmVCcmVha3MgJiYgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MudGVzdChzdGF0ZTEwLmlucHV0LnNsaWNlKGRvY3VtZW50U3RhcnQsIHN0YXRlMTAucG9zaXRpb24pKSkgewogICAgICAgIHRocm93V2FybmluZyhzdGF0ZTEwLCAibm9uLUFTQ0lJIGxpbmUgYnJlYWtzIGFyZSBpbnRlcnByZXRlZCBhcyBjb250ZW50Iik7CiAgICAgIH0KICAgICAgc3RhdGUxMC5kb2N1bWVudHMucHVzaChzdGF0ZTEwLnJlc3VsdCk7CiAgICAgIGlmIChzdGF0ZTEwLnBvc2l0aW9uID09PSBzdGF0ZTEwLmxpbmVTdGFydCAmJiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUxMCkpIHsKICAgICAgICBpZiAoc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pID09PSA0NikgewogICAgICAgICAgc3RhdGUxMC5wb3NpdGlvbiArPSAzOwogICAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZTEwLCB0cnVlLCAtMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoc3RhdGUxMC5wb3NpdGlvbiA8IHN0YXRlMTAubGVuZ3RoIC0gMSkgewogICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJlbmQgb2YgdGhlIHN0cmVhbSBvciBhIGRvY3VtZW50IHNlcGFyYXRvciBpcyBleHBlY3RlZCIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucykgewogICAgICBpbnB1dCA9IFN0cmluZyhpbnB1dCk7CiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICBpZiAoaW5wdXQubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDEwICYmIGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDEzKSB7CiAgICAgICAgICBpbnB1dCArPSAiXG4iOwogICAgICAgIH0KICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdCgwKSA9PT0gNjUyNzkpIHsKICAgICAgICAgIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBzdGF0ZTEwID0gbmV3IFN0YXRlKGlucHV0LCBvcHRpb25zKTsKICAgICAgdmFyIG51bGxwb3MgPSBpbnB1dC5pbmRleE9mKCJcMCIpOwogICAgICBpZiAobnVsbHBvcyAhPT0gLTEpIHsKICAgICAgICBzdGF0ZTEwLnBvc2l0aW9uID0gbnVsbHBvczsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAibnVsbCBieXRlIGlzIG5vdCBhbGxvd2VkIGluIGlucHV0Iik7CiAgICAgIH0KICAgICAgc3RhdGUxMC5pbnB1dCArPSAiXDAiOwogICAgICB3aGlsZSAoc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pID09PSAzMikgewogICAgICAgIHN0YXRlMTAubGluZUluZGVudCArPSAxOwogICAgICAgIHN0YXRlMTAucG9zaXRpb24gKz0gMTsKICAgICAgfQogICAgICB3aGlsZSAoc3RhdGUxMC5wb3NpdGlvbiA8IHN0YXRlMTAubGVuZ3RoIC0gMSkgewogICAgICAgIHJlYWREb2N1bWVudChzdGF0ZTEwKTsKICAgICAgfQogICAgICByZXR1cm4gc3RhdGUxMC5kb2N1bWVudHM7CiAgICB9CiAgICBmdW5jdGlvbiBsb2FkQWxsKGlucHV0LCBpdGVyYXRvcjIsIG9wdGlvbnMpIHsKICAgICAgaWYgKGl0ZXJhdG9yMiAhPT0gbnVsbCAmJiB0eXBlb2YgaXRlcmF0b3IyID09PSAib2JqZWN0IiAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICBvcHRpb25zID0gaXRlcmF0b3IyOwogICAgICAgIGl0ZXJhdG9yMiA9IG51bGw7CiAgICAgIH0KICAgICAgdmFyIGRvY3VtZW50cyA9IGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpOwogICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yMiAhPT0gImZ1bmN0aW9uIikgewogICAgICAgIHJldHVybiBkb2N1bWVudHM7CiAgICAgIH0KICAgICAgZm9yICh2YXIgaW5kZXgyID0gMCwgbGVuZ3RoID0gZG9jdW1lbnRzLmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIGl0ZXJhdG9yMihkb2N1bWVudHNbaW5kZXgyXSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGxvYWQoaW5wdXQsIG9wdGlvbnMpIHsKICAgICAgdmFyIGRvY3VtZW50cyA9IGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpOwogICAgICBpZiAoZG9jdW1lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnRzLmxlbmd0aCA9PT0gMSkgewogICAgICAgIHJldHVybiBkb2N1bWVudHNbMF07CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oImV4cGVjdGVkIGEgc2luZ2xlIGRvY3VtZW50IGluIHRoZSBzdHJlYW0sIGJ1dCBmb3VuZCBtb3JlIik7CiAgICB9CiAgICBmdW5jdGlvbiBzYWZlTG9hZEFsbChpbnB1dCwgaXRlcmF0b3IyLCBvcHRpb25zKSB7CiAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3IyID09PSAib2JqZWN0IiAmJiBpdGVyYXRvcjIgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgb3B0aW9ucyA9IGl0ZXJhdG9yMjsKICAgICAgICBpdGVyYXRvcjIgPSBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBsb2FkQWxsKGlucHV0LCBpdGVyYXRvcjIsIGNvbW1vbi5leHRlbmQoeyBzY2hlbWE6IERFRkFVTFRfU0FGRV9TQ0hFTUEgfSwgb3B0aW9ucykpOwogICAgfQogICAgZnVuY3Rpb24gc2FmZUxvYWQoaW5wdXQsIG9wdGlvbnMpIHsKICAgICAgcmV0dXJuIGxvYWQoaW5wdXQsIGNvbW1vbi5leHRlbmQoeyBzY2hlbWE6IERFRkFVTFRfU0FGRV9TQ0hFTUEgfSwgb3B0aW9ucykpOwogICAgfQogICAgbW9kdWxlLmV4cG9ydHMubG9hZEFsbCA9IGxvYWRBbGw7CiAgICBtb2R1bGUuZXhwb3J0cy5sb2FkID0gbG9hZDsKICAgIG1vZHVsZS5leHBvcnRzLnNhZmVMb2FkQWxsID0gc2FmZUxvYWRBbGw7CiAgICBtb2R1bGUuZXhwb3J0cy5zYWZlTG9hZCA9IHNhZmVMb2FkOwogICAgdmFyIGkxMTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2R1bXBlci5qcwp2YXIgcmVxdWlyZV9kdW1wZXIgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2R1bXBlci5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgY29tbW9uID0gcmVxdWlyZV9jb21tb24oKTsKICAgIHZhciBZQU1MRXhjZXB0aW9uID0gcmVxdWlyZV9leGNlcHRpb24oKTsKICAgIHZhciBERUZBVUxUX0ZVTExfU0NIRU1BID0gcmVxdWlyZV9kZWZhdWx0X2Z1bGwoKTsKICAgIHZhciBERUZBVUxUX1NBRkVfU0NIRU1BID0gcmVxdWlyZV9kZWZhdWx0X3NhZmUoKTsKICAgIHZhciBfdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwogICAgdmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CiAgICB2YXIgQ0hBUl9UQUIgPSA5OwogICAgdmFyIENIQVJfTElORV9GRUVEID0gMTA7CiAgICB2YXIgQ0hBUl9DQVJSSUFHRV9SRVRVUk4gPSAxMzsKICAgIHZhciBDSEFSX1NQQUNFID0gMzI7CiAgICB2YXIgQ0hBUl9FWENMQU1BVElPTiA9IDMzOwogICAgdmFyIENIQVJfRE9VQkxFX1FVT1RFID0gMzQ7CiAgICB2YXIgQ0hBUl9TSEFSUCA9IDM1OwogICAgdmFyIENIQVJfUEVSQ0VOVCA9IDM3OwogICAgdmFyIENIQVJfQU1QRVJTQU5EID0gMzg7CiAgICB2YXIgQ0hBUl9TSU5HTEVfUVVPVEUgPSAzOTsKICAgIHZhciBDSEFSX0FTVEVSSVNLID0gNDI7CiAgICB2YXIgQ0hBUl9DT01NQSA9IDQ0OwogICAgdmFyIENIQVJfTUlOVVMgPSA0NTsKICAgIHZhciBDSEFSX0NPTE9OID0gNTg7CiAgICB2YXIgQ0hBUl9FUVVBTFMgPSA2MTsKICAgIHZhciBDSEFSX0dSRUFURVJfVEhBTiA9IDYyOwogICAgdmFyIENIQVJfUVVFU1RJT04gPSA2MzsKICAgIHZhciBDSEFSX0NPTU1FUkNJQUxfQVQgPSA2NDsKICAgIHZhciBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQgPSA5MTsKICAgIHZhciBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUID0gOTM7CiAgICB2YXIgQ0hBUl9HUkFWRV9BQ0NFTlQgPSA5NjsKICAgIHZhciBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0tFVCA9IDEyMzsKICAgIHZhciBDSEFSX1ZFUlRJQ0FMX0xJTkUgPSAxMjQ7CiAgICB2YXIgQ0hBUl9SSUdIVF9DVVJMWV9CUkFDS0VUID0gMTI1OwogICAgdmFyIEVTQ0FQRV9TRVFVRU5DRVMgPSB7fTsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbMF0gPSAiXFwwIjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbN10gPSAiXFxhIjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbOF0gPSAiXFxiIjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbOV0gPSAiXFx0IjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbMTBdID0gIlxcbiI7CiAgICBFU0NBUEVfU0VRVUVOQ0VTWzExXSA9ICJcXHYiOwogICAgRVNDQVBFX1NFUVVFTkNFU1sxMl0gPSAiXFxmIjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbMTNdID0gIlxcciI7CiAgICBFU0NBUEVfU0VRVUVOQ0VTWzI3XSA9ICJcXGUiOwogICAgRVNDQVBFX1NFUVVFTkNFU1szNF0gPSAnXFwiJzsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbOTJdID0gIlxcXFwiOwogICAgRVNDQVBFX1NFUVVFTkNFU1sxMzNdID0gIlxcTiI7CiAgICBFU0NBUEVfU0VRVUVOQ0VTWzE2MF0gPSAiXFxfIjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbODIzMl0gPSAiXFxMIjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbODIzM10gPSAiXFxQIjsKICAgIHZhciBERVBSRUNBVEVEX0JPT0xFQU5TX1NZTlRBWCA9IFsKICAgICAgInkiLAogICAgICAiWSIsCiAgICAgICJ5ZXMiLAogICAgICAiWWVzIiwKICAgICAgIllFUyIsCiAgICAgICJvbiIsCiAgICAgICJPbiIsCiAgICAgICJPTiIsCiAgICAgICJuIiwKICAgICAgIk4iLAogICAgICAibm8iLAogICAgICAiTm8iLAogICAgICAiTk8iLAogICAgICAib2ZmIiwKICAgICAgIk9mZiIsCiAgICAgICJPRkYiCiAgICBdOwogICAgZnVuY3Rpb24gY29tcGlsZVN0eWxlTWFwKHNjaGVtYSwgbWFwNykgewogICAgICB2YXIgcmVzdWx0LCBrZXlzMiwgaW5kZXgyLCBsZW5ndGgsIHRhZywgc3R5bGUsIHR5cGU1OwogICAgICBpZiAobWFwNyA9PT0gbnVsbCkgcmV0dXJuIHt9OwogICAgICByZXN1bHQgPSB7fTsKICAgICAga2V5czIgPSBPYmplY3Qua2V5cyhtYXA3KTsKICAgICAgZm9yIChpbmRleDIgPSAwLCBsZW5ndGggPSBrZXlzMi5sZW5ndGg7IGluZGV4MiA8IGxlbmd0aDsgaW5kZXgyICs9IDEpIHsKICAgICAgICB0YWcgPSBrZXlzMltpbmRleDJdOwogICAgICAgIHN0eWxlID0gU3RyaW5nKG1hcDdbdGFnXSk7CiAgICAgICAgaWYgKHRhZy5zbGljZSgwLCAyKSA9PT0gIiEhIikgewogICAgICAgICAgdGFnID0gInRhZzp5YW1sLm9yZywyMDAyOiIgKyB0YWcuc2xpY2UoMik7CiAgICAgICAgfQogICAgICAgIHR5cGU1ID0gc2NoZW1hLmNvbXBpbGVkVHlwZU1hcFsiZmFsbGJhY2siXVt0YWddOwogICAgICAgIGlmICh0eXBlNSAmJiBfaGFzT3duUHJvcGVydHkuY2FsbCh0eXBlNS5zdHlsZUFsaWFzZXMsIHN0eWxlKSkgewogICAgICAgICAgc3R5bGUgPSB0eXBlNS5zdHlsZUFsaWFzZXNbc3R5bGVdOwogICAgICAgIH0KICAgICAgICByZXN1bHRbdGFnXSA9IHN0eWxlOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBlbmNvZGVIZXgoY2hhcmFjdGVyKSB7CiAgICAgIHZhciBzdHJpbmczLCBoYW5kbGUzLCBsZW5ndGg7CiAgICAgIHN0cmluZzMgPSBjaGFyYWN0ZXIudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7CiAgICAgIGlmIChjaGFyYWN0ZXIgPD0gMjU1KSB7CiAgICAgICAgaGFuZGxlMyA9ICJ4IjsKICAgICAgICBsZW5ndGggPSAyOwogICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA8PSA2NTUzNSkgewogICAgICAgIGhhbmRsZTMgPSAidSI7CiAgICAgICAgbGVuZ3RoID0gNDsKICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPD0gNDI5NDk2NzI5NSkgewogICAgICAgIGhhbmRsZTMgPSAiVSI7CiAgICAgICAgbGVuZ3RoID0gODsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbigiY29kZSBwb2ludCB3aXRoaW4gYSBzdHJpbmcgbWF5IG5vdCBiZSBncmVhdGVyIHRoYW4gMHhGRkZGRkZGRiIpOwogICAgICB9CiAgICAgIHJldHVybiAiXFwiICsgaGFuZGxlMyArIGNvbW1vbi5yZXBlYXQoIjAiLCBsZW5ndGggLSBzdHJpbmczLmxlbmd0aCkgKyBzdHJpbmczOwogICAgfQogICAgZnVuY3Rpb24gU3RhdGUob3B0aW9ucykgewogICAgICB0aGlzLnNjaGVtYSA9IG9wdGlvbnNbInNjaGVtYSJdIHx8IERFRkFVTFRfRlVMTF9TQ0hFTUE7CiAgICAgIHRoaXMuaW5kZW50ID0gTWF0aC5tYXgoMSwgb3B0aW9uc1siaW5kZW50Il0gfHwgMik7CiAgICAgIHRoaXMubm9BcnJheUluZGVudCA9IG9wdGlvbnNbIm5vQXJyYXlJbmRlbnQiXSB8fCBmYWxzZTsKICAgICAgdGhpcy5za2lwSW52YWxpZCA9IG9wdGlvbnNbInNraXBJbnZhbGlkIl0gfHwgZmFsc2U7CiAgICAgIHRoaXMuZmxvd0xldmVsID0gY29tbW9uLmlzTm90aGluZyhvcHRpb25zWyJmbG93TGV2ZWwiXSkgPyAtMSA6IG9wdGlvbnNbImZsb3dMZXZlbCJdOwogICAgICB0aGlzLnN0eWxlTWFwID0gY29tcGlsZVN0eWxlTWFwKHRoaXMuc2NoZW1hLCBvcHRpb25zWyJzdHlsZXMiXSB8fCBudWxsKTsKICAgICAgdGhpcy5zb3J0S2V5cyA9IG9wdGlvbnNbInNvcnRLZXlzIl0gfHwgZmFsc2U7CiAgICAgIHRoaXMubGluZVdpZHRoID0gb3B0aW9uc1sibGluZVdpZHRoIl0gfHwgODA7CiAgICAgIHRoaXMubm9SZWZzID0gb3B0aW9uc1sibm9SZWZzIl0gfHwgZmFsc2U7CiAgICAgIHRoaXMubm9Db21wYXRNb2RlID0gb3B0aW9uc1sibm9Db21wYXRNb2RlIl0gfHwgZmFsc2U7CiAgICAgIHRoaXMuY29uZGVuc2VGbG93ID0gb3B0aW9uc1siY29uZGVuc2VGbG93Il0gfHwgZmFsc2U7CiAgICAgIHRoaXMuaW1wbGljaXRUeXBlcyA9IHRoaXMuc2NoZW1hLmNvbXBpbGVkSW1wbGljaXQ7CiAgICAgIHRoaXMuZXhwbGljaXRUeXBlcyA9IHRoaXMuc2NoZW1hLmNvbXBpbGVkRXhwbGljaXQ7CiAgICAgIHRoaXMudGFnID0gbnVsbDsKICAgICAgdGhpcy5yZXN1bHQgPSAiIjsKICAgICAgdGhpcy5kdXBsaWNhdGVzID0gW107CiAgICAgIHRoaXMudXNlZER1cGxpY2F0ZXMgPSBudWxsOwogICAgfQogICAgZnVuY3Rpb24gaW5kZW50U3RyaW5nKHN0cmluZzMsIHNwYWNlcykgewogICAgICB2YXIgaW5kID0gY29tbW9uLnJlcGVhdCgiICIsIHNwYWNlcyksIHBvc2l0aW9uMyA9IDAsIG5leHQyID0gLTEsIHJlc3VsdCA9ICIiLCBsaW5lLCBsZW5ndGggPSBzdHJpbmczLmxlbmd0aDsKICAgICAgd2hpbGUgKHBvc2l0aW9uMyA8IGxlbmd0aCkgewogICAgICAgIG5leHQyID0gc3RyaW5nMy5pbmRleE9mKCJcbiIsIHBvc2l0aW9uMyk7CiAgICAgICAgaWYgKG5leHQyID09PSAtMSkgewogICAgICAgICAgbGluZSA9IHN0cmluZzMuc2xpY2UocG9zaXRpb24zKTsKICAgICAgICAgIHBvc2l0aW9uMyA9IGxlbmd0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGluZSA9IHN0cmluZzMuc2xpY2UocG9zaXRpb24zLCBuZXh0MiArIDEpOwogICAgICAgICAgcG9zaXRpb24zID0gbmV4dDIgKyAxOwogICAgICAgIH0KICAgICAgICBpZiAobGluZS5sZW5ndGggJiYgbGluZSAhPT0gIlxuIikgcmVzdWx0ICs9IGluZDsKICAgICAgICByZXN1bHQgKz0gbGluZTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZTEwLCBsZXZlbCkgewogICAgICByZXR1cm4gIlxuIiArIGNvbW1vbi5yZXBlYXQoIiAiLCBzdGF0ZTEwLmluZGVudCAqIGxldmVsKTsKICAgIH0KICAgIGZ1bmN0aW9uIHRlc3RJbXBsaWNpdFJlc29sdmluZyhzdGF0ZTEwLCBzdHIpIHsKICAgICAgdmFyIGluZGV4MiwgbGVuZ3RoLCB0eXBlNTsKICAgICAgZm9yIChpbmRleDIgPSAwLCBsZW5ndGggPSBzdGF0ZTEwLmltcGxpY2l0VHlwZXMubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgdHlwZTUgPSBzdGF0ZTEwLmltcGxpY2l0VHlwZXNbaW5kZXgyXTsKICAgICAgICBpZiAodHlwZTUucmVzb2x2ZShzdHIpKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKGMxMSkgewogICAgICByZXR1cm4gYzExID09PSBDSEFSX1NQQUNFIHx8IGMxMSA9PT0gQ0hBUl9UQUI7CiAgICB9CiAgICBmdW5jdGlvbiBpc1ByaW50YWJsZShjMTEpIHsKICAgICAgcmV0dXJuIDMyIDw9IGMxMSAmJiBjMTEgPD0gMTI2IHx8IDE2MSA8PSBjMTEgJiYgYzExIDw9IDU1Mjk1ICYmIGMxMSAhPT0gODIzMiAmJiBjMTEgIT09IDgyMzMgfHwgNTczNDQgPD0gYzExICYmIGMxMSA8PSA2NTUzMyAmJiBjMTEgIT09IDY1Mjc5IHx8IDY1NTM2IDw9IGMxMSAmJiBjMTEgPD0gMTExNDExMTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzTnNDaGFyKGMxMSkgewogICAgICByZXR1cm4gaXNQcmludGFibGUoYzExKSAmJiAhaXNXaGl0ZXNwYWNlKGMxMSkgJiYgYzExICE9PSA2NTI3OSAmJiBjMTEgIT09IENIQVJfQ0FSUklBR0VfUkVUVVJOICYmIGMxMSAhPT0gQ0hBUl9MSU5FX0ZFRUQ7CiAgICB9CiAgICBmdW5jdGlvbiBpc1BsYWluU2FmZShjMTEsIHByZXYpIHsKICAgICAgcmV0dXJuIGlzUHJpbnRhYmxlKGMxMSkgJiYgYzExICE9PSA2NTI3OSAmJiBjMTEgIT09IENIQVJfQ09NTUEgJiYgYzExICE9PSBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQgJiYgYzExICE9PSBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUICYmIGMxMSAhPT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNLRVQgJiYgYzExICE9PSBDSEFSX1JJR0hUX0NVUkxZX0JSQUNLRVQgJiYgYzExICE9PSBDSEFSX0NPTE9OICYmIChjMTEgIT09IENIQVJfU0hBUlAgfHwgcHJldiAmJiBpc05zQ2hhcihwcmV2KSk7CiAgICB9CiAgICBmdW5jdGlvbiBpc1BsYWluU2FmZUZpcnN0KGMxMSkgewogICAgICByZXR1cm4gaXNQcmludGFibGUoYzExKSAmJiBjMTEgIT09IDY1Mjc5ICYmICFpc1doaXRlc3BhY2UoYzExKSAmJiBjMTEgIT09IENIQVJfTUlOVVMgJiYgYzExICE9PSBDSEFSX1FVRVNUSU9OICYmIGMxMSAhPT0gQ0hBUl9DT0xPTiAmJiBjMTEgIT09IENIQVJfQ09NTUEgJiYgYzExICE9PSBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQgJiYgYzExICE9PSBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUICYmIGMxMSAhPT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNLRVQgJiYgYzExICE9PSBDSEFSX1JJR0hUX0NVUkxZX0JSQUNLRVQgJiYgYzExICE9PSBDSEFSX1NIQVJQICYmIGMxMSAhPT0gQ0hBUl9BTVBFUlNBTkQgJiYgYzExICE9PSBDSEFSX0FTVEVSSVNLICYmIGMxMSAhPT0gQ0hBUl9FWENMQU1BVElPTiAmJiBjMTEgIT09IENIQVJfVkVSVElDQUxfTElORSAmJiBjMTEgIT09IENIQVJfRVFVQUxTICYmIGMxMSAhPT0gQ0hBUl9HUkVBVEVSX1RIQU4gJiYgYzExICE9PSBDSEFSX1NJTkdMRV9RVU9URSAmJiBjMTEgIT09IENIQVJfRE9VQkxFX1FVT1RFICYmIGMxMSAhPT0gQ0hBUl9QRVJDRU5UICYmIGMxMSAhPT0gQ0hBUl9DT01NRVJDSUFMX0FUICYmIGMxMSAhPT0gQ0hBUl9HUkFWRV9BQ0NFTlQ7CiAgICB9CiAgICBmdW5jdGlvbiBuZWVkSW5kZW50SW5kaWNhdG9yKHN0cmluZzMpIHsKICAgICAgdmFyIGxlYWRpbmdTcGFjZVJlID0gL15cbiogLzsKICAgICAgcmV0dXJuIGxlYWRpbmdTcGFjZVJlLnRlc3Qoc3RyaW5nMyk7CiAgICB9CiAgICB2YXIgU1RZTEVfUExBSU4gPSAxLCBTVFlMRV9TSU5HTEUgPSAyLCBTVFlMRV9MSVRFUkFMID0gMywgU1RZTEVfRk9MREVEID0gNCwgU1RZTEVfRE9VQkxFID0gNTsKICAgIGZ1bmN0aW9uIGNob29zZVNjYWxhclN0eWxlKHN0cmluZzMsIHNpbmdsZUxpbmVPbmx5LCBpbmRlbnRQZXJMZXZlbCwgbGluZVdpZHRoLCB0ZXN0QW1iaWd1b3VzVHlwZSkgewogICAgICB2YXIgaTExOwogICAgICB2YXIgY2hhciwgcHJldl9jaGFyOwogICAgICB2YXIgaGFzTGluZUJyZWFrID0gZmFsc2U7CiAgICAgIHZhciBoYXNGb2xkYWJsZUxpbmUgPSBmYWxzZTsKICAgICAgdmFyIHNob3VsZFRyYWNrV2lkdGggPSBsaW5lV2lkdGggIT09IC0xOwogICAgICB2YXIgcHJldmlvdXNMaW5lQnJlYWsgPSAtMTsKICAgICAgdmFyIHBsYWluID0gaXNQbGFpblNhZmVGaXJzdChzdHJpbmczLmNoYXJDb2RlQXQoMCkpICYmICFpc1doaXRlc3BhY2Uoc3RyaW5nMy5jaGFyQ29kZUF0KHN0cmluZzMubGVuZ3RoIC0gMSkpOwogICAgICBpZiAoc2luZ2xlTGluZU9ubHkpIHsKICAgICAgICBmb3IgKGkxMSA9IDA7IGkxMSA8IHN0cmluZzMubGVuZ3RoOyBpMTErKykgewogICAgICAgICAgY2hhciA9IHN0cmluZzMuY2hhckNvZGVBdChpMTEpOwogICAgICAgICAgaWYgKCFpc1ByaW50YWJsZShjaGFyKSkgewogICAgICAgICAgICByZXR1cm4gU1RZTEVfRE9VQkxFOwogICAgICAgICAgfQogICAgICAgICAgcHJldl9jaGFyID0gaTExID4gMCA/IHN0cmluZzMuY2hhckNvZGVBdChpMTEgLSAxKSA6IG51bGw7CiAgICAgICAgICBwbGFpbiA9IHBsYWluICYmIGlzUGxhaW5TYWZlKGNoYXIsIHByZXZfY2hhcik7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAoaTExID0gMDsgaTExIDwgc3RyaW5nMy5sZW5ndGg7IGkxMSsrKSB7CiAgICAgICAgICBjaGFyID0gc3RyaW5nMy5jaGFyQ29kZUF0KGkxMSk7CiAgICAgICAgICBpZiAoY2hhciA9PT0gQ0hBUl9MSU5FX0ZFRUQpIHsKICAgICAgICAgICAgaGFzTGluZUJyZWFrID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKHNob3VsZFRyYWNrV2lkdGgpIHsKICAgICAgICAgICAgICBoYXNGb2xkYWJsZUxpbmUgPSBoYXNGb2xkYWJsZUxpbmUgfHwgLy8gRm9sZGFibGUgbGluZSA9IHRvbyBsb25nLCBhbmQgbm90IG1vcmUtaW5kZW50ZWQuCiAgICAgICAgICAgICAgaTExIC0gcHJldmlvdXNMaW5lQnJlYWsgLSAxID4gbGluZVdpZHRoICYmIHN0cmluZzNbcHJldmlvdXNMaW5lQnJlYWsgKyAxXSAhPT0gIiAiOwogICAgICAgICAgICAgIHByZXZpb3VzTGluZUJyZWFrID0gaTExOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKCFpc1ByaW50YWJsZShjaGFyKSkgewogICAgICAgICAgICByZXR1cm4gU1RZTEVfRE9VQkxFOwogICAgICAgICAgfQogICAgICAgICAgcHJldl9jaGFyID0gaTExID4gMCA/IHN0cmluZzMuY2hhckNvZGVBdChpMTEgLSAxKSA6IG51bGw7CiAgICAgICAgICBwbGFpbiA9IHBsYWluICYmIGlzUGxhaW5TYWZlKGNoYXIsIHByZXZfY2hhcik7CiAgICAgICAgfQogICAgICAgIGhhc0ZvbGRhYmxlTGluZSA9IGhhc0ZvbGRhYmxlTGluZSB8fCBzaG91bGRUcmFja1dpZHRoICYmIChpMTEgLSBwcmV2aW91c0xpbmVCcmVhayAtIDEgPiBsaW5lV2lkdGggJiYgc3RyaW5nM1twcmV2aW91c0xpbmVCcmVhayArIDFdICE9PSAiICIpOwogICAgICB9CiAgICAgIGlmICghaGFzTGluZUJyZWFrICYmICFoYXNGb2xkYWJsZUxpbmUpIHsKICAgICAgICByZXR1cm4gcGxhaW4gJiYgIXRlc3RBbWJpZ3VvdXNUeXBlKHN0cmluZzMpID8gU1RZTEVfUExBSU4gOiBTVFlMRV9TSU5HTEU7CiAgICAgIH0KICAgICAgaWYgKGluZGVudFBlckxldmVsID4gOSAmJiBuZWVkSW5kZW50SW5kaWNhdG9yKHN0cmluZzMpKSB7CiAgICAgICAgcmV0dXJuIFNUWUxFX0RPVUJMRTsKICAgICAgfQogICAgICByZXR1cm4gaGFzRm9sZGFibGVMaW5lID8gU1RZTEVfRk9MREVEIDogU1RZTEVfTElURVJBTDsKICAgIH0KICAgIGZ1bmN0aW9uIHdyaXRlU2NhbGFyKHN0YXRlMTAsIHN0cmluZzMsIGxldmVsLCBpc2tleSkgewogICAgICBzdGF0ZTEwLmR1bXAgPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHN0cmluZzMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gIicnIjsKICAgICAgICB9CiAgICAgICAgaWYgKCFzdGF0ZTEwLm5vQ29tcGF0TW9kZSAmJiBERVBSRUNBVEVEX0JPT0xFQU5TX1NZTlRBWC5pbmRleE9mKHN0cmluZzMpICE9PSAtMSkgewogICAgICAgICAgcmV0dXJuICInIiArIHN0cmluZzMgKyAiJyI7CiAgICAgICAgfQogICAgICAgIHZhciBpbmRlbnQzID0gc3RhdGUxMC5pbmRlbnQgKiBNYXRoLm1heCgxLCBsZXZlbCk7CiAgICAgICAgdmFyIGxpbmVXaWR0aCA9IHN0YXRlMTAubGluZVdpZHRoID09PSAtMSA/IC0xIDogTWF0aC5tYXgoTWF0aC5taW4oc3RhdGUxMC5saW5lV2lkdGgsIDQwKSwgc3RhdGUxMC5saW5lV2lkdGggLSBpbmRlbnQzKTsKICAgICAgICB2YXIgc2luZ2xlTGluZU9ubHkgPSBpc2tleSB8fCBzdGF0ZTEwLmZsb3dMZXZlbCA+IC0xICYmIGxldmVsID49IHN0YXRlMTAuZmxvd0xldmVsOwogICAgICAgIGZ1bmN0aW9uIHRlc3RBbWJpZ3VpdHkoc3RyaW5nNCkgewogICAgICAgICAgcmV0dXJuIHRlc3RJbXBsaWNpdFJlc29sdmluZyhzdGF0ZTEwLCBzdHJpbmc0KTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoIChjaG9vc2VTY2FsYXJTdHlsZShzdHJpbmczLCBzaW5nbGVMaW5lT25seSwgc3RhdGUxMC5pbmRlbnQsIGxpbmVXaWR0aCwgdGVzdEFtYmlndWl0eSkpIHsKICAgICAgICAgIGNhc2UgU1RZTEVfUExBSU46CiAgICAgICAgICAgIHJldHVybiBzdHJpbmczOwogICAgICAgICAgY2FzZSBTVFlMRV9TSU5HTEU6CiAgICAgICAgICAgIHJldHVybiAiJyIgKyBzdHJpbmczLnJlcGxhY2UoLycvZywgIicnIikgKyAiJyI7CiAgICAgICAgICBjYXNlIFNUWUxFX0xJVEVSQUw6CiAgICAgICAgICAgIHJldHVybiAifCIgKyBibG9ja0hlYWRlcihzdHJpbmczLCBzdGF0ZTEwLmluZGVudCkgKyBkcm9wRW5kaW5nTmV3bGluZShpbmRlbnRTdHJpbmcoc3RyaW5nMywgaW5kZW50MykpOwogICAgICAgICAgY2FzZSBTVFlMRV9GT0xERUQ6CiAgICAgICAgICAgIHJldHVybiAiPiIgKyBibG9ja0hlYWRlcihzdHJpbmczLCBzdGF0ZTEwLmluZGVudCkgKyBkcm9wRW5kaW5nTmV3bGluZShpbmRlbnRTdHJpbmcoZm9sZFN0cmluZyhzdHJpbmczLCBsaW5lV2lkdGgpLCBpbmRlbnQzKSk7CiAgICAgICAgICBjYXNlIFNUWUxFX0RPVUJMRToKICAgICAgICAgICAgcmV0dXJuICciJyArIGVzY2FwZVN0cmluZyhzdHJpbmczLCBsaW5lV2lkdGgpICsgJyInOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oImltcG9zc2libGUgZXJyb3I6IGludmFsaWQgc2NhbGFyIHN0eWxlIik7CiAgICAgICAgfQogICAgICB9KSgpOwogICAgfQogICAgZnVuY3Rpb24gYmxvY2tIZWFkZXIoc3RyaW5nMywgaW5kZW50UGVyTGV2ZWwpIHsKICAgICAgdmFyIGluZGVudEluZGljYXRvciA9IG5lZWRJbmRlbnRJbmRpY2F0b3Ioc3RyaW5nMykgPyBTdHJpbmcoaW5kZW50UGVyTGV2ZWwpIDogIiI7CiAgICAgIHZhciBjbGlwID0gc3RyaW5nM1tzdHJpbmczLmxlbmd0aCAtIDFdID09PSAiXG4iOwogICAgICB2YXIga2VlcCA9IGNsaXAgJiYgKHN0cmluZzNbc3RyaW5nMy5sZW5ndGggLSAyXSA9PT0gIlxuIiB8fCBzdHJpbmczID09PSAiXG4iKTsKICAgICAgdmFyIGNob21wID0ga2VlcCA/ICIrIiA6IGNsaXAgPyAiIiA6ICItIjsKICAgICAgcmV0dXJuIGluZGVudEluZGljYXRvciArIGNob21wICsgIlxuIjsKICAgIH0KICAgIGZ1bmN0aW9uIGRyb3BFbmRpbmdOZXdsaW5lKHN0cmluZzMpIHsKICAgICAgcmV0dXJuIHN0cmluZzNbc3RyaW5nMy5sZW5ndGggLSAxXSA9PT0gIlxuIiA/IHN0cmluZzMuc2xpY2UoMCwgLTEpIDogc3RyaW5nMzsKICAgIH0KICAgIGZ1bmN0aW9uIGZvbGRTdHJpbmcoc3RyaW5nMywgd2lkdGgpIHsKICAgICAgdmFyIGxpbmVSZSA9IC8oXG4rKShbXlxuXSopL2c7CiAgICAgIHZhciByZXN1bHQgPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG5leHRMRiA9IHN0cmluZzMuaW5kZXhPZigiXG4iKTsKICAgICAgICBuZXh0TEYgPSBuZXh0TEYgIT09IC0xID8gbmV4dExGIDogc3RyaW5nMy5sZW5ndGg7CiAgICAgICAgbGluZVJlLmxhc3RJbmRleCA9IG5leHRMRjsKICAgICAgICByZXR1cm4gZm9sZExpbmUoc3RyaW5nMy5zbGljZSgwLCBuZXh0TEYpLCB3aWR0aCk7CiAgICAgIH0pKCk7CiAgICAgIHZhciBwcmV2TW9yZUluZGVudGVkID0gc3RyaW5nM1swXSA9PT0gIlxuIiB8fCBzdHJpbmczWzBdID09PSAiICI7CiAgICAgIHZhciBtb3JlSW5kZW50ZWQ7CiAgICAgIHZhciBtYXRjaDI7CiAgICAgIHdoaWxlIChtYXRjaDIgPSBsaW5lUmUuZXhlYyhzdHJpbmczKSkgewogICAgICAgIHZhciBwcmVmaXg0ID0gbWF0Y2gyWzFdLCBsaW5lID0gbWF0Y2gyWzJdOwogICAgICAgIG1vcmVJbmRlbnRlZCA9IGxpbmVbMF0gPT09ICIgIjsKICAgICAgICByZXN1bHQgKz0gcHJlZml4NCArICghcHJldk1vcmVJbmRlbnRlZCAmJiAhbW9yZUluZGVudGVkICYmIGxpbmUgIT09ICIiID8gIlxuIiA6ICIiKSArIGZvbGRMaW5lKGxpbmUsIHdpZHRoKTsKICAgICAgICBwcmV2TW9yZUluZGVudGVkID0gbW9yZUluZGVudGVkOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBmb2xkTGluZShsaW5lLCB3aWR0aCkgewogICAgICBpZiAobGluZSA9PT0gIiIgfHwgbGluZVswXSA9PT0gIiAiKSByZXR1cm4gbGluZTsKICAgICAgdmFyIGJyZWFrUmUgPSAvIFteIF0vZzsKICAgICAgdmFyIG1hdGNoMjsKICAgICAgdmFyIHN0YXJ0ID0gMCwgZW5kMywgY3VyciA9IDAsIG5leHQyID0gMDsKICAgICAgdmFyIHJlc3VsdCA9ICIiOwogICAgICB3aGlsZSAobWF0Y2gyID0gYnJlYWtSZS5leGVjKGxpbmUpKSB7CiAgICAgICAgbmV4dDIgPSBtYXRjaDIuaW5kZXg7CiAgICAgICAgaWYgKG5leHQyIC0gc3RhcnQgPiB3aWR0aCkgewogICAgICAgICAgZW5kMyA9IGN1cnIgPiBzdGFydCA/IGN1cnIgOiBuZXh0MjsKICAgICAgICAgIHJlc3VsdCArPSAiXG4iICsgbGluZS5zbGljZShzdGFydCwgZW5kMyk7CiAgICAgICAgICBzdGFydCA9IGVuZDMgKyAxOwogICAgICAgIH0KICAgICAgICBjdXJyID0gbmV4dDI7CiAgICAgIH0KICAgICAgcmVzdWx0ICs9ICJcbiI7CiAgICAgIGlmIChsaW5lLmxlbmd0aCAtIHN0YXJ0ID4gd2lkdGggJiYgY3VyciA+IHN0YXJ0KSB7CiAgICAgICAgcmVzdWx0ICs9IGxpbmUuc2xpY2Uoc3RhcnQsIGN1cnIpICsgIlxuIiArIGxpbmUuc2xpY2UoY3VyciArIDEpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdCArPSBsaW5lLnNsaWNlKHN0YXJ0KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0LnNsaWNlKDEpOwogICAgfQogICAgZnVuY3Rpb24gZXNjYXBlU3RyaW5nKHN0cmluZzMpIHsKICAgICAgdmFyIHJlc3VsdCA9ICIiOwogICAgICB2YXIgY2hhciwgbmV4dENoYXI7CiAgICAgIHZhciBlc2NhcGVTZXE7CiAgICAgIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IHN0cmluZzMubGVuZ3RoOyBpMTErKykgewogICAgICAgIGNoYXIgPSBzdHJpbmczLmNoYXJDb2RlQXQoaTExKTsKICAgICAgICBpZiAoY2hhciA+PSA1NTI5NiAmJiBjaGFyIDw9IDU2MzE5KSB7CiAgICAgICAgICBuZXh0Q2hhciA9IHN0cmluZzMuY2hhckNvZGVBdChpMTEgKyAxKTsKICAgICAgICAgIGlmIChuZXh0Q2hhciA+PSA1NjMyMCAmJiBuZXh0Q2hhciA8PSA1NzM0MykgewogICAgICAgICAgICByZXN1bHQgKz0gZW5jb2RlSGV4KChjaGFyIC0gNTUyOTYpICogMTAyNCArIG5leHRDaGFyIC0gNTYzMjAgKyA2NTUzNik7CiAgICAgICAgICAgIGkxMSsrOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXNjYXBlU2VxID0gRVNDQVBFX1NFUVVFTkNFU1tjaGFyXTsKICAgICAgICByZXN1bHQgKz0gIWVzY2FwZVNlcSAmJiBpc1ByaW50YWJsZShjaGFyKSA/IHN0cmluZzNbaTExXSA6IGVzY2FwZVNlcSB8fCBlbmNvZGVIZXgoY2hhcik7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGZ1bmN0aW9uIHdyaXRlRmxvd1NlcXVlbmNlKHN0YXRlMTAsIGxldmVsLCBvYmplY3QpIHsKICAgICAgdmFyIF9yZXN1bHQgPSAiIiwgX3RhZyA9IHN0YXRlMTAudGFnLCBpbmRleDIsIGxlbmd0aDsKICAgICAgZm9yIChpbmRleDIgPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgaWYgKHdyaXRlTm9kZShzdGF0ZTEwLCBsZXZlbCwgb2JqZWN0W2luZGV4Ml0sIGZhbHNlLCBmYWxzZSkpIHsKICAgICAgICAgIGlmIChpbmRleDIgIT09IDApIF9yZXN1bHQgKz0gIiwiICsgKCFzdGF0ZTEwLmNvbmRlbnNlRmxvdyA/ICIgIiA6ICIiKTsKICAgICAgICAgIF9yZXN1bHQgKz0gc3RhdGUxMC5kdW1wOwogICAgICAgIH0KICAgICAgfQogICAgICBzdGF0ZTEwLnRhZyA9IF90YWc7CiAgICAgIHN0YXRlMTAuZHVtcCA9ICJbIiArIF9yZXN1bHQgKyAiXSI7CiAgICB9CiAgICBmdW5jdGlvbiB3cml0ZUJsb2NrU2VxdWVuY2Uoc3RhdGUxMCwgbGV2ZWwsIG9iamVjdCwgY29tcGFjdCkgewogICAgICB2YXIgX3Jlc3VsdCA9ICIiLCBfdGFnID0gc3RhdGUxMC50YWcsIGluZGV4MiwgbGVuZ3RoOwogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4MiA8IGxlbmd0aDsgaW5kZXgyICs9IDEpIHsKICAgICAgICBpZiAod3JpdGVOb2RlKHN0YXRlMTAsIGxldmVsICsgMSwgb2JqZWN0W2luZGV4Ml0sIHRydWUsIHRydWUpKSB7CiAgICAgICAgICBpZiAoIWNvbXBhY3QgfHwgaW5kZXgyICE9PSAwKSB7CiAgICAgICAgICAgIF9yZXN1bHQgKz0gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZTEwLCBsZXZlbCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3RhdGUxMC5kdW1wICYmIENIQVJfTElORV9GRUVEID09PSBzdGF0ZTEwLmR1bXAuY2hhckNvZGVBdCgwKSkgewogICAgICAgICAgICBfcmVzdWx0ICs9ICItIjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9yZXN1bHQgKz0gIi0gIjsKICAgICAgICAgIH0KICAgICAgICAgIF9yZXN1bHQgKz0gc3RhdGUxMC5kdW1wOwogICAgICAgIH0KICAgICAgfQogICAgICBzdGF0ZTEwLnRhZyA9IF90YWc7CiAgICAgIHN0YXRlMTAuZHVtcCA9IF9yZXN1bHQgfHwgIltdIjsKICAgIH0KICAgIGZ1bmN0aW9uIHdyaXRlRmxvd01hcHBpbmcoc3RhdGUxMCwgbGV2ZWwsIG9iamVjdCkgewogICAgICB2YXIgX3Jlc3VsdCA9ICIiLCBfdGFnID0gc3RhdGUxMC50YWcsIG9iamVjdEtleUxpc3QgPSBPYmplY3Qua2V5cyhvYmplY3QpLCBpbmRleDIsIGxlbmd0aCwgb2JqZWN0S2V5LCBvYmplY3RWYWx1ZSwgcGFpckJ1ZmZlcjsKICAgICAgZm9yIChpbmRleDIgPSAwLCBsZW5ndGggPSBvYmplY3RLZXlMaXN0Lmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIHBhaXJCdWZmZXIgPSAiIjsKICAgICAgICBpZiAoaW5kZXgyICE9PSAwKSBwYWlyQnVmZmVyICs9ICIsICI7CiAgICAgICAgaWYgKHN0YXRlMTAuY29uZGVuc2VGbG93KSBwYWlyQnVmZmVyICs9ICciJzsKICAgICAgICBvYmplY3RLZXkgPSBvYmplY3RLZXlMaXN0W2luZGV4Ml07CiAgICAgICAgb2JqZWN0VmFsdWUgPSBvYmplY3Rbb2JqZWN0S2V5XTsKICAgICAgICBpZiAoIXdyaXRlTm9kZShzdGF0ZTEwLCBsZXZlbCwgb2JqZWN0S2V5LCBmYWxzZSwgZmFsc2UpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHN0YXRlMTAuZHVtcC5sZW5ndGggPiAxMDI0KSBwYWlyQnVmZmVyICs9ICI/ICI7CiAgICAgICAgcGFpckJ1ZmZlciArPSBzdGF0ZTEwLmR1bXAgKyAoc3RhdGUxMC5jb25kZW5zZUZsb3cgPyAnIicgOiAiIikgKyAiOiIgKyAoc3RhdGUxMC5jb25kZW5zZUZsb3cgPyAiIiA6ICIgIik7CiAgICAgICAgaWYgKCF3cml0ZU5vZGUoc3RhdGUxMCwgbGV2ZWwsIG9iamVjdFZhbHVlLCBmYWxzZSwgZmFsc2UpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgcGFpckJ1ZmZlciArPSBzdGF0ZTEwLmR1bXA7CiAgICAgICAgX3Jlc3VsdCArPSBwYWlyQnVmZmVyOwogICAgICB9CiAgICAgIHN0YXRlMTAudGFnID0gX3RhZzsKICAgICAgc3RhdGUxMC5kdW1wID0gInsiICsgX3Jlc3VsdCArICJ9IjsKICAgIH0KICAgIGZ1bmN0aW9uIHdyaXRlQmxvY2tNYXBwaW5nKHN0YXRlMTAsIGxldmVsLCBvYmplY3QsIGNvbXBhY3QpIHsKICAgICAgdmFyIF9yZXN1bHQgPSAiIiwgX3RhZyA9IHN0YXRlMTAudGFnLCBvYmplY3RLZXlMaXN0ID0gT2JqZWN0LmtleXMob2JqZWN0KSwgaW5kZXgyLCBsZW5ndGgsIG9iamVjdEtleSwgb2JqZWN0VmFsdWUsIGV4cGxpY2l0UGFpciwgcGFpckJ1ZmZlcjsKICAgICAgaWYgKHN0YXRlMTAuc29ydEtleXMgPT09IHRydWUpIHsKICAgICAgICBvYmplY3RLZXlMaXN0LnNvcnQoKTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3RhdGUxMC5zb3J0S2V5cyA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIG9iamVjdEtleUxpc3Quc29ydChzdGF0ZTEwLnNvcnRLZXlzKTsKICAgICAgfSBlbHNlIGlmIChzdGF0ZTEwLnNvcnRLZXlzKSB7CiAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oInNvcnRLZXlzIG11c3QgYmUgYSBib29sZWFuIG9yIGEgZnVuY3Rpb24iKTsKICAgICAgfQogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IG9iamVjdEtleUxpc3QubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgcGFpckJ1ZmZlciA9ICIiOwogICAgICAgIGlmICghY29tcGFjdCB8fCBpbmRleDIgIT09IDApIHsKICAgICAgICAgIHBhaXJCdWZmZXIgKz0gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZTEwLCBsZXZlbCk7CiAgICAgICAgfQogICAgICAgIG9iamVjdEtleSA9IG9iamVjdEtleUxpc3RbaW5kZXgyXTsKICAgICAgICBvYmplY3RWYWx1ZSA9IG9iamVjdFtvYmplY3RLZXldOwogICAgICAgIGlmICghd3JpdGVOb2RlKHN0YXRlMTAsIGxldmVsICsgMSwgb2JqZWN0S2V5LCB0cnVlLCB0cnVlLCB0cnVlKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGV4cGxpY2l0UGFpciA9IHN0YXRlMTAudGFnICE9PSBudWxsICYmIHN0YXRlMTAudGFnICE9PSAiPyIgfHwgc3RhdGUxMC5kdW1wICYmIHN0YXRlMTAuZHVtcC5sZW5ndGggPiAxMDI0OwogICAgICAgIGlmIChleHBsaWNpdFBhaXIpIHsKICAgICAgICAgIGlmIChzdGF0ZTEwLmR1bXAgJiYgQ0hBUl9MSU5FX0ZFRUQgPT09IHN0YXRlMTAuZHVtcC5jaGFyQ29kZUF0KDApKSB7CiAgICAgICAgICAgIHBhaXJCdWZmZXIgKz0gIj8iOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcGFpckJ1ZmZlciArPSAiPyAiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwYWlyQnVmZmVyICs9IHN0YXRlMTAuZHVtcDsKICAgICAgICBpZiAoZXhwbGljaXRQYWlyKSB7CiAgICAgICAgICBwYWlyQnVmZmVyICs9IGdlbmVyYXRlTmV4dExpbmUoc3RhdGUxMCwgbGV2ZWwpOwogICAgICAgIH0KICAgICAgICBpZiAoIXdyaXRlTm9kZShzdGF0ZTEwLCBsZXZlbCArIDEsIG9iamVjdFZhbHVlLCB0cnVlLCBleHBsaWNpdFBhaXIpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHN0YXRlMTAuZHVtcCAmJiBDSEFSX0xJTkVfRkVFRCA9PT0gc3RhdGUxMC5kdW1wLmNoYXJDb2RlQXQoMCkpIHsKICAgICAgICAgIHBhaXJCdWZmZXIgKz0gIjoiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwYWlyQnVmZmVyICs9ICI6ICI7CiAgICAgICAgfQogICAgICAgIHBhaXJCdWZmZXIgKz0gc3RhdGUxMC5kdW1wOwogICAgICAgIF9yZXN1bHQgKz0gcGFpckJ1ZmZlcjsKICAgICAgfQogICAgICBzdGF0ZTEwLnRhZyA9IF90YWc7CiAgICAgIHN0YXRlMTAuZHVtcCA9IF9yZXN1bHQgfHwgInt9IjsKICAgIH0KICAgIGZ1bmN0aW9uIGRldGVjdFR5cGUoc3RhdGUxMCwgb2JqZWN0LCBleHBsaWNpdCkgewogICAgICB2YXIgX3Jlc3VsdCwgdHlwZUxpc3QsIGluZGV4MiwgbGVuZ3RoLCB0eXBlNSwgc3R5bGU7CiAgICAgIHR5cGVMaXN0ID0gZXhwbGljaXQgPyBzdGF0ZTEwLmV4cGxpY2l0VHlwZXMgOiBzdGF0ZTEwLmltcGxpY2l0VHlwZXM7CiAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gdHlwZUxpc3QubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgdHlwZTUgPSB0eXBlTGlzdFtpbmRleDJdOwogICAgICAgIGlmICgodHlwZTUuaW5zdGFuY2VPZiB8fCB0eXBlNS5wcmVkaWNhdGUpICYmICghdHlwZTUuaW5zdGFuY2VPZiB8fCB0eXBlb2Ygb2JqZWN0ID09PSAib2JqZWN0IiAmJiBvYmplY3QgaW5zdGFuY2VvZiB0eXBlNS5pbnN0YW5jZU9mKSAmJiAoIXR5cGU1LnByZWRpY2F0ZSB8fCB0eXBlNS5wcmVkaWNhdGUob2JqZWN0KSkpIHsKICAgICAgICAgIHN0YXRlMTAudGFnID0gZXhwbGljaXQgPyB0eXBlNS50YWcgOiAiPyI7CiAgICAgICAgICBpZiAodHlwZTUucmVwcmVzZW50KSB7CiAgICAgICAgICAgIHN0eWxlID0gc3RhdGUxMC5zdHlsZU1hcFt0eXBlNS50YWddIHx8IHR5cGU1LmRlZmF1bHRTdHlsZTsKICAgICAgICAgICAgaWYgKF90b1N0cmluZy5jYWxsKHR5cGU1LnJlcHJlc2VudCkgPT09ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKICAgICAgICAgICAgICBfcmVzdWx0ID0gdHlwZTUucmVwcmVzZW50KG9iamVjdCwgc3R5bGUpOwogICAgICAgICAgICB9IGVsc2UgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHR5cGU1LnJlcHJlc2VudCwgc3R5bGUpKSB7CiAgICAgICAgICAgICAgX3Jlc3VsdCA9IHR5cGU1LnJlcHJlc2VudFtzdHlsZV0ob2JqZWN0LCBzdHlsZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oIiE8IiArIHR5cGU1LnRhZyArICc+IHRhZyByZXNvbHZlciBhY2NlcHRzIG5vdCAiJyArIHN0eWxlICsgJyIgc3R5bGUnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZTEwLmR1bXAgPSBfcmVzdWx0OwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZ1bmN0aW9uIHdyaXRlTm9kZShzdGF0ZTEwLCBsZXZlbCwgb2JqZWN0LCBibG9jaywgY29tcGFjdCwgaXNrZXkpIHsKICAgICAgc3RhdGUxMC50YWcgPSBudWxsOwogICAgICBzdGF0ZTEwLmR1bXAgPSBvYmplY3Q7CiAgICAgIGlmICghZGV0ZWN0VHlwZShzdGF0ZTEwLCBvYmplY3QsIGZhbHNlKSkgewogICAgICAgIGRldGVjdFR5cGUoc3RhdGUxMCwgb2JqZWN0LCB0cnVlKTsKICAgICAgfQogICAgICB2YXIgdHlwZTUgPSBfdG9TdHJpbmcuY2FsbChzdGF0ZTEwLmR1bXApOwogICAgICBpZiAoYmxvY2spIHsKICAgICAgICBibG9jayA9IHN0YXRlMTAuZmxvd0xldmVsIDwgMCB8fCBzdGF0ZTEwLmZsb3dMZXZlbCA+IGxldmVsOwogICAgICB9CiAgICAgIHZhciBvYmplY3RPckFycmF5ID0gdHlwZTUgPT09ICJbb2JqZWN0IE9iamVjdF0iIHx8IHR5cGU1ID09PSAiW29iamVjdCBBcnJheV0iLCBkdXBsaWNhdGVJbmRleCwgZHVwbGljYXRlOwogICAgICBpZiAob2JqZWN0T3JBcnJheSkgewogICAgICAgIGR1cGxpY2F0ZUluZGV4ID0gc3RhdGUxMC5kdXBsaWNhdGVzLmluZGV4T2Yob2JqZWN0KTsKICAgICAgICBkdXBsaWNhdGUgPSBkdXBsaWNhdGVJbmRleCAhPT0gLTE7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlMTAudGFnICE9PSBudWxsICYmIHN0YXRlMTAudGFnICE9PSAiPyIgfHwgZHVwbGljYXRlIHx8IHN0YXRlMTAuaW5kZW50ICE9PSAyICYmIGxldmVsID4gMCkgewogICAgICAgIGNvbXBhY3QgPSBmYWxzZTsKICAgICAgfQogICAgICBpZiAoZHVwbGljYXRlICYmIHN0YXRlMTAudXNlZER1cGxpY2F0ZXNbZHVwbGljYXRlSW5kZXhdKSB7CiAgICAgICAgc3RhdGUxMC5kdW1wID0gIipyZWZfIiArIGR1cGxpY2F0ZUluZGV4OwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChvYmplY3RPckFycmF5ICYmIGR1cGxpY2F0ZSAmJiAhc3RhdGUxMC51c2VkRHVwbGljYXRlc1tkdXBsaWNhdGVJbmRleF0pIHsKICAgICAgICAgIHN0YXRlMTAudXNlZER1cGxpY2F0ZXNbZHVwbGljYXRlSW5kZXhdID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGU1ID09PSAiW29iamVjdCBPYmplY3RdIikgewogICAgICAgICAgaWYgKGJsb2NrICYmIE9iamVjdC5rZXlzKHN0YXRlMTAuZHVtcCkubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICAgIHdyaXRlQmxvY2tNYXBwaW5nKHN0YXRlMTAsIGxldmVsLCBzdGF0ZTEwLmR1bXAsIGNvbXBhY3QpOwogICAgICAgICAgICBpZiAoZHVwbGljYXRlKSB7CiAgICAgICAgICAgICAgc3RhdGUxMC5kdW1wID0gIiZyZWZfIiArIGR1cGxpY2F0ZUluZGV4ICsgc3RhdGUxMC5kdW1wOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3cml0ZUZsb3dNYXBwaW5nKHN0YXRlMTAsIGxldmVsLCBzdGF0ZTEwLmR1bXApOwogICAgICAgICAgICBpZiAoZHVwbGljYXRlKSB7CiAgICAgICAgICAgICAgc3RhdGUxMC5kdW1wID0gIiZyZWZfIiArIGR1cGxpY2F0ZUluZGV4ICsgIiAiICsgc3RhdGUxMC5kdW1wOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0eXBlNSA9PT0gIltvYmplY3QgQXJyYXldIikgewogICAgICAgICAgdmFyIGFycmF5TGV2ZWwgPSBzdGF0ZTEwLm5vQXJyYXlJbmRlbnQgJiYgbGV2ZWwgPiAwID8gbGV2ZWwgLSAxIDogbGV2ZWw7CiAgICAgICAgICBpZiAoYmxvY2sgJiYgc3RhdGUxMC5kdW1wLmxlbmd0aCAhPT0gMCkgewogICAgICAgICAgICB3cml0ZUJsb2NrU2VxdWVuY2Uoc3RhdGUxMCwgYXJyYXlMZXZlbCwgc3RhdGUxMC5kdW1wLCBjb21wYWN0KTsKICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSkgewogICAgICAgICAgICAgIHN0YXRlMTAuZHVtcCA9ICImcmVmXyIgKyBkdXBsaWNhdGVJbmRleCArIHN0YXRlMTAuZHVtcDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgd3JpdGVGbG93U2VxdWVuY2Uoc3RhdGUxMCwgYXJyYXlMZXZlbCwgc3RhdGUxMC5kdW1wKTsKICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSkgewogICAgICAgICAgICAgIHN0YXRlMTAuZHVtcCA9ICImcmVmXyIgKyBkdXBsaWNhdGVJbmRleCArICIgIiArIHN0YXRlMTAuZHVtcDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZTUgPT09ICJbb2JqZWN0IFN0cmluZ10iKSB7CiAgICAgICAgICBpZiAoc3RhdGUxMC50YWcgIT09ICI/IikgewogICAgICAgICAgICB3cml0ZVNjYWxhcihzdGF0ZTEwLCBzdGF0ZTEwLmR1bXAsIGxldmVsLCBpc2tleSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChzdGF0ZTEwLnNraXBJbnZhbGlkKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbigidW5hY2NlcHRhYmxlIGtpbmQgb2YgYW4gb2JqZWN0IHRvIGR1bXAgIiArIHR5cGU1KTsKICAgICAgICB9CiAgICAgICAgaWYgKHN0YXRlMTAudGFnICE9PSBudWxsICYmIHN0YXRlMTAudGFnICE9PSAiPyIpIHsKICAgICAgICAgIHN0YXRlMTAuZHVtcCA9ICIhPCIgKyBzdGF0ZTEwLnRhZyArICI+ICIgKyBzdGF0ZTEwLmR1bXA7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gZ2V0RHVwbGljYXRlUmVmZXJlbmNlcyhvYmplY3QsIHN0YXRlMTApIHsKICAgICAgdmFyIG9iamVjdHMgPSBbXSwgZHVwbGljYXRlc0luZGV4ZXMgPSBbXSwgaW5kZXgyLCBsZW5ndGg7CiAgICAgIGluc3BlY3ROb2RlKG9iamVjdCwgb2JqZWN0cywgZHVwbGljYXRlc0luZGV4ZXMpOwogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IGR1cGxpY2F0ZXNJbmRleGVzLmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIHN0YXRlMTAuZHVwbGljYXRlcy5wdXNoKG9iamVjdHNbZHVwbGljYXRlc0luZGV4ZXNbaW5kZXgyXV0pOwogICAgICB9CiAgICAgIHN0YXRlMTAudXNlZER1cGxpY2F0ZXMgPSBuZXcgQXJyYXkobGVuZ3RoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGluc3BlY3ROb2RlKG9iamVjdCwgb2JqZWN0cywgZHVwbGljYXRlc0luZGV4ZXMpIHsKICAgICAgdmFyIG9iamVjdEtleUxpc3QsIGluZGV4MiwgbGVuZ3RoOwogICAgICBpZiAob2JqZWN0ICE9PSBudWxsICYmIHR5cGVvZiBvYmplY3QgPT09ICJvYmplY3QiKSB7CiAgICAgICAgaW5kZXgyID0gb2JqZWN0cy5pbmRleE9mKG9iamVjdCk7CiAgICAgICAgaWYgKGluZGV4MiAhPT0gLTEpIHsKICAgICAgICAgIGlmIChkdXBsaWNhdGVzSW5kZXhlcy5pbmRleE9mKGluZGV4MikgPT09IC0xKSB7CiAgICAgICAgICAgIGR1cGxpY2F0ZXNJbmRleGVzLnB1c2goaW5kZXgyKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgb2JqZWN0cy5wdXNoKG9iamVjdCk7CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7CiAgICAgICAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgICAgICAgIGluc3BlY3ROb2RlKG9iamVjdFtpbmRleDJdLCBvYmplY3RzLCBkdXBsaWNhdGVzSW5kZXhlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG9iamVjdEtleUxpc3QgPSBPYmplY3Qua2V5cyhvYmplY3QpOwogICAgICAgICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IG9iamVjdEtleUxpc3QubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgICAgICAgaW5zcGVjdE5vZGUob2JqZWN0W29iamVjdEtleUxpc3RbaW5kZXgyXV0sIG9iamVjdHMsIGR1cGxpY2F0ZXNJbmRleGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZHVtcChpbnB1dCwgb3B0aW9ucykgewogICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgdmFyIHN0YXRlMTAgPSBuZXcgU3RhdGUob3B0aW9ucyk7CiAgICAgIGlmICghc3RhdGUxMC5ub1JlZnMpIGdldER1cGxpY2F0ZVJlZmVyZW5jZXMoaW5wdXQsIHN0YXRlMTApOwogICAgICBpZiAod3JpdGVOb2RlKHN0YXRlMTAsIDAsIGlucHV0LCB0cnVlLCB0cnVlKSkgcmV0dXJuIHN0YXRlMTAuZHVtcCArICJcbiI7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGZ1bmN0aW9uIHNhZmVEdW1wKGlucHV0LCBvcHRpb25zKSB7CiAgICAgIHJldHVybiBkdW1wKGlucHV0LCBjb21tb24uZXh0ZW5kKHsgc2NoZW1hOiBERUZBVUxUX1NBRkVfU0NIRU1BIH0sIG9wdGlvbnMpKTsKICAgIH0KICAgIG1vZHVsZS5leHBvcnRzLmR1bXAgPSBkdW1wOwogICAgbW9kdWxlLmV4cG9ydHMuc2FmZUR1bXAgPSBzYWZlRHVtcDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sLmpzCnZhciByZXF1aXJlX2pzX3lhbWwgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBsb2FkZXIgPSByZXF1aXJlX2xvYWRlcigpOwogICAgdmFyIGR1bXBlciA9IHJlcXVpcmVfZHVtcGVyKCk7CiAgICBmdW5jdGlvbiBkZXByZWNhdGVkKG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiRnVuY3Rpb24gIiArIG5hbWUgKyAiIGlzIGRlcHJlY2F0ZWQgYW5kIGNhbm5vdCBiZSB1c2VkLiIpOwogICAgICB9OwogICAgfQogICAgbW9kdWxlLmV4cG9ydHMuVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgbW9kdWxlLmV4cG9ydHMuU2NoZW1hID0gcmVxdWlyZV9zY2hlbWEoKTsKICAgIG1vZHVsZS5leHBvcnRzLkZBSUxTQUZFX1NDSEVNQSA9IHJlcXVpcmVfZmFpbHNhZmUoKTsKICAgIG1vZHVsZS5leHBvcnRzLkpTT05fU0NIRU1BID0gcmVxdWlyZV9qc29uKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5DT1JFX1NDSEVNQSA9IHJlcXVpcmVfY29yZSgpOwogICAgbW9kdWxlLmV4cG9ydHMuREVGQVVMVF9TQUZFX1NDSEVNQSA9IHJlcXVpcmVfZGVmYXVsdF9zYWZlKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5ERUZBVUxUX0ZVTExfU0NIRU1BID0gcmVxdWlyZV9kZWZhdWx0X2Z1bGwoKTsKICAgIG1vZHVsZS5leHBvcnRzLmxvYWQgPSBsb2FkZXIubG9hZDsKICAgIG1vZHVsZS5leHBvcnRzLmxvYWRBbGwgPSBsb2FkZXIubG9hZEFsbDsKICAgIG1vZHVsZS5leHBvcnRzLnNhZmVMb2FkID0gbG9hZGVyLnNhZmVMb2FkOwogICAgbW9kdWxlLmV4cG9ydHMuc2FmZUxvYWRBbGwgPSBsb2FkZXIuc2FmZUxvYWRBbGw7CiAgICBtb2R1bGUuZXhwb3J0cy5kdW1wID0gZHVtcGVyLmR1bXA7CiAgICBtb2R1bGUuZXhwb3J0cy5zYWZlRHVtcCA9IGR1bXBlci5zYWZlRHVtcDsKICAgIG1vZHVsZS5leHBvcnRzLllBTUxFeGNlcHRpb24gPSByZXF1aXJlX2V4Y2VwdGlvbigpOwogICAgbW9kdWxlLmV4cG9ydHMuTUlOSU1BTF9TQ0hFTUEgPSByZXF1aXJlX2ZhaWxzYWZlKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5TQUZFX1NDSEVNQSA9IHJlcXVpcmVfZGVmYXVsdF9zYWZlKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5ERUZBVUxUX1NDSEVNQSA9IHJlcXVpcmVfZGVmYXVsdF9mdWxsKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5zY2FuID0gZGVwcmVjYXRlZCgic2NhbiIpOwogICAgbW9kdWxlLmV4cG9ydHMucGFyc2UgPSBkZXByZWNhdGVkKCJwYXJzZSIpOwogICAgbW9kdWxlLmV4cG9ydHMuY29tcG9zZSA9IGRlcHJlY2F0ZWQoImNvbXBvc2UiKTsKICAgIG1vZHVsZS5leHBvcnRzLmFkZENvbnN0cnVjdG9yID0gZGVwcmVjYXRlZCgiYWRkQ29uc3RydWN0b3IiKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2luZGV4LmpzCnZhciByZXF1aXJlX2pzX3lhbWwyID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9pbmRleC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgeWFtbCA9IHJlcXVpcmVfanNfeWFtbCgpOwogICAgbW9kdWxlLmV4cG9ydHMgPSB5YW1sOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR5YW1sQDIuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHlhbWwvZGlzdF90cy9zbWFydHlhbWwucGx1Z2lucy5qcwp2YXIgcmVxdWlyZV9zbWFydHlhbWxfcGx1Z2lucyA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR5YW1sQDIuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHlhbWwvZGlzdF90cy9zbWFydHlhbWwucGx1Z2lucy5qcyIoZXhwb3J0cykgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fY3JlYXRlQmluZGluZzIgPSBleHBvcnRzICYmIGV4cG9ydHMuX19jcmVhdGVCaW5kaW5nIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8xMywgbTYsIGs0LCBrMjIpIHsKICAgICAgaWYgKGsyMiA9PT0gdm9pZCAwKSBrMjIgPSBrNDsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8xMywgazIyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIG02W2s0XTsKICAgICAgfSB9KTsKICAgIH0pIDogKGZ1bmN0aW9uKG8xMywgbTYsIGs0LCBrMjIpIHsKICAgICAgaWYgKGsyMiA9PT0gdm9pZCAwKSBrMjIgPSBrNDsKICAgICAgbzEzW2syMl0gPSBtNltrNF07CiAgICB9KSk7CiAgICB2YXIgX19zZXRNb2R1bGVEZWZhdWx0MiA9IGV4cG9ydHMgJiYgZXhwb3J0cy5fX3NldE1vZHVsZURlZmF1bHQgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obzEzLCB2NSkgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobzEzLCAiZGVmYXVsdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHY1IH0pOwogICAgfSkgOiBmdW5jdGlvbihvMTMsIHY1KSB7CiAgICAgIG8xM1siZGVmYXVsdCJdID0gdjU7CiAgICB9KTsKICAgIHZhciBfX2ltcG9ydFN0YXIyID0gZXhwb3J0cyAmJiBleHBvcnRzLl9faW1wb3J0U3RhciB8fCBmdW5jdGlvbihtb2QpIHsKICAgICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDsKICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICBpZiAobW9kICE9IG51bGwpIHsKICAgICAgICBmb3IgKHZhciBrNCBpbiBtb2QpIGlmIChrNCAhPT0gImRlZmF1bHQiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgazQpKSBfX2NyZWF0ZUJpbmRpbmcyKHJlc3VsdCwgbW9kLCBrNCk7CiAgICAgIH0KICAgICAgX19zZXRNb2R1bGVEZWZhdWx0MihyZXN1bHQsIG1vZCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMuanNZYW1sID0gdm9pZCAwOwogICAgdmFyIGpzWWFtbCA9IF9faW1wb3J0U3RhcjIocmVxdWlyZV9qc195YW1sMigpKTsKICAgIGV4cG9ydHMuanNZYW1sID0ganNZYW1sOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR5YW1sQDIuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHlhbWwvZGlzdF90cy9pbmRleC5qcwp2YXIgcmVxdWlyZV9kaXN0X3RzMiA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR5YW1sQDIuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHlhbWwvZGlzdF90cy9pbmRleC5qcyIoZXhwb3J0cykgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fY3JlYXRlQmluZGluZzIgPSBleHBvcnRzICYmIGV4cG9ydHMuX19jcmVhdGVCaW5kaW5nIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8xMywgbTYsIGs0LCBrMjIpIHsKICAgICAgaWYgKGsyMiA9PT0gdm9pZCAwKSBrMjIgPSBrNDsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8xMywgazIyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIG02W2s0XTsKICAgICAgfSB9KTsKICAgIH0pIDogKGZ1bmN0aW9uKG8xMywgbTYsIGs0LCBrMjIpIHsKICAgICAgaWYgKGsyMiA9PT0gdm9pZCAwKSBrMjIgPSBrNDsKICAgICAgbzEzW2syMl0gPSBtNltrNF07CiAgICB9KSk7CiAgICB2YXIgX19zZXRNb2R1bGVEZWZhdWx0MiA9IGV4cG9ydHMgJiYgZXhwb3J0cy5fX3NldE1vZHVsZURlZmF1bHQgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obzEzLCB2NSkgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobzEzLCAiZGVmYXVsdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHY1IH0pOwogICAgfSkgOiBmdW5jdGlvbihvMTMsIHY1KSB7CiAgICAgIG8xM1siZGVmYXVsdCJdID0gdjU7CiAgICB9KTsKICAgIHZhciBfX2ltcG9ydFN0YXIyID0gZXhwb3J0cyAmJiBleHBvcnRzLl9faW1wb3J0U3RhciB8fCBmdW5jdGlvbihtb2QpIHsKICAgICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDsKICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICBpZiAobW9kICE9IG51bGwpIHsKICAgICAgICBmb3IgKHZhciBrNCBpbiBtb2QpIGlmIChrNCAhPT0gImRlZmF1bHQiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgazQpKSBfX2NyZWF0ZUJpbmRpbmcyKHJlc3VsdCwgbW9kLCBrNCk7CiAgICAgIH0KICAgICAgX19zZXRNb2R1bGVEZWZhdWx0MihyZXN1bHQsIG1vZCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMub2JqZWN0VG9ZYW1sU3RyaW5nID0gZXhwb3J0cy55YW1sU3RyaW5nVG9PYmplY3QgPSB2b2lkIDA7CiAgICB2YXIgcGx1Z2luczMgPSBfX2ltcG9ydFN0YXIyKHJlcXVpcmVfc21hcnR5YW1sX3BsdWdpbnMoKSk7CiAgICBleHBvcnRzLnlhbWxTdHJpbmdUb09iamVjdCA9IGFzeW5jICh5YW1sU3RyaW5nQXJnLCBvcHRpb25zQXJnID0ge30pID0+IHsKICAgICAgcmV0dXJuIHBsdWdpbnMzLmpzWWFtbC5zYWZlTG9hZCh5YW1sU3RyaW5nQXJnKTsKICAgIH07CiAgICBleHBvcnRzLm9iamVjdFRvWWFtbFN0cmluZyA9IGFzeW5jIChvYmplY3RBcmcsIG9wdGlvbnNBcmcgPSB7fSkgPT4gewogICAgICByZXR1cm4gcGx1Z2luczMuanNZYW1sLnNhZmVEdW1wKG9iamVjdEFyZyk7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vYmFpbEAyLjAuMi9ub2RlX21vZHVsZXMvYmFpbC9pbmRleC5qcwpmdW5jdGlvbiBiYWlsKGVycm9yKSB7CiAgaWYgKGVycm9yKSB7CiAgICB0aHJvdyBlcnJvcjsKICB9Cn0KdmFyIGluaXRfYmFpbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2JhaWxAMi4wLjIvbm9kZV9tb2R1bGVzL2JhaWwvaW5kZXguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZXh0ZW5kQDMuMC4yL25vZGVfbW9kdWxlcy9leHRlbmQvaW5kZXguanMKdmFyIHJlcXVpcmVfZXh0ZW5kID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9leHRlbmRAMy4wLjIvbm9kZV9tb2R1bGVzL2V4dGVuZC9pbmRleC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICAgIHZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CiAgICB2YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7CiAgICB2YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICB2YXIgaXNBcnJheTMgPSBmdW5jdGlvbiBpc0FycmF5NChhcnIpIHsKICAgICAgaWYgKHR5cGVvZiBBcnJheS5pc0FycmF5ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyKTsKICAgICAgfQogICAgICByZXR1cm4gdG9TdHIuY2FsbChhcnIpID09PSAiW29iamVjdCBBcnJheV0iOwogICAgfTsKICAgIHZhciBpc1BsYWluT2JqZWN0MiA9IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QzKG9iaikgewogICAgICBpZiAoIW9iaiB8fCB0b1N0ci5jYWxsKG9iaikgIT09ICJbb2JqZWN0IE9iamVjdF0iKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHZhciBoYXNPd25Db25zdHJ1Y3RvciA9IGhhc093bi5jYWxsKG9iaiwgImNvbnN0cnVjdG9yIik7CiAgICAgIHZhciBoYXNJc1Byb3RvdHlwZU9mID0gb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiYgaGFzT3duLmNhbGwob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgImlzUHJvdG90eXBlT2YiKTsKICAgICAgaWYgKG9iai5jb25zdHJ1Y3RvciAmJiAhaGFzT3duQ29uc3RydWN0b3IgJiYgIWhhc0lzUHJvdG90eXBlT2YpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIGtleTI7CiAgICAgIGZvciAoa2V5MiBpbiBvYmopIHsKICAgICAgfQogICAgICByZXR1cm4gdHlwZW9mIGtleTIgPT09ICJ1bmRlZmluZWQiIHx8IGhhc093bi5jYWxsKG9iaiwga2V5Mik7CiAgICB9OwogICAgdmFyIHNldFByb3BlcnR5ID0gZnVuY3Rpb24gc2V0UHJvcGVydHkyKHRhcmdldCwgb3B0aW9ucykgewogICAgICBpZiAoZGVmaW5lUHJvcGVydHkgJiYgb3B0aW9ucy5uYW1lID09PSAiX19wcm90b19fIikgewogICAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwgb3B0aW9ucy5uYW1lLCB7CiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgdmFsdWU6IG9wdGlvbnMubmV3VmFsdWUsCiAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHRhcmdldFtvcHRpb25zLm5hbWVdID0gb3B0aW9ucy5uZXdWYWx1ZTsKICAgICAgfQogICAgfTsKICAgIHZhciBnZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIGdldFByb3BlcnR5MihvYmosIG5hbWUpIHsKICAgICAgaWYgKG5hbWUgPT09ICJfX3Byb3RvX18iKSB7CiAgICAgICAgaWYgKCFoYXNPd24uY2FsbChvYmosIG5hbWUpKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0gZWxzZSBpZiAoZ09QRCkgewogICAgICAgICAgcmV0dXJuIGdPUEQob2JqLCBuYW1lKS52YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG9ialtuYW1lXTsKICAgIH07CiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV4dGVuZDMoKSB7CiAgICAgIHZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZTsKICAgICAgdmFyIHRhcmdldCA9IGFyZ3VtZW50c1swXTsKICAgICAgdmFyIGkxMSA9IDE7CiAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogICAgICB2YXIgZGVlcCA9IGZhbHNlOwogICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgZGVlcCA9IHRhcmdldDsKICAgICAgICB0YXJnZXQgPSBhcmd1bWVudHNbMV0gfHwge307CiAgICAgICAgaTExID0gMjsKICAgICAgfQogICAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgdHlwZW9mIHRhcmdldCAhPT0gIm9iamVjdCIgJiYgdHlwZW9mIHRhcmdldCAhPT0gImZ1bmN0aW9uIikgewogICAgICAgIHRhcmdldCA9IHt9OwogICAgICB9CiAgICAgIGZvciAoOyBpMTEgPCBsZW5ndGg7ICsraTExKSB7CiAgICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50c1tpMTFdOwogICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHsKICAgICAgICAgIGZvciAobmFtZSBpbiBvcHRpb25zKSB7CiAgICAgICAgICAgIHNyYyA9IGdldFByb3BlcnR5KHRhcmdldCwgbmFtZSk7CiAgICAgICAgICAgIGNvcHkgPSBnZXRQcm9wZXJ0eShvcHRpb25zLCBuYW1lKTsKICAgICAgICAgICAgaWYgKHRhcmdldCAhPT0gY29weSkgewogICAgICAgICAgICAgIGlmIChkZWVwICYmIGNvcHkgJiYgKGlzUGxhaW5PYmplY3QyKGNvcHkpIHx8IChjb3B5SXNBcnJheSA9IGlzQXJyYXkzKGNvcHkpKSkpIHsKICAgICAgICAgICAgICAgIGlmIChjb3B5SXNBcnJheSkgewogICAgICAgICAgICAgICAgICBjb3B5SXNBcnJheSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICBjbG9uZSA9IHNyYyAmJiBpc0FycmF5MyhzcmMpID8gc3JjIDogW107CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBjbG9uZSA9IHNyYyAmJiBpc1BsYWluT2JqZWN0MihzcmMpID8gc3JjIDoge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eSh0YXJnZXQsIHsgbmFtZSwgbmV3VmFsdWU6IGV4dGVuZDMoZGVlcCwgY2xvbmUsIGNvcHkpIH0pOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvcHkgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eSh0YXJnZXQsIHsgbmFtZSwgbmV3VmFsdWU6IGNvcHkgfSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGV2bG9wQDEuMS4wL25vZGVfbW9kdWxlcy9kZXZsb3AvbGliL2RlZmF1bHQuanMKZnVuY3Rpb24gZGVwcmVjYXRlKGZuKSB7CiAgcmV0dXJuIGZuOwp9CmZ1bmN0aW9uIGVxdWFsKCkgewp9CmZ1bmN0aW9uIG9rKCkgewp9CmZ1bmN0aW9uIHVucmVhY2hhYmxlKCkgewp9CnZhciBpbml0X2RlZmF1bHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kZXZsb3BAMS4xLjAvbm9kZV9tb2R1bGVzL2RldmxvcC9saWIvZGVmYXVsdC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9pcy1wbGFpbi1vYmpANC4xLjAvbm9kZV9tb2R1bGVzL2lzLXBsYWluLW9iai9pbmRleC5qcwpmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlMikgewogIGlmICh0eXBlb2YgdmFsdWUyICE9PSAib2JqZWN0IiB8fCB2YWx1ZTIgPT09IG51bGwpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlMik7CiAgcmV0dXJuIChwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBudWxsKSAmJiAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZTIpICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIHZhbHVlMik7Cn0KdmFyIGluaXRfaXNfcGxhaW5fb2JqID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vaXMtcGxhaW4tb2JqQDQuMS4wL25vZGVfbW9kdWxlcy9pcy1wbGFpbi1vYmovaW5kZXguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdHJvdWdoQDIuMi4wL25vZGVfbW9kdWxlcy90cm91Z2gvbGliL2luZGV4LmpzCmZ1bmN0aW9uIHRyb3VnaCgpIHsKICBjb25zdCBmbnMgPSBbXTsKICBjb25zdCBwaXBlbGluZSA9IHsgcnVuLCB1c2UgfTsKICByZXR1cm4gcGlwZWxpbmU7CiAgZnVuY3Rpb24gcnVuKC4uLnZhbHVlcykgewogICAgbGV0IG1pZGRsZXdhcmVJbmRleCA9IC0xOwogICAgY29uc3QgY2FsbGJhY2sgPSB2YWx1ZXMucG9wKCk7CiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGZ1bmN0aW9uIGFzIGxhc3QgYXJndW1lbnQsIG5vdCAiICsgY2FsbGJhY2spOwogICAgfQogICAgbmV4dDIobnVsbCwgLi4udmFsdWVzKTsKICAgIGZ1bmN0aW9uIG5leHQyKGVycm9yLCAuLi5vdXRwdXQpIHsKICAgICAgY29uc3QgZm4gPSBmbnNbKyttaWRkbGV3YXJlSW5kZXhdOwogICAgICBsZXQgaW5kZXgyID0gLTE7CiAgICAgIGlmIChlcnJvcikgewogICAgICAgIGNhbGxiYWNrKGVycm9yKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgd2hpbGUgKCsraW5kZXgyIDwgdmFsdWVzLmxlbmd0aCkgewogICAgICAgIGlmIChvdXRwdXRbaW5kZXgyXSA9PT0gbnVsbCB8fCBvdXRwdXRbaW5kZXgyXSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBvdXRwdXRbaW5kZXgyXSA9IHZhbHVlc1tpbmRleDJdOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWx1ZXMgPSBvdXRwdXQ7CiAgICAgIGlmIChmbikgewogICAgICAgIHdyYXAyKGZuLCBuZXh0MikoLi4ub3V0cHV0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjYWxsYmFjayhudWxsLCAuLi5vdXRwdXQpOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIHVzZShtaWRkZWx3YXJlKSB7CiAgICBpZiAodHlwZW9mIG1pZGRlbHdhcmUgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgICAiRXhwZWN0ZWQgYG1pZGRlbHdhcmVgIHRvIGJlIGEgZnVuY3Rpb24sIG5vdCAiICsgbWlkZGVsd2FyZQogICAgICApOwogICAgfQogICAgZm5zLnB1c2gobWlkZGVsd2FyZSk7CiAgICByZXR1cm4gcGlwZWxpbmU7CiAgfQp9CmZ1bmN0aW9uIHdyYXAyKG1pZGRsZXdhcmUsIGNhbGxiYWNrKSB7CiAgbGV0IGNhbGxlZDsKICByZXR1cm4gd3JhcHBlZDsKICBmdW5jdGlvbiB3cmFwcGVkKC4uLnBhcmFtZXRlcnMpIHsKICAgIGNvbnN0IGZuRXhwZWN0c0NhbGxiYWNrID0gbWlkZGxld2FyZS5sZW5ndGggPiBwYXJhbWV0ZXJzLmxlbmd0aDsKICAgIGxldCByZXN1bHQ7CiAgICBpZiAoZm5FeHBlY3RzQ2FsbGJhY2spIHsKICAgICAgcGFyYW1ldGVycy5wdXNoKGRvbmUpOwogICAgfQogICAgdHJ5IHsKICAgICAgcmVzdWx0ID0gbWlkZGxld2FyZS5hcHBseSh0aGlzLCBwYXJhbWV0ZXJzKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9ICgKICAgICAgICAvKiogQHR5cGUge0Vycm9yfSAqLwogICAgICAgIGVycm9yCiAgICAgICk7CiAgICAgIGlmIChmbkV4cGVjdHNDYWxsYmFjayAmJiBjYWxsZWQpIHsKICAgICAgICB0aHJvdyBleGNlcHRpb247CiAgICAgIH0KICAgICAgcmV0dXJuIGRvbmUoZXhjZXB0aW9uKTsKICAgIH0KICAgIGlmICghZm5FeHBlY3RzQ2FsbGJhY2spIHsKICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQudGhlbiAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICByZXN1bHQudGhlbih0aGVuLCBkb25lKTsKICAgICAgfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikgewogICAgICAgIGRvbmUocmVzdWx0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGVuKHJlc3VsdCk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gZG9uZShlcnJvciwgLi4ub3V0cHV0KSB7CiAgICBpZiAoIWNhbGxlZCkgewogICAgICBjYWxsZWQgPSB0cnVlOwogICAgICBjYWxsYmFjayhlcnJvciwgLi4ub3V0cHV0KTsKICAgIH0KICB9CiAgZnVuY3Rpb24gdGhlbih2YWx1ZTIpIHsKICAgIGRvbmUobnVsbCwgdmFsdWUyKTsKICB9Cn0KdmFyIGluaXRfbGliID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdHJvdWdoQDIuMi4wL25vZGVfbW9kdWxlcy90cm91Z2gvbGliL2luZGV4LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Ryb3VnaEAyLjIuMC9ub2RlX21vZHVsZXMvdHJvdWdoL2luZGV4LmpzCnZhciBpbml0X3Ryb3VnaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3Ryb3VnaEAyLjIuMC9ub2RlX21vZHVsZXMvdHJvdWdoL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXN0cmluZ2lmeS1wb3NpdGlvbkA0LjAuMC9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC1zdHJpbmdpZnktcG9zaXRpb24vbGliL2luZGV4LmpzCmZ1bmN0aW9uIHN0cmluZ2lmeVBvc2l0aW9uKHZhbHVlMikgewogIGlmICghdmFsdWUyIHx8IHR5cGVvZiB2YWx1ZTIgIT09ICJvYmplY3QiKSB7CiAgICByZXR1cm4gIiI7CiAgfQogIGlmICgicG9zaXRpb24iIGluIHZhbHVlMiB8fCAidHlwZSIgaW4gdmFsdWUyKSB7CiAgICByZXR1cm4gcG9zaXRpb24odmFsdWUyLnBvc2l0aW9uKTsKICB9CiAgaWYgKCJzdGFydCIgaW4gdmFsdWUyIHx8ICJlbmQiIGluIHZhbHVlMikgewogICAgcmV0dXJuIHBvc2l0aW9uKHZhbHVlMik7CiAgfQogIGlmICgibGluZSIgaW4gdmFsdWUyIHx8ICJjb2x1bW4iIGluIHZhbHVlMikgewogICAgcmV0dXJuIHBvaW50KHZhbHVlMik7CiAgfQogIHJldHVybiAiIjsKfQpmdW5jdGlvbiBwb2ludChwb2ludDQpIHsKICByZXR1cm4gaW5kZXgocG9pbnQ0ICYmIHBvaW50NC5saW5lKSArICI6IiArIGluZGV4KHBvaW50NCAmJiBwb2ludDQuY29sdW1uKTsKfQpmdW5jdGlvbiBwb3NpdGlvbihwb3MpIHsKICByZXR1cm4gcG9pbnQocG9zICYmIHBvcy5zdGFydCkgKyAiLSIgKyBwb2ludChwb3MgJiYgcG9zLmVuZCk7Cn0KZnVuY3Rpb24gaW5kZXgodmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMiAmJiB0eXBlb2YgdmFsdWUyID09PSAibnVtYmVyIiA/IHZhbHVlMiA6IDE7Cn0KdmFyIGluaXRfbGliMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtc3RyaW5naWZ5LXBvc2l0aW9uQDQuMC4wL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXN0cmluZ2lmeS1wb3NpdGlvbi9saWIvaW5kZXguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdW5pc3QtdXRpbC1zdHJpbmdpZnktcG9zaXRpb25ANC4wLjAvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtc3RyaW5naWZ5LXBvc2l0aW9uL2luZGV4LmpzCnZhciBpbml0X3VuaXN0X3V0aWxfc3RyaW5naWZ5X3Bvc2l0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdW5pc3QtdXRpbC1zdHJpbmdpZnktcG9zaXRpb25ANC4wLjAvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtc3RyaW5naWZ5LXBvc2l0aW9uL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliMigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdmZpbGUtbWVzc2FnZUA0LjAuMy9ub2RlX21vZHVsZXMvdmZpbGUtbWVzc2FnZS9saWIvaW5kZXguanMKdmFyIFZGaWxlTWVzc2FnZTsKdmFyIGluaXRfbGliMyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3ZmaWxlLW1lc3NhZ2VANC4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlLW1lc3NhZ2UvbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfdW5pc3RfdXRpbF9zdHJpbmdpZnlfcG9zaXRpb24oKTsKICAgIFZGaWxlTWVzc2FnZSA9IGNsYXNzIGV4dGVuZHMgRXJyb3IgewogICAgICAvKioKICAgICAgICogQ3JlYXRlIGEgbWVzc2FnZSBmb3IgYHJlYXNvbmAuCiAgICAgICAqCiAgICAgICAqID4g8J+qpiAqKk5vdGUqKjogYWxzbyBoYXMgb2Jzb2xldGUgc2lnbmF0dXJlcy4KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgICAgICogQHBhcmFtIHtPcHRpb25zIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29wdGlvbnNdCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICAgICAqIEBwYXJhbSB7Tm9kZSB8IE5vZGVMaWtlIHwgbnVsbCB8IHVuZGVmaW5lZH0gcGFyZW50CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogQHJldHVybnMKICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgICAgICogQHBhcmFtIHtQb2ludCB8IFBvc2l0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZH0gcGxhY2UKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAgICAgKiBAcmV0dXJucwogICAgICAgKgogICAgICAgKiBAb3ZlcmxvYWQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAgICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IHBhcmVudAogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAgICAgKiBAcGFyYW0ge1BvaW50IHwgUG9zaXRpb24gfCBudWxsIHwgdW5kZWZpbmVkfSBwbGFjZQogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7RXJyb3IgfCBWRmlsZU1lc3NhZ2UgfCBzdHJpbmd9IGNhdXNlT3JSZWFzb24KICAgICAgICogICBSZWFzb24gZm9yIG1lc3NhZ2UsIHNob3VsZCB1c2UgbWFya2Rvd24uCiAgICAgICAqIEBwYXJhbSB7Tm9kZSB8IE5vZGVMaWtlIHwgT3B0aW9ucyB8IFBvaW50IHwgUG9zaXRpb24gfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0aW9uc09yUGFyZW50T3JQbGFjZV0KICAgICAgICogICBDb25maWd1cmF0aW9uIChvcHRpb25hbCkuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogICBQbGFjZSBpbiBjb2RlIHdoZXJlIHRoZSBtZXNzYWdlIG9yaWdpbmF0ZXMgKGV4YW1wbGU6CiAgICAgICAqICAgYCdteS1wYWNrYWdlOm15LXJ1bGUnYCBvciBgJ215LXJ1bGUnYCkuCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqICAgSW5zdGFuY2Ugb2YgYFZGaWxlTWVzc2FnZWAuCiAgICAgICAqLwogICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eQogICAgICBjb25zdHJ1Y3RvcihjYXVzZU9yUmVhc29uLCBvcHRpb25zT3JQYXJlbnRPclBsYWNlLCBvcmlnaW4pIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yUGFyZW50T3JQbGFjZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIG9yaWdpbiA9IG9wdGlvbnNPclBhcmVudE9yUGxhY2U7CiAgICAgICAgICBvcHRpb25zT3JQYXJlbnRPclBsYWNlID0gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBsZXQgcmVhc29uID0gIiI7CiAgICAgICAgbGV0IG9wdGlvbnMgPSB7fTsKICAgICAgICBsZXQgbGVnYWN5Q2F1c2UgPSBmYWxzZTsKICAgICAgICBpZiAob3B0aW9uc09yUGFyZW50T3JQbGFjZSkgewogICAgICAgICAgaWYgKCJsaW5lIiBpbiBvcHRpb25zT3JQYXJlbnRPclBsYWNlICYmICJjb2x1bW4iIGluIG9wdGlvbnNPclBhcmVudE9yUGxhY2UpIHsKICAgICAgICAgICAgb3B0aW9ucyA9IHsgcGxhY2U6IG9wdGlvbnNPclBhcmVudE9yUGxhY2UgfTsKICAgICAgICAgIH0gZWxzZSBpZiAoInN0YXJ0IiBpbiBvcHRpb25zT3JQYXJlbnRPclBsYWNlICYmICJlbmQiIGluIG9wdGlvbnNPclBhcmVudE9yUGxhY2UpIHsKICAgICAgICAgICAgb3B0aW9ucyA9IHsgcGxhY2U6IG9wdGlvbnNPclBhcmVudE9yUGxhY2UgfTsKICAgICAgICAgIH0gZWxzZSBpZiAoInR5cGUiIGluIG9wdGlvbnNPclBhcmVudE9yUGxhY2UpIHsKICAgICAgICAgICAgb3B0aW9ucyA9IHsKICAgICAgICAgICAgICBhbmNlc3RvcnM6IFtvcHRpb25zT3JQYXJlbnRPclBsYWNlXSwKICAgICAgICAgICAgICBwbGFjZTogb3B0aW9uc09yUGFyZW50T3JQbGFjZS5wb3NpdGlvbgogICAgICAgICAgICB9OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb3B0aW9ucyA9IHsgLi4ub3B0aW9uc09yUGFyZW50T3JQbGFjZSB9OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIGNhdXNlT3JSZWFzb24gPT09ICJzdHJpbmciKSB7CiAgICAgICAgICByZWFzb24gPSBjYXVzZU9yUmVhc29uOwogICAgICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMuY2F1c2UgJiYgY2F1c2VPclJlYXNvbikgewogICAgICAgICAgbGVnYWN5Q2F1c2UgPSB0cnVlOwogICAgICAgICAgcmVhc29uID0gY2F1c2VPclJlYXNvbi5tZXNzYWdlOwogICAgICAgICAgb3B0aW9ucy5jYXVzZSA9IGNhdXNlT3JSZWFzb247CiAgICAgICAgfQogICAgICAgIGlmICghb3B0aW9ucy5ydWxlSWQgJiYgIW9wdGlvbnMuc291cmNlICYmIHR5cGVvZiBvcmlnaW4gPT09ICJzdHJpbmciKSB7CiAgICAgICAgICBjb25zdCBpbmRleDIgPSBvcmlnaW4uaW5kZXhPZigiOiIpOwogICAgICAgICAgaWYgKGluZGV4MiA9PT0gLTEpIHsKICAgICAgICAgICAgb3B0aW9ucy5ydWxlSWQgPSBvcmlnaW47CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvcHRpb25zLnNvdXJjZSA9IG9yaWdpbi5zbGljZSgwLCBpbmRleDIpOwogICAgICAgICAgICBvcHRpb25zLnJ1bGVJZCA9IG9yaWdpbi5zbGljZShpbmRleDIgKyAxKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFvcHRpb25zLnBsYWNlICYmIG9wdGlvbnMuYW5jZXN0b3JzICYmIG9wdGlvbnMuYW5jZXN0b3JzKSB7CiAgICAgICAgICBjb25zdCBwYXJlbnQgPSBvcHRpb25zLmFuY2VzdG9yc1tvcHRpb25zLmFuY2VzdG9ycy5sZW5ndGggLSAxXTsKICAgICAgICAgIGlmIChwYXJlbnQpIHsKICAgICAgICAgICAgb3B0aW9ucy5wbGFjZSA9IHBhcmVudC5wb3NpdGlvbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3Qgc3RhcnQgPSBvcHRpb25zLnBsYWNlICYmICJzdGFydCIgaW4gb3B0aW9ucy5wbGFjZSA/IG9wdGlvbnMucGxhY2Uuc3RhcnQgOiBvcHRpb25zLnBsYWNlOwogICAgICAgIHRoaXMuYW5jZXN0b3JzID0gb3B0aW9ucy5hbmNlc3RvcnMgfHwgdm9pZCAwOwogICAgICAgIHRoaXMuY2F1c2UgPSBvcHRpb25zLmNhdXNlIHx8IHZvaWQgMDsKICAgICAgICB0aGlzLmNvbHVtbiA9IHN0YXJ0ID8gc3RhcnQuY29sdW1uIDogdm9pZCAwOwogICAgICAgIHRoaXMuZmF0YWwgPSB2b2lkIDA7CiAgICAgICAgdGhpcy5maWxlID0gIiI7CiAgICAgICAgdGhpcy5tZXNzYWdlID0gcmVhc29uOwogICAgICAgIHRoaXMubGluZSA9IHN0YXJ0ID8gc3RhcnQubGluZSA6IHZvaWQgMDsKICAgICAgICB0aGlzLm5hbWUgPSBzdHJpbmdpZnlQb3NpdGlvbihvcHRpb25zLnBsYWNlKSB8fCAiMToxIjsKICAgICAgICB0aGlzLnBsYWNlID0gb3B0aW9ucy5wbGFjZSB8fCB2b2lkIDA7CiAgICAgICAgdGhpcy5yZWFzb24gPSB0aGlzLm1lc3NhZ2U7CiAgICAgICAgdGhpcy5ydWxlSWQgPSBvcHRpb25zLnJ1bGVJZCB8fCB2b2lkIDA7CiAgICAgICAgdGhpcy5zb3VyY2UgPSBvcHRpb25zLnNvdXJjZSB8fCB2b2lkIDA7CiAgICAgICAgdGhpcy5zdGFjayA9IGxlZ2FjeUNhdXNlICYmIG9wdGlvbnMuY2F1c2UgJiYgdHlwZW9mIG9wdGlvbnMuY2F1c2Uuc3RhY2sgPT09ICJzdHJpbmciID8gb3B0aW9ucy5jYXVzZS5zdGFjayA6ICIiOwogICAgICAgIHRoaXMuYWN0dWFsID0gdm9pZCAwOwogICAgICAgIHRoaXMuZXhwZWN0ZWQgPSB2b2lkIDA7CiAgICAgICAgdGhpcy5ub3RlID0gdm9pZCAwOwogICAgICAgIHRoaXMudXJsID0gdm9pZCAwOwogICAgICB9CiAgICB9OwogICAgVkZpbGVNZXNzYWdlLnByb3RvdHlwZS5maWxlID0gIiI7CiAgICBWRmlsZU1lc3NhZ2UucHJvdG90eXBlLm5hbWUgPSAiIjsKICAgIFZGaWxlTWVzc2FnZS5wcm90b3R5cGUucmVhc29uID0gIiI7CiAgICBWRmlsZU1lc3NhZ2UucHJvdG90eXBlLm1lc3NhZ2UgPSAiIjsKICAgIFZGaWxlTWVzc2FnZS5wcm90b3R5cGUuc3RhY2sgPSAiIjsKICAgIFZGaWxlTWVzc2FnZS5wcm90b3R5cGUuY29sdW1uID0gdm9pZCAwOwogICAgVkZpbGVNZXNzYWdlLnByb3RvdHlwZS5saW5lID0gdm9pZCAwOwogICAgVkZpbGVNZXNzYWdlLnByb3RvdHlwZS5hbmNlc3RvcnMgPSB2b2lkIDA7CiAgICBWRmlsZU1lc3NhZ2UucHJvdG90eXBlLmNhdXNlID0gdm9pZCAwOwogICAgVkZpbGVNZXNzYWdlLnByb3RvdHlwZS5mYXRhbCA9IHZvaWQgMDsKICAgIFZGaWxlTWVzc2FnZS5wcm90b3R5cGUucGxhY2UgPSB2b2lkIDA7CiAgICBWRmlsZU1lc3NhZ2UucHJvdG90eXBlLnJ1bGVJZCA9IHZvaWQgMDsKICAgIFZGaWxlTWVzc2FnZS5wcm90b3R5cGUuc291cmNlID0gdm9pZCAwOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdmZpbGUtbWVzc2FnZUA0LjAuMy9ub2RlX21vZHVsZXMvdmZpbGUtbWVzc2FnZS9pbmRleC5qcwp2YXIgaW5pdF92ZmlsZV9tZXNzYWdlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdmZpbGUtbWVzc2FnZUA0LjAuMy9ub2RlX21vZHVsZXMvdmZpbGUtbWVzc2FnZS9pbmRleC5qcyIoKSB7CiAgICBpbml0X2xpYjMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3ZmaWxlQDYuMC4zL25vZGVfbW9kdWxlcy92ZmlsZS9saWIvbWlucGF0aC5icm93c2VyLmpzCmZ1bmN0aW9uIGJhc2VuYW1lKHBhdGgyLCBleHRuYW1lMikgewogIGlmIChleHRuYW1lMiAhPT0gdm9pZCAwICYmIHR5cGVvZiBleHRuYW1lMiAhPT0gInN0cmluZyIpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJyJleHQiIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnKTsKICB9CiAgYXNzZXJ0UGF0aChwYXRoMik7CiAgbGV0IHN0YXJ0ID0gMDsKICBsZXQgZW5kMyA9IC0xOwogIGxldCBpbmRleDIgPSBwYXRoMi5sZW5ndGg7CiAgbGV0IHNlZW5Ob25TbGFzaDsKICBpZiAoZXh0bmFtZTIgPT09IHZvaWQgMCB8fCBleHRuYW1lMi5sZW5ndGggPT09IDAgfHwgZXh0bmFtZTIubGVuZ3RoID4gcGF0aDIubGVuZ3RoKSB7CiAgICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgICAgaWYgKHBhdGgyLmNvZGVQb2ludEF0KGluZGV4MikgPT09IDQ3KSB7CiAgICAgICAgaWYgKHNlZW5Ob25TbGFzaCkgewogICAgICAgICAgc3RhcnQgPSBpbmRleDIgKyAxOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGVuZDMgPCAwKSB7CiAgICAgICAgc2Vlbk5vblNsYXNoID0gdHJ1ZTsKICAgICAgICBlbmQzID0gaW5kZXgyICsgMTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGVuZDMgPCAwID8gIiIgOiBwYXRoMi5zbGljZShzdGFydCwgZW5kMyk7CiAgfQogIGlmIChleHRuYW1lMiA9PT0gcGF0aDIpIHsKICAgIHJldHVybiAiIjsKICB9CiAgbGV0IGZpcnN0Tm9uU2xhc2hFbmQgPSAtMTsKICBsZXQgZXh0bmFtZUluZGV4ID0gZXh0bmFtZTIubGVuZ3RoIC0gMTsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIGlmIChwYXRoMi5jb2RlUG9pbnRBdChpbmRleDIpID09PSA0NykgewogICAgICBpZiAoc2Vlbk5vblNsYXNoKSB7CiAgICAgICAgc3RhcnQgPSBpbmRleDIgKyAxOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAoZmlyc3ROb25TbGFzaEVuZCA8IDApIHsKICAgICAgICBzZWVuTm9uU2xhc2ggPSB0cnVlOwogICAgICAgIGZpcnN0Tm9uU2xhc2hFbmQgPSBpbmRleDIgKyAxOwogICAgICB9CiAgICAgIGlmIChleHRuYW1lSW5kZXggPiAtMSkgewogICAgICAgIGlmIChwYXRoMi5jb2RlUG9pbnRBdChpbmRleDIpID09PSBleHRuYW1lMi5jb2RlUG9pbnRBdChleHRuYW1lSW5kZXgtLSkpIHsKICAgICAgICAgIGlmIChleHRuYW1lSW5kZXggPCAwKSB7CiAgICAgICAgICAgIGVuZDMgPSBpbmRleDI7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGV4dG5hbWVJbmRleCA9IC0xOwogICAgICAgICAgZW5kMyA9IGZpcnN0Tm9uU2xhc2hFbmQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGlmIChzdGFydCA9PT0gZW5kMykgewogICAgZW5kMyA9IGZpcnN0Tm9uU2xhc2hFbmQ7CiAgfSBlbHNlIGlmIChlbmQzIDwgMCkgewogICAgZW5kMyA9IHBhdGgyLmxlbmd0aDsKICB9CiAgcmV0dXJuIHBhdGgyLnNsaWNlKHN0YXJ0LCBlbmQzKTsKfQpmdW5jdGlvbiBkaXJuYW1lKHBhdGgyKSB7CiAgYXNzZXJ0UGF0aChwYXRoMik7CiAgaWYgKHBhdGgyLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuICIuIjsKICB9CiAgbGV0IGVuZDMgPSAtMTsKICBsZXQgaW5kZXgyID0gcGF0aDIubGVuZ3RoOwogIGxldCB1bm1hdGNoZWRTbGFzaDsKICB3aGlsZSAoLS1pbmRleDIpIHsKICAgIGlmIChwYXRoMi5jb2RlUG9pbnRBdChpbmRleDIpID09PSA0NykgewogICAgICBpZiAodW5tYXRjaGVkU2xhc2gpIHsKICAgICAgICBlbmQzID0gaW5kZXgyOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9IGVsc2UgaWYgKCF1bm1hdGNoZWRTbGFzaCkgewogICAgICB1bm1hdGNoZWRTbGFzaCA9IHRydWU7CiAgICB9CiAgfQogIHJldHVybiBlbmQzIDwgMCA/IHBhdGgyLmNvZGVQb2ludEF0KDApID09PSA0NyA/ICIvIiA6ICIuIiA6IGVuZDMgPT09IDEgJiYgcGF0aDIuY29kZVBvaW50QXQoMCkgPT09IDQ3ID8gIi8vIiA6IHBhdGgyLnNsaWNlKDAsIGVuZDMpOwp9CmZ1bmN0aW9uIGV4dG5hbWUocGF0aDIpIHsKICBhc3NlcnRQYXRoKHBhdGgyKTsKICBsZXQgaW5kZXgyID0gcGF0aDIubGVuZ3RoOwogIGxldCBlbmQzID0gLTE7CiAgbGV0IHN0YXJ0UGFydCA9IDA7CiAgbGV0IHN0YXJ0RG90ID0gLTE7CiAgbGV0IHByZURvdFN0YXRlID0gMDsKICBsZXQgdW5tYXRjaGVkU2xhc2g7CiAgd2hpbGUgKGluZGV4Mi0tKSB7CiAgICBjb25zdCBjb2RlNCA9IHBhdGgyLmNvZGVQb2ludEF0KGluZGV4Mik7CiAgICBpZiAoY29kZTQgPT09IDQ3KSB7CiAgICAgIGlmICh1bm1hdGNoZWRTbGFzaCkgewogICAgICAgIHN0YXJ0UGFydCA9IGluZGV4MiArIDE7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAoZW5kMyA8IDApIHsKICAgICAgdW5tYXRjaGVkU2xhc2ggPSB0cnVlOwogICAgICBlbmQzID0gaW5kZXgyICsgMTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDYpIHsKICAgICAgaWYgKHN0YXJ0RG90IDwgMCkgewogICAgICAgIHN0YXJ0RG90ID0gaW5kZXgyOwogICAgICB9IGVsc2UgaWYgKHByZURvdFN0YXRlICE9PSAxKSB7CiAgICAgICAgcHJlRG90U3RhdGUgPSAxOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHN0YXJ0RG90ID4gLTEpIHsKICAgICAgcHJlRG90U3RhdGUgPSAtMTsKICAgIH0KICB9CiAgaWYgKHN0YXJ0RG90IDwgMCB8fCBlbmQzIDwgMCB8fCAvLyBXZSBzYXcgYSBub24tZG90IGNoYXJhY3RlciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGRvdC4KICBwcmVEb3RTdGF0ZSA9PT0gMCB8fCAvLyBUaGUgKHJpZ2h0LW1vc3QpIHRyaW1tZWQgcGF0aCBjb21wb25lbnQgaXMgZXhhY3RseSBgLi5gLgogIHByZURvdFN0YXRlID09PSAxICYmIHN0YXJ0RG90ID09PSBlbmQzIC0gMSAmJiBzdGFydERvdCA9PT0gc3RhcnRQYXJ0ICsgMSkgewogICAgcmV0dXJuICIiOwogIH0KICByZXR1cm4gcGF0aDIuc2xpY2Uoc3RhcnREb3QsIGVuZDMpOwp9CmZ1bmN0aW9uIGpvaW4oLi4uc2VnbWVudHMpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IGpvaW5lZDsKICB3aGlsZSAoKytpbmRleDIgPCBzZWdtZW50cy5sZW5ndGgpIHsKICAgIGFzc2VydFBhdGgoc2VnbWVudHNbaW5kZXgyXSk7CiAgICBpZiAoc2VnbWVudHNbaW5kZXgyXSkgewogICAgICBqb2luZWQgPSBqb2luZWQgPT09IHZvaWQgMCA/IHNlZ21lbnRzW2luZGV4Ml0gOiBqb2luZWQgKyAiLyIgKyBzZWdtZW50c1tpbmRleDJdOwogICAgfQogIH0KICByZXR1cm4gam9pbmVkID09PSB2b2lkIDAgPyAiLiIgOiBub3JtYWxpemUyKGpvaW5lZCk7Cn0KZnVuY3Rpb24gbm9ybWFsaXplMihwYXRoMikgewogIGFzc2VydFBhdGgocGF0aDIpOwogIGNvbnN0IGFic29sdXRlID0gcGF0aDIuY29kZVBvaW50QXQoMCkgPT09IDQ3OwogIGxldCB2YWx1ZTIgPSBub3JtYWxpemVTdHJpbmcocGF0aDIsICFhYnNvbHV0ZSk7CiAgaWYgKHZhbHVlMi5sZW5ndGggPT09IDAgJiYgIWFic29sdXRlKSB7CiAgICB2YWx1ZTIgPSAiLiI7CiAgfQogIGlmICh2YWx1ZTIubGVuZ3RoID4gMCAmJiBwYXRoMi5jb2RlUG9pbnRBdChwYXRoMi5sZW5ndGggLSAxKSA9PT0gNDcpIHsKICAgIHZhbHVlMiArPSAiLyI7CiAgfQogIHJldHVybiBhYnNvbHV0ZSA/ICIvIiArIHZhbHVlMiA6IHZhbHVlMjsKfQpmdW5jdGlvbiBub3JtYWxpemVTdHJpbmcocGF0aDIsIGFsbG93QWJvdmVSb290KSB7CiAgbGV0IHJlc3VsdCA9ICIiOwogIGxldCBsYXN0U2VnbWVudExlbmd0aCA9IDA7CiAgbGV0IGxhc3RTbGFzaCA9IC0xOwogIGxldCBkb3RzID0gMDsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IGNvZGU0OwogIGxldCBsYXN0U2xhc2hJbmRleDsKICB3aGlsZSAoKytpbmRleDIgPD0gcGF0aDIubGVuZ3RoKSB7CiAgICBpZiAoaW5kZXgyIDwgcGF0aDIubGVuZ3RoKSB7CiAgICAgIGNvZGU0ID0gcGF0aDIuY29kZVBvaW50QXQoaW5kZXgyKTsKICAgIH0gZWxzZSBpZiAoY29kZTQgPT09IDQ3KSB7CiAgICAgIGJyZWFrOwogICAgfSBlbHNlIHsKICAgICAgY29kZTQgPSA0NzsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDcpIHsKICAgICAgaWYgKGxhc3RTbGFzaCA9PT0gaW5kZXgyIC0gMSB8fCBkb3RzID09PSAxKSB7CiAgICAgIH0gZWxzZSBpZiAobGFzdFNsYXNoICE9PSBpbmRleDIgLSAxICYmIGRvdHMgPT09IDIpIHsKICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA8IDIgfHwgbGFzdFNlZ21lbnRMZW5ndGggIT09IDIgfHwgcmVzdWx0LmNvZGVQb2ludEF0KHJlc3VsdC5sZW5ndGggLSAxKSAhPT0gNDYgfHwgcmVzdWx0LmNvZGVQb2ludEF0KHJlc3VsdC5sZW5ndGggLSAyKSAhPT0gNDYpIHsKICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMikgewogICAgICAgICAgICBsYXN0U2xhc2hJbmRleCA9IHJlc3VsdC5sYXN0SW5kZXhPZigiLyIpOwogICAgICAgICAgICBpZiAobGFzdFNsYXNoSW5kZXggIT09IHJlc3VsdC5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgaWYgKGxhc3RTbGFzaEluZGV4IDwgMCkgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gIiI7CiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDA7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBsYXN0U2xhc2hJbmRleCk7CiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IHJlc3VsdC5sZW5ndGggLSAxIC0gcmVzdWx0Lmxhc3RJbmRleE9mKCIvIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGxhc3RTbGFzaCA9IGluZGV4MjsKICAgICAgICAgICAgICBkb3RzID0gMDsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQubGVuZ3RoID4gMCkgewogICAgICAgICAgICByZXN1bHQgPSAiIjsKICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwOwogICAgICAgICAgICBsYXN0U2xhc2ggPSBpbmRleDI7CiAgICAgICAgICAgIGRvdHMgPSAwOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGFsbG93QWJvdmVSb290KSB7CiAgICAgICAgICByZXN1bHQgPSByZXN1bHQubGVuZ3RoID4gMCA/IHJlc3VsdCArICIvLi4iIDogIi4uIjsKICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMjsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICByZXN1bHQgKz0gIi8iICsgcGF0aDIuc2xpY2UobGFzdFNsYXNoICsgMSwgaW5kZXgyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0ID0gcGF0aDIuc2xpY2UobGFzdFNsYXNoICsgMSwgaW5kZXgyKTsKICAgICAgICB9CiAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSBpbmRleDIgLSBsYXN0U2xhc2ggLSAxOwogICAgICB9CiAgICAgIGxhc3RTbGFzaCA9IGluZGV4MjsKICAgICAgZG90cyA9IDA7CiAgICB9IGVsc2UgaWYgKGNvZGU0ID09PSA0NiAmJiBkb3RzID4gLTEpIHsKICAgICAgZG90cysrOwogICAgfSBlbHNlIHsKICAgICAgZG90cyA9IC0xOwogICAgfQogIH0KICByZXR1cm4gcmVzdWx0Owp9CmZ1bmN0aW9uIGFzc2VydFBhdGgocGF0aDIpIHsKICBpZiAodHlwZW9mIHBhdGgyICE9PSAic3RyaW5nIikgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgIlBhdGggbXVzdCBiZSBhIHN0cmluZy4gUmVjZWl2ZWQgIiArIEpTT04uc3RyaW5naWZ5KHBhdGgyKQogICAgKTsKICB9Cn0KdmFyIG1pbnBhdGg7CnZhciBpbml0X21pbnBhdGhfYnJvd3NlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3ZmaWxlQDYuMC4zL25vZGVfbW9kdWxlcy92ZmlsZS9saWIvbWlucGF0aC5icm93c2VyLmpzIigpIHsKICAgIG1pbnBhdGggPSB7IGJhc2VuYW1lLCBkaXJuYW1lLCBleHRuYW1lLCBqb2luLCBzZXA6ICIvIiB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdmZpbGVANi4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlL2xpYi9taW5wcm9jLmJyb3dzZXIuanMKZnVuY3Rpb24gY3dkKCkgewogIHJldHVybiAiLyI7Cn0KdmFyIG1pbnByb2M7CnZhciBpbml0X21pbnByb2NfYnJvd3NlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3ZmaWxlQDYuMC4zL25vZGVfbW9kdWxlcy92ZmlsZS9saWIvbWlucHJvYy5icm93c2VyLmpzIigpIHsKICAgIG1pbnByb2MgPSB7IGN3ZCB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdmZpbGVANi4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlL2xpYi9taW51cmwuc2hhcmVkLmpzCmZ1bmN0aW9uIGlzVXJsKGZpbGVVcmxPclBhdGgpIHsKICByZXR1cm4gQm9vbGVhbigKICAgIGZpbGVVcmxPclBhdGggIT09IG51bGwgJiYgdHlwZW9mIGZpbGVVcmxPclBhdGggPT09ICJvYmplY3QiICYmICJocmVmIiBpbiBmaWxlVXJsT3JQYXRoICYmIGZpbGVVcmxPclBhdGguaHJlZiAmJiAicHJvdG9jb2wiIGluIGZpbGVVcmxPclBhdGggJiYgZmlsZVVybE9yUGF0aC5wcm90b2NvbCAmJiAvLyBAdHMtZXhwZWN0LWVycm9yOiBpbmRleGluZyBpcyBmaW5lLgogICAgZmlsZVVybE9yUGF0aC5hdXRoID09PSB2b2lkIDAKICApOwp9CnZhciBpbml0X21pbnVybF9zaGFyZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS92ZmlsZUA2LjAuMy9ub2RlX21vZHVsZXMvdmZpbGUvbGliL21pbnVybC5zaGFyZWQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdmZpbGVANi4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlL2xpYi9taW51cmwuYnJvd3Nlci5qcwpmdW5jdGlvbiB1cmxUb1BhdGgocGF0aDIpIHsKICBpZiAodHlwZW9mIHBhdGgyID09PSAic3RyaW5nIikgewogICAgcGF0aDIgPSBuZXcgVVJMKHBhdGgyKTsKICB9IGVsc2UgaWYgKCFpc1VybChwYXRoMikpIHsKICAgIGNvbnN0IGVycm9yID0gbmV3IFR5cGVFcnJvcigKICAgICAgJ1RoZSAicGF0aCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZyBvciBhbiBpbnN0YW5jZSBvZiBVUkwuIFJlY2VpdmVkIGAnICsgcGF0aDIgKyAiYCIKICAgICk7CiAgICBlcnJvci5jb2RlID0gIkVSUl9JTlZBTElEX0FSR19UWVBFIjsKICAgIHRocm93IGVycm9yOwogIH0KICBpZiAocGF0aDIucHJvdG9jb2wgIT09ICJmaWxlOiIpIHsKICAgIGNvbnN0IGVycm9yID0gbmV3IFR5cGVFcnJvcigiVGhlIFVSTCBtdXN0IGJlIG9mIHNjaGVtZSBmaWxlIik7CiAgICBlcnJvci5jb2RlID0gIkVSUl9JTlZBTElEX1VSTF9TQ0hFTUUiOwogICAgdGhyb3cgZXJyb3I7CiAgfQogIHJldHVybiBnZXRQYXRoRnJvbVVSTFBvc2l4KHBhdGgyKTsKfQpmdW5jdGlvbiBnZXRQYXRoRnJvbVVSTFBvc2l4KHVybCkgewogIGlmICh1cmwuaG9zdG5hbWUgIT09ICIiKSB7CiAgICBjb25zdCBlcnJvciA9IG5ldyBUeXBlRXJyb3IoCiAgICAgICdGaWxlIFVSTCBob3N0IG11c3QgYmUgImxvY2FsaG9zdCIgb3IgZW1wdHkgb24gZGFyd2luJwogICAgKTsKICAgIGVycm9yLmNvZGUgPSAiRVJSX0lOVkFMSURfRklMRV9VUkxfSE9TVCI7CiAgICB0aHJvdyBlcnJvcjsKICB9CiAgY29uc3QgcGF0aG5hbWUgPSB1cmwucGF0aG5hbWU7CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHBhdGhuYW1lLmxlbmd0aCkgewogICAgaWYgKHBhdGhuYW1lLmNvZGVQb2ludEF0KGluZGV4MikgPT09IDM3ICYmIHBhdGhuYW1lLmNvZGVQb2ludEF0KGluZGV4MiArIDEpID09PSA1MCkgewogICAgICBjb25zdCB0aGlyZCA9IHBhdGhuYW1lLmNvZGVQb2ludEF0KGluZGV4MiArIDIpOwogICAgICBpZiAodGhpcmQgPT09IDcwIHx8IHRoaXJkID09PSAxMDIpIHsKICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBUeXBlRXJyb3IoCiAgICAgICAgICAiRmlsZSBVUkwgcGF0aCBtdXN0IG5vdCBpbmNsdWRlIGVuY29kZWQgLyBjaGFyYWN0ZXJzIgogICAgICAgICk7CiAgICAgICAgZXJyb3IuY29kZSA9ICJFUlJfSU5WQUxJRF9GSUxFX1VSTF9QQVRIIjsKICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHBhdGhuYW1lKTsKfQp2YXIgaW5pdF9taW51cmxfYnJvd3NlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3ZmaWxlQDYuMC4zL25vZGVfbW9kdWxlcy92ZmlsZS9saWIvbWludXJsLmJyb3dzZXIuanMiKCkgewogICAgaW5pdF9taW51cmxfc2hhcmVkKCk7CiAgICBpbml0X21pbnVybF9zaGFyZWQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3ZmaWxlQDYuMC4zL25vZGVfbW9kdWxlcy92ZmlsZS9saWIvaW5kZXguanMKZnVuY3Rpb24gYXNzZXJ0UGFydChwYXJ0LCBuYW1lKSB7CiAgaWYgKHBhcnQgJiYgcGFydC5pbmNsdWRlcyhtaW5wYXRoLnNlcCkpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgImAiICsgbmFtZSArICJgIGNhbm5vdCBiZSBhIHBhdGg6IGRpZCBub3QgZXhwZWN0IGAiICsgbWlucGF0aC5zZXAgKyAiYCIKICAgICk7CiAgfQp9CmZ1bmN0aW9uIGFzc2VydE5vbkVtcHR5KHBhcnQsIG5hbWUpIHsKICBpZiAoIXBhcnQpIHsKICAgIHRocm93IG5ldyBFcnJvcigiYCIgKyBuYW1lICsgImAgY2Fubm90IGJlIGVtcHR5Iik7CiAgfQp9CmZ1bmN0aW9uIGFzc2VydFBhdGgyKHBhdGgyLCBuYW1lKSB7CiAgaWYgKCFwYXRoMikgewogICAgdGhyb3cgbmV3IEVycm9yKCJTZXR0aW5nIGAiICsgbmFtZSArICJgIHJlcXVpcmVzIGBwYXRoYCB0byBiZSBzZXQgdG9vIik7CiAgfQp9CmZ1bmN0aW9uIGlzVWludDhBcnJheTModmFsdWUyKSB7CiAgcmV0dXJuIEJvb2xlYW4oCiAgICB2YWx1ZTIgJiYgdHlwZW9mIHZhbHVlMiA9PT0gIm9iamVjdCIgJiYgImJ5dGVMZW5ndGgiIGluIHZhbHVlMiAmJiAiYnl0ZU9mZnNldCIgaW4gdmFsdWUyCiAgKTsKfQp2YXIgb3JkZXIsIFZGaWxlOwp2YXIgaW5pdF9saWI0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdmZpbGVANi4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlL2xpYi9pbmRleC5qcyIoKSB7CiAgICBpbml0X3ZmaWxlX21lc3NhZ2UoKTsKICAgIGluaXRfbWlucGF0aF9icm93c2VyKCk7CiAgICBpbml0X21pbnByb2NfYnJvd3NlcigpOwogICAgaW5pdF9taW51cmxfYnJvd3NlcigpOwogICAgb3JkZXIgPSAvKiogQHR5cGUge2NvbnN0fSAqLwogICAgWwogICAgICAiaGlzdG9yeSIsCiAgICAgICJwYXRoIiwKICAgICAgImJhc2VuYW1lIiwKICAgICAgInN0ZW0iLAogICAgICAiZXh0bmFtZSIsCiAgICAgICJkaXJuYW1lIgogICAgXTsKICAgIFZGaWxlID0gY2xhc3MgewogICAgICAvKioKICAgICAgICogQ3JlYXRlIGEgbmV3IHZpcnR1YWwgZmlsZS4KICAgICAgICoKICAgICAgICogYG9wdGlvbnNgIGlzIHRyZWF0ZWQgYXM6CiAgICAgICAqCiAgICAgICAqICogICBgc3RyaW5nYCBvciBgVWludDhBcnJheWAg4oCUIGB7dmFsdWU6IG9wdGlvbnN9YAogICAgICAgKiAqICAgYFVSTGAg4oCUIGB7cGF0aDogb3B0aW9uc31gCiAgICAgICAqICogICBgVkZpbGVgIOKAlCBzaGFsbG93IGNvcGllcyBpdHMgZGF0YSBvdmVyIHRvIHRoZSBuZXcgZmlsZQogICAgICAgKiAqICAgYG9iamVjdGAg4oCUIGFsbCBmaWVsZHMgYXJlIHNoYWxsb3cgY29waWVkIG92ZXIgdG8gdGhlIG5ldyBmaWxlCiAgICAgICAqCiAgICAgICAqIFBhdGggcmVsYXRlZCBmaWVsZHMgYXJlIHNldCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIChsZWFzdCBzcGVjaWZpYyB0bwogICAgICAgKiBtb3N0IHNwZWNpZmljKTogYGhpc3RvcnlgLCBgcGF0aGAsIGBiYXNlbmFtZWAsIGBzdGVtYCwgYGV4dG5hbWVgLAogICAgICAgKiBgZGlybmFtZWAuCiAgICAgICAqCiAgICAgICAqIFlvdSBjYW5ub3Qgc2V0IGBkaXJuYW1lYCBvciBgZXh0bmFtZWAgd2l0aG91dCBzZXR0aW5nIGVpdGhlciBgaGlzdG9yeWAsCiAgICAgICAqIGBwYXRoYCwgYGJhc2VuYW1lYCwgb3IgYHN0ZW1gIHRvby4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtDb21wYXRpYmxlIHwgbnVsbCB8IHVuZGVmaW5lZH0gW3ZhbHVlXQogICAgICAgKiAgIEZpbGUgdmFsdWUuCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqICAgTmV3IGluc3RhbmNlLgogICAgICAgKi8KICAgICAgY29uc3RydWN0b3IodmFsdWUyKSB7CiAgICAgICAgbGV0IG9wdGlvbnM7CiAgICAgICAgaWYgKCF2YWx1ZTIpIHsKICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICB9IGVsc2UgaWYgKGlzVXJsKHZhbHVlMikpIHsKICAgICAgICAgIG9wdGlvbnMgPSB7IHBhdGg6IHZhbHVlMiB9OwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlMiA9PT0gInN0cmluZyIgfHwgaXNVaW50OEFycmF5Myh2YWx1ZTIpKSB7CiAgICAgICAgICBvcHRpb25zID0geyB2YWx1ZTogdmFsdWUyIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG9wdGlvbnMgPSB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgIHRoaXMuY3dkID0gImN3ZCIgaW4gb3B0aW9ucyA/ICIiIDogbWlucHJvYy5jd2QoKTsKICAgICAgICB0aGlzLmRhdGEgPSB7fTsKICAgICAgICB0aGlzLmhpc3RvcnkgPSBbXTsKICAgICAgICB0aGlzLm1lc3NhZ2VzID0gW107CiAgICAgICAgdGhpcy52YWx1ZTsKICAgICAgICB0aGlzLm1hcDsKICAgICAgICB0aGlzLnJlc3VsdDsKICAgICAgICB0aGlzLnN0b3JlZDsKICAgICAgICBsZXQgaW5kZXgyID0gLTE7CiAgICAgICAgd2hpbGUgKCsraW5kZXgyIDwgb3JkZXIubGVuZ3RoKSB7CiAgICAgICAgICBjb25zdCBmaWVsZDIgPSBvcmRlcltpbmRleDJdOwogICAgICAgICAgaWYgKGZpZWxkMiBpbiBvcHRpb25zICYmIG9wdGlvbnNbZmllbGQyXSAhPT0gdm9pZCAwICYmIG9wdGlvbnNbZmllbGQyXSAhPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzW2ZpZWxkMl0gPSBmaWVsZDIgPT09ICJoaXN0b3J5IiA/IFsuLi5vcHRpb25zW2ZpZWxkMl1dIDogb3B0aW9uc1tmaWVsZDJdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgZmllbGQ7CiAgICAgICAgZm9yIChmaWVsZCBpbiBvcHRpb25zKSB7CiAgICAgICAgICBpZiAoIW9yZGVyLmluY2x1ZGVzKGZpZWxkKSkgewogICAgICAgICAgICB0aGlzW2ZpZWxkXSA9IG9wdGlvbnNbZmllbGRdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogR2V0IHRoZSBiYXNlbmFtZSAoaW5jbHVkaW5nIGV4dG5hbWUpIChleGFtcGxlOiBgJ2luZGV4Lm1pbi5qcydgKS4KICAgICAgICoKICAgICAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0KICAgICAgICogICBCYXNlbmFtZS4KICAgICAgICovCiAgICAgIGdldCBiYXNlbmFtZSgpIHsKICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMucGF0aCA9PT0gInN0cmluZyIgPyBtaW5wYXRoLmJhc2VuYW1lKHRoaXMucGF0aCkgOiB2b2lkIDA7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNldCBiYXNlbmFtZSAoaW5jbHVkaW5nIGV4dG5hbWUpIChgJ2luZGV4Lm1pbi5qcydgKS4KICAgICAgICoKICAgICAgICogQ2Fubm90IGNvbnRhaW4gcGF0aCBzZXBhcmF0b3JzIChgJy8nYCBvbiB1bml4LCBtYWNPUywgYW5kIGJyb3dzZXJzLCBgJ1wnYAogICAgICAgKiBvbiB3aW5kb3dzKS4KICAgICAgICogQ2Fubm90IGJlIG51bGxpZmllZCAodXNlIGBmaWxlLnBhdGggPSBmaWxlLmRpcm5hbWVgIGluc3RlYWQpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZW5hbWUKICAgICAgICogICBCYXNlbmFtZS4KICAgICAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgICAgICogICBOb3RoaW5nLgogICAgICAgKi8KICAgICAgc2V0IGJhc2VuYW1lKGJhc2VuYW1lMikgewogICAgICAgIGFzc2VydE5vbkVtcHR5KGJhc2VuYW1lMiwgImJhc2VuYW1lIik7CiAgICAgICAgYXNzZXJ0UGFydChiYXNlbmFtZTIsICJiYXNlbmFtZSIpOwogICAgICAgIHRoaXMucGF0aCA9IG1pbnBhdGguam9pbih0aGlzLmRpcm5hbWUgfHwgIiIsIGJhc2VuYW1lMik7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEdldCB0aGUgcGFyZW50IHBhdGggKGV4YW1wbGU6IGAnfidgKS4KICAgICAgICoKICAgICAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0KICAgICAgICogICBEaXJuYW1lLgogICAgICAgKi8KICAgICAgZ2V0IGRpcm5hbWUoKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLnBhdGggPT09ICJzdHJpbmciID8gbWlucGF0aC5kaXJuYW1lKHRoaXMucGF0aCkgOiB2b2lkIDA7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNldCB0aGUgcGFyZW50IHBhdGggKGV4YW1wbGU6IGAnfidgKS4KICAgICAgICoKICAgICAgICogQ2Fubm90IGJlIHNldCBpZiB0aGVyZeKAmXMgbm8gYHBhdGhgIHlldC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGRpcm5hbWUKICAgICAgICogICBEaXJuYW1lLgogICAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAgICAgKiAgIE5vdGhpbmcuCiAgICAgICAqLwogICAgICBzZXQgZGlybmFtZShkaXJuYW1lMikgewogICAgICAgIGFzc2VydFBhdGgyKHRoaXMuYmFzZW5hbWUsICJkaXJuYW1lIik7CiAgICAgICAgdGhpcy5wYXRoID0gbWlucGF0aC5qb2luKGRpcm5hbWUyIHx8ICIiLCB0aGlzLmJhc2VuYW1lKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogR2V0IHRoZSBleHRuYW1lIChpbmNsdWRpbmcgZG90KSAoZXhhbXBsZTogYCcuanMnYCkuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9CiAgICAgICAqICAgRXh0bmFtZS4KICAgICAgICovCiAgICAgIGdldCBleHRuYW1lKCkgewogICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5wYXRoID09PSAic3RyaW5nIiA/IG1pbnBhdGguZXh0bmFtZSh0aGlzLnBhdGgpIDogdm9pZCAwOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBTZXQgdGhlIGV4dG5hbWUgKGluY2x1ZGluZyBkb3QpIChleGFtcGxlOiBgJy5qcydgKS4KICAgICAgICoKICAgICAgICogQ2Fubm90IGNvbnRhaW4gcGF0aCBzZXBhcmF0b3JzIChgJy8nYCBvbiB1bml4LCBtYWNPUywgYW5kIGJyb3dzZXJzLCBgJ1wnYAogICAgICAgKiBvbiB3aW5kb3dzKS4KICAgICAgICogQ2Fubm90IGJlIHNldCBpZiB0aGVyZeKAmXMgbm8gYHBhdGhgIHlldC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGV4dG5hbWUKICAgICAgICogICBFeHRuYW1lLgogICAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAgICAgKiAgIE5vdGhpbmcuCiAgICAgICAqLwogICAgICBzZXQgZXh0bmFtZShleHRuYW1lMikgewogICAgICAgIGFzc2VydFBhcnQoZXh0bmFtZTIsICJleHRuYW1lIik7CiAgICAgICAgYXNzZXJ0UGF0aDIodGhpcy5kaXJuYW1lLCAiZXh0bmFtZSIpOwogICAgICAgIGlmIChleHRuYW1lMikgewogICAgICAgICAgaWYgKGV4dG5hbWUyLmNvZGVQb2ludEF0KDApICE9PSA0NikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImBleHRuYW1lYCBtdXN0IHN0YXJ0IHdpdGggYC5gIik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZXh0bmFtZTIuaW5jbHVkZXMoIi4iLCAxKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImBleHRuYW1lYCBjYW5ub3QgY29udGFpbiBtdWx0aXBsZSBkb3RzIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMucGF0aCA9IG1pbnBhdGguam9pbih0aGlzLmRpcm5hbWUsIHRoaXMuc3RlbSArIChleHRuYW1lMiB8fCAiIikpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBHZXQgdGhlIGZ1bGwgcGF0aCAoZXhhbXBsZTogYCd+L2luZGV4Lm1pbi5qcydgKS4KICAgICAgICoKICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICogICBQYXRoLgogICAgICAgKi8KICAgICAgZ2V0IHBhdGgoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaGlzdG9yeVt0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMV07CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNldCB0aGUgZnVsbCBwYXRoIChleGFtcGxlOiBgJ34vaW5kZXgubWluLmpzJ2ApLgogICAgICAgKgogICAgICAgKiBDYW5ub3QgYmUgbnVsbGlmaWVkLgogICAgICAgKiBZb3UgY2FuIHNldCBhIGZpbGUgVVJMIChhIGBVUkxgIG9iamVjdCB3aXRoIGEgYGZpbGU6YCBwcm90b2NvbCkgd2hpY2ggd2lsbAogICAgICAgKiBiZSB0dXJuZWQgaW50byBhIHBhdGggd2l0aCBgdXJsLmZpbGVVUkxUb1BhdGhgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge1VSTCB8IHN0cmluZ30gcGF0aAogICAgICAgKiAgIFBhdGguCiAgICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CiAgICAgICAqICAgTm90aGluZy4KICAgICAgICovCiAgICAgIHNldCBwYXRoKHBhdGgyKSB7CiAgICAgICAgaWYgKGlzVXJsKHBhdGgyKSkgewogICAgICAgICAgcGF0aDIgPSB1cmxUb1BhdGgocGF0aDIpOwogICAgICAgIH0KICAgICAgICBhc3NlcnROb25FbXB0eShwYXRoMiwgInBhdGgiKTsKICAgICAgICBpZiAodGhpcy5wYXRoICE9PSBwYXRoMikgewogICAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2gocGF0aDIpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogR2V0IHRoZSBzdGVtIChiYXNlbmFtZSB3L28gZXh0bmFtZSkgKGV4YW1wbGU6IGAnaW5kZXgubWluJ2ApLgogICAgICAgKgogICAgICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfQogICAgICAgKiAgIFN0ZW0uCiAgICAgICAqLwogICAgICBnZXQgc3RlbSgpIHsKICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMucGF0aCA9PT0gInN0cmluZyIgPyBtaW5wYXRoLmJhc2VuYW1lKHRoaXMucGF0aCwgdGhpcy5leHRuYW1lKSA6IHZvaWQgMDsKICAgICAgfQogICAgICAvKioKICAgICAgICogU2V0IHRoZSBzdGVtIChiYXNlbmFtZSB3L28gZXh0bmFtZSkgKGV4YW1wbGU6IGAnaW5kZXgubWluJ2ApLgogICAgICAgKgogICAgICAgKiBDYW5ub3QgY29udGFpbiBwYXRoIHNlcGFyYXRvcnMgKGAnLydgIG9uIHVuaXgsIG1hY09TLCBhbmQgYnJvd3NlcnMsIGAnXCdgCiAgICAgICAqIG9uIHdpbmRvd3MpLgogICAgICAgKiBDYW5ub3QgYmUgbnVsbGlmaWVkICh1c2UgYGZpbGUucGF0aCA9IGZpbGUuZGlybmFtZWAgaW5zdGVhZCkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdGVtCiAgICAgICAqICAgU3RlbS4KICAgICAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgICAgICogICBOb3RoaW5nLgogICAgICAgKi8KICAgICAgc2V0IHN0ZW0oc3RlbSkgewogICAgICAgIGFzc2VydE5vbkVtcHR5KHN0ZW0sICJzdGVtIik7CiAgICAgICAgYXNzZXJ0UGFydChzdGVtLCAic3RlbSIpOwogICAgICAgIHRoaXMucGF0aCA9IG1pbnBhdGguam9pbih0aGlzLmRpcm5hbWUgfHwgIiIsIHN0ZW0gKyAodGhpcy5leHRuYW1lIHx8ICIiKSk7CiAgICAgIH0KICAgICAgLy8gTm9ybWFsIHByb3RvdHlwYWwgbWV0aG9kcy4KICAgICAgLyoqCiAgICAgICAqIENyZWF0ZSBhIGZhdGFsIG1lc3NhZ2UgZm9yIGByZWFzb25gIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZS4KICAgICAgICoKICAgICAgICogVGhlIGBmYXRhbGAgZmllbGQgb2YgdGhlIG1lc3NhZ2UgaXMgc2V0IHRvIGB0cnVlYCAoZXJyb3I7IGZpbGUgbm90IHVzYWJsZSkKICAgICAgICogYW5kIHRoZSBgZmlsZWAgZmllbGQgaXMgc2V0IHRvIHRoZSBjdXJyZW50IGZpbGUgcGF0aC4KICAgICAgICogVGhlIG1lc3NhZ2UgaXMgYWRkZWQgdG8gdGhlIGBtZXNzYWdlc2AgZmllbGQgb24gYGZpbGVgLgogICAgICAgKgogICAgICAgKiA+IPCfqqYgKipOb3RlKio6IGFsc28gaGFzIG9ic29sZXRlIHNpZ25hdHVyZXMuCiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICAgICAqIEBwYXJhbSB7TWVzc2FnZU9wdGlvbnMgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0aW9uc10KICAgICAgICogQHJldHVybnMge25ldmVyfQogICAgICAgKgogICAgICAgKiBAb3ZlcmxvYWQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAgICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IHBhcmVudAogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zIHtuZXZlcn0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgICAgICogQHBhcmFtIHtQb2ludCB8IFBvc2l0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZH0gcGxhY2UKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAgICAgKiBAcmV0dXJucyB7bmV2ZXJ9CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogQHJldHVybnMge25ldmVyfQogICAgICAgKgogICAgICAgKiBAb3ZlcmxvYWQKICAgICAgICogQHBhcmFtIHtFcnJvciB8IFZGaWxlTWVzc2FnZX0gY2F1c2UKICAgICAgICogQHBhcmFtIHtOb2RlIHwgTm9kZUxpa2UgfCBudWxsIHwgdW5kZWZpbmVkfSBwYXJlbnQKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAgICAgKiBAcmV0dXJucyB7bmV2ZXJ9CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAgICAgKiBAcGFyYW0ge1BvaW50IHwgUG9zaXRpb24gfCBudWxsIHwgdW5kZWZpbmVkfSBwbGFjZQogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zIHtuZXZlcn0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7RXJyb3IgfCBWRmlsZU1lc3NhZ2V9IGNhdXNlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogQHJldHVybnMge25ldmVyfQogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlIHwgc3RyaW5nfSBjYXVzZU9yUmVhc29uCiAgICAgICAqICAgUmVhc29uIGZvciBtZXNzYWdlLCBzaG91bGQgdXNlIG1hcmtkb3duLgogICAgICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IE1lc3NhZ2VPcHRpb25zIHwgUG9pbnQgfCBQb3NpdGlvbiB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcHRpb25zT3JQYXJlbnRPclBsYWNlXQogICAgICAgKiAgIENvbmZpZ3VyYXRpb24gKG9wdGlvbmFsKS4KICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAgICAgKiAgIFBsYWNlIGluIGNvZGUgd2hlcmUgdGhlIG1lc3NhZ2Ugb3JpZ2luYXRlcyAoZXhhbXBsZToKICAgICAgICogICBgJ215LXBhY2thZ2U6bXktcnVsZSdgIG9yIGAnbXktcnVsZSdgKS4KICAgICAgICogQHJldHVybnMge25ldmVyfQogICAgICAgKiAgIE5ldmVyLgogICAgICAgKiBAdGhyb3dzIHtWRmlsZU1lc3NhZ2V9CiAgICAgICAqICAgTWVzc2FnZS4KICAgICAgICovCiAgICAgIGZhaWwoY2F1c2VPclJlYXNvbiwgb3B0aW9uc09yUGFyZW50T3JQbGFjZSwgb3JpZ2luKSB7CiAgICAgICAgY29uc3QgbWVzc2FnZTIgPSB0aGlzLm1lc3NhZ2UoY2F1c2VPclJlYXNvbiwgb3B0aW9uc09yUGFyZW50T3JQbGFjZSwgb3JpZ2luKTsKICAgICAgICBtZXNzYWdlMi5mYXRhbCA9IHRydWU7CiAgICAgICAgdGhyb3cgbWVzc2FnZTI7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENyZWF0ZSBhbiBpbmZvIG1lc3NhZ2UgZm9yIGByZWFzb25gIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZS4KICAgICAgICoKICAgICAgICogVGhlIGBmYXRhbGAgZmllbGQgb2YgdGhlIG1lc3NhZ2UgaXMgc2V0IHRvIGB1bmRlZmluZWRgIChpbmZvOyBjaGFuZ2UKICAgICAgICogbGlrZWx5IG5vdCBuZWVkZWQpIGFuZCB0aGUgYGZpbGVgIGZpZWxkIGlzIHNldCB0byB0aGUgY3VycmVudCBmaWxlIHBhdGguCiAgICAgICAqIFRoZSBtZXNzYWdlIGlzIGFkZGVkIHRvIHRoZSBgbWVzc2FnZXNgIGZpZWxkIG9uIGBmaWxlYC4KICAgICAgICoKICAgICAgICogPiDwn6qmICoqTm90ZSoqOiBhbHNvIGhhcyBvYnNvbGV0ZSBzaWduYXR1cmVzLgogICAgICAgKgogICAgICAgKiBAb3ZlcmxvYWQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAgICAgKiBAcGFyYW0ge01lc3NhZ2VPcHRpb25zIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29wdGlvbnNdCiAgICAgICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICAgICAqIEBwYXJhbSB7Tm9kZSB8IE5vZGVMaWtlIHwgbnVsbCB8IHVuZGVmaW5lZH0gcGFyZW50CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgICAgICogQHBhcmFtIHtQb2ludCB8IFBvc2l0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZH0gcGxhY2UKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAgICAgKiBAcmV0dXJucyB7VkZpbGVNZXNzYWdlfQogICAgICAgKgogICAgICAgKiBAb3ZlcmxvYWQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAgICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IHBhcmVudAogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAgICAgKiBAcGFyYW0ge1BvaW50IHwgUG9zaXRpb24gfCBudWxsIHwgdW5kZWZpbmVkfSBwbGFjZQogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7RXJyb3IgfCBWRmlsZU1lc3NhZ2UgfCBzdHJpbmd9IGNhdXNlT3JSZWFzb24KICAgICAgICogICBSZWFzb24gZm9yIG1lc3NhZ2UsIHNob3VsZCB1c2UgbWFya2Rvd24uCiAgICAgICAqIEBwYXJhbSB7Tm9kZSB8IE5vZGVMaWtlIHwgTWVzc2FnZU9wdGlvbnMgfCBQb2ludCB8IFBvc2l0aW9uIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29wdGlvbnNPclBhcmVudE9yUGxhY2VdCiAgICAgICAqICAgQ29uZmlndXJhdGlvbiAob3B0aW9uYWwpLgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqICAgUGxhY2UgaW4gY29kZSB3aGVyZSB0aGUgbWVzc2FnZSBvcmlnaW5hdGVzIChleGFtcGxlOgogICAgICAgKiAgIGAnbXktcGFja2FnZTpteS1ydWxlJ2Agb3IgYCdteS1ydWxlJ2ApLgogICAgICAgKiBAcmV0dXJucyB7VkZpbGVNZXNzYWdlfQogICAgICAgKiAgIE1lc3NhZ2UuCiAgICAgICAqLwogICAgICBpbmZvKGNhdXNlT3JSZWFzb24sIG9wdGlvbnNPclBhcmVudE9yUGxhY2UsIG9yaWdpbikgewogICAgICAgIGNvbnN0IG1lc3NhZ2UyID0gdGhpcy5tZXNzYWdlKGNhdXNlT3JSZWFzb24sIG9wdGlvbnNPclBhcmVudE9yUGxhY2UsIG9yaWdpbik7CiAgICAgICAgbWVzc2FnZTIuZmF0YWwgPSB2b2lkIDA7CiAgICAgICAgcmV0dXJuIG1lc3NhZ2UyOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDcmVhdGUgYSBtZXNzYWdlIGZvciBgcmVhc29uYCBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUuCiAgICAgICAqCiAgICAgICAqIFRoZSBgZmF0YWxgIGZpZWxkIG9mIHRoZSBtZXNzYWdlIGlzIHNldCB0byBgZmFsc2VgICh3YXJuaW5nOyBjaGFuZ2UgbWF5IGJlCiAgICAgICAqIG5lZWRlZCkgYW5kIHRoZSBgZmlsZWAgZmllbGQgaXMgc2V0IHRvIHRoZSBjdXJyZW50IGZpbGUgcGF0aC4KICAgICAgICogVGhlIG1lc3NhZ2UgaXMgYWRkZWQgdG8gdGhlIGBtZXNzYWdlc2AgZmllbGQgb24gYGZpbGVgLgogICAgICAgKgogICAgICAgKiA+IPCfqqYgKipOb3RlKio6IGFsc28gaGFzIG9ic29sZXRlIHNpZ25hdHVyZXMuCiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICAgICAqIEBwYXJhbSB7TWVzc2FnZU9wdGlvbnMgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0aW9uc10KICAgICAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgICAgICogQHBhcmFtIHtOb2RlIHwgTm9kZUxpa2UgfCBudWxsIHwgdW5kZWZpbmVkfSBwYXJlbnQKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAgICAgKiBAcmV0dXJucyB7VkZpbGVNZXNzYWdlfQogICAgICAgKgogICAgICAgKiBAb3ZlcmxvYWQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAgICAgKiBAcGFyYW0ge1BvaW50IHwgUG9zaXRpb24gfCBudWxsIHwgdW5kZWZpbmVkfSBwbGFjZQogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7RXJyb3IgfCBWRmlsZU1lc3NhZ2V9IGNhdXNlCiAgICAgICAqIEBwYXJhbSB7Tm9kZSB8IE5vZGVMaWtlIHwgbnVsbCB8IHVuZGVmaW5lZH0gcGFyZW50CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7RXJyb3IgfCBWRmlsZU1lc3NhZ2V9IGNhdXNlCiAgICAgICAqIEBwYXJhbSB7UG9pbnQgfCBQb3NpdGlvbiB8IG51bGwgfCB1bmRlZmluZWR9IHBsYWNlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7RXJyb3IgfCBWRmlsZU1lc3NhZ2V9IGNhdXNlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFcnJvciB8IFZGaWxlTWVzc2FnZSB8IHN0cmluZ30gY2F1c2VPclJlYXNvbgogICAgICAgKiAgIFJlYXNvbiBmb3IgbWVzc2FnZSwgc2hvdWxkIHVzZSBtYXJrZG93bi4KICAgICAgICogQHBhcmFtIHtOb2RlIHwgTm9kZUxpa2UgfCBNZXNzYWdlT3B0aW9ucyB8IFBvaW50IHwgUG9zaXRpb24gfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0aW9uc09yUGFyZW50T3JQbGFjZV0KICAgICAgICogICBDb25maWd1cmF0aW9uIChvcHRpb25hbCkuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogICBQbGFjZSBpbiBjb2RlIHdoZXJlIHRoZSBtZXNzYWdlIG9yaWdpbmF0ZXMgKGV4YW1wbGU6CiAgICAgICAqICAgYCdteS1wYWNrYWdlOm15LXJ1bGUnYCBvciBgJ215LXJ1bGUnYCkuCiAgICAgICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICAgICAqICAgTWVzc2FnZS4KICAgICAgICovCiAgICAgIG1lc3NhZ2UoY2F1c2VPclJlYXNvbiwgb3B0aW9uc09yUGFyZW50T3JQbGFjZSwgb3JpZ2luKSB7CiAgICAgICAgY29uc3QgbWVzc2FnZTIgPSBuZXcgVkZpbGVNZXNzYWdlKAogICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogdGhlIG92ZXJsb2FkcyBhcmUgZmluZS4KICAgICAgICAgIGNhdXNlT3JSZWFzb24sCiAgICAgICAgICBvcHRpb25zT3JQYXJlbnRPclBsYWNlLAogICAgICAgICAgb3JpZ2luCiAgICAgICAgKTsKICAgICAgICBpZiAodGhpcy5wYXRoKSB7CiAgICAgICAgICBtZXNzYWdlMi5uYW1lID0gdGhpcy5wYXRoICsgIjoiICsgbWVzc2FnZTIubmFtZTsKICAgICAgICAgIG1lc3NhZ2UyLmZpbGUgPSB0aGlzLnBhdGg7CiAgICAgICAgfQogICAgICAgIG1lc3NhZ2UyLmZhdGFsID0gZmFsc2U7CiAgICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKG1lc3NhZ2UyKTsKICAgICAgICByZXR1cm4gbWVzc2FnZTI7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNlcmlhbGl6ZSB0aGUgZmlsZS4KICAgICAgICoKICAgICAgICogPiAqKk5vdGUqKjogd2hpY2ggZW5jb2RpbmdzIGFyZSBzdXBwb3J0ZWQgZGVwZW5kcyBvbiB0aGUgZW5naW5lLgogICAgICAgKiA+IEZvciBpbmZvIG9uIE5vZGUuanMsIHNlZToKICAgICAgICogPiA8aHR0cHM6Ly9ub2RlanMub3JnL2FwaS91dGlsLmh0bWwjd2hhdHdnLXN1cHBvcnRlZC1lbmNvZGluZ3M+LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtlbmNvZGluZz0ndXRmOCddCiAgICAgICAqICAgQ2hhcmFjdGVyIGVuY29kaW5nIHRvIHVuZGVyc3RhbmQgYHZhbHVlYCBhcyB3aGVuIGl04oCZcyBhIGBVaW50OEFycmF5YAogICAgICAgKiAgIChkZWZhdWx0OiBgJ3V0Zi04J2ApLgogICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfQogICAgICAgKiAgIFNlcmlhbGl6ZWQgZmlsZS4KICAgICAgICovCiAgICAgIHRvU3RyaW5nKGVuY29kaW5nKSB7CiAgICAgICAgaWYgKHRoaXMudmFsdWUgPT09IHZvaWQgMCkgewogICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIHRoaXMudmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZGVjb2RlcjIgPSBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmcgfHwgdm9pZCAwKTsKICAgICAgICByZXR1cm4gZGVjb2RlcjIuZGVjb2RlKHRoaXMudmFsdWUpOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdmZpbGVANi4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlL2luZGV4LmpzCnZhciBpbml0X3ZmaWxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdmZpbGVANi4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliNCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdW5pZmllZEAxMS4wLjUvbm9kZV9tb2R1bGVzL3VuaWZpZWQvbGliL2NhbGxhYmxlLWluc3RhbmNlLmpzCnZhciBDYWxsYWJsZUluc3RhbmNlOwp2YXIgaW5pdF9jYWxsYWJsZV9pbnN0YW5jZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3VuaWZpZWRAMTEuMC41L25vZGVfbW9kdWxlcy91bmlmaWVkL2xpYi9jYWxsYWJsZS1pbnN0YW5jZS5qcyIoKSB7CiAgICBDYWxsYWJsZUluc3RhbmNlID0gLyoqCiAgICAgKiBAdHlwZSB7bmV3IDxQYXJhbWV0ZXJzIGV4dGVuZHMgQXJyYXk8dW5rbm93bj4sIFJlc3VsdD4ocHJvcGVydHk6IHN0cmluZyB8IHN5bWJvbCkgPT4gKC4uLnBhcmFtZXRlcnM6IFBhcmFtZXRlcnMpID0+IFJlc3VsdH0KICAgICAqLwogICAgLyoqIEB0eXBlIHt1bmtub3dufSAqLwogICAgLyoqCiAgICAgKiBAdGhpcyB7RnVuY3Rpb259CiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IHN5bWJvbH0gcHJvcGVydHkKICAgICAqIEByZXR1cm5zIHsoLi4ucGFyYW1ldGVyczogQXJyYXk8dW5rbm93bj4pID0+IHVua25vd259CiAgICAgKi8KICAgIChmdW5jdGlvbihwcm9wZXJ0eTkpIHsKICAgICAgY29uc3Qgc2VsZjIgPSB0aGlzOwogICAgICBjb25zdCBjb25zdHIgPSBzZWxmMi5jb25zdHJ1Y3RvcjsKICAgICAgY29uc3QgcHJvdG8gPSAoCiAgICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBGdW5jdGlvbj59ICovCiAgICAgICAgLy8gUHJvdG90eXBlcyBkbyBleGlzdC4KICAgICAgICAvLyB0eXBlLWNvdmVyYWdlOmlnbm9yZS1uZXh0LWxpbmUKICAgICAgICBjb25zdHIucHJvdG90eXBlCiAgICAgICk7CiAgICAgIGNvbnN0IHZhbHVlMiA9IHByb3RvW3Byb3BlcnR5OV07CiAgICAgIGNvbnN0IGFwcGx5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMi5hcHBseShhcHBseSwgYXJndW1lbnRzKTsKICAgICAgfTsKICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGFwcGx5LCBwcm90byk7CiAgICAgIHJldHVybiBhcHBseTsKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdW5pZmllZEAxMS4wLjUvbm9kZV9tb2R1bGVzL3VuaWZpZWQvbGliL2luZGV4LmpzCmZ1bmN0aW9uIGFzc2VydFBhcnNlcihuYW1lLCB2YWx1ZTIpIHsKICBpZiAodHlwZW9mIHZhbHVlMiAhPT0gImZ1bmN0aW9uIikgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGAiICsgbmFtZSArICJgIHdpdGhvdXQgYHBhcnNlcmAiKTsKICB9Cn0KZnVuY3Rpb24gYXNzZXJ0Q29tcGlsZXIobmFtZSwgdmFsdWUyKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZTIgIT09ICJmdW5jdGlvbiIpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBgIiArIG5hbWUgKyAiYCB3aXRob3V0IGBjb21waWxlcmAiKTsKICB9Cn0KZnVuY3Rpb24gYXNzZXJ0VW5mcm96ZW4obmFtZSwgZnJvemVuKSB7CiAgaWYgKGZyb3plbikgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAiQ2Fubm90IGNhbGwgYCIgKyBuYW1lICsgImAgb24gYSBmcm96ZW4gcHJvY2Vzc29yLlxuQ3JlYXRlIGEgbmV3IHByb2Nlc3NvciBmaXJzdCwgYnkgY2FsbGluZyBpdDogdXNlIGBwcm9jZXNzb3IoKWAgaW5zdGVhZCBvZiBgcHJvY2Vzc29yYC4iCiAgICApOwogIH0KfQpmdW5jdGlvbiBhc3NlcnROb2RlKG5vZGUyKSB7CiAgaWYgKCFpc1BsYWluT2JqZWN0KG5vZGUyKSB8fCB0eXBlb2Ygbm9kZTIudHlwZSAhPT0gInN0cmluZyIpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIG5vZGUsIGdvdCBgIiArIG5vZGUyICsgImAiKTsKICB9Cn0KZnVuY3Rpb24gYXNzZXJ0RG9uZShuYW1lLCBhc3luY05hbWUsIGNvbXBsZXRlKSB7CiAgaWYgKCFjb21wbGV0ZSkgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAiYCIgKyBuYW1lICsgImAgZmluaXNoZWQgYXN5bmMuIFVzZSBgIiArIGFzeW5jTmFtZSArICJgIGluc3RlYWQiCiAgICApOwogIH0KfQpmdW5jdGlvbiB2ZmlsZSh2YWx1ZTIpIHsKICByZXR1cm4gbG9va3NMaWtlQVZGaWxlKHZhbHVlMikgPyB2YWx1ZTIgOiBuZXcgVkZpbGUodmFsdWUyKTsKfQpmdW5jdGlvbiBsb29rc0xpa2VBVkZpbGUodmFsdWUyKSB7CiAgcmV0dXJuIEJvb2xlYW4oCiAgICB2YWx1ZTIgJiYgdHlwZW9mIHZhbHVlMiA9PT0gIm9iamVjdCIgJiYgIm1lc3NhZ2UiIGluIHZhbHVlMiAmJiAibWVzc2FnZXMiIGluIHZhbHVlMgogICk7Cn0KZnVuY3Rpb24gbG9va3NMaWtlQVZhbHVlKHZhbHVlMikgewogIHJldHVybiB0eXBlb2YgdmFsdWUyID09PSAic3RyaW5nIiB8fCBpc1VpbnQ4QXJyYXk0KHZhbHVlMik7Cn0KZnVuY3Rpb24gaXNVaW50OEFycmF5NCh2YWx1ZTIpIHsKICByZXR1cm4gQm9vbGVhbigKICAgIHZhbHVlMiAmJiB0eXBlb2YgdmFsdWUyID09PSAib2JqZWN0IiAmJiAiYnl0ZUxlbmd0aCIgaW4gdmFsdWUyICYmICJieXRlT2Zmc2V0IiBpbiB2YWx1ZTIKICApOwp9CnZhciBpbXBvcnRfZXh0ZW5kLCBvd24sIFByb2Nlc3NvciwgdW5pZmllZDsKdmFyIGluaXRfbGliNSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3VuaWZpZWRAMTEuMC41L25vZGVfbW9kdWxlcy91bmlmaWVkL2xpYi9pbmRleC5qcyIoKSB7CiAgICBpbml0X2JhaWwoKTsKICAgIGltcG9ydF9leHRlbmQgPSBfX3RvRVNNKHJlcXVpcmVfZXh0ZW5kKCksIDEpOwogICAgaW5pdF9kZWZhdWx0KCk7CiAgICBpbml0X2lzX3BsYWluX29iaigpOwogICAgaW5pdF90cm91Z2goKTsKICAgIGluaXRfdmZpbGUoKTsKICAgIGluaXRfY2FsbGFibGVfaW5zdGFuY2UoKTsKICAgIG93biA9IHt9Lmhhc093blByb3BlcnR5OwogICAgUHJvY2Vzc29yID0gY2xhc3MgX1Byb2Nlc3NvciBleHRlbmRzIENhbGxhYmxlSW5zdGFuY2UgewogICAgICAvKioKICAgICAgICogQ3JlYXRlIGEgcHJvY2Vzc29yLgogICAgICAgKi8KICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoImNvcHkiKTsKICAgICAgICB0aGlzLkNvbXBpbGVyID0gdm9pZCAwOwogICAgICAgIHRoaXMuUGFyc2VyID0gdm9pZCAwOwogICAgICAgIHRoaXMuYXR0YWNoZXJzID0gW107CiAgICAgICAgdGhpcy5jb21waWxlciA9IHZvaWQgMDsKICAgICAgICB0aGlzLmZyZWV6ZUluZGV4ID0gLTE7CiAgICAgICAgdGhpcy5mcm96ZW4gPSB2b2lkIDA7CiAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSB7fTsKICAgICAgICB0aGlzLnBhcnNlciA9IHZvaWQgMDsKICAgICAgICB0aGlzLnRyYW5zZm9ybWVycyA9IHRyb3VnaCgpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDb3B5IGEgcHJvY2Vzc29yLgogICAgICAgKgogICAgICAgKiBAZGVwcmVjYXRlZAogICAgICAgKiAgIFRoaXMgaXMgYSBwcml2YXRlIGludGVybmFsIG1ldGhvZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLgogICAgICAgKiBAcmV0dXJucyB7UHJvY2Vzc29yPFBhcnNlVHJlZSwgSGVhZFRyZWUsIFRhaWxUcmVlLCBDb21waWxlVHJlZSwgQ29tcGlsZVJlc3VsdD59CiAgICAgICAqICAgTmV3ICp1bmZyb3plbiogcHJvY2Vzc29yICh7QGxpbmtjb2RlIFByb2Nlc3Nvcn0pIHRoYXQgaXMKICAgICAgICogICBjb25maWd1cmVkIHRvIHdvcmsgdGhlIHNhbWUgYXMgaXRzIGFuY2VzdG9yLgogICAgICAgKiAgIFdoZW4gdGhlIGRlc2NlbmRhbnQgcHJvY2Vzc29yIGlzIGNvbmZpZ3VyZWQgaW4gdGhlIGZ1dHVyZSBpdCBkb2VzIG5vdAogICAgICAgKiAgIGFmZmVjdCB0aGUgYW5jZXN0cmFsIHByb2Nlc3Nvci4KICAgICAgICovCiAgICAgIGNvcHkoKSB7CiAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSAoCiAgICAgICAgICAvKiogQHR5cGUge1Byb2Nlc3NvcjxQYXJzZVRyZWUsIEhlYWRUcmVlLCBUYWlsVHJlZSwgQ29tcGlsZVRyZWUsIENvbXBpbGVSZXN1bHQ+fSAqLwogICAgICAgICAgbmV3IF9Qcm9jZXNzb3IoKQogICAgICAgICk7CiAgICAgICAgbGV0IGluZGV4MiA9IC0xOwogICAgICAgIHdoaWxlICgrK2luZGV4MiA8IHRoaXMuYXR0YWNoZXJzLmxlbmd0aCkgewogICAgICAgICAgY29uc3QgYXR0YWNoZXIgPSB0aGlzLmF0dGFjaGVyc1tpbmRleDJdOwogICAgICAgICAgZGVzdGluYXRpb24udXNlKC4uLmF0dGFjaGVyKTsKICAgICAgICB9CiAgICAgICAgZGVzdGluYXRpb24uZGF0YSgoMCwgaW1wb3J0X2V4dGVuZC5kZWZhdWx0KSh0cnVlLCB7fSwgdGhpcy5uYW1lc3BhY2UpKTsKICAgICAgICByZXR1cm4gZGVzdGluYXRpb247CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENvbmZpZ3VyZSB0aGUgcHJvY2Vzc29yIHdpdGggaW5mbyBhdmFpbGFibGUgdG8gYWxsIHBsdWdpbnMuCiAgICAgICAqIEluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBhbiBvYmplY3QuCiAgICAgICAqCiAgICAgICAqIFR5cGljYWxseSwgb3B0aW9ucyBjYW4gYmUgZ2l2ZW4gdG8gYSBzcGVjaWZpYyBwbHVnaW4sIGJ1dCBzb21ldGltZXMgaXQKICAgICAgICogbWFrZXMgc2Vuc2UgdG8gaGF2ZSBpbmZvcm1hdGlvbiBzaGFyZWQgd2l0aCBzZXZlcmFsIHBsdWdpbnMuCiAgICAgICAqIEZvciBleGFtcGxlLCBhIGxpc3Qgb2YgSFRNTCBlbGVtZW50cyB0aGF0IGFyZSBzZWxmLWNsb3NpbmcsIHdoaWNoIGlzCiAgICAgICAqIG5lZWRlZCBkdXJpbmcgYWxsIHBoYXNlcy4KICAgICAgICoKICAgICAgICogPiAqKk5vdGUqKjogc2V0dGluZyBpbmZvcm1hdGlvbiBjYW5ub3Qgb2NjdXIgb24gKmZyb3plbiogcHJvY2Vzc29ycy4KICAgICAgICogPiBDYWxsIHRoZSBwcm9jZXNzb3IgZmlyc3QgdG8gY3JlYXRlIGEgbmV3IHVuZnJvemVuIHByb2Nlc3Nvci4KICAgICAgICoKICAgICAgICogPiAqKk5vdGUqKjogdG8gcmVnaXN0ZXIgY3VzdG9tIGRhdGEgaW4gVHlwZVNjcmlwdCwgYXVnbWVudCB0aGUKICAgICAgICogPiB7QGxpbmtjb2RlIERhdGF9IGludGVyZmFjZS4KICAgICAgICoKICAgICAgICogQGV4YW1wbGUKICAgICAgICogICBUaGlzIGV4YW1wbGUgc2hvdyBob3cgdG8gZ2V0IGFuZCBzZXQgaW5mbzoKICAgICAgICoKICAgICAgICogICBgYGBqcwogICAgICAgKiAgIGltcG9ydCB7dW5pZmllZH0gZnJvbSAndW5pZmllZCcKICAgICAgICoKICAgICAgICogICBjb25zdCBwcm9jZXNzb3IgPSB1bmlmaWVkKCkuZGF0YSgnYWxwaGEnLCAnYnJhdm8nKQogICAgICAgKgogICAgICAgKiAgIHByb2Nlc3Nvci5kYXRhKCdhbHBoYScpIC8vID0+ICdicmF2bycKICAgICAgICoKICAgICAgICogICBwcm9jZXNzb3IuZGF0YSgpIC8vID0+IHthbHBoYTogJ2JyYXZvJ30KICAgICAgICoKICAgICAgICogICBwcm9jZXNzb3IuZGF0YSh7Y2hhcmxpZTogJ2RlbHRhJ30pCiAgICAgICAqCiAgICAgICAqICAgcHJvY2Vzc29yLmRhdGEoKSAvLyA9PiB7Y2hhcmxpZTogJ2RlbHRhJ30KICAgICAgICogICBgYGAKICAgICAgICoKICAgICAgICogQHRlbXBsYXRlIHtrZXlvZiBEYXRhfSBLZXkKICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEByZXR1cm5zIHtEYXRhfQogICAgICAgKgogICAgICAgKiBAb3ZlcmxvYWQKICAgICAgICogQHBhcmFtIHtEYXRhfSBkYXRhc2V0CiAgICAgICAqIEByZXR1cm5zIHtQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0Pn0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7S2V5fSBrZXkKICAgICAgICogQHJldHVybnMge0RhdGFbS2V5XX0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7S2V5fSBrZXkKICAgICAgICogQHBhcmFtIHtEYXRhW0tleV19IHZhbHVlCiAgICAgICAqIEByZXR1cm5zIHtQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0Pn0KICAgICAgICoKICAgICAgICogQHBhcmFtIHtEYXRhIHwgS2V5fSBba2V5XQogICAgICAgKiAgIEtleSB0byBnZXQgb3Igc2V0LCBvciBlbnRpcmUgZGF0YXNldCB0byBzZXQsIG9yIG5vdGhpbmcgdG8gZ2V0IHRoZQogICAgICAgKiAgIGVudGlyZSBkYXRhc2V0IChvcHRpb25hbCkuCiAgICAgICAqIEBwYXJhbSB7RGF0YVtLZXldfSBbdmFsdWVdCiAgICAgICAqICAgVmFsdWUgdG8gc2V0IChvcHRpb25hbCkuCiAgICAgICAqIEByZXR1cm5zIHt1bmtub3dufQogICAgICAgKiAgIFRoZSBjdXJyZW50IHByb2Nlc3NvciB3aGVuIHNldHRpbmcsIHRoZSB2YWx1ZSBhdCBga2V5YCB3aGVuIGdldHRpbmcsIG9yCiAgICAgICAqICAgdGhlIGVudGlyZSBkYXRhc2V0IHdoZW4gZ2V0dGluZyB3aXRob3V0IGtleS4KICAgICAgICovCiAgICAgIGRhdGEoa2V5MiwgdmFsdWUyKSB7CiAgICAgICAgaWYgKHR5cGVvZiBrZXkyID09PSAic3RyaW5nIikgewogICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgICAgICAgICAgYXNzZXJ0VW5mcm96ZW4oImRhdGEiLCB0aGlzLmZyb3plbik7CiAgICAgICAgICAgIHRoaXMubmFtZXNwYWNlW2tleTJdID0gdmFsdWUyOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBvd24uY2FsbCh0aGlzLm5hbWVzcGFjZSwga2V5MikgJiYgdGhpcy5uYW1lc3BhY2Vba2V5Ml0gfHwgdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAoa2V5MikgewogICAgICAgICAgYXNzZXJ0VW5mcm96ZW4oImRhdGEiLCB0aGlzLmZyb3plbik7CiAgICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IGtleTI7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBGcmVlemUgYSBwcm9jZXNzb3IuCiAgICAgICAqCiAgICAgICAqIEZyb3plbiBwcm9jZXNzb3JzIGFyZSBtZWFudCB0byBiZSBleHRlbmRlZCBhbmQgbm90IHRvIGJlIGNvbmZpZ3VyZWQKICAgICAgICogZGlyZWN0bHkuCiAgICAgICAqCiAgICAgICAqIFdoZW4gYSBwcm9jZXNzb3IgaXMgZnJvemVuIGl0IGNhbm5vdCBiZSB1bmZyb3plbi4KICAgICAgICogTmV3IHByb2Nlc3NvcnMgd29ya2luZyB0aGUgc2FtZSB3YXkgY2FuIGJlIGNyZWF0ZWQgYnkgY2FsbGluZyB0aGUKICAgICAgICogcHJvY2Vzc29yLgogICAgICAgKgogICAgICAgKiBJdOKAmXMgcG9zc2libGUgdG8gZnJlZXplIHByb2Nlc3NvcnMgZXhwbGljaXRseSBieSBjYWxsaW5nIGAuZnJlZXplKClgLgogICAgICAgKiBQcm9jZXNzb3JzIGZyZWV6ZSBhdXRvbWF0aWNhbGx5IHdoZW4gYC5wYXJzZSgpYCwgYC5ydW4oKWAsIGAucnVuU3luYygpYCwKICAgICAgICogYC5zdHJpbmdpZnkoKWAsIGAucHJvY2VzcygpYCwgb3IgYC5wcm9jZXNzU3luYygpYCBhcmUgY2FsbGVkLgogICAgICAgKgogICAgICAgKiBAcmV0dXJucyB7UHJvY2Vzc29yPFBhcnNlVHJlZSwgSGVhZFRyZWUsIFRhaWxUcmVlLCBDb21waWxlVHJlZSwgQ29tcGlsZVJlc3VsdD59CiAgICAgICAqICAgVGhlIGN1cnJlbnQgcHJvY2Vzc29yLgogICAgICAgKi8KICAgICAgZnJlZXplKCkgewogICAgICAgIGlmICh0aGlzLmZyb3plbikgewogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHNlbGYyID0gKAogICAgICAgICAgLyoqIEB0eXBlIHtQcm9jZXNzb3J9ICovCiAgICAgICAgICAvKiogQHR5cGUge3Vua25vd259ICovCiAgICAgICAgICB0aGlzCiAgICAgICAgKTsKICAgICAgICB3aGlsZSAoKyt0aGlzLmZyZWV6ZUluZGV4IDwgdGhpcy5hdHRhY2hlcnMubGVuZ3RoKSB7CiAgICAgICAgICBjb25zdCBbYXR0YWNoZXIsIC4uLm9wdGlvbnNdID0gdGhpcy5hdHRhY2hlcnNbdGhpcy5mcmVlemVJbmRleF07CiAgICAgICAgICBpZiAob3B0aW9uc1swXSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAob3B0aW9uc1swXSA9PT0gdHJ1ZSkgewogICAgICAgICAgICBvcHRpb25zWzBdID0gdm9pZCAwOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSBhdHRhY2hlci5jYWxsKHNlbGYyLCAuLi5vcHRpb25zKTsKICAgICAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtZXIgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lcnMudXNlKHRyYW5zZm9ybWVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5mcm96ZW4gPSB0cnVlOwogICAgICAgIHRoaXMuZnJlZXplSW5kZXggPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFBhcnNlIHRleHQgdG8gYSBzeW50YXggdHJlZS4KICAgICAgICoKICAgICAgICogPiAqKk5vdGUqKjogYHBhcnNlYCBmcmVlemVzIHRoZSBwcm9jZXNzb3IgaWYgbm90IGFscmVhZHkgKmZyb3plbiouCiAgICAgICAqCiAgICAgICAqID4gKipOb3RlKio6IGBwYXJzZWAgcGVyZm9ybXMgdGhlIHBhcnNlIHBoYXNlLCBub3QgdGhlIHJ1biBwaGFzZSBvciBvdGhlcgogICAgICAgKiA+IHBoYXNlcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtDb21wYXRpYmxlIHwgdW5kZWZpbmVkfSBbZmlsZV0KICAgICAgICogICBmaWxlIHRvIHBhcnNlIChvcHRpb25hbCk7IHR5cGljYWxseSBgc3RyaW5nYCBvciBgVkZpbGVgOyBhbnkgdmFsdWUKICAgICAgICogICBhY2NlcHRlZCBhcyBgeGAgaW4gYG5ldyBWRmlsZSh4KWAuCiAgICAgICAqIEByZXR1cm5zIHtQYXJzZVRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogUGFyc2VUcmVlfQogICAgICAgKiAgIFN5bnRheCB0cmVlIHJlcHJlc2VudGluZyBgZmlsZWAuCiAgICAgICAqLwogICAgICBwYXJzZShmaWxlKSB7CiAgICAgICAgdGhpcy5mcmVlemUoKTsKICAgICAgICBjb25zdCByZWFsRmlsZSA9IHZmaWxlKGZpbGUpOwogICAgICAgIGNvbnN0IHBhcnNlciA9IHRoaXMucGFyc2VyIHx8IHRoaXMuUGFyc2VyOwogICAgICAgIGFzc2VydFBhcnNlcigicGFyc2UiLCBwYXJzZXIpOwogICAgICAgIHJldHVybiBwYXJzZXIoU3RyaW5nKHJlYWxGaWxlKSwgcmVhbEZpbGUpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBQcm9jZXNzIHRoZSBnaXZlbiBmaWxlIGFzIGNvbmZpZ3VyZWQgb24gdGhlIHByb2Nlc3Nvci4KICAgICAgICoKICAgICAgICogPiAqKk5vdGUqKjogYHByb2Nlc3NgIGZyZWV6ZXMgdGhlIHByb2Nlc3NvciBpZiBub3QgYWxyZWFkeSAqZnJvemVuKi4KICAgICAgICoKICAgICAgICogPiAqKk5vdGUqKjogYHByb2Nlc3NgIHBlcmZvcm1zIHRoZSBwYXJzZSwgcnVuLCBhbmQgc3RyaW5naWZ5IHBoYXNlcy4KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7Q29tcGF0aWJsZSB8IHVuZGVmaW5lZH0gZmlsZQogICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NDYWxsYmFjazxWRmlsZVdpdGhPdXRwdXQ8Q29tcGlsZVJlc3VsdD4+fSBkb25lCiAgICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxWRmlsZVdpdGhPdXRwdXQ8Q29tcGlsZVJlc3VsdD4+fQogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAgICAgKiAgIEZpbGUgKG9wdGlvbmFsKTsgdHlwaWNhbGx5IGBzdHJpbmdgIG9yIGBWRmlsZWBdOyBhbnkgdmFsdWUgYWNjZXB0ZWQgYXMKICAgICAgICogICBgeGAgaW4gYG5ldyBWRmlsZSh4KWAuCiAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc0NhbGxiYWNrPFZGaWxlV2l0aE91dHB1dDxDb21waWxlUmVzdWx0Pj4gfCB1bmRlZmluZWR9IFtkb25lXQogICAgICAgKiAgIENhbGxiYWNrIChvcHRpb25hbCkuCiAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFZGaWxlPiB8IHVuZGVmaW5lZH0KICAgICAgICogICBOb3RoaW5nIGlmIGBkb25lYCBpcyBnaXZlbi4KICAgICAgICogICBPdGhlcndpc2UgYSBwcm9taXNlLCByZWplY3RlZCB3aXRoIGEgZmF0YWwgZXJyb3Igb3IgcmVzb2x2ZWQgd2l0aCB0aGUKICAgICAgICogICBwcm9jZXNzZWQgZmlsZS4KICAgICAgICoKICAgICAgICogICBUaGUgcGFyc2VkLCB0cmFuc2Zvcm1lZCwgYW5kIGNvbXBpbGVkIHZhbHVlIGlzIGF2YWlsYWJsZSBhdAogICAgICAgKiAgIGBmaWxlLnZhbHVlYCAoc2VlIG5vdGUpLgogICAgICAgKgogICAgICAgKiAgID4gKipOb3RlKio6IHVuaWZpZWQgdHlwaWNhbGx5IGNvbXBpbGVzIGJ5IHNlcmlhbGl6aW5nOiBtb3N0CiAgICAgICAqICAgPiBjb21waWxlcnMgcmV0dXJuIGBzdHJpbmdgIChvciBgVWludDhBcnJheWApLgogICAgICAgKiAgID4gU29tZSBjb21waWxlcnMsIHN1Y2ggYXMgdGhlIG9uZSBjb25maWd1cmVkIHdpdGgKICAgICAgICogICA+IFtgcmVoeXBlLXJlYWN0YF1bcmVoeXBlLXJlYWN0XSwgcmV0dXJuIG90aGVyIHZhbHVlcyAoaW4gdGhpcyBjYXNlLCBhCiAgICAgICAqICAgPiBSZWFjdCB0cmVlKS4KICAgICAgICogICA+IElmIHlvdeKAmXJlIHVzaW5nIGEgY29tcGlsZXIgdGhhdCBkb2VzbuKAmXQgc2VyaWFsaXplLCBleHBlY3QgZGlmZmVyZW50CiAgICAgICAqICAgPiByZXN1bHQgdmFsdWVzLgogICAgICAgKiAgID4KICAgICAgICogICA+IFRvIHJlZ2lzdGVyIGN1c3RvbSByZXN1bHRzIGluIFR5cGVTY3JpcHQsIGFkZCB0aGVtIHRvCiAgICAgICAqICAgPiB7QGxpbmtjb2RlIENvbXBpbGVSZXN1bHRNYXB9LgogICAgICAgKgogICAgICAgKiAgIFtyZWh5cGUtcmVhY3RdOiBodHRwczovL2dpdGh1Yi5jb20vcmVoeXBlanMvcmVoeXBlLXJlYWN0CiAgICAgICAqLwogICAgICBwcm9jZXNzKGZpbGUsIGRvbmUpIHsKICAgICAgICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgICAgICAgdGhpcy5mcmVlemUoKTsKICAgICAgICBhc3NlcnRQYXJzZXIoInByb2Nlc3MiLCB0aGlzLnBhcnNlciB8fCB0aGlzLlBhcnNlcik7CiAgICAgICAgYXNzZXJ0Q29tcGlsZXIoInByb2Nlc3MiLCB0aGlzLmNvbXBpbGVyIHx8IHRoaXMuQ29tcGlsZXIpOwogICAgICAgIHJldHVybiBkb25lID8gZXhlY3V0b3Iodm9pZCAwLCBkb25lKSA6IG5ldyBQcm9taXNlKGV4ZWN1dG9yKTsKICAgICAgICBmdW5jdGlvbiBleGVjdXRvcihyZXNvbHZlMiwgcmVqZWN0KSB7CiAgICAgICAgICBjb25zdCByZWFsRmlsZSA9IHZmaWxlKGZpbGUpOwogICAgICAgICAgY29uc3QgcGFyc2VUcmVlID0gKAogICAgICAgICAgICAvKiogQHR5cGUge0hlYWRUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IEhlYWRUcmVlfSAqLwogICAgICAgICAgICAvKiogQHR5cGUge3Vua25vd259ICovCiAgICAgICAgICAgIHNlbGYyLnBhcnNlKHJlYWxGaWxlKQogICAgICAgICAgKTsKICAgICAgICAgIHNlbGYyLnJ1bihwYXJzZVRyZWUsIHJlYWxGaWxlLCBmdW5jdGlvbihlcnJvciwgdHJlZSwgZmlsZTIpIHsKICAgICAgICAgICAgaWYgKGVycm9yIHx8ICF0cmVlIHx8ICFmaWxlMikgewogICAgICAgICAgICAgIHJldHVybiByZWFsRG9uZShlcnJvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgY29tcGlsZVRyZWUgPSAoCiAgICAgICAgICAgICAgLyoqIEB0eXBlIHtDb21waWxlVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBDb21waWxlVHJlZX0gKi8KICAgICAgICAgICAgICAvKiogQHR5cGUge3Vua25vd259ICovCiAgICAgICAgICAgICAgdHJlZQogICAgICAgICAgICApOwogICAgICAgICAgICBjb25zdCBjb21waWxlUmVzdWx0ID0gc2VsZjIuc3RyaW5naWZ5KGNvbXBpbGVUcmVlLCBmaWxlMik7CiAgICAgICAgICAgIGlmIChsb29rc0xpa2VBVmFsdWUoY29tcGlsZVJlc3VsdCkpIHsKICAgICAgICAgICAgICBmaWxlMi52YWx1ZSA9IGNvbXBpbGVSZXN1bHQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZmlsZTIucmVzdWx0ID0gY29tcGlsZVJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZWFsRG9uZSgKICAgICAgICAgICAgICBlcnJvciwKICAgICAgICAgICAgICAvKiogQHR5cGUge1ZGaWxlV2l0aE91dHB1dDxDb21waWxlUmVzdWx0Pn0gKi8KICAgICAgICAgICAgICBmaWxlMgogICAgICAgICAgICApOwogICAgICAgICAgfSk7CiAgICAgICAgICBmdW5jdGlvbiByZWFsRG9uZShlcnJvciwgZmlsZTIpIHsKICAgICAgICAgICAgaWYgKGVycm9yIHx8ICFmaWxlMikgewogICAgICAgICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZTIpIHsKICAgICAgICAgICAgICByZXNvbHZlMihmaWxlMik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgb2soZG9uZSwgImBkb25lYCBpcyBkZWZpbmVkIGlmIGByZXNvbHZlYCBpcyBub3QiKTsKICAgICAgICAgICAgICBkb25lKHZvaWQgMCwgZmlsZTIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBQcm9jZXNzIHRoZSBnaXZlbiBmaWxlIGFzIGNvbmZpZ3VyZWQgb24gdGhlIHByb2Nlc3Nvci4KICAgICAgICoKICAgICAgICogQW4gZXJyb3IgaXMgdGhyb3duIGlmIGFzeW5jaHJvbm91cyB0cmFuc2Zvcm1zIGFyZSBjb25maWd1cmVkLgogICAgICAgKgogICAgICAgKiA+ICoqTm90ZSoqOiBgcHJvY2Vzc1N5bmNgIGZyZWV6ZXMgdGhlIHByb2Nlc3NvciBpZiBub3QgYWxyZWFkeSAqZnJvemVuKi4KICAgICAgICoKICAgICAgICogPiAqKk5vdGUqKjogYHByb2Nlc3NTeW5jYCBwZXJmb3JtcyB0aGUgcGFyc2UsIHJ1biwgYW5kIHN0cmluZ2lmeSBwaGFzZXMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Q29tcGF0aWJsZSB8IHVuZGVmaW5lZH0gW2ZpbGVdCiAgICAgICAqICAgRmlsZSAob3B0aW9uYWwpOyB0eXBpY2FsbHkgYHN0cmluZ2Agb3IgYFZGaWxlYDsgYW55IHZhbHVlIGFjY2VwdGVkIGFzCiAgICAgICAqICAgYHhgIGluIGBuZXcgVkZpbGUoeClgLgogICAgICAgKiBAcmV0dXJucyB7VkZpbGVXaXRoT3V0cHV0PENvbXBpbGVSZXN1bHQ+fQogICAgICAgKiAgIFRoZSBwcm9jZXNzZWQgZmlsZS4KICAgICAgICoKICAgICAgICogICBUaGUgcGFyc2VkLCB0cmFuc2Zvcm1lZCwgYW5kIGNvbXBpbGVkIHZhbHVlIGlzIGF2YWlsYWJsZSBhdAogICAgICAgKiAgIGBmaWxlLnZhbHVlYCAoc2VlIG5vdGUpLgogICAgICAgKgogICAgICAgKiAgID4gKipOb3RlKio6IHVuaWZpZWQgdHlwaWNhbGx5IGNvbXBpbGVzIGJ5IHNlcmlhbGl6aW5nOiBtb3N0CiAgICAgICAqICAgPiBjb21waWxlcnMgcmV0dXJuIGBzdHJpbmdgIChvciBgVWludDhBcnJheWApLgogICAgICAgKiAgID4gU29tZSBjb21waWxlcnMsIHN1Y2ggYXMgdGhlIG9uZSBjb25maWd1cmVkIHdpdGgKICAgICAgICogICA+IFtgcmVoeXBlLXJlYWN0YF1bcmVoeXBlLXJlYWN0XSwgcmV0dXJuIG90aGVyIHZhbHVlcyAoaW4gdGhpcyBjYXNlLCBhCiAgICAgICAqICAgPiBSZWFjdCB0cmVlKS4KICAgICAgICogICA+IElmIHlvdeKAmXJlIHVzaW5nIGEgY29tcGlsZXIgdGhhdCBkb2VzbuKAmXQgc2VyaWFsaXplLCBleHBlY3QgZGlmZmVyZW50CiAgICAgICAqICAgPiByZXN1bHQgdmFsdWVzLgogICAgICAgKiAgID4KICAgICAgICogICA+IFRvIHJlZ2lzdGVyIGN1c3RvbSByZXN1bHRzIGluIFR5cGVTY3JpcHQsIGFkZCB0aGVtIHRvCiAgICAgICAqICAgPiB7QGxpbmtjb2RlIENvbXBpbGVSZXN1bHRNYXB9LgogICAgICAgKgogICAgICAgKiAgIFtyZWh5cGUtcmVhY3RdOiBodHRwczovL2dpdGh1Yi5jb20vcmVoeXBlanMvcmVoeXBlLXJlYWN0CiAgICAgICAqLwogICAgICBwcm9jZXNzU3luYyhmaWxlKSB7CiAgICAgICAgbGV0IGNvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICB0aGlzLmZyZWV6ZSgpOwogICAgICAgIGFzc2VydFBhcnNlcigicHJvY2Vzc1N5bmMiLCB0aGlzLnBhcnNlciB8fCB0aGlzLlBhcnNlcik7CiAgICAgICAgYXNzZXJ0Q29tcGlsZXIoInByb2Nlc3NTeW5jIiwgdGhpcy5jb21waWxlciB8fCB0aGlzLkNvbXBpbGVyKTsKICAgICAgICB0aGlzLnByb2Nlc3MoZmlsZSwgcmVhbERvbmUpOwogICAgICAgIGFzc2VydERvbmUoInByb2Nlc3NTeW5jIiwgInByb2Nlc3MiLCBjb21wbGV0ZSk7CiAgICAgICAgb2socmVzdWx0LCAid2UgZWl0aGVyIGJhaWxlZCBvbiBhbiBlcnJvciBvciBoYXZlIGEgdHJlZSIpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgZnVuY3Rpb24gcmVhbERvbmUoZXJyb3IsIGZpbGUyKSB7CiAgICAgICAgICBjb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICBiYWlsKGVycm9yKTsKICAgICAgICAgIHJlc3VsdCA9IGZpbGUyOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogUnVuICp0cmFuc2Zvcm1lcnMqIG9uIGEgc3ludGF4IHRyZWUuCiAgICAgICAqCiAgICAgICAqID4gKipOb3RlKio6IGBydW5gIGZyZWV6ZXMgdGhlIHByb2Nlc3NvciBpZiBub3QgYWxyZWFkeSAqZnJvemVuKi4KICAgICAgICoKICAgICAgICogPiAqKk5vdGUqKjogYHJ1bmAgcGVyZm9ybXMgdGhlIHJ1biBwaGFzZSwgbm90IG90aGVyIHBoYXNlcy4KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7SGVhZFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogSGVhZFRyZWV9IHRyZWUKICAgICAgICogQHBhcmFtIHtSdW5DYWxsYmFjazxUYWlsVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBUYWlsVHJlZT59IGRvbmUKICAgICAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7SGVhZFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogSGVhZFRyZWV9IHRyZWUKICAgICAgICogQHBhcmFtIHtDb21wYXRpYmxlIHwgdW5kZWZpbmVkfSBmaWxlCiAgICAgICAqIEBwYXJhbSB7UnVuQ2FsbGJhY2s8VGFpbFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogVGFpbFRyZWU+fSBkb25lCiAgICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge0hlYWRUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IEhlYWRUcmVlfSB0cmVlCiAgICAgICAqIEBwYXJhbSB7Q29tcGF0aWJsZSB8IHVuZGVmaW5lZH0gW2ZpbGVdCiAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFRhaWxUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IFRhaWxUcmVlPn0KICAgICAgICoKICAgICAgICogQHBhcmFtIHtIZWFkVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBIZWFkVHJlZX0gdHJlZQogICAgICAgKiAgIFRyZWUgdG8gdHJhbnNmb3JtIGFuZCBpbnNwZWN0LgogICAgICAgKiBAcGFyYW0geygKICAgICAgICogICBSdW5DYWxsYmFjazxUYWlsVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBUYWlsVHJlZT4gfAogICAgICAgKiAgIENvbXBhdGlibGUKICAgICAgICogKX0gW2ZpbGVdCiAgICAgICAqICAgRmlsZSBhc3NvY2lhdGVkIHdpdGggYG5vZGVgIChvcHRpb25hbCk7IGFueSB2YWx1ZSBhY2NlcHRlZCBhcyBgeGAgaW4KICAgICAgICogICBgbmV3IFZGaWxlKHgpYC4KICAgICAgICogQHBhcmFtIHtSdW5DYWxsYmFjazxUYWlsVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBUYWlsVHJlZT59IFtkb25lXQogICAgICAgKiAgIENhbGxiYWNrIChvcHRpb25hbCkuCiAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFRhaWxUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IFRhaWxUcmVlPiB8IHVuZGVmaW5lZH0KICAgICAgICogICBOb3RoaW5nIGlmIGBkb25lYCBpcyBnaXZlbi4KICAgICAgICogICBPdGhlcndpc2UsIGEgcHJvbWlzZSByZWplY3RlZCB3aXRoIGEgZmF0YWwgZXJyb3Igb3IgcmVzb2x2ZWQgd2l0aCB0aGUKICAgICAgICogICB0cmFuc2Zvcm1lZCB0cmVlLgogICAgICAgKi8KICAgICAgcnVuKHRyZWUsIGZpbGUsIGRvbmUpIHsKICAgICAgICBhc3NlcnROb2RlKHRyZWUpOwogICAgICAgIHRoaXMuZnJlZXplKCk7CiAgICAgICAgY29uc3QgdHJhbnNmb3JtZXJzID0gdGhpcy50cmFuc2Zvcm1lcnM7CiAgICAgICAgaWYgKCFkb25lICYmIHR5cGVvZiBmaWxlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICBkb25lID0gZmlsZTsKICAgICAgICAgIGZpbGUgPSB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkb25lID8gZXhlY3V0b3Iodm9pZCAwLCBkb25lKSA6IG5ldyBQcm9taXNlKGV4ZWN1dG9yKTsKICAgICAgICBmdW5jdGlvbiBleGVjdXRvcihyZXNvbHZlMiwgcmVqZWN0KSB7CiAgICAgICAgICBvaygKICAgICAgICAgICAgdHlwZW9mIGZpbGUgIT09ICJmdW5jdGlvbiIsCiAgICAgICAgICAgICJgZmlsZWAgY2FuXHUyMDE5dCBiZSBhIGBkb25lYCBhbnltb3JlLCB3ZSBjaGVja2VkIgogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IHJlYWxGaWxlID0gdmZpbGUoZmlsZSk7CiAgICAgICAgICB0cmFuc2Zvcm1lcnMucnVuKHRyZWUsIHJlYWxGaWxlLCByZWFsRG9uZSk7CiAgICAgICAgICBmdW5jdGlvbiByZWFsRG9uZShlcnJvciwgb3V0cHV0VHJlZSwgZmlsZTIpIHsKICAgICAgICAgICAgY29uc3QgcmVzdWx0aW5nVHJlZSA9ICgKICAgICAgICAgICAgICAvKiogQHR5cGUge1RhaWxUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IFRhaWxUcmVlfSAqLwogICAgICAgICAgICAgIG91dHB1dFRyZWUgfHwgdHJlZQogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmUyKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZTIocmVzdWx0aW5nVHJlZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgb2soZG9uZSwgImBkb25lYCBpcyBkZWZpbmVkIGlmIGByZXNvbHZlYCBpcyBub3QiKTsKICAgICAgICAgICAgICBkb25lKHZvaWQgMCwgcmVzdWx0aW5nVHJlZSwgZmlsZTIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSdW4gKnRyYW5zZm9ybWVycyogb24gYSBzeW50YXggdHJlZS4KICAgICAgICoKICAgICAgICogQW4gZXJyb3IgaXMgdGhyb3duIGlmIGFzeW5jaHJvbm91cyB0cmFuc2Zvcm1zIGFyZSBjb25maWd1cmVkLgogICAgICAgKgogICAgICAgKiA+ICoqTm90ZSoqOiBgcnVuU3luY2AgZnJlZXplcyB0aGUgcHJvY2Vzc29yIGlmIG5vdCBhbHJlYWR5ICpmcm96ZW4qLgogICAgICAgKgogICAgICAgKiA+ICoqTm90ZSoqOiBgcnVuU3luY2AgcGVyZm9ybXMgdGhlIHJ1biBwaGFzZSwgbm90IG90aGVyIHBoYXNlcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtIZWFkVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBIZWFkVHJlZX0gdHJlZQogICAgICAgKiAgIFRyZWUgdG8gdHJhbnNmb3JtIGFuZCBpbnNwZWN0LgogICAgICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAgICAgKiAgIEZpbGUgYXNzb2NpYXRlZCB3aXRoIGBub2RlYCAob3B0aW9uYWwpOyBhbnkgdmFsdWUgYWNjZXB0ZWQgYXMgYHhgIGluCiAgICAgICAqICAgYG5ldyBWRmlsZSh4KWAuCiAgICAgICAqIEByZXR1cm5zIHtUYWlsVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBUYWlsVHJlZX0KICAgICAgICogICBUcmFuc2Zvcm1lZCB0cmVlLgogICAgICAgKi8KICAgICAgcnVuU3luYyh0cmVlLCBmaWxlKSB7CiAgICAgICAgbGV0IGNvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICB0aGlzLnJ1bih0cmVlLCBmaWxlLCByZWFsRG9uZSk7CiAgICAgICAgYXNzZXJ0RG9uZSgicnVuU3luYyIsICJydW4iLCBjb21wbGV0ZSk7CiAgICAgICAgb2socmVzdWx0LCAid2UgZWl0aGVyIGJhaWxlZCBvbiBhbiBlcnJvciBvciBoYXZlIGEgdHJlZSIpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgZnVuY3Rpb24gcmVhbERvbmUoZXJyb3IsIHRyZWUyKSB7CiAgICAgICAgICBiYWlsKGVycm9yKTsKICAgICAgICAgIHJlc3VsdCA9IHRyZWUyOwogICAgICAgICAgY29tcGxldGUgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogQ29tcGlsZSBhIHN5bnRheCB0cmVlLgogICAgICAgKgogICAgICAgKiA+ICoqTm90ZSoqOiBgc3RyaW5naWZ5YCBmcmVlemVzIHRoZSBwcm9jZXNzb3IgaWYgbm90IGFscmVhZHkgKmZyb3plbiouCiAgICAgICAqCiAgICAgICAqID4gKipOb3RlKio6IGBzdHJpbmdpZnlgIHBlcmZvcm1zIHRoZSBzdHJpbmdpZnkgcGhhc2UsIG5vdCB0aGUgcnVuIHBoYXNlCiAgICAgICAqID4gb3Igb3RoZXIgcGhhc2VzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0NvbXBpbGVUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IENvbXBpbGVUcmVlfSB0cmVlCiAgICAgICAqICAgVHJlZSB0byBjb21waWxlLgogICAgICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAgICAgKiAgIEZpbGUgYXNzb2NpYXRlZCB3aXRoIGBub2RlYCAob3B0aW9uYWwpOyBhbnkgdmFsdWUgYWNjZXB0ZWQgYXMgYHhgIGluCiAgICAgICAqICAgYG5ldyBWRmlsZSh4KWAuCiAgICAgICAqIEByZXR1cm5zIHtDb21waWxlUmVzdWx0IGV4dGVuZHMgdW5kZWZpbmVkID8gVmFsdWUgOiBDb21waWxlUmVzdWx0fQogICAgICAgKiAgIFRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRyZWUgKHNlZSBub3RlKS4KICAgICAgICoKICAgICAgICogICA+ICoqTm90ZSoqOiB1bmlmaWVkIHR5cGljYWxseSBjb21waWxlcyBieSBzZXJpYWxpemluZzogbW9zdCBjb21waWxlcnMKICAgICAgICogICA+IHJldHVybiBgc3RyaW5nYCAob3IgYFVpbnQ4QXJyYXlgKS4KICAgICAgICogICA+IFNvbWUgY29tcGlsZXJzLCBzdWNoIGFzIHRoZSBvbmUgY29uZmlndXJlZCB3aXRoCiAgICAgICAqICAgPiBbYHJlaHlwZS1yZWFjdGBdW3JlaHlwZS1yZWFjdF0sIHJldHVybiBvdGhlciB2YWx1ZXMgKGluIHRoaXMgY2FzZSwgYQogICAgICAgKiAgID4gUmVhY3QgdHJlZSkuCiAgICAgICAqICAgPiBJZiB5b3XigJlyZSB1c2luZyBhIGNvbXBpbGVyIHRoYXQgZG9lc27igJl0IHNlcmlhbGl6ZSwgZXhwZWN0IGRpZmZlcmVudAogICAgICAgKiAgID4gcmVzdWx0IHZhbHVlcy4KICAgICAgICogICA+CiAgICAgICAqICAgPiBUbyByZWdpc3RlciBjdXN0b20gcmVzdWx0cyBpbiBUeXBlU2NyaXB0LCBhZGQgdGhlbSB0bwogICAgICAgKiAgID4ge0BsaW5rY29kZSBDb21waWxlUmVzdWx0TWFwfS4KICAgICAgICoKICAgICAgICogICBbcmVoeXBlLXJlYWN0XTogaHR0cHM6Ly9naXRodWIuY29tL3JlaHlwZWpzL3JlaHlwZS1yZWFjdAogICAgICAgKi8KICAgICAgc3RyaW5naWZ5KHRyZWUsIGZpbGUpIHsKICAgICAgICB0aGlzLmZyZWV6ZSgpOwogICAgICAgIGNvbnN0IHJlYWxGaWxlID0gdmZpbGUoZmlsZSk7CiAgICAgICAgY29uc3QgY29tcGlsZXIyID0gdGhpcy5jb21waWxlciB8fCB0aGlzLkNvbXBpbGVyOwogICAgICAgIGFzc2VydENvbXBpbGVyKCJzdHJpbmdpZnkiLCBjb21waWxlcjIpOwogICAgICAgIGFzc2VydE5vZGUodHJlZSk7CiAgICAgICAgcmV0dXJuIGNvbXBpbGVyMih0cmVlLCByZWFsRmlsZSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENvbmZpZ3VyZSB0aGUgcHJvY2Vzc29yIHRvIHVzZSBhIHBsdWdpbiwgYSBsaXN0IG9mIHVzYWJsZSB2YWx1ZXMsIG9yIGEKICAgICAgICogcHJlc2V0LgogICAgICAgKgogICAgICAgKiBJZiB0aGUgcHJvY2Vzc29yIGlzIGFscmVhZHkgdXNpbmcgYSBwbHVnaW4sIHRoZSBwcmV2aW91cyBwbHVnaW4KICAgICAgICogY29uZmlndXJhdGlvbiBpcyBjaGFuZ2VkIGJhc2VkIG9uIHRoZSBvcHRpb25zIHRoYXQgYXJlIHBhc3NlZCBpbi4KICAgICAgICogSW4gb3RoZXIgd29yZHMsIHRoZSBwbHVnaW4gaXMgbm90IGFkZGVkIGEgc2Vjb25kIHRpbWUuCiAgICAgICAqCiAgICAgICAqID4gKipOb3RlKio6IGB1c2VgIGNhbm5vdCBiZSBjYWxsZWQgb24gKmZyb3plbiogcHJvY2Vzc29ycy4KICAgICAgICogPiBDYWxsIHRoZSBwcm9jZXNzb3IgZmlyc3QgdG8gY3JlYXRlIGEgbmV3IHVuZnJvemVuIHByb2Nlc3Nvci4KICAgICAgICoKICAgICAgICogQGV4YW1wbGUKICAgICAgICogICBUaGVyZSBhcmUgbWFueSB3YXlzIHRvIHBhc3MgcGx1Z2lucyB0byBgLnVzZSgpYC4KICAgICAgICogICBUaGlzIGV4YW1wbGUgZ2l2ZXMgYW4gb3ZlcnZpZXc6CiAgICAgICAqCiAgICAgICAqICAgYGBganMKICAgICAgICogICBpbXBvcnQge3VuaWZpZWR9IGZyb20gJ3VuaWZpZWQnCiAgICAgICAqCiAgICAgICAqICAgdW5pZmllZCgpCiAgICAgICAqICAgICAvLyBQbHVnaW4gd2l0aCBvcHRpb25zOgogICAgICAgKiAgICAgLnVzZShwbHVnaW5BLCB7eDogdHJ1ZSwgeTogdHJ1ZX0pCiAgICAgICAqICAgICAvLyBQYXNzaW5nIHRoZSBzYW1lIHBsdWdpbiBhZ2FpbiBtZXJnZXMgY29uZmlndXJhdGlvbiAodG8gYHt4OiB0cnVlLCB5OiBmYWxzZSwgejogdHJ1ZX1gKToKICAgICAgICogICAgIC51c2UocGx1Z2luQSwge3k6IGZhbHNlLCB6OiB0cnVlfSkKICAgICAgICogICAgIC8vIFBsdWdpbnM6CiAgICAgICAqICAgICAudXNlKFtwbHVnaW5CLCBwbHVnaW5DXSkKICAgICAgICogICAgIC8vIFR3byBwbHVnaW5zLCB0aGUgc2Vjb25kIHdpdGggb3B0aW9uczoKICAgICAgICogICAgIC51c2UoW3BsdWdpbkQsIFtwbHVnaW5FLCB7fV1dKQogICAgICAgKiAgICAgLy8gUHJlc2V0IHdpdGggcGx1Z2lucyBhbmQgc2V0dGluZ3M6CiAgICAgICAqICAgICAudXNlKHtwbHVnaW5zOiBbcGx1Z2luRiwgW3BsdWdpbkcsIHt9XV0sIHNldHRpbmdzOiB7cG9zaXRpb246IGZhbHNlfX0pCiAgICAgICAqICAgICAvLyBTZXR0aW5ncyBvbmx5OgogICAgICAgKiAgICAgLnVzZSh7c2V0dGluZ3M6IHtwb3NpdGlvbjogZmFsc2V9fSkKICAgICAgICogICBgYGAKICAgICAgICoKICAgICAgICogQHRlbXBsYXRlIHtBcnJheTx1bmtub3duPn0gW1BhcmFtZXRlcnM9W11dCiAgICAgICAqIEB0ZW1wbGF0ZSB7Tm9kZSB8IHN0cmluZyB8IHVuZGVmaW5lZH0gW0lucHV0PXVuZGVmaW5lZF0KICAgICAgICogQHRlbXBsYXRlIFtPdXRwdXQ9SW5wdXRdCiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge1ByZXNldCB8IG51bGwgfCB1bmRlZmluZWR9IFtwcmVzZXRdCiAgICAgICAqIEByZXR1cm5zIHtQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0Pn0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7UGx1Z2dhYmxlTGlzdH0gbGlzdAogICAgICAgKiBAcmV0dXJucyB7UHJvY2Vzc29yPFBhcnNlVHJlZSwgSGVhZFRyZWUsIFRhaWxUcmVlLCBDb21waWxlVHJlZSwgQ29tcGlsZVJlc3VsdD59CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge1BsdWdpbjxQYXJhbWV0ZXJzLCBJbnB1dCwgT3V0cHV0Pn0gcGx1Z2luCiAgICAgICAqIEBwYXJhbSB7Li4uKFBhcmFtZXRlcnMgfCBbYm9vbGVhbl0pfSBwYXJhbWV0ZXJzCiAgICAgICAqIEByZXR1cm5zIHtVc2VQbHVnaW48UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0LCBJbnB1dCwgT3V0cHV0Pn0KICAgICAgICoKICAgICAgICogQHBhcmFtIHtQbHVnZ2FibGVMaXN0IHwgUGx1Z2luIHwgUHJlc2V0IHwgbnVsbCB8IHVuZGVmaW5lZH0gdmFsdWUKICAgICAgICogICBVc2FibGUgdmFsdWUuCiAgICAgICAqIEBwYXJhbSB7Li4udW5rbm93bn0gcGFyYW1ldGVycwogICAgICAgKiAgIFBhcmFtZXRlcnMsIHdoZW4gYSBwbHVnaW4gaXMgZ2l2ZW4gYXMgYSB1c2FibGUgdmFsdWUuCiAgICAgICAqIEByZXR1cm5zIHtQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0Pn0KICAgICAgICogICBDdXJyZW50IHByb2Nlc3Nvci4KICAgICAgICovCiAgICAgIHVzZSh2YWx1ZTIsIC4uLnBhcmFtZXRlcnMpIHsKICAgICAgICBjb25zdCBhdHRhY2hlcnMgPSB0aGlzLmF0dGFjaGVyczsKICAgICAgICBjb25zdCBuYW1lc3BhY2UyID0gdGhpcy5uYW1lc3BhY2U7CiAgICAgICAgYXNzZXJ0VW5mcm96ZW4oInVzZSIsIHRoaXMuZnJvemVuKTsKICAgICAgICBpZiAodmFsdWUyID09PSBudWxsIHx8IHZhbHVlMiA9PT0gdm9pZCAwKSB7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICBhZGRQbHVnaW4odmFsdWUyLCBwYXJhbWV0ZXJzKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZTIgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZTIpKSB7CiAgICAgICAgICAgIGFkZExpc3QodmFsdWUyKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFkZFByZXNldCh2YWx1ZTIpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCB1c2FibGUgdmFsdWUsIG5vdCBgIiArIHZhbHVlMiArICJgIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIGZ1bmN0aW9uIGFkZDModmFsdWUzKSB7CiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlMyA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBhZGRQbHVnaW4odmFsdWUzLCBbXSk7CiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZTMgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlMykpIHsKICAgICAgICAgICAgICBjb25zdCBbcGx1Z2luLCAuLi5wYXJhbWV0ZXJzMl0gPSAoCiAgICAgICAgICAgICAgICAvKiogQHR5cGUge1BsdWdpblR1cGxlPEFycmF5PHVua25vd24+Pn0gKi8KICAgICAgICAgICAgICAgIHZhbHVlMwogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgYWRkUGx1Z2luKHBsdWdpbiwgcGFyYW1ldGVyczIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGFkZFByZXNldCh2YWx1ZTMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCB1c2FibGUgdmFsdWUsIG5vdCBgIiArIHZhbHVlMyArICJgIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGFkZFByZXNldChyZXN1bHQpIHsKICAgICAgICAgIGlmICghKCJwbHVnaW5zIiBpbiByZXN1bHQpICYmICEoInNldHRpbmdzIiBpbiByZXN1bHQpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICAgICAiRXhwZWN0ZWQgdXNhYmxlIHZhbHVlIGJ1dCByZWNlaXZlZCBhbiBlbXB0eSBwcmVzZXQsIHdoaWNoIGlzIHByb2JhYmx5IGEgbWlzdGFrZTogcHJlc2V0cyB0eXBpY2FsbHkgY29tZSB3aXRoIGBwbHVnaW5zYCBhbmQgc29tZXRpbWVzIHdpdGggYHNldHRpbmdzYCwgYnV0IHRoaXMgaGFzIG5laXRoZXIiCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgICBhZGRMaXN0KHJlc3VsdC5wbHVnaW5zKTsKICAgICAgICAgIGlmIChyZXN1bHQuc2V0dGluZ3MpIHsKICAgICAgICAgICAgbmFtZXNwYWNlMi5zZXR0aW5ncyA9ICgwLCBpbXBvcnRfZXh0ZW5kLmRlZmF1bHQpKHRydWUsIG5hbWVzcGFjZTIuc2V0dGluZ3MsIHJlc3VsdC5zZXR0aW5ncyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGFkZExpc3QocGx1Z2luczMpIHsKICAgICAgICAgIGxldCBpbmRleDIgPSAtMTsKICAgICAgICAgIGlmIChwbHVnaW5zMyA9PT0gbnVsbCB8fCBwbHVnaW5zMyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocGx1Z2luczMpKSB7CiAgICAgICAgICAgIHdoaWxlICgrK2luZGV4MiA8IHBsdWdpbnMzLmxlbmd0aCkgewogICAgICAgICAgICAgIGNvbnN0IHRoaW5nID0gcGx1Z2luczNbaW5kZXgyXTsKICAgICAgICAgICAgICBhZGQzKHRoaW5nKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBsaXN0IG9mIHBsdWdpbnMsIG5vdCBgIiArIHBsdWdpbnMzICsgImAiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gYWRkUGx1Z2luKHBsdWdpbiwgcGFyYW1ldGVyczIpIHsKICAgICAgICAgIGxldCBpbmRleDIgPSAtMTsKICAgICAgICAgIGxldCBlbnRyeUluZGV4ID0gLTE7CiAgICAgICAgICB3aGlsZSAoKytpbmRleDIgPCBhdHRhY2hlcnMubGVuZ3RoKSB7CiAgICAgICAgICAgIGlmIChhdHRhY2hlcnNbaW5kZXgyXVswXSA9PT0gcGx1Z2luKSB7CiAgICAgICAgICAgICAgZW50cnlJbmRleCA9IGluZGV4MjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGVudHJ5SW5kZXggPT09IC0xKSB7CiAgICAgICAgICAgIGF0dGFjaGVycy5wdXNoKFtwbHVnaW4sIC4uLnBhcmFtZXRlcnMyXSk7CiAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMyLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbGV0IFtwcmltYXJ5LCAuLi5yZXN0XSA9IHBhcmFtZXRlcnMyOwogICAgICAgICAgICBjb25zdCBjdXJyZW50UHJpbWFyeSA9IGF0dGFjaGVyc1tlbnRyeUluZGV4XVsxXTsKICAgICAgICAgICAgaWYgKGlzUGxhaW5PYmplY3QoY3VycmVudFByaW1hcnkpICYmIGlzUGxhaW5PYmplY3QocHJpbWFyeSkpIHsKICAgICAgICAgICAgICBwcmltYXJ5ID0gKDAsIGltcG9ydF9leHRlbmQuZGVmYXVsdCkodHJ1ZSwgY3VycmVudFByaW1hcnksIHByaW1hcnkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF0dGFjaGVyc1tlbnRyeUluZGV4XSA9IFtwbHVnaW4sIHByaW1hcnksIC4uLnJlc3RdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIHVuaWZpZWQgPSBuZXcgUHJvY2Vzc29yKCkuZnJlZXplKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS91bmlmaWVkQDExLjAuNS9ub2RlX21vZHVsZXMvdW5pZmllZC9pbmRleC5qcwp2YXIgaW5pdF91bmlmaWVkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdW5pZmllZEAxMS4wLjUvbm9kZV9tb2R1bGVzL3VuaWZpZWQvaW5kZXguanMiKCkgewogICAgaW5pdF9saWI1KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9jY291bnRAMi4wLjEvbm9kZV9tb2R1bGVzL2Njb3VudC9pbmRleC5qcwpmdW5jdGlvbiBjY291bnQodmFsdWUyLCBjaGFyYWN0ZXIpIHsKICBjb25zdCBzb3VyY2UgPSBTdHJpbmcodmFsdWUyKTsKICBpZiAodHlwZW9mIGNoYXJhY3RlciAhPT0gInN0cmluZyIpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGNoYXJhY3RlciIpOwogIH0KICBsZXQgY291bnQyID0gMDsKICBsZXQgaW5kZXgyID0gc291cmNlLmluZGV4T2YoY2hhcmFjdGVyKTsKICB3aGlsZSAoaW5kZXgyICE9PSAtMSkgewogICAgY291bnQyKys7CiAgICBpbmRleDIgPSBzb3VyY2UuaW5kZXhPZihjaGFyYWN0ZXIsIGluZGV4MiArIGNoYXJhY3Rlci5sZW5ndGgpOwogIH0KICByZXR1cm4gY291bnQyOwp9CnZhciBpbml0X2Njb3VudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2Njb3VudEAyLjAuMS9ub2RlX21vZHVsZXMvY2NvdW50L2luZGV4LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLWNoYXJhY3RlckAyLjEuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtY2hhcmFjdGVyL2luZGV4LmpzCmZ1bmN0aW9uIGFzY2lpQ29udHJvbChjb2RlNCkgewogIHJldHVybiAoCiAgICAvLyBTcGVjaWFsIHdoaXRlc3BhY2UgY29kZXMgKHdoaWNoIGhhdmUgbmVnYXRpdmUgdmFsdWVzKSwgQzAgYW5kIENvbnRyb2wKICAgIC8vIGNoYXJhY3RlciBERUwKICAgIGNvZGU0ICE9PSBudWxsICYmIChjb2RlNCA8IDMyIHx8IGNvZGU0ID09PSAxMjcpCiAgKTsKfQpmdW5jdGlvbiBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpIHsKICByZXR1cm4gY29kZTQgIT09IG51bGwgJiYgY29kZTQgPCAtMjsKfQpmdW5jdGlvbiBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSB7CiAgcmV0dXJuIGNvZGU0ICE9PSBudWxsICYmIChjb2RlNCA8IDAgfHwgY29kZTQgPT09IDMyKTsKfQpmdW5jdGlvbiBtYXJrZG93blNwYWNlKGNvZGU0KSB7CiAgcmV0dXJuIGNvZGU0ID09PSAtMiB8fCBjb2RlNCA9PT0gLTEgfHwgY29kZTQgPT09IDMyOwp9CmZ1bmN0aW9uIHJlZ2V4Q2hlY2socmVnZXgpIHsKICByZXR1cm4gY2hlY2s7CiAgZnVuY3Rpb24gY2hlY2soY29kZTQpIHsKICAgIHJldHVybiBjb2RlNCAhPT0gbnVsbCAmJiBjb2RlNCA+IC0xICYmIHJlZ2V4LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlNCkpOwogIH0KfQp2YXIgYXNjaWlBbHBoYSwgYXNjaWlBbHBoYW51bWVyaWMsIGFzY2lpQXRleHQsIGFzY2lpRGlnaXQsIGFzY2lpSGV4RGlnaXQsIGFzY2lpUHVuY3R1YXRpb24sIHVuaWNvZGVQdW5jdHVhdGlvbiwgdW5pY29kZVdoaXRlc3BhY2U7CnZhciBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLWNoYXJhY3RlckAyLjEuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtY2hhcmFjdGVyL2luZGV4LmpzIigpIHsKICAgIGFzY2lpQWxwaGEgPSByZWdleENoZWNrKC9bQS1aYS16XS8pOwogICAgYXNjaWlBbHBoYW51bWVyaWMgPSByZWdleENoZWNrKC9bXGRBLVphLXpdLyk7CiAgICBhc2NpaUF0ZXh0ID0gcmVnZXhDaGVjaygvWyMtJyorXC0tOT0/QS1aXi1+XS8pOwogICAgYXNjaWlEaWdpdCA9IHJlZ2V4Q2hlY2soL1xkLyk7CiAgICBhc2NpaUhleERpZ2l0ID0gcmVnZXhDaGVjaygvW1xkQS1GYS1mXS8pOwogICAgYXNjaWlQdW5jdHVhdGlvbiA9IHJlZ2V4Q2hlY2soL1shLS86LUBbLWB7LX5dLyk7CiAgICB1bmljb2RlUHVuY3R1YXRpb24gPSByZWdleENoZWNrKC9ccHtQfXxccHtTfS91KTsKICAgIHVuaWNvZGVXaGl0ZXNwYWNlID0gcmVnZXhDaGVjaygvXHMvKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtaXNANi4wLjEvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtaXMvbGliL2luZGV4LmpzCmZ1bmN0aW9uIGFueUZhY3RvcnkodGVzdHMpIHsKICBjb25zdCBjaGVja3MyID0gW107CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHRlc3RzLmxlbmd0aCkgewogICAgY2hlY2tzMltpbmRleDJdID0gY29udmVydCh0ZXN0c1tpbmRleDJdKTsKICB9CiAgcmV0dXJuIGNhc3RGYWN0b3J5KGFueSk7CiAgZnVuY3Rpb24gYW55KC4uLnBhcmFtZXRlcnMpIHsKICAgIGxldCBpbmRleDMgPSAtMTsKICAgIHdoaWxlICgrK2luZGV4MyA8IGNoZWNrczIubGVuZ3RoKSB7CiAgICAgIGlmIChjaGVja3MyW2luZGV4M10uYXBwbHkodGhpcywgcGFyYW1ldGVycykpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KfQpmdW5jdGlvbiBwcm9wZXJ0aWVzRmFjdG9yeShjaGVjaykgewogIGNvbnN0IGNoZWNrQXNSZWNvcmQgPSAoCiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLwogICAgY2hlY2sKICApOwogIHJldHVybiBjYXN0RmFjdG9yeShhbGwzKTsKICBmdW5jdGlvbiBhbGwzKG5vZGUyKSB7CiAgICBjb25zdCBub2RlQXNSZWNvcmQgPSAoCiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovCiAgICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi8KICAgICAgbm9kZTIKICAgICk7CiAgICBsZXQga2V5MjsKICAgIGZvciAoa2V5MiBpbiBjaGVjaykgewogICAgICBpZiAobm9kZUFzUmVjb3JkW2tleTJdICE9PSBjaGVja0FzUmVjb3JkW2tleTJdKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KZnVuY3Rpb24gdHlwZUZhY3RvcnkoY2hlY2spIHsKICByZXR1cm4gY2FzdEZhY3RvcnkodHlwZTUpOwogIGZ1bmN0aW9uIHR5cGU1KG5vZGUyKSB7CiAgICByZXR1cm4gbm9kZTIgJiYgbm9kZTIudHlwZSA9PT0gY2hlY2s7CiAgfQp9CmZ1bmN0aW9uIGNhc3RGYWN0b3J5KHRlc3RGdW5jdGlvbikgewogIHJldHVybiBjaGVjazsKICBmdW5jdGlvbiBjaGVjayh2YWx1ZTIsIGluZGV4MiwgcGFyZW50KSB7CiAgICByZXR1cm4gQm9vbGVhbigKICAgICAgbG9va3NMaWtlQU5vZGUodmFsdWUyKSAmJiB0ZXN0RnVuY3Rpb24uY2FsbCgKICAgICAgICB0aGlzLAogICAgICAgIHZhbHVlMiwKICAgICAgICB0eXBlb2YgaW5kZXgyID09PSAibnVtYmVyIiA/IGluZGV4MiA6IHZvaWQgMCwKICAgICAgICBwYXJlbnQgfHwgdm9pZCAwCiAgICAgICkKICAgICk7CiAgfQp9CmZ1bmN0aW9uIG9rMigpIHsKICByZXR1cm4gdHJ1ZTsKfQpmdW5jdGlvbiBsb29rc0xpa2VBTm9kZSh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZTIgPT09ICJvYmplY3QiICYmICJ0eXBlIiBpbiB2YWx1ZTI7Cn0KdmFyIGlzLCBjb252ZXJ0Owp2YXIgaW5pdF9saWI2ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdW5pc3QtdXRpbC1pc0A2LjAuMS9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC1pcy9saWIvaW5kZXguanMiKCkgewogICAgaXMgPSAvLyBOb3RlOiBvdmVybG9hZHMgaW4gSlNEb2MgY2Fu4oCZdCB5ZXQgdXNlIGRpZmZlcmVudCBgQHRlbXBsYXRlYHMuCiAgICAvKioKICAgICAqIEB0eXBlIHsoCiAgICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxzdHJpbmc+Pihub2RlOiB1bmtub3duLCB0ZXN0OiBDb25kaXRpb24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIHt0eXBlOiBDb25kaXRpb25bbnVtYmVyXX0pICYKICAgICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBBcnJheTxzdHJpbmc+Pihub2RlOiB1bmtub3duLCB0ZXN0OiBDb25kaXRpb24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIHt0eXBlOiBDb25kaXRpb25bbnVtYmVyXX0pICYKICAgICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBzdHJpbmc+KG5vZGU6IHVua25vd24sIHRlc3Q6IENvbmRpdGlvbiwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYge3R5cGU6IENvbmRpdGlvbn0pICYKICAgICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBQcm9wcz4obm9kZTogdW5rbm93biwgdGVzdDogQ29uZGl0aW9uLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBDb25kaXRpb24pICYKICAgICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBUZXN0RnVuY3Rpb24+KG5vZGU6IHVua25vd24sIHRlc3Q6IENvbmRpdGlvbiwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYgUHJlZGljYXRlPENvbmRpdGlvbiwgTm9kZT4pICYKICAgICAqICAgKChub2RlPzogbnVsbCB8IHVuZGVmaW5lZCkgPT4gZmFsc2UpICYKICAgICAqICAgKChub2RlOiB1bmtub3duLCB0ZXN0PzogbnVsbCB8IHVuZGVmaW5lZCwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlKSAmCiAgICAgKiAgICgobm9kZTogdW5rbm93biwgdGVzdD86IFRlc3QsIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IGJvb2xlYW4pCiAgICAgKiApfQogICAgICovCiAgICAvKioKICAgICAqIEBwYXJhbSB7dW5rbm93bn0gW25vZGVdCiAgICAgKiBAcGFyYW0ge1Rlc3R9IFt0ZXN0XQogICAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBbaW5kZXhdCiAgICAgKiBAcGFyYW0ge1BhcmVudCB8IG51bGwgfCB1bmRlZmluZWR9IFtwYXJlbnRdCiAgICAgKiBAcGFyYW0ge3Vua25vd259IFtjb250ZXh0XQogICAgICogQHJldHVybnMge2Jvb2xlYW59CiAgICAgKi8KICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zCiAgICAoZnVuY3Rpb24obm9kZTIsIHRlc3QsIGluZGV4MiwgcGFyZW50LCBjb250ZXh0MikgewogICAgICBjb25zdCBjaGVjayA9IGNvbnZlcnQodGVzdCk7CiAgICAgIGlmIChpbmRleDIgIT09IHZvaWQgMCAmJiBpbmRleDIgIT09IG51bGwgJiYgKHR5cGVvZiBpbmRleDIgIT09ICJudW1iZXIiIHx8IGluZGV4MiA8IDAgfHwgaW5kZXgyID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBwb3NpdGl2ZSBmaW5pdGUgaW5kZXgiKTsKICAgICAgfQogICAgICBpZiAocGFyZW50ICE9PSB2b2lkIDAgJiYgcGFyZW50ICE9PSBudWxsICYmICghaXMocGFyZW50KSB8fCAhcGFyZW50LmNoaWxkcmVuKSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgcGFyZW50IG5vZGUiKTsKICAgICAgfQogICAgICBpZiAoKHBhcmVudCA9PT0gdm9pZCAwIHx8IHBhcmVudCA9PT0gbnVsbCkgIT09IChpbmRleDIgPT09IHZvaWQgMCB8fCBpbmRleDIgPT09IG51bGwpKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBib3RoIHBhcmVudCBhbmQgaW5kZXgiKTsKICAgICAgfQogICAgICByZXR1cm4gbG9va3NMaWtlQU5vZGUobm9kZTIpID8gY2hlY2suY2FsbChjb250ZXh0Miwgbm9kZTIsIGluZGV4MiwgcGFyZW50KSA6IGZhbHNlOwogICAgfSk7CiAgICBjb252ZXJ0ID0gLy8gTm90ZTogb3ZlcmxvYWRzIGluIEpTRG9jIGNhbuKAmXQgeWV0IHVzZSBkaWZmZXJlbnQgYEB0ZW1wbGF0ZWBzLgogICAgLyoqCiAgICAgKiBAdHlwZSB7KAogICAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIHN0cmluZz4odGVzdDogQ29uZGl0aW9uKSA9PiAobm9kZTogdW5rbm93biwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYge3R5cGU6IENvbmRpdGlvbn0pICYKICAgICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBQcm9wcz4odGVzdDogQ29uZGl0aW9uKSA9PiAobm9kZTogdW5rbm93biwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYgQ29uZGl0aW9uKSAmCiAgICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgVGVzdEZ1bmN0aW9uPih0ZXN0OiBDb25kaXRpb24pID0+IChub2RlOiB1bmtub3duLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBQcmVkaWNhdGU8Q29uZGl0aW9uLCBOb2RlPikgJgogICAgICogICAoKHRlc3Q/OiBudWxsIHwgdW5kZWZpbmVkKSA9PiAobm9kZT86IHVua25vd24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSkgJgogICAgICogICAoKHRlc3Q/OiBUZXN0KSA9PiBDaGVjaykKICAgICAqICl9CiAgICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHtUZXN0fSBbdGVzdF0KICAgICAqIEByZXR1cm5zIHtDaGVja30KICAgICAqLwogICAgKGZ1bmN0aW9uKHRlc3QpIHsKICAgICAgaWYgKHRlc3QgPT09IG51bGwgfHwgdGVzdCA9PT0gdm9pZCAwKSB7CiAgICAgICAgcmV0dXJuIG9rMjsKICAgICAgfQogICAgICBpZiAodHlwZW9mIHRlc3QgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICByZXR1cm4gY2FzdEZhY3RvcnkodGVzdCk7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiB0ZXN0ID09PSAib2JqZWN0IikgewogICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRlc3QpID8gYW55RmFjdG9yeSh0ZXN0KSA6ICgKICAgICAgICAgIC8vIENhc3QgYmVjYXVzZSBgUmVhZG9ubHlBcnJheWAgZ29lcyBpbnRvIHRoZSBhYm92ZSBidXQgYGlzQXJyYXlgCiAgICAgICAgICAvLyBuYXJyb3dzIHRvIGBBcnJheWAuCiAgICAgICAgICBwcm9wZXJ0aWVzRmFjdG9yeSgKICAgICAgICAgICAgLyoqIEB0eXBlIHtQcm9wc30gKi8KICAgICAgICAgICAgdGVzdAogICAgICAgICAgKQogICAgICAgICk7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiB0ZXN0ID09PSAic3RyaW5nIikgewogICAgICAgIHJldHVybiB0eXBlRmFjdG9yeSh0ZXN0KTsKICAgICAgfQogICAgICB0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGZ1bmN0aW9uLCBzdHJpbmcsIG9yIG9iamVjdCBhcyB0ZXN0Iik7CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtaXNANi4wLjEvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtaXMvaW5kZXguanMKdmFyIGluaXRfdW5pc3RfdXRpbF9pcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtaXNANi4wLjEvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtaXMvaW5kZXguanMiKCkgewogICAgaW5pdF9saWI2KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXZpc2l0LXBhcmVudHNANi4wLjIvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cy9saWIvY29sb3IuanMKZnVuY3Rpb24gY29sb3IoZDYpIHsKICByZXR1cm4gZDY7Cn0KdmFyIGluaXRfY29sb3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXZpc2l0LXBhcmVudHNANi4wLjIvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cy9saWIvY29sb3IuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzQDYuMC4yL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0LXBhcmVudHMvbGliL2luZGV4LmpzCmZ1bmN0aW9uIHZpc2l0UGFyZW50cyh0cmVlLCB0ZXN0LCB2aXNpdG9yLCByZXZlcnNlKSB7CiAgbGV0IGNoZWNrOwogIGlmICh0eXBlb2YgdGVzdCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgdmlzaXRvciAhPT0gImZ1bmN0aW9uIikgewogICAgcmV2ZXJzZSA9IHZpc2l0b3I7CiAgICB2aXNpdG9yID0gdGVzdDsKICB9IGVsc2UgewogICAgY2hlY2sgPSB0ZXN0OwogIH0KICBjb25zdCBpczMgPSBjb252ZXJ0KGNoZWNrKTsKICBjb25zdCBzdGVwID0gcmV2ZXJzZSA/IC0xIDogMTsKICBmYWN0b3J5KHRyZWUsIHZvaWQgMCwgW10pKCk7CiAgZnVuY3Rpb24gZmFjdG9yeShub2RlMiwgaW5kZXgyLCBwYXJlbnRzKSB7CiAgICBjb25zdCB2YWx1ZTIgPSAoCiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovCiAgICAgIG5vZGUyICYmIHR5cGVvZiBub2RlMiA9PT0gIm9iamVjdCIgPyBub2RlMiA6IHt9CiAgICApOwogICAgaWYgKHR5cGVvZiB2YWx1ZTIudHlwZSA9PT0gInN0cmluZyIpIHsKICAgICAgY29uc3QgbmFtZSA9ICgKICAgICAgICAvLyBgaGFzdGAKICAgICAgICB0eXBlb2YgdmFsdWUyLnRhZ05hbWUgPT09ICJzdHJpbmciID8gdmFsdWUyLnRhZ05hbWUgOiAoCiAgICAgICAgICAvLyBgeGFzdGAKICAgICAgICAgIHR5cGVvZiB2YWx1ZTIubmFtZSA9PT0gInN0cmluZyIgPyB2YWx1ZTIubmFtZSA6IHZvaWQgMAogICAgICAgICkKICAgICAgKTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZpc2l0MiwgIm5hbWUiLCB7CiAgICAgICAgdmFsdWU6ICJub2RlICgiICsgY29sb3Iobm9kZTIudHlwZSArIChuYW1lID8gIjwiICsgbmFtZSArICI+IiA6ICIiKSkgKyAiKSIKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gdmlzaXQyOwogICAgZnVuY3Rpb24gdmlzaXQyKCkgewogICAgICBsZXQgcmVzdWx0ID0gZW1wdHkyOwogICAgICBsZXQgc3VicmVzdWx0OwogICAgICBsZXQgb2Zmc2V0OwogICAgICBsZXQgZ3JhbmRwYXJlbnRzOwogICAgICBpZiAoIXRlc3QgfHwgaXMzKG5vZGUyLCBpbmRleDIsIHBhcmVudHNbcGFyZW50cy5sZW5ndGggLSAxXSB8fCB2b2lkIDApKSB7CiAgICAgICAgcmVzdWx0ID0gdG9SZXN1bHQodmlzaXRvcihub2RlMiwgcGFyZW50cykpOwogICAgICAgIGlmIChyZXN1bHRbMF0gPT09IEVYSVQpIHsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICgiY2hpbGRyZW4iIGluIG5vZGUyICYmIG5vZGUyLmNoaWxkcmVuKSB7CiAgICAgICAgY29uc3Qgbm9kZUFzUGFyZW50ID0gKAogICAgICAgICAgLyoqIEB0eXBlIHtVbmlzdFBhcmVudH0gKi8KICAgICAgICAgIG5vZGUyCiAgICAgICAgKTsKICAgICAgICBpZiAobm9kZUFzUGFyZW50LmNoaWxkcmVuICYmIHJlc3VsdFswXSAhPT0gU0tJUCkgewogICAgICAgICAgb2Zmc2V0ID0gKHJldmVyc2UgPyBub2RlQXNQYXJlbnQuY2hpbGRyZW4ubGVuZ3RoIDogLTEpICsgc3RlcDsKICAgICAgICAgIGdyYW5kcGFyZW50cyA9IHBhcmVudHMuY29uY2F0KG5vZGVBc1BhcmVudCk7CiAgICAgICAgICB3aGlsZSAob2Zmc2V0ID4gLTEgJiYgb2Zmc2V0IDwgbm9kZUFzUGFyZW50LmNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICBjb25zdCBjaGlsZCA9IG5vZGVBc1BhcmVudC5jaGlsZHJlbltvZmZzZXRdOwogICAgICAgICAgICBzdWJyZXN1bHQgPSBmYWN0b3J5KGNoaWxkLCBvZmZzZXQsIGdyYW5kcGFyZW50cykoKTsKICAgICAgICAgICAgaWYgKHN1YnJlc3VsdFswXSA9PT0gRVhJVCkgewogICAgICAgICAgICAgIHJldHVybiBzdWJyZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2Zmc2V0ID0gdHlwZW9mIHN1YnJlc3VsdFsxXSA9PT0gIm51bWJlciIgPyBzdWJyZXN1bHRbMV0gOiBvZmZzZXQgKyBzdGVwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogIH0KfQpmdW5jdGlvbiB0b1Jlc3VsdCh2YWx1ZTIpIHsKICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZTIpKSB7CiAgICByZXR1cm4gdmFsdWUyOwogIH0KICBpZiAodHlwZW9mIHZhbHVlMiA9PT0gIm51bWJlciIpIHsKICAgIHJldHVybiBbQ09OVElOVUUsIHZhbHVlMl07CiAgfQogIHJldHVybiB2YWx1ZTIgPT09IG51bGwgfHwgdmFsdWUyID09PSB2b2lkIDAgPyBlbXB0eTIgOiBbdmFsdWUyXTsKfQp2YXIgZW1wdHkyLCBDT05USU5VRSwgRVhJVCwgU0tJUDsKdmFyIGluaXRfbGliNyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50c0A2LjAuMi9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzL2xpYi9pbmRleC5qcyIoKSB7CiAgICBpbml0X3VuaXN0X3V0aWxfaXMoKTsKICAgIGluaXRfY29sb3IoKTsKICAgIGVtcHR5MiA9IFtdOwogICAgQ09OVElOVUUgPSB0cnVlOwogICAgRVhJVCA9IGZhbHNlOwogICAgU0tJUCA9ICJza2lwIjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50c0A2LjAuMi9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzL2luZGV4LmpzCnZhciBpbml0X3VuaXN0X3V0aWxfdmlzaXRfcGFyZW50cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50c0A2LjAuMi9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliNygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1maW5kLWFuZC1yZXBsYWNlQDMuMC4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWZpbmQtYW5kLXJlcGxhY2UvbGliL2luZGV4LmpzCmZ1bmN0aW9uIGZpbmRBbmRSZXBsYWNlKHRyZWUsIGxpc3Q1LCBvcHRpb25zKSB7CiAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9OwogIGNvbnN0IGlnbm9yZWQgPSBjb252ZXJ0KHNldHRpbmdzLmlnbm9yZSB8fCBbXSk7CiAgY29uc3QgcGFpcnMyID0gdG9QYWlycyhsaXN0NSk7CiAgbGV0IHBhaXJJbmRleCA9IC0xOwogIHdoaWxlICgrK3BhaXJJbmRleCA8IHBhaXJzMi5sZW5ndGgpIHsKICAgIHZpc2l0UGFyZW50cyh0cmVlLCAidGV4dCIsIHZpc2l0b3IpOwogIH0KICBmdW5jdGlvbiB2aXNpdG9yKG5vZGUyLCBwYXJlbnRzKSB7CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICBsZXQgZ3JhbmRwYXJlbnQ7CiAgICB3aGlsZSAoKytpbmRleDIgPCBwYXJlbnRzLmxlbmd0aCkgewogICAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRzW2luZGV4Ml07CiAgICAgIGNvbnN0IHNpYmxpbmdzMiA9IGdyYW5kcGFyZW50ID8gZ3JhbmRwYXJlbnQuY2hpbGRyZW4gOiB2b2lkIDA7CiAgICAgIGlmIChpZ25vcmVkKAogICAgICAgIHBhcmVudCwKICAgICAgICBzaWJsaW5nczIgPyBzaWJsaW5nczIuaW5kZXhPZihwYXJlbnQpIDogdm9pZCAwLAogICAgICAgIGdyYW5kcGFyZW50CiAgICAgICkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZ3JhbmRwYXJlbnQgPSBwYXJlbnQ7CiAgICB9CiAgICBpZiAoZ3JhbmRwYXJlbnQpIHsKICAgICAgcmV0dXJuIGhhbmRsZXIyKG5vZGUyLCBwYXJlbnRzKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gaGFuZGxlcjIobm9kZTIsIHBhcmVudHMpIHsKICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudHNbcGFyZW50cy5sZW5ndGggLSAxXTsKICAgIGNvbnN0IGZpbmQzID0gcGFpcnMyW3BhaXJJbmRleF1bMF07CiAgICBjb25zdCByZXBsYWNlNSA9IHBhaXJzMltwYWlySW5kZXhdWzFdOwogICAgbGV0IHN0YXJ0ID0gMDsKICAgIGNvbnN0IHNpYmxpbmdzMiA9IHBhcmVudC5jaGlsZHJlbjsKICAgIGNvbnN0IGluZGV4MiA9IHNpYmxpbmdzMi5pbmRleE9mKG5vZGUyKTsKICAgIGxldCBjaGFuZ2UgPSBmYWxzZTsKICAgIGxldCBub2RlcyA9IFtdOwogICAgZmluZDMubGFzdEluZGV4ID0gMDsKICAgIGxldCBtYXRjaDIgPSBmaW5kMy5leGVjKG5vZGUyLnZhbHVlKTsKICAgIHdoaWxlIChtYXRjaDIpIHsKICAgICAgY29uc3QgcG9zaXRpb24zID0gbWF0Y2gyLmluZGV4OwogICAgICBjb25zdCBtYXRjaE9iamVjdCA9IHsKICAgICAgICBpbmRleDogbWF0Y2gyLmluZGV4LAogICAgICAgIGlucHV0OiBtYXRjaDIuaW5wdXQsCiAgICAgICAgc3RhY2s6IFsuLi5wYXJlbnRzLCBub2RlMl0KICAgICAgfTsKICAgICAgbGV0IHZhbHVlMiA9IHJlcGxhY2U1KC4uLm1hdGNoMiwgbWF0Y2hPYmplY3QpOwogICAgICBpZiAodHlwZW9mIHZhbHVlMiA9PT0gInN0cmluZyIpIHsKICAgICAgICB2YWx1ZTIgPSB2YWx1ZTIubGVuZ3RoID4gMCA/IHsgdHlwZTogInRleHQiLCB2YWx1ZTogdmFsdWUyIH0gOiB2b2lkIDA7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlMiA9PT0gZmFsc2UpIHsKICAgICAgICBmaW5kMy5sYXN0SW5kZXggPSBwb3NpdGlvbjMgKyAxOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChzdGFydCAhPT0gcG9zaXRpb24zKSB7CiAgICAgICAgICBub2Rlcy5wdXNoKHsKICAgICAgICAgICAgdHlwZTogInRleHQiLAogICAgICAgICAgICB2YWx1ZTogbm9kZTIudmFsdWUuc2xpY2Uoc3RhcnQsIHBvc2l0aW9uMykKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZTIpKSB7CiAgICAgICAgICBub2Rlcy5wdXNoKC4uLnZhbHVlMik7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZTIpIHsKICAgICAgICAgIG5vZGVzLnB1c2godmFsdWUyKTsKICAgICAgICB9CiAgICAgICAgc3RhcnQgPSBwb3NpdGlvbjMgKyBtYXRjaDJbMF0ubGVuZ3RoOwogICAgICAgIGNoYW5nZSA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKCFmaW5kMy5nbG9iYWwpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXRjaDIgPSBmaW5kMy5leGVjKG5vZGUyLnZhbHVlKTsKICAgIH0KICAgIGlmIChjaGFuZ2UpIHsKICAgICAgaWYgKHN0YXJ0IDwgbm9kZTIudmFsdWUubGVuZ3RoKSB7CiAgICAgICAgbm9kZXMucHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IG5vZGUyLnZhbHVlLnNsaWNlKHN0YXJ0KSB9KTsKICAgICAgfQogICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4MiwgMSwgLi4ubm9kZXMpOwogICAgfSBlbHNlIHsKICAgICAgbm9kZXMgPSBbbm9kZTJdOwogICAgfQogICAgcmV0dXJuIGluZGV4MiArIG5vZGVzLmxlbmd0aDsKICB9Cn0KZnVuY3Rpb24gdG9QYWlycyh0dXBsZU9yTGlzdCkgewogIGNvbnN0IHJlc3VsdCA9IFtdOwogIGlmICghQXJyYXkuaXNBcnJheSh0dXBsZU9yTGlzdCkpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGZpbmQgYW5kIHJlcGxhY2UgdHVwbGUgb3IgbGlzdCBvZiB0dXBsZXMiKTsKICB9CiAgY29uc3QgbGlzdDUgPSAhdHVwbGVPckxpc3RbMF0gfHwgQXJyYXkuaXNBcnJheSh0dXBsZU9yTGlzdFswXSkgPyB0dXBsZU9yTGlzdCA6IFt0dXBsZU9yTGlzdF07CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IGxpc3Q1Lmxlbmd0aCkgewogICAgY29uc3QgdHVwbGUgPSBsaXN0NVtpbmRleDJdOwogICAgcmVzdWx0LnB1c2goW3RvRXhwcmVzc2lvbih0dXBsZVswXSksIHRvRnVuY3Rpb24odHVwbGVbMV0pXSk7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gdG9FeHByZXNzaW9uKGZpbmQzKSB7CiAgcmV0dXJuIHR5cGVvZiBmaW5kMyA9PT0gInN0cmluZyIgPyBuZXcgUmVnRXhwKGVzY2FwZVN0cmluZ1JlZ2V4cChmaW5kMyksICJnIikgOiBmaW5kMzsKfQpmdW5jdGlvbiB0b0Z1bmN0aW9uKHJlcGxhY2U1KSB7CiAgcmV0dXJuIHR5cGVvZiByZXBsYWNlNSA9PT0gImZ1bmN0aW9uIiA/IHJlcGxhY2U1IDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gcmVwbGFjZTU7CiAgfTsKfQp2YXIgaW5pdF9saWI4ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1maW5kLWFuZC1yZXBsYWNlQDMuMC4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWZpbmQtYW5kLXJlcGxhY2UvbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfZXNjYXBlX3N0cmluZ19yZWdleHAoKTsKICAgIGluaXRfdW5pc3RfdXRpbF92aXNpdF9wYXJlbnRzKCk7CiAgICBpbml0X3VuaXN0X3V0aWxfaXMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZmluZC1hbmQtcmVwbGFjZUAzLjAuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1maW5kLWFuZC1yZXBsYWNlL2luZGV4LmpzCnZhciBpbml0X21kYXN0X3V0aWxfZmluZF9hbmRfcmVwbGFjZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZmluZC1hbmQtcmVwbGFjZUAzLjAuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1maW5kLWFuZC1yZXBsYWNlL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliOCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1nZm0tYXV0b2xpbmstbGl0ZXJhbEAyLjAuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0tYXV0b2xpbmstbGl0ZXJhbC9saWIvaW5kZXguanMKZnVuY3Rpb24gZ2ZtQXV0b2xpbmtMaXRlcmFsRnJvbU1hcmtkb3duKCkgewogIHJldHVybiB7CiAgICB0cmFuc2Zvcm1zOiBbdHJhbnNmb3JtR2ZtQXV0b2xpbmtMaXRlcmFsc10sCiAgICBlbnRlcjogewogICAgICBsaXRlcmFsQXV0b2xpbms6IGVudGVyTGl0ZXJhbEF1dG9saW5rLAogICAgICBsaXRlcmFsQXV0b2xpbmtFbWFpbDogZW50ZXJMaXRlcmFsQXV0b2xpbmtWYWx1ZSwKICAgICAgbGl0ZXJhbEF1dG9saW5rSHR0cDogZW50ZXJMaXRlcmFsQXV0b2xpbmtWYWx1ZSwKICAgICAgbGl0ZXJhbEF1dG9saW5rV3d3OiBlbnRlckxpdGVyYWxBdXRvbGlua1ZhbHVlCiAgICB9LAogICAgZXhpdDogewogICAgICBsaXRlcmFsQXV0b2xpbms6IGV4aXRMaXRlcmFsQXV0b2xpbmssCiAgICAgIGxpdGVyYWxBdXRvbGlua0VtYWlsOiBleGl0TGl0ZXJhbEF1dG9saW5rRW1haWwsCiAgICAgIGxpdGVyYWxBdXRvbGlua0h0dHA6IGV4aXRMaXRlcmFsQXV0b2xpbmtIdHRwLAogICAgICBsaXRlcmFsQXV0b2xpbmtXd3c6IGV4aXRMaXRlcmFsQXV0b2xpbmtXd3cKICAgIH0KICB9Owp9CmZ1bmN0aW9uIGdmbUF1dG9saW5rTGl0ZXJhbFRvTWFya2Rvd24oKSB7CiAgcmV0dXJuIHsKICAgIHVuc2FmZTogWwogICAgICB7CiAgICAgICAgY2hhcmFjdGVyOiAiQCIsCiAgICAgICAgYmVmb3JlOiAiWytcXC0uXFx3XSIsCiAgICAgICAgYWZ0ZXI6ICJbXFwtLlxcd10iLAogICAgICAgIGluQ29uc3RydWN0LAogICAgICAgIG5vdEluQ29uc3RydWN0CiAgICAgIH0sCiAgICAgIHsKICAgICAgICBjaGFyYWN0ZXI6ICIuIiwKICAgICAgICBiZWZvcmU6ICJbV3ddIiwKICAgICAgICBhZnRlcjogIltcXC0uXFx3XSIsCiAgICAgICAgaW5Db25zdHJ1Y3QsCiAgICAgICAgbm90SW5Db25zdHJ1Y3QKICAgICAgfSwKICAgICAgewogICAgICAgIGNoYXJhY3RlcjogIjoiLAogICAgICAgIGJlZm9yZTogIltwc10iLAogICAgICAgIGFmdGVyOiAiXFwvIiwKICAgICAgICBpbkNvbnN0cnVjdCwKICAgICAgICBub3RJbkNvbnN0cnVjdAogICAgICB9CiAgICBdCiAgfTsKfQpmdW5jdGlvbiBlbnRlckxpdGVyYWxBdXRvbGluayh0b2tlbikgewogIHRoaXMuZW50ZXIoeyB0eXBlOiAibGluayIsIHRpdGxlOiBudWxsLCB1cmw6ICIiLCBjaGlsZHJlbjogW10gfSwgdG9rZW4pOwp9CmZ1bmN0aW9uIGVudGVyTGl0ZXJhbEF1dG9saW5rVmFsdWUodG9rZW4pIHsKICB0aGlzLmNvbmZpZy5lbnRlci5hdXRvbGlua1Byb3RvY29sLmNhbGwodGhpcywgdG9rZW4pOwp9CmZ1bmN0aW9uIGV4aXRMaXRlcmFsQXV0b2xpbmtIdHRwKHRva2VuKSB7CiAgdGhpcy5jb25maWcuZXhpdC5hdXRvbGlua1Byb3RvY29sLmNhbGwodGhpcywgdG9rZW4pOwp9CmZ1bmN0aW9uIGV4aXRMaXRlcmFsQXV0b2xpbmtXd3codG9rZW4pIHsKICB0aGlzLmNvbmZpZy5leGl0LmRhdGEuY2FsbCh0aGlzLCB0b2tlbik7CiAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgb2sobm9kZTIudHlwZSA9PT0gImxpbmsiKTsKICBub2RlMi51cmwgPSAiaHR0cDovLyIgKyB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKfQpmdW5jdGlvbiBleGl0TGl0ZXJhbEF1dG9saW5rRW1haWwodG9rZW4pIHsKICB0aGlzLmNvbmZpZy5leGl0LmF1dG9saW5rRW1haWwuY2FsbCh0aGlzLCB0b2tlbik7Cn0KZnVuY3Rpb24gZXhpdExpdGVyYWxBdXRvbGluayh0b2tlbikgewogIHRoaXMuZXhpdCh0b2tlbik7Cn0KZnVuY3Rpb24gdHJhbnNmb3JtR2ZtQXV0b2xpbmtMaXRlcmFscyh0cmVlKSB7CiAgZmluZEFuZFJlcGxhY2UoCiAgICB0cmVlLAogICAgWwogICAgICBbLyhodHRwcz86XC9cL3x3d3coPz1cLikpKFstLlx3XSspKFteIFx0XHJcbl0qKS9naSwgZmluZFVybF0sCiAgICAgIFsvKD88PV58XHN8XHB7UH18XHB7U30pKFstLlx3K10rKUAoWy1cd10rKD86XC5bLVx3XSspKykvZ3UsIGZpbmRFbWFpbF0KICAgIF0sCiAgICB7IGlnbm9yZTogWyJsaW5rIiwgImxpbmtSZWZlcmVuY2UiXSB9CiAgKTsKfQpmdW5jdGlvbiBmaW5kVXJsKF80LCBwcm90b2NvbCwgZG9tYWluMiwgcGF0aDIsIG1hdGNoMikgewogIGxldCBwcmVmaXg0ID0gIiI7CiAgaWYgKCFwcmV2aW91cyhtYXRjaDIpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmICgvXncvaS50ZXN0KHByb3RvY29sKSkgewogICAgZG9tYWluMiA9IHByb3RvY29sICsgZG9tYWluMjsKICAgIHByb3RvY29sID0gIiI7CiAgICBwcmVmaXg0ID0gImh0dHA6Ly8iOwogIH0KICBpZiAoIWlzQ29ycmVjdERvbWFpbihkb21haW4yKSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjb25zdCBwYXJ0cyA9IHNwbGl0VXJsKGRvbWFpbjIgKyBwYXRoMik7CiAgaWYgKCFwYXJ0c1swXSkgcmV0dXJuIGZhbHNlOwogIGNvbnN0IHJlc3VsdCA9IHsKICAgIHR5cGU6ICJsaW5rIiwKICAgIHRpdGxlOiBudWxsLAogICAgdXJsOiBwcmVmaXg0ICsgcHJvdG9jb2wgKyBwYXJ0c1swXSwKICAgIGNoaWxkcmVuOiBbeyB0eXBlOiAidGV4dCIsIHZhbHVlOiBwcm90b2NvbCArIHBhcnRzWzBdIH1dCiAgfTsKICBpZiAocGFydHNbMV0pIHsKICAgIHJldHVybiBbcmVzdWx0LCB7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IHBhcnRzWzFdIH1dOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CmZ1bmN0aW9uIGZpbmRFbWFpbChfNCwgYXRleHQsIGxhYmVsLCBtYXRjaDIpIHsKICBpZiAoCiAgICAvLyBOb3QgYW4gZXhwZWN0ZWQgcHJldmlvdXMgY2hhcmFjdGVyLgogICAgIXByZXZpb3VzKG1hdGNoMiwgdHJ1ZSkgfHwgLy8gTGFiZWwgZW5kcyBpbiBub3QgYWxsb3dlZCBjaGFyYWN0ZXIuCiAgICAvWy1cZF9dJC8udGVzdChsYWJlbCkKICApIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIHsKICAgIHR5cGU6ICJsaW5rIiwKICAgIHRpdGxlOiBudWxsLAogICAgdXJsOiAibWFpbHRvOiIgKyBhdGV4dCArICJAIiArIGxhYmVsLAogICAgY2hpbGRyZW46IFt7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IGF0ZXh0ICsgIkAiICsgbGFiZWwgfV0KICB9Owp9CmZ1bmN0aW9uIGlzQ29ycmVjdERvbWFpbihkb21haW4yKSB7CiAgY29uc3QgcGFydHMgPSBkb21haW4yLnNwbGl0KCIuIik7CiAgaWYgKHBhcnRzLmxlbmd0aCA8IDIgfHwgcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gJiYgKC9fLy50ZXN0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKSB8fCAhL1thLXpBLVpcZF0vLnRlc3QocGFydHNbcGFydHMubGVuZ3RoIC0gMV0pKSB8fCBwYXJ0c1twYXJ0cy5sZW5ndGggLSAyXSAmJiAoL18vLnRlc3QocGFydHNbcGFydHMubGVuZ3RoIC0gMl0pIHx8ICEvW2EtekEtWlxkXS8udGVzdChwYXJ0c1twYXJ0cy5sZW5ndGggLSAyXSkpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIHNwbGl0VXJsKHVybCkgewogIGNvbnN0IHRyYWlsRXhlYyA9IC9bISImJyksLjo7PD4/XF19XSskLy5leGVjKHVybCk7CiAgaWYgKCF0cmFpbEV4ZWMpIHsKICAgIHJldHVybiBbdXJsLCB2b2lkIDBdOwogIH0KICB1cmwgPSB1cmwuc2xpY2UoMCwgdHJhaWxFeGVjLmluZGV4KTsKICBsZXQgdHJhaWwyID0gdHJhaWxFeGVjWzBdOwogIGxldCBjbG9zaW5nUGFyZW5JbmRleCA9IHRyYWlsMi5pbmRleE9mKCIpIik7CiAgY29uc3Qgb3BlbmluZ1BhcmVucyA9IGNjb3VudCh1cmwsICIoIik7CiAgbGV0IGNsb3NpbmdQYXJlbnMgPSBjY291bnQodXJsLCAiKSIpOwogIHdoaWxlIChjbG9zaW5nUGFyZW5JbmRleCAhPT0gLTEgJiYgb3BlbmluZ1BhcmVucyA+IGNsb3NpbmdQYXJlbnMpIHsKICAgIHVybCArPSB0cmFpbDIuc2xpY2UoMCwgY2xvc2luZ1BhcmVuSW5kZXggKyAxKTsKICAgIHRyYWlsMiA9IHRyYWlsMi5zbGljZShjbG9zaW5nUGFyZW5JbmRleCArIDEpOwogICAgY2xvc2luZ1BhcmVuSW5kZXggPSB0cmFpbDIuaW5kZXhPZigiKSIpOwogICAgY2xvc2luZ1BhcmVucysrOwogIH0KICByZXR1cm4gW3VybCwgdHJhaWwyXTsKfQpmdW5jdGlvbiBwcmV2aW91cyhtYXRjaDIsIGVtYWlsKSB7CiAgY29uc3QgY29kZTQgPSBtYXRjaDIuaW5wdXQuY2hhckNvZGVBdChtYXRjaDIuaW5kZXggLSAxKTsKICByZXR1cm4gKG1hdGNoMi5pbmRleCA9PT0gMCB8fCB1bmljb2RlV2hpdGVzcGFjZShjb2RlNCkgfHwgdW5pY29kZVB1bmN0dWF0aW9uKGNvZGU0KSkgJiYgLy8gSWYgaXTigJlzIGFuIGVtYWlsLCB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIHNob3VsZCBub3QgYmUgYSBzbGFzaC4KICAoIWVtYWlsIHx8IGNvZGU0ICE9PSA0Nyk7Cn0KdmFyIGluQ29uc3RydWN0LCBub3RJbkNvbnN0cnVjdDsKdmFyIGluaXRfbGliOSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLWF1dG9saW5rLWxpdGVyYWxAMi4wLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLWF1dG9saW5rLWxpdGVyYWwvbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfY2NvdW50KCk7CiAgICBpbml0X2RlZmF1bHQoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgICBpbml0X21kYXN0X3V0aWxfZmluZF9hbmRfcmVwbGFjZSgpOwogICAgaW5Db25zdHJ1Y3QgPSAicGhyYXNpbmciOwogICAgbm90SW5Db25zdHJ1Y3QgPSBbImF1dG9saW5rIiwgImxpbmsiLCAiaW1hZ2UiLCAibGFiZWwiXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLWF1dG9saW5rLWxpdGVyYWxAMi4wLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLWF1dG9saW5rLWxpdGVyYWwvaW5kZXguanMKdmFyIGluaXRfbWRhc3RfdXRpbF9nZm1fYXV0b2xpbmtfbGl0ZXJhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLWF1dG9saW5rLWxpdGVyYWxAMi4wLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLWF1dG9saW5rLWxpdGVyYWwvaW5kZXguanMiKCkgewogICAgaW5pdF9saWI5KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1ub3JtYWxpemUtaWRlbnRpZmllckAyLjAuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtbm9ybWFsaXplLWlkZW50aWZpZXIvaW5kZXguanMKZnVuY3Rpb24gbm9ybWFsaXplSWRlbnRpZmllcih2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyLnJlcGxhY2UoL1tcdFxuXHIgXSsvZywgIiAiKS5yZXBsYWNlKC9eIHwgJC9nLCAiIikudG9Mb3dlckNhc2UoKS50b1VwcGVyQ2FzZSgpOwp9CnZhciBpbml0X21pY3JvbWFya191dGlsX25vcm1hbGl6ZV9pZGVudGlmaWVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtbm9ybWFsaXplLWlkZW50aWZpZXJAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLW5vcm1hbGl6ZS1pZGVudGlmaWVyL2luZGV4LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLWZvb3Rub3RlQDIuMS4wL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS1mb290bm90ZS9saWIvaW5kZXguanMKZnVuY3Rpb24gZW50ZXJGb290bm90ZUNhbGxTdHJpbmcoKSB7CiAgdGhpcy5idWZmZXIoKTsKfQpmdW5jdGlvbiBlbnRlckZvb3Rub3RlQ2FsbCh0b2tlbikgewogIHRoaXMuZW50ZXIoeyB0eXBlOiAiZm9vdG5vdGVSZWZlcmVuY2UiLCBpZGVudGlmaWVyOiAiIiwgbGFiZWw6ICIiIH0sIHRva2VuKTsKfQpmdW5jdGlvbiBlbnRlckZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsU3RyaW5nKCkgewogIHRoaXMuYnVmZmVyKCk7Cn0KZnVuY3Rpb24gZW50ZXJGb290bm90ZURlZmluaXRpb24odG9rZW4pIHsKICB0aGlzLmVudGVyKAogICAgeyB0eXBlOiAiZm9vdG5vdGVEZWZpbml0aW9uIiwgaWRlbnRpZmllcjogIiIsIGxhYmVsOiAiIiwgY2hpbGRyZW46IFtdIH0sCiAgICB0b2tlbgogICk7Cn0KZnVuY3Rpb24gZXhpdEZvb3Rub3RlQ2FsbFN0cmluZyh0b2tlbikgewogIGNvbnN0IGxhYmVsID0gdGhpcy5yZXN1bWUoKTsKICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICBvayhub2RlMi50eXBlID09PSAiZm9vdG5vdGVSZWZlcmVuY2UiKTsKICBub2RlMi5pZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcigKICAgIHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pCiAgKS50b0xvd2VyQ2FzZSgpOwogIG5vZGUyLmxhYmVsID0gbGFiZWw7Cn0KZnVuY3Rpb24gZXhpdEZvb3Rub3RlQ2FsbCh0b2tlbikgewogIHRoaXMuZXhpdCh0b2tlbik7Cn0KZnVuY3Rpb24gZXhpdEZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsU3RyaW5nKHRva2VuKSB7CiAgY29uc3QgbGFiZWwgPSB0aGlzLnJlc3VtZSgpOwogIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogIG9rKG5vZGUyLnR5cGUgPT09ICJmb290bm90ZURlZmluaXRpb24iKTsKICBub2RlMi5pZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcigKICAgIHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pCiAgKS50b0xvd2VyQ2FzZSgpOwogIG5vZGUyLmxhYmVsID0gbGFiZWw7Cn0KZnVuY3Rpb24gZXhpdEZvb3Rub3RlRGVmaW5pdGlvbih0b2tlbikgewogIHRoaXMuZXhpdCh0b2tlbik7Cn0KZnVuY3Rpb24gZm9vdG5vdGVSZWZlcmVuY2VQZWVrKCkgewogIHJldHVybiAiWyI7Cn0KZnVuY3Rpb24gZm9vdG5vdGVSZWZlcmVuY2Uobm9kZTIsIF80LCBzdGF0ZTEwLCBpbmZvKSB7CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlMTAuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBsZXQgdmFsdWUyID0gdHJhY2tlci5tb3ZlKCJbXiIpOwogIGNvbnN0IGV4aXQzID0gc3RhdGUxMC5lbnRlcigiZm9vdG5vdGVSZWZlcmVuY2UiKTsKICBjb25zdCBzdWJleGl0ID0gc3RhdGUxMC5lbnRlcigicmVmZXJlbmNlIik7CiAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgKICAgIHN0YXRlMTAuc2FmZShzdGF0ZTEwLmFzc29jaWF0aW9uSWQobm9kZTIpLCB7IGFmdGVyOiAiXSIsIGJlZm9yZTogdmFsdWUyIH0pCiAgKTsKICBzdWJleGl0KCk7CiAgZXhpdDMoKTsKICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCJdIik7CiAgcmV0dXJuIHZhbHVlMjsKfQpmdW5jdGlvbiBnZm1Gb290bm90ZUZyb21NYXJrZG93bigpIHsKICByZXR1cm4gewogICAgZW50ZXI6IHsKICAgICAgZ2ZtRm9vdG5vdGVDYWxsU3RyaW5nOiBlbnRlckZvb3Rub3RlQ2FsbFN0cmluZywKICAgICAgZ2ZtRm9vdG5vdGVDYWxsOiBlbnRlckZvb3Rub3RlQ2FsbCwKICAgICAgZ2ZtRm9vdG5vdGVEZWZpbml0aW9uTGFiZWxTdHJpbmc6IGVudGVyRm9vdG5vdGVEZWZpbml0aW9uTGFiZWxTdHJpbmcsCiAgICAgIGdmbUZvb3Rub3RlRGVmaW5pdGlvbjogZW50ZXJGb290bm90ZURlZmluaXRpb24KICAgIH0sCiAgICBleGl0OiB7CiAgICAgIGdmbUZvb3Rub3RlQ2FsbFN0cmluZzogZXhpdEZvb3Rub3RlQ2FsbFN0cmluZywKICAgICAgZ2ZtRm9vdG5vdGVDYWxsOiBleGl0Rm9vdG5vdGVDYWxsLAogICAgICBnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZzogZXhpdEZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsU3RyaW5nLAogICAgICBnZm1Gb290bm90ZURlZmluaXRpb246IGV4aXRGb290bm90ZURlZmluaXRpb24KICAgIH0KICB9Owp9CmZ1bmN0aW9uIGdmbUZvb3Rub3RlVG9NYXJrZG93bihvcHRpb25zKSB7CiAgbGV0IGZpcnN0TGluZUJsYW5rID0gZmFsc2U7CiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5maXJzdExpbmVCbGFuaykgewogICAgZmlyc3RMaW5lQmxhbmsgPSB0cnVlOwogIH0KICByZXR1cm4gewogICAgaGFuZGxlcnM6IHsgZm9vdG5vdGVEZWZpbml0aW9uLCBmb290bm90ZVJlZmVyZW5jZSB9LAogICAgLy8gVGhpcyBpcyBvbiBieSBkZWZhdWx0IGFscmVhZHkuCiAgICB1bnNhZmU6IFt7IGNoYXJhY3RlcjogIlsiLCBpbkNvbnN0cnVjdDogWyJsYWJlbCIsICJwaHJhc2luZyIsICJyZWZlcmVuY2UiXSB9XQogIH07CiAgZnVuY3Rpb24gZm9vdG5vdGVEZWZpbml0aW9uKG5vZGUyLCBfNCwgc3RhdGUxMCwgaW5mbykgewogICAgY29uc3QgdHJhY2tlciA9IHN0YXRlMTAuY3JlYXRlVHJhY2tlcihpbmZvKTsKICAgIGxldCB2YWx1ZTIgPSB0cmFja2VyLm1vdmUoIlteIik7CiAgICBjb25zdCBleGl0MyA9IHN0YXRlMTAuZW50ZXIoImZvb3Rub3RlRGVmaW5pdGlvbiIpOwogICAgY29uc3Qgc3ViZXhpdCA9IHN0YXRlMTAuZW50ZXIoImxhYmVsIik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZTEwLnNhZmUoc3RhdGUxMC5hc3NvY2lhdGlvbklkKG5vZGUyKSwgeyBiZWZvcmU6IHZhbHVlMiwgYWZ0ZXI6ICJdIiB9KQogICAgKTsKICAgIHN1YmV4aXQoKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIl06Iik7CiAgICBpZiAobm9kZTIuY2hpbGRyZW4gJiYgbm9kZTIuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICB0cmFja2VyLnNoaWZ0KDQpOwogICAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICAgIChmaXJzdExpbmVCbGFuayA/ICJcbiIgOiAiICIpICsgc3RhdGUxMC5pbmRlbnRMaW5lcygKICAgICAgICAgIHN0YXRlMTAuY29udGFpbmVyRmxvdyhub2RlMiwgdHJhY2tlci5jdXJyZW50KCkpLAogICAgICAgICAgZmlyc3RMaW5lQmxhbmsgPyBtYXBBbGwgOiBtYXBFeGNlcHRGaXJzdAogICAgICAgICkKICAgICAgKTsKICAgIH0KICAgIGV4aXQzKCk7CiAgICByZXR1cm4gdmFsdWUyOwogIH0KfQpmdW5jdGlvbiBtYXBFeGNlcHRGaXJzdChsaW5lLCBpbmRleDIsIGJsYW5rKSB7CiAgcmV0dXJuIGluZGV4MiA9PT0gMCA/IGxpbmUgOiBtYXBBbGwobGluZSwgaW5kZXgyLCBibGFuayk7Cn0KZnVuY3Rpb24gbWFwQWxsKGxpbmUsIGluZGV4MiwgYmxhbmspIHsKICByZXR1cm4gKGJsYW5rID8gIiIgOiAiICAgICIpICsgbGluZTsKfQp2YXIgaW5pdF9saWIxMCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLWZvb3Rub3RlQDIuMS4wL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS1mb290bm90ZS9saWIvaW5kZXguanMiKCkgewogICAgaW5pdF9kZWZhdWx0KCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX25vcm1hbGl6ZV9pZGVudGlmaWVyKCk7CiAgICBmb290bm90ZVJlZmVyZW5jZS5wZWVrID0gZm9vdG5vdGVSZWZlcmVuY2VQZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1nZm0tZm9vdG5vdGVAMi4xLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLWZvb3Rub3RlL2luZGV4LmpzCnZhciBpbml0X21kYXN0X3V0aWxfZ2ZtX2Zvb3Rub3RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1nZm0tZm9vdG5vdGVAMi4xLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLWZvb3Rub3RlL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliMTAoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLXN0cmlrZXRocm91Z2hAMi4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXN0cmlrZXRocm91Z2gvbGliL2luZGV4LmpzCmZ1bmN0aW9uIGdmbVN0cmlrZXRocm91Z2hGcm9tTWFya2Rvd24oKSB7CiAgcmV0dXJuIHsKICAgIGNhbkNvbnRhaW5Fb2xzOiBbImRlbGV0ZSJdLAogICAgZW50ZXI6IHsgc3RyaWtldGhyb3VnaDogZW50ZXJTdHJpa2V0aHJvdWdoIH0sCiAgICBleGl0OiB7IHN0cmlrZXRocm91Z2g6IGV4aXRTdHJpa2V0aHJvdWdoIH0KICB9Owp9CmZ1bmN0aW9uIGdmbVN0cmlrZXRocm91Z2hUb01hcmtkb3duKCkgewogIHJldHVybiB7CiAgICB1bnNhZmU6IFsKICAgICAgewogICAgICAgIGNoYXJhY3RlcjogIn4iLAogICAgICAgIGluQ29uc3RydWN0OiAicGhyYXNpbmciLAogICAgICAgIG5vdEluQ29uc3RydWN0OiBjb25zdHJ1Y3RzV2l0aG91dFN0cmlrZXRocm91Z2gKICAgICAgfQogICAgXSwKICAgIGhhbmRsZXJzOiB7IGRlbGV0ZTogaGFuZGxlRGVsZXRlIH0KICB9Owp9CmZ1bmN0aW9uIGVudGVyU3RyaWtldGhyb3VnaCh0b2tlbikgewogIHRoaXMuZW50ZXIoeyB0eXBlOiAiZGVsZXRlIiwgY2hpbGRyZW46IFtdIH0sIHRva2VuKTsKfQpmdW5jdGlvbiBleGl0U3RyaWtldGhyb3VnaCh0b2tlbikgewogIHRoaXMuZXhpdCh0b2tlbik7Cn0KZnVuY3Rpb24gaGFuZGxlRGVsZXRlKG5vZGUyLCBfNCwgc3RhdGUxMCwgaW5mbykgewogIGNvbnN0IHRyYWNrZXIgPSBzdGF0ZTEwLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgY29uc3QgZXhpdDMgPSBzdGF0ZTEwLmVudGVyKCJzdHJpa2V0aHJvdWdoIik7CiAgbGV0IHZhbHVlMiA9IHRyYWNrZXIubW92ZSgifn4iKTsKICB2YWx1ZTIgKz0gc3RhdGUxMC5jb250YWluZXJQaHJhc2luZyhub2RlMiwgewogICAgLi4udHJhY2tlci5jdXJyZW50KCksCiAgICBiZWZvcmU6IHZhbHVlMiwKICAgIGFmdGVyOiAifiIKICB9KTsKICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCJ+fiIpOwogIGV4aXQzKCk7CiAgcmV0dXJuIHZhbHVlMjsKfQpmdW5jdGlvbiBwZWVrRGVsZXRlKCkgewogIHJldHVybiAifiI7Cn0KdmFyIGNvbnN0cnVjdHNXaXRob3V0U3RyaWtldGhyb3VnaDsKdmFyIGluaXRfbGliMTEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWdmbS1zdHJpa2V0aHJvdWdoQDIuMC4wL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS1zdHJpa2V0aHJvdWdoL2xpYi9pbmRleC5qcyIoKSB7CiAgICBjb25zdHJ1Y3RzV2l0aG91dFN0cmlrZXRocm91Z2ggPSBbCiAgICAgICJhdXRvbGluayIsCiAgICAgICJkZXN0aW5hdGlvbkxpdGVyYWwiLAogICAgICAiZGVzdGluYXRpb25SYXciLAogICAgICAicmVmZXJlbmNlIiwKICAgICAgInRpdGxlUXVvdGUiLAogICAgICAidGl0bGVBcG9zdHJvcGhlIgogICAgXTsKICAgIGhhbmRsZURlbGV0ZS5wZWVrID0gcGVla0RlbGV0ZTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLXN0cmlrZXRocm91Z2hAMi4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXN0cmlrZXRocm91Z2gvaW5kZXguanMKdmFyIGluaXRfbWRhc3RfdXRpbF9nZm1fc3RyaWtldGhyb3VnaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLXN0cmlrZXRocm91Z2hAMi4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXN0cmlrZXRocm91Z2gvaW5kZXguanMiKCkgewogICAgaW5pdF9saWIxMSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWFya2Rvd24tdGFibGVAMy4wLjQvbm9kZV9tb2R1bGVzL21hcmtkb3duLXRhYmxlL2luZGV4LmpzCmZ1bmN0aW9uIGRlZmF1bHRTdHJpbmdMZW5ndGgodmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMi5sZW5ndGg7Cn0KZnVuY3Rpb24gbWFya2Rvd25UYWJsZSh0YWJsZTIsIG9wdGlvbnMpIHsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwge307CiAgY29uc3QgYWxpZ24gPSAoc2V0dGluZ3MuYWxpZ24gfHwgW10pLmNvbmNhdCgpOwogIGNvbnN0IHN0cmluZ0xlbmd0aCA9IHNldHRpbmdzLnN0cmluZ0xlbmd0aCB8fCBkZWZhdWx0U3RyaW5nTGVuZ3RoOwogIGNvbnN0IGFsaWdubWVudHMgPSBbXTsKICBjb25zdCBjZWxsTWF0cml4ID0gW107CiAgY29uc3Qgc2l6ZU1hdHJpeCA9IFtdOwogIGNvbnN0IGxvbmdlc3RDZWxsQnlDb2x1bW4gPSBbXTsKICBsZXQgbW9zdENlbGxzUGVyUm93ID0gMDsKICBsZXQgcm93SW5kZXggPSAtMTsKICB3aGlsZSAoKytyb3dJbmRleCA8IHRhYmxlMi5sZW5ndGgpIHsKICAgIGNvbnN0IHJvdzIgPSBbXTsKICAgIGNvbnN0IHNpemVzMiA9IFtdOwogICAgbGV0IGNvbHVtbkluZGV4MiA9IC0xOwogICAgaWYgKHRhYmxlMltyb3dJbmRleF0ubGVuZ3RoID4gbW9zdENlbGxzUGVyUm93KSB7CiAgICAgIG1vc3RDZWxsc1BlclJvdyA9IHRhYmxlMltyb3dJbmRleF0ubGVuZ3RoOwogICAgfQogICAgd2hpbGUgKCsrY29sdW1uSW5kZXgyIDwgdGFibGUyW3Jvd0luZGV4XS5sZW5ndGgpIHsKICAgICAgY29uc3QgY2VsbDIgPSBzZXJpYWxpemUodGFibGUyW3Jvd0luZGV4XVtjb2x1bW5JbmRleDJdKTsKICAgICAgaWYgKHNldHRpbmdzLmFsaWduRGVsaW1pdGVycyAhPT0gZmFsc2UpIHsKICAgICAgICBjb25zdCBzaXplID0gc3RyaW5nTGVuZ3RoKGNlbGwyKTsKICAgICAgICBzaXplczJbY29sdW1uSW5kZXgyXSA9IHNpemU7CiAgICAgICAgaWYgKGxvbmdlc3RDZWxsQnlDb2x1bW5bY29sdW1uSW5kZXgyXSA9PT0gdm9pZCAwIHx8IHNpemUgPiBsb25nZXN0Q2VsbEJ5Q29sdW1uW2NvbHVtbkluZGV4Ml0pIHsKICAgICAgICAgIGxvbmdlc3RDZWxsQnlDb2x1bW5bY29sdW1uSW5kZXgyXSA9IHNpemU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJvdzIucHVzaChjZWxsMik7CiAgICB9CiAgICBjZWxsTWF0cml4W3Jvd0luZGV4XSA9IHJvdzI7CiAgICBzaXplTWF0cml4W3Jvd0luZGV4XSA9IHNpemVzMjsKICB9CiAgbGV0IGNvbHVtbkluZGV4ID0gLTE7CiAgaWYgKHR5cGVvZiBhbGlnbiA9PT0gIm9iamVjdCIgJiYgImxlbmd0aCIgaW4gYWxpZ24pIHsKICAgIHdoaWxlICgrK2NvbHVtbkluZGV4IDwgbW9zdENlbGxzUGVyUm93KSB7CiAgICAgIGFsaWdubWVudHNbY29sdW1uSW5kZXhdID0gdG9BbGlnbm1lbnQoYWxpZ25bY29sdW1uSW5kZXhdKTsKICAgIH0KICB9IGVsc2UgewogICAgY29uc3QgY29kZTQgPSB0b0FsaWdubWVudChhbGlnbik7CiAgICB3aGlsZSAoKytjb2x1bW5JbmRleCA8IG1vc3RDZWxsc1BlclJvdykgewogICAgICBhbGlnbm1lbnRzW2NvbHVtbkluZGV4XSA9IGNvZGU0OwogICAgfQogIH0KICBjb2x1bW5JbmRleCA9IC0xOwogIGNvbnN0IHJvdyA9IFtdOwogIGNvbnN0IHNpemVzID0gW107CiAgd2hpbGUgKCsrY29sdW1uSW5kZXggPCBtb3N0Q2VsbHNQZXJSb3cpIHsKICAgIGNvbnN0IGNvZGU0ID0gYWxpZ25tZW50c1tjb2x1bW5JbmRleF07CiAgICBsZXQgYmVmb3JlID0gIiI7CiAgICBsZXQgYWZ0ZXIgPSAiIjsKICAgIGlmIChjb2RlNCA9PT0gOTkpIHsKICAgICAgYmVmb3JlID0gIjoiOwogICAgICBhZnRlciA9ICI6IjsKICAgIH0gZWxzZSBpZiAoY29kZTQgPT09IDEwOCkgewogICAgICBiZWZvcmUgPSAiOiI7CiAgICB9IGVsc2UgaWYgKGNvZGU0ID09PSAxMTQpIHsKICAgICAgYWZ0ZXIgPSAiOiI7CiAgICB9CiAgICBsZXQgc2l6ZSA9IHNldHRpbmdzLmFsaWduRGVsaW1pdGVycyA9PT0gZmFsc2UgPyAxIDogTWF0aC5tYXgoCiAgICAgIDEsCiAgICAgIGxvbmdlc3RDZWxsQnlDb2x1bW5bY29sdW1uSW5kZXhdIC0gYmVmb3JlLmxlbmd0aCAtIGFmdGVyLmxlbmd0aAogICAgKTsKICAgIGNvbnN0IGNlbGwyID0gYmVmb3JlICsgIi0iLnJlcGVhdChzaXplKSArIGFmdGVyOwogICAgaWYgKHNldHRpbmdzLmFsaWduRGVsaW1pdGVycyAhPT0gZmFsc2UpIHsKICAgICAgc2l6ZSA9IGJlZm9yZS5sZW5ndGggKyBzaXplICsgYWZ0ZXIubGVuZ3RoOwogICAgICBpZiAoc2l6ZSA+IGxvbmdlc3RDZWxsQnlDb2x1bW5bY29sdW1uSW5kZXhdKSB7CiAgICAgICAgbG9uZ2VzdENlbGxCeUNvbHVtbltjb2x1bW5JbmRleF0gPSBzaXplOwogICAgICB9CiAgICAgIHNpemVzW2NvbHVtbkluZGV4XSA9IHNpemU7CiAgICB9CiAgICByb3dbY29sdW1uSW5kZXhdID0gY2VsbDI7CiAgfQogIGNlbGxNYXRyaXguc3BsaWNlKDEsIDAsIHJvdyk7CiAgc2l6ZU1hdHJpeC5zcGxpY2UoMSwgMCwgc2l6ZXMpOwogIHJvd0luZGV4ID0gLTE7CiAgY29uc3QgbGluZXMgPSBbXTsKICB3aGlsZSAoKytyb3dJbmRleCA8IGNlbGxNYXRyaXgubGVuZ3RoKSB7CiAgICBjb25zdCByb3cyID0gY2VsbE1hdHJpeFtyb3dJbmRleF07CiAgICBjb25zdCBzaXplczIgPSBzaXplTWF0cml4W3Jvd0luZGV4XTsKICAgIGNvbHVtbkluZGV4ID0gLTE7CiAgICBjb25zdCBsaW5lID0gW107CiAgICB3aGlsZSAoKytjb2x1bW5JbmRleCA8IG1vc3RDZWxsc1BlclJvdykgewogICAgICBjb25zdCBjZWxsMiA9IHJvdzJbY29sdW1uSW5kZXhdIHx8ICIiOwogICAgICBsZXQgYmVmb3JlID0gIiI7CiAgICAgIGxldCBhZnRlciA9ICIiOwogICAgICBpZiAoc2V0dGluZ3MuYWxpZ25EZWxpbWl0ZXJzICE9PSBmYWxzZSkgewogICAgICAgIGNvbnN0IHNpemUgPSBsb25nZXN0Q2VsbEJ5Q29sdW1uW2NvbHVtbkluZGV4XSAtIChzaXplczJbY29sdW1uSW5kZXhdIHx8IDApOwogICAgICAgIGNvbnN0IGNvZGU0ID0gYWxpZ25tZW50c1tjb2x1bW5JbmRleF07CiAgICAgICAgaWYgKGNvZGU0ID09PSAxMTQpIHsKICAgICAgICAgIGJlZm9yZSA9ICIgIi5yZXBlYXQoc2l6ZSk7CiAgICAgICAgfSBlbHNlIGlmIChjb2RlNCA9PT0gOTkpIHsKICAgICAgICAgIGlmIChzaXplICUgMikgewogICAgICAgICAgICBiZWZvcmUgPSAiICIucmVwZWF0KHNpemUgLyAyICsgMC41KTsKICAgICAgICAgICAgYWZ0ZXIgPSAiICIucmVwZWF0KHNpemUgLyAyIC0gMC41KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJlZm9yZSA9ICIgIi5yZXBlYXQoc2l6ZSAvIDIpOwogICAgICAgICAgICBhZnRlciA9IGJlZm9yZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgYWZ0ZXIgPSAiICIucmVwZWF0KHNpemUpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc2V0dGluZ3MuZGVsaW1pdGVyU3RhcnQgIT09IGZhbHNlICYmICFjb2x1bW5JbmRleCkgewogICAgICAgIGxpbmUucHVzaCgifCIpOwogICAgICB9CiAgICAgIGlmIChzZXR0aW5ncy5wYWRkaW5nICE9PSBmYWxzZSAmJiAvLyBEb27igJl0IGFkZCB0aGUgb3BlbmluZyBzcGFjZSBpZiB3ZeKAmXJlIG5vdCBhbGlnbmluZyBhbmQgdGhlIGNlbGwgaXMKICAgICAgLy8gZW1wdHk6IHRoZXJlIHdpbGwgYmUgYSBjbG9zaW5nIHNwYWNlLgogICAgICAhKHNldHRpbmdzLmFsaWduRGVsaW1pdGVycyA9PT0gZmFsc2UgJiYgY2VsbDIgPT09ICIiKSAmJiAoc2V0dGluZ3MuZGVsaW1pdGVyU3RhcnQgIT09IGZhbHNlIHx8IGNvbHVtbkluZGV4KSkgewogICAgICAgIGxpbmUucHVzaCgiICIpOwogICAgICB9CiAgICAgIGlmIChzZXR0aW5ncy5hbGlnbkRlbGltaXRlcnMgIT09IGZhbHNlKSB7CiAgICAgICAgbGluZS5wdXNoKGJlZm9yZSk7CiAgICAgIH0KICAgICAgbGluZS5wdXNoKGNlbGwyKTsKICAgICAgaWYgKHNldHRpbmdzLmFsaWduRGVsaW1pdGVycyAhPT0gZmFsc2UpIHsKICAgICAgICBsaW5lLnB1c2goYWZ0ZXIpOwogICAgICB9CiAgICAgIGlmIChzZXR0aW5ncy5wYWRkaW5nICE9PSBmYWxzZSkgewogICAgICAgIGxpbmUucHVzaCgiICIpOwogICAgICB9CiAgICAgIGlmIChzZXR0aW5ncy5kZWxpbWl0ZXJFbmQgIT09IGZhbHNlIHx8IGNvbHVtbkluZGV4ICE9PSBtb3N0Q2VsbHNQZXJSb3cgLSAxKSB7CiAgICAgICAgbGluZS5wdXNoKCJ8Iik7CiAgICAgIH0KICAgIH0KICAgIGxpbmVzLnB1c2goCiAgICAgIHNldHRpbmdzLmRlbGltaXRlckVuZCA9PT0gZmFsc2UgPyBsaW5lLmpvaW4oIiIpLnJlcGxhY2UoLyArJC8sICIiKSA6IGxpbmUuam9pbigiIikKICAgICk7CiAgfQogIHJldHVybiBsaW5lcy5qb2luKCJcbiIpOwp9CmZ1bmN0aW9uIHNlcmlhbGl6ZSh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyID09PSBudWxsIHx8IHZhbHVlMiA9PT0gdm9pZCAwID8gIiIgOiBTdHJpbmcodmFsdWUyKTsKfQpmdW5jdGlvbiB0b0FsaWdubWVudCh2YWx1ZTIpIHsKICBjb25zdCBjb2RlNCA9IHR5cGVvZiB2YWx1ZTIgPT09ICJzdHJpbmciID8gdmFsdWUyLmNvZGVQb2ludEF0KDApIDogMDsKICByZXR1cm4gY29kZTQgPT09IDY3IHx8IGNvZGU0ID09PSA5OSA/IDk5IDogY29kZTQgPT09IDc2IHx8IGNvZGU0ID09PSAxMDggPyAxMDggOiBjb2RlNCA9PT0gODIgfHwgY29kZTQgPT09IDExNCA/IDExNCA6IDA7Cn0KdmFyIGluaXRfbWFya2Rvd25fdGFibGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tYXJrZG93bi10YWJsZUAzLjAuNC9ub2RlX21vZHVsZXMvbWFya2Rvd24tdGFibGUvaW5kZXguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vendpdGNoQDIuMC40L25vZGVfbW9kdWxlcy96d2l0Y2gvaW5kZXguanMKZnVuY3Rpb24gendpdGNoKGtleTIsIG9wdGlvbnMpIHsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwge307CiAgZnVuY3Rpb24gb25lMyh2YWx1ZTIsIC4uLnBhcmFtZXRlcnMpIHsKICAgIGxldCBmbiA9IG9uZTMuaW52YWxpZDsKICAgIGNvbnN0IGhhbmRsZXJzMiA9IG9uZTMuaGFuZGxlcnM7CiAgICBpZiAodmFsdWUyICYmIG93bjIuY2FsbCh2YWx1ZTIsIGtleTIpKSB7CiAgICAgIGNvbnN0IGlkID0gU3RyaW5nKHZhbHVlMltrZXkyXSk7CiAgICAgIGZuID0gb3duMi5jYWxsKGhhbmRsZXJzMiwgaWQpID8gaGFuZGxlcnMyW2lkXSA6IG9uZTMudW5rbm93bjsKICAgIH0KICAgIGlmIChmbikgewogICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCB2YWx1ZTIsIC4uLnBhcmFtZXRlcnMpOwogICAgfQogIH0KICBvbmUzLmhhbmRsZXJzID0gc2V0dGluZ3MuaGFuZGxlcnMgfHwge307CiAgb25lMy5pbnZhbGlkID0gc2V0dGluZ3MuaW52YWxpZDsKICBvbmUzLnVua25vd24gPSBzZXR0aW5ncy51bmtub3duOwogIHJldHVybiBvbmUzOwp9CnZhciBvd24yOwp2YXIgaW5pdF96d2l0Y2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS96d2l0Y2hAMi4wLjQvbm9kZV9tb2R1bGVzL3p3aXRjaC9pbmRleC5qcyIoKSB7CiAgICBvd24yID0ge30uaGFzT3duUHJvcGVydHk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9jb25maWd1cmUuanMKZnVuY3Rpb24gY29uZmlndXJlKGJhc2UsIGV4dGVuc2lvbjIpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IGtleTI7CiAgaWYgKGV4dGVuc2lvbjIuZXh0ZW5zaW9ucykgewogICAgd2hpbGUgKCsraW5kZXgyIDwgZXh0ZW5zaW9uMi5leHRlbnNpb25zLmxlbmd0aCkgewogICAgICBjb25maWd1cmUoYmFzZSwgZXh0ZW5zaW9uMi5leHRlbnNpb25zW2luZGV4Ml0pOwogICAgfQogIH0KICBmb3IgKGtleTIgaW4gZXh0ZW5zaW9uMikgewogICAgaWYgKG93bjMuY2FsbChleHRlbnNpb24yLCBrZXkyKSkgewogICAgICBzd2l0Y2ggKGtleTIpIHsKICAgICAgICBjYXNlICJleHRlbnNpb25zIjogewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qIGM4IGlnbm9yZSBuZXh0IDQgKi8KICAgICAgICBjYXNlICJ1bnNhZmUiOiB7CiAgICAgICAgICBsaXN0KGJhc2Vba2V5Ml0sIGV4dGVuc2lvbjJba2V5Ml0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgImpvaW4iOiB7CiAgICAgICAgICBsaXN0KGJhc2Vba2V5Ml0sIGV4dGVuc2lvbjJba2V5Ml0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgImhhbmRsZXJzIjogewogICAgICAgICAgbWFwMyhiYXNlW2tleTJdLCBleHRlbnNpb24yW2tleTJdKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICBiYXNlLm9wdGlvbnNba2V5Ml0gPSBleHRlbnNpb24yW2tleTJdOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICByZXR1cm4gYmFzZTsKfQpmdW5jdGlvbiBsaXN0KGxlZnQsIHJpZ2h0KSB7CiAgaWYgKHJpZ2h0KSB7CiAgICBsZWZ0LnB1c2goLi4ucmlnaHQpOwogIH0KfQpmdW5jdGlvbiBtYXAzKGxlZnQsIHJpZ2h0KSB7CiAgaWYgKHJpZ2h0KSB7CiAgICBPYmplY3QuYXNzaWduKGxlZnQsIHJpZ2h0KTsKICB9Cn0KdmFyIG93bjM7CnZhciBpbml0X2NvbmZpZ3VyZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2NvbmZpZ3VyZS5qcyIoKSB7CiAgICBvd24zID0ge30uaGFzT3duUHJvcGVydHk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvYmxvY2txdW90ZS5qcwpmdW5jdGlvbiBibG9ja3F1b3RlKG5vZGUyLCBfNCwgc3RhdGUxMCwgaW5mbykgewogIGNvbnN0IGV4aXQzID0gc3RhdGUxMC5lbnRlcigiYmxvY2txdW90ZSIpOwogIGNvbnN0IHRyYWNrZXIgPSBzdGF0ZTEwLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgdHJhY2tlci5tb3ZlKCI+ICIpOwogIHRyYWNrZXIuc2hpZnQoMik7CiAgY29uc3QgdmFsdWUyID0gc3RhdGUxMC5pbmRlbnRMaW5lcygKICAgIHN0YXRlMTAuY29udGFpbmVyRmxvdyhub2RlMiwgdHJhY2tlci5jdXJyZW50KCkpLAogICAgbWFwNAogICk7CiAgZXhpdDMoKTsKICByZXR1cm4gdmFsdWUyOwp9CmZ1bmN0aW9uIG1hcDQobGluZSwgXzQsIGJsYW5rKSB7CiAgcmV0dXJuICI+IiArIChibGFuayA/ICIiIDogIiAiKSArIGxpbmU7Cn0KdmFyIGluaXRfYmxvY2txdW90ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9ibG9ja3F1b3RlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvcGF0dGVybi1pbi1zY29wZS5qcwpmdW5jdGlvbiBwYXR0ZXJuSW5TY29wZShzdGFjaywgcGF0dGVybikgewogIHJldHVybiBsaXN0SW5TY29wZShzdGFjaywgcGF0dGVybi5pbkNvbnN0cnVjdCwgdHJ1ZSkgJiYgIWxpc3RJblNjb3BlKHN0YWNrLCBwYXR0ZXJuLm5vdEluQ29uc3RydWN0LCBmYWxzZSk7Cn0KZnVuY3Rpb24gbGlzdEluU2NvcGUoc3RhY2ssIGxpc3Q1LCBub25lKSB7CiAgaWYgKHR5cGVvZiBsaXN0NSA9PT0gInN0cmluZyIpIHsKICAgIGxpc3Q1ID0gW2xpc3Q1XTsKICB9CiAgaWYgKCFsaXN0NSB8fCBsaXN0NS5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiBub25lOwogIH0KICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgbGlzdDUubGVuZ3RoKSB7CiAgICBpZiAoc3RhY2suaW5jbHVkZXMobGlzdDVbaW5kZXgyXSkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQogIHJldHVybiBmYWxzZTsKfQp2YXIgaW5pdF9wYXR0ZXJuX2luX3Njb3BlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9wYXR0ZXJuLWluLXNjb3BlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9icmVhay5qcwpmdW5jdGlvbiBoYXJkQnJlYWsoXzQsIF8xLCBzdGF0ZTEwLCBpbmZvKSB7CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHN0YXRlMTAudW5zYWZlLmxlbmd0aCkgewogICAgaWYgKHN0YXRlMTAudW5zYWZlW2luZGV4Ml0uY2hhcmFjdGVyID09PSAiXG4iICYmIHBhdHRlcm5JblNjb3BlKHN0YXRlMTAuc3RhY2ssIHN0YXRlMTAudW5zYWZlW2luZGV4Ml0pKSB7CiAgICAgIHJldHVybiAvWyBcdF0vLnRlc3QoaW5mby5iZWZvcmUpID8gIiIgOiAiICI7CiAgICB9CiAgfQogIHJldHVybiAiXFxcbiI7Cn0KdmFyIGluaXRfYnJlYWsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvYnJlYWsuanMiKCkgewogICAgaW5pdF9wYXR0ZXJuX2luX3Njb3BlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sb25nZXN0LXN0cmVha0AzLjEuMC9ub2RlX21vZHVsZXMvbG9uZ2VzdC1zdHJlYWsvaW5kZXguanMKZnVuY3Rpb24gbG9uZ2VzdFN0cmVhayh2YWx1ZTIsIHN1YnN0cmluZykgewogIGNvbnN0IHNvdXJjZSA9IFN0cmluZyh2YWx1ZTIpOwogIGxldCBpbmRleDIgPSBzb3VyY2UuaW5kZXhPZihzdWJzdHJpbmcpOwogIGxldCBleHBlY3RlZCA9IGluZGV4MjsKICBsZXQgY291bnQyID0gMDsKICBsZXQgbWF4MyA9IDA7CiAgaWYgKHR5cGVvZiBzdWJzdHJpbmcgIT09ICJzdHJpbmciKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBzdWJzdHJpbmciKTsKICB9CiAgd2hpbGUgKGluZGV4MiAhPT0gLTEpIHsKICAgIGlmIChpbmRleDIgPT09IGV4cGVjdGVkKSB7CiAgICAgIGlmICgrK2NvdW50MiA+IG1heDMpIHsKICAgICAgICBtYXgzID0gY291bnQyOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb3VudDIgPSAxOwogICAgfQogICAgZXhwZWN0ZWQgPSBpbmRleDIgKyBzdWJzdHJpbmcubGVuZ3RoOwogICAgaW5kZXgyID0gc291cmNlLmluZGV4T2Yoc3Vic3RyaW5nLCBleHBlY3RlZCk7CiAgfQogIHJldHVybiBtYXgzOwp9CnZhciBpbml0X2xvbmdlc3Rfc3RyZWFrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbG9uZ2VzdC1zdHJlYWtAMy4xLjAvbm9kZV9tb2R1bGVzL2xvbmdlc3Qtc3RyZWFrL2luZGV4LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvZm9ybWF0LWNvZGUtYXMtaW5kZW50ZWQuanMKZnVuY3Rpb24gZm9ybWF0Q29kZUFzSW5kZW50ZWQobm9kZTIsIHN0YXRlMTApIHsKICByZXR1cm4gQm9vbGVhbigKICAgIHN0YXRlMTAub3B0aW9ucy5mZW5jZXMgPT09IGZhbHNlICYmIG5vZGUyLnZhbHVlICYmIC8vIElmIHRoZXJl4oCZcyBubyBpbmZv4oCmCiAgICAhbm9kZTIubGFuZyAmJiAvLyBBbmQgdGhlcmXigJlzIGEgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVy4oCmCiAgICAvW14gXHJcbl0vLnRlc3Qobm9kZTIudmFsdWUpICYmIC8vIEFuZCB0aGUgdmFsdWUgZG9lc27igJl0IHN0YXJ0IG9yIGVuZCBpbiBhIGJsYW5r4oCmCiAgICAhL15bXHQgXSooPzpbXHJcbl18JCl8KD86XnxbXHJcbl0pW1x0IF0qJC8udGVzdChub2RlMi52YWx1ZSkKICApOwp9CnZhciBpbml0X2Zvcm1hdF9jb2RlX2FzX2luZGVudGVkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9mb3JtYXQtY29kZS1hcy1pbmRlbnRlZC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLWZlbmNlLmpzCmZ1bmN0aW9uIGNoZWNrRmVuY2Uoc3RhdGUxMCkgewogIGNvbnN0IG1hcmtlciA9IHN0YXRlMTAub3B0aW9ucy5mZW5jZSB8fCAiYCI7CiAgaWYgKG1hcmtlciAhPT0gImAiICYmIG1hcmtlciAhPT0gIn4iKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICJDYW5ub3Qgc2VyaWFsaXplIGNvZGUgd2l0aCBgIiArIG1hcmtlciArICJgIGZvciBgb3B0aW9ucy5mZW5jZWAsIGV4cGVjdGVkIGBgIGAgYGAgb3IgYH5gIgogICAgKTsKICB9CiAgcmV0dXJuIG1hcmtlcjsKfQp2YXIgaW5pdF9jaGVja19mZW5jZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stZmVuY2UuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2NvZGUuanMKZnVuY3Rpb24gY29kZShub2RlMiwgXzQsIHN0YXRlMTAsIGluZm8pIHsKICBjb25zdCBtYXJrZXIgPSBjaGVja0ZlbmNlKHN0YXRlMTApOwogIGNvbnN0IHJhdzIgPSBub2RlMi52YWx1ZSB8fCAiIjsKICBjb25zdCBzdWZmaXggPSBtYXJrZXIgPT09ICJgIiA/ICJHcmF2ZUFjY2VudCIgOiAiVGlsZGUiOwogIGlmIChmb3JtYXRDb2RlQXNJbmRlbnRlZChub2RlMiwgc3RhdGUxMCkpIHsKICAgIGNvbnN0IGV4aXQ0ID0gc3RhdGUxMC5lbnRlcigiY29kZUluZGVudGVkIik7CiAgICBjb25zdCB2YWx1ZTMgPSBzdGF0ZTEwLmluZGVudExpbmVzKHJhdzIsIG1hcDUpOwogICAgZXhpdDQoKTsKICAgIHJldHVybiB2YWx1ZTM7CiAgfQogIGNvbnN0IHRyYWNrZXIgPSBzdGF0ZTEwLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgY29uc3Qgc2VxdWVuY2UgPSBtYXJrZXIucmVwZWF0KE1hdGgubWF4KGxvbmdlc3RTdHJlYWsocmF3MiwgbWFya2VyKSArIDEsIDMpKTsKICBjb25zdCBleGl0MyA9IHN0YXRlMTAuZW50ZXIoImNvZGVGZW5jZWQiKTsKICBsZXQgdmFsdWUyID0gdHJhY2tlci5tb3ZlKHNlcXVlbmNlKTsKICBpZiAobm9kZTIubGFuZykgewogICAgY29uc3Qgc3ViZXhpdCA9IHN0YXRlMTAuZW50ZXIoYGNvZGVGZW5jZWRMYW5nJHtzdWZmaXh9YCk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZTEwLnNhZmUobm9kZTIubGFuZywgewogICAgICAgIGJlZm9yZTogdmFsdWUyLAogICAgICAgIGFmdGVyOiAiICIsCiAgICAgICAgZW5jb2RlOiBbImAiXSwKICAgICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgICB9KQogICAgKTsKICAgIHN1YmV4aXQoKTsKICB9CiAgaWYgKG5vZGUyLmxhbmcgJiYgbm9kZTIubWV0YSkgewogICAgY29uc3Qgc3ViZXhpdCA9IHN0YXRlMTAuZW50ZXIoYGNvZGVGZW5jZWRNZXRhJHtzdWZmaXh9YCk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCIgIik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZTEwLnNhZmUobm9kZTIubWV0YSwgewogICAgICAgIGJlZm9yZTogdmFsdWUyLAogICAgICAgIGFmdGVyOiAiXG4iLAogICAgICAgIGVuY29kZTogWyJgIl0sCiAgICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgICAgfSkKICAgICk7CiAgICBzdWJleGl0KCk7CiAgfQogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIlxuIik7CiAgaWYgKHJhdzIpIHsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUocmF3MiArICJcbiIpOwogIH0KICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKHNlcXVlbmNlKTsKICBleGl0MygpOwogIHJldHVybiB2YWx1ZTI7Cn0KZnVuY3Rpb24gbWFwNShsaW5lLCBfNCwgYmxhbmspIHsKICByZXR1cm4gKGJsYW5rID8gIiIgOiAiICAgICIpICsgbGluZTsKfQp2YXIgaW5pdF9jb2RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2NvZGUuanMiKCkgewogICAgaW5pdF9sb25nZXN0X3N0cmVhaygpOwogICAgaW5pdF9mb3JtYXRfY29kZV9hc19pbmRlbnRlZCgpOwogICAgaW5pdF9jaGVja19mZW5jZSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1xdW90ZS5qcwpmdW5jdGlvbiBjaGVja1F1b3RlKHN0YXRlMTApIHsKICBjb25zdCBtYXJrZXIgPSBzdGF0ZTEwLm9wdGlvbnMucXVvdGUgfHwgJyInOwogIGlmIChtYXJrZXIgIT09ICciJyAmJiBtYXJrZXIgIT09ICInIikgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAiQ2Fubm90IHNlcmlhbGl6ZSB0aXRsZSB3aXRoIGAiICsgbWFya2VyICsgImAgZm9yIGBvcHRpb25zLnF1b3RlYCwgZXhwZWN0ZWQgYFwiYCwgb3IgYCdgIgogICAgKTsKICB9CiAgcmV0dXJuIG1hcmtlcjsKfQp2YXIgaW5pdF9jaGVja19xdW90ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stcXVvdGUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2RlZmluaXRpb24uanMKZnVuY3Rpb24gZGVmaW5pdGlvbihub2RlMiwgXzQsIHN0YXRlMTAsIGluZm8pIHsKICBjb25zdCBxdW90ZSA9IGNoZWNrUXVvdGUoc3RhdGUxMCk7CiAgY29uc3Qgc3VmZml4ID0gcXVvdGUgPT09ICciJyA/ICJRdW90ZSIgOiAiQXBvc3Ryb3BoZSI7CiAgY29uc3QgZXhpdDMgPSBzdGF0ZTEwLmVudGVyKCJkZWZpbml0aW9uIik7CiAgbGV0IHN1YmV4aXQgPSBzdGF0ZTEwLmVudGVyKCJsYWJlbCIpOwogIGNvbnN0IHRyYWNrZXIgPSBzdGF0ZTEwLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgbGV0IHZhbHVlMiA9IHRyYWNrZXIubW92ZSgiWyIpOwogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICBzdGF0ZTEwLnNhZmUoc3RhdGUxMC5hc3NvY2lhdGlvbklkKG5vZGUyKSwgewogICAgICBiZWZvcmU6IHZhbHVlMiwKICAgICAgYWZ0ZXI6ICJdIiwKICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgIH0pCiAgKTsKICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCJdOiAiKTsKICBzdWJleGl0KCk7CiAgaWYgKAogICAgLy8gSWYgdGhlcmXigJlzIG5vIHVybCwgb3LigKYKICAgICFub2RlMi51cmwgfHwgLy8gSWYgdGhlcmUgYXJlIGNvbnRyb2wgY2hhcmFjdGVycyBvciB3aGl0ZXNwYWNlLgogICAgL1tcMC0gXHUwMDdGXS8udGVzdChub2RlMi51cmwpCiAgKSB7CiAgICBzdWJleGl0ID0gc3RhdGUxMC5lbnRlcigiZGVzdGluYXRpb25MaXRlcmFsIik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCI8Iik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZTEwLnNhZmUobm9kZTIudXJsLCB7IGJlZm9yZTogdmFsdWUyLCBhZnRlcjogIj4iLCAuLi50cmFja2VyLmN1cnJlbnQoKSB9KQogICAgKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIj4iKTsKICB9IGVsc2UgewogICAgc3ViZXhpdCA9IHN0YXRlMTAuZW50ZXIoImRlc3RpbmF0aW9uUmF3Iik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZTEwLnNhZmUobm9kZTIudXJsLCB7CiAgICAgICAgYmVmb3JlOiB2YWx1ZTIsCiAgICAgICAgYWZ0ZXI6IG5vZGUyLnRpdGxlID8gIiAiIDogIlxuIiwKICAgICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgICB9KQogICAgKTsKICB9CiAgc3ViZXhpdCgpOwogIGlmIChub2RlMi50aXRsZSkgewogICAgc3ViZXhpdCA9IHN0YXRlMTAuZW50ZXIoYHRpdGxlJHtzdWZmaXh9YCk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCIgIiArIHF1b3RlKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICAgIHN0YXRlMTAuc2FmZShub2RlMi50aXRsZSwgewogICAgICAgIGJlZm9yZTogdmFsdWUyLAogICAgICAgIGFmdGVyOiBxdW90ZSwKICAgICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgICB9KQogICAgKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUocXVvdGUpOwogICAgc3ViZXhpdCgpOwogIH0KICBleGl0MygpOwogIHJldHVybiB2YWx1ZTI7Cn0KdmFyIGluaXRfZGVmaW5pdGlvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9kZWZpbml0aW9uLmpzIigpIHsKICAgIGluaXRfY2hlY2tfcXVvdGUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stZW1waGFzaXMuanMKZnVuY3Rpb24gY2hlY2tFbXBoYXNpcyhzdGF0ZTEwKSB7CiAgY29uc3QgbWFya2VyID0gc3RhdGUxMC5vcHRpb25zLmVtcGhhc2lzIHx8ICIqIjsKICBpZiAobWFya2VyICE9PSAiKiIgJiYgbWFya2VyICE9PSAiXyIpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgIkNhbm5vdCBzZXJpYWxpemUgZW1waGFzaXMgd2l0aCBgIiArIG1hcmtlciArICJgIGZvciBgb3B0aW9ucy5lbXBoYXNpc2AsIGV4cGVjdGVkIGAqYCwgb3IgYF9gIgogICAgKTsKICB9CiAgcmV0dXJuIG1hcmtlcjsKfQp2YXIgaW5pdF9jaGVja19lbXBoYXNpcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stZW1waGFzaXMuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9lbmNvZGUtY2hhcmFjdGVyLXJlZmVyZW5jZS5qcwpmdW5jdGlvbiBlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UoY29kZTQpIHsKICByZXR1cm4gIiYjeCIgKyBjb2RlNC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArICI7IjsKfQp2YXIgaW5pdF9lbmNvZGVfY2hhcmFjdGVyX3JlZmVyZW5jZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvZW5jb2RlLWNoYXJhY3Rlci1yZWZlcmVuY2UuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtY2xhc3NpZnktY2hhcmFjdGVyQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1jbGFzc2lmeS1jaGFyYWN0ZXIvaW5kZXguanMKZnVuY3Rpb24gY2xhc3NpZnlDaGFyYWN0ZXIoY29kZTQpIHsKICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkgfHwgdW5pY29kZVdoaXRlc3BhY2UoY29kZTQpKSB7CiAgICByZXR1cm4gMTsKICB9CiAgaWYgKHVuaWNvZGVQdW5jdHVhdGlvbihjb2RlNCkpIHsKICAgIHJldHVybiAyOwogIH0KfQp2YXIgaW5pdF9taWNyb21hcmtfdXRpbF9jbGFzc2lmeV9jaGFyYWN0ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1jbGFzc2lmeS1jaGFyYWN0ZXJAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLWNsYXNzaWZ5LWNoYXJhY3Rlci9pbmRleC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9lbmNvZGUtaW5mby5qcwpmdW5jdGlvbiBlbmNvZGVJbmZvKG91dHNpZGUsIGluc2lkZSwgbWFya2VyKSB7CiAgY29uc3Qgb3V0c2lkZUtpbmQgPSBjbGFzc2lmeUNoYXJhY3RlcihvdXRzaWRlKTsKICBjb25zdCBpbnNpZGVLaW5kID0gY2xhc3NpZnlDaGFyYWN0ZXIoaW5zaWRlKTsKICBpZiAob3V0c2lkZUtpbmQgPT09IHZvaWQgMCkgewogICAgcmV0dXJuIGluc2lkZUtpbmQgPT09IHZvaWQgMCA/ICgKICAgICAgLy8gTGV0dGVyIGluc2lkZToKICAgICAgLy8gd2UgaGF2ZSB0byBlbmNvZGUgKmJvdGgqIGxldHRlcnMgZm9yIGBfYCBhcyBpdCBpcyBsb29zZXIuCiAgICAgIC8vIGl0IGFscmVhZHkgZm9ybXMgZm9yIGAqYCAoYW5kIEdGTXMgYH5gKS4KICAgICAgbWFya2VyID09PSAiXyIgPyB7IGluc2lkZTogdHJ1ZSwgb3V0c2lkZTogdHJ1ZSB9IDogeyBpbnNpZGU6IGZhbHNlLCBvdXRzaWRlOiBmYWxzZSB9CiAgICApIDogaW5zaWRlS2luZCA9PT0gMSA/ICgKICAgICAgLy8gV2hpdGVzcGFjZSBpbnNpZGU6IGVuY29kZSBib3RoIChsZXR0ZXIsIHdoaXRlc3BhY2UpLgogICAgICB7IGluc2lkZTogdHJ1ZSwgb3V0c2lkZTogdHJ1ZSB9CiAgICApIDogKAogICAgICAvLyBQdW5jdHVhdGlvbiBpbnNpZGU6IGVuY29kZSBvdXRlciAobGV0dGVyKQogICAgICB7IGluc2lkZTogZmFsc2UsIG91dHNpZGU6IHRydWUgfQogICAgKTsKICB9CiAgaWYgKG91dHNpZGVLaW5kID09PSAxKSB7CiAgICByZXR1cm4gaW5zaWRlS2luZCA9PT0gdm9pZCAwID8gKAogICAgICAvLyBMZXR0ZXIgaW5zaWRlOiBhbHJlYWR5IGZvcm1zLgogICAgICB7IGluc2lkZTogZmFsc2UsIG91dHNpZGU6IGZhbHNlIH0KICAgICkgOiBpbnNpZGVLaW5kID09PSAxID8gKAogICAgICAvLyBXaGl0ZXNwYWNlIGluc2lkZTogZW5jb2RlIGJvdGggKHdoaXRlc3BhY2UpLgogICAgICB7IGluc2lkZTogdHJ1ZSwgb3V0c2lkZTogdHJ1ZSB9CiAgICApIDogKAogICAgICAvLyBQdW5jdHVhdGlvbiBpbnNpZGU6IGFscmVhZHkgZm9ybXMuCiAgICAgIHsgaW5zaWRlOiBmYWxzZSwgb3V0c2lkZTogZmFsc2UgfQogICAgKTsKICB9CiAgcmV0dXJuIGluc2lkZUtpbmQgPT09IHZvaWQgMCA/ICgKICAgIC8vIExldHRlciBpbnNpZGU6IGFscmVhZHkgZm9ybXMuCiAgICB7IGluc2lkZTogZmFsc2UsIG91dHNpZGU6IGZhbHNlIH0KICApIDogaW5zaWRlS2luZCA9PT0gMSA/ICgKICAgIC8vIFdoaXRlc3BhY2UgaW5zaWRlOiBlbmNvZGUgaW5uZXIgKHdoaXRlc3BhY2UpLgogICAgeyBpbnNpZGU6IHRydWUsIG91dHNpZGU6IGZhbHNlIH0KICApIDogKAogICAgLy8gUHVuY3R1YXRpb24gaW5zaWRlOiBhbHJlYWR5IGZvcm1zLgogICAgeyBpbnNpZGU6IGZhbHNlLCBvdXRzaWRlOiBmYWxzZSB9CiAgKTsKfQp2YXIgaW5pdF9lbmNvZGVfaW5mbyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvZW5jb2RlLWluZm8uanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jbGFzc2lmeV9jaGFyYWN0ZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9lbXBoYXNpcy5qcwpmdW5jdGlvbiBlbXBoYXNpcyhub2RlMiwgXzQsIHN0YXRlMTAsIGluZm8pIHsKICBjb25zdCBtYXJrZXIgPSBjaGVja0VtcGhhc2lzKHN0YXRlMTApOwogIGNvbnN0IGV4aXQzID0gc3RhdGUxMC5lbnRlcigiZW1waGFzaXMiKTsKICBjb25zdCB0cmFja2VyID0gc3RhdGUxMC5jcmVhdGVUcmFja2VyKGluZm8pOwogIGNvbnN0IGJlZm9yZSA9IHRyYWNrZXIubW92ZShtYXJrZXIpOwogIGxldCBiZXR3ZWVuMiA9IHRyYWNrZXIubW92ZSgKICAgIHN0YXRlMTAuY29udGFpbmVyUGhyYXNpbmcobm9kZTIsIHsKICAgICAgYWZ0ZXI6IG1hcmtlciwKICAgICAgYmVmb3JlLAogICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgfSkKICApOwogIGNvbnN0IGJldHdlZW5IZWFkID0gYmV0d2VlbjIuY2hhckNvZGVBdCgwKTsKICBjb25zdCBvcGVuID0gZW5jb2RlSW5mbygKICAgIGluZm8uYmVmb3JlLmNoYXJDb2RlQXQoaW5mby5iZWZvcmUubGVuZ3RoIC0gMSksCiAgICBiZXR3ZWVuSGVhZCwKICAgIG1hcmtlcgogICk7CiAgaWYgKG9wZW4uaW5zaWRlKSB7CiAgICBiZXR3ZWVuMiA9IGVuY29kZUNoYXJhY3RlclJlZmVyZW5jZShiZXR3ZWVuSGVhZCkgKyBiZXR3ZWVuMi5zbGljZSgxKTsKICB9CiAgY29uc3QgYmV0d2VlblRhaWwgPSBiZXR3ZWVuMi5jaGFyQ29kZUF0KGJldHdlZW4yLmxlbmd0aCAtIDEpOwogIGNvbnN0IGNsb3NlNyA9IGVuY29kZUluZm8oaW5mby5hZnRlci5jaGFyQ29kZUF0KDApLCBiZXR3ZWVuVGFpbCwgbWFya2VyKTsKICBpZiAoY2xvc2U3Lmluc2lkZSkgewogICAgYmV0d2VlbjIgPSBiZXR3ZWVuMi5zbGljZSgwLCAtMSkgKyBlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UoYmV0d2VlblRhaWwpOwogIH0KICBjb25zdCBhZnRlciA9IHRyYWNrZXIubW92ZShtYXJrZXIpOwogIGV4aXQzKCk7CiAgc3RhdGUxMC5hdHRlbnRpb25FbmNvZGVTdXJyb3VuZGluZ0luZm8gPSB7CiAgICBhZnRlcjogY2xvc2U3Lm91dHNpZGUsCiAgICBiZWZvcmU6IG9wZW4ub3V0c2lkZQogIH07CiAgcmV0dXJuIGJlZm9yZSArIGJldHdlZW4yICsgYWZ0ZXI7Cn0KZnVuY3Rpb24gZW1waGFzaXNQZWVrKF80LCBfMSwgc3RhdGUxMCkgewogIHJldHVybiBzdGF0ZTEwLm9wdGlvbnMuZW1waGFzaXMgfHwgIioiOwp9CnZhciBpbml0X2VtcGhhc2lzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2VtcGhhc2lzLmpzIigpIHsKICAgIGluaXRfY2hlY2tfZW1waGFzaXMoKTsKICAgIGluaXRfZW5jb2RlX2NoYXJhY3Rlcl9yZWZlcmVuY2UoKTsKICAgIGluaXRfZW5jb2RlX2luZm8oKTsKICAgIGVtcGhhc2lzLnBlZWsgPSBlbXBoYXNpc1BlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXZpc2l0QDUuMS4wL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0L2xpYi9pbmRleC5qcwpmdW5jdGlvbiB2aXNpdCh0cmVlLCB0ZXN0T3JWaXNpdG9yLCB2aXNpdG9yT3JSZXZlcnNlLCBtYXliZVJldmVyc2UpIHsKICBsZXQgcmV2ZXJzZTsKICBsZXQgdGVzdDsKICBsZXQgdmlzaXRvcjsKICBpZiAodHlwZW9mIHRlc3RPclZpc2l0b3IgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIHZpc2l0b3JPclJldmVyc2UgIT09ICJmdW5jdGlvbiIpIHsKICAgIHRlc3QgPSB2b2lkIDA7CiAgICB2aXNpdG9yID0gdGVzdE9yVmlzaXRvcjsKICAgIHJldmVyc2UgPSB2aXNpdG9yT3JSZXZlcnNlOwogIH0gZWxzZSB7CiAgICB0ZXN0ID0gdGVzdE9yVmlzaXRvcjsKICAgIHZpc2l0b3IgPSB2aXNpdG9yT3JSZXZlcnNlOwogICAgcmV2ZXJzZSA9IG1heWJlUmV2ZXJzZTsKICB9CiAgdmlzaXRQYXJlbnRzKHRyZWUsIHRlc3QsIG92ZXJsb2FkLCByZXZlcnNlKTsKICBmdW5jdGlvbiBvdmVybG9hZChub2RlMiwgcGFyZW50cykgewogICAgY29uc3QgcGFyZW50ID0gcGFyZW50c1twYXJlbnRzLmxlbmd0aCAtIDFdOwogICAgY29uc3QgaW5kZXgyID0gcGFyZW50ID8gcGFyZW50LmNoaWxkcmVuLmluZGV4T2Yobm9kZTIpIDogdm9pZCAwOwogICAgcmV0dXJuIHZpc2l0b3Iobm9kZTIsIGluZGV4MiwgcGFyZW50KTsKICB9Cn0KdmFyIGluaXRfbGliMTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXZpc2l0QDUuMS4wL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0L2xpYi9pbmRleC5qcyIoKSB7CiAgICBpbml0X3VuaXN0X3V0aWxfdmlzaXRfcGFyZW50cygpOwogICAgaW5pdF91bmlzdF91dGlsX3Zpc2l0X3BhcmVudHMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtdmlzaXRANS4xLjAvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQvaW5kZXguanMKdmFyIGluaXRfdW5pc3RfdXRpbF92aXNpdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtdmlzaXRANS4xLjAvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQvaW5kZXguanMiKCkgewogICAgaW5pdF9saWIxMigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1zdHJpbmdANC4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tc3RyaW5nL2xpYi9pbmRleC5qcwpmdW5jdGlvbiB0b1N0cmluZyh2YWx1ZTIsIG9wdGlvbnMpIHsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zOwogIGNvbnN0IGluY2x1ZGVJbWFnZUFsdCA9IHR5cGVvZiBzZXR0aW5ncy5pbmNsdWRlSW1hZ2VBbHQgPT09ICJib29sZWFuIiA/IHNldHRpbmdzLmluY2x1ZGVJbWFnZUFsdCA6IHRydWU7CiAgY29uc3QgaW5jbHVkZUh0bWwgPSB0eXBlb2Ygc2V0dGluZ3MuaW5jbHVkZUh0bWwgPT09ICJib29sZWFuIiA/IHNldHRpbmdzLmluY2x1ZGVIdG1sIDogdHJ1ZTsKICByZXR1cm4gb25lKHZhbHVlMiwgaW5jbHVkZUltYWdlQWx0LCBpbmNsdWRlSHRtbCk7Cn0KZnVuY3Rpb24gb25lKHZhbHVlMiwgaW5jbHVkZUltYWdlQWx0LCBpbmNsdWRlSHRtbCkgewogIGlmIChub2RlKHZhbHVlMikpIHsKICAgIGlmICgidmFsdWUiIGluIHZhbHVlMikgewogICAgICByZXR1cm4gdmFsdWUyLnR5cGUgPT09ICJodG1sIiAmJiAhaW5jbHVkZUh0bWwgPyAiIiA6IHZhbHVlMi52YWx1ZTsKICAgIH0KICAgIGlmIChpbmNsdWRlSW1hZ2VBbHQgJiYgImFsdCIgaW4gdmFsdWUyICYmIHZhbHVlMi5hbHQpIHsKICAgICAgcmV0dXJuIHZhbHVlMi5hbHQ7CiAgICB9CiAgICBpZiAoImNoaWxkcmVuIiBpbiB2YWx1ZTIpIHsKICAgICAgcmV0dXJuIGFsbCh2YWx1ZTIuY2hpbGRyZW4sIGluY2x1ZGVJbWFnZUFsdCwgaW5jbHVkZUh0bWwpOwogICAgfQogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZTIpKSB7CiAgICByZXR1cm4gYWxsKHZhbHVlMiwgaW5jbHVkZUltYWdlQWx0LCBpbmNsdWRlSHRtbCk7CiAgfQogIHJldHVybiAiIjsKfQpmdW5jdGlvbiBhbGwodmFsdWVzLCBpbmNsdWRlSW1hZ2VBbHQsIGluY2x1ZGVIdG1sKSB7CiAgY29uc3QgcmVzdWx0ID0gW107CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHZhbHVlcy5sZW5ndGgpIHsKICAgIHJlc3VsdFtpbmRleDJdID0gb25lKHZhbHVlc1tpbmRleDJdLCBpbmNsdWRlSW1hZ2VBbHQsIGluY2x1ZGVIdG1sKTsKICB9CiAgcmV0dXJuIHJlc3VsdC5qb2luKCIiKTsKfQpmdW5jdGlvbiBub2RlKHZhbHVlMikgewogIHJldHVybiBCb29sZWFuKHZhbHVlMiAmJiB0eXBlb2YgdmFsdWUyID09PSAib2JqZWN0Iik7Cn0KdmFyIGVtcHR5T3B0aW9uczsKdmFyIGluaXRfbGliMTMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLXN0cmluZ0A0LjAuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1zdHJpbmcvbGliL2luZGV4LmpzIigpIHsKICAgIGVtcHR5T3B0aW9ucyA9IHt9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1zdHJpbmdANC4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tc3RyaW5nL2luZGV4LmpzCnZhciBpbml0X21kYXN0X3V0aWxfdG9fc3RyaW5nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1zdHJpbmdANC4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tc3RyaW5nL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliMTMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvZm9ybWF0LWhlYWRpbmctYXMtc2V0ZXh0LmpzCmZ1bmN0aW9uIGZvcm1hdEhlYWRpbmdBc1NldGV4dChub2RlMiwgc3RhdGUxMCkgewogIGxldCBsaXRlcmFsV2l0aEJyZWFrID0gZmFsc2U7CiAgdmlzaXQobm9kZTIsIGZ1bmN0aW9uKG5vZGUzKSB7CiAgICBpZiAoInZhbHVlIiBpbiBub2RlMyAmJiAvXHI/XG58XHIvLnRlc3Qobm9kZTMudmFsdWUpIHx8IG5vZGUzLnR5cGUgPT09ICJicmVhayIpIHsKICAgICAgbGl0ZXJhbFdpdGhCcmVhayA9IHRydWU7CiAgICAgIHJldHVybiBFWElUOwogICAgfQogIH0pOwogIHJldHVybiBCb29sZWFuKAogICAgKCFub2RlMi5kZXB0aCB8fCBub2RlMi5kZXB0aCA8IDMpICYmIHRvU3RyaW5nKG5vZGUyKSAmJiAoc3RhdGUxMC5vcHRpb25zLnNldGV4dCB8fCBsaXRlcmFsV2l0aEJyZWFrKQogICk7Cn0KdmFyIGluaXRfZm9ybWF0X2hlYWRpbmdfYXNfc2V0ZXh0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9mb3JtYXQtaGVhZGluZy1hcy1zZXRleHQuanMiKCkgewogICAgaW5pdF91bmlzdF91dGlsX3Zpc2l0KCk7CiAgICBpbml0X21kYXN0X3V0aWxfdG9fc3RyaW5nKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvaGVhZGluZy5qcwpmdW5jdGlvbiBoZWFkaW5nKG5vZGUyLCBfNCwgc3RhdGUxMCwgaW5mbykgewogIGNvbnN0IHJhbmsgPSBNYXRoLm1heChNYXRoLm1pbig2LCBub2RlMi5kZXB0aCB8fCAxKSwgMSk7CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlMTAuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBpZiAoZm9ybWF0SGVhZGluZ0FzU2V0ZXh0KG5vZGUyLCBzdGF0ZTEwKSkgewogICAgY29uc3QgZXhpdDQgPSBzdGF0ZTEwLmVudGVyKCJoZWFkaW5nU2V0ZXh0Iik7CiAgICBjb25zdCBzdWJleGl0MiA9IHN0YXRlMTAuZW50ZXIoInBocmFzaW5nIik7CiAgICBjb25zdCB2YWx1ZTMgPSBzdGF0ZTEwLmNvbnRhaW5lclBocmFzaW5nKG5vZGUyLCB7CiAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpLAogICAgICBiZWZvcmU6ICJcbiIsCiAgICAgIGFmdGVyOiAiXG4iCiAgICB9KTsKICAgIHN1YmV4aXQyKCk7CiAgICBleGl0NCgpOwogICAgcmV0dXJuIHZhbHVlMyArICJcbiIgKyAocmFuayA9PT0gMSA/ICI9IiA6ICItIikucmVwZWF0KAogICAgICAvLyBUaGUgd2hvbGUgc2l6ZeKApgogICAgICB2YWx1ZTMubGVuZ3RoIC0gLy8gTWludXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGxhc3QgRU9MIChvcgogICAgICAvLyAwIGlmIHRoZXJlIGlzIG5vbmUp4oCmCiAgICAgIChNYXRoLm1heCh2YWx1ZTMubGFzdEluZGV4T2YoIlxyIiksIHZhbHVlMy5sYXN0SW5kZXhPZigiXG4iKSkgKyAxKQogICAgKTsKICB9CiAgY29uc3Qgc2VxdWVuY2UgPSAiIyIucmVwZWF0KHJhbmspOwogIGNvbnN0IGV4aXQzID0gc3RhdGUxMC5lbnRlcigiaGVhZGluZ0F0eCIpOwogIGNvbnN0IHN1YmV4aXQgPSBzdGF0ZTEwLmVudGVyKCJwaHJhc2luZyIpOwogIHRyYWNrZXIubW92ZShzZXF1ZW5jZSArICIgIik7CiAgbGV0IHZhbHVlMiA9IHN0YXRlMTAuY29udGFpbmVyUGhyYXNpbmcobm9kZTIsIHsKICAgIGJlZm9yZTogIiMgIiwKICAgIGFmdGVyOiAiXG4iLAogICAgLi4udHJhY2tlci5jdXJyZW50KCkKICB9KTsKICBpZiAoL15bXHQgXS8udGVzdCh2YWx1ZTIpKSB7CiAgICB2YWx1ZTIgPSBlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UodmFsdWUyLmNoYXJDb2RlQXQoMCkpICsgdmFsdWUyLnNsaWNlKDEpOwogIH0KICB2YWx1ZTIgPSB2YWx1ZTIgPyBzZXF1ZW5jZSArICIgIiArIHZhbHVlMiA6IHNlcXVlbmNlOwogIGlmIChzdGF0ZTEwLm9wdGlvbnMuY2xvc2VBdHgpIHsKICAgIHZhbHVlMiArPSAiICIgKyBzZXF1ZW5jZTsKICB9CiAgc3ViZXhpdCgpOwogIGV4aXQzKCk7CiAgcmV0dXJuIHZhbHVlMjsKfQp2YXIgaW5pdF9oZWFkaW5nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2hlYWRpbmcuanMiKCkgewogICAgaW5pdF9lbmNvZGVfY2hhcmFjdGVyX3JlZmVyZW5jZSgpOwogICAgaW5pdF9mb3JtYXRfaGVhZGluZ19hc19zZXRleHQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9odG1sLmpzCmZ1bmN0aW9uIGh0bWwobm9kZTIpIHsKICByZXR1cm4gbm9kZTIudmFsdWUgfHwgIiI7Cn0KZnVuY3Rpb24gaHRtbFBlZWsoKSB7CiAgcmV0dXJuICI8IjsKfQp2YXIgaW5pdF9odG1sID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2h0bWwuanMiKCkgewogICAgaHRtbC5wZWVrID0gaHRtbFBlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvaW1hZ2UuanMKZnVuY3Rpb24gaW1hZ2Uobm9kZTIsIF80LCBzdGF0ZTEwLCBpbmZvKSB7CiAgY29uc3QgcXVvdGUgPSBjaGVja1F1b3RlKHN0YXRlMTApOwogIGNvbnN0IHN1ZmZpeCA9IHF1b3RlID09PSAnIicgPyAiUXVvdGUiIDogIkFwb3N0cm9waGUiOwogIGNvbnN0IGV4aXQzID0gc3RhdGUxMC5lbnRlcigiaW1hZ2UiKTsKICBsZXQgc3ViZXhpdCA9IHN0YXRlMTAuZW50ZXIoImxhYmVsIik7CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlMTAuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBsZXQgdmFsdWUyID0gdHJhY2tlci5tb3ZlKCIhWyIpOwogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICBzdGF0ZTEwLnNhZmUobm9kZTIuYWx0LCB7IGJlZm9yZTogdmFsdWUyLCBhZnRlcjogIl0iLCAuLi50cmFja2VyLmN1cnJlbnQoKSB9KQogICk7CiAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiXSgiKTsKICBzdWJleGl0KCk7CiAgaWYgKAogICAgLy8gSWYgdGhlcmXigJlzIG5vIHVybCBidXQgdGhlcmUgaXMgYSB0aXRsZeKApgogICAgIW5vZGUyLnVybCAmJiBub2RlMi50aXRsZSB8fCAvLyBJZiB0aGVyZSBhcmUgY29udHJvbCBjaGFyYWN0ZXJzIG9yIHdoaXRlc3BhY2UuCiAgICAvW1wwLSBcdTAwN0ZdLy50ZXN0KG5vZGUyLnVybCkKICApIHsKICAgIHN1YmV4aXQgPSBzdGF0ZTEwLmVudGVyKCJkZXN0aW5hdGlvbkxpdGVyYWwiKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIjwiKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICAgIHN0YXRlMTAuc2FmZShub2RlMi51cmwsIHsgYmVmb3JlOiB2YWx1ZTIsIGFmdGVyOiAiPiIsIC4uLnRyYWNrZXIuY3VycmVudCgpIH0pCiAgICApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiPiIpOwogIH0gZWxzZSB7CiAgICBzdWJleGl0ID0gc3RhdGUxMC5lbnRlcigiZGVzdGluYXRpb25SYXciKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICAgIHN0YXRlMTAuc2FmZShub2RlMi51cmwsIHsKICAgICAgICBiZWZvcmU6IHZhbHVlMiwKICAgICAgICBhZnRlcjogbm9kZTIudGl0bGUgPyAiICIgOiAiKSIsCiAgICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgICAgfSkKICAgICk7CiAgfQogIHN1YmV4aXQoKTsKICBpZiAobm9kZTIudGl0bGUpIHsKICAgIHN1YmV4aXQgPSBzdGF0ZTEwLmVudGVyKGB0aXRsZSR7c3VmZml4fWApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiICIgKyBxdW90ZSk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZTEwLnNhZmUobm9kZTIudGl0bGUsIHsKICAgICAgICBiZWZvcmU6IHZhbHVlMiwKICAgICAgICBhZnRlcjogcXVvdGUsCiAgICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgICAgfSkKICAgICk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKHF1b3RlKTsKICAgIHN1YmV4aXQoKTsKICB9CiAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiKSIpOwogIGV4aXQzKCk7CiAgcmV0dXJuIHZhbHVlMjsKfQpmdW5jdGlvbiBpbWFnZVBlZWsoKSB7CiAgcmV0dXJuICIhIjsKfQp2YXIgaW5pdF9pbWFnZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9pbWFnZS5qcyIoKSB7CiAgICBpbml0X2NoZWNrX3F1b3RlKCk7CiAgICBpbWFnZS5wZWVrID0gaW1hZ2VQZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2ltYWdlLXJlZmVyZW5jZS5qcwpmdW5jdGlvbiBpbWFnZVJlZmVyZW5jZShub2RlMiwgXzQsIHN0YXRlMTAsIGluZm8pIHsKICBjb25zdCB0eXBlNSA9IG5vZGUyLnJlZmVyZW5jZVR5cGU7CiAgY29uc3QgZXhpdDMgPSBzdGF0ZTEwLmVudGVyKCJpbWFnZVJlZmVyZW5jZSIpOwogIGxldCBzdWJleGl0ID0gc3RhdGUxMC5lbnRlcigibGFiZWwiKTsKICBjb25zdCB0cmFja2VyID0gc3RhdGUxMC5jcmVhdGVUcmFja2VyKGluZm8pOwogIGxldCB2YWx1ZTIgPSB0cmFja2VyLm1vdmUoIiFbIik7CiAgY29uc3QgYWx0ID0gc3RhdGUxMC5zYWZlKG5vZGUyLmFsdCwgewogICAgYmVmb3JlOiB2YWx1ZTIsCiAgICBhZnRlcjogIl0iLAogICAgLi4udHJhY2tlci5jdXJyZW50KCkKICB9KTsKICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKGFsdCArICJdWyIpOwogIHN1YmV4aXQoKTsKICBjb25zdCBzdGFjayA9IHN0YXRlMTAuc3RhY2s7CiAgc3RhdGUxMC5zdGFjayA9IFtdOwogIHN1YmV4aXQgPSBzdGF0ZTEwLmVudGVyKCJyZWZlcmVuY2UiKTsKICBjb25zdCByZWZlcmVuY2UgPSBzdGF0ZTEwLnNhZmUoc3RhdGUxMC5hc3NvY2lhdGlvbklkKG5vZGUyKSwgewogICAgYmVmb3JlOiB2YWx1ZTIsCiAgICBhZnRlcjogIl0iLAogICAgLi4udHJhY2tlci5jdXJyZW50KCkKICB9KTsKICBzdWJleGl0KCk7CiAgc3RhdGUxMC5zdGFjayA9IHN0YWNrOwogIGV4aXQzKCk7CiAgaWYgKHR5cGU1ID09PSAiZnVsbCIgfHwgIWFsdCB8fCBhbHQgIT09IHJlZmVyZW5jZSkgewogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZShyZWZlcmVuY2UgKyAiXSIpOwogIH0gZWxzZSBpZiAodHlwZTUgPT09ICJzaG9ydGN1dCIpIHsKICAgIHZhbHVlMiA9IHZhbHVlMi5zbGljZSgwLCAtMSk7CiAgfSBlbHNlIHsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIl0iKTsKICB9CiAgcmV0dXJuIHZhbHVlMjsKfQpmdW5jdGlvbiBpbWFnZVJlZmVyZW5jZVBlZWsoKSB7CiAgcmV0dXJuICIhIjsKfQp2YXIgaW5pdF9pbWFnZV9yZWZlcmVuY2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvaW1hZ2UtcmVmZXJlbmNlLmpzIigpIHsKICAgIGltYWdlUmVmZXJlbmNlLnBlZWsgPSBpbWFnZVJlZmVyZW5jZVBlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvaW5saW5lLWNvZGUuanMKZnVuY3Rpb24gaW5saW5lQ29kZShub2RlMiwgXzQsIHN0YXRlMTApIHsKICBsZXQgdmFsdWUyID0gbm9kZTIudmFsdWUgfHwgIiI7CiAgbGV0IHNlcXVlbmNlID0gImAiOwogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAobmV3IFJlZ0V4cCgiKF58W15gXSkiICsgc2VxdWVuY2UgKyAiKFteYF18JCkiKS50ZXN0KHZhbHVlMikpIHsKICAgIHNlcXVlbmNlICs9ICJgIjsKICB9CiAgaWYgKC9bXiBcclxuXS8udGVzdCh2YWx1ZTIpICYmICgvXlsgXHJcbl0vLnRlc3QodmFsdWUyKSAmJiAvWyBcclxuXSQvLnRlc3QodmFsdWUyKSB8fCAvXmB8YCQvLnRlc3QodmFsdWUyKSkpIHsKICAgIHZhbHVlMiA9ICIgIiArIHZhbHVlMiArICIgIjsKICB9CiAgd2hpbGUgKCsraW5kZXgyIDwgc3RhdGUxMC51bnNhZmUubGVuZ3RoKSB7CiAgICBjb25zdCBwYXR0ZXJuID0gc3RhdGUxMC51bnNhZmVbaW5kZXgyXTsKICAgIGNvbnN0IGV4cHJlc3Npb24gPSBzdGF0ZTEwLmNvbXBpbGVQYXR0ZXJuKHBhdHRlcm4pOwogICAgbGV0IG1hdGNoMjsKICAgIGlmICghcGF0dGVybi5hdEJyZWFrKSBjb250aW51ZTsKICAgIHdoaWxlIChtYXRjaDIgPSBleHByZXNzaW9uLmV4ZWModmFsdWUyKSkgewogICAgICBsZXQgcG9zaXRpb24zID0gbWF0Y2gyLmluZGV4OwogICAgICBpZiAodmFsdWUyLmNoYXJDb2RlQXQocG9zaXRpb24zKSA9PT0gMTAgJiYgdmFsdWUyLmNoYXJDb2RlQXQocG9zaXRpb24zIC0gMSkgPT09IDEzKSB7CiAgICAgICAgcG9zaXRpb24zLS07CiAgICAgIH0KICAgICAgdmFsdWUyID0gdmFsdWUyLnNsaWNlKDAsIHBvc2l0aW9uMykgKyAiICIgKyB2YWx1ZTIuc2xpY2UobWF0Y2gyLmluZGV4ICsgMSk7CiAgICB9CiAgfQogIHJldHVybiBzZXF1ZW5jZSArIHZhbHVlMiArIHNlcXVlbmNlOwp9CmZ1bmN0aW9uIGlubGluZUNvZGVQZWVrKCkgewogIHJldHVybiAiYCI7Cn0KdmFyIGluaXRfaW5saW5lX2NvZGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvaW5saW5lLWNvZGUuanMiKCkgewogICAgaW5saW5lQ29kZS5wZWVrID0gaW5saW5lQ29kZVBlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2Zvcm1hdC1saW5rLWFzLWF1dG9saW5rLmpzCmZ1bmN0aW9uIGZvcm1hdExpbmtBc0F1dG9saW5rKG5vZGUyLCBzdGF0ZTEwKSB7CiAgY29uc3QgcmF3MiA9IHRvU3RyaW5nKG5vZGUyKTsKICByZXR1cm4gQm9vbGVhbigKICAgICFzdGF0ZTEwLm9wdGlvbnMucmVzb3VyY2VMaW5rICYmIC8vIElmIHRoZXJl4oCZcyBhIHVybOKApgogICAgbm9kZTIudXJsICYmIC8vIEFuZCB0aGVyZeKAmXMgYSBubyB0aXRsZeKApgogICAgIW5vZGUyLnRpdGxlICYmIC8vIEFuZCB0aGUgY29udGVudCBvZiBgbm9kZWAgaXMgYSBzaW5nbGUgdGV4dCBub2Rl4oCmCiAgICBub2RlMi5jaGlsZHJlbiAmJiBub2RlMi5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgbm9kZTIuY2hpbGRyZW5bMF0udHlwZSA9PT0gInRleHQiICYmIC8vIEFuZCBpZiB0aGUgdXJsIGlzIHRoZSBzYW1lIGFzIHRoZSBjb250ZW504oCmCiAgICAocmF3MiA9PT0gbm9kZTIudXJsIHx8ICJtYWlsdG86IiArIHJhdzIgPT09IG5vZGUyLnVybCkgJiYgLy8gQW5kIHRoYXQgc3RhcnRzIHcvIGEgcHJvdG9jb2zigKYKICAgIC9eW2Etel1bYS16Ky4tXSs6L2kudGVzdChub2RlMi51cmwpICYmIC8vIEFuZCB0aGF0IGRvZXNu4oCZdCBjb250YWluIEFTQ0lJIGNvbnRyb2wgY29kZXMgKGNoYXJhY3RlciBlc2NhcGVzIGFuZAogICAgLy8gcmVmZXJlbmNlcyBkb27igJl0IHdvcmspLCBzcGFjZSwgb3IgYW5nbGUgYnJhY2tldHPigKYKICAgICEvW1wwLSA8Plx1MDA3Rl0vLnRlc3Qobm9kZTIudXJsKQogICk7Cn0KdmFyIGluaXRfZm9ybWF0X2xpbmtfYXNfYXV0b2xpbmsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2Zvcm1hdC1saW5rLWFzLWF1dG9saW5rLmpzIigpIHsKICAgIGluaXRfbWRhc3RfdXRpbF90b19zdHJpbmcoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9saW5rLmpzCmZ1bmN0aW9uIGxpbmsobm9kZTIsIF80LCBzdGF0ZTEwLCBpbmZvKSB7CiAgY29uc3QgcXVvdGUgPSBjaGVja1F1b3RlKHN0YXRlMTApOwogIGNvbnN0IHN1ZmZpeCA9IHF1b3RlID09PSAnIicgPyAiUXVvdGUiIDogIkFwb3N0cm9waGUiOwogIGNvbnN0IHRyYWNrZXIgPSBzdGF0ZTEwLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgbGV0IGV4aXQzOwogIGxldCBzdWJleGl0OwogIGlmIChmb3JtYXRMaW5rQXNBdXRvbGluayhub2RlMiwgc3RhdGUxMCkpIHsKICAgIGNvbnN0IHN0YWNrID0gc3RhdGUxMC5zdGFjazsKICAgIHN0YXRlMTAuc3RhY2sgPSBbXTsKICAgIGV4aXQzID0gc3RhdGUxMC5lbnRlcigiYXV0b2xpbmsiKTsKICAgIGxldCB2YWx1ZTMgPSB0cmFja2VyLm1vdmUoIjwiKTsKICAgIHZhbHVlMyArPSB0cmFja2VyLm1vdmUoCiAgICAgIHN0YXRlMTAuY29udGFpbmVyUGhyYXNpbmcobm9kZTIsIHsKICAgICAgICBiZWZvcmU6IHZhbHVlMywKICAgICAgICBhZnRlcjogIj4iLAogICAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgICAgIH0pCiAgICApOwogICAgdmFsdWUzICs9IHRyYWNrZXIubW92ZSgiPiIpOwogICAgZXhpdDMoKTsKICAgIHN0YXRlMTAuc3RhY2sgPSBzdGFjazsKICAgIHJldHVybiB2YWx1ZTM7CiAgfQogIGV4aXQzID0gc3RhdGUxMC5lbnRlcigibGluayIpOwogIHN1YmV4aXQgPSBzdGF0ZTEwLmVudGVyKCJsYWJlbCIpOwogIGxldCB2YWx1ZTIgPSB0cmFja2VyLm1vdmUoIlsiKTsKICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgc3RhdGUxMC5jb250YWluZXJQaHJhc2luZyhub2RlMiwgewogICAgICBiZWZvcmU6IHZhbHVlMiwKICAgICAgYWZ0ZXI6ICJdKCIsCiAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgICB9KQogICk7CiAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiXSgiKTsKICBzdWJleGl0KCk7CiAgaWYgKAogICAgLy8gSWYgdGhlcmXigJlzIG5vIHVybCBidXQgdGhlcmUgaXMgYSB0aXRsZeKApgogICAgIW5vZGUyLnVybCAmJiBub2RlMi50aXRsZSB8fCAvLyBJZiB0aGVyZSBhcmUgY29udHJvbCBjaGFyYWN0ZXJzIG9yIHdoaXRlc3BhY2UuCiAgICAvW1wwLSBcdTAwN0ZdLy50ZXN0KG5vZGUyLnVybCkKICApIHsKICAgIHN1YmV4aXQgPSBzdGF0ZTEwLmVudGVyKCJkZXN0aW5hdGlvbkxpdGVyYWwiKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIjwiKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICAgIHN0YXRlMTAuc2FmZShub2RlMi51cmwsIHsgYmVmb3JlOiB2YWx1ZTIsIGFmdGVyOiAiPiIsIC4uLnRyYWNrZXIuY3VycmVudCgpIH0pCiAgICApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiPiIpOwogIH0gZWxzZSB7CiAgICBzdWJleGl0ID0gc3RhdGUxMC5lbnRlcigiZGVzdGluYXRpb25SYXciKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICAgIHN0YXRlMTAuc2FmZShub2RlMi51cmwsIHsKICAgICAgICBiZWZvcmU6IHZhbHVlMiwKICAgICAgICBhZnRlcjogbm9kZTIudGl0bGUgPyAiICIgOiAiKSIsCiAgICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgICAgfSkKICAgICk7CiAgfQogIHN1YmV4aXQoKTsKICBpZiAobm9kZTIudGl0bGUpIHsKICAgIHN1YmV4aXQgPSBzdGF0ZTEwLmVudGVyKGB0aXRsZSR7c3VmZml4fWApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiICIgKyBxdW90ZSk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZTEwLnNhZmUobm9kZTIudGl0bGUsIHsKICAgICAgICBiZWZvcmU6IHZhbHVlMiwKICAgICAgICBhZnRlcjogcXVvdGUsCiAgICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgICAgfSkKICAgICk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKHF1b3RlKTsKICAgIHN1YmV4aXQoKTsKICB9CiAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiKSIpOwogIGV4aXQzKCk7CiAgcmV0dXJuIHZhbHVlMjsKfQpmdW5jdGlvbiBsaW5rUGVlayhub2RlMiwgXzQsIHN0YXRlMTApIHsKICByZXR1cm4gZm9ybWF0TGlua0FzQXV0b2xpbmsobm9kZTIsIHN0YXRlMTApID8gIjwiIDogIlsiOwp9CnZhciBpbml0X2xpbmsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvbGluay5qcyIoKSB7CiAgICBpbml0X2NoZWNrX3F1b3RlKCk7CiAgICBpbml0X2Zvcm1hdF9saW5rX2FzX2F1dG9saW5rKCk7CiAgICBsaW5rLnBlZWsgPSBsaW5rUGVlazsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9saW5rLXJlZmVyZW5jZS5qcwpmdW5jdGlvbiBsaW5rUmVmZXJlbmNlKG5vZGUyLCBfNCwgc3RhdGUxMCwgaW5mbykgewogIGNvbnN0IHR5cGU1ID0gbm9kZTIucmVmZXJlbmNlVHlwZTsKICBjb25zdCBleGl0MyA9IHN0YXRlMTAuZW50ZXIoImxpbmtSZWZlcmVuY2UiKTsKICBsZXQgc3ViZXhpdCA9IHN0YXRlMTAuZW50ZXIoImxhYmVsIik7CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlMTAuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBsZXQgdmFsdWUyID0gdHJhY2tlci5tb3ZlKCJbIik7CiAgY29uc3QgdGV4dDkgPSBzdGF0ZTEwLmNvbnRhaW5lclBocmFzaW5nKG5vZGUyLCB7CiAgICBiZWZvcmU6IHZhbHVlMiwKICAgIGFmdGVyOiAiXSIsCiAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogIH0pOwogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUodGV4dDkgKyAiXVsiKTsKICBzdWJleGl0KCk7CiAgY29uc3Qgc3RhY2sgPSBzdGF0ZTEwLnN0YWNrOwogIHN0YXRlMTAuc3RhY2sgPSBbXTsKICBzdWJleGl0ID0gc3RhdGUxMC5lbnRlcigicmVmZXJlbmNlIik7CiAgY29uc3QgcmVmZXJlbmNlID0gc3RhdGUxMC5zYWZlKHN0YXRlMTAuYXNzb2NpYXRpb25JZChub2RlMiksIHsKICAgIGJlZm9yZTogdmFsdWUyLAogICAgYWZ0ZXI6ICJdIiwKICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgfSk7CiAgc3ViZXhpdCgpOwogIHN0YXRlMTAuc3RhY2sgPSBzdGFjazsKICBleGl0MygpOwogIGlmICh0eXBlNSA9PT0gImZ1bGwiIHx8ICF0ZXh0OSB8fCB0ZXh0OSAhPT0gcmVmZXJlbmNlKSB7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKHJlZmVyZW5jZSArICJdIik7CiAgfSBlbHNlIGlmICh0eXBlNSA9PT0gInNob3J0Y3V0IikgewogICAgdmFsdWUyID0gdmFsdWUyLnNsaWNlKDAsIC0xKTsKICB9IGVsc2UgewogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiXSIpOwogIH0KICByZXR1cm4gdmFsdWUyOwp9CmZ1bmN0aW9uIGxpbmtSZWZlcmVuY2VQZWVrKCkgewogIHJldHVybiAiWyI7Cn0KdmFyIGluaXRfbGlua19yZWZlcmVuY2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvbGluay1yZWZlcmVuY2UuanMiKCkgewogICAgbGlua1JlZmVyZW5jZS5wZWVrID0gbGlua1JlZmVyZW5jZVBlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLWJ1bGxldC5qcwpmdW5jdGlvbiBjaGVja0J1bGxldChzdGF0ZTEwKSB7CiAgY29uc3QgbWFya2VyID0gc3RhdGUxMC5vcHRpb25zLmJ1bGxldCB8fCAiKiI7CiAgaWYgKG1hcmtlciAhPT0gIioiICYmIG1hcmtlciAhPT0gIisiICYmIG1hcmtlciAhPT0gIi0iKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICJDYW5ub3Qgc2VyaWFsaXplIGl0ZW1zIHdpdGggYCIgKyBtYXJrZXIgKyAiYCBmb3IgYG9wdGlvbnMuYnVsbGV0YCwgZXhwZWN0ZWQgYCpgLCBgK2AsIG9yIGAtYCIKICAgICk7CiAgfQogIHJldHVybiBtYXJrZXI7Cn0KdmFyIGluaXRfY2hlY2tfYnVsbGV0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1idWxsZXQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1idWxsZXQtb3RoZXIuanMKZnVuY3Rpb24gY2hlY2tCdWxsZXRPdGhlcihzdGF0ZTEwKSB7CiAgY29uc3QgYnVsbGV0ID0gY2hlY2tCdWxsZXQoc3RhdGUxMCk7CiAgY29uc3QgYnVsbGV0T3RoZXIgPSBzdGF0ZTEwLm9wdGlvbnMuYnVsbGV0T3RoZXI7CiAgaWYgKCFidWxsZXRPdGhlcikgewogICAgcmV0dXJuIGJ1bGxldCA9PT0gIioiID8gIi0iIDogIioiOwogIH0KICBpZiAoYnVsbGV0T3RoZXIgIT09ICIqIiAmJiBidWxsZXRPdGhlciAhPT0gIisiICYmIGJ1bGxldE90aGVyICE9PSAiLSIpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgIkNhbm5vdCBzZXJpYWxpemUgaXRlbXMgd2l0aCBgIiArIGJ1bGxldE90aGVyICsgImAgZm9yIGBvcHRpb25zLmJ1bGxldE90aGVyYCwgZXhwZWN0ZWQgYCpgLCBgK2AsIG9yIGAtYCIKICAgICk7CiAgfQogIGlmIChidWxsZXRPdGhlciA9PT0gYnVsbGV0KSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICJFeHBlY3RlZCBgYnVsbGV0YCAoYCIgKyBidWxsZXQgKyAiYCkgYW5kIGBidWxsZXRPdGhlcmAgKGAiICsgYnVsbGV0T3RoZXIgKyAiYCkgdG8gYmUgZGlmZmVyZW50IgogICAgKTsKICB9CiAgcmV0dXJuIGJ1bGxldE90aGVyOwp9CnZhciBpbml0X2NoZWNrX2J1bGxldF9vdGhlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stYnVsbGV0LW90aGVyLmpzIigpIHsKICAgIGluaXRfY2hlY2tfYnVsbGV0KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLWJ1bGxldC1vcmRlcmVkLmpzCmZ1bmN0aW9uIGNoZWNrQnVsbGV0T3JkZXJlZChzdGF0ZTEwKSB7CiAgY29uc3QgbWFya2VyID0gc3RhdGUxMC5vcHRpb25zLmJ1bGxldE9yZGVyZWQgfHwgIi4iOwogIGlmIChtYXJrZXIgIT09ICIuIiAmJiBtYXJrZXIgIT09ICIpIikgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAiQ2Fubm90IHNlcmlhbGl6ZSBpdGVtcyB3aXRoIGAiICsgbWFya2VyICsgImAgZm9yIGBvcHRpb25zLmJ1bGxldE9yZGVyZWRgLCBleHBlY3RlZCBgLmAgb3IgYClgIgogICAgKTsKICB9CiAgcmV0dXJuIG1hcmtlcjsKfQp2YXIgaW5pdF9jaGVja19idWxsZXRfb3JkZXJlZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stYnVsbGV0LW9yZGVyZWQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1ydWxlLmpzCmZ1bmN0aW9uIGNoZWNrUnVsZShzdGF0ZTEwKSB7CiAgY29uc3QgbWFya2VyID0gc3RhdGUxMC5vcHRpb25zLnJ1bGUgfHwgIioiOwogIGlmIChtYXJrZXIgIT09ICIqIiAmJiBtYXJrZXIgIT09ICItIiAmJiBtYXJrZXIgIT09ICJfIikgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAiQ2Fubm90IHNlcmlhbGl6ZSBydWxlcyB3aXRoIGAiICsgbWFya2VyICsgImAgZm9yIGBvcHRpb25zLnJ1bGVgLCBleHBlY3RlZCBgKmAsIGAtYCwgb3IgYF9gIgogICAgKTsKICB9CiAgcmV0dXJuIG1hcmtlcjsKfQp2YXIgaW5pdF9jaGVja19ydWxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1ydWxlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9saXN0LmpzCmZ1bmN0aW9uIGxpc3QyKG5vZGUyLCBwYXJlbnQsIHN0YXRlMTAsIGluZm8pIHsKICBjb25zdCBleGl0MyA9IHN0YXRlMTAuZW50ZXIoImxpc3QiKTsKICBjb25zdCBidWxsZXRDdXJyZW50ID0gc3RhdGUxMC5idWxsZXRDdXJyZW50OwogIGxldCBidWxsZXQgPSBub2RlMi5vcmRlcmVkID8gY2hlY2tCdWxsZXRPcmRlcmVkKHN0YXRlMTApIDogY2hlY2tCdWxsZXQoc3RhdGUxMCk7CiAgY29uc3QgYnVsbGV0T3RoZXIgPSBub2RlMi5vcmRlcmVkID8gYnVsbGV0ID09PSAiLiIgPyAiKSIgOiAiLiIgOiBjaGVja0J1bGxldE90aGVyKHN0YXRlMTApOwogIGxldCB1c2VEaWZmZXJlbnRNYXJrZXIgPSBwYXJlbnQgJiYgc3RhdGUxMC5idWxsZXRMYXN0VXNlZCA/IGJ1bGxldCA9PT0gc3RhdGUxMC5idWxsZXRMYXN0VXNlZCA6IGZhbHNlOwogIGlmICghbm9kZTIub3JkZXJlZCkgewogICAgY29uc3QgZmlyc3RMaXN0SXRlbSA9IG5vZGUyLmNoaWxkcmVuID8gbm9kZTIuY2hpbGRyZW5bMF0gOiB2b2lkIDA7CiAgICBpZiAoCiAgICAgIC8vIEJ1bGxldCBjb3VsZCBiZSB1c2VkIGFzIGEgdGhlbWF0aWMgYnJlYWsgbWFya2VyOgogICAgICAoYnVsbGV0ID09PSAiKiIgfHwgYnVsbGV0ID09PSAiLSIpICYmIC8vIEVtcHR5IGZpcnN0IGxpc3QgaXRlbToKICAgICAgZmlyc3RMaXN0SXRlbSAmJiAoIWZpcnN0TGlzdEl0ZW0uY2hpbGRyZW4gfHwgIWZpcnN0TGlzdEl0ZW0uY2hpbGRyZW5bMF0pICYmIC8vIERpcmVjdGx5IGluIHR3byBvdGhlciBsaXN0IGl0ZW1zOgogICAgICBzdGF0ZTEwLnN0YWNrW3N0YXRlMTAuc3RhY2subGVuZ3RoIC0gMV0gPT09ICJsaXN0IiAmJiBzdGF0ZTEwLnN0YWNrW3N0YXRlMTAuc3RhY2subGVuZ3RoIC0gMl0gPT09ICJsaXN0SXRlbSIgJiYgc3RhdGUxMC5zdGFja1tzdGF0ZTEwLnN0YWNrLmxlbmd0aCAtIDNdID09PSAibGlzdCIgJiYgc3RhdGUxMC5zdGFja1tzdGF0ZTEwLnN0YWNrLmxlbmd0aCAtIDRdID09PSAibGlzdEl0ZW0iICYmIC8vIFRoYXQgYXJlIGVhY2ggdGhlIGZpcnN0IGNoaWxkLgogICAgICBzdGF0ZTEwLmluZGV4U3RhY2tbc3RhdGUxMC5pbmRleFN0YWNrLmxlbmd0aCAtIDFdID09PSAwICYmIHN0YXRlMTAuaW5kZXhTdGFja1tzdGF0ZTEwLmluZGV4U3RhY2subGVuZ3RoIC0gMl0gPT09IDAgJiYgc3RhdGUxMC5pbmRleFN0YWNrW3N0YXRlMTAuaW5kZXhTdGFjay5sZW5ndGggLSAzXSA9PT0gMAogICAgKSB7CiAgICAgIHVzZURpZmZlcmVudE1hcmtlciA9IHRydWU7CiAgICB9CiAgICBpZiAoY2hlY2tSdWxlKHN0YXRlMTApID09PSBidWxsZXQgJiYgZmlyc3RMaXN0SXRlbSkgewogICAgICBsZXQgaW5kZXgyID0gLTE7CiAgICAgIHdoaWxlICgrK2luZGV4MiA8IG5vZGUyLmNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgIGNvbnN0IGl0ZW0gPSBub2RlMi5jaGlsZHJlbltpbmRleDJdOwogICAgICAgIGlmIChpdGVtICYmIGl0ZW0udHlwZSA9PT0gImxpc3RJdGVtIiAmJiBpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW5bMF0gJiYgaXRlbS5jaGlsZHJlblswXS50eXBlID09PSAidGhlbWF0aWNCcmVhayIpIHsKICAgICAgICAgIHVzZURpZmZlcmVudE1hcmtlciA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKHVzZURpZmZlcmVudE1hcmtlcikgewogICAgYnVsbGV0ID0gYnVsbGV0T3RoZXI7CiAgfQogIHN0YXRlMTAuYnVsbGV0Q3VycmVudCA9IGJ1bGxldDsKICBjb25zdCB2YWx1ZTIgPSBzdGF0ZTEwLmNvbnRhaW5lckZsb3cobm9kZTIsIGluZm8pOwogIHN0YXRlMTAuYnVsbGV0TGFzdFVzZWQgPSBidWxsZXQ7CiAgc3RhdGUxMC5idWxsZXRDdXJyZW50ID0gYnVsbGV0Q3VycmVudDsKICBleGl0MygpOwogIHJldHVybiB2YWx1ZTI7Cn0KdmFyIGluaXRfbGlzdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9saXN0LmpzIigpIHsKICAgIGluaXRfY2hlY2tfYnVsbGV0KCk7CiAgICBpbml0X2NoZWNrX2J1bGxldF9vdGhlcigpOwogICAgaW5pdF9jaGVja19idWxsZXRfb3JkZXJlZCgpOwogICAgaW5pdF9jaGVja19ydWxlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLWxpc3QtaXRlbS1pbmRlbnQuanMKZnVuY3Rpb24gY2hlY2tMaXN0SXRlbUluZGVudChzdGF0ZTEwKSB7CiAgY29uc3Qgc3R5bGUgPSBzdGF0ZTEwLm9wdGlvbnMubGlzdEl0ZW1JbmRlbnQgfHwgIm9uZSI7CiAgaWYgKHN0eWxlICE9PSAidGFiIiAmJiBzdHlsZSAhPT0gIm9uZSIgJiYgc3R5bGUgIT09ICJtaXhlZCIpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgIkNhbm5vdCBzZXJpYWxpemUgaXRlbXMgd2l0aCBgIiArIHN0eWxlICsgImAgZm9yIGBvcHRpb25zLmxpc3RJdGVtSW5kZW50YCwgZXhwZWN0ZWQgYHRhYmAsIGBvbmVgLCBvciBgbWl4ZWRgIgogICAgKTsKICB9CiAgcmV0dXJuIHN0eWxlOwp9CnZhciBpbml0X2NoZWNrX2xpc3RfaXRlbV9pbmRlbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLWxpc3QtaXRlbS1pbmRlbnQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2xpc3QtaXRlbS5qcwpmdW5jdGlvbiBsaXN0SXRlbShub2RlMiwgcGFyZW50LCBzdGF0ZTEwLCBpbmZvKSB7CiAgY29uc3QgbGlzdEl0ZW1JbmRlbnQgPSBjaGVja0xpc3RJdGVtSW5kZW50KHN0YXRlMTApOwogIGxldCBidWxsZXQgPSBzdGF0ZTEwLmJ1bGxldEN1cnJlbnQgfHwgY2hlY2tCdWxsZXQoc3RhdGUxMCk7CiAgaWYgKHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PT0gImxpc3QiICYmIHBhcmVudC5vcmRlcmVkKSB7CiAgICBidWxsZXQgPSAodHlwZW9mIHBhcmVudC5zdGFydCA9PT0gIm51bWJlciIgJiYgcGFyZW50LnN0YXJ0ID4gLTEgPyBwYXJlbnQuc3RhcnQgOiAxKSArIChzdGF0ZTEwLm9wdGlvbnMuaW5jcmVtZW50TGlzdE1hcmtlciA9PT0gZmFsc2UgPyAwIDogcGFyZW50LmNoaWxkcmVuLmluZGV4T2Yobm9kZTIpKSArIGJ1bGxldDsKICB9CiAgbGV0IHNpemUgPSBidWxsZXQubGVuZ3RoICsgMTsKICBpZiAobGlzdEl0ZW1JbmRlbnQgPT09ICJ0YWIiIHx8IGxpc3RJdGVtSW5kZW50ID09PSAibWl4ZWQiICYmIChwYXJlbnQgJiYgcGFyZW50LnR5cGUgPT09ICJsaXN0IiAmJiBwYXJlbnQuc3ByZWFkIHx8IG5vZGUyLnNwcmVhZCkpIHsKICAgIHNpemUgPSBNYXRoLmNlaWwoc2l6ZSAvIDQpICogNDsKICB9CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlMTAuY3JlYXRlVHJhY2tlcihpbmZvKTsKICB0cmFja2VyLm1vdmUoYnVsbGV0ICsgIiAiLnJlcGVhdChzaXplIC0gYnVsbGV0Lmxlbmd0aCkpOwogIHRyYWNrZXIuc2hpZnQoc2l6ZSk7CiAgY29uc3QgZXhpdDMgPSBzdGF0ZTEwLmVudGVyKCJsaXN0SXRlbSIpOwogIGNvbnN0IHZhbHVlMiA9IHN0YXRlMTAuaW5kZW50TGluZXMoCiAgICBzdGF0ZTEwLmNvbnRhaW5lckZsb3cobm9kZTIsIHRyYWNrZXIuY3VycmVudCgpKSwKICAgIG1hcDcKICApOwogIGV4aXQzKCk7CiAgcmV0dXJuIHZhbHVlMjsKICBmdW5jdGlvbiBtYXA3KGxpbmUsIGluZGV4MiwgYmxhbmspIHsKICAgIGlmIChpbmRleDIpIHsKICAgICAgcmV0dXJuIChibGFuayA/ICIiIDogIiAiLnJlcGVhdChzaXplKSkgKyBsaW5lOwogICAgfQogICAgcmV0dXJuIChibGFuayA/IGJ1bGxldCA6IGJ1bGxldCArICIgIi5yZXBlYXQoc2l6ZSAtIGJ1bGxldC5sZW5ndGgpKSArIGxpbmU7CiAgfQp9CnZhciBpbml0X2xpc3RfaXRlbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9saXN0LWl0ZW0uanMiKCkgewogICAgaW5pdF9jaGVja19idWxsZXQoKTsKICAgIGluaXRfY2hlY2tfbGlzdF9pdGVtX2luZGVudCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL3BhcmFncmFwaC5qcwpmdW5jdGlvbiBwYXJhZ3JhcGgobm9kZTIsIF80LCBzdGF0ZTEwLCBpbmZvKSB7CiAgY29uc3QgZXhpdDMgPSBzdGF0ZTEwLmVudGVyKCJwYXJhZ3JhcGgiKTsKICBjb25zdCBzdWJleGl0ID0gc3RhdGUxMC5lbnRlcigicGhyYXNpbmciKTsKICBjb25zdCB2YWx1ZTIgPSBzdGF0ZTEwLmNvbnRhaW5lclBocmFzaW5nKG5vZGUyLCBpbmZvKTsKICBzdWJleGl0KCk7CiAgZXhpdDMoKTsKICByZXR1cm4gdmFsdWUyOwp9CnZhciBpbml0X3BhcmFncmFwaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9wYXJhZ3JhcGguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1waHJhc2luZ0A0LjEuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1waHJhc2luZy9saWIvaW5kZXguanMKdmFyIHBocmFzaW5nOwp2YXIgaW5pdF9saWIxNCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtcGhyYXNpbmdANC4xLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtcGhyYXNpbmcvbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfdW5pc3RfdXRpbF9pcygpOwogICAgcGhyYXNpbmcgPSAvKiogQHR5cGUgeyhub2RlPzogdW5rbm93bikgPT4gbm9kZSBpcyBFeGNsdWRlPFBocmFzaW5nQ29udGVudCwgSHRtbD59ICovCiAgICBjb252ZXJ0KFsKICAgICAgImJyZWFrIiwKICAgICAgImRlbGV0ZSIsCiAgICAgICJlbXBoYXNpcyIsCiAgICAgIC8vIFRvIGRvOiBuZXh0IG1ham9yOiByZW1vdmVkIHNpbmNlIGZvb3Rub3RlcyB3ZXJlIGFkZGVkIHRvIEdGTS4KICAgICAgImZvb3Rub3RlIiwKICAgICAgImZvb3Rub3RlUmVmZXJlbmNlIiwKICAgICAgImltYWdlIiwKICAgICAgImltYWdlUmVmZXJlbmNlIiwKICAgICAgImlubGluZUNvZGUiLAogICAgICAvLyBFbmFibGVkIGJ5IGBtZGFzdC11dGlsLW1hdGhgOgogICAgICAiaW5saW5lTWF0aCIsCiAgICAgICJsaW5rIiwKICAgICAgImxpbmtSZWZlcmVuY2UiLAogICAgICAvLyBFbmFibGVkIGJ5IGBtZGFzdC11dGlsLW1keGA6CiAgICAgICJtZHhKc3hUZXh0RWxlbWVudCIsCiAgICAgIC8vIEVuYWJsZWQgYnkgYG1kYXN0LXV0aWwtbWR4YDoKICAgICAgIm1keFRleHRFeHByZXNzaW9uIiwKICAgICAgInN0cm9uZyIsCiAgICAgICJ0ZXh0IiwKICAgICAgLy8gRW5hYmxlZCBieSBgbWRhc3QtdXRpbC1kaXJlY3RpdmVgOgogICAgICAidGV4dERpcmVjdGl2ZSIKICAgIF0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1waHJhc2luZ0A0LjEuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1waHJhc2luZy9pbmRleC5qcwp2YXIgaW5pdF9tZGFzdF91dGlsX3BocmFzaW5nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1waHJhc2luZ0A0LjEuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1waHJhc2luZy9pbmRleC5qcyIoKSB7CiAgICBpbml0X2xpYjE0KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvcm9vdC5qcwpmdW5jdGlvbiByb290KG5vZGUyLCBfNCwgc3RhdGUxMCwgaW5mbykgewogIGNvbnN0IGhhc1BocmFzaW5nID0gbm9kZTIuY2hpbGRyZW4uc29tZShmdW5jdGlvbihkNikgewogICAgcmV0dXJuIHBocmFzaW5nKGQ2KTsKICB9KTsKICBjb25zdCBjb250YWluZXIgPSBoYXNQaHJhc2luZyA/IHN0YXRlMTAuY29udGFpbmVyUGhyYXNpbmcgOiBzdGF0ZTEwLmNvbnRhaW5lckZsb3c7CiAgcmV0dXJuIGNvbnRhaW5lci5jYWxsKHN0YXRlMTAsIG5vZGUyLCBpbmZvKTsKfQp2YXIgaW5pdF9yb290ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL3Jvb3QuanMiKCkgewogICAgaW5pdF9tZGFzdF91dGlsX3BocmFzaW5nKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLXN0cm9uZy5qcwpmdW5jdGlvbiBjaGVja1N0cm9uZyhzdGF0ZTEwKSB7CiAgY29uc3QgbWFya2VyID0gc3RhdGUxMC5vcHRpb25zLnN0cm9uZyB8fCAiKiI7CiAgaWYgKG1hcmtlciAhPT0gIioiICYmIG1hcmtlciAhPT0gIl8iKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICJDYW5ub3Qgc2VyaWFsaXplIHN0cm9uZyB3aXRoIGAiICsgbWFya2VyICsgImAgZm9yIGBvcHRpb25zLnN0cm9uZ2AsIGV4cGVjdGVkIGAqYCwgb3IgYF9gIgogICAgKTsKICB9CiAgcmV0dXJuIG1hcmtlcjsKfQp2YXIgaW5pdF9jaGVja19zdHJvbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLXN0cm9uZy5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvc3Ryb25nLmpzCmZ1bmN0aW9uIHN0cm9uZyhub2RlMiwgXzQsIHN0YXRlMTAsIGluZm8pIHsKICBjb25zdCBtYXJrZXIgPSBjaGVja1N0cm9uZyhzdGF0ZTEwKTsKICBjb25zdCBleGl0MyA9IHN0YXRlMTAuZW50ZXIoInN0cm9uZyIpOwogIGNvbnN0IHRyYWNrZXIgPSBzdGF0ZTEwLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgY29uc3QgYmVmb3JlID0gdHJhY2tlci5tb3ZlKG1hcmtlciArIG1hcmtlcik7CiAgbGV0IGJldHdlZW4yID0gdHJhY2tlci5tb3ZlKAogICAgc3RhdGUxMC5jb250YWluZXJQaHJhc2luZyhub2RlMiwgewogICAgICBhZnRlcjogbWFya2VyLAogICAgICBiZWZvcmUsCiAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgICB9KQogICk7CiAgY29uc3QgYmV0d2VlbkhlYWQgPSBiZXR3ZWVuMi5jaGFyQ29kZUF0KDApOwogIGNvbnN0IG9wZW4gPSBlbmNvZGVJbmZvKAogICAgaW5mby5iZWZvcmUuY2hhckNvZGVBdChpbmZvLmJlZm9yZS5sZW5ndGggLSAxKSwKICAgIGJldHdlZW5IZWFkLAogICAgbWFya2VyCiAgKTsKICBpZiAob3Blbi5pbnNpZGUpIHsKICAgIGJldHdlZW4yID0gZW5jb2RlQ2hhcmFjdGVyUmVmZXJlbmNlKGJldHdlZW5IZWFkKSArIGJldHdlZW4yLnNsaWNlKDEpOwogIH0KICBjb25zdCBiZXR3ZWVuVGFpbCA9IGJldHdlZW4yLmNoYXJDb2RlQXQoYmV0d2VlbjIubGVuZ3RoIC0gMSk7CiAgY29uc3QgY2xvc2U3ID0gZW5jb2RlSW5mbyhpbmZvLmFmdGVyLmNoYXJDb2RlQXQoMCksIGJldHdlZW5UYWlsLCBtYXJrZXIpOwogIGlmIChjbG9zZTcuaW5zaWRlKSB7CiAgICBiZXR3ZWVuMiA9IGJldHdlZW4yLnNsaWNlKDAsIC0xKSArIGVuY29kZUNoYXJhY3RlclJlZmVyZW5jZShiZXR3ZWVuVGFpbCk7CiAgfQogIGNvbnN0IGFmdGVyID0gdHJhY2tlci5tb3ZlKG1hcmtlciArIG1hcmtlcik7CiAgZXhpdDMoKTsKICBzdGF0ZTEwLmF0dGVudGlvbkVuY29kZVN1cnJvdW5kaW5nSW5mbyA9IHsKICAgIGFmdGVyOiBjbG9zZTcub3V0c2lkZSwKICAgIGJlZm9yZTogb3Blbi5vdXRzaWRlCiAgfTsKICByZXR1cm4gYmVmb3JlICsgYmV0d2VlbjIgKyBhZnRlcjsKfQpmdW5jdGlvbiBzdHJvbmdQZWVrKF80LCBfMSwgc3RhdGUxMCkgewogIHJldHVybiBzdGF0ZTEwLm9wdGlvbnMuc3Ryb25nIHx8ICIqIjsKfQp2YXIgaW5pdF9zdHJvbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvc3Ryb25nLmpzIigpIHsKICAgIGluaXRfY2hlY2tfc3Ryb25nKCk7CiAgICBpbml0X2VuY29kZV9jaGFyYWN0ZXJfcmVmZXJlbmNlKCk7CiAgICBpbml0X2VuY29kZV9pbmZvKCk7CiAgICBzdHJvbmcucGVlayA9IHN0cm9uZ1BlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvdGV4dC5qcwpmdW5jdGlvbiB0ZXh0KG5vZGUyLCBfNCwgc3RhdGUxMCwgaW5mbykgewogIHJldHVybiBzdGF0ZTEwLnNhZmUobm9kZTIudmFsdWUsIGluZm8pOwp9CnZhciBpbml0X3RleHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvdGV4dC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLXJ1bGUtcmVwZXRpdGlvbi5qcwpmdW5jdGlvbiBjaGVja1J1bGVSZXBldGl0aW9uKHN0YXRlMTApIHsKICBjb25zdCByZXBldGl0aW9uID0gc3RhdGUxMC5vcHRpb25zLnJ1bGVSZXBldGl0aW9uIHx8IDM7CiAgaWYgKHJlcGV0aXRpb24gPCAzKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICJDYW5ub3Qgc2VyaWFsaXplIHJ1bGVzIHdpdGggcmVwZXRpdGlvbiBgIiArIHJlcGV0aXRpb24gKyAiYCBmb3IgYG9wdGlvbnMucnVsZVJlcGV0aXRpb25gLCBleHBlY3RlZCBgM2Agb3IgbW9yZSIKICAgICk7CiAgfQogIHJldHVybiByZXBldGl0aW9uOwp9CnZhciBpbml0X2NoZWNrX3J1bGVfcmVwZXRpdGlvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stcnVsZS1yZXBldGl0aW9uLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS90aGVtYXRpYy1icmVhay5qcwpmdW5jdGlvbiB0aGVtYXRpY0JyZWFrKF80LCBfMSwgc3RhdGUxMCkgewogIGNvbnN0IHZhbHVlMiA9IChjaGVja1J1bGUoc3RhdGUxMCkgKyAoc3RhdGUxMC5vcHRpb25zLnJ1bGVTcGFjZXMgPyAiICIgOiAiIikpLnJlcGVhdChjaGVja1J1bGVSZXBldGl0aW9uKHN0YXRlMTApKTsKICByZXR1cm4gc3RhdGUxMC5vcHRpb25zLnJ1bGVTcGFjZXMgPyB2YWx1ZTIuc2xpY2UoMCwgLTEpIDogdmFsdWUyOwp9CnZhciBpbml0X3RoZW1hdGljX2JyZWFrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL3RoZW1hdGljLWJyZWFrLmpzIigpIHsKICAgIGluaXRfY2hlY2tfcnVsZV9yZXBldGl0aW9uKCk7CiAgICBpbml0X2NoZWNrX3J1bGUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9pbmRleC5qcwp2YXIgaGFuZGxlOwp2YXIgaW5pdF9oYW5kbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvaW5kZXguanMiKCkgewogICAgaW5pdF9ibG9ja3F1b3RlKCk7CiAgICBpbml0X2JyZWFrKCk7CiAgICBpbml0X2NvZGUoKTsKICAgIGluaXRfZGVmaW5pdGlvbigpOwogICAgaW5pdF9lbXBoYXNpcygpOwogICAgaW5pdF9oZWFkaW5nKCk7CiAgICBpbml0X2h0bWwoKTsKICAgIGluaXRfaW1hZ2UoKTsKICAgIGluaXRfaW1hZ2VfcmVmZXJlbmNlKCk7CiAgICBpbml0X2lubGluZV9jb2RlKCk7CiAgICBpbml0X2xpbmsoKTsKICAgIGluaXRfbGlua19yZWZlcmVuY2UoKTsKICAgIGluaXRfbGlzdCgpOwogICAgaW5pdF9saXN0X2l0ZW0oKTsKICAgIGluaXRfcGFyYWdyYXBoKCk7CiAgICBpbml0X3Jvb3QoKTsKICAgIGluaXRfc3Ryb25nKCk7CiAgICBpbml0X3RleHQoKTsKICAgIGluaXRfdGhlbWF0aWNfYnJlYWsoKTsKICAgIGhhbmRsZSA9IHsKICAgICAgYmxvY2txdW90ZSwKICAgICAgYnJlYWs6IGhhcmRCcmVhaywKICAgICAgY29kZSwKICAgICAgZGVmaW5pdGlvbiwKICAgICAgZW1waGFzaXMsCiAgICAgIGhhcmRCcmVhaywKICAgICAgaGVhZGluZywKICAgICAgaHRtbCwKICAgICAgaW1hZ2UsCiAgICAgIGltYWdlUmVmZXJlbmNlLAogICAgICBpbmxpbmVDb2RlLAogICAgICBsaW5rLAogICAgICBsaW5rUmVmZXJlbmNlLAogICAgICBsaXN0OiBsaXN0MiwKICAgICAgbGlzdEl0ZW0sCiAgICAgIHBhcmFncmFwaCwKICAgICAgcm9vdCwKICAgICAgc3Ryb25nLAogICAgICB0ZXh0LAogICAgICB0aGVtYXRpY0JyZWFrCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvam9pbi5qcwpmdW5jdGlvbiBqb2luRGVmYXVsdHMobGVmdCwgcmlnaHQsIHBhcmVudCwgc3RhdGUxMCkgewogIGlmIChyaWdodC50eXBlID09PSAiY29kZSIgJiYgZm9ybWF0Q29kZUFzSW5kZW50ZWQocmlnaHQsIHN0YXRlMTApICYmIChsZWZ0LnR5cGUgPT09ICJsaXN0IiB8fCBsZWZ0LnR5cGUgPT09IHJpZ2h0LnR5cGUgJiYgZm9ybWF0Q29kZUFzSW5kZW50ZWQobGVmdCwgc3RhdGUxMCkpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmICgic3ByZWFkIiBpbiBwYXJlbnQgJiYgdHlwZW9mIHBhcmVudC5zcHJlYWQgPT09ICJib29sZWFuIikgewogICAgaWYgKGxlZnQudHlwZSA9PT0gInBhcmFncmFwaCIgJiYgLy8gVHdvIHBhcmFncmFwaHMuCiAgICAobGVmdC50eXBlID09PSByaWdodC50eXBlIHx8IHJpZ2h0LnR5cGUgPT09ICJkZWZpbml0aW9uIiB8fCAvLyBQYXJhZ3JhcGggZm9sbG93ZWQgYnkgYSBzZXRleHQgaGVhZGluZy4KICAgIHJpZ2h0LnR5cGUgPT09ICJoZWFkaW5nIiAmJiBmb3JtYXRIZWFkaW5nQXNTZXRleHQocmlnaHQsIHN0YXRlMTApKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICByZXR1cm4gcGFyZW50LnNwcmVhZCA/IDEgOiAwOwogIH0KfQp2YXIgam9pbjI7CnZhciBpbml0X2pvaW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9qb2luLmpzIigpIHsKICAgIGluaXRfZm9ybWF0X2NvZGVfYXNfaW5kZW50ZWQoKTsKICAgIGluaXRfZm9ybWF0X2hlYWRpbmdfYXNfc2V0ZXh0KCk7CiAgICBqb2luMiA9IFtqb2luRGVmYXVsdHNdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdW5zYWZlLmpzCnZhciBmdWxsUGhyYXNpbmdTcGFucywgdW5zYWZlOwp2YXIgaW5pdF91bnNhZmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91bnNhZmUuanMiKCkgewogICAgZnVsbFBocmFzaW5nU3BhbnMgPSBbCiAgICAgICJhdXRvbGluayIsCiAgICAgICJkZXN0aW5hdGlvbkxpdGVyYWwiLAogICAgICAiZGVzdGluYXRpb25SYXciLAogICAgICAicmVmZXJlbmNlIiwKICAgICAgInRpdGxlUXVvdGUiLAogICAgICAidGl0bGVBcG9zdHJvcGhlIgogICAgXTsKICAgIHVuc2FmZSA9IFsKICAgICAgeyBjaGFyYWN0ZXI6ICIJIiwgYWZ0ZXI6ICJbXFxyXFxuXSIsIGluQ29uc3RydWN0OiAicGhyYXNpbmciIH0sCiAgICAgIHsgY2hhcmFjdGVyOiAiCSIsIGJlZm9yZTogIltcXHJcXG5dIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIgfSwKICAgICAgewogICAgICAgIGNoYXJhY3RlcjogIgkiLAogICAgICAgIGluQ29uc3RydWN0OiBbImNvZGVGZW5jZWRMYW5nR3JhdmVBY2NlbnQiLCAiY29kZUZlbmNlZExhbmdUaWxkZSJdCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBjaGFyYWN0ZXI6ICJcciIsCiAgICAgICAgaW5Db25zdHJ1Y3Q6IFsKICAgICAgICAgICJjb2RlRmVuY2VkTGFuZ0dyYXZlQWNjZW50IiwKICAgICAgICAgICJjb2RlRmVuY2VkTGFuZ1RpbGRlIiwKICAgICAgICAgICJjb2RlRmVuY2VkTWV0YUdyYXZlQWNjZW50IiwKICAgICAgICAgICJjb2RlRmVuY2VkTWV0YVRpbGRlIiwKICAgICAgICAgICJkZXN0aW5hdGlvbkxpdGVyYWwiLAogICAgICAgICAgImhlYWRpbmdBdHgiCiAgICAgICAgXQogICAgICB9LAogICAgICB7CiAgICAgICAgY2hhcmFjdGVyOiAiXG4iLAogICAgICAgIGluQ29uc3RydWN0OiBbCiAgICAgICAgICAiY29kZUZlbmNlZExhbmdHcmF2ZUFjY2VudCIsCiAgICAgICAgICAiY29kZUZlbmNlZExhbmdUaWxkZSIsCiAgICAgICAgICAiY29kZUZlbmNlZE1ldGFHcmF2ZUFjY2VudCIsCiAgICAgICAgICAiY29kZUZlbmNlZE1ldGFUaWxkZSIsCiAgICAgICAgICAiZGVzdGluYXRpb25MaXRlcmFsIiwKICAgICAgICAgICJoZWFkaW5nQXR4IgogICAgICAgIF0KICAgICAgfSwKICAgICAgeyBjaGFyYWN0ZXI6ICIgIiwgYWZ0ZXI6ICJbXFxyXFxuXSIsIGluQ29uc3RydWN0OiAicGhyYXNpbmciIH0sCiAgICAgIHsgY2hhcmFjdGVyOiAiICIsIGJlZm9yZTogIltcXHJcXG5dIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIgfSwKICAgICAgewogICAgICAgIGNoYXJhY3RlcjogIiAiLAogICAgICAgIGluQ29uc3RydWN0OiBbImNvZGVGZW5jZWRMYW5nR3JhdmVBY2NlbnQiLCAiY29kZUZlbmNlZExhbmdUaWxkZSJdCiAgICAgIH0sCiAgICAgIC8vIEFuIGV4Y2xhbWF0aW9uIG1hcmsgY2FuIHN0YXJ0IGFuIGltYWdlLCBpZiBpdCBpcyBmb2xsb3dlZCBieSBhIGxpbmsgb3IKICAgICAgLy8gYSBsaW5rIHJlZmVyZW5jZS4KICAgICAgewogICAgICAgIGNoYXJhY3RlcjogIiEiLAogICAgICAgIGFmdGVyOiAiXFxbIiwKICAgICAgICBpbkNvbnN0cnVjdDogInBocmFzaW5nIiwKICAgICAgICBub3RJbkNvbnN0cnVjdDogZnVsbFBocmFzaW5nU3BhbnMKICAgICAgfSwKICAgICAgLy8gQSBxdW90ZSBjYW4gYnJlYWsgb3V0IG9mIGEgdGl0bGUuCiAgICAgIHsgY2hhcmFjdGVyOiAnIicsIGluQ29uc3RydWN0OiAidGl0bGVRdW90ZSIgfSwKICAgICAgLy8gQSBudW1iZXIgc2lnbiBjb3VsZCBzdGFydCBhbiBBVFggaGVhZGluZyBpZiBpdCBzdGFydHMgYSBsaW5lLgogICAgICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogIiMiIH0sCiAgICAgIHsgY2hhcmFjdGVyOiAiIyIsIGluQ29uc3RydWN0OiAiaGVhZGluZ0F0eCIsIGFmdGVyOiAiKD86W1xyXG5dfCQpIiB9LAogICAgICAvLyBEb2xsYXIgc2lnbiBhbmQgcGVyY2VudGFnZSBhcmUgbm90IHVzZWQgaW4gbWFya2Rvd24uCiAgICAgIC8vIEFuIGFtcGVyc2FuZCBjb3VsZCBzdGFydCBhIGNoYXJhY3RlciByZWZlcmVuY2UuCiAgICAgIHsgY2hhcmFjdGVyOiAiJiIsIGFmdGVyOiAiWyNBLVphLXpdIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIgfSwKICAgICAgLy8gQW4gYXBvc3Ryb3BoZSBjYW4gYnJlYWsgb3V0IG9mIGEgdGl0bGUuCiAgICAgIHsgY2hhcmFjdGVyOiAiJyIsIGluQ29uc3RydWN0OiAidGl0bGVBcG9zdHJvcGhlIiB9LAogICAgICAvLyBBIGxlZnQgcGFyZW4gY291bGQgYnJlYWsgb3V0IG9mIGEgZGVzdGluYXRpb24gcmF3LgogICAgICB7IGNoYXJhY3RlcjogIigiLCBpbkNvbnN0cnVjdDogImRlc3RpbmF0aW9uUmF3IiB9LAogICAgICAvLyBBIGxlZnQgcGFyZW4gZm9sbG93ZWQgYnkgYF1gIGNvdWxkIG1ha2Ugc29tZXRoaW5nIGludG8gYSBsaW5rIG9yIGltYWdlLgogICAgICB7CiAgICAgICAgYmVmb3JlOiAiXFxdIiwKICAgICAgICBjaGFyYWN0ZXI6ICIoIiwKICAgICAgICBpbkNvbnN0cnVjdDogInBocmFzaW5nIiwKICAgICAgICBub3RJbkNvbnN0cnVjdDogZnVsbFBocmFzaW5nU3BhbnMKICAgICAgfSwKICAgICAgLy8gQSByaWdodCBwYXJlbiBjb3VsZCBzdGFydCBhIGxpc3QgaXRlbSBvciBicmVhayBvdXQgb2YgYSBkZXN0aW5hdGlvbgogICAgICAvLyByYXcuCiAgICAgIHsgYXRCcmVhazogdHJ1ZSwgYmVmb3JlOiAiXFxkKyIsIGNoYXJhY3RlcjogIikiIH0sCiAgICAgIHsgY2hhcmFjdGVyOiAiKSIsIGluQ29uc3RydWN0OiAiZGVzdGluYXRpb25SYXciIH0sCiAgICAgIC8vIEFuIGFzdGVyaXNrIGNhbiBzdGFydCB0aGVtYXRpYyBicmVha3MsIGxpc3QgaXRlbXMsIGVtcGhhc2lzLCBzdHJvbmcuCiAgICAgIHsgYXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAiKiIsIGFmdGVyOiAiKD86WyAJXHJcbipdKSIgfSwKICAgICAgeyBjaGFyYWN0ZXI6ICIqIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIsIG5vdEluQ29uc3RydWN0OiBmdWxsUGhyYXNpbmdTcGFucyB9LAogICAgICAvLyBBIHBsdXMgc2lnbiBjb3VsZCBzdGFydCBhIGxpc3QgaXRlbS4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICIrIiwgYWZ0ZXI6ICIoPzpbIAlcclxuXSkiIH0sCiAgICAgIC8vIEEgZGFzaCBjYW4gc3RhcnQgdGhlbWF0aWMgYnJlYWtzLCBsaXN0IGl0ZW1zLCBhbmQgc2V0ZXh0IGhlYWRpbmcKICAgICAgLy8gdW5kZXJsaW5lcy4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICItIiwgYWZ0ZXI6ICIoPzpbIAlcclxuLV0pIiB9LAogICAgICAvLyBBIGRvdCBjb3VsZCBzdGFydCBhIGxpc3QgaXRlbS4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBiZWZvcmU6ICJcXGQrIiwgY2hhcmFjdGVyOiAiLiIsIGFmdGVyOiAiKD86WyAJXHJcbl18JCkiIH0sCiAgICAgIC8vIFNsYXNoLCBjb2xvbiwgYW5kIHNlbWljb2xvbiBhcmUgbm90IHVzZWQgaW4gbWFya2Rvd24gZm9yIGNvbnN0cnVjdHMuCiAgICAgIC8vIEEgbGVzcyB0aGFuIGNhbiBzdGFydCBodG1sIChmbG93IG9yIHRleHQpIG9yIGFuIGF1dG9saW5rLgogICAgICAvLyBIVE1MIGNvdWxkIHN0YXJ0IHdpdGggYW4gZXhjbGFtYXRpb24gbWFyayAoZGVjbGFyYXRpb24sIGNkYXRhLCBjb21tZW50KSwKICAgICAgLy8gc2xhc2ggKGNsb3NpbmcgdGFnKSwgcXVlc3Rpb24gbWFyayAoaW5zdHJ1Y3Rpb24pLCBvciBhIGxldHRlciAodGFnKS4KICAgICAgLy8gQW4gYXV0b2xpbmsgYWxzbyBzdGFydHMgd2l0aCBhIGxldHRlci4KICAgICAgLy8gRmluYWxseSwgaXQgY291bGQgYnJlYWsgb3V0IG9mIGEgZGVzdGluYXRpb24gbGl0ZXJhbC4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICI8IiwgYWZ0ZXI6ICJbIS8/QS1aYS16XSIgfSwKICAgICAgewogICAgICAgIGNoYXJhY3RlcjogIjwiLAogICAgICAgIGFmdGVyOiAiWyEvP0EtWmEtel0iLAogICAgICAgIGluQ29uc3RydWN0OiAicGhyYXNpbmciLAogICAgICAgIG5vdEluQ29uc3RydWN0OiBmdWxsUGhyYXNpbmdTcGFucwogICAgICB9LAogICAgICB7IGNoYXJhY3RlcjogIjwiLCBpbkNvbnN0cnVjdDogImRlc3RpbmF0aW9uTGl0ZXJhbCIgfSwKICAgICAgLy8gQW4gZXF1YWxzIHRvIGNhbiBzdGFydCBzZXRleHQgaGVhZGluZyB1bmRlcmxpbmVzLgogICAgICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogIj0iIH0sCiAgICAgIC8vIEEgZ3JlYXRlciB0aGFuIGNhbiBzdGFydCBibG9jayBxdW90ZXMgYW5kIGl0IGNhbiBicmVhayBvdXQgb2YgYQogICAgICAvLyBkZXN0aW5hdGlvbiBsaXRlcmFsLgogICAgICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogIj4iIH0sCiAgICAgIHsgY2hhcmFjdGVyOiAiPiIsIGluQ29uc3RydWN0OiAiZGVzdGluYXRpb25MaXRlcmFsIiB9LAogICAgICAvLyBRdWVzdGlvbiBtYXJrIGFuZCBhdCBzaWduIGFyZSBub3QgdXNlZCBpbiBtYXJrZG93biBmb3IgY29uc3RydWN0cy4KICAgICAgLy8gQSBsZWZ0IGJyYWNrZXQgY2FuIHN0YXJ0IGRlZmluaXRpb25zLCByZWZlcmVuY2VzLCBsYWJlbHMsCiAgICAgIHsgYXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAiWyIgfSwKICAgICAgeyBjaGFyYWN0ZXI6ICJbIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIsIG5vdEluQ29uc3RydWN0OiBmdWxsUGhyYXNpbmdTcGFucyB9LAogICAgICB7IGNoYXJhY3RlcjogIlsiLCBpbkNvbnN0cnVjdDogWyJsYWJlbCIsICJyZWZlcmVuY2UiXSB9LAogICAgICAvLyBBIGJhY2tzbGFzaCBjYW4gc3RhcnQgYW4gZXNjYXBlICh3aGVuIGZvbGxvd2VkIGJ5IHB1bmN0dWF0aW9uKSBvciBhCiAgICAgIC8vIGhhcmQgYnJlYWsgKHdoZW4gZm9sbG93ZWQgYnkgYW4gZW9sKS4KICAgICAgLy8gTm90ZTogdHlwaWNhbCBlc2NhcGVzIGFyZSBoYW5kbGVkIGluIGBzYWZlYCEKICAgICAgeyBjaGFyYWN0ZXI6ICJcXCIsIGFmdGVyOiAiW1xcclxcbl0iLCBpbkNvbnN0cnVjdDogInBocmFzaW5nIiB9LAogICAgICAvLyBBIHJpZ2h0IGJyYWNrZXQgY2FuIGV4aXQgbGFiZWxzLgogICAgICB7IGNoYXJhY3RlcjogIl0iLCBpbkNvbnN0cnVjdDogWyJsYWJlbCIsICJyZWZlcmVuY2UiXSB9LAogICAgICAvLyBDYXJldCBpcyBub3QgdXNlZCBpbiBtYXJrZG93biBmb3IgY29uc3RydWN0cy4KICAgICAgLy8gQW4gdW5kZXJzY29yZSBjYW4gc3RhcnQgZW1waGFzaXMsIHN0cm9uZywgb3IgYSB0aGVtYXRpYyBicmVhay4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICJfIiB9LAogICAgICB7IGNoYXJhY3RlcjogIl8iLCBpbkNvbnN0cnVjdDogInBocmFzaW5nIiwgbm90SW5Db25zdHJ1Y3Q6IGZ1bGxQaHJhc2luZ1NwYW5zIH0sCiAgICAgIC8vIEEgZ3JhdmUgYWNjZW50IGNhbiBzdGFydCBjb2RlIChmZW5jZWQgb3IgdGV4dCksIG9yIGl0IGNhbiBicmVhayBvdXQgb2YKICAgICAgLy8gYSBncmF2ZSBhY2NlbnQgY29kZSBmZW5jZS4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICJgIiB9LAogICAgICB7CiAgICAgICAgY2hhcmFjdGVyOiAiYCIsCiAgICAgICAgaW5Db25zdHJ1Y3Q6IFsiY29kZUZlbmNlZExhbmdHcmF2ZUFjY2VudCIsICJjb2RlRmVuY2VkTWV0YUdyYXZlQWNjZW50Il0KICAgICAgfSwKICAgICAgeyBjaGFyYWN0ZXI6ICJgIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIsIG5vdEluQ29uc3RydWN0OiBmdWxsUGhyYXNpbmdTcGFucyB9LAogICAgICAvLyBMZWZ0IGJyYWNlLCB2ZXJ0aWNhbCBiYXIsIHJpZ2h0IGJyYWNlIGFyZSBub3QgdXNlZCBpbiBtYXJrZG93biBmb3IKICAgICAgLy8gY29uc3RydWN0cy4KICAgICAgLy8gQSB0aWxkZSBjYW4gc3RhcnQgY29kZSAoZmVuY2VkKS4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICJ+IiB9CiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGVjb2RlLW5hbWVkLWNoYXJhY3Rlci1yZWZlcmVuY2VAMS4zLjAvbm9kZV9tb2R1bGVzL2RlY29kZS1uYW1lZC1jaGFyYWN0ZXItcmVmZXJlbmNlL2luZGV4LmRvbS5qcwpmdW5jdGlvbiBkZWNvZGVOYW1lZENoYXJhY3RlclJlZmVyZW5jZSh2YWx1ZTIpIHsKICBjb25zdCBjaGFyYWN0ZXJSZWZlcmVuY2UyID0gIiYiICsgdmFsdWUyICsgIjsiOwogIGVsZW1lbnQuaW5uZXJIVE1MID0gY2hhcmFjdGVyUmVmZXJlbmNlMjsKICBjb25zdCBjaGFyYWN0ZXIgPSBlbGVtZW50LnRleHRDb250ZW50OwogIGlmIChjaGFyYWN0ZXIuY2hhckNvZGVBdChjaGFyYWN0ZXIubGVuZ3RoIC0gMSkgPT09IDU5ICYmIHZhbHVlMiAhPT0gInNlbWkiKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiBjaGFyYWN0ZXIgPT09IGNoYXJhY3RlclJlZmVyZW5jZTIgPyBmYWxzZSA6IGNoYXJhY3RlcjsKfQp2YXIgZWxlbWVudDsKdmFyIGluaXRfaW5kZXhfZG9tID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGVjb2RlLW5hbWVkLWNoYXJhY3Rlci1yZWZlcmVuY2VAMS4zLjAvbm9kZV9tb2R1bGVzL2RlY29kZS1uYW1lZC1jaGFyYWN0ZXItcmVmZXJlbmNlL2luZGV4LmRvbS5qcyIoKSB7CiAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaSIpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtZGVjb2RlLW51bWVyaWMtY2hhcmFjdGVyLXJlZmVyZW5jZUAyLjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtZGVjb2RlLW51bWVyaWMtY2hhcmFjdGVyLXJlZmVyZW5jZS9pbmRleC5qcwpmdW5jdGlvbiBkZWNvZGVOdW1lcmljQ2hhcmFjdGVyUmVmZXJlbmNlKHZhbHVlMiwgYmFzZSkgewogIGNvbnN0IGNvZGU0ID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlMiwgYmFzZSk7CiAgaWYgKAogICAgLy8gQzAgZXhjZXB0IGZvciBIVCwgTEYsIEZGLCBDUiwgc3BhY2UuCiAgICBjb2RlNCA8IDkgfHwgY29kZTQgPT09IDExIHx8IGNvZGU0ID4gMTMgJiYgY29kZTQgPCAzMiB8fCAvLyBDb250cm9sIGNoYXJhY3RlciAoREVMKSBvZiBDMCwgYW5kIEMxIGNvbnRyb2xzLgogICAgY29kZTQgPiAxMjYgJiYgY29kZTQgPCAxNjAgfHwgLy8gTG9uZSBoaWdoIHN1cnJvZ2F0ZXMgYW5kIGxvdyBzdXJyb2dhdGVzLgogICAgY29kZTQgPiA1NTI5NSAmJiBjb2RlNCA8IDU3MzQ0IHx8IC8vIE5vbmNoYXJhY3RlcnMuCiAgICBjb2RlNCA+IDY0OTc1ICYmIGNvZGU0IDwgNjUwMDggfHwgLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqLwogICAgKGNvZGU0ICYgNjU1MzUpID09PSA2NTUzNSB8fCAoY29kZTQgJiA2NTUzNSkgPT09IDY1NTM0IHx8IC8qIGVzbGludC1lbmFibGUgbm8tYml0d2lzZSAqLwogICAgLy8gT3V0IG9mIHJhbmdlCiAgICBjb2RlNCA+IDExMTQxMTEKICApIHsKICAgIHJldHVybiAiXHVGRkZEIjsKICB9CiAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGU0KTsKfQp2YXIgaW5pdF9taWNyb21hcmtfdXRpbF9kZWNvZGVfbnVtZXJpY19jaGFyYWN0ZXJfcmVmZXJlbmNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtZGVjb2RlLW51bWVyaWMtY2hhcmFjdGVyLXJlZmVyZW5jZUAyLjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtZGVjb2RlLW51bWVyaWMtY2hhcmFjdGVyLXJlZmVyZW5jZS9pbmRleC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1kZWNvZGUtc3RyaW5nQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1kZWNvZGUtc3RyaW5nL2luZGV4LmpzCmZ1bmN0aW9uIGRlY29kZVN0cmluZyh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyLnJlcGxhY2UoY2hhcmFjdGVyRXNjYXBlT3JSZWZlcmVuY2UsIGRlY29kZSk7Cn0KZnVuY3Rpb24gZGVjb2RlKCQwLCAkMSwgJDIyKSB7CiAgaWYgKCQxKSB7CiAgICByZXR1cm4gJDE7CiAgfQogIGNvbnN0IGhlYWQyID0gJDIyLmNoYXJDb2RlQXQoMCk7CiAgaWYgKGhlYWQyID09PSAzNSkgewogICAgY29uc3QgaGVhZDMgPSAkMjIuY2hhckNvZGVBdCgxKTsKICAgIGNvbnN0IGhleDMgPSBoZWFkMyA9PT0gMTIwIHx8IGhlYWQzID09PSA4ODsKICAgIHJldHVybiBkZWNvZGVOdW1lcmljQ2hhcmFjdGVyUmVmZXJlbmNlKCQyMi5zbGljZShoZXgzID8gMiA6IDEpLCBoZXgzID8gMTYgOiAxMCk7CiAgfQogIHJldHVybiBkZWNvZGVOYW1lZENoYXJhY3RlclJlZmVyZW5jZSgkMjIpIHx8ICQwOwp9CnZhciBjaGFyYWN0ZXJFc2NhcGVPclJlZmVyZW5jZTsKdmFyIGluaXRfbWljcm9tYXJrX3V0aWxfZGVjb2RlX3N0cmluZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLWRlY29kZS1zdHJpbmdAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLWRlY29kZS1zdHJpbmcvaW5kZXguanMiKCkgewogICAgaW5pdF9pbmRleF9kb20oKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfZGVjb2RlX251bWVyaWNfY2hhcmFjdGVyX3JlZmVyZW5jZSgpOwogICAgY2hhcmFjdGVyRXNjYXBlT3JSZWZlcmVuY2UgPSAvXFwoWyEtLzotQFstYHstfl0pfCYoIyg/OlxkezEsN318eFtcZGEtZl17MSw2fSl8W1xkYS16XXsxLDMxfSk7L2dpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9hc3NvY2lhdGlvbi5qcwpmdW5jdGlvbiBhc3NvY2lhdGlvbihub2RlMikgewogIGlmIChub2RlMi5sYWJlbCB8fCAhbm9kZTIuaWRlbnRpZmllcikgewogICAgcmV0dXJuIG5vZGUyLmxhYmVsIHx8ICIiOwogIH0KICByZXR1cm4gZGVjb2RlU3RyaW5nKG5vZGUyLmlkZW50aWZpZXIpOwp9CnZhciBpbml0X2Fzc29jaWF0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9hc3NvY2lhdGlvbi5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX2RlY29kZV9zdHJpbmcoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY29tcGlsZS1wYXR0ZXJuLmpzCmZ1bmN0aW9uIGNvbXBpbGVQYXR0ZXJuKHBhdHRlcm4pIHsKICBpZiAoIXBhdHRlcm4uX2NvbXBpbGVkKSB7CiAgICBjb25zdCBiZWZvcmUgPSAocGF0dGVybi5hdEJyZWFrID8gIltcXHJcXG5dW1xcdCBdKiIgOiAiIikgKyAocGF0dGVybi5iZWZvcmUgPyAiKD86IiArIHBhdHRlcm4uYmVmb3JlICsgIikiIDogIiIpOwogICAgcGF0dGVybi5fY29tcGlsZWQgPSBuZXcgUmVnRXhwKAogICAgICAoYmVmb3JlID8gIigiICsgYmVmb3JlICsgIikiIDogIiIpICsgKC9bfFxce30oKVtcXV4kKyo/Li1dLy50ZXN0KHBhdHRlcm4uY2hhcmFjdGVyKSA/ICJcXCIgOiAiIikgKyBwYXR0ZXJuLmNoYXJhY3RlciArIChwYXR0ZXJuLmFmdGVyID8gIig/OiIgKyBwYXR0ZXJuLmFmdGVyICsgIikiIDogIiIpLAogICAgICAiZyIKICAgICk7CiAgfQogIHJldHVybiBwYXR0ZXJuLl9jb21waWxlZDsKfQp2YXIgaW5pdF9jb21waWxlX3BhdHRlcm4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NvbXBpbGUtcGF0dGVybi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NvbnRhaW5lci1waHJhc2luZy5qcwpmdW5jdGlvbiBjb250YWluZXJQaHJhc2luZyhwYXJlbnQsIHN0YXRlMTAsIGluZm8pIHsKICBjb25zdCBpbmRleFN0YWNrID0gc3RhdGUxMC5pbmRleFN0YWNrOwogIGNvbnN0IGNoaWxkcmVuMiA9IHBhcmVudC5jaGlsZHJlbiB8fCBbXTsKICBjb25zdCByZXN1bHRzID0gW107CiAgbGV0IGluZGV4MiA9IC0xOwogIGxldCBiZWZvcmUgPSBpbmZvLmJlZm9yZTsKICBsZXQgZW5jb2RlQWZ0ZXI7CiAgaW5kZXhTdGFjay5wdXNoKC0xKTsKICBsZXQgdHJhY2tlciA9IHN0YXRlMTAuY3JlYXRlVHJhY2tlcihpbmZvKTsKICB3aGlsZSAoKytpbmRleDIgPCBjaGlsZHJlbjIubGVuZ3RoKSB7CiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuMltpbmRleDJdOwogICAgbGV0IGFmdGVyOwogICAgaW5kZXhTdGFja1tpbmRleFN0YWNrLmxlbmd0aCAtIDFdID0gaW5kZXgyOwogICAgaWYgKGluZGV4MiArIDEgPCBjaGlsZHJlbjIubGVuZ3RoKSB7CiAgICAgIGxldCBoYW5kbGUzID0gc3RhdGUxMC5oYW5kbGUuaGFuZGxlcnNbY2hpbGRyZW4yW2luZGV4MiArIDFdLnR5cGVdOwogICAgICBpZiAoaGFuZGxlMyAmJiBoYW5kbGUzLnBlZWspIGhhbmRsZTMgPSBoYW5kbGUzLnBlZWs7CiAgICAgIGFmdGVyID0gaGFuZGxlMyA/IGhhbmRsZTMoY2hpbGRyZW4yW2luZGV4MiArIDFdLCBwYXJlbnQsIHN0YXRlMTAsIHsKICAgICAgICBiZWZvcmU6ICIiLAogICAgICAgIGFmdGVyOiAiIiwKICAgICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgICB9KS5jaGFyQXQoMCkgOiAiIjsKICAgIH0gZWxzZSB7CiAgICAgIGFmdGVyID0gaW5mby5hZnRlcjsKICAgIH0KICAgIGlmIChyZXN1bHRzLmxlbmd0aCA+IDAgJiYgKGJlZm9yZSA9PT0gIlxyIiB8fCBiZWZvcmUgPT09ICJcbiIpICYmIGNoaWxkLnR5cGUgPT09ICJodG1sIikgewogICAgICByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0gPSByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0ucmVwbGFjZSgKICAgICAgICAvKFxyP1xufFxyKSQvLAogICAgICAgICIgIgogICAgICApOwogICAgICBiZWZvcmUgPSAiICI7CiAgICAgIHRyYWNrZXIgPSBzdGF0ZTEwLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgICAgIHRyYWNrZXIubW92ZShyZXN1bHRzLmpvaW4oIiIpKTsKICAgIH0KICAgIGxldCB2YWx1ZTIgPSBzdGF0ZTEwLmhhbmRsZShjaGlsZCwgcGFyZW50LCBzdGF0ZTEwLCB7CiAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpLAogICAgICBhZnRlciwKICAgICAgYmVmb3JlCiAgICB9KTsKICAgIGlmIChlbmNvZGVBZnRlciAmJiBlbmNvZGVBZnRlciA9PT0gdmFsdWUyLnNsaWNlKDAsIDEpKSB7CiAgICAgIHZhbHVlMiA9IGVuY29kZUNoYXJhY3RlclJlZmVyZW5jZShlbmNvZGVBZnRlci5jaGFyQ29kZUF0KDApKSArIHZhbHVlMi5zbGljZSgxKTsKICAgIH0KICAgIGNvbnN0IGVuY29kaW5nSW5mbyA9IHN0YXRlMTAuYXR0ZW50aW9uRW5jb2RlU3Vycm91bmRpbmdJbmZvOwogICAgc3RhdGUxMC5hdHRlbnRpb25FbmNvZGVTdXJyb3VuZGluZ0luZm8gPSB2b2lkIDA7CiAgICBlbmNvZGVBZnRlciA9IHZvaWQgMDsKICAgIGlmIChlbmNvZGluZ0luZm8pIHsKICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCAmJiBlbmNvZGluZ0luZm8uYmVmb3JlICYmIGJlZm9yZSA9PT0gcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdLnNsaWNlKC0xKSkgewogICAgICAgIHJlc3VsdHNbcmVzdWx0cy5sZW5ndGggLSAxXSA9IHJlc3VsdHNbcmVzdWx0cy5sZW5ndGggLSAxXS5zbGljZSgwLCAtMSkgKyBlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UoYmVmb3JlLmNoYXJDb2RlQXQoMCkpOwogICAgICB9CiAgICAgIGlmIChlbmNvZGluZ0luZm8uYWZ0ZXIpIGVuY29kZUFmdGVyID0gYWZ0ZXI7CiAgICB9CiAgICB0cmFja2VyLm1vdmUodmFsdWUyKTsKICAgIHJlc3VsdHMucHVzaCh2YWx1ZTIpOwogICAgYmVmb3JlID0gdmFsdWUyLnNsaWNlKC0xKTsKICB9CiAgaW5kZXhTdGFjay5wb3AoKTsKICByZXR1cm4gcmVzdWx0cy5qb2luKCIiKTsKfQp2YXIgaW5pdF9jb250YWluZXJfcGhyYXNpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NvbnRhaW5lci1waHJhc2luZy5qcyIoKSB7CiAgICBpbml0X2VuY29kZV9jaGFyYWN0ZXJfcmVmZXJlbmNlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NvbnRhaW5lci1mbG93LmpzCmZ1bmN0aW9uIGNvbnRhaW5lckZsb3cocGFyZW50LCBzdGF0ZTEwLCBpbmZvKSB7CiAgY29uc3QgaW5kZXhTdGFjayA9IHN0YXRlMTAuaW5kZXhTdGFjazsKICBjb25zdCBjaGlsZHJlbjIgPSBwYXJlbnQuY2hpbGRyZW4gfHwgW107CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlMTAuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBjb25zdCByZXN1bHRzID0gW107CiAgbGV0IGluZGV4MiA9IC0xOwogIGluZGV4U3RhY2sucHVzaCgtMSk7CiAgd2hpbGUgKCsraW5kZXgyIDwgY2hpbGRyZW4yLmxlbmd0aCkgewogICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbjJbaW5kZXgyXTsKICAgIGluZGV4U3RhY2tbaW5kZXhTdGFjay5sZW5ndGggLSAxXSA9IGluZGV4MjsKICAgIHJlc3VsdHMucHVzaCgKICAgICAgdHJhY2tlci5tb3ZlKAogICAgICAgIHN0YXRlMTAuaGFuZGxlKGNoaWxkLCBwYXJlbnQsIHN0YXRlMTAsIHsKICAgICAgICAgIGJlZm9yZTogIlxuIiwKICAgICAgICAgIGFmdGVyOiAiXG4iLAogICAgICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgICAgICB9KQogICAgICApCiAgICApOwogICAgaWYgKGNoaWxkLnR5cGUgIT09ICJsaXN0IikgewogICAgICBzdGF0ZTEwLmJ1bGxldExhc3RVc2VkID0gdm9pZCAwOwogICAgfQogICAgaWYgKGluZGV4MiA8IGNoaWxkcmVuMi5sZW5ndGggLSAxKSB7CiAgICAgIHJlc3VsdHMucHVzaCgKICAgICAgICB0cmFja2VyLm1vdmUoYmV0d2VlbihjaGlsZCwgY2hpbGRyZW4yW2luZGV4MiArIDFdLCBwYXJlbnQsIHN0YXRlMTApKQogICAgICApOwogICAgfQogIH0KICBpbmRleFN0YWNrLnBvcCgpOwogIHJldHVybiByZXN1bHRzLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIGJldHdlZW4obGVmdCwgcmlnaHQsIHBhcmVudCwgc3RhdGUxMCkgewogIGxldCBpbmRleDIgPSBzdGF0ZTEwLmpvaW4ubGVuZ3RoOwogIHdoaWxlIChpbmRleDItLSkgewogICAgY29uc3QgcmVzdWx0ID0gc3RhdGUxMC5qb2luW2luZGV4Ml0obGVmdCwgcmlnaHQsIHBhcmVudCwgc3RhdGUxMCk7CiAgICBpZiAocmVzdWx0ID09PSB0cnVlIHx8IHJlc3VsdCA9PT0gMSkgewogICAgICBicmVhazsKICAgIH0KICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAibnVtYmVyIikgewogICAgICByZXR1cm4gIlxuIi5yZXBlYXQoMSArIHJlc3VsdCk7CiAgICB9CiAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkgewogICAgICByZXR1cm4gIlxuXG48IS0tLS0+XG5cbiI7CiAgICB9CiAgfQogIHJldHVybiAiXG5cbiI7Cn0KdmFyIGluaXRfY29udGFpbmVyX2Zsb3cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NvbnRhaW5lci1mbG93LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvaW5kZW50LWxpbmVzLmpzCmZ1bmN0aW9uIGluZGVudExpbmVzKHZhbHVlMiwgbWFwNykgewogIGNvbnN0IHJlc3VsdCA9IFtdOwogIGxldCBzdGFydCA9IDA7CiAgbGV0IGxpbmUgPSAwOwogIGxldCBtYXRjaDI7CiAgd2hpbGUgKG1hdGNoMiA9IGVvbC5leGVjKHZhbHVlMikpIHsKICAgIG9uZTModmFsdWUyLnNsaWNlKHN0YXJ0LCBtYXRjaDIuaW5kZXgpKTsKICAgIHJlc3VsdC5wdXNoKG1hdGNoMlswXSk7CiAgICBzdGFydCA9IG1hdGNoMi5pbmRleCArIG1hdGNoMlswXS5sZW5ndGg7CiAgICBsaW5lKys7CiAgfQogIG9uZTModmFsdWUyLnNsaWNlKHN0YXJ0KSk7CiAgcmV0dXJuIHJlc3VsdC5qb2luKCIiKTsKICBmdW5jdGlvbiBvbmUzKHZhbHVlMykgewogICAgcmVzdWx0LnB1c2gobWFwNyh2YWx1ZTMsIGxpbmUsICF2YWx1ZTMpKTsKICB9Cn0KdmFyIGVvbDsKdmFyIGluaXRfaW5kZW50X2xpbmVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9pbmRlbnQtbGluZXMuanMiKCkgewogICAgZW9sID0gL1xyP1xufFxyL2c7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL3NhZmUuanMKZnVuY3Rpb24gc2FmZShzdGF0ZTEwLCBpbnB1dCwgY29uZmlnMykgewogIGNvbnN0IHZhbHVlMiA9IChjb25maWczLmJlZm9yZSB8fCAiIikgKyAoaW5wdXQgfHwgIiIpICsgKGNvbmZpZzMuYWZ0ZXIgfHwgIiIpOwogIGNvbnN0IHBvc2l0aW9ucyA9IFtdOwogIGNvbnN0IHJlc3VsdCA9IFtdOwogIGNvbnN0IGluZm9zID0ge307CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHN0YXRlMTAudW5zYWZlLmxlbmd0aCkgewogICAgY29uc3QgcGF0dGVybiA9IHN0YXRlMTAudW5zYWZlW2luZGV4Ml07CiAgICBpZiAoIXBhdHRlcm5JblNjb3BlKHN0YXRlMTAuc3RhY2ssIHBhdHRlcm4pKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3QgZXhwcmVzc2lvbiA9IHN0YXRlMTAuY29tcGlsZVBhdHRlcm4ocGF0dGVybik7CiAgICBsZXQgbWF0Y2gyOwogICAgd2hpbGUgKG1hdGNoMiA9IGV4cHJlc3Npb24uZXhlYyh2YWx1ZTIpKSB7CiAgICAgIGNvbnN0IGJlZm9yZSA9ICJiZWZvcmUiIGluIHBhdHRlcm4gfHwgQm9vbGVhbihwYXR0ZXJuLmF0QnJlYWspOwogICAgICBjb25zdCBhZnRlciA9ICJhZnRlciIgaW4gcGF0dGVybjsKICAgICAgY29uc3QgcG9zaXRpb24zID0gbWF0Y2gyLmluZGV4ICsgKGJlZm9yZSA/IG1hdGNoMlsxXS5sZW5ndGggOiAwKTsKICAgICAgaWYgKHBvc2l0aW9ucy5pbmNsdWRlcyhwb3NpdGlvbjMpKSB7CiAgICAgICAgaWYgKGluZm9zW3Bvc2l0aW9uM10uYmVmb3JlICYmICFiZWZvcmUpIHsKICAgICAgICAgIGluZm9zW3Bvc2l0aW9uM10uYmVmb3JlID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChpbmZvc1twb3NpdGlvbjNdLmFmdGVyICYmICFhZnRlcikgewogICAgICAgICAgaW5mb3NbcG9zaXRpb24zXS5hZnRlciA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBwb3NpdGlvbnMucHVzaChwb3NpdGlvbjMpOwogICAgICAgIGluZm9zW3Bvc2l0aW9uM10gPSB7IGJlZm9yZSwgYWZ0ZXIgfTsKICAgICAgfQogICAgfQogIH0KICBwb3NpdGlvbnMuc29ydChudW1lcmljYWwpOwogIGxldCBzdGFydCA9IGNvbmZpZzMuYmVmb3JlID8gY29uZmlnMy5iZWZvcmUubGVuZ3RoIDogMDsKICBjb25zdCBlbmQzID0gdmFsdWUyLmxlbmd0aCAtIChjb25maWczLmFmdGVyID8gY29uZmlnMy5hZnRlci5sZW5ndGggOiAwKTsKICBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBwb3NpdGlvbnMubGVuZ3RoKSB7CiAgICBjb25zdCBwb3NpdGlvbjMgPSBwb3NpdGlvbnNbaW5kZXgyXTsKICAgIGlmIChwb3NpdGlvbjMgPCBzdGFydCB8fCBwb3NpdGlvbjMgPj0gZW5kMykgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmIChwb3NpdGlvbjMgKyAxIDwgZW5kMyAmJiBwb3NpdGlvbnNbaW5kZXgyICsgMV0gPT09IHBvc2l0aW9uMyArIDEgJiYgaW5mb3NbcG9zaXRpb24zXS5hZnRlciAmJiAhaW5mb3NbcG9zaXRpb24zICsgMV0uYmVmb3JlICYmICFpbmZvc1twb3NpdGlvbjMgKyAxXS5hZnRlciB8fCBwb3NpdGlvbnNbaW5kZXgyIC0gMV0gPT09IHBvc2l0aW9uMyAtIDEgJiYgaW5mb3NbcG9zaXRpb24zXS5iZWZvcmUgJiYgIWluZm9zW3Bvc2l0aW9uMyAtIDFdLmJlZm9yZSAmJiAhaW5mb3NbcG9zaXRpb24zIC0gMV0uYWZ0ZXIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAoc3RhcnQgIT09IHBvc2l0aW9uMykgewogICAgICByZXN1bHQucHVzaChlc2NhcGVCYWNrc2xhc2hlcyh2YWx1ZTIuc2xpY2Uoc3RhcnQsIHBvc2l0aW9uMyksICJcXCIpKTsKICAgIH0KICAgIHN0YXJ0ID0gcG9zaXRpb24zOwogICAgaWYgKC9bIS0vOi1AWy1gey1+XS8udGVzdCh2YWx1ZTIuY2hhckF0KHBvc2l0aW9uMykpICYmICghY29uZmlnMy5lbmNvZGUgfHwgIWNvbmZpZzMuZW5jb2RlLmluY2x1ZGVzKHZhbHVlMi5jaGFyQXQocG9zaXRpb24zKSkpKSB7CiAgICAgIHJlc3VsdC5wdXNoKCJcXCIpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0LnB1c2goZW5jb2RlQ2hhcmFjdGVyUmVmZXJlbmNlKHZhbHVlMi5jaGFyQ29kZUF0KHBvc2l0aW9uMykpKTsKICAgICAgc3RhcnQrKzsKICAgIH0KICB9CiAgcmVzdWx0LnB1c2goZXNjYXBlQmFja3NsYXNoZXModmFsdWUyLnNsaWNlKHN0YXJ0LCBlbmQzKSwgY29uZmlnMy5hZnRlcikpOwogIHJldHVybiByZXN1bHQuam9pbigiIik7Cn0KZnVuY3Rpb24gbnVtZXJpY2FsKGE1LCBiNSkgewogIHJldHVybiBhNSAtIGI1Owp9CmZ1bmN0aW9uIGVzY2FwZUJhY2tzbGFzaGVzKHZhbHVlMiwgYWZ0ZXIpIHsKICBjb25zdCBleHByZXNzaW9uID0gL1xcKD89WyEtLzotQFstYHstfl0pL2c7CiAgY29uc3QgcG9zaXRpb25zID0gW107CiAgY29uc3QgcmVzdWx0cyA9IFtdOwogIGNvbnN0IHdob2xlID0gdmFsdWUyICsgYWZ0ZXI7CiAgbGV0IGluZGV4MiA9IC0xOwogIGxldCBzdGFydCA9IDA7CiAgbGV0IG1hdGNoMjsKICB3aGlsZSAobWF0Y2gyID0gZXhwcmVzc2lvbi5leGVjKHdob2xlKSkgewogICAgcG9zaXRpb25zLnB1c2gobWF0Y2gyLmluZGV4KTsKICB9CiAgd2hpbGUgKCsraW5kZXgyIDwgcG9zaXRpb25zLmxlbmd0aCkgewogICAgaWYgKHN0YXJ0ICE9PSBwb3NpdGlvbnNbaW5kZXgyXSkgewogICAgICByZXN1bHRzLnB1c2godmFsdWUyLnNsaWNlKHN0YXJ0LCBwb3NpdGlvbnNbaW5kZXgyXSkpOwogICAgfQogICAgcmVzdWx0cy5wdXNoKCJcXCIpOwogICAgc3RhcnQgPSBwb3NpdGlvbnNbaW5kZXgyXTsKICB9CiAgcmVzdWx0cy5wdXNoKHZhbHVlMi5zbGljZShzdGFydCkpOwogIHJldHVybiByZXN1bHRzLmpvaW4oIiIpOwp9CnZhciBpbml0X3NhZmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL3NhZmUuanMiKCkgewogICAgaW5pdF9lbmNvZGVfY2hhcmFjdGVyX3JlZmVyZW5jZSgpOwogICAgaW5pdF9wYXR0ZXJuX2luX3Njb3BlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL3RyYWNrLmpzCmZ1bmN0aW9uIHRyYWNrKGNvbmZpZzMpIHsKICBjb25zdCBvcHRpb25zID0gY29uZmlnMyB8fCB7fTsKICBjb25zdCBub3cyID0gb3B0aW9ucy5ub3cgfHwge307CiAgbGV0IGxpbmVTaGlmdCA9IG9wdGlvbnMubGluZVNoaWZ0IHx8IDA7CiAgbGV0IGxpbmUgPSBub3cyLmxpbmUgfHwgMTsKICBsZXQgY29sdW1uID0gbm93Mi5jb2x1bW4gfHwgMTsKICByZXR1cm4geyBtb3ZlLCBjdXJyZW50LCBzaGlmdCB9OwogIGZ1bmN0aW9uIGN1cnJlbnQoKSB7CiAgICByZXR1cm4geyBub3c6IHsgbGluZSwgY29sdW1uIH0sIGxpbmVTaGlmdCB9OwogIH0KICBmdW5jdGlvbiBzaGlmdCh2YWx1ZTIpIHsKICAgIGxpbmVTaGlmdCArPSB2YWx1ZTI7CiAgfQogIGZ1bmN0aW9uIG1vdmUoaW5wdXQpIHsKICAgIGNvbnN0IHZhbHVlMiA9IGlucHV0IHx8ICIiOwogICAgY29uc3QgY2h1bmtzID0gdmFsdWUyLnNwbGl0KC9ccj9cbnxcci9nKTsKICAgIGNvbnN0IHRhaWwgPSBjaHVua3NbY2h1bmtzLmxlbmd0aCAtIDFdOwogICAgbGluZSArPSBjaHVua3MubGVuZ3RoIC0gMTsKICAgIGNvbHVtbiA9IGNodW5rcy5sZW5ndGggPT09IDEgPyBjb2x1bW4gKyB0YWlsLmxlbmd0aCA6IDEgKyB0YWlsLmxlbmd0aCArIGxpbmVTaGlmdDsKICAgIHJldHVybiB2YWx1ZTI7CiAgfQp9CnZhciBpbml0X3RyYWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC90cmFjay5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9pbmRleC5qcwpmdW5jdGlvbiB0b01hcmtkb3duKHRyZWUsIG9wdGlvbnMpIHsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwge307CiAgY29uc3Qgc3RhdGUxMCA9IHsKICAgIGFzc29jaWF0aW9uSWQ6IGFzc29jaWF0aW9uLAogICAgY29udGFpbmVyUGhyYXNpbmc6IGNvbnRhaW5lclBocmFzaW5nQm91bmQsCiAgICBjb250YWluZXJGbG93OiBjb250YWluZXJGbG93Qm91bmQsCiAgICBjcmVhdGVUcmFja2VyOiB0cmFjaywKICAgIGNvbXBpbGVQYXR0ZXJuLAogICAgZW50ZXIsCiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBHRk0gLyBmcm9udG1hdHRlciBhcmUgdHlwZWQgaW4gYG1kYXN0YCBidXQgbm90IGRlZmluZWQKICAgIC8vIGhlcmUuCiAgICBoYW5kbGVyczogeyAuLi5oYW5kbGUgfSwKICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGFkZCBgaGFuZGxlYCBpbiBhIHNlY29uZC4KICAgIGhhbmRsZTogdm9pZCAwLAogICAgaW5kZW50TGluZXMsCiAgICBpbmRleFN0YWNrOiBbXSwKICAgIGpvaW46IFsuLi5qb2luMl0sCiAgICBvcHRpb25zOiB7fSwKICAgIHNhZmU6IHNhZmVCb3VuZCwKICAgIHN0YWNrOiBbXSwKICAgIHVuc2FmZTogWy4uLnVuc2FmZV0KICB9OwogIGNvbmZpZ3VyZShzdGF0ZTEwLCBzZXR0aW5ncyk7CiAgaWYgKHN0YXRlMTAub3B0aW9ucy50aWdodERlZmluaXRpb25zKSB7CiAgICBzdGF0ZTEwLmpvaW4ucHVzaChqb2luRGVmaW5pdGlvbik7CiAgfQogIHN0YXRlMTAuaGFuZGxlID0gendpdGNoKCJ0eXBlIiwgewogICAgaW52YWxpZCwKICAgIHVua25vd24sCiAgICBoYW5kbGVyczogc3RhdGUxMC5oYW5kbGVycwogIH0pOwogIGxldCByZXN1bHQgPSBzdGF0ZTEwLmhhbmRsZSh0cmVlLCB2b2lkIDAsIHN0YXRlMTAsIHsKICAgIGJlZm9yZTogIlxuIiwKICAgIGFmdGVyOiAiXG4iLAogICAgbm93OiB7IGxpbmU6IDEsIGNvbHVtbjogMSB9LAogICAgbGluZVNoaWZ0OiAwCiAgfSk7CiAgaWYgKHJlc3VsdCAmJiByZXN1bHQuY2hhckNvZGVBdChyZXN1bHQubGVuZ3RoIC0gMSkgIT09IDEwICYmIHJlc3VsdC5jaGFyQ29kZUF0KHJlc3VsdC5sZW5ndGggLSAxKSAhPT0gMTMpIHsKICAgIHJlc3VsdCArPSAiXG4iOwogIH0KICByZXR1cm4gcmVzdWx0OwogIGZ1bmN0aW9uIGVudGVyKG5hbWUpIHsKICAgIHN0YXRlMTAuc3RhY2sucHVzaChuYW1lKTsKICAgIHJldHVybiBleGl0MzsKICAgIGZ1bmN0aW9uIGV4aXQzKCkgewogICAgICBzdGF0ZTEwLnN0YWNrLnBvcCgpOwogICAgfQogIH0KfQpmdW5jdGlvbiBpbnZhbGlkKHZhbHVlMikgewogIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IGhhbmRsZSB2YWx1ZSBgIiArIHZhbHVlMiArICJgLCBleHBlY3RlZCBub2RlIik7Cn0KZnVuY3Rpb24gdW5rbm93bih2YWx1ZTIpIHsKICBjb25zdCBub2RlMiA9ICgKICAgIC8qKiBAdHlwZSB7Tm9kZXN9ICovCiAgICB2YWx1ZTIKICApOwogIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IGhhbmRsZSB1bmtub3duIG5vZGUgYCIgKyBub2RlMi50eXBlICsgImAiKTsKfQpmdW5jdGlvbiBqb2luRGVmaW5pdGlvbihsZWZ0LCByaWdodCkgewogIGlmIChsZWZ0LnR5cGUgPT09ICJkZWZpbml0aW9uIiAmJiBsZWZ0LnR5cGUgPT09IHJpZ2h0LnR5cGUpIHsKICAgIHJldHVybiAwOwogIH0KfQpmdW5jdGlvbiBjb250YWluZXJQaHJhc2luZ0JvdW5kKHBhcmVudCwgaW5mbykgewogIHJldHVybiBjb250YWluZXJQaHJhc2luZyhwYXJlbnQsIHRoaXMsIGluZm8pOwp9CmZ1bmN0aW9uIGNvbnRhaW5lckZsb3dCb3VuZChwYXJlbnQsIGluZm8pIHsKICByZXR1cm4gY29udGFpbmVyRmxvdyhwYXJlbnQsIHRoaXMsIGluZm8pOwp9CmZ1bmN0aW9uIHNhZmVCb3VuZCh2YWx1ZTIsIGNvbmZpZzMpIHsKICByZXR1cm4gc2FmZSh0aGlzLCB2YWx1ZTIsIGNvbmZpZzMpOwp9CnZhciBpbml0X2xpYjE1ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaW5kZXguanMiKCkgewogICAgaW5pdF96d2l0Y2goKTsKICAgIGluaXRfY29uZmlndXJlKCk7CiAgICBpbml0X2hhbmRsZSgpOwogICAgaW5pdF9qb2luKCk7CiAgICBpbml0X3Vuc2FmZSgpOwogICAgaW5pdF9hc3NvY2lhdGlvbigpOwogICAgaW5pdF9jb21waWxlX3BhdHRlcm4oKTsKICAgIGluaXRfY29udGFpbmVyX3BocmFzaW5nKCk7CiAgICBpbml0X2NvbnRhaW5lcl9mbG93KCk7CiAgICBpbml0X2luZGVudF9saW5lcygpOwogICAgaW5pdF9zYWZlKCk7CiAgICBpbml0X3RyYWNrKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2luZGV4LmpzCnZhciBpbml0X21kYXN0X3V0aWxfdG9fbWFya2Rvd24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliMTUoKTsKICAgIGluaXRfaGFuZGxlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWdmbS10YWJsZUAyLjAuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0tdGFibGUvbGliL2luZGV4LmpzCmZ1bmN0aW9uIGdmbVRhYmxlRnJvbU1hcmtkb3duKCkgewogIHJldHVybiB7CiAgICBlbnRlcjogewogICAgICB0YWJsZTogZW50ZXJUYWJsZSwKICAgICAgdGFibGVEYXRhOiBlbnRlckNlbGwsCiAgICAgIHRhYmxlSGVhZGVyOiBlbnRlckNlbGwsCiAgICAgIHRhYmxlUm93OiBlbnRlclJvdwogICAgfSwKICAgIGV4aXQ6IHsKICAgICAgY29kZVRleHQ6IGV4aXRDb2RlVGV4dCwKICAgICAgdGFibGU6IGV4aXRUYWJsZSwKICAgICAgdGFibGVEYXRhOiBleGl0LAogICAgICB0YWJsZUhlYWRlcjogZXhpdCwKICAgICAgdGFibGVSb3c6IGV4aXQKICAgIH0KICB9Owp9CmZ1bmN0aW9uIGVudGVyVGFibGUodG9rZW4pIHsKICBjb25zdCBhbGlnbiA9IHRva2VuLl9hbGlnbjsKICBvayhhbGlnbiwgImV4cGVjdGVkIGBfYWxpZ25gIG9uIHRhYmxlIik7CiAgdGhpcy5lbnRlcigKICAgIHsKICAgICAgdHlwZTogInRhYmxlIiwKICAgICAgYWxpZ246IGFsaWduLm1hcChmdW5jdGlvbihkNikgewogICAgICAgIHJldHVybiBkNiA9PT0gIm5vbmUiID8gbnVsbCA6IGQ2OwogICAgICB9KSwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9LAogICAgdG9rZW4KICApOwogIHRoaXMuZGF0YS5pblRhYmxlID0gdHJ1ZTsKfQpmdW5jdGlvbiBleGl0VGFibGUodG9rZW4pIHsKICB0aGlzLmV4aXQodG9rZW4pOwogIHRoaXMuZGF0YS5pblRhYmxlID0gdm9pZCAwOwp9CmZ1bmN0aW9uIGVudGVyUm93KHRva2VuKSB7CiAgdGhpcy5lbnRlcih7IHR5cGU6ICJ0YWJsZVJvdyIsIGNoaWxkcmVuOiBbXSB9LCB0b2tlbik7Cn0KZnVuY3Rpb24gZXhpdCh0b2tlbikgewogIHRoaXMuZXhpdCh0b2tlbik7Cn0KZnVuY3Rpb24gZW50ZXJDZWxsKHRva2VuKSB7CiAgdGhpcy5lbnRlcih7IHR5cGU6ICJ0YWJsZUNlbGwiLCBjaGlsZHJlbjogW10gfSwgdG9rZW4pOwp9CmZ1bmN0aW9uIGV4aXRDb2RlVGV4dCh0b2tlbikgewogIGxldCB2YWx1ZTIgPSB0aGlzLnJlc3VtZSgpOwogIGlmICh0aGlzLmRhdGEuaW5UYWJsZSkgewogICAgdmFsdWUyID0gdmFsdWUyLnJlcGxhY2UoL1xcKFtcXHxdKS9nLCByZXBsYWNlKTsKICB9CiAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgb2sobm9kZTIudHlwZSA9PT0gImlubGluZUNvZGUiKTsKICBub2RlMi52YWx1ZSA9IHZhbHVlMjsKICB0aGlzLmV4aXQodG9rZW4pOwp9CmZ1bmN0aW9uIHJlcGxhY2UoJDAsICQxKSB7CiAgcmV0dXJuICQxID09PSAifCIgPyAkMSA6ICQwOwp9CmZ1bmN0aW9uIGdmbVRhYmxlVG9NYXJrZG93bihvcHRpb25zKSB7CiAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9OwogIGNvbnN0IHBhZGRpbmcgPSBzZXR0aW5ncy50YWJsZUNlbGxQYWRkaW5nOwogIGNvbnN0IGFsaWduRGVsaW1pdGVycyA9IHNldHRpbmdzLnRhYmxlUGlwZUFsaWduOwogIGNvbnN0IHN0cmluZ0xlbmd0aCA9IHNldHRpbmdzLnN0cmluZ0xlbmd0aDsKICBjb25zdCBhcm91bmQgPSBwYWRkaW5nID8gIiAiIDogInwiOwogIHJldHVybiB7CiAgICB1bnNhZmU6IFsKICAgICAgeyBjaGFyYWN0ZXI6ICJcciIsIGluQ29uc3RydWN0OiAidGFibGVDZWxsIiB9LAogICAgICB7IGNoYXJhY3RlcjogIlxuIiwgaW5Db25zdHJ1Y3Q6ICJ0YWJsZUNlbGwiIH0sCiAgICAgIC8vIEEgcGlwZSwgd2hlbiBmb2xsb3dlZCBieSBhIHRhYiBvciBzcGFjZSAocGFkZGluZyksIG9yIGEgZGFzaCBvciBjb2xvbgogICAgICAvLyAodW5wYWRkZWQgZGVsaW1pdGVyIHJvdyksIGNvdWxkIHJlc3VsdCBpbiBhIHRhYmxlLgogICAgICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogInwiLCBhZnRlcjogIlsJIDotXSIgfSwKICAgICAgLy8gQSBwaXBlIGluIGEgY2VsbCBtdXN0IGJlIGVuY29kZWQuCiAgICAgIHsgY2hhcmFjdGVyOiAifCIsIGluQ29uc3RydWN0OiAidGFibGVDZWxsIiB9LAogICAgICAvLyBBIGNvbG9uIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBkYXNoLCBpbiB3aGljaCBjYXNlIGl0IGNvdWxkIHN0YXJ0IGEKICAgICAgLy8gZGVsaW1pdGVyIHJvdy4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICI6IiwgYWZ0ZXI6ICItIiB9LAogICAgICAvLyBBIGRlbGltaXRlciByb3cgY2FuIGFsc28gc3RhcnQgd2l0aCBhIGRhc2gsIHdoZW4gZm9sbG93ZWQgYnkgbW9yZQogICAgICAvLyBkYXNoZXMsIGEgY29sb24sIG9yIGEgcGlwZS4KICAgICAgLy8gVGhpcyBpcyBhIHN0cmljdGVyIHZlcnNpb24gdGhhbiB0aGUgYnVpbHQgaW4gY2hlY2sgZm9yIGxpc3RzLCB0aGVtYXRpYwogICAgICAvLyBicmVha3MsIGFuZCBzZXRleCBoZWFkaW5nIHVuZGVybGluZXMgdGhvdWdoOgogICAgICAvLyA8aHR0cHM6Ly9naXRodWIuY29tL3N5bnRheC10cmVlL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vYmxvYi81MWEyMDM4L2xpYi91bnNhZmUuanMjTDU3PgogICAgICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogIi0iLCBhZnRlcjogIls6fC1dIiB9CiAgICBdLAogICAgaGFuZGxlcnM6IHsKICAgICAgaW5saW5lQ29kZTogaW5saW5lQ29kZVdpdGhUYWJsZSwKICAgICAgdGFibGU6IGhhbmRsZVRhYmxlLAogICAgICB0YWJsZUNlbGw6IGhhbmRsZVRhYmxlQ2VsbCwKICAgICAgdGFibGVSb3c6IGhhbmRsZVRhYmxlUm93CiAgICB9CiAgfTsKICBmdW5jdGlvbiBoYW5kbGVUYWJsZShub2RlMiwgXzQsIHN0YXRlMTAsIGluZm8pIHsKICAgIHJldHVybiBzZXJpYWxpemVEYXRhKGhhbmRsZVRhYmxlQXNEYXRhKG5vZGUyLCBzdGF0ZTEwLCBpbmZvKSwgbm9kZTIuYWxpZ24pOwogIH0KICBmdW5jdGlvbiBoYW5kbGVUYWJsZVJvdyhub2RlMiwgXzQsIHN0YXRlMTAsIGluZm8pIHsKICAgIGNvbnN0IHJvdyA9IGhhbmRsZVRhYmxlUm93QXNEYXRhKG5vZGUyLCBzdGF0ZTEwLCBpbmZvKTsKICAgIGNvbnN0IHZhbHVlMiA9IHNlcmlhbGl6ZURhdGEoW3Jvd10pOwogICAgcmV0dXJuIHZhbHVlMi5zbGljZSgwLCB2YWx1ZTIuaW5kZXhPZigiXG4iKSk7CiAgfQogIGZ1bmN0aW9uIGhhbmRsZVRhYmxlQ2VsbChub2RlMiwgXzQsIHN0YXRlMTAsIGluZm8pIHsKICAgIGNvbnN0IGV4aXQzID0gc3RhdGUxMC5lbnRlcigidGFibGVDZWxsIik7CiAgICBjb25zdCBzdWJleGl0ID0gc3RhdGUxMC5lbnRlcigicGhyYXNpbmciKTsKICAgIGNvbnN0IHZhbHVlMiA9IHN0YXRlMTAuY29udGFpbmVyUGhyYXNpbmcobm9kZTIsIHsKICAgICAgLi4uaW5mbywKICAgICAgYmVmb3JlOiBhcm91bmQsCiAgICAgIGFmdGVyOiBhcm91bmQKICAgIH0pOwogICAgc3ViZXhpdCgpOwogICAgZXhpdDMoKTsKICAgIHJldHVybiB2YWx1ZTI7CiAgfQogIGZ1bmN0aW9uIHNlcmlhbGl6ZURhdGEobWF0cml4LCBhbGlnbikgewogICAgcmV0dXJuIG1hcmtkb3duVGFibGUobWF0cml4LCB7CiAgICAgIGFsaWduLAogICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBgbWFya2Rvd24tdGFibGVgIHR5cGVzIHNob3VsZCBzdXBwb3J0IGBudWxsYC4KICAgICAgYWxpZ25EZWxpbWl0ZXJzLAogICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBgbWFya2Rvd24tdGFibGVgIHR5cGVzIHNob3VsZCBzdXBwb3J0IGBudWxsYC4KICAgICAgcGFkZGluZywKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogYG1hcmtkb3duLXRhYmxlYCB0eXBlcyBzaG91bGQgc3VwcG9ydCBgbnVsbGAuCiAgICAgIHN0cmluZ0xlbmd0aAogICAgfSk7CiAgfQogIGZ1bmN0aW9uIGhhbmRsZVRhYmxlQXNEYXRhKG5vZGUyLCBzdGF0ZTEwLCBpbmZvKSB7CiAgICBjb25zdCBjaGlsZHJlbjIgPSBub2RlMi5jaGlsZHJlbjsKICAgIGxldCBpbmRleDIgPSAtMTsKICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgY29uc3Qgc3ViZXhpdCA9IHN0YXRlMTAuZW50ZXIoInRhYmxlIik7CiAgICB3aGlsZSAoKytpbmRleDIgPCBjaGlsZHJlbjIubGVuZ3RoKSB7CiAgICAgIHJlc3VsdFtpbmRleDJdID0gaGFuZGxlVGFibGVSb3dBc0RhdGEoY2hpbGRyZW4yW2luZGV4Ml0sIHN0YXRlMTAsIGluZm8pOwogICAgfQogICAgc3ViZXhpdCgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgZnVuY3Rpb24gaGFuZGxlVGFibGVSb3dBc0RhdGEobm9kZTIsIHN0YXRlMTAsIGluZm8pIHsKICAgIGNvbnN0IGNoaWxkcmVuMiA9IG5vZGUyLmNoaWxkcmVuOwogICAgbGV0IGluZGV4MiA9IC0xOwogICAgY29uc3QgcmVzdWx0ID0gW107CiAgICBjb25zdCBzdWJleGl0ID0gc3RhdGUxMC5lbnRlcigidGFibGVSb3ciKTsKICAgIHdoaWxlICgrK2luZGV4MiA8IGNoaWxkcmVuMi5sZW5ndGgpIHsKICAgICAgcmVzdWx0W2luZGV4Ml0gPSBoYW5kbGVUYWJsZUNlbGwoY2hpbGRyZW4yW2luZGV4Ml0sIG5vZGUyLCBzdGF0ZTEwLCBpbmZvKTsKICAgIH0KICAgIHN1YmV4aXQoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIGlubGluZUNvZGVXaXRoVGFibGUobm9kZTIsIHBhcmVudCwgc3RhdGUxMCkgewogICAgbGV0IHZhbHVlMiA9IGhhbmRsZS5pbmxpbmVDb2RlKG5vZGUyLCBwYXJlbnQsIHN0YXRlMTApOwogICAgaWYgKHN0YXRlMTAuc3RhY2suaW5jbHVkZXMoInRhYmxlQ2VsbCIpKSB7CiAgICAgIHZhbHVlMiA9IHZhbHVlMi5yZXBsYWNlKC9cfC9nLCAiXFwkJiIpOwogICAgfQogICAgcmV0dXJuIHZhbHVlMjsKICB9Cn0KdmFyIGluaXRfbGliMTYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWdmbS10YWJsZUAyLjAuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0tdGFibGUvbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfZGVmYXVsdCgpOwogICAgaW5pdF9tYXJrZG93bl90YWJsZSgpOwogICAgaW5pdF9tZGFzdF91dGlsX3RvX21hcmtkb3duKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWdmbS10YWJsZUAyLjAuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0tdGFibGUvaW5kZXguanMKdmFyIGluaXRfbWRhc3RfdXRpbF9nZm1fdGFibGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWdmbS10YWJsZUAyLjAuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0tdGFibGUvaW5kZXguanMiKCkgewogICAgaW5pdF9saWIxNigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1nZm0tdGFzay1saXN0LWl0ZW1AMi4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXRhc2stbGlzdC1pdGVtL2xpYi9pbmRleC5qcwpmdW5jdGlvbiBnZm1UYXNrTGlzdEl0ZW1Gcm9tTWFya2Rvd24oKSB7CiAgcmV0dXJuIHsKICAgIGV4aXQ6IHsKICAgICAgdGFza0xpc3RDaGVja1ZhbHVlQ2hlY2tlZDogZXhpdENoZWNrLAogICAgICB0YXNrTGlzdENoZWNrVmFsdWVVbmNoZWNrZWQ6IGV4aXRDaGVjaywKICAgICAgcGFyYWdyYXBoOiBleGl0UGFyYWdyYXBoV2l0aFRhc2tMaXN0SXRlbQogICAgfQogIH07Cn0KZnVuY3Rpb24gZ2ZtVGFza0xpc3RJdGVtVG9NYXJrZG93bigpIHsKICByZXR1cm4gewogICAgdW5zYWZlOiBbeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICItIiwgYWZ0ZXI6ICJbOnwtXSIgfV0sCiAgICBoYW5kbGVyczogeyBsaXN0SXRlbTogbGlzdEl0ZW1XaXRoVGFza0xpc3RJdGVtIH0KICB9Owp9CmZ1bmN0aW9uIGV4aXRDaGVjayh0b2tlbikgewogIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDJdOwogIG9rKG5vZGUyLnR5cGUgPT09ICJsaXN0SXRlbSIpOwogIG5vZGUyLmNoZWNrZWQgPSB0b2tlbi50eXBlID09PSAidGFza0xpc3RDaGVja1ZhbHVlQ2hlY2tlZCI7Cn0KZnVuY3Rpb24gZXhpdFBhcmFncmFwaFdpdGhUYXNrTGlzdEl0ZW0odG9rZW4pIHsKICBjb25zdCBwYXJlbnQgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMl07CiAgaWYgKHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PT0gImxpc3RJdGVtIiAmJiB0eXBlb2YgcGFyZW50LmNoZWNrZWQgPT09ICJib29sZWFuIikgewogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBvayhub2RlMi50eXBlID09PSAicGFyYWdyYXBoIik7CiAgICBjb25zdCBoZWFkMiA9IG5vZGUyLmNoaWxkcmVuWzBdOwogICAgaWYgKGhlYWQyICYmIGhlYWQyLnR5cGUgPT09ICJ0ZXh0IikgewogICAgICBjb25zdCBzaWJsaW5nczIgPSBwYXJlbnQuY2hpbGRyZW47CiAgICAgIGxldCBpbmRleDIgPSAtMTsKICAgICAgbGV0IGZpcnN0UGFyYWdocmFwaDsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgc2libGluZ3MyLmxlbmd0aCkgewogICAgICAgIGNvbnN0IHNpYmxpbmcgPSBzaWJsaW5nczJbaW5kZXgyXTsKICAgICAgICBpZiAoc2libGluZy50eXBlID09PSAicGFyYWdyYXBoIikgewogICAgICAgICAgZmlyc3RQYXJhZ2hyYXBoID0gc2libGluZzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZmlyc3RQYXJhZ2hyYXBoID09PSBub2RlMikgewogICAgICAgIGhlYWQyLnZhbHVlID0gaGVhZDIudmFsdWUuc2xpY2UoMSk7CiAgICAgICAgaWYgKGhlYWQyLnZhbHVlLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgbm9kZTIuY2hpbGRyZW4uc2hpZnQoKTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUyLnBvc2l0aW9uICYmIGhlYWQyLnBvc2l0aW9uICYmIHR5cGVvZiBoZWFkMi5wb3NpdGlvbi5zdGFydC5vZmZzZXQgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICBoZWFkMi5wb3NpdGlvbi5zdGFydC5jb2x1bW4rKzsKICAgICAgICAgIGhlYWQyLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCsrOwogICAgICAgICAgbm9kZTIucG9zaXRpb24uc3RhcnQgPSBPYmplY3QuYXNzaWduKHt9LCBoZWFkMi5wb3NpdGlvbi5zdGFydCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHRoaXMuZXhpdCh0b2tlbik7Cn0KZnVuY3Rpb24gbGlzdEl0ZW1XaXRoVGFza0xpc3RJdGVtKG5vZGUyLCBwYXJlbnQsIHN0YXRlMTAsIGluZm8pIHsKICBjb25zdCBoZWFkMiA9IG5vZGUyLmNoaWxkcmVuWzBdOwogIGNvbnN0IGNoZWNrYWJsZSA9IHR5cGVvZiBub2RlMi5jaGVja2VkID09PSAiYm9vbGVhbiIgJiYgaGVhZDIgJiYgaGVhZDIudHlwZSA9PT0gInBhcmFncmFwaCI7CiAgY29uc3QgY2hlY2tib3ggPSAiWyIgKyAobm9kZTIuY2hlY2tlZCA/ICJ4IiA6ICIgIikgKyAiXSAiOwogIGNvbnN0IHRyYWNrZXIgPSBzdGF0ZTEwLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgaWYgKGNoZWNrYWJsZSkgewogICAgdHJhY2tlci5tb3ZlKGNoZWNrYm94KTsKICB9CiAgbGV0IHZhbHVlMiA9IGhhbmRsZS5saXN0SXRlbShub2RlMiwgcGFyZW50LCBzdGF0ZTEwLCB7CiAgICAuLi5pbmZvLAogICAgLi4udHJhY2tlci5jdXJyZW50KCkKICB9KTsKICBpZiAoY2hlY2thYmxlKSB7CiAgICB2YWx1ZTIgPSB2YWx1ZTIucmVwbGFjZSgvXig/OlsqKy1dfFxkK1wuKShbXHJcbl18IHsxLDN9KS8sIGNoZWNrKTsKICB9CiAgcmV0dXJuIHZhbHVlMjsKICBmdW5jdGlvbiBjaGVjaygkMCkgewogICAgcmV0dXJuICQwICsgY2hlY2tib3g7CiAgfQp9CnZhciBpbml0X2xpYjE3ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1nZm0tdGFzay1saXN0LWl0ZW1AMi4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXRhc2stbGlzdC1pdGVtL2xpYi9pbmRleC5qcyIoKSB7CiAgICBpbml0X2RlZmF1bHQoKTsKICAgIGluaXRfbWRhc3RfdXRpbF90b19tYXJrZG93bigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1nZm0tdGFzay1saXN0LWl0ZW1AMi4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXRhc2stbGlzdC1pdGVtL2luZGV4LmpzCnZhciBpbml0X21kYXN0X3V0aWxfZ2ZtX3Rhc2tfbGlzdF9pdGVtID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1nZm0tdGFzay1saXN0LWl0ZW1AMi4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXRhc2stbGlzdC1pdGVtL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliMTcoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtQDMuMS4wL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS9saWIvaW5kZXguanMKZnVuY3Rpb24gZ2ZtRnJvbU1hcmtkb3duKCkgewogIHJldHVybiBbCiAgICBnZm1BdXRvbGlua0xpdGVyYWxGcm9tTWFya2Rvd24oKSwKICAgIGdmbUZvb3Rub3RlRnJvbU1hcmtkb3duKCksCiAgICBnZm1TdHJpa2V0aHJvdWdoRnJvbU1hcmtkb3duKCksCiAgICBnZm1UYWJsZUZyb21NYXJrZG93bigpLAogICAgZ2ZtVGFza0xpc3RJdGVtRnJvbU1hcmtkb3duKCkKICBdOwp9CmZ1bmN0aW9uIGdmbVRvTWFya2Rvd24ob3B0aW9ucykgewogIHJldHVybiB7CiAgICBleHRlbnNpb25zOiBbCiAgICAgIGdmbUF1dG9saW5rTGl0ZXJhbFRvTWFya2Rvd24oKSwKICAgICAgZ2ZtRm9vdG5vdGVUb01hcmtkb3duKG9wdGlvbnMpLAogICAgICBnZm1TdHJpa2V0aHJvdWdoVG9NYXJrZG93bigpLAogICAgICBnZm1UYWJsZVRvTWFya2Rvd24ob3B0aW9ucyksCiAgICAgIGdmbVRhc2tMaXN0SXRlbVRvTWFya2Rvd24oKQogICAgXQogIH07Cn0KdmFyIGluaXRfbGliMTggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWdmbUAzLjEuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0vbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfbWRhc3RfdXRpbF9nZm1fYXV0b2xpbmtfbGl0ZXJhbCgpOwogICAgaW5pdF9tZGFzdF91dGlsX2dmbV9mb290bm90ZSgpOwogICAgaW5pdF9tZGFzdF91dGlsX2dmbV9zdHJpa2V0aHJvdWdoKCk7CiAgICBpbml0X21kYXN0X3V0aWxfZ2ZtX3RhYmxlKCk7CiAgICBpbml0X21kYXN0X3V0aWxfZ2ZtX3Rhc2tfbGlzdF9pdGVtKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWdmbUAzLjEuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0vaW5kZXguanMKdmFyIGluaXRfbWRhc3RfdXRpbF9nZm0gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWdmbUAzLjEuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0vaW5kZXguanMiKCkgewogICAgaW5pdF9saWIxOCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtY2h1bmtlZEAyLjAuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtY2h1bmtlZC9pbmRleC5qcwpmdW5jdGlvbiBzcGxpY2UobGlzdDUsIHN0YXJ0LCByZW1vdmUyLCBpdGVtcykgewogIGNvbnN0IGVuZDMgPSBsaXN0NS5sZW5ndGg7CiAgbGV0IGNodW5rU3RhcnQgPSAwOwogIGxldCBwYXJhbWV0ZXJzOwogIGlmIChzdGFydCA8IDApIHsKICAgIHN0YXJ0ID0gLXN0YXJ0ID4gZW5kMyA/IDAgOiBlbmQzICsgc3RhcnQ7CiAgfSBlbHNlIHsKICAgIHN0YXJ0ID0gc3RhcnQgPiBlbmQzID8gZW5kMyA6IHN0YXJ0OwogIH0KICByZW1vdmUyID0gcmVtb3ZlMiA+IDAgPyByZW1vdmUyIDogMDsKICBpZiAoaXRlbXMubGVuZ3RoIDwgMWU0KSB7CiAgICBwYXJhbWV0ZXJzID0gQXJyYXkuZnJvbShpdGVtcyk7CiAgICBwYXJhbWV0ZXJzLnVuc2hpZnQoc3RhcnQsIHJlbW92ZTIpOwogICAgbGlzdDUuc3BsaWNlKC4uLnBhcmFtZXRlcnMpOwogIH0gZWxzZSB7CiAgICBpZiAocmVtb3ZlMikgbGlzdDUuc3BsaWNlKHN0YXJ0LCByZW1vdmUyKTsKICAgIHdoaWxlIChjaHVua1N0YXJ0IDwgaXRlbXMubGVuZ3RoKSB7CiAgICAgIHBhcmFtZXRlcnMgPSBpdGVtcy5zbGljZShjaHVua1N0YXJ0LCBjaHVua1N0YXJ0ICsgMWU0KTsKICAgICAgcGFyYW1ldGVycy51bnNoaWZ0KHN0YXJ0LCAwKTsKICAgICAgbGlzdDUuc3BsaWNlKC4uLnBhcmFtZXRlcnMpOwogICAgICBjaHVua1N0YXJ0ICs9IDFlNDsKICAgICAgc3RhcnQgKz0gMWU0OwogICAgfQogIH0KfQpmdW5jdGlvbiBwdXNoKGxpc3Q1LCBpdGVtcykgewogIGlmIChsaXN0NS5sZW5ndGggPiAwKSB7CiAgICBzcGxpY2UobGlzdDUsIGxpc3Q1Lmxlbmd0aCwgMCwgaXRlbXMpOwogICAgcmV0dXJuIGxpc3Q1OwogIH0KICByZXR1cm4gaXRlbXM7Cn0KdmFyIGluaXRfbWljcm9tYXJrX3V0aWxfY2h1bmtlZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLWNodW5rZWRAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLWNodW5rZWQvaW5kZXguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtY29tYmluZS1leHRlbnNpb25zQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1jb21iaW5lLWV4dGVuc2lvbnMvaW5kZXguanMKZnVuY3Rpb24gY29tYmluZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucykgewogIGNvbnN0IGFsbDMgPSB7fTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgZXh0ZW5zaW9ucy5sZW5ndGgpIHsKICAgIHN5bnRheEV4dGVuc2lvbihhbGwzLCBleHRlbnNpb25zW2luZGV4Ml0pOwogIH0KICByZXR1cm4gYWxsMzsKfQpmdW5jdGlvbiBzeW50YXhFeHRlbnNpb24oYWxsMywgZXh0ZW5zaW9uMikgewogIGxldCBob29rOwogIGZvciAoaG9vayBpbiBleHRlbnNpb24yKSB7CiAgICBjb25zdCBtYXliZSA9IGhhc093blByb3BlcnR5LmNhbGwoYWxsMywgaG9vaykgPyBhbGwzW2hvb2tdIDogdm9pZCAwOwogICAgY29uc3QgbGVmdCA9IG1heWJlIHx8IChhbGwzW2hvb2tdID0ge30pOwogICAgY29uc3QgcmlnaHQgPSBleHRlbnNpb24yW2hvb2tdOwogICAgbGV0IGNvZGU0OwogICAgaWYgKHJpZ2h0KSB7CiAgICAgIGZvciAoY29kZTQgaW4gcmlnaHQpIHsKICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwobGVmdCwgY29kZTQpKSBsZWZ0W2NvZGU0XSA9IFtdOwogICAgICAgIGNvbnN0IHZhbHVlMiA9IHJpZ2h0W2NvZGU0XTsKICAgICAgICBjb25zdHJ1Y3RzKAogICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBMb29rcyBsaWtlIGEgbGlzdC4KICAgICAgICAgIGxlZnRbY29kZTRdLAogICAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIpID8gdmFsdWUyIDogdmFsdWUyID8gW3ZhbHVlMl0gOiBbXQogICAgICAgICk7CiAgICAgIH0KICAgIH0KICB9Cn0KZnVuY3Rpb24gY29uc3RydWN0cyhleGlzdGluZywgbGlzdDUpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgY29uc3QgYmVmb3JlID0gW107CiAgd2hpbGUgKCsraW5kZXgyIDwgbGlzdDUubGVuZ3RoKSB7CiAgICA7CiAgICAobGlzdDVbaW5kZXgyXS5hZGQgPT09ICJhZnRlciIgPyBleGlzdGluZyA6IGJlZm9yZSkucHVzaChsaXN0NVtpbmRleDJdKTsKICB9CiAgc3BsaWNlKGV4aXN0aW5nLCAwLCAwLCBiZWZvcmUpOwp9CmZ1bmN0aW9uIGNvbWJpbmVIdG1sRXh0ZW5zaW9ucyhodG1sRXh0ZW5zaW9ucykgewogIGNvbnN0IGhhbmRsZXJzMiA9IHt9OwogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBodG1sRXh0ZW5zaW9ucy5sZW5ndGgpIHsKICAgIGh0bWxFeHRlbnNpb24oaGFuZGxlcnMyLCBodG1sRXh0ZW5zaW9uc1tpbmRleDJdKTsKICB9CiAgcmV0dXJuIGhhbmRsZXJzMjsKfQpmdW5jdGlvbiBodG1sRXh0ZW5zaW9uKGFsbDMsIGV4dGVuc2lvbjIpIHsKICBsZXQgaG9vazsKICBmb3IgKGhvb2sgaW4gZXh0ZW5zaW9uMikgewogICAgY29uc3QgbWF5YmUgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKGFsbDMsIGhvb2spID8gYWxsM1tob29rXSA6IHZvaWQgMDsKICAgIGNvbnN0IGxlZnQgPSBtYXliZSB8fCAoYWxsM1tob29rXSA9IHt9KTsKICAgIGNvbnN0IHJpZ2h0ID0gZXh0ZW5zaW9uMltob29rXTsKICAgIGxldCB0eXBlNTsKICAgIGlmIChyaWdodCkgewogICAgICBmb3IgKHR5cGU1IGluIHJpZ2h0KSB7CiAgICAgICAgbGVmdFt0eXBlNV0gPSByaWdodFt0eXBlNV07CiAgICAgIH0KICAgIH0KICB9Cn0KdmFyIGhhc093blByb3BlcnR5Owp2YXIgaW5pdF9taWNyb21hcmtfdXRpbF9jb21iaW5lX2V4dGVuc2lvbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1jb21iaW5lLWV4dGVuc2lvbnNAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLWNvbWJpbmUtZXh0ZW5zaW9ucy9pbmRleC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NodW5rZWQoKTsKICAgIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1hdXRvbGluay1saXRlcmFsQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1hdXRvbGluay1saXRlcmFsL2xpYi9zeW50YXguanMKZnVuY3Rpb24gZ2ZtQXV0b2xpbmtMaXRlcmFsKCkgewogIHJldHVybiB7CiAgICB0ZXh0OiB0ZXh0MgogIH07Cn0KZnVuY3Rpb24gdG9rZW5pemVFbWFpbEF1dG9saW5rKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGxldCBkb3Q7CiAgbGV0IGRhdGE7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBpZiAoIWdmbUF0ZXh0KGNvZGU0KSB8fCAhcHJldmlvdXNFbWFpbC5jYWxsKHNlbGYyLCBzZWxmMi5wcmV2aW91cykgfHwgcHJldmlvdXNVbmJhbGFuY2VkKHNlbGYyLmV2ZW50cykpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJsaXRlcmFsQXV0b2xpbmsiKTsKICAgIGVmZmVjdHMuZW50ZXIoImxpdGVyYWxBdXRvbGlua0VtYWlsIik7CiAgICByZXR1cm4gYXRleHQoY29kZTQpOwogIH0KICBmdW5jdGlvbiBhdGV4dChjb2RlNCkgewogICAgaWYgKGdmbUF0ZXh0KGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gYXRleHQ7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDY0KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBlbWFpbERvbWFpbjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBlbWFpbERvbWFpbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NikgewogICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhlbWFpbERvbWFpbkRvdFRyYWlsLCBlbWFpbERvbWFpbkFmdGVyLCBlbWFpbERvbWFpbkRvdCkoY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0NSB8fCBjb2RlNCA9PT0gOTUgfHwgYXNjaWlBbHBoYW51bWVyaWMoY29kZTQpKSB7CiAgICAgIGRhdGEgPSB0cnVlOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gZW1haWxEb21haW47CiAgICB9CiAgICByZXR1cm4gZW1haWxEb21haW5BZnRlcihjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGVtYWlsRG9tYWluRG90KGNvZGU0KSB7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZG90ID0gdHJ1ZTsKICAgIHJldHVybiBlbWFpbERvbWFpbjsKICB9CiAgZnVuY3Rpb24gZW1haWxEb21haW5BZnRlcihjb2RlNCkgewogICAgaWYgKGRhdGEgJiYgZG90ICYmIGFzY2lpQWxwaGEoc2VsZjIucHJldmlvdXMpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgibGl0ZXJhbEF1dG9saW5rRW1haWwiKTsKICAgICAgZWZmZWN0cy5leGl0KCJsaXRlcmFsQXV0b2xpbmsiKTsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVXd3dBdXRvbGluayhlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICByZXR1cm4gd3d3U3RhcnQ7CiAgZnVuY3Rpb24gd3d3U3RhcnQoY29kZTQpIHsKICAgIGlmIChjb2RlNCAhPT0gODcgJiYgY29kZTQgIT09IDExOSB8fCAhcHJldmlvdXNXd3cuY2FsbChzZWxmMiwgc2VsZjIucHJldmlvdXMpIHx8IHByZXZpb3VzVW5iYWxhbmNlZChzZWxmMi5ldmVudHMpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigibGl0ZXJhbEF1dG9saW5rIik7CiAgICBlZmZlY3RzLmVudGVyKCJsaXRlcmFsQXV0b2xpbmtXd3ciKTsKICAgIHJldHVybiBlZmZlY3RzLmNoZWNrKHd3d1ByZWZpeCwgZWZmZWN0cy5hdHRlbXB0KGRvbWFpbiwgZWZmZWN0cy5hdHRlbXB0KHBhdGgsIHd3d0FmdGVyKSwgbm9rKSwgbm9rKShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHd3d0FmdGVyKGNvZGU0KSB7CiAgICBlZmZlY3RzLmV4aXQoImxpdGVyYWxBdXRvbGlua1d3dyIpOwogICAgZWZmZWN0cy5leGl0KCJsaXRlcmFsQXV0b2xpbmsiKTsKICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KfQpmdW5jdGlvbiB0b2tlbml6ZVByb3RvY29sQXV0b2xpbmsoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IGJ1ZmZlcjIgPSAiIjsKICBsZXQgc2VlbiA9IGZhbHNlOwogIHJldHVybiBwcm90b2NvbFN0YXJ0OwogIGZ1bmN0aW9uIHByb3RvY29sU3RhcnQoY29kZTQpIHsKICAgIGlmICgoY29kZTQgPT09IDcyIHx8IGNvZGU0ID09PSAxMDQpICYmIHByZXZpb3VzUHJvdG9jb2wuY2FsbChzZWxmMiwgc2VsZjIucHJldmlvdXMpICYmICFwcmV2aW91c1VuYmFsYW5jZWQoc2VsZjIuZXZlbnRzKSkgewogICAgICBlZmZlY3RzLmVudGVyKCJsaXRlcmFsQXV0b2xpbmsiKTsKICAgICAgZWZmZWN0cy5lbnRlcigibGl0ZXJhbEF1dG9saW5rSHR0cCIpOwogICAgICBidWZmZXIyICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGU0KTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHByb3RvY29sUHJlZml4SW5zaWRlOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHByb3RvY29sUHJlZml4SW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoYXNjaWlBbHBoYShjb2RlNCkgJiYgYnVmZmVyMi5sZW5ndGggPCA1KSB7CiAgICAgIGJ1ZmZlcjIgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZTQpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gcHJvdG9jb2xQcmVmaXhJbnNpZGU7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDU4KSB7CiAgICAgIGNvbnN0IHByb3RvY29sID0gYnVmZmVyMi50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAocHJvdG9jb2wgPT09ICJodHRwIiB8fCBwcm90b2NvbCA9PT0gImh0dHBzIikgewogICAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgICAgcmV0dXJuIHByb3RvY29sU2xhc2hlc0luc2lkZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHByb3RvY29sU2xhc2hlc0luc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBpZiAoc2VlbikgewogICAgICAgIHJldHVybiBhZnRlclByb3RvY29sOwogICAgICB9CiAgICAgIHNlZW4gPSB0cnVlOwogICAgICByZXR1cm4gcHJvdG9jb2xTbGFzaGVzSW5zaWRlOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGFmdGVyUHJvdG9jb2woY29kZTQpIHsKICAgIHJldHVybiBjb2RlNCA9PT0gbnVsbCB8fCBhc2NpaUNvbnRyb2woY29kZTQpIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpIHx8IHVuaWNvZGVXaGl0ZXNwYWNlKGNvZGU0KSB8fCB1bmljb2RlUHVuY3R1YXRpb24oY29kZTQpID8gbm9rKGNvZGU0KSA6IGVmZmVjdHMuYXR0ZW1wdChkb21haW4sIGVmZmVjdHMuYXR0ZW1wdChwYXRoLCBwcm90b2NvbEFmdGVyKSwgbm9rKShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHByb3RvY29sQWZ0ZXIoY29kZTQpIHsKICAgIGVmZmVjdHMuZXhpdCgibGl0ZXJhbEF1dG9saW5rSHR0cCIpOwogICAgZWZmZWN0cy5leGl0KCJsaXRlcmFsQXV0b2xpbmsiKTsKICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KfQpmdW5jdGlvbiB0b2tlbml6ZVd3d1ByZWZpeChlZmZlY3RzLCBvazMsIG5vaykgewogIGxldCBzaXplID0gMDsKICByZXR1cm4gd3d3UHJlZml4SW5zaWRlOwogIGZ1bmN0aW9uIHd3d1ByZWZpeEluc2lkZShjb2RlNCkgewogICAgaWYgKChjb2RlNCA9PT0gODcgfHwgY29kZTQgPT09IDExOSkgJiYgc2l6ZSA8IDMpIHsKICAgICAgc2l6ZSsrOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gd3d3UHJlZml4SW5zaWRlOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0NiAmJiBzaXplID09PSAzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB3d3dQcmVmaXhBZnRlcjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiB3d3dQcmVmaXhBZnRlcihjb2RlNCkgewogICAgcmV0dXJuIGNvZGU0ID09PSBudWxsID8gbm9rKGNvZGU0KSA6IG9rMyhjb2RlNCk7CiAgfQp9CmZ1bmN0aW9uIHRva2VuaXplRG9tYWluKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgbGV0IHVuZGVyc2NvcmVJbkxhc3RTZWdtZW50OwogIGxldCB1bmRlcnNjb3JlSW5MYXN0TGFzdFNlZ21lbnQ7CiAgbGV0IHNlZW47CiAgcmV0dXJuIGRvbWFpbkluc2lkZTsKICBmdW5jdGlvbiBkb21haW5JbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDYgfHwgY29kZTQgPT09IDk1KSB7CiAgICAgIHJldHVybiBlZmZlY3RzLmNoZWNrKHRyYWlsLCBkb21haW5BZnRlciwgZG9tYWluQXRQdW5jdHVhdGlvbikoY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpIHx8IHVuaWNvZGVXaGl0ZXNwYWNlKGNvZGU0KSB8fCBjb2RlNCAhPT0gNDUgJiYgdW5pY29kZVB1bmN0dWF0aW9uKGNvZGU0KSkgewogICAgICByZXR1cm4gZG9tYWluQWZ0ZXIoY29kZTQpOwogICAgfQogICAgc2VlbiA9IHRydWU7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGRvbWFpbkluc2lkZTsKICB9CiAgZnVuY3Rpb24gZG9tYWluQXRQdW5jdHVhdGlvbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA5NSkgewogICAgICB1bmRlcnNjb3JlSW5MYXN0U2VnbWVudCA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICB1bmRlcnNjb3JlSW5MYXN0TGFzdFNlZ21lbnQgPSB1bmRlcnNjb3JlSW5MYXN0U2VnbWVudDsKICAgICAgdW5kZXJzY29yZUluTGFzdFNlZ21lbnQgPSB2b2lkIDA7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGRvbWFpbkluc2lkZTsKICB9CiAgZnVuY3Rpb24gZG9tYWluQWZ0ZXIoY29kZTQpIHsKICAgIGlmICh1bmRlcnNjb3JlSW5MYXN0TGFzdFNlZ21lbnQgfHwgdW5kZXJzY29yZUluTGFzdFNlZ21lbnQgfHwgIXNlZW4pIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVQYXRoKGVmZmVjdHMsIG9rMykgewogIGxldCBzaXplT3BlbiA9IDA7CiAgbGV0IHNpemVDbG9zZSA9IDA7CiAgcmV0dXJuIHBhdGhJbnNpZGU7CiAgZnVuY3Rpb24gcGF0aEluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0MCkgewogICAgICBzaXplT3BlbisrOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gcGF0aEluc2lkZTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDEgJiYgc2l6ZUNsb3NlIDwgc2l6ZU9wZW4pIHsKICAgICAgcmV0dXJuIHBhdGhBdFB1bmN0dWF0aW9uKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gMzMgfHwgY29kZTQgPT09IDM0IHx8IGNvZGU0ID09PSAzOCB8fCBjb2RlNCA9PT0gMzkgfHwgY29kZTQgPT09IDQxIHx8IGNvZGU0ID09PSA0MiB8fCBjb2RlNCA9PT0gNDQgfHwgY29kZTQgPT09IDQ2IHx8IGNvZGU0ID09PSA1OCB8fCBjb2RlNCA9PT0gNTkgfHwgY29kZTQgPT09IDYwIHx8IGNvZGU0ID09PSA2MyB8fCBjb2RlNCA9PT0gOTMgfHwgY29kZTQgPT09IDk1IHx8IGNvZGU0ID09PSAxMjYpIHsKICAgICAgcmV0dXJuIGVmZmVjdHMuY2hlY2sodHJhaWwsIG9rMywgcGF0aEF0UHVuY3R1YXRpb24pKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSB8fCB1bmljb2RlV2hpdGVzcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIHBhdGhJbnNpZGU7CiAgfQogIGZ1bmN0aW9uIHBhdGhBdFB1bmN0dWF0aW9uKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQxKSB7CiAgICAgIHNpemVDbG9zZSsrOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBwYXRoSW5zaWRlOwogIH0KfQpmdW5jdGlvbiB0b2tlbml6ZVRyYWlsKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgcmV0dXJuIHRyYWlsMjsKICBmdW5jdGlvbiB0cmFpbDIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gMzMgfHwgY29kZTQgPT09IDM0IHx8IGNvZGU0ID09PSAzOSB8fCBjb2RlNCA9PT0gNDEgfHwgY29kZTQgPT09IDQyIHx8IGNvZGU0ID09PSA0NCB8fCBjb2RlNCA9PT0gNDYgfHwgY29kZTQgPT09IDU4IHx8IGNvZGU0ID09PSA1OSB8fCBjb2RlNCA9PT0gNjMgfHwgY29kZTQgPT09IDk1IHx8IGNvZGU0ID09PSAxMjYpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRyYWlsMjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gMzgpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRyYWlsQ2hhcmFjdGVyUmVmZXJlbmNlU3RhcnQ7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDkzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB0cmFpbEJyYWNrZXRBZnRlcjsKICAgIH0KICAgIGlmICgKICAgICAgLy8gYDxgIGlzIGFuIGVuZC4KICAgICAgY29kZTQgPT09IDYwIHx8IC8vIFNvIGlzIHdoaXRlc3BhY2UuCiAgICAgIGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpIHx8IHVuaWNvZGVXaGl0ZXNwYWNlKGNvZGU0KQogICAgKSB7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHRyYWlsQnJhY2tldEFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDQwIHx8IGNvZGU0ID09PSA5MSB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSB8fCB1bmljb2RlV2hpdGVzcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gdHJhaWwyKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdHJhaWxDaGFyYWN0ZXJSZWZlcmVuY2VTdGFydChjb2RlNCkgewogICAgcmV0dXJuIGFzY2lpQWxwaGEoY29kZTQpID8gdHJhaWxDaGFyYWN0ZXJSZWZlcmVuY2VJbnNpZGUoY29kZTQpIDogbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdHJhaWxDaGFyYWN0ZXJSZWZlcmVuY2VJbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNTkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRyYWlsMjsKICAgIH0KICAgIGlmIChhc2NpaUFscGhhKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdHJhaWxDaGFyYWN0ZXJSZWZlcmVuY2VJbnNpZGU7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVFbWFpbERvbWFpbkRvdFRyYWlsKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGFmdGVyOwogIH0KICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgcmV0dXJuIGFzY2lpQWxwaGFudW1lcmljKGNvZGU0KSA/IG5vayhjb2RlNCkgOiBvazMoY29kZTQpOwogIH0KfQpmdW5jdGlvbiBwcmV2aW91c1d3dyhjb2RlNCkgewogIHJldHVybiBjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gNDAgfHwgY29kZTQgPT09IDQyIHx8IGNvZGU0ID09PSA5NSB8fCBjb2RlNCA9PT0gOTEgfHwgY29kZTQgPT09IDkzIHx8IGNvZGU0ID09PSAxMjYgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCk7Cn0KZnVuY3Rpb24gcHJldmlvdXNQcm90b2NvbChjb2RlNCkgewogIHJldHVybiAhYXNjaWlBbHBoYShjb2RlNCk7Cn0KZnVuY3Rpb24gcHJldmlvdXNFbWFpbChjb2RlNCkgewogIHJldHVybiAhKGNvZGU0ID09PSA0NyB8fCBnZm1BdGV4dChjb2RlNCkpOwp9CmZ1bmN0aW9uIGdmbUF0ZXh0KGNvZGU0KSB7CiAgcmV0dXJuIGNvZGU0ID09PSA0MyB8fCBjb2RlNCA9PT0gNDUgfHwgY29kZTQgPT09IDQ2IHx8IGNvZGU0ID09PSA5NSB8fCBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCk7Cn0KZnVuY3Rpb24gcHJldmlvdXNVbmJhbGFuY2VkKGV2ZW50cykgewogIGxldCBpbmRleDIgPSBldmVudHMubGVuZ3RoOwogIGxldCByZXN1bHQgPSBmYWxzZTsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIGNvbnN0IHRva2VuID0gZXZlbnRzW2luZGV4Ml1bMV07CiAgICBpZiAoKHRva2VuLnR5cGUgPT09ICJsYWJlbExpbmsiIHx8IHRva2VuLnR5cGUgPT09ICJsYWJlbEltYWdlIikgJiYgIXRva2VuLl9iYWxhbmNlZCkgewogICAgICByZXN1bHQgPSB0cnVlOwogICAgICBicmVhazsKICAgIH0KICAgIGlmICh0b2tlbi5fZ2ZtQXV0b2xpbmtMaXRlcmFsV2Fsa2VkSW50bykgewogICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmIChldmVudHMubGVuZ3RoID4gMCAmJiAhcmVzdWx0KSB7CiAgICBldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdWzFdLl9nZm1BdXRvbGlua0xpdGVyYWxXYWxrZWRJbnRvID0gdHJ1ZTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQp2YXIgd3d3UHJlZml4LCBkb21haW4sIHBhdGgsIHRyYWlsLCBlbWFpbERvbWFpbkRvdFRyYWlsLCB3d3dBdXRvbGluaywgcHJvdG9jb2xBdXRvbGluaywgZW1haWxBdXRvbGluaywgdGV4dDIsIGNvZGUyOwp2YXIgaW5pdF9zeW50YXggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1hdXRvbGluay1saXRlcmFsQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1hdXRvbGluay1saXRlcmFsL2xpYi9zeW50YXguanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIHd3d1ByZWZpeCA9IHsKICAgICAgdG9rZW5pemU6IHRva2VuaXplV3d3UHJlZml4LAogICAgICBwYXJ0aWFsOiB0cnVlCiAgICB9OwogICAgZG9tYWluID0gewogICAgICB0b2tlbml6ZTogdG9rZW5pemVEb21haW4sCiAgICAgIHBhcnRpYWw6IHRydWUKICAgIH07CiAgICBwYXRoID0gewogICAgICB0b2tlbml6ZTogdG9rZW5pemVQYXRoLAogICAgICBwYXJ0aWFsOiB0cnVlCiAgICB9OwogICAgdHJhaWwgPSB7CiAgICAgIHRva2VuaXplOiB0b2tlbml6ZVRyYWlsLAogICAgICBwYXJ0aWFsOiB0cnVlCiAgICB9OwogICAgZW1haWxEb21haW5Eb3RUcmFpbCA9IHsKICAgICAgdG9rZW5pemU6IHRva2VuaXplRW1haWxEb21haW5Eb3RUcmFpbCwKICAgICAgcGFydGlhbDogdHJ1ZQogICAgfTsKICAgIHd3d0F1dG9saW5rID0gewogICAgICBuYW1lOiAid3d3QXV0b2xpbmsiLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVXd3dBdXRvbGluaywKICAgICAgcHJldmlvdXM6IHByZXZpb3VzV3d3CiAgICB9OwogICAgcHJvdG9jb2xBdXRvbGluayA9IHsKICAgICAgbmFtZTogInByb3RvY29sQXV0b2xpbmsiLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVQcm90b2NvbEF1dG9saW5rLAogICAgICBwcmV2aW91czogcHJldmlvdXNQcm90b2NvbAogICAgfTsKICAgIGVtYWlsQXV0b2xpbmsgPSB7CiAgICAgIG5hbWU6ICJlbWFpbEF1dG9saW5rIiwKICAgICAgdG9rZW5pemU6IHRva2VuaXplRW1haWxBdXRvbGluaywKICAgICAgcHJldmlvdXM6IHByZXZpb3VzRW1haWwKICAgIH07CiAgICB0ZXh0MiA9IHt9OwogICAgY29kZTIgPSA0ODsKICAgIHdoaWxlIChjb2RlMiA8IDEyMykgewogICAgICB0ZXh0Mltjb2RlMl0gPSBlbWFpbEF1dG9saW5rOwogICAgICBjb2RlMisrOwogICAgICBpZiAoY29kZTIgPT09IDU4KSBjb2RlMiA9IDY1OwogICAgICBlbHNlIGlmIChjb2RlMiA9PT0gOTEpIGNvZGUyID0gOTc7CiAgICB9CiAgICB0ZXh0Mls0M10gPSBlbWFpbEF1dG9saW5rOwogICAgdGV4dDJbNDVdID0gZW1haWxBdXRvbGluazsKICAgIHRleHQyWzQ2XSA9IGVtYWlsQXV0b2xpbms7CiAgICB0ZXh0Mls5NV0gPSBlbWFpbEF1dG9saW5rOwogICAgdGV4dDJbNzJdID0gW2VtYWlsQXV0b2xpbmssIHByb3RvY29sQXV0b2xpbmtdOwogICAgdGV4dDJbMTA0XSA9IFtlbWFpbEF1dG9saW5rLCBwcm90b2NvbEF1dG9saW5rXTsKICAgIHRleHQyWzg3XSA9IFtlbWFpbEF1dG9saW5rLCB3d3dBdXRvbGlua107CiAgICB0ZXh0MlsxMTldID0gW2VtYWlsQXV0b2xpbmssIHd3d0F1dG9saW5rXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLWVuY29kZUAyLjAuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtZW5jb2RlL2luZGV4LmpzCmZ1bmN0aW9uIGVuY29kZSh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyLnJlcGxhY2UoL1siJjw+XS9nLCByZXBsYWNlNSk7CiAgZnVuY3Rpb24gcmVwbGFjZTUodmFsdWUzKSB7CiAgICByZXR1cm4gIiYiICsgY2hhcmFjdGVyUmVmZXJlbmNlc1sKICAgICAgLyoqIEB0eXBlIHtrZXlvZiB0eXBlb2YgY2hhcmFjdGVyUmVmZXJlbmNlc30gKi8KICAgICAgdmFsdWUzCiAgICBdICsgIjsiOwogIH0KfQp2YXIgY2hhcmFjdGVyUmVmZXJlbmNlczsKdmFyIGluaXRfbWljcm9tYXJrX3V0aWxfZW5jb2RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtZW5jb2RlQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1lbmNvZGUvaW5kZXguanMiKCkgewogICAgY2hhcmFjdGVyUmVmZXJlbmNlcyA9IHsgJyInOiAicXVvdCIsICImIjogImFtcCIsICI8IjogImx0IiwgIj4iOiAiZ3QiIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1zYW5pdGl6ZS11cmlAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLXNhbml0aXplLXVyaS9pbmRleC5qcwpmdW5jdGlvbiBzYW5pdGl6ZVVyaSh1cmwsIHByb3RvY29sKSB7CiAgY29uc3QgdmFsdWUyID0gZW5jb2RlKG5vcm1hbGl6ZVVyaSh1cmwgfHwgIiIpKTsKICBpZiAoIXByb3RvY29sKSB7CiAgICByZXR1cm4gdmFsdWUyOwogIH0KICBjb25zdCBjb2xvbiA9IHZhbHVlMi5pbmRleE9mKCI6Iik7CiAgY29uc3QgcXVlc3Rpb25NYXJrID0gdmFsdWUyLmluZGV4T2YoIj8iKTsKICBjb25zdCBudW1iZXJTaWduID0gdmFsdWUyLmluZGV4T2YoIiMiKTsKICBjb25zdCBzbGFzaCA9IHZhbHVlMi5pbmRleE9mKCIvIik7CiAgaWYgKAogICAgLy8gSWYgdGhlcmUgaXMgbm8gcHJvdG9jb2wsIGl04oCZcyByZWxhdGl2ZS4KICAgIGNvbG9uIDwgMCB8fCAvLyBJZiB0aGUgZmlyc3QgY29sb24gaXMgYWZ0ZXIgYSBgP2AsIGAjYCwgb3IgYC9gLCBpdOKAmXMgbm90IGEgcHJvdG9jb2wuCiAgICBzbGFzaCA+IC0xICYmIGNvbG9uID4gc2xhc2ggfHwgcXVlc3Rpb25NYXJrID4gLTEgJiYgY29sb24gPiBxdWVzdGlvbk1hcmsgfHwgbnVtYmVyU2lnbiA+IC0xICYmIGNvbG9uID4gbnVtYmVyU2lnbiB8fCAvLyBJdCBpcyBhIHByb3RvY29sLCBpdCBzaG91bGQgYmUgYWxsb3dlZC4KICAgIHByb3RvY29sLnRlc3QodmFsdWUyLnNsaWNlKDAsIGNvbG9uKSkKICApIHsKICAgIHJldHVybiB2YWx1ZTI7CiAgfQogIHJldHVybiAiIjsKfQpmdW5jdGlvbiBub3JtYWxpemVVcmkodmFsdWUyKSB7CiAgY29uc3QgcmVzdWx0ID0gW107CiAgbGV0IGluZGV4MiA9IC0xOwogIGxldCBzdGFydCA9IDA7CiAgbGV0IHNraXAyID0gMDsKICB3aGlsZSAoKytpbmRleDIgPCB2YWx1ZTIubGVuZ3RoKSB7CiAgICBjb25zdCBjb2RlNCA9IHZhbHVlMi5jaGFyQ29kZUF0KGluZGV4Mik7CiAgICBsZXQgcmVwbGFjZTUgPSAiIjsKICAgIGlmIChjb2RlNCA9PT0gMzcgJiYgYXNjaWlBbHBoYW51bWVyaWModmFsdWUyLmNoYXJDb2RlQXQoaW5kZXgyICsgMSkpICYmIGFzY2lpQWxwaGFudW1lcmljKHZhbHVlMi5jaGFyQ29kZUF0KGluZGV4MiArIDIpKSkgewogICAgICBza2lwMiA9IDI7CiAgICB9IGVsc2UgaWYgKGNvZGU0IDwgMTI4KSB7CiAgICAgIGlmICghL1shIyQmLTs9Py1aX2Eten5dLy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZTQpKSkgewogICAgICAgIHJlcGxhY2U1ID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlNCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY29kZTQgPiA1NTI5NSAmJiBjb2RlNCA8IDU3MzQ0KSB7CiAgICAgIGNvbnN0IG5leHQyID0gdmFsdWUyLmNoYXJDb2RlQXQoaW5kZXgyICsgMSk7CiAgICAgIGlmIChjb2RlNCA8IDU2MzIwICYmIG5leHQyID4gNTYzMTkgJiYgbmV4dDIgPCA1NzM0NCkgewogICAgICAgIHJlcGxhY2U1ID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlNCwgbmV4dDIpOwogICAgICAgIHNraXAyID0gMTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXBsYWNlNSA9ICJcdUZGRkQiOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXBsYWNlNSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZTQpOwogICAgfQogICAgaWYgKHJlcGxhY2U1KSB7CiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlMi5zbGljZShzdGFydCwgaW5kZXgyKSwgZW5jb2RlVVJJQ29tcG9uZW50KHJlcGxhY2U1KSk7CiAgICAgIHN0YXJ0ID0gaW5kZXgyICsgc2tpcDIgKyAxOwogICAgICByZXBsYWNlNSA9ICIiOwogICAgfQogICAgaWYgKHNraXAyKSB7CiAgICAgIGluZGV4MiArPSBza2lwMjsKICAgICAgc2tpcDIgPSAwOwogICAgfQogIH0KICByZXR1cm4gcmVzdWx0LmpvaW4oIiIpICsgdmFsdWUyLnNsaWNlKHN0YXJ0KTsKfQp2YXIgaW5pdF9taWNyb21hcmtfdXRpbF9zYW5pdGl6ZV91cmkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1zYW5pdGl6ZS11cmlAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLXNhbml0aXplLXVyaS9pbmRleC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9lbmNvZGUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLWF1dG9saW5rLWxpdGVyYWxAMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLWF1dG9saW5rLWxpdGVyYWwvbGliL2h0bWwuanMKZnVuY3Rpb24gZ2ZtQXV0b2xpbmtMaXRlcmFsSHRtbCgpIHsKICByZXR1cm4gewogICAgZXhpdDogewogICAgICBsaXRlcmFsQXV0b2xpbmtFbWFpbCwKICAgICAgbGl0ZXJhbEF1dG9saW5rSHR0cCwKICAgICAgbGl0ZXJhbEF1dG9saW5rV3d3CiAgICB9CiAgfTsKfQpmdW5jdGlvbiBsaXRlcmFsQXV0b2xpbmtXd3codG9rZW4pIHsKICBhbmNob3JGcm9tVG9rZW4uY2FsbCh0aGlzLCB0b2tlbiwgImh0dHA6Ly8iKTsKfQpmdW5jdGlvbiBsaXRlcmFsQXV0b2xpbmtFbWFpbCh0b2tlbikgewogIGFuY2hvckZyb21Ub2tlbi5jYWxsKHRoaXMsIHRva2VuLCAibWFpbHRvOiIpOwp9CmZ1bmN0aW9uIGxpdGVyYWxBdXRvbGlua0h0dHAodG9rZW4pIHsKICBhbmNob3JGcm9tVG9rZW4uY2FsbCh0aGlzLCB0b2tlbik7Cn0KZnVuY3Rpb24gYW5jaG9yRnJvbVRva2VuKHRva2VuLCBwcm90b2NvbCkgewogIGNvbnN0IHVybCA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwogIHRoaXMudGFnKCc8YSBocmVmPSInICsgc2FuaXRpemVVcmkoKHByb3RvY29sIHx8ICIiKSArIHVybCkgKyAnIj4nKTsKICB0aGlzLnJhdyh0aGlzLmVuY29kZSh1cmwpKTsKICB0aGlzLnRhZygiPC9hPiIpOwp9CnZhciBpbml0X2h0bWwyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tYXV0b2xpbmstbGl0ZXJhbEAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tYXV0b2xpbmstbGl0ZXJhbC9saWIvaHRtbC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX3Nhbml0aXplX3VyaSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tYXV0b2xpbmstbGl0ZXJhbEAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tYXV0b2xpbmstbGl0ZXJhbC9pbmRleC5qcwp2YXIgaW5pdF9taWNyb21hcmtfZXh0ZW5zaW9uX2dmbV9hdXRvbGlua19saXRlcmFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tYXV0b2xpbmstbGl0ZXJhbEAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tYXV0b2xpbmstbGl0ZXJhbC9pbmRleC5qcyIoKSB7CiAgICBpbml0X3N5bnRheCgpOwogICAgaW5pdF9odG1sMigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtcmVzb2x2ZS1hbGxAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLXJlc29sdmUtYWxsL2luZGV4LmpzCmZ1bmN0aW9uIHJlc29sdmVBbGwoY29uc3RydWN0czIsIGV2ZW50cywgY29udGV4dDIpIHsKICBjb25zdCBjYWxsZWQgPSBbXTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgY29uc3RydWN0czIubGVuZ3RoKSB7CiAgICBjb25zdCByZXNvbHZlMiA9IGNvbnN0cnVjdHMyW2luZGV4Ml0ucmVzb2x2ZUFsbDsKICAgIGlmIChyZXNvbHZlMiAmJiAhY2FsbGVkLmluY2x1ZGVzKHJlc29sdmUyKSkgewogICAgICBldmVudHMgPSByZXNvbHZlMihldmVudHMsIGNvbnRleHQyKTsKICAgICAgY2FsbGVkLnB1c2gocmVzb2x2ZTIpOwogICAgfQogIH0KICByZXR1cm4gZXZlbnRzOwp9CnZhciBpbml0X21pY3JvbWFya191dGlsX3Jlc29sdmVfYWxsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtcmVzb2x2ZS1hbGxAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLXJlc29sdmUtYWxsL2luZGV4LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2F0dGVudGlvbi5qcwpmdW5jdGlvbiByZXNvbHZlQWxsQXR0ZW50aW9uKGV2ZW50cywgY29udGV4dDIpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IG9wZW47CiAgbGV0IGdyb3VwOwogIGxldCB0ZXh0OTsKICBsZXQgb3BlbmluZ1NlcXVlbmNlOwogIGxldCBjbG9zaW5nU2VxdWVuY2U7CiAgbGV0IHVzZTsKICBsZXQgbmV4dEV2ZW50czsKICBsZXQgb2Zmc2V0OwogIHdoaWxlICgrK2luZGV4MiA8IGV2ZW50cy5sZW5ndGgpIHsKICAgIGlmIChldmVudHNbaW5kZXgyXVswXSA9PT0gImVudGVyIiAmJiBldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAiYXR0ZW50aW9uU2VxdWVuY2UiICYmIGV2ZW50c1tpbmRleDJdWzFdLl9jbG9zZSkgewogICAgICBvcGVuID0gaW5kZXgyOwogICAgICB3aGlsZSAob3Blbi0tKSB7CiAgICAgICAgaWYgKGV2ZW50c1tvcGVuXVswXSA9PT0gImV4aXQiICYmIGV2ZW50c1tvcGVuXVsxXS50eXBlID09PSAiYXR0ZW50aW9uU2VxdWVuY2UiICYmIGV2ZW50c1tvcGVuXVsxXS5fb3BlbiAmJiAvLyBJZiB0aGUgbWFya2VycyBhcmUgdGhlIHNhbWU6CiAgICAgICAgY29udGV4dDIuc2xpY2VTZXJpYWxpemUoZXZlbnRzW29wZW5dWzFdKS5jaGFyQ29kZUF0KDApID09PSBjb250ZXh0Mi5zbGljZVNlcmlhbGl6ZShldmVudHNbaW5kZXgyXVsxXSkuY2hhckNvZGVBdCgwKSkgewogICAgICAgICAgaWYgKChldmVudHNbb3Blbl1bMV0uX2Nsb3NlIHx8IGV2ZW50c1tpbmRleDJdWzFdLl9vcGVuKSAmJiAoZXZlbnRzW2luZGV4Ml1bMV0uZW5kLm9mZnNldCAtIGV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0Lm9mZnNldCkgJSAzICYmICEoKGV2ZW50c1tvcGVuXVsxXS5lbmQub2Zmc2V0IC0gZXZlbnRzW29wZW5dWzFdLnN0YXJ0Lm9mZnNldCArIGV2ZW50c1tpbmRleDJdWzFdLmVuZC5vZmZzZXQgLSBldmVudHNbaW5kZXgyXVsxXS5zdGFydC5vZmZzZXQpICUgMykpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICB1c2UgPSBldmVudHNbb3Blbl1bMV0uZW5kLm9mZnNldCAtIGV2ZW50c1tvcGVuXVsxXS5zdGFydC5vZmZzZXQgPiAxICYmIGV2ZW50c1tpbmRleDJdWzFdLmVuZC5vZmZzZXQgLSBldmVudHNbaW5kZXgyXVsxXS5zdGFydC5vZmZzZXQgPiAxID8gMiA6IDE7CiAgICAgICAgICBjb25zdCBzdGFydCA9IHsKICAgICAgICAgICAgLi4uZXZlbnRzW29wZW5dWzFdLmVuZAogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IGVuZDMgPSB7CiAgICAgICAgICAgIC4uLmV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0CiAgICAgICAgICB9OwogICAgICAgICAgbW92ZVBvaW50KHN0YXJ0LCAtdXNlKTsKICAgICAgICAgIG1vdmVQb2ludChlbmQzLCB1c2UpOwogICAgICAgICAgb3BlbmluZ1NlcXVlbmNlID0gewogICAgICAgICAgICB0eXBlOiB1c2UgPiAxID8gInN0cm9uZ1NlcXVlbmNlIiA6ICJlbXBoYXNpc1NlcXVlbmNlIiwKICAgICAgICAgICAgc3RhcnQsCiAgICAgICAgICAgIGVuZDogewogICAgICAgICAgICAgIC4uLmV2ZW50c1tvcGVuXVsxXS5lbmQKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIGNsb3NpbmdTZXF1ZW5jZSA9IHsKICAgICAgICAgICAgdHlwZTogdXNlID4gMSA/ICJzdHJvbmdTZXF1ZW5jZSIgOiAiZW1waGFzaXNTZXF1ZW5jZSIsCiAgICAgICAgICAgIHN0YXJ0OiB7CiAgICAgICAgICAgICAgLi4uZXZlbnRzW2luZGV4Ml1bMV0uc3RhcnQKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZW5kOiBlbmQzCiAgICAgICAgICB9OwogICAgICAgICAgdGV4dDkgPSB7CiAgICAgICAgICAgIHR5cGU6IHVzZSA+IDEgPyAic3Ryb25nVGV4dCIgOiAiZW1waGFzaXNUZXh0IiwKICAgICAgICAgICAgc3RhcnQ6IHsKICAgICAgICAgICAgICAuLi5ldmVudHNbb3Blbl1bMV0uZW5kCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVuZDogewogICAgICAgICAgICAgIC4uLmV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICBncm91cCA9IHsKICAgICAgICAgICAgdHlwZTogdXNlID4gMSA/ICJzdHJvbmciIDogImVtcGhhc2lzIiwKICAgICAgICAgICAgc3RhcnQ6IHsKICAgICAgICAgICAgICAuLi5vcGVuaW5nU2VxdWVuY2Uuc3RhcnQKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZW5kOiB7CiAgICAgICAgICAgICAgLi4uY2xvc2luZ1NlcXVlbmNlLmVuZAogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgZXZlbnRzW29wZW5dWzFdLmVuZCA9IHsKICAgICAgICAgICAgLi4ub3BlbmluZ1NlcXVlbmNlLnN0YXJ0CiAgICAgICAgICB9OwogICAgICAgICAgZXZlbnRzW2luZGV4Ml1bMV0uc3RhcnQgPSB7CiAgICAgICAgICAgIC4uLmNsb3NpbmdTZXF1ZW5jZS5lbmQKICAgICAgICAgIH07CiAgICAgICAgICBuZXh0RXZlbnRzID0gW107CiAgICAgICAgICBpZiAoZXZlbnRzW29wZW5dWzFdLmVuZC5vZmZzZXQgLSBldmVudHNbb3Blbl1bMV0uc3RhcnQub2Zmc2V0KSB7CiAgICAgICAgICAgIG5leHRFdmVudHMgPSBwdXNoKG5leHRFdmVudHMsIFtbImVudGVyIiwgZXZlbnRzW29wZW5dWzFdLCBjb250ZXh0Ml0sIFsiZXhpdCIsIGV2ZW50c1tvcGVuXVsxXSwgY29udGV4dDJdXSk7CiAgICAgICAgICB9CiAgICAgICAgICBuZXh0RXZlbnRzID0gcHVzaChuZXh0RXZlbnRzLCBbWyJlbnRlciIsIGdyb3VwLCBjb250ZXh0Ml0sIFsiZW50ZXIiLCBvcGVuaW5nU2VxdWVuY2UsIGNvbnRleHQyXSwgWyJleGl0Iiwgb3BlbmluZ1NlcXVlbmNlLCBjb250ZXh0Ml0sIFsiZW50ZXIiLCB0ZXh0OSwgY29udGV4dDJdXSk7CiAgICAgICAgICBuZXh0RXZlbnRzID0gcHVzaChuZXh0RXZlbnRzLCByZXNvbHZlQWxsKGNvbnRleHQyLnBhcnNlci5jb25zdHJ1Y3RzLmluc2lkZVNwYW4ubnVsbCwgZXZlbnRzLnNsaWNlKG9wZW4gKyAxLCBpbmRleDIpLCBjb250ZXh0MikpOwogICAgICAgICAgbmV4dEV2ZW50cyA9IHB1c2gobmV4dEV2ZW50cywgW1siZXhpdCIsIHRleHQ5LCBjb250ZXh0Ml0sIFsiZW50ZXIiLCBjbG9zaW5nU2VxdWVuY2UsIGNvbnRleHQyXSwgWyJleGl0IiwgY2xvc2luZ1NlcXVlbmNlLCBjb250ZXh0Ml0sIFsiZXhpdCIsIGdyb3VwLCBjb250ZXh0Ml1dKTsKICAgICAgICAgIGlmIChldmVudHNbaW5kZXgyXVsxXS5lbmQub2Zmc2V0IC0gZXZlbnRzW2luZGV4Ml1bMV0uc3RhcnQub2Zmc2V0KSB7CiAgICAgICAgICAgIG9mZnNldCA9IDI7CiAgICAgICAgICAgIG5leHRFdmVudHMgPSBwdXNoKG5leHRFdmVudHMsIFtbImVudGVyIiwgZXZlbnRzW2luZGV4Ml1bMV0sIGNvbnRleHQyXSwgWyJleGl0IiwgZXZlbnRzW2luZGV4Ml1bMV0sIGNvbnRleHQyXV0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb2Zmc2V0ID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIHNwbGljZShldmVudHMsIG9wZW4gLSAxLCBpbmRleDIgLSBvcGVuICsgMywgbmV4dEV2ZW50cyk7CiAgICAgICAgICBpbmRleDIgPSBvcGVuICsgbmV4dEV2ZW50cy5sZW5ndGggLSBvZmZzZXQgLSAyOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IGV2ZW50cy5sZW5ndGgpIHsKICAgIGlmIChldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAiYXR0ZW50aW9uU2VxdWVuY2UiKSB7CiAgICAgIGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPSAiZGF0YSI7CiAgICB9CiAgfQogIHJldHVybiBldmVudHM7Cn0KZnVuY3Rpb24gdG9rZW5pemVBdHRlbnRpb24oZWZmZWN0cywgb2szKSB7CiAgY29uc3QgYXR0ZW50aW9uTWFya2VyczIgPSB0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmF0dGVudGlvbk1hcmtlcnMubnVsbDsKICBjb25zdCBwcmV2aW91czMgPSB0aGlzLnByZXZpb3VzOwogIGNvbnN0IGJlZm9yZSA9IGNsYXNzaWZ5Q2hhcmFjdGVyKHByZXZpb3VzMyk7CiAgbGV0IG1hcmtlcjsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIG1hcmtlciA9IGNvZGU0OwogICAgZWZmZWN0cy5lbnRlcigiYXR0ZW50aW9uU2VxdWVuY2UiKTsKICAgIHJldHVybiBpbnNpZGUoY29kZTQpOwogIH0KICBmdW5jdGlvbiBpbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbWFya2VyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBpbnNpZGU7CiAgICB9CiAgICBjb25zdCB0b2tlbiA9IGVmZmVjdHMuZXhpdCgiYXR0ZW50aW9uU2VxdWVuY2UiKTsKICAgIGNvbnN0IGFmdGVyID0gY2xhc3NpZnlDaGFyYWN0ZXIoY29kZTQpOwogICAgY29uc3Qgb3BlbiA9ICFhZnRlciB8fCBhZnRlciA9PT0gMiAmJiBiZWZvcmUgfHwgYXR0ZW50aW9uTWFya2VyczIuaW5jbHVkZXMoY29kZTQpOwogICAgY29uc3QgY2xvc2U3ID0gIWJlZm9yZSB8fCBiZWZvcmUgPT09IDIgJiYgYWZ0ZXIgfHwgYXR0ZW50aW9uTWFya2VyczIuaW5jbHVkZXMocHJldmlvdXMzKTsKICAgIHRva2VuLl9vcGVuID0gQm9vbGVhbihtYXJrZXIgPT09IDQyID8gb3BlbiA6IG9wZW4gJiYgKGJlZm9yZSB8fCAhY2xvc2U3KSk7CiAgICB0b2tlbi5fY2xvc2UgPSBCb29sZWFuKG1hcmtlciA9PT0gNDIgPyBjbG9zZTcgOiBjbG9zZTcgJiYgKGFmdGVyIHx8ICFvcGVuKSk7CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gbW92ZVBvaW50KHBvaW50NCwgb2Zmc2V0KSB7CiAgcG9pbnQ0LmNvbHVtbiArPSBvZmZzZXQ7CiAgcG9pbnQ0Lm9mZnNldCArPSBvZmZzZXQ7CiAgcG9pbnQ0Ll9idWZmZXJJbmRleCArPSBvZmZzZXQ7Cn0KdmFyIGF0dGVudGlvbjsKdmFyIGluaXRfYXR0ZW50aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvYXR0ZW50aW9uLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2h1bmtlZCgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jbGFzc2lmeV9jaGFyYWN0ZXIoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfcmVzb2x2ZV9hbGwoKTsKICAgIGF0dGVudGlvbiA9IHsKICAgICAgbmFtZTogImF0dGVudGlvbiIsCiAgICAgIHJlc29sdmVBbGw6IHJlc29sdmVBbGxBdHRlbnRpb24sCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZUF0dGVudGlvbgogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2F1dG9saW5rLmpzCmZ1bmN0aW9uIHRva2VuaXplQXV0b2xpbmsoZWZmZWN0cywgb2szLCBub2spIHsKICBsZXQgc2l6ZSA9IDA7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJhdXRvbGluayIpOwogICAgZWZmZWN0cy5lbnRlcigiYXV0b2xpbmtNYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImF1dG9saW5rTWFya2VyIik7CiAgICBlZmZlY3RzLmVudGVyKCJhdXRvbGlua1Byb3RvY29sIik7CiAgICByZXR1cm4gb3BlbjsKICB9CiAgZnVuY3Rpb24gb3Blbihjb2RlNCkgewogICAgaWYgKGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBzY2hlbWVPckVtYWlsQXRleHQ7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDY0KSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgcmV0dXJuIGVtYWlsQXRleHQoY29kZTQpOwogIH0KICBmdW5jdGlvbiBzY2hlbWVPckVtYWlsQXRleHQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDMgfHwgY29kZTQgPT09IDQ1IHx8IGNvZGU0ID09PSA0NiB8fCBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCkpIHsKICAgICAgc2l6ZSA9IDE7CiAgICAgIHJldHVybiBzY2hlbWVJbnNpZGVPckVtYWlsQXRleHQoY29kZTQpOwogICAgfQogICAgcmV0dXJuIGVtYWlsQXRleHQoY29kZTQpOwogIH0KICBmdW5jdGlvbiBzY2hlbWVJbnNpZGVPckVtYWlsQXRleHQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNTgpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgc2l6ZSA9IDA7CiAgICAgIHJldHVybiB1cmxJbnNpZGU7CiAgICB9CiAgICBpZiAoKGNvZGU0ID09PSA0MyB8fCBjb2RlNCA9PT0gNDUgfHwgY29kZTQgPT09IDQ2IHx8IGFzY2lpQWxwaGFudW1lcmljKGNvZGU0KSkgJiYgc2l6ZSsrIDwgMzIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHNjaGVtZUluc2lkZU9yRW1haWxBdGV4dDsKICAgIH0KICAgIHNpemUgPSAwOwogICAgcmV0dXJuIGVtYWlsQXRleHQoY29kZTQpOwogIH0KICBmdW5jdGlvbiB1cmxJbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNjIpIHsKICAgICAgZWZmZWN0cy5leGl0KCJhdXRvbGlua1Byb3RvY29sIik7CiAgICAgIGVmZmVjdHMuZW50ZXIoImF1dG9saW5rTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiYXV0b2xpbmtNYXJrZXIiKTsKICAgICAgZWZmZWN0cy5leGl0KCJhdXRvbGluayIpOwogICAgICByZXR1cm4gb2szOwogICAgfQogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSAzMiB8fCBjb2RlNCA9PT0gNjAgfHwgYXNjaWlDb250cm9sKGNvZGU0KSkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gdXJsSW5zaWRlOwogIH0KICBmdW5jdGlvbiBlbWFpbEF0ZXh0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDY0KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBlbWFpbEF0U2lnbk9yRG90OwogICAgfQogICAgaWYgKGFzY2lpQXRleHQoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBlbWFpbEF0ZXh0OwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGVtYWlsQXRTaWduT3JEb3QoY29kZTQpIHsKICAgIHJldHVybiBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCkgPyBlbWFpbExhYmVsKGNvZGU0KSA6IG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGVtYWlsTGFiZWwoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDYpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgc2l6ZSA9IDA7CiAgICAgIHJldHVybiBlbWFpbEF0U2lnbk9yRG90OwogICAgfQogICAgaWYgKGNvZGU0ID09PSA2MikgewogICAgICBlZmZlY3RzLmV4aXQoImF1dG9saW5rUHJvdG9jb2wiKS50eXBlID0gImF1dG9saW5rRW1haWwiOwogICAgICBlZmZlY3RzLmVudGVyKCJhdXRvbGlua01hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImF1dG9saW5rTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiYXV0b2xpbmsiKTsKICAgICAgcmV0dXJuIG9rMzsKICAgIH0KICAgIHJldHVybiBlbWFpbFZhbHVlKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gZW1haWxWYWx1ZShjb2RlNCkgewogICAgaWYgKChjb2RlNCA9PT0gNDUgfHwgYXNjaWlBbHBoYW51bWVyaWMoY29kZTQpKSAmJiBzaXplKysgPCA2MykgewogICAgICBjb25zdCBuZXh0MiA9IGNvZGU0ID09PSA0NSA/IGVtYWlsVmFsdWUgOiBlbWFpbExhYmVsOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gbmV4dDI7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9Cn0KdmFyIGF1dG9saW5rOwp2YXIgaW5pdF9hdXRvbGluayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2F1dG9saW5rLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgICBhdXRvbGluayA9IHsKICAgICAgbmFtZTogImF1dG9saW5rIiwKICAgICAgdG9rZW5pemU6IHRva2VuaXplQXV0b2xpbmsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZmFjdG9yeS1zcGFjZUAyLjAuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWZhY3Rvcnktc3BhY2UvaW5kZXguanMKZnVuY3Rpb24gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIG9rMywgdHlwZTUsIG1heDMpIHsKICBjb25zdCBsaW1pdCA9IG1heDMgPyBtYXgzIC0gMSA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICBsZXQgc2l6ZSA9IDA7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5lbnRlcih0eXBlNSk7CiAgICAgIHJldHVybiBwcmVmaXg0KGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KICBmdW5jdGlvbiBwcmVmaXg0KGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkgJiYgc2l6ZSsrIDwgbGltaXQpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHByZWZpeDQ7CiAgICB9CiAgICBlZmZlY3RzLmV4aXQodHlwZTUpOwogICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgfQp9CnZhciBpbml0X21pY3JvbWFya19mYWN0b3J5X3NwYWNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWZhY3Rvcnktc3BhY2VAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1mYWN0b3J5LXNwYWNlL2luZGV4LmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9ibGFuay1saW5lLmpzCmZ1bmN0aW9uIHRva2VuaXplQmxhbmtMaW5lKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICByZXR1cm4gbWFya2Rvd25TcGFjZShjb2RlNCkgPyBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXIsICJsaW5lUHJlZml4IikoY29kZTQpIDogYWZ0ZXIoY29kZTQpOwogIH0KICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgcmV0dXJuIGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkgPyBvazMoY29kZTQpIDogbm9rKGNvZGU0KTsKICB9Cn0KdmFyIGJsYW5rTGluZTsKdmFyIGluaXRfYmxhbmtfbGluZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2JsYW5rLWxpbmUuanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9zcGFjZSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGJsYW5rTGluZSA9IHsKICAgICAgcGFydGlhbDogdHJ1ZSwKICAgICAgdG9rZW5pemU6IHRva2VuaXplQmxhbmtMaW5lCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvYmxvY2stcXVvdGUuanMKZnVuY3Rpb24gdG9rZW5pemVCbG9ja1F1b3RlU3RhcnQoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIGNvbnN0IHN0YXRlMTAgPSBzZWxmMi5jb250YWluZXJTdGF0ZTsKICAgICAgaWYgKCFzdGF0ZTEwLm9wZW4pIHsKICAgICAgICBlZmZlY3RzLmVudGVyKCJibG9ja1F1b3RlIiwgewogICAgICAgICAgX2NvbnRhaW5lcjogdHJ1ZQogICAgICAgIH0pOwogICAgICAgIHN0YXRlMTAub3BlbiA9IHRydWU7CiAgICAgIH0KICAgICAgZWZmZWN0cy5lbnRlcigiYmxvY2tRdW90ZVByZWZpeCIpOwogICAgICBlZmZlY3RzLmVudGVyKCJibG9ja1F1b3RlTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiYmxvY2tRdW90ZU1hcmtlciIpOwogICAgICByZXR1cm4gYWZ0ZXI7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmVudGVyKCJibG9ja1F1b3RlUHJlZml4V2hpdGVzcGFjZSIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImJsb2NrUXVvdGVQcmVmaXhXaGl0ZXNwYWNlIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiYmxvY2tRdW90ZVByZWZpeCIpOwogICAgICByZXR1cm4gb2szOwogICAgfQogICAgZWZmZWN0cy5leGl0KCJibG9ja1F1b3RlUHJlZml4Iik7CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVCbG9ja1F1b3RlQ29udGludWF0aW9uKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHJldHVybiBjb250U3RhcnQ7CiAgZnVuY3Rpb24gY29udFN0YXJ0KGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBjb250QmVmb3JlLCAibGluZVByZWZpeCIsIHNlbGYyLnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmNsdWRlcygiY29kZUluZGVudGVkIikgPyB2b2lkIDAgOiA0KShjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gY29udEJlZm9yZShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbnRCZWZvcmUoY29kZTQpIHsKICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoYmxvY2tRdW90ZSwgb2szLCBub2spKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gZXhpdDIoZWZmZWN0cykgewogIGVmZmVjdHMuZXhpdCgiYmxvY2tRdW90ZSIpOwp9CnZhciBibG9ja1F1b3RlOwp2YXIgaW5pdF9ibG9ja19xdW90ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2Jsb2NrLXF1b3RlLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX2ZhY3Rvcnlfc3BhY2UoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgICBibG9ja1F1b3RlID0gewogICAgICBjb250aW51YXRpb246IHsKICAgICAgICB0b2tlbml6ZTogdG9rZW5pemVCbG9ja1F1b3RlQ29udGludWF0aW9uCiAgICAgIH0sCiAgICAgIGV4aXQ6IGV4aXQyLAogICAgICBuYW1lOiAiYmxvY2tRdW90ZSIsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZUJsb2NrUXVvdGVTdGFydAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2NoYXJhY3Rlci1lc2NhcGUuanMKZnVuY3Rpb24gdG9rZW5pemVDaGFyYWN0ZXJFc2NhcGUoZWZmZWN0cywgb2szLCBub2spIHsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlckVzY2FwZSIpOwogICAgZWZmZWN0cy5lbnRlcigiZXNjYXBlTWFya2VyIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJlc2NhcGVNYXJrZXIiKTsKICAgIHJldHVybiBpbnNpZGU7CiAgfQogIGZ1bmN0aW9uIGluc2lkZShjb2RlNCkgewogICAgaWYgKGFzY2lpUHVuY3R1YXRpb24oY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlckVzY2FwZVZhbHVlIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2hhcmFjdGVyRXNjYXBlVmFsdWUiKTsKICAgICAgZWZmZWN0cy5leGl0KCJjaGFyYWN0ZXJFc2NhcGUiKTsKICAgICAgcmV0dXJuIG9rMzsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KfQp2YXIgY2hhcmFjdGVyRXNjYXBlOwp2YXIgaW5pdF9jaGFyYWN0ZXJfZXNjYXBlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvY2hhcmFjdGVyLWVzY2FwZS5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogICAgY2hhcmFjdGVyRXNjYXBlID0gewogICAgICBuYW1lOiAiY2hhcmFjdGVyRXNjYXBlIiwKICAgICAgdG9rZW5pemU6IHRva2VuaXplQ2hhcmFjdGVyRXNjYXBlCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvY2hhcmFjdGVyLXJlZmVyZW5jZS5qcwpmdW5jdGlvbiB0b2tlbml6ZUNoYXJhY3RlclJlZmVyZW5jZShlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBsZXQgc2l6ZSA9IDA7CiAgbGV0IG1heDM7CiAgbGV0IHRlc3Q7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJjaGFyYWN0ZXJSZWZlcmVuY2UiKTsKICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlciIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgiY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyIik7CiAgICByZXR1cm4gb3BlbjsKICB9CiAgZnVuY3Rpb24gb3Blbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSAzNSkgewogICAgICBlZmZlY3RzLmVudGVyKCJjaGFyYWN0ZXJSZWZlcmVuY2VNYXJrZXJOdW1lcmljIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyTnVtZXJpYyIpOwogICAgICByZXR1cm4gbnVtZXJpYzsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlclJlZmVyZW5jZVZhbHVlIik7CiAgICBtYXgzID0gMzE7CiAgICB0ZXN0ID0gYXNjaWlBbHBoYW51bWVyaWM7CiAgICByZXR1cm4gdmFsdWUyKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gbnVtZXJpYyhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA4OCB8fCBjb2RlNCA9PT0gMTIwKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlckhleGFkZWNpbWFsIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VySGV4YWRlY2ltYWwiKTsKICAgICAgZWZmZWN0cy5lbnRlcigiY2hhcmFjdGVyUmVmZXJlbmNlVmFsdWUiKTsKICAgICAgbWF4MyA9IDY7CiAgICAgIHRlc3QgPSBhc2NpaUhleERpZ2l0OwogICAgICByZXR1cm4gdmFsdWUyOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigiY2hhcmFjdGVyUmVmZXJlbmNlVmFsdWUiKTsKICAgIG1heDMgPSA3OwogICAgdGVzdCA9IGFzY2lpRGlnaXQ7CiAgICByZXR1cm4gdmFsdWUyKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdmFsdWUyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDU5ICYmIHNpemUpIHsKICAgICAgY29uc3QgdG9rZW4gPSBlZmZlY3RzLmV4aXQoImNoYXJhY3RlclJlZmVyZW5jZVZhbHVlIik7CiAgICAgIGlmICh0ZXN0ID09PSBhc2NpaUFscGhhbnVtZXJpYyAmJiAhZGVjb2RlTmFtZWRDaGFyYWN0ZXJSZWZlcmVuY2Uoc2VsZjIuc2xpY2VTZXJpYWxpemUodG9rZW4pKSkgewogICAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgICB9CiAgICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlciIpOwogICAgICBlZmZlY3RzLmV4aXQoImNoYXJhY3RlclJlZmVyZW5jZSIpOwogICAgICByZXR1cm4gb2szOwogICAgfQogICAgaWYgKHRlc3QoY29kZTQpICYmIHNpemUrKyA8IG1heDMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHZhbHVlMjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KfQp2YXIgY2hhcmFjdGVyUmVmZXJlbmNlOwp2YXIgaW5pdF9jaGFyYWN0ZXJfcmVmZXJlbmNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvY2hhcmFjdGVyLXJlZmVyZW5jZS5qcyIoKSB7CiAgICBpbml0X2luZGV4X2RvbSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGNoYXJhY3RlclJlZmVyZW5jZSA9IHsKICAgICAgbmFtZTogImNoYXJhY3RlclJlZmVyZW5jZSIsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZUNoYXJhY3RlclJlZmVyZW5jZQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2NvZGUtZmVuY2VkLmpzCmZ1bmN0aW9uIHRva2VuaXplQ29kZUZlbmNlZChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBjb25zdCBjbG9zZVN0YXJ0ID0gewogICAgcGFydGlhbDogdHJ1ZSwKICAgIHRva2VuaXplOiB0b2tlbml6ZUNsb3NlU3RhcnQKICB9OwogIGxldCBpbml0aWFsUHJlZml4ID0gMDsKICBsZXQgc2l6ZU9wZW4gPSAwOwogIGxldCBtYXJrZXI7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICByZXR1cm4gYmVmb3JlU2VxdWVuY2VPcGVuKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYmVmb3JlU2VxdWVuY2VPcGVuKGNvZGU0KSB7CiAgICBjb25zdCB0YWlsID0gc2VsZjIuZXZlbnRzW3NlbGYyLmV2ZW50cy5sZW5ndGggLSAxXTsKICAgIGluaXRpYWxQcmVmaXggPSB0YWlsICYmIHRhaWxbMV0udHlwZSA9PT0gImxpbmVQcmVmaXgiID8gdGFpbFsyXS5zbGljZVNlcmlhbGl6ZSh0YWlsWzFdLCB0cnVlKS5sZW5ndGggOiAwOwogICAgbWFya2VyID0gY29kZTQ7CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlRmVuY2VkIik7CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlRmVuY2VkRmVuY2UiKTsKICAgIGVmZmVjdHMuZW50ZXIoImNvZGVGZW5jZWRGZW5jZVNlcXVlbmNlIik7CiAgICByZXR1cm4gc2VxdWVuY2VPcGVuKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gc2VxdWVuY2VPcGVuKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG1hcmtlcikgewogICAgICBzaXplT3BlbisrOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gc2VxdWVuY2VPcGVuOwogICAgfQogICAgaWYgKHNpemVPcGVuIDwgMykgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZXhpdCgiY29kZUZlbmNlZEZlbmNlU2VxdWVuY2UiKTsKICAgIHJldHVybiBtYXJrZG93blNwYWNlKGNvZGU0KSA/IGZhY3RvcnlTcGFjZShlZmZlY3RzLCBpbmZvQmVmb3JlLCAid2hpdGVzcGFjZSIpKGNvZGU0KSA6IGluZm9CZWZvcmUoY29kZTQpOwogIH0KICBmdW5jdGlvbiBpbmZvQmVmb3JlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImNvZGVGZW5jZWRGZW5jZSIpOwogICAgICByZXR1cm4gc2VsZjIuaW50ZXJydXB0ID8gb2szKGNvZGU0KSA6IGVmZmVjdHMuY2hlY2sobm9uTGF6eUNvbnRpbnVhdGlvbiwgYXROb25MYXp5QnJlYWssIGFmdGVyKShjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlRmVuY2VkRmVuY2VJbmZvIik7CiAgICBlZmZlY3RzLmVudGVyKCJjaHVua1N0cmluZyIsIHsKICAgICAgY29udGVudFR5cGU6ICJzdHJpbmciCiAgICB9KTsKICAgIHJldHVybiBpbmZvKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gaW5mbyhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJjaHVua1N0cmluZyIpOwogICAgICBlZmZlY3RzLmV4aXQoImNvZGVGZW5jZWRGZW5jZUluZm8iKTsKICAgICAgcmV0dXJuIGluZm9CZWZvcmUoY29kZTQpOwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2h1bmtTdHJpbmciKTsKICAgICAgZWZmZWN0cy5leGl0KCJjb2RlRmVuY2VkRmVuY2VJbmZvIik7CiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgbWV0YUJlZm9yZSwgIndoaXRlc3BhY2UiKShjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDk2ICYmIGNvZGU0ID09PSBtYXJrZXIpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGluZm87CiAgfQogIGZ1bmN0aW9uIG1ldGFCZWZvcmUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBpbmZvQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImNvZGVGZW5jZWRGZW5jZU1ldGEiKTsKICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIiwgewogICAgICBjb250ZW50VHlwZTogInN0cmluZyIKICAgIH0pOwogICAgcmV0dXJuIG1ldGEoY29kZTQpOwogIH0KICBmdW5jdGlvbiBtZXRhKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rU3RyaW5nIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiY29kZUZlbmNlZEZlbmNlTWV0YSIpOwogICAgICByZXR1cm4gaW5mb0JlZm9yZShjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDk2ICYmIGNvZGU0ID09PSBtYXJrZXIpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIG1ldGE7CiAgfQogIGZ1bmN0aW9uIGF0Tm9uTGF6eUJyZWFrKGNvZGU0KSB7CiAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KGNsb3NlU3RhcnQsIGFmdGVyLCBjb250ZW50QmVmb3JlKShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbnRlbnRCZWZvcmUoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgIHJldHVybiBjb250ZW50U3RhcnQ7CiAgfQogIGZ1bmN0aW9uIGNvbnRlbnRTdGFydChjb2RlNCkgewogICAgcmV0dXJuIGluaXRpYWxQcmVmaXggPiAwICYmIG1hcmtkb3duU3BhY2UoY29kZTQpID8gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGJlZm9yZUNvbnRlbnRDaHVuaywgImxpbmVQcmVmaXgiLCBpbml0aWFsUHJlZml4ICsgMSkoY29kZTQpIDogYmVmb3JlQ29udGVudENodW5rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYmVmb3JlQ29udGVudENodW5rKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhub25MYXp5Q29udGludWF0aW9uLCBhdE5vbkxhenlCcmVhaywgYWZ0ZXIpKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImNvZGVGbG93VmFsdWUiKTsKICAgIHJldHVybiBjb250ZW50Q2h1bmsoY29kZTQpOwogIH0KICBmdW5jdGlvbiBjb250ZW50Q2h1bmsoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY29kZUZsb3dWYWx1ZSIpOwogICAgICByZXR1cm4gYmVmb3JlQ29udGVudENodW5rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29udGVudENodW5rOwogIH0KICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgZWZmZWN0cy5leGl0KCJjb2RlRmVuY2VkIik7CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdG9rZW5pemVDbG9zZVN0YXJ0KGVmZmVjdHMyLCBvazQsIG5vazIpIHsKICAgIGxldCBzaXplID0gMDsKICAgIHJldHVybiBzdGFydEJlZm9yZTsKICAgIGZ1bmN0aW9uIHN0YXJ0QmVmb3JlKGNvZGU0KSB7CiAgICAgIGVmZmVjdHMyLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICAgIGVmZmVjdHMyLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzMi5leGl0KCJsaW5lRW5kaW5nIik7CiAgICAgIHJldHVybiBzdGFydDI7CiAgICB9CiAgICBmdW5jdGlvbiBzdGFydDIoY29kZTQpIHsKICAgICAgZWZmZWN0czIuZW50ZXIoImNvZGVGZW5jZWRGZW5jZSIpOwogICAgICByZXR1cm4gbWFya2Rvd25TcGFjZShjb2RlNCkgPyBmYWN0b3J5U3BhY2UoZWZmZWN0czIsIGJlZm9yZVNlcXVlbmNlQ2xvc2UsICJsaW5lUHJlZml4Iiwgc2VsZjIucGFyc2VyLmNvbnN0cnVjdHMuZGlzYWJsZS5udWxsLmluY2x1ZGVzKCJjb2RlSW5kZW50ZWQiKSA/IHZvaWQgMCA6IDQpKGNvZGU0KSA6IGJlZm9yZVNlcXVlbmNlQ2xvc2UoY29kZTQpOwogICAgfQogICAgZnVuY3Rpb24gYmVmb3JlU2VxdWVuY2VDbG9zZShjb2RlNCkgewogICAgICBpZiAoY29kZTQgPT09IG1hcmtlcikgewogICAgICAgIGVmZmVjdHMyLmVudGVyKCJjb2RlRmVuY2VkRmVuY2VTZXF1ZW5jZSIpOwogICAgICAgIHJldHVybiBzZXF1ZW5jZUNsb3NlKGNvZGU0KTsKICAgICAgfQogICAgICByZXR1cm4gbm9rMihjb2RlNCk7CiAgICB9CiAgICBmdW5jdGlvbiBzZXF1ZW5jZUNsb3NlKGNvZGU0KSB7CiAgICAgIGlmIChjb2RlNCA9PT0gbWFya2VyKSB7CiAgICAgICAgc2l6ZSsrOwogICAgICAgIGVmZmVjdHMyLmNvbnN1bWUoY29kZTQpOwogICAgICAgIHJldHVybiBzZXF1ZW5jZUNsb3NlOwogICAgICB9CiAgICAgIGlmIChzaXplID49IHNpemVPcGVuKSB7CiAgICAgICAgZWZmZWN0czIuZXhpdCgiY29kZUZlbmNlZEZlbmNlU2VxdWVuY2UiKTsKICAgICAgICByZXR1cm4gbWFya2Rvd25TcGFjZShjb2RlNCkgPyBmYWN0b3J5U3BhY2UoZWZmZWN0czIsIHNlcXVlbmNlQ2xvc2VBZnRlciwgIndoaXRlc3BhY2UiKShjb2RlNCkgOiBzZXF1ZW5jZUNsb3NlQWZ0ZXIoY29kZTQpOwogICAgICB9CiAgICAgIHJldHVybiBub2syKGNvZGU0KTsKICAgIH0KICAgIGZ1bmN0aW9uIHNlcXVlbmNlQ2xvc2VBZnRlcihjb2RlNCkgewogICAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICAgIGVmZmVjdHMyLmV4aXQoImNvZGVGZW5jZWRGZW5jZSIpOwogICAgICAgIHJldHVybiBvazQoY29kZTQpOwogICAgICB9CiAgICAgIHJldHVybiBub2syKGNvZGU0KTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVOb25MYXp5Q29udGludWF0aW9uKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZyIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgcmV0dXJuIGxpbmVTdGFydDsKICB9CiAgZnVuY3Rpb24gbGluZVN0YXJ0KGNvZGU0KSB7CiAgICByZXR1cm4gc2VsZjIucGFyc2VyLmxhenlbc2VsZjIubm93KCkubGluZV0gPyBub2soY29kZTQpIDogb2szKGNvZGU0KTsKICB9Cn0KdmFyIG5vbkxhenlDb250aW51YXRpb24sIGNvZGVGZW5jZWQ7CnZhciBpbml0X2NvZGVfZmVuY2VkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvY29kZS1mZW5jZWQuanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9zcGFjZSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIG5vbkxhenlDb250aW51YXRpb24gPSB7CiAgICAgIHBhcnRpYWw6IHRydWUsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZU5vbkxhenlDb250aW51YXRpb24KICAgIH07CiAgICBjb2RlRmVuY2VkID0gewogICAgICBjb25jcmV0ZTogdHJ1ZSwKICAgICAgbmFtZTogImNvZGVGZW5jZWQiLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVDb2RlRmVuY2VkCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvY29kZS1pbmRlbnRlZC5qcwpmdW5jdGlvbiB0b2tlbml6ZUNvZGVJbmRlbnRlZChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImNvZGVJbmRlbnRlZCIpOwogICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlclByZWZpeCwgImxpbmVQcmVmaXgiLCA0ICsgMSkoY29kZTQpOwogIH0KICBmdW5jdGlvbiBhZnRlclByZWZpeChjb2RlNCkgewogICAgY29uc3QgdGFpbCA9IHNlbGYyLmV2ZW50c1tzZWxmMi5ldmVudHMubGVuZ3RoIC0gMV07CiAgICByZXR1cm4gdGFpbCAmJiB0YWlsWzFdLnR5cGUgPT09ICJsaW5lUHJlZml4IiAmJiB0YWlsWzJdLnNsaWNlU2VyaWFsaXplKHRhaWxbMV0sIHRydWUpLmxlbmd0aCA+PSA0ID8gYXRCcmVhayhjb2RlNCkgOiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBhdEJyZWFrKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIGFmdGVyKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoZnVydGhlclN0YXJ0LCBhdEJyZWFrLCBhZnRlcikoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigiY29kZUZsb3dWYWx1ZSIpOwogICAgcmV0dXJuIGluc2lkZShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJjb2RlRmxvd1ZhbHVlIik7CiAgICAgIHJldHVybiBhdEJyZWFrKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gaW5zaWRlOwogIH0KICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgZWZmZWN0cy5leGl0KCJjb2RlSW5kZW50ZWQiKTsKICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KfQpmdW5jdGlvbiB0b2tlbml6ZUZ1cnRoZXJTdGFydChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICByZXR1cm4gZnVydGhlclN0YXJ0MjsKICBmdW5jdGlvbiBmdXJ0aGVyU3RhcnQyKGNvZGU0KSB7CiAgICBpZiAoc2VsZjIucGFyc2VyLmxhenlbc2VsZjIubm93KCkubGluZV0pIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgICByZXR1cm4gZnVydGhlclN0YXJ0MjsKICAgIH0KICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXJQcmVmaXgsICJsaW5lUHJlZml4IiwgNCArIDEpKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYWZ0ZXJQcmVmaXgoY29kZTQpIHsKICAgIGNvbnN0IHRhaWwgPSBzZWxmMi5ldmVudHNbc2VsZjIuZXZlbnRzLmxlbmd0aCAtIDFdOwogICAgcmV0dXJuIHRhaWwgJiYgdGFpbFsxXS50eXBlID09PSAibGluZVByZWZpeCIgJiYgdGFpbFsyXS5zbGljZVNlcmlhbGl6ZSh0YWlsWzFdLCB0cnVlKS5sZW5ndGggPj0gNCA/IG9rMyhjb2RlNCkgOiBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpID8gZnVydGhlclN0YXJ0Mihjb2RlNCkgOiBub2soY29kZTQpOwogIH0KfQp2YXIgY29kZUluZGVudGVkLCBmdXJ0aGVyU3RhcnQ7CnZhciBpbml0X2NvZGVfaW5kZW50ZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9jb2RlLWluZGVudGVkLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX2ZhY3Rvcnlfc3BhY2UoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgICBjb2RlSW5kZW50ZWQgPSB7CiAgICAgIG5hbWU6ICJjb2RlSW5kZW50ZWQiLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVDb2RlSW5kZW50ZWQKICAgIH07CiAgICBmdXJ0aGVyU3RhcnQgPSB7CiAgICAgIHBhcnRpYWw6IHRydWUsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZUZ1cnRoZXJTdGFydAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2NvZGUtdGV4dC5qcwpmdW5jdGlvbiByZXNvbHZlQ29kZVRleHQoZXZlbnRzKSB7CiAgbGV0IHRhaWxFeGl0SW5kZXggPSBldmVudHMubGVuZ3RoIC0gNDsKICBsZXQgaGVhZEVudGVySW5kZXggPSAzOwogIGxldCBpbmRleDI7CiAgbGV0IGVudGVyOwogIGlmICgoZXZlbnRzW2hlYWRFbnRlckluZGV4XVsxXS50eXBlID09PSAibGluZUVuZGluZyIgfHwgZXZlbnRzW2hlYWRFbnRlckluZGV4XVsxXS50eXBlID09PSAic3BhY2UiKSAmJiAoZXZlbnRzW3RhaWxFeGl0SW5kZXhdWzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nIiB8fCBldmVudHNbdGFpbEV4aXRJbmRleF1bMV0udHlwZSA9PT0gInNwYWNlIikpIHsKICAgIGluZGV4MiA9IGhlYWRFbnRlckluZGV4OwogICAgd2hpbGUgKCsraW5kZXgyIDwgdGFpbEV4aXRJbmRleCkgewogICAgICBpZiAoZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImNvZGVUZXh0RGF0YSIpIHsKICAgICAgICBldmVudHNbaGVhZEVudGVySW5kZXhdWzFdLnR5cGUgPSAiY29kZVRleHRQYWRkaW5nIjsKICAgICAgICBldmVudHNbdGFpbEV4aXRJbmRleF1bMV0udHlwZSA9ICJjb2RlVGV4dFBhZGRpbmciOwogICAgICAgIGhlYWRFbnRlckluZGV4ICs9IDI7CiAgICAgICAgdGFpbEV4aXRJbmRleCAtPSAyOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQogIGluZGV4MiA9IGhlYWRFbnRlckluZGV4IC0gMTsKICB0YWlsRXhpdEluZGV4Kys7CiAgd2hpbGUgKCsraW5kZXgyIDw9IHRhaWxFeGl0SW5kZXgpIHsKICAgIGlmIChlbnRlciA9PT0gdm9pZCAwKSB7CiAgICAgIGlmIChpbmRleDIgIT09IHRhaWxFeGl0SW5kZXggJiYgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSAhPT0gImxpbmVFbmRpbmciKSB7CiAgICAgICAgZW50ZXIgPSBpbmRleDI7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoaW5kZXgyID09PSB0YWlsRXhpdEluZGV4IHx8IGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nIikgewogICAgICBldmVudHNbZW50ZXJdWzFdLnR5cGUgPSAiY29kZVRleHREYXRhIjsKICAgICAgaWYgKGluZGV4MiAhPT0gZW50ZXIgKyAyKSB7CiAgICAgICAgZXZlbnRzW2VudGVyXVsxXS5lbmQgPSBldmVudHNbaW5kZXgyIC0gMV1bMV0uZW5kOwogICAgICAgIGV2ZW50cy5zcGxpY2UoZW50ZXIgKyAyLCBpbmRleDIgLSBlbnRlciAtIDIpOwogICAgICAgIHRhaWxFeGl0SW5kZXggLT0gaW5kZXgyIC0gZW50ZXIgLSAyOwogICAgICAgIGluZGV4MiA9IGVudGVyICsgMjsKICAgICAgfQogICAgICBlbnRlciA9IHZvaWQgMDsKICAgIH0KICB9CiAgcmV0dXJuIGV2ZW50czsKfQpmdW5jdGlvbiBwcmV2aW91czIoY29kZTQpIHsKICByZXR1cm4gY29kZTQgIT09IDk2IHx8IHRoaXMuZXZlbnRzW3RoaXMuZXZlbnRzLmxlbmd0aCAtIDFdWzFdLnR5cGUgPT09ICJjaGFyYWN0ZXJFc2NhcGUiOwp9CmZ1bmN0aW9uIHRva2VuaXplQ29kZVRleHQoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IHNpemVPcGVuID0gMDsKICBsZXQgc2l6ZTsKICBsZXQgdG9rZW47CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlVGV4dCIpOwogICAgZWZmZWN0cy5lbnRlcigiY29kZVRleHRTZXF1ZW5jZSIpOwogICAgcmV0dXJuIHNlcXVlbmNlT3Blbihjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHNlcXVlbmNlT3Blbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA5NikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBzaXplT3BlbisrOwogICAgICByZXR1cm4gc2VxdWVuY2VPcGVuOwogICAgfQogICAgZWZmZWN0cy5leGl0KCJjb2RlVGV4dFNlcXVlbmNlIik7CiAgICByZXR1cm4gYmV0d2VlbjIoY29kZTQpOwogIH0KICBmdW5jdGlvbiBiZXR3ZWVuMihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSAzMikgewogICAgICBlZmZlY3RzLmVudGVyKCJzcGFjZSIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInNwYWNlIik7CiAgICAgIHJldHVybiBiZXR3ZWVuMjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gOTYpIHsKICAgICAgdG9rZW4gPSBlZmZlY3RzLmVudGVyKCJjb2RlVGV4dFNlcXVlbmNlIik7CiAgICAgIHNpemUgPSAwOwogICAgICByZXR1cm4gc2VxdWVuY2VDbG9zZShjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgICByZXR1cm4gYmV0d2VlbjI7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlVGV4dERhdGEiKTsKICAgIHJldHVybiBkYXRhKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gZGF0YShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSAzMiB8fCBjb2RlNCA9PT0gOTYgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImNvZGVUZXh0RGF0YSIpOwogICAgICByZXR1cm4gYmV0d2VlbjIoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBkYXRhOwogIH0KICBmdW5jdGlvbiBzZXF1ZW5jZUNsb3NlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDk2KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHNpemUrKzsKICAgICAgcmV0dXJuIHNlcXVlbmNlQ2xvc2U7CiAgICB9CiAgICBpZiAoc2l6ZSA9PT0gc2l6ZU9wZW4pIHsKICAgICAgZWZmZWN0cy5leGl0KCJjb2RlVGV4dFNlcXVlbmNlIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiY29kZVRleHQiKTsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICB0b2tlbi50eXBlID0gImNvZGVUZXh0RGF0YSI7CiAgICByZXR1cm4gZGF0YShjb2RlNCk7CiAgfQp9CnZhciBjb2RlVGV4dDsKdmFyIGluaXRfY29kZV90ZXh0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvY29kZS10ZXh0LmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgICBjb2RlVGV4dCA9IHsKICAgICAgbmFtZTogImNvZGVUZXh0IiwKICAgICAgcHJldmlvdXM6IHByZXZpb3VzMiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZUNvZGVUZXh0LAogICAgICB0b2tlbml6ZTogdG9rZW5pemVDb2RlVGV4dAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLXN1YnRva2VuaXplQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1zdWJ0b2tlbml6ZS9saWIvc3BsaWNlLWJ1ZmZlci5qcwpmdW5jdGlvbiBjaHVua2VkUHVzaChsaXN0NSwgcmlnaHQpIHsKICBsZXQgY2h1bmtTdGFydCA9IDA7CiAgaWYgKHJpZ2h0Lmxlbmd0aCA8IDFlNCkgewogICAgbGlzdDUucHVzaCguLi5yaWdodCk7CiAgfSBlbHNlIHsKICAgIHdoaWxlIChjaHVua1N0YXJ0IDwgcmlnaHQubGVuZ3RoKSB7CiAgICAgIGxpc3Q1LnB1c2goLi4ucmlnaHQuc2xpY2UoY2h1bmtTdGFydCwgY2h1bmtTdGFydCArIDFlNCkpOwogICAgICBjaHVua1N0YXJ0ICs9IDFlNDsKICAgIH0KICB9Cn0KdmFyIFNwbGljZUJ1ZmZlcjsKdmFyIGluaXRfc3BsaWNlX2J1ZmZlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLXN1YnRva2VuaXplQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1zdWJ0b2tlbml6ZS9saWIvc3BsaWNlLWJ1ZmZlci5qcyIoKSB7CiAgICBTcGxpY2VCdWZmZXIgPSBjbGFzcyB7CiAgICAgIC8qKgogICAgICAgKiBAcGFyYW0ge1JlYWRvbmx5QXJyYXk8VD4gfCBudWxsIHwgdW5kZWZpbmVkfSBbaW5pdGlhbF0KICAgICAgICogICBJbml0aWFsIGl0ZW1zIChvcHRpb25hbCkuCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqICAgU3BsaWNlIGJ1ZmZlci4KICAgICAgICovCiAgICAgIGNvbnN0cnVjdG9yKGluaXRpYWwyKSB7CiAgICAgICAgdGhpcy5sZWZ0ID0gaW5pdGlhbDIgPyBbLi4uaW5pdGlhbDJdIDogW107CiAgICAgICAgdGhpcy5yaWdodCA9IFtdOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBBcnJheSBhY2Nlc3M7CiAgICAgICAqIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvci4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4CiAgICAgICAqICAgSW5kZXguCiAgICAgICAqIEByZXR1cm4ge1R9CiAgICAgICAqICAgSXRlbS4KICAgICAgICovCiAgICAgIGdldChpbmRleDIpIHsKICAgICAgICBpZiAoaW5kZXgyIDwgMCB8fCBpbmRleDIgPj0gdGhpcy5sZWZ0Lmxlbmd0aCArIHRoaXMucmlnaHQubGVuZ3RoKSB7CiAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQ2Fubm90IGFjY2VzcyBpbmRleCBgIiArIGluZGV4MiArICJgIGluIGEgc3BsaWNlIGJ1ZmZlciBvZiBzaXplIGAiICsgKHRoaXMubGVmdC5sZW5ndGggKyB0aGlzLnJpZ2h0Lmxlbmd0aCkgKyAiYCIpOwogICAgICAgIH0KICAgICAgICBpZiAoaW5kZXgyIDwgdGhpcy5sZWZ0Lmxlbmd0aCkgcmV0dXJuIHRoaXMubGVmdFtpbmRleDJdOwogICAgICAgIHJldHVybiB0aGlzLnJpZ2h0W3RoaXMucmlnaHQubGVuZ3RoIC0gaW5kZXgyICsgdGhpcy5sZWZ0Lmxlbmd0aCAtIDFdOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBzcGxpY2UgYnVmZmVyLCBvbmUgZ3JlYXRlciB0aGFuIHRoZSBsYXJnZXN0IGluZGV4IGluIHRoZQogICAgICAgKiBhcnJheS4KICAgICAgICovCiAgICAgIGdldCBsZW5ndGgoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5sZW5ndGggKyB0aGlzLnJpZ2h0Lmxlbmd0aDsKICAgICAgfQogICAgICAvKioKICAgICAgICogUmVtb3ZlIGFuZCByZXR1cm4gYGxpc3RbMF1gOwogICAgICAgKiBtb3ZlcyB0aGUgY3Vyc29yIHRvIGAwYC4KICAgICAgICoKICAgICAgICogQHJldHVybnMge1QgfCB1bmRlZmluZWR9CiAgICAgICAqICAgSXRlbSwgb3B0aW9uYWwuCiAgICAgICAqLwogICAgICBzaGlmdCgpIHsKICAgICAgICB0aGlzLnNldEN1cnNvcigwKTsKICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5wb3AoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogU2xpY2UgdGhlIGJ1ZmZlciB0byBnZXQgYW4gYXJyYXk7CiAgICAgICAqIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvci4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0CiAgICAgICAqICAgU3RhcnQuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gW2VuZF0KICAgICAgICogICBFbmQgKG9wdGlvbmFsKS4KICAgICAgICogQHJldHVybnMge0FycmF5PFQ+fQogICAgICAgKiAgIEFycmF5IG9mIGl0ZW1zLgogICAgICAgKi8KICAgICAgc2xpY2Uoc3RhcnQsIGVuZDMpIHsKICAgICAgICBjb25zdCBzdG9wID0gZW5kMyA9PT0gbnVsbCB8fCBlbmQzID09PSB2b2lkIDAgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiBlbmQzOwogICAgICAgIGlmIChzdG9wIDwgdGhpcy5sZWZ0Lmxlbmd0aCkgewogICAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5zbGljZShzdGFydCwgc3RvcCk7CiAgICAgICAgfQogICAgICAgIGlmIChzdGFydCA+IHRoaXMubGVmdC5sZW5ndGgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LnNsaWNlKHRoaXMucmlnaHQubGVuZ3RoIC0gc3RvcCArIHRoaXMubGVmdC5sZW5ndGgsIHRoaXMucmlnaHQubGVuZ3RoIC0gc3RhcnQgKyB0aGlzLmxlZnQubGVuZ3RoKS5yZXZlcnNlKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmxlZnQuc2xpY2Uoc3RhcnQpLmNvbmNhdCh0aGlzLnJpZ2h0LnNsaWNlKHRoaXMucmlnaHQubGVuZ3RoIC0gc3RvcCArIHRoaXMubGVmdC5sZW5ndGgpLnJldmVyc2UoKSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIE1pbWljcyB0aGUgYmVoYXZpb3Igb2YgQXJyYXkucHJvdG90eXBlLnNwbGljZSgpIGV4Y2VwdCBmb3IgdGhlIGNoYW5nZSBvZgogICAgICAgKiBpbnRlcmZhY2UgbmVjZXNzYXJ5IHRvIGF2b2lkIHNlZ2ZhdWx0cyB3aGVuIHBhdGNoaW5nIGluIHZlcnkgbGFyZ2UgYXJyYXlzLgogICAgICAgKgogICAgICAgKiBUaGlzIG9wZXJhdGlvbiBtb3ZlcyBjdXJzb3IgaXMgbW92ZWQgdG8gYHN0YXJ0YCBhbmQgcmVzdWx0cyBpbiB0aGUgY3Vyc29yCiAgICAgICAqIHBsYWNlZCBhZnRlciBhbnkgaW5zZXJ0ZWQgaXRlbXMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydAogICAgICAgKiAgIFN0YXJ0OwogICAgICAgKiAgIHplcm8tYmFzZWQgaW5kZXggYXQgd2hpY2ggdG8gc3RhcnQgY2hhbmdpbmcgdGhlIGFycmF5OwogICAgICAgKiAgIG5lZ2F0aXZlIG51bWJlcnMgY291bnQgYmFja3dhcmRzIGZyb20gdGhlIGVuZCBvZiB0aGUgYXJyYXkgYW5kIHZhbHVlcwogICAgICAgKiAgIHRoYXQgYXJlIG91dC1vZiBib3VuZHMgYXJlIGNsYW1wZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGVuZCBvZiB0aGUgYXJyYXkuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gW2RlbGV0ZUNvdW50PTBdCiAgICAgICAqICAgRGVsZXRlIGNvdW50IChkZWZhdWx0OiBgMGApOwogICAgICAgKiAgIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRlbGV0ZSwgc3RhcnRpbmcgZnJvbSBzdGFydC4KICAgICAgICogQHBhcmFtIHtBcnJheTxUPiB8IG51bGwgfCB1bmRlZmluZWR9IFtpdGVtcz1bXV0KICAgICAgICogICBJdGVtcyB0byBpbmNsdWRlIGluIHBsYWNlIG9mIHRoZSBkZWxldGVkIGl0ZW1zIChkZWZhdWx0OiBgW11gKS4KICAgICAgICogQHJldHVybiB7QXJyYXk8VD59CiAgICAgICAqICAgQW55IHJlbW92ZWQgaXRlbXMuCiAgICAgICAqLwogICAgICBzcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50LCBpdGVtcykgewogICAgICAgIGNvbnN0IGNvdW50MiA9IGRlbGV0ZUNvdW50IHx8IDA7CiAgICAgICAgdGhpcy5zZXRDdXJzb3IoTWF0aC50cnVuYyhzdGFydCkpOwogICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJpZ2h0LnNwbGljZSh0aGlzLnJpZ2h0Lmxlbmd0aCAtIGNvdW50MiwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTsKICAgICAgICBpZiAoaXRlbXMpIGNodW5rZWRQdXNoKHRoaXMubGVmdCwgaXRlbXMpOwogICAgICAgIHJldHVybiByZW1vdmVkLnJldmVyc2UoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogUmVtb3ZlIGFuZCByZXR1cm4gdGhlIGhpZ2hlc3QtbnVtYmVyZWQgaXRlbSBpbiB0aGUgYXJyYXksIHNvCiAgICAgICAqIGBsaXN0W2xpc3QubGVuZ3RoIC0gMV1gOwogICAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIGBsZW5ndGhgLgogICAgICAgKgogICAgICAgKiBAcmV0dXJucyB7VCB8IHVuZGVmaW5lZH0KICAgICAgICogICBJdGVtLCBvcHRpb25hbC4KICAgICAgICovCiAgICAgIHBvcCgpIHsKICAgICAgICB0aGlzLnNldEN1cnNvcihOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpOwogICAgICAgIHJldHVybiB0aGlzLmxlZnQucG9wKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEluc2VydHMgYSBzaW5nbGUgaXRlbSB0byB0aGUgaGlnaC1udW1iZXJlZCBzaWRlIG9mIHRoZSBhcnJheTsKICAgICAgICogbW92ZXMgdGhlIGN1cnNvciB0byBgbGVuZ3RoYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtUfSBpdGVtCiAgICAgICAqICAgSXRlbS4KICAgICAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgICAgICogICBOb3RoaW5nLgogICAgICAgKi8KICAgICAgcHVzaChpdGVtKSB7CiAgICAgICAgdGhpcy5zZXRDdXJzb3IoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTsKICAgICAgICB0aGlzLmxlZnQucHVzaChpdGVtKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogSW5zZXJ0cyBtYW55IGl0ZW1zIHRvIHRoZSBoaWdoLW51bWJlcmVkIHNpZGUgb2YgdGhlIGFycmF5LgogICAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIGBsZW5ndGhgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0FycmF5PFQ+fSBpdGVtcwogICAgICAgKiAgIEl0ZW1zLgogICAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAgICAgKiAgIE5vdGhpbmcuCiAgICAgICAqLwogICAgICBwdXNoTWFueShpdGVtcykgewogICAgICAgIHRoaXMuc2V0Q3Vyc29yKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7CiAgICAgICAgY2h1bmtlZFB1c2godGhpcy5sZWZ0LCBpdGVtcyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEluc2VydHMgYSBzaW5nbGUgaXRlbSB0byB0aGUgbG93LW51bWJlcmVkIHNpZGUgb2YgdGhlIGFycmF5OwogICAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIGAwYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtUfSBpdGVtCiAgICAgICAqICAgSXRlbS4KICAgICAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgICAgICogICBOb3RoaW5nLgogICAgICAgKi8KICAgICAgdW5zaGlmdChpdGVtKSB7CiAgICAgICAgdGhpcy5zZXRDdXJzb3IoMCk7CiAgICAgICAgdGhpcy5yaWdodC5wdXNoKGl0ZW0pOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJbnNlcnRzIG1hbnkgaXRlbXMgdG8gdGhlIGxvdy1udW1iZXJlZCBzaWRlIG9mIHRoZSBhcnJheTsKICAgICAgICogbW92ZXMgdGhlIGN1cnNvciB0byBgMGAuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7QXJyYXk8VD59IGl0ZW1zCiAgICAgICAqICAgSXRlbXMuCiAgICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CiAgICAgICAqICAgTm90aGluZy4KICAgICAgICovCiAgICAgIHVuc2hpZnRNYW55KGl0ZW1zKSB7CiAgICAgICAgdGhpcy5zZXRDdXJzb3IoMCk7CiAgICAgICAgY2h1bmtlZFB1c2godGhpcy5yaWdodCwgaXRlbXMucmV2ZXJzZSgpKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogTW92ZSB0aGUgY3Vyc29yIHRvIGEgc3BlY2lmaWMgcG9zaXRpb24gaW4gdGhlIGFycmF5LiBSZXF1aXJlcwogICAgICAgKiB0aW1lIHByb3BvcnRpb25hbCB0byB0aGUgZGlzdGFuY2UgbW92ZWQuCiAgICAgICAqCiAgICAgICAqIElmIGBuIDwgMGAsIHRoZSBjdXJzb3Igd2lsbCBlbmQgdXAgYXQgdGhlIGJlZ2lubmluZy4KICAgICAgICogSWYgYG4gPiBsZW5ndGhgLCB0aGUgY3Vyc29yIHdpbGwgZW5kIHVwIGF0IHRoZSBlbmQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuCiAgICAgICAqICAgUG9zaXRpb24uCiAgICAgICAqIEByZXR1cm4ge3VuZGVmaW5lZH0KICAgICAgICogICBOb3RoaW5nLgogICAgICAgKi8KICAgICAgc2V0Q3Vyc29yKG4xMykgewogICAgICAgIGlmIChuMTMgPT09IHRoaXMubGVmdC5sZW5ndGggfHwgbjEzID4gdGhpcy5sZWZ0Lmxlbmd0aCAmJiB0aGlzLnJpZ2h0Lmxlbmd0aCA9PT0gMCB8fCBuMTMgPCAwICYmIHRoaXMubGVmdC5sZW5ndGggPT09IDApIHJldHVybjsKICAgICAgICBpZiAobjEzIDwgdGhpcy5sZWZ0Lmxlbmd0aCkgewogICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMubGVmdC5zcGxpY2UobjEzLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpOwogICAgICAgICAgY2h1bmtlZFB1c2godGhpcy5yaWdodCwgcmVtb3ZlZC5yZXZlcnNlKCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yaWdodC5zcGxpY2UodGhpcy5sZWZ0Lmxlbmd0aCArIHRoaXMucmlnaHQubGVuZ3RoIC0gbjEzLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpOwogICAgICAgICAgY2h1bmtlZFB1c2godGhpcy5sZWZ0LCByZW1vdmVkLnJldmVyc2UoKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtc3VidG9rZW5pemVAMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLXN1YnRva2VuaXplL2luZGV4LmpzCmZ1bmN0aW9uIHN1YnRva2VuaXplKGV2ZW50c0FycmF5KSB7CiAgY29uc3QganVtcHMgPSB7fTsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IGV2ZW50OwogIGxldCBsaW5lSW5kZXg7CiAgbGV0IG90aGVySW5kZXg7CiAgbGV0IG90aGVyRXZlbnQ7CiAgbGV0IHBhcmFtZXRlcnM7CiAgbGV0IHN1YmV2ZW50czsKICBsZXQgbW9yZTsKICBjb25zdCBldmVudHMgPSBuZXcgU3BsaWNlQnVmZmVyKGV2ZW50c0FycmF5KTsKICB3aGlsZSAoKytpbmRleDIgPCBldmVudHMubGVuZ3RoKSB7CiAgICB3aGlsZSAoaW5kZXgyIGluIGp1bXBzKSB7CiAgICAgIGluZGV4MiA9IGp1bXBzW2luZGV4Ml07CiAgICB9CiAgICBldmVudCA9IGV2ZW50cy5nZXQoaW5kZXgyKTsKICAgIGlmIChpbmRleDIgJiYgZXZlbnRbMV0udHlwZSA9PT0gImNodW5rRmxvdyIgJiYgZXZlbnRzLmdldChpbmRleDIgLSAxKVsxXS50eXBlID09PSAibGlzdEl0ZW1QcmVmaXgiKSB7CiAgICAgIHN1YmV2ZW50cyA9IGV2ZW50WzFdLl90b2tlbml6ZXIuZXZlbnRzOwogICAgICBvdGhlckluZGV4ID0gMDsKICAgICAgaWYgKG90aGVySW5kZXggPCBzdWJldmVudHMubGVuZ3RoICYmIHN1YmV2ZW50c1tvdGhlckluZGV4XVsxXS50eXBlID09PSAibGluZUVuZGluZ0JsYW5rIikgewogICAgICAgIG90aGVySW5kZXggKz0gMjsKICAgICAgfQogICAgICBpZiAob3RoZXJJbmRleCA8IHN1YmV2ZW50cy5sZW5ndGggJiYgc3ViZXZlbnRzW290aGVySW5kZXhdWzFdLnR5cGUgPT09ICJjb250ZW50IikgewogICAgICAgIHdoaWxlICgrK290aGVySW5kZXggPCBzdWJldmVudHMubGVuZ3RoKSB7CiAgICAgICAgICBpZiAoc3ViZXZlbnRzW290aGVySW5kZXhdWzFdLnR5cGUgPT09ICJjb250ZW50IikgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdWJldmVudHNbb3RoZXJJbmRleF1bMV0udHlwZSA9PT0gImNodW5rVGV4dCIpIHsKICAgICAgICAgICAgc3ViZXZlbnRzW290aGVySW5kZXhdWzFdLl9pc0luRmlyc3RDb250ZW50T2ZMaXN0SXRlbSA9IHRydWU7CiAgICAgICAgICAgIG90aGVySW5kZXgrKzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChldmVudFswXSA9PT0gImVudGVyIikgewogICAgICBpZiAoZXZlbnRbMV0uY29udGVudFR5cGUpIHsKICAgICAgICBPYmplY3QuYXNzaWduKGp1bXBzLCBzdWJjb250ZW50KGV2ZW50cywgaW5kZXgyKSk7CiAgICAgICAgaW5kZXgyID0ganVtcHNbaW5kZXgyXTsKICAgICAgICBtb3JlID0gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChldmVudFsxXS5fY29udGFpbmVyKSB7CiAgICAgIG90aGVySW5kZXggPSBpbmRleDI7CiAgICAgIGxpbmVJbmRleCA9IHZvaWQgMDsKICAgICAgd2hpbGUgKG90aGVySW5kZXgtLSkgewogICAgICAgIG90aGVyRXZlbnQgPSBldmVudHMuZ2V0KG90aGVySW5kZXgpOwogICAgICAgIGlmIChvdGhlckV2ZW50WzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nIiB8fCBvdGhlckV2ZW50WzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nQmxhbmsiKSB7CiAgICAgICAgICBpZiAob3RoZXJFdmVudFswXSA9PT0gImVudGVyIikgewogICAgICAgICAgICBpZiAobGluZUluZGV4KSB7CiAgICAgICAgICAgICAgZXZlbnRzLmdldChsaW5lSW5kZXgpWzFdLnR5cGUgPSAibGluZUVuZGluZ0JsYW5rIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdGhlckV2ZW50WzFdLnR5cGUgPSAibGluZUVuZGluZyI7CiAgICAgICAgICAgIGxpbmVJbmRleCA9IG90aGVySW5kZXg7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChvdGhlckV2ZW50WzFdLnR5cGUgPT09ICJsaW5lUHJlZml4IiB8fCBvdGhlckV2ZW50WzFdLnR5cGUgPT09ICJsaXN0SXRlbUluZGVudCIpIHsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChsaW5lSW5kZXgpIHsKICAgICAgICBldmVudFsxXS5lbmQgPSB7CiAgICAgICAgICAuLi5ldmVudHMuZ2V0KGxpbmVJbmRleClbMV0uc3RhcnQKICAgICAgICB9OwogICAgICAgIHBhcmFtZXRlcnMgPSBldmVudHMuc2xpY2UobGluZUluZGV4LCBpbmRleDIpOwogICAgICAgIHBhcmFtZXRlcnMudW5zaGlmdChldmVudCk7CiAgICAgICAgZXZlbnRzLnNwbGljZShsaW5lSW5kZXgsIGluZGV4MiAtIGxpbmVJbmRleCArIDEsIHBhcmFtZXRlcnMpOwogICAgICB9CiAgICB9CiAgfQogIHNwbGljZShldmVudHNBcnJheSwgMCwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBldmVudHMuc2xpY2UoMCkpOwogIHJldHVybiAhbW9yZTsKfQpmdW5jdGlvbiBzdWJjb250ZW50KGV2ZW50cywgZXZlbnRJbmRleCkgewogIGNvbnN0IHRva2VuID0gZXZlbnRzLmdldChldmVudEluZGV4KVsxXTsKICBjb25zdCBjb250ZXh0MiA9IGV2ZW50cy5nZXQoZXZlbnRJbmRleClbMl07CiAgbGV0IHN0YXJ0UG9zaXRpb24gPSBldmVudEluZGV4IC0gMTsKICBjb25zdCBzdGFydFBvc2l0aW9ucyA9IFtdOwogIGxldCB0b2tlbml6ZXIgPSB0b2tlbi5fdG9rZW5pemVyOwogIGlmICghdG9rZW5pemVyKSB7CiAgICB0b2tlbml6ZXIgPSBjb250ZXh0Mi5wYXJzZXJbdG9rZW4uY29udGVudFR5cGVdKHRva2VuLnN0YXJ0KTsKICAgIGlmICh0b2tlbi5fY29udGVudFR5cGVUZXh0VHJhaWxpbmcpIHsKICAgICAgdG9rZW5pemVyLl9jb250ZW50VHlwZVRleHRUcmFpbGluZyA9IHRydWU7CiAgICB9CiAgfQogIGNvbnN0IGNoaWxkRXZlbnRzID0gdG9rZW5pemVyLmV2ZW50czsKICBjb25zdCBqdW1wcyA9IFtdOwogIGNvbnN0IGdhcHMgPSB7fTsKICBsZXQgc3RyZWFtOwogIGxldCBwcmV2aW91czM7CiAgbGV0IGluZGV4MiA9IC0xOwogIGxldCBjdXJyZW50ID0gdG9rZW47CiAgbGV0IGFkanVzdCA9IDA7CiAgbGV0IHN0YXJ0ID0gMDsKICBjb25zdCBicmVha3MgPSBbc3RhcnRdOwogIHdoaWxlIChjdXJyZW50KSB7CiAgICB3aGlsZSAoZXZlbnRzLmdldCgrK3N0YXJ0UG9zaXRpb24pWzFdICE9PSBjdXJyZW50KSB7CiAgICB9CiAgICBzdGFydFBvc2l0aW9ucy5wdXNoKHN0YXJ0UG9zaXRpb24pOwogICAgaWYgKCFjdXJyZW50Ll90b2tlbml6ZXIpIHsKICAgICAgc3RyZWFtID0gY29udGV4dDIuc2xpY2VTdHJlYW0oY3VycmVudCk7CiAgICAgIGlmICghY3VycmVudC5uZXh0KSB7CiAgICAgICAgc3RyZWFtLnB1c2gobnVsbCk7CiAgICAgIH0KICAgICAgaWYgKHByZXZpb3VzMykgewogICAgICAgIHRva2VuaXplci5kZWZpbmVTa2lwKGN1cnJlbnQuc3RhcnQpOwogICAgICB9CiAgICAgIGlmIChjdXJyZW50Ll9pc0luRmlyc3RDb250ZW50T2ZMaXN0SXRlbSkgewogICAgICAgIHRva2VuaXplci5fZ2ZtVGFza2xpc3RGaXJzdENvbnRlbnRPZkxpc3RJdGVtID0gdHJ1ZTsKICAgICAgfQogICAgICB0b2tlbml6ZXIud3JpdGUoc3RyZWFtKTsKICAgICAgaWYgKGN1cnJlbnQuX2lzSW5GaXJzdENvbnRlbnRPZkxpc3RJdGVtKSB7CiAgICAgICAgdG9rZW5pemVyLl9nZm1UYXNrbGlzdEZpcnN0Q29udGVudE9mTGlzdEl0ZW0gPSB2b2lkIDA7CiAgICAgIH0KICAgIH0KICAgIHByZXZpb3VzMyA9IGN1cnJlbnQ7CiAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0OwogIH0KICBjdXJyZW50ID0gdG9rZW47CiAgd2hpbGUgKCsraW5kZXgyIDwgY2hpbGRFdmVudHMubGVuZ3RoKSB7CiAgICBpZiAoCiAgICAgIC8vIEZpbmQgYSB2b2lkIHRva2VuIHRoYXQgaW5jbHVkZXMgYSBicmVhay4KICAgICAgY2hpbGRFdmVudHNbaW5kZXgyXVswXSA9PT0gImV4aXQiICYmIGNoaWxkRXZlbnRzW2luZGV4MiAtIDFdWzBdID09PSAiZW50ZXIiICYmIGNoaWxkRXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gY2hpbGRFdmVudHNbaW5kZXgyIC0gMV1bMV0udHlwZSAmJiBjaGlsZEV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0LmxpbmUgIT09IGNoaWxkRXZlbnRzW2luZGV4Ml1bMV0uZW5kLmxpbmUKICAgICkgewogICAgICBzdGFydCA9IGluZGV4MiArIDE7CiAgICAgIGJyZWFrcy5wdXNoKHN0YXJ0KTsKICAgICAgY3VycmVudC5fdG9rZW5pemVyID0gdm9pZCAwOwogICAgICBjdXJyZW50LnByZXZpb3VzID0gdm9pZCAwOwogICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0OwogICAgfQogIH0KICB0b2tlbml6ZXIuZXZlbnRzID0gW107CiAgaWYgKGN1cnJlbnQpIHsKICAgIGN1cnJlbnQuX3Rva2VuaXplciA9IHZvaWQgMDsKICAgIGN1cnJlbnQucHJldmlvdXMgPSB2b2lkIDA7CiAgfSBlbHNlIHsKICAgIGJyZWFrcy5wb3AoKTsKICB9CiAgaW5kZXgyID0gYnJlYWtzLmxlbmd0aDsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIGNvbnN0IHNsaWNlID0gY2hpbGRFdmVudHMuc2xpY2UoYnJlYWtzW2luZGV4Ml0sIGJyZWFrc1tpbmRleDIgKyAxXSk7CiAgICBjb25zdCBzdGFydDIgPSBzdGFydFBvc2l0aW9ucy5wb3AoKTsKICAgIGp1bXBzLnB1c2goW3N0YXJ0Miwgc3RhcnQyICsgc2xpY2UubGVuZ3RoIC0gMV0pOwogICAgZXZlbnRzLnNwbGljZShzdGFydDIsIDIsIHNsaWNlKTsKICB9CiAganVtcHMucmV2ZXJzZSgpOwogIGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IGp1bXBzLmxlbmd0aCkgewogICAgZ2Fwc1thZGp1c3QgKyBqdW1wc1tpbmRleDJdWzBdXSA9IGFkanVzdCArIGp1bXBzW2luZGV4Ml1bMV07CiAgICBhZGp1c3QgKz0ganVtcHNbaW5kZXgyXVsxXSAtIGp1bXBzW2luZGV4Ml1bMF0gLSAxOwogIH0KICByZXR1cm4gZ2FwczsKfQp2YXIgaW5pdF9taWNyb21hcmtfdXRpbF9zdWJ0b2tlbml6ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLXN1YnRva2VuaXplQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1zdWJ0b2tlbml6ZS9pbmRleC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NodW5rZWQoKTsKICAgIGluaXRfc3BsaWNlX2J1ZmZlcigpOwogICAgaW5pdF9zcGxpY2VfYnVmZmVyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9jb250ZW50LmpzCmZ1bmN0aW9uIHJlc29sdmVDb250ZW50KGV2ZW50cykgewogIHN1YnRva2VuaXplKGV2ZW50cyk7CiAgcmV0dXJuIGV2ZW50czsKfQpmdW5jdGlvbiB0b2tlbml6ZUNvbnRlbnQoZWZmZWN0cywgb2szKSB7CiAgbGV0IHByZXZpb3VzMzsKICByZXR1cm4gY2h1bmtTdGFydDsKICBmdW5jdGlvbiBjaHVua1N0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJjb250ZW50Iik7CiAgICBwcmV2aW91czMgPSBlZmZlY3RzLmVudGVyKCJjaHVua0NvbnRlbnQiLCB7CiAgICAgIGNvbnRlbnRUeXBlOiAiY29udGVudCIKICAgIH0pOwogICAgcmV0dXJuIGNodW5rSW5zaWRlKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY2h1bmtJbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gY29udGVudEVuZChjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhjb250aW51YXRpb25Db25zdHJ1Y3QsIGNvbnRlbnRDb250aW51ZSwgY29udGVudEVuZCkoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjaHVua0luc2lkZTsKICB9CiAgZnVuY3Rpb24gY29udGVudEVuZChjb2RlNCkgewogICAgZWZmZWN0cy5leGl0KCJjaHVua0NvbnRlbnQiKTsKICAgIGVmZmVjdHMuZXhpdCgiY29udGVudCIpOwogICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbnRlbnRDb250aW51ZShjb2RlNCkgewogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgiY2h1bmtDb250ZW50Iik7CiAgICBwcmV2aW91czMubmV4dCA9IGVmZmVjdHMuZW50ZXIoImNodW5rQ29udGVudCIsIHsKICAgICAgY29udGVudFR5cGU6ICJjb250ZW50IiwKICAgICAgcHJldmlvdXM6IHByZXZpb3VzMwogICAgfSk7CiAgICBwcmV2aW91czMgPSBwcmV2aW91czMubmV4dDsKICAgIHJldHVybiBjaHVua0luc2lkZTsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVDb250aW51YXRpb24oZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIHN0YXJ0TG9va2FoZWFkOwogIGZ1bmN0aW9uIHN0YXJ0TG9va2FoZWFkKGNvZGU0KSB7CiAgICBlZmZlY3RzLmV4aXQoImNodW5rQ29udGVudCIpOwogICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZyIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBwcmVmaXhlZCwgImxpbmVQcmVmaXgiKTsKICB9CiAgZnVuY3Rpb24gcHJlZml4ZWQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgY29uc3QgdGFpbCA9IHNlbGYyLmV2ZW50c1tzZWxmMi5ldmVudHMubGVuZ3RoIC0gMV07CiAgICBpZiAoIXNlbGYyLnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmNsdWRlcygiY29kZUluZGVudGVkIikgJiYgdGFpbCAmJiB0YWlsWzFdLnR5cGUgPT09ICJsaW5lUHJlZml4IiAmJiB0YWlsWzJdLnNsaWNlU2VyaWFsaXplKHRhaWxbMV0sIHRydWUpLmxlbmd0aCA+PSA0KSB7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgcmV0dXJuIGVmZmVjdHMuaW50ZXJydXB0KHNlbGYyLnBhcnNlci5jb25zdHJ1Y3RzLmZsb3csIG5vaywgb2szKShjb2RlNCk7CiAgfQp9CnZhciBjb250ZW50LCBjb250aW51YXRpb25Db25zdHJ1Y3Q7CnZhciBpbml0X2NvbnRlbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9jb250ZW50LmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX2ZhY3Rvcnlfc3BhY2UoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX3N1YnRva2VuaXplKCk7CiAgICBjb250ZW50ID0gewogICAgICByZXNvbHZlOiByZXNvbHZlQ29udGVudCwKICAgICAgdG9rZW5pemU6IHRva2VuaXplQ29udGVudAogICAgfTsKICAgIGNvbnRpbnVhdGlvbkNvbnN0cnVjdCA9IHsKICAgICAgcGFydGlhbDogdHJ1ZSwKICAgICAgdG9rZW5pemU6IHRva2VuaXplQ29udGludWF0aW9uCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWZhY3RvcnktZGVzdGluYXRpb25AMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1mYWN0b3J5LWRlc3RpbmF0aW9uL2luZGV4LmpzCmZ1bmN0aW9uIGZhY3RvcnlEZXN0aW5hdGlvbihlZmZlY3RzLCBvazMsIG5vaywgdHlwZTUsIGxpdGVyYWxUeXBlLCBsaXRlcmFsTWFya2VyVHlwZSwgcmF3VHlwZSwgc3RyaW5nVHlwZSwgbWF4MykgewogIGNvbnN0IGxpbWl0ID0gbWF4MyB8fCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgbGV0IGJhbGFuY2UgPSAwOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA2MCkgewogICAgICBlZmZlY3RzLmVudGVyKHR5cGU1KTsKICAgICAgZWZmZWN0cy5lbnRlcihsaXRlcmFsVHlwZSk7CiAgICAgIGVmZmVjdHMuZW50ZXIobGl0ZXJhbE1hcmtlclR5cGUpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQobGl0ZXJhbE1hcmtlclR5cGUpOwogICAgICByZXR1cm4gZW5jbG9zZWRCZWZvcmU7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDMyIHx8IGNvZGU0ID09PSA0MSB8fCBhc2NpaUNvbnRyb2woY29kZTQpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcih0eXBlNSk7CiAgICBlZmZlY3RzLmVudGVyKHJhd1R5cGUpOwogICAgZWZmZWN0cy5lbnRlcihzdHJpbmdUeXBlKTsKICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIiwgewogICAgICBjb250ZW50VHlwZTogInN0cmluZyIKICAgIH0pOwogICAgcmV0dXJuIHJhdzIoY29kZTQpOwogIH0KICBmdW5jdGlvbiBlbmNsb3NlZEJlZm9yZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA2MikgewogICAgICBlZmZlY3RzLmVudGVyKGxpdGVyYWxNYXJrZXJUeXBlKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KGxpdGVyYWxNYXJrZXJUeXBlKTsKICAgICAgZWZmZWN0cy5leGl0KGxpdGVyYWxUeXBlKTsKICAgICAgZWZmZWN0cy5leGl0KHR5cGU1KTsKICAgICAgcmV0dXJuIG9rMzsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoc3RyaW5nVHlwZSk7CiAgICBlZmZlY3RzLmVudGVyKCJjaHVua1N0cmluZyIsIHsKICAgICAgY29udGVudFR5cGU6ICJzdHJpbmciCiAgICB9KTsKICAgIHJldHVybiBlbmNsb3NlZChjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGVuY2xvc2VkKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2h1bmtTdHJpbmciKTsKICAgICAgZWZmZWN0cy5leGl0KHN0cmluZ1R5cGUpOwogICAgICByZXR1cm4gZW5jbG9zZWRCZWZvcmUoY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA2MCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb2RlNCA9PT0gOTIgPyBlbmNsb3NlZEVzY2FwZSA6IGVuY2xvc2VkOwogIH0KICBmdW5jdGlvbiBlbmNsb3NlZEVzY2FwZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA2MCB8fCBjb2RlNCA9PT0gNjIgfHwgY29kZTQgPT09IDkyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBlbmNsb3NlZDsKICAgIH0KICAgIHJldHVybiBlbmNsb3NlZChjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHJhdzIoY29kZTQpIHsKICAgIGlmICghYmFsYW5jZSAmJiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDQxIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSkgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rU3RyaW5nIik7CiAgICAgIGVmZmVjdHMuZXhpdChzdHJpbmdUeXBlKTsKICAgICAgZWZmZWN0cy5leGl0KHJhd1R5cGUpOwogICAgICBlZmZlY3RzLmV4aXQodHlwZTUpOwogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIGlmIChiYWxhbmNlIDwgbGltaXQgJiYgY29kZTQgPT09IDQwKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGJhbGFuY2UrKzsKICAgICAgcmV0dXJuIHJhdzI7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDQxKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGJhbGFuY2UtLTsKICAgICAgcmV0dXJuIHJhdzI7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDMyIHx8IGNvZGU0ID09PSA0MCB8fCBhc2NpaUNvbnRyb2woY29kZTQpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb2RlNCA9PT0gOTIgPyByYXdFc2NhcGUgOiByYXcyOwogIH0KICBmdW5jdGlvbiByYXdFc2NhcGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDAgfHwgY29kZTQgPT09IDQxIHx8IGNvZGU0ID09PSA5MikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gcmF3MjsKICAgIH0KICAgIHJldHVybiByYXcyKGNvZGU0KTsKICB9Cn0KdmFyIGluaXRfbWljcm9tYXJrX2ZhY3RvcnlfZGVzdGluYXRpb24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZmFjdG9yeS1kZXN0aW5hdGlvbkAyLjAuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWZhY3RvcnktZGVzdGluYXRpb24vaW5kZXguanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1mYWN0b3J5LWxhYmVsQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstZmFjdG9yeS1sYWJlbC9pbmRleC5qcwpmdW5jdGlvbiBmYWN0b3J5TGFiZWwoZWZmZWN0cywgb2szLCBub2ssIHR5cGU1LCBtYXJrZXJUeXBlLCBzdHJpbmdUeXBlKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGxldCBzaXplID0gMDsKICBsZXQgc2VlbjsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIodHlwZTUpOwogICAgZWZmZWN0cy5lbnRlcihtYXJrZXJUeXBlKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQobWFya2VyVHlwZSk7CiAgICBlZmZlY3RzLmVudGVyKHN0cmluZ1R5cGUpOwogICAgcmV0dXJuIGF0QnJlYWs7CiAgfQogIGZ1bmN0aW9uIGF0QnJlYWsoY29kZTQpIHsKICAgIGlmIChzaXplID4gOTk5IHx8IGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA5MSB8fCBjb2RlNCA9PT0gOTMgJiYgIXNlZW4gfHwgLy8gVG8gZG86IHJlbW92ZSBpbiB0aGUgZnV0dXJlIG9uY2Ugd2XigJl2ZSBzd2l0Y2hlZCBmcm9tCiAgICAvLyBgbWljcm9tYXJrLWV4dGVuc2lvbi1mb290bm90ZWAgdG8gYG1pY3JvbWFyay1leHRlbnNpb24tZ2ZtLWZvb3Rub3RlYCwKICAgIC8vIHdoaWNoIGRvZXNu4oCZdCBuZWVkIHRoaXMuCiAgICAvLyBIaWRkZW4gZm9vdG5vdGVzIGhvb2suCiAgICAvKiBjOCBpZ25vcmUgbmV4dCAzICovCiAgICBjb2RlNCA9PT0gOTQgJiYgIXNpemUgJiYgIl9oaWRkZW5Gb290bm90ZVN1cHBvcnQiIGluIHNlbGYyLnBhcnNlci5jb25zdHJ1Y3RzKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmV4aXQoc3RyaW5nVHlwZSk7CiAgICAgIGVmZmVjdHMuZW50ZXIobWFya2VyVHlwZSk7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdChtYXJrZXJUeXBlKTsKICAgICAgZWZmZWN0cy5leGl0KHR5cGU1KTsKICAgICAgcmV0dXJuIG9rMzsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICAgIHJldHVybiBhdEJyZWFrOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigiY2h1bmtTdHJpbmciLCB7CiAgICAgIGNvbnRlbnRUeXBlOiAic3RyaW5nIgogICAgfSk7CiAgICByZXR1cm4gbGFiZWxJbnNpZGUoY29kZTQpOwogIH0KICBmdW5jdGlvbiBsYWJlbEluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA5MSB8fCBjb2RlNCA9PT0gOTMgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSB8fCBzaXplKysgPiA5OTkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJjaHVua1N0cmluZyIpOwogICAgICByZXR1cm4gYXRCcmVhayhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgaWYgKCFzZWVuKSBzZWVuID0gIW1hcmtkb3duU3BhY2UoY29kZTQpOwogICAgcmV0dXJuIGNvZGU0ID09PSA5MiA/IGxhYmVsRXNjYXBlIDogbGFiZWxJbnNpZGU7CiAgfQogIGZ1bmN0aW9uIGxhYmVsRXNjYXBlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDkxIHx8IGNvZGU0ID09PSA5MiB8fCBjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgc2l6ZSsrOwogICAgICByZXR1cm4gbGFiZWxJbnNpZGU7CiAgICB9CiAgICByZXR1cm4gbGFiZWxJbnNpZGUoY29kZTQpOwogIH0KfQp2YXIgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9sYWJlbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1mYWN0b3J5LWxhYmVsQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstZmFjdG9yeS1sYWJlbC9pbmRleC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWZhY3RvcnktdGl0bGVAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1mYWN0b3J5LXRpdGxlL2luZGV4LmpzCmZ1bmN0aW9uIGZhY3RvcnlUaXRsZShlZmZlY3RzLCBvazMsIG5vaywgdHlwZTUsIG1hcmtlclR5cGUsIHN0cmluZ1R5cGUpIHsKICBsZXQgbWFya2VyOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSAzNCB8fCBjb2RlNCA9PT0gMzkgfHwgY29kZTQgPT09IDQwKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIodHlwZTUpOwogICAgICBlZmZlY3RzLmVudGVyKG1hcmtlclR5cGUpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQobWFya2VyVHlwZSk7CiAgICAgIG1hcmtlciA9IGNvZGU0ID09PSA0MCA/IDQxIDogY29kZTQ7CiAgICAgIHJldHVybiBiZWdpbjM7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYmVnaW4zKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG1hcmtlcikgewogICAgICBlZmZlY3RzLmVudGVyKG1hcmtlclR5cGUpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQobWFya2VyVHlwZSk7CiAgICAgIGVmZmVjdHMuZXhpdCh0eXBlNSk7CiAgICAgIHJldHVybiBvazM7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKHN0cmluZ1R5cGUpOwogICAgcmV0dXJuIGF0QnJlYWsoY29kZTQpOwogIH0KICBmdW5jdGlvbiBhdEJyZWFrKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG1hcmtlcikgewogICAgICBlZmZlY3RzLmV4aXQoc3RyaW5nVHlwZSk7CiAgICAgIHJldHVybiBiZWdpbjMobWFya2VyKTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYXRCcmVhaywgImxpbmVQcmVmaXgiKTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIiwgewogICAgICBjb250ZW50VHlwZTogInN0cmluZyIKICAgIH0pOwogICAgcmV0dXJuIGluc2lkZShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBtYXJrZXIgfHwgY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rU3RyaW5nIik7CiAgICAgIHJldHVybiBhdEJyZWFrKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29kZTQgPT09IDkyID8gZXNjYXBlIDogaW5zaWRlOwogIH0KICBmdW5jdGlvbiBlc2NhcGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbWFya2VyIHx8IGNvZGU0ID09PSA5MikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gaW5zaWRlOwogICAgfQogICAgcmV0dXJuIGluc2lkZShjb2RlNCk7CiAgfQp9CnZhciBpbml0X21pY3JvbWFya19mYWN0b3J5X3RpdGxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWZhY3RvcnktdGl0bGVAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1mYWN0b3J5LXRpdGxlL2luZGV4LmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX2ZhY3Rvcnlfc3BhY2UoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZmFjdG9yeS13aGl0ZXNwYWNlQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstZmFjdG9yeS13aGl0ZXNwYWNlL2luZGV4LmpzCmZ1bmN0aW9uIGZhY3RvcnlXaGl0ZXNwYWNlKGVmZmVjdHMsIG9rMykgewogIGxldCBzZWVuOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZyIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgICAgc2VlbiA9IHRydWU7CiAgICAgIHJldHVybiBzdGFydDsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIHN0YXJ0LCBzZWVuID8gImxpbmVQcmVmaXgiIDogImxpbmVTdWZmaXgiKShjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9Cn0KdmFyIGluaXRfbWljcm9tYXJrX2ZhY3Rvcnlfd2hpdGVzcGFjZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1mYWN0b3J5LXdoaXRlc3BhY2VAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1mYWN0b3J5LXdoaXRlc3BhY2UvaW5kZXguanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9zcGFjZSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2RlZmluaXRpb24uanMKZnVuY3Rpb24gdG9rZW5pemVEZWZpbml0aW9uKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGxldCBpZGVudGlmaWVyOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiZGVmaW5pdGlvbiIpOwogICAgcmV0dXJuIGJlZm9yZShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGJlZm9yZShjb2RlNCkgewogICAgcmV0dXJuIGZhY3RvcnlMYWJlbC5jYWxsKAogICAgICBzZWxmMiwKICAgICAgZWZmZWN0cywKICAgICAgbGFiZWxBZnRlciwKICAgICAgLy8gTm90ZTogd2UgZG9u4oCZdCBuZWVkIHRvIHJlc2V0IHRoZSB3YXkgYG1hcmtkb3duLXJzYCBkb2VzLgogICAgICBub2ssCiAgICAgICJkZWZpbml0aW9uTGFiZWwiLAogICAgICAiZGVmaW5pdGlvbkxhYmVsTWFya2VyIiwKICAgICAgImRlZmluaXRpb25MYWJlbFN0cmluZyIKICAgICkoY29kZTQpOwogIH0KICBmdW5jdGlvbiBsYWJlbEFmdGVyKGNvZGU0KSB7CiAgICBpZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcihzZWxmMi5zbGljZVNlcmlhbGl6ZShzZWxmMi5ldmVudHNbc2VsZjIuZXZlbnRzLmxlbmd0aCAtIDFdWzFdKS5zbGljZSgxLCAtMSkpOwogICAgaWYgKGNvZGU0ID09PSA1OCkgewogICAgICBlZmZlY3RzLmVudGVyKCJkZWZpbml0aW9uTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiZGVmaW5pdGlvbk1hcmtlciIpOwogICAgICByZXR1cm4gbWFya2VyQWZ0ZXI7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gbWFya2VyQWZ0ZXIoY29kZTQpIHsKICAgIHJldHVybiBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSA/IGZhY3RvcnlXaGl0ZXNwYWNlKGVmZmVjdHMsIGRlc3RpbmF0aW9uQmVmb3JlKShjb2RlNCkgOiBkZXN0aW5hdGlvbkJlZm9yZShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGRlc3RpbmF0aW9uQmVmb3JlKGNvZGU0KSB7CiAgICByZXR1cm4gZmFjdG9yeURlc3RpbmF0aW9uKAogICAgICBlZmZlY3RzLAogICAgICBkZXN0aW5hdGlvbkFmdGVyLAogICAgICAvLyBOb3RlOiB3ZSBkb27igJl0IG5lZWQgdG8gcmVzZXQgdGhlIHdheSBgbWFya2Rvd24tcnNgIGRvZXMuCiAgICAgIG5vaywKICAgICAgImRlZmluaXRpb25EZXN0aW5hdGlvbiIsCiAgICAgICJkZWZpbml0aW9uRGVzdGluYXRpb25MaXRlcmFsIiwKICAgICAgImRlZmluaXRpb25EZXN0aW5hdGlvbkxpdGVyYWxNYXJrZXIiLAogICAgICAiZGVmaW5pdGlvbkRlc3RpbmF0aW9uUmF3IiwKICAgICAgImRlZmluaXRpb25EZXN0aW5hdGlvblN0cmluZyIKICAgICkoY29kZTQpOwogIH0KICBmdW5jdGlvbiBkZXN0aW5hdGlvbkFmdGVyKGNvZGU0KSB7CiAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KHRpdGxlQmVmb3JlLCBhZnRlciwgYWZ0ZXIpKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgIHJldHVybiBtYXJrZG93blNwYWNlKGNvZGU0KSA/IGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlcldoaXRlc3BhY2UsICJ3aGl0ZXNwYWNlIikoY29kZTQpIDogYWZ0ZXJXaGl0ZXNwYWNlKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYWZ0ZXJXaGl0ZXNwYWNlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImRlZmluaXRpb24iKTsKICAgICAgc2VsZjIucGFyc2VyLmRlZmluZWQucHVzaChpZGVudGlmaWVyKTsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVUaXRsZUJlZm9yZShlZmZlY3RzLCBvazMsIG5vaykgewogIHJldHVybiB0aXRsZUJlZm9yZTI7CiAgZnVuY3Rpb24gdGl0bGVCZWZvcmUyKGNvZGU0KSB7CiAgICByZXR1cm4gbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkgPyBmYWN0b3J5V2hpdGVzcGFjZShlZmZlY3RzLCBiZWZvcmVNYXJrZXIpKGNvZGU0KSA6IG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGJlZm9yZU1hcmtlcihjb2RlNCkgewogICAgcmV0dXJuIGZhY3RvcnlUaXRsZShlZmZlY3RzLCB0aXRsZUFmdGVyLCBub2ssICJkZWZpbml0aW9uVGl0bGUiLCAiZGVmaW5pdGlvblRpdGxlTWFya2VyIiwgImRlZmluaXRpb25UaXRsZVN0cmluZyIpKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdGl0bGVBZnRlcihjb2RlNCkgewogICAgcmV0dXJuIG1hcmtkb3duU3BhY2UoY29kZTQpID8gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIHRpdGxlQWZ0ZXJPcHRpb25hbFdoaXRlc3BhY2UsICJ3aGl0ZXNwYWNlIikoY29kZTQpIDogdGl0bGVBZnRlck9wdGlvbmFsV2hpdGVzcGFjZShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHRpdGxlQWZ0ZXJPcHRpb25hbFdoaXRlc3BhY2UoY29kZTQpIHsKICAgIHJldHVybiBjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpID8gb2szKGNvZGU0KSA6IG5vayhjb2RlNCk7CiAgfQp9CnZhciBkZWZpbml0aW9uMiwgdGl0bGVCZWZvcmU7CnZhciBpbml0X2RlZmluaXRpb24yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvZGVmaW5pdGlvbi5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X2Rlc3RpbmF0aW9uKCk7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X2xhYmVsKCk7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X3NwYWNlKCk7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X3RpdGxlKCk7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X3doaXRlc3BhY2UoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX25vcm1hbGl6ZV9pZGVudGlmaWVyKCk7CiAgICBkZWZpbml0aW9uMiA9IHsKICAgICAgbmFtZTogImRlZmluaXRpb24iLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVEZWZpbml0aW9uCiAgICB9OwogICAgdGl0bGVCZWZvcmUgPSB7CiAgICAgIHBhcnRpYWw6IHRydWUsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZVRpdGxlQmVmb3JlCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvaGFyZC1icmVhay1lc2NhcGUuanMKZnVuY3Rpb24gdG9rZW5pemVIYXJkQnJlYWtFc2NhcGUoZWZmZWN0cywgb2szLCBub2spIHsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImhhcmRCcmVha0VzY2FwZSIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBhZnRlcjsKICB9CiAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiaGFyZEJyZWFrRXNjYXBlIik7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQp9CnZhciBoYXJkQnJlYWtFc2NhcGU7CnZhciBpbml0X2hhcmRfYnJlYWtfZXNjYXBlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvaGFyZC1icmVhay1lc2NhcGUuanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGhhcmRCcmVha0VzY2FwZSA9IHsKICAgICAgbmFtZTogImhhcmRCcmVha0VzY2FwZSIsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZUhhcmRCcmVha0VzY2FwZQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2hlYWRpbmctYXR4LmpzCmZ1bmN0aW9uIHJlc29sdmVIZWFkaW5nQXR4KGV2ZW50cywgY29udGV4dDIpIHsKICBsZXQgY29udGVudEVuZCA9IGV2ZW50cy5sZW5ndGggLSAyOwogIGxldCBjb250ZW50U3RhcnQgPSAzOwogIGxldCBjb250ZW50MzsKICBsZXQgdGV4dDk7CiAgaWYgKGV2ZW50c1tjb250ZW50U3RhcnRdWzFdLnR5cGUgPT09ICJ3aGl0ZXNwYWNlIikgewogICAgY29udGVudFN0YXJ0ICs9IDI7CiAgfQogIGlmIChjb250ZW50RW5kIC0gMiA+IGNvbnRlbnRTdGFydCAmJiBldmVudHNbY29udGVudEVuZF1bMV0udHlwZSA9PT0gIndoaXRlc3BhY2UiKSB7CiAgICBjb250ZW50RW5kIC09IDI7CiAgfQogIGlmIChldmVudHNbY29udGVudEVuZF1bMV0udHlwZSA9PT0gImF0eEhlYWRpbmdTZXF1ZW5jZSIgJiYgKGNvbnRlbnRTdGFydCA9PT0gY29udGVudEVuZCAtIDEgfHwgY29udGVudEVuZCAtIDQgPiBjb250ZW50U3RhcnQgJiYgZXZlbnRzW2NvbnRlbnRFbmQgLSAyXVsxXS50eXBlID09PSAid2hpdGVzcGFjZSIpKSB7CiAgICBjb250ZW50RW5kIC09IGNvbnRlbnRTdGFydCArIDEgPT09IGNvbnRlbnRFbmQgPyAyIDogNDsKICB9CiAgaWYgKGNvbnRlbnRFbmQgPiBjb250ZW50U3RhcnQpIHsKICAgIGNvbnRlbnQzID0gewogICAgICB0eXBlOiAiYXR4SGVhZGluZ1RleHQiLAogICAgICBzdGFydDogZXZlbnRzW2NvbnRlbnRTdGFydF1bMV0uc3RhcnQsCiAgICAgIGVuZDogZXZlbnRzW2NvbnRlbnRFbmRdWzFdLmVuZAogICAgfTsKICAgIHRleHQ5ID0gewogICAgICB0eXBlOiAiY2h1bmtUZXh0IiwKICAgICAgc3RhcnQ6IGV2ZW50c1tjb250ZW50U3RhcnRdWzFdLnN0YXJ0LAogICAgICBlbmQ6IGV2ZW50c1tjb250ZW50RW5kXVsxXS5lbmQsCiAgICAgIGNvbnRlbnRUeXBlOiAidGV4dCIKICAgIH07CiAgICBzcGxpY2UoZXZlbnRzLCBjb250ZW50U3RhcnQsIGNvbnRlbnRFbmQgLSBjb250ZW50U3RhcnQgKyAxLCBbWyJlbnRlciIsIGNvbnRlbnQzLCBjb250ZXh0Ml0sIFsiZW50ZXIiLCB0ZXh0OSwgY29udGV4dDJdLCBbImV4aXQiLCB0ZXh0OSwgY29udGV4dDJdLCBbImV4aXQiLCBjb250ZW50MywgY29udGV4dDJdXSk7CiAgfQogIHJldHVybiBldmVudHM7Cn0KZnVuY3Rpb24gdG9rZW5pemVIZWFkaW5nQXR4KGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgbGV0IHNpemUgPSAwOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiYXR4SGVhZGluZyIpOwogICAgcmV0dXJuIGJlZm9yZShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGJlZm9yZShjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiYXR4SGVhZGluZ1NlcXVlbmNlIik7CiAgICByZXR1cm4gc2VxdWVuY2VPcGVuKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gc2VxdWVuY2VPcGVuKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDM1ICYmIHNpemUrKyA8IDYpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHNlcXVlbmNlT3BlbjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImF0eEhlYWRpbmdTZXF1ZW5jZSIpOwogICAgICByZXR1cm4gYXRCcmVhayhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYXRCcmVhayhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSAzNSkgewogICAgICBlZmZlY3RzLmVudGVyKCJhdHhIZWFkaW5nU2VxdWVuY2UiKTsKICAgICAgcmV0dXJuIHNlcXVlbmNlRnVydGhlcihjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImF0eEhlYWRpbmciKTsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhdEJyZWFrLCAid2hpdGVzcGFjZSIpKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImF0eEhlYWRpbmdUZXh0Iik7CiAgICByZXR1cm4gZGF0YShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHNlcXVlbmNlRnVydGhlcihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSAzNSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gc2VxdWVuY2VGdXJ0aGVyOwogICAgfQogICAgZWZmZWN0cy5leGl0KCJhdHhIZWFkaW5nU2VxdWVuY2UiKTsKICAgIHJldHVybiBhdEJyZWFrKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gZGF0YShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSAzNSB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImF0eEhlYWRpbmdUZXh0Iik7CiAgICAgIHJldHVybiBhdEJyZWFrKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gZGF0YTsKICB9Cn0KdmFyIGhlYWRpbmdBdHg7CnZhciBpbml0X2hlYWRpbmdfYXR4ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvaGVhZGluZy1hdHguanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9zcGFjZSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2h1bmtlZCgpOwogICAgaGVhZGluZ0F0eCA9IHsKICAgICAgbmFtZTogImhlYWRpbmdBdHgiLAogICAgICByZXNvbHZlOiByZXNvbHZlSGVhZGluZ0F0eCwKICAgICAgdG9rZW5pemU6IHRva2VuaXplSGVhZGluZ0F0eAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLWh0bWwtdGFnLW5hbWVAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLWh0bWwtdGFnLW5hbWUvaW5kZXguanMKdmFyIGh0bWxCbG9ja05hbWVzLCBodG1sUmF3TmFtZXM7CnZhciBpbml0X21pY3JvbWFya191dGlsX2h0bWxfdGFnX25hbWUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1odG1sLXRhZy1uYW1lQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1odG1sLXRhZy1uYW1lL2luZGV4LmpzIigpIHsKICAgIGh0bWxCbG9ja05hbWVzID0gWwogICAgICAiYWRkcmVzcyIsCiAgICAgICJhcnRpY2xlIiwKICAgICAgImFzaWRlIiwKICAgICAgImJhc2UiLAogICAgICAiYmFzZWZvbnQiLAogICAgICAiYmxvY2txdW90ZSIsCiAgICAgICJib2R5IiwKICAgICAgImNhcHRpb24iLAogICAgICAiY2VudGVyIiwKICAgICAgImNvbCIsCiAgICAgICJjb2xncm91cCIsCiAgICAgICJkZCIsCiAgICAgICJkZXRhaWxzIiwKICAgICAgImRpYWxvZyIsCiAgICAgICJkaXIiLAogICAgICAiZGl2IiwKICAgICAgImRsIiwKICAgICAgImR0IiwKICAgICAgImZpZWxkc2V0IiwKICAgICAgImZpZ2NhcHRpb24iLAogICAgICAiZmlndXJlIiwKICAgICAgImZvb3RlciIsCiAgICAgICJmb3JtIiwKICAgICAgImZyYW1lIiwKICAgICAgImZyYW1lc2V0IiwKICAgICAgImgxIiwKICAgICAgImgyIiwKICAgICAgImgzIiwKICAgICAgImg0IiwKICAgICAgImg1IiwKICAgICAgImg2IiwKICAgICAgImhlYWQiLAogICAgICAiaGVhZGVyIiwKICAgICAgImhyIiwKICAgICAgImh0bWwiLAogICAgICAiaWZyYW1lIiwKICAgICAgImxlZ2VuZCIsCiAgICAgICJsaSIsCiAgICAgICJsaW5rIiwKICAgICAgIm1haW4iLAogICAgICAibWVudSIsCiAgICAgICJtZW51aXRlbSIsCiAgICAgICJuYXYiLAogICAgICAibm9mcmFtZXMiLAogICAgICAib2wiLAogICAgICAib3B0Z3JvdXAiLAogICAgICAib3B0aW9uIiwKICAgICAgInAiLAogICAgICAicGFyYW0iLAogICAgICAic2VhcmNoIiwKICAgICAgInNlY3Rpb24iLAogICAgICAic3VtbWFyeSIsCiAgICAgICJ0YWJsZSIsCiAgICAgICJ0Ym9keSIsCiAgICAgICJ0ZCIsCiAgICAgICJ0Zm9vdCIsCiAgICAgICJ0aCIsCiAgICAgICJ0aGVhZCIsCiAgICAgICJ0aXRsZSIsCiAgICAgICJ0ciIsCiAgICAgICJ0cmFjayIsCiAgICAgICJ1bCIKICAgIF07CiAgICBodG1sUmF3TmFtZXMgPSBbInByZSIsICJzY3JpcHQiLCAic3R5bGUiLCAidGV4dGFyZWEiXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2h0bWwtZmxvdy5qcwpmdW5jdGlvbiByZXNvbHZlVG9IdG1sRmxvdyhldmVudHMpIHsKICBsZXQgaW5kZXgyID0gZXZlbnRzLmxlbmd0aDsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIGlmIChldmVudHNbaW5kZXgyXVswXSA9PT0gImVudGVyIiAmJiBldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAiaHRtbEZsb3ciKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAoaW5kZXgyID4gMSAmJiBldmVudHNbaW5kZXgyIC0gMl1bMV0udHlwZSA9PT0gImxpbmVQcmVmaXgiKSB7CiAgICBldmVudHNbaW5kZXgyXVsxXS5zdGFydCA9IGV2ZW50c1tpbmRleDIgLSAyXVsxXS5zdGFydDsKICAgIGV2ZW50c1tpbmRleDIgKyAxXVsxXS5zdGFydCA9IGV2ZW50c1tpbmRleDIgLSAyXVsxXS5zdGFydDsKICAgIGV2ZW50cy5zcGxpY2UoaW5kZXgyIC0gMiwgMik7CiAgfQogIHJldHVybiBldmVudHM7Cn0KZnVuY3Rpb24gdG9rZW5pemVIdG1sRmxvdyhlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBsZXQgbWFya2VyOwogIGxldCBjbG9zaW5nVGFnOwogIGxldCBidWZmZXIyOwogIGxldCBpbmRleDI7CiAgbGV0IG1hcmtlckI7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICByZXR1cm4gYmVmb3JlKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYmVmb3JlKGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJodG1sRmxvdyIpOwogICAgZWZmZWN0cy5lbnRlcigiaHRtbEZsb3dEYXRhIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIG9wZW47CiAgfQogIGZ1bmN0aW9uIG9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gMzMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uT3BlbjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDcpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgY2xvc2luZ1RhZyA9IHRydWU7CiAgICAgIHJldHVybiB0YWdDbG9zZVN0YXJ0OwogICAgfQogICAgaWYgKGNvZGU0ID09PSA2MykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBtYXJrZXIgPSAzOwogICAgICByZXR1cm4gc2VsZjIuaW50ZXJydXB0ID8gb2szIDogY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGU7CiAgICB9CiAgICBpZiAoYXNjaWlBbHBoYShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgYnVmZmVyMiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZTQpOwogICAgICByZXR1cm4gdGFnTmFtZTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBkZWNsYXJhdGlvbk9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDUpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgbWFya2VyID0gMjsKICAgICAgcmV0dXJuIGNvbW1lbnRPcGVuSW5zaWRlOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBtYXJrZXIgPSA1OwogICAgICBpbmRleDIgPSAwOwogICAgICByZXR1cm4gY2RhdGFPcGVuSW5zaWRlOwogICAgfQogICAgaWYgKGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIG1hcmtlciA9IDQ7CiAgICAgIHJldHVybiBzZWxmMi5pbnRlcnJ1cHQgPyBvazMgOiBjb250aW51YXRpb25EZWNsYXJhdGlvbkluc2lkZTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBjb21tZW50T3Blbkluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gc2VsZjIuaW50ZXJydXB0ID8gb2szIDogY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGU7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY2RhdGFPcGVuSW5zaWRlKGNvZGU0KSB7CiAgICBjb25zdCB2YWx1ZTIgPSAiQ0RBVEFbIjsKICAgIGlmIChjb2RlNCA9PT0gdmFsdWUyLmNoYXJDb2RlQXQoaW5kZXgyKyspKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGlmIChpbmRleDIgPT09IHZhbHVlMi5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gc2VsZjIuaW50ZXJydXB0ID8gb2szIDogY29udGludWF0aW9uOwogICAgICB9CiAgICAgIHJldHVybiBjZGF0YU9wZW5JbnNpZGU7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdGFnQ2xvc2VTdGFydChjb2RlNCkgewogICAgaWYgKGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGJ1ZmZlcjIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGU0KTsKICAgICAgcmV0dXJuIHRhZ05hbWU7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdGFnTmFtZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA0NyB8fCBjb2RlNCA9PT0gNjIgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpIHsKICAgICAgY29uc3Qgc2xhc2ggPSBjb2RlNCA9PT0gNDc7CiAgICAgIGNvbnN0IG5hbWUgPSBidWZmZXIyLnRvTG93ZXJDYXNlKCk7CiAgICAgIGlmICghc2xhc2ggJiYgIWNsb3NpbmdUYWcgJiYgaHRtbFJhd05hbWVzLmluY2x1ZGVzKG5hbWUpKSB7CiAgICAgICAgbWFya2VyID0gMTsKICAgICAgICByZXR1cm4gc2VsZjIuaW50ZXJydXB0ID8gb2szKGNvZGU0KSA6IGNvbnRpbnVhdGlvbihjb2RlNCk7CiAgICAgIH0KICAgICAgaWYgKGh0bWxCbG9ja05hbWVzLmluY2x1ZGVzKGJ1ZmZlcjIudG9Mb3dlckNhc2UoKSkpIHsKICAgICAgICBtYXJrZXIgPSA2OwogICAgICAgIGlmIChzbGFzaCkgewogICAgICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgICAgIHJldHVybiBiYXNpY1NlbGZDbG9zaW5nOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2VsZjIuaW50ZXJydXB0ID8gb2szKGNvZGU0KSA6IGNvbnRpbnVhdGlvbihjb2RlNCk7CiAgICAgIH0KICAgICAgbWFya2VyID0gNzsKICAgICAgcmV0dXJuIHNlbGYyLmludGVycnVwdCAmJiAhc2VsZjIucGFyc2VyLmxhenlbc2VsZjIubm93KCkubGluZV0gPyBub2soY29kZTQpIDogY2xvc2luZ1RhZyA/IGNvbXBsZXRlQ2xvc2luZ1RhZ0FmdGVyKGNvZGU0KSA6IGNvbXBsZXRlQXR0cmlidXRlTmFtZUJlZm9yZShjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDQ1IHx8IGFzY2lpQWxwaGFudW1lcmljKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBidWZmZXIyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZTQpOwogICAgICByZXR1cm4gdGFnTmFtZTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBiYXNpY1NlbGZDbG9zaW5nKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBzZWxmMi5pbnRlcnJ1cHQgPyBvazMgOiBjb250aW51YXRpb247CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY29tcGxldGVDbG9zaW5nVGFnQWZ0ZXIoY29kZTQpIHsKICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tcGxldGVDbG9zaW5nVGFnQWZ0ZXI7CiAgICB9CiAgICByZXR1cm4gY29tcGxldGVFbmQoY29kZTQpOwogIH0KICBmdW5jdGlvbiBjb21wbGV0ZUF0dHJpYnV0ZU5hbWVCZWZvcmUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDcpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbXBsZXRlRW5kOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA1OCB8fCBjb2RlNCA9PT0gOTUgfHwgYXNjaWlBbHBoYShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlTmFtZTsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVOYW1lQmVmb3JlOwogICAgfQogICAgcmV0dXJuIGNvbXBsZXRlRW5kKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY29tcGxldGVBdHRyaWJ1dGVOYW1lKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ1IHx8IGNvZGU0ID09PSA0NiB8fCBjb2RlNCA9PT0gNTggfHwgY29kZTQgPT09IDk1IHx8IGFzY2lpQWxwaGFudW1lcmljKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVOYW1lOwogICAgfQogICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlTmFtZUFmdGVyKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY29tcGxldGVBdHRyaWJ1dGVOYW1lQWZ0ZXIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNjEpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVCZWZvcmU7CiAgICB9CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlTmFtZUFmdGVyOwogICAgfQogICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlTmFtZUJlZm9yZShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVCZWZvcmUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gNjAgfHwgY29kZTQgPT09IDYxIHx8IGNvZGU0ID09PSA2MiB8fCBjb2RlNCA9PT0gOTYpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDM0IHx8IGNvZGU0ID09PSAzOSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBtYXJrZXJCID0gY29kZTQ7CiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlUXVvdGVkOwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlQmVmb3JlOwogICAgfQogICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVVbnF1b3RlZChjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVRdW90ZWQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbWFya2VyQikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBtYXJrZXJCID0gbnVsbDsKICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVRdW90ZWRBZnRlcjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlUXVvdGVkOwogIH0KICBmdW5jdGlvbiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlVW5xdW90ZWQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gMzQgfHwgY29kZTQgPT09IDM5IHx8IGNvZGU0ID09PSA0NyB8fCBjb2RlNCA9PT0gNjAgfHwgY29kZTQgPT09IDYxIHx8IGNvZGU0ID09PSA2MiB8fCBjb2RlNCA9PT0gOTYgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlTmFtZUFmdGVyKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVVucXVvdGVkOwogIH0KICBmdW5jdGlvbiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlUXVvdGVkQWZ0ZXIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDcgfHwgY29kZTQgPT09IDYyIHx8IG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZU5hbWVCZWZvcmUoY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbXBsZXRlRW5kKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb21wbGV0ZUFmdGVyOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbXBsZXRlQWZ0ZXIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBjb250aW51YXRpb24oY29kZTQpOwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb21wbGV0ZUFmdGVyOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbnRpbnVhdGlvbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSAmJiBtYXJrZXIgPT09IDIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkNvbW1lbnRJbnNpZGU7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDYwICYmIG1hcmtlciA9PT0gMSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29udGludWF0aW9uUmF3VGFnT3BlbjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNjIgJiYgbWFya2VyID09PSA0KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb250aW51YXRpb25DbG9zZTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNjMgJiYgbWFya2VyID09PSAzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb250aW51YXRpb25EZWNsYXJhdGlvbkluc2lkZTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gOTMgJiYgbWFya2VyID09PSA1KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb250aW51YXRpb25DZGF0YUluc2lkZTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpICYmIChtYXJrZXIgPT09IDYgfHwgbWFya2VyID09PSA3KSkgewogICAgICBlZmZlY3RzLmV4aXQoImh0bWxGbG93RGF0YSIpOwogICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhibGFua0xpbmVCZWZvcmUsIGNvbnRpbnVhdGlvbkFmdGVyLCBjb250aW51YXRpb25TdGFydCkoY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJodG1sRmxvd0RhdGEiKTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvblN0YXJ0KGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29udGludWF0aW9uOwogIH0KICBmdW5jdGlvbiBjb250aW51YXRpb25TdGFydChjb2RlNCkgewogICAgcmV0dXJuIGVmZmVjdHMuY2hlY2sobm9uTGF6eUNvbnRpbnVhdGlvblN0YXJ0LCBjb250aW51YXRpb25TdGFydE5vbkxhenksIGNvbnRpbnVhdGlvbkFmdGVyKShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbnRpbnVhdGlvblN0YXJ0Tm9uTGF6eShjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZyIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgcmV0dXJuIGNvbnRpbnVhdGlvbkJlZm9yZTsKICB9CiAgZnVuY3Rpb24gY29udGludWF0aW9uQmVmb3JlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm4gY29udGludWF0aW9uU3RhcnQoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigiaHRtbEZsb3dEYXRhIik7CiAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY29udGludWF0aW9uQ29tbWVudEluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGU7CiAgICB9CiAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY29udGludWF0aW9uUmF3VGFnT3Blbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBidWZmZXIyID0gIiI7CiAgICAgIHJldHVybiBjb250aW51YXRpb25SYXdFbmRUYWc7CiAgICB9CiAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY29udGludWF0aW9uUmF3RW5kVGFnKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIGNvbnN0IG5hbWUgPSBidWZmZXIyLnRvTG93ZXJDYXNlKCk7CiAgICAgIGlmIChodG1sUmF3TmFtZXMuaW5jbHVkZXMobmFtZSkpIHsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIHJldHVybiBjb250aW51YXRpb25DbG9zZTsKICAgICAgfQogICAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGU0KTsKICAgIH0KICAgIGlmIChhc2NpaUFscGhhKGNvZGU0KSAmJiBidWZmZXIyLmxlbmd0aCA8IDgpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgYnVmZmVyMiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvblJhd0VuZFRhZzsKICAgIH0KICAgIHJldHVybiBjb250aW51YXRpb24oY29kZTQpOwogIH0KICBmdW5jdGlvbiBjb250aW51YXRpb25DZGF0YUluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGU7CiAgICB9CiAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNjIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkNsb3NlOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0NSAmJiBtYXJrZXIgPT09IDIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkRlY2xhcmF0aW9uSW5zaWRlOwogICAgfQogICAgcmV0dXJuIGNvbnRpbnVhdGlvbihjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbnRpbnVhdGlvbkNsb3NlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImh0bWxGbG93RGF0YSIpOwogICAgICByZXR1cm4gY29udGludWF0aW9uQWZ0ZXIoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb250aW51YXRpb25DbG9zZTsKICB9CiAgZnVuY3Rpb24gY29udGludWF0aW9uQWZ0ZXIoY29kZTQpIHsKICAgIGVmZmVjdHMuZXhpdCgiaHRtbEZsb3ciKTsKICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KfQpmdW5jdGlvbiB0b2tlbml6ZU5vbkxhenlDb250aW51YXRpb25TdGFydChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICAgIHJldHVybiBhZnRlcjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgcmV0dXJuIHNlbGYyLnBhcnNlci5sYXp5W3NlbGYyLm5vdygpLmxpbmVdID8gbm9rKGNvZGU0KSA6IG9rMyhjb2RlNCk7CiAgfQp9CmZ1bmN0aW9uIHRva2VuaXplQmxhbmtMaW5lQmVmb3JlKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KGJsYW5rTGluZSwgb2szLCBub2spOwogIH0KfQp2YXIgaHRtbEZsb3csIGJsYW5rTGluZUJlZm9yZSwgbm9uTGF6eUNvbnRpbnVhdGlvblN0YXJ0Owp2YXIgaW5pdF9odG1sX2Zsb3cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9odG1sLWZsb3cuanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfaHRtbF90YWdfbmFtZSgpOwogICAgaW5pdF9ibGFua19saW5lKCk7CiAgICBodG1sRmxvdyA9IHsKICAgICAgY29uY3JldGU6IHRydWUsCiAgICAgIG5hbWU6ICJodG1sRmxvdyIsCiAgICAgIHJlc29sdmVUbzogcmVzb2x2ZVRvSHRtbEZsb3csCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZUh0bWxGbG93CiAgICB9OwogICAgYmxhbmtMaW5lQmVmb3JlID0gewogICAgICBwYXJ0aWFsOiB0cnVlLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVCbGFua0xpbmVCZWZvcmUKICAgIH07CiAgICBub25MYXp5Q29udGludWF0aW9uU3RhcnQgPSB7CiAgICAgIHBhcnRpYWw6IHRydWUsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZU5vbkxhenlDb250aW51YXRpb25TdGFydAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2h0bWwtdGV4dC5qcwpmdW5jdGlvbiB0b2tlbml6ZUh0bWxUZXh0KGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGxldCBtYXJrZXI7CiAgbGV0IGluZGV4MjsKICBsZXQgcmV0dXJuU3RhdGU7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJodG1sVGV4dCIpOwogICAgZWZmZWN0cy5lbnRlcigiaHRtbFRleHREYXRhIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIG9wZW47CiAgfQogIGZ1bmN0aW9uIG9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gMzMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uT3BlbjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDcpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRhZ0Nsb3NlU3RhcnQ7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDYzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBpbnN0cnVjdGlvbjsKICAgIH0KICAgIGlmIChhc2NpaUFscGhhKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnT3BlbjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBkZWNsYXJhdGlvbk9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDUpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbW1lbnRPcGVuSW5zaWRlOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBpbmRleDIgPSAwOwogICAgICByZXR1cm4gY2RhdGFPcGVuSW5zaWRlOwogICAgfQogICAgaWYgKGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBjb21tZW50T3Blbkluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tbWVudEVuZDsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBjb21tZW50Myhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tbWVudENsb3NlOwogICAgfQogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuU3RhdGUgPSBjb21tZW50MzsKICAgICAgcmV0dXJuIGxpbmVFbmRpbmdCZWZvcmUoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb21tZW50MzsKICB9CiAgZnVuY3Rpb24gY29tbWVudENsb3NlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ1KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb21tZW50RW5kOwogICAgfQogICAgcmV0dXJuIGNvbW1lbnQzKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY29tbWVudEVuZChjb2RlNCkgewogICAgcmV0dXJuIGNvZGU0ID09PSA2MiA/IGVuZDMoY29kZTQpIDogY29kZTQgPT09IDQ1ID8gY29tbWVudENsb3NlKGNvZGU0KSA6IGNvbW1lbnQzKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY2RhdGFPcGVuSW5zaWRlKGNvZGU0KSB7CiAgICBjb25zdCB2YWx1ZTIgPSAiQ0RBVEFbIjsKICAgIGlmIChjb2RlNCA9PT0gdmFsdWUyLmNoYXJDb2RlQXQoaW5kZXgyKyspKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBpbmRleDIgPT09IHZhbHVlMi5sZW5ndGggPyBjZGF0YSA6IGNkYXRhT3Blbkluc2lkZTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBjZGF0YShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY2RhdGFDbG9zZTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVyblN0YXRlID0gY2RhdGE7CiAgICAgIHJldHVybiBsaW5lRW5kaW5nQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY2RhdGE7CiAgfQogIGZ1bmN0aW9uIGNkYXRhQ2xvc2UoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNkYXRhRW5kOwogICAgfQogICAgcmV0dXJuIGNkYXRhKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY2RhdGFFbmQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNjIpIHsKICAgICAgcmV0dXJuIGVuZDMoY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY2RhdGFFbmQ7CiAgICB9CiAgICByZXR1cm4gY2RhdGEoY29kZTQpOwogIH0KICBmdW5jdGlvbiBkZWNsYXJhdGlvbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA2MikgewogICAgICByZXR1cm4gZW5kMyhjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm5TdGF0ZSA9IGRlY2xhcmF0aW9uOwogICAgICByZXR1cm4gbGluZUVuZGluZ0JlZm9yZShjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGRlY2xhcmF0aW9uOwogIH0KICBmdW5jdGlvbiBpbnN0cnVjdGlvbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA2MykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25DbG9zZTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVyblN0YXRlID0gaW5zdHJ1Y3Rpb247CiAgICAgIHJldHVybiBsaW5lRW5kaW5nQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb247CiAgfQogIGZ1bmN0aW9uIGluc3RydWN0aW9uQ2xvc2UoY29kZTQpIHsKICAgIHJldHVybiBjb2RlNCA9PT0gNjIgPyBlbmQzKGNvZGU0KSA6IGluc3RydWN0aW9uKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdGFnQ2xvc2VTdGFydChjb2RlNCkgewogICAgaWYgKGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB0YWdDbG9zZTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiB0YWdDbG9zZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSB8fCBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRhZ0Nsb3NlOwogICAgfQogICAgcmV0dXJuIHRhZ0Nsb3NlQmV0d2Vlbihjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHRhZ0Nsb3NlQmV0d2Vlbihjb2RlNCkgewogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuU3RhdGUgPSB0YWdDbG9zZUJldHdlZW47CiAgICAgIHJldHVybiBsaW5lRW5kaW5nQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnQ2xvc2VCZXR3ZWVuOwogICAgfQogICAgcmV0dXJuIGVuZDMoY29kZTQpOwogIH0KICBmdW5jdGlvbiB0YWdPcGVuKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ1IHx8IGFzY2lpQWxwaGFudW1lcmljKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnT3BlbjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDcgfHwgY29kZTQgPT09IDYyIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIHJldHVybiB0YWdPcGVuQmV0d2Vlbihjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdGFnT3BlbkJldHdlZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDcpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGVuZDM7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDU4IHx8IGNvZGU0ID09PSA5NSB8fCBhc2NpaUFscGhhKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnT3BlbkF0dHJpYnV0ZU5hbWU7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm5TdGF0ZSA9IHRhZ09wZW5CZXR3ZWVuOwogICAgICByZXR1cm4gbGluZUVuZGluZ0JlZm9yZShjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRhZ09wZW5CZXR3ZWVuOwogICAgfQogICAgcmV0dXJuIGVuZDMoY29kZTQpOwogIH0KICBmdW5jdGlvbiB0YWdPcGVuQXR0cmlidXRlTmFtZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSB8fCBjb2RlNCA9PT0gNDYgfHwgY29kZTQgPT09IDU4IHx8IGNvZGU0ID09PSA5NSB8fCBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVOYW1lOwogICAgfQogICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVOYW1lQWZ0ZXIoY29kZTQpOwogIH0KICBmdW5jdGlvbiB0YWdPcGVuQXR0cmlidXRlTmFtZUFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYxKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlVmFsdWVCZWZvcmU7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm5TdGF0ZSA9IHRhZ09wZW5BdHRyaWJ1dGVOYW1lQWZ0ZXI7CiAgICAgIHJldHVybiBsaW5lRW5kaW5nQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnT3BlbkF0dHJpYnV0ZU5hbWVBZnRlcjsKICAgIH0KICAgIHJldHVybiB0YWdPcGVuQmV0d2Vlbihjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZUJlZm9yZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA2MCB8fCBjb2RlNCA9PT0gNjEgfHwgY29kZTQgPT09IDYyIHx8IGNvZGU0ID09PSA5NikgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gMzQgfHwgY29kZTQgPT09IDM5KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIG1hcmtlciA9IGNvZGU0OwogICAgICByZXR1cm4gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlUXVvdGVkOwogICAgfQogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuU3RhdGUgPSB0YWdPcGVuQXR0cmlidXRlVmFsdWVCZWZvcmU7CiAgICAgIHJldHVybiBsaW5lRW5kaW5nQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlQmVmb3JlOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlVmFsdWVVbnF1b3RlZDsKICB9CiAgZnVuY3Rpb24gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlUXVvdGVkKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG1hcmtlcikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBtYXJrZXIgPSB2b2lkIDA7CiAgICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlVmFsdWVRdW90ZWRBZnRlcjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVyblN0YXRlID0gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlUXVvdGVkOwogICAgICByZXR1cm4gbGluZUVuZGluZ0JlZm9yZShjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVF1b3RlZDsKICB9CiAgZnVuY3Rpb24gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlVW5xdW90ZWQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gMzQgfHwgY29kZTQgPT09IDM5IHx8IGNvZGU0ID09PSA2MCB8fCBjb2RlNCA9PT0gNjEgfHwgY29kZTQgPT09IDk2KSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0NyB8fCBjb2RlNCA9PT0gNjIgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIHRhZ09wZW5CZXR3ZWVuKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlVW5xdW90ZWQ7CiAgfQogIGZ1bmN0aW9uIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVF1b3RlZEFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ3IHx8IGNvZGU0ID09PSA2MiB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gdGFnT3BlbkJldHdlZW4oY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGVuZDMoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNjIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJodG1sVGV4dERhdGEiKTsKICAgICAgZWZmZWN0cy5leGl0KCJodG1sVGV4dCIpOwogICAgICByZXR1cm4gb2szOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGxpbmVFbmRpbmdCZWZvcmUoY29kZTQpIHsKICAgIGVmZmVjdHMuZXhpdCgiaHRtbFRleHREYXRhIik7CiAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICByZXR1cm4gbGluZUVuZGluZ0FmdGVyOwogIH0KICBmdW5jdGlvbiBsaW5lRW5kaW5nQWZ0ZXIoY29kZTQpIHsKICAgIHJldHVybiBtYXJrZG93blNwYWNlKGNvZGU0KSA/IGZhY3RvcnlTcGFjZShlZmZlY3RzLCBsaW5lRW5kaW5nQWZ0ZXJQcmVmaXgsICJsaW5lUHJlZml4Iiwgc2VsZjIucGFyc2VyLmNvbnN0cnVjdHMuZGlzYWJsZS5udWxsLmluY2x1ZGVzKCJjb2RlSW5kZW50ZWQiKSA/IHZvaWQgMCA6IDQpKGNvZGU0KSA6IGxpbmVFbmRpbmdBZnRlclByZWZpeChjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGxpbmVFbmRpbmdBZnRlclByZWZpeChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiaHRtbFRleHREYXRhIik7CiAgICByZXR1cm4gcmV0dXJuU3RhdGUoY29kZTQpOwogIH0KfQp2YXIgaHRtbFRleHQ7CnZhciBpbml0X2h0bWxfdGV4dCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2h0bWwtdGV4dC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X3NwYWNlKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogICAgaHRtbFRleHQgPSB7CiAgICAgIG5hbWU6ICJodG1sVGV4dCIsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZUh0bWxUZXh0CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvbGFiZWwtZW5kLmpzCmZ1bmN0aW9uIHJlc29sdmVBbGxMYWJlbEVuZChldmVudHMpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgY29uc3QgbmV3RXZlbnRzID0gW107CiAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgY29uc3QgdG9rZW4gPSBldmVudHNbaW5kZXgyXVsxXTsKICAgIG5ld0V2ZW50cy5wdXNoKGV2ZW50c1tpbmRleDJdKTsKICAgIGlmICh0b2tlbi50eXBlID09PSAibGFiZWxJbWFnZSIgfHwgdG9rZW4udHlwZSA9PT0gImxhYmVsTGluayIgfHwgdG9rZW4udHlwZSA9PT0gImxhYmVsRW5kIikgewogICAgICBjb25zdCBvZmZzZXQgPSB0b2tlbi50eXBlID09PSAibGFiZWxJbWFnZSIgPyA0IDogMjsKICAgICAgdG9rZW4udHlwZSA9ICJkYXRhIjsKICAgICAgaW5kZXgyICs9IG9mZnNldDsKICAgIH0KICB9CiAgaWYgKGV2ZW50cy5sZW5ndGggIT09IG5ld0V2ZW50cy5sZW5ndGgpIHsKICAgIHNwbGljZShldmVudHMsIDAsIGV2ZW50cy5sZW5ndGgsIG5ld0V2ZW50cyk7CiAgfQogIHJldHVybiBldmVudHM7Cn0KZnVuY3Rpb24gcmVzb2x2ZVRvTGFiZWxFbmQoZXZlbnRzLCBjb250ZXh0MikgewogIGxldCBpbmRleDIgPSBldmVudHMubGVuZ3RoOwogIGxldCBvZmZzZXQgPSAwOwogIGxldCB0b2tlbjsKICBsZXQgb3BlbjsKICBsZXQgY2xvc2U3OwogIGxldCBtZWRpYTsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIHRva2VuID0gZXZlbnRzW2luZGV4Ml1bMV07CiAgICBpZiAob3BlbikgewogICAgICBpZiAodG9rZW4udHlwZSA9PT0gImxpbmsiIHx8IHRva2VuLnR5cGUgPT09ICJsYWJlbExpbmsiICYmIHRva2VuLl9pbmFjdGl2ZSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChldmVudHNbaW5kZXgyXVswXSA9PT0gImVudGVyIiAmJiB0b2tlbi50eXBlID09PSAibGFiZWxMaW5rIikgewogICAgICAgIHRva2VuLl9pbmFjdGl2ZSA9IHRydWU7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY2xvc2U3KSB7CiAgICAgIGlmIChldmVudHNbaW5kZXgyXVswXSA9PT0gImVudGVyIiAmJiAodG9rZW4udHlwZSA9PT0gImxhYmVsSW1hZ2UiIHx8IHRva2VuLnR5cGUgPT09ICJsYWJlbExpbmsiKSAmJiAhdG9rZW4uX2JhbGFuY2VkKSB7CiAgICAgICAgb3BlbiA9IGluZGV4MjsKICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gImxhYmVsTGluayIpIHsKICAgICAgICAgIG9mZnNldCA9IDI7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gImxhYmVsRW5kIikgewogICAgICBjbG9zZTcgPSBpbmRleDI7CiAgICB9CiAgfQogIGNvbnN0IGdyb3VwID0gewogICAgdHlwZTogZXZlbnRzW29wZW5dWzFdLnR5cGUgPT09ICJsYWJlbExpbmsiID8gImxpbmsiIDogImltYWdlIiwKICAgIHN0YXJ0OiB7CiAgICAgIC4uLmV2ZW50c1tvcGVuXVsxXS5zdGFydAogICAgfSwKICAgIGVuZDogewogICAgICAuLi5ldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdWzFdLmVuZAogICAgfQogIH07CiAgY29uc3QgbGFiZWwgPSB7CiAgICB0eXBlOiAibGFiZWwiLAogICAgc3RhcnQ6IHsKICAgICAgLi4uZXZlbnRzW29wZW5dWzFdLnN0YXJ0CiAgICB9LAogICAgZW5kOiB7CiAgICAgIC4uLmV2ZW50c1tjbG9zZTddWzFdLmVuZAogICAgfQogIH07CiAgY29uc3QgdGV4dDkgPSB7CiAgICB0eXBlOiAibGFiZWxUZXh0IiwKICAgIHN0YXJ0OiB7CiAgICAgIC4uLmV2ZW50c1tvcGVuICsgb2Zmc2V0ICsgMl1bMV0uZW5kCiAgICB9LAogICAgZW5kOiB7CiAgICAgIC4uLmV2ZW50c1tjbG9zZTcgLSAyXVsxXS5zdGFydAogICAgfQogIH07CiAgbWVkaWEgPSBbWyJlbnRlciIsIGdyb3VwLCBjb250ZXh0Ml0sIFsiZW50ZXIiLCBsYWJlbCwgY29udGV4dDJdXTsKICBtZWRpYSA9IHB1c2gobWVkaWEsIGV2ZW50cy5zbGljZShvcGVuICsgMSwgb3BlbiArIG9mZnNldCArIDMpKTsKICBtZWRpYSA9IHB1c2gobWVkaWEsIFtbImVudGVyIiwgdGV4dDksIGNvbnRleHQyXV0pOwogIG1lZGlhID0gcHVzaChtZWRpYSwgcmVzb2x2ZUFsbChjb250ZXh0Mi5wYXJzZXIuY29uc3RydWN0cy5pbnNpZGVTcGFuLm51bGwsIGV2ZW50cy5zbGljZShvcGVuICsgb2Zmc2V0ICsgNCwgY2xvc2U3IC0gMyksIGNvbnRleHQyKSk7CiAgbWVkaWEgPSBwdXNoKG1lZGlhLCBbWyJleGl0IiwgdGV4dDksIGNvbnRleHQyXSwgZXZlbnRzW2Nsb3NlNyAtIDJdLCBldmVudHNbY2xvc2U3IC0gMV0sIFsiZXhpdCIsIGxhYmVsLCBjb250ZXh0Ml1dKTsKICBtZWRpYSA9IHB1c2gobWVkaWEsIGV2ZW50cy5zbGljZShjbG9zZTcgKyAxKSk7CiAgbWVkaWEgPSBwdXNoKG1lZGlhLCBbWyJleGl0IiwgZ3JvdXAsIGNvbnRleHQyXV0pOwogIHNwbGljZShldmVudHMsIG9wZW4sIGV2ZW50cy5sZW5ndGgsIG1lZGlhKTsKICByZXR1cm4gZXZlbnRzOwp9CmZ1bmN0aW9uIHRva2VuaXplTGFiZWxFbmQoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IGluZGV4MiA9IHNlbGYyLmV2ZW50cy5sZW5ndGg7CiAgbGV0IGxhYmVsU3RhcnQ7CiAgbGV0IGRlZmluZWQ7CiAgd2hpbGUgKGluZGV4Mi0tKSB7CiAgICBpZiAoKHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJsYWJlbEltYWdlIiB8fCBzZWxmMi5ldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAibGFiZWxMaW5rIikgJiYgIXNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLl9iYWxhbmNlZCkgewogICAgICBsYWJlbFN0YXJ0ID0gc2VsZjIuZXZlbnRzW2luZGV4Ml1bMV07CiAgICAgIGJyZWFrOwogICAgfQogIH0KICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGlmICghbGFiZWxTdGFydCkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGlmIChsYWJlbFN0YXJ0Ll9pbmFjdGl2ZSkgewogICAgICByZXR1cm4gbGFiZWxFbmROb2soY29kZTQpOwogICAgfQogICAgZGVmaW5lZCA9IHNlbGYyLnBhcnNlci5kZWZpbmVkLmluY2x1ZGVzKG5vcm1hbGl6ZUlkZW50aWZpZXIoc2VsZjIuc2xpY2VTZXJpYWxpemUoewogICAgICBzdGFydDogbGFiZWxTdGFydC5lbmQsCiAgICAgIGVuZDogc2VsZjIubm93KCkKICAgIH0pKSk7CiAgICBlZmZlY3RzLmVudGVyKCJsYWJlbEVuZCIpOwogICAgZWZmZWN0cy5lbnRlcigibGFiZWxNYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxhYmVsTWFya2VyIik7CiAgICBlZmZlY3RzLmV4aXQoImxhYmVsRW5kIik7CiAgICByZXR1cm4gYWZ0ZXI7CiAgfQogIGZ1bmN0aW9uIGFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQwKSB7CiAgICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQocmVzb3VyY2VDb25zdHJ1Y3QsIGxhYmVsRW5kT2ssIGRlZmluZWQgPyBsYWJlbEVuZE9rIDogbGFiZWxFbmROb2spKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gOTEpIHsKICAgICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChyZWZlcmVuY2VGdWxsQ29uc3RydWN0LCBsYWJlbEVuZE9rLCBkZWZpbmVkID8gcmVmZXJlbmNlTm90RnVsbCA6IGxhYmVsRW5kTm9rKShjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gZGVmaW5lZCA/IGxhYmVsRW5kT2soY29kZTQpIDogbGFiZWxFbmROb2soY29kZTQpOwogIH0KICBmdW5jdGlvbiByZWZlcmVuY2VOb3RGdWxsKGNvZGU0KSB7CiAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KHJlZmVyZW5jZUNvbGxhcHNlZENvbnN0cnVjdCwgbGFiZWxFbmRPaywgbGFiZWxFbmROb2spKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gbGFiZWxFbmRPayhjb2RlNCkgewogICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGxhYmVsRW5kTm9rKGNvZGU0KSB7CiAgICBsYWJlbFN0YXJ0Ll9iYWxhbmNlZCA9IHRydWU7CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVSZXNvdXJjZShlZmZlY3RzLCBvazMsIG5vaykgewogIHJldHVybiByZXNvdXJjZVN0YXJ0OwogIGZ1bmN0aW9uIHJlc291cmNlU3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoInJlc291cmNlIik7CiAgICBlZmZlY3RzLmVudGVyKCJyZXNvdXJjZU1hcmtlciIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgicmVzb3VyY2VNYXJrZXIiKTsKICAgIHJldHVybiByZXNvdXJjZUJlZm9yZTsKICB9CiAgZnVuY3Rpb24gcmVzb3VyY2VCZWZvcmUoY29kZTQpIHsKICAgIHJldHVybiBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSA/IGZhY3RvcnlXaGl0ZXNwYWNlKGVmZmVjdHMsIHJlc291cmNlT3BlbikoY29kZTQpIDogcmVzb3VyY2VPcGVuKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gcmVzb3VyY2VPcGVuKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQxKSB7CiAgICAgIHJldHVybiByZXNvdXJjZUVuZChjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gZmFjdG9yeURlc3RpbmF0aW9uKGVmZmVjdHMsIHJlc291cmNlRGVzdGluYXRpb25BZnRlciwgcmVzb3VyY2VEZXN0aW5hdGlvbk1pc3NpbmcsICJyZXNvdXJjZURlc3RpbmF0aW9uIiwgInJlc291cmNlRGVzdGluYXRpb25MaXRlcmFsIiwgInJlc291cmNlRGVzdGluYXRpb25MaXRlcmFsTWFya2VyIiwgInJlc291cmNlRGVzdGluYXRpb25SYXciLCAicmVzb3VyY2VEZXN0aW5hdGlvblN0cmluZyIsIDMyKShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHJlc291cmNlRGVzdGluYXRpb25BZnRlcihjb2RlNCkgewogICAgcmV0dXJuIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpID8gZmFjdG9yeVdoaXRlc3BhY2UoZWZmZWN0cywgcmVzb3VyY2VCZXR3ZWVuKShjb2RlNCkgOiByZXNvdXJjZUVuZChjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHJlc291cmNlRGVzdGluYXRpb25NaXNzaW5nKGNvZGU0KSB7CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gcmVzb3VyY2VCZXR3ZWVuKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDM0IHx8IGNvZGU0ID09PSAzOSB8fCBjb2RlNCA9PT0gNDApIHsKICAgICAgcmV0dXJuIGZhY3RvcnlUaXRsZShlZmZlY3RzLCByZXNvdXJjZVRpdGxlQWZ0ZXIsIG5vaywgInJlc291cmNlVGl0bGUiLCAicmVzb3VyY2VUaXRsZU1hcmtlciIsICJyZXNvdXJjZVRpdGxlU3RyaW5nIikoY29kZTQpOwogICAgfQogICAgcmV0dXJuIHJlc291cmNlRW5kKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gcmVzb3VyY2VUaXRsZUFmdGVyKGNvZGU0KSB7CiAgICByZXR1cm4gbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkgPyBmYWN0b3J5V2hpdGVzcGFjZShlZmZlY3RzLCByZXNvdXJjZUVuZCkoY29kZTQpIDogcmVzb3VyY2VFbmQoY29kZTQpOwogIH0KICBmdW5jdGlvbiByZXNvdXJjZUVuZChjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0MSkgewogICAgICBlZmZlY3RzLmVudGVyKCJyZXNvdXJjZU1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInJlc291cmNlTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZXhpdCgicmVzb3VyY2UiKTsKICAgICAgcmV0dXJuIG9rMzsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KfQpmdW5jdGlvbiB0b2tlbml6ZVJlZmVyZW5jZUZ1bGwoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIHJlZmVyZW5jZUZ1bGw7CiAgZnVuY3Rpb24gcmVmZXJlbmNlRnVsbChjb2RlNCkgewogICAgcmV0dXJuIGZhY3RvcnlMYWJlbC5jYWxsKHNlbGYyLCBlZmZlY3RzLCByZWZlcmVuY2VGdWxsQWZ0ZXIsIHJlZmVyZW5jZUZ1bGxNaXNzaW5nLCAicmVmZXJlbmNlIiwgInJlZmVyZW5jZU1hcmtlciIsICJyZWZlcmVuY2VTdHJpbmciKShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHJlZmVyZW5jZUZ1bGxBZnRlcihjb2RlNCkgewogICAgcmV0dXJuIHNlbGYyLnBhcnNlci5kZWZpbmVkLmluY2x1ZGVzKG5vcm1hbGl6ZUlkZW50aWZpZXIoc2VsZjIuc2xpY2VTZXJpYWxpemUoc2VsZjIuZXZlbnRzW3NlbGYyLmV2ZW50cy5sZW5ndGggLSAxXVsxXSkuc2xpY2UoMSwgLTEpKSkgPyBvazMoY29kZTQpIDogbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gcmVmZXJlbmNlRnVsbE1pc3NpbmcoY29kZTQpIHsKICAgIHJldHVybiBub2soY29kZTQpOwogIH0KfQpmdW5jdGlvbiB0b2tlbml6ZVJlZmVyZW5jZUNvbGxhcHNlZChlZmZlY3RzLCBvazMsIG5vaykgewogIHJldHVybiByZWZlcmVuY2VDb2xsYXBzZWRTdGFydDsKICBmdW5jdGlvbiByZWZlcmVuY2VDb2xsYXBzZWRTdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigicmVmZXJlbmNlIik7CiAgICBlZmZlY3RzLmVudGVyKCJyZWZlcmVuY2VNYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoInJlZmVyZW5jZU1hcmtlciIpOwogICAgcmV0dXJuIHJlZmVyZW5jZUNvbGxhcHNlZE9wZW47CiAgfQogIGZ1bmN0aW9uIHJlZmVyZW5jZUNvbGxhcHNlZE9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5lbnRlcigicmVmZXJlbmNlTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgicmVmZXJlbmNlTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZXhpdCgicmVmZXJlbmNlIik7CiAgICAgIHJldHVybiBvazM7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9Cn0KdmFyIGxhYmVsRW5kLCByZXNvdXJjZUNvbnN0cnVjdCwgcmVmZXJlbmNlRnVsbENvbnN0cnVjdCwgcmVmZXJlbmNlQ29sbGFwc2VkQ29uc3RydWN0Owp2YXIgaW5pdF9sYWJlbF9lbmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9sYWJlbC1lbmQuanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9kZXN0aW5hdGlvbigpOwogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9sYWJlbCgpOwogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV90aXRsZSgpOwogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV93aGl0ZXNwYWNlKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaHVua2VkKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX25vcm1hbGl6ZV9pZGVudGlmaWVyKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX3Jlc29sdmVfYWxsKCk7CiAgICBsYWJlbEVuZCA9IHsKICAgICAgbmFtZTogImxhYmVsRW5kIiwKICAgICAgcmVzb2x2ZUFsbDogcmVzb2x2ZUFsbExhYmVsRW5kLAogICAgICByZXNvbHZlVG86IHJlc29sdmVUb0xhYmVsRW5kLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVMYWJlbEVuZAogICAgfTsKICAgIHJlc291cmNlQ29uc3RydWN0ID0gewogICAgICB0b2tlbml6ZTogdG9rZW5pemVSZXNvdXJjZQogICAgfTsKICAgIHJlZmVyZW5jZUZ1bGxDb25zdHJ1Y3QgPSB7CiAgICAgIHRva2VuaXplOiB0b2tlbml6ZVJlZmVyZW5jZUZ1bGwKICAgIH07CiAgICByZWZlcmVuY2VDb2xsYXBzZWRDb25zdHJ1Y3QgPSB7CiAgICAgIHRva2VuaXplOiB0b2tlbml6ZVJlZmVyZW5jZUNvbGxhcHNlZAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2xhYmVsLXN0YXJ0LWltYWdlLmpzCmZ1bmN0aW9uIHRva2VuaXplTGFiZWxTdGFydEltYWdlKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigibGFiZWxJbWFnZSIpOwogICAgZWZmZWN0cy5lbnRlcigibGFiZWxJbWFnZU1hcmtlciIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGFiZWxJbWFnZU1hcmtlciIpOwogICAgcmV0dXJuIG9wZW47CiAgfQogIGZ1bmN0aW9uIG9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTEpIHsKICAgICAgZWZmZWN0cy5lbnRlcigibGFiZWxNYXJrZXIiKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJsYWJlbE1hcmtlciIpOwogICAgICBlZmZlY3RzLmV4aXQoImxhYmVsSW1hZ2UiKTsKICAgICAgcmV0dXJuIGFmdGVyOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGFmdGVyKGNvZGU0KSB7CiAgICByZXR1cm4gY29kZTQgPT09IDk0ICYmICJfaGlkZGVuRm9vdG5vdGVTdXBwb3J0IiBpbiBzZWxmMi5wYXJzZXIuY29uc3RydWN0cyA/IG5vayhjb2RlNCkgOiBvazMoY29kZTQpOwogIH0KfQp2YXIgbGFiZWxTdGFydEltYWdlOwp2YXIgaW5pdF9sYWJlbF9zdGFydF9pbWFnZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2xhYmVsLXN0YXJ0LWltYWdlLmpzIigpIHsKICAgIGluaXRfbGFiZWxfZW5kKCk7CiAgICBsYWJlbFN0YXJ0SW1hZ2UgPSB7CiAgICAgIG5hbWU6ICJsYWJlbFN0YXJ0SW1hZ2UiLAogICAgICByZXNvbHZlQWxsOiBsYWJlbEVuZC5yZXNvbHZlQWxsLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVMYWJlbFN0YXJ0SW1hZ2UKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9sYWJlbC1zdGFydC1saW5rLmpzCmZ1bmN0aW9uIHRva2VuaXplTGFiZWxTdGFydExpbmsoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJsYWJlbExpbmsiKTsKICAgIGVmZmVjdHMuZW50ZXIoImxhYmVsTWFya2VyIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJsYWJlbE1hcmtlciIpOwogICAgZWZmZWN0cy5leGl0KCJsYWJlbExpbmsiKTsKICAgIHJldHVybiBhZnRlcjsKICB9CiAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgIHJldHVybiBjb2RlNCA9PT0gOTQgJiYgIl9oaWRkZW5Gb290bm90ZVN1cHBvcnQiIGluIHNlbGYyLnBhcnNlci5jb25zdHJ1Y3RzID8gbm9rKGNvZGU0KSA6IG9rMyhjb2RlNCk7CiAgfQp9CnZhciBsYWJlbFN0YXJ0TGluazsKdmFyIGluaXRfbGFiZWxfc3RhcnRfbGluayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2xhYmVsLXN0YXJ0LWxpbmsuanMiKCkgewogICAgaW5pdF9sYWJlbF9lbmQoKTsKICAgIGxhYmVsU3RhcnRMaW5rID0gewogICAgICBuYW1lOiAibGFiZWxTdGFydExpbmsiLAogICAgICByZXNvbHZlQWxsOiBsYWJlbEVuZC5yZXNvbHZlQWxsLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVMYWJlbFN0YXJ0TGluawogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2xpbmUtZW5kaW5nLmpzCmZ1bmN0aW9uIHRva2VuaXplTGluZUVuZGluZyhlZmZlY3RzLCBvazMpIHsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgb2szLCAibGluZVByZWZpeCIpOwogIH0KfQp2YXIgbGluZUVuZGluZzsKdmFyIGluaXRfbGluZV9lbmRpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9saW5lLWVuZGluZy5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X3NwYWNlKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogICAgbGluZUVuZGluZyA9IHsKICAgICAgbmFtZTogImxpbmVFbmRpbmciLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVMaW5lRW5kaW5nCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvdGhlbWF0aWMtYnJlYWsuanMKZnVuY3Rpb24gdG9rZW5pemVUaGVtYXRpY0JyZWFrKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgbGV0IHNpemUgPSAwOwogIGxldCBtYXJrZXI7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJ0aGVtYXRpY0JyZWFrIik7CiAgICByZXR1cm4gYmVmb3JlKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYmVmb3JlKGNvZGU0KSB7CiAgICBtYXJrZXIgPSBjb2RlNDsKICAgIHJldHVybiBhdEJyZWFrKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYXRCcmVhayhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBtYXJrZXIpIHsKICAgICAgZWZmZWN0cy5lbnRlcigidGhlbWF0aWNCcmVha1NlcXVlbmNlIik7CiAgICAgIHJldHVybiBzZXF1ZW5jZShjb2RlNCk7CiAgICB9CiAgICBpZiAoc2l6ZSA+PSAzICYmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSkgewogICAgICBlZmZlY3RzLmV4aXQoInRoZW1hdGljQnJlYWsiKTsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gc2VxdWVuY2UoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbWFya2VyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHNpemUrKzsKICAgICAgcmV0dXJuIHNlcXVlbmNlOwogICAgfQogICAgZWZmZWN0cy5leGl0KCJ0aGVtYXRpY0JyZWFrU2VxdWVuY2UiKTsKICAgIHJldHVybiBtYXJrZG93blNwYWNlKGNvZGU0KSA/IGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhdEJyZWFrLCAid2hpdGVzcGFjZSIpKGNvZGU0KSA6IGF0QnJlYWsoY29kZTQpOwogIH0KfQp2YXIgdGhlbWF0aWNCcmVhazI7CnZhciBpbml0X3RoZW1hdGljX2JyZWFrMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL3RoZW1hdGljLWJyZWFrLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX2ZhY3Rvcnlfc3BhY2UoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgICB0aGVtYXRpY0JyZWFrMiA9IHsKICAgICAgbmFtZTogInRoZW1hdGljQnJlYWsiLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVUaGVtYXRpY0JyZWFrCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvbGlzdC5qcwpmdW5jdGlvbiB0b2tlbml6ZUxpc3RTdGFydChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBjb25zdCB0YWlsID0gc2VsZjIuZXZlbnRzW3NlbGYyLmV2ZW50cy5sZW5ndGggLSAxXTsKICBsZXQgaW5pdGlhbFNpemUgPSB0YWlsICYmIHRhaWxbMV0udHlwZSA9PT0gImxpbmVQcmVmaXgiID8gdGFpbFsyXS5zbGljZVNlcmlhbGl6ZSh0YWlsWzFdLCB0cnVlKS5sZW5ndGggOiAwOwogIGxldCBzaXplID0gMDsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGNvbnN0IGtpbmQgPSBzZWxmMi5jb250YWluZXJTdGF0ZS50eXBlIHx8IChjb2RlNCA9PT0gNDIgfHwgY29kZTQgPT09IDQzIHx8IGNvZGU0ID09PSA0NSA/ICJsaXN0VW5vcmRlcmVkIiA6ICJsaXN0T3JkZXJlZCIpOwogICAgaWYgKGtpbmQgPT09ICJsaXN0VW5vcmRlcmVkIiA/ICFzZWxmMi5jb250YWluZXJTdGF0ZS5tYXJrZXIgfHwgY29kZTQgPT09IHNlbGYyLmNvbnRhaW5lclN0YXRlLm1hcmtlciA6IGFzY2lpRGlnaXQoY29kZTQpKSB7CiAgICAgIGlmICghc2VsZjIuY29udGFpbmVyU3RhdGUudHlwZSkgewogICAgICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlLnR5cGUgPSBraW5kOwogICAgICAgIGVmZmVjdHMuZW50ZXIoa2luZCwgewogICAgICAgICAgX2NvbnRhaW5lcjogdHJ1ZQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGlmIChraW5kID09PSAibGlzdFVub3JkZXJlZCIpIHsKICAgICAgICBlZmZlY3RzLmVudGVyKCJsaXN0SXRlbVByZWZpeCIpOwogICAgICAgIHJldHVybiBjb2RlNCA9PT0gNDIgfHwgY29kZTQgPT09IDQ1ID8gZWZmZWN0cy5jaGVjayh0aGVtYXRpY0JyZWFrMiwgbm9rLCBhdE1hcmtlcikoY29kZTQpIDogYXRNYXJrZXIoY29kZTQpOwogICAgICB9CiAgICAgIGlmICghc2VsZjIuaW50ZXJydXB0IHx8IGNvZGU0ID09PSA0OSkgewogICAgICAgIGVmZmVjdHMuZW50ZXIoImxpc3RJdGVtUHJlZml4Iik7CiAgICAgICAgZWZmZWN0cy5lbnRlcigibGlzdEl0ZW1WYWx1ZSIpOwogICAgICAgIHJldHVybiBpbnNpZGUoY29kZTQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gaW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoYXNjaWlEaWdpdChjb2RlNCkgJiYgKytzaXplIDwgMTApIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGluc2lkZTsKICAgIH0KICAgIGlmICgoIXNlbGYyLmludGVycnVwdCB8fCBzaXplIDwgMikgJiYgKHNlbGYyLmNvbnRhaW5lclN0YXRlLm1hcmtlciA/IGNvZGU0ID09PSBzZWxmMi5jb250YWluZXJTdGF0ZS5tYXJrZXIgOiBjb2RlNCA9PT0gNDEgfHwgY29kZTQgPT09IDQ2KSkgewogICAgICBlZmZlY3RzLmV4aXQoImxpc3RJdGVtVmFsdWUiKTsKICAgICAgcmV0dXJuIGF0TWFya2VyKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBhdE1hcmtlcihjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigibGlzdEl0ZW1NYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpc3RJdGVtTWFya2VyIik7CiAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5tYXJrZXIgPSBzZWxmMi5jb250YWluZXJTdGF0ZS5tYXJrZXIgfHwgY29kZTQ7CiAgICByZXR1cm4gZWZmZWN0cy5jaGVjaygKICAgICAgYmxhbmtMaW5lLAogICAgICAvLyBDYW7igJl0IGJlIGVtcHR5IHdoZW4gaW50ZXJydXB0aW5nLgogICAgICBzZWxmMi5pbnRlcnJ1cHQgPyBub2sgOiBvbkJsYW5rLAogICAgICBlZmZlY3RzLmF0dGVtcHQobGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlQ29uc3RydWN0LCBlbmRPZlByZWZpeCwgb3RoZXJQcmVmaXgpCiAgICApOwogIH0KICBmdW5jdGlvbiBvbkJsYW5rKGNvZGU0KSB7CiAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5pbml0aWFsQmxhbmtMaW5lID0gdHJ1ZTsKICAgIGluaXRpYWxTaXplKys7CiAgICByZXR1cm4gZW5kT2ZQcmVmaXgoY29kZTQpOwogIH0KICBmdW5jdGlvbiBvdGhlclByZWZpeChjb2RlNCkgewogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoImxpc3RJdGVtUHJlZml4V2hpdGVzcGFjZSIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImxpc3RJdGVtUHJlZml4V2hpdGVzcGFjZSIpOwogICAgICByZXR1cm4gZW5kT2ZQcmVmaXg7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gZW5kT2ZQcmVmaXgoY29kZTQpIHsKICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlLnNpemUgPSBpbml0aWFsU2l6ZSArIHNlbGYyLnNsaWNlU2VyaWFsaXplKGVmZmVjdHMuZXhpdCgibGlzdEl0ZW1QcmVmaXgiKSwgdHJ1ZSkubGVuZ3RoOwogICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgfQp9CmZ1bmN0aW9uIHRva2VuaXplTGlzdENvbnRpbnVhdGlvbihlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBzZWxmMi5jb250YWluZXJTdGF0ZS5fY2xvc2VGbG93ID0gdm9pZCAwOwogIHJldHVybiBlZmZlY3RzLmNoZWNrKGJsYW5rTGluZSwgb25CbGFuaywgbm90QmxhbmspOwogIGZ1bmN0aW9uIG9uQmxhbmsoY29kZTQpIHsKICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlLmZ1cnRoZXJCbGFua0xpbmVzID0gc2VsZjIuY29udGFpbmVyU3RhdGUuZnVydGhlckJsYW5rTGluZXMgfHwgc2VsZjIuY29udGFpbmVyU3RhdGUuaW5pdGlhbEJsYW5rTGluZTsKICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgb2szLCAibGlzdEl0ZW1JbmRlbnQiLCBzZWxmMi5jb250YWluZXJTdGF0ZS5zaXplICsgMSkoY29kZTQpOwogIH0KICBmdW5jdGlvbiBub3RCbGFuayhjb2RlNCkgewogICAgaWYgKHNlbGYyLmNvbnRhaW5lclN0YXRlLmZ1cnRoZXJCbGFua0xpbmVzIHx8ICFtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5mdXJ0aGVyQmxhbmtMaW5lcyA9IHZvaWQgMDsKICAgICAgc2VsZjIuY29udGFpbmVyU3RhdGUuaW5pdGlhbEJsYW5rTGluZSA9IHZvaWQgMDsKICAgICAgcmV0dXJuIG5vdEluQ3VycmVudEl0ZW0oY29kZTQpOwogICAgfQogICAgc2VsZjIuY29udGFpbmVyU3RhdGUuZnVydGhlckJsYW5rTGluZXMgPSB2b2lkIDA7CiAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5pbml0aWFsQmxhbmtMaW5lID0gdm9pZCAwOwogICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChpbmRlbnRDb25zdHJ1Y3QsIG9rMywgbm90SW5DdXJyZW50SXRlbSkoY29kZTQpOwogIH0KICBmdW5jdGlvbiBub3RJbkN1cnJlbnRJdGVtKGNvZGU0KSB7CiAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5fY2xvc2VGbG93ID0gdHJ1ZTsKICAgIHNlbGYyLmludGVycnVwdCA9IHZvaWQgMDsKICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgZWZmZWN0cy5hdHRlbXB0KGxpc3QzLCBvazMsIG5vayksICJsaW5lUHJlZml4Iiwgc2VsZjIucGFyc2VyLmNvbnN0cnVjdHMuZGlzYWJsZS5udWxsLmluY2x1ZGVzKCJjb2RlSW5kZW50ZWQiKSA/IHZvaWQgMCA6IDQpKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVJbmRlbnQoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlclByZWZpeCwgImxpc3RJdGVtSW5kZW50Iiwgc2VsZjIuY29udGFpbmVyU3RhdGUuc2l6ZSArIDEpOwogIGZ1bmN0aW9uIGFmdGVyUHJlZml4KGNvZGU0KSB7CiAgICBjb25zdCB0YWlsID0gc2VsZjIuZXZlbnRzW3NlbGYyLmV2ZW50cy5sZW5ndGggLSAxXTsKICAgIHJldHVybiB0YWlsICYmIHRhaWxbMV0udHlwZSA9PT0gImxpc3RJdGVtSW5kZW50IiAmJiB0YWlsWzJdLnNsaWNlU2VyaWFsaXplKHRhaWxbMV0sIHRydWUpLmxlbmd0aCA9PT0gc2VsZjIuY29udGFpbmVyU3RhdGUuc2l6ZSA/IG9rMyhjb2RlNCkgOiBub2soY29kZTQpOwogIH0KfQpmdW5jdGlvbiB0b2tlbml6ZUxpc3RFbmQoZWZmZWN0cykgewogIGVmZmVjdHMuZXhpdCh0aGlzLmNvbnRhaW5lclN0YXRlLnR5cGUpOwp9CmZ1bmN0aW9uIHRva2VuaXplTGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXJQcmVmaXgsICJsaXN0SXRlbVByZWZpeFdoaXRlc3BhY2UiLCBzZWxmMi5wYXJzZXIuY29uc3RydWN0cy5kaXNhYmxlLm51bGwuaW5jbHVkZXMoImNvZGVJbmRlbnRlZCIpID8gdm9pZCAwIDogNCArIDEpOwogIGZ1bmN0aW9uIGFmdGVyUHJlZml4KGNvZGU0KSB7CiAgICBjb25zdCB0YWlsID0gc2VsZjIuZXZlbnRzW3NlbGYyLmV2ZW50cy5sZW5ndGggLSAxXTsKICAgIHJldHVybiAhbWFya2Rvd25TcGFjZShjb2RlNCkgJiYgdGFpbCAmJiB0YWlsWzFdLnR5cGUgPT09ICJsaXN0SXRlbVByZWZpeFdoaXRlc3BhY2UiID8gb2szKGNvZGU0KSA6IG5vayhjb2RlNCk7CiAgfQp9CnZhciBsaXN0MywgbGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlQ29uc3RydWN0LCBpbmRlbnRDb25zdHJ1Y3Q7CnZhciBpbml0X2xpc3QyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvbGlzdC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X3NwYWNlKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogICAgaW5pdF9ibGFua19saW5lKCk7CiAgICBpbml0X3RoZW1hdGljX2JyZWFrMigpOwogICAgbGlzdDMgPSB7CiAgICAgIGNvbnRpbnVhdGlvbjogewogICAgICAgIHRva2VuaXplOiB0b2tlbml6ZUxpc3RDb250aW51YXRpb24KICAgICAgfSwKICAgICAgZXhpdDogdG9rZW5pemVMaXN0RW5kLAogICAgICBuYW1lOiAibGlzdCIsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZUxpc3RTdGFydAogICAgfTsKICAgIGxpc3RJdGVtUHJlZml4V2hpdGVzcGFjZUNvbnN0cnVjdCA9IHsKICAgICAgcGFydGlhbDogdHJ1ZSwKICAgICAgdG9rZW5pemU6IHRva2VuaXplTGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlCiAgICB9OwogICAgaW5kZW50Q29uc3RydWN0ID0gewogICAgICBwYXJ0aWFsOiB0cnVlLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVJbmRlbnQKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9zZXRleHQtdW5kZXJsaW5lLmpzCmZ1bmN0aW9uIHJlc29sdmVUb1NldGV4dFVuZGVybGluZShldmVudHMsIGNvbnRleHQyKSB7CiAgbGV0IGluZGV4MiA9IGV2ZW50cy5sZW5ndGg7CiAgbGV0IGNvbnRlbnQzOwogIGxldCB0ZXh0OTsKICBsZXQgZGVmaW5pdGlvbjM7CiAgd2hpbGUgKGluZGV4Mi0tKSB7CiAgICBpZiAoZXZlbnRzW2luZGV4Ml1bMF0gPT09ICJlbnRlciIpIHsKICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJjb250ZW50IikgewogICAgICAgIGNvbnRlbnQzID0gaW5kZXgyOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAicGFyYWdyYXBoIikgewogICAgICAgIHRleHQ5ID0gaW5kZXgyOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAoZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImNvbnRlbnQiKSB7CiAgICAgICAgZXZlbnRzLnNwbGljZShpbmRleDIsIDEpOwogICAgICB9CiAgICAgIGlmICghZGVmaW5pdGlvbjMgJiYgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImRlZmluaXRpb24iKSB7CiAgICAgICAgZGVmaW5pdGlvbjMgPSBpbmRleDI7CiAgICAgIH0KICAgIH0KICB9CiAgY29uc3QgaGVhZGluZzMgPSB7CiAgICB0eXBlOiAic2V0ZXh0SGVhZGluZyIsCiAgICBzdGFydDogewogICAgICAuLi5ldmVudHNbY29udGVudDNdWzFdLnN0YXJ0CiAgICB9LAogICAgZW5kOiB7CiAgICAgIC4uLmV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV1bMV0uZW5kCiAgICB9CiAgfTsKICBldmVudHNbdGV4dDldWzFdLnR5cGUgPSAic2V0ZXh0SGVhZGluZ1RleHQiOwogIGlmIChkZWZpbml0aW9uMykgewogICAgZXZlbnRzLnNwbGljZSh0ZXh0OSwgMCwgWyJlbnRlciIsIGhlYWRpbmczLCBjb250ZXh0Ml0pOwogICAgZXZlbnRzLnNwbGljZShkZWZpbml0aW9uMyArIDEsIDAsIFsiZXhpdCIsIGV2ZW50c1tjb250ZW50M11bMV0sIGNvbnRleHQyXSk7CiAgICBldmVudHNbY29udGVudDNdWzFdLmVuZCA9IHsKICAgICAgLi4uZXZlbnRzW2RlZmluaXRpb24zXVsxXS5lbmQKICAgIH07CiAgfSBlbHNlIHsKICAgIGV2ZW50c1tjb250ZW50M11bMV0gPSBoZWFkaW5nMzsKICB9CiAgZXZlbnRzLnB1c2goWyJleGl0IiwgaGVhZGluZzMsIGNvbnRleHQyXSk7CiAgcmV0dXJuIGV2ZW50czsKfQpmdW5jdGlvbiB0b2tlbml6ZVNldGV4dFVuZGVybGluZShlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBsZXQgbWFya2VyOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgbGV0IGluZGV4MiA9IHNlbGYyLmV2ZW50cy5sZW5ndGg7CiAgICBsZXQgcGFyYWdyYXBoMzsKICAgIHdoaWxlIChpbmRleDItLSkgewogICAgICBpZiAoc2VsZjIuZXZlbnRzW2luZGV4Ml1bMV0udHlwZSAhPT0gImxpbmVFbmRpbmciICYmIHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLnR5cGUgIT09ICJsaW5lUHJlZml4IiAmJiBzZWxmMi5ldmVudHNbaW5kZXgyXVsxXS50eXBlICE9PSAiY29udGVudCIpIHsKICAgICAgICBwYXJhZ3JhcGgzID0gc2VsZjIuZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gInBhcmFncmFwaCI7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmICghc2VsZjIucGFyc2VyLmxhenlbc2VsZjIubm93KCkubGluZV0gJiYgKHNlbGYyLmludGVycnVwdCB8fCBwYXJhZ3JhcGgzKSkgewogICAgICBlZmZlY3RzLmVudGVyKCJzZXRleHRIZWFkaW5nTGluZSIpOwogICAgICBtYXJrZXIgPSBjb2RlNDsKICAgICAgcmV0dXJuIGJlZm9yZShjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYmVmb3JlKGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJzZXRleHRIZWFkaW5nTGluZVNlcXVlbmNlIik7CiAgICByZXR1cm4gaW5zaWRlKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gaW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG1hcmtlcikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gaW5zaWRlOwogICAgfQogICAgZWZmZWN0cy5leGl0KCJzZXRleHRIZWFkaW5nTGluZVNlcXVlbmNlIik7CiAgICByZXR1cm4gbWFya2Rvd25TcGFjZShjb2RlNCkgPyBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXIsICJsaW5lU3VmZml4IikoY29kZTQpIDogYWZ0ZXIoY29kZTQpOwogIH0KICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJzZXRleHRIZWFkaW5nTGluZSIpOwogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KfQp2YXIgc2V0ZXh0VW5kZXJsaW5lOwp2YXIgaW5pdF9zZXRleHRfdW5kZXJsaW5lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvc2V0ZXh0LXVuZGVybGluZS5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X3NwYWNlKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogICAgc2V0ZXh0VW5kZXJsaW5lID0gewogICAgICBuYW1lOiAic2V0ZXh0VW5kZXJsaW5lIiwKICAgICAgcmVzb2x2ZVRvOiByZXNvbHZlVG9TZXRleHRVbmRlcmxpbmUsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZVNldGV4dFVuZGVybGluZQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvaW5kZXguanMKdmFyIGluaXRfbWljcm9tYXJrX2NvcmVfY29tbW9ubWFyayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvaW5kZXguanMiKCkgewogICAgaW5pdF9hdHRlbnRpb24oKTsKICAgIGluaXRfYXV0b2xpbmsoKTsKICAgIGluaXRfYmxhbmtfbGluZSgpOwogICAgaW5pdF9ibG9ja19xdW90ZSgpOwogICAgaW5pdF9jaGFyYWN0ZXJfZXNjYXBlKCk7CiAgICBpbml0X2NoYXJhY3Rlcl9yZWZlcmVuY2UoKTsKICAgIGluaXRfY29kZV9mZW5jZWQoKTsKICAgIGluaXRfY29kZV9pbmRlbnRlZCgpOwogICAgaW5pdF9jb2RlX3RleHQoKTsKICAgIGluaXRfY29udGVudCgpOwogICAgaW5pdF9kZWZpbml0aW9uMigpOwogICAgaW5pdF9oYXJkX2JyZWFrX2VzY2FwZSgpOwogICAgaW5pdF9oZWFkaW5nX2F0eCgpOwogICAgaW5pdF9odG1sX2Zsb3coKTsKICAgIGluaXRfaHRtbF90ZXh0KCk7CiAgICBpbml0X2xhYmVsX2VuZCgpOwogICAgaW5pdF9sYWJlbF9zdGFydF9pbWFnZSgpOwogICAgaW5pdF9sYWJlbF9zdGFydF9saW5rKCk7CiAgICBpbml0X2xpbmVfZW5kaW5nKCk7CiAgICBpbml0X2xpc3QyKCk7CiAgICBpbml0X3NldGV4dF91bmRlcmxpbmUoKTsKICAgIGluaXRfdGhlbWF0aWNfYnJlYWsyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1mb290bm90ZUAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tZm9vdG5vdGUvbGliL3N5bnRheC5qcwpmdW5jdGlvbiBnZm1Gb290bm90ZSgpIHsKICByZXR1cm4gewogICAgZG9jdW1lbnQ6IHsKICAgICAgWzkxXTogewogICAgICAgIG5hbWU6ICJnZm1Gb290bm90ZURlZmluaXRpb24iLAogICAgICAgIHRva2VuaXplOiB0b2tlbml6ZURlZmluaXRpb25TdGFydCwKICAgICAgICBjb250aW51YXRpb246IHsKICAgICAgICAgIHRva2VuaXplOiB0b2tlbml6ZURlZmluaXRpb25Db250aW51YXRpb24KICAgICAgICB9LAogICAgICAgIGV4aXQ6IGdmbUZvb3Rub3RlRGVmaW5pdGlvbkVuZAogICAgICB9CiAgICB9LAogICAgdGV4dDogewogICAgICBbOTFdOiB7CiAgICAgICAgbmFtZTogImdmbUZvb3Rub3RlQ2FsbCIsCiAgICAgICAgdG9rZW5pemU6IHRva2VuaXplR2ZtRm9vdG5vdGVDYWxsCiAgICAgIH0sCiAgICAgIFs5M106IHsKICAgICAgICBuYW1lOiAiZ2ZtUG90ZW50aWFsRm9vdG5vdGVDYWxsIiwKICAgICAgICBhZGQ6ICJhZnRlciIsCiAgICAgICAgdG9rZW5pemU6IHRva2VuaXplUG90ZW50aWFsR2ZtRm9vdG5vdGVDYWxsLAogICAgICAgIHJlc29sdmVUbzogcmVzb2x2ZVRvUG90ZW50aWFsR2ZtRm9vdG5vdGVDYWxsCiAgICAgIH0KICAgIH0KICB9Owp9CmZ1bmN0aW9uIHRva2VuaXplUG90ZW50aWFsR2ZtRm9vdG5vdGVDYWxsKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGxldCBpbmRleDIgPSBzZWxmMi5ldmVudHMubGVuZ3RoOwogIGNvbnN0IGRlZmluZWQgPSBzZWxmMi5wYXJzZXIuZ2ZtRm9vdG5vdGVzIHx8IChzZWxmMi5wYXJzZXIuZ2ZtRm9vdG5vdGVzID0gW10pOwogIGxldCBsYWJlbFN0YXJ0OwogIHdoaWxlIChpbmRleDItLSkgewogICAgY29uc3QgdG9rZW4gPSBzZWxmMi5ldmVudHNbaW5kZXgyXVsxXTsKICAgIGlmICh0b2tlbi50eXBlID09PSAibGFiZWxJbWFnZSIpIHsKICAgICAgbGFiZWxTdGFydCA9IHRva2VuOwogICAgICBicmVhazsKICAgIH0KICAgIGlmICh0b2tlbi50eXBlID09PSAiZ2ZtRm9vdG5vdGVDYWxsIiB8fCB0b2tlbi50eXBlID09PSAibGFiZWxMaW5rIiB8fCB0b2tlbi50eXBlID09PSAibGFiZWwiIHx8IHRva2VuLnR5cGUgPT09ICJpbWFnZSIgfHwgdG9rZW4udHlwZSA9PT0gImxpbmsiKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGlmICghbGFiZWxTdGFydCB8fCAhbGFiZWxTdGFydC5fYmFsYW5jZWQpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBjb25zdCBpZCA9IG5vcm1hbGl6ZUlkZW50aWZpZXIoc2VsZjIuc2xpY2VTZXJpYWxpemUoewogICAgICBzdGFydDogbGFiZWxTdGFydC5lbmQsCiAgICAgIGVuZDogc2VsZjIubm93KCkKICAgIH0pKTsKICAgIGlmIChpZC5jb2RlUG9pbnRBdCgwKSAhPT0gOTQgfHwgIWRlZmluZWQuaW5jbHVkZXMoaWQuc2xpY2UoMSkpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigiZ2ZtRm9vdG5vdGVDYWxsTGFiZWxNYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImdmbUZvb3Rub3RlQ2FsbExhYmVsTWFya2VyIik7CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gcmVzb2x2ZVRvUG90ZW50aWFsR2ZtRm9vdG5vdGVDYWxsKGV2ZW50cywgY29udGV4dDIpIHsKICBsZXQgaW5kZXgyID0gZXZlbnRzLmxlbmd0aDsKICBsZXQgbGFiZWxTdGFydDsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIGlmIChldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAibGFiZWxJbWFnZSIgJiYgZXZlbnRzW2luZGV4Ml1bMF0gPT09ICJlbnRlciIpIHsKICAgICAgbGFiZWxTdGFydCA9IGV2ZW50c1tpbmRleDJdWzFdOwogICAgICBicmVhazsKICAgIH0KICB9CiAgZXZlbnRzW2luZGV4MiArIDFdWzFdLnR5cGUgPSAiZGF0YSI7CiAgZXZlbnRzW2luZGV4MiArIDNdWzFdLnR5cGUgPSAiZ2ZtRm9vdG5vdGVDYWxsTGFiZWxNYXJrZXIiOwogIGNvbnN0IGNhbGwgPSB7CiAgICB0eXBlOiAiZ2ZtRm9vdG5vdGVDYWxsIiwKICAgIHN0YXJ0OiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbaW5kZXgyICsgM11bMV0uc3RhcnQpLAogICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdWzFdLmVuZCkKICB9OwogIGNvbnN0IG1hcmtlciA9IHsKICAgIHR5cGU6ICJnZm1Gb290bm90ZUNhbGxNYXJrZXIiLAogICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50c1tpbmRleDIgKyAzXVsxXS5lbmQpLAogICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbaW5kZXgyICsgM11bMV0uZW5kKQogIH07CiAgbWFya2VyLmVuZC5jb2x1bW4rKzsKICBtYXJrZXIuZW5kLm9mZnNldCsrOwogIG1hcmtlci5lbmQuX2J1ZmZlckluZGV4Kys7CiAgY29uc3Qgc3RyaW5nMyA9IHsKICAgIHR5cGU6ICJnZm1Gb290bm90ZUNhbGxTdHJpbmciLAogICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIG1hcmtlci5lbmQpLAogICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdWzFdLnN0YXJ0KQogIH07CiAgY29uc3QgY2h1bmsgPSB7CiAgICB0eXBlOiAiY2h1bmtTdHJpbmciLAogICAgY29udGVudFR5cGU6ICJzdHJpbmciLAogICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIHN0cmluZzMuc3RhcnQpLAogICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBzdHJpbmczLmVuZCkKICB9OwogIGNvbnN0IHJlcGxhY2VtZW50ID0gWwogICAgLy8gVGFrZSB0aGUgYGxhYmVsSW1hZ2VNYXJrZXJgIChub3cgYGRhdGFgLCB0aGUgYCFgKQogICAgZXZlbnRzW2luZGV4MiArIDFdLAogICAgZXZlbnRzW2luZGV4MiArIDJdLAogICAgWyJlbnRlciIsIGNhbGwsIGNvbnRleHQyXSwKICAgIC8vIFRoZSBgW2AKICAgIGV2ZW50c1tpbmRleDIgKyAzXSwKICAgIGV2ZW50c1tpbmRleDIgKyA0XSwKICAgIC8vIFRoZSBgXmAuCiAgICBbImVudGVyIiwgbWFya2VyLCBjb250ZXh0Ml0sCiAgICBbImV4aXQiLCBtYXJrZXIsIGNvbnRleHQyXSwKICAgIC8vIEV2ZXJ5dGhpbmcgaW4gYmV0d2Vlbi4KICAgIFsiZW50ZXIiLCBzdHJpbmczLCBjb250ZXh0Ml0sCiAgICBbImVudGVyIiwgY2h1bmssIGNvbnRleHQyXSwKICAgIFsiZXhpdCIsIGNodW5rLCBjb250ZXh0Ml0sCiAgICBbImV4aXQiLCBzdHJpbmczLCBjb250ZXh0Ml0sCiAgICAvLyBUaGUgZW5kaW5nIChgXWAsIHByb3Blcmx5IHBhcnNlZCBhbmQgbGFiZWxsZWQpLgogICAgZXZlbnRzW2V2ZW50cy5sZW5ndGggLSAyXSwKICAgIGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV0sCiAgICBbImV4aXQiLCBjYWxsLCBjb250ZXh0Ml0KICBdOwogIGV2ZW50cy5zcGxpY2UoaW5kZXgyLCBldmVudHMubGVuZ3RoIC0gaW5kZXgyICsgMSwgLi4ucmVwbGFjZW1lbnQpOwogIHJldHVybiBldmVudHM7Cn0KZnVuY3Rpb24gdG9rZW5pemVHZm1Gb290bm90ZUNhbGwoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgY29uc3QgZGVmaW5lZCA9IHNlbGYyLnBhcnNlci5nZm1Gb290bm90ZXMgfHwgKHNlbGYyLnBhcnNlci5nZm1Gb290bm90ZXMgPSBbXSk7CiAgbGV0IHNpemUgPSAwOwogIGxldCBkYXRhOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiZ2ZtRm9vdG5vdGVDYWxsIik7CiAgICBlZmZlY3RzLmVudGVyKCJnZm1Gb290bm90ZUNhbGxMYWJlbE1hcmtlciIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgiZ2ZtRm9vdG5vdGVDYWxsTGFiZWxNYXJrZXIiKTsKICAgIHJldHVybiBjYWxsU3RhcnQ7CiAgfQogIGZ1bmN0aW9uIGNhbGxTdGFydChjb2RlNCkgewogICAgaWYgKGNvZGU0ICE9PSA5NCkgcmV0dXJuIG5vayhjb2RlNCk7CiAgICBlZmZlY3RzLmVudGVyKCJnZm1Gb290bm90ZUNhbGxNYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImdmbUZvb3Rub3RlQ2FsbE1hcmtlciIpOwogICAgZWZmZWN0cy5lbnRlcigiZ2ZtRm9vdG5vdGVDYWxsU3RyaW5nIik7CiAgICBlZmZlY3RzLmVudGVyKCJjaHVua1N0cmluZyIpLmNvbnRlbnRUeXBlID0gInN0cmluZyI7CiAgICByZXR1cm4gY2FsbERhdGE7CiAgfQogIGZ1bmN0aW9uIGNhbGxEYXRhKGNvZGU0KSB7CiAgICBpZiAoCiAgICAgIC8vIFRvbyBsb25nLgogICAgICBzaXplID4gOTk5IHx8IC8vIENsb3NpbmcgYnJhY2Ugd2l0aCBub3RoaW5nLgogICAgICBjb2RlNCA9PT0gOTMgJiYgIWRhdGEgfHwgLy8gU3BhY2Ugb3IgdGFiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgR0ZNIGZvciBzb21lIHJlYXNvbi4KICAgICAgLy8gYFxuYCBhbmQgYFtgIG5vdCBiZWluZyBzdXBwb3J0ZWQgbWFrZXMgc2Vuc2UuCiAgICAgIGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA5MSB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KQogICAgKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rU3RyaW5nIik7CiAgICAgIGNvbnN0IHRva2VuID0gZWZmZWN0cy5leGl0KCJnZm1Gb290bm90ZUNhbGxTdHJpbmciKTsKICAgICAgaWYgKCFkZWZpbmVkLmluY2x1ZGVzKG5vcm1hbGl6ZUlkZW50aWZpZXIoc2VsZjIuc2xpY2VTZXJpYWxpemUodG9rZW4pKSkpIHsKICAgICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgICAgfQogICAgICBlZmZlY3RzLmVudGVyKCJnZm1Gb290bm90ZUNhbGxMYWJlbE1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImdmbUZvb3Rub3RlQ2FsbExhYmVsTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiZ2ZtRm9vdG5vdGVDYWxsIik7CiAgICAgIHJldHVybiBvazM7CiAgICB9CiAgICBpZiAoIW1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIGRhdGEgPSB0cnVlOwogICAgfQogICAgc2l6ZSsrOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb2RlNCA9PT0gOTIgPyBjYWxsRXNjYXBlIDogY2FsbERhdGE7CiAgfQogIGZ1bmN0aW9uIGNhbGxFc2NhcGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTEgfHwgY29kZTQgPT09IDkyIHx8IGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBzaXplKys7CiAgICAgIHJldHVybiBjYWxsRGF0YTsKICAgIH0KICAgIHJldHVybiBjYWxsRGF0YShjb2RlNCk7CiAgfQp9CmZ1bmN0aW9uIHRva2VuaXplRGVmaW5pdGlvblN0YXJ0KGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGNvbnN0IGRlZmluZWQgPSBzZWxmMi5wYXJzZXIuZ2ZtRm9vdG5vdGVzIHx8IChzZWxmMi5wYXJzZXIuZ2ZtRm9vdG5vdGVzID0gW10pOwogIGxldCBpZGVudGlmaWVyOwogIGxldCBzaXplID0gMDsKICBsZXQgZGF0YTsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImdmbUZvb3Rub3RlRGVmaW5pdGlvbiIpLl9jb250YWluZXIgPSB0cnVlOwogICAgZWZmZWN0cy5lbnRlcigiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uTGFiZWwiKTsKICAgIGVmZmVjdHMuZW50ZXIoImdmbUZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsTWFya2VyIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbE1hcmtlciIpOwogICAgcmV0dXJuIGxhYmVsQXRNYXJrZXI7CiAgfQogIGZ1bmN0aW9uIGxhYmVsQXRNYXJrZXIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTQpIHsKICAgICAgZWZmZWN0cy5lbnRlcigiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZW50ZXIoImdmbUZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsU3RyaW5nIik7CiAgICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIikuY29udGVudFR5cGUgPSAic3RyaW5nIjsKICAgICAgcmV0dXJuIGxhYmVsSW5zaWRlOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGxhYmVsSW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoCiAgICAgIC8vIFRvbyBsb25nLgogICAgICBzaXplID4gOTk5IHx8IC8vIENsb3NpbmcgYnJhY2Ugd2l0aCBub3RoaW5nLgogICAgICBjb2RlNCA9PT0gOTMgJiYgIWRhdGEgfHwgLy8gU3BhY2Ugb3IgdGFiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgR0ZNIGZvciBzb21lIHJlYXNvbi4KICAgICAgLy8gYFxuYCBhbmQgYFtgIG5vdCBiZWluZyBzdXBwb3J0ZWQgbWFrZXMgc2Vuc2UuCiAgICAgIGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA5MSB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KQogICAgKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rU3RyaW5nIik7CiAgICAgIGNvbnN0IHRva2VuID0gZWZmZWN0cy5leGl0KCJnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZyIpOwogICAgICBpZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcihzZWxmMi5zbGljZVNlcmlhbGl6ZSh0b2tlbikpOwogICAgICBlZmZlY3RzLmVudGVyKCJnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbE1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImdmbUZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uTGFiZWwiKTsKICAgICAgcmV0dXJuIGxhYmVsQWZ0ZXI7CiAgICB9CiAgICBpZiAoIW1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIGRhdGEgPSB0cnVlOwogICAgfQogICAgc2l6ZSsrOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb2RlNCA9PT0gOTIgPyBsYWJlbEVzY2FwZSA6IGxhYmVsSW5zaWRlOwogIH0KICBmdW5jdGlvbiBsYWJlbEVzY2FwZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA5MSB8fCBjb2RlNCA9PT0gOTIgfHwgY29kZTQgPT09IDkzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHNpemUrKzsKICAgICAgcmV0dXJuIGxhYmVsSW5zaWRlOwogICAgfQogICAgcmV0dXJuIGxhYmVsSW5zaWRlKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gbGFiZWxBZnRlcihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA1OCkgewogICAgICBlZmZlY3RzLmVudGVyKCJkZWZpbml0aW9uTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiZGVmaW5pdGlvbk1hcmtlciIpOwogICAgICBpZiAoIWRlZmluZWQuaW5jbHVkZXMoaWRlbnRpZmllcikpIHsKICAgICAgICBkZWZpbmVkLnB1c2goaWRlbnRpZmllcik7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCB3aGl0ZXNwYWNlQWZ0ZXIsICJnZm1Gb290bm90ZURlZmluaXRpb25XaGl0ZXNwYWNlIik7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gd2hpdGVzcGFjZUFmdGVyKGNvZGU0KSB7CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVEZWZpbml0aW9uQ29udGludWF0aW9uKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgcmV0dXJuIGVmZmVjdHMuY2hlY2soYmxhbmtMaW5lLCBvazMsIGVmZmVjdHMuYXR0ZW1wdChpbmRlbnQyLCBvazMsIG5vaykpOwp9CmZ1bmN0aW9uIGdmbUZvb3Rub3RlRGVmaW5pdGlvbkVuZChlZmZlY3RzKSB7CiAgZWZmZWN0cy5leGl0KCJnZm1Gb290bm90ZURlZmluaXRpb24iKTsKfQpmdW5jdGlvbiB0b2tlbml6ZUluZGVudDIoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlclByZWZpeCwgImdmbUZvb3Rub3RlRGVmaW5pdGlvbkluZGVudCIsIDQgKyAxKTsKICBmdW5jdGlvbiBhZnRlclByZWZpeChjb2RlNCkgewogICAgY29uc3QgdGFpbCA9IHNlbGYyLmV2ZW50c1tzZWxmMi5ldmVudHMubGVuZ3RoIC0gMV07CiAgICByZXR1cm4gdGFpbCAmJiB0YWlsWzFdLnR5cGUgPT09ICJnZm1Gb290bm90ZURlZmluaXRpb25JbmRlbnQiICYmIHRhaWxbMl0uc2xpY2VTZXJpYWxpemUodGFpbFsxXSwgdHJ1ZSkubGVuZ3RoID09PSA0ID8gb2szKGNvZGU0KSA6IG5vayhjb2RlNCk7CiAgfQp9CnZhciBpbmRlbnQyOwp2YXIgaW5pdF9zeW50YXgyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tZm9vdG5vdGVAMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLWZvb3Rub3RlL2xpYi9zeW50YXguanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfY29yZV9jb21tb25tYXJrKCk7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X3NwYWNlKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9ub3JtYWxpemVfaWRlbnRpZmllcigpOwogICAgaW5kZW50MiA9IHsKICAgICAgdG9rZW5pemU6IHRva2VuaXplSW5kZW50MiwKICAgICAgcGFydGlhbDogdHJ1ZQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLWZvb3Rub3RlQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1mb290bm90ZS9saWIvaHRtbC5qcwpmdW5jdGlvbiBkZWZhdWx0QmFja0xhYmVsKHJlZmVyZW5jZUluZGV4LCByZXJlZmVyZW5jZUluZGV4KSB7CiAgcmV0dXJuICJCYWNrIHRvIHJlZmVyZW5jZSAiICsgKHJlZmVyZW5jZUluZGV4ICsgMSkgKyAocmVyZWZlcmVuY2VJbmRleCA+IDEgPyAiLSIgKyByZXJlZmVyZW5jZUluZGV4IDogIiIpOwp9CmZ1bmN0aW9uIGdmbUZvb3Rub3RlSHRtbChvcHRpb25zKSB7CiAgY29uc3QgY29uZmlnMyA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zMjsKICBjb25zdCBsYWJlbCA9IGNvbmZpZzMubGFiZWwgfHwgIkZvb3Rub3RlcyI7CiAgY29uc3QgbGFiZWxUYWdOYW1lID0gY29uZmlnMy5sYWJlbFRhZ05hbWUgfHwgImgyIjsKICBjb25zdCBsYWJlbEF0dHJpYnV0ZXMgPSBjb25maWczLmxhYmVsQXR0cmlidXRlcyA9PT0gbnVsbCB8fCBjb25maWczLmxhYmVsQXR0cmlidXRlcyA9PT0gdm9pZCAwID8gJ2NsYXNzPSJzci1vbmx5IicgOiBjb25maWczLmxhYmVsQXR0cmlidXRlczsKICBjb25zdCBiYWNrTGFiZWwgPSBjb25maWczLmJhY2tMYWJlbCB8fCBkZWZhdWx0QmFja0xhYmVsOwogIGNvbnN0IGNsb2JiZXJQcmVmaXggPSBjb25maWczLmNsb2JiZXJQcmVmaXggPT09IG51bGwgfHwgY29uZmlnMy5jbG9iYmVyUHJlZml4ID09PSB2b2lkIDAgPyAidXNlci1jb250ZW50LSIgOiBjb25maWczLmNsb2JiZXJQcmVmaXg7CiAgcmV0dXJuIHsKICAgIGVudGVyOiB7CiAgICAgIGdmbUZvb3Rub3RlRGVmaW5pdGlvbigpIHsKICAgICAgICBjb25zdCBzdGFjayA9IHRoaXMuZ2V0RGF0YSgidGlnaHRTdGFjayIpOwogICAgICAgIHN0YWNrLnB1c2goZmFsc2UpOwogICAgICB9LAogICAgICBnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZygpIHsKICAgICAgICB0aGlzLmJ1ZmZlcigpOwogICAgICB9LAogICAgICBnZm1Gb290bm90ZUNhbGxTdHJpbmcoKSB7CiAgICAgICAgdGhpcy5idWZmZXIoKTsKICAgICAgfQogICAgfSwKICAgIGV4aXQ6IHsKICAgICAgZ2ZtRm9vdG5vdGVEZWZpbml0aW9uKCkgewogICAgICAgIGxldCBkZWZpbml0aW9ucyA9IHRoaXMuZ2V0RGF0YSgiZ2ZtRm9vdG5vdGVEZWZpbml0aW9ucyIpOwogICAgICAgIGNvbnN0IGZvb3Rub3RlU3RhY2sgPSB0aGlzLmdldERhdGEoImdmbUZvb3Rub3RlRGVmaW5pdGlvblN0YWNrIik7CiAgICAgICAgY29uc3QgdGlnaHRTdGFjayA9IHRoaXMuZ2V0RGF0YSgidGlnaHRTdGFjayIpOwogICAgICAgIGNvbnN0IGN1cnJlbnQgPSBmb290bm90ZVN0YWNrLnBvcCgpOwogICAgICAgIGNvbnN0IHZhbHVlMiA9IHRoaXMucmVzdW1lKCk7CiAgICAgICAgaWYgKCFkZWZpbml0aW9ucykgewogICAgICAgICAgdGhpcy5zZXREYXRhKCJnZm1Gb290bm90ZURlZmluaXRpb25zIiwgZGVmaW5pdGlvbnMgPSB7fSk7CiAgICAgICAgfQogICAgICAgIGlmICghb3duNC5jYWxsKGRlZmluaXRpb25zLCBjdXJyZW50KSkgZGVmaW5pdGlvbnNbY3VycmVudF0gPSB2YWx1ZTI7CiAgICAgICAgdGlnaHRTdGFjay5wb3AoKTsKICAgICAgICB0aGlzLnNldERhdGEoInNsdXJwT25lTGluZUVuZGluZyIsIHRydWUpOwogICAgICAgIHRoaXMuc2V0RGF0YSgibGFzdFdhc1RhZyIpOwogICAgICB9LAogICAgICBnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZyh0b2tlbikgewogICAgICAgIGxldCBmb290bm90ZVN0YWNrID0gdGhpcy5nZXREYXRhKCJnZm1Gb290bm90ZURlZmluaXRpb25TdGFjayIpOwogICAgICAgIGlmICghZm9vdG5vdGVTdGFjaykgewogICAgICAgICAgdGhpcy5zZXREYXRhKCJnZm1Gb290bm90ZURlZmluaXRpb25TdGFjayIsIGZvb3Rub3RlU3RhY2sgPSBbXSk7CiAgICAgICAgfQogICAgICAgIGZvb3Rub3RlU3RhY2sucHVzaChub3JtYWxpemVJZGVudGlmaWVyKHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pKSk7CiAgICAgICAgdGhpcy5yZXN1bWUoKTsKICAgICAgICB0aGlzLmJ1ZmZlcigpOwogICAgICB9LAogICAgICBnZm1Gb290bm90ZUNhbGxTdHJpbmcodG9rZW4pIHsKICAgICAgICBsZXQgY2FsbHMgPSB0aGlzLmdldERhdGEoImdmbUZvb3Rub3RlQ2FsbE9yZGVyIik7CiAgICAgICAgbGV0IGNvdW50cyA9IHRoaXMuZ2V0RGF0YSgiZ2ZtRm9vdG5vdGVDYWxsQ291bnRzIik7CiAgICAgICAgY29uc3QgaWQgPSBub3JtYWxpemVJZGVudGlmaWVyKHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pKTsKICAgICAgICBsZXQgY291bnRlcjI7CiAgICAgICAgdGhpcy5yZXN1bWUoKTsKICAgICAgICBpZiAoIWNhbGxzKSB0aGlzLnNldERhdGEoImdmbUZvb3Rub3RlQ2FsbE9yZGVyIiwgY2FsbHMgPSBbXSk7CiAgICAgICAgaWYgKCFjb3VudHMpIHRoaXMuc2V0RGF0YSgiZ2ZtRm9vdG5vdGVDYWxsQ291bnRzIiwgY291bnRzID0ge30pOwogICAgICAgIGNvbnN0IGluZGV4MiA9IGNhbGxzLmluZGV4T2YoaWQpOwogICAgICAgIGNvbnN0IHNhZmVJZCA9IHNhbml0aXplVXJpKGlkLnRvTG93ZXJDYXNlKCkpOwogICAgICAgIGlmIChpbmRleDIgPT09IC0xKSB7CiAgICAgICAgICBjYWxscy5wdXNoKGlkKTsKICAgICAgICAgIGNvdW50c1tpZF0gPSAxOwogICAgICAgICAgY291bnRlcjIgPSBjYWxscy5sZW5ndGg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvdW50c1tpZF0rKzsKICAgICAgICAgIGNvdW50ZXIyID0gaW5kZXgyICsgMTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmV1c2VDb3VudGVyID0gY291bnRzW2lkXTsKICAgICAgICB0aGlzLnRhZygnPHN1cD48YSBocmVmPSIjJyArIGNsb2JiZXJQcmVmaXggKyAiZm4tIiArIHNhZmVJZCArICciIGlkPSInICsgY2xvYmJlclByZWZpeCArICJmbnJlZi0iICsgc2FmZUlkICsgKHJldXNlQ291bnRlciA+IDEgPyAiLSIgKyByZXVzZUNvdW50ZXIgOiAiIikgKyAnIiBkYXRhLWZvb3Rub3RlLXJlZj0iIiBhcmlhLWRlc2NyaWJlZGJ5PSJmb290bm90ZS1sYWJlbCI+JyArIFN0cmluZyhjb3VudGVyMikgKyAiPC9hPjwvc3VwPiIpOwogICAgICB9LAogICAgICBudWxsKCkgewogICAgICAgIGNvbnN0IGNhbGxzID0gdGhpcy5nZXREYXRhKCJnZm1Gb290bm90ZUNhbGxPcmRlciIpIHx8IFtdOwogICAgICAgIGNvbnN0IGNvdW50cyA9IHRoaXMuZ2V0RGF0YSgiZ2ZtRm9vdG5vdGVDYWxsQ291bnRzIikgfHwge307CiAgICAgICAgY29uc3QgZGVmaW5pdGlvbnMgPSB0aGlzLmdldERhdGEoImdmbUZvb3Rub3RlRGVmaW5pdGlvbnMiKSB8fCB7fTsKICAgICAgICBsZXQgaW5kZXgyID0gLTE7CiAgICAgICAgaWYgKGNhbGxzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgICB0aGlzLnRhZygnPHNlY3Rpb24gZGF0YS1mb290bm90ZXM9IiIgY2xhc3M9ImZvb3Rub3RlcyI+PCcgKyBsYWJlbFRhZ05hbWUgKyAnIGlkPSJmb290bm90ZS1sYWJlbCInICsgKGxhYmVsQXR0cmlidXRlcyA/ICIgIiArIGxhYmVsQXR0cmlidXRlcyA6ICIiKSArICI+Iik7CiAgICAgICAgICB0aGlzLnJhdyh0aGlzLmVuY29kZShsYWJlbCkpOwogICAgICAgICAgdGhpcy50YWcoIjwvIiArIGxhYmVsVGFnTmFtZSArICI+Iik7CiAgICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgICAgdGhpcy50YWcoIjxvbD4iKTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKCsraW5kZXgyIDwgY2FsbHMubGVuZ3RoKSB7CiAgICAgICAgICBjb25zdCBpZCA9IGNhbGxzW2luZGV4Ml07CiAgICAgICAgICBjb25zdCBzYWZlSWQgPSBzYW5pdGl6ZVVyaShpZC50b0xvd2VyQ2FzZSgpKTsKICAgICAgICAgIGxldCByZWZlcmVuY2VJbmRleCA9IDA7CiAgICAgICAgICBjb25zdCByZWZlcmVuY2VzID0gW107CiAgICAgICAgICB3aGlsZSAoKytyZWZlcmVuY2VJbmRleCA8PSBjb3VudHNbaWRdKSB7CiAgICAgICAgICAgIHJlZmVyZW5jZXMucHVzaCgnPGEgaHJlZj0iIycgKyBjbG9iYmVyUHJlZml4ICsgImZucmVmLSIgKyBzYWZlSWQgKyAocmVmZXJlbmNlSW5kZXggPiAxID8gIi0iICsgcmVmZXJlbmNlSW5kZXggOiAiIikgKyAnIiBkYXRhLWZvb3Rub3RlLWJhY2tyZWY9IiIgYXJpYS1sYWJlbD0iJyArIHRoaXMuZW5jb2RlKHR5cGVvZiBiYWNrTGFiZWwgPT09ICJzdHJpbmciID8gYmFja0xhYmVsIDogYmFja0xhYmVsKGluZGV4MiwgcmVmZXJlbmNlSW5kZXgpKSArICciIGNsYXNzPSJkYXRhLWZvb3Rub3RlLWJhY2tyZWYiPlx1MjFBOScgKyAocmVmZXJlbmNlSW5kZXggPiAxID8gIjxzdXA+IiArIHJlZmVyZW5jZUluZGV4ICsgIjwvc3VwPiIgOiAiIikgKyAiPC9hPiIpOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gcmVmZXJlbmNlcy5qb2luKCIgIik7CiAgICAgICAgICBsZXQgaW5qZWN0ZWQgPSBmYWxzZTsKICAgICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgICB0aGlzLnRhZygnPGxpIGlkPSInICsgY2xvYmJlclByZWZpeCArICJmbi0iICsgc2FmZUlkICsgJyI+Jyk7CiAgICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgICAgdGhpcy50YWcoZGVmaW5pdGlvbnNbaWRdLnJlcGxhY2UoLzxcL3A+KD86XHI/XG58XHIpPyQvLCBmdW5jdGlvbigkMCkgewogICAgICAgICAgICBpbmplY3RlZCA9IHRydWU7CiAgICAgICAgICAgIHJldHVybiAiICIgKyByZWZlcmVuY2UgKyAkMDsKICAgICAgICAgIH0pKTsKICAgICAgICAgIGlmICghaW5qZWN0ZWQpIHsKICAgICAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICAgICAgdGhpcy50YWcocmVmZXJlbmNlKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgICB0aGlzLnRhZygiPC9saT4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNhbGxzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgICB0aGlzLnRhZygiPC9vbD4iKTsKICAgICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgICB0aGlzLnRhZygiPC9zZWN0aW9uPiIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07Cn0KdmFyIG93bjQsIGVtcHR5T3B0aW9uczI7CnZhciBpbml0X2h0bWwzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tZm9vdG5vdGVAMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLWZvb3Rub3RlL2xpYi9odG1sLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfbm9ybWFsaXplX2lkZW50aWZpZXIoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfc2FuaXRpemVfdXJpKCk7CiAgICBvd240ID0ge30uaGFzT3duUHJvcGVydHk7CiAgICBlbXB0eU9wdGlvbnMyID0ge307CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1mb290bm90ZUAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tZm9vdG5vdGUvaW5kZXguanMKdmFyIGluaXRfbWljcm9tYXJrX2V4dGVuc2lvbl9nZm1fZm9vdG5vdGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1mb290bm90ZUAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tZm9vdG5vdGUvaW5kZXguanMiKCkgewogICAgaW5pdF9zeW50YXgyKCk7CiAgICBpbml0X2h0bWwzKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1zdHJpa2V0aHJvdWdoQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1zdHJpa2V0aHJvdWdoL2xpYi9odG1sLmpzCmZ1bmN0aW9uIGdmbVN0cmlrZXRocm91Z2hIdG1sKCkgewogIHJldHVybiB7CiAgICBlbnRlcjogewogICAgICBzdHJpa2V0aHJvdWdoKCkgewogICAgICAgIHRoaXMudGFnKCI8ZGVsPiIpOwogICAgICB9CiAgICB9LAogICAgZXhpdDogewogICAgICBzdHJpa2V0aHJvdWdoKCkgewogICAgICAgIHRoaXMudGFnKCI8L2RlbD4iKTsKICAgICAgfQogICAgfQogIH07Cn0KdmFyIGluaXRfaHRtbDQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1zdHJpa2V0aHJvdWdoQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1zdHJpa2V0aHJvdWdoL2xpYi9odG1sLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXN0cmlrZXRocm91Z2hAMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXN0cmlrZXRocm91Z2gvbGliL3N5bnRheC5qcwpmdW5jdGlvbiBnZm1TdHJpa2V0aHJvdWdoKG9wdGlvbnMpIHsKICBjb25zdCBvcHRpb25zXyA9IG9wdGlvbnMgfHwge307CiAgbGV0IHNpbmdsZTIgPSBvcHRpb25zXy5zaW5nbGVUaWxkZTsKICBjb25zdCB0b2tlbml6ZXIgPSB7CiAgICBuYW1lOiAic3RyaWtldGhyb3VnaCIsCiAgICB0b2tlbml6ZTogdG9rZW5pemVTdHJpa2V0aHJvdWdoLAogICAgcmVzb2x2ZUFsbDogcmVzb2x2ZUFsbFN0cmlrZXRocm91Z2gKICB9OwogIGlmIChzaW5nbGUyID09PSBudWxsIHx8IHNpbmdsZTIgPT09IHZvaWQgMCkgewogICAgc2luZ2xlMiA9IHRydWU7CiAgfQogIHJldHVybiB7CiAgICB0ZXh0OiB7CiAgICAgIFsxMjZdOiB0b2tlbml6ZXIKICAgIH0sCiAgICBpbnNpZGVTcGFuOiB7CiAgICAgIG51bGw6IFt0b2tlbml6ZXJdCiAgICB9LAogICAgYXR0ZW50aW9uTWFya2VyczogewogICAgICBudWxsOiBbMTI2XQogICAgfQogIH07CiAgZnVuY3Rpb24gcmVzb2x2ZUFsbFN0cmlrZXRocm91Z2goZXZlbnRzLCBjb250ZXh0MikgewogICAgbGV0IGluZGV4MiA9IC0xOwogICAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgICBpZiAoZXZlbnRzW2luZGV4Ml1bMF0gPT09ICJlbnRlciIgJiYgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gInN0cmlrZXRocm91Z2hTZXF1ZW5jZVRlbXBvcmFyeSIgJiYgZXZlbnRzW2luZGV4Ml1bMV0uX2Nsb3NlKSB7CiAgICAgICAgbGV0IG9wZW4gPSBpbmRleDI7CiAgICAgICAgd2hpbGUgKG9wZW4tLSkgewogICAgICAgICAgaWYgKGV2ZW50c1tvcGVuXVswXSA9PT0gImV4aXQiICYmIGV2ZW50c1tvcGVuXVsxXS50eXBlID09PSAic3RyaWtldGhyb3VnaFNlcXVlbmNlVGVtcG9yYXJ5IiAmJiBldmVudHNbb3Blbl1bMV0uX29wZW4gJiYgLy8gSWYgdGhlIHNpemVzIGFyZSB0aGUgc2FtZToKICAgICAgICAgIGV2ZW50c1tpbmRleDJdWzFdLmVuZC5vZmZzZXQgLSBldmVudHNbaW5kZXgyXVsxXS5zdGFydC5vZmZzZXQgPT09IGV2ZW50c1tvcGVuXVsxXS5lbmQub2Zmc2V0IC0gZXZlbnRzW29wZW5dWzFdLnN0YXJ0Lm9mZnNldCkgewogICAgICAgICAgICBldmVudHNbaW5kZXgyXVsxXS50eXBlID0gInN0cmlrZXRocm91Z2hTZXF1ZW5jZSI7CiAgICAgICAgICAgIGV2ZW50c1tvcGVuXVsxXS50eXBlID0gInN0cmlrZXRocm91Z2hTZXF1ZW5jZSI7CiAgICAgICAgICAgIGNvbnN0IHN0cmlrZXRocm91Z2gzID0gewogICAgICAgICAgICAgIHR5cGU6ICJzdHJpa2V0aHJvdWdoIiwKICAgICAgICAgICAgICBzdGFydDogT2JqZWN0LmFzc2lnbih7fSwgZXZlbnRzW29wZW5dWzFdLnN0YXJ0KSwKICAgICAgICAgICAgICBlbmQ6IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50c1tpbmRleDJdWzFdLmVuZCkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY29uc3QgdGV4dDkgPSB7CiAgICAgICAgICAgICAgdHlwZTogInN0cmlrZXRocm91Z2hUZXh0IiwKICAgICAgICAgICAgICBzdGFydDogT2JqZWN0LmFzc2lnbih7fSwgZXZlbnRzW29wZW5dWzFdLmVuZCksCiAgICAgICAgICAgICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbaW5kZXgyXVsxXS5zdGFydCkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY29uc3QgbmV4dEV2ZW50cyA9IFtbImVudGVyIiwgc3RyaWtldGhyb3VnaDMsIGNvbnRleHQyXSwgWyJlbnRlciIsIGV2ZW50c1tvcGVuXVsxXSwgY29udGV4dDJdLCBbImV4aXQiLCBldmVudHNbb3Blbl1bMV0sIGNvbnRleHQyXSwgWyJlbnRlciIsIHRleHQ5LCBjb250ZXh0Ml1dOwogICAgICAgICAgICBjb25zdCBpbnNpZGVTcGFuMiA9IGNvbnRleHQyLnBhcnNlci5jb25zdHJ1Y3RzLmluc2lkZVNwYW4ubnVsbDsKICAgICAgICAgICAgaWYgKGluc2lkZVNwYW4yKSB7CiAgICAgICAgICAgICAgc3BsaWNlKG5leHRFdmVudHMsIG5leHRFdmVudHMubGVuZ3RoLCAwLCByZXNvbHZlQWxsKGluc2lkZVNwYW4yLCBldmVudHMuc2xpY2Uob3BlbiArIDEsIGluZGV4MiksIGNvbnRleHQyKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3BsaWNlKG5leHRFdmVudHMsIG5leHRFdmVudHMubGVuZ3RoLCAwLCBbWyJleGl0IiwgdGV4dDksIGNvbnRleHQyXSwgWyJlbnRlciIsIGV2ZW50c1tpbmRleDJdWzFdLCBjb250ZXh0Ml0sIFsiZXhpdCIsIGV2ZW50c1tpbmRleDJdWzFdLCBjb250ZXh0Ml0sIFsiZXhpdCIsIHN0cmlrZXRocm91Z2gzLCBjb250ZXh0Ml1dKTsKICAgICAgICAgICAgc3BsaWNlKGV2ZW50cywgb3BlbiAtIDEsIGluZGV4MiAtIG9wZW4gKyAzLCBuZXh0RXZlbnRzKTsKICAgICAgICAgICAgaW5kZXgyID0gb3BlbiArIG5leHRFdmVudHMubGVuZ3RoIC0gMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpbmRleDIgPSAtMTsKICAgIHdoaWxlICgrK2luZGV4MiA8IGV2ZW50cy5sZW5ndGgpIHsKICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJzdHJpa2V0aHJvdWdoU2VxdWVuY2VUZW1wb3JhcnkiKSB7CiAgICAgICAgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9ICJkYXRhIjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGV2ZW50czsKICB9CiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpa2V0aHJvdWdoKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgICBjb25zdCBwcmV2aW91czMgPSB0aGlzLnByZXZpb3VzOwogICAgY29uc3QgZXZlbnRzID0gdGhpcy5ldmVudHM7CiAgICBsZXQgc2l6ZSA9IDA7CiAgICByZXR1cm4gc3RhcnQ7CiAgICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgICBpZiAocHJldmlvdXMzID09PSAxMjYgJiYgZXZlbnRzW2V2ZW50cy5sZW5ndGggLSAxXVsxXS50eXBlICE9PSAiY2hhcmFjdGVyRXNjYXBlIikgewogICAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgICB9CiAgICAgIGVmZmVjdHMuZW50ZXIoInN0cmlrZXRocm91Z2hTZXF1ZW5jZVRlbXBvcmFyeSIpOwogICAgICByZXR1cm4gbW9yZShjb2RlNCk7CiAgICB9CiAgICBmdW5jdGlvbiBtb3JlKGNvZGU0KSB7CiAgICAgIGNvbnN0IGJlZm9yZSA9IGNsYXNzaWZ5Q2hhcmFjdGVyKHByZXZpb3VzMyk7CiAgICAgIGlmIChjb2RlNCA9PT0gMTI2KSB7CiAgICAgICAgaWYgKHNpemUgPiAxKSByZXR1cm4gbm9rKGNvZGU0KTsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIHNpemUrKzsKICAgICAgICByZXR1cm4gbW9yZTsKICAgICAgfQogICAgICBpZiAoc2l6ZSA8IDIgJiYgIXNpbmdsZTIpIHJldHVybiBub2soY29kZTQpOwogICAgICBjb25zdCB0b2tlbiA9IGVmZmVjdHMuZXhpdCgic3RyaWtldGhyb3VnaFNlcXVlbmNlVGVtcG9yYXJ5Iik7CiAgICAgIGNvbnN0IGFmdGVyID0gY2xhc3NpZnlDaGFyYWN0ZXIoY29kZTQpOwogICAgICB0b2tlbi5fb3BlbiA9ICFhZnRlciB8fCBhZnRlciA9PT0gMiAmJiBCb29sZWFuKGJlZm9yZSk7CiAgICAgIHRva2VuLl9jbG9zZSA9ICFiZWZvcmUgfHwgYmVmb3JlID09PSAyICYmIEJvb2xlYW4oYWZ0ZXIpOwogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICB9Cn0KdmFyIGluaXRfc3ludGF4MyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXN0cmlrZXRocm91Z2hAMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXN0cmlrZXRocm91Z2gvbGliL3N5bnRheC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NodW5rZWQoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2xhc3NpZnlfY2hhcmFjdGVyKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX3Jlc29sdmVfYWxsKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1zdHJpa2V0aHJvdWdoQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1zdHJpa2V0aHJvdWdoL2luZGV4LmpzCnZhciBpbml0X21pY3JvbWFya19leHRlbnNpb25fZ2ZtX3N0cmlrZXRocm91Z2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1zdHJpa2V0aHJvdWdoQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1zdHJpa2V0aHJvdWdoL2luZGV4LmpzIigpIHsKICAgIGluaXRfaHRtbDQoKTsKICAgIGluaXRfc3ludGF4MygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGVAMi4xLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlL2xpYi9odG1sLmpzCmZ1bmN0aW9uIGdmbVRhYmxlSHRtbCgpIHsKICByZXR1cm4gewogICAgZW50ZXI6IHsKICAgICAgdGFibGUodG9rZW4pIHsKICAgICAgICBjb25zdCB0YWJsZUFsaWduID0gdG9rZW4uX2FsaWduOwogICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgdGhpcy50YWcoIjx0YWJsZT4iKTsKICAgICAgICB0aGlzLnNldERhdGEoInRhYmxlQWxpZ24iLCB0YWJsZUFsaWduKTsKICAgICAgfSwKICAgICAgdGFibGVCb2R5KCkgewogICAgICAgIHRoaXMudGFnKCI8dGJvZHk+Iik7CiAgICAgIH0sCiAgICAgIHRhYmxlRGF0YSgpIHsKICAgICAgICBjb25zdCB0YWJsZUFsaWduID0gdGhpcy5nZXREYXRhKCJ0YWJsZUFsaWduIik7CiAgICAgICAgY29uc3QgdGFibGVDb2x1bW4gPSB0aGlzLmdldERhdGEoInRhYmxlQ29sdW1uIik7CiAgICAgICAgY29uc3QgYWxpZ24gPSBhbGlnbm1lbnRbdGFibGVBbGlnblt0YWJsZUNvbHVtbl1dOwogICAgICAgIGlmIChhbGlnbiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICB0aGlzLmJ1ZmZlcigpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgICAgdGhpcy50YWcoIjx0ZCIgKyBhbGlnbiArICI+Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICB0YWJsZUhlYWQoKSB7CiAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICB0aGlzLnRhZygiPHRoZWFkPiIpOwogICAgICB9LAogICAgICB0YWJsZUhlYWRlcigpIHsKICAgICAgICBjb25zdCB0YWJsZUFsaWduID0gdGhpcy5nZXREYXRhKCJ0YWJsZUFsaWduIik7CiAgICAgICAgY29uc3QgdGFibGVDb2x1bW4gPSB0aGlzLmdldERhdGEoInRhYmxlQ29sdW1uIik7CiAgICAgICAgY29uc3QgYWxpZ24gPSBhbGlnbm1lbnRbdGFibGVBbGlnblt0YWJsZUNvbHVtbl1dOwogICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgdGhpcy50YWcoIjx0aCIgKyBhbGlnbiArICI+Iik7CiAgICAgIH0sCiAgICAgIHRhYmxlUm93KCkgewogICAgICAgIHRoaXMuc2V0RGF0YSgidGFibGVDb2x1bW4iLCAwKTsKICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgIHRoaXMudGFnKCI8dHI+Iik7CiAgICAgIH0KICAgIH0sCiAgICBleGl0OiB7CiAgICAgIC8vIE92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBjb2RlIHRleHQgZGF0YSBoYW5kbGVyIHRvIHVuZXNjYXBlIGVzY2FwZWQgcGlwZXMgd2hlbgogICAgICAvLyB0aGV5IGFyZSBpbiB0YWJsZXMuCiAgICAgIGNvZGVUZXh0RGF0YSh0b2tlbikgewogICAgICAgIGxldCB2YWx1ZTIgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICAgICAgICBpZiAodGhpcy5nZXREYXRhKCJ0YWJsZUFsaWduIikpIHsKICAgICAgICAgIHZhbHVlMiA9IHZhbHVlMi5yZXBsYWNlKC9cXChbXFx8XSkvZywgcmVwbGFjZTIpOwogICAgICAgIH0KICAgICAgICB0aGlzLnJhdyh0aGlzLmVuY29kZSh2YWx1ZTIpKTsKICAgICAgfSwKICAgICAgdGFibGUoKSB7CiAgICAgICAgdGhpcy5zZXREYXRhKCJ0YWJsZUFsaWduIik7CiAgICAgICAgdGhpcy5zZXREYXRhKCJzbHVycEFsbExpbmVFbmRpbmdzIik7CiAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICB0aGlzLnRhZygiPC90YWJsZT4iKTsKICAgICAgfSwKICAgICAgdGFibGVCb2R5KCkgewogICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgdGhpcy50YWcoIjwvdGJvZHk+Iik7CiAgICAgIH0sCiAgICAgIHRhYmxlRGF0YSgpIHsKICAgICAgICBjb25zdCB0YWJsZUFsaWduID0gdGhpcy5nZXREYXRhKCJ0YWJsZUFsaWduIik7CiAgICAgICAgY29uc3QgdGFibGVDb2x1bW4gPSB0aGlzLmdldERhdGEoInRhYmxlQ29sdW1uIik7CiAgICAgICAgaWYgKHRhYmxlQ29sdW1uIGluIHRhYmxlQWxpZ24pIHsKICAgICAgICAgIHRoaXMudGFnKCI8L3RkPiIpOwogICAgICAgICAgdGhpcy5zZXREYXRhKCJ0YWJsZUNvbHVtbiIsIHRhYmxlQ29sdW1uICsgMSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMucmVzdW1lKCk7CiAgICAgICAgfQogICAgICB9LAogICAgICB0YWJsZUhlYWQoKSB7CiAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICB0aGlzLnRhZygiPC90aGVhZD4iKTsKICAgICAgfSwKICAgICAgdGFibGVIZWFkZXIoKSB7CiAgICAgICAgY29uc3QgdGFibGVDb2x1bW4gPSB0aGlzLmdldERhdGEoInRhYmxlQ29sdW1uIik7CiAgICAgICAgdGhpcy50YWcoIjwvdGg+Iik7CiAgICAgICAgdGhpcy5zZXREYXRhKCJ0YWJsZUNvbHVtbiIsIHRhYmxlQ29sdW1uICsgMSk7CiAgICAgIH0sCiAgICAgIHRhYmxlUm93KCkgewogICAgICAgIGNvbnN0IHRhYmxlQWxpZ24gPSB0aGlzLmdldERhdGEoInRhYmxlQWxpZ24iKTsKICAgICAgICBsZXQgdGFibGVDb2x1bW4gPSB0aGlzLmdldERhdGEoInRhYmxlQ29sdW1uIik7CiAgICAgICAgd2hpbGUgKHRhYmxlQ29sdW1uIDwgdGFibGVBbGlnbi5sZW5ndGgpIHsKICAgICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgICB0aGlzLnRhZygiPHRkIiArIGFsaWdubWVudFt0YWJsZUFsaWduW3RhYmxlQ29sdW1uXV0gKyAiPjwvdGQ+Iik7CiAgICAgICAgICB0YWJsZUNvbHVtbisrOwogICAgICAgIH0KICAgICAgICB0aGlzLnNldERhdGEoInRhYmxlQ29sdW1uIiwgdGFibGVDb2x1bW4pOwogICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgdGhpcy50YWcoIjwvdHI+Iik7CiAgICAgIH0KICAgIH0KICB9Owp9CmZ1bmN0aW9uIHJlcGxhY2UyKCQwLCAkMSkgewogIHJldHVybiAkMSA9PT0gInwiID8gJDEgOiAkMDsKfQp2YXIgYWxpZ25tZW50Owp2YXIgaW5pdF9odG1sNSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlQDIuMS4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWJsZS9saWIvaHRtbC5qcyIoKSB7CiAgICBhbGlnbm1lbnQgPSB7CiAgICAgIG5vbmU6ICIiLAogICAgICBsZWZ0OiAnIGFsaWduPSJsZWZ0IicsCiAgICAgIHJpZ2h0OiAnIGFsaWduPSJyaWdodCInLAogICAgICBjZW50ZXI6ICcgYWxpZ249ImNlbnRlciInCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGVAMi4xLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlL2xpYi9lZGl0LW1hcC5qcwpmdW5jdGlvbiBhZGRJbXBsZW1lbnRhdGlvbihlZGl0TWFwLCBhdCwgcmVtb3ZlMiwgYWRkMykgewogIGxldCBpbmRleDIgPSAwOwogIGlmIChyZW1vdmUyID09PSAwICYmIGFkZDMubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm47CiAgfQogIHdoaWxlIChpbmRleDIgPCBlZGl0TWFwLm1hcC5sZW5ndGgpIHsKICAgIGlmIChlZGl0TWFwLm1hcFtpbmRleDJdWzBdID09PSBhdCkgewogICAgICBlZGl0TWFwLm1hcFtpbmRleDJdWzFdICs9IHJlbW92ZTI7CiAgICAgIGVkaXRNYXAubWFwW2luZGV4Ml1bMl0ucHVzaCguLi5hZGQzKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaW5kZXgyICs9IDE7CiAgfQogIGVkaXRNYXAubWFwLnB1c2goW2F0LCByZW1vdmUyLCBhZGQzXSk7Cn0KdmFyIEVkaXRNYXA7CnZhciBpbml0X2VkaXRfbWFwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGVAMi4xLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlL2xpYi9lZGl0LW1hcC5qcyIoKSB7CiAgICBFZGl0TWFwID0gY2xhc3MgewogICAgICAvKioKICAgICAgICogQ3JlYXRlIGEgbmV3IGVkaXQgbWFwLgogICAgICAgKi8KICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5tYXAgPSBbXTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQ3JlYXRlIGFuIGVkaXQ6IGEgcmVtb3ZlIGFuZC9vciBhZGQgYXQgYSBjZXJ0YWluIHBsYWNlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXgKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHJlbW92ZQogICAgICAgKiBAcGFyYW0ge0FycmF5PEV2ZW50Pn0gYWRkCiAgICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CiAgICAgICAqLwogICAgICBhZGQoaW5kZXgyLCByZW1vdmUyLCBhZGQzKSB7CiAgICAgICAgYWRkSW1wbGVtZW50YXRpb24odGhpcywgaW5kZXgyLCByZW1vdmUyLCBhZGQzKTsKICAgICAgfQogICAgICAvLyBUbyBkbzogYWRkIHRoaXMgd2hlbiBtb3ZpbmcgdG8gYG1pY3JvbWFya2AuCiAgICAgIC8vIC8qKgogICAgICAvLyAgKiBDcmVhdGUgYW4gZWRpdDogYnV0IGluc2VydCBgYWRkYCBiZWZvcmUgZXhpc3RpbmcgYWRkaXRpb25zLgogICAgICAvLyAgKgogICAgICAvLyAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXgKICAgICAgLy8gICogQHBhcmFtIHtudW1iZXJ9IHJlbW92ZQogICAgICAvLyAgKiBAcGFyYW0ge0FycmF5PEV2ZW50Pn0gYWRkCiAgICAgIC8vICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CiAgICAgIC8vICAqLwogICAgICAvLyBhZGRCZWZvcmUoaW5kZXgsIHJlbW92ZSwgYWRkKSB7CiAgICAgIC8vICAgYWRkSW1wbGVtZW50YXRpb24odGhpcywgaW5kZXgsIHJlbW92ZSwgYWRkLCB0cnVlKQogICAgICAvLyB9CiAgICAgIC8qKgogICAgICAgKiBEb25lLCBjaGFuZ2UgdGhlIGV2ZW50cy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtBcnJheTxFdmVudD59IGV2ZW50cwogICAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAgICAgKi8KICAgICAgY29uc3VtZShldmVudHMpIHsKICAgICAgICB0aGlzLm1hcC5zb3J0KGZ1bmN0aW9uKGE1LCBiNSkgewogICAgICAgICAgcmV0dXJuIGE1WzBdIC0gYjVbMF07CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHRoaXMubWFwLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsZXQgaW5kZXgyID0gdGhpcy5tYXAubGVuZ3RoOwogICAgICAgIGNvbnN0IHZlY3MgPSBbXTsKICAgICAgICB3aGlsZSAoaW5kZXgyID4gMCkgewogICAgICAgICAgaW5kZXgyIC09IDE7CiAgICAgICAgICB2ZWNzLnB1c2goZXZlbnRzLnNsaWNlKHRoaXMubWFwW2luZGV4Ml1bMF0gKyB0aGlzLm1hcFtpbmRleDJdWzFdKSwgdGhpcy5tYXBbaW5kZXgyXVsyXSk7CiAgICAgICAgICBldmVudHMubGVuZ3RoID0gdGhpcy5tYXBbaW5kZXgyXVswXTsKICAgICAgICB9CiAgICAgICAgdmVjcy5wdXNoKGV2ZW50cy5zbGljZSgpKTsKICAgICAgICBldmVudHMubGVuZ3RoID0gMDsKICAgICAgICBsZXQgc2xpY2UgPSB2ZWNzLnBvcCgpOwogICAgICAgIHdoaWxlIChzbGljZSkgewogICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50NCBvZiBzbGljZSkgewogICAgICAgICAgICBldmVudHMucHVzaChlbGVtZW50NCk7CiAgICAgICAgICB9CiAgICAgICAgICBzbGljZSA9IHZlY3MucG9wKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMubWFwLmxlbmd0aCA9IDA7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWJsZUAyLjEuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGUvbGliL2luZmVyLmpzCmZ1bmN0aW9uIGdmbVRhYmxlQWxpZ24oZXZlbnRzLCBpbmRleDIpIHsKICBsZXQgaW5EZWxpbWl0ZXJSb3cgPSBmYWxzZTsKICBjb25zdCBhbGlnbiA9IFtdOwogIHdoaWxlIChpbmRleDIgPCBldmVudHMubGVuZ3RoKSB7CiAgICBjb25zdCBldmVudCA9IGV2ZW50c1tpbmRleDJdOwogICAgaWYgKGluRGVsaW1pdGVyUm93KSB7CiAgICAgIGlmIChldmVudFswXSA9PT0gImVudGVyIikgewogICAgICAgIGlmIChldmVudFsxXS50eXBlID09PSAidGFibGVDb250ZW50IikgewogICAgICAgICAgYWxpZ24ucHVzaChldmVudHNbaW5kZXgyICsgMV1bMV0udHlwZSA9PT0gInRhYmxlRGVsaW1pdGVyTWFya2VyIiA/ICJsZWZ0IiA6ICJub25lIik7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGV2ZW50WzFdLnR5cGUgPT09ICJ0YWJsZUNvbnRlbnQiKSB7CiAgICAgICAgaWYgKGV2ZW50c1tpbmRleDIgLSAxXVsxXS50eXBlID09PSAidGFibGVEZWxpbWl0ZXJNYXJrZXIiKSB7CiAgICAgICAgICBjb25zdCBhbGlnbkluZGV4ID0gYWxpZ24ubGVuZ3RoIC0gMTsKICAgICAgICAgIGFsaWduW2FsaWduSW5kZXhdID0gYWxpZ25bYWxpZ25JbmRleF0gPT09ICJsZWZ0IiA/ICJjZW50ZXIiIDogInJpZ2h0IjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZXZlbnRbMV0udHlwZSA9PT0gInRhYmxlRGVsaW1pdGVyUm93IikgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGV2ZW50WzBdID09PSAiZW50ZXIiICYmIGV2ZW50WzFdLnR5cGUgPT09ICJ0YWJsZURlbGltaXRlclJvdyIpIHsKICAgICAgaW5EZWxpbWl0ZXJSb3cgPSB0cnVlOwogICAgfQogICAgaW5kZXgyICs9IDE7CiAgfQogIHJldHVybiBhbGlnbjsKfQp2YXIgaW5pdF9pbmZlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlQDIuMS4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWJsZS9saWIvaW5mZXIuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGVAMi4xLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlL2xpYi9zeW50YXguanMKZnVuY3Rpb24gZ2ZtVGFibGUoKSB7CiAgcmV0dXJuIHsKICAgIGZsb3c6IHsKICAgICAgbnVsbDogewogICAgICAgIG5hbWU6ICJ0YWJsZSIsCiAgICAgICAgdG9rZW5pemU6IHRva2VuaXplVGFibGUsCiAgICAgICAgcmVzb2x2ZUFsbDogcmVzb2x2ZVRhYmxlCiAgICAgIH0KICAgIH0KICB9Owp9CmZ1bmN0aW9uIHRva2VuaXplVGFibGUoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IHNpemUgPSAwOwogIGxldCBzaXplQiA9IDA7CiAgbGV0IHNlZW47CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBsZXQgaW5kZXgyID0gc2VsZjIuZXZlbnRzLmxlbmd0aCAtIDE7CiAgICB3aGlsZSAoaW5kZXgyID4gLTEpIHsKICAgICAgY29uc3QgdHlwZTUgPSBzZWxmMi5ldmVudHNbaW5kZXgyXVsxXS50eXBlOwogICAgICBpZiAodHlwZTUgPT09ICJsaW5lRW5kaW5nIiB8fCAvLyBOb3RlOiBtYXJrZG93bi1ycyB1c2VzIGB3aGl0ZXNwYWNlYCBpbnN0ZWFkIG9mIGBsaW5lUHJlZml4YAogICAgICB0eXBlNSA9PT0gImxpbmVQcmVmaXgiKSBpbmRleDItLTsKICAgICAgZWxzZSBicmVhazsKICAgIH0KICAgIGNvbnN0IHRhaWwgPSBpbmRleDIgPiAtMSA/IHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLnR5cGUgOiBudWxsOwogICAgY29uc3QgbmV4dDIgPSB0YWlsID09PSAidGFibGVIZWFkIiB8fCB0YWlsID09PSAidGFibGVSb3ciID8gYm9keVJvd1N0YXJ0IDogaGVhZFJvd0JlZm9yZTsKICAgIGlmIChuZXh0MiA9PT0gYm9keVJvd1N0YXJ0ICYmIHNlbGYyLnBhcnNlci5sYXp5W3NlbGYyLm5vdygpLmxpbmVdKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5leHQyKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gaGVhZFJvd0JlZm9yZShjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigidGFibGVIZWFkIik7CiAgICBlZmZlY3RzLmVudGVyKCJ0YWJsZVJvdyIpOwogICAgcmV0dXJuIGhlYWRSb3dTdGFydChjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGhlYWRSb3dTdGFydChjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSAxMjQpIHsKICAgICAgcmV0dXJuIGhlYWRSb3dCcmVhayhjb2RlNCk7CiAgICB9CiAgICBzZWVuID0gdHJ1ZTsKICAgIHNpemVCICs9IDE7CiAgICByZXR1cm4gaGVhZFJvd0JyZWFrKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gaGVhZFJvd0JyZWFrKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBpZiAoc2l6ZUIgPiAxKSB7CiAgICAgICAgc2l6ZUIgPSAwOwogICAgICAgIHNlbGYyLmludGVycnVwdCA9IHRydWU7CiAgICAgICAgZWZmZWN0cy5leGl0KCJ0YWJsZVJvdyIpOwogICAgICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyU3RhcnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBoZWFkUm93QnJlYWssICJ3aGl0ZXNwYWNlIikoY29kZTQpOwogICAgfQogICAgc2l6ZUIgKz0gMTsKICAgIGlmIChzZWVuKSB7CiAgICAgIHNlZW4gPSBmYWxzZTsKICAgICAgc2l6ZSArPSAxOwogICAgfQogICAgaWYgKGNvZGU0ID09PSAxMjQpIHsKICAgICAgZWZmZWN0cy5lbnRlcigidGFibGVDZWxsRGl2aWRlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInRhYmxlQ2VsbERpdmlkZXIiKTsKICAgICAgc2VlbiA9IHRydWU7CiAgICAgIHJldHVybiBoZWFkUm93QnJlYWs7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJkYXRhIik7CiAgICByZXR1cm4gaGVhZFJvd0RhdGEoY29kZTQpOwogIH0KICBmdW5jdGlvbiBoZWFkUm93RGF0YShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSAxMjQgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJkYXRhIik7CiAgICAgIHJldHVybiBoZWFkUm93QnJlYWsoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb2RlNCA9PT0gOTIgPyBoZWFkUm93RXNjYXBlIDogaGVhZFJvd0RhdGE7CiAgfQogIGZ1bmN0aW9uIGhlYWRSb3dFc2NhcGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTIgfHwgY29kZTQgPT09IDEyNCkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gaGVhZFJvd0RhdGE7CiAgICB9CiAgICByZXR1cm4gaGVhZFJvd0RhdGEoY29kZTQpOwogIH0KICBmdW5jdGlvbiBoZWFkRGVsaW1pdGVyU3RhcnQoY29kZTQpIHsKICAgIHNlbGYyLmludGVycnVwdCA9IGZhbHNlOwogICAgaWYgKHNlbGYyLnBhcnNlci5sYXp5W3NlbGYyLm5vdygpLmxpbmVdKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigidGFibGVEZWxpbWl0ZXJSb3ciKTsKICAgIHNlZW4gPSBmYWxzZTsKICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGhlYWREZWxpbWl0ZXJCZWZvcmUsICJsaW5lUHJlZml4Iiwgc2VsZjIucGFyc2VyLmNvbnN0cnVjdHMuZGlzYWJsZS5udWxsLmluY2x1ZGVzKCJjb2RlSW5kZW50ZWQiKSA/IHZvaWQgMCA6IDQpKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBoZWFkRGVsaW1pdGVyQmVmb3JlKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gaGVhZERlbGltaXRlckJlZm9yZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSB8fCBjb2RlNCA9PT0gNTgpIHsKICAgICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJWYWx1ZUJlZm9yZShjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDEyNCkgewogICAgICBzZWVuID0gdHJ1ZTsKICAgICAgZWZmZWN0cy5lbnRlcigidGFibGVDZWxsRGl2aWRlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInRhYmxlQ2VsbERpdmlkZXIiKTsKICAgICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJDZWxsQmVmb3JlOwogICAgfQogICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJOb2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBoZWFkRGVsaW1pdGVyQ2VsbEJlZm9yZShjb2RlNCkgewogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgaGVhZERlbGltaXRlclZhbHVlQmVmb3JlLCAid2hpdGVzcGFjZSIpKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBoZWFkRGVsaW1pdGVyVmFsdWVCZWZvcmUoY29kZTQpOwogIH0KICBmdW5jdGlvbiBoZWFkRGVsaW1pdGVyVmFsdWVCZWZvcmUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNTgpIHsKICAgICAgc2l6ZUIgKz0gMTsKICAgICAgc2VlbiA9IHRydWU7CiAgICAgIGVmZmVjdHMuZW50ZXIoInRhYmxlRGVsaW1pdGVyTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgidGFibGVEZWxpbWl0ZXJNYXJrZXIiKTsKICAgICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJMZWZ0QWxpZ25tZW50QWZ0ZXI7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDQ1KSB7CiAgICAgIHNpemVCICs9IDE7CiAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyTGVmdEFsaWdubWVudEFmdGVyKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyQ2VsbEFmdGVyKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBoZWFkRGVsaW1pdGVyTm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gaGVhZERlbGltaXRlckxlZnRBbGlnbm1lbnRBZnRlcihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmVudGVyKCJ0YWJsZURlbGltaXRlckZpbGxlciIpOwogICAgICByZXR1cm4gaGVhZERlbGltaXRlckZpbGxlcihjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gaGVhZERlbGltaXRlck5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGhlYWREZWxpbWl0ZXJGaWxsZXIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDUpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJGaWxsZXI7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDU4KSB7CiAgICAgIHNlZW4gPSB0cnVlOwogICAgICBlZmZlY3RzLmV4aXQoInRhYmxlRGVsaW1pdGVyRmlsbGVyIik7CiAgICAgIGVmZmVjdHMuZW50ZXIoInRhYmxlRGVsaW1pdGVyTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgidGFibGVEZWxpbWl0ZXJNYXJrZXIiKTsKICAgICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJSaWdodEFsaWdubWVudEFmdGVyOwogICAgfQogICAgZWZmZWN0cy5leGl0KCJ0YWJsZURlbGltaXRlckZpbGxlciIpOwogICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJSaWdodEFsaWdubWVudEFmdGVyKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gaGVhZERlbGltaXRlclJpZ2h0QWxpZ25tZW50QWZ0ZXIoY29kZTQpIHsKICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGhlYWREZWxpbWl0ZXJDZWxsQWZ0ZXIsICJ3aGl0ZXNwYWNlIikoY29kZTQpOwogICAgfQogICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJDZWxsQWZ0ZXIoY29kZTQpOwogIH0KICBmdW5jdGlvbiBoZWFkRGVsaW1pdGVyQ2VsbEFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDEyNCkgewogICAgICByZXR1cm4gaGVhZERlbGltaXRlckJlZm9yZShjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBpZiAoIXNlZW4gfHwgc2l6ZSAhPT0gc2l6ZUIpIHsKICAgICAgICByZXR1cm4gaGVhZERlbGltaXRlck5vayhjb2RlNCk7CiAgICAgIH0KICAgICAgZWZmZWN0cy5leGl0KCJ0YWJsZURlbGltaXRlclJvdyIpOwogICAgICBlZmZlY3RzLmV4aXQoInRhYmxlSGVhZCIpOwogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBoZWFkRGVsaW1pdGVyTm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gaGVhZERlbGltaXRlck5vayhjb2RlNCkgewogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGJvZHlSb3dTdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigidGFibGVSb3ciKTsKICAgIHJldHVybiBib2R5Um93QnJlYWsoY29kZTQpOwogIH0KICBmdW5jdGlvbiBib2R5Um93QnJlYWsoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gMTI0KSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoInRhYmxlQ2VsbERpdmlkZXIiKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJ0YWJsZUNlbGxEaXZpZGVyIik7CiAgICAgIHJldHVybiBib2R5Um93QnJlYWs7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoInRhYmxlUm93Iik7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYm9keVJvd0JyZWFrLCAid2hpdGVzcGFjZSIpKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImRhdGEiKTsKICAgIHJldHVybiBib2R5Um93RGF0YShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGJvZHlSb3dEYXRhKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDEyNCB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImRhdGEiKTsKICAgICAgcmV0dXJuIGJvZHlSb3dCcmVhayhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGNvZGU0ID09PSA5MiA/IGJvZHlSb3dFc2NhcGUgOiBib2R5Um93RGF0YTsKICB9CiAgZnVuY3Rpb24gYm9keVJvd0VzY2FwZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA5MiB8fCBjb2RlNCA9PT0gMTI0KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBib2R5Um93RGF0YTsKICAgIH0KICAgIHJldHVybiBib2R5Um93RGF0YShjb2RlNCk7CiAgfQp9CmZ1bmN0aW9uIHJlc29sdmVUYWJsZShldmVudHMsIGNvbnRleHQyKSB7CiAgbGV0IGluZGV4MiA9IC0xOwogIGxldCBpbkZpcnN0Q2VsbEF3YWl0aW5nUGlwZSA9IHRydWU7CiAgbGV0IHJvd0tpbmQgPSAwOwogIGxldCBsYXN0Q2VsbCA9IFswLCAwLCAwLCAwXTsKICBsZXQgY2VsbDIgPSBbMCwgMCwgMCwgMF07CiAgbGV0IGFmdGVySGVhZEF3YWl0aW5nRmlyc3RCb2R5Um93ID0gZmFsc2U7CiAgbGV0IGxhc3RUYWJsZUVuZCA9IDA7CiAgbGV0IGN1cnJlbnRUYWJsZTsKICBsZXQgY3VycmVudEJvZHk7CiAgbGV0IGN1cnJlbnRDZWxsOwogIGNvbnN0IG1hcDcgPSBuZXcgRWRpdE1hcCgpOwogIHdoaWxlICgrK2luZGV4MiA8IGV2ZW50cy5sZW5ndGgpIHsKICAgIGNvbnN0IGV2ZW50ID0gZXZlbnRzW2luZGV4Ml07CiAgICBjb25zdCB0b2tlbiA9IGV2ZW50WzFdOwogICAgaWYgKGV2ZW50WzBdID09PSAiZW50ZXIiKSB7CiAgICAgIGlmICh0b2tlbi50eXBlID09PSAidGFibGVIZWFkIikgewogICAgICAgIGFmdGVySGVhZEF3YWl0aW5nRmlyc3RCb2R5Um93ID0gZmFsc2U7CiAgICAgICAgaWYgKGxhc3RUYWJsZUVuZCAhPT0gMCkgewogICAgICAgICAgZmx1c2hUYWJsZUVuZChtYXA3LCBjb250ZXh0MiwgbGFzdFRhYmxlRW5kLCBjdXJyZW50VGFibGUsIGN1cnJlbnRCb2R5KTsKICAgICAgICAgIGN1cnJlbnRCb2R5ID0gdm9pZCAwOwogICAgICAgICAgbGFzdFRhYmxlRW5kID0gMDsKICAgICAgICB9CiAgICAgICAgY3VycmVudFRhYmxlID0gewogICAgICAgICAgdHlwZTogInRhYmxlIiwKICAgICAgICAgIHN0YXJ0OiBPYmplY3QuYXNzaWduKHt9LCB0b2tlbi5zdGFydCksCiAgICAgICAgICAvLyBOb3RlOiBjb3JyZWN0IGVuZCBpcyBzZXQgbGF0ZXIuCiAgICAgICAgICBlbmQ6IE9iamVjdC5hc3NpZ24oe30sIHRva2VuLmVuZCkKICAgICAgICB9OwogICAgICAgIG1hcDcuYWRkKGluZGV4MiwgMCwgW1siZW50ZXIiLCBjdXJyZW50VGFibGUsIGNvbnRleHQyXV0pOwogICAgICB9IGVsc2UgaWYgKHRva2VuLnR5cGUgPT09ICJ0YWJsZVJvdyIgfHwgdG9rZW4udHlwZSA9PT0gInRhYmxlRGVsaW1pdGVyUm93IikgewogICAgICAgIGluRmlyc3RDZWxsQXdhaXRpbmdQaXBlID0gdHJ1ZTsKICAgICAgICBjdXJyZW50Q2VsbCA9IHZvaWQgMDsKICAgICAgICBsYXN0Q2VsbCA9IFswLCAwLCAwLCAwXTsKICAgICAgICBjZWxsMiA9IFswLCBpbmRleDIgKyAxLCAwLCAwXTsKICAgICAgICBpZiAoYWZ0ZXJIZWFkQXdhaXRpbmdGaXJzdEJvZHlSb3cpIHsKICAgICAgICAgIGFmdGVySGVhZEF3YWl0aW5nRmlyc3RCb2R5Um93ID0gZmFsc2U7CiAgICAgICAgICBjdXJyZW50Qm9keSA9IHsKICAgICAgICAgICAgdHlwZTogInRhYmxlQm9keSIsCiAgICAgICAgICAgIHN0YXJ0OiBPYmplY3QuYXNzaWduKHt9LCB0b2tlbi5zdGFydCksCiAgICAgICAgICAgIC8vIE5vdGU6IGNvcnJlY3QgZW5kIGlzIHNldCBsYXRlci4KICAgICAgICAgICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCB0b2tlbi5lbmQpCiAgICAgICAgICB9OwogICAgICAgICAgbWFwNy5hZGQoaW5kZXgyLCAwLCBbWyJlbnRlciIsIGN1cnJlbnRCb2R5LCBjb250ZXh0Ml1dKTsKICAgICAgICB9CiAgICAgICAgcm93S2luZCA9IHRva2VuLnR5cGUgPT09ICJ0YWJsZURlbGltaXRlclJvdyIgPyAyIDogY3VycmVudEJvZHkgPyAzIDogMTsKICAgICAgfSBlbHNlIGlmIChyb3dLaW5kICYmICh0b2tlbi50eXBlID09PSAiZGF0YSIgfHwgdG9rZW4udHlwZSA9PT0gInRhYmxlRGVsaW1pdGVyTWFya2VyIiB8fCB0b2tlbi50eXBlID09PSAidGFibGVEZWxpbWl0ZXJGaWxsZXIiKSkgewogICAgICAgIGluRmlyc3RDZWxsQXdhaXRpbmdQaXBlID0gZmFsc2U7CiAgICAgICAgaWYgKGNlbGwyWzJdID09PSAwKSB7CiAgICAgICAgICBpZiAobGFzdENlbGxbMV0gIT09IDApIHsKICAgICAgICAgICAgY2VsbDJbMF0gPSBjZWxsMlsxXTsKICAgICAgICAgICAgY3VycmVudENlbGwgPSBmbHVzaENlbGwobWFwNywgY29udGV4dDIsIGxhc3RDZWxsLCByb3dLaW5kLCB2b2lkIDAsIGN1cnJlbnRDZWxsKTsKICAgICAgICAgICAgbGFzdENlbGwgPSBbMCwgMCwgMCwgMF07CiAgICAgICAgICB9CiAgICAgICAgICBjZWxsMlsyXSA9IGluZGV4MjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gInRhYmxlQ2VsbERpdmlkZXIiKSB7CiAgICAgICAgaWYgKGluRmlyc3RDZWxsQXdhaXRpbmdQaXBlKSB7CiAgICAgICAgICBpbkZpcnN0Q2VsbEF3YWl0aW5nUGlwZSA9IGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAobGFzdENlbGxbMV0gIT09IDApIHsKICAgICAgICAgICAgY2VsbDJbMF0gPSBjZWxsMlsxXTsKICAgICAgICAgICAgY3VycmVudENlbGwgPSBmbHVzaENlbGwobWFwNywgY29udGV4dDIsIGxhc3RDZWxsLCByb3dLaW5kLCB2b2lkIDAsIGN1cnJlbnRDZWxsKTsKICAgICAgICAgIH0KICAgICAgICAgIGxhc3RDZWxsID0gY2VsbDI7CiAgICAgICAgICBjZWxsMiA9IFtsYXN0Q2VsbFsxXSwgaW5kZXgyLCAwLCAwXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gInRhYmxlSGVhZCIpIHsKICAgICAgYWZ0ZXJIZWFkQXdhaXRpbmdGaXJzdEJvZHlSb3cgPSB0cnVlOwogICAgICBsYXN0VGFibGVFbmQgPSBpbmRleDI7CiAgICB9IGVsc2UgaWYgKHRva2VuLnR5cGUgPT09ICJ0YWJsZVJvdyIgfHwgdG9rZW4udHlwZSA9PT0gInRhYmxlRGVsaW1pdGVyUm93IikgewogICAgICBsYXN0VGFibGVFbmQgPSBpbmRleDI7CiAgICAgIGlmIChsYXN0Q2VsbFsxXSAhPT0gMCkgewogICAgICAgIGNlbGwyWzBdID0gY2VsbDJbMV07CiAgICAgICAgY3VycmVudENlbGwgPSBmbHVzaENlbGwobWFwNywgY29udGV4dDIsIGxhc3RDZWxsLCByb3dLaW5kLCBpbmRleDIsIGN1cnJlbnRDZWxsKTsKICAgICAgfSBlbHNlIGlmIChjZWxsMlsxXSAhPT0gMCkgewogICAgICAgIGN1cnJlbnRDZWxsID0gZmx1c2hDZWxsKG1hcDcsIGNvbnRleHQyLCBjZWxsMiwgcm93S2luZCwgaW5kZXgyLCBjdXJyZW50Q2VsbCk7CiAgICAgIH0KICAgICAgcm93S2luZCA9IDA7CiAgICB9IGVsc2UgaWYgKHJvd0tpbmQgJiYgKHRva2VuLnR5cGUgPT09ICJkYXRhIiB8fCB0b2tlbi50eXBlID09PSAidGFibGVEZWxpbWl0ZXJNYXJrZXIiIHx8IHRva2VuLnR5cGUgPT09ICJ0YWJsZURlbGltaXRlckZpbGxlciIpKSB7CiAgICAgIGNlbGwyWzNdID0gaW5kZXgyOwogICAgfQogIH0KICBpZiAobGFzdFRhYmxlRW5kICE9PSAwKSB7CiAgICBmbHVzaFRhYmxlRW5kKG1hcDcsIGNvbnRleHQyLCBsYXN0VGFibGVFbmQsIGN1cnJlbnRUYWJsZSwgY3VycmVudEJvZHkpOwogIH0KICBtYXA3LmNvbnN1bWUoY29udGV4dDIuZXZlbnRzKTsKICBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBjb250ZXh0Mi5ldmVudHMubGVuZ3RoKSB7CiAgICBjb25zdCBldmVudCA9IGNvbnRleHQyLmV2ZW50c1tpbmRleDJdOwogICAgaWYgKGV2ZW50WzBdID09PSAiZW50ZXIiICYmIGV2ZW50WzFdLnR5cGUgPT09ICJ0YWJsZSIpIHsKICAgICAgZXZlbnRbMV0uX2FsaWduID0gZ2ZtVGFibGVBbGlnbihjb250ZXh0Mi5ldmVudHMsIGluZGV4Mik7CiAgICB9CiAgfQogIHJldHVybiBldmVudHM7Cn0KZnVuY3Rpb24gZmx1c2hDZWxsKG1hcDcsIGNvbnRleHQyLCByYW5nZTIsIHJvd0tpbmQsIHJvd0VuZCwgcHJldmlvdXNDZWxsKSB7CiAgY29uc3QgZ3JvdXBOYW1lID0gcm93S2luZCA9PT0gMSA/ICJ0YWJsZUhlYWRlciIgOiByb3dLaW5kID09PSAyID8gInRhYmxlRGVsaW1pdGVyIiA6ICJ0YWJsZURhdGEiOwogIGNvbnN0IHZhbHVlTmFtZSA9ICJ0YWJsZUNvbnRlbnQiOwogIGlmIChyYW5nZTJbMF0gIT09IDApIHsKICAgIHByZXZpb3VzQ2VsbC5lbmQgPSBPYmplY3QuYXNzaWduKHt9LCBnZXRQb2ludChjb250ZXh0Mi5ldmVudHMsIHJhbmdlMlswXSkpOwogICAgbWFwNy5hZGQocmFuZ2UyWzBdLCAwLCBbWyJleGl0IiwgcHJldmlvdXNDZWxsLCBjb250ZXh0Ml1dKTsKICB9CiAgY29uc3Qgbm93MiA9IGdldFBvaW50KGNvbnRleHQyLmV2ZW50cywgcmFuZ2UyWzFdKTsKICBwcmV2aW91c0NlbGwgPSB7CiAgICB0eXBlOiBncm91cE5hbWUsCiAgICBzdGFydDogT2JqZWN0LmFzc2lnbih7fSwgbm93MiksCiAgICAvLyBOb3RlOiBjb3JyZWN0IGVuZCBpcyBzZXQgbGF0ZXIuCiAgICBlbmQ6IE9iamVjdC5hc3NpZ24oe30sIG5vdzIpCiAgfTsKICBtYXA3LmFkZChyYW5nZTJbMV0sIDAsIFtbImVudGVyIiwgcHJldmlvdXNDZWxsLCBjb250ZXh0Ml1dKTsKICBpZiAocmFuZ2UyWzJdICE9PSAwKSB7CiAgICBjb25zdCByZWxhdGVkU3RhcnQgPSBnZXRQb2ludChjb250ZXh0Mi5ldmVudHMsIHJhbmdlMlsyXSk7CiAgICBjb25zdCByZWxhdGVkRW5kID0gZ2V0UG9pbnQoY29udGV4dDIuZXZlbnRzLCByYW5nZTJbM10pOwogICAgY29uc3QgdmFsdWVUb2tlbiA9IHsKICAgICAgdHlwZTogdmFsdWVOYW1lLAogICAgICBzdGFydDogT2JqZWN0LmFzc2lnbih7fSwgcmVsYXRlZFN0YXJ0KSwKICAgICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCByZWxhdGVkRW5kKQogICAgfTsKICAgIG1hcDcuYWRkKHJhbmdlMlsyXSwgMCwgW1siZW50ZXIiLCB2YWx1ZVRva2VuLCBjb250ZXh0Ml1dKTsKICAgIGlmIChyb3dLaW5kICE9PSAyKSB7CiAgICAgIGNvbnN0IHN0YXJ0ID0gY29udGV4dDIuZXZlbnRzW3JhbmdlMlsyXV07CiAgICAgIGNvbnN0IGVuZDMgPSBjb250ZXh0Mi5ldmVudHNbcmFuZ2UyWzNdXTsKICAgICAgc3RhcnRbMV0uZW5kID0gT2JqZWN0LmFzc2lnbih7fSwgZW5kM1sxXS5lbmQpOwogICAgICBzdGFydFsxXS50eXBlID0gImNodW5rVGV4dCI7CiAgICAgIHN0YXJ0WzFdLmNvbnRlbnRUeXBlID0gInRleHQiOwogICAgICBpZiAocmFuZ2UyWzNdID4gcmFuZ2UyWzJdICsgMSkgewogICAgICAgIGNvbnN0IGE1ID0gcmFuZ2UyWzJdICsgMTsKICAgICAgICBjb25zdCBiNSA9IHJhbmdlMlszXSAtIHJhbmdlMlsyXSAtIDE7CiAgICAgICAgbWFwNy5hZGQoYTUsIGI1LCBbXSk7CiAgICAgIH0KICAgIH0KICAgIG1hcDcuYWRkKHJhbmdlMlszXSArIDEsIDAsIFtbImV4aXQiLCB2YWx1ZVRva2VuLCBjb250ZXh0Ml1dKTsKICB9CiAgaWYgKHJvd0VuZCAhPT0gdm9pZCAwKSB7CiAgICBwcmV2aW91c0NlbGwuZW5kID0gT2JqZWN0LmFzc2lnbih7fSwgZ2V0UG9pbnQoY29udGV4dDIuZXZlbnRzLCByb3dFbmQpKTsKICAgIG1hcDcuYWRkKHJvd0VuZCwgMCwgW1siZXhpdCIsIHByZXZpb3VzQ2VsbCwgY29udGV4dDJdXSk7CiAgICBwcmV2aW91c0NlbGwgPSB2b2lkIDA7CiAgfQogIHJldHVybiBwcmV2aW91c0NlbGw7Cn0KZnVuY3Rpb24gZmx1c2hUYWJsZUVuZChtYXA3LCBjb250ZXh0MiwgaW5kZXgyLCB0YWJsZTIsIHRhYmxlQm9keSkgewogIGNvbnN0IGV4aXRzID0gW107CiAgY29uc3QgcmVsYXRlZCA9IGdldFBvaW50KGNvbnRleHQyLmV2ZW50cywgaW5kZXgyKTsKICBpZiAodGFibGVCb2R5KSB7CiAgICB0YWJsZUJvZHkuZW5kID0gT2JqZWN0LmFzc2lnbih7fSwgcmVsYXRlZCk7CiAgICBleGl0cy5wdXNoKFsiZXhpdCIsIHRhYmxlQm9keSwgY29udGV4dDJdKTsKICB9CiAgdGFibGUyLmVuZCA9IE9iamVjdC5hc3NpZ24oe30sIHJlbGF0ZWQpOwogIGV4aXRzLnB1c2goWyJleGl0IiwgdGFibGUyLCBjb250ZXh0Ml0pOwogIG1hcDcuYWRkKGluZGV4MiArIDEsIDAsIGV4aXRzKTsKfQpmdW5jdGlvbiBnZXRQb2ludChldmVudHMsIGluZGV4MikgewogIGNvbnN0IGV2ZW50ID0gZXZlbnRzW2luZGV4Ml07CiAgY29uc3Qgc2lkZSA9IGV2ZW50WzBdID09PSAiZW50ZXIiID8gInN0YXJ0IiA6ICJlbmQiOwogIHJldHVybiBldmVudFsxXVtzaWRlXTsKfQp2YXIgaW5pdF9zeW50YXg0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGVAMi4xLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlL2xpYi9zeW50YXguanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9zcGFjZSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGluaXRfZWRpdF9tYXAoKTsKICAgIGluaXRfaW5mZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlQDIuMS4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWJsZS9pbmRleC5qcwp2YXIgaW5pdF9taWNyb21hcmtfZXh0ZW5zaW9uX2dmbV90YWJsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlQDIuMS4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWJsZS9pbmRleC5qcyIoKSB7CiAgICBpbml0X2h0bWw1KCk7CiAgICBpbml0X3N5bnRheDQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhZ2ZpbHRlckAyLjAuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFnZmlsdGVyL2xpYi9pbmRleC5qcwpmdW5jdGlvbiBnZm1UYWdmaWx0ZXJIdG1sKCkgewogIHJldHVybiB7CiAgICBleGl0OiB7CiAgICAgIGh0bWxGbG93RGF0YSh0b2tlbikgewogICAgICAgIGV4aXRIdG1sRGF0YS5jYWxsKHRoaXMsIHRva2VuLCByZUZsb3cpOwogICAgICB9LAogICAgICBodG1sVGV4dERhdGEodG9rZW4pIHsKICAgICAgICBleGl0SHRtbERhdGEuY2FsbCh0aGlzLCB0b2tlbiwgcmVUZXh0KTsKICAgICAgfQogICAgfQogIH07Cn0KZnVuY3Rpb24gZXhpdEh0bWxEYXRhKHRva2VuLCBmaWx0ZXIyKSB7CiAgbGV0IHZhbHVlMiA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwogIGlmICh0aGlzLm9wdGlvbnMuYWxsb3dEYW5nZXJvdXNIdG1sKSB7CiAgICB2YWx1ZTIgPSB2YWx1ZTIucmVwbGFjZShmaWx0ZXIyLCAiJmx0OyQxJDIiKTsKICB9CiAgdGhpcy5yYXcodGhpcy5lbmNvZGUodmFsdWUyKSk7Cn0KdmFyIHJlRmxvdywgcmVUZXh0Owp2YXIgaW5pdF9saWIxOSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhZ2ZpbHRlckAyLjAuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFnZmlsdGVyL2xpYi9pbmRleC5qcyIoKSB7CiAgICByZUZsb3cgPSAvPChcLz8pKGlmcmFtZXxub2VtYmVkfG5vZnJhbWVzfHBsYWludGV4dHxzY3JpcHR8c3R5bGV8dGl0bGV8dGV4dGFyZWF8eG1wKSg/PVtcdFxuXGZcciAvPl0pL2dpOwogICAgcmVUZXh0ID0gbmV3IFJlZ0V4cCgiXiIgKyByZUZsb3cuc291cmNlLCAiaSIpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFnZmlsdGVyQDIuMC4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWdmaWx0ZXIvaW5kZXguanMKdmFyIGluaXRfbWljcm9tYXJrX2V4dGVuc2lvbl9nZm1fdGFnZmlsdGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFnZmlsdGVyQDIuMC4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWdmaWx0ZXIvaW5kZXguanMiKCkgewogICAgaW5pdF9saWIxOSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFzay1saXN0LWl0ZW1AMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhc2stbGlzdC1pdGVtL2xpYi9odG1sLmpzCmZ1bmN0aW9uIGdmbVRhc2tMaXN0SXRlbUh0bWwoKSB7CiAgcmV0dXJuIHsKICAgIGVudGVyOiB7CiAgICAgIHRhc2tMaXN0Q2hlY2soKSB7CiAgICAgICAgdGhpcy50YWcoJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGlzYWJsZWQ9IiIgJyk7CiAgICAgIH0KICAgIH0sCiAgICBleGl0OiB7CiAgICAgIHRhc2tMaXN0Q2hlY2soKSB7CiAgICAgICAgdGhpcy50YWcoIi8+Iik7CiAgICAgIH0sCiAgICAgIHRhc2tMaXN0Q2hlY2tWYWx1ZUNoZWNrZWQoKSB7CiAgICAgICAgdGhpcy50YWcoJ2NoZWNrZWQ9IiIgJyk7CiAgICAgIH0KICAgIH0KICB9Owp9CnZhciBpbml0X2h0bWw2ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFzay1saXN0LWl0ZW1AMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhc2stbGlzdC1pdGVtL2xpYi9odG1sLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhc2stbGlzdC1pdGVtQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YXNrLWxpc3QtaXRlbS9saWIvc3ludGF4LmpzCmZ1bmN0aW9uIGdmbVRhc2tMaXN0SXRlbSgpIHsKICByZXR1cm4gewogICAgdGV4dDogewogICAgICBbOTFdOiB0YXNrbGlzdENoZWNrCiAgICB9CiAgfTsKfQpmdW5jdGlvbiB0b2tlbml6ZVRhc2tsaXN0Q2hlY2soZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIG9wZW47CiAgZnVuY3Rpb24gb3Blbihjb2RlNCkgewogICAgaWYgKAogICAgICAvLyBFeGl0IGlmIHRoZXJl4oCZcyBzdHVmZiBiZWZvcmUuCiAgICAgIHNlbGYyLnByZXZpb3VzICE9PSBudWxsIHx8IC8vIEV4aXQgaWYgbm90IGluIHRoZSBmaXJzdCBjb250ZW50IHRoYXQgaXMgdGhlIGZpcnN0IGNoaWxkIG9mIGEgbGlzdAogICAgICAvLyBpdGVtLgogICAgICAhc2VsZjIuX2dmbVRhc2tsaXN0Rmlyc3RDb250ZW50T2ZMaXN0SXRlbQogICAgKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigidGFza0xpc3RDaGVjayIpOwogICAgZWZmZWN0cy5lbnRlcigidGFza0xpc3RDaGVja01hcmtlciIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgidGFza0xpc3RDaGVja01hcmtlciIpOwogICAgcmV0dXJuIGluc2lkZTsKICB9CiAgZnVuY3Rpb24gaW5zaWRlKGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5lbnRlcigidGFza0xpc3RDaGVja1ZhbHVlVW5jaGVja2VkIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgidGFza0xpc3RDaGVja1ZhbHVlVW5jaGVja2VkIik7CiAgICAgIHJldHVybiBjbG9zZTc7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDg4IHx8IGNvZGU0ID09PSAxMjApIHsKICAgICAgZWZmZWN0cy5lbnRlcigidGFza0xpc3RDaGVja1ZhbHVlQ2hlY2tlZCIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInRhc2tMaXN0Q2hlY2tWYWx1ZUNoZWNrZWQiKTsKICAgICAgcmV0dXJuIGNsb3NlNzsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBjbG9zZTcoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5lbnRlcigidGFza0xpc3RDaGVja01hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInRhc2tMaXN0Q2hlY2tNYXJrZXIiKTsKICAgICAgZWZmZWN0cy5leGl0KCJ0YXNrTGlzdENoZWNrIik7CiAgICAgIHJldHVybiBhZnRlcjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIGVmZmVjdHMuY2hlY2soewogICAgICAgIHRva2VuaXplOiBzcGFjZVRoZW5Ob25TcGFjZQogICAgICB9LCBvazMsIG5vaykoY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQp9CmZ1bmN0aW9uIHNwYWNlVGhlbk5vblNwYWNlKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlciwgIndoaXRlc3BhY2UiKTsKICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgcmV0dXJuIGNvZGU0ID09PSBudWxsID8gbm9rKGNvZGU0KSA6IG9rMyhjb2RlNCk7CiAgfQp9CnZhciB0YXNrbGlzdENoZWNrOwp2YXIgaW5pdF9zeW50YXg1ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFzay1saXN0LWl0ZW1AMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhc2stbGlzdC1pdGVtL2xpYi9zeW50YXguanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9zcGFjZSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIHRhc2tsaXN0Q2hlY2sgPSB7CiAgICAgIG5hbWU6ICJ0YXNrbGlzdENoZWNrIiwKICAgICAgdG9rZW5pemU6IHRva2VuaXplVGFza2xpc3RDaGVjawogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhc2stbGlzdC1pdGVtQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YXNrLWxpc3QtaXRlbS9pbmRleC5qcwp2YXIgaW5pdF9taWNyb21hcmtfZXh0ZW5zaW9uX2dmbV90YXNrX2xpc3RfaXRlbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhc2stbGlzdC1pdGVtQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YXNrLWxpc3QtaXRlbS9pbmRleC5qcyIoKSB7CiAgICBpbml0X2h0bWw2KCk7CiAgICBpbml0X3N5bnRheDUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtQDMuMC4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS9pbmRleC5qcwpmdW5jdGlvbiBnZm0ob3B0aW9ucykgewogIHJldHVybiBjb21iaW5lRXh0ZW5zaW9ucyhbCiAgICBnZm1BdXRvbGlua0xpdGVyYWwoKSwKICAgIGdmbUZvb3Rub3RlKCksCiAgICBnZm1TdHJpa2V0aHJvdWdoKG9wdGlvbnMpLAogICAgZ2ZtVGFibGUoKSwKICAgIGdmbVRhc2tMaXN0SXRlbSgpCiAgXSk7Cn0KZnVuY3Rpb24gZ2ZtSHRtbChvcHRpb25zKSB7CiAgcmV0dXJuIGNvbWJpbmVIdG1sRXh0ZW5zaW9ucyhbCiAgICBnZm1BdXRvbGlua0xpdGVyYWxIdG1sKCksCiAgICBnZm1Gb290bm90ZUh0bWwob3B0aW9ucyksCiAgICBnZm1TdHJpa2V0aHJvdWdoSHRtbCgpLAogICAgZ2ZtVGFibGVIdG1sKCksCiAgICBnZm1UYWdmaWx0ZXJIdG1sKCksCiAgICBnZm1UYXNrTGlzdEl0ZW1IdG1sKCkKICBdKTsKfQp2YXIgaW5pdF9taWNyb21hcmtfZXh0ZW5zaW9uX2dmbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtQDMuMC4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS9pbmRleC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NvbWJpbmVfZXh0ZW5zaW9ucygpOwogICAgaW5pdF9taWNyb21hcmtfZXh0ZW5zaW9uX2dmbV9hdXRvbGlua19saXRlcmFsKCk7CiAgICBpbml0X21pY3JvbWFya19leHRlbnNpb25fZ2ZtX2Zvb3Rub3RlKCk7CiAgICBpbml0X21pY3JvbWFya19leHRlbnNpb25fZ2ZtX3N0cmlrZXRocm91Z2goKTsKICAgIGluaXRfbWljcm9tYXJrX2V4dGVuc2lvbl9nZm1fdGFibGUoKTsKICAgIGluaXRfbWljcm9tYXJrX2V4dGVuc2lvbl9nZm1fdGFnZmlsdGVyKCk7CiAgICBpbml0X21pY3JvbWFya19leHRlbnNpb25fZ2ZtX3Rhc2tfbGlzdF9pdGVtKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstZ2ZtQDQuMC4xL25vZGVfbW9kdWxlcy9yZW1hcmstZ2ZtL2xpYi9pbmRleC5qcwpmdW5jdGlvbiByZW1hcmtHZm0ob3B0aW9ucykgewogIGNvbnN0IHNlbGYyID0gKAogICAgLyoqIEB0eXBlIHtQcm9jZXNzb3I8Um9vdD59ICovCiAgICB0aGlzCiAgKTsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zMzsKICBjb25zdCBkYXRhID0gc2VsZjIuZGF0YSgpOwogIGNvbnN0IG1pY3JvbWFya0V4dGVuc2lvbnMgPSBkYXRhLm1pY3JvbWFya0V4dGVuc2lvbnMgfHwgKGRhdGEubWljcm9tYXJrRXh0ZW5zaW9ucyA9IFtdKTsKICBjb25zdCBmcm9tTWFya2Rvd25FeHRlbnNpb25zID0gZGF0YS5mcm9tTWFya2Rvd25FeHRlbnNpb25zIHx8IChkYXRhLmZyb21NYXJrZG93bkV4dGVuc2lvbnMgPSBbXSk7CiAgY29uc3QgdG9NYXJrZG93bkV4dGVuc2lvbnMgPSBkYXRhLnRvTWFya2Rvd25FeHRlbnNpb25zIHx8IChkYXRhLnRvTWFya2Rvd25FeHRlbnNpb25zID0gW10pOwogIG1pY3JvbWFya0V4dGVuc2lvbnMucHVzaChnZm0oc2V0dGluZ3MpKTsKICBmcm9tTWFya2Rvd25FeHRlbnNpb25zLnB1c2goZ2ZtRnJvbU1hcmtkb3duKCkpOwogIHRvTWFya2Rvd25FeHRlbnNpb25zLnB1c2goZ2ZtVG9NYXJrZG93bihzZXR0aW5ncykpOwp9CnZhciBlbXB0eU9wdGlvbnMzOwp2YXIgaW5pdF9saWIyMCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1nZm1ANC4wLjEvbm9kZV9tb2R1bGVzL3JlbWFyay1nZm0vbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfbWRhc3RfdXRpbF9nZm0oKTsKICAgIGluaXRfbWljcm9tYXJrX2V4dGVuc2lvbl9nZm0oKTsKICAgIGVtcHR5T3B0aW9uczMgPSB7fTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1nZm1ANC4wLjEvbm9kZV9tb2R1bGVzL3JlbWFyay1nZm0vaW5kZXguanMKdmFyIGluaXRfcmVtYXJrX2dmbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1nZm1ANC4wLjEvbm9kZV9tb2R1bGVzL3JlbWFyay1nZm0vaW5kZXguanMiKCkgewogICAgaW5pdF9saWIyMCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL2NvbXBpbGUuanMKZnVuY3Rpb24gY29tcGlsZShvcHRpb25zKSB7CiAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9OwogIGxldCB0YWdzID0gdHJ1ZTsKICBjb25zdCBkZWZpbml0aW9ucyA9IHt9OwogIGNvbnN0IGJ1ZmZlcnMgPSBbW11dOwogIGNvbnN0IG1lZGlhU3RhY2sgPSBbXTsKICBjb25zdCB0aWdodFN0YWNrID0gW107CiAgY29uc3QgZGVmYXVsdEhhbmRsZXJzID0gewogICAgZW50ZXI6IHsKICAgICAgYmxvY2tRdW90ZTogb25lbnRlcmJsb2NrcXVvdGUsCiAgICAgIGNvZGVGZW5jZWQ6IG9uZW50ZXJjb2RlZmVuY2VkLAogICAgICBjb2RlRmVuY2VkRmVuY2VJbmZvOiBidWZmZXIyLAogICAgICBjb2RlRmVuY2VkRmVuY2VNZXRhOiBidWZmZXIyLAogICAgICBjb2RlSW5kZW50ZWQ6IG9uZW50ZXJjb2RlaW5kZW50ZWQsCiAgICAgIGNvZGVUZXh0OiBvbmVudGVyY29kZXRleHQsCiAgICAgIGNvbnRlbnQ6IG9uZW50ZXJjb250ZW50LAogICAgICBkZWZpbml0aW9uOiBvbmVudGVyZGVmaW5pdGlvbiwKICAgICAgZGVmaW5pdGlvbkRlc3RpbmF0aW9uU3RyaW5nOiBvbmVudGVyZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nLAogICAgICBkZWZpbml0aW9uTGFiZWxTdHJpbmc6IGJ1ZmZlcjIsCiAgICAgIGRlZmluaXRpb25UaXRsZVN0cmluZzogYnVmZmVyMiwKICAgICAgZW1waGFzaXM6IG9uZW50ZXJlbXBoYXNpcywKICAgICAgaHRtbEZsb3c6IG9uZW50ZXJodG1sZmxvdywKICAgICAgaHRtbFRleHQ6IG9uZW50ZXJodG1sLAogICAgICBpbWFnZTogb25lbnRlcmltYWdlLAogICAgICBsYWJlbDogYnVmZmVyMiwKICAgICAgbGluazogb25lbnRlcmxpbmssCiAgICAgIGxpc3RJdGVtTWFya2VyOiBvbmVudGVybGlzdGl0ZW1tYXJrZXIsCiAgICAgIGxpc3RJdGVtVmFsdWU6IG9uZW50ZXJsaXN0aXRlbXZhbHVlLAogICAgICBsaXN0T3JkZXJlZDogb25lbnRlcmxpc3RvcmRlcmVkLAogICAgICBsaXN0VW5vcmRlcmVkOiBvbmVudGVybGlzdHVub3JkZXJlZCwKICAgICAgcGFyYWdyYXBoOiBvbmVudGVycGFyYWdyYXBoLAogICAgICByZWZlcmVuY2U6IGJ1ZmZlcjIsCiAgICAgIHJlc291cmNlOiBvbmVudGVycmVzb3VyY2UsCiAgICAgIHJlc291cmNlRGVzdGluYXRpb25TdHJpbmc6IG9uZW50ZXJyZXNvdXJjZWRlc3RpbmF0aW9uc3RyaW5nLAogICAgICByZXNvdXJjZVRpdGxlU3RyaW5nOiBidWZmZXIyLAogICAgICBzZXRleHRIZWFkaW5nOiBvbmVudGVyc2V0ZXh0aGVhZGluZywKICAgICAgc3Ryb25nOiBvbmVudGVyc3Ryb25nCiAgICB9LAogICAgZXhpdDogewogICAgICBhdHhIZWFkaW5nOiBvbmV4aXRhdHhoZWFkaW5nLAogICAgICBhdHhIZWFkaW5nU2VxdWVuY2U6IG9uZXhpdGF0eGhlYWRpbmdzZXF1ZW5jZSwKICAgICAgYXV0b2xpbmtFbWFpbDogb25leGl0YXV0b2xpbmtlbWFpbCwKICAgICAgYXV0b2xpbmtQcm90b2NvbDogb25leGl0YXV0b2xpbmtwcm90b2NvbCwKICAgICAgYmxvY2tRdW90ZTogb25leGl0YmxvY2txdW90ZSwKICAgICAgY2hhcmFjdGVyRXNjYXBlVmFsdWU6IG9uZXhpdGRhdGEsCiAgICAgIGNoYXJhY3RlclJlZmVyZW5jZU1hcmtlckhleGFkZWNpbWFsOiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2VtYXJrZXIsCiAgICAgIGNoYXJhY3RlclJlZmVyZW5jZU1hcmtlck51bWVyaWM6IG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZW1hcmtlciwKICAgICAgY2hhcmFjdGVyUmVmZXJlbmNlVmFsdWU6IG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZXZhbHVlLAogICAgICBjb2RlRmVuY2VkOiBvbmV4aXRmbG93Y29kZSwKICAgICAgY29kZUZlbmNlZEZlbmNlOiBvbmV4aXRjb2RlZmVuY2VkZmVuY2UsCiAgICAgIGNvZGVGZW5jZWRGZW5jZUluZm86IG9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8sCiAgICAgIGNvZGVGZW5jZWRGZW5jZU1ldGE6IG9ucmVzdW1lZHJvcCwKICAgICAgY29kZUZsb3dWYWx1ZTogb25leGl0Y29kZWZsb3d2YWx1ZSwKICAgICAgY29kZUluZGVudGVkOiBvbmV4aXRmbG93Y29kZSwKICAgICAgY29kZVRleHQ6IG9uZXhpdGNvZGV0ZXh0LAogICAgICBjb2RlVGV4dERhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGRhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGRlZmluaXRpb246IG9uZXhpdGRlZmluaXRpb24sCiAgICAgIGRlZmluaXRpb25EZXN0aW5hdGlvblN0cmluZzogb25leGl0ZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nLAogICAgICBkZWZpbml0aW9uTGFiZWxTdHJpbmc6IG9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZywKICAgICAgZGVmaW5pdGlvblRpdGxlU3RyaW5nOiBvbmV4aXRkZWZpbml0aW9udGl0bGVzdHJpbmcsCiAgICAgIGVtcGhhc2lzOiBvbmV4aXRlbXBoYXNpcywKICAgICAgaGFyZEJyZWFrRXNjYXBlOiBvbmV4aXRoYXJkYnJlYWssCiAgICAgIGhhcmRCcmVha1RyYWlsaW5nOiBvbmV4aXRoYXJkYnJlYWssCiAgICAgIGh0bWxGbG93OiBvbmV4aXRodG1sLAogICAgICBodG1sRmxvd0RhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGh0bWxUZXh0OiBvbmV4aXRodG1sLAogICAgICBodG1sVGV4dERhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGltYWdlOiBvbmV4aXRtZWRpYSwKICAgICAgbGFiZWw6IG9uZXhpdGxhYmVsLAogICAgICBsYWJlbFRleHQ6IG9uZXhpdGxhYmVsdGV4dCwKICAgICAgbGluZUVuZGluZzogb25leGl0bGluZWVuZGluZywKICAgICAgbGluazogb25leGl0bWVkaWEsCiAgICAgIGxpc3RPcmRlcmVkOiBvbmV4aXRsaXN0b3JkZXJlZCwKICAgICAgbGlzdFVub3JkZXJlZDogb25leGl0bGlzdHVub3JkZXJlZCwKICAgICAgcGFyYWdyYXBoOiBvbmV4aXRwYXJhZ3JhcGgsCiAgICAgIHJlZmVyZW5jZTogb25yZXN1bWVkcm9wLAogICAgICByZWZlcmVuY2VTdHJpbmc6IG9uZXhpdHJlZmVyZW5jZXN0cmluZywKICAgICAgcmVzb3VyY2U6IG9ucmVzdW1lZHJvcCwKICAgICAgcmVzb3VyY2VEZXN0aW5hdGlvblN0cmluZzogb25leGl0cmVzb3VyY2VkZXN0aW5hdGlvbnN0cmluZywKICAgICAgcmVzb3VyY2VUaXRsZVN0cmluZzogb25leGl0cmVzb3VyY2V0aXRsZXN0cmluZywKICAgICAgc2V0ZXh0SGVhZGluZzogb25leGl0c2V0ZXh0aGVhZGluZywKICAgICAgc2V0ZXh0SGVhZGluZ0xpbmVTZXF1ZW5jZTogb25leGl0c2V0ZXh0aGVhZGluZ2xpbmVzZXF1ZW5jZSwKICAgICAgc2V0ZXh0SGVhZGluZ1RleHQ6IG9uZXhpdHNldGV4dGhlYWRpbmd0ZXh0LAogICAgICBzdHJvbmc6IG9uZXhpdHN0cm9uZywKICAgICAgdGhlbWF0aWNCcmVhazogb25leGl0dGhlbWF0aWNicmVhawogICAgfQogIH07CiAgY29uc3QgaGFuZGxlcnMyID0gKAogICAgLyoqIEB0eXBlIHtOb3JtYWxpemVkSHRtbEV4dGVuc2lvbn0gKi8KICAgIGNvbWJpbmVIdG1sRXh0ZW5zaW9ucyhbZGVmYXVsdEhhbmRsZXJzLCAuLi5zZXR0aW5ncy5odG1sRXh0ZW5zaW9ucyB8fCBbXV0pCiAgKTsKICBjb25zdCBkYXRhID0gewogICAgZGVmaW5pdGlvbnMsCiAgICB0aWdodFN0YWNrCiAgfTsKICBjb25zdCBjb250ZXh0MiA9IHsKICAgIGJ1ZmZlcjogYnVmZmVyMiwKICAgIGVuY29kZTogZW5jb2RlMiwKICAgIGdldERhdGEsCiAgICBsaW5lRW5kaW5nSWZOZWVkZWQsCiAgICBvcHRpb25zOiBzZXR0aW5ncywKICAgIHJhdzogcmF3MiwKICAgIHJlc3VtZSwKICAgIHNldERhdGEsCiAgICB0YWcKICB9OwogIGxldCBsaW5lRW5kaW5nU3R5bGUgPSBzZXR0aW5ncy5kZWZhdWx0TGluZUVuZGluZzsKICByZXR1cm4gY29tcGlsZTI7CiAgZnVuY3Rpb24gY29tcGlsZTIoZXZlbnRzKSB7CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICBsZXQgc3RhcnQgPSAwOwogICAgY29uc3QgbGlzdFN0YWNrID0gW107CiAgICBsZXQgaGVhZDIgPSBbXTsKICAgIGxldCBib2R5MyA9IFtdOwogICAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgICBpZiAoIWxpbmVFbmRpbmdTdHlsZSAmJiAoZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImxpbmVFbmRpbmciIHx8IGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nQmxhbmsiKSkgewogICAgICAgIGxpbmVFbmRpbmdTdHlsZSA9IC8qKiBAdHlwZSB7TGluZUVuZGluZ30gKi8KICAgICAgICBldmVudHNbaW5kZXgyXVsyXS5zbGljZVNlcmlhbGl6ZShldmVudHNbaW5kZXgyXVsxXSk7CiAgICAgIH0KICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJsaXN0T3JkZXJlZCIgfHwgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImxpc3RVbm9yZGVyZWQiKSB7CiAgICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzBdID09PSAiZW50ZXIiKSB7CiAgICAgICAgICBsaXN0U3RhY2sucHVzaChpbmRleDIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcmVwYXJlTGlzdChldmVudHMuc2xpY2UobGlzdFN0YWNrLnBvcCgpLCBpbmRleDIpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJkZWZpbml0aW9uIikgewogICAgICAgIGlmIChldmVudHNbaW5kZXgyXVswXSA9PT0gImVudGVyIikgewogICAgICAgICAgYm9keTMgPSBwdXNoKGJvZHkzLCBldmVudHMuc2xpY2Uoc3RhcnQsIGluZGV4MikpOwogICAgICAgICAgc3RhcnQgPSBpbmRleDI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhlYWQyID0gcHVzaChoZWFkMiwgZXZlbnRzLnNsaWNlKHN0YXJ0LCBpbmRleDIgKyAxKSk7CiAgICAgICAgICBzdGFydCA9IGluZGV4MiArIDE7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBoZWFkMiA9IHB1c2goaGVhZDIsIGJvZHkzKTsKICAgIGhlYWQyID0gcHVzaChoZWFkMiwgZXZlbnRzLnNsaWNlKHN0YXJ0KSk7CiAgICBpbmRleDIgPSAtMTsKICAgIGNvbnN0IHJlc3VsdCA9IGhlYWQyOwogICAgaWYgKGhhbmRsZXJzMi5lbnRlci5udWxsKSB7CiAgICAgIGhhbmRsZXJzMi5lbnRlci5udWxsLmNhbGwoY29udGV4dDIpOwogICAgfQogICAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgICBjb25zdCBoYW5kbGVzID0gaGFuZGxlcnMyW3Jlc3VsdFtpbmRleDJdWzBdXTsKICAgICAgY29uc3Qga2luZCA9IHJlc3VsdFtpbmRleDJdWzFdLnR5cGU7CiAgICAgIGNvbnN0IGhhbmRsZTMgPSBoYW5kbGVzW2tpbmRdOwogICAgICBpZiAoaGFzT3duUHJvcGVydHkyLmNhbGwoaGFuZGxlcywga2luZCkgJiYgaGFuZGxlMykgewogICAgICAgIGhhbmRsZTMuY2FsbCh7CiAgICAgICAgICBzbGljZVNlcmlhbGl6ZTogcmVzdWx0W2luZGV4Ml1bMl0uc2xpY2VTZXJpYWxpemUsCiAgICAgICAgICAuLi5jb250ZXh0MgogICAgICAgIH0sIHJlc3VsdFtpbmRleDJdWzFdKTsKICAgICAgfQogICAgfQogICAgaWYgKGhhbmRsZXJzMi5leGl0Lm51bGwpIHsKICAgICAgaGFuZGxlcnMyLmV4aXQubnVsbC5jYWxsKGNvbnRleHQyKTsKICAgIH0KICAgIHJldHVybiBidWZmZXJzWzBdLmpvaW4oIiIpOwogIH0KICBmdW5jdGlvbiBwcmVwYXJlTGlzdChzbGljZSkgewogICAgY29uc3QgbGVuZ3RoID0gc2xpY2UubGVuZ3RoOwogICAgbGV0IGluZGV4MiA9IDA7CiAgICBsZXQgY29udGFpbmVyQmFsYW5jZSA9IDA7CiAgICBsZXQgbG9vc2UgPSBmYWxzZTsKICAgIGxldCBhdE1hcmtlcjsKICAgIHdoaWxlICgrK2luZGV4MiA8IGxlbmd0aCkgewogICAgICBjb25zdCBldmVudCA9IHNsaWNlW2luZGV4Ml07CiAgICAgIGlmIChldmVudFsxXS5fY29udGFpbmVyKSB7CiAgICAgICAgYXRNYXJrZXIgPSB2b2lkIDA7CiAgICAgICAgaWYgKGV2ZW50WzBdID09PSAiZW50ZXIiKSB7CiAgICAgICAgICBjb250YWluZXJCYWxhbmNlKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnRhaW5lckJhbGFuY2UtLTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBzd2l0Y2ggKGV2ZW50WzFdLnR5cGUpIHsKICAgICAgICBjYXNlICJsaXN0SXRlbVByZWZpeCI6IHsKICAgICAgICAgIGlmIChldmVudFswXSA9PT0gImV4aXQiKSB7CiAgICAgICAgICAgIGF0TWFya2VyID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICJsaW5lUHJlZml4IjogewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgImxpbmVFbmRpbmdCbGFuayI6IHsKICAgICAgICAgIGlmIChldmVudFswXSA9PT0gImVudGVyIiAmJiAhY29udGFpbmVyQmFsYW5jZSkgewogICAgICAgICAgICBpZiAoYXRNYXJrZXIpIHsKICAgICAgICAgICAgICBhdE1hcmtlciA9IHZvaWQgMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBsb29zZSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICBhdE1hcmtlciA9IHZvaWQgMDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHNsaWNlWzBdWzFdLl9sb29zZSA9IGxvb3NlOwogIH0KICBmdW5jdGlvbiBzZXREYXRhKGtleTIsIHZhbHVlMikgewogICAgZGF0YVtrZXkyXSA9IHZhbHVlMjsKICB9CiAgZnVuY3Rpb24gZ2V0RGF0YShrZXkyKSB7CiAgICByZXR1cm4gZGF0YVtrZXkyXTsKICB9CiAgZnVuY3Rpb24gYnVmZmVyMigpIHsKICAgIGJ1ZmZlcnMucHVzaChbXSk7CiAgfQogIGZ1bmN0aW9uIHJlc3VtZSgpIHsKICAgIGNvbnN0IGJ1ZiA9IGJ1ZmZlcnMucG9wKCk7CiAgICByZXR1cm4gYnVmLmpvaW4oIiIpOwogIH0KICBmdW5jdGlvbiB0YWcodmFsdWUyKSB7CiAgICBpZiAoIXRhZ3MpIHJldHVybjsKICAgIHNldERhdGEoImxhc3RXYXNUYWciLCB0cnVlKTsKICAgIGJ1ZmZlcnNbYnVmZmVycy5sZW5ndGggLSAxXS5wdXNoKHZhbHVlMik7CiAgfQogIGZ1bmN0aW9uIHJhdzIodmFsdWUyKSB7CiAgICBzZXREYXRhKCJsYXN0V2FzVGFnIik7CiAgICBidWZmZXJzW2J1ZmZlcnMubGVuZ3RoIC0gMV0ucHVzaCh2YWx1ZTIpOwogIH0KICBmdW5jdGlvbiBsaW5lRW5kaW5nMigpIHsKICAgIHJhdzIobGluZUVuZGluZ1N0eWxlIHx8ICJcbiIpOwogIH0KICBmdW5jdGlvbiBsaW5lRW5kaW5nSWZOZWVkZWQoKSB7CiAgICBjb25zdCBidWZmZXIzID0gYnVmZmVyc1tidWZmZXJzLmxlbmd0aCAtIDFdOwogICAgY29uc3Qgc2xpY2UgPSBidWZmZXIzW2J1ZmZlcjMubGVuZ3RoIC0gMV07CiAgICBjb25zdCBwcmV2aW91czMgPSBzbGljZSA/IHNsaWNlLmNoYXJDb2RlQXQoc2xpY2UubGVuZ3RoIC0gMSkgOiBudWxsOwogICAgaWYgKHByZXZpb3VzMyA9PT0gMTAgfHwgcHJldmlvdXMzID09PSAxMyB8fCBwcmV2aW91czMgPT09IG51bGwpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGluZUVuZGluZzIoKTsKICB9CiAgZnVuY3Rpb24gZW5jb2RlMih2YWx1ZTIpIHsKICAgIHJldHVybiBnZXREYXRhKCJpZ25vcmVFbmNvZGUiKSA/IHZhbHVlMiA6IGVuY29kZSh2YWx1ZTIpOwogIH0KICBmdW5jdGlvbiBvbnJlc3VtZWRyb3AoKSB7CiAgICByZXN1bWUoKTsKICB9CiAgZnVuY3Rpb24gb25lbnRlcmxpc3RvcmRlcmVkKHRva2VuKSB7CiAgICB0aWdodFN0YWNrLnB1c2goIXRva2VuLl9sb29zZSk7CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIHRhZygiPG9sIik7CiAgICBzZXREYXRhKCJleHBlY3RGaXJzdEl0ZW0iLCB0cnVlKTsKICB9CiAgZnVuY3Rpb24gb25lbnRlcmxpc3R1bm9yZGVyZWQodG9rZW4pIHsKICAgIHRpZ2h0U3RhY2sucHVzaCghdG9rZW4uX2xvb3NlKTsKICAgIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgdGFnKCI8dWwiKTsKICAgIHNldERhdGEoImV4cGVjdEZpcnN0SXRlbSIsIHRydWUpOwogIH0KICBmdW5jdGlvbiBvbmVudGVybGlzdGl0ZW12YWx1ZSh0b2tlbikgewogICAgaWYgKGdldERhdGEoImV4cGVjdEZpcnN0SXRlbSIpKSB7CiAgICAgIGNvbnN0IHZhbHVlMiA9IE51bWJlci5wYXJzZUludCh0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKSwgMTApOwogICAgICBpZiAodmFsdWUyICE9PSAxKSB7CiAgICAgICAgdGFnKCcgc3RhcnQ9IicgKyBlbmNvZGUyKFN0cmluZyh2YWx1ZTIpKSArICciJyk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gb25lbnRlcmxpc3RpdGVtbWFya2VyKCkgewogICAgaWYgKGdldERhdGEoImV4cGVjdEZpcnN0SXRlbSIpKSB7CiAgICAgIHRhZygiPiIpOwogICAgfSBlbHNlIHsKICAgICAgb25leGl0bGlzdGl0ZW0oKTsKICAgIH0KICAgIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgdGFnKCI8bGk+Iik7CiAgICBzZXREYXRhKCJleHBlY3RGaXJzdEl0ZW0iKTsKICAgIHNldERhdGEoImxhc3RXYXNUYWciKTsKICB9CiAgZnVuY3Rpb24gb25leGl0bGlzdG9yZGVyZWQoKSB7CiAgICBvbmV4aXRsaXN0aXRlbSgpOwogICAgdGlnaHRTdGFjay5wb3AoKTsKICAgIGxpbmVFbmRpbmcyKCk7CiAgICB0YWcoIjwvb2w+Iik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGxpc3R1bm9yZGVyZWQoKSB7CiAgICBvbmV4aXRsaXN0aXRlbSgpOwogICAgdGlnaHRTdGFjay5wb3AoKTsKICAgIGxpbmVFbmRpbmcyKCk7CiAgICB0YWcoIjwvdWw+Iik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGxpc3RpdGVtKCkgewogICAgaWYgKGdldERhdGEoImxhc3RXYXNUYWciKSAmJiAhZ2V0RGF0YSgic2x1cnBBbGxMaW5lRW5kaW5ncyIpKSB7CiAgICAgIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgfQogICAgdGFnKCI8L2xpPiIpOwogICAgc2V0RGF0YSgic2x1cnBBbGxMaW5lRW5kaW5ncyIpOwogIH0KICBmdW5jdGlvbiBvbmVudGVyYmxvY2txdW90ZSgpIHsKICAgIHRpZ2h0U3RhY2sucHVzaChmYWxzZSk7CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIHRhZygiPGJsb2NrcXVvdGU+Iik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGJsb2NrcXVvdGUoKSB7CiAgICB0aWdodFN0YWNrLnBvcCgpOwogICAgbGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICB0YWcoIjwvYmxvY2txdW90ZT4iKTsKICAgIHNldERhdGEoInNsdXJwQWxsTGluZUVuZGluZ3MiKTsKICB9CiAgZnVuY3Rpb24gb25lbnRlcnBhcmFncmFwaCgpIHsKICAgIGlmICghdGlnaHRTdGFja1t0aWdodFN0YWNrLmxlbmd0aCAtIDFdKSB7CiAgICAgIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICB0YWcoIjxwPiIpOwogICAgfQogICAgc2V0RGF0YSgic2x1cnBBbGxMaW5lRW5kaW5ncyIpOwogIH0KICBmdW5jdGlvbiBvbmV4aXRwYXJhZ3JhcGgoKSB7CiAgICBpZiAodGlnaHRTdGFja1t0aWdodFN0YWNrLmxlbmd0aCAtIDFdKSB7CiAgICAgIHNldERhdGEoInNsdXJwQWxsTGluZUVuZGluZ3MiLCB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRhZygiPC9wPiIpOwogICAgfQogIH0KICBmdW5jdGlvbiBvbmVudGVyY29kZWZlbmNlZCgpIHsKICAgIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgdGFnKCI8cHJlPjxjb2RlIik7CiAgICBzZXREYXRhKCJmZW5jZXNDb3VudCIsIDApOwogIH0KICBmdW5jdGlvbiBvbmV4aXRjb2RlZmVuY2VkZmVuY2VpbmZvKCkgewogICAgY29uc3QgdmFsdWUyID0gcmVzdW1lKCk7CiAgICB0YWcoJyBjbGFzcz0ibGFuZ3VhZ2UtJyArIHZhbHVlMiArICciJyk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGNvZGVmZW5jZWRmZW5jZSgpIHsKICAgIGNvbnN0IGNvdW50MiA9IGdldERhdGEoImZlbmNlc0NvdW50IikgfHwgMDsKICAgIGlmICghY291bnQyKSB7CiAgICAgIHRhZygiPiIpOwogICAgICBzZXREYXRhKCJzbHVycE9uZUxpbmVFbmRpbmciLCB0cnVlKTsKICAgIH0KICAgIHNldERhdGEoImZlbmNlc0NvdW50IiwgY291bnQyICsgMSk7CiAgfQogIGZ1bmN0aW9uIG9uZW50ZXJjb2RlaW5kZW50ZWQoKSB7CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIHRhZygiPHByZT48Y29kZT4iKTsKICB9CiAgZnVuY3Rpb24gb25leGl0Zmxvd2NvZGUoKSB7CiAgICBjb25zdCBjb3VudDIgPSBnZXREYXRhKCJmZW5jZXNDb3VudCIpOwogICAgaWYgKGNvdW50MiAhPT0gdm9pZCAwICYmIGNvdW50MiA8IDIgJiYgZGF0YS50aWdodFN0YWNrLmxlbmd0aCA+IDAgJiYgIWdldERhdGEoImxhc3RXYXNUYWciKSkgewogICAgICBsaW5lRW5kaW5nMigpOwogICAgfQogICAgaWYgKGdldERhdGEoImZsb3dDb2RlU2VlbkRhdGEiKSkgewogICAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIH0KICAgIHRhZygiPC9jb2RlPjwvcHJlPiIpOwogICAgaWYgKGNvdW50MiAhPT0gdm9pZCAwICYmIGNvdW50MiA8IDIpIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgc2V0RGF0YSgiZmxvd0NvZGVTZWVuRGF0YSIpOwogICAgc2V0RGF0YSgiZmVuY2VzQ291bnQiKTsKICAgIHNldERhdGEoInNsdXJwT25lTGluZUVuZGluZyIpOwogIH0KICBmdW5jdGlvbiBvbmVudGVyaW1hZ2UoKSB7CiAgICBtZWRpYVN0YWNrLnB1c2goewogICAgICBpbWFnZTogdHJ1ZQogICAgfSk7CiAgICB0YWdzID0gdm9pZCAwOwogIH0KICBmdW5jdGlvbiBvbmVudGVybGluaygpIHsKICAgIG1lZGlhU3RhY2sucHVzaCh7fSk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGxhYmVsdGV4dCh0b2tlbikgewogICAgbWVkaWFTdGFja1ttZWRpYVN0YWNrLmxlbmd0aCAtIDFdLmxhYmVsSWQgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICB9CiAgZnVuY3Rpb24gb25leGl0bGFiZWwoKSB7CiAgICBtZWRpYVN0YWNrW21lZGlhU3RhY2subGVuZ3RoIC0gMV0ubGFiZWwgPSByZXN1bWUoKTsKICB9CiAgZnVuY3Rpb24gb25leGl0cmVmZXJlbmNlc3RyaW5nKHRva2VuKSB7CiAgICBtZWRpYVN0YWNrW21lZGlhU3RhY2subGVuZ3RoIC0gMV0ucmVmZXJlbmNlSWQgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICB9CiAgZnVuY3Rpb24gb25lbnRlcnJlc291cmNlKCkgewogICAgYnVmZmVyMigpOwogICAgbWVkaWFTdGFja1ttZWRpYVN0YWNrLmxlbmd0aCAtIDFdLmRlc3RpbmF0aW9uID0gIiI7CiAgfQogIGZ1bmN0aW9uIG9uZW50ZXJyZXNvdXJjZWRlc3RpbmF0aW9uc3RyaW5nKCkgewogICAgYnVmZmVyMigpOwogICAgc2V0RGF0YSgiaWdub3JlRW5jb2RlIiwgdHJ1ZSk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdHJlc291cmNlZGVzdGluYXRpb25zdHJpbmcoKSB7CiAgICBtZWRpYVN0YWNrW21lZGlhU3RhY2subGVuZ3RoIC0gMV0uZGVzdGluYXRpb24gPSByZXN1bWUoKTsKICAgIHNldERhdGEoImlnbm9yZUVuY29kZSIpOwogIH0KICBmdW5jdGlvbiBvbmV4aXRyZXNvdXJjZXRpdGxlc3RyaW5nKCkgewogICAgbWVkaWFTdGFja1ttZWRpYVN0YWNrLmxlbmd0aCAtIDFdLnRpdGxlID0gcmVzdW1lKCk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdG1lZGlhKCkgewogICAgbGV0IGluZGV4MiA9IG1lZGlhU3RhY2subGVuZ3RoIC0gMTsKICAgIGNvbnN0IG1lZGlhID0gbWVkaWFTdGFja1tpbmRleDJdOwogICAgY29uc3QgaWQgPSBtZWRpYS5yZWZlcmVuY2VJZCB8fCBtZWRpYS5sYWJlbElkOwogICAgY29uc3QgY29udGV4dDMgPSBtZWRpYS5kZXN0aW5hdGlvbiA9PT0gdm9pZCAwID8gZGVmaW5pdGlvbnNbbm9ybWFsaXplSWRlbnRpZmllcihpZCldIDogbWVkaWE7CiAgICB0YWdzID0gdHJ1ZTsKICAgIHdoaWxlIChpbmRleDItLSkgewogICAgICBpZiAobWVkaWFTdGFja1tpbmRleDJdLmltYWdlKSB7CiAgICAgICAgdGFncyA9IHZvaWQgMDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKG1lZGlhLmltYWdlKSB7CiAgICAgIHRhZygnPGltZyBzcmM9IicgKyBzYW5pdGl6ZVVyaShjb250ZXh0My5kZXN0aW5hdGlvbiwgc2V0dGluZ3MuYWxsb3dEYW5nZXJvdXNQcm90b2NvbCA/IHZvaWQgMCA6IHByb3RvY29sU291cmNlKSArICciIGFsdD0iJyk7CiAgICAgIHJhdzIobWVkaWEubGFiZWwpOwogICAgICB0YWcoJyInKTsKICAgIH0gZWxzZSB7CiAgICAgIHRhZygnPGEgaHJlZj0iJyArIHNhbml0aXplVXJpKGNvbnRleHQzLmRlc3RpbmF0aW9uLCBzZXR0aW5ncy5hbGxvd0Rhbmdlcm91c1Byb3RvY29sID8gdm9pZCAwIDogcHJvdG9jb2xIcmVmKSArICciJyk7CiAgICB9CiAgICB0YWcoY29udGV4dDMudGl0bGUgPyAnIHRpdGxlPSInICsgY29udGV4dDMudGl0bGUgKyAnIicgOiAiIik7CiAgICBpZiAobWVkaWEuaW1hZ2UpIHsKICAgICAgdGFnKCIgLz4iKTsKICAgIH0gZWxzZSB7CiAgICAgIHRhZygiPiIpOwogICAgICByYXcyKG1lZGlhLmxhYmVsKTsKICAgICAgdGFnKCI8L2E+Iik7CiAgICB9CiAgICBtZWRpYVN0YWNrLnBvcCgpOwogIH0KICBmdW5jdGlvbiBvbmVudGVyZGVmaW5pdGlvbigpIHsKICAgIGJ1ZmZlcjIoKTsKICAgIG1lZGlhU3RhY2sucHVzaCh7fSk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZyh0b2tlbikgewogICAgcmVzdW1lKCk7CiAgICBtZWRpYVN0YWNrW21lZGlhU3RhY2subGVuZ3RoIC0gMV0ubGFiZWxJZCA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwogIH0KICBmdW5jdGlvbiBvbmVudGVyZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nKCkgewogICAgYnVmZmVyMigpOwogICAgc2V0RGF0YSgiaWdub3JlRW5jb2RlIiwgdHJ1ZSk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGRlZmluaXRpb25kZXN0aW5hdGlvbnN0cmluZygpIHsKICAgIG1lZGlhU3RhY2tbbWVkaWFTdGFjay5sZW5ndGggLSAxXS5kZXN0aW5hdGlvbiA9IHJlc3VtZSgpOwogICAgc2V0RGF0YSgiaWdub3JlRW5jb2RlIik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGRlZmluaXRpb250aXRsZXN0cmluZygpIHsKICAgIG1lZGlhU3RhY2tbbWVkaWFTdGFjay5sZW5ndGggLSAxXS50aXRsZSA9IHJlc3VtZSgpOwogIH0KICBmdW5jdGlvbiBvbmV4aXRkZWZpbml0aW9uKCkgewogICAgY29uc3QgbWVkaWEgPSBtZWRpYVN0YWNrW21lZGlhU3RhY2subGVuZ3RoIC0gMV07CiAgICBjb25zdCBpZCA9IG5vcm1hbGl6ZUlkZW50aWZpZXIobWVkaWEubGFiZWxJZCk7CiAgICByZXN1bWUoKTsKICAgIGlmICghaGFzT3duUHJvcGVydHkyLmNhbGwoZGVmaW5pdGlvbnMsIGlkKSkgewogICAgICBkZWZpbml0aW9uc1tpZF0gPSBtZWRpYVN0YWNrW21lZGlhU3RhY2subGVuZ3RoIC0gMV07CiAgICB9CiAgICBtZWRpYVN0YWNrLnBvcCgpOwogIH0KICBmdW5jdGlvbiBvbmVudGVyY29udGVudCgpIHsKICAgIHNldERhdGEoInNsdXJwQWxsTGluZUVuZGluZ3MiLCB0cnVlKTsKICB9CiAgZnVuY3Rpb24gb25leGl0YXR4aGVhZGluZ3NlcXVlbmNlKHRva2VuKSB7CiAgICBpZiAoZ2V0RGF0YSgiaGVhZGluZ1JhbmsiKSkgcmV0dXJuOwogICAgc2V0RGF0YSgiaGVhZGluZ1JhbmsiLCB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKS5sZW5ndGgpOwogICAgbGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICB0YWcoIjxoIiArIGdldERhdGEoImhlYWRpbmdSYW5rIikgKyAiPiIpOwogIH0KICBmdW5jdGlvbiBvbmVudGVyc2V0ZXh0aGVhZGluZygpIHsKICAgIGJ1ZmZlcjIoKTsKICAgIHNldERhdGEoInNsdXJwQWxsTGluZUVuZGluZ3MiKTsKICB9CiAgZnVuY3Rpb24gb25leGl0c2V0ZXh0aGVhZGluZ3RleHQoKSB7CiAgICBzZXREYXRhKCJzbHVycEFsbExpbmVFbmRpbmdzIiwgdHJ1ZSk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGF0eGhlYWRpbmcoKSB7CiAgICB0YWcoIjwvaCIgKyBnZXREYXRhKCJoZWFkaW5nUmFuayIpICsgIj4iKTsKICAgIHNldERhdGEoImhlYWRpbmdSYW5rIik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdHNldGV4dGhlYWRpbmdsaW5lc2VxdWVuY2UodG9rZW4pIHsKICAgIHNldERhdGEoImhlYWRpbmdSYW5rIiwgdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbikuY2hhckNvZGVBdCgwKSA9PT0gNjEgPyAxIDogMik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdHNldGV4dGhlYWRpbmcoKSB7CiAgICBjb25zdCB2YWx1ZTIgPSByZXN1bWUoKTsKICAgIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgdGFnKCI8aCIgKyBnZXREYXRhKCJoZWFkaW5nUmFuayIpICsgIj4iKTsKICAgIHJhdzIodmFsdWUyKTsKICAgIHRhZygiPC9oIiArIGdldERhdGEoImhlYWRpbmdSYW5rIikgKyAiPiIpOwogICAgc2V0RGF0YSgic2x1cnBBbGxMaW5lRW5kaW5ncyIpOwogICAgc2V0RGF0YSgiaGVhZGluZ1JhbmsiKTsKICB9CiAgZnVuY3Rpb24gb25leGl0ZGF0YSh0b2tlbikgewogICAgcmF3MihlbmNvZGUyKHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pKSk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGxpbmVlbmRpbmcodG9rZW4pIHsKICAgIGlmIChnZXREYXRhKCJzbHVycEFsbExpbmVFbmRpbmdzIikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGdldERhdGEoInNsdXJwT25lTGluZUVuZGluZyIpKSB7CiAgICAgIHNldERhdGEoInNsdXJwT25lTGluZUVuZGluZyIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZ2V0RGF0YSgiaW5Db2RlVGV4dCIpKSB7CiAgICAgIHJhdzIoIiAiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgcmF3MihlbmNvZGUyKHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pKSk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGNvZGVmbG93dmFsdWUodG9rZW4pIHsKICAgIHJhdzIoZW5jb2RlMih0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKSkpOwogICAgc2V0RGF0YSgiZmxvd0NvZGVTZWVuRGF0YSIsIHRydWUpOwogIH0KICBmdW5jdGlvbiBvbmV4aXRoYXJkYnJlYWsoKSB7CiAgICB0YWcoIjxiciAvPiIpOwogIH0KICBmdW5jdGlvbiBvbmVudGVyaHRtbGZsb3coKSB7CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIG9uZW50ZXJodG1sKCk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGh0bWwoKSB7CiAgICBzZXREYXRhKCJpZ25vcmVFbmNvZGUiKTsKICB9CiAgZnVuY3Rpb24gb25lbnRlcmh0bWwoKSB7CiAgICBpZiAoc2V0dGluZ3MuYWxsb3dEYW5nZXJvdXNIdG1sKSB7CiAgICAgIHNldERhdGEoImlnbm9yZUVuY29kZSIsIHRydWUpOwogICAgfQogIH0KICBmdW5jdGlvbiBvbmVudGVyZW1waGFzaXMoKSB7CiAgICB0YWcoIjxlbT4iKTsKICB9CiAgZnVuY3Rpb24gb25lbnRlcnN0cm9uZygpIHsKICAgIHRhZygiPHN0cm9uZz4iKTsKICB9CiAgZnVuY3Rpb24gb25lbnRlcmNvZGV0ZXh0KCkgewogICAgc2V0RGF0YSgiaW5Db2RlVGV4dCIsIHRydWUpOwogICAgdGFnKCI8Y29kZT4iKTsKICB9CiAgZnVuY3Rpb24gb25leGl0Y29kZXRleHQoKSB7CiAgICBzZXREYXRhKCJpbkNvZGVUZXh0Iik7CiAgICB0YWcoIjwvY29kZT4iKTsKICB9CiAgZnVuY3Rpb24gb25leGl0ZW1waGFzaXMoKSB7CiAgICB0YWcoIjwvZW0+Iik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdHN0cm9uZygpIHsKICAgIHRhZygiPC9zdHJvbmc+Iik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdHRoZW1hdGljYnJlYWsoKSB7CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIHRhZygiPGhyIC8+Iik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZW1hcmtlcih0b2tlbikgewogICAgc2V0RGF0YSgiY2hhcmFjdGVyUmVmZXJlbmNlVHlwZSIsIHRva2VuLnR5cGUpOwogIH0KICBmdW5jdGlvbiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2V2YWx1ZSh0b2tlbikgewogICAgY29uc3QgdmFsdWUyID0gdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbik7CiAgICBjb25zdCBkZWNvZGVkID0gZ2V0RGF0YSgiY2hhcmFjdGVyUmVmZXJlbmNlVHlwZSIpID8gZGVjb2RlTnVtZXJpY0NoYXJhY3RlclJlZmVyZW5jZSh2YWx1ZTIsIGdldERhdGEoImNoYXJhY3RlclJlZmVyZW5jZVR5cGUiKSA9PT0gImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlck51bWVyaWMiID8gMTAgOiAxNikgOiBkZWNvZGVOYW1lZENoYXJhY3RlclJlZmVyZW5jZSh2YWx1ZTIpOwogICAgcmF3MihlbmNvZGUyKAogICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgZGVjb2RlZAogICAgKSk7CiAgICBzZXREYXRhKCJjaGFyYWN0ZXJSZWZlcmVuY2VUeXBlIik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGF1dG9saW5rcHJvdG9jb2wodG9rZW4pIHsKICAgIGNvbnN0IHVyaSA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwogICAgdGFnKCc8YSBocmVmPSInICsgc2FuaXRpemVVcmkodXJpLCBzZXR0aW5ncy5hbGxvd0Rhbmdlcm91c1Byb3RvY29sID8gdm9pZCAwIDogcHJvdG9jb2xIcmVmKSArICciPicpOwogICAgcmF3MihlbmNvZGUyKHVyaSkpOwogICAgdGFnKCI8L2E+Iik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGF1dG9saW5rZW1haWwodG9rZW4pIHsKICAgIGNvbnN0IHVyaSA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwogICAgdGFnKCc8YSBocmVmPSInICsgc2FuaXRpemVVcmkoIm1haWx0bzoiICsgdXJpKSArICciPicpOwogICAgcmF3MihlbmNvZGUyKHVyaSkpOwogICAgdGFnKCI8L2E+Iik7CiAgfQp9CnZhciBoYXNPd25Qcm9wZXJ0eTIsIHByb3RvY29sSHJlZiwgcHJvdG9jb2xTb3VyY2U7CnZhciBpbml0X2NvbXBpbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvY29tcGlsZS5qcyIoKSB7CiAgICBpbml0X2luZGV4X2RvbSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaHVua2VkKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NvbWJpbmVfZXh0ZW5zaW9ucygpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9kZWNvZGVfbnVtZXJpY19jaGFyYWN0ZXJfcmVmZXJlbmNlKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2VuY29kZSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9ub3JtYWxpemVfaWRlbnRpZmllcigpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9zYW5pdGl6ZV91cmkoKTsKICAgIGhhc093blByb3BlcnR5MiA9IHt9Lmhhc093blByb3BlcnR5OwogICAgcHJvdG9jb2xIcmVmID0gL14oaHR0cHM/fGlyY3M/fG1haWx0b3x4bXBwKSQvaTsKICAgIHByb3RvY29sU291cmNlID0gL15odHRwcz8kL2k7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvaW5pdGlhbGl6ZS9jb250ZW50LmpzCmZ1bmN0aW9uIGluaXRpYWxpemVDb250ZW50KGVmZmVjdHMpIHsKICBjb25zdCBjb250ZW50U3RhcnQgPSBlZmZlY3RzLmF0dGVtcHQodGhpcy5wYXJzZXIuY29uc3RydWN0cy5jb250ZW50SW5pdGlhbCwgYWZ0ZXJDb250ZW50U3RhcnRDb25zdHJ1Y3QsIHBhcmFncmFwaEluaXRpYWwpOwogIGxldCBwcmV2aW91czM7CiAgcmV0dXJuIGNvbnRlbnRTdGFydDsKICBmdW5jdGlvbiBhZnRlckNvbnRlbnRTdGFydENvbnN0cnVjdChjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgY29udGVudFN0YXJ0LCAibGluZVByZWZpeCIpOwogIH0KICBmdW5jdGlvbiBwYXJhZ3JhcGhJbml0aWFsKGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJwYXJhZ3JhcGgiKTsKICAgIHJldHVybiBsaW5lU3RhcnQoY29kZTQpOwogIH0KICBmdW5jdGlvbiBsaW5lU3RhcnQoY29kZTQpIHsKICAgIGNvbnN0IHRva2VuID0gZWZmZWN0cy5lbnRlcigiY2h1bmtUZXh0IiwgewogICAgICBjb250ZW50VHlwZTogInRleHQiLAogICAgICBwcmV2aW91czogcHJldmlvdXMzCiAgICB9KTsKICAgIGlmIChwcmV2aW91czMpIHsKICAgICAgcHJldmlvdXMzLm5leHQgPSB0b2tlbjsKICAgIH0KICAgIHByZXZpb3VzMyA9IHRva2VuOwogICAgcmV0dXJuIGRhdGEoY29kZTQpOwogIH0KICBmdW5jdGlvbiBkYXRhKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgZWZmZWN0cy5leGl0KCJjaHVua1RleHQiKTsKICAgICAgZWZmZWN0cy5leGl0KCJwYXJhZ3JhcGgiKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJjaHVua1RleHQiKTsKICAgICAgcmV0dXJuIGxpbmVTdGFydDsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gZGF0YTsKICB9Cn0KdmFyIGNvbnRlbnQyOwp2YXIgaW5pdF9jb250ZW50MiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFya0A0LjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrL2xpYi9pbml0aWFsaXplL2NvbnRlbnQuanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9zcGFjZSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGNvbnRlbnQyID0gewogICAgICB0b2tlbml6ZTogaW5pdGlhbGl6ZUNvbnRlbnQKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvaW5pdGlhbGl6ZS9kb2N1bWVudC5qcwpmdW5jdGlvbiBpbml0aWFsaXplRG9jdW1lbnQoZWZmZWN0cykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBjb25zdCBzdGFjayA9IFtdOwogIGxldCBjb250aW51ZWQgPSAwOwogIGxldCBjaGlsZEZsb3c7CiAgbGV0IGNoaWxkVG9rZW47CiAgbGV0IGxpbmVTdGFydE9mZnNldDsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGlmIChjb250aW51ZWQgPCBzdGFjay5sZW5ndGgpIHsKICAgICAgY29uc3QgaXRlbSA9IHN0YWNrW2NvbnRpbnVlZF07CiAgICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlID0gaXRlbVsxXTsKICAgICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChpdGVtWzBdLmNvbnRpbnVhdGlvbiwgZG9jdW1lbnRDb250aW51ZSwgY2hlY2tOZXdDb250YWluZXJzKShjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gY2hlY2tOZXdDb250YWluZXJzKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gZG9jdW1lbnRDb250aW51ZShjb2RlNCkgewogICAgY29udGludWVkKys7CiAgICBpZiAoc2VsZjIuY29udGFpbmVyU3RhdGUuX2Nsb3NlRmxvdykgewogICAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5fY2xvc2VGbG93ID0gdm9pZCAwOwogICAgICBpZiAoY2hpbGRGbG93KSB7CiAgICAgICAgY2xvc2VGbG93KCk7CiAgICAgIH0KICAgICAgY29uc3QgaW5kZXhCZWZvcmVFeGl0cyA9IHNlbGYyLmV2ZW50cy5sZW5ndGg7CiAgICAgIGxldCBpbmRleEJlZm9yZUZsb3cgPSBpbmRleEJlZm9yZUV4aXRzOwogICAgICBsZXQgcG9pbnQ0OwogICAgICB3aGlsZSAoaW5kZXhCZWZvcmVGbG93LS0pIHsKICAgICAgICBpZiAoc2VsZjIuZXZlbnRzW2luZGV4QmVmb3JlRmxvd11bMF0gPT09ICJleGl0IiAmJiBzZWxmMi5ldmVudHNbaW5kZXhCZWZvcmVGbG93XVsxXS50eXBlID09PSAiY2h1bmtGbG93IikgewogICAgICAgICAgcG9pbnQ0ID0gc2VsZjIuZXZlbnRzW2luZGV4QmVmb3JlRmxvd11bMV0uZW5kOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGV4aXRDb250YWluZXJzKGNvbnRpbnVlZCk7CiAgICAgIGxldCBpbmRleDIgPSBpbmRleEJlZm9yZUV4aXRzOwogICAgICB3aGlsZSAoaW5kZXgyIDwgc2VsZjIuZXZlbnRzLmxlbmd0aCkgewogICAgICAgIHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLmVuZCA9IHsKICAgICAgICAgIC4uLnBvaW50NAogICAgICAgIH07CiAgICAgICAgaW5kZXgyKys7CiAgICAgIH0KICAgICAgc3BsaWNlKHNlbGYyLmV2ZW50cywgaW5kZXhCZWZvcmVGbG93ICsgMSwgMCwgc2VsZjIuZXZlbnRzLnNsaWNlKGluZGV4QmVmb3JlRXhpdHMpKTsKICAgICAgc2VsZjIuZXZlbnRzLmxlbmd0aCA9IGluZGV4MjsKICAgICAgcmV0dXJuIGNoZWNrTmV3Q29udGFpbmVycyhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gc3RhcnQoY29kZTQpOwogIH0KICBmdW5jdGlvbiBjaGVja05ld0NvbnRhaW5lcnMoY29kZTQpIHsKICAgIGlmIChjb250aW51ZWQgPT09IHN0YWNrLmxlbmd0aCkgewogICAgICBpZiAoIWNoaWxkRmxvdykgewogICAgICAgIHJldHVybiBkb2N1bWVudENvbnRpbnVlZChjb2RlNCk7CiAgICAgIH0KICAgICAgaWYgKGNoaWxkRmxvdy5jdXJyZW50Q29uc3RydWN0ICYmIGNoaWxkRmxvdy5jdXJyZW50Q29uc3RydWN0LmNvbmNyZXRlKSB7CiAgICAgICAgcmV0dXJuIGZsb3dTdGFydChjb2RlNCk7CiAgICAgIH0KICAgICAgc2VsZjIuaW50ZXJydXB0ID0gQm9vbGVhbihjaGlsZEZsb3cuY3VycmVudENvbnN0cnVjdCAmJiAhY2hpbGRGbG93Ll9nZm1UYWJsZUR5bmFtaWNJbnRlcnJ1cHRIYWNrKTsKICAgIH0KICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlID0ge307CiAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhjb250YWluZXJDb25zdHJ1Y3QsIHRoZXJlSXNBTmV3Q29udGFpbmVyLCB0aGVyZUlzTm9OZXdDb250YWluZXIpKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdGhlcmVJc0FOZXdDb250YWluZXIoY29kZTQpIHsKICAgIGlmIChjaGlsZEZsb3cpIGNsb3NlRmxvdygpOwogICAgZXhpdENvbnRhaW5lcnMoY29udGludWVkKTsKICAgIHJldHVybiBkb2N1bWVudENvbnRpbnVlZChjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHRoZXJlSXNOb05ld0NvbnRhaW5lcihjb2RlNCkgewogICAgc2VsZjIucGFyc2VyLmxhenlbc2VsZjIubm93KCkubGluZV0gPSBjb250aW51ZWQgIT09IHN0YWNrLmxlbmd0aDsKICAgIGxpbmVTdGFydE9mZnNldCA9IHNlbGYyLm5vdygpLm9mZnNldDsKICAgIHJldHVybiBmbG93U3RhcnQoY29kZTQpOwogIH0KICBmdW5jdGlvbiBkb2N1bWVudENvbnRpbnVlZChjb2RlNCkgewogICAgc2VsZjIuY29udGFpbmVyU3RhdGUgPSB7fTsKICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoY29udGFpbmVyQ29uc3RydWN0LCBjb250YWluZXJDb250aW51ZSwgZmxvd1N0YXJ0KShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbnRhaW5lckNvbnRpbnVlKGNvZGU0KSB7CiAgICBjb250aW51ZWQrKzsKICAgIHN0YWNrLnB1c2goW3NlbGYyLmN1cnJlbnRDb25zdHJ1Y3QsIHNlbGYyLmNvbnRhaW5lclN0YXRlXSk7CiAgICByZXR1cm4gZG9jdW1lbnRDb250aW51ZWQoY29kZTQpOwogIH0KICBmdW5jdGlvbiBmbG93U3RhcnQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICBpZiAoY2hpbGRGbG93KSBjbG9zZUZsb3coKTsKICAgICAgZXhpdENvbnRhaW5lcnMoMCk7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNoaWxkRmxvdyA9IGNoaWxkRmxvdyB8fCBzZWxmMi5wYXJzZXIuZmxvdyhzZWxmMi5ub3coKSk7CiAgICBlZmZlY3RzLmVudGVyKCJjaHVua0Zsb3ciLCB7CiAgICAgIF90b2tlbml6ZXI6IGNoaWxkRmxvdywKICAgICAgY29udGVudFR5cGU6ICJmbG93IiwKICAgICAgcHJldmlvdXM6IGNoaWxkVG9rZW4KICAgIH0pOwogICAgcmV0dXJuIGZsb3dDb250aW51ZShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGZsb3dDb250aW51ZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIHdyaXRlVG9DaGlsZChlZmZlY3RzLmV4aXQoImNodW5rRmxvdyIpLCB0cnVlKTsKICAgICAgZXhpdENvbnRhaW5lcnMoMCk7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHdyaXRlVG9DaGlsZChlZmZlY3RzLmV4aXQoImNodW5rRmxvdyIpKTsKICAgICAgY29udGludWVkID0gMDsKICAgICAgc2VsZjIuaW50ZXJydXB0ID0gdm9pZCAwOwogICAgICByZXR1cm4gc3RhcnQ7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGZsb3dDb250aW51ZTsKICB9CiAgZnVuY3Rpb24gd3JpdGVUb0NoaWxkKHRva2VuLCBlbmRPZkZpbGUpIHsKICAgIGNvbnN0IHN0cmVhbSA9IHNlbGYyLnNsaWNlU3RyZWFtKHRva2VuKTsKICAgIGlmIChlbmRPZkZpbGUpIHN0cmVhbS5wdXNoKG51bGwpOwogICAgdG9rZW4ucHJldmlvdXMgPSBjaGlsZFRva2VuOwogICAgaWYgKGNoaWxkVG9rZW4pIGNoaWxkVG9rZW4ubmV4dCA9IHRva2VuOwogICAgY2hpbGRUb2tlbiA9IHRva2VuOwogICAgY2hpbGRGbG93LmRlZmluZVNraXAodG9rZW4uc3RhcnQpOwogICAgY2hpbGRGbG93LndyaXRlKHN0cmVhbSk7CiAgICBpZiAoc2VsZjIucGFyc2VyLmxhenlbdG9rZW4uc3RhcnQubGluZV0pIHsKICAgICAgbGV0IGluZGV4MiA9IGNoaWxkRmxvdy5ldmVudHMubGVuZ3RoOwogICAgICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgICAgICBpZiAoCiAgICAgICAgICAvLyBUaGUgdG9rZW4gc3RhcnRzIGJlZm9yZSB0aGUgbGluZSBlbmRpbmfigKYKICAgICAgICAgIGNoaWxkRmxvdy5ldmVudHNbaW5kZXgyXVsxXS5zdGFydC5vZmZzZXQgPCBsaW5lU3RhcnRPZmZzZXQgJiYgLy8g4oCmYW5kIGVpdGhlciBpcyBub3QgZW5kZWQgeWV04oCmCiAgICAgICAgICAoIWNoaWxkRmxvdy5ldmVudHNbaW5kZXgyXVsxXS5lbmQgfHwgLy8g4oCmb3IgZW5kcyBhZnRlciBpdC4KICAgICAgICAgIGNoaWxkRmxvdy5ldmVudHNbaW5kZXgyXVsxXS5lbmQub2Zmc2V0ID4gbGluZVN0YXJ0T2Zmc2V0KQogICAgICAgICkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBpbmRleEJlZm9yZUV4aXRzID0gc2VsZjIuZXZlbnRzLmxlbmd0aDsKICAgICAgbGV0IGluZGV4QmVmb3JlRmxvdyA9IGluZGV4QmVmb3JlRXhpdHM7CiAgICAgIGxldCBzZWVuOwogICAgICBsZXQgcG9pbnQ0OwogICAgICB3aGlsZSAoaW5kZXhCZWZvcmVGbG93LS0pIHsKICAgICAgICBpZiAoc2VsZjIuZXZlbnRzW2luZGV4QmVmb3JlRmxvd11bMF0gPT09ICJleGl0IiAmJiBzZWxmMi5ldmVudHNbaW5kZXhCZWZvcmVGbG93XVsxXS50eXBlID09PSAiY2h1bmtGbG93IikgewogICAgICAgICAgaWYgKHNlZW4pIHsKICAgICAgICAgICAgcG9pbnQ0ID0gc2VsZjIuZXZlbnRzW2luZGV4QmVmb3JlRmxvd11bMV0uZW5kOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHNlZW4gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBleGl0Q29udGFpbmVycyhjb250aW51ZWQpOwogICAgICBpbmRleDIgPSBpbmRleEJlZm9yZUV4aXRzOwogICAgICB3aGlsZSAoaW5kZXgyIDwgc2VsZjIuZXZlbnRzLmxlbmd0aCkgewogICAgICAgIHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLmVuZCA9IHsKICAgICAgICAgIC4uLnBvaW50NAogICAgICAgIH07CiAgICAgICAgaW5kZXgyKys7CiAgICAgIH0KICAgICAgc3BsaWNlKHNlbGYyLmV2ZW50cywgaW5kZXhCZWZvcmVGbG93ICsgMSwgMCwgc2VsZjIuZXZlbnRzLnNsaWNlKGluZGV4QmVmb3JlRXhpdHMpKTsKICAgICAgc2VsZjIuZXZlbnRzLmxlbmd0aCA9IGluZGV4MjsKICAgIH0KICB9CiAgZnVuY3Rpb24gZXhpdENvbnRhaW5lcnMoc2l6ZSkgewogICAgbGV0IGluZGV4MiA9IHN0YWNrLmxlbmd0aDsKICAgIHdoaWxlIChpbmRleDItLSA+IHNpemUpIHsKICAgICAgY29uc3QgZW50cnkgPSBzdGFja1tpbmRleDJdOwogICAgICBzZWxmMi5jb250YWluZXJTdGF0ZSA9IGVudHJ5WzFdOwogICAgICBlbnRyeVswXS5leGl0LmNhbGwoc2VsZjIsIGVmZmVjdHMpOwogICAgfQogICAgc3RhY2subGVuZ3RoID0gc2l6ZTsKICB9CiAgZnVuY3Rpb24gY2xvc2VGbG93KCkgewogICAgY2hpbGRGbG93LndyaXRlKFtudWxsXSk7CiAgICBjaGlsZFRva2VuID0gdm9pZCAwOwogICAgY2hpbGRGbG93ID0gdm9pZCAwOwogICAgc2VsZjIuY29udGFpbmVyU3RhdGUuX2Nsb3NlRmxvdyA9IHZvaWQgMDsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVDb250YWluZXIoZWZmZWN0cywgb2szLCBub2spIHsKICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGVmZmVjdHMuYXR0ZW1wdCh0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmRvY3VtZW50LCBvazMsIG5vayksICJsaW5lUHJlZml4IiwgdGhpcy5wYXJzZXIuY29uc3RydWN0cy5kaXNhYmxlLm51bGwuaW5jbHVkZXMoImNvZGVJbmRlbnRlZCIpID8gdm9pZCAwIDogNCk7Cn0KdmFyIGRvY3VtZW50MiwgY29udGFpbmVyQ29uc3RydWN0Owp2YXIgaW5pdF9kb2N1bWVudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFya0A0LjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrL2xpYi9pbml0aWFsaXplL2RvY3VtZW50LmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX2ZhY3Rvcnlfc3BhY2UoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NodW5rZWQoKTsKICAgIGRvY3VtZW50MiA9IHsKICAgICAgdG9rZW5pemU6IGluaXRpYWxpemVEb2N1bWVudAogICAgfTsKICAgIGNvbnRhaW5lckNvbnN0cnVjdCA9IHsKICAgICAgdG9rZW5pemU6IHRva2VuaXplQ29udGFpbmVyCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL2luaXRpYWxpemUvZmxvdy5qcwpmdW5jdGlvbiBpbml0aWFsaXplRmxvdyhlZmZlY3RzKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGNvbnN0IGluaXRpYWwyID0gZWZmZWN0cy5hdHRlbXB0KAogICAgLy8gVHJ5IHRvIHBhcnNlIGEgYmxhbmsgbGluZS4KICAgIGJsYW5rTGluZSwKICAgIGF0QmxhbmtFbmRpbmcsCiAgICAvLyBUcnkgdG8gcGFyc2UgaW5pdGlhbCBmbG93IChlc3NlbnRpYWxseSwgb25seSBjb2RlKS4KICAgIGVmZmVjdHMuYXR0ZW1wdCh0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmZsb3dJbml0aWFsLCBhZnRlckNvbnN0cnVjdCwgZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGVmZmVjdHMuYXR0ZW1wdCh0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmZsb3csIGFmdGVyQ29uc3RydWN0LCBlZmZlY3RzLmF0dGVtcHQoY29udGVudCwgYWZ0ZXJDb25zdHJ1Y3QpKSwgImxpbmVQcmVmaXgiKSkKICApOwogIHJldHVybiBpbml0aWFsMjsKICBmdW5jdGlvbiBhdEJsYW5rRW5kaW5nKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZ0JsYW5rIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nQmxhbmsiKTsKICAgIHNlbGYyLmN1cnJlbnRDb25zdHJ1Y3QgPSB2b2lkIDA7CiAgICByZXR1cm4gaW5pdGlhbDI7CiAgfQogIGZ1bmN0aW9uIGFmdGVyQ29uc3RydWN0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZyIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgc2VsZjIuY3VycmVudENvbnN0cnVjdCA9IHZvaWQgMDsKICAgIHJldHVybiBpbml0aWFsMjsKICB9Cn0KdmFyIGZsb3c7CnZhciBpbml0X2Zsb3cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvaW5pdGlhbGl6ZS9mbG93LmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX2NvcmVfY29tbW9ubWFyaygpOwogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9zcGFjZSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGZsb3cgPSB7CiAgICAgIHRva2VuaXplOiBpbml0aWFsaXplRmxvdwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFya0A0LjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrL2xpYi9pbml0aWFsaXplL3RleHQuanMKZnVuY3Rpb24gaW5pdGlhbGl6ZUZhY3RvcnkoZmllbGQpIHsKICByZXR1cm4gewogICAgcmVzb2x2ZUFsbDogY3JlYXRlUmVzb2x2ZXIoZmllbGQgPT09ICJ0ZXh0IiA/IHJlc29sdmVBbGxMaW5lU3VmZml4ZXMgOiB2b2lkIDApLAogICAgdG9rZW5pemU6IGluaXRpYWxpemVUZXh0CiAgfTsKICBmdW5jdGlvbiBpbml0aWFsaXplVGV4dChlZmZlY3RzKSB7CiAgICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgICBjb25zdCBjb25zdHJ1Y3RzMiA9IHRoaXMucGFyc2VyLmNvbnN0cnVjdHNbZmllbGRdOwogICAgY29uc3QgdGV4dDkgPSBlZmZlY3RzLmF0dGVtcHQoY29uc3RydWN0czIsIHN0YXJ0LCBub3RUZXh0KTsKICAgIHJldHVybiBzdGFydDsKICAgIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICAgIHJldHVybiBhdEJyZWFrKGNvZGU0KSA/IHRleHQ5KGNvZGU0KSA6IG5vdFRleHQoY29kZTQpOwogICAgfQogICAgZnVuY3Rpb24gbm90VGV4dChjb2RlNCkgewogICAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlZmZlY3RzLmVudGVyKCJkYXRhIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgZnVuY3Rpb24gZGF0YShjb2RlNCkgewogICAgICBpZiAoYXRCcmVhayhjb2RlNCkpIHsKICAgICAgICBlZmZlY3RzLmV4aXQoImRhdGEiKTsKICAgICAgICByZXR1cm4gdGV4dDkoY29kZTQpOwogICAgICB9CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgZnVuY3Rpb24gYXRCcmVhayhjb2RlNCkgewogICAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBjb25zdCBsaXN0NSA9IGNvbnN0cnVjdHMyW2NvZGU0XTsKICAgICAgbGV0IGluZGV4MiA9IC0xOwogICAgICBpZiAobGlzdDUpIHsKICAgICAgICB3aGlsZSAoKytpbmRleDIgPCBsaXN0NS5sZW5ndGgpIHsKICAgICAgICAgIGNvbnN0IGl0ZW0gPSBsaXN0NVtpbmRleDJdOwogICAgICAgICAgaWYgKCFpdGVtLnByZXZpb3VzIHx8IGl0ZW0ucHJldmlvdXMuY2FsbChzZWxmMiwgc2VsZjIucHJldmlvdXMpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGNyZWF0ZVJlc29sdmVyKGV4dHJhUmVzb2x2ZXIpIHsKICByZXR1cm4gcmVzb2x2ZUFsbFRleHQ7CiAgZnVuY3Rpb24gcmVzb2x2ZUFsbFRleHQoZXZlbnRzLCBjb250ZXh0MikgewogICAgbGV0IGluZGV4MiA9IC0xOwogICAgbGV0IGVudGVyOwogICAgd2hpbGUgKCsraW5kZXgyIDw9IGV2ZW50cy5sZW5ndGgpIHsKICAgICAgaWYgKGVudGVyID09PSB2b2lkIDApIHsKICAgICAgICBpZiAoZXZlbnRzW2luZGV4Ml0gJiYgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImRhdGEiKSB7CiAgICAgICAgICBlbnRlciA9IGluZGV4MjsKICAgICAgICAgIGluZGV4MisrOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICghZXZlbnRzW2luZGV4Ml0gfHwgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSAhPT0gImRhdGEiKSB7CiAgICAgICAgaWYgKGluZGV4MiAhPT0gZW50ZXIgKyAyKSB7CiAgICAgICAgICBldmVudHNbZW50ZXJdWzFdLmVuZCA9IGV2ZW50c1tpbmRleDIgLSAxXVsxXS5lbmQ7CiAgICAgICAgICBldmVudHMuc3BsaWNlKGVudGVyICsgMiwgaW5kZXgyIC0gZW50ZXIgLSAyKTsKICAgICAgICAgIGluZGV4MiA9IGVudGVyICsgMjsKICAgICAgICB9CiAgICAgICAgZW50ZXIgPSB2b2lkIDA7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBleHRyYVJlc29sdmVyID8gZXh0cmFSZXNvbHZlcihldmVudHMsIGNvbnRleHQyKSA6IGV2ZW50czsKICB9Cn0KZnVuY3Rpb24gcmVzb2x2ZUFsbExpbmVTdWZmaXhlcyhldmVudHMsIGNvbnRleHQyKSB7CiAgbGV0IGV2ZW50SW5kZXggPSAwOwogIHdoaWxlICgrK2V2ZW50SW5kZXggPD0gZXZlbnRzLmxlbmd0aCkgewogICAgaWYgKChldmVudEluZGV4ID09PSBldmVudHMubGVuZ3RoIHx8IGV2ZW50c1tldmVudEluZGV4XVsxXS50eXBlID09PSAibGluZUVuZGluZyIpICYmIGV2ZW50c1tldmVudEluZGV4IC0gMV1bMV0udHlwZSA9PT0gImRhdGEiKSB7CiAgICAgIGNvbnN0IGRhdGEgPSBldmVudHNbZXZlbnRJbmRleCAtIDFdWzFdOwogICAgICBjb25zdCBjaHVua3MgPSBjb250ZXh0Mi5zbGljZVN0cmVhbShkYXRhKTsKICAgICAgbGV0IGluZGV4MiA9IGNodW5rcy5sZW5ndGg7CiAgICAgIGxldCBidWZmZXJJbmRleCA9IC0xOwogICAgICBsZXQgc2l6ZSA9IDA7CiAgICAgIGxldCB0YWJzOwogICAgICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgICAgICBjb25zdCBjaHVuayA9IGNodW5rc1tpbmRleDJdOwogICAgICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICBidWZmZXJJbmRleCA9IGNodW5rLmxlbmd0aDsKICAgICAgICAgIHdoaWxlIChjaHVuay5jaGFyQ29kZUF0KGJ1ZmZlckluZGV4IC0gMSkgPT09IDMyKSB7CiAgICAgICAgICAgIHNpemUrKzsKICAgICAgICAgICAgYnVmZmVySW5kZXgtLTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChidWZmZXJJbmRleCkgYnJlYWs7CiAgICAgICAgICBidWZmZXJJbmRleCA9IC0xOwogICAgICAgIH0gZWxzZSBpZiAoY2h1bmsgPT09IC0yKSB7CiAgICAgICAgICB0YWJzID0gdHJ1ZTsKICAgICAgICAgIHNpemUrKzsKICAgICAgICB9IGVsc2UgaWYgKGNodW5rID09PSAtMSkgewogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbmRleDIrKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY29udGV4dDIuX2NvbnRlbnRUeXBlVGV4dFRyYWlsaW5nICYmIGV2ZW50SW5kZXggPT09IGV2ZW50cy5sZW5ndGgpIHsKICAgICAgICBzaXplID0gMDsKICAgICAgfQogICAgICBpZiAoc2l6ZSkgewogICAgICAgIGNvbnN0IHRva2VuID0gewogICAgICAgICAgdHlwZTogZXZlbnRJbmRleCA9PT0gZXZlbnRzLmxlbmd0aCB8fCB0YWJzIHx8IHNpemUgPCAyID8gImxpbmVTdWZmaXgiIDogImhhcmRCcmVha1RyYWlsaW5nIiwKICAgICAgICAgIHN0YXJ0OiB7CiAgICAgICAgICAgIF9idWZmZXJJbmRleDogaW5kZXgyID8gYnVmZmVySW5kZXggOiBkYXRhLnN0YXJ0Ll9idWZmZXJJbmRleCArIGJ1ZmZlckluZGV4LAogICAgICAgICAgICBfaW5kZXg6IGRhdGEuc3RhcnQuX2luZGV4ICsgaW5kZXgyLAogICAgICAgICAgICBsaW5lOiBkYXRhLmVuZC5saW5lLAogICAgICAgICAgICBjb2x1bW46IGRhdGEuZW5kLmNvbHVtbiAtIHNpemUsCiAgICAgICAgICAgIG9mZnNldDogZGF0YS5lbmQub2Zmc2V0IC0gc2l6ZQogICAgICAgICAgfSwKICAgICAgICAgIGVuZDogewogICAgICAgICAgICAuLi5kYXRhLmVuZAogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgZGF0YS5lbmQgPSB7CiAgICAgICAgICAuLi50b2tlbi5zdGFydAogICAgICAgIH07CiAgICAgICAgaWYgKGRhdGEuc3RhcnQub2Zmc2V0ID09PSBkYXRhLmVuZC5vZmZzZXQpIHsKICAgICAgICAgIE9iamVjdC5hc3NpZ24oZGF0YSwgdG9rZW4pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBldmVudHMuc3BsaWNlKGV2ZW50SW5kZXgsIDAsIFsiZW50ZXIiLCB0b2tlbiwgY29udGV4dDJdLCBbImV4aXQiLCB0b2tlbiwgY29udGV4dDJdKTsKICAgICAgICAgIGV2ZW50SW5kZXggKz0gMjsKICAgICAgICB9CiAgICAgIH0KICAgICAgZXZlbnRJbmRleCsrOwogICAgfQogIH0KICByZXR1cm4gZXZlbnRzOwp9CnZhciByZXNvbHZlciwgc3RyaW5nLCB0ZXh0MzsKdmFyIGluaXRfdGV4dDIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvaW5pdGlhbGl6ZS90ZXh0LmpzIigpIHsKICAgIHJlc29sdmVyID0gewogICAgICByZXNvbHZlQWxsOiBjcmVhdGVSZXNvbHZlcigpCiAgICB9OwogICAgc3RyaW5nID0gaW5pdGlhbGl6ZUZhY3RvcnkoInN0cmluZyIpOwogICAgdGV4dDMgPSBpbml0aWFsaXplRmFjdG9yeSgidGV4dCIpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL2NvbnN0cnVjdHMuanMKdmFyIGNvbnN0cnVjdHNfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChjb25zdHJ1Y3RzX2V4cG9ydHMsIHsKICBhdHRlbnRpb25NYXJrZXJzOiAoKSA9PiBhdHRlbnRpb25NYXJrZXJzLAogIGNvbnRlbnRJbml0aWFsOiAoKSA9PiBjb250ZW50SW5pdGlhbCwKICBkaXNhYmxlOiAoKSA9PiBkaXNhYmxlLAogIGRvY3VtZW50OiAoKSA9PiBkb2N1bWVudDMsCiAgZmxvdzogKCkgPT4gZmxvdzIsCiAgZmxvd0luaXRpYWw6ICgpID0+IGZsb3dJbml0aWFsLAogIGluc2lkZVNwYW46ICgpID0+IGluc2lkZVNwYW4sCiAgc3RyaW5nOiAoKSA9PiBzdHJpbmcyLAogIHRleHQ6ICgpID0+IHRleHQ0Cn0pOwp2YXIgZG9jdW1lbnQzLCBjb250ZW50SW5pdGlhbCwgZmxvd0luaXRpYWwsIGZsb3cyLCBzdHJpbmcyLCB0ZXh0NCwgaW5zaWRlU3BhbiwgYXR0ZW50aW9uTWFya2VycywgZGlzYWJsZTsKdmFyIGluaXRfY29uc3RydWN0cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFya0A0LjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrL2xpYi9jb25zdHJ1Y3RzLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX2NvcmVfY29tbW9ubWFyaygpOwogICAgaW5pdF90ZXh0MigpOwogICAgZG9jdW1lbnQzID0gewogICAgICBbNDJdOiBsaXN0MywKICAgICAgWzQzXTogbGlzdDMsCiAgICAgIFs0NV06IGxpc3QzLAogICAgICBbNDhdOiBsaXN0MywKICAgICAgWzQ5XTogbGlzdDMsCiAgICAgIFs1MF06IGxpc3QzLAogICAgICBbNTFdOiBsaXN0MywKICAgICAgWzUyXTogbGlzdDMsCiAgICAgIFs1M106IGxpc3QzLAogICAgICBbNTRdOiBsaXN0MywKICAgICAgWzU1XTogbGlzdDMsCiAgICAgIFs1Nl06IGxpc3QzLAogICAgICBbNTddOiBsaXN0MywKICAgICAgWzYyXTogYmxvY2tRdW90ZQogICAgfTsKICAgIGNvbnRlbnRJbml0aWFsID0gewogICAgICBbOTFdOiBkZWZpbml0aW9uMgogICAgfTsKICAgIGZsb3dJbml0aWFsID0gewogICAgICBbLTJdOiBjb2RlSW5kZW50ZWQsCiAgICAgIFstMV06IGNvZGVJbmRlbnRlZCwKICAgICAgWzMyXTogY29kZUluZGVudGVkCiAgICB9OwogICAgZmxvdzIgPSB7CiAgICAgIFszNV06IGhlYWRpbmdBdHgsCiAgICAgIFs0Ml06IHRoZW1hdGljQnJlYWsyLAogICAgICBbNDVdOiBbc2V0ZXh0VW5kZXJsaW5lLCB0aGVtYXRpY0JyZWFrMl0sCiAgICAgIFs2MF06IGh0bWxGbG93LAogICAgICBbNjFdOiBzZXRleHRVbmRlcmxpbmUsCiAgICAgIFs5NV06IHRoZW1hdGljQnJlYWsyLAogICAgICBbOTZdOiBjb2RlRmVuY2VkLAogICAgICBbMTI2XTogY29kZUZlbmNlZAogICAgfTsKICAgIHN0cmluZzIgPSB7CiAgICAgIFszOF06IGNoYXJhY3RlclJlZmVyZW5jZSwKICAgICAgWzkyXTogY2hhcmFjdGVyRXNjYXBlCiAgICB9OwogICAgdGV4dDQgPSB7CiAgICAgIFstNV06IGxpbmVFbmRpbmcsCiAgICAgIFstNF06IGxpbmVFbmRpbmcsCiAgICAgIFstM106IGxpbmVFbmRpbmcsCiAgICAgIFszM106IGxhYmVsU3RhcnRJbWFnZSwKICAgICAgWzM4XTogY2hhcmFjdGVyUmVmZXJlbmNlLAogICAgICBbNDJdOiBhdHRlbnRpb24sCiAgICAgIFs2MF06IFthdXRvbGluaywgaHRtbFRleHRdLAogICAgICBbOTFdOiBsYWJlbFN0YXJ0TGluaywKICAgICAgWzkyXTogW2hhcmRCcmVha0VzY2FwZSwgY2hhcmFjdGVyRXNjYXBlXSwKICAgICAgWzkzXTogbGFiZWxFbmQsCiAgICAgIFs5NV06IGF0dGVudGlvbiwKICAgICAgWzk2XTogY29kZVRleHQKICAgIH07CiAgICBpbnNpZGVTcGFuID0gewogICAgICBudWxsOiBbYXR0ZW50aW9uLCByZXNvbHZlcl0KICAgIH07CiAgICBhdHRlbnRpb25NYXJrZXJzID0gewogICAgICBudWxsOiBbNDIsIDk1XQogICAgfTsKICAgIGRpc2FibGUgPSB7CiAgICAgIG51bGw6IFtdCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL2NyZWF0ZS10b2tlbml6ZXIuanMKZnVuY3Rpb24gY3JlYXRlVG9rZW5pemVyKHBhcnNlciwgaW5pdGlhbGl6ZSwgZnJvbTIpIHsKICBsZXQgcG9pbnQ0ID0gewogICAgX2J1ZmZlckluZGV4OiAtMSwKICAgIF9pbmRleDogMCwKICAgIGxpbmU6IGZyb20yICYmIGZyb20yLmxpbmUgfHwgMSwKICAgIGNvbHVtbjogZnJvbTIgJiYgZnJvbTIuY29sdW1uIHx8IDEsCiAgICBvZmZzZXQ6IGZyb20yICYmIGZyb20yLm9mZnNldCB8fCAwCiAgfTsKICBjb25zdCBjb2x1bW5TdGFydCA9IHt9OwogIGNvbnN0IHJlc29sdmVBbGxDb25zdHJ1Y3RzID0gW107CiAgbGV0IGNodW5rcyA9IFtdOwogIGxldCBzdGFjayA9IFtdOwogIGxldCBjb25zdW1lZCA9IHRydWU7CiAgY29uc3QgZWZmZWN0cyA9IHsKICAgIGF0dGVtcHQ6IGNvbnN0cnVjdEZhY3Rvcnkob25zdWNjZXNzZnVsY29uc3RydWN0KSwKICAgIGNoZWNrOiBjb25zdHJ1Y3RGYWN0b3J5KG9uc3VjY2Vzc2Z1bGNoZWNrKSwKICAgIGNvbnN1bWUsCiAgICBlbnRlciwKICAgIGV4aXQ6IGV4aXQzLAogICAgaW50ZXJydXB0OiBjb25zdHJ1Y3RGYWN0b3J5KG9uc3VjY2Vzc2Z1bGNoZWNrLCB7CiAgICAgIGludGVycnVwdDogdHJ1ZQogICAgfSkKICB9OwogIGNvbnN0IGNvbnRleHQyID0gewogICAgY29kZTogbnVsbCwKICAgIGNvbnRhaW5lclN0YXRlOiB7fSwKICAgIGRlZmluZVNraXAsCiAgICBldmVudHM6IFtdLAogICAgbm93OiBub3cyLAogICAgcGFyc2VyLAogICAgcHJldmlvdXM6IG51bGwsCiAgICBzbGljZVNlcmlhbGl6ZSwKICAgIHNsaWNlU3RyZWFtLAogICAgd3JpdGUKICB9OwogIGxldCBzdGF0ZTEwID0gaW5pdGlhbGl6ZS50b2tlbml6ZS5jYWxsKGNvbnRleHQyLCBlZmZlY3RzKTsKICBsZXQgZXhwZWN0ZWRDb2RlOwogIGlmIChpbml0aWFsaXplLnJlc29sdmVBbGwpIHsKICAgIHJlc29sdmVBbGxDb25zdHJ1Y3RzLnB1c2goaW5pdGlhbGl6ZSk7CiAgfQogIHJldHVybiBjb250ZXh0MjsKICBmdW5jdGlvbiB3cml0ZShzbGljZSkgewogICAgY2h1bmtzID0gcHVzaChjaHVua3MsIHNsaWNlKTsKICAgIG1haW4oKTsKICAgIGlmIChjaHVua3NbY2h1bmtzLmxlbmd0aCAtIDFdICE9PSBudWxsKSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIGFkZFJlc3VsdChpbml0aWFsaXplLCAwKTsKICAgIGNvbnRleHQyLmV2ZW50cyA9IHJlc29sdmVBbGwocmVzb2x2ZUFsbENvbnN0cnVjdHMsIGNvbnRleHQyLmV2ZW50cywgY29udGV4dDIpOwogICAgcmV0dXJuIGNvbnRleHQyLmV2ZW50czsKICB9CiAgZnVuY3Rpb24gc2xpY2VTZXJpYWxpemUodG9rZW4sIGV4cGFuZFRhYnMpIHsKICAgIHJldHVybiBzZXJpYWxpemVDaHVua3Moc2xpY2VTdHJlYW0odG9rZW4pLCBleHBhbmRUYWJzKTsKICB9CiAgZnVuY3Rpb24gc2xpY2VTdHJlYW0odG9rZW4pIHsKICAgIHJldHVybiBzbGljZUNodW5rcyhjaHVua3MsIHRva2VuKTsKICB9CiAgZnVuY3Rpb24gbm93MigpIHsKICAgIGNvbnN0IHsKICAgICAgX2J1ZmZlckluZGV4LAogICAgICBfaW5kZXgsCiAgICAgIGxpbmUsCiAgICAgIGNvbHVtbiwKICAgICAgb2Zmc2V0CiAgICB9ID0gcG9pbnQ0OwogICAgcmV0dXJuIHsKICAgICAgX2J1ZmZlckluZGV4LAogICAgICBfaW5kZXgsCiAgICAgIGxpbmUsCiAgICAgIGNvbHVtbiwKICAgICAgb2Zmc2V0CiAgICB9OwogIH0KICBmdW5jdGlvbiBkZWZpbmVTa2lwKHZhbHVlMikgewogICAgY29sdW1uU3RhcnRbdmFsdWUyLmxpbmVdID0gdmFsdWUyLmNvbHVtbjsKICAgIGFjY291bnRGb3JQb3RlbnRpYWxTa2lwKCk7CiAgfQogIGZ1bmN0aW9uIG1haW4oKSB7CiAgICBsZXQgY2h1bmtJbmRleDsKICAgIHdoaWxlIChwb2ludDQuX2luZGV4IDwgY2h1bmtzLmxlbmd0aCkgewogICAgICBjb25zdCBjaHVuayA9IGNodW5rc1twb2ludDQuX2luZGV4XTsKICAgICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gInN0cmluZyIpIHsKICAgICAgICBjaHVua0luZGV4ID0gcG9pbnQ0Ll9pbmRleDsKICAgICAgICBpZiAocG9pbnQ0Ll9idWZmZXJJbmRleCA8IDApIHsKICAgICAgICAgIHBvaW50NC5fYnVmZmVySW5kZXggPSAwOwogICAgICAgIH0KICAgICAgICB3aGlsZSAocG9pbnQ0Ll9pbmRleCA9PT0gY2h1bmtJbmRleCAmJiBwb2ludDQuX2J1ZmZlckluZGV4IDwgY2h1bmsubGVuZ3RoKSB7CiAgICAgICAgICBnbyhjaHVuay5jaGFyQ29kZUF0KHBvaW50NC5fYnVmZmVySW5kZXgpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZ28oY2h1bmspOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGdvKGNvZGU0KSB7CiAgICBjb25zdW1lZCA9IHZvaWQgMDsKICAgIGV4cGVjdGVkQ29kZSA9IGNvZGU0OwogICAgc3RhdGUxMCA9IHN0YXRlMTAoY29kZTQpOwogIH0KICBmdW5jdGlvbiBjb25zdW1lKGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBwb2ludDQubGluZSsrOwogICAgICBwb2ludDQuY29sdW1uID0gMTsKICAgICAgcG9pbnQ0Lm9mZnNldCArPSBjb2RlNCA9PT0gLTMgPyAyIDogMTsKICAgICAgYWNjb3VudEZvclBvdGVudGlhbFNraXAoKTsKICAgIH0gZWxzZSBpZiAoY29kZTQgIT09IC0xKSB7CiAgICAgIHBvaW50NC5jb2x1bW4rKzsKICAgICAgcG9pbnQ0Lm9mZnNldCsrOwogICAgfQogICAgaWYgKHBvaW50NC5fYnVmZmVySW5kZXggPCAwKSB7CiAgICAgIHBvaW50NC5faW5kZXgrKzsKICAgIH0gZWxzZSB7CiAgICAgIHBvaW50NC5fYnVmZmVySW5kZXgrKzsKICAgICAgaWYgKHBvaW50NC5fYnVmZmVySW5kZXggPT09IC8vIFBvaW50cyB3LyBub24tbmVnYXRpdmUgYF9idWZmZXJJbmRleGAgcmVmZXJlbmNlCiAgICAgIC8vIHN0cmluZ3MuCiAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICBjaHVua3NbcG9pbnQ0Ll9pbmRleF0ubGVuZ3RoKSB7CiAgICAgICAgcG9pbnQ0Ll9idWZmZXJJbmRleCA9IC0xOwogICAgICAgIHBvaW50NC5faW5kZXgrKzsKICAgICAgfQogICAgfQogICAgY29udGV4dDIucHJldmlvdXMgPSBjb2RlNDsKICAgIGNvbnN1bWVkID0gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gZW50ZXIodHlwZTUsIGZpZWxkcykgewogICAgY29uc3QgdG9rZW4gPSBmaWVsZHMgfHwge307CiAgICB0b2tlbi50eXBlID0gdHlwZTU7CiAgICB0b2tlbi5zdGFydCA9IG5vdzIoKTsKICAgIGNvbnRleHQyLmV2ZW50cy5wdXNoKFsiZW50ZXIiLCB0b2tlbiwgY29udGV4dDJdKTsKICAgIHN0YWNrLnB1c2godG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KICBmdW5jdGlvbiBleGl0Myh0eXBlNSkgewogICAgY29uc3QgdG9rZW4gPSBzdGFjay5wb3AoKTsKICAgIHRva2VuLmVuZCA9IG5vdzIoKTsKICAgIGNvbnRleHQyLmV2ZW50cy5wdXNoKFsiZXhpdCIsIHRva2VuLCBjb250ZXh0Ml0pOwogICAgcmV0dXJuIHRva2VuOwogIH0KICBmdW5jdGlvbiBvbnN1Y2Nlc3NmdWxjb25zdHJ1Y3QoY29uc3RydWN0LCBpbmZvKSB7CiAgICBhZGRSZXN1bHQoY29uc3RydWN0LCBpbmZvLmZyb20pOwogIH0KICBmdW5jdGlvbiBvbnN1Y2Nlc3NmdWxjaGVjayhfNCwgaW5mbykgewogICAgaW5mby5yZXN0b3JlKCk7CiAgfQogIGZ1bmN0aW9uIGNvbnN0cnVjdEZhY3Rvcnkob25yZXR1cm4sIGZpZWxkcykgewogICAgcmV0dXJuIGhvb2s7CiAgICBmdW5jdGlvbiBob29rKGNvbnN0cnVjdHMyLCByZXR1cm5TdGF0ZSwgYm9ndXNTdGF0ZSkgewogICAgICBsZXQgbGlzdE9mQ29uc3RydWN0czsKICAgICAgbGV0IGNvbnN0cnVjdEluZGV4OwogICAgICBsZXQgY3VycmVudENvbnN0cnVjdDsKICAgICAgbGV0IGluZm87CiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNvbnN0cnVjdHMyKSA/ICgKICAgICAgICAvKiBjOCBpZ25vcmUgbmV4dCAxICovCiAgICAgICAgaGFuZGxlTGlzdE9mQ29uc3RydWN0cyhjb25zdHJ1Y3RzMikKICAgICAgKSA6ICJ0b2tlbml6ZSIgaW4gY29uc3RydWN0czIgPyAoCiAgICAgICAgLy8gTG9va3MgbGlrZSBhIGNvbnN0cnVjdC4KICAgICAgICBoYW5kbGVMaXN0T2ZDb25zdHJ1Y3RzKFsKICAgICAgICAgIC8qKiBAdHlwZSB7Q29uc3RydWN0fSAqLwogICAgICAgICAgY29uc3RydWN0czIKICAgICAgICBdKQogICAgICApIDogaGFuZGxlTWFwT2ZDb25zdHJ1Y3RzKGNvbnN0cnVjdHMyKTsKICAgICAgZnVuY3Rpb24gaGFuZGxlTWFwT2ZDb25zdHJ1Y3RzKG1hcDcpIHsKICAgICAgICByZXR1cm4gc3RhcnQ7CiAgICAgICAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgICAgICAgIGNvbnN0IGxlZnQgPSBjb2RlNCAhPT0gbnVsbCAmJiBtYXA3W2NvZGU0XTsKICAgICAgICAgIGNvbnN0IGFsbDMgPSBjb2RlNCAhPT0gbnVsbCAmJiBtYXA3Lm51bGw7CiAgICAgICAgICBjb25zdCBsaXN0NSA9IFsKICAgICAgICAgICAgLy8gVG8gZG86IGFkZCBtb3JlIGV4dGVuc2lvbiB0ZXN0cy4KICAgICAgICAgICAgLyogYzggaWdub3JlIG5leHQgMiAqLwogICAgICAgICAgICAuLi5BcnJheS5pc0FycmF5KGxlZnQpID8gbGVmdCA6IGxlZnQgPyBbbGVmdF0gOiBbXSwKICAgICAgICAgICAgLi4uQXJyYXkuaXNBcnJheShhbGwzKSA/IGFsbDMgOiBhbGwzID8gW2FsbDNdIDogW10KICAgICAgICAgIF07CiAgICAgICAgICByZXR1cm4gaGFuZGxlTGlzdE9mQ29uc3RydWN0cyhsaXN0NSkoY29kZTQpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBoYW5kbGVMaXN0T2ZDb25zdHJ1Y3RzKGxpc3Q1KSB7CiAgICAgICAgbGlzdE9mQ29uc3RydWN0cyA9IGxpc3Q1OwogICAgICAgIGNvbnN0cnVjdEluZGV4ID0gMDsKICAgICAgICBpZiAobGlzdDUubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gYm9ndXNTdGF0ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGhhbmRsZUNvbnN0cnVjdChsaXN0NVtjb25zdHJ1Y3RJbmRleF0pOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGhhbmRsZUNvbnN0cnVjdChjb25zdHJ1Y3QpIHsKICAgICAgICByZXR1cm4gc3RhcnQ7CiAgICAgICAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgICAgICAgIGluZm8gPSBzdG9yZSgpOwogICAgICAgICAgY3VycmVudENvbnN0cnVjdCA9IGNvbnN0cnVjdDsKICAgICAgICAgIGlmICghY29uc3RydWN0LnBhcnRpYWwpIHsKICAgICAgICAgICAgY29udGV4dDIuY3VycmVudENvbnN0cnVjdCA9IGNvbnN0cnVjdDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjb25zdHJ1Y3QubmFtZSAmJiBjb250ZXh0Mi5wYXJzZXIuY29uc3RydWN0cy5kaXNhYmxlLm51bGwuaW5jbHVkZXMoY29uc3RydWN0Lm5hbWUpKSB7CiAgICAgICAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdC50b2tlbml6ZS5jYWxsKAogICAgICAgICAgICAvLyBJZiB3ZSBkbyBoYXZlIGZpZWxkcywgY3JlYXRlIGFuIG9iamVjdCB3LyBgY29udGV4dGAgYXMgaXRzCiAgICAgICAgICAgIC8vIHByb3RvdHlwZS4KICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgYSDigJxsaXZlIGJpbmRpbmfigJ0sIHdoaWNoIGlzIG5lZWRlZCBmb3IgYGludGVycnVwdGAuCiAgICAgICAgICAgIGZpZWxkcyA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShjb250ZXh0MiksIGZpZWxkcykgOiBjb250ZXh0MiwKICAgICAgICAgICAgZWZmZWN0cywKICAgICAgICAgICAgb2szLAogICAgICAgICAgICBub2sKICAgICAgICAgICkoY29kZTQpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBvazMoY29kZTQpIHsKICAgICAgICBjb25zdW1lZCA9IHRydWU7CiAgICAgICAgb25yZXR1cm4oY3VycmVudENvbnN0cnVjdCwgaW5mbyk7CiAgICAgICAgcmV0dXJuIHJldHVyblN0YXRlOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIG5vayhjb2RlNCkgewogICAgICAgIGNvbnN1bWVkID0gdHJ1ZTsKICAgICAgICBpbmZvLnJlc3RvcmUoKTsKICAgICAgICBpZiAoKytjb25zdHJ1Y3RJbmRleCA8IGxpc3RPZkNvbnN0cnVjdHMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gaGFuZGxlQ29uc3RydWN0KGxpc3RPZkNvbnN0cnVjdHNbY29uc3RydWN0SW5kZXhdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJvZ3VzU3RhdGU7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gYWRkUmVzdWx0KGNvbnN0cnVjdCwgZnJvbTMpIHsKICAgIGlmIChjb25zdHJ1Y3QucmVzb2x2ZUFsbCAmJiAhcmVzb2x2ZUFsbENvbnN0cnVjdHMuaW5jbHVkZXMoY29uc3RydWN0KSkgewogICAgICByZXNvbHZlQWxsQ29uc3RydWN0cy5wdXNoKGNvbnN0cnVjdCk7CiAgICB9CiAgICBpZiAoY29uc3RydWN0LnJlc29sdmUpIHsKICAgICAgc3BsaWNlKGNvbnRleHQyLmV2ZW50cywgZnJvbTMsIGNvbnRleHQyLmV2ZW50cy5sZW5ndGggLSBmcm9tMywgY29uc3RydWN0LnJlc29sdmUoY29udGV4dDIuZXZlbnRzLnNsaWNlKGZyb20zKSwgY29udGV4dDIpKTsKICAgIH0KICAgIGlmIChjb25zdHJ1Y3QucmVzb2x2ZVRvKSB7CiAgICAgIGNvbnRleHQyLmV2ZW50cyA9IGNvbnN0cnVjdC5yZXNvbHZlVG8oY29udGV4dDIuZXZlbnRzLCBjb250ZXh0Mik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHN0b3JlKCkgewogICAgY29uc3Qgc3RhcnRQb2ludCA9IG5vdzIoKTsKICAgIGNvbnN0IHN0YXJ0UHJldmlvdXMgPSBjb250ZXh0Mi5wcmV2aW91czsKICAgIGNvbnN0IHN0YXJ0Q3VycmVudENvbnN0cnVjdCA9IGNvbnRleHQyLmN1cnJlbnRDb25zdHJ1Y3Q7CiAgICBjb25zdCBzdGFydEV2ZW50c0luZGV4ID0gY29udGV4dDIuZXZlbnRzLmxlbmd0aDsKICAgIGNvbnN0IHN0YXJ0U3RhY2sgPSBBcnJheS5mcm9tKHN0YWNrKTsKICAgIHJldHVybiB7CiAgICAgIGZyb206IHN0YXJ0RXZlbnRzSW5kZXgsCiAgICAgIHJlc3RvcmUKICAgIH07CiAgICBmdW5jdGlvbiByZXN0b3JlKCkgewogICAgICBwb2ludDQgPSBzdGFydFBvaW50OwogICAgICBjb250ZXh0Mi5wcmV2aW91cyA9IHN0YXJ0UHJldmlvdXM7CiAgICAgIGNvbnRleHQyLmN1cnJlbnRDb25zdHJ1Y3QgPSBzdGFydEN1cnJlbnRDb25zdHJ1Y3Q7CiAgICAgIGNvbnRleHQyLmV2ZW50cy5sZW5ndGggPSBzdGFydEV2ZW50c0luZGV4OwogICAgICBzdGFjayA9IHN0YXJ0U3RhY2s7CiAgICAgIGFjY291bnRGb3JQb3RlbnRpYWxTa2lwKCk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGFjY291bnRGb3JQb3RlbnRpYWxTa2lwKCkgewogICAgaWYgKHBvaW50NC5saW5lIGluIGNvbHVtblN0YXJ0ICYmIHBvaW50NC5jb2x1bW4gPCAyKSB7CiAgICAgIHBvaW50NC5jb2x1bW4gPSBjb2x1bW5TdGFydFtwb2ludDQubGluZV07CiAgICAgIHBvaW50NC5vZmZzZXQgKz0gY29sdW1uU3RhcnRbcG9pbnQ0LmxpbmVdIC0gMTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gc2xpY2VDaHVua3MoY2h1bmtzLCB0b2tlbikgewogIGNvbnN0IHN0YXJ0SW5kZXggPSB0b2tlbi5zdGFydC5faW5kZXg7CiAgY29uc3Qgc3RhcnRCdWZmZXJJbmRleCA9IHRva2VuLnN0YXJ0Ll9idWZmZXJJbmRleDsKICBjb25zdCBlbmRJbmRleCA9IHRva2VuLmVuZC5faW5kZXg7CiAgY29uc3QgZW5kQnVmZmVySW5kZXggPSB0b2tlbi5lbmQuX2J1ZmZlckluZGV4OwogIGxldCB2aWV3OwogIGlmIChzdGFydEluZGV4ID09PSBlbmRJbmRleCkgewogICAgdmlldyA9IFtjaHVua3Nbc3RhcnRJbmRleF0uc2xpY2Uoc3RhcnRCdWZmZXJJbmRleCwgZW5kQnVmZmVySW5kZXgpXTsKICB9IGVsc2UgewogICAgdmlldyA9IGNodW5rcy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7CiAgICBpZiAoc3RhcnRCdWZmZXJJbmRleCA+IC0xKSB7CiAgICAgIGNvbnN0IGhlYWQyID0gdmlld1swXTsKICAgICAgaWYgKHR5cGVvZiBoZWFkMiA9PT0gInN0cmluZyIpIHsKICAgICAgICB2aWV3WzBdID0gaGVhZDIuc2xpY2Uoc3RhcnRCdWZmZXJJbmRleCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmlldy5zaGlmdCgpOwogICAgICB9CiAgICB9CiAgICBpZiAoZW5kQnVmZmVySW5kZXggPiAwKSB7CiAgICAgIHZpZXcucHVzaChjaHVua3NbZW5kSW5kZXhdLnNsaWNlKDAsIGVuZEJ1ZmZlckluZGV4KSk7CiAgICB9CiAgfQogIHJldHVybiB2aWV3Owp9CmZ1bmN0aW9uIHNlcmlhbGl6ZUNodW5rcyhjaHVua3MsIGV4cGFuZFRhYnMpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgY29uc3QgcmVzdWx0ID0gW107CiAgbGV0IGF0VGFiOwogIHdoaWxlICgrK2luZGV4MiA8IGNodW5rcy5sZW5ndGgpIHsKICAgIGNvbnN0IGNodW5rID0gY2h1bmtzW2luZGV4Ml07CiAgICBsZXQgdmFsdWUyOwogICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gInN0cmluZyIpIHsKICAgICAgdmFsdWUyID0gY2h1bms7CiAgICB9IGVsc2Ugc3dpdGNoIChjaHVuaykgewogICAgICBjYXNlIC01OiB7CiAgICAgICAgdmFsdWUyID0gIlxyIjsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlIC00OiB7CiAgICAgICAgdmFsdWUyID0gIlxuIjsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlIC0zOiB7CiAgICAgICAgdmFsdWUyID0gIlxyXG4iOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgLTI6IHsKICAgICAgICB2YWx1ZTIgPSBleHBhbmRUYWJzID8gIiAiIDogIgkiOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgLTE6IHsKICAgICAgICBpZiAoIWV4cGFuZFRhYnMgJiYgYXRUYWIpIGNvbnRpbnVlOwogICAgICAgIHZhbHVlMiA9ICIgIjsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBkZWZhdWx0OiB7CiAgICAgICAgdmFsdWUyID0gU3RyaW5nLmZyb21DaGFyQ29kZShjaHVuayk7CiAgICAgIH0KICAgIH0KICAgIGF0VGFiID0gY2h1bmsgPT09IC0yOwogICAgcmVzdWx0LnB1c2godmFsdWUyKTsKICB9CiAgcmV0dXJuIHJlc3VsdC5qb2luKCIiKTsKfQp2YXIgaW5pdF9jcmVhdGVfdG9rZW5pemVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL2NyZWF0ZS10b2tlbml6ZXIuanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2h1bmtlZCgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9yZXNvbHZlX2FsbCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL3BhcnNlLmpzCmZ1bmN0aW9uIHBhcnNlNChvcHRpb25zKSB7CiAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9OwogIGNvbnN0IGNvbnN0cnVjdHMyID0gKAogICAgLyoqIEB0eXBlIHtGdWxsTm9ybWFsaXplZEV4dGVuc2lvbn0gKi8KICAgIGNvbWJpbmVFeHRlbnNpb25zKFtjb25zdHJ1Y3RzX2V4cG9ydHMsIC4uLnNldHRpbmdzLmV4dGVuc2lvbnMgfHwgW11dKQogICk7CiAgY29uc3QgcGFyc2VyID0gewogICAgY29uc3RydWN0czogY29uc3RydWN0czIsCiAgICBjb250ZW50OiBjcmVhdGU3KGNvbnRlbnQyKSwKICAgIGRlZmluZWQ6IFtdLAogICAgZG9jdW1lbnQ6IGNyZWF0ZTcoZG9jdW1lbnQyKSwKICAgIGZsb3c6IGNyZWF0ZTcoZmxvdyksCiAgICBsYXp5OiB7fSwKICAgIHN0cmluZzogY3JlYXRlNyhzdHJpbmcpLAogICAgdGV4dDogY3JlYXRlNyh0ZXh0MykKICB9OwogIHJldHVybiBwYXJzZXI7CiAgZnVuY3Rpb24gY3JlYXRlNyhpbml0aWFsMikgewogICAgcmV0dXJuIGNyZWF0b3I7CiAgICBmdW5jdGlvbiBjcmVhdG9yKGZyb20yKSB7CiAgICAgIHJldHVybiBjcmVhdGVUb2tlbml6ZXIocGFyc2VyLCBpbml0aWFsMiwgZnJvbTIpOwogICAgfQogIH0KfQp2YXIgaW5pdF9wYXJzZTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvcGFyc2UuanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jb21iaW5lX2V4dGVuc2lvbnMoKTsKICAgIGluaXRfY29udGVudDIoKTsKICAgIGluaXRfZG9jdW1lbnQoKTsKICAgIGluaXRfZmxvdygpOwogICAgaW5pdF90ZXh0MigpOwogICAgaW5pdF9jb25zdHJ1Y3RzKCk7CiAgICBpbml0X2NyZWF0ZV90b2tlbml6ZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFya0A0LjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrL2xpYi9wb3N0cHJvY2Vzcy5qcwpmdW5jdGlvbiBwb3N0cHJvY2VzcyhldmVudHMpIHsKICB3aGlsZSAoIXN1YnRva2VuaXplKGV2ZW50cykpIHsKICB9CiAgcmV0dXJuIGV2ZW50czsKfQp2YXIgaW5pdF9wb3N0cHJvY2VzcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFya0A0LjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrL2xpYi9wb3N0cHJvY2Vzcy5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX3N1YnRva2VuaXplKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvcHJlcHJvY2Vzcy5qcwpmdW5jdGlvbiBwcmVwcm9jZXNzKCkgewogIGxldCBjb2x1bW4gPSAxOwogIGxldCBidWZmZXIyID0gIiI7CiAgbGV0IHN0YXJ0ID0gdHJ1ZTsKICBsZXQgYXRDYXJyaWFnZVJldHVybjsKICByZXR1cm4gcHJlcHJvY2Vzc29yOwogIGZ1bmN0aW9uIHByZXByb2Nlc3Nvcih2YWx1ZTIsIGVuY29kaW5nLCBlbmQzKSB7CiAgICBjb25zdCBjaHVua3MgPSBbXTsKICAgIGxldCBtYXRjaDI7CiAgICBsZXQgbmV4dDI7CiAgICBsZXQgc3RhcnRQb3NpdGlvbjsKICAgIGxldCBlbmRQb3NpdGlvbjsKICAgIGxldCBjb2RlNDsKICAgIHZhbHVlMiA9IGJ1ZmZlcjIgKyAodHlwZW9mIHZhbHVlMiA9PT0gInN0cmluZyIgPyB2YWx1ZTIudG9TdHJpbmcoKSA6IG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZyB8fCB2b2lkIDApLmRlY29kZSh2YWx1ZTIpKTsKICAgIHN0YXJ0UG9zaXRpb24gPSAwOwogICAgYnVmZmVyMiA9ICIiOwogICAgaWYgKHN0YXJ0KSB7CiAgICAgIGlmICh2YWx1ZTIuY2hhckNvZGVBdCgwKSA9PT0gNjUyNzkpIHsKICAgICAgICBzdGFydFBvc2l0aW9uKys7CiAgICAgIH0KICAgICAgc3RhcnQgPSB2b2lkIDA7CiAgICB9CiAgICB3aGlsZSAoc3RhcnRQb3NpdGlvbiA8IHZhbHVlMi5sZW5ndGgpIHsKICAgICAgc2VhcmNoLmxhc3RJbmRleCA9IHN0YXJ0UG9zaXRpb247CiAgICAgIG1hdGNoMiA9IHNlYXJjaC5leGVjKHZhbHVlMik7CiAgICAgIGVuZFBvc2l0aW9uID0gbWF0Y2gyICYmIG1hdGNoMi5pbmRleCAhPT0gdm9pZCAwID8gbWF0Y2gyLmluZGV4IDogdmFsdWUyLmxlbmd0aDsKICAgICAgY29kZTQgPSB2YWx1ZTIuY2hhckNvZGVBdChlbmRQb3NpdGlvbik7CiAgICAgIGlmICghbWF0Y2gyKSB7CiAgICAgICAgYnVmZmVyMiA9IHZhbHVlMi5zbGljZShzdGFydFBvc2l0aW9uKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAoY29kZTQgPT09IDEwICYmIHN0YXJ0UG9zaXRpb24gPT09IGVuZFBvc2l0aW9uICYmIGF0Q2FycmlhZ2VSZXR1cm4pIHsKICAgICAgICBjaHVua3MucHVzaCgtMyk7CiAgICAgICAgYXRDYXJyaWFnZVJldHVybiA9IHZvaWQgMDsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoYXRDYXJyaWFnZVJldHVybikgewogICAgICAgICAgY2h1bmtzLnB1c2goLTUpOwogICAgICAgICAgYXRDYXJyaWFnZVJldHVybiA9IHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgaWYgKHN0YXJ0UG9zaXRpb24gPCBlbmRQb3NpdGlvbikgewogICAgICAgICAgY2h1bmtzLnB1c2godmFsdWUyLnNsaWNlKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKSk7CiAgICAgICAgICBjb2x1bW4gKz0gZW5kUG9zaXRpb24gLSBzdGFydFBvc2l0aW9uOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKGNvZGU0KSB7CiAgICAgICAgICBjYXNlIDA6IHsKICAgICAgICAgICAgY2h1bmtzLnB1c2goNjU1MzMpOwogICAgICAgICAgICBjb2x1bW4rKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDk6IHsKICAgICAgICAgICAgbmV4dDIgPSBNYXRoLmNlaWwoY29sdW1uIC8gNCkgKiA0OwogICAgICAgICAgICBjaHVua3MucHVzaCgtMik7CiAgICAgICAgICAgIHdoaWxlIChjb2x1bW4rKyA8IG5leHQyKSBjaHVua3MucHVzaCgtMSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAxMDogewogICAgICAgICAgICBjaHVua3MucHVzaCgtNCk7CiAgICAgICAgICAgIGNvbHVtbiA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICBhdENhcnJpYWdlUmV0dXJuID0gdHJ1ZTsKICAgICAgICAgICAgY29sdW1uID0gMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhcnRQb3NpdGlvbiA9IGVuZFBvc2l0aW9uICsgMTsKICAgIH0KICAgIGlmIChlbmQzKSB7CiAgICAgIGlmIChhdENhcnJpYWdlUmV0dXJuKSBjaHVua3MucHVzaCgtNSk7CiAgICAgIGlmIChidWZmZXIyKSBjaHVua3MucHVzaChidWZmZXIyKTsKICAgICAgY2h1bmtzLnB1c2gobnVsbCk7CiAgICB9CiAgICByZXR1cm4gY2h1bmtzOwogIH0KfQp2YXIgc2VhcmNoOwp2YXIgaW5pdF9wcmVwcm9jZXNzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL3ByZXByb2Nlc3MuanMiKCkgewogICAgc2VhcmNoID0gL1tcMFx0XG5ccl0vZzsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFya0A0LjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrL2luZGV4LmpzCmZ1bmN0aW9uIG1pY3JvbWFyayh2YWx1ZTIsIGVuY29kaW5nLCBvcHRpb25zKSB7CiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gInN0cmluZyIpIHsKICAgIG9wdGlvbnMgPSBlbmNvZGluZzsKICAgIGVuY29kaW5nID0gdm9pZCAwOwogIH0KICByZXR1cm4gY29tcGlsZShvcHRpb25zKShwb3N0cHJvY2VzcyhwYXJzZTQob3B0aW9ucykuZG9jdW1lbnQoKS53cml0ZShwcmVwcm9jZXNzKCkodmFsdWUyLCBlbmNvZGluZywgdHJ1ZSkpKSk7Cn0KdmFyIGluaXRfbWljcm9tYXJrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvaW5kZXguanMiKCkgewogICAgaW5pdF9jb21waWxlKCk7CiAgICBpbml0X3BhcnNlMigpOwogICAgaW5pdF9wb3N0cHJvY2VzcygpOwogICAgaW5pdF9wcmVwcm9jZXNzKCk7CiAgICBpbml0X2NvbXBpbGUoKTsKICAgIGluaXRfcGFyc2UyKCk7CiAgICBpbml0X3Bvc3Rwcm9jZXNzKCk7CiAgICBpbml0X3ByZXByb2Nlc3MoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZnJvbS1tYXJrZG93bkAyLjAuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duL2xpYi9pbmRleC5qcwpmdW5jdGlvbiBmcm9tTWFya2Rvd24odmFsdWUyLCBlbmNvZGluZywgb3B0aW9ucykgewogIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICJzdHJpbmciKSB7CiAgICBvcHRpb25zID0gZW5jb2Rpbmc7CiAgICBlbmNvZGluZyA9IHZvaWQgMDsKICB9CiAgcmV0dXJuIGNvbXBpbGVyKG9wdGlvbnMpKHBvc3Rwcm9jZXNzKHBhcnNlNChvcHRpb25zKS5kb2N1bWVudCgpLndyaXRlKHByZXByb2Nlc3MoKSh2YWx1ZTIsIGVuY29kaW5nLCB0cnVlKSkpKTsKfQpmdW5jdGlvbiBjb21waWxlcihvcHRpb25zKSB7CiAgY29uc3QgY29uZmlnMyA9IHsKICAgIHRyYW5zZm9ybXM6IFtdLAogICAgY2FuQ29udGFpbkVvbHM6IFsiZW1waGFzaXMiLCAiZnJhZ21lbnQiLCAiaGVhZGluZyIsICJwYXJhZ3JhcGgiLCAic3Ryb25nIl0sCiAgICBlbnRlcjogewogICAgICBhdXRvbGluazogb3BlbmVyMihsaW5rMyksCiAgICAgIGF1dG9saW5rUHJvdG9jb2w6IG9uZW50ZXJkYXRhLAogICAgICBhdXRvbGlua0VtYWlsOiBvbmVudGVyZGF0YSwKICAgICAgYXR4SGVhZGluZzogb3BlbmVyMihoZWFkaW5nMyksCiAgICAgIGJsb2NrUXVvdGU6IG9wZW5lcjIoYmxvY2tRdW90ZTIpLAogICAgICBjaGFyYWN0ZXJFc2NhcGU6IG9uZW50ZXJkYXRhLAogICAgICBjaGFyYWN0ZXJSZWZlcmVuY2U6IG9uZW50ZXJkYXRhLAogICAgICBjb2RlRmVuY2VkOiBvcGVuZXIyKGNvZGVGbG93KSwKICAgICAgY29kZUZlbmNlZEZlbmNlSW5mbzogYnVmZmVyMiwKICAgICAgY29kZUZlbmNlZEZlbmNlTWV0YTogYnVmZmVyMiwKICAgICAgY29kZUluZGVudGVkOiBvcGVuZXIyKGNvZGVGbG93LCBidWZmZXIyKSwKICAgICAgY29kZVRleHQ6IG9wZW5lcjIoY29kZVRleHQyLCBidWZmZXIyKSwKICAgICAgY29kZVRleHREYXRhOiBvbmVudGVyZGF0YSwKICAgICAgZGF0YTogb25lbnRlcmRhdGEsCiAgICAgIGNvZGVGbG93VmFsdWU6IG9uZW50ZXJkYXRhLAogICAgICBkZWZpbml0aW9uOiBvcGVuZXIyKGRlZmluaXRpb24zKSwKICAgICAgZGVmaW5pdGlvbkRlc3RpbmF0aW9uU3RyaW5nOiBidWZmZXIyLAogICAgICBkZWZpbml0aW9uTGFiZWxTdHJpbmc6IGJ1ZmZlcjIsCiAgICAgIGRlZmluaXRpb25UaXRsZVN0cmluZzogYnVmZmVyMiwKICAgICAgZW1waGFzaXM6IG9wZW5lcjIoZW1waGFzaXMzKSwKICAgICAgaGFyZEJyZWFrRXNjYXBlOiBvcGVuZXIyKGhhcmRCcmVhazMpLAogICAgICBoYXJkQnJlYWtUcmFpbGluZzogb3BlbmVyMihoYXJkQnJlYWszKSwKICAgICAgaHRtbEZsb3c6IG9wZW5lcjIoaHRtbDE2LCBidWZmZXIyKSwKICAgICAgaHRtbEZsb3dEYXRhOiBvbmVudGVyZGF0YSwKICAgICAgaHRtbFRleHQ6IG9wZW5lcjIoaHRtbDE2LCBidWZmZXIyKSwKICAgICAgaHRtbFRleHREYXRhOiBvbmVudGVyZGF0YSwKICAgICAgaW1hZ2U6IG9wZW5lcjIoaW1hZ2UzKSwKICAgICAgbGFiZWw6IGJ1ZmZlcjIsCiAgICAgIGxpbms6IG9wZW5lcjIobGluazMpLAogICAgICBsaXN0SXRlbTogb3BlbmVyMihsaXN0SXRlbTMpLAogICAgICBsaXN0SXRlbVZhbHVlOiBvbmVudGVybGlzdGl0ZW12YWx1ZSwKICAgICAgbGlzdE9yZGVyZWQ6IG9wZW5lcjIobGlzdDUsIG9uZW50ZXJsaXN0b3JkZXJlZCksCiAgICAgIGxpc3RVbm9yZGVyZWQ6IG9wZW5lcjIobGlzdDUpLAogICAgICBwYXJhZ3JhcGg6IG9wZW5lcjIocGFyYWdyYXBoMyksCiAgICAgIHJlZmVyZW5jZTogb25lbnRlcnJlZmVyZW5jZSwKICAgICAgcmVmZXJlbmNlU3RyaW5nOiBidWZmZXIyLAogICAgICByZXNvdXJjZURlc3RpbmF0aW9uU3RyaW5nOiBidWZmZXIyLAogICAgICByZXNvdXJjZVRpdGxlU3RyaW5nOiBidWZmZXIyLAogICAgICBzZXRleHRIZWFkaW5nOiBvcGVuZXIyKGhlYWRpbmczKSwKICAgICAgc3Ryb25nOiBvcGVuZXIyKHN0cm9uZzMpLAogICAgICB0aGVtYXRpY0JyZWFrOiBvcGVuZXIyKHRoZW1hdGljQnJlYWs0KQogICAgfSwKICAgIGV4aXQ6IHsKICAgICAgYXR4SGVhZGluZzogY2xvc2VyKCksCiAgICAgIGF0eEhlYWRpbmdTZXF1ZW5jZTogb25leGl0YXR4aGVhZGluZ3NlcXVlbmNlLAogICAgICBhdXRvbGluazogY2xvc2VyKCksCiAgICAgIGF1dG9saW5rRW1haWw6IG9uZXhpdGF1dG9saW5rZW1haWwsCiAgICAgIGF1dG9saW5rUHJvdG9jb2w6IG9uZXhpdGF1dG9saW5rcHJvdG9jb2wsCiAgICAgIGJsb2NrUXVvdGU6IGNsb3NlcigpLAogICAgICBjaGFyYWN0ZXJFc2NhcGVWYWx1ZTogb25leGl0ZGF0YSwKICAgICAgY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VySGV4YWRlY2ltYWw6IG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZW1hcmtlciwKICAgICAgY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyTnVtZXJpYzogb25leGl0Y2hhcmFjdGVycmVmZXJlbmNlbWFya2VyLAogICAgICBjaGFyYWN0ZXJSZWZlcmVuY2VWYWx1ZTogb25leGl0Y2hhcmFjdGVycmVmZXJlbmNldmFsdWUsCiAgICAgIGNoYXJhY3RlclJlZmVyZW5jZTogb25leGl0Y2hhcmFjdGVycmVmZXJlbmNlLAogICAgICBjb2RlRmVuY2VkOiBjbG9zZXIob25leGl0Y29kZWZlbmNlZCksCiAgICAgIGNvZGVGZW5jZWRGZW5jZTogb25leGl0Y29kZWZlbmNlZGZlbmNlLAogICAgICBjb2RlRmVuY2VkRmVuY2VJbmZvOiBvbmV4aXRjb2RlZmVuY2VkZmVuY2VpbmZvLAogICAgICBjb2RlRmVuY2VkRmVuY2VNZXRhOiBvbmV4aXRjb2RlZmVuY2VkZmVuY2VtZXRhLAogICAgICBjb2RlRmxvd1ZhbHVlOiBvbmV4aXRkYXRhLAogICAgICBjb2RlSW5kZW50ZWQ6IGNsb3NlcihvbmV4aXRjb2RlaW5kZW50ZWQpLAogICAgICBjb2RlVGV4dDogY2xvc2VyKG9uZXhpdGNvZGV0ZXh0KSwKICAgICAgY29kZVRleHREYXRhOiBvbmV4aXRkYXRhLAogICAgICBkYXRhOiBvbmV4aXRkYXRhLAogICAgICBkZWZpbml0aW9uOiBjbG9zZXIoKSwKICAgICAgZGVmaW5pdGlvbkRlc3RpbmF0aW9uU3RyaW5nOiBvbmV4aXRkZWZpbml0aW9uZGVzdGluYXRpb25zdHJpbmcsCiAgICAgIGRlZmluaXRpb25MYWJlbFN0cmluZzogb25leGl0ZGVmaW5pdGlvbmxhYmVsc3RyaW5nLAogICAgICBkZWZpbml0aW9uVGl0bGVTdHJpbmc6IG9uZXhpdGRlZmluaXRpb250aXRsZXN0cmluZywKICAgICAgZW1waGFzaXM6IGNsb3NlcigpLAogICAgICBoYXJkQnJlYWtFc2NhcGU6IGNsb3NlcihvbmV4aXRoYXJkYnJlYWspLAogICAgICBoYXJkQnJlYWtUcmFpbGluZzogY2xvc2VyKG9uZXhpdGhhcmRicmVhayksCiAgICAgIGh0bWxGbG93OiBjbG9zZXIob25leGl0aHRtbGZsb3cpLAogICAgICBodG1sRmxvd0RhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGh0bWxUZXh0OiBjbG9zZXIob25leGl0aHRtbHRleHQpLAogICAgICBodG1sVGV4dERhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGltYWdlOiBjbG9zZXIob25leGl0aW1hZ2UpLAogICAgICBsYWJlbDogb25leGl0bGFiZWwsCiAgICAgIGxhYmVsVGV4dDogb25leGl0bGFiZWx0ZXh0LAogICAgICBsaW5lRW5kaW5nOiBvbmV4aXRsaW5lZW5kaW5nLAogICAgICBsaW5rOiBjbG9zZXIob25leGl0bGluayksCiAgICAgIGxpc3RJdGVtOiBjbG9zZXIoKSwKICAgICAgbGlzdE9yZGVyZWQ6IGNsb3NlcigpLAogICAgICBsaXN0VW5vcmRlcmVkOiBjbG9zZXIoKSwKICAgICAgcGFyYWdyYXBoOiBjbG9zZXIoKSwKICAgICAgcmVmZXJlbmNlU3RyaW5nOiBvbmV4aXRyZWZlcmVuY2VzdHJpbmcsCiAgICAgIHJlc291cmNlRGVzdGluYXRpb25TdHJpbmc6IG9uZXhpdHJlc291cmNlZGVzdGluYXRpb25zdHJpbmcsCiAgICAgIHJlc291cmNlVGl0bGVTdHJpbmc6IG9uZXhpdHJlc291cmNldGl0bGVzdHJpbmcsCiAgICAgIHJlc291cmNlOiBvbmV4aXRyZXNvdXJjZSwKICAgICAgc2V0ZXh0SGVhZGluZzogY2xvc2VyKG9uZXhpdHNldGV4dGhlYWRpbmcpLAogICAgICBzZXRleHRIZWFkaW5nTGluZVNlcXVlbmNlOiBvbmV4aXRzZXRleHRoZWFkaW5nbGluZXNlcXVlbmNlLAogICAgICBzZXRleHRIZWFkaW5nVGV4dDogb25leGl0c2V0ZXh0aGVhZGluZ3RleHQsCiAgICAgIHN0cm9uZzogY2xvc2VyKCksCiAgICAgIHRoZW1hdGljQnJlYWs6IGNsb3NlcigpCiAgICB9CiAgfTsKICBjb25maWd1cmUyKGNvbmZpZzMsIChvcHRpb25zIHx8IHt9KS5tZGFzdEV4dGVuc2lvbnMgfHwgW10pOwogIGNvbnN0IGRhdGEgPSB7fTsKICByZXR1cm4gY29tcGlsZTI7CiAgZnVuY3Rpb24gY29tcGlsZTIoZXZlbnRzKSB7CiAgICBsZXQgdHJlZSA9IHsKICAgICAgdHlwZTogInJvb3QiLAogICAgICBjaGlsZHJlbjogW10KICAgIH07CiAgICBjb25zdCBjb250ZXh0MiA9IHsKICAgICAgc3RhY2s6IFt0cmVlXSwKICAgICAgdG9rZW5TdGFjazogW10sCiAgICAgIGNvbmZpZzogY29uZmlnMywKICAgICAgZW50ZXIsCiAgICAgIGV4aXQ6IGV4aXQzLAogICAgICBidWZmZXI6IGJ1ZmZlcjIsCiAgICAgIHJlc3VtZSwKICAgICAgZGF0YQogICAgfTsKICAgIGNvbnN0IGxpc3RTdGFjayA9IFtdOwogICAgbGV0IGluZGV4MiA9IC0xOwogICAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgICBpZiAoZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImxpc3RPcmRlcmVkIiB8fCBldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAibGlzdFVub3JkZXJlZCIpIHsKICAgICAgICBpZiAoZXZlbnRzW2luZGV4Ml1bMF0gPT09ICJlbnRlciIpIHsKICAgICAgICAgIGxpc3RTdGFjay5wdXNoKGluZGV4Mik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IHRhaWwgPSBsaXN0U3RhY2sucG9wKCk7CiAgICAgICAgICBpbmRleDIgPSBwcmVwYXJlTGlzdChldmVudHMsIHRhaWwsIGluZGV4Mik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpbmRleDIgPSAtMTsKICAgIHdoaWxlICgrK2luZGV4MiA8IGV2ZW50cy5sZW5ndGgpIHsKICAgICAgY29uc3QgaGFuZGxlcjIgPSBjb25maWczW2V2ZW50c1tpbmRleDJdWzBdXTsKICAgICAgaWYgKG93bjUuY2FsbChoYW5kbGVyMiwgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSkpIHsKICAgICAgICBoYW5kbGVyMltldmVudHNbaW5kZXgyXVsxXS50eXBlXS5jYWxsKE9iamVjdC5hc3NpZ24oewogICAgICAgICAgc2xpY2VTZXJpYWxpemU6IGV2ZW50c1tpbmRleDJdWzJdLnNsaWNlU2VyaWFsaXplCiAgICAgICAgfSwgY29udGV4dDIpLCBldmVudHNbaW5kZXgyXVsxXSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChjb250ZXh0Mi50b2tlblN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgY29uc3QgdGFpbCA9IGNvbnRleHQyLnRva2VuU3RhY2tbY29udGV4dDIudG9rZW5TdGFjay5sZW5ndGggLSAxXTsKICAgICAgY29uc3QgaGFuZGxlcjIgPSB0YWlsWzFdIHx8IGRlZmF1bHRPbkVycm9yOwogICAgICBoYW5kbGVyMi5jYWxsKGNvbnRleHQyLCB2b2lkIDAsIHRhaWxbMF0pOwogICAgfQogICAgdHJlZS5wb3NpdGlvbiA9IHsKICAgICAgc3RhcnQ6IHBvaW50MihldmVudHMubGVuZ3RoID4gMCA/IGV2ZW50c1swXVsxXS5zdGFydCA6IHsKICAgICAgICBsaW5lOiAxLAogICAgICAgIGNvbHVtbjogMSwKICAgICAgICBvZmZzZXQ6IDAKICAgICAgfSksCiAgICAgIGVuZDogcG9pbnQyKGV2ZW50cy5sZW5ndGggPiAwID8gZXZlbnRzW2V2ZW50cy5sZW5ndGggLSAyXVsxXS5lbmQgOiB7CiAgICAgICAgbGluZTogMSwKICAgICAgICBjb2x1bW46IDEsCiAgICAgICAgb2Zmc2V0OiAwCiAgICAgIH0pCiAgICB9OwogICAgaW5kZXgyID0gLTE7CiAgICB3aGlsZSAoKytpbmRleDIgPCBjb25maWczLnRyYW5zZm9ybXMubGVuZ3RoKSB7CiAgICAgIHRyZWUgPSBjb25maWczLnRyYW5zZm9ybXNbaW5kZXgyXSh0cmVlKSB8fCB0cmVlOwogICAgfQogICAgcmV0dXJuIHRyZWU7CiAgfQogIGZ1bmN0aW9uIHByZXBhcmVMaXN0KGV2ZW50cywgc3RhcnQsIGxlbmd0aCkgewogICAgbGV0IGluZGV4MiA9IHN0YXJ0IC0gMTsKICAgIGxldCBjb250YWluZXJCYWxhbmNlID0gLTE7CiAgICBsZXQgbGlzdFNwcmVhZCA9IGZhbHNlOwogICAgbGV0IGxpc3RJdGVtNDsKICAgIGxldCBsaW5lSW5kZXg7CiAgICBsZXQgZmlyc3RCbGFua0xpbmVJbmRleDsKICAgIGxldCBhdE1hcmtlcjsKICAgIHdoaWxlICgrK2luZGV4MiA8PSBsZW5ndGgpIHsKICAgICAgY29uc3QgZXZlbnQgPSBldmVudHNbaW5kZXgyXTsKICAgICAgc3dpdGNoIChldmVudFsxXS50eXBlKSB7CiAgICAgICAgY2FzZSAibGlzdFVub3JkZXJlZCI6CiAgICAgICAgY2FzZSAibGlzdE9yZGVyZWQiOgogICAgICAgIGNhc2UgImJsb2NrUXVvdGUiOiB7CiAgICAgICAgICBpZiAoZXZlbnRbMF0gPT09ICJlbnRlciIpIHsKICAgICAgICAgICAgY29udGFpbmVyQmFsYW5jZSsrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29udGFpbmVyQmFsYW5jZS0tOwogICAgICAgICAgfQogICAgICAgICAgYXRNYXJrZXIgPSB2b2lkIDA7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAibGluZUVuZGluZ0JsYW5rIjogewogICAgICAgICAgaWYgKGV2ZW50WzBdID09PSAiZW50ZXIiKSB7CiAgICAgICAgICAgIGlmIChsaXN0SXRlbTQgJiYgIWF0TWFya2VyICYmICFjb250YWluZXJCYWxhbmNlICYmICFmaXJzdEJsYW5rTGluZUluZGV4KSB7CiAgICAgICAgICAgICAgZmlyc3RCbGFua0xpbmVJbmRleCA9IGluZGV4MjsKICAgICAgICAgICAgfQogICAgICAgICAgICBhdE1hcmtlciA9IHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICJsaW5lUHJlZml4IjoKICAgICAgICBjYXNlICJsaXN0SXRlbVZhbHVlIjoKICAgICAgICBjYXNlICJsaXN0SXRlbU1hcmtlciI6CiAgICAgICAgY2FzZSAibGlzdEl0ZW1QcmVmaXgiOgogICAgICAgIGNhc2UgImxpc3RJdGVtUHJlZml4V2hpdGVzcGFjZSI6IHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICBhdE1hcmtlciA9IHZvaWQgMDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFjb250YWluZXJCYWxhbmNlICYmIGV2ZW50WzBdID09PSAiZW50ZXIiICYmIGV2ZW50WzFdLnR5cGUgPT09ICJsaXN0SXRlbVByZWZpeCIgfHwgY29udGFpbmVyQmFsYW5jZSA9PT0gLTEgJiYgZXZlbnRbMF0gPT09ICJleGl0IiAmJiAoZXZlbnRbMV0udHlwZSA9PT0gImxpc3RVbm9yZGVyZWQiIHx8IGV2ZW50WzFdLnR5cGUgPT09ICJsaXN0T3JkZXJlZCIpKSB7CiAgICAgICAgaWYgKGxpc3RJdGVtNCkgewogICAgICAgICAgbGV0IHRhaWxJbmRleCA9IGluZGV4MjsKICAgICAgICAgIGxpbmVJbmRleCA9IHZvaWQgMDsKICAgICAgICAgIHdoaWxlICh0YWlsSW5kZXgtLSkgewogICAgICAgICAgICBjb25zdCB0YWlsRXZlbnQgPSBldmVudHNbdGFpbEluZGV4XTsKICAgICAgICAgICAgaWYgKHRhaWxFdmVudFsxXS50eXBlID09PSAibGluZUVuZGluZyIgfHwgdGFpbEV2ZW50WzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nQmxhbmsiKSB7CiAgICAgICAgICAgICAgaWYgKHRhaWxFdmVudFswXSA9PT0gImV4aXQiKSBjb250aW51ZTsKICAgICAgICAgICAgICBpZiAobGluZUluZGV4KSB7CiAgICAgICAgICAgICAgICBldmVudHNbbGluZUluZGV4XVsxXS50eXBlID0gImxpbmVFbmRpbmdCbGFuayI7CiAgICAgICAgICAgICAgICBsaXN0U3ByZWFkID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGFpbEV2ZW50WzFdLnR5cGUgPSAibGluZUVuZGluZyI7CiAgICAgICAgICAgICAgbGluZUluZGV4ID0gdGFpbEluZGV4OwogICAgICAgICAgICB9IGVsc2UgaWYgKHRhaWxFdmVudFsxXS50eXBlID09PSAibGluZVByZWZpeCIgfHwgdGFpbEV2ZW50WzFdLnR5cGUgPT09ICJibG9ja1F1b3RlUHJlZml4IiB8fCB0YWlsRXZlbnRbMV0udHlwZSA9PT0gImJsb2NrUXVvdGVQcmVmaXhXaGl0ZXNwYWNlIiB8fCB0YWlsRXZlbnRbMV0udHlwZSA9PT0gImJsb2NrUXVvdGVNYXJrZXIiIHx8IHRhaWxFdmVudFsxXS50eXBlID09PSAibGlzdEl0ZW1JbmRlbnQiKSB7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChmaXJzdEJsYW5rTGluZUluZGV4ICYmICghbGluZUluZGV4IHx8IGZpcnN0QmxhbmtMaW5lSW5kZXggPCBsaW5lSW5kZXgpKSB7CiAgICAgICAgICAgIGxpc3RJdGVtNC5fc3ByZWFkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGxpc3RJdGVtNC5lbmQgPSBPYmplY3QuYXNzaWduKHt9LCBsaW5lSW5kZXggPyBldmVudHNbbGluZUluZGV4XVsxXS5zdGFydCA6IGV2ZW50WzFdLmVuZCk7CiAgICAgICAgICBldmVudHMuc3BsaWNlKGxpbmVJbmRleCB8fCBpbmRleDIsIDAsIFsiZXhpdCIsIGxpc3RJdGVtNCwgZXZlbnRbMl1dKTsKICAgICAgICAgIGluZGV4MisrOwogICAgICAgICAgbGVuZ3RoKys7CiAgICAgICAgfQogICAgICAgIGlmIChldmVudFsxXS50eXBlID09PSAibGlzdEl0ZW1QcmVmaXgiKSB7CiAgICAgICAgICBjb25zdCBpdGVtID0gewogICAgICAgICAgICB0eXBlOiAibGlzdEl0ZW0iLAogICAgICAgICAgICBfc3ByZWFkOiBmYWxzZSwKICAgICAgICAgICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50WzFdLnN0YXJ0KSwKICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogd2XigJlsbCBhZGQgYGVuZGAgaW4gYSBzZWNvbmQuCiAgICAgICAgICAgIGVuZDogdm9pZCAwCiAgICAgICAgICB9OwogICAgICAgICAgbGlzdEl0ZW00ID0gaXRlbTsKICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaW5kZXgyLCAwLCBbImVudGVyIiwgaXRlbSwgZXZlbnRbMl1dKTsKICAgICAgICAgIGluZGV4MisrOwogICAgICAgICAgbGVuZ3RoKys7CiAgICAgICAgICBmaXJzdEJsYW5rTGluZUluZGV4ID0gdm9pZCAwOwogICAgICAgICAgYXRNYXJrZXIgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZXZlbnRzW3N0YXJ0XVsxXS5fc3ByZWFkID0gbGlzdFNwcmVhZDsKICAgIHJldHVybiBsZW5ndGg7CiAgfQogIGZ1bmN0aW9uIG9wZW5lcjIoY3JlYXRlNywgYW5kKSB7CiAgICByZXR1cm4gb3BlbjsKICAgIGZ1bmN0aW9uIG9wZW4odG9rZW4pIHsKICAgICAgZW50ZXIuY2FsbCh0aGlzLCBjcmVhdGU3KHRva2VuKSwgdG9rZW4pOwogICAgICBpZiAoYW5kKSBhbmQuY2FsbCh0aGlzLCB0b2tlbik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGJ1ZmZlcjIoKSB7CiAgICB0aGlzLnN0YWNrLnB1c2goewogICAgICB0eXBlOiAiZnJhZ21lbnQiLAogICAgICBjaGlsZHJlbjogW10KICAgIH0pOwogIH0KICBmdW5jdGlvbiBlbnRlcihub2RlMiwgdG9rZW4sIGVycm9ySGFuZGxlcikgewogICAgY29uc3QgcGFyZW50ID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgY29uc3Qgc2libGluZ3MyID0gcGFyZW50LmNoaWxkcmVuOwogICAgc2libGluZ3MyLnB1c2gobm9kZTIpOwogICAgdGhpcy5zdGFjay5wdXNoKG5vZGUyKTsKICAgIHRoaXMudG9rZW5TdGFjay5wdXNoKFt0b2tlbiwgZXJyb3JIYW5kbGVyIHx8IHZvaWQgMF0pOwogICAgbm9kZTIucG9zaXRpb24gPSB7CiAgICAgIHN0YXJ0OiBwb2ludDIodG9rZW4uc3RhcnQpLAogICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBgZW5kYCB3aWxsIGJlIHBhdGNoZWQgbGF0ZXIuCiAgICAgIGVuZDogdm9pZCAwCiAgICB9OwogIH0KICBmdW5jdGlvbiBjbG9zZXIoYW5kKSB7CiAgICByZXR1cm4gY2xvc2U3OwogICAgZnVuY3Rpb24gY2xvc2U3KHRva2VuKSB7CiAgICAgIGlmIChhbmQpIGFuZC5jYWxsKHRoaXMsIHRva2VuKTsKICAgICAgZXhpdDMuY2FsbCh0aGlzLCB0b2tlbik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGV4aXQzKHRva2VuLCBvbkV4aXRFcnJvcikgewogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrLnBvcCgpOwogICAgY29uc3Qgb3BlbiA9IHRoaXMudG9rZW5TdGFjay5wb3AoKTsKICAgIGlmICghb3BlbikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjbG9zZSBgIiArIHRva2VuLnR5cGUgKyAiYCAoIiArIHN0cmluZ2lmeVBvc2l0aW9uKHsKICAgICAgICBzdGFydDogdG9rZW4uc3RhcnQsCiAgICAgICAgZW5kOiB0b2tlbi5lbmQKICAgICAgfSkgKyAiKTogaXRcdTIwMTlzIG5vdCBvcGVuIik7CiAgICB9IGVsc2UgaWYgKG9wZW5bMF0udHlwZSAhPT0gdG9rZW4udHlwZSkgewogICAgICBpZiAob25FeGl0RXJyb3IpIHsKICAgICAgICBvbkV4aXRFcnJvci5jYWxsKHRoaXMsIHRva2VuLCBvcGVuWzBdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBoYW5kbGVyMiA9IG9wZW5bMV0gfHwgZGVmYXVsdE9uRXJyb3I7CiAgICAgICAgaGFuZGxlcjIuY2FsbCh0aGlzLCB0b2tlbiwgb3BlblswXSk7CiAgICAgIH0KICAgIH0KICAgIG5vZGUyLnBvc2l0aW9uLmVuZCA9IHBvaW50Mih0b2tlbi5lbmQpOwogIH0KICBmdW5jdGlvbiByZXN1bWUoKSB7CiAgICByZXR1cm4gdG9TdHJpbmcodGhpcy5zdGFjay5wb3AoKSk7CiAgfQogIGZ1bmN0aW9uIG9uZW50ZXJsaXN0b3JkZXJlZCgpIHsKICAgIHRoaXMuZGF0YS5leHBlY3RpbmdGaXJzdExpc3RJdGVtVmFsdWUgPSB0cnVlOwogIH0KICBmdW5jdGlvbiBvbmVudGVybGlzdGl0ZW12YWx1ZSh0b2tlbikgewogICAgaWYgKHRoaXMuZGF0YS5leHBlY3RpbmdGaXJzdExpc3RJdGVtVmFsdWUpIHsKICAgICAgY29uc3QgYW5jZXN0b3IgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMl07CiAgICAgIGFuY2VzdG9yLnN0YXJ0ID0gTnVtYmVyLnBhcnNlSW50KHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pLCAxMCk7CiAgICAgIHRoaXMuZGF0YS5leHBlY3RpbmdGaXJzdExpc3RJdGVtVmFsdWUgPSB2b2lkIDA7CiAgICB9CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8oKSB7CiAgICBjb25zdCBkYXRhMiA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLmxhbmcgPSBkYXRhMjsKICB9CiAgZnVuY3Rpb24gb25leGl0Y29kZWZlbmNlZGZlbmNlbWV0YSgpIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIubWV0YSA9IGRhdGEyOwogIH0KICBmdW5jdGlvbiBvbmV4aXRjb2RlZmVuY2VkZmVuY2UoKSB7CiAgICBpZiAodGhpcy5kYXRhLmZsb3dDb2RlSW5zaWRlKSByZXR1cm47CiAgICB0aGlzLmJ1ZmZlcigpOwogICAgdGhpcy5kYXRhLmZsb3dDb2RlSW5zaWRlID0gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gb25leGl0Y29kZWZlbmNlZCgpIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIudmFsdWUgPSBkYXRhMi5yZXBsYWNlKC9eKFxyP1xufFxyKXwoXHI/XG58XHIpJC9nLCAiIik7CiAgICB0aGlzLmRhdGEuZmxvd0NvZGVJbnNpZGUgPSB2b2lkIDA7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGNvZGVpbmRlbnRlZCgpIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIudmFsdWUgPSBkYXRhMi5yZXBsYWNlKC8oXHI/XG58XHIpJC9nLCAiIik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZyh0b2tlbikgewogICAgY29uc3QgbGFiZWwgPSB0aGlzLnJlc3VtZSgpOwogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBub2RlMi5sYWJlbCA9IGxhYmVsOwogICAgbm9kZTIuaWRlbnRpZmllciA9IG5vcm1hbGl6ZUlkZW50aWZpZXIodGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbikpLnRvTG93ZXJDYXNlKCk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGRlZmluaXRpb250aXRsZXN0cmluZygpIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIudGl0bGUgPSBkYXRhMjsKICB9CiAgZnVuY3Rpb24gb25leGl0ZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nKCkgewogICAgY29uc3QgZGF0YTIgPSB0aGlzLnJlc3VtZSgpOwogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBub2RlMi51cmwgPSBkYXRhMjsKICB9CiAgZnVuY3Rpb24gb25leGl0YXR4aGVhZGluZ3NlcXVlbmNlKHRva2VuKSB7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIGlmICghbm9kZTIuZGVwdGgpIHsKICAgICAgY29uc3QgZGVwdGggPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKS5sZW5ndGg7CiAgICAgIG5vZGUyLmRlcHRoID0gZGVwdGg7CiAgICB9CiAgfQogIGZ1bmN0aW9uIG9uZXhpdHNldGV4dGhlYWRpbmd0ZXh0KCkgewogICAgdGhpcy5kYXRhLnNldGV4dEhlYWRpbmdTbHVycExpbmVFbmRpbmcgPSB0cnVlOwogIH0KICBmdW5jdGlvbiBvbmV4aXRzZXRleHRoZWFkaW5nbGluZXNlcXVlbmNlKHRva2VuKSB7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLmRlcHRoID0gdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbikuY29kZVBvaW50QXQoMCkgPT09IDYxID8gMSA6IDI7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdHNldGV4dGhlYWRpbmcoKSB7CiAgICB0aGlzLmRhdGEuc2V0ZXh0SGVhZGluZ1NsdXJwTGluZUVuZGluZyA9IHZvaWQgMDsKICB9CiAgZnVuY3Rpb24gb25lbnRlcmRhdGEodG9rZW4pIHsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgY29uc3Qgc2libGluZ3MyID0gbm9kZTIuY2hpbGRyZW47CiAgICBsZXQgdGFpbCA9IHNpYmxpbmdzMltzaWJsaW5nczIubGVuZ3RoIC0gMV07CiAgICBpZiAoIXRhaWwgfHwgdGFpbC50eXBlICE9PSAidGV4dCIpIHsKICAgICAgdGFpbCA9IHRleHQ5KCk7CiAgICAgIHRhaWwucG9zaXRpb24gPSB7CiAgICAgICAgc3RhcnQ6IHBvaW50Mih0b2tlbi5zdGFydCksCiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogd2XigJlsbCBhZGQgYGVuZGAgbGF0ZXIuCiAgICAgICAgZW5kOiB2b2lkIDAKICAgICAgfTsKICAgICAgc2libGluZ3MyLnB1c2godGFpbCk7CiAgICB9CiAgICB0aGlzLnN0YWNrLnB1c2godGFpbCk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGRhdGEodG9rZW4pIHsKICAgIGNvbnN0IHRhaWwgPSB0aGlzLnN0YWNrLnBvcCgpOwogICAgdGFpbC52YWx1ZSArPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICAgIHRhaWwucG9zaXRpb24uZW5kID0gcG9pbnQyKHRva2VuLmVuZCk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGxpbmVlbmRpbmcodG9rZW4pIHsKICAgIGNvbnN0IGNvbnRleHQyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgaWYgKHRoaXMuZGF0YS5hdEhhcmRCcmVhaykgewogICAgICBjb25zdCB0YWlsID0gY29udGV4dDIuY2hpbGRyZW5bY29udGV4dDIuY2hpbGRyZW4ubGVuZ3RoIC0gMV07CiAgICAgIHRhaWwucG9zaXRpb24uZW5kID0gcG9pbnQyKHRva2VuLmVuZCk7CiAgICAgIHRoaXMuZGF0YS5hdEhhcmRCcmVhayA9IHZvaWQgMDsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCF0aGlzLmRhdGEuc2V0ZXh0SGVhZGluZ1NsdXJwTGluZUVuZGluZyAmJiBjb25maWczLmNhbkNvbnRhaW5Fb2xzLmluY2x1ZGVzKGNvbnRleHQyLnR5cGUpKSB7CiAgICAgIG9uZW50ZXJkYXRhLmNhbGwodGhpcywgdG9rZW4pOwogICAgICBvbmV4aXRkYXRhLmNhbGwodGhpcywgdG9rZW4pOwogICAgfQogIH0KICBmdW5jdGlvbiBvbmV4aXRoYXJkYnJlYWsoKSB7CiAgICB0aGlzLmRhdGEuYXRIYXJkQnJlYWsgPSB0cnVlOwogIH0KICBmdW5jdGlvbiBvbmV4aXRodG1sZmxvdygpIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIudmFsdWUgPSBkYXRhMjsKICB9CiAgZnVuY3Rpb24gb25leGl0aHRtbHRleHQoKSB7CiAgICBjb25zdCBkYXRhMiA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLnZhbHVlID0gZGF0YTI7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGNvZGV0ZXh0KCkgewogICAgY29uc3QgZGF0YTIgPSB0aGlzLnJlc3VtZSgpOwogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBub2RlMi52YWx1ZSA9IGRhdGEyOwogIH0KICBmdW5jdGlvbiBvbmV4aXRsaW5rKCkgewogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBpZiAodGhpcy5kYXRhLmluUmVmZXJlbmNlKSB7CiAgICAgIGNvbnN0IHJlZmVyZW5jZVR5cGUgPSB0aGlzLmRhdGEucmVmZXJlbmNlVHlwZSB8fCAic2hvcnRjdXQiOwogICAgICBub2RlMi50eXBlICs9ICJSZWZlcmVuY2UiOwogICAgICBub2RlMi5yZWZlcmVuY2VUeXBlID0gcmVmZXJlbmNlVHlwZTsKICAgICAgZGVsZXRlIG5vZGUyLnVybDsKICAgICAgZGVsZXRlIG5vZGUyLnRpdGxlOwogICAgfSBlbHNlIHsKICAgICAgZGVsZXRlIG5vZGUyLmlkZW50aWZpZXI7CiAgICAgIGRlbGV0ZSBub2RlMi5sYWJlbDsKICAgIH0KICAgIHRoaXMuZGF0YS5yZWZlcmVuY2VUeXBlID0gdm9pZCAwOwogIH0KICBmdW5jdGlvbiBvbmV4aXRpbWFnZSgpIHsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgaWYgKHRoaXMuZGF0YS5pblJlZmVyZW5jZSkgewogICAgICBjb25zdCByZWZlcmVuY2VUeXBlID0gdGhpcy5kYXRhLnJlZmVyZW5jZVR5cGUgfHwgInNob3J0Y3V0IjsKICAgICAgbm9kZTIudHlwZSArPSAiUmVmZXJlbmNlIjsKICAgICAgbm9kZTIucmVmZXJlbmNlVHlwZSA9IHJlZmVyZW5jZVR5cGU7CiAgICAgIGRlbGV0ZSBub2RlMi51cmw7CiAgICAgIGRlbGV0ZSBub2RlMi50aXRsZTsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGV0ZSBub2RlMi5pZGVudGlmaWVyOwogICAgICBkZWxldGUgbm9kZTIubGFiZWw7CiAgICB9CiAgICB0aGlzLmRhdGEucmVmZXJlbmNlVHlwZSA9IHZvaWQgMDsKICB9CiAgZnVuY3Rpb24gb25leGl0bGFiZWx0ZXh0KHRva2VuKSB7CiAgICBjb25zdCBzdHJpbmczID0gdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbik7CiAgICBjb25zdCBhbmNlc3RvciA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAyXTsKICAgIGFuY2VzdG9yLmxhYmVsID0gZGVjb2RlU3RyaW5nKHN0cmluZzMpOwogICAgYW5jZXN0b3IuaWRlbnRpZmllciA9IG5vcm1hbGl6ZUlkZW50aWZpZXIoc3RyaW5nMykudG9Mb3dlckNhc2UoKTsKICB9CiAgZnVuY3Rpb24gb25leGl0bGFiZWwoKSB7CiAgICBjb25zdCBmcmFnbWVudCA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIGNvbnN0IHZhbHVlMiA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIHRoaXMuZGF0YS5pblJlZmVyZW5jZSA9IHRydWU7CiAgICBpZiAobm9kZTIudHlwZSA9PT0gImxpbmsiKSB7CiAgICAgIGNvbnN0IGNoaWxkcmVuMiA9IGZyYWdtZW50LmNoaWxkcmVuOwogICAgICBub2RlMi5jaGlsZHJlbiA9IGNoaWxkcmVuMjsKICAgIH0gZWxzZSB7CiAgICAgIG5vZGUyLmFsdCA9IHZhbHVlMjsKICAgIH0KICB9CiAgZnVuY3Rpb24gb25leGl0cmVzb3VyY2VkZXN0aW5hdGlvbnN0cmluZygpIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIudXJsID0gZGF0YTI7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdHJlc291cmNldGl0bGVzdHJpbmcoKSB7CiAgICBjb25zdCBkYXRhMiA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLnRpdGxlID0gZGF0YTI7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdHJlc291cmNlKCkgewogICAgdGhpcy5kYXRhLmluUmVmZXJlbmNlID0gdm9pZCAwOwogIH0KICBmdW5jdGlvbiBvbmVudGVycmVmZXJlbmNlKCkgewogICAgdGhpcy5kYXRhLnJlZmVyZW5jZVR5cGUgPSAiY29sbGFwc2VkIjsKICB9CiAgZnVuY3Rpb24gb25leGl0cmVmZXJlbmNlc3RyaW5nKHRva2VuKSB7CiAgICBjb25zdCBsYWJlbCA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLmxhYmVsID0gbGFiZWw7CiAgICBub2RlMi5pZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcih0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKSkudG9Mb3dlckNhc2UoKTsKICAgIHRoaXMuZGF0YS5yZWZlcmVuY2VUeXBlID0gImZ1bGwiOwogIH0KICBmdW5jdGlvbiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2VtYXJrZXIodG9rZW4pIHsKICAgIHRoaXMuZGF0YS5jaGFyYWN0ZXJSZWZlcmVuY2VUeXBlID0gdG9rZW4udHlwZTsKICB9CiAgZnVuY3Rpb24gb25leGl0Y2hhcmFjdGVycmVmZXJlbmNldmFsdWUodG9rZW4pIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbik7CiAgICBjb25zdCB0eXBlNSA9IHRoaXMuZGF0YS5jaGFyYWN0ZXJSZWZlcmVuY2VUeXBlOwogICAgbGV0IHZhbHVlMjsKICAgIGlmICh0eXBlNSkgewogICAgICB2YWx1ZTIgPSBkZWNvZGVOdW1lcmljQ2hhcmFjdGVyUmVmZXJlbmNlKGRhdGEyLCB0eXBlNSA9PT0gImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlck51bWVyaWMiID8gMTAgOiAxNik7CiAgICAgIHRoaXMuZGF0YS5jaGFyYWN0ZXJSZWZlcmVuY2VUeXBlID0gdm9pZCAwOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgcmVzdWx0ID0gZGVjb2RlTmFtZWRDaGFyYWN0ZXJSZWZlcmVuY2UoZGF0YTIpOwogICAgICB2YWx1ZTIgPSByZXN1bHQ7CiAgICB9CiAgICBjb25zdCB0YWlsID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgdGFpbC52YWx1ZSArPSB2YWx1ZTI7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZSh0b2tlbikgewogICAgY29uc3QgdGFpbCA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICB0YWlsLnBvc2l0aW9uLmVuZCA9IHBvaW50Mih0b2tlbi5lbmQpOwogIH0KICBmdW5jdGlvbiBvbmV4aXRhdXRvbGlua3Byb3RvY29sKHRva2VuKSB7CiAgICBvbmV4aXRkYXRhLmNhbGwodGhpcywgdG9rZW4pOwogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBub2RlMi51cmwgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICB9CiAgZnVuY3Rpb24gb25leGl0YXV0b2xpbmtlbWFpbCh0b2tlbikgewogICAgb25leGl0ZGF0YS5jYWxsKHRoaXMsIHRva2VuKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIudXJsID0gIm1haWx0bzoiICsgdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbik7CiAgfQogIGZ1bmN0aW9uIGJsb2NrUXVvdGUyKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImJsb2NrcXVvdGUiLAogICAgICBjaGlsZHJlbjogW10KICAgIH07CiAgfQogIGZ1bmN0aW9uIGNvZGVGbG93KCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImNvZGUiLAogICAgICBsYW5nOiBudWxsLAogICAgICBtZXRhOiBudWxsLAogICAgICB2YWx1ZTogIiIKICAgIH07CiAgfQogIGZ1bmN0aW9uIGNvZGVUZXh0MigpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJpbmxpbmVDb2RlIiwKICAgICAgdmFsdWU6ICIiCiAgICB9OwogIH0KICBmdW5jdGlvbiBkZWZpbml0aW9uMygpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJkZWZpbml0aW9uIiwKICAgICAgaWRlbnRpZmllcjogIiIsCiAgICAgIGxhYmVsOiBudWxsLAogICAgICB0aXRsZTogbnVsbCwKICAgICAgdXJsOiAiIgogICAgfTsKICB9CiAgZnVuY3Rpb24gZW1waGFzaXMzKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImVtcGhhc2lzIiwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogIH0KICBmdW5jdGlvbiBoZWFkaW5nMygpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJoZWFkaW5nIiwKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgZGVwdGhgIHdpbGwgYmUgc2V0IGxhdGVyLgogICAgICBkZXB0aDogMCwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogIH0KICBmdW5jdGlvbiBoYXJkQnJlYWszKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImJyZWFrIgogICAgfTsKICB9CiAgZnVuY3Rpb24gaHRtbDE2KCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImh0bWwiLAogICAgICB2YWx1ZTogIiIKICAgIH07CiAgfQogIGZ1bmN0aW9uIGltYWdlMygpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJpbWFnZSIsCiAgICAgIHRpdGxlOiBudWxsLAogICAgICB1cmw6ICIiLAogICAgICBhbHQ6IG51bGwKICAgIH07CiAgfQogIGZ1bmN0aW9uIGxpbmszKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImxpbmsiLAogICAgICB0aXRsZTogbnVsbCwKICAgICAgdXJsOiAiIiwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogIH0KICBmdW5jdGlvbiBsaXN0NSh0b2tlbikgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImxpc3QiLAogICAgICBvcmRlcmVkOiB0b2tlbi50eXBlID09PSAibGlzdE9yZGVyZWQiLAogICAgICBzdGFydDogbnVsbCwKICAgICAgc3ByZWFkOiB0b2tlbi5fc3ByZWFkLAogICAgICBjaGlsZHJlbjogW10KICAgIH07CiAgfQogIGZ1bmN0aW9uIGxpc3RJdGVtMyh0b2tlbikgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImxpc3RJdGVtIiwKICAgICAgc3ByZWFkOiB0b2tlbi5fc3ByZWFkLAogICAgICBjaGVja2VkOiBudWxsLAogICAgICBjaGlsZHJlbjogW10KICAgIH07CiAgfQogIGZ1bmN0aW9uIHBhcmFncmFwaDMoKSB7CiAgICByZXR1cm4gewogICAgICB0eXBlOiAicGFyYWdyYXBoIiwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHJvbmczKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogInN0cm9uZyIsCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfTsKICB9CiAgZnVuY3Rpb24gdGV4dDkoKSB7CiAgICByZXR1cm4gewogICAgICB0eXBlOiAidGV4dCIsCiAgICAgIHZhbHVlOiAiIgogICAgfTsKICB9CiAgZnVuY3Rpb24gdGhlbWF0aWNCcmVhazQoKSB7CiAgICByZXR1cm4gewogICAgICB0eXBlOiAidGhlbWF0aWNCcmVhayIKICAgIH07CiAgfQp9CmZ1bmN0aW9uIHBvaW50MihkNikgewogIHJldHVybiB7CiAgICBsaW5lOiBkNi5saW5lLAogICAgY29sdW1uOiBkNi5jb2x1bW4sCiAgICBvZmZzZXQ6IGQ2Lm9mZnNldAogIH07Cn0KZnVuY3Rpb24gY29uZmlndXJlMihjb21iaW5lZCwgZXh0ZW5zaW9ucykgewogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBleHRlbnNpb25zLmxlbmd0aCkgewogICAgY29uc3QgdmFsdWUyID0gZXh0ZW5zaW9uc1tpbmRleDJdOwogICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUyKSkgewogICAgICBjb25maWd1cmUyKGNvbWJpbmVkLCB2YWx1ZTIpOwogICAgfSBlbHNlIHsKICAgICAgZXh0ZW5zaW9uKGNvbWJpbmVkLCB2YWx1ZTIpOwogICAgfQogIH0KfQpmdW5jdGlvbiBleHRlbnNpb24oY29tYmluZWQsIGV4dGVuc2lvbjIpIHsKICBsZXQga2V5MjsKICBmb3IgKGtleTIgaW4gZXh0ZW5zaW9uMikgewogICAgaWYgKG93bjUuY2FsbChleHRlbnNpb24yLCBrZXkyKSkgewogICAgICBzd2l0Y2ggKGtleTIpIHsKICAgICAgICBjYXNlICJjYW5Db250YWluRW9scyI6IHsKICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gZXh0ZW5zaW9uMltrZXkyXTsKICAgICAgICAgIGlmIChyaWdodCkgewogICAgICAgICAgICBjb21iaW5lZFtrZXkyXS5wdXNoKC4uLnJpZ2h0KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICJ0cmFuc2Zvcm1zIjogewogICAgICAgICAgY29uc3QgcmlnaHQgPSBleHRlbnNpb24yW2tleTJdOwogICAgICAgICAgaWYgKHJpZ2h0KSB7CiAgICAgICAgICAgIGNvbWJpbmVkW2tleTJdLnB1c2goLi4ucmlnaHQpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgImVudGVyIjoKICAgICAgICBjYXNlICJleGl0IjogewogICAgICAgICAgY29uc3QgcmlnaHQgPSBleHRlbnNpb24yW2tleTJdOwogICAgICAgICAgaWYgKHJpZ2h0KSB7CiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29tYmluZWRba2V5Ml0sIHJpZ2h0KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQpmdW5jdGlvbiBkZWZhdWx0T25FcnJvcihsZWZ0LCByaWdodCkgewogIGlmIChsZWZ0KSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjbG9zZSBgIiArIGxlZnQudHlwZSArICJgICgiICsgc3RyaW5naWZ5UG9zaXRpb24oewogICAgICBzdGFydDogbGVmdC5zdGFydCwKICAgICAgZW5kOiBsZWZ0LmVuZAogICAgfSkgKyAiKTogYSBkaWZmZXJlbnQgdG9rZW4gKGAiICsgcmlnaHQudHlwZSArICJgLCAiICsgc3RyaW5naWZ5UG9zaXRpb24oewogICAgICBzdGFydDogcmlnaHQuc3RhcnQsCiAgICAgIGVuZDogcmlnaHQuZW5kCiAgICB9KSArICIpIGlzIG9wZW4iKTsKICB9IGVsc2UgewogICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY2xvc2UgZG9jdW1lbnQsIGEgdG9rZW4gKGAiICsgcmlnaHQudHlwZSArICJgLCAiICsgc3RyaW5naWZ5UG9zaXRpb24oewogICAgICBzdGFydDogcmlnaHQuc3RhcnQsCiAgICAgIGVuZDogcmlnaHQuZW5kCiAgICB9KSArICIpIGlzIHN0aWxsIG9wZW4iKTsKICB9Cn0KdmFyIG93bjU7CnZhciBpbml0X2xpYjIxID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duQDIuMC4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWZyb20tbWFya2Rvd24vbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfbWRhc3RfdXRpbF90b19zdHJpbmcoKTsKICAgIGluaXRfbWljcm9tYXJrKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2RlY29kZV9udW1lcmljX2NoYXJhY3Rlcl9yZWZlcmVuY2UoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfZGVjb2RlX3N0cmluZygpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9ub3JtYWxpemVfaWRlbnRpZmllcigpOwogICAgaW5pdF9pbmRleF9kb20oKTsKICAgIGluaXRfdW5pc3RfdXRpbF9zdHJpbmdpZnlfcG9zaXRpb24oKTsKICAgIG93bjUgPSB7fS5oYXNPd25Qcm9wZXJ0eTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZnJvbS1tYXJrZG93bkAyLjAuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duL2luZGV4LmpzCnZhciBpbml0X21kYXN0X3V0aWxfZnJvbV9tYXJrZG93biA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZnJvbS1tYXJrZG93bkAyLjAuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliMjEoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1wYXJzZUAxMS4wLjAvbm9kZV9tb2R1bGVzL3JlbWFyay1wYXJzZS9saWIvaW5kZXguanMKZnVuY3Rpb24gcmVtYXJrUGFyc2Uob3B0aW9ucykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBzZWxmMi5wYXJzZXIgPSBwYXJzZXI7CiAgZnVuY3Rpb24gcGFyc2VyKGRvYykgewogICAgcmV0dXJuIGZyb21NYXJrZG93bihkb2MsIHsKICAgICAgLi4uc2VsZjIuZGF0YSgic2V0dGluZ3MiKSwKICAgICAgLi4ub3B0aW9ucywKICAgICAgLy8gTm90ZTogdGhlc2Ugb3B0aW9ucyBhcmUgbm90IGluIHRoZSByZWFkbWUuCiAgICAgIC8vIFRoZSBnb2FsIGlzIGZvciB0aGVtIHRvIGJlIHNldCBieSBwbHVnaW5zIG9uIGBkYXRhYCBpbnN0ZWFkIG9mIGJlaW5nCiAgICAgIC8vIHBhc3NlZCBieSB1c2Vycy4KICAgICAgZXh0ZW5zaW9uczogc2VsZjIuZGF0YSgibWljcm9tYXJrRXh0ZW5zaW9ucyIpIHx8IFtdLAogICAgICBtZGFzdEV4dGVuc2lvbnM6IHNlbGYyLmRhdGEoImZyb21NYXJrZG93bkV4dGVuc2lvbnMiKSB8fCBbXQogICAgfSk7CiAgfQp9CnZhciBpbml0X2xpYjIyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcmVtYXJrLXBhcnNlQDExLjAuMC9ub2RlX21vZHVsZXMvcmVtYXJrLXBhcnNlL2xpYi9pbmRleC5qcyIoKSB7CiAgICBpbml0X21kYXN0X3V0aWxfZnJvbV9tYXJrZG93bigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcmVtYXJrLXBhcnNlQDExLjAuMC9ub2RlX21vZHVsZXMvcmVtYXJrLXBhcnNlL2luZGV4LmpzCnZhciBpbml0X3JlbWFya19wYXJzZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1wYXJzZUAxMS4wLjAvbm9kZV9tb2R1bGVzL3JlbWFyay1wYXJzZS9pbmRleC5qcyIoKSB7CiAgICBpbml0X2xpYjIyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mb3JtYXRAMC4yLjIvbm9kZV9tb2R1bGVzL2Zvcm1hdC9mb3JtYXQuanMKdmFyIHJlcXVpcmVfZm9ybWF0ID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9mb3JtYXRAMC4yLjIvbm9kZV9tb2R1bGVzL2Zvcm1hdC9mb3JtYXQuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgOwogICAgKGZ1bmN0aW9uKCkgewogICAgICB2YXIgbmFtZXNwYWNlMjsKICAgICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgbmFtZXNwYWNlMiA9IG1vZHVsZS5leHBvcnRzID0gZm9ybWF0MjsKICAgICAgfSBlbHNlIHsKICAgICAgICBuYW1lc3BhY2UyID0gKGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMgfHwgKDEsIGV2YWwpKCJ0aGlzIik7CiAgICAgICAgfSkoKTsKICAgICAgfQogICAgICBuYW1lc3BhY2UyLmZvcm1hdCA9IGZvcm1hdDI7CiAgICAgIG5hbWVzcGFjZTIudnNwcmludGYgPSB2c3ByaW50ZjsKICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgY29uc29sZS5sb2cgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICBuYW1lc3BhY2UyLnByaW50ZiA9IHByaW50ZjsKICAgICAgfQogICAgICBmdW5jdGlvbiBwcmludGYoKSB7CiAgICAgICAgY29uc29sZS5sb2coZm9ybWF0Mi5hcHBseShudWxsLCBhcmd1bWVudHMpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiB2c3ByaW50ZihmbXQsIHJlcGxhY2VtZW50cykgewogICAgICAgIHJldHVybiBmb3JtYXQyLmFwcGx5KG51bGwsIFtmbXRdLmNvbmNhdChyZXBsYWNlbWVudHMpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBmb3JtYXQyKGZtdCkgewogICAgICAgIHZhciBhcmdJbmRleCA9IDEsIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyksIGkxMSA9IDAsIG4xMyA9IGZtdC5sZW5ndGgsIHJlc3VsdCA9ICIiLCBjMTEsIGVzY2FwZWQgPSBmYWxzZSwgYXJnLCB0bXAsIGxlYWRpbmdaZXJvID0gZmFsc2UsIHByZWNpc2lvbiwgbmV4dEFyZyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107CiAgICAgICAgfSwgc2x1cnBOdW1iZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBkaWdpdHMgPSAiIjsKICAgICAgICAgIHdoaWxlICgvXGQvLnRlc3QoZm10W2kxMV0pKSB7CiAgICAgICAgICAgIGRpZ2l0cyArPSBmbXRbaTExKytdOwogICAgICAgICAgICBjMTEgPSBmbXRbaTExXTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBkaWdpdHMubGVuZ3RoID4gMCA/IHBhcnNlSW50KGRpZ2l0cykgOiBudWxsOwogICAgICAgIH07CiAgICAgICAgZm9yICg7IGkxMSA8IG4xMzsgKytpMTEpIHsKICAgICAgICAgIGMxMSA9IGZtdFtpMTFdOwogICAgICAgICAgaWYgKGVzY2FwZWQpIHsKICAgICAgICAgICAgZXNjYXBlZCA9IGZhbHNlOwogICAgICAgICAgICBpZiAoYzExID09ICIuIikgewogICAgICAgICAgICAgIGxlYWRpbmdaZXJvID0gZmFsc2U7CiAgICAgICAgICAgICAgYzExID0gZm10WysraTExXTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjMTEgPT0gIjAiICYmIGZtdFtpMTEgKyAxXSA9PSAiLiIpIHsKICAgICAgICAgICAgICBsZWFkaW5nWmVybyA9IHRydWU7CiAgICAgICAgICAgICAgaTExICs9IDI7CiAgICAgICAgICAgICAgYzExID0gZm10W2kxMV07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbGVhZGluZ1plcm8gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByZWNpc2lvbiA9IHNsdXJwTnVtYmVyKCk7CiAgICAgICAgICAgIHN3aXRjaCAoYzExKSB7CiAgICAgICAgICAgICAgY2FzZSAiYiI6CiAgICAgICAgICAgICAgICByZXN1bHQgKz0gcGFyc2VJbnQobmV4dEFyZygpLCAxMCkudG9TdHJpbmcoMik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICJjIjoKICAgICAgICAgICAgICAgIGFyZyA9IG5leHRBcmcoKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAic3RyaW5nIiB8fCBhcmcgaW5zdGFuY2VvZiBTdHJpbmcpCiAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhcmc7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGFyZywgMTApKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgImQiOgogICAgICAgICAgICAgICAgcmVzdWx0ICs9IHBhcnNlSW50KG5leHRBcmcoKSwgMTApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAiZiI6CiAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmcocGFyc2VGbG9hdChuZXh0QXJnKCkpLnRvRml4ZWQocHJlY2lzaW9uIHx8IDYpKTsKICAgICAgICAgICAgICAgIHJlc3VsdCArPSBsZWFkaW5nWmVybyA/IHRtcCA6IHRtcC5yZXBsYWNlKC9eMC8sICIiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgImoiOgogICAgICAgICAgICAgICAgcmVzdWx0ICs9IEpTT04uc3RyaW5naWZ5KG5leHRBcmcoKSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICJvIjoKICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiMCIgKyBwYXJzZUludChuZXh0QXJnKCksIDEwKS50b1N0cmluZyg4KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgInMiOgogICAgICAgICAgICAgICAgcmVzdWx0ICs9IG5leHRBcmcoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgIngiOgogICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIweCIgKyBwYXJzZUludChuZXh0QXJnKCksIDEwKS50b1N0cmluZygxNik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICJYIjoKICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiMHgiICsgcGFyc2VJbnQobmV4dEFyZygpLCAxMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmVzdWx0ICs9IGMxMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKGMxMSA9PT0gIiUiKSB7CiAgICAgICAgICAgIGVzY2FwZWQgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0ICs9IGMxMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgfSkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZhdWx0QDIuMC4xL25vZGVfbW9kdWxlcy9mYXVsdC9pbmRleC5qcwpmdW5jdGlvbiBjcmVhdGU1KENvbnN0cnVjdG9yKSB7CiAgRm9ybWF0dGVkRXJyb3IuZGlzcGxheU5hbWUgPSBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCBDb25zdHJ1Y3Rvci5uYW1lOwogIHJldHVybiBGb3JtYXR0ZWRFcnJvcjsKICBmdW5jdGlvbiBGb3JtYXR0ZWRFcnJvcihmb3JtYXQyLCAuLi52YWx1ZXMpIHsKICAgIGNvbnN0IHJlYXNvbiA9IGZvcm1hdDIgPyAoMCwgaW1wb3J0X2Zvcm1hdDIuZGVmYXVsdCkoZm9ybWF0MiwgLi4udmFsdWVzKSA6IGZvcm1hdDI7CiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHJlYXNvbik7CiAgfQp9CnZhciBpbXBvcnRfZm9ybWF0MiwgZmF1bHQ7CnZhciBpbml0X2ZhdWx0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZmF1bHRAMi4wLjEvbm9kZV9tb2R1bGVzL2ZhdWx0L2luZGV4LmpzIigpIHsKICAgIGltcG9ydF9mb3JtYXQyID0gX190b0VTTShyZXF1aXJlX2Zvcm1hdCgpLCAxKTsKICAgIGZhdWx0ID0gT2JqZWN0LmFzc2lnbihjcmVhdGU1KEVycm9yKSwgewogICAgICBldmFsOiBjcmVhdGU1KEV2YWxFcnJvciksCiAgICAgIHJhbmdlOiBjcmVhdGU1KFJhbmdlRXJyb3IpLAogICAgICByZWZlcmVuY2U6IGNyZWF0ZTUoUmVmZXJlbmNlRXJyb3IpLAogICAgICBzeW50YXg6IGNyZWF0ZTUoU3ludGF4RXJyb3IpLAogICAgICB0eXBlOiBjcmVhdGU1KFR5cGVFcnJvciksCiAgICAgIHVyaTogY3JlYXRlNShVUklFcnJvcikKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlckAyLjAuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlci9saWIvdG8tbWF0dGVycy5qcwpmdW5jdGlvbiB0b01hdHRlcnMob3B0aW9ucykgewogIGNvbnN0IHJlc3VsdCA9IFtdOwogIGxldCBpbmRleDIgPSAtMTsKICBjb25zdCBwcmVzZXRzT3JNYXR0ZXJzID0gQXJyYXkuaXNBcnJheShvcHRpb25zKSA/IG9wdGlvbnMgOiBvcHRpb25zID8gW29wdGlvbnNdIDogWyJ5YW1sIl07CiAgd2hpbGUgKCsraW5kZXgyIDwgcHJlc2V0c09yTWF0dGVycy5sZW5ndGgpIHsKICAgIHJlc3VsdFtpbmRleDJdID0gbWF0dGVyKHByZXNldHNPck1hdHRlcnNbaW5kZXgyXSk7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gbWF0dGVyKG9wdGlvbjIpIHsKICBsZXQgcmVzdWx0ID0gb3B0aW9uMjsKICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gInN0cmluZyIpIHsKICAgIGlmICghb3duNi5jYWxsKG1hcmtlcnMsIHJlc3VsdCkpIHsKICAgICAgdGhyb3cgZmF1bHQoIk1pc3NpbmcgbWF0dGVyIGRlZmluaXRpb24gZm9yIGAlc2AiLCByZXN1bHQpOwogICAgfQogICAgcmVzdWx0ID0gewogICAgICB0eXBlOiByZXN1bHQsCiAgICAgIG1hcmtlcjogbWFya2Vyc1tyZXN1bHRdCiAgICB9OwogIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHsKICAgIHRocm93IGZhdWx0KCJFeHBlY3RlZCBtYXR0ZXIgdG8gYmUgYW4gb2JqZWN0LCBub3QgYCVqYCIsIHJlc3VsdCk7CiAgfQogIGlmICghb3duNi5jYWxsKHJlc3VsdCwgInR5cGUiKSkgewogICAgdGhyb3cgZmF1bHQoIk1pc3NpbmcgYHR5cGVgIGluIG1hdHRlciBgJWpgIiwgcmVzdWx0KTsKICB9CiAgaWYgKCFvd242LmNhbGwocmVzdWx0LCAiZmVuY2UiKSAmJiAhb3duNi5jYWxsKHJlc3VsdCwgIm1hcmtlciIpKSB7CiAgICB0aHJvdyBmYXVsdCgiTWlzc2luZyBgbWFya2VyYCBvciBgZmVuY2VgIGluIG1hdHRlciBgJWpgIiwgcmVzdWx0KTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQp2YXIgb3duNiwgbWFya2VyczsKdmFyIGluaXRfdG9fbWF0dGVycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZnJvbnRtYXR0ZXJAMi4wLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZnJvbnRtYXR0ZXIvbGliL3RvLW1hdHRlcnMuanMiKCkgewogICAgaW5pdF9mYXVsdCgpOwogICAgb3duNiA9IHt9Lmhhc093blByb3BlcnR5OwogICAgbWFya2VycyA9IHsKICAgICAgeWFtbDogIi0iLAogICAgICB0b21sOiAiKyIKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWZyb250bWF0dGVyQDIuMC4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWZyb250bWF0dGVyL2xpYi9zeW50YXguanMKZnVuY3Rpb24gZnJvbnRtYXR0ZXIob3B0aW9ucykgewogIGNvbnN0IG1hdHRlcnMgPSB0b01hdHRlcnMob3B0aW9ucyk7CiAgY29uc3QgZmxvdzMgPSB7fTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgbWF0dGVycy5sZW5ndGgpIHsKICAgIGNvbnN0IG1hdHRlcjIgPSBtYXR0ZXJzW2luZGV4Ml07CiAgICBjb25zdCBjb2RlNCA9IGZlbmNlKG1hdHRlcjIsICJvcGVuIikuY2hhckNvZGVBdCgwKTsKICAgIGNvbnN0IGNvbnN0cnVjdCA9IGNyZWF0ZUNvbnN0cnVjdChtYXR0ZXIyKTsKICAgIGNvbnN0IGV4aXN0aW5nID0gZmxvdzNbY29kZTRdOwogICAgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmcpKSB7CiAgICAgIGV4aXN0aW5nLnB1c2goY29uc3RydWN0KTsKICAgIH0gZWxzZSB7CiAgICAgIGZsb3czW2NvZGU0XSA9IFtjb25zdHJ1Y3RdOwogICAgfQogIH0KICByZXR1cm4gewogICAgZmxvdzogZmxvdzMKICB9Owp9CmZ1bmN0aW9uIGNyZWF0ZUNvbnN0cnVjdChtYXR0ZXIyKSB7CiAgY29uc3QgYW55d2hlcmUgPSBtYXR0ZXIyLmFueXdoZXJlOwogIGNvbnN0IGZyb250bWF0dGVyVHlwZSA9ICgKICAgIC8qKiBAdHlwZSB7VG9rZW5UeXBlfSAqLwogICAgbWF0dGVyMi50eXBlCiAgKTsKICBjb25zdCBmZW5jZVR5cGUgPSAoCiAgICAvKiogQHR5cGUge1Rva2VuVHlwZX0gKi8KICAgIGZyb250bWF0dGVyVHlwZSArICJGZW5jZSIKICApOwogIGNvbnN0IHNlcXVlbmNlVHlwZSA9ICgKICAgIC8qKiBAdHlwZSB7VG9rZW5UeXBlfSAqLwogICAgZmVuY2VUeXBlICsgIlNlcXVlbmNlIgogICk7CiAgY29uc3QgdmFsdWVUeXBlID0gKAogICAgLyoqIEB0eXBlIHtUb2tlblR5cGV9ICovCiAgICBmcm9udG1hdHRlclR5cGUgKyAiVmFsdWUiCiAgKTsKICBjb25zdCBjbG9zaW5nRmVuY2VDb25zdHJ1Y3QgPSB7CiAgICB0b2tlbml6ZTogdG9rZW5pemVDbG9zaW5nRmVuY2UsCiAgICBwYXJ0aWFsOiB0cnVlCiAgfTsKICBsZXQgYnVmZmVyMjsKICBsZXQgYnVmZmVySW5kZXggPSAwOwogIHJldHVybiB7CiAgICB0b2tlbml6ZTogdG9rZW5pemVGcm9udG1hdHRlciwKICAgIGNvbmNyZXRlOiB0cnVlCiAgfTsKICBmdW5jdGlvbiB0b2tlbml6ZUZyb250bWF0dGVyKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgICByZXR1cm4gc3RhcnQ7CiAgICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgICBjb25zdCBwb3NpdGlvbjMgPSBzZWxmMi5ub3coKTsKICAgICAgaWYgKAogICAgICAgIC8vIEluZGVudCBub3QgYWxsb3dlZC4KICAgICAgICBwb3NpdGlvbjMuY29sdW1uID09PSAxICYmIC8vIE5vcm1hbGx5LCBvbmx5IGFsbG93ZWQgaW4gZmlyc3QgbGluZS4KICAgICAgICAocG9zaXRpb24zLmxpbmUgPT09IDEgfHwgYW55d2hlcmUpCiAgICAgICkgewogICAgICAgIGJ1ZmZlcjIgPSBmZW5jZShtYXR0ZXIyLCAib3BlbiIpOwogICAgICAgIGJ1ZmZlckluZGV4ID0gMDsKICAgICAgICBpZiAoY29kZTQgPT09IGJ1ZmZlcjIuY2hhckNvZGVBdChidWZmZXJJbmRleCkpIHsKICAgICAgICAgIGVmZmVjdHMuZW50ZXIoZnJvbnRtYXR0ZXJUeXBlKTsKICAgICAgICAgIGVmZmVjdHMuZW50ZXIoZmVuY2VUeXBlKTsKICAgICAgICAgIGVmZmVjdHMuZW50ZXIoc2VxdWVuY2VUeXBlKTsKICAgICAgICAgIHJldHVybiBvcGVuU2VxdWVuY2UoY29kZTQpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGZ1bmN0aW9uIG9wZW5TZXF1ZW5jZShjb2RlNCkgewogICAgICBpZiAoYnVmZmVySW5kZXggPT09IGJ1ZmZlcjIubGVuZ3RoKSB7CiAgICAgICAgZWZmZWN0cy5leGl0KHNlcXVlbmNlVHlwZSk7CiAgICAgICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgICAgICBlZmZlY3RzLmVudGVyKCJ3aGl0ZXNwYWNlIik7CiAgICAgICAgICByZXR1cm4gb3BlblNlcXVlbmNlV2hpdGVzcGFjZShjb2RlNCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvcGVuQWZ0ZXIoY29kZTQpOwogICAgICB9CiAgICAgIGlmIChjb2RlNCA9PT0gYnVmZmVyMi5jaGFyQ29kZUF0KGJ1ZmZlckluZGV4KyspKSB7CiAgICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgICByZXR1cm4gb3BlblNlcXVlbmNlOwogICAgICB9CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZnVuY3Rpb24gb3BlblNlcXVlbmNlV2hpdGVzcGFjZShjb2RlNCkgewogICAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIHJldHVybiBvcGVuU2VxdWVuY2VXaGl0ZXNwYWNlOwogICAgICB9CiAgICAgIGVmZmVjdHMuZXhpdCgid2hpdGVzcGFjZSIpOwogICAgICByZXR1cm4gb3BlbkFmdGVyKGNvZGU0KTsKICAgIH0KICAgIGZ1bmN0aW9uIG9wZW5BZnRlcihjb2RlNCkgewogICAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICAgIGVmZmVjdHMuZXhpdChmZW5jZVR5cGUpOwogICAgICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgICAgIGJ1ZmZlcjIgPSBmZW5jZShtYXR0ZXIyLCAiY2xvc2UiKTsKICAgICAgICBidWZmZXJJbmRleCA9IDA7CiAgICAgICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChjbG9zaW5nRmVuY2VDb25zdHJ1Y3QsIGFmdGVyLCBjb250ZW50U3RhcnQpOwogICAgICB9CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZnVuY3Rpb24gY29udGVudFN0YXJ0KGNvZGU0KSB7CiAgICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgICAgcmV0dXJuIGNvbnRlbnRFbmQoY29kZTQpOwogICAgICB9CiAgICAgIGVmZmVjdHMuZW50ZXIodmFsdWVUeXBlKTsKICAgICAgcmV0dXJuIGNvbnRlbnRJbnNpZGUoY29kZTQpOwogICAgfQogICAgZnVuY3Rpb24gY29udGVudEluc2lkZShjb2RlNCkgewogICAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICAgIGVmZmVjdHMuZXhpdCh2YWx1ZVR5cGUpOwogICAgICAgIHJldHVybiBjb250ZW50RW5kKGNvZGU0KTsKICAgICAgfQogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29udGVudEluc2lkZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnRlbnRFbmQoY29kZTQpIHsKICAgICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICAgIH0KICAgICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZyIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChjbG9zaW5nRmVuY2VDb25zdHJ1Y3QsIGFmdGVyLCBjb250ZW50U3RhcnQpOwogICAgfQogICAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgICAgZWZmZWN0cy5leGl0KGZyb250bWF0dGVyVHlwZSk7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogIH0KICBmdW5jdGlvbiB0b2tlbml6ZUNsb3NpbmdGZW5jZShlZmZlY3RzLCBvazMsIG5vaykgewogICAgbGV0IGJ1ZmZlckluZGV4MiA9IDA7CiAgICByZXR1cm4gY2xvc2VTdGFydDsKICAgIGZ1bmN0aW9uIGNsb3NlU3RhcnQoY29kZTQpIHsKICAgICAgaWYgKGNvZGU0ID09PSBidWZmZXIyLmNoYXJDb2RlQXQoYnVmZmVySW5kZXgyKSkgewogICAgICAgIGVmZmVjdHMuZW50ZXIoZmVuY2VUeXBlKTsKICAgICAgICBlZmZlY3RzLmVudGVyKHNlcXVlbmNlVHlwZSk7CiAgICAgICAgcmV0dXJuIGNsb3NlU2VxdWVuY2UoY29kZTQpOwogICAgICB9CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZnVuY3Rpb24gY2xvc2VTZXF1ZW5jZShjb2RlNCkgewogICAgICBpZiAoYnVmZmVySW5kZXgyID09PSBidWZmZXIyLmxlbmd0aCkgewogICAgICAgIGVmZmVjdHMuZXhpdChzZXF1ZW5jZVR5cGUpOwogICAgICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICAgICAgZWZmZWN0cy5lbnRlcigid2hpdGVzcGFjZSIpOwogICAgICAgICAgcmV0dXJuIGNsb3NlU2VxdWVuY2VXaGl0ZXNwYWNlKGNvZGU0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNsb3NlQWZ0ZXIoY29kZTQpOwogICAgICB9CiAgICAgIGlmIChjb2RlNCA9PT0gYnVmZmVyMi5jaGFyQ29kZUF0KGJ1ZmZlckluZGV4MisrKSkgewogICAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgICAgcmV0dXJuIGNsb3NlU2VxdWVuY2U7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBmdW5jdGlvbiBjbG9zZVNlcXVlbmNlV2hpdGVzcGFjZShjb2RlNCkgewogICAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIHJldHVybiBjbG9zZVNlcXVlbmNlV2hpdGVzcGFjZTsKICAgICAgfQogICAgICBlZmZlY3RzLmV4aXQoIndoaXRlc3BhY2UiKTsKICAgICAgcmV0dXJuIGNsb3NlQWZ0ZXIoY29kZTQpOwogICAgfQogICAgZnVuY3Rpb24gY2xvc2VBZnRlcihjb2RlNCkgewogICAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICAgIGVmZmVjdHMuZXhpdChmZW5jZVR5cGUpOwogICAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgICB9CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogIH0KfQpmdW5jdGlvbiBmZW5jZShtYXR0ZXIyLCBwcm9wKSB7CiAgcmV0dXJuIG1hdHRlcjIubWFya2VyID8gcGljayhtYXR0ZXIyLm1hcmtlciwgcHJvcCkucmVwZWF0KDMpIDogKAogICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogVGhleeKAmXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KICAgIHBpY2sobWF0dGVyMi5mZW5jZSwgcHJvcCkKICApOwp9CmZ1bmN0aW9uIHBpY2soc2NoZW1hLCBwcm9wKSB7CiAgcmV0dXJuIHR5cGVvZiBzY2hlbWEgPT09ICJzdHJpbmciID8gc2NoZW1hIDogc2NoZW1hW3Byb3BdOwp9CnZhciBpbml0X3N5bnRheDYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWZyb250bWF0dGVyQDIuMC4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWZyb250bWF0dGVyL2xpYi9zeW50YXguanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGluaXRfdG9fbWF0dGVycygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlckAyLjAuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlci9saWIvaHRtbC5qcwp2YXIgaW5pdF9odG1sNyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZnJvbnRtYXR0ZXJAMi4wLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZnJvbnRtYXR0ZXIvbGliL2h0bWwuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlckAyLjAuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlci9pbmRleC5qcwp2YXIgaW5pdF9taWNyb21hcmtfZXh0ZW5zaW9uX2Zyb250bWF0dGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlckAyLjAuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlci9pbmRleC5qcyIoKSB7CiAgICBpbml0X3N5bnRheDYoKTsKICAgIGluaXRfaHRtbDcoKTsKICAgIGluaXRfdG9fbWF0dGVycygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1mcm9udG1hdHRlckAyLjAuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1mcm9udG1hdHRlci9saWIvaW5kZXguanMKZnVuY3Rpb24gZnJvbnRtYXR0ZXJGcm9tTWFya2Rvd24ob3B0aW9ucykgewogIGNvbnN0IG1hdHRlcnMgPSB0b01hdHRlcnMob3B0aW9ucyk7CiAgY29uc3QgZW50ZXIgPSB7fTsKICBjb25zdCBleGl0MyA9IHt9OwogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBtYXR0ZXJzLmxlbmd0aCkgewogICAgY29uc3QgbWF0dGVyMiA9IG1hdHRlcnNbaW5kZXgyXTsKICAgIGVudGVyW21hdHRlcjIudHlwZV0gPSBvcGVuZXIobWF0dGVyMik7CiAgICBleGl0M1ttYXR0ZXIyLnR5cGVdID0gY2xvc2U2OwogICAgZXhpdDNbbWF0dGVyMi50eXBlICsgIlZhbHVlIl0gPSB2YWx1ZTsKICB9CiAgcmV0dXJuIHsgZW50ZXIsIGV4aXQ6IGV4aXQzIH07Cn0KZnVuY3Rpb24gb3BlbmVyKG1hdHRlcjIpIHsKICByZXR1cm4gb3BlbjsKICBmdW5jdGlvbiBvcGVuKHRva2VuKSB7CiAgICB0aGlzLmVudGVyKHsgdHlwZTogbWF0dGVyMi50eXBlLCB2YWx1ZTogIiIgfSwgdG9rZW4pOwogICAgdGhpcy5idWZmZXIoKTsKICB9Cn0KZnVuY3Rpb24gY2xvc2U2KHRva2VuKSB7CiAgY29uc3QgZGF0YSA9IHRoaXMucmVzdW1lKCk7CiAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgb2soInZhbHVlIiBpbiBub2RlMik7CiAgdGhpcy5leGl0KHRva2VuKTsKICBub2RlMi52YWx1ZSA9IGRhdGEucmVwbGFjZSgvXihccj9cbnxccil8KFxyP1xufFxyKSQvZywgIiIpOwp9CmZ1bmN0aW9uIHZhbHVlKHRva2VuKSB7CiAgdGhpcy5jb25maWcuZW50ZXIuZGF0YS5jYWxsKHRoaXMsIHRva2VuKTsKICB0aGlzLmNvbmZpZy5leGl0LmRhdGEuY2FsbCh0aGlzLCB0b2tlbik7Cn0KZnVuY3Rpb24gZnJvbnRtYXR0ZXJUb01hcmtkb3duKG9wdGlvbnMpIHsKICBjb25zdCB1bnNhZmUyID0gW107CiAgY29uc3QgaGFuZGxlcnMyID0ge307CiAgY29uc3QgbWF0dGVycyA9IHRvTWF0dGVycyhvcHRpb25zKTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgbWF0dGVycy5sZW5ndGgpIHsKICAgIGNvbnN0IG1hdHRlcjIgPSBtYXR0ZXJzW2luZGV4Ml07CiAgICBoYW5kbGVyczJbbWF0dGVyMi50eXBlXSA9IGhhbmRsZXIobWF0dGVyMik7CiAgICBjb25zdCBvcGVuID0gZmVuY2UyKG1hdHRlcjIsICJvcGVuIik7CiAgICB1bnNhZmUyLnB1c2goewogICAgICBhdEJyZWFrOiB0cnVlLAogICAgICBjaGFyYWN0ZXI6IG9wZW4uY2hhckF0KDApLAogICAgICBhZnRlcjogZXNjYXBlU3RyaW5nUmVnZXhwKG9wZW4uY2hhckF0KDEpKQogICAgfSk7CiAgfQogIHJldHVybiB7IHVuc2FmZTogdW5zYWZlMiwgaGFuZGxlcnM6IGhhbmRsZXJzMiB9Owp9CmZ1bmN0aW9uIGhhbmRsZXIobWF0dGVyMikgewogIGNvbnN0IG9wZW4gPSBmZW5jZTIobWF0dGVyMiwgIm9wZW4iKTsKICBjb25zdCBjbG9zZTcgPSBmZW5jZTIobWF0dGVyMiwgImNsb3NlIik7CiAgcmV0dXJuIGhhbmRsZTM7CiAgZnVuY3Rpb24gaGFuZGxlMyhub2RlMikgewogICAgcmV0dXJuIG9wZW4gKyAobm9kZTIudmFsdWUgPyAiXG4iICsgbm9kZTIudmFsdWUgOiAiIikgKyAiXG4iICsgY2xvc2U3OwogIH0KfQpmdW5jdGlvbiBmZW5jZTIobWF0dGVyMiwgcHJvcCkgewogIHJldHVybiBtYXR0ZXIyLm1hcmtlciA/IHBpY2syKG1hdHRlcjIubWFya2VyLCBwcm9wKS5yZXBlYXQoMykgOiAoCiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBUaGV54oCZcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgogICAgcGljazIobWF0dGVyMi5mZW5jZSwgcHJvcCkKICApOwp9CmZ1bmN0aW9uIHBpY2syKHNjaGVtYSwgcHJvcCkgewogIHJldHVybiB0eXBlb2Ygc2NoZW1hID09PSAic3RyaW5nIiA/IHNjaGVtYSA6IHNjaGVtYVtwcm9wXTsKfQp2YXIgaW5pdF9saWIyMyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZnJvbnRtYXR0ZXJAMi4wLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZnJvbnRtYXR0ZXIvbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfZGVmYXVsdCgpOwogICAgaW5pdF9taWNyb21hcmtfZXh0ZW5zaW9uX2Zyb250bWF0dGVyKCk7CiAgICBpbml0X2VzY2FwZV9zdHJpbmdfcmVnZXhwKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWZyb250bWF0dGVyQDIuMC4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWZyb250bWF0dGVyL2luZGV4LmpzCnZhciBpbml0X21kYXN0X3V0aWxfZnJvbnRtYXR0ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWZyb250bWF0dGVyQDIuMC4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWZyb250bWF0dGVyL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliMjMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1mcm9udG1hdHRlckA1LjAuMC9ub2RlX21vZHVsZXMvcmVtYXJrLWZyb250bWF0dGVyL2xpYi9pbmRleC5qcwpmdW5jdGlvbiByZW1hcmtGcm9udG1hdHRlcihvcHRpb25zKSB7CiAgY29uc3Qgc2VsZjIgPSAoCiAgICAvKiogQHR5cGUge1Byb2Nlc3Nvcn0gKi8KICAgIHRoaXMKICApOwogIGNvbnN0IHNldHRpbmdzID0gb3B0aW9ucyB8fCBlbXB0eU9wdGlvbnM0OwogIGNvbnN0IGRhdGEgPSBzZWxmMi5kYXRhKCk7CiAgY29uc3QgbWljcm9tYXJrRXh0ZW5zaW9ucyA9IGRhdGEubWljcm9tYXJrRXh0ZW5zaW9ucyB8fCAoZGF0YS5taWNyb21hcmtFeHRlbnNpb25zID0gW10pOwogIGNvbnN0IGZyb21NYXJrZG93bkV4dGVuc2lvbnMgPSBkYXRhLmZyb21NYXJrZG93bkV4dGVuc2lvbnMgfHwgKGRhdGEuZnJvbU1hcmtkb3duRXh0ZW5zaW9ucyA9IFtdKTsKICBjb25zdCB0b01hcmtkb3duRXh0ZW5zaW9ucyA9IGRhdGEudG9NYXJrZG93bkV4dGVuc2lvbnMgfHwgKGRhdGEudG9NYXJrZG93bkV4dGVuc2lvbnMgPSBbXSk7CiAgbWljcm9tYXJrRXh0ZW5zaW9ucy5wdXNoKGZyb250bWF0dGVyKHNldHRpbmdzKSk7CiAgZnJvbU1hcmtkb3duRXh0ZW5zaW9ucy5wdXNoKGZyb250bWF0dGVyRnJvbU1hcmtkb3duKHNldHRpbmdzKSk7CiAgdG9NYXJrZG93bkV4dGVuc2lvbnMucHVzaChmcm9udG1hdHRlclRvTWFya2Rvd24oc2V0dGluZ3MpKTsKfQp2YXIgZW1wdHlPcHRpb25zNDsKdmFyIGluaXRfbGliMjQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstZnJvbnRtYXR0ZXJANS4wLjAvbm9kZV9tb2R1bGVzL3JlbWFyay1mcm9udG1hdHRlci9saWIvaW5kZXguanMiKCkgewogICAgaW5pdF9tZGFzdF91dGlsX2Zyb250bWF0dGVyKCk7CiAgICBpbml0X21pY3JvbWFya19leHRlbnNpb25fZnJvbnRtYXR0ZXIoKTsKICAgIGVtcHR5T3B0aW9uczQgPSAieWFtbCI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstZnJvbnRtYXR0ZXJANS4wLjAvbm9kZV9tb2R1bGVzL3JlbWFyay1mcm9udG1hdHRlci9pbmRleC5qcwp2YXIgaW5pdF9yZW1hcmtfZnJvbnRtYXR0ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstZnJvbnRtYXR0ZXJANS4wLjAvbm9kZV9tb2R1bGVzL3JlbWFyay1mcm9udG1hdHRlci9pbmRleC5qcyIoKSB7CiAgICBpbml0X2xpYjI0KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdW5nYXArc3RydWN0dXJlZC1jbG9uZUAxLjMuMC9ub2RlX21vZHVsZXMvQHVuZ2FwL3N0cnVjdHVyZWQtY2xvbmUvZXNtL3R5cGVzLmpzCnZhciBWT0lELCBQUklNSVRJVkUsIEFSUkFZLCBPQkpFQ1QsIERBVEUsIFJFR0VYUCwgTUFQLCBTRVQsIEVSUk9SLCBCSUdJTlQ7CnZhciBpbml0X3R5cGVzMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B1bmdhcCtzdHJ1Y3R1cmVkLWNsb25lQDEuMy4wL25vZGVfbW9kdWxlcy9AdW5nYXAvc3RydWN0dXJlZC1jbG9uZS9lc20vdHlwZXMuanMiKCkgewogICAgVk9JRCA9IC0xOwogICAgUFJJTUlUSVZFID0gMDsKICAgIEFSUkFZID0gMTsKICAgIE9CSkVDVCA9IDI7CiAgICBEQVRFID0gMzsKICAgIFJFR0VYUCA9IDQ7CiAgICBNQVAgPSA1OwogICAgU0VUID0gNjsKICAgIEVSUk9SID0gNzsKICAgIEJJR0lOVCA9IDg7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdW5nYXArc3RydWN0dXJlZC1jbG9uZUAxLjMuMC9ub2RlX21vZHVsZXMvQHVuZ2FwL3N0cnVjdHVyZWQtY2xvbmUvZXNtL2Rlc2VyaWFsaXplLmpzCnZhciBlbnYsIGRlc2VyaWFsaXplciwgZGVzZXJpYWxpemU7CnZhciBpbml0X2Rlc2VyaWFsaXplID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHVuZ2FwK3N0cnVjdHVyZWQtY2xvbmVAMS4zLjAvbm9kZV9tb2R1bGVzL0B1bmdhcC9zdHJ1Y3R1cmVkLWNsb25lL2VzbS9kZXNlcmlhbGl6ZS5qcyIoKSB7CiAgICBpbml0X3R5cGVzMigpOwogICAgZW52ID0gdHlwZW9mIHNlbGYgPT09ICJvYmplY3QiID8gc2VsZiA6IGdsb2JhbFRoaXM7CiAgICBkZXNlcmlhbGl6ZXIgPSAoJDMsIF80KSA9PiB7CiAgICAgIGNvbnN0IGFzID0gKG91dCwgaW5kZXgyKSA9PiB7CiAgICAgICAgJDMuc2V0KGluZGV4Miwgb3V0KTsKICAgICAgICByZXR1cm4gb3V0OwogICAgICB9OwogICAgICBjb25zdCB1bnBhaXIgPSAoaW5kZXgyKSA9PiB7CiAgICAgICAgaWYgKCQzLmhhcyhpbmRleDIpKQogICAgICAgICAgcmV0dXJuICQzLmdldChpbmRleDIpOwogICAgICAgIGNvbnN0IFt0eXBlNSwgdmFsdWUyXSA9IF80W2luZGV4Ml07CiAgICAgICAgc3dpdGNoICh0eXBlNSkgewogICAgICAgICAgY2FzZSBQUklNSVRJVkU6CiAgICAgICAgICBjYXNlIFZPSUQ6CiAgICAgICAgICAgIHJldHVybiBhcyh2YWx1ZTIsIGluZGV4Mik7CiAgICAgICAgICBjYXNlIEFSUkFZOiB7CiAgICAgICAgICAgIGNvbnN0IGFyciA9IGFzKFtdLCBpbmRleDIpOwogICAgICAgICAgICBmb3IgKGNvbnN0IGluZGV4MyBvZiB2YWx1ZTIpCiAgICAgICAgICAgICAgYXJyLnB1c2godW5wYWlyKGluZGV4MykpOwogICAgICAgICAgICByZXR1cm4gYXJyOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBPQkpFQ1Q6IHsKICAgICAgICAgICAgY29uc3Qgb2JqZWN0ID0gYXMoe30sIGluZGV4Mik7CiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleTIsIGluZGV4M10gb2YgdmFsdWUyKQogICAgICAgICAgICAgIG9iamVjdFt1bnBhaXIoa2V5MildID0gdW5wYWlyKGluZGV4Myk7CiAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIERBVEU6CiAgICAgICAgICAgIHJldHVybiBhcyhuZXcgRGF0ZSh2YWx1ZTIpLCBpbmRleDIpOwogICAgICAgICAgY2FzZSBSRUdFWFA6IHsKICAgICAgICAgICAgY29uc3QgeyBzb3VyY2UsIGZsYWdzIH0gPSB2YWx1ZTI7CiAgICAgICAgICAgIHJldHVybiBhcyhuZXcgUmVnRXhwKHNvdXJjZSwgZmxhZ3MpLCBpbmRleDIpOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBNQVA6IHsKICAgICAgICAgICAgY29uc3QgbWFwNyA9IGFzKC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksIGluZGV4Mik7CiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleTIsIGluZGV4M10gb2YgdmFsdWUyKQogICAgICAgICAgICAgIG1hcDcuc2V0KHVucGFpcihrZXkyKSwgdW5wYWlyKGluZGV4MykpOwogICAgICAgICAgICByZXR1cm4gbWFwNzsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgU0VUOiB7CiAgICAgICAgICAgIGNvbnN0IHNldDMgPSBhcygvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCBpbmRleDIpOwogICAgICAgICAgICBmb3IgKGNvbnN0IGluZGV4MyBvZiB2YWx1ZTIpCiAgICAgICAgICAgICAgc2V0My5hZGQodW5wYWlyKGluZGV4MykpOwogICAgICAgICAgICByZXR1cm4gc2V0MzsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgRVJST1I6IHsKICAgICAgICAgICAgY29uc3QgeyBuYW1lLCBtZXNzYWdlOiBtZXNzYWdlMiB9ID0gdmFsdWUyOwogICAgICAgICAgICByZXR1cm4gYXMobmV3IGVudltuYW1lXShtZXNzYWdlMiksIGluZGV4Mik7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIEJJR0lOVDoKICAgICAgICAgICAgcmV0dXJuIGFzKEJpZ0ludCh2YWx1ZTIpLCBpbmRleDIpOwogICAgICAgICAgY2FzZSAiQmlnSW50IjoKICAgICAgICAgICAgcmV0dXJuIGFzKE9iamVjdChCaWdJbnQodmFsdWUyKSksIGluZGV4Mik7CiAgICAgICAgICBjYXNlICJBcnJheUJ1ZmZlciI6CiAgICAgICAgICAgIHJldHVybiBhcyhuZXcgVWludDhBcnJheSh2YWx1ZTIpLmJ1ZmZlciwgdmFsdWUyKTsKICAgICAgICAgIGNhc2UgIkRhdGFWaWV3IjogewogICAgICAgICAgICBjb25zdCB7IGJ1ZmZlcjogYnVmZmVyMiB9ID0gbmV3IFVpbnQ4QXJyYXkodmFsdWUyKTsKICAgICAgICAgICAgcmV0dXJuIGFzKG5ldyBEYXRhVmlldyhidWZmZXIyKSwgdmFsdWUyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFzKG5ldyBlbnZbdHlwZTVdKHZhbHVlMiksIGluZGV4Mik7CiAgICAgIH07CiAgICAgIHJldHVybiB1bnBhaXI7CiAgICB9OwogICAgZGVzZXJpYWxpemUgPSAoc2VyaWFsaXplZCkgPT4gZGVzZXJpYWxpemVyKC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksIHNlcmlhbGl6ZWQpKDApOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHVuZ2FwK3N0cnVjdHVyZWQtY2xvbmVAMS4zLjAvbm9kZV9tb2R1bGVzL0B1bmdhcC9zdHJ1Y3R1cmVkLWNsb25lL2VzbS9zZXJpYWxpemUuanMKdmFyIEVNUFRZMiwgdG9TdHJpbmcyLCBrZXlzLCB0eXBlT2YsIHNob3VsZFNraXAsIHNlcmlhbGl6ZXIsIHNlcmlhbGl6ZTI7CnZhciBpbml0X3NlcmlhbGl6ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B1bmdhcCtzdHJ1Y3R1cmVkLWNsb25lQDEuMy4wL25vZGVfbW9kdWxlcy9AdW5nYXAvc3RydWN0dXJlZC1jbG9uZS9lc20vc2VyaWFsaXplLmpzIigpIHsKICAgIGluaXRfdHlwZXMyKCk7CiAgICBFTVBUWTIgPSAiIjsKICAgICh7IHRvU3RyaW5nOiB0b1N0cmluZzIgfSA9IHt9KTsKICAgICh7IGtleXMgfSA9IE9iamVjdCk7CiAgICB0eXBlT2YgPSAodmFsdWUyKSA9PiB7CiAgICAgIGNvbnN0IHR5cGU1ID0gdHlwZW9mIHZhbHVlMjsKICAgICAgaWYgKHR5cGU1ICE9PSAib2JqZWN0IiB8fCAhdmFsdWUyKQogICAgICAgIHJldHVybiBbUFJJTUlUSVZFLCB0eXBlNV07CiAgICAgIGNvbnN0IGFzU3RyaW5nID0gdG9TdHJpbmcyLmNhbGwodmFsdWUyKS5zbGljZSg4LCAtMSk7CiAgICAgIHN3aXRjaCAoYXNTdHJpbmcpIHsKICAgICAgICBjYXNlICJBcnJheSI6CiAgICAgICAgICByZXR1cm4gW0FSUkFZLCBFTVBUWTJdOwogICAgICAgIGNhc2UgIk9iamVjdCI6CiAgICAgICAgICByZXR1cm4gW09CSkVDVCwgRU1QVFkyXTsKICAgICAgICBjYXNlICJEYXRlIjoKICAgICAgICAgIHJldHVybiBbREFURSwgRU1QVFkyXTsKICAgICAgICBjYXNlICJSZWdFeHAiOgogICAgICAgICAgcmV0dXJuIFtSRUdFWFAsIEVNUFRZMl07CiAgICAgICAgY2FzZSAiTWFwIjoKICAgICAgICAgIHJldHVybiBbTUFQLCBFTVBUWTJdOwogICAgICAgIGNhc2UgIlNldCI6CiAgICAgICAgICByZXR1cm4gW1NFVCwgRU1QVFkyXTsKICAgICAgICBjYXNlICJEYXRhVmlldyI6CiAgICAgICAgICByZXR1cm4gW0FSUkFZLCBhc1N0cmluZ107CiAgICAgIH0KICAgICAgaWYgKGFzU3RyaW5nLmluY2x1ZGVzKCJBcnJheSIpKQogICAgICAgIHJldHVybiBbQVJSQVksIGFzU3RyaW5nXTsKICAgICAgaWYgKGFzU3RyaW5nLmluY2x1ZGVzKCJFcnJvciIpKQogICAgICAgIHJldHVybiBbRVJST1IsIGFzU3RyaW5nXTsKICAgICAgcmV0dXJuIFtPQkpFQ1QsIGFzU3RyaW5nXTsKICAgIH07CiAgICBzaG91bGRTa2lwID0gKFtUWVBFLCB0eXBlNV0pID0+IFRZUEUgPT09IFBSSU1JVElWRSAmJiAodHlwZTUgPT09ICJmdW5jdGlvbiIgfHwgdHlwZTUgPT09ICJzeW1ib2wiKTsKICAgIHNlcmlhbGl6ZXIgPSAoc3RyaWN0LCBqc29uLCAkMywgXzQpID0+IHsKICAgICAgY29uc3QgYXMgPSAob3V0LCB2YWx1ZTIpID0+IHsKICAgICAgICBjb25zdCBpbmRleDIgPSBfNC5wdXNoKG91dCkgLSAxOwogICAgICAgICQzLnNldCh2YWx1ZTIsIGluZGV4Mik7CiAgICAgICAgcmV0dXJuIGluZGV4MjsKICAgICAgfTsKICAgICAgY29uc3QgcGFpciA9ICh2YWx1ZTIpID0+IHsKICAgICAgICBpZiAoJDMuaGFzKHZhbHVlMikpCiAgICAgICAgICByZXR1cm4gJDMuZ2V0KHZhbHVlMik7CiAgICAgICAgbGV0IFtUWVBFLCB0eXBlNV0gPSB0eXBlT2YodmFsdWUyKTsKICAgICAgICBzd2l0Y2ggKFRZUEUpIHsKICAgICAgICAgIGNhc2UgUFJJTUlUSVZFOiB7CiAgICAgICAgICAgIGxldCBlbnRyeSA9IHZhbHVlMjsKICAgICAgICAgICAgc3dpdGNoICh0eXBlNSkgewogICAgICAgICAgICAgIGNhc2UgImJpZ2ludCI6CiAgICAgICAgICAgICAgICBUWVBFID0gQklHSU5UOwogICAgICAgICAgICAgICAgZW50cnkgPSB2YWx1ZTIudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgImZ1bmN0aW9uIjoKICAgICAgICAgICAgICBjYXNlICJzeW1ib2wiOgogICAgICAgICAgICAgICAgaWYgKHN0cmljdCkKICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigidW5hYmxlIHRvIHNlcmlhbGl6ZSAiICsgdHlwZTUpOwogICAgICAgICAgICAgICAgZW50cnkgPSBudWxsOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAidW5kZWZpbmVkIjoKICAgICAgICAgICAgICAgIHJldHVybiBhcyhbVk9JRF0sIHZhbHVlMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGFzKFtUWVBFLCBlbnRyeV0sIHZhbHVlMik7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIEFSUkFZOiB7CiAgICAgICAgICAgIGlmICh0eXBlNSkgewogICAgICAgICAgICAgIGxldCBzcHJlYWQgPSB2YWx1ZTI7CiAgICAgICAgICAgICAgaWYgKHR5cGU1ID09PSAiRGF0YVZpZXciKSB7CiAgICAgICAgICAgICAgICBzcHJlYWQgPSBuZXcgVWludDhBcnJheSh2YWx1ZTIuYnVmZmVyKTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGU1ID09PSAiQXJyYXlCdWZmZXIiKSB7CiAgICAgICAgICAgICAgICBzcHJlYWQgPSBuZXcgVWludDhBcnJheSh2YWx1ZTIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gYXMoW3R5cGU1LCBbLi4uc3ByZWFkXV0sIHZhbHVlMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgYXJyID0gW107CiAgICAgICAgICAgIGNvbnN0IGluZGV4MiA9IGFzKFtUWVBFLCBhcnJdLCB2YWx1ZTIpOwogICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHZhbHVlMikKICAgICAgICAgICAgICBhcnIucHVzaChwYWlyKGVudHJ5KSk7CiAgICAgICAgICAgIHJldHVybiBpbmRleDI7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIE9CSkVDVDogewogICAgICAgICAgICBpZiAodHlwZTUpIHsKICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGU1KSB7CiAgICAgICAgICAgICAgICBjYXNlICJCaWdJbnQiOgogICAgICAgICAgICAgICAgICByZXR1cm4gYXMoW3R5cGU1LCB2YWx1ZTIudG9TdHJpbmcoKV0sIHZhbHVlMik7CiAgICAgICAgICAgICAgICBjYXNlICJCb29sZWFuIjoKICAgICAgICAgICAgICAgIGNhc2UgIk51bWJlciI6CiAgICAgICAgICAgICAgICBjYXNlICJTdHJpbmciOgogICAgICAgICAgICAgICAgICByZXR1cm4gYXMoW3R5cGU1LCB2YWx1ZTIudmFsdWVPZigpXSwgdmFsdWUyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGpzb24gJiYgInRvSlNPTiIgaW4gdmFsdWUyKQogICAgICAgICAgICAgIHJldHVybiBwYWlyKHZhbHVlMi50b0pTT04oKSk7CiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBbXTsKICAgICAgICAgICAgY29uc3QgaW5kZXgyID0gYXMoW1RZUEUsIGVudHJpZXNdLCB2YWx1ZTIpOwogICAgICAgICAgICBmb3IgKGNvbnN0IGtleTIgb2Yga2V5cyh2YWx1ZTIpKSB7CiAgICAgICAgICAgICAgaWYgKHN0cmljdCB8fCAhc2hvdWxkU2tpcCh0eXBlT2YodmFsdWUyW2tleTJdKSkpCiAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goW3BhaXIoa2V5MiksIHBhaXIodmFsdWUyW2tleTJdKV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpbmRleDI7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIERBVEU6CiAgICAgICAgICAgIHJldHVybiBhcyhbVFlQRSwgdmFsdWUyLnRvSVNPU3RyaW5nKCldLCB2YWx1ZTIpOwogICAgICAgICAgY2FzZSBSRUdFWFA6IHsKICAgICAgICAgICAgY29uc3QgeyBzb3VyY2UsIGZsYWdzIH0gPSB2YWx1ZTI7CiAgICAgICAgICAgIHJldHVybiBhcyhbVFlQRSwgeyBzb3VyY2UsIGZsYWdzIH1dLCB2YWx1ZTIpOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBNQVA6IHsKICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IFtdOwogICAgICAgICAgICBjb25zdCBpbmRleDIgPSBhcyhbVFlQRSwgZW50cmllc10sIHZhbHVlMik7CiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleTIsIGVudHJ5XSBvZiB2YWx1ZTIpIHsKICAgICAgICAgICAgICBpZiAoc3RyaWN0IHx8ICEoc2hvdWxkU2tpcCh0eXBlT2Yoa2V5MikpIHx8IHNob3VsZFNraXAodHlwZU9mKGVudHJ5KSkpKQogICAgICAgICAgICAgICAgZW50cmllcy5wdXNoKFtwYWlyKGtleTIpLCBwYWlyKGVudHJ5KV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpbmRleDI7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIFNFVDogewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gW107CiAgICAgICAgICAgIGNvbnN0IGluZGV4MiA9IGFzKFtUWVBFLCBlbnRyaWVzXSwgdmFsdWUyKTsKICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB2YWx1ZTIpIHsKICAgICAgICAgICAgICBpZiAoc3RyaWN0IHx8ICFzaG91bGRTa2lwKHR5cGVPZihlbnRyeSkpKQogICAgICAgICAgICAgICAgZW50cmllcy5wdXNoKHBhaXIoZW50cnkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaW5kZXgyOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCB7IG1lc3NhZ2U6IG1lc3NhZ2UyIH0gPSB2YWx1ZTI7CiAgICAgICAgcmV0dXJuIGFzKFtUWVBFLCB7IG5hbWU6IHR5cGU1LCBtZXNzYWdlOiBtZXNzYWdlMiB9XSwgdmFsdWUyKTsKICAgICAgfTsKICAgICAgcmV0dXJuIHBhaXI7CiAgICB9OwogICAgc2VyaWFsaXplMiA9ICh2YWx1ZTIsIHsganNvbiwgbG9zc3kgfSA9IHt9KSA9PiB7CiAgICAgIGNvbnN0IF80ID0gW107CiAgICAgIHJldHVybiBzZXJpYWxpemVyKCEoanNvbiB8fCBsb3NzeSksICEhanNvbiwgLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgXzQpKHZhbHVlMiksIF80OwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B1bmdhcCtzdHJ1Y3R1cmVkLWNsb25lQDEuMy4wL25vZGVfbW9kdWxlcy9AdW5nYXAvc3RydWN0dXJlZC1jbG9uZS9lc20vaW5kZXguanMKdmFyIGVzbV9kZWZhdWx0Owp2YXIgaW5pdF9lc20gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdW5nYXArc3RydWN0dXJlZC1jbG9uZUAxLjMuMC9ub2RlX21vZHVsZXMvQHVuZ2FwL3N0cnVjdHVyZWQtY2xvbmUvZXNtL2luZGV4LmpzIigpIHsKICAgIGluaXRfZGVzZXJpYWxpemUoKTsKICAgIGluaXRfc2VyaWFsaXplKCk7CiAgICBlc21fZGVmYXVsdCA9IHR5cGVvZiBzdHJ1Y3R1cmVkQ2xvbmUgPT09ICJmdW5jdGlvbiIgPyAoCiAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqLwogICAgICAoYW55LCBvcHRpb25zKSA9PiBvcHRpb25zICYmICgianNvbiIgaW4gb3B0aW9ucyB8fCAibG9zc3kiIGluIG9wdGlvbnMpID8gZGVzZXJpYWxpemUoc2VyaWFsaXplMihhbnksIG9wdGlvbnMpKSA6IHN0cnVjdHVyZWRDbG9uZShhbnkpCiAgICApIDogKGFueSwgb3B0aW9ucykgPT4gZGVzZXJpYWxpemUoc2VyaWFsaXplMihhbnksIG9wdGlvbnMpKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtcG9zaXRpb25ANS4wLjAvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtcG9zaXRpb24vbGliL2luZGV4LmpzCmZ1bmN0aW9uIHBvaW50Myh0eXBlNSkgewogIHJldHVybiBwb2ludDQ7CiAgZnVuY3Rpb24gcG9pbnQ0KG5vZGUyKSB7CiAgICBjb25zdCBwb2ludDUgPSBub2RlMiAmJiBub2RlMi5wb3NpdGlvbiAmJiBub2RlMi5wb3NpdGlvblt0eXBlNV0gfHwge307CiAgICBpZiAodHlwZW9mIHBvaW50NS5saW5lID09PSAibnVtYmVyIiAmJiBwb2ludDUubGluZSA+IDAgJiYgdHlwZW9mIHBvaW50NS5jb2x1bW4gPT09ICJudW1iZXIiICYmIHBvaW50NS5jb2x1bW4gPiAwKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgbGluZTogcG9pbnQ1LmxpbmUsCiAgICAgICAgY29sdW1uOiBwb2ludDUuY29sdW1uLAogICAgICAgIG9mZnNldDogdHlwZW9mIHBvaW50NS5vZmZzZXQgPT09ICJudW1iZXIiICYmIHBvaW50NS5vZmZzZXQgPiAtMSA/IHBvaW50NS5vZmZzZXQgOiB2b2lkIDAKICAgICAgfTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gcG9zaXRpb24yKG5vZGUyKSB7CiAgY29uc3Qgc3RhcnQgPSBwb2ludFN0YXJ0KG5vZGUyKTsKICBjb25zdCBlbmQzID0gcG9pbnRFbmQobm9kZTIpOwogIGlmIChzdGFydCAmJiBlbmQzKSB7CiAgICByZXR1cm4geyBzdGFydCwgZW5kOiBlbmQzIH07CiAgfQp9CnZhciBwb2ludEVuZCwgcG9pbnRTdGFydDsKdmFyIGluaXRfbGliMjUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXBvc2l0aW9uQDUuMC4wL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXBvc2l0aW9uL2xpYi9pbmRleC5qcyIoKSB7CiAgICBwb2ludEVuZCA9IHBvaW50MygiZW5kIik7CiAgICBwb2ludFN0YXJ0ID0gcG9pbnQzKCJzdGFydCIpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdW5pc3QtdXRpbC1wb3NpdGlvbkA1LjAuMC9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC1wb3NpdGlvbi9pbmRleC5qcwp2YXIgaW5pdF91bmlzdF91dGlsX3Bvc2l0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdW5pc3QtdXRpbC1wb3NpdGlvbkA1LjAuMC9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC1wb3NpdGlvbi9pbmRleC5qcyIoKSB7CiAgICBpbml0X2xpYjI1KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtc2FuaXRpemVANS4wLjIvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC1zYW5pdGl6ZS9saWIvc2NoZW1hLmpzCnZhciBhcmlhLCBkZWZhdWx0U2NoZW1hOwp2YXIgaW5pdF9zY2hlbWEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtc2FuaXRpemVANS4wLjIvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC1zYW5pdGl6ZS9saWIvc2NoZW1hLmpzIigpIHsKICAgIGFyaWEgPSBbImFyaWFEZXNjcmliZWRCeSIsICJhcmlhTGFiZWwiLCAiYXJpYUxhYmVsbGVkQnkiXTsKICAgIGRlZmF1bHRTY2hlbWEgPSB7CiAgICAgIGFuY2VzdG9yczogewogICAgICAgIHRib2R5OiBbInRhYmxlIl0sCiAgICAgICAgdGQ6IFsidGFibGUiXSwKICAgICAgICB0aDogWyJ0YWJsZSJdLAogICAgICAgIHRoZWFkOiBbInRhYmxlIl0sCiAgICAgICAgdGZvb3Q6IFsidGFibGUiXSwKICAgICAgICB0cjogWyJ0YWJsZSJdCiAgICAgIH0sCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBhOiBbCiAgICAgICAgICAuLi5hcmlhLAogICAgICAgICAgLy8gTm90ZTogdGhlc2UgMyBhcmUgdXNlZCBieSBHRk0gZm9vdG5vdGVzLCB0aGV5IGRvIHdvcmsgb24gYWxsIGxpbmtzLgogICAgICAgICAgImRhdGFGb290bm90ZUJhY2tyZWYiLAogICAgICAgICAgImRhdGFGb290bm90ZVJlZiIsCiAgICAgICAgICBbImNsYXNzTmFtZSIsICJkYXRhLWZvb3Rub3RlLWJhY2tyZWYiXSwKICAgICAgICAgICJocmVmIgogICAgICAgIF0sCiAgICAgICAgYmxvY2txdW90ZTogWyJjaXRlIl0sCiAgICAgICAgLy8gTm90ZTogdGhpcyBjbGFzcyBpcyBub3Qgbm9ybWFsbHkgYWxsb3dlZCBieSBHSCwgd2hlbiBtYW51YWxseSB3cml0aW5nCiAgICAgICAgLy8gYGNvZGVgIGFzIEhUTUwgaW4gbWFya2Rvd24sIHRoZXkgYWRkcyBpdCBzb21lIG90aGVyIHdheS4KICAgICAgICAvLyBXZSBjYW7igJl0IGRvIHRoYXQsIHNvIHdlIGhhdmUgdG8gYWxsb3cgaXQuCiAgICAgICAgY29kZTogW1siY2xhc3NOYW1lIiwgL15sYW5ndWFnZS0uL11dLAogICAgICAgIGRlbDogWyJjaXRlIl0sCiAgICAgICAgZGl2OiBbIml0ZW1TY29wZSIsICJpdGVtVHlwZSJdLAogICAgICAgIGRsOiBbLi4uYXJpYV0sCiAgICAgICAgLy8gTm90ZTogdGhpcyBpcyB1c2VkIGJ5IEdGTSBmb290bm90ZXMuCiAgICAgICAgaDI6IFtbImNsYXNzTmFtZSIsICJzci1vbmx5Il1dLAogICAgICAgIGltZzogWy4uLmFyaWEsICJsb25nRGVzYyIsICJzcmMiXSwKICAgICAgICAvLyBOb3RlOiBgaW5wdXRgIGlzIG5vdCBub3JtYWxseSBhbGxvd2VkIGJ5IEdILCB3aGVuIG1hbnVhbGx5IHdyaXRpbmcKICAgICAgICAvLyBpdCBpbiBtYXJrZG93biwgdGhleSBhZGQgaXQgZnJvbSB0YXNrbGlzdHMgc29tZSBvdGhlciB3YXkuCiAgICAgICAgLy8gV2UgY2Fu4oCZdCBkbyB0aGF0LCBzbyB3ZSBoYXZlIHRvIGFsbG93IGl0LgogICAgICAgIGlucHV0OiBbCiAgICAgICAgICBbImRpc2FibGVkIiwgdHJ1ZV0sCiAgICAgICAgICBbInR5cGUiLCAiY2hlY2tib3giXQogICAgICAgIF0sCiAgICAgICAgaW5zOiBbImNpdGUiXSwKICAgICAgICAvLyBOb3RlOiB0aGlzIGNsYXNzIGlzIG5vdCBub3JtYWxseSBhbGxvd2VkIGJ5IEdILCB3aGVuIG1hbnVhbGx5IHdyaXRpbmcKICAgICAgICAvLyBgbGlgIGFzIEhUTUwgaW4gbWFya2Rvd24sIHRoZXkgYWRkcyBpdCBzb21lIG90aGVyIHdheS4KICAgICAgICAvLyBXZSBjYW7igJl0IGRvIHRoYXQsIHNvIHdlIGhhdmUgdG8gYWxsb3cgaXQuCiAgICAgICAgbGk6IFtbImNsYXNzTmFtZSIsICJ0YXNrLWxpc3QtaXRlbSJdXSwKICAgICAgICAvLyBOb3RlOiB0aGlzIGNsYXNzIGlzIG5vdCBub3JtYWxseSBhbGxvd2VkIGJ5IEdILCB3aGVuIG1hbnVhbGx5IHdyaXRpbmcKICAgICAgICAvLyBgb2xgIGFzIEhUTUwgaW4gbWFya2Rvd24sIHRoZXkgYWRkcyBpdCBzb21lIG90aGVyIHdheS4KICAgICAgICAvLyBXZSBjYW7igJl0IGRvIHRoYXQsIHNvIHdlIGhhdmUgdG8gYWxsb3cgaXQuCiAgICAgICAgb2w6IFsuLi5hcmlhLCBbImNsYXNzTmFtZSIsICJjb250YWlucy10YXNrLWxpc3QiXV0sCiAgICAgICAgcTogWyJjaXRlIl0sCiAgICAgICAgc2VjdGlvbjogWyJkYXRhRm9vdG5vdGVzIiwgWyJjbGFzc05hbWUiLCAiZm9vdG5vdGVzIl1dLAogICAgICAgIHNvdXJjZTogWyJzcmNTZXQiXSwKICAgICAgICBzdW1tYXJ5OiBbLi4uYXJpYV0sCiAgICAgICAgdGFibGU6IFsuLi5hcmlhXSwKICAgICAgICAvLyBOb3RlOiB0aGlzIGNsYXNzIGlzIG5vdCBub3JtYWxseSBhbGxvd2VkIGJ5IEdILCB3aGVuIG1hbnVhbGx5IHdyaXRpbmcKICAgICAgICAvLyBgb2xgIGFzIEhUTUwgaW4gbWFya2Rvd24sIHRoZXkgYWRkcyBpdCBzb21lIG90aGVyIHdheS4KICAgICAgICAvLyBXZSBjYW7igJl0IGRvIHRoYXQsIHNvIHdlIGhhdmUgdG8gYWxsb3cgaXQuCiAgICAgICAgdWw6IFsuLi5hcmlhLCBbImNsYXNzTmFtZSIsICJjb250YWlucy10YXNrLWxpc3QiXV0sCiAgICAgICAgIioiOiBbCiAgICAgICAgICAiYWJiciIsCiAgICAgICAgICAiYWNjZXB0IiwKICAgICAgICAgICJhY2NlcHRDaGFyc2V0IiwKICAgICAgICAgICJhY2Nlc3NLZXkiLAogICAgICAgICAgImFjdGlvbiIsCiAgICAgICAgICAiYWxpZ24iLAogICAgICAgICAgImFsdCIsCiAgICAgICAgICAiYXhpcyIsCiAgICAgICAgICAiYm9yZGVyIiwKICAgICAgICAgICJjZWxsUGFkZGluZyIsCiAgICAgICAgICAiY2VsbFNwYWNpbmciLAogICAgICAgICAgImNoYXIiLAogICAgICAgICAgImNoYXJPZmYiLAogICAgICAgICAgImNoYXJTZXQiLAogICAgICAgICAgImNoZWNrZWQiLAogICAgICAgICAgImNsZWFyIiwKICAgICAgICAgICJjb2xTcGFuIiwKICAgICAgICAgICJjb2xvciIsCiAgICAgICAgICAiY29scyIsCiAgICAgICAgICAiY29tcGFjdCIsCiAgICAgICAgICAiY29vcmRzIiwKICAgICAgICAgICJkYXRlVGltZSIsCiAgICAgICAgICAiZGlyIiwKICAgICAgICAgIC8vIE5vdGU6IGBkaXNhYmxlZGAgaXMgdGVjaG5pY2FsbHkgYWxsb3dlZCBvbiBhbGwgZWxlbWVudHMgYnkgR0guCiAgICAgICAgICAvLyBCdXQgaXQgaXMgdXNlbGVzcyBvbiBldmVyeXRoaW5nIGV4Y2VwdCBgaW5wdXRgLgogICAgICAgICAgLy8gQmVjYXVzZSBgaW5wdXRgcyBhcmUgbm9ybWFsbHkgbm90IGFsbG93ZWQsIGJ1dCB3ZSBhbGxvdyB0aGVtIGZvcgogICAgICAgICAgLy8gY2hlY2tib3hlcyBkdWUgdG8gdGFza2xpc3RzLCB3ZSBhbGxvdyBgZGlzYWJsZWRgIG9ubHkgdGhlcmUuCiAgICAgICAgICAiZW5jVHlwZSIsCiAgICAgICAgICAiZnJhbWUiLAogICAgICAgICAgImhTcGFjZSIsCiAgICAgICAgICAiaGVhZGVycyIsCiAgICAgICAgICAiaGVpZ2h0IiwKICAgICAgICAgICJocmVmTGFuZyIsCiAgICAgICAgICAiaHRtbEZvciIsCiAgICAgICAgICAiaWQiLAogICAgICAgICAgImlzTWFwIiwKICAgICAgICAgICJpdGVtUHJvcCIsCiAgICAgICAgICAibGFiZWwiLAogICAgICAgICAgImxhbmciLAogICAgICAgICAgIm1heExlbmd0aCIsCiAgICAgICAgICAibWVkaWEiLAogICAgICAgICAgIm1ldGhvZCIsCiAgICAgICAgICAibXVsdGlwbGUiLAogICAgICAgICAgIm5hbWUiLAogICAgICAgICAgIm5vSHJlZiIsCiAgICAgICAgICAibm9TaGFkZSIsCiAgICAgICAgICAibm9XcmFwIiwKICAgICAgICAgICJvcGVuIiwKICAgICAgICAgICJwcm9tcHQiLAogICAgICAgICAgInJlYWRPbmx5IiwKICAgICAgICAgICJyZXYiLAogICAgICAgICAgInJvd1NwYW4iLAogICAgICAgICAgInJvd3MiLAogICAgICAgICAgInJ1bGVzIiwKICAgICAgICAgICJzY29wZSIsCiAgICAgICAgICAic2VsZWN0ZWQiLAogICAgICAgICAgInNoYXBlIiwKICAgICAgICAgICJzaXplIiwKICAgICAgICAgICJzcGFuIiwKICAgICAgICAgICJzdGFydCIsCiAgICAgICAgICAic3VtbWFyeSIsCiAgICAgICAgICAidGFiSW5kZXgiLAogICAgICAgICAgInRpdGxlIiwKICAgICAgICAgICJ1c2VNYXAiLAogICAgICAgICAgInZBbGlnbiIsCiAgICAgICAgICAidmFsdWUiLAogICAgICAgICAgIndpZHRoIgogICAgICAgIF0KICAgICAgfSwKICAgICAgY2xvYmJlcjogWyJhcmlhRGVzY3JpYmVkQnkiLCAiYXJpYUxhYmVsbGVkQnkiLCAiaWQiLCAibmFtZSJdLAogICAgICBjbG9iYmVyUHJlZml4OiAidXNlci1jb250ZW50LSIsCiAgICAgIHByb3RvY29sczogewogICAgICAgIGNpdGU6IFsiaHR0cCIsICJodHRwcyJdLAogICAgICAgIGhyZWY6IFsiaHR0cCIsICJodHRwcyIsICJpcmMiLCAiaXJjcyIsICJtYWlsdG8iLCAieG1wcCJdLAogICAgICAgIGxvbmdEZXNjOiBbImh0dHAiLCAiaHR0cHMiXSwKICAgICAgICBzcmM6IFsiaHR0cCIsICJodHRwcyJdCiAgICAgIH0sCiAgICAgIHJlcXVpcmVkOiB7CiAgICAgICAgaW5wdXQ6IHsgZGlzYWJsZWQ6IHRydWUsIHR5cGU6ICJjaGVja2JveCIgfQogICAgICB9LAogICAgICBzdHJpcDogWyJzY3JpcHQiXSwKICAgICAgdGFnTmFtZXM6IFsKICAgICAgICAiYSIsCiAgICAgICAgImIiLAogICAgICAgICJibG9ja3F1b3RlIiwKICAgICAgICAiYnIiLAogICAgICAgICJjb2RlIiwKICAgICAgICAiZGQiLAogICAgICAgICJkZWwiLAogICAgICAgICJkZXRhaWxzIiwKICAgICAgICAiZGl2IiwKICAgICAgICAiZGwiLAogICAgICAgICJkdCIsCiAgICAgICAgImVtIiwKICAgICAgICAiaDEiLAogICAgICAgICJoMiIsCiAgICAgICAgImgzIiwKICAgICAgICAiaDQiLAogICAgICAgICJoNSIsCiAgICAgICAgImg2IiwKICAgICAgICAiaHIiLAogICAgICAgICJpIiwKICAgICAgICAiaW1nIiwKICAgICAgICAvLyBOb3RlOiBgaW5wdXRgIGlzIG5vdCBub3JtYWxseSBhbGxvd2VkIGJ5IEdILCB3aGVuIG1hbnVhbGx5IHdyaXRpbmcKICAgICAgICAvLyBpdCBpbiBtYXJrZG93biwgdGhleSBhZGQgaXQgZnJvbSB0YXNrbGlzdHMgc29tZSBvdGhlciB3YXkuCiAgICAgICAgLy8gV2UgY2Fu4oCZdCBkbyB0aGF0LCBzbyB3ZSBoYXZlIHRvIGFsbG93IGl0LgogICAgICAgICJpbnB1dCIsCiAgICAgICAgImlucyIsCiAgICAgICAgImtiZCIsCiAgICAgICAgImxpIiwKICAgICAgICAib2wiLAogICAgICAgICJwIiwKICAgICAgICAicGljdHVyZSIsCiAgICAgICAgInByZSIsCiAgICAgICAgInEiLAogICAgICAgICJycCIsCiAgICAgICAgInJ0IiwKICAgICAgICAicnVieSIsCiAgICAgICAgInMiLAogICAgICAgICJzYW1wIiwKICAgICAgICAic2VjdGlvbiIsCiAgICAgICAgInNvdXJjZSIsCiAgICAgICAgInNwYW4iLAogICAgICAgICJzdHJpa2UiLAogICAgICAgICJzdHJvbmciLAogICAgICAgICJzdWIiLAogICAgICAgICJzdW1tYXJ5IiwKICAgICAgICAic3VwIiwKICAgICAgICAidGFibGUiLAogICAgICAgICJ0Ym9keSIsCiAgICAgICAgInRkIiwKICAgICAgICAidGZvb3QiLAogICAgICAgICJ0aCIsCiAgICAgICAgInRoZWFkIiwKICAgICAgICAidHIiLAogICAgICAgICJ0dCIsCiAgICAgICAgInVsIiwKICAgICAgICAidmFyIgogICAgICBdCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXNhbml0aXplQDUuMC4yL25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtc2FuaXRpemUvbGliL2luZGV4LmpzCmZ1bmN0aW9uIHNhbml0aXplKG5vZGUyLCBvcHRpb25zKSB7CiAgbGV0IHJlc3VsdCA9IHsgdHlwZTogInJvb3QiLCBjaGlsZHJlbjogW10gfTsKICBjb25zdCBzdGF0ZTEwID0gewogICAgc2NoZW1hOiBvcHRpb25zID8geyAuLi5kZWZhdWx0U2NoZW1hLCAuLi5vcHRpb25zIH0gOiBkZWZhdWx0U2NoZW1hLAogICAgc3RhY2s6IFtdCiAgfTsKICBjb25zdCByZXBsYWNlNSA9IHRyYW5zZm9ybShzdGF0ZTEwLCBub2RlMik7CiAgaWYgKHJlcGxhY2U1KSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXBsYWNlNSkpIHsKICAgICAgaWYgKHJlcGxhY2U1Lmxlbmd0aCA9PT0gMSkgewogICAgICAgIHJlc3VsdCA9IHJlcGxhY2U1WzBdOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdC5jaGlsZHJlbiA9IHJlcGxhY2U1OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXN1bHQgPSByZXBsYWNlNTsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpmdW5jdGlvbiB0cmFuc2Zvcm0oc3RhdGUxMCwgbm9kZTIpIHsKICBpZiAobm9kZTIgJiYgdHlwZW9mIG5vZGUyID09PSAib2JqZWN0IikgewogICAgY29uc3QgdW5zYWZlMiA9ICgKICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZWFkb25seTx1bmtub3duPj59ICovCiAgICAgIG5vZGUyCiAgICApOwogICAgY29uc3QgdHlwZTUgPSB0eXBlb2YgdW5zYWZlMi50eXBlID09PSAic3RyaW5nIiA/IHVuc2FmZTIudHlwZSA6ICIiOwogICAgc3dpdGNoICh0eXBlNSkgewogICAgICBjYXNlICJjb21tZW50IjogewogICAgICAgIHJldHVybiBjb21tZW50KHN0YXRlMTAsIHVuc2FmZTIpOwogICAgICB9CiAgICAgIGNhc2UgImRvY3R5cGUiOiB7CiAgICAgICAgcmV0dXJuIGRvY3R5cGUoc3RhdGUxMCwgdW5zYWZlMik7CiAgICAgIH0KICAgICAgY2FzZSAiZWxlbWVudCI6IHsKICAgICAgICByZXR1cm4gZWxlbWVudDIoc3RhdGUxMCwgdW5zYWZlMik7CiAgICAgIH0KICAgICAgY2FzZSAicm9vdCI6IHsKICAgICAgICByZXR1cm4gcm9vdDIoc3RhdGUxMCwgdW5zYWZlMik7CiAgICAgIH0KICAgICAgY2FzZSAidGV4dCI6IHsKICAgICAgICByZXR1cm4gdGV4dDUoc3RhdGUxMCwgdW5zYWZlMik7CiAgICAgIH0KICAgICAgZGVmYXVsdDoKICAgIH0KICB9Cn0KZnVuY3Rpb24gY29tbWVudChzdGF0ZTEwLCB1bnNhZmUyKSB7CiAgaWYgKHN0YXRlMTAuc2NoZW1hLmFsbG93Q29tbWVudHMpIHsKICAgIGNvbnN0IHJlc3VsdCA9IHR5cGVvZiB1bnNhZmUyLnZhbHVlID09PSAic3RyaW5nIiA/IHVuc2FmZTIudmFsdWUgOiAiIjsKICAgIGNvbnN0IGluZGV4MiA9IHJlc3VsdC5pbmRleE9mKCItLT4iKTsKICAgIGNvbnN0IHZhbHVlMiA9IGluZGV4MiA8IDAgPyByZXN1bHQgOiByZXN1bHQuc2xpY2UoMCwgaW5kZXgyKTsKICAgIGNvbnN0IG5vZGUyID0geyB0eXBlOiAiY29tbWVudCIsIHZhbHVlOiB2YWx1ZTIgfTsKICAgIHBhdGNoKG5vZGUyLCB1bnNhZmUyKTsKICAgIHJldHVybiBub2RlMjsKICB9Cn0KZnVuY3Rpb24gZG9jdHlwZShzdGF0ZTEwLCB1bnNhZmUyKSB7CiAgaWYgKHN0YXRlMTAuc2NoZW1hLmFsbG93RG9jdHlwZXMpIHsKICAgIGNvbnN0IG5vZGUyID0geyB0eXBlOiAiZG9jdHlwZSIgfTsKICAgIHBhdGNoKG5vZGUyLCB1bnNhZmUyKTsKICAgIHJldHVybiBub2RlMjsKICB9Cn0KZnVuY3Rpb24gZWxlbWVudDIoc3RhdGUxMCwgdW5zYWZlMikgewogIGNvbnN0IG5hbWUgPSB0eXBlb2YgdW5zYWZlMi50YWdOYW1lID09PSAic3RyaW5nIiA/IHVuc2FmZTIudGFnTmFtZSA6ICIiOwogIHN0YXRlMTAuc3RhY2sucHVzaChuYW1lKTsKICBjb25zdCBjb250ZW50MyA9ICgKICAgIC8qKiBAdHlwZSB7QXJyYXk8RWxlbWVudENvbnRlbnQ+fSAqLwogICAgY2hpbGRyZW4oc3RhdGUxMCwgdW5zYWZlMi5jaGlsZHJlbikKICApOwogIGNvbnN0IHByb3BlcnRpZXNfID0gcHJvcGVydGllcyhzdGF0ZTEwLCB1bnNhZmUyLnByb3BlcnRpZXMpOwogIHN0YXRlMTAuc3RhY2sucG9wKCk7CiAgbGV0IHNhZmVFbGVtZW50ID0gZmFsc2U7CiAgaWYgKG5hbWUgJiYgbmFtZSAhPT0gIioiICYmICghc3RhdGUxMC5zY2hlbWEudGFnTmFtZXMgfHwgc3RhdGUxMC5zY2hlbWEudGFnTmFtZXMuaW5jbHVkZXMobmFtZSkpKSB7CiAgICBzYWZlRWxlbWVudCA9IHRydWU7CiAgICBpZiAoc3RhdGUxMC5zY2hlbWEuYW5jZXN0b3JzICYmIG93bjcuY2FsbChzdGF0ZTEwLnNjaGVtYS5hbmNlc3RvcnMsIG5hbWUpKSB7CiAgICAgIGNvbnN0IGFuY2VzdG9ycyA9IHN0YXRlMTAuc2NoZW1hLmFuY2VzdG9yc1tuYW1lXTsKICAgICAgbGV0IGluZGV4MiA9IC0xOwogICAgICBzYWZlRWxlbWVudCA9IGZhbHNlOwogICAgICB3aGlsZSAoKytpbmRleDIgPCBhbmNlc3RvcnMubGVuZ3RoKSB7CiAgICAgICAgaWYgKHN0YXRlMTAuc3RhY2suaW5jbHVkZXMoYW5jZXN0b3JzW2luZGV4Ml0pKSB7CiAgICAgICAgICBzYWZlRWxlbWVudCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGlmICghc2FmZUVsZW1lbnQpIHsKICAgIHJldHVybiBzdGF0ZTEwLnNjaGVtYS5zdHJpcCAmJiAhc3RhdGUxMC5zY2hlbWEuc3RyaXAuaW5jbHVkZXMobmFtZSkgPyBjb250ZW50MyA6IHZvaWQgMDsKICB9CiAgY29uc3Qgbm9kZTIgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiBuYW1lLAogICAgcHJvcGVydGllczogcHJvcGVydGllc18sCiAgICBjaGlsZHJlbjogY29udGVudDMKICB9OwogIHBhdGNoKG5vZGUyLCB1bnNhZmUyKTsKICByZXR1cm4gbm9kZTI7Cn0KZnVuY3Rpb24gcm9vdDIoc3RhdGUxMCwgdW5zYWZlMikgewogIGNvbnN0IGNvbnRlbnQzID0gKAogICAgLyoqIEB0eXBlIHtBcnJheTxSb290Q29udGVudD59ICovCiAgICBjaGlsZHJlbihzdGF0ZTEwLCB1bnNhZmUyLmNoaWxkcmVuKQogICk7CiAgY29uc3Qgbm9kZTIgPSB7IHR5cGU6ICJyb290IiwgY2hpbGRyZW46IGNvbnRlbnQzIH07CiAgcGF0Y2gobm9kZTIsIHVuc2FmZTIpOwogIHJldHVybiBub2RlMjsKfQpmdW5jdGlvbiB0ZXh0NShfNCwgdW5zYWZlMikgewogIGNvbnN0IHZhbHVlMiA9IHR5cGVvZiB1bnNhZmUyLnZhbHVlID09PSAic3RyaW5nIiA/IHVuc2FmZTIudmFsdWUgOiAiIjsKICBjb25zdCBub2RlMiA9IHsgdHlwZTogInRleHQiLCB2YWx1ZTogdmFsdWUyIH07CiAgcGF0Y2gobm9kZTIsIHVuc2FmZTIpOwogIHJldHVybiBub2RlMjsKfQpmdW5jdGlvbiBjaGlsZHJlbihzdGF0ZTEwLCBjaGlsZHJlbjIpIHsKICBjb25zdCByZXN1bHRzID0gW107CiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4yKSkgewogICAgY29uc3QgY2hpbGRyZW5Vbmtub3duID0gKAogICAgICAvKiogQHR5cGUge0FycmF5PFJlYWRvbmx5PHVua25vd24+Pn0gKi8KICAgICAgY2hpbGRyZW4yCiAgICApOwogICAgbGV0IGluZGV4MiA9IC0xOwogICAgd2hpbGUgKCsraW5kZXgyIDwgY2hpbGRyZW5Vbmtub3duLmxlbmd0aCkgewogICAgICBjb25zdCB2YWx1ZTIgPSB0cmFuc2Zvcm0oc3RhdGUxMCwgY2hpbGRyZW5Vbmtub3duW2luZGV4Ml0pOwogICAgICBpZiAodmFsdWUyKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUyKSkgewogICAgICAgICAgcmVzdWx0cy5wdXNoKC4uLnZhbHVlMik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZTIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICByZXR1cm4gcmVzdWx0czsKfQpmdW5jdGlvbiBwcm9wZXJ0aWVzKHN0YXRlMTAsIHByb3BlcnRpZXMyKSB7CiAgY29uc3QgdGFnTmFtZSA9IHN0YXRlMTAuc3RhY2tbc3RhdGUxMC5zdGFjay5sZW5ndGggLSAxXTsKICBjb25zdCBhdHRyaWJ1dGVzID0gc3RhdGUxMC5zY2hlbWEuYXR0cmlidXRlczsKICBjb25zdCByZXF1aXJlZCA9IHN0YXRlMTAuc2NoZW1hLnJlcXVpcmVkOwogIGNvbnN0IHNwZWNpZmljID0gYXR0cmlidXRlcyAmJiBvd243LmNhbGwoYXR0cmlidXRlcywgdGFnTmFtZSkgPyBhdHRyaWJ1dGVzW3RhZ05hbWVdIDogdm9pZCAwOwogIGNvbnN0IGRlZmF1bHRzID0gYXR0cmlidXRlcyAmJiBvd243LmNhbGwoYXR0cmlidXRlcywgIioiKSA/IGF0dHJpYnV0ZXNbIioiXSA6IHZvaWQgMDsKICBjb25zdCBwcm9wZXJ0aWVzXyA9ICgKICAgIC8qKiBAdHlwZSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUmVhZG9ubHk8dW5rbm93bj4+Pn0gKi8KICAgIHByb3BlcnRpZXMyICYmIHR5cGVvZiBwcm9wZXJ0aWVzMiA9PT0gIm9iamVjdCIgPyBwcm9wZXJ0aWVzMiA6IHt9CiAgKTsKICBjb25zdCByZXN1bHQgPSB7fTsKICBsZXQga2V5MjsKICBmb3IgKGtleTIgaW4gcHJvcGVydGllc18pIHsKICAgIGlmIChvd243LmNhbGwocHJvcGVydGllc18sIGtleTIpKSB7CiAgICAgIGNvbnN0IHVuc2FmZTIgPSBwcm9wZXJ0aWVzX1trZXkyXTsKICAgICAgbGV0IHNhZmUyID0gcHJvcGVydHlWYWx1ZSgKICAgICAgICBzdGF0ZTEwLAogICAgICAgIGZpbmREZWZpbml0aW9uKHNwZWNpZmljLCBrZXkyKSwKICAgICAgICBrZXkyLAogICAgICAgIHVuc2FmZTIKICAgICAgKTsKICAgICAgaWYgKHNhZmUyID09PSBudWxsIHx8IHNhZmUyID09PSB2b2lkIDApIHsKICAgICAgICBzYWZlMiA9IHByb3BlcnR5VmFsdWUoc3RhdGUxMCwgZmluZERlZmluaXRpb24oZGVmYXVsdHMsIGtleTIpLCBrZXkyLCB1bnNhZmUyKTsKICAgICAgfQogICAgICBpZiAoc2FmZTIgIT09IG51bGwgJiYgc2FmZTIgIT09IHZvaWQgMCkgewogICAgICAgIHJlc3VsdFtrZXkyXSA9IHNhZmUyOwogICAgICB9CiAgICB9CiAgfQogIGlmIChyZXF1aXJlZCAmJiBvd243LmNhbGwocmVxdWlyZWQsIHRhZ05hbWUpKSB7CiAgICBjb25zdCBwcm9wZXJ0aWVzMyA9IHJlcXVpcmVkW3RhZ05hbWVdOwogICAgZm9yIChrZXkyIGluIHByb3BlcnRpZXMzKSB7CiAgICAgIGlmIChvd243LmNhbGwocHJvcGVydGllczMsIGtleTIpICYmICFvd243LmNhbGwocmVzdWx0LCBrZXkyKSkgewogICAgICAgIHJlc3VsdFtrZXkyXSA9IHByb3BlcnRpZXMzW2tleTJdOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gcHJvcGVydHlWYWx1ZShzdGF0ZTEwLCBkZWZpbml0aW9uMywga2V5MiwgdmFsdWUyKSB7CiAgcmV0dXJuIGRlZmluaXRpb24zID8gQXJyYXkuaXNBcnJheSh2YWx1ZTIpID8gcHJvcGVydHlWYWx1ZU1hbnkoc3RhdGUxMCwgZGVmaW5pdGlvbjMsIGtleTIsIHZhbHVlMikgOiBwcm9wZXJ0eVZhbHVlUHJpbWl0aXZlKHN0YXRlMTAsIGRlZmluaXRpb24zLCBrZXkyLCB2YWx1ZTIpIDogdm9pZCAwOwp9CmZ1bmN0aW9uIHByb3BlcnR5VmFsdWVNYW55KHN0YXRlMTAsIGRlZmluaXRpb24zLCBrZXkyLCB2YWx1ZXMpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgY29uc3QgcmVzdWx0ID0gW107CiAgd2hpbGUgKCsraW5kZXgyIDwgdmFsdWVzLmxlbmd0aCkgewogICAgY29uc3QgdmFsdWUyID0gcHJvcGVydHlWYWx1ZVByaW1pdGl2ZShzdGF0ZTEwLCBkZWZpbml0aW9uMywga2V5MiwgdmFsdWVzW2luZGV4Ml0pOwogICAgaWYgKHR5cGVvZiB2YWx1ZTIgPT09ICJudW1iZXIiIHx8IHR5cGVvZiB2YWx1ZTIgPT09ICJzdHJpbmciKSB7CiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlMik7CiAgICB9CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gcHJvcGVydHlWYWx1ZVByaW1pdGl2ZShzdGF0ZTEwLCBkZWZpbml0aW9uMywga2V5MiwgdmFsdWUyKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZTIgIT09ICJib29sZWFuIiAmJiB0eXBlb2YgdmFsdWUyICE9PSAibnVtYmVyIiAmJiB0eXBlb2YgdmFsdWUyICE9PSAic3RyaW5nIikgewogICAgcmV0dXJuOwogIH0KICBpZiAoIXNhZmVQcm90b2NvbChzdGF0ZTEwLCBrZXkyLCB2YWx1ZTIpKSB7CiAgICByZXR1cm47CiAgfQogIGlmICh0eXBlb2YgZGVmaW5pdGlvbjMgPT09ICJvYmplY3QiICYmIGRlZmluaXRpb24zLmxlbmd0aCA+IDEpIHsKICAgIGxldCBvazMgPSBmYWxzZTsKICAgIGxldCBpbmRleDIgPSAwOwogICAgd2hpbGUgKCsraW5kZXgyIDwgZGVmaW5pdGlvbjMubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGFsbG93ZWQgPSBkZWZpbml0aW9uM1tpbmRleDJdOwogICAgICBpZiAoYWxsb3dlZCAmJiB0eXBlb2YgYWxsb3dlZCA9PT0gIm9iamVjdCIgJiYgImZsYWdzIiBpbiBhbGxvd2VkKSB7CiAgICAgICAgaWYgKGFsbG93ZWQudGVzdChTdHJpbmcodmFsdWUyKSkpIHsKICAgICAgICAgIG9rMyA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYWxsb3dlZCA9PT0gdmFsdWUyKSB7CiAgICAgICAgb2szID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKCFvazMpIHJldHVybjsKICB9CiAgcmV0dXJuIHN0YXRlMTAuc2NoZW1hLmNsb2JiZXIgJiYgc3RhdGUxMC5zY2hlbWEuY2xvYmJlclByZWZpeCAmJiBzdGF0ZTEwLnNjaGVtYS5jbG9iYmVyLmluY2x1ZGVzKGtleTIpID8gc3RhdGUxMC5zY2hlbWEuY2xvYmJlclByZWZpeCArIHZhbHVlMiA6IHZhbHVlMjsKfQpmdW5jdGlvbiBzYWZlUHJvdG9jb2woc3RhdGUxMCwga2V5MiwgdmFsdWUyKSB7CiAgY29uc3QgcHJvdG9jb2xzID0gc3RhdGUxMC5zY2hlbWEucHJvdG9jb2xzICYmIG93bjcuY2FsbChzdGF0ZTEwLnNjaGVtYS5wcm90b2NvbHMsIGtleTIpID8gc3RhdGUxMC5zY2hlbWEucHJvdG9jb2xzW2tleTJdIDogdm9pZCAwOwogIGlmICghcHJvdG9jb2xzIHx8IHByb3RvY29scy5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBjb25zdCB1cmwgPSBTdHJpbmcodmFsdWUyKTsKICBjb25zdCBjb2xvbiA9IHVybC5pbmRleE9mKCI6Iik7CiAgY29uc3QgcXVlc3Rpb25NYXJrID0gdXJsLmluZGV4T2YoIj8iKTsKICBjb25zdCBudW1iZXJTaWduID0gdXJsLmluZGV4T2YoIiMiKTsKICBjb25zdCBzbGFzaCA9IHVybC5pbmRleE9mKCIvIik7CiAgaWYgKGNvbG9uIDwgMCB8fCAvLyBJZiB0aGUgZmlyc3QgY29sb24gaXMgYWZ0ZXIgYSBgP2AsIGAjYCwgb3IgYC9gLCBpdOKAmXMgbm90IGEgcHJvdG9jb2wuCiAgc2xhc2ggPiAtMSAmJiBjb2xvbiA+IHNsYXNoIHx8IHF1ZXN0aW9uTWFyayA+IC0xICYmIGNvbG9uID4gcXVlc3Rpb25NYXJrIHx8IG51bWJlclNpZ24gPiAtMSAmJiBjb2xvbiA+IG51bWJlclNpZ24pIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgcHJvdG9jb2xzLmxlbmd0aCkgewogICAgY29uc3QgcHJvdG9jb2wgPSBwcm90b2NvbHNbaW5kZXgyXTsKICAgIGlmIChjb2xvbiA9PT0gcHJvdG9jb2wubGVuZ3RoICYmIHVybC5zbGljZSgwLCBwcm90b2NvbC5sZW5ndGgpID09PSBwcm90b2NvbCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIHBhdGNoKG5vZGUyLCB1bnNhZmUyKSB7CiAgY29uc3QgY2xlYW5Qb3NpdGlvbiA9IHBvc2l0aW9uMigKICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGxvb2tzIGxpa2UgYSBub2RlLgogICAgdW5zYWZlMgogICk7CiAgaWYgKHVuc2FmZTIuZGF0YSkgewogICAgbm9kZTIuZGF0YSA9IGVzbV9kZWZhdWx0KHVuc2FmZTIuZGF0YSk7CiAgfQogIGlmIChjbGVhblBvc2l0aW9uKSBub2RlMi5wb3NpdGlvbiA9IGNsZWFuUG9zaXRpb247Cn0KZnVuY3Rpb24gZmluZERlZmluaXRpb24oZGVmaW5pdGlvbnMsIGtleTIpIHsKICBsZXQgZGF0YURlZmF1bHQ7CiAgbGV0IGluZGV4MiA9IC0xOwogIGlmIChkZWZpbml0aW9ucykgewogICAgd2hpbGUgKCsraW5kZXgyIDwgZGVmaW5pdGlvbnMubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGVudHJ5ID0gZGVmaW5pdGlvbnNbaW5kZXgyXTsKICAgICAgY29uc3QgbmFtZSA9IHR5cGVvZiBlbnRyeSA9PT0gInN0cmluZyIgPyBlbnRyeSA6IGVudHJ5WzBdOwogICAgICBpZiAobmFtZSA9PT0ga2V5MikgewogICAgICAgIHJldHVybiBlbnRyeTsKICAgICAgfQogICAgICBpZiAobmFtZSA9PT0gImRhdGEqIikgZGF0YURlZmF1bHQgPSBlbnRyeTsKICAgIH0KICB9CiAgaWYgKGtleTIubGVuZ3RoID4gNCAmJiBrZXkyLnNsaWNlKDAsIDQpLnRvTG93ZXJDYXNlKCkgPT09ICJkYXRhIikgewogICAgcmV0dXJuIGRhdGFEZWZhdWx0OwogIH0KfQp2YXIgb3duNzsKdmFyIGluaXRfbGliMjYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtc2FuaXRpemVANS4wLjIvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC1zYW5pdGl6ZS9saWIvaW5kZXguanMiKCkgewogICAgaW5pdF9lc20oKTsKICAgIGluaXRfdW5pc3RfdXRpbF9wb3NpdGlvbigpOwogICAgaW5pdF9zY2hlbWEoKTsKICAgIG93bjcgPSB7fS5oYXNPd25Qcm9wZXJ0eTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC1zYW5pdGl6ZUA1LjAuMi9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXNhbml0aXplL2luZGV4LmpzCnZhciBpbml0X2hhc3RfdXRpbF9zYW5pdGl6ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC1zYW5pdGl6ZUA1LjAuMi9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXNhbml0aXplL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliMjYoKTsKICAgIGluaXRfc2NoZW1hKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2Jsb2NrcXVvdGUuanMKZnVuY3Rpb24gYmxvY2txdW90ZTIoc3RhdGUxMCwgbm9kZTIpIHsKICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiYmxvY2txdW90ZSIsCiAgICBwcm9wZXJ0aWVzOiB7fSwKICAgIGNoaWxkcmVuOiBzdGF0ZTEwLndyYXAoc3RhdGUxMC5hbGwobm9kZTIpLCB0cnVlKQogIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KdmFyIGluaXRfYmxvY2txdW90ZTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2Jsb2NrcXVvdGUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9icmVhay5qcwpmdW5jdGlvbiBoYXJkQnJlYWsyKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0geyB0eXBlOiAiZWxlbWVudCIsIHRhZ05hbWU6ICJiciIsIHByb3BlcnRpZXM6IHt9LCBjaGlsZHJlbjogW10gfTsKICBzdGF0ZTEwLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBbc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCksIHsgdHlwZTogInRleHQiLCB2YWx1ZTogIlxuIiB9XTsKfQp2YXIgaW5pdF9icmVhazIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2JyZWFrLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvY29kZS5qcwpmdW5jdGlvbiBjb2RlMyhzdGF0ZTEwLCBub2RlMikgewogIGNvbnN0IHZhbHVlMiA9IG5vZGUyLnZhbHVlID8gbm9kZTIudmFsdWUgKyAiXG4iIDogIiI7CiAgY29uc3QgcHJvcGVydGllczIgPSB7fTsKICBjb25zdCBsYW5ndWFnZSA9IG5vZGUyLmxhbmcgPyBub2RlMi5sYW5nLnNwbGl0KC9ccysvKSA6IFtdOwogIGlmIChsYW5ndWFnZS5sZW5ndGggPiAwKSB7CiAgICBwcm9wZXJ0aWVzMi5jbGFzc05hbWUgPSBbImxhbmd1YWdlLSIgKyBsYW5ndWFnZVswXV07CiAgfQogIGxldCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiY29kZSIsCiAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzMiwKICAgIGNoaWxkcmVuOiBbeyB0eXBlOiAidGV4dCIsIHZhbHVlOiB2YWx1ZTIgfV0KICB9OwogIGlmIChub2RlMi5tZXRhKSB7CiAgICByZXN1bHQuZGF0YSA9IHsgbWV0YTogbm9kZTIubWV0YSB9OwogIH0KICBzdGF0ZTEwLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJlc3VsdCA9IHN0YXRlMTAuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwogIHJlc3VsdCA9IHsgdHlwZTogImVsZW1lbnQiLCB0YWdOYW1lOiAicHJlIiwgcHJvcGVydGllczoge30sIGNoaWxkcmVuOiBbcmVzdWx0XSB9OwogIHN0YXRlMTAucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHJlc3VsdDsKfQp2YXIgaW5pdF9jb2RlMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvY29kZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2RlbGV0ZS5qcwpmdW5jdGlvbiBzdHJpa2V0aHJvdWdoKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogImRlbCIsCiAgICBwcm9wZXJ0aWVzOiB7fSwKICAgIGNoaWxkcmVuOiBzdGF0ZTEwLmFsbChub2RlMikKICB9OwogIHN0YXRlMTAucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlMTAuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9CnZhciBpbml0X2RlbGV0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvZGVsZXRlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvZW1waGFzaXMuanMKZnVuY3Rpb24gZW1waGFzaXMyKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogImVtIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlMTAuYWxsKG5vZGUyKQogIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KdmFyIGluaXRfZW1waGFzaXMyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9lbXBoYXNpcy5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2Zvb3Rub3RlLXJlZmVyZW5jZS5qcwpmdW5jdGlvbiBmb290bm90ZVJlZmVyZW5jZTIoc3RhdGUxMCwgbm9kZTIpIHsKICBjb25zdCBjbG9iYmVyUHJlZml4ID0gdHlwZW9mIHN0YXRlMTAub3B0aW9ucy5jbG9iYmVyUHJlZml4ID09PSAic3RyaW5nIiA/IHN0YXRlMTAub3B0aW9ucy5jbG9iYmVyUHJlZml4IDogInVzZXItY29udGVudC0iOwogIGNvbnN0IGlkID0gU3RyaW5nKG5vZGUyLmlkZW50aWZpZXIpLnRvVXBwZXJDYXNlKCk7CiAgY29uc3Qgc2FmZUlkID0gbm9ybWFsaXplVXJpKGlkLnRvTG93ZXJDYXNlKCkpOwogIGNvbnN0IGluZGV4MiA9IHN0YXRlMTAuZm9vdG5vdGVPcmRlci5pbmRleE9mKGlkKTsKICBsZXQgY291bnRlcjI7CiAgbGV0IHJldXNlQ291bnRlciA9IHN0YXRlMTAuZm9vdG5vdGVDb3VudHMuZ2V0KGlkKTsKICBpZiAocmV1c2VDb3VudGVyID09PSB2b2lkIDApIHsKICAgIHJldXNlQ291bnRlciA9IDA7CiAgICBzdGF0ZTEwLmZvb3Rub3RlT3JkZXIucHVzaChpZCk7CiAgICBjb3VudGVyMiA9IHN0YXRlMTAuZm9vdG5vdGVPcmRlci5sZW5ndGg7CiAgfSBlbHNlIHsKICAgIGNvdW50ZXIyID0gaW5kZXgyICsgMTsKICB9CiAgcmV1c2VDb3VudGVyICs9IDE7CiAgc3RhdGUxMC5mb290bm90ZUNvdW50cy5zZXQoaWQsIHJldXNlQ291bnRlcik7CiAgY29uc3QgbGluazMgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiYSIsCiAgICBwcm9wZXJ0aWVzOiB7CiAgICAgIGhyZWY6ICIjIiArIGNsb2JiZXJQcmVmaXggKyAiZm4tIiArIHNhZmVJZCwKICAgICAgaWQ6IGNsb2JiZXJQcmVmaXggKyAiZm5yZWYtIiArIHNhZmVJZCArIChyZXVzZUNvdW50ZXIgPiAxID8gIi0iICsgcmV1c2VDb3VudGVyIDogIiIpLAogICAgICBkYXRhRm9vdG5vdGVSZWY6IHRydWUsCiAgICAgIGFyaWFEZXNjcmliZWRCeTogWyJmb290bm90ZS1sYWJlbCJdCiAgICB9LAogICAgY2hpbGRyZW46IFt7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IFN0cmluZyhjb3VudGVyMikgfV0KICB9OwogIHN0YXRlMTAucGF0Y2gobm9kZTIsIGxpbmszKTsKICBjb25zdCBzdXAgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAic3VwIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IFtsaW5rM10KICB9OwogIHN0YXRlMTAucGF0Y2gobm9kZTIsIHN1cCk7CiAgcmV0dXJuIHN0YXRlMTAuYXBwbHlEYXRhKG5vZGUyLCBzdXApOwp9CnZhciBpbml0X2Zvb3Rub3RlX3JlZmVyZW5jZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvZm9vdG5vdGUtcmVmZXJlbmNlLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfc2FuaXRpemVfdXJpKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2hlYWRpbmcuanMKZnVuY3Rpb24gaGVhZGluZzIoc3RhdGUxMCwgbm9kZTIpIHsKICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiaCIgKyBub2RlMi5kZXB0aCwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlMTAuYWxsKG5vZGUyKQogIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KdmFyIGluaXRfaGVhZGluZzIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2hlYWRpbmcuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9odG1sLmpzCmZ1bmN0aW9uIGh0bWwyKHN0YXRlMTAsIG5vZGUyKSB7CiAgaWYgKHN0YXRlMTAub3B0aW9ucy5hbGxvd0Rhbmdlcm91c0h0bWwpIHsKICAgIGNvbnN0IHJlc3VsdCA9IHsgdHlwZTogInJhdyIsIHZhbHVlOiBub2RlMi52YWx1ZSB9OwogICAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICAgIHJldHVybiBzdGF0ZTEwLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKICB9CiAgcmV0dXJuIHZvaWQgMDsKfQp2YXIgaW5pdF9odG1sOCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvaHRtbC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL3JldmVydC5qcwpmdW5jdGlvbiByZXZlcnQoc3RhdGUxMCwgbm9kZTIpIHsKICBjb25zdCBzdWJ0eXBlID0gbm9kZTIucmVmZXJlbmNlVHlwZTsKICBsZXQgc3VmZml4ID0gIl0iOwogIGlmIChzdWJ0eXBlID09PSAiY29sbGFwc2VkIikgewogICAgc3VmZml4ICs9ICJbXSI7CiAgfSBlbHNlIGlmIChzdWJ0eXBlID09PSAiZnVsbCIpIHsKICAgIHN1ZmZpeCArPSAiWyIgKyAobm9kZTIubGFiZWwgfHwgbm9kZTIuaWRlbnRpZmllcikgKyAiXSI7CiAgfQogIGlmIChub2RlMi50eXBlID09PSAiaW1hZ2VSZWZlcmVuY2UiKSB7CiAgICByZXR1cm4gW3sgdHlwZTogInRleHQiLCB2YWx1ZTogIiFbIiArIG5vZGUyLmFsdCArIHN1ZmZpeCB9XTsKICB9CiAgY29uc3QgY29udGVudHMgPSBzdGF0ZTEwLmFsbChub2RlMik7CiAgY29uc3QgaGVhZDIgPSBjb250ZW50c1swXTsKICBpZiAoaGVhZDIgJiYgaGVhZDIudHlwZSA9PT0gInRleHQiKSB7CiAgICBoZWFkMi52YWx1ZSA9ICJbIiArIGhlYWQyLnZhbHVlOwogIH0gZWxzZSB7CiAgICBjb250ZW50cy51bnNoaWZ0KHsgdHlwZTogInRleHQiLCB2YWx1ZTogIlsiIH0pOwogIH0KICBjb25zdCB0YWlsID0gY29udGVudHNbY29udGVudHMubGVuZ3RoIC0gMV07CiAgaWYgKHRhaWwgJiYgdGFpbC50eXBlID09PSAidGV4dCIpIHsKICAgIHRhaWwudmFsdWUgKz0gc3VmZml4OwogIH0gZWxzZSB7CiAgICBjb250ZW50cy5wdXNoKHsgdHlwZTogInRleHQiLCB2YWx1ZTogc3VmZml4IH0pOwogIH0KICByZXR1cm4gY29udGVudHM7Cn0KdmFyIGluaXRfcmV2ZXJ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9yZXZlcnQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9pbWFnZS1yZWZlcmVuY2UuanMKZnVuY3Rpb24gaW1hZ2VSZWZlcmVuY2UyKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgaWQgPSBTdHJpbmcobm9kZTIuaWRlbnRpZmllcikudG9VcHBlckNhc2UoKTsKICBjb25zdCBkZWZpbml0aW9uMyA9IHN0YXRlMTAuZGVmaW5pdGlvbkJ5SWQuZ2V0KGlkKTsKICBpZiAoIWRlZmluaXRpb24zKSB7CiAgICByZXR1cm4gcmV2ZXJ0KHN0YXRlMTAsIG5vZGUyKTsKICB9CiAgY29uc3QgcHJvcGVydGllczIgPSB7IHNyYzogbm9ybWFsaXplVXJpKGRlZmluaXRpb24zLnVybCB8fCAiIiksIGFsdDogbm9kZTIuYWx0IH07CiAgaWYgKGRlZmluaXRpb24zLnRpdGxlICE9PSBudWxsICYmIGRlZmluaXRpb24zLnRpdGxlICE9PSB2b2lkIDApIHsKICAgIHByb3BlcnRpZXMyLnRpdGxlID0gZGVmaW5pdGlvbjMudGl0bGU7CiAgfQogIGNvbnN0IHJlc3VsdCA9IHsgdHlwZTogImVsZW1lbnQiLCB0YWdOYW1lOiAiaW1nIiwgcHJvcGVydGllczogcHJvcGVydGllczIsIGNoaWxkcmVuOiBbXSB9OwogIHN0YXRlMTAucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlMTAuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9CnZhciBpbml0X2ltYWdlX3JlZmVyZW5jZTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2ltYWdlLXJlZmVyZW5jZS5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX3Nhbml0aXplX3VyaSgpOwogICAgaW5pdF9yZXZlcnQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvaW1hZ2UuanMKZnVuY3Rpb24gaW1hZ2UyKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgcHJvcGVydGllczIgPSB7IHNyYzogbm9ybWFsaXplVXJpKG5vZGUyLnVybCkgfTsKICBpZiAobm9kZTIuYWx0ICE9PSBudWxsICYmIG5vZGUyLmFsdCAhPT0gdm9pZCAwKSB7CiAgICBwcm9wZXJ0aWVzMi5hbHQgPSBub2RlMi5hbHQ7CiAgfQogIGlmIChub2RlMi50aXRsZSAhPT0gbnVsbCAmJiBub2RlMi50aXRsZSAhPT0gdm9pZCAwKSB7CiAgICBwcm9wZXJ0aWVzMi50aXRsZSA9IG5vZGUyLnRpdGxlOwogIH0KICBjb25zdCByZXN1bHQgPSB7IHR5cGU6ICJlbGVtZW50IiwgdGFnTmFtZTogImltZyIsIHByb3BlcnRpZXM6IHByb3BlcnRpZXMyLCBjaGlsZHJlbjogW10gfTsKICBzdGF0ZTEwLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZTEwLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQp2YXIgaW5pdF9pbWFnZTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2ltYWdlLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfc2FuaXRpemVfdXJpKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2lubGluZS1jb2RlLmpzCmZ1bmN0aW9uIGlubGluZUNvZGUyKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgdGV4dDkgPSB7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IG5vZGUyLnZhbHVlLnJlcGxhY2UoL1xyP1xufFxyL2csICIgIikgfTsKICBzdGF0ZTEwLnBhdGNoKG5vZGUyLCB0ZXh0OSk7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogImNvZGUiLAogICAgcHJvcGVydGllczoge30sCiAgICBjaGlsZHJlbjogW3RleHQ5XQogIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KdmFyIGluaXRfaW5saW5lX2NvZGUyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9pbmxpbmUtY29kZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2xpbmstcmVmZXJlbmNlLmpzCmZ1bmN0aW9uIGxpbmtSZWZlcmVuY2UyKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgaWQgPSBTdHJpbmcobm9kZTIuaWRlbnRpZmllcikudG9VcHBlckNhc2UoKTsKICBjb25zdCBkZWZpbml0aW9uMyA9IHN0YXRlMTAuZGVmaW5pdGlvbkJ5SWQuZ2V0KGlkKTsKICBpZiAoIWRlZmluaXRpb24zKSB7CiAgICByZXR1cm4gcmV2ZXJ0KHN0YXRlMTAsIG5vZGUyKTsKICB9CiAgY29uc3QgcHJvcGVydGllczIgPSB7IGhyZWY6IG5vcm1hbGl6ZVVyaShkZWZpbml0aW9uMy51cmwgfHwgIiIpIH07CiAgaWYgKGRlZmluaXRpb24zLnRpdGxlICE9PSBudWxsICYmIGRlZmluaXRpb24zLnRpdGxlICE9PSB2b2lkIDApIHsKICAgIHByb3BlcnRpZXMyLnRpdGxlID0gZGVmaW5pdGlvbjMudGl0bGU7CiAgfQogIGNvbnN0IHJlc3VsdCA9IHsKICAgIHR5cGU6ICJlbGVtZW50IiwKICAgIHRhZ05hbWU6ICJhIiwKICAgIHByb3BlcnRpZXM6IHByb3BlcnRpZXMyLAogICAgY2hpbGRyZW46IHN0YXRlMTAuYWxsKG5vZGUyKQogIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KdmFyIGluaXRfbGlua19yZWZlcmVuY2UyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9saW5rLXJlZmVyZW5jZS5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX3Nhbml0aXplX3VyaSgpOwogICAgaW5pdF9yZXZlcnQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvbGluay5qcwpmdW5jdGlvbiBsaW5rMihzdGF0ZTEwLCBub2RlMikgewogIGNvbnN0IHByb3BlcnRpZXMyID0geyBocmVmOiBub3JtYWxpemVVcmkobm9kZTIudXJsKSB9OwogIGlmIChub2RlMi50aXRsZSAhPT0gbnVsbCAmJiBub2RlMi50aXRsZSAhPT0gdm9pZCAwKSB7CiAgICBwcm9wZXJ0aWVzMi50aXRsZSA9IG5vZGUyLnRpdGxlOwogIH0KICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiYSIsCiAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzMiwKICAgIGNoaWxkcmVuOiBzdGF0ZTEwLmFsbChub2RlMikKICB9OwogIHN0YXRlMTAucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlMTAuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9CnZhciBpbml0X2xpbmsyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9saW5rLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfc2FuaXRpemVfdXJpKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2xpc3QtaXRlbS5qcwpmdW5jdGlvbiBsaXN0SXRlbTIoc3RhdGUxMCwgbm9kZTIsIHBhcmVudCkgewogIGNvbnN0IHJlc3VsdHMgPSBzdGF0ZTEwLmFsbChub2RlMik7CiAgY29uc3QgbG9vc2UgPSBwYXJlbnQgPyBsaXN0TG9vc2UocGFyZW50KSA6IGxpc3RJdGVtTG9vc2Uobm9kZTIpOwogIGNvbnN0IHByb3BlcnRpZXMyID0ge307CiAgY29uc3QgY2hpbGRyZW4yID0gW107CiAgaWYgKHR5cGVvZiBub2RlMi5jaGVja2VkID09PSAiYm9vbGVhbiIpIHsKICAgIGNvbnN0IGhlYWQyID0gcmVzdWx0c1swXTsKICAgIGxldCBwYXJhZ3JhcGgzOwogICAgaWYgKGhlYWQyICYmIGhlYWQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiBoZWFkMi50YWdOYW1lID09PSAicCIpIHsKICAgICAgcGFyYWdyYXBoMyA9IGhlYWQyOwogICAgfSBlbHNlIHsKICAgICAgcGFyYWdyYXBoMyA9IHsgdHlwZTogImVsZW1lbnQiLCB0YWdOYW1lOiAicCIsIHByb3BlcnRpZXM6IHt9LCBjaGlsZHJlbjogW10gfTsKICAgICAgcmVzdWx0cy51bnNoaWZ0KHBhcmFncmFwaDMpOwogICAgfQogICAgaWYgKHBhcmFncmFwaDMuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICBwYXJhZ3JhcGgzLmNoaWxkcmVuLnVuc2hpZnQoeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiICIgfSk7CiAgICB9CiAgICBwYXJhZ3JhcGgzLmNoaWxkcmVuLnVuc2hpZnQoewogICAgICB0eXBlOiAiZWxlbWVudCIsCiAgICAgIHRhZ05hbWU6ICJpbnB1dCIsCiAgICAgIHByb3BlcnRpZXM6IHsgdHlwZTogImNoZWNrYm94IiwgY2hlY2tlZDogbm9kZTIuY2hlY2tlZCwgZGlzYWJsZWQ6IHRydWUgfSwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9KTsKICAgIHByb3BlcnRpZXMyLmNsYXNzTmFtZSA9IFsidGFzay1saXN0LWl0ZW0iXTsKICB9CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHJlc3VsdHMubGVuZ3RoKSB7CiAgICBjb25zdCBjaGlsZCA9IHJlc3VsdHNbaW5kZXgyXTsKICAgIGlmIChsb29zZSB8fCBpbmRleDIgIT09IDAgfHwgY2hpbGQudHlwZSAhPT0gImVsZW1lbnQiIHx8IGNoaWxkLnRhZ05hbWUgIT09ICJwIikgewogICAgICBjaGlsZHJlbjIucHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6ICJcbiIgfSk7CiAgICB9CiAgICBpZiAoY2hpbGQudHlwZSA9PT0gImVsZW1lbnQiICYmIGNoaWxkLnRhZ05hbWUgPT09ICJwIiAmJiAhbG9vc2UpIHsKICAgICAgY2hpbGRyZW4yLnB1c2goLi4uY2hpbGQuY2hpbGRyZW4pOwogICAgfSBlbHNlIHsKICAgICAgY2hpbGRyZW4yLnB1c2goY2hpbGQpOwogICAgfQogIH0KICBjb25zdCB0YWlsID0gcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdOwogIGlmICh0YWlsICYmIChsb29zZSB8fCB0YWlsLnR5cGUgIT09ICJlbGVtZW50IiB8fCB0YWlsLnRhZ05hbWUgIT09ICJwIikpIHsKICAgIGNoaWxkcmVuMi5wdXNoKHsgdHlwZTogInRleHQiLCB2YWx1ZTogIlxuIiB9KTsKICB9CiAgY29uc3QgcmVzdWx0ID0geyB0eXBlOiAiZWxlbWVudCIsIHRhZ05hbWU6ICJsaSIsIHByb3BlcnRpZXM6IHByb3BlcnRpZXMyLCBjaGlsZHJlbjogY2hpbGRyZW4yIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KZnVuY3Rpb24gbGlzdExvb3NlKG5vZGUyKSB7CiAgbGV0IGxvb3NlID0gZmFsc2U7CiAgaWYgKG5vZGUyLnR5cGUgPT09ICJsaXN0IikgewogICAgbG9vc2UgPSBub2RlMi5zcHJlYWQgfHwgZmFsc2U7CiAgICBjb25zdCBjaGlsZHJlbjIgPSBub2RlMi5jaGlsZHJlbjsKICAgIGxldCBpbmRleDIgPSAtMTsKICAgIHdoaWxlICghbG9vc2UgJiYgKytpbmRleDIgPCBjaGlsZHJlbjIubGVuZ3RoKSB7CiAgICAgIGxvb3NlID0gbGlzdEl0ZW1Mb29zZShjaGlsZHJlbjJbaW5kZXgyXSk7CiAgICB9CiAgfQogIHJldHVybiBsb29zZTsKfQpmdW5jdGlvbiBsaXN0SXRlbUxvb3NlKG5vZGUyKSB7CiAgY29uc3Qgc3ByZWFkID0gbm9kZTIuc3ByZWFkOwogIHJldHVybiBzcHJlYWQgPT09IG51bGwgfHwgc3ByZWFkID09PSB2b2lkIDAgPyBub2RlMi5jaGlsZHJlbi5sZW5ndGggPiAxIDogc3ByZWFkOwp9CnZhciBpbml0X2xpc3RfaXRlbTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2xpc3QtaXRlbS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2xpc3QuanMKZnVuY3Rpb24gbGlzdDQoc3RhdGUxMCwgbm9kZTIpIHsKICBjb25zdCBwcm9wZXJ0aWVzMiA9IHt9OwogIGNvbnN0IHJlc3VsdHMgPSBzdGF0ZTEwLmFsbChub2RlMik7CiAgbGV0IGluZGV4MiA9IC0xOwogIGlmICh0eXBlb2Ygbm9kZTIuc3RhcnQgPT09ICJudW1iZXIiICYmIG5vZGUyLnN0YXJ0ICE9PSAxKSB7CiAgICBwcm9wZXJ0aWVzMi5zdGFydCA9IG5vZGUyLnN0YXJ0OwogIH0KICB3aGlsZSAoKytpbmRleDIgPCByZXN1bHRzLmxlbmd0aCkgewogICAgY29uc3QgY2hpbGQgPSByZXN1bHRzW2luZGV4Ml07CiAgICBpZiAoY2hpbGQudHlwZSA9PT0gImVsZW1lbnQiICYmIGNoaWxkLnRhZ05hbWUgPT09ICJsaSIgJiYgY2hpbGQucHJvcGVydGllcyAmJiBBcnJheS5pc0FycmF5KGNoaWxkLnByb3BlcnRpZXMuY2xhc3NOYW1lKSAmJiBjaGlsZC5wcm9wZXJ0aWVzLmNsYXNzTmFtZS5pbmNsdWRlcygidGFzay1saXN0LWl0ZW0iKSkgewogICAgICBwcm9wZXJ0aWVzMi5jbGFzc05hbWUgPSBbImNvbnRhaW5zLXRhc2stbGlzdCJdOwogICAgICBicmVhazsKICAgIH0KICB9CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogbm9kZTIub3JkZXJlZCA/ICJvbCIgOiAidWwiLAogICAgcHJvcGVydGllczogcHJvcGVydGllczIsCiAgICBjaGlsZHJlbjogc3RhdGUxMC53cmFwKHJlc3VsdHMsIHRydWUpCiAgfTsKICBzdGF0ZTEwLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZTEwLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQp2YXIgaW5pdF9saXN0MyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvbGlzdC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL3BhcmFncmFwaC5qcwpmdW5jdGlvbiBwYXJhZ3JhcGgyKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogInAiLAogICAgcHJvcGVydGllczoge30sCiAgICBjaGlsZHJlbjogc3RhdGUxMC5hbGwobm9kZTIpCiAgfTsKICBzdGF0ZTEwLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZTEwLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQp2YXIgaW5pdF9wYXJhZ3JhcGgyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9wYXJhZ3JhcGguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9yb290LmpzCmZ1bmN0aW9uIHJvb3QzKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0geyB0eXBlOiAicm9vdCIsIGNoaWxkcmVuOiBzdGF0ZTEwLndyYXAoc3RhdGUxMC5hbGwobm9kZTIpKSB9OwogIHN0YXRlMTAucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlMTAuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9CnZhciBpbml0X3Jvb3QyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9yb290LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvc3Ryb25nLmpzCmZ1bmN0aW9uIHN0cm9uZzIoc3RhdGUxMCwgbm9kZTIpIHsKICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAic3Ryb25nIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlMTAuYWxsKG5vZGUyKQogIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KdmFyIGluaXRfc3Ryb25nMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvc3Ryb25nLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGFibGUuanMKZnVuY3Rpb24gdGFibGUoc3RhdGUxMCwgbm9kZTIpIHsKICBjb25zdCByb3dzID0gc3RhdGUxMC5hbGwobm9kZTIpOwogIGNvbnN0IGZpcnN0Um93ID0gcm93cy5zaGlmdCgpOwogIGNvbnN0IHRhYmxlQ29udGVudCA9IFtdOwogIGlmIChmaXJzdFJvdykgewogICAgY29uc3QgaGVhZDIgPSB7CiAgICAgIHR5cGU6ICJlbGVtZW50IiwKICAgICAgdGFnTmFtZTogInRoZWFkIiwKICAgICAgcHJvcGVydGllczoge30sCiAgICAgIGNoaWxkcmVuOiBzdGF0ZTEwLndyYXAoW2ZpcnN0Um93XSwgdHJ1ZSkKICAgIH07CiAgICBzdGF0ZTEwLnBhdGNoKG5vZGUyLmNoaWxkcmVuWzBdLCBoZWFkMik7CiAgICB0YWJsZUNvbnRlbnQucHVzaChoZWFkMik7CiAgfQogIGlmIChyb3dzLmxlbmd0aCA+IDApIHsKICAgIGNvbnN0IGJvZHkzID0gewogICAgICB0eXBlOiAiZWxlbWVudCIsCiAgICAgIHRhZ05hbWU6ICJ0Ym9keSIsCiAgICAgIHByb3BlcnRpZXM6IHt9LAogICAgICBjaGlsZHJlbjogc3RhdGUxMC53cmFwKHJvd3MsIHRydWUpCiAgICB9OwogICAgY29uc3Qgc3RhcnQgPSBwb2ludFN0YXJ0KG5vZGUyLmNoaWxkcmVuWzFdKTsKICAgIGNvbnN0IGVuZDMgPSBwb2ludEVuZChub2RlMi5jaGlsZHJlbltub2RlMi5jaGlsZHJlbi5sZW5ndGggLSAxXSk7CiAgICBpZiAoc3RhcnQgJiYgZW5kMykgYm9keTMucG9zaXRpb24gPSB7IHN0YXJ0LCBlbmQ6IGVuZDMgfTsKICAgIHRhYmxlQ29udGVudC5wdXNoKGJvZHkzKTsKICB9CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogInRhYmxlIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlMTAud3JhcCh0YWJsZUNvbnRlbnQsIHRydWUpCiAgfTsKICBzdGF0ZTEwLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZTEwLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQp2YXIgaW5pdF90YWJsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGFibGUuanMiKCkgewogICAgaW5pdF91bmlzdF91dGlsX3Bvc2l0aW9uKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL3RhYmxlLXJvdy5qcwpmdW5jdGlvbiB0YWJsZVJvdyhzdGF0ZTEwLCBub2RlMiwgcGFyZW50KSB7CiAgY29uc3Qgc2libGluZ3MyID0gcGFyZW50ID8gcGFyZW50LmNoaWxkcmVuIDogdm9pZCAwOwogIGNvbnN0IHJvd0luZGV4ID0gc2libGluZ3MyID8gc2libGluZ3MyLmluZGV4T2Yobm9kZTIpIDogMTsKICBjb25zdCB0YWdOYW1lID0gcm93SW5kZXggPT09IDAgPyAidGgiIDogInRkIjsKICBjb25zdCBhbGlnbiA9IHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PT0gInRhYmxlIiA/IHBhcmVudC5hbGlnbiA6IHZvaWQgMDsKICBjb25zdCBsZW5ndGggPSBhbGlnbiA/IGFsaWduLmxlbmd0aCA6IG5vZGUyLmNoaWxkcmVuLmxlbmd0aDsKICBsZXQgY2VsbEluZGV4ID0gLTE7CiAgY29uc3QgY2VsbHMyID0gW107CiAgd2hpbGUgKCsrY2VsbEluZGV4IDwgbGVuZ3RoKSB7CiAgICBjb25zdCBjZWxsMiA9IG5vZGUyLmNoaWxkcmVuW2NlbGxJbmRleF07CiAgICBjb25zdCBwcm9wZXJ0aWVzMiA9IHt9OwogICAgY29uc3QgYWxpZ25WYWx1ZSA9IGFsaWduID8gYWxpZ25bY2VsbEluZGV4XSA6IHZvaWQgMDsKICAgIGlmIChhbGlnblZhbHVlKSB7CiAgICAgIHByb3BlcnRpZXMyLmFsaWduID0gYWxpZ25WYWx1ZTsKICAgIH0KICAgIGxldCByZXN1bHQyID0geyB0eXBlOiAiZWxlbWVudCIsIHRhZ05hbWUsIHByb3BlcnRpZXM6IHByb3BlcnRpZXMyLCBjaGlsZHJlbjogW10gfTsKICAgIGlmIChjZWxsMikgewogICAgICByZXN1bHQyLmNoaWxkcmVuID0gc3RhdGUxMC5hbGwoY2VsbDIpOwogICAgICBzdGF0ZTEwLnBhdGNoKGNlbGwyLCByZXN1bHQyKTsKICAgICAgcmVzdWx0MiA9IHN0YXRlMTAuYXBwbHlEYXRhKGNlbGwyLCByZXN1bHQyKTsKICAgIH0KICAgIGNlbGxzMi5wdXNoKHJlc3VsdDIpOwogIH0KICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAidHIiLAogICAgcHJvcGVydGllczoge30sCiAgICBjaGlsZHJlbjogc3RhdGUxMC53cmFwKGNlbGxzMiwgdHJ1ZSkKICB9OwogIHN0YXRlMTAucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlMTAuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9CnZhciBpbml0X3RhYmxlX3JvdyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGFibGUtcm93LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGFibGUtY2VsbC5qcwpmdW5jdGlvbiB0YWJsZUNlbGwoc3RhdGUxMCwgbm9kZTIpIHsKICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAidGQiLAogICAgLy8gQXNzdW1lIGJvZHkgY2VsbC4KICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlMTAuYWxsKG5vZGUyKQogIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KdmFyIGluaXRfdGFibGVfY2VsbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGFibGUtY2VsbC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS90cmltLWxpbmVzQDMuMC4xL25vZGVfbW9kdWxlcy90cmltLWxpbmVzL2luZGV4LmpzCmZ1bmN0aW9uIHRyaW1MaW5lcyh2YWx1ZTIpIHsKICBjb25zdCBzb3VyY2UgPSBTdHJpbmcodmFsdWUyKTsKICBjb25zdCBzZWFyY2gyID0gL1xyP1xufFxyL2c7CiAgbGV0IG1hdGNoMiA9IHNlYXJjaDIuZXhlYyhzb3VyY2UpOwogIGxldCBsYXN0MyA9IDA7CiAgY29uc3QgbGluZXMgPSBbXTsKICB3aGlsZSAobWF0Y2gyKSB7CiAgICBsaW5lcy5wdXNoKAogICAgICB0cmltTGluZShzb3VyY2Uuc2xpY2UobGFzdDMsIG1hdGNoMi5pbmRleCksIGxhc3QzID4gMCwgdHJ1ZSksCiAgICAgIG1hdGNoMlswXQogICAgKTsKICAgIGxhc3QzID0gbWF0Y2gyLmluZGV4ICsgbWF0Y2gyWzBdLmxlbmd0aDsKICAgIG1hdGNoMiA9IHNlYXJjaDIuZXhlYyhzb3VyY2UpOwogIH0KICBsaW5lcy5wdXNoKHRyaW1MaW5lKHNvdXJjZS5zbGljZShsYXN0MyksIGxhc3QzID4gMCwgZmFsc2UpKTsKICByZXR1cm4gbGluZXMuam9pbigiIik7Cn0KZnVuY3Rpb24gdHJpbUxpbmUodmFsdWUyLCBzdGFydCwgZW5kMykgewogIGxldCBzdGFydEluZGV4ID0gMDsKICBsZXQgZW5kSW5kZXggPSB2YWx1ZTIubGVuZ3RoOwogIGlmIChzdGFydCkgewogICAgbGV0IGNvZGU0ID0gdmFsdWUyLmNvZGVQb2ludEF0KHN0YXJ0SW5kZXgpOwogICAgd2hpbGUgKGNvZGU0ID09PSB0YWIgfHwgY29kZTQgPT09IHNwYWNlKSB7CiAgICAgIHN0YXJ0SW5kZXgrKzsKICAgICAgY29kZTQgPSB2YWx1ZTIuY29kZVBvaW50QXQoc3RhcnRJbmRleCk7CiAgICB9CiAgfQogIGlmIChlbmQzKSB7CiAgICBsZXQgY29kZTQgPSB2YWx1ZTIuY29kZVBvaW50QXQoZW5kSW5kZXggLSAxKTsKICAgIHdoaWxlIChjb2RlNCA9PT0gdGFiIHx8IGNvZGU0ID09PSBzcGFjZSkgewogICAgICBlbmRJbmRleC0tOwogICAgICBjb2RlNCA9IHZhbHVlMi5jb2RlUG9pbnRBdChlbmRJbmRleCAtIDEpOwogICAgfQogIH0KICByZXR1cm4gZW5kSW5kZXggPiBzdGFydEluZGV4ID8gdmFsdWUyLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KSA6ICIiOwp9CnZhciB0YWIsIHNwYWNlOwp2YXIgaW5pdF90cmltX2xpbmVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdHJpbS1saW5lc0AzLjAuMS9ub2RlX21vZHVsZXMvdHJpbS1saW5lcy9pbmRleC5qcyIoKSB7CiAgICB0YWIgPSA5OwogICAgc3BhY2UgPSAzMjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGV4dC5qcwpmdW5jdGlvbiB0ZXh0NihzdGF0ZTEwLCBub2RlMikgewogIGNvbnN0IHJlc3VsdCA9IHsgdHlwZTogInRleHQiLCB2YWx1ZTogdHJpbUxpbmVzKFN0cmluZyhub2RlMi52YWx1ZSkpIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KdmFyIGluaXRfdGV4dDMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL3RleHQuanMiKCkgewogICAgaW5pdF90cmltX2xpbmVzKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL3RoZW1hdGljLWJyZWFrLmpzCmZ1bmN0aW9uIHRoZW1hdGljQnJlYWszKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogImhyIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IFtdCiAgfTsKICBzdGF0ZTEwLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZTEwLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQp2YXIgaW5pdF90aGVtYXRpY19icmVhazMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL3RoZW1hdGljLWJyZWFrLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvaW5kZXguanMKZnVuY3Rpb24gaWdub3JlKCkgewogIHJldHVybiB2b2lkIDA7Cn0KdmFyIGhhbmRsZXJzOwp2YXIgaW5pdF9oYW5kbGVycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvaW5kZXguanMiKCkgewogICAgaW5pdF9ibG9ja3F1b3RlMigpOwogICAgaW5pdF9icmVhazIoKTsKICAgIGluaXRfY29kZTIoKTsKICAgIGluaXRfZGVsZXRlKCk7CiAgICBpbml0X2VtcGhhc2lzMigpOwogICAgaW5pdF9mb290bm90ZV9yZWZlcmVuY2UoKTsKICAgIGluaXRfaGVhZGluZzIoKTsKICAgIGluaXRfaHRtbDgoKTsKICAgIGluaXRfaW1hZ2VfcmVmZXJlbmNlMigpOwogICAgaW5pdF9pbWFnZTIoKTsKICAgIGluaXRfaW5saW5lX2NvZGUyKCk7CiAgICBpbml0X2xpbmtfcmVmZXJlbmNlMigpOwogICAgaW5pdF9saW5rMigpOwogICAgaW5pdF9saXN0X2l0ZW0yKCk7CiAgICBpbml0X2xpc3QzKCk7CiAgICBpbml0X3BhcmFncmFwaDIoKTsKICAgIGluaXRfcm9vdDIoKTsKICAgIGluaXRfc3Ryb25nMigpOwogICAgaW5pdF90YWJsZSgpOwogICAgaW5pdF90YWJsZV9yb3coKTsKICAgIGluaXRfdGFibGVfY2VsbCgpOwogICAgaW5pdF90ZXh0MygpOwogICAgaW5pdF90aGVtYXRpY19icmVhazMoKTsKICAgIGhhbmRsZXJzID0gewogICAgICBibG9ja3F1b3RlOiBibG9ja3F1b3RlMiwKICAgICAgYnJlYWs6IGhhcmRCcmVhazIsCiAgICAgIGNvZGU6IGNvZGUzLAogICAgICBkZWxldGU6IHN0cmlrZXRocm91Z2gsCiAgICAgIGVtcGhhc2lzOiBlbXBoYXNpczIsCiAgICAgIGZvb3Rub3RlUmVmZXJlbmNlOiBmb290bm90ZVJlZmVyZW5jZTIsCiAgICAgIGhlYWRpbmc6IGhlYWRpbmcyLAogICAgICBodG1sOiBodG1sMiwKICAgICAgaW1hZ2VSZWZlcmVuY2U6IGltYWdlUmVmZXJlbmNlMiwKICAgICAgaW1hZ2U6IGltYWdlMiwKICAgICAgaW5saW5lQ29kZTogaW5saW5lQ29kZTIsCiAgICAgIGxpbmtSZWZlcmVuY2U6IGxpbmtSZWZlcmVuY2UyLAogICAgICBsaW5rOiBsaW5rMiwKICAgICAgbGlzdEl0ZW06IGxpc3RJdGVtMiwKICAgICAgbGlzdDogbGlzdDQsCiAgICAgIHBhcmFncmFwaDogcGFyYWdyYXBoMiwKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogcm9vdCBpcyBkaWZmZXJlbnQsIGJ1dCBoYXJkIHRvIHR5cGUuCiAgICAgIHJvb3Q6IHJvb3QzLAogICAgICBzdHJvbmc6IHN0cm9uZzIsCiAgICAgIHRhYmxlLAogICAgICB0YWJsZUNlbGwsCiAgICAgIHRhYmxlUm93LAogICAgICB0ZXh0OiB0ZXh0NiwKICAgICAgdGhlbWF0aWNCcmVhazogdGhlbWF0aWNCcmVhazMsCiAgICAgIHRvbWw6IGlnbm9yZSwKICAgICAgeWFtbDogaWdub3JlLAogICAgICBkZWZpbml0aW9uOiBpZ25vcmUsCiAgICAgIGZvb3Rub3RlRGVmaW5pdGlvbjogaWdub3JlCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9mb290ZXIuanMKZnVuY3Rpb24gZGVmYXVsdEZvb3Rub3RlQmFja0NvbnRlbnQoXzQsIHJlcmVmZXJlbmNlSW5kZXgpIHsKICBjb25zdCByZXN1bHQgPSBbeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiXHUyMUE5IiB9XTsKICBpZiAocmVyZWZlcmVuY2VJbmRleCA+IDEpIHsKICAgIHJlc3VsdC5wdXNoKHsKICAgICAgdHlwZTogImVsZW1lbnQiLAogICAgICB0YWdOYW1lOiAic3VwIiwKICAgICAgcHJvcGVydGllczoge30sCiAgICAgIGNoaWxkcmVuOiBbeyB0eXBlOiAidGV4dCIsIHZhbHVlOiBTdHJpbmcocmVyZWZlcmVuY2VJbmRleCkgfV0KICAgIH0pOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CmZ1bmN0aW9uIGRlZmF1bHRGb290bm90ZUJhY2tMYWJlbChyZWZlcmVuY2VJbmRleCwgcmVyZWZlcmVuY2VJbmRleCkgewogIHJldHVybiAiQmFjayB0byByZWZlcmVuY2UgIiArIChyZWZlcmVuY2VJbmRleCArIDEpICsgKHJlcmVmZXJlbmNlSW5kZXggPiAxID8gIi0iICsgcmVyZWZlcmVuY2VJbmRleCA6ICIiKTsKfQpmdW5jdGlvbiBmb290ZXIoc3RhdGUxMCkgewogIGNvbnN0IGNsb2JiZXJQcmVmaXggPSB0eXBlb2Ygc3RhdGUxMC5vcHRpb25zLmNsb2JiZXJQcmVmaXggPT09ICJzdHJpbmciID8gc3RhdGUxMC5vcHRpb25zLmNsb2JiZXJQcmVmaXggOiAidXNlci1jb250ZW50LSI7CiAgY29uc3QgZm9vdG5vdGVCYWNrQ29udGVudCA9IHN0YXRlMTAub3B0aW9ucy5mb290bm90ZUJhY2tDb250ZW50IHx8IGRlZmF1bHRGb290bm90ZUJhY2tDb250ZW50OwogIGNvbnN0IGZvb3Rub3RlQmFja0xhYmVsID0gc3RhdGUxMC5vcHRpb25zLmZvb3Rub3RlQmFja0xhYmVsIHx8IGRlZmF1bHRGb290bm90ZUJhY2tMYWJlbDsKICBjb25zdCBmb290bm90ZUxhYmVsID0gc3RhdGUxMC5vcHRpb25zLmZvb3Rub3RlTGFiZWwgfHwgIkZvb3Rub3RlcyI7CiAgY29uc3QgZm9vdG5vdGVMYWJlbFRhZ05hbWUgPSBzdGF0ZTEwLm9wdGlvbnMuZm9vdG5vdGVMYWJlbFRhZ05hbWUgfHwgImgyIjsKICBjb25zdCBmb290bm90ZUxhYmVsUHJvcGVydGllcyA9IHN0YXRlMTAub3B0aW9ucy5mb290bm90ZUxhYmVsUHJvcGVydGllcyB8fCB7CiAgICBjbGFzc05hbWU6IFsic3Itb25seSJdCiAgfTsKICBjb25zdCBsaXN0SXRlbXMgPSBbXTsKICBsZXQgcmVmZXJlbmNlSW5kZXggPSAtMTsKICB3aGlsZSAoKytyZWZlcmVuY2VJbmRleCA8IHN0YXRlMTAuZm9vdG5vdGVPcmRlci5sZW5ndGgpIHsKICAgIGNvbnN0IGRlZmluaXRpb24zID0gc3RhdGUxMC5mb290bm90ZUJ5SWQuZ2V0KAogICAgICBzdGF0ZTEwLmZvb3Rub3RlT3JkZXJbcmVmZXJlbmNlSW5kZXhdCiAgICApOwogICAgaWYgKCFkZWZpbml0aW9uMykgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbnN0IGNvbnRlbnQzID0gc3RhdGUxMC5hbGwoZGVmaW5pdGlvbjMpOwogICAgY29uc3QgaWQgPSBTdHJpbmcoZGVmaW5pdGlvbjMuaWRlbnRpZmllcikudG9VcHBlckNhc2UoKTsKICAgIGNvbnN0IHNhZmVJZCA9IG5vcm1hbGl6ZVVyaShpZC50b0xvd2VyQ2FzZSgpKTsKICAgIGxldCByZXJlZmVyZW5jZUluZGV4ID0gMDsKICAgIGNvbnN0IGJhY2tSZWZlcmVuY2VzID0gW107CiAgICBjb25zdCBjb3VudHMgPSBzdGF0ZTEwLmZvb3Rub3RlQ291bnRzLmdldChpZCk7CiAgICB3aGlsZSAoY291bnRzICE9PSB2b2lkIDAgJiYgKytyZXJlZmVyZW5jZUluZGV4IDw9IGNvdW50cykgewogICAgICBpZiAoYmFja1JlZmVyZW5jZXMubGVuZ3RoID4gMCkgewogICAgICAgIGJhY2tSZWZlcmVuY2VzLnB1c2goeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiICIgfSk7CiAgICAgIH0KICAgICAgbGV0IGNoaWxkcmVuMiA9IHR5cGVvZiBmb290bm90ZUJhY2tDb250ZW50ID09PSAic3RyaW5nIiA/IGZvb3Rub3RlQmFja0NvbnRlbnQgOiBmb290bm90ZUJhY2tDb250ZW50KHJlZmVyZW5jZUluZGV4LCByZXJlZmVyZW5jZUluZGV4KTsKICAgICAgaWYgKHR5cGVvZiBjaGlsZHJlbjIgPT09ICJzdHJpbmciKSB7CiAgICAgICAgY2hpbGRyZW4yID0geyB0eXBlOiAidGV4dCIsIHZhbHVlOiBjaGlsZHJlbjIgfTsKICAgICAgfQogICAgICBiYWNrUmVmZXJlbmNlcy5wdXNoKHsKICAgICAgICB0eXBlOiAiZWxlbWVudCIsCiAgICAgICAgdGFnTmFtZTogImEiLAogICAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAgIGhyZWY6ICIjIiArIGNsb2JiZXJQcmVmaXggKyAiZm5yZWYtIiArIHNhZmVJZCArIChyZXJlZmVyZW5jZUluZGV4ID4gMSA/ICItIiArIHJlcmVmZXJlbmNlSW5kZXggOiAiIiksCiAgICAgICAgICBkYXRhRm9vdG5vdGVCYWNrcmVmOiAiIiwKICAgICAgICAgIGFyaWFMYWJlbDogdHlwZW9mIGZvb3Rub3RlQmFja0xhYmVsID09PSAic3RyaW5nIiA/IGZvb3Rub3RlQmFja0xhYmVsIDogZm9vdG5vdGVCYWNrTGFiZWwocmVmZXJlbmNlSW5kZXgsIHJlcmVmZXJlbmNlSW5kZXgpLAogICAgICAgICAgY2xhc3NOYW1lOiBbImRhdGEtZm9vdG5vdGUtYmFja3JlZiJdCiAgICAgICAgfSwKICAgICAgICBjaGlsZHJlbjogQXJyYXkuaXNBcnJheShjaGlsZHJlbjIpID8gY2hpbGRyZW4yIDogW2NoaWxkcmVuMl0KICAgICAgfSk7CiAgICB9CiAgICBjb25zdCB0YWlsID0gY29udGVudDNbY29udGVudDMubGVuZ3RoIC0gMV07CiAgICBpZiAodGFpbCAmJiB0YWlsLnR5cGUgPT09ICJlbGVtZW50IiAmJiB0YWlsLnRhZ05hbWUgPT09ICJwIikgewogICAgICBjb25zdCB0YWlsVGFpbCA9IHRhaWwuY2hpbGRyZW5bdGFpbC5jaGlsZHJlbi5sZW5ndGggLSAxXTsKICAgICAgaWYgKHRhaWxUYWlsICYmIHRhaWxUYWlsLnR5cGUgPT09ICJ0ZXh0IikgewogICAgICAgIHRhaWxUYWlsLnZhbHVlICs9ICIgIjsKICAgICAgfSBlbHNlIHsKICAgICAgICB0YWlsLmNoaWxkcmVuLnB1c2goeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiICIgfSk7CiAgICAgIH0KICAgICAgdGFpbC5jaGlsZHJlbi5wdXNoKC4uLmJhY2tSZWZlcmVuY2VzKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnRlbnQzLnB1c2goLi4uYmFja1JlZmVyZW5jZXMpOwogICAgfQogICAgY29uc3QgbGlzdEl0ZW0zID0gewogICAgICB0eXBlOiAiZWxlbWVudCIsCiAgICAgIHRhZ05hbWU6ICJsaSIsCiAgICAgIHByb3BlcnRpZXM6IHsgaWQ6IGNsb2JiZXJQcmVmaXggKyAiZm4tIiArIHNhZmVJZCB9LAogICAgICBjaGlsZHJlbjogc3RhdGUxMC53cmFwKGNvbnRlbnQzLCB0cnVlKQogICAgfTsKICAgIHN0YXRlMTAucGF0Y2goZGVmaW5pdGlvbjMsIGxpc3RJdGVtMyk7CiAgICBsaXN0SXRlbXMucHVzaChsaXN0SXRlbTMpOwogIH0KICBpZiAobGlzdEl0ZW1zLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuOwogIH0KICByZXR1cm4gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogInNlY3Rpb24iLAogICAgcHJvcGVydGllczogeyBkYXRhRm9vdG5vdGVzOiB0cnVlLCBjbGFzc05hbWU6IFsiZm9vdG5vdGVzIl0gfSwKICAgIGNoaWxkcmVuOiBbCiAgICAgIHsKICAgICAgICB0eXBlOiAiZWxlbWVudCIsCiAgICAgICAgdGFnTmFtZTogZm9vdG5vdGVMYWJlbFRhZ05hbWUsCiAgICAgICAgcHJvcGVydGllczogewogICAgICAgICAgLi4uZXNtX2RlZmF1bHQoZm9vdG5vdGVMYWJlbFByb3BlcnRpZXMpLAogICAgICAgICAgaWQ6ICJmb290bm90ZS1sYWJlbCIKICAgICAgICB9LAogICAgICAgIGNoaWxkcmVuOiBbeyB0eXBlOiAidGV4dCIsIHZhbHVlOiBmb290bm90ZUxhYmVsIH1dCiAgICAgIH0sCiAgICAgIHsgdHlwZTogInRleHQiLCB2YWx1ZTogIlxuIiB9LAogICAgICB7CiAgICAgICAgdHlwZTogImVsZW1lbnQiLAogICAgICAgIHRhZ05hbWU6ICJvbCIsCiAgICAgICAgcHJvcGVydGllczoge30sCiAgICAgICAgY2hpbGRyZW46IHN0YXRlMTAud3JhcChsaXN0SXRlbXMsIHRydWUpCiAgICAgIH0sCiAgICAgIHsgdHlwZTogInRleHQiLCB2YWx1ZTogIlxuIiB9CiAgICBdCiAgfTsKfQp2YXIgaW5pdF9mb290ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2Zvb3Rlci5qcyIoKSB7CiAgICBpbml0X2VzbSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9zYW5pdGl6ZV91cmkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvc3RhdGUuanMKZnVuY3Rpb24gY3JlYXRlU3RhdGUodHJlZSwgb3B0aW9ucykgewogIGNvbnN0IHNldHRpbmdzID0gb3B0aW9ucyB8fCBlbXB0eU9wdGlvbnM1OwogIGNvbnN0IGRlZmluaXRpb25CeUlkID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBjb25zdCBmb290bm90ZUJ5SWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogIGNvbnN0IGZvb3Rub3RlQ291bnRzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBjb25zdCBoYW5kbGVyczIgPSB7IC4uLmhhbmRsZXJzLCAuLi5zZXR0aW5ncy5oYW5kbGVycyB9OwogIGNvbnN0IHN0YXRlMTAgPSB7CiAgICBhbGw6IGFsbDMsCiAgICBhcHBseURhdGEsCiAgICBkZWZpbml0aW9uQnlJZCwKICAgIGZvb3Rub3RlQnlJZCwKICAgIGZvb3Rub3RlQ291bnRzLAogICAgZm9vdG5vdGVPcmRlcjogW10sCiAgICBoYW5kbGVyczogaGFuZGxlcnMyLAogICAgb25lOiBvbmUzLAogICAgb3B0aW9uczogc2V0dGluZ3MsCiAgICBwYXRjaDogcGF0Y2gyLAogICAgd3JhcDogd3JhcDMKICB9OwogIHZpc2l0KHRyZWUsIGZ1bmN0aW9uKG5vZGUyKSB7CiAgICBpZiAobm9kZTIudHlwZSA9PT0gImRlZmluaXRpb24iIHx8IG5vZGUyLnR5cGUgPT09ICJmb290bm90ZURlZmluaXRpb24iKSB7CiAgICAgIGNvbnN0IG1hcDcgPSBub2RlMi50eXBlID09PSAiZGVmaW5pdGlvbiIgPyBkZWZpbml0aW9uQnlJZCA6IGZvb3Rub3RlQnlJZDsKICAgICAgY29uc3QgaWQgPSBTdHJpbmcobm9kZTIuaWRlbnRpZmllcikudG9VcHBlckNhc2UoKTsKICAgICAgaWYgKCFtYXA3LmhhcyhpZCkpIHsKICAgICAgICBtYXA3LnNldChpZCwgbm9kZTIpOwogICAgICB9CiAgICB9CiAgfSk7CiAgcmV0dXJuIHN0YXRlMTA7CiAgZnVuY3Rpb24gb25lMyhub2RlMiwgcGFyZW50KSB7CiAgICBjb25zdCB0eXBlNSA9IG5vZGUyLnR5cGU7CiAgICBjb25zdCBoYW5kbGUzID0gc3RhdGUxMC5oYW5kbGVyc1t0eXBlNV07CiAgICBpZiAob3duOC5jYWxsKHN0YXRlMTAuaGFuZGxlcnMsIHR5cGU1KSAmJiBoYW5kbGUzKSB7CiAgICAgIHJldHVybiBoYW5kbGUzKHN0YXRlMTAsIG5vZGUyLCBwYXJlbnQpOwogICAgfQogICAgaWYgKHN0YXRlMTAub3B0aW9ucy5wYXNzVGhyb3VnaCAmJiBzdGF0ZTEwLm9wdGlvbnMucGFzc1Rocm91Z2guaW5jbHVkZXModHlwZTUpKSB7CiAgICAgIGlmICgiY2hpbGRyZW4iIGluIG5vZGUyKSB7CiAgICAgICAgY29uc3QgeyBjaGlsZHJlbjogY2hpbGRyZW4yLCAuLi5zaGFsbG93IH0gPSBub2RlMjsKICAgICAgICBjb25zdCByZXN1bHQgPSBlc21fZGVmYXVsdChzaGFsbG93KTsKICAgICAgICByZXN1bHQuY2hpbGRyZW4gPSBzdGF0ZTEwLmFsbChub2RlMik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICByZXR1cm4gZXNtX2RlZmF1bHQobm9kZTIpOwogICAgfQogICAgY29uc3QgdW5rbm93bjMgPSBzdGF0ZTEwLm9wdGlvbnMudW5rbm93bkhhbmRsZXIgfHwgZGVmYXVsdFVua25vd25IYW5kbGVyOwogICAgcmV0dXJuIHVua25vd24zKHN0YXRlMTAsIG5vZGUyLCBwYXJlbnQpOwogIH0KICBmdW5jdGlvbiBhbGwzKHBhcmVudCkgewogICAgY29uc3QgdmFsdWVzID0gW107CiAgICBpZiAoImNoaWxkcmVuIiBpbiBwYXJlbnQpIHsKICAgICAgY29uc3Qgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW47CiAgICAgIGxldCBpbmRleDIgPSAtMTsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbm9kZXMubGVuZ3RoKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gc3RhdGUxMC5vbmUobm9kZXNbaW5kZXgyXSwgcGFyZW50KTsKICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICBpZiAoaW5kZXgyICYmIG5vZGVzW2luZGV4MiAtIDFdLnR5cGUgPT09ICJicmVhayIpIHsKICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgcmVzdWx0LnR5cGUgPT09ICJ0ZXh0IikgewogICAgICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHRyaW1NYXJrZG93blNwYWNlU3RhcnQocmVzdWx0LnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiByZXN1bHQudHlwZSA9PT0gImVsZW1lbnQiKSB7CiAgICAgICAgICAgICAgY29uc3QgaGVhZDIgPSByZXN1bHQuY2hpbGRyZW5bMF07CiAgICAgICAgICAgICAgaWYgKGhlYWQyICYmIGhlYWQyLnR5cGUgPT09ICJ0ZXh0IikgewogICAgICAgICAgICAgICAgaGVhZDIudmFsdWUgPSB0cmltTWFya2Rvd25TcGFjZVN0YXJ0KGhlYWQyLnZhbHVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHsKICAgICAgICAgICAgdmFsdWVzLnB1c2goLi4ucmVzdWx0KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHJlc3VsdCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWVzOwogIH0KfQpmdW5jdGlvbiBwYXRjaDIoZnJvbTIsIHRvMikgewogIGlmIChmcm9tMi5wb3NpdGlvbikgdG8yLnBvc2l0aW9uID0gcG9zaXRpb24yKGZyb20yKTsKfQpmdW5jdGlvbiBhcHBseURhdGEoZnJvbTIsIHRvMikgewogIGxldCByZXN1bHQgPSB0bzI7CiAgaWYgKGZyb20yICYmIGZyb20yLmRhdGEpIHsKICAgIGNvbnN0IGhOYW1lID0gZnJvbTIuZGF0YS5oTmFtZTsKICAgIGNvbnN0IGhDaGlsZHJlbiA9IGZyb20yLmRhdGEuaENoaWxkcmVuOwogICAgY29uc3QgaFByb3BlcnRpZXMgPSBmcm9tMi5kYXRhLmhQcm9wZXJ0aWVzOwogICAgaWYgKHR5cGVvZiBoTmFtZSA9PT0gInN0cmluZyIpIHsKICAgICAgaWYgKHJlc3VsdC50eXBlID09PSAiZWxlbWVudCIpIHsKICAgICAgICByZXN1bHQudGFnTmFtZSA9IGhOYW1lOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGNoaWxkcmVuMiA9ICJjaGlsZHJlbiIgaW4gcmVzdWx0ID8gcmVzdWx0LmNoaWxkcmVuIDogW3Jlc3VsdF07CiAgICAgICAgcmVzdWx0ID0geyB0eXBlOiAiZWxlbWVudCIsIHRhZ05hbWU6IGhOYW1lLCBwcm9wZXJ0aWVzOiB7fSwgY2hpbGRyZW46IGNoaWxkcmVuMiB9OwogICAgICB9CiAgICB9CiAgICBpZiAocmVzdWx0LnR5cGUgPT09ICJlbGVtZW50IiAmJiBoUHJvcGVydGllcykgewogICAgICBPYmplY3QuYXNzaWduKHJlc3VsdC5wcm9wZXJ0aWVzLCBlc21fZGVmYXVsdChoUHJvcGVydGllcykpOwogICAgfQogICAgaWYgKCJjaGlsZHJlbiIgaW4gcmVzdWx0ICYmIHJlc3VsdC5jaGlsZHJlbiAmJiBoQ2hpbGRyZW4gIT09IG51bGwgJiYgaENoaWxkcmVuICE9PSB2b2lkIDApIHsKICAgICAgcmVzdWx0LmNoaWxkcmVuID0gaENoaWxkcmVuOwogICAgfQogIH0KICByZXR1cm4gcmVzdWx0Owp9CmZ1bmN0aW9uIGRlZmF1bHRVbmtub3duSGFuZGxlcihzdGF0ZTEwLCBub2RlMikgewogIGNvbnN0IGRhdGEgPSBub2RlMi5kYXRhIHx8IHt9OwogIGNvbnN0IHJlc3VsdCA9ICJ2YWx1ZSIgaW4gbm9kZTIgJiYgIShvd244LmNhbGwoZGF0YSwgImhQcm9wZXJ0aWVzIikgfHwgb3duOC5jYWxsKGRhdGEsICJoQ2hpbGRyZW4iKSkgPyB7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IG5vZGUyLnZhbHVlIH0gOiB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiZGl2IiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlMTAuYWxsKG5vZGUyKQogIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KZnVuY3Rpb24gd3JhcDMobm9kZXMsIGxvb3NlKSB7CiAgY29uc3QgcmVzdWx0ID0gW107CiAgbGV0IGluZGV4MiA9IC0xOwogIGlmIChsb29zZSkgewogICAgcmVzdWx0LnB1c2goeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiXG4iIH0pOwogIH0KICB3aGlsZSAoKytpbmRleDIgPCBub2Rlcy5sZW5ndGgpIHsKICAgIGlmIChpbmRleDIpIHJlc3VsdC5wdXNoKHsgdHlwZTogInRleHQiLCB2YWx1ZTogIlxuIiB9KTsKICAgIHJlc3VsdC5wdXNoKG5vZGVzW2luZGV4Ml0pOwogIH0KICBpZiAobG9vc2UgJiYgbm9kZXMubGVuZ3RoID4gMCkgewogICAgcmVzdWx0LnB1c2goeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiXG4iIH0pOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CmZ1bmN0aW9uIHRyaW1NYXJrZG93blNwYWNlU3RhcnQodmFsdWUyKSB7CiAgbGV0IGluZGV4MiA9IDA7CiAgbGV0IGNvZGU0ID0gdmFsdWUyLmNoYXJDb2RlQXQoaW5kZXgyKTsKICB3aGlsZSAoY29kZTQgPT09IDkgfHwgY29kZTQgPT09IDMyKSB7CiAgICBpbmRleDIrKzsKICAgIGNvZGU0ID0gdmFsdWUyLmNoYXJDb2RlQXQoaW5kZXgyKTsKICB9CiAgcmV0dXJuIHZhbHVlMi5zbGljZShpbmRleDIpOwp9CnZhciBvd244LCBlbXB0eU9wdGlvbnM1Owp2YXIgaW5pdF9zdGF0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvc3RhdGUuanMiKCkgewogICAgaW5pdF9lc20oKTsKICAgIGluaXRfdW5pc3RfdXRpbF92aXNpdCgpOwogICAgaW5pdF91bmlzdF91dGlsX3Bvc2l0aW9uKCk7CiAgICBpbml0X2hhbmRsZXJzKCk7CiAgICBvd244ID0ge30uaGFzT3duUHJvcGVydHk7CiAgICBlbXB0eU9wdGlvbnM1ID0ge307CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2luZGV4LmpzCmZ1bmN0aW9uIHRvSGFzdCh0cmVlLCBvcHRpb25zKSB7CiAgY29uc3Qgc3RhdGUxMCA9IGNyZWF0ZVN0YXRlKHRyZWUsIG9wdGlvbnMpOwogIGNvbnN0IG5vZGUyID0gc3RhdGUxMC5vbmUodHJlZSwgdm9pZCAwKTsKICBjb25zdCBmb290ID0gZm9vdGVyKHN0YXRlMTApOwogIGNvbnN0IHJlc3VsdCA9IEFycmF5LmlzQXJyYXkobm9kZTIpID8geyB0eXBlOiAicm9vdCIsIGNoaWxkcmVuOiBub2RlMiB9IDogbm9kZTIgfHwgeyB0eXBlOiAicm9vdCIsIGNoaWxkcmVuOiBbXSB9OwogIGlmIChmb290KSB7CiAgICBvaygiY2hpbGRyZW4iIGluIHJlc3VsdCk7CiAgICByZXN1bHQuY2hpbGRyZW4ucHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6ICJcbiIgfSwgZm9vdCk7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KdmFyIGluaXRfbGliMjcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfZGVmYXVsdCgpOwogICAgaW5pdF9mb290ZXIoKTsKICAgIGluaXRfc3RhdGUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9pbmRleC5qcwp2YXIgaW5pdF9tZGFzdF91dGlsX3RvX2hhc3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvaW5kZXguanMiKCkgewogICAgaW5pdF9oYW5kbGVycygpOwogICAgaW5pdF9saWIyNygpOwogICAgaW5pdF9mb290ZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2h0bWwtdm9pZC1lbGVtZW50c0AzLjAuMC9ub2RlX21vZHVsZXMvaHRtbC12b2lkLWVsZW1lbnRzL2luZGV4LmpzCnZhciBodG1sVm9pZEVsZW1lbnRzOwp2YXIgaW5pdF9odG1sX3ZvaWRfZWxlbWVudHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9odG1sLXZvaWQtZWxlbWVudHNAMy4wLjAvbm9kZV9tb2R1bGVzL2h0bWwtdm9pZC1lbGVtZW50cy9pbmRleC5qcyIoKSB7CiAgICBodG1sVm9pZEVsZW1lbnRzID0gWwogICAgICAiYXJlYSIsCiAgICAgICJiYXNlIiwKICAgICAgImJhc2Vmb250IiwKICAgICAgImJnc291bmQiLAogICAgICAiYnIiLAogICAgICAiY29sIiwKICAgICAgImNvbW1hbmQiLAogICAgICAiZW1iZWQiLAogICAgICAiZnJhbWUiLAogICAgICAiaHIiLAogICAgICAiaW1hZ2UiLAogICAgICAiaW1nIiwKICAgICAgImlucHV0IiwKICAgICAgImtleWdlbiIsCiAgICAgICJsaW5rIiwKICAgICAgIm1ldGEiLAogICAgICAicGFyYW0iLAogICAgICAic291cmNlIiwKICAgICAgInRyYWNrIiwKICAgICAgIndiciIKICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvc2NoZW1hLmpzCnZhciBTY2hlbWE7CnZhciBpbml0X3NjaGVtYTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvc2NoZW1hLmpzIigpIHsKICAgIFNjaGVtYSA9IGNsYXNzIHsKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7U2NoZW1hVHlwZVsncHJvcGVydHknXX0gcHJvcGVydHkKICAgICAgICogICBQcm9wZXJ0eS4KICAgICAgICogQHBhcmFtIHtTY2hlbWFUeXBlWydub3JtYWwnXX0gbm9ybWFsCiAgICAgICAqICAgTm9ybWFsLgogICAgICAgKiBAcGFyYW0ge1NwYWNlIHwgdW5kZWZpbmVkfSBbc3BhY2VdCiAgICAgICAqICAgU3BhY2UuCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqICAgU2NoZW1hLgogICAgICAgKi8KICAgICAgY29uc3RydWN0b3IocHJvcGVydHk5LCBub3JtYWwsIHNwYWNlMikgewogICAgICAgIHRoaXMubm9ybWFsID0gbm9ybWFsOwogICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTk7CiAgICAgICAgaWYgKHNwYWNlMikgewogICAgICAgICAgdGhpcy5zcGFjZSA9IHNwYWNlMjsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBTY2hlbWEucHJvdG90eXBlLm5vcm1hbCA9IHt9OwogICAgU2NoZW1hLnByb3RvdHlwZS5wcm9wZXJ0eSA9IHt9OwogICAgU2NoZW1hLnByb3RvdHlwZS5zcGFjZSA9IHZvaWQgMDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvdXRpbC9tZXJnZS5qcwpmdW5jdGlvbiBtZXJnZTMoZGVmaW5pdGlvbnMsIHNwYWNlMikgewogIGNvbnN0IHByb3BlcnR5OSA9IHt9OwogIGNvbnN0IG5vcm1hbCA9IHt9OwogIGZvciAoY29uc3QgZGVmaW5pdGlvbjMgb2YgZGVmaW5pdGlvbnMpIHsKICAgIE9iamVjdC5hc3NpZ24ocHJvcGVydHk5LCBkZWZpbml0aW9uMy5wcm9wZXJ0eSk7CiAgICBPYmplY3QuYXNzaWduKG5vcm1hbCwgZGVmaW5pdGlvbjMubm9ybWFsKTsKICB9CiAgcmV0dXJuIG5ldyBTY2hlbWEocHJvcGVydHk5LCBub3JtYWwsIHNwYWNlMik7Cn0KdmFyIGluaXRfbWVyZ2UzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi91dGlsL21lcmdlLmpzIigpIHsKICAgIGluaXRfc2NoZW1hMigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi9ub3JtYWxpemUuanMKZnVuY3Rpb24gbm9ybWFsaXplMyh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyLnRvTG93ZXJDYXNlKCk7Cn0KdmFyIGluaXRfbm9ybWFsaXplID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi9ub3JtYWxpemUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi91dGlsL2luZm8uanMKdmFyIEluZm87CnZhciBpbml0X2luZm8gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvaW5mby5qcyIoKSB7CiAgICBJbmZvID0gY2xhc3MgewogICAgICAvKioKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5CiAgICAgICAqICAgUHJvcGVydHkuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUKICAgICAgICogICBBdHRyaWJ1dGUuCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqICAgSW5mby4KICAgICAgICovCiAgICAgIGNvbnN0cnVjdG9yKHByb3BlcnR5OSwgYXR0cmlidXRlKSB7CiAgICAgICAgdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7CiAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OTsKICAgICAgfQogICAgfTsKICAgIEluZm8ucHJvdG90eXBlLmF0dHJpYnV0ZSA9ICIiOwogICAgSW5mby5wcm90b3R5cGUuYm9vbGVhbmlzaCA9IGZhbHNlOwogICAgSW5mby5wcm90b3R5cGUuYm9vbGVhbiA9IGZhbHNlOwogICAgSW5mby5wcm90b3R5cGUuY29tbWFPclNwYWNlU2VwYXJhdGVkID0gZmFsc2U7CiAgICBJbmZvLnByb3RvdHlwZS5jb21tYVNlcGFyYXRlZCA9IGZhbHNlOwogICAgSW5mby5wcm90b3R5cGUuZGVmaW5lZCA9IGZhbHNlOwogICAgSW5mby5wcm90b3R5cGUubXVzdFVzZVByb3BlcnR5ID0gZmFsc2U7CiAgICBJbmZvLnByb3RvdHlwZS5udW1iZXIgPSBmYWxzZTsKICAgIEluZm8ucHJvdG90eXBlLm92ZXJsb2FkZWRCb29sZWFuID0gZmFsc2U7CiAgICBJbmZvLnByb3RvdHlwZS5wcm9wZXJ0eSA9ICIiOwogICAgSW5mby5wcm90b3R5cGUuc3BhY2VTZXBhcmF0ZWQgPSBmYWxzZTsKICAgIEluZm8ucHJvdG90eXBlLnNwYWNlID0gdm9pZCAwOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi91dGlsL3R5cGVzLmpzCnZhciB0eXBlc19leHBvcnRzID0ge307Cl9fZXhwb3J0KHR5cGVzX2V4cG9ydHMsIHsKICBib29sZWFuOiAoKSA9PiBib29sZWFuLAogIGJvb2xlYW5pc2g6ICgpID0+IGJvb2xlYW5pc2gsCiAgY29tbWFPclNwYWNlU2VwYXJhdGVkOiAoKSA9PiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgY29tbWFTZXBhcmF0ZWQ6ICgpID0+IGNvbW1hU2VwYXJhdGVkLAogIG51bWJlcjogKCkgPT4gbnVtYmVyLAogIG92ZXJsb2FkZWRCb29sZWFuOiAoKSA9PiBvdmVybG9hZGVkQm9vbGVhbiwKICBzcGFjZVNlcGFyYXRlZDogKCkgPT4gc3BhY2VTZXBhcmF0ZWQKfSk7CmZ1bmN0aW9uIGluY3JlbWVudCgpIHsKICByZXR1cm4gMiAqKiArK3Bvd2VyczsKfQp2YXIgcG93ZXJzLCBib29sZWFuLCBib29sZWFuaXNoLCBvdmVybG9hZGVkQm9vbGVhbiwgbnVtYmVyLCBzcGFjZVNlcGFyYXRlZCwgY29tbWFTZXBhcmF0ZWQsIGNvbW1hT3JTcGFjZVNlcGFyYXRlZDsKdmFyIGluaXRfdHlwZXMzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi91dGlsL3R5cGVzLmpzIigpIHsKICAgIHBvd2VycyA9IDA7CiAgICBib29sZWFuID0gaW5jcmVtZW50KCk7CiAgICBib29sZWFuaXNoID0gaW5jcmVtZW50KCk7CiAgICBvdmVybG9hZGVkQm9vbGVhbiA9IGluY3JlbWVudCgpOwogICAgbnVtYmVyID0gaW5jcmVtZW50KCk7CiAgICBzcGFjZVNlcGFyYXRlZCA9IGluY3JlbWVudCgpOwogICAgY29tbWFTZXBhcmF0ZWQgPSBpbmNyZW1lbnQoKTsKICAgIGNvbW1hT3JTcGFjZVNlcGFyYXRlZCA9IGluY3JlbWVudCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi91dGlsL2RlZmluZWQtaW5mby5qcwpmdW5jdGlvbiBtYXJrKHZhbHVlcywga2V5MiwgdmFsdWUyKSB7CiAgaWYgKHZhbHVlMikgewogICAgdmFsdWVzW2tleTJdID0gdmFsdWUyOwogIH0KfQp2YXIgY2hlY2tzLCBEZWZpbmVkSW5mbzsKdmFyIGluaXRfZGVmaW5lZF9pbmZvID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi91dGlsL2RlZmluZWQtaW5mby5qcyIoKSB7CiAgICBpbml0X2luZm8oKTsKICAgIGluaXRfdHlwZXMzKCk7CiAgICBjaGVja3MgPSAvKiogQHR5cGUge1JlYWRvbmx5QXJyYXk8a2V5b2YgdHlwZW9mIHR5cGVzPn0gKi8KICAgIE9iamVjdC5rZXlzKHR5cGVzX2V4cG9ydHMpOwogICAgRGVmaW5lZEluZm8gPSBjbGFzcyBleHRlbmRzIEluZm8gewogICAgICAvKioKICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eQogICAgICAgKiAgIFByb3BlcnR5LgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlCiAgICAgICAqICAgQXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0ge251bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IFttYXNrXQogICAgICAgKiAgIE1hc2suCiAgICAgICAqIEBwYXJhbSB7U3BhY2UgfCB1bmRlZmluZWR9IFtzcGFjZV0KICAgICAgICogICBTcGFjZS4KICAgICAgICogQHJldHVybnMKICAgICAgICogICBJbmZvLgogICAgICAgKi8KICAgICAgY29uc3RydWN0b3IocHJvcGVydHk5LCBhdHRyaWJ1dGUsIG1hc2ssIHNwYWNlMikgewogICAgICAgIGxldCBpbmRleDIgPSAtMTsKICAgICAgICBzdXBlcihwcm9wZXJ0eTksIGF0dHJpYnV0ZSk7CiAgICAgICAgbWFyayh0aGlzLCAic3BhY2UiLCBzcGFjZTIpOwogICAgICAgIGlmICh0eXBlb2YgbWFzayA9PT0gIm51bWJlciIpIHsKICAgICAgICAgIHdoaWxlICgrK2luZGV4MiA8IGNoZWNrcy5sZW5ndGgpIHsKICAgICAgICAgICAgY29uc3QgY2hlY2sgPSBjaGVja3NbaW5kZXgyXTsKICAgICAgICAgICAgbWFyayh0aGlzLCBjaGVja3NbaW5kZXgyXSwgKG1hc2sgJiB0eXBlc19leHBvcnRzW2NoZWNrXSkgPT09IHR5cGVzX2V4cG9ydHNbY2hlY2tdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBEZWZpbmVkSW5mby5wcm90b3R5cGUuZGVmaW5lZCA9IHRydWU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvY3JlYXRlLmpzCmZ1bmN0aW9uIGNyZWF0ZTYoZGVmaW5pdGlvbjMpIHsKICBjb25zdCBwcm9wZXJ0aWVzMiA9IHt9OwogIGNvbnN0IG5vcm1hbHMgPSB7fTsKICBmb3IgKGNvbnN0IFtwcm9wZXJ0eTksIHZhbHVlMl0gb2YgT2JqZWN0LmVudHJpZXMoZGVmaW5pdGlvbjMucHJvcGVydGllcykpIHsKICAgIGNvbnN0IGluZm8gPSBuZXcgRGVmaW5lZEluZm8oCiAgICAgIHByb3BlcnR5OSwKICAgICAgZGVmaW5pdGlvbjMudHJhbnNmb3JtKGRlZmluaXRpb24zLmF0dHJpYnV0ZXMgfHwge30sIHByb3BlcnR5OSksCiAgICAgIHZhbHVlMiwKICAgICAgZGVmaW5pdGlvbjMuc3BhY2UKICAgICk7CiAgICBpZiAoZGVmaW5pdGlvbjMubXVzdFVzZVByb3BlcnR5ICYmIGRlZmluaXRpb24zLm11c3RVc2VQcm9wZXJ0eS5pbmNsdWRlcyhwcm9wZXJ0eTkpKSB7CiAgICAgIGluZm8ubXVzdFVzZVByb3BlcnR5ID0gdHJ1ZTsKICAgIH0KICAgIHByb3BlcnRpZXMyW3Byb3BlcnR5OV0gPSBpbmZvOwogICAgbm9ybWFsc1tub3JtYWxpemUzKHByb3BlcnR5OSldID0gcHJvcGVydHk5OwogICAgbm9ybWFsc1tub3JtYWxpemUzKGluZm8uYXR0cmlidXRlKV0gPSBwcm9wZXJ0eTk7CiAgfQogIHJldHVybiBuZXcgU2NoZW1hKHByb3BlcnRpZXMyLCBub3JtYWxzLCBkZWZpbml0aW9uMy5zcGFjZSk7Cn0KdmFyIGluaXRfY3JlYXRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi91dGlsL2NyZWF0ZS5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZSgpOwogICAgaW5pdF9kZWZpbmVkX2luZm8oKTsKICAgIGluaXRfc2NoZW1hMigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi9hcmlhLmpzCnZhciBhcmlhMjsKdmFyIGluaXRfYXJpYSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvYXJpYS5qcyIoKSB7CiAgICBpbml0X2NyZWF0ZSgpOwogICAgaW5pdF90eXBlczMoKTsKICAgIGFyaWEyID0gY3JlYXRlNih7CiAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICBhcmlhQWN0aXZlRGVzY2VuZGFudDogbnVsbCwKICAgICAgICBhcmlhQXRvbWljOiBib29sZWFuaXNoLAogICAgICAgIGFyaWFBdXRvQ29tcGxldGU6IG51bGwsCiAgICAgICAgYXJpYUJ1c3k6IGJvb2xlYW5pc2gsCiAgICAgICAgYXJpYUNoZWNrZWQ6IGJvb2xlYW5pc2gsCiAgICAgICAgYXJpYUNvbENvdW50OiBudW1iZXIsCiAgICAgICAgYXJpYUNvbEluZGV4OiBudW1iZXIsCiAgICAgICAgYXJpYUNvbFNwYW46IG51bWJlciwKICAgICAgICBhcmlhQ29udHJvbHM6IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIGFyaWFDdXJyZW50OiBudWxsLAogICAgICAgIGFyaWFEZXNjcmliZWRCeTogc3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgYXJpYURldGFpbHM6IG51bGwsCiAgICAgICAgYXJpYURpc2FibGVkOiBib29sZWFuaXNoLAogICAgICAgIGFyaWFEcm9wRWZmZWN0OiBzcGFjZVNlcGFyYXRlZCwKICAgICAgICBhcmlhRXJyb3JNZXNzYWdlOiBudWxsLAogICAgICAgIGFyaWFFeHBhbmRlZDogYm9vbGVhbmlzaCwKICAgICAgICBhcmlhRmxvd1RvOiBzcGFjZVNlcGFyYXRlZCwKICAgICAgICBhcmlhR3JhYmJlZDogYm9vbGVhbmlzaCwKICAgICAgICBhcmlhSGFzUG9wdXA6IG51bGwsCiAgICAgICAgYXJpYUhpZGRlbjogYm9vbGVhbmlzaCwKICAgICAgICBhcmlhSW52YWxpZDogbnVsbCwKICAgICAgICBhcmlhS2V5U2hvcnRjdXRzOiBudWxsLAogICAgICAgIGFyaWFMYWJlbDogbnVsbCwKICAgICAgICBhcmlhTGFiZWxsZWRCeTogc3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgYXJpYUxldmVsOiBudW1iZXIsCiAgICAgICAgYXJpYUxpdmU6IG51bGwsCiAgICAgICAgYXJpYU1vZGFsOiBib29sZWFuaXNoLAogICAgICAgIGFyaWFNdWx0aUxpbmU6IGJvb2xlYW5pc2gsCiAgICAgICAgYXJpYU11bHRpU2VsZWN0YWJsZTogYm9vbGVhbmlzaCwKICAgICAgICBhcmlhT3JpZW50YXRpb246IG51bGwsCiAgICAgICAgYXJpYU93bnM6IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIGFyaWFQbGFjZWhvbGRlcjogbnVsbCwKICAgICAgICBhcmlhUG9zSW5TZXQ6IG51bWJlciwKICAgICAgICBhcmlhUHJlc3NlZDogYm9vbGVhbmlzaCwKICAgICAgICBhcmlhUmVhZE9ubHk6IGJvb2xlYW5pc2gsCiAgICAgICAgYXJpYVJlbGV2YW50OiBudWxsLAogICAgICAgIGFyaWFSZXF1aXJlZDogYm9vbGVhbmlzaCwKICAgICAgICBhcmlhUm9sZURlc2NyaXB0aW9uOiBzcGFjZVNlcGFyYXRlZCwKICAgICAgICBhcmlhUm93Q291bnQ6IG51bWJlciwKICAgICAgICBhcmlhUm93SW5kZXg6IG51bWJlciwKICAgICAgICBhcmlhUm93U3BhbjogbnVtYmVyLAogICAgICAgIGFyaWFTZWxlY3RlZDogYm9vbGVhbmlzaCwKICAgICAgICBhcmlhU2V0U2l6ZTogbnVtYmVyLAogICAgICAgIGFyaWFTb3J0OiBudWxsLAogICAgICAgIGFyaWFWYWx1ZU1heDogbnVtYmVyLAogICAgICAgIGFyaWFWYWx1ZU1pbjogbnVtYmVyLAogICAgICAgIGFyaWFWYWx1ZU5vdzogbnVtYmVyLAogICAgICAgIGFyaWFWYWx1ZVRleHQ6IG51bGwsCiAgICAgICAgcm9sZTogbnVsbAogICAgICB9LAogICAgICB0cmFuc2Zvcm0oXzQsIHByb3BlcnR5OSkgewogICAgICAgIHJldHVybiBwcm9wZXJ0eTkgPT09ICJyb2xlIiA/IHByb3BlcnR5OSA6ICJhcmlhLSIgKyBwcm9wZXJ0eTkuc2xpY2UoNCkudG9Mb3dlckNhc2UoKTsKICAgICAgfQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvY2FzZS1zZW5zaXRpdmUtdHJhbnNmb3JtLmpzCmZ1bmN0aW9uIGNhc2VTZW5zaXRpdmVUcmFuc2Zvcm0oYXR0cmlidXRlcywgYXR0cmlidXRlKSB7CiAgcmV0dXJuIGF0dHJpYnV0ZSBpbiBhdHRyaWJ1dGVzID8gYXR0cmlidXRlc1thdHRyaWJ1dGVdIDogYXR0cmlidXRlOwp9CnZhciBpbml0X2Nhc2Vfc2Vuc2l0aXZlX3RyYW5zZm9ybSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvdXRpbC9jYXNlLXNlbnNpdGl2ZS10cmFuc2Zvcm0uanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi91dGlsL2Nhc2UtaW5zZW5zaXRpdmUtdHJhbnNmb3JtLmpzCmZ1bmN0aW9uIGNhc2VJbnNlbnNpdGl2ZVRyYW5zZm9ybShhdHRyaWJ1dGVzLCBwcm9wZXJ0eTkpIHsKICByZXR1cm4gY2FzZVNlbnNpdGl2ZVRyYW5zZm9ybShhdHRyaWJ1dGVzLCBwcm9wZXJ0eTkudG9Mb3dlckNhc2UoKSk7Cn0KdmFyIGluaXRfY2FzZV9pbnNlbnNpdGl2ZV90cmFuc2Zvcm0gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvY2FzZS1pbnNlbnNpdGl2ZS10cmFuc2Zvcm0uanMiKCkgewogICAgaW5pdF9jYXNlX3NlbnNpdGl2ZV90cmFuc2Zvcm0oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvaHRtbC5qcwp2YXIgaHRtbDM7CnZhciBpbml0X2h0bWw5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi9odG1sLmpzIigpIHsKICAgIGluaXRfY2FzZV9pbnNlbnNpdGl2ZV90cmFuc2Zvcm0oKTsKICAgIGluaXRfY3JlYXRlKCk7CiAgICBpbml0X3R5cGVzMygpOwogICAgaHRtbDMgPSBjcmVhdGU2KHsKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGFjY2VwdGNoYXJzZXQ6ICJhY2NlcHQtY2hhcnNldCIsCiAgICAgICAgY2xhc3NuYW1lOiAiY2xhc3MiLAogICAgICAgIGh0bWxmb3I6ICJmb3IiLAogICAgICAgIGh0dHBlcXVpdjogImh0dHAtZXF1aXYiCiAgICAgIH0sCiAgICAgIG11c3RVc2VQcm9wZXJ0eTogWyJjaGVja2VkIiwgIm11bHRpcGxlIiwgIm11dGVkIiwgInNlbGVjdGVkIl0sCiAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAvLyBTdGFuZGFyZCBQcm9wZXJ0aWVzLgogICAgICAgIGFiYnI6IG51bGwsCiAgICAgICAgYWNjZXB0OiBjb21tYVNlcGFyYXRlZCwKICAgICAgICBhY2NlcHRDaGFyc2V0OiBzcGFjZVNlcGFyYXRlZCwKICAgICAgICBhY2Nlc3NLZXk6IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIGFjdGlvbjogbnVsbCwKICAgICAgICBhbGxvdzogbnVsbCwKICAgICAgICBhbGxvd0Z1bGxTY3JlZW46IGJvb2xlYW4sCiAgICAgICAgYWxsb3dQYXltZW50UmVxdWVzdDogYm9vbGVhbiwKICAgICAgICBhbGxvd1VzZXJNZWRpYTogYm9vbGVhbiwKICAgICAgICBhbHQ6IG51bGwsCiAgICAgICAgYXM6IG51bGwsCiAgICAgICAgYXN5bmM6IGJvb2xlYW4sCiAgICAgICAgYXV0b0NhcGl0YWxpemU6IG51bGwsCiAgICAgICAgYXV0b0NvbXBsZXRlOiBzcGFjZVNlcGFyYXRlZCwKICAgICAgICBhdXRvRm9jdXM6IGJvb2xlYW4sCiAgICAgICAgYXV0b1BsYXk6IGJvb2xlYW4sCiAgICAgICAgYmxvY2tpbmc6IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIGNhcHR1cmU6IG51bGwsCiAgICAgICAgY2hhclNldDogbnVsbCwKICAgICAgICBjaGVja2VkOiBib29sZWFuLAogICAgICAgIGNpdGU6IG51bGwsCiAgICAgICAgY2xhc3NOYW1lOiBzcGFjZVNlcGFyYXRlZCwKICAgICAgICBjb2xzOiBudW1iZXIsCiAgICAgICAgY29sU3BhbjogbnVsbCwKICAgICAgICBjb250ZW50OiBudWxsLAogICAgICAgIGNvbnRlbnRFZGl0YWJsZTogYm9vbGVhbmlzaCwKICAgICAgICBjb250cm9sczogYm9vbGVhbiwKICAgICAgICBjb250cm9sc0xpc3Q6IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIGNvb3JkczogbnVtYmVyIHwgY29tbWFTZXBhcmF0ZWQsCiAgICAgICAgY3Jvc3NPcmlnaW46IG51bGwsCiAgICAgICAgZGF0YTogbnVsbCwKICAgICAgICBkYXRlVGltZTogbnVsbCwKICAgICAgICBkZWNvZGluZzogbnVsbCwKICAgICAgICBkZWZhdWx0OiBib29sZWFuLAogICAgICAgIGRlZmVyOiBib29sZWFuLAogICAgICAgIGRpcjogbnVsbCwKICAgICAgICBkaXJOYW1lOiBudWxsLAogICAgICAgIGRpc2FibGVkOiBib29sZWFuLAogICAgICAgIGRvd25sb2FkOiBvdmVybG9hZGVkQm9vbGVhbiwKICAgICAgICBkcmFnZ2FibGU6IGJvb2xlYW5pc2gsCiAgICAgICAgZW5jVHlwZTogbnVsbCwKICAgICAgICBlbnRlcktleUhpbnQ6IG51bGwsCiAgICAgICAgZmV0Y2hQcmlvcml0eTogbnVsbCwKICAgICAgICBmb3JtOiBudWxsLAogICAgICAgIGZvcm1BY3Rpb246IG51bGwsCiAgICAgICAgZm9ybUVuY1R5cGU6IG51bGwsCiAgICAgICAgZm9ybU1ldGhvZDogbnVsbCwKICAgICAgICBmb3JtTm9WYWxpZGF0ZTogYm9vbGVhbiwKICAgICAgICBmb3JtVGFyZ2V0OiBudWxsLAogICAgICAgIGhlYWRlcnM6IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIGhlaWdodDogbnVtYmVyLAogICAgICAgIGhpZGRlbjogb3ZlcmxvYWRlZEJvb2xlYW4sCiAgICAgICAgaGlnaDogbnVtYmVyLAogICAgICAgIGhyZWY6IG51bGwsCiAgICAgICAgaHJlZkxhbmc6IG51bGwsCiAgICAgICAgaHRtbEZvcjogc3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgaHR0cEVxdWl2OiBzcGFjZVNlcGFyYXRlZCwKICAgICAgICBpZDogbnVsbCwKICAgICAgICBpbWFnZVNpemVzOiBudWxsLAogICAgICAgIGltYWdlU3JjU2V0OiBudWxsLAogICAgICAgIGluZXJ0OiBib29sZWFuLAogICAgICAgIGlucHV0TW9kZTogbnVsbCwKICAgICAgICBpbnRlZ3JpdHk6IG51bGwsCiAgICAgICAgaXM6IG51bGwsCiAgICAgICAgaXNNYXA6IGJvb2xlYW4sCiAgICAgICAgaXRlbUlkOiBudWxsLAogICAgICAgIGl0ZW1Qcm9wOiBzcGFjZVNlcGFyYXRlZCwKICAgICAgICBpdGVtUmVmOiBzcGFjZVNlcGFyYXRlZCwKICAgICAgICBpdGVtU2NvcGU6IGJvb2xlYW4sCiAgICAgICAgaXRlbVR5cGU6IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIGtpbmQ6IG51bGwsCiAgICAgICAgbGFiZWw6IG51bGwsCiAgICAgICAgbGFuZzogbnVsbCwKICAgICAgICBsYW5ndWFnZTogbnVsbCwKICAgICAgICBsaXN0OiBudWxsLAogICAgICAgIGxvYWRpbmc6IG51bGwsCiAgICAgICAgbG9vcDogYm9vbGVhbiwKICAgICAgICBsb3c6IG51bWJlciwKICAgICAgICBtYW5pZmVzdDogbnVsbCwKICAgICAgICBtYXg6IG51bGwsCiAgICAgICAgbWF4TGVuZ3RoOiBudW1iZXIsCiAgICAgICAgbWVkaWE6IG51bGwsCiAgICAgICAgbWV0aG9kOiBudWxsLAogICAgICAgIG1pbjogbnVsbCwKICAgICAgICBtaW5MZW5ndGg6IG51bWJlciwKICAgICAgICBtdWx0aXBsZTogYm9vbGVhbiwKICAgICAgICBtdXRlZDogYm9vbGVhbiwKICAgICAgICBuYW1lOiBudWxsLAogICAgICAgIG5vbmNlOiBudWxsLAogICAgICAgIG5vTW9kdWxlOiBib29sZWFuLAogICAgICAgIG5vVmFsaWRhdGU6IGJvb2xlYW4sCiAgICAgICAgb25BYm9ydDogbnVsbCwKICAgICAgICBvbkFmdGVyUHJpbnQ6IG51bGwsCiAgICAgICAgb25BdXhDbGljazogbnVsbCwKICAgICAgICBvbkJlZm9yZU1hdGNoOiBudWxsLAogICAgICAgIG9uQmVmb3JlUHJpbnQ6IG51bGwsCiAgICAgICAgb25CZWZvcmVUb2dnbGU6IG51bGwsCiAgICAgICAgb25CZWZvcmVVbmxvYWQ6IG51bGwsCiAgICAgICAgb25CbHVyOiBudWxsLAogICAgICAgIG9uQ2FuY2VsOiBudWxsLAogICAgICAgIG9uQ2FuUGxheTogbnVsbCwKICAgICAgICBvbkNhblBsYXlUaHJvdWdoOiBudWxsLAogICAgICAgIG9uQ2hhbmdlOiBudWxsLAogICAgICAgIG9uQ2xpY2s6IG51bGwsCiAgICAgICAgb25DbG9zZTogbnVsbCwKICAgICAgICBvbkNvbnRleHRMb3N0OiBudWxsLAogICAgICAgIG9uQ29udGV4dE1lbnU6IG51bGwsCiAgICAgICAgb25Db250ZXh0UmVzdG9yZWQ6IG51bGwsCiAgICAgICAgb25Db3B5OiBudWxsLAogICAgICAgIG9uQ3VlQ2hhbmdlOiBudWxsLAogICAgICAgIG9uQ3V0OiBudWxsLAogICAgICAgIG9uRGJsQ2xpY2s6IG51bGwsCiAgICAgICAgb25EcmFnOiBudWxsLAogICAgICAgIG9uRHJhZ0VuZDogbnVsbCwKICAgICAgICBvbkRyYWdFbnRlcjogbnVsbCwKICAgICAgICBvbkRyYWdFeGl0OiBudWxsLAogICAgICAgIG9uRHJhZ0xlYXZlOiBudWxsLAogICAgICAgIG9uRHJhZ092ZXI6IG51bGwsCiAgICAgICAgb25EcmFnU3RhcnQ6IG51bGwsCiAgICAgICAgb25Ecm9wOiBudWxsLAogICAgICAgIG9uRHVyYXRpb25DaGFuZ2U6IG51bGwsCiAgICAgICAgb25FbXB0aWVkOiBudWxsLAogICAgICAgIG9uRW5kZWQ6IG51bGwsCiAgICAgICAgb25FcnJvcjogbnVsbCwKICAgICAgICBvbkZvY3VzOiBudWxsLAogICAgICAgIG9uRm9ybURhdGE6IG51bGwsCiAgICAgICAgb25IYXNoQ2hhbmdlOiBudWxsLAogICAgICAgIG9uSW5wdXQ6IG51bGwsCiAgICAgICAgb25JbnZhbGlkOiBudWxsLAogICAgICAgIG9uS2V5RG93bjogbnVsbCwKICAgICAgICBvbktleVByZXNzOiBudWxsLAogICAgICAgIG9uS2V5VXA6IG51bGwsCiAgICAgICAgb25MYW5ndWFnZUNoYW5nZTogbnVsbCwKICAgICAgICBvbkxvYWQ6IG51bGwsCiAgICAgICAgb25Mb2FkZWREYXRhOiBudWxsLAogICAgICAgIG9uTG9hZGVkTWV0YWRhdGE6IG51bGwsCiAgICAgICAgb25Mb2FkRW5kOiBudWxsLAogICAgICAgIG9uTG9hZFN0YXJ0OiBudWxsLAogICAgICAgIG9uTWVzc2FnZTogbnVsbCwKICAgICAgICBvbk1lc3NhZ2VFcnJvcjogbnVsbCwKICAgICAgICBvbk1vdXNlRG93bjogbnVsbCwKICAgICAgICBvbk1vdXNlRW50ZXI6IG51bGwsCiAgICAgICAgb25Nb3VzZUxlYXZlOiBudWxsLAogICAgICAgIG9uTW91c2VNb3ZlOiBudWxsLAogICAgICAgIG9uTW91c2VPdXQ6IG51bGwsCiAgICAgICAgb25Nb3VzZU92ZXI6IG51bGwsCiAgICAgICAgb25Nb3VzZVVwOiBudWxsLAogICAgICAgIG9uT2ZmbGluZTogbnVsbCwKICAgICAgICBvbk9ubGluZTogbnVsbCwKICAgICAgICBvblBhZ2VIaWRlOiBudWxsLAogICAgICAgIG9uUGFnZVNob3c6IG51bGwsCiAgICAgICAgb25QYXN0ZTogbnVsbCwKICAgICAgICBvblBhdXNlOiBudWxsLAogICAgICAgIG9uUGxheTogbnVsbCwKICAgICAgICBvblBsYXlpbmc6IG51bGwsCiAgICAgICAgb25Qb3BTdGF0ZTogbnVsbCwKICAgICAgICBvblByb2dyZXNzOiBudWxsLAogICAgICAgIG9uUmF0ZUNoYW5nZTogbnVsbCwKICAgICAgICBvblJlamVjdGlvbkhhbmRsZWQ6IG51bGwsCiAgICAgICAgb25SZXNldDogbnVsbCwKICAgICAgICBvblJlc2l6ZTogbnVsbCwKICAgICAgICBvblNjcm9sbDogbnVsbCwKICAgICAgICBvblNjcm9sbEVuZDogbnVsbCwKICAgICAgICBvblNlY3VyaXR5UG9saWN5VmlvbGF0aW9uOiBudWxsLAogICAgICAgIG9uU2Vla2VkOiBudWxsLAogICAgICAgIG9uU2Vla2luZzogbnVsbCwKICAgICAgICBvblNlbGVjdDogbnVsbCwKICAgICAgICBvblNsb3RDaGFuZ2U6IG51bGwsCiAgICAgICAgb25TdGFsbGVkOiBudWxsLAogICAgICAgIG9uU3RvcmFnZTogbnVsbCwKICAgICAgICBvblN1Ym1pdDogbnVsbCwKICAgICAgICBvblN1c3BlbmQ6IG51bGwsCiAgICAgICAgb25UaW1lVXBkYXRlOiBudWxsLAogICAgICAgIG9uVG9nZ2xlOiBudWxsLAogICAgICAgIG9uVW5oYW5kbGVkUmVqZWN0aW9uOiBudWxsLAogICAgICAgIG9uVW5sb2FkOiBudWxsLAogICAgICAgIG9uVm9sdW1lQ2hhbmdlOiBudWxsLAogICAgICAgIG9uV2FpdGluZzogbnVsbCwKICAgICAgICBvbldoZWVsOiBudWxsLAogICAgICAgIG9wZW46IGJvb2xlYW4sCiAgICAgICAgb3B0aW11bTogbnVtYmVyLAogICAgICAgIHBhdHRlcm46IG51bGwsCiAgICAgICAgcGluZzogc3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgcGxhY2Vob2xkZXI6IG51bGwsCiAgICAgICAgcGxheXNJbmxpbmU6IGJvb2xlYW4sCiAgICAgICAgcG9wb3ZlcjogbnVsbCwKICAgICAgICBwb3BvdmVyVGFyZ2V0OiBudWxsLAogICAgICAgIHBvcG92ZXJUYXJnZXRBY3Rpb246IG51bGwsCiAgICAgICAgcG9zdGVyOiBudWxsLAogICAgICAgIHByZWxvYWQ6IG51bGwsCiAgICAgICAgcmVhZE9ubHk6IGJvb2xlYW4sCiAgICAgICAgcmVmZXJyZXJQb2xpY3k6IG51bGwsCiAgICAgICAgcmVsOiBzcGFjZVNlcGFyYXRlZCwKICAgICAgICByZXF1aXJlZDogYm9vbGVhbiwKICAgICAgICByZXZlcnNlZDogYm9vbGVhbiwKICAgICAgICByb3dzOiBudW1iZXIsCiAgICAgICAgcm93U3BhbjogbnVtYmVyLAogICAgICAgIHNhbmRib3g6IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIHNjb3BlOiBudWxsLAogICAgICAgIHNjb3BlZDogYm9vbGVhbiwKICAgICAgICBzZWFtbGVzczogYm9vbGVhbiwKICAgICAgICBzZWxlY3RlZDogYm9vbGVhbiwKICAgICAgICBzaGFkb3dSb290Q2xvbmFibGU6IGJvb2xlYW4sCiAgICAgICAgc2hhZG93Um9vdERlbGVnYXRlc0ZvY3VzOiBib29sZWFuLAogICAgICAgIHNoYWRvd1Jvb3RNb2RlOiBudWxsLAogICAgICAgIHNoYXBlOiBudWxsLAogICAgICAgIHNpemU6IG51bWJlciwKICAgICAgICBzaXplczogbnVsbCwKICAgICAgICBzbG90OiBudWxsLAogICAgICAgIHNwYW46IG51bWJlciwKICAgICAgICBzcGVsbENoZWNrOiBib29sZWFuaXNoLAogICAgICAgIHNyYzogbnVsbCwKICAgICAgICBzcmNEb2M6IG51bGwsCiAgICAgICAgc3JjTGFuZzogbnVsbCwKICAgICAgICBzcmNTZXQ6IG51bGwsCiAgICAgICAgc3RhcnQ6IG51bWJlciwKICAgICAgICBzdGVwOiBudWxsLAogICAgICAgIHN0eWxlOiBudWxsLAogICAgICAgIHRhYkluZGV4OiBudW1iZXIsCiAgICAgICAgdGFyZ2V0OiBudWxsLAogICAgICAgIHRpdGxlOiBudWxsLAogICAgICAgIHRyYW5zbGF0ZTogbnVsbCwKICAgICAgICB0eXBlOiBudWxsLAogICAgICAgIHR5cGVNdXN0TWF0Y2g6IGJvb2xlYW4sCiAgICAgICAgdXNlTWFwOiBudWxsLAogICAgICAgIHZhbHVlOiBib29sZWFuaXNoLAogICAgICAgIHdpZHRoOiBudW1iZXIsCiAgICAgICAgd3JhcDogbnVsbCwKICAgICAgICB3cml0aW5nU3VnZ2VzdGlvbnM6IG51bGwsCiAgICAgICAgLy8gTGVnYWN5LgogICAgICAgIC8vIFNlZTogaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jb3RoZXItZWxlbWVudHMsLWF0dHJpYnV0ZXMtYW5kLWFwaXMKICAgICAgICBhbGlnbjogbnVsbCwKICAgICAgICAvLyBTZXZlcmFsLiBVc2UgQ1NTIGB0ZXh0LWFsaWduYCBpbnN0ZWFkLAogICAgICAgIGFMaW5rOiBudWxsLAogICAgICAgIC8vIGA8Ym9keT5gLiBVc2UgQ1NTIGBhOmFjdGl2ZSB7Y29sb3J9YCBpbnN0ZWFkCiAgICAgICAgYXJjaGl2ZTogc3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgLy8gYDxvYmplY3Q+YC4gTGlzdCBvZiBVUklzIHRvIGFyY2hpdmVzCiAgICAgICAgYXhpczogbnVsbCwKICAgICAgICAvLyBgPHRkPmAgYW5kIGA8dGg+YC4gVXNlIGBzY29wZWAgb24gYDx0aD5gCiAgICAgICAgYmFja2dyb3VuZDogbnVsbCwKICAgICAgICAvLyBgPGJvZHk+YC4gVXNlIENTUyBgYmFja2dyb3VuZC1pbWFnZWAgaW5zdGVhZAogICAgICAgIGJnQ29sb3I6IG51bGwsCiAgICAgICAgLy8gYDxib2R5PmAgYW5kIHRhYmxlIGVsZW1lbnRzLiBVc2UgQ1NTIGBiYWNrZ3JvdW5kLWNvbG9yYCBpbnN0ZWFkCiAgICAgICAgYm9yZGVyOiBudW1iZXIsCiAgICAgICAgLy8gYDx0YWJsZT5gLiBVc2UgQ1NTIGBib3JkZXItd2lkdGhgIGluc3RlYWQsCiAgICAgICAgYm9yZGVyQ29sb3I6IG51bGwsCiAgICAgICAgLy8gYDx0YWJsZT5gLiBVc2UgQ1NTIGBib3JkZXItY29sb3JgIGluc3RlYWQsCiAgICAgICAgYm90dG9tTWFyZ2luOiBudW1iZXIsCiAgICAgICAgLy8gYDxib2R5PmAKICAgICAgICBjZWxsUGFkZGluZzogbnVsbCwKICAgICAgICAvLyBgPHRhYmxlPmAKICAgICAgICBjZWxsU3BhY2luZzogbnVsbCwKICAgICAgICAvLyBgPHRhYmxlPmAKICAgICAgICBjaGFyOiBudWxsLAogICAgICAgIC8vIFNldmVyYWwgdGFibGUgZWxlbWVudHMuIFdoZW4gYGFsaWduPWNoYXJgLCBzZXRzIHRoZSBjaGFyYWN0ZXIgdG8gYWxpZ24gb24KICAgICAgICBjaGFyT2ZmOiBudWxsLAogICAgICAgIC8vIFNldmVyYWwgdGFibGUgZWxlbWVudHMuIFdoZW4gYGNoYXJgLCBvZmZzZXRzIHRoZSBhbGlnbm1lbnQKICAgICAgICBjbGFzc0lkOiBudWxsLAogICAgICAgIC8vIGA8b2JqZWN0PmAKICAgICAgICBjbGVhcjogbnVsbCwKICAgICAgICAvLyBgPGJyPmAuIFVzZSBDU1MgYGNsZWFyYCBpbnN0ZWFkCiAgICAgICAgY29kZTogbnVsbCwKICAgICAgICAvLyBgPG9iamVjdD5gCiAgICAgICAgY29kZUJhc2U6IG51bGwsCiAgICAgICAgLy8gYDxvYmplY3Q+YAogICAgICAgIGNvZGVUeXBlOiBudWxsLAogICAgICAgIC8vIGA8b2JqZWN0PmAKICAgICAgICBjb2xvcjogbnVsbCwKICAgICAgICAvLyBgPGZvbnQ+YCBhbmQgYDxocj5gLiBVc2UgQ1NTIGluc3RlYWQKICAgICAgICBjb21wYWN0OiBib29sZWFuLAogICAgICAgIC8vIExpc3RzLiBVc2UgQ1NTIHRvIHJlZHVjZSBzcGFjZSBiZXR3ZWVuIGl0ZW1zIGluc3RlYWQKICAgICAgICBkZWNsYXJlOiBib29sZWFuLAogICAgICAgIC8vIGA8b2JqZWN0PmAKICAgICAgICBldmVudDogbnVsbCwKICAgICAgICAvLyBgPHNjcmlwdD5gCiAgICAgICAgZmFjZTogbnVsbCwKICAgICAgICAvLyBgPGZvbnQ+YC4gVXNlIENTUyBpbnN0ZWFkCiAgICAgICAgZnJhbWU6IG51bGwsCiAgICAgICAgLy8gYDx0YWJsZT5gCiAgICAgICAgZnJhbWVCb3JkZXI6IG51bGwsCiAgICAgICAgLy8gYDxpZnJhbWU+YC4gVXNlIENTUyBgYm9yZGVyYCBpbnN0ZWFkCiAgICAgICAgaFNwYWNlOiBudW1iZXIsCiAgICAgICAgLy8gYDxpbWc+YCBhbmQgYDxvYmplY3Q+YAogICAgICAgIGxlZnRNYXJnaW46IG51bWJlciwKICAgICAgICAvLyBgPGJvZHk+YAogICAgICAgIGxpbms6IG51bGwsCiAgICAgICAgLy8gYDxib2R5PmAuIFVzZSBDU1MgYGE6bGluayB7Y29sb3I6ICp9YCBpbnN0ZWFkCiAgICAgICAgbG9uZ0Rlc2M6IG51bGwsCiAgICAgICAgLy8gYDxmcmFtZT5gLCBgPGlmcmFtZT5gLCBhbmQgYDxpbWc+YC4gVXNlIGFuIGA8YT5gCiAgICAgICAgbG93U3JjOiBudWxsLAogICAgICAgIC8vIGA8aW1nPmAuIFVzZSBhIGA8cGljdHVyZT5gCiAgICAgICAgbWFyZ2luSGVpZ2h0OiBudW1iZXIsCiAgICAgICAgLy8gYDxib2R5PmAKICAgICAgICBtYXJnaW5XaWR0aDogbnVtYmVyLAogICAgICAgIC8vIGA8Ym9keT5gCiAgICAgICAgbm9SZXNpemU6IGJvb2xlYW4sCiAgICAgICAgLy8gYDxmcmFtZT5gCiAgICAgICAgbm9IcmVmOiBib29sZWFuLAogICAgICAgIC8vIGA8YXJlYT5gLiBVc2Ugbm8gaHJlZiBpbnN0ZWFkIG9mIGFuIGV4cGxpY2l0IGBub2hyZWZgCiAgICAgICAgbm9TaGFkZTogYm9vbGVhbiwKICAgICAgICAvLyBgPGhyPmAuIFVzZSBiYWNrZ3JvdW5kLWNvbG9yIGFuZCBoZWlnaHQgaW5zdGVhZCBvZiBib3JkZXJzCiAgICAgICAgbm9XcmFwOiBib29sZWFuLAogICAgICAgIC8vIGA8dGQ+YCBhbmQgYDx0aD5gCiAgICAgICAgb2JqZWN0OiBudWxsLAogICAgICAgIC8vIGA8YXBwbGV0PmAKICAgICAgICBwcm9maWxlOiBudWxsLAogICAgICAgIC8vIGA8aGVhZD5gCiAgICAgICAgcHJvbXB0OiBudWxsLAogICAgICAgIC8vIGA8aXNpbmRleD5gCiAgICAgICAgcmV2OiBudWxsLAogICAgICAgIC8vIGA8bGluaz5gCiAgICAgICAgcmlnaHRNYXJnaW46IG51bWJlciwKICAgICAgICAvLyBgPGJvZHk+YAogICAgICAgIHJ1bGVzOiBudWxsLAogICAgICAgIC8vIGA8dGFibGU+YAogICAgICAgIHNjaGVtZTogbnVsbCwKICAgICAgICAvLyBgPG1ldGE+YAogICAgICAgIHNjcm9sbGluZzogYm9vbGVhbmlzaCwKICAgICAgICAvLyBgPGZyYW1lPmAuIFVzZSBvdmVyZmxvdyBpbiB0aGUgY2hpbGQgY29udGV4dAogICAgICAgIHN0YW5kYnk6IG51bGwsCiAgICAgICAgLy8gYDxvYmplY3Q+YAogICAgICAgIHN1bW1hcnk6IG51bGwsCiAgICAgICAgLy8gYDx0YWJsZT5gCiAgICAgICAgdGV4dDogbnVsbCwKICAgICAgICAvLyBgPGJvZHk+YC4gVXNlIENTUyBgY29sb3JgIGluc3RlYWQKICAgICAgICB0b3BNYXJnaW46IG51bWJlciwKICAgICAgICAvLyBgPGJvZHk+YAogICAgICAgIHZhbHVlVHlwZTogbnVsbCwKICAgICAgICAvLyBgPHBhcmFtPmAKICAgICAgICB2ZXJzaW9uOiBudWxsLAogICAgICAgIC8vIGA8aHRtbD5gLiBVc2UgYSBkb2N0eXBlLgogICAgICAgIHZBbGlnbjogbnVsbCwKICAgICAgICAvLyBTZXZlcmFsLiBVc2UgQ1NTIGB2ZXJ0aWNhbC1hbGlnbmAgaW5zdGVhZAogICAgICAgIHZMaW5rOiBudWxsLAogICAgICAgIC8vIGA8Ym9keT5gLiBVc2UgQ1NTIGBhOnZpc2l0ZWQge2NvbG9yfWAgaW5zdGVhZAogICAgICAgIHZTcGFjZTogbnVtYmVyLAogICAgICAgIC8vIGA8aW1nPmAgYW5kIGA8b2JqZWN0PmAKICAgICAgICAvLyBOb24tc3RhbmRhcmQgUHJvcGVydGllcy4KICAgICAgICBhbGxvd1RyYW5zcGFyZW5jeTogbnVsbCwKICAgICAgICBhdXRvQ29ycmVjdDogbnVsbCwKICAgICAgICBhdXRvU2F2ZTogbnVsbCwKICAgICAgICBkaXNhYmxlUGljdHVyZUluUGljdHVyZTogYm9vbGVhbiwKICAgICAgICBkaXNhYmxlUmVtb3RlUGxheWJhY2s6IGJvb2xlYW4sCiAgICAgICAgcHJlZml4OiBudWxsLAogICAgICAgIHByb3BlcnR5OiBudWxsLAogICAgICAgIHJlc3VsdHM6IG51bWJlciwKICAgICAgICBzZWN1cml0eTogbnVsbCwKICAgICAgICB1bnNlbGVjdGFibGU6IG51bGwKICAgICAgfSwKICAgICAgc3BhY2U6ICJodG1sIiwKICAgICAgdHJhbnNmb3JtOiBjYXNlSW5zZW5zaXRpdmVUcmFuc2Zvcm0KICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi9zdmcuanMKdmFyIHN2ZzsKdmFyIGluaXRfc3ZnID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi9zdmcuanMiKCkgewogICAgaW5pdF9jYXNlX3NlbnNpdGl2ZV90cmFuc2Zvcm0oKTsKICAgIGluaXRfY3JlYXRlKCk7CiAgICBpbml0X3R5cGVzMygpOwogICAgc3ZnID0gY3JlYXRlNih7CiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBhY2NlbnRIZWlnaHQ6ICJhY2NlbnQtaGVpZ2h0IiwKICAgICAgICBhbGlnbm1lbnRCYXNlbGluZTogImFsaWdubWVudC1iYXNlbGluZSIsCiAgICAgICAgYXJhYmljRm9ybTogImFyYWJpYy1mb3JtIiwKICAgICAgICBiYXNlbGluZVNoaWZ0OiAiYmFzZWxpbmUtc2hpZnQiLAogICAgICAgIGNhcEhlaWdodDogImNhcC1oZWlnaHQiLAogICAgICAgIGNsYXNzTmFtZTogImNsYXNzIiwKICAgICAgICBjbGlwUGF0aDogImNsaXAtcGF0aCIsCiAgICAgICAgY2xpcFJ1bGU6ICJjbGlwLXJ1bGUiLAogICAgICAgIGNvbG9ySW50ZXJwb2xhdGlvbjogImNvbG9yLWludGVycG9sYXRpb24iLAogICAgICAgIGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6ICJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMiLAogICAgICAgIGNvbG9yUHJvZmlsZTogImNvbG9yLXByb2ZpbGUiLAogICAgICAgIGNvbG9yUmVuZGVyaW5nOiAiY29sb3ItcmVuZGVyaW5nIiwKICAgICAgICBjcm9zc09yaWdpbjogImNyb3Nzb3JpZ2luIiwKICAgICAgICBkYXRhVHlwZTogImRhdGF0eXBlIiwKICAgICAgICBkb21pbmFudEJhc2VsaW5lOiAiZG9taW5hbnQtYmFzZWxpbmUiLAogICAgICAgIGVuYWJsZUJhY2tncm91bmQ6ICJlbmFibGUtYmFja2dyb3VuZCIsCiAgICAgICAgZmlsbE9wYWNpdHk6ICJmaWxsLW9wYWNpdHkiLAogICAgICAgIGZpbGxSdWxlOiAiZmlsbC1ydWxlIiwKICAgICAgICBmbG9vZENvbG9yOiAiZmxvb2QtY29sb3IiLAogICAgICAgIGZsb29kT3BhY2l0eTogImZsb29kLW9wYWNpdHkiLAogICAgICAgIGZvbnRGYW1pbHk6ICJmb250LWZhbWlseSIsCiAgICAgICAgZm9udFNpemU6ICJmb250LXNpemUiLAogICAgICAgIGZvbnRTaXplQWRqdXN0OiAiZm9udC1zaXplLWFkanVzdCIsCiAgICAgICAgZm9udFN0cmV0Y2g6ICJmb250LXN0cmV0Y2giLAogICAgICAgIGZvbnRTdHlsZTogImZvbnQtc3R5bGUiLAogICAgICAgIGZvbnRWYXJpYW50OiAiZm9udC12YXJpYW50IiwKICAgICAgICBmb250V2VpZ2h0OiAiZm9udC13ZWlnaHQiLAogICAgICAgIGdseXBoTmFtZTogImdseXBoLW5hbWUiLAogICAgICAgIGdseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsOiAiZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCIsCiAgICAgICAgZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsOiAiZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwiLAogICAgICAgIGhyZWZMYW5nOiAiaHJlZmxhbmciLAogICAgICAgIGhvcml6QWR2WDogImhvcml6LWFkdi14IiwKICAgICAgICBob3Jpek9yaWdpblg6ICJob3Jpei1vcmlnaW4teCIsCiAgICAgICAgaG9yaXpPcmlnaW5ZOiAiaG9yaXotb3JpZ2luLXkiLAogICAgICAgIGltYWdlUmVuZGVyaW5nOiAiaW1hZ2UtcmVuZGVyaW5nIiwKICAgICAgICBsZXR0ZXJTcGFjaW5nOiAibGV0dGVyLXNwYWNpbmciLAogICAgICAgIGxpZ2h0aW5nQ29sb3I6ICJsaWdodGluZy1jb2xvciIsCiAgICAgICAgbWFya2VyRW5kOiAibWFya2VyLWVuZCIsCiAgICAgICAgbWFya2VyTWlkOiAibWFya2VyLW1pZCIsCiAgICAgICAgbWFya2VyU3RhcnQ6ICJtYXJrZXItc3RhcnQiLAogICAgICAgIG5hdkRvd246ICJuYXYtZG93biIsCiAgICAgICAgbmF2RG93bkxlZnQ6ICJuYXYtZG93bi1sZWZ0IiwKICAgICAgICBuYXZEb3duUmlnaHQ6ICJuYXYtZG93bi1yaWdodCIsCiAgICAgICAgbmF2TGVmdDogIm5hdi1sZWZ0IiwKICAgICAgICBuYXZOZXh0OiAibmF2LW5leHQiLAogICAgICAgIG5hdlByZXY6ICJuYXYtcHJldiIsCiAgICAgICAgbmF2UmlnaHQ6ICJuYXYtcmlnaHQiLAogICAgICAgIG5hdlVwOiAibmF2LXVwIiwKICAgICAgICBuYXZVcExlZnQ6ICJuYXYtdXAtbGVmdCIsCiAgICAgICAgbmF2VXBSaWdodDogIm5hdi11cC1yaWdodCIsCiAgICAgICAgb25BYm9ydDogIm9uYWJvcnQiLAogICAgICAgIG9uQWN0aXZhdGU6ICJvbmFjdGl2YXRlIiwKICAgICAgICBvbkFmdGVyUHJpbnQ6ICJvbmFmdGVycHJpbnQiLAogICAgICAgIG9uQmVmb3JlUHJpbnQ6ICJvbmJlZm9yZXByaW50IiwKICAgICAgICBvbkJlZ2luOiAib25iZWdpbiIsCiAgICAgICAgb25DYW5jZWw6ICJvbmNhbmNlbCIsCiAgICAgICAgb25DYW5QbGF5OiAib25jYW5wbGF5IiwKICAgICAgICBvbkNhblBsYXlUaHJvdWdoOiAib25jYW5wbGF5dGhyb3VnaCIsCiAgICAgICAgb25DaGFuZ2U6ICJvbmNoYW5nZSIsCiAgICAgICAgb25DbGljazogIm9uY2xpY2siLAogICAgICAgIG9uQ2xvc2U6ICJvbmNsb3NlIiwKICAgICAgICBvbkNvcHk6ICJvbmNvcHkiLAogICAgICAgIG9uQ3VlQ2hhbmdlOiAib25jdWVjaGFuZ2UiLAogICAgICAgIG9uQ3V0OiAib25jdXQiLAogICAgICAgIG9uRGJsQ2xpY2s6ICJvbmRibGNsaWNrIiwKICAgICAgICBvbkRyYWc6ICJvbmRyYWciLAogICAgICAgIG9uRHJhZ0VuZDogIm9uZHJhZ2VuZCIsCiAgICAgICAgb25EcmFnRW50ZXI6ICJvbmRyYWdlbnRlciIsCiAgICAgICAgb25EcmFnRXhpdDogIm9uZHJhZ2V4aXQiLAogICAgICAgIG9uRHJhZ0xlYXZlOiAib25kcmFnbGVhdmUiLAogICAgICAgIG9uRHJhZ092ZXI6ICJvbmRyYWdvdmVyIiwKICAgICAgICBvbkRyYWdTdGFydDogIm9uZHJhZ3N0YXJ0IiwKICAgICAgICBvbkRyb3A6ICJvbmRyb3AiLAogICAgICAgIG9uRHVyYXRpb25DaGFuZ2U6ICJvbmR1cmF0aW9uY2hhbmdlIiwKICAgICAgICBvbkVtcHRpZWQ6ICJvbmVtcHRpZWQiLAogICAgICAgIG9uRW5kOiAib25lbmQiLAogICAgICAgIG9uRW5kZWQ6ICJvbmVuZGVkIiwKICAgICAgICBvbkVycm9yOiAib25lcnJvciIsCiAgICAgICAgb25Gb2N1czogIm9uZm9jdXMiLAogICAgICAgIG9uRm9jdXNJbjogIm9uZm9jdXNpbiIsCiAgICAgICAgb25Gb2N1c091dDogIm9uZm9jdXNvdXQiLAogICAgICAgIG9uSGFzaENoYW5nZTogIm9uaGFzaGNoYW5nZSIsCiAgICAgICAgb25JbnB1dDogIm9uaW5wdXQiLAogICAgICAgIG9uSW52YWxpZDogIm9uaW52YWxpZCIsCiAgICAgICAgb25LZXlEb3duOiAib25rZXlkb3duIiwKICAgICAgICBvbktleVByZXNzOiAib25rZXlwcmVzcyIsCiAgICAgICAgb25LZXlVcDogIm9ua2V5dXAiLAogICAgICAgIG9uTG9hZDogIm9ubG9hZCIsCiAgICAgICAgb25Mb2FkZWREYXRhOiAib25sb2FkZWRkYXRhIiwKICAgICAgICBvbkxvYWRlZE1ldGFkYXRhOiAib25sb2FkZWRtZXRhZGF0YSIsCiAgICAgICAgb25Mb2FkU3RhcnQ6ICJvbmxvYWRzdGFydCIsCiAgICAgICAgb25NZXNzYWdlOiAib25tZXNzYWdlIiwKICAgICAgICBvbk1vdXNlRG93bjogIm9ubW91c2Vkb3duIiwKICAgICAgICBvbk1vdXNlRW50ZXI6ICJvbm1vdXNlZW50ZXIiLAogICAgICAgIG9uTW91c2VMZWF2ZTogIm9ubW91c2VsZWF2ZSIsCiAgICAgICAgb25Nb3VzZU1vdmU6ICJvbm1vdXNlbW92ZSIsCiAgICAgICAgb25Nb3VzZU91dDogIm9ubW91c2VvdXQiLAogICAgICAgIG9uTW91c2VPdmVyOiAib25tb3VzZW92ZXIiLAogICAgICAgIG9uTW91c2VVcDogIm9ubW91c2V1cCIsCiAgICAgICAgb25Nb3VzZVdoZWVsOiAib25tb3VzZXdoZWVsIiwKICAgICAgICBvbk9mZmxpbmU6ICJvbm9mZmxpbmUiLAogICAgICAgIG9uT25saW5lOiAib25vbmxpbmUiLAogICAgICAgIG9uUGFnZUhpZGU6ICJvbnBhZ2VoaWRlIiwKICAgICAgICBvblBhZ2VTaG93OiAib25wYWdlc2hvdyIsCiAgICAgICAgb25QYXN0ZTogIm9ucGFzdGUiLAogICAgICAgIG9uUGF1c2U6ICJvbnBhdXNlIiwKICAgICAgICBvblBsYXk6ICJvbnBsYXkiLAogICAgICAgIG9uUGxheWluZzogIm9ucGxheWluZyIsCiAgICAgICAgb25Qb3BTdGF0ZTogIm9ucG9wc3RhdGUiLAogICAgICAgIG9uUHJvZ3Jlc3M6ICJvbnByb2dyZXNzIiwKICAgICAgICBvblJhdGVDaGFuZ2U6ICJvbnJhdGVjaGFuZ2UiLAogICAgICAgIG9uUmVwZWF0OiAib25yZXBlYXQiLAogICAgICAgIG9uUmVzZXQ6ICJvbnJlc2V0IiwKICAgICAgICBvblJlc2l6ZTogIm9ucmVzaXplIiwKICAgICAgICBvblNjcm9sbDogIm9uc2Nyb2xsIiwKICAgICAgICBvblNlZWtlZDogIm9uc2Vla2VkIiwKICAgICAgICBvblNlZWtpbmc6ICJvbnNlZWtpbmciLAogICAgICAgIG9uU2VsZWN0OiAib25zZWxlY3QiLAogICAgICAgIG9uU2hvdzogIm9uc2hvdyIsCiAgICAgICAgb25TdGFsbGVkOiAib25zdGFsbGVkIiwKICAgICAgICBvblN0b3JhZ2U6ICJvbnN0b3JhZ2UiLAogICAgICAgIG9uU3VibWl0OiAib25zdWJtaXQiLAogICAgICAgIG9uU3VzcGVuZDogIm9uc3VzcGVuZCIsCiAgICAgICAgb25UaW1lVXBkYXRlOiAib250aW1ldXBkYXRlIiwKICAgICAgICBvblRvZ2dsZTogIm9udG9nZ2xlIiwKICAgICAgICBvblVubG9hZDogIm9udW5sb2FkIiwKICAgICAgICBvblZvbHVtZUNoYW5nZTogIm9udm9sdW1lY2hhbmdlIiwKICAgICAgICBvbldhaXRpbmc6ICJvbndhaXRpbmciLAogICAgICAgIG9uWm9vbTogIm9uem9vbSIsCiAgICAgICAgb3ZlcmxpbmVQb3NpdGlvbjogIm92ZXJsaW5lLXBvc2l0aW9uIiwKICAgICAgICBvdmVybGluZVRoaWNrbmVzczogIm92ZXJsaW5lLXRoaWNrbmVzcyIsCiAgICAgICAgcGFpbnRPcmRlcjogInBhaW50LW9yZGVyIiwKICAgICAgICBwYW5vc2UxOiAicGFub3NlLTEiLAogICAgICAgIHBvaW50ZXJFdmVudHM6ICJwb2ludGVyLWV2ZW50cyIsCiAgICAgICAgcmVmZXJyZXJQb2xpY3k6ICJyZWZlcnJlcnBvbGljeSIsCiAgICAgICAgcmVuZGVyaW5nSW50ZW50OiAicmVuZGVyaW5nLWludGVudCIsCiAgICAgICAgc2hhcGVSZW5kZXJpbmc6ICJzaGFwZS1yZW5kZXJpbmciLAogICAgICAgIHN0b3BDb2xvcjogInN0b3AtY29sb3IiLAogICAgICAgIHN0b3BPcGFjaXR5OiAic3RvcC1vcGFjaXR5IiwKICAgICAgICBzdHJpa2V0aHJvdWdoUG9zaXRpb246ICJzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIiwKICAgICAgICBzdHJpa2V0aHJvdWdoVGhpY2tuZXNzOiAic3RyaWtldGhyb3VnaC10aGlja25lc3MiLAogICAgICAgIHN0cm9rZURhc2hBcnJheTogInN0cm9rZS1kYXNoYXJyYXkiLAogICAgICAgIHN0cm9rZURhc2hPZmZzZXQ6ICJzdHJva2UtZGFzaG9mZnNldCIsCiAgICAgICAgc3Ryb2tlTGluZUNhcDogInN0cm9rZS1saW5lY2FwIiwKICAgICAgICBzdHJva2VMaW5lSm9pbjogInN0cm9rZS1saW5lam9pbiIsCiAgICAgICAgc3Ryb2tlTWl0ZXJMaW1pdDogInN0cm9rZS1taXRlcmxpbWl0IiwKICAgICAgICBzdHJva2VPcGFjaXR5OiAic3Ryb2tlLW9wYWNpdHkiLAogICAgICAgIHN0cm9rZVdpZHRoOiAic3Ryb2tlLXdpZHRoIiwKICAgICAgICB0YWJJbmRleDogInRhYmluZGV4IiwKICAgICAgICB0ZXh0QW5jaG9yOiAidGV4dC1hbmNob3IiLAogICAgICAgIHRleHREZWNvcmF0aW9uOiAidGV4dC1kZWNvcmF0aW9uIiwKICAgICAgICB0ZXh0UmVuZGVyaW5nOiAidGV4dC1yZW5kZXJpbmciLAogICAgICAgIHRyYW5zZm9ybU9yaWdpbjogInRyYW5zZm9ybS1vcmlnaW4iLAogICAgICAgIHR5cGVPZjogInR5cGVvZiIsCiAgICAgICAgdW5kZXJsaW5lUG9zaXRpb246ICJ1bmRlcmxpbmUtcG9zaXRpb24iLAogICAgICAgIHVuZGVybGluZVRoaWNrbmVzczogInVuZGVybGluZS10aGlja25lc3MiLAogICAgICAgIHVuaWNvZGVCaWRpOiAidW5pY29kZS1iaWRpIiwKICAgICAgICB1bmljb2RlUmFuZ2U6ICJ1bmljb2RlLXJhbmdlIiwKICAgICAgICB1bml0c1BlckVtOiAidW5pdHMtcGVyLWVtIiwKICAgICAgICB2QWxwaGFiZXRpYzogInYtYWxwaGFiZXRpYyIsCiAgICAgICAgdkhhbmdpbmc6ICJ2LWhhbmdpbmciLAogICAgICAgIHZJZGVvZ3JhcGhpYzogInYtaWRlb2dyYXBoaWMiLAogICAgICAgIHZNYXRoZW1hdGljYWw6ICJ2LW1hdGhlbWF0aWNhbCIsCiAgICAgICAgdmVjdG9yRWZmZWN0OiAidmVjdG9yLWVmZmVjdCIsCiAgICAgICAgdmVydEFkdlk6ICJ2ZXJ0LWFkdi15IiwKICAgICAgICB2ZXJ0T3JpZ2luWDogInZlcnQtb3JpZ2luLXgiLAogICAgICAgIHZlcnRPcmlnaW5ZOiAidmVydC1vcmlnaW4teSIsCiAgICAgICAgd29yZFNwYWNpbmc6ICJ3b3JkLXNwYWNpbmciLAogICAgICAgIHdyaXRpbmdNb2RlOiAid3JpdGluZy1tb2RlIiwKICAgICAgICB4SGVpZ2h0OiAieC1oZWlnaHQiLAogICAgICAgIC8vIFRoZXNlIHdlcmUgY2FtZWxjYXNlZCBpbiBUaW55LiBOb3cgbG93ZXJjYXNlZCBpbiBTVkcgMgogICAgICAgIHBsYXliYWNrT3JkZXI6ICJwbGF5YmFja29yZGVyIiwKICAgICAgICB0aW1lbGluZUJlZ2luOiAidGltZWxpbmViZWdpbiIKICAgICAgfSwKICAgICAgcHJvcGVydGllczogewogICAgICAgIGFib3V0OiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgYWNjZW50SGVpZ2h0OiBudW1iZXIsCiAgICAgICAgYWNjdW11bGF0ZTogbnVsbCwKICAgICAgICBhZGRpdGl2ZTogbnVsbCwKICAgICAgICBhbGlnbm1lbnRCYXNlbGluZTogbnVsbCwKICAgICAgICBhbHBoYWJldGljOiBudW1iZXIsCiAgICAgICAgYW1wbGl0dWRlOiBudW1iZXIsCiAgICAgICAgYXJhYmljRm9ybTogbnVsbCwKICAgICAgICBhc2NlbnQ6IG51bWJlciwKICAgICAgICBhdHRyaWJ1dGVOYW1lOiBudWxsLAogICAgICAgIGF0dHJpYnV0ZVR5cGU6IG51bGwsCiAgICAgICAgYXppbXV0aDogbnVtYmVyLAogICAgICAgIGJhbmR3aWR0aDogbnVsbCwKICAgICAgICBiYXNlbGluZVNoaWZ0OiBudWxsLAogICAgICAgIGJhc2VGcmVxdWVuY3k6IG51bGwsCiAgICAgICAgYmFzZVByb2ZpbGU6IG51bGwsCiAgICAgICAgYmJveDogbnVsbCwKICAgICAgICBiZWdpbjogbnVsbCwKICAgICAgICBiaWFzOiBudW1iZXIsCiAgICAgICAgYnk6IG51bGwsCiAgICAgICAgY2FsY01vZGU6IG51bGwsCiAgICAgICAgY2FwSGVpZ2h0OiBudW1iZXIsCiAgICAgICAgY2xhc3NOYW1lOiBzcGFjZVNlcGFyYXRlZCwKICAgICAgICBjbGlwOiBudWxsLAogICAgICAgIGNsaXBQYXRoOiBudWxsLAogICAgICAgIGNsaXBQYXRoVW5pdHM6IG51bGwsCiAgICAgICAgY2xpcFJ1bGU6IG51bGwsCiAgICAgICAgY29sb3I6IG51bGwsCiAgICAgICAgY29sb3JJbnRlcnBvbGF0aW9uOiBudWxsLAogICAgICAgIGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6IG51bGwsCiAgICAgICAgY29sb3JQcm9maWxlOiBudWxsLAogICAgICAgIGNvbG9yUmVuZGVyaW5nOiBudWxsLAogICAgICAgIGNvbnRlbnQ6IG51bGwsCiAgICAgICAgY29udGVudFNjcmlwdFR5cGU6IG51bGwsCiAgICAgICAgY29udGVudFN0eWxlVHlwZTogbnVsbCwKICAgICAgICBjcm9zc09yaWdpbjogbnVsbCwKICAgICAgICBjdXJzb3I6IG51bGwsCiAgICAgICAgY3g6IG51bGwsCiAgICAgICAgY3k6IG51bGwsCiAgICAgICAgZDogbnVsbCwKICAgICAgICBkYXRhVHlwZTogbnVsbCwKICAgICAgICBkZWZhdWx0QWN0aW9uOiBudWxsLAogICAgICAgIGRlc2NlbnQ6IG51bWJlciwKICAgICAgICBkaWZmdXNlQ29uc3RhbnQ6IG51bWJlciwKICAgICAgICBkaXJlY3Rpb246IG51bGwsCiAgICAgICAgZGlzcGxheTogbnVsbCwKICAgICAgICBkdXI6IG51bGwsCiAgICAgICAgZGl2aXNvcjogbnVtYmVyLAogICAgICAgIGRvbWluYW50QmFzZWxpbmU6IG51bGwsCiAgICAgICAgZG93bmxvYWQ6IGJvb2xlYW4sCiAgICAgICAgZHg6IG51bGwsCiAgICAgICAgZHk6IG51bGwsCiAgICAgICAgZWRnZU1vZGU6IG51bGwsCiAgICAgICAgZWRpdGFibGU6IG51bGwsCiAgICAgICAgZWxldmF0aW9uOiBudW1iZXIsCiAgICAgICAgZW5hYmxlQmFja2dyb3VuZDogbnVsbCwKICAgICAgICBlbmQ6IG51bGwsCiAgICAgICAgZXZlbnQ6IG51bGwsCiAgICAgICAgZXhwb25lbnQ6IG51bWJlciwKICAgICAgICBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkOiBudWxsLAogICAgICAgIGZpbGw6IG51bGwsCiAgICAgICAgZmlsbE9wYWNpdHk6IG51bWJlciwKICAgICAgICBmaWxsUnVsZTogbnVsbCwKICAgICAgICBmaWx0ZXI6IG51bGwsCiAgICAgICAgZmlsdGVyUmVzOiBudWxsLAogICAgICAgIGZpbHRlclVuaXRzOiBudWxsLAogICAgICAgIGZsb29kQ29sb3I6IG51bGwsCiAgICAgICAgZmxvb2RPcGFjaXR5OiBudWxsLAogICAgICAgIGZvY3VzYWJsZTogbnVsbCwKICAgICAgICBmb2N1c0hpZ2hsaWdodDogbnVsbCwKICAgICAgICBmb250RmFtaWx5OiBudWxsLAogICAgICAgIGZvbnRTaXplOiBudWxsLAogICAgICAgIGZvbnRTaXplQWRqdXN0OiBudWxsLAogICAgICAgIGZvbnRTdHJldGNoOiBudWxsLAogICAgICAgIGZvbnRTdHlsZTogbnVsbCwKICAgICAgICBmb250VmFyaWFudDogbnVsbCwKICAgICAgICBmb250V2VpZ2h0OiBudWxsLAogICAgICAgIGZvcm1hdDogbnVsbCwKICAgICAgICBmcjogbnVsbCwKICAgICAgICBmcm9tOiBudWxsLAogICAgICAgIGZ4OiBudWxsLAogICAgICAgIGZ5OiBudWxsLAogICAgICAgIGcxOiBjb21tYVNlcGFyYXRlZCwKICAgICAgICBnMjogY29tbWFTZXBhcmF0ZWQsCiAgICAgICAgZ2x5cGhOYW1lOiBjb21tYVNlcGFyYXRlZCwKICAgICAgICBnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbDogbnVsbCwKICAgICAgICBnbHlwaE9yaWVudGF0aW9uVmVydGljYWw6IG51bGwsCiAgICAgICAgZ2x5cGhSZWY6IG51bGwsCiAgICAgICAgZ3JhZGllbnRUcmFuc2Zvcm06IG51bGwsCiAgICAgICAgZ3JhZGllbnRVbml0czogbnVsbCwKICAgICAgICBoYW5kbGVyOiBudWxsLAogICAgICAgIGhhbmdpbmc6IG51bWJlciwKICAgICAgICBoYXRjaENvbnRlbnRVbml0czogbnVsbCwKICAgICAgICBoYXRjaFVuaXRzOiBudWxsLAogICAgICAgIGhlaWdodDogbnVsbCwKICAgICAgICBocmVmOiBudWxsLAogICAgICAgIGhyZWZMYW5nOiBudWxsLAogICAgICAgIGhvcml6QWR2WDogbnVtYmVyLAogICAgICAgIGhvcml6T3JpZ2luWDogbnVtYmVyLAogICAgICAgIGhvcml6T3JpZ2luWTogbnVtYmVyLAogICAgICAgIGlkOiBudWxsLAogICAgICAgIGlkZW9ncmFwaGljOiBudW1iZXIsCiAgICAgICAgaW1hZ2VSZW5kZXJpbmc6IG51bGwsCiAgICAgICAgaW5pdGlhbFZpc2liaWxpdHk6IG51bGwsCiAgICAgICAgaW46IG51bGwsCiAgICAgICAgaW4yOiBudWxsLAogICAgICAgIGludGVyY2VwdDogbnVtYmVyLAogICAgICAgIGs6IG51bWJlciwKICAgICAgICBrMTogbnVtYmVyLAogICAgICAgIGsyOiBudW1iZXIsCiAgICAgICAgazM6IG51bWJlciwKICAgICAgICBrNDogbnVtYmVyLAogICAgICAgIGtlcm5lbE1hdHJpeDogY29tbWFPclNwYWNlU2VwYXJhdGVkLAogICAgICAgIGtlcm5lbFVuaXRMZW5ndGg6IG51bGwsCiAgICAgICAga2V5UG9pbnRzOiBudWxsLAogICAgICAgIC8vIFNFTUlfQ09MT05fU0VQQVJBVEVECiAgICAgICAga2V5U3BsaW5lczogbnVsbCwKICAgICAgICAvLyBTRU1JX0NPTE9OX1NFUEFSQVRFRAogICAgICAgIGtleVRpbWVzOiBudWxsLAogICAgICAgIC8vIFNFTUlfQ09MT05fU0VQQVJBVEVECiAgICAgICAga2VybmluZzogbnVsbCwKICAgICAgICBsYW5nOiBudWxsLAogICAgICAgIGxlbmd0aEFkanVzdDogbnVsbCwKICAgICAgICBsZXR0ZXJTcGFjaW5nOiBudWxsLAogICAgICAgIGxpZ2h0aW5nQ29sb3I6IG51bGwsCiAgICAgICAgbGltaXRpbmdDb25lQW5nbGU6IG51bWJlciwKICAgICAgICBsb2NhbDogbnVsbCwKICAgICAgICBtYXJrZXJFbmQ6IG51bGwsCiAgICAgICAgbWFya2VyTWlkOiBudWxsLAogICAgICAgIG1hcmtlclN0YXJ0OiBudWxsLAogICAgICAgIG1hcmtlckhlaWdodDogbnVsbCwKICAgICAgICBtYXJrZXJVbml0czogbnVsbCwKICAgICAgICBtYXJrZXJXaWR0aDogbnVsbCwKICAgICAgICBtYXNrOiBudWxsLAogICAgICAgIG1hc2tDb250ZW50VW5pdHM6IG51bGwsCiAgICAgICAgbWFza1VuaXRzOiBudWxsLAogICAgICAgIG1hdGhlbWF0aWNhbDogbnVsbCwKICAgICAgICBtYXg6IG51bGwsCiAgICAgICAgbWVkaWE6IG51bGwsCiAgICAgICAgbWVkaWFDaGFyYWN0ZXJFbmNvZGluZzogbnVsbCwKICAgICAgICBtZWRpYUNvbnRlbnRFbmNvZGluZ3M6IG51bGwsCiAgICAgICAgbWVkaWFTaXplOiBudW1iZXIsCiAgICAgICAgbWVkaWFUaW1lOiBudWxsLAogICAgICAgIG1ldGhvZDogbnVsbCwKICAgICAgICBtaW46IG51bGwsCiAgICAgICAgbW9kZTogbnVsbCwKICAgICAgICBuYW1lOiBudWxsLAogICAgICAgIG5hdkRvd246IG51bGwsCiAgICAgICAgbmF2RG93bkxlZnQ6IG51bGwsCiAgICAgICAgbmF2RG93blJpZ2h0OiBudWxsLAogICAgICAgIG5hdkxlZnQ6IG51bGwsCiAgICAgICAgbmF2TmV4dDogbnVsbCwKICAgICAgICBuYXZQcmV2OiBudWxsLAogICAgICAgIG5hdlJpZ2h0OiBudWxsLAogICAgICAgIG5hdlVwOiBudWxsLAogICAgICAgIG5hdlVwTGVmdDogbnVsbCwKICAgICAgICBuYXZVcFJpZ2h0OiBudWxsLAogICAgICAgIG51bU9jdGF2ZXM6IG51bGwsCiAgICAgICAgb2JzZXJ2ZXI6IG51bGwsCiAgICAgICAgb2Zmc2V0OiBudWxsLAogICAgICAgIG9uQWJvcnQ6IG51bGwsCiAgICAgICAgb25BY3RpdmF0ZTogbnVsbCwKICAgICAgICBvbkFmdGVyUHJpbnQ6IG51bGwsCiAgICAgICAgb25CZWZvcmVQcmludDogbnVsbCwKICAgICAgICBvbkJlZ2luOiBudWxsLAogICAgICAgIG9uQ2FuY2VsOiBudWxsLAogICAgICAgIG9uQ2FuUGxheTogbnVsbCwKICAgICAgICBvbkNhblBsYXlUaHJvdWdoOiBudWxsLAogICAgICAgIG9uQ2hhbmdlOiBudWxsLAogICAgICAgIG9uQ2xpY2s6IG51bGwsCiAgICAgICAgb25DbG9zZTogbnVsbCwKICAgICAgICBvbkNvcHk6IG51bGwsCiAgICAgICAgb25DdWVDaGFuZ2U6IG51bGwsCiAgICAgICAgb25DdXQ6IG51bGwsCiAgICAgICAgb25EYmxDbGljazogbnVsbCwKICAgICAgICBvbkRyYWc6IG51bGwsCiAgICAgICAgb25EcmFnRW5kOiBudWxsLAogICAgICAgIG9uRHJhZ0VudGVyOiBudWxsLAogICAgICAgIG9uRHJhZ0V4aXQ6IG51bGwsCiAgICAgICAgb25EcmFnTGVhdmU6IG51bGwsCiAgICAgICAgb25EcmFnT3ZlcjogbnVsbCwKICAgICAgICBvbkRyYWdTdGFydDogbnVsbCwKICAgICAgICBvbkRyb3A6IG51bGwsCiAgICAgICAgb25EdXJhdGlvbkNoYW5nZTogbnVsbCwKICAgICAgICBvbkVtcHRpZWQ6IG51bGwsCiAgICAgICAgb25FbmQ6IG51bGwsCiAgICAgICAgb25FbmRlZDogbnVsbCwKICAgICAgICBvbkVycm9yOiBudWxsLAogICAgICAgIG9uRm9jdXM6IG51bGwsCiAgICAgICAgb25Gb2N1c0luOiBudWxsLAogICAgICAgIG9uRm9jdXNPdXQ6IG51bGwsCiAgICAgICAgb25IYXNoQ2hhbmdlOiBudWxsLAogICAgICAgIG9uSW5wdXQ6IG51bGwsCiAgICAgICAgb25JbnZhbGlkOiBudWxsLAogICAgICAgIG9uS2V5RG93bjogbnVsbCwKICAgICAgICBvbktleVByZXNzOiBudWxsLAogICAgICAgIG9uS2V5VXA6IG51bGwsCiAgICAgICAgb25Mb2FkOiBudWxsLAogICAgICAgIG9uTG9hZGVkRGF0YTogbnVsbCwKICAgICAgICBvbkxvYWRlZE1ldGFkYXRhOiBudWxsLAogICAgICAgIG9uTG9hZFN0YXJ0OiBudWxsLAogICAgICAgIG9uTWVzc2FnZTogbnVsbCwKICAgICAgICBvbk1vdXNlRG93bjogbnVsbCwKICAgICAgICBvbk1vdXNlRW50ZXI6IG51bGwsCiAgICAgICAgb25Nb3VzZUxlYXZlOiBudWxsLAogICAgICAgIG9uTW91c2VNb3ZlOiBudWxsLAogICAgICAgIG9uTW91c2VPdXQ6IG51bGwsCiAgICAgICAgb25Nb3VzZU92ZXI6IG51bGwsCiAgICAgICAgb25Nb3VzZVVwOiBudWxsLAogICAgICAgIG9uTW91c2VXaGVlbDogbnVsbCwKICAgICAgICBvbk9mZmxpbmU6IG51bGwsCiAgICAgICAgb25PbmxpbmU6IG51bGwsCiAgICAgICAgb25QYWdlSGlkZTogbnVsbCwKICAgICAgICBvblBhZ2VTaG93OiBudWxsLAogICAgICAgIG9uUGFzdGU6IG51bGwsCiAgICAgICAgb25QYXVzZTogbnVsbCwKICAgICAgICBvblBsYXk6IG51bGwsCiAgICAgICAgb25QbGF5aW5nOiBudWxsLAogICAgICAgIG9uUG9wU3RhdGU6IG51bGwsCiAgICAgICAgb25Qcm9ncmVzczogbnVsbCwKICAgICAgICBvblJhdGVDaGFuZ2U6IG51bGwsCiAgICAgICAgb25SZXBlYXQ6IG51bGwsCiAgICAgICAgb25SZXNldDogbnVsbCwKICAgICAgICBvblJlc2l6ZTogbnVsbCwKICAgICAgICBvblNjcm9sbDogbnVsbCwKICAgICAgICBvblNlZWtlZDogbnVsbCwKICAgICAgICBvblNlZWtpbmc6IG51bGwsCiAgICAgICAgb25TZWxlY3Q6IG51bGwsCiAgICAgICAgb25TaG93OiBudWxsLAogICAgICAgIG9uU3RhbGxlZDogbnVsbCwKICAgICAgICBvblN0b3JhZ2U6IG51bGwsCiAgICAgICAgb25TdWJtaXQ6IG51bGwsCiAgICAgICAgb25TdXNwZW5kOiBudWxsLAogICAgICAgIG9uVGltZVVwZGF0ZTogbnVsbCwKICAgICAgICBvblRvZ2dsZTogbnVsbCwKICAgICAgICBvblVubG9hZDogbnVsbCwKICAgICAgICBvblZvbHVtZUNoYW5nZTogbnVsbCwKICAgICAgICBvbldhaXRpbmc6IG51bGwsCiAgICAgICAgb25ab29tOiBudWxsLAogICAgICAgIG9wYWNpdHk6IG51bGwsCiAgICAgICAgb3BlcmF0b3I6IG51bGwsCiAgICAgICAgb3JkZXI6IG51bGwsCiAgICAgICAgb3JpZW50OiBudWxsLAogICAgICAgIG9yaWVudGF0aW9uOiBudWxsLAogICAgICAgIG9yaWdpbjogbnVsbCwKICAgICAgICBvdmVyZmxvdzogbnVsbCwKICAgICAgICBvdmVybGF5OiBudWxsLAogICAgICAgIG92ZXJsaW5lUG9zaXRpb246IG51bWJlciwKICAgICAgICBvdmVybGluZVRoaWNrbmVzczogbnVtYmVyLAogICAgICAgIHBhaW50T3JkZXI6IG51bGwsCiAgICAgICAgcGFub3NlMTogbnVsbCwKICAgICAgICBwYXRoOiBudWxsLAogICAgICAgIHBhdGhMZW5ndGg6IG51bWJlciwKICAgICAgICBwYXR0ZXJuQ29udGVudFVuaXRzOiBudWxsLAogICAgICAgIHBhdHRlcm5UcmFuc2Zvcm06IG51bGwsCiAgICAgICAgcGF0dGVyblVuaXRzOiBudWxsLAogICAgICAgIHBoYXNlOiBudWxsLAogICAgICAgIHBpbmc6IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIHBpdGNoOiBudWxsLAogICAgICAgIHBsYXliYWNrT3JkZXI6IG51bGwsCiAgICAgICAgcG9pbnRlckV2ZW50czogbnVsbCwKICAgICAgICBwb2ludHM6IG51bGwsCiAgICAgICAgcG9pbnRzQXRYOiBudW1iZXIsCiAgICAgICAgcG9pbnRzQXRZOiBudW1iZXIsCiAgICAgICAgcG9pbnRzQXRaOiBudW1iZXIsCiAgICAgICAgcHJlc2VydmVBbHBoYTogbnVsbCwKICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvOiBudWxsLAogICAgICAgIHByaW1pdGl2ZVVuaXRzOiBudWxsLAogICAgICAgIHByb3BhZ2F0ZTogbnVsbCwKICAgICAgICBwcm9wZXJ0eTogY29tbWFPclNwYWNlU2VwYXJhdGVkLAogICAgICAgIHI6IG51bGwsCiAgICAgICAgcmFkaXVzOiBudWxsLAogICAgICAgIHJlZmVycmVyUG9saWN5OiBudWxsLAogICAgICAgIHJlZlg6IG51bGwsCiAgICAgICAgcmVmWTogbnVsbCwKICAgICAgICByZWw6IGNvbW1hT3JTcGFjZVNlcGFyYXRlZCwKICAgICAgICByZXY6IGNvbW1hT3JTcGFjZVNlcGFyYXRlZCwKICAgICAgICByZW5kZXJpbmdJbnRlbnQ6IG51bGwsCiAgICAgICAgcmVwZWF0Q291bnQ6IG51bGwsCiAgICAgICAgcmVwZWF0RHVyOiBudWxsLAogICAgICAgIHJlcXVpcmVkRXh0ZW5zaW9uczogY29tbWFPclNwYWNlU2VwYXJhdGVkLAogICAgICAgIHJlcXVpcmVkRmVhdHVyZXM6IGNvbW1hT3JTcGFjZVNlcGFyYXRlZCwKICAgICAgICByZXF1aXJlZEZvbnRzOiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgcmVxdWlyZWRGb3JtYXRzOiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgcmVzb3VyY2U6IG51bGwsCiAgICAgICAgcmVzdGFydDogbnVsbCwKICAgICAgICByZXN1bHQ6IG51bGwsCiAgICAgICAgcm90YXRlOiBudWxsLAogICAgICAgIHJ4OiBudWxsLAogICAgICAgIHJ5OiBudWxsLAogICAgICAgIHNjYWxlOiBudWxsLAogICAgICAgIHNlZWQ6IG51bGwsCiAgICAgICAgc2hhcGVSZW5kZXJpbmc6IG51bGwsCiAgICAgICAgc2lkZTogbnVsbCwKICAgICAgICBzbG9wZTogbnVsbCwKICAgICAgICBzbmFwc2hvdFRpbWU6IG51bGwsCiAgICAgICAgc3BlY3VsYXJDb25zdGFudDogbnVtYmVyLAogICAgICAgIHNwZWN1bGFyRXhwb25lbnQ6IG51bWJlciwKICAgICAgICBzcHJlYWRNZXRob2Q6IG51bGwsCiAgICAgICAgc3BhY2luZzogbnVsbCwKICAgICAgICBzdGFydE9mZnNldDogbnVsbCwKICAgICAgICBzdGREZXZpYXRpb246IG51bGwsCiAgICAgICAgc3RlbWg6IG51bGwsCiAgICAgICAgc3RlbXY6IG51bGwsCiAgICAgICAgc3RpdGNoVGlsZXM6IG51bGwsCiAgICAgICAgc3RvcENvbG9yOiBudWxsLAogICAgICAgIHN0b3BPcGFjaXR5OiBudWxsLAogICAgICAgIHN0cmlrZXRocm91Z2hQb3NpdGlvbjogbnVtYmVyLAogICAgICAgIHN0cmlrZXRocm91Z2hUaGlja25lc3M6IG51bWJlciwKICAgICAgICBzdHJpbmc6IG51bGwsCiAgICAgICAgc3Ryb2tlOiBudWxsLAogICAgICAgIHN0cm9rZURhc2hBcnJheTogY29tbWFPclNwYWNlU2VwYXJhdGVkLAogICAgICAgIHN0cm9rZURhc2hPZmZzZXQ6IG51bGwsCiAgICAgICAgc3Ryb2tlTGluZUNhcDogbnVsbCwKICAgICAgICBzdHJva2VMaW5lSm9pbjogbnVsbCwKICAgICAgICBzdHJva2VNaXRlckxpbWl0OiBudW1iZXIsCiAgICAgICAgc3Ryb2tlT3BhY2l0eTogbnVtYmVyLAogICAgICAgIHN0cm9rZVdpZHRoOiBudWxsLAogICAgICAgIHN0eWxlOiBudWxsLAogICAgICAgIHN1cmZhY2VTY2FsZTogbnVtYmVyLAogICAgICAgIHN5bmNCZWhhdmlvcjogbnVsbCwKICAgICAgICBzeW5jQmVoYXZpb3JEZWZhdWx0OiBudWxsLAogICAgICAgIHN5bmNNYXN0ZXI6IG51bGwsCiAgICAgICAgc3luY1RvbGVyYW5jZTogbnVsbCwKICAgICAgICBzeW5jVG9sZXJhbmNlRGVmYXVsdDogbnVsbCwKICAgICAgICBzeXN0ZW1MYW5ndWFnZTogY29tbWFPclNwYWNlU2VwYXJhdGVkLAogICAgICAgIHRhYkluZGV4OiBudW1iZXIsCiAgICAgICAgdGFibGVWYWx1ZXM6IG51bGwsCiAgICAgICAgdGFyZ2V0OiBudWxsLAogICAgICAgIHRhcmdldFg6IG51bWJlciwKICAgICAgICB0YXJnZXRZOiBudW1iZXIsCiAgICAgICAgdGV4dEFuY2hvcjogbnVsbCwKICAgICAgICB0ZXh0RGVjb3JhdGlvbjogbnVsbCwKICAgICAgICB0ZXh0UmVuZGVyaW5nOiBudWxsLAogICAgICAgIHRleHRMZW5ndGg6IG51bGwsCiAgICAgICAgdGltZWxpbmVCZWdpbjogbnVsbCwKICAgICAgICB0aXRsZTogbnVsbCwKICAgICAgICB0cmFuc2Zvcm1CZWhhdmlvcjogbnVsbCwKICAgICAgICB0eXBlOiBudWxsLAogICAgICAgIHR5cGVPZjogY29tbWFPclNwYWNlU2VwYXJhdGVkLAogICAgICAgIHRvOiBudWxsLAogICAgICAgIHRyYW5zZm9ybTogbnVsbCwKICAgICAgICB0cmFuc2Zvcm1PcmlnaW46IG51bGwsCiAgICAgICAgdTE6IG51bGwsCiAgICAgICAgdTI6IG51bGwsCiAgICAgICAgdW5kZXJsaW5lUG9zaXRpb246IG51bWJlciwKICAgICAgICB1bmRlcmxpbmVUaGlja25lc3M6IG51bWJlciwKICAgICAgICB1bmljb2RlOiBudWxsLAogICAgICAgIHVuaWNvZGVCaWRpOiBudWxsLAogICAgICAgIHVuaWNvZGVSYW5nZTogbnVsbCwKICAgICAgICB1bml0c1BlckVtOiBudW1iZXIsCiAgICAgICAgdmFsdWVzOiBudWxsLAogICAgICAgIHZBbHBoYWJldGljOiBudW1iZXIsCiAgICAgICAgdk1hdGhlbWF0aWNhbDogbnVtYmVyLAogICAgICAgIHZlY3RvckVmZmVjdDogbnVsbCwKICAgICAgICB2SGFuZ2luZzogbnVtYmVyLAogICAgICAgIHZJZGVvZ3JhcGhpYzogbnVtYmVyLAogICAgICAgIHZlcnNpb246IG51bGwsCiAgICAgICAgdmVydEFkdlk6IG51bWJlciwKICAgICAgICB2ZXJ0T3JpZ2luWDogbnVtYmVyLAogICAgICAgIHZlcnRPcmlnaW5ZOiBudW1iZXIsCiAgICAgICAgdmlld0JveDogbnVsbCwKICAgICAgICB2aWV3VGFyZ2V0OiBudWxsLAogICAgICAgIHZpc2liaWxpdHk6IG51bGwsCiAgICAgICAgd2lkdGg6IG51bGwsCiAgICAgICAgd2lkdGhzOiBudWxsLAogICAgICAgIHdvcmRTcGFjaW5nOiBudWxsLAogICAgICAgIHdyaXRpbmdNb2RlOiBudWxsLAogICAgICAgIHg6IG51bGwsCiAgICAgICAgeDE6IG51bGwsCiAgICAgICAgeDI6IG51bGwsCiAgICAgICAgeENoYW5uZWxTZWxlY3RvcjogbnVsbCwKICAgICAgICB4SGVpZ2h0OiBudW1iZXIsCiAgICAgICAgeTogbnVsbCwKICAgICAgICB5MTogbnVsbCwKICAgICAgICB5MjogbnVsbCwKICAgICAgICB5Q2hhbm5lbFNlbGVjdG9yOiBudWxsLAogICAgICAgIHo6IG51bGwsCiAgICAgICAgem9vbUFuZFBhbjogbnVsbAogICAgICB9LAogICAgICBzcGFjZTogInN2ZyIsCiAgICAgIHRyYW5zZm9ybTogY2FzZVNlbnNpdGl2ZVRyYW5zZm9ybQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3hsaW5rLmpzCnZhciB4bGluazsKdmFyIGluaXRfeGxpbmsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3hsaW5rLmpzIigpIHsKICAgIGluaXRfY3JlYXRlKCk7CiAgICB4bGluayA9IGNyZWF0ZTYoewogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgeExpbmtBY3R1YXRlOiBudWxsLAogICAgICAgIHhMaW5rQXJjUm9sZTogbnVsbCwKICAgICAgICB4TGlua0hyZWY6IG51bGwsCiAgICAgICAgeExpbmtSb2xlOiBudWxsLAogICAgICAgIHhMaW5rU2hvdzogbnVsbCwKICAgICAgICB4TGlua1RpdGxlOiBudWxsLAogICAgICAgIHhMaW5rVHlwZTogbnVsbAogICAgICB9LAogICAgICBzcGFjZTogInhsaW5rIiwKICAgICAgdHJhbnNmb3JtKF80LCBwcm9wZXJ0eTkpIHsKICAgICAgICByZXR1cm4gInhsaW5rOiIgKyBwcm9wZXJ0eTkuc2xpY2UoNSkudG9Mb3dlckNhc2UoKTsKICAgICAgfQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3htbG5zLmpzCnZhciB4bWxuczsKdmFyIGluaXRfeG1sbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3htbG5zLmpzIigpIHsKICAgIGluaXRfY3JlYXRlKCk7CiAgICBpbml0X2Nhc2VfaW5zZW5zaXRpdmVfdHJhbnNmb3JtKCk7CiAgICB4bWxucyA9IGNyZWF0ZTYoewogICAgICBhdHRyaWJ1dGVzOiB7IHhtbG5zeGxpbms6ICJ4bWxuczp4bGluayIgfSwKICAgICAgcHJvcGVydGllczogeyB4bWxuc1hMaW5rOiBudWxsLCB4bWxuczogbnVsbCB9LAogICAgICBzcGFjZTogInhtbG5zIiwKICAgICAgdHJhbnNmb3JtOiBjYXNlSW5zZW5zaXRpdmVUcmFuc2Zvcm0KICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi94bWwuanMKdmFyIHhtbDsKdmFyIGluaXRfeG1sID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi94bWwuanMiKCkgewogICAgaW5pdF9jcmVhdGUoKTsKICAgIHhtbCA9IGNyZWF0ZTYoewogICAgICBwcm9wZXJ0aWVzOiB7IHhtbEJhc2U6IG51bGwsIHhtbExhbmc6IG51bGwsIHhtbFNwYWNlOiBudWxsIH0sCiAgICAgIHNwYWNlOiAieG1sIiwKICAgICAgdHJhbnNmb3JtKF80LCBwcm9wZXJ0eTkpIHsKICAgICAgICByZXR1cm4gInhtbDoiICsgcHJvcGVydHk5LnNsaWNlKDMpLnRvTG93ZXJDYXNlKCk7CiAgICAgIH0KICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi9oYXN0LXRvLXJlYWN0LmpzCnZhciBpbml0X2hhc3RfdG9fcmVhY3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL2hhc3QtdG8tcmVhY3QuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi9maW5kLmpzCmZ1bmN0aW9uIGZpbmQyKHNjaGVtYSwgdmFsdWUyKSB7CiAgY29uc3Qgbm9ybWFsID0gbm9ybWFsaXplMyh2YWx1ZTIpOwogIGxldCBwcm9wZXJ0eTkgPSB2YWx1ZTI7CiAgbGV0IFR5cGUgPSBJbmZvOwogIGlmIChub3JtYWwgaW4gc2NoZW1hLm5vcm1hbCkgewogICAgcmV0dXJuIHNjaGVtYS5wcm9wZXJ0eVtzY2hlbWEubm9ybWFsW25vcm1hbF1dOwogIH0KICBpZiAobm9ybWFsLmxlbmd0aCA+IDQgJiYgbm9ybWFsLnNsaWNlKDAsIDQpID09PSAiZGF0YSIgJiYgdmFsaWQudGVzdCh2YWx1ZTIpKSB7CiAgICBpZiAodmFsdWUyLmNoYXJBdCg0KSA9PT0gIi0iKSB7CiAgICAgIGNvbnN0IHJlc3QgPSB2YWx1ZTIuc2xpY2UoNSkucmVwbGFjZShkYXNoLCBjYW1lbGNhc2UpOwogICAgICBwcm9wZXJ0eTkgPSAiZGF0YSIgKyByZXN0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcmVzdC5zbGljZSgxKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHJlc3QgPSB2YWx1ZTIuc2xpY2UoNCk7CiAgICAgIGlmICghZGFzaC50ZXN0KHJlc3QpKSB7CiAgICAgICAgbGV0IGRhc2hlcyA9IHJlc3QucmVwbGFjZShjYXAsIGtlYmFiKTsKICAgICAgICBpZiAoZGFzaGVzLmNoYXJBdCgwKSAhPT0gIi0iKSB7CiAgICAgICAgICBkYXNoZXMgPSAiLSIgKyBkYXNoZXM7CiAgICAgICAgfQogICAgICAgIHZhbHVlMiA9ICJkYXRhIiArIGRhc2hlczsKICAgICAgfQogICAgfQogICAgVHlwZSA9IERlZmluZWRJbmZvOwogIH0KICByZXR1cm4gbmV3IFR5cGUocHJvcGVydHk5LCB2YWx1ZTIpOwp9CmZ1bmN0aW9uIGtlYmFiKCQwKSB7CiAgcmV0dXJuICItIiArICQwLnRvTG93ZXJDYXNlKCk7Cn0KZnVuY3Rpb24gY2FtZWxjYXNlKCQwKSB7CiAgcmV0dXJuICQwLmNoYXJBdCgxKS50b1VwcGVyQ2FzZSgpOwp9CnZhciBjYXAsIGRhc2gsIHZhbGlkOwp2YXIgaW5pdF9maW5kMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvZmluZC5qcyIoKSB7CiAgICBpbml0X2RlZmluZWRfaW5mbygpOwogICAgaW5pdF9pbmZvKCk7CiAgICBpbml0X25vcm1hbGl6ZSgpOwogICAgY2FwID0gL1tBLVpdL2c7CiAgICBkYXNoID0gLy1bYS16XS9nOwogICAgdmFsaWQgPSAvXmRhdGFbLVx3LjpdKyQvaTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9pbmRleC5qcwp2YXIgaHRtbDQsIHN2ZzI7CnZhciBpbml0X3Byb3BlcnR5X2luZm9ybWF0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2luZGV4LmpzIigpIHsKICAgIGluaXRfbWVyZ2UzKCk7CiAgICBpbml0X2FyaWEoKTsKICAgIGluaXRfaHRtbDkoKTsKICAgIGluaXRfc3ZnKCk7CiAgICBpbml0X3hsaW5rKCk7CiAgICBpbml0X3htbG5zKCk7CiAgICBpbml0X3htbCgpOwogICAgaW5pdF9oYXN0X3RvX3JlYWN0KCk7CiAgICBpbml0X2ZpbmQyKCk7CiAgICBpbml0X25vcm1hbGl6ZSgpOwogICAgaHRtbDQgPSBtZXJnZTMoW2FyaWEyLCBodG1sMywgeGxpbmssIHhtbG5zLCB4bWxdLCAiaHRtbCIpOwogICAgc3ZnMiA9IG1lcmdlMyhbYXJpYTIsIHN2ZywgeGxpbmssIHhtbG5zLCB4bWxdLCAic3ZnIik7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9saWIvY29yZS5qcwpmdW5jdGlvbiBjb3JlKHZhbHVlMiwgb3B0aW9ucykgewogIHZhbHVlMiA9IHZhbHVlMi5yZXBsYWNlKAogICAgb3B0aW9ucy5zdWJzZXQgPyBjaGFyYWN0ZXJzVG9FeHByZXNzaW9uQ2FjaGVkKG9wdGlvbnMuc3Vic2V0KSA6IGRlZmF1bHRTdWJzZXRSZWdleCwKICAgIGJhc2ljCiAgKTsKICBpZiAob3B0aW9ucy5zdWJzZXQgfHwgb3B0aW9ucy5lc2NhcGVPbmx5KSB7CiAgICByZXR1cm4gdmFsdWUyOwogIH0KICByZXR1cm4gdmFsdWUyLnJlcGxhY2Uoc3Vycm9nYXRlUGFpcnNSZWdleCwgc3Vycm9nYXRlKS5yZXBsYWNlKGNvbnRyb2xDaGFyYWN0ZXJzUmVnZXgsIGJhc2ljKTsKICBmdW5jdGlvbiBzdXJyb2dhdGUocGFpciwgaW5kZXgyLCBhbGwzKSB7CiAgICByZXR1cm4gb3B0aW9ucy5mb3JtYXQoCiAgICAgIChwYWlyLmNoYXJDb2RlQXQoMCkgLSA1NTI5NikgKiAxMDI0ICsgcGFpci5jaGFyQ29kZUF0KDEpIC0gNTYzMjAgKyA2NTUzNiwKICAgICAgYWxsMy5jaGFyQ29kZUF0KGluZGV4MiArIDIpLAogICAgICBvcHRpb25zCiAgICApOwogIH0KICBmdW5jdGlvbiBiYXNpYyhjaGFyYWN0ZXIsIGluZGV4MiwgYWxsMykgewogICAgcmV0dXJuIG9wdGlvbnMuZm9ybWF0KAogICAgICBjaGFyYWN0ZXIuY2hhckNvZGVBdCgwKSwKICAgICAgYWxsMy5jaGFyQ29kZUF0KGluZGV4MiArIDEpLAogICAgICBvcHRpb25zCiAgICApOwogIH0KfQpmdW5jdGlvbiBjaGFyYWN0ZXJzVG9FeHByZXNzaW9uQ2FjaGVkKHN1YnNldCkgewogIGxldCBjYWNoZWQgPSBzdWJzZXRUb1JlZ2V4Q2FjaGUuZ2V0KHN1YnNldCk7CiAgaWYgKCFjYWNoZWQpIHsKICAgIGNhY2hlZCA9IGNoYXJhY3RlcnNUb0V4cHJlc3Npb24oc3Vic2V0KTsKICAgIHN1YnNldFRvUmVnZXhDYWNoZS5zZXQoc3Vic2V0LCBjYWNoZWQpOwogIH0KICByZXR1cm4gY2FjaGVkOwp9CmZ1bmN0aW9uIGNoYXJhY3RlcnNUb0V4cHJlc3Npb24oc3Vic2V0KSB7CiAgY29uc3QgZ3JvdXBzID0gW107CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHN1YnNldC5sZW5ndGgpIHsKICAgIGdyb3Vwcy5wdXNoKHN1YnNldFtpbmRleDJdLnJlcGxhY2UocmVnZXhFc2NhcGVSZWdleCwgIlxcJCYiKSk7CiAgfQogIHJldHVybiBuZXcgUmVnRXhwKCIoPzoiICsgZ3JvdXBzLmpvaW4oInwiKSArICIpIiwgImciKTsKfQp2YXIgZGVmYXVsdFN1YnNldFJlZ2V4LCBzdXJyb2dhdGVQYWlyc1JlZ2V4LCBjb250cm9sQ2hhcmFjdGVyc1JlZ2V4LCByZWdleEVzY2FwZVJlZ2V4LCBzdWJzZXRUb1JlZ2V4Q2FjaGU7CnZhciBpbml0X2NvcmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9saWIvY29yZS5qcyIoKSB7CiAgICBkZWZhdWx0U3Vic2V0UmVnZXggPSAvWyImJzw+YF0vZzsKICAgIHN1cnJvZ2F0ZVBhaXJzUmVnZXggPSAvW1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdL2c7CiAgICBjb250cm9sQ2hhcmFjdGVyc1JlZ2V4ID0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXgsIHVuaWNvcm4vbm8taGV4LWVzY2FwZQogICAgL1tceDAxLVx0XHZcZlx4MEUtXHgxRlx4N0ZceDgxXHg4RFx4OEZceDkwXHg5RFx4QTAtXHVGRkZGXS9nOwogICAgcmVnZXhFc2NhcGVSZWdleCA9IC9bfFxce30oKVtcXV4kKyo/Ll0vZzsKICAgIHN1YnNldFRvUmVnZXhDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vc3RyaW5naWZ5LWVudGl0aWVzQDQuMC40L25vZGVfbW9kdWxlcy9zdHJpbmdpZnktZW50aXRpZXMvbGliL3V0aWwvdG8taGV4YWRlY2ltYWwuanMKZnVuY3Rpb24gdG9IZXhhZGVjaW1hbChjb2RlNCwgbmV4dDIsIG9taXQpIHsKICBjb25zdCB2YWx1ZTIgPSAiJiN4IiArIGNvZGU0LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOwogIHJldHVybiBvbWl0ICYmIG5leHQyICYmICFoZXhhZGVjaW1hbFJlZ2V4LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0MikpID8gdmFsdWUyIDogdmFsdWUyICsgIjsiOwp9CnZhciBoZXhhZGVjaW1hbFJlZ2V4Owp2YXIgaW5pdF90b19oZXhhZGVjaW1hbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi91dGlsL3RvLWhleGFkZWNpbWFsLmpzIigpIHsKICAgIGhleGFkZWNpbWFsUmVnZXggPSAvW1xkQS1GYS1mXS87CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9saWIvdXRpbC90by1kZWNpbWFsLmpzCmZ1bmN0aW9uIHRvRGVjaW1hbChjb2RlNCwgbmV4dDIsIG9taXQpIHsKICBjb25zdCB2YWx1ZTIgPSAiJiMiICsgU3RyaW5nKGNvZGU0KTsKICByZXR1cm4gb21pdCAmJiBuZXh0MiAmJiAhZGVjaW1hbFJlZ2V4LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0MikpID8gdmFsdWUyIDogdmFsdWUyICsgIjsiOwp9CnZhciBkZWNpbWFsUmVnZXg7CnZhciBpbml0X3RvX2RlY2ltYWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9saWIvdXRpbC90by1kZWNpbWFsLmpzIigpIHsKICAgIGRlY2ltYWxSZWdleCA9IC9cZC87CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9jaGFyYWN0ZXItZW50aXRpZXMtbGVnYWN5QDMuMC4wL25vZGVfbW9kdWxlcy9jaGFyYWN0ZXItZW50aXRpZXMtbGVnYWN5L2luZGV4LmpzCnZhciBjaGFyYWN0ZXJFbnRpdGllc0xlZ2FjeTsKdmFyIGluaXRfY2hhcmFjdGVyX2VudGl0aWVzX2xlZ2FjeSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJhY3Rlci1lbnRpdGllcy1sZWdhY3lAMy4wLjAvbm9kZV9tb2R1bGVzL2NoYXJhY3Rlci1lbnRpdGllcy1sZWdhY3kvaW5kZXguanMiKCkgewogICAgY2hhcmFjdGVyRW50aXRpZXNMZWdhY3kgPSBbCiAgICAgICJBRWxpZyIsCiAgICAgICJBTVAiLAogICAgICAiQWFjdXRlIiwKICAgICAgIkFjaXJjIiwKICAgICAgIkFncmF2ZSIsCiAgICAgICJBcmluZyIsCiAgICAgICJBdGlsZGUiLAogICAgICAiQXVtbCIsCiAgICAgICJDT1BZIiwKICAgICAgIkNjZWRpbCIsCiAgICAgICJFVEgiLAogICAgICAiRWFjdXRlIiwKICAgICAgIkVjaXJjIiwKICAgICAgIkVncmF2ZSIsCiAgICAgICJFdW1sIiwKICAgICAgIkdUIiwKICAgICAgIklhY3V0ZSIsCiAgICAgICJJY2lyYyIsCiAgICAgICJJZ3JhdmUiLAogICAgICAiSXVtbCIsCiAgICAgICJMVCIsCiAgICAgICJOdGlsZGUiLAogICAgICAiT2FjdXRlIiwKICAgICAgIk9jaXJjIiwKICAgICAgIk9ncmF2ZSIsCiAgICAgICJPc2xhc2giLAogICAgICAiT3RpbGRlIiwKICAgICAgIk91bWwiLAogICAgICAiUVVPVCIsCiAgICAgICJSRUciLAogICAgICAiVEhPUk4iLAogICAgICAiVWFjdXRlIiwKICAgICAgIlVjaXJjIiwKICAgICAgIlVncmF2ZSIsCiAgICAgICJVdW1sIiwKICAgICAgIllhY3V0ZSIsCiAgICAgICJhYWN1dGUiLAogICAgICAiYWNpcmMiLAogICAgICAiYWN1dGUiLAogICAgICAiYWVsaWciLAogICAgICAiYWdyYXZlIiwKICAgICAgImFtcCIsCiAgICAgICJhcmluZyIsCiAgICAgICJhdGlsZGUiLAogICAgICAiYXVtbCIsCiAgICAgICJicnZiYXIiLAogICAgICAiY2NlZGlsIiwKICAgICAgImNlZGlsIiwKICAgICAgImNlbnQiLAogICAgICAiY29weSIsCiAgICAgICJjdXJyZW4iLAogICAgICAiZGVnIiwKICAgICAgImRpdmlkZSIsCiAgICAgICJlYWN1dGUiLAogICAgICAiZWNpcmMiLAogICAgICAiZWdyYXZlIiwKICAgICAgImV0aCIsCiAgICAgICJldW1sIiwKICAgICAgImZyYWMxMiIsCiAgICAgICJmcmFjMTQiLAogICAgICAiZnJhYzM0IiwKICAgICAgImd0IiwKICAgICAgImlhY3V0ZSIsCiAgICAgICJpY2lyYyIsCiAgICAgICJpZXhjbCIsCiAgICAgICJpZ3JhdmUiLAogICAgICAiaXF1ZXN0IiwKICAgICAgIml1bWwiLAogICAgICAibGFxdW8iLAogICAgICAibHQiLAogICAgICAibWFjciIsCiAgICAgICJtaWNybyIsCiAgICAgICJtaWRkb3QiLAogICAgICAibmJzcCIsCiAgICAgICJub3QiLAogICAgICAibnRpbGRlIiwKICAgICAgIm9hY3V0ZSIsCiAgICAgICJvY2lyYyIsCiAgICAgICJvZ3JhdmUiLAogICAgICAib3JkZiIsCiAgICAgICJvcmRtIiwKICAgICAgIm9zbGFzaCIsCiAgICAgICJvdGlsZGUiLAogICAgICAib3VtbCIsCiAgICAgICJwYXJhIiwKICAgICAgInBsdXNtbiIsCiAgICAgICJwb3VuZCIsCiAgICAgICJxdW90IiwKICAgICAgInJhcXVvIiwKICAgICAgInJlZyIsCiAgICAgICJzZWN0IiwKICAgICAgInNoeSIsCiAgICAgICJzdXAxIiwKICAgICAgInN1cDIiLAogICAgICAic3VwMyIsCiAgICAgICJzemxpZyIsCiAgICAgICJ0aG9ybiIsCiAgICAgICJ0aW1lcyIsCiAgICAgICJ1YWN1dGUiLAogICAgICAidWNpcmMiLAogICAgICAidWdyYXZlIiwKICAgICAgInVtbCIsCiAgICAgICJ1dW1sIiwKICAgICAgInlhY3V0ZSIsCiAgICAgICJ5ZW4iLAogICAgICAieXVtbCIKICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9jaGFyYWN0ZXItZW50aXRpZXMtaHRtbDRAMi4xLjAvbm9kZV9tb2R1bGVzL2NoYXJhY3Rlci1lbnRpdGllcy1odG1sNC9pbmRleC5qcwp2YXIgY2hhcmFjdGVyRW50aXRpZXNIdG1sNDsKdmFyIGluaXRfY2hhcmFjdGVyX2VudGl0aWVzX2h0bWw0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vY2hhcmFjdGVyLWVudGl0aWVzLWh0bWw0QDIuMS4wL25vZGVfbW9kdWxlcy9jaGFyYWN0ZXItZW50aXRpZXMtaHRtbDQvaW5kZXguanMiKCkgewogICAgY2hhcmFjdGVyRW50aXRpZXNIdG1sNCA9IHsKICAgICAgbmJzcDogIlx4QTAiLAogICAgICBpZXhjbDogIlx4QTEiLAogICAgICBjZW50OiAiXHhBMiIsCiAgICAgIHBvdW5kOiAiXHhBMyIsCiAgICAgIGN1cnJlbjogIlx4QTQiLAogICAgICB5ZW46ICJceEE1IiwKICAgICAgYnJ2YmFyOiAiXHhBNiIsCiAgICAgIHNlY3Q6ICJceEE3IiwKICAgICAgdW1sOiAiXHhBOCIsCiAgICAgIGNvcHk6ICJceEE5IiwKICAgICAgb3JkZjogIlx4QUEiLAogICAgICBsYXF1bzogIlx4QUIiLAogICAgICBub3Q6ICJceEFDIiwKICAgICAgc2h5OiAiXHhBRCIsCiAgICAgIHJlZzogIlx4QUUiLAogICAgICBtYWNyOiAiXHhBRiIsCiAgICAgIGRlZzogIlx4QjAiLAogICAgICBwbHVzbW46ICJceEIxIiwKICAgICAgc3VwMjogIlx4QjIiLAogICAgICBzdXAzOiAiXHhCMyIsCiAgICAgIGFjdXRlOiAiXHhCNCIsCiAgICAgIG1pY3JvOiAiXHhCNSIsCiAgICAgIHBhcmE6ICJceEI2IiwKICAgICAgbWlkZG90OiAiXHhCNyIsCiAgICAgIGNlZGlsOiAiXHhCOCIsCiAgICAgIHN1cDE6ICJceEI5IiwKICAgICAgb3JkbTogIlx4QkEiLAogICAgICByYXF1bzogIlx4QkIiLAogICAgICBmcmFjMTQ6ICJceEJDIiwKICAgICAgZnJhYzEyOiAiXHhCRCIsCiAgICAgIGZyYWMzNDogIlx4QkUiLAogICAgICBpcXVlc3Q6ICJceEJGIiwKICAgICAgQWdyYXZlOiAiXHhDMCIsCiAgICAgIEFhY3V0ZTogIlx4QzEiLAogICAgICBBY2lyYzogIlx4QzIiLAogICAgICBBdGlsZGU6ICJceEMzIiwKICAgICAgQXVtbDogIlx4QzQiLAogICAgICBBcmluZzogIlx4QzUiLAogICAgICBBRWxpZzogIlx4QzYiLAogICAgICBDY2VkaWw6ICJceEM3IiwKICAgICAgRWdyYXZlOiAiXHhDOCIsCiAgICAgIEVhY3V0ZTogIlx4QzkiLAogICAgICBFY2lyYzogIlx4Q0EiLAogICAgICBFdW1sOiAiXHhDQiIsCiAgICAgIElncmF2ZTogIlx4Q0MiLAogICAgICBJYWN1dGU6ICJceENEIiwKICAgICAgSWNpcmM6ICJceENFIiwKICAgICAgSXVtbDogIlx4Q0YiLAogICAgICBFVEg6ICJceEQwIiwKICAgICAgTnRpbGRlOiAiXHhEMSIsCiAgICAgIE9ncmF2ZTogIlx4RDIiLAogICAgICBPYWN1dGU6ICJceEQzIiwKICAgICAgT2NpcmM6ICJceEQ0IiwKICAgICAgT3RpbGRlOiAiXHhENSIsCiAgICAgIE91bWw6ICJceEQ2IiwKICAgICAgdGltZXM6ICJceEQ3IiwKICAgICAgT3NsYXNoOiAiXHhEOCIsCiAgICAgIFVncmF2ZTogIlx4RDkiLAogICAgICBVYWN1dGU6ICJceERBIiwKICAgICAgVWNpcmM6ICJceERCIiwKICAgICAgVXVtbDogIlx4REMiLAogICAgICBZYWN1dGU6ICJceEREIiwKICAgICAgVEhPUk46ICJceERFIiwKICAgICAgc3psaWc6ICJceERGIiwKICAgICAgYWdyYXZlOiAiXHhFMCIsCiAgICAgIGFhY3V0ZTogIlx4RTEiLAogICAgICBhY2lyYzogIlx4RTIiLAogICAgICBhdGlsZGU6ICJceEUzIiwKICAgICAgYXVtbDogIlx4RTQiLAogICAgICBhcmluZzogIlx4RTUiLAogICAgICBhZWxpZzogIlx4RTYiLAogICAgICBjY2VkaWw6ICJceEU3IiwKICAgICAgZWdyYXZlOiAiXHhFOCIsCiAgICAgIGVhY3V0ZTogIlx4RTkiLAogICAgICBlY2lyYzogIlx4RUEiLAogICAgICBldW1sOiAiXHhFQiIsCiAgICAgIGlncmF2ZTogIlx4RUMiLAogICAgICBpYWN1dGU6ICJceEVEIiwKICAgICAgaWNpcmM6ICJceEVFIiwKICAgICAgaXVtbDogIlx4RUYiLAogICAgICBldGg6ICJceEYwIiwKICAgICAgbnRpbGRlOiAiXHhGMSIsCiAgICAgIG9ncmF2ZTogIlx4RjIiLAogICAgICBvYWN1dGU6ICJceEYzIiwKICAgICAgb2NpcmM6ICJceEY0IiwKICAgICAgb3RpbGRlOiAiXHhGNSIsCiAgICAgIG91bWw6ICJceEY2IiwKICAgICAgZGl2aWRlOiAiXHhGNyIsCiAgICAgIG9zbGFzaDogIlx4RjgiLAogICAgICB1Z3JhdmU6ICJceEY5IiwKICAgICAgdWFjdXRlOiAiXHhGQSIsCiAgICAgIHVjaXJjOiAiXHhGQiIsCiAgICAgIHV1bWw6ICJceEZDIiwKICAgICAgeWFjdXRlOiAiXHhGRCIsCiAgICAgIHRob3JuOiAiXHhGRSIsCiAgICAgIHl1bWw6ICJceEZGIiwKICAgICAgZm5vZjogIlx1MDE5MiIsCiAgICAgIEFscGhhOiAiXHUwMzkxIiwKICAgICAgQmV0YTogIlx1MDM5MiIsCiAgICAgIEdhbW1hOiAiXHUwMzkzIiwKICAgICAgRGVsdGE6ICJcdTAzOTQiLAogICAgICBFcHNpbG9uOiAiXHUwMzk1IiwKICAgICAgWmV0YTogIlx1MDM5NiIsCiAgICAgIEV0YTogIlx1MDM5NyIsCiAgICAgIFRoZXRhOiAiXHUwMzk4IiwKICAgICAgSW90YTogIlx1MDM5OSIsCiAgICAgIEthcHBhOiAiXHUwMzlBIiwKICAgICAgTGFtYmRhOiAiXHUwMzlCIiwKICAgICAgTXU6ICJcdTAzOUMiLAogICAgICBOdTogIlx1MDM5RCIsCiAgICAgIFhpOiAiXHUwMzlFIiwKICAgICAgT21pY3JvbjogIlx1MDM5RiIsCiAgICAgIFBpOiAiXHUwM0EwIiwKICAgICAgUmhvOiAiXHUwM0ExIiwKICAgICAgU2lnbWE6ICJcdTAzQTMiLAogICAgICBUYXU6ICJcdTAzQTQiLAogICAgICBVcHNpbG9uOiAiXHUwM0E1IiwKICAgICAgUGhpOiAiXHUwM0E2IiwKICAgICAgQ2hpOiAiXHUwM0E3IiwKICAgICAgUHNpOiAiXHUwM0E4IiwKICAgICAgT21lZ2E6ICJcdTAzQTkiLAogICAgICBhbHBoYTogIlx1MDNCMSIsCiAgICAgIGJldGE6ICJcdTAzQjIiLAogICAgICBnYW1tYTogIlx1MDNCMyIsCiAgICAgIGRlbHRhOiAiXHUwM0I0IiwKICAgICAgZXBzaWxvbjogIlx1MDNCNSIsCiAgICAgIHpldGE6ICJcdTAzQjYiLAogICAgICBldGE6ICJcdTAzQjciLAogICAgICB0aGV0YTogIlx1MDNCOCIsCiAgICAgIGlvdGE6ICJcdTAzQjkiLAogICAgICBrYXBwYTogIlx1MDNCQSIsCiAgICAgIGxhbWJkYTogIlx1MDNCQiIsCiAgICAgIG11OiAiXHUwM0JDIiwKICAgICAgbnU6ICJcdTAzQkQiLAogICAgICB4aTogIlx1MDNCRSIsCiAgICAgIG9taWNyb246ICJcdTAzQkYiLAogICAgICBwaTogIlx1MDNDMCIsCiAgICAgIHJobzogIlx1MDNDMSIsCiAgICAgIHNpZ21hZjogIlx1MDNDMiIsCiAgICAgIHNpZ21hOiAiXHUwM0MzIiwKICAgICAgdGF1OiAiXHUwM0M0IiwKICAgICAgdXBzaWxvbjogIlx1MDNDNSIsCiAgICAgIHBoaTogIlx1MDNDNiIsCiAgICAgIGNoaTogIlx1MDNDNyIsCiAgICAgIHBzaTogIlx1MDNDOCIsCiAgICAgIG9tZWdhOiAiXHUwM0M5IiwKICAgICAgdGhldGFzeW06ICJcdTAzRDEiLAogICAgICB1cHNpaDogIlx1MDNEMiIsCiAgICAgIHBpdjogIlx1MDNENiIsCiAgICAgIGJ1bGw6ICJcdTIwMjIiLAogICAgICBoZWxsaXA6ICJcdTIwMjYiLAogICAgICBwcmltZTogIlx1MjAzMiIsCiAgICAgIFByaW1lOiAiXHUyMDMzIiwKICAgICAgb2xpbmU6ICJcdTIwM0UiLAogICAgICBmcmFzbDogIlx1MjA0NCIsCiAgICAgIHdlaWVycDogIlx1MjExOCIsCiAgICAgIGltYWdlOiAiXHUyMTExIiwKICAgICAgcmVhbDogIlx1MjExQyIsCiAgICAgIHRyYWRlOiAiXHUyMTIyIiwKICAgICAgYWxlZnN5bTogIlx1MjEzNSIsCiAgICAgIGxhcnI6ICJcdTIxOTAiLAogICAgICB1YXJyOiAiXHUyMTkxIiwKICAgICAgcmFycjogIlx1MjE5MiIsCiAgICAgIGRhcnI6ICJcdTIxOTMiLAogICAgICBoYXJyOiAiXHUyMTk0IiwKICAgICAgY3JhcnI6ICJcdTIxQjUiLAogICAgICBsQXJyOiAiXHUyMUQwIiwKICAgICAgdUFycjogIlx1MjFEMSIsCiAgICAgIHJBcnI6ICJcdTIxRDIiLAogICAgICBkQXJyOiAiXHUyMUQzIiwKICAgICAgaEFycjogIlx1MjFENCIsCiAgICAgIGZvcmFsbDogIlx1MjIwMCIsCiAgICAgIHBhcnQ6ICJcdTIyMDIiLAogICAgICBleGlzdDogIlx1MjIwMyIsCiAgICAgIGVtcHR5OiAiXHUyMjA1IiwKICAgICAgbmFibGE6ICJcdTIyMDciLAogICAgICBpc2luOiAiXHUyMjA4IiwKICAgICAgbm90aW46ICJcdTIyMDkiLAogICAgICBuaTogIlx1MjIwQiIsCiAgICAgIHByb2Q6ICJcdTIyMEYiLAogICAgICBzdW06ICJcdTIyMTEiLAogICAgICBtaW51czogIlx1MjIxMiIsCiAgICAgIGxvd2FzdDogIlx1MjIxNyIsCiAgICAgIHJhZGljOiAiXHUyMjFBIiwKICAgICAgcHJvcDogIlx1MjIxRCIsCiAgICAgIGluZmluOiAiXHUyMjFFIiwKICAgICAgYW5nOiAiXHUyMjIwIiwKICAgICAgYW5kOiAiXHUyMjI3IiwKICAgICAgb3I6ICJcdTIyMjgiLAogICAgICBjYXA6ICJcdTIyMjkiLAogICAgICBjdXA6ICJcdTIyMkEiLAogICAgICBpbnQ6ICJcdTIyMkIiLAogICAgICB0aGVyZTQ6ICJcdTIyMzQiLAogICAgICBzaW06ICJcdTIyM0MiLAogICAgICBjb25nOiAiXHUyMjQ1IiwKICAgICAgYXN5bXA6ICJcdTIyNDgiLAogICAgICBuZTogIlx1MjI2MCIsCiAgICAgIGVxdWl2OiAiXHUyMjYxIiwKICAgICAgbGU6ICJcdTIyNjQiLAogICAgICBnZTogIlx1MjI2NSIsCiAgICAgIHN1YjogIlx1MjI4MiIsCiAgICAgIHN1cDogIlx1MjI4MyIsCiAgICAgIG5zdWI6ICJcdTIyODQiLAogICAgICBzdWJlOiAiXHUyMjg2IiwKICAgICAgc3VwZTogIlx1MjI4NyIsCiAgICAgIG9wbHVzOiAiXHUyMjk1IiwKICAgICAgb3RpbWVzOiAiXHUyMjk3IiwKICAgICAgcGVycDogIlx1MjJBNSIsCiAgICAgIHNkb3Q6ICJcdTIyQzUiLAogICAgICBsY2VpbDogIlx1MjMwOCIsCiAgICAgIHJjZWlsOiAiXHUyMzA5IiwKICAgICAgbGZsb29yOiAiXHUyMzBBIiwKICAgICAgcmZsb29yOiAiXHUyMzBCIiwKICAgICAgbGFuZzogIlx1MjMyOSIsCiAgICAgIHJhbmc6ICJcdTIzMkEiLAogICAgICBsb3o6ICJcdTI1Q0EiLAogICAgICBzcGFkZXM6ICJcdTI2NjAiLAogICAgICBjbHViczogIlx1MjY2MyIsCiAgICAgIGhlYXJ0czogIlx1MjY2NSIsCiAgICAgIGRpYW1zOiAiXHUyNjY2IiwKICAgICAgcXVvdDogJyInLAogICAgICBhbXA6ICImIiwKICAgICAgbHQ6ICI8IiwKICAgICAgZ3Q6ICI+IiwKICAgICAgT0VsaWc6ICJcdTAxNTIiLAogICAgICBvZWxpZzogIlx1MDE1MyIsCiAgICAgIFNjYXJvbjogIlx1MDE2MCIsCiAgICAgIHNjYXJvbjogIlx1MDE2MSIsCiAgICAgIFl1bWw6ICJcdTAxNzgiLAogICAgICBjaXJjOiAiXHUwMkM2IiwKICAgICAgdGlsZGU6ICJcdTAyREMiLAogICAgICBlbnNwOiAiXHUyMDAyIiwKICAgICAgZW1zcDogIlx1MjAwMyIsCiAgICAgIHRoaW5zcDogIlx1MjAwOSIsCiAgICAgIHp3bmo6ICJcdTIwMEMiLAogICAgICB6d2o6ICJcdTIwMEQiLAogICAgICBscm06ICJcdTIwMEUiLAogICAgICBybG06ICJcdTIwMEYiLAogICAgICBuZGFzaDogIlx1MjAxMyIsCiAgICAgIG1kYXNoOiAiXHUyMDE0IiwKICAgICAgbHNxdW86ICJcdTIwMTgiLAogICAgICByc3F1bzogIlx1MjAxOSIsCiAgICAgIHNicXVvOiAiXHUyMDFBIiwKICAgICAgbGRxdW86ICJcdTIwMUMiLAogICAgICByZHF1bzogIlx1MjAxRCIsCiAgICAgIGJkcXVvOiAiXHUyMDFFIiwKICAgICAgZGFnZ2VyOiAiXHUyMDIwIiwKICAgICAgRGFnZ2VyOiAiXHUyMDIxIiwKICAgICAgcGVybWlsOiAiXHUyMDMwIiwKICAgICAgbHNhcXVvOiAiXHUyMDM5IiwKICAgICAgcnNhcXVvOiAiXHUyMDNBIiwKICAgICAgZXVybzogIlx1MjBBQyIKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9saWIvY29uc3RhbnQvZGFuZ2Vyb3VzLmpzCnZhciBkYW5nZXJvdXM7CnZhciBpbml0X2Rhbmdlcm91cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi9jb25zdGFudC9kYW5nZXJvdXMuanMiKCkgewogICAgZGFuZ2Vyb3VzID0gWwogICAgICAiY2VudCIsCiAgICAgICJjb3B5IiwKICAgICAgImRpdmlkZSIsCiAgICAgICJndCIsCiAgICAgICJsdCIsCiAgICAgICJub3QiLAogICAgICAicGFyYSIsCiAgICAgICJ0aW1lcyIKICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9saWIvdXRpbC90by1uYW1lZC5qcwpmdW5jdGlvbiB0b05hbWVkKGNvZGU0LCBuZXh0Miwgb21pdCwgYXR0cmlidXRlKSB7CiAgY29uc3QgY2hhcmFjdGVyID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlNCk7CiAgaWYgKG93bjkuY2FsbChjaGFyYWN0ZXJzLCBjaGFyYWN0ZXIpKSB7CiAgICBjb25zdCBuYW1lID0gY2hhcmFjdGVyc1tjaGFyYWN0ZXJdOwogICAgY29uc3QgdmFsdWUyID0gIiYiICsgbmFtZTsKICAgIGlmIChvbWl0ICYmIGNoYXJhY3RlckVudGl0aWVzTGVnYWN5LmluY2x1ZGVzKG5hbWUpICYmICFkYW5nZXJvdXMuaW5jbHVkZXMobmFtZSkgJiYgKCFhdHRyaWJ1dGUgfHwgbmV4dDIgJiYgbmV4dDIgIT09IDYxICYmIG5vdEFscGhhbnVtZXJpY1JlZ2V4LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0MikpKSkgewogICAgICByZXR1cm4gdmFsdWUyOwogICAgfQogICAgcmV0dXJuIHZhbHVlMiArICI7IjsKICB9CiAgcmV0dXJuICIiOwp9CnZhciBvd245LCBjaGFyYWN0ZXJzLCBrZXksIG5vdEFscGhhbnVtZXJpY1JlZ2V4Owp2YXIgaW5pdF90b19uYW1lZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi91dGlsL3RvLW5hbWVkLmpzIigpIHsKICAgIGluaXRfY2hhcmFjdGVyX2VudGl0aWVzX2xlZ2FjeSgpOwogICAgaW5pdF9jaGFyYWN0ZXJfZW50aXRpZXNfaHRtbDQoKTsKICAgIGluaXRfZGFuZ2Vyb3VzKCk7CiAgICBvd245ID0ge30uaGFzT3duUHJvcGVydHk7CiAgICBjaGFyYWN0ZXJzID0ge307CiAgICBmb3IgKGtleSBpbiBjaGFyYWN0ZXJFbnRpdGllc0h0bWw0KSB7CiAgICAgIGlmIChvd245LmNhbGwoY2hhcmFjdGVyRW50aXRpZXNIdG1sNCwga2V5KSkgewogICAgICAgIGNoYXJhY3RlcnNbY2hhcmFjdGVyRW50aXRpZXNIdG1sNFtrZXldXSA9IGtleTsKICAgICAgfQogICAgfQogICAgbm90QWxwaGFudW1lcmljUmVnZXggPSAvW15cZEEtWmEtel0vOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vc3RyaW5naWZ5LWVudGl0aWVzQDQuMC40L25vZGVfbW9kdWxlcy9zdHJpbmdpZnktZW50aXRpZXMvbGliL3V0aWwvZm9ybWF0LXNtYXJ0LmpzCmZ1bmN0aW9uIGZvcm1hdFNtYXJ0KGNvZGU0LCBuZXh0Miwgb3B0aW9ucykgewogIGxldCBudW1lcmljID0gdG9IZXhhZGVjaW1hbChjb2RlNCwgbmV4dDIsIG9wdGlvbnMub21pdE9wdGlvbmFsU2VtaWNvbG9ucyk7CiAgbGV0IG5hbWVkOwogIGlmIChvcHRpb25zLnVzZU5hbWVkUmVmZXJlbmNlcyB8fCBvcHRpb25zLnVzZVNob3J0ZXN0UmVmZXJlbmNlcykgewogICAgbmFtZWQgPSB0b05hbWVkKAogICAgICBjb2RlNCwKICAgICAgbmV4dDIsCiAgICAgIG9wdGlvbnMub21pdE9wdGlvbmFsU2VtaWNvbG9ucywKICAgICAgb3B0aW9ucy5hdHRyaWJ1dGUKICAgICk7CiAgfQogIGlmICgob3B0aW9ucy51c2VTaG9ydGVzdFJlZmVyZW5jZXMgfHwgIW5hbWVkKSAmJiBvcHRpb25zLnVzZVNob3J0ZXN0UmVmZXJlbmNlcykgewogICAgY29uc3QgZGVjaW1hbCA9IHRvRGVjaW1hbChjb2RlNCwgbmV4dDIsIG9wdGlvbnMub21pdE9wdGlvbmFsU2VtaWNvbG9ucyk7CiAgICBpZiAoZGVjaW1hbC5sZW5ndGggPCBudW1lcmljLmxlbmd0aCkgewogICAgICBudW1lcmljID0gZGVjaW1hbDsKICAgIH0KICB9CiAgcmV0dXJuIG5hbWVkICYmICghb3B0aW9ucy51c2VTaG9ydGVzdFJlZmVyZW5jZXMgfHwgbmFtZWQubGVuZ3RoIDwgbnVtZXJpYy5sZW5ndGgpID8gbmFtZWQgOiBudW1lcmljOwp9CnZhciBpbml0X2Zvcm1hdF9zbWFydCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi91dGlsL2Zvcm1hdC1zbWFydC5qcyIoKSB7CiAgICBpbml0X3RvX2hleGFkZWNpbWFsKCk7CiAgICBpbml0X3RvX2RlY2ltYWwoKTsKICAgIGluaXRfdG9fbmFtZWQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi91dGlsL2Zvcm1hdC1iYXNpYy5qcwpmdW5jdGlvbiBmb3JtYXRCYXNpYyhjb2RlNCkgewogIHJldHVybiAiJiN4IiArIGNvZGU0LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpICsgIjsiOwp9CnZhciBpbml0X2Zvcm1hdF9iYXNpYyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi91dGlsL2Zvcm1hdC1iYXNpYy5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9saWIvaW5kZXguanMKZnVuY3Rpb24gc3RyaW5naWZ5RW50aXRpZXModmFsdWUyLCBvcHRpb25zKSB7CiAgcmV0dXJuIGNvcmUodmFsdWUyLCBPYmplY3QuYXNzaWduKHsgZm9ybWF0OiBmb3JtYXRTbWFydCB9LCBvcHRpb25zKSk7Cn0KZnVuY3Rpb24gc3RyaW5naWZ5RW50aXRpZXNMaWdodCh2YWx1ZTIsIG9wdGlvbnMpIHsKICByZXR1cm4gY29yZSh2YWx1ZTIsIE9iamVjdC5hc3NpZ24oeyBmb3JtYXQ6IGZvcm1hdEJhc2ljIH0sIG9wdGlvbnMpKTsKfQp2YXIgaW5pdF9saWIyOCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi9pbmRleC5qcyIoKSB7CiAgICBpbml0X2NvcmUoKTsKICAgIGluaXRfZm9ybWF0X3NtYXJ0KCk7CiAgICBpbml0X2Zvcm1hdF9iYXNpYygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vc3RyaW5naWZ5LWVudGl0aWVzQDQuMC40L25vZGVfbW9kdWxlcy9zdHJpbmdpZnktZW50aXRpZXMvaW5kZXguanMKdmFyIGluaXRfc3RyaW5naWZ5X2VudGl0aWVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vc3RyaW5naWZ5LWVudGl0aWVzQDQuMC40L25vZGVfbW9kdWxlcy9zdHJpbmdpZnktZW50aXRpZXMvaW5kZXguanMiKCkgewogICAgaW5pdF9saWIyOCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9oYW5kbGUvY29tbWVudC5qcwpmdW5jdGlvbiBjb21tZW50Mihub2RlMiwgXzEsIF8yMiwgc3RhdGUxMCkgewogIHJldHVybiBzdGF0ZTEwLnNldHRpbmdzLmJvZ3VzQ29tbWVudHMgPyAiPD8iICsgc3RyaW5naWZ5RW50aXRpZXMoCiAgICBub2RlMi52YWx1ZSwKICAgIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlMTAuc2V0dGluZ3MuY2hhcmFjdGVyUmVmZXJlbmNlcywgewogICAgICBzdWJzZXQ6IGJvZ3VzQ29tbWVudEVudGl0eVN1YnNldAogICAgfSkKICApICsgIj4iIDogIjwhLS0iICsgbm9kZTIudmFsdWUucmVwbGFjZShodG1sQ29tbWVudFJlZ2V4LCBlbmNvZGUyKSArICItLT4iOwogIGZ1bmN0aW9uIGVuY29kZTIoJDApIHsKICAgIHJldHVybiBzdHJpbmdpZnlFbnRpdGllcygKICAgICAgJDAsCiAgICAgIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlMTAuc2V0dGluZ3MuY2hhcmFjdGVyUmVmZXJlbmNlcywgewogICAgICAgIHN1YnNldDogY29tbWVudEVudGl0eVN1YnNldAogICAgICB9KQogICAgKTsKICB9Cn0KdmFyIGh0bWxDb21tZW50UmVnZXgsIGJvZ3VzQ29tbWVudEVudGl0eVN1YnNldCwgY29tbWVudEVudGl0eVN1YnNldDsKdmFyIGluaXRfY29tbWVudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvaGFuZGxlL2NvbW1lbnQuanMiKCkgewogICAgaW5pdF9zdHJpbmdpZnlfZW50aXRpZXMoKTsKICAgIGh0bWxDb21tZW50UmVnZXggPSAvXj58Xi0+fDwhLS18LS0+fC0tIT58PCEtJC9nOwogICAgYm9ndXNDb21tZW50RW50aXR5U3Vic2V0ID0gWyI+Il07CiAgICBjb21tZW50RW50aXR5U3Vic2V0ID0gWyI8IiwgIj4iXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvaGFuZGxlL2RvY3R5cGUuanMKZnVuY3Rpb24gZG9jdHlwZTIoXzEsIF8yMiwgXzMyLCBzdGF0ZTEwKSB7CiAgcmV0dXJuICI8ISIgKyAoc3RhdGUxMC5zZXR0aW5ncy51cHBlckRvY3R5cGUgPyAiRE9DVFlQRSIgOiAiZG9jdHlwZSIpICsgKHN0YXRlMTAuc2V0dGluZ3MudGlnaHREb2N0eXBlID8gIiIgOiAiICIpICsgImh0bWw+IjsKfQp2YXIgaW5pdF9kb2N0eXBlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9oYW5kbGUvZG9jdHlwZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9jb21tYS1zZXBhcmF0ZWQtdG9rZW5zQDIuMC4zL25vZGVfbW9kdWxlcy9jb21tYS1zZXBhcmF0ZWQtdG9rZW5zL2luZGV4LmpzCmZ1bmN0aW9uIHBhcnNlNSh2YWx1ZTIpIHsKICBjb25zdCB0b2tlbnMgPSBbXTsKICBjb25zdCBpbnB1dCA9IFN0cmluZyh2YWx1ZTIgfHwgIiIpOwogIGxldCBpbmRleDIgPSBpbnB1dC5pbmRleE9mKCIsIik7CiAgbGV0IHN0YXJ0ID0gMDsKICBsZXQgZW5kMyA9IGZhbHNlOwogIHdoaWxlICghZW5kMykgewogICAgaWYgKGluZGV4MiA9PT0gLTEpIHsKICAgICAgaW5kZXgyID0gaW5wdXQubGVuZ3RoOwogICAgICBlbmQzID0gdHJ1ZTsKICAgIH0KICAgIGNvbnN0IHRva2VuID0gaW5wdXQuc2xpY2Uoc3RhcnQsIGluZGV4MikudHJpbSgpOwogICAgaWYgKHRva2VuIHx8ICFlbmQzKSB7CiAgICAgIHRva2Vucy5wdXNoKHRva2VuKTsKICAgIH0KICAgIHN0YXJ0ID0gaW5kZXgyICsgMTsKICAgIGluZGV4MiA9IGlucHV0LmluZGV4T2YoIiwiLCBzdGFydCk7CiAgfQogIHJldHVybiB0b2tlbnM7Cn0KZnVuY3Rpb24gc3RyaW5naWZ5Myh2YWx1ZXMsIG9wdGlvbnMpIHsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwge307CiAgY29uc3QgaW5wdXQgPSB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdID09PSAiIiA/IFsuLi52YWx1ZXMsICIiXSA6IHZhbHVlczsKICByZXR1cm4gaW5wdXQuam9pbigKICAgIChzZXR0aW5ncy5wYWRSaWdodCA/ICIgIiA6ICIiKSArICIsIiArIChzZXR0aW5ncy5wYWRMZWZ0ID09PSBmYWxzZSA/ICIiIDogIiAiKQogICkudHJpbSgpOwp9CnZhciBpbml0X2NvbW1hX3NlcGFyYXRlZF90b2tlbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9jb21tYS1zZXBhcmF0ZWQtdG9rZW5zQDIuMC4zL25vZGVfbW9kdWxlcy9jb21tYS1zZXBhcmF0ZWQtdG9rZW5zL2luZGV4LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3NwYWNlLXNlcGFyYXRlZC10b2tlbnNAMi4wLjIvbm9kZV9tb2R1bGVzL3NwYWNlLXNlcGFyYXRlZC10b2tlbnMvaW5kZXguanMKZnVuY3Rpb24gcGFyc2U2KHZhbHVlMikgewogIGNvbnN0IGlucHV0ID0gU3RyaW5nKHZhbHVlMiB8fCAiIikudHJpbSgpOwogIHJldHVybiBpbnB1dCA/IGlucHV0LnNwbGl0KC9bIFx0XG5cclxmXSsvZykgOiBbXTsKfQpmdW5jdGlvbiBzdHJpbmdpZnk0KHZhbHVlcykgewogIHJldHVybiB2YWx1ZXMuam9pbigiICIpLnRyaW0oKTsKfQp2YXIgaW5pdF9zcGFjZV9zZXBhcmF0ZWRfdG9rZW5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vc3BhY2Utc2VwYXJhdGVkLXRva2Vuc0AyLjAuMi9ub2RlX21vZHVsZXMvc3BhY2Utc2VwYXJhdGVkLXRva2Vucy9pbmRleC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtd2hpdGVzcGFjZUAzLjAuMC9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXdoaXRlc3BhY2UvbGliL2luZGV4LmpzCmZ1bmN0aW9uIHdoaXRlc3BhY2UodGhpbmcpIHsKICByZXR1cm4gdHlwZW9mIHRoaW5nID09PSAib2JqZWN0IiA/IHRoaW5nLnR5cGUgPT09ICJ0ZXh0IiA/IGVtcHR5Myh0aGluZy52YWx1ZSkgOiBmYWxzZSA6IGVtcHR5Myh0aGluZyk7Cn0KZnVuY3Rpb24gZW1wdHkzKHZhbHVlMikgewogIHJldHVybiB2YWx1ZTIucmVwbGFjZShyZSwgIiIpID09PSAiIjsKfQp2YXIgcmU7CnZhciBpbml0X2xpYjI5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXdoaXRlc3BhY2VAMy4wLjAvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC13aGl0ZXNwYWNlL2xpYi9pbmRleC5qcyIoKSB7CiAgICByZSA9IC9bIFx0XG5cZlxyXS9nOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXdoaXRlc3BhY2VAMy4wLjAvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC13aGl0ZXNwYWNlL2luZGV4LmpzCnZhciBpbml0X2hhc3RfdXRpbF93aGl0ZXNwYWNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXdoaXRlc3BhY2VAMy4wLjAvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC13aGl0ZXNwYWNlL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliMjkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvb21pc3Npb24vdXRpbC9zaWJsaW5ncy5qcwpmdW5jdGlvbiBzaWJsaW5ncyhpbmNyZW1lbnQyKSB7CiAgcmV0dXJuIHNpYmxpbmc7CiAgZnVuY3Rpb24gc2libGluZyhwYXJlbnQsIGluZGV4MiwgaW5jbHVkZVdoaXRlc3BhY2UpIHsKICAgIGNvbnN0IHNpYmxpbmdzMiA9IHBhcmVudCA/IHBhcmVudC5jaGlsZHJlbiA6IGVtcHR5Q2hpbGRyZW47CiAgICBsZXQgb2Zmc2V0ID0gKGluZGV4MiB8fCAwKSArIGluY3JlbWVudDI7CiAgICBsZXQgbmV4dDIgPSBzaWJsaW5nczJbb2Zmc2V0XTsKICAgIGlmICghaW5jbHVkZVdoaXRlc3BhY2UpIHsKICAgICAgd2hpbGUgKG5leHQyICYmIHdoaXRlc3BhY2UobmV4dDIpKSB7CiAgICAgICAgb2Zmc2V0ICs9IGluY3JlbWVudDI7CiAgICAgICAgbmV4dDIgPSBzaWJsaW5nczJbb2Zmc2V0XTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5leHQyOwogIH0KfQp2YXIgc2libGluZ0FmdGVyLCBzaWJsaW5nQmVmb3JlLCBlbXB0eUNoaWxkcmVuOwp2YXIgaW5pdF9zaWJsaW5ncyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvb21pc3Npb24vdXRpbC9zaWJsaW5ncy5qcyIoKSB7CiAgICBpbml0X2hhc3RfdXRpbF93aGl0ZXNwYWNlKCk7CiAgICBzaWJsaW5nQWZ0ZXIgPSBzaWJsaW5ncygxKTsKICAgIHNpYmxpbmdCZWZvcmUgPSBzaWJsaW5ncygtMSk7CiAgICBlbXB0eUNoaWxkcmVuID0gW107CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL29taXNzaW9uL29taXNzaW9uLmpzCmZ1bmN0aW9uIG9taXNzaW9uKGhhbmRsZXJzMikgewogIHJldHVybiBvbWl0OwogIGZ1bmN0aW9uIG9taXQobm9kZTIsIGluZGV4MiwgcGFyZW50KSB7CiAgICByZXR1cm4gb3duMTAuY2FsbChoYW5kbGVyczIsIG5vZGUyLnRhZ05hbWUpICYmIGhhbmRsZXJzMltub2RlMi50YWdOYW1lXShub2RlMiwgaW5kZXgyLCBwYXJlbnQpOwogIH0KfQp2YXIgb3duMTA7CnZhciBpbml0X29taXNzaW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9vbWlzc2lvbi9vbWlzc2lvbi5qcyIoKSB7CiAgICBvd24xMCA9IHt9Lmhhc093blByb3BlcnR5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9vbWlzc2lvbi9jbG9zaW5nLmpzCmZ1bmN0aW9uIGhlYWRPckNvbGdyb3VwT3JDYXB0aW9uKF80LCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IG5leHQyID0gc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyLCB0cnVlKTsKICByZXR1cm4gIW5leHQyIHx8IG5leHQyLnR5cGUgIT09ICJjb21tZW50IiAmJiAhKG5leHQyLnR5cGUgPT09ICJ0ZXh0IiAmJiB3aGl0ZXNwYWNlKG5leHQyLnZhbHVlLmNoYXJBdCgwKSkpOwp9CmZ1bmN0aW9uIGh0bWw1KF80LCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IG5leHQyID0gc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyKTsKICByZXR1cm4gIW5leHQyIHx8IG5leHQyLnR5cGUgIT09ICJjb21tZW50IjsKfQpmdW5jdGlvbiBib2R5KF80LCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IG5leHQyID0gc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyKTsKICByZXR1cm4gIW5leHQyIHx8IG5leHQyLnR5cGUgIT09ICJjb21tZW50IjsKfQpmdW5jdGlvbiBwNChfNCwgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4Mik7CiAgcmV0dXJuIG5leHQyID8gbmV4dDIudHlwZSA9PT0gImVsZW1lbnQiICYmIChuZXh0Mi50YWdOYW1lID09PSAiYWRkcmVzcyIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImFydGljbGUiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJhc2lkZSIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImJsb2NrcXVvdGUiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJkZXRhaWxzIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiZGl2IiB8fCBuZXh0Mi50YWdOYW1lID09PSAiZGwiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJmaWVsZHNldCIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImZpZ2NhcHRpb24iIHx8IG5leHQyLnRhZ05hbWUgPT09ICJmaWd1cmUiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJmb290ZXIiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJmb3JtIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiaDEiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJoMiIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImgzIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiaDQiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJoNSIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImg2IiB8fCBuZXh0Mi50YWdOYW1lID09PSAiaGVhZGVyIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiaGdyb3VwIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiaHIiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJtYWluIiB8fCBuZXh0Mi50YWdOYW1lID09PSAibWVudSIgfHwgbmV4dDIudGFnTmFtZSA9PT0gIm5hdiIgfHwgbmV4dDIudGFnTmFtZSA9PT0gIm9sIiB8fCBuZXh0Mi50YWdOYW1lID09PSAicCIgfHwgbmV4dDIudGFnTmFtZSA9PT0gInByZSIgfHwgbmV4dDIudGFnTmFtZSA9PT0gInNlY3Rpb24iIHx8IG5leHQyLnRhZ05hbWUgPT09ICJ0YWJsZSIgfHwgbmV4dDIudGFnTmFtZSA9PT0gInVsIikgOiAhcGFyZW50IHx8IC8vIENvbmZ1c2luZyBwYXJlbnQuCiAgIShwYXJlbnQudHlwZSA9PT0gImVsZW1lbnQiICYmIChwYXJlbnQudGFnTmFtZSA9PT0gImEiIHx8IHBhcmVudC50YWdOYW1lID09PSAiYXVkaW8iIHx8IHBhcmVudC50YWdOYW1lID09PSAiZGVsIiB8fCBwYXJlbnQudGFnTmFtZSA9PT0gImlucyIgfHwgcGFyZW50LnRhZ05hbWUgPT09ICJtYXAiIHx8IHBhcmVudC50YWdOYW1lID09PSAibm9zY3JpcHQiIHx8IHBhcmVudC50YWdOYW1lID09PSAidmlkZW8iKSk7Cn0KZnVuY3Rpb24gbGkoXzQsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwogIHJldHVybiAhbmV4dDIgfHwgbmV4dDIudHlwZSA9PT0gImVsZW1lbnQiICYmIG5leHQyLnRhZ05hbWUgPT09ICJsaSI7Cn0KZnVuY3Rpb24gZHQoXzQsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwogIHJldHVybiBCb29sZWFuKAogICAgbmV4dDIgJiYgbmV4dDIudHlwZSA9PT0gImVsZW1lbnQiICYmIChuZXh0Mi50YWdOYW1lID09PSAiZHQiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJkZCIpCiAgKTsKfQpmdW5jdGlvbiBkZChfNCwgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4Mik7CiAgcmV0dXJuICFuZXh0MiB8fCBuZXh0Mi50eXBlID09PSAiZWxlbWVudCIgJiYgKG5leHQyLnRhZ05hbWUgPT09ICJkdCIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImRkIik7Cn0KZnVuY3Rpb24gcnVieUVsZW1lbnQoXzQsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwogIHJldHVybiAhbmV4dDIgfHwgbmV4dDIudHlwZSA9PT0gImVsZW1lbnQiICYmIChuZXh0Mi50YWdOYW1lID09PSAicnAiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJydCIpOwp9CmZ1bmN0aW9uIG9wdGdyb3VwKF80LCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IG5leHQyID0gc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyKTsKICByZXR1cm4gIW5leHQyIHx8IG5leHQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiBuZXh0Mi50YWdOYW1lID09PSAib3B0Z3JvdXAiOwp9CmZ1bmN0aW9uIG9wdGlvbihfNCwgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4Mik7CiAgcmV0dXJuICFuZXh0MiB8fCBuZXh0Mi50eXBlID09PSAiZWxlbWVudCIgJiYgKG5leHQyLnRhZ05hbWUgPT09ICJvcHRpb24iIHx8IG5leHQyLnRhZ05hbWUgPT09ICJvcHRncm91cCIpOwp9CmZ1bmN0aW9uIHRoZWFkKF80LCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IG5leHQyID0gc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyKTsKICByZXR1cm4gQm9vbGVhbigKICAgIG5leHQyICYmIG5leHQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiAobmV4dDIudGFnTmFtZSA9PT0gInRib2R5IiB8fCBuZXh0Mi50YWdOYW1lID09PSAidGZvb3QiKQogICk7Cn0KZnVuY3Rpb24gdGJvZHkoXzQsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwogIHJldHVybiAhbmV4dDIgfHwgbmV4dDIudHlwZSA9PT0gImVsZW1lbnQiICYmIChuZXh0Mi50YWdOYW1lID09PSAidGJvZHkiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJ0Zm9vdCIpOwp9CmZ1bmN0aW9uIHRmb290KF80LCBpbmRleDIsIHBhcmVudCkgewogIHJldHVybiAhc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyKTsKfQpmdW5jdGlvbiB0cihfNCwgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4Mik7CiAgcmV0dXJuICFuZXh0MiB8fCBuZXh0Mi50eXBlID09PSAiZWxlbWVudCIgJiYgbmV4dDIudGFnTmFtZSA9PT0gInRyIjsKfQpmdW5jdGlvbiBjZWxscyhfNCwgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4Mik7CiAgcmV0dXJuICFuZXh0MiB8fCBuZXh0Mi50eXBlID09PSAiZWxlbWVudCIgJiYgKG5leHQyLnRhZ05hbWUgPT09ICJ0ZCIgfHwgbmV4dDIudGFnTmFtZSA9PT0gInRoIik7Cn0KdmFyIGNsb3Npbmc7CnZhciBpbml0X2Nsb3NpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL29taXNzaW9uL2Nsb3NpbmcuanMiKCkgewogICAgaW5pdF9oYXN0X3V0aWxfd2hpdGVzcGFjZSgpOwogICAgaW5pdF9zaWJsaW5ncygpOwogICAgaW5pdF9vbWlzc2lvbigpOwogICAgY2xvc2luZyA9IG9taXNzaW9uKHsKICAgICAgYm9keSwKICAgICAgY2FwdGlvbjogaGVhZE9yQ29sZ3JvdXBPckNhcHRpb24sCiAgICAgIGNvbGdyb3VwOiBoZWFkT3JDb2xncm91cE9yQ2FwdGlvbiwKICAgICAgZGQsCiAgICAgIGR0LAogICAgICBoZWFkOiBoZWFkT3JDb2xncm91cE9yQ2FwdGlvbiwKICAgICAgaHRtbDogaHRtbDUsCiAgICAgIGxpLAogICAgICBvcHRncm91cCwKICAgICAgb3B0aW9uLAogICAgICBwOiBwNCwKICAgICAgcnA6IHJ1YnlFbGVtZW50LAogICAgICBydDogcnVieUVsZW1lbnQsCiAgICAgIHRib2R5LAogICAgICB0ZDogY2VsbHMsCiAgICAgIHRmb290LAogICAgICB0aDogY2VsbHMsCiAgICAgIHRoZWFkLAogICAgICB0cgogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL29taXNzaW9uL29wZW5pbmcuanMKZnVuY3Rpb24gaHRtbDYobm9kZTIpIHsKICBjb25zdCBoZWFkMiA9IHNpYmxpbmdBZnRlcihub2RlMiwgLTEpOwogIHJldHVybiAhaGVhZDIgfHwgaGVhZDIudHlwZSAhPT0gImNvbW1lbnQiOwp9CmZ1bmN0aW9uIGhlYWQobm9kZTIpIHsKICBjb25zdCBzZWVuID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICBmb3IgKGNvbnN0IGNoaWxkMiBvZiBub2RlMi5jaGlsZHJlbikgewogICAgaWYgKGNoaWxkMi50eXBlID09PSAiZWxlbWVudCIgJiYgKGNoaWxkMi50YWdOYW1lID09PSAiYmFzZSIgfHwgY2hpbGQyLnRhZ05hbWUgPT09ICJ0aXRsZSIpKSB7CiAgICAgIGlmIChzZWVuLmhhcyhjaGlsZDIudGFnTmFtZSkpIHJldHVybiBmYWxzZTsKICAgICAgc2Vlbi5hZGQoY2hpbGQyLnRhZ05hbWUpOwogICAgfQogIH0KICBjb25zdCBjaGlsZCA9IG5vZGUyLmNoaWxkcmVuWzBdOwogIHJldHVybiAhY2hpbGQgfHwgY2hpbGQudHlwZSA9PT0gImVsZW1lbnQiOwp9CmZ1bmN0aW9uIGJvZHkyKG5vZGUyKSB7CiAgY29uc3QgaGVhZDIgPSBzaWJsaW5nQWZ0ZXIobm9kZTIsIC0xLCB0cnVlKTsKICByZXR1cm4gIWhlYWQyIHx8IGhlYWQyLnR5cGUgIT09ICJjb21tZW50IiAmJiAhKGhlYWQyLnR5cGUgPT09ICJ0ZXh0IiAmJiB3aGl0ZXNwYWNlKGhlYWQyLnZhbHVlLmNoYXJBdCgwKSkpICYmICEoaGVhZDIudHlwZSA9PT0gImVsZW1lbnQiICYmIChoZWFkMi50YWdOYW1lID09PSAibWV0YSIgfHwgaGVhZDIudGFnTmFtZSA9PT0gImxpbmsiIHx8IGhlYWQyLnRhZ05hbWUgPT09ICJzY3JpcHQiIHx8IGhlYWQyLnRhZ05hbWUgPT09ICJzdHlsZSIgfHwgaGVhZDIudGFnTmFtZSA9PT0gInRlbXBsYXRlIikpOwp9CmZ1bmN0aW9uIGNvbGdyb3VwKG5vZGUyLCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IHByZXZpb3VzMyA9IHNpYmxpbmdCZWZvcmUocGFyZW50LCBpbmRleDIpOwogIGNvbnN0IGhlYWQyID0gc2libGluZ0FmdGVyKG5vZGUyLCAtMSwgdHJ1ZSk7CiAgaWYgKHBhcmVudCAmJiBwcmV2aW91czMgJiYgcHJldmlvdXMzLnR5cGUgPT09ICJlbGVtZW50IiAmJiBwcmV2aW91czMudGFnTmFtZSA9PT0gImNvbGdyb3VwIiAmJiBjbG9zaW5nKHByZXZpb3VzMywgcGFyZW50LmNoaWxkcmVuLmluZGV4T2YocHJldmlvdXMzKSwgcGFyZW50KSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gQm9vbGVhbihoZWFkMiAmJiBoZWFkMi50eXBlID09PSAiZWxlbWVudCIgJiYgaGVhZDIudGFnTmFtZSA9PT0gImNvbCIpOwp9CmZ1bmN0aW9uIHRib2R5Mihub2RlMiwgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBwcmV2aW91czMgPSBzaWJsaW5nQmVmb3JlKHBhcmVudCwgaW5kZXgyKTsKICBjb25zdCBoZWFkMiA9IHNpYmxpbmdBZnRlcihub2RlMiwgLTEpOwogIGlmIChwYXJlbnQgJiYgcHJldmlvdXMzICYmIHByZXZpb3VzMy50eXBlID09PSAiZWxlbWVudCIgJiYgKHByZXZpb3VzMy50YWdOYW1lID09PSAidGhlYWQiIHx8IHByZXZpb3VzMy50YWdOYW1lID09PSAidGJvZHkiKSAmJiBjbG9zaW5nKHByZXZpb3VzMywgcGFyZW50LmNoaWxkcmVuLmluZGV4T2YocHJldmlvdXMzKSwgcGFyZW50KSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gQm9vbGVhbihoZWFkMiAmJiBoZWFkMi50eXBlID09PSAiZWxlbWVudCIgJiYgaGVhZDIudGFnTmFtZSA9PT0gInRyIik7Cn0KdmFyIG9wZW5pbmc7CnZhciBpbml0X29wZW5pbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL29taXNzaW9uL29wZW5pbmcuanMiKCkgewogICAgaW5pdF9oYXN0X3V0aWxfd2hpdGVzcGFjZSgpOwogICAgaW5pdF9zaWJsaW5ncygpOwogICAgaW5pdF9jbG9zaW5nKCk7CiAgICBpbml0X29taXNzaW9uKCk7CiAgICBvcGVuaW5nID0gb21pc3Npb24oewogICAgICBib2R5OiBib2R5MiwKICAgICAgY29sZ3JvdXAsCiAgICAgIGhlYWQsCiAgICAgIGh0bWw6IGh0bWw2LAogICAgICB0Ym9keTogdGJvZHkyCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvaGFuZGxlL2VsZW1lbnQuanMKZnVuY3Rpb24gZWxlbWVudDMobm9kZTIsIGluZGV4MiwgcGFyZW50LCBzdGF0ZTEwKSB7CiAgY29uc3Qgc2NoZW1hID0gc3RhdGUxMC5zY2hlbWE7CiAgY29uc3Qgb21pdCA9IHNjaGVtYS5zcGFjZSA9PT0gInN2ZyIgPyBmYWxzZSA6IHN0YXRlMTAuc2V0dGluZ3Mub21pdE9wdGlvbmFsVGFnczsKICBsZXQgc2VsZkNsb3NpbmcgPSBzY2hlbWEuc3BhY2UgPT09ICJzdmciID8gc3RhdGUxMC5zZXR0aW5ncy5jbG9zZUVtcHR5RWxlbWVudHMgOiBzdGF0ZTEwLnNldHRpbmdzLnZvaWRzLmluY2x1ZGVzKG5vZGUyLnRhZ05hbWUudG9Mb3dlckNhc2UoKSk7CiAgY29uc3QgcGFydHMgPSBbXTsKICBsZXQgbGFzdDM7CiAgaWYgKHNjaGVtYS5zcGFjZSA9PT0gImh0bWwiICYmIG5vZGUyLnRhZ05hbWUgPT09ICJzdmciKSB7CiAgICBzdGF0ZTEwLnNjaGVtYSA9IHN2ZzI7CiAgfQogIGNvbnN0IGF0dHJpYnV0ZXMgPSBzZXJpYWxpemVBdHRyaWJ1dGVzKHN0YXRlMTAsIG5vZGUyLnByb3BlcnRpZXMpOwogIGNvbnN0IGNvbnRlbnQzID0gc3RhdGUxMC5hbGwoCiAgICBzY2hlbWEuc3BhY2UgPT09ICJodG1sIiAmJiBub2RlMi50YWdOYW1lID09PSAidGVtcGxhdGUiID8gbm9kZTIuY29udGVudCA6IG5vZGUyCiAgKTsKICBzdGF0ZTEwLnNjaGVtYSA9IHNjaGVtYTsKICBpZiAoY29udGVudDMpIHNlbGZDbG9zaW5nID0gZmFsc2U7CiAgaWYgKGF0dHJpYnV0ZXMgfHwgIW9taXQgfHwgIW9wZW5pbmcobm9kZTIsIGluZGV4MiwgcGFyZW50KSkgewogICAgcGFydHMucHVzaCgiPCIsIG5vZGUyLnRhZ05hbWUsIGF0dHJpYnV0ZXMgPyAiICIgKyBhdHRyaWJ1dGVzIDogIiIpOwogICAgaWYgKHNlbGZDbG9zaW5nICYmIChzY2hlbWEuc3BhY2UgPT09ICJzdmciIHx8IHN0YXRlMTAuc2V0dGluZ3MuY2xvc2VTZWxmQ2xvc2luZykpIHsKICAgICAgbGFzdDMgPSBhdHRyaWJ1dGVzLmNoYXJBdChhdHRyaWJ1dGVzLmxlbmd0aCAtIDEpOwogICAgICBpZiAoIXN0YXRlMTAuc2V0dGluZ3MudGlnaHRTZWxmQ2xvc2luZyB8fCBsYXN0MyA9PT0gIi8iIHx8IGxhc3QzICYmIGxhc3QzICE9PSAnIicgJiYgbGFzdDMgIT09ICInIikgewogICAgICAgIHBhcnRzLnB1c2goIiAiKTsKICAgICAgfQogICAgICBwYXJ0cy5wdXNoKCIvIik7CiAgICB9CiAgICBwYXJ0cy5wdXNoKCI+Iik7CiAgfQogIHBhcnRzLnB1c2goY29udGVudDMpOwogIGlmICghc2VsZkNsb3NpbmcgJiYgKCFvbWl0IHx8ICFjbG9zaW5nKG5vZGUyLCBpbmRleDIsIHBhcmVudCkpKSB7CiAgICBwYXJ0cy5wdXNoKCI8LyIgKyBub2RlMi50YWdOYW1lICsgIj4iKTsKICB9CiAgcmV0dXJuIHBhcnRzLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIHNlcmlhbGl6ZUF0dHJpYnV0ZXMoc3RhdGUxMCwgcHJvcGVydGllczIpIHsKICBjb25zdCB2YWx1ZXMgPSBbXTsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IGtleTI7CiAgaWYgKHByb3BlcnRpZXMyKSB7CiAgICBmb3IgKGtleTIgaW4gcHJvcGVydGllczIpIHsKICAgICAgaWYgKHByb3BlcnRpZXMyW2tleTJdICE9PSBudWxsICYmIHByb3BlcnRpZXMyW2tleTJdICE9PSB2b2lkIDApIHsKICAgICAgICBjb25zdCB2YWx1ZTIgPSBzZXJpYWxpemVBdHRyaWJ1dGUoc3RhdGUxMCwga2V5MiwgcHJvcGVydGllczJba2V5Ml0pOwogICAgICAgIGlmICh2YWx1ZTIpIHZhbHVlcy5wdXNoKHZhbHVlMik7CiAgICAgIH0KICAgIH0KICB9CiAgd2hpbGUgKCsraW5kZXgyIDwgdmFsdWVzLmxlbmd0aCkgewogICAgY29uc3QgbGFzdDMgPSBzdGF0ZTEwLnNldHRpbmdzLnRpZ2h0QXR0cmlidXRlcyA/IHZhbHVlc1tpbmRleDJdLmNoYXJBdCh2YWx1ZXNbaW5kZXgyXS5sZW5ndGggLSAxKSA6IHZvaWQgMDsKICAgIGlmIChpbmRleDIgIT09IHZhbHVlcy5sZW5ndGggLSAxICYmIGxhc3QzICE9PSAnIicgJiYgbGFzdDMgIT09ICInIikgewogICAgICB2YWx1ZXNbaW5kZXgyXSArPSAiICI7CiAgICB9CiAgfQogIHJldHVybiB2YWx1ZXMuam9pbigiIik7Cn0KZnVuY3Rpb24gc2VyaWFsaXplQXR0cmlidXRlKHN0YXRlMTAsIGtleTIsIHZhbHVlMikgewogIGNvbnN0IGluZm8gPSBmaW5kMihzdGF0ZTEwLnNjaGVtYSwga2V5Mik7CiAgY29uc3QgeDMgPSBzdGF0ZTEwLnNldHRpbmdzLmFsbG93UGFyc2VFcnJvcnMgJiYgc3RhdGUxMC5zY2hlbWEuc3BhY2UgPT09ICJodG1sIiA/IDAgOiAxOwogIGNvbnN0IHk1ID0gc3RhdGUxMC5zZXR0aW5ncy5hbGxvd0Rhbmdlcm91c0NoYXJhY3RlcnMgPyAwIDogMTsKICBsZXQgcXVvdGUgPSBzdGF0ZTEwLnF1b3RlOwogIGxldCByZXN1bHQ7CiAgaWYgKGluZm8ub3ZlcmxvYWRlZEJvb2xlYW4gJiYgKHZhbHVlMiA9PT0gaW5mby5hdHRyaWJ1dGUgfHwgdmFsdWUyID09PSAiIikpIHsKICAgIHZhbHVlMiA9IHRydWU7CiAgfSBlbHNlIGlmICgoaW5mby5ib29sZWFuIHx8IGluZm8ub3ZlcmxvYWRlZEJvb2xlYW4pICYmICh0eXBlb2YgdmFsdWUyICE9PSAic3RyaW5nIiB8fCB2YWx1ZTIgPT09IGluZm8uYXR0cmlidXRlIHx8IHZhbHVlMiA9PT0gIiIpKSB7CiAgICB2YWx1ZTIgPSBCb29sZWFuKHZhbHVlMik7CiAgfQogIGlmICh2YWx1ZTIgPT09IG51bGwgfHwgdmFsdWUyID09PSB2b2lkIDAgfHwgdmFsdWUyID09PSBmYWxzZSB8fCB0eXBlb2YgdmFsdWUyID09PSAibnVtYmVyIiAmJiBOdW1iZXIuaXNOYU4odmFsdWUyKSkgewogICAgcmV0dXJuICIiOwogIH0KICBjb25zdCBuYW1lID0gc3RyaW5naWZ5RW50aXRpZXMoCiAgICBpbmZvLmF0dHJpYnV0ZSwKICAgIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlMTAuc2V0dGluZ3MuY2hhcmFjdGVyUmVmZXJlbmNlcywgewogICAgICAvLyBBbHdheXMgZW5jb2RlIHdpdGhvdXQgcGFyc2UgZXJyb3JzIGluIG5vbi1IVE1MLgogICAgICBzdWJzZXQ6IGNvbnN0YW50cy5uYW1lW3gzXVt5NV0KICAgIH0pCiAgKTsKICBpZiAodmFsdWUyID09PSB0cnVlKSByZXR1cm4gbmFtZTsKICB2YWx1ZTIgPSBBcnJheS5pc0FycmF5KHZhbHVlMikgPyAoaW5mby5jb21tYVNlcGFyYXRlZCA/IHN0cmluZ2lmeTMgOiBzdHJpbmdpZnk0KSh2YWx1ZTIsIHsKICAgIHBhZExlZnQ6ICFzdGF0ZTEwLnNldHRpbmdzLnRpZ2h0Q29tbWFTZXBhcmF0ZWRMaXN0cwogIH0pIDogU3RyaW5nKHZhbHVlMik7CiAgaWYgKHN0YXRlMTAuc2V0dGluZ3MuY29sbGFwc2VFbXB0eUF0dHJpYnV0ZXMgJiYgIXZhbHVlMikgcmV0dXJuIG5hbWU7CiAgaWYgKHN0YXRlMTAuc2V0dGluZ3MucHJlZmVyVW5xdW90ZWQpIHsKICAgIHJlc3VsdCA9IHN0cmluZ2lmeUVudGl0aWVzKAogICAgICB2YWx1ZTIsCiAgICAgIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlMTAuc2V0dGluZ3MuY2hhcmFjdGVyUmVmZXJlbmNlcywgewogICAgICAgIGF0dHJpYnV0ZTogdHJ1ZSwKICAgICAgICBzdWJzZXQ6IGNvbnN0YW50cy51bnF1b3RlZFt4M11beTVdCiAgICAgIH0pCiAgICApOwogIH0KICBpZiAocmVzdWx0ICE9PSB2YWx1ZTIpIHsKICAgIGlmIChzdGF0ZTEwLnNldHRpbmdzLnF1b3RlU21hcnQgJiYgY2NvdW50KHZhbHVlMiwgcXVvdGUpID4gY2NvdW50KHZhbHVlMiwgc3RhdGUxMC5hbHRlcm5hdGl2ZSkpIHsKICAgICAgcXVvdGUgPSBzdGF0ZTEwLmFsdGVybmF0aXZlOwogICAgfQogICAgcmVzdWx0ID0gcXVvdGUgKyBzdHJpbmdpZnlFbnRpdGllcygKICAgICAgdmFsdWUyLAogICAgICBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZTEwLnNldHRpbmdzLmNoYXJhY3RlclJlZmVyZW5jZXMsIHsKICAgICAgICAvLyBBbHdheXMgZW5jb2RlIHdpdGhvdXQgcGFyc2UgZXJyb3JzIGluIG5vbi1IVE1MLgogICAgICAgIHN1YnNldDogKHF1b3RlID09PSAiJyIgPyBjb25zdGFudHMuc2luZ2xlIDogY29uc3RhbnRzLmRvdWJsZSlbeDNdW3k1XSwKICAgICAgICBhdHRyaWJ1dGU6IHRydWUKICAgICAgfSkKICAgICkgKyBxdW90ZTsKICB9CiAgcmV0dXJuIG5hbWUgKyAocmVzdWx0ID8gIj0iICsgcmVzdWx0IDogcmVzdWx0KTsKfQp2YXIgY29uc3RhbnRzOwp2YXIgaW5pdF9lbGVtZW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9oYW5kbGUvZWxlbWVudC5qcyIoKSB7CiAgICBpbml0X2Njb3VudCgpOwogICAgaW5pdF9jb21tYV9zZXBhcmF0ZWRfdG9rZW5zKCk7CiAgICBpbml0X3Byb3BlcnR5X2luZm9ybWF0aW9uKCk7CiAgICBpbml0X3NwYWNlX3NlcGFyYXRlZF90b2tlbnMoKTsKICAgIGluaXRfc3RyaW5naWZ5X2VudGl0aWVzKCk7CiAgICBpbml0X2Nsb3NpbmcoKTsKICAgIGluaXRfb3BlbmluZygpOwogICAgY29uc3RhbnRzID0gewogICAgICAvLyBTZWU6IDxodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNhdHRyaWJ1dGUtbmFtZS1zdGF0ZT4uCiAgICAgIG5hbWU6IFsKICAgICAgICBbIglcblxmXHIgJi89PiIuc3BsaXQoIiIpLCAiCVxuXGZcciBcIiYnLz0+YCIuc3BsaXQoIiIpXSwKICAgICAgICBbYFwwCQpcZlxyICImJy88PT5gLnNwbGl0KCIiKSwgIlwwCVxuXGZcciBcIiYnLzw9PmAiLnNwbGl0KCIiKV0KICAgICAgXSwKICAgICAgLy8gU2VlOiA8aHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jYXR0cmlidXRlLXZhbHVlLSh1bnF1b3RlZCktc3RhdGU+LgogICAgICB1bnF1b3RlZDogWwogICAgICAgIFsiCVxuXGZcciAmPiIuc3BsaXQoIiIpLCAiXDAJXG5cZlxyIFwiJic8PT5gIi5zcGxpdCgiIildLAogICAgICAgIFsiXDAJXG5cZlxyIFwiJic8PT5gIi5zcGxpdCgiIiksICJcMAlcblxmXHIgXCImJzw9PmAiLnNwbGl0KCIiKV0KICAgICAgXSwKICAgICAgLy8gU2VlOiA8aHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jYXR0cmlidXRlLXZhbHVlLShzaW5nbGUtcXVvdGVkKS1zdGF0ZT4uCiAgICAgIHNpbmdsZTogWwogICAgICAgIFsiJiciLnNwbGl0KCIiKSwgIlwiJidgIi5zcGxpdCgiIildLAogICAgICAgIFsiXDAmJyIuc3BsaXQoIiIpLCAiXDBcIiYnYCIuc3BsaXQoIiIpXQogICAgICBdLAogICAgICAvLyBTZWU6IDxodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNhdHRyaWJ1dGUtdmFsdWUtKGRvdWJsZS1xdW90ZWQpLXN0YXRlPi4KICAgICAgZG91YmxlOiBbCiAgICAgICAgWyciJicuc3BsaXQoIiIpLCAiXCImJ2AiLnNwbGl0KCIiKV0sCiAgICAgICAgWydcMCImJy5zcGxpdCgiIiksICJcMFwiJidgIi5zcGxpdCgiIildCiAgICAgIF0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL2hhbmRsZS90ZXh0LmpzCmZ1bmN0aW9uIHRleHQ3KG5vZGUyLCBfNCwgcGFyZW50LCBzdGF0ZTEwKSB7CiAgcmV0dXJuIHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PT0gImVsZW1lbnQiICYmIChwYXJlbnQudGFnTmFtZSA9PT0gInNjcmlwdCIgfHwgcGFyZW50LnRhZ05hbWUgPT09ICJzdHlsZSIpID8gbm9kZTIudmFsdWUgOiBzdHJpbmdpZnlFbnRpdGllcygKICAgIG5vZGUyLnZhbHVlLAogICAgT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUxMC5zZXR0aW5ncy5jaGFyYWN0ZXJSZWZlcmVuY2VzLCB7CiAgICAgIHN1YnNldDogdGV4dEVudGl0eVN1YnNldAogICAgfSkKICApOwp9CnZhciB0ZXh0RW50aXR5U3Vic2V0Owp2YXIgaW5pdF90ZXh0NCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvaGFuZGxlL3RleHQuanMiKCkgewogICAgaW5pdF9zdHJpbmdpZnlfZW50aXRpZXMoKTsKICAgIHRleHRFbnRpdHlTdWJzZXQgPSBbIjwiLCAiJiJdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9oYW5kbGUvcmF3LmpzCmZ1bmN0aW9uIHJhdyhub2RlMiwgaW5kZXgyLCBwYXJlbnQsIHN0YXRlMTApIHsKICByZXR1cm4gc3RhdGUxMC5zZXR0aW5ncy5hbGxvd0Rhbmdlcm91c0h0bWwgPyBub2RlMi52YWx1ZSA6IHRleHQ3KG5vZGUyLCBpbmRleDIsIHBhcmVudCwgc3RhdGUxMCk7Cn0KdmFyIGluaXRfcmF3ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9oYW5kbGUvcmF3LmpzIigpIHsKICAgIGluaXRfdGV4dDQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvaGFuZGxlL3Jvb3QuanMKZnVuY3Rpb24gcm9vdDQobm9kZTIsIF8xLCBfMjIsIHN0YXRlMTApIHsKICByZXR1cm4gc3RhdGUxMC5hbGwobm9kZTIpOwp9CnZhciBpbml0X3Jvb3QzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9oYW5kbGUvcm9vdC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL2hhbmRsZS9pbmRleC5qcwpmdW5jdGlvbiBpbnZhbGlkMihub2RlMikgewogIHRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgbm9kZSwgbm90IGAiICsgbm9kZTIgKyAiYCIpOwp9CmZ1bmN0aW9uIHVua25vd24yKG5vZGVfKSB7CiAgY29uc3Qgbm9kZTIgPSAoCiAgICAvKiogQHR5cGUge05vZGVzfSAqLwogICAgbm9kZV8KICApOwogIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNvbXBpbGUgdW5rbm93biBub2RlIGAiICsgbm9kZTIudHlwZSArICJgIik7Cn0KdmFyIGhhbmRsZTI7CnZhciBpbml0X2hhbmRsZTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL2hhbmRsZS9pbmRleC5qcyIoKSB7CiAgICBpbml0X3p3aXRjaCgpOwogICAgaW5pdF9jb21tZW50KCk7CiAgICBpbml0X2RvY3R5cGUoKTsKICAgIGluaXRfZWxlbWVudCgpOwogICAgaW5pdF9yYXcoKTsKICAgIGluaXRfcm9vdDMoKTsKICAgIGluaXRfdGV4dDQoKTsKICAgIGhhbmRsZTIgPSB6d2l0Y2goInR5cGUiLCB7CiAgICAgIGludmFsaWQ6IGludmFsaWQyLAogICAgICB1bmtub3duOiB1bmtub3duMiwKICAgICAgaGFuZGxlcnM6IHsgY29tbWVudDogY29tbWVudDIsIGRvY3R5cGU6IGRvY3R5cGUyLCBlbGVtZW50OiBlbGVtZW50MywgcmF3LCByb290OiByb290NCwgdGV4dDogdGV4dDcgfQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL2luZGV4LmpzCmZ1bmN0aW9uIHRvSHRtbCh0cmVlLCBvcHRpb25zKSB7CiAgY29uc3Qgb3B0aW9uc18gPSBvcHRpb25zIHx8IGVtcHR5T3B0aW9uczY7CiAgY29uc3QgcXVvdGUgPSBvcHRpb25zXy5xdW90ZSB8fCAnIic7CiAgY29uc3QgYWx0ZXJuYXRpdmUgPSBxdW90ZSA9PT0gJyInID8gIiciIDogJyInOwogIGlmIChxdW90ZSAhPT0gJyInICYmIHF1b3RlICE9PSAiJyIpIHsKICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBxdW90ZSBgIiArIHF1b3RlICsgImAsIGV4cGVjdGVkIGAnYCBvciBgXCJgIik7CiAgfQogIGNvbnN0IHN0YXRlMTAgPSB7CiAgICBvbmU6IG9uZTIsCiAgICBhbGw6IGFsbDIsCiAgICBzZXR0aW5nczogewogICAgICBvbWl0T3B0aW9uYWxUYWdzOiBvcHRpb25zXy5vbWl0T3B0aW9uYWxUYWdzIHx8IGZhbHNlLAogICAgICBhbGxvd1BhcnNlRXJyb3JzOiBvcHRpb25zXy5hbGxvd1BhcnNlRXJyb3JzIHx8IGZhbHNlLAogICAgICBhbGxvd0Rhbmdlcm91c0NoYXJhY3RlcnM6IG9wdGlvbnNfLmFsbG93RGFuZ2Vyb3VzQ2hhcmFjdGVycyB8fCBmYWxzZSwKICAgICAgcXVvdGVTbWFydDogb3B0aW9uc18ucXVvdGVTbWFydCB8fCBmYWxzZSwKICAgICAgcHJlZmVyVW5xdW90ZWQ6IG9wdGlvbnNfLnByZWZlclVucXVvdGVkIHx8IGZhbHNlLAogICAgICB0aWdodEF0dHJpYnV0ZXM6IG9wdGlvbnNfLnRpZ2h0QXR0cmlidXRlcyB8fCBmYWxzZSwKICAgICAgdXBwZXJEb2N0eXBlOiBvcHRpb25zXy51cHBlckRvY3R5cGUgfHwgZmFsc2UsCiAgICAgIHRpZ2h0RG9jdHlwZTogb3B0aW9uc18udGlnaHREb2N0eXBlIHx8IGZhbHNlLAogICAgICBib2d1c0NvbW1lbnRzOiBvcHRpb25zXy5ib2d1c0NvbW1lbnRzIHx8IGZhbHNlLAogICAgICB0aWdodENvbW1hU2VwYXJhdGVkTGlzdHM6IG9wdGlvbnNfLnRpZ2h0Q29tbWFTZXBhcmF0ZWRMaXN0cyB8fCBmYWxzZSwKICAgICAgdGlnaHRTZWxmQ2xvc2luZzogb3B0aW9uc18udGlnaHRTZWxmQ2xvc2luZyB8fCBmYWxzZSwKICAgICAgY29sbGFwc2VFbXB0eUF0dHJpYnV0ZXM6IG9wdGlvbnNfLmNvbGxhcHNlRW1wdHlBdHRyaWJ1dGVzIHx8IGZhbHNlLAogICAgICBhbGxvd0Rhbmdlcm91c0h0bWw6IG9wdGlvbnNfLmFsbG93RGFuZ2Vyb3VzSHRtbCB8fCBmYWxzZSwKICAgICAgdm9pZHM6IG9wdGlvbnNfLnZvaWRzIHx8IGh0bWxWb2lkRWxlbWVudHMsCiAgICAgIGNoYXJhY3RlclJlZmVyZW5jZXM6IG9wdGlvbnNfLmNoYXJhY3RlclJlZmVyZW5jZXMgfHwgZW1wdHlDaGFyYWN0ZXJSZWZlcmVuY2VzLAogICAgICBjbG9zZVNlbGZDbG9zaW5nOiBvcHRpb25zXy5jbG9zZVNlbGZDbG9zaW5nIHx8IGZhbHNlLAogICAgICBjbG9zZUVtcHR5RWxlbWVudHM6IG9wdGlvbnNfLmNsb3NlRW1wdHlFbGVtZW50cyB8fCBmYWxzZQogICAgfSwKICAgIHNjaGVtYTogb3B0aW9uc18uc3BhY2UgPT09ICJzdmciID8gc3ZnMiA6IGh0bWw0LAogICAgcXVvdGUsCiAgICBhbHRlcm5hdGl2ZQogIH07CiAgcmV0dXJuIHN0YXRlMTAub25lKAogICAgQXJyYXkuaXNBcnJheSh0cmVlKSA/IHsgdHlwZTogInJvb3QiLCBjaGlsZHJlbjogdHJlZSB9IDogdHJlZSwKICAgIHZvaWQgMCwKICAgIHZvaWQgMAogICk7Cn0KZnVuY3Rpb24gb25lMihub2RlMiwgaW5kZXgyLCBwYXJlbnQpIHsKICByZXR1cm4gaGFuZGxlMihub2RlMiwgaW5kZXgyLCBwYXJlbnQsIHRoaXMpOwp9CmZ1bmN0aW9uIGFsbDIocGFyZW50KSB7CiAgY29uc3QgcmVzdWx0cyA9IFtdOwogIGNvbnN0IGNoaWxkcmVuMiA9IHBhcmVudCAmJiBwYXJlbnQuY2hpbGRyZW4gfHwgZW1wdHlDaGlsZHJlbjI7CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IGNoaWxkcmVuMi5sZW5ndGgpIHsKICAgIHJlc3VsdHNbaW5kZXgyXSA9IHRoaXMub25lKGNoaWxkcmVuMltpbmRleDJdLCBpbmRleDIsIHBhcmVudCk7CiAgfQogIHJldHVybiByZXN1bHRzLmpvaW4oIiIpOwp9CnZhciBlbXB0eU9wdGlvbnM2LCBlbXB0eUNoYXJhY3RlclJlZmVyZW5jZXMsIGVtcHR5Q2hpbGRyZW4yOwp2YXIgaW5pdF9saWIzMCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvaW5kZXguanMiKCkgewogICAgaW5pdF9odG1sX3ZvaWRfZWxlbWVudHMoKTsKICAgIGluaXRfcHJvcGVydHlfaW5mb3JtYXRpb24oKTsKICAgIGluaXRfaGFuZGxlMigpOwogICAgZW1wdHlPcHRpb25zNiA9IHt9OwogICAgZW1wdHlDaGFyYWN0ZXJSZWZlcmVuY2VzID0ge307CiAgICBlbXB0eUNoaWxkcmVuMiA9IFtdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2luZGV4LmpzCnZhciBpbml0X2hhc3RfdXRpbF90b19odG1sID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliMzAoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1odG1sQDE2LjAuMS9ub2RlX21vZHVsZXMvcmVtYXJrLWh0bWwvbGliL2luZGV4LmpzCmZ1bmN0aW9uIHJlbWFya0h0bWwob3B0aW9ucykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBjb25zdCB7IGhhbmRsZXJzOiBoYW5kbGVyczIsIHNhbml0aXplOiBjbGVhbiwgLi4udG9IdG1sT3B0aW9ucyB9ID0gb3B0aW9ucyB8fCBlbXB0eU9wdGlvbnM3OwogIGxldCBhbGxvd0Rhbmdlcm91c0h0bWwgPSBmYWxzZTsKICBsZXQgc2NoZW1hOwogIGlmICh0eXBlb2YgY2xlYW4gPT09ICJib29sZWFuIikgewogICAgYWxsb3dEYW5nZXJvdXNIdG1sID0gIWNsZWFuOwogIH0gZWxzZSBpZiAoY2xlYW4pIHsKICAgIHNjaGVtYSA9IGNsZWFuOwogIH0KICBzZWxmMi5jb21waWxlciA9IGNvbXBpbGVyMjsKICBmdW5jdGlvbiBjb21waWxlcjIodHJlZSwgZmlsZSkgewogICAgY29uc3QgaGFzdCA9IHRvSGFzdCh0cmVlLCB7IGhhbmRsZXJzOiBoYW5kbGVyczIsIGFsbG93RGFuZ2Vyb3VzSHRtbCB9KTsKICAgIGNvbnN0IHNhZmVIYXN0ID0gYWxsb3dEYW5nZXJvdXNIdG1sID8gaGFzdCA6IHNhbml0aXplKGhhc3QsIHNjaGVtYSk7CiAgICBjb25zdCByZXN1bHQgPSB0b0h0bWwoc2FmZUhhc3QsIHsgLi4udG9IdG1sT3B0aW9ucywgYWxsb3dEYW5nZXJvdXNIdG1sIH0pOwogICAgaWYgKGZpbGUuZXh0bmFtZSkgewogICAgICBmaWxlLmV4dG5hbWUgPSAiLmh0bWwiOwogICAgfQogICAgcmV0dXJuIHRyZWUgJiYgdHJlZS50eXBlID09PSAicm9vdCIgJiYgcmVzdWx0ICYmIC9bXlxyXG5dLy50ZXN0KHJlc3VsdC5jaGFyQXQocmVzdWx0Lmxlbmd0aCAtIDEpKSA/IHJlc3VsdCArICJcbiIgOiByZXN1bHQ7CiAgfQp9CnZhciBlbXB0eU9wdGlvbnM3Owp2YXIgaW5pdF9saWIzMSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1odG1sQDE2LjAuMS9ub2RlX21vZHVsZXMvcmVtYXJrLWh0bWwvbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfaGFzdF91dGlsX3Nhbml0aXplKCk7CiAgICBpbml0X21kYXN0X3V0aWxfdG9faGFzdCgpOwogICAgaW5pdF9oYXN0X3V0aWxfdG9faHRtbCgpOwogICAgZW1wdHlPcHRpb25zNyA9IHt9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcmVtYXJrLWh0bWxAMTYuMC4xL25vZGVfbW9kdWxlcy9yZW1hcmstaHRtbC9pbmRleC5qcwp2YXIgaW5pdF9yZW1hcmtfaHRtbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1odG1sQDE2LjAuMS9ub2RlX21vZHVsZXMvcmVtYXJrLWh0bWwvaW5kZXguanMiKCkgewogICAgaW5pdF9saWIzMSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcmVtYXJrLXN0cmluZ2lmeUAxMS4wLjAvbm9kZV9tb2R1bGVzL3JlbWFyay1zdHJpbmdpZnkvbGliL2luZGV4LmpzCmZ1bmN0aW9uIHJlbWFya1N0cmluZ2lmeShvcHRpb25zKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHNlbGYyLmNvbXBpbGVyID0gY29tcGlsZXIyOwogIGZ1bmN0aW9uIGNvbXBpbGVyMih0cmVlKSB7CiAgICByZXR1cm4gdG9NYXJrZG93bih0cmVlLCB7CiAgICAgIC4uLnNlbGYyLmRhdGEoInNldHRpbmdzIiksCiAgICAgIC4uLm9wdGlvbnMsCiAgICAgIC8vIE5vdGU6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbiB0aGUgcmVhZG1lLgogICAgICAvLyBUaGUgZ29hbCBpcyBmb3IgaXQgdG8gYmUgc2V0IGJ5IHBsdWdpbnMgb24gYGRhdGFgIGluc3RlYWQgb2YgYmVpbmcKICAgICAgLy8gcGFzc2VkIGJ5IHVzZXJzLgogICAgICBleHRlbnNpb25zOiBzZWxmMi5kYXRhKCJ0b01hcmtkb3duRXh0ZW5zaW9ucyIpIHx8IFtdCiAgICB9KTsKICB9Cn0KdmFyIGluaXRfbGliMzIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstc3RyaW5naWZ5QDExLjAuMC9ub2RlX21vZHVsZXMvcmVtYXJrLXN0cmluZ2lmeS9saWIvaW5kZXguanMiKCkgewogICAgaW5pdF9tZGFzdF91dGlsX3RvX21hcmtkb3duKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstc3RyaW5naWZ5QDExLjAuMC9ub2RlX21vZHVsZXMvcmVtYXJrLXN0cmluZ2lmeS9pbmRleC5qcwp2YXIgaW5pdF9yZW1hcmtfc3RyaW5naWZ5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcmVtYXJrLXN0cmluZ2lmeUAxMS4wLjAvbm9kZV9tb2R1bGVzL3JlbWFyay1zdHJpbmdpZnkvaW5kZXguanMiKCkgewogICAgaW5pdF9saWIzMigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdHVybmRvd25ANy4yLjIvbm9kZV9tb2R1bGVzL3R1cm5kb3duL2xpYi90dXJuZG93bi5icm93c2VyLmVzLmpzCmZ1bmN0aW9uIGV4dGVuZDIoZGVzdGluYXRpb24pIHsKICBmb3IgKHZhciBpMTEgPSAxOyBpMTEgPCBhcmd1bWVudHMubGVuZ3RoOyBpMTErKykgewogICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpMTFdOwogICAgZm9yICh2YXIga2V5MiBpbiBzb3VyY2UpIHsKICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkyKSkgZGVzdGluYXRpb25ba2V5Ml0gPSBzb3VyY2Vba2V5Ml07CiAgICB9CiAgfQogIHJldHVybiBkZXN0aW5hdGlvbjsKfQpmdW5jdGlvbiByZXBlYXQyKGNoYXJhY3RlciwgY291bnQyKSB7CiAgcmV0dXJuIEFycmF5KGNvdW50MiArIDEpLmpvaW4oY2hhcmFjdGVyKTsKfQpmdW5jdGlvbiB0cmltTGVhZGluZ05ld2xpbmVzKHN0cmluZzMpIHsKICByZXR1cm4gc3RyaW5nMy5yZXBsYWNlKC9eXG4qLywgIiIpOwp9CmZ1bmN0aW9uIHRyaW1UcmFpbGluZ05ld2xpbmVzKHN0cmluZzMpIHsKICB2YXIgaW5kZXhFbmQgPSBzdHJpbmczLmxlbmd0aDsKICB3aGlsZSAoaW5kZXhFbmQgPiAwICYmIHN0cmluZzNbaW5kZXhFbmQgLSAxXSA9PT0gIlxuIikgaW5kZXhFbmQtLTsKICByZXR1cm4gc3RyaW5nMy5zdWJzdHJpbmcoMCwgaW5kZXhFbmQpOwp9CmZ1bmN0aW9uIHRyaW1OZXdsaW5lcyhzdHJpbmczKSB7CiAgcmV0dXJuIHRyaW1UcmFpbGluZ05ld2xpbmVzKHRyaW1MZWFkaW5nTmV3bGluZXMoc3RyaW5nMykpOwp9CmZ1bmN0aW9uIGlzQmxvY2sobm9kZTIpIHsKICByZXR1cm4gaXMyKG5vZGUyLCBibG9ja0VsZW1lbnRzKTsKfQpmdW5jdGlvbiBpc1ZvaWQobm9kZTIpIHsKICByZXR1cm4gaXMyKG5vZGUyLCB2b2lkRWxlbWVudHMpOwp9CmZ1bmN0aW9uIGhhc1ZvaWQobm9kZTIpIHsKICByZXR1cm4gaGFzKG5vZGUyLCB2b2lkRWxlbWVudHMpOwp9CmZ1bmN0aW9uIGlzTWVhbmluZ2Z1bFdoZW5CbGFuayhub2RlMikgewogIHJldHVybiBpczIobm9kZTIsIG1lYW5pbmdmdWxXaGVuQmxhbmtFbGVtZW50cyk7Cn0KZnVuY3Rpb24gaGFzTWVhbmluZ2Z1bFdoZW5CbGFuayhub2RlMikgewogIHJldHVybiBoYXMobm9kZTIsIG1lYW5pbmdmdWxXaGVuQmxhbmtFbGVtZW50cyk7Cn0KZnVuY3Rpb24gaXMyKG5vZGUyLCB0YWdOYW1lcykgewogIHJldHVybiB0YWdOYW1lcy5pbmRleE9mKG5vZGUyLm5vZGVOYW1lKSA+PSAwOwp9CmZ1bmN0aW9uIGhhcyhub2RlMiwgdGFnTmFtZXMpIHsKICByZXR1cm4gbm9kZTIuZ2V0RWxlbWVudHNCeVRhZ05hbWUgJiYgdGFnTmFtZXMuc29tZShmdW5jdGlvbih0YWdOYW1lKSB7CiAgICByZXR1cm4gbm9kZTIuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSkubGVuZ3RoOwogIH0pOwp9CmZ1bmN0aW9uIGNsZWFuQXR0cmlidXRlKGF0dHJpYnV0ZSkgewogIHJldHVybiBhdHRyaWJ1dGUgPyBhdHRyaWJ1dGUucmVwbGFjZSgvKFxuK1xzKikrL2csICJcbiIpIDogIiI7Cn0KZnVuY3Rpb24gUnVsZXMob3B0aW9ucykgewogIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgdGhpcy5fa2VlcCA9IFtdOwogIHRoaXMuX3JlbW92ZSA9IFtdOwogIHRoaXMuYmxhbmtSdWxlID0gewogICAgcmVwbGFjZW1lbnQ6IG9wdGlvbnMuYmxhbmtSZXBsYWNlbWVudAogIH07CiAgdGhpcy5rZWVwUmVwbGFjZW1lbnQgPSBvcHRpb25zLmtlZXBSZXBsYWNlbWVudDsKICB0aGlzLmRlZmF1bHRSdWxlID0gewogICAgcmVwbGFjZW1lbnQ6IG9wdGlvbnMuZGVmYXVsdFJlcGxhY2VtZW50CiAgfTsKICB0aGlzLmFycmF5ID0gW107CiAgZm9yICh2YXIga2V5MiBpbiBvcHRpb25zLnJ1bGVzKSB0aGlzLmFycmF5LnB1c2gob3B0aW9ucy5ydWxlc1trZXkyXSk7Cn0KZnVuY3Rpb24gZmluZFJ1bGUocnVsZXMzLCBub2RlMiwgb3B0aW9ucykgewogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IHJ1bGVzMy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YXIgcnVsZSA9IHJ1bGVzM1tpMTFdOwogICAgaWYgKGZpbHRlclZhbHVlKHJ1bGUsIG5vZGUyLCBvcHRpb25zKSkgcmV0dXJuIHJ1bGU7CiAgfQogIHJldHVybiB2b2lkIDA7Cn0KZnVuY3Rpb24gZmlsdGVyVmFsdWUocnVsZSwgbm9kZTIsIG9wdGlvbnMpIHsKICB2YXIgZmlsdGVyMiA9IHJ1bGUuZmlsdGVyOwogIGlmICh0eXBlb2YgZmlsdGVyMiA9PT0gInN0cmluZyIpIHsKICAgIGlmIChmaWx0ZXIyID09PSBub2RlMi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSByZXR1cm4gdHJ1ZTsKICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyMikpIHsKICAgIGlmIChmaWx0ZXIyLmluZGV4T2Yobm9kZTIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgPiAtMSkgcmV0dXJuIHRydWU7CiAgfSBlbHNlIGlmICh0eXBlb2YgZmlsdGVyMiA9PT0gImZ1bmN0aW9uIikgewogICAgaWYgKGZpbHRlcjIuY2FsbChydWxlLCBub2RlMiwgb3B0aW9ucykpIHJldHVybiB0cnVlOwogIH0gZWxzZSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJgZmlsdGVyYCBuZWVkcyB0byBiZSBhIHN0cmluZywgYXJyYXksIG9yIGZ1bmN0aW9uIik7CiAgfQp9CmZ1bmN0aW9uIGNvbGxhcHNlV2hpdGVzcGFjZShvcHRpb25zKSB7CiAgdmFyIGVsZW1lbnQ0ID0gb3B0aW9ucy5lbGVtZW50OwogIHZhciBpc0Jsb2NrMiA9IG9wdGlvbnMuaXNCbG9jazsKICB2YXIgaXNWb2lkMiA9IG9wdGlvbnMuaXNWb2lkOwogIHZhciBpc1ByZSA9IG9wdGlvbnMuaXNQcmUgfHwgZnVuY3Rpb24obm9kZTMpIHsKICAgIHJldHVybiBub2RlMy5ub2RlTmFtZSA9PT0gIlBSRSI7CiAgfTsKICBpZiAoIWVsZW1lbnQ0LmZpcnN0Q2hpbGQgfHwgaXNQcmUoZWxlbWVudDQpKSByZXR1cm47CiAgdmFyIHByZXZUZXh0ID0gbnVsbDsKICB2YXIga2VlcExlYWRpbmdXcyA9IGZhbHNlOwogIHZhciBwcmV2ID0gbnVsbDsKICB2YXIgbm9kZTIgPSBuZXh0KHByZXYsIGVsZW1lbnQ0LCBpc1ByZSk7CiAgd2hpbGUgKG5vZGUyICE9PSBlbGVtZW50NCkgewogICAgaWYgKG5vZGUyLm5vZGVUeXBlID09PSAzIHx8IG5vZGUyLm5vZGVUeXBlID09PSA0KSB7CiAgICAgIHZhciB0ZXh0OSA9IG5vZGUyLmRhdGEucmVwbGFjZSgvWyBcclxuXHRdKy9nLCAiICIpOwogICAgICBpZiAoKCFwcmV2VGV4dCB8fCAvICQvLnRlc3QocHJldlRleHQuZGF0YSkpICYmICFrZWVwTGVhZGluZ1dzICYmIHRleHQ5WzBdID09PSAiICIpIHsKICAgICAgICB0ZXh0OSA9IHRleHQ5LnN1YnN0cigxKTsKICAgICAgfQogICAgICBpZiAoIXRleHQ5KSB7CiAgICAgICAgbm9kZTIgPSByZW1vdmUobm9kZTIpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIG5vZGUyLmRhdGEgPSB0ZXh0OTsKICAgICAgcHJldlRleHQgPSBub2RlMjsKICAgIH0gZWxzZSBpZiAobm9kZTIubm9kZVR5cGUgPT09IDEpIHsKICAgICAgaWYgKGlzQmxvY2syKG5vZGUyKSB8fCBub2RlMi5ub2RlTmFtZSA9PT0gIkJSIikgewogICAgICAgIGlmIChwcmV2VGV4dCkgewogICAgICAgICAgcHJldlRleHQuZGF0YSA9IHByZXZUZXh0LmRhdGEucmVwbGFjZSgvICQvLCAiIik7CiAgICAgICAgfQogICAgICAgIHByZXZUZXh0ID0gbnVsbDsKICAgICAgICBrZWVwTGVhZGluZ1dzID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAoaXNWb2lkMihub2RlMikgfHwgaXNQcmUobm9kZTIpKSB7CiAgICAgICAgcHJldlRleHQgPSBudWxsOwogICAgICAgIGtlZXBMZWFkaW5nV3MgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKHByZXZUZXh0KSB7CiAgICAgICAga2VlcExlYWRpbmdXcyA9IGZhbHNlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBub2RlMiA9IHJlbW92ZShub2RlMik7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgdmFyIG5leHROb2RlID0gbmV4dChwcmV2LCBub2RlMiwgaXNQcmUpOwogICAgcHJldiA9IG5vZGUyOwogICAgbm9kZTIgPSBuZXh0Tm9kZTsKICB9CiAgaWYgKHByZXZUZXh0KSB7CiAgICBwcmV2VGV4dC5kYXRhID0gcHJldlRleHQuZGF0YS5yZXBsYWNlKC8gJC8sICIiKTsKICAgIGlmICghcHJldlRleHQuZGF0YSkgewogICAgICByZW1vdmUocHJldlRleHQpOwogICAgfQogIH0KfQpmdW5jdGlvbiByZW1vdmUobm9kZTIpIHsKICB2YXIgbmV4dDIgPSBub2RlMi5uZXh0U2libGluZyB8fCBub2RlMi5wYXJlbnROb2RlOwogIG5vZGUyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZTIpOwogIHJldHVybiBuZXh0MjsKfQpmdW5jdGlvbiBuZXh0KHByZXYsIGN1cnJlbnQsIGlzUHJlKSB7CiAgaWYgKHByZXYgJiYgcHJldi5wYXJlbnROb2RlID09PSBjdXJyZW50IHx8IGlzUHJlKGN1cnJlbnQpKSB7CiAgICByZXR1cm4gY3VycmVudC5uZXh0U2libGluZyB8fCBjdXJyZW50LnBhcmVudE5vZGU7CiAgfQogIHJldHVybiBjdXJyZW50LmZpcnN0Q2hpbGQgfHwgY3VycmVudC5uZXh0U2libGluZyB8fCBjdXJyZW50LnBhcmVudE5vZGU7Cn0KZnVuY3Rpb24gY2FuUGFyc2VIVE1MTmF0aXZlbHkoKSB7CiAgdmFyIFBhcnNlcjIgPSByb290NS5ET01QYXJzZXI7CiAgdmFyIGNhblBhcnNlID0gZmFsc2U7CiAgdHJ5IHsKICAgIGlmIChuZXcgUGFyc2VyMigpLnBhcnNlRnJvbVN0cmluZygiIiwgInRleHQvaHRtbCIpKSB7CiAgICAgIGNhblBhcnNlID0gdHJ1ZTsKICAgIH0KICB9IGNhdGNoIChlMTEpIHsKICB9CiAgcmV0dXJuIGNhblBhcnNlOwp9CmZ1bmN0aW9uIGNyZWF0ZUhUTUxQYXJzZXIoKSB7CiAgdmFyIFBhcnNlcjIgPSBmdW5jdGlvbigpIHsKICB9OwogIHsKICAgIGlmIChzaG91bGRVc2VBY3RpdmVYKCkpIHsKICAgICAgUGFyc2VyMi5wcm90b3R5cGUucGFyc2VGcm9tU3RyaW5nID0gZnVuY3Rpb24oc3RyaW5nMykgewogICAgICAgIHZhciBkb2MgPSBuZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoImh0bWxmaWxlIik7CiAgICAgICAgZG9jLmRlc2lnbk1vZGUgPSAib24iOwogICAgICAgIGRvYy5vcGVuKCk7CiAgICAgICAgZG9jLndyaXRlKHN0cmluZzMpOwogICAgICAgIGRvYy5jbG9zZSgpOwogICAgICAgIHJldHVybiBkb2M7CiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICBQYXJzZXIyLnByb3RvdHlwZS5wYXJzZUZyb21TdHJpbmcgPSBmdW5jdGlvbihzdHJpbmczKSB7CiAgICAgICAgdmFyIGRvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIik7CiAgICAgICAgZG9jLm9wZW4oKTsKICAgICAgICBkb2Mud3JpdGUoc3RyaW5nMyk7CiAgICAgICAgZG9jLmNsb3NlKCk7CiAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgfTsKICAgIH0KICB9CiAgcmV0dXJuIFBhcnNlcjI7Cn0KZnVuY3Rpb24gc2hvdWxkVXNlQWN0aXZlWCgpIHsKICB2YXIgdXNlQWN0aXZlWCA9IGZhbHNlOwogIHRyeSB7CiAgICBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLm9wZW4oKTsKICB9IGNhdGNoIChlMTEpIHsKICAgIGlmIChyb290NS5BY3RpdmVYT2JqZWN0KSB1c2VBY3RpdmVYID0gdHJ1ZTsKICB9CiAgcmV0dXJuIHVzZUFjdGl2ZVg7Cn0KZnVuY3Rpb24gUm9vdE5vZGUoaW5wdXQsIG9wdGlvbnMpIHsKICB2YXIgcm9vdDY7CiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gInN0cmluZyIpIHsKICAgIHZhciBkb2MgPSBodG1sUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKAogICAgICAvLyBET00gcGFyc2VycyBhcnJhbmdlIGVsZW1lbnRzIGluIHRoZSA8aGVhZD4gYW5kIDxib2R5Pi4KICAgICAgLy8gV3JhcHBpbmcgaW4gYSBjdXN0b20gZWxlbWVudCBlbnN1cmVzIGVsZW1lbnRzIGFyZSByZWxpYWJseSBhcnJhbmdlZCBpbgogICAgICAvLyBhIHNpbmdsZSBlbGVtZW50LgogICAgICAnPHgtdHVybmRvd24gaWQ9InR1cm5kb3duLXJvb3QiPicgKyBpbnB1dCArICI8L3gtdHVybmRvd24+IiwKICAgICAgInRleHQvaHRtbCIKICAgICk7CiAgICByb290NiA9IGRvYy5nZXRFbGVtZW50QnlJZCgidHVybmRvd24tcm9vdCIpOwogIH0gZWxzZSB7CiAgICByb290NiA9IGlucHV0LmNsb25lTm9kZSh0cnVlKTsKICB9CiAgY29sbGFwc2VXaGl0ZXNwYWNlKHsKICAgIGVsZW1lbnQ6IHJvb3Q2LAogICAgaXNCbG9jaywKICAgIGlzVm9pZCwKICAgIGlzUHJlOiBvcHRpb25zLnByZWZvcm1hdHRlZENvZGUgPyBpc1ByZU9yQ29kZSA6IG51bGwKICB9KTsKICByZXR1cm4gcm9vdDY7Cn0KZnVuY3Rpb24gaHRtbFBhcnNlcigpIHsKICBfaHRtbFBhcnNlciA9IF9odG1sUGFyc2VyIHx8IG5ldyBIVE1MUGFyc2VyKCk7CiAgcmV0dXJuIF9odG1sUGFyc2VyOwp9CmZ1bmN0aW9uIGlzUHJlT3JDb2RlKG5vZGUyKSB7CiAgcmV0dXJuIG5vZGUyLm5vZGVOYW1lID09PSAiUFJFIiB8fCBub2RlMi5ub2RlTmFtZSA9PT0gIkNPREUiOwp9CmZ1bmN0aW9uIE5vZGUyKG5vZGUyLCBvcHRpb25zKSB7CiAgbm9kZTIuaXNCbG9jayA9IGlzQmxvY2sobm9kZTIpOwogIG5vZGUyLmlzQ29kZSA9IG5vZGUyLm5vZGVOYW1lID09PSAiQ09ERSIgfHwgbm9kZTIucGFyZW50Tm9kZS5pc0NvZGU7CiAgbm9kZTIuaXNCbGFuayA9IGlzQmxhbmsobm9kZTIpOwogIG5vZGUyLmZsYW5raW5nV2hpdGVzcGFjZSA9IGZsYW5raW5nV2hpdGVzcGFjZShub2RlMiwgb3B0aW9ucyk7CiAgcmV0dXJuIG5vZGUyOwp9CmZ1bmN0aW9uIGlzQmxhbmsobm9kZTIpIHsKICByZXR1cm4gIWlzVm9pZChub2RlMikgJiYgIWlzTWVhbmluZ2Z1bFdoZW5CbGFuayhub2RlMikgJiYgL15ccyokL2kudGVzdChub2RlMi50ZXh0Q29udGVudCkgJiYgIWhhc1ZvaWQobm9kZTIpICYmICFoYXNNZWFuaW5nZnVsV2hlbkJsYW5rKG5vZGUyKTsKfQpmdW5jdGlvbiBmbGFua2luZ1doaXRlc3BhY2Uobm9kZTIsIG9wdGlvbnMpIHsKICBpZiAobm9kZTIuaXNCbG9jayB8fCBvcHRpb25zLnByZWZvcm1hdHRlZENvZGUgJiYgbm9kZTIuaXNDb2RlKSB7CiAgICByZXR1cm4geyBsZWFkaW5nOiAiIiwgdHJhaWxpbmc6ICIiIH07CiAgfQogIHZhciBlZGdlcyA9IGVkZ2VXaGl0ZXNwYWNlKG5vZGUyLnRleHRDb250ZW50KTsKICBpZiAoZWRnZXMubGVhZGluZ0FzY2lpICYmIGlzRmxhbmtlZEJ5V2hpdGVzcGFjZSgibGVmdCIsIG5vZGUyLCBvcHRpb25zKSkgewogICAgZWRnZXMubGVhZGluZyA9IGVkZ2VzLmxlYWRpbmdOb25Bc2NpaTsKICB9CiAgaWYgKGVkZ2VzLnRyYWlsaW5nQXNjaWkgJiYgaXNGbGFua2VkQnlXaGl0ZXNwYWNlKCJyaWdodCIsIG5vZGUyLCBvcHRpb25zKSkgewogICAgZWRnZXMudHJhaWxpbmcgPSBlZGdlcy50cmFpbGluZ05vbkFzY2lpOwogIH0KICByZXR1cm4geyBsZWFkaW5nOiBlZGdlcy5sZWFkaW5nLCB0cmFpbGluZzogZWRnZXMudHJhaWxpbmcgfTsKfQpmdW5jdGlvbiBlZGdlV2hpdGVzcGFjZShzdHJpbmczKSB7CiAgdmFyIG02ID0gc3RyaW5nMy5tYXRjaCgvXigoWyBcdFxyXG5dKikoXHMqKSkoPzooPz1cUylbXHNcU10qXFMpPygoXHMqPykoWyBcdFxyXG5dKikpJC8pOwogIHJldHVybiB7CiAgICBsZWFkaW5nOiBtNlsxXSwKICAgIC8vIHdob2xlIHN0cmluZyBmb3Igd2hpdGVzcGFjZS1vbmx5IHN0cmluZ3MKICAgIGxlYWRpbmdBc2NpaTogbTZbMl0sCiAgICBsZWFkaW5nTm9uQXNjaWk6IG02WzNdLAogICAgdHJhaWxpbmc6IG02WzRdLAogICAgLy8gZW1wdHkgZm9yIHdoaXRlc3BhY2Utb25seSBzdHJpbmdzCiAgICB0cmFpbGluZ05vbkFzY2lpOiBtNls1XSwKICAgIHRyYWlsaW5nQXNjaWk6IG02WzZdCiAgfTsKfQpmdW5jdGlvbiBpc0ZsYW5rZWRCeVdoaXRlc3BhY2Uoc2lkZSwgbm9kZTIsIG9wdGlvbnMpIHsKICB2YXIgc2libGluZzsKICB2YXIgcmVnRXhwOwogIHZhciBpc0ZsYW5rZWQ7CiAgaWYgKHNpZGUgPT09ICJsZWZ0IikgewogICAgc2libGluZyA9IG5vZGUyLnByZXZpb3VzU2libGluZzsKICAgIHJlZ0V4cCA9IC8gJC87CiAgfSBlbHNlIHsKICAgIHNpYmxpbmcgPSBub2RlMi5uZXh0U2libGluZzsKICAgIHJlZ0V4cCA9IC9eIC87CiAgfQogIGlmIChzaWJsaW5nKSB7CiAgICBpZiAoc2libGluZy5ub2RlVHlwZSA9PT0gMykgewogICAgICBpc0ZsYW5rZWQgPSByZWdFeHAudGVzdChzaWJsaW5nLm5vZGVWYWx1ZSk7CiAgICB9IGVsc2UgaWYgKG9wdGlvbnMucHJlZm9ybWF0dGVkQ29kZSAmJiBzaWJsaW5nLm5vZGVOYW1lID09PSAiQ09ERSIpIHsKICAgICAgaXNGbGFua2VkID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKHNpYmxpbmcubm9kZVR5cGUgPT09IDEgJiYgIWlzQmxvY2soc2libGluZykpIHsKICAgICAgaXNGbGFua2VkID0gcmVnRXhwLnRlc3Qoc2libGluZy50ZXh0Q29udGVudCk7CiAgICB9CiAgfQogIHJldHVybiBpc0ZsYW5rZWQ7Cn0KZnVuY3Rpb24gVHVybmRvd25TZXJ2aWNlKG9wdGlvbnMpIHsKICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHVybmRvd25TZXJ2aWNlKSkgcmV0dXJuIG5ldyBUdXJuZG93blNlcnZpY2Uob3B0aW9ucyk7CiAgdmFyIGRlZmF1bHRzID0gewogICAgcnVsZXMsCiAgICBoZWFkaW5nU3R5bGU6ICJzZXRleHQiLAogICAgaHI6ICIqICogKiIsCiAgICBidWxsZXRMaXN0TWFya2VyOiAiKiIsCiAgICBjb2RlQmxvY2tTdHlsZTogImluZGVudGVkIiwKICAgIGZlbmNlOiAiYGBgIiwKICAgIGVtRGVsaW1pdGVyOiAiXyIsCiAgICBzdHJvbmdEZWxpbWl0ZXI6ICIqKiIsCiAgICBsaW5rU3R5bGU6ICJpbmxpbmVkIiwKICAgIGxpbmtSZWZlcmVuY2VTdHlsZTogImZ1bGwiLAogICAgYnI6ICIgICIsCiAgICBwcmVmb3JtYXR0ZWRDb2RlOiBmYWxzZSwKICAgIGJsYW5rUmVwbGFjZW1lbnQ6IGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMikgewogICAgICByZXR1cm4gbm9kZTIuaXNCbG9jayA/ICJcblxuIiA6ICIiOwogICAgfSwKICAgIGtlZXBSZXBsYWNlbWVudDogZnVuY3Rpb24oY29udGVudDMsIG5vZGUyKSB7CiAgICAgIHJldHVybiBub2RlMi5pc0Jsb2NrID8gIlxuXG4iICsgbm9kZTIub3V0ZXJIVE1MICsgIlxuXG4iIDogbm9kZTIub3V0ZXJIVE1MOwogICAgfSwKICAgIGRlZmF1bHRSZXBsYWNlbWVudDogZnVuY3Rpb24oY29udGVudDMsIG5vZGUyKSB7CiAgICAgIHJldHVybiBub2RlMi5pc0Jsb2NrID8gIlxuXG4iICsgY29udGVudDMgKyAiXG5cbiIgOiBjb250ZW50MzsKICAgIH0KICB9OwogIHRoaXMub3B0aW9ucyA9IGV4dGVuZDIoe30sIGRlZmF1bHRzLCBvcHRpb25zKTsKICB0aGlzLnJ1bGVzID0gbmV3IFJ1bGVzKHRoaXMub3B0aW9ucyk7Cn0KZnVuY3Rpb24gcHJvY2VzczMocGFyZW50Tm9kZSkgewogIHZhciBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIHJlZHVjZTIuY2FsbChwYXJlbnROb2RlLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKG91dHB1dCwgbm9kZTIpIHsKICAgIG5vZGUyID0gbmV3IE5vZGUyKG5vZGUyLCBzZWxmMi5vcHRpb25zKTsKICAgIHZhciByZXBsYWNlbWVudCA9ICIiOwogICAgaWYgKG5vZGUyLm5vZGVUeXBlID09PSAzKSB7CiAgICAgIHJlcGxhY2VtZW50ID0gbm9kZTIuaXNDb2RlID8gbm9kZTIubm9kZVZhbHVlIDogc2VsZjIuZXNjYXBlKG5vZGUyLm5vZGVWYWx1ZSk7CiAgICB9IGVsc2UgaWYgKG5vZGUyLm5vZGVUeXBlID09PSAxKSB7CiAgICAgIHJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnRGb3JOb2RlLmNhbGwoc2VsZjIsIG5vZGUyKTsKICAgIH0KICAgIHJldHVybiBqb2luMyhvdXRwdXQsIHJlcGxhY2VtZW50KTsKICB9LCAiIik7Cn0KZnVuY3Rpb24gcG9zdFByb2Nlc3Mob3V0cHV0KSB7CiAgdmFyIHNlbGYyID0gdGhpczsKICB0aGlzLnJ1bGVzLmZvckVhY2goZnVuY3Rpb24ocnVsZSkgewogICAgaWYgKHR5cGVvZiBydWxlLmFwcGVuZCA9PT0gImZ1bmN0aW9uIikgewogICAgICBvdXRwdXQgPSBqb2luMyhvdXRwdXQsIHJ1bGUuYXBwZW5kKHNlbGYyLm9wdGlvbnMpKTsKICAgIH0KICB9KTsKICByZXR1cm4gb3V0cHV0LnJlcGxhY2UoL15bXHRcclxuXSsvLCAiIikucmVwbGFjZSgvW1x0XHJcblxzXSskLywgIiIpOwp9CmZ1bmN0aW9uIHJlcGxhY2VtZW50Rm9yTm9kZShub2RlMikgewogIHZhciBydWxlID0gdGhpcy5ydWxlcy5mb3JOb2RlKG5vZGUyKTsKICB2YXIgY29udGVudDMgPSBwcm9jZXNzMy5jYWxsKHRoaXMsIG5vZGUyKTsKICB2YXIgd2hpdGVzcGFjZTIgPSBub2RlMi5mbGFua2luZ1doaXRlc3BhY2U7CiAgaWYgKHdoaXRlc3BhY2UyLmxlYWRpbmcgfHwgd2hpdGVzcGFjZTIudHJhaWxpbmcpIGNvbnRlbnQzID0gY29udGVudDMudHJpbSgpOwogIHJldHVybiB3aGl0ZXNwYWNlMi5sZWFkaW5nICsgcnVsZS5yZXBsYWNlbWVudChjb250ZW50Mywgbm9kZTIsIHRoaXMub3B0aW9ucykgKyB3aGl0ZXNwYWNlMi50cmFpbGluZzsKfQpmdW5jdGlvbiBqb2luMyhvdXRwdXQsIHJlcGxhY2VtZW50KSB7CiAgdmFyIHMxID0gdHJpbVRyYWlsaW5nTmV3bGluZXMob3V0cHV0KTsKICB2YXIgczIyID0gdHJpbUxlYWRpbmdOZXdsaW5lcyhyZXBsYWNlbWVudCk7CiAgdmFyIG5scyA9IE1hdGgubWF4KG91dHB1dC5sZW5ndGggLSBzMS5sZW5ndGgsIHJlcGxhY2VtZW50Lmxlbmd0aCAtIHMyMi5sZW5ndGgpOwogIHZhciBzZXBhcmF0b3IgPSAiXG5cbiIuc3Vic3RyaW5nKDAsIG5scyk7CiAgcmV0dXJuIHMxICsgc2VwYXJhdG9yICsgczIyOwp9CmZ1bmN0aW9uIGNhbkNvbnZlcnQoaW5wdXQpIHsKICByZXR1cm4gaW5wdXQgIT0gbnVsbCAmJiAodHlwZW9mIGlucHV0ID09PSAic3RyaW5nIiB8fCBpbnB1dC5ub2RlVHlwZSAmJiAoaW5wdXQubm9kZVR5cGUgPT09IDEgfHwgaW5wdXQubm9kZVR5cGUgPT09IDkgfHwgaW5wdXQubm9kZVR5cGUgPT09IDExKSk7Cn0KdmFyIGJsb2NrRWxlbWVudHMsIHZvaWRFbGVtZW50cywgbWVhbmluZ2Z1bFdoZW5CbGFua0VsZW1lbnRzLCBydWxlcywgcm9vdDUsIEhUTUxQYXJzZXIsIF9odG1sUGFyc2VyLCByZWR1Y2UyLCBlc2NhcGVzLCB0dXJuZG93bl9icm93c2VyX2VzX2RlZmF1bHQ7CnZhciBpbml0X3R1cm5kb3duX2Jyb3dzZXJfZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS90dXJuZG93bkA3LjIuMi9ub2RlX21vZHVsZXMvdHVybmRvd24vbGliL3R1cm5kb3duLmJyb3dzZXIuZXMuanMiKCkgewogICAgYmxvY2tFbGVtZW50cyA9IFsKICAgICAgIkFERFJFU1MiLAogICAgICAiQVJUSUNMRSIsCiAgICAgICJBU0lERSIsCiAgICAgICJBVURJTyIsCiAgICAgICJCTE9DS1FVT1RFIiwKICAgICAgIkJPRFkiLAogICAgICAiQ0FOVkFTIiwKICAgICAgIkNFTlRFUiIsCiAgICAgICJERCIsCiAgICAgICJESVIiLAogICAgICAiRElWIiwKICAgICAgIkRMIiwKICAgICAgIkRUIiwKICAgICAgIkZJRUxEU0VUIiwKICAgICAgIkZJR0NBUFRJT04iLAogICAgICAiRklHVVJFIiwKICAgICAgIkZPT1RFUiIsCiAgICAgICJGT1JNIiwKICAgICAgIkZSQU1FU0VUIiwKICAgICAgIkgxIiwKICAgICAgIkgyIiwKICAgICAgIkgzIiwKICAgICAgIkg0IiwKICAgICAgIkg1IiwKICAgICAgIkg2IiwKICAgICAgIkhFQURFUiIsCiAgICAgICJIR1JPVVAiLAogICAgICAiSFIiLAogICAgICAiSFRNTCIsCiAgICAgICJJU0lOREVYIiwKICAgICAgIkxJIiwKICAgICAgIk1BSU4iLAogICAgICAiTUVOVSIsCiAgICAgICJOQVYiLAogICAgICAiTk9GUkFNRVMiLAogICAgICAiTk9TQ1JJUFQiLAogICAgICAiT0wiLAogICAgICAiT1VUUFVUIiwKICAgICAgIlAiLAogICAgICAiUFJFIiwKICAgICAgIlNFQ1RJT04iLAogICAgICAiVEFCTEUiLAogICAgICAiVEJPRFkiLAogICAgICAiVEQiLAogICAgICAiVEZPT1QiLAogICAgICAiVEgiLAogICAgICAiVEhFQUQiLAogICAgICAiVFIiLAogICAgICAiVUwiCiAgICBdOwogICAgdm9pZEVsZW1lbnRzID0gWwogICAgICAiQVJFQSIsCiAgICAgICJCQVNFIiwKICAgICAgIkJSIiwKICAgICAgIkNPTCIsCiAgICAgICJDT01NQU5EIiwKICAgICAgIkVNQkVEIiwKICAgICAgIkhSIiwKICAgICAgIklNRyIsCiAgICAgICJJTlBVVCIsCiAgICAgICJLRVlHRU4iLAogICAgICAiTElOSyIsCiAgICAgICJNRVRBIiwKICAgICAgIlBBUkFNIiwKICAgICAgIlNPVVJDRSIsCiAgICAgICJUUkFDSyIsCiAgICAgICJXQlIiCiAgICBdOwogICAgbWVhbmluZ2Z1bFdoZW5CbGFua0VsZW1lbnRzID0gWwogICAgICAiQSIsCiAgICAgICJUQUJMRSIsCiAgICAgICJUSEVBRCIsCiAgICAgICJUQk9EWSIsCiAgICAgICJURk9PVCIsCiAgICAgICJUSCIsCiAgICAgICJURCIsCiAgICAgICJJRlJBTUUiLAogICAgICAiU0NSSVBUIiwKICAgICAgIkFVRElPIiwKICAgICAgIlZJREVPIgogICAgXTsKICAgIHJ1bGVzID0ge307CiAgICBydWxlcy5wYXJhZ3JhcGggPSB7CiAgICAgIGZpbHRlcjogInAiLAogICAgICByZXBsYWNlbWVudDogZnVuY3Rpb24oY29udGVudDMpIHsKICAgICAgICByZXR1cm4gIlxuXG4iICsgY29udGVudDMgKyAiXG5cbiI7CiAgICAgIH0KICAgIH07CiAgICBydWxlcy5saW5lQnJlYWsgPSB7CiAgICAgIGZpbHRlcjogImJyIiwKICAgICAgcmVwbGFjZW1lbnQ6IGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMiwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBvcHRpb25zLmJyICsgIlxuIjsKICAgICAgfQogICAgfTsKICAgIHJ1bGVzLmhlYWRpbmcgPSB7CiAgICAgIGZpbHRlcjogWyJoMSIsICJoMiIsICJoMyIsICJoNCIsICJoNSIsICJoNiJdLAogICAgICByZXBsYWNlbWVudDogZnVuY3Rpb24oY29udGVudDMsIG5vZGUyLCBvcHRpb25zKSB7CiAgICAgICAgdmFyIGhMZXZlbCA9IE51bWJlcihub2RlMi5ub2RlTmFtZS5jaGFyQXQoMSkpOwogICAgICAgIGlmIChvcHRpb25zLmhlYWRpbmdTdHlsZSA9PT0gInNldGV4dCIgJiYgaExldmVsIDwgMykgewogICAgICAgICAgdmFyIHVuZGVybGluZSA9IHJlcGVhdDIoaExldmVsID09PSAxID8gIj0iIDogIi0iLCBjb250ZW50My5sZW5ndGgpOwogICAgICAgICAgcmV0dXJuICJcblxuIiArIGNvbnRlbnQzICsgIlxuIiArIHVuZGVybGluZSArICJcblxuIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuICJcblxuIiArIHJlcGVhdDIoIiMiLCBoTGV2ZWwpICsgIiAiICsgY29udGVudDMgKyAiXG5cbiI7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgcnVsZXMuYmxvY2txdW90ZSA9IHsKICAgICAgZmlsdGVyOiAiYmxvY2txdW90ZSIsCiAgICAgIHJlcGxhY2VtZW50OiBmdW5jdGlvbihjb250ZW50MykgewogICAgICAgIGNvbnRlbnQzID0gdHJpbU5ld2xpbmVzKGNvbnRlbnQzKS5yZXBsYWNlKC9eL2dtLCAiPiAiKTsKICAgICAgICByZXR1cm4gIlxuXG4iICsgY29udGVudDMgKyAiXG5cbiI7CiAgICAgIH0KICAgIH07CiAgICBydWxlcy5saXN0ID0gewogICAgICBmaWx0ZXI6IFsidWwiLCAib2wiXSwKICAgICAgcmVwbGFjZW1lbnQ6IGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMikgewogICAgICAgIHZhciBwYXJlbnQgPSBub2RlMi5wYXJlbnROb2RlOwogICAgICAgIGlmIChwYXJlbnQubm9kZU5hbWUgPT09ICJMSSIgJiYgcGFyZW50Lmxhc3RFbGVtZW50Q2hpbGQgPT09IG5vZGUyKSB7CiAgICAgICAgICByZXR1cm4gIlxuIiArIGNvbnRlbnQzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gIlxuXG4iICsgY29udGVudDMgKyAiXG5cbiI7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgcnVsZXMubGlzdEl0ZW0gPSB7CiAgICAgIGZpbHRlcjogImxpIiwKICAgICAgcmVwbGFjZW1lbnQ6IGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMiwgb3B0aW9ucykgewogICAgICAgIHZhciBwcmVmaXg0ID0gb3B0aW9ucy5idWxsZXRMaXN0TWFya2VyICsgIiAgICI7CiAgICAgICAgdmFyIHBhcmVudCA9IG5vZGUyLnBhcmVudE5vZGU7CiAgICAgICAgaWYgKHBhcmVudC5ub2RlTmFtZSA9PT0gIk9MIikgewogICAgICAgICAgdmFyIHN0YXJ0ID0gcGFyZW50LmdldEF0dHJpYnV0ZSgic3RhcnQiKTsKICAgICAgICAgIHZhciBpbmRleDIgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHBhcmVudC5jaGlsZHJlbiwgbm9kZTIpOwogICAgICAgICAgcHJlZml4NCA9IChzdGFydCA/IE51bWJlcihzdGFydCkgKyBpbmRleDIgOiBpbmRleDIgKyAxKSArICIuICAiOwogICAgICAgIH0KICAgICAgICB2YXIgaXNQYXJhZ3JhcGggPSAvXG4kLy50ZXN0KGNvbnRlbnQzKTsKICAgICAgICBjb250ZW50MyA9IHRyaW1OZXdsaW5lcyhjb250ZW50MykgKyAoaXNQYXJhZ3JhcGggPyAiXG4iIDogIiIpOwogICAgICAgIGNvbnRlbnQzID0gY29udGVudDMucmVwbGFjZSgvXG4vZ20sICJcbiIgKyAiICIucmVwZWF0KHByZWZpeDQubGVuZ3RoKSk7CiAgICAgICAgcmV0dXJuIHByZWZpeDQgKyBjb250ZW50MyArIChub2RlMi5uZXh0U2libGluZyA/ICJcbiIgOiAiIik7CiAgICAgIH0KICAgIH07CiAgICBydWxlcy5pbmRlbnRlZENvZGVCbG9jayA9IHsKICAgICAgZmlsdGVyOiBmdW5jdGlvbihub2RlMiwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBvcHRpb25zLmNvZGVCbG9ja1N0eWxlID09PSAiaW5kZW50ZWQiICYmIG5vZGUyLm5vZGVOYW1lID09PSAiUFJFIiAmJiBub2RlMi5maXJzdENoaWxkICYmIG5vZGUyLmZpcnN0Q2hpbGQubm9kZU5hbWUgPT09ICJDT0RFIjsKICAgICAgfSwKICAgICAgcmVwbGFjZW1lbnQ6IGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMiwgb3B0aW9ucykgewogICAgICAgIHJldHVybiAiXG5cbiAgICAiICsgbm9kZTIuZmlyc3RDaGlsZC50ZXh0Q29udGVudC5yZXBsYWNlKC9cbi9nLCAiXG4gICAgIikgKyAiXG5cbiI7CiAgICAgIH0KICAgIH07CiAgICBydWxlcy5mZW5jZWRDb2RlQmxvY2sgPSB7CiAgICAgIGZpbHRlcjogZnVuY3Rpb24obm9kZTIsIG9wdGlvbnMpIHsKICAgICAgICByZXR1cm4gb3B0aW9ucy5jb2RlQmxvY2tTdHlsZSA9PT0gImZlbmNlZCIgJiYgbm9kZTIubm9kZU5hbWUgPT09ICJQUkUiICYmIG5vZGUyLmZpcnN0Q2hpbGQgJiYgbm9kZTIuZmlyc3RDaGlsZC5ub2RlTmFtZSA9PT0gIkNPREUiOwogICAgICB9LAogICAgICByZXBsYWNlbWVudDogZnVuY3Rpb24oY29udGVudDMsIG5vZGUyLCBvcHRpb25zKSB7CiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IG5vZGUyLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8ICIiOwogICAgICAgIHZhciBsYW5ndWFnZSA9IChjbGFzc05hbWUubWF0Y2goL2xhbmd1YWdlLShcUyspLykgfHwgW251bGwsICIiXSlbMV07CiAgICAgICAgdmFyIGNvZGU0ID0gbm9kZTIuZmlyc3RDaGlsZC50ZXh0Q29udGVudDsKICAgICAgICB2YXIgZmVuY2VDaGFyID0gb3B0aW9ucy5mZW5jZS5jaGFyQXQoMCk7CiAgICAgICAgdmFyIGZlbmNlU2l6ZSA9IDM7CiAgICAgICAgdmFyIGZlbmNlSW5Db2RlUmVnZXggPSBuZXcgUmVnRXhwKCJeIiArIGZlbmNlQ2hhciArICJ7Myx9IiwgImdtIik7CiAgICAgICAgdmFyIG1hdGNoMjsKICAgICAgICB3aGlsZSAobWF0Y2gyID0gZmVuY2VJbkNvZGVSZWdleC5leGVjKGNvZGU0KSkgewogICAgICAgICAgaWYgKG1hdGNoMlswXS5sZW5ndGggPj0gZmVuY2VTaXplKSB7CiAgICAgICAgICAgIGZlbmNlU2l6ZSA9IG1hdGNoMlswXS5sZW5ndGggKyAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgZmVuY2UzID0gcmVwZWF0MihmZW5jZUNoYXIsIGZlbmNlU2l6ZSk7CiAgICAgICAgcmV0dXJuICJcblxuIiArIGZlbmNlMyArIGxhbmd1YWdlICsgIlxuIiArIGNvZGU0LnJlcGxhY2UoL1xuJC8sICIiKSArICJcbiIgKyBmZW5jZTMgKyAiXG5cbiI7CiAgICAgIH0KICAgIH07CiAgICBydWxlcy5ob3Jpem9udGFsUnVsZSA9IHsKICAgICAgZmlsdGVyOiAiaHIiLAogICAgICByZXBsYWNlbWVudDogZnVuY3Rpb24oY29udGVudDMsIG5vZGUyLCBvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuICJcblxuIiArIG9wdGlvbnMuaHIgKyAiXG5cbiI7CiAgICAgIH0KICAgIH07CiAgICBydWxlcy5pbmxpbmVMaW5rID0gewogICAgICBmaWx0ZXI6IGZ1bmN0aW9uKG5vZGUyLCBvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbnMubGlua1N0eWxlID09PSAiaW5saW5lZCIgJiYgbm9kZTIubm9kZU5hbWUgPT09ICJBIiAmJiBub2RlMi5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICAgICAgfSwKICAgICAgcmVwbGFjZW1lbnQ6IGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMikgewogICAgICAgIHZhciBocmVmID0gbm9kZTIuZ2V0QXR0cmlidXRlKCJocmVmIik7CiAgICAgICAgaWYgKGhyZWYpIGhyZWYgPSBocmVmLnJlcGxhY2UoLyhbKCldKS9nLCAiXFwkMSIpOwogICAgICAgIHZhciB0aXRsZSA9IGNsZWFuQXR0cmlidXRlKG5vZGUyLmdldEF0dHJpYnV0ZSgidGl0bGUiKSk7CiAgICAgICAgaWYgKHRpdGxlKSB0aXRsZSA9ICcgIicgKyB0aXRsZS5yZXBsYWNlKC8iL2csICdcXCInKSArICciJzsKICAgICAgICByZXR1cm4gIlsiICsgY29udGVudDMgKyAiXSgiICsgaHJlZiArIHRpdGxlICsgIikiOwogICAgICB9CiAgICB9OwogICAgcnVsZXMucmVmZXJlbmNlTGluayA9IHsKICAgICAgZmlsdGVyOiBmdW5jdGlvbihub2RlMiwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBvcHRpb25zLmxpbmtTdHlsZSA9PT0gInJlZmVyZW5jZWQiICYmIG5vZGUyLm5vZGVOYW1lID09PSAiQSIgJiYgbm9kZTIuZ2V0QXR0cmlidXRlKCJocmVmIik7CiAgICAgIH0sCiAgICAgIHJlcGxhY2VtZW50OiBmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgICAgICB2YXIgaHJlZiA9IG5vZGUyLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwogICAgICAgIHZhciB0aXRsZSA9IGNsZWFuQXR0cmlidXRlKG5vZGUyLmdldEF0dHJpYnV0ZSgidGl0bGUiKSk7CiAgICAgICAgaWYgKHRpdGxlKSB0aXRsZSA9ICcgIicgKyB0aXRsZSArICciJzsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQ7CiAgICAgICAgdmFyIHJlZmVyZW5jZTsKICAgICAgICBzd2l0Y2ggKG9wdGlvbnMubGlua1JlZmVyZW5jZVN0eWxlKSB7CiAgICAgICAgICBjYXNlICJjb2xsYXBzZWQiOgogICAgICAgICAgICByZXBsYWNlbWVudCA9ICJbIiArIGNvbnRlbnQzICsgIl1bXSI7CiAgICAgICAgICAgIHJlZmVyZW5jZSA9ICJbIiArIGNvbnRlbnQzICsgIl06ICIgKyBocmVmICsgdGl0bGU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAic2hvcnRjdXQiOgogICAgICAgICAgICByZXBsYWNlbWVudCA9ICJbIiArIGNvbnRlbnQzICsgIl0iOwogICAgICAgICAgICByZWZlcmVuY2UgPSAiWyIgKyBjb250ZW50MyArICJdOiAiICsgaHJlZiArIHRpdGxlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucmVmZXJlbmNlcy5sZW5ndGggKyAxOwogICAgICAgICAgICByZXBsYWNlbWVudCA9ICJbIiArIGNvbnRlbnQzICsgIl1bIiArIGlkICsgIl0iOwogICAgICAgICAgICByZWZlcmVuY2UgPSAiWyIgKyBpZCArICJdOiAiICsgaHJlZiArIHRpdGxlOwogICAgICAgIH0KICAgICAgICB0aGlzLnJlZmVyZW5jZXMucHVzaChyZWZlcmVuY2UpOwogICAgICAgIHJldHVybiByZXBsYWNlbWVudDsKICAgICAgfSwKICAgICAgcmVmZXJlbmNlczogW10sCiAgICAgIGFwcGVuZDogZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIHZhciByZWZlcmVuY2VzID0gIiI7CiAgICAgICAgaWYgKHRoaXMucmVmZXJlbmNlcy5sZW5ndGgpIHsKICAgICAgICAgIHJlZmVyZW5jZXMgPSAiXG5cbiIgKyB0aGlzLnJlZmVyZW5jZXMuam9pbigiXG4iKSArICJcblxuIjsKICAgICAgICAgIHRoaXMucmVmZXJlbmNlcyA9IFtdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVmZXJlbmNlczsKICAgICAgfQogICAgfTsKICAgIHJ1bGVzLmVtcGhhc2lzID0gewogICAgICBmaWx0ZXI6IFsiZW0iLCAiaSJdLAogICAgICByZXBsYWNlbWVudDogZnVuY3Rpb24oY29udGVudDMsIG5vZGUyLCBvcHRpb25zKSB7CiAgICAgICAgaWYgKCFjb250ZW50My50cmltKCkpIHJldHVybiAiIjsKICAgICAgICByZXR1cm4gb3B0aW9ucy5lbURlbGltaXRlciArIGNvbnRlbnQzICsgb3B0aW9ucy5lbURlbGltaXRlcjsKICAgICAgfQogICAgfTsKICAgIHJ1bGVzLnN0cm9uZyA9IHsKICAgICAgZmlsdGVyOiBbInN0cm9uZyIsICJiIl0sCiAgICAgIHJlcGxhY2VtZW50OiBmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgICAgICBpZiAoIWNvbnRlbnQzLnRyaW0oKSkgcmV0dXJuICIiOwogICAgICAgIHJldHVybiBvcHRpb25zLnN0cm9uZ0RlbGltaXRlciArIGNvbnRlbnQzICsgb3B0aW9ucy5zdHJvbmdEZWxpbWl0ZXI7CiAgICAgIH0KICAgIH07CiAgICBydWxlcy5jb2RlID0gewogICAgICBmaWx0ZXI6IGZ1bmN0aW9uKG5vZGUyKSB7CiAgICAgICAgdmFyIGhhc1NpYmxpbmdzID0gbm9kZTIucHJldmlvdXNTaWJsaW5nIHx8IG5vZGUyLm5leHRTaWJsaW5nOwogICAgICAgIHZhciBpc0NvZGVCbG9jayA9IG5vZGUyLnBhcmVudE5vZGUubm9kZU5hbWUgPT09ICJQUkUiICYmICFoYXNTaWJsaW5nczsKICAgICAgICByZXR1cm4gbm9kZTIubm9kZU5hbWUgPT09ICJDT0RFIiAmJiAhaXNDb2RlQmxvY2s7CiAgICAgIH0sCiAgICAgIHJlcGxhY2VtZW50OiBmdW5jdGlvbihjb250ZW50MykgewogICAgICAgIGlmICghY29udGVudDMpIHJldHVybiAiIjsKICAgICAgICBjb250ZW50MyA9IGNvbnRlbnQzLnJlcGxhY2UoL1xyP1xufFxyL2csICIgIik7CiAgICAgICAgdmFyIGV4dHJhU3BhY2UgPSAvXmB8XiAuKj9bXiBdLiogJHxgJC8udGVzdChjb250ZW50MykgPyAiICIgOiAiIjsKICAgICAgICB2YXIgZGVsaW1pdGVyID0gImAiOwogICAgICAgIHZhciBtYXRjaGVzID0gY29udGVudDMubWF0Y2goL2ArL2dtKSB8fCBbXTsKICAgICAgICB3aGlsZSAobWF0Y2hlcy5pbmRleE9mKGRlbGltaXRlcikgIT09IC0xKSBkZWxpbWl0ZXIgPSBkZWxpbWl0ZXIgKyAiYCI7CiAgICAgICAgcmV0dXJuIGRlbGltaXRlciArIGV4dHJhU3BhY2UgKyBjb250ZW50MyArIGV4dHJhU3BhY2UgKyBkZWxpbWl0ZXI7CiAgICAgIH0KICAgIH07CiAgICBydWxlcy5pbWFnZSA9IHsKICAgICAgZmlsdGVyOiAiaW1nIiwKICAgICAgcmVwbGFjZW1lbnQ6IGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMikgewogICAgICAgIHZhciBhbHQgPSBjbGVhbkF0dHJpYnV0ZShub2RlMi5nZXRBdHRyaWJ1dGUoImFsdCIpKTsKICAgICAgICB2YXIgc3JjID0gbm9kZTIuZ2V0QXR0cmlidXRlKCJzcmMiKSB8fCAiIjsKICAgICAgICB2YXIgdGl0bGUgPSBjbGVhbkF0dHJpYnV0ZShub2RlMi5nZXRBdHRyaWJ1dGUoInRpdGxlIikpOwogICAgICAgIHZhciB0aXRsZVBhcnQgPSB0aXRsZSA/ICcgIicgKyB0aXRsZSArICciJyA6ICIiOwogICAgICAgIHJldHVybiBzcmMgPyAiIVsiICsgYWx0ICsgIl0oIiArIHNyYyArIHRpdGxlUGFydCArICIpIiA6ICIiOwogICAgICB9CiAgICB9OwogICAgUnVsZXMucHJvdG90eXBlID0gewogICAgICBhZGQ6IGZ1bmN0aW9uKGtleTIsIHJ1bGUpIHsKICAgICAgICB0aGlzLmFycmF5LnVuc2hpZnQocnVsZSk7CiAgICAgIH0sCiAgICAgIGtlZXA6IGZ1bmN0aW9uKGZpbHRlcjIpIHsKICAgICAgICB0aGlzLl9rZWVwLnVuc2hpZnQoewogICAgICAgICAgZmlsdGVyOiBmaWx0ZXIyLAogICAgICAgICAgcmVwbGFjZW1lbnQ6IHRoaXMua2VlcFJlcGxhY2VtZW50CiAgICAgICAgfSk7CiAgICAgIH0sCiAgICAgIHJlbW92ZTogZnVuY3Rpb24oZmlsdGVyMikgewogICAgICAgIHRoaXMuX3JlbW92ZS51bnNoaWZ0KHsKICAgICAgICAgIGZpbHRlcjogZmlsdGVyMiwKICAgICAgICAgIHJlcGxhY2VtZW50OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9LAogICAgICBmb3JOb2RlOiBmdW5jdGlvbihub2RlMikgewogICAgICAgIGlmIChub2RlMi5pc0JsYW5rKSByZXR1cm4gdGhpcy5ibGFua1J1bGU7CiAgICAgICAgdmFyIHJ1bGU7CiAgICAgICAgaWYgKHJ1bGUgPSBmaW5kUnVsZSh0aGlzLmFycmF5LCBub2RlMiwgdGhpcy5vcHRpb25zKSkgcmV0dXJuIHJ1bGU7CiAgICAgICAgaWYgKHJ1bGUgPSBmaW5kUnVsZSh0aGlzLl9rZWVwLCBub2RlMiwgdGhpcy5vcHRpb25zKSkgcmV0dXJuIHJ1bGU7CiAgICAgICAgaWYgKHJ1bGUgPSBmaW5kUnVsZSh0aGlzLl9yZW1vdmUsIG5vZGUyLCB0aGlzLm9wdGlvbnMpKSByZXR1cm4gcnVsZTsKICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0UnVsZTsKICAgICAgfSwKICAgICAgZm9yRWFjaDogZnVuY3Rpb24oZm4pIHsKICAgICAgICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCB0aGlzLmFycmF5Lmxlbmd0aDsgaTExKyspIGZuKHRoaXMuYXJyYXlbaTExXSwgaTExKTsKICAgICAgfQogICAgfTsKICAgIHJvb3Q1ID0gdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5kb3cgOiB7fTsKICAgIEhUTUxQYXJzZXIgPSBjYW5QYXJzZUhUTUxOYXRpdmVseSgpID8gcm9vdDUuRE9NUGFyc2VyIDogY3JlYXRlSFRNTFBhcnNlcigpOwogICAgcmVkdWNlMiA9IEFycmF5LnByb3RvdHlwZS5yZWR1Y2U7CiAgICBlc2NhcGVzID0gWwogICAgICBbL1xcL2csICJcXFxcIl0sCiAgICAgIFsvXCovZywgIlxcKiJdLAogICAgICBbL14tL2csICJcXC0iXSwKICAgICAgWy9eXCsgL2csICJcXCsgIl0sCiAgICAgIFsvXig9KykvZywgIlxcJDEiXSwKICAgICAgWy9eKCN7MSw2fSkgL2csICJcXCQxICJdLAogICAgICBbL2AvZywgIlxcYCJdLAogICAgICBbL15+fn4vZywgIlxcfn5+Il0sCiAgICAgIFsvXFsvZywgIlxcWyJdLAogICAgICBbL1xdL2csICJcXF0iXSwKICAgICAgWy9ePi9nLCAiXFw+Il0sCiAgICAgIFsvXy9nLCAiXFxfIl0sCiAgICAgIFsvXihcZCspXC4gL2csICIkMVxcLiAiXQogICAgXTsKICAgIFR1cm5kb3duU2VydmljZS5wcm90b3R5cGUgPSB7CiAgICAgIC8qKgogICAgICAgKiBUaGUgZW50cnkgcG9pbnQgZm9yIGNvbnZlcnRpbmcgYSBzdHJpbmcgb3IgRE9NIG5vZGUgdG8gTWFya2Rvd24KICAgICAgICogQHB1YmxpYwogICAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gaW5wdXQgVGhlIHN0cmluZyBvciBET00gbm9kZSB0byBjb252ZXJ0CiAgICAgICAqIEByZXR1cm5zIEEgTWFya2Rvd24gcmVwcmVzZW50YXRpb24gb2YgdGhlIGlucHV0CiAgICAgICAqIEB0eXBlIFN0cmluZwogICAgICAgKi8KICAgICAgdHVybmRvd246IGZ1bmN0aW9uKGlucHV0KSB7CiAgICAgICAgaWYgKCFjYW5Db252ZXJ0KGlucHV0KSkgewogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgICAgICAgaW5wdXQgKyAiIGlzIG5vdCBhIHN0cmluZywgb3IgYW4gZWxlbWVudC9kb2N1bWVudC9mcmFnbWVudCBub2RlLiIKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmIChpbnB1dCA9PT0gIiIpIHJldHVybiAiIjsKICAgICAgICB2YXIgb3V0cHV0ID0gcHJvY2VzczMuY2FsbCh0aGlzLCBuZXcgUm9vdE5vZGUoaW5wdXQsIHRoaXMub3B0aW9ucykpOwogICAgICAgIHJldHVybiBwb3N0UHJvY2Vzcy5jYWxsKHRoaXMsIG91dHB1dCk7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBBZGQgb25lIG9yIG1vcmUgcGx1Z2lucwogICAgICAgKiBAcHVibGljCiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb258QXJyYXl9IHBsdWdpbiBUaGUgcGx1Z2luIG9yIGFycmF5IG9mIHBsdWdpbnMgdG8gYWRkCiAgICAgICAqIEByZXR1cm5zIFRoZSBUdXJuZG93biBpbnN0YW5jZSBmb3IgY2hhaW5pbmcKICAgICAgICogQHR5cGUgT2JqZWN0CiAgICAgICAqLwogICAgICB1c2U6IGZ1bmN0aW9uKHBsdWdpbikgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBsdWdpbikpIHsKICAgICAgICAgIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IHBsdWdpbi5sZW5ndGg7IGkxMSsrKSB0aGlzLnVzZShwbHVnaW5baTExXSk7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcGx1Z2luID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICBwbHVnaW4odGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoInBsdWdpbiBtdXN0IGJlIGEgRnVuY3Rpb24gb3IgYW4gQXJyYXkgb2YgRnVuY3Rpb25zIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LAogICAgICAvKioKICAgICAgICogQWRkcyBhIHJ1bGUKICAgICAgICogQHB1YmxpYwogICAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IFRoZSB1bmlxdWUga2V5IG9mIHRoZSBydWxlCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBydWxlIFRoZSBydWxlCiAgICAgICAqIEByZXR1cm5zIFRoZSBUdXJuZG93biBpbnN0YW5jZSBmb3IgY2hhaW5pbmcKICAgICAgICogQHR5cGUgT2JqZWN0CiAgICAgICAqLwogICAgICBhZGRSdWxlOiBmdW5jdGlvbihrZXkyLCBydWxlKSB7CiAgICAgICAgdGhpcy5ydWxlcy5hZGQoa2V5MiwgcnVsZSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBLZWVwIGEgbm9kZSAoYXMgSFRNTCkgdGhhdCBtYXRjaGVzIHRoZSBmaWx0ZXIKICAgICAgICogQHB1YmxpYwogICAgICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheXxGdW5jdGlvbn0gZmlsdGVyIFRoZSB1bmlxdWUga2V5IG9mIHRoZSBydWxlCiAgICAgICAqIEByZXR1cm5zIFRoZSBUdXJuZG93biBpbnN0YW5jZSBmb3IgY2hhaW5pbmcKICAgICAgICogQHR5cGUgT2JqZWN0CiAgICAgICAqLwogICAgICBrZWVwOiBmdW5jdGlvbihmaWx0ZXIyKSB7CiAgICAgICAgdGhpcy5ydWxlcy5rZWVwKGZpbHRlcjIpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LAogICAgICAvKioKICAgICAgICogUmVtb3ZlIGEgbm9kZSB0aGF0IG1hdGNoZXMgdGhlIGZpbHRlcgogICAgICAgKiBAcHVibGljCiAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fEZ1bmN0aW9ufSBmaWx0ZXIgVGhlIHVuaXF1ZSBrZXkgb2YgdGhlIHJ1bGUKICAgICAgICogQHJldHVybnMgVGhlIFR1cm5kb3duIGluc3RhbmNlIGZvciBjaGFpbmluZwogICAgICAgKiBAdHlwZSBPYmplY3QKICAgICAgICovCiAgICAgIHJlbW92ZTogZnVuY3Rpb24oZmlsdGVyMikgewogICAgICAgIHRoaXMucnVsZXMucmVtb3ZlKGZpbHRlcjIpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LAogICAgICAvKioKICAgICAgICogRXNjYXBlcyBNYXJrZG93biBzeW50YXgKICAgICAgICogQHB1YmxpYwogICAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gZXNjYXBlCiAgICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIHdpdGggTWFya2Rvd24gc3ludGF4IGVzY2FwZWQKICAgICAgICogQHR5cGUgU3RyaW5nCiAgICAgICAqLwogICAgICBlc2NhcGU6IGZ1bmN0aW9uKHN0cmluZzMpIHsKICAgICAgICByZXR1cm4gZXNjYXBlcy5yZWR1Y2UoZnVuY3Rpb24oYWNjdW11bGF0b3IsIGVzY2FwZSkgewogICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yLnJlcGxhY2UoZXNjYXBlWzBdLCBlc2NhcGVbMV0pOwogICAgICAgIH0sIHN0cmluZzMpOwogICAgICB9CiAgICB9OwogICAgdHVybmRvd25fYnJvd3Nlcl9lc19kZWZhdWx0ID0gVHVybmRvd25TZXJ2aWNlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdHVybmRvd24tcGx1Z2luLWdmbUAxLjAuMi9ub2RlX21vZHVsZXMvdHVybmRvd24tcGx1Z2luLWdmbS9saWIvdHVybmRvd24tcGx1Z2luLWdmbS5lcy5qcwp2YXIgdHVybmRvd25fcGx1Z2luX2dmbV9lc19leHBvcnRzID0ge307Cl9fZXhwb3J0KHR1cm5kb3duX3BsdWdpbl9nZm1fZXNfZXhwb3J0cywgewogIGdmbTogKCkgPT4gZ2ZtMiwKICBoaWdobGlnaHRlZENvZGVCbG9jazogKCkgPT4gaGlnaGxpZ2h0ZWRDb2RlQmxvY2ssCiAgc3RyaWtldGhyb3VnaDogKCkgPT4gc3RyaWtldGhyb3VnaDIsCiAgdGFibGVzOiAoKSA9PiB0YWJsZXMsCiAgdGFza0xpc3RJdGVtczogKCkgPT4gdGFza0xpc3RJdGVtcwp9KTsKZnVuY3Rpb24gaGlnaGxpZ2h0ZWRDb2RlQmxvY2sodHVybmRvd25TZXJ2aWNlKSB7CiAgdHVybmRvd25TZXJ2aWNlLmFkZFJ1bGUoImhpZ2hsaWdodGVkQ29kZUJsb2NrIiwgewogICAgZmlsdGVyOiBmdW5jdGlvbihub2RlMikgewogICAgICB2YXIgZmlyc3RDaGlsZCA9IG5vZGUyLmZpcnN0Q2hpbGQ7CiAgICAgIHJldHVybiBub2RlMi5ub2RlTmFtZSA9PT0gIkRJViIgJiYgaGlnaGxpZ2h0UmVnRXhwLnRlc3Qobm9kZTIuY2xhc3NOYW1lKSAmJiBmaXJzdENoaWxkICYmIGZpcnN0Q2hpbGQubm9kZU5hbWUgPT09ICJQUkUiOwogICAgfSwKICAgIHJlcGxhY2VtZW50OiBmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgICAgdmFyIGNsYXNzTmFtZSA9IG5vZGUyLmNsYXNzTmFtZSB8fCAiIjsKICAgICAgdmFyIGxhbmd1YWdlID0gKGNsYXNzTmFtZS5tYXRjaChoaWdobGlnaHRSZWdFeHApIHx8IFtudWxsLCAiIl0pWzFdOwogICAgICByZXR1cm4gIlxuXG4iICsgb3B0aW9ucy5mZW5jZSArIGxhbmd1YWdlICsgIlxuIiArIG5vZGUyLmZpcnN0Q2hpbGQudGV4dENvbnRlbnQgKyAiXG4iICsgb3B0aW9ucy5mZW5jZSArICJcblxuIjsKICAgIH0KICB9KTsKfQpmdW5jdGlvbiBzdHJpa2V0aHJvdWdoMih0dXJuZG93blNlcnZpY2UpIHsKICB0dXJuZG93blNlcnZpY2UuYWRkUnVsZSgic3RyaWtldGhyb3VnaCIsIHsKICAgIGZpbHRlcjogWyJkZWwiLCAicyIsICJzdHJpa2UiXSwKICAgIHJlcGxhY2VtZW50OiBmdW5jdGlvbihjb250ZW50MykgewogICAgICByZXR1cm4gIn4iICsgY29udGVudDMgKyAifiI7CiAgICB9CiAgfSk7Cn0KZnVuY3Rpb24gaXNIZWFkaW5nUm93KHRyMikgewogIHZhciBwYXJlbnROb2RlID0gdHIyLnBhcmVudE5vZGU7CiAgcmV0dXJuIHBhcmVudE5vZGUubm9kZU5hbWUgPT09ICJUSEVBRCIgfHwgcGFyZW50Tm9kZS5maXJzdENoaWxkID09PSB0cjIgJiYgKHBhcmVudE5vZGUubm9kZU5hbWUgPT09ICJUQUJMRSIgfHwgaXNGaXJzdFRib2R5KHBhcmVudE5vZGUpKSAmJiBldmVyeTIuY2FsbCh0cjIuY2hpbGROb2RlcywgZnVuY3Rpb24objEzKSB7CiAgICByZXR1cm4gbjEzLm5vZGVOYW1lID09PSAiVEgiOwogIH0pOwp9CmZ1bmN0aW9uIGlzRmlyc3RUYm9keShlbGVtZW50NCkgewogIHZhciBwcmV2aW91c1NpYmxpbmcgPSBlbGVtZW50NC5wcmV2aW91c1NpYmxpbmc7CiAgcmV0dXJuIGVsZW1lbnQ0Lm5vZGVOYW1lID09PSAiVEJPRFkiICYmICghcHJldmlvdXNTaWJsaW5nIHx8IHByZXZpb3VzU2libGluZy5ub2RlTmFtZSA9PT0gIlRIRUFEIiAmJiAvXlxzKiQvaS50ZXN0KHByZXZpb3VzU2libGluZy50ZXh0Q29udGVudCkpOwp9CmZ1bmN0aW9uIGNlbGwoY29udGVudDMsIG5vZGUyKSB7CiAgdmFyIGluZGV4MiA9IGluZGV4T2YyLmNhbGwobm9kZTIucGFyZW50Tm9kZS5jaGlsZE5vZGVzLCBub2RlMik7CiAgdmFyIHByZWZpeDQgPSAiICI7CiAgaWYgKGluZGV4MiA9PT0gMCkgcHJlZml4NCA9ICJ8ICI7CiAgcmV0dXJuIHByZWZpeDQgKyBjb250ZW50MyArICIgfCI7Cn0KZnVuY3Rpb24gdGFibGVzKHR1cm5kb3duU2VydmljZSkgewogIHR1cm5kb3duU2VydmljZS5rZWVwKGZ1bmN0aW9uKG5vZGUyKSB7CiAgICByZXR1cm4gbm9kZTIubm9kZU5hbWUgPT09ICJUQUJMRSIgJiYgIWlzSGVhZGluZ1Jvdyhub2RlMi5yb3dzWzBdKTsKICB9KTsKICBmb3IgKHZhciBrZXkyIGluIHJ1bGVzMikgdHVybmRvd25TZXJ2aWNlLmFkZFJ1bGUoa2V5MiwgcnVsZXMyW2tleTJdKTsKfQpmdW5jdGlvbiB0YXNrTGlzdEl0ZW1zKHR1cm5kb3duU2VydmljZSkgewogIHR1cm5kb3duU2VydmljZS5hZGRSdWxlKCJ0YXNrTGlzdEl0ZW1zIiwgewogICAgZmlsdGVyOiBmdW5jdGlvbihub2RlMikgewogICAgICByZXR1cm4gbm9kZTIudHlwZSA9PT0gImNoZWNrYm94IiAmJiBub2RlMi5wYXJlbnROb2RlLm5vZGVOYW1lID09PSAiTEkiOwogICAgfSwKICAgIHJlcGxhY2VtZW50OiBmdW5jdGlvbihjb250ZW50Mywgbm9kZTIpIHsKICAgICAgcmV0dXJuIChub2RlMi5jaGVja2VkID8gIlt4XSIgOiAiWyBdIikgKyAiICI7CiAgICB9CiAgfSk7Cn0KZnVuY3Rpb24gZ2ZtMih0dXJuZG93blNlcnZpY2UpIHsKICB0dXJuZG93blNlcnZpY2UudXNlKFsKICAgIGhpZ2hsaWdodGVkQ29kZUJsb2NrLAogICAgc3RyaWtldGhyb3VnaDIsCiAgICB0YWJsZXMsCiAgICB0YXNrTGlzdEl0ZW1zCiAgXSk7Cn0KdmFyIGhpZ2hsaWdodFJlZ0V4cCwgaW5kZXhPZjIsIGV2ZXJ5MiwgcnVsZXMyOwp2YXIgaW5pdF90dXJuZG93bl9wbHVnaW5fZ2ZtX2VzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdHVybmRvd24tcGx1Z2luLWdmbUAxLjAuMi9ub2RlX21vZHVsZXMvdHVybmRvd24tcGx1Z2luLWdmbS9saWIvdHVybmRvd24tcGx1Z2luLWdmbS5lcy5qcyIoKSB7CiAgICBoaWdobGlnaHRSZWdFeHAgPSAvaGlnaGxpZ2h0LSg/OnRleHR8c291cmNlKS0oW2EtejAtOV0rKS87CiAgICBpbmRleE9mMiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mOwogICAgZXZlcnkyID0gQXJyYXkucHJvdG90eXBlLmV2ZXJ5OwogICAgcnVsZXMyID0ge307CiAgICBydWxlczIudGFibGVDZWxsID0gewogICAgICBmaWx0ZXI6IFsidGgiLCAidGQiXSwKICAgICAgcmVwbGFjZW1lbnQ6IGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMikgewogICAgICAgIHJldHVybiBjZWxsKGNvbnRlbnQzLCBub2RlMik7CiAgICAgIH0KICAgIH07CiAgICBydWxlczIudGFibGVSb3cgPSB7CiAgICAgIGZpbHRlcjogInRyIiwKICAgICAgcmVwbGFjZW1lbnQ6IGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMikgewogICAgICAgIHZhciBib3JkZXJDZWxscyA9ICIiOwogICAgICAgIHZhciBhbGlnbk1hcCA9IHsgbGVmdDogIjotLSIsIHJpZ2h0OiAiLS06IiwgY2VudGVyOiAiOi06IiB9OwogICAgICAgIGlmIChpc0hlYWRpbmdSb3cobm9kZTIpKSB7CiAgICAgICAgICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBub2RlMi5jaGlsZE5vZGVzLmxlbmd0aDsgaTExKyspIHsKICAgICAgICAgICAgdmFyIGJvcmRlciA9ICItLS0iOwogICAgICAgICAgICB2YXIgYWxpZ24gPSAobm9kZTIuY2hpbGROb2Rlc1tpMTFdLmdldEF0dHJpYnV0ZSgiYWxpZ24iKSB8fCAiIikudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgaWYgKGFsaWduKSBib3JkZXIgPSBhbGlnbk1hcFthbGlnbl0gfHwgYm9yZGVyOwogICAgICAgICAgICBib3JkZXJDZWxscyArPSBjZWxsKGJvcmRlciwgbm9kZTIuY2hpbGROb2Rlc1tpMTFdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICJcbiIgKyBjb250ZW50MyArIChib3JkZXJDZWxscyA/ICJcbiIgKyBib3JkZXJDZWxscyA6ICIiKTsKICAgICAgfQogICAgfTsKICAgIHJ1bGVzMi50YWJsZSA9IHsKICAgICAgLy8gT25seSBjb252ZXJ0IHRhYmxlcyB3aXRoIGEgaGVhZGluZyByb3cuCiAgICAgIC8vIFRhYmxlcyB3aXRoIG5vIGhlYWRpbmcgcm93IGFyZSBrZXB0IHVzaW5nIGBrZWVwYCAoc2VlIGJlbG93KS4KICAgICAgZmlsdGVyOiBmdW5jdGlvbihub2RlMikgewogICAgICAgIHJldHVybiBub2RlMi5ub2RlTmFtZSA9PT0gIlRBQkxFIiAmJiBpc0hlYWRpbmdSb3cobm9kZTIucm93c1swXSk7CiAgICAgIH0sCiAgICAgIHJlcGxhY2VtZW50OiBmdW5jdGlvbihjb250ZW50MykgewogICAgICAgIGNvbnRlbnQzID0gY29udGVudDMucmVwbGFjZSgiXG5cbiIsICJcbiIpOwogICAgICAgIHJldHVybiAiXG5cbiIgKyBjb250ZW50MyArICJcblxuIjsKICAgICAgfQogICAgfTsKICAgIHJ1bGVzMi50YWJsZVNlY3Rpb24gPSB7CiAgICAgIGZpbHRlcjogWyJ0aGVhZCIsICJ0Ym9keSIsICJ0Zm9vdCJdLAogICAgICByZXBsYWNlbWVudDogZnVuY3Rpb24oY29udGVudDMpIHsKICAgICAgICByZXR1cm4gY29udGVudDM7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydG1hcmtkb3duQDMuMC4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydG1hcmtkb3duL2Rpc3RfdHMvc21hcnRtYXJrZG93bi5wbHVnaW5zLmpzCnZhciBzbWFydHlhbWw7CnZhciBpbml0X3NtYXJ0bWFya2Rvd25fcGx1Z2lucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0bWFya2Rvd25AMy4wLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0bWFya2Rvd24vZGlzdF90cy9zbWFydG1hcmtkb3duLnBsdWdpbnMuanMiKCkgewogICAgc21hcnR5YW1sID0gX190b0VTTShyZXF1aXJlX2Rpc3RfdHMyKCksIDEpOwogICAgaW5pdF91bmlmaWVkKCk7CiAgICBpbml0X3JlbWFya19nZm0oKTsKICAgIGluaXRfcmVtYXJrX3BhcnNlKCk7CiAgICBpbml0X3JlbWFya19mcm9udG1hdHRlcigpOwogICAgaW5pdF9yZW1hcmtfaHRtbCgpOwogICAgaW5pdF9yZW1hcmtfc3RyaW5naWZ5KCk7CiAgICBpbml0X3R1cm5kb3duX2Jyb3dzZXJfZXMoKTsKICAgIGluaXRfdHVybmRvd25fcGx1Z2luX2dmbV9lcygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRtYXJrZG93bkAzLjAuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRtYXJrZG93bi9kaXN0X3RzL3NtYXJ0bWFya2Rvd24uY2xhc3Nlcy5tZHBhcnNlZHJlc3VsdC5qcwp2YXIgTWRQYXJzZWRSZXN1bHQ7CnZhciBpbml0X3NtYXJ0bWFya2Rvd25fY2xhc3Nlc19tZHBhcnNlZHJlc3VsdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0bWFya2Rvd25AMy4wLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0bWFya2Rvd24vZGlzdF90cy9zbWFydG1hcmtkb3duLmNsYXNzZXMubWRwYXJzZWRyZXN1bHQuanMiKCkgewogICAgaW5pdF9zbWFydG1hcmtkb3duX3BsdWdpbnMoKTsKICAgIE1kUGFyc2VkUmVzdWx0ID0gY2xhc3MgX01kUGFyc2VkUmVzdWx0IHsKICAgICAgc3RhdGljIGFzeW5jIGNyZWF0ZUZyb21NYXJrZG93blN0cmluZyhtZFN0cmluZ0FyZykgewogICAgICAgIGNvbnN0IG1kUGFyc2VkUmVzdWx0ID0gbmV3IF9NZFBhcnNlZFJlc3VsdCgpOwogICAgICAgIGF3YWl0IG1kUGFyc2VkUmVzdWx0LnVwZGF0ZUZyb21NYXJrZG93blN0cmluZyhtZFN0cmluZ0FyZyk7CiAgICAgICAgcmV0dXJuIG1kUGFyc2VkUmVzdWx0OwogICAgICB9CiAgICAgIGFzeW5jIHVwZGF0ZUZyb21NYXJrZG93blN0cmluZyhtZFN0cmluZ0FyZykgewogICAgICAgIGxldCB5YW1sU3RyaW5nOwogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHVuaWZpZWQoKS51c2UocmVtYXJrUGFyc2UpLnVzZShyZW1hcmtHZm0pLnVzZShyZW1hcmtGcm9udG1hdHRlciwgWyJ5YW1sIiwgInRvbWwiXSkudXNlKHJlbWFya1N0cmluZ2lmeSkudXNlKHJlbWFya0h0bWwpLnVzZSgoKSA9PiAodHJlZSkgPT4gewogICAgICAgICAgY29uc29sZS5kaXIodHJlZSk7CiAgICAgICAgICBjb25zdCB5YW1sQ2hpbGQgPSB0cmVlLmNoaWxkcmVuLmZpbmQoKG9iamVjdEFyZykgPT4gb2JqZWN0QXJnLnR5cGUgPT09ICJ5YW1sIik7CiAgICAgICAgICBpZiAoeWFtbENoaWxkKSB7CiAgICAgICAgICAgIHlhbWxTdHJpbmcgPSB5YW1sQ2hpbGQudmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfSkucHJvY2VzcyhtZFN0cmluZ0FyZyk7CiAgICAgICAgdGhpcy5odG1sID0gcmVzdWx0LnRvU3RyaW5nKCk7CiAgICAgICAgaWYgKHlhbWxTdHJpbmcpIHsKICAgICAgICAgIHRoaXMuZnJvbnRtYXR0ZXJEYXRhID0gYXdhaXQgc21hcnR5YW1sLnlhbWxTdHJpbmdUb09iamVjdCh5YW1sU3RyaW5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5mcm9udG1hdHRlckRhdGEgPSB7fTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydG1hcmtkb3duQDMuMC4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydG1hcmtkb3duL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czE3ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czE3LCB7CiAgU21hcnRNYXJrZG93bjogKCkgPT4gU21hcnRNYXJrZG93bgp9KTsKdmFyIFNtYXJ0TWFya2Rvd247CnZhciBpbml0X2Rpc3RfdHMxNyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0bWFya2Rvd25AMy4wLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0bWFya2Rvd24vZGlzdF90cy9pbmRleC5qcyIoKSB7CiAgICBpbml0X3NtYXJ0bWFya2Rvd25fcGx1Z2lucygpOwogICAgaW5pdF9zbWFydG1hcmtkb3duX2NsYXNzZXNfbWRwYXJzZWRyZXN1bHQoKTsKICAgIFNtYXJ0TWFya2Rvd24gPSBjbGFzcyBfU21hcnRNYXJrZG93biB7CiAgICAgIHN0YXRpYyBhc3luYyBlYXN5TWFya2Rvd25Ub0h0bWwobWRTdHJpbmdBcmcpIHsKICAgICAgICBjb25zdCBzbWFydG1hcmtkb3duSW5zdGFuY2UgPSBuZXcgX1NtYXJ0TWFya2Rvd24oKTsKICAgICAgICBjb25zdCBtZFBhcnNlZFJlc3VsdCA9IGF3YWl0IHNtYXJ0bWFya2Rvd25JbnN0YW5jZS5nZXRNZFBhcnNlZFJlc3VsdEZyb21NYXJrZG93bihtZFN0cmluZ0FyZyk7CiAgICAgICAgcmV0dXJuIG1kUGFyc2VkUmVzdWx0Lmh0bWw7CiAgICAgIH0KICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNyZWF0ZSBhIE1kUGFyc2VkUmVzdWx0IGZyb20gbWFya2Rvd24KICAgICAgICogQHBhcmFtIG1kU3RyaW5nQXJnCiAgICAgICAqLwogICAgICBhc3luYyBnZXRNZFBhcnNlZFJlc3VsdEZyb21NYXJrZG93bihtZFN0cmluZ0FyZykgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IE1kUGFyc2VkUmVzdWx0LmNyZWF0ZUZyb21NYXJrZG93blN0cmluZyhtZFN0cmluZ0FyZyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBodG1sVG9NYXJrZG93bihodG1sU3RyaW5nKSB7CiAgICAgICAgY29uc3QgdHVybmRvd25JbnN0YW5jZSA9IG5ldyB0dXJuZG93bl9icm93c2VyX2VzX2RlZmF1bHQoewogICAgICAgICAgaGVhZGluZ1N0eWxlOiAiYXR4IiwKICAgICAgICAgIGNvZGVCbG9ja1N0eWxlOiAiZmVuY2VkIgogICAgICAgIH0pOwogICAgICAgIHR1cm5kb3duSW5zdGFuY2UudXNlKHR1cm5kb3duX3BsdWdpbl9nZm1fZXNfZXhwb3J0cy5nZm0pOwogICAgICAgIHJldHVybiB0dXJuZG93bkluc3RhbmNlLnR1cm5kb3duKGh0bWxTdHJpbmcpOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcGF0aC10by1yZWdleHBAOC4zLjAvbm9kZV9tb2R1bGVzL3BhdGgtdG8tcmVnZXhwL2Rpc3QvaW5kZXguanMKdmFyIHJlcXVpcmVfZGlzdCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vcGF0aC10by1yZWdleHBAOC4zLjAvbm9kZV9tb2R1bGVzL3BhdGgtdG8tcmVnZXhwL2Rpc3QvaW5kZXguanMiKGV4cG9ydHMpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBleHBvcnRzLlBhdGhFcnJvciA9IGV4cG9ydHMuVG9rZW5EYXRhID0gdm9pZCAwOwogICAgZXhwb3J0cy5wYXJzZSA9IHBhcnNlODsKICAgIGV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGUyOwogICAgZXhwb3J0cy5tYXRjaCA9IG1hdGNoMjsKICAgIGV4cG9ydHMucGF0aFRvUmVnZXhwID0gcGF0aFRvUmVnZXhwOwogICAgZXhwb3J0cy5zdHJpbmdpZnkgPSBzdHJpbmdpZnk1OwogICAgdmFyIERFRkFVTFRfREVMSU1JVEVSID0gIi8iOwogICAgdmFyIE5PT1BfVkFMVUUgPSAodmFsdWUyKSA9PiB2YWx1ZTI7CiAgICB2YXIgSURfU1RBUlQgPSAvXlskX1xwe0lEX1N0YXJ0fV0kL3U7CiAgICB2YXIgSURfQ09OVElOVUUgPSAvXlskXHUyMDBjXHUyMDBkXHB7SURfQ29udGludWV9XSQvdTsKICAgIHZhciBTSU1QTEVfVE9LRU5TID0gewogICAgICAvLyBHcm91cHMuCiAgICAgICJ7IjogInsiLAogICAgICAifSI6ICJ9IiwKICAgICAgLy8gUmVzZXJ2ZWQuCiAgICAgICIoIjogIigiLAogICAgICAiKSI6ICIpIiwKICAgICAgIlsiOiAiWyIsCiAgICAgICJdIjogIl0iLAogICAgICAiKyI6ICIrIiwKICAgICAgIj8iOiAiPyIsCiAgICAgICIhIjogIiEiCiAgICB9OwogICAgZnVuY3Rpb24gZXNjYXBlVGV4dChzdHIpIHsKICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9be30oKVxbXF0rPyE6KlxcXS9nLCAiXFwkJiIpOwogICAgfQogICAgZnVuY3Rpb24gZXNjYXBlKHN0cikgewogICAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1suKyo/XiR7fSgpW1xdfC9cXF0vZywgIlxcJCYiKTsKICAgIH0KICAgIHZhciBUb2tlbkRhdGEgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKHRva2Vucywgb3JpZ2luYWxQYXRoKSB7CiAgICAgICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7CiAgICAgICAgdGhpcy5vcmlnaW5hbFBhdGggPSBvcmlnaW5hbFBhdGg7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzLlRva2VuRGF0YSA9IFRva2VuRGF0YTsKICAgIHZhciBQYXRoRXJyb3IgPSBjbGFzcyBleHRlbmRzIFR5cGVFcnJvciB7CiAgICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UyLCBvcmlnaW5hbFBhdGgpIHsKICAgICAgICBsZXQgdGV4dDkgPSBtZXNzYWdlMjsKICAgICAgICBpZiAob3JpZ2luYWxQYXRoKQogICAgICAgICAgdGV4dDkgKz0gYDogJHtvcmlnaW5hbFBhdGh9YDsKICAgICAgICB0ZXh0OSArPSBgOyB2aXNpdCBodHRwczovL2dpdC5uZXcvcGF0aFRvUmVnZXhwRXJyb3IgZm9yIGluZm9gOwogICAgICAgIHN1cGVyKHRleHQ5KTsKICAgICAgICB0aGlzLm9yaWdpbmFsUGF0aCA9IG9yaWdpbmFsUGF0aDsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMuUGF0aEVycm9yID0gUGF0aEVycm9yOwogICAgZnVuY3Rpb24gcGFyc2U4KHN0ciwgb3B0aW9ucyA9IHt9KSB7CiAgICAgIGNvbnN0IHsgZW5jb2RlUGF0aCA9IE5PT1BfVkFMVUUgfSA9IG9wdGlvbnM7CiAgICAgIGNvbnN0IGNoYXJzID0gWy4uLnN0cl07CiAgICAgIGNvbnN0IHRva2VucyA9IFtdOwogICAgICBsZXQgaW5kZXgyID0gMDsKICAgICAgbGV0IHBvcyA9IDA7CiAgICAgIGZ1bmN0aW9uIG5hbWUoKSB7CiAgICAgICAgbGV0IHZhbHVlMiA9ICIiOwogICAgICAgIGlmIChJRF9TVEFSVC50ZXN0KGNoYXJzW2luZGV4Ml0pKSB7CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIHZhbHVlMiArPSBjaGFyc1tpbmRleDIrK107CiAgICAgICAgICB9IHdoaWxlIChJRF9DT05USU5VRS50ZXN0KGNoYXJzW2luZGV4Ml0pKTsKICAgICAgICB9IGVsc2UgaWYgKGNoYXJzW2luZGV4Ml0gPT09ICciJykgewogICAgICAgICAgbGV0IHF1b3RlU3RhcnQgPSBpbmRleDI7CiAgICAgICAgICB3aGlsZSAoaW5kZXgyKysgPCBjaGFycy5sZW5ndGgpIHsKICAgICAgICAgICAgaWYgKGNoYXJzW2luZGV4Ml0gPT09ICciJykgewogICAgICAgICAgICAgIGluZGV4MisrOwogICAgICAgICAgICAgIHF1b3RlU3RhcnQgPSAwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjaGFyc1tpbmRleDJdID09PSAiXFwiKQogICAgICAgICAgICAgIGluZGV4MisrOwogICAgICAgICAgICB2YWx1ZTIgKz0gY2hhcnNbaW5kZXgyXTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChxdW90ZVN0YXJ0KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBQYXRoRXJyb3IoYFVudGVybWluYXRlZCBxdW90ZSBhdCBpbmRleCAke3F1b3RlU3RhcnR9YCwgc3RyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCF2YWx1ZTIpIHsKICAgICAgICAgIHRocm93IG5ldyBQYXRoRXJyb3IoYE1pc3NpbmcgcGFyYW1ldGVyIG5hbWUgYXQgaW5kZXggJHtpbmRleDJ9YCwgc3RyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZhbHVlMjsKICAgICAgfQogICAgICB3aGlsZSAoaW5kZXgyIDwgY2hhcnMubGVuZ3RoKSB7CiAgICAgICAgY29uc3QgdmFsdWUyID0gY2hhcnNbaW5kZXgyXTsKICAgICAgICBjb25zdCB0eXBlNSA9IFNJTVBMRV9UT0tFTlNbdmFsdWUyXTsKICAgICAgICBpZiAodHlwZTUpIHsKICAgICAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogdHlwZTUsIGluZGV4OiBpbmRleDIrKywgdmFsdWU6IHZhbHVlMiB9KTsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlMiA9PT0gIlxcIikgewogICAgICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiAiZXNjYXBlIiwgaW5kZXg6IGluZGV4MisrLCB2YWx1ZTogY2hhcnNbaW5kZXgyKytdIH0pOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWUyID09PSAiOiIpIHsKICAgICAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogInBhcmFtIiwgaW5kZXg6IGluZGV4MisrLCB2YWx1ZTogbmFtZSgpIH0pOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWUyID09PSAiKiIpIHsKICAgICAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogIndpbGRjYXJkIiwgaW5kZXg6IGluZGV4MisrLCB2YWx1ZTogbmFtZSgpIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0b2tlbnMucHVzaCh7IHR5cGU6ICJjaGFyIiwgaW5kZXg6IGluZGV4MisrLCB2YWx1ZTogdmFsdWUyIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICB0b2tlbnMucHVzaCh7IHR5cGU6ICJlbmQiLCBpbmRleDogaW5kZXgyLCB2YWx1ZTogIiIgfSk7CiAgICAgIGZ1bmN0aW9uIGNvbnN1bWVVbnRpbChlbmRUeXBlKSB7CiAgICAgICAgY29uc3Qgb3V0cHV0ID0gW107CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW3BvcysrXTsKICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSBlbmRUeXBlKQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAiY2hhciIgfHwgdG9rZW4udHlwZSA9PT0gImVzY2FwZSIpIHsKICAgICAgICAgICAgbGV0IHBhdGgyID0gdG9rZW4udmFsdWU7CiAgICAgICAgICAgIGxldCBjdXIgPSB0b2tlbnNbcG9zXTsKICAgICAgICAgICAgd2hpbGUgKGN1ci50eXBlID09PSAiY2hhciIgfHwgY3VyLnR5cGUgPT09ICJlc2NhcGUiKSB7CiAgICAgICAgICAgICAgcGF0aDIgKz0gY3VyLnZhbHVlOwogICAgICAgICAgICAgIGN1ciA9IHRva2Vuc1srK3Bvc107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0cHV0LnB1c2goewogICAgICAgICAgICAgIHR5cGU6ICJ0ZXh0IiwKICAgICAgICAgICAgICB2YWx1ZTogZW5jb2RlUGF0aChwYXRoMikKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJwYXJhbSIgfHwgdG9rZW4udHlwZSA9PT0gIndpbGRjYXJkIikgewogICAgICAgICAgICBvdXRwdXQucHVzaCh7CiAgICAgICAgICAgICAgdHlwZTogdG9rZW4udHlwZSwKICAgICAgICAgICAgICBuYW1lOiB0b2tlbi52YWx1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gInsiKSB7CiAgICAgICAgICAgIG91dHB1dC5wdXNoKHsKICAgICAgICAgICAgICB0eXBlOiAiZ3JvdXAiLAogICAgICAgICAgICAgIHRva2VuczogY29uc3VtZVVudGlsKCJ9IikKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgbmV3IFBhdGhFcnJvcihgVW5leHBlY3RlZCAke3Rva2VuLnR5cGV9IGF0IGluZGV4ICR7dG9rZW4uaW5kZXh9LCBleHBlY3RlZCAke2VuZFR5cGV9YCwgc3RyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dHB1dDsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFRva2VuRGF0YShjb25zdW1lVW50aWwoImVuZCIpLCBzdHIpOwogICAgfQogICAgZnVuY3Rpb24gY29tcGlsZTIocGF0aDIsIG9wdGlvbnMgPSB7fSkgewogICAgICBjb25zdCB7IGVuY29kZTogZW5jb2RlMiA9IGVuY29kZVVSSUNvbXBvbmVudCwgZGVsaW1pdGVyID0gREVGQVVMVF9ERUxJTUlURVIgfSA9IG9wdGlvbnM7CiAgICAgIGNvbnN0IGRhdGEgPSB0eXBlb2YgcGF0aDIgPT09ICJvYmplY3QiID8gcGF0aDIgOiBwYXJzZTgocGF0aDIsIG9wdGlvbnMpOwogICAgICBjb25zdCBmbiA9IHRva2Vuc1RvRnVuY3Rpb24oZGF0YS50b2tlbnMsIGRlbGltaXRlciwgZW5jb2RlMik7CiAgICAgIHJldHVybiBmdW5jdGlvbiBwYXRoMyhwYXJhbXMyID0ge30pIHsKICAgICAgICBjb25zdCBbcGF0aDQsIC4uLm1pc3NpbmddID0gZm4ocGFyYW1zMik7CiAgICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoKSB7CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBNaXNzaW5nIHBhcmFtZXRlcnM6ICR7bWlzc2luZy5qb2luKCIsICIpfWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGF0aDQ7CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiB0b2tlbnNUb0Z1bmN0aW9uKHRva2VucywgZGVsaW1pdGVyLCBlbmNvZGUyKSB7CiAgICAgIGNvbnN0IGVuY29kZXJzID0gdG9rZW5zLm1hcCgodG9rZW4pID0+IHRva2VuVG9GdW5jdGlvbih0b2tlbiwgZGVsaW1pdGVyLCBlbmNvZGUyKSk7CiAgICAgIHJldHVybiAoZGF0YSkgPT4gewogICAgICAgIGNvbnN0IHJlc3VsdCA9IFsiIl07CiAgICAgICAgZm9yIChjb25zdCBlbmNvZGVyMiBvZiBlbmNvZGVycykgewogICAgICAgICAgY29uc3QgW3ZhbHVlMiwgLi4uZXh0cmFzXSA9IGVuY29kZXIyKGRhdGEpOwogICAgICAgICAgcmVzdWx0WzBdICs9IHZhbHVlMjsKICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLmV4dHJhcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiB0b2tlblRvRnVuY3Rpb24odG9rZW4sIGRlbGltaXRlciwgZW5jb2RlMikgewogICAgICBpZiAodG9rZW4udHlwZSA9PT0gInRleHQiKQogICAgICAgIHJldHVybiAoKSA9PiBbdG9rZW4udmFsdWVdOwogICAgICBpZiAodG9rZW4udHlwZSA9PT0gImdyb3VwIikgewogICAgICAgIGNvbnN0IGZuID0gdG9rZW5zVG9GdW5jdGlvbih0b2tlbi50b2tlbnMsIGRlbGltaXRlciwgZW5jb2RlMik7CiAgICAgICAgcmV0dXJuIChkYXRhKSA9PiB7CiAgICAgICAgICBjb25zdCBbdmFsdWUyLCAuLi5taXNzaW5nXSA9IGZuKGRhdGEpOwogICAgICAgICAgaWYgKCFtaXNzaW5nLmxlbmd0aCkKICAgICAgICAgICAgcmV0dXJuIFt2YWx1ZTJdOwogICAgICAgICAgcmV0dXJuIFsiIl07CiAgICAgICAgfTsKICAgICAgfQogICAgICBjb25zdCBlbmNvZGVWYWx1ZSA9IGVuY29kZTIgfHwgTk9PUF9WQUxVRTsKICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJ3aWxkY2FyZCIgJiYgZW5jb2RlMiAhPT0gZmFsc2UpIHsKICAgICAgICByZXR1cm4gKGRhdGEpID0+IHsKICAgICAgICAgIGNvbnN0IHZhbHVlMiA9IGRhdGFbdG9rZW4ubmFtZV07CiAgICAgICAgICBpZiAodmFsdWUyID09IG51bGwpCiAgICAgICAgICAgIHJldHVybiBbIiIsIHRva2VuLm5hbWVdOwogICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlMikgfHwgdmFsdWUyLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAiJHt0b2tlbi5uYW1lfSIgdG8gYmUgYSBub24tZW1wdHkgYXJyYXlgKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIHZhbHVlMi5tYXAoKHZhbHVlMywgaW5kZXgyKSA9PiB7CiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZTMgIT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAiJHt0b2tlbi5uYW1lfS8ke2luZGV4Mn0iIHRvIGJlIGEgc3RyaW5nYCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBlbmNvZGVWYWx1ZSh2YWx1ZTMpOwogICAgICAgICAgICB9KS5qb2luKGRlbGltaXRlcikKICAgICAgICAgIF07CiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gKGRhdGEpID0+IHsKICAgICAgICBjb25zdCB2YWx1ZTIgPSBkYXRhW3Rva2VuLm5hbWVdOwogICAgICAgIGlmICh2YWx1ZTIgPT0gbnVsbCkKICAgICAgICAgIHJldHVybiBbIiIsIHRva2VuLm5hbWVdOwogICAgICAgIGlmICh0eXBlb2YgdmFsdWUyICE9PSAic3RyaW5nIikgewogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgIiR7dG9rZW4ubmFtZX0iIHRvIGJlIGEgc3RyaW5nYCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBbZW5jb2RlVmFsdWUodmFsdWUyKV07CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBtYXRjaDIocGF0aDIsIG9wdGlvbnMgPSB7fSkgewogICAgICBjb25zdCB7IGRlY29kZTogZGVjb2RlMiA9IGRlY29kZVVSSUNvbXBvbmVudCwgZGVsaW1pdGVyID0gREVGQVVMVF9ERUxJTUlURVIgfSA9IG9wdGlvbnM7CiAgICAgIGNvbnN0IHsgcmVnZXhwLCBrZXlzOiBrZXlzMiB9ID0gcGF0aFRvUmVnZXhwKHBhdGgyLCBvcHRpb25zKTsKICAgICAgY29uc3QgZGVjb2RlcnMgPSBrZXlzMi5tYXAoKGtleTIpID0+IHsKICAgICAgICBpZiAoZGVjb2RlMiA9PT0gZmFsc2UpCiAgICAgICAgICByZXR1cm4gTk9PUF9WQUxVRTsKICAgICAgICBpZiAoa2V5Mi50eXBlID09PSAicGFyYW0iKQogICAgICAgICAgcmV0dXJuIGRlY29kZTI7CiAgICAgICAgcmV0dXJuICh2YWx1ZTIpID0+IHZhbHVlMi5zcGxpdChkZWxpbWl0ZXIpLm1hcChkZWNvZGUyKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBmdW5jdGlvbiBtYXRjaDMoaW5wdXQpIHsKICAgICAgICBjb25zdCBtNiA9IHJlZ2V4cC5leGVjKGlucHV0KTsKICAgICAgICBpZiAoIW02KQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIGNvbnN0IHBhdGgzID0gbTZbMF07CiAgICAgICAgY29uc3QgcGFyYW1zMiA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIGZvciAobGV0IGkxMSA9IDE7IGkxMSA8IG02Lmxlbmd0aDsgaTExKyspIHsKICAgICAgICAgIGlmIChtNltpMTFdID09PSB2b2lkIDApCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgY29uc3Qga2V5MiA9IGtleXMyW2kxMSAtIDFdOwogICAgICAgICAgY29uc3QgZGVjb2RlcjIgPSBkZWNvZGVyc1tpMTEgLSAxXTsKICAgICAgICAgIHBhcmFtczJba2V5Mi5uYW1lXSA9IGRlY29kZXIyKG02W2kxMV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBwYXRoOiBwYXRoMywgcGFyYW1zOiBwYXJhbXMyIH07CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBwYXRoVG9SZWdleHAocGF0aDIsIG9wdGlvbnMgPSB7fSkgewogICAgICBjb25zdCB7IGRlbGltaXRlciA9IERFRkFVTFRfREVMSU1JVEVSLCBlbmQ6IGVuZDMgPSB0cnVlLCBzZW5zaXRpdmUgPSBmYWxzZSwgdHJhaWxpbmcgPSB0cnVlIH0gPSBvcHRpb25zOwogICAgICBjb25zdCBrZXlzMiA9IFtdOwogICAgICBjb25zdCBmbGFncyA9IHNlbnNpdGl2ZSA/ICIiIDogImkiOwogICAgICBjb25zdCBzb3VyY2VzID0gW107CiAgICAgIGZvciAoY29uc3QgaW5wdXQgb2YgcGF0aHNUb0FycmF5KHBhdGgyLCBbXSkpIHsKICAgICAgICBjb25zdCBkYXRhID0gdHlwZW9mIGlucHV0ID09PSAib2JqZWN0IiA/IGlucHV0IDogcGFyc2U4KGlucHV0LCBvcHRpb25zKTsKICAgICAgICBmb3IgKGNvbnN0IHRva2VucyBvZiBmbGF0dGVuKGRhdGEudG9rZW5zLCAwLCBbXSkpIHsKICAgICAgICAgIHNvdXJjZXMucHVzaCh0b1JlZ0V4cFNvdXJjZSh0b2tlbnMsIGRlbGltaXRlciwga2V5czIsIGRhdGEub3JpZ2luYWxQYXRoKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxldCBwYXR0ZXJuID0gYF4oPzoke3NvdXJjZXMuam9pbigifCIpfSlgOwogICAgICBpZiAodHJhaWxpbmcpCiAgICAgICAgcGF0dGVybiArPSBgKD86JHtlc2NhcGUoZGVsaW1pdGVyKX0kKT9gOwogICAgICBwYXR0ZXJuICs9IGVuZDMgPyAiJCIgOiBgKD89JHtlc2NhcGUoZGVsaW1pdGVyKX18JClgOwogICAgICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKHBhdHRlcm4sIGZsYWdzKTsKICAgICAgcmV0dXJuIHsgcmVnZXhwLCBrZXlzOiBrZXlzMiB9OwogICAgfQogICAgZnVuY3Rpb24gcGF0aHNUb0FycmF5KHBhdGhzLCBpbml0KSB7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhdGhzKSkgewogICAgICAgIGZvciAoY29uc3QgcDcgb2YgcGF0aHMpCiAgICAgICAgICBwYXRoc1RvQXJyYXkocDcsIGluaXQpOwogICAgICB9IGVsc2UgewogICAgICAgIGluaXQucHVzaChwYXRocyk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluaXQ7CiAgICB9CiAgICBmdW5jdGlvbiogZmxhdHRlbih0b2tlbnMsIGluZGV4MiwgaW5pdCkgewogICAgICBpZiAoaW5kZXgyID09PSB0b2tlbnMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIHlpZWxkIGluaXQ7CiAgICAgIH0KICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXgyXTsKICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJncm91cCIpIHsKICAgICAgICBmb3IgKGNvbnN0IHNlcSBvZiBmbGF0dGVuKHRva2VuLnRva2VucywgMCwgaW5pdC5zbGljZSgpKSkgewogICAgICAgICAgeWllbGQqIGZsYXR0ZW4odG9rZW5zLCBpbmRleDIgKyAxLCBzZXEpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpbml0LnB1c2godG9rZW4pOwogICAgICB9CiAgICAgIHlpZWxkKiBmbGF0dGVuKHRva2VucywgaW5kZXgyICsgMSwgaW5pdCk7CiAgICB9CiAgICBmdW5jdGlvbiB0b1JlZ0V4cFNvdXJjZSh0b2tlbnMsIGRlbGltaXRlciwga2V5czIsIG9yaWdpbmFsUGF0aCkgewogICAgICBsZXQgcmVzdWx0ID0gIiI7CiAgICAgIGxldCBiYWNrdHJhY2sgPSAiIjsKICAgICAgbGV0IGlzU2FmZVNlZ21lbnRQYXJhbSA9IHRydWU7CiAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7CiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJ0ZXh0IikgewogICAgICAgICAgcmVzdWx0ICs9IGVzY2FwZSh0b2tlbi52YWx1ZSk7CiAgICAgICAgICBiYWNrdHJhY2sgKz0gdG9rZW4udmFsdWU7CiAgICAgICAgICBpc1NhZmVTZWdtZW50UGFyYW0gfHwgKGlzU2FmZVNlZ21lbnRQYXJhbSA9IHRva2VuLnZhbHVlLmluY2x1ZGVzKGRlbGltaXRlcikpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlbi50eXBlID09PSAicGFyYW0iIHx8IHRva2VuLnR5cGUgPT09ICJ3aWxkY2FyZCIpIHsKICAgICAgICAgIGlmICghaXNTYWZlU2VnbWVudFBhcmFtICYmICFiYWNrdHJhY2spIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFBhdGhFcnJvcihgTWlzc2luZyB0ZXh0IGJlZm9yZSAiJHt0b2tlbi5uYW1lfSIgJHt0b2tlbi50eXBlfWAsIG9yaWdpbmFsUGF0aCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gInBhcmFtIikgewogICAgICAgICAgICByZXN1bHQgKz0gYCgke25lZ2F0ZShkZWxpbWl0ZXIsIGlzU2FmZVNlZ21lbnRQYXJhbSA/ICIiIDogYmFja3RyYWNrKX0rKWA7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXN1bHQgKz0gYChbXFxzXFxTXSspYDsKICAgICAgICAgIH0KICAgICAgICAgIGtleXMyLnB1c2godG9rZW4pOwogICAgICAgICAgYmFja3RyYWNrID0gIiI7CiAgICAgICAgICBpc1NhZmVTZWdtZW50UGFyYW0gPSBmYWxzZTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gbmVnYXRlKGRlbGltaXRlciwgYmFja3RyYWNrKSB7CiAgICAgIGlmIChiYWNrdHJhY2subGVuZ3RoIDwgMikgewogICAgICAgIGlmIChkZWxpbWl0ZXIubGVuZ3RoIDwgMikKICAgICAgICAgIHJldHVybiBgW14ke2VzY2FwZShkZWxpbWl0ZXIgKyBiYWNrdHJhY2spfV1gOwogICAgICAgIHJldHVybiBgKD86KD8hJHtlc2NhcGUoZGVsaW1pdGVyKX0pW14ke2VzY2FwZShiYWNrdHJhY2spfV0pYDsKICAgICAgfQogICAgICBpZiAoZGVsaW1pdGVyLmxlbmd0aCA8IDIpIHsKICAgICAgICByZXR1cm4gYCg/Oig/ISR7ZXNjYXBlKGJhY2t0cmFjayl9KVteJHtlc2NhcGUoZGVsaW1pdGVyKX1dKWA7CiAgICAgIH0KICAgICAgcmV0dXJuIGAoPzooPyEke2VzY2FwZShiYWNrdHJhY2spfXwke2VzY2FwZShkZWxpbWl0ZXIpfSlbXFxzXFxTXSlgOwogICAgfQogICAgZnVuY3Rpb24gc3RyaW5naWZ5VG9rZW5zKHRva2VucykgewogICAgICBsZXQgdmFsdWUyID0gIiI7CiAgICAgIGxldCBpMTEgPSAwOwogICAgICBmdW5jdGlvbiBuYW1lKHZhbHVlMykgewogICAgICAgIGNvbnN0IGlzU2FmZSA9IGlzTmFtZVNhZmUodmFsdWUzKSAmJiBpc05leHROYW1lU2FmZSh0b2tlbnNbaTExXSk7CiAgICAgICAgcmV0dXJuIGlzU2FmZSA/IHZhbHVlMyA6IEpTT04uc3RyaW5naWZ5KHZhbHVlMyk7CiAgICAgIH0KICAgICAgd2hpbGUgKGkxMSA8IHRva2Vucy5sZW5ndGgpIHsKICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpMTErK107CiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJ0ZXh0IikgewogICAgICAgICAgdmFsdWUyICs9IGVzY2FwZVRleHQodG9rZW4udmFsdWUpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlbi50eXBlID09PSAiZ3JvdXAiKSB7CiAgICAgICAgICB2YWx1ZTIgKz0gYHske3N0cmluZ2lmeVRva2Vucyh0b2tlbi50b2tlbnMpfX1gOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlbi50eXBlID09PSAicGFyYW0iKSB7CiAgICAgICAgICB2YWx1ZTIgKz0gYDoke25hbWUodG9rZW4ubmFtZSl9YDsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gIndpbGRjYXJkIikgewogICAgICAgICAgdmFsdWUyICs9IGAqJHtuYW1lKHRva2VuLm5hbWUpfWA7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5rbm93biB0b2tlbiB0eXBlOiAke3Rva2VuLnR5cGV9YCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlMjsKICAgIH0KICAgIGZ1bmN0aW9uIHN0cmluZ2lmeTUoZGF0YSkgewogICAgICByZXR1cm4gc3RyaW5naWZ5VG9rZW5zKGRhdGEudG9rZW5zKTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzTmFtZVNhZmUobmFtZSkgewogICAgICBjb25zdCBbZmlyc3QyLCAuLi5yZXN0XSA9IG5hbWU7CiAgICAgIHJldHVybiBJRF9TVEFSVC50ZXN0KGZpcnN0MikgJiYgcmVzdC5ldmVyeSgoY2hhcikgPT4gSURfQ09OVElOVUUudGVzdChjaGFyKSk7CiAgICB9CiAgICBmdW5jdGlvbiBpc05leHROYW1lU2FmZSh0b2tlbikgewogICAgICBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInRleHQiKQogICAgICAgIHJldHVybiAhSURfQ09OVElOVUUudGVzdCh0b2tlbi52YWx1ZVswXSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyb3V0ZXJAMS4zLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cm91dGVyL2Rpc3RfdHMvc21hcnRyb3V0ZXIucGx1Z2lucy5qcwp2YXIgcGF0aFRvUmVnRXhwOwp2YXIgaW5pdF9zbWFydHJvdXRlcl9wbHVnaW5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyb3V0ZXJAMS4zLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cm91dGVyL2Rpc3RfdHMvc21hcnRyb3V0ZXIucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHM3KCk7CiAgICBpbml0X2Rpc3RfdHMyKCk7CiAgICBwYXRoVG9SZWdFeHAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cm91dGVyQDEuMy4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHJvdXRlci9kaXN0X3RzL3NtYXJ0cm91dGVyLmNsYXNzZXMucXVlcnlwYXJhbXMuanMKdmFyIFF1ZXJ5UGFyYW1zOwp2YXIgaW5pdF9zbWFydHJvdXRlcl9jbGFzc2VzX3F1ZXJ5cGFyYW1zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyb3V0ZXJAMS4zLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cm91dGVyL2Rpc3RfdHMvc21hcnRyb3V0ZXIuY2xhc3Nlcy5xdWVyeXBhcmFtcy5qcyIoKSB7CiAgICBpbml0X3NtYXJ0cm91dGVyX3BsdWdpbnMoKTsKICAgIFF1ZXJ5UGFyYW1zID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgfQogICAgICBnZXRBbGxBc09iamVjdCgpIHsKICAgICAgICBjb25zdCB1cmxTZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpOwogICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModXJsU2VhcmNoUGFyYW1zLmVudHJpZXMoKSk7CiAgICAgIH0KICAgICAgc2V0UXVlcnlQYXJhbShxdWVyeUtleUFyZywgcXVlcnlDb250ZW50QXJnLCBwdXNoT3JSZXBsYWNlQXJnID0gInJlcGxhY2UiKSB7CiAgICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTsKICAgICAgICBxdWVyeVBhcmFtcy5zZXQocXVlcnlLZXlBcmcsIHF1ZXJ5Q29udGVudEFyZyk7CiAgICAgICAgcHVzaE9yUmVwbGFjZUFyZyA9PT0gInB1c2giID8gaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgbnVsbCwgIj8iICsgcXVlcnlQYXJhbXMudG9TdHJpbmcoKSkgOiBoaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBudWxsLCAiPyIgKyBxdWVyeVBhcmFtcy50b1N0cmluZygpKTsKICAgICAgfQogICAgICBkZWxldGVRdWVyeVBhcmFtKHF1ZXJ5S2V5QXJnLCBwdXNoT3JSZXBsYWNlQXJnID0gInJlcGxhY2UiKSB7CiAgICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTsKICAgICAgICBxdWVyeVBhcmFtcy5kZWxldGUocXVlcnlLZXlBcmcpOwogICAgICAgIHB1c2hPclJlcGxhY2VBcmcgPT09ICJwdXNoIiA/IGhpc3RvcnkucHVzaFN0YXRlKG51bGwsIG51bGwsICI/IiArIHF1ZXJ5UGFyYW1zLnRvU3RyaW5nKCkpIDogaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgbnVsbCwgIj8iICsgcXVlcnlQYXJhbXMudG9TdHJpbmcoKSk7CiAgICAgIH0KICAgICAgZ2V0UXVlcnlQYXJhbShxdWVyeVBhcmFtTmFtZSkgewogICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gdGhpcy5nZXRBbGxBc09iamVjdCgpOwogICAgICAgIHJldHVybiBxdWVyeVBhcmFtc1txdWVyeVBhcmFtTmFtZV07CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJvdXRlckAxLjMuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyb3V0ZXIvZGlzdF90cy9zbWFydHJvdXRlci5jbGFzc2VzLnNtYXJ0cm91dGVyLmpzCnZhciByb3V0ZUxvZywgU21hcnRSb3V0ZXI7CnZhciBpbml0X3NtYXJ0cm91dGVyX2NsYXNzZXNfc21hcnRyb3V0ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJvdXRlckAxLjMuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyb3V0ZXIvZGlzdF90cy9zbWFydHJvdXRlci5jbGFzc2VzLnNtYXJ0cm91dGVyLmpzIigpIHsKICAgIGluaXRfc21hcnRyb3V0ZXJfcGx1Z2lucygpOwogICAgaW5pdF9zbWFydHJvdXRlcl9jbGFzc2VzX3F1ZXJ5cGFyYW1zKCk7CiAgICByb3V0ZUxvZyA9IChtZXNzYWdlMikgPT4gewogICAgICBjb25zb2xlLmxvZyhgJWNbUm91dGVyXSVjICR7bWVzc2FnZTJ9YCwgImNvbG9yOiByZ2IoMjU1LCAxMDUsIDEwMCk7IiwgImNvbG9yOiBpbmhlcml0Iik7CiAgICB9OwogICAgU21hcnRSb3V0ZXIgPSBjbGFzcyBfU21hcnRSb3V0ZXIgewogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSb3V0ZXIuCiAgICAgICAqLwogICAgICBjb25zdHJ1Y3RvcihvcHRpb25zQXJnLCBiYXNlUGF0aCA9ICIiKSB7CiAgICAgICAgdGhpcy5vcHRpb25zID0gewogICAgICAgICAgZGVidWc6IGZhbHNlCiAgICAgICAgfTsKICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zID0gbmV3IFF1ZXJ5UGFyYW1zKCk7CiAgICAgICAgdGhpcy5yb3V0ZXMgPSBbXTsKICAgICAgICB0aGlzLm9wdGlvbnMgPSB7CiAgICAgICAgICAuLi50aGlzLm9wdGlvbnMsCiAgICAgICAgICAuLi5vcHRpb25zQXJnCiAgICAgICAgfTsKICAgICAgICB0aGlzLmJhc2VQYXRoID0gYmFzZVBhdGg7CiAgICAgICAgdGhpcy5wb3BzdGF0ZUxpc3RlbmVyID0gKHBvcFN0YXRlRXZlbnRBcmcpID0+IHsKICAgICAgICAgIHBvcFN0YXRlRXZlbnRBcmcucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuX2hhbmRsZVJvdXRlU3RhdGUoKTsKICAgICAgICB9OwogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb3BzdGF0ZSIsIHRoaXMucG9wc3RhdGVMaXN0ZW5lcik7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENyZWF0ZSBhIHN1Yi1yb3V0ZXIgd2l0aCBhIHNwZWNpZmljIHByZWZpeAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3ViUGF0aAogICAgICAgKiBAcGFyYW0ge0lSb3V0ZXJPcHRpb25zfSBbb3B0aW9uc10KICAgICAgICovCiAgICAgIGNyZWF0ZVN1YlJvdXRlcihzdWJQYXRoLCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgbmV3QmFzZVBhdGggPSBgJHt0aGlzLmJhc2VQYXRofSR7c3ViUGF0aH1gOwogICAgICAgIHJldHVybiBuZXcgX1NtYXJ0Um91dGVyKHsgLi4udGhpcy5vcHRpb25zLCAuLi5vcHRpb25zIH0sIG5ld0Jhc2VQYXRoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogUHVzaCByb3V0ZSBzdGF0ZSB0byBoaXN0b3J5IHN0YWNrCiAgICAgICAqLwogICAgICBhc3luYyBwdXNoVXJsKHVybCA9ICIvIiwgc3RhdGUxMCA9IHt9KSB7CiAgICAgICAgY29uc3QgZnVsbFVybCA9IGAke3RoaXMuYmFzZVBhdGh9JHt1cmx9YDsKICAgICAgICBpZiAoZnVsbFVybCAhPT0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKSB7CiAgICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoc3RhdGUxMCwgd2luZG93LmRvY3VtZW50LnRpdGxlLCBmdWxsVXJsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHN0YXRlMTAsIHdpbmRvdy5kb2N1bWVudC50aXRsZSwgZnVsbFVybCk7CiAgICAgICAgfQogICAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZVJvdXRlU3RhdGUoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQXR0YWNoIHJvdXRlIHdpdGggaGFuZGxlcgogICAgICAgKiBAcGFyYW0ge3N0cmluZ3xSZWdFeHB9IHJvdXRlQXJnCiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGhhbmRsZXJBcmcKICAgICAgICovCiAgICAgIG9uKHJvdXRlQXJnLCBoYW5kbGVyQXJnKSB7CiAgICAgICAgY29uc3QgZnVsbFJvdXRlID0gYCR7dGhpcy5iYXNlUGF0aH0ke3JvdXRlQXJnfWA7CiAgICAgICAgY29uc3Qgcm91dGVPYmplY3QgPSB7CiAgICAgICAgICBtYXRjaEZ1bmN0aW9uOiBwYXRoVG9SZWdFeHAubWF0Y2goZnVsbFJvdXRlKSwKICAgICAgICAgIGhhbmRsZXI6IGhhbmRsZXJBcmcKICAgICAgICB9OwogICAgICAgIHRoaXMucm91dGVzLnB1c2gocm91dGVPYmplY3QpOwogICAgICAgIGNvbnN0IHJlbW92ZUZ1bmN0aW9uID0gKCkgPT4gewogICAgICAgICAgdGhpcy5yb3V0ZXMuc3BsaWNlKHRoaXMucm91dGVzLmluZGV4T2Yocm91dGVPYmplY3QpLCAxKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiByZW1vdmVGdW5jdGlvbjsKICAgICAgfQogICAgICAvKioKICAgICAgICogQXBwbHkgcm91dGVzIGhhbmRsZXIgdG8gY3VycmVudCByb3V0ZQogICAgICAgKi8KICAgICAgYXN5bmMgX2hhbmRsZVJvdXRlU3RhdGUoKSB7CiAgICAgICAgY29uc3QgY3VycmVudExvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lOwogICAgICAgIGNvbnN0IHdhbnRlZFJvdXRlcyA9IHRoaXMucm91dGVzLmZpbHRlcigocm91dGVBcmcpID0+IHsKICAgICAgICAgIHJldHVybiAhIXJvdXRlQXJnLm1hdGNoRnVuY3Rpb24oY3VycmVudExvY2F0aW9uKTsKICAgICAgICB9KTsKICAgICAgICBmb3IgKGNvbnN0IHdhbnRlZFJvdXRlIG9mIHdhbnRlZFJvdXRlcykgewogICAgICAgICAgY29uc3Qgcm91dGVSZXN1bHQgPSB3YW50ZWRSb3V0ZS5tYXRjaEZ1bmN0aW9uKGN1cnJlbnRMb2NhdGlvbik7CiAgICAgICAgICB3YW50ZWRSb3V0ZS5oYW5kbGVyKHsKICAgICAgICAgICAgLi4ucm91dGVSZXN1bHQudmFsdWVPZigpLAogICAgICAgICAgICBxdWVyeVBhcmFtczogdGhpcy5xdWVyeVBhcmFtcy5nZXRBbGxBc09iamVjdCgpCiAgICAgICAgICAgIC8vIFRPRE8gY2hlY2sgd2V0aGVyIGVudHJpZXMgaXMgc3VwcG9ydGVkIGluIHR5cGluZ3MKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogRGVzdHJveSB0aGUgcm91dGVyIGluc3RhbmNlLCByZW1vdmluZyBhbGwgZXh0ZXJuYWwgcmVmZXJlbmNlcwogICAgICAgKi8KICAgICAgZGVzdHJveSgpIHsKICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLCB0aGlzLnBvcHN0YXRlTGlzdGVuZXIpOwogICAgICAgIHRoaXMucm91dGVzID0gW107CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJvdXRlckAxLjMuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyb3V0ZXIvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMTggPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMTgsIHsKICBTbWFydFJvdXRlcjogKCkgPT4gU21hcnRSb3V0ZXIKfSk7CnZhciBpbml0X2Rpc3RfdHMxOCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cm91dGVyQDEuMy4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHJvdXRlci9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfc21hcnRyb3V0ZXJfY2xhc3Nlc19zbWFydHJvdXRlcigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRoYXNoQDMuMi42L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGhhc2gvZGlzdF90c193ZWIvcGx1Z2lucy5qcwp2YXIgaW5pdF9wbHVnaW5zMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0aGFzaEAzLjIuNi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRoYXNoL2Rpc3RfdHNfd2ViL3BsdWdpbnMuanMiKCkgewogICAgaW5pdF9kaXN0X3RzMTAoKTsKICAgIGluaXRfZGlzdF90czEyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGhhc2hAMy4yLjYvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0aGFzaC9kaXN0X3RzX3dlYi9zaGEyNTYuZmFsbGJhY2suanMKZnVuY3Rpb24gcm90cihuMTMsIGI1KSB7CiAgcmV0dXJuIG4xMyA+Pj4gYjUgfCBuMTMgPDwgMzIgLSBiNTsKfQpmdW5jdGlvbiBzaGEyNTZUcmFuc2Zvcm0oVzIsIEg0KSB7CiAgbGV0IGE1ID0gSDRbMF07CiAgbGV0IGI1ID0gSDRbMV07CiAgbGV0IGMxMSA9IEg0WzJdOwogIGxldCBkNiA9IEg0WzNdOwogIGxldCBlMTEgPSBINFs0XTsKICBsZXQgZjcgPSBINFs1XTsKICBsZXQgZzQgPSBINFs2XTsKICBsZXQgaDkgPSBINFs3XTsKICBmb3IgKGxldCBqNCA9IDA7IGo0IDwgNjQ7IGo0KyspIHsKICAgIGlmIChqNCA+PSAxNikgewogICAgICBjb25zdCBzMCA9IHJvdHIoVzJbajQgLSAxNV0sIDcpIF4gcm90cihXMltqNCAtIDE1XSwgMTgpIF4gVzJbajQgLSAxNV0gPj4+IDM7CiAgICAgIGNvbnN0IHMxID0gcm90cihXMltqNCAtIDJdLCAxNykgXiByb3RyKFcyW2o0IC0gMl0sIDE5KSBeIFcyW2o0IC0gMl0gPj4+IDEwOwogICAgICBXMltqNF0gPSBXMltqNCAtIDE2XSArIHMwICsgVzJbajQgLSA3XSArIHMxID4+PiAwOwogICAgfQogICAgY29uc3QgUzEgPSByb3RyKGUxMSwgNikgXiByb3RyKGUxMSwgMTEpIF4gcm90cihlMTEsIDI1KTsKICAgIGNvbnN0IGNoID0gZTExICYgZjcgXiB+ZTExICYgZzQ7CiAgICBjb25zdCB0ZW1wMSA9IGg5ICsgUzEgKyBjaCArIEtbajRdICsgVzJbajRdID4+PiAwOwogICAgY29uc3QgUzAgPSByb3RyKGE1LCAyKSBeIHJvdHIoYTUsIDEzKSBeIHJvdHIoYTUsIDIyKTsKICAgIGNvbnN0IG1haiA9IGE1ICYgYjUgXiBhNSAmIGMxMSBeIGI1ICYgYzExOwogICAgY29uc3QgdGVtcDIgPSBTMCArIG1haiA+Pj4gMDsKICAgIGg5ID0gZzQ7CiAgICBnNCA9IGY3OwogICAgZjcgPSBlMTE7CiAgICBlMTEgPSBkNiArIHRlbXAxID4+PiAwOwogICAgZDYgPSBjMTE7CiAgICBjMTEgPSBiNTsKICAgIGI1ID0gYTU7CiAgICBhNSA9IHRlbXAxICsgdGVtcDIgPj4+IDA7CiAgfQogIEg0WzBdID0gSDRbMF0gKyBhNSA+Pj4gMDsKICBINFsxXSA9IEg0WzFdICsgYjUgPj4+IDA7CiAgSDRbMl0gPSBINFsyXSArIGMxMSA+Pj4gMDsKICBINFszXSA9IEg0WzNdICsgZDYgPj4+IDA7CiAgSDRbNF0gPSBINFs0XSArIGUxMSA+Pj4gMDsKICBINFs1XSA9IEg0WzVdICsgZjcgPj4+IDA7CiAgSDRbNl0gPSBINFs2XSArIGc0ID4+PiAwOwogIEg0WzddID0gSDRbN10gKyBoOSA+Pj4gMDsKfQpmdW5jdGlvbiBzaGEyNTZGYWxsYmFjayhieXRlcykgewogIGNvbnN0IEhfY29weSA9IFsuLi5IMl07CiAgY29uc3QgbXNnTGVuID0gYnl0ZXMubGVuZ3RoOwogIGNvbnN0IG1zZ0JpdExlbiA9IG1zZ0xlbiAqIDg7CiAgY29uc3QgcGFkTGVuID0gbXNnTGVuICUgNjQgPCA1NiA/IDU2IC0gbXNnTGVuICUgNjQgOiAxMjAgLSBtc2dMZW4gJSA2NDsKICBjb25zdCBwYWRkZWQgPSBuZXcgVWludDhBcnJheShtc2dMZW4gKyBwYWRMZW4gKyA4KTsKICBwYWRkZWQuc2V0KGJ5dGVzKTsKICBwYWRkZWRbbXNnTGVuXSA9IDEyODsKICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhwYWRkZWQuYnVmZmVyKTsKICBkYXRhVmlldy5zZXRVaW50MzIocGFkZGVkLmxlbmd0aCAtIDgsIDAsIGZhbHNlKTsKICBkYXRhVmlldy5zZXRVaW50MzIocGFkZGVkLmxlbmd0aCAtIDQsIG1zZ0JpdExlbiA+Pj4gMCwgZmFsc2UpOwogIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IHBhZGRlZC5sZW5ndGg7IG9mZnNldCArPSA2NCkgewogICAgY29uc3QgVzIgPSBuZXcgQXJyYXkoNjQpOwogICAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgMTY7IGkxMSsrKSB7CiAgICAgIFcyW2kxMV0gPSBkYXRhVmlldy5nZXRVaW50MzIob2Zmc2V0ICsgaTExICogNCwgZmFsc2UpOwogICAgfQogICAgc2hhMjU2VHJhbnNmb3JtKFcyLCBIX2NvcHkpOwogIH0KICBsZXQgaGV4MyA9ICIiOwogIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IDg7IGkxMSsrKSB7CiAgICBoZXgzICs9IEhfY29weVtpMTFdLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCAiMCIpOwogIH0KICByZXR1cm4gaGV4MzsKfQp2YXIgSywgSDI7CnZhciBpbml0X3NoYTI1Nl9mYWxsYmFjayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0aGFzaEAzLjIuNi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRoYXNoL2Rpc3RfdHNfd2ViL3NoYTI1Ni5mYWxsYmFjay5qcyIoKSB7CiAgICBLID0gWwogICAgICAxMTE2MzUyNDA4LAogICAgICAxODk5NDQ3NDQxLAogICAgICAzMDQ5MzIzNDcxLAogICAgICAzOTIxMDA5NTczLAogICAgICA5NjE5ODcxNjMsCiAgICAgIDE1MDg5NzA5OTMsCiAgICAgIDI0NTM2MzU3NDgsCiAgICAgIDI4NzA3NjMyMjEsCiAgICAgIDM2MjQzODEwODAsCiAgICAgIDMxMDU5ODQwMSwKICAgICAgNjA3MjI1Mjc4LAogICAgICAxNDI2ODgxOTg3LAogICAgICAxOTI1MDc4Mzg4LAogICAgICAyMTYyMDc4MjA2LAogICAgICAyNjE0ODg4MTAzLAogICAgICAzMjQ4MjIyNTgwLAogICAgICAzODM1MzkwNDAxLAogICAgICA0MDIyMjI0Nzc0LAogICAgICAyNjQzNDcwNzgsCiAgICAgIDYwNDgwNzYyOCwKICAgICAgNzcwMjU1OTgzLAogICAgICAxMjQ5MTUwMTIyLAogICAgICAxNTU1MDgxNjkyLAogICAgICAxOTk2MDY0OTg2LAogICAgICAyNTU0MjIwODgyLAogICAgICAyODIxODM0MzQ5LAogICAgICAyOTUyOTk2ODA4LAogICAgICAzMjEwMzEzNjcxLAogICAgICAzMzM2NTcxODkxLAogICAgICAzNTg0NTI4NzExLAogICAgICAxMTM5MjY5OTMsCiAgICAgIDMzODI0MTg5NSwKICAgICAgNjY2MzA3MjA1LAogICAgICA3NzM1Mjk5MTIsCiAgICAgIDEyOTQ3NTczNzIsCiAgICAgIDEzOTYxODIyOTEsCiAgICAgIDE2OTUxODM3MDAsCiAgICAgIDE5ODY2NjEwNTEsCiAgICAgIDIxNzcwMjYzNTAsCiAgICAgIDI0NTY5NTYwMzcsCiAgICAgIDI3MzA0ODU5MjEsCiAgICAgIDI4MjAzMDI0MTEsCiAgICAgIDMyNTk3MzA4MDAsCiAgICAgIDMzNDU3NjQ3NzEsCiAgICAgIDM1MTYwNjU4MTcsCiAgICAgIDM2MDAzNTI4MDQsCiAgICAgIDQwOTQ1NzE5MDksCiAgICAgIDI3NTQyMzM0NCwKICAgICAgNDMwMjI3NzM0LAogICAgICA1MDY5NDg2MTYsCiAgICAgIDY1OTA2MDU1NiwKICAgICAgODgzOTk3ODc3LAogICAgICA5NTgxMzk1NzEsCiAgICAgIDEzMjI4MjIyMTgsCiAgICAgIDE1MzcwMDIwNjMsCiAgICAgIDE3NDc4NzM3NzksCiAgICAgIDE5NTU1NjIyMjIsCiAgICAgIDIwMjQxMDQ4MTUsCiAgICAgIDIyMjc3MzA0NTIsCiAgICAgIDIzNjE4NTI0MjQsCiAgICAgIDI0Mjg0MzY0NzQsCiAgICAgIDI3NTY3MzQxODcsCiAgICAgIDMyMDQwMzE0NzksCiAgICAgIDMzMjkzMjUyOTgKICAgIF07CiAgICBIMiA9IFsKICAgICAgMTc3OTAzMzcwMywKICAgICAgMzE0NDEzNDI3NywKICAgICAgMTAxMzkwNDI0MiwKICAgICAgMjc3MzQ4MDc2MiwKICAgICAgMTM1OTg5MzExOSwKICAgICAgMjYwMDgyMjkyNCwKICAgICAgNTI4NzM0NjM1LAogICAgICAxNTQxNDU5MjI1CiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRoYXNoQDMuMi42L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGhhc2gvZGlzdF90c193ZWIvaW5kZXguanMKdmFyIGRpc3RfdHNfd2ViX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoZGlzdF90c193ZWJfZXhwb3J0cywgewogIG1kNUZyb21TdHJpbmc6ICgpID0+IG1kNUZyb21TdHJpbmcsCiAgc2hhMjU2RnJvbUJ1ZmZlcjogKCkgPT4gc2hhMjU2RnJvbUJ1ZmZlciwKICBzaGEyNTZGcm9tRmlsZTogKCkgPT4gc2hhMjU2RnJvbUZpbGUsCiAgc2hhMjU2RnJvbVN0cmVhbTogKCkgPT4gc2hhMjU2RnJvbVN0cmVhbSwKICBzaGEyNTZGcm9tU3RyaW5nOiAoKSA9PiBzaGEyNTZGcm9tU3RyaW5nLAogIHNoYTI1NkZyb21TdHJpbmdTeW5jOiAoKSA9PiBzaGEyNTZGcm9tU3RyaW5nU3luYywKICBzaGEyNjVGcm9tT2JqZWN0OiAoKSA9PiBzaGEyNjVGcm9tT2JqZWN0Cn0pOwp2YXIgaGV4LCBpc0NyeXB0b1N1YnRsZUF2YWlsYWJsZSwgc2hhMjU2RnJvbVN0cmluZywgc2hhMjU2RnJvbVN0cmluZ1N5bmMsIHNoYTI1NkZyb21CdWZmZXIsIHNoYTI2NUZyb21PYmplY3QsIHNoYTI1NkZyb21TdHJlYW0sIHNoYTI1NkZyb21GaWxlLCBtZDVGcm9tU3RyaW5nOwp2YXIgaW5pdF9kaXN0X3RzX3dlYiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0aGFzaEAzLjIuNi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRoYXNoL2Rpc3RfdHNfd2ViL2luZGV4LmpzIigpIHsKICAgIGluaXRfcGx1Z2luczIoKTsKICAgIGluaXRfc2hhMjU2X2ZhbGxiYWNrKCk7CiAgICBoZXggPSAoYnVmZmVyMikgPT4gewogICAgICBjb25zdCBoZXhDb2RlcyA9IFtdOwogICAgICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcjIpOwogICAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCB2aWV3LmJ5dGVMZW5ndGg7IGkxMSArPSA0KSB7CiAgICAgICAgY29uc3QgdmFsdWUyID0gdmlldy5nZXRVaW50MzIoaTExKTsKICAgICAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IHZhbHVlMi50b1N0cmluZygxNik7CiAgICAgICAgY29uc3QgcGFkZGluZyA9ICIwMDAwMDAwMCI7CiAgICAgICAgY29uc3QgcGFkZGVkVmFsdWUgPSAocGFkZGluZyArIHN0cmluZ1ZhbHVlKS5zbGljZSgtcGFkZGluZy5sZW5ndGgpOwogICAgICAgIGhleENvZGVzLnB1c2gocGFkZGVkVmFsdWUpOwogICAgICB9CiAgICAgIHJldHVybiBoZXhDb2Rlcy5qb2luKCIiKTsKICAgIH07CiAgICBpc0NyeXB0b1N1YnRsZUF2YWlsYWJsZSA9ICgpID0+IHsKICAgICAgcmV0dXJuIHR5cGVvZiBjcnlwdG8gIT09ICJ1bmRlZmluZWQiICYmIGNyeXB0by5zdWJ0bGUgIT09IHZvaWQgMDsKICAgIH07CiAgICBzaGEyNTZGcm9tU3RyaW5nID0gYXN5bmMgKHN0cmluZ0FyZykgPT4gewogICAgICBjb25zdCBidWZmZXIyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHN0cmluZ0FyZyk7CiAgICAgIGlmIChpc0NyeXB0b1N1YnRsZUF2YWlsYWJsZSgpKSB7CiAgICAgICAgY29uc3QgaGFzaCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCJTSEEtMjU2IiwgYnVmZmVyMik7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gaGV4KGhhc2gpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHNoYTI1NkZhbGxiYWNrKGJ1ZmZlcjIpOwogICAgICB9CiAgICB9OwogICAgc2hhMjU2RnJvbVN0cmluZ1N5bmMgPSAoc3RyaW5nQXJnKSA9PiB7CiAgICAgIGNvbnNvbGUud2Fybigic2hhMjU2RnJvbVN0cmluZ1N5bmMgaXMgbm90IHRydWx5IHN5bmNocm9ub3VzIGluIGJyb3dzZXIgZW52aXJvbm1lbnQiKTsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJzaGEyNTZGcm9tU3RyaW5nU3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGJyb3dzZXIgZW52aXJvbm1lbnQuIFVzZSBzaGEyNTZGcm9tU3RyaW5nIGluc3RlYWQuIik7CiAgICB9OwogICAgc2hhMjU2RnJvbUJ1ZmZlciA9IGFzeW5jIChidWZmZXJBcmcpID0+IHsKICAgICAgaWYgKGlzQ3J5cHRvU3VidGxlQXZhaWxhYmxlKCkpIHsKICAgICAgICBsZXQgaW5wdXRCdWZmZXI7CiAgICAgICAgaWYgKGJ1ZmZlckFyZyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKICAgICAgICAgIGNvbnN0IHZpZXcgPSBidWZmZXJBcmc7CiAgICAgICAgICBpbnB1dEJ1ZmZlciA9IHZpZXcuYnVmZmVyLnNsaWNlKHZpZXcuYnl0ZU9mZnNldCwgdmlldy5ieXRlT2Zmc2V0ICsgdmlldy5ieXRlTGVuZ3RoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5wdXRCdWZmZXIgPSBidWZmZXJBcmc7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGhhc2ggPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdCgiU0hBLTI1NiIsIGlucHV0QnVmZmVyKTsKICAgICAgICBjb25zdCByZXN1bHQgPSBoZXgoaGFzaCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCB1aW50OEFycmF5ID0gYnVmZmVyQXJnIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGJ1ZmZlckFyZyA6IG5ldyBVaW50OEFycmF5KGJ1ZmZlckFyZyk7CiAgICAgICAgcmV0dXJuIHNoYTI1NkZhbGxiYWNrKHVpbnQ4QXJyYXkpOwogICAgICB9CiAgICB9OwogICAgc2hhMjY1RnJvbU9iamVjdCA9IGFzeW5jIChvYmplY3RBcmcpID0+IHsKICAgICAgY29uc3Qgc3RyaW5naWZpZWRPYmplY3QgPSBkaXN0X3RzX2V4cG9ydHMxMi5zdHJpbmdpZnkob2JqZWN0QXJnKTsKICAgICAgY29uc3QgaGFzaFJlc3VsdCA9IGF3YWl0IHNoYTI1NkZyb21TdHJpbmcoc3RyaW5naWZpZWRPYmplY3QpOwogICAgICByZXR1cm4gaGFzaFJlc3VsdDsKICAgIH07CiAgICBzaGEyNTZGcm9tU3RyZWFtID0gKGlucHV0KSA9PiB7CiAgICAgIHRocm93IG5ldyBFcnJvcigic2hhMjU2RnJvbVN0cmVhbSBpcyBub3Qgc3VwcG9ydGVkIGluIGJyb3dzZXIgZW52aXJvbm1lbnQiKTsKICAgIH07CiAgICBzaGEyNTZGcm9tRmlsZSA9IGFzeW5jIChmaWxlUGF0aCkgPT4gewogICAgICB0aHJvdyBuZXcgRXJyb3IoInNoYTI1NkZyb21GaWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlciBlbnZpcm9ubWVudCIpOwogICAgfTsKICAgIG1kNUZyb21TdHJpbmcgPSBhc3luYyAoc3RyaW5nVG9IYXNoKSA9PiB7CiAgICAgIHRocm93IG5ldyBFcnJvcigibWQ1RnJvbVN0cmluZyBpcyBub3Qgc3VwcG9ydGVkIGluIGJyb3dzZXIgZW52aXJvbm1lbnQuIFdlYiBDcnlwdG8gQVBJIGRvZXMgbm90IHN1cHBvcnQgTUQ1LiIpOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RhdGVAMi4wLjI3L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0YXRlL2Rpc3RfdHMvc21hcnRzdGF0ZS5wbHVnaW5zLmpzCnZhciBpbml0X3NtYXJ0c3RhdGVfcGx1Z2lucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RhdGVAMi4wLjI3L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0YXRlL2Rpc3RfdHMvc21hcnRzdGF0ZS5wbHVnaW5zLmpzIigpIHsKICAgIGluaXRfZGlzdF90c193ZWIoKTsKICAgIGluaXRfZGlzdF90czEyKCk7CiAgICBpbml0X2Rpc3RfdHMoKTsKICAgIGluaXRfZGlzdF90czIoKTsKICAgIGluaXRfZGlzdF90czEzKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0YXRlQDIuMC4yNy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdGF0ZS9kaXN0X3RzL3NtYXJ0c3RhdGUuY2xhc3Nlcy5zdGF0ZWFjdGlvbi5qcwp2YXIgU3RhdGVBY3Rpb247CnZhciBpbml0X3NtYXJ0c3RhdGVfY2xhc3Nlc19zdGF0ZWFjdGlvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RhdGVAMi4wLjI3L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0YXRlL2Rpc3RfdHMvc21hcnRzdGF0ZS5jbGFzc2VzLnN0YXRlYWN0aW9uLmpzIigpIHsKICAgIGluaXRfc21hcnRzdGF0ZV9wbHVnaW5zKCk7CiAgICBpbml0X3NtYXJ0c3RhdGVfY2xhc3Nlc19zdGF0ZXBhcnQoKTsKICAgIFN0YXRlQWN0aW9uID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcihzdGF0ZVBhcnRSZWYsIGFjdGlvbkRlZikgewogICAgICAgIHRoaXMuc3RhdGVQYXJ0UmVmID0gc3RhdGVQYXJ0UmVmOwogICAgICAgIHRoaXMuYWN0aW9uRGVmID0gYWN0aW9uRGVmOwogICAgICB9CiAgICAgIHRyaWdnZXIocGF5bG9hZCkgewogICAgICAgIHJldHVybiB0aGlzLnN0YXRlUGFydFJlZi5kaXNwYXRjaEFjdGlvbih0aGlzLCBwYXlsb2FkKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RhdGVAMi4wLjI3L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0YXRlL2Rpc3RfdHMvc21hcnRzdGF0ZS5jbGFzc2VzLnN0YXRlcGFydC5qcwp2YXIgU3RhdGVQYXJ0Owp2YXIgaW5pdF9zbWFydHN0YXRlX2NsYXNzZXNfc3RhdGVwYXJ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdGF0ZUAyLjAuMjcvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RhdGUvZGlzdF90cy9zbWFydHN0YXRlLmNsYXNzZXMuc3RhdGVwYXJ0LmpzIigpIHsKICAgIGluaXRfc21hcnRzdGF0ZV9wbHVnaW5zKCk7CiAgICBpbml0X3NtYXJ0c3RhdGVfY2xhc3Nlc19zdGF0ZWFjdGlvbigpOwogICAgU3RhdGVQYXJ0ID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcihuYW1lQXJnLCB3ZWJTdG9yZU9wdGlvbnNBcmcpIHsKICAgICAgICB0aGlzLnN0YXRlID0gbmV3IGRpc3RfdHNfZXhwb3J0czIucnhqcy5TdWJqZWN0KCk7CiAgICAgICAgdGhpcy5jdW11bGF0aXZlRGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMuY3VtdWxhdGl2ZURlZmVyKCk7CiAgICAgICAgdGhpcy53ZWJTdG9yZSA9IG51bGw7CiAgICAgICAgdGhpcy5uYW1lID0gbmFtZUFyZzsKICAgICAgICBpZiAod2ViU3RvcmVPcHRpb25zQXJnKSB7CiAgICAgICAgICB0aGlzLndlYlN0b3JlT3B0aW9ucyA9IHdlYlN0b3JlT3B0aW9uc0FyZzsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGluaXRpYWxpemVzIHRoZSB3ZWJzdG9yZQogICAgICAgKi8KICAgICAgYXN5bmMgaW5pdCgpIHsKICAgICAgICBpZiAodGhpcy53ZWJTdG9yZU9wdGlvbnMpIHsKICAgICAgICAgIHRoaXMud2ViU3RvcmUgPSBuZXcgZGlzdF90c19leHBvcnRzMTMuV2ViU3RvcmUodGhpcy53ZWJTdG9yZU9wdGlvbnMpOwogICAgICAgICAgYXdhaXQgdGhpcy53ZWJTdG9yZS5pbml0KCk7CiAgICAgICAgICBjb25zdCBzdG9yZWRTdGF0ZSA9IGF3YWl0IHRoaXMud2ViU3RvcmUuZ2V0KFN0cmluZyh0aGlzLm5hbWUpKTsKICAgICAgICAgIGlmIChzdG9yZWRTdGF0ZSAmJiB0aGlzLnZhbGlkYXRlU3RhdGUoc3RvcmVkU3RhdGUpKSB7CiAgICAgICAgICAgIHRoaXMuc3RhdGVTdG9yZSA9IHN0b3JlZFN0YXRlOwogICAgICAgICAgICBhd2FpdCB0aGlzLm5vdGlmeUNoYW5nZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogZ2V0cyB0aGUgc3RhdGUgZnJvbSB0aGUgc3RhdGUgc3RvcmUKICAgICAgICovCiAgICAgIGdldFN0YXRlKCkgewogICAgICAgIHJldHVybiB0aGlzLnN0YXRlU3RvcmU7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHNldHMgdGhlIHN0YXRlU3RvcmUgdG8gdGhlIG5ldyBzdGF0ZQogICAgICAgKiBAcGFyYW0gbmV3U3RhdGVBcmcKICAgICAgICovCiAgICAgIGFzeW5jIHNldFN0YXRlKG5ld1N0YXRlQXJnKSB7CiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlU3RhdGUobmV3U3RhdGVBcmcpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3RhdGUgc3RydWN0dXJlIGZvciBzdGF0ZSBwYXJ0ICcke3RoaXMubmFtZX0nYCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc3RhdGVTdG9yZSA9IG5ld1N0YXRlQXJnOwogICAgICAgIGF3YWl0IHRoaXMubm90aWZ5Q2hhbmdlKCk7CiAgICAgICAgaWYgKHRoaXMud2ViU3RvcmUpIHsKICAgICAgICAgIGF3YWl0IHRoaXMud2ViU3RvcmUuc2V0KFN0cmluZyh0aGlzLm5hbWUpLCBuZXdTdGF0ZUFyZyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnN0YXRlU3RvcmU7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFZhbGlkYXRlcyBzdGF0ZSBzdHJ1Y3R1cmUgLSBjYW4gYmUgb3ZlcnJpZGRlbiBmb3IgY3VzdG9tIHZhbGlkYXRpb24KICAgICAgICogQHBhcmFtIHN0YXRlQXJnCiAgICAgICAqLwogICAgICB2YWxpZGF0ZVN0YXRlKHN0YXRlQXJnKSB7CiAgICAgICAgcmV0dXJuIHN0YXRlQXJnICE9PSBudWxsICYmIHN0YXRlQXJnICE9PSB2b2lkIDA7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIG5vdGlmaWVzIG9mIGEgY2hhbmdlIG9uIHRoZSBzdGF0ZQogICAgICAgKi8KICAgICAgYXN5bmMgbm90aWZ5Q2hhbmdlKCkgewogICAgICAgIGlmICghdGhpcy5zdGF0ZVN0b3JlKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNyZWF0ZVN0YXRlSGFzaCA9IGFzeW5jIChzdGF0ZUFyZykgPT4gewogICAgICAgICAgcmV0dXJuIGF3YWl0IGRpc3RfdHNfd2ViX2V4cG9ydHMuc2hhMjU2RnJvbVN0cmluZyhkaXN0X3RzX2V4cG9ydHMxMi5zdGFibGVPbmVXYXlTdHJpbmdpZnkoc3RhdGVBcmcpKTsKICAgICAgICB9OwogICAgICAgIGNvbnN0IGN1cnJlbnRIYXNoID0gYXdhaXQgY3JlYXRlU3RhdGVIYXNoKHRoaXMuc3RhdGVTdG9yZSk7CiAgICAgICAgaWYgKHRoaXMubGFzdFN0YXRlTm90aWZpY2F0aW9uUGF5bG9hZEhhc2ggJiYgY3VycmVudEhhc2ggPT09IHRoaXMubGFzdFN0YXRlTm90aWZpY2F0aW9uUGF5bG9hZEhhc2gpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5sYXN0U3RhdGVOb3RpZmljYXRpb25QYXlsb2FkSGFzaCA9IGN1cnJlbnRIYXNoOwogICAgICAgIH0KICAgICAgICB0aGlzLnN0YXRlLm5leHQodGhpcy5zdGF0ZVN0b3JlKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogY3JlYXRlcyBhIGN1bXVsYXRpdmUgbm90aWZpY2F0aW9uIGJ5IGFkZGluZyBhIGNoYW5nZSBub3RpZmljYXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgY2FsbCBzdGFjazsKICAgICAgICovCiAgICAgIG5vdGlmeUNoYW5nZUN1bXVsYXRpdmUoKSB7CiAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5zdGF0ZVN0b3JlKSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMubm90aWZ5Q2hhbmdlKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgMCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHNlbGVjdHMgYSBzdGF0ZSBvciBhIHN1YnN0YXRlCiAgICAgICAqLwogICAgICBzZWxlY3Qoc2VsZWN0b3JGbikgewogICAgICAgIGlmICghc2VsZWN0b3JGbikgewogICAgICAgICAgc2VsZWN0b3JGbiA9IChzdGF0ZTEwKSA9PiBzdGF0ZTEwOwogICAgICAgIH0KICAgICAgICBjb25zdCBtYXBwZWQgPSB0aGlzLnN0YXRlLnBpcGUoZGlzdF90c19leHBvcnRzMi5yeGpzLm9wcy5zdGFydFdpdGgodGhpcy5nZXRTdGF0ZSgpKSwgZGlzdF90c19leHBvcnRzMi5yeGpzLm9wcy5maWx0ZXIoKHN0YXRlQXJnKSA9PiBzdGF0ZUFyZyAhPT0gdm9pZCAwKSwgZGlzdF90c19leHBvcnRzMi5yeGpzLm9wcy5tYXAoKHN0YXRlQXJnKSA9PiB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gc2VsZWN0b3JGbihzdGF0ZUFyZyk7CiAgICAgICAgICB9IGNhdGNoIChlMTEpIHsKICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIG1hcHBlZDsKICAgICAgfQogICAgICAvKioKICAgICAgICogY3JlYXRlcyBhbiBhY3Rpb24gY2FwYWJsZSBvZiBtb2RpZnlpbmcgdGhlIHN0YXRlCiAgICAgICAqLwogICAgICBjcmVhdGVBY3Rpb24oYWN0aW9uRGVmKSB7CiAgICAgICAgcmV0dXJuIG5ldyBTdGF0ZUFjdGlvbih0aGlzLCBhY3Rpb25EZWYpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBkaXNwYXRjaGVzIGFuIGFjdGlvbiBvbiB0aGUgc3RhdGVwYXJ0IGxldmVsCiAgICAgICAqLwogICAgICBhc3luYyBkaXNwYXRjaEFjdGlvbihzdGF0ZUFjdGlvbiwgYWN0aW9uUGF5bG9hZCkgewogICAgICAgIGF3YWl0IHRoaXMuY3VtdWxhdGl2ZURlZmVycmVkLnByb21pc2U7CiAgICAgICAgY29uc3QgbmV3U3RhdGUgPSBhd2FpdCBzdGF0ZUFjdGlvbi5hY3Rpb25EZWYodGhpcywgYWN0aW9uUGF5bG9hZCk7CiAgICAgICAgYXdhaXQgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhdGUoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogd2FpdHMgdW50aWwgYSBjZXJ0YWluIHBhcnQgb2YgdGhlIHN0YXRlIGJlY29tZXMgYXZhaWxhYmxlCiAgICAgICAqIEBwYXJhbSBzZWxlY3RvckZuCiAgICAgICAqLwogICAgICBhc3luYyB3YWl0VW50aWxQcmVzZW50KHNlbGVjdG9yRm4pIHsKICAgICAgICBjb25zdCBkb25lID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICAgICAgY29uc3Qgc2VsZWN0ZWRPYnNlcnZhYmxlID0gdGhpcy5zZWxlY3Qoc2VsZWN0b3JGbik7CiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gc2VsZWN0ZWRPYnNlcnZhYmxlLnN1YnNjcmliZShhc3luYyAodmFsdWUyKSA9PiB7CiAgICAgICAgICBpZiAodmFsdWUyKSB7CiAgICAgICAgICAgIGRvbmUucmVzb2x2ZSh2YWx1ZTIpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRvbmUucHJvbWlzZTsKICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBpcyBleGVjdXRlZAogICAgICAgKi8KICAgICAgYXN5bmMgc3RhdGVTZXR1cChmdW5jQXJnKSB7CiAgICAgICAgY29uc3QgcmVzdWx0UHJvbWlzZSA9IGZ1bmNBcmcodGhpcyk7CiAgICAgICAgdGhpcy5jdW11bGF0aXZlRGVmZXJyZWQuYWRkUHJvbWlzZShyZXN1bHRQcm9taXNlKTsKICAgICAgICB0aGlzLnNldFN0YXRlKGF3YWl0IHJlc3VsdFByb21pc2UpOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdGF0ZUAyLjAuMjcvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RhdGUvZGlzdF90cy9zbWFydHN0YXRlLmNsYXNzZXMuc21hcnRzdGF0ZS5qcwp2YXIgU21hcnRzdGF0ZTsKdmFyIGluaXRfc21hcnRzdGF0ZV9jbGFzc2VzX3NtYXJ0c3RhdGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0YXRlQDIuMC4yNy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdGF0ZS9kaXN0X3RzL3NtYXJ0c3RhdGUuY2xhc3Nlcy5zbWFydHN0YXRlLmpzIigpIHsKICAgIGluaXRfc21hcnRzdGF0ZV9wbHVnaW5zKCk7CiAgICBpbml0X3NtYXJ0c3RhdGVfY2xhc3Nlc19zdGF0ZXBhcnQoKTsKICAgIFNtYXJ0c3RhdGUgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuc3RhdGVQYXJ0TWFwID0ge307CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEFsbG93cyBnZXR0aW5nIGFuZCBpbml0aWFsaXppbmcgYSBuZXcgc3RhdGVwYXJ0CiAgICAgICAqIGluaXRNb2RlID09PSAnc29mdCcgKGRlZmF1bHQpIC0gcmV0dXJucyBleGlzdGluZyBzdGF0ZXBhcnQgaWYgZXhpc3RzLCBjcmVhdGVzIG5ldyBpZiBub3QKICAgICAgICogaW5pdE1vZGUgPT09ICdtYW5kYXRvcnknIC0gcmVxdWlyZXMgc3RhdGVwYXJ0IHRvIG5vdCBleGlzdCwgZmFpbHMgaWYgaXQgZG9lcwogICAgICAgKiBpbml0TW9kZSA9PT0gJ2ZvcmNlJyAtIGFsd2F5cyBjcmVhdGVzIG5ldyBzdGF0ZXBhcnQsIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZwogICAgICAgKiBpbml0TW9kZSA9PT0gJ3BlcnNpc3RlbnQnIC0gbGlrZSAnc29mdCcgYnV0IHdpdGggd2Vic3RvcmUgcGVyc2lzdGVuY2UKICAgICAgICogQHBhcmFtIHN0YXRlUGFydE5hbWVBcmcKICAgICAgICogQHBhcmFtIGluaXRpYWxBcmcKICAgICAgICogQHBhcmFtIGluaXRNb2RlCiAgICAgICAqLwogICAgICBhc3luYyBnZXRTdGF0ZVBhcnQoc3RhdGVQYXJ0TmFtZUFyZywgaW5pdGlhbEFyZywgaW5pdE1vZGUgPSAic29mdCIpIHsKICAgICAgICBjb25zdCBleGlzdGluZ1N0YXRlUGFydCA9IHRoaXMuc3RhdGVQYXJ0TWFwW3N0YXRlUGFydE5hbWVBcmddOwogICAgICAgIGlmIChleGlzdGluZ1N0YXRlUGFydCkgewogICAgICAgICAgc3dpdGNoIChpbml0TW9kZSkgewogICAgICAgICAgICBjYXNlICJtYW5kYXRvcnkiOgogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhdGUgcGFydCAnJHtzdGF0ZVBhcnROYW1lQXJnfScgYWxyZWFkeSBleGlzdHMsIGJ1dCBpbml0TW9kZSBpcyAnbWFuZGF0b3J5J2ApOwogICAgICAgICAgICBjYXNlICJmb3JjZSI6CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU3RhdGVQYXJ0KHN0YXRlUGFydE5hbWVBcmcsIGluaXRpYWxBcmcsIGluaXRNb2RlKTsKICAgICAgICAgICAgY2FzZSAic29mdCI6CiAgICAgICAgICAgIGNhc2UgInBlcnNpc3RlbnQiOgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiBleGlzdGluZ1N0YXRlUGFydDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKCFpbml0aWFsQXJnKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhdGUgcGFydCAnJHtzdGF0ZVBhcnROYW1lQXJnfScgZG9lcyBub3QgZXhpc3QgYW5kIG5vIGluaXRpYWwgc3RhdGUgcHJvdmlkZWRgKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVN0YXRlUGFydChzdGF0ZVBhcnROYW1lQXJnLCBpbml0aWFsQXJnLCBpbml0TW9kZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgc3RhdGVwYXJ0CiAgICAgICAqIEBwYXJhbSBzdGF0ZVBhcnROYW1lCiAgICAgICAqIEBwYXJhbSBpbml0aWFsUGF5bG9hZEFyZwogICAgICAgKiBAcGFyYW0gaW5pdE1vZGUKICAgICAgICovCiAgICAgIGFzeW5jIGNyZWF0ZVN0YXRlUGFydChzdGF0ZVBhcnROYW1lLCBpbml0aWFsUGF5bG9hZEFyZywgaW5pdE1vZGUgPSAic29mdCIpIHsKICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IG5ldyBTdGF0ZVBhcnQoc3RhdGVQYXJ0TmFtZSwgaW5pdE1vZGUgPT09ICJwZXJzaXN0ZW50IiA/IHsKICAgICAgICAgIGRiTmFtZTogInNtYXJ0c3RhdGUiLAogICAgICAgICAgc3RvcmVOYW1lOiBzdGF0ZVBhcnROYW1lCiAgICAgICAgfSA6IG51bGwpOwogICAgICAgIGF3YWl0IG5ld1N0YXRlLmluaXQoKTsKICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBuZXdTdGF0ZS5nZXRTdGF0ZSgpOwogICAgICAgIGF3YWl0IG5ld1N0YXRlLnNldFN0YXRlKHsKICAgICAgICAgIC4uLmN1cnJlbnRTdGF0ZSwKICAgICAgICAgIC4uLmluaXRpYWxQYXlsb2FkQXJnCiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5zdGF0ZVBhcnRNYXBbc3RhdGVQYXJ0TmFtZV0gPSBuZXdTdGF0ZTsKICAgICAgICByZXR1cm4gbmV3U3RhdGU7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0YXRlQDIuMC4yNy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdGF0ZS9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMxOSA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMxOSwgewogIFNtYXJ0c3RhdGU6ICgpID0+IFNtYXJ0c3RhdGUsCiAgU3RhdGVBY3Rpb246ICgpID0+IFN0YXRlQWN0aW9uLAogIFN0YXRlUGFydDogKCkgPT4gU3RhdGVQYXJ0Cn0pOwp2YXIgaW5pdF9kaXN0X3RzMTkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0YXRlQDIuMC4yNy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdGF0ZS9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfc21hcnRzdGF0ZV9jbGFzc2VzX3NtYXJ0c3RhdGUoKTsKICAgIGluaXRfc21hcnRzdGF0ZV9jbGFzc2VzX3N0YXRlcGFydCgpOwogICAgaW5pdF9zbWFydHN0YXRlX2NsYXNzZXNfc3RhdGVhY3Rpb24oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dXJsQDMuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHVybC9kaXN0X3RzL3NtYXJ0dXJsLnBsdWdpbnMuanMKdmFyIGluaXRfc21hcnR1cmxfcGx1Z2lucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dXJsQDMuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHVybC9kaXN0X3RzL3NtYXJ0dXJsLnBsdWdpbnMuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR1cmxAMy4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dXJsL2Rpc3RfdHMvc21hcnR1cmwuY2xhc3Nlcy5zbWFydHVybC5qcwp2YXIgU21hcnR1cmw7CnZhciBpbml0X3NtYXJ0dXJsX2NsYXNzZXNfc21hcnR1cmwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHVybEAzLjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR1cmwvZGlzdF90cy9zbWFydHVybC5jbGFzc2VzLnNtYXJ0dXJsLmpzIigpIHsKICAgIGluaXRfc21hcnR1cmxfcGx1Z2lucygpOwogICAgU21hcnR1cmwgPSBjbGFzcyBfU21hcnR1cmwgewogICAgICAvLyBTdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSBhIFNtYXJ0dXJsIGluc3RhbmNlIGZyb20gYSBVUkwgc3RyaW5nCiAgICAgIHN0YXRpYyBjcmVhdGVGcm9tVXJsKHVybEFyZywgb3B0aW9uc0FyZykgewogICAgICAgIGNvbnN0IHBhcnNlZFVybEluc3RhbmNlID0gbmV3IFVSTCh1cmxBcmcpOwogICAgICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHt9OwogICAgICAgIGNvbnN0IHNlYXJjaFBhcmFtUGFpcnMgPSBbXTsKICAgICAgICBpZiAocGFyc2VkVXJsSW5zdGFuY2Uuc2VhcmNoKSB7CiAgICAgICAgICBwYXJzZWRVcmxJbnN0YW5jZS5zZWFyY2gucmVwbGFjZSgiPyIsICIiKS5zcGxpdCgiJiIpLm1hcCgoc2VhcmNoUGFyYW1QYWlyKSA9PiB7CiAgICAgICAgICAgIHNlYXJjaFBhcmFtUGFpcnMucHVzaCh7CiAgICAgICAgICAgICAga2V5OiBzZWFyY2hQYXJhbVBhaXIuc3BsaXQoIj0iKVswXSwKICAgICAgICAgICAgICB2YWx1ZTogc2VhcmNoUGFyYW1QYWlyLnNwbGl0KCI9IilbMV0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCBzZWFyY2hQYXJhbVBhaXIgb2Ygc2VhcmNoUGFyYW1QYWlycykgewogICAgICAgICAgc2VhcmNoUGFyYW1zW3NlYXJjaFBhcmFtUGFpci5rZXldID0gc2VhcmNoUGFyYW1QYWlyLnZhbHVlOwogICAgICAgIH0KICAgICAgICBpZiAob3B0aW9uc0FyZz8uc2VhcmNoUGFyYW1zKSB7CiAgICAgICAgICBmb3IgKGNvbnN0IGtleTIgb2YgT2JqZWN0LmtleXMob3B0aW9uc0FyZy5zZWFyY2hQYXJhbXMpKSB7CiAgICAgICAgICAgIHNlYXJjaFBhcmFtc1trZXkyXSA9IG9wdGlvbnNBcmcuc2VhcmNoUGFyYW1zW2tleTJdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgcGF0aDIgPSBwYXJzZWRVcmxJbnN0YW5jZS5wYXRobmFtZSB8fCAiIjsKICAgICAgICBpZiAoT2JqZWN0LmtleXMoc2VhcmNoUGFyYW1zKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICBwYXRoMiArPSAiPyI7CiAgICAgICAgICBsZXQgZmlyc3QyID0gdHJ1ZTsKICAgICAgICAgIGZvciAoY29uc3Qga2V5MiBvZiBPYmplY3Qua2V5cyhzZWFyY2hQYXJhbXMpKSB7CiAgICAgICAgICAgIGlmIChmaXJzdDIpIHsKICAgICAgICAgICAgICBmaXJzdDIgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBwYXRoMiArPSAiJiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGF0aDIgKz0gYCR7a2V5Mn09JHtzZWFyY2hQYXJhbXNba2V5Ml19YDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gewogICAgICAgICAgLi4ucGFyc2VkVXJsSW5zdGFuY2UsCiAgICAgICAgICBocmVmOiBwYXJzZWRVcmxJbnN0YW5jZS5ocmVmLAogICAgICAgICAgb3JpZ2luOiBwYXJzZWRVcmxJbnN0YW5jZS5vcmlnaW4sCiAgICAgICAgICBwcm90b2NvbDogcGFyc2VkVXJsSW5zdGFuY2UucHJvdG9jb2wsCiAgICAgICAgICB1c2VybmFtZTogcGFyc2VkVXJsSW5zdGFuY2UudXNlcm5hbWUsCiAgICAgICAgICBwYXNzd29yZDogcGFyc2VkVXJsSW5zdGFuY2UucGFzc3dvcmQsCiAgICAgICAgICBob3N0OiBwYXJzZWRVcmxJbnN0YW5jZS5ob3N0LAogICAgICAgICAgaG9zdG5hbWU6IHBhcnNlZFVybEluc3RhbmNlLmhvc3RuYW1lLAogICAgICAgICAgcG9ydDogcGFyc2VkVXJsSW5zdGFuY2UucG9ydCwKICAgICAgICAgIHBhdGg6IHBhdGgyLAogICAgICAgICAgcGF0aG5hbWU6IHBhcnNlZFVybEluc3RhbmNlLnBhdGhuYW1lLAogICAgICAgICAgc2VhcmNoOiBwYXJzZWRVcmxJbnN0YW5jZS5zZWFyY2gsCiAgICAgICAgICBzZWFyY2hQYXJhbXMsCiAgICAgICAgICBoYXNoOiBwYXJzZWRVcmxJbnN0YW5jZS5oYXNoCiAgICAgICAgfTsKICAgICAgICBpZiAoIXBhcnNlZFVybC5wb3J0ICYmIHBhcnNlZFVybC5wcm90b2NvbCA9PT0gImh0dHBzOiIpIHsKICAgICAgICAgIHBhcnNlZFVybC5wb3J0ID0gIjQ0MyI7CiAgICAgICAgfQogICAgICAgIGlmICghcGFyc2VkVXJsLnBvcnQgJiYgcGFyc2VkVXJsLnByb3RvY29sID09PSAiaHR0cDoiKSB7CiAgICAgICAgICBwYXJzZWRVcmwucG9ydCA9ICI4MCI7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJldHVyblNtYXJ0dXJsID0gbmV3IF9TbWFydHVybCgpOwogICAgICAgIE9iamVjdC5hc3NpZ24ocmV0dXJuU21hcnR1cmwsIHBhcnNlZFVybCk7CiAgICAgICAgcmV0dXJuIHJldHVyblNtYXJ0dXJsOwogICAgICB9CiAgICAgIC8vIFN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIGEgU21hcnR1cmwgaW5zdGFuY2UgZnJvbSBhbiBleGlzdGluZyBJVXJsT2JqZWN0CiAgICAgIHN0YXRpYyBjcmVhdGVGcm9tUGFyc2VkVXJsKHBhcnNlZFVybEFyZykgewogICAgICAgIGNvbnN0IHJldHVyblNtYXJ0dXJsID0gbmV3IF9TbWFydHVybCgpOwogICAgICAgIE9iamVjdC5hc3NpZ24ocmV0dXJuU21hcnR1cmwsIHBhcnNlZFVybEFyZyk7CiAgICAgICAgcmV0dXJuIHJldHVyblNtYXJ0dXJsOwogICAgICB9CiAgICAgIC8vIENvbnN0cnVjdG9yIGluaXRpYWxpemVzIHNlYXJjaFBhcmFtcyBhcyBhbiBlbXB0eSBvYmplY3QKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5zZWFyY2hQYXJhbXMgPSB7fTsKICAgICAgfQogICAgICAvLyBNZXRob2QgdG8gY3JlYXRlIGFuIGluZGVwZW5kZW50IGNsb25lIG9mIHRoZSBjdXJyZW50IFNtYXJ0dXJsIGluc3RhbmNlCiAgICAgIGNsb25lKCkgewogICAgICAgIGNvbnN0IGNsb25lZEluc3RhbmNlID0gbmV3IF9TbWFydHVybCgpOwogICAgICAgIE9iamVjdC5hc3NpZ24oY2xvbmVkSW5zdGFuY2UsIHRoaXMpOwogICAgICAgIGNsb25lZEluc3RhbmNlLnNlYXJjaFBhcmFtcyA9IHsgLi4udGhpcy5zZWFyY2hQYXJhbXMgfTsKICAgICAgICByZXR1cm4gY2xvbmVkSW5zdGFuY2U7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFR5cGVkIG1ldGhvZCB0byBzZXQgYSBwcm9wZXJ0eSBhbmQgcmV0dXJuIHRoZSBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuCiAgICAgICAqIEBwYXJhbSBwcm9wIC0gVGhlIHByb3BlcnR5IG5hbWUgdG8gc2V0IChtdXN0IGJlIGEga2V5IG9mIFNtYXJ0dXJsKQogICAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYXNzaWduIHRvIHRoZSBwcm9wZXJ0eQogICAgICAgKiBAcmV0dXJucyBUaGUgU21hcnR1cmwgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZwogICAgICAgKi8KICAgICAgc2V0KHByb3AsIHZhbHVlMikgewogICAgICAgIHRoaXNbcHJvcF0gPSB2YWx1ZTI7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgLy8gTWV0aG9kIHRvIGNvbnZlcnQgdGhlIFNtYXJ0dXJsIGluc3RhbmNlIGJhY2sgaW50byBhIFVSTCBzdHJpbmcKICAgICAgdG9TdHJpbmcoKSB7CiAgICAgICAgbGV0IHVzZXJwYXJ0ID0gYGA7CiAgICAgICAgaWYgKHRoaXMudXNlcm5hbWUgJiYgIXRoaXMucGFzc3dvcmQpIHsKICAgICAgICAgIHVzZXJwYXJ0ID0gYCR7dGhpcy51c2VybmFtZX1AYDsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMudXNlcm5hbWUgJiYgdGhpcy5wYXNzd29yZCkgewogICAgICAgICAgdXNlcnBhcnQgPSBgJHt0aGlzLnVzZXJuYW1lfToke3RoaXMucGFzc3dvcmR9QGA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBgJHt0aGlzLnByb3RvY29sfS8vJHt1c2VycGFydH0ke3RoaXMuaG9zdG5hbWV9OiR7dGhpcy5wb3J0fSR7dGhpcy5wYXRofWA7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHVybEAzLjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR1cmwvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMjAgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMjAsIHsKICBTbWFydHVybDogKCkgPT4gU21hcnR1cmwKfSk7CnZhciBpbml0X2Rpc3RfdHMyMCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dXJsQDMuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHVybC9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfc21hcnR1cmxfY2xhc3Nlc19zbWFydHVybCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2hyb2NrcytzbWFydHByb21pc2VANC4wLjIvbm9kZV9tb2R1bGVzL0BwdXNocm9ja3Mvc21hcnRwcm9taXNlL2Rpc3RfdHMvc21hcnRwcm9taXNlLmNsYXNzZXMuZGVmZXJyZWQuanMKdmFyIERlZmVycmVkMiwgZGVmZXIzOwp2YXIgaW5pdF9zbWFydHByb21pc2VfY2xhc3Nlc19kZWZlcnJlZDIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaHJvY2tzK3NtYXJ0cHJvbWlzZUA0LjAuMi9ub2RlX21vZHVsZXMvQHB1c2hyb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9zbWFydHByb21pc2UuY2xhc3Nlcy5kZWZlcnJlZC5qcyIoKSB7CiAgICBEZWZlcnJlZDIgPSBjbGFzcyB7CiAgICAgIGNsYWltKCkgewogICAgICAgIGlmICh0aGlzLmNsYWltZWQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiRGVmZXJyZWQgYWxyZWFkeSBjbGFpbWVkIik7CiAgICAgICAgfQogICAgICAgIHRoaXMuY2xhaW1lZCA9IHRydWU7CiAgICAgIH0KICAgICAgZ2V0IGR1cmF0aW9uKCkgewogICAgICAgIGlmICh0aGlzLnN0b3BwZWRBdCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcHBlZEF0IC0gdGhpcy5zdGFydGVkQXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBEYXRlLm5vdygpIC0gdGhpcy5zdGFydGVkQXQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuY2xhaW1lZCA9IGZhbHNlOwogICAgICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0KSA9PiB7CiAgICAgICAgICB0aGlzLnJlc29sdmUgPSAodmFsdWVBcmcpID0+IHsKICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAiZnVsZmlsbGVkIjsKICAgICAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICByZXNvbHZlMih2YWx1ZUFyZyk7CiAgICAgICAgICB9OwogICAgICAgICAgdGhpcy5yZWplY3QgPSAocmVhc29uKSA9PiB7CiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gInJlamVjdGVkIjsKICAgICAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICByZWplY3QocmVhc29uKTsKICAgICAgICAgIH07CiAgICAgICAgICB0aGlzLnN0YXJ0ZWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICB0aGlzLnN0YXR1cyA9ICJwZW5kaW5nIjsKICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIGRlZmVyMyA9ICgpID0+IHsKICAgICAgcmV0dXJuIG5ldyBEZWZlcnJlZDIoKTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaHJvY2tzK3NtYXJ0cHJvbWlzZUA0LjAuMi9ub2RlX21vZHVsZXMvQHB1c2hyb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9zbWFydHByb21pc2UuY2xhc3Nlcy5jdW11bGF0aXZlZGVmZXJyZWQuanMKdmFyIEN1bXVsYXRpdmVEZWZlcnJlZDIsIGN1bXVsYXRpdmVEZWZlcjI7CnZhciBpbml0X3NtYXJ0cHJvbWlzZV9jbGFzc2VzX2N1bXVsYXRpdmVkZWZlcnJlZDIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaHJvY2tzK3NtYXJ0cHJvbWlzZUA0LjAuMi9ub2RlX21vZHVsZXMvQHB1c2hyb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9zbWFydHByb21pc2UuY2xhc3Nlcy5jdW11bGF0aXZlZGVmZXJyZWQuanMiKCkgewogICAgaW5pdF9zbWFydHByb21pc2VfY2xhc3Nlc19kZWZlcnJlZDIoKTsKICAgIEN1bXVsYXRpdmVEZWZlcnJlZDIgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuYWNjdW11bGF0ZWRQcm9taXNlcyA9IFtdOwogICAgICAgIHRoaXMuZGVmZXJyZWQgPSBkZWZlcjMoKTsKICAgICAgICB0aGlzLnByb21pc2UgPSB0aGlzLmRlZmVycmVkLnByb21pc2U7CiAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7CiAgICAgICAgICB3aGlsZSAodGhpcy5hY2N1bXVsYXRlZFByb21pc2VzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgY29uc3QgcG9wcGVkUHJvbWlzZSA9IHRoaXMuYWNjdW11bGF0ZWRQcm9taXNlcy5zaGlmdCgpOwogICAgICAgICAgICBhd2FpdCBwb3BwZWRQcm9taXNlOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5kZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgfSwgMCk7CiAgICAgIH0KICAgICAgYWRkUHJvbWlzZShwcm9taXNlQXJnKSB7CiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZFByb21pc2VzLnB1c2gocHJvbWlzZUFyZyk7CiAgICAgIH0KICAgIH07CiAgICBjdW11bGF0aXZlRGVmZXIyID0gKCkgPT4gewogICAgICByZXR1cm4gbmV3IEN1bXVsYXRpdmVEZWZlcnJlZDIoKTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaHJvY2tzK3NtYXJ0cHJvbWlzZUA0LjAuMi9ub2RlX21vZHVsZXMvQHB1c2hyb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMjEgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMjEsIHsKICBDdW11bGF0aXZlRGVmZXJyZWQ6ICgpID0+IEN1bXVsYXRpdmVEZWZlcnJlZDIsCiAgRGVmZXJyZWQ6ICgpID0+IERlZmVycmVkMiwKICBjdW11bGF0aXZlRGVmZXI6ICgpID0+IGN1bXVsYXRpdmVEZWZlcjIsCiAgZGVmZXI6ICgpID0+IGRlZmVyMywKICBnZXRGaXJzdFRydWVPckZhbHNlOiAoKSA9PiBnZXRGaXJzdFRydWVPckZhbHNlMiwKICBtYXA6ICgpID0+IG1hcDYsCiAgcmVqZWN0ZWRQcm9taXNlOiAoKSA9PiByZWplY3RlZFByb21pc2UyLAogIHJlc29sdmVkUHJvbWlzZTogKCkgPT4gcmVzb2x2ZWRQcm9taXNlMiwKICB0aW1lb3V0QW5kQ29udGludWU6ICgpID0+IHRpbWVvdXRBbmRDb250aW51ZTIsCiAgdGltZW91dFdyYXA6ICgpID0+IHRpbWVvdXRXcmFwMgp9KTsKdmFyIHJlc29sdmVkUHJvbWlzZTIsIHJlamVjdGVkUHJvbWlzZTIsIG1hcDYsIHRpbWVvdXRXcmFwMiwgdGltZW91dEFuZENvbnRpbnVlMiwgZ2V0Rmlyc3RUcnVlT3JGYWxzZTI7CnZhciBpbml0X2Rpc3RfdHMyMSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNocm9ja3Mrc21hcnRwcm9taXNlQDQuMC4yL25vZGVfbW9kdWxlcy9AcHVzaHJvY2tzL3NtYXJ0cHJvbWlzZS9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfc21hcnRwcm9taXNlX2NsYXNzZXNfZGVmZXJyZWQyKCk7CiAgICBpbml0X3NtYXJ0cHJvbWlzZV9jbGFzc2VzX2N1bXVsYXRpdmVkZWZlcnJlZDIoKTsKICAgIGluaXRfc21hcnRwcm9taXNlX2NsYXNzZXNfZGVmZXJyZWQyKCk7CiAgICByZXNvbHZlZFByb21pc2UyID0gKHZhbHVlMikgPT4gewogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlMik7CiAgICB9OwogICAgcmVqZWN0ZWRQcm9taXNlMiA9IChlcnIpID0+IHsKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7CiAgICB9OwogICAgbWFwNiA9IGFzeW5jIChpbnB1dEFyZywgZnVuY3Rpb25BcmcpID0+IHsKICAgICAgY29uc3QgcHJvbWlzZUFycmF5ID0gW107CiAgICAgIGNvbnN0IHJlc3VsdEFycmF5ID0gW107CiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpbnB1dEFyZykgewogICAgICAgIGNvbnN0IHByb21pc2UgPSBmdW5jdGlvbkFyZyhpdGVtKTsKICAgICAgICBwcm9taXNlQXJyYXkucHVzaChwcm9taXNlKTsKICAgICAgICBwcm9taXNlLnRoZW4oKHgzKSA9PiB7CiAgICAgICAgICByZXN1bHRBcnJheS5wdXNoKHgzKTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlQXJyYXkpOwogICAgICByZXR1cm4gcmVzdWx0QXJyYXk7CiAgICB9OwogICAgdGltZW91dFdyYXAyID0gYXN5bmMgKHByb21pc2VBcmcsIHRpbWVvdXRJbk1zQXJnLCByZWplY3RBcmcgPSB0cnVlKSA9PiB7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdCkgPT4gewogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgaWYgKHJlamVjdEFyZykgewogICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCJ0aW1lb3V0IikpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzb2x2ZTIobnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgdGltZW91dEluTXNBcmcpOwogICAgICAgIHByb21pc2VBcmcudGhlbihyZXNvbHZlMiwgcmVqZWN0KTsKICAgICAgfSk7CiAgICB9OwogICAgdGltZW91dEFuZENvbnRpbnVlMiA9IGFzeW5jIChwcm9taXNlQXJnLCB0aW1lb3V0SW5Nc0FyZyA9IDZlNCkgPT4gewogICAgICByZXR1cm4gdGltZW91dFdyYXAyKHByb21pc2VBcmcsIHRpbWVvdXRJbk1zQXJnLCBmYWxzZSk7CiAgICB9OwogICAgZ2V0Rmlyc3RUcnVlT3JGYWxzZTIgPSBhc3luYyAocHJvbWlzZXNBcmcpID0+IHsKICAgICAgY29uc3QgZG9uZSA9IGRlZmVyMygpOwogICAgICBmb3IgKGNvbnN0IHByb21pc2VBcmcgb2YgcHJvbWlzZXNBcmcpIHsKICAgICAgICBwcm9taXNlQXJnLnRoZW4oKHJlc3VsdEFyZykgPT4gewogICAgICAgICAgaWYgKHJlc3VsdEFyZyA9PT0gdHJ1ZSkgewogICAgICAgICAgICBkb25lLnJlc29sdmUodHJ1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXNBcmcpLnRoZW4oKCkgPT4gewogICAgICAgIGRvbmUucmVzb2x2ZShmYWxzZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gZG9uZS5wcm9taXNlOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNocm9ja3Mrc21hcnRkZWxheUAzLjAuMS9ub2RlX21vZHVsZXMvQHB1c2hyb2Nrcy9zbWFydGRlbGF5L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czIyID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czIyLCB7CiAgVGltZW91dDogKCkgPT4gVGltZW91dDIsCiAgZGVsYXlGb3I6ICgpID0+IGRlbGF5Rm9yMiwKICBkZWxheUZvclJhbmRvbTogKCkgPT4gZGVsYXlGb3JSYW5kb20yCn0pOwp2YXIgZGVsYXlGb3IyLCBkZWxheUZvclJhbmRvbTIsIFRpbWVvdXQyOwp2YXIgaW5pdF9kaXN0X3RzMjIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaHJvY2tzK3NtYXJ0ZGVsYXlAMy4wLjEvbm9kZV9tb2R1bGVzL0BwdXNocm9ja3Mvc21hcnRkZWxheS9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfZGlzdF90czIxKCk7CiAgICBkZWxheUZvcjIgPSBhc3luYyAodGltZUluTWlsbGlzZWNvbmRBcmcsIHBhc3NPbkFyZywgdW5yZWZlZEFyZyA9IGZhbHNlKSA9PiB7CiAgICAgIGNvbnN0IHRpbWVvdXQyID0gbmV3IFRpbWVvdXQyKHRpbWVJbk1pbGxpc2Vjb25kQXJnLCBudWxsLCB1bnJlZmVkQXJnKTsKICAgICAgYXdhaXQgdGltZW91dDIucHJvbWlzZTsKICAgICAgcmV0dXJuIHBhc3NPbkFyZzsKICAgIH07CiAgICBkZWxheUZvclJhbmRvbTIgPSBhc3luYyAodGltZU1pbkluTWlsbGlzZWNvbmRBcmcsIHRpbWVNYXhJbk1pbGxpc2Vjb25kQXJnLCBwYXNzT25BcmcsIHVucmVmZWRBcmcgPSBmYWxzZSkgPT4gewogICAgICBhd2FpdCBkZWxheUZvcjIoTWF0aC5yYW5kb20oKSAqICh0aW1lTWF4SW5NaWxsaXNlY29uZEFyZyAtIHRpbWVNaW5Jbk1pbGxpc2Vjb25kQXJnKSArIHRpbWVNaW5Jbk1pbGxpc2Vjb25kQXJnLCBudWxsLCB1bnJlZmVkQXJnKTsKICAgICAgcmV0dXJuIHBhc3NPbkFyZzsKICAgIH07CiAgICBUaW1lb3V0MiA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IodGltZUluTWlsbGlzZWNvbmRBcmcsIHBhc3NPbiwgdW5yZWZlZEFyZyA9IGZhbHNlKSB7CiAgICAgICAgdGhpcy5fY2FuY2VsbGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy50aW1lb3V0SW5NaWxsaXMgPSB0aW1lSW5NaWxsaXNlY29uZEFyZzsKICAgICAgICB0aGlzLl9kZWZlcnJlZCA9IGRlZmVyMygpOwogICAgICAgIHRoaXMucHJvbWlzZSA9IHRoaXMuX2RlZmVycmVkLnByb21pc2U7CiAgICAgICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgaWYgKCF0aGlzLl9jYW5jZWxsZWQpIHsKICAgICAgICAgICAgdGhpcy5fZGVmZXJyZWQucmVzb2x2ZShwYXNzT24pOwogICAgICAgICAgfQogICAgICAgIH0sIHRpbWVJbk1pbGxpc2Vjb25kQXJnKTsKICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBEYXRlLm5vdygpOwogICAgICAgIGlmICh1bnJlZmVkQXJnKSB7CiAgICAgICAgICB0aGlzLm1ha2VVbnJlZmVkKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiB1bnJlZmZpbmcgYSB0aW1lb3V0IGNhdXNlcyB0aGUgbm9kZSBwcm9jZXNzIHRvIG5vdCB3YWl0IGZvciBjb21wbGV0aW9uIGJlZm9yZSBleGl0CiAgICAgICAqLwogICAgICBtYWtlVW5yZWZlZCgpIHsKICAgICAgICB0aGlzLl90aW1lb3V0LnVucmVmKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNhbmNlbHMgdGhlIHRpbWVyCiAgICAgICAqLwogICAgICBjYW5jZWwoKSB7CiAgICAgICAgdGhpcy5fY2FuY2VsbGVkID0gdHJ1ZTsKICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7CiAgICAgIH0KICAgICAgZ2V0VGltZUxlZnQoKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zdGFydGVkICsgdGhpcy50aW1lb3V0SW5NaWxsaXMgLSBEYXRlLm5vdygpOwogICAgICAgIHJldHVybiByZXN1bHQgPiAwID8gcmVzdWx0IDogMDsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9idXNpbmVzcy9hZGRyZXNzLmpzCnZhciBpbml0X2FkZHJlc3MgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3MvYWRkcmVzcy5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3MvY29tcGFueS5qcwp2YXIgaW5pdF9jb21wYW55ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2J1c2luZXNzL2NvbXBhbnkuanMiKCkgewogICAgaW5pdF9kaXN0X3RzMjMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9idXNpbmVzcy9jb250YWN0LmpzCnZhciBpbml0X2NvbnRhY3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3MvY29udGFjdC5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMyMygpOwogICAgaW5pdF9kaXN0X3RzMjMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9maW5hbmNlL2NoZWNraW5nYWNjb3VudC5qcwp2YXIgaW5pdF9jaGVja2luZ2FjY291bnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZmluYW5jZS9jaGVja2luZ2FjY291bnQuanMiKCkgewogICAgaW5pdF9kaXN0X3RzMjMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9maW5hbmNlL2N1cnJlbmN5LmpzCnZhciBpbml0X2N1cnJlbmN5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2ZpbmFuY2UvY3VycmVuY3kuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2ZpbmFuY2UvZXhwZW5zZS5qcwp2YXIgaW5pdF9leHBlbnNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2ZpbmFuY2UvZXhwZW5zZS5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMyMygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2ZpbmFuY2UvaW52b2ljZS5qcwp2YXIgaW5pdF9pbnZvaWNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2ZpbmFuY2UvaW52b2ljZS5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMyMygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2ZpbmFuY2UvcGF5bWVudC5qcwp2YXIgaW5pdF9wYXltZW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2ZpbmFuY2UvcGF5bWVudC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZmluYW5jZS90cmFuc2FjdGlvbi5qcwp2YXIgaW5pdF90cmFuc2FjdGlvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9maW5hbmNlL3RyYW5zYWN0aW9uLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9maW5hbmNlL2luZGV4LmpzCnZhciBmaW5hbmNlX2V4cG9ydHMgPSB7fTsKdmFyIGluaXRfZmluYW5jZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9maW5hbmNlL2luZGV4LmpzIigpIHsKICAgIGluaXRfY2hlY2tpbmdhY2NvdW50KCk7CiAgICBpbml0X2N1cnJlbmN5KCk7CiAgICBpbml0X2V4cGVuc2UoKTsKICAgIGluaXRfaW52b2ljZSgpOwogICAgaW5pdF9wYXltZW50KCk7CiAgICBpbml0X3RyYW5zYWN0aW9uKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3Mvam9iLmpzCnZhciBJSm9iOwp2YXIgaW5pdF9qb2IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3Mvam9iLmpzIigpIHsKICAgIGluaXRfZmluYW5jZSgpOwogICAgaW5pdF9jb21wYW55KCk7CiAgICBpbml0X2NvbnRhY3QoKTsKICAgIElKb2IgPSBjbGFzcyB7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2RhdGFiYXNlL21vbmdvZGVzY3JpcHRvci5qcwp2YXIgaW5pdF9tb25nb2Rlc2NyaXB0b3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZGF0YWJhc2UvbW9uZ29kZXNjcmlwdG9yLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9kYXRhYmFzZS9vYmplY3RhY3Rpb24uanMKdmFyIGluaXRfb2JqZWN0YWN0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2RhdGFiYXNlL29iamVjdGFjdGlvbi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZGF0YWJhc2Uvb2JqZWN0c3RhdHVzLmpzCnZhciBpbml0X29iamVjdHN0YXR1cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9kYXRhYmFzZS9vYmplY3RzdGF0dXMuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2RhdGFiYXNlL3dyYXBwZWRkYXRhLmpzCnZhciBpbml0X3dyYXBwZWRkYXRhID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2RhdGFiYXNlL3dyYXBwZWRkYXRhLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9kYXRhYmFzZS9pbmRleC5qcwp2YXIgZGF0YWJhc2VfZXhwb3J0cyA9IHt9Owp2YXIgaW5pdF9kYXRhYmFzZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9kYXRhYmFzZS9pbmRleC5qcyIoKSB7CiAgICBpbml0X21vbmdvZGVzY3JpcHRvcigpOwogICAgaW5pdF9vYmplY3RhY3Rpb24oKTsKICAgIGluaXRfb2JqZWN0c3RhdHVzKCk7CiAgICBpbml0X3dyYXBwZWRkYXRhKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3MvbGV0dGVyLmpzCnZhciBpbml0X2xldHRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9idXNpbmVzcy9sZXR0ZXIuanMiKCkgewogICAgaW5pdF9idXNpbmVzcygpOwogICAgaW5pdF9maW5hbmNlKCk7CiAgICBpbml0X2RhdGFiYXNlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3MvcGRmLmpzCnZhciBpbml0X3BkZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9idXNpbmVzcy9wZGYuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2J1c2luZXNzL3BlcnNvbi5qcwp2YXIgaW5pdF9wZXJzb24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3MvcGVyc29uLmpzIigpIHsKICAgIGluaXRfY29udGFjdCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2J1c2luZXNzL3Byb2plY3QuanMKdmFyIGluaXRfcHJvamVjdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9idXNpbmVzcy9wcm9qZWN0LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9idXNpbmVzcy9pbmRleC5qcwp2YXIgYnVzaW5lc3NfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChidXNpbmVzc19leHBvcnRzLCB7CiAgSUpvYjogKCkgPT4gSUpvYgp9KTsKdmFyIGluaXRfYnVzaW5lc3MgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3MvaW5kZXguanMiKCkgewogICAgaW5pdF9hZGRyZXNzKCk7CiAgICBpbml0X2NvbXBhbnkoKTsKICAgIGluaXRfY29udGFjdCgpOwogICAgaW5pdF9qb2IoKTsKICAgIGluaXRfbGV0dGVyKCk7CiAgICBpbml0X3BkZigpOwogICAgaW5pdF9wZXJzb24oKTsKICAgIGluaXRfcHJvamVjdCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvZGUvY29tbWl0aW5mby5qcwp2YXIgaW5pdF9jb21taXRpbmZvID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvZGUvY29tbWl0aW5mby5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvY29kZS9zdGF0dXNvYmplY3QuanMKdmFyIGluaXRfc3RhdHVzb2JqZWN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvZGUvc3RhdHVzb2JqZWN0LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9jb2RlL2luZGV4LmpzCnZhciBjb2RlX2V4cG9ydHMgPSB7fTsKdmFyIGluaXRfY29kZTMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvY29kZS9pbmRleC5qcyIoKSB7CiAgICBpbml0X2NvbW1pdGluZm8oKTsKICAgIGluaXRfc3RhdHVzb2JqZWN0KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvY29udGFpbmVyL2NvbnRhaW5lci5qcwp2YXIgaW5pdF9jb250YWluZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvY29udGFpbmVyL2NvbnRhaW5lci5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvY29udGFpbmVyL3ZvbHVtZW1vdW50LmpzCnZhciBpbml0X3ZvbHVtZW1vdW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvbnRhaW5lci92b2x1bWVtb3VudC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvY29udGFpbmVyL2luZGV4LmpzCnZhciBjb250YWluZXJfZXhwb3J0cyA9IHt9Owp2YXIgaW5pdF9jb250YWluZXIyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvbnRhaW5lci9pbmRleC5qcyIoKSB7CiAgICBpbml0X2NvbnRhaW5lcigpOwogICAgaW5pdF92b2x1bWVtb3VudCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvbnRlbnQvYXJ0aWNsZS5qcwp2YXIgaW5pdF9hcnRpY2xlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvbnRlbnQvYXJ0aWNsZS5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMyMygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvbnRlbnQvYXV0aG9yLmpzCnZhciBpbml0X2F1dGhvciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9jb250ZW50L2F1dGhvci5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMyMygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvbnRlbnQvZG9jdW1lbnRhdGlvbnNldC5qcwp2YXIgaW5pdF9kb2N1bWVudGF0aW9uc2V0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvbnRlbnQvZG9jdW1lbnRhdGlvbnNldC5qcyIoKSB7CiAgICBpbml0X2FydGljbGUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9jb250ZW50L2luZGV4LmpzCnZhciBjb250ZW50X2V4cG9ydHMgPSB7fTsKdmFyIGluaXRfY29udGVudDMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvY29udGVudC9pbmRleC5qcyIoKSB7CiAgICBpbml0X2FydGljbGUoKTsKICAgIGluaXRfYXV0aG9yKCk7CiAgICBpbml0X2RvY3VtZW50YXRpb25zZXQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9nZW5lcmFsL2RhdGUuanMKdmFyIGluaXRfZGF0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9nZW5lcmFsL2RhdGUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2dlbmVyYWwvdGltZS5qcwp2YXIgaW5pdF90aW1lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2dlbmVyYWwvdGltZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZ2VuZXJhbC9pbmRleC5qcwp2YXIgZ2VuZXJhbF9leHBvcnRzID0ge307CnZhciBpbml0X2dlbmVyYWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZ2VuZXJhbC9pbmRleC5qcyIoKSB7CiAgICBpbml0X2RhdGUoKTsKICAgIGluaXRfdGltZSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvY2VydC5qcwp2YXIgaW5pdF9jZXJ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvY2VydC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvbmV0d29yay9jbmFtZS5qcwp2YXIgSUNuYW1lRGVzY3JpcHRvcjsKdmFyIGluaXRfY25hbWUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvbmV0d29yay9jbmFtZS5qcyIoKSB7CiAgICBpbml0X2NlcnQoKTsKICAgIElDbmFtZURlc2NyaXB0b3IgPSBjbGFzcyB7CiAgICB9OwogICAgOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvZGV2aWNlLmpzCnZhciBpbml0X2RldmljZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9uZXR3b3JrL2RldmljZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvbmV0d29yay9kbnMuanMKdmFyIGluaXRfZG5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvZG5zLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9uZXR3b3JrL2Ruc2NoYWxsZW5nZS5qcwp2YXIgaW5pdF9kbnNjaGFsbGVuZ2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvbmV0d29yay9kbnNjaGFsbGVuZ2UuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvZG9tYWluZGVsZWdhdGlvbi5qcwp2YXIgaW5pdF9kb21haW5kZWxlZ2F0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvZG9tYWluZGVsZWdhdGlvbi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvbmV0d29yay9qd3QuanMKdmFyIGluaXRfand0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvand0LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9uZXR3b3JrL25ldHdvcmtub2RlLmpzCnZhciBpbml0X25ldHdvcmtub2RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvbmV0d29ya25vZGUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvcmVxdWVzdC5qcwp2YXIgaW5pdF9yZXF1ZXN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvcmVxdWVzdC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvbmV0d29yay9yZXZlcnNlcHJveHkuanMKdmFyIGluaXRfcmV2ZXJzZXByb3h5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvcmV2ZXJzZXByb3h5LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9uZXR3b3JrL3NzaC5qcwp2YXIgaW5pdF9zc2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvbmV0d29yay9zc2guanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvaW5kZXguanMKdmFyIG5ldHdvcmtfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChuZXR3b3JrX2V4cG9ydHMsIHsKICBJQ25hbWVEZXNjcmlwdG9yOiAoKSA9PiBJQ25hbWVEZXNjcmlwdG9yCn0pOwp2YXIgaW5pdF9uZXR3b3JrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvaW5kZXguanMiKCkgewogICAgaW5pdF9jZXJ0KCk7CiAgICBpbml0X2NuYW1lKCk7CiAgICBpbml0X2RldmljZSgpOwogICAgaW5pdF9kbnMoKTsKICAgIGluaXRfZG5zY2hhbGxlbmdlKCk7CiAgICBpbml0X2RvbWFpbmRlbGVnYXRpb24oKTsKICAgIGluaXRfand0KCk7CiAgICBpbml0X25ldHdvcmtub2RlKCk7CiAgICBpbml0X3JlcXVlc3QoKTsKICAgIGluaXRfcmV2ZXJzZXByb3h5KCk7CiAgICBpbml0X3NzaCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL3NhYXMvcHJvZHVjdC5qcwp2YXIgaW5pdF9wcm9kdWN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL3NhYXMvcHJvZHVjdC5qcyIoKSB7CiAgICBpbml0X2NvbXBhbnkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9zYWFzL3N1YnNjcmlwdGlvbnBsYW4uanMKdmFyIGluaXRfc3Vic2NyaXB0aW9ucGxhbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9zYWFzL3N1YnNjcmlwdGlvbnBsYW4uanMiKCkgewogICAgaW5pdF9wcm9kdWN0KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvc2Fhcy9pbmRleC5qcwp2YXIgc2Fhc19leHBvcnRzID0ge307CnZhciBpbml0X3NhYXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvc2Fhcy9pbmRleC5qcyIoKSB7CiAgICBpbml0X3N1YnNjcmlwdGlvbnBsYW4oKTsKICAgIGluaXRfcHJvZHVjdCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL3N0b3JhZ2UvaW5kZXguanMKdmFyIHN0b3JhZ2VfZXhwb3J0cyA9IHt9Owp2YXIgaW5pdF9zdG9yYWdlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL3N0b3JhZ2UvaW5kZXguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL3dlYnNpdGUvbGluay5qcwp2YXIgaW5pdF9saW5rMyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy93ZWJzaXRlL2xpbmsuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL3dlYnNpdGUvbWVudWl0ZW0uanMKdmFyIGluaXRfbWVudWl0ZW0gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvd2Vic2l0ZS9tZW51aXRlbS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvd2Vic2l0ZS9saW5rYmxvY2suanMKdmFyIGluaXRfbGlua2Jsb2NrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL3dlYnNpdGUvbGlua2Jsb2NrLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy93ZWJzaXRlL2luZGV4LmpzCnZhciB3ZWJzaXRlX2V4cG9ydHMgPSB7fTsKdmFyIGluaXRfd2Vic2l0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy93ZWJzaXRlL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGluazMoKTsKICAgIGluaXRfbWVudWl0ZW0oKTsKICAgIGluaXRfbGlua2Jsb2NrKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvdHlwZWZlc3Qub3duLmpzCnZhciBpbml0X3R5cGVmZXN0X293biA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy90eXBlZmVzdC5vd24uanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMyMyA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMyMywgewogIGJ1c2luZXNzOiAoKSA9PiBidXNpbmVzc19leHBvcnRzLAogIGNvZGU6ICgpID0+IGNvZGVfZXhwb3J0cywKICBjb250YWluZXI6ICgpID0+IGNvbnRhaW5lcl9leHBvcnRzLAogIGNvbnRlbnQ6ICgpID0+IGNvbnRlbnRfZXhwb3J0cywKICBkYXRhYmFzZTogKCkgPT4gZGF0YWJhc2VfZXhwb3J0cywKICBmaW5hbmNlOiAoKSA9PiBmaW5hbmNlX2V4cG9ydHMsCiAgZ2VuZXJhbDogKCkgPT4gZ2VuZXJhbF9leHBvcnRzLAogIG5ldHdvcms6ICgpID0+IG5ldHdvcmtfZXhwb3J0cywKICBzYWFzOiAoKSA9PiBzYWFzX2V4cG9ydHMsCiAgc3RvcmFnZTogKCkgPT4gc3RvcmFnZV9leHBvcnRzLAogIHdlYnNpdGU6ICgpID0+IHdlYnNpdGVfZXhwb3J0cwp9KTsKdmFyIGluaXRfZGlzdF90czIzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfYnVzaW5lc3MoKTsKICAgIGluaXRfY29kZTMoKTsKICAgIGluaXRfY29udGFpbmVyMigpOwogICAgaW5pdF9kYXRhYmFzZSgpOwogICAgaW5pdF9maW5hbmNlKCk7CiAgICBpbml0X2NvbnRlbnQzKCk7CiAgICBpbml0X2dlbmVyYWwoKTsKICAgIGluaXRfbmV0d29yaygpOwogICAgaW5pdF9zYWFzKCk7CiAgICBpbml0X3N0b3JhZ2UoKTsKICAgIGluaXRfd2Vic2l0ZSgpOwogICAgaW5pdF90eXBlZmVzdF9vd24oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy93ZWJzZXR1cC5wbHVnaW5zLmpzCnZhciBpbml0X3dlYnNldHVwX3BsdWdpbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMyMigpOwogICAgaW5pdF9kaXN0X3RzMjEoKTsKICAgIGluaXRfZGlzdF90czIzKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvaW50ZXJmYWNlcy9pbmRleC5qcwp2YXIgaW5pdF9pbnRlcmZhY2VzMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy9pbnRlcmZhY2VzL2luZGV4LmpzIigpIHsKICAgIGluaXRfd2Vic2V0dXBfcGx1Z2lucygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2Vic2V0dXBAMy4wLjE5L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJzZXR1cC9kaXN0X3RzL3dlYnNldHVwLmNsYXNzZXMudGFnLmpzCnZhciBUYWc7CnZhciBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGFnID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2Vic2V0dXBAMy4wLjE5L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJzZXR1cC9kaXN0X3RzL3dlYnNldHVwLmNsYXNzZXMudGFnLmpzIigpIHsKICAgIGluaXRfd2Vic2V0dXBfcGx1Z2lucygpOwogICAgVGFnID0gY2xhc3MgewogICAgICBhcHBlbmRUb0RvbSgpIHsKICAgICAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5wYXJlbnRFbGVtZW50ICYmICF0aGlzLmVsZW1lbnRSZWYucGFyZW50Tm9kZSkgewogICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnRSZWYpOwogICAgICAgIH0KICAgICAgfQogICAgICByZW1vdmVGcm9tRG9tKCkgewogICAgICAgIGlmICh0aGlzLmVsZW1lbnRSZWYucGFyZW50RWxlbWVudCkgewogICAgICAgICAgdGhpcy5lbGVtZW50UmVmLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50UmVmKTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudFJlZi5wYXJlbnROb2RlKSB7CiAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnRSZWYpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy93ZWJzZXR1cC5jbGFzc2VzLnRhZy5qc29ubGR0YWcuanMKdmFyIEpzb25MZFRhZzsKdmFyIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWdfanNvbmxkdGFnID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2Vic2V0dXBAMy4wLjE5L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJzZXR1cC9kaXN0X3RzL3dlYnNldHVwLmNsYXNzZXMudGFnLmpzb25sZHRhZy5qcyIoKSB7CiAgICBpbml0X3dlYnNldHVwX3BsdWdpbnMoKTsKICAgIGluaXRfaW50ZXJmYWNlczIoKTsKICAgIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWcoKTsKICAgIEpzb25MZFRhZyA9IGNsYXNzIF9Kc29uTGRUYWcgZXh0ZW5kcyBUYWcgewogICAgICBzdGF0aWMgY3JlYXRlQ29tcGFueUpzb25MZChjb21wYW55RGF0YUFyZykgewogICAgICAgIGNvbnN0IGNvbXBhbnlMZCA9IHsKICAgICAgICAgICJAY29udGV4dCI6ICJodHRwczovL3NjaGVtYS5vcmciLAogICAgICAgICAgIkB0eXBlIjogIkNvcnBvcmF0aW9uIiwKICAgICAgICAgIG5hbWU6IGNvbXBhbnlEYXRhQXJnLm5hbWUsCiAgICAgICAgICBhbHRlcm5hdGVOYW1lOiBjb21wYW55RGF0YUFyZy5uYW1lLnJlcGxhY2UoIiBHbWJIIiwgIiIpLAogICAgICAgICAgdXJsOiBjb21wYW55RGF0YUFyZy5jb250YWN0LndlYnNpdGUsCiAgICAgICAgICBsb2dvOiBjb21wYW55RGF0YUFyZy5jb250YWN0LmxvZ29VcmwsCiAgICAgICAgICBjb250YWN0UG9pbnQ6IHsKICAgICAgICAgICAgIkB0eXBlIjogIkNvbnRhY3RQb2ludCIsCiAgICAgICAgICAgIHRlbGVwaG9uZTogY29tcGFueURhdGFBcmcuY29udGFjdC5waG9uZSwKICAgICAgICAgICAgY29udGFjdFR5cGU6ICJjdXN0b21lciBzZXJ2aWNlIiwKICAgICAgICAgICAgYXJlYVNlcnZlZDogIkRFIiwKICAgICAgICAgICAgYXZhaWxhYmxlTGFuZ3VhZ2U6IFsiZW4iLCAiR2VybWFuIl0KICAgICAgICAgIH0sCiAgICAgICAgICBzYW1lQXM6IFtdCiAgICAgICAgfTsKICAgICAgICBpZiAoY29tcGFueURhdGFBcmcuY29udGFjdC5mYWNlYm9va1VybCkgewogICAgICAgICAgY29tcGFueUxkLnNhbWVBcy5wdXNoKGNvbXBhbnlEYXRhQXJnLmNvbnRhY3QuZmFjZWJvb2tVcmwpOwogICAgICAgIH0KICAgICAgICBpZiAoY29tcGFueURhdGFBcmcuY29udGFjdC50d2l0dGVyVXJsKSB7CiAgICAgICAgICBjb21wYW55TGQuc2FtZUFzLnB1c2goY29tcGFueURhdGFBcmcuY29udGFjdC50d2l0dGVyVXJsKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGRUYWcgPSBuZXcgX0pzb25MZFRhZyhjb21wYW55TGQpOwogICAgICAgIHJldHVybiBsZFRhZzsKICAgICAgfQogICAgICBzdGF0aWMgY3JlYXRlTmV3c0FydGljbGVKc29uTGQobmV3c0FydGljbGVBcmcpIHsKICAgICAgICBjb25zdCBuZXdzQXJ0aWNsZUxkID0gewogICAgICAgICAgIkBjb250ZXh0IjogImh0dHBzOi8vc2NoZW1hLm9yZyIsCiAgICAgICAgICAiQHR5cGUiOiAiTmV3c0FydGljbGUiLAogICAgICAgICAgbWFpbkVudGl0eU9mUGFnZTogewogICAgICAgICAgICAiQHR5cGUiOiAiV2ViUGFnZSIsCiAgICAgICAgICAgICJAaWQiOiB3aW5kb3cubG9jYXRpb24uaHJlZgogICAgICAgICAgfSwKICAgICAgICAgIGhlYWRsaW5lOiAiQXJ0aWNsZSBoZWFkbGluZSIsCiAgICAgICAgICBpbWFnZTogW25ld3NBcnRpY2xlQXJnLmZlYXR1cmVkSW1hZ2VVcmxdLAogICAgICAgICAgZGF0ZVB1Ymxpc2hlZDogbmV3IERhdGUobmV3c0FydGljbGVBcmcudGltZXN0YW1wKS50b0lTT1N0cmluZygpLAogICAgICAgICAgZGF0ZU1vZGlmaWVkOiBuZXcgRGF0ZShuZXdzQXJ0aWNsZUFyZy50aW1lc3RhbXApLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICBhdXRob3I6IHsKICAgICAgICAgICAgIkB0eXBlIjogIlBlcnNvbiIsCiAgICAgICAgICAgIG5hbWU6IGAke25ld3NBcnRpY2xlQXJnLmF1dGhvci5maXJzdE5hbWV9ICR7bmV3c0FydGljbGVBcmcuYXV0aG9yLnN1ck5hbWV9YAogICAgICAgICAgfSwKICAgICAgICAgIHB1Ymxpc2hlcjogewogICAgICAgICAgICAiQHR5cGUiOiAiT3JnYW5pemF0aW9uIiwKICAgICAgICAgICAgbmFtZTogbmV3c0FydGljbGVBcmcuYXV0aG9yLnN1ck5hbWUsCiAgICAgICAgICAgIGxvZ286IHsKICAgICAgICAgICAgICAiQHR5cGUiOiAiSW1hZ2VPYmplY3QiLAogICAgICAgICAgICAgIHVybDogbmV3c0FydGljbGVBcmcuYXV0aG9yLnN1ck5hbWUKICAgICAgICAgICAgICAvLyBUT0RPCiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBkZXNjcmlwdGlvbjogbmV3c0FydGljbGVBcmcuYXV0aG9yLmZpcnN0TmFtZQogICAgICAgIH07CiAgICAgICAgY29uc3QgbGRUYWcgPSBuZXcgX0pzb25MZFRhZyhuZXdzQXJ0aWNsZUxkKTsKICAgICAgICByZXR1cm4gbGRUYWc7CiAgICAgIH0KICAgICAgc3RhdGljIGNyZWF0ZVByb2R1Y3RKc29uTGQocHJvZHVjdEFyZywgcHVibGlzaGVyQXJnKSB7CiAgICAgICAgY29uc3QgcHJvZHVjdExkID0gewogICAgICAgICAgIkBjb250ZXh0IjogImh0dHBzOi8vc2NoZW1hLm9yZyIsCiAgICAgICAgICAiQHR5cGUiOiAiU29mdHdhcmVBcHBsaWNhdGlvbiIsCiAgICAgICAgICBuYW1lOiBwcm9kdWN0QXJnLm5hbWUsCiAgICAgICAgICBkZXNjcmlwdGlvbjogcHJvZHVjdEFyZy5kZXNjcmlwdGlvbiwKICAgICAgICAgIG9wZXJhdGluZ1N5c3RlbTogcHJvZHVjdEFyZy5vcywKICAgICAgICAgIGFwcGxpY2F0aW9uQ2F0ZWdvcnk6IHByb2R1Y3RBcmcuY2F0ZWdvcnksCiAgICAgICAgICBvZmZlcnM6IHsKICAgICAgICAgICAgIkB0eXBlIjogIk9mZmVyIiwKICAgICAgICAgICAgbmFtZTogIlVzZXItYmFzZWQgUGxhbiIsCiAgICAgICAgICAgIHByaWNlU3BlY2lmaWNhdGlvbjogewogICAgICAgICAgICAgICJAdHlwZSI6ICJQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbiIsCiAgICAgICAgICAgICAgdmFsdWVOYW1lOiAiTnVtYmVyIG9mIFVzZXJzIiwKICAgICAgICAgICAgICB2YWx1ZVJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgICAgIHByaWNlOiAiNC45OSIsCiAgICAgICAgICAgICAgcHJpY2VDdXJyZW5jeTogIkVVUiIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIHB1Ymxpc2hlcjogdGhpcy5jcmVhdGVDb21wYW55SnNvbkxkKHB1Ymxpc2hlckFyZykuZWxlbWVudFJlZi50ZXh0Q29udGVudCwKICAgICAgICAgIHNjcmVlbnNob3Q6ICJodHRwczovL3d3dy5zb2NpYWwuaW8vc2NyZWVuc2hvdC5wbmciLAogICAgICAgICAgdXJsOiAiaHR0cHM6Ly93d3cuc29jaWFsLmlvLyIKICAgICAgICB9OwogICAgICAgIGNvbnN0IGxkVGFnID0gbmV3IF9Kc29uTGRUYWcocHJvZHVjdExkKTsKICAgICAgICByZXR1cm4gbGRUYWc7CiAgICAgIH0KICAgICAgLy8gSU5TVEFOQ0UKICAgICAgY29uc3RydWN0b3IobGRPYmplY3RBcmcpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIGNvbnN0IGpzb25MZEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgICAgICBqc29uTGRFbGVtZW50LnR5cGUgPSAiYXBwbGljYXRpb24vbGQranNvbiI7CiAgICAgICAganNvbkxkRWxlbWVudC50ZXh0ID0gSlNPTi5zdHJpbmdpZnkobGRPYmplY3RBcmcpOwogICAgICAgIHRoaXMuZWxlbWVudFJlZiA9IGpzb25MZEVsZW1lbnQ7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50YWcub3BlbmdyYXBodGFnLmpzCnZhciBPcGVuZ3JhcGhUYWc7CnZhciBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGFnX29wZW5ncmFwaHRhZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy93ZWJzZXR1cC5jbGFzc2VzLnRhZy5vcGVuZ3JhcGh0YWcuanMiKCkgewogICAgaW5pdF93ZWJzZXR1cF9wbHVnaW5zKCk7CiAgICBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGFnKCk7CiAgICBPcGVuZ3JhcGhUYWcgPSBjbGFzcyBfT3BlbmdyYXBoVGFnIGV4dGVuZHMgVGFnIHsKICAgICAgc3RhdGljIGNyZWF0ZU5ld3NBcnRpY2xlT2dUYWdzKG5ld3NBcnRpY2xlQXJnKSB7CiAgICAgICAgY29uc3QgdGFnQXJyYXkgPSBbXTsKICAgICAgICB0YWdBcnJheS5wdXNoKG5ldyBfT3BlbmdyYXBoVGFnKCJvZzp1cmwiLCBuZXdzQXJ0aWNsZUFyZy51cmwpKTsKICAgICAgICB0YWdBcnJheS5wdXNoKG5ldyBfT3BlbmdyYXBoVGFnKCJvZzp0aXRsZSIsIG5ld3NBcnRpY2xlQXJnLnRpdGxlKSk7CiAgICAgICAgdGFnQXJyYXkucHVzaChuZXcgX09wZW5ncmFwaFRhZygib2c6ZGVzY3JpcHRpb24iLCBuZXdzQXJ0aWNsZUFyZy5jb250ZW50KSk7CiAgICAgICAgdGFnQXJyYXkucHVzaChuZXcgX09wZW5ncmFwaFRhZygib2c6aW1hZ2UiLCBuZXdzQXJ0aWNsZUFyZy5mZWF0dXJlZEltYWdlVXJsKSk7CiAgICAgICAgcmV0dXJuIHRhZ0FycmF5OwogICAgICB9CiAgICAgIHN0YXRpYyBjcmVhdGVQcm9kdWN0T2dUYWdzKHByb2R1Y3RBcmcpIHsKICAgICAgICBjb25zdCB0YWdBcnJheSA9IFtdOwogICAgICAgIHRhZ0FycmF5LnB1c2gobmV3IF9PcGVuZ3JhcGhUYWcoIm9nOnVybCIsIGdsb2JhbFRoaXMubG9jYXRpb24uaHJlZikpOwogICAgICAgIHRhZ0FycmF5LnB1c2gobmV3IF9PcGVuZ3JhcGhUYWcoIm9nOnRpdGxlIiwgYCR7cHJvZHVjdEFyZy5uYW1lfSAtICR7cHJvZHVjdEFyZy5zbG9nYW59YCkpOwogICAgICAgIHRhZ0FycmF5LnB1c2gobmV3IF9PcGVuZ3JhcGhUYWcoIm9nOnNpdGVfbmFtZSIsIHByb2R1Y3RBcmcubmFtZSkpOwogICAgICAgIHRhZ0FycmF5LnB1c2gobmV3IF9PcGVuZ3JhcGhUYWcoIm9nOmRlc2NyaXB0aW9uIiwgcHJvZHVjdEFyZy5kZXNjcmlwdGlvbikpOwogICAgICAgIHRhZ0FycmF5LnB1c2gobmV3IF9PcGVuZ3JhcGhUYWcoIm9nOmltYWdlIiwgcHJvZHVjdEFyZy5sb2dvTGluaykpOwogICAgICAgIHJldHVybiB0YWdBcnJheTsKICAgICAgfQogICAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eU5hbWVBcmcsIGNvbnRlbnRBcmcpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIGNvbnN0IG9wZW5HcmFwaEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJtZXRhIik7CiAgICAgICAgb3BlbkdyYXBoRWxlbWVudC5zZXRBdHRyaWJ1dGUoInByb3BlcnR5IiwgcHJvcGVydHlOYW1lQXJnKTsKICAgICAgICBvcGVuR3JhcGhFbGVtZW50LmNvbnRlbnQgPSBjb250ZW50QXJnOwogICAgICAgIHRoaXMuZWxlbWVudFJlZiA9IG9wZW5HcmFwaEVsZW1lbnQ7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50YWdsZXZlbC5qcwp2YXIgVGFnTGV2ZWw7CnZhciBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGFnbGV2ZWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50YWdsZXZlbC5qcyIoKSB7CiAgICBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGFnKCk7CiAgICBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGFnX2pzb25sZHRhZygpOwogICAgaW5pdF93ZWJzZXR1cF9jbGFzc2VzX3RhZ19vcGVuZ3JhcGh0YWcoKTsKICAgIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWdtYW5hZ2VyKCk7CiAgICBpbml0X3dlYnNldHVwX3BsdWdpbnMoKTsKICAgIFRhZ0xldmVsID0gY2xhc3MgewogICAgICBzZXQgdGl0bGUodGl0bGVBcmcpIHsKICAgICAgICB0aGlzLnRpdGxlU3RvcmUgPSB0aXRsZUFyZzsKICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gImVuYWJsZWQiKSB7CiAgICAgICAgICBkb2N1bWVudC50aXRsZSA9IHRoaXMudGl0bGVTdG9yZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZ2V0IHRpdGxlKCkgewogICAgICAgIHJldHVybiB0aGlzLnRpdGxlU3RvcmU7CiAgICAgIH0KICAgICAgY29uc3RydWN0b3IodGFnTWFuYWdlclJlZkFyZywgbGV2ZWxUeXBlKSB7CiAgICAgICAgdGhpcy50YWdzID0gW107CiAgICAgICAgdGhpcy5zdGF0ZSA9ICJkaXNhYmxlZCI7CiAgICAgICAgdGhpcy50YWdNYW5hZ2VyUmVmID0gdGFnTWFuYWdlclJlZkFyZzsKICAgICAgfQogICAgICBhZGRUYWcodGFnQXJnKSB7CiAgICAgICAgaWYgKHRhZ0FyZyBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgICAgICBmb3IgKGNvbnN0IHRhZ0FyZzIgb2YgdGFnQXJnKSB7CiAgICAgICAgICAgIHRoaXMuYWRkVGFnKHRhZ0FyZzIpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnRhZ3MucHVzaCh0YWdBcmcpOwogICAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICJlbmFibGVkIikgewogICAgICAgICAgICB0YWdBcmcuYXBwZW5kVG9Eb20oKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgYXN5bmMgYWRkQ29tcGFueUluZm8oY29tcGFueURhdGFBcmcpIHsKICAgICAgICB0aGlzLmFkZFRhZyhKc29uTGRUYWcuY3JlYXRlQ29tcGFueUpzb25MZChjb21wYW55RGF0YUFyZykpOwogICAgICAgIHRoaXMuYWRkVGFnKG5ldyBPcGVuZ3JhcGhUYWcoIm9nOnR5cGUiLCAiYnVzaW5lc3MuYnVzaW5lc3MiKSk7CiAgICAgICAgdGhpcy5hZGRUYWcobmV3IE9wZW5ncmFwaFRhZygib2c6dGl0bGUiLCBjb21wYW55RGF0YUFyZy5uYW1lKSk7CiAgICAgICAgdGhpcy5hZGRUYWcobmV3IE9wZW5ncmFwaFRhZygib2c6dXJsIiwgY29tcGFueURhdGFBcmcuY29udGFjdC53ZWJzaXRlKSk7CiAgICAgICAgdGhpcy5hZGRUYWcobmV3IE9wZW5ncmFwaFRhZygib2c6aW1hZ2UiLCBjb21wYW55RGF0YUFyZy5jb250YWN0LmxvZ29VcmwpKTsKICAgICAgICB0aGlzLmFkZFRhZyhuZXcgT3BlbmdyYXBoVGFnKCJidXNpbmVzczpjb250YWN0X2RhdGE6c3RyZWV0X2FkZHJlc3MiLCBgJHtjb21wYW55RGF0YUFyZy5jb250YWN0LmFkZHJlc3Muc3RyZWV0TmFtZX0gJHtjb21wYW55RGF0YUFyZy5jb250YWN0LmFkZHJlc3MuaG91c2VOdW1iZXJ9YCkpOwogICAgICAgIHRoaXMuYWRkVGFnKG5ldyBPcGVuZ3JhcGhUYWcoImJ1c2luZXNzOmNvbnRhY3RfZGF0YTpsb2NhbGl0eSIsIGNvbXBhbnlEYXRhQXJnLmNvbnRhY3QuYWRkcmVzcy5wb3N0YWxDb2RlKSk7CiAgICAgICAgdGhpcy5hZGRUYWcobmV3IE9wZW5ncmFwaFRhZygiYnVzaW5lc3M6Y29udGFjdF9kYXRhOnJlZ2lvbiIsIGNvbXBhbnlEYXRhQXJnLmNvbnRhY3QuYWRkcmVzcy5jaXR5KSk7CiAgICAgICAgdGhpcy5hZGRUYWcobmV3IE9wZW5ncmFwaFRhZygiYnVzaW5lc3M6Y29udGFjdF9kYXRhOnBvc3RhbF9jb2RlIiwgY29tcGFueURhdGFBcmcuY29udGFjdC5hZGRyZXNzLnBvc3RhbENvZGUpKTsKICAgICAgICB0aGlzLmFkZFRhZyhuZXcgT3BlbmdyYXBoVGFnKCJidXNpbmVzczpjb250YWN0X2RhdGE6Y291bnRyeV9uYW1lIiwgY29tcGFueURhdGFBcmcuY29udGFjdC5hZGRyZXNzLmNvdW50cnkpKTsKICAgICAgfQogICAgICBhZGROZXdzQXJ0aWNsZUluZm8oYXJ0aWNsZUFyZykgewogICAgICAgIHRoaXMuYWRkVGFnKEpzb25MZFRhZy5jcmVhdGVOZXdzQXJ0aWNsZUpzb25MZChhcnRpY2xlQXJnKSk7CiAgICAgICAgdGhpcy5hZGRUYWcoT3BlbmdyYXBoVGFnLmNyZWF0ZU5ld3NBcnRpY2xlT2dUYWdzKGFydGljbGVBcmcpKTsKICAgICAgfQogICAgICBhZGRQcm9kdWN0SW5mbyhwcm9kdWN0QXJnLCBjb21wYW55QXJnKSB7CiAgICAgICAgdGhpcy5hZGRUYWcoSnNvbkxkVGFnLmNyZWF0ZVByb2R1Y3RKc29uTGQocHJvZHVjdEFyZywgY29tcGFueUFyZykpOwogICAgICAgIHRoaXMuYWRkVGFnKE9wZW5ncmFwaFRhZy5jcmVhdGVQcm9kdWN0T2dUYWdzKHByb2R1Y3RBcmcpKTsKICAgICAgfQogICAgICBhc3luYyBlbmFibGUoKSB7CiAgICAgICAgaWYgKHRoaXMudGl0bGUpIHsKICAgICAgICAgIGRvY3VtZW50LnRpdGxlID0gdGhpcy50aXRsZTsKICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCB0YWdBcmcgb2YgdGhpcy50YWdzKSB7CiAgICAgICAgICB0YWdBcmcuYXBwZW5kVG9Eb20oKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zdGF0ZSA9ICJlbmFibGVkIjsKICAgICAgfQogICAgICBhc3luYyBkaXNhYmxlKCkgewogICAgICAgIGZvciAoY29uc3QgdGFnQXJnIG9mIHRoaXMudGFncykgewogICAgICAgICAgdGFnQXJnLnJlbW92ZUZyb21Eb20oKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zdGF0ZSA9ICJkaXNhYmxlZCI7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50YWcubWV0YXRhZy5qcwp2YXIgTWV0YVRhZzsKdmFyIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWdfbWV0YXRhZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy93ZWJzZXR1cC5jbGFzc2VzLnRhZy5tZXRhdGFnLmpzIigpIHsKICAgIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWcoKTsKICAgIE1ldGFUYWcgPSBjbGFzcyBleHRlbmRzIFRhZyB7CiAgICAgIGNvbnN0cnVjdG9yKG1ldGFOYW1lQXJnLCBjb250ZW50QXJnKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICBjb25zdCBtZXRhRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm1ldGEiKTsKICAgICAgICBtZXRhRWxlbWVudC5uYW1lID0gbWV0YU5hbWVBcmc7CiAgICAgICAgbWV0YUVsZW1lbnQuY29udGVudCA9IGNvbnRlbnRBcmc7CiAgICAgICAgdGhpcy5lbGVtZW50UmVmID0gbWV0YUVsZW1lbnQ7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50YWdtYW5hZ2VyLmpzCnZhciBUYWdNYW5hZ2VyOwp2YXIgaW5pdF93ZWJzZXR1cF9jbGFzc2VzX3RhZ21hbmFnZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50YWdtYW5hZ2VyLmpzIigpIHsKICAgIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWdsZXZlbCgpOwogICAgaW5pdF93ZWJzZXR1cF9wbHVnaW5zKCk7CiAgICBpbml0X2ludGVyZmFjZXMyKCk7CiAgICBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGFnX21ldGF0YWcoKTsKICAgIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWdfanNvbmxkdGFnKCk7CiAgICBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGFnX29wZW5ncmFwaHRhZygpOwogICAgVGFnTWFuYWdlciA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5nbG9iYWxMZXZlbCA9IG5ldyBUYWdMZXZlbCh0aGlzLCAiZ2xvYmFsIik7CiAgICAgICAgdGhpcy5iYXNlTGV2ZWwgPSBuZXcgVGFnTGV2ZWwodGhpcywgImJhc2UiKTsKICAgICAgfQogICAgICBhc3luYyBzZXR1cChtZXRhT2JqZWN0QXJnKSB7CiAgICAgICAgdGhpcy5nbG9iYWxMZXZlbC5hZGRUYWcobmV3IE1ldGFUYWcoImdvb2dsZSIsICJub3RyYW5zbGF0ZSIpKTsKICAgICAgICB0aGlzLmdsb2JhbExldmVsLmFkZFRhZyhuZXcgTWV0YVRhZygicmV2aXNpdC1hZnRlciIsICIxIGRheXMiKSk7CiAgICAgICAgaWYgKG1ldGFPYmplY3RBcmcudHdpdHRlckhhbmRsZSkgewogICAgICAgICAgdGhpcy5nbG9iYWxMZXZlbC5hZGRUYWcobmV3IE1ldGFUYWcoInR3aXR0ZXI6Y2FyZCIsICJzdW1tYXJ5X2xhcmdlX2ltYWdlIikpOwogICAgICAgICAgdGhpcy5nbG9iYWxMZXZlbC5hZGRUYWcobmV3IE1ldGFUYWcoInR3aXR0ZXI6c2l0ZSIsIG1ldGFPYmplY3RBcmcudHdpdHRlckhhbmRsZSkpOwogICAgICAgICAgdGhpcy5nbG9iYWxMZXZlbC5hZGRUYWcobmV3IE1ldGFUYWcoInR3aXR0ZXI6Y3JlYXRvciIsIG1ldGFPYmplY3RBcmcudHdpdHRlckhhbmRsZSkpOwogICAgICAgIH0KICAgICAgICB0aGlzLmJhc2VMZXZlbC50aXRsZSA9IG1ldGFPYmplY3RBcmcudGl0bGU7CiAgICAgICAgaWYgKG1ldGFPYmplY3RBcmcuZGVzY3JpcHRpb24pIHsKICAgICAgICAgIHRoaXMuYmFzZUxldmVsLmFkZFRhZyhuZXcgTWV0YVRhZygiZGVzY3JpcHRpb24iLCBtZXRhT2JqZWN0QXJnLmRlc2NyaXB0aW9uKSk7CiAgICAgICAgfQogICAgICAgIGlmIChtZXRhT2JqZWN0QXJnLmNhbm9uaWNhbERvbWFpbikgewogICAgICAgICAgdGhpcy5iYXNlTGV2ZWwuYWRkVGFnKG5ldyBNZXRhVGFnKCJjYW5vbmljYWwiLCBtZXRhT2JqZWN0QXJnLmNhbm9uaWNhbERvbWFpbikpOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKHRydWUpIHsKICAgICAgICAgIGNhc2UgKG1ldGFPYmplY3RBcmcubGRDb21wYW55ICYmICFtZXRhT2JqZWN0QXJnLmxkUHJvZHVjdCk6CiAgICAgICAgICAgIHRoaXMuYmFzZUxldmVsLmFkZENvbXBhbnlJbmZvKG1ldGFPYmplY3RBcmcubGRDb21wYW55KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICEhbWV0YU9iamVjdEFyZy5sZFByb2R1Y3Q6CiAgICAgICAgICAgIHRoaXMuYmFzZUxldmVsLmFkZFByb2R1Y3RJbmZvKG1ldGFPYmplY3RBcmcubGRQcm9kdWN0LCBtZXRhT2JqZWN0QXJnLmxkQ29tcGFueSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBhd2FpdCB0aGlzLmdsb2JhbExldmVsLmVuYWJsZSgpOwogICAgICAgIHRoaXMuYWN0aXZlTGV2ZWwgPSB0aGlzLmJhc2VMZXZlbDsKICAgICAgICBhd2FpdCB0aGlzLmFjdGl2ZUxldmVsLmVuYWJsZSgpOwogICAgICB9CiAgICAgIGFzeW5jIHNldFN1YlBhZ2VMZXZlbChtZXRhT2JqZWN0QXJnKSB7CiAgICAgICAgY29uc3Qgc3ViUGFnZUxldmVsID0gbmV3IFRhZ0xldmVsKHRoaXMsICJzdWJwYWdlIik7CiAgICAgICAgc3ViUGFnZUxldmVsLnRpdGxlID0gbWV0YU9iamVjdEFyZy50aXRsZTsKICAgICAgICBpZiAobWV0YU9iamVjdEFyZy5kZXNjcmlwdGlvbikgewogICAgICAgICAgc3ViUGFnZUxldmVsLmFkZFRhZyhuZXcgTWV0YVRhZygiZGVzY3JpcHRpb24iLCBtZXRhT2JqZWN0QXJnLmRlc2NyaXB0aW9uKSk7CiAgICAgICAgfQogICAgICAgIGF3YWl0IHRoaXMuYWN0aXZlTGV2ZWwuZGlzYWJsZSgpOwogICAgICAgIHRoaXMuYWN0aXZlTGV2ZWwgPSBzdWJQYWdlTGV2ZWw7CiAgICAgICAgYXdhaXQgdGhpcy5hY3RpdmVMZXZlbC5lbmFibGUoKTsKICAgICAgICByZXR1cm4gc3ViUGFnZUxldmVsOwogICAgICB9CiAgICAgIGFzeW5jIHJldmVydFRvQmFzZUxldmVsKCkgewogICAgICAgIGlmICh0aGlzLmFjdGl2ZUxldmVsICE9PSB0aGlzLmJhc2VMZXZlbCkgewogICAgICAgICAgYXdhaXQgdGhpcy5hY3RpdmVMZXZlbC5kaXNhYmxlKCk7CiAgICAgICAgICB0aGlzLmFjdGl2ZUxldmVsID0gdGhpcy5iYXNlTGV2ZWw7CiAgICAgICAgICBhd2FpdCB0aGlzLmFjdGl2ZUxldmVsLmVuYWJsZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy93ZWJzZXR1cC5jbGFzc2VzLndlYnNldHVwLmpzCnZhciBXZWJTZXR1cDsKdmFyIGluaXRfd2Vic2V0dXBfY2xhc3Nlc193ZWJzZXR1cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy93ZWJzZXR1cC5jbGFzc2VzLndlYnNldHVwLmpzIigpIHsKICAgIGluaXRfd2Vic2V0dXBfcGx1Z2lucygpOwogICAgaW5pdF9pbnRlcmZhY2VzMigpOwogICAgaW5pdF93ZWJzZXR1cF9jbGFzc2VzX3RhZ21hbmFnZXIoKTsKICAgIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWdsZXZlbCgpOwogICAgV2ViU2V0dXAgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKG9wdGlvbnNBcmcpIHsKICAgICAgICB0aGlzLnRhZ01hbmFnZXIgPSBuZXcgVGFnTWFuYWdlcigpOwogICAgICAgIHRoaXMucmVhZHlEZWZlcnJlZCA9IGRpc3RfdHNfZXhwb3J0czIxLmRlZmVyKCk7CiAgICAgICAgdGhpcy5yZWFkeUZvclNtYXJ0c3NyRGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMyMS5kZWZlcigpOwogICAgICAgIHRoaXMucmVhZHlQcm9taXNlID0gdGhpcy5yZWFkeURlZmVycmVkLnByb21pc2U7CiAgICAgICAgdGhpcy5yZWFkeUZvclNtYXJ0c3NyUHJvbWlzZSA9IHRoaXMucmVhZHlGb3JTbWFydHNzckRlZmVycmVkLnByb21pc2U7CiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc0FyZzsKICAgICAgICB0aGlzLnNldHVwKCkudGhlbigoKSA9PiB7CiAgICAgICAgICB0aGlzLnJlYWR5RGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc21hcnRzc3JXYWl0Rm9yUmVhZHlTaWduYWwpIHsKICAgICAgICAgICAgdGhpcy5yZWFkeUZvclNtYXJ0c3NyRGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBhbiBhc3luYyBzZXR1cCBjYWxsZWQgYnkgdGhlIGNvbnN0cnVjdG9yCiAgICAgICAqLwogICAgICBhc3luYyBzZXR1cChvcHRpb25zQXJnKSB7CiAgICAgICAgaWYgKG9wdGlvbnNBcmcpIHsKICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNBcmc7CiAgICAgICAgfQogICAgICAgIGF3YWl0IHRoaXMudGFnTWFuYWdlci5zZXR1cCh0aGlzLm9wdGlvbnMubWV0YU9iamVjdCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHJldmVydHMgdGhlIGFjdGl2ZSBsZXZlbCBhbmQgcmV0dXJucyB0byB0aGUgYmFzZSBsZXZlbAogICAgICAgKi8KICAgICAgcmV2ZXJ0VG9CYXNlTGV2ZWwoKSB7CiAgICAgICAgdGhpcy50YWdNYW5hZ2VyLnJldmVydFRvQmFzZUxldmVsKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHNldHMgYSBzdWJwYWdlCiAgICAgICAqIEBwYXJhbSBtZXRhT2JqZWN0QXJnCiAgICAgICAqLwogICAgICBhc3luYyBzZXRTdWJMZXZlbChtZXRhT2JqZWN0QXJnKSB7CiAgICAgICAgY29uc3Qgc3ViTGV2ZWwgPSBhd2FpdCB0aGlzLnRhZ01hbmFnZXIuc2V0U3ViUGFnZUxldmVsKG1ldGFPYmplY3RBcmcpOwogICAgICAgIHJldHVybiBzdWJMZXZlbDsKICAgICAgfQogICAgICAvKioKICAgICAgICogZmxhc2hlcyB0aGUgdGl0bGUgd2l0aCB0aGUgZ2l2ZW4gdGV4dAogICAgICAgKiBAcGFyYW0gZmxhc2hUZXh0QXJnCiAgICAgICAqLwogICAgICBmbGFzaFRpdGxlKGZsYXNoVGV4dEFyZykgewogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBpbmZvcm1zIHNtYXJ0c3NyIHRoYXQgdGhlIHBhZ2UgaXMgcmVhZHkgdG8gYmUgcmVuZGVyZWQKICAgICAgICovCiAgICAgIGluZm9ybVJlYWR5Rm9yU21hcnRzc3IoKSB7CiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc21hcnRzc3JXYWl0Rm9yUmVhZHlTaWduYWwpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFlvdSBoYXZlIG5vdCBpbmRpY2F0ZWQgdGhhdCB5b3UgaW5mb3JtIHNtYXJ0c3NyIGJ5IGEgZGVkaWNhdGVkIHNpZ25hbCEgUGxlYXNlIGNvbnNpZGVyIGRvaW5nIHNvIWApOwogICAgICAgIH0KICAgICAgICB0aGlzLnJlYWR5Rm9yU21hcnRzc3JEZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50aXRsZS5qcwp2YXIgVGl0bGU7CnZhciBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGl0bGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50aXRsZS5qcyIoKSB7CiAgICBpbml0X3dlYnNldHVwX3BsdWdpbnMoKTsKICAgIFRpdGxlID0gY2xhc3MgewogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMjQgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMjQsIHsKICBKc29uTGRUYWc6ICgpID0+IEpzb25MZFRhZywKICBNZXRhVGFnOiAoKSA9PiBNZXRhVGFnLAogIE9wZW5ncmFwaFRhZzogKCkgPT4gT3BlbmdyYXBoVGFnLAogIFRpdGxlOiAoKSA9PiBUaXRsZSwKICBXZWJTZXR1cDogKCkgPT4gV2ViU2V0dXAKfSk7CnZhciBpbml0X2Rpc3RfdHMyNCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy9pbmRleC5qcyIoKSB7CiAgICBpbml0X3dlYnNldHVwX2NsYXNzZXNfd2Vic2V0dXAoKTsKICAgIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWdfbWV0YXRhZygpOwogICAgaW5pdF93ZWJzZXR1cF9jbGFzc2VzX3RhZ19vcGVuZ3JhcGh0YWcoKTsKICAgIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWdfanNvbmxkdGFnKCk7CiAgICBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGl0bGUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvbGlrLnBsdWdpbnMuanMKdmFyIGltcG9ydF9zeW1ib2xfdHJlZTI7CnZhciBpbml0X2xpa19wbHVnaW5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMi4yL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9saWsucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMzKCk7CiAgICBpbml0X2Rpc3RfdHM1KCk7CiAgICBpbml0X2Rpc3RfdHMoKTsKICAgIGluaXRfZGlzdF90czIoKTsKICAgIGluaXRfZGlzdF90czYoKTsKICAgIGltcG9ydF9zeW1ib2xfdHJlZTIgPSBfX3RvRVNNKHJlcXVpcmVfU3ltYm9sVHJlZSgpLCAxKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvbGlrLmZhc3RtYXAuanMKdmFyIEZhc3RNYXAyOwp2YXIgaW5pdF9saWtfZmFzdG1hcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvbGlrLmZhc3RtYXAuanMiKCkgewogICAgaW5pdF9saWtfcGx1Z2lucygpOwogICAgRmFzdE1hcDIgPSBjbGFzcyBfRmFzdE1hcCB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMubWFwT2JqZWN0ID0ge307CiAgICAgIH0KICAgICAgaXNVbmlxdWVLZXkoa2V5QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWFwT2JqZWN0W2tleUFyZ10gPyBmYWxzZSA6IHRydWU7CiAgICAgIH0KICAgICAgYWRkVG9NYXAoa2V5QXJnLCBvYmplY3RBcmcsIG9wdGlvbnNBcmcpIHsKICAgICAgICBpZiAodGhpcy5pc1VuaXF1ZUtleShrZXlBcmcpIHx8IG9wdGlvbnNBcmcgJiYgb3B0aW9uc0FyZy5mb3JjZSkgewogICAgICAgICAgdGhpcy5tYXBPYmplY3Rba2V5QXJnXSA9IG9iamVjdEFyZzsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIGdldEJ5S2V5KGtleUFyZykgewogICAgICAgIHJldHVybiB0aGlzLm1hcE9iamVjdFtrZXlBcmddOwogICAgICB9CiAgICAgIHJlbW92ZUZyb21NYXAoa2V5QXJnKSB7CiAgICAgICAgY29uc3QgcmVtb3ZlZEl0ZW0gPSB0aGlzLmdldEJ5S2V5KGtleUFyZyk7CiAgICAgICAgZGVsZXRlIHRoaXMubWFwT2JqZWN0W2tleUFyZ107CiAgICAgICAgcmV0dXJuIHJlbW92ZWRJdGVtOwogICAgICB9CiAgICAgIGdldEtleXMoKSB7CiAgICAgICAgY29uc3Qga2V5czIgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGtleUFyZyBpbiB0aGlzLm1hcE9iamVjdCkgewogICAgICAgICAgaWYgKHRoaXMubWFwT2JqZWN0W2tleUFyZ10pIHsKICAgICAgICAgICAga2V5czIucHVzaChrZXlBcmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4ga2V5czI7CiAgICAgIH0KICAgICAgY2xlYW4oKSB7CiAgICAgICAgdGhpcy5tYXBPYmplY3QgPSB7fTsKICAgICAgfQogICAgICAvKioKICAgICAgICogcmV0dXJucyBhIG5ldyBGYXN0bWFwIHRoYXQgaW5jbHVkZXMgYWxsIHZhbHVlcyBmcm9tIHRoaXMgYW5kIGFsbCBmcm9tIHRoZSBmYXN0bWFwIGluIHRoZSBhcmd1bWVudAogICAgICAgKi8KICAgICAgY29uY2F0KGZhc3RNYXBBcmcpIHsKICAgICAgICBjb25zdCBjb25jYXRlZEZhc3RtYXAgPSBuZXcgX0Zhc3RNYXAoKTsKICAgICAgICBmb3IgKGNvbnN0IGtleTIgb2YgdGhpcy5nZXRLZXlzKCkpIHsKICAgICAgICAgIGNvbmNhdGVkRmFzdG1hcC5hZGRUb01hcChrZXkyLCB0aGlzLmdldEJ5S2V5KGtleTIpKTsKICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCBrZXkyIG9mIGZhc3RNYXBBcmcuZ2V0S2V5cygpKSB7CiAgICAgICAgICBjb25jYXRlZEZhc3RtYXAuYWRkVG9NYXAoa2V5MiwgZmFzdE1hcEFyZy5nZXRCeUtleShrZXkyKSwgewogICAgICAgICAgICBmb3JjZTogdHJ1ZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb25jYXRlZEZhc3RtYXA7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHRyaWVzIHRvIG1lcmdlIGFub3RoZXIgRmFzdG1hcAogICAgICAgKiBOb3RlOiB1bmlxdWVLZXlDb2xsaXNpb25zIHdpbGwgY2F1c2Ugb3ZlcndyaXRlCiAgICAgICAqIEBwYXJhbSBmYXN0TWFwQXJnCiAgICAgICAqLwogICAgICBhZGRBbGxGcm9tT3RoZXIoZmFzdE1hcEFyZykgewogICAgICAgIGZvciAoY29uc3Qga2V5MiBvZiBmYXN0TWFwQXJnLmdldEtleXMoKSkgewogICAgICAgICAgdGhpcy5hZGRUb01hcChrZXkyLCBmYXN0TWFwQXJnLmdldEJ5S2V5KGtleTIpLCB7CiAgICAgICAgICAgIGZvcmNlOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYXN5bmMgZmluZChmaW5kRnVuY3Rpb25BcmcpIHsKICAgICAgICBmb3IgKGNvbnN0IGtleTIgb2YgdGhpcy5nZXRLZXlzKCkpIHsKICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEJ5S2V5KGtleTIpOwogICAgICAgICAgY29uc3QgZmluZEZ1bmN0aW9uUmVzdWx0ID0gYXdhaXQgZmluZEZ1bmN0aW9uQXJnKGl0ZW0pOwogICAgICAgICAgaWYgKGZpbmRGdW5jdGlvblJlc3VsdCkgewogICAgICAgICAgICByZXR1cm4gaXRlbTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2xpay5vYmplY3RtYXAuanMKdmFyIHVuaTIsIE9iamVjdE1hcDI7CnZhciBpbml0X2xpa19vYmplY3RtYXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2xpay5vYmplY3RtYXAuanMiKCkgewogICAgaW5pdF9saWtfcGx1Z2lucygpOwogICAgaW5pdF9saWtfZmFzdG1hcCgpOwogICAgdW5pMiA9IChwcmVmaXg0ID0gInVuaSIpID0+IHsKICAgICAgcmV0dXJuIGAke3ByZWZpeDR9eHh4eHh4eHh4eHhgLnJlcGxhY2UoL1t4eV0vZywgKGMxMSkgPT4gewogICAgICAgIGNvbnN0IHIxMSA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7CiAgICAgICAgY29uc3QgdjUgPSBjMTEgPT09ICJ4IiA/IHIxMSA6IHIxMSAmIDMgfCA4OwogICAgICAgIHJldHVybiB2NS50b1N0cmluZygxNik7CiAgICAgIH0pOwogICAgfTsKICAgIE9iamVjdE1hcDIgPSBjbGFzcyBfT2JqZWN0TWFwIHsKICAgICAgLyoqCiAgICAgICAqIHJldHVybnMgYSBuZXcgaW5zdGFuY2UKICAgICAgICovCiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuZmFzdE1hcCA9IG5ldyBGYXN0TWFwMigpOwogICAgICAgIHRoaXMuZXZlbnRTdWJqZWN0ID0gbmV3IGRpc3RfdHNfZXhwb3J0czIucnhqcy5TdWJqZWN0KCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGFkZHMgYW4gb2JqZWN0IG1hcHBlZCB0byBhIHN0cmluZwogICAgICAgKiB0aGUgc3RyaW5nIG11c3QgYmUgdW5pcXVlCiAgICAgICAqLwogICAgICBhZGRNYXBwZWRVbmlxdWUodW5pcXVlS2V5QXJnLCBvYmplY3RBcmcpIHsKICAgICAgICB0aGlzLmZhc3RNYXAuYWRkVG9NYXAodW5pcXVlS2V5QXJnLCBvYmplY3RBcmcpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBmYXN0ZXN0IHdheSB0byBnZXQgYW4gb2JqZWN0IGZyb20gdGhlIG1hcAogICAgICAgKiBAcGFyYW0gdW5pcXVlS2V5CiAgICAgICAqLwogICAgICBnZXRNYXBwZWRVbmlxdWUodW5pcXVlS2V5QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZmFzdE1hcC5nZXRCeUtleSh1bmlxdWVLZXlBcmcpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiByZW1vdmUga2V5CiAgICAgICAqIEBwYXJhbSBmdW5jdGlvbkFyZwogICAgICAgKi8KICAgICAgcmVtb3ZlTWFwcGVkVW5pcXVlKHVuaXF1ZUtleSkgewogICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMuZ2V0TWFwcGVkVW5pcXVlKHVuaXF1ZUtleSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGFkZCBvYmplY3QgdG8gT2JqZWN0bWFwCiAgICAgICAqIHJldHVybnMgZmFsc2UgaWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGluIHRoZSBtYXAKICAgICAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3Qgd2FzIGFkZGVkIHN1Y2Nlc3NmdWxseQogICAgICAgKi8KICAgICAgYWRkKG9iamVjdEFyZykgewogICAgICAgIGZvciAoY29uc3Qga2V5QXJnIG9mIHRoaXMuZmFzdE1hcC5nZXRLZXlzKCkpIHsKICAgICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMuZmFzdE1hcC5nZXRCeUtleShrZXlBcmcpOwogICAgICAgICAgaWYgKG9iamVjdCA9PT0gb2JqZWN0QXJnKSB7CiAgICAgICAgICAgIHJldHVybiBrZXlBcmc7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHVuaXF1ZUtleSA9IHVuaTIoImtleSIpOwogICAgICAgIHRoaXMuYWRkTWFwcGVkVW5pcXVlKHVuaXF1ZUtleSwgb2JqZWN0QXJnKTsKICAgICAgICB0aGlzLmV2ZW50U3ViamVjdC5uZXh0KHsKICAgICAgICAgIG9wZXJhdGlvbjogImFkZCIsCiAgICAgICAgICBwYXlsb2FkOiBvYmplY3RBcmcKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdW5pcXVlS2V5OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBsaWtlIC5hZGQgYnV0IGFkZHMgYW4gd2hvbGUgYXJyYXkgb2Ygb2JqZWN0cwogICAgICAgKi8KICAgICAgYWRkQXJyYXkob2JqZWN0QXJyYXlBcmcpIHsKICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygb2JqZWN0QXJyYXlBcmcpIHsKICAgICAgICAgIHRoaXMuYWRkKGl0ZW0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogY2hlY2sgaWYgb2JqZWN0IGlzIGluIE9iamVjdG1hcAogICAgICAgKi8KICAgICAgY2hlY2tGb3JPYmplY3Qob2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuICEhdGhpcy5nZXRLZXlGb3JPYmplY3Qob2JqZWN0QXJnKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogZ2V0IGtleSBmb3Igb2JqZWN0CiAgICAgICAqIEBwYXJhbSBmaW5kRnVuY3Rpb24KICAgICAgICovCiAgICAgIGdldEtleUZvck9iamVjdChvYmplY3RBcmcpIHsKICAgICAgICBsZXQgZm91bmRLZXkgPSBudWxsOwogICAgICAgIGZvciAoY29uc3Qga2V5QXJnIG9mIHRoaXMuZmFzdE1hcC5nZXRLZXlzKCkpIHsKICAgICAgICAgIGlmICghZm91bmRLZXkgJiYgdGhpcy5mYXN0TWFwLmdldEJ5S2V5KGtleUFyZykgPT09IG9iamVjdEFyZykgewogICAgICAgICAgICBmb3VuZEtleSA9IGtleUFyZzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZm91bmRLZXk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGZpbmQgb2JqZWN0CiAgICAgICAqLwogICAgICBhc3luYyBmaW5kKGZpbmRGdW5jdGlvbikgewogICAgICAgIHJldHVybiB0aGlzLmZhc3RNYXAuZmluZChmaW5kRnVuY3Rpb24pOwogICAgICB9CiAgICAgIGZpbmRTeW5jKGZpbmRGdW5jdGlvbikgewogICAgICAgIGZvciAoY29uc3Qga2V5QXJnIG9mIHRoaXMuZmFzdE1hcC5nZXRLZXlzKCkpIHsKICAgICAgICAgIGlmIChmaW5kRnVuY3Rpb24odGhpcy5mYXN0TWFwLmdldEJ5S2V5KGtleUFyZykpKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldE1hcHBlZFVuaXF1ZShrZXlBcmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogZmluZHMgYSBzcGVjaWZpYyBlbGVtZW50IGFuZCB0aGVuIHJlbW92ZXMgaXQKICAgICAgICovCiAgICAgIGFzeW5jIGZpbmRPbmVBbmRSZW1vdmUoZmluZEZ1bmN0aW9uKSB7CiAgICAgICAgY29uc3QgZm91bmRFbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kKGZpbmRGdW5jdGlvbik7CiAgICAgICAgaWYgKGZvdW5kRWxlbWVudCkgewogICAgICAgICAgdGhpcy5yZW1vdmUoZm91bmRFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZvdW5kRWxlbWVudDsKICAgICAgfQogICAgICBmaW5kT25lQW5kUmVtb3ZlU3luYyhmaW5kRnVuY3Rpb24pIHsKICAgICAgICBjb25zdCBmb3VuZEVsZW1lbnQgPSB0aGlzLmZpbmRTeW5jKGZpbmRGdW5jdGlvbik7CiAgICAgICAgaWYgKGZvdW5kRWxlbWVudCkgewogICAgICAgICAgdGhpcy5yZW1vdmUoZm91bmRFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZvdW5kRWxlbWVudDsKICAgICAgfQogICAgICAvKioKICAgICAgICogcnVuIGZ1bmN0aW9uIGZvciBlYWNoIGl0ZW0gaW4gT2JqZWN0bWFwCiAgICAgICAqLwogICAgICBhc3luYyBmb3JFYWNoKGZ1bmN0aW9uQXJnKSB7CiAgICAgICAgZm9yIChjb25zdCBrZXlBcmcgb2YgdGhpcy5mYXN0TWFwLmdldEtleXMoKSkgewogICAgICAgICAgYXdhaXQgZnVuY3Rpb25BcmcodGhpcy5mYXN0TWFwLmdldEJ5S2V5KGtleUFyZykpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogZ2V0cyBhbiBvYmplY3QgaW4gdGhlIE9ic2VydmFibGVtYXAgYW5kIHJlbW92ZXMgaXQsIHNvIGl0IGNhbid0IGJlIHJldHJpZXZlZCBhZ2FpbgogICAgICAgKi8KICAgICAgZ2V0T25lQW5kUmVtb3ZlKCkgewogICAgICAgIGNvbnN0IGtleXMyID0gdGhpcy5mYXN0TWFwLmdldEtleXMoKTsKICAgICAgICBpZiAoa2V5czIubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3Qga2V5VG9Vc2UgPSBrZXlzMlswXTsKICAgICAgICAgIGNvbnN0IHJlbW92ZWRJdGVtID0gdGhpcy5mYXN0TWFwLnJlbW92ZUZyb21NYXAoa2V5VG9Vc2UpOwogICAgICAgICAgdGhpcy5ldmVudFN1YmplY3QubmV4dCh7CiAgICAgICAgICAgIG9wZXJhdGlvbjogInJlbW92ZSIsCiAgICAgICAgICAgIHBheWxvYWQ6IHJlbW92ZWRJdGVtCiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybiByZW1vdmVkSXRlbTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHJldHVybnMgYSBjbG9uZWQgYXJyYXkgb2YgYWxsIHRoZSBvYmplY3RzIGN1cnJlbnRseSBpbiB0aGUgT2JqZWN0bWFwCiAgICAgICAqLwogICAgICBnZXRBcnJheSgpIHsKICAgICAgICBjb25zdCByZXR1cm5BcnJheSA9IFtdOwogICAgICAgIGZvciAoY29uc3Qga2V5QXJnIG9mIHRoaXMuZmFzdE1hcC5nZXRLZXlzKCkpIHsKICAgICAgICAgIHJldHVybkFycmF5LnB1c2godGhpcy5mYXN0TWFwLmdldEJ5S2V5KGtleUFyZykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0dXJuQXJyYXk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNoZWNrIGlmIE9iamVjdG1hcCBpc3QgZW1wdHkKICAgICAgICovCiAgICAgIGlzRW1wdHkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZmFzdE1hcC5nZXRLZXlzKCkubGVuZ3RoID09PSAwOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiByZW1vdmUgb2JqZWN0IGZyb20gT2JqZWN0bWFwCiAgICAgICAqLwogICAgICByZW1vdmUob2JqZWN0QXJnKSB7CiAgICAgICAgaWYgKHRoaXMuY2hlY2tGb3JPYmplY3Qob2JqZWN0QXJnKSkgewogICAgICAgICAgY29uc3Qga2V5QXJnID0gdGhpcy5nZXRLZXlGb3JPYmplY3Qob2JqZWN0QXJnKTsKICAgICAgICAgIGNvbnN0IHJlbW92ZWRPYmplY3QgPSB0aGlzLmZhc3RNYXAucmVtb3ZlRnJvbU1hcChrZXlBcmcpOwogICAgICAgICAgdGhpcy5ldmVudFN1YmplY3QubmV4dCh7CiAgICAgICAgICAgIG9wZXJhdGlvbjogInJlbW92ZSIsCiAgICAgICAgICAgIHBheWxvYWQ6IHJlbW92ZWRPYmplY3QKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIHJlbW92ZWRPYmplY3Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiB3aXBlIE9iamVjdG1hcAogICAgICAgKi8KICAgICAgd2lwZSgpIHsKICAgICAgICBmb3IgKGNvbnN0IGtleUFyZyBvZiB0aGlzLmZhc3RNYXAuZ2V0S2V5cygpKSB7CiAgICAgICAgICB0aGlzLmZhc3RNYXAucmVtb3ZlRnJvbU1hcChrZXlBcmcpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogcmV0dXJucyBhIG5ldyBPYmplY3RtYXAgdGhhdCBpbmNsdWRlcwogICAgICAgKi8KICAgICAgY29uY2F0KG9iamVjdE1hcEFyZykgewogICAgICAgIGNvbnN0IGNvbmNhdHRlZE9iamVjdE1hcCA9IG5ldyBfT2JqZWN0TWFwKCk7CiAgICAgICAgY29uY2F0dGVkT2JqZWN0TWFwLmZhc3RNYXAuYWRkQWxsRnJvbU90aGVyKHRoaXMuZmFzdE1hcCk7CiAgICAgICAgY29uY2F0dGVkT2JqZWN0TWFwLmZhc3RNYXAuYWRkQWxsRnJvbU90aGVyKG9iamVjdE1hcEFyZy5mYXN0TWFwKTsKICAgICAgICByZXR1cm4gY29uY2F0dGVkT2JqZWN0TWFwOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiB0cmllcyB0byBtZXJnZSBhbm90aGVyIE9iamVjdG1hcAogICAgICAgKiBOb3RlOiB1bmlxdWVLZXlDb2xsaXNpb25zIHdpbGwgY2F1c2Ugb3ZlcndyaXRlCiAgICAgICAqIEBwYXJhbSBvYmplY3RNYXBBcmcKICAgICAgICovCiAgICAgIGFkZEFsbEZyb21PdGhlcihvYmplY3RNYXBBcmcpIHsKICAgICAgICB0aGlzLmZhc3RNYXAuYWRkQWxsRnJvbU90aGVyKG9iamVjdE1hcEFyZy5mYXN0TWFwKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvbGlrLnN0cmluZ21hcC5qcwp2YXIgU3RyaW5nbWFwMjsKdmFyIGluaXRfbGlrX3N0cmluZ21hcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvbGlrLnN0cmluZ21hcC5qcyIoKSB7CiAgICBpbml0X2xpa19wbHVnaW5zKCk7CiAgICBTdHJpbmdtYXAyID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLl9zdHJpbmdBcnJheSA9IFtdOwogICAgICAgIHRoaXMuX3RyaWdnZXJVbnRpbFRydWVGdW5jdGlvbkFycmF5ID0gW107CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGFkZCBhIHN0cmluZyB0byB0aGUgU3RyaW5nbWFwCiAgICAgICAqLwogICAgICBhZGRTdHJpbmcoc3RyaW5nQXJnKSB7CiAgICAgICAgdGhpcy5fc3RyaW5nQXJyYXkucHVzaChzdHJpbmdBcmcpOwogICAgICAgIHRoaXMubm90aWZ5VHJpZ2dlcigpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBsaWtlIGFkZFN0cmluZywgYnV0IGFjY2VwdHMgYW4gYXJyYXkgb2Ygc3RyaW5ncwogICAgICAgKi8KICAgICAgYWRkU3RyaW5nQXJyYXkoc3RyaW5nQXJyYXlBcmcpIHsKICAgICAgICBmb3IgKGNvbnN0IHN0cmluZ0l0ZW0gb2Ygc3RyaW5nQXJyYXlBcmcpIHsKICAgICAgICAgIHRoaXMuYWRkU3RyaW5nKHN0cmluZ0l0ZW0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogcmVtb3ZlcyBhIHN0cmluZyBmcm9tIFN0cmluZ21hcAogICAgICAgKi8KICAgICAgcmVtb3ZlU3RyaW5nKHN0cmluZ0FyZykgewogICAgICAgIGZvciAoY29uc3Qga2V5QXJnIGluIHRoaXMuX3N0cmluZ0FycmF5KSB7CiAgICAgICAgICBpZiAodGhpcy5fc3RyaW5nQXJyYXlba2V5QXJnXSA9PT0gc3RyaW5nQXJnKSB7CiAgICAgICAgICAgIHRoaXMuX3N0cmluZ0FycmF5LnNwbGljZShwYXJzZUludChrZXlBcmcpLCAxKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5ub3RpZnlUcmlnZ2VyKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHdpcGVzIHRoZSBTdHJpbmdtYXAKICAgICAgICovCiAgICAgIHdpcGUoKSB7CiAgICAgICAgdGhpcy5fc3RyaW5nQXJyYXkgPSBbXTsKICAgICAgICB0aGlzLm5vdGlmeVRyaWdnZXIoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogY2hlY2sgaWYgc3RyaW5nIGlzIGluIFN0cmluZ21hcAogICAgICAgKi8KICAgICAgY2hlY2tTdHJpbmcoc3RyaW5nQXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmluZ0FycmF5LmluZGV4T2Yoc3RyaW5nQXJnKSAhPT0gLTE7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNoZWNrcyBzdHJpbmdQcmVzZW5jZSB3aXRoIG1pbmltYXRjaAogICAgICAgKi8KICAgICAgY2hlY2tNaW5pbWF0Y2gobWluaU1hdGNoU3RyaW5nQXJnKSB7CiAgICAgICAgY29uc3Qgc21hcnRNYXRjaEluc3RhbmNlID0gbmV3IGRpc3RfdHNfZXhwb3J0czUuU21hcnRNYXRjaChtaW5pTWF0Y2hTdHJpbmdBcmcpOwogICAgICAgIGxldCBmb3VuZE1hdGNoID0gZmFsc2U7CiAgICAgICAgZm9yIChjb25zdCBzdHJpbmdJdGVtIG9mIHRoaXMuX3N0cmluZ0FycmF5KSB7CiAgICAgICAgICBpZiAoc21hcnRNYXRjaEluc3RhbmNlLm1hdGNoKHN0cmluZ0l0ZW0pKSB7CiAgICAgICAgICAgIGZvdW5kTWF0Y2ggPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZm91bmRNYXRjaDsKICAgICAgfQogICAgICAvKioKICAgICAgICogY2hlY2tzIGlmIHRoZSBTdHJpbmdtYXAgaXMgZW1wdHkKICAgICAgICovCiAgICAgIGNoZWNrSXNFbXB0eSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc3RyaW5nQXJyYXkubGVuZ3RoID09PSAwOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBnZXRzIGEgY2xvbmVkIGNvcHkgb2YgdGhlIGN1cnJlbnQgc3RyaW5nIEFycmF5CiAgICAgICAqLwogICAgICBnZXRTdHJpbmdBcnJheSgpIHsKICAgICAgICBjb25zdCByZXR1cm5BcnJheSA9IFtdOwogICAgICAgIGZvciAoY29uc3Qgc3RyaW5nSXRlbSBvZiB0aGlzLl9zdHJpbmdBcnJheSkgewogICAgICAgICAgcmV0dXJuQXJyYXkucHVzaChzdHJpbmdJdGVtKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldHVybkFycmF5OwogICAgICB9CiAgICAgIC8vIHRyaWdnZXIgcmVnaXN0ZXJpbmcKICAgICAgLyoqCiAgICAgICAqIHJlZ2lzdGVyIGEgbmV3IHRyaWdnZXIKICAgICAgICovCiAgICAgIHJlZ2lzdGVyVW50aWxUcnVlKGZ1bmN0aW9uQXJnLCBjYWxsYmFja0FyZykgewogICAgICAgIGNvbnN0IHRydWVEZWZlcnJlZCA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgICAgIHRoaXMuX3RyaWdnZXJVbnRpbFRydWVGdW5jdGlvbkFycmF5LnB1c2goKCkgPT4gewogICAgICAgICAgY29uc3QgcmVzdWx0ID0gZnVuY3Rpb25BcmcodGhpcy5nZXRTdHJpbmdBcnJheSgpKTsKICAgICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHsKICAgICAgICAgICAgaWYgKGNhbGxiYWNrQXJnKSB7CiAgICAgICAgICAgICAgY2FsbGJhY2tBcmcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnVlRGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9KTsKICAgICAgICB0aGlzLm5vdGlmeVRyaWdnZXIoKTsKICAgICAgICByZXR1cm4gdHJ1ZURlZmVycmVkLnByb21pc2U7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIG5vdGlmaWVzIHRyaWdnZXJzCiAgICAgICAqLwogICAgICBub3RpZnlUcmlnZ2VyKCkgewogICAgICAgIGNvbnN0IGZpbHRlcmVkQXJyYXkgPSB0aGlzLl90cmlnZ2VyVW50aWxUcnVlRnVuY3Rpb25BcnJheS5maWx0ZXIoKGZ1bmN0aW9uQXJnKSA9PiB7CiAgICAgICAgICByZXR1cm4gIWZ1bmN0aW9uQXJnKCk7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5fdHJpZ2dlclVudGlsVHJ1ZUZ1bmN0aW9uQXJyYXkgPSBmaWx0ZXJlZEFycmF5OwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrbGVuaXNAMS4zLjIwL25vZGVfbW9kdWxlcy9AdGVtcGZpeC9sZW5pcy9kaXN0L2xlbmlzLm1qcwpmdW5jdGlvbiBjbGFtcDIobWluMywgaW5wdXQsIG1heDMpIHsKICByZXR1cm4gTWF0aC5tYXgobWluMywgTWF0aC5taW4oaW5wdXQsIG1heDMpKTsKfQpmdW5jdGlvbiBsZXJwKHgzLCB5NSwgdDkpIHsKICByZXR1cm4gKDEgLSB0OSkgKiB4MyArIHQ5ICogeTU7Cn0KZnVuY3Rpb24gZGFtcCh4MywgeTUsIGxhbWJkYSwgZGVsdGFUaW1lKSB7CiAgcmV0dXJuIGxlcnAoeDMsIHk1LCAxIC0gTWF0aC5leHAoLWxhbWJkYSAqIGRlbHRhVGltZSkpOwp9CmZ1bmN0aW9uIG1vZHVsbyhuMTMsIGQ2KSB7CiAgcmV0dXJuIChuMTMgJSBkNiArIGQ2KSAlIGQ2Owp9CmZ1bmN0aW9uIGRlYm91bmNlMihjYWxsYmFjaywgZGVsYXkyKSB7CiAgbGV0IHRpbWVyMjsKICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykgewogICAgbGV0IGNvbnRleHQyID0gdGhpczsKICAgIGNsZWFyVGltZW91dCh0aW1lcjIpOwogICAgdGltZXIyID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIHRpbWVyMiA9IHZvaWQgMDsKICAgICAgY2FsbGJhY2suYXBwbHkoY29udGV4dDIsIGFyZ3MpOwogICAgfSwgZGVsYXkyKTsKICB9Owp9CnZhciB2ZXJzaW9uLCBBbmltYXRlLCBEaW1lbnNpb25zLCBFbWl0dGVyLCBMSU5FX0hFSUdIVCwgbGlzdGVuZXJPcHRpb25zLCBWaXJ0dWFsU2Nyb2xsLCBkZWZhdWx0RWFzaW5nLCBMZW5pczsKdmFyIGluaXRfbGVuaXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCtsZW5pc0AxLjMuMjAvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L2xlbmlzL2Rpc3QvbGVuaXMubWpzIigpIHsKICAgIHZlcnNpb24gPSAiMS4zLjE3IjsKICAgIEFuaW1hdGUgPSBjbGFzcyB7CiAgICAgIGlzUnVubmluZyA9IGZhbHNlOwogICAgICB2YWx1ZSA9IDA7CiAgICAgIGZyb20gPSAwOwogICAgICB0byA9IDA7CiAgICAgIGN1cnJlbnRUaW1lID0gMDsKICAgICAgLy8gVGhlc2UgYXJlIGluc3RhbmNpYXRlZCBpbiB0aGUgZnJvbVRvIG1ldGhvZAogICAgICBsZXJwOwogICAgICBkdXJhdGlvbjsKICAgICAgZWFzaW5nOwogICAgICBvblVwZGF0ZTsKICAgICAgLyoqCiAgICAgICAqIEFkdmFuY2UgdGhlIGFuaW1hdGlvbiBieSB0aGUgZ2l2ZW4gZGVsdGEgdGltZQogICAgICAgKgogICAgICAgKiBAcGFyYW0gZGVsdGFUaW1lIC0gVGhlIHRpbWUgaW4gc2Vjb25kcyB0byBhZHZhbmNlIHRoZSBhbmltYXRpb24KICAgICAgICovCiAgICAgIGFkdmFuY2UoZGVsdGFUaW1lKSB7CiAgICAgICAgaWYgKCF0aGlzLmlzUnVubmluZykgcmV0dXJuOwogICAgICAgIGxldCBjb21wbGV0ZWQgPSBmYWxzZTsKICAgICAgICBpZiAodGhpcy5kdXJhdGlvbiAmJiB0aGlzLmVhc2luZykgewogICAgICAgICAgdGhpcy5jdXJyZW50VGltZSArPSBkZWx0YVRpbWU7CiAgICAgICAgICBjb25zdCBsaW5lYXJQcm9ncmVzcyA9IGNsYW1wMigwLCB0aGlzLmN1cnJlbnRUaW1lIC8gdGhpcy5kdXJhdGlvbiwgMSk7CiAgICAgICAgICBjb21wbGV0ZWQgPSBsaW5lYXJQcm9ncmVzcyA+PSAxOwogICAgICAgICAgY29uc3QgZWFzZWRQcm9ncmVzcyA9IGNvbXBsZXRlZCA/IDEgOiB0aGlzLmVhc2luZyhsaW5lYXJQcm9ncmVzcyk7CiAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5mcm9tICsgKHRoaXMudG8gLSB0aGlzLmZyb20pICogZWFzZWRQcm9ncmVzczsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGVycCkgewogICAgICAgICAgdGhpcy52YWx1ZSA9IGRhbXAodGhpcy52YWx1ZSwgdGhpcy50bywgdGhpcy5sZXJwICogNjAsIGRlbHRhVGltZSk7CiAgICAgICAgICBpZiAoTWF0aC5yb3VuZCh0aGlzLnZhbHVlKSA9PT0gdGhpcy50bykgewogICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy50bzsKICAgICAgICAgICAgY29tcGxldGVkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudG87CiAgICAgICAgICBjb21wbGV0ZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoY29tcGxldGVkKSB7CiAgICAgICAgICB0aGlzLnN0b3AoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5vblVwZGF0ZT8uKHRoaXMudmFsdWUsIGNvbXBsZXRlZCk7CiAgICAgIH0KICAgICAgLyoqIFN0b3AgdGhlIGFuaW1hdGlvbiAqLwogICAgICBzdG9wKCkgewogICAgICAgIHRoaXMuaXNSdW5uaW5nID0gZmFsc2U7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNldCB1cCB0aGUgYW5pbWF0aW9uIGZyb20gYSBzdGFydGluZyB2YWx1ZSB0byBhbiBlbmRpbmcgdmFsdWUKICAgICAgICogd2l0aCBvcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBsZXJwaW5nLCBkdXJhdGlvbiwgZWFzaW5nLCBhbmQgb25VcGRhdGUgY2FsbGJhY2sKICAgICAgICoKICAgICAgICogQHBhcmFtIGZyb20gLSBUaGUgc3RhcnRpbmcgdmFsdWUKICAgICAgICogQHBhcmFtIHRvIC0gVGhlIGVuZGluZyB2YWx1ZQogICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBhbmltYXRpb24KICAgICAgICovCiAgICAgIGZyb21Ubyhmcm9tMiwgdG8yLCB7IGxlcnA6IGxlcnAyLCBkdXJhdGlvbiwgZWFzaW5nLCBvblN0YXJ0LCBvblVwZGF0ZSB9KSB7CiAgICAgICAgdGhpcy5mcm9tID0gdGhpcy52YWx1ZSA9IGZyb20yOwogICAgICAgIHRoaXMudG8gPSB0bzI7CiAgICAgICAgdGhpcy5sZXJwID0gbGVycDI7CiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uOwogICAgICAgIHRoaXMuZWFzaW5nID0gZWFzaW5nOwogICAgICAgIHRoaXMuY3VycmVudFRpbWUgPSAwOwogICAgICAgIHRoaXMuaXNSdW5uaW5nID0gdHJ1ZTsKICAgICAgICBvblN0YXJ0Py4oKTsKICAgICAgICB0aGlzLm9uVXBkYXRlID0gb25VcGRhdGU7CiAgICAgIH0KICAgIH07CiAgICBEaW1lbnNpb25zID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3Rvcih3cmFwcGVyLCBjb250ZW50MywgeyBhdXRvUmVzaXplID0gdHJ1ZSwgZGVib3VuY2U6IGRlYm91bmNlVmFsdWUgPSAyNTAgfSA9IHt9KSB7CiAgICAgICAgdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50MzsKICAgICAgICBpZiAoYXV0b1Jlc2l6ZSkgewogICAgICAgICAgdGhpcy5kZWJvdW5jZWRSZXNpemUgPSBkZWJvdW5jZTIodGhpcy5yZXNpemUsIGRlYm91bmNlVmFsdWUpOwogICAgICAgICAgaWYgKHRoaXMud3JhcHBlciBpbnN0YW5jZW9mIFdpbmRvdykgewogICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIiwgdGhpcy5kZWJvdW5jZWRSZXNpemUsIGZhbHNlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMud3JhcHBlclJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKHRoaXMuZGVib3VuY2VkUmVzaXplKTsKICAgICAgICAgICAgdGhpcy53cmFwcGVyUmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLndyYXBwZXIpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5jb250ZW50UmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIodGhpcy5kZWJvdW5jZWRSZXNpemUpOwogICAgICAgICAgdGhpcy5jb250ZW50UmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmNvbnRlbnQpOwogICAgICAgIH0KICAgICAgICB0aGlzLnJlc2l6ZSgpOwogICAgICB9CiAgICAgIHdpZHRoID0gMDsKICAgICAgaGVpZ2h0ID0gMDsKICAgICAgc2Nyb2xsSGVpZ2h0ID0gMDsKICAgICAgc2Nyb2xsV2lkdGggPSAwOwogICAgICAvLyBUaGVzZSBhcmUgaW5zdGFuY2lhdGVkIGluIHRoZSBjb25zdHJ1Y3RvciBhcyB0aGV5IG5lZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3B0aW9ucwogICAgICBkZWJvdW5jZWRSZXNpemU7CiAgICAgIHdyYXBwZXJSZXNpemVPYnNlcnZlcjsKICAgICAgY29udGVudFJlc2l6ZU9ic2VydmVyOwogICAgICBkZXN0cm95KCkgewogICAgICAgIHRoaXMud3JhcHBlclJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7CiAgICAgICAgdGhpcy5jb250ZW50UmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTsKICAgICAgICBpZiAodGhpcy53cmFwcGVyID09PSB3aW5kb3cgJiYgdGhpcy5kZWJvdW5jZWRSZXNpemUpIHsKICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLCB0aGlzLmRlYm91bmNlZFJlc2l6ZSwgZmFsc2UpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXNpemUgPSAoKSA9PiB7CiAgICAgICAgdGhpcy5vbldyYXBwZXJSZXNpemUoKTsKICAgICAgICB0aGlzLm9uQ29udGVudFJlc2l6ZSgpOwogICAgICB9OwogICAgICBvbldyYXBwZXJSZXNpemUgPSAoKSA9PiB7CiAgICAgICAgaWYgKHRoaXMud3JhcHBlciBpbnN0YW5jZW9mIFdpbmRvdykgewogICAgICAgICAgdGhpcy53aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoOwogICAgICAgICAgdGhpcy5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLndyYXBwZXIuY2xpZW50V2lkdGg7CiAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMud3JhcHBlci5jbGllbnRIZWlnaHQ7CiAgICAgICAgfQogICAgICB9OwogICAgICBvbkNvbnRlbnRSZXNpemUgPSAoKSA9PiB7CiAgICAgICAgaWYgKHRoaXMud3JhcHBlciBpbnN0YW5jZW9mIFdpbmRvdykgewogICAgICAgICAgdGhpcy5zY3JvbGxIZWlnaHQgPSB0aGlzLmNvbnRlbnQuc2Nyb2xsSGVpZ2h0OwogICAgICAgICAgdGhpcy5zY3JvbGxXaWR0aCA9IHRoaXMuY29udGVudC5zY3JvbGxXaWR0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5zY3JvbGxIZWlnaHQgPSB0aGlzLndyYXBwZXIuc2Nyb2xsSGVpZ2h0OwogICAgICAgICAgdGhpcy5zY3JvbGxXaWR0aCA9IHRoaXMud3JhcHBlci5zY3JvbGxXaWR0aDsKICAgICAgICB9CiAgICAgIH07CiAgICAgIGdldCBsaW1pdCgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgeDogdGhpcy5zY3JvbGxXaWR0aCAtIHRoaXMud2lkdGgsCiAgICAgICAgICB5OiB0aGlzLnNjcm9sbEhlaWdodCAtIHRoaXMuaGVpZ2h0CiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIEVtaXR0ZXIgPSBjbGFzcyB7CiAgICAgIGV2ZW50cyA9IHt9OwogICAgICAvKioKICAgICAgICogRW1pdCBhbiBldmVudCB3aXRoIHRoZSBnaXZlbiBkYXRhCiAgICAgICAqIEBwYXJhbSBldmVudCBFdmVudCBuYW1lCiAgICAgICAqIEBwYXJhbSBhcmdzIERhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgaGFuZGxlcnMKICAgICAgICovCiAgICAgIGVtaXQoZXZlbnQsIC4uLmFyZ3MpIHsKICAgICAgICBsZXQgY2FsbGJhY2tzID0gdGhpcy5ldmVudHNbZXZlbnRdIHx8IFtdOwogICAgICAgIGZvciAobGV0IGkxMSA9IDAsIGxlbmd0aCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkxMSA8IGxlbmd0aDsgaTExKyspIHsKICAgICAgICAgIGNhbGxiYWNrc1tpMTFdPy4oLi4uYXJncyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBBZGQgYSBjYWxsYmFjayB0byB0aGUgZXZlbnQKICAgICAgICogQHBhcmFtIGV2ZW50IEV2ZW50IG5hbWUKICAgICAgICogQHBhcmFtIGNiIENhbGxiYWNrIGZ1bmN0aW9uCiAgICAgICAqIEByZXR1cm5zIFVuc3Vic2NyaWJlIGZ1bmN0aW9uCiAgICAgICAqLwogICAgICBvbihldmVudCwgY2IpIHsKICAgICAgICB0aGlzLmV2ZW50c1tldmVudF0/LnB1c2goY2IpIHx8ICh0aGlzLmV2ZW50c1tldmVudF0gPSBbY2JdKTsKICAgICAgICByZXR1cm4gKCkgPT4gewogICAgICAgICAgdGhpcy5ldmVudHNbZXZlbnRdID0gdGhpcy5ldmVudHNbZXZlbnRdPy5maWx0ZXIoKGkxMSkgPT4gY2IgIT09IGkxMSk7CiAgICAgICAgfTsKICAgICAgfQogICAgICAvKioKICAgICAgICogUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgZXZlbnQKICAgICAgICogQHBhcmFtIGV2ZW50IEV2ZW50IG5hbWUKICAgICAgICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uCiAgICAgICAqLwogICAgICBvZmYoZXZlbnQsIGNhbGxiYWNrKSB7CiAgICAgICAgdGhpcy5ldmVudHNbZXZlbnRdID0gdGhpcy5ldmVudHNbZXZlbnRdPy5maWx0ZXIoKGkxMSkgPT4gY2FsbGJhY2sgIT09IGkxMSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJlbW92ZSBhbGwgZXZlbnQgbGlzdGVuZXJzIGFuZCBjbGVhbiB1cAogICAgICAgKi8KICAgICAgZGVzdHJveSgpIHsKICAgICAgICB0aGlzLmV2ZW50cyA9IHt9OwogICAgICB9CiAgICB9OwogICAgTElORV9IRUlHSFQgPSAxMDAgLyA2OwogICAgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiBmYWxzZSB9OwogICAgVmlydHVhbFNjcm9sbCA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoZWxlbWVudDQsIG9wdGlvbnMgPSB7IHdoZWVsTXVsdGlwbGllcjogMSwgdG91Y2hNdWx0aXBsaWVyOiAxIH0pIHsKICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50NDsKICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCB0aGlzLm9uV2luZG93UmVzaXplLCBmYWxzZSk7CiAgICAgICAgdGhpcy5vbldpbmRvd1Jlc2l6ZSgpOwogICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsIHRoaXMub25XaGVlbCwgbGlzdGVuZXJPcHRpb25zKTsKICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICAgICAgICJ0b3VjaHN0YXJ0IiwKICAgICAgICAgIHRoaXMub25Ub3VjaFN0YXJ0LAogICAgICAgICAgbGlzdGVuZXJPcHRpb25zCiAgICAgICAgKTsKICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICAgICAgICJ0b3VjaG1vdmUiLAogICAgICAgICAgdGhpcy5vblRvdWNoTW92ZSwKICAgICAgICAgIGxpc3RlbmVyT3B0aW9ucwogICAgICAgICk7CiAgICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgdGhpcy5vblRvdWNoRW5kLCBsaXN0ZW5lck9wdGlvbnMpOwogICAgICB9CiAgICAgIHRvdWNoU3RhcnQgPSB7CiAgICAgICAgeDogMCwKICAgICAgICB5OiAwCiAgICAgIH07CiAgICAgIGxhc3REZWx0YSA9IHsKICAgICAgICB4OiAwLAogICAgICAgIHk6IDAKICAgICAgfTsKICAgICAgd2luZG93ID0gewogICAgICAgIHdpZHRoOiAwLAogICAgICAgIGhlaWdodDogMAogICAgICB9OwogICAgICBlbWl0dGVyID0gbmV3IEVtaXR0ZXIoKTsKICAgICAgLyoqCiAgICAgICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIGdpdmVuIGV2ZW50IGFuZCBjYWxsYmFjawogICAgICAgKgogICAgICAgKiBAcGFyYW0gZXZlbnQgRXZlbnQgbmFtZQogICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24KICAgICAgICovCiAgICAgIG9uKGV2ZW50LCBjYWxsYmFjaykgewogICAgICAgIHJldHVybiB0aGlzLmVtaXR0ZXIub24oZXZlbnQsIGNhbGxiYWNrKTsKICAgICAgfQogICAgICAvKiogUmVtb3ZlIGFsbCBldmVudCBsaXN0ZW5lcnMgYW5kIGNsZWFuIHVwICovCiAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgdGhpcy5lbWl0dGVyLmRlc3Ryb3koKTsKICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIiwgdGhpcy5vbldpbmRvd1Jlc2l6ZSwgZmFsc2UpOwogICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3aGVlbCIsIHRoaXMub25XaGVlbCwgbGlzdGVuZXJPcHRpb25zKTsKICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgICAgICAgICJ0b3VjaHN0YXJ0IiwKICAgICAgICAgIHRoaXMub25Ub3VjaFN0YXJ0LAogICAgICAgICAgbGlzdGVuZXJPcHRpb25zCiAgICAgICAgKTsKICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgICAgICAgICJ0b3VjaG1vdmUiLAogICAgICAgICAgdGhpcy5vblRvdWNoTW92ZSwKICAgICAgICAgIGxpc3RlbmVyT3B0aW9ucwogICAgICAgICk7CiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoCiAgICAgICAgICAidG91Y2hlbmQiLAogICAgICAgICAgdGhpcy5vblRvdWNoRW5kLAogICAgICAgICAgbGlzdGVuZXJPcHRpb25zCiAgICAgICAgKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogRXZlbnQgaGFuZGxlciBmb3IgJ3RvdWNoc3RhcnQnIGV2ZW50CiAgICAgICAqCiAgICAgICAqIEBwYXJhbSBldmVudCBUb3VjaCBldmVudAogICAgICAgKi8KICAgICAgb25Ub3VjaFN0YXJ0ID0gKGV2ZW50KSA9PiB7CiAgICAgICAgY29uc3QgeyBjbGllbnRYLCBjbGllbnRZIH0gPSBldmVudC50YXJnZXRUb3VjaGVzID8gZXZlbnQudGFyZ2V0VG91Y2hlc1swXSA6IGV2ZW50OwogICAgICAgIHRoaXMudG91Y2hTdGFydC54ID0gY2xpZW50WDsKICAgICAgICB0aGlzLnRvdWNoU3RhcnQueSA9IGNsaWVudFk7CiAgICAgICAgdGhpcy5sYXN0RGVsdGEgPSB7CiAgICAgICAgICB4OiAwLAogICAgICAgICAgeTogMAogICAgICAgIH07CiAgICAgICAgdGhpcy5lbWl0dGVyLmVtaXQoInNjcm9sbCIsIHsKICAgICAgICAgIGRlbHRhWDogMCwKICAgICAgICAgIGRlbHRhWTogMCwKICAgICAgICAgIGV2ZW50CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIC8qKiBFdmVudCBoYW5kbGVyIGZvciAndG91Y2htb3ZlJyBldmVudCAqLwogICAgICBvblRvdWNoTW92ZSA9IChldmVudCkgPT4gewogICAgICAgIGNvbnN0IHsgY2xpZW50WCwgY2xpZW50WSB9ID0gZXZlbnQudGFyZ2V0VG91Y2hlcyA/IGV2ZW50LnRhcmdldFRvdWNoZXNbMF0gOiBldmVudDsKICAgICAgICBjb25zdCBkZWx0YVggPSAtKGNsaWVudFggLSB0aGlzLnRvdWNoU3RhcnQueCkgKiB0aGlzLm9wdGlvbnMudG91Y2hNdWx0aXBsaWVyOwogICAgICAgIGNvbnN0IGRlbHRhWSA9IC0oY2xpZW50WSAtIHRoaXMudG91Y2hTdGFydC55KSAqIHRoaXMub3B0aW9ucy50b3VjaE11bHRpcGxpZXI7CiAgICAgICAgdGhpcy50b3VjaFN0YXJ0LnggPSBjbGllbnRYOwogICAgICAgIHRoaXMudG91Y2hTdGFydC55ID0gY2xpZW50WTsKICAgICAgICB0aGlzLmxhc3REZWx0YSA9IHsKICAgICAgICAgIHg6IGRlbHRhWCwKICAgICAgICAgIHk6IGRlbHRhWQogICAgICAgIH07CiAgICAgICAgdGhpcy5lbWl0dGVyLmVtaXQoInNjcm9sbCIsIHsKICAgICAgICAgIGRlbHRhWCwKICAgICAgICAgIGRlbHRhWSwKICAgICAgICAgIGV2ZW50CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIG9uVG91Y2hFbmQgPSAoZXZlbnQpID0+IHsKICAgICAgICB0aGlzLmVtaXR0ZXIuZW1pdCgic2Nyb2xsIiwgewogICAgICAgICAgZGVsdGFYOiB0aGlzLmxhc3REZWx0YS54LAogICAgICAgICAgZGVsdGFZOiB0aGlzLmxhc3REZWx0YS55LAogICAgICAgICAgZXZlbnQKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgLyoqIEV2ZW50IGhhbmRsZXIgZm9yICd3aGVlbCcgZXZlbnQgKi8KICAgICAgb25XaGVlbCA9IChldmVudCkgPT4gewogICAgICAgIGxldCB7IGRlbHRhWCwgZGVsdGFZLCBkZWx0YU1vZGUgfSA9IGV2ZW50OwogICAgICAgIGNvbnN0IG11bHRpcGxpZXJYID0gZGVsdGFNb2RlID09PSAxID8gTElORV9IRUlHSFQgOiBkZWx0YU1vZGUgPT09IDIgPyB0aGlzLndpbmRvdy53aWR0aCA6IDE7CiAgICAgICAgY29uc3QgbXVsdGlwbGllclkgPSBkZWx0YU1vZGUgPT09IDEgPyBMSU5FX0hFSUdIVCA6IGRlbHRhTW9kZSA9PT0gMiA/IHRoaXMud2luZG93LmhlaWdodCA6IDE7CiAgICAgICAgZGVsdGFYICo9IG11bHRpcGxpZXJYOwogICAgICAgIGRlbHRhWSAqPSBtdWx0aXBsaWVyWTsKICAgICAgICBkZWx0YVggKj0gdGhpcy5vcHRpb25zLndoZWVsTXVsdGlwbGllcjsKICAgICAgICBkZWx0YVkgKj0gdGhpcy5vcHRpb25zLndoZWVsTXVsdGlwbGllcjsKICAgICAgICB0aGlzLmVtaXR0ZXIuZW1pdCgic2Nyb2xsIiwgeyBkZWx0YVgsIGRlbHRhWSwgZXZlbnQgfSk7CiAgICAgIH07CiAgICAgIG9uV2luZG93UmVzaXplID0gKCkgPT4gewogICAgICAgIHRoaXMud2luZG93ID0gewogICAgICAgICAgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLAogICAgICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQKICAgICAgICB9OwogICAgICB9OwogICAgfTsKICAgIGRlZmF1bHRFYXNpbmcgPSAodDkpID0+IE1hdGgubWluKDEsIDEuMDAxIC0gTWF0aC5wb3coMiwgLTEwICogdDkpKTsKICAgIExlbmlzID0gY2xhc3MgewogICAgICBfaXNTY3JvbGxpbmcgPSBmYWxzZTsKICAgICAgLy8gdHJ1ZSB3aGVuIHNjcm9sbCBpcyBhbmltYXRpbmcKICAgICAgX2lzU3RvcHBlZCA9IGZhbHNlOwogICAgICAvLyB0cnVlIGlmIHVzZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHNjcm9sbCAtIGVuYWJsZS9kaXNhYmxlIHByb2dyYW1tYXRpY2FsbHkKICAgICAgX2lzTG9ja2VkID0gZmFsc2U7CiAgICAgIC8vIHNhbWUgYXMgaXNTdG9wcGVkIGJ1dCBlbmFibGVkL2Rpc2FibGVkIHdoZW4gc2Nyb2xsIHJlYWNoZXMgdGFyZ2V0CiAgICAgIF9wcmV2ZW50TmV4dE5hdGl2ZVNjcm9sbEV2ZW50ID0gZmFsc2U7CiAgICAgIF9yZXNldFZlbG9jaXR5VGltZW91dCA9IG51bGw7CiAgICAgIF9yYWZJZCA9IG51bGw7CiAgICAgIC8qKgogICAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdXNlciBpcyB0b3VjaGluZyB0aGUgc2NyZWVuCiAgICAgICAqLwogICAgICBpc1RvdWNoaW5nOwogICAgICAvKioKICAgICAgICogVGhlIHRpbWUgaW4gbXMgc2luY2UgdGhlIGxlbmlzIGluc3RhbmNlIHdhcyBjcmVhdGVkCiAgICAgICAqLwogICAgICB0aW1lID0gMDsKICAgICAgLyoqCiAgICAgICAqIFVzZXIgZGF0YSB0aGF0IHdpbGwgYmUgZm9yd2FyZGVkIHRocm91Z2ggdGhlIHNjcm9sbCBldmVudAogICAgICAgKgogICAgICAgKiBAZXhhbXBsZQogICAgICAgKiBsZW5pcy5zY3JvbGxUbygxMDAsIHsKICAgICAgICogICB1c2VyRGF0YTogewogICAgICAgKiAgICAgZm9vOiAnYmFyJwogICAgICAgKiAgIH0KICAgICAgICogfSkKICAgICAgICovCiAgICAgIHVzZXJEYXRhID0ge307CiAgICAgIC8qKgogICAgICAgKiBUaGUgbGFzdCB2ZWxvY2l0eSBvZiB0aGUgc2Nyb2xsCiAgICAgICAqLwogICAgICBsYXN0VmVsb2NpdHkgPSAwOwogICAgICAvKioKICAgICAgICogVGhlIGN1cnJlbnQgdmVsb2NpdHkgb2YgdGhlIHNjcm9sbAogICAgICAgKi8KICAgICAgdmVsb2NpdHkgPSAwOwogICAgICAvKioKICAgICAgICogVGhlIGRpcmVjdGlvbiBvZiB0aGUgc2Nyb2xsCiAgICAgICAqLwogICAgICBkaXJlY3Rpb24gPSAwOwogICAgICAvKioKICAgICAgICogVGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBsZW5pcyBpbnN0YW5jZQogICAgICAgKi8KICAgICAgb3B0aW9uczsKICAgICAgLyoqCiAgICAgICAqIFRoZSB0YXJnZXQgc2Nyb2xsIHZhbHVlCiAgICAgICAqLwogICAgICB0YXJnZXRTY3JvbGw7CiAgICAgIC8qKgogICAgICAgKiBUaGUgYW5pbWF0ZWQgc2Nyb2xsIHZhbHVlCiAgICAgICAqLwogICAgICBhbmltYXRlZFNjcm9sbDsKICAgICAgLy8gVGhlc2UgYXJlIGluc3RhbmNpYXRlZCBoZXJlIGFzIHRoZXkgZG9uJ3QgbmVlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGFuaW1hdGUgPSBuZXcgQW5pbWF0ZSgpOwogICAgICBlbWl0dGVyID0gbmV3IEVtaXR0ZXIoKTsKICAgICAgLy8gVGhlc2UgYXJlIGluc3RhbmNpYXRlZCBpbiB0aGUgY29uc3RydWN0b3IgYXMgdGhleSBuZWVkIGluZm9ybWF0aW9uIGZyb20gdGhlIG9wdGlvbnMKICAgICAgZGltZW5zaW9uczsKICAgICAgLy8gVGhpcyBpcyBub3QgcHJpdmF0ZSBiZWNhdXNlIGl0J3MgdXNlZCBpbiB0aGUgU25hcCBjbGFzcwogICAgICB2aXJ0dWFsU2Nyb2xsOwogICAgICBjb25zdHJ1Y3Rvcih7CiAgICAgICAgd3JhcHBlciA9IHdpbmRvdywKICAgICAgICBjb250ZW50OiBjb250ZW50MyA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKICAgICAgICBldmVudHNUYXJnZXQgPSB3cmFwcGVyLAogICAgICAgIHNtb290aFdoZWVsID0gdHJ1ZSwKICAgICAgICBzeW5jVG91Y2ggPSBmYWxzZSwKICAgICAgICBzeW5jVG91Y2hMZXJwID0gMC4wNzUsCiAgICAgICAgdG91Y2hJbmVydGlhRXhwb25lbnQgPSAxLjcsCiAgICAgICAgZHVyYXRpb24sCiAgICAgICAgLy8gaW4gc2Vjb25kcwogICAgICAgIGVhc2luZywKICAgICAgICBsZXJwOiBsZXJwMiA9IDAuMSwKICAgICAgICBpbmZpbml0ZSA9IGZhbHNlLAogICAgICAgIG9yaWVudGF0aW9uID0gInZlcnRpY2FsIiwKICAgICAgICAvLyB2ZXJ0aWNhbCwgaG9yaXpvbnRhbAogICAgICAgIGdlc3R1cmVPcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgPyAiYm90aCIgOiAidmVydGljYWwiLAogICAgICAgIC8vIHZlcnRpY2FsLCBob3Jpem9udGFsLCBib3RoCiAgICAgICAgdG91Y2hNdWx0aXBsaWVyID0gMSwKICAgICAgICB3aGVlbE11bHRpcGxpZXIgPSAxLAogICAgICAgIGF1dG9SZXNpemUgPSB0cnVlLAogICAgICAgIHByZXZlbnQsCiAgICAgICAgdmlydHVhbFNjcm9sbCwKICAgICAgICBvdmVyc2Nyb2xsID0gdHJ1ZSwKICAgICAgICBhdXRvUmFmID0gZmFsc2UsCiAgICAgICAgYW5jaG9ycyA9IGZhbHNlLAogICAgICAgIGF1dG9Ub2dnbGUgPSBmYWxzZSwKICAgICAgICAvLyBodHRwczovL2Nhbml1c2UuY29tLz9zZWFyY2g9dHJhbnNpdGlvbi1iZWhhdmlvcgogICAgICAgIGFsbG93TmVzdGVkU2Nyb2xsID0gZmFsc2UsCiAgICAgICAgLy8gQHRzLWlnbm9yZTogdGhpcyB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZQogICAgICAgIF9fZXhwZXJpbWVudGFsX19uYWl2ZURpbWVuc2lvbnMgPSBmYWxzZSwKICAgICAgICBuYWl2ZURpbWVuc2lvbnMgPSBfX2V4cGVyaW1lbnRhbF9fbmFpdmVEaW1lbnNpb25zLAogICAgICAgIHN0b3BJbmVydGlhT25OYXZpZ2F0ZSA9IGZhbHNlCiAgICAgIH0gPSB7fSkgewogICAgICAgIHdpbmRvdy5sZW5pc1ZlcnNpb24gPSB2ZXJzaW9uOwogICAgICAgIGlmICghd3JhcHBlciB8fCB3cmFwcGVyID09PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHsKICAgICAgICAgIHdyYXBwZXIgPSB3aW5kb3c7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgZHVyYXRpb24gPT09ICJudW1iZXIiICYmIHR5cGVvZiBlYXNpbmcgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIGVhc2luZyA9IGRlZmF1bHRFYXNpbmc7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZWFzaW5nID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBkdXJhdGlvbiAhPT0gIm51bWJlciIpIHsKICAgICAgICAgIGR1cmF0aW9uID0gMTsKICAgICAgICB9CiAgICAgICAgdGhpcy5vcHRpb25zID0gewogICAgICAgICAgd3JhcHBlciwKICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQzLAogICAgICAgICAgZXZlbnRzVGFyZ2V0LAogICAgICAgICAgc21vb3RoV2hlZWwsCiAgICAgICAgICBzeW5jVG91Y2gsCiAgICAgICAgICBzeW5jVG91Y2hMZXJwLAogICAgICAgICAgdG91Y2hJbmVydGlhRXhwb25lbnQsCiAgICAgICAgICBkdXJhdGlvbiwKICAgICAgICAgIGVhc2luZywKICAgICAgICAgIGxlcnA6IGxlcnAyLAogICAgICAgICAgaW5maW5pdGUsCiAgICAgICAgICBnZXN0dXJlT3JpZW50YXRpb24sCiAgICAgICAgICBvcmllbnRhdGlvbiwKICAgICAgICAgIHRvdWNoTXVsdGlwbGllciwKICAgICAgICAgIHdoZWVsTXVsdGlwbGllciwKICAgICAgICAgIGF1dG9SZXNpemUsCiAgICAgICAgICBwcmV2ZW50LAogICAgICAgICAgdmlydHVhbFNjcm9sbCwKICAgICAgICAgIG92ZXJzY3JvbGwsCiAgICAgICAgICBhdXRvUmFmLAogICAgICAgICAgYW5jaG9ycywKICAgICAgICAgIGF1dG9Ub2dnbGUsCiAgICAgICAgICBhbGxvd05lc3RlZFNjcm9sbCwKICAgICAgICAgIG5haXZlRGltZW5zaW9ucywKICAgICAgICAgIHN0b3BJbmVydGlhT25OYXZpZ2F0ZQogICAgICAgIH07CiAgICAgICAgdGhpcy5kaW1lbnNpb25zID0gbmV3IERpbWVuc2lvbnMod3JhcHBlciwgY29udGVudDMsIHsgYXV0b1Jlc2l6ZSB9KTsKICAgICAgICB0aGlzLnVwZGF0ZUNsYXNzTmFtZSgpOwogICAgICAgIHRoaXMudGFyZ2V0U2Nyb2xsID0gdGhpcy5hbmltYXRlZFNjcm9sbCA9IHRoaXMuYWN0dWFsU2Nyb2xsOwogICAgICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIHRoaXMub25OYXRpdmVTY3JvbGwsIGZhbHNlKTsKICAgICAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGxlbmQiLCB0aGlzLm9uU2Nyb2xsRW5kLCB7CiAgICAgICAgICBjYXB0dXJlOiB0cnVlCiAgICAgICAgfSk7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hbmNob3JzIHx8IHRoaXMub3B0aW9ucy5zdG9wSW5lcnRpYU9uTmF2aWdhdGUpIHsKICAgICAgICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoCiAgICAgICAgICAgICJjbGljayIsCiAgICAgICAgICAgIHRoaXMub25DbGljaywKICAgICAgICAgICAgZmFsc2UKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoCiAgICAgICAgICAicG9pbnRlcmRvd24iLAogICAgICAgICAgdGhpcy5vblBvaW50ZXJEb3duLAogICAgICAgICAgZmFsc2UKICAgICAgICApOwogICAgICAgIHRoaXMudmlydHVhbFNjcm9sbCA9IG5ldyBWaXJ0dWFsU2Nyb2xsKGV2ZW50c1RhcmdldCwgewogICAgICAgICAgdG91Y2hNdWx0aXBsaWVyLAogICAgICAgICAgd2hlZWxNdWx0aXBsaWVyCiAgICAgICAgfSk7CiAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsLm9uKCJzY3JvbGwiLCB0aGlzLm9uVmlydHVhbFNjcm9sbCk7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvVG9nZ2xlKSB7CiAgICAgICAgICB0aGlzLmNoZWNrT3ZlcmZsb3coKTsKICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsIHRoaXMub25UcmFuc2l0aW9uRW5kLCB7CiAgICAgICAgICAgIHBhc3NpdmU6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9SYWYpIHsKICAgICAgICAgIHRoaXMuX3JhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMucmFmKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIERlc3Ryb3kgdGhlIGxlbmlzIGluc3RhbmNlLCByZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVycyBhbmQgY2xlYW4gdXAgdGhlIGNsYXNzIG5hbWUKICAgICAgICovCiAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgdGhpcy5lbWl0dGVyLmRlc3Ryb3koKTsKICAgICAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5yZW1vdmVFdmVudExpc3RlbmVyKAogICAgICAgICAgInNjcm9sbCIsCiAgICAgICAgICB0aGlzLm9uTmF0aXZlU2Nyb2xsLAogICAgICAgICAgZmFsc2UKICAgICAgICApOwogICAgICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbGVuZCIsIHRoaXMub25TY3JvbGxFbmQsIHsKICAgICAgICAgIGNhcHR1cmU6IHRydWUKICAgICAgICB9KTsKICAgICAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5yZW1vdmVFdmVudExpc3RlbmVyKAogICAgICAgICAgInBvaW50ZXJkb3duIiwKICAgICAgICAgIHRoaXMub25Qb2ludGVyRG93biwKICAgICAgICAgIGZhbHNlCiAgICAgICAgKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFuY2hvcnMgfHwgdGhpcy5vcHRpb25zLnN0b3BJbmVydGlhT25OYXZpZ2F0ZSkgewogICAgICAgICAgdGhpcy5vcHRpb25zLndyYXBwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgICAgICAgICAgImNsaWNrIiwKICAgICAgICAgICAgdGhpcy5vbkNsaWNrLAogICAgICAgICAgICBmYWxzZQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsLmRlc3Ryb3koKTsKICAgICAgICB0aGlzLmRpbWVuc2lvbnMuZGVzdHJveSgpOwogICAgICAgIHRoaXMuY2xlYW5VcENsYXNzTmFtZSgpOwogICAgICAgIGlmICh0aGlzLl9yYWZJZCkgewogICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmFmSWQpOwogICAgICAgIH0KICAgICAgfQogICAgICBvbihldmVudCwgY2FsbGJhY2spIHsKICAgICAgICByZXR1cm4gdGhpcy5lbWl0dGVyLm9uKGV2ZW50LCBjYWxsYmFjayk7CiAgICAgIH0KICAgICAgb2ZmKGV2ZW50LCBjYWxsYmFjaykgewogICAgICAgIHJldHVybiB0aGlzLmVtaXR0ZXIub2ZmKGV2ZW50LCBjYWxsYmFjayk7CiAgICAgIH0KICAgICAgb25TY3JvbGxFbmQgPSAoZTExKSA9PiB7CiAgICAgICAgaWYgKCEoZTExIGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7CiAgICAgICAgICBpZiAodGhpcy5pc1Njcm9sbGluZyA9PT0gInNtb290aCIgfHwgdGhpcy5pc1Njcm9sbGluZyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgZGlzcGF0Y2hTY3JvbGxlbmRFdmVudCA9ICgpID0+IHsKICAgICAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5kaXNwYXRjaEV2ZW50KAogICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCJzY3JvbGxlbmQiLCB7CiAgICAgICAgICAgIGJ1YmJsZXM6IHRoaXMub3B0aW9ucy53cmFwcGVyID09PSB3aW5kb3csCiAgICAgICAgICAgIC8vIGNhbmNlbGFibGU6IGZhbHNlLAogICAgICAgICAgICBkZXRhaWw6IHsKICAgICAgICAgICAgICBsZW5pc1Njcm9sbEVuZDogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICB9KQogICAgICAgICk7CiAgICAgIH07CiAgICAgIGdldCBvdmVyZmxvdygpIHsKICAgICAgICBjb25zdCBwcm9wZXJ0eTkgPSB0aGlzLmlzSG9yaXpvbnRhbCA/ICJvdmVyZmxvdy14IiA6ICJvdmVyZmxvdy15IjsKICAgICAgICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnJvb3RFbGVtZW50KVtwcm9wZXJ0eTldOwogICAgICB9CiAgICAgIGNoZWNrT3ZlcmZsb3coKSB7CiAgICAgICAgaWYgKFsiaGlkZGVuIiwgImNsaXAiXS5pbmNsdWRlcyh0aGlzLm92ZXJmbG93KSkgewogICAgICAgICAgdGhpcy5pbnRlcm5hbFN0b3AoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5pbnRlcm5hbFN0YXJ0KCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIG9uVHJhbnNpdGlvbkVuZCA9IChldmVudCkgPT4gewogICAgICAgIGlmIChldmVudC5wcm9wZXJ0eU5hbWUuaW5jbHVkZXMoIm92ZXJmbG93IikpIHsKICAgICAgICAgIHRoaXMuY2hlY2tPdmVyZmxvdygpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgc2V0U2Nyb2xsKHNjcm9sbCkgewogICAgICAgIGlmICh0aGlzLmlzSG9yaXpvbnRhbCkgewogICAgICAgICAgdGhpcy5vcHRpb25zLndyYXBwZXIuc2Nyb2xsVG8oeyBsZWZ0OiBzY3JvbGwsIGJlaGF2aW9yOiAiaW5zdGFudCIgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLnNjcm9sbFRvKHsgdG9wOiBzY3JvbGwsIGJlaGF2aW9yOiAiaW5zdGFudCIgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIG9uQ2xpY2sgPSAoZXZlbnQpID0+IHsKICAgICAgICBjb25zdCBwYXRoMiA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgICAgIGNvbnN0IGFuY2hvckVsZW1lbnRzID0gcGF0aDIuZmlsdGVyKAogICAgICAgICAgKG5vZGUyKSA9PiBub2RlMiBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIG5vZGUyLmdldEF0dHJpYnV0ZSgiaHJlZiIpCiAgICAgICAgKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFuY2hvcnMpIHsKICAgICAgICAgIGNvbnN0IGFuY2hvciA9IGFuY2hvckVsZW1lbnRzLmZpbmQoCiAgICAgICAgICAgIChub2RlMikgPT4gbm9kZTIuZ2V0QXR0cmlidXRlKCJocmVmIik/LmluY2x1ZGVzKCIjIikKICAgICAgICAgICk7CiAgICAgICAgICBpZiAoYW5jaG9yKSB7CiAgICAgICAgICAgIGNvbnN0IGhyZWYgPSBhbmNob3IuZ2V0QXR0cmlidXRlKCJocmVmIik7CiAgICAgICAgICAgIGlmIChocmVmKSB7CiAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHR5cGVvZiB0aGlzLm9wdGlvbnMuYW5jaG9ycyA9PT0gIm9iamVjdCIgJiYgdGhpcy5vcHRpb25zLmFuY2hvcnMgPyB0aGlzLm9wdGlvbnMuYW5jaG9ycyA6IHZvaWQgMDsKICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBgIyR7aHJlZi5zcGxpdCgiIyIpWzFdfWA7CiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUbyh0YXJnZXQsIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3RvcEluZXJ0aWFPbk5hdmlnYXRlKSB7CiAgICAgICAgICBjb25zdCBpbnRlcm5hbExpbmsgPSBhbmNob3JFbGVtZW50cy5maW5kKAogICAgICAgICAgICAobm9kZTIpID0+IG5vZGUyLmhvc3QgPT09IHdpbmRvdy5sb2NhdGlvbi5ob3N0CiAgICAgICAgICApOwogICAgICAgICAgaWYgKGludGVybmFsTGluaykgewogICAgICAgICAgICB0aGlzLnJlc2V0KCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICBvblBvaW50ZXJEb3duID0gKGV2ZW50KSA9PiB7CiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMSkgewogICAgICAgICAgdGhpcy5yZXNldCgpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgb25WaXJ0dWFsU2Nyb2xsID0gKGRhdGEpID0+IHsKICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy52aXJ0dWFsU2Nyb2xsID09PSAiZnVuY3Rpb24iICYmIHRoaXMub3B0aW9ucy52aXJ0dWFsU2Nyb2xsKGRhdGEpID09PSBmYWxzZSkKICAgICAgICAgIHJldHVybjsKICAgICAgICBjb25zdCB7IGRlbHRhWCwgZGVsdGFZLCBldmVudCB9ID0gZGF0YTsKICAgICAgICB0aGlzLmVtaXR0ZXIuZW1pdCgidmlydHVhbC1zY3JvbGwiLCB7IGRlbHRhWCwgZGVsdGFZLCBldmVudCB9KTsKICAgICAgICBpZiAoZXZlbnQuY3RybEtleSkgcmV0dXJuOwogICAgICAgIGlmIChldmVudC5sZW5pc1N0b3BQcm9wYWdhdGlvbikgcmV0dXJuOwogICAgICAgIGNvbnN0IGlzVG91Y2ggPSBldmVudC50eXBlLmluY2x1ZGVzKCJ0b3VjaCIpOwogICAgICAgIGNvbnN0IGlzV2hlZWwgPSBldmVudC50eXBlLmluY2x1ZGVzKCJ3aGVlbCIpOwogICAgICAgIHRoaXMuaXNUb3VjaGluZyA9IGV2ZW50LnR5cGUgPT09ICJ0b3VjaHN0YXJ0IiB8fCBldmVudC50eXBlID09PSAidG91Y2htb3ZlIjsKICAgICAgICBjb25zdCBpc0NsaWNrT3JUYXAgPSBkZWx0YVggPT09IDAgJiYgZGVsdGFZID09PSAwOwogICAgICAgIGNvbnN0IGlzVGFwVG9TdG9wID0gdGhpcy5vcHRpb25zLnN5bmNUb3VjaCAmJiBpc1RvdWNoICYmIGV2ZW50LnR5cGUgPT09ICJ0b3VjaHN0YXJ0IiAmJiBpc0NsaWNrT3JUYXAgJiYgIXRoaXMuaXNTdG9wcGVkICYmICF0aGlzLmlzTG9ja2VkOwogICAgICAgIGlmIChpc1RhcFRvU3RvcCkgewogICAgICAgICAgdGhpcy5yZXNldCgpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBpc1Vua25vd25HZXN0dXJlID0gdGhpcy5vcHRpb25zLmdlc3R1cmVPcmllbnRhdGlvbiA9PT0gInZlcnRpY2FsIiAmJiBkZWx0YVkgPT09IDAgfHwgdGhpcy5vcHRpb25zLmdlc3R1cmVPcmllbnRhdGlvbiA9PT0gImhvcml6b250YWwiICYmIGRlbHRhWCA9PT0gMDsKICAgICAgICBpZiAoaXNDbGlja09yVGFwIHx8IGlzVW5rbm93bkdlc3R1cmUpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbGV0IGNvbXBvc2VkUGF0aCA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgICAgIGNvbXBvc2VkUGF0aCA9IGNvbXBvc2VkUGF0aC5zbGljZSgwLCBjb21wb3NlZFBhdGguaW5kZXhPZih0aGlzLnJvb3RFbGVtZW50KSk7CiAgICAgICAgY29uc3QgcHJldmVudCA9IHRoaXMub3B0aW9ucy5wcmV2ZW50OwogICAgICAgIGlmICghIWNvbXBvc2VkUGF0aC5maW5kKAogICAgICAgICAgKG5vZGUyKSA9PiBub2RlMiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmICh0eXBlb2YgcHJldmVudCA9PT0gImZ1bmN0aW9uIiAmJiBwcmV2ZW50Py4obm9kZTIpIHx8IG5vZGUyLmhhc0F0dHJpYnV0ZT8uKCJkYXRhLWxlbmlzLXByZXZlbnQiKSB8fCBpc1RvdWNoICYmIG5vZGUyLmhhc0F0dHJpYnV0ZT8uKCJkYXRhLWxlbmlzLXByZXZlbnQtdG91Y2giKSB8fCBpc1doZWVsICYmIG5vZGUyLmhhc0F0dHJpYnV0ZT8uKCJkYXRhLWxlbmlzLXByZXZlbnQtd2hlZWwiKSB8fCB0aGlzLm9wdGlvbnMuYWxsb3dOZXN0ZWRTY3JvbGwgJiYgdGhpcy5jaGVja05lc3RlZFNjcm9sbChub2RlMiwgeyBkZWx0YVgsIGRlbHRhWSB9KSkKICAgICAgICApKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCB8fCB0aGlzLmlzTG9ja2VkKSB7CiAgICAgICAgICBpZiAoZXZlbnQuY2FuY2VsYWJsZSkgewogICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBpc1Ntb290aCA9IHRoaXMub3B0aW9ucy5zeW5jVG91Y2ggJiYgaXNUb3VjaCB8fCB0aGlzLm9wdGlvbnMuc21vb3RoV2hlZWwgJiYgaXNXaGVlbDsKICAgICAgICBpZiAoIWlzU21vb3RoKSB7CiAgICAgICAgICB0aGlzLmlzU2Nyb2xsaW5nID0gIm5hdGl2ZSI7CiAgICAgICAgICB0aGlzLmFuaW1hdGUuc3RvcCgpOwogICAgICAgICAgZXZlbnQubGVuaXNTdG9wUHJvcGFnYXRpb24gPSB0cnVlOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsZXQgZGVsdGEgPSBkZWx0YVk7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5nZXN0dXJlT3JpZW50YXRpb24gPT09ICJib3RoIikgewogICAgICAgICAgZGVsdGEgPSBNYXRoLmFicyhkZWx0YVkpID4gTWF0aC5hYnMoZGVsdGFYKSA/IGRlbHRhWSA6IGRlbHRhWDsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5nZXN0dXJlT3JpZW50YXRpb24gPT09ICJob3Jpem9udGFsIikgewogICAgICAgICAgZGVsdGEgPSBkZWx0YVg7CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5vcHRpb25zLm92ZXJzY3JvbGwgfHwgdGhpcy5vcHRpb25zLmluZmluaXRlIHx8IHRoaXMub3B0aW9ucy53cmFwcGVyICE9PSB3aW5kb3cgJiYgdGhpcy5saW1pdCA+IDAgJiYgKHRoaXMuYW5pbWF0ZWRTY3JvbGwgPiAwICYmIHRoaXMuYW5pbWF0ZWRTY3JvbGwgPCB0aGlzLmxpbWl0IHx8IHRoaXMuYW5pbWF0ZWRTY3JvbGwgPT09IDAgJiYgZGVsdGFZID4gMCB8fCB0aGlzLmFuaW1hdGVkU2Nyb2xsID09PSB0aGlzLmxpbWl0ICYmIGRlbHRhWSA8IDApKSB7CiAgICAgICAgICBldmVudC5sZW5pc1N0b3BQcm9wYWdhdGlvbiA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChldmVudC5jYW5jZWxhYmxlKSB7CiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgICBjb25zdCBpc1N5bmNUb3VjaCA9IGlzVG91Y2ggJiYgdGhpcy5vcHRpb25zLnN5bmNUb3VjaDsKICAgICAgICBjb25zdCBpc1RvdWNoRW5kID0gaXNUb3VjaCAmJiBldmVudC50eXBlID09PSAidG91Y2hlbmQiOwogICAgICAgIGNvbnN0IGhhc1RvdWNoSW5lcnRpYSA9IGlzVG91Y2hFbmQ7CiAgICAgICAgaWYgKGhhc1RvdWNoSW5lcnRpYSkgewogICAgICAgICAgZGVsdGEgPSBNYXRoLnNpZ24odGhpcy52ZWxvY2l0eSkgKiBNYXRoLnBvdyhNYXRoLmFicyh0aGlzLnZlbG9jaXR5KSwgdGhpcy5vcHRpb25zLnRvdWNoSW5lcnRpYUV4cG9uZW50KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zY3JvbGxUbyh0aGlzLnRhcmdldFNjcm9sbCArIGRlbHRhLCB7CiAgICAgICAgICBwcm9ncmFtbWF0aWM6IGZhbHNlLAogICAgICAgICAgLi4uaXNTeW5jVG91Y2ggPyB7CiAgICAgICAgICAgIGxlcnA6IGhhc1RvdWNoSW5lcnRpYSA/IHRoaXMub3B0aW9ucy5zeW5jVG91Y2hMZXJwIDogMQogICAgICAgICAgfSA6IHsKICAgICAgICAgICAgbGVycDogdGhpcy5vcHRpb25zLmxlcnAsCiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLm9wdGlvbnMuZHVyYXRpb24sCiAgICAgICAgICAgIGVhc2luZzogdGhpcy5vcHRpb25zLmVhc2luZwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9OwogICAgICAvKioKICAgICAgICogRm9yY2UgbGVuaXMgdG8gcmVjYWxjdWxhdGUgdGhlIGRpbWVuc2lvbnMKICAgICAgICovCiAgICAgIHJlc2l6ZSgpIHsKICAgICAgICB0aGlzLmRpbWVuc2lvbnMucmVzaXplKCk7CiAgICAgICAgdGhpcy5hbmltYXRlZFNjcm9sbCA9IHRoaXMudGFyZ2V0U2Nyb2xsID0gdGhpcy5hY3R1YWxTY3JvbGw7CiAgICAgICAgdGhpcy5lbWl0KCk7CiAgICAgIH0KICAgICAgZW1pdCgpIHsKICAgICAgICB0aGlzLmVtaXR0ZXIuZW1pdCgic2Nyb2xsIiwgdGhpcyk7CiAgICAgIH0KICAgICAgb25OYXRpdmVTY3JvbGwgPSAoKSA9PiB7CiAgICAgICAgaWYgKHRoaXMuX3Jlc2V0VmVsb2NpdHlUaW1lb3V0ICE9PSBudWxsKSB7CiAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmVzZXRWZWxvY2l0eVRpbWVvdXQpOwogICAgICAgICAgdGhpcy5fcmVzZXRWZWxvY2l0eVRpbWVvdXQgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fcHJldmVudE5leHROYXRpdmVTY3JvbGxFdmVudCkgewogICAgICAgICAgdGhpcy5fcHJldmVudE5leHROYXRpdmVTY3JvbGxFdmVudCA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5pc1Njcm9sbGluZyA9PT0gZmFsc2UgfHwgdGhpcy5pc1Njcm9sbGluZyA9PT0gIm5hdGl2ZSIpIHsKICAgICAgICAgIGNvbnN0IGxhc3RTY3JvbGwgPSB0aGlzLmFuaW1hdGVkU2Nyb2xsOwogICAgICAgICAgdGhpcy5hbmltYXRlZFNjcm9sbCA9IHRoaXMudGFyZ2V0U2Nyb2xsID0gdGhpcy5hY3R1YWxTY3JvbGw7CiAgICAgICAgICB0aGlzLmxhc3RWZWxvY2l0eSA9IHRoaXMudmVsb2NpdHk7CiAgICAgICAgICB0aGlzLnZlbG9jaXR5ID0gdGhpcy5hbmltYXRlZFNjcm9sbCAtIGxhc3RTY3JvbGw7CiAgICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IE1hdGguc2lnbigKICAgICAgICAgICAgdGhpcy5hbmltYXRlZFNjcm9sbCAtIGxhc3RTY3JvbGwKICAgICAgICAgICk7CiAgICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSAibmF0aXZlIjsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuZW1pdCgpOwogICAgICAgICAgaWYgKHRoaXMudmVsb2NpdHkgIT09IDApIHsKICAgICAgICAgICAgdGhpcy5fcmVzZXRWZWxvY2l0eVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICB0aGlzLmxhc3RWZWxvY2l0eSA9IHRoaXMudmVsb2NpdHk7CiAgICAgICAgICAgICAgdGhpcy52ZWxvY2l0eSA9IDA7CiAgICAgICAgICAgICAgdGhpcy5pc1Njcm9sbGluZyA9IGZhbHNlOwogICAgICAgICAgICAgIHRoaXMuZW1pdCgpOwogICAgICAgICAgICB9LCA0MDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgcmVzZXQoKSB7CiAgICAgICAgdGhpcy5pc0xvY2tlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSBmYWxzZTsKICAgICAgICB0aGlzLmFuaW1hdGVkU2Nyb2xsID0gdGhpcy50YXJnZXRTY3JvbGwgPSB0aGlzLmFjdHVhbFNjcm9sbDsKICAgICAgICB0aGlzLmxhc3RWZWxvY2l0eSA9IHRoaXMudmVsb2NpdHkgPSAwOwogICAgICAgIHRoaXMuYW5pbWF0ZS5zdG9wKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFN0YXJ0IGxlbmlzIHNjcm9sbCBhZnRlciBpdCBoYXMgYmVlbiBzdG9wcGVkCiAgICAgICAqLwogICAgICBzdGFydCgpIHsKICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSByZXR1cm47CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvVG9nZ2xlKSB7CiAgICAgICAgICB0aGlzLnJvb3RFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJvdmVyZmxvdyIpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLmludGVybmFsU3RhcnQoKTsKICAgICAgfQogICAgICBpbnRlcm5hbFN0YXJ0KCkgewogICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHJldHVybjsKICAgICAgICB0aGlzLnJlc2V0KCk7CiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLmVtaXQoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogU3RvcCBsZW5pcyBzY3JvbGwKICAgICAgICovCiAgICAgIHN0b3AoKSB7CiAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSByZXR1cm47CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvVG9nZ2xlKSB7CiAgICAgICAgICB0aGlzLnJvb3RFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCJvdmVyZmxvdyIsICJjbGlwIik7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuaW50ZXJuYWxTdG9wKCk7CiAgICAgIH0KICAgICAgaW50ZXJuYWxTdG9wKCkgewogICAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgcmV0dXJuOwogICAgICAgIHRoaXMucmVzZXQoKTsKICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICAgICAgdGhpcy5lbWl0KCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJlcXVlc3RBbmltYXRpb25GcmFtZSBmb3IgbGVuaXMKICAgICAgICoKICAgICAgICogQHBhcmFtIHRpbWUgVGhlIHRpbWUgaW4gbXMgZnJvbSBhbiBleHRlcm5hbCBjbG9jayBsaWtlIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIG9yIFRlbXB1cwogICAgICAgKi8KICAgICAgcmFmID0gKHRpbWUpID0+IHsKICAgICAgICBjb25zdCBkZWx0YVRpbWUgPSB0aW1lIC0gKHRoaXMudGltZSB8fCB0aW1lKTsKICAgICAgICB0aGlzLnRpbWUgPSB0aW1lOwogICAgICAgIHRoaXMuYW5pbWF0ZS5hZHZhbmNlKGRlbHRhVGltZSAqIDFlLTMpOwogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b1JhZikgewogICAgICAgICAgdGhpcy5fcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yYWYpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgLyoqCiAgICAgICAqIFNjcm9sbCB0byBhIHRhcmdldCB2YWx1ZQogICAgICAgKgogICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdmFsdWUgdG8gc2Nyb2xsIHRvCiAgICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIGZvciB0aGUgc2Nyb2xsCiAgICAgICAqCiAgICAgICAqIEBleGFtcGxlCiAgICAgICAqIGxlbmlzLnNjcm9sbFRvKDEwMCwgewogICAgICAgKiAgIG9mZnNldDogMTAwLAogICAgICAgKiAgIGR1cmF0aW9uOiAxLAogICAgICAgKiAgIGVhc2luZzogKHQpID0+IDEgLSBNYXRoLmNvcygodCAqIE1hdGguUEkpIC8gMiksCiAgICAgICAqICAgbGVycDogMC4xLAogICAgICAgKiAgIG9uU3RhcnQ6ICgpID0+IHsKICAgICAgICogICAgIGNvbnNvbGUubG9nKCdvblN0YXJ0JykKICAgICAgICogICB9LAogICAgICAgKiAgIG9uQ29tcGxldGU6ICgpID0+IHsKICAgICAgICogICAgIGNvbnNvbGUubG9nKCdvbkNvbXBsZXRlJykKICAgICAgICogICB9LAogICAgICAgKiB9KQogICAgICAgKi8KICAgICAgc2Nyb2xsVG8odGFyZ2V0LCB7CiAgICAgICAgb2Zmc2V0ID0gMCwKICAgICAgICBpbW1lZGlhdGUgPSBmYWxzZSwKICAgICAgICBsb2NrID0gZmFsc2UsCiAgICAgICAgcHJvZ3JhbW1hdGljID0gdHJ1ZSwKICAgICAgICAvLyBjYWxsZWQgZnJvbSBvdXRzaWRlIG9mIHRoZSBjbGFzcwogICAgICAgIGxlcnA6IGxlcnAyID0gcHJvZ3JhbW1hdGljID8gdGhpcy5vcHRpb25zLmxlcnAgOiB2b2lkIDAsCiAgICAgICAgZHVyYXRpb24gPSBwcm9ncmFtbWF0aWMgPyB0aGlzLm9wdGlvbnMuZHVyYXRpb24gOiB2b2lkIDAsCiAgICAgICAgZWFzaW5nID0gcHJvZ3JhbW1hdGljID8gdGhpcy5vcHRpb25zLmVhc2luZyA6IHZvaWQgMCwKICAgICAgICBvblN0YXJ0LAogICAgICAgIG9uQ29tcGxldGUsCiAgICAgICAgZm9yY2UgPSBmYWxzZSwKICAgICAgICAvLyBzY3JvbGwgZXZlbiBpZiBzdG9wcGVkCiAgICAgICAgdXNlckRhdGEKICAgICAgfSA9IHt9KSB7CiAgICAgICAgaWYgKCh0aGlzLmlzU3RvcHBlZCB8fCB0aGlzLmlzTG9ja2VkKSAmJiAhZm9yY2UpIHJldHVybjsKICAgICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gInN0cmluZyIgJiYgWyJ0b3AiLCAibGVmdCIsICJzdGFydCIsICIjIl0uaW5jbHVkZXModGFyZ2V0KSkgewogICAgICAgICAgdGFyZ2V0ID0gMDsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0YXJnZXQgPT09ICJzdHJpbmciICYmIFsiYm90dG9tIiwgInJpZ2h0IiwgImVuZCJdLmluY2x1ZGVzKHRhcmdldCkpIHsKICAgICAgICAgIHRhcmdldCA9IHRoaXMubGltaXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxldCBub2RlMjsKICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAic3RyaW5nIikgewogICAgICAgICAgICBub2RlMiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTsKICAgICAgICAgICAgaWYgKCFub2RlMikgewogICAgICAgICAgICAgIGlmICh0YXJnZXQgPT09ICIjdG9wIikgewogICAgICAgICAgICAgICAgdGFyZ2V0ID0gMDsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCJMZW5pczogVGFyZ2V0IG5vdCBmb3VuZCIsIHRhcmdldCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldD8ubm9kZVR5cGUpIHsKICAgICAgICAgICAgbm9kZTIgPSB0YXJnZXQ7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobm9kZTIpIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy53cmFwcGVyICE9PSB3aW5kb3cpIHsKICAgICAgICAgICAgICBjb25zdCB3cmFwcGVyUmVjdCA9IHRoaXMucm9vdEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgICAgb2Zmc2V0IC09IHRoaXMuaXNIb3Jpem9udGFsID8gd3JhcHBlclJlY3QubGVmdCA6IHdyYXBwZXJSZWN0LnRvcDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCByZWN0ID0gbm9kZTIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgIHRhcmdldCA9ICh0aGlzLmlzSG9yaXpvbnRhbCA/IHJlY3QubGVmdCA6IHJlY3QudG9wKSArIHRoaXMuYW5pbWF0ZWRTY3JvbGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAibnVtYmVyIikgcmV0dXJuOwogICAgICAgIHRhcmdldCArPSBvZmZzZXQ7CiAgICAgICAgdGFyZ2V0ID0gTWF0aC5yb3VuZCh0YXJnZXQpOwogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW5maW5pdGUpIHsKICAgICAgICAgIGlmIChwcm9ncmFtbWF0aWMpIHsKICAgICAgICAgICAgdGhpcy50YXJnZXRTY3JvbGwgPSB0aGlzLmFuaW1hdGVkU2Nyb2xsID0gdGhpcy5zY3JvbGw7CiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gdGFyZ2V0IC0gdGhpcy5hbmltYXRlZFNjcm9sbDsKICAgICAgICAgICAgaWYgKGRpc3RhbmNlID4gdGhpcy5saW1pdCAvIDIpIHsKICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQgLSB0aGlzLmxpbWl0OwogICAgICAgICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlIDwgLXRoaXMubGltaXQgLyAyKSB7CiAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0ICsgdGhpcy5saW1pdDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0YXJnZXQgPSBjbGFtcDIoMCwgdGFyZ2V0LCB0aGlzLmxpbWl0KTsKICAgICAgICB9CiAgICAgICAgaWYgKHRhcmdldCA9PT0gdGhpcy50YXJnZXRTY3JvbGwpIHsKICAgICAgICAgIG9uU3RhcnQ/Lih0aGlzKTsKICAgICAgICAgIG9uQ29tcGxldGU/Lih0aGlzKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy51c2VyRGF0YSA9IHVzZXJEYXRhID8/IHt9OwogICAgICAgIGlmIChpbW1lZGlhdGUpIHsKICAgICAgICAgIHRoaXMuYW5pbWF0ZWRTY3JvbGwgPSB0aGlzLnRhcmdldFNjcm9sbCA9IHRhcmdldDsKICAgICAgICAgIHRoaXMuc2V0U2Nyb2xsKHRoaXMuc2Nyb2xsKTsKICAgICAgICAgIHRoaXMucmVzZXQoKTsKICAgICAgICAgIHRoaXMucHJldmVudE5leHROYXRpdmVTY3JvbGxFdmVudCgpOwogICAgICAgICAgdGhpcy5lbWl0KCk7CiAgICAgICAgICBvbkNvbXBsZXRlPy4odGhpcyk7CiAgICAgICAgICB0aGlzLnVzZXJEYXRhID0ge307CiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgICAgICB0aGlzLmRpc3BhdGNoU2Nyb2xsZW5kRXZlbnQoKTsKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXByb2dyYW1tYXRpYykgewogICAgICAgICAgdGhpcy50YXJnZXRTY3JvbGwgPSB0YXJnZXQ7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgZHVyYXRpb24gPT09ICJudW1iZXIiICYmIHR5cGVvZiBlYXNpbmcgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIGVhc2luZyA9IGRlZmF1bHRFYXNpbmc7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZWFzaW5nID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBkdXJhdGlvbiAhPT0gIm51bWJlciIpIHsKICAgICAgICAgIGR1cmF0aW9uID0gMTsKICAgICAgICB9CiAgICAgICAgdGhpcy5hbmltYXRlLmZyb21Ubyh0aGlzLmFuaW1hdGVkU2Nyb2xsLCB0YXJnZXQsIHsKICAgICAgICAgIGR1cmF0aW9uLAogICAgICAgICAgZWFzaW5nLAogICAgICAgICAgbGVycDogbGVycDIsCiAgICAgICAgICBvblN0YXJ0OiAoKSA9PiB7CiAgICAgICAgICAgIGlmIChsb2NrKSB0aGlzLmlzTG9ja2VkID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5pc1Njcm9sbGluZyA9ICJzbW9vdGgiOwogICAgICAgICAgICBvblN0YXJ0Py4odGhpcyk7CiAgICAgICAgICB9LAogICAgICAgICAgb25VcGRhdGU6ICh2YWx1ZTIsIGNvbXBsZXRlZCkgPT4gewogICAgICAgICAgICB0aGlzLmlzU2Nyb2xsaW5nID0gInNtb290aCI7CiAgICAgICAgICAgIHRoaXMubGFzdFZlbG9jaXR5ID0gdGhpcy52ZWxvY2l0eTsKICAgICAgICAgICAgdGhpcy52ZWxvY2l0eSA9IHZhbHVlMiAtIHRoaXMuYW5pbWF0ZWRTY3JvbGw7CiAgICAgICAgICAgIHRoaXMuZGlyZWN0aW9uID0gTWF0aC5zaWduKHRoaXMudmVsb2NpdHkpOwogICAgICAgICAgICB0aGlzLmFuaW1hdGVkU2Nyb2xsID0gdmFsdWUyOwogICAgICAgICAgICB0aGlzLnNldFNjcm9sbCh0aGlzLnNjcm9sbCk7CiAgICAgICAgICAgIGlmIChwcm9ncmFtbWF0aWMpIHsKICAgICAgICAgICAgICB0aGlzLnRhcmdldFNjcm9sbCA9IHZhbHVlMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbXBsZXRlZCkgdGhpcy5lbWl0KCk7CiAgICAgICAgICAgIGlmIChjb21wbGV0ZWQpIHsKICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7CiAgICAgICAgICAgICAgdGhpcy5lbWl0KCk7CiAgICAgICAgICAgICAgb25Db21wbGV0ZT8uKHRoaXMpOwogICAgICAgICAgICAgIHRoaXMudXNlckRhdGEgPSB7fTsKICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaFNjcm9sbGVuZEV2ZW50KCk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgdGhpcy5wcmV2ZW50TmV4dE5hdGl2ZVNjcm9sbEV2ZW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICBwcmV2ZW50TmV4dE5hdGl2ZVNjcm9sbEV2ZW50KCkgewogICAgICAgIHRoaXMuX3ByZXZlbnROZXh0TmF0aXZlU2Nyb2xsRXZlbnQgPSB0cnVlOwogICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICB0aGlzLl9wcmV2ZW50TmV4dE5hdGl2ZVNjcm9sbEV2ZW50ID0gZmFsc2U7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgY2hlY2tOZXN0ZWRTY3JvbGwobm9kZTIsIHsgZGVsdGFYLCBkZWx0YVkgfSkgewogICAgICAgIGNvbnN0IHRpbWUgPSBEYXRlLm5vdygpOwogICAgICAgIGNvbnN0IGNhY2hlID0gbm9kZTIuX2xlbmlzID8/PSB7fTsKICAgICAgICBsZXQgaGFzT3ZlcmZsb3dYLCBoYXNPdmVyZmxvd1ksIGlzU2Nyb2xsYWJsZVgsIGlzU2Nyb2xsYWJsZVksIHNjcm9sbFdpZHRoLCBzY3JvbGxIZWlnaHQsIGNsaWVudFdpZHRoLCBjbGllbnRIZWlnaHQ7CiAgICAgICAgY29uc3QgZ2VzdHVyZU9yaWVudGF0aW9uID0gdGhpcy5vcHRpb25zLmdlc3R1cmVPcmllbnRhdGlvbjsKICAgICAgICBpZiAodGltZSAtIChjYWNoZS50aW1lID8/IDApID4gMmUzKSB7CiAgICAgICAgICBjYWNoZS50aW1lID0gRGF0ZS5ub3coKTsKICAgICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlMik7CiAgICAgICAgICBjYWNoZS5jb21wdXRlZFN0eWxlID0gY29tcHV0ZWRTdHlsZTsKICAgICAgICAgIGNvbnN0IG92ZXJmbG93WFN0cmluZyA9IGNvbXB1dGVkU3R5bGUub3ZlcmZsb3dYOwogICAgICAgICAgY29uc3Qgb3ZlcmZsb3dZU3RyaW5nID0gY29tcHV0ZWRTdHlsZS5vdmVyZmxvd1k7CiAgICAgICAgICBoYXNPdmVyZmxvd1ggPSBbImF1dG8iLCAib3ZlcmxheSIsICJzY3JvbGwiXS5pbmNsdWRlcyhvdmVyZmxvd1hTdHJpbmcpOwogICAgICAgICAgaGFzT3ZlcmZsb3dZID0gWyJhdXRvIiwgIm92ZXJsYXkiLCAic2Nyb2xsIl0uaW5jbHVkZXMob3ZlcmZsb3dZU3RyaW5nKTsKICAgICAgICAgIGNhY2hlLmhhc092ZXJmbG93WCA9IGhhc092ZXJmbG93WDsKICAgICAgICAgIGNhY2hlLmhhc092ZXJmbG93WSA9IGhhc092ZXJmbG93WTsKICAgICAgICAgIGlmICghaGFzT3ZlcmZsb3dYICYmICFoYXNPdmVyZmxvd1kpIHJldHVybiBmYWxzZTsKICAgICAgICAgIGlmIChnZXN0dXJlT3JpZW50YXRpb24gPT09ICJ2ZXJ0aWNhbCIgJiYgIWhhc092ZXJmbG93WSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgaWYgKGdlc3R1cmVPcmllbnRhdGlvbiA9PT0gImhvcml6b250YWwiICYmICFoYXNPdmVyZmxvd1gpIHJldHVybiBmYWxzZTsKICAgICAgICAgIHNjcm9sbFdpZHRoID0gbm9kZTIuc2Nyb2xsV2lkdGg7CiAgICAgICAgICBzY3JvbGxIZWlnaHQgPSBub2RlMi5zY3JvbGxIZWlnaHQ7CiAgICAgICAgICBjbGllbnRXaWR0aCA9IG5vZGUyLmNsaWVudFdpZHRoOwogICAgICAgICAgY2xpZW50SGVpZ2h0ID0gbm9kZTIuY2xpZW50SGVpZ2h0OwogICAgICAgICAgaXNTY3JvbGxhYmxlWCA9IHNjcm9sbFdpZHRoID4gY2xpZW50V2lkdGg7CiAgICAgICAgICBpc1Njcm9sbGFibGVZID0gc2Nyb2xsSGVpZ2h0ID4gY2xpZW50SGVpZ2h0OwogICAgICAgICAgY2FjaGUuaXNTY3JvbGxhYmxlWCA9IGlzU2Nyb2xsYWJsZVg7CiAgICAgICAgICBjYWNoZS5pc1Njcm9sbGFibGVZID0gaXNTY3JvbGxhYmxlWTsKICAgICAgICAgIGNhY2hlLnNjcm9sbFdpZHRoID0gc2Nyb2xsV2lkdGg7CiAgICAgICAgICBjYWNoZS5zY3JvbGxIZWlnaHQgPSBzY3JvbGxIZWlnaHQ7CiAgICAgICAgICBjYWNoZS5jbGllbnRXaWR0aCA9IGNsaWVudFdpZHRoOwogICAgICAgICAgY2FjaGUuY2xpZW50SGVpZ2h0ID0gY2xpZW50SGVpZ2h0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpc1Njcm9sbGFibGVYID0gY2FjaGUuaXNTY3JvbGxhYmxlWDsKICAgICAgICAgIGlzU2Nyb2xsYWJsZVkgPSBjYWNoZS5pc1Njcm9sbGFibGVZOwogICAgICAgICAgaGFzT3ZlcmZsb3dYID0gY2FjaGUuaGFzT3ZlcmZsb3dYOwogICAgICAgICAgaGFzT3ZlcmZsb3dZID0gY2FjaGUuaGFzT3ZlcmZsb3dZOwogICAgICAgICAgc2Nyb2xsV2lkdGggPSBjYWNoZS5zY3JvbGxXaWR0aDsKICAgICAgICAgIHNjcm9sbEhlaWdodCA9IGNhY2hlLnNjcm9sbEhlaWdodDsKICAgICAgICAgIGNsaWVudFdpZHRoID0gY2FjaGUuY2xpZW50V2lkdGg7CiAgICAgICAgICBjbGllbnRIZWlnaHQgPSBjYWNoZS5jbGllbnRIZWlnaHQ7CiAgICAgICAgfQogICAgICAgIGlmICghaGFzT3ZlcmZsb3dYICYmICFoYXNPdmVyZmxvd1kgfHwgIWlzU2Nyb2xsYWJsZVggJiYgIWlzU2Nyb2xsYWJsZVkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKGdlc3R1cmVPcmllbnRhdGlvbiA9PT0gInZlcnRpY2FsIiAmJiAoIWhhc092ZXJmbG93WSB8fCAhaXNTY3JvbGxhYmxlWSkpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKGdlc3R1cmVPcmllbnRhdGlvbiA9PT0gImhvcml6b250YWwiICYmICghaGFzT3ZlcmZsb3dYIHx8ICFpc1Njcm9sbGFibGVYKSkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBsZXQgb3JpZW50YXRpb247CiAgICAgICAgaWYgKGdlc3R1cmVPcmllbnRhdGlvbiA9PT0gImhvcml6b250YWwiKSB7CiAgICAgICAgICBvcmllbnRhdGlvbiA9ICJ4IjsKICAgICAgICB9IGVsc2UgaWYgKGdlc3R1cmVPcmllbnRhdGlvbiA9PT0gInZlcnRpY2FsIikgewogICAgICAgICAgb3JpZW50YXRpb24gPSAieSI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGlzU2Nyb2xsaW5nWCA9IGRlbHRhWCAhPT0gMDsKICAgICAgICAgIGNvbnN0IGlzU2Nyb2xsaW5nWSA9IGRlbHRhWSAhPT0gMDsKICAgICAgICAgIGlmIChpc1Njcm9sbGluZ1ggJiYgaGFzT3ZlcmZsb3dYICYmIGlzU2Nyb2xsYWJsZVgpIHsKICAgICAgICAgICAgb3JpZW50YXRpb24gPSAieCI7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNTY3JvbGxpbmdZICYmIGhhc092ZXJmbG93WSAmJiBpc1Njcm9sbGFibGVZKSB7CiAgICAgICAgICAgIG9yaWVudGF0aW9uID0gInkiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIW9yaWVudGF0aW9uKSByZXR1cm4gZmFsc2U7CiAgICAgICAgbGV0IHNjcm9sbCwgbWF4U2Nyb2xsLCBkZWx0YSwgaGFzT3ZlcmZsb3csIGlzU2Nyb2xsYWJsZTsKICAgICAgICBpZiAob3JpZW50YXRpb24gPT09ICJ4IikgewogICAgICAgICAgc2Nyb2xsID0gbm9kZTIuc2Nyb2xsTGVmdDsKICAgICAgICAgIG1heFNjcm9sbCA9IHNjcm9sbFdpZHRoIC0gY2xpZW50V2lkdGg7CiAgICAgICAgICBkZWx0YSA9IGRlbHRhWDsKICAgICAgICAgIGhhc092ZXJmbG93ID0gaGFzT3ZlcmZsb3dYOwogICAgICAgICAgaXNTY3JvbGxhYmxlID0gaXNTY3JvbGxhYmxlWDsKICAgICAgICB9IGVsc2UgaWYgKG9yaWVudGF0aW9uID09PSAieSIpIHsKICAgICAgICAgIHNjcm9sbCA9IG5vZGUyLnNjcm9sbFRvcDsKICAgICAgICAgIG1heFNjcm9sbCA9IHNjcm9sbEhlaWdodCAtIGNsaWVudEhlaWdodDsKICAgICAgICAgIGRlbHRhID0gZGVsdGFZOwogICAgICAgICAgaGFzT3ZlcmZsb3cgPSBoYXNPdmVyZmxvd1k7CiAgICAgICAgICBpc1Njcm9sbGFibGUgPSBpc1Njcm9sbGFibGVZOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHdpbGxTY3JvbGwgPSBkZWx0YSA+IDAgPyBzY3JvbGwgPCBtYXhTY3JvbGwgOiBzY3JvbGwgPiAwOwogICAgICAgIHJldHVybiB3aWxsU2Nyb2xsICYmIGhhc092ZXJmbG93ICYmIGlzU2Nyb2xsYWJsZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogVGhlIHJvb3QgZWxlbWVudCBvbiB3aGljaCBsZW5pcyBpcyBpbnN0YW5jZWQKICAgICAgICovCiAgICAgIGdldCByb290RWxlbWVudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLndyYXBwZXIgPT09IHdpbmRvdyA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCA6IHRoaXMub3B0aW9ucy53cmFwcGVyOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBUaGUgbGltaXQgd2hpY2ggaXMgdGhlIG1heGltdW0gc2Nyb2xsIHZhbHVlCiAgICAgICAqLwogICAgICBnZXQgbGltaXQoKSB7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5uYWl2ZURpbWVuc2lvbnMpIHsKICAgICAgICAgIGlmICh0aGlzLmlzSG9yaXpvbnRhbCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5yb290RWxlbWVudC5zY3JvbGxXaWR0aCAtIHRoaXMucm9vdEVsZW1lbnQuY2xpZW50V2lkdGg7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gdGhpcy5yb290RWxlbWVudC5zY3JvbGxIZWlnaHQgLSB0aGlzLnJvb3RFbGVtZW50LmNsaWVudEhlaWdodDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHRoaXMuZGltZW5zaW9ucy5saW1pdFt0aGlzLmlzSG9yaXpvbnRhbCA/ICJ4IiA6ICJ5Il07CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgc2Nyb2xsIGlzIGhvcml6b250YWwKICAgICAgICovCiAgICAgIGdldCBpc0hvcml6b250YWwoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbiA9PT0gImhvcml6b250YWwiOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBUaGUgYWN0dWFsIHNjcm9sbCB2YWx1ZQogICAgICAgKi8KICAgICAgZ2V0IGFjdHVhbFNjcm9sbCgpIHsKICAgICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5vcHRpb25zLndyYXBwZXI7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNIb3Jpem9udGFsID8gd3JhcHBlci5zY3JvbGxYID8/IHdyYXBwZXIuc2Nyb2xsTGVmdCA6IHdyYXBwZXIuc2Nyb2xsWSA/PyB3cmFwcGVyLnNjcm9sbFRvcDsKICAgICAgfQogICAgICAvKioKICAgICAgICogVGhlIGN1cnJlbnQgc2Nyb2xsIHZhbHVlCiAgICAgICAqLwogICAgICBnZXQgc2Nyb2xsKCkgewogICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaW5maW5pdGUgPyBtb2R1bG8odGhpcy5hbmltYXRlZFNjcm9sbCwgdGhpcy5saW1pdCkgOiB0aGlzLmFuaW1hdGVkU2Nyb2xsOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBUaGUgcHJvZ3Jlc3Mgb2YgdGhlIHNjcm9sbCByZWxhdGl2ZSB0byB0aGUgbGltaXQKICAgICAgICovCiAgICAgIGdldCBwcm9ncmVzcygpIHsKICAgICAgICByZXR1cm4gdGhpcy5saW1pdCA9PT0gMCA/IDEgOiB0aGlzLnNjcm9sbCAvIHRoaXMubGltaXQ7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEN1cnJlbnQgc2Nyb2xsIHN0YXRlCiAgICAgICAqLwogICAgICBnZXQgaXNTY3JvbGxpbmcoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2lzU2Nyb2xsaW5nOwogICAgICB9CiAgICAgIHNldCBpc1Njcm9sbGluZyh2YWx1ZTIpIHsKICAgICAgICBpZiAodGhpcy5faXNTY3JvbGxpbmcgIT09IHZhbHVlMikgewogICAgICAgICAgdGhpcy5faXNTY3JvbGxpbmcgPSB2YWx1ZTI7CiAgICAgICAgICB0aGlzLnVwZGF0ZUNsYXNzTmFtZSgpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogQ2hlY2sgaWYgbGVuaXMgaXMgc3RvcHBlZAogICAgICAgKi8KICAgICAgZ2V0IGlzU3RvcHBlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5faXNTdG9wcGVkOwogICAgICB9CiAgICAgIHNldCBpc1N0b3BwZWQodmFsdWUyKSB7CiAgICAgICAgaWYgKHRoaXMuX2lzU3RvcHBlZCAhPT0gdmFsdWUyKSB7CiAgICAgICAgICB0aGlzLl9pc1N0b3BwZWQgPSB2YWx1ZTI7CiAgICAgICAgICB0aGlzLnVwZGF0ZUNsYXNzTmFtZSgpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogQ2hlY2sgaWYgbGVuaXMgaXMgbG9ja2VkCiAgICAgICAqLwogICAgICBnZXQgaXNMb2NrZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2lzTG9ja2VkOwogICAgICB9CiAgICAgIHNldCBpc0xvY2tlZCh2YWx1ZTIpIHsKICAgICAgICBpZiAodGhpcy5faXNMb2NrZWQgIT09IHZhbHVlMikgewogICAgICAgICAgdGhpcy5faXNMb2NrZWQgPSB2YWx1ZTI7CiAgICAgICAgICB0aGlzLnVwZGF0ZUNsYXNzTmFtZSgpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogQ2hlY2sgaWYgbGVuaXMgaXMgc21vb3RoIHNjcm9sbGluZwogICAgICAgKi8KICAgICAgZ2V0IGlzU21vb3RoKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzU2Nyb2xsaW5nID09PSAic21vb3RoIjsKICAgICAgfQogICAgICAvKioKICAgICAgICogVGhlIGNsYXNzIG5hbWUgYXBwbGllZCB0byB0aGUgd3JhcHBlciBlbGVtZW50CiAgICAgICAqLwogICAgICBnZXQgY2xhc3NOYW1lKCkgewogICAgICAgIGxldCBjbGFzc05hbWUgPSAibGVuaXMiOwogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b1RvZ2dsZSkgY2xhc3NOYW1lICs9ICIgbGVuaXMtYXV0b1RvZ2dsZSI7CiAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSBjbGFzc05hbWUgKz0gIiBsZW5pcy1zdG9wcGVkIjsKICAgICAgICBpZiAodGhpcy5pc0xvY2tlZCkgY2xhc3NOYW1lICs9ICIgbGVuaXMtbG9ja2VkIjsKICAgICAgICBpZiAodGhpcy5pc1Njcm9sbGluZykgY2xhc3NOYW1lICs9ICIgbGVuaXMtc2Nyb2xsaW5nIjsKICAgICAgICBpZiAodGhpcy5pc1Njcm9sbGluZyA9PT0gInNtb290aCIpIGNsYXNzTmFtZSArPSAiIGxlbmlzLXNtb290aCI7CiAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKICAgICAgfQogICAgICB1cGRhdGVDbGFzc05hbWUoKSB7CiAgICAgICAgdGhpcy5jbGVhblVwQ2xhc3NOYW1lKCk7CiAgICAgICAgdGhpcy5yb290RWxlbWVudC5jbGFzc05hbWUgPSBgJHt0aGlzLnJvb3RFbGVtZW50LmNsYXNzTmFtZX0gJHt0aGlzLmNsYXNzTmFtZX1gLnRyaW0oKTsKICAgICAgfQogICAgICBjbGVhblVwQ2xhc3NOYW1lKCkgewogICAgICAgIHRoaXMucm9vdEVsZW1lbnQuY2xhc3NOYW1lID0gdGhpcy5yb290RWxlbWVudC5jbGFzc05hbWUucmVwbGFjZSgvbGVuaXMoLVx3Kyk/L2csICIiKS50cmltKCk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zd2VldC1zY3JvbGxANC4wLjAvbm9kZV9tb2R1bGVzL3N3ZWV0LXNjcm9sbC9zd2VldC1zY3JvbGwuanMKdmFyIHJlcXVpcmVfc3dlZXRfc2Nyb2xsID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9zd2VldC1zY3JvbGxANC4wLjAvbm9kZV9tb2R1bGVzL3N3ZWV0LXNjcm9sbC9zd2VldC1zY3JvbGwuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgKGZ1bmN0aW9uKGdsb2JhbDIsIGZhY3RvcnkpIHsKICAgICAgdHlwZW9mIGV4cG9ydHMgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOiB0eXBlb2YgZGVmaW5lID09PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOiAoZ2xvYmFsMiA9IGdsb2JhbDIgfHwgc2VsZiwgZ2xvYmFsMi5Td2VldFNjcm9sbCA9IGZhY3RvcnkoKSk7CiAgICB9KShleHBvcnRzLCBmdW5jdGlvbigpIHsKICAgICAgInVzZSBzdHJpY3QiOwogICAgICB2YXIgX19hc3NpZ24yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgX19hc3NpZ24yID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbjModDkpIHsKICAgICAgICAgIGZvciAodmFyIHM5LCBpMTEgPSAxLCBuMTMgPSBhcmd1bWVudHMubGVuZ3RoOyBpMTEgPCBuMTM7IGkxMSsrKSB7CiAgICAgICAgICAgIHM5ID0gYXJndW1lbnRzW2kxMV07CiAgICAgICAgICAgIGZvciAodmFyIHA3IGluIHM5KSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHM5LCBwNykpIHQ5W3A3XSA9IHM5W3A3XTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0OTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBfX2Fzc2lnbjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgfTsKICAgICAgdmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7CiAgICAgIHZhciBjYW5Vc2VIaXN0b3J5ID0gIWNhblVzZURPTSA/IGZhbHNlIDogd2luZG93Lmhpc3RvcnkgJiYgInB1c2hTdGF0ZSIgaW4gd2luZG93Lmhpc3RvcnkgJiYgd2luZG93LmxvY2F0aW9uLnByb3RvY29sICE9PSAiZmlsZToiOwogICAgICB2YXIgY2FuVXNlUGFzc2l2ZU9wdGlvbiA9IChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3VwcG9ydCA9IGZhbHNlOwogICAgICAgIGlmICghY2FuVXNlRE9NKSB7CiAgICAgICAgICByZXR1cm4gc3VwcG9ydDsKICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciB3aW4gPSB3aW5kb3c7CiAgICAgICAgICB2YXIgb3B0cyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgInBhc3NpdmUiLCB7CiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgc3VwcG9ydCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgd2luLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLCBudWxsLCBvcHRzKTsKICAgICAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IiwgbnVsbCwgb3B0cyk7CiAgICAgICAgfSBjYXRjaCAoZTExKSB7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdXBwb3J0OwogICAgICB9KSgpOwogICAgICB2YXIgaXNTdHJpbmcyID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICJzdHJpbmciOwogICAgICB9OwogICAgICB2YXIgaXNGdW5jdGlvbjIgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gImZ1bmN0aW9uIjsKICAgICAgfTsKICAgICAgdmFyIGlzQXJyYXkzID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob2JqKTsKICAgICAgfTsKICAgICAgdmFyIGlzTnVtZXJpYyA9IGZ1bmN0aW9uKG9iaikgewogICAgICAgIHJldHVybiAhaXNBcnJheTMob2JqKSAmJiBvYmogLSBwYXJzZUZsb2F0KG9iaikgKyAxID49IDA7CiAgICAgIH07CiAgICAgIHZhciBoYXNQcm9wID0gZnVuY3Rpb24ob2JqLCBrZXkyKSB7CiAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmouaGFzT3duUHJvcGVydHkoa2V5Mik7CiAgICAgIH07CiAgICAgIHZhciByYWYgPSBjYW5Vc2VET00gPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KSA6IG51bGw7CiAgICAgIHZhciBjYWYgPSBjYW5Vc2VET00gPyB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogbnVsbDsKICAgICAgdmFyIGNvcyA9IE1hdGguY29zLCBzaW4gPSBNYXRoLnNpbiwgcG93ID0gTWF0aC5wb3csIHNxcnQgPSBNYXRoLnNxcnQsIFBJID0gTWF0aC5QSTsKICAgICAgdmFyIGVhc2luZ3MgPSB7CiAgICAgICAgbGluZWFyOiBmdW5jdGlvbihwNykgewogICAgICAgICAgcmV0dXJuIHA3OwogICAgICAgIH0sCiAgICAgICAgZWFzZUluUXVhZDogZnVuY3Rpb24oXzQsIHQ5LCBiNSwgYzExLCBkNikgewogICAgICAgICAgcmV0dXJuIGMxMSAqICh0OSAvPSBkNikgKiB0OSArIGI1OwogICAgICAgIH0sCiAgICAgICAgZWFzZU91dFF1YWQ6IGZ1bmN0aW9uKF80LCB0OSwgYjUsIGMxMSwgZDYpIHsKICAgICAgICAgIHJldHVybiAtYzExICogKHQ5IC89IGQ2KSAqICh0OSAtIDIpICsgYjU7CiAgICAgICAgfSwKICAgICAgICBlYXNlSW5PdXRRdWFkOiBmdW5jdGlvbihfNCwgdDksIGI1LCBjMTEsIGQ2KSB7CiAgICAgICAgICByZXR1cm4gKHQ5IC89IGQ2IC8gMikgPCAxID8gYzExIC8gMiAqIHQ5ICogdDkgKyBiNSA6IC1jMTEgLyAyICogKC0tdDkgKiAodDkgLSAyKSAtIDEpICsgYjU7CiAgICAgICAgfSwKICAgICAgICBlYXNlSW5DdWJpYzogZnVuY3Rpb24oXzQsIHQ5LCBiNSwgYzExLCBkNikgewogICAgICAgICAgcmV0dXJuIGMxMSAqICh0OSAvPSBkNikgKiB0OSAqIHQ5ICsgYjU7CiAgICAgICAgfSwKICAgICAgICBlYXNlT3V0Q3ViaWM6IGZ1bmN0aW9uKF80LCB0OSwgYjUsIGMxMSwgZDYpIHsKICAgICAgICAgIHJldHVybiBjMTEgKiAoKHQ5ID0gdDkgLyBkNiAtIDEpICogdDkgKiB0OSArIDEpICsgYjU7CiAgICAgICAgfSwKICAgICAgICBlYXNlSW5PdXRDdWJpYzogZnVuY3Rpb24oXzQsIHQ5LCBiNSwgYzExLCBkNikgewogICAgICAgICAgcmV0dXJuICh0OSAvPSBkNiAvIDIpIDwgMSA/IGMxMSAvIDIgKiB0OSAqIHQ5ICogdDkgKyBiNSA6IGMxMSAvIDIgKiAoKHQ5IC09IDIpICogdDkgKiB0OSArIDIpICsgYjU7CiAgICAgICAgfSwKICAgICAgICBlYXNlSW5RdWFydDogZnVuY3Rpb24oXzQsIHQ5LCBiNSwgYzExLCBkNikgewogICAgICAgICAgcmV0dXJuIGMxMSAqICh0OSAvPSBkNikgKiB0OSAqIHQ5ICogdDkgKyBiNTsKICAgICAgICB9LAogICAgICAgIGVhc2VPdXRRdWFydDogZnVuY3Rpb24oXzQsIHQ5LCBiNSwgYzExLCBkNikgewogICAgICAgICAgcmV0dXJuIC1jMTEgKiAoKHQ5ID0gdDkgLyBkNiAtIDEpICogdDkgKiB0OSAqIHQ5IC0gMSkgKyBiNTsKICAgICAgICB9LAogICAgICAgIGVhc2VJbk91dFF1YXJ0OiBmdW5jdGlvbihfNCwgdDksIGI1LCBjMTEsIGQ2KSB7CiAgICAgICAgICByZXR1cm4gKHQ5IC89IGQ2IC8gMikgPCAxID8gYzExIC8gMiAqIHQ5ICogdDkgKiB0OSAqIHQ5ICsgYjUgOiAtYzExIC8gMiAqICgodDkgLT0gMikgKiB0OSAqIHQ5ICogdDkgLSAyKSArIGI1OwogICAgICAgIH0sCiAgICAgICAgZWFzZUluUXVpbnQ6IGZ1bmN0aW9uKF80LCB0OSwgYjUsIGMxMSwgZDYpIHsKICAgICAgICAgIHJldHVybiBjMTEgKiAodDkgLz0gZDYpICogdDkgKiB0OSAqIHQ5ICogdDkgKyBiNTsKICAgICAgICB9LAogICAgICAgIGVhc2VPdXRRdWludDogZnVuY3Rpb24oXzQsIHQ5LCBiNSwgYzExLCBkNikgewogICAgICAgICAgcmV0dXJuIGMxMSAqICgodDkgPSB0OSAvIGQ2IC0gMSkgKiB0OSAqIHQ5ICogdDkgKiB0OSArIDEpICsgYjU7CiAgICAgICAgfSwKICAgICAgICBlYXNlSW5PdXRRdWludDogZnVuY3Rpb24oXzQsIHQ5LCBiNSwgYzExLCBkNikgewogICAgICAgICAgcmV0dXJuICh0OSAvPSBkNiAvIDIpIDwgMSA/IGMxMSAvIDIgKiB0OSAqIHQ5ICogdDkgKiB0OSAqIHQ5ICsgYjUgOiBjMTEgLyAyICogKCh0OSAtPSAyKSAqIHQ5ICogdDkgKiB0OSAqIHQ5ICsgMikgKyBiNTsKICAgICAgICB9LAogICAgICAgIGVhc2VJblNpbmU6IGZ1bmN0aW9uKF80LCB0OSwgYjUsIGMxMSwgZDYpIHsKICAgICAgICAgIHJldHVybiAtYzExICogY29zKHQ5IC8gZDYgKiAoUEkgLyAyKSkgKyBjMTEgKyBiNTsKICAgICAgICB9LAogICAgICAgIGVhc2VPdXRTaW5lOiBmdW5jdGlvbihfNCwgdDksIGI1LCBjMTEsIGQ2KSB7CiAgICAgICAgICByZXR1cm4gYzExICogc2luKHQ5IC8gZDYgKiAoUEkgLyAyKSkgKyBiNTsKICAgICAgICB9LAogICAgICAgIGVhc2VJbk91dFNpbmU6IGZ1bmN0aW9uKF80LCB0OSwgYjUsIGMxMSwgZDYpIHsKICAgICAgICAgIHJldHVybiAtYzExIC8gMiAqIChjb3MoUEkgKiB0OSAvIGQ2KSAtIDEpICsgYjU7CiAgICAgICAgfSwKICAgICAgICBlYXNlSW5FeHBvOiBmdW5jdGlvbihfNCwgdDksIGI1LCBjMTEsIGQ2KSB7CiAgICAgICAgICByZXR1cm4gdDkgPT09IDAgPyBiNSA6IGMxMSAqIHBvdygyLCAxMCAqICh0OSAvIGQ2IC0gMSkpICsgYjU7CiAgICAgICAgfSwKICAgICAgICBlYXNlT3V0RXhwbzogZnVuY3Rpb24oXzQsIHQ5LCBiNSwgYzExLCBkNikgewogICAgICAgICAgcmV0dXJuIHQ5ID09PSBkNiA/IGI1ICsgYzExIDogYzExICogKC1wb3coMiwgLTEwICogdDkgLyBkNikgKyAxKSArIGI1OwogICAgICAgIH0sCiAgICAgICAgZWFzZUluT3V0RXhwbzogZnVuY3Rpb24oXzQsIHQ5LCBiNSwgYzExLCBkNikgewogICAgICAgICAgaWYgKHQ5ID09PSAwKQogICAgICAgICAgICByZXR1cm4gYjU7CiAgICAgICAgICBpZiAodDkgPT09IGQ2KQogICAgICAgICAgICByZXR1cm4gYjUgKyBjMTE7CiAgICAgICAgICBpZiAoKHQ5IC89IGQ2IC8gMikgPCAxKQogICAgICAgICAgICByZXR1cm4gYzExIC8gMiAqIHBvdygyLCAxMCAqICh0OSAtIDEpKSArIGI1OwogICAgICAgICAgcmV0dXJuIGMxMSAvIDIgKiAoLXBvdygyLCAtMTAgKiAtLXQ5KSArIDIpICsgYjU7CiAgICAgICAgfSwKICAgICAgICBlYXNlSW5DaXJjOiBmdW5jdGlvbihfNCwgdDksIGI1LCBjMTEsIGQ2KSB7CiAgICAgICAgICByZXR1cm4gLWMxMSAqIChzcXJ0KDEgLSAodDkgLz0gZDYpICogdDkpIC0gMSkgKyBiNTsKICAgICAgICB9LAogICAgICAgIGVhc2VPdXRDaXJjOiBmdW5jdGlvbihfNCwgdDksIGI1LCBjMTEsIGQ2KSB7CiAgICAgICAgICByZXR1cm4gYzExICogc3FydCgxIC0gKHQ5ID0gdDkgLyBkNiAtIDEpICogdDkpICsgYjU7CiAgICAgICAgfSwKICAgICAgICBlYXNlSW5PdXRDaXJjOiBmdW5jdGlvbihfNCwgdDksIGI1LCBjMTEsIGQ2KSB7CiAgICAgICAgICByZXR1cm4gKHQ5IC89IGQ2IC8gMikgPCAxID8gLWMxMSAvIDIgKiAoc3FydCgxIC0gdDkgKiB0OSkgLSAxKSArIGI1IDogYzExIC8gMiAqIChzcXJ0KDEgLSAodDkgLT0gMikgKiB0OSkgKyAxKSArIGI1OwogICAgICAgIH0KICAgICAgfTsKICAgICAgdmFyICQkID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsKICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIXNlbGVjdG9yID8gW10gOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7CiAgICAgIH07CiAgICAgIHZhciAkMyA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7CiAgICAgICAgcmV0dXJuICQkKHNlbGVjdG9yKS5zaGlmdCgpIHx8IG51bGw7CiAgICAgIH07CiAgICAgIHZhciBpc0VsZW1lbnQgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgRWxlbWVudDsKICAgICAgfTsKICAgICAgdmFyIGlzV2luZG93ID0gZnVuY3Rpb24oJGVsKSB7CiAgICAgICAgcmV0dXJuICRlbCA9PT0gd2luZG93OwogICAgICB9OwogICAgICB2YXIgaXNSb290Q29udGFpbmVyID0gZnVuY3Rpb24oJGVsKSB7CiAgICAgICAgcmV0dXJuICRlbCA9PT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8ICRlbCA9PT0gZG9jdW1lbnQuYm9keTsKICAgICAgfTsKICAgICAgdmFyIG1hdGNoZXMgPSBmdW5jdGlvbigkZWwsIHNlbGVjdG9yKSB7CiAgICAgICAgaWYgKGlzRWxlbWVudChzZWxlY3RvcikpIHsKICAgICAgICAgIHJldHVybiAkZWwgPT09IHNlbGVjdG9yOwogICAgICAgIH0KICAgICAgICB2YXIgcmVzdWx0cyA9ICQkKHNlbGVjdG9yKTsKICAgICAgICB2YXIgaTExID0gcmVzdWx0cy5sZW5ndGg7CiAgICAgICAgd2hpbGUgKC0taTExID49IDAgJiYgcmVzdWx0c1tpMTFdICE9PSAkZWwpIHsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGkxMSA+IC0xOwogICAgICB9OwogICAgICB2YXIgZ2V0SGVpZ2h0ID0gZnVuY3Rpb24oJGVsKSB7CiAgICAgICAgcmV0dXJuIE1hdGgubWF4KCRlbC5zY3JvbGxIZWlnaHQsICRlbC5jbGllbnRIZWlnaHQsICRlbC5vZmZzZXRIZWlnaHQpOwogICAgICB9OwogICAgICB2YXIgZ2V0V2lkdGggPSBmdW5jdGlvbigkZWwpIHsKICAgICAgICByZXR1cm4gTWF0aC5tYXgoJGVsLnNjcm9sbFdpZHRoLCAkZWwuY2xpZW50V2lkdGgsICRlbC5vZmZzZXRXaWR0aCk7CiAgICAgIH07CiAgICAgIHZhciBnZXRTaXplMiA9IGZ1bmN0aW9uKCRlbCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB3aWR0aDogZ2V0V2lkdGgoJGVsKSwKICAgICAgICAgIGhlaWdodDogZ2V0SGVpZ2h0KCRlbCkKICAgICAgICB9OwogICAgICB9OwogICAgICB2YXIgZ2V0Vmlld3BvcnRBbmRFbGVtZW50U2l6ZXMgPSBmdW5jdGlvbigkZWwpIHsKICAgICAgICB2YXIgaXNSb290ID0gaXNXaW5kb3coJGVsKSB8fCBpc1Jvb3RDb250YWluZXIoJGVsKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgdmlld3BvcnQ6IHsKICAgICAgICAgICAgd2lkdGg6IGlzUm9vdCA/IE1hdGgubWluKHdpbmRvdy5pbm5lcldpZHRoLCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpIDogJGVsLmNsaWVudFdpZHRoLAogICAgICAgICAgICBoZWlnaHQ6IGlzUm9vdCA/IHdpbmRvdy5pbm5lckhlaWdodCA6ICRlbC5jbGllbnRIZWlnaHQKICAgICAgICAgIH0sCiAgICAgICAgICBzaXplOiBpc1Jvb3QgPyB7CiAgICAgICAgICAgIHdpZHRoOiBNYXRoLm1heChnZXRXaWR0aChkb2N1bWVudC5ib2R5KSwgZ2V0V2lkdGgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSksCiAgICAgICAgICAgIGhlaWdodDogTWF0aC5tYXgoZ2V0SGVpZ2h0KGRvY3VtZW50LmJvZHkpLCBnZXRIZWlnaHQoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSkKICAgICAgICAgIH0gOiBnZXRTaXplMigkZWwpCiAgICAgICAgfTsKICAgICAgfTsKICAgICAgdmFyIGRpcmVjdGlvbk1ldGhvZE1hcCA9IHsKICAgICAgICB5OiAic2Nyb2xsVG9wIiwKICAgICAgICB4OiAic2Nyb2xsTGVmdCIKICAgICAgfTsKICAgICAgdmFyIGRpcmVjdGlvblByb3BNYXAgPSB7CiAgICAgICAgeTogInBhZ2VZT2Zmc2V0IiwKICAgICAgICB4OiAicGFnZVhPZmZzZXQiCiAgICAgIH07CiAgICAgIHZhciBnZXRTY3JvbGwgPSBmdW5jdGlvbigkZWwsIGRpcmVjdGlvbikgewogICAgICAgIHJldHVybiBpc1dpbmRvdygkZWwpID8gJGVsW2RpcmVjdGlvblByb3BNYXBbZGlyZWN0aW9uXV0gOiAkZWxbZGlyZWN0aW9uTWV0aG9kTWFwW2RpcmVjdGlvbl1dOwogICAgICB9OwogICAgICB2YXIgc2V0U2Nyb2xsID0gZnVuY3Rpb24oJGVsLCBvZmZzZXQsIGRpcmVjdGlvbikgewogICAgICAgIGlmIChpc1dpbmRvdygkZWwpKSB7CiAgICAgICAgICB2YXIgdG9wXzEgPSBkaXJlY3Rpb24gPT09ICJ5IjsKICAgICAgICAgICRlbC5zY3JvbGxUbyghdG9wXzEgPyBvZmZzZXQgOiAkZWwucGFnZVhPZmZzZXQsIHRvcF8xID8gb2Zmc2V0IDogJGVsLnBhZ2VZT2Zmc2V0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgJGVsW2RpcmVjdGlvbk1ldGhvZE1hcFtkaXJlY3Rpb25dXSA9IG9mZnNldDsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHZhciBnZXRPZmZzZXQgPSBmdW5jdGlvbigkZWwsICRjb250ZXh0KSB7CiAgICAgICAgdmFyIHJlY3QgPSAkZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgaWYgKHJlY3Qud2lkdGggfHwgcmVjdC5oZWlnaHQpIHsKICAgICAgICAgIHZhciBzY3JvbGxfMSA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07CiAgICAgICAgICB2YXIgJGN0eCA9IHZvaWQgMDsKICAgICAgICAgIGlmIChpc1dpbmRvdygkY29udGV4dCkgfHwgaXNSb290Q29udGFpbmVyKCRjb250ZXh0KSkgewogICAgICAgICAgICAkY3R4ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgICAgICAgICBzY3JvbGxfMS50b3AgPSB3aW5kb3dbZGlyZWN0aW9uUHJvcE1hcC55XTsKICAgICAgICAgICAgc2Nyb2xsXzEubGVmdCA9IHdpbmRvd1tkaXJlY3Rpb25Qcm9wTWFwLnhdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGN0eCA9ICRjb250ZXh0OwogICAgICAgICAgICB2YXIgY1JlY3QgPSAkY3R4LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICBzY3JvbGxfMS50b3AgPSBjUmVjdC50b3AgKiAtMSArICRjdHhbZGlyZWN0aW9uTWV0aG9kTWFwLnldOwogICAgICAgICAgICBzY3JvbGxfMS5sZWZ0ID0gY1JlY3QubGVmdCAqIC0xICsgJGN0eFtkaXJlY3Rpb25NZXRob2RNYXAueF07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b3A6IHJlY3QudG9wICsgc2Nyb2xsXzEudG9wIC0gJGN0eC5jbGllbnRUb3AsCiAgICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCArIHNjcm9sbF8xLmxlZnQgLSAkY3R4LmNsaWVudExlZnQKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWN0OwogICAgICB9OwogICAgICB2YXIgd2hlZWxFdmVudE5hbWUgPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCFjYW5Vc2VET00pIHsKICAgICAgICAgIHJldHVybiAid2hlZWwiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gIm9ud2hlZWwiIGluIGRvY3VtZW50ID8gIndoZWVsIiA6ICJtb3VzZXdoZWVsIjsKICAgICAgfSkoKTsKICAgICAgdmFyIGV2ZW50TmFtZSA9IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICByZXR1cm4gbmFtZSA9PT0gIndoZWVsIiA/IHdoZWVsRXZlbnROYW1lIDogbmFtZTsKICAgICAgfTsKICAgICAgdmFyIGFwcGx5ID0gZnVuY3Rpb24oJGVsLCBtZXRob2QsIGV2ZW50LCBsaXN0ZW5lcjIsIHBhc3NpdmUpIHsKICAgICAgICBldmVudC5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24obmFtZSkgewogICAgICAgICAgJGVsW21ldGhvZF0oZXZlbnROYW1lKG5hbWUpLCBsaXN0ZW5lcjIsIGNhblVzZVBhc3NpdmVPcHRpb24gPyB7IHBhc3NpdmUgfSA6IGZhbHNlKTsKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgdmFyIGFkZEV2ZW50ID0gZnVuY3Rpb24oJGVsLCBldmVudCwgbGlzdGVuZXIyLCBwYXNzaXZlKSB7CiAgICAgICAgcmV0dXJuIGFwcGx5KCRlbCwgImFkZEV2ZW50TGlzdGVuZXIiLCBldmVudCwgbGlzdGVuZXIyLCBwYXNzaXZlKTsKICAgICAgfTsKICAgICAgdmFyIHJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oJGVsLCBldmVudCwgbGlzdGVuZXIyLCBwYXNzaXZlKSB7CiAgICAgICAgcmV0dXJuIGFwcGx5KCRlbCwgInJlbW92ZUV2ZW50TGlzdGVuZXIiLCBldmVudCwgbGlzdGVuZXIyLCBwYXNzaXZlKTsKICAgICAgfTsKICAgICAgdmFyIHJlUmVsYXRpdmVUb2tlbiA9IC9eKFwrfC0pPShcZCsoPzpcLlxkKyk/KSQvOwogICAgICB2YXIgcGFyc2VDb29yZGluYXRlID0gZnVuY3Rpb24oY29vcmRpbmF0ZSwgZW5hYmxlVmVydGljYWwpIHsKICAgICAgICB2YXIgcmVzID0geyB0b3A6IDAsIGxlZnQ6IDAsIHJlbGF0aXZlOiBmYWxzZSB9OwogICAgICAgIGlmIChoYXNQcm9wKGNvb3JkaW5hdGUsICJ0b3AiKSB8fCBoYXNQcm9wKGNvb3JkaW5hdGUsICJsZWZ0IikpIHsKICAgICAgICAgIHJlcyA9IF9fYXNzaWduMih7fSwgcmVzLCBjb29yZGluYXRlKTsKICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkzKGNvb3JkaW5hdGUpKSB7CiAgICAgICAgICBpZiAoY29vcmRpbmF0ZS5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgIHJlcy50b3AgPSBjb29yZGluYXRlWzBdOwogICAgICAgICAgICByZXMubGVmdCA9IGNvb3JkaW5hdGVbMV07CiAgICAgICAgICB9IGVsc2UgaWYgKGNvb3JkaW5hdGUubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgIHJlcy50b3AgPSBlbmFibGVWZXJ0aWNhbCA/IGNvb3JkaW5hdGVbMF0gOiAwOwogICAgICAgICAgICByZXMubGVmdCA9ICFlbmFibGVWZXJ0aWNhbCA/IGNvb3JkaW5hdGVbMF0gOiAwOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChpc051bWVyaWMoY29vcmRpbmF0ZSkpIHsKICAgICAgICAgIGlmIChlbmFibGVWZXJ0aWNhbCkgewogICAgICAgICAgICByZXMudG9wID0gY29vcmRpbmF0ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlcy5sZWZ0ID0gY29vcmRpbmF0ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nMihjb29yZGluYXRlKSkgewogICAgICAgICAgdmFyIG02ID0gY29vcmRpbmF0ZS50cmltKCkubWF0Y2gocmVSZWxhdGl2ZVRva2VuKTsKICAgICAgICAgIGlmICghbTYpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgb3AgPSBtNlsxXTsKICAgICAgICAgIHZhciB2YWwgPSBwYXJzZUludChtNlsyXSwgMTApOwogICAgICAgICAgaWYgKG9wID09PSAiKyIpIHsKICAgICAgICAgICAgcmVzLnRvcCA9IGVuYWJsZVZlcnRpY2FsID8gdmFsIDogMDsKICAgICAgICAgICAgcmVzLmxlZnQgPSAhZW5hYmxlVmVydGljYWwgPyB2YWwgOiAwOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzLnRvcCA9IGVuYWJsZVZlcnRpY2FsID8gLXZhbCA6IDA7CiAgICAgICAgICAgIHJlcy5sZWZ0ID0gIWVuYWJsZVZlcnRpY2FsID8gLXZhbCA6IDA7CiAgICAgICAgICB9CiAgICAgICAgICByZXMucmVsYXRpdmUgPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgICAgfTsKICAgICAgdmFyIGRlZmF1bHRPcHRpb25zMiA9IHsKICAgICAgICB0cmlnZ2VyOiAiW2RhdGEtc2Nyb2xsXSIsCiAgICAgICAgaGVhZGVyOiAiW2RhdGEtc2Nyb2xsLWhlYWRlcl0iLAogICAgICAgIGR1cmF0aW9uOiAxZTMsCiAgICAgICAgZWFzaW5nOiAiZWFzZU91dFF1aW50IiwKICAgICAgICBvZmZzZXQ6IDAsCiAgICAgICAgdmVydGljYWw6IHRydWUsCiAgICAgICAgaG9yaXpvbnRhbDogZmFsc2UsCiAgICAgICAgY2FuY2VsbGFibGU6IHRydWUsCiAgICAgICAgdXBkYXRlVVJMOiBmYWxzZSwKICAgICAgICBwcmV2ZW50RGVmYXVsdDogdHJ1ZSwKICAgICAgICBzdG9wUHJvcGFnYXRpb246IHRydWUsCiAgICAgICAgLy8gQ2FsbGJhY2tzCiAgICAgICAgYmVmb3JlOiBudWxsLAogICAgICAgIGFmdGVyOiBudWxsLAogICAgICAgIGNhbmNlbDogbnVsbCwKICAgICAgICBjb21wbGV0ZTogbnVsbCwKICAgICAgICBzdGVwOiBudWxsCiAgICAgIH07CiAgICAgIHZhciBDT05UQUlORVJfQ0xJQ0tfRVZFTlQgPSAiY2xpY2siOwogICAgICB2YXIgQ09OVEFJTkVSX1NUT1BfRVZFTlQgPSAid2hlZWwgdG91Y2hzdGFydCB0b3VjaG1vdmUiOwogICAgICB2YXIgU3dlZXRTY3JvbGwzID0gKAogICAgICAgIC8qKiBAY2xhc3MgKi8KICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICBmdW5jdGlvbiBTd2VldFNjcm9sbDQob3B0aW9ucywgY29udGFpbmVyKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMuJGVsID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5jdHggPSB7CiAgICAgICAgICAgICAgJHRyaWdnZXI6IG51bGwsCiAgICAgICAgICAgICAgb3B0czogbnVsbCwKICAgICAgICAgICAgICBwcm9ncmVzczogZmFsc2UsCiAgICAgICAgICAgICAgcG9zOiBudWxsLAogICAgICAgICAgICAgIHN0YXJ0UG9zOiBudWxsLAogICAgICAgICAgICAgIGVhc2luZzogbnVsbCwKICAgICAgICAgICAgICBzdGFydDogMCwKICAgICAgICAgICAgICBpZDogMCwKICAgICAgICAgICAgICBjYW5jZWw6IGZhbHNlLAogICAgICAgICAgICAgIGhhc2g6IG51bGwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5sb29wID0gZnVuY3Rpb24odGltZSkgewogICAgICAgICAgICAgIHZhciBfYTEyID0gX3RoaXMsICRlbCA9IF9hMTIuJGVsLCBjdHggPSBfYTEyLmN0eDsKICAgICAgICAgICAgICBpZiAoIWN0eC5zdGFydCkgewogICAgICAgICAgICAgICAgY3R4LnN0YXJ0ID0gdGltZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKCFjdHgucHJvZ3Jlc3MgfHwgISRlbCkgewogICAgICAgICAgICAgICAgX3RoaXMuc3RvcCgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB2YXIgb3B0aW9uczIgPSBjdHgub3B0czsKICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gY3R4LnBvczsKICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBjdHguc3RhcnQ7CiAgICAgICAgICAgICAgdmFyIHN0YXJ0T2Zmc2V0ID0gY3R4LnN0YXJ0UG9zOwogICAgICAgICAgICAgIHZhciBlYXNpbmcgPSBjdHguZWFzaW5nOwogICAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9IG9wdGlvbnMyLmR1cmF0aW9uOwogICAgICAgICAgICAgIHZhciBkaXJlY3Rpb25NYXAgPSB7IHRvcDogInkiLCBsZWZ0OiAieCIgfTsKICAgICAgICAgICAgICB2YXIgdGltZUVsYXBzZWQgPSB0aW1lIC0gc3RhcnQ7CiAgICAgICAgICAgICAgdmFyIHQ5ID0gTWF0aC5taW4oMSwgTWF0aC5tYXgodGltZUVsYXBzZWQgLyBkdXJhdGlvbiwgMCkpOwogICAgICAgICAgICAgIE9iamVjdC5rZXlzKG9mZnNldCkuZm9yRWFjaChmdW5jdGlvbihrZXkyKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUyID0gb2Zmc2V0W2tleTJdOwogICAgICAgICAgICAgICAgdmFyIGluaXRpYWwyID0gc3RhcnRPZmZzZXRba2V5Ml07CiAgICAgICAgICAgICAgICB2YXIgZGVsdGEgPSB2YWx1ZTIgLSBpbml0aWFsMjsKICAgICAgICAgICAgICAgIGlmIChkZWx0YSAhPT0gMCkgewogICAgICAgICAgICAgICAgICB2YXIgdmFsID0gZWFzaW5nKHQ5LCBkdXJhdGlvbiAqIHQ5LCAwLCAxLCBkdXJhdGlvbik7CiAgICAgICAgICAgICAgICAgIHNldFNjcm9sbCgkZWwsIE1hdGgucm91bmQoaW5pdGlhbDIgKyBkZWx0YSAqIHZhbCksIGRpcmVjdGlvbk1hcFtrZXkyXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgaWYgKHRpbWVFbGFwc2VkIDw9IGR1cmF0aW9uKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5ob29rKG9wdGlvbnMyLCAic3RlcCIsIHQ5KTsKICAgICAgICAgICAgICAgIGN0eC5pZCA9IFN3ZWV0U2Nyb2xsNC5yYWYoX3RoaXMubG9vcCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIF90aGlzLnN0b3AodHJ1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24oZTExKSB7CiAgICAgICAgICAgICAgdmFyIG9wdHMgPSBfdGhpcy5vcHRzOwogICAgICAgICAgICAgIHZhciAkZWwgPSBlMTEudGFyZ2V0OwogICAgICAgICAgICAgIGZvciAoOyAkZWwgJiYgJGVsICE9PSBkb2N1bWVudDsgJGVsID0gJGVsLnBhcmVudE5vZGUpIHsKICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlcygkZWwsIG9wdHMudHJpZ2dlcikpIHsKICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgZGF0YU9wdGlvbnMgPSBKU09OLnBhcnNlKCRlbC5nZXRBdHRyaWJ1dGUoImRhdGEtc2Nyb2xsLW9wdGlvbnMiKSB8fCAie30iKTsKICAgICAgICAgICAgICAgIHZhciBkYXRhID0gJGVsLmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JvbGwiKTsKICAgICAgICAgICAgICAgIHZhciB0bzIgPSBkYXRhIHx8ICRlbC5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICAgICAgICAgICAgICAgIHZhciBvcHRpb25zMiA9IF9fYXNzaWduMih7fSwgb3B0cywgZGF0YU9wdGlvbnMpOwogICAgICAgICAgICAgICAgdmFyIHByZXZlbnREZWZhdWx0ID0gb3B0aW9uczIucHJldmVudERlZmF1bHQsIHN0b3BQcm9wYWdhdGlvbiA9IG9wdGlvbnMyLnN0b3BQcm9wYWdhdGlvbiwgdmVydGljYWwgPSBvcHRpb25zMi52ZXJ0aWNhbCwgaG9yaXpvbnRhbCA9IG9wdGlvbnMyLmhvcml6b250YWw7CiAgICAgICAgICAgICAgICBpZiAocHJldmVudERlZmF1bHQpIHsKICAgICAgICAgICAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3RvcFByb3BhZ2F0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF90aGlzLmN0eC4kdHJpZ2dlciA9ICRlbDsKICAgICAgICAgICAgICAgIGlmIChob3Jpem9udGFsICYmIHZlcnRpY2FsKSB7CiAgICAgICAgICAgICAgICAgIF90aGlzLnRvKHRvMiwgb3B0aW9uczIpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJ0aWNhbCkgewogICAgICAgICAgICAgICAgICBfdGhpcy50b1RvcCh0bzIsIG9wdGlvbnMyKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaG9yaXpvbnRhbCkgewogICAgICAgICAgICAgICAgICBfdGhpcy50b0xlZnQodG8yLCBvcHRpb25zMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuaGFuZGxlU3RvcCA9IGZ1bmN0aW9uKGUxMSkgewogICAgICAgICAgICAgIHZhciBjdHggPSBfdGhpcy5jdHg7CiAgICAgICAgICAgICAgdmFyIG9wdHMgPSBjdHgub3B0czsKICAgICAgICAgICAgICBpZiAob3B0cyAmJiBvcHRzLmNhbmNlbGxhYmxlKSB7CiAgICAgICAgICAgICAgICBjdHguY2FuY2VsID0gdHJ1ZTsKICAgICAgICAgICAgICAgIF90aGlzLnN0b3AoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLm9wdHMgPSBfX2Fzc2lnbjIoe30sIGRlZmF1bHRPcHRpb25zMiwgb3B0aW9ucyB8fCB7fSk7CiAgICAgICAgICAgIHZhciAkY29udGFpbmVyID0gbnVsbDsKICAgICAgICAgICAgaWYgKGNhblVzZURPTSkgewogICAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGFpbmVyID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgJGNvbnRhaW5lciA9ICQzKGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgJGNvbnRhaW5lciA9IGNvbnRhaW5lcjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGNvbnRhaW5lciA9IHdpbmRvdzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy4kZWwgPSAkY29udGFpbmVyOwogICAgICAgICAgICBpZiAoJGNvbnRhaW5lcikgewogICAgICAgICAgICAgIHRoaXMuYmluZCh0cnVlLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5jcmVhdGUgPSBmdW5jdGlvbihvcHRpb25zLCBjb250YWluZXIpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTd2VldFNjcm9sbDQob3B0aW9ucywgY29udGFpbmVyKTsKICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucHJvdG90eXBlLnRvID0gZnVuY3Rpb24oZGlzdGFuY2UsIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKCFjYW5Vc2VET00pIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIF9hMTIgPSB0aGlzLCAkZWwgPSBfYTEyLiRlbCwgY3R4ID0gX2ExMi5jdHgsIGN1cnJlbnRPcHRpb25zID0gX2ExMi5vcHRzOwogICAgICAgICAgICB2YXIgJHRyaWdnZXIgPSBjdHguJHRyaWdnZXI7CiAgICAgICAgICAgIHZhciBvcHRzID0gX19hc3NpZ24yKHt9LCBjdXJyZW50T3B0aW9ucywgb3B0aW9ucyB8fCB7fSk7CiAgICAgICAgICAgIHZhciBvcHRPZmZzZXQgPSBvcHRzLm9mZnNldCwgdmVydGljYWwgPSBvcHRzLnZlcnRpY2FsLCBob3Jpem9udGFsID0gb3B0cy5ob3Jpem9udGFsOwogICAgICAgICAgICB2YXIgJGhlYWRlciA9IGlzRWxlbWVudChvcHRzLmhlYWRlcikgPyBvcHRzLmhlYWRlciA6ICQzKG9wdHMuaGVhZGVyKTsKICAgICAgICAgICAgdmFyIHJlZyA9IC9eIy87CiAgICAgICAgICAgIHZhciBoYXNoID0gaXNTdHJpbmcyKGRpc3RhbmNlKSAmJiByZWcudGVzdChkaXN0YW5jZSkgPyBkaXN0YW5jZSA6IG51bGw7CiAgICAgICAgICAgIGN0eC5vcHRzID0gb3B0czsKICAgICAgICAgICAgY3R4LmNhbmNlbCA9IGZhbHNlOwogICAgICAgICAgICBjdHguaGFzaCA9IGhhc2g7CiAgICAgICAgICAgIHRoaXMuc3RvcCgpOwogICAgICAgICAgICBpZiAoISRlbCkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgb2Zmc2V0ID0gcGFyc2VDb29yZGluYXRlKG9wdE9mZnNldCwgdmVydGljYWwpOwogICAgICAgICAgICB2YXIgY29vcmRpbmF0ZSA9IHBhcnNlQ29vcmRpbmF0ZShkaXN0YW5jZSwgdmVydGljYWwpOwogICAgICAgICAgICB2YXIgc2Nyb2xsID0geyB0b3A6IDAsIGxlZnQ6IDAgfTsKICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGUpIHsKICAgICAgICAgICAgICBpZiAoY29vcmRpbmF0ZS5yZWxhdGl2ZSkgewogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBnZXRTY3JvbGwoJGVsLCB2ZXJ0aWNhbCA/ICJ5IiA6ICJ4Iik7CiAgICAgICAgICAgICAgICBzY3JvbGwudG9wID0gdmVydGljYWwgPyBjdXJyZW50ICsgY29vcmRpbmF0ZS50b3AgOiBjb29yZGluYXRlLnRvcDsKICAgICAgICAgICAgICAgIHNjcm9sbC5sZWZ0ID0gIXZlcnRpY2FsID8gY3VycmVudCArIGNvb3JkaW5hdGUubGVmdCA6IGNvb3JkaW5hdGUubGVmdDsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2Nyb2xsID0gY29vcmRpbmF0ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcyKGRpc3RhbmNlKSAmJiBkaXN0YW5jZSAhPT0gIiMiKSB7CiAgICAgICAgICAgICAgdmFyICR0YXJnZXQgPSAkMyhkaXN0YW5jZSk7CiAgICAgICAgICAgICAgaWYgKCEkdGFyZ2V0KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHNjcm9sbCA9IGdldE9mZnNldCgkdGFyZ2V0LCAkZWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvZmZzZXQpIHsKICAgICAgICAgICAgICBzY3JvbGwudG9wICs9IG9mZnNldC50b3A7CiAgICAgICAgICAgICAgc2Nyb2xsLmxlZnQgKz0gb2Zmc2V0LmxlZnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRoZWFkZXIpIHsKICAgICAgICAgICAgICBzY3JvbGwudG9wID0gTWF0aC5tYXgoMCwgc2Nyb2xsLnRvcCAtIGdldFNpemUyKCRoZWFkZXIpLmhlaWdodCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIF9iID0gZ2V0Vmlld3BvcnRBbmRFbGVtZW50U2l6ZXMoJGVsKSwgdmlld3BvcnQgPSBfYi52aWV3cG9ydCwgc2l6ZSA9IF9iLnNpemU7CiAgICAgICAgICAgIHNjcm9sbC50b3AgPSB2ZXJ0aWNhbCA/IE1hdGgubWF4KDAsIE1hdGgubWluKHNpemUuaGVpZ2h0IC0gdmlld3BvcnQuaGVpZ2h0LCBzY3JvbGwudG9wKSkgOiBnZXRTY3JvbGwoJGVsLCAieSIpOwogICAgICAgICAgICBzY3JvbGwubGVmdCA9IGhvcml6b250YWwgPyBNYXRoLm1heCgwLCBNYXRoLm1pbihzaXplLndpZHRoIC0gdmlld3BvcnQud2lkdGgsIHNjcm9sbC5sZWZ0KSkgOiBnZXRTY3JvbGwoJGVsLCAieCIpOwogICAgICAgICAgICBpZiAodGhpcy5ob29rKG9wdHMsICJiZWZvcmUiLCBzY3JvbGwsICR0cmlnZ2VyKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICBjdHgub3B0cyA9IG51bGw7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN0eC5wb3MgPSBzY3JvbGw7CiAgICAgICAgICAgIHRoaXMuc3RhcnQob3B0cyk7CiAgICAgICAgICAgIHRoaXMuYmluZChmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS50b1RvcCA9IGZ1bmN0aW9uKGRpc3RhbmNlLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHRoaXMudG8oZGlzdGFuY2UsIF9fYXNzaWduMih7fSwgb3B0aW9ucyB8fCB7fSwgeyB2ZXJ0aWNhbDogdHJ1ZSwgaG9yaXpvbnRhbDogZmFsc2UgfSkpOwogICAgICAgICAgfTsKICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5wcm90b3R5cGUudG9MZWZ0ID0gZnVuY3Rpb24oZGlzdGFuY2UsIG9wdGlvbnMpIHsKICAgICAgICAgICAgdGhpcy50byhkaXN0YW5jZSwgX19hc3NpZ24yKHt9LCBvcHRpb25zIHx8IHt9LCB7IHZlcnRpY2FsOiBmYWxzZSwgaG9yaXpvbnRhbDogdHJ1ZSB9KSk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS50b0VsZW1lbnQgPSBmdW5jdGlvbigkZWxlbWVudCwgb3B0aW9ucykgewogICAgICAgICAgICB2YXIgJGVsID0gdGhpcy4kZWw7CiAgICAgICAgICAgIGlmICghY2FuVXNlRE9NIHx8ICEkZWwpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy50byhnZXRPZmZzZXQoJGVsZW1lbnQsICRlbCksIG9wdGlvbnMgfHwge30pOwogICAgICAgICAgfTsKICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKGdvdG9FbmQpIHsKICAgICAgICAgICAgaWYgKGdvdG9FbmQgPT09IHZvaWQgMCkgewogICAgICAgICAgICAgIGdvdG9FbmQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgX2ExMiA9IHRoaXMsICRlbCA9IF9hMTIuJGVsLCBjdHggPSBfYTEyLmN0eDsKICAgICAgICAgICAgdmFyIHBvcyA9IGN0eC5wb3M7CiAgICAgICAgICAgIGlmICghJGVsIHx8ICFjdHgucHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU3dlZXRTY3JvbGw0LmNhZihjdHguaWQpOwogICAgICAgICAgICBjdHgucHJvZ3Jlc3MgPSBmYWxzZTsKICAgICAgICAgICAgY3R4LnN0YXJ0ID0gMDsKICAgICAgICAgICAgY3R4LmlkID0gMDsKICAgICAgICAgICAgaWYgKGdvdG9FbmQgJiYgcG9zKSB7CiAgICAgICAgICAgICAgc2V0U2Nyb2xsKCRlbCwgcG9zLmxlZnQsICJ4Iik7CiAgICAgICAgICAgICAgc2V0U2Nyb2xsKCRlbCwgcG9zLnRvcCwgInkiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICh0aGlzLiRlbCkgewogICAgICAgICAgICAgIHZhciBvcHRzID0gX19hc3NpZ24yKHt9LCB0aGlzLm9wdHMsIG9wdGlvbnMpOwogICAgICAgICAgICAgIHRoaXMuc3RvcCgpOwogICAgICAgICAgICAgIHRoaXMudW5iaW5kKHRydWUsIHRydWUpOwogICAgICAgICAgICAgIHRoaXMub3B0cyA9IG9wdHM7CiAgICAgICAgICAgICAgdGhpcy5iaW5kKHRydWUsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAodGhpcy4kZWwpIHsKICAgICAgICAgICAgICB0aGlzLnN0b3AoKTsKICAgICAgICAgICAgICB0aGlzLnVuYmluZCh0cnVlLCB0cnVlKTsKICAgICAgICAgICAgICB0aGlzLiRlbCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucHJvdG90eXBlLm9uQmVmb3JlID0gZnVuY3Rpb24oXzQsIF9fKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfTsKICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5wcm90b3R5cGUub25TdGVwID0gZnVuY3Rpb24oXzQpIHsKICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucHJvdG90eXBlLm9uQWZ0ZXIgPSBmdW5jdGlvbihfNCwgX18pIHsKICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucHJvdG90eXBlLm9uQ2FuY2VsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS5vbkNvbXBsZXRlID0gZnVuY3Rpb24oXzQpIHsKICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24ob3B0cykgewogICAgICAgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CiAgICAgICAgICAgIGN0eC5vcHRzID0gb3B0czsKICAgICAgICAgICAgY3R4LnByb2dyZXNzID0gdHJ1ZTsKICAgICAgICAgICAgY3R4LmVhc2luZyA9IGlzRnVuY3Rpb24yKG9wdHMuZWFzaW5nKSA/IG9wdHMuZWFzaW5nIDogZWFzaW5nc1tvcHRzLmVhc2luZ107CiAgICAgICAgICAgIHZhciAkY29udGFpbmVyID0gdGhpcy4kZWw7CiAgICAgICAgICAgIHZhciBzdGFydCA9IHsKICAgICAgICAgICAgICB0b3A6IGdldFNjcm9sbCgkY29udGFpbmVyLCAieSIpLAogICAgICAgICAgICAgIGxlZnQ6IGdldFNjcm9sbCgkY29udGFpbmVyLCAieCIpCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGN0eC5zdGFydFBvcyA9IHN0YXJ0OwogICAgICAgICAgICBjdHguaWQgPSBTd2VldFNjcm9sbDQucmFmKHRoaXMubG9vcCk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgX2ExMiA9IHRoaXMsICRlbCA9IF9hMTIuJGVsLCBjdHggPSBfYTEyLmN0eDsKICAgICAgICAgICAgdmFyIGhhc2ggPSBjdHguaGFzaCwgY2FuY2VsID0gY3R4LmNhbmNlbCwgb3B0cyA9IGN0eC5vcHRzLCBwb3MgPSBjdHgucG9zLCAkdHJpZ2dlciA9IGN0eC4kdHJpZ2dlcjsKICAgICAgICAgICAgaWYgKCEkZWwgfHwgIW9wdHMpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGhhc2ggIT0gbnVsbCAmJiBoYXNoICE9PSB3aW5kb3cubG9jYXRpb24uaGFzaCkgewogICAgICAgICAgICAgIHZhciB1cGRhdGVVUkwgPSBvcHRzLnVwZGF0ZVVSTDsKICAgICAgICAgICAgICBpZiAoY2FuVXNlRE9NICYmIGNhblVzZUhpc3RvcnkgJiYgdXBkYXRlVVJMICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgd2luZG93Lmhpc3RvcnlbdXBkYXRlVVJMID09PSAicmVwbGFjZSIgPyAicmVwbGFjZVN0YXRlIiA6ICJwdXNoU3RhdGUiXShudWxsLCAiIiwgaGFzaCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMudW5iaW5kKGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgY3R4Lm9wdHMgPSBudWxsOwogICAgICAgICAgICBjdHguJHRyaWdnZXIgPSBudWxsOwogICAgICAgICAgICBpZiAoY2FuY2VsKSB7CiAgICAgICAgICAgICAgdGhpcy5ob29rKG9wdHMsICJjYW5jZWwiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLmhvb2sob3B0cywgImFmdGVyIiwgcG9zLCAkdHJpZ2dlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5ob29rKG9wdHMsICJjb21wbGV0ZSIsIGNhbmNlbCk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS5ob29rID0gZnVuY3Rpb24ob3B0aW9ucywgdHlwZTUpIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgICBhcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfYTEyOwogICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBvcHRpb25zW3R5cGU1XTsKICAgICAgICAgICAgdmFyIGNhbGxiYWNrUmVzdWx0OwogICAgICAgICAgICB2YXIgbWV0aG9kUmVzdWx0OwogICAgICAgICAgICBpZiAoaXNGdW5jdGlvbjIoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmdzLmNvbmNhdChbdGhpc10pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBtZXRob2RSZXN1bHQgPSAoX2ExMiA9IHRoaXMpWyJvbiIgKyAodHlwZTVbMF0udG9VcHBlckNhc2UoKSArIHR5cGU1LnNsaWNlKDEpKV0uYXBwbHkoX2ExMiwgYXJncyk7CiAgICAgICAgICAgIHJldHVybiBjYWxsYmFja1Jlc3VsdCAhPT0gdm9pZCAwID8gY2FsbGJhY2tSZXN1bHQgOiBtZXRob2RSZXN1bHQ7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24oY2xpY2ssIHN0b3ApIHsKICAgICAgICAgICAgdmFyIF9hMTIgPSB0aGlzLCAkZWwgPSBfYTEyLiRlbCwgb3B0cyA9IF9hMTIuY3R4Lm9wdHM7CiAgICAgICAgICAgIGlmICgkZWwpIHsKICAgICAgICAgICAgICBpZiAoY2xpY2spIHsKICAgICAgICAgICAgICAgIGFkZEV2ZW50KCRlbCwgQ09OVEFJTkVSX0NMSUNLX0VWRU5ULCB0aGlzLmhhbmRsZUNsaWNrLCBmYWxzZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChzdG9wKSB7CiAgICAgICAgICAgICAgICBhZGRFdmVudCgkZWwsIENPTlRBSU5FUl9TVE9QX0VWRU5ULCB0aGlzLmhhbmRsZVN0b3AsIG9wdHMgPyBvcHRzLmNhbmNlbGxhYmxlIDogdHJ1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS51bmJpbmQgPSBmdW5jdGlvbihjbGljaywgc3RvcCkgewogICAgICAgICAgICB2YXIgX2ExMiA9IHRoaXMsICRlbCA9IF9hMTIuJGVsLCBvcHRzID0gX2ExMi5jdHgub3B0czsKICAgICAgICAgICAgaWYgKCRlbCkgewogICAgICAgICAgICAgIGlmIChjbGljaykgewogICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoJGVsLCBDT05UQUlORVJfQ0xJQ0tfRVZFTlQsIHRoaXMuaGFuZGxlQ2xpY2ssIGZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHN0b3ApIHsKICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50KCRlbCwgQ09OVEFJTkVSX1NUT1BfRVZFTlQsIHRoaXMuaGFuZGxlU3RvcCwgb3B0cyA/IG9wdHMuY2FuY2VsbGFibGUgOiB0cnVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucmFmID0gcmFmOwogICAgICAgICAgU3dlZXRTY3JvbGw0LmNhZiA9IGNhZjsKICAgICAgICAgIHJldHVybiBTd2VldFNjcm9sbDQ7CiAgICAgICAgfSkoKQogICAgICApOwogICAgICByZXR1cm4gU3dlZXRTY3JvbGwzOwogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuMy44L25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMucGx1Z2lucy5qcwp2YXIgaW1wb3J0X3N3ZWV0X3Njcm9sbCwgbGlrOwp2YXIgaW5pdF9kb210b29sc19wbHVnaW5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjMuOC9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLnBsdWdpbnMuanMiKCkgewogICAgaW5pdF9kaXN0X3RzMTYoKTsKICAgIGluaXRfZGlzdF90czE1KCk7CiAgICBpbml0X2Rpc3RfdHMzKCk7CiAgICBpbml0X2Rpc3RfdHMxMigpOwogICAgaW5pdF9kaXN0X3RzMTcoKTsKICAgIGluaXRfZGlzdF90cygpOwogICAgaW5pdF9kaXN0X3RzMTgoKTsKICAgIGluaXRfZGlzdF90czIoKTsKICAgIGluaXRfZGlzdF90czE5KCk7CiAgICBpbml0X2Rpc3RfdHMxMSgpOwogICAgaW5pdF9kaXN0X3RzMjAoKTsKICAgIGluaXRfZGlzdF90czE0KCk7CiAgICBpbml0X2Rpc3RfdHMyNCgpOwogICAgaW5pdF9kaXN0X3RzMTMoKTsKICAgIGluaXRfbGlrX29iamVjdG1hcCgpOwogICAgaW5pdF9saWtfc3RyaW5nbWFwKCk7CiAgICBpbml0X2xpa19mYXN0bWFwKCk7CiAgICBpbml0X2xlbmlzKCk7CiAgICBpbXBvcnRfc3dlZXRfc2Nyb2xsID0gX190b0VTTShyZXF1aXJlX3N3ZWV0X3Njcm9sbCgpLCAxKTsKICAgIGxpayA9IHsKICAgICAgT2JqZWN0TWFwOiBPYmplY3RNYXAyLAogICAgICBTdHJpbmdtYXA6IFN0cmluZ21hcDIsCiAgICAgIEZhc3RNYXA6IEZhc3RNYXAyCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjMuOC9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLmNzcy5icmVha3BvaW50cy5qcwp2YXIgZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMsIHsKICBjc3NGb3JEZXNrdG9wOiAoKSA9PiBjc3NGb3JEZXNrdG9wLAogIGNzc0Zvck5vdGVib29rOiAoKSA9PiBjc3NGb3JOb3RlYm9vaywKICBjc3NGb3JQaGFibGV0OiAoKSA9PiBjc3NGb3JQaGFibGV0LAogIGNzc0ZvclBob25lOiAoKSA9PiBjc3NGb3JQaG9uZSwKICBjc3NGb3JUYWJsZXQ6ICgpID0+IGNzc0ZvclRhYmxldCwKICBkZXNrdG9wOiAoKSA9PiBkZXNrdG9wLAogIG5vdGVib29rOiAoKSA9PiBub3RlYm9vaywKICBwaGFibGV0OiAoKSA9PiBwaGFibGV0LAogIHBob25lOiAoKSA9PiBwaG9uZSwKICB0YWJsZXQ6ICgpID0+IHRhYmxldAp9KTsKdmFyIGRlc2t0b3AsIG5vdGVib29rLCB0YWJsZXQsIHBoYWJsZXQsIHBob25lLCBjc3NGb3JEZXNrdG9wLCBjc3NGb3JOb3RlYm9vaywgY3NzRm9yVGFibGV0LCBjc3NGb3JQaGFibGV0LCBjc3NGb3JQaG9uZTsKdmFyIGluaXRfZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjMuOC9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLmNzcy5icmVha3BvaW50cy5qcyIoKSB7CiAgICBpbml0X2RvbXRvb2xzX2NsYXNzZXNfZG9tdG9vbHMoKTsKICAgIGluaXRfbGl0KCk7CiAgICBkZXNrdG9wID0gMTYwMDsKICAgIG5vdGVib29rID0gMTI0MDsKICAgIHRhYmxldCA9IDEwMjQ7CiAgICBwaGFibGV0ID0gNjAwOwogICAgcGhvbmUgPSA0MDA7CiAgICBjc3NGb3JEZXNrdG9wID0gKGNzc0FyZykgPT4gewogICAgICByZXR1cm4gcihgCiAgICBAY29udGFpbmVyIHdjY1Rvb2xzVmlld3BvcnQgKG1pbi13aWR0aDogJHtkZXNrdG9wfXB4KSB7CiAgICAgICR7Y3NzQXJnLmNzc1RleHR9CiAgICB9CiAgICBAbWVkaWEgKG1pbi13aWR0aDogJHtkZXNrdG9wfXB4KSB7CiAgICAgICR7Y3NzQXJnLmNzc1RleHR9CiAgICB9CiAgYCk7CiAgICB9OwogICAgY3NzRm9yTm90ZWJvb2sgPSAoY3NzQXJnKSA9PiB7CiAgICAgIHJldHVybiByKGAKICAgIEBjb250YWluZXIgd2NjVG9vbHNWaWV3cG9ydCAobWF4LXdpZHRoOiAke25vdGVib29rfXB4KSB7CiAgICAgICR7Y3NzQXJnLmNzc1RleHR9CiAgICB9CiAgICBAbWVkaWEgKG1heC13aWR0aDogJHtub3RlYm9va31weCkgewogICAgICAke2Nzc0FyZy5jc3NUZXh0fQogICAgfQogIGApOwogICAgfTsKICAgIGNzc0ZvclRhYmxldCA9IChjc3NBcmcpID0+IHsKICAgICAgcmV0dXJuIHIoYAogICAgQGNvbnRhaW5lciB3Y2NUb29sc1ZpZXdwb3J0IChtYXgtd2lkdGg6ICR7dGFibGV0fXB4KSB7CiAgICAgICR7Y3NzQXJnLmNzc1RleHR9CiAgICB9CiAgICBAbWVkaWEgKG1heC13aWR0aDogJHt0YWJsZXR9cHgpIHsKICAgICAgJHtjc3NBcmcuY3NzVGV4dH0KICAgIH0KICBgKTsKICAgIH07CiAgICBjc3NGb3JQaGFibGV0ID0gKGNzc0FyZykgPT4gewogICAgICByZXR1cm4gcihgCiAgICBAY29udGFpbmVyIHdjY1Rvb2xzVmlld3BvcnQgKG1heC13aWR0aDogJHtwaGFibGV0fXB4KSB7CiAgICAgICR7Y3NzQXJnLmNzc1RleHR9CiAgICB9CiAgICBAbWVkaWEgKG1heC13aWR0aDogJHtwaGFibGV0fXB4KSB7CiAgICAgICR7Y3NzQXJnLmNzc1RleHR9CiAgICB9CiAgYCk7CiAgICB9OwogICAgY3NzRm9yUGhvbmUgPSAoY3NzQXJnKSA9PiB7CiAgICAgIHJldHVybiByKGAKICAgIEBjb250YWluZXIgd2NjVG9vbHNWaWV3cG9ydCAobWF4LXdpZHRoOiAke3Bob25lfXB4KSB7CiAgICAgICR7Y3NzQXJnLmNzc1RleHR9CiAgICB9CiAgICBAbWVkaWEgKG1heC13aWR0aDogJHtwaG9uZX1weCkgewogICAgICAke2Nzc0FyZy5jc3NUZXh0fQogICAgfQogIGApOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi4zLjgvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5jbGFzc2VzLnNjcm9sbGVyLmpzCnZhciBTY3JvbGxlcjsKdmFyIGluaXRfZG9tdG9vbHNfY2xhc3Nlc19zY3JvbGxlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi4zLjgvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5jbGFzc2VzLnNjcm9sbGVyLmpzIigpIHsKICAgIGluaXRfZG9tdG9vbHNfcGx1Z2lucygpOwogICAgU2Nyb2xsZXIgPSBjbGFzcyB7CiAgICAgIGRvbXRvb2xzSW5zdGFuY2U7CiAgICAgIC8vIEFycmF5IHRvIHN0b3JlIHNjcm9sbCBjYWxsYmFjayBmdW5jdGlvbnMuCiAgICAgIHNjcm9sbENhbGxiYWNrcyA9IFtdOwogICAgICAvLyBMZW5pcyBpbnN0YW5jZSAoaWYgYWN0aXZhdGVkKSBvciBudWxsLgogICAgICBsZW5pc0luc3RhbmNlID0gbnVsbDsKICAgICAgLy8gQm91bmQgaGFuZGxlcnMgdG8gYWxsb3cgcmVtb3ZhbCBmcm9tIGV2ZW50IGxpc3RlbmVycy4KICAgICAgaGFuZGxlTmF0aXZlU2Nyb2xsID0gKGV2ZW50KSA9PiB7CiAgICAgICAgdGhpcy5leGVjdXRlU2Nyb2xsQ2FsbGJhY2tzKCk7CiAgICAgIH07CiAgICAgIGhhbmRsZUxlbmlzU2Nyb2xsID0gKGluZm8pID0+IHsKICAgICAgICB0aGlzLmV4ZWN1dGVTY3JvbGxDYWxsYmFja3MoKTsKICAgICAgfTsKICAgICAgY29uc3RydWN0b3IoZG9tdG9vbHNJbnN0YW5jZUFyZykgewogICAgICAgIHRoaXMuZG9tdG9vbHNJbnN0YW5jZSA9IGRvbXRvb2xzSW5zdGFuY2VBcmc7CiAgICAgICAgdGhpcy5hdHRhY2hOYXRpdmVTY3JvbGxMaXN0ZW5lcigpOwogICAgICB9CiAgICAgIHN3ZWV0U2Nyb2xsZXIgPSBuZXcgaW1wb3J0X3N3ZWV0X3Njcm9sbC5kZWZhdWx0KHt9KTsKICAgICAgLyoqCiAgICAgICAqIFNjcm9sbHMgdG8gYSBnaXZlbiBlbGVtZW50IHdpdGggb3B0aW9ucy4KICAgICAgICovCiAgICAgIGFzeW5jIHRvRWxlbWVudChlbGVtZW50QXJnLCBvcHRpb25zQXJnKSB7CiAgICAgICAgdGhpcy5zd2VldFNjcm9sbGVyLnRvRWxlbWVudChlbGVtZW50QXJnLCBvcHRpb25zQXJnKTsKICAgICAgICBhd2FpdCBkaXN0X3RzX2V4cG9ydHMzLmRlbGF5Rm9yKG9wdGlvbnNBcmcuZHVyYXRpb24pOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBEZXRlY3RzIHdoZXRoZXIgbmF0aXZlIHNtb290aCBzY3JvbGxpbmcgaXMgZW5hYmxlZC4KICAgICAgICovCiAgICAgIGFzeW5jIGRldGVjdE5hdGl2ZVNtb290aFNjcm9sbCgpIHsKICAgICAgICBjb25zdCBkb25lID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICAgICAgY29uc3Qgc2FtcGxlU2l6ZSA9IDEwMDsKICAgICAgICBjb25zdCBhY2NlcHRhYmxlRGVsdGFEaWZmZXJlbmNlID0gMzsKICAgICAgICBjb25zdCBtaW5pbXVtU21vb3RoUmF0aW8gPSAwLjc1OwogICAgICAgIGNvbnN0IGV2ZW50RGVsdGFzID0gW107CiAgICAgICAgZnVuY3Rpb24gb25XaGVlbChldmVudCkgewogICAgICAgICAgZXZlbnREZWx0YXMucHVzaChldmVudC5kZWx0YVkpOwogICAgICAgICAgaWYgKGV2ZW50RGVsdGFzLmxlbmd0aCA+PSBzYW1wbGVTaXplKSB7CiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ3aGVlbCIsIG9uV2hlZWwpOwogICAgICAgICAgICBhbmFseXplRXZlbnRzKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGFuYWx5emVFdmVudHMoKSB7CiAgICAgICAgICBjb25zdCB0b3RhbERpZmZzID0gZXZlbnREZWx0YXMubGVuZ3RoIC0gMTsKICAgICAgICAgIGxldCBzbWFsbERpZmZDb3VudCA9IDA7CiAgICAgICAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCB0b3RhbERpZmZzOyBpMTErKykgewogICAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5hYnMoZXZlbnREZWx0YXNbaTExICsgMV0gLSBldmVudERlbHRhc1tpMTFdKTsKICAgICAgICAgICAgaWYgKGRpZmYgPD0gYWNjZXB0YWJsZURlbHRhRGlmZmVyZW5jZSkgewogICAgICAgICAgICAgIHNtYWxsRGlmZkNvdW50Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHNtb290aFJhdGlvID0gc21hbGxEaWZmQ291bnQgLyB0b3RhbERpZmZzOwogICAgICAgICAgaWYgKHNtb290aFJhdGlvID49IG1pbmltdW1TbW9vdGhSYXRpbykgewogICAgICAgICAgICBjb25zb2xlLmxvZygiU21vb3RoIHNjcm9sbGluZyBkZXRlY3RlZC4iKTsKICAgICAgICAgICAgZG9uZS5yZXNvbHZlKHRydWUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coIlNtb290aCBzY3JvbGxpbmcgTk9UIGRldGVjdGVkLiIpOwogICAgICAgICAgICBkb25lLnJlc29sdmUoZmFsc2UpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLCBvbldoZWVsKTsKICAgICAgICByZXR1cm4gZG9uZS5wcm9taXNlOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBFbmFibGVzIExlbmlzIHNjcm9sbGluZy4KICAgICAgICogSWYgb3B0aW9uc0FyZy5kaXNhYmxlT25OYXRpdmVTbW9vdGhTY3JvbGwgaXMgdHJ1ZSBhbmQgbmF0aXZlIHNtb290aCBzY3JvbGxpbmcgaXMgZGV0ZWN0ZWQsCiAgICAgICAqIExlbmlzIHdpbGwgYmUgZGVzdHJveWVkIGltbWVkaWF0ZWx5LgogICAgICAgKi8KICAgICAgYXN5bmMgZW5hYmxlTGVuaXNTY3JvbGwob3B0aW9uc0FyZykgewogICAgICAgIGNvbnN0IGxlbmlzID0gbmV3IExlbmlzKHsKICAgICAgICAgIGF1dG9SYWY6IHRydWUKICAgICAgICB9KTsKICAgICAgICBpZiAob3B0aW9uc0FyZz8uZGlzYWJsZU9uTmF0aXZlU21vb3RoU2Nyb2xsKSB7CiAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5kZXRlY3ROYXRpdmVTbW9vdGhTY3JvbGwoKSkgewogICAgICAgICAgICBsZW5pcy5kZXN0cm95KCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5sZW5pc0luc3RhbmNlID0gbGVuaXM7CiAgICAgICAgdGhpcy5kZXRhY2hOYXRpdmVTY3JvbGxMaXN0ZW5lcigpOwogICAgICAgIHRoaXMuYXR0YWNoTGVuaXNTY3JvbGxMaXN0ZW5lcigpOwogICAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGxlbmlzLmRlc3Ryb3kuYmluZChsZW5pcyk7CiAgICAgICAgbGVuaXMuZGVzdHJveSA9ICgpID0+IHsKICAgICAgICAgIG9yaWdpbmFsRGVzdHJveSgpOwogICAgICAgICAgdGhpcy5kZXRhY2hMZW5pc1Njcm9sbExpc3RlbmVyKCk7CiAgICAgICAgICB0aGlzLmF0dGFjaE5hdGl2ZVNjcm9sbExpc3RlbmVyKCk7CiAgICAgICAgICB0aGlzLmxlbmlzSW5zdGFuY2UgPSBudWxsOwogICAgICAgIH07CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIGV4ZWN1dGVkIG9uIHNjcm9sbC4KICAgICAgICogQHBhcmFtIGNhbGxiYWNrIEEgZnVuY3Rpb24gdG8gZXhlY3V0ZSBvbiBlYWNoIHNjcm9sbCBldmVudC4KICAgICAgICovCiAgICAgIG9uU2Nyb2xsKGNhbGxiYWNrKSB7CiAgICAgICAgdGhpcy5zY3JvbGxDYWxsYmFja3MucHVzaChjYWxsYmFjayk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEV4ZWN1dGVzIGFsbCByZWdpc3RlcmVkIHNjcm9sbCBjYWxsYmFja3MgY29uY3VycmVudGx5LgogICAgICAgKi8KICAgICAgZXhlY3V0ZVNjcm9sbENhbGxiYWNrcygpIHsKICAgICAgICB0aGlzLnNjcm9sbENhbGxiYWNrcy5mb3JFYWNoKChjYWxsYmFjaykgPT4gewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGluIHNjcm9sbCBjYWxsYmFjazoiLCBlcnJvcik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEF0dGFjaGVzIHRoZSBuYXRpdmUgc2Nyb2xsIGV2ZW50IGxpc3RlbmVyLgogICAgICAgKi8KICAgICAgYXR0YWNoTmF0aXZlU2Nyb2xsTGlzdGVuZXIoKSB7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIHRoaXMuaGFuZGxlTmF0aXZlU2Nyb2xsKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogRGV0YWNoZXMgdGhlIG5hdGl2ZSBzY3JvbGwgZXZlbnQgbGlzdGVuZXIuCiAgICAgICAqLwogICAgICBkZXRhY2hOYXRpdmVTY3JvbGxMaXN0ZW5lcigpIHsKICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgdGhpcy5oYW5kbGVOYXRpdmVTY3JvbGwpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBBdHRhY2hlcyB0aGUgTGVuaXMgc2Nyb2xsIGV2ZW50IGxpc3RlbmVyLgogICAgICAgKi8KICAgICAgYXR0YWNoTGVuaXNTY3JvbGxMaXN0ZW5lcigpIHsKICAgICAgICBpZiAodGhpcy5sZW5pc0luc3RhbmNlKSB7CiAgICAgICAgICB0aGlzLmxlbmlzSW5zdGFuY2Uub24oInNjcm9sbCIsIHRoaXMuaGFuZGxlTGVuaXNTY3JvbGwpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogRGV0YWNoZXMgdGhlIExlbmlzIHNjcm9sbCBldmVudCBsaXN0ZW5lci4KICAgICAgICovCiAgICAgIGRldGFjaExlbmlzU2Nyb2xsTGlzdGVuZXIoKSB7CiAgICAgICAgaWYgKHRoaXMubGVuaXNJbnN0YW5jZSkgewogICAgICAgICAgdGhpcy5sZW5pc0luc3RhbmNlLm9mZigic2Nyb2xsIiwgdGhpcy5oYW5kbGVMZW5pc1Njcm9sbCk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjMuOC9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLmNsYXNzZXMudGhlbWVtYW5hZ2VyLmpzCnZhciBUaGVtZU1hbmFnZXI7CnZhciBpbml0X2RvbXRvb2xzX2NsYXNzZXNfdGhlbWVtYW5hZ2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjMuOC9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLmNsYXNzZXMudGhlbWVtYW5hZ2VyLmpzIigpIHsKICAgIGluaXRfZG9tdG9vbHNfY2xhc3Nlc19kb210b29scygpOwogICAgaW5pdF9kb210b29sc19wbHVnaW5zKCk7CiAgICBUaGVtZU1hbmFnZXIgPSBjbGFzcyB7CiAgICAgIGRvbXRvb2xzUmVmOwogICAgICBnb0JyaWdodEJvb2xlYW4gPSBmYWxzZTsKICAgICAgcHJlZmVycmVkQ29sb3JTY2hlbWVNZWRpYU1hdGNoID0gd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIik7CiAgICAgIHRoZW1lT2JzZXJ2YWJsZSA9IG5ldyBkaXN0X3RzX2V4cG9ydHMyLnJ4anMuUmVwbGF5U3ViamVjdCgxKTsKICAgICAgY29uc3RydWN0b3IoZG9tdG9vbHNSZWZBcmcpIHsKICAgICAgICB0aGlzLmRvbXRvb2xzUmVmID0gZG9tdG9vbHNSZWZBcmc7CiAgICAgICAgdGhpcy5nb0JyaWdodEJvb2xlYW4gPSB0aGlzLnByZWZlcnJlZENvbG9yU2NoZW1lTWVkaWFNYXRjaC5tYXRjaGVzOwogICAgICAgIHRoaXMucHJlZmVycmVkQ29sb3JTY2hlbWVNZWRpYU1hdGNoLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIChldmVudEFyZykgPT4gewogICAgICAgICAgdGhpcy5nb0JyaWdodEJvb2xlYW4gPSBldmVudEFyZy5tYXRjaGVzOwogICAgICAgICAgdGhpcy51cGRhdGVBbGxDb25uZWN0ZWRFbGVtZW50cygpOwogICAgICAgIH0pOwogICAgICAgIHRoaXMudXBkYXRlQWxsQ29ubmVjdGVkRWxlbWVudHMoKTsKICAgICAgfQogICAgICBhc3luYyBlbmFibGVBdXRvbWF0aWNHbG9iYWxUaGVtZUNoYW5nZSgpIHsKICAgICAgICBpZiAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LnN0eWxlKSB7CiAgICAgICAgICB0aGlzLnRoZW1lT2JzZXJ2YWJsZS5zdWJzY3JpYmUoewogICAgICAgICAgICBuZXh0OiAoZ29CcmlnaHQpID0+IHsKICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmQgPSBnb0JyaWdodCA/ICIjZmZmIiA6ICIjMDAwIjsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIHVwZGF0ZUFsbENvbm5lY3RlZEVsZW1lbnRzKCkgewogICAgICAgIHRoaXMudGhlbWVPYnNlcnZhYmxlLm5leHQodGhpcy5nb0JyaWdodEJvb2xlYW4pOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBzZXQgdGhlIHRoZW1lIG9mIHRoZSB3ZWJzaXRlIHRvIGJyaWdodAogICAgICAgKi8KICAgICAgZ29CcmlnaHQoKSB7CiAgICAgICAgdGhpcy5nb0JyaWdodEJvb2xlYW4gPSB0cnVlOwogICAgICAgIHRoaXMudXBkYXRlQWxsQ29ubmVjdGVkRWxlbWVudHMoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogc2V0IHRoZSB0aGVtZSBvZiB0aGUgd2Vic2l0ZSB0byBkYXJrCiAgICAgICAqLwogICAgICBnb0RhcmsoKSB7CiAgICAgICAgdGhpcy5nb0JyaWdodEJvb2xlYW4gPSBmYWxzZTsKICAgICAgICB0aGlzLnVwZGF0ZUFsbENvbm5lY3RlZEVsZW1lbnRzKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHNpbXBseSB0b2dnbGUgYmV0d2VlbiBicmlnaHQgYW5kIGRhcmsKICAgICAgICovCiAgICAgIHRvZ2dsZURhcmtCcmlnaHQoKSB7CiAgICAgICAgdGhpcy5nb0JyaWdodEJvb2xlYW4gPSAhdGhpcy5nb0JyaWdodEJvb2xlYW47CiAgICAgICAgdGhpcy51cGRhdGVBbGxDb25uZWN0ZWRFbGVtZW50cygpOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjMuOC9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLmNsYXNzZXMua2V5Ym9hcmQuanMKdmFyIEtleSwgS2V5Ym9hcmQ7CnZhciBpbml0X2RvbXRvb2xzX2NsYXNzZXNfa2V5Ym9hcmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuMy44L25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuY2xhc3Nlcy5rZXlib2FyZC5qcyIoKSB7CiAgICBpbml0X2RvbXRvb2xzX3BsdWdpbnMoKTsKICAgIChmdW5jdGlvbihLZXkyKSB7CiAgICAgIEtleTJbS2V5MlsiQmFja3NwYWNlIl0gPSA4XSA9ICJCYWNrc3BhY2UiOwogICAgICBLZXkyW0tleTJbIlRhYiJdID0gOV0gPSAiVGFiIjsKICAgICAgS2V5MltLZXkyWyJFbnRlciJdID0gMTNdID0gIkVudGVyIjsKICAgICAgS2V5MltLZXkyWyJTaGlmdCJdID0gMTZdID0gIlNoaWZ0IjsKICAgICAgS2V5MltLZXkyWyJDdHJsIl0gPSAxN10gPSAiQ3RybCI7CiAgICAgIEtleTJbS2V5MlsiQWx0Il0gPSAxOF0gPSAiQWx0IjsKICAgICAgS2V5MltLZXkyWyJQYXVzZUJyZWFrIl0gPSAxOV0gPSAiUGF1c2VCcmVhayI7CiAgICAgIEtleTJbS2V5MlsiQ2Fwc0xvY2siXSA9IDIwXSA9ICJDYXBzTG9jayI7CiAgICAgIEtleTJbS2V5MlsiRXNjYXBlIl0gPSAyN10gPSAiRXNjYXBlIjsKICAgICAgS2V5MltLZXkyWyJTcGFjZSJdID0gMzJdID0gIlNwYWNlIjsKICAgICAgS2V5MltLZXkyWyJQYWdlVXAiXSA9IDMzXSA9ICJQYWdlVXAiOwogICAgICBLZXkyW0tleTJbIlBhZ2VEb3duIl0gPSAzNF0gPSAiUGFnZURvd24iOwogICAgICBLZXkyW0tleTJbIkVuZCJdID0gMzVdID0gIkVuZCI7CiAgICAgIEtleTJbS2V5MlsiSG9tZSJdID0gMzZdID0gIkhvbWUiOwogICAgICBLZXkyW0tleTJbIkxlZnRBcnJvdyJdID0gMzddID0gIkxlZnRBcnJvdyI7CiAgICAgIEtleTJbS2V5MlsiVXBBcnJvdyJdID0gMzhdID0gIlVwQXJyb3ciOwogICAgICBLZXkyW0tleTJbIlJpZ2h0QXJyb3ciXSA9IDM5XSA9ICJSaWdodEFycm93IjsKICAgICAgS2V5MltLZXkyWyJEb3duQXJyb3ciXSA9IDQwXSA9ICJEb3duQXJyb3ciOwogICAgICBLZXkyW0tleTJbIkluc2VydCJdID0gNDVdID0gIkluc2VydCI7CiAgICAgIEtleTJbS2V5MlsiRGVsZXRlIl0gPSA0Nl0gPSAiRGVsZXRlIjsKICAgICAgS2V5MltLZXkyWyJaZXJvIl0gPSA0OF0gPSAiWmVybyI7CiAgICAgIEtleTJbS2V5MlsiQ2xvc2VkUGFyZW4iXSA9IDQ4XSA9ICJDbG9zZWRQYXJlbiI7CiAgICAgIEtleTJbS2V5MlsiT25lIl0gPSA0OV0gPSAiT25lIjsKICAgICAgS2V5MltLZXkyWyJFeGNsYW1hdGlvbk1hcmsiXSA9IDQ5XSA9ICJFeGNsYW1hdGlvbk1hcmsiOwogICAgICBLZXkyW0tleTJbIlR3byJdID0gNTBdID0gIlR3byI7CiAgICAgIEtleTJbS2V5MlsiQXRTaWduIl0gPSA1MF0gPSAiQXRTaWduIjsKICAgICAgS2V5MltLZXkyWyJUaHJlZSJdID0gNTFdID0gIlRocmVlIjsKICAgICAgS2V5MltLZXkyWyJQb3VuZFNpZ24iXSA9IDUxXSA9ICJQb3VuZFNpZ24iOwogICAgICBLZXkyW0tleTJbIkhhc2giXSA9IDUxXSA9ICJIYXNoIjsKICAgICAgS2V5MltLZXkyWyJGb3VyIl0gPSA1Ml0gPSAiRm91ciI7CiAgICAgIEtleTJbS2V5MlsiRG9sbGFyU2lnbiJdID0gNTJdID0gIkRvbGxhclNpZ24iOwogICAgICBLZXkyW0tleTJbIkZpdmUiXSA9IDUzXSA9ICJGaXZlIjsKICAgICAgS2V5MltLZXkyWyJQZXJjZW50U2lnbiJdID0gNTNdID0gIlBlcmNlbnRTaWduIjsKICAgICAgS2V5MltLZXkyWyJTaXgiXSA9IDU0XSA9ICJTaXgiOwogICAgICBLZXkyW0tleTJbIkNhcmV0Il0gPSA1NF0gPSAiQ2FyZXQiOwogICAgICBLZXkyW0tleTJbIkhhdCJdID0gNTRdID0gIkhhdCI7CiAgICAgIEtleTJbS2V5MlsiU2V2ZW4iXSA9IDU1XSA9ICJTZXZlbiI7CiAgICAgIEtleTJbS2V5MlsiQW1wZXJzYW5kIl0gPSA1NV0gPSAiQW1wZXJzYW5kIjsKICAgICAgS2V5MltLZXkyWyJFaWdodCJdID0gNTZdID0gIkVpZ2h0IjsKICAgICAgS2V5MltLZXkyWyJTdGFyIl0gPSA1Nl0gPSAiU3RhciI7CiAgICAgIEtleTJbS2V5MlsiQXN0ZXJpayJdID0gNTZdID0gIkFzdGVyaWsiOwogICAgICBLZXkyW0tleTJbIk5pbmUiXSA9IDU3XSA9ICJOaW5lIjsKICAgICAgS2V5MltLZXkyWyJPcGVuUGFyZW4iXSA9IDU3XSA9ICJPcGVuUGFyZW4iOwogICAgICBLZXkyW0tleTJbIkEiXSA9IDY1XSA9ICJBIjsKICAgICAgS2V5MltLZXkyWyJCIl0gPSA2Nl0gPSAiQiI7CiAgICAgIEtleTJbS2V5MlsiQyJdID0gNjddID0gIkMiOwogICAgICBLZXkyW0tleTJbIkQiXSA9IDY4XSA9ICJEIjsKICAgICAgS2V5MltLZXkyWyJFIl0gPSA2OV0gPSAiRSI7CiAgICAgIEtleTJbS2V5MlsiRiJdID0gNzBdID0gIkYiOwogICAgICBLZXkyW0tleTJbIkciXSA9IDcxXSA9ICJHIjsKICAgICAgS2V5MltLZXkyWyJIIl0gPSA3Ml0gPSAiSCI7CiAgICAgIEtleTJbS2V5MlsiSSJdID0gNzNdID0gIkkiOwogICAgICBLZXkyW0tleTJbIkoiXSA9IDc0XSA9ICJKIjsKICAgICAgS2V5MltLZXkyWyJLIl0gPSA3NV0gPSAiSyI7CiAgICAgIEtleTJbS2V5MlsiTCJdID0gNzZdID0gIkwiOwogICAgICBLZXkyW0tleTJbIk0iXSA9IDc3XSA9ICJNIjsKICAgICAgS2V5MltLZXkyWyJOIl0gPSA3OF0gPSAiTiI7CiAgICAgIEtleTJbS2V5MlsiTyJdID0gNzldID0gIk8iOwogICAgICBLZXkyW0tleTJbIlAiXSA9IDgwXSA9ICJQIjsKICAgICAgS2V5MltLZXkyWyJRIl0gPSA4MV0gPSAiUSI7CiAgICAgIEtleTJbS2V5MlsiUiJdID0gODJdID0gIlIiOwogICAgICBLZXkyW0tleTJbIlMiXSA9IDgzXSA9ICJTIjsKICAgICAgS2V5MltLZXkyWyJUIl0gPSA4NF0gPSAiVCI7CiAgICAgIEtleTJbS2V5MlsiVSJdID0gODVdID0gIlUiOwogICAgICBLZXkyW0tleTJbIlYiXSA9IDg2XSA9ICJWIjsKICAgICAgS2V5MltLZXkyWyJXIl0gPSA4N10gPSAiVyI7CiAgICAgIEtleTJbS2V5MlsiWCJdID0gODhdID0gIlgiOwogICAgICBLZXkyW0tleTJbIlkiXSA9IDg5XSA9ICJZIjsKICAgICAgS2V5MltLZXkyWyJaIl0gPSA5MF0gPSAiWiI7CiAgICAgIEtleTJbS2V5MlsiTGVmdFdpbmRvd0tleSJdID0gOTFdID0gIkxlZnRXaW5kb3dLZXkiOwogICAgICBLZXkyW0tleTJbIlJpZ2h0V2luZG93S2V5Il0gPSA5Ml0gPSAiUmlnaHRXaW5kb3dLZXkiOwogICAgICBLZXkyW0tleTJbIlNlbGVjdEtleSJdID0gOTNdID0gIlNlbGVjdEtleSI7CiAgICAgIEtleTJbS2V5MlsiTnVtcGFkMCJdID0gOTZdID0gIk51bXBhZDAiOwogICAgICBLZXkyW0tleTJbIk51bXBhZDEiXSA9IDk3XSA9ICJOdW1wYWQxIjsKICAgICAgS2V5MltLZXkyWyJOdW1wYWQyIl0gPSA5OF0gPSAiTnVtcGFkMiI7CiAgICAgIEtleTJbS2V5MlsiTnVtcGFkMyJdID0gOTldID0gIk51bXBhZDMiOwogICAgICBLZXkyW0tleTJbIk51bXBhZDQiXSA9IDEwMF0gPSAiTnVtcGFkNCI7CiAgICAgIEtleTJbS2V5MlsiTnVtcGFkNSJdID0gMTAxXSA9ICJOdW1wYWQ1IjsKICAgICAgS2V5MltLZXkyWyJOdW1wYWQ2Il0gPSAxMDJdID0gIk51bXBhZDYiOwogICAgICBLZXkyW0tleTJbIk51bXBhZDciXSA9IDEwM10gPSAiTnVtcGFkNyI7CiAgICAgIEtleTJbS2V5MlsiTnVtcGFkOCJdID0gMTA0XSA9ICJOdW1wYWQ4IjsKICAgICAgS2V5MltLZXkyWyJOdW1wYWQ5Il0gPSAxMDVdID0gIk51bXBhZDkiOwogICAgICBLZXkyW0tleTJbIk11bHRpcGx5Il0gPSAxMDZdID0gIk11bHRpcGx5IjsKICAgICAgS2V5MltLZXkyWyJBZGQiXSA9IDEwN10gPSAiQWRkIjsKICAgICAgS2V5MltLZXkyWyJTdWJ0cmFjdCJdID0gMTA5XSA9ICJTdWJ0cmFjdCI7CiAgICAgIEtleTJbS2V5MlsiRGVjaW1hbFBvaW50Il0gPSAxMTBdID0gIkRlY2ltYWxQb2ludCI7CiAgICAgIEtleTJbS2V5MlsiRGl2aWRlIl0gPSAxMTFdID0gIkRpdmlkZSI7CiAgICAgIEtleTJbS2V5MlsiRjEiXSA9IDExMl0gPSAiRjEiOwogICAgICBLZXkyW0tleTJbIkYyIl0gPSAxMTNdID0gIkYyIjsKICAgICAgS2V5MltLZXkyWyJGMyJdID0gMTE0XSA9ICJGMyI7CiAgICAgIEtleTJbS2V5MlsiRjQiXSA9IDExNV0gPSAiRjQiOwogICAgICBLZXkyW0tleTJbIkY1Il0gPSAxMTZdID0gIkY1IjsKICAgICAgS2V5MltLZXkyWyJGNiJdID0gMTE3XSA9ICJGNiI7CiAgICAgIEtleTJbS2V5MlsiRjciXSA9IDExOF0gPSAiRjciOwogICAgICBLZXkyW0tleTJbIkY4Il0gPSAxMTldID0gIkY4IjsKICAgICAgS2V5MltLZXkyWyJGOSJdID0gMTIwXSA9ICJGOSI7CiAgICAgIEtleTJbS2V5MlsiRjEwIl0gPSAxMjFdID0gIkYxMCI7CiAgICAgIEtleTJbS2V5MlsiRjExIl0gPSAxMjJdID0gIkYxMSI7CiAgICAgIEtleTJbS2V5MlsiRjEyIl0gPSAxMjNdID0gIkYxMiI7CiAgICAgIEtleTJbS2V5MlsiTnVtTG9jayJdID0gMTQ0XSA9ICJOdW1Mb2NrIjsKICAgICAgS2V5MltLZXkyWyJTY3JvbGxMb2NrIl0gPSAxNDVdID0gIlNjcm9sbExvY2siOwogICAgICBLZXkyW0tleTJbIlNlbWlDb2xvbiJdID0gMTg2XSA9ICJTZW1pQ29sb24iOwogICAgICBLZXkyW0tleTJbIkVxdWFscyJdID0gMTg3XSA9ICJFcXVhbHMiOwogICAgICBLZXkyW0tleTJbIkNvbW1hIl0gPSAxODhdID0gIkNvbW1hIjsKICAgICAgS2V5MltLZXkyWyJEYXNoIl0gPSAxODldID0gIkRhc2giOwogICAgICBLZXkyW0tleTJbIlBlcmlvZCJdID0gMTkwXSA9ICJQZXJpb2QiOwogICAgICBLZXkyW0tleTJbIlVuZGVyU2NvcmUiXSA9IDE4OV0gPSAiVW5kZXJTY29yZSI7CiAgICAgIEtleTJbS2V5MlsiUGx1c1NpZ24iXSA9IDE4N10gPSAiUGx1c1NpZ24iOwogICAgICBLZXkyW0tleTJbIkZvcndhcmRTbGFzaCJdID0gMTkxXSA9ICJGb3J3YXJkU2xhc2giOwogICAgICBLZXkyW0tleTJbIlRpbGRlIl0gPSAxOTJdID0gIlRpbGRlIjsKICAgICAgS2V5MltLZXkyWyJHcmF2ZUFjY2VudCJdID0gMTkyXSA9ICJHcmF2ZUFjY2VudCI7CiAgICAgIEtleTJbS2V5MlsiT3BlbkJyYWNrZXQiXSA9IDIxOV0gPSAiT3BlbkJyYWNrZXQiOwogICAgICBLZXkyW0tleTJbIkNsb3NlZEJyYWNrZXQiXSA9IDIyMV0gPSAiQ2xvc2VkQnJhY2tldCI7CiAgICAgIEtleTJbS2V5MlsiUXVvdGUiXSA9IDIyMl0gPSAiUXVvdGUiOwogICAgfSkoS2V5IHx8IChLZXkgPSB7fSkpOwogICAgS2V5Ym9hcmQgPSBjbGFzcyB7CiAgICAgIGRvbU5vZGU7CiAgICAgIG1hcENvbWJvc1RvSGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICBwcmVzc2VkS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICAgIGNvbnN0cnVjdG9yKGRvbU5vZGUpIHsKICAgICAgICB0aGlzLmRvbU5vZGUgPSBkb21Ob2RlOwogICAgICAgIHRoaXMuc3RhcnRMaXN0ZW5pbmcoKTsKICAgICAgfQogICAgICBrZXlFbnVtID0gS2V5OwogICAgICBvbihrZXlzMikgewogICAgICAgIGNvbnN0IHN1YmplY3QgPSBuZXcgZGlzdF90c19leHBvcnRzMi5yeGpzLlN1YmplY3QoKTsKICAgICAgICB0aGlzLnJlZ2lzdGVyS2V5cyhrZXlzMiwgc3ViamVjdCk7CiAgICAgICAgcmV0dXJuIHN1YmplY3Q7CiAgICAgIH0KICAgICAgdHJpZ2dlcktleVByZXNzKGtleXNBcmcpIHsKICAgICAgICBmb3IgKGNvbnN0IGtleTIgb2Yga2V5c0FyZykgewogICAgICAgICAgdGhpcy5wcmVzc2VkS2V5cy5hZGQoa2V5Mik7CiAgICAgICAgfQogICAgICAgIHRoaXMuY2hlY2tNYXRjaGluZ0tleWJvYXJkU3ViamVjdHMoKTsKICAgICAgICBmb3IgKGNvbnN0IGtleTIgb2Yga2V5c0FyZykgewogICAgICAgICAgdGhpcy5wcmVzc2VkS2V5cy5kZWxldGUoa2V5Mik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0YXJ0TGlzdGVuaW5nKCkgewogICAgICAgIHRoaXMuZG9tTm9kZS5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgdGhpcy5oYW5kbGVLZXlEb3duKTsKICAgICAgICB0aGlzLmRvbU5vZGUuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLCB0aGlzLmhhbmRsZUtleVVwKTsKICAgICAgfQogICAgICBzdG9wTGlzdGVuaW5nKCkgewogICAgICAgIHRoaXMuZG9tTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgdGhpcy5oYW5kbGVLZXlEb3duKTsKICAgICAgICB0aGlzLmRvbU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5dXAiLCB0aGlzLmhhbmRsZUtleVVwKTsKICAgICAgfQogICAgICBjbGVhcigpIHsKICAgICAgICB0aGlzLnN0b3BMaXN0ZW5pbmcoKTsKICAgICAgICB0aGlzLm1hcENvbWJvc1RvSGFuZGxlcnMuY2xlYXIoKTsKICAgICAgICB0aGlzLnByZXNzZWRLZXlzLmNsZWFyKCk7CiAgICAgIH0KICAgICAgaGFuZGxlS2V5RG93biA9IChldmVudCkgPT4gewogICAgICAgIHRoaXMucHJlc3NlZEtleXMuYWRkKGV2ZW50LmtleUNvZGUpOwogICAgICAgIHRoaXMuY2hlY2tNYXRjaGluZ0tleWJvYXJkU3ViamVjdHMoZXZlbnQpOwogICAgICB9OwogICAgICBjaGVja01hdGNoaW5nS2V5Ym9hcmRTdWJqZWN0cyhwYXlsb2FkQXJnKSB7CiAgICAgICAgdGhpcy5tYXBDb21ib3NUb0hhbmRsZXJzLmZvckVhY2goKHN1YmplY3RBcmcsIGtleXNBcmcpID0+IHsKICAgICAgICAgIGlmICh0aGlzLmFyZUFsbEtleXNQcmVzc2VkKGtleXNBcmcpKSB7CiAgICAgICAgICAgIHN1YmplY3RBcmcubmV4dChwYXlsb2FkQXJnKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICBoYW5kbGVLZXlVcCA9IChldmVudCkgPT4gewogICAgICAgIHRoaXMucHJlc3NlZEtleXMuZGVsZXRlKGV2ZW50LmtleUNvZGUpOwogICAgICB9OwogICAgICBhcmVBbGxLZXlzUHJlc3NlZChrZXlzQXJnKSB7CiAgICAgICAgbGV0IHJlc3VsdCA9IHRydWU7CiAgICAgICAga2V5c0FyZy5mb3JFYWNoKChrZXkyKSA9PiB7CiAgICAgICAgICBpZiAoIXRoaXMucHJlc3NlZEtleXMuaGFzKGtleTIpKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgcmVnaXN0ZXJLZXlzKGtleXNBcmcsIHN1YmplY3RBcmcpIHsKICAgICAgICBpZiAoIXRoaXMubWFwQ29tYm9zVG9IYW5kbGVycy5oYXMoa2V5c0FyZykpIHsKICAgICAgICAgIHRoaXMubWFwQ29tYm9zVG9IYW5kbGVycy5zZXQoa2V5c0FyZywgc3ViamVjdEFyZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLm1hcENvbWJvc1RvSGFuZGxlcnMuZ2V0KGtleXNBcmcpOwogICAgICAgICAgcmV0dXJuIHN1YmplY3Q7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjMuOC9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLmNsYXNzZXMuZG9tdG9vbHMuanMKdmFyIERvbVRvb2xzOwp2YXIgaW5pdF9kb210b29sc19jbGFzc2VzX2RvbXRvb2xzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjMuOC9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLmNsYXNzZXMuZG9tdG9vbHMuanMiKCkgewogICAgaW5pdF9kb210b29sc19wbHVnaW5zKCk7CiAgICBpbml0X2RvbXRvb2xzX2Nzc19icmVha3BvaW50cygpOwogICAgaW5pdF9kb210b29sc19jbGFzc2VzX3Njcm9sbGVyKCk7CiAgICBpbml0X2Rpc3RfdHMyNCgpOwogICAgaW5pdF9kb210b29sc19jbGFzc2VzX3RoZW1lbWFuYWdlcigpOwogICAgaW5pdF9kb210b29sc19jbGFzc2VzX2tleWJvYXJkKCk7CiAgICBEb21Ub29scyA9IGNsYXNzIF9Eb21Ub29scyB7CiAgICAgIC8vID09PT09PQogICAgICAvLyBTVEFUSUMKICAgICAgLy8gPT09PT09CiAgICAgIHN0YXRpYyBpbml0aWFsaXphdGlvblByb21pc2UgPSBudWxsOwogICAgICAvKioKICAgICAgICogc2V0dXBzIGRvbXRvb2xzCiAgICAgICAqLwogICAgICBzdGF0aWMgYXN5bmMgc2V0dXBEb21Ub29scyhvcHRpb25zQXJnID0ge30pIHsKICAgICAgICBpZiAoIW9wdGlvbnNBcmcuaWdub3JlR2xvYmFsICYmIF9Eb21Ub29scy5pbml0aWFsaXphdGlvblByb21pc2UpIHsKICAgICAgICAgIHJldHVybiBhd2FpdCBfRG9tVG9vbHMuaW5pdGlhbGl6YXRpb25Qcm9taXNlOwogICAgICAgIH0KICAgICAgICBpZiAoIW9wdGlvbnNBcmcuaWdub3JlR2xvYmFsKSB7CiAgICAgICAgICBfRG9tVG9vbHMuaW5pdGlhbGl6YXRpb25Qcm9taXNlID0gKGFzeW5jICgpID0+IHsKICAgICAgICAgICAgbGV0IGRvbVRvb2xzSW5zdGFuY2U7CiAgICAgICAgICAgIGlmICghZ2xvYmFsVGhpcy5kZWVzRG9tVG9vbHMpIHsKICAgICAgICAgICAgICBnbG9iYWxUaGlzLmRlZXNEb21Ub29scyA9IG5ldyBfRG9tVG9vbHMob3B0aW9uc0FyZyk7CiAgICAgICAgICAgICAgZG9tVG9vbHNJbnN0YW5jZSA9IGdsb2JhbFRoaXMuZGVlc0RvbVRvb2xzOwogICAgICAgICAgICAgIGNvbnN0IHJlYWR5U3RhdGVDaGFuZ2VkRnVuYyA9ICgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiaW50ZXJhY3RpdmUiIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIpIHsKICAgICAgICAgICAgICAgICAgZG9tVG9vbHNJbnN0YW5jZS5lbGVtZW50cy5oZWFkRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImhlYWQiKTsKICAgICAgICAgICAgICAgICAgZG9tVG9vbHNJbnN0YW5jZS5lbGVtZW50cy5ib2R5RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImJvZHkiKTsKICAgICAgICAgICAgICAgICAgZG9tVG9vbHNJbnN0YW5jZS5rZXlib2FyZCA9IG5ldyBLZXlib2FyZChkb2N1bWVudC5ib2R5KTsKICAgICAgICAgICAgICAgICAgZG9tVG9vbHNJbnN0YW5jZS5kb21SZWFkeS5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImludGVyYWN0aXZlIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiKSB7CiAgICAgICAgICAgICAgICByZWFkeVN0YXRlQ2hhbmdlZEZ1bmMoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsIHJlYWR5U3RhdGVDaGFuZ2VkRnVuYyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGRvbVRvb2xzSW5zdGFuY2UuZG9tVG9vbHNSZWFkeS5yZXNvbHZlKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZG9tVG9vbHNJbnN0YW5jZSA9IGdsb2JhbFRoaXMuZGVlc0RvbVRvb2xzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF3YWl0IGRvbVRvb2xzSW5zdGFuY2UuZG9tVG9vbHNSZWFkeS5wcm9taXNlOwogICAgICAgICAgICByZXR1cm4gZG9tVG9vbHNJbnN0YW5jZTsKICAgICAgICAgIH0pKCk7CiAgICAgICAgICByZXR1cm4gYXdhaXQgX0RvbVRvb2xzLmluaXRpYWxpemF0aW9uUHJvbWlzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgZG9tVG9vbHNJbnN0YW5jZSA9IG5ldyBfRG9tVG9vbHMob3B0aW9uc0FyZyk7CiAgICAgICAgICByZXR1cm4gZG9tVG9vbHNJbnN0YW5jZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGlmIHlvdSBjYW4sIHVzZSB0aGUgc3RhdGljIGFzeXNuYyAuc2V0dXBEb21Ub29scygpIGZ1bmN0aW9uIGluc3RlYWQgc2luY2UgaXQgaXMgc2FmZXIgdG8gdXNlLgogICAgICAgKi8KICAgICAgc3RhdGljIGdldEdsb2JhbERvbVRvb2xzU3luYygpIHsKICAgICAgICBjb25zdCBnbG9iYWxEb21Ub29scyA9IGdsb2JhbFRoaXMuZGVlc0RvbVRvb2xzOwogICAgICAgIGlmICghZ2xvYmFsRG9tVG9vbHMpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiWW91IHRyaWVkIHRvIGFjY2VzcyBkb210b29scyBzeW5jaHJvbm91c2x5IHRvbyBlYXJseSIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZ2xvYmFsVGhpcy5kZWVzRG9tVG9vbHM7CiAgICAgIH0KICAgICAgLy8gPT09PT09PT0KICAgICAgLy8gSU5TVEFOQ0UKICAgICAgLy8gPT09PT09PT0KICAgICAgLy8gZWxlbWVudHMKICAgICAgZWxlbWVudHMgPSB7CiAgICAgICAgaGVhZEVsZW1lbnQ6IG51bGwsCiAgICAgICAgYm9keUVsZW1lbnQ6IG51bGwKICAgICAgfTsKICAgICAgd2Vic2V0dXAgPSBuZXcgV2ViU2V0dXAoewogICAgICAgIG1ldGFPYmplY3Q6IHsKICAgICAgICAgIHRpdGxlOiAiIgogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHNtYXJ0c3RhdGUgPSBuZXcgZGlzdF90c19leHBvcnRzMTkuU21hcnRzdGF0ZSgpOwogICAgICBkb21Ub29sc1N0YXRlUGFydCA9IHRoaXMuc21hcnRzdGF0ZS5nZXRTdGF0ZVBhcnQoImRvbXRvb2xzIiwgewogICAgICAgIHZpcnR1YWxWaWV3cG9ydDogIm5hdGl2ZSIsCiAgICAgICAgand0OiBudWxsCiAgICAgIH0pOwogICAgICByb3V0ZXIgPSBuZXcgZGlzdF90c19leHBvcnRzMTguU21hcnRSb3V0ZXIoewogICAgICAgIGRlYnVnOiBmYWxzZQogICAgICB9KTsKICAgICAgY29udmVuaWVuY2UgPSB7CiAgICAgICAgdHlwZWRyZXF1ZXN0OiBkaXN0X3RzX2V4cG9ydHMxNSwKICAgICAgICBzbWFydGRlbGF5OiBkaXN0X3RzX2V4cG9ydHMzLAogICAgICAgIHNtYXJ0anNvbjogZGlzdF90c19leHBvcnRzMTIsCiAgICAgICAgc21hcnR1cmw6IGRpc3RfdHNfZXhwb3J0czIwCiAgICAgIH07CiAgICAgIGRlZXNDb21tcyA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxNi5EZWVzQ29tbXMoKTsKICAgICAgc2Nyb2xsZXIgPSBuZXcgU2Nyb2xsZXIodGhpcyk7CiAgICAgIHRoZW1lTWFuYWdlciA9IG5ldyBUaGVtZU1hbmFnZXIodGhpcyk7CiAgICAgIGtleWJvYXJkID0gbnVsbDsKICAgICAgLy8gSW5pdGlhbGl6ZWQgYWZ0ZXIgRE9NIHJlYWR5IHRvIGF2b2lkIGFjY2Vzc2luZyBkb2N1bWVudC5ib2R5IGJlZm9yZSBpdCBleGlzdHMKICAgICAgZG9tVG9vbHNSZWFkeSA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgICBkb21SZWFkeSA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgICBnbG9iYWxTdHlsZXNSZWFkeSA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgICBjb25zdHJ1Y3RvcihvcHRpb25zQXJnKSB7CiAgICAgIH0KICAgICAgcnVuT25jZVRyYWNrZXJTdHJpbmdNYXAgPSBuZXcgbGlrLlN0cmluZ21hcCgpOwogICAgICBydW5PbmNlUmVzdWx0TWFwID0gbmV3IGxpay5GYXN0TWFwKCk7CiAgICAgIHJ1bk9uY2VFcnJvck1hcCA9IG5ldyBsaWsuRmFzdE1hcCgpOwogICAgICAvKioKICAgICAgICogcnVuIGEgZnVuY3Rpb24gb25jZSBhbmQgYWx3YXlzIGdldCB0aGUgUHJvbWlzZSBvZiB0aGUgZmlyc3QgZXhlY3V0aW9uCiAgICAgICAqIEBwYXJhbSBpZGVudGlmaWVyQXJnIHRoZSBpbmRlbnRpZmllciBhcmcgaWRlbnRpZmllcyBmdW5jdGlvbnMuIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIGlkZW50aWZpZXIgYXJlIGNvbnNpZGVyZWQgZXF1YWwKICAgICAgICogQHBhcmFtIGZ1bmNBcmcgdGhlIGFjdHVhbCBmdW5jIGFyZyB0byBydW4KICAgICAgICovCiAgICAgIGFzeW5jIHJ1bk9uY2UoaWRlbnRpZmllckFyZywgZnVuY0FyZykgewogICAgICAgIGNvbnN0IHJ1bm5pbmdJZCA9IGAke2lkZW50aWZpZXJBcmd9K3J1bm5pbmdDaGVja2A7CiAgICAgICAgaWYgKCF0aGlzLnJ1bk9uY2VUcmFja2VyU3RyaW5nTWFwLmNoZWNrU3RyaW5nKGlkZW50aWZpZXJBcmcpKSB7CiAgICAgICAgICB0aGlzLnJ1bk9uY2VUcmFja2VyU3RyaW5nTWFwLmFkZFN0cmluZyhpZGVudGlmaWVyQXJnKTsKICAgICAgICAgIHRoaXMucnVuT25jZVRyYWNrZXJTdHJpbmdNYXAuYWRkU3RyaW5nKHJ1bm5pbmdJZCk7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmdW5jQXJnKCk7CiAgICAgICAgICAgIHRoaXMucnVuT25jZVJlc3VsdE1hcC5hZGRUb01hcChpZGVudGlmaWVyQXJnLCByZXN1bHQpOwogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgdGhpcy5ydW5PbmNlRXJyb3JNYXAuYWRkVG9NYXAoaWRlbnRpZmllckFyZywgZXJyb3IpOwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgdGhpcy5ydW5PbmNlVHJhY2tlclN0cmluZ01hcC5yZW1vdmVTdHJpbmcocnVubmluZ0lkKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuT25jZVRyYWNrZXJTdHJpbmdNYXAucmVnaXN0ZXJVbnRpbFRydWUoKHN0cmluZ01hcCkgPT4gewogICAgICAgICAgcmV0dXJuICFzdHJpbmdNYXAuaW5jbHVkZXMocnVubmluZ0lkKTsKICAgICAgICB9LCAoKSA9PiB7CiAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMucnVuT25jZUVycm9yTWFwLmdldEJ5S2V5KGlkZW50aWZpZXJBcmcpOwogICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRoaXMucnVuT25jZVJlc3VsdE1hcC5nZXRCeUtleShpZGVudGlmaWVyQXJnKTsKICAgICAgICB9KTsKICAgICAgfQogICAgICAvLyBzZXRTdHVmZgogICAgICAvKioKICAgICAgICogYWxsb3dzIHRvIHNldCBnbG9iYWwgc3R5bGVzCiAgICAgICAqIEBwYXJhbSBzdHlsZXNUZXh0IHRoZSBjc3MgdGV4dCB5b3Ugd2FudCB0byBzZXQKICAgICAgICovCiAgICAgIGFzeW5jIHNldEdsb2JhbFN0eWxlcyhzdHlsZXNUZXh0KSB7CiAgICAgICAgYXdhaXQgdGhpcy5kb21SZWFkeS5wcm9taXNlOwogICAgICAgIGNvbnN0IHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgICAgc3R5bGVFbGVtZW50LnR5cGUgPSAidGV4dC9jc3MiOwogICAgICAgIHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdHlsZXNUZXh0KSk7CiAgICAgICAgdGhpcy5lbGVtZW50cy5oZWFkRWxlbWVudC5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBhbGxvd3MgdG8gc2V0IGdsb2JhbCBzdHlsZXMKICAgICAgICogQHBhcmFtIHN0eWxlc1RleHQgdGhlIGNzcyB0ZXh0IHlvdSB3YW50IHRvIHNldAogICAgICAgKi8KICAgICAgYXN5bmMgc2V0RXh0ZXJuYWxTY3JpcHQoc2NyaXB0TGlua0FyZykgewogICAgICAgIGF3YWl0IHRoaXMuZG9tUmVhZHkucHJvbWlzZTsKICAgICAgICBjb25zdCBkb25lID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgc2NyaXB0LnNyYyA9IHNjcmlwdExpbmtBcmc7CiAgICAgICAgc2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCBmdW5jdGlvbigpIHsKICAgICAgICAgIGRvbmUucmVzb2x2ZSgpOwogICAgICAgIH0pOwogICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmJvZHk7CiAgICAgICAgcGFyZW50Tm9kZS5hcHBlbmQoc2NyaXB0KTsKICAgICAgICBhd2FpdCBkb25lLnByb21pc2U7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGFsbG93cyBzZXR0aW5nIGV4dGVybmFsIGNzcyBmaWxlcwogICAgICAgKiBAcGFyYW0gY3NzTGlua0FyZyBhIHVybCB0byBhbiBleHRlcm5hbCBzdHlsZXNoZWV0CiAgICAgICAqLwogICAgICBhc3luYyBzZXRFeHRlcm5hbENzcyhjc3NMaW5rQXJnKSB7CiAgICAgICAgY29uc3QgY3NzVGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpOwogICAgICAgIGNzc1RhZy5yZWwgPSAic3R5bGVzaGVldCI7CiAgICAgICAgY3NzVGFnLmNyb3NzT3JpZ2luID0gImFub255bW91cyI7CiAgICAgICAgY3NzVGFnLmhyZWYgPSBjc3NMaW5rQXJnOwogICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kKGNzc1RhZyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGFsbG93cyBzZXR0aW5nIG9mIHdlYnNpdGUgaW5mb3MKICAgICAgICogQHBhcmFtIG9wdGlvbnNBcmcgdGhlIHdlYnNpdGUgaW5mbwogICAgICAgKi8KICAgICAgYXN5bmMgc2V0V2Vic2l0ZUluZm8ob3B0aW9uc0FyZykgewogICAgICAgIGF3YWl0IHRoaXMud2Vic2V0dXAuc2V0dXAob3B0aW9uc0FyZyk7CiAgICAgICAgYXdhaXQgdGhpcy53ZWJzZXR1cC5yZWFkeVByb21pc2U7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuMy44L25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuY3NzLmJhc2VzdHlsZXMuanMKdmFyIHNjcm9sbEJhclN0eWxlcywgZ2xvYmFsQmFzZVN0eWxlczsKdmFyIGluaXRfZG9tdG9vbHNfY3NzX2Jhc2VzdHlsZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuMy44L25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuY3NzLmJhc2VzdHlsZXMuanMiKCkgewogICAgaW5pdF9kb210b29sc19jbGFzc2VzX2RvbXRvb2xzKCk7CiAgICBpbml0X2xpdCgpOwogICAgc2Nyb2xsQmFyU3R5bGVzID0gKCgpID0+IHsKICAgICAgY29uc3QgcmV0dXJuU3R5bGVzT2xkID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNYWMgT1MgWCIpID09PSAtMSA/IGlgYC5jc3NUZXh0IDogYGA7CiAgICAgIGNvbnN0IHJldHVyblN0eWxlcyA9IGlgCiAgICAvKiB3aWR0aCAqLwogICAgOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICAgIHdpZHRoOiAwcHg7CiAgICB9CiAgICBib2R5IHsKICAgICAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOwogICAgfQogIGAuY3NzVGV4dDsKICAgICAgcmV0dXJuIHJldHVyblN0eWxlczsKICAgIH0pKCk7CiAgICBnbG9iYWxCYXNlU3R5bGVzID0gaWAKICAvKgogIEBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6ICdNYXRlcmlhbCBJY29ucyc7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LXdlaWdodDogNDAwOwogICAgc3JjOiB1cmwoaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbS9zL21hdGVyaWFsaWNvbnMvdjQyL2ZsVWhScTZ0elpjbFFFSi1WZGctSXVpYURzTmNJaFE4dFEud29mZjIpCiAgICAgIGZvcm1hdCgnd29mZjInKTsKICB9ICovCgogIC8qIGdsb2JhbCBib2R5IHN0eWxlcyAqLwogIGJvZHkgewogICAgbWFyZ2luOiAwcHg7CiAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCAnSW50ZXInLCBzYW5zLXNlcmlmOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICB9CgogIC8qIHNjcm9sbCBiYXIgc3R5bGVzICovCiAgJHtyKHNjcm9sbEJhclN0eWxlcyl9CmAuY3NzVGV4dDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi4zLjgvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5lbGVtZW50YmFzaWMuanMKdmFyIGRvbXRvb2xzX2VsZW1lbnRiYXNpY19leHBvcnRzID0ge307Cl9fZXhwb3J0KGRvbXRvb2xzX2VsZW1lbnRiYXNpY19leHBvcnRzLCB7CiAgc2V0dXA6ICgpID0+IHNldHVwLAogIHN0YXRpY1N0eWxlczogKCkgPT4gc3RhdGljU3R5bGVzLAogIHN0eWxlczogKCkgPT4gc3R5bGVzCn0pOwp2YXIgc3RhdGljU3R5bGVzLCBzdHlsZXMsIHNldHVwOwp2YXIgaW5pdF9kb210b29sc19lbGVtZW50YmFzaWMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuMy44L25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuZWxlbWVudGJhc2ljLmpzIigpIHsKICAgIGluaXRfZG9tdG9vbHNfcGx1Z2lucygpOwogICAgaW5pdF9kb210b29sc19jbGFzc2VzX2RvbXRvb2xzKCk7CiAgICBpbml0X2RvbXRvb2xzX2Nzc19iYXNlc3R5bGVzKCk7CiAgICBpbml0X2xpdCgpOwogICAgc3RhdGljU3R5bGVzID0gaWAKICAqIHsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xcywgY29sb3IgMC4xczsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgfQoKICA6aG9zdCB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgZm9udC1mYW1pbHk6ICdHZWlzdCBTYW5zJywgJ0ludGVyJywgc2Fucy1zZXJpZjsKICB9CgogICR7cihzY3JvbGxCYXJTdHlsZXMpfQpgOwogICAgc3R5bGVzID0gYjJgCiAgPHN0eWxlPgogICAgKiB7CiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xcywgY29sb3IgMC4xczsKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIH0KCiAgICA6aG9zdCB7CiAgICAgIGZvbnQtZmFtaWx5OiAnR2Vpc3QgU2FucycsICdJbnRlcicsIHNhbnMtc2VyaWY7CiAgICB9CgogICAgJHtzY3JvbGxCYXJTdHlsZXN9CiAgPC9zdHlsZT4KYDsKICAgIHNldHVwID0gYXN5bmMgKGVsZW1lbnRBcmcsIG9wdGlvbnNBcmcgPSB7fSkgPT4gewogICAgICBjb25zdCBkb21Ub29scyA9IGF3YWl0IERvbVRvb2xzLnNldHVwRG9tVG9vbHMob3B0aW9uc0FyZyk7CiAgICAgIGlmIChlbGVtZW50QXJnKSB7CiAgICAgIH0KICAgICAgZG9tVG9vbHMucnVuT25jZSgiZWxlbWVudEJhc2ljU2V0dXAiLCBhc3luYyAoKSA9PiB7CiAgICAgICAgZG9tVG9vbHMuc2V0R2xvYmFsU3R5bGVzKGdsb2JhbEJhc2VTdHlsZXMpOwogICAgICB9KTsKICAgICAgcmV0dXJuIGRvbVRvb2xzOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi4zLjgvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5jc3MuanMKdmFyIGRvbXRvb2xzX2Nzc19leHBvcnRzID0ge307Cl9fZXhwb3J0KGRvbXRvb2xzX2Nzc19leHBvcnRzLCB7CiAgY3NzR3JpZENvbHVtbnM6ICgpID0+IGNzc0dyaWRDb2x1bW5zCn0pOwp2YXIgY3NzR3JpZENvbHVtbnM7CnZhciBpbml0X2RvbXRvb2xzX2NzcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi4zLjgvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5jc3MuanMiKCkgewogICAgY3NzR3JpZENvbHVtbnMgPSAoYW1vdW50T2ZDb2x1bW5zQXJnLCBnYXBTaXplQXJnKSA9PiB7CiAgICAgIGxldCByZXR1cm5TdHJpbmcgPSBgYDsKICAgICAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgYW1vdW50T2ZDb2x1bW5zQXJnOyBpMTErKykgewogICAgICAgIHJldHVyblN0cmluZyArPSBgIGNhbGMoKDEwMCUvJHthbW91bnRPZkNvbHVtbnNBcmd9KSAtICgke2dhcFNpemVBcmcgKiAoYW1vdW50T2ZDb2x1bW5zQXJnIC0gMSl9cHgvJHthbW91bnRPZkNvbHVtbnNBcmd9KSlgOwogICAgICB9CiAgICAgIHJldHVybiByZXR1cm5TdHJpbmc7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjMuOC9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLnBsdWdpbmV4cG9ydHMuanMKdmFyIGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChkb210b29sc19wbHVnaW5leHBvcnRzX2V4cG9ydHMsIHsKICBTd2VldFNjcm9sbDogKCkgPT4gaW1wb3J0X3N3ZWV0X3Njcm9sbDIuZGVmYXVsdCwKICBzbWFydGRlbGF5OiAoKSA9PiBkaXN0X3RzX2V4cG9ydHMzLAogIHNtYXJ0bWFya2Rvd246ICgpID0+IGRpc3RfdHNfZXhwb3J0czE3LAogIHNtYXJ0cHJvbWlzZTogKCkgPT4gZGlzdF90c19leHBvcnRzLAogIHNtYXJ0cm91dGVyOiAoKSA9PiBkaXN0X3RzX2V4cG9ydHMxOCwKICBzbWFydHJ4OiAoKSA9PiBkaXN0X3RzX2V4cG9ydHMyLAogIHNtYXJ0c3RhdGU6ICgpID0+IGRpc3RfdHNfZXhwb3J0czE5LAogIHNtYXJ0c3RyaW5nOiAoKSA9PiBkaXN0X3RzX2V4cG9ydHMxMSwKICBzbWFydHVybDogKCkgPT4gZGlzdF90c19leHBvcnRzMjAsCiAgdHlwZWRyZXF1ZXN0OiAoKSA9PiBkaXN0X3RzX2V4cG9ydHMxNQp9KTsKdmFyIGltcG9ydF9zd2VldF9zY3JvbGwyOwp2YXIgaW5pdF9kb210b29sc19wbHVnaW5leHBvcnRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjMuOC9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLnBsdWdpbmV4cG9ydHMuanMiKCkgewogICAgaW5pdF9kaXN0X3RzMygpOwogICAgaW5pdF9kaXN0X3RzMTcoKTsKICAgIGluaXRfZGlzdF90cygpOwogICAgaW1wb3J0X3N3ZWV0X3Njcm9sbDIgPSBfX3RvRVNNKHJlcXVpcmVfc3dlZXRfc2Nyb2xsKCksIDEpOwogICAgaW5pdF9kaXN0X3RzMTkoKTsKICAgIGluaXRfZGlzdF90czE4KCk7CiAgICBpbml0X2Rpc3RfdHMyKCk7CiAgICBpbml0X2Rpc3RfdHMxMSgpOwogICAgaW5pdF9kaXN0X3RzMjAoKTsKICAgIGluaXRfZGlzdF90czE1KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuMy44L25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czI1ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czI1LCB7CiAgRG9tVG9vbHM6ICgpID0+IERvbVRvb2xzLAogIFR5cGVkUmVxdWVzdDogKCkgPT4gVHlwZWRSZXF1ZXN0LAogIGJyZWFrcG9pbnRzOiAoKSA9PiBkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cywKICBjc3M6ICgpID0+IGRvbXRvb2xzX2Nzc19leHBvcnRzLAogIGVsZW1lbnRCYXNpYzogKCkgPT4gZG9tdG9vbHNfZWxlbWVudGJhc2ljX2V4cG9ydHMsCiAgcGx1Z2luczogKCkgPT4gZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzCn0pOwp2YXIgaW5pdF9kaXN0X3RzMjUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuMy44L25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvaW5kZXguanMiKCkgewogICAgaW5pdF9kb210b29sc19jb2xvcnMoKTsKICAgIGluaXRfZG9tdG9vbHNfZWxlbWVudGJhc2ljKCk7CiAgICBpbml0X2RvbXRvb2xzX2Nzc19icmVha3BvaW50cygpOwogICAgaW5pdF9kb210b29sc19jc3MoKTsKICAgIGluaXRfZG9tdG9vbHNfY2xhc3Nlc19kb210b29scygpOwogICAgaW5pdF9kaXN0X3RzMTUoKTsKICAgIGluaXRfZGlzdF90czI0KCk7CiAgICBpbml0X2RvbXRvb2xzX3BsdWdpbmV4cG9ydHMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjEuNi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvcGx1Z2lucy5qcwp2YXIgaXNvdW5pcXVlMywgbGl0Owp2YXIgaW5pdF9wbHVnaW5zMyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjEuNi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvcGx1Z2lucy5qcyIoKSB7CiAgICBpc291bmlxdWUzID0gX190b0VTTShyZXF1aXJlX2Rpc3RfdHMoKSwgMSk7CiAgICBpbml0X2Rpc3RfdHMyKCk7CiAgICBpbml0X2xpdCgpOwogICAgaW5pdF9wcm9wZXJ0eTIoKTsKICAgIGluaXRfZGlzdF90czI1KCk7CiAgICBsaXQgPSB7CiAgICAgIGNzczogaSwKICAgICAgdW5zYWZlQ1NTOiByLAogICAgICBMaXRFbGVtZW50OiBpNCwKICAgICAgcHJvcGVydHk6IG41CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1lbGVtZW50QDIuMS42L25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWVsZW1lbnQvZGlzdF90cy9jbGFzc2VzLmNzc21hbmFnZXIuanMKdmFyIENzc01hbmFnZXI7CnZhciBpbml0X2NsYXNzZXNfY3NzbWFuYWdlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjEuNi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvY2xhc3Nlcy5jc3NtYW5hZ2VyLmpzIigpIHsKICAgIGluaXRfbGl0KCk7CiAgICBpbml0X3BsdWdpbnMzKCk7CiAgICBpbml0X2Rpc3RfdHMyNSgpOwogICAgQ3NzTWFuYWdlciA9IGNsYXNzIF9Dc3NNYW5hZ2VyIHsKICAgICAgLy8gU1RBVElDCiAgICAgIHN0YXRpYyBpbnN0YW5jZSA9IG51bGw7CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgQ3NzTWFuYWdlcgogICAgICAgKi8KICAgICAgc3RhdGljIGdldFNpbmdsZXRvbigpIHsKICAgICAgICBpZiAoIV9Dc3NNYW5hZ2VyLmluc3RhbmNlKSB7CiAgICAgICAgICBfQ3NzTWFuYWdlci5pbnN0YW5jZSA9IG5ldyBfQ3NzTWFuYWdlcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX0Nzc01hbmFnZXIuaW5zdGFuY2U7CiAgICAgIH0KICAgICAgLy8gSU5TVEFOQ0UKICAgICAgZG9tdG9vbHNQcm9taXNlID0gRG9tVG9vbHMuc2V0dXBEb21Ub29scygpOwogICAgICBnb0JyaWdodCA9IGZhbHNlOwogICAgICBiZFZhclRyaXBsZXRTdG9yZSA9IFtdOwogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLmRvbXRvb2xzUHJvbWlzZS50aGVuKGFzeW5jIChkb210b29sc0FyZykgPT4gewogICAgICAgICAgZG9tdG9vbHNBcmcudGhlbWVNYW5hZ2VyLnRoZW1lT2JzZXJ2YWJsZS5zdWJzY3JpYmUoYXN5bmMgKGdvQnJpZ2h0QXJnKSA9PiB7CiAgICAgICAgICAgIHRoaXMuZ29CcmlnaHQgPSBnb0JyaWdodEFyZzsKICAgICAgICAgICAgYXdhaXQgZG9tdG9vbHNBcmcuZG9tUmVhZHkucHJvbWlzZTsKICAgICAgICAgICAgZm9yIChjb25zdCBiZFRyaXBsZXRBcmcgb2YgdGhpcy5iZFZhclRyaXBsZXRTdG9yZSkgewogICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoYmRUcmlwbGV0QXJnLmNzc1Zhck5hbWUsIHRoaXMuZ29CcmlnaHQgPyBiZFRyaXBsZXRBcmcuYnJpZ2h0VmFsdWUgOiBiZFRyaXBsZXRBcmcuZGFya1ZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgZ2V0IGRlZmF1bHRTdHlsZXMoKSB7CiAgICAgICAgcmV0dXJuIGRvbXRvb2xzX2VsZW1lbnRiYXNpY19leHBvcnRzLnN0YXRpY1N0eWxlczsKICAgICAgfQogICAgICBjc3NGb3JEZXNrdG9wKGNvbnRlbnRBcmcpIHsKICAgICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JEZXNrdG9wKGNvbnRlbnRBcmcpKTsKICAgICAgfQogICAgICBjc3NGb3JOb3RlYm9vayhjb250ZW50QXJnKSB7CiAgICAgICAgcmV0dXJuIHIoZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMuY3NzRm9yTm90ZWJvb2soY29udGVudEFyZykpOwogICAgICB9CiAgICAgIGNzc0ZvclRhYmxldChjb250ZW50QXJnKSB7CiAgICAgICAgcmV0dXJuIHIoZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMuY3NzRm9yVGFibGV0KGNvbnRlbnRBcmcpKTsKICAgICAgfQogICAgICBjc3NGb3JQaGFibGV0KGNvbnRlbnRBcmcpIHsKICAgICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JQaGFibGV0KGNvbnRlbnRBcmcpKTsKICAgICAgfQogICAgICBjc3NGb3JQaG9uZShjb250ZW50QXJnKSB7CiAgICAgICAgcmV0dXJuIHIoZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMuY3NzRm9yUGhvbmUoY29udGVudEFyZykpOwogICAgICB9CiAgICAgIGJkVGhlbWUoYnJpZ2h0VmFsdWVBcmcsIGRhcmtWYWx1ZUFyZykgewogICAgICAgIGxldCByZXR1cm5Dc3NWYXI7CiAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZTsKICAgICAgICBpZiAoRG9tVG9vbHMuZ2V0R2xvYmFsRG9tVG9vbHNTeW5jKCkpIHsKICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IERvbVRvb2xzLmdldEdsb2JhbERvbVRvb2xzU3luYygpLnRoZW1lTWFuYWdlci5nb0JyaWdodEJvb2xlYW4gPyBicmlnaHRWYWx1ZUFyZyA6IGRhcmtWYWx1ZUFyZzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGVmYXVsdFZhbHVlID0gZGFya1ZhbHVlQXJnOwogICAgICAgIH0KICAgICAgICBjb25zdCBleGlzdGluZ1RyaXBsZXQgPSB0aGlzLmJkVmFyVHJpcGxldFN0b3JlLmZpbmQoKHRyaXBsZXRBcmcpID0+IHRyaXBsZXRBcmcuZGFya1ZhbHVlID09PSBkYXJrVmFsdWVBcmcgJiYgdHJpcGxldEFyZy5icmlnaHRWYWx1ZSA9PT0gYnJpZ2h0VmFsdWVBcmcpOwogICAgICAgIGlmIChleGlzdGluZ1RyaXBsZXQpIHsKICAgICAgICAgIHJldHVybkNzc1ZhciA9IGV4aXN0aW5nVHJpcGxldC5jc3NWYXJOYW1lOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBuZXdUcmlwbGV0ID0gewogICAgICAgICAgICBjc3NWYXJOYW1lOiBgLS0ke2lzb3VuaXF1ZTMudW5pKCl9YCwKICAgICAgICAgICAgYnJpZ2h0VmFsdWU6IGJyaWdodFZhbHVlQXJnLAogICAgICAgICAgICBkYXJrVmFsdWU6IGRhcmtWYWx1ZUFyZwogICAgICAgICAgfTsKICAgICAgICAgIHRoaXMuYmRWYXJUcmlwbGV0U3RvcmUucHVzaChuZXdUcmlwbGV0KTsKICAgICAgICAgIHRoaXMuZG9tdG9vbHNQcm9taXNlLnRoZW4oYXN5bmMgKGRvbXRvb2xzQXJnKSA9PiB7CiAgICAgICAgICAgIGF3YWl0IGRvbXRvb2xzQXJnLmRvbVJlYWR5LnByb21pc2U7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkobmV3VHJpcGxldC5jc3NWYXJOYW1lLCBkZWZhdWx0VmFsdWUpOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm5Dc3NWYXIgPSBuZXdUcmlwbGV0LmNzc1Zhck5hbWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaXQudW5zYWZlQ1NTKGB2YXIoJHtyZXR1cm5Dc3NWYXJ9LCAke2RlZmF1bHRWYWx1ZX0pYCk7CiAgICAgIH0KICAgICAgY3NzR3JpZENvbHVtbnMgPSAoYW1vdW50T2ZDb2x1bW5zQXJnLCBnYXBTaXplQXJnKSA9PiB7CiAgICAgICAgbGV0IHJldHVyblN0cmluZyA9IGBgOwogICAgICAgIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IGFtb3VudE9mQ29sdW1uc0FyZzsgaTExKyspIHsKICAgICAgICAgIHJldHVyblN0cmluZyArPSBgIGNhbGMoKDEwMCUvJHthbW91bnRPZkNvbHVtbnNBcmd9KSAtICgke2dhcFNpemVBcmcgKiAoYW1vdW50T2ZDb2x1bW5zQXJnIC0gMSl9cHgvJHthbW91bnRPZkNvbHVtbnNBcmd9KSlgOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGl0LnVuc2FmZUNTUyhyZXR1cm5TdHJpbmcpOwogICAgICB9OwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zdGF0aWMuanMKdmFyIGEzLCBvNywgczQsIGk1LCBsMywgbjcsIHUzLCBjNCwgJDI7CnZhciBpbml0X3N0YXRpYyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zdGF0aWMuanMiKCkgewogICAgaW5pdF9saXRfaHRtbCgpOwogICAgYTMgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcigiIiksIG83ID0gKHQ5KSA9PiB7CiAgICAgIGlmICh0OT8uciA9PT0gYTMpIHJldHVybiB0OT8uXyRsaXRTdGF0aWMkOwogICAgfSwgczQgPSAodDkpID0+ICh7IF8kbGl0U3RhdGljJDogdDksIHI6IGEzIH0pLCBpNSA9ICh0OSwgLi4ucjExKSA9PiAoeyBfJGxpdFN0YXRpYyQ6IHIxMS5yZWR1Y2UoKHIxMiwgZTExLCBhNSkgPT4gcjEyICsgKCh0MTApID0+IHsKICAgICAgaWYgKHZvaWQgMCAhPT0gdDEwLl8kbGl0U3RhdGljJCkgcmV0dXJuIHQxMC5fJGxpdFN0YXRpYyQ7CiAgICAgIHRocm93IEVycm9yKGBWYWx1ZSBwYXNzZWQgdG8gJ2xpdGVyYWwnIGZ1bmN0aW9uIG11c3QgYmUgYSAnbGl0ZXJhbCcgcmVzdWx0OiAke3QxMH0uIFVzZSAndW5zYWZlU3RhdGljJyB0byBwYXNzIG5vbi1saXRlcmFsIHZhbHVlcywgYnV0CiAgICAgICAgICAgIHRha2UgY2FyZSB0byBlbnN1cmUgcGFnZSBzZWN1cml0eS5gKTsKICAgIH0pKGUxMSkgKyB0OVthNSArIDFdLCB0OVswXSksIHI6IGEzIH0pLCBsMyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksIG43ID0gKHQ5KSA9PiAocjExLCAuLi5lMTEpID0+IHsKICAgICAgY29uc3QgYTUgPSBlMTEubGVuZ3RoOwogICAgICBsZXQgczksIGkxMTsKICAgICAgY29uc3QgbjEzID0gW10sIHU3ID0gW107CiAgICAgIGxldCBjMTEsICQzID0gMCwgZjcgPSBmYWxzZTsKICAgICAgZm9yICg7ICQzIDwgYTU7ICkgewogICAgICAgIGZvciAoYzExID0gcjExWyQzXTsgJDMgPCBhNSAmJiB2b2lkIDAgIT09IChpMTEgPSBlMTFbJDNdLCBzOSA9IG83KGkxMSkpOyApIGMxMSArPSBzOSArIHIxMVsrKyQzXSwgZjcgPSB0cnVlOwogICAgICAgICQzICE9PSBhNSAmJiB1Ny5wdXNoKGkxMSksIG4xMy5wdXNoKGMxMSksICQzKys7CiAgICAgIH0KICAgICAgaWYgKCQzID09PSBhNSAmJiBuMTMucHVzaChyMTFbYTVdKSwgZjcpIHsKICAgICAgICBjb25zdCB0MTAgPSBuMTMuam9pbigiJCRsaXQkJCIpOwogICAgICAgIHZvaWQgMCA9PT0gKHIxMSA9IGwzLmdldCh0MTApKSAmJiAobjEzLnJhdyA9IG4xMywgbDMuc2V0KHQxMCwgcjExID0gbjEzKSksIGUxMSA9IHU3OwogICAgICB9CiAgICAgIHJldHVybiB0OShyMTEsIC4uLmUxMSk7CiAgICB9LCB1MyA9IG43KGIyKSwgYzQgPSBuNyh3KSwgJDIgPSBuNyhUKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0L3N0YXRpYy1odG1sLmpzCnZhciBpbml0X3N0YXRpY19odG1sID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbGl0QDMuMy4yL25vZGVfbW9kdWxlcy9saXQvc3RhdGljLWh0bWwuanMiKCkgewogICAgaW5pdF9zdGF0aWMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmUuanMKdmFyIHQzLCBlNCwgaTY7CnZhciBpbml0X2RpcmVjdGl2ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmUuanMiKCkgewogICAgdDMgPSB7IEFUVFJJQlVURTogMSwgQ0hJTEQ6IDIsIFBST1BFUlRZOiAzLCBCT09MRUFOX0FUVFJJQlVURTogNCwgRVZFTlQ6IDUsIEVMRU1FTlQ6IDYgfSwgZTQgPSAodDkpID0+ICguLi5lMTEpID0+ICh7IF8kbGl0RGlyZWN0aXZlJDogdDksIHZhbHVlczogZTExIH0pOwogICAgaTYgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKHQ5KSB7CiAgICAgIH0KICAgICAgZ2V0IF8kQVUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuXyRBTS5fJEFVOwogICAgICB9CiAgICAgIF8kQVQodDksIGUxMSwgaTExKSB7CiAgICAgICAgdGhpcy5fJEN0ID0gdDksIHRoaXMuXyRBTSA9IGUxMSwgdGhpcy5fJENpID0gaTExOwogICAgICB9CiAgICAgIF8kQVModDksIGUxMSkgewogICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZSh0OSwgZTExKTsKICAgICAgfQogICAgICB1cGRhdGUodDksIGUxMSkgewogICAgICAgIHJldHVybiB0aGlzLnJlbmRlciguLi5lMTEpOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMKdmFyIGU1LCBvODsKdmFyIGluaXRfdW5zYWZlX2h0bWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXQtaHRtbEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyIoKSB7CiAgICBpbml0X2xpdF9odG1sKCk7CiAgICBpbml0X2RpcmVjdGl2ZSgpOwogICAgZTUgPSBjbGFzcyBleHRlbmRzIGk2IHsKICAgICAgY29uc3RydWN0b3IoaTExKSB7CiAgICAgICAgaWYgKHN1cGVyKGkxMSksIHRoaXMuaXQgPSBBLCBpMTEudHlwZSAhPT0gdDMuQ0hJTEQpIHRocm93IEVycm9yKHRoaXMuY29uc3RydWN0b3IuZGlyZWN0aXZlTmFtZSArICIoKSBjYW4gb25seSBiZSB1c2VkIGluIGNoaWxkIGJpbmRpbmdzIik7CiAgICAgIH0KICAgICAgcmVuZGVyKHIxMSkgewogICAgICAgIGlmIChyMTEgPT09IEEgfHwgbnVsbCA9PSByMTEpIHJldHVybiB0aGlzLl90ID0gdm9pZCAwLCB0aGlzLml0ID0gcjExOwogICAgICAgIGlmIChyMTEgPT09IEUpIHJldHVybiByMTE7CiAgICAgICAgaWYgKCJzdHJpbmciICE9IHR5cGVvZiByMTEpIHRocm93IEVycm9yKHRoaXMuY29uc3RydWN0b3IuZGlyZWN0aXZlTmFtZSArICIoKSBjYWxsZWQgd2l0aCBhIG5vbi1zdHJpbmcgdmFsdWUiKTsKICAgICAgICBpZiAocjExID09PSB0aGlzLml0KSByZXR1cm4gdGhpcy5fdDsKICAgICAgICB0aGlzLml0ID0gcjExOwogICAgICAgIGNvbnN0IHM5ID0gW3IxMV07CiAgICAgICAgcmV0dXJuIHM5LnJhdyA9IHM5LCB0aGlzLl90ID0geyBfJGxpdFR5cGUkOiB0aGlzLmNvbnN0cnVjdG9yLnJlc3VsdFR5cGUsIHN0cmluZ3M6IHM5LCB2YWx1ZXM6IFtdIH07CiAgICAgIH0KICAgIH07CiAgICBlNS5kaXJlY3RpdmVOYW1lID0gInVuc2FmZUhUTUwiLCBlNS5yZXN1bHRUeXBlID0gMTsKICAgIG84ID0gZTQoZTUpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0QDMuMy4yL25vZGVfbW9kdWxlcy9saXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcwp2YXIgaW5pdF91bnNhZmVfaHRtbDIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXRAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC9kaXJlY3RpdmVzL3Vuc2FmZS1odG1sLmpzIigpIHsKICAgIGluaXRfdW5zYWZlX2h0bWwoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvY3VzdG9tLWVsZW1lbnQuanMKdmFyIHQ0Owp2YXIgaW5pdF9jdXN0b21fZWxlbWVudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvY3VzdG9tLWVsZW1lbnQuanMiKCkgewogICAgdDQgPSAodDkpID0+IChlMTEsIG8xMykgPT4gewogICAgICB2b2lkIDAgIT09IG8xMyA/IG8xMy5hZGRJbml0aWFsaXplcigoKSA9PiB7CiAgICAgICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKHQ5LCBlMTEpOwogICAgICB9KSA6IGN1c3RvbUVsZW1lbnRzLmRlZmluZSh0OSwgZTExKTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9saXRAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC9kZWNvcmF0b3JzL2N1c3RvbS1lbGVtZW50LmpzCnZhciBpbml0X2N1c3RvbV9lbGVtZW50MiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2xpdEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0L2RlY29yYXRvcnMvY3VzdG9tLWVsZW1lbnQuanMiKCkgewogICAgaW5pdF9jdXN0b21fZWxlbWVudCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9zdGF0ZS5qcwpmdW5jdGlvbiByNShyMTEpIHsKICByZXR1cm4gbjUoeyAuLi5yMTEsIHN0YXRlOiB0cnVlLCBhdHRyaWJ1dGU6IGZhbHNlIH0pOwp9CnZhciBpbml0X3N0YXRlMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvc3RhdGUuanMiKCkgewogICAgaW5pdF9wcm9wZXJ0eSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9ldmVudC1vcHRpb25zLmpzCmZ1bmN0aW9uIHQ1KHQ5KSB7CiAgcmV0dXJuIChuMTMsIG8xMykgPT4gewogICAgY29uc3QgYzExID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgbjEzID8gbjEzIDogbjEzW28xM107CiAgICBPYmplY3QuYXNzaWduKGMxMSwgdDkpOwogIH07Cn0KdmFyIGluaXRfZXZlbnRfb3B0aW9ucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvZXZlbnQtb3B0aW9ucy5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL2Jhc2UuanMKdmFyIGU2Owp2YXIgaW5pdF9iYXNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9iYXNlLmpzIigpIHsKICAgIGU2ID0gKGUxMSwgdDksIGMxMSkgPT4gKGMxMS5jb25maWd1cmFibGUgPSB0cnVlLCBjMTEuZW51bWVyYWJsZSA9IHRydWUsIFJlZmxlY3QuZGVjb3JhdGUgJiYgIm9iamVjdCIgIT0gdHlwZW9mIHQ5ICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlMTEsIHQ5LCBjMTEpLCBjMTEpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS5qcwpmdW5jdGlvbiBlNyhlMTEsIHIxMSkgewogIHJldHVybiAobjEzLCBzOSwgaTExKSA9PiB7CiAgICBjb25zdCBvMTMgPSAodDkpID0+IHQ5LnJlbmRlclJvb3Q/LnF1ZXJ5U2VsZWN0b3IoZTExKSA/PyBudWxsOwogICAgaWYgKHIxMSkgewogICAgICBjb25zdCB7IGdldDogZTEyLCBzZXQ6IHIxMiB9ID0gIm9iamVjdCIgPT0gdHlwZW9mIHM5ID8gbjEzIDogaTExID8/IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gewogICAgICAgIGNvbnN0IHQ5ID0gLyogQF9fUFVSRV9fICovIFN5bWJvbCgpOwogICAgICAgIHJldHVybiB7IGdldCgpIHsKICAgICAgICAgIHJldHVybiB0aGlzW3Q5XTsKICAgICAgICB9LCBzZXQoZTEzKSB7CiAgICAgICAgICB0aGlzW3Q5XSA9IGUxMzsKICAgICAgICB9IH07CiAgICAgIH0pKCk7CiAgICAgIHJldHVybiBlNihuMTMsIHM5LCB7IGdldCgpIHsKICAgICAgICBsZXQgdDkgPSBlMTIuY2FsbCh0aGlzKTsKICAgICAgICByZXR1cm4gdm9pZCAwID09PSB0OSAmJiAodDkgPSBvMTModGhpcyksIChudWxsICE9PSB0OSB8fCB0aGlzLmhhc1VwZGF0ZWQpICYmIHIxMi5jYWxsKHRoaXMsIHQ5KSksIHQ5OwogICAgICB9IH0pOwogICAgfQogICAgcmV0dXJuIGU2KG4xMywgczksIHsgZ2V0KCkgewogICAgICByZXR1cm4gbzEzKHRoaXMpOwogICAgfSB9KTsKICB9Owp9CnZhciBpbml0X3F1ZXJ5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS5qcyIoKSB7CiAgICBpbml0X2Jhc2UoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvcXVlcnktYWxsLmpzCmZ1bmN0aW9uIHI2KHIxMSkgewogIHJldHVybiAobjEzLCBvMTMpID0+IGU2KG4xMywgbzEzLCB7IGdldCgpIHsKICAgIHJldHVybiAodGhpcy5yZW5kZXJSb290ID8/IChlOCA/Pz0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKSkucXVlcnlTZWxlY3RvckFsbChyMTEpOwogIH0gfSk7Cn0KdmFyIGU4Owp2YXIgaW5pdF9xdWVyeV9hbGwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3F1ZXJ5LWFsbC5qcyIoKSB7CiAgICBpbml0X2Jhc2UoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvcXVlcnktYXN5bmMuanMKZnVuY3Rpb24gcjcocjExKSB7CiAgcmV0dXJuIChuMTMsIGUxMSkgPT4gZTYobjEzLCBlMTEsIHsgYXN5bmMgZ2V0KCkgewogICAgcmV0dXJuIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGUsIHRoaXMucmVuZGVyUm9vdD8ucXVlcnlTZWxlY3RvcihyMTEpID8/IG51bGw7CiAgfSB9KTsKfQp2YXIgaW5pdF9xdWVyeV9hc3luYyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvcXVlcnktYXN5bmMuanMiKCkgewogICAgaW5pdF9iYXNlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3F1ZXJ5LWFzc2lnbmVkLWVsZW1lbnRzLmpzCmZ1bmN0aW9uIG85KG8xMykgewogIHJldHVybiAoZTExLCBuMTMpID0+IHsKICAgIGNvbnN0IHsgc2xvdDogcjExLCBzZWxlY3RvcjogczkgfSA9IG8xMyA/PyB7fSwgYzExID0gInNsb3QiICsgKHIxMSA/IGBbbmFtZT0ke3IxMX1dYCA6ICI6bm90KFtuYW1lXSkiKTsKICAgIHJldHVybiBlNihlMTEsIG4xMywgeyBnZXQoKSB7CiAgICAgIGNvbnN0IHQ5ID0gdGhpcy5yZW5kZXJSb290Py5xdWVyeVNlbGVjdG9yKGMxMSksIGUxMiA9IHQ5Py5hc3NpZ25lZEVsZW1lbnRzKG8xMykgPz8gW107CiAgICAgIHJldHVybiB2b2lkIDAgPT09IHM5ID8gZTEyIDogZTEyLmZpbHRlcigodDEwKSA9PiB0MTAubWF0Y2hlcyhzOSkpOwogICAgfSB9KTsKICB9Owp9CnZhciBpbml0X3F1ZXJ5X2Fzc2lnbmVkX2VsZW1lbnRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS1hc3NpZ25lZC1lbGVtZW50cy5qcyIoKSB7CiAgICBpbml0X2Jhc2UoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvcXVlcnktYXNzaWduZWQtbm9kZXMuanMKZnVuY3Rpb24gbjgobjEzKSB7CiAgcmV0dXJuIChvMTMsIHIxMSkgPT4gewogICAgY29uc3QgeyBzbG90OiBlMTEgfSA9IG4xMyA/PyB7fSwgczkgPSAic2xvdCIgKyAoZTExID8gYFtuYW1lPSR7ZTExfV1gIDogIjpub3QoW25hbWVdKSIpOwogICAgcmV0dXJuIGU2KG8xMywgcjExLCB7IGdldCgpIHsKICAgICAgY29uc3QgdDkgPSB0aGlzLnJlbmRlclJvb3Q/LnF1ZXJ5U2VsZWN0b3IoczkpOwogICAgICByZXR1cm4gdDk/LmFzc2lnbmVkTm9kZXMobjEzKSA/PyBbXTsKICAgIH0gfSk7CiAgfTsKfQp2YXIgaW5pdF9xdWVyeV9hc3NpZ25lZF9ub2RlcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvcXVlcnktYXNzaWduZWQtbm9kZXMuanMiKCkgewogICAgaW5pdF9iYXNlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9saXRAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC9kZWNvcmF0b3JzLmpzCnZhciBpbml0X2RlY29yYXRvcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXRAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC9kZWNvcmF0b3JzLmpzIigpIHsKICAgIGluaXRfY3VzdG9tX2VsZW1lbnQoKTsKICAgIGluaXRfcHJvcGVydHkoKTsKICAgIGluaXRfc3RhdGUyKCk7CiAgICBpbml0X2V2ZW50X29wdGlvbnMoKTsKICAgIGluaXRfcXVlcnkoKTsKICAgIGluaXRfcXVlcnlfYWxsKCk7CiAgICBpbml0X3F1ZXJ5X2FzeW5jKCk7CiAgICBpbml0X3F1ZXJ5X2Fzc2lnbmVkX2VsZW1lbnRzKCk7CiAgICBpbml0X3F1ZXJ5X2Fzc2lnbmVkX25vZGVzKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4xLjYvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL2NsYXNzZXMuZGVlcy1lbGVtZW50LmpzCnZhciBfX2VzRGVjb3JhdGUyLCBfX3J1bkluaXRpYWxpemVyczMsIERlZXNFbGVtZW50Owp2YXIgaW5pdF9jbGFzc2VzX2RlZXNfZWxlbWVudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjEuNi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvY2xhc3Nlcy5kZWVzLWVsZW1lbnQuanMiKCkgewogICAgaW5pdF9wbHVnaW5zMygpOwogICAgX19lc0RlY29yYXRlMiA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgICAgIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgICAgICByZXR1cm4gZjc7CiAgICAgIH0KICAgICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICAgICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogICAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICAgICAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgICAgIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICAgICAgdmFyIGNvbnRleHQyID0ge307CiAgICAgICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICAgICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICAgICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogICAgICBkb25lID0gdHJ1ZTsKICAgIH07CiAgICBfX3J1bkluaXRpYWxpemVyczMgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogICAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICAgICAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgICAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwogICAgfTsKICAgIERlZXNFbGVtZW50ID0gKCgpID0+IHsKICAgICAgbGV0IF9jbGFzc1N1cGVyID0gbGl0LkxpdEVsZW1lbnQ7CiAgICAgIGxldCBfZ29CcmlnaHRfZGVjb3JhdG9yczsKICAgICAgbGV0IF9nb0JyaWdodF9pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9nb0JyaWdodF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX2RvbXRvb2xzX2RlY29yYXRvcnM7CiAgICAgIGxldCBfZG9tdG9vbHNfaW5pdGlhbGl6ZXJzID0gW107CiAgICAgIGxldCBfZG9tdG9vbHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICAgICAgcmV0dXJuIGNsYXNzIERlZXNFbGVtZW50IGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgICAgIHN0YXRpYyB7CiAgICAgICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgICAgIF9nb0JyaWdodF9kZWNvcmF0b3JzID0gW2xpdC5wcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICAgICAgX2RvbXRvb2xzX2RlY29yYXRvcnMgPSBbbGl0LnByb3BlcnR5KCldOwogICAgICAgICAgX19lc0RlY29yYXRlMih0aGlzLCBudWxsLCBfZ29CcmlnaHRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZ29CcmlnaHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImdvQnJpZ2h0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmdvQnJpZ2h0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgICAgICBvYmouZ29CcmlnaHQgPSB2YWx1ZTI7CiAgICAgICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2dvQnJpZ2h0X2luaXRpYWxpemVycywgX2dvQnJpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgICAgIF9fZXNEZWNvcmF0ZTIodGhpcywgbnVsbCwgX2RvbXRvb2xzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImRvbXRvb2xzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkb210b29scyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5kb210b29scywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICAgICAgb2JqLmRvbXRvb2xzID0gdmFsdWUyOwogICAgICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kb210b29sc19pbml0aWFsaXplcnMsIF9kb210b29sc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICAgICAgfQogICAgICAgICNnb0JyaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMzKHRoaXMsIF9nb0JyaWdodF9pbml0aWFsaXplcnMsIGZhbHNlKTsKICAgICAgICAvLyBJTlNUQU5DRQogICAgICAgIGdldCBnb0JyaWdodCgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiNnb0JyaWdodF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgICAgIH0KICAgICAgICBzZXQgZ29CcmlnaHQodmFsdWUyKSB7CiAgICAgICAgICB0aGlzLiNnb0JyaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgICAvLyBkb210b29scwogICAgICAgIGRvbXRvb2xzUHJvbWlzZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMyh0aGlzLCBfZ29CcmlnaHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICNkb210b29sc19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMzKHRoaXMsIF9kb210b29sc19pbml0aWFsaXplcnMsIHZvaWQgMCk7CiAgICAgICAgZ2V0IGRvbXRvb2xzKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuI2RvbXRvb2xzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICAgICAgfQogICAgICAgIHNldCBkb210b29scyh2YWx1ZTIpIHsKICAgICAgICAgIHRoaXMuI2RvbXRvb2xzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgIHJ4U3Vic2NyaXB0aW9ucyA9IChfX3J1bkluaXRpYWxpemVyczModGhpcywgX2RvbXRvb2xzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgW10pOwogICAgICAgIHRoZW1lU3Vic2NyaXB0aW9uOwogICAgICAgIGVsZW1lbnREb21SZWFkeURlZmVycmVkID0gZGlzdF90c19leHBvcnRzMjUucGx1Z2lucy5zbWFydHByb21pc2UuZGVmZXIoKTsKICAgICAgICBlbGVtZW50RG9tUmVhZHkgPSB0aGlzLmVsZW1lbnREb21SZWFkeURlZmVycmVkLnByb21pc2U7CiAgICAgICAgY29uc3RydWN0b3Iob3B0aW9uc0FyZyA9IHt9KSB7CiAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgdGhpcy5kb210b29sc1Byb21pc2UgPSBkaXN0X3RzX2V4cG9ydHMyNS5lbGVtZW50QmFzaWMuc2V0dXAodGhpcywgb3B0aW9uc0FyZyk7CiAgICAgICAgICB0aGlzLmRvbXRvb2xzUHJvbWlzZS50aGVuKChkb210b29sc0FyZykgPT4gewogICAgICAgICAgICB0aGlzLmRvbXRvb2xzID0gZG9tdG9vbHNBcmc7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgY29uc3QgZG9tdG9vbHMgPSBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgICAgIHRoaXMudGhlbWVTdWJzY3JpcHRpb24gPSBkb210b29scy50aGVtZU1hbmFnZXIudGhlbWVPYnNlcnZhYmxlLnN1YnNjcmliZSgoZ29CcmlnaHRBcmcpID0+IHsKICAgICAgICAgICAgdGhpcy5nb0JyaWdodCA9IGdvQnJpZ2h0QXJnOwogICAgICAgICAgICBpZiAodGhpcy50aGVtZUNoYW5nZWQpIHsKICAgICAgICAgICAgICB0aGlzLnRoZW1lQ2hhbmdlZChnb0JyaWdodEFyZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgdGhpcy5yeFN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLnRoZW1lU3Vic2NyaXB0aW9uKTsKICAgICAgICAgIGZvciAoY29uc3Qgc3RhcnR1cEZ1bmN0aW9uIG9mIHRoaXMuc3RhcnR1cEZ1bmN0aW9ucykgewogICAgICAgICAgICBhd2FpdCBzdGFydHVwRnVuY3Rpb24oKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImRlZXNFbGVtZW50Q29ubmVjdGVkIikpOwogICAgICAgIH0KICAgICAgICBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgICAgICBzdXBlci5maXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgICAgIHRoaXMuZWxlbWVudERvbVJlYWR5RGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgIH0KICAgICAgICBzdGFydHVwRnVuY3Rpb25zID0gW107CiAgICAgICAgcmVnaXN0ZXJTdGFydHVwRnVuY3Rpb24oc3RhcnR1cEZ1bmN0aW9uQXJnKSB7CiAgICAgICAgICB0aGlzLnN0YXJ0dXBGdW5jdGlvbnMucHVzaChzdGFydHVwRnVuY3Rpb25BcmcpOwogICAgICAgIH0KICAgICAgICBnYXJiYWdlRnVuY3Rpb25zID0gW107CiAgICAgICAgcmVnaXN0ZXJHYXJiYWdlRnVuY3Rpb24oZ2FyYmFnZUZ1bmN0aW9uQXJnKSB7CiAgICAgICAgICB0aGlzLmdhcmJhZ2VGdW5jdGlvbnMucHVzaChnYXJiYWdlRnVuY3Rpb25BcmcpOwogICAgICAgIH0KICAgICAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICAgIGF3YWl0IHRoaXMuZG9tdG9vbHNQcm9taXNlOwogICAgICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mIHRoaXMucnhTdWJzY3JpcHRpb25zKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChjb25zdCBnYXJiYWdlRnVuY3Rpb24gb2YgdGhpcy5nYXJiYWdlRnVuY3Rpb25zKSB7CiAgICAgICAgICAgIGF3YWl0IGdhcmJhZ2VGdW5jdGlvbigpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiZGVlc0VsZW1lbnREaXNjb25uZWN0ZWQiKSk7CiAgICAgICAgfQogICAgICB9OwogICAgfSkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmUtaGVscGVycy5qcwp2YXIgdDYsIGk3LCBuOSwgZTksIGw0LCBkNCwgYzUsIGY0LCByOCwgczUsIHYzLCB1NCwgbTMsIHA1LCBNMiwgaDQsIGoyOwp2YXIgaW5pdF9kaXJlY3RpdmVfaGVscGVycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmUtaGVscGVycy5qcyIoKSB7CiAgICBpbml0X2xpdF9odG1sKCk7CiAgICAoeyBJOiB0NiB9ID0gaiksIGk3ID0gKG8xMykgPT4gbzEzLCBuOSA9IChvMTMpID0+IG51bGwgPT09IG8xMyB8fCAib2JqZWN0IiAhPSB0eXBlb2YgbzEzICYmICJmdW5jdGlvbiIgIT0gdHlwZW9mIG8xMywgZTkgPSB7IEhUTUw6IDEsIFNWRzogMiwgTUFUSE1MOiAzIH0sIGw0ID0gKG8xMywgdDkpID0+IHZvaWQgMCA9PT0gdDkgPyB2b2lkIDAgIT09IG8xMz8uXyRsaXRUeXBlJCA6IG8xMz8uXyRsaXRUeXBlJCA9PT0gdDksIGQ0ID0gKG8xMykgPT4gbnVsbCAhPSBvMTM/Ll8kbGl0VHlwZSQ/LmgsIGM1ID0gKG8xMykgPT4gdm9pZCAwICE9PSBvMTM/Ll8kbGl0RGlyZWN0aXZlJCwgZjQgPSAobzEzKSA9PiBvMTM/Ll8kbGl0RGlyZWN0aXZlJCwgcjggPSAobzEzKSA9PiB2b2lkIDAgPT09IG8xMy5zdHJpbmdzLCBzNSA9ICgpID0+IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIiIpLCB2MyA9IChvMTMsIG4xMywgZTExKSA9PiB7CiAgICAgIGNvbnN0IGw2ID0gbzEzLl8kQUEucGFyZW50Tm9kZSwgZDYgPSB2b2lkIDAgPT09IG4xMyA/IG8xMy5fJEFCIDogbjEzLl8kQUE7CiAgICAgIGlmICh2b2lkIDAgPT09IGUxMSkgewogICAgICAgIGNvbnN0IGkxMSA9IGw2Lmluc2VydEJlZm9yZShzNSgpLCBkNiksIG4xNCA9IGw2Lmluc2VydEJlZm9yZShzNSgpLCBkNik7CiAgICAgICAgZTExID0gbmV3IHQ2KGkxMSwgbjE0LCBvMTMsIG8xMy5vcHRpb25zKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCB0OSA9IGUxMS5fJEFCLm5leHRTaWJsaW5nLCBuMTQgPSBlMTEuXyRBTSwgYzExID0gbjE0ICE9PSBvMTM7CiAgICAgICAgaWYgKGMxMSkgewogICAgICAgICAgbGV0IHQxMDsKICAgICAgICAgIGUxMS5fJEFRPy4obzEzKSwgZTExLl8kQU0gPSBvMTMsIHZvaWQgMCAhPT0gZTExLl8kQVAgJiYgKHQxMCA9IG8xMy5fJEFVKSAhPT0gbjE0Ll8kQVUgJiYgZTExLl8kQVAodDEwKTsKICAgICAgICB9CiAgICAgICAgaWYgKHQ5ICE9PSBkNiB8fCBjMTEpIHsKICAgICAgICAgIGxldCBvMTQgPSBlMTEuXyRBQTsKICAgICAgICAgIGZvciAoOyBvMTQgIT09IHQ5OyApIHsKICAgICAgICAgICAgY29uc3QgdDEwID0gaTcobzE0KS5uZXh0U2libGluZzsKICAgICAgICAgICAgaTcobDYpLmluc2VydEJlZm9yZShvMTQsIGQ2KSwgbzE0ID0gdDEwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZTExOwogICAgfSwgdTQgPSAobzEzLCB0OSwgaTExID0gbzEzKSA9PiAobzEzLl8kQUkodDksIGkxMSksIG8xMyksIG0zID0ge30sIHA1ID0gKG8xMywgdDkgPSBtMykgPT4gbzEzLl8kQUggPSB0OSwgTTIgPSAobzEzKSA9PiBvMTMuXyRBSCwgaDQgPSAobzEzKSA9PiB7CiAgICAgIG8xMy5fJEFSKCksIG8xMy5fJEFBLnJlbW92ZSgpOwogICAgfSwgajIgPSAobzEzKSA9PiB7CiAgICAgIG8xMy5fJEFSKCk7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2FzeW5jLWRpcmVjdGl2ZS5qcwpmdW5jdGlvbiBoNShpMTEpIHsKICB2b2lkIDAgIT09IHRoaXMuXyRBTiA/IChvMTAodGhpcyksIHRoaXMuXyRBTSA9IGkxMSwgcjkodGhpcykpIDogdGhpcy5fJEFNID0gaTExOwp9CmZ1bmN0aW9uIG4xMChpMTEsIHQ5ID0gZmFsc2UsIGUxMSA9IDApIHsKICBjb25zdCByMTEgPSB0aGlzLl8kQUgsIGg5ID0gdGhpcy5fJEFOOwogIGlmICh2b2lkIDAgIT09IGg5ICYmIDAgIT09IGg5LnNpemUpIGlmICh0OSkgaWYgKEFycmF5LmlzQXJyYXkocjExKSkgZm9yIChsZXQgaTEyID0gZTExOyBpMTIgPCByMTEubGVuZ3RoOyBpMTIrKykgczYocjExW2kxMl0sIGZhbHNlKSwgbzEwKHIxMVtpMTJdKTsKICBlbHNlIG51bGwgIT0gcjExICYmIChzNihyMTEsIGZhbHNlKSwgbzEwKHIxMSkpOwogIGVsc2UgczYodGhpcywgaTExKTsKfQp2YXIgczYsIG8xMCwgcjksIGM2LCBmNTsKdmFyIGluaXRfYXN5bmNfZGlyZWN0aXZlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2FzeW5jLWRpcmVjdGl2ZS5qcyIoKSB7CiAgICBpbml0X2RpcmVjdGl2ZV9oZWxwZXJzKCk7CiAgICBpbml0X2RpcmVjdGl2ZSgpOwogICAgaW5pdF9kaXJlY3RpdmUoKTsKICAgIHM2ID0gKGkxMSwgdDkpID0+IHsKICAgICAgY29uc3QgZTExID0gaTExLl8kQU47CiAgICAgIGlmICh2b2lkIDAgPT09IGUxMSkgcmV0dXJuIGZhbHNlOwogICAgICBmb3IgKGNvbnN0IGkxMiBvZiBlMTEpIGkxMi5fJEFPPy4odDksIGZhbHNlKSwgczYoaTEyLCB0OSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSwgbzEwID0gKGkxMSkgPT4gewogICAgICBsZXQgdDksIGUxMTsKICAgICAgZG8gewogICAgICAgIGlmICh2b2lkIDAgPT09ICh0OSA9IGkxMS5fJEFNKSkgYnJlYWs7CiAgICAgICAgZTExID0gdDkuXyRBTiwgZTExLmRlbGV0ZShpMTEpLCBpMTEgPSB0OTsKICAgICAgfSB3aGlsZSAoMCA9PT0gZTExPy5zaXplKTsKICAgIH0sIHI5ID0gKGkxMSkgPT4gewogICAgICBmb3IgKGxldCB0OTsgdDkgPSBpMTEuXyRBTTsgaTExID0gdDkpIHsKICAgICAgICBsZXQgZTExID0gdDkuXyRBTjsKICAgICAgICBpZiAodm9pZCAwID09PSBlMTEpIHQ5Ll8kQU4gPSBlMTEgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgICAgIGVsc2UgaWYgKGUxMS5oYXMoaTExKSkgYnJlYWs7CiAgICAgICAgZTExLmFkZChpMTEpLCBjNih0OSk7CiAgICAgIH0KICAgIH07CiAgICBjNiA9IChpMTEpID0+IHsKICAgICAgaTExLnR5cGUgPT0gdDMuQ0hJTEQgJiYgKGkxMS5fJEFQID8/PSBuMTAsIGkxMS5fJEFRID8/PSBoNSk7CiAgICB9OwogICAgZjUgPSBjbGFzcyBleHRlbmRzIGk2IHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5fJEFOID0gdm9pZCAwOwogICAgICB9CiAgICAgIF8kQVQoaTExLCB0OSwgZTExKSB7CiAgICAgICAgc3VwZXIuXyRBVChpMTEsIHQ5LCBlMTEpLCByOSh0aGlzKSwgdGhpcy5pc0Nvbm5lY3RlZCA9IGkxMS5fJEFVOwogICAgICB9CiAgICAgIF8kQU8oaTExLCB0OSA9IHRydWUpIHsKICAgICAgICBpMTEgIT09IHRoaXMuaXNDb25uZWN0ZWQgJiYgKHRoaXMuaXNDb25uZWN0ZWQgPSBpMTEsIGkxMSA/IHRoaXMucmVjb25uZWN0ZWQ/LigpIDogdGhpcy5kaXNjb25uZWN0ZWQ/LigpKSwgdDkgJiYgKHM2KHRoaXMsIGkxMSksIG8xMCh0aGlzKSk7CiAgICAgIH0KICAgICAgc2V0VmFsdWUodDkpIHsKICAgICAgICBpZiAocjgodGhpcy5fJEN0KSkgdGhpcy5fJEN0Ll8kQUkodDksIHRoaXMpOwogICAgICAgIGVsc2UgewogICAgICAgICAgY29uc3QgaTExID0gWy4uLnRoaXMuXyRDdC5fJEFIXTsKICAgICAgICAgIGkxMVt0aGlzLl8kQ2ldID0gdDksIHRoaXMuXyRDdC5fJEFJKGkxMSwgdGhpcywgMCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGRpc2Nvbm5lY3RlZCgpIHsKICAgICAgfQogICAgICByZWNvbm5lY3RlZCgpIHsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0L2FzeW5jLWRpcmVjdGl2ZS5qcwp2YXIgaW5pdF9hc3luY19kaXJlY3RpdmUyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbGl0QDMuMy4yL25vZGVfbW9kdWxlcy9saXQvYXN5bmMtZGlyZWN0aXZlLmpzIigpIHsKICAgIGluaXRfYXN5bmNfZGlyZWN0aXZlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4xLjYvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL2RpcmVjdGl2ZXMvY2xhc3Nlcy5yZXNvbHZlZGlyZWN0aXZlLmpzCnZhciBSZXNvbHZlRGlyZWN0aXZlLCByZXNvbHZlLCByZXNvbHZlRXhlYzsKdmFyIGluaXRfY2xhc3Nlc19yZXNvbHZlZGlyZWN0aXZlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1lbGVtZW50QDIuMS42L25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWVsZW1lbnQvZGlzdF90cy9kaXJlY3RpdmVzL2NsYXNzZXMucmVzb2x2ZWRpcmVjdGl2ZS5qcyIoKSB7CiAgICBpbml0X2xpdCgpOwogICAgaW5pdF9hc3luY19kaXJlY3RpdmUyKCk7CiAgICBSZXNvbHZlRGlyZWN0aXZlID0gY2xhc3MgZXh0ZW5kcyBmNSB7CiAgICAgIHByb21pc2U7CiAgICAgIGhhc1Byb21pc2VTZXR0bGVkID0gZmFsc2U7CiAgICAgIHJlbmRlcihwcm9taXNlKSB7CiAgICAgICAgaWYgKHRoaXMucHJvbWlzZSAhPT0gcHJvbWlzZSkgewogICAgICAgICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTsKICAgICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7CiAgICAgICAgICAgIHRoaXMuaGFuZGxlUHJvbWlzZShwcm9taXNlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIEU7CiAgICAgIH0KICAgICAgaGFuZGxlUHJvbWlzZShwcm9taXNlKSB7CiAgICAgICAgdGhpcy5oYXNQcm9taXNlU2V0dGxlZCA9IGZhbHNlOwogICAgICAgIHByb21pc2UudGhlbigodmFsdWUyKSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5wcm9taXNlID09PSBwcm9taXNlICYmICF0aGlzLmhhc1Byb21pc2VTZXR0bGVkKSB7CiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodmFsdWUyKTsKICAgICAgICAgICAgdGhpcy5oYXNQcm9taXNlU2V0dGxlZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5wcm9taXNlID09PSBwcm9taXNlICYmICF0aGlzLmhhc1Byb21pc2VTZXR0bGVkKSB7CiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoZXJyb3IpOwogICAgICAgICAgICB0aGlzLmhhc1Byb21pc2VTZXR0bGVkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICBkaXNjb25uZWN0ZWQoKSB7CiAgICAgICAgdGhpcy5oYXNQcm9taXNlU2V0dGxlZCA9IHRydWU7CiAgICAgIH0KICAgICAgcmVjb25uZWN0ZWQoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc1Byb21pc2VTZXR0bGVkKSB7CiAgICAgICAgICB0aGlzLmhhbmRsZVByb21pc2UodGhpcy5wcm9taXNlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICByZXNvbHZlID0gZTQoUmVzb2x2ZURpcmVjdGl2ZSk7CiAgICByZXNvbHZlRXhlYyA9IChmdW5jQXJnKSA9PiB7CiAgICAgIHJldHVybiByZXNvbHZlKGZ1bmNBcmcoKSk7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1lbGVtZW50QDIuMS42L25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWVsZW1lbnQvZGlzdF90cy9kaXJlY3RpdmVzL2NsYXNzZXMuc3Vic2NyaWJlZGlyZWN0aXZlLmpzCnZhciBTdWJzY3JpYmVEaXJlY3RpdmUsIHN1YnNjcmliZTsKdmFyIGluaXRfY2xhc3Nlc19zdWJzY3JpYmVkaXJlY3RpdmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4xLjYvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL2RpcmVjdGl2ZXMvY2xhc3Nlcy5zdWJzY3JpYmVkaXJlY3RpdmUuanMiKCkgewogICAgaW5pdF9saXQoKTsKICAgIGluaXRfYXN5bmNfZGlyZWN0aXZlMigpOwogICAgaW5pdF9kaXN0X3RzMigpOwogICAgU3Vic2NyaWJlRGlyZWN0aXZlID0gY2xhc3MgZXh0ZW5kcyBmNSB7CiAgICAgIG9ic2VydmFibGU7CiAgICAgIHN1YiA9IG51bGw7CiAgICAgIHJlbmRlcihvYnNlcnZhYmxlMikgewogICAgICAgIGlmICh0aGlzLm9ic2VydmFibGUgIT09IG9ic2VydmFibGUyKSB7CiAgICAgICAgICB0aGlzLnN1Yj8udW5zdWJzY3JpYmUoKTsKICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZSA9IG9ic2VydmFibGUyOwogICAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHsKICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmUob2JzZXJ2YWJsZTIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gRTsKICAgICAgfQogICAgICBzdWJzY3JpYmUob2JzZXJ2YWJsZTIpIHsKICAgICAgICB0aGlzLnN1YiA9IG9ic2VydmFibGUyLnN1YnNjcmliZSgodjUpID0+IHsKICAgICAgICAgIHRoaXMuc2V0VmFsdWUodjUpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGRpc2Nvbm5lY3RlZCgpIHsKICAgICAgICB0aGlzLnN1Yj8udW5zdWJzY3JpYmUoKTsKICAgICAgfQogICAgICByZWNvbm5lY3RlZCgpIHsKICAgICAgICB0aGlzLnN1YnNjcmliZSh0aGlzLm9ic2VydmFibGUpOwogICAgICB9CiAgICB9OwogICAgc3Vic2NyaWJlID0gZTQoU3Vic2NyaWJlRGlyZWN0aXZlKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjEuNi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvZGlyZWN0aXZlcy9jbGFzc2VzLnN1YnNjcmliZXdpdGh0ZW1wbGF0ZS5qcwp2YXIgU3Vic2NyaWJlV2l0aFRlbXBsYXRlRGlyZWN0aXZlLCBzdWJzY3JpYmVXaXRoVGVtcGxhdGU7CnZhciBpbml0X2NsYXNzZXNfc3Vic2NyaWJld2l0aHRlbXBsYXRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1lbGVtZW50QDIuMS42L25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWVsZW1lbnQvZGlzdF90cy9kaXJlY3RpdmVzL2NsYXNzZXMuc3Vic2NyaWJld2l0aHRlbXBsYXRlLmpzIigpIHsKICAgIGluaXRfbGl0KCk7CiAgICBpbml0X2FzeW5jX2RpcmVjdGl2ZTIoKTsKICAgIGluaXRfZGlzdF90czIoKTsKICAgIFN1YnNjcmliZVdpdGhUZW1wbGF0ZURpcmVjdGl2ZSA9IGNsYXNzIGV4dGVuZHMgZjUgewogICAgICBvYnNlcnZhYmxlOwogICAgICB0ZW1wbGF0ZUZuOwogICAgICBzdWIgPSBudWxsOwogICAgICByZW5kZXIob2JzZXJ2YWJsZTIsIHRlbXBsYXRlRm4pIHsKICAgICAgICBjb25zdCBjaGFuZ2VkID0gdGhpcy5vYnNlcnZhYmxlICE9PSBvYnNlcnZhYmxlMiB8fCB0aGlzLnRlbXBsYXRlRm4gIT09IHRlbXBsYXRlRm47CiAgICAgICAgaWYgKGNoYW5nZWQpIHsKICAgICAgICAgIHRoaXMuc3ViPy51bnN1YnNjcmliZSgpOwogICAgICAgICAgdGhpcy5vYnNlcnZhYmxlID0gb2JzZXJ2YWJsZTI7CiAgICAgICAgICB0aGlzLnRlbXBsYXRlRm4gPSB0ZW1wbGF0ZUZuOwogICAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHsKICAgICAgICAgICAgdGhpcy5zdGFydFN1YnNjcmlwdGlvbigpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gRTsKICAgICAgfQogICAgICBzdGFydFN1YnNjcmlwdGlvbigpIHsKICAgICAgICB0aGlzLnN1YiA9IHRoaXMub2JzZXJ2YWJsZS5zdWJzY3JpYmUoKHY1KSA9PiB7CiAgICAgICAgICBjb25zdCBvdXQgPSB0aGlzLnRlbXBsYXRlRm4odjUpOwogICAgICAgICAgdGhpcy5zZXRWYWx1ZShvdXQpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGRpc2Nvbm5lY3RlZCgpIHsKICAgICAgICB0aGlzLnN1Yj8udW5zdWJzY3JpYmUoKTsKICAgICAgfQogICAgICByZWNvbm5lY3RlZCgpIHsKICAgICAgICB0aGlzLnN0YXJ0U3Vic2NyaXB0aW9uKCk7CiAgICAgIH0KICAgIH07CiAgICBzdWJzY3JpYmVXaXRoVGVtcGxhdGUgPSBlNChTdWJzY3JpYmVXaXRoVGVtcGxhdGVEaXJlY3RpdmUpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RpcmVjdGl2ZXMvcHJpdmF0ZS1hc3luYy1oZWxwZXJzLmpzCnZhciB0NywgczcsIGk4Owp2YXIgaW5pdF9wcml2YXRlX2FzeW5jX2hlbHBlcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXQtaHRtbEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvZGlyZWN0aXZlcy9wcml2YXRlLWFzeW5jLWhlbHBlcnMuanMiKCkgewogICAgdDcgPSBhc3luYyAodDksIHM5KSA9PiB7CiAgICAgIGZvciBhd2FpdCAoY29uc3QgaTExIG9mIHQ5KSBpZiAoZmFsc2UgPT09IGF3YWl0IHM5KGkxMSkpIHJldHVybjsKICAgIH07CiAgICBzNyA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IodDkpIHsKICAgICAgICB0aGlzLkcgPSB0OTsKICAgICAgfQogICAgICBkaXNjb25uZWN0KCkgewogICAgICAgIHRoaXMuRyA9IHZvaWQgMDsKICAgICAgfQogICAgICByZWNvbm5lY3QodDkpIHsKICAgICAgICB0aGlzLkcgPSB0OTsKICAgICAgfQogICAgICBkZXJlZigpIHsKICAgICAgICByZXR1cm4gdGhpcy5HOwogICAgICB9CiAgICB9OwogICAgaTggPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuWSA9IHZvaWQgMCwgdGhpcy5aID0gdm9pZCAwOwogICAgICB9CiAgICAgIGdldCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5ZOwogICAgICB9CiAgICAgIHBhdXNlKCkgewogICAgICAgIHRoaXMuWSA/Pz0gbmV3IFByb21pc2UoKHQ5KSA9PiB0aGlzLlogPSB0OSk7CiAgICAgIH0KICAgICAgcmVzdW1lKCkgewogICAgICAgIHRoaXMuWj8uKCksIHRoaXMuWSA9IHRoaXMuWiA9IHZvaWQgMDsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmVzL3VudGlsLmpzCnZhciBuMTEsIGg2LCBjNywgbTQ7CnZhciBpbml0X3VudGlsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RpcmVjdGl2ZXMvdW50aWwuanMiKCkgewogICAgaW5pdF9saXRfaHRtbCgpOwogICAgaW5pdF9kaXJlY3RpdmVfaGVscGVycygpOwogICAgaW5pdF9hc3luY19kaXJlY3RpdmUoKTsKICAgIGluaXRfcHJpdmF0ZV9hc3luY19oZWxwZXJzKCk7CiAgICBpbml0X2RpcmVjdGl2ZSgpOwogICAgbjExID0gKHQ5KSA9PiAhbjkodDkpICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIHQ5LnRoZW4sIGg2ID0gMTA3Mzc0MTgyMzsKICAgIGM3ID0gY2xhc3MgZXh0ZW5kcyBmNSB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMuXyRDd3QgPSBoNiwgdGhpcy5fJENidCA9IFtdLCB0aGlzLl8kQ0sgPSBuZXcgczcodGhpcyksIHRoaXMuXyRDWCA9IG5ldyBpOCgpOwogICAgICB9CiAgICAgIHJlbmRlciguLi5zOSkgewogICAgICAgIHJldHVybiBzOS5maW5kKCh0OSkgPT4gIW4xMSh0OSkpID8/IEU7CiAgICAgIH0KICAgICAgdXBkYXRlKHM5LCBpMTEpIHsKICAgICAgICBjb25zdCBlMTEgPSB0aGlzLl8kQ2J0OwogICAgICAgIGxldCByMTEgPSBlMTEubGVuZ3RoOwogICAgICAgIHRoaXMuXyRDYnQgPSBpMTE7CiAgICAgICAgY29uc3QgbzEzID0gdGhpcy5fJENLLCBjMTEgPSB0aGlzLl8kQ1g7CiAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCB8fCB0aGlzLmRpc2Nvbm5lY3RlZCgpOwogICAgICAgIGZvciAobGV0IHQ5ID0gMDsgdDkgPCBpMTEubGVuZ3RoICYmICEodDkgPiB0aGlzLl8kQ3d0KTsgdDkrKykgewogICAgICAgICAgY29uc3QgczEwID0gaTExW3Q5XTsKICAgICAgICAgIGlmICghbjExKHMxMCkpIHJldHVybiB0aGlzLl8kQ3d0ID0gdDksIHMxMDsKICAgICAgICAgIHQ5IDwgcjExICYmIHMxMCA9PT0gZTExW3Q5XSB8fCAodGhpcy5fJEN3dCA9IGg2LCByMTEgPSAwLCBQcm9taXNlLnJlc29sdmUoczEwKS50aGVuKGFzeW5jICh0MTApID0+IHsKICAgICAgICAgICAgZm9yICg7IGMxMS5nZXQoKTsgKSBhd2FpdCBjMTEuZ2V0KCk7CiAgICAgICAgICAgIGNvbnN0IGkxMiA9IG8xMy5kZXJlZigpOwogICAgICAgICAgICBpZiAodm9pZCAwICE9PSBpMTIpIHsKICAgICAgICAgICAgICBjb25zdCBlMTIgPSBpMTIuXyRDYnQuaW5kZXhPZihzMTApOwogICAgICAgICAgICAgIGUxMiA+IC0xICYmIGUxMiA8IGkxMi5fJEN3dCAmJiAoaTEyLl8kQ3d0ID0gZTEyLCBpMTIuc2V0VmFsdWUodDEwKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEU7CiAgICAgIH0KICAgICAgZGlzY29ubmVjdGVkKCkgewogICAgICAgIHRoaXMuXyRDSy5kaXNjb25uZWN0KCksIHRoaXMuXyRDWC5wYXVzZSgpOwogICAgICB9CiAgICAgIHJlY29ubmVjdGVkKCkgewogICAgICAgIHRoaXMuXyRDSy5yZWNvbm5lY3QodGhpcyksIHRoaXMuXyRDWC5yZXN1bWUoKTsKICAgICAgfQogICAgfTsKICAgIG00ID0gZTQoYzcpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0QDMuMy4yL25vZGVfbW9kdWxlcy9saXQvZGlyZWN0aXZlcy91bnRpbC5qcwp2YXIgaW5pdF91bnRpbDIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXRAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC9kaXJlY3RpdmVzL3VudGlsLmpzIigpIHsKICAgIGluaXRfdW50aWwoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmVzL2FzeW5jLXJlcGxhY2UuanMKdmFyIG8xMSwgaDc7CnZhciBpbml0X2FzeW5jX3JlcGxhY2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXQtaHRtbEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvZGlyZWN0aXZlcy9hc3luYy1yZXBsYWNlLmpzIigpIHsKICAgIGluaXRfbGl0X2h0bWwoKTsKICAgIGluaXRfYXN5bmNfZGlyZWN0aXZlKCk7CiAgICBpbml0X3ByaXZhdGVfYXN5bmNfaGVscGVycygpOwogICAgaW5pdF9kaXJlY3RpdmUoKTsKICAgIG8xMSA9IGNsYXNzIGV4dGVuZHMgZjUgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLl8kQ0sgPSBuZXcgczcodGhpcyksIHRoaXMuXyRDWCA9IG5ldyBpOCgpOwogICAgICB9CiAgICAgIHJlbmRlcihpMTEsIHM5KSB7CiAgICAgICAgcmV0dXJuIEU7CiAgICAgIH0KICAgICAgdXBkYXRlKGkxMSwgW3M5LCByMTFdKSB7CiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQgfHwgdGhpcy5kaXNjb25uZWN0ZWQoKSwgczkgPT09IHRoaXMuXyRDSikgcmV0dXJuIEU7CiAgICAgICAgdGhpcy5fJENKID0gczk7CiAgICAgICAgbGV0IG4xMyA9IDA7CiAgICAgICAgY29uc3QgeyBfJENLOiBvMTMsIF8kQ1g6IGg5IH0gPSB0aGlzOwogICAgICAgIHJldHVybiB0NyhzOSwgYXN5bmMgKHQ5KSA9PiB7CiAgICAgICAgICBmb3IgKDsgaDkuZ2V0KCk7ICkgYXdhaXQgaDkuZ2V0KCk7CiAgICAgICAgICBjb25zdCBpMTIgPSBvMTMuZGVyZWYoKTsKICAgICAgICAgIGlmICh2b2lkIDAgIT09IGkxMikgewogICAgICAgICAgICBpZiAoaTEyLl8kQ0ogIT09IHM5KSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIHZvaWQgMCAhPT0gcjExICYmICh0OSA9IHIxMSh0OSwgbjEzKSksIGkxMi5jb21taXRWYWx1ZSh0OSwgbjEzKSwgbjEzKys7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9KSwgRTsKICAgICAgfQogICAgICBjb21taXRWYWx1ZSh0OSwgaTExKSB7CiAgICAgICAgdGhpcy5zZXRWYWx1ZSh0OSk7CiAgICAgIH0KICAgICAgZGlzY29ubmVjdGVkKCkgewogICAgICAgIHRoaXMuXyRDSy5kaXNjb25uZWN0KCksIHRoaXMuXyRDWC5wYXVzZSgpOwogICAgICB9CiAgICAgIHJlY29ubmVjdGVkKCkgewogICAgICAgIHRoaXMuXyRDSy5yZWNvbm5lY3QodGhpcyksIHRoaXMuXyRDWC5yZXN1bWUoKTsKICAgICAgfQogICAgfTsKICAgIGg3ID0gZTQobzExKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmVzL2FzeW5jLWFwcGVuZC5qcwp2YXIgYzg7CnZhciBpbml0X2FzeW5jX2FwcGVuZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmVzL2FzeW5jLWFwcGVuZC5qcyIoKSB7CiAgICBpbml0X2RpcmVjdGl2ZSgpOwogICAgaW5pdF9hc3luY19yZXBsYWNlKCk7CiAgICBpbml0X2RpcmVjdGl2ZV9oZWxwZXJzKCk7CiAgICBjOCA9IGU0KGNsYXNzIGV4dGVuZHMgbzExIHsKICAgICAgY29uc3RydWN0b3IocjExKSB7CiAgICAgICAgaWYgKHN1cGVyKHIxMSksIHIxMS50eXBlICE9PSB0My5DSElMRCkgdGhyb3cgRXJyb3IoImFzeW5jQXBwZW5kIGNhbiBvbmx5IGJlIHVzZWQgaW4gY2hpbGQgZXhwcmVzc2lvbnMiKTsKICAgICAgfQogICAgICB1cGRhdGUocjExLCBlMTEpIHsKICAgICAgICByZXR1cm4gdGhpcy5fJEN0dCA9IHIxMSwgc3VwZXIudXBkYXRlKHIxMSwgZTExKTsKICAgICAgfQogICAgICBjb21taXRWYWx1ZShyMTEsIGUxMSkgewogICAgICAgIDAgPT09IGUxMSAmJiBqMih0aGlzLl8kQ3R0KTsKICAgICAgICBjb25zdCBzOSA9IHYzKHRoaXMuXyRDdHQpOwogICAgICAgIHU0KHM5LCByMTEpOwogICAgICB9CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0L2RpcmVjdGl2ZXMvYXN5bmMtYXBwZW5kLmpzCnZhciBpbml0X2FzeW5jX2FwcGVuZDIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXRAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC9kaXJlY3RpdmVzL2FzeW5jLWFwcGVuZC5qcyIoKSB7CiAgICBpbml0X2FzeW5jX2FwcGVuZCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RpcmVjdGl2ZXMva2V5ZWQuanMKdmFyIGk5Owp2YXIgaW5pdF9rZXllZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmVzL2tleWVkLmpzIigpIHsKICAgIGluaXRfbGl0X2h0bWwoKTsKICAgIGluaXRfZGlyZWN0aXZlKCk7CiAgICBpbml0X2RpcmVjdGl2ZV9oZWxwZXJzKCk7CiAgICBpOSA9IGU0KGNsYXNzIGV4dGVuZHMgaTYgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLmtleSA9IEE7CiAgICAgIH0KICAgICAgcmVuZGVyKHIxMSwgdDkpIHsKICAgICAgICByZXR1cm4gdGhpcy5rZXkgPSByMTEsIHQ5OwogICAgICB9CiAgICAgIHVwZGF0ZShyMTEsIFt0OSwgZTExXSkgewogICAgICAgIHJldHVybiB0OSAhPT0gdGhpcy5rZXkgJiYgKHA1KHIxMSksIHRoaXMua2V5ID0gdDkpLCBlMTE7CiAgICAgIH0KICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0QDMuMy4yL25vZGVfbW9kdWxlcy9saXQvZGlyZWN0aXZlcy9rZXllZC5qcwp2YXIgaW5pdF9rZXllZDIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXRAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC9kaXJlY3RpdmVzL2tleWVkLmpzIigpIHsKICAgIGluaXRfa2V5ZWQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmVzL3JlcGVhdC5qcwp2YXIgdTUsIGM5Owp2YXIgaW5pdF9yZXBlYXQyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RpcmVjdGl2ZXMvcmVwZWF0LmpzIigpIHsKICAgIGluaXRfbGl0X2h0bWwoKTsKICAgIGluaXRfZGlyZWN0aXZlKCk7CiAgICBpbml0X2RpcmVjdGl2ZV9oZWxwZXJzKCk7CiAgICB1NSA9IChlMTEsIHM5LCB0OSkgPT4gewogICAgICBjb25zdCByMTEgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICBmb3IgKGxldCBsNiA9IHM5OyBsNiA8PSB0OTsgbDYrKykgcjExLnNldChlMTFbbDZdLCBsNik7CiAgICAgIHJldHVybiByMTE7CiAgICB9LCBjOSA9IGU0KGNsYXNzIGV4dGVuZHMgaTYgewogICAgICBjb25zdHJ1Y3RvcihlMTEpIHsKICAgICAgICBpZiAoc3VwZXIoZTExKSwgZTExLnR5cGUgIT09IHQzLkNISUxEKSB0aHJvdyBFcnJvcigicmVwZWF0KCkgY2FuIG9ubHkgYmUgdXNlZCBpbiB0ZXh0IGV4cHJlc3Npb25zIik7CiAgICAgIH0KICAgICAgZHQoZTExLCBzOSwgdDkpIHsKICAgICAgICBsZXQgcjExOwogICAgICAgIHZvaWQgMCA9PT0gdDkgPyB0OSA9IHM5IDogdm9pZCAwICE9PSBzOSAmJiAocjExID0gczkpOwogICAgICAgIGNvbnN0IGw2ID0gW10sIG8xMyA9IFtdOwogICAgICAgIGxldCBpMTEgPSAwOwogICAgICAgIGZvciAoY29uc3QgczEwIG9mIGUxMSkgbDZbaTExXSA9IHIxMSA/IHIxMShzMTAsIGkxMSkgOiBpMTEsIG8xM1tpMTFdID0gdDkoczEwLCBpMTEpLCBpMTErKzsKICAgICAgICByZXR1cm4geyB2YWx1ZXM6IG8xMywga2V5czogbDYgfTsKICAgICAgfQogICAgICByZW5kZXIoZTExLCBzOSwgdDkpIHsKICAgICAgICByZXR1cm4gdGhpcy5kdChlMTEsIHM5LCB0OSkudmFsdWVzOwogICAgICB9CiAgICAgIHVwZGF0ZShzOSwgW3Q5LCByMTEsIGMxMV0pIHsKICAgICAgICBjb25zdCBkNiA9IE0yKHM5KSwgeyB2YWx1ZXM6IHA3LCBrZXlzOiBhNSB9ID0gdGhpcy5kdCh0OSwgcjExLCBjMTEpOwogICAgICAgIGlmICghQXJyYXkuaXNBcnJheShkNikpIHJldHVybiB0aGlzLnV0ID0gYTUsIHA3OwogICAgICAgIGNvbnN0IGg5ID0gdGhpcy51dCA/Pz0gW10sIHY1ID0gW107CiAgICAgICAgbGV0IG02LCB5NSwgeDMgPSAwLCBqNCA9IGQ2Lmxlbmd0aCAtIDEsIGs0ID0gMCwgdzMgPSBwNy5sZW5ndGggLSAxOwogICAgICAgIGZvciAoOyB4MyA8PSBqNCAmJiBrNCA8PSB3MzsgKSBpZiAobnVsbCA9PT0gZDZbeDNdKSB4MysrOwogICAgICAgIGVsc2UgaWYgKG51bGwgPT09IGQ2W2o0XSkgajQtLTsKICAgICAgICBlbHNlIGlmIChoOVt4M10gPT09IGE1W2s0XSkgdjVbazRdID0gdTQoZDZbeDNdLCBwN1trNF0pLCB4MysrLCBrNCsrOwogICAgICAgIGVsc2UgaWYgKGg5W2o0XSA9PT0gYTVbdzNdKSB2NVt3M10gPSB1NChkNltqNF0sIHA3W3czXSksIGo0LS0sIHczLS07CiAgICAgICAgZWxzZSBpZiAoaDlbeDNdID09PSBhNVt3M10pIHY1W3czXSA9IHU0KGQ2W3gzXSwgcDdbdzNdKSwgdjMoczksIHY1W3czICsgMV0sIGQ2W3gzXSksIHgzKyssIHczLS07CiAgICAgICAgZWxzZSBpZiAoaDlbajRdID09PSBhNVtrNF0pIHY1W2s0XSA9IHU0KGQ2W2o0XSwgcDdbazRdKSwgdjMoczksIGQ2W3gzXSwgZDZbajRdKSwgajQtLSwgazQrKzsKICAgICAgICBlbHNlIGlmICh2b2lkIDAgPT09IG02ICYmIChtNiA9IHU1KGE1LCBrNCwgdzMpLCB5NSA9IHU1KGg5LCB4MywgajQpKSwgbTYuaGFzKGg5W3gzXSkpIGlmIChtNi5oYXMoaDlbajRdKSkgewogICAgICAgICAgY29uc3QgZTExID0geTUuZ2V0KGE1W2s0XSksIHQxMCA9IHZvaWQgMCAhPT0gZTExID8gZDZbZTExXSA6IG51bGw7CiAgICAgICAgICBpZiAobnVsbCA9PT0gdDEwKSB7CiAgICAgICAgICAgIGNvbnN0IGUxMiA9IHYzKHM5LCBkNlt4M10pOwogICAgICAgICAgICB1NChlMTIsIHA3W2s0XSksIHY1W2s0XSA9IGUxMjsKICAgICAgICAgIH0gZWxzZSB2NVtrNF0gPSB1NCh0MTAsIHA3W2s0XSksIHYzKHM5LCBkNlt4M10sIHQxMCksIGQ2W2UxMV0gPSBudWxsOwogICAgICAgICAgazQrKzsKICAgICAgICB9IGVsc2UgaDQoZDZbajRdKSwgajQtLTsKICAgICAgICBlbHNlIGg0KGQ2W3gzXSksIHgzKys7CiAgICAgICAgZm9yICg7IGs0IDw9IHczOyApIHsKICAgICAgICAgIGNvbnN0IGUxMSA9IHYzKHM5LCB2NVt3MyArIDFdKTsKICAgICAgICAgIHU0KGUxMSwgcDdbazRdKSwgdjVbazQrK10gPSBlMTE7CiAgICAgICAgfQogICAgICAgIGZvciAoOyB4MyA8PSBqNDsgKSB7CiAgICAgICAgICBjb25zdCBlMTEgPSBkNlt4MysrXTsKICAgICAgICAgIG51bGwgIT09IGUxMSAmJiBoNChlMTEpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy51dCA9IGE1LCBwNShzOSwgdjUpLCBFOwogICAgICB9CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzCnZhciBpbml0X3JlcGVhdDMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXRAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyIoKSB7CiAgICBpbml0X3JlcGVhdDIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjEuNi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvZGlyZWN0aXZlcy9pbmRleC5qcwp2YXIgZGlyZWN0aXZlc19leHBvcnRzID0ge307Cl9fZXhwb3J0KGRpcmVjdGl2ZXNfZXhwb3J0cywgewogIGFzeW5jQXBwZW5kOiAoKSA9PiBjOCwKICBrZXllZDogKCkgPT4gaTksCiAgcmVwZWF0OiAoKSA9PiBjOSwKICByZXNvbHZlOiAoKSA9PiByZXNvbHZlLAogIHJlc29sdmVFeGVjOiAoKSA9PiByZXNvbHZlRXhlYywKICBzdWJzY3JpYmU6ICgpID0+IHN1YnNjcmliZSwKICBzdWJzY3JpYmVXaXRoVGVtcGxhdGU6ICgpID0+IHN1YnNjcmliZVdpdGhUZW1wbGF0ZSwKICB1bnRpbDogKCkgPT4gbTQKfSk7CnZhciBpbml0X2RpcmVjdGl2ZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4xLjYvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL2RpcmVjdGl2ZXMvaW5kZXguanMiKCkgewogICAgaW5pdF9jbGFzc2VzX3Jlc29sdmVkaXJlY3RpdmUoKTsKICAgIGluaXRfY2xhc3Nlc19zdWJzY3JpYmVkaXJlY3RpdmUoKTsKICAgIGluaXRfY2xhc3Nlc19zdWJzY3JpYmV3aXRodGVtcGxhdGUoKTsKICAgIGluaXRfdW50aWwyKCk7CiAgICBpbml0X2FzeW5jX2FwcGVuZDIoKTsKICAgIGluaXRfa2V5ZWQyKCk7CiAgICBpbml0X3JlcGVhdDMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjEuNi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czI2ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czI2LCB7CiAgRGVlc0VsZW1lbnQ6ICgpID0+IERlZXNFbGVtZW50LAogIGNzczogKCkgPT4gaSwKICBjc3NNYW5hZ2VyOiAoKSA9PiBjc3NNYW5hZ2VyLAogIGN1c3RvbUVsZW1lbnQ6ICgpID0+IHQ0LAogIGRpcmVjdGl2ZXM6ICgpID0+IGRpcmVjdGl2ZXNfZXhwb3J0cywKICBkb210b29sczogKCkgPT4gZGlzdF90c19leHBvcnRzMjUsCiAgaHRtbDogKCkgPT4gYjIsCiAgcHJvcGVydHk6ICgpID0+IG41LAogIHF1ZXJ5OiAoKSA9PiBlNywKICBxdWVyeUFsbDogKCkgPT4gcjYsCiAgcXVlcnlBc3luYzogKCkgPT4gcjcsCiAgcmVuZGVyOiAoKSA9PiBELAogIHN0YXRlOiAoKSA9PiByNSwKICBzdGF0aWM6ICgpID0+IHUzLAogIHVuc2FmZUNTUzogKCkgPT4gciwKICB1bnNhZmVIVE1MOiAoKSA9PiBvOCwKICB1bnNhZmVTdGF0aWM6ICgpID0+IHM0Cn0pOwp2YXIgY3NzTWFuYWdlcjsKdmFyIGluaXRfZGlzdF90czI2ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1lbGVtZW50QDIuMS42L25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWVsZW1lbnQvZGlzdF90cy9pbmRleC5qcyIoKSB7CiAgICBpbml0X2NsYXNzZXNfY3NzbWFuYWdlcigpOwogICAgaW5pdF9saXQoKTsKICAgIGluaXRfc3RhdGljX2h0bWwoKTsKICAgIGluaXRfdW5zYWZlX2h0bWwyKCk7CiAgICBpbml0X2N1c3RvbV9lbGVtZW50MigpOwogICAgaW5pdF9kZWNvcmF0b3JzKCk7CiAgICBpbml0X2Rpc3RfdHMyNSgpOwogICAgaW5pdF9jbGFzc2VzX2RlZXNfZWxlbWVudCgpOwogICAgaW5pdF9kaXJlY3RpdmVzKCk7CiAgICBjc3NNYW5hZ2VyID0gQ3NzTWFuYWdlci5nZXRTaW5nbGV0b24oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMHRoZW1lLmpzCnZhciB0aGVtZURlZmF1bHRzLCB0aGVtZURlZmF1bHRTdHlsZXM7CnZhciBpbml0X3RoZW1lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwdGhlbWUuanMiKCkgewogICAgaW5pdF9kaXN0X3RzMjYoKTsKICAgIHRoZW1lRGVmYXVsdHMgPSB7CiAgICAgIGNvbG9yczogewogICAgICAgIGxpZ2h0OiB7CiAgICAgICAgICBiZ1ByaW1hcnk6ICIjZmZmZmZmIiwKICAgICAgICAgIGJnU2Vjb25kYXJ5OiAiI2ZhZmFmYSIsCiAgICAgICAgICBiZ1RlcnRpYXJ5OiAiI2Y0ZjRmNSIsCiAgICAgICAgICB0ZXh0UHJpbWFyeTogIiMwOTA5MGIiLAogICAgICAgICAgdGV4dFNlY29uZGFyeTogIiMzNzQxNTEiLAogICAgICAgICAgdGV4dE11dGVkOiAiIzcxNzE3YSIsCiAgICAgICAgICBib3JkZXJEZWZhdWx0OiAiI2U1ZTdlYiIsCiAgICAgICAgICBib3JkZXJTdWJ0bGU6ICIjZjRmNGY1IiwKICAgICAgICAgIGJvcmRlclN0cm9uZzogIiNkMWQ1ZGIiLAogICAgICAgICAgYWNjZW50UHJpbWFyeTogIiMzYjgyZjYiLAogICAgICAgICAgYWNjZW50U3VjY2VzczogIiMyMmM1NWUiLAogICAgICAgICAgYWNjZW50V2FybmluZzogIiNmNTllMGIiLAogICAgICAgICAgYWNjZW50RXJyb3I6ICIjZWY0NDQ0IgogICAgICAgIH0sCiAgICAgICAgZGFyazogewogICAgICAgICAgYmdQcmltYXJ5OiAiIzA5MDkwYiIsCiAgICAgICAgICBiZ1NlY29uZGFyeTogIiMwYTBhMGEiLAogICAgICAgICAgYmdUZXJ0aWFyeTogIiMxODE4MWIiLAogICAgICAgICAgdGV4dFByaW1hcnk6ICIjZmFmYWZhIiwKICAgICAgICAgIHRleHRTZWNvbmRhcnk6ICIjZDRkNGQ4IiwKICAgICAgICAgIHRleHRNdXRlZDogIiNhMWExYWEiLAogICAgICAgICAgYm9yZGVyRGVmYXVsdDogIiMyNzI3MmEiLAogICAgICAgICAgYm9yZGVyU3VidGxlOiAiIzFhMWExYSIsCiAgICAgICAgICBib3JkZXJTdHJvbmc6ICIjM2YzZjQ2IiwKICAgICAgICAgIGFjY2VudFByaW1hcnk6ICIjM2I4MmY2IiwKICAgICAgICAgIGFjY2VudFN1Y2Nlc3M6ICIjMjJjNTVlIiwKICAgICAgICAgIGFjY2VudFdhcm5pbmc6ICIjZjU5ZTBiIiwKICAgICAgICAgIGFjY2VudEVycm9yOiAiI2VmNDQ0NCIKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHNwYWNpbmc6IHsKICAgICAgICB4czogIjRweCIsCiAgICAgICAgc206ICI4cHgiLAogICAgICAgIG1kOiAiMTJweCIsCiAgICAgICAgbGc6ICIxNnB4IiwKICAgICAgICB4bDogIjI0cHgiLAogICAgICAgICIyeGwiOiAiMzJweCIsCiAgICAgICAgIjN4bCI6ICI0OHB4IgogICAgICB9LAogICAgICByYWRpdXM6IHsKICAgICAgICB4czogIjJweCIsCiAgICAgICAgc206ICI0cHgiLAogICAgICAgIG1kOiAiNnB4IiwKICAgICAgICBsZzogIjhweCIsCiAgICAgICAgeGw6ICIxMnB4IiwKICAgICAgICBmdWxsOiAiOTk5cHgiCiAgICAgIH0sCiAgICAgIHNoYWRvd3M6IHsKICAgICAgICB4czogIjAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpIiwKICAgICAgICBzbTogIjAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSkiLAogICAgICAgIG1kOiAiMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xNSkiLAogICAgICAgIGxnOiAiMCA0cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuMTUpIgogICAgICB9LAogICAgICB0cmFuc2l0aW9uczogewogICAgICAgIGZhc3Q6ICIwLjFzIiwKICAgICAgICBkZWZhdWx0OiAiMC4xNXMiLAogICAgICAgIHNsb3c6ICIwLjJzIiwKICAgICAgICBzbG93ZXI6ICIwLjNzIgogICAgICB9LAogICAgICBjb250cm9sSGVpZ2h0czogewogICAgICAgIHNtOiAiMzJweCIsCiAgICAgICAgbWQ6ICIzNnB4IiwKICAgICAgICBsZzogIjQwcHgiLAogICAgICAgIHhsOiAiNDhweCIKICAgICAgfQogICAgfTsKICAgIHRoZW1lRGVmYXVsdFN0eWxlcyA9IGlgCiAgOmhvc3QgewogICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICogU3BhY2luZyBTY2FsZQogICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogICAgLS1kZWVzLXNwYWNpbmcteHM6IDRweDsKICAgIC0tZGVlcy1zcGFjaW5nLXNtOiA4cHg7CiAgICAtLWRlZXMtc3BhY2luZy1tZDogMTJweDsKICAgIC0tZGVlcy1zcGFjaW5nLWxnOiAxNnB4OwogICAgLS1kZWVzLXNwYWNpbmcteGw6IDI0cHg7CiAgICAtLWRlZXMtc3BhY2luZy0yeGw6IDMycHg7CiAgICAtLWRlZXMtc3BhY2luZy0zeGw6IDQ4cHg7CgogICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICogQm9yZGVyIFJhZGl1cyBTY2FsZQogICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogICAgLS1kZWVzLXJhZGl1cy14czogMnB4OwogICAgLS1kZWVzLXJhZGl1cy1zbTogNHB4OwogICAgLS1kZWVzLXJhZGl1cy1tZDogNnB4OwogICAgLS1kZWVzLXJhZGl1cy1sZzogOHB4OwogICAgLS1kZWVzLXJhZGl1cy14bDogMTJweDsKICAgIC0tZGVlcy1yYWRpdXMtZnVsbDogOTk5cHg7CgogICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICogU2hhZG93IEVsZXZhdGlvbiBTY2FsZQogICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogICAgLS1kZWVzLXNoYWRvdy14czogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gMC4wNSk7CiAgICAtLWRlZXMtc2hhZG93LXNtOiAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEpOwogICAgLS1kZWVzLXNoYWRvdy1tZDogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7CiAgICAtLWRlZXMtc2hhZG93LWxnOiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7CgogICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICogVHJhbnNpdGlvbiBEdXJhdGlvbiBTY2FsZQogICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogICAgLS1kZWVzLXRyYW5zaXRpb24tZmFzdDogMC4xczsKICAgIC0tZGVlcy10cmFuc2l0aW9uLWRlZmF1bHQ6IDAuMTVzOwogICAgLS1kZWVzLXRyYW5zaXRpb24tc2xvdzogMC4yczsKICAgIC0tZGVlcy10cmFuc2l0aW9uLXNsb3dlcjogMC4zczsKCiAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgKiBDb250cm9sIEhlaWdodCBTY2FsZQogICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogICAgLS1kZWVzLWNvbnRyb2wtaGVpZ2h0LXNtOiAzMnB4OwogICAgLS1kZWVzLWNvbnRyb2wtaGVpZ2h0LW1kOiAzNnB4OwogICAgLS1kZWVzLWNvbnRyb2wtaGVpZ2h0LWxnOiA0MHB4OwogICAgLS1kZWVzLWNvbnRyb2wtaGVpZ2h0LXhsOiA0OHB4OwogIH0KYDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0Bmb3J0YXdlc29tZStmb250YXdlc29tZS1zdmctY29yZUA3LjEuMC9ub2RlX21vZHVsZXMvQGZvcnRhd2Vzb21lL2ZvbnRhd2Vzb21lLXN2Zy1jb3JlL2luZGV4Lm1qcwpmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShyMTEsIGE1KSB7CiAgKG51bGwgPT0gYTUgfHwgYTUgPiByMTEubGVuZ3RoKSAmJiAoYTUgPSByMTEubGVuZ3RoKTsKICBmb3IgKHZhciBlMTEgPSAwLCBuMTMgPSBBcnJheShhNSk7IGUxMSA8IGE1OyBlMTErKykgbjEzW2UxMV0gPSByMTFbZTExXTsKICByZXR1cm4gbjEzOwp9CmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhyMTEpIHsKICBpZiAoQXJyYXkuaXNBcnJheShyMTEpKSByZXR1cm4gcjExOwp9CmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhyMTEpIHsKICBpZiAoQXJyYXkuaXNBcnJheShyMTEpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkocjExKTsKfQpmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soYTUsIG4xMykgewogIGlmICghKGE1IGluc3RhbmNlb2YgbjEzKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7Cn0KZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMoZTExLCByMTEpIHsKICBmb3IgKHZhciB0OSA9IDA7IHQ5IDwgcjExLmxlbmd0aDsgdDkrKykgewogICAgdmFyIG8xMyA9IHIxMVt0OV07CiAgICBvMTMuZW51bWVyYWJsZSA9IG8xMy5lbnVtZXJhYmxlIHx8IGZhbHNlLCBvMTMuY29uZmlndXJhYmxlID0gdHJ1ZSwgInZhbHVlIiBpbiBvMTMgJiYgKG8xMy53cml0YWJsZSA9IHRydWUpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZTExLCBfdG9Qcm9wZXJ0eUtleShvMTMua2V5KSwgbzEzKTsKICB9Cn0KZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKGUxMSwgcjExLCB0OSkgewogIHJldHVybiByMTEgJiYgX2RlZmluZVByb3BlcnRpZXMoZTExLnByb3RvdHlwZSwgcjExKSwgdDkgJiYgX2RlZmluZVByb3BlcnRpZXMoZTExLCB0OSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlMTEsICJwcm90b3R5cGUiLCB7CiAgICB3cml0YWJsZTogZmFsc2UKICB9KSwgZTExOwp9CmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHIxMSwgZTExKSB7CiAgdmFyIHQ5ID0gInVuZGVmaW5lZCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByMTFbU3ltYm9sLml0ZXJhdG9yXSB8fCByMTFbIkBAaXRlcmF0b3IiXTsKICBpZiAoIXQ5KSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShyMTEpIHx8ICh0OSA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyMTEpKSB8fCBlMTEgJiYgcjExICYmICJudW1iZXIiID09IHR5cGVvZiByMTEubGVuZ3RoKSB7CiAgICAgIHQ5ICYmIChyMTEgPSB0OSk7CiAgICAgIHZhciBuMTMgPSAwLCBGMiA9IGZ1bmN0aW9uKCkgewogICAgICB9OwogICAgICByZXR1cm4gewogICAgICAgIHM6IEYyLAogICAgICAgIG46IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIG4xMyA+PSByMTEubGVuZ3RoID8gewogICAgICAgICAgICBkb25lOiB0cnVlCiAgICAgICAgICB9IDogewogICAgICAgICAgICBkb25lOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWU6IHIxMVtuMTMrK10KICAgICAgICAgIH07CiAgICAgICAgfSwKICAgICAgICBlOiBmdW5jdGlvbihyMTIpIHsKICAgICAgICAgIHRocm93IHIxMjsKICAgICAgICB9LAogICAgICAgIGY6IEYyCiAgICAgIH07CiAgICB9CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7CiAgfQogIHZhciBvMTMsIGE1ID0gdHJ1ZSwgdTcgPSBmYWxzZTsKICByZXR1cm4gewogICAgczogZnVuY3Rpb24oKSB7CiAgICAgIHQ5ID0gdDkuY2FsbChyMTEpOwogICAgfSwKICAgIG46IGZ1bmN0aW9uKCkgewogICAgICB2YXIgcjEyID0gdDkubmV4dCgpOwogICAgICByZXR1cm4gYTUgPSByMTIuZG9uZSwgcjEyOwogICAgfSwKICAgIGU6IGZ1bmN0aW9uKHIxMikgewogICAgICB1NyA9IHRydWUsIG8xMyA9IHIxMjsKICAgIH0sCiAgICBmOiBmdW5jdGlvbigpIHsKICAgICAgdHJ5IHsKICAgICAgICBhNSB8fCBudWxsID09IHQ5LnJldHVybiB8fCB0OS5yZXR1cm4oKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBpZiAodTcpIHRocm93IG8xMzsKICAgICAgfQogICAgfQogIH07Cn0KZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KGUxMSwgcjExLCB0OSkgewogIHJldHVybiAocjExID0gX3RvUHJvcGVydHlLZXkocjExKSkgaW4gZTExID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUxMSwgcjExLCB7CiAgICB2YWx1ZTogdDksCiAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgd3JpdGFibGU6IHRydWUKICB9KSA6IGUxMVtyMTFdID0gdDksIGUxMTsKfQpmdW5jdGlvbiBfaW5oZXJpdHModDksIGUxMSkgewogIGlmICgiZnVuY3Rpb24iICE9IHR5cGVvZiBlMTEgJiYgbnVsbCAhPT0gZTExKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOwogIHQ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZTExICYmIGUxMS5wcm90b3R5cGUsIHsKICAgIGNvbnN0cnVjdG9yOiB7CiAgICAgIHZhbHVlOiB0OSwKICAgICAgd3JpdGFibGU6IHRydWUsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfQogIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodDksICJwcm90b3R5cGUiLCB7CiAgICB3cml0YWJsZTogZmFsc2UKICB9KSwgZTExICYmIF9zZXRQcm90b3R5cGVPZih0OSwgZTExKTsKfQpmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KHIxMSkgewogIGlmICgidW5kZWZpbmVkIiAhPSB0eXBlb2YgU3ltYm9sICYmIG51bGwgIT0gcjExW1N5bWJvbC5pdGVyYXRvcl0gfHwgbnVsbCAhPSByMTFbIkBAaXRlcmF0b3IiXSkgcmV0dXJuIEFycmF5LmZyb20ocjExKTsKfQpmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQocjExLCBsNikgewogIHZhciB0OSA9IG51bGwgPT0gcjExID8gbnVsbCA6ICJ1bmRlZmluZWQiICE9IHR5cGVvZiBTeW1ib2wgJiYgcjExW1N5bWJvbC5pdGVyYXRvcl0gfHwgcjExWyJAQGl0ZXJhdG9yIl07CiAgaWYgKG51bGwgIT0gdDkpIHsKICAgIHZhciBlMTEsIG4xMywgaTExLCB1NywgYTUgPSBbXSwgZjcgPSB0cnVlLCBvMTMgPSBmYWxzZTsKICAgIHRyeSB7CiAgICAgIGlmIChpMTEgPSAodDkgPSB0OS5jYWxsKHIxMSkpLm5leHQsIDAgPT09IGw2KSB7CiAgICAgICAgaWYgKE9iamVjdCh0OSkgIT09IHQ5KSByZXR1cm47CiAgICAgICAgZjcgPSBmYWxzZTsKICAgICAgfSBlbHNlIGZvciAoOyAhKGY3ID0gKGUxMSA9IGkxMS5jYWxsKHQ5KSkuZG9uZSkgJiYgKGE1LnB1c2goZTExLnZhbHVlKSwgYTUubGVuZ3RoICE9PSBsNik7IGY3ID0gdHJ1ZSkgOwogICAgfSBjYXRjaCAocjEyKSB7CiAgICAgIG8xMyA9IHRydWUsIG4xMyA9IHIxMjsKICAgIH0gZmluYWxseSB7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKCFmNyAmJiBudWxsICE9IHQ5LnJldHVybiAmJiAodTcgPSB0OS5yZXR1cm4oKSwgT2JqZWN0KHU3KSAhPT0gdTcpKSByZXR1cm47CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgaWYgKG8xMykgdGhyb3cgbjEzOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYTU7CiAgfQp9CmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7CiAgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKTsKfQpmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7CiAgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7Cn0KZnVuY3Rpb24gb3duS2V5czIoZTExLCByMTEpIHsKICB2YXIgdDkgPSBPYmplY3Qua2V5cyhlMTEpOwogIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICB2YXIgbzEzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlMTEpOwogICAgcjExICYmIChvMTMgPSBvMTMuZmlsdGVyKGZ1bmN0aW9uKHIxMikgewogICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlMTEsIHIxMikuZW51bWVyYWJsZTsKICAgIH0pKSwgdDkucHVzaC5hcHBseSh0OSwgbzEzKTsKICB9CiAgcmV0dXJuIHQ5Owp9CmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKGUxMSkgewogIGZvciAodmFyIHIxMSA9IDE7IHIxMSA8IGFyZ3VtZW50cy5sZW5ndGg7IHIxMSsrKSB7CiAgICB2YXIgdDkgPSBudWxsICE9IGFyZ3VtZW50c1tyMTFdID8gYXJndW1lbnRzW3IxMV0gOiB7fTsKICAgIHIxMSAlIDIgPyBvd25LZXlzMihPYmplY3QodDkpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uKHIxMikgewogICAgICBfZGVmaW5lUHJvcGVydHkoZTExLCByMTIsIHQ5W3IxMl0pOwogICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUxMSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModDkpKSA6IG93bktleXMyKE9iamVjdCh0OSkpLmZvckVhY2goZnVuY3Rpb24ocjEyKSB7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlMTEsIHIxMiwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0OSwgcjEyKSk7CiAgICB9KTsKICB9CiAgcmV0dXJuIGUxMTsKfQpmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YodDksIGUxMSkgewogIHJldHVybiBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24odDEwLCBlMTIpIHsKICAgIHJldHVybiB0MTAuX19wcm90b19fID0gZTEyLCB0MTA7CiAgfSwgX3NldFByb3RvdHlwZU9mKHQ5LCBlMTEpOwp9CmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KHIxMSwgZTExKSB7CiAgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhyMTEpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChyMTEsIGUxMSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIxMSwgZTExKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7Cn0KZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KHIxMSkgewogIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMocjExKSB8fCBfaXRlcmFibGVUb0FycmF5KHIxMSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIxMSkgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7Cn0KZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQ5LCByMTEpIHsKICBpZiAoIm9iamVjdCIgIT0gdHlwZW9mIHQ5IHx8ICF0OSkgcmV0dXJuIHQ5OwogIHZhciBlMTEgPSB0OVtTeW1ib2wudG9QcmltaXRpdmVdOwogIGlmICh2b2lkIDAgIT09IGUxMSkgewogICAgdmFyIGkxMSA9IGUxMS5jYWxsKHQ5LCByMTEgfHwgImRlZmF1bHQiKTsKICAgIGlmICgib2JqZWN0IiAhPSB0eXBlb2YgaTExKSByZXR1cm4gaTExOwogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKTsKICB9CiAgcmV0dXJuICgic3RyaW5nIiA9PT0gcjExID8gU3RyaW5nIDogTnVtYmVyKSh0OSk7Cn0KZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodDkpIHsKICB2YXIgaTExID0gX3RvUHJpbWl0aXZlKHQ5LCAic3RyaW5nIik7CiAgcmV0dXJuICJzeW1ib2wiID09IHR5cGVvZiBpMTEgPyBpMTEgOiBpMTEgKyAiIjsKfQpmdW5jdGlvbiBfdHlwZW9mKG8xMykgewogICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7CiAgcmV0dXJuIF90eXBlb2YgPSAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgInN5bWJvbCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uKG8xNCkgewogICAgcmV0dXJuIHR5cGVvZiBvMTQ7CiAgfSA6IGZ1bmN0aW9uKG8xNCkgewogICAgcmV0dXJuIG8xNCAmJiAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgbzE0LmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbzE0ICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2YgbzE0OwogIH0sIF90eXBlb2YobzEzKTsKfQpmdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkocjExLCBhNSkgewogIGlmIChyMTEpIHsKICAgIGlmICgic3RyaW5nIiA9PSB0eXBlb2YgcjExKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkocjExLCBhNSk7CiAgICB2YXIgdDkgPSB7fS50b1N0cmluZy5jYWxsKHIxMSkuc2xpY2UoOCwgLTEpOwogICAgcmV0dXJuICJPYmplY3QiID09PSB0OSAmJiByMTEuY29uc3RydWN0b3IgJiYgKHQ5ID0gcjExLmNvbnN0cnVjdG9yLm5hbWUpLCAiTWFwIiA9PT0gdDkgfHwgIlNldCIgPT09IHQ5ID8gQXJyYXkuZnJvbShyMTEpIDogIkFyZ3VtZW50cyIgPT09IHQ5IHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHQ5KSA/IF9hcnJheUxpa2VUb0FycmF5KHIxMSwgYTUpIDogdm9pZCAwOwogIH0KfQpmdW5jdGlvbiBfd3JhcFJlZ0V4cCgpIHsKICBfd3JhcFJlZ0V4cCA9IGZ1bmN0aW9uKGUxMiwgcjEyKSB7CiAgICByZXR1cm4gbmV3IEJhYmVsUmVnRXhwKGUxMiwgdm9pZCAwLCByMTIpOwogIH07CiAgdmFyIGUxMSA9IFJlZ0V4cC5wcm90b3R5cGUsIHIxMSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogIGZ1bmN0aW9uIEJhYmVsUmVnRXhwKGUxMiwgdDksIHA3KSB7CiAgICB2YXIgbzEzID0gUmVnRXhwKGUxMiwgdDkpOwogICAgcmV0dXJuIHIxMS5zZXQobzEzLCBwNyB8fCByMTEuZ2V0KGUxMikpLCBfc2V0UHJvdG90eXBlT2YobzEzLCBCYWJlbFJlZ0V4cC5wcm90b3R5cGUpOwogIH0KICBmdW5jdGlvbiBidWlsZEdyb3VwcyhlMTIsIHQ5KSB7CiAgICB2YXIgcDcgPSByMTEuZ2V0KHQ5KTsKICAgIHJldHVybiBPYmplY3Qua2V5cyhwNykucmVkdWNlKGZ1bmN0aW9uKHIxMiwgdDEwKSB7CiAgICAgIHZhciBvMTMgPSBwN1t0MTBdOwogICAgICBpZiAoIm51bWJlciIgPT0gdHlwZW9mIG8xMykgcjEyW3QxMF0gPSBlMTJbbzEzXTsKICAgICAgZWxzZSB7CiAgICAgICAgZm9yICh2YXIgaTExID0gMDsgdm9pZCAwID09PSBlMTJbbzEzW2kxMV1dICYmIGkxMSArIDEgPCBvMTMubGVuZ3RoOyApIGkxMSsrOwogICAgICAgIHIxMlt0MTBdID0gZTEyW28xM1tpMTFdXTsKICAgICAgfQogICAgICByZXR1cm4gcjEyOwogICAgfSwgLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCkpOwogIH0KICByZXR1cm4gX2luaGVyaXRzKEJhYmVsUmVnRXhwLCBSZWdFeHApLCBCYWJlbFJlZ0V4cC5wcm90b3R5cGUuZXhlYyA9IGZ1bmN0aW9uKHIxMikgewogICAgdmFyIHQ5ID0gZTExLmV4ZWMuY2FsbCh0aGlzLCByMTIpOwogICAgaWYgKHQ5KSB7CiAgICAgIHQ5Lmdyb3VwcyA9IGJ1aWxkR3JvdXBzKHQ5LCB0aGlzKTsKICAgICAgdmFyIHA3ID0gdDkuaW5kaWNlczsKICAgICAgcDcgJiYgKHA3Lmdyb3VwcyA9IGJ1aWxkR3JvdXBzKHA3LCB0aGlzKSk7CiAgICB9CiAgICByZXR1cm4gdDk7CiAgfSwgQmFiZWxSZWdFeHAucHJvdG90eXBlW1N5bWJvbC5yZXBsYWNlXSA9IGZ1bmN0aW9uKHQ5LCBwNykgewogICAgaWYgKCJzdHJpbmciID09IHR5cGVvZiBwNykgewogICAgICB2YXIgbzEzID0gcjExLmdldCh0aGlzKTsKICAgICAgcmV0dXJuIGUxMVtTeW1ib2wucmVwbGFjZV0uY2FsbCh0aGlzLCB0OSwgcDcucmVwbGFjZSgvXCQ8KFtePl0rKSg+fCQpL2csIGZ1bmN0aW9uKGUxMiwgcjEyLCB0MTApIHsKICAgICAgICBpZiAoIiIgPT09IHQxMCkgcmV0dXJuIGUxMjsKICAgICAgICB2YXIgcDggPSBvMTNbcjEyXTsKICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwOCkgPyAiJCIgKyBwOC5qb2luKCIkIikgOiAibnVtYmVyIiA9PSB0eXBlb2YgcDggPyAiJCIgKyBwOCA6ICIiOwogICAgICB9KSk7CiAgICB9CiAgICBpZiAoImZ1bmN0aW9uIiA9PSB0eXBlb2YgcDcpIHsKICAgICAgdmFyIGkxMSA9IHRoaXM7CiAgICAgIHJldHVybiBlMTFbU3ltYm9sLnJlcGxhY2VdLmNhbGwodGhpcywgdDksIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBlMTIgPSBhcmd1bWVudHM7CiAgICAgICAgcmV0dXJuICJvYmplY3QiICE9IHR5cGVvZiBlMTJbZTEyLmxlbmd0aCAtIDFdICYmIChlMTIgPSBbXS5zbGljZS5jYWxsKGUxMikpLnB1c2goYnVpbGRHcm91cHMoZTEyLCBpMTEpKSwgcDcuYXBwbHkodGhpcywgZTEyKTsKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gZTExW1N5bWJvbC5yZXBsYWNlXS5jYWxsKHRoaXMsIHQ5LCBwNyk7CiAgfSwgX3dyYXBSZWdFeHAuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfQpmdW5jdGlvbiBmYW1pbHlQcm94eShvYmopIHsKICByZXR1cm4gbmV3IFByb3h5KG9iaiwgewogICAgZ2V0OiBmdW5jdGlvbiBnZXQyKHRhcmdldCwgcHJvcCkgewogICAgICByZXR1cm4gcHJvcCBpbiB0YXJnZXQgPyB0YXJnZXRbcHJvcF0gOiB0YXJnZXRbaTEwXTsKICAgIH0KICB9KTsKfQpmdW5jdGlvbiBnZXRBdHRyQ29uZmlnKGF0dHIpIHsKICB2YXIgZWxlbWVudDQgPSBET0NVTUVOVC5xdWVyeVNlbGVjdG9yKCJzY3JpcHRbIiArIGF0dHIgKyAiXSIpOwogIGlmIChlbGVtZW50NCkgewogICAgcmV0dXJuIGVsZW1lbnQ0LmdldEF0dHJpYnV0ZShhdHRyKTsKICB9Cn0KZnVuY3Rpb24gY29lcmNlKHZhbCkgewogIGlmICh2YWwgPT09ICIiKSByZXR1cm4gdHJ1ZTsKICBpZiAodmFsID09PSAiZmFsc2UiKSByZXR1cm4gZmFsc2U7CiAgaWYgKHZhbCA9PT0gInRydWUiKSByZXR1cm4gdHJ1ZTsKICByZXR1cm4gdmFsOwp9CmZ1bmN0aW9uIG9uQ2hhbmdlKGNiKSB7CiAgX29uQ2hhbmdlQ2IucHVzaChjYik7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgX29uQ2hhbmdlQ2Iuc3BsaWNlKF9vbkNoYW5nZUNiLmluZGV4T2YoY2IpLCAxKTsKICB9Owp9CmZ1bmN0aW9uIGluc2VydENzcyhjc3MxMSkgewogIGlmICghY3NzMTEgfHwgIUlTX0RPTSkgewogICAgcmV0dXJuOwogIH0KICB2YXIgc3R5bGUgPSBET0NVTUVOVC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogIHN0eWxlLnNldEF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0L2NzcyIpOwogIHN0eWxlLmlubmVySFRNTCA9IGNzczExOwogIHZhciBoZWFkQ2hpbGRyZW4gPSBET0NVTUVOVC5oZWFkLmNoaWxkTm9kZXM7CiAgdmFyIGJlZm9yZUNoaWxkID0gbnVsbDsKICBmb3IgKHZhciBpMTEgPSBoZWFkQ2hpbGRyZW4ubGVuZ3RoIC0gMTsgaTExID4gLTE7IGkxMS0tKSB7CiAgICB2YXIgY2hpbGQgPSBoZWFkQ2hpbGRyZW5baTExXTsKICAgIHZhciB0YWdOYW1lID0gKGNoaWxkLnRhZ05hbWUgfHwgIiIpLnRvVXBwZXJDYXNlKCk7CiAgICBpZiAoWyJTVFlMRSIsICJMSU5LIl0uaW5kZXhPZih0YWdOYW1lKSA+IC0xKSB7CiAgICAgIGJlZm9yZUNoaWxkID0gY2hpbGQ7CiAgICB9CiAgfQogIERPQ1VNRU5ULmhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBiZWZvcmVDaGlsZCk7CiAgcmV0dXJuIGNzczExOwp9CmZ1bmN0aW9uIG5leHRVbmlxdWVJZCgpIHsKICB2YXIgc2l6ZSA9IDEyOwogIHZhciBpZCA9ICIiOwogIHdoaWxlIChzaXplLS0gPiAwKSB7CiAgICBpZCArPSBpZFBvb2xbTWF0aC5yYW5kb20oKSAqIDYyIHwgMF07CiAgfQogIHJldHVybiBpZDsKfQpmdW5jdGlvbiB0b0FycmF5MihvYmopIHsKICB2YXIgYXJyYXkgPSBbXTsKICBmb3IgKHZhciBpMTEgPSAob2JqIHx8IFtdKS5sZW5ndGggPj4+IDA7IGkxMS0tOyApIHsKICAgIGFycmF5W2kxMV0gPSBvYmpbaTExXTsKICB9CiAgcmV0dXJuIGFycmF5Owp9CmZ1bmN0aW9uIGNsYXNzQXJyYXkobm9kZTIpIHsKICBpZiAobm9kZTIuY2xhc3NMaXN0KSB7CiAgICByZXR1cm4gdG9BcnJheTIobm9kZTIuY2xhc3NMaXN0KTsKICB9IGVsc2UgewogICAgcmV0dXJuIChub2RlMi5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIpLnNwbGl0KCIgIikuZmlsdGVyKGZ1bmN0aW9uKGkxMSkgewogICAgICByZXR1cm4gaTExOwogICAgfSk7CiAgfQp9CmZ1bmN0aW9uIGh0bWxFc2NhcGUoc3RyKSB7CiAgcmV0dXJuICIiLmNvbmNhdChzdHIpLnJlcGxhY2UoLyYvZywgIiZhbXA7IikucmVwbGFjZSgvIi9nLCAiJnF1b3Q7IikucmVwbGFjZSgvJy9nLCAiJiMzOTsiKS5yZXBsYWNlKC88L2csICImbHQ7IikucmVwbGFjZSgvPi9nLCAiJmd0OyIpOwp9CmZ1bmN0aW9uIGpvaW5BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpIHsKICByZXR1cm4gT2JqZWN0LmtleXMoYXR0cmlidXRlcyB8fCB7fSkucmVkdWNlKGZ1bmN0aW9uKGFjYywgYXR0cmlidXRlTmFtZSkgewogICAgcmV0dXJuIGFjYyArICIiLmNvbmNhdChhdHRyaWJ1dGVOYW1lLCAnPSInKS5jb25jYXQoaHRtbEVzY2FwZShhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdKSwgJyIgJyk7CiAgfSwgIiIpLnRyaW0oKTsKfQpmdW5jdGlvbiBqb2luU3R5bGVzKHN0eWxlczMpIHsKICByZXR1cm4gT2JqZWN0LmtleXMoc3R5bGVzMyB8fCB7fSkucmVkdWNlKGZ1bmN0aW9uKGFjYywgc3R5bGVOYW1lKSB7CiAgICByZXR1cm4gYWNjICsgIiIuY29uY2F0KHN0eWxlTmFtZSwgIjogIikuY29uY2F0KHN0eWxlczNbc3R5bGVOYW1lXS50cmltKCksICI7Iik7CiAgfSwgIiIpOwp9CmZ1bmN0aW9uIHRyYW5zZm9ybUlzTWVhbmluZ2Z1bCh0cmFuc2Zvcm0yKSB7CiAgcmV0dXJuIHRyYW5zZm9ybTIuc2l6ZSAhPT0gbWVhbmluZ2xlc3NUcmFuc2Zvcm0uc2l6ZSB8fCB0cmFuc2Zvcm0yLnggIT09IG1lYW5pbmdsZXNzVHJhbnNmb3JtLnggfHwgdHJhbnNmb3JtMi55ICE9PSBtZWFuaW5nbGVzc1RyYW5zZm9ybS55IHx8IHRyYW5zZm9ybTIucm90YXRlICE9PSBtZWFuaW5nbGVzc1RyYW5zZm9ybS5yb3RhdGUgfHwgdHJhbnNmb3JtMi5mbGlwWCB8fCB0cmFuc2Zvcm0yLmZsaXBZOwp9CmZ1bmN0aW9uIHRyYW5zZm9ybUZvclN2ZyhfcmVmMikgewogIHZhciB0cmFuc2Zvcm0yID0gX3JlZjIudHJhbnNmb3JtLCBjb250YWluZXJXaWR0aCA9IF9yZWYyLmNvbnRhaW5lcldpZHRoLCBpY29uV2lkdGggPSBfcmVmMi5pY29uV2lkdGg7CiAgdmFyIG91dGVyID0gewogICAgdHJhbnNmb3JtOiAidHJhbnNsYXRlKCIuY29uY2F0KGNvbnRhaW5lcldpZHRoIC8gMiwgIiAyNTYpIikKICB9OwogIHZhciBpbm5lclRyYW5zbGF0ZSA9ICJ0cmFuc2xhdGUoIi5jb25jYXQodHJhbnNmb3JtMi54ICogMzIsICIsICIpLmNvbmNhdCh0cmFuc2Zvcm0yLnkgKiAzMiwgIikgIik7CiAgdmFyIGlubmVyU2NhbGUgPSAic2NhbGUoIi5jb25jYXQodHJhbnNmb3JtMi5zaXplIC8gMTYgKiAodHJhbnNmb3JtMi5mbGlwWCA/IC0xIDogMSksICIsICIpLmNvbmNhdCh0cmFuc2Zvcm0yLnNpemUgLyAxNiAqICh0cmFuc2Zvcm0yLmZsaXBZID8gLTEgOiAxKSwgIikgIik7CiAgdmFyIGlubmVyUm90YXRlID0gInJvdGF0ZSgiLmNvbmNhdCh0cmFuc2Zvcm0yLnJvdGF0ZSwgIiAwIDApIik7CiAgdmFyIGlubmVyID0gewogICAgdHJhbnNmb3JtOiAiIi5jb25jYXQoaW5uZXJUcmFuc2xhdGUsICIgIikuY29uY2F0KGlubmVyU2NhbGUsICIgIikuY29uY2F0KGlubmVyUm90YXRlKQogIH07CiAgdmFyIHBhdGgyID0gewogICAgdHJhbnNmb3JtOiAidHJhbnNsYXRlKCIuY29uY2F0KGljb25XaWR0aCAvIDIgKiAtMSwgIiAtMjU2KSIpCiAgfTsKICByZXR1cm4gewogICAgb3V0ZXIsCiAgICBpbm5lciwKICAgIHBhdGg6IHBhdGgyCiAgfTsKfQpmdW5jdGlvbiB0cmFuc2Zvcm1Gb3JDc3MoX3JlZjIpIHsKICB2YXIgdHJhbnNmb3JtMiA9IF9yZWYyLnRyYW5zZm9ybSwgX3JlZjIkd2lkdGggPSBfcmVmMi53aWR0aCwgd2lkdGggPSBfcmVmMiR3aWR0aCA9PT0gdm9pZCAwID8gVU5JVFNfSU5fR1JJRCA6IF9yZWYyJHdpZHRoLCBfcmVmMiRoZWlnaHQgPSBfcmVmMi5oZWlnaHQsIGhlaWdodCA9IF9yZWYyJGhlaWdodCA9PT0gdm9pZCAwID8gVU5JVFNfSU5fR1JJRCA6IF9yZWYyJGhlaWdodCwgX3JlZjIkc3RhcnRDZW50ZXJlZCA9IF9yZWYyLnN0YXJ0Q2VudGVyZWQsIHN0YXJ0Q2VudGVyZWQgPSBfcmVmMiRzdGFydENlbnRlcmVkID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYyJHN0YXJ0Q2VudGVyZWQ7CiAgdmFyIHZhbCA9ICIiOwogIGlmIChzdGFydENlbnRlcmVkICYmIElTX0lFKSB7CiAgICB2YWwgKz0gInRyYW5zbGF0ZSgiLmNvbmNhdCh0cmFuc2Zvcm0yLnggLyBkJDIgLSB3aWR0aCAvIDIsICJlbSwgIikuY29uY2F0KHRyYW5zZm9ybTIueSAvIGQkMiAtIGhlaWdodCAvIDIsICJlbSkgIik7CiAgfSBlbHNlIGlmIChzdGFydENlbnRlcmVkKSB7CiAgICB2YWwgKz0gInRyYW5zbGF0ZShjYWxjKC01MCUgKyAiLmNvbmNhdCh0cmFuc2Zvcm0yLnggLyBkJDIsICJlbSksIGNhbGMoLTUwJSArICIpLmNvbmNhdCh0cmFuc2Zvcm0yLnkgLyBkJDIsICJlbSkpICIpOwogIH0gZWxzZSB7CiAgICB2YWwgKz0gInRyYW5zbGF0ZSgiLmNvbmNhdCh0cmFuc2Zvcm0yLnggLyBkJDIsICJlbSwgIikuY29uY2F0KHRyYW5zZm9ybTIueSAvIGQkMiwgImVtKSAiKTsKICB9CiAgdmFsICs9ICJzY2FsZSgiLmNvbmNhdCh0cmFuc2Zvcm0yLnNpemUgLyBkJDIgKiAodHJhbnNmb3JtMi5mbGlwWCA/IC0xIDogMSksICIsICIpLmNvbmNhdCh0cmFuc2Zvcm0yLnNpemUgLyBkJDIgKiAodHJhbnNmb3JtMi5mbGlwWSA/IC0xIDogMSksICIpICIpOwogIHZhbCArPSAicm90YXRlKCIuY29uY2F0KHRyYW5zZm9ybTIucm90YXRlLCAiZGVnKSAiKTsKICByZXR1cm4gdmFsOwp9CmZ1bmN0aW9uIGNzcygpIHsKICB2YXIgZGNwID0gREVGQVVMVF9DU1NfUFJFRklYOwogIHZhciBkcmMgPSBERUZBVUxUX1JFUExBQ0VNRU5UX0NMQVNTOwogIHZhciBmcCA9IGNvbmZpZzIuY3NzUHJlZml4OwogIHZhciByYyA9IGNvbmZpZzIucmVwbGFjZW1lbnRDbGFzczsKICB2YXIgczkgPSBiYXNlU3R5bGVzOwogIGlmIChmcCAhPT0gZGNwIHx8IHJjICE9PSBkcmMpIHsKICAgIHZhciBkUGF0dCA9IG5ldyBSZWdFeHAoIlxcLiIuY29uY2F0KGRjcCwgIlxcLSIpLCAiZyIpOwogICAgdmFyIGN1c3RvbVByb3BQYXR0ID0gbmV3IFJlZ0V4cCgiXFwtLSIuY29uY2F0KGRjcCwgIlxcLSIpLCAiZyIpOwogICAgdmFyIHJQYXR0ID0gbmV3IFJlZ0V4cCgiXFwuIi5jb25jYXQoZHJjKSwgImciKTsKICAgIHM5ID0gczkucmVwbGFjZShkUGF0dCwgIi4iLmNvbmNhdChmcCwgIi0iKSkucmVwbGFjZShjdXN0b21Qcm9wUGF0dCwgIi0tIi5jb25jYXQoZnAsICItIikpLnJlcGxhY2UoclBhdHQsICIuIi5jb25jYXQocmMpKTsKICB9CiAgcmV0dXJuIHM5Owp9CmZ1bmN0aW9uIGVuc3VyZUNzcygpIHsKICBpZiAoY29uZmlnMi5hdXRvQWRkQ3NzICYmICFfY3NzSW5zZXJ0ZWQpIHsKICAgIGluc2VydENzcyhjc3MoKSk7CiAgICBfY3NzSW5zZXJ0ZWQgPSB0cnVlOwogIH0KfQpmdW5jdGlvbiBkb21yZWFkeShmbikgewogIGlmICghSVNfRE9NKSByZXR1cm47CiAgbG9hZGVkID8gc2V0VGltZW91dChmbiwgMCkgOiBmdW5jdGlvbnMucHVzaChmbik7Cn0KZnVuY3Rpb24gdG9IdG1sMihhYnN0cmFjdE5vZGVzKSB7CiAgdmFyIHRhZyA9IGFic3RyYWN0Tm9kZXMudGFnLCBfYWJzdHJhY3ROb2RlcyRhdHRyaWIgPSBhYnN0cmFjdE5vZGVzLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMgPSBfYWJzdHJhY3ROb2RlcyRhdHRyaWIgPT09IHZvaWQgMCA/IHt9IDogX2Fic3RyYWN0Tm9kZXMkYXR0cmliLCBfYWJzdHJhY3ROb2RlcyRjaGlsZHIgPSBhYnN0cmFjdE5vZGVzLmNoaWxkcmVuLCBjaGlsZHJlbjIgPSBfYWJzdHJhY3ROb2RlcyRjaGlsZHIgPT09IHZvaWQgMCA/IFtdIDogX2Fic3RyYWN0Tm9kZXMkY2hpbGRyOwogIGlmICh0eXBlb2YgYWJzdHJhY3ROb2RlcyA9PT0gInN0cmluZyIpIHsKICAgIHJldHVybiBodG1sRXNjYXBlKGFic3RyYWN0Tm9kZXMpOwogIH0gZWxzZSB7CiAgICByZXR1cm4gIjwiLmNvbmNhdCh0YWcsICIgIikuY29uY2F0KGpvaW5BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpLCAiPiIpLmNvbmNhdChjaGlsZHJlbjIubWFwKHRvSHRtbDIpLmpvaW4oIiIpLCAiPC8iKS5jb25jYXQodGFnLCAiPiIpOwogIH0KfQpmdW5jdGlvbiBpY29uRnJvbU1hcHBpbmcobWFwcGluZywgcHJlZml4NCwgaWNvbk5hbWUpIHsKICBpZiAobWFwcGluZyAmJiBtYXBwaW5nW3ByZWZpeDRdICYmIG1hcHBpbmdbcHJlZml4NF1baWNvbk5hbWVdKSB7CiAgICByZXR1cm4gewogICAgICBwcmVmaXg6IHByZWZpeDQsCiAgICAgIGljb25OYW1lLAogICAgICBpY29uOiBtYXBwaW5nW3ByZWZpeDRdW2ljb25OYW1lXQogICAgfTsKICB9Cn0KZnVuY3Rpb24gdG9IZXgodW5pY29kZSkgewogIGlmIChfdG9Db25zdW1hYmxlQXJyYXkodW5pY29kZSkubGVuZ3RoICE9PSAxKSByZXR1cm4gbnVsbDsKICByZXR1cm4gdW5pY29kZS5jb2RlUG9pbnRBdCgwKS50b1N0cmluZygxNik7Cn0KZnVuY3Rpb24gbm9ybWFsaXplSWNvbnMoaWNvbnM2KSB7CiAgcmV0dXJuIE9iamVjdC5rZXlzKGljb25zNikucmVkdWNlKGZ1bmN0aW9uKGFjYywgaWNvbk5hbWUpIHsKICAgIHZhciBpY29uMyA9IGljb25zNltpY29uTmFtZV07CiAgICB2YXIgZXhwYW5kZWQgPSAhIWljb24zLmljb247CiAgICBpZiAoZXhwYW5kZWQpIHsKICAgICAgYWNjW2ljb24zLmljb25OYW1lXSA9IGljb24zLmljb247CiAgICB9IGVsc2UgewogICAgICBhY2NbaWNvbk5hbWVdID0gaWNvbjM7CiAgICB9CiAgICByZXR1cm4gYWNjOwogIH0sIHt9KTsKfQpmdW5jdGlvbiBkZWZpbmVJY29ucyhwcmVmaXg0LCBpY29uczYpIHsKICB2YXIgcGFyYW1zMiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdm9pZCAwID8gYXJndW1lbnRzWzJdIDoge307CiAgdmFyIF9wYXJhbXMkc2tpcEhvb2tzID0gcGFyYW1zMi5za2lwSG9va3MsIHNraXBIb29rcyA9IF9wYXJhbXMkc2tpcEhvb2tzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wYXJhbXMkc2tpcEhvb2tzOwogIHZhciBub3JtYWxpemVkID0gbm9ybWFsaXplSWNvbnMoaWNvbnM2KTsKICBpZiAodHlwZW9mIG5hbWVzcGFjZS5ob29rcy5hZGRQYWNrID09PSAiZnVuY3Rpb24iICYmICFza2lwSG9va3MpIHsKICAgIG5hbWVzcGFjZS5ob29rcy5hZGRQYWNrKHByZWZpeDQsIG5vcm1hbGl6ZUljb25zKGljb25zNikpOwogIH0gZWxzZSB7CiAgICBuYW1lc3BhY2Uuc3R5bGVzW3ByZWZpeDRdID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG5hbWVzcGFjZS5zdHlsZXNbcHJlZml4NF0gfHwge30pLCBub3JtYWxpemVkKTsKICB9CiAgaWYgKHByZWZpeDQgPT09ICJmYXMiKSB7CiAgICBkZWZpbmVJY29ucygiZmEiLCBpY29uczYpOwogIH0KfQpmdW5jdGlvbiBpc1Jlc2VydmVkKG5hbWUpIHsKICByZXR1cm4gflJFU0VSVkVEX0NMQVNTRVMuaW5kZXhPZihuYW1lKTsKfQpmdW5jdGlvbiBnZXRJY29uTmFtZShjc3NQcmVmaXgsIGNscykgewogIHZhciBwYXJ0cyA9IGNscy5zcGxpdCgiLSIpOwogIHZhciBwcmVmaXg0ID0gcGFydHNbMF07CiAgdmFyIGljb25OYW1lID0gcGFydHMuc2xpY2UoMSkuam9pbigiLSIpOwogIGlmIChwcmVmaXg0ID09PSBjc3NQcmVmaXggJiYgaWNvbk5hbWUgIT09ICIiICYmICFpc1Jlc2VydmVkKGljb25OYW1lKSkgewogICAgcmV0dXJuIGljb25OYW1lOwogIH0gZWxzZSB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KZnVuY3Rpb24gYnlVbmljb2RlKHByZWZpeDQsIHVuaWNvZGUpIHsKICByZXR1cm4gKF9ieVVuaWNvZGVbcHJlZml4NF0gfHwge30pW3VuaWNvZGVdOwp9CmZ1bmN0aW9uIGJ5TGlnYXR1cmUocHJlZml4NCwgbGlnYXR1cmUpIHsKICByZXR1cm4gKF9ieUxpZ2F0dXJlW3ByZWZpeDRdIHx8IHt9KVtsaWdhdHVyZV07Cn0KZnVuY3Rpb24gYnlBbGlhcyhwcmVmaXg0LCBhbGlhcykgewogIHJldHVybiAoX2J5QWxpYXNbcHJlZml4NF0gfHwge30pW2FsaWFzXTsKfQpmdW5jdGlvbiBieU9sZE5hbWUobmFtZSkgewogIHJldHVybiBfYnlPbGROYW1lW25hbWVdIHx8IHsKICAgIHByZWZpeDogbnVsbCwKICAgIGljb25OYW1lOiBudWxsCiAgfTsKfQpmdW5jdGlvbiBieU9sZFVuaWNvZGUodW5pY29kZSkgewogIHZhciBvbGRVbmljb2RlID0gX2J5T2xkVW5pY29kZVt1bmljb2RlXTsKICB2YXIgbmV3VW5pY29kZSA9IGJ5VW5pY29kZSgiZmFzIiwgdW5pY29kZSk7CiAgcmV0dXJuIG9sZFVuaWNvZGUgfHwgKG5ld1VuaWNvZGUgPyB7CiAgICBwcmVmaXg6ICJmYXMiLAogICAgaWNvbk5hbWU6IG5ld1VuaWNvZGUKICB9IDogbnVsbCkgfHwgewogICAgcHJlZml4OiBudWxsLAogICAgaWNvbk5hbWU6IG51bGwKICB9Owp9CmZ1bmN0aW9uIGdldERlZmF1bHRVc2FibGVQcmVmaXgoKSB7CiAgcmV0dXJuIF9kZWZhdWx0VXNhYmxlUHJlZml4Owp9CmZ1bmN0aW9uIGdldEZhbWlseUlkKHZhbHVlcykgewogIHZhciBmYW1pbHkgPSBpMTA7CiAgdmFyIGZhbVByb3BzID0gRkFNSUxZX05BTUVTLnJlZHVjZShmdW5jdGlvbihhY2MsIGZhbWlseUlkKSB7CiAgICBhY2NbZmFtaWx5SWRdID0gIiIuY29uY2F0KGNvbmZpZzIuY3NzUHJlZml4LCAiLSIpLmNvbmNhdChmYW1pbHlJZCk7CiAgICByZXR1cm4gYWNjOwogIH0sIHt9KTsKICBydC5mb3JFYWNoKGZ1bmN0aW9uKGZhbWlseUlkKSB7CiAgICBpZiAodmFsdWVzLmluY2x1ZGVzKGZhbVByb3BzW2ZhbWlseUlkXSkgfHwgdmFsdWVzLnNvbWUoZnVuY3Rpb24odiQkMSkgewogICAgICByZXR1cm4gUFJFRklYRVNfRk9SX0ZBTUlMWVtmYW1pbHlJZF0uaW5jbHVkZXModiQkMSk7CiAgICB9KSkgewogICAgICBmYW1pbHkgPSBmYW1pbHlJZDsKICAgIH0KICB9KTsKICByZXR1cm4gZmFtaWx5Owp9CmZ1bmN0aW9uIGdldENhbm9uaWNhbFByZWZpeChzdHlsZU9yUHJlZml4KSB7CiAgdmFyIHBhcmFtczIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1sxXSA6IHt9OwogIHZhciBfcGFyYW1zJGZhbWlseSA9IHBhcmFtczIuZmFtaWx5LCBmYW1pbHkgPSBfcGFyYW1zJGZhbWlseSA9PT0gdm9pZCAwID8gaTEwIDogX3BhcmFtcyRmYW1pbHk7CiAgdmFyIHN0eWxlID0gUFJFRklYX1RPX1NUWUxFW2ZhbWlseV1bc3R5bGVPclByZWZpeF07CiAgaWYgKGZhbWlseSA9PT0gdDggJiYgIXN0eWxlT3JQcmVmaXgpIHsKICAgIHJldHVybiAiZmFkIjsKICB9CiAgdmFyIHByZWZpeDQgPSBTVFlMRV9UT19QUkVGSVhbZmFtaWx5XVtzdHlsZU9yUHJlZml4XSB8fCBTVFlMRV9UT19QUkVGSVhbZmFtaWx5XVtzdHlsZV07CiAgdmFyIGRlZmluZWQgPSBzdHlsZU9yUHJlZml4IGluIG5hbWVzcGFjZS5zdHlsZXMgPyBzdHlsZU9yUHJlZml4IDogbnVsbDsKICB2YXIgcmVzdWx0ID0gcHJlZml4NCB8fCBkZWZpbmVkIHx8IG51bGw7CiAgcmV0dXJuIHJlc3VsdDsKfQpmdW5jdGlvbiBtb3ZlTm9uRmFDbGFzc2VzVG9SZXN0KGNsYXNzTmFtZXMpIHsKICB2YXIgcmVzdCA9IFtdOwogIHZhciBpY29uTmFtZSA9IG51bGw7CiAgY2xhc3NOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uKGNscykgewogICAgdmFyIHJlc3VsdCA9IGdldEljb25OYW1lKGNvbmZpZzIuY3NzUHJlZml4LCBjbHMpOwogICAgaWYgKHJlc3VsdCkgewogICAgICBpY29uTmFtZSA9IHJlc3VsdDsKICAgIH0gZWxzZSBpZiAoY2xzKSB7CiAgICAgIHJlc3QucHVzaChjbHMpOwogICAgfQogIH0pOwogIHJldHVybiB7CiAgICBpY29uTmFtZSwKICAgIHJlc3QKICB9Owp9CmZ1bmN0aW9uIHNvcnRlZFVuaXF1ZVZhbHVlcyhhcnIpIHsKICByZXR1cm4gYXJyLnNvcnQoKS5maWx0ZXIoZnVuY3Rpb24odmFsdWUyLCBpbmRleDIsIGFycjIpIHsKICAgIHJldHVybiBhcnIyLmluZGV4T2YodmFsdWUyKSA9PT0gaW5kZXgyOwogIH0pOwp9CmZ1bmN0aW9uIGdldENhbm9uaWNhbEljb24odmFsdWVzKSB7CiAgdmFyIHBhcmFtczIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1sxXSA6IHt9OwogIHZhciBfcGFyYW1zJHNraXBMb29rdXBzID0gcGFyYW1zMi5za2lwTG9va3Vwcywgc2tpcExvb2t1cHMgPSBfcGFyYW1zJHNraXBMb29rdXBzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wYXJhbXMkc2tpcExvb2t1cHM7CiAgdmFyIGdpdmVuUHJlZml4ID0gbnVsbDsKICB2YXIgZmFTdHlsZU9yRmFtaWx5Q2xhc3NlcyA9IHNvcnRlZFVuaXF1ZVZhbHVlcyh2YWx1ZXMuZmlsdGVyKGZ1bmN0aW9uKGNscykgewogICAgcmV0dXJuIF9mYUNvbWJpbmVkQ2xhc3Nlcy5pbmNsdWRlcyhjbHMpOwogIH0pKTsKICB2YXIgbm9uU3R5bGVPckZhbWlseUNsYXNzZXMgPSBzb3J0ZWRVbmlxdWVWYWx1ZXModmFsdWVzLmZpbHRlcihmdW5jdGlvbihjbHMpIHsKICAgIHJldHVybiAhX2ZhQ29tYmluZWRDbGFzc2VzLmluY2x1ZGVzKGNscyk7CiAgfSkpOwogIHZhciBmYVN0eWxlcyA9IGZhU3R5bGVPckZhbWlseUNsYXNzZXMuZmlsdGVyKGZ1bmN0aW9uKGNscykgewogICAgZ2l2ZW5QcmVmaXggPSBjbHM7CiAgICByZXR1cm4gIVEuaW5jbHVkZXMoY2xzKTsKICB9KTsKICB2YXIgX2ZhU3R5bGVzID0gX3NsaWNlZFRvQXJyYXkoZmFTdHlsZXMsIDEpLCBfZmFTdHlsZXMkID0gX2ZhU3R5bGVzWzBdLCBzdHlsZUZyb21WYWx1ZXMgPSBfZmFTdHlsZXMkID09PSB2b2lkIDAgPyBudWxsIDogX2ZhU3R5bGVzJDsKICB2YXIgZmFtaWx5ID0gZ2V0RmFtaWx5SWQoZmFTdHlsZU9yRmFtaWx5Q2xhc3Nlcyk7CiAgdmFyIGNhbm9uaWNhbCA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBtb3ZlTm9uRmFDbGFzc2VzVG9SZXN0KG5vblN0eWxlT3JGYW1pbHlDbGFzc2VzKSksIHt9LCB7CiAgICBwcmVmaXg6IGdldENhbm9uaWNhbFByZWZpeChzdHlsZUZyb21WYWx1ZXMsIHsKICAgICAgZmFtaWx5CiAgICB9KQogIH0pOwogIHJldHVybiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgY2Fub25pY2FsKSwgZ2V0RGVmYXVsdENhbm9uaWNhbFByZWZpeCh7CiAgICB2YWx1ZXMsCiAgICBmYW1pbHksCiAgICBzdHlsZXM6IHN0eWxlczIsCiAgICBjb25maWc6IGNvbmZpZzIsCiAgICBjYW5vbmljYWwsCiAgICBnaXZlblByZWZpeAogIH0pKSwgYXBwbHlTaGltQW5kQWxpYXMoc2tpcExvb2t1cHMsIGdpdmVuUHJlZml4LCBjYW5vbmljYWwpKTsKfQpmdW5jdGlvbiBhcHBseVNoaW1BbmRBbGlhcyhza2lwTG9va3VwcywgZ2l2ZW5QcmVmaXgsIGNhbm9uaWNhbCkgewogIHZhciBwcmVmaXg0ID0gY2Fub25pY2FsLnByZWZpeCwgaWNvbk5hbWUgPSBjYW5vbmljYWwuaWNvbk5hbWU7CiAgaWYgKHNraXBMb29rdXBzIHx8ICFwcmVmaXg0IHx8ICFpY29uTmFtZSkgewogICAgcmV0dXJuIHsKICAgICAgcHJlZml4OiBwcmVmaXg0LAogICAgICBpY29uTmFtZQogICAgfTsKICB9CiAgdmFyIHNoaW0gPSBnaXZlblByZWZpeCA9PT0gImZhIiA/IGJ5T2xkTmFtZShpY29uTmFtZSkgOiB7fTsKICB2YXIgYWxpYXNJY29uTmFtZSA9IGJ5QWxpYXMocHJlZml4NCwgaWNvbk5hbWUpOwogIGljb25OYW1lID0gc2hpbS5pY29uTmFtZSB8fCBhbGlhc0ljb25OYW1lIHx8IGljb25OYW1lOwogIHByZWZpeDQgPSBzaGltLnByZWZpeCB8fCBwcmVmaXg0OwogIGlmIChwcmVmaXg0ID09PSAiZmFyIiAmJiAhc3R5bGVzMlsiZmFyIl0gJiYgc3R5bGVzMlsiZmFzIl0gJiYgIWNvbmZpZzIuYXV0b0ZldGNoU3ZnKSB7CiAgICBwcmVmaXg0ID0gImZhcyI7CiAgfQogIHJldHVybiB7CiAgICBwcmVmaXg6IHByZWZpeDQsCiAgICBpY29uTmFtZQogIH07Cn0KZnVuY3Rpb24gZ2V0RGVmYXVsdENhbm9uaWNhbFByZWZpeChwcmVmaXhPcHRpb25zKSB7CiAgdmFyIHZhbHVlcyA9IHByZWZpeE9wdGlvbnMudmFsdWVzLCBmYW1pbHkgPSBwcmVmaXhPcHRpb25zLmZhbWlseSwgY2Fub25pY2FsID0gcHJlZml4T3B0aW9ucy5jYW5vbmljYWwsIF9wcmVmaXhPcHRpb25zJGdpdmVuUCA9IHByZWZpeE9wdGlvbnMuZ2l2ZW5QcmVmaXgsIGdpdmVuUHJlZml4ID0gX3ByZWZpeE9wdGlvbnMkZ2l2ZW5QID09PSB2b2lkIDAgPyAiIiA6IF9wcmVmaXhPcHRpb25zJGdpdmVuUCwgX3ByZWZpeE9wdGlvbnMkc3R5bGVzID0gcHJlZml4T3B0aW9ucy5zdHlsZXMsIHN0eWxlczMgPSBfcHJlZml4T3B0aW9ucyRzdHlsZXMgPT09IHZvaWQgMCA/IHt9IDogX3ByZWZpeE9wdGlvbnMkc3R5bGVzLCBfcHJlZml4T3B0aW9ucyRjb25maWcgPSBwcmVmaXhPcHRpb25zLmNvbmZpZywgY29uZmlnJCQxID0gX3ByZWZpeE9wdGlvbnMkY29uZmlnID09PSB2b2lkIDAgPyB7fSA6IF9wcmVmaXhPcHRpb25zJGNvbmZpZzsKICB2YXIgaXNEdW90b25lRmFtaWx5ID0gZmFtaWx5ID09PSB0ODsKICB2YXIgdmFsdWVzSGFzRHVvdG9uZSA9IHZhbHVlcy5pbmNsdWRlcygiZmEtZHVvdG9uZSIpIHx8IHZhbHVlcy5pbmNsdWRlcygiZmFkIik7CiAgdmFyIGRlZmF1bHRGYW1pbHlJc0R1b3RvbmUgPSBjb25maWckJDEuZmFtaWx5RGVmYXVsdCA9PT0gImR1b3RvbmUiOwogIHZhciBjYW5vbmljYWxQcmVmaXhJc0R1b3RvbmUgPSBjYW5vbmljYWwucHJlZml4ID09PSAiZmFkIiB8fCBjYW5vbmljYWwucHJlZml4ID09PSAiZmEtZHVvdG9uZSI7CiAgaWYgKCFpc0R1b3RvbmVGYW1pbHkgJiYgKHZhbHVlc0hhc0R1b3RvbmUgfHwgZGVmYXVsdEZhbWlseUlzRHVvdG9uZSB8fCBjYW5vbmljYWxQcmVmaXhJc0R1b3RvbmUpKSB7CiAgICBjYW5vbmljYWwucHJlZml4ID0gImZhZCI7CiAgfQogIGlmICh2YWx1ZXMuaW5jbHVkZXMoImZhLWJyYW5kcyIpIHx8IHZhbHVlcy5pbmNsdWRlcygiZmFiIikpIHsKICAgIGNhbm9uaWNhbC5wcmVmaXggPSAiZmFiIjsKICB9CiAgaWYgKCFjYW5vbmljYWwucHJlZml4ICYmIG5ld0Nhbm9uaWNhbEZhbWlsaWVzLmluY2x1ZGVzKGZhbWlseSkpIHsKICAgIHZhciB2YWxpZFByZWZpeCA9IE9iamVjdC5rZXlzKHN0eWxlczMpLmZpbmQoZnVuY3Rpb24oa2V5MikgewogICAgICByZXR1cm4gbmV3Q2Fub25pY2FsU3R5bGVzLmluY2x1ZGVzKGtleTIpOwogICAgfSk7CiAgICBpZiAodmFsaWRQcmVmaXggfHwgY29uZmlnJCQxLmF1dG9GZXRjaFN2ZykgewogICAgICB2YXIgZGVmYXVsdFByZWZpeCA9IFV0LmdldChmYW1pbHkpLmRlZmF1bHRTaG9ydFByZWZpeElkOwogICAgICBjYW5vbmljYWwucHJlZml4ID0gZGVmYXVsdFByZWZpeDsKICAgICAgY2Fub25pY2FsLmljb25OYW1lID0gYnlBbGlhcyhjYW5vbmljYWwucHJlZml4LCBjYW5vbmljYWwuaWNvbk5hbWUpIHx8IGNhbm9uaWNhbC5pY29uTmFtZTsKICAgIH0KICB9CiAgaWYgKGNhbm9uaWNhbC5wcmVmaXggPT09ICJmYSIgfHwgZ2l2ZW5QcmVmaXggPT09ICJmYSIpIHsKICAgIGNhbm9uaWNhbC5wcmVmaXggPSBnZXREZWZhdWx0VXNhYmxlUHJlZml4KCkgfHwgImZhcyI7CiAgfQogIHJldHVybiBjYW5vbmljYWw7Cn0KZnVuY3Rpb24gcmVnaXN0ZXJQbHVnaW5zKG5leHRQbHVnaW5zLCBfcmVmMikgewogIHZhciBvYmogPSBfcmVmMi5taXhvdXRzVG87CiAgX3BsdWdpbnMgPSBuZXh0UGx1Z2luczsKICBfaG9va3MgPSB7fTsKICBPYmplY3Qua2V5cyhwcm92aWRlcnMpLmZvckVhY2goZnVuY3Rpb24oazQpIHsKICAgIGlmIChkZWZhdWx0UHJvdmlkZXJLZXlzLmluZGV4T2YoazQpID09PSAtMSkgewogICAgICBkZWxldGUgcHJvdmlkZXJzW2s0XTsKICAgIH0KICB9KTsKICBfcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uKHBsdWdpbikgewogICAgdmFyIG1peG91dDggPSBwbHVnaW4ubWl4b3V0ID8gcGx1Z2luLm1peG91dCgpIDoge307CiAgICBPYmplY3Qua2V5cyhtaXhvdXQ4KS5mb3JFYWNoKGZ1bmN0aW9uKHRrKSB7CiAgICAgIGlmICh0eXBlb2YgbWl4b3V0OFt0a10gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICBvYmpbdGtdID0gbWl4b3V0OFt0a107CiAgICAgIH0KICAgICAgaWYgKF90eXBlb2YobWl4b3V0OFt0a10pID09PSAib2JqZWN0IikgewogICAgICAgIE9iamVjdC5rZXlzKG1peG91dDhbdGtdKS5mb3JFYWNoKGZ1bmN0aW9uKHNrKSB7CiAgICAgICAgICBpZiAoIW9ialt0a10pIHsKICAgICAgICAgICAgb2JqW3RrXSA9IHt9OwogICAgICAgICAgfQogICAgICAgICAgb2JqW3RrXVtza10gPSBtaXhvdXQ4W3RrXVtza107CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogICAgaWYgKHBsdWdpbi5ob29rcykgewogICAgICB2YXIgaG9va3M4ID0gcGx1Z2luLmhvb2tzKCk7CiAgICAgIE9iamVjdC5rZXlzKGhvb2tzOCkuZm9yRWFjaChmdW5jdGlvbihob29rKSB7CiAgICAgICAgaWYgKCFfaG9va3NbaG9va10pIHsKICAgICAgICAgIF9ob29rc1tob29rXSA9IFtdOwogICAgICAgIH0KICAgICAgICBfaG9va3NbaG9va10ucHVzaChob29rczhbaG9va10pOwogICAgICB9KTsKICAgIH0KICAgIGlmIChwbHVnaW4ucHJvdmlkZXMpIHsKICAgICAgcGx1Z2luLnByb3ZpZGVzKHByb3ZpZGVycyk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIG9iajsKfQpmdW5jdGlvbiBjaGFpbkhvb2tzKGhvb2ssIGFjY3VtdWxhdG9yKSB7CiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDIgPyBfbGVuIC0gMiA6IDApLCBfa2V5ID0gMjsgX2tleSA8IF9sZW47IF9rZXkrKykgewogICAgYXJnc1tfa2V5IC0gMl0gPSBhcmd1bWVudHNbX2tleV07CiAgfQogIHZhciBob29rRm5zID0gX2hvb2tzW2hvb2tdIHx8IFtdOwogIGhvb2tGbnMuZm9yRWFjaChmdW5jdGlvbihob29rRm4pIHsKICAgIGFjY3VtdWxhdG9yID0gaG9va0ZuLmFwcGx5KG51bGwsIFthY2N1bXVsYXRvcl0uY29uY2F0KGFyZ3MpKTsKICB9KTsKICByZXR1cm4gYWNjdW11bGF0b3I7Cn0KZnVuY3Rpb24gY2FsbEhvb2tzKGhvb2spIHsKICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykgewogICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTsKICB9CiAgdmFyIGhvb2tGbnMgPSBfaG9va3NbaG9va10gfHwgW107CiAgaG9va0Zucy5mb3JFYWNoKGZ1bmN0aW9uKGhvb2tGbikgewogICAgaG9va0ZuLmFwcGx5KG51bGwsIGFyZ3MpOwogIH0pOwogIHJldHVybiB2b2lkIDA7Cn0KZnVuY3Rpb24gY2FsbFByb3ZpZGVkKCkgewogIHZhciBob29rID0gYXJndW1lbnRzWzBdOwogIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICByZXR1cm4gcHJvdmlkZXJzW2hvb2tdID8gcHJvdmlkZXJzW2hvb2tdLmFwcGx5KG51bGwsIGFyZ3MpIDogdm9pZCAwOwp9CmZ1bmN0aW9uIGZpbmRJY29uRGVmaW5pdGlvbihpY29uTG9va3VwKSB7CiAgaWYgKGljb25Mb29rdXAucHJlZml4ID09PSAiZmEiKSB7CiAgICBpY29uTG9va3VwLnByZWZpeCA9ICJmYXMiOwogIH0KICB2YXIgaWNvbk5hbWUgPSBpY29uTG9va3VwLmljb25OYW1lOwogIHZhciBwcmVmaXg0ID0gaWNvbkxvb2t1cC5wcmVmaXggfHwgZ2V0RGVmYXVsdFVzYWJsZVByZWZpeCgpOwogIGlmICghaWNvbk5hbWUpIHJldHVybjsKICBpY29uTmFtZSA9IGJ5QWxpYXMocHJlZml4NCwgaWNvbk5hbWUpIHx8IGljb25OYW1lOwogIHJldHVybiBpY29uRnJvbU1hcHBpbmcobGlicmFyeS5kZWZpbml0aW9ucywgcHJlZml4NCwgaWNvbk5hbWUpIHx8IGljb25Gcm9tTWFwcGluZyhuYW1lc3BhY2Uuc3R5bGVzLCBwcmVmaXg0LCBpY29uTmFtZSk7Cn0KZnVuY3Rpb24gZG9tVmFyaWFudHModmFsLCBhYnN0cmFjdENyZWF0b3IpIHsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmFsLCAiYWJzdHJhY3QiLCB7CiAgICBnZXQ6IGFic3RyYWN0Q3JlYXRvcgogIH0pOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWwsICJodG1sIiwgewogICAgZ2V0OiBmdW5jdGlvbiBnZXQyKCkgewogICAgICByZXR1cm4gdmFsLmFic3RyYWN0Lm1hcChmdW5jdGlvbihhNSkgewogICAgICAgIHJldHVybiB0b0h0bWwyKGE1KTsKICAgICAgfSk7CiAgICB9CiAgfSk7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZhbCwgIm5vZGUiLCB7CiAgICBnZXQ6IGZ1bmN0aW9uIGdldDIoKSB7CiAgICAgIGlmICghSVNfRE9NKSByZXR1cm4gdm9pZCAwOwogICAgICB2YXIgY29udGFpbmVyID0gRE9DVU1FTlQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSB2YWwuaHRtbDsKICAgICAgcmV0dXJuIGNvbnRhaW5lci5jaGlsZHJlbjsKICAgIH0KICB9KTsKICByZXR1cm4gdmFsOwp9CmZ1bmN0aW9uIGFzSWNvbihfcmVmMikgewogIHZhciBjaGlsZHJlbjIgPSBfcmVmMi5jaGlsZHJlbiwgbWFpbiA9IF9yZWYyLm1haW4sIG1hc2sgPSBfcmVmMi5tYXNrLCBhdHRyaWJ1dGVzID0gX3JlZjIuYXR0cmlidXRlcywgc3R5bGVzMyA9IF9yZWYyLnN0eWxlcywgdHJhbnNmb3JtMiA9IF9yZWYyLnRyYW5zZm9ybTsKICBpZiAodHJhbnNmb3JtSXNNZWFuaW5nZnVsKHRyYW5zZm9ybTIpICYmIG1haW4uZm91bmQgJiYgIW1hc2suZm91bmQpIHsKICAgIHZhciB3aWR0aCA9IG1haW4ud2lkdGgsIGhlaWdodCA9IG1haW4uaGVpZ2h0OwogICAgdmFyIG9mZnNldCA9IHsKICAgICAgeDogd2lkdGggLyBoZWlnaHQgLyAyLAogICAgICB5OiAwLjUKICAgIH07CiAgICBhdHRyaWJ1dGVzWyJzdHlsZSJdID0gam9pblN0eWxlcyhfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgc3R5bGVzMyksIHt9LCB7CiAgICAgICJ0cmFuc2Zvcm0tb3JpZ2luIjogIiIuY29uY2F0KG9mZnNldC54ICsgdHJhbnNmb3JtMi54IC8gMTYsICJlbSAiKS5jb25jYXQob2Zmc2V0LnkgKyB0cmFuc2Zvcm0yLnkgLyAxNiwgImVtIikKICAgIH0pKTsKICB9CiAgcmV0dXJuIFt7CiAgICB0YWc6ICJzdmciLAogICAgYXR0cmlidXRlcywKICAgIGNoaWxkcmVuOiBjaGlsZHJlbjIKICB9XTsKfQpmdW5jdGlvbiBhc1N5bWJvbChfcmVmMikgewogIHZhciBwcmVmaXg0ID0gX3JlZjIucHJlZml4LCBpY29uTmFtZSA9IF9yZWYyLmljb25OYW1lLCBjaGlsZHJlbjIgPSBfcmVmMi5jaGlsZHJlbiwgYXR0cmlidXRlcyA9IF9yZWYyLmF0dHJpYnV0ZXMsIHN5bWJvbCA9IF9yZWYyLnN5bWJvbDsKICB2YXIgaWQgPSBzeW1ib2wgPT09IHRydWUgPyAiIi5jb25jYXQocHJlZml4NCwgIi0iKS5jb25jYXQoY29uZmlnMi5jc3NQcmVmaXgsICItIikuY29uY2F0KGljb25OYW1lKSA6IHN5bWJvbDsKICByZXR1cm4gW3sKICAgIHRhZzogInN2ZyIsCiAgICBhdHRyaWJ1dGVzOiB7CiAgICAgIHN0eWxlOiAiZGlzcGxheTogbm9uZTsiCiAgICB9LAogICAgY2hpbGRyZW46IFt7CiAgICAgIHRhZzogInN5bWJvbCIsCiAgICAgIGF0dHJpYnV0ZXM6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBhdHRyaWJ1dGVzKSwge30sIHsKICAgICAgICBpZAogICAgICB9KSwKICAgICAgY2hpbGRyZW46IGNoaWxkcmVuMgogICAgfV0KICB9XTsKfQpmdW5jdGlvbiBpc0xhYmVsZWQoYXR0cmlidXRlcykgewogIHZhciBsYWJlbHMgPSBbImFyaWEtbGFiZWwiLCAiYXJpYS1sYWJlbGxlZGJ5IiwgInRpdGxlIiwgInJvbGUiXTsKICByZXR1cm4gbGFiZWxzLnNvbWUoZnVuY3Rpb24obGFiZWwpIHsKICAgIHJldHVybiBsYWJlbCBpbiBhdHRyaWJ1dGVzOwogIH0pOwp9CmZ1bmN0aW9uIG1ha2VJbmxpbmVTdmdBYnN0cmFjdChwYXJhbXMyKSB7CiAgdmFyIF9wYXJhbXMkaWNvbnMgPSBwYXJhbXMyLmljb25zLCBtYWluID0gX3BhcmFtcyRpY29ucy5tYWluLCBtYXNrID0gX3BhcmFtcyRpY29ucy5tYXNrLCBwcmVmaXg0ID0gcGFyYW1zMi5wcmVmaXgsIGljb25OYW1lID0gcGFyYW1zMi5pY29uTmFtZSwgdHJhbnNmb3JtMiA9IHBhcmFtczIudHJhbnNmb3JtLCBzeW1ib2wgPSBwYXJhbXMyLnN5bWJvbCwgbWFza0lkID0gcGFyYW1zMi5tYXNrSWQsIGV4dHJhID0gcGFyYW1zMi5leHRyYSwgX3BhcmFtcyR3YXRjaGFibGUgPSBwYXJhbXMyLndhdGNoYWJsZSwgd2F0Y2hhYmxlID0gX3BhcmFtcyR3YXRjaGFibGUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3BhcmFtcyR3YXRjaGFibGU7CiAgdmFyIF9yZWYyID0gbWFzay5mb3VuZCA/IG1hc2sgOiBtYWluLCB3aWR0aCA9IF9yZWYyLndpZHRoLCBoZWlnaHQgPSBfcmVmMi5oZWlnaHQ7CiAgdmFyIGF0dHJDbGFzcyA9IFtjb25maWcyLnJlcGxhY2VtZW50Q2xhc3MsIGljb25OYW1lID8gIiIuY29uY2F0KGNvbmZpZzIuY3NzUHJlZml4LCAiLSIpLmNvbmNhdChpY29uTmFtZSkgOiAiIl0uZmlsdGVyKGZ1bmN0aW9uKGMxMSkgewogICAgcmV0dXJuIGV4dHJhLmNsYXNzZXMuaW5kZXhPZihjMTEpID09PSAtMTsKICB9KS5maWx0ZXIoZnVuY3Rpb24oYzExKSB7CiAgICByZXR1cm4gYzExICE9PSAiIiB8fCAhIWMxMTsKICB9KS5jb25jYXQoZXh0cmEuY2xhc3Nlcykuam9pbigiICIpOwogIHZhciBjb250ZW50MyA9IHsKICAgIGNoaWxkcmVuOiBbXSwKICAgIGF0dHJpYnV0ZXM6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBleHRyYS5hdHRyaWJ1dGVzKSwge30sIHsKICAgICAgImRhdGEtcHJlZml4IjogcHJlZml4NCwKICAgICAgImRhdGEtaWNvbiI6IGljb25OYW1lLAogICAgICAiY2xhc3MiOiBhdHRyQ2xhc3MsCiAgICAgICJyb2xlIjogZXh0cmEuYXR0cmlidXRlcy5yb2xlIHx8ICJpbWciLAogICAgICAidmlld0JveCI6ICIwIDAgIi5jb25jYXQod2lkdGgsICIgIikuY29uY2F0KGhlaWdodCkKICAgIH0pCiAgfTsKICBpZiAoIWlzTGFiZWxlZChleHRyYS5hdHRyaWJ1dGVzKSAmJiAhZXh0cmEuYXR0cmlidXRlc1siYXJpYS1oaWRkZW4iXSkgewogICAgY29udGVudDMuYXR0cmlidXRlc1siYXJpYS1oaWRkZW4iXSA9ICJ0cnVlIjsKICB9CiAgaWYgKHdhdGNoYWJsZSkgewogICAgY29udGVudDMuYXR0cmlidXRlc1tEQVRBX0ZBX0kyU1ZHXSA9ICIiOwogIH0KICB2YXIgYXJncyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBjb250ZW50MyksIHt9LCB7CiAgICBwcmVmaXg6IHByZWZpeDQsCiAgICBpY29uTmFtZSwKICAgIG1haW4sCiAgICBtYXNrLAogICAgbWFza0lkLAogICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0yLAogICAgc3ltYm9sLAogICAgc3R5bGVzOiBfb2JqZWN0U3ByZWFkMih7fSwgZXh0cmEuc3R5bGVzKQogIH0pOwogIHZhciBfcmVmMjIgPSBtYXNrLmZvdW5kICYmIG1haW4uZm91bmQgPyBjYWxsUHJvdmlkZWQoImdlbmVyYXRlQWJzdHJhY3RNYXNrIiwgYXJncykgfHwgewogICAgY2hpbGRyZW46IFtdLAogICAgYXR0cmlidXRlczoge30KICB9IDogY2FsbFByb3ZpZGVkKCJnZW5lcmF0ZUFic3RyYWN0SWNvbiIsIGFyZ3MpIHx8IHsKICAgIGNoaWxkcmVuOiBbXSwKICAgIGF0dHJpYnV0ZXM6IHt9CiAgfSwgY2hpbGRyZW4yID0gX3JlZjIyLmNoaWxkcmVuLCBhdHRyaWJ1dGVzID0gX3JlZjIyLmF0dHJpYnV0ZXM7CiAgYXJncy5jaGlsZHJlbiA9IGNoaWxkcmVuMjsKICBhcmdzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwogIGlmIChzeW1ib2wpIHsKICAgIHJldHVybiBhc1N5bWJvbChhcmdzKTsKICB9IGVsc2UgewogICAgcmV0dXJuIGFzSWNvbihhcmdzKTsKICB9Cn0KZnVuY3Rpb24gbWFrZUxheWVyc1RleHRBYnN0cmFjdChwYXJhbXMyKSB7CiAgdmFyIGNvbnRlbnQzID0gcGFyYW1zMi5jb250ZW50LCB3aWR0aCA9IHBhcmFtczIud2lkdGgsIGhlaWdodCA9IHBhcmFtczIuaGVpZ2h0LCB0cmFuc2Zvcm0yID0gcGFyYW1zMi50cmFuc2Zvcm0sIGV4dHJhID0gcGFyYW1zMi5leHRyYSwgX3BhcmFtcyR3YXRjaGFibGUyID0gcGFyYW1zMi53YXRjaGFibGUsIHdhdGNoYWJsZSA9IF9wYXJhbXMkd2F0Y2hhYmxlMiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcGFyYW1zJHdhdGNoYWJsZTI7CiAgdmFyIGF0dHJpYnV0ZXMgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgZXh0cmEuYXR0cmlidXRlcyksIHt9LCB7CiAgICBjbGFzczogZXh0cmEuY2xhc3Nlcy5qb2luKCIgIikKICB9KTsKICBpZiAod2F0Y2hhYmxlKSB7CiAgICBhdHRyaWJ1dGVzW0RBVEFfRkFfSTJTVkddID0gIiI7CiAgfQogIHZhciBzdHlsZXMzID0gX29iamVjdFNwcmVhZDIoe30sIGV4dHJhLnN0eWxlcyk7CiAgaWYgKHRyYW5zZm9ybUlzTWVhbmluZ2Z1bCh0cmFuc2Zvcm0yKSkgewogICAgc3R5bGVzM1sidHJhbnNmb3JtIl0gPSB0cmFuc2Zvcm1Gb3JDc3MoewogICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybTIsCiAgICAgIHN0YXJ0Q2VudGVyZWQ6IHRydWUsCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQKICAgIH0pOwogICAgc3R5bGVzM1siLXdlYmtpdC10cmFuc2Zvcm0iXSA9IHN0eWxlczNbInRyYW5zZm9ybSJdOwogIH0KICB2YXIgc3R5bGVTdHJpbmcgPSBqb2luU3R5bGVzKHN0eWxlczMpOwogIGlmIChzdHlsZVN0cmluZy5sZW5ndGggPiAwKSB7CiAgICBhdHRyaWJ1dGVzWyJzdHlsZSJdID0gc3R5bGVTdHJpbmc7CiAgfQogIHZhciB2YWwgPSBbXTsKICB2YWwucHVzaCh7CiAgICB0YWc6ICJzcGFuIiwKICAgIGF0dHJpYnV0ZXMsCiAgICBjaGlsZHJlbjogW2NvbnRlbnQzXQogIH0pOwogIHJldHVybiB2YWw7Cn0KZnVuY3Rpb24gbWFrZUxheWVyc0NvdW50ZXJBYnN0cmFjdChwYXJhbXMyKSB7CiAgdmFyIGNvbnRlbnQzID0gcGFyYW1zMi5jb250ZW50LCBleHRyYSA9IHBhcmFtczIuZXh0cmE7CiAgdmFyIGF0dHJpYnV0ZXMgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgZXh0cmEuYXR0cmlidXRlcyksIHt9LCB7CiAgICBjbGFzczogZXh0cmEuY2xhc3Nlcy5qb2luKCIgIikKICB9KTsKICB2YXIgc3R5bGVTdHJpbmcgPSBqb2luU3R5bGVzKGV4dHJhLnN0eWxlcyk7CiAgaWYgKHN0eWxlU3RyaW5nLmxlbmd0aCA+IDApIHsKICAgIGF0dHJpYnV0ZXNbInN0eWxlIl0gPSBzdHlsZVN0cmluZzsKICB9CiAgdmFyIHZhbCA9IFtdOwogIHZhbC5wdXNoKHsKICAgIHRhZzogInNwYW4iLAogICAgYXR0cmlidXRlcywKICAgIGNoaWxkcmVuOiBbY29udGVudDNdCiAgfSk7CiAgcmV0dXJuIHZhbDsKfQpmdW5jdGlvbiBhc0ZvdW5kSWNvbihpY29uMykgewogIHZhciB3aWR0aCA9IGljb24zWzBdOwogIHZhciBoZWlnaHQgPSBpY29uM1sxXTsKICB2YXIgX2ljb24kc2xpY2UgPSBpY29uMy5zbGljZSg0KSwgX2ljb24kc2xpY2UyID0gX3NsaWNlZFRvQXJyYXkoX2ljb24kc2xpY2UsIDEpLCB2ZWN0b3JEYXRhID0gX2ljb24kc2xpY2UyWzBdOwogIHZhciBlbGVtZW50NCA9IG51bGw7CiAgaWYgKEFycmF5LmlzQXJyYXkodmVjdG9yRGF0YSkpIHsKICAgIGVsZW1lbnQ0ID0gewogICAgICB0YWc6ICJnIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiAiIi5jb25jYXQoY29uZmlnMi5jc3NQcmVmaXgsICItIikuY29uY2F0KERVT1RPTkVfQ0xBU1NFUy5HUk9VUCkKICAgICAgfSwKICAgICAgY2hpbGRyZW46IFt7CiAgICAgICAgdGFnOiAicGF0aCIsCiAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgY2xhc3M6ICIiLmNvbmNhdChjb25maWcyLmNzc1ByZWZpeCwgIi0iKS5jb25jYXQoRFVPVE9ORV9DTEFTU0VTLlNFQ09OREFSWSksCiAgICAgICAgICBmaWxsOiAiY3VycmVudENvbG9yIiwKICAgICAgICAgIGQ6IHZlY3RvckRhdGFbMF0KICAgICAgICB9CiAgICAgIH0sIHsKICAgICAgICB0YWc6ICJwYXRoIiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBjbGFzczogIiIuY29uY2F0KGNvbmZpZzIuY3NzUHJlZml4LCAiLSIpLmNvbmNhdChEVU9UT05FX0NMQVNTRVMuUFJJTUFSWSksCiAgICAgICAgICBmaWxsOiAiY3VycmVudENvbG9yIiwKICAgICAgICAgIGQ6IHZlY3RvckRhdGFbMV0KICAgICAgICB9CiAgICAgIH1dCiAgICB9OwogIH0gZWxzZSB7CiAgICBlbGVtZW50NCA9IHsKICAgICAgdGFnOiAicGF0aCIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBmaWxsOiAiY3VycmVudENvbG9yIiwKICAgICAgICBkOiB2ZWN0b3JEYXRhCiAgICAgIH0KICAgIH07CiAgfQogIHJldHVybiB7CiAgICBmb3VuZDogdHJ1ZSwKICAgIHdpZHRoLAogICAgaGVpZ2h0LAogICAgaWNvbjogZWxlbWVudDQKICB9Owp9CmZ1bmN0aW9uIG1heWJlTm90aWZ5TWlzc2luZyhpY29uTmFtZSwgcHJlZml4NCkgewogIGlmICghUFJPRFVDVElPTiAmJiAhY29uZmlnMi5zaG93TWlzc2luZ0ljb25zICYmIGljb25OYW1lKSB7CiAgICBjb25zb2xlLmVycm9yKCdJY29uIHdpdGggbmFtZSAiJy5jb25jYXQoaWNvbk5hbWUsICciIGFuZCBwcmVmaXggIicpLmNvbmNhdChwcmVmaXg0LCAnIiBpcyBtaXNzaW5nLicpKTsKICB9Cn0KZnVuY3Rpb24gZmluZEljb24oaWNvbk5hbWUsIHByZWZpeDQpIHsKICB2YXIgZ2l2ZW5QcmVmaXggPSBwcmVmaXg0OwogIGlmIChwcmVmaXg0ID09PSAiZmEiICYmIGNvbmZpZzIuc3R5bGVEZWZhdWx0ICE9PSBudWxsKSB7CiAgICBwcmVmaXg0ID0gZ2V0RGVmYXVsdFVzYWJsZVByZWZpeCgpOwogIH0KICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZTIsIHJlamVjdCkgewogICAgaWYgKGdpdmVuUHJlZml4ID09PSAiZmEiKSB7CiAgICAgIHZhciBzaGltID0gYnlPbGROYW1lKGljb25OYW1lKSB8fCB7fTsKICAgICAgaWNvbk5hbWUgPSBzaGltLmljb25OYW1lIHx8IGljb25OYW1lOwogICAgICBwcmVmaXg0ID0gc2hpbS5wcmVmaXggfHwgcHJlZml4NDsKICAgIH0KICAgIGlmIChpY29uTmFtZSAmJiBwcmVmaXg0ICYmIHN0eWxlcyQxW3ByZWZpeDRdICYmIHN0eWxlcyQxW3ByZWZpeDRdW2ljb25OYW1lXSkgewogICAgICB2YXIgaWNvbjMgPSBzdHlsZXMkMVtwcmVmaXg0XVtpY29uTmFtZV07CiAgICAgIHJldHVybiByZXNvbHZlMihhc0ZvdW5kSWNvbihpY29uMykpOwogICAgfQogICAgbWF5YmVOb3RpZnlNaXNzaW5nKGljb25OYW1lLCBwcmVmaXg0KTsKICAgIHJlc29sdmUyKF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBtaXNzaW5nSWNvblJlc29sdXRpb25NaXhpbiksIHt9LCB7CiAgICAgIGljb246IGNvbmZpZzIuc2hvd01pc3NpbmdJY29ucyAmJiBpY29uTmFtZSA/IGNhbGxQcm92aWRlZCgibWlzc2luZ0ljb25BYnN0cmFjdCIpIHx8IHt9IDoge30KICAgIH0pKTsKICB9KTsKfQpmdW5jdGlvbiBpc1dhdGNoZWQobm9kZTIpIHsKICB2YXIgaTJzdmcyID0gbm9kZTIuZ2V0QXR0cmlidXRlID8gbm9kZTIuZ2V0QXR0cmlidXRlKERBVEFfRkFfSTJTVkcpIDogbnVsbDsKICByZXR1cm4gdHlwZW9mIGkyc3ZnMiA9PT0gInN0cmluZyI7Cn0KZnVuY3Rpb24gaGFzUHJlZml4QW5kSWNvbihub2RlMikgewogIHZhciBwcmVmaXg0ID0gbm9kZTIuZ2V0QXR0cmlidXRlID8gbm9kZTIuZ2V0QXR0cmlidXRlKERBVEFfUFJFRklYKSA6IG51bGw7CiAgdmFyIGljb24zID0gbm9kZTIuZ2V0QXR0cmlidXRlID8gbm9kZTIuZ2V0QXR0cmlidXRlKERBVEFfSUNPTikgOiBudWxsOwogIHJldHVybiBwcmVmaXg0ICYmIGljb24zOwp9CmZ1bmN0aW9uIGhhc0JlZW5SZXBsYWNlZChub2RlMikgewogIHJldHVybiBub2RlMiAmJiBub2RlMi5jbGFzc0xpc3QgJiYgbm9kZTIuY2xhc3NMaXN0LmNvbnRhaW5zICYmIG5vZGUyLmNsYXNzTGlzdC5jb250YWlucyhjb25maWcyLnJlcGxhY2VtZW50Q2xhc3MpOwp9CmZ1bmN0aW9uIGdldE11dGF0b3IoKSB7CiAgaWYgKGNvbmZpZzIuYXV0b1JlcGxhY2VTdmcgPT09IHRydWUpIHsKICAgIHJldHVybiBtdXRhdG9ycy5yZXBsYWNlOwogIH0KICB2YXIgbXV0YXRvciA9IG11dGF0b3JzW2NvbmZpZzIuYXV0b1JlcGxhY2VTdmddOwogIHJldHVybiBtdXRhdG9yIHx8IG11dGF0b3JzLnJlcGxhY2U7Cn0KZnVuY3Rpb24gY3JlYXRlRWxlbWVudE5TKHRhZykgewogIHJldHVybiBET0NVTUVOVC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwgdGFnKTsKfQpmdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRhZykgewogIHJldHVybiBET0NVTUVOVC5jcmVhdGVFbGVtZW50KHRhZyk7Cn0KZnVuY3Rpb24gY29udmVydFNWRyhhYnN0cmFjdE9iaikgewogIHZhciBwYXJhbXMyID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB2b2lkIDAgPyBhcmd1bWVudHNbMV0gOiB7fTsKICB2YXIgX3BhcmFtcyRjZUZuID0gcGFyYW1zMi5jZUZuLCBjZUZuID0gX3BhcmFtcyRjZUZuID09PSB2b2lkIDAgPyBhYnN0cmFjdE9iai50YWcgPT09ICJzdmciID8gY3JlYXRlRWxlbWVudE5TIDogY3JlYXRlRWxlbWVudCA6IF9wYXJhbXMkY2VGbjsKICBpZiAodHlwZW9mIGFic3RyYWN0T2JqID09PSAic3RyaW5nIikgewogICAgcmV0dXJuIERPQ1VNRU5ULmNyZWF0ZVRleHROb2RlKGFic3RyYWN0T2JqKTsKICB9CiAgdmFyIHRhZyA9IGNlRm4oYWJzdHJhY3RPYmoudGFnKTsKICBPYmplY3Qua2V5cyhhYnN0cmFjdE9iai5hdHRyaWJ1dGVzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGtleTIpIHsKICAgIHRhZy5zZXRBdHRyaWJ1dGUoa2V5MiwgYWJzdHJhY3RPYmouYXR0cmlidXRlc1trZXkyXSk7CiAgfSk7CiAgdmFyIGNoaWxkcmVuMiA9IGFic3RyYWN0T2JqLmNoaWxkcmVuIHx8IFtdOwogIGNoaWxkcmVuMi5mb3JFYWNoKGZ1bmN0aW9uKGNoaWxkKSB7CiAgICB0YWcuYXBwZW5kQ2hpbGQoY29udmVydFNWRyhjaGlsZCwgewogICAgICBjZUZuCiAgICB9KSk7CiAgfSk7CiAgcmV0dXJuIHRhZzsKfQpmdW5jdGlvbiBub2RlQXNDb21tZW50KG5vZGUyKSB7CiAgdmFyIGNvbW1lbnQzID0gIiAiLmNvbmNhdChub2RlMi5vdXRlckhUTUwsICIgIik7CiAgY29tbWVudDMgPSAiIi5jb25jYXQoY29tbWVudDMsICJGb250IEF3ZXNvbWUgZm9udGF3ZXNvbWUuY29tICIpOwogIHJldHVybiBjb21tZW50MzsKfQpmdW5jdGlvbiBwZXJmb3JtT3BlcmF0aW9uU3luYyhvcCkgewogIG9wKCk7Cn0KZnVuY3Rpb24gcGVyZm9ybShtdXRhdGlvbnMsIGNhbGxiYWNrKSB7CiAgdmFyIGNhbGxiYWNrRnVuY3Rpb24gPSB0eXBlb2YgY2FsbGJhY2sgPT09ICJmdW5jdGlvbiIgPyBjYWxsYmFjayA6IG5vb3AkMjsKICBpZiAobXV0YXRpb25zLmxlbmd0aCA9PT0gMCkgewogICAgY2FsbGJhY2tGdW5jdGlvbigpOwogIH0gZWxzZSB7CiAgICB2YXIgZnJhbWUgPSBwZXJmb3JtT3BlcmF0aW9uU3luYzsKICAgIGlmIChjb25maWcyLm11dGF0ZUFwcHJvYWNoID09PSBNVVRBVElPTl9BUFBST0FDSF9BU1lOQykgewogICAgICBmcmFtZSA9IFdJTkRPVy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgcGVyZm9ybU9wZXJhdGlvblN5bmM7CiAgICB9CiAgICBmcmFtZShmdW5jdGlvbigpIHsKICAgICAgdmFyIG11dGF0b3IgPSBnZXRNdXRhdG9yKCk7CiAgICAgIHZhciBtYXJrMiA9IHBlcmYuYmVnaW4oIm11dGF0ZSIpOwogICAgICBtdXRhdGlvbnMubWFwKG11dGF0b3IpOwogICAgICBtYXJrMigpOwogICAgICBjYWxsYmFja0Z1bmN0aW9uKCk7CiAgICB9KTsKICB9Cn0KZnVuY3Rpb24gZGlzYWJsZU9ic2VydmF0aW9uKCkgewogIGRpc2FibGVkID0gdHJ1ZTsKfQpmdW5jdGlvbiBlbmFibGVPYnNlcnZhdGlvbigpIHsKICBkaXNhYmxlZCA9IGZhbHNlOwp9CmZ1bmN0aW9uIG9ic2VydmUob3B0aW9ucykgewogIGlmICghTVVUQVRJT05fT0JTRVJWRVIpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKCFjb25maWcyLm9ic2VydmVNdXRhdGlvbnMpIHsKICAgIHJldHVybjsKICB9CiAgdmFyIF9vcHRpb25zJHRyZWVDYWxsYmFjayA9IG9wdGlvbnMudHJlZUNhbGxiYWNrLCB0cmVlQ2FsbGJhY2sgPSBfb3B0aW9ucyR0cmVlQ2FsbGJhY2sgPT09IHZvaWQgMCA/IG5vb3AkMiA6IF9vcHRpb25zJHRyZWVDYWxsYmFjaywgX29wdGlvbnMkbm9kZUNhbGxiYWNrID0gb3B0aW9ucy5ub2RlQ2FsbGJhY2ssIG5vZGVDYWxsYmFjayA9IF9vcHRpb25zJG5vZGVDYWxsYmFjayA9PT0gdm9pZCAwID8gbm9vcCQyIDogX29wdGlvbnMkbm9kZUNhbGxiYWNrLCBfb3B0aW9ucyRwc2V1ZG9FbGVtZW4gPSBvcHRpb25zLnBzZXVkb0VsZW1lbnRzQ2FsbGJhY2ssIHBzZXVkb0VsZW1lbnRzQ2FsbGJhY2sgPSBfb3B0aW9ucyRwc2V1ZG9FbGVtZW4gPT09IHZvaWQgMCA/IG5vb3AkMiA6IF9vcHRpb25zJHBzZXVkb0VsZW1lbiwgX29wdGlvbnMkb2JzZXJ2ZU11dGF0ID0gb3B0aW9ucy5vYnNlcnZlTXV0YXRpb25zUm9vdCwgb2JzZXJ2ZU11dGF0aW9uc1Jvb3QgPSBfb3B0aW9ucyRvYnNlcnZlTXV0YXQgPT09IHZvaWQgMCA/IERPQ1VNRU5UIDogX29wdGlvbnMkb2JzZXJ2ZU11dGF0OwogIG1vID0gbmV3IE1VVEFUSU9OX09CU0VSVkVSKGZ1bmN0aW9uKG9iamVjdHMpIHsKICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuOwogICAgdmFyIGRlZmF1bHRQcmVmaXggPSBnZXREZWZhdWx0VXNhYmxlUHJlZml4KCk7CiAgICB0b0FycmF5MihvYmplY3RzKS5mb3JFYWNoKGZ1bmN0aW9uKG11dGF0aW9uUmVjb3JkKSB7CiAgICAgIGlmIChtdXRhdGlvblJlY29yZC50eXBlID09PSAiY2hpbGRMaXN0IiAmJiBtdXRhdGlvblJlY29yZC5hZGRlZE5vZGVzLmxlbmd0aCA+IDAgJiYgIWlzV2F0Y2hlZChtdXRhdGlvblJlY29yZC5hZGRlZE5vZGVzWzBdKSkgewogICAgICAgIGlmIChjb25maWcyLnNlYXJjaFBzZXVkb0VsZW1lbnRzKSB7CiAgICAgICAgICBwc2V1ZG9FbGVtZW50c0NhbGxiYWNrKG11dGF0aW9uUmVjb3JkLnRhcmdldCk7CiAgICAgICAgfQogICAgICAgIHRyZWVDYWxsYmFjayhtdXRhdGlvblJlY29yZC50YXJnZXQpOwogICAgICB9CiAgICAgIGlmIChtdXRhdGlvblJlY29yZC50eXBlID09PSAiYXR0cmlidXRlcyIgJiYgbXV0YXRpb25SZWNvcmQudGFyZ2V0LnBhcmVudE5vZGUgJiYgY29uZmlnMi5zZWFyY2hQc2V1ZG9FbGVtZW50cykgewogICAgICAgIHBzZXVkb0VsZW1lbnRzQ2FsbGJhY2soW211dGF0aW9uUmVjb3JkLnRhcmdldF0sIHRydWUpOwogICAgICB9CiAgICAgIGlmIChtdXRhdGlvblJlY29yZC50eXBlID09PSAiYXR0cmlidXRlcyIgJiYgaXNXYXRjaGVkKG11dGF0aW9uUmVjb3JkLnRhcmdldCkgJiYgfkFUVFJJQlVURVNfV0FUQ0hFRF9GT1JfTVVUQVRJT04uaW5kZXhPZihtdXRhdGlvblJlY29yZC5hdHRyaWJ1dGVOYW1lKSkgewogICAgICAgIGlmIChtdXRhdGlvblJlY29yZC5hdHRyaWJ1dGVOYW1lID09PSAiY2xhc3MiICYmIGhhc1ByZWZpeEFuZEljb24obXV0YXRpb25SZWNvcmQudGFyZ2V0KSkgewogICAgICAgICAgdmFyIF9nZXRDYW5vbmljYWxJY29uID0gZ2V0Q2Fub25pY2FsSWNvbihjbGFzc0FycmF5KG11dGF0aW9uUmVjb3JkLnRhcmdldCkpLCBwcmVmaXg0ID0gX2dldENhbm9uaWNhbEljb24ucHJlZml4LCBpY29uTmFtZSA9IF9nZXRDYW5vbmljYWxJY29uLmljb25OYW1lOwogICAgICAgICAgbXV0YXRpb25SZWNvcmQudGFyZ2V0LnNldEF0dHJpYnV0ZShEQVRBX1BSRUZJWCwgcHJlZml4NCB8fCBkZWZhdWx0UHJlZml4KTsKICAgICAgICAgIGlmIChpY29uTmFtZSkgbXV0YXRpb25SZWNvcmQudGFyZ2V0LnNldEF0dHJpYnV0ZShEQVRBX0lDT04sIGljb25OYW1lKTsKICAgICAgICB9IGVsc2UgaWYgKGhhc0JlZW5SZXBsYWNlZChtdXRhdGlvblJlY29yZC50YXJnZXQpKSB7CiAgICAgICAgICBub2RlQ2FsbGJhY2sobXV0YXRpb25SZWNvcmQudGFyZ2V0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0pOwogIGlmICghSVNfRE9NKSByZXR1cm47CiAgbW8ub2JzZXJ2ZShvYnNlcnZlTXV0YXRpb25zUm9vdCwgewogICAgY2hpbGRMaXN0OiB0cnVlLAogICAgYXR0cmlidXRlczogdHJ1ZSwKICAgIGNoYXJhY3RlckRhdGE6IHRydWUsCiAgICBzdWJ0cmVlOiB0cnVlCiAgfSk7Cn0KZnVuY3Rpb24gZGlzY29ubmVjdCgpIHsKICBpZiAoIW1vKSByZXR1cm47CiAgbW8uZGlzY29ubmVjdCgpOwp9CmZ1bmN0aW9uIHN0eWxlUGFyc2VyKG5vZGUyKSB7CiAgdmFyIHN0eWxlID0gbm9kZTIuZ2V0QXR0cmlidXRlKCJzdHlsZSIpOwogIHZhciB2YWwgPSBbXTsKICBpZiAoc3R5bGUpIHsKICAgIHZhbCA9IHN0eWxlLnNwbGl0KCI7IikucmVkdWNlKGZ1bmN0aW9uKGFjYywgc3R5bGUyKSB7CiAgICAgIHZhciBzdHlsZXMzID0gc3R5bGUyLnNwbGl0KCI6Iik7CiAgICAgIHZhciBwcm9wID0gc3R5bGVzM1swXTsKICAgICAgdmFyIHZhbHVlMiA9IHN0eWxlczMuc2xpY2UoMSk7CiAgICAgIGlmIChwcm9wICYmIHZhbHVlMi5sZW5ndGggPiAwKSB7CiAgICAgICAgYWNjW3Byb3BdID0gdmFsdWUyLmpvaW4oIjoiKS50cmltKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGFjYzsKICAgIH0sIHt9KTsKICB9CiAgcmV0dXJuIHZhbDsKfQpmdW5jdGlvbiBjbGFzc1BhcnNlcihub2RlMikgewogIHZhciBleGlzdGluZ1ByZWZpeCA9IG5vZGUyLmdldEF0dHJpYnV0ZSgiZGF0YS1wcmVmaXgiKTsKICB2YXIgZXhpc3RpbmdJY29uTmFtZSA9IG5vZGUyLmdldEF0dHJpYnV0ZSgiZGF0YS1pY29uIik7CiAgdmFyIGlubmVyVGV4dCA9IG5vZGUyLmlubmVyVGV4dCAhPT0gdm9pZCAwID8gbm9kZTIuaW5uZXJUZXh0LnRyaW0oKSA6ICIiOwogIHZhciB2YWwgPSBnZXRDYW5vbmljYWxJY29uKGNsYXNzQXJyYXkobm9kZTIpKTsKICBpZiAoIXZhbC5wcmVmaXgpIHsKICAgIHZhbC5wcmVmaXggPSBnZXREZWZhdWx0VXNhYmxlUHJlZml4KCk7CiAgfQogIGlmIChleGlzdGluZ1ByZWZpeCAmJiBleGlzdGluZ0ljb25OYW1lKSB7CiAgICB2YWwucHJlZml4ID0gZXhpc3RpbmdQcmVmaXg7CiAgICB2YWwuaWNvbk5hbWUgPSBleGlzdGluZ0ljb25OYW1lOwogIH0KICBpZiAodmFsLmljb25OYW1lICYmIHZhbC5wcmVmaXgpIHsKICAgIHJldHVybiB2YWw7CiAgfQogIGlmICh2YWwucHJlZml4ICYmIGlubmVyVGV4dC5sZW5ndGggPiAwKSB7CiAgICB2YWwuaWNvbk5hbWUgPSBieUxpZ2F0dXJlKHZhbC5wcmVmaXgsIG5vZGUyLmlubmVyVGV4dCkgfHwgYnlVbmljb2RlKHZhbC5wcmVmaXgsIHRvSGV4KG5vZGUyLmlubmVyVGV4dCkpOwogIH0KICBpZiAoIXZhbC5pY29uTmFtZSAmJiBjb25maWcyLmF1dG9GZXRjaFN2ZyAmJiBub2RlMi5maXJzdENoaWxkICYmIG5vZGUyLmZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7CiAgICB2YWwuaWNvbk5hbWUgPSBub2RlMi5maXJzdENoaWxkLmRhdGE7CiAgfQogIHJldHVybiB2YWw7Cn0KZnVuY3Rpb24gYXR0cmlidXRlc1BhcnNlcihub2RlMikgewogIHZhciBleHRyYUF0dHJpYnV0ZXMgPSB0b0FycmF5Mihub2RlMi5hdHRyaWJ1dGVzKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLCBhdHRyKSB7CiAgICBpZiAoYWNjLm5hbWUgIT09ICJjbGFzcyIgJiYgYWNjLm5hbWUgIT09ICJzdHlsZSIpIHsKICAgICAgYWNjW2F0dHIubmFtZV0gPSBhdHRyLnZhbHVlOwogICAgfQogICAgcmV0dXJuIGFjYzsKICB9LCB7fSk7CiAgcmV0dXJuIGV4dHJhQXR0cmlidXRlczsKfQpmdW5jdGlvbiBibGFua01ldGEoKSB7CiAgcmV0dXJuIHsKICAgIGljb25OYW1lOiBudWxsLAogICAgcHJlZml4OiBudWxsLAogICAgdHJhbnNmb3JtOiBtZWFuaW5nbGVzc1RyYW5zZm9ybSwKICAgIHN5bWJvbDogZmFsc2UsCiAgICBtYXNrOiB7CiAgICAgIGljb25OYW1lOiBudWxsLAogICAgICBwcmVmaXg6IG51bGwsCiAgICAgIHJlc3Q6IFtdCiAgICB9LAogICAgbWFza0lkOiBudWxsLAogICAgZXh0cmE6IHsKICAgICAgY2xhc3NlczogW10sCiAgICAgIHN0eWxlczoge30sCiAgICAgIGF0dHJpYnV0ZXM6IHt9CiAgICB9CiAgfTsKfQpmdW5jdGlvbiBwYXJzZU1ldGEobm9kZTIpIHsKICB2YXIgcGFyc2VyID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB2b2lkIDAgPyBhcmd1bWVudHNbMV0gOiB7CiAgICBzdHlsZVBhcnNlcjogdHJ1ZQogIH07CiAgdmFyIF9jbGFzc1BhcnNlciA9IGNsYXNzUGFyc2VyKG5vZGUyKSwgaWNvbk5hbWUgPSBfY2xhc3NQYXJzZXIuaWNvbk5hbWUsIHByZWZpeDQgPSBfY2xhc3NQYXJzZXIucHJlZml4LCBleHRyYUNsYXNzZXMgPSBfY2xhc3NQYXJzZXIucmVzdDsKICB2YXIgZXh0cmFBdHRyaWJ1dGVzID0gYXR0cmlidXRlc1BhcnNlcihub2RlMik7CiAgdmFyIHBsdWdpbk1ldGEgPSBjaGFpbkhvb2tzKCJwYXJzZU5vZGVBdHRyaWJ1dGVzIiwge30sIG5vZGUyKTsKICB2YXIgZXh0cmFTdHlsZXMgPSBwYXJzZXIuc3R5bGVQYXJzZXIgPyBzdHlsZVBhcnNlcihub2RlMikgOiBbXTsKICByZXR1cm4gX29iamVjdFNwcmVhZDIoewogICAgaWNvbk5hbWUsCiAgICBwcmVmaXg6IHByZWZpeDQsCiAgICB0cmFuc2Zvcm06IG1lYW5pbmdsZXNzVHJhbnNmb3JtLAogICAgbWFzazogewogICAgICBpY29uTmFtZTogbnVsbCwKICAgICAgcHJlZml4OiBudWxsLAogICAgICByZXN0OiBbXQogICAgfSwKICAgIG1hc2tJZDogbnVsbCwKICAgIHN5bWJvbDogZmFsc2UsCiAgICBleHRyYTogewogICAgICBjbGFzc2VzOiBleHRyYUNsYXNzZXMsCiAgICAgIHN0eWxlczogZXh0cmFTdHlsZXMsCiAgICAgIGF0dHJpYnV0ZXM6IGV4dHJhQXR0cmlidXRlcwogICAgfQogIH0sIHBsdWdpbk1ldGEpOwp9CmZ1bmN0aW9uIGdlbmVyYXRlTXV0YXRpb24obm9kZTIpIHsKICB2YXIgbm9kZU1ldGEgPSBjb25maWcyLmF1dG9SZXBsYWNlU3ZnID09PSAibmVzdCIgPyBwYXJzZU1ldGEobm9kZTIsIHsKICAgIHN0eWxlUGFyc2VyOiBmYWxzZQogIH0pIDogcGFyc2VNZXRhKG5vZGUyKTsKICBpZiAofm5vZGVNZXRhLmV4dHJhLmNsYXNzZXMuaW5kZXhPZihMQVlFUlNfVEVYVF9DTEFTU05BTUUpKSB7CiAgICByZXR1cm4gY2FsbFByb3ZpZGVkKCJnZW5lcmF0ZUxheWVyc1RleHQiLCBub2RlMiwgbm9kZU1ldGEpOwogIH0gZWxzZSB7CiAgICByZXR1cm4gY2FsbFByb3ZpZGVkKCJnZW5lcmF0ZVN2Z1JlcGxhY2VtZW50TXV0YXRpb24iLCBub2RlMiwgbm9kZU1ldGEpOwogIH0KfQpmdW5jdGlvbiBnZXRLbm93blByZWZpeGVzKCkgewogIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KFl0KSwgX3RvQ29uc3VtYWJsZUFycmF5KFp0JDEpKTsKfQpmdW5jdGlvbiBvblRyZWUocm9vdDYpIHsKICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7CiAgaWYgKCFJU19ET00pIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICB2YXIgaHRtbENsYXNzTGlzdCA9IERPQ1VNRU5ULmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3Q7CiAgdmFyIGhjbEFkZCA9IGZ1bmN0aW9uIGhjbEFkZDIoc3VmZml4KSB7CiAgICByZXR1cm4gaHRtbENsYXNzTGlzdC5hZGQoIiIuY29uY2F0KEhUTUxfQ0xBU1NfSTJTVkdfQkFTRV9DTEFTUywgIi0iKS5jb25jYXQoc3VmZml4KSk7CiAgfTsKICB2YXIgaGNsUmVtb3ZlID0gZnVuY3Rpb24gaGNsUmVtb3ZlMihzdWZmaXgpIHsKICAgIHJldHVybiBodG1sQ2xhc3NMaXN0LnJlbW92ZSgiIi5jb25jYXQoSFRNTF9DTEFTU19JMlNWR19CQVNFX0NMQVNTLCAiLSIpLmNvbmNhdChzdWZmaXgpKTsKICB9OwogIHZhciBwcmVmaXhlcyA9IGNvbmZpZzIuYXV0b0ZldGNoU3ZnID8gZ2V0S25vd25QcmVmaXhlcygpIDogUS5jb25jYXQoT2JqZWN0LmtleXMoc3R5bGVzJDIpKTsKICBpZiAoIXByZWZpeGVzLmluY2x1ZGVzKCJmYSIpKSB7CiAgICBwcmVmaXhlcy5wdXNoKCJmYSIpOwogIH0KICB2YXIgcHJlZml4ZXNEb21RdWVyeSA9IFsiLiIuY29uY2F0KExBWUVSU19URVhUX0NMQVNTTkFNRSwgIjpub3QoWyIpLmNvbmNhdChEQVRBX0ZBX0kyU1ZHLCAiXSkiKV0uY29uY2F0KHByZWZpeGVzLm1hcChmdW5jdGlvbihwJCQxKSB7CiAgICByZXR1cm4gIi4iLmNvbmNhdChwJCQxLCAiOm5vdChbIikuY29uY2F0KERBVEFfRkFfSTJTVkcsICJdKSIpOwogIH0pKS5qb2luKCIsICIpOwogIGlmIChwcmVmaXhlc0RvbVF1ZXJ5Lmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogIH0KICB2YXIgY2FuZGlkYXRlcyA9IFtdOwogIHRyeSB7CiAgICBjYW5kaWRhdGVzID0gdG9BcnJheTIocm9vdDYucXVlcnlTZWxlY3RvckFsbChwcmVmaXhlc0RvbVF1ZXJ5KSk7CiAgfSBjYXRjaCAoZSQkMSkgewogIH0KICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7CiAgICBoY2xBZGQoInBlbmRpbmciKTsKICAgIGhjbFJlbW92ZSgiY29tcGxldGUiKTsKICB9IGVsc2UgewogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogIH0KICB2YXIgbWFyazIgPSBwZXJmLmJlZ2luKCJvblRyZWUiKTsKICB2YXIgbXV0YXRpb25zID0gY2FuZGlkYXRlcy5yZWR1Y2UoZnVuY3Rpb24oYWNjLCBub2RlMikgewogICAgdHJ5IHsKICAgICAgdmFyIG11dGF0aW9uID0gZ2VuZXJhdGVNdXRhdGlvbihub2RlMik7CiAgICAgIGlmIChtdXRhdGlvbikgewogICAgICAgIGFjYy5wdXNoKG11dGF0aW9uKTsKICAgICAgfQogICAgfSBjYXRjaCAoZSQkMSkgewogICAgICBpZiAoIVBST0RVQ1RJT04pIHsKICAgICAgICBpZiAoZSQkMS5uYW1lID09PSAiTWlzc2luZ0ljb24iKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKGUkJDEpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGFjYzsKICB9LCBbXSk7CiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUyLCByZWplY3QpIHsKICAgIFByb21pc2UuYWxsKG11dGF0aW9ucykudGhlbihmdW5jdGlvbihyZXNvbHZlZE11dGF0aW9ucykgewogICAgICBwZXJmb3JtKHJlc29sdmVkTXV0YXRpb25zLCBmdW5jdGlvbigpIHsKICAgICAgICBoY2xBZGQoImFjdGl2ZSIpOwogICAgICAgIGhjbEFkZCgiY29tcGxldGUiKTsKICAgICAgICBoY2xSZW1vdmUoInBlbmRpbmciKTsKICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAiZnVuY3Rpb24iKSBjYWxsYmFjaygpOwogICAgICAgIG1hcmsyKCk7CiAgICAgICAgcmVzb2x2ZTIoKTsKICAgICAgfSk7CiAgICB9KS5jYXRjaChmdW5jdGlvbihlJCQxKSB7CiAgICAgIG1hcmsyKCk7CiAgICAgIHJlamVjdChlJCQxKTsKICAgIH0pOwogIH0pOwp9CmZ1bmN0aW9uIG9uTm9kZShub2RlMikgewogIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdm9pZCAwID8gYXJndW1lbnRzWzFdIDogbnVsbDsKICBnZW5lcmF0ZU11dGF0aW9uKG5vZGUyKS50aGVuKGZ1bmN0aW9uKG11dGF0aW9uKSB7CiAgICBpZiAobXV0YXRpb24pIHsKICAgICAgcGVyZm9ybShbbXV0YXRpb25dLCBjYWxsYmFjayk7CiAgICB9CiAgfSk7Cn0KZnVuY3Rpb24gcmVzb2x2ZUljb25zKG5leHQyKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKG1heWJlSWNvbkRlZmluaXRpb24pIHsKICAgIHZhciBwYXJhbXMyID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB2b2lkIDAgPyBhcmd1bWVudHNbMV0gOiB7fTsKICAgIHZhciBpY29uRGVmaW5pdGlvbiA9IChtYXliZUljb25EZWZpbml0aW9uIHx8IHt9KS5pY29uID8gbWF5YmVJY29uRGVmaW5pdGlvbiA6IGZpbmRJY29uRGVmaW5pdGlvbihtYXliZUljb25EZWZpbml0aW9uIHx8IHt9KTsKICAgIHZhciBtYXNrID0gcGFyYW1zMi5tYXNrOwogICAgaWYgKG1hc2spIHsKICAgICAgbWFzayA9IChtYXNrIHx8IHt9KS5pY29uID8gbWFzayA6IGZpbmRJY29uRGVmaW5pdGlvbihtYXNrIHx8IHt9KTsKICAgIH0KICAgIHJldHVybiBuZXh0MihpY29uRGVmaW5pdGlvbiwgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIHBhcmFtczIpLCB7fSwgewogICAgICBtYXNrCiAgICB9KSk7CiAgfTsKfQpmdW5jdGlvbiBoZXhWYWx1ZUZyb21Db250ZW50KGNvbnRlbnQzKSB7CiAgdmFyIGNsZWFuZWQgPSBjb250ZW50My5yZXBsYWNlKENMRUFOX0NPTlRFTlRfUEFUVEVSTiwgIiIpOwogIHJldHVybiB0b0hleChfdG9Db25zdW1hYmxlQXJyYXkoY2xlYW5lZClbMF0gfHwgIiIpOwp9CmZ1bmN0aW9uIGlzU2Vjb25kYXJ5TGF5ZXIoc3R5bGVzMykgewogIHZhciBoYXNTdHlsaXN0aWNTZXQgPSBzdHlsZXMzLmdldFByb3BlcnR5VmFsdWUoImZvbnQtZmVhdHVyZS1zZXR0aW5ncyIpLmluY2x1ZGVzKCJzczAxIik7CiAgdmFyIGNvbnRlbnQzID0gc3R5bGVzMy5nZXRQcm9wZXJ0eVZhbHVlKCJjb250ZW50Iik7CiAgdmFyIGNsZWFuZWQgPSBjb250ZW50My5yZXBsYWNlKENMRUFOX0NPTlRFTlRfUEFUVEVSTiwgIiIpOwogIHZhciBjb2RlUG9pbnQgPSBjbGVhbmVkLmNvZGVQb2ludEF0KDApOwogIHZhciBpc1ByZXBlbmRUZW4gPSBjb2RlUG9pbnQgPj0gU0VDT05EQVJZX1VOSUNPREVfUkFOR0VbMF0gJiYgY29kZVBvaW50IDw9IFNFQ09OREFSWV9VTklDT0RFX1JBTkdFWzFdOwogIHZhciBpc0RvdWJsZWQgPSBjbGVhbmVkLmxlbmd0aCA9PT0gMiA/IGNsZWFuZWRbMF0gPT09IGNsZWFuZWRbMV0gOiBmYWxzZTsKICByZXR1cm4gaXNQcmVwZW5kVGVuIHx8IGlzRG91YmxlZCB8fCBoYXNTdHlsaXN0aWNTZXQ7Cn0KZnVuY3Rpb24gZ2V0UHJlZml4KGZvbnRGYW1pbHksIGZvbnRXZWlnaHQpIHsKICB2YXIgZm9udEZhbWlseVNhbml0aXplZCA9IGZvbnRGYW1pbHkucmVwbGFjZSgvXlsnIl18WyciXSQvZywgIiIpLnRvTG93ZXJDYXNlKCk7CiAgdmFyIGZvbnRXZWlnaHRJbnRlZ2VyID0gcGFyc2VJbnQoZm9udFdlaWdodCk7CiAgdmFyIGZvbnRXZWlnaHRTYW5pdGl6ZWQgPSBpc05hTihmb250V2VpZ2h0SW50ZWdlcikgPyAibm9ybWFsIiA6IGZvbnRXZWlnaHRJbnRlZ2VyOwogIHJldHVybiAoRk9OVF9GQU1JTFlfV0VJR0hUX1RPX1BSRUZJWFtmb250RmFtaWx5U2FuaXRpemVkXSB8fCB7fSlbZm9udFdlaWdodFNhbml0aXplZF0gfHwgRk9OVF9GQU1JTFlfV0VJR0hUX0ZBTExCQUNLW2ZvbnRGYW1pbHlTYW5pdGl6ZWRdOwp9CmZ1bmN0aW9uIHJlcGxhY2VGb3JQb3NpdGlvbihub2RlMiwgcG9zaXRpb24zKSB7CiAgdmFyIHBlbmRpbmdBdHRyaWJ1dGUgPSAiIi5jb25jYXQoREFUQV9GQV9QU0VVRE9fRUxFTUVOVF9QRU5ESU5HKS5jb25jYXQocG9zaXRpb24zLnJlcGxhY2UoIjoiLCAiLSIpKTsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZTIsIHJlamVjdCkgewogICAgaWYgKG5vZGUyLmdldEF0dHJpYnV0ZShwZW5kaW5nQXR0cmlidXRlKSAhPT0gbnVsbCkgewogICAgICByZXR1cm4gcmVzb2x2ZTIoKTsKICAgIH0KICAgIHZhciBjaGlsZHJlbjIgPSB0b0FycmF5Mihub2RlMi5jaGlsZHJlbik7CiAgICB2YXIgYWxyZWFkeVByb2Nlc3NlZFBzZXVkb0VsZW1lbnQgPSBjaGlsZHJlbjIuZmlsdGVyKGZ1bmN0aW9uKGMkJDEpIHsKICAgICAgcmV0dXJuIGMkJDEuZ2V0QXR0cmlidXRlKERBVEFfRkFfUFNFVURPX0VMRU1FTlQpID09PSBwb3NpdGlvbjM7CiAgICB9KVswXTsKICAgIHZhciBzdHlsZXMzID0gV0lORE9XLmdldENvbXB1dGVkU3R5bGUobm9kZTIsIHBvc2l0aW9uMyk7CiAgICB2YXIgZm9udEZhbWlseSA9IHN0eWxlczMuZ2V0UHJvcGVydHlWYWx1ZSgiZm9udC1mYW1pbHkiKTsKICAgIHZhciBmb250RmFtaWx5TWF0Y2ggPSBmb250RmFtaWx5Lm1hdGNoKEZPTlRfRkFNSUxZX1BBVFRFUk4pOwogICAgdmFyIGZvbnRXZWlnaHQgPSBzdHlsZXMzLmdldFByb3BlcnR5VmFsdWUoImZvbnQtd2VpZ2h0Iik7CiAgICB2YXIgY29udGVudDMgPSBzdHlsZXMzLmdldFByb3BlcnR5VmFsdWUoImNvbnRlbnQiKTsKICAgIGlmIChhbHJlYWR5UHJvY2Vzc2VkUHNldWRvRWxlbWVudCAmJiAhZm9udEZhbWlseU1hdGNoKSB7CiAgICAgIG5vZGUyLnJlbW92ZUNoaWxkKGFscmVhZHlQcm9jZXNzZWRQc2V1ZG9FbGVtZW50KTsKICAgICAgcmV0dXJuIHJlc29sdmUyKCk7CiAgICB9IGVsc2UgaWYgKGZvbnRGYW1pbHlNYXRjaCAmJiBjb250ZW50MyAhPT0gIm5vbmUiICYmIGNvbnRlbnQzICE9PSAiIikgewogICAgICB2YXIgX2NvbnRlbnQgPSBzdHlsZXMzLmdldFByb3BlcnR5VmFsdWUoImNvbnRlbnQiKTsKICAgICAgdmFyIHByZWZpeDQgPSBnZXRQcmVmaXgoZm9udEZhbWlseSwgZm9udFdlaWdodCk7CiAgICAgIHZhciBoZXhWYWx1ZSA9IGhleFZhbHVlRnJvbUNvbnRlbnQoX2NvbnRlbnQpOwogICAgICB2YXIgaXNWNCA9IGZvbnRGYW1pbHlNYXRjaFswXS5zdGFydHNXaXRoKCJGb250QXdlc29tZSIpOwogICAgICB2YXIgaXNTZWNvbmRhcnkgPSBpc1NlY29uZGFyeUxheWVyKHN0eWxlczMpOwogICAgICB2YXIgaWNvbk5hbWUgPSBieVVuaWNvZGUocHJlZml4NCwgaGV4VmFsdWUpOwogICAgICB2YXIgaWNvbklkZW50aWZpZXIgPSBpY29uTmFtZTsKICAgICAgaWYgKGlzVjQpIHsKICAgICAgICB2YXIgaWNvbk5hbWU0ID0gYnlPbGRVbmljb2RlKGhleFZhbHVlKTsKICAgICAgICBpZiAoaWNvbk5hbWU0Lmljb25OYW1lICYmIGljb25OYW1lNC5wcmVmaXgpIHsKICAgICAgICAgIGljb25OYW1lID0gaWNvbk5hbWU0Lmljb25OYW1lOwogICAgICAgICAgcHJlZml4NCA9IGljb25OYW1lNC5wcmVmaXg7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpY29uTmFtZSAmJiAhaXNTZWNvbmRhcnkgJiYgKCFhbHJlYWR5UHJvY2Vzc2VkUHNldWRvRWxlbWVudCB8fCBhbHJlYWR5UHJvY2Vzc2VkUHNldWRvRWxlbWVudC5nZXRBdHRyaWJ1dGUoREFUQV9QUkVGSVgpICE9PSBwcmVmaXg0IHx8IGFscmVhZHlQcm9jZXNzZWRQc2V1ZG9FbGVtZW50LmdldEF0dHJpYnV0ZShEQVRBX0lDT04pICE9PSBpY29uSWRlbnRpZmllcikpIHsKICAgICAgICBub2RlMi5zZXRBdHRyaWJ1dGUocGVuZGluZ0F0dHJpYnV0ZSwgaWNvbklkZW50aWZpZXIpOwogICAgICAgIGlmIChhbHJlYWR5UHJvY2Vzc2VkUHNldWRvRWxlbWVudCkgewogICAgICAgICAgbm9kZTIucmVtb3ZlQ2hpbGQoYWxyZWFkeVByb2Nlc3NlZFBzZXVkb0VsZW1lbnQpOwogICAgICAgIH0KICAgICAgICB2YXIgbWV0YSA9IGJsYW5rTWV0YSgpOwogICAgICAgIHZhciBleHRyYSA9IG1ldGEuZXh0cmE7CiAgICAgICAgZXh0cmEuYXR0cmlidXRlc1tEQVRBX0ZBX1BTRVVET19FTEVNRU5UXSA9IHBvc2l0aW9uMzsKICAgICAgICBmaW5kSWNvbihpY29uTmFtZSwgcHJlZml4NCkudGhlbihmdW5jdGlvbihtYWluKSB7CiAgICAgICAgICB2YXIgYWJzdHJhY3QgPSBtYWtlSW5saW5lU3ZnQWJzdHJhY3QoX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG1ldGEpLCB7fSwgewogICAgICAgICAgICBpY29uczogewogICAgICAgICAgICAgIG1haW4sCiAgICAgICAgICAgICAgbWFzazogZW1wdHlDYW5vbmljYWxJY29uKCkKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcHJlZml4OiBwcmVmaXg0LAogICAgICAgICAgICBpY29uTmFtZTogaWNvbklkZW50aWZpZXIsCiAgICAgICAgICAgIGV4dHJhLAogICAgICAgICAgICB3YXRjaGFibGU6IHRydWUKICAgICAgICAgIH0pKTsKICAgICAgICAgIHZhciBlbGVtZW50NCA9IERPQ1VNRU5ULmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCAic3ZnIik7CiAgICAgICAgICBpZiAocG9zaXRpb24zID09PSAiOjpiZWZvcmUiKSB7CiAgICAgICAgICAgIG5vZGUyLmluc2VydEJlZm9yZShlbGVtZW50NCwgbm9kZTIuZmlyc3RDaGlsZCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBub2RlMi5hcHBlbmRDaGlsZChlbGVtZW50NCk7CiAgICAgICAgICB9CiAgICAgICAgICBlbGVtZW50NC5vdXRlckhUTUwgPSBhYnN0cmFjdC5tYXAoZnVuY3Rpb24oYSQkMSkgewogICAgICAgICAgICByZXR1cm4gdG9IdG1sMihhJCQxKTsKICAgICAgICAgIH0pLmpvaW4oIlxuIik7CiAgICAgICAgICBub2RlMi5yZW1vdmVBdHRyaWJ1dGUocGVuZGluZ0F0dHJpYnV0ZSk7CiAgICAgICAgICByZXNvbHZlMigpOwogICAgICAgIH0pLmNhdGNoKHJlamVjdCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzb2x2ZTIoKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVzb2x2ZTIoKTsKICAgIH0KICB9KTsKfQpmdW5jdGlvbiByZXBsYWNlNChub2RlMikgewogIHJldHVybiBQcm9taXNlLmFsbChbcmVwbGFjZUZvclBvc2l0aW9uKG5vZGUyLCAiOjpiZWZvcmUiKSwgcmVwbGFjZUZvclBvc2l0aW9uKG5vZGUyLCAiOjphZnRlciIpXSk7Cn0KZnVuY3Rpb24gcHJvY2Vzc2FibGUobm9kZTIpIHsKICByZXR1cm4gbm9kZTIucGFyZW50Tm9kZSAhPT0gZG9jdW1lbnQuaGVhZCAmJiAhflRBR05BTUVTX1RPX1NLSVBfRk9SX1BTRVVET0VMRU1FTlRTLmluZGV4T2Yobm9kZTIudGFnTmFtZS50b1VwcGVyQ2FzZSgpKSAmJiAhbm9kZTIuZ2V0QXR0cmlidXRlKERBVEFfRkFfUFNFVURPX0VMRU1FTlQpICYmICghbm9kZTIucGFyZW50Tm9kZSB8fCBub2RlMi5wYXJlbnROb2RlLnRhZ05hbWUgIT09ICJzdmciKTsKfQpmdW5jdGlvbiBzZWFyY2hQc2V1ZG9FbGVtZW50cyhyb290NikgewogIHZhciB1c2VBc05vZGVMaXN0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB2b2lkIDAgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTsKICBpZiAoIUlTX0RPTSkgcmV0dXJuOwogIHZhciBub2RlTGlzdDsKICBpZiAodXNlQXNOb2RlTGlzdCkgewogICAgbm9kZUxpc3QgPSByb290NjsKICB9IGVsc2UgaWYgKGNvbmZpZzIuc2VhcmNoUHNldWRvRWxlbWVudHNGdWxsU2NhbikgewogICAgbm9kZUxpc3QgPSByb290Ni5xdWVyeVNlbGVjdG9yQWxsKCIqIik7CiAgfSBlbHNlIHsKICAgIHZhciBzZWxlY3RvclNldCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGRvY3VtZW50LnN0eWxlU2hlZXRzKSwgX3N0ZXAyOwogICAgdHJ5IHsKICAgICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTsgKSB7CiAgICAgICAgdmFyIHN0eWxlc2hlZXQgPSBfc3RlcDIudmFsdWU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc3R5bGVzaGVldC5jc3NSdWxlcyksIF9zdGVwMzsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMy5zKCk7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMy5uKCkpLmRvbmU7ICkgewogICAgICAgICAgICAgIHZhciBydWxlID0gX3N0ZXAzLnZhbHVlOwogICAgICAgICAgICAgIHZhciBwYXJzZWRTZWxlY3RvcnMgPSBwYXJzZUNTU1J1bGVGb3JQc2V1ZG9zKHJ1bGUuc2VsZWN0b3JUZXh0KTsKICAgICAgICAgICAgICB2YXIgX2l0ZXJhdG9yNCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHBhcnNlZFNlbGVjdG9ycyksIF9zdGVwNDsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZm9yIChfaXRlcmF0b3I0LnMoKTsgIShfc3RlcDQgPSBfaXRlcmF0b3I0Lm4oKSkuZG9uZTsgKSB7CiAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvciA9IF9zdGVwNC52YWx1ZTsKICAgICAgICAgICAgICAgICAgc2VsZWN0b3JTZXQuYWRkKHNlbGVjdG9yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIF9pdGVyYXRvcjQuZShlcnIpOwogICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICBfaXRlcmF0b3I0LmYoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBfaXRlcmF0b3IzLmUoZXJyKTsKICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIF9pdGVyYXRvcjMuZigpOwogICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGUkJDEpIHsKICAgICAgICAgIGlmIChjb25maWcyLnNlYXJjaFBzZXVkb0VsZW1lbnRzV2FybmluZ3MpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCJGb250IEF3ZXNvbWU6IGNhbm5vdCBwYXJzZSBzdHlsZXNoZWV0OiAiLmNvbmNhdChzdHlsZXNoZWV0LmhyZWYsICIgKCIpLmNvbmNhdChlJCQxLm1lc3NhZ2UsICcpXG5JZiBpdCBkZWNsYXJlcyBhbnkgRm9udCBBd2Vzb21lIENTUyBwc2V1ZG8tZWxlbWVudHMsIHRoZXkgd2lsbCBub3QgYmUgcmVuZGVyZWQgYXMgU1ZHIGljb25zLiBBZGQgY3Jvc3NvcmlnaW49ImFub255bW91cyIgdG8gdGhlIDxsaW5rPiwgZW5hYmxlIHNlYXJjaFBzZXVkb0VsZW1lbnRzRnVsbFNjYW4gZm9yIHNsb3dlciBidXQgbW9yZSB0aG9yb3VnaCBET00gcGFyc2luZywgb3Igc3VwcHJlc3MgdGhpcyB3YXJuaW5nIGJ5IHNldHRpbmcgc2VhcmNoUHNldWRvRWxlbWVudHNXYXJuaW5ncyB0byBmYWxzZS4nKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgX2l0ZXJhdG9yMi5lKGVycik7CiAgICB9IGZpbmFsbHkgewogICAgICBfaXRlcmF0b3IyLmYoKTsKICAgIH0KICAgIGlmICghc2VsZWN0b3JTZXQuc2l6ZSkgcmV0dXJuOwogICAgdmFyIGNsZWFuU2VsZWN0b3JzID0gQXJyYXkuZnJvbShzZWxlY3RvclNldCkuam9pbigiLCAiKTsKICAgIHRyeSB7CiAgICAgIG5vZGVMaXN0ID0gcm9vdDYucXVlcnlTZWxlY3RvckFsbChjbGVhblNlbGVjdG9ycyk7CiAgICB9IGNhdGNoIChfdW51c2VkKSB7CiAgICB9CiAgfQogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlMiwgcmVqZWN0KSB7CiAgICB2YXIgb3BlcmF0aW9ucyA9IHRvQXJyYXkyKG5vZGVMaXN0KS5maWx0ZXIocHJvY2Vzc2FibGUpLm1hcChyZXBsYWNlNCk7CiAgICB2YXIgZW5kMyA9IHBlcmYuYmVnaW4oInNlYXJjaFBzZXVkb0VsZW1lbnRzIik7CiAgICBkaXNhYmxlT2JzZXJ2YXRpb24oKTsKICAgIFByb21pc2UuYWxsKG9wZXJhdGlvbnMpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgIGVuZDMoKTsKICAgICAgZW5hYmxlT2JzZXJ2YXRpb24oKTsKICAgICAgcmVzb2x2ZTIoKTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCkgewogICAgICBlbmQzKCk7CiAgICAgIGVuYWJsZU9ic2VydmF0aW9uKCk7CiAgICAgIHJlamVjdCgpOwogICAgfSk7CiAgfSk7Cn0KZnVuY3Rpb24gZmlsbEJsYWNrKGFic3RyYWN0KSB7CiAgdmFyIGZvcmNlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB2b2lkIDAgPyBhcmd1bWVudHNbMV0gOiB0cnVlOwogIGlmIChhYnN0cmFjdC5hdHRyaWJ1dGVzICYmIChhYnN0cmFjdC5hdHRyaWJ1dGVzLmZpbGwgfHwgZm9yY2UpKSB7CiAgICBhYnN0cmFjdC5hdHRyaWJ1dGVzLmZpbGwgPSAiYmxhY2siOwogIH0KICByZXR1cm4gYWJzdHJhY3Q7Cn0KZnVuY3Rpb24gZGVHcm91cChhYnN0cmFjdCkgewogIGlmIChhYnN0cmFjdC50YWcgPT09ICJnIikgewogICAgcmV0dXJuIGFic3RyYWN0LmNoaWxkcmVuOwogIH0gZWxzZSB7CiAgICByZXR1cm4gW2Fic3RyYWN0XTsKICB9Cn0KdmFyIG5vb3AyLCBfV0lORE9XLCBfRE9DVU1FTlQsIF9NVVRBVElPTl9PQlNFUlZFUiwgX1BFUkZPUk1BTkNFLCBfcmVmLCBfcmVmJHVzZXJBZ2VudCwgdXNlckFnZW50LCBXSU5ET1csIERPQ1VNRU5ULCBNVVRBVElPTl9PQlNFUlZFUiwgUEVSRk9STUFOQ0UsIElTX0JST1dTRVIsIElTX0RPTSwgSVNfSUUsIF9kdCwgRTIsIF8zLCBxLCBIMywgUSwgaTEwLCB0OCwgZDUsIGw1LCBmNiwgbjEyLCBoOCwgbzEyLCB1NiwgZzMsIHM4LCB5NCwgbTUsIGUxMCwgcDYsIGE0LCB3MiwgeDIsIGI0LCBjMTAsIEkyLCBGLCB2NCwgUzQsIEEyLCBQMywgajMsIEIyLCBOMywgazMsIEQzLCBUMiwgQzIsIFcsIEsyLCBSMywgcnQsIGR0MiwgZ3QsIEN0LCBVdCwgX3QsIFl0LCBxdCwgSHQsIEwyLCByMTAsIFUsIEosICR0LCBvbCwgZGwsIGZsLCB1bCwgX21sLCBsJDEsIGYkMSwgbiQxLCBvJDEsIHUkMSwgcyQxLCBoJDEsIGckMSwgeSQxLCBlJDEsIG0kMSwgcCQxLCBhJDEsIHckMSwgYiQxLCByJDEsIGMkMSwgaSQxLCB4JDEsIEkkMSwgRiQxLCB2JDEsIFMkMSwgQSQxLCBQJDEsIGokMSwgQiQxLCBOJDEsIGskMSwgRCQxLCBDJDEsIFQkMSwgTCQxLCBXJDEsIFIkMSwgSyQxLCBVJDEsIEokMSwgbWwkMSwgRSQxLCBkJDEsIF8kMSwgTSQxLCBydCQxLCAkdCQxLCB6MiwgSHQkMSwgWSQxLCBadCQxLCBHJDEsIE8kMSwgViQxLCAkJDEsIHRvLCBybywgTkFNRVNQQUNFX0lERU5USUZJRVIsIFVOSVRTX0lOX0dSSUQsIERFRkFVTFRfQ1NTX1BSRUZJWCwgREVGQVVMVF9SRVBMQUNFTUVOVF9DTEFTUywgREFUQV9GQV9JMlNWRywgREFUQV9GQV9QU0VVRE9fRUxFTUVOVCwgREFUQV9GQV9QU0VVRE9fRUxFTUVOVF9QRU5ESU5HLCBEQVRBX1BSRUZJWCwgREFUQV9JQ09OLCBIVE1MX0NMQVNTX0kyU1ZHX0JBU0VfQ0xBU1MsIE1VVEFUSU9OX0FQUFJPQUNIX0FTWU5DLCBUQUdOQU1FU19UT19TS0lQX0ZPUl9QU0VVRE9FTEVNRU5UUywgUFNFVURPX0VMRU1FTlRTLCBQUk9EVUNUSU9OLCBfUFJFRklYX1RPX1NUWUxFLCBQUkVGSVhfVE9fU1RZTEUsIF9TVFlMRV9UT19QUkVGSVgsIFNUWUxFX1RPX1BSRUZJWCwgX1BSRUZJWF9UT19MT05HX1NUWUxFLCBQUkVGSVhfVE9fTE9OR19TVFlMRSwgX0xPTkdfU1RZTEVfVE9fUFJFRklYLCBMT05HX1NUWUxFX1RPX1BSRUZJWCwgSUNPTl9TRUxFQ1RJT05fU1lOVEFYX1BBVFRFUk4sIExBWUVSU19URVhUX0NMQVNTTkFNRSwgRk9OVF9GQU1JTFlfUEFUVEVSTiwgX0ZPTlRfV0VJR0hUX1RPX1BSRUZJWCwgRk9OVF9XRUlHSFRfVE9fUFJFRklYLCBBVFRSSUJVVEVTX1dBVENIRURfRk9SX01VVEFUSU9OLCBEVU9UT05FX0NMQVNTRVMsIFJFU0VSVkVEX0NMQVNTRVMsIGluaXRpYWwsIF9kZWZhdWx0LCBfY29uZmlnLCBjb25maWcyLCBfb25DaGFuZ2VDYiwgZCQyLCBtZWFuaW5nbGVzc1RyYW5zZm9ybSwgaWRQb29sLCBiYXNlU3R5bGVzLCBfY3NzSW5zZXJ0ZWQsIEluamVjdENTUywgdyQyLCBuYW1lc3BhY2UsIGZ1bmN0aW9ucywgX2xpc3RlbmVyLCBsb2FkZWQsIGJpbmRJbnRlcm5hbDQsIHJlZHVjZTMsIE1PTk8sIERVTywgbW9kZXJuTWF0Y2hlcywgbGVnYWN5TWF0Y2hlcywgc3R5bGVzMiwgc2hpbXMsIEZBTUlMWV9OQU1FUywgUFJFRklYRVNfRk9SX0ZBTUlMWSwgX2RlZmF1bHRVc2FibGVQcmVmaXgsIF9ieVVuaWNvZGUsIF9ieUxpZ2F0dXJlLCBfYnlPbGROYW1lLCBfYnlPbGRVbmljb2RlLCBfYnlBbGlhcywgYnVpbGQsIGVtcHR5Q2Fub25pY2FsSWNvbiwgX2ZhQ29tYmluZWRDbGFzc2VzLCBuZXdDYW5vbmljYWxGYW1pbGllcywgbmV3Q2Fub25pY2FsU3R5bGVzLCBMaWJyYXJ5LCBfcGx1Z2lucywgX2hvb2tzLCBwcm92aWRlcnMsIGRlZmF1bHRQcm92aWRlcktleXMsIGxpYnJhcnksIG5vQXV0bywgZG9tLCBwYXJzZTcsIGFwaSwgYXV0b1JlcGxhY2UsIHN0eWxlcyQxLCBtaXNzaW5nSWNvblJlc29sdXRpb25NaXhpbiwgbm9vcCQxLCBwJDIsIHByZWFtYmxlLCBiZWdpbiwgZW5kLCBwZXJmLCBub29wJDIsIG11dGF0b3JzLCBkaXNhYmxlZCwgbW8sIHN0eWxlcyQyLCByZW5kZXIsIFJlcGxhY2VFbGVtZW50cywgTGF5ZXJzLCBMYXllcnNDb3VudGVyLCBMYXllcnNUZXh0LCBDTEVBTl9DT05URU5UX1BBVFRFUk4sIFNFQ09OREFSWV9VTklDT0RFX1JBTkdFLCBfRk9OVF9GQU1JTFlfV0VJR0hUX1RPX1BSRUZJWCwgRk9OVF9GQU1JTFlfV0VJR0hUX1RPX1BSRUZJWCwgRk9OVF9GQU1JTFlfV0VJR0hUX0ZBTExCQUNLLCBoYXNQc2V1ZG9FbGVtZW50LCBwYXJzZUNTU1J1bGVGb3JQc2V1ZG9zLCBQc2V1ZG9FbGVtZW50cywgX3Vud2F0Y2hlZCwgTXV0YXRpb25PYnNlcnZlciQxLCBwYXJzZVRyYW5zZm9ybVN0cmluZywgUG93ZXJUcmFuc2Zvcm1zLCBBTExfU1BBQ0UsIE1hc2tzLCBNaXNzaW5nSWNvbkluZGljYXRvciwgU3ZnU3ltYm9scywgcGx1Z2lucywgbm9BdXRvJDEsIGNvbmZpZyQxLCBsaWJyYXJ5JDEsIGRvbSQxLCBwYXJzZSQxLCBmaW5kSWNvbkRlZmluaXRpb24kMSwgdG9IdG1sJDEsIGljb24yLCBsYXllciwgdGV4dDgsIGNvdW50ZXIsIGF0dHJzOwp2YXIgaW5pdF9mb250YXdlc29tZV9zdmdfY29yZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0Bmb3J0YXdlc29tZStmb250YXdlc29tZS1zdmctY29yZUA3LjEuMC9ub2RlX21vZHVsZXMvQGZvcnRhd2Vzb21lL2ZvbnRhd2Vzb21lLXN2Zy1jb3JlL2luZGV4Lm1qcyIoKSB7CiAgICBub29wMiA9IGZ1bmN0aW9uIG5vb3AzKCkgewogICAgfTsKICAgIF9XSU5ET1cgPSB7fTsKICAgIF9ET0NVTUVOVCA9IHt9OwogICAgX01VVEFUSU9OX09CU0VSVkVSID0gbnVsbDsKICAgIF9QRVJGT1JNQU5DRSA9IHsKICAgICAgbWFyazogbm9vcDIsCiAgICAgIG1lYXN1cmU6IG5vb3AyCiAgICB9OwogICAgdHJ5IHsKICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiKSBfV0lORE9XID0gd2luZG93OwogICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIikgX0RPQ1VNRU5UID0gZG9jdW1lbnQ7CiAgICAgIGlmICh0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gInVuZGVmaW5lZCIpIF9NVVRBVElPTl9PQlNFUlZFUiA9IE11dGF0aW9uT2JzZXJ2ZXI7CiAgICAgIGlmICh0eXBlb2YgcGVyZm9ybWFuY2UgIT09ICJ1bmRlZmluZWQiKSBfUEVSRk9STUFOQ0UgPSBwZXJmb3JtYW5jZTsKICAgIH0gY2F0Y2ggKGUxMSkgewogICAgfQogICAgX3JlZiA9IF9XSU5ET1cubmF2aWdhdG9yIHx8IHt9LCBfcmVmJHVzZXJBZ2VudCA9IF9yZWYudXNlckFnZW50LCB1c2VyQWdlbnQgPSBfcmVmJHVzZXJBZ2VudCA9PT0gdm9pZCAwID8gIiIgOiBfcmVmJHVzZXJBZ2VudDsKICAgIFdJTkRPVyA9IF9XSU5ET1c7CiAgICBET0NVTUVOVCA9IF9ET0NVTUVOVDsKICAgIE1VVEFUSU9OX09CU0VSVkVSID0gX01VVEFUSU9OX09CU0VSVkVSOwogICAgUEVSRk9STUFOQ0UgPSBfUEVSRk9STUFOQ0U7CiAgICBJU19CUk9XU0VSID0gISFXSU5ET1cuZG9jdW1lbnQ7CiAgICBJU19ET00gPSAhIURPQ1VNRU5ULmRvY3VtZW50RWxlbWVudCAmJiAhIURPQ1VNRU5ULmhlYWQgJiYgdHlwZW9mIERPQ1VNRU5ULmFkZEV2ZW50TGlzdGVuZXIgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIERPQ1VNRU5ULmNyZWF0ZUVsZW1lbnQgPT09ICJmdW5jdGlvbiI7CiAgICBJU19JRSA9IH51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpIHx8IH51c2VyQWdlbnQuaW5kZXhPZigiVHJpZGVudC8iKTsKICAgIEUyID0gL2ZhKGt8a2R8c3xyfGx8dHxkfGRyfGRsfGR0fGJ8c2xyfHNscHJ8d3NifHRsfG5zfG5kc3xlc3xqcnxqZnJ8amRyfHVzYnx1ZnNifHVkc2J8Y3J8c3N8c3J8c2x8c3R8c2RzfHNkcnxzZGx8c2R0KT9bXC1cIF0vLCBfMyA9IC9Gb250ID9Bd2Vzb21lID8oWzU2NyBdKikoU29saWR8UmVndWxhcnxMaWdodHxUaGlufER1b3RvbmV8QnJhbmRzfEZyZWV8UHJvfFNoYXJwIER1b3RvbmV8U2hhcnB8S2l0fE5vdGRvZyBEdW98Tm90ZG9nfENoaXNlbHxFdGNofFRodW1icHJpbnR8SmVsbHkgRmlsbHxKZWxseSBEdW98SmVsbHl8VXRpbGl0eXxVdGlsaXR5IEZpbGx8VXRpbGl0eSBEdW98U2xhYiBQcmVzc3xTbGFifFdoaXRlYm9hcmQpPy4qL2k7CiAgICBxID0gewogICAgICBjbGFzc2ljOiB7CiAgICAgICAgZmE6ICJzb2xpZCIsCiAgICAgICAgZmFzOiAic29saWQiLAogICAgICAgICJmYS1zb2xpZCI6ICJzb2xpZCIsCiAgICAgICAgZmFyOiAicmVndWxhciIsCiAgICAgICAgImZhLXJlZ3VsYXIiOiAicmVndWxhciIsCiAgICAgICAgZmFsOiAibGlnaHQiLAogICAgICAgICJmYS1saWdodCI6ICJsaWdodCIsCiAgICAgICAgZmF0OiAidGhpbiIsCiAgICAgICAgImZhLXRoaW4iOiAidGhpbiIsCiAgICAgICAgZmFiOiAiYnJhbmRzIiwKICAgICAgICAiZmEtYnJhbmRzIjogImJyYW5kcyIKICAgICAgfSwKICAgICAgZHVvdG9uZTogewogICAgICAgIGZhOiAic29saWQiLAogICAgICAgIGZhZDogInNvbGlkIiwKICAgICAgICAiZmEtc29saWQiOiAic29saWQiLAogICAgICAgICJmYS1kdW90b25lIjogInNvbGlkIiwKICAgICAgICBmYWRyOiAicmVndWxhciIsCiAgICAgICAgImZhLXJlZ3VsYXIiOiAicmVndWxhciIsCiAgICAgICAgZmFkbDogImxpZ2h0IiwKICAgICAgICAiZmEtbGlnaHQiOiAibGlnaHQiLAogICAgICAgIGZhZHQ6ICJ0aGluIiwKICAgICAgICAiZmEtdGhpbiI6ICJ0aGluIgogICAgICB9LAogICAgICBzaGFycDogewogICAgICAgIGZhOiAic29saWQiLAogICAgICAgIGZhc3M6ICJzb2xpZCIsCiAgICAgICAgImZhLXNvbGlkIjogInNvbGlkIiwKICAgICAgICBmYXNyOiAicmVndWxhciIsCiAgICAgICAgImZhLXJlZ3VsYXIiOiAicmVndWxhciIsCiAgICAgICAgZmFzbDogImxpZ2h0IiwKICAgICAgICAiZmEtbGlnaHQiOiAibGlnaHQiLAogICAgICAgIGZhc3Q6ICJ0aGluIiwKICAgICAgICAiZmEtdGhpbiI6ICJ0aGluIgogICAgICB9LAogICAgICAic2hhcnAtZHVvdG9uZSI6IHsKICAgICAgICBmYTogInNvbGlkIiwKICAgICAgICBmYXNkczogInNvbGlkIiwKICAgICAgICAiZmEtc29saWQiOiAic29saWQiLAogICAgICAgIGZhc2RyOiAicmVndWxhciIsCiAgICAgICAgImZhLXJlZ3VsYXIiOiAicmVndWxhciIsCiAgICAgICAgZmFzZGw6ICJsaWdodCIsCiAgICAgICAgImZhLWxpZ2h0IjogImxpZ2h0IiwKICAgICAgICBmYXNkdDogInRoaW4iLAogICAgICAgICJmYS10aGluIjogInRoaW4iCiAgICAgIH0sCiAgICAgIHNsYWI6IHsKICAgICAgICAiZmEtcmVndWxhciI6ICJyZWd1bGFyIiwKICAgICAgICBmYXNscjogInJlZ3VsYXIiCiAgICAgIH0sCiAgICAgICJzbGFiLXByZXNzIjogewogICAgICAgICJmYS1yZWd1bGFyIjogInJlZ3VsYXIiLAogICAgICAgIGZhc2xwcjogInJlZ3VsYXIiCiAgICAgIH0sCiAgICAgIHRodW1icHJpbnQ6IHsKICAgICAgICAiZmEtbGlnaHQiOiAibGlnaHQiLAogICAgICAgIGZhdGw6ICJsaWdodCIKICAgICAgfSwKICAgICAgd2hpdGVib2FyZDogewogICAgICAgICJmYS1zZW1pYm9sZCI6ICJzZW1pYm9sZCIsCiAgICAgICAgZmF3c2I6ICJzZW1pYm9sZCIKICAgICAgfSwKICAgICAgbm90ZG9nOiB7CiAgICAgICAgImZhLXNvbGlkIjogInNvbGlkIiwKICAgICAgICBmYW5zOiAic29saWQiCiAgICAgIH0sCiAgICAgICJub3Rkb2ctZHVvIjogewogICAgICAgICJmYS1zb2xpZCI6ICJzb2xpZCIsCiAgICAgICAgZmFuZHM6ICJzb2xpZCIKICAgICAgfSwKICAgICAgZXRjaDogewogICAgICAgICJmYS1zb2xpZCI6ICJzb2xpZCIsCiAgICAgICAgZmFlczogInNvbGlkIgogICAgICB9LAogICAgICBqZWxseTogewogICAgICAgICJmYS1yZWd1bGFyIjogInJlZ3VsYXIiLAogICAgICAgIGZhanI6ICJyZWd1bGFyIgogICAgICB9LAogICAgICAiamVsbHktZmlsbCI6IHsKICAgICAgICAiZmEtcmVndWxhciI6ICJyZWd1bGFyIiwKICAgICAgICBmYWpmcjogInJlZ3VsYXIiCiAgICAgIH0sCiAgICAgICJqZWxseS1kdW8iOiB7CiAgICAgICAgImZhLXJlZ3VsYXIiOiAicmVndWxhciIsCiAgICAgICAgZmFqZHI6ICJyZWd1bGFyIgogICAgICB9LAogICAgICBjaGlzZWw6IHsKICAgICAgICAiZmEtcmVndWxhciI6ICJyZWd1bGFyIiwKICAgICAgICBmYWNyOiAicmVndWxhciIKICAgICAgfSwKICAgICAgdXRpbGl0eTogewogICAgICAgICJmYS1zZW1pYm9sZCI6ICJzZW1pYm9sZCIsCiAgICAgICAgZmF1c2I6ICJzZW1pYm9sZCIKICAgICAgfSwKICAgICAgInV0aWxpdHktZHVvIjogewogICAgICAgICJmYS1zZW1pYm9sZCI6ICJzZW1pYm9sZCIsCiAgICAgICAgZmF1ZHNiOiAic2VtaWJvbGQiCiAgICAgIH0sCiAgICAgICJ1dGlsaXR5LWZpbGwiOiB7CiAgICAgICAgImZhLXNlbWlib2xkIjogInNlbWlib2xkIiwKICAgICAgICBmYXVmc2I6ICJzZW1pYm9sZCIKICAgICAgfQogICAgfSwgSDMgPSB7CiAgICAgIEdST1VQOiAiZHVvdG9uZS1ncm91cCIsCiAgICAgIFNXQVBfT1BBQ0lUWTogInN3YXAtb3BhY2l0eSIsCiAgICAgIFBSSU1BUlk6ICJwcmltYXJ5IiwKICAgICAgU0VDT05EQVJZOiAic2Vjb25kYXJ5IgogICAgfSwgUSA9IFsiZmEtY2xhc3NpYyIsICJmYS1kdW90b25lIiwgImZhLXNoYXJwIiwgImZhLXNoYXJwLWR1b3RvbmUiLCAiZmEtdGh1bWJwcmludCIsICJmYS13aGl0ZWJvYXJkIiwgImZhLW5vdGRvZyIsICJmYS1ub3Rkb2ctZHVvIiwgImZhLWNoaXNlbCIsICJmYS1ldGNoIiwgImZhLWplbGx5IiwgImZhLWplbGx5LWZpbGwiLCAiZmEtamVsbHktZHVvIiwgImZhLXNsYWIiLCAiZmEtc2xhYi1wcmVzcyIsICJmYS11dGlsaXR5IiwgImZhLXV0aWxpdHktZHVvIiwgImZhLXV0aWxpdHktZmlsbCJdOwogICAgaTEwID0gImNsYXNzaWMiLCB0OCA9ICJkdW90b25lIiwgZDUgPSAic2hhcnAiLCBsNSA9ICJzaGFycC1kdW90b25lIiwgZjYgPSAiY2hpc2VsIiwgbjEyID0gImV0Y2giLCBoOCA9ICJqZWxseSIsIG8xMiA9ICJqZWxseS1kdW8iLCB1NiA9ICJqZWxseS1maWxsIiwgZzMgPSAibm90ZG9nIiwgczggPSAibm90ZG9nLWR1byIsIHk0ID0gInNsYWIiLCBtNSA9ICJzbGFiLXByZXNzIiwgZTEwID0gInRodW1icHJpbnQiLCBwNiA9ICJ1dGlsaXR5IiwgYTQgPSAidXRpbGl0eS1kdW8iLCB3MiA9ICJ1dGlsaXR5LWZpbGwiLCB4MiA9ICJ3aGl0ZWJvYXJkIiwgYjQgPSAiQ2xhc3NpYyIsIGMxMCA9ICJEdW90b25lIiwgSTIgPSAiU2hhcnAiLCBGID0gIlNoYXJwIER1b3RvbmUiLCB2NCA9ICJDaGlzZWwiLCBTNCA9ICJFdGNoIiwgQTIgPSAiSmVsbHkiLCBQMyA9ICJKZWxseSBEdW8iLCBqMyA9ICJKZWxseSBGaWxsIiwgQjIgPSAiTm90ZG9nIiwgTjMgPSAiTm90ZG9nIER1byIsIGszID0gIlNsYWIiLCBEMyA9ICJTbGFiIFByZXNzIiwgVDIgPSAiVGh1bWJwcmludCIsIEMyID0gIlV0aWxpdHkiLCBXID0gIlV0aWxpdHkgRHVvIiwgSzIgPSAiVXRpbGl0eSBGaWxsIiwgUjMgPSAiV2hpdGVib2FyZCIsIHJ0ID0gW2kxMCwgdDgsIGQ1LCBsNSwgZjYsIG4xMiwgaDgsIG8xMiwgdTYsIGczLCBzOCwgeTQsIG01LCBlMTAsIHA2LCBhNCwgdzIsIHgyXSwgZHQyID0gKF9kdCA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2R0LCBpMTAsIGI0KSwgdDgsIGMxMCksIGQ1LCBJMiksIGw1LCBGKSwgZjYsIHY0KSwgbjEyLCBTNCksIGg4LCBBMiksIG8xMiwgUDMpLCB1NiwgajMpLCBnMywgQjIpLCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kdCwgczgsIE4zKSwgeTQsIGszKSwgbTUsIEQzKSwgZTEwLCBUMiksIHA2LCBDMiksIGE0LCBXKSwgdzIsIEsyKSwgeDIsIFIzKSk7CiAgICBndCA9IHsKICAgICAgY2xhc3NpYzogewogICAgICAgIDkwMDogImZhcyIsCiAgICAgICAgNDAwOiAiZmFyIiwKICAgICAgICBub3JtYWw6ICJmYXIiLAogICAgICAgIDMwMDogImZhbCIsCiAgICAgICAgMTAwOiAiZmF0IgogICAgICB9LAogICAgICBkdW90b25lOiB7CiAgICAgICAgOTAwOiAiZmFkIiwKICAgICAgICA0MDA6ICJmYWRyIiwKICAgICAgICAzMDA6ICJmYWRsIiwKICAgICAgICAxMDA6ICJmYWR0IgogICAgICB9LAogICAgICBzaGFycDogewogICAgICAgIDkwMDogImZhc3MiLAogICAgICAgIDQwMDogImZhc3IiLAogICAgICAgIDMwMDogImZhc2wiLAogICAgICAgIDEwMDogImZhc3QiCiAgICAgIH0sCiAgICAgICJzaGFycC1kdW90b25lIjogewogICAgICAgIDkwMDogImZhc2RzIiwKICAgICAgICA0MDA6ICJmYXNkciIsCiAgICAgICAgMzAwOiAiZmFzZGwiLAogICAgICAgIDEwMDogImZhc2R0IgogICAgICB9LAogICAgICBzbGFiOiB7CiAgICAgICAgNDAwOiAiZmFzbHIiCiAgICAgIH0sCiAgICAgICJzbGFiLXByZXNzIjogewogICAgICAgIDQwMDogImZhc2xwciIKICAgICAgfSwKICAgICAgd2hpdGVib2FyZDogewogICAgICAgIDYwMDogImZhd3NiIgogICAgICB9LAogICAgICB0aHVtYnByaW50OiB7CiAgICAgICAgMzAwOiAiZmF0bCIKICAgICAgfSwKICAgICAgbm90ZG9nOiB7CiAgICAgICAgOTAwOiAiZmFucyIKICAgICAgfSwKICAgICAgIm5vdGRvZy1kdW8iOiB7CiAgICAgICAgOTAwOiAiZmFuZHMiCiAgICAgIH0sCiAgICAgIGV0Y2g6IHsKICAgICAgICA5MDA6ICJmYWVzIgogICAgICB9LAogICAgICBjaGlzZWw6IHsKICAgICAgICA0MDA6ICJmYWNyIgogICAgICB9LAogICAgICBqZWxseTogewogICAgICAgIDQwMDogImZhanIiCiAgICAgIH0sCiAgICAgICJqZWxseS1maWxsIjogewogICAgICAgIDQwMDogImZhamZyIgogICAgICB9LAogICAgICAiamVsbHktZHVvIjogewogICAgICAgIDQwMDogImZhamRyIgogICAgICB9LAogICAgICB1dGlsaXR5OiB7CiAgICAgICAgNjAwOiAiZmF1c2IiCiAgICAgIH0sCiAgICAgICJ1dGlsaXR5LWR1byI6IHsKICAgICAgICA2MDA6ICJmYXVkc2IiCiAgICAgIH0sCiAgICAgICJ1dGlsaXR5LWZpbGwiOiB7CiAgICAgICAgNjAwOiAiZmF1ZnNiIgogICAgICB9CiAgICB9OwogICAgQ3QgPSB7CiAgICAgICJGb250IEF3ZXNvbWUgNyBGcmVlIjogewogICAgICAgIDkwMDogImZhcyIsCiAgICAgICAgNDAwOiAiZmFyIgogICAgICB9LAogICAgICAiRm9udCBBd2Vzb21lIDcgUHJvIjogewogICAgICAgIDkwMDogImZhcyIsCiAgICAgICAgNDAwOiAiZmFyIiwKICAgICAgICBub3JtYWw6ICJmYXIiLAogICAgICAgIDMwMDogImZhbCIsCiAgICAgICAgMTAwOiAiZmF0IgogICAgICB9LAogICAgICAiRm9udCBBd2Vzb21lIDcgQnJhbmRzIjogewogICAgICAgIDQwMDogImZhYiIsCiAgICAgICAgbm9ybWFsOiAiZmFiIgogICAgICB9LAogICAgICAiRm9udCBBd2Vzb21lIDcgRHVvdG9uZSI6IHsKICAgICAgICA5MDA6ICJmYWQiLAogICAgICAgIDQwMDogImZhZHIiLAogICAgICAgIG5vcm1hbDogImZhZHIiLAogICAgICAgIDMwMDogImZhZGwiLAogICAgICAgIDEwMDogImZhZHQiCiAgICAgIH0sCiAgICAgICJGb250IEF3ZXNvbWUgNyBTaGFycCI6IHsKICAgICAgICA5MDA6ICJmYXNzIiwKICAgICAgICA0MDA6ICJmYXNyIiwKICAgICAgICBub3JtYWw6ICJmYXNyIiwKICAgICAgICAzMDA6ICJmYXNsIiwKICAgICAgICAxMDA6ICJmYXN0IgogICAgICB9LAogICAgICAiRm9udCBBd2Vzb21lIDcgU2hhcnAgRHVvdG9uZSI6IHsKICAgICAgICA5MDA6ICJmYXNkcyIsCiAgICAgICAgNDAwOiAiZmFzZHIiLAogICAgICAgIG5vcm1hbDogImZhc2RyIiwKICAgICAgICAzMDA6ICJmYXNkbCIsCiAgICAgICAgMTAwOiAiZmFzZHQiCiAgICAgIH0sCiAgICAgICJGb250IEF3ZXNvbWUgNyBKZWxseSI6IHsKICAgICAgICA0MDA6ICJmYWpyIiwKICAgICAgICBub3JtYWw6ICJmYWpyIgogICAgICB9LAogICAgICAiRm9udCBBd2Vzb21lIDcgSmVsbHkgRmlsbCI6IHsKICAgICAgICA0MDA6ICJmYWpmciIsCiAgICAgICAgbm9ybWFsOiAiZmFqZnIiCiAgICAgIH0sCiAgICAgICJGb250IEF3ZXNvbWUgNyBKZWxseSBEdW8iOiB7CiAgICAgICAgNDAwOiAiZmFqZHIiLAogICAgICAgIG5vcm1hbDogImZhamRyIgogICAgICB9LAogICAgICAiRm9udCBBd2Vzb21lIDcgU2xhYiI6IHsKICAgICAgICA0MDA6ICJmYXNsciIsCiAgICAgICAgbm9ybWFsOiAiZmFzbHIiCiAgICAgIH0sCiAgICAgICJGb250IEF3ZXNvbWUgNyBTbGFiIFByZXNzIjogewogICAgICAgIDQwMDogImZhc2xwciIsCiAgICAgICAgbm9ybWFsOiAiZmFzbHByIgogICAgICB9LAogICAgICAiRm9udCBBd2Vzb21lIDcgVGh1bWJwcmludCI6IHsKICAgICAgICAzMDA6ICJmYXRsIiwKICAgICAgICBub3JtYWw6ICJmYXRsIgogICAgICB9LAogICAgICAiRm9udCBBd2Vzb21lIDcgTm90ZG9nIjogewogICAgICAgIDkwMDogImZhbnMiLAogICAgICAgIG5vcm1hbDogImZhbnMiCiAgICAgIH0sCiAgICAgICJGb250IEF3ZXNvbWUgNyBOb3Rkb2cgRHVvIjogewogICAgICAgIDkwMDogImZhbmRzIiwKICAgICAgICBub3JtYWw6ICJmYW5kcyIKICAgICAgfSwKICAgICAgIkZvbnQgQXdlc29tZSA3IEV0Y2giOiB7CiAgICAgICAgOTAwOiAiZmFlcyIsCiAgICAgICAgbm9ybWFsOiAiZmFlcyIKICAgICAgfSwKICAgICAgIkZvbnQgQXdlc29tZSA3IENoaXNlbCI6IHsKICAgICAgICA0MDA6ICJmYWNyIiwKICAgICAgICBub3JtYWw6ICJmYWNyIgogICAgICB9LAogICAgICAiRm9udCBBd2Vzb21lIDcgV2hpdGVib2FyZCI6IHsKICAgICAgICA2MDA6ICJmYXdzYiIsCiAgICAgICAgbm9ybWFsOiAiZmF3c2IiCiAgICAgIH0sCiAgICAgICJGb250IEF3ZXNvbWUgNyBVdGlsaXR5IjogewogICAgICAgIDYwMDogImZhdXNiIiwKICAgICAgICBub3JtYWw6ICJmYXVzYiIKICAgICAgfSwKICAgICAgIkZvbnQgQXdlc29tZSA3IFV0aWxpdHkgRHVvIjogewogICAgICAgIDYwMDogImZhdWRzYiIsCiAgICAgICAgbm9ybWFsOiAiZmF1ZHNiIgogICAgICB9LAogICAgICAiRm9udCBBd2Vzb21lIDcgVXRpbGl0eSBGaWxsIjogewogICAgICAgIDYwMDogImZhdWZzYiIsCiAgICAgICAgbm9ybWFsOiAiZmF1ZnNiIgogICAgICB9CiAgICB9OwogICAgVXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcChbWyJjbGFzc2ljIiwgewogICAgICBkZWZhdWx0U2hvcnRQcmVmaXhJZDogImZhcyIsCiAgICAgIGRlZmF1bHRTdHlsZUlkOiAic29saWQiLAogICAgICBzdHlsZUlkczogWyJzb2xpZCIsICJyZWd1bGFyIiwgImxpZ2h0IiwgInRoaW4iLCAiYnJhbmRzIl0sCiAgICAgIGZ1dHVyZVN0eWxlSWRzOiBbXSwKICAgICAgZGVmYXVsdEZvbnRXZWlnaHQ6IDkwMAogICAgfV0sIFsiZHVvdG9uZSIsIHsKICAgICAgZGVmYXVsdFNob3J0UHJlZml4SWQ6ICJmYWQiLAogICAgICBkZWZhdWx0U3R5bGVJZDogInNvbGlkIiwKICAgICAgc3R5bGVJZHM6IFsic29saWQiLCAicmVndWxhciIsICJsaWdodCIsICJ0aGluIl0sCiAgICAgIGZ1dHVyZVN0eWxlSWRzOiBbXSwKICAgICAgZGVmYXVsdEZvbnRXZWlnaHQ6IDkwMAogICAgfV0sIFsic2hhcnAiLCB7CiAgICAgIGRlZmF1bHRTaG9ydFByZWZpeElkOiAiZmFzcyIsCiAgICAgIGRlZmF1bHRTdHlsZUlkOiAic29saWQiLAogICAgICBzdHlsZUlkczogWyJzb2xpZCIsICJyZWd1bGFyIiwgImxpZ2h0IiwgInRoaW4iXSwKICAgICAgZnV0dXJlU3R5bGVJZHM6IFtdLAogICAgICBkZWZhdWx0Rm9udFdlaWdodDogOTAwCiAgICB9XSwgWyJzaGFycC1kdW90b25lIiwgewogICAgICBkZWZhdWx0U2hvcnRQcmVmaXhJZDogImZhc2RzIiwKICAgICAgZGVmYXVsdFN0eWxlSWQ6ICJzb2xpZCIsCiAgICAgIHN0eWxlSWRzOiBbInNvbGlkIiwgInJlZ3VsYXIiLCAibGlnaHQiLCAidGhpbiJdLAogICAgICBmdXR1cmVTdHlsZUlkczogW10sCiAgICAgIGRlZmF1bHRGb250V2VpZ2h0OiA5MDAKICAgIH1dLCBbImNoaXNlbCIsIHsKICAgICAgZGVmYXVsdFNob3J0UHJlZml4SWQ6ICJmYWNyIiwKICAgICAgZGVmYXVsdFN0eWxlSWQ6ICJyZWd1bGFyIiwKICAgICAgc3R5bGVJZHM6IFsicmVndWxhciJdLAogICAgICBmdXR1cmVTdHlsZUlkczogW10sCiAgICAgIGRlZmF1bHRGb250V2VpZ2h0OiA0MDAKICAgIH1dLCBbImV0Y2giLCB7CiAgICAgIGRlZmF1bHRTaG9ydFByZWZpeElkOiAiZmFlcyIsCiAgICAgIGRlZmF1bHRTdHlsZUlkOiAic29saWQiLAogICAgICBzdHlsZUlkczogWyJzb2xpZCJdLAogICAgICBmdXR1cmVTdHlsZUlkczogW10sCiAgICAgIGRlZmF1bHRGb250V2VpZ2h0OiA5MDAKICAgIH1dLCBbImplbGx5IiwgewogICAgICBkZWZhdWx0U2hvcnRQcmVmaXhJZDogImZhanIiLAogICAgICBkZWZhdWx0U3R5bGVJZDogInJlZ3VsYXIiLAogICAgICBzdHlsZUlkczogWyJyZWd1bGFyIl0sCiAgICAgIGZ1dHVyZVN0eWxlSWRzOiBbXSwKICAgICAgZGVmYXVsdEZvbnRXZWlnaHQ6IDQwMAogICAgfV0sIFsiamVsbHktZHVvIiwgewogICAgICBkZWZhdWx0U2hvcnRQcmVmaXhJZDogImZhamRyIiwKICAgICAgZGVmYXVsdFN0eWxlSWQ6ICJyZWd1bGFyIiwKICAgICAgc3R5bGVJZHM6IFsicmVndWxhciJdLAogICAgICBmdXR1cmVTdHlsZUlkczogW10sCiAgICAgIGRlZmF1bHRGb250V2VpZ2h0OiA0MDAKICAgIH1dLCBbImplbGx5LWZpbGwiLCB7CiAgICAgIGRlZmF1bHRTaG9ydFByZWZpeElkOiAiZmFqZnIiLAogICAgICBkZWZhdWx0U3R5bGVJZDogInJlZ3VsYXIiLAogICAgICBzdHlsZUlkczogWyJyZWd1bGFyIl0sCiAgICAgIGZ1dHVyZVN0eWxlSWRzOiBbXSwKICAgICAgZGVmYXVsdEZvbnRXZWlnaHQ6IDQwMAogICAgfV0sIFsibm90ZG9nIiwgewogICAgICBkZWZhdWx0U2hvcnRQcmVmaXhJZDogImZhbnMiLAogICAgICBkZWZhdWx0U3R5bGVJZDogInNvbGlkIiwKICAgICAgc3R5bGVJZHM6IFsic29saWQiXSwKICAgICAgZnV0dXJlU3R5bGVJZHM6IFtdLAogICAgICBkZWZhdWx0Rm9udFdlaWdodDogOTAwCiAgICB9XSwgWyJub3Rkb2ctZHVvIiwgewogICAgICBkZWZhdWx0U2hvcnRQcmVmaXhJZDogImZhbmRzIiwKICAgICAgZGVmYXVsdFN0eWxlSWQ6ICJzb2xpZCIsCiAgICAgIHN0eWxlSWRzOiBbInNvbGlkIl0sCiAgICAgIGZ1dHVyZVN0eWxlSWRzOiBbXSwKICAgICAgZGVmYXVsdEZvbnRXZWlnaHQ6IDkwMAogICAgfV0sIFsic2xhYiIsIHsKICAgICAgZGVmYXVsdFNob3J0UHJlZml4SWQ6ICJmYXNsciIsCiAgICAgIGRlZmF1bHRTdHlsZUlkOiAicmVndWxhciIsCiAgICAgIHN0eWxlSWRzOiBbInJlZ3VsYXIiXSwKICAgICAgZnV0dXJlU3R5bGVJZHM6IFtdLAogICAgICBkZWZhdWx0Rm9udFdlaWdodDogNDAwCiAgICB9XSwgWyJzbGFiLXByZXNzIiwgewogICAgICBkZWZhdWx0U2hvcnRQcmVmaXhJZDogImZhc2xwciIsCiAgICAgIGRlZmF1bHRTdHlsZUlkOiAicmVndWxhciIsCiAgICAgIHN0eWxlSWRzOiBbInJlZ3VsYXIiXSwKICAgICAgZnV0dXJlU3R5bGVJZHM6IFtdLAogICAgICBkZWZhdWx0Rm9udFdlaWdodDogNDAwCiAgICB9XSwgWyJ0aHVtYnByaW50IiwgewogICAgICBkZWZhdWx0U2hvcnRQcmVmaXhJZDogImZhdGwiLAogICAgICBkZWZhdWx0U3R5bGVJZDogImxpZ2h0IiwKICAgICAgc3R5bGVJZHM6IFsibGlnaHQiXSwKICAgICAgZnV0dXJlU3R5bGVJZHM6IFtdLAogICAgICBkZWZhdWx0Rm9udFdlaWdodDogMzAwCiAgICB9XSwgWyJ1dGlsaXR5IiwgewogICAgICBkZWZhdWx0U2hvcnRQcmVmaXhJZDogImZhdXNiIiwKICAgICAgZGVmYXVsdFN0eWxlSWQ6ICJzZW1pYm9sZCIsCiAgICAgIHN0eWxlSWRzOiBbInNlbWlib2xkIl0sCiAgICAgIGZ1dHVyZVN0eWxlSWRzOiBbXSwKICAgICAgZGVmYXVsdEZvbnRXZWlnaHQ6IDYwMAogICAgfV0sIFsidXRpbGl0eS1kdW8iLCB7CiAgICAgIGRlZmF1bHRTaG9ydFByZWZpeElkOiAiZmF1ZHNiIiwKICAgICAgZGVmYXVsdFN0eWxlSWQ6ICJzZW1pYm9sZCIsCiAgICAgIHN0eWxlSWRzOiBbInNlbWlib2xkIl0sCiAgICAgIGZ1dHVyZVN0eWxlSWRzOiBbXSwKICAgICAgZGVmYXVsdEZvbnRXZWlnaHQ6IDYwMAogICAgfV0sIFsidXRpbGl0eS1maWxsIiwgewogICAgICBkZWZhdWx0U2hvcnRQcmVmaXhJZDogImZhdWZzYiIsCiAgICAgIGRlZmF1bHRTdHlsZUlkOiAic2VtaWJvbGQiLAogICAgICBzdHlsZUlkczogWyJzZW1pYm9sZCJdLAogICAgICBmdXR1cmVTdHlsZUlkczogW10sCiAgICAgIGRlZmF1bHRGb250V2VpZ2h0OiA2MDAKICAgIH1dLCBbIndoaXRlYm9hcmQiLCB7CiAgICAgIGRlZmF1bHRTaG9ydFByZWZpeElkOiAiZmF3c2IiLAogICAgICBkZWZhdWx0U3R5bGVJZDogInNlbWlib2xkIiwKICAgICAgc3R5bGVJZHM6IFsic2VtaWJvbGQiXSwKICAgICAgZnV0dXJlU3R5bGVJZHM6IFtdLAogICAgICBkZWZhdWx0Rm9udFdlaWdodDogNjAwCiAgICB9XV0pLCBfdCA9IHsKICAgICAgY2hpc2VsOiB7CiAgICAgICAgcmVndWxhcjogImZhY3IiCiAgICAgIH0sCiAgICAgIGNsYXNzaWM6IHsKICAgICAgICBicmFuZHM6ICJmYWIiLAogICAgICAgIGxpZ2h0OiAiZmFsIiwKICAgICAgICByZWd1bGFyOiAiZmFyIiwKICAgICAgICBzb2xpZDogImZhcyIsCiAgICAgICAgdGhpbjogImZhdCIKICAgICAgfSwKICAgICAgZHVvdG9uZTogewogICAgICAgIGxpZ2h0OiAiZmFkbCIsCiAgICAgICAgcmVndWxhcjogImZhZHIiLAogICAgICAgIHNvbGlkOiAiZmFkIiwKICAgICAgICB0aGluOiAiZmFkdCIKICAgICAgfSwKICAgICAgZXRjaDogewogICAgICAgIHNvbGlkOiAiZmFlcyIKICAgICAgfSwKICAgICAgamVsbHk6IHsKICAgICAgICByZWd1bGFyOiAiZmFqciIKICAgICAgfSwKICAgICAgImplbGx5LWR1byI6IHsKICAgICAgICByZWd1bGFyOiAiZmFqZHIiCiAgICAgIH0sCiAgICAgICJqZWxseS1maWxsIjogewogICAgICAgIHJlZ3VsYXI6ICJmYWpmciIKICAgICAgfSwKICAgICAgbm90ZG9nOiB7CiAgICAgICAgc29saWQ6ICJmYW5zIgogICAgICB9LAogICAgICAibm90ZG9nLWR1byI6IHsKICAgICAgICBzb2xpZDogImZhbmRzIgogICAgICB9LAogICAgICBzaGFycDogewogICAgICAgIGxpZ2h0OiAiZmFzbCIsCiAgICAgICAgcmVndWxhcjogImZhc3IiLAogICAgICAgIHNvbGlkOiAiZmFzcyIsCiAgICAgICAgdGhpbjogImZhc3QiCiAgICAgIH0sCiAgICAgICJzaGFycC1kdW90b25lIjogewogICAgICAgIGxpZ2h0OiAiZmFzZGwiLAogICAgICAgIHJlZ3VsYXI6ICJmYXNkciIsCiAgICAgICAgc29saWQ6ICJmYXNkcyIsCiAgICAgICAgdGhpbjogImZhc2R0IgogICAgICB9LAogICAgICBzbGFiOiB7CiAgICAgICAgcmVndWxhcjogImZhc2xyIgogICAgICB9LAogICAgICAic2xhYi1wcmVzcyI6IHsKICAgICAgICByZWd1bGFyOiAiZmFzbHByIgogICAgICB9LAogICAgICB0aHVtYnByaW50OiB7CiAgICAgICAgbGlnaHQ6ICJmYXRsIgogICAgICB9LAogICAgICB1dGlsaXR5OiB7CiAgICAgICAgc2VtaWJvbGQ6ICJmYXVzYiIKICAgICAgfSwKICAgICAgInV0aWxpdHktZHVvIjogewogICAgICAgIHNlbWlib2xkOiAiZmF1ZHNiIgogICAgICB9LAogICAgICAidXRpbGl0eS1maWxsIjogewogICAgICAgIHNlbWlib2xkOiAiZmF1ZnNiIgogICAgICB9LAogICAgICB3aGl0ZWJvYXJkOiB7CiAgICAgICAgc2VtaWJvbGQ6ICJmYXdzYiIKICAgICAgfQogICAgfTsKICAgIFl0ID0gWyJmYWsiLCAiZmEta2l0IiwgImZha2QiLCAiZmEta2l0LWR1b3RvbmUiXSwgcXQgPSB7CiAgICAgIGtpdDogewogICAgICAgIGZhazogImtpdCIsCiAgICAgICAgImZhLWtpdCI6ICJraXQiCiAgICAgIH0sCiAgICAgICJraXQtZHVvdG9uZSI6IHsKICAgICAgICBmYWtkOiAia2l0LWR1b3RvbmUiLAogICAgICAgICJmYS1raXQtZHVvdG9uZSI6ICJraXQtZHVvdG9uZSIKICAgICAgfQogICAgfSwgSHQgPSBbImtpdCJdOwogICAgTDIgPSAia2l0IiwgcjEwID0gImtpdC1kdW90b25lIiwgVSA9ICJLaXQiLCBKID0gIktpdCBEdW90b25lIiwgJHQgPSBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBMMiwgVSksIHIxMCwgSik7CiAgICBvbCA9IHsKICAgICAga2l0OiB7CiAgICAgICAgImZhLWtpdCI6ICJmYWsiCiAgICAgIH0sCiAgICAgICJraXQtZHVvdG9uZSI6IHsKICAgICAgICAiZmEta2l0LWR1b3RvbmUiOiAiZmFrZCIKICAgICAgfQogICAgfTsKICAgIGRsID0gewogICAgICAiRm9udCBBd2Vzb21lIEtpdCI6IHsKICAgICAgICA0MDA6ICJmYWsiLAogICAgICAgIG5vcm1hbDogImZhayIKICAgICAgfSwKICAgICAgIkZvbnQgQXdlc29tZSBLaXQgRHVvdG9uZSI6IHsKICAgICAgICA0MDA6ICJmYWtkIiwKICAgICAgICBub3JtYWw6ICJmYWtkIgogICAgICB9CiAgICB9LCBmbCA9IHsKICAgICAga2l0OiB7CiAgICAgICAgZmFrOiAiZmEta2l0IgogICAgICB9LAogICAgICAia2l0LWR1b3RvbmUiOiB7CiAgICAgICAgZmFrZDogImZhLWtpdC1kdW90b25lIgogICAgICB9CiAgICB9OwogICAgdWwgPSB7CiAgICAgIGtpdDogewogICAgICAgIGtpdDogImZhayIKICAgICAgfSwKICAgICAgImtpdC1kdW90b25lIjogewogICAgICAgICJraXQtZHVvdG9uZSI6ICJmYWtkIgogICAgICB9CiAgICB9OwogICAgbCQxID0gewogICAgICBHUk9VUDogImR1b3RvbmUtZ3JvdXAiLAogICAgICBTV0FQX09QQUNJVFk6ICJzd2FwLW9wYWNpdHkiLAogICAgICBQUklNQVJZOiAicHJpbWFyeSIsCiAgICAgIFNFQ09OREFSWTogInNlY29uZGFyeSIKICAgIH0sIGYkMSA9IFsiZmEtY2xhc3NpYyIsICJmYS1kdW90b25lIiwgImZhLXNoYXJwIiwgImZhLXNoYXJwLWR1b3RvbmUiLCAiZmEtdGh1bWJwcmludCIsICJmYS13aGl0ZWJvYXJkIiwgImZhLW5vdGRvZyIsICJmYS1ub3Rkb2ctZHVvIiwgImZhLWNoaXNlbCIsICJmYS1ldGNoIiwgImZhLWplbGx5IiwgImZhLWplbGx5LWZpbGwiLCAiZmEtamVsbHktZHVvIiwgImZhLXNsYWIiLCAiZmEtc2xhYi1wcmVzcyIsICJmYS11dGlsaXR5IiwgImZhLXV0aWxpdHktZHVvIiwgImZhLXV0aWxpdHktZmlsbCJdOwogICAgbiQxID0gImNsYXNzaWMiLCBvJDEgPSAiZHVvdG9uZSIsIHUkMSA9ICJzaGFycCIsIHMkMSA9ICJzaGFycC1kdW90b25lIiwgaCQxID0gImNoaXNlbCIsIGckMSA9ICJldGNoIiwgeSQxID0gImplbGx5IiwgZSQxID0gImplbGx5LWR1byIsIG0kMSA9ICJqZWxseS1maWxsIiwgcCQxID0gIm5vdGRvZyIsIGEkMSA9ICJub3Rkb2ctZHVvIiwgdyQxID0gInNsYWIiLCBiJDEgPSAic2xhYi1wcmVzcyIsIHIkMSA9ICJ0aHVtYnByaW50IiwgYyQxID0gInV0aWxpdHkiLCBpJDEgPSAidXRpbGl0eS1kdW8iLCB4JDEgPSAidXRpbGl0eS1maWxsIiwgSSQxID0gIndoaXRlYm9hcmQiLCBGJDEgPSAiQ2xhc3NpYyIsIHYkMSA9ICJEdW90b25lIiwgUyQxID0gIlNoYXJwIiwgQSQxID0gIlNoYXJwIER1b3RvbmUiLCBQJDEgPSAiQ2hpc2VsIiwgaiQxID0gIkV0Y2giLCBCJDEgPSAiSmVsbHkiLCBOJDEgPSAiSmVsbHkgRHVvIiwgayQxID0gIkplbGx5IEZpbGwiLCBEJDEgPSAiTm90ZG9nIiwgQyQxID0gIk5vdGRvZyBEdW8iLCBUJDEgPSAiU2xhYiIsIEwkMSA9ICJTbGFiIFByZXNzIiwgVyQxID0gIlRodW1icHJpbnQiLCBSJDEgPSAiVXRpbGl0eSIsIEskMSA9ICJVdGlsaXR5IER1byIsIFUkMSA9ICJVdGlsaXR5IEZpbGwiLCBKJDEgPSAiV2hpdGVib2FyZCIsIG1sJDEgPSAoX21sID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfbWwsIG4kMSwgRiQxKSwgbyQxLCB2JDEpLCB1JDEsIFMkMSksIHMkMSwgQSQxKSwgaCQxLCBQJDEpLCBnJDEsIGokMSksIHkkMSwgQiQxKSwgZSQxLCBOJDEpLCBtJDEsIGskMSksIHAkMSwgRCQxKSwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfbWwsIGEkMSwgQyQxKSwgdyQxLCBUJDEpLCBiJDEsIEwkMSksIHIkMSwgVyQxKSwgYyQxLCBSJDEpLCBpJDEsIEskMSksIHgkMSwgVSQxKSwgSSQxLCBKJDEpKTsKICAgIEUkMSA9ICJraXQiLCBkJDEgPSAia2l0LWR1b3RvbmUiLCBfJDEgPSAiS2l0IiwgTSQxID0gIktpdCBEdW90b25lIiwgcnQkMSA9IF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIEUkMSwgXyQxKSwgZCQxLCBNJDEpOwogICAgJHQkMSA9IHsKICAgICAgY2xhc3NpYzogewogICAgICAgICJmYS1icmFuZHMiOiAiZmFiIiwKICAgICAgICAiZmEtZHVvdG9uZSI6ICJmYWQiLAogICAgICAgICJmYS1saWdodCI6ICJmYWwiLAogICAgICAgICJmYS1yZWd1bGFyIjogImZhciIsCiAgICAgICAgImZhLXNvbGlkIjogImZhcyIsCiAgICAgICAgImZhLXRoaW4iOiAiZmF0IgogICAgICB9LAogICAgICBkdW90b25lOiB7CiAgICAgICAgImZhLXJlZ3VsYXIiOiAiZmFkciIsCiAgICAgICAgImZhLWxpZ2h0IjogImZhZGwiLAogICAgICAgICJmYS10aGluIjogImZhZHQiCiAgICAgIH0sCiAgICAgIHNoYXJwOiB7CiAgICAgICAgImZhLXNvbGlkIjogImZhc3MiLAogICAgICAgICJmYS1yZWd1bGFyIjogImZhc3IiLAogICAgICAgICJmYS1saWdodCI6ICJmYXNsIiwKICAgICAgICAiZmEtdGhpbiI6ICJmYXN0IgogICAgICB9LAogICAgICAic2hhcnAtZHVvdG9uZSI6IHsKICAgICAgICAiZmEtc29saWQiOiAiZmFzZHMiLAogICAgICAgICJmYS1yZWd1bGFyIjogImZhc2RyIiwKICAgICAgICAiZmEtbGlnaHQiOiAiZmFzZGwiLAogICAgICAgICJmYS10aGluIjogImZhc2R0IgogICAgICB9LAogICAgICBzbGFiOiB7CiAgICAgICAgImZhLXJlZ3VsYXIiOiAiZmFzbHIiCiAgICAgIH0sCiAgICAgICJzbGFiLXByZXNzIjogewogICAgICAgICJmYS1yZWd1bGFyIjogImZhc2xwciIKICAgICAgfSwKICAgICAgd2hpdGVib2FyZDogewogICAgICAgICJmYS1zZW1pYm9sZCI6ICJmYXdzYiIKICAgICAgfSwKICAgICAgdGh1bWJwcmludDogewogICAgICAgICJmYS1saWdodCI6ICJmYXRsIgogICAgICB9LAogICAgICBub3Rkb2c6IHsKICAgICAgICAiZmEtc29saWQiOiAiZmFucyIKICAgICAgfSwKICAgICAgIm5vdGRvZy1kdW8iOiB7CiAgICAgICAgImZhLXNvbGlkIjogImZhbmRzIgogICAgICB9LAogICAgICBldGNoOiB7CiAgICAgICAgImZhLXNvbGlkIjogImZhZXMiCiAgICAgIH0sCiAgICAgIGplbGx5OiB7CiAgICAgICAgImZhLXJlZ3VsYXIiOiAiZmFqciIKICAgICAgfSwKICAgICAgImplbGx5LWZpbGwiOiB7CiAgICAgICAgImZhLXJlZ3VsYXIiOiAiZmFqZnIiCiAgICAgIH0sCiAgICAgICJqZWxseS1kdW8iOiB7CiAgICAgICAgImZhLXJlZ3VsYXIiOiAiZmFqZHIiCiAgICAgIH0sCiAgICAgIGNoaXNlbDogewogICAgICAgICJmYS1yZWd1bGFyIjogImZhY3IiCiAgICAgIH0sCiAgICAgIHV0aWxpdHk6IHsKICAgICAgICAiZmEtc2VtaWJvbGQiOiAiZmF1c2IiCiAgICAgIH0sCiAgICAgICJ1dGlsaXR5LWR1byI6IHsKICAgICAgICAiZmEtc2VtaWJvbGQiOiAiZmF1ZHNiIgogICAgICB9LAogICAgICAidXRpbGl0eS1maWxsIjogewogICAgICAgICJmYS1zZW1pYm9sZCI6ICJmYXVmc2IiCiAgICAgIH0KICAgIH0sIHoyID0gewogICAgICBjbGFzc2ljOiBbImZhcyIsICJmYXIiLCAiZmFsIiwgImZhdCIsICJmYWQiXSwKICAgICAgZHVvdG9uZTogWyJmYWRyIiwgImZhZGwiLCAiZmFkdCJdLAogICAgICBzaGFycDogWyJmYXNzIiwgImZhc3IiLCAiZmFzbCIsICJmYXN0Il0sCiAgICAgICJzaGFycC1kdW90b25lIjogWyJmYXNkcyIsICJmYXNkciIsICJmYXNkbCIsICJmYXNkdCJdLAogICAgICBzbGFiOiBbImZhc2xyIl0sCiAgICAgICJzbGFiLXByZXNzIjogWyJmYXNscHIiXSwKICAgICAgd2hpdGVib2FyZDogWyJmYXdzYiJdLAogICAgICB0aHVtYnByaW50OiBbImZhdGwiXSwKICAgICAgbm90ZG9nOiBbImZhbnMiXSwKICAgICAgIm5vdGRvZy1kdW8iOiBbImZhbmRzIl0sCiAgICAgIGV0Y2g6IFsiZmFlcyJdLAogICAgICBqZWxseTogWyJmYWpyIl0sCiAgICAgICJqZWxseS1maWxsIjogWyJmYWpmciJdLAogICAgICAiamVsbHktZHVvIjogWyJmYWpkciJdLAogICAgICBjaGlzZWw6IFsiZmFjciJdLAogICAgICB1dGlsaXR5OiBbImZhdXNiIl0sCiAgICAgICJ1dGlsaXR5LWR1byI6IFsiZmF1ZHNiIl0sCiAgICAgICJ1dGlsaXR5LWZpbGwiOiBbImZhdWZzYiJdCiAgICB9LCBIdCQxID0gewogICAgICBjbGFzc2ljOiB7CiAgICAgICAgZmFiOiAiZmEtYnJhbmRzIiwKICAgICAgICBmYWQ6ICJmYS1kdW90b25lIiwKICAgICAgICBmYWw6ICJmYS1saWdodCIsCiAgICAgICAgZmFyOiAiZmEtcmVndWxhciIsCiAgICAgICAgZmFzOiAiZmEtc29saWQiLAogICAgICAgIGZhdDogImZhLXRoaW4iCiAgICAgIH0sCiAgICAgIGR1b3RvbmU6IHsKICAgICAgICBmYWRyOiAiZmEtcmVndWxhciIsCiAgICAgICAgZmFkbDogImZhLWxpZ2h0IiwKICAgICAgICBmYWR0OiAiZmEtdGhpbiIKICAgICAgfSwKICAgICAgc2hhcnA6IHsKICAgICAgICBmYXNzOiAiZmEtc29saWQiLAogICAgICAgIGZhc3I6ICJmYS1yZWd1bGFyIiwKICAgICAgICBmYXNsOiAiZmEtbGlnaHQiLAogICAgICAgIGZhc3Q6ICJmYS10aGluIgogICAgICB9LAogICAgICAic2hhcnAtZHVvdG9uZSI6IHsKICAgICAgICBmYXNkczogImZhLXNvbGlkIiwKICAgICAgICBmYXNkcjogImZhLXJlZ3VsYXIiLAogICAgICAgIGZhc2RsOiAiZmEtbGlnaHQiLAogICAgICAgIGZhc2R0OiAiZmEtdGhpbiIKICAgICAgfSwKICAgICAgc2xhYjogewogICAgICAgIGZhc2xyOiAiZmEtcmVndWxhciIKICAgICAgfSwKICAgICAgInNsYWItcHJlc3MiOiB7CiAgICAgICAgZmFzbHByOiAiZmEtcmVndWxhciIKICAgICAgfSwKICAgICAgd2hpdGVib2FyZDogewogICAgICAgIGZhd3NiOiAiZmEtc2VtaWJvbGQiCiAgICAgIH0sCiAgICAgIHRodW1icHJpbnQ6IHsKICAgICAgICBmYXRsOiAiZmEtbGlnaHQiCiAgICAgIH0sCiAgICAgIG5vdGRvZzogewogICAgICAgIGZhbnM6ICJmYS1zb2xpZCIKICAgICAgfSwKICAgICAgIm5vdGRvZy1kdW8iOiB7CiAgICAgICAgZmFuZHM6ICJmYS1zb2xpZCIKICAgICAgfSwKICAgICAgZXRjaDogewogICAgICAgIGZhZXM6ICJmYS1zb2xpZCIKICAgICAgfSwKICAgICAgamVsbHk6IHsKICAgICAgICBmYWpyOiAiZmEtcmVndWxhciIKICAgICAgfSwKICAgICAgImplbGx5LWZpbGwiOiB7CiAgICAgICAgZmFqZnI6ICJmYS1yZWd1bGFyIgogICAgICB9LAogICAgICAiamVsbHktZHVvIjogewogICAgICAgIGZhamRyOiAiZmEtcmVndWxhciIKICAgICAgfSwKICAgICAgY2hpc2VsOiB7CiAgICAgICAgZmFjcjogImZhLXJlZ3VsYXIiCiAgICAgIH0sCiAgICAgIHV0aWxpdHk6IHsKICAgICAgICBmYXVzYjogImZhLXNlbWlib2xkIgogICAgICB9LAogICAgICAidXRpbGl0eS1kdW8iOiB7CiAgICAgICAgZmF1ZHNiOiAiZmEtc2VtaWJvbGQiCiAgICAgIH0sCiAgICAgICJ1dGlsaXR5LWZpbGwiOiB7CiAgICAgICAgZmF1ZnNiOiAiZmEtc2VtaWJvbGQiCiAgICAgIH0KICAgIH0sIFkkMSA9IFsiZmEtc29saWQiLCAiZmEtcmVndWxhciIsICJmYS1saWdodCIsICJmYS10aGluIiwgImZhLWR1b3RvbmUiLCAiZmEtYnJhbmRzIiwgImZhLXNlbWlib2xkIl0sIFp0JDEgPSBbImZhIiwgImZhcyIsICJmYXIiLCAiZmFsIiwgImZhdCIsICJmYWQiLCAiZmFkciIsICJmYWRsIiwgImZhZHQiLCAiZmFiIiwgImZhc3MiLCAiZmFzciIsICJmYXNsIiwgImZhc3QiLCAiZmFzZHMiLCAiZmFzZHIiLCAiZmFzZGwiLCAiZmFzZHQiLCAiZmFzbHIiLCAiZmFzbHByIiwgImZhd3NiIiwgImZhdGwiLCAiZmFucyIsICJmYW5kcyIsICJmYWVzIiwgImZhanIiLCAiZmFqZnIiLCAiZmFqZHIiLCAiZmFjciIsICJmYXVzYiIsICJmYXVkc2IiLCAiZmF1ZnNiIl0uY29uY2F0KGYkMSwgWSQxKSwgRyQxID0gWyJzb2xpZCIsICJyZWd1bGFyIiwgImxpZ2h0IiwgInRoaW4iLCAiZHVvdG9uZSIsICJicmFuZHMiLCAic2VtaWJvbGQiXSwgTyQxID0gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXSwgViQxID0gTyQxLmNvbmNhdChbMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjBdKSwgJCQxID0gWyJhdyIsICJmdyIsICJwdWxsLWxlZnQiLCAicHVsbC1yaWdodCJdLCB0byA9IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoT2JqZWN0LmtleXMoejIpKSwgRyQxLCAkJDEsIFsiMnhzIiwgInhzIiwgInNtIiwgImxnIiwgInhsIiwgIjJ4bCIsICJiZWF0IiwgImJvcmRlciIsICJmYWRlIiwgImJlYXQtZmFkZSIsICJib3VuY2UiLCAiZmxpcC1ib3RoIiwgImZsaXAtaG9yaXpvbnRhbCIsICJmbGlwLXZlcnRpY2FsIiwgImZsaXAiLCAiaW52ZXJzZSIsICJsYXllcnMiLCAibGF5ZXJzLWJvdHRvbS1sZWZ0IiwgImxheWVycy1ib3R0b20tcmlnaHQiLCAibGF5ZXJzLWNvdW50ZXIiLCAibGF5ZXJzLXRleHQiLCAibGF5ZXJzLXRvcC1sZWZ0IiwgImxheWVycy10b3AtcmlnaHQiLCAibGkiLCAicHVsbC1lbmQiLCAicHVsbC1zdGFydCIsICJwdWxzZSIsICJyb3RhdGUtMTgwIiwgInJvdGF0ZS0yNzAiLCAicm90YXRlLTkwIiwgInJvdGF0ZS1ieSIsICJzaGFrZSIsICJzcGluLXB1bHNlIiwgInNwaW4tcmV2ZXJzZSIsICJzcGluIiwgInN0YWNrLTF4IiwgInN0YWNrLTJ4IiwgInN0YWNrIiwgInVsIiwgIndpZHRoLWF1dG8iLCAid2lkdGgtZml4ZWQiLCBsJDEuR1JPVVAsIGwkMS5TV0FQX09QQUNJVFksIGwkMS5QUklNQVJZLCBsJDEuU0VDT05EQVJZXSkuY29uY2F0KE8kMS5tYXAoZnVuY3Rpb24odDkpIHsKICAgICAgcmV0dXJuICIiLmNvbmNhdCh0OSwgIngiKTsKICAgIH0pKS5jb25jYXQoViQxLm1hcChmdW5jdGlvbih0OSkgewogICAgICByZXR1cm4gInctIi5jb25jYXQodDkpOwogICAgfSkpOwogICAgcm8gPSB7CiAgICAgICJGb250IEF3ZXNvbWUgNSBGcmVlIjogewogICAgICAgIDkwMDogImZhcyIsCiAgICAgICAgNDAwOiAiZmFyIgogICAgICB9LAogICAgICAiRm9udCBBd2Vzb21lIDUgUHJvIjogewogICAgICAgIDkwMDogImZhcyIsCiAgICAgICAgNDAwOiAiZmFyIiwKICAgICAgICBub3JtYWw6ICJmYXIiLAogICAgICAgIDMwMDogImZhbCIKICAgICAgfSwKICAgICAgIkZvbnQgQXdlc29tZSA1IEJyYW5kcyI6IHsKICAgICAgICA0MDA6ICJmYWIiLAogICAgICAgIG5vcm1hbDogImZhYiIKICAgICAgfSwKICAgICAgIkZvbnQgQXdlc29tZSA1IER1b3RvbmUiOiB7CiAgICAgICAgOTAwOiAiZmFkIgogICAgICB9CiAgICB9OwogICAgTkFNRVNQQUNFX0lERU5USUZJRVIgPSAiX19fRk9OVF9BV0VTT01FX19fIjsKICAgIFVOSVRTX0lOX0dSSUQgPSAxNjsKICAgIERFRkFVTFRfQ1NTX1BSRUZJWCA9ICJmYSI7CiAgICBERUZBVUxUX1JFUExBQ0VNRU5UX0NMQVNTID0gInN2Zy1pbmxpbmUtLWZhIjsKICAgIERBVEFfRkFfSTJTVkcgPSAiZGF0YS1mYS1pMnN2ZyI7CiAgICBEQVRBX0ZBX1BTRVVET19FTEVNRU5UID0gImRhdGEtZmEtcHNldWRvLWVsZW1lbnQiOwogICAgREFUQV9GQV9QU0VVRE9fRUxFTUVOVF9QRU5ESU5HID0gImRhdGEtZmEtcHNldWRvLWVsZW1lbnQtcGVuZGluZyI7CiAgICBEQVRBX1BSRUZJWCA9ICJkYXRhLXByZWZpeCI7CiAgICBEQVRBX0lDT04gPSAiZGF0YS1pY29uIjsKICAgIEhUTUxfQ0xBU1NfSTJTVkdfQkFTRV9DTEFTUyA9ICJmb250YXdlc29tZS1pMnN2ZyI7CiAgICBNVVRBVElPTl9BUFBST0FDSF9BU1lOQyA9ICJhc3luYyI7CiAgICBUQUdOQU1FU19UT19TS0lQX0ZPUl9QU0VVRE9FTEVNRU5UUyA9IFsiSFRNTCIsICJIRUFEIiwgIlNUWUxFIiwgIlNDUklQVCJdOwogICAgUFNFVURPX0VMRU1FTlRTID0gWyI6OmJlZm9yZSIsICI6OmFmdGVyIiwgIjpiZWZvcmUiLCAiOmFmdGVyIl07CiAgICBQUk9EVUNUSU9OID0gKGZ1bmN0aW9uKCkgewogICAgICB0cnkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSBjYXRjaCAoZSQkMSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSkoKTsKICAgIF9QUkVGSVhfVE9fU1RZTEUgPSBfb2JqZWN0U3ByZWFkMih7fSwgcSk7CiAgICBfUFJFRklYX1RPX1NUWUxFW2kxMF0gPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgewogICAgICAiZmEtZHVvdG9uZSI6ICJkdW90b25lIgogICAgfSksIHFbaTEwXSksIHF0WyJraXQiXSksIHF0WyJraXQtZHVvdG9uZSJdKTsKICAgIFBSRUZJWF9UT19TVFlMRSA9IGZhbWlseVByb3h5KF9QUkVGSVhfVE9fU1RZTEUpOwogICAgX1NUWUxFX1RPX1BSRUZJWCA9IF9vYmplY3RTcHJlYWQyKHt9LCBfdCk7CiAgICBfU1RZTEVfVE9fUFJFRklYW2kxMF0gPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgewogICAgICBkdW90b25lOiAiZmFkIgogICAgfSksIF9TVFlMRV9UT19QUkVGSVhbaTEwXSksIHVsWyJraXQiXSksIHVsWyJraXQtZHVvdG9uZSJdKTsKICAgIFNUWUxFX1RPX1BSRUZJWCA9IGZhbWlseVByb3h5KF9TVFlMRV9UT19QUkVGSVgpOwogICAgX1BSRUZJWF9UT19MT05HX1NUWUxFID0gX29iamVjdFNwcmVhZDIoe30sIEh0JDEpOwogICAgX1BSRUZJWF9UT19MT05HX1NUWUxFW2kxMF0gPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgX1BSRUZJWF9UT19MT05HX1NUWUxFW2kxMF0pLCBmbFsia2l0Il0pOwogICAgUFJFRklYX1RPX0xPTkdfU1RZTEUgPSBmYW1pbHlQcm94eShfUFJFRklYX1RPX0xPTkdfU1RZTEUpOwogICAgX0xPTkdfU1RZTEVfVE9fUFJFRklYID0gX29iamVjdFNwcmVhZDIoe30sICR0JDEpOwogICAgX0xPTkdfU1RZTEVfVE9fUFJFRklYW2kxMF0gPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgX0xPTkdfU1RZTEVfVE9fUFJFRklYW2kxMF0pLCBvbFsia2l0Il0pOwogICAgTE9OR19TVFlMRV9UT19QUkVGSVggPSBmYW1pbHlQcm94eShfTE9OR19TVFlMRV9UT19QUkVGSVgpOwogICAgSUNPTl9TRUxFQ1RJT05fU1lOVEFYX1BBVFRFUk4gPSBFMjsKICAgIExBWUVSU19URVhUX0NMQVNTTkFNRSA9ICJmYS1sYXllcnMtdGV4dCI7CiAgICBGT05UX0ZBTUlMWV9QQVRURVJOID0gXzM7CiAgICBfRk9OVF9XRUlHSFRfVE9fUFJFRklYID0gX29iamVjdFNwcmVhZDIoe30sIGd0KTsKICAgIEZPTlRfV0VJR0hUX1RPX1BSRUZJWCA9IGZhbWlseVByb3h5KF9GT05UX1dFSUdIVF9UT19QUkVGSVgpOwogICAgQVRUUklCVVRFU19XQVRDSEVEX0ZPUl9NVVRBVElPTiA9IFsiY2xhc3MiLCAiZGF0YS1wcmVmaXgiLCAiZGF0YS1pY29uIiwgImRhdGEtZmEtdHJhbnNmb3JtIiwgImRhdGEtZmEtbWFzayJdOwogICAgRFVPVE9ORV9DTEFTU0VTID0gSDM7CiAgICBSRVNFUlZFRF9DTEFTU0VTID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShIdCksIF90b0NvbnN1bWFibGVBcnJheSh0bykpOwogICAgaW5pdGlhbCA9IFdJTkRPVy5Gb250QXdlc29tZUNvbmZpZyB8fCB7fTsKICAgIGlmIChET0NVTUVOVCAmJiB0eXBlb2YgRE9DVU1FTlQucXVlcnlTZWxlY3RvciA9PT0gImZ1bmN0aW9uIikgewogICAgICBhdHRycyA9IFtbImRhdGEtZmFtaWx5LXByZWZpeCIsICJmYW1pbHlQcmVmaXgiXSwgWyJkYXRhLWNzcy1wcmVmaXgiLCAiY3NzUHJlZml4Il0sIFsiZGF0YS1mYW1pbHktZGVmYXVsdCIsICJmYW1pbHlEZWZhdWx0Il0sIFsiZGF0YS1zdHlsZS1kZWZhdWx0IiwgInN0eWxlRGVmYXVsdCJdLCBbImRhdGEtcmVwbGFjZW1lbnQtY2xhc3MiLCAicmVwbGFjZW1lbnRDbGFzcyJdLCBbImRhdGEtYXV0by1yZXBsYWNlLXN2ZyIsICJhdXRvUmVwbGFjZVN2ZyJdLCBbImRhdGEtYXV0by1hZGQtY3NzIiwgImF1dG9BZGRDc3MiXSwgWyJkYXRhLXNlYXJjaC1wc2V1ZG8tZWxlbWVudHMiLCAic2VhcmNoUHNldWRvRWxlbWVudHMiXSwgWyJkYXRhLXNlYXJjaC1wc2V1ZG8tZWxlbWVudHMtd2FybmluZ3MiLCAic2VhcmNoUHNldWRvRWxlbWVudHNXYXJuaW5ncyJdLCBbImRhdGEtc2VhcmNoLXBzZXVkby1lbGVtZW50cy1mdWxsLXNjYW4iLCAic2VhcmNoUHNldWRvRWxlbWVudHNGdWxsU2NhbiJdLCBbImRhdGEtb2JzZXJ2ZS1tdXRhdGlvbnMiLCAib2JzZXJ2ZU11dGF0aW9ucyJdLCBbImRhdGEtbXV0YXRlLWFwcHJvYWNoIiwgIm11dGF0ZUFwcHJvYWNoIl0sIFsiZGF0YS1rZWVwLW9yaWdpbmFsLXNvdXJjZSIsICJrZWVwT3JpZ2luYWxTb3VyY2UiXSwgWyJkYXRhLW1lYXN1cmUtcGVyZm9ybWFuY2UiLCAibWVhc3VyZVBlcmZvcm1hbmNlIl0sIFsiZGF0YS1zaG93LW1pc3NpbmctaWNvbnMiLCAic2hvd01pc3NpbmdJY29ucyJdXTsKICAgICAgYXR0cnMuZm9yRWFjaChmdW5jdGlvbihfcmVmMikgewogICAgICAgIHZhciBfcmVmMjIgPSBfc2xpY2VkVG9BcnJheShfcmVmMiwgMiksIGF0dHIgPSBfcmVmMjJbMF0sIGtleTIgPSBfcmVmMjJbMV07CiAgICAgICAgdmFyIHZhbCA9IGNvZXJjZShnZXRBdHRyQ29uZmlnKGF0dHIpKTsKICAgICAgICBpZiAodmFsICE9PSB2b2lkIDAgJiYgdmFsICE9PSBudWxsKSB7CiAgICAgICAgICBpbml0aWFsW2tleTJdID0gdmFsOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBfZGVmYXVsdCA9IHsKICAgICAgc3R5bGVEZWZhdWx0OiAic29saWQiLAogICAgICBmYW1pbHlEZWZhdWx0OiBpMTAsCiAgICAgIGNzc1ByZWZpeDogREVGQVVMVF9DU1NfUFJFRklYLAogICAgICByZXBsYWNlbWVudENsYXNzOiBERUZBVUxUX1JFUExBQ0VNRU5UX0NMQVNTLAogICAgICBhdXRvUmVwbGFjZVN2ZzogdHJ1ZSwKICAgICAgYXV0b0FkZENzczogdHJ1ZSwKICAgICAgc2VhcmNoUHNldWRvRWxlbWVudHM6IGZhbHNlLAogICAgICBzZWFyY2hQc2V1ZG9FbGVtZW50c1dhcm5pbmdzOiB0cnVlLAogICAgICBzZWFyY2hQc2V1ZG9FbGVtZW50c0Z1bGxTY2FuOiBmYWxzZSwKICAgICAgb2JzZXJ2ZU11dGF0aW9uczogdHJ1ZSwKICAgICAgbXV0YXRlQXBwcm9hY2g6ICJhc3luYyIsCiAgICAgIGtlZXBPcmlnaW5hbFNvdXJjZTogdHJ1ZSwKICAgICAgbWVhc3VyZVBlcmZvcm1hbmNlOiBmYWxzZSwKICAgICAgc2hvd01pc3NpbmdJY29uczogdHJ1ZQogICAgfTsKICAgIGlmIChpbml0aWFsLmZhbWlseVByZWZpeCkgewogICAgICBpbml0aWFsLmNzc1ByZWZpeCA9IGluaXRpYWwuZmFtaWx5UHJlZml4OwogICAgfQogICAgX2NvbmZpZyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBfZGVmYXVsdCksIGluaXRpYWwpOwogICAgaWYgKCFfY29uZmlnLmF1dG9SZXBsYWNlU3ZnKSBfY29uZmlnLm9ic2VydmVNdXRhdGlvbnMgPSBmYWxzZTsKICAgIGNvbmZpZzIgPSB7fTsKICAgIE9iamVjdC5rZXlzKF9kZWZhdWx0KS5mb3JFYWNoKGZ1bmN0aW9uKGtleTIpIHsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbmZpZzIsIGtleTIsIHsKICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgIHNldDogZnVuY3Rpb24gc2V0Myh2YWwpIHsKICAgICAgICAgIF9jb25maWdba2V5Ml0gPSB2YWw7CiAgICAgICAgICBfb25DaGFuZ2VDYi5mb3JFYWNoKGZ1bmN0aW9uKGNiKSB7CiAgICAgICAgICAgIHJldHVybiBjYihjb25maWcyKTsKICAgICAgICAgIH0pOwogICAgICAgIH0sCiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQyKCkgewogICAgICAgICAgcmV0dXJuIF9jb25maWdba2V5Ml07CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbmZpZzIsICJmYW1pbHlQcmVmaXgiLCB7CiAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgIHNldDogZnVuY3Rpb24gc2V0Mih2YWwpIHsKICAgICAgICBfY29uZmlnLmNzc1ByZWZpeCA9IHZhbDsKICAgICAgICBfb25DaGFuZ2VDYi5mb3JFYWNoKGZ1bmN0aW9uKGNiKSB7CiAgICAgICAgICByZXR1cm4gY2IoY29uZmlnMik7CiAgICAgICAgfSk7CiAgICAgIH0sCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiBfY29uZmlnLmNzc1ByZWZpeDsKICAgICAgfQogICAgfSk7CiAgICBXSU5ET1cuRm9udEF3ZXNvbWVDb25maWcgPSBjb25maWcyOwogICAgX29uQ2hhbmdlQ2IgPSBbXTsKICAgIGQkMiA9IFVOSVRTX0lOX0dSSUQ7CiAgICBtZWFuaW5nbGVzc1RyYW5zZm9ybSA9IHsKICAgICAgc2l6ZTogMTYsCiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHJvdGF0ZTogMCwKICAgICAgZmxpcFg6IGZhbHNlLAogICAgICBmbGlwWTogZmFsc2UKICAgIH07CiAgICBpZFBvb2wgPSAiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiOwogICAgYmFzZVN0eWxlcyA9IGA6cm9vdCwgOmhvc3QgewogIC0tZmEtZm9udC1zb2xpZDogbm9ybWFsIDkwMCAxZW0vMSAiRm9udCBBd2Vzb21lIDcgRnJlZSI7CiAgLS1mYS1mb250LXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgIkZvbnQgQXdlc29tZSA3IEZyZWUiOwogIC0tZmEtZm9udC1saWdodDogbm9ybWFsIDMwMCAxZW0vMSAiRm9udCBBd2Vzb21lIDcgUHJvIjsKICAtLWZhLWZvbnQtdGhpbjogbm9ybWFsIDEwMCAxZW0vMSAiRm9udCBBd2Vzb21lIDcgUHJvIjsKICAtLWZhLWZvbnQtZHVvdG9uZTogbm9ybWFsIDkwMCAxZW0vMSAiRm9udCBBd2Vzb21lIDcgRHVvdG9uZSI7CiAgLS1mYS1mb250LWR1b3RvbmUtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAiRm9udCBBd2Vzb21lIDcgRHVvdG9uZSI7CiAgLS1mYS1mb250LWR1b3RvbmUtbGlnaHQ6IG5vcm1hbCAzMDAgMWVtLzEgIkZvbnQgQXdlc29tZSA3IER1b3RvbmUiOwogIC0tZmEtZm9udC1kdW90b25lLXRoaW46IG5vcm1hbCAxMDAgMWVtLzEgIkZvbnQgQXdlc29tZSA3IER1b3RvbmUiOwogIC0tZmEtZm9udC1icmFuZHM6IG5vcm1hbCA0MDAgMWVtLzEgIkZvbnQgQXdlc29tZSA3IEJyYW5kcyI7CiAgLS1mYS1mb250LXNoYXJwLXNvbGlkOiBub3JtYWwgOTAwIDFlbS8xICJGb250IEF3ZXNvbWUgNyBTaGFycCI7CiAgLS1mYS1mb250LXNoYXJwLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgIkZvbnQgQXdlc29tZSA3IFNoYXJwIjsKICAtLWZhLWZvbnQtc2hhcnAtbGlnaHQ6IG5vcm1hbCAzMDAgMWVtLzEgIkZvbnQgQXdlc29tZSA3IFNoYXJwIjsKICAtLWZhLWZvbnQtc2hhcnAtdGhpbjogbm9ybWFsIDEwMCAxZW0vMSAiRm9udCBBd2Vzb21lIDcgU2hhcnAiOwogIC0tZmEtZm9udC1zaGFycC1kdW90b25lLXNvbGlkOiBub3JtYWwgOTAwIDFlbS8xICJGb250IEF3ZXNvbWUgNyBTaGFycCBEdW90b25lIjsKICAtLWZhLWZvbnQtc2hhcnAtZHVvdG9uZS1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICJGb250IEF3ZXNvbWUgNyBTaGFycCBEdW90b25lIjsKICAtLWZhLWZvbnQtc2hhcnAtZHVvdG9uZS1saWdodDogbm9ybWFsIDMwMCAxZW0vMSAiRm9udCBBd2Vzb21lIDcgU2hhcnAgRHVvdG9uZSI7CiAgLS1mYS1mb250LXNoYXJwLWR1b3RvbmUtdGhpbjogbm9ybWFsIDEwMCAxZW0vMSAiRm9udCBBd2Vzb21lIDcgU2hhcnAgRHVvdG9uZSI7CiAgLS1mYS1mb250LXNsYWItcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAiRm9udCBBd2Vzb21lIDcgU2xhYiI7CiAgLS1mYS1mb250LXNsYWItcHJlc3MtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAiRm9udCBBd2Vzb21lIDcgU2xhYiBQcmVzcyI7CiAgLS1mYS1mb250LXdoaXRlYm9hcmQtc2VtaWJvbGQ6IG5vcm1hbCA2MDAgMWVtLzEgIkZvbnQgQXdlc29tZSA3IFdoaXRlYm9hcmQiOwogIC0tZmEtZm9udC10aHVtYnByaW50LWxpZ2h0OiBub3JtYWwgMzAwIDFlbS8xICJGb250IEF3ZXNvbWUgNyBUaHVtYnByaW50IjsKICAtLWZhLWZvbnQtbm90ZG9nLXNvbGlkOiBub3JtYWwgOTAwIDFlbS8xICJGb250IEF3ZXNvbWUgNyBOb3Rkb2ciOwogIC0tZmEtZm9udC1ub3Rkb2ctZHVvLXNvbGlkOiBub3JtYWwgOTAwIDFlbS8xICJGb250IEF3ZXNvbWUgNyBOb3Rkb2cgRHVvIjsKICAtLWZhLWZvbnQtZXRjaC1zb2xpZDogbm9ybWFsIDkwMCAxZW0vMSAiRm9udCBBd2Vzb21lIDcgRXRjaCI7CiAgLS1mYS1mb250LWplbGx5LXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgIkZvbnQgQXdlc29tZSA3IEplbGx5IjsKICAtLWZhLWZvbnQtamVsbHktZmlsbC1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICJGb250IEF3ZXNvbWUgNyBKZWxseSBGaWxsIjsKICAtLWZhLWZvbnQtamVsbHktZHVvLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgIkZvbnQgQXdlc29tZSA3IEplbGx5IER1byI7CiAgLS1mYS1mb250LWNoaXNlbC1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICJGb250IEF3ZXNvbWUgNyBDaGlzZWwiOwogIC0tZmEtZm9udC11dGlsaXR5LXNlbWlib2xkOiBub3JtYWwgNjAwIDFlbS8xICJGb250IEF3ZXNvbWUgNyBVdGlsaXR5IjsKICAtLWZhLWZvbnQtdXRpbGl0eS1kdW8tc2VtaWJvbGQ6IG5vcm1hbCA2MDAgMWVtLzEgIkZvbnQgQXdlc29tZSA3IFV0aWxpdHkgRHVvIjsKICAtLWZhLWZvbnQtdXRpbGl0eS1maWxsLXNlbWlib2xkOiBub3JtYWwgNjAwIDFlbS8xICJGb250IEF3ZXNvbWUgNyBVdGlsaXR5IEZpbGwiOwp9Cgouc3ZnLWlubGluZS0tZmEgewogIGJveC1zaXppbmc6IGNvbnRlbnQtYm94OwogIGRpc3BsYXk6IHZhcigtLWZhLWRpc3BsYXksIGlubGluZS1ibG9jayk7CiAgaGVpZ2h0OiAxZW07CiAgb3ZlcmZsb3c6IHZpc2libGU7CiAgdmVydGljYWwtYWxpZ246IC0wLjEyNWVtOwogIHdpZHRoOiB2YXIoLS1mYS13aWR0aCwgMS4yNWVtKTsKfQouc3ZnLWlubGluZS0tZmEuZmEtMnhzIHsKICB2ZXJ0aWNhbC1hbGlnbjogMC4xZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLXhzIHsKICB2ZXJ0aWNhbC1hbGlnbjogMGVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS1zbSB7CiAgdmVydGljYWwtYWxpZ246IC0wLjA3MTQyODU3MTRlbTsKfQouc3ZnLWlubGluZS0tZmEuZmEtbGcgewogIHZlcnRpY2FsLWFsaWduOiAtMC4yZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLXhsIHsKICB2ZXJ0aWNhbC1hbGlnbjogLTAuMjVlbTsKfQouc3ZnLWlubGluZS0tZmEuZmEtMnhsIHsKICB2ZXJ0aWNhbC1hbGlnbjogLTAuMzEyNWVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS1wdWxsLWxlZnQsCi5zdmctaW5saW5lLS1mYSAuZmEtcHVsbC1zdGFydCB7CiAgZmxvYXQ6IGlubGluZS1zdGFydDsKICBtYXJnaW4taW5saW5lLWVuZDogdmFyKC0tZmEtcHVsbC1tYXJnaW4sIDAuM2VtKTsKfQouc3ZnLWlubGluZS0tZmEuZmEtcHVsbC1yaWdodCwKLnN2Zy1pbmxpbmUtLWZhIC5mYS1wdWxsLWVuZCB7CiAgZmxvYXQ6IGlubGluZS1lbmQ7CiAgbWFyZ2luLWlubGluZS1zdGFydDogdmFyKC0tZmEtcHVsbC1tYXJnaW4sIDAuM2VtKTsKfQouc3ZnLWlubGluZS0tZmEuZmEtbGkgewogIHdpZHRoOiB2YXIoLS1mYS1saS13aWR0aCwgMmVtKTsKICBpbnNldC1pbmxpbmUtc3RhcnQ6IGNhbGMoLTEgKiB2YXIoLS1mYS1saS13aWR0aCwgMmVtKSk7CiAgaW5zZXQtYmxvY2stc3RhcnQ6IDAuMjVlbTsgLyogc3luY2luZyB2ZXJ0aWNhbCBhbGlnbm1lbnQgd2l0aCBXZWIgRm9udCByZW5kZXJpbmcgKi8KfQoKLmZhLWxheWVycy1jb3VudGVyLCAuZmEtbGF5ZXJzLXRleHQgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouZmEtbGF5ZXJzIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgaGVpZ2h0OiAxZW07CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB2ZXJ0aWNhbC1hbGlnbjogLTAuMTI1ZW07CiAgd2lkdGg6IHZhcigtLWZhLXdpZHRoLCAxLjI1ZW0pOwp9Ci5mYS1sYXllcnMgLnN2Zy1pbmxpbmUtLWZhIHsKICBpbnNldDogMDsKICBtYXJnaW46IGF1dG87CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7Cn0KCi5mYS1sYXllcnMtdGV4dCB7CiAgbGVmdDogNTAlOwogIHRvcDogNTAlOwogIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7Cn0KCi5mYS1sYXllcnMtY291bnRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmEtY291bnRlci1iYWNrZ3JvdW5kLWNvbG9yLCAjZmYyNTNhKTsKICBib3JkZXItcmFkaXVzOiB2YXIoLS1mYS1jb3VudGVyLWJvcmRlci1yYWRpdXMsIDFlbSk7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBjb2xvcjogdmFyKC0tZmEtaW52ZXJzZSwgI2ZmZik7CiAgbGluZS1oZWlnaHQ6IHZhcigtLWZhLWNvdW50ZXItbGluZS1oZWlnaHQsIDEpOwogIG1heC13aWR0aDogdmFyKC0tZmEtY291bnRlci1tYXgtd2lkdGgsIDVlbSk7CiAgbWluLXdpZHRoOiB2YXIoLS1mYS1jb3VudGVyLW1pbi13aWR0aCwgMS41ZW0pOwogIG92ZXJmbG93OiBoaWRkZW47CiAgcGFkZGluZzogdmFyKC0tZmEtY291bnRlci1wYWRkaW5nLCAwLjI1ZW0gMC41ZW0pOwogIHJpZ2h0OiB2YXIoLS1mYS1yaWdodCwgMCk7CiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgdG9wOiB2YXIoLS1mYS10b3AsIDApOwogIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtY291bnRlci1zY2FsZSwgMC4yNSkpOwogIHRyYW5zZm9ybS1vcmlnaW46IHRvcCByaWdodDsKfQoKLmZhLWxheWVycy1ib3R0b20tcmlnaHQgewogIGJvdHRvbTogdmFyKC0tZmEtYm90dG9tLCAwKTsKICByaWdodDogdmFyKC0tZmEtcmlnaHQsIDApOwogIHRvcDogYXV0bzsKICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWxheWVycy1zY2FsZSwgMC4yNSkpOwogIHRyYW5zZm9ybS1vcmlnaW46IGJvdHRvbSByaWdodDsKfQoKLmZhLWxheWVycy1ib3R0b20tbGVmdCB7CiAgYm90dG9tOiB2YXIoLS1mYS1ib3R0b20sIDApOwogIGxlZnQ6IHZhcigtLWZhLWxlZnQsIDApOwogIHJpZ2h0OiBhdXRvOwogIHRvcDogYXV0bzsKICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWxheWVycy1zY2FsZSwgMC4yNSkpOwogIHRyYW5zZm9ybS1vcmlnaW46IGJvdHRvbSBsZWZ0Owp9CgouZmEtbGF5ZXJzLXRvcC1yaWdodCB7CiAgdG9wOiB2YXIoLS1mYS10b3AsIDApOwogIHJpZ2h0OiB2YXIoLS1mYS1yaWdodCwgMCk7CiAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1sYXllcnMtc2NhbGUsIDAuMjUpKTsKICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgcmlnaHQ7Cn0KCi5mYS1sYXllcnMtdG9wLWxlZnQgewogIGxlZnQ6IHZhcigtLWZhLWxlZnQsIDApOwogIHJpZ2h0OiBhdXRvOwogIHRvcDogdmFyKC0tZmEtdG9wLCAwKTsKICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWxheWVycy1zY2FsZSwgMC4yNSkpOwogIHRyYW5zZm9ybS1vcmlnaW46IHRvcCBsZWZ0Owp9CgouZmEtMXggewogIGZvbnQtc2l6ZTogMWVtOwp9CgouZmEtMnggewogIGZvbnQtc2l6ZTogMmVtOwp9CgouZmEtM3ggewogIGZvbnQtc2l6ZTogM2VtOwp9CgouZmEtNHggewogIGZvbnQtc2l6ZTogNGVtOwp9CgouZmEtNXggewogIGZvbnQtc2l6ZTogNWVtOwp9CgouZmEtNnggewogIGZvbnQtc2l6ZTogNmVtOwp9CgouZmEtN3ggewogIGZvbnQtc2l6ZTogN2VtOwp9CgouZmEtOHggewogIGZvbnQtc2l6ZTogOGVtOwp9CgouZmEtOXggewogIGZvbnQtc2l6ZTogOWVtOwp9CgouZmEtMTB4IHsKICBmb250LXNpemU6IDEwZW07Cn0KCi5mYS0yeHMgewogIGZvbnQtc2l6ZTogY2FsYygxMCAvIDE2ICogMWVtKTsgLyogY29udmVydHMgYSAxMHB4IHNpemUgaW50byBhbiBlbS1iYXNlZCB2YWx1ZSB0aGF0J3MgcmVsYXRpdmUgdG8gdGhlIHNjYWxlJ3MgMTZweCBiYXNlICovCiAgbGluZS1oZWlnaHQ6IGNhbGMoMSAvIDEwICogMWVtKTsgLyogc2V0cyB0aGUgbGluZS1oZWlnaHQgb2YgdGhlIGljb24gYmFjayB0byB0aGF0IG9mIGl0J3MgcGFyZW50ICovCiAgdmVydGljYWwtYWxpZ246IGNhbGMoKDYgLyAxMCAtIDAuMzc1KSAqIDFlbSk7IC8qIHZlcnRpY2FsbHkgY2VudGVycyB0aGUgaWNvbiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzdXJyb3VuZGluZyB0ZXh0J3MgZGVzY2VuZGVyICovCn0KCi5mYS14cyB7CiAgZm9udC1zaXplOiBjYWxjKDEyIC8gMTYgKiAxZW0pOyAvKiBjb252ZXJ0cyBhIDEycHggc2l6ZSBpbnRvIGFuIGVtLWJhc2VkIHZhbHVlIHRoYXQncyByZWxhdGl2ZSB0byB0aGUgc2NhbGUncyAxNnB4IGJhc2UgKi8KICBsaW5lLWhlaWdodDogY2FsYygxIC8gMTIgKiAxZW0pOyAvKiBzZXRzIHRoZSBsaW5lLWhlaWdodCBvZiB0aGUgaWNvbiBiYWNrIHRvIHRoYXQgb2YgaXQncyBwYXJlbnQgKi8KICB2ZXJ0aWNhbC1hbGlnbjogY2FsYygoNiAvIDEyIC0gMC4zNzUpICogMWVtKTsgLyogdmVydGljYWxseSBjZW50ZXJzIHRoZSBpY29uIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHN1cnJvdW5kaW5nIHRleHQncyBkZXNjZW5kZXIgKi8KfQoKLmZhLXNtIHsKICBmb250LXNpemU6IGNhbGMoMTQgLyAxNiAqIDFlbSk7IC8qIGNvbnZlcnRzIGEgMTRweCBzaXplIGludG8gYW4gZW0tYmFzZWQgdmFsdWUgdGhhdCdzIHJlbGF0aXZlIHRvIHRoZSBzY2FsZSdzIDE2cHggYmFzZSAqLwogIGxpbmUtaGVpZ2h0OiBjYWxjKDEgLyAxNCAqIDFlbSk7IC8qIHNldHMgdGhlIGxpbmUtaGVpZ2h0IG9mIHRoZSBpY29uIGJhY2sgdG8gdGhhdCBvZiBpdCdzIHBhcmVudCAqLwogIHZlcnRpY2FsLWFsaWduOiBjYWxjKCg2IC8gMTQgLSAwLjM3NSkgKiAxZW0pOyAvKiB2ZXJ0aWNhbGx5IGNlbnRlcnMgdGhlIGljb24gdGFraW5nIGludG8gYWNjb3VudCB0aGUgc3Vycm91bmRpbmcgdGV4dCdzIGRlc2NlbmRlciAqLwp9CgouZmEtbGcgewogIGZvbnQtc2l6ZTogY2FsYygyMCAvIDE2ICogMWVtKTsgLyogY29udmVydHMgYSAyMHB4IHNpemUgaW50byBhbiBlbS1iYXNlZCB2YWx1ZSB0aGF0J3MgcmVsYXRpdmUgdG8gdGhlIHNjYWxlJ3MgMTZweCBiYXNlICovCiAgbGluZS1oZWlnaHQ6IGNhbGMoMSAvIDIwICogMWVtKTsgLyogc2V0cyB0aGUgbGluZS1oZWlnaHQgb2YgdGhlIGljb24gYmFjayB0byB0aGF0IG9mIGl0J3MgcGFyZW50ICovCiAgdmVydGljYWwtYWxpZ246IGNhbGMoKDYgLyAyMCAtIDAuMzc1KSAqIDFlbSk7IC8qIHZlcnRpY2FsbHkgY2VudGVycyB0aGUgaWNvbiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzdXJyb3VuZGluZyB0ZXh0J3MgZGVzY2VuZGVyICovCn0KCi5mYS14bCB7CiAgZm9udC1zaXplOiBjYWxjKDI0IC8gMTYgKiAxZW0pOyAvKiBjb252ZXJ0cyBhIDI0cHggc2l6ZSBpbnRvIGFuIGVtLWJhc2VkIHZhbHVlIHRoYXQncyByZWxhdGl2ZSB0byB0aGUgc2NhbGUncyAxNnB4IGJhc2UgKi8KICBsaW5lLWhlaWdodDogY2FsYygxIC8gMjQgKiAxZW0pOyAvKiBzZXRzIHRoZSBsaW5lLWhlaWdodCBvZiB0aGUgaWNvbiBiYWNrIHRvIHRoYXQgb2YgaXQncyBwYXJlbnQgKi8KICB2ZXJ0aWNhbC1hbGlnbjogY2FsYygoNiAvIDI0IC0gMC4zNzUpICogMWVtKTsgLyogdmVydGljYWxseSBjZW50ZXJzIHRoZSBpY29uIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHN1cnJvdW5kaW5nIHRleHQncyBkZXNjZW5kZXIgKi8KfQoKLmZhLTJ4bCB7CiAgZm9udC1zaXplOiBjYWxjKDMyIC8gMTYgKiAxZW0pOyAvKiBjb252ZXJ0cyBhIDMycHggc2l6ZSBpbnRvIGFuIGVtLWJhc2VkIHZhbHVlIHRoYXQncyByZWxhdGl2ZSB0byB0aGUgc2NhbGUncyAxNnB4IGJhc2UgKi8KICBsaW5lLWhlaWdodDogY2FsYygxIC8gMzIgKiAxZW0pOyAvKiBzZXRzIHRoZSBsaW5lLWhlaWdodCBvZiB0aGUgaWNvbiBiYWNrIHRvIHRoYXQgb2YgaXQncyBwYXJlbnQgKi8KICB2ZXJ0aWNhbC1hbGlnbjogY2FsYygoNiAvIDMyIC0gMC4zNzUpICogMWVtKTsgLyogdmVydGljYWxseSBjZW50ZXJzIHRoZSBpY29uIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHN1cnJvdW5kaW5nIHRleHQncyBkZXNjZW5kZXIgKi8KfQoKLmZhLXdpZHRoLWF1dG8gewogIC0tZmEtd2lkdGg6IGF1dG87Cn0KCi5mYS1mdywKLmZhLXdpZHRoLWZpeGVkIHsKICAtLWZhLXdpZHRoOiAxLjI1ZW07Cn0KCi5mYS11bCB7CiAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLWZhLWxpLW1hcmdpbiwgMi41ZW0pOwogIHBhZGRpbmctaW5saW5lLXN0YXJ0OiAwOwp9Ci5mYS11bCA+IGxpIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5mYS1saSB7CiAgaW5zZXQtaW5saW5lLXN0YXJ0OiBjYWxjKC0xICogdmFyKC0tZmEtbGktd2lkdGgsIDJlbSkpOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgd2lkdGg6IHZhcigtLWZhLWxpLXdpZHRoLCAyZW0pOwogIGxpbmUtaGVpZ2h0OiBpbmhlcml0Owp9CgovKiBIZWFkcyBVcDogQm9yZGVyZWQgSWNvbnMgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUhCiAgLSBUaGlzIGZlYXR1cmUgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2Ugb2YgRm9udCBBd2Vzb21lICh2OCkhCiAgLSBZb3UgbWF5IGNvbnRpbnVlIHRvIHVzZSBpdCBpbiB0aGlzIHZlcnNpb24gKnY3KSwgYnV0IGl0IHdpbGwgbm90IGJlIHN1cHBvcnRlZCBpbiBGb250IEF3ZXNvbWUgdjguCiovCi8qIE5vdGVzOgoqIC0tQHt2LiRjc3MtcHJlZml4fS1ib3JkZXItd2lkdGggPSAxLzE2IGJ5IGRlZmF1bHQgKHRvIHJlbmRlciBhcyB+MXB4IGJhc2VkIG9uIGEgMTZweCBkZWZhdWx0IGZvbnQtc2l6ZSkKKiAtLUB7di4kY3NzLXByZWZpeH0tYm9yZGVyLXBhZGRpbmcgPQogICoqIDMvMTYgZm9yIHZlcnRpY2FsIHBhZGRpbmcgKHRvIGdpdmUgfjJweCBvZiB2ZXJ0aWNhbCB3aGl0ZXNwYWNlIGFyb3VuZCBhbiBpY29uIGNvbnNpZGVyaW5nIGl0J3MgdmVydGljYWwgYWxpZ25tZW50KQogICoqIDQvMTYgZm9yIGhvcml6b250YWwgcGFkZGluZyAodG8gZ2l2ZSB+NHB4IG9mIGhvcml6b250YWwgd2hpdGVzcGFjZSBhcm91bmQgYW4gaWNvbikKKi8KLmZhLWJvcmRlciB7CiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYS1ib3JkZXItY29sb3IsICNlZWUpOwogIGJvcmRlci1yYWRpdXM6IHZhcigtLWZhLWJvcmRlci1yYWRpdXMsIDAuMWVtKTsKICBib3JkZXItc3R5bGU6IHZhcigtLWZhLWJvcmRlci1zdHlsZSwgc29saWQpOwogIGJvcmRlci13aWR0aDogdmFyKC0tZmEtYm9yZGVyLXdpZHRoLCAwLjA2MjVlbSk7CiAgYm94LXNpemluZzogdmFyKC0tZmEtYm9yZGVyLWJveC1zaXppbmcsIGNvbnRlbnQtYm94KTsKICBwYWRkaW5nOiB2YXIoLS1mYS1ib3JkZXItcGFkZGluZywgMC4xODc1ZW0gMC4yNWVtKTsKfQoKLmZhLXB1bGwtbGVmdCwKLmZhLXB1bGwtc3RhcnQgewogIGZsb2F0OiBpbmxpbmUtc3RhcnQ7CiAgbWFyZ2luLWlubGluZS1lbmQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7Cn0KCi5mYS1wdWxsLXJpZ2h0LAouZmEtcHVsbC1lbmQgewogIGZsb2F0OiBpbmxpbmUtZW5kOwogIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7Cn0KCi5mYS1iZWF0IHsKICBhbmltYXRpb24tbmFtZTogZmEtYmVhdDsKICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpOwogIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTsKICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7CiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgZWFzZS1pbi1vdXQpOwp9CgouZmEtYm91bmNlIHsKICBhbmltYXRpb24tbmFtZTogZmEtYm91bmNlOwogIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBjdWJpYy1iZXppZXIoMC4yOCwgMC44NCwgMC40MiwgMSkpOwp9CgouZmEtZmFkZSB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLWZhZGU7CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAxcyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGN1YmljLWJlemllcigwLjQsIDAsIDAuNiwgMSkpOwp9CgouZmEtYmVhdC1mYWRlIHsKICBhbmltYXRpb24tbmFtZTogZmEtYmVhdC1mYWRlOwogIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpKTsKfQoKLmZhLWZsaXAgewogIGFuaW1hdGlvbi1uYW1lOiBmYS1mbGlwOwogIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBlYXNlLWluLW91dCk7Cn0KCi5mYS1zaGFrZSB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNoYWtlOwogIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBsaW5lYXIpOwp9CgouZmEtc3BpbiB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW47CiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTsKICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAycyk7CiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpOwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGxpbmVhcik7Cn0KCi5mYS1zcGluLXJldmVyc2UgewogIC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbjogcmV2ZXJzZTsKfQoKLmZhLXB1bHNlLAouZmEtc3Bpbi1wdWxzZSB7CiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW47CiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTsKICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBzdGVwcyg4KSk7Cn0KCkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7CiAgLmZhLWJlYXQsCiAgLmZhLWJvdW5jZSwKICAuZmEtZmFkZSwKICAuZmEtYmVhdC1mYWRlLAogIC5mYS1mbGlwLAogIC5mYS1wdWxzZSwKICAuZmEtc2hha2UsCiAgLmZhLXNwaW4sCiAgLmZhLXNwaW4tcHVsc2UgewogICAgYW5pbWF0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgICB0cmFuc2l0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgfQp9CkBrZXlmcmFtZXMgZmEtYmVhdCB7CiAgMCUsIDkwJSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogIH0KICA0NSUgewogICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1mYS1iZWF0LXNjYWxlLCAxLjI1KSk7CiAgfQp9CkBrZXlmcmFtZXMgZmEtYm91bmNlIHsKICAwJSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEsIDEpIHRyYW5zbGF0ZVkoMCk7CiAgfQogIDEwJSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWJvdW5jZS1zdGFydC1zY2FsZS14LCAxLjEpLCB2YXIoLS1mYS1ib3VuY2Utc3RhcnQtc2NhbGUteSwgMC45KSkgdHJhbnNsYXRlWSgwKTsKICB9CiAgMzAlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYm91bmNlLWp1bXAtc2NhbGUteCwgMC45KSwgdmFyKC0tZmEtYm91bmNlLWp1bXAtc2NhbGUteSwgMS4xKSkgdHJhbnNsYXRlWSh2YXIoLS1mYS1ib3VuY2UtaGVpZ2h0LCAtMC41ZW0pKTsKICB9CiAgNTAlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYm91bmNlLWxhbmQtc2NhbGUteCwgMS4wNSksIHZhcigtLWZhLWJvdW5jZS1sYW5kLXNjYWxlLXksIDAuOTUpKSB0cmFuc2xhdGVZKDApOwogIH0KICA1NyUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLCAxKSB0cmFuc2xhdGVZKHZhcigtLWZhLWJvdW5jZS1yZWJvdW5kLCAtMC4xMjVlbSkpOwogIH0KICA2NCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLCAxKSB0cmFuc2xhdGVZKDApOwogIH0KICAxMDAlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgdHJhbnNsYXRlWSgwKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1mYWRlIHsKICA1MCUgewogICAgb3BhY2l0eTogdmFyKC0tZmEtZmFkZS1vcGFjaXR5LCAwLjQpOwogIH0KfQpAa2V5ZnJhbWVzIGZhLWJlYXQtZmFkZSB7CiAgMCUsIDEwMCUgewogICAgb3BhY2l0eTogdmFyKC0tZmEtYmVhdC1mYWRlLW9wYWNpdHksIDAuNCk7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogIH0KICA1MCUgewogICAgb3BhY2l0eTogMTsKICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYmVhdC1mYWRlLXNjYWxlLCAxLjEyNSkpOwogIH0KfQpAa2V5ZnJhbWVzIGZhLWZsaXAgewogIDUwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZTNkKHZhcigtLWZhLWZsaXAteCwgMCksIHZhcigtLWZhLWZsaXAteSwgMSksIHZhcigtLWZhLWZsaXAteiwgMCksIHZhcigtLWZhLWZsaXAtYW5nbGUsIC0xODBkZWcpKTsKICB9Cn0KQGtleWZyYW1lcyBmYS1zaGFrZSB7CiAgMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoLTE1ZGVnKTsKICB9CiAgNCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMTVkZWcpOwogIH0KICA4JSwgMjQlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKC0xOGRlZyk7CiAgfQogIDEyJSwgMjglIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDE4ZGVnKTsKICB9CiAgMTYlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKC0yMmRlZyk7CiAgfQogIDIwJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyMmRlZyk7CiAgfQogIDMyJSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMTJkZWcpOwogIH0KICAzNiUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMTJkZWcpOwogIH0KICA0MCUsIDEwMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgfQp9CkBrZXlmcmFtZXMgZmEtc3BpbiB7CiAgMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICB9Cn0KLmZhLXJvdGF0ZS05MCB7CiAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOwp9CgouZmEtcm90YXRlLTE4MCB7CiAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsKfQoKLmZhLXJvdGF0ZS0yNzAgewogIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7Cn0KCi5mYS1mbGlwLWhvcml6b250YWwgewogIHRyYW5zZm9ybTogc2NhbGUoLTEsIDEpOwp9CgouZmEtZmxpcC12ZXJ0aWNhbCB7CiAgdHJhbnNmb3JtOiBzY2FsZSgxLCAtMSk7Cn0KCi5mYS1mbGlwLWJvdGgsCi5mYS1mbGlwLWhvcml6b250YWwuZmEtZmxpcC12ZXJ0aWNhbCB7CiAgdHJhbnNmb3JtOiBzY2FsZSgtMSwgLTEpOwp9CgouZmEtcm90YXRlLWJ5IHsKICB0cmFuc2Zvcm06IHJvdGF0ZSh2YXIoLS1mYS1yb3RhdGUtYW5nbGUsIDApKTsKfQoKLnN2Zy1pbmxpbmUtLWZhIC5mYS1wcmltYXJ5IHsKICBmaWxsOiB2YXIoLS1mYS1wcmltYXJ5LWNvbG9yLCBjdXJyZW50Q29sb3IpOwogIG9wYWNpdHk6IHZhcigtLWZhLXByaW1hcnktb3BhY2l0eSwgMSk7Cn0KCi5zdmctaW5saW5lLS1mYSAuZmEtc2Vjb25kYXJ5IHsKICBmaWxsOiB2YXIoLS1mYS1zZWNvbmRhcnktY29sb3IsIGN1cnJlbnRDb2xvcik7CiAgb3BhY2l0eTogdmFyKC0tZmEtc2Vjb25kYXJ5LW9wYWNpdHksIDAuNCk7Cn0KCi5zdmctaW5saW5lLS1mYS5mYS1zd2FwLW9wYWNpdHkgLmZhLXByaW1hcnkgewogIG9wYWNpdHk6IHZhcigtLWZhLXNlY29uZGFyeS1vcGFjaXR5LCAwLjQpOwp9Cgouc3ZnLWlubGluZS0tZmEuZmEtc3dhcC1vcGFjaXR5IC5mYS1zZWNvbmRhcnkgewogIG9wYWNpdHk6IHZhcigtLWZhLXByaW1hcnktb3BhY2l0eSwgMSk7Cn0KCi5zdmctaW5saW5lLS1mYSBtYXNrIC5mYS1wcmltYXJ5LAouc3ZnLWlubGluZS0tZmEgbWFzayAuZmEtc2Vjb25kYXJ5IHsKICBmaWxsOiBibGFjazsKfQoKLnN2Zy1pbmxpbmUtLWZhLmZhLWludmVyc2UgewogIGZpbGw6IHZhcigtLWZhLWludmVyc2UsICNmZmYpOwp9CgouZmEtc3RhY2sgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBoZWlnaHQ6IDJlbTsKICBsaW5lLWhlaWdodDogMmVtOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiAyLjVlbTsKfQoKLmZhLWludmVyc2UgewogIGNvbG9yOiB2YXIoLS1mYS1pbnZlcnNlLCAjZmZmKTsKfQoKLnN2Zy1pbmxpbmUtLWZhLmZhLXN0YWNrLTF4IHsKICAtLWZhLXdpZHRoOiAxLjI1ZW07CiAgaGVpZ2h0OiAxZW07CiAgd2lkdGg6IHZhcigtLWZhLXdpZHRoKTsKfQouc3ZnLWlubGluZS0tZmEuZmEtc3RhY2stMnggewogIC0tZmEtd2lkdGg6IDIuNWVtOwogIGhlaWdodDogMmVtOwogIHdpZHRoOiB2YXIoLS1mYS13aWR0aCk7Cn0KCi5mYS1zdGFjay0xeCwKLmZhLXN0YWNrLTJ4IHsKICBpbnNldDogMDsKICBtYXJnaW46IGF1dG87CiAgcG9zaXRpb246IGFic29sdXRlOwogIHotaW5kZXg6IHZhcigtLWZhLXN0YWNrLXotaW5kZXgsIGF1dG8pOwp9YDsKICAgIF9jc3NJbnNlcnRlZCA9IGZhbHNlOwogICAgSW5qZWN0Q1NTID0gewogICAgICBtaXhvdXQ6IGZ1bmN0aW9uIG1peG91dCgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgZG9tOiB7CiAgICAgICAgICAgIGNzcywKICAgICAgICAgICAgaW5zZXJ0Q3NzOiBlbnN1cmVDc3MKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9LAogICAgICBob29rczogZnVuY3Rpb24gaG9va3MoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGJlZm9yZURPTUVsZW1lbnRDcmVhdGlvbjogZnVuY3Rpb24gYmVmb3JlRE9NRWxlbWVudENyZWF0aW9uKCkgewogICAgICAgICAgICBlbnN1cmVDc3MoKTsKICAgICAgICAgIH0sCiAgICAgICAgICBiZWZvcmVJMnN2ZzogZnVuY3Rpb24gYmVmb3JlSTJzdmcoKSB7CiAgICAgICAgICAgIGVuc3VyZUNzcygpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0KICAgIH07CiAgICB3JDIgPSBXSU5ET1cgfHwge307CiAgICBpZiAoIXckMltOQU1FU1BBQ0VfSURFTlRJRklFUl0pIHckMltOQU1FU1BBQ0VfSURFTlRJRklFUl0gPSB7fTsKICAgIGlmICghdyQyW05BTUVTUEFDRV9JREVOVElGSUVSXS5zdHlsZXMpIHckMltOQU1FU1BBQ0VfSURFTlRJRklFUl0uc3R5bGVzID0ge307CiAgICBpZiAoIXckMltOQU1FU1BBQ0VfSURFTlRJRklFUl0uaG9va3MpIHckMltOQU1FU1BBQ0VfSURFTlRJRklFUl0uaG9va3MgPSB7fTsKICAgIGlmICghdyQyW05BTUVTUEFDRV9JREVOVElGSUVSXS5zaGltcykgdyQyW05BTUVTUEFDRV9JREVOVElGSUVSXS5zaGltcyA9IFtdOwogICAgbmFtZXNwYWNlID0gdyQyW05BTUVTUEFDRV9JREVOVElGSUVSXTsKICAgIGZ1bmN0aW9ucyA9IFtdOwogICAgX2xpc3RlbmVyID0gZnVuY3Rpb24gbGlzdGVuZXIoKSB7CiAgICAgIERPQ1VNRU5ULnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBfbGlzdGVuZXIpOwogICAgICBsb2FkZWQgPSAxOwogICAgICBmdW5jdGlvbnMubWFwKGZ1bmN0aW9uKGZuKSB7CiAgICAgICAgcmV0dXJuIGZuKCk7CiAgICAgIH0pOwogICAgfTsKICAgIGxvYWRlZCA9IGZhbHNlOwogICAgaWYgKElTX0RPTSkgewogICAgICBsb2FkZWQgPSAoRE9DVU1FTlQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsID8gL15sb2FkZWR8XmMvIDogL15sb2FkZWR8Xml8XmMvKS50ZXN0KERPQ1VNRU5ULnJlYWR5U3RhdGUpOwogICAgICBpZiAoIWxvYWRlZCkgRE9DVU1FTlQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIF9saXN0ZW5lcik7CiAgICB9CiAgICBiaW5kSW50ZXJuYWw0ID0gZnVuY3Rpb24gYmluZEludGVybmFsNDIoZnVuYywgdGhpc0NvbnRleHQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGE1LCBiNSwgYzExLCBkNikgewogICAgICAgIHJldHVybiBmdW5jLmNhbGwodGhpc0NvbnRleHQsIGE1LCBiNSwgYzExLCBkNik7CiAgICAgIH07CiAgICB9OwogICAgcmVkdWNlMyA9IGZ1bmN0aW9uIGZhc3RSZWR1Y2VPYmplY3Qoc3ViamVjdCwgZm4sIGluaXRpYWxWYWx1ZSwgdGhpc0NvbnRleHQpIHsKICAgICAgdmFyIGtleXMyID0gT2JqZWN0LmtleXMoc3ViamVjdCksIGxlbmd0aCA9IGtleXMyLmxlbmd0aCwgaXRlcmF0b3IyID0gdGhpc0NvbnRleHQgIT09IHZvaWQgMCA/IGJpbmRJbnRlcm5hbDQoZm4sIHRoaXNDb250ZXh0KSA6IGZuLCBpMTEsIGtleTIsIHJlc3VsdDsKICAgICAgaWYgKGluaXRpYWxWYWx1ZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgaTExID0gMTsKICAgICAgICByZXN1bHQgPSBzdWJqZWN0W2tleXMyWzBdXTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpMTEgPSAwOwogICAgICAgIHJlc3VsdCA9IGluaXRpYWxWYWx1ZTsKICAgICAgfQogICAgICBmb3IgKDsgaTExIDwgbGVuZ3RoOyBpMTErKykgewogICAgICAgIGtleTIgPSBrZXlzMltpMTFdOwogICAgICAgIHJlc3VsdCA9IGl0ZXJhdG9yMihyZXN1bHQsIHN1YmplY3Rba2V5Ml0sIGtleTIsIHN1YmplY3QpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9OwogICAgTU9OTyA9IDE7CiAgICBEVU8gPSAyOwogICAgbW9kZXJuTWF0Y2hlcyA9IFtbRFVPLCAvKiBAX19QVVJFX18gKi8gX3dyYXBSZWdFeHAoL3BhdGggb3BhY2l0eT0iKFteIl0qKSIuKmQ9IihbXiJdKikiLipwYXRoLipkPSIoW14iXSopIi8sIHsKICAgICAgZDI6IDIsCiAgICAgIGQxOiAzCiAgICB9KV0sIFtEVU8sIC8qIEBfX1BVUkVfXyAqLyBfd3JhcFJlZ0V4cCgvcGF0aCBvcGFjaXR5PSIoW14iXSopIi4qZD0iKFteIl0qKSIvLCB7CiAgICAgIGQyOiAyCiAgICB9KV0sIFtNT05PLCAvKiBAX19QVVJFX18gKi8gX3dyYXBSZWdFeHAoL3BhdGggZmlsbD0iY3VycmVudENvbG9yIi4qZD0iKFteIl0rKSIvLCB7CiAgICAgIGQxOiAxCiAgICB9KV1dOwogICAgbGVnYWN5TWF0Y2hlcyA9IFtbRFVPLCAvKiBAX19QVVJFX18gKi8gX3dyYXBSZWdFeHAoL3BhdGggY2xhc3M9IihbXiJdKnNlY29uZGFyeVteIl0qKSIuKmQ9IihbXiJdKykiLipwYXRoIGNsYXNzPSIoW14iXSpwcmltYXJ5W14iXSopIi4qZD0iKFteIl0rKSIvLCB7CiAgICAgIGF0dHIyOiAxLAogICAgICBkMjogMiwKICAgICAgYXR0cjE6IDMsCiAgICAgIGQxOiA0CiAgICB9KV0sIFtEVU8sIC8qIEBfX1BVUkVfXyAqLyBfd3JhcFJlZ0V4cCgvcGF0aCBjbGFzcz0iKFteIl0qcHJpbWFyeVteIl0qKSIuKmQ9IihbXiJdKykiLipwYXRoIGNsYXNzPSIoW14iXSpzZWNvbmRhcnlbXiJdKikiLipkPSIoW14iXSspIi8sIHsKICAgICAgYXR0cjE6IDEsCiAgICAgIGQxOiAyLAogICAgICBhdHRyMjogMywKICAgICAgZDI6IDQKICAgIH0pXSwgW0RVTywgLyogQF9fUFVSRV9fICovIF93cmFwUmVnRXhwKC9wYXRoIGNsYXNzPSIoW14iXSpwcmltYXJ5W14iXSopIi4qZD0iKFteIl0rKSIvLCB7CiAgICAgIGF0dHIxOiAxLAogICAgICBkMTogMgogICAgfSldLCBbRFVPLCAvKiBAX19QVVJFX18gKi8gX3dyYXBSZWdFeHAoL3BhdGggY2xhc3M9IihbXiJdKnNlY29uZGFyeVteIl0qKSIuKmQ9IihbXiJdKykiLywgewogICAgICBhdHRyMjogMSwKICAgICAgZDI6IDIKICAgIH0pXSwgW0RVTywgLyogQF9fUFVSRV9fICovIF93cmFwUmVnRXhwKC9wYXRoIGQ9IihbXiJdKykiLipjbGFzcz0iKFteIl0qc2Vjb25kYXJ5W14iXSopIi4qcGF0aCBkPSIoW14iXSspIi4qY2xhc3M9IihbXiJdKnByaW1hcnlbXiJdKikiLywgewogICAgICBkMjogMSwKICAgICAgYXR0cjI6IDIsCiAgICAgIGQxOiAzLAogICAgICBhdHRyMTogNAogICAgfSldLCBbRFVPLCAvKiBAX19QVVJFX18gKi8gX3dyYXBSZWdFeHAoL3BhdGggZD0iKFteIl0rKSIuKmNsYXNzPSIoW14iXSpwcmltYXJ5W14iXSopIi4qcGF0aCBkPSIoW14iXSspIi4qY2xhc3M9IihbXiJdKnNlY29uZGFyeVteIl0qKSIvLCB7CiAgICAgIGQxOiAxLAogICAgICBhdHRyMTogMiwKICAgICAgZDI6IDMsCiAgICAgIGF0dHIyOiA0CiAgICB9KV0sIFtEVU8sIC8qIEBfX1BVUkVfXyAqLyBfd3JhcFJlZ0V4cCgvcGF0aCBkPSIoW14iXSspIi4qY2xhc3M9IihbXiJdKnByaW1hcnlbXiJdKikiLywgewogICAgICBkMTogMSwKICAgICAgYXR0cjE6IDIKICAgIH0pXSwgW0RVTywgLyogQF9fUFVSRV9fICovIF93cmFwUmVnRXhwKC9wYXRoIGQ9IihbXiJdKykiLipjbGFzcz0iKFteIl0qc2Vjb25kYXJ5W14iXSopIi8sIHsKICAgICAgZDI6IDEsCiAgICAgIGF0dHIyOiAyCiAgICB9KV0sIFtEVU8sIC8qIEBfX1BVUkVfXyAqLyBfd3JhcFJlZ0V4cCgvcGF0aCBkPSIoW14iXSspIi4qcGF0aCBkPSIoW14iXSspIi8sIHsKICAgICAgZDE6IDEsCiAgICAgIGQyOiAyCiAgICB9KV0sIFtNT05PLCAvKiBAX19QVVJFX18gKi8gX3dyYXBSZWdFeHAoL3BhdGggZD0iKFteIl0rKSIvLCB7CiAgICAgIGQxOiAxCiAgICB9KV0sIFtNT05PLCAvKiBAX19QVVJFX18gKi8gX3dyYXBSZWdFeHAoL3BhdGggc3R5bGU9IihbXiJdKykiLipkPSIoW14iXSspIi8sIHsKICAgICAgYXR0cjE6IDEsCiAgICAgIGQxOiAyCiAgICB9KV1dOwogICAgc3R5bGVzMiA9IG5hbWVzcGFjZS5zdHlsZXMsIHNoaW1zID0gbmFtZXNwYWNlLnNoaW1zOwogICAgRkFNSUxZX05BTUVTID0gT2JqZWN0LmtleXMoUFJFRklYX1RPX0xPTkdfU1RZTEUpOwogICAgUFJFRklYRVNfRk9SX0ZBTUlMWSA9IEZBTUlMWV9OQU1FUy5yZWR1Y2UoZnVuY3Rpb24oYWNjLCBmYW1pbHlJZCkgewogICAgICBhY2NbZmFtaWx5SWRdID0gT2JqZWN0LmtleXMoUFJFRklYX1RPX0xPTkdfU1RZTEVbZmFtaWx5SWRdKTsKICAgICAgcmV0dXJuIGFjYzsKICAgIH0sIHt9KTsKICAgIF9kZWZhdWx0VXNhYmxlUHJlZml4ID0gbnVsbDsKICAgIF9ieVVuaWNvZGUgPSB7fTsKICAgIF9ieUxpZ2F0dXJlID0ge307CiAgICBfYnlPbGROYW1lID0ge307CiAgICBfYnlPbGRVbmljb2RlID0ge307CiAgICBfYnlBbGlhcyA9IHt9OwogICAgYnVpbGQgPSBmdW5jdGlvbiBidWlsZDIoKSB7CiAgICAgIHZhciBsb29rdXAgPSBmdW5jdGlvbiBsb29rdXAyKHJlZHVjZXIpIHsKICAgICAgICByZXR1cm4gcmVkdWNlMyhzdHlsZXMyLCBmdW5jdGlvbihvJCQxLCBzdHlsZSwgcHJlZml4NCkgewogICAgICAgICAgbyQkMVtwcmVmaXg0XSA9IHJlZHVjZTMoc3R5bGUsIHJlZHVjZXIsIHt9KTsKICAgICAgICAgIHJldHVybiBvJCQxOwogICAgICAgIH0sIHt9KTsKICAgICAgfTsKICAgICAgX2J5VW5pY29kZSA9IGxvb2t1cChmdW5jdGlvbihhY2MsIGljb24zLCBpY29uTmFtZSkgewogICAgICAgIGlmIChpY29uM1szXSkgewogICAgICAgICAgYWNjW2ljb24zWzNdXSA9IGljb25OYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoaWNvbjNbMl0pIHsKICAgICAgICAgIHZhciBhbGlhc2VzID0gaWNvbjNbMl0uZmlsdGVyKGZ1bmN0aW9uKGEkJDEpIHsKICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhJCQxID09PSAibnVtYmVyIjsKICAgICAgICAgIH0pOwogICAgICAgICAgYWxpYXNlcy5mb3JFYWNoKGZ1bmN0aW9uKGFsaWFzKSB7CiAgICAgICAgICAgIGFjY1thbGlhcy50b1N0cmluZygxNildID0gaWNvbk5hbWU7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFjYzsKICAgICAgfSk7CiAgICAgIF9ieUxpZ2F0dXJlID0gbG9va3VwKGZ1bmN0aW9uKGFjYywgaWNvbjMsIGljb25OYW1lKSB7CiAgICAgICAgYWNjW2ljb25OYW1lXSA9IGljb25OYW1lOwogICAgICAgIGlmIChpY29uM1syXSkgewogICAgICAgICAgdmFyIGFsaWFzZXMgPSBpY29uM1syXS5maWx0ZXIoZnVuY3Rpb24oYSQkMSkgewogICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEkJDEgPT09ICJzdHJpbmciOwogICAgICAgICAgfSk7CiAgICAgICAgICBhbGlhc2VzLmZvckVhY2goZnVuY3Rpb24oYWxpYXMpIHsKICAgICAgICAgICAgYWNjW2FsaWFzXSA9IGljb25OYW1lOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhY2M7CiAgICAgIH0pOwogICAgICBfYnlBbGlhcyA9IGxvb2t1cChmdW5jdGlvbihhY2MsIGljb24zLCBpY29uTmFtZSkgewogICAgICAgIHZhciBhbGlhc2VzID0gaWNvbjNbMl07CiAgICAgICAgYWNjW2ljb25OYW1lXSA9IGljb25OYW1lOwogICAgICAgIGFsaWFzZXMuZm9yRWFjaChmdW5jdGlvbihhbGlhcykgewogICAgICAgICAgYWNjW2FsaWFzXSA9IGljb25OYW1lOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBhY2M7CiAgICAgIH0pOwogICAgICB2YXIgaGFzUmVndWxhciA9ICJmYXIiIGluIHN0eWxlczIgfHwgY29uZmlnMi5hdXRvRmV0Y2hTdmc7CiAgICAgIHZhciBzaGltTG9va3VwcyA9IHJlZHVjZTMoc2hpbXMsIGZ1bmN0aW9uKGFjYywgc2hpbSkgewogICAgICAgIHZhciBtYXliZU5hbWVNYXliZVVuaWNvZGUgPSBzaGltWzBdOwogICAgICAgIHZhciBwcmVmaXg0ID0gc2hpbVsxXTsKICAgICAgICB2YXIgaWNvbk5hbWUgPSBzaGltWzJdOwogICAgICAgIGlmIChwcmVmaXg0ID09PSAiZmFyIiAmJiAhaGFzUmVndWxhcikgewogICAgICAgICAgcHJlZml4NCA9ICJmYXMiOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIG1heWJlTmFtZU1heWJlVW5pY29kZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIGFjYy5uYW1lc1ttYXliZU5hbWVNYXliZVVuaWNvZGVdID0gewogICAgICAgICAgICBwcmVmaXg6IHByZWZpeDQsCiAgICAgICAgICAgIGljb25OYW1lCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIG1heWJlTmFtZU1heWJlVW5pY29kZSA9PT0gIm51bWJlciIpIHsKICAgICAgICAgIGFjYy51bmljb2Rlc1ttYXliZU5hbWVNYXliZVVuaWNvZGUudG9TdHJpbmcoMTYpXSA9IHsKICAgICAgICAgICAgcHJlZml4OiBwcmVmaXg0LAogICAgICAgICAgICBpY29uTmFtZQogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFjYzsKICAgICAgfSwgewogICAgICAgIG5hbWVzOiB7fSwKICAgICAgICB1bmljb2Rlczoge30KICAgICAgfSk7CiAgICAgIF9ieU9sZE5hbWUgPSBzaGltTG9va3Vwcy5uYW1lczsKICAgICAgX2J5T2xkVW5pY29kZSA9IHNoaW1Mb29rdXBzLnVuaWNvZGVzOwogICAgICBfZGVmYXVsdFVzYWJsZVByZWZpeCA9IGdldENhbm9uaWNhbFByZWZpeChjb25maWcyLnN0eWxlRGVmYXVsdCwgewogICAgICAgIGZhbWlseTogY29uZmlnMi5mYW1pbHlEZWZhdWx0CiAgICAgIH0pOwogICAgfTsKICAgIG9uQ2hhbmdlKGZ1bmN0aW9uKGMkJDEpIHsKICAgICAgX2RlZmF1bHRVc2FibGVQcmVmaXggPSBnZXRDYW5vbmljYWxQcmVmaXgoYyQkMS5zdHlsZURlZmF1bHQsIHsKICAgICAgICBmYW1pbHk6IGNvbmZpZzIuZmFtaWx5RGVmYXVsdAogICAgICB9KTsKICAgIH0pOwogICAgYnVpbGQoKTsKICAgIGVtcHR5Q2Fub25pY2FsSWNvbiA9IGZ1bmN0aW9uIGVtcHR5Q2Fub25pY2FsSWNvbjIoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgcHJlZml4OiBudWxsLAogICAgICAgIGljb25OYW1lOiBudWxsLAogICAgICAgIHJlc3Q6IFtdCiAgICAgIH07CiAgICB9OwogICAgX2ZhQ29tYmluZWRDbGFzc2VzID0gWnQkMS5jb25jYXQoWXQpOwogICAgbmV3Q2Fub25pY2FsRmFtaWxpZXMgPSBydC5maWx0ZXIoZnVuY3Rpb24oZmFtaWx5SWQpIHsKICAgICAgcmV0dXJuIGZhbWlseUlkICE9PSBpMTAgfHwgZmFtaWx5SWQgIT09IHQ4OwogICAgfSk7CiAgICBuZXdDYW5vbmljYWxTdHlsZXMgPSBPYmplY3Qua2V5cyhIdCQxKS5maWx0ZXIoZnVuY3Rpb24oa2V5MikgewogICAgICByZXR1cm4ga2V5MiAhPT0gaTEwOwogICAgfSkubWFwKGZ1bmN0aW9uKGtleTIpIHsKICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKEh0JDFba2V5Ml0pOwogICAgfSkuZmxhdCgpOwogICAgTGlicmFyeSA9IC8qIEBfX1BVUkVfXyAqLyAoZnVuY3Rpb24oKSB7CiAgICAgIGZ1bmN0aW9uIExpYnJhcnkyKCkgewogICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMaWJyYXJ5Mik7CiAgICAgICAgdGhpcy5kZWZpbml0aW9ucyA9IHt9OwogICAgICB9CiAgICAgIHJldHVybiBfY3JlYXRlQ2xhc3MoTGlicmFyeTIsIFt7CiAgICAgICAga2V5OiAiYWRkIiwKICAgICAgICB2YWx1ZTogZnVuY3Rpb24gYWRkMygpIHsKICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgZGVmaW5pdGlvbnMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CiAgICAgICAgICAgIGRlZmluaXRpb25zW19rZXldID0gYXJndW1lbnRzW19rZXldOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGFkZGl0aW9ucyA9IGRlZmluaXRpb25zLnJlZHVjZSh0aGlzLl9wdWxsRGVmaW5pdGlvbnMsIHt9KTsKICAgICAgICAgIE9iamVjdC5rZXlzKGFkZGl0aW9ucykuZm9yRWFjaChmdW5jdGlvbihrZXkyKSB7CiAgICAgICAgICAgIF90aGlzLmRlZmluaXRpb25zW2tleTJdID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIF90aGlzLmRlZmluaXRpb25zW2tleTJdIHx8IHt9KSwgYWRkaXRpb25zW2tleTJdKTsKICAgICAgICAgICAgZGVmaW5lSWNvbnMoa2V5MiwgYWRkaXRpb25zW2tleTJdKTsKICAgICAgICAgICAgdmFyIGxvbmdQcmVmaXggPSBQUkVGSVhfVE9fTE9OR19TVFlMRVtpMTBdW2tleTJdOwogICAgICAgICAgICBpZiAobG9uZ1ByZWZpeCkgZGVmaW5lSWNvbnMobG9uZ1ByZWZpeCwgYWRkaXRpb25zW2tleTJdKTsKICAgICAgICAgICAgYnVpbGQoKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwgewogICAgICAgIGtleTogInJlc2V0IiwKICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7CiAgICAgICAgICB0aGlzLmRlZmluaXRpb25zID0ge307CiAgICAgICAgfQogICAgICB9LCB7CiAgICAgICAga2V5OiAiX3B1bGxEZWZpbml0aW9ucyIsCiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9wdWxsRGVmaW5pdGlvbnMoYWRkaXRpb25zLCBkZWZpbml0aW9uMykgewogICAgICAgICAgdmFyIG5vcm1hbGl6ZWQgPSBkZWZpbml0aW9uMy5wcmVmaXggJiYgZGVmaW5pdGlvbjMuaWNvbk5hbWUgJiYgZGVmaW5pdGlvbjMuaWNvbiA/IHsKICAgICAgICAgICAgMDogZGVmaW5pdGlvbjMKICAgICAgICAgIH0gOiBkZWZpbml0aW9uMzsKICAgICAgICAgIE9iamVjdC5rZXlzKG5vcm1hbGl6ZWQpLm1hcChmdW5jdGlvbihrZXkyKSB7CiAgICAgICAgICAgIHZhciBfbm9ybWFsaXplZCRrZXkgPSBub3JtYWxpemVkW2tleTJdLCBwcmVmaXg0ID0gX25vcm1hbGl6ZWQka2V5LnByZWZpeCwgaWNvbk5hbWUgPSBfbm9ybWFsaXplZCRrZXkuaWNvbk5hbWUsIGljb24zID0gX25vcm1hbGl6ZWQka2V5Lmljb247CiAgICAgICAgICAgIHZhciBhbGlhc2VzID0gaWNvbjNbMl07CiAgICAgICAgICAgIGlmICghYWRkaXRpb25zW3ByZWZpeDRdKSBhZGRpdGlvbnNbcHJlZml4NF0gPSB7fTsKICAgICAgICAgICAgaWYgKGFsaWFzZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIGFsaWFzZXMuZm9yRWFjaChmdW5jdGlvbihhbGlhcykgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhbGlhcyA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgYWRkaXRpb25zW3ByZWZpeDRdW2FsaWFzXSA9IGljb24zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFkZGl0aW9uc1twcmVmaXg0XVtpY29uTmFtZV0gPSBpY29uMzsKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIGFkZGl0aW9uczsKICAgICAgICB9CiAgICAgIH1dKTsKICAgIH0pKCk7CiAgICBfcGx1Z2lucyA9IFtdOwogICAgX2hvb2tzID0ge307CiAgICBwcm92aWRlcnMgPSB7fTsKICAgIGRlZmF1bHRQcm92aWRlcktleXMgPSBPYmplY3Qua2V5cyhwcm92aWRlcnMpOwogICAgbGlicmFyeSA9IG5ldyBMaWJyYXJ5KCk7CiAgICBub0F1dG8gPSBmdW5jdGlvbiBub0F1dG8yKCkgewogICAgICBjb25maWcyLmF1dG9SZXBsYWNlU3ZnID0gZmFsc2U7CiAgICAgIGNvbmZpZzIub2JzZXJ2ZU11dGF0aW9ucyA9IGZhbHNlOwogICAgICBjYWxsSG9va3MoIm5vQXV0byIpOwogICAgfTsKICAgIGRvbSA9IHsKICAgICAgaTJzdmc6IGZ1bmN0aW9uIGkyc3ZnKCkgewogICAgICAgIHZhciBwYXJhbXMyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB2b2lkIDAgPyBhcmd1bWVudHNbMF0gOiB7fTsKICAgICAgICBpZiAoSVNfRE9NKSB7CiAgICAgICAgICBjYWxsSG9va3MoImJlZm9yZUkyc3ZnIiwgcGFyYW1zMik7CiAgICAgICAgICBjYWxsUHJvdmlkZWQoInBzZXVkb0VsZW1lbnRzMnN2ZyIsIHBhcmFtczIpOwogICAgICAgICAgcmV0dXJuIGNhbGxQcm92aWRlZCgiaTJzdmciLCBwYXJhbXMyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigiT3BlcmF0aW9uIHJlcXVpcmVzIGEgRE9NIG9mIHNvbWUga2luZC4iKSk7CiAgICAgICAgfQogICAgICB9LAogICAgICB3YXRjaDogZnVuY3Rpb24gd2F0Y2goKSB7CiAgICAgICAgdmFyIHBhcmFtczIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1swXSA6IHt9OwogICAgICAgIHZhciBhdXRvUmVwbGFjZVN2Z1Jvb3QgPSBwYXJhbXMyLmF1dG9SZXBsYWNlU3ZnUm9vdDsKICAgICAgICBpZiAoY29uZmlnMi5hdXRvUmVwbGFjZVN2ZyA9PT0gZmFsc2UpIHsKICAgICAgICAgIGNvbmZpZzIuYXV0b1JlcGxhY2VTdmcgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBjb25maWcyLm9ic2VydmVNdXRhdGlvbnMgPSB0cnVlOwogICAgICAgIGRvbXJlYWR5KGZ1bmN0aW9uKCkgewogICAgICAgICAgYXV0b1JlcGxhY2UoewogICAgICAgICAgICBhdXRvUmVwbGFjZVN2Z1Jvb3QKICAgICAgICAgIH0pOwogICAgICAgICAgY2FsbEhvb2tzKCJ3YXRjaCIsIHBhcmFtczIpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgcGFyc2U3ID0gewogICAgICBpY29uOiBmdW5jdGlvbiBpY29uKF9pY29uKSB7CiAgICAgICAgaWYgKF9pY29uID09PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKF90eXBlb2YoX2ljb24pID09PSAib2JqZWN0IiAmJiBfaWNvbi5wcmVmaXggJiYgX2ljb24uaWNvbk5hbWUpIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHByZWZpeDogX2ljb24ucHJlZml4LAogICAgICAgICAgICBpY29uTmFtZTogYnlBbGlhcyhfaWNvbi5wcmVmaXgsIF9pY29uLmljb25OYW1lKSB8fCBfaWNvbi5pY29uTmFtZQogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoX2ljb24pICYmIF9pY29uLmxlbmd0aCA9PT0gMikgewogICAgICAgICAgdmFyIGljb25OYW1lID0gX2ljb25bMV0uaW5kZXhPZigiZmEtIikgPT09IDAgPyBfaWNvblsxXS5zbGljZSgzKSA6IF9pY29uWzFdOwogICAgICAgICAgdmFyIHByZWZpeDQgPSBnZXRDYW5vbmljYWxQcmVmaXgoX2ljb25bMF0pOwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJlZml4OiBwcmVmaXg0LAogICAgICAgICAgICBpY29uTmFtZTogYnlBbGlhcyhwcmVmaXg0LCBpY29uTmFtZSkgfHwgaWNvbk5hbWUKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgX2ljb24gPT09ICJzdHJpbmciICYmIChfaWNvbi5pbmRleE9mKCIiLmNvbmNhdChjb25maWcyLmNzc1ByZWZpeCwgIi0iKSkgPiAtMSB8fCBfaWNvbi5tYXRjaChJQ09OX1NFTEVDVElPTl9TWU5UQVhfUEFUVEVSTikpKSB7CiAgICAgICAgICB2YXIgY2Fub25pY2FsSWNvbiA9IGdldENhbm9uaWNhbEljb24oX2ljb24uc3BsaXQoIiAiKSwgewogICAgICAgICAgICBza2lwTG9va3VwczogdHJ1ZQogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcmVmaXg6IGNhbm9uaWNhbEljb24ucHJlZml4IHx8IGdldERlZmF1bHRVc2FibGVQcmVmaXgoKSwKICAgICAgICAgICAgaWNvbk5hbWU6IGJ5QWxpYXMoY2Fub25pY2FsSWNvbi5wcmVmaXgsIGNhbm9uaWNhbEljb24uaWNvbk5hbWUpIHx8IGNhbm9uaWNhbEljb24uaWNvbk5hbWUKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgX2ljb24gPT09ICJzdHJpbmciKSB7CiAgICAgICAgICB2YXIgX3ByZWZpeCA9IGdldERlZmF1bHRVc2FibGVQcmVmaXgoKTsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHByZWZpeDogX3ByZWZpeCwKICAgICAgICAgICAgaWNvbk5hbWU6IGJ5QWxpYXMoX3ByZWZpeCwgX2ljb24pIHx8IF9pY29uCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGFwaSA9IHsKICAgICAgbm9BdXRvLAogICAgICBjb25maWc6IGNvbmZpZzIsCiAgICAgIGRvbSwKICAgICAgcGFyc2U6IHBhcnNlNywKICAgICAgbGlicmFyeSwKICAgICAgZmluZEljb25EZWZpbml0aW9uLAogICAgICB0b0h0bWw6IHRvSHRtbDIKICAgIH07CiAgICBhdXRvUmVwbGFjZSA9IGZ1bmN0aW9uIGF1dG9SZXBsYWNlMigpIHsKICAgICAgdmFyIHBhcmFtczIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1swXSA6IHt9OwogICAgICB2YXIgX3BhcmFtcyRhdXRvUmVwbGFjZVN2ID0gcGFyYW1zMi5hdXRvUmVwbGFjZVN2Z1Jvb3QsIGF1dG9SZXBsYWNlU3ZnUm9vdCA9IF9wYXJhbXMkYXV0b1JlcGxhY2VTdiA9PT0gdm9pZCAwID8gRE9DVU1FTlQgOiBfcGFyYW1zJGF1dG9SZXBsYWNlU3Y7CiAgICAgIGlmICgoT2JqZWN0LmtleXMobmFtZXNwYWNlLnN0eWxlcykubGVuZ3RoID4gMCB8fCBjb25maWcyLmF1dG9GZXRjaFN2ZykgJiYgSVNfRE9NICYmIGNvbmZpZzIuYXV0b1JlcGxhY2VTdmcpIGFwaS5kb20uaTJzdmcoewogICAgICAgIG5vZGU6IGF1dG9SZXBsYWNlU3ZnUm9vdAogICAgICB9KTsKICAgIH07CiAgICBzdHlsZXMkMSA9IG5hbWVzcGFjZS5zdHlsZXM7CiAgICBtaXNzaW5nSWNvblJlc29sdXRpb25NaXhpbiA9IHsKICAgICAgZm91bmQ6IGZhbHNlLAogICAgICB3aWR0aDogNTEyLAogICAgICBoZWlnaHQ6IDUxMgogICAgfTsKICAgIG5vb3AkMSA9IGZ1bmN0aW9uIG5vb3A0KCkgewogICAgfTsKICAgIHAkMiA9IGNvbmZpZzIubWVhc3VyZVBlcmZvcm1hbmNlICYmIFBFUkZPUk1BTkNFICYmIFBFUkZPUk1BTkNFLm1hcmsgJiYgUEVSRk9STUFOQ0UubWVhc3VyZSA/IFBFUkZPUk1BTkNFIDogewogICAgICBtYXJrOiBub29wJDEsCiAgICAgIG1lYXN1cmU6IG5vb3AkMQogICAgfTsKICAgIHByZWFtYmxlID0gJ0ZBICI3LjEuMCInOwogICAgYmVnaW4gPSBmdW5jdGlvbiBiZWdpbjIobmFtZSkgewogICAgICBwJDIubWFyaygiIi5jb25jYXQocHJlYW1ibGUsICIgIikuY29uY2F0KG5hbWUsICIgYmVnaW5zIikpOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGVuZChuYW1lKTsKICAgICAgfTsKICAgIH07CiAgICBlbmQgPSBmdW5jdGlvbiBlbmQyKG5hbWUpIHsKICAgICAgcCQyLm1hcmsoIiIuY29uY2F0KHByZWFtYmxlLCAiICIpLmNvbmNhdChuYW1lLCAiIGVuZHMiKSk7CiAgICAgIHAkMi5tZWFzdXJlKCIiLmNvbmNhdChwcmVhbWJsZSwgIiAiKS5jb25jYXQobmFtZSksICIiLmNvbmNhdChwcmVhbWJsZSwgIiAiKS5jb25jYXQobmFtZSwgIiBiZWdpbnMiKSwgIiIuY29uY2F0KHByZWFtYmxlLCAiICIpLmNvbmNhdChuYW1lLCAiIGVuZHMiKSk7CiAgICB9OwogICAgcGVyZiA9IHsKICAgICAgYmVnaW4sCiAgICAgIGVuZAogICAgfTsKICAgIG5vb3AkMiA9IGZ1bmN0aW9uIG5vb3A1KCkgewogICAgfTsKICAgIG11dGF0b3JzID0gewogICAgICByZXBsYWNlOiBmdW5jdGlvbiByZXBsYWNlMyhtdXRhdGlvbikgewogICAgICAgIHZhciBub2RlMiA9IG11dGF0aW9uWzBdOwogICAgICAgIGlmIChub2RlMi5wYXJlbnROb2RlKSB7CiAgICAgICAgICBtdXRhdGlvblsxXS5mb3JFYWNoKGZ1bmN0aW9uKGFic3RyYWN0KSB7CiAgICAgICAgICAgIG5vZGUyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNvbnZlcnRTVkcoYWJzdHJhY3QpLCBub2RlMik7CiAgICAgICAgICB9KTsKICAgICAgICAgIGlmIChub2RlMi5nZXRBdHRyaWJ1dGUoREFUQV9GQV9JMlNWRykgPT09IG51bGwgJiYgY29uZmlnMi5rZWVwT3JpZ2luYWxTb3VyY2UpIHsKICAgICAgICAgICAgdmFyIGNvbW1lbnQzID0gRE9DVU1FTlQuY3JlYXRlQ29tbWVudChub2RlQXNDb21tZW50KG5vZGUyKSk7CiAgICAgICAgICAgIG5vZGUyLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGNvbW1lbnQzLCBub2RlMik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBub2RlMi5yZW1vdmUoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIG5lc3Q6IGZ1bmN0aW9uIG5lc3QobXV0YXRpb24pIHsKICAgICAgICB2YXIgbm9kZTIgPSBtdXRhdGlvblswXTsKICAgICAgICB2YXIgYWJzdHJhY3QgPSBtdXRhdGlvblsxXTsKICAgICAgICBpZiAofmNsYXNzQXJyYXkobm9kZTIpLmluZGV4T2YoY29uZmlnMi5yZXBsYWNlbWVudENsYXNzKSkgewogICAgICAgICAgcmV0dXJuIG11dGF0b3JzLnJlcGxhY2UobXV0YXRpb24pOwogICAgICAgIH0KICAgICAgICB2YXIgZm9yU3ZnID0gbmV3IFJlZ0V4cCgiIi5jb25jYXQoY29uZmlnMi5jc3NQcmVmaXgsICItLioiKSk7CiAgICAgICAgZGVsZXRlIGFic3RyYWN0WzBdLmF0dHJpYnV0ZXMuaWQ7CiAgICAgICAgaWYgKGFic3RyYWN0WzBdLmF0dHJpYnV0ZXMuY2xhc3MpIHsKICAgICAgICAgIHZhciBzcGxpdENsYXNzZXMgPSBhYnN0cmFjdFswXS5hdHRyaWJ1dGVzLmNsYXNzLnNwbGl0KCIgIikucmVkdWNlKGZ1bmN0aW9uKGFjYywgY2xzKSB7CiAgICAgICAgICAgIGlmIChjbHMgPT09IGNvbmZpZzIucmVwbGFjZW1lbnRDbGFzcyB8fCBjbHMubWF0Y2goZm9yU3ZnKSkgewogICAgICAgICAgICAgIGFjYy50b1N2Zy5wdXNoKGNscyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgYWNjLnRvTm9kZS5wdXNoKGNscyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGFjYzsKICAgICAgICAgIH0sIHsKICAgICAgICAgICAgdG9Ob2RlOiBbXSwKICAgICAgICAgICAgdG9Tdmc6IFtdCiAgICAgICAgICB9KTsKICAgICAgICAgIGFic3RyYWN0WzBdLmF0dHJpYnV0ZXMuY2xhc3MgPSBzcGxpdENsYXNzZXMudG9Tdmcuam9pbigiICIpOwogICAgICAgICAgaWYgKHNwbGl0Q2xhc3Nlcy50b05vZGUubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIG5vZGUyLnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5vZGUyLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCBzcGxpdENsYXNzZXMudG9Ob2RlLmpvaW4oIiAiKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBuZXdJbm5lckhUTUwgPSBhYnN0cmFjdC5tYXAoZnVuY3Rpb24oYTUpIHsKICAgICAgICAgIHJldHVybiB0b0h0bWwyKGE1KTsKICAgICAgICB9KS5qb2luKCJcbiIpOwogICAgICAgIG5vZGUyLnNldEF0dHJpYnV0ZShEQVRBX0ZBX0kyU1ZHLCAiIik7CiAgICAgICAgbm9kZTIuaW5uZXJIVE1MID0gbmV3SW5uZXJIVE1MOwogICAgICB9CiAgICB9OwogICAgZGlzYWJsZWQgPSBmYWxzZTsKICAgIG1vID0gbnVsbDsKICAgIHN0eWxlcyQyID0gbmFtZXNwYWNlLnN0eWxlczsKICAgIHJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcjIoaWNvbkRlZmluaXRpb24pIHsKICAgICAgdmFyIHBhcmFtczIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1sxXSA6IHt9OwogICAgICB2YXIgX3BhcmFtcyR0cmFuc2Zvcm0gPSBwYXJhbXMyLnRyYW5zZm9ybSwgdHJhbnNmb3JtMiA9IF9wYXJhbXMkdHJhbnNmb3JtID09PSB2b2lkIDAgPyBtZWFuaW5nbGVzc1RyYW5zZm9ybSA6IF9wYXJhbXMkdHJhbnNmb3JtLCBfcGFyYW1zJHN5bWJvbCA9IHBhcmFtczIuc3ltYm9sLCBzeW1ib2wgPSBfcGFyYW1zJHN5bWJvbCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcGFyYW1zJHN5bWJvbCwgX3BhcmFtcyRtYXNrID0gcGFyYW1zMi5tYXNrLCBtYXNrID0gX3BhcmFtcyRtYXNrID09PSB2b2lkIDAgPyBudWxsIDogX3BhcmFtcyRtYXNrLCBfcGFyYW1zJG1hc2tJZCA9IHBhcmFtczIubWFza0lkLCBtYXNrSWQgPSBfcGFyYW1zJG1hc2tJZCA9PT0gdm9pZCAwID8gbnVsbCA6IF9wYXJhbXMkbWFza0lkLCBfcGFyYW1zJGNsYXNzZXMgPSBwYXJhbXMyLmNsYXNzZXMsIGNsYXNzZXMgPSBfcGFyYW1zJGNsYXNzZXMgPT09IHZvaWQgMCA/IFtdIDogX3BhcmFtcyRjbGFzc2VzLCBfcGFyYW1zJGF0dHJpYnV0ZXMgPSBwYXJhbXMyLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMgPSBfcGFyYW1zJGF0dHJpYnV0ZXMgPT09IHZvaWQgMCA/IHt9IDogX3BhcmFtcyRhdHRyaWJ1dGVzLCBfcGFyYW1zJHN0eWxlcyA9IHBhcmFtczIuc3R5bGVzLCBzdHlsZXMzID0gX3BhcmFtcyRzdHlsZXMgPT09IHZvaWQgMCA/IHt9IDogX3BhcmFtcyRzdHlsZXM7CiAgICAgIGlmICghaWNvbkRlZmluaXRpb24pIHJldHVybjsKICAgICAgdmFyIHByZWZpeDQgPSBpY29uRGVmaW5pdGlvbi5wcmVmaXgsIGljb25OYW1lID0gaWNvbkRlZmluaXRpb24uaWNvbk5hbWUsIGljb24zID0gaWNvbkRlZmluaXRpb24uaWNvbjsKICAgICAgcmV0dXJuIGRvbVZhcmlhbnRzKF9vYmplY3RTcHJlYWQyKHsKICAgICAgICB0eXBlOiAiaWNvbiIKICAgICAgfSwgaWNvbkRlZmluaXRpb24pLCBmdW5jdGlvbigpIHsKICAgICAgICBjYWxsSG9va3MoImJlZm9yZURPTUVsZW1lbnRDcmVhdGlvbiIsIHsKICAgICAgICAgIGljb25EZWZpbml0aW9uLAogICAgICAgICAgcGFyYW1zOiBwYXJhbXMyCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIG1ha2VJbmxpbmVTdmdBYnN0cmFjdCh7CiAgICAgICAgICBpY29uczogewogICAgICAgICAgICBtYWluOiBhc0ZvdW5kSWNvbihpY29uMyksCiAgICAgICAgICAgIG1hc2s6IG1hc2sgPyBhc0ZvdW5kSWNvbihtYXNrLmljb24pIDogewogICAgICAgICAgICAgIGZvdW5kOiBmYWxzZSwKICAgICAgICAgICAgICB3aWR0aDogbnVsbCwKICAgICAgICAgICAgICBoZWlnaHQ6IG51bGwsCiAgICAgICAgICAgICAgaWNvbjoge30KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIHByZWZpeDogcHJlZml4NCwKICAgICAgICAgIGljb25OYW1lLAogICAgICAgICAgdHJhbnNmb3JtOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgbWVhbmluZ2xlc3NUcmFuc2Zvcm0pLCB0cmFuc2Zvcm0yKSwKICAgICAgICAgIHN5bWJvbCwKICAgICAgICAgIG1hc2tJZCwKICAgICAgICAgIGV4dHJhOiB7CiAgICAgICAgICAgIGF0dHJpYnV0ZXMsCiAgICAgICAgICAgIHN0eWxlczogc3R5bGVzMywKICAgICAgICAgICAgY2xhc3NlcwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9KTsKICAgIH07CiAgICBSZXBsYWNlRWxlbWVudHMgPSB7CiAgICAgIG1peG91dDogZnVuY3Rpb24gbWl4b3V0MigpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgaWNvbjogcmVzb2x2ZUljb25zKHJlbmRlcikKICAgICAgICB9OwogICAgICB9LAogICAgICBob29rczogZnVuY3Rpb24gaG9va3MyKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBtdXRhdGlvbk9ic2VydmVyQ2FsbGJhY2tzOiBmdW5jdGlvbiBtdXRhdGlvbk9ic2VydmVyQ2FsbGJhY2tzKGFjY3VtdWxhdG9yKSB7CiAgICAgICAgICAgIGFjY3VtdWxhdG9yLnRyZWVDYWxsYmFjayA9IG9uVHJlZTsKICAgICAgICAgICAgYWNjdW11bGF0b3Iubm9kZUNhbGxiYWNrID0gb25Ob2RlOwogICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfSwKICAgICAgcHJvdmlkZXM6IGZ1bmN0aW9uIHByb3ZpZGVzKHByb3ZpZGVycyQkMSkgewogICAgICAgIHByb3ZpZGVycyQkMS5pMnN2ZyA9IGZ1bmN0aW9uKHBhcmFtczIpIHsKICAgICAgICAgIHZhciBfcGFyYW1zJG5vZGUgPSBwYXJhbXMyLm5vZGUsIG5vZGUyID0gX3BhcmFtcyRub2RlID09PSB2b2lkIDAgPyBET0NVTUVOVCA6IF9wYXJhbXMkbm9kZSwgX3BhcmFtcyRjYWxsYmFjayA9IHBhcmFtczIuY2FsbGJhY2ssIGNhbGxiYWNrID0gX3BhcmFtcyRjYWxsYmFjayA9PT0gdm9pZCAwID8gZnVuY3Rpb24oKSB7CiAgICAgICAgICB9IDogX3BhcmFtcyRjYWxsYmFjazsKICAgICAgICAgIHJldHVybiBvblRyZWUobm9kZTIsIGNhbGxiYWNrKTsKICAgICAgICB9OwogICAgICAgIHByb3ZpZGVycyQkMS5nZW5lcmF0ZVN2Z1JlcGxhY2VtZW50TXV0YXRpb24gPSBmdW5jdGlvbihub2RlMiwgbm9kZU1ldGEpIHsKICAgICAgICAgIHZhciBpY29uTmFtZSA9IG5vZGVNZXRhLmljb25OYW1lLCBwcmVmaXg0ID0gbm9kZU1ldGEucHJlZml4LCB0cmFuc2Zvcm0yID0gbm9kZU1ldGEudHJhbnNmb3JtLCBzeW1ib2wgPSBub2RlTWV0YS5zeW1ib2wsIG1hc2sgPSBub2RlTWV0YS5tYXNrLCBtYXNrSWQgPSBub2RlTWV0YS5tYXNrSWQsIGV4dHJhID0gbm9kZU1ldGEuZXh0cmE7CiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZTIsIHJlamVjdCkgewogICAgICAgICAgICBQcm9taXNlLmFsbChbZmluZEljb24oaWNvbk5hbWUsIHByZWZpeDQpLCBtYXNrLmljb25OYW1lID8gZmluZEljb24obWFzay5pY29uTmFtZSwgbWFzay5wcmVmaXgpIDogUHJvbWlzZS5yZXNvbHZlKHsKICAgICAgICAgICAgICBmb3VuZDogZmFsc2UsCiAgICAgICAgICAgICAgd2lkdGg6IDUxMiwKICAgICAgICAgICAgICBoZWlnaHQ6IDUxMiwKICAgICAgICAgICAgICBpY29uOiB7fQogICAgICAgICAgICB9KV0pLnRoZW4oZnVuY3Rpb24oX3JlZjIpIHsKICAgICAgICAgICAgICB2YXIgX3JlZjIyID0gX3NsaWNlZFRvQXJyYXkoX3JlZjIsIDIpLCBtYWluID0gX3JlZjIyWzBdLCBtYXNrMiA9IF9yZWYyMlsxXTsKICAgICAgICAgICAgICByZXNvbHZlMihbbm9kZTIsIG1ha2VJbmxpbmVTdmdBYnN0cmFjdCh7CiAgICAgICAgICAgICAgICBpY29uczogewogICAgICAgICAgICAgICAgICBtYWluLAogICAgICAgICAgICAgICAgICBtYXNrOiBtYXNrMgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHByZWZpeDogcHJlZml4NCwKICAgICAgICAgICAgICAgIGljb25OYW1lLAogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0yLAogICAgICAgICAgICAgICAgc3ltYm9sLAogICAgICAgICAgICAgICAgbWFza0lkLAogICAgICAgICAgICAgICAgZXh0cmEsCiAgICAgICAgICAgICAgICB3YXRjaGFibGU6IHRydWUKICAgICAgICAgICAgICB9KV0pOwogICAgICAgICAgICB9KS5jYXRjaChyZWplY3QpOwogICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBwcm92aWRlcnMkJDEuZ2VuZXJhdGVBYnN0cmFjdEljb24gPSBmdW5jdGlvbihfcmVmMykgewogICAgICAgICAgdmFyIGNoaWxkcmVuMiA9IF9yZWYzLmNoaWxkcmVuLCBhdHRyaWJ1dGVzID0gX3JlZjMuYXR0cmlidXRlcywgbWFpbiA9IF9yZWYzLm1haW4sIHRyYW5zZm9ybTIgPSBfcmVmMy50cmFuc2Zvcm0sIHN0eWxlczMgPSBfcmVmMy5zdHlsZXM7CiAgICAgICAgICB2YXIgc3R5bGVTdHJpbmcgPSBqb2luU3R5bGVzKHN0eWxlczMpOwogICAgICAgICAgaWYgKHN0eWxlU3RyaW5nLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgYXR0cmlidXRlc1sic3R5bGUiXSA9IHN0eWxlU3RyaW5nOwogICAgICAgICAgfQogICAgICAgICAgdmFyIG5leHRDaGlsZDsKICAgICAgICAgIGlmICh0cmFuc2Zvcm1Jc01lYW5pbmdmdWwodHJhbnNmb3JtMikpIHsKICAgICAgICAgICAgbmV4dENoaWxkID0gY2FsbFByb3ZpZGVkKCJnZW5lcmF0ZUFic3RyYWN0VHJhbnNmb3JtR3JvdXBpbmciLCB7CiAgICAgICAgICAgICAgbWFpbiwKICAgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybTIsCiAgICAgICAgICAgICAgY29udGFpbmVyV2lkdGg6IG1haW4ud2lkdGgsCiAgICAgICAgICAgICAgaWNvbldpZHRoOiBtYWluLndpZHRoCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgY2hpbGRyZW4yLnB1c2gobmV4dENoaWxkIHx8IG1haW4uaWNvbik7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW4yLAogICAgICAgICAgICBhdHRyaWJ1dGVzCiAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgIH0KICAgIH07CiAgICBMYXllcnMgPSB7CiAgICAgIG1peG91dDogZnVuY3Rpb24gbWl4b3V0MygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgbGF5ZXI6IGZ1bmN0aW9uIGxheWVyMihhc3NlbWJsZXIpIHsKICAgICAgICAgICAgdmFyIHBhcmFtczIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1sxXSA6IHt9OwogICAgICAgICAgICB2YXIgX3BhcmFtcyRjbGFzc2VzID0gcGFyYW1zMi5jbGFzc2VzLCBjbGFzc2VzID0gX3BhcmFtcyRjbGFzc2VzID09PSB2b2lkIDAgPyBbXSA6IF9wYXJhbXMkY2xhc3NlczsKICAgICAgICAgICAgcmV0dXJuIGRvbVZhcmlhbnRzKHsKICAgICAgICAgICAgICB0eXBlOiAibGF5ZXIiCiAgICAgICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNhbGxIb29rcygiYmVmb3JlRE9NRWxlbWVudENyZWF0aW9uIiwgewogICAgICAgICAgICAgICAgYXNzZW1ibGVyLAogICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXMyCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgdmFyIGNoaWxkcmVuMiA9IFtdOwogICAgICAgICAgICAgIGFzc2VtYmxlcihmdW5jdGlvbihhcmdzKSB7CiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGFyZ3MpID8gYXJncy5tYXAoZnVuY3Rpb24oYTUpIHsKICAgICAgICAgICAgICAgICAgY2hpbGRyZW4yID0gY2hpbGRyZW4yLmNvbmNhdChhNS5hYnN0cmFjdCk7CiAgICAgICAgICAgICAgICB9KSA6IGNoaWxkcmVuMiA9IGNoaWxkcmVuMi5jb25jYXQoYXJncy5hYnN0cmFjdCk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgcmV0dXJuIFt7CiAgICAgICAgICAgICAgICB0YWc6ICJzcGFuIiwKICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgICAgICAgICAgY2xhc3M6IFsiIi5jb25jYXQoY29uZmlnMi5jc3NQcmVmaXgsICItbGF5ZXJzIildLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoY2xhc3NlcykpLmpvaW4oIiAiKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbjIKICAgICAgICAgICAgICB9XTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIExheWVyc0NvdW50ZXIgPSB7CiAgICAgIG1peG91dDogZnVuY3Rpb24gbWl4b3V0NCgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgY291bnRlcjogZnVuY3Rpb24gY291bnRlcjIoY29udGVudDMpIHsKICAgICAgICAgICAgdmFyIHBhcmFtczIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1sxXSA6IHt9OwogICAgICAgICAgICB2YXIgX3BhcmFtcyR0aXRsZSA9IHBhcmFtczIudGl0bGUsIHRpdGxlID0gX3BhcmFtcyR0aXRsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9wYXJhbXMkdGl0bGUsIF9wYXJhbXMkY2xhc3NlcyA9IHBhcmFtczIuY2xhc3NlcywgY2xhc3NlcyA9IF9wYXJhbXMkY2xhc3NlcyA9PT0gdm9pZCAwID8gW10gOiBfcGFyYW1zJGNsYXNzZXMsIF9wYXJhbXMkYXR0cmlidXRlcyA9IHBhcmFtczIuYXR0cmlidXRlcywgYXR0cmlidXRlcyA9IF9wYXJhbXMkYXR0cmlidXRlcyA9PT0gdm9pZCAwID8ge30gOiBfcGFyYW1zJGF0dHJpYnV0ZXMsIF9wYXJhbXMkc3R5bGVzID0gcGFyYW1zMi5zdHlsZXMsIHN0eWxlczMgPSBfcGFyYW1zJHN0eWxlcyA9PT0gdm9pZCAwID8ge30gOiBfcGFyYW1zJHN0eWxlczsKICAgICAgICAgICAgcmV0dXJuIGRvbVZhcmlhbnRzKHsKICAgICAgICAgICAgICB0eXBlOiAiY291bnRlciIsCiAgICAgICAgICAgICAgY29udGVudDogY29udGVudDMKICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgY2FsbEhvb2tzKCJiZWZvcmVET01FbGVtZW50Q3JlYXRpb24iLCB7CiAgICAgICAgICAgICAgICBjb250ZW50OiBjb250ZW50MywKICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1zMgogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHJldHVybiBtYWtlTGF5ZXJzQ291bnRlckFic3RyYWN0KHsKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQzLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICB0aXRsZSwKICAgICAgICAgICAgICAgIGV4dHJhOiB7CiAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgIHN0eWxlczogc3R5bGVzMywKICAgICAgICAgICAgICAgICAgY2xhc3NlczogWyIiLmNvbmNhdChjb25maWcyLmNzc1ByZWZpeCwgIi1sYXllcnMtY291bnRlciIpXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGNsYXNzZXMpKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgTGF5ZXJzVGV4dCA9IHsKICAgICAgbWl4b3V0OiBmdW5jdGlvbiBtaXhvdXQ1KCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0ZXh0OiBmdW5jdGlvbiB0ZXh0OShjb250ZW50MykgewogICAgICAgICAgICB2YXIgcGFyYW1zMiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdm9pZCAwID8gYXJndW1lbnRzWzFdIDoge307CiAgICAgICAgICAgIHZhciBfcGFyYW1zJHRyYW5zZm9ybSA9IHBhcmFtczIudHJhbnNmb3JtLCB0cmFuc2Zvcm0yID0gX3BhcmFtcyR0cmFuc2Zvcm0gPT09IHZvaWQgMCA/IG1lYW5pbmdsZXNzVHJhbnNmb3JtIDogX3BhcmFtcyR0cmFuc2Zvcm0sIF9wYXJhbXMkY2xhc3NlcyA9IHBhcmFtczIuY2xhc3NlcywgY2xhc3NlcyA9IF9wYXJhbXMkY2xhc3NlcyA9PT0gdm9pZCAwID8gW10gOiBfcGFyYW1zJGNsYXNzZXMsIF9wYXJhbXMkYXR0cmlidXRlcyA9IHBhcmFtczIuYXR0cmlidXRlcywgYXR0cmlidXRlcyA9IF9wYXJhbXMkYXR0cmlidXRlcyA9PT0gdm9pZCAwID8ge30gOiBfcGFyYW1zJGF0dHJpYnV0ZXMsIF9wYXJhbXMkc3R5bGVzID0gcGFyYW1zMi5zdHlsZXMsIHN0eWxlczMgPSBfcGFyYW1zJHN0eWxlcyA9PT0gdm9pZCAwID8ge30gOiBfcGFyYW1zJHN0eWxlczsKICAgICAgICAgICAgcmV0dXJuIGRvbVZhcmlhbnRzKHsKICAgICAgICAgICAgICB0eXBlOiAidGV4dCIsCiAgICAgICAgICAgICAgY29udGVudDogY29udGVudDMKICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgY2FsbEhvb2tzKCJiZWZvcmVET01FbGVtZW50Q3JlYXRpb24iLCB7CiAgICAgICAgICAgICAgICBjb250ZW50OiBjb250ZW50MywKICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1zMgogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHJldHVybiBtYWtlTGF5ZXJzVGV4dEFic3RyYWN0KHsKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQzLAogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgbWVhbmluZ2xlc3NUcmFuc2Zvcm0pLCB0cmFuc2Zvcm0yKSwKICAgICAgICAgICAgICAgIGV4dHJhOiB7CiAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgIHN0eWxlczogc3R5bGVzMywKICAgICAgICAgICAgICAgICAgY2xhc3NlczogWyIiLmNvbmNhdChjb25maWcyLmNzc1ByZWZpeCwgIi1sYXllcnMtdGV4dCIpXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGNsYXNzZXMpKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9LAogICAgICBwcm92aWRlczogZnVuY3Rpb24gcHJvdmlkZXMyKHByb3ZpZGVycyQkMSkgewogICAgICAgIHByb3ZpZGVycyQkMS5nZW5lcmF0ZUxheWVyc1RleHQgPSBmdW5jdGlvbihub2RlMiwgbm9kZU1ldGEpIHsKICAgICAgICAgIHZhciB0cmFuc2Zvcm0yID0gbm9kZU1ldGEudHJhbnNmb3JtLCBleHRyYSA9IG5vZGVNZXRhLmV4dHJhOwogICAgICAgICAgdmFyIHdpZHRoID0gbnVsbDsKICAgICAgICAgIHZhciBoZWlnaHQgPSBudWxsOwogICAgICAgICAgaWYgKElTX0lFKSB7CiAgICAgICAgICAgIHZhciBjb21wdXRlZEZvbnRTaXplID0gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShub2RlMikuZm9udFNpemUsIDEwKTsKICAgICAgICAgICAgdmFyIGJvdW5kaW5nQ2xpZW50UmVjdCA9IG5vZGUyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICB3aWR0aCA9IGJvdW5kaW5nQ2xpZW50UmVjdC53aWR0aCAvIGNvbXB1dGVkRm9udFNpemU7CiAgICAgICAgICAgIGhlaWdodCA9IGJvdW5kaW5nQ2xpZW50UmVjdC5oZWlnaHQgLyBjb21wdXRlZEZvbnRTaXplOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbbm9kZTIsIG1ha2VMYXllcnNUZXh0QWJzdHJhY3QoewogICAgICAgICAgICBjb250ZW50OiBub2RlMi5pbm5lckhUTUwsCiAgICAgICAgICAgIHdpZHRoLAogICAgICAgICAgICBoZWlnaHQsCiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtMiwKICAgICAgICAgICAgZXh0cmEsCiAgICAgICAgICAgIHdhdGNoYWJsZTogdHJ1ZQogICAgICAgICAgfSldKTsKICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgQ0xFQU5fQ09OVEVOVF9QQVRURVJOID0gbmV3IFJlZ0V4cCgnIicsICJ1ZyIpOwogICAgU0VDT05EQVJZX1VOSUNPREVfUkFOR0UgPSBbMTEwNTkyMCwgMTExMjMxOV07CiAgICBfRk9OVF9GQU1JTFlfV0VJR0hUX1RPX1BSRUZJWCA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCB7CiAgICAgIEZvbnRBd2Vzb21lOiB7CiAgICAgICAgbm9ybWFsOiAiZmFzIiwKICAgICAgICA0MDA6ICJmYXMiCiAgICAgIH0KICAgIH0pLCBDdCksIHJvKSwgZGwpOwogICAgRk9OVF9GQU1JTFlfV0VJR0hUX1RPX1BSRUZJWCA9IE9iamVjdC5rZXlzKF9GT05UX0ZBTUlMWV9XRUlHSFRfVE9fUFJFRklYKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLCBrZXkyKSB7CiAgICAgIGFjY1trZXkyLnRvTG93ZXJDYXNlKCldID0gX0ZPTlRfRkFNSUxZX1dFSUdIVF9UT19QUkVGSVhba2V5Ml07CiAgICAgIHJldHVybiBhY2M7CiAgICB9LCB7fSk7CiAgICBGT05UX0ZBTUlMWV9XRUlHSFRfRkFMTEJBQ0sgPSBPYmplY3Qua2V5cyhGT05UX0ZBTUlMWV9XRUlHSFRfVE9fUFJFRklYKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLCBmb250RmFtaWx5KSB7CiAgICAgIHZhciB3ZWlnaHRzID0gRk9OVF9GQU1JTFlfV0VJR0hUX1RPX1BSRUZJWFtmb250RmFtaWx5XTsKICAgICAgYWNjW2ZvbnRGYW1pbHldID0gd2VpZ2h0c1s5MDBdIHx8IF90b0NvbnN1bWFibGVBcnJheShPYmplY3QuZW50cmllcyh3ZWlnaHRzKSlbMF1bMV07CiAgICAgIHJldHVybiBhY2M7CiAgICB9LCB7fSk7CiAgICBoYXNQc2V1ZG9FbGVtZW50ID0gZnVuY3Rpb24gaGFzUHNldWRvRWxlbWVudDIoc2VsZWN0b3IpIHsKICAgICAgcmV0dXJuICEhc2VsZWN0b3IgJiYgUFNFVURPX0VMRU1FTlRTLnNvbWUoZnVuY3Rpb24ocHNldWRvU2VsZWN0b3IpIHsKICAgICAgICByZXR1cm4gc2VsZWN0b3IuaW5jbHVkZXMocHNldWRvU2VsZWN0b3IpOwogICAgICB9KTsKICAgIH07CiAgICBwYXJzZUNTU1J1bGVGb3JQc2V1ZG9zID0gZnVuY3Rpb24gcGFyc2VDU1NSdWxlRm9yUHNldWRvczIoc2VsZWN0b3JUZXh0KSB7CiAgICAgIGlmICghc2VsZWN0b3JUZXh0KSByZXR1cm4gW107CiAgICAgIHZhciBzZWxlY3RvclNldCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICAgIHZhciBzZWxlY3RvcnMgPSBzZWxlY3RvclRleHQuc3BsaXQoLywoPyFbXigpXSpcKSkvKS5tYXAoZnVuY3Rpb24ocyQkMSkgewogICAgICAgIHJldHVybiBzJCQxLnRyaW0oKTsKICAgICAgfSk7CiAgICAgIHNlbGVjdG9ycyA9IHNlbGVjdG9ycy5mbGF0TWFwKGZ1bmN0aW9uKHNlbGVjdG9yMikgewogICAgICAgIHJldHVybiBzZWxlY3RvcjIuaW5jbHVkZXMoIigiKSA/IHNlbGVjdG9yMiA6IHNlbGVjdG9yMi5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihzJCQxKSB7CiAgICAgICAgICByZXR1cm4gcyQkMS50cmltKCk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc2VsZWN0b3JzKSwgX3N0ZXA7CiAgICAgIHRyeSB7CiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTsgKSB7CiAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBfc3RlcC52YWx1ZTsKICAgICAgICAgIGlmIChoYXNQc2V1ZG9FbGVtZW50KHNlbGVjdG9yKSkgewogICAgICAgICAgICB2YXIgc2VsZWN0b3JXaXRob3V0UHNldWRvID0gUFNFVURPX0VMRU1FTlRTLnJlZHVjZShmdW5jdGlvbihhY2MsIHBzZXVkb1NlbGVjdG9yKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGFjYy5yZXBsYWNlKHBzZXVkb1NlbGVjdG9yLCAiIik7CiAgICAgICAgICAgIH0sIHNlbGVjdG9yKTsKICAgICAgICAgICAgaWYgKHNlbGVjdG9yV2l0aG91dFBzZXVkbyAhPT0gIiIgJiYgc2VsZWN0b3JXaXRob3V0UHNldWRvICE9PSAiKiIpIHsKICAgICAgICAgICAgICBzZWxlY3RvclNldC5hZGQoc2VsZWN0b3JXaXRob3V0UHNldWRvKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBfaXRlcmF0b3IuZigpOwogICAgICB9CiAgICAgIHJldHVybiBzZWxlY3RvclNldDsKICAgIH07CiAgICBQc2V1ZG9FbGVtZW50cyA9IHsKICAgICAgaG9va3M6IGZ1bmN0aW9uIGhvb2tzMygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgbXV0YXRpb25PYnNlcnZlckNhbGxiYWNrczogZnVuY3Rpb24gbXV0YXRpb25PYnNlcnZlckNhbGxiYWNrcyhhY2N1bXVsYXRvcikgewogICAgICAgICAgICBhY2N1bXVsYXRvci5wc2V1ZG9FbGVtZW50c0NhbGxiYWNrID0gc2VhcmNoUHNldWRvRWxlbWVudHM7CiAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9LAogICAgICBwcm92aWRlczogZnVuY3Rpb24gcHJvdmlkZXMzKHByb3ZpZGVyczIpIHsKICAgICAgICBwcm92aWRlcnMyLnBzZXVkb0VsZW1lbnRzMnN2ZyA9IGZ1bmN0aW9uKHBhcmFtczIpIHsKICAgICAgICAgIHZhciBfcGFyYW1zJG5vZGUgPSBwYXJhbXMyLm5vZGUsIG5vZGUyID0gX3BhcmFtcyRub2RlID09PSB2b2lkIDAgPyBET0NVTUVOVCA6IF9wYXJhbXMkbm9kZTsKICAgICAgICAgIGlmIChjb25maWcyLnNlYXJjaFBzZXVkb0VsZW1lbnRzKSB7CiAgICAgICAgICAgIHNlYXJjaFBzZXVkb0VsZW1lbnRzKG5vZGUyKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgX3Vud2F0Y2hlZCA9IGZhbHNlOwogICAgTXV0YXRpb25PYnNlcnZlciQxID0gewogICAgICBtaXhvdXQ6IGZ1bmN0aW9uIG1peG91dDYoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGRvbTogewogICAgICAgICAgICB1bndhdGNoOiBmdW5jdGlvbiB1bndhdGNoKCkgewogICAgICAgICAgICAgIGRpc2FibGVPYnNlcnZhdGlvbigpOwogICAgICAgICAgICAgIF91bndhdGNoZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfSwKICAgICAgaG9va3M6IGZ1bmN0aW9uIGhvb2tzNCgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgYm9vdHN0cmFwOiBmdW5jdGlvbiBib290c3RyYXAoKSB7CiAgICAgICAgICAgIG9ic2VydmUoY2hhaW5Ib29rcygibXV0YXRpb25PYnNlcnZlckNhbGxiYWNrcyIsIHt9KSk7CiAgICAgICAgICB9LAogICAgICAgICAgbm9BdXRvOiBmdW5jdGlvbiBub0F1dG8zKCkgewogICAgICAgICAgICBkaXNjb25uZWN0KCk7CiAgICAgICAgICB9LAogICAgICAgICAgd2F0Y2g6IGZ1bmN0aW9uIHdhdGNoMihwYXJhbXMyKSB7CiAgICAgICAgICAgIHZhciBvYnNlcnZlTXV0YXRpb25zUm9vdCA9IHBhcmFtczIub2JzZXJ2ZU11dGF0aW9uc1Jvb3Q7CiAgICAgICAgICAgIGlmIChfdW53YXRjaGVkKSB7CiAgICAgICAgICAgICAgZW5hYmxlT2JzZXJ2YXRpb24oKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBvYnNlcnZlKGNoYWluSG9va3MoIm11dGF0aW9uT2JzZXJ2ZXJDYWxsYmFja3MiLCB7CiAgICAgICAgICAgICAgICBvYnNlcnZlTXV0YXRpb25zUm9vdAogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0KICAgIH07CiAgICBwYXJzZVRyYW5zZm9ybVN0cmluZyA9IGZ1bmN0aW9uIHBhcnNlVHJhbnNmb3JtU3RyaW5nMih0cmFuc2Zvcm1TdHJpbmcpIHsKICAgICAgdmFyIHRyYW5zZm9ybTIgPSB7CiAgICAgICAgc2l6ZTogMTYsCiAgICAgICAgeDogMCwKICAgICAgICB5OiAwLAogICAgICAgIGZsaXBYOiBmYWxzZSwKICAgICAgICBmbGlwWTogZmFsc2UsCiAgICAgICAgcm90YXRlOiAwCiAgICAgIH07CiAgICAgIHJldHVybiB0cmFuc2Zvcm1TdHJpbmcudG9Mb3dlckNhc2UoKS5zcGxpdCgiICIpLnJlZHVjZShmdW5jdGlvbihhY2MsIG4xMykgewogICAgICAgIHZhciBwYXJ0cyA9IG4xMy50b0xvd2VyQ2FzZSgpLnNwbGl0KCItIik7CiAgICAgICAgdmFyIGZpcnN0MiA9IHBhcnRzWzBdOwogICAgICAgIHZhciByZXN0ID0gcGFydHMuc2xpY2UoMSkuam9pbigiLSIpOwogICAgICAgIGlmIChmaXJzdDIgJiYgcmVzdCA9PT0gImgiKSB7CiAgICAgICAgICBhY2MuZmxpcFggPSB0cnVlOwogICAgICAgICAgcmV0dXJuIGFjYzsKICAgICAgICB9CiAgICAgICAgaWYgKGZpcnN0MiAmJiByZXN0ID09PSAidiIpIHsKICAgICAgICAgIGFjYy5mbGlwWSA9IHRydWU7CiAgICAgICAgICByZXR1cm4gYWNjOwogICAgICAgIH0KICAgICAgICByZXN0ID0gcGFyc2VGbG9hdChyZXN0KTsKICAgICAgICBpZiAoaXNOYU4ocmVzdCkpIHsKICAgICAgICAgIHJldHVybiBhY2M7CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAoZmlyc3QyKSB7CiAgICAgICAgICBjYXNlICJncm93IjoKICAgICAgICAgICAgYWNjLnNpemUgPSBhY2Muc2l6ZSArIHJlc3Q7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAic2hyaW5rIjoKICAgICAgICAgICAgYWNjLnNpemUgPSBhY2Muc2l6ZSAtIHJlc3Q7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAibGVmdCI6CiAgICAgICAgICAgIGFjYy54ID0gYWNjLnggLSByZXN0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgInJpZ2h0IjoKICAgICAgICAgICAgYWNjLnggPSBhY2MueCArIHJlc3Q7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAidXAiOgogICAgICAgICAgICBhY2MueSA9IGFjYy55IC0gcmVzdDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJkb3duIjoKICAgICAgICAgICAgYWNjLnkgPSBhY2MueSArIHJlc3Q7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAicm90YXRlIjoKICAgICAgICAgICAgYWNjLnJvdGF0ZSA9IGFjYy5yb3RhdGUgKyByZXN0OwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFjYzsKICAgICAgfSwgdHJhbnNmb3JtMik7CiAgICB9OwogICAgUG93ZXJUcmFuc2Zvcm1zID0gewogICAgICBtaXhvdXQ6IGZ1bmN0aW9uIG1peG91dDcoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHBhcnNlOiB7CiAgICAgICAgICAgIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtMih0cmFuc2Zvcm1TdHJpbmcpIHsKICAgICAgICAgICAgICByZXR1cm4gcGFyc2VUcmFuc2Zvcm1TdHJpbmcodHJhbnNmb3JtU3RyaW5nKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIGhvb2tzOiBmdW5jdGlvbiBob29rczUoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHBhcnNlTm9kZUF0dHJpYnV0ZXM6IGZ1bmN0aW9uIHBhcnNlTm9kZUF0dHJpYnV0ZXMoYWNjdW11bGF0b3IsIG5vZGUyKSB7CiAgICAgICAgICAgIHZhciB0cmFuc2Zvcm1TdHJpbmcgPSBub2RlMi5nZXRBdHRyaWJ1dGUoImRhdGEtZmEtdHJhbnNmb3JtIik7CiAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1TdHJpbmcpIHsKICAgICAgICAgICAgICBhY2N1bXVsYXRvci50cmFuc2Zvcm0gPSBwYXJzZVRyYW5zZm9ybVN0cmluZyh0cmFuc2Zvcm1TdHJpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9LAogICAgICBwcm92aWRlczogZnVuY3Rpb24gcHJvdmlkZXM0KHByb3ZpZGVyczIpIHsKICAgICAgICBwcm92aWRlcnMyLmdlbmVyYXRlQWJzdHJhY3RUcmFuc2Zvcm1Hcm91cGluZyA9IGZ1bmN0aW9uKF9yZWYyKSB7CiAgICAgICAgICB2YXIgbWFpbiA9IF9yZWYyLm1haW4sIHRyYW5zZm9ybTIgPSBfcmVmMi50cmFuc2Zvcm0sIGNvbnRhaW5lcldpZHRoID0gX3JlZjIuY29udGFpbmVyV2lkdGgsIGljb25XaWR0aCA9IF9yZWYyLmljb25XaWR0aDsKICAgICAgICAgIHZhciBvdXRlciA9IHsKICAgICAgICAgICAgdHJhbnNmb3JtOiAidHJhbnNsYXRlKCIuY29uY2F0KGNvbnRhaW5lcldpZHRoIC8gMiwgIiAyNTYpIikKICAgICAgICAgIH07CiAgICAgICAgICB2YXIgaW5uZXJUcmFuc2xhdGUgPSAidHJhbnNsYXRlKCIuY29uY2F0KHRyYW5zZm9ybTIueCAqIDMyLCAiLCAiKS5jb25jYXQodHJhbnNmb3JtMi55ICogMzIsICIpICIpOwogICAgICAgICAgdmFyIGlubmVyU2NhbGUgPSAic2NhbGUoIi5jb25jYXQodHJhbnNmb3JtMi5zaXplIC8gMTYgKiAodHJhbnNmb3JtMi5mbGlwWCA/IC0xIDogMSksICIsICIpLmNvbmNhdCh0cmFuc2Zvcm0yLnNpemUgLyAxNiAqICh0cmFuc2Zvcm0yLmZsaXBZID8gLTEgOiAxKSwgIikgIik7CiAgICAgICAgICB2YXIgaW5uZXJSb3RhdGUgPSAicm90YXRlKCIuY29uY2F0KHRyYW5zZm9ybTIucm90YXRlLCAiIDAgMCkiKTsKICAgICAgICAgIHZhciBpbm5lciA9IHsKICAgICAgICAgICAgdHJhbnNmb3JtOiAiIi5jb25jYXQoaW5uZXJUcmFuc2xhdGUsICIgIikuY29uY2F0KGlubmVyU2NhbGUsICIgIikuY29uY2F0KGlubmVyUm90YXRlKQogICAgICAgICAgfTsKICAgICAgICAgIHZhciBwYXRoMiA9IHsKICAgICAgICAgICAgdHJhbnNmb3JtOiAidHJhbnNsYXRlKCIuY29uY2F0KGljb25XaWR0aCAvIDIgKiAtMSwgIiAtMjU2KSIpCiAgICAgICAgICB9OwogICAgICAgICAgdmFyIG9wZXJhdGlvbnMgPSB7CiAgICAgICAgICAgIG91dGVyLAogICAgICAgICAgICBpbm5lciwKICAgICAgICAgICAgcGF0aDogcGF0aDIKICAgICAgICAgIH07CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0YWc6ICJnIiwKICAgICAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoe30sIG9wZXJhdGlvbnMub3V0ZXIpLAogICAgICAgICAgICBjaGlsZHJlbjogW3sKICAgICAgICAgICAgICB0YWc6ICJnIiwKICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMih7fSwgb3BlcmF0aW9ucy5pbm5lciksCiAgICAgICAgICAgICAgY2hpbGRyZW46IFt7CiAgICAgICAgICAgICAgICB0YWc6IG1haW4uaWNvbi50YWcsCiAgICAgICAgICAgICAgICBjaGlsZHJlbjogbWFpbi5pY29uLmNoaWxkcmVuLAogICAgICAgICAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG1haW4uaWNvbi5hdHRyaWJ1dGVzKSwgb3BlcmF0aW9ucy5wYXRoKQogICAgICAgICAgICAgIH1dCiAgICAgICAgICAgIH1dCiAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgIH0KICAgIH07CiAgICBBTExfU1BBQ0UgPSB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHdpZHRoOiAiMTAwJSIsCiAgICAgIGhlaWdodDogIjEwMCUiCiAgICB9OwogICAgTWFza3MgPSB7CiAgICAgIGhvb2tzOiBmdW5jdGlvbiBob29rczYoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHBhcnNlTm9kZUF0dHJpYnV0ZXM6IGZ1bmN0aW9uIHBhcnNlTm9kZUF0dHJpYnV0ZXMoYWNjdW11bGF0b3IsIG5vZGUyKSB7CiAgICAgICAgICAgIHZhciBtYXNrRGF0YSA9IG5vZGUyLmdldEF0dHJpYnV0ZSgiZGF0YS1mYS1tYXNrIik7CiAgICAgICAgICAgIHZhciBtYXNrID0gIW1hc2tEYXRhID8gZW1wdHlDYW5vbmljYWxJY29uKCkgOiBnZXRDYW5vbmljYWxJY29uKG1hc2tEYXRhLnNwbGl0KCIgIikubWFwKGZ1bmN0aW9uKGkxMSkgewogICAgICAgICAgICAgIHJldHVybiBpMTEudHJpbSgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGlmICghbWFzay5wcmVmaXgpIHsKICAgICAgICAgICAgICBtYXNrLnByZWZpeCA9IGdldERlZmF1bHRVc2FibGVQcmVmaXgoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhY2N1bXVsYXRvci5tYXNrID0gbWFzazsKICAgICAgICAgICAgYWNjdW11bGF0b3IubWFza0lkID0gbm9kZTIuZ2V0QXR0cmlidXRlKCJkYXRhLWZhLW1hc2staWQiKTsKICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIHByb3ZpZGVzOiBmdW5jdGlvbiBwcm92aWRlczUocHJvdmlkZXJzMikgewogICAgICAgIHByb3ZpZGVyczIuZ2VuZXJhdGVBYnN0cmFjdE1hc2sgPSBmdW5jdGlvbihfcmVmMikgewogICAgICAgICAgdmFyIGNoaWxkcmVuMiA9IF9yZWYyLmNoaWxkcmVuLCBhdHRyaWJ1dGVzID0gX3JlZjIuYXR0cmlidXRlcywgbWFpbiA9IF9yZWYyLm1haW4sIG1hc2sgPSBfcmVmMi5tYXNrLCBleHBsaWNpdE1hc2tJZCA9IF9yZWYyLm1hc2tJZCwgdHJhbnNmb3JtMiA9IF9yZWYyLnRyYW5zZm9ybTsKICAgICAgICAgIHZhciBtYWluV2lkdGggPSBtYWluLndpZHRoLCBtYWluUGF0aCA9IG1haW4uaWNvbjsKICAgICAgICAgIHZhciBtYXNrV2lkdGggPSBtYXNrLndpZHRoLCBtYXNrUGF0aCA9IG1hc2suaWNvbjsKICAgICAgICAgIHZhciB0cmFucyA9IHRyYW5zZm9ybUZvclN2Zyh7CiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtMiwKICAgICAgICAgICAgY29udGFpbmVyV2lkdGg6IG1hc2tXaWR0aCwKICAgICAgICAgICAgaWNvbldpZHRoOiBtYWluV2lkdGgKICAgICAgICAgIH0pOwogICAgICAgICAgdmFyIG1hc2tSZWN0ID0gewogICAgICAgICAgICB0YWc6ICJyZWN0IiwKICAgICAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIEFMTF9TUEFDRSksIHt9LCB7CiAgICAgICAgICAgICAgZmlsbDogIndoaXRlIgogICAgICAgICAgICB9KQogICAgICAgICAgfTsKICAgICAgICAgIHZhciBtYXNrSW5uZXJHcm91cENoaWxkcmVuTWl4aW4gPSBtYWluUGF0aC5jaGlsZHJlbiA/IHsKICAgICAgICAgICAgY2hpbGRyZW46IG1haW5QYXRoLmNoaWxkcmVuLm1hcChmaWxsQmxhY2spCiAgICAgICAgICB9IDoge307CiAgICAgICAgICB2YXIgbWFza0lubmVyR3JvdXAgPSB7CiAgICAgICAgICAgIHRhZzogImciLAogICAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMih7fSwgdHJhbnMuaW5uZXIpLAogICAgICAgICAgICBjaGlsZHJlbjogW2ZpbGxCbGFjayhfb2JqZWN0U3ByZWFkMih7CiAgICAgICAgICAgICAgdGFnOiBtYWluUGF0aC50YWcsCiAgICAgICAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG1haW5QYXRoLmF0dHJpYnV0ZXMpLCB0cmFucy5wYXRoKQogICAgICAgICAgICB9LCBtYXNrSW5uZXJHcm91cENoaWxkcmVuTWl4aW4pKV0KICAgICAgICAgIH07CiAgICAgICAgICB2YXIgbWFza091dGVyR3JvdXAgPSB7CiAgICAgICAgICAgIHRhZzogImciLAogICAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMih7fSwgdHJhbnMub3V0ZXIpLAogICAgICAgICAgICBjaGlsZHJlbjogW21hc2tJbm5lckdyb3VwXQogICAgICAgICAgfTsKICAgICAgICAgIHZhciBtYXNrSWQgPSAibWFzay0iLmNvbmNhdChleHBsaWNpdE1hc2tJZCB8fCBuZXh0VW5pcXVlSWQoKSk7CiAgICAgICAgICB2YXIgY2xpcElkID0gImNsaXAtIi5jb25jYXQoZXhwbGljaXRNYXNrSWQgfHwgbmV4dFVuaXF1ZUlkKCkpOwogICAgICAgICAgdmFyIG1hc2tUYWcgPSB7CiAgICAgICAgICAgIHRhZzogIm1hc2siLAogICAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgQUxMX1NQQUNFKSwge30sIHsKICAgICAgICAgICAgICBpZDogbWFza0lkLAogICAgICAgICAgICAgIG1hc2tVbml0czogInVzZXJTcGFjZU9uVXNlIiwKICAgICAgICAgICAgICBtYXNrQ29udGVudFVuaXRzOiAidXNlclNwYWNlT25Vc2UiCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICBjaGlsZHJlbjogW21hc2tSZWN0LCBtYXNrT3V0ZXJHcm91cF0KICAgICAgICAgIH07CiAgICAgICAgICB2YXIgZGVmcyA9IHsKICAgICAgICAgICAgdGFnOiAiZGVmcyIsCiAgICAgICAgICAgIGNoaWxkcmVuOiBbewogICAgICAgICAgICAgIHRhZzogImNsaXBQYXRoIiwKICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICAgICAgICBpZDogY2xpcElkCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBjaGlsZHJlbjogZGVHcm91cChtYXNrUGF0aCkKICAgICAgICAgICAgfSwgbWFza1RhZ10KICAgICAgICAgIH07CiAgICAgICAgICBjaGlsZHJlbjIucHVzaChkZWZzLCB7CiAgICAgICAgICAgIHRhZzogInJlY3QiLAogICAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMih7CiAgICAgICAgICAgICAgImZpbGwiOiAiY3VycmVudENvbG9yIiwKICAgICAgICAgICAgICAiY2xpcC1wYXRoIjogInVybCgjIi5jb25jYXQoY2xpcElkLCAiKSIpLAogICAgICAgICAgICAgICJtYXNrIjogInVybCgjIi5jb25jYXQobWFza0lkLCAiKSIpCiAgICAgICAgICAgIH0sIEFMTF9TUEFDRSkKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuMiwKICAgICAgICAgICAgYXR0cmlidXRlcwogICAgICAgICAgfTsKICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgTWlzc2luZ0ljb25JbmRpY2F0b3IgPSB7CiAgICAgIHByb3ZpZGVzOiBmdW5jdGlvbiBwcm92aWRlczYocHJvdmlkZXJzMikgewogICAgICAgIHZhciByZWR1Y2VNb3Rpb24gPSBmYWxzZTsKICAgICAgICBpZiAoV0lORE9XLm1hdGNoTWVkaWEpIHsKICAgICAgICAgIHJlZHVjZU1vdGlvbiA9IFdJTkRPVy5tYXRjaE1lZGlhKCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSIpLm1hdGNoZXM7CiAgICAgICAgfQogICAgICAgIHByb3ZpZGVyczIubWlzc2luZ0ljb25BYnN0cmFjdCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGdDaGlsZHJlbiA9IFtdOwogICAgICAgICAgdmFyIEZJTEwgPSB7CiAgICAgICAgICAgIGZpbGw6ICJjdXJyZW50Q29sb3IiCiAgICAgICAgICB9OwogICAgICAgICAgdmFyIEFOSU1BVElPTl9CQVNFID0gewogICAgICAgICAgICBhdHRyaWJ1dGVUeXBlOiAiWE1MIiwKICAgICAgICAgICAgcmVwZWF0Q291bnQ6ICJpbmRlZmluaXRlIiwKICAgICAgICAgICAgZHVyOiAiMnMiCiAgICAgICAgICB9OwogICAgICAgICAgZ0NoaWxkcmVuLnB1c2goewogICAgICAgICAgICB0YWc6ICJwYXRoIiwKICAgICAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIEZJTEwpLCB7fSwgewogICAgICAgICAgICAgIGQ6ICJNMTU2LjUsNDQ3LjdsLTEyLjYsMjkuNWMtMTguNy05LjUtMzUuOS0yMS4yLTUxLjUtMzQuOWwyMi43LTIyLjdDMTI3LjYsNDMwLjUsMTQxLjUsNDQwLDE1Ni41LDQ0Ny43eiBNNDAuNiwyNzJIOC41IGMxLjQsMjEuMiw1LjQsNDEuNywxMS43LDYxLjFMNTAsMzIxLjJDNDUuMSwzMDUuNSw0MS44LDI4OSw0MC42LDI3MnogTTQwLjYsMjQwYzEuNC0xOC44LDUuMi0zNywxMS4xLTU0LjFsLTI5LjUtMTIuNiBDMTQuNywxOTQuMywxMCwyMTYuNyw4LjUsMjQwSDQwLjZ6IE02NC4zLDE1Ni41YzcuOC0xNC45LDE3LjItMjguOCwyOC4xLTQxLjVMNjkuNyw5Mi4zYy0xMy43LDE1LjYtMjUuNSwzMi44LTM0LjksNTEuNSBMNjQuMywxNTYuNXogTTM5Nyw0MTkuNmMtMTMuOSwxMi0yOS40LDIyLjMtNDYuMSwzMC40bDExLjksMjkuOGMyMC43LTkuOSwzOS44LTIyLjYsNTYuOS0zNy42TDM5Nyw0MTkuNnogTTExNSw5Mi40IGMxMy45LTEyLDI5LjQtMjIuMyw0Ni4xLTMwLjRsLTExLjktMjkuOGMtMjAuNyw5LjktMzkuOCwyMi42LTU2LjgsMzcuNkwxMTUsOTIuNHogTTQ0Ny43LDM1NS41Yy03LjgsMTQuOS0xNy4yLDI4LjgtMjguMSw0MS41IGwyMi43LDIyLjdjMTMuNy0xNS42LDI1LjUtMzIuOSwzNC45LTUxLjVMNDQ3LjcsMzU1LjV6IE00NzEuNCwyNzJjLTEuNCwxOC44LTUuMiwzNy0xMS4xLDU0LjFsMjkuNSwxMi42IGM3LjUtMjEuMSwxMi4yLTQzLjUsMTMuNi02Ni44SDQ3MS40eiBNMzIxLjIsNDYyYy0xNS43LDUtMzIuMiw4LjItNDkuMiw5LjR2MzIuMWMyMS4yLTEuNCw0MS43LTUuNCw2MS4xLTExLjdMMzIxLjIsNDYyeiBNMjQwLDQ3MS40Yy0xOC44LTEuNC0zNy01LjItNTQuMS0xMS4xbC0xMi42LDI5LjVjMjEuMSw3LjUsNDMuNSwxMi4yLDY2LjgsMTMuNlY0NzEuNHogTTQ2MiwxOTAuOGM1LDE1LjcsOC4yLDMyLjIsOS40LDQ5LjJoMzIuMSBjLTEuNC0yMS4yLTUuNC00MS43LTExLjctNjEuMUw0NjIsMTkwLjh6IE05Mi40LDM5N2MtMTItMTMuOS0yMi4zLTI5LjQtMzAuNC00Ni4xbC0yOS44LDExLjljOS45LDIwLjcsMjIuNiwzOS44LDM3LjYsNTYuOSBMOTIuNCwzOTd6IE0yNzIsNDAuNmMxOC44LDEuNCwzNi45LDUuMiw1NC4xLDExLjFsMTIuNi0yOS41QzMxNy43LDE0LjcsMjk1LjMsMTAsMjcyLDguNVY0MC42eiBNMTkwLjgsNTAgYzE1LjctNSwzMi4yLTguMiw0OS4yLTkuNFY4LjVjLTIxLjIsMS40LTQxLjcsNS40LTYxLjEsMTEuN0wxOTAuOCw1MHogTTQ0Mi4zLDkyLjNMNDE5LjYsMTE1YzEyLDEzLjksMjIuMywyOS40LDMwLjUsNDYuMSBsMjkuOC0xMS45QzQ3MCwxMjguNSw0NTcuMywxMDkuNCw0NDIuMyw5Mi4zeiBNMzk3LDkyLjRsMjIuNy0yMi43Yy0xNS42LTEzLjctMzIuOC0yNS41LTUxLjUtMzQuOWwtMTIuNiwyOS41IEMzNzAuNCw3Mi4xLDM4NC40LDgxLjUsMzk3LDkyLjR6IgogICAgICAgICAgICB9KQogICAgICAgICAgfSk7CiAgICAgICAgICB2YXIgT1BBQ0lUWV9BTklNQVRFID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIEFOSU1BVElPTl9CQVNFKSwge30sIHsKICAgICAgICAgICAgYXR0cmlidXRlTmFtZTogIm9wYWNpdHkiCiAgICAgICAgICB9KTsKICAgICAgICAgIHZhciBkb3QgPSB7CiAgICAgICAgICAgIHRhZzogImNpcmNsZSIsCiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBGSUxMKSwge30sIHsKICAgICAgICAgICAgICBjeDogIjI1NiIsCiAgICAgICAgICAgICAgY3k6ICIzNjQiLAogICAgICAgICAgICAgIHI6ICIyOCIKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIGNoaWxkcmVuOiBbXQogICAgICAgICAgfTsKICAgICAgICAgIGlmICghcmVkdWNlTW90aW9uKSB7CiAgICAgICAgICAgIGRvdC5jaGlsZHJlbi5wdXNoKHsKICAgICAgICAgICAgICB0YWc6ICJhbmltYXRlIiwKICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgQU5JTUFUSU9OX0JBU0UpLCB7fSwgewogICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZTogInIiLAogICAgICAgICAgICAgICAgdmFsdWVzOiAiMjg7MTQ7Mjg7Mjg7MTQ7Mjg7IgogICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICB0YWc6ICJhbmltYXRlIiwKICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgT1BBQ0lUWV9BTklNQVRFKSwge30sIHsKICAgICAgICAgICAgICAgIHZhbHVlczogIjE7MDsxOzE7MDsxOyIKICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGdDaGlsZHJlbi5wdXNoKGRvdCk7CiAgICAgICAgICBnQ2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgIHRhZzogInBhdGgiLAogICAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgRklMTCksIHt9LCB7CiAgICAgICAgICAgICAgb3BhY2l0eTogIjEiLAogICAgICAgICAgICAgIGQ6ICJNMjYzLjcsMzEyaC0xNmMtNi42LDAtMTItNS40LTEyLTEyYzAtNzEsNzcuNC02My45LDc3LjQtMTA3LjhjMC0yMC0xNy44LTQwLjItNTcuNC00MC4yYy0yOS4xLDAtNDQuMyw5LjYtNTkuMiwyOC43IGMtMy45LDUtMTEuMSw2LTE2LjIsMi40bC0xMy4xLTkuMmMtNS42LTMuOS02LjktMTEuOC0yLjYtMTcuMmMyMS4yLTI3LjIsNDYuNC00NC43LDkxLjItNDQuN2M1Mi4zLDAsOTcuNCwyOS44LDk3LjQsODAuMiBjMCw2Ny42LTc3LjQsNjMuNS03Ny40LDEwNy44QzI3NS43LDMwNi42LDI3MC4zLDMxMiwyNjMuNywzMTJ6IgogICAgICAgICAgICB9KSwKICAgICAgICAgICAgY2hpbGRyZW46IHJlZHVjZU1vdGlvbiA/IFtdIDogW3sKICAgICAgICAgICAgICB0YWc6ICJhbmltYXRlIiwKICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgT1BBQ0lUWV9BTklNQVRFKSwge30sIHsKICAgICAgICAgICAgICAgIHZhbHVlczogIjE7MDswOzA7MDsxOyIKICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9XQogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoIXJlZHVjZU1vdGlvbikgewogICAgICAgICAgICBnQ2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgICAgdGFnOiAicGF0aCIsCiAgICAgICAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIEZJTEwpLCB7fSwgewogICAgICAgICAgICAgICAgb3BhY2l0eTogIjAiLAogICAgICAgICAgICAgICAgZDogIk0yMzIuNSwxMzQuNWw3LDE2OGMwLjMsNi40LDUuNiwxMS41LDEyLDExLjVoOWM2LjQsMCwxMS43LTUuMSwxMi0xMS41bDctMTY4YzAuMy02LjgtNS4yLTEyLjUtMTItMTIuNWgtMjMgQzIzNy43LDEyMiwyMzIuMiwxMjcuNywyMzIuNSwxMzQuNXoiCiAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgY2hpbGRyZW46IFt7CiAgICAgICAgICAgICAgICB0YWc6ICJhbmltYXRlIiwKICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBPUEFDSVRZX0FOSU1BVEUpLCB7fSwgewogICAgICAgICAgICAgICAgICB2YWx1ZXM6ICIwOzA7MTsxOzA7MDsiCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgIH1dCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdGFnOiAiZyIsCiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgICAgICBjbGFzczogIm1pc3NpbmciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNoaWxkcmVuOiBnQ2hpbGRyZW4KICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIFN2Z1N5bWJvbHMgPSB7CiAgICAgIGhvb2tzOiBmdW5jdGlvbiBob29rczcoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHBhcnNlTm9kZUF0dHJpYnV0ZXM6IGZ1bmN0aW9uIHBhcnNlTm9kZUF0dHJpYnV0ZXMoYWNjdW11bGF0b3IsIG5vZGUyKSB7CiAgICAgICAgICAgIHZhciBzeW1ib2xEYXRhID0gbm9kZTIuZ2V0QXR0cmlidXRlKCJkYXRhLWZhLXN5bWJvbCIpOwogICAgICAgICAgICB2YXIgc3ltYm9sID0gc3ltYm9sRGF0YSA9PT0gbnVsbCA/IGZhbHNlIDogc3ltYm9sRGF0YSA9PT0gIiIgPyB0cnVlIDogc3ltYm9sRGF0YTsKICAgICAgICAgICAgYWNjdW11bGF0b3JbInN5bWJvbCJdID0gc3ltYm9sOwogICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIHBsdWdpbnMgPSBbSW5qZWN0Q1NTLCBSZXBsYWNlRWxlbWVudHMsIExheWVycywgTGF5ZXJzQ291bnRlciwgTGF5ZXJzVGV4dCwgUHNldWRvRWxlbWVudHMsIE11dGF0aW9uT2JzZXJ2ZXIkMSwgUG93ZXJUcmFuc2Zvcm1zLCBNYXNrcywgTWlzc2luZ0ljb25JbmRpY2F0b3IsIFN2Z1N5bWJvbHNdOwogICAgcmVnaXN0ZXJQbHVnaW5zKHBsdWdpbnMsIHsKICAgICAgbWl4b3V0c1RvOiBhcGkKICAgIH0pOwogICAgbm9BdXRvJDEgPSBhcGkubm9BdXRvOwogICAgY29uZmlnJDEgPSBhcGkuY29uZmlnOwogICAgbGlicmFyeSQxID0gYXBpLmxpYnJhcnk7CiAgICBkb20kMSA9IGFwaS5kb207CiAgICBwYXJzZSQxID0gYXBpLnBhcnNlOwogICAgZmluZEljb25EZWZpbml0aW9uJDEgPSBhcGkuZmluZEljb25EZWZpbml0aW9uOwogICAgdG9IdG1sJDEgPSBhcGkudG9IdG1sOwogICAgaWNvbjIgPSBhcGkuaWNvbjsKICAgIGxheWVyID0gYXBpLmxheWVyOwogICAgdGV4dDggPSBhcGkudGV4dDsKICAgIGNvdW50ZXIgPSBhcGkuY291bnRlcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0Bmb3J0YXdlc29tZStmcmVlLWJyYW5kcy1zdmctaWNvbnNANy4xLjAvbm9kZV9tb2R1bGVzL0Bmb3J0YXdlc29tZS9mcmVlLWJyYW5kcy1zdmctaWNvbnMvaW5kZXgubWpzCnZhciBwcmVmaXgsIGZhU3F1YXJlR2l0aHViLCBmYUdpdGh1YlNxdWFyZSwgZmFUaGlua1BlYWtzLCBmYUdvb2dsZURyaXZlLCBmYUF1dG9wcmVmaXhlciwgZmFTcXVhcmVWaWFkZW8sIGZhVmlhZGVvU3F1YXJlLCBmYUNwYW5lbCwgZmFNZW5kZWxleSwgZmFEcmFmdDJkaWdpdGFsLCBmYVJlcGx5ZCwgZmFFbXBpcmUsIGZhQWNjZXNzaWJsZUljb24sIGZhUXVvcmEsIGZhQ2NKY2IsIGZhRmVkb3JhLCBmYUR1b2xpbmdvLCBmYUZpcnN0ZHJhZnQsIGZhRnJlZWJzZCwgZmFPZHlzZWUsIGZhR2dDaXJjbGUsIGZhQ2xvdWRmbGFyZSwgZmFIYWNrZXJyYW5rLCBmYVNreWF0bGFzLCBmYURlc2twcm8sIGZhUmVzb2x2aW5nLCBmYUJsYWNrYmVycnksIGZhU3RyaXBlUywgZmFTcXVhcmVCZWhhbmNlLCBmYUJlaGFuY2VTcXVhcmUsIGZhU2VydmljZXN0YWNrLCBmYVJvY2tldGNoYXQsIGZhUmViZWwsIGZhU3F1YXJlV2ViQXdlc29tZSwgZmFMaW5rdHJlZSwgZmFTaW1wbHlidWlsdCwgZmFTdHViYmVyLCBmYUFwcGVyLCBmYUdvb2dsZVNjaG9sYXIsIGZhWWFybiwgZmFTdGFja092ZXJmbG93LCBmYUJsdWV0b290aCwgZmFDcmVhdGl2ZUNvbW1vbnNOY0pwLCBmYVJlZGRpdCwgZmFDb25uZWN0ZGV2ZWxvcCwgZmFSZXNlYXJjaGdhdGUsIGZhU2lnbmFsTWVzc2VuZ2VyLCBmYVhpbmcsIGZhU3F1YXJlSnMsIGZhSnNTcXVhcmUsIGZhRm9udGljb25zLCBmYVVwcywgZmFBbWF6b25QYXksIGZhUGFuZG9yYSwgZmFPcGVuaWQsIGZhVnNjbywgZmFVYnVudHUsIGZhVmlhY29pbiwgZmFaaGlodSwgZmFZYW5kZXgsIGZhUGl4aXYsIGZhT3BlbmFpLCBmYVNpdGgsIGZhTmZjRGlyZWN0aW9uYWwsIGZhQ3JlYXRpdmVDb21tb25zQnksIGZhVW1icmFjbywgZmFIb29saSwgZmFTcXVhcmVHaXQsIGZhR2l0U3F1YXJlLCBmYU9kbm9rbGFzc25pa2ksIGZhRHJ1cGFsLCBmYUJsb2dnZXJCLCBmYUludmlzaW9uLCBmYUZhY2Vib29rRiwgZmFDZW50b3MsIGZhQ2NBbWF6b25QYXksIGZhRWJheSwgZmFDb250YW8sIGZhRWxsbywgZmFTaXN0cml4LCBmYVBlcmlzY29wZSwgZmFFeHBlZGl0ZWRzc2wsIGZhTmFwc3RlciwgZmFEZWxpY2lvdXMsIGZhR3VpbGRlZCwgZmFYYm94LCBmYVVudGFwcGQsIGZhR29vZ2xlUGx1c0csIGZhR2l0aHViQWx0LCBmYUdldFBvY2tldCwgZmFHbGlkZSwgZmFCaXR5LCBmYVdwZXhwbG9yZXIsIGZhTWVnYXBvcnQsIGZhTWRiLCBmYVBhZ2U0LCBmYVRoZVJlZFlldGksIGZhSmlyYSwgZmFGZWRleCwgZmFFdmVybm90ZSwgZmFVc2IsIGZhQW5ncnljcmVhdGl2ZSwgZmFNaXp1bmksIGZhSXRjaElvLCBmYVdpbmRvd3MsIGZhU3R1bWJsZXVwb24sIGZhR29vZ2xlLCBmYURpc2NvcmQsIGZhSGFja2VyTmV3cywgZmFFbGV2ZW50eSwgZmExMXR5LCBmYVRlYW1zcGVhaywgZmFTdXBwbGUsIGZhU3F1YXJlVHdpdHRlciwgZmFUd2l0dGVyU3F1YXJlLCBmYUZvbnRBd2Vzb21lLCBmYUZvbnRBd2Vzb21lRmxhZywgZmFGb250QXdlc29tZUxvZ29GdWxsLCBmYVdpcnNpbmRoYW5kd2VyaywgZmFXc2gsIGZhQ29uZmx1ZW5jZSwgZmFEaWdnLCBmYVRocmVhZHMsIGZhV3ByZXNzciwgZmFSZW5kYWN0LCBmYVlvYXN0LCBmYU5pbWJsciwgZmFQaXhlbGZlZCwgZmFZYWhvbywgZmFCbHVlc2t5LCBmYVNjcmliZCwgZmFDcmVhdGl2ZUNvbW1vbnNQZCwgZmFFYXJseWJpcmRzLCBmYVNxdWFyZU9kbm9rbGFzc25pa2ksIGZhT2Rub2tsYXNzbmlraVNxdWFyZSwgZmFNYXJrZG93biwgZmFUeXBvMywgZmFKb29tbGEsIGZhV2VpeGluLCBmYUdydW50LCBmYVJvY2tybXMsIGZhVW5zcGxhc2gsIGZhU3F1YXJlSW5zdGFncmFtLCBmYUluc3RhZ3JhbVNxdWFyZSwgZmFGaXJzdE9yZGVyQWx0LCBmYUZ1bGNydW0sIGZhQnJhdmVSZXZlcnNlLCBmYUF2aWFuZXgsIGZhTnM4LCBmYVNxdWFyZVBpbnRlcmVzdCwgZmFQaW50ZXJlc3RTcXVhcmUsIGZhQmx1ZXRvb3RoQiwgZmFHcmlwZmlyZSwgZmFTcXVhcmVHb29nbGVQbHVzLCBmYUdvb2dsZVBsdXNTcXVhcmUsIGZhQXBwU3RvcmUsIGZhV2l4LCBmYUludGVyY29tLCBmYVJlYWN0ZXVyb3BlLCBmYVdhemUsIGZhQ3JlYXRpdmVDb21tb25zUmVtaXgsIGZhQmFuZGNhbXAsIGZhU3F1YXJlV2ViQXdlc29tZVN0cm9rZSwgZmFWaW1lb1YsIGZhU3RyYXZhLCBmYVVuaXJlZ2lzdHJ5LCBmYUNjRGluZXJzQ2x1YiwgZmFQaW50ZXJlc3QsIGZhQWxnb2xpYSwgZmFTdGFja3BhdGgsIGZhT2N0b3B1c0RlcGxveSwgZmFZYW1tZXIsIGZhTW9keCwgZmFTcXVhcmVUaHJlYWRzLCBmYU9sZFJlcHVibGljLCBmYVN1c2UsIGZhQXBwU3RvcmVJb3MsIGZhU3F1YXJlRHJpYmJibGUsIGZhRHJpYmJibGVTcXVhcmUsIGZhVWlraXQsIGZhU3VwZXJwb3dlcnMsIGZhWW91dHViZSwgZmFFbWJlciwgZmFCb290c3RyYXAsIGZhSXR1bmVzLCBmYVNxdWFyZVhpbmcsIGZhWGluZ1NxdWFyZSwgZmFDc3MzQWx0LCBmYVNxdWFyZXNwYWNlLCBmYVRyZWxsbywgZmFWaWFkZW8sIGZhU2VhcmNoZW5naW4sIGZhUGF5cGFsLCBmYVNxdWFyZUJsdWVza3ksIGZhREFuZERCZXlvbmQsIGZhTWljcm9zb2Z0LCBmYUZseSwgZmFDY1N0cmlwZSwgZmFXb3JkcHJlc3NTaW1wbGUsIGZhU2VsbHN5LCBmYURhc2hjdWJlLCBmYUdpdHRlciwgZmFXb2xmUGFja0JhdHRhbGlvbiwgZmFMYXN0Zm0sIGZhU2hvcHdhcmUsIGZhQmxvZ2dlciwgZmFFZGdlLCBmYUlveGhvc3QsIGZhU2NobGl4LCBmYURBbmRELCBmYVZ1ZWpzLCBmYU1ldGEsIGZhQ3JlYXRpdmVDb21tb25zU2hhcmUsIGZhU3R1ZGlvdmluYXJpLCBmYUJpdGJ1Y2tldCwgZmFWaywgZmFHaXRodWIsIGZhQ29kaWVwaWUsIGZhUGllZFBpcGVyLCBmYVJhc3BiZXJyeVBpLCBmYUNzczMsIGZhSHVic3BvdCwgZmFDbXBsaWQsIGZhRHlhbG9nLCBmYUVsZW1lbnRvciwgZmFGaXJzdE9yZGVyLCBmYURyaWJiYmxlLCBmYUxpbmtlZGluLCBmYUNjUGF5cGFsLCBmYURobCwgZmFUZXgsIGZhU2hvcGlmeSwgZmFTcXVhcmVSZWRkaXQsIGZhUmVkZGl0U3F1YXJlLCBmYUNyZWF0aXZlQ29tbW9uc05jLCBmYUdhbGFjdGljUmVwdWJsaWMsIGZhRmFjZWJvb2ssIGZhR2l0bGFiLCBmYVFxLCBmYVN0cmlwZSwgZmFEYWlseW1vdGlvbiwgZmFTdGVhbSwgZmFTbmFwY2hhdCwgZmFTbmFwY2hhdEdob3N0LCBmYUdhbGFjdGljU2VuYXRlLCBmYVBob2VuaXhGcmFtZXdvcmssIGZhR2l0LCBmYU9wdGluTW9uc3RlciwgZmFKZW5raW5zLCBmYVNsaWRlc2hhcmUsIGZhVWJlciwgZmFEaWdpdGFsT2NlYW4sIGZhU291bmRjbG91ZCwgZmFTcXVhcmVGaWdtYSwgZmFDcmVhdGl2ZUNvbW1vbnNTYSwgZmFDaHJvbWUsIGZhVHJhZGVGZWRlcmF0aW9uLCBmYVZhYWRpbiwgZmFEZXZpYW50YXJ0LCBmYU1lZGl1bSwgZmFNZWRpdW1NLCBmYU9wZW5jYXJ0LCBmYVlDb21iaW5hdG9yLCBmYUxpbmUsIGZhQW1pbGlhLCBmYUFzeW1tZXRyaWssIGZhUGhhYnJpY2F0b3IsIGZhQm90cywgZmFWaW5lLCBmYU1lZHJ0LCBmYU9zaSwgZmFHZywgZmFCdXlzZWxsYWRzLCBmYUdvb2dsZVBsdXMsIGZhU2NyZWVucGFsLCBmYUJpdGNvaW4sIGZhU3dpZnQsIGZhRmlsZXNQaW53aGVlbCwgZmFMYXJhdmVsLCBmYVdwZm9ybXMsIGZhU3BlYWtlckRlY2ssIGZhRmxpY2tyLCBmYUNjVmlzYSwgZmFVcHdvcmssIGZhS2FrYW9UYWxrLCBmYUZsdXR0ZXIsIGZhQnVmZmVyLCBmYUdyYXRpcGF5LCBmYUdvb2dsZVBheSwgZmFBcHBsZSwgZmFUdW1ibHIsIGZhUGhvZW5peFNxdWFkcm9uLCBmYUNlbnRlcmNvZGUsIGZhRGViaWFuLCBmYU1hc3RvZG9uLCBmYVNrZXRjaCwgZmFXZWJBd2Vzb21lLCBmYVNhc3MsIGZhU3F1YXJlV2hhdHNhcHAsIGZhV2hhdHNhcHBTcXVhcmUsIGZhU2t5cGUsIGZhQW5ndWxhciwgZmFPcGVuc3VzZSwgZmFEcm9wYm94LCBmYURlZXplciwgZmFDcmVhdGl2ZUNvbW1vbnNTYW1wbGluZywgZmFKZWRpT3JkZXIsIGZhUlByb2plY3QsIGZhSW5zdGFsb2QsIGZhQ2FuYWRpYW5NYXBsZUxlYWYsIGZhRXRoZXJldW0sIGZhSG91enosIGZhVmliZXIsIGZhS2lja3N0YXJ0ZXIsIGZhU3F1YXJlS2lja3N0YXJ0ZXIsIGZhU3BvdGlmeSwgZmFMZWFucHViLCBmYUphdmEsIGZhTmZjU3ltYm9sLCBmYVdvZHUsIGZhU3F1YXJlU3RlYW0sIGZhU3RlYW1TcXVhcmUsIGZhQ3JlYXRpdmVDb21tb25zTmNFdSwgZmFOcG0sIGZhQ2xvdWRzY2FsZSwgZmFUaGVtZWNvLCBmYUdvb2dsZVBsYXksIGZhS29ydnVlLCBmYVczYywgZmFHcmF2LCBmYUF3cywgZmFHbGlkZUcsIGZhSnNmaWRkbGUsIGZhS2V5YmFzZSwgZmFMdW1vbkRyb3AsIGZhV2VlYmx5LCBmYURvY2tlciwgZmFNYWdlbnRvLCBmYUdpdEFsdCwgZmFGaXJlZm94QnJvd3NlciwgZmFDbG91ZHNtaXRoLCBmYVdpemFyZHNPZlRoZUNvYXN0LCBmYUNyZWF0aXZlQ29tbW9uc05kLCBmYVVzcHMsIGZhU3F1YXJlTGV0dGVyYm94ZCwgZmFNYW5kYWxvcmlhbiwgZmFTbGFjaywgZmFTbGFja0hhc2gsIGZhQW5nZWxsaXN0LCBmYUFuZHJvaWQsIGZhTWVldHVwLCBmYUZvbnRpY29uc0ZpLCBmYVBhbGZlZCwgZmFXcGJlZ2lubmVyLCBmYURpYXNwb3JhLCBmYVByb2R1Y3RIdW50LCBmYVNxdWFyZVVwd29yaywgZmFDdXR0bGVmaXNoLCBmYU1lZGFwcHMsIGZhUGl4LCBmYVNxdWFyZVR1bWJsciwgZmFUdW1ibHJTcXVhcmUsIGZhUmVhY3QsIGZhSnhsLCBmYVNxdWFyZUxpbmtlZGluLCBmYUNzcywgZmFIYXNobm9kZSwgZmFSZWRkaXRBbGllbiwgZmFUaWt0b2ssIGZhV29yZHByZXNzLCBmYUlkZWFsLCBmYVBpZWRQaXBlclBwLCBmYVVzc3VubmFoLCBmYUZvcnRBd2Vzb21lQWx0LCBmYUJ1cm9tb2JlbGV4cGVydGUsIGZhQmlsaWJpbGksIGZhTmVvcywgZmFEZXYsIGZhSG90amFyLCBmYURvY2h1YiwgZmFWaW1lbywgZmFNYXhjZG4sIGZhU3F1YXJlRm9udEF3ZXNvbWVTdHJva2UsIGZhRm9udEF3ZXNvbWVBbHQsIGZhU3BlYWthcCwgZmFGYW50YXN5RmxpZ2h0R2FtZXMsIGZhTGludXgsIGZhQ290dG9uQnVyZWF1LCBmYUdvb2dsZVdhbGxldCwgZmFGb3Vyc3F1YXJlLCBmYVNoaXJ0c2luYnVsaywgZmFNaW50Yml0LCBmYVN0YXlsaW5rZWQsIGZhV2ViZmxvdywgZmFSZW5yZW4sIGZhUmV2LCBmYUtleWNkbiwgZmFIaXJlQUhlbHBlciwgZmFTcXVhcmVIYWNrZXJOZXdzLCBmYUhhY2tlck5ld3NTcXVhcmUsIGZhQ3JlYXRpdmVDb21tb25zUGRBbHQsIGZhT3JjaWQsIGZhQmVoYW5jZSwgZmFNb25lcm8sIGZhRmlnbWEsIGZhSW5zdGFncmFtLCBmYVBlcmJ5dGUsIGZhU3F1YXJlVmltZW8sIGZhVmltZW9TcXVhcmUsIGZhUHVzaGVkLCBmYU1peGNsb3VkLCBmYVlhbmRleEludGVybmF0aW9uYWwsIGZhSGl2ZSwgZmFDcmVhdGl2ZUNvbW1vbnNaZXJvLCBmYVNxdWFyZVNuYXBjaGF0LCBmYVNuYXBjaGF0U3F1YXJlLCBmYVRoZW1laXNsZSwgZmFEYXJ0TGFuZywgZmFEZXBsb3lkb2csIGZhRmxpcGJvYXJkLCBmYUJ1eU5MYXJnZSwgZmFXYXRjaG1hbk1vbml0b3JpbmcsIGZhSGlwcywgZmFDbG91ZHZlcnNpZnksIGZhR29vZHJlYWRzLCBmYVRpZGFsLCBmYVVuaXR5LCBmYVRlbmNlbnRXZWlibywgZmFGcmVlQ29kZUNhbXAsIGZhWFR3aXR0ZXIsIGZhU3RpY2tlck11bGUsIGZhVHdpdGNoLCBmYUtpY2tzdGFydGVySywgZmFDcml0aWNhbFJvbGUsIGZhU3RlYW1TeW1ib2wsIGZhTWFpbGNoaW1wLCBmYUx1bW9uLCBmYU51dHJpdGlvbml4LCBmYUNyZWF0aXZlQ29tbW9uc1NhbXBsaW5nUGx1cywgZmFSZWRoYXQsIGZhU3F1YXJlUGllZFBpcGVyLCBmYVBpZWRQaXBlclNxdWFyZSwgZmFXaGF0c2FwcCwgZmFJbWRiLCBmYVB5dGhvbiwgZmFDYXNoQXBwLCBmYVBpbnRlcmVzdFAsIGZhV2htY3MsIGZhSm9nZXQsIGZhU3F1YXJlWW91dHViZSwgZmFZb3V0dWJlU3F1YXJlLCBmYUF0bGFzc2lhbiwgZmFQaWVkUGlwZXJIYXQsIGZhSW50ZXJuZXRFeHBsb3JlciwgZmFBaXJibmIsIGZhSnMsIGZhUXVpbnNjYXBlLCBmYUFkdmVyc2FsLCBmYUNyZWF0aXZlQ29tbW9ucywgZmFOb3Rpb24sIGZhQ2hyb21lY2FzdCwgZmFXaWtpcGVkaWFXLCBmYVNpdHJveCwgZmFTcXVhcmVHaXRsYWIsIGZhR2l0bGFiU3F1YXJlLCBmYVNob2VsYWNlLCBmYVNlbGxjYXN0LCBmYU1peCwgZmFDY0FwcGxlUGF5LCBmYUJyYXZlLCBmYUV0c3ksIGZhQnRjLCBmYUFkbiwgZmFTcXVhcmVYVHdpdHRlciwgZmFTcXVhcmVGb250QXdlc29tZSwgZmFGb3J1bWJlZSwgZmE0Mkdyb3VwLCBmYUlubm9zb2Z0LCBmYVN0dW1ibGV1cG9uQ2lyY2xlLCBmYVN5bWZvbnksIGZhU2FsZXNmb3JjZSwgZmFTb3VyY2V0cmVlLCBmYUxpbmtlZGluSW4sIGZhSHRtbDUsIGZhUnVzdCwgZmFIb3JuYmlsbCwgZmFQaHAsIGZhRGlzcXVzLCBmYTUwMHB4LCBmYUFmZmlsaWF0ZXRoZW1lLCBmYVJlZFJpdmVyLCBmYVR3aXR0ZXIsIGZhRm9ydEF3ZXNvbWUsIGZhTWl4ZXIsIGZhTHlmdCwgZmFBcHBsZVBheSwgZmFBcnRzdGF0aW9uLCBmYU5vZGVKcywgZmFVbmNoYXJ0ZWQsIGZhUGxheXN0YXRpb24sIGZhTWljcm9ibG9nLCBmYUdpdGtyYWtlbiwgZmFUZWxlZ3JhbSwgZmFUZWxlZ3JhbVBsYW5lLCBmYUl0dW5lc05vdGUsIGZhTGVzcywgZmFGaXJlZm94LCBmYUthZ2dsZSwgZmFGYWNlYm9va01lc3NlbmdlciwgZmFBdWRpYmxlLCBmYVBhdHJlb24sIGZhVm52LCBmYVBhZ2VsaW5lcywgZmFBbWF6b24sIGZhRW52aXJhLCBmYUxpbm9kZSwgZmFBY2N1c29mdCwgZmFFcmxhbmcsIGZhQ2NEaXNjb3ZlciwgZmFTYWZhcmksIGZhU3BhY2VBd2Vzb21lLCBmYU5vZGUsIGZhQ29kZXBlbiwgZmFSYXZlbHJ5LCBmYUFsaXBheSwgZmFDY0FtZXgsIGZhUGllZFBpcGVyQWx0LCBmYUxldHRlcmJveGQsIGZhT3BlcmEsIGZhV2VpYm8sIGZhUmVhZG1lLCBmYUdvbGFuZywgZmFTdGFja0V4Y2hhbmdlLCBmYUd1bHAsIGZhWWVscCwgZmFHb2ZvcmUsIGZhQXZpYXRvLCBmYVBhZGxldCwgZmFFZGdlTGVnYWN5LCBmYVNxdWFyZUxhc3RmbSwgZmFMYXN0Zm1TcXVhcmUsIGZhR29vZHJlYWRzRywgZmFDY01hc3RlcmNhcmQsIGZhRGlzY291cnNlLCBmYUJsYWNrVGllLCBmYVNxdWFyZUZhY2Vib29rLCBmYUZhY2Vib29rU3F1YXJlLCBmYUJhdHRsZU5ldCwgZmFCaW1vYmplY3QsIGljb25zOwp2YXIgaW5pdF9mcmVlX2JyYW5kc19zdmdfaWNvbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZm9ydGF3ZXNvbWUrZnJlZS1icmFuZHMtc3ZnLWljb25zQDcuMS4wL25vZGVfbW9kdWxlcy9AZm9ydGF3ZXNvbWUvZnJlZS1icmFuZHMtc3ZnLWljb25zL2luZGV4Lm1qcyIoKSB7CiAgICBwcmVmaXggPSAiZmFiIjsKICAgIGZhU3F1YXJlR2l0aHViID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1naXRodWIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiZ2l0aHViLXNxdWFyZSJdLCAiZjA5MiIsICJNNDQ4IDk2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjB6TTI2NS44IDQwNy43YzAtMS44IDAtNiAuMS0xMS42IC4xLTExLjQgLjEtMjguOCAuMS00My43IDAtMTUuNi01LjItMjUuNS0xMS4zLTMwLjcgMzctNC4xIDc2LTkuMiA3Ni03My4xIDAtMTguMi02LjUtMjcuMy0xNy4xLTM5IDEuNy00LjMgNy40LTIyLTEuNy00NS0xMy45LTQuMy00NS43IDE3LjktNDUuNyAxNy45LTI2LjYtNy41LTU2LjYtNy41LTgzLjIgMCAwIDAtMzEuOC0yMi4yLTQ1LjctMTcuOS05LjEgMjIuOS0zLjUgNDAuNi0xLjcgNDUtMTAuNiAxMS43LTE1LjYgMjAuOC0xNS42IDM5IDAgNjMuNiAzNy4zIDY5IDc0LjMgNzMuMS00LjggNC4zLTkuMSAxMS43LTEwLjYgMjIuMy05LjUgNC4zLTMzLjggMTEuNy00OC4zLTEzLjktOS4xLTE1LjgtMjUuNS0xNy4xLTI1LjUtMTcuMS0xNi4yLS4yLTEuMSAxMC4yLTEuMSAxMC4yIDEwLjggNSAxOC40IDI0LjIgMTguNCAyNC4yIDkuNyAyOS43IDU2LjEgMTkuNyA1Ni4xIDE5LjcgMCA5IC4xIDIxLjcgLjEgMzAuNiAwIDQuOCAuMSA4LjYgLjEgMTAgMCA0LjMtMyA5LjUtMTEuNSA4LTY2LTIyLjEtMTEyLjItODQuOS0xMTIuMi0xNTguMyAwLTkxLjggNzAuMi0xNjEuNSAxNjItMTYxLjVTMzg4IDE2NS42IDM4OCAyNTcuNGMuMSA3My40LTQ0LjcgMTM2LjMtMTEwLjcgMTU4LjMtOC40IDEuNS0xMS41LTMuNy0xMS41LTh6bS05MC41LTU0LjhjLS4yLTEuNSAxLjEtMi44IDMtMy4yIDEuOS0uMiAzLjcgLjYgMy45IDEuOSAuMyAxLjMtMSAyLjYtMyAzLTEuOSAuNC0zLjctLjQtMy45LTEuN3ptLTkuMSAzLjJjLTIuMiAuMi0zLjctLjktMy43LTIuNCAwLTEuMyAxLjUtMi40IDMuNS0yLjQgMS45LS4yIDMuNyAuOSAzLjcgMi40IDAgMS4zLTEuNSAyLjQtMy41IDIuNHptLTE0LjMtMi4yYy0xLjktLjQtMy4yLTEuOS0yLjgtMy4yczIuNC0xLjkgNC4xLTEuNWMyIC42IDMuMyAyLjEgMi44IDMuNC0uNCAxLjMtMi40IDEuOS00LjEgMS4zem0tMTIuNS03LjNjLTEuNS0xLjMtMS45LTMuMi0uOS00LjEgLjktMS4xIDIuOC0uOSA0LjMgLjYgMS4zIDEuMyAxLjggMy4zIC45IDQuMS0uOSAxLjEtMi44IC45LTQuMy0uNnptLTguNS0xMGMtMS4xLTEuNS0xLjEtMy4yIDAtMy45IDEuMS0uOSAyLjgtLjIgMy43IDEuMyAxLjEgMS41IDEuMSAzLjMgMCA0LjEtLjkgLjYtMi42IDAtMy43LTEuNXptLTYuMy04LjhjLTEuMS0xLjMtMS4zLTIuOC0uNC0zLjUgLjktLjkgMi40LS40IDMuNSAuNiAxLjEgMS4zIDEuMyAyLjggLjQgMy41LS45IC45LTIuNCAuNC0zLjUtLjZ6bS02LTYuNGMtMS4zLS42LTEuOS0xLjctMS41LTIuNiAuNC0uNiAxLjUtLjkgMi44LS40IDEuMyAuNyAxLjkgMS44IDEuNSAyLjYtLjQgLjktMS43IDEuMS0yLjggLjR6Il0KICAgIH07CiAgICBmYUdpdGh1YlNxdWFyZSA9IGZhU3F1YXJlR2l0aHViOwogICAgZmFUaGlua1BlYWtzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInRoaW5rLXBlYWtzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY3MzEiLCAiTTQ2NS40IDQwOS40bDg3LjEtMTUwLjItMzItLjMtNTUuMSA5NS0yMDYuMi0zNTMuOS0yMzYuMiA0MDcuNCAzMiAuMyAyMDQuMi0zNTIuMSAyMDYuMiAzNTMuOHpNMTEwLjEgMzY1LjNsMzIuMSAwIDExNy40LTIwMi41IDIwMy40IDM0OS4xIDMyLjUgLjEtMjM1LjgtNDA0LjYtMTQ5LjYgMjU3Ljl6Il0KICAgIH07CiAgICBmYUdvb2dsZURyaXZlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdvb2dsZS1kcml2ZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmM2FhIiwgIk0zMzkgMzE0LjlMMTc1LjQgMzIgMzM2LjYgMzIgNTAwLjIgMzE0LjkgMzM5IDMxNC45ek0yMDEuNSAzMzguNWwtODAuNiAxNDEuNSAzMTAuNSAwIDgwLjYtMTQxLjUtMzEwLjUgMHpNMTU0LjEgNjcuNEwwIDMzOC41IDgwLjYgNDgwIDIzNyAyMDguOCAxNTQuMSA2Ny40eiJdCiAgICB9OwogICAgZmFBdXRvcHJlZml4ZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYXV0b3ByZWZpeGVyIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY0MWMiLCAiTTMxOC40IDE2bC0xNjEgNDgwIDc3LjUgMCAyNS40LTgxLjQgMTE5LjUgMCAyNS4yIDgxLjQgNzcuNSAwLTE2NC4xLTQ4MHpNMjc4LjEgMzU3LjlsNDEuMi0xMzAuNCAxLjUgMCA0MC45IDEzMC40LTgzLjYgMHpNNjQwIDQwNUw2MzAgMzczLjYgNDYyLjEgMzU4IDQ4MS41IDQxNC41IDY0MCA0MDV6TTE3Ny45IDM1OEwxMCAzNzMuNyAwIDQwNSAxNTguNSA0MTQuNCAxNzcuOSAzNTh6Il0KICAgIH07CiAgICBmYVNxdWFyZVZpYWRlbyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtdmlhZGVvIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInZpYWRlby1zcXVhcmUiXSwgImYyYWEiLCAiTTQ0OCA5NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwek0xMTguMyAzODEuMmMtNjgtNzMuNi0xOS44LTE5Ni4xIDgxLjItMTk2LjEgMTMuMyAwIDI2LjYgMi4xIDM5LjEgNi43LTQuMyA4LjQtNy4zIDE3LjYtOC40IDI3LjEtOS43LTQuMS0yMC4yLTYtMzAuNy02LTQ4LjggMC04NC42IDQxLjctODQuNiA4OC45IDAgNDMgMjguNSA3OC43IDY5LjUgODUuOSA2MS41LTI0IDcyLjktMTE3LjYgNzIuOS0xNzUgMC03LjMgMC0xNC44LS42LTIyLjEtMTEuMi0zMi45LTI2LjYtNjQuNi00NC4yLTk0LjUgMjcuMSAxOC4zIDQxLjkgNjIuNSA0NC4yIDk0LjFsMCAuNGM3LjcgMjIuNSAxMS44IDQ2LjIgMTEuOCA3MCAwIDU0LjEtMjEuOSA5OS02OC4zIDEyOC4ybC0yLjQgLjJjNTAgMSA4Ni4yLTM4LjYgODYuMi04Ny4yIDAtMTIuMi0yLjEtMjQuMy02LjktMzUuNyA5LjUtMS45IDE4LjUtNS42IDI2LjQtMTAuNSAxNS4zIDM2LjYgMTIuNiA4Ny4zLTIyLjggMTI1LjYtNDIuNCA0Ni4yLTEyMCA0Ni42LTE2Mi40IDB6TTI3NC42IDIxNy42YzIxLjktMTIgNDkuNi0zMC43IDYyLjMtNTMgMS41LTMgNC4xLTguNiA0LjUtMTItMTIuNSAyNy45LTQ0LjIgNDkuOC03My45IDU2LjctNC43LTcuMy03LjUtMTUuNS03LjUtMjQuMyAwLTEwLjMgNS4yLTI0LjEgMTIuOS0zMS42IDguMy03LjkgMTgtMTAuOSAyNy45LTE0LjEgMTYtNS4xIDMyLjUtMTAuMyA0NC41LTM1LjkgMzIuNSA0Ni4yIDEzLjEgMTMwLjMtMzYuMyAxMzAuMy0xMy4zIDAtMjUuMS03LjEtMzQuNC0xNi4xeiJdCiAgICB9OwogICAgZmFWaWFkZW9TcXVhcmUgPSBmYVNxdWFyZVZpYWRlbzsKICAgIGZhQ3BhbmVsID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNwYW5lbCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmMzg4IiwgIk0yMTAuMyAyMjAuMmMtNS42LTI0LjgtMjYuOS00MS4yLTUxLTQxLjJsLTM3IDBjLTcuMSAwLTEyLjUgNC41LTE0LjMgMTAuOUw3My4xIDMyMCA5Ny44IDMxOS45YzYuOCAwIDEyLjMtNC41IDE0LjItMTAuN2wyNS44LTk1LjcgMTkuOCAwYzguNCAwIDE2LjIgNS42IDE4LjMgMTQuOCAyLjUgMTAuOS01LjkgMjIuNi0xOC4zIDIyLjZsLTEwLjMgMGMtNyAwLTEyLjUgNC42LTE0LjMgMTAuOGwtNi40IDIzLjggMzIgMGMzNy4yIDAgNTguMy0zNi4yIDUxLjctNjUuM3ptLTE1Ni41IDI4bDE4LjYgMGM2LjkgMCAxMi40LTQuNCAxNC4zLTEwLjlsNi4yLTIzLjYtNDAgMEMzMCAyMTMuNyA5IDIyNy44IDEuNyAyNTQuOC03IDI4OC42IDE4LjUgMzIwIDUyIDMyMGwxMi40IDAgNy4xLTI2LjFjMS4yLTQuNC0yLjItOC4zLTYuNC04LjNsLTExLjMgMGMtMjQuNyAwLTI0LjktMzcuNCAwLTM3LjR6bTI0Ny41LTM0LjhsLTc3LjkgMC0zLjUgMTMuNGMtMi40IDkuNiA0LjUgMTguNSAxNC4yIDE4LjVsNTcuNSAwYzQgMCAyLjQgNC4zIDIuMSA1LjNsLTguNiAzMS44Yy0uNCAxLjQtLjkgNS4zLTUuNSA1LjNsLTM0LjkgMGMtNS4zIDAtNS4zLTcuOSAwLTcuOWwyMS42IDBjNi44IDAgMTIuMy00LjYgMTQuMi0xMC44bDMuNS0xMy4yLTQ4LjQgMGMtMzkuMiAwLTQzLjYgNjMuOC0uNyA2My44bDU3LjUgLjJjMTEuMiAwIDIwLjYtNy4yIDIzLjQtMTcuOGwxNC01MS44YzQuOC0xOS4yLTkuNy0zNi44LTI4LjUtMzYuOHpNNjMzLjEgMTc5bC0xOC45IDBjLTQuOSAwLTkuMiAzLjItMTAuNCA3LjlMNTY4LjIgMzIwYzIwLjcgMCAzOS44LTEzLjggNDQuOS0zNC41bDI2LjUtOTguMmMxLjItNC4zLTItOC4zLTYuNS04LjN6TTM5Ni44IDIxMy43bDAgLjEtNDguMyAwLTI2LjIgOThjLTEuMiA0LjQgMi4yIDguMyA2LjQgOC4zbDE4LjkgMGM0LjggMCA5LjItMyAxMC40LTcuOGwxNy4yLTY0IDE5LjggMGMxMi41IDAgMjEuNCAxMS44IDE4LjEgMjMuNGwtMTAuNiA0MGMtMS4yIDQuMyAxLjkgOC4zIDYuNCA4LjNsMTkuMSAwYzQuNiAwIDkuMS0yLjkgMTAuMy03LjhsOC44LTMzLjFjOS0zMy4xLTE1LjktNjUuNC01MC4zLTY1LjR6bTk4LjMgNzQuNmMtMy42IDAtNi0zLjQtNS4xLTYuN2w4LTMwYy45LTMuOSAzLjctNiA3LjgtNmwzMi45IDBjMi42IDAgNC42IDIuNCAzLjkgNS4xbC0uNyAyLjZjLS42IDItMS45IDMtMy45IDNsLTIxLjYgMGMtNyAwLTEyLjYgNC42LTE0LjIgMTAuOGwtMy41IDEzIDUzLjQgMGMxMC41IDAgMjAuMy02LjYgMjMuMi0xNy42bDMuMi0xMmM0LjktMTkuMS05LjMtMzYuOC0yOC4zLTM2LjhsLTQ3LjMgMGMtMTcuOSAwLTMzLjggMTItMzguNiAyOS42bC0xMC44IDQwYy01IDE3LjcgOC4zIDM2LjcgMjguMyAzNi43bDY2LjcgMGM2LjggMCAxMi4zLTQuNSAxNC4yLTEwLjdsNS43LTIxLTczLjMgMHoiXQogICAgfTsKICAgIGZhTWVuZGVsZXkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibWVuZGVsZXkiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjdiMyIsICJNNjI0LjYgMzI1LjJjLTEyLjMtMTIuNC0yOS43LTE5LjItNDguNC0xNy4yLTQzLjMtMS00OS43LTM0LjktMzcuNS05OC44IDIyLjgtNTcuNS0xNC45LTEzMS41LTg3LjQtMTMwLjgtNzcuNCAuNy04MS43IDgyLTEzMC45IDgyLTQ4LjEgMC01NC04MS4zLTEzMC45LTgyLTcyLjktLjgtMTEwLjEgNzMuMy04Ny40IDEzMC44IDEyLjIgNjMuOSA1LjggOTcuOC0zNy41IDk4LjgtMjEuMi0yLjMtMzcgNi41LTUzIDIyLjUtMTkuOSAxOS43LTE5LjMgOTQuOCA0Mi42IDEwMi42IDQ3LjEgNS45IDgxLjYtNDIuOSA2MS4yLTg3LjgtNDcuMy0xMDMuNyAxODUuOS0xMDYuMSAxNDYuNS04LjItLjEgLjEtLjIgLjItLjMgLjQtMjYuOCA0Mi44IDYuOCA5Ny40IDU4LjggOTUuMiA1Mi4xIDIuMSA4NS40LTUyLjYgNTguOC05NS4yLS4xLS4yLS4yLS4zLS4zLS40LTM5LjQtOTcuOSAxOTMuOC05NS41IDE0Ni41IDguMi00LjYgMTAtNi43IDIxLjMtNS43IDMzIDQuOSA1My40IDY4LjcgNzQuMSAxMDQuOSAzNS4yIDE3LjgtMTQuOCAyMy4xLTY1LjYgMC04OC4zek0zMjAuNyAzMDYuMWwtLjYgMGMtNDMuNCAwLTYyLjgtMzcuNS02Mi44LTYyLjggMC0zNC43IDI4LjItNjIuOCA2Mi44LTYyLjhsLjYgMGMzNC43IDAgNjIuOCAyOC4xIDYyLjggNjIuOCAwIDI1LTE5LjIgNjIuOC02Mi44IDYyLjh6Il0KICAgIH07CiAgICBmYURyYWZ0MmRpZ2l0YWwgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZHJhZnQyZGlnaXRhbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMzk2IiwgIk00OTYgMzk4LjFsLTE0NC04Mi4yIDAgNjQuNy05MS4zIDBjMzAuOC0zNSA4MS44LTk1LjkgMTExLjgtMTQ5LjMgMzUuMi02Mi42IDE2LjEtMTIzLjQtMTIuOC0xNTMuMy00LjQtNC42LTYyLjItNjIuOS0xNjYtNDEuMi01OS4xIDEyLjQtODkuNCA0My40LTEwNC4zIDY3LjMtMTMuMSAyMC45LTE3IDM5LjgtMTguMiA0Ny43LTUuNSAzMyAxOS40IDY3LjEgNTYuNyA2Ny4xIDMxLjcgMCA1Ny4zLTI1LjcgNTcuMy01Ny40IDAtMjcuMS0xOS43LTUyLjEtNDgtNTYuOCAxLjgtNy4zIDE3LjctMjEuMSAyNi4zLTI0LjcgNDEuMS0xNy4zIDc4IDUuMiA4My4zIDMzLjUgOC4zIDQ0LjMtMzcuMSA5MC40LTY5LjcgMTI3LjYtNzYuNiA4Ny0xNDIuOCAxNTUuNy0xNjEuMSAxNzQuOGwzMzYtLjEgMCA2NC4yIDE0NC04MS45ek0zODUuOSAzNzFsNDcuMSAyNy4yLTQ3LjEgMjcuMiAwLTU0LjR6TTEwNS40IDE2MS40YTIyLjQgMjIuNCAwIDEgMSA0NC44IDAgMjIuNCAyMi40IDAgMSAxIC00NC44IDB6TTk4LjUgMzgwLjVjMjUuNi0yNy40IDk3LjctMTA0LjcgMTUwLjgtMTY5LjkgMzUuMS00My4xIDQwLjMtODIuNCAyOC40LTExMi43LTcuNC0xOC44LTE3LjUtMzAuMi0yNC4zLTM1LjcgNDUuMyAyLjEgNjggMjMuNCA4Mi4yIDM4LjMgMCAwIDQyLjQgNDguMiA1LjggMTEzLjMtMzcgNjUuOS0xMTAuOSAxNDcuNS0xMjguNSAxNjYuN2wtMTE0LjQgMHoiXQogICAgfTsKICAgIGZhUmVwbHlkID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInJlcGx5ZCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmM2U2IiwgIk0zMjAgNDgwbC0xOTIgMEM1Ny42IDQ4MCAwIDQyMi40IDAgMzUyTDAgMTYwQzAgODkuNiA1Ny42IDMyIDEyOCAzMmwxOTIgMGM3MC40IDAgMTI4IDU3LjYgMTI4IDEyOGwwIDE5MmMwIDcwLjQtNTcuNiAxMjgtMTI4IDEyOHpNMTkzLjQgMjczLjJjLTYuMS0yLTExLjYtMy4xLTE2LjQtMy4xLTcuMiAwLTEzLjUgMS45LTE4LjkgNS42cy05LjYgOS0xMi44IDE1LjhsLTEuMSAwLTQuMi0xOC4zLTI4IDAgMCAxMzguOSAzNi4xIDAgMC04OS43YzEuNS01LjQgNC40LTkuOCA4LjctMTMuMnM5LjgtNS4xIDE2LjItNS4xYzQuNiAwIDkuOCAxIDE1LjYgMy4xbDQuOC0zNHpNMzA4LjYgMzc2LjZjLTMuMiAyLjQtNy43IDQuOC0xMy43IDcuMXMtMTIuOCAzLjUtMjAuNCAzLjVjLTEyLjIgMC0yMS4xLTMtMjYuNS04LjktNS41LTUuOS04LjUtMTQuNy05LTI2LjRsODMuMyAwYy45LTQuOCAxLjYtOS40IDIuMS0xMy45IC41LTQuNCAuNy04LjYgLjctMTIuNSAwLTEwLjctMS42LTE5LjctNC43LTI2LjktMy4yLTcuMi03LjMtMTMtMTIuNS0xNy4yLTUuMi00LjMtMTEuMS03LjMtMTcuOC05LjItNi43LTEuOC0xMy41LTIuOC0yMC42LTIuOC0yMS4xIDAtMzcuNSA2LjEtNDkuMiAxOC4zcy0xNy41IDMwLjUtMTcuNSA1NWMwIDIyLjggNS4yIDQwLjcgMTUuNiA1My43IDEwLjQgMTMuMSAyNi44IDE5LjYgNDkuMiAxOS42IDEwLjcgMCAyMC45LTEuNSAzMC40LTQuNnMxNy4xLTYuOCAyMi42LTExLjJsLTEyLTIzLjZ6bS0yMS44LTcwLjNjMy44IDUuNCA1LjMgMTMuMSA0LjYgMjMuMWwtNTEuNyAwYy45LTkuNCAzLjctMTcgOC4yLTIyLjZzMTEuNS04LjUgMjEtOC41YzguMi0uMSAxNC4xIDIuNiAxNy45IDh6bTc5LjkgMi41YzQuMSAzLjkgOS40IDUuOCAxNi4xIDUuOCA3IDAgMTIuNi0xLjkgMTYuNy01LjhzNi4xLTkuMSA2LjEtMTUuNi0yLTExLjYtNi4xLTE1LjQtOS42LTUuNy0xNi43LTUuN2MtNi43IDAtMTIgMS45LTE2LjEgNS43cy02LjEgOC45LTYuMSAxNS40IDIgMTEuNyA2LjEgMTUuNnptMCAxMDAuNWM0LjEgMy45IDkuNCA1LjggMTYuMSA1LjggNyAwIDEyLjYtMS45IDE2LjctNS44czYuMS05LjEgNi4xLTE1LjYtMi0xMS42LTYuMS0xNS40LTkuNi01LjctMTYuNy01LjdjLTYuNyAwLTEyIDEuOS0xNi4xIDUuN3MtNi4xIDguOS02LjEgMTUuNGMwIDYuNiAyIDExLjcgNi4xIDE1LjZ6Il0KICAgIH07CiAgICBmYUVtcGlyZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJlbXBpcmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjFkMSIsICJNMjk1LjYgNTQuMmMtMTAuOC0yLjItMjIuMS0zLjMtMzMuNS0zLjZsMC0xOC4yYzc4LjEgMi4yIDE0Ni4xIDQ0IDE4NC42IDEwNi42bC0xNS44IDkuMWMtNi4xLTkuNy0xMi43LTE4LjgtMjAuMi0yNy4xbC0xOCAxNS41Yy0yNi0yOS42LTYxLjQtNTAuNy0xMDEuOS01OC40bDQuOC0yMy45ek02MS40IDMyMi40bDIzLTcuN2MtNi40LTE4LjMtMTAtMzguMi0xMC01OC43czMuMy00MC40IDkuNy01OC43bC0yMi43LTcuN2MzLjYtMTAuOCA4LjMtMjEuMyAxMy42LTMxbC0xNS44LTkuMUM0MiAxODEgMzIuMSAyMTcuNSAzMi4xIDI1NnMxMCA3NSAyNy4xIDEwNi42TDc1IDM1My41Yy01LjMtMTAtOS43LTIwLjMtMTMuNi0zMS4xek0yMjEuMSA0MzRjLTQwLjQtOC03NS44LTI5LjEtMTAxLjktNTguN2wtMTggMTUuOGMtNy41LTguNi0xNC40LTE3LjctMjAuMi0yNy40bC0xNiA5LjRjMzguNSA2Mi4zIDEwNi44IDEwNC4zIDE4NC45IDEwNi42bDAtMTguM2MtMTEuMy0uMy0yMi43LTEuNy0zMy41LTMuNmw0LjctMjMuOHpNMTAxLjMgMTIwLjlsMTggMTUuNWMyNi0yOS42IDYxLjQtNTAuNyAxMDEuOS01OC40bC00LjctMjMuOGMxMC44LTIuMiAyMi4xLTMuMyAzMy41LTMuNmwwLTE4LjJDMTcxLjkgMzQuNiAxMDMuOSA3Ni40IDY1LjQgMTM5bDE1LjggOS4xYzYtOS43IDEyLjYtMTguOSAyMC4xLTI3LjJ6TTQxMC43IDM5MS4xbC0xOC0xNS44Yy0yNiAyOS42LTYxLjQgNTAuNy0xMDEuOSA1OC43bDQuNyAyMy44Yy0xMC44IDEuOS0yMi4xIDMuMy0zMy41IDMuNmwwIDE4LjNjNzguMS0yLjIgMTQ2LjQtNDQuMyAxODQuOS0xMDYuNmwtMTYuMS05LjRjLTUuNyA5LjctMTIuNiAxOC44LTIwLjEgMjcuNHpNOCAyNTZhMjQ4IDI0OCAwIDEgMSA0OTYgMCAyNDggMjQ4IDAgMSAxIC00OTYgMHptNDgzLjggMGEyMzUuOCAyMzUuOCAwIDEgMCAtNDcxLjYgMCAyMzUuOCAyMzUuOCAwIDEgMCA0NzEuNiAwem0tMzktMTA2LjZMNDM3IDE1OC41YzUuMyA5LjcgMTAgMjAuMiAxMy42IDMxbC0yMi43IDcuN2M2LjQgMTguMyA5LjcgMzguMiA5LjcgNTguN3MtMy42IDQwLjQtMTAgNTguN2wyMyA3LjdjLTMuOSAxMC44LTguMyAyMS0xMy42IDMxbDE1LjggOS4xQzQ3MCAzMzEgNDc5LjkgMjk0LjUgNDc5LjkgMjU2cy05LjktNzUtMjcuMS0xMDYuNnptLTE4MyAxNzcuN2MxNi4zLTMuMyAzMC40LTExLjYgNDAuNy0yMy41bDUxLjIgNDQuOGMxMS45LTEzLjYgMjEuMy0yOS4zIDI3LjEtNDYuOGwtNjQuMi0yMi4xYzIuNS03LjUgMy45LTE1LjIgMy45LTIzLjVzLTEuNC0xNi4xLTMuOS0yMy41bDY0LjUtMjIuMWMtNi4xLTE3LjQtMTUuNS0zMy4yLTI3LjQtNDYuOGwtNTEuMiA0NC44Yy0xMC4yLTExLjktMjQuNC0yMC41LTQwLjctMjMuOGwxMy4zLTY2LjRjLTguNi0xLjktMTcuNy0yLjgtMjcuMS0yLjhzLTE4LjUgLjgtMjcuMSAyLjhsMTMuMyA2Ni40Yy0xNi4zIDMuMy0zMC40IDExLjktNDAuNyAyMy44bC01MS4yLTQ0LjhjLTExLjkgMTMuNi0yMS4zIDI5LjMtMjcuNCA0Ni44bDY0LjUgMjIuMWMtMi41IDcuNS0zLjkgMTUuMi0zLjkgMjMuNXMxLjQgMTYuMSAzLjkgMjMuNWwtNjQuMiAyMi4xYzUuOCAxNy40IDE1LjIgMzMuMiAyNy4xIDQ2LjhsNTEuMi00NC44YzEwLjIgMTEuOSAyNC40IDIwLjIgNDAuNyAyMy41bC0xMy4zIDY2LjdjOC42IDEuNyAxNy43IDIuOCAyNy4xIDIuOHMxOC41LTEuMSAyNy4xLTIuOGwtMTMuMy02Ni43eiJdCiAgICB9OwogICAgZmFBY2Nlc3NpYmxlSWNvbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhY2Nlc3NpYmxlLWljb24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs2MjEwN10sICJmMzY4IiwgIk00MjMuOSAyNTUuOEw0MTEgNDEzLjFjLTMuMyA0MC43LTYzLjkgMzUuMS02MC42LTQuOWwxMC0xMjIuNS00MS4xIDIuM2MxMC4xIDIwLjcgMTUuOCA0My45IDE1LjggNjguNSAwIDQxLjItMTYuMSA3OC43LTQyLjMgMTA2LjVsLTM5LjMtMzkuM2M1Ny45LTYzLjcgMTMuMS0xNjcuMi03NC0xNjcuMi0yNS45IDAtNDkuNSA5LjktNjcuMiAyNkw3MyAyNDMuMmMyMi0yMC43IDUwLjEtMzUuMSA4MS40LTQwLjJsNzUuMy04NS43LTQyLjYtMjQuOC01MS42IDQ2QzEwNS41IDE2NS4zIDY0LjkgMTIwIDk1IDkzLjFsNjgtNjAuN2M5LjgtOC44IDI0LjEtMTAuMiAzNS41LTMuNiAwIDAgMTM5LjMgODAuOSAxMzkuNSA4MS4xIDE2LjIgMTAuMSAyMC43IDM2IDYuMSA1Mi42bC01OC40IDY2LjUgMTA2LjEtNS45YzE4LjUtMS4xIDMzLjYgMTQuNCAzMi4xIDMyLjd6TTM1OSAxMDEuOEE1MC45IDUwLjkgMCAxIDAgMzU5IDAgNTAuOSA1MC45IDAgMSAwIDM1OSAxMDEuOHpNMTc5LjYgNDU2LjVjLTgwLjYgMC0xMjcuNC05MC42LTgyLjctMTU2LjFMNTcuMiAyNjAuN0MzNi40IDI4NyAyNCAzMjAuMyAyNCAzNTYuNCAyNCA0ODcuMSAxNzQuNyA1NTcuOCAyNzUuNCA0NzguOWwtMzkuNy0zOS43Yy0xNiAxMC45LTM1LjMgMTcuMy01Ni4xIDE3LjN6Il0KICAgIH07CiAgICBmYVF1b3JhID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInF1b3JhIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyYzQiLCAiTTQ0MC43IDM4Ni43bC0yOS4zIDBjLTEuNSAxMy41LTEwLjUgMzAuOC0zMyAzMC44LTIwLjUgMC0zNS4zLTE0LjItNDkuNS0zNS44IDQ0LjItMzQuMiA3NC43LTg3LjUgNzQuNy0xNTMgLjEtMTE3LjUtOTYuNi0xOTYuNy0xOTguNC0xOTYuNy05OS43IDAtMTk3LjcgNzkuNy0xOTcuNyAxOTYuNyAwIDEzNC4xIDEzMS4zIDIyMS42IDI0OSAxODkgMTkuNyAzMy42IDQ1LjcgNjIuMyA5NS4yIDYyLjMgODEuOCAwIDkwLjgtNzUuMyA4OS05My4zek0yOTcuMiAzMjkuMmMtMTkuNS0yOS4yLTQzLjctNTIuMi05MS41LTUyLjItMzAuNSAwLTU0LjMgMTAtNjkgMjIuOGwxMi4yIDI0LjNjNi4yLTMgMTMtNCAxOS44LTQgMzUuNSAwIDUzLjcgMzAuOCA2OS4yIDYxLjMtMTAgMy0yMC43IDQuMi0zMi43IDQuMi03NSAwLTEwNy41LTUzLTEwNy41LTE1Ni43IDAtMTA0LjQgMzIuNS0xNTcuOSAxMDcuNS0xNTcuOSA3Ni4yIDAgMTA4LjcgNTMuNSAxMDguNyAxNTcuNyAuMSA0MS44LTUuNCA3NS42LTE2LjcgMTAwLjV6Il0KICAgIH07CiAgICBmYUNjSmNiID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNjLWpjYiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMjRiIiwgIk00MzEuNSAyNDQuM2wwLTMyLjNjNDEuMiAwIDM4LjUgLjIgMzguNSAuMiA3LjMgMS4zIDEzLjMgNy4zIDEzLjMgMTYgMCA4LjgtNiAxNC41LTEzLjMgMTUuOC0xLjIgLjQtMy4zIC4zLTM4LjUgLjN6bTQyLjggMjAuMmMtMi44LS43LTMuMy0uNS00Mi44LS41bDAgMzVjMzkuNiAwIDQwIC4yIDQyLjgtLjUgNy41LTEuNSAxMy41LTggMTMuNS0xNyAwLTguNy02LTE1LjUtMTMuNS0xN3pNNTc2IDgwbDAgMzUyYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDQ4IDQ4MGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCA4MEMwIDUzLjUgMjEuNSAzMiA0OCAzMmw0ODAgMGMyNi41IDAgNDggMjEuNSA0OCA0OHpNMTgyIDE5Mi4zbC01NyAwYzAgNjcuMSAxMC43IDEwOS43LTM1LjggMTA5LjctMTkuNSAwLTM4LjgtNS43LTU3LjItMTQuOGwwIDI4YzMwIDguMyA2OCA4LjMgNjggOC4zIDk3LjkgMCA4Mi00Ny43IDgyLTEzMS4yem0xNzguNSA0LjVjLTYzLjQtMTYtMTY1LTE0LjktMTY1IDU5LjMgMCA3Ny4xIDEwOC4yIDczLjYgMTY1IDU5LjJsMC0yOC4zQzMxMi45IDMxMS43IDI1MyAzMDkgMjUzIDI1NnM1OS44LTU1LjYgMTA3LjUtMzEuMmwwLTI4ek01NDQgMjg2LjVjMC0xOC41LTE2LjUtMzAuNS0zOC0zMmwwLS44YzE5LjUtMi43IDMwLjMtMTUuNSAzMC4zLTMwLjIgMC0xOS0xNS43LTMwLTM3LTMxIDAgMCA2LjMtLjMtMTIwLjMtLjNsMCAxMjcuNSAxMjIuNyAwYzI0LjMgLjEgNDIuMy0xMi45IDQyLjMtMzMuMnoiXQogICAgfTsKICAgIGZhRmVkb3JhID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImZlZG9yYSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNzk4IiwgIk0wIDI1NS44Qy4xIDEzMi4yIDEwMC4zIDMyIDIyNCAzMlM0NDggMTMyLjMgNDQ4IDI1NiAzNDcuOCA0NzkuOSAyMjQuMSA0ODBMNTAuOSA0ODBDMjIuOCA0ODAgLjEgNDU3LjMgMCA0MjkuMmwwIDAgMC0xNzMuNCAwIDB6bTM0Mi42LTYzLjFjMC0zOS43LTM1LjYtNjguNS03My4yLTY4LjUtMzQuOSAwLTY1LjggMjYuMy03MC4xIDU5LjktLjIgMy44LS40IDUtLjQgOC41LS4xIDIxLjEgMCA0Mi44LS44IDY0LjQgLjkgMjYuMSAxIDUyLjEgMCA3Ni42IDAgMjcuMS0xOS40IDQ1LjUtNDQuNyA0NS41cy00NS44LTIwLjItNDUuOC00NS41Yy41LTI3LjcgMjIuNi00NS4zIDQ4LjUtNDYuMWwuMiAwIDI2LjMtLjIgMC0zNy4zLTI2LjMgLjJjLTQ3LjEtLjQtODQuNiAzNi41LTg1LjkgODMuNCAwIDQ1LjYgMzcuNSA4Mi45IDgzIDgyLjkgNDMgMCA3OC43LTMzLjYgODIuNi03NS42bC4yLTUzLjUgMzIuNi0uM2MyNS4zIC4yIDI1LTM3LjgtLjItMzcuM2wtMzIuNCAuM2MwLTYuNCAuMS0xMi44IC4xLTE5LjIgLjEtMTIuNyAuMS0yNS40LS4xLTM4LjIgLjEtMTYuNSAxNS44LTMxLjIgMzMuMi0zMS4yIDE3LjUgMCAzNS45IDguNyAzNS45IDMxLjIgMCAzLjItLjEgNS4xLS4zIDYuMy0xLjkgMTAuNSA1LjIgMjAuNCAxNS43IDIxLjkgMTAuNiAxLjUgMjAuMi02LjEgMjEuMi0xNi42IC42LTQuMiAuNy03LjkgLjctMTEuNnoiXQogICAgfTsKICAgIGZhRHVvbGluZ28gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZHVvbGluZ28iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTgxMiIsICJNNTA0LjMgMjMwLjVjMTAuNCA4OC41LTQzLjQgMTcyLjEtMTI4LjIgMTk5cy0xNzYuNi0xMC4zLTIxOC45LTg4LjdjLTcyIDMtMTM3LjQtMzkuOC0xNjMuMi0xMDUuNS0yLjYtNi42LTEuOS0xNCAxLjktMTkuOXMxMC4yLTkuNyAxNy4yLTEwLjFsOTYuMS02LTIzLjgtNzUuOWMtNi4zLTIwLTIuMi00MS45IDExLTU4LjNzMzMuNy0yNSA1NC41LTIzYzUyLjIgNSA4Ni44IDQuOCAxMDQtLjZTMzAwIDE2LjcgMzM5LTE2LjljMTUuOS0xMy43IDM3LjctMTguNSA1Ny44LTEyLjdzMzYuMSAyMS4zIDQyLjQgNDEuNEw0NjIuOCA4NyA1NDMuNiAzNy4zYzYtMy43IDEzLjQtNC4zIDE5LjktMS42czExLjMgOC4zIDEyLjkgMTUuMmMxNi4yIDY4LjItMTIuNCAxNDAuMy03Mi4xIDE3OS41ek0yNTguNSA0NzUuOWwwIDBjMTUuMSA3LjUgMjEuNSAyNS44IDE0LjIgNDFzLTI1LjQgMjEuOS00MC43IDE0LjlsLTQzLjktMjFjLTE1LjEtNy41LTIxLjUtMjUuOC0xNC4yLTQxczI1LjQtMjEuOSA0MC43LTE0LjlsNDMuOCAyMXpNNTY0LjYgMzQ1LjdjMTQuOCA4LjQgMjAgMjcuMyAxMS42IDQyLjJsLTIzLjkgNDIuNGMtOC43IDE0LjMtMjcuMSAxOS4yLTQxLjYgMTAuOXMtMTkuOS0yNi42LTEyLTQxLjRsMjMuOS00Mi40YzQtNy4xIDEwLjctMTIuNCAxOC42LTE0LjZzMTYuMy0xLjIgMjMuNCAyLjl6Il0KICAgIH07CiAgICBmYUZpcnN0ZHJhZnQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZmlyc3RkcmFmdCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmM2ExIiwgIk0zODQgMTkybC02NCAwIDAgMTI4LTEyOCAwIDAgMTI4LTE5MiAwIDAtMjUuNiAxNjYuNCAwIDAtMTI4IDEyOCAwIDAtMTI4IDg5LjYgMCAwIDI1LjZ6bS0yNS42IDM4LjRsMCAxMjgtMTI4IDAgMCAxMjgtMTY2LjQgMCAwIDI1LjYgMTkyIDAgMC0xMjggMTI4IDAgMC0xNTMuNi0yNS42IDB6bTI1LjYgMTkybC04OS42IDAgMCA4OS42IDI1LjYgMCAwLTY0IDY0IDAgMC0yNS42ek0wIDBsMCAzODQgMTI4IDAgMC0xMjggMTI4IDAgMC0xMjggMTI4IDAgMC0xMjgtMzg0IDB6Il0KICAgIH07CiAgICBmYUZyZWVic2QgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZnJlZWJzZCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmM2E0IiwgIk0zMDMuNyA5Ni4yYzExLjEtMTEuMSAxMTUuNS03NyAxMzkuMi01My4yIDIzLjcgMjMuNy00Mi4xIDEyOC4xLTUzLjIgMTM5LjJzLTM5LjQgLjktNjMuMS0yMi45Yy0yMy44LTIzLjctMzQuMS01Mi0yMi45LTYzLjF6TTEwOS45IDY4LjFDNzMuNiA0Ny41IDIyIDI0LjYgNS42IDQxLjEtMTEgNTcuNyAxMi43IDExMC41IDMzLjUgMTQ2LjggNTIgMTE0LjYgNzguMyA4Ny41IDEwOS45IDY4LjF6TTQwNi43IDE3NGMzLjMgMTEuMyAyLjcgMjAuNy0yLjcgMjYuMS0yMC4zIDIwLjMtODcuNS0yNy0xMDkuMy03MC4xLTE4LTMyLjMtMTEuMS01My40IDE0LjktNDguNyA1LjctMy42IDEyLjMtNy42IDE5LjYtMTEuNi0yOS44LTE1LjUtNjMuNi0yNC4zLTk5LjUtMjQuMy0xMTkuMSAwLTIxNS42IDk2LjUtMjE1LjYgMjE1LjYgMCAxMTkgOTYuNSAyMTUuNiAyMTUuNiAyMTUuNlM0NDUuMyAzODAuMSA0NDUuMyAyNjFjMC0zOC40LTEwLjEtNzQuNS0yNy43LTEwNS44LTMuOSA3LTcuNiAxMy4zLTEwLjkgMTguOHoiXQogICAgfTsKICAgIGZhT2R5c2VlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm9keXNlZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNWM2IiwgIk00MDYuNyA0NjNjLTQyLjMgMzAuOC05NC40IDQ5LTE1MC43IDQ5LTExMS4xIDAtMjA1LjctNzAuOC0yNDEuMS0xNjkuOCAyLjQgMS43IDUuOSAzLjYgNy45IDQuNCAxNi4zIDcuNCA0MC4xLTUuNCA2Mi45LTI4LjcgNi45LTYuOSAxNC40LTEyLjQgMjIuOC0xNy4zIDE4LjMtMTEuOSAzNy42LTIwLjggNTguNC0yNy4yIDAgMCAyMi4zIDM0LjIgNDMuMSA3NC44cy0yMi4zIDU0LTI3LjIgNTRjLS4zIDAtLjggMC0xLjUtLjEtMTEtLjUtNzAtMy01NiA1MS4xIDE0LjkgNTcuNCA5Ny41IDM2LjYgMTM5LjYgOC45czMxLjctMTE4LjMgMzEuNy0xMTguM2M0MS4xLTYuNCA1NCAzNy4xIDU3LjkgNTkuNCAuOCA0LjYgMS4xIDkuOSAxLjQgMTUuNSAxLjEgMjEuMiAyLjMgNDUuNiAzNS4zIDQ2LjQgNS4zIDAgMTAuNi0uOCAxNS41LTJsMC0uMXptLTk1LjMtMjMuN2MtMi0uNS0zLjUtMi41LTMtNSAxLTIuNSAzLTMuNSA1LTNzMy41IDMgMyA1LTIuNSAzLjUtNSAzem0tMjA3LTk1LjZjMS41LS41IDMuNSAxIDQgMyAwIDItMSA0LTMgNC0xLjUgLjUtMy41LTEtNC0zLS41LTEuNSAxLTMuNSAzLTR6TTQ1MS44IDQyMWMzNy41LTQ0LjYgNjAuMi0xMDIuMiA2MC4yLTE2NSAwLTY3LjUtMjYuMS0xMjguOS02OC44LTE3NC43LS4xIDIzLjUtNi4xIDQ4LjItMTYuOCA2OS4yLTExLjkgMjAuMy00OSA1OC45LTY5LjggNzguNy0uNyAuMy0xLjEgLjktMS41IDEuNC0uMiAuMi0uMyAuNC0uNSAuNi01IDYuOS00IDE2LjggMyAyMS44IDIxLjMgMTUuOCA1Ni40IDQ1LjYgNTkuNCA3Mi44IDMuNSAzNC45IDI3LjkgNzUuNiAzNC4yIDg2LjIgLjggMS4zIDEuMyAyLjEgMS40IDIuNCAwIDIuMi0uNCA0LjMtLjggNi41bDAgLjF6TTM5MC43IDI1MWMtLjUgMyAxIDUuOSA0IDYuNHM1LjktMSA2LjQtNC0xLTUuOS00LTYuNGMtMy0xLTUuOSAxLTYuNCA0em02MS40LTYwLjlsLTExLjQgNS40LTMgMTIuOS01LjQtMTEuNC0xMi45LTMgMTEuNC01LjQgMy0xMi45IDUuNCAxMS40IDEyLjkgM3pNMzk1LjUgNDEuM2MtMTYuMiA4LjItMjIuMSAzMi44LTI5IDYxLjQtLjMgMS40LS43IDIuOC0xIDQuMi05LjUgMzguNS0zMC42IDM3LjYtNDEuNyAzNy4yLTEuMSAwLTItLjEtMi45LS4xLTUuMSAwLTYtNC04LjktMTcuMS0yLjYtMTIuMS02LjktMzItMTcuOS02My42LTIyLjctNjUuOC04Mi43LTQ5LjQtMTI4LjItMjIuMi01NS4zIDMzLjEtMzQuNCAxMDEuOS0xOS44IDE0OS40IC43IDIuMiAxLjQgNC40IDIgNi42LTQgNC0xMy44IDcuNS0yNiAxMS45LTEyLjEgNC4zLTI2LjYgOS41LTQwLjMgMTYuOS0zMy45IDE4LTcwLjMgNDktNzkuOCA2Mi42LTEuMy0xMC43LTItMjEuNS0yLTMyLjUgMC0xNDEuNCAxMTQuNi0yNTYgMjU2LTI1NiA1MS40IDAgOTkuNCAxNS4yIDEzOS41IDQxLjN6TTU4LjkgMTg5LjZjLTEuNS0yLTQuNS0zLTYuNC0xLjVzLTMgNC41LTEuNSA2LjQgNC41IDMgNi40IDEuNWMyLjUtMS41IDMtNC41IDEuNS02LjR6TTMyNy4zIDY0LjljMi0xLjUgNS0uNSA2LjQgMS41IDEuNSAyLjUgMSA1LjQtMS41IDYuNC0yIDEuNS01IC41LTYuNC0xLjVzLS41LTUgMS41LTYuNHpNOTUuMSAxMDVjLS41IDEuNSAuNSAzIDIgMyAxLjUgLjUgMy0uNSAzLTIgLjUtMS41LS41LTMtMi0zcy0zIC41LTMgMnptODQuNy0uNWMtMy41LTQzLjEgMzcuMS01NCAzNy4xLTU0IDQ0LjEtMTUuNCA1NiA1LjkgNjYuNCAzNy42czMgNDIuNi0zOC42IDU4LjktNjEuOS00LjUtNjQuOS00Mi42bDAgLjF6bTg5LjYgMTQuOWwxIDBjMi41IDAgNS0yIDUtNSAyLTYuOSAxLTE0LjQtMi0yMC44LTEuNS0yLTQtMy41LTYuNC0yLjUtMyAxLTQuNSA0LTMuNSA2LjkgMiA0LjUgMyA5LjkgMS41IDE0LjktLjUgMyAxLjUgNS45IDQuNSA2LjRsLS4xIC4xem0tOS45LTQxLjZjLTIgMC00LTEtNS0zcy0yLTMuNS0zLTVjLTItMi0yLTUuNCAwLTcuNHM1LjQtMiA3LjQgMGMyIDIuNSAzLjUgNSA1IDcuNHMuNSA1LjktMi41IDcuNGMtLjYgMC0xIC4yLTEuMyAuMy0uMiAuMS0uNCAuMi0uNiAuMmwwIC4xeiJdCiAgICB9OwogICAgZmFHZ0NpcmNsZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnZy1jaXJjbGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjI2MSIsICJNMjU3LjUgOGEyNDggMjQ4IDAgMSAwIDAgNDk2IDI0OCAyNDggMCAxIDAgMC00OTZ6TTIwOCAzODIuOGwtMTI1LjctMTI1LjcgMTI1LjctMTI1LjcgMzUuMiAzNS40LTI0LjIgMjQuMi0xMS4xLTExLjEtNzcuMiA3Ny4yIDc3LjIgNzcuMiAyNi42LTI2LjYtNTMuMS01Mi45IDI0LjQtMjQuNCA3Ny4yIDc3LjItNzUgNzUuMnptOTktMi4ybC0zNS4yLTM1LjIgMjQuMS0yNC40IDExLjEgMTEuMSA3Ny4yLTc3LjItNzcuMi03Ny4yLTI2LjUgMjYuNSA1My4xIDUyLjktMjQuNCAyNC40LTc3LjItNzcuMiA3NS03NSAxMjUuNyAxMjUuNy0xMjUuNyAxMjUuNnoiXQogICAgfTsKICAgIGZhQ2xvdWRmbGFyZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjbG91ZGZsYXJlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImUwN2QiLCAiTTQwNy45IDMxOS45TDE3Ny4xIDMxN2MtLjcgMC0xLjQtLjItMi0uNXMtMS4yLS44LTEuNi0xLjRjLS40LS42LS43LTEuMy0uNy0yczAtMS40IC4yLTIuMWMuNC0xLjEgMS4xLTIuMSAyLjEtMi44czIuMS0xLjIgMy4zLTEuMmwyMzIuOS0yLjljMjcuNi0xLjMgNTcuNS0yMy42IDY4LTUwLjhsMTMuMy0zNC41Yy40LS45IC41LTEuOSAuNS0yLjkgMC0uNS0uMS0xLjEtLjItMS42LTcuNC0zMi4yLTI1LTYxLjEtNTAuMy04Mi4zcy01Ni43LTMzLjctODkuNy0zNS41LTY1LjYgNy4zLTkzIDI1LjctNDggNDUuMy01OC44IDc2LjVjLTExLjMtOC41LTI0LjktMTMuMy0zOS0xMy43cy0yOCAzLjUtMzkuOCAxMS40LTIwLjggMTkuMS0yNS45IDMyLjMtNS45IDI3LjYtMi40IDQxLjNjLTUyLjMgMS41LTk0LjIgNDQuMS05NC4yIDk2LjUgMCA0LjcgLjMgOS4zIDEgMTQgLjIgMS4xIC43IDIuMSAxLjUgMi44czEuOSAxLjEgMi45IDEuMWw0MjYuMSAuMWMwIDAgLjEgMCAuMSAwIDEuMiAwIDIuMy0uNCAzLjMtMS4xczEuNi0xLjcgMi0yLjlsMy4zLTExLjNjMy45LTEzLjQgMi40LTI1LjgtNC4xLTM0LjktNi04LjQtMTYuMS0xMy4zLTI4LjItMTMuOXptMTA1LjktOTguOGMtMi4xIDAtNC4zIC4xLTYuNCAuMi0uOCAuMS0xLjUgLjMtMi4xIC44cy0xIDEuMS0xLjMgMS44bC05LjEgMzEuMmMtMy45IDEzLjQtMi40IDI1LjggNC4xIDM0LjkgNiA4LjQgMTYuMSAxMy4zIDI4LjIgMTMuOWw0OS4yIDIuOWMuNyAwIDEuNCAuMiAyIC41czEuMSAuOCAxLjUgMS40Yy40IC42IC43IDEuMyAuOCAyczAgMS41LS4yIDIuMWMtLjQgMS4xLTEuMSAyLjEtMi4xIDIuOHMtMi4xIDEuMi0zLjMgMS4ybC01MS4xIDIuOWMtMjcuOCAxLjMtNTcuNyAyMy42LTY4LjEgNTAuOGwtMy43IDkuNmMtLjIgLjQtLjIgLjgtLjIgMS4zcy4yIC44IC40IDEuMiAuNiAuNyAuOSAuOSAuOCAuMyAxLjIgLjNjMCAwIC4xIDAgLjEgMGwxNzUuOSAwYzEgMCAyLS4zIDIuOC0uOXMxLjQtMS41IDEuNy0yLjRjMy4xLTExLjEgNC43LTIyLjUgNC43LTM0IDAtNjkuMy01Ni41LTEyNS41LTEyNi4xLTEyNS41eiJdCiAgICB9OwogICAgZmFIYWNrZXJyYW5rID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImhhY2tlcnJhbmsiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjVmNyIsICJNNDc3LjkgMTI4QzQ2My40IDEwMyAyODUuNSAwIDI1Ni41IDBzLTIwNi45IDEwMi44LTIyMS4zIDEyOC0xNC41IDIzMC44IDAgMjU2IDE5Mi40IDEyOCAyMjEuMyAxMjggMjA2LjgtMTAyLjkgMjIxLjMtMTI4IDE0LjUtMjMxIDAtMjU2ek0zMTYuNSA0MTQuMmMtNCAwLTQwLjktMzUuOC0zOC0zOC43IC45LS45IDYuMy0xLjUgMTcuNS0xLjggMC0yNi4yIC42LTY4LjYgLjktODYuMyAwLTItLjQtMy40LS40LTUuOGwtNzkuOSAwYzAgNy4xLS41IDM2LjIgMS40IDcyLjkgLjIgNC41LTEuNiA2LTUuNyA1LjktMTAuMSAwLTIwLjMtLjEtMzAuNC0uMS00LjEgMC01LjktMS41LTUuNy02LjEgLjktMzMuNCAzLTg0LS4yLTIxMi43bDAtMy4yYy05LjctLjQtMTYuNC0xLTE3LjMtMS44LTIuOS0yLjkgMzQuNS0zOC43IDM4LjUtMzguN3M0MS4yIDM1LjggMzguMyAzOC43Yy0uOSAuOS03LjkgMS41LTE2LjggMS44bDAgMy4yYy0yLjQgMjUuOC0yIDc5LjYtMi42IDEwNS40bDgwLjMgMGMwLTQuNiAuNC0zNC43LTEuMi04My42LS4xLTMuNCAxLTUuMiA0LjItNS4yIDExLjEtLjEgMjIuMi0uMSAzMy4yLS4xIDMuNSAwIDQuNiAxLjcgNC41IDUuNC0zLjcgMTkxLjMtLjcgMTc3LjktLjcgMjEwLjMgOC45IC40IDE2LjggMSAxNy43IDEuOCAyLjkgMi45LTMzLjYgMzguNy0zNy42IDM4LjdsMCAweiJdCiAgICB9OwogICAgZmFTa3lhdGxhcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJza3lhdGxhcyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmMjE2IiwgIk02NDAgMzI5LjNjMCA2NS45LTUyLjUgMTE0LjQtMTE3LjUgMTE0LjQtMTY1LjkgMC0xOTYuNi0yNDkuNy0zNTkuNy0yNDkuNy0xNDYuOSAwLTE0Ny4xIDIxMi4yIDUuNiAyMTIuMiA0Mi41IDAgOTAuOS0xNy44IDEyNS4zLTQyLjUgNS42LTQuMSAxNi45LTE2LjMgMjIuOC0xNi4zczEwLjkgNSAxMC45IDEwLjljMCA3LjgtMTMuMSAxOS4xLTE4LjcgMjQuMS00MC45IDM1LjYtMTAwLjMgNjEuMi0xNTQuNyA2MS4yLTgzLjQgLjEtMTU0LTU5LTE1NC0xNDQuOVM2Ny41IDE0OS42IDE1Mi44IDE0OS42YzE4NS4zIDAgMjIyLjUgMjQ1LjkgMzYxLjkgMjQ1LjkgOTkuOSAwIDk0LjgtMTM5LjcgMy40LTEzOS43LTE3LjUgMC0zNSAxMS42LTQ2LjkgMTEuNi04LjQgMC0xNS45LTcuMi0xNS45LTE1LjYgMC0xMS42IDUuMy0yMy43IDUuMy0zNi4zIDAtNjYuNi01MC45LTExNC43LTExNi45LTExNC43LTUzLjEgMC04MCAzNi45LTg4LjggMzYuOS02LjIgMC0xMS4yLTUtMTEuMi0xMS4yIDAtNS42IDQuMS0xMC4zIDcuOC0xNC40IDI1LjMtMjguOCA2NC43LTQzLjcgMTAyLjgtNDMuNyA3OS40IDAgMTM5LjEgNTguNCAxMzkuMSAxMzcuOCAwIDYuOS0uMyAxMy43LTEuMiAyMC42IDExLjktMy4xIDI0LjEtNC43IDM1LjktNC43IDYwLjcgMCAxMTEuOSA0NS4zIDExMS45IDEwNy4yeiJdCiAgICB9OwogICAgZmFEZXNrcHJvID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImRlc2twcm8iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjM4ZiIsICJNMjIyIDUxMmwzMS4xLTM4LjRjMTIuMy0uMiAyNS42LTEuNCAzNi41LTYuNiAzOC45LTE4LjYgMzguNC02MS45IDM4LjMtNjMuOC0uMS01LS44LTQuNC0yOC45LTM3LjRsNzkuMSAwYy0uMiA1MC4xLTcuMyA2OC41LTEwLjIgNzUuNy05LjQgMjMuNy00My45IDYyLjgtOTUuMiA2OS40LTguNyAxLjEtMzIuOCAxLjItNTAuNyAxLjF6TTQyMi40IDM0NC4zYzM4LjYgMCA1OC41LTEzLjYgNzMuNy0zMC45bC0xNzUuNS0uMy0xNy40IDMxLjMgMTE5LjItLjF6TTM3OC44IDEyMC40bDAgMTY4LjMtNzMuNSAwLTMyLjcgNTUuNS02LjUgMGMtNTIuMyAwLTU4LjEtNTYuNS01OC4zLTU4LjktMS4yLTEzLjItMjEuMy0xMS42LTIwLjEgMS44IDEuNCAxNS44IDguOCA0MCAyNi40IDU3LjFsLTkxIDBjLTI1LjUgMC0xMTAuOC0yNi44LTEwNy0xMTRsMC0yMTMuM2MwLTE2IDkuNy0xNi42IDE1LTE2LjhsODIgMGMuMiAwIC4zIC4xIC41IC4xIDQuMy0uNCA1MC4xLTIuMSA1MC4xIDQzLjcgMCAxMy4zIDIwLjIgMTMuNCAyMC4yIDAgMC0xOC4yLTUuNS0zMi44LTE1LjgtNDMuN2w4NC4yIDBDMzYxLS4yIDM3OC44IDc5LjYgMzc4LjggMTIwLjR6bS0xMzIuNSA1Nmw2NCAyOS4zYzEzLjMtNDUuNS00Mi4yLTcxLjctNjQtMjkuM3oiXQogICAgfTsKICAgIGZhUmVzb2x2aW5nID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInJlc29sdmluZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmM2U3IiwgIk0yODkuMiAyNzguMmM0Ni0xMy4zIDQ5LjYtMjMuNSA0NC00My40TDMyMiAxOTUuNWMtNi4xLTIwLjktMTguNC0yOC4xLTcxLjEtMTIuOGwtMTg4LjIgNTQuMSAyOC42IDk4LjYgMTk3LjktNTcuMnpNMjU2LjUgOEMxMzkuNCA4IDQxLjIgODguNyAxNS4yIDE5Ny41bDIyMS45LTYzLjljMzQuOC0xMC4yIDU0LjItMTEuNyA3OS4zLTguMiAzNi4zIDYuMSA1Mi43IDI1IDYxLjQgNTUuMmwxMC43IDM3LjhjOC4yIDI4LjEgMSA1MC42LTIzLjUgNzMuNi0xOS40IDE3LjQtMzEuMiAyNC41LTYxLjQgMzMuMmwtOTIuNiAyNi42IDIyMC40IDI3LjEgOS43IDM0LjItNDguMSAxMy4zLTI4Ni44LTM3LjMgMjMgODAuMkMxNjYgNDkxLjMgMjA5LjUgNTA0IDI1NS41IDUwNCAzOTIuNSA1MDQgNTA0IDM5Mi42IDUwNCAyNTUuNyA1MDUgMTE5LjQgMzkzLjUgOCAyNTYuNSA4ek00Ni4zIDM4OC42TDggMjU2LjhjMCA0OC41IDE0LjMgOTMuNCAzOC4zIDEzMS44eiJdCiAgICB9OwogICAgZmFCbGFja2JlcnJ5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImJsYWNrYmVycnkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjM3YiIsICJNMTY2IDExNi45YzAgMjMuNC0xNi40IDQ5LjEtNzIuNSA0OS4xbC03MC4xIDAgMjEtODguOCA2Ny44IDBjNDIuMSAwIDUzLjggMjMuMyA1My44IDM5Ljd6TTI5Mi4yIDc3LjJsLTY3LjggMC0xOC43IDg4LjggNzAuMSAwYzUzLjggMCA3MC4xLTI1LjcgNzAuMS00OS4xIC4xLTE2LjQtMTEuNi0zOS43LTUzLjctMzkuN3pNODguOCAyMDguMWwtNjcuOCAwLTIxIDg4LjggNzAuMSAwYzU2LjEgMCA3Mi41LTIzLjQgNzIuNS00OS4xIDAtMTYuMy0xMS43LTM5LjctNTMuOC0zOS43em0xODAuMSAwbC02Ny44IDAtMTguNyA4OC44IDcwLjEgMGM1My44IDAgNzAuMS0yMy40IDcwLjEtNDkuMSAwLTE2LjMtMTEuNy0zOS43LTUzLjctMzkuN3ptMTg5LjMtNTMuOGwtNjcuOCAwLTE4LjcgODguOCA3MC4xIDBjNTMuOCAwIDcwLjEtMjMuNCA3MC4xLTQ5LjEgLjEtMTYuMy0xMS42LTM5LjctNTMuNy0zOS43em0tMjggMTM3LjlsLTY3LjggMC0xOC43IDg4LjggNzAuMSAwYzU2LjEgMCA3MC4xLTIzLjQgNzAuMS00OS4xIDAtMTYuMy0xMS42LTM5LjctNTMuNy0zOS43ek0yNDAuOCAzNDZsLTY3LjggMC0xOC43IDg4LjggNzAuMSAwYzU2LjEgMCA3MC4xLTI1LjcgNzAuMS00OS4xIC4xLTE2LjMtMTEuNi0zOS43LTUzLjctMzkuN3oiXQogICAgfTsKICAgIGZhU3RyaXBlUyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzdHJpcGUtcyIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmNDJhIiwgIk0xNTUuNiAxNTQuNmMwLTIyLjMgMTguNi0zMC45IDQ4LjQtMzAuOSA0My40IDAgOTguNSAxMy4zIDE0MS45IDM2LjdsMC0xMzQuM2MtNDcuMy0xOC45LTk0LjUtMjYuMS0xNDEuOC0yNi4xLTExNS43IDAtMTkyLjggNjAuNC0xOTIuOCAxNjEuNCAwIDE1Ny45IDIxNi44IDEzMi4zIDIxNi44IDIwMC40IDAgMjYuNC0yMi45IDM0LjktNTQuNyAzNC45LTQ3LjIgMC0xMDguMi0xOS41LTE1Ni4xLTQ1LjVsMCAxMjguNWM0OS4zIDIxLjMgMTAyLjMgMzIuMyAxNTYgMzIuNCAxMTguNiAwIDIwMC4zLTUxIDIwMC4zLTE1My42IDAtMTcwLjItMjE4LTEzOS43LTIxOC0yMDMuOXoiXQogICAgfTsKICAgIGZhU3F1YXJlQmVoYW5jZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtYmVoYW5jZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJiZWhhbmNlLXNxdWFyZSJdLCAiZjFiNSIsICJNMTU1LjMgMzE4LjRjMTcuMiAwIDMxLjItNi4xIDMxLjItMjUuNCAwLTE5LjctMTEuNy0yNy40LTMwLjMtMjcuNWwtNDYgMCAwIDUyLjkgNDUuMSAwem0tNS40LTEyOS42bC0zOS42IDAgMCA0NC44IDQyLjcgMGMxNS4xIDAgMjUuOC02LjYgMjUuOC0yMi45IDAtMTcuNy0xMy43LTIxLjktMjguOS0yMS45em0xMjkuNSA3NC44bDYyLjIgMGMtMS43LTE4LjUtMTEuMy0yOS43LTMwLjUtMjkuNy0xOC4zIDAtMzAuNSAxMS40LTMxLjcgMjkuN3pNMzg0IDMyTDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjR6TTM0OS41IDE4NWwtNzcuOCAwIDAtMTguOSA3Ny44IDAgMCAxOC45ek0xOTMuNyAyNDMuN2MyMy42IDYuNyAzNSAyNy41IDM1IDUxLjYgMCAzOS0zMi43IDU1LjctNjcuNiA1NS45bC05My4xIDAgMC0xOTIgOTAuNSAwYzMyLjkgMCA2MS40IDkuMyA2MS40IDQ3LjUgMCAxOS4zLTkgMjguOC0yNi4yIDM3em0xMTguNy0zOC42YzQzLjUgMCA2Ny42IDM0LjMgNjcuNiA3NS40IDAgMS42LS4xIDMuMy0uMiA1IDAgLjgtLjEgMS41LS4xIDIuMmwtMTAwLjIgMGMwIDIyLjIgMTEuNyAzNS4zIDM0LjEgMzUuMyAxMS42IDAgMjYuNS02LjIgMzAuMi0xOC4xbDMzLjcgMGMtMTAuNCAzMS45LTMxLjkgNDYuOC02NS4xIDQ2LjgtNDMuOCAwLTcxLjEtMjkuNy03MS4xLTczIDAtNDEuOCAyOC43LTczLjYgNzEuMS03My42eiJdCiAgICB9OwogICAgZmFCZWhhbmNlU3F1YXJlID0gZmFTcXVhcmVCZWhhbmNlOwogICAgZmFTZXJ2aWNlc3RhY2sgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2VydmljZXN0YWNrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzZWMiLCAiTTk2IDIxNmM4MS43IDEwLjIgMjczLjcgMTAyLjMgMzA0IDIzMkw4IDQ0OGM5OS41LTguMSAxODQuNS0xMzcgODgtMjMyek0xMjggNjRjMzIuMyAzNS42IDQ3LjcgODMuOSA0Ni40IDEzMy42IDgyLjkgMzMuNyAyMDcuMyAxMjMuNyAyMzMuNiAyNTAuNGw5NiAwQzQ2My4zIDIzMS45IDIzMC44IDc5LjUgMTI4IDY0eiJdCiAgICB9OwogICAgZmFSb2NrZXRjaGF0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInJvY2tldGNoYXQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjNlOCIsICJNMjg0LjUgMjI0LjhjLTYuNyAwLTEzLjMgMi4xLTE4LjkgNS44cy05LjkgOS4xLTEyLjUgMTUuNC0zLjIgMTMuMS0xLjkgMTkuNyA0LjYgMTIuNyA5LjQgMTcuNCAxMC45IDggMTcuNSA5LjMgMTMuNSAuNiAxOS43LTIgMTEuNS03IDE1LjMtMTIuNiA1LjctMTIuMiA1LjctMTguOWMwLTkuMS0zLjctMTcuOC0xMC4xLTI0LjJzLTE1LjEtMTAtMjQuMi05Ljl6bS0xMTAuNCAwYy02LjcgMC0xMy4zIDIuMS0xOC45IDUuOHMtOS45IDkuMS0xMi41IDE1LjQtMy4yIDEzLjEtMS45IDE5LjcgNC42IDEyLjcgOS40IDE3LjQgMTAuOSA4IDE3LjUgOS4zIDEzLjUgLjYgMTkuNy0yIDExLjUtNyAxNS4zLTEyLjYgNS43LTEyLjIgNS43LTE4LjljMC05LjEtMy43LTE3LjgtMTAuMS0yNC4ycy0xNS4xLTEwLTI0LjItMTBsMCAwem0yMjAuOSAwYTM0LjEgMzQuMSAwIDEgMCAuNCA2OC4yIDM0LjEgMzQuMSAwIDEgMCAtLjQtNjguMnptMTUzLjgtNTUuM2MtMTUuNS0yNC4yLTM3LjMtNDUuNi02NC43LTYzLjYtNTIuOS0zNC44LTEyMi40LTU0LTE5NS43LTU0LTI0LjIgMC00OC4zIDIuMS03MiA2LjQtMTQuOS0xNC4zLTMxLjUtMjYuNi00OS41LTM2LjYtNjYuOC0zMy4zLTEyNS42LTIwLjktMTU1LjMtMTAuMi0yLjMgLjgtNC4zIDIuMS01LjkgMy45cy0yLjcgMy45LTMuMyA2LjItLjUgNC43IC4xIDcuMSAxLjggNC40IDMuNSA2LjFDMjcgNTYuNSA2MS42IDk5LjMgNTMuMSAxMzguMyAyMCAxNzIuMiAyIDIxMyAyIDI1NS42IDIgMjk5IDIwIDMzOS44IDUzLjEgMzczLjcgNjEuNiA0MTIuNyAyNyA0NTUuNiA2IDQ3Ny4yIDQuMyA0NzkgMy4yIDQ4MS4xIDIuNSA0ODMuNHMtLjcgNC43LS4xIDcgMS43IDQuNSAzLjMgNi4yIDMuNiAzLjEgNS45IDMuOWMyOS43IDEwLjcgODguNSAyMy4xIDE1NS4zLTEwLjIgMTgtMTAgMzQuNy0yMi4zIDQ5LjUtMzYuNiAyMy44IDQuMyA0Ny45IDYuNCA3MiA2LjQgNzMuMyAwIDE0Mi44LTE5LjIgMTk1LjctNTQgMjcuNC0xOCA0OS4xLTM5LjQgNjQuNy02My42IDE3LjMtMjYuOSAyNi4xLTU1LjkgMjYuMS04Ni4xIDAtMzEtOC44LTYwLTI2LjEtODYuOWwwIDB6TTI4NS40IDQwOS45Yy0zMC4yIC4xLTYwLjMtMy44LTg5LjQtMTEuNWwtMjAuMSAxOS40Yy0xMS4yIDEwLjctMjMuNiAyMC0zNy4xIDI3LjYtMTYuNCA4LjItMzQuMiAxMy4zLTUyLjUgMTQuOSAxLTEuOCAxLjktMy42IDIuOC01LjQgMjAuMi0zNy4xIDI1LjYtNzAuNSAxNi4zLTEwMC4xLTMzLTI2LTUyLjgtNTkuMi01Mi44LTk1LjQgMC04My4xIDEwNC4zLTE1MC41IDIzMi44LTE1MC41czIzMi45IDY3LjQgMjMyLjkgMTUwLjVjMCA4My4xLTEwNC4zIDE1MC41LTIzMi45IDE1MC41eiJdCiAgICB9OwogICAgZmFSZWJlbCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJyZWJlbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMWQwIiwgIk0yNTYuOSA1MDRjLTEzOS4zIDAtMjQ3LjUtMTE2LjItMjQzLjMtMjU0LjEgMi44LTc5LjIgNDMuMi0xNTIuMiAxMTYuNS0yMDAuNCAuMyAwIDEuOS0uNiAxLjEgLjgtNS44IDUuNS0xMTEuMyAxMjkuOC0xNC4xIDIyNi40IDQ5LjggNDkuNSA5MCAyLjUgOTAgMi41IDM4LjUtNTAuMS0uNi0xMjUuOS0uNi0xMjUuOS0xMC0yNC45LTQ1LjctNDAuMS00NS43LTQwLjFsMjguOC0zMS44YzI0LjQgMTAuNSA0My4yIDM4LjcgNDMuMiAzOC43IC44LTI5LjYtMjEuOS02MS40LTIxLjktNjEuNEwyNTUuNSA4IDI5OS44IDU4LjFjLTIwLjUgMjguOC0yMS45IDYyLjYtMjEuOSA2Mi42IDEzLjgtMjMgNDMuNS0zOS4zIDQzLjUtMzkuM2wyOC41IDMxLjhjLTI3LjQgOC45LTQ1LjQgMzkuOS00NS40IDM5LjktMTUuOCAyOC41LTI3LjEgODkuNCAuNiAxMjcuMyAzMi40IDQ0LjYgODcuNy0yLjggODcuNy0yLjggMTAyLjctOTEuOS0xMC41LTIyNS0xMC41LTIyNS02LjEtNS41IC44LTIuOCAuOC0yLjggNTAuMSAzNi41IDExNC42IDg0LjQgMTE2LjIgMjA0LjggMiAxNDUuNi05OS45IDI0OS40LTI0Mi40IDI0OS40eiJdCiAgICB9OwogICAgZmFTcXVhcmVXZWJBd2Vzb21lID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS13ZWItYXdlc29tZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNjgzIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyek0yMzUgMTc3LjZsNTMgNDYuNCA1Mi4yLTEwLjRjLTIuNi0zLjktNC4yLTguNS00LjItMTMuNiAwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0YzAgMTMtMTAuMyAyMy42LTIzLjIgMjRMMzA0LjUgMzQ5LjFjLTUuMiAxMS41LTE2LjYgMTguOS0yOS4yIDE4LjlsLTEwMi42IDBjLTEyLjYgMC0yNC03LjQtMjkuMi0xOC45TDg3LjIgMjI0Yy0xMi45LS40LTIzLjItMTEtMjMuMi0yNCAwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0YzAgNS0xLjUgOS43LTQuMiAxMy42TDE2MCAyMjQgMjEzLjEgMTc3LjZjLTguOS00LjEtMTUtMTMuMS0xNS0yMy42IDAtMTQuNCAxMS42LTI2IDI2LTI2czI2IDExLjYgMjYgMjZjMCAxMC41LTYuMiAxOS41LTE1LjEgMjMuNnoiXQogICAgfTsKICAgIGZhTGlua3RyZWUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibGlua3RyZWUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTdkOCIsICJNMzIgMTczLjRsMTI1LjggMC04OS40LTg1LjQgNDkuNS01MSA4NS4yIDg3LjggMC0xMjQuOCA3My45IDAgMCAxMjQuOCA4NS4yLTg3LjYgNDkuNCA1MC44LTg5LjQgODUuMiAxMjUuNyAwIDAgNzAuNS0xMjYuNCAwIDkwIDg3LjYtNDkuMyA0OS44LTEyMi4yLTEyMy0xMjIuMiAxMjMtNDkuNS00OS42IDkwLTg3LjYtMTI2LjQgMCAwLTcwLjV6TTIwMi45IDM0NC44bDczLjkgMCAwIDE2Ny4yLTczLjkgMCAwLTE2Ny4yeiJdCiAgICB9OwogICAgZmFTaW1wbHlidWlsdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzaW1wbHlidWlsdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjE1IiwgIk00ODEuNiA2NGwtMTA2IDBDMzYxLjEgNjQgMzQ5IDc1LjggMzQ5IDkwLjNsMCAzOS42LTE4NS4zIDAgMC0zOS42YzAtMTQuNS0xMi0yNi4zLTI2LjYtMjYuM2wtMTA2IDBDMTYuNSA2NCA0LjcgNzUuOCA0LjcgOTAuM2wwIDMzMS40YzAgMTQuNSAxMS44IDI2LjMgMjYuNiAyNi4zbDQ1MC40IDBjMTQuOCAwIDI2LjYtMTEuOCAyNi42LTI2LjNsMC0zMzEuNGMtLjItMTQuNS0xMi0yNi4zLTI2LjctMjYuM3pNMTUwLjUgMjIyLjdhNjYuNSA2Ni41IDAgMSAxIC0uMyAxMzMuMSA2Ni41IDY2LjUgMCAxIDEgLjMtMTMzLjF6bTIxMS45IC4xYTY2LjUgNjYuNSAwIDEgMSAuMyAxMzIuOSA2Ni41IDY2LjUgMCAxIDEgLS4zLTEzMi45eiJdCiAgICB9OwogICAgZmFTdHViYmVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInN0dWJiZXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTVjNyIsICJNMTM2LjUgMjk0LjJsNTguOCAyMi45YzkuMS0zNi44IDI1LjQtNjEuMSA1NS02MS4xIDQ5LjQgMCA3MS40IDYzLjYgMTQyLjQgNjMuNiAxNS42IDAgMzUuOS0yLjggNTUuMy0xMy4zbDAgNjEuN2MwIDYxLjgtNTAuNCAxMTItMTEyLjMgMTEyTDAgNDgwIDQxLjggNDI0IDAgMzY4IDQxLjcgMzEyIDAgMjU2LjEgNDEuOCAyMDAuMSAwIDE0NC4xIDQxLjggODggMCAzMiAzMzUuNyAzMkMzOTcuNiAzMiA0NDggODIuMyA0NDggMTQ0LjFsMCA1MS4zYy05LjIgMzYuMy0yNS45IDYwLjYtNTUgNjAuNi00OS42IDAtNzEuNi02My41LTE0Mi40LTYzLjUtMzUuOSAwLTk1LjIgMTQuNi0xMTQuMSAxMDEuNmwwIC4xeiJdCiAgICB9OwogICAgZmFBcHBlciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhcHBlciIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmMzcxIiwgIk00Mi4xIDIzOS4xYzIyLjIgMCAyOSAyLjggMzMuNSAxNC42bC44IDAgMC0yMi45YzAtMTEuMy00LjgtMTUuNC0xNy45LTE1LjQtMTEuMyAwLTE0LjQgMi41LTE1LjEgMTIuOGwtMzguNiAwYy4zLTEzLjkgMS41LTE5LjEgNS44LTI0LjQgNy4zLTguOCAxOC45LTExLjggNDYuMS0xMS44IDMzIDAgNDcuMSA1IDUzLjkgMTguOSAyIDQuMyA0IDE1LjYgNCAyMy43bDAgNzYuMy0zOC4zIDAgMS4zLTE5LjEtMSAwYy01LjMgMTUuNi0xMy42IDIwLjQtMzUuNSAyMC40LTMwLjMgMC00MS4xLTEwLjEtNDEuMS0zNy4zIDAtMjUuMiAxMi4zLTM1LjggNDIuMS0zNS44em0xNy4xIDQ4LjFjMTMuMSAwIDE2LjktMyAxNi45LTEzLjQgMC05LjEtNC4zLTExLjYtMTkuNi0xMS42LTEzLjEgMC0xNy45IDMtMTcuOSAxMi4xLS4xIDEwLjQgMy43IDEyLjkgMjAuNiAxMi45ek0xMzcgMTkyLjNsMzguMyAwLTEuNSAyMC42IC44IDBjOS4xLTE3LjEgMTUuOS0yMC45IDM3LjUtMjAuOSAxNC40IDAgMjQuNyAzIDMxLjUgOS4xIDkuOCA4LjYgMTIuOCAyMC40IDEyLjggNDguMSAwIDMwLTMgNDMuMS0xMi4xIDUyLjktNi44IDcuMy0xNi40IDEwLjEtMzMuMiAxMC4xLTIwLjQgMC0yOS4yLTUuNS0zMy44LTIxLjJsLS44IDAgMCA3MC4zLTM5LjUgMCAwLTE2OXpNMjE3LjkgMjUzYzAtMjcuNS0zLjMtMzIuNS0yMC43LTMyLjUtMTYuOSAwLTIwLjcgNS0yMC43IDI4LjcgMCAyOCAzLjUgMzMuNSAyMS4yIDMzLjUgMTYuNCAwIDIwLjItNS42IDIwLjItMjkuN3ptNTcuOS02MC43bDM4LjMgMC0xLjUgMjAuNiAuOCAwYzkuMS0xNy4xIDE1LjktMjAuOSAzNy41LTIwLjkgMTQuNCAwIDI0LjcgMyAzMS41IDkuMSA5LjggOC42IDEyLjggMjAuNCAxMi44IDQ4LjEgMCAzMC0zIDQzLjEtMTIuMSA1Mi45LTYuOCA3LjMtMTYuNCAxMC4xLTMzLjMgMTAuMS0yMC40IDAtMjkuMi01LjUtMzMuOC0yMS4ybC0uOCAwIDAgNzAuMy0zOS41IDAgMC0xNjkgLjEgMHpNMzU2LjcgMjUzYzAtMjcuNS0zLjMtMzIuNS0yMC43LTMyLjUtMTYuOSAwLTIwLjcgNS0yMC43IDI4LjcgMCAyOCAzLjUgMzMuNSAyMS4yIDMzLjUgMTYuNCAwIDIwLjItNS42IDIwLjItMjkuN3ptNTMuOC0zLjhjMC0yNS40IDMuMy0zNy44IDEyLjMtNDUuOCA4LjgtOC4xIDIyLjItMTEuMyA0NS4xLTExLjMgNDIuOCAwIDU1LjcgMTIuOCA1NS43IDU1LjdsMCAxMS4xLTc1LjMgMGMtLjMgMi0uMyA0LS4zIDQuOCAwIDE2LjkgNC41IDIxLjkgMjAuMSAyMS45IDEzLjkgMCAxNy45LTMgMTcuOS0xMy45bDM3LjUgMCAwIDIuM2MwIDkuOC0yLjUgMTguOS02LjggMjQuNy03LjMgOS44LTE5LjYgMTMuNi00NC4zIDEzLjYtMjcuNSAwLTQxLjYtMy4zLTUwLjYtMTIuMy04LjUtOC41LTExLjMtMjEuMy0xMS4zLTUwLjh6bTc2LjQtMTEuNmMtLjMtMS44LS4zLTMuMy0uMy0zLjggMC0xMi4zLTMuMy0xNC42LTE5LjYtMTQuNi0xNC40IDAtMTcuMSAzLTE4LjEgMTUuMWwtLjMgMy4zIDM4LjMgMHptNTUuNi00NS4zbDM4LjMgMC0xLjggMTkuOSAuNyAwYzYuOC0xNC45IDE0LjQtMjAuMiAyOS43LTIwLjIgMTAuOCAwIDE5LjEgMy4zIDIzLjQgOS4zIDUuMyA3LjMgNi44IDE0LjQgNi44IDM0IDAgMS41IDAgNSAuMiA5LjNsLTM1IDBjLjMtMS44IC4zLTMuMyAuMy00IDAtMTUuNC0yLTE5LjQtMTAuMy0xOS40LTYuMyAwLTEwLjggMy4zLTEzLjEgOS4zLTEgMy0xIDQuMy0xIDEyLjNsMCA2OC0zOC4zIDAgMC0xMTguNSAuMSAweiJdCiAgICB9OwogICAgZmFHb29nbGVTY2hvbGFyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdvb2dsZS1zY2hvbGFyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU2M2IiLCAiTTM5MC45IDI5OC41czAgLjEgLjEgLjFjOS4yIDE5LjQgMTQuNCA0MS4xIDE0LjQgNjQtLjEgODIuNS02Ni45IDE0OS40LTE0OS40IDE0OS40UzEwNi43IDQ0NS4xIDEwNi43IDM2Mi43YzAtMjIuOSA1LjItNDQuNiAxNC40LTY0IDEuNy0zLjYgMy42LTcuMiA1LjYtMTAuNyA0LjQtNy42IDkuNC0xNC43IDE1LTIxLjMgMjcuNC0zMi42IDY4LjUtNTMuMyAxMTQuNC01My4zIDMzLjYgMCA2NC42IDExLjEgODkuNiAyOS45IDkuMSA2LjkgMTcuNCAxNC43IDI0LjggMjMuNSA1LjYgNi42IDEwLjYgMTMuOCAxNSAyMS4zIDIgMy40IDMuOCA3IDUuNSAxMC41bC0uMS0uMXptMjYuNC0xOC44Yy0zMC4xLTU4LjQtOTEtOTguNC0xNjEuMy05OC40cy0xMzEuMiA0MC0xNjEuMyA5OC40bC05NC43LTc3IDI1Ni0yMDIuNyAyNTYgMjAyLjctOTQuNyA3Ny4xIDAtLjF6Il0KICAgIH07CiAgICBmYVlhcm4gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAieWFybiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmN2UzIiwgIk00MDEuOSAzNDUuMmMtMzkgOS4zLTQ4LjQgMzIuMS0xMDQgNDcuNCAwIDAtMi43IDQtMTAuNCA1LjgtMTMuNCAzLjMtNjMuOSA2LTY4LjUgNi4xLTEyLjQgLjEtMTkuOS0zLjItMjItOC4yLTYuNC0xNS4zIDkuMi0yMiA5LjItMjItOC4xLTUtOS05LjktOS44LTguMS0yLjQgNS44LTMuNiAyMC4xLTEwLjEgMjYuNS04LjggOC45LTI1LjUgNS45LTM1LjMgLjgtMTAuOC01LjcgLjgtMTkuMiAuOC0xOS4ycy01LjggMy40LTEwLjUtMy42Yy02LTkuMy0xNy4xLTM3LjMgMTEuNS02Mi0xLjMtMTAuMS00LjYtNTMuNyA0MC42LTg1LjYgMCAwLTIwLjYtMjIuOC0xMi45LTQzLjMgNS0xMy40IDctMTMuMyA4LjYtMTMuOSA1LjctMi4yIDExLjMtNC42IDE1LjQtOS4xIDIwLjYtMjIuMiA0Ni44LTE4IDQ2LjgtMThzMTIuNC0zNy44IDIzLjktMzAuNGMzLjUgMi4zIDE2LjMgMzAuNiAxNi4zIDMwLjZzMTMuNi03LjkgMTUuMS01YzguMiAxNiA5LjIgNDYuNSA1LjYgNjUuMS02LjEgMzAuNi0yMS40IDQ3LjEtMjcuNiA1Ny41LTEuNCAyLjQgMTYuNSAxMCAyNy44IDQxLjMgMTAuNCAyOC42IDEuMSA1Mi43IDIuOCA1NS4zIC44IDEuNCAxMy43IC44IDM2LjQtMTMuMiAxMi44LTcuOSAyOC4xLTE2LjkgNDUuNC0xNyAxNi43LS41IDE3LjYgMTkuMiA0LjkgMjIuMnpNOCAyNTZhMjQ4IDI0OCAwIDEgMSA0OTYgMCAyNDggMjQ4IDAgMSAxIC00OTYgMHptNDE2LjcgNzUuMmMtMS43LTEzLjYtMTMuMi0yMy0yOC0yMi44LTIyIC4zLTQwLjUgMTEuNy01Mi44IDE5LjItNC44IDMtOC45IDUuMi0xMi40IDYuOCAzLjEtNDQuNS0yMi41LTczLjEtMjguNy03OS40IDcuOC0xMS4zIDE4LjQtMjcuOCAyMy40LTUzLjIgNC4zLTIxLjcgMy01NS41LTYuOS03NC41LTEuNi0zLjEtNy40LTExLjItMjEtNy40LTkuNy0yMC0xMy0yMi4xLTE1LjYtMjMuOC0xLjEtLjctMjMuNi0xNi40LTQxLjQgMjgtMTIuMiAuOS0zMS4zIDUuMy00Ny41IDIyLjgtMiAyLjItNS45IDMuOC0xMC4xIDUuNGwuMSAwYy04LjQgMy0xMi4zIDkuOS0xNi45IDIyLjMtNi41IDE3LjQgLjIgMzQuNiA2LjggNDUuNy0xNy44IDE1LjktMzcgMzkuOC0zNS43IDgyLjUtMzQgMzYtMTEuOCA3My01LjYgNzkuNi0xLjYgMTEuMSAzLjcgMTkuNCAxMiAyMy44IDEyLjYgNi43IDMwLjMgOS42IDQzLjkgMi44IDQuOSA1LjIgMTMuOCAxMC4xIDMwIDEwLjEgNi44IDAgNTgtMi45IDcyLjYtNi41IDYuOC0xLjYgMTEuNS00LjUgMTQuNi03LjEgOS44LTMuMSAzNi44LTEyLjMgNjIuMi0yOC43IDE4LTExLjcgMjQuMi0xNC4yIDM3LjYtMTcuNCAxMi45LTMuMiAyMS0xNS4xIDE5LjQtMjguMnoiXQogICAgfTsKICAgIGZhU3RhY2tPdmVyZmxvdyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzdGFjay1vdmVyZmxvdyIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMTZjIiwgIk0yOTEgMzExbC0xOTUuNy00MS4zLTguMiAzOS4zIDE5NS43IDQxIDguMi0zOXptNTEtODdMMTg4LjUgOTUuNyAxNjMgMTI2LjUgMzE2LjUgMjU0LjggMzQyIDIyNHptLTMxLjIgMzkuN0wxMjkuNSAxNzkgMTEyLjggMjE1LjUgMjk0IDMwMCAzMTAuOCAyNjMuN3pNMjYyLjMgMzJsLTMyIDI0IDExOS4zIDE2MC4zIDMyLTI0LTExOS4zLTE2MC4zem0yMC41IDMyOGwtMjAwIDAgMCAzOS43IDIwMCAwIDAtMzkuN3ptMzkuNyA4MGwtMjc5LjUgMCAwLTEyMC00MCAwIDAgMTYwIDM1OS41IDAgMC0xNjAtNDAgMCAwIDEyMHoiXQogICAgfTsKICAgIGZhQmx1ZXRvb3RoID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImJsdWV0b290aCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMjkzIiwgIk0yNjAuNiAxNzEuMWwtNDIuOSA0Mi45LS4zLTg2IDQzLjIgNDMuMXpNMjE3LjQgMzkwLjlsNDMuMS00My4xLTQyLjktNDIuOS0uMiA4NnpNMzg0IDI1OS40QzM4NCA0NjUgMzEyLjEgNTEyIDE5OC45IDUxMlMwIDQ2NSAwIDI1OS40IDgzLjQgMCAxOTYuNiAwIDM4NCA1My45IDM4NCAyNTkuNHptLTE1OC41IDBsNzkuNC04OC42LTEyNS4xLTEzNC4zIDAgMTc2LjktNzMuOC03My44LTI3IDI2LjkgOTIuNyA5My05Mi43IDkzIDI2LjkgMjYuOSA3My44LTczLjggMi4zIDE3MCAxMjcuNC0xMjcuNS04My45LTg4Ljd6Il0KICAgIH07CiAgICBmYUNyZWF0aXZlQ29tbW9uc05jSnAgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY3JlYXRpdmUtY29tbW9ucy1uYy1qcCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNGVhIiwgIk0yNTUuNyA4QzExMS42IDggOCAxMjQuOCA4IDI1NiA4IDM5Mi40IDExOS44IDUwNCAyNTUuNyA1MDQgMzg1LjkgNTA0IDUwNCA0MDMuMiA1MDQgMjU2IDUwNCAxMTcuMiAzOTYuNSA4IDI1NS43IDh6bS42IDQ1MC43Yy0xMTIgMC0yMDMuNi05Mi41LTIwMy42LTIwMi43IDAtMjEuMSAzLTQxLjIgOS02MC4zbDEyNyA1Ni41LTI3LjkgMCAwIDM4LjYgNTguMSAwIDUuNyAxMS44IDAgMTguNy02My44IDAgMCAzOC43IDYzLjggMCAwIDU2IDYxLjcgMCAwLTU2IDY0LjIgMCAwLTM1LjcgODEgMzYuMWMtMS41IDIuMi01Ny4xIDk4LjMtMTc1LjIgOTguM3ptODcuNi0xMzcuM2wtNTcuNiAwIDAtMTguNyAyLjktNS42IDU0LjcgMjQuM3ptNi41LTUxLjRsMC0xNy44LTM4LjYgMCA2My0xMTYtNjUuOCAwLTQzLjQgOTYtMjMtMTAuMi0zOS42LTg1LjctNjUuOCAwIDI3LjMgNTEtODEuOS0zNi41YzI3LjgtNDQuMSA4Mi42LTk4LjEgMTczLjctOTguMSAxMTIuOCAwIDIwMyA5MCAyMDMgMjAzLjQgMCAyMS0yLjcgNDAuNi03LjkgNTlMMzUwLjQgMjcweiJdCiAgICB9OwogICAgZmFSZWRkaXQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicmVkZGl0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxYTEiLCAiTTAgMjU2QzAgMTE0LjYgMTE0LjYgMCAyNTYgMFM1MTIgMTE0LjYgNTEyIDI1NiAzOTcuNCA1MTIgMjU2IDUxMkwzNy4xIDUxMmMtMTMuNyAwLTIwLjUtMTYuNS0xMC45LTI2LjJMNzUgNDM3QzI4LjcgMzkwLjcgMCAzMjYuNyAwIDI1NnpNMzQ5LjYgMTUzLjZjMjMuNiAwIDQyLjctMTkuMSA0Mi43LTQyLjdzLTE5LjEtNDIuNy00Mi43LTQyLjdjLTIwLjYgMC0zNy44IDE0LjYtNDEuOCAzNC0zNC41IDMuNy02MS40IDMzLTYxLjQgNjguNGwwIC4yYy0zNy41IDEuNi03MS44IDEyLjMtOTkgMjkuMS0xMC4xLTcuOC0yMi44LTEyLjUtMzYuNS0xMi41LTMzIDAtNTkuOCAyNi44LTU5LjggNTkuOCAwIDI0IDE0LjEgNDQuNiAzNC40IDU0LjEgMiA2OS40IDc3LjYgMTI1LjIgMTcwLjYgMTI1LjJzMTY4LjctNTUuOSAxNzAuNi0xMjUuM2MyMC4yLTkuNiAzNC4xLTMwLjIgMzQuMS01NCAwLTMzLTI2LjgtNTkuOC01OS44LTU5LjgtMTMuNyAwLTI2LjMgNC42LTM2LjQgMTIuNC0yNy40LTE3LTYyLjEtMjcuNy0xMDAtMjkuMWwwLS4yYzAtMjUuNCAxOC45LTQ2LjUgNDMuNC00OS45IDQuNCAxOC44IDIxLjMgMzIuOCA0MS41IDMyLjhsLjEgLjJ6TTE3Ny4xIDI0Ni45YzE2LjcgMCAyOS41IDE3LjYgMjguNSAzOS4zcy0xMy41IDI5LjYtMzAuMyAyOS42LTMxLjQtOC44LTMwLjQtMzAuNSAxNS40LTM4LjMgMzIuMS0zOC4zbC4xLS4xem0xOTAuMSAzOC4zYzEgMjEuNy0xMy43IDMwLjUtMzAuNCAzMC41cy0yOS4zLTcuOS0zMC4zLTI5LjYgMTEuOC0zOS4zIDI4LjUtMzkuMyAzMS4yIDE2LjYgMzIuMSAzOC4zbC4xIC4xem0tNDguMSA1Ni43Yy0xMC4zIDI0LjYtMzQuNiA0MS45LTYzIDQxLjlzLTUyLjctMTcuMy02My00MS45Yy0xLjItMi45IC44LTYuMiAzLjktNi41IDE4LjQtMS45IDM4LjMtMi45IDU5LjEtMi45czQwLjcgMSA1OS4xIDIuOWMzLjEgLjMgNS4xIDMuNiAzLjkgNi41eiJdCiAgICB9OwogICAgZmFDb25uZWN0ZGV2ZWxvcCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjb25uZWN0ZGV2ZWxvcCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMjBlIiwgIk01NTAuOCAyNDFsLTUwLjEtODYuOGMxLjEtMi4xIDEuOS00LjYgMS45LTcuMiAwLTgtNi43LTE0LjctMTQuNy0xNUw0MzIuNCAzNi4xYy41LTEuNiAxLjEtMy4yIDEuMS00LjggMC04LjYtNy0xNS4zLTE1LjMtMTUuMy00LjggMC04LjggMi4xLTExLjggNS42bC0xMDYuNiAwYy0yLjctMy41LTYuNy01LjYtMTEuNS01LjZzLTguOCAyLjEtMTEuNSA1LjZsLTEwNi4xIDBjLTIuOS0zLjUtNy01LjYtMTEuOC01LjYtOC4zIDAtMTUuMyA2LjctMTUuMyAxNS4zIDAgMS42IC41IDMuNSAxLjEgNC44bC01NiA5Ny4yYy01LjQgMi40LTkuMSA3LjUtOS4xIDEzLjcgMCAuNSAuMyAxLjEgLjMgMS42TDI2LjYgMjQwLjdjLTcuMiAxLjMtMTIuNiA3LjUtMTIuNiAxNSAwIDcuMiA1LjEgMTMuNCAxMi4xIDE1bDU1LjIgOTUuNGMtLjUgMS42LS44IDIuOS0uOCA0LjggMCA3LjIgNS4xIDEzLjQgMTIuMSAxNC43bDUxLjcgODkuN2MtLjUgMS42LTEuMSAzLjUtMS4xIDUuNCAwIDguNiA3IDE1LjMgMTUuMyAxNS4zIDQuOCAwIDguOC0yLjEgMTEuNS01LjRsMTA2LjkgMGMyLjcgMy4yIDcgNS40IDExLjUgNS40czguOC0yLjEgMTEuNS01LjRsMTA3LjEgMGMyLjcgMi45IDYuNyA0LjggMTEgNC44IDguNiAwIDE1LjMtNyAxNS4zLTE1LjMgMC0xLjYtLjMtMi45LS44LTQuM2w1MS43LTkwLjNjNy0xLjMgMTIuMS03LjUgMTIuMS0xNC43IDAtMS42LS4zLTMuMi0uOC00LjhsNTQuOS05NS40YzctMS4zIDEyLjMtNy41IDEyLjMtMTUgMC03LjItNS4xLTEzLjQtMTEuOC0xNC43em0tMzk3IDIwOS43bC00My43LTc1LjggNDMuNyAwIDAgNzUuOHptMC04My44bC00My43IDBjLS4zLTEuMS0uOC0yLjEtMS4zLTMuMmw0NS00Ny40IDAgNTAuNnptMC02Mi40bC01MC40IDUzLjNjLTEuMy0uNS0yLjctMS4zLTQtMS42TDQzLjcgMjU5LjhjLjUtMS4zIC41LTIuNyAuNS00czAtMi40LS4zLTMuNWw1Mi05MGMyLjctLjMgNS40LTEuMSA3LjgtMi43bDUwLjEgNTIgMCA5Mi45em0wLTEwMi4zTDEwOCAxNTQuOGMxLjMtMi4xIDIuMS00LjggMi4xLTcuOCAwLS4zLS4zLS44LS4zLTEuMWw0My45LTE1LjggMCA3Mi4xem0wLTgwLjZsLTQzLjcgMTUuOCA0My43LTc1LjUgMCA1OS43em0zMjYuNSAzOS4xbC44IDEuMy0zNS40IDE2Ny4xLTYzLjgtNjcuMiA5OC0xMDEuNSAuMyAuM3pNMjkyLjEgMzU1LjFsMTEuNSAxMS44LTIyLjggMCAxMS4zLTExLjh6bS0uMy0xMS4zbC04My4zLTg1LjQgNzkuNi04NC40IDgzIDg3LjYtNzkuMyA4Mi4yem01LjQgNS45bDc5LjMtODIuMiA2Ny41IDcxLjMtNS45IDI4LjEtMTI0IDAtMTYuOS0xNy4xek00MTAuNyA0NC40YzEuMSAuNSAyLjEgMS4xIDMuNSAxLjNsNTcuOSAxMDAuNyAwIC41YzAgMi45IC44IDUuNiAyLjEgNy44bC05Ny41IDEwMS4yLTgzLTg3LjYgMTE3LjEtMTI0em0tOS4xLTIuMWwtMTEzLjYgMTIwLjMtNTcuMS02MC4zIDE2Ni4zLTYwIDQuMyAwem0tMTIzLjUgMGMyLjcgMi43IDYuMiA0LjMgMTAuMiA0LjNzNy41LTEuNiAxMC4yLTQuM2w3NSAwLTE0OC40IDUzLjYtNTAuOS01My42IDEwMy45IDB6TTE2MS45IDQ3LjlsMS4xLTIuMWMuOS0uMiAxLjgtLjUgMi43LS44bDUxLjIgNTMuOC01NC45IDE5LjggMC03MC43em0wIDc5LjNsNjAuOC0yMiA1OS43IDYzLjItNzkuNiA4NC4xLTQxLTQyLjEgMC04My4zem0wIDkyLjdsMzYuNCAzNy44LTM2LjQgMzguMyAwLTc2LjF6bTAgODcuOWw0Mi4xLTQ0LjUgODIuOCA4Ni0xNy4xIDE3LjctMTA3LjcgMCAwLTU5LjJ6bTcgMTYyLjFjLTEuNi0xLjYtMy41LTIuNy01LjktMy41bC0xLjEtMS42IDAtODkuNyA5OS45IDAtOTEuNiA5NC44LTEuMyAwem0xMjkuOSAwYy0yLjctMi40LTYuNC00LjMtMTAuNC00LjNzLTcuOCAxLjktMTAuNCA0LjNsLTk2LjQgMCA5MS42LTk0LjggMzguMyAwIDkxLjYgOTQuOC0xMDQuMiAwem0xMjAtMTEuOGwtNC4zIDcuNWMtMS4zIC4zLTIuNCAuOC0zLjUgMS4zbC04OS4yLTkxLjkgMTE0LjQgMC0xNy40IDgzem0xMi45LTIyLjJsMTIuOS02MC44IDIyIDAtMzQuOCA2MC44em0zNC44LTY4LjhsLTIwLjQgMCA0LjYtMjEuMiAxNy4xIDE4LjJjLS41IC44LTEuMSAxLjktMS4zIDIuOXptNjYuMi0xMDcuNGwtNTUuNCA5Ni43Yy0xLjMgLjUtMi43IDEuMS00IDEuOWwtMjAuNi0yMiAzNC42LTE2My45IDQ1LjggNzkuM2MtLjMgMS4zLS44IDIuNy0uOCA0LjMgMCAxLjMgLjMgMi40IC41IDMuN3oiXQogICAgfTsKICAgIGZhUmVzZWFyY2hnYXRlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInJlc2VhcmNoZ2F0ZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNGY4IiwgIk0wIDMybDAgNDQ4IDQ0OCAwIDAtNDQ4LTQ0OCAwek0yNjIuMiAzNjYuNGMtNi42IDMtMzMuMiA2LTUwLTE0LjItOS4yLTEwLjYtMjUuMy0zMy4zLTQyLjItNjMuNi04LjkgMC0xNC43IDAtMjEuNC0uNmwwIDQ2LjRjMCAyMy41IDYgMjEuMiAyNS44IDIzLjlsMCA4LjFjLTYuOS0uMy0yMy4xLS44LTM1LjYtLjgtMTMuMSAwLTI2LjEgLjYtMzMuNiAuOGwwLTguMWMxNS41LTIuOSAyMi0xLjMgMjItMjMuOWwwLTEwOS40YzAtMjIuNi02LjQtMjEtMjItMjMuOWwwLTguMWMyNS44IDEgNTMuMS0uNiA3MC45LS42IDMxLjcgMCA1NS45IDE0LjQgNTUuOSA0NS42IDAgMjEuMS0xNi43IDQyLjItMzkuMiA0Ny41IDEzLjYgMjQuMiAzMCA0NS42IDQyLjIgNTguOSA3LjIgNy44IDE3LjIgMTQuNyAyNy4yIDE0LjdsMCA3LjN6bTIyLjktMTM1Yy0yMy4zIDAtMzIuMi0xNS43LTMyLjItMzIuMmwwLTMyLjJjMC0xMi4yIDguOC0zMC40IDM0LTMwLjRzMzAuNCAxNy45IDMwLjQgMTcuOWwtMTAuNyA3LjJzLTUuNS0xMi41LTE5LjctMTIuNWMtNy45IDAtMTkuNyA3LjMtMTkuNyAxOS43bDAgMjYuOGMwIDEzLjQgNi42IDIzLjMgMTcuOSAyMy4zIDE0LjEgMCAyMS41LTEwLjkgMjEuNS0yNi44bC0xNy45IDAgMC0xMC43IDMwLjQgMGMwIDIwLjUgNC43IDQ5LjktMzQgNDkuOXpNMTY4LjYgMjc2LjFjLTkuNCAwLTEzLjYtLjMtMjAtLjhsMC02OS43YzYuNC0uNiAxNS0uNiAyMi41LS42IDIzLjMgMCAzNy4yIDEyLjIgMzcuMiAzNC41IDAgMjEuOS0xNSAzNi42LTM5LjcgMzYuNnoiXQogICAgfTsKICAgIGZhU2lnbmFsTWVzc2VuZ2VyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNpZ25hbC1tZXNzZW5nZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTY2MyIsICJNMjU2IDBjLTEzLjMgMC0yNi4zIDEtMzkuMSAzbDMuNyAyMy43QzIzMi4xIDI0LjkgMjQ0IDI0IDI1NiAyNHMyMy45IC45IDM1LjQgMi43TDI5NS4xIDNDMjgyLjMgMSAyNjkuMyAwIDI1NiAwem02MC44IDcuM2wtNS43IDIzLjNjMjMuNCA1LjcgNDUuNCAxNC45IDY1LjQgMjcuMWwxMi41LTIwLjVjLTIyLjEtMTMuNC00Ni40LTIzLjYtNzIuMi0yOS45em03Ni40IDYxLjZjMTkuMSAxNCAzNiAzMC45IDUwLjEgNTAuMWwxOS40LTE0LjJDNDQ3IDgzLjYgNDI4LjQgNjUgNDA3LjMgNDkuNUwzOTMuMSA2OC44em04MS43IDU0LjJsLTIwLjUgMTIuNWMxMi4yIDIwIDIxLjQgNDIgMjcuMSA2NS40bDIzLjMtNS43Yy02LjMtMjUuOC0xNi41LTUwLjEtMjkuOS03Mi4yem0xMC41IDk3LjVjMS44IDExLjUgMi43IDIzLjQgMi43IDM1LjRzLS45IDIzLjktMi43IDM1LjRsMjMuNyAzLjdjMS45LTEyLjcgMy0yNS44IDMtMzkuMXMtMS0yNi4zLTMtMzkuMWwtMjMuNyAzLjd6bS0zMSAxNTUuOWwyMC41IDEyLjVjMTMuNC0yMi4xIDIzLjYtNDYuNCAyOS45LTcyLjJsLTIzLjMtNS43Yy01LjcgMjMuNC0xNC45IDQ1LjQtMjcuMSA2NS40em04LjIgMzAuOGwtMTkuNC0xNC4yYy0xNCAxOS4xLTMwLjkgMzYtNTAuMSA1MC4xbDE0LjIgMTkuNGMyMS4xLTE1LjUgMzkuOC0zNC4xIDU1LjItNTUuMnptLTg2LjEgNDdjLTIwIDEyLjItNDIgMjEuNC02NS40IDI3LjFsNS43IDIzLjNjMjUuOC02LjMgNTAuMS0xNi41IDcyLjItMjkuOWwtMTIuNS0yMC41ek0yOTUuMSA1MDlsLTMuNy0yMy43QzI3OS45IDQ4Ny4xIDI2OCA0ODggMjU2IDQ4OHMtMjMuOS0uOS0zNS40LTIuN0wyMTYuOSA1MDljMTIuNyAxLjkgMjUuOCAzIDM5LjEgM3MyNi4zLTEgMzkuMS0zem0tOTQuMS0yNy42Yy0xNy42LTQuMy0zNC40LTEwLjYtNTAuMS0xOC42bC03LjgtNC0zMi44IDcuNyA1LjUgMjMuNCAyNC4zLTUuN2MxNy40IDguOSAzNS45IDE1LjggNTUuMyAyMC41bDUuNy0yMy4zek05NS40IDQ5NC42TDkwIDQ3MS4zIDQ4LjMgNDgxYy0xMC40IDIuNC0xOS43LTYuOS0xNy4zLTE3LjNsOS43LTQxLjYtMjMuNC01LjUtOS43IDQxLjZDMS4yIDQ4NiAyNiA1MTAuOCA1My44IDUwNC40bDQxLjYtOS43em0tNTAtOTIuOWw3LjctMzIuOC00LTcuOGMtOC0xNS43LTE0LjMtMzIuNS0xOC42LTUwLjFMNy4zIDMxNi43QzEyIDMzNi4xIDE4LjkgMzU0LjcgMjcuNyAzNzJsLTUuNyAyNC4zIDIzLjQgNS41ek0zIDI5NS4xbDIzLjctMy43QzI0LjkgMjc5LjkgMjQgMjY4IDI0IDI1NnMuOS0yMy45IDIuNy0zNS40TDMgMjE2LjlDMSAyMjkuNyAwIDI0Mi43IDAgMjU2czEgMjYuMyAzIDM5LjF6bTI3LjYtOTQuMWM1LjctMjMuNCAxNC45LTQ1LjQgMjcuMS02NS40TDM3LjIgMTIzLjFjLTEzLjQgMjIuMS0yMy42IDQ2LjQtMjkuOSA3Mi4ybDIzLjMgNS43em0xOC45LTk2LjJsMTkuNCAxNC4yYzE0LTE5LjEgMzAuOS0zNiA1MC4xLTUwLjFMMTA0LjcgNDkuNUM4My42IDY1IDY1IDgzLjYgNDkuNSAxMDQuN3ptODYuMS00N2MyMC0xMi4yIDQyLTIxLjQgNjUuNC0yNy4xTDE5NS4yIDcuM2MtMjUuOCA2LjMtNTAuMSAxNi41LTcyLjIgMjkuOWwxMi41IDIwLjV6TTI1NiA0NjRjMTE0LjkgMCAyMDgtOTMuMSAyMDgtMjA4UzM3MC45IDQ4IDI1NiA0OCA0OCAxNDEuMSA0OCAyNTZjMCAzNi40IDkuNCA3MC43IDI1LjggMTAwLjUgMS42IDIuOSAyLjEgNi4yIDEuNCA5LjRsLTIxLjYgOTIuNSA5Mi41LTIxLjZjMy4yLS43IDYuNS0uMiA5LjQgMS40IDI5LjggMTYuNSA2NCAyNS44IDEwMC41IDI1Ljh6Il0KICAgIH07CiAgICBmYVhpbmcgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAieGluZyIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMTY4IiwgIk0xNjIuNyAyMTBjLTEuOCAzLjMtMjUuMiA0NC40LTcwLjEgMTIzLjUtNC45IDguMy0xMC44IDEyLjUtMTcuNyAxMi41TDkuOCAzNDZjLTcuNyAwLTEyLjEtNy41LTguNS0xNC40bDY5LTEyMS4zYy4yIDAgLjItLjEgMC0uM0wyNi40IDEzNC40Yy00LjMtNy44IC4zLTE0LjEgOC41LTE0LjFsNjUuMSAwYzcuMyAwIDEzLjMgNC4xIDE4IDEyLjJMMTYyLjcgMjEwek0zODIuNiA0Ni4xbC0xNDQgMjUzIDAgLjMgOTEuNiAxNjYuNmMzLjkgNy4xIC4yIDE0LjEtOC41IDE0LjFsLTY1LjIgMGMtNy42IDAtMTMuNi00LTE4LTEyLjJMMTQ2LjEgMjk5LjRjMy4zLTUuOCA1MS41LTkwLjggMTQ0LjgtMjU1LjIgNC42LTguMSAxMC40LTEyLjIgMTcuNS0xMi4ybDY1LjcgMGM4IDAgMTIuMyA2LjcgOC41IDE0LjF6Il0KICAgIH07CiAgICBmYVNxdWFyZUpzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1qcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJqcy1zcXVhcmUiXSwgImYzYjkiLCAiTTQ0OCA5NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwek0xODAuOSA0NDQuOWMtMzMuNyAwLTUzLjItMTcuNC02My4yLTM4LjVMMTUyIDM4NS43YzYuNiAxMS43IDEyLjYgMjEuNiAyNy4xIDIxLjYgMTMuOCAwIDIyLjYtNS40IDIyLjYtMjYuNWwwLTE0My4xIDQyLjEgMCAwIDE0My43YzAgNDMuNi0yNS42IDYzLjUtNjIuOSA2My41em04NS44LTQzTDMwMSAzODIuMWM5IDE0LjcgMjAuOCAyNS42IDQxLjUgMjUuNiAxNy40IDAgMjguNi04LjcgMjguNi0yMC44IDAtMTQuNC0xMS40LTE5LjUtMzAuNy0yOGwtMTAuNS00LjVjLTMwLjQtMTIuOS01MC41LTI5LjItNTAuNS02My41IDAtMzEuNiAyNC4xLTU1LjYgNjEuNi01NS42IDI2LjggMCA0NiA5LjMgNTkuOCAzMy43TDM2OCAyOTBjLTcuMi0xMi45LTE1LTE4LTI3LjEtMTgtMTIuMyAwLTIwLjEgNy44LTIwLjEgMTggMCAxMi42IDcuOCAxNy43IDI1LjkgMjUuNmwxMC41IDQuNWMzNS44IDE1LjMgNTUuOSAzMSA1NS45IDY2LjIgMCAzNy44LTI5LjggNTguNi02OS43IDU4LjYtMzkuMSAwLTY0LjQtMTguNi03Ni43LTQzeiJdCiAgICB9OwogICAgZmFKc1NxdWFyZSA9IGZhU3F1YXJlSnM7CiAgICBmYUZvbnRpY29ucyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmb250aWNvbnMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjI4MCIsICJNMCAzMmwwIDQ0OCA0NDggMCAwLTQ0OC00NDggMHpNMTg3IDE3Mi45Yy0xOC40IDAtMTkgOS45LTE5IDI3LjRsMCAyMy4zYzAgMi40LTMuNSA0LjQtLjYgNC40bDY3LjQgMC0xMS4xIDM3LjMtNTUuNyAwIDAgMTEyLjljMCA1LjgtMiA2LjcgMy4yIDcuM2w0My41IDQuMSAwIDI1LjEtMTMwLjcgMCAwLTI1LjcgMjEuMy0yYzUuMi0uNiA2LjctMi4zIDYuNy03LjlsMC0xMTEuNGMwLTIuMy0yLjktMi4zLTUuOC0yLjNsLTIyLjIgMCAwLTM3LjQgMjggMCAwLTIxYzAtNDkuNiAyNi41LTcwIDc3LjMtNzAgMzQuMSAwIDY0LjcgOC4yIDY0LjcgNTIuOGwtNTAuNyA2LjFjLjMtMTguNy00LjQtMjMtMTYuMy0yM3ptNzQuMyAyNDEuOGwwLTI1LjEgMjAuNC0yLjZjNS4yLS42IDcuNi0xLjcgNy42LTcuM2wwLTEwNy45YzAtNC4xLTIuOS02LjctNi43LTcuOWwtMjQuMi02LjQgNi43LTI5LjUgODAuMiAwIDAgMTUxLjdjMCA1LjgtMi42IDYuNCAyLjkgNy4zbDE1LjcgMi42IDAgMjUuMS0xMDIuNiAwem04MC44LTI1NS41bDkgMzMuMi03LjMgNy4zLTMxLjItMTYuNi0zMS4yIDE2LjYtNy4zLTcuMyA5LTMzLjItMjEuOC0yNC4yIDMuNS05LjYgMjcuNyAwIDE1LjUtMjggOS4zIDAgMTUuNSAyOCAyNy43IDAgMy41IDkuNi0yMS45IDI0LjJ6Il0KICAgIH07CiAgICBmYVVwcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ1cHMiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjdlMCIsICJNMTAzLjIgMzAzYy01LjIgMy42LTMyLjYgMTMuMS0zMi42LTE5bDAtMTA0LTMyLjcgMCAwIDEwMi42YzAgNzQuOSA4MC4yIDUxLjEgOTcuOSAzOWwwLTE0MS42LTMyLjYgMCAwIDEyM3pNNCA3NC44TDQgMjk1LjdjMCAxMDMuNyA3NC45IDEzNS4yIDE4Ny43IDE4NC4xIDExMi40LTQ4LjkgMTg3LjctODAuMiAxODcuNy0xODQuMWwwLTIyMC45QzI2My4xIDEzLjIgOTcuNiAyNS4yIDQgNzQuOHpNMzYyLjEgMjk1LjdjMCA4Ni42LTUzLjIgMTEzLjYtMTcwLjQgMTY1LjMtMTE3LjUtNTEuOC0xNzAuNS03OC43LTE3MC41LTE2NS4zbDAtMTI2LjRjMTAyLjMtOTMuOCAyMzEuNi0xMDAgMzQwLjktODkuOGwwIDIxNi4yek0xNTIuNSAxODguM2wwIDIxMi44IDMyLjcgMCAwLTY4LjdjMjQuNCA3LjMgNzEuNy0yLjYgNzEuNy03OC41IDAtOTcuNC04MC43LTgwLjktMTA0LjQtNjUuNnptMzIuNyAxMTcuM2wwLTEwMC4zYzguNC00LjIgMzguNC0xMi43IDM4LjQgNDkuMyAwIDY3LjktMzYuNCA1MS44LTM4LjQgNTF6bTc5LjEtODYuNGMuMSA0Ny4zIDUxLjYgNDIuNSA1Mi4yIDcwLjQgLjYgMjMuNS0zMC40IDIzLTUwLjggNC45bDAgMzAuMWMzNi4yIDIxLjUgODEuOSA4LjEgODMuMi0zMy41IDEuNy01MS41LTU0LjEtNDYuNi01My40LTczLjIgLjYtMjAuMyAzMC42LTIwLjUgNDguNS0yLjJsMC0yOC40Yy0yOC41LTIyLTc5LjktOS4yLTc5LjcgMzEuOXoiXQogICAgfTsKICAgIGZhQW1hem9uUGF5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImFtYXpvbi1wYXkiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjQyYyIsICJNMTQgMzI1LjNjMi4zLTQuMiA1LjItNC45IDkuNy0yLjUgMTAuNCA1LjYgMjAuNiAxMS40IDMxLjIgMTYuNyA0MC42IDIwLjIgODMuMyAzNS44IDEyNy40IDQ2LjMgMjAuOCA1IDQxLjkgOSA2My4yIDExLjggMzEuNSA0LjIgNjMuMiA2IDk1IDUuMiAxNy40LS40IDM0LjgtMS44IDUyLjEtMy44IDU2LjItNi42IDExMS4xLTIxIDE2My4zLTQyLjggMi45LTEuMiA1LjktMiA5LjEtMS4yIDYuNyAxLjggOSA5IDQuMSAxMy45LTMgMi43LTYuMiA1LjItOS42IDcuNC0zMC43IDIxLjEtNjQuMiAzNi40LTk5LjYgNDcuOS0yNC41IDcuOS00OS42IDEzLjgtNzUuMSAxNy42LTE3LjYgMi43LTM1LjQgNC4zLTUzLjIgNC44LS44IDAtMS43IC4yLTIuNSAuM2wtMjEuMSAwYy0uOC0uMS0xLjctLjItMi41LS4zLTMuNi0uMi03LjItLjMtMTAuNy0uNC0xNi45LS44LTMzLjctMi41LTUwLjQtNS4zLTI3LjQtNC41LTU0LjMtMTEuNS04MC40LTIwLjktNTMuNy0xOS40LTEwMy4xLTQ4LjktMTQ1LjYtODctMS44LTEuNi0zLTMuOC00LjQtNS43bDAtMnpNMTcyIDY1LjFsLTQuMyAuNmMtMTMuOCAxLjctMjYuOCA2LjktMzggMTUuMS0yLjQgMS43LTQuNiAzLjUtNy4xIDUuNC0uMi0uNC0uMy0uOS0uNC0xLjQtLjQtMi43LS44LTUuNS0xLjMtOC4yLS43LTQuNi0zLTYuNi03LjYtNi42bC0xMS41IDBjLTYuOSAwLTguMiAxLjMtOC4yIDguMmwwIDIwOS4zYzAgMSAwIDIgLjEgMyAuMiAzIDIgNC45IDQuOSA1IDcgLjEgMTQuMSAuMSAyMS4xIDAgMi45IDAgNC43LTIgNS01IC4xLTEgLjEtMiAuMS0zbDAtNzIuNGMxLjEgLjkgMS43IDEuNCAyLjIgMS45IDE3LjkgMTQuOSAzOC41IDE5LjggNjEgMTUuNCAyMC40LTQgMzQuNi0xNi41IDQzLjgtMzQuOSA3LTEzLjkgOS45LTI4LjcgMTAuMy00NC4xIC41LTE3LjEtMS4yLTMzLjktOC4xLTQ5LjgtOC41LTE5LjYtMjIuNi0zMi41LTQzLjktMzYuOS0zLjItLjctNi41LTEtOS44LTEuNS0yLjgtLjEtNS41LS4xLTguMy0uMXpNMTI0LjYgMTA3Yy0uMS0uNyAuMS0xLjMgLjQtMS45cy44LTEuMSAxLjMtMS40YzEzLjctOS41IDI4LjgtMTQuNSA0NS42LTEzLjIgMTQuOSAxLjEgMjcuMSA4LjQgMzMuNSAyNS45IDMuOSAxMC43IDQuOSAyMS44IDQuOSAzMyAwIDEwLjQtLjggMjAuNi00IDMwLjYtNi44IDIxLjMtMjIuNCAyOS40LTQyLjYgMjguNS0xNC0uNi0yNi4yLTYtMzcuNC0xMy45LS42LS4zLTEtLjgtMS4zLTEuNHMtLjQtMS4yLS40LTEuOWMuMS0xNC4xIDAtMjguMSAwLTQyLjJzLjEtMjggMC00Mi4xek0zMzAuMyA2NS4xYy0xIC4xLTIgLjMtMi45IC40LTkuNyAuNC0xOS40IDEuOC0yOC45IDQuMS02LjEgMS42LTEyIDMuOC0xNy45IDUuOC0zLjYgMS4yLTUuNCAzLjgtNS4zIDcuNyAuMSAzLjMtLjEgNi42IDAgOS45IC4xIDQuOCAyLjEgNi4xIDYuOCA0LjkgNy44LTIgMTUuNi00LjIgMjMuNS01LjcgMTIuMy0yLjMgMjQuNy0zLjMgMzcuMi0xLjQgNi41IDEgMTIuNiAyLjkgMTYuOCA4LjQgMy43IDQuOCA1LjEgMTAuNSA1LjMgMTYuNCAuMyA4LjMgLjIgMTYuNiAuMyAyNC45IDAgLjUtLjEgLjktLjIgMS40LS41LS4xLS45IDAtMS4zLS4xLTEwLjUtMi42LTIxLjItNC4yLTMyLTQuOS0xMS4zLS42LTIyLjUgLjEtMzMuMyAzLjktMTIuOSA0LjUtMjMuMyAxMi4zLTI5LjQgMjQuOS00LjcgOS44LTUuNCAyMC4yLTMuOSAzMC43IDIgMTQgOSAyNC44IDIxLjQgMzEuNyAxMS45IDYuNiAyNC44IDcuNCAzNy45IDUuNCAxNS4xLTIuMyAyOC41LTguNyA0MC4zLTE4LjQgLjUtLjQgMS0uOCAxLjYtMS4xIC42IDMuOCAxLjEgNy40IDEuOCAxMSAuNiAzLjEgMi41IDUuMSA1LjQgNS4yIDUuNCAuMSAxMC45IC4xIDE2LjMgMCAxLjMgMCAyLjUtLjUgMy40LTEuNHMxLjQtMi4xIDEuNS0zLjNjLjEtLjkgLjEtMS45IC4xLTIuOGwwLTEwNmMwLTQuMy0uMy04LjYtLjktMTIuOS0xLjktMTIuOS03LjQtMjMuNS0xOS0zMC40LTYuNy00LTE0LjEtNi0yMS44LTcuMS0zLjYtLjUtNy4yLS44LTEwLjgtMS4zLTMuOSAuMS03LjkgLjEtMTEuOSAuMXptMzUgMTI3LjdjMCAuNi0uMSAxLjItLjMgMS43cy0uNyAxLTEuMiAxLjNjLTExLjIgOC4xLTIzLjUgMTMuNS0zNy40IDE0LjktNS43IC42LTExLjQgLjQtMTYuOC0xLjgtMy0xLjEtNS42LTIuOS03LjgtNS4ycy0zLjctNS4xLTQuNi04LjFjLTItNi4zLTItMTMuMS0uMS0xOS40IDIuNS04LjMgOC40LTEzIDE2LjQtMTUuNiA4LTIuNCAxNi41LTMuMiAyNC44LTIuMiA4LjQgLjcgMTYuNiAyLjMgMjUgMy40IDEuNiAuMiAyLjEgMSAyLjEgMi42LS4xIDQuOCAwIDkuNSAwIDE0LjNzLS4yIDkuNC0uMSAxNC4xek02MjUuMiAzMjIuMmMtMS01LTQuOC02LjktOS4xLTguMy02LjgtMi4xLTEzLjktMy41LTIxLTMuOS0xMy4xLTEuMS0yNi4zLS41LTM5LjIgMS45LTE0LjMgMi43LTI3LjkgNy4zLTQwIDE1LjYtMS40IC45LTIuNyAyLjEtMy43IDMuNS0uNCAuNi0uNiAxLjMtLjcgMS45czAgMS40IC4yIDIuMWMuNCAxLjUgMi4xIDEuOSAzLjYgMS44IC43IDAgMS41IDAgMi4yLS4xIDcuOC0uOCAxNS41LTEuNyAyMy4zLTIuNSAxMS40LTEuMSAyMi45LTEuOCAzNC4zLS45IDQuOSAuNCA5LjcgMS4zIDE0LjQgMi43IDUuMSAxLjQgNy40IDUuMiA3LjYgMTAuNCAuNCA4LTEuNCAxNS43LTMuNSAyMy4zLTQuMSAxNS40LTEwIDMwLjMtMTUuOCA0NS4xLS40IDEtLjggMi0xIDMtLjUgMi45IDEuMiA0LjggNC4xIDQuMSAxLjgtLjQgMy40LTEuMyA0LjgtMi41IDQuNS00LjIgOC44LTguNyAxMi43LTEzLjQgMTIuOC0xNi40IDIwLjMtMzUuMyAyNC43LTU1LjYgLjgtMy42IDEuNC03LjMgMi4xLTEwLjlsMC0xNy4zek00OTMuMSAxOTljLTEyLjktMzUuNy0yNS44LTcxLjQtMzguNy0xMDcuMi0yLTUuNy00LjItMTEuMy02LjMtMTYuOS0xLjEtMi45LTMuMi00LjgtNi40LTQuOC03LjYtLjEtMTUuMi0uMi0yMi45LS4xLTIuNSAwLTMuNyAyLTMuMiA0LjUgLjUgMi4xIDEuMSA0LjEgMS45IDYuMSAxOS42IDQ4LjUgMzkuMyA5NyA1OS4xIDE0NS41IDEuNyA0LjEgMi4xIDcuNiAuMiAxMS44LTMuMyA3LjMtNS45IDE1LTkuMyAyMi4zLTMgNi41LTggMTEuNC0xNS4yIDEzLjMtNSAxLjMtMTAuMiAxLjctMTUuNCAxLjEtMi41LS4yLTUtLjgtNy41LTEtMy40LS4yLTUuMSAxLjMtNS4yIDQuOC0uMSAzLjMtLjEgNi42IDAgOS45IC4xIDUuNSAyIDggNy40IDguOSA1LjYgMS4xIDExLjIgMS44IDE2LjkgMiAxNy4xIC40IDMwLjctNi41IDM5LjUtMjEuNCAzLjUtNS45IDYuNi0xMiA5LjItMTguNCAyMy43LTU5LjggNDcuMi0xMTkuNyA3MC42LTE3OS42IC43LTEuOCAxLjMtMy42IDEuNi01LjUgLjQtMi44LS45LTQuNC0zLjctNC40LTYuNi0uMS0xMy4zIDAtMTkuOSAwLTEuNy0uMS0zLjQgLjMtNC43IDEuM3MtMi40IDIuMy0zIDMuOWMtLjUgMS40LTEuMSAyLjctMS42IDQuMWwtMzQuOCAxMDBjLTIuNSA3LjItNS4xIDE0LjUtNy43IDIyLjItLjQtMS4xLS42LTEuNy0uOS0yLjR6Il0KICAgIH07CiAgICBmYVBhbmRvcmEgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicGFuZG9yYSIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlN2RhIiwgIk0yMDEuMyAzMkwwIDMyIDAgNDgwIDEyMC4yIDQ4MGMxMS4yIDAgMjAuMy05LjEgMjAuMy0yMC4zbDAtODYuMSAzMC4xIDBjMTQ3LjEgMCAyMDcuMy04Mi45IDIwNy4zLTE3OS45IDAtMTE5LjctOTAuOS0xNjEuOC0xNzYuNS0xNjEuOHoiXQogICAgfTsKICAgIGZhT3BlbmlkID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm9wZW5pZCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMTliIiwgIk0yNzEuNSA0MzJsLTY4IDMyQzg4LjUgNDUzLjcgMCAzOTIuNSAwIDMxOC4yIDAgMjQ2LjcgODIuNSAxODcuMiAxOTEuNyAxNzMuOWwwIDQzYy03MS41IDEyLjUtMTI0IDUzLTEyNCAxMDEuMyAwIDUxIDU4LjUgOTMuMyAxMzUuNyAxMDNsMC0zNDAgNjgtMzMuMiAwIDM4NCAuMSAwek00NDggMjkxbC0xMzEuMy0yOC41IDM2LjgtMjAuN2MtMTkuNS0xMS41LTQzLjUtMjAtNzAtMjQuOGwwLTQzYzQ2LjIgNS41IDg3LjcgMTkuNSAxMjAuMyAzOS4zbDM1LTE5LjggOS4yIDk3LjV6Il0KICAgIH07CiAgICBmYVZzY28gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidnNjbyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlN2RkIiwgIk0zNTcuNiAyNTZjMC0yNy4xLTEwLjYtNTIuNS0yOS43LTcxLjdzLTQ0LjYtMjkuNy03MS43LTI5LjdsLS4xIDBjLTI3LjEgMC01Mi42IDEwLjYtNzEuNyAyOS43cy0yOS43IDQ0LjYtMjkuNyA3MS43YzAgMjcuMSAxMC42IDUyLjUgMjkuNyA3MS43IDE5LjIgMTkuMiA0NC42IDI5LjcgNzEuNyAyOS43bC4xIDBjMjcuMSAwIDUyLjYtMTAuNiA3MS43LTI5LjcgMTkuMi0xOS4yIDI5LjctNDQuNiAyOS43LTcxLjd6TTE3Ni4zIDQ4Mi4xYzIzIDguMSA0NyAxMi42IDcxLjYgMTMuNGwwLTU5LjFjLTE3LjEtLjctMzMuNS0zLjgtNDktOC45bC0yMi42IDU0LjZ6bTEzNy01NC42Yy0xNS41IDUuMS0zMiA4LjItNDkgOC45bDAgNTkuMWMyNC42LS44IDQ4LjYtNS4zIDcxLjYtMTMuNGwtMjIuNi01NC42ek05Mi41IDQzMS4yYzIwLjIgMTguOSA0My4zIDM0IDY4LjcgNDVsMjIuNS01NC41Yy0xOC4zLTcuOS0zNS4xLTE4LjgtNDkuOC0zMS45TDkyLjUgNDMxLjJ6bTI4NS45LTQxLjRjLTE0LjYgMTMuMi0zMS40IDI0LTQ5LjggMzEuOWwyMi41IDU0LjVjMjUuNC0xMSA0OC40LTI2LjEgNjguNy00NWwtNDEuNC00MS40ek0xNDUuNCAzNzguMmMxMy42IDEyLjEgMjkgMjEuOSA0NS44IDI5IDE4IDcuNiAzNy4xIDEyIDU2LjcgMTIuOWwwLTQ2LjhjLTI2LjQtMS44LTUwLjMtMTIuMy02OS4xLTI4LjZsLTMzLjQgMzMuNHptMTg4LTMzLjRjLTE4LjggMTYuMy00Mi43IDI2LjgtNjkuMSAyOC42bDAgNDYuOGMxOS42LS45IDM4LjctNS4zIDU2LjctMTIuOSAxNi44LTcuMSAzMi4yLTE2LjkgNDUuOC0yOWwtMzMuNC0zMy40ek0zOC41IDM1Ni42YzEwLjcgMjMuMiAyNSA0NC4zIDQyLjUgNjMuMWw0MS4zLTQxLjNjLTEyLjQtMTMuNC0yMi45LTI4LjYtMzAuOS00NS4yTDM4LjUgMzU2LjZ6bTM4Mi40LTIzLjVjLTggMTYuNi0xOC41IDMxLjktMzAuOSA0NS4ybDQxLjMgNDEuM2MxNy41LTE4LjcgMzEuOC0zOS45IDQyLjUtNjMuMWwtNTIuOS0yMy41em0tMzMxLTY5YzEuMSAxOC44IDUuNCAzNy4yIDEyLjggNTQuNSA3LjUgMTcuOCAxOCAzNCAzMS4yIDQ4LjJsMzMuNS0zMy41Yy0xNi40LTE4LjgtMjYuOS00Mi44LTI4LjctNjkuMmwtNDguOCAwem0yODMuNyAwYy0xLjggMjYuNC0xMi4zIDUwLjQtMjguNyA2OS4ybDMzLjUgMzMuNWMxMy4xLTE0LjIgMjMuNi0zMC40IDMxLjItNDguMiA3LjMtMTcuNCAxMS42LTM1LjcgMTIuNy01NC41bC00OC43IDB6bS0zNTcuMSAwYy45IDI2LjcgNi4xIDUyLjcgMTUuNiA3Ny41TDg1IDMxOC4yYy02LjQtMTctMTAuMy0zNS4xLTExLjMtNTRsLTU3LjEgMHptNDIyLjEgMGMtMSAxOC45LTUgMzcuMS0xMS4zIDU0bDUyLjggMjMuNWM5LjUtMjQuOCAxNC43LTUwLjggMTUuNi03Ny41bC01Ny4xIDB6TTMyLjEgMTcwLjRjLTkuNSAyNC44LTE0LjcgNTAuOC0xNS42IDc3LjVsNTcuMSAwYzEtMTguOSA1LTM3LjEgMTEuMy01NEwzMi4xIDE3MC40em0xMDEuNy0yNS4yYy0xMy4xIDE0LjItMjMuNiAzMC40LTMxLjIgNDguMi03LjMgMTcuNC0xMS42IDM1LjctMTIuOCA1NC41bDQ4LjggMGMxLjgtMjYuNCAxMi4zLTUwLjQgMjguNy02OS4ybC0zMy41LTMzLjV6bTIxMS4xIDMzLjVjMTYuNCAxOC44IDI2LjkgNDIuOCAyOC43IDY5LjJsNDguNyAwYy0xLjEtMTguOC01LjQtMzcuMi0xMi43LTU0LjUtNy41LTE3LjgtMTgtMzQtMzEuMi00OC4ybC0zMy41IDMzLjV6bTgyLjQgMTUuMmM2LjQgMTcgMTAuMyAzNS4xIDExLjMgNTRsNTcuMSAwYy0uOS0yNi43LTYuMS01Mi43LTE1LjYtNzcuNWwtNTIuOCAyMy41ek04MSA5Mi4zQzYzLjQgMTExIDQ5LjIgMTMyLjIgMzguNSAxNTUuNGw1Mi45IDIzLjVjOC0xNi42IDE4LjUtMzEuOSAzMC45LTQ1LjJMODEgOTIuM3ptMzA5IDQxLjNjMTIuNCAxMy40IDIyLjkgMjguNiAzMC45IDQ1LjJsNTIuOS0yMy41Yy0xMC43LTIzLjItMjUtNDQuMy00Mi41LTYzLjFMMzkwIDEzMy43ek0yNDggOTEuOGMtMTkuNiAuOS0zOC43IDUuMy01Ni43IDEyLjktMTYuOCA3LjEtMzIuMiAxNi45LTQ1LjggMjlsMzMuNCAzMy40YzE4LjgtMTYuMyA0Mi43LTI2LjggNjkuMS0yOC42bDAtNDYuN3ptMTYuMyA0Ni43YzI2LjQgMS44IDUwLjMgMTIuMyA2OS4xIDI4LjZsMzMuNC0zMy40Yy0xMy42LTEyLjEtMjktMjEuOS00NS44LTI5LTE4LTcuNi0zNy4xLTEyLTU2LjctMTIuOWwwIDQ2Ljd6TTE2MS4yIDM1LjhjLTI1LjQgMTEtNDguNCAyNi4xLTY4LjcgNDVsNDEuNCA0MS40YzE0LjctMTMuMiAzMS40LTI0IDQ5LjgtMzEuOUwxNjEuMiAzNS44ek0zMjguNiA5MC4zYzE4LjMgNy45IDM1LjEgMTguOCA0OS44IDMxLjlsNDEuNC00MS40Yy0yMC4yLTE4LjktNDMuMy0zNC02OC43LTQ1TDMyOC42IDkwLjN6TTI0OCAxNi40Yy0yNC42IC44LTQ4LjYgNS4zLTcxLjYgMTMuNGwyMi42IDU0LjZjMTUuNS01LjEgMzItOC4yIDQ5LTguOWwwLTU5LjF6bTE2LjMgNTkuMWMxNy4xIC43IDMzLjUgMy44IDQ5IDguOWwyMi42LTU0LjZjLTIzLTguMS00Ny0xMi42LTcxLjYtMTMuNGwwIDU5LjF6TTUxMi4yIDI2NC4ybC0uMiAwQzUwNy44IDM5OSAzOTkuMiA1MDcuNyAyNjQuMyA1MTEuOWwwIC4xLTE2LjMgMCAwLS4xQzExMy4xIDUwNy43IDQuNSAzOTkgLjIgMjY0LjFsLS4yIDAgMC0xNi4zIC4yIDBDNC41IDExMyAxMTMuMSA0LjMgMjQ4IC4xbDAtLjEgMTYuMyAwIDAgLjFDMzk5LjIgNC4zIDUwNy44IDExMyA1MTIgMjQ3LjlsLjIgMCAwIDE2LjN6Il0KICAgIH07CiAgICBmYVVidW50dSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ1YnVudHUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjdkZiIsICJNNDY5LjIgNzVjMC0yMC4xLTgtMzkuMy0yMi4yLTUzLjVzLTMzLjQtMjIuMi01My41LTIyLjItMzkuMyA4LTUzLjUgMjIuMi0yMi4yIDMzLjQtMjIuMiA1My41YzAgMjAuMSA4IDM5LjMgMjIuMSA1My41czMzLjQgMjIuMSA1My41IDIyLjEgMzkuMy04IDUzLjUtMjIuMSAyMi4xLTMzLjQgMjIuMS01My41bC4xIDB6bS0zMTUgMTY1LjdhNzUuNiA3NS42IDAgMSAwIC0xNTEuMiAwIDc1LjYgNzUuNiAwIDEgMCAxNTEuMiAwek01NyAzNDZjMTguNiA0Ni45IDUxIDg3IDkzIDExNS4xczkxLjUgNDIuNiAxNDIgNDEuN2MtMTQuNy0xOC42LTIyLjktNDEuNS0yMy4yLTY1LjItNi44LS45LTEzLjMtMi4xLTE5LjUtMy40LTI2LjgtNS43LTUxLjktMTcuMy03My42LTM0cy0zOS4zLTM4LjEtNTEuNy02Mi41Yy0yMC45IDkuOS00NC41IDEyLjgtNjcuMSA4LjJsLjEgLjF6bTM5NS4xIDg5LjhhNzUuNiA3NS42IDAgMSAwIC0xNTEuMiAwIDc1LjYgNzUuNiAwIDEgMCAxNTEuMiAwek00NDQgMzUxLjZjMTguNSAxNC44IDMxLjYgMzUuMiAzNy4yIDU4LjIgMzMuMy00MS4zIDUyLjYtOTIuMiA1NC44LTE0NS4ycy0xMi41LTEwNS40LTQyLjItMTQ5LjRjLTguNiAyMS41LTI0IDM5LjYtNDMuOCA1MS42IDE1LjQgMjguNiAyMi45IDYwLjggMjEuOSA5My4ycy0xMC43IDY0LTI4IDkxLjZsLjEgMHpNMTAxLjEgMTM1LjRjMTIuNCAyLjcgMjQuMyA3LjUgMzUuMSAxNC4zIDE2LjYtMjQuMiAzOC45LTQ0LjEgNjQuOC01OFMyNTUuOCA3MC40IDI4NS4yIDcwYy4yLTUuOSAuOS0xMS45IDItMTcuNyAzLjYtMTYuNyAxMS4xLTMyLjMgMjEuOC00NS41LTQ3LjctMy44LTk1LjQgNi0xMzcuNiAyOC41Uzk0LjMgOTEuNyA3MC44IDEzMy40YzIuNy0uMiA1LjMtLjMgOC0uMyA3LjUgMCAxNSAuOCAyMi40IDIuM2wtLjEgMHoiXQogICAgfTsKICAgIGZhVmlhY29pbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ2aWFjb2luIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYyMzciLCAiTTM4NCAzMmwtNjQgMC04MC43IDE5Mi05NC41IDAtODAuOC0xOTItNjQgMCA0OCAxMTItNDggMCAwIDQ4IDY4LjUgMCAxMy44IDMyLTgyLjMgMCAwIDQ4IDEwMi44IDAgODkuMiAyMDggODkuMi0yMDggMTAyLjggMCAwLTQ4LTgyLjMgMCAxMy44LTMyIDY4LjUgMCAwLTQ4LTQ4IDAgNDgtMTEyek0xOTIgMzM2bC0yNy02NCA1NCAwLTI3IDY0eiJdCiAgICB9OwogICAgZmFaaGlodSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ6aGlodSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNjNmIiwgIk0xNzAuNSAxNDguMWwwIDIxNy41IDIzLjQgMCA3LjcgMjYuNCA0Mi0yNi40IDQ5LjUgMCAwLTIxNy41LTEyMi43IDB6bTk3LjggMTkzLjlsLTI3LjkgMC0yNy45IDE3LjUtNS4xLTE3LjUtMTEuOSAwIDAtMTcwLjMgNzIuOCAwIDAgMTcwLjN6TTE0OS44IDI0Ny43bC01Mi4zIDBjMS43LTI3LjEgMi4yLTUxLjYgMi4yLTczLjVsNTEuMiAwczItMjIuNi04LjYtMjIuM2wtODguNSAwYzMuNS0xMy4xIDcuOS0yNi43IDEzLjEtNDAuNyAwIDAtMjQuMSAwLTMyLjMgMjEuNi0zLjQgOC45LTEzLjIgNDMuMS0zMC43IDc4LjEgNS45LS42IDI1LjQtMS4yIDM2LjgtMjIuMiAyLjEtNS45IDIuNS02LjcgNS4xLTE0LjVsMjguOSAwYzAgMTAuNS0xLjIgNjYuOS0xLjcgNzMuNGwtNTIuMyAwYy0xMS43IDAtMTUuNiAyMy42LTE1LjYgMjMuNmw2NS42IDBjLTQuNCA0OS45LTI4IDkxLjktNzAuOCAxMjUuMSAyMC41IDUuOSA0MC45LS45IDUxLTkuOSAwIDAgMjMtMjAuOSAzNS42LTY5LjNsNTQgNjQuOXM3LjktMjYuOS0xLjItNDBjLTcuNi04LjktMjguMS0zMy4xLTM2LjgtNDEuOEw4Ny45IDMxMmM0LjQtMTQgNy0yNy42IDcuOS00MC43bDYxLjYgMHMtLjEtMjMuNi03LjYtMjMuNmwwIDB6bTQxMi0xLjZjMjAuOC0yNS42IDQ1LTU4LjYgNDUtNTguNnMtMTguNi0xNC44LTI3LjQtNC4xYy02IDguMi0zNi44IDQ4LjItMzYuOCA0OC4ybDE5LjIgMTQuNHpNNDExLjggMTg3Yy05LTguMi0yNS45IDIuMS0yNS45IDIuMXMzOS41IDU1IDQxLjEgNTcuNGwxOS41LTEzLjdzLTI1LjctMzcuNi0zNC43LTQ1LjlsMCAwIDAgMHpNNjQwIDI1OC40Yy0xOS44IDAtMTMwLjkgLjktMTMxLjEgLjlsMC0xMDFjNC44IDAgMTIuNC0uNCAyMi44LTEuMiA0MC45LTIuNCA3MC4xLTQgODcuOC00LjggMCAwIDEyLjItMjcuMi0uNi0zMy40LTMuMS0xLjItMjMuMiA0LjYtMjMuMiA0LjZzLTE2NS4yIDE2LjUtMjMyLjQgMThjMS42IDguOCA3LjYgMTcuMSAxNS44IDE5LjYgMTMuMyAzLjUgMjIuNyAxLjcgNDkuMiAuOSAyNC44LTEuNiA0My43LTIuNCA1Ni41LTIuNGwwIDk5LjgtMTMzLjUgMHMyLjggMjIuMyAyNS41IDIyLjlsMTA3LjkgMCAwIDcwLjljMCAxNC0xMS4yIDIyLTI0LjUgMjEuMS0xNC4xIC4xLTI2LjEtMS4xLTQxLjctMS44IDIgNCA2LjMgMTQuNCAxOS4zIDIxLjggOS45IDQuOCAxNi4yIDYuNiAyNiA2LjYgMjkuNiAwIDQ1LjctMTcuMyA0NC45LTQ1LjNsMC03My4zIDEyMi40IDBjOS43IDAgOC43LTIzLjggOC43LTIzLjhsMCAweiJdCiAgICB9OwogICAgZmFZYW5kZXggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAieWFuZGV4IiwKICAgICAgaWNvbjogWzI1NiwgNTEyLCBbXSwgImY0MTMiLCAiTTE1My4xIDMxNS44TDY1LjcgNTEyIDIgNTEyIDk4IDMwMi4yQzUyLjkgMjc5LjMgMjIuOCAyMzcuOCAyMi44IDE2MS4xIDIyLjcgNTMuNyA5MC44IDAgMTcxLjcgMGw4Mi4zIDAgMCA1MTItNTUuMSAwIDAtMTk2LjItNDUuOCAwek0xOTguOSA0Ni41bC0yOS40IDBjLTQ0LjQgMC04Ny40IDI5LjQtODcuNCAxMTQuNiAwIDgyLjMgMzkuNCAxMDguOCA4Ny40IDEwOC44bDI5LjQgMCAwLTIyMy40eiJdCiAgICB9OwogICAgZmFQaXhpdiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwaXhpdiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNjQwIiwgIk05NiAzMkM0MyAzMiAwIDc1IDAgMTI4TDAgMzg0YzAgNTMgNDMgOTYgOTYgOTZsMjU2IDBjNTMgMCA5Ni00MyA5Ni05NmwwLTI1NmMwLTUzLTQzLTk2LTk2LTk2TDk2IDMyem03Ny43IDIxNy4zYTYwLjEgNjAuMSAwIDEgMCAxMjAuMyAwIDYwLjEgNjAuMSAwIDEgMCAtMTIwLjMgMHpNMTE5LjEgMzg3LjhjLS4zLS44LS41LTEuNy0uNS0yLjZsMC0yNDQuM2MwLTEuOCAuNy0zLjYgMi00LjlzMy0yIDQuOS0ybDE2LjkgMGMxLjIgMCAyLjMgLjMgMy4zIC44czEuOSAxLjMgMi41IDIuM2wxNCAyMS44YzE5LjctMTUuNiA0NC41LTI1IDcxLjYtMjUgNjMuNiAwIDExNS4yIDUxLjYgMTE1LjIgMTE1LjJTMjk3LjUgMzY0LjUgMjMzLjggMzY0LjVjLTIyIDAtNDIuNi02LjItNjAuMS0xNi45bDAgMzcuNmMwIC45LS4yIDEuOC0uNSAyLjZzLS45IDEuNi0xLjUgMi4yLTEuNCAxLjEtMi4yIDEuNS0xLjcgLjUtMi42IC41bC00MS4zIDBjLS45IDAtMS44LS4yLTIuNi0uNXMtMS42LS45LTIuMi0xLjUtMS4xLTEuNC0xLjUtMi4yeiJdCiAgICB9OwogICAgZmFPcGVuYWkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAib3BlbmFpIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU3Y2YiLCAiTTE5Ni40IDE4NS44bDAtNDguNmMwLTQuMSAxLjUtNy4yIDUuMS05LjJsOTcuOC01Ni4zYzEzLjMtNy43IDI5LjItMTEuMyA0NS42LTExLjMgNjEuNCAwIDEwMC40IDQ3LjYgMTAwLjQgOTguMyAwIDMuNiAwIDcuNy0uNSAxMS44TDM0My4zIDExMS4xYy02LjEtMy42LTEyLjMtMy42LTE4LjQgMEwxOTYuNCAxODUuOHpNNDI0LjcgMzc1LjJsMC0xMTYuMmMwLTcuMi0zLjEtMTIuMy05LjItMTUuOUwyODcgMTY4LjQgMzI5IDE0NC4zYzMuNi0yIDYuNy0yIDEwLjIgMEw0MzcgMjAwLjdjMjguMiAxNi40IDQ3LjEgNTEuMiA0Ny4xIDg1IDAgMzguOS0yMyA3NC44LTU5LjQgODkuNmwwIDB6TTE2Ni4yIDI3Mi44bC00Mi0yNC42Yy0zLjYtMi01LjEtNS4xLTUuMS05LjJsMC0xMTIuNmMwLTU0LjggNDItOTYuMyA5OC44LTk2LjMgMjEuNSAwIDQxLjUgNy4yIDU4LjQgMjBMMTc1LjQgMTA4LjVjLTYuMSAzLjYtOS4yIDguNy05LjIgMTUuOWwwIDE0OC41IDAgMHptOTAuNCA1Mi4ybC02MC4yLTMzLjggMC03MS43IDYwLjItMzMuOCA2MC4yIDMzLjggMCA3MS43LTYwLjIgMzMuOHptMzguNyAxNTUuN2MtMjEuNSAwLTQxLjUtNy4yLTU4LjQtMjBsMTAwLjktNTguNGM2LjEtMy42IDkuMi04LjcgOS4yLTE1LjlsMC0xNDguNSA0Mi41IDI0LjZjMy42IDIgNS4xIDUuMSA1LjEgOS4ybDAgMTEyLjZjMCA1NC44LTQyLjUgOTYuMy05OS4zIDk2LjNsMCAwek0xNzMuOCAzNjYuNUw3Ni4xIDMxMC4yYy0yOC4yLTE2LjQtNDcuMS01MS4yLTQ3LjEtODUgMC0zOS40IDIzLjYtNzQuOCA1OS45LTg5LjZsMCAxMTYuN2MwIDcuMiAzLjEgMTIuMyA5LjIgMTUuOWwxMjggNzQuMi00MiAyNC4xYy0zLjYgMi02LjcgMi0xMC4yIDB6bS01LjYgODRjLTU3LjkgMC0xMDAuNC00My41LTEwMC40LTk3LjMgMC00LjEgLjUtOC4yIDEtMTIuM2wxMDAuOSA1OC40YzYuMSAzLjYgMTIuMyAzLjYgMTguNCAwbDEyOC41LTc0LjIgMCA0OC42YzAgNC4xLTEuNSA3LjItNS4xIDkuMmwtOTcuOCA1Ni4zYy0xMy4zIDcuNy0yOS4yIDExLjMtNDUuNiAxMS4zbDAgMHptMTI3IDYwLjljNjIgMCAxMTMuNy00NCAxMjUuNC0xMDIuNCA1Ny4zLTE0LjkgOTQuMi02OC42IDk0LjItMTIzLjQgMC0zNS44LTE1LjQtNzAuNy00My05NS43IDIuNi0xMC44IDQuMS0yMS41IDQuMS0zMi4zIDAtNzMuMi01OS40LTEyOC0xMjgtMTI4LTEzLjggMC0yNy4xIDItNDAuNCA2LjctMjMtMjIuNS01NC44LTM2LjktODkuNi0zNi45LTYyIDAtMTEzLjcgNDQtMTI1LjQgMTAyLjQtNTcuMyAxNC44LTk0LjIgNjguNi05NC4yIDEyMy40IDAgMzUuOCAxNS40IDcwLjcgNDMgOTUuNy0yLjYgMTAuOC00LjEgMjEuNS00LjEgMzIuMyAwIDczLjIgNTkuNCAxMjggMTI4IDEyOCAxMy44IDAgMjcuMS0yIDQwLjQtNi43IDIzIDIyLjUgNTQuOCAzNi45IDg5LjYgMzYuOXoiXQogICAgfTsKICAgIGZhU2l0aCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzaXRoIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY1MTIiLCAiTTAgMzJsNjkuNyAxMTguOC01OC45LTExLjUgNjkuOCA5MWMtMyAxNy0zIDM0LjQgMCA1MS40bC02OS44IDkxIDU4LjktMTEuNS02OS43IDExOC44IDExOC44LTY5LjctMTEuNSA1OC45IDkxLTY5LjhjMTcgMyAzNC41IDMgNTEuNSAwbDkxIDY5LjgtMTEuNS01OC45IDExOC43IDY5LjctNjkuNy0xMTguOCA1OC45IDExLjUtNjkuOC05MWMzLTE3IDMtMzQuNCAwLTUxLjRsNjkuOC05MS01OC45IDExLjUgNjkuNy0xMTguOC0xMTguNyA2OS43IDExLjUtNTguOS05MS4xIDY5LjljLTguNS0xLjUtMTcuMS0yLjMtMjUuNy0yLjNzLTE3LjIgLjgtMjUuNyAyLjNMMTA3LjIgNDIuOCAxMTguOCAxMDEuNyAwIDMyek0yMjQgMzgwLjJhMTI0LjIgMTI0LjIgMCAxIDEgMC0yNDguNCAxMjQuMiAxMjQuMiAwIDEgMSAwIDI0OC40em0wLTIxMS44YTg3LjYgODcuNiAwIDEgMCAwIDE3NS4xIDg3LjYgODcuNiAwIDEgMCAwLTE3NS4xeiJdCiAgICB9OwogICAgZmFOZmNEaXJlY3Rpb25hbCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJuZmMtZGlyZWN0aW9uYWwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTUzMCIsICJNMjExLjggNDg4LjZjMS42IDIuNSAyLjEgNS42IDEuNCA4LjUtLjYgMi45LTIuNCA1LjUtNC45IDcuMS0yLjYgMS42LTUuNiAyLjEtOC42IDEuNS02MS40LTEzLjktMTE1LjYtNDkuOS0xNTIuMi0xMDEuMlMtNS40IDI5MC4zIDEuNiAyMjcuN2M3LTYyLjcgMzYuOC0xMjAuNSA4My43LTE2Mi41IDQ2LjktNDIgMTA3LjctNjUuMiAxNzAuNy02NS4yIDEuNSAwIDIuMSAuMyA0LjMgLjkgMS40IC42IDEuOCAxLjQgMy43IDIuNSAxLjEgMS4xIDEuOSAyLjMgMi41IDMuNyAuNSAxLjQgLjggMi44IC44IDQuM2wwIDEwMSAyNC41LTI1LjljMS0xLjEgMi4yLTIgMy42LTIuNiAxLjMtLjYgMi44LS45IDQuMy0xIDEuNS0uMSAyLjkgLjIgNC4zIC43czIuNyAxLjMgMy44IDIuNGMxIDEgMS45IDIuMiAyLjUgMy42IC42IDEuMyAxIDIuOCAxIDQuM3MtLjIgMy0uNyA0LjNjLS42IDEuNC0xLjQgMi42LTIuNCAzLjdsLTQ0IDQ2LjZjLTEuMSAxLjEtMi4zIDItMy43IDIuNi0xLjUgLjYtMyAuOS01LjQgLjktLjYgMC0yLjItLjMtMy42LS45cy0yLjctMS41LTMuNy0yLjZsLTQ0LjEtNDYuNmMtMi0yLjItMy4xLTUuMS0zLTguMSAwLTMgMS4zLTYuNyAzLjUtNy45IDIuMi0yLjEgNS4xLTMuMiA4LjEtMy4xIDMgLjEgNS44IDEuMyA3LjkgMy41bDI0LjUgMjYgMC04OS41Yy01Ni40IDIuOC0xMDkuOCAyNS44LTE1MC41IDY1LTQwLjYgMzkuMS02NS43IDkxLjctNzAuNiAxNDcuOVMzNC40IDM0OC4xIDY3LjcgMzkzLjdjMzIuNCA0NS41IDgyIDc3LjUgMTM3IDg5LjkgMi45IC43IDUuNSAyLjUgNy4xIDV6TTE3MS40IDEyNi4xYy0uOCAxLjMtMS45IDIuNC0zLjEgMy4yLTIwLjUgMTMuOS0zNy4yIDMyLjYtNDguOCA1NC41cy0xNy43IDQ2LjMtMTcuNyA3MS4xIDYuMSA0OS4yIDE3LjcgNzAuMmMxMS42IDIyLjggMjguMyA0MS41IDQ4LjggNTUuNCAyLjUgMS43IDQuMiA0LjMgNC43IDcuMyAuNiAyLjktLjkgNi0xLjcgOC40LTEuNyAyLjUtNS4yIDQuMi03LjMgMy45LTIuOSAxLjQtNiAuOC04LjQtLjktMjMuNi0xNi00Mi44LTM3LjUtNTYuMS02Mi43LTEzLjMtMjUuMS0yMC4zLTUzLjEtMjAuMy04MS42IDAtMjguNCA3LTU2LjUgMjAuMy04MS42IDEzLjMtMjUuMiAzMi41LTQ2LjcgNTYuMS02Mi43IDEuMi0uOCAyLjYtMS40IDQtMS44IDEuNS0uMyAzLS4zIDQuNSAwIDEuNCAuMiAyLjggLjggNC4xIDEuNnMyLjMgMS45IDMuMiAzLjFjLjggMS4yIDEuNCAyLjYgMS43IDQuMXMuMyAzIDAgNC40Yy0uMyAxLjUtLjggMi45LTEuNyA0LjF6TTM0MC45IDM4My41Yy44LTEuMiAxLjktMi4zIDIuMi0zLjFsMC0uMWMyMS4zLTE0IDM4LTMyLjcgNDkuNi01NC42IDExLjUtMjEuOCAxNy41LTQ2LjIgMTcuNS03MC45cy02LTQ5LjEtMTcuNS03MWMtMTEuNi0yMi43LTI4LjMtNDAuNS00OS42LTU0LjUtLjMtLjgtMS40LTEuOS0yLjItMy4xLS44LTEuMy0xLjQtMi43LTEuNi00LjEtMS4yLTEuNS0uMy0zIDAtNC40IC4zLTEuNSAuOS0yLjkgMS43LTQuMSAuOS0xLjIgMS4xLTIuMyAzLjItMy4xIDEuMi0uOCAyLjYtMS4zIDQuMS0xLjZzMi45LS4zIDQuNCAwIDIuOCAuOSA0LjEgMS44YzIzLjQgMTYgNDIuNyAzNy41IDU1LjkgNjIuNiAxMy4zIDI1LjEgMTkuNCA1My4xIDE5LjQgODEuNSAwIDI4LjUtNi4xIDU2LjUtMTkuNCA4MS42LTEzLjIgMjUuMS0zMi41IDQ2LjYtNTUuOSA2Mi42LTEuMyAuOS0yLjYgMS41LTQuMSAxLjhzLTIuOSAuMy00LjQgMC0yLjktMS43LTQuMS0xLjZjLTIuMS0uOC0yLjMtMS45LTMuMi0zLjEtLjgtMS4yLTEuNC0yLjYtMS43LTQuMS0uMy0xLjQtMS4yLTIuOSAwLTQuNCAuMi0xLjQgLjgtMi44IDEuNi00LjF6TTMxMi4zIDYuM2M1Ni4yIDEyLjcgMTA2LjQgNDQgMTQyLjcgODguNyAzMC40IDM3LjYgNDkuNiA4MyA1NS4zIDEzMSA1LjYgNDgtMi40IDk2LjctMjMuMiAxNDAuMy0yMC45IDQzLjYtNTMuNiA4MC41LTk0LjUgMTA2LjMtNDAuOSAyNS43LTg4LjIgMzkuNC0xMzYuNiAzOS40LTEuNSAwLTIuOS0uMy00LjMtLjktMS40LS41LTIuNi0xLjQtMy43LTIuNC0xLjktMS4xLTEuOS0yLjMtMi40LTMuNy0uNi0xLjQtLjktMi44LS45LTQuM2wwLTk5LjItMjQuNSAyNmMtMi4xIDIuMi00LjkgMi42LTcuOSAzLjYtMyAuMS01LjktMS4xLTguMS00LTIuMi0xLjItMy41LTQtMy41LTctLjEtMyAxLTUuOSAzLTguMWw0NC4xLTQ2LjZjMS4zLTIuMiA1LjEtMy40IDcuMy0zLjQgNCAwIDYuOSAxLjIgOS4xIDMuNGw0NCA0Ni42YzIuMSAyLjIgMy4yIDUuMSAzLjEgOC4xcy0xLjQgNS44LTMuNSA3Yy0yLjIgMi45LTUuMSA0LjEtOC4xIDQtMy0xLTUuOS0xLjQtNy45LTMuNmwtMjQuNS0yNS45IDAgODcuNWM1Ni40LTIuOCAxMDkuOC0yNS44IDE1MC41LTY1IDQwLjctNDAgNjUuOC05MS43IDcwLjctMTQ3LjkgNC44LTU3LjEtMTAuOC0xMTIuMy00NC4xLTE1Ny45LTMzLjMtNDUuNi04Mi03Ny41LTEzNy04OS45LTEuNS0uMy0yLjgtLjktNC4xLTEuOC0xLjItLjktMi4yLTEuOS0zLTMuMi0uOC0xLjItMi4yLTIuNi0xLjYtNC4xLS4yLTEuNS0uMi0zIC4xLTQuNCAuNC0xLjQgMS0yLjggMS44LTQgLjktMS4yIDItMi4yIDMuMi0zIDEuMy0uOCAyLjctMS4zIDQuMS0xLjYgMS41LS4zIDMtLjIgNC40IC4xem00MC44IDI0OS44YzAgMzEuNC0xNy41IDYxLjEtNDkuMyA4My41LTIuMSAxLjUtNC44IDIuMy03LjQgMi0yLjctLjItNS4yLTEuMy03LTMuMmwtNzAuMS02OS44Yy0yLjItMi4xLTQuMi01LTMuNC04IDAtMyAxLjItNS45IDMuMy04IDIuMi0yLjEgNS0zLjMgOC0zLjNzNS45IDEuMiA4IDMuM2w2My4xIDYyLjhjMjAuOC0xNy4xIDMyLjItMzcuOSAzMi4yLTU5LjMgMC0yMy45LTE0LjEtNDctMzkuNy02NS4xLTIuNS0xLjctNC4xLTQuMy00LjYtNy4zLS41LTIuOSAuMS02IDEuOS04LjQgMS43LTIuNSA0LjMtNC4xIDcuMy00LjYgMi45LS41IDYgLjEgOC40IDEuOSAzMS44IDIyLjQgNDkuMyA1Mi4xIDQ5LjMgODMuNXpNMjE2LjcgMzQxLjVjLTMgLjUtNi0uMi04LjUtMS45LTMxLjctMjIuNC01MC4xLTUyLjEtNTAuMS04My41czE4LjQtNjEuMSA1MC4xLTgzLjVjMi4yLTEuNiA0LjktMi4zIDcuNS0yLjEgMi43IC4zIDUuMSAxLjQgNyAzLjNsNzAuMSA2OS44YzIuMSAyLjEgMy4zIDUgMy4zIDhzLTIgNS44LTMuMyA4Yy0yLjEgMi4xLTUgMy4zLTcuOSAzLjMtMyAwLTYuOC0xLjItOC0zLjNsLTYzLjEtNjIuOWMtMjAuOSAxNy4zLTMyLjIgMzgtMzIuMiA1OS40IDAgMjMgMTQuMSA0NyAzOS43IDY1IDIuNCAxLjggNC4xIDQuNCA0LjYgNy40IC41IDIuOS0uMiA1LjktMS45IDguNC0xLjcgMi40LTQuNCA0LjEtNy4zIDQuNnoiXQogICAgfTsKICAgIGZhQ3JlYXRpdmVDb21tb25zQnkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY3JlYXRpdmUtY29tbW9ucy1ieSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNGU3IiwgIk0zMjIuOSAxOTQuNGwwIDEwMS40LTI4LjMgMCAwIDEyMC41LTc3LjEgMCAwLTEyMC40LTI4LjMgMCAwLTEwMS41YzAtNC40IDEuNi04LjIgNC42LTExLjMgMy4xLTMuMSA2LjktNC43IDExLjMtNC43bDEwMS45IDBjNC4xIDAgNy44IDEuNiAxMS4xIDQuNyAzLjEgMy4yIDQuOCA2LjkgNC44IDExLjN6bS0zMi41LTY0LjVhMzQuNSAzNC41IDAgMSAxIC02OSAuOCAzNC41IDM0LjUgMCAxIDEgNjktLjh6TTI1NS42IDhDMzk3LjQgOCA1MDQgMTE4LjEgNTA0IDI1NiA1MDQgNDAzLjEgMzg1LjUgNTA0IDI1NS42IDUwNCAxMjEuNiA1MDQgOCAzOTQuNSA4IDI1NiA4IDEyMy4xIDExMi43IDggMjU1LjYgOHptLjggNDQuN2MtMTE4LjIgMC0yMDMuNyA5Ny45LTIwMy43IDIwMy4zIDAgMTA5LjggOTEuMiAyMDIuOCAyMDMuNyAyMDIuOCAxMDMuMiAwIDIwMi44LTgxLjEgMjAyLjgtMjAyLjggLjEtMTEzLjgtOTAuMi0yMDMuMy0yMDIuOC0yMDMuM3oiXQogICAgfTsKICAgIGZhVW1icmFjbyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ1bWJyYWNvIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY4ZTgiLCAiTTI1Ni4zIDhhMjQ4IDI0OCAwIDEgMCAtLjcgNDk2IDI0OCAyNDggMCAxIDAgLjctNDk2em0xNDUgMjY2Yy0uOCAyNy4xLTUuNCA0OC44LTE0IDY1cy0yMy4xIDI3LjktNDMuNSAzNWMtMjAuNCA3LjEtNDguOSAxMC42LTg1LjQgMTAuNWwtNC42IDBjLTM2LjUgLjEtNjUtMy4zLTg1LjQtMTAuNXMtMzQuOS0xOC44LTQzLjUtMzVjLTguNi0xNi4yLTEzLjItMzcuOS0xNC02NS0uNy0xMC4yLS43LTIwLjUgMC0zMC43IC40LTE0LjcgMS42LTI5LjMgMy42LTQzLjkgMS45LTEzLjQgMy42LTIyLjYgNS40LTMyIDEtNC45IDEuMy02LjQgMS44LTguNCAuMy0xLjEgLjktMi4xIDEuOC0yLjhzMi0xLjEgMy4xLTEuMWwuNyAwIDMyIDVjMS4yIC4yIDIuMiAuOCAzIDEuN3MxLjIgMi4xIDEuMiAzLjNjMCAuMyAwIC41IDAgLjhsLTEuNyA4LjhjLTEuNiA4LjgtMy4yIDIwLjEtNC44IDMzLjctMS43IDE0LTIuNSAyOC4xLTIuNiA0Mi4yLS4yIDI3IDIuNSA0Ni45IDguMSA1OS44IDIuOCA2LjQgNy4yIDEyIDEyLjYgMTYuNHMxMS45IDcuNCAxOC43IDguOGMxOC44IDQgMzguMSA1LjcgNTcuMyA1LjFsMTAuMyAwYzE5LjIgLjYgMzguNS0xLjIgNTcuMy01LjIgNi44LTEuNCAxMy4yLTQuNSAxOC42LTguOHM5LjctMTAgMTIuNS0xNi40YzUuNy0xMi45IDguNC0zMi45IDguMS01OS44LS4xLTE0LjEtMS0yOC4yLTIuNi00Mi4xLTEuNy0xMy42LTMuMy0yNC44LTQuOS0zMy43bC0xLjctOC44YzAtLjMgMC0uNSAwLS44IDAtMS4yIC40LTIuNCAxLjItMy4zczEuOC0xLjUgMy0xLjdsMzItNSAuOCAwYzEuMSAwIDIuMiAuNCAzLjEgMS4xczEuNSAxLjcgMS44IDIuOGMuNiAyIC44IDMuNiAxLjggOC40IDEuOCA5LjYgMy41IDE4LjggNS40IDMyIDIgMTQuNiAzLjIgMjkuMiAzLjYgNDMuOSAuNyAxMC4yIC43IDIwLjUgMCAzMC43bDAgMHoiXQogICAgfTsKICAgIGZhSG9vbGkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaG9vbGkiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjQyNyIsICJNMTQ0LjUgMzUybDM4LjMgLjhjLTEzLjItNC42LTI2LTEwLjItMzguMy0xNi44bDAgMTZ6bTU3LjctNS4zbDAgNS4zLTE5LjQgLjhjMzYuNSAxMi41IDY5LjkgMTQuMiA5NC43IDcuMi0xOS45IC4yLTQ1LjgtMi42LTc1LjMtMTMuM3pNNjExLjEgMjMxLjVjMTUuOSAwIDI4LjktMTIuOSAyOC45LTI4LjlzLTEyLjktMjQuNS0yOC45LTI0LjVjLTE1LjkgMC0yOC45IDguNi0yOC45IDI0LjVzMTIuOSAyOC45IDI4LjkgMjguOXpNNTgyLjEgMzUybDU3LjkgMCAwLTExMC41LTU3LjkgMCAwIDExMC41em0tNzMuNyAwbDU3LjkgMCAwLTE5NS4zLTU3LjkgMjcuMyAwIDE2OHptLTMxLTExOS40Yy0xOC4yLTE4LjItNTAuNC0xNy4xLTUwLjQtMTcuMXMtMzIuMy0xLjEtNTAuNCAxNy4xYy0xOC4yIDE4LjItMTYuOCAzMy45LTE2LjggNTIuNnMtMS40IDM0LjMgMTYuOCA1Mi41IDUwLjQgMTcuMSA1MC40IDE3LjEgMzIuMyAxLjEgNTAuNC0xNy4xYzE4LjItMTguMiAxNi44LTMzLjggMTYuOC01Mi41LS4xLTE4LjggMS4zLTM0LjUtMTYuOC01Mi42em0tMzkuOCA3MS45YzAgMy42LTEuOCAxMi41LTEwLjcgMTIuNXMtMTAuNy04LjktMTAuNy0xMi41bDAtNDAuNGMwLTguNyA3LjMtMTAuOSAxMC43LTEwLjlzMTAuNyAyLjEgMTAuNyAxMC45bDAgNDAuNHpNMzMxLjQgMjMyLjZjLTE4LjItMTguMi01MC40LTE3LjEtNTAuNC0xNy4xcy0zMi4yLTEuMS01MC40IDE3LjFjLTEuOSAxLjktMy43IDMuOS01LjMgNi0zOC4yLTI5LjYtNzIuNS00Ni41LTEwMi4xLTYxLjFsMC0yMC43LTIyLjUgMTAuNmMtNTQuNC0yMi4xLTg5LTE4LjItOTcuMyAuMSAwIDAtMjQuOSAzMi44IDYxLjggMTEwLjhsMCA3My43IDU3LjkgMCAwLTI4LjZjLTYuNS00LjItMTMtOC43LTE5LjQtMTMuNi0xNC44LTExLjItMjcuNC0yMS42LTM4LjQtMzEuNGwwLTMxYzEzLjEgMTQuNyAzMC41IDMxLjQgNTMuNCA1MC4zbDQuNSAzLjYgMC0yOS44YzAtNi45IDEuNy0xOC4yIDEwLjgtMTguMnMxMC42IDYuOSAxMC42IDE1bDAgNDguN2MxOCAxMi4yIDM3LjMgMjIuMSA1Ny43IDI5LjZsMC05My45YzAtMTguNy0xMy40LTM3LjQtNDAuNi0zNy40LTE1LjgtLjEtMzAuNSA4LjItMzguNSAyMS45bDAtNTQuM2M0MS45IDIwLjkgODMuOSA0Ni41IDk5LjkgNTguMy0xMC4yIDE0LjYtOS4zIDI4LjEtOS4zIDQzLjcgMCAxOC43LTEuNCAzNC4zIDE2LjggNTIuNXM1MC40IDE3LjEgNTAuNCAxNy4xIDMyLjMgMS4xIDUwLjQtMTcuMWMxOC4yLTE4LjIgMTYuNy0zMy44IDE2LjctNTIuNSAwLTE4LjUgMS41LTM0LjItMTYuNy01Mi4zek02NS4yIDE4NGwwIDYzLjNjLTQ4LjctNTQuNS0zOC45LTc2LTM1LjItNzkuMSAxMy41LTExLjQgMzcuNS04IDY0LjQgMi4xTDY1LjIgMTg0ek0yOTEuNyAzMDQuNWMwIDMuNi0xLjggMTIuNS0xMC43IDEyLjVzLTEwLjctOC45LTEwLjctMTIuNWwwLTQwLjRjMC04LjcgNy4zLTEwLjkgMTAuNy0xMC45czEwLjcgMi4xIDEwLjcgMTAuOWwwIDQwLjR6Il0KICAgIH07CiAgICBmYVNxdWFyZUdpdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtZ2l0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImdpdC1zcXVhcmUiXSwgImYxZDIiLCAiTTEyMC44IDMzNS41Yy01LjktLjQtMTIuNi0uOC0yMC4yLTEuMy0zLjMgNC4xLTYuNiA4LjQtNi42IDEzLjUgMCAxOC41IDY1LjUgMTguNSA2NS41LTEuNSAwLTguMy03LjQtOC43LTM4LjgtMTAuN2wuMSAwem03LjgtMTE3LjljLTMyLjMgMC0zMy43IDQ0LjUtLjcgNDQuNSAzMi41IDAgMzEuNy00NC41IC43LTQ0LjV6TTM4NCAzMkw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0ek0yNDMuOSAxNzIuMmMtMTQuNSAwLTIyLjktOC40LTIyLjktMjIuOXM4LjQtMjIuMyAyMi45LTIyLjNjMTQuNyAwIDIzLjEgNy44IDIzLjEgMjIuM3MtOC40IDIyLjktMjMuMSAyMi45ek0xNDkuNiAxOTVsNDkuNSAwIDAgMjEuNi0yMy40IDEuOGM0LjYgNS44IDkuNCAxNCA5LjQgMjUuNyAwIDQ4LjctNTcuMiA0Ny4yLTc0LjIgNDIuNGwtOC40IDEzLjRjNSAuMyA5LjggLjYgMTQuMyAuOCA1Ni4zIDMuMiA4MC41IDQuNiA4MC41IDM4LjUgMCAyOS4yLTI1LjcgNDUuNy02OS45IDQ1LjctNDYgMC02My41LTExLjYtNjMuNS0zMS43IDAtMTEuNCA1LjEtMTcuNSAxNC0yNS45LTguNC0zLjUtMTEuMi05LjktMTEuMi0xNi44IDAtOS42IDcuNC0xNi4zIDIzLTMwLjZsLjItLjJjLTEyLjQtNi4xLTIxLjgtMTkuMy0yMS44LTM4LjEgMC01MS42IDU2LjYtNTMuMyA4MS42LTQ2LjhsLS4xIC4yek0yNzAuNSAzMDMuMWwxMyAxLjggMCAyMC4xLTcyLjQgMCAwLTIwLjFjMi43LS40IDUtLjcgNi45LS45IDkuOS0xLjIgMTAuMS0xLjMgMTAuMS02bDAtNzQuN2MwLTQuNC0uOS00LjctMTAuMS03LjgtMS45LS43LTQuMi0xLjQtNi45LTIuNGwyLjgtMjAuNiA1Mi42IDAgMCAxMDUuNWMwIDQuMSAuMiA0LjYgNC4xIDUuMWwtLjEgMHptMTA2LjYtMTAuNEwzODQgMzE1Yy0xMC45IDUuNC0yNi45IDEwLjItNDEuNCAxMC4yLTMwLjIgMC00MS43LTEyLjItNDEuNy00MC45bDAtNjYuNmMwLS44IDAtMS40LS4yLTEuOC0uOC0xLjItNC4yLS43LTE5LjYtLjdsMC0yMi42YzIyLjMtMi41IDMxLjItMTMuNyAzNC00MS40bDI0LjIgMGMwIDMzLjMtLjYgMzggLjcgMzguNiAuMyAuMSAuNyAwIDEuMyAwbDM1LjggMCAwIDI1LjQtMzcuOCAwIDAgNjEuNmMtLjIgNi4zLS45IDMwLjQgMzcuOSAxNS45bC0uMSAweiJdCiAgICB9OwogICAgZmFHaXRTcXVhcmUgPSBmYVNxdWFyZUdpdDsKICAgIGZhT2Rub2tsYXNzbmlraSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJvZG5va2xhc3NuaWtpIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbXSwgImYyNjMiLCAiTTI3NS4xIDMzNGMtMjcuNCAxNy40LTY1LjEgMjQuMy05MCAyNi45bDIwLjkgMjAuNiA3Ni4zIDc2LjNjMjcuOSAyOC42LTE3LjUgNzMuMy00NS43IDQ1LjctMTkuMS0xOS40LTQ3LjEtNDcuNC03Ni4zLTc2LjZMODQgNTAzLjRjLTI4LjIgMjcuNS03My42LTE3LjYtNDUuNC00NS43IDE5LjQtMTkuNCA0Ny4xLTQ3LjQgNzYuMy03Ni4zbDIwLjYtMjAuNmMtMjQuNi0yLjYtNjIuOS05LjEtOTAuNi0yNi45LTMyLjYtMjEtNDYuOS0zMy4zLTM0LjMtNTkgNy40LTE0LjYgMjcuNy0yNi45IDU0LjYtNS43IDAgMCAzNi4zIDI4LjkgOTQuOSAyOC45UzI1NSAyNjkuMiAyNTUgMjY5LjJjMjYuOS0yMS4xIDQ3LjEtOC45IDU0LjYgNS43IDEyLjQgMjUuNy0xLjkgMzgtMzQuNSA1OS4xem0xNC42LTIwNC43YTEyOS43IDEyOS43IDAgMSAxIC0yNTkuNCAuNCAxMjkuNyAxMjkuNyAwIDEgMSAyNTkuNC0uNHptLTE5My40IC40YTYzLjcgNjMuNyAwIDEgMCAxMjcuNC0uNCA2My43IDYzLjcgMCAxIDAgLTEyNy40IC40eiJdCiAgICB9OwogICAgZmFEcnVwYWwgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZHJ1cGFsIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYxYTkiLCAiTTI3Mi4zIDEwOC4xQzIzNi41IDcyLjUgMjAyLjUgMzguNCAxOTIuNCAwIDE4Mi40IDM4LjQgMTQ4LjEgNzIuNSAxMTIuNCAxMDguMSA1OC44IDE2MS43LTEuOSAyMjIuNC0xLjkgMzEzLjQtNC4zIDQyMC43IDgwLjggNTA5LjYgMTg4LjEgNTEyczE5Ni4yLTgyLjggMTk4LjUtMTkwLjFjLjEtMi44IC4xLTUuNiAwLTguNSAwLTkxLjEtNjAuOC0xNTEuNy0xMTQuMy0yMDUuM3pNOTggMzMxLjFjLTUuOSA3LjUtMTEgMTUuNi0xNS4yIDI0LjItLjMgLjctLjggMS4zLTEuMyAxLjhzLTEuMiAuOC0yIDFsLTEuNyAwYy00LjMgMC05LjItOC41LTkuMi04LjUtMS4zLTItMi41LTQuMi0zLjctNi40bC0uOC0xLjhjLTExLjItMjUuNy0xLjUtNjIuMy0xLjUtNjIuMyA0LjgtMTcuOCAxMi43LTM0LjcgMjMuMi00OS45IDYuNC05LjYgMTMuNS0xOC45IDIxLTI3LjdsOS4yIDkuMiA0My41IDQ0LjRjLjggLjkgMS4zIDIuMSAxLjMgMy4zcy0uNSAyLjQtMS4zIDMuM0wxMTQuMSAzMTIuMyA5OCAzMzEuMXptOTYuNiAxMjcuM2MtMTIuOS0uMS0yNS42LTMuOS0zNi40LTExcy0xOS40LTE3LjEtMjQuNi0yOC45LTctMjQuOS01LTM3LjcgNy42LTI0LjcgMTYuMi0zNC40YzE0LjItMTYuOSAzMS41LTMzLjUgNTAuMy01NS4zIDIyLjMgMjMuOCAzNi45IDQwLjEgNTEuMiA1OCAxLjEgMS40IDIuMSAyLjkgMyA0LjQgNy44IDExLjEgMTIgMjQuNCAxMiAzOCAwIDguOC0xLjcgMTcuNC01IDI1LjVzLTguMiAxNS41LTE0LjQgMjEuNy0xMy41IDExLjEtMjEuNiAxNC41LTE2LjcgNS4xLTI1LjUgNS4xbC0uMiAwek0zMjAuNyAzNTEuNmMtLjQgMS40LTEuMiAyLjYtMi4zIDMuNnMtMi40IDEuNi0zLjggMS44bC0xLjMgMGMtMi42LS45LTQuOS0yLjctNi4zLTUuMS0xMS42LTE3LjUtMjQuOS0zMy45LTM5LjUtNDlsLTE3LjgtMTguNC01OS4xLTYxLjNjLTEyLjQtMTEuNS0yNC4yLTIzLjYtMzUuNC0zNi4zLS4zLS41LS42LS45LS45LTEuNC0yLTIuOC0zLjYtNS45LTQuNy05LjJsMC0xLjhjLS44LTUtLjQtMTAuMSAxLjItMTVzNC40LTkuMiA4LTEyLjdjMTEuNC0xMS40IDIzLTIzIDMzLjgtMzQuOSAxMiAxMy4zIDI0LjggMjYgMzcuNCAzOC42IDI1LjggMjQgNDkuMSA1MC41IDY5LjYgNzkuMSAxNy4zIDI0LjUgMjYuNyA1My44IDI3IDgzLjgtLjEgMTIuOS0yLjIgMjUuOC02IDM4LjJ6Il0KICAgIH07CiAgICBmYUJsb2dnZXJCID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImJsb2dnZXItYiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMzdkIiwgIk00NDYuNiAyMjIuN2MtMS44LTgtNi44LTE1LjQtMTIuNS0xOC41LTEuOC0xLTEzLTIuMi0yNS0yLjctMjAuMS0uOS0yMi4zLTEuMy0yOC43LTUtMTAuMS01LjktMTIuOC0xMi4zLTEyLjktMjkuNS0uMS0zMy0xMy44LTYzLjctNDAuOS05MS4zLTE5LjMtMTkuNy00MC45LTMzLTY1LjUtNDAuNS01LjktMS44LTE5LjEtMi40LTYzLjMtMi45LTY5LjQtLjgtODQuOCAuNi0xMDguNCAxMC00My41IDE3LjItNzQuNyA1My44LTg2LjEgMTAwLjYtMi4xIDguOC0yLjYgMjIuOS0zLjEgMTAzLjktLjYgMTAxLjUgLjEgMTE2LjQgNi40IDEzNi41IDE1LjYgNDkuNiA1OS45IDg2LjMgMTA0LjQgOTQuMyAxNC44IDIuNyAxOTcuMyAzLjMgMjE2IC44IDMyLjUtNC40IDU4LTE3LjUgODEuOS00MS45IDE3LjMtMTcuNyAyOC4xLTM2LjggMzUuMi02Mi4xIDQuOS0xNy42IDQuNS0xNDIuOCAyLjUtMTUxLjd6TTEyNC41IDE1OS4xYzcuOC03LjkgMTAtOC4yIDU4LjgtOC4yIDQzLjkgMCA0NS40IC4xIDUxLjggMy40IDkuMyA0LjcgMTMuNCAxMS4zIDEzLjQgMjEuOSAwIDkuNS0zLjggMTYuMi0xMi4zIDIxLjYtNC42IDIuOS03LjMgMy4xLTUwLjMgMy4zLTI2LjUgLjItNDcuNy0uNC01MC44LTEuMi0xNi42LTQuNy0yMi44LTI4LjUtMTAuNi00MC44ek0zMTYuMyAzNTguOWwtMTQuOSAyLjQtNzcuNSAuOWMtNjguMSAuOC04Ny4zLS40LTkwLjktMi03LjEtMy4xLTEzLjgtMTEuNy0xNC45LTE5LjQtMS4xLTcuMyAyLjYtMTcuMyA4LjItMjIuNCA3LjEtNi40IDEwLjItNi42IDk3LjMtNi43IDg5LjYtLjEgODkuMS0uMSA5Ny42IDcuOCAxMi4xIDExLjMgOS41IDMxLjItNC45IDM5LjR6Il0KICAgIH07CiAgICBmYUludmlzaW9uID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImludmlzaW9uIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY3YjAiLCAiTTQwNy40IDMyTDQwLjYgMzJDMTguMiAzMiAwIDUwLjIgMCA3Mi42TDAgNDM5LjRDMCA0NjEuOCAxOC4yIDQ4MCA0MC42IDQ4MGwzNjYuOCAwYzIyLjQgMCA0MC42LTE4LjIgNDAuNi00MC42bDAtMzY2LjhDNDQ4IDUwLjIgNDI5LjggMzIgNDA3LjQgMzJ6TTE3Ni4xIDE0NS42Yy40IDIzLjQtMjIuNCAyNy4zLTI2LjYgMjcuNC0xNC45IDAtMjcuMS0xMi0yNy4xLTI3IC4xLTM1LjIgNTMuMS0zNS41IDUzLjctLjR6TTMzMi44IDM3N2MtNjUuNiAwLTM0LjEtNzQtMjUtMTA2LjYgMTQuMS00Ni40LTQ1LjItNTktNTkuOSAuN2wtMjUuOCAxMDMuMy00NS4xIDAgOC4xLTMyLjVjLTMxLjUgNTEuOC05NC42IDQ0LjQtOTQuNi00LjMgLjEtMTQuMyAuOS0xNCAyMy0xMDQuMWwtMzEuOCAwIDkuNy0zNS42IDc2LjQgMGMtMzMuNiAxMzMuNy0zMi42IDEyNi45LTMyLjkgMTM4LjIgMCAyMC45IDQwLjkgMTMuNSA1Ny40LTIzLjJsMTkuOC03OS40LTMyLjMgMCA5LjctMzUuNiA2OC44IDAtOC45IDQwLjVjNDAuNS03NS41IDEyNy45LTQ3LjggMTAxLjggMzgtMTQuMiA1MS4xLTE0LjYgNTAuNy0xNC45IDU4LjggMCAxNS41IDE3LjUgMjIuNiAzMS44LTE2LjlMMzg2IDMyNWMtMTAuNSAzNi43LTI5LjQgNTItNTMuMiA1MnoiXQogICAgfTsKICAgIGZhRmFjZWJvb2tGID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImZhY2Vib29rLWYiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZjM5ZSIsICJNODAgMjk5LjNsMCAyMTIuNyAxMTYgMCAwLTIxMi43IDg2LjUgMCAxOC05Ny44LTEwNC41IDAgMC0zNC42YzAtNTEuNyAyMC4zLTcxLjUgNzIuNy03MS41IDE2LjMgMCAyOS40IC40IDM3IDEuMmwwLTg4LjdDMjkxLjQgNCAyNTYuNCAwIDIzNi4yIDAgMTI5LjMgMCA4MCA1MC41IDgwIDE1OS40bDAgNDIuMS02NiAwIDAgOTcuOCA2NiAweiJdCiAgICB9OwogICAgZmFDZW50b3MgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY2VudG9zIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY3ODkiLCAiTTI4OS42IDk3LjVsMzEuNiAzMS43LTc2LjMgNzYuNSAwLTEwOC4yIDQ0LjcgMHpNMTI3LjIgMTI5LjJsNzYuMyA3Ni41IDAtMTA4LjItNDQuNyAwLTMxLjYgMzEuN3ptNDEuNS00MS42bDQ0LjcgMCAwIDEyNy45IDEwLjggMTAuOCAxMC44LTEwLjggMC0xMjcuOSA0NC43IDAtNTUuNS01NS42LTU1LjUgNTUuNnptMjYuMiAxNjguMWwtMTAuOC0xMC44LTEyOC42IDAgMC00NC44LTU1LjUgNTUuNiA1NS41IDU1LjYgMC00NC44IDEyOC42IDAgMTAuOC0xMC44ek0yNzQuMiAyMzVsMTA3LjkgMCAwLTQ0LjgtMzEuNi0zMS43LTc2LjMgNzYuNXptMTczLjMgMjAuN2wtNTUuNS01NS42IDAgNDQuOC0xMjcuNyAwLTEwLjggMTAuOCAxMC44IDEwLjggMTI3LjcgMCAwIDQ0LjggNTUuNS01NS42ek02NS40IDE3Ni4ybDMyLjUtMzEuNyA5MC4zIDkwLjUgMTUuMyAwIDAtMTUuMy05MC4zLTkwLjUgMzEuNi0zMS43LTc5LjQgMCAwIDc4Ljd6TTM4Mi4xIDk3LjVsLTc4LjUgMCAzMS42IDMxLjctOTAuMyA5MC41IDAgMTUuMyAxNS4zIDAgOTAuMy05MC41IDMxLjYgMzEuNyAwLTc4Ljd6TTIwMy41IDQxMy45bDAtMTA4LjEtNzYuMyA3Ni41IDMxLjYgMzEuNyA0NC43IDAgMC0uMXpNNjUuNCAyMzVsMTA4LjggMC03Ni4zLTc2LjUtMzIuNSAzMS43IDAgNDQuOHpNMzgyLjEgMzM1LjJsLTMxLjYgMzEuNy05MC4zLTkwLjUtMTUuMyAwIDAgMTUuMyA5MC4zIDkwLjUtMzEuNiAzMS43IDc4LjUgMCAwLTc4Ljd6bTAtNTguOGwtMTA3LjkgMCA3Ni4zIDc2LjUgMzEuNi0zMS43IDAtNDQuOHpNMzIxLjIgMzgyLjJsLTc2LjMtNzYuNSAwIDEwOC4xIDQ0LjcgMCAzMS42LTMxLjZ6TTk3LjkgMzUyLjlsNzYuMy03Ni41LTEwOC44IDAgMCA0NC44IDMyLjUgMzEuN3ptMTgxLjggNzAuOWwtNDQuNyAwIDAtMTI3LjktMTAuOC0xMC44LTEwLjggMTAuOCAwIDEyNy45LTQ0LjcgMCA1NS41IDU1LjYgNTUuNS01NS42ek0xMTMuMiAzODIuMmw5MC4zLTkwLjUgMC0xNS4zLTE1LjMgMC05MC4zIDkwLjUtMzIuNS0zMS43IDAgNzguNyA3OS40IDAtMzEuNi0zMS43eiJdCiAgICB9OwogICAgZmFDY0FtYXpvblBheSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjYy1hbWF6b24tcGF5IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY0MmQiLCAiTTEyNC43IDIwMS44Yy4xLTExLjggMC0yMy41IDAtMzUuM2wwLTM1LjNjMC0xLjMgLjQtMiAxLjQtMi43IDExLjUtOCAyNC4xLTEyLjEgMzguMi0xMS4xIDEyLjUgLjkgMjIuNyA3IDI4LjEgMjEuNyAzLjMgOC45IDQuMSAxOC4yIDQuMSAyNy43IDAgOC43LS43IDE3LjMtMy40IDI1LjYtNS43IDE3LjgtMTguNyAyNC43LTM1LjcgMjMuOS0xMS43LS41LTIxLjktNS0zMS40LTExLjctLjktLjgtMS40LTEuNi0xLjMtMi44em0xNTQuOSAxNC42YzQuNiAxLjggOS4zIDIgMTQuMSAxLjUgMTEuNi0xLjIgMjEuOS01LjcgMzEuMy0xMi41IC45LS42IDEuMy0xLjMgMS4zLTIuNS0uMS0zLjkgMC03LjkgMC0xMS44IDAtNC0uMS04IDAtMTIgMC0xLjQtLjQtMi0xLjgtMi4yLTctLjktMTMuOS0yLjItMjAuOS0yLjktNy0uNi0xNC0uMy0yMC44IDEuOS02LjcgMi4yLTExLjcgNi4yLTEzLjcgMTMuMS0xLjYgNS40LTEuNiAxMC44IC4xIDE2LjIgMS42IDUuNSA1LjIgOS4yIDEwLjQgMTEuMnpNNTc2IDgwbDAgMzUyYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDQ4IDQ4MGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCA4MEMwIDUzLjUgMjEuNSAzMiA0OCAzMmw0ODAgMGMyNi41IDAgNDggMjEuNSA0OCA0OHpNMzY4LjUgMTAzLjljLjQgMS43IC45IDMuNCAxLjYgNS4xIDE2LjUgNDAuNiAzMi45IDgxLjMgNDkuNSAxMjEuOSAxLjQgMy41IDEuNyA2LjQgLjIgOS45LTIuOCA2LjItNC45IDEyLjYtNy44IDE4LjctMi42IDUuNS02LjcgOS41LTEyLjcgMTEuMi00LjIgMS4xLTguNSAxLjMtMTIuOSAuOS0yLjEtLjItNC4yLS43LTYuMy0uOC0yLjgtLjItNC4yIDEuMS00LjMgNC0uMSAyLjgtLjEgNS42IDAgOC4zIC4xIDQuNiAxLjYgNi43IDYuMiA3LjUgNC43IC44IDkuNCAxLjYgMTQuMiAxLjcgMTQuMyAuMyAyNS43LTUuNCAzMy4xLTE3LjkgMi45LTQuOSA1LjYtMTAuMSA3LjctMTUuNCAxOS44LTUwLjEgMzkuNS0xMDAuMyA1OS4yLTE1MC41IC42LTEuNSAxLjEtMyAxLjMtNC42IC40LTIuNC0uNy0zLjYtMy4xLTMuNy01LjYtLjEtMTEuMSAwLTE2LjcgMC0zLjEgMC01LjMgMS40LTYuNCA0LjMtLjQgMS4xLS45IDIuMy0xLjMgMy40bC0yOS4xIDgzLjdjLTIuMSA2LjEtNC4yIDEyLjEtNi41IDE4LjYtLjQtLjktLjYtMS40LS44LTEuOS0xMC44LTI5LjktMjEuNi01OS45LTMyLjQtODkuOC0xLjctNC43LTMuNS05LjUtNS4zLTE0LjItLjktMi41LTIuNy00LTUuNC00LTYuNC0uMS0xMi44LS4yLTE5LjItLjEtMi4yIDAtMy4zIDEuNi0yLjggMy43ek0yNDIuNCAyMDZjMS43IDExLjcgNy42IDIwLjggMTggMjYuNiA5LjkgNS41IDIwLjcgNi4yIDMxLjcgNC42IDEyLjctMS45IDIzLjktNy4zIDMzLjgtMTUuNSAuNC0uMyAuOC0uNiAxLjQtMSAuNSAzLjIgLjkgNi4yIDEuNSA5LjIgLjUgMi42IDIuMSA0LjMgNC41IDQuNCA0LjYgLjEgOS4xIC4xIDEzLjcgMCAyLjMtLjEgMy44LTEuNiA0LTMuOSAuMS0uOCAuMS0xLjYgLjEtMi4zbDAtODguOGMwLTMuNi0uMi03LjItLjctMTAuOC0xLjYtMTAuOC02LjItMTkuNy0xNS45LTI1LjQtNS42LTMuMy0xMS44LTUtMTguMi01LjktMy0uNC02LS43LTkuMS0xLjFsLTEwIDBjLS44IC4xLTEuNiAuMy0yLjUgLjMtOC4yIC40LTE2LjMgMS40LTI0LjIgMy41LTUuMSAxLjMtMTAgMy4yLTE1IDQuOS0zIDEtNC41IDMuMi00LjQgNi41IC4xIDIuOC0uMSA1LjYgMCA4LjMgLjEgNC4xIDEuOCA1LjIgNS43IDQuMSA2LjUtMS43IDEzLjEtMy41IDE5LjctNC44IDEwLjMtMS45IDIwLjctMi43IDMxLjEtMS4yIDUuNCAuOCAxMC41IDIuNCAxNC4xIDcgMy4xIDQgNC4yIDguOCA0LjQgMTMuNyAuMyA2LjkgLjIgMTMuOSAuMyAyMC44IDAgLjQtLjEgLjctLjIgMS4yLS40IDAtLjggMC0xLjEtLjEtOC44LTIuMS0xNy43LTMuNi0yNi44LTQuMS05LjUtLjUtMTguOSAuMS0yNy45IDMuMi0xMC44IDMuOC0xOS41IDEwLjMtMjQuNiAyMC44LTQuMSA4LjMtNC42IDE3LTMuNCAyNS44ek05OC43IDEwNi45bDAgMTc1LjNjMCAuOCAwIDEuNyAuMSAyLjUgLjIgMi41IDEuNyA0LjEgNC4xIDQuMiA1LjkgLjEgMTEuOCAuMSAxNy43IDAgMi41IDAgNC0xLjcgNC4xLTQuMSAuMS0uOCAuMS0xLjcgLjEtMi41bDAtNjAuN2MuOSAuNyAxLjQgMS4yIDEuOSAxLjYgMTUgMTIuNSAzMi4yIDE2LjYgNTEuMSAxMi45IDE3LjEtMy40IDI4LjktMTMuOSAzNi43LTI5LjIgNS44LTExLjYgOC4zLTI0LjEgOC43LTM3IC41LTE0LjMtMS0yOC40LTYuOC00MS43LTcuMS0xNi40LTE4LjktMjcuMy0zNi43LTMwLjktMi43LS42LTUuNS0uOC04LjItMS4ybC03IDBjLTEuMiAuMi0yLjQgLjMtMy42IC41LTExLjcgMS40LTIyLjMgNS44LTMxLjggMTIuNy0yIDEuNC0zLjkgMy01LjkgNC41LS4xLS41LS4zLS44LS40LTEuMi0uNC0yLjMtLjctNC42LTEuMS02LjktLjYtMy45LTIuNS01LjUtNi40LTUuNmwtOS43IDBjLTUuOS0uMS02LjkgMS02LjkgNi44ek00OTMuNiAzMzljLTIuNy0uNy01LjEgMC03LjYgMS00My45IDE4LjQtODkuNSAzMC4yLTEzNi44IDM1LjgtMTQuNSAxLjctMjkuMSAyLjgtNDMuNyAzLjItMjYuNiAuNy01My4yLS44LTc5LjYtNC4zLTE3LjgtMi40LTM1LjUtNS43LTUzLTkuOS0zNy04LjktNzIuNy0yMS43LTEwNi43LTM4LjgtOC44LTQuNC0xNy40LTkuMy0yNi4xLTE0LTMuOC0yLjEtNi4yLTEuNS04LjIgMi4xbDAgMS43YzEuMiAxLjYgMi4yIDMuNCAzLjcgNC44IDM2IDMyLjIgNzYuNiA1Ni41IDEyMiA3Mi45IDIxLjkgNy45IDQ0LjQgMTMuNyA2Ny4zIDE3LjUgMTQgMi4zIDI4IDMuOCA0Mi4yIDQuNSAzIC4xIDYgLjIgOSAuNCAuNyAwIDEuNCAuMiAyLjEgLjNsMTcuNyAwYy43LS4xIDEuNC0uMyAyLjEtLjMgMTQuOS0uNCAyOS44LTEuOCA0NC42LTQgMjEuNC0zLjIgNDIuNC04LjEgNjIuOS0xNC43IDI5LjYtOS42IDU3LjctMjIuNCA4My40LTQwLjEgMi44LTEuOSA1LjctMy44IDgtNi4yIDQuMy00LjQgMi4zLTEwLjQtMy4zLTExLjl6TTU0NCAzMTEuM2MtLjgtNC4yLTQtNS44LTcuNi03LTUuNy0xLjktMTEuNi0yLjgtMTcuNi0zLjMtMTEtLjktMjItLjQtMzIuOCAxLjYtMTIgMi4yLTIzLjQgNi4xLTMzLjUgMTMuMS0xLjIgLjgtMi40IDEuOC0zLjEgMy0uNiAuOS0uNyAyLjMtLjUgMy40IC4zIDEuMyAxLjcgMS42IDMgMS41IC42IDAgMS4yIDAgMS44LS4xbDE5LjUtMi4xYzkuNi0uOSAxOS4yLTEuNSAyOC44LS44IDQuMSAuMyA4LjEgMS4yIDEyIDIuMiA0LjMgMS4xIDYuMiA0LjQgNi40IDguNyAuMyA2LjctMS4yIDEzLjEtMi45IDE5LjUtMy41IDEyLjktOC4zIDI1LjQtMTMuMyAzNy44LS4zIC44LS43IDEuNy0uOCAyLjUtLjQgMi41IDEgNCAzLjQgMy41IDEuNC0uMyAzLTEuMSA0LTIuMSAzLjctMy42IDcuNS03LjIgMTAuNi0xMS4yIDEwLjctMTMuOCAxNy0yOS42IDIwLjctNDYuNiAuNy0zIDEuMi02LjEgMS43LTkuMSAuMi00LjcgLjItOS42IC4yLTE0LjV6Il0KICAgIH07CiAgICBmYUViYXkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZWJheSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNGY0IiwgIk02MDYuNSAxODkuNWwtNTQuOCAxMDkuOS01NC45LTEwOS45LTM3LjUgMCAxMC45IDIwLjZjLTExLjUtMTktMzUuOS0yNi02My4zLTI2LTMxLjggMC02Ny45IDguNy03MS41IDQzLjFsMzMuNyAwYzEuNC0xMy44IDE1LjctMjEuOCAzNS0yMS44IDI2IDAgNDEgOS42IDQxIDMzbDAgMy40Yy0xMi43IDAtMjggLjEtNDEuNyAuNC00Mi40IC45LTY5LjYgMTAtNzYuNyAzNC40IDEtNS4yIDEuNS0xMC42IDEuNS0xNi4yIDAtNTIuMS0zOS43LTc2LjItNzUuNC03Ni4yLTIxLjMgMC00MyA1LjUtNTguNyAyNC4ybDAtODAuNi0zMi4xIDAgMCAxNjkuNWMwIDEwLjMtLjYgMjIuOS0xLjEgMzMuMWwzMS41IDBjLjctNi4zIDEuMS0xMi45IDEuMS0xOS41IDEzLjYgMTYuNiAzNS40IDI0LjkgNTguNyAyNC45IDM2LjkgMCA2NC45LTIxLjkgNzMuMy01NC4yLS41IDIuOC0uNyA1LjgtLjcgOSAwIDI0LjEgMjEuMSA0NSA2MC42IDQ1IDI2LjYgMCA0NS44LTUuNyA2MS45LTI1LjUgMCA2LjYgLjMgMTMuMyAxLjEgMjAuMmwyOS44IDBjLS43LTguMi0xLTE3LjUtMS0yNi44bDAtNjUuNmMwLTkuMy0xLjctMTcuMi00LjgtMjMuOGw2MS41IDExNi4xLTI4LjUgNTQuMSAzNS45IDAgOTkuMi0xOTQuOC0zNCAwek0yNDQuMiAzMTMuOGMtMjkuNiAwLTUwLjItMjEuNS01MC4yLTUzLjggMC0zMi40IDIwLjYtNTMuOCA1MC4yLTUzLjggMjkuOCAwIDUwLjIgMjEuNCA1MC4yIDUzLjggMCAzMi4zLTIwLjQgNTMuOC01MC4yIDUzLjh6bTIwMC45LTQ3LjNjMCAzMC0xNy45IDQ4LjQtNTEuNiA0OC40LTI1LjEgMC0zNS0xMy40LTM1LTI1LjggMC0xOS4xIDE4LjEtMjQuNCA0Ny4yLTI1LjMgMTMuMS0uNSAyNy42LS42IDM5LjQtLjZsMCAzLjN6TTMzLjIgMjY4LjFsMTI4LjggMCAwLTguNWMwLTUxLjctMzMuMS03NS40LTc4LjQtNzUuNC01Ni44IDAtODMgMzAuOC04MyA3Ny42IDAgNDIuNSAyNS4zIDc0IDgyLjUgNzQgMzEuNCAwIDY4LTExLjcgNzQuNC00Ni4xbC0zMy4xIDBjLTEyIDM1LjgtODcuNyAzNi43LTkxLjItMjEuNnptOTUtMjEuNGwtOTQuNCAwYzYuOS01Ni42IDkyLjEtNTQuNyA5NC40IDB6Il0KICAgIH07CiAgICBmYUNvbnRhbyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjb250YW8iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjI2ZCIsICJNNDUuNCAzMDVjMTQuNCA2Ny4xIDI2LjQgMTI5IDY4LjIgMTc1TDM0IDQ4MGMtMTguNyAwLTM0LTE1LjItMzQtMzRMMCA2NkMwIDQ3LjMgMTUuMiAzMiAzNCAzMmw1Ny43IDBjLTEzLjggMTIuNi0yNi4xIDI3LjItMzYuOSA0My42LTQ1LjQgNzAtMjcgMTQ2LjgtOS40IDIyOS40ek00NzggMzJsLTkwLjIgMGMyMS40IDIxLjQgMzkuMiA0OS41IDUyLjcgODQuMUwzMDMuNCAxNDUuNGMtMTQuOS0yOS0zNy44LTUzLjMtODIuNi00My45LTI0LjYgNS4zLTQxIDE5LjMtNDguMyAzNC42LTguOCAxOC43LTEzLjIgMzkuOCA4LjIgMTQwLjMgMjEuMSAxMDAuMiAzMy43IDExNy43IDQ5LjUgMTMxLjIgMTIuOSAxMS4xIDMzLjQgMTcgNTguMyAxMS43IDQ0LjUtOS40IDU1LjctNDAuNyA1Ny40LTczLjJsMTM3LjQtMjkuNmMzLjIgNzEuNS0xOC43IDEyNS4yLTU3LjQgMTYzLjZsNTIuMSAwYzE4LjcgMCAzNC0xNS4yIDM0LTM0TDUxMiA2NmMwLTE4LjgtMTUuMi0zNC0zNC0zNHoiXQogICAgfTsKICAgIGZhRWxsbyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJlbGxvIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1ZjEiLCAiTTI1NiA4YTI0OCAyNDggMCAxIDAgMCA0OTYgMjQ4IDI0OCAwIDEgMCAwLTQ5NnpNMzk5LjggMjkzLjJDMzgzLjMgMzU4LjUgMzIzLjggNDA0LjggMjU2IDQwNC44UzEyOC43IDM1OC41IDExMi4yIDI5My4yYy0xLjYtNy40IDIuNS0xNS43IDkuOS0xNy40czE1LjcgMi41IDE3LjQgOS45YzE0IDUyLjkgNjIgOTAuMSAxMTYuNiA5MC4xczEwMi41LTM3LjIgMTE2LjYtOTAuMWMxLjctNy40IDkuOS0xMi40IDE3LjQtOS45IDcuNCAxLjcgMTIuNCA5LjkgOS45IDE3LjR6Il0KICAgIH07CiAgICBmYVNpc3RyaXggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2lzdHJpeCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmM2VlIiwgIk00NDggNDQ5TDMwMS4yIDMwMC4yYzIwLTI3LjkgMzEuOS02Mi4yIDMxLjktOTkuMiAwLTkzLjEtNzQuNy0xNjguOS0xNjYuNS0xNjguOS05MS45LS4xLTE2Ni42IDc1LjctMTY2LjYgMTY4LjhTNzQuNyAzNjkuOCAxNjYuNSAzNjkuOGMzOS44IDAgNzYuMy0xNC4yIDEwNS0zNy45TDQxNy41IDQ4MCA0NDggNDQ5ek0xNjYuNSAzMzAuOGMtNzAuNiAwLTEyOC4xLTU4LjMtMTI4LjEtMTI5LjlTOTUuOSA3MSAxNjYuNSA3MSAyOTQuNiAxMjkuMyAyOTQuNiAyMDAuOSAyMzcuMiAzMzAuOCAxNjYuNSAzMzAuOHoiXQogICAgfTsKICAgIGZhUGVyaXNjb3BlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInBlcmlzY29wZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmM2RhIiwgIk0zNzAgNjMuNmMtMzguNi00MS04OS41LTYzLjYtMTQzLjQtNjMuNi0xMTQuNyAwLTIwOC4xIDk2LjItMjA4LjEgMjE0LjQgMCA3NS4xIDU3LjggMTU5LjggODIuNyAxOTIuNyAzNi42IDQ4LjQgOTEuNCAxMDQuOSAxMjUuNCAxMDQuOSA0MS42IDAgMTEyLjktOTQuMiAxMjAuOS0xMDUgMjQuNi0zMy4xIDgyLTExOC4zIDgyLTE5Mi42IDAtNTYuNS0yMS4xLTExMC4xLTU5LjUtMTUwLjh6TTIyNi42IDQ5My45Yy00Mi41IDAtMTkwLTE2Ny4zLTE5MC0yNzkuNCAwLTEwNy40IDgzLjktMTk2LjMgMTkwLTE5Ni4zIDEwMC44IDAgMTg0LjcgODkgMTg0LjcgMTk2LjMgLjEgMTEyLjEtMTQ3LjQgMjc5LjQtMTg0LjcgMjc5LjR6TTMzOCAyMDYuOGMwIDU5LjEtNTEuMSAxMDkuNy0xMTAuOCAxMDkuNy0xMDAuNiAwLTE1MC43LTEwOC4yLTkyLjktMTgxLjhsMCAuNGMwIDI0LjUgMjAuMSA0NC40IDQ0LjggNDQuNHM0NC44LTE5LjkgNDQuOC00NC40YzAtMTguMi0xMS4xLTMzLjgtMjYuOS00MC43IDc2LjYtMTkuMiAxNDEgMzkuMyAxNDEgMTEyLjR6Il0KICAgIH07CiAgICBmYUV4cGVkaXRlZHNzbCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJleHBlZGl0ZWRzc2wiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjIzZSIsICJNMjU2IDQzLjRhMjEyLjYgMjEyLjYgMCAxIDAgMCA0MjUuMiAyMTIuNiAyMTIuNiAwIDEgMCAwLTQyNS4yek0xNTguNiAxNzYuM2MwLTUzLjcgNDMuNy05Ny40IDk3LjQtOTcuNHM5Ny40IDQzLjcgOTcuNCA5Ny40bDAgMjYuNmMwIDUtMy45IDguOS04LjkgOC45bC0xNy43IDBjLTUgMC04LjktMy45LTguOS04LjlsMC0yNi42YzAtODIuMS0xMjQtODIuMS0xMjQgMGwwIDI2LjZjMCA1LTMuOSA4LjktOC45IDguOWwtMTcuNyAwYy01IDAtOC45LTMuOS04LjktOC45bDAtMjYuNiAuMiAwek0zOTcuNyAzODBjMCA5LjctOCAxNy43LTE3LjcgMTcuN2wtMjQ4IDBjLTkuNyAwLTE3LjctOC0xNy43LTE3LjdsMC0xNDEuN2MwLTkuNyA4LTE3LjcgMTcuNy0xNy43bDI0OCAwYzkuNyAwIDE3LjcgOCAxNy43IDE3LjdsMCAxNDEuN3ptLTI0OC0xMzcuM2wwIDEzMi45YzAgMi41LTEuOSA0LjQtNC40IDQuNGwtOC45IDBjLTIuNSAwLTQuNC0xLjktNC40LTQuNGwwLTEzMi45YzAtMi41IDEuOS00LjQgNC40LTQuNGw4LjkgMGMyLjUgMCA0LjQgMS45IDQuNCA0LjR6bTE0MS43IDQ4LjdjMCAxMy03LjIgMjQuNC0xNy43IDMwLjRsMCAzMS42YzAgNS0zLjkgOC45LTguOSA4LjlsLTE3LjcgMGMtNSAwLTguOS0zLjktOC45LTguOWwwLTMxLjZjLTEwLjUtNi4xLTE3LjctMTcuNC0xNy43LTMwLjQgMC0xOS43IDE1LjgtMzUuNCAzNS40LTM1LjRzMzUuNSAxNS44IDM1LjUgMzUuNHpNMjU2IDhhMjQ4IDI0OCAwIDEgMCAwIDQ5NiAyNDggMjQ4IDAgMSAwIDAtNDk2em0wIDE3LjdhMjMwLjMgMjMwLjMgMCAxIDEgMCA0NjAuNiAyMzAuMyAyMzAuMyAwIDEgMSAwLTQ2MC42eiJdCiAgICB9OwogICAgZmFOYXBzdGVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm5hcHN0ZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjNkMiIsICJNMzA2LjMgMzczLjZjLTE0LjIgMTMuNi0zMS4zIDI0LjEtNTAuNCAzMC41LTE5LTYuNC0zNi4yLTE2LjktNTAuMy0zMC41bDEwMC43IDB6bTQ0LTE5OS42YzIwLTE2LjkgNDMuNi0yOS4yIDY5LjYtMzYuMmwwIDE2MS4yYzAgMjE5LjQtMzI4IDIxNy42LTMyOCAuM2wwLTE2MS42YzI1LjkgNi45IDQ5LjYgMTkuNiA2OS41IDM2LjQgNTYuOC00MCAxMzIuNS0zOS45IDE4OC45LS4xek0xNDEuNSAxMTUuNWM2NC40LTYwIDE2NC4zLTYwLjEgMjI4LjktLjItNy4xIDMuNS0xMy45IDcuMy0yMC42IDExLjUtNTguNy0zMC41LTEyOS4yLTMwLjQtMTg3LjkgLjEtNi4zLTQtMTMuOS04LjItMjAuNC0xMS40ek01MS44IDkzLjJsMCA2OS4zYy01OC40IDM2LjUtNTguNCAxMjEuMSAuMSAxNTguMyAyNi40IDI0NS4xIDM4MS43IDI0MC4zIDQwNy42IDEuNWwuMy0xLjdjNTguNy0zNi4zIDU4LjktMTIxLjcgLjItMTU4LjJsMC02OS4yYy0xNy4zIC41LTM0IDMtNTAuMSA3LjQtODItOTEuNS0yMjUuNS05MS41LTMwNy41IC4xLTE2LjMtNC40LTMzLjEtNy01MC42LTcuNXpNMjY3LjIgMzUyczM2LS4zIDYxLjMtMS41YzEwLjItLjUgMjEuMS00IDI1LjUtNi41IDI2LjMtMTUuMSAyNS40LTM5LjIgMjYuMi00Ny40LTc5LjUtLjYtOTkuOS0zLjktMTEzIDU1LjR6TTEzMS43IDI5Ni43Yy44IDguMi0uMSAzMi4zIDI2LjIgNDcuNCA0LjQgMi41IDE1LjIgNiAyNS41IDYuNSAyNS4zIDEuMSA2MS4zIDEuNSA2MS4zIDEuNS0xMy4yLTU5LjQtMzMuNy01Ni4xLTExMy01NS40ek0zMDAuOCA0MjAuMWMtMy4yLTUuMy02LjktNy4zLTYuOS03LjMtMjQuOCA3LjMtNTIuMiA2LjktNzUuOSAwIDAgMC0yLjkgMS41LTYuNCA2LjYtMi44IDQuMS0zLjcgOS42LTMuNyA5LjYgMjkuMSAxNy42IDY3LjEgMTcuNiA5Ni4yIDAtLjEtLjEtLjMtNC0zLjMtOC45eiJdCiAgICB9OwogICAgZmFEZWxpY2lvdXMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZGVsaWNpb3VzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYxYTUiLCAiTTQ0Ni42IDY4Yy0uNC0xLjUtLjktMy0xLjQtNC41LS45LTIuNS0yLTQuOC0zLjMtNy4xLTEuNC0yLjQtMy00LjgtNC43LTYuOS0yLjEtMi41LTQuNC00LjgtNi45LTYuOC0xLjEtLjktMi4yLTEuNy0zLjMtMi41LTEuMy0uOS0yLjYtMS43LTQtMi40LTEuOC0xLTMuNi0xLjgtNS41LTIuNS0xLjctLjctMy41LTEuMy01LjQtMS43LTMuOC0xLTcuOS0xLjUtMTItMS41bC0zNTIgMEMyMS42IDMyIC4xIDUzLjUgLjEgODBsMCAzNTJjMCA0LjEgLjUgOC4yIDEuNSAxMiAyIDcuNyA1LjggMTQuNiAxMSAyMC4zIDEgMS4xIDIuMSAyLjIgMy4zIDMuMyA1LjcgNS4yIDEyLjYgOSAyMC4zIDExIDMuOCAxIDcuOSAxLjUgMTIgMS41bDM1MiAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMzUyLjFjLS4xLTQuMS0uNi04LjItMS42LTEyek00MTYuMSA0MzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0xNzYgMCAwLTE5Mi0xOTIgMCAwLTE3NmMwLTguOCA3LjItMTYgMTYtMTZsMTc2IDAgMCAxOTIgMTkyIDAgMCAxNzZ6Il0KICAgIH07CiAgICBmYUd1aWxkZWQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZ3VpbGRlZCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlMDdlIiwgIk00NDMuOSA2NEw1IDY0YzAgMTAzLjMgMjIuMiAxODAuMSA0My40IDIyMi40IDY0LjEgMTI3LjggMTc2IDE2MS42IDE3Ny4zIDE2MS42IDU1LjctMjAuNSAxMDQuNS01Ni4zIDE0MC42LTEwMy41IDI1LjktMzMuOSA1My4xLTg3LjIgNjUuOS0xNDUuOGwtMjU5LjkgMGM0LjEgMzYuNCAyMi4yIDY3LjkgNDUuMSA4Ni45bDg4LjYgMGMtMTcgMjguMi00OC4yIDU0LjQtODAuNSA2OS41LTMxLjItMTMuMy02OS4xLTQ2LjUtOTYuNS05OC40LTI2LjctNTMuOC0yNy4xLTEwNS45LTI3LjEtMTA1LjlsMzM2LjEgMGM0LTI4LjggNS45LTU3LjkgNS45LTg2Ljl6Il0KICAgIH07CiAgICBmYVhib3ggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAieGJveCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNDEyIiwgIk0zNjkuOSAzMTguMmM0NC4zIDU0LjMgNjQuNyA5OC44IDU0LjQgMTE4LjctNy45IDE1LjEtNTYuNyA0NC42LTkyLjYgNTUuOS0yOS42IDkuMy02OC40IDEzLjMtMTAwLjQgMTAuMi0zOC4yLTMuNy03Ni45LTE3LjQtMTEwLjEtMzktMjcuOS0xOC4yLTM0LjItMjUuNy0zNC4yLTQwLjYgMC0yOS45IDMyLjktODIuMyA4OS4yLTE0Mi4xIDMyLTMzLjkgNzYuNS03My43IDgxLjQtNzIuNiA5LjQgMi4xIDg0LjMgNzUuMSAxMTIuMyAxMDkuNXpNMTg4LjYgMTQzLjhjLTI5LjctMjYuOS01OC4xLTUzLjktODYuNC02My40LTE1LjItNS4xLTE2LjMtNC44LTI4LjcgOC4xLTI5LjIgMzAuNC01My41IDc5LjctNjAuMyAxMjIuNC01LjQgMzQuMi02LjEgNDMuOC00LjIgNjAuNSA1LjYgNTAuNSAxNy4zIDg1LjQgNDAuNSAxMjAuOSA5LjUgMTQuNiAxMi4xIDE3LjMgOS4zIDkuOS00LjItMTEtLjMtMzcuNSA5LjUtNjQgMTQuMy0zOSA1My45LTExMi45IDEyMC4zLTE5NC40em0zMTEuNiA2My41Yy0xNi45LTgwLTY3LjUtMTMwLjMtNzQuNi0xMzAuMy03LjMgMC0yNC4yIDYuNS0zNiAxMy45LTIzLjMgMTQuNS00MSAzMS40LTY0LjMgNTIuOCA0Mi40IDUzLjMgMTAyLjIgMTM5LjQgMTIyLjkgMjAyLjMgNi44IDIwLjcgOS43IDQxLjEgNy40IDUyLjMtMS43IDguNS0xLjcgOC41IDEuNCA0LjYgNi4xLTcuNyAxOS45LTMxLjMgMjUuNC00My41IDcuNC0xNi4yIDE1LTQwLjIgMTguNi01OC43IDQuMy0yMi41IDMuOS03MC44LS44LTkzLjR6TTE0MS4zIDQzYzQ3LjctMi41IDEwOS43IDM0LjUgMTE0LjMgMzUuNCAuNyAuMSAxMC40LTQuMiAyMS42LTkuNyA2My45LTMxLjEgOTQtMjUuOCAxMDcuNC0yNS4yLTYzLjktMzkuMy0xNTIuNy01MC0yMzMuOS0xMS43LTIzLjQgMTEuMS0yNCAxMS45LTkuNCAxMS4yeiJdCiAgICB9OwogICAgZmFVbnRhcHBkID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInVudGFwcGQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjQwNSIsICJNNDAxLjUgNDkuOUMzMjEuNyAyMTAgMzE2LjkgMjAyLjQgMzEzLjYgMjIzLjFsLTUuMiAzMi44Yy0xLjkgMTItNi42IDIzLjUtMTMuNyAzMy40TDE0NS44IDQ5Ny4xYy03LjYgMTAuNi0yMC40IDE2LjItMzMuNCAxNC42LTQwLjMtNS03Ny44LTMyLjItOTUuMy02OC41LTUuNy0xMS44LTQuNS0yNS44IDMuMS0zNi40TDE2OS4xIDE5OC45YzcuMS05LjkgMTYuNC0xOCAyNy4yLTIzLjdsMjkuMy0xNS41YzE4LjUtOS44IDkuNy0xMS45IDEzNS42LTEzOC45IDEtNC44IDEtNy4zIDMuNi04IDMtLjcgNi42LTEgNi4zLTQuNmwtLjQtNC42Yy0uMi0xLjkgMS4zLTMuNiAzLjItMy42IDQuNS0uMSAxMy4yIDEuMiAyNS42IDEwIDEyLjMgOC45IDE2LjQgMTYuOCAxNy43IDIxLjEgLjYgMS44LS42IDMuNy0yLjQgNC4ybC00LjUgMS4xYy0zLjQgLjktMi41IDQuNC0yLjMgNy40IC4xIDIuOC0yLjMgMy42LTYuNSA2LjF6TTIzMC4zIDM2LjRjMy40IC45IDIuNSA0LjQgMi4zIDcuNC0uMiAyLjcgMi4xIDMuNSA2LjQgNiA3LjkgMTUuOSAxNS4zIDMwLjUgMjIuMiA0NCAuNyAxLjMgMi4zIDEuNSAzLjMgLjUgMTEuMi0xMiAyNC42LTI2LjIgNDAuNS00Mi42IDEuMy0xLjQgMS40LTMuNSAuMS00LjktOC04LjItMTYuNS0xNi45LTI1LjYtMjYuMS0xLTQuNy0xLTcuMy0zLjYtOC0zLS44LTYuNi0xLTYuMy00LjYgLjMtMy4zIDEuNC04LjEtMi44LTguMi00LjUtLjEtMTMuMiAxLjEtMjUuNiAxMC0xMi4zIDguOS0xNi40IDE2LjgtMTcuNyAyMS4xLTEuNCA0LjIgMy42IDQuNiA2LjggNS40ek02MjAuMiA0MDYuN0w0NzEuNCAxOTguOGMtMTMuMi0xOC41LTI2LjYtMjMuNC01Ni40LTM5LjEtMTEuMi01LjktMTQuMi0xMC45LTMwLjUtMjguOS0xLTEuMS0yLjktLjktMy42IC41LTQ2LjMgODguOC00Ny4xIDgyLjgtNDkgOTQuOC0xLjcgMTAuNy0xLjMgMjAgLjMgMjkuOCAxLjkgMTIgNi42IDIzLjUgMTMuNyAzMy40TDQ5NC44IDQ5Ny4yYzcuNiAxMC42IDIwLjIgMTYuMiAzMy4xIDE0LjcgNDAuMy00LjkgNzgtMzIgOTUuNy02OC42IDUuNC0xMS45IDQuMy0yNS45LTMuNC0zNi42eiJdCiAgICB9OwogICAgZmFHb29nbGVQbHVzRyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnb29nbGUtcGx1cy1nIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYwZDUiLCAiTTM4Ni4zIDIyOC41YzEuOCA5LjcgMy4xIDE5LjQgMy4xIDMyIDAgMTA5LjgtNzMuNiAxODcuNS0xODQuNCAxODcuNS0xMDYuMSAwLTE5Mi04NS45LTE5Mi0xOTJTOTguOSA2NCAyMDUgNjRjNTEuOSAwIDk1LjEgMTguOSAxMjguNiA1MC4zbC01Mi4xIDUwYy0xNC4xLTEzLjYtMzktMjkuNi03Ni41LTI5LjYtNjUuNSAwLTExOC45IDU0LjItMTE4LjkgMTIxLjNTMTM5LjUgMzc3LjMgMjA1IDM3Ny4zYzc2IDAgMTA0LjUtNTQuNyAxMDktODIuOGwtMTA5IDAgMC02NiAxODEuMyAwIDAgMHptMTg1LjQgNi40bDAtNTUuNy01NiAwIDAgNTUuNy01NS43IDAgMCA1NiA1NS43IDAgMCA1NS43IDU2IDAgMC01NS43IDU1LjcgMCAwLTU2LTU1LjcgMHoiXQogICAgfTsKICAgIGZhR2l0aHViQWx0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdpdGh1Yi1hbHQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjExMyIsICJNMjAyLjEgMzI4LjdjMCAyMC45LTEwLjkgNTUuMS0zNi43IDU1LjFzLTM2LjctMzQuMi0zNi43LTU1LjEgMTAuOS01NS4xIDM2LjctNTUuMSAzNi43IDM0LjIgMzYuNyA1NS4xek00OTYgMjc4LjJjMCAzMS45LTMuMiA2NS43LTE3LjUgOTUtMzcuOSA3Ni42LTE0Mi4xIDc0LjgtMjE2LjcgNzQuOC03NS44IDAtMTg2LjIgMi43LTIyNS42LTc0LjgtMTQuNi0yOS0yMC4yLTYzLjEtMjAuMi05NSAwLTQxLjkgMTMuOS04MS41IDQxLjUtMTEzLjYtNS4yLTE1LjgtNy43LTMyLjQtNy43LTQ4LjggMC0yMS41IDQuOS0zMi4zIDE0LjYtNTEuOCA0NS4zIDAgNzQuMyA5IDEwOC44IDM2IDI5LTYuOSA1OC44LTEwIDg4LjctMTAgMjcgMCA1NC4yIDIuOSA4MC40IDkuMiAzNC0yNi43IDYzLTM1LjIgMTA3LjgtMzUuMiA5LjggMTkuNSAxNC42IDMwLjMgMTQuNiA1MS44IDAgMTYuNC0yLjYgMzIuNy03LjcgNDguMiAyNy41IDMyLjQgMzkgNzIuMyAzOSAxMTQuMnptLTY0LjMgNTAuNWMwLTQzLjktMjYuNy04Mi42LTczLjUtODIuNi0xOC45IDAtMzcgMy40LTU2IDYtMTQuOSAyLjMtMjkuOCAzLjItNDUuMSAzLjItMTUuMiAwLTMwLjEtLjktNDUuMS0zLjItMTguNy0yLjYtMzctNi01Ni02LTQ2LjggMC03My41IDM4LjctNzMuNSA4Mi42IDAgODcuOCA4MC40IDEwMS4zIDE1MC40IDEwMS4zbDQ4LjIgMGM3MC4zIDAgMTUwLjYtMTMuNCAxNTAuNi0xMDEuM3ptLTgyLjYtNTUuMWMtMjUuOCAwLTM2LjcgMzQuMi0zNi43IDU1LjFzMTAuOSA1NS4xIDM2LjcgNTUuMSAzNi43LTM0LjIgMzYuNy01NS4xLTEwLjktNTUuMS0zNi43LTU1LjF6Il0KICAgIH07CiAgICBmYUdldFBvY2tldCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnZXQtcG9ja2V0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyNjUiLCAiTTQwNy42IDY0bC0zNjcgMEMxOC41IDY0IDAgODIuNSAwIDEwNC42TDAgMjM5LjhDMCAzNjQuNSA5OS43IDQ2NCAyMjQuMiA0NjQgMzQ4LjIgNDY0IDQ0OCAzNjQuNSA0NDggMjM5LjhsMC0xMzUuMkM0NDggODIuMiA0MzAuMyA2NCA0MDcuNiA2NHptLTE2MiAyNjguNWMtMTIuNCAxMS44LTMxLjQgMTEuMS00Mi40IDAtMTEzLjctMTA4LjktMTE0LjktMTA1LjEtMTE0LjktMTIzLjIgMC0xNi45IDEzLjgtMzAuNyAzMC43LTMwLjcgMTcgMCAxNi4xIDMuOCAxMDUuMiA4OS4zIDkwLjYtODYuOSA4OC42LTg5LjMgMTA1LjUtODkuM3MzMC43IDEzLjggMzAuNyAzMC43YzAgMTcuOC0yLjkgMTUuNy0xMTQuOCAxMjMuMnoiXQogICAgfTsKICAgIGZhR2xpZGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZ2xpZGUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjJhNSIsICJNMjUyLjggMTQ4LjZjMCA4LjgtMS42IDE3LjctMy40IDI2LjQtNS44IDI3LjgtMTEuNiA1NS44LTE3LjMgODMuNi0xLjQgNi4zLTguMyA0LjktMTMuNyA0LjktMjMuOCAwLTMwLjUtMjYtMzAuNS00NS41IDAtMjkuMyAxMS4yLTY4LjEgMzguNS04My4xIDQuMy0yLjUgOS4yLTQuMiAxNC4xLTQuMiAxMS40IDAgMTIuMyA4LjMgMTIuMyAxNy45ek00NDggODBsMCAzNTJjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNDgwYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDgwQzAgNTMuNSAyMS41IDMyIDQ4IDMybDM1MiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4ek0zODQgMjY3YzAtNS4xLTIwLjgtMzcuNy0yNS41LTM5LjUtMi4yLS45LTcuMi0yLjMtOS42LTIuMy0yMy4xIDAtMzguNyAxMC41LTU4LjIgMjEuNWwtLjUtLjVjNC4zLTI5LjQgMTQuNi01Ny4yIDE0LjYtODcuNCAwLTQ0LjYtMjMuOC02Mi43LTY3LjUtNjIuNy03MS43IDAtMTA4IDcwLjgtMTA4IDEyMy41IDAgNTQuNyAzMiA4NSA4Ni4zIDg1IDcuNSAwIDYuOS0uNiA2LjkgMi4zLTEwLjUgODAuMy01Ni41IDgyLjktNTYuNSA1OC45IDAtMjQuNCAyOC0zNi41IDI4LjMtMzgtLjItNy42LTI5LjMtMTcuMi0zNi43LTE3LjItMjEuMSAwLTMyLjcgMzMtMzIuNyA1MC42IDAgMzIuMyAyMC40IDU0LjcgNTMuMyA1NC43IDQ4LjIgMCA4My40LTQ5LjcgOTQuMy05MS43IDkuNC0zNy43IDctMzkuNCAxMi4zLTQyLjEgMjAtMTAuMSAzNS44LTE2LjggNTguNC0xNi44IDExLjEgMCAxOSAyLjMgMzYuNyA1LjIgMS44IC4xIDQuMS0xLjcgNC4xLTMuNXoiXQogICAgfTsKICAgIGZhQml0eSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJiaXR5IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzN2EiLCAiTTg2LjUgNjcuMmM5NS40LTg5LjIgMjQ2LjEtOTEuMiAzNDMuMSAzLjggMTQuMyAxNC4xLTYuNCAzNy4xLTIyLjQgMjEuNS04NC44LTgyLjQtMjE1LjgtODAuMy0yOTguOS0zLjItMTYuMyAxNS4xLTM2LjUtOC4zLTIxLjgtMjIuMXptOTguOSA0MTguNmMxOS4zIDUuNyAyOS4zLTIzLjYgNy45LTMwLTExMi4yLTMzLjktMTc1LjgtMTQ5LjctMTQ3LjUtMjYxIDUtMTkuNi0yNC45LTI4LjEtMzAuMi03LjEtMzIuMSAxMjcuNCA0MS4xIDI1OS44IDE2OS44IDI5OC4xem0xNDguMS0yYzEyMS45LTQwLjIgMTkyLjktMTY2LjkgMTY0LjQtMjkxLTQuNS0xOS43LTM0LjktMTMuOC0zMCA3LjkgMjQuMiAxMDcuNy0zNy4xIDIxNy45LTE0My4yIDI1My40LTIxLjIgNy0xMC40IDM2IDguOCAyOS43em0tNjIuOS03OWwuMi03MS44YzAtOC4yLTYuNi0xNC44LTE0LjgtMTQuOHMtMTQuOCA2LjctMTQuOCAxNC44bC0uMiA3MS44YzAgOC4yIDYuNiAxNC44IDE0LjggMTQuOHMxNC44LTYuNiAxNC44LTE0Ljh6bTcxLTI2OWMyLjEgOTAuOSA0LjcgMTMxLjktODUuNSAxMzIuNS05Mi41LS43LTg2LjktNDQuMy04NS41LTEzMi41IDAtMjEuOC0zMi41LTE5LjYtMzIuNSAwbDAgNzEuNmMwIDY5LjMgNjAuNyA5MC45IDExOCA5MC4xIDU3LjMgLjggMTE4LTIwLjggMTE4LTkwLjFsMC03MS42YzAtMTkuNi0zMi41LTIxLjgtMzIuNSAweiJdCiAgICB9OwogICAgZmFXcGV4cGxvcmVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIndwZXhwbG9yZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjJkZSIsICJNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptNDgwIDBhMjI0IDIyNCAwIDEgMCAtNDQ4IDAgMjI0IDIyNCAwIDEgMCA0NDggMHpNMTYwLjkgMTI0LjZsODYuOSAzNy4xLTM3LjEgODYuOS04Ni45LTM3LjEgMzcuMS04Ni45em0xMTAgMTY5LjFsNDYuNiA5NC0xNC42IDAtNTAtMTAwLTQ4LjkgMTAwLTE0IDAgNTEuMS0xMDYuOS0yMi4zLTkuNCA2LTE0IDY4LjYgMjkuMS02IDE0LjMtMTYuNS03LjF6TTI1OS4xIDE3Ny40bDY4LjYgMjkuNC0yOS40IDY4LjMtNjguMy0yOS4xIDI5LjEtNjguNnptODAuMyA0Mi45bDU0LjYgMjMuMS0yMy40IDU0LjMtNTQuMy0yMy4xIDIzLjEtNTQuM3oiXQogICAgfTsKICAgIGZhTWVnYXBvcnQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibWVnYXBvcnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjVhMyIsICJNMjIyLjUgMjA5LjZsMCA2Ni4yIDMzLjUgMzMuNSAzMy4zLTMzLjMgMC02Ni40LTMzLjQtMzMuNC0zMy40IDMzLjR6TTI1NiA4YTI0OCAyNDggMCAxIDAgMCA0OTYgMjQ4IDI0OCAwIDEgMCAwLTQ5NnpNNDAxLjEgNDIyLjRsLTI2LjEgMTkuMi0yNi0xOS4yIDAtNjUuNS0zMy40LTMzLjQtMzMuNCAzMy40IDAgNjUuNS0yNi4yIDE5LjItMjYuMS0xOS4yIDAtNjUuNS0zMy40LTMzLjQtMzMuNSAzMy40IDAgNjUuNS0yNi4xIDE5LjItMjYuMS0xOS4yIDAtODcgNTkuNS01OS41IDAtODcuOSA1OS41LTU5LjUgMC03NS42IDI2LjEtMTkuMiAyNi4xIDE5LjIgMCA3NS42IDU5LjUgNTkuNSAwIDg3LjYgNTkuNyA1OS43IDAgODcuMS0uMSAweiJdCiAgICB9OwogICAgZmFNZGIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibWRiIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY4Y2EiLCAiTTE3LjQgMTYwLjRsLTEwLjQgMTkxLjYgNDMuOSAwIDUuNi03OS44IDI3LjkgNzkuOCA0NC43IDAgMjUuNS03Ny40IDQuOCA3Ny40IDQ1LjUgMC0xMi44LTE5MS42LTQ1LjUgMC00MC43IDExNy4zLTQyLjMtMTE3LjMtNDYuMyAwem0yODEgMGwtNDcuOSAwIDAgMTkxLjYgNDcuOSAwczk1IC44IDk0LjItOTUuOGMtLjgtOTQuMi05NC4yLTk1LjgtOTQuMi05NS44bDAgMHptLTEuMiAxNDYuNWwwLTEwMi4xczQ2IDQuMyA0Ni44IDUwLjYtNDYuOCA1MS41LTQ2LjggNTEuNWwwIDB6bTIzOC4zLTc0LjJjNy4yLTExLjQgMTAtMjUgOC0zOC4zLTUuMy0zNS44LTU1LjEtMzQuMy01NS4xLTM0LjNsLTUxLjkgMCAwIDE5MS42IDQ1LjUgMHM4NyA0LjggODctNjMuOGMwLTQzLjEtMzMuNS01NS4xLTMzLjUtNTUuMWwwIDB6bS01MS45LTMxLjlzMTMuNi0xLjYgMTYgOS42YzEuNCA2LjctNCAxMi00IDEybC0xMiAwIDAtMjEuNnptLS4xIDEwOS41bC4xLTI0LjkgMC0xOC4yIC4xIDBzNDEuNi00LjcgNDEuMiAyMi40Yy0uMyAyNS43LTQxLjMgMjAuNy00MS4zIDIwLjdsMCAweiJdCiAgICB9OwogICAgZmFQYWdlNCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwYWdlNCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmM2Q3IiwgIk0yNTYgNTA0QzExOSA1MDQgOCAzOTMgOCAyNTZTMTE5IDggMjU2IDhjMjAuOSAwIDQxLjMgMi42IDYwLjcgNy41TDUwLjMgMzkyIDI1NiAzOTIgMjU2IDUwNHptMC0xNDMuNmwwLTIxMy42LTE0OS40IDIxMy42IDE0OS40IDB6TTM1MiAzOTJsMCA5Mi43YzQ1LjctMTkuMiA4NC41LTUxLjcgMTExLjQtOTIuN0wzNTIgMzkyem01Ny40LTEzOC4ybC0yMS4yIDguNCAyMS4yIDguMyAwLTE2Ljd6bS0yMC4zIDU0LjVjLTYuNyAwLTggNi4zLTggMTIuOWwwIDcuNyAxNi4yIDAgMC0xMGMwLTUuOS0yLjMtMTAuNi04LjItMTAuNnpNNTA0IDI1NmMwIDM3LjMtOC4yIDcyLjctMjMgMTA0LjRsLTEyOSAwIDAtMzMzLjFDNDQxLjMgNjQuOCA1MDQgMTUzLjEgNTA0IDI1NnpNMzY4LjQgMTQzLjZsNjguMiAwIDAtNDcuNi0xMy45IDAgMCAzMi42LTEzLjkgMCAwLTI5LjYtMTMuOSAwIDAgMjkuNi0xMi43IDAgMC0zMi42LTEzLjkgMCAwIDQ3LjYgLjEgMHptNjguMSAxODUuM2wtMjYuNSAwIDAtMTFjMC0xNS40LTUuNi0yNS4yLTIwLjktMjUuMi0xNS40IDAtMjAuNyAxMC42LTIwLjcgMjUuOWwwIDI1LjMgNjguMiAwIDAtMTUtLjEgMHptMC0xMDNsLTY4LjIgMjkuNyAwIDEyLjQgNjguMiAyOS41IDAtMTYuNi0xNC40LTUuNyAwLTI2LjUgMTQuNC01LjkgMC0xNi45em0tNC44LTY4LjVsLTM1LjYgMCAwIDI2LjYgMTMuOSAwIDAtMTIuMiAxMSAwYzguNiAxNS44IDEuMyAzNS4zLTE4LjYgMzUuMy0yMi41IDAtMjguMy0yNS4zLTE1LjUtMzcuN2wtMTEuNi0xMC42Yy0xNi4yIDE3LjUtMTIuMiA2My45IDI3LjEgNjMuOSAzNCAwIDQ0LjctMzUuOSAyOS4zLTY1LjN6Il0KICAgIH07CiAgICBmYVRoZVJlZFlldGkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidGhlLXJlZC15ZXRpIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY2OWQiLCAiTTQ4OC43IDI0MS43bDIwLjcgNy4xYy05LjYtMjMuOS0yMy45LTM3LTMxLjctNDQuOGw3LjEtMTguMmMuMiAwIDEyLjMtMjcuOC0yLjUtMzAuNy0uNi0xMS4zLTYuNi0yNy0xOC40LTI3LTcuNi0xMC42LTE3LjctMTIuMy0zMC43LTUuOS05LjEgNC40LTE3LjYgMTAtMjUuMyAxNi41LTUuMy02LjQtMyAuNC0zLTI5LjgtMzcuMS0yNC4zLTQ1LjQtMTEuNy03NC44IDNsLjUgLjVjLTIyLTcuNy00NS4xLTEyLjItNjguNC0xMy4zLTUuNS04LjctMTguNi0xOS4xLTI1LjEtMjUuMWwyNC44IDcuMWMtNS41LTUuNS0yNi44LTEyLjktMzQuMi0xNS4yIDE4LjItNC4xIDI5LjgtMjAuOCA0Mi41LTMzLTM0LjktMTAuMS02Ny45LTUuOS05Ny45IDExLjhsMTItNDQuMi0xLjgtLjVjLTMxLjYgMjQuMi0zMyA0MS45LTMzLjcgNDUuNS0uOS0yLjQtNi4zLTE5LjYtMTUuMi0yNy0zLjMgOC4xLTMuNSAxNy4xLS41IDI1LjMgMyA4LjQgNS45IDE0LjggOC40IDE4LjktMTYtMy4zLTI4LjMtNC45LTQ5LjIgMGwtMy43IDAgMzMgMTQuM2MtMjAuMiAxOC45LTM2LjEgNDEuOS00Ni43IDY3LjRsLTEuNyA4LjQgMS43IDEuNyA3LjYtNC43Yy0zLjMgMTEuNi01LjMgMTkuNC02LjYgMjUuOC0xMC45IDEyLjItMjAuMiAyNS44LTI3LjggNDAuMy0xNSAxLTMxLjggMTAuOC00MC4zIDE0LjNsMyAzLjQgMjguOCAxYy0uNSAxLS43IDIuMi0xLjIgMy4yLTcuMyA2LjQtMzkuOCAzNy43LTMzIDgwLjdsMjAuMi0yMi40Yy41IDEuNyAuNyAzLjQgMS4yIDUuMiAwIDI1LjUgLjQgODkuNiA2NC45IDE1MC41IDQzLjYgNDAgOTYgNjAuMiAxNTcuNSA2MC4yIDEyMS43IDAgMjIzLTg3LjMgMjIzLTIxMS41IDYuOC05LjctMS4yIDMgMTYuNy0yNS4xbDEzIDE0LjMgMi41LS41Yy0xLjgtMTEuNy00LjgtMjMuMS04LjktMzQuMi0xLjUtNC44LTMuOC05LjMtNi44LTEzLjNsMCAwek0zOTguNSAxMTEuMmwtLjUgMjEuOWM1LjUgMTguMSAxNi45IDE3LjIgMjIuNCAxNy4ybC0zLjQtNC43IDIyLjQtNS40Yy05IC41LTE4IC41LTI3IDAgMTIuOC0yLjEgMzMuMy0yOSA0My0xMS4zIDMuNCA3LjYgNi40IDE3LjIgOS4zIDI3LjhsMS43LTUuOWMtMS4zLTUtMS44LTEwLjEtMS43LTE1LjIgNS40IC41IDguOCAzLjQgOS4zIDEwLjEgLjUgNi40IDEuNyAxNC44IDMuNCAyNS4zbDQuNy0xMS4zYzQuNiAwIDQuNS0zLjYtMi41IDIwLjctMjAuOS04LjctMzUuMS04LjQtNDYuNS04LjRsMTguMi0xNmMtMjUuMyA4LjItMzMgMTAuOC01NC44IDIwLjktMS4xLTUuNC01LTEzLjUtMTYtMTkuOS0zLjIgMy44LTIuOCAuOS0uNyAxNC44bC0yLjUgMGMtMS4yLTguMi00LjEtMTYtOC40LTIzLjFsNC4yLTMuNGM4LjQtNy4xIDExLjgtMTQuMyAxMC42LTIxLjktLjUtNi40LTUuNC0xMy41LTEzLjUtMjAuNyA1LjYtMy40IDE1LjItLjQgMjguMyA4LjV6bS0zOS42LTEwLjFjMi43IDEuOSAxMS40IDUuNCAxOC45IDE3LjIgNC4yIDguNCA0IDkuOCAzLjQgMTEuMS0uNSAyLjQtLjUgNC4zLTMgNy4xLTEuNyAyLjUtNS40IDQuNy0xMS44IDcuNi03LjYtMTMtMTYuNS0yMy42LTI3LjgtMzEuMmwyMC4zLTExLjh6bS0yNjcuNCA0MmwxLjItMS43YzEuMi0yLjkgNC4yLTcuNiA5LjMtMTUuMmwyLjUtMy40LTEzIDEyLjMgNS40LTQuNy0xMC4xIDkuMy00LjIgMS4yYzEyLjMtMjQuMSAyMy4xLTQxLjMgMzIuNS01MC4yIDkuMy05LjMgMTYtMTYgMjAuMi0xOS40bC02LjQgMS4yYy0xMS4zLTQuMi0xOS40LTcuMS0yNC44LTguNCAyLjUtLjUgMy43LS41IDMuMi0uNSAxMC4zIDAgMTcuNSAuNSAyMC45IDEuMiA1LjIgMS43IDEwLjYgMi41IDE2IDIuNWwuNS0xLjctOC40LTM1LjggMTMuNSAyOWMyLjgtNC40IDQuOC05LjIgNS45LTE0LjMgMS43LTYuNCA1LjQtMTMgMTAuMS0xOS40czcuNi0xMC42IDkuMy0xMS4zYy0yLjYgOC4zLTQuNyAxNi44LTYuNCAyNS4zbC0xLjcgNy4xLS41IDQuNyAyLjUgMi41YzIxLjktMTMuNSA0NS41LTE5LjQgNzEuMy0xOC45bDIxLjEgLjVjLTExLjggMTMuNS0yNy44IDIxLjktNDguNSAyNC44LTcuNyAxLjQtMTUuNiAyLjQtMjMuNCAyLjlsLS4yLS41LTIuNS0xLjJjLTQuOC0xLTkuNy0uMy0xNCAyLTIuNS0uMi00LjktLjUtNy4xLS43bC0yLjUgMS43IC41IDEuMmMyIC4yIDMuOSAuNSA2LjIgLjdsLTIgMy40IDMuNC0uNS0xMC42IDExLjNjLTQuMiAzLTUuNCA2LjQtNC4yIDkuM2w1LjQtMy40IDEuMiAwYzYuMS04LjIgMTUuMi0xMy42IDI1LjMtMTUuMmwwLTNjNi40IC41IDEzIDEgMTkuNCAxLjIgNi40IDAgOC40IC41IDUuNCAxLjIgNy4yIDQgMTQuMSA4LjYgMjAuNyAxMy41IDEzLjUgMTAuMSAyMy42IDIxLjkgMzAgMzUuNCA4LjggMTguMiAxMy41IDM3LjEgMTMuNSA1Ni42IDAgOS41LTEgMTktMyAyOC4zLTMuNSAxNS45LTguOSAzMS4zLTE2IDQ2bDIuNSAuNWMxOC4yLTE5LjcgNDEuOS0xNiA0OS4yLTE2bC02LjQgNS45IDIyLjQgMTcuNy0xLjcgMzAuN2MtNS40LTEyLjMtMTYuNS0yMS4xLTMzLTI3LjggMTYuNSAxNC44IDIzLjYgMjEuMSAyMS45IDIwLjItNC44LTIuOC0zLjUtMS45LTEwLjgtMy43IDQuMSA0LjEgMTcuNSAxOC44IDE4LjIgMjAuN2wuMiAuMi0uMiAuMmMwIDEuOCAxLjYtMS4yLTE0IDIyLjktNzUuMi0xNS4zLTEwNi4zLTQyLjctMTQxLjItNjMuMmwxMS44IDEuMmMtMTEuOC0xOC41LTE1LjYtMTcuNy0zOC40LTI2LjFsMTAuNi04LjRjLTguOC0zLTE4LjItMy0yOC4zIC41bDcuNi0xMC42LTEuMi0xLjdjLTE0LjkgNC4zLTE5LjggOS4yLTIyLjYgMTEuMy0xLjEtNS41LTIuOC0xMi40LTEyLjMtMjguOGwtMS4yIDI3LTEzLjItNWMxLjUtMjUuMiA1LjQtNTAuNSAxMy4yLTc0LjZ6TTM2OCA0NzMuMWMtNDkuOSAyNS01Ni4xIDIyLjQtNTkgMjMuOS0yOS44LTExLjgtNTAuOS0zMS43LTYzLjUtNTguOGwzMCAxNi41Yy05LjgtOS4zLTE4LjMtMTYuNS0zOC40LTQ0LjNsMTEuOCAyMy4xLTE3LjctNy42YzE0LjIgMjEuMSAyMy41IDUxLjcgNjYuNiA3My41LTEyMC44IDI0LjItMTk5LTcyLjEtMjAwLjktNzQuMyAxMS4xIDkuMiAyMi45IDE3LjUgMzUuNCAyNC44IDMuNCAxLjcgNy4xIDIuNSAxMC4xIDEuMmwtMTYtMjAuN2M5LjIgNC4yIDkuNSA0LjUgNjkuMSAyOS00Mi41LTIwLjctNzMuOC00MC44LTkzLjItNjAuMi0uNSA2LjQtMS4yIDEwLjEtMS4yIDEwLjEgOC43IDcuMyAxNS44IDE2LjQgMjAuNyAyNi42LTM5LTE4LjktNTcuNi00Ny42LTcxLjMtODIuNiA0OS45IDU1LjEgMTE4LjkgMzcuNSAxMjAuNSAzNy4xIDM0LjggMTYuNCA2OS45IDIzLjYgMTEzLjkgMTAuNiAzLjMgMCAyMC4zIDE3IDI1LjMgMzkuMWw0LjItMy0yLjUtMjMuNmM5IDkgMjQuOSAyMi42IDM0LjQgMTMtMTUuNi01LjMtMjMuNS05LjUtMjkuNS0zMS43IDQuNiA0LjIgNy42IDkgMjcuOCAxNWwxLjItMS4yLTEwLjUtMTQuMmMxMS43LTQuOC0zLjUgMSAzMi0xMC44IDQuMyAzNC4zIDkgNDkuMiAuNyA4OS41ek00ODMuMyAyNTguN2wtMi41IC41IDMgOS4zYy0zLjUgNS45LTIzLjcgNDQuMy03MS42IDc5LjctMzkuNSAyOS44LTc2LjYgMzkuMS04MC45IDQwLjNsLTcuNi03LjEtMS4yIDMgMTQuMyAxNi03LjEtNC43IDMuNCA0LjItMS4yIDAtMjEuOS0xMy41IDkuMyAyNi42LTE5LTI3LjktMS4yIDIuNSA3LjYgMjljLTYuMS04LjItMjEtMzIuNi01Ni44LTM5LjZsMzIuNSAyMS4yYy0zMS4yIDQuNy02MyAyLjUtOTMuMi02LjQtNC4yLTEuMi04LjktMi41LTEzLjUtNC4ybDEuMi0zLTQ0LjgtMjIuNCAyNi4xIDIyLjRjLTU3LjcgOS4xLTExMy0yNS40LTEyNi40LTgzLjRMMjkuMyAyODQuOCA3IDMwNy4xYzE5LjUtNTcuNSAyNS42LTU3LjkgNTEuNC03MC4xLTkuMS01LjMtMS42LTMuMy0zOC40LTkuMyAxNS44LTUuOCAzMy0xNS40IDczIDUuMiAxLjItLjcgMi40LTEuMyAzLjctMS43IC42LTMuMiAuNC0uOCAxLTExLjggMy45IDEwIDMuNiA4LjcgMyA5LjNsMS43IC41YzEyLjctNi41IDguOS00LjUgMTctOC45bC01LjQgMTMuNSAyMi4zLTUuOC04LjQgOC40IDIuNSAyLjVjNC41LTEuOCAzMC4zIDMuNCA0MC44IDE2bC0yMy42LTIuNWMzOS40IDIzIDUxLjUgNTQgNTUuOCA2OS42bDEuNy0xLjJjLTIuOC0yMi4zLTEyLjQtMzMuOS0xNi00MC4xIDQuMiA1IDM5LjIgMzQuNiAxMTAuNCA0Ni0xMS4zLS41LTIzLjEgNS40LTM0LjkgMTguOWw0Ni43LTIwLjItOS4zIDIxLjljNy42LTEwLjEgMTQuOC0yMy42IDIxLjItMzkuNmwwLS41IDEuMi0zLTEuMiAxNmMxMy41LTQxLjggMjUuMy03OC41IDM1LjQtMTA5LjdsMTMuNS0yNy44IDAtMi01LjQtNC4yIDEwLjEgMCA1LjkgNC4yIDIuNS0xLjItMy40LTE2IDEyLjMgMTguOSA0MS44LTIwLjItMTQuOCAxMyAuNSAyLjkgMTcuNy0uNWMxMS4xIC40IDIyLjEgMS44IDMzIDQuMmwtMjMuNiAyLjUtMS4yIDMgMjYuNiAyMy4xYzkuOSA5LjkgMTguOSAyMC42IDI3IDMyLTExLjItMy4zLTEwLjMtMy40LTIxLjItMy40bDEyLjMgMzIuNS04LjktMTIuOHptLTYuMS03MS4zbC0zLjkgMTMtMTQuMy0xMS44IDE4LjItMS4yem0tMjU0LjggNy4xYzEuNyAxMC42IDQuNyAxNy43IDguOCAyMS45LTkuMyA2LjYtMjcuNSAxMy45LTQ2LjUgMTZsLjUgMS4yYzguMyAxLjMgMTYuOSAuNCAyNC44LTIuNWwtNy4xIDEzYzQuMi0xLjcgMTAuMS03LjEgMTcuNy0xNC44IDExLjktNS41IDEyLjctNS4xIDIwLjItMTYtMTIuNy02LjQtMTUuNy0xMy43LTE4LjQtMTguOHptMy43LTEwMi4zYy02LjQtMy40LTEwLjYgMy0xMi4zIDE4LjlzMi41IDI5LjUgMTEuOCAzOS42IDE4LjIgMTAuNiAyNi4xIDMgMy40LTIzLjYtMTEuMy00Ny43Yy0zLjUtNS43LTguNC0xMC41LTE0LjMtMTMuOGwwIDB6bS00LjcgNDYuM2M1LjQgMi4yIDEwLjUgMS45IDEyLjMtMTAuNmwwLTQuNy0xLjIgLjVjLTQuMy0zLjEtMi41LTQuNS0xLjctNi4ybC41LS41Yy0uOS0xLjItNS04LjEtMTIuNSA0LjctLjUtMTMuNSAuNS0yMS45IDMtMjQuOCAxLjItMi41IDQuNy0xLjIgMTEuMyA0LjIgNi40IDUuNCAxMS4zIDE2IDE1LjIgMzIuNSA2LjUgMjgtMTkuOCAyNi4yLTI2LjkgNC45em0tNDUtNS41YzEuNiAuMyA5LjMtMS4xIDkuMy0xNC44bC0uNSAwYy01LjQtMS4xLTIuMi01LjUtLjctNS45LTEuNy0zLTMuNC00LjItNS40LTQuNy04LjEgMC0xMS42IDEyLjctOC4xIDIxLjIgLjUgMS4xIDEuMyAyIDIuMiAyLjhzMiAxLjIgMy4yIDEuNGwwIDB6bTQwLjEtNTAuMWwtMi41IC41IC41IDNjOS4xLS41IDE4LjEgMS41IDI2LjEgNS45LTIuNS01LjUtMTAtMTQuMy0yOC4zLTE0LjNsLjUgMi41IDMuNyAyLjR6bS03MS44IDQ5LjRjMjEuNyAxNi44IDE2LjUgMjEuNCA0Ni41IDIzLjZsLTIuOS00LjdjOC40LTcuMiAxMy43LTE3LjMgMTQuOC0yOC4zIDEuNy0xNi0xLjItMjkuNS04LjgtNDEuM2wxMy03LjZjMC0uMyAwLS42LS4xLS45cy0uMi0uNi0uNC0uOGMtMi4yLS45LTQuNi0xLjItNy0uOXMtNC42IDEuMi02LjUgMi42Yy0xMi43IDYuNy0yOCAyMC45LTI5IDIyLjQtMS43IDEuNy0zLjQgNS45LTUuNCAxMy41LTEuOSA3LjctMi45IDE1LjYtMi45IDIzLjYtNC43LTgtMTAuNS02LjQtMTkuOS01LjlsNy4xIDcuNmMtMTYuNSAwLTIzLjMgMTUuNC0yMy42IDE2IDYuOCAwIDQuNi03LjYgMzAtMTIuMy00LjMtNi4zLTMuMy01LTQuOS02LjZ6bTE4LjctMTguN2MxLjItNy42IDMuNC0xMyA2LjQtMTcuMiA1LjQtNi40IDEwLjYtMTAuMSAxNi0xMS44IDQuMi0xLjcgNy4xIDEuMiAxMC4xIDkuMyAyLjUgOC4yIDMuNSAxNi44IDMgMjUuMy0uNSA5LjMtMy40IDE3LjItOC40IDIzLjEtMi45IDMuNC01LjQgNS45LTYuNCA3LjYtMy44IC40LTcuNiAuMi0xMS4zLS41bC03LjEtMy40LTUuNC02LjRjLjgtMTAgMS4zLTE4LjggMy4xLTI2em00MiA1Ni4xYy0zNC44IDE0LjQtMzQuNyAxNC0zNi4xIDE0LjMtMjAuOCA0LjctMTktMjQuNC0xOC45LTI0LjhsNS45LTEuMi0uNS0yLjVjLTIwLjItMi42LTMxIDQuMi0zMi41IDQuOSAuNSAuNSAzIDMuNCA1LjkgOS4zIDQuMi02LjQgOC44LTEwLjEgMTUuMi0xMC42LTEuNyAxMS4yLTEuMiAyMi43IDEuNyAzMy43IC4xIC41IDIuNiAxNy40IDI3LjUgMjQuMSAxMS4zIDMgMjcgMS4yIDQ4LjktNS40bC05LjIgLjVjLTQuMi0xNC44LTYuNC0yNC44LTUuOS0yOS41IDExLjMtOC44IDIxLjktMTEuMyAzMC43LTcuNmwyLjUgMC0xMS44LTcuNi03LjEgLjVjLTUuOSAxLjItMTIuMyA0LjItMTkuNCA4LjRsMy4xLTYuNXoiXQogICAgfTsKICAgIGZhSmlyYSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJqaXJhIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY3YjEiLCAiTTQ5OC41IDI0MS43Yy03Mi45LTcyLjctMTY5LjQtMTY5LjktMjQxLjUtMjQxLjctMTY1LjUgMTY0LjktMjQyLjUgMjQxLjctMjQyLjUgMjQxLjctNy45IDcuOS03LjkgMjAuNyAwIDI4LjcgMTMyLjggMTMyLjMgNjEuOCA2MS41IDI0Mi41IDI0MS42IDM3OS40LTM3OCAxNS43LTE2LjcgMjQxLjUtMjQxLjcgOC03LjkgOC0yMC43IDAtMjguNnpNMjU3IDMzMS43bC03Ni03NS43IDc2LTc1LjcgNzYgNzUuNy03NiA3NS43eiJdCiAgICB9OwogICAgZmFGZWRleCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmZWRleCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNzk3IiwgIk01ODYgMjg0LjVsNTMuMy01OS45LTYyLjQgMC0yMS43IDI0LjgtMjIuNS0yNC44LTExOC43IDAgMC0xNiA1Ni4xIDAgMC00OC4xLTE1MS4yIDAgMCA3NS41LS41IDBjLTkuNi0xMS0yMS41LTE0LjgtMzUuNC0xNC44LTI4LjQgMC00OS44IDE5LjQtNTcuMyA0NC45LTE4LTU5LjQtOTcuNC01Ny42LTEyMS45LTE0bDAtMjQuMi01NC44IDAgMC0yNi4yIDYwIDAgMC00MS4xLTEwOSAwIDAgMTg0LjQgNDkgMCAwLTc3LjUgNDguOSAwYy0xLjUgNS43LTIuMyAxMS44LTIuMyAxOC4yIDAgNzMuMSAxMDIuNiA5MS40IDEzMC4yIDIzLjdsLTQyIDBjLTE0LjcgMjAuOS00NS44IDguOS00NS44LTE0LjZsODUuNSAwYzMuNyAzMC41IDI3LjQgNTYuOSA2MC4xIDU2LjkgMTQuMSAwIDI3LTYuOSAzNC45LTE4LjZsLjUgMCAwIDExLjkgMjEyLjIgMCAyMi4xLTI1IDIyLjMgMjUgNjQuNCAwLTU0LTYwLjV6TTEzOS4zIDI2Ny45YzYuMS0yNi4zIDQxLjctMjUuNiA0Ni41IDBsLTQ2LjUgMHptMTUzLjQgNDguOWMtMzQuNiAwLTM0LTYyLjggMC02Mi44IDMyLjYgMCAzNC41IDYyLjggMCA2Mi44em0xNjcuOCAxOS4xbC05NC40IDAgMC0xNjYuNSA5NSAwIDAgMzAuMi01Ni4xIDAgMCAzMy45IDU1LjUgMCAwIDI4LjEtNTYuMSAwIDAgNDQuNyA1Ni4xIDAgMCAyOS42em0tNDUuOS0zOS44bDAtMjQuNCA1Ni4xIDAgMC00NCA1MC43IDU3LTUwLjcgNTcgMC00NS42LTU2LjEgMHptMTM4LjYgMTAuM2wtMjYuMSAyOS41LTM4LjEgMCA0NS42LTUxLjItNDUuNi01MS4yIDM5LjcgMCAyNi42IDI5LjMgMjUuNi0yOS4zIDM4LjUgMC00NS40IDUxIDQ2IDUxLjQtNDAuNSAwLTI2LjMtMjkuNXoiXQogICAgfTsKICAgIGZhRXZlcm5vdGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZXZlcm5vdGUiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjgzOSIsICJNMTIxLjEgMTMyLjJjMS42IDIyLjMtMTcuNiAyMS42LTIxLjYgMjEuNi02OC45IDAtNzMuNi0xLTgzLjYgMy4zLS42IC4yLS43IDAtLjQtLjRMMTI0LjEgNDYuNGMuNC0uNCAuNi0uMiAuNCAuNC00LjQgMTAtMy40IDE1LjEtMy40IDg1LjR6bTc5IDMwOGMtMTQuNy0zNy4xIDEzLTc2LjkgNTIuNS03Ni42IDE3LjUgMCAyMi42IDIzLjIgNy45IDMxLjQtNi4yIDMuMy0yNC45IDEuNy0yNS4xIDE5LjIgMCAxNy4xIDE5LjcgMjUgMzEuMiAyNC45IDYgMCAxMS45LTEuMiAxNy41LTMuNXMxMC42LTUuNyAxNC44LTkuOSA3LjYtOS4zIDkuOS0xNC44IDMuNS0xMS41IDMuNS0xNy41bDAtLjFjMC0xMS42LTcuOC00Ny4yLTQ3LjUtNTUuMy03LjctMS41LTY1LTYuMy02OC40LTUwLjUtMy43IDE2LjktMTcuNCA2My41LTQzLjEgNjkuMS04LjcgMS45LTY5LjcgNy42LTExMi45LTM2LjggMCAwLTE4LjYtMTUuMi0yOC4yLTU4LTMuNC0xNS43LTkuMy0zOS43LTExLjEtNjIgMC0xOCAxMS4xLTMwLjQgMjUuMS0zMi4yIDgxIDAgOTAgMi4zIDEwMS03LjggOS44LTkuMiA3LjgtMTUuNSA3LjgtMTAyLjggMS04LjMgNy44LTMwLjggNTMuNC0yNC4xIDYgLjkgMzEuOSA0LjIgMzcuNSAzMC42TDI5MCA3NC44YzIwLjQgMy43IDcwLjkgNyA4MC42IDU3LjkgMjIuNyAxMjEuMSA4LjkgMjM4LjUgNy44IDIzOC41LTE2IDExNC40LTExMS4xIDEwOC45LTExMS4xIDEwOC45LTE5LS4yLTU0LjItOS40LTY3LjMtMzkuOGwwIDB6TTI4MSAyMzUuNGMtMSAxLjktMi4yIDYgLjkgNyAxNC4xIDQuOSAzOS44IDYuOCA0NS45IDUuNSAzLjEtLjIgMy4xLTQuNCAyLjUtNi42LTMuNS0yMS44LTQwLjgtMjYuNS00OS4yLTUuOWwwIDB6Il0KICAgIH07CiAgICBmYVVzYiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ1c2IiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjI4NyIsICJNNjMzLjUgMjU2YzAgMy4xLTEuNyA2LjEtNC41IDcuNUw1MzkuOSAzMTdjLTEuNCAuOC0yLjggMS40LTQuNSAxLjQtMS40IDAtMy4xLS4zLTQuNS0xLjEtMi44LTEuNy00LjUtNC41LTQuNS03LjhsMC0zNS42LTIzMC43IDBjMjUuMyAzOS42IDQwLjUgMTA2LjkgNjkuNiAxMDYuOWwyNi43IDAgMC0yNi44YzAtNSAzLjktOC45IDguOS04LjlsODkuMSAwYzUgMCA4LjkgMy45IDguOSA4LjlsMCA4OS4xYzAgNS0zLjkgOC45LTguOSA4LjlsLTg5LjEgMGMtNSAwLTguOS0zLjktOC45LTguOWwwLTI2LjctMjYuNyAwYy03NS40IDAtODEuMS0xNDIuNS0xMjQuNy0xNDIuNWwtMTAwLjMgMGMtOC4xIDMwLjYtMzUuOSA1My41LTY5IDUzLjUtMzkuMy0uMS03MS4zLTMyLjEtNzEuMy03MS40czMyLTcxLjMgNzEuMy03MS4zYzMzLjEgMCA2MSAyMi44IDY5IDUzLjUgMzkuMSAwIDQzLjkgOS41IDc0LjYtNjAuNCA0MC4xLTg5LjEgNTguMS04Mi4xIDEwOC45LTgyLjEgNy41LTIwLjkgMjctMzUuNiA1MC40LTM1LjYgMjkuNSAwIDUzLjUgMjMuOSA1My41IDUzLjVzLTIzLjkgNTMuNS01My41IDUzLjVjLTIzLjQgMC00Mi45LTE0LjgtNTAuNC0zNS42bC0yOS44IDBjLTI5LjEgMC00NC4zIDY3LjQtNjkuNiAxMDYuOWwzMDIuMSAwIDAtMzUuNmMwLTMuMyAxLjctNi4xIDQuNS03LjhzNi40LTEuNCA4LjkgLjNMNjI5IDI0OC44YzIuOCAxLjEgNC41IDQuMSA0LjUgNy4yeiJdCiAgICB9OwogICAgZmFBbmdyeWNyZWF0aXZlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImFuZ3J5Y3JlYXRpdmUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjM2ZSIsICJNNjQwIDIzOC4ybC0zLjIgMjguMi0zNC41IDIuMy0yIDE4LjEgMzQuNS0yLjMtMy4yIDI4LjItMzQuNCAyLjItMi4zIDIwLjEgMzQuNC0yLjItMyAyNi4xLTY0LjcgNC4xIDEyLjctMTEzLjItNDcuMyAxMTUuNC0zMS45IDItMjMuOC0xMTcuOCAzMC4zLTIgMTMuNiA3OS40IDMxLjctODIuNCA5My4xLTYuMnpNNDI2LjggMzcxLjVsMjguMy0xLjggMTIuOS0xMjAuMS0yOC40IDEuOS0xMi44IDEyMHpNMTYyIDM4OC4xbC0xOS40LTM2LTMuNSAzNy40LTI4LjIgMS43IDIuNy0yOS4xYy0xMSAxOC0zMiAzNC4zLTU2LjkgMzUuOC0zMi44IDItNTkuNy0yMC45LTU2LjQtNTguMiAyLjYtMjkuMyAyNi43LTYyLjggNjcuNS02NS40IDM3LjctMi40IDQ3LjYgMjMuMiA1MS4zIDI4LjhsMi44LTMwLjggMzguOS0yLjVjMjAuMS0xLjMgMzguNyAzLjcgNDIuNSAyMy43bDIuNi0yNi42IDY0LjgtNC4yLTIuNyAyNy45LTM2LjQgMi40LTEuNyAxNy45IDM2LjQtMi4zLTIuNyAyNy45LTM2LjQgMi4zLTEuOSAxOS45IDM2LjMtMi4zLTIuMSAyMC44IDU1LTExNy4yIDIzLjgtMS42IDMyLjEgMTEwLjYgOC45LTg1LjYtMjIuMyAxLjQgMi45LTI3LjkgNzUtNC45LTMgMjgtMjQuMyAxLjYtOS43IDkxLjktNTggMy43LTQuMy0xNS42LTM5LjQgMi41LTggMTYuMy0xMjYuMiA3Ljd6bS00NC4zLTcwLjJsLTI2LjQgMS43Yy02LjctMTIuNC0xNC40LTE2LjYtMjYuMy0xNS44LTE5IDEuMi0zMy4zIDE3LjUtMzQuNiAzMy4zLTEuNCAxNiA3LjMgMzIuNSAyOC43IDMxLjIgMTIuOC0uOCAyMS4zLTguNiAyOC45LTE4LjlsMjctMS43IDIuNy0yOS44em01Ni4xLTcuN2MxLjItMTIuOS03LjYtMTMuNi0yNi4xLTEyLjRMMTQ1IDMyNi4zYzE0LjItLjkgMjcuNS0yLjEgMjguOC0xNi4xek0xOTQuOSAzODFsNS44LTYwYy01IDEzLjUtMTQuNyAyMS4xLTI3LjkgMjYuNkwxOTQuOSAzODF6bTEzNS40LTQ1bC03LjktMzcuOC0xNS44IDM5LjMgMjMuNy0xLjV6TTE2MC4yIDI2MS40bC00LjMtMTcuNS0zOS42IDIuNi04LjEgMTguMi0zMS45IDIuMSA1Ny0xMjEuOSAyMy45LTEuNiAzMC43IDEwMiA5LjktMTA0LjcgMjctMS44IDM3LjggNjMuNiA2LjUtNjYuNiAyOC41LTEuOS00IDQxLjJjNy40LTEzLjUgMjIuOS00NC43IDYzLjYtNDcuNSA0MC41LTIuOCA1Mi40IDI5LjMgNTMuNCAzMC4zbDMuMy0zMiAzOS4zLTIuN2MxMi43LS45IDI3LjggLjMgMzYuMyA5LjdsLTQuNC0xMS45IDMyLjItMi4yIDEyLjkgNDMuMiAyMy00NS43IDMxLTIuMi00My42IDc4LjQtNC44IDQ0LjMtMjguNCAxLjkgNC44LTQ0LjMtMTUuOC00M2MxIDIyLjMtOS4yIDQwLjEtMzIgNDkuNmwyNS4yIDM4LjgtMzYuNCAyLjQtMTkuMi0zNi44LTQgMzguMy0yOC40IDEuOSAzLjMtMzEuNWMtNi43IDkuMy0xOS43IDM1LjQtNTkuNiAzOC0yNi4yIDEuNy00NS42LTEwLjMtNTUuNC0zOS4ybC00IDQwLjMtMjUgMS42LTM3LjYtNjMuMy02LjMgNjYuMi01Ni44IDMuN3ptMjc2LjYtODIuMWMxMC4yLS43IDE3LjUtMi4xIDIxLjYtNC4zIDQuNS0yLjQgNy02LjQgNy42LTEyLjEgLjYtNS4zLS42LTguOC0zLjQtMTAuNC0zLjYtMi4xLTEwLjYtMi44LTIyLjktMmwtMi45IDI4Ljh6TTMyNy43IDIxNGM1LjYgNS45IDEyLjcgOC41IDIxLjMgNy45IDQuNy0uMyA5LjEtMS44IDEzLjMtNC4xIDUuNS0zIDEwLjYtOCAxNS4xLTE0LjNsLTM0LjIgMi4zIDIuNC0yMy45IDYzLjEtNC4zIDEuMi0xMi0zMS4yIDIuMWMtNC4xLTMuNy03LjgtNi42LTExLjEtOC4xLTQtMS43LTguMS0yLjgtMTIuMi0yLjUtOCAuNS0xNS4zIDMuNi0yMiA5LjItNy43IDYuNC0xMiAxNC41LTEyLjkgMjQuNC0xLjEgOS42IDEuNCAxNy4zIDcuMiAyMy4zem0tMjAxLjMgOC4ybDIzLjgtMS42LTguMy0zNy42LTE1LjUgMzkuMnoiXQogICAgfTsKICAgIGZhTWl6dW5pID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1penVuaSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmM2NjIiwgIk0yNTYgOGEyNDggMjQ4IDAgMSAwIDAgNDk2IDI0OCAyNDggMCAxIDAgMC00OTZ6TTE3NiAzNTkuOWMtMzEuNCAxMC42LTU4LjggMjcuMy04MCA0OC4yTDk2IDEzNmMwLTIyLjEgMTcuOS00MCA0MC00MHM0MCAxNy45IDQwIDQwbDAgMjIzLjl6TTI5NiAzNTBjLTEyLjktMi0yNi4yLTMuMS0zOS44LTMuMS0xMy44IDAtMjcuMiAxLjEtNDAuMiAzLjFsMC0yMTRjMC0yMi4xIDE3LjktNDAgNDAtNDBzNDAgMTcuOSA0MCA0MGwwIDIxNHptMTIwIDU3LjdjLTIxLjItMjAuOC00OC42LTM3LjQtODAtNDhMMzM2IDEzNmMwLTIyLjEgMTcuOS00MCA0MC00MHM0MCAxNy45IDQwIDQwbDAgMjcxLjd6Il0KICAgIH07CiAgICBmYUl0Y2hJbyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJpdGNoLWlvIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY4M2EiLCAiTTcxLjkgMzQuOEM1MC4yIDQ3LjcgNy40IDk2LjggNyAxMDkuN2wwIDIxLjNjMCAyNy4xIDI1LjMgNTAuOCA0OC4yIDUwLjggMjcuNiAwIDUwLjUtMjIuOCA1MC41LTUwIDAgMjcuMSAyMi4yIDUwIDQ5LjggNTBzNDktMjIuOCA0OS01MGMwIDI3LjEgMjMuNiA1MCA1MS4yIDUwbC41IDBjMjcuNiAwIDUxLjItMjIuOCA1MS4yLTUwIDAgMjcuMSAyMS41IDUwIDQ5IDUwczQ5LjgtMjIuOCA0OS44LTUwYzAgMjcuMSAyMyA1MCA1MC41IDUwIDIzIDAgNDguMy0yMy44IDQ4LjMtNTAuOGwwLTIxLjNjLS40LTEyLjktNDMuMi02Mi4xLTY0LjktNzUtNjcuNC0yLjMtMTE0LjItMi43LTE4NC0yLjdTOTEuMSAzMy4xIDcxLjkgMzQuOHpNMjA0LjIgMTY5LjJjLTIyIDM4LjQtNzcuOSAzOC43LTk5LjggLjItMTMuMiAyMy4xLTQzLjIgMzIuMS01NiAyNy43LTMuOSA0MC4yLTEzLjcgMjM3LjEgMTcuNyAyNjkuMiA4MCAxOC43IDMwMi4xIDE4LjEgMzc5LjggMCAzMS42LTMyLjMgMjEuMy0yMzIgMTcuNy0yNjkuMi0xMi45IDQuNC00Mi45LTQuNi01Ni0yNy43LTIyIDM4LjUtNzcuOCAzOC4xLTk5LjgtLjItNy4xIDEyLjUtMjMgMjguOS01MS44IDI4LjktMTAuNCAuMy0yMC44LTIuMi0yOS45LTcuM3MtMTYuNy0xMi42LTIxLjktMjEuNmwwIDB6bS00MS42IDUzLjhjMTYuNSAwIDMxLjEgMCA0OS4yIDE5LjggMjkuMy0zIDU4LjktMyA4OC4yIDAgMTguMi0xOS43IDMyLjgtMTkuNyA0OS4yLTE5LjcgNTIuMyAwIDY1LjIgNzcuNSA4My45IDE0NC40IDE3LjMgNjIuMi01LjUgNjMuNy0zNCA2My43LTQyLjEtMS42LTY1LjUtMzIuMi02NS41LTYyLjgtMzkuMyA2LjQtMTAxLjkgOC44LTE1NS42IDAgMCAzMC42LTIzLjMgNjEuMi02NS41IDYyLjgtMjguNC0uMS01MS4yLTEuNi0zMy45LTYzLjcgMTguNy02NyAzMS42LTE0NC40IDgzLjktMTQ0LjRsMC0uMXpNMjU2IDI3MC44cy00NC40IDQwLjgtNTIuNCA1NS4ybDI5LTEuMiAwIDI1LjNjMCAxLjUgMjEuMyAuMiAyMy4zIC4yIDExLjYgLjUgMjMuMyAxIDIzLjMtLjJsMC0yNS4zIDI5IDEuMmMtOC0xNC41LTUyLjQtNTUuMi01Mi40LTU1LjJsLjEgMHoiXQogICAgfTsKICAgIGZhV2luZG93cyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ3aW5kb3dzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYxN2EiLCAiTTAgOTMuN2wxODMuNi0yNS4zIDAgMTc3LjQtMTgzLjYgMCAwLTE1Mi4xek0wIDQxOC4zbDE4My42IDI1LjMgMC0xNzUuMi0xODMuNiAwIDAgMTQ5Ljl6bTIwMy44IDI4bDI0NC4yIDMzLjcgMC0yMTEuNi0yNDQuMiAwIDAgMTc3Ljl6bTAtMzgwLjZsMCAxODAuMSAyNDQuMiAwIDAtMjEzLjgtMjQ0LjIgMzMuN3oiXQogICAgfTsKICAgIGZhU3R1bWJsZXVwb24gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3R1bWJsZXVwb24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjFhNCIsICJNNTAyLjkgMjY2bDAgNjkuN2MwIDYyLjEtNTAuMyAxMTIuNC0xMTIuNCAxMTIuNC02MS44IDAtMTEyLjQtNDkuOC0xMTIuNC0xMTEuM2wwLTcwLjIgMzQuMyAxNiA1MS4xLTE1LjIgMCA3MC42YzAgMTQuNyAxMiAyNi41IDI2LjcgMjYuNVM0MTcgMzUyLjcgNDE3IDMzOGwwLTcyIDg1LjkgMHpNMjc4LjIgMjA3LjhsMzQuMyAxNiA1MS4xLTE1LjIgMC0zNS42YzAtNjAuNS01MS4xLTEwOS0xMTIuMS0xMDktNjAuOCAwLTExMi4xIDQ4LjItMTEyLjEgMTA4LjJsMCAxNjIuNGMwIDE0LjktMTIgMjYuNy0yNi43IDI2LjdTODYgMzQ5LjUgODYgMzM0LjZsMC02OC42LTg2IDAgMCA2OS43YzAgNjIgNTAuMyAxMTIuMyAxMTIuNCAxMTIuMyA2MS42IDAgMTEyLjQtNDkuNSAxMTIuNC0xMTAuOGwwLTE2MC4zYzAtMTQuNyAxMi0yNi43IDI2LjctMjYuN3MyNi43IDEyIDI2LjcgMjYuN2wwIDMwLjl6Il0KICAgIH07CiAgICBmYUdvb2dsZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnb29nbGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjFhMCIsICJNNTAwIDI2MS44QzUwMCA0MDMuMyA0MDMuMSA1MDQgMjYwIDUwNCAxMjIuOCA1MDQgMTIgMzkzLjIgMTIgMjU2UzEyMi44IDggMjYwIDhjNjYuOCAwIDEyMyAyNC41IDE2Ni4zIDY0LjlsLTY3LjUgNjQuOWMtODguMy04NS4yLTI1Mi41LTIxLjItMjUyLjUgMTE4LjIgMCA4Ni41IDY5LjEgMTU2LjYgMTUzLjcgMTU2LjYgOTguMiAwIDEzNS03MC40IDE0MC44LTEwNi45bC0xNDAuOCAwIDAtODUuMyAyMzYuMSAwYzIuMyAxMi43IDMuOSAyNC45IDMuOSA0MS40eiJdCiAgICB9OwogICAgZmFEaXNjb3JkID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImRpc2NvcmQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjM5MiIsICJNNDkyLjUgNjkuOGMtLjItLjMtLjQtLjYtLjgtLjctMzguMS0xNy41LTc4LjQtMzAtMTE5LjctMzcuMS0uNC0uMS0uOCAwLTEuMSAuMXMtLjYgLjQtLjggLjhjLTUuNSA5LjktMTAuNSAyMC4yLTE0LjkgMzAuNi00NC42LTYuOC04OS45LTYuOC0xMzQuNCAwLTQuNS0xMC41LTkuNS0yMC43LTE1LjEtMzAuNi0uMi0uMy0uNS0uNi0uOC0uOHMtLjctLjItMS4xLS4yYy00MS4zIDcuMS04MS42IDE5LjYtMTE5LjcgMzcuMS0uMyAuMS0uNiAuNC0uOCAuNy03Ni4yIDExMy44LTk3LjEgMjI0LjktODYuOSAzMzQuNSAwIC4zIC4xIC41IC4yIC44cy4zIC40IC41IC42YzQ0LjQgMzIuOSA5NCA1OCAxNDYuOCA3NC4yIC40IC4xIC44IC4xIDEuMSAwcy43LS40IC45LS43YzExLjMtMTUuNCAyMS40LTMxLjggMzAtNDguOCAuMS0uMiAuMi0uNSAuMi0uOHMwLS41LS4xLS44LS4yLS41LS40LS42LS40LS4zLS43LS40Yy0xNS44LTYuMS0zMS4yLTEzLjQtNDUuOS0yMS45LS4zLS4yLS41LS40LS43LS42cy0uMy0uNi0uMy0uOSAwLS42IC4yLS45IC4zLS41IC42LS43YzMuMS0yLjMgNi4yLTQuNyA5LjEtNy4xIC4zLS4yIC42LS40IC45LS40cy43IDAgMSAuMWM5Ni4yIDQzLjkgMjAwLjQgNDMuOSAyOTUuNSAwIC4zLS4xIC43LS4yIDEtLjJzLjcgLjIgLjkgLjRjMi45IDIuNCA2IDQuOSA5LjEgNy4yIC4yIC4yIC40IC40IC42IC43cy4yIC42IC4yIC45LS4xIC42LS4zIC45LS40IC41LS42IC42Yy0xNC43IDguNi0zMCAxNS45LTQ1LjkgMjEuOC0uMiAuMS0uNSAuMi0uNyAuNHMtLjMgLjQtLjQgLjctLjEgLjUtLjEgLjggLjEgLjUgLjIgLjhjOC44IDE3IDE4LjggMzMuMyAzMCA0OC44IC4yIC4zIC42IC42IC45IC43cy44IC4xIDEuMSAwYzUyLjktMTYuMiAxMDIuNi00MS4zIDE0Ny4xLTc0LjIgLjItLjIgLjQtLjQgLjUtLjZzLjItLjUgLjItLjhjMTIuMy0xMjYuOC0yMC41LTIzNi45LTg2LjktMzM0LjV6bS0zMDIgMjY3LjdjLTI5IDAtNTIuOC0yNi42LTUyLjgtNTkuMnMyMy40LTU5LjIgNTIuOC01OS4yYzI5LjcgMCA1My4zIDI2LjggNTIuOCA1OS4yIDAgMzIuNy0yMy40IDU5LjItNTIuOCA1OS4yem0xOTUuNCAwYy0yOSAwLTUyLjgtMjYuNi01Mi44LTU5LjJzMjMuNC01OS4yIDUyLjgtNTkuMmMyOS43IDAgNTMuMyAyNi44IDUyLjggNTkuMiAwIDMyLjctMjMuMiA1OS4yLTUyLjggNTkuMnoiXQogICAgfTsKICAgIGZhSGFja2VyTmV3cyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJoYWNrZXItbmV3cyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMWQ0IiwgIk0wIDMybDAgNDQ4IDQ0OCAwIDAtNDQ4LTQ0OCAwek0yMS4yIDIyOS4ybC0uMiAwYy4xLS4xIC4yLS4zIC4zLS40IDAgLjEgMCAuMy0uMSAuNHptMjE4IDUzLjlsMCAxMDAuOS0zMS40IDAgMC0xMDIuNy03OS44LTE1My4zIDM3LjMgMGM1Mi41IDk4LjMgNDkuMiAxMDEuMiA1OS4zIDEyNS42IDEyLjMtMjcgNS44LTI0LjQgNjAuNi0xMjUuNmwzNC44IDAtODAuOCAxNTUuMXoiXQogICAgfTsKICAgIGZhRWxldmVudHkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZWxldmVudHkiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsiMTF0eSJdLCAiZTdkNiIsICJNNjE1LjMgMTY4LjVjMi4zIDAgNC42IC43IDYuNiAyLjIgMS45IDEuNCAzLjEgMy4zIDMuOCA1IDEuNCAzLjMgMS44IDcuMyAxLjggMTEuMyAwIDIuMi0uMyA0LjktLjcgNy42bDAgLjQtNTAuOSAyNjQuOSAwIDBjLTQgMjIuMS04LjUgMzkuNC0xMy42IDUxLjctNSAxMi4xLTEwLjkgMjEuNi0xOC42IDI3bDAgMGMtNy41IDUuMy0xNi45IDcuNy0yNy42IDhsLTMgMGMtMTYgMC0yOS4zLTQuMi0zNi45LTE0LjgtLjEtLjEtLjEtLjEtLjItLjItLjEtLjItLjMtLjQtLjUtLjZsMCAwYy0xLjgtMi40LTIuNS01LjItMi45LTcuNC0uNS0yLjgtLjctNi4xLS43LTkuOCAwLTcuMyAuNi0xMy41IDIuMS0xOC4yIDEuNC00LjQgNC44LTEwLjQgMTIuMi0xMC40bDEuMyAuMWMuMiAwIC40IC4xIC41IC4xIC4zIC4xIC42IC4xIC44IC4yIC42IC4xIDEuMyAuMyAyLjIgLjZsNy42IDIuMiAuMSAwIDcuNiAyLjFjLjkgLjIgMS43IC40IDIuMiAuNSAuNCAuMSAuNiAuMSAuNyAuMSAwIDAgLjEgMCAuMi0uMSAuMS0uMSAuNC0uMiAuOC0uNiAuOS0uOSAyLjItMi42IDMuNi01LjcgMi42LTUuOCA0LjItMTQuNyA0LjItMjcuNCAwLS43LS4zLTMuNC0xLjMtOC45LS45LTUuMS0yLjMtMTIuMi00LjItMjEuMWwtNTYtMjMyLjktLjEtLjQgMC0uM2MtLjQtMi43LS43LTUuMy0uNy03LjMgMC0zLjcgLjQtNy41IDEuNy0xMC42IC43LTEuNiAxLjgtMy40IDMuNS00LjkgMS45LTEuNSA0LjItMi4zIDYuNS0yLjNsMzQuNiAwYzQuNiAwIDguNyAxLjcgMTEuOSA1bDEuMyAxLjVjMS4yIDEuNiAyIDMuNCAyLjcgNS4yIC45IDIuNCAxLjUgNS4xIDIgOC4xbDMwLjQgMTYxLjIgMjMuOC0xNjBjLjgtNS44IDIuMi0xMS40IDUuMS0xNS4xIDMtMy44IDcuMi01LjggMTItNS44bDI0IDB6TTM3NS4xIDM0LjZjMi42IDAgNS4xIC43IDcuNCAyLjMgMi4yIDEuNSAzLjcgMy42IDQuNyA1LjcgMS45IDQgMi41IDkuMSAyLjUgMTQuNWwwIDExMS4yYzAgLjEgMCAuMiAwIC4zbDMyLjQgMGMyLjUgMCA1IC42IDcuMiAyLjEgMi4yIDEuNCAzLjcgMy40IDQuOCA1LjUgMiAzLjkgMi42IDguOCAyLjYgMTMuOWwwIDE1LjRjMCA1LS42IDkuOC0yLjYgMTMuNy0xLjEgMi0yLjYgNC00LjggNS40LTIuMiAxLjQtNC43IDItNy4xIDJsLTMyLjUgMCAwIDE0NS44YzAgMTAuOCAuNyAxOS41IDIgMjYuMiAxLjQgNi45IDMuMSAxMC45IDQuNyAxMi45IDEuMiAxLjUgMi4yIDIuNSAzLjEgMy4ybDIuMiAxLjQgLjEgLjEgMi45IC44YzEuMiAuMiAyLjYgLjMgNC4zIC4zbDIwLjMgMGM0LjUgMCA4LjkgMS43IDExLjggNS44IDIuNiAzLjYgMy4zIDguMSAzLjMgMTIuMmwwIDE3LjJjMCA0LjUtLjggOS4zLTMuNCAxMy4xLTMgNC4yLTcuNSA2LTEyLjMgNmwwIDAtMjkuMSAuMWMtOCAwLTE1LS42LTIxLjItMS43LTYuNy0xLjMtMTMuNC00LjEtMjAuMS04LjEtNy4yLTQuNC0xMy0xMC4zLTE3LjUtMTcuOC00LjUtNy41LTcuOS0xNy41LTEwLjUtMjkuNS0yLjYtMTIuMi0zLjktMjYuNi0zLjktNDNsMC0xNDQuOS0xMy40IDBjLTIuNCAwLTQuOS0uNi03LjEtMi0yLjItMS40LTMuNy0zLjQtNC44LTUuNC0yLTMuOS0yLjYtOC43LTIuNi0xMy43bDAtMTUuNGMwLTUuMSAuNi0xMCAyLjYtMTMuOSAxLjEtMi4xIDIuNi00IDQuOC01LjUgMi4yLTEuNSA0LjctMi4xIDcuMi0yLjFsMTMuNCAwIDAtLjYgNS4yLTExMS4yIDAtLjEgLjMtMy45Yy41LTMuOCAxLjMtNy40IDIuNy0xMC4zIDIuMS00LjIgNi03LjkgMTEuOC03LjlsMjguNiAwem0tMjY4IDExLjdjMS44IC4zIDMuNiAuOSA1LjMgMi4xIDIuMSAxLjUgMy41IDMuNSA0LjQgNS40IDEuNyAzLjcgMi4zIDguNCAyLjMgMTMuMmwwIDM3Ny44YzAgNi43LS42IDEyLjYtMi40IDE3LjEtLjkgMi4zLTIuMyA0LjctNC40IDYuNS0yLjMgMi01LjEgMy04LjEgM2wtNDMuNyAwYy0zIDAtNS44LTEuMS04LjEtMy4xLTIuMS0xLjktMy40LTQuMy00LjItNi41LTEuNy00LjUtMi4zLTEwLjMtMi4zLTE3bDAtMzE1LjhjLTQuOCAxLjItOC43IDIuMi0xMS41IDIuOS0xLjkgLjUtMy40IC44LTQuNCAxLjEtLjUgLjEtLjkgLjItMS4yIC4zLS4xIDAtLjMgLjEtLjUgLjEtLjEgMC0uMiAwLS4zIC4xIDAgMC0uMiAwLS4zIDAgMCAwLS4yIDAtLjQgMGwwIDBjLS4xIDAtLjMgMC0uNCAwLS4xIDAtLjIgMC0uMiAwLTIuMiAuMS00LjUtLjQtNi42LTEuNy0yLjMtMS40LTMuOC0zLjQtNC43LTUuMy0xLjgtMy43LTIuMy04LjQtMi4zLTEzbDAtMjcuNGMwLTQuNCAuNy04LjggMi42LTEyLjQgMi4xLTMuOSA1LjUtNi42IDkuOC03LjZsNzUuNS0xOS41YzEuNC0uNCAyLjktLjUgNC40LS41bDEuOCAuMXptMTQzLjgtLjVjMS44IC4zIDMuNiAuOSA1LjIgMi4xIDIuMSAxLjUgMy41IDMuNSA0LjQgNS40IDEuNyAzLjcgMi4yIDguNCAyLjIgMTMuMmwwIDM3Ny44YzAgNi43LS42IDEyLjYtMi40IDE3LjEtLjkgMi4zLTIuMyA0LjctNC40IDYuNS0yLjMgMi01LjEgMy04LjEgM2wtNDMuNyAwYy0zIDAtNS44LTEuMS04LjEtMy4xLTIuMS0xLjktMy40LTQuMy00LjItNi41LTEuNy00LjUtMi4zLTEwLjMtMi4zLTE3bDAtMzE1LjhjLTQuOCAxLjItOC43IDIuMi0xMS41IDIuOS0xLjkgLjUtMy40IC44LTQuNCAxLjEtLjUgLjEtLjkgLjItMS4yIC4zLS4xIDAtLjMgLjEtLjUgLjEtLjEgMC0uMiAwLS4zIC4xLS4xIDAtLjIgMC0uMyAwIDAgMC0uMiAwLS40IDBsMCAwYy0uMSAwLS4yIDAtLjMgMC0uMSAwLS4yIDAtLjMgMC0yLjIgLjEtNC41LS40LTYuNi0xLjctMi4zLTEuNC0zLjgtMy40LTQuNy01LjMtMS44LTMuNy0yLjMtOC4zLTIuMy0xM2wwLTI3LjRjMC00LjQgLjctOC43IDIuNi0xMi40IDIuMS0zLjkgNS41LTYuNiA5LjgtNy42bDc1LjQtMTkuNGMxLjQtLjQgMi45LS41IDQuNC0uNWwxLjggLjF6Il0KICAgIH07CiAgICBmYTExdHkgPSBmYUVsZXZlbnR5OwogICAgZmFUZWFtc3BlYWsgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidGVhbXNwZWFrIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY0ZjkiLCAiTTE1Mi44IDM3LjJjLTMyLjIgMzguMS01Ni4xIDgyLjYtNjkuOSAxMzAuNSAwIC4yLS4xIC4zLS4xIC41LTM5LjMgMTYuMi02Ni44IDU0LjgtNjYuOCA5OS44IDAgNTkuNiA0OC40IDEwOCAxMDggMTA4czEwOC00OC40IDEwOC0xMDhjMC01My41LTM4LjktOTcuOS05MC0xMDYuNSAxNS43LTQxLjggNDAuNC03OS42IDcyLjMtMTEwLjcgMS44LTEuNiA0LTIuNiA2LjMtMy4xIDM3LjItMTEuNSA3Ni43LTEzLjMgMTE0LjgtNS4yIDExOS4zIDI1LjEgMTk4LjYgMTM4LjIgMTgxLjcgMjU4LjgtOC40IDYyLjYtMzguNiAxMTIuNy04Ny43IDE1MS40LTUwLjEgMzkuNy0xMDcuNSA1NC4zLTE3MC4yIDUyLjJsLTI0LTFjMTIuNCAyLjggMjUgNC45IDM3LjYgNi4zIDQwLjcgNC4yIDgxLjQgMi4xIDEyMC4xLTEyLjUgOTQtMzUuNSAxNDkuMy0xMDIuMyAxNjIuOS0yMDIuNSA0LjgtNTIuNi01LjgtMTA1LjQtMzAuOC0xNTItNzAuNC0xMzEuOS0yMzQuMi0xODEuNi0zNjYtMTExLjItMi40IDEuNC00LjUgMy4xLTYuMyA1LjJsLjEgMHpNMzA5LjQgNDMzLjljLTIuMSAxMS41LTQuMiAyMS45LTE0LjYgMzEuMyA1My4yLTEgMTIzLjItMjkuMiAxNjEuOC05Ny4xIDM5LjctNjkuOSAzNy42LTEzOS45LTYuMy0yMDcuOC0zNi41LTU1LjMtODkuOC04Mi40LTE1Ni42LTg2LjYgMS41IDIuMyAzLjIgNC40IDUuMiA2LjNsNS4yIDYuM2MyNS4xIDMxLjMgMzcuNiA2Ny45IDQyLjggMTA3LjUgMi4xIDE1LjctMSAzMC4zLTEzLjYgNDEuOC00LjIgMy4xLTUuMiA2LjMtNC4yIDEwLjRsNy4zIDE3LjcgMjkuMyA1NC4zYzUuMiAxMS41IDQuMiAxOS44LTYuMyAyOC4yLTMuMiAyLjUtNi43IDQuNi0xMC40IDYuM2wtMTguOCA4LjQgMy4xIDEzLjZjMy4xIDYuMyAxIDEyLjUtMy4xIDE3LjctMi41IDIuNC0zLjggNS45LTMuMSA5LjQgMi4xIDExLjUtMi4xIDE5LjgtMTIuNSAyNS4xLTIuMSAxLTQuMiA1LjItNS4yIDcuM2wwLS4xem0tMTMzLjYtMy4xYzE2LjcgMTEuNSAzNC41IDIwLjkgNTMuMiAyNi4xIDI0IDUuMiA0MS44LTYuMyA0NC45LTMwLjMgMS04LjQgNS4yLTE0LjYgMTIuNS0xNy43IDcuMy00LjIgOC40LTcuMyAyLjEtMTMuNmwtOS40LTguNCAxMy42LTQuMmM2LjMtMi4xIDcuMy01LjIgNS4yLTExLjUtMS40LTMtMi40LTYuMi0zLjEtOS40LTMuMS0xNC42LTIuMS0xNS43IDExLjUtMTguOCA4LjQtMy4xIDE1LjctNi4zIDIxLjktMTIuNSAzLjEtMi4xIDMuMS00LjIgMS04LjRsLTE2LjctMzAuM2MtMS0xLjktMi4xLTMuOC0zLjEtNS43LTYuNC0xMS43LTEzLTIzLjYtMTUuNy0zNy4xLTIuMS05LjQtMS0xNy43IDguNC0yNCA1LjItNC4yIDguNC05LjQgOC40LTE2LjctLjQtMTAuMS0xLjUtMjAuMy0zLjEtMzAuMy02LjMtMzcuNi0yMy02OC45LTUxLjItOTUtNS4yLTQuMi05LjQtNi4zLTE2LjctNC4ybC0zNS42IDEyLjcgNiAzLjZjNi4zIDMuNyAxMi4yIDcuMyAxNyAxMi4xIDMwLjMgMjYuMSA0MS44IDYxLjYgNDUuOSAxMDAuMiAxIDguNCAwIDE2LjctNy4zIDIxLjktOC40IDUuMi0xMC40IDEyLjUtNy4zIDIwLjkgNC45IDEzLjIgMTAuNCAyNiAxNi43IDM4LjZMMjkxLjYgMzE4Yy02LjMgOC40LTEzLjYgMTEuNS0yMS45IDE0LjYtMTIuNSAzLjEtMTQuNiA3LjMtMTAuNCAyMC45IC42IDEuNSAxLjQgMi44IDIuMSA0LjIgMi4xIDUuMiAxIDguNC00LjIgMTAuNGwtMTIuNSAzLjEgNS4yIDQuMiA0LjIgNC4yYzQuMiA1LjIgNC4yIDguNC0yLjEgMTAuNC03LjMgNC4yLTExLjUgOS40LTExLjUgMTcuNyAwIDEyLjUtNy4zIDE5LjgtMTguOCAyNC0zLjggMS03LjYgMS41LTExLjUgMWwtMzQuNS0yLjEgLjEgLjJ6Il0KICAgIH07CiAgICBmYVN1cHBsZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzdXBwbGUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjNmOSIsICJNNjQwIDI2Mi41YzAgNjQuMS0xMDkgMTE2LjEtMjQzLjUgMTE2LjEtMjQuOCAwLTQ4LjYtMS44LTcxLjEtNSA3LjcgLjQgMTUuNSAuNiAyMy40IC42IDEzNC41IDAgMjQzLjUtNTYuOSAyNDMuNS0xMjcuMSAwLTI5LjQtMTkuMS01Ni40LTUxLjItNzggNjAgMjEuMSA5OC45IDU1LjEgOTguOSA5My40ek00Ny43IDIyNy45Yy0uMS03MC4yIDEwOC44LTEyNy4zIDI0My4zLTEyNy42IDcuOSAwIDE1LjYgLjIgMjMuMyAuNS0yMi41LTMuMi00Ni4zLTQuOS03MS00LjktMTM0LjUgLjQtMjQzLjQgNTIuNi0yNDMuMyAxMTYuNyAuMSAzOC4zIDM5LjEgNzIuMyA5OS4zIDkzLjMtMzIuMy0yMS41LTUxLjUtNDguNi01MS42LTc4em02MC4yIDM5LjlTMTE4LjQgMjgxIDEzNy4yIDI4MWMxNy45IDAgMjguNC0xMS41IDI4LjQtMjUuMSAwLTI4LTQwLjItMjUuMS00MC4yLTM5LjcgMC01LjQgNS4zLTkuMSAxMi41LTkuMSA1LjcgMCAxMS4zIDIuNiAxMS4zIDYuNmwwIDMuOSAxNC4yIDAgMC03LjljMC0xMi4xLTE1LjQtMTYuOC0yNS40LTE2LjgtMTYuNSAwLTI4LjUgMTAuMi0yOC41IDI0LjEgMCAyNi42IDQwLjIgMjUuNCA0MC4yIDM5LjkgMCA2LjYtNS44IDEwLjEtMTIuMyAxMC4xLTExLjkgMC0yMC43LTEwLjEtMjAuNy0xMC4xbC04LjggMTAuOXptMTIwLjgtNzMuNmwwIDU0LjRjMCAxMS4zLTcuMSAxNy44LTE3LjggMTcuOHMtMTcuOC02LjUtMTcuOC0xNy43bDAtNTQuNS0xNS44IDAgMCA1NWMwIDE4LjkgMTMuNCAzMS45IDMzLjcgMzEuOSAyMC4xIDAgMzMuNC0xMyAzMy40LTMxLjlsMC01NS0xNS43IDB6bTM0LjQgODUuNGwxNS44IDAgMC0yOS41IDE1LjUgMGMxNiAwIDI3LjItMTEuNSAyNy4yLTI4LjFzLTExLjItMjcuOC0yNy4yLTI3LjhsLTM5LjEgMCAwIDEzLjQgNy44IDAgMCA3MnptMTUuOC00M2wwLTI5LjEgMTIuOSAwYzguNyAwIDEzLjcgNS43IDEzLjcgMTQuNCAwIDguOS01LjEgMTQuNy0xNCAxNC43bC0xMi42IDB6bTU3IDQzbDE1LjggMCAwLTI5LjUgMTUuNSAwYzE2IDAgMjcuMi0xMS41IDI3LjItMjguMXMtMTEuMi0yNy44LTI3LjItMjcuOGwtMzkuMSAwIDAgMTMuNCA3LjggMCAwIDcyem0xNS43LTQzbDAtMjkuMSAxMi45IDBjOC43IDAgMTMuNyA1LjcgMTMuNyAxNC40IDAgOC45LTUgMTQuNy0xNCAxNC43bC0xMi42IDB6bTU3LjEgMzQuOGMwIDUuOCAyLjQgOC4yIDguMiA4LjJsMzcuNiAwYzUuOCAwIDguMi0yLjQgOC4yLTguMmwwLTEzLTE0LjMgMCAwIDUuMmMwIDEuNy0xIDIuNi0yLjYgMi42bC0xOC42IDBjLTEuNyAwLTIuNi0xLTIuNi0yLjZsMC02MS4yYzAtNS43LTIuNC04LjItOC4yLTguMmwtMTUuNCAwIDAgMTMuNCA1LjIgMGMxLjcgMCAyLjYgMSAyLjYgMi42bDAgNjEuMi0uMSAwem02My40IDBjMCA1LjggMi40IDguMiA4LjIgOC4ybDM4LjcgMGM1LjcgMCA4LjItMi40IDguMi04LjJsMC0xMy0xNC4zIDAgMCA1LjJjMCAxLjctMSAyLjYtMi42IDIuNmwtMTkuNyAwYy0xLjcgMC0yLjYtMS0yLjYtMi42bDAtMjAuMyAyNy43IDAgMC0xMy40LTI3LjcgMCAwLTIyLjQgMTkuMiAwYzEuNyAwIDIuNiAxIDIuNiAyLjZsMCA1LjIgMTQuMiAwIDAtMTNjMC01LjctMi41LTguMi04LjItOC4ybC01MS42IDAgMCAxMy40IDcuOCAwIDAgNjMuOSAuMSAwem01OC45LTc2bDAgNS45IDEuNiAwIDAtNS45IDIuNyAwIDAtMS4yLTcgMCAwIDEuMiAyLjcgMHptNS43LTEuMmwwIDcuMSAxLjUgMCAwLTUuNyAyLjMgNS43IDEuMyAwIDIuMy01LjcgMCA1LjcgMS41IDAgMC03LjEtMi4zIDAtMi4xIDUuMS0yLjEtNS4xLTIuNCAweiJdCiAgICB9OwogICAgZmFTcXVhcmVUd2l0dGVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS10d2l0dGVyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInR3aXR0ZXItc3F1YXJlIl0sICJmMDgxIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyek0zNTEuMyAxOTkuM2MwIDg2LjctNjYgMTg2LjYtMTg2LjYgMTg2LjYtMzcuMiAwLTcxLjctMTAuOC0xMDAuNy0yOS40IDUuMyAuNiAxMC40IC44IDE1LjggLjggMzAuNyAwIDU4LjktMTAuNCA4MS40LTI4LTI4LjgtLjYtNTMtMTkuNS02MS4zLTQ1LjUgMTAuMSAxLjUgMTkuMiAxLjUgMjkuNi0xLjItMzAtNi4xLTUyLjUtMzIuNS01Mi41LTY0LjRsMC0uOGM4LjcgNC45IDE4LjkgNy45IDI5LjYgOC4zLTktNi0xNi40LTE0LjEtMjEuNS0yMy42cy03LjgtMjAuMi03LjctMzFjMC0xMi4yIDMuMi0yMy40IDguOS0zMy4xIDMyLjMgMzkuOCA4MC44IDY1LjggMTM1LjIgNjguNi05LjMtNDQuNSAyNC04MC42IDY0LTgwLjYgMTguOSAwIDM1LjkgNy45IDQ3LjkgMjAuNyAxNC44LTIuOCAyOS04LjMgNDEuNi0xNS44LTQuOSAxNS4yLTE1LjIgMjgtMjguOCAzNi4xIDEzLjItMS40IDI2LTUuMSAzNy44LTEwLjItOC45IDEzLjEtMjAuMSAyNC43LTMyLjkgMzQgLjIgMi44IC4yIDUuNyAuMiA4LjV6Il0KICAgIH07CiAgICBmYVR3aXR0ZXJTcXVhcmUgPSBmYVNxdWFyZVR3aXR0ZXI7CiAgICBmYUZvbnRBd2Vzb21lID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImZvbnQtYXdlc29tZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYyNTAxLCA2MjY5NCwgImZvbnQtYXdlc29tZS1mbGFnIiwgImZvbnQtYXdlc29tZS1sb2dvLWZ1bGwiXSwgImYyYjQiLCAiTTkxLjcgOTZDMTA2LjMgODYuOCAxMTYgNzAuNSAxMTYgNTIgMTE2IDIzLjMgOTIuNyAwIDY0IDBTMTIgMjMuMyAxMiA1MmMwIDE2LjcgNy44IDMxLjUgMjAgNDFsMCA0MTkgNjQgMCAwLTY0IDM3My42IDBjMTQuNiAwIDI2LjQtMTEuOCAyNi40LTI2LjQgMC0zLjctLjgtNy4zLTIuMy0xMC43TDQzMiAyNzIgNDkzLjcgMTMzLjFjMS41LTMuNCAyLjMtNyAyLjMtMTAuNyAwLTE0LjYtMTEuOC0yNi40LTI2LjQtMjYuNEw5MS43IDk2eiJdCiAgICB9OwogICAgZmFGb250QXdlc29tZUZsYWcgPSBmYUZvbnRBd2Vzb21lOwogICAgZmFGb250QXdlc29tZUxvZ29GdWxsID0gZmFGb250QXdlc29tZTsKICAgIGZhV2lyc2luZGhhbmR3ZXJrID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIndpcnNpbmRoYW5kd2VyayIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJ3c2giXSwgImUyZDAiLCAiTTE4LjkgNDc5LjhsODMuNCAwIDAtMTEyLTgzLjQgNDcgMCA2NXptMzI5IDBsODIuNCAwIDAtNjUtODIuNC00NyAwIDExMnptMC00NDhsMCAyMTkuOC0xMjMuNi03Mi40LTEyMS43IDcyLjQgMC0yMTkuOC04My43IDAgMCAzNjAuOCAyMDUuNC0xMjIuMyAyMDYgMTIyLjMgMC0zNjAuOC04Mi4zIDB6Il0KICAgIH07CiAgICBmYVdzaCA9IGZhV2lyc2luZGhhbmR3ZXJrOwogICAgZmFDb25mbHVlbmNlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNvbmZsdWVuY2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjc4ZCIsICJNMi44IDQxMi4yYy00LjUgNy42LTIuMSAxNy41IDUuNSAyMi4ybDEwNS45IDY1LjJjNy43IDQuNyAxNy43IDIuNCAyMi40LTUuMyAwLS4xIC4xLS4yIC4xLS4yIDY3LjEtMTEyLjIgODAuNS05NS45IDI4MC45LS43IDguMSAzLjkgMTcuOCAuNCAyMS43LTcuNyAuMS0uMSAuMS0uMyAuMi0uNGw1MC40LTExNC4xYzMuNi04LjEtLjEtMTcuNi04LjEtMjEuMy0yMi4yLTEwLjQtNjYuMi0zMS4yLTEwNS45LTUwLjMtMjQ3LjktMTIwLjYtMzMwLjggNDUuNy0zNzMuMSAxMTIuNnpNNTEwLjIgMTAwLjFjNC41LTcuNiAyLjEtMTcuNS01LjUtMjIuMkwzOTguOSAxMi44Yy03LjUtNS0xNy42LTMuMS0yMi42IDQuNC0uMiAuMy0uNCAuNi0uNiAxLTY3LjMgMTEyLjYtODEuMSA5NS42LTI4MC42IC45LTguMS0zLjktMTcuOC0uNC0yMS43IDcuNy0uMSAuMS0uMSAuMy0uMiAuNEwyMi43IDE0MS4zYy0zLjYgOC4xIC4xIDE3LjYgOC4xIDIxLjMgMjIuMiAxMC40IDY2LjMgMzEuMiAxMDYgNTAuNCAyNDggMTIwIDMzMC44LTQ1LjQgMzczLjQtMTEyLjl6Il0KICAgIH07CiAgICBmYURpZ2cgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZGlnZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMWE2IiwgIk04MS43IDE3Mi4zbC04MS43IDAgMCAxNzQuNCAxMzIuNyAwIDAtMjUwLjctNTEgMCAwIDc2LjN6bTAgMTMzLjRsLTMwLjggMCAwLTkyLjMgMzAuOCAwIDAgOTIuM3pNMzc4LjkgMTcyLjNsMCAxNzQuNCA4MS44IDAgMCAyOC41LTgxLjggMCAwIDQwLjggMTMzLjEgMCAwLTI0My43LTEzMy4xIDB6bTgxLjggMTMzLjRsLTMwLjggMCAwLTkyLjMgMzAuOCAwIDAgOTIuM3ptLTIzNS42IDQxbDgyLjEgMCAwIDI4LjUtODIuMSAwIDAgNDAuOCAxMzMuMyAwIDAtMjQzLjctMTMzLjMgMCAwIDE3NC40em01MS4yLTEzMy4zbDMwLjggMCAwIDkyLjMtMzAuOCAwIDAtOTIuM3pNMTUzLjMgOTZsNTEuMyAwIDAgNTEtNTEuMyAwIDAtNTF6bTAgNzYuM2w1MS4zIDAgMCAxNzQuNC01MS4zIDAgMC0xNzQuNHoiXQogICAgfTsKICAgIGZhVGhyZWFkcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ0aHJlYWRzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU2MTgiLCAiTTMzMS41IDIzNS43YzIuMiAuOSA0LjIgMS45IDYuMyAyLjggMjkuMiAxNC4xIDUwLjYgMzUuMiA2MS44IDYxLjQgMTUuNyAzNi41IDE3LjIgOTUuOC0zMC4zIDE0My4yLTM2LjIgMzYuMi04MC4zIDUyLjUtMTQyLjYgNTNsLS4zIDBjLTcwLjItLjUtMTI0LjEtMjQuMS0xNjAuNC03MC4yLTMyLjMtNDEtNDguOS05OC4xLTQ5LjUtMTY5LjZsMC0uNUMxNyAxODQuMyAzMy42IDEyNy4yIDY1LjkgODYuMiAxMDIuMiA0MC4xIDE1Ni4yIDE2LjUgMjI2LjQgMTZsLjMgMGM3MC4zIC41IDEyNC45IDI0IDE2Mi4zIDY5LjkgMTguNCAyMi43IDMyIDUwIDQwLjYgODEuN2wtNDAuNCAxMC44Yy03LjEtMjUuOC0xNy44LTQ3LjgtMzIuMi02NS40LTI5LjItMzUuOC03My01NC4yLTEzMC41LTU0LjYtNTcgLjUtMTAwLjEgMTguOC0xMjguMiA1NC40LTI2LjIgMzMuMy0zOS44IDgxLjUtNDAuMyAxNDMuMiAuNSA2MS43IDE0LjEgMTA5LjkgNDAuMyAxNDMuMyAyOCAzNS42IDcxLjIgNTMuOSAxMjguMiA1NC40IDUxLjQtLjQgODUuNC0xMi42IDExMy43LTQwLjkgMzIuMy0zMi4yIDMxLjctNzEuOCAyMS40LTk1LjktNi4xLTE0LjItMTcuMS0yNi0zMS45LTM0LjktMy43IDI2LjktMTEuOCA0OC4zLTI0LjcgNjQuOC0xNy4xIDIxLjgtNDEuNCAzMy42LTcyLjcgMzUuMy0yMy42IDEuMy00Ni4zLTQuNC02My45LTE2LTIwLjgtMTMuOC0zMy0zNC44LTM0LjMtNTkuMy0yLjUtNDguMyAzNS43LTgzIDk1LjItODYuNCAyMS4xLTEuMiA0MC45LS4zIDU5LjIgMi44LTIuNC0xNC44LTcuMy0yNi42LTE0LjYtMzUuMi0xMC0xMS43LTI1LjYtMTcuNy00Ni4yLTE3LjhsLS43IDBjLTE2LjYgMC0zOSA0LjYtNTMuMyAyNi4zbC0zNC40LTIzLjZjMTkuMi0yOS4xIDUwLjMtNDUuMSA4Ny44LTQ1LjFsLjggMGM2Mi42IC40IDk5LjkgMzkuNSAxMDMuNyAxMDcuN2wtLjIgLjIgLjEgMHptLTE1NiA2OC44YzEuMyAyNS4xIDI4LjQgMzYuOCA1NC42IDM1LjMgMjUuNi0xLjQgNTQuNi0xMS40IDU5LjUtNzMuMi0xMy4yLTIuOS0yNy44LTQuNC00My40LTQuNC00LjggMC05LjYgLjEtMTQuNCAuNC00Mi45IDIuNC01Ny4yIDIzLjItNTYuMiA0MS44bC0uMSAuMXoiXQogICAgfTsKICAgIGZhV3ByZXNzciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ3cHJlc3NyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInJlbmRhY3QiXSwgImYzZTQiLCAiTTI1NiA4YTI0OCAyNDggMCAxIDAgMCA0OTYgMjQ4IDI0OCAwIDEgMCAwLTQ5NnpNNDI3LjMgMTY2LjZjLTE1LjIgMzQuNS0zMC40IDY5LTQ1LjYgMTAzLjUtMi40IDUuNS02LjkgOC4yLTEzIDguMi0yMyAwLTQ2IC4xLTY5IDAtNS4xIDAtOC4yIDEuOS0xMC4zIDYuNy0xMC4yIDIzLjYtMjAuNiA0Ny0zMSA3MC41LTEuNSAzLjUtNC4xIDUuMy03LjkgNS4zLTQ1LjkgMC05MS45IDAtMTM3LjggMC0zLjEgMC01LjYtMS4xLTcuNy0zLjQtMTEuMi0xMi4zLTIyLjUtMjQuNi0zMy43LTM2LjktMi43LTMtMi44LTYuMi0xLjItOS43IDguNy0xOS41IDE3LjMtMzkuMSAyNS45LTU4LjcgMTIuOS0yOS40IDI1LjktNTguNyAzOC43LTg4LjEgMS43LTMuOSA0LjMtNS43IDguNS01LjcgMTQuMiAuMSAyOC41IDAgNDIuNyAwIDYuMiAwIDkuMiA0LjggNi43IDEwLjYtMTMuNiAzMC44LTI3LjIgNjEuNi00MC43IDkyLjMtNS43IDEzLTExLjQgMjYtMTcuMSAzOS0zLjkgOSA3LjEgMTIgMTEgNS42IC4yLS40LTEuNCA0LjIgMzAtNjcuNyAxLjQtMy4xIDMuNC00LjQgNi44LTQuNCAxNS4yIC4xIDMwLjQgMCA0NS42IDAgNS42IDAgNy45IDMuNiA1LjcgOC43LTguMyAxOS0xNi43IDM3LjktMjUgNTYuOS01IDExLjQgOC4xIDEyLjUgMTEuMyA1LjMgMC0uMSAyNy45LTYzLjMgMzIuMi03My4yIDItNC42IDUuNC02LjUgMTAuMy02LjUgMjYuNCAuMSA1Mi45IDAgNzkuMyAwIDEyLjQgMCAxMy45LTEzLjYgMy45LTEzLjYtMjUuMyAwLTUwLjUgMC03NS44IDAtNi4zIDAtNy44LTIuNS01LjMtOC4zIDUuOC0xMy4xIDExLjYtMjYuMSAxNy4zLTM5LjIgMS43LTQgNC41LTUuOCA4LjgtNS44IDIzLjEgLjEgMjYgMCAxMzAuOCAwIDYuMSAwIDggMi44IDUuNiA4LjN6Il0KICAgIH07CiAgICBmYVJlbmRhY3QgPSBmYVdwcmVzc3I7CiAgICBmYVlvYXN0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInlvYXN0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyYjEiLCAiTTkxLjMgNzZsMTg2IDAtNyAxOC45LTE3OSAwYy0zOS43IDAtNzEuOSAzMS42LTcxLjkgNzAuM2wwIDIwNS40YzAgMzUuNCAyNC45IDcwLjMgODQgNzAuM2wwIDE5LjEtMTIuMSAwQzQxLjIgNDYwIDAgNDE5LjggMCAzNzAuNUwwIDE2NS4yQzAgMTE1LjkgNDAuNyA3NiA5MS4zIDc2ek0zMjAuNCAyMGw2Ni41IDBjLTE0My44IDM3OC4xLTE0NS43IDM5OC45LTE4NC43IDQzOS4zLTIwLjggMjEuNi00OS4zIDMxLjctNzguMyAzMi43bDAtNTEuMWM0OS4yLTcuNyA2NC42LTQ5LjkgNjQuNi03NS4zIDAtMjAuMSAuNi0xMi42LTgyLjEtMjIzLjJsNjEuNCAwIDUwLjQgMTU2LjYgMTAyLjItMjc5ek00NDggMTYxLjVsMCAyOTguNS0yMTQgMGM2LjYtOS42IDEwLjctMTYuMyAxMi4xLTE5LjRsMTgyLjUgMCAwLTI3OS4xYzAtMzIuNS0xNy4xLTUxLjktNDguMi02Mi45TDM4Ny4xIDgxYzQxLjcgMTMuNiA2MC45IDQzLjEgNjAuOSA4MC41eiJdCiAgICB9OwogICAgZmFOaW1ibHIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibmltYmxyIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY1YTgiLCAiTTI0Ni42IDM1My4zYTI3IDI3IDAgMSAxIDAtNTQgMjcgMjcgMCAxIDEgMCA1NHptLTc5LjQtMjdhMjcuMSAyNy4xIDAgMSAxIC01NC4zIDAgMjcuMSAyNy4xIDAgMSAxIDU0LjMgMHpNMTkxLjggMTU5QzE1NyAxNTkgODkuNCAxNzguOCA1OS4yIDIyN0wxNCAwIDE0IDMzNS41QzE0IDQzMy4xIDkzLjYgNTEyIDE5MS44IDUxMlMzNjkuNSA0MzMgMzY5LjUgMzM1LjUgMjkwLjEgMTU5IDE5MS44IDE1OXptMCAzMDguMWMtNzMuMyAwLTEzMi41LTU4LjktMTMyLjUtMTMxLjZzNTkuMi0xMzEuNiAxMzIuNS0xMzEuNiAxMzIuNSA1OC45IDEzMi41IDEzMS41LTU5LjMgMTMxLjYtMTMyLjUgMTMxLjZsMCAuMXoiXQogICAgfTsKICAgIGZhUGl4ZWxmZWQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicGl4ZWxmZWQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTdkYiIsICJNMjU2IDBhMjU2IDI1NiAwIDEgMSAwIDUxMiAyNTYgMjU2IDAgMSAxIDAtNTEyek0yMzUuNyAzMTEuOWw0NyAwYzQ0LjIgMCA4MC4xLTM0LjkgODAuMS03OHMtMzUuOS03OC04MC4xLTc4bC02Ny44IDBjLTI1LjUgMC00Ni4yIDIwLjEtNDYuMiA0NWwwIDE3NS4xIDY3LTY0LjF6Il0KICAgIH07CiAgICBmYVlhaG9vID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInlhaG9vIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxOWUiLCAiTTIyMy44IDE0MS4xbC01Ni43IDE0My4yLTU2LTE0My4yLTk2LjEgMCAxMDUuOCAyNDkuMS0zOC42IDg5LjggOTQuMiAwIDE0MC45LTMzOC45LTkzLjYgMHpNMzI5LjIgMjc2LjlhNTguMiA1OC4yIDAgMSAwIDAgMTE2LjQgNTguMiA1OC4yIDAgMSAwIDAtMTE2LjR6TTM5NC43IDMybC05MyAyMjMuNSAxMDQuOCAwIDkyLjYtMjIzLjUtMTA0LjQgMHoiXQogICAgfTsKICAgIGZhQmx1ZXNreSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJibHVlc2t5IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU2NzEiLCAiTTQwNy44IDI5NC43Yy0zLjMtLjQtNi43LS44LTEwLTEuMyAzLjQgLjQgNi43IC45IDEwIDEuM3pNMjg4IDIyNy4xQzI2MS45IDE3Ni40IDE5MC45IDgxLjkgMTI0LjkgMzUuMyA2MS42LTkuNCAzNy41LTEuNyAyMS42IDUuNSAzLjMgMTMuOCAwIDQxLjkgMCA1OC40UzkuMSAxOTQgMTUgMjEzLjljMTkuNSA2NS43IDg5LjEgODcuOSAxNTMuMiA4MC43IDMuMy0uNSA2LjYtLjkgMTAtMS40LTMuMyAuNS02LjYgMS0xMCAxLjQtOTMuOSAxNC0xNzcuMyA0OC4yLTY3LjkgMTY5LjkgMTIwLjMgMTI0LjYgMTY0LjgtMjYuNyAxODcuNy0xMDMuNCAyMi45IDc2LjcgNDkuMiAyMjIuNSAxODUuNiAxMDMuNCAxMDIuNC0xMDMuNCAyOC4xLTE1Ni02NS44LTE2OS45LTMuMy0uNC02LjctLjgtMTAtMS4zIDMuNCAuNCA2LjcgLjkgMTAgMS4zIDY0LjEgNy4xIDEzMy42LTE1LjEgMTUzLjItODAuNyA1LjktMTkuOSAxNS0xMzguOSAxNS0xNTUuNXMtMy4zLTQ0LjctMjEuNi01Mi45Yy0xNS44LTcuMS00MC0xNC45LTEwMy4yIDI5LjgtNjYuMSA0Ni42LTEzNy4xIDE0MS4xLTE2My4yIDE5MS44eiJdCiAgICB9OwogICAgZmFTY3JpYmQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2NyaWJkIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYyOGEiLCAiTTQyLjYgMjUyLjdjLTE2LjEtMTktMjQuNy00NS45LTI0LjgtNzkuOSAwLTEwMC40IDc1LjItMTUzLjEgMTY3LjItMTUzLjEgOTguNi0xLjYgMTU2LjggNDkgMTg0LjMgNzAuNmwtNTAuNSA3Mi4xLTM3LjMtMjQuNiAyNi45LTM4LjZjLTM2LjUtMjQtNzkuNC0zNi41LTEyMy0zNS44LTUwLjctLjgtMTExLjcgMjcuMi0xMTEuNyA3Ni4yIDAgMTguNyAxMS4yIDIwLjcgMjguNiAxNS42IDIzLjMtNS4zIDQxLjkgLjYgNTUuOCAxNCAyNi40IDI0LjMgMjMuMiA2Ny42LS43IDkxLjktMjkuMiAyOS41LTg1LjIgMjcuMy0xMTQuOC04LjR6bTMxNy43IDUuOWMtMTUuNS0xOC44LTM4LjktMjkuNC02My4yLTI4LjYtMzguMS0yLTcxLjEgMjgtNzAuNSA2Ny4yLS43IDE2LjggNiAzMyAxOC40IDQ0LjMgMTQuMSAxMy45IDMzIDE5LjcgNTYuMyAxNC40IDE3LjQtNS4xIDI4LjYtMy4xIDI4LjYgMTUuNiAwIDQuMy0uNSA4LjUtMS40IDEyLjctMTYuNyA0MC45LTU5LjUgNjQuNC0xMjEuNCA2NC40LTUxLjkgLjItMTAyLjQtMTYuNC0xNDQuMS00Ny4zbDMzLjctMzkuNC0zNS42LTI3LjQtNjAuOCA3MS44IDE1LjQgMTMuOGM1Mi41IDQ2LjggMTIwLjQgNzIuNSAxOTAuNyA3Mi4yIDUxLjQgMCA5NC40LTEwLjUgMTMzLjYtNDQuMSA1Ny4xLTUxLjQgNTQuMi0xNDkuMiAyMC4zLTE4OS42eiJdCiAgICB9OwogICAgZmFDcmVhdGl2ZUNvbW1vbnNQZCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjcmVhdGl2ZS1jb21tb25zLXBkIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0ZWMiLCAiTTI1NiA4YTI0OCAyNDggMCAxIDAgMCA0OTYgMjQ4IDI0OCAwIDEgMCAwLTQ5NnptMCA0NDkuNWMtMTM5LjIgMC0yMzUuOC0xMzgtMTkwLjItMjY3LjlsNzguOCAzNS4xYy0yLjEgMTAuNS0zLjMgMjEuNS0zLjMgMzIuOSAwIDk5IDczLjkgMTI2LjkgMTIwLjQgMTI2LjkgMjIuOSAwIDUzLjUtNi43IDc5LjQtMjkuNUwzMDUgMzExLjFjLTUuNSA2LjMtMTcuNiAxNi43LTM2LjMgMTYuNy0zNy44IDAtNTMuNy0zOS45LTUzLjktNzEuOSAyMzAuNCAxMDIuNiAyMTYuNSA5Ni41IDIxNy45IDk2LjgtMzQuMyA2Mi40LTEwMC42IDEwNC44LTE3Ni43IDEwNC44em0xOTQuMi0xNTBsLTIyNC0xMDBjMTguOC0zNCA1NC45LTMwLjcgNzQuNy0xMWw0MC40LTQxLjZjLTI3LjEtMjMuMy01OC0yNy41LTc4LjEtMjcuNS00Ny40IDAtODAuOSAyMC41LTEwMC43IDUxLjZMODcuNiAxNDUuNmMzNi4xLTU0LjkgOTguMS05MS4yIDE2OC41LTkxLjIgMTExLjEgMCAyMDEuNSA5MC40IDIwMS41IDIwMS41IDAgMTgtMi40IDM1LjQtNi44IDUyLS4zLS4xLS40LS4yLS42LS40eiJdCiAgICB9OwogICAgZmFFYXJseWJpcmRzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImVhcmx5YmlyZHMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjM5YSIsICJNMzI5LjMgNDcuNWMxLjItMTMgMjEuMy0xNCAzNi42LTguNyAuOSAuMyAyNi4yIDkuNyAxOSAxNS4yLTI3LjktNy40LTU2LjQgMTguMi01NS42LTYuNXptLTIwMSA2LjljMzAuNy04LjEgNjIgMjAgNjEuMS03LjEtMS4zLTE0LjItMjMuNC0xNS4zLTQwLjItOS42LTEgLjMtMjguNyAxMC41LTIwLjkgMTYuN3pNMzM1LjUgMTYwYTE2IDE2IDAgMSAwIDAgMzIgMTYgMTYgMCAxIDAgMC0zMnptLTE1OS43IDBhMTYgMTYgMCAxIDAgMCAzMiAxNiAxNiAwIDEgMCAwLTMyek00OTQuMyAzMjMuMmMtOS45IDI0LTQwLjcgMTEtNjMuOS0xLjItMTMuNSA2OS4xLTU4LjEgMTExLjQtMTI2LjMgMTI0LjIgLjMgLjktMi0uMSAyNCAxIDMzLjYgMS40IDYzLjgtMy4xIDk3LjQtOC0xOS44LTEzLjgtMTEuNC0zNy4xLTkuOC0zOC4xIDEuNC0uOSAxNC43IDEuNyAyMS42IDExLjUgOC42LTEyLjUgMjguNC0xNC44IDMwLjItMTMuNiAxLjYgMS4xIDYuNiAyMC45LTYuOSAzNC42IDQuNy0uOSA4LjItMS42IDkuOC0yLjEgMi42LS44IDE3LjcgMTEuMyAzLjEgMTMuMy0xNC4zIDIuMy0yMi42IDUuMS00Ny4xIDEwLjgtNDUuOSAxMC43LTg1LjkgMTEuOC0xMTcuNyAxMi44bDEgMTEuNmMzLjggMTguMS0yMy40IDI0LjMtMjcuNiA2LjIgLjggMTcuOS0yNy4xIDIxLjgtMjguNC0xbC0uNSA1LjNjLS43IDE4LjQtMjguNCAxNy45LTI4LjMtLjYtNy41IDEzLjUtMjguMSA2LjgtMjYuNC04LjVsMS4yLTEyLjRjLTM2LjcgLjktNTkuNyAzLjEtNjEuOCAzLjEtMjAuOSAwLTIwLjktMzEuNiAwLTMxLjYgMi40IDAgMjcuNyAxLjMgNjMuMiAyLjgtNjEuMS0xNS41LTEwMy43LTU1LTExNC45LTExOC4yLTI1IDEyLjgtNTcuNSAyNi44LTY4LjIgLjgtMTAuNS0yNS40IDIxLjUtNDIuNiA2Ni44LTczLjQgLjctNi42IDEuNi0xMy4zIDIuNy0xOS44LTE0LjQtMTkuNi0xMS42LTM2LjMtMTYuMS02MC40LTE2LjggMi40LTIzLjItOS4xLTIzLjYtMjMuMSAuMy03LjMgMi4xLTE0LjkgMi40LTE1LjQgMS4xLTEuOCAxMC4xLTIgMTIuNy0yLjYgNi0zMS43IDUwLjYtMzMuMiA5MC45LTM0LjUgMTkuNy0yMS44IDQ1LjItNDEuNSA4MC45LTQ4LjMtMTUuMy0xOS40LTMuNC0zOS45LTIuNC00MC40IDEuNy0uOCAyMS4yIDQuMyAyNi4zIDIzLjIgNS4yLTguOCAxOC4zLTExLjQgMTkuNi0xMC43IDEuMSAuNiA2LjQgMTUtNC45IDI1LjkgNDAuMyAzLjUgNzIuMiAyNC43IDk2IDUwLjcgMzYuMSAxLjUgNzEuOCA1LjkgNzcuMSAzNCAyLjcgLjYgMTEuNiAuOCAxMi43IDIuNiAuMyAuNSAyLjEgOC4xIDIuNCAxNS40LS41IDEzLjktNi44IDI1LjQtMjMuNiAyMy4xLTMuMiAxNy4zLTIuNyAzMi45LTguNyA0Ny43IDIuNCAxMS43IDQgMjMuOCA0LjggMzYuNCAzNyAyNS40IDcwLjMgNDIuNSA2MC4zIDY2Ljl6TTIyMy41IDE1OS45Yy45LTQ0LTM3LjktNDIuMi03OC42LTQwLjMtMjEuNyAxLTM4LjkgMS45LTQ1LjUgMTMuOS0xMS40IDIwLjkgNS45IDkyLjkgMjMuMiAxMDEuMiA5LjggNC43IDczLjQgNy45IDg2LjMtNy4xIDguMi05LjQgMTUtNDkuNCAxNC42LTY3Ljd6bTUyIDU4LjNjLTQuMy0xMi40LTYtMzAuMS0xNS4zLTMyLjctMi0uNS05LS41LTExIDAtMTAgMi44LTEwLjggMjIuMS0xNyAzNy4yIDE1LjQgMCAxOS4zIDkuNyAyMy43IDkuNyA0LjMgMCA2LjMtMTEuMyAxOS42LTE0LjJ6bTEzNS43LTg0LjdjLTYuNi0xMi4xLTI0LjgtMTIuOS00Ni41LTEzLjktNDAuMi0xLjktNzguMi0zLjgtNzcuMyA0MC4zLS41IDE4LjMgNSA1OC4zIDEzLjIgNjcuOCAxMyAxNC45IDc2LjYgMTEuOCA4Ni4zIDcuMSAxNS44LTcuNiAzNi41LTc4LjkgMjQuMy0xMDEuM3oiXQogICAgfTsKICAgIGZhU3F1YXJlT2Rub2tsYXNzbmlraSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtb2Rub2tsYXNzbmlraSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJvZG5va2xhc3NuaWtpLXNxdWFyZSJdLCAiZjI2NCIsICJNMjI0IDEzNy4xYy01LjQtLjMtMTAuOCAuNi0xNS45IDIuNHMtOS43IDQuOC0xMy42IDguNS03IDguMi05LjIgMTMuMi0zLjIgMTAuMy0zLjIgMTUuNyAxLjEgMTAuOCAzLjIgMTUuNyA1LjMgOS41IDkuMiAxMy4yIDguNiA2LjYgMTMuNiA4LjUgMTAuNSAyLjcgMTUuOSAyLjRjNS40IC4zIDEwLjgtLjYgMTUuOS0yLjRzOS43LTQuOCAxMy42LTguNSA3LTguMiA5LjItMTMuMiAzLjItMTAuMyAzLjItMTUuNy0xLjEtMTAuOC0zLjItMTUuNy01LjMtOS41LTkuMi0xMy4yLTguNi02LjYtMTMuNi04LjUtMTAuNS0yLjctMTUuOS0yLjR6TTM4NCAzMkw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0ek0yMjQgMjU4YTgxIDgxIDAgMSAxIDAtMTYyLjEgODEgODEgMCAxIDEgMCAxNjIuMXptNTkuMyA2LjJjMTYuOC0xMy4yIDI5LjUtNS41IDM0LjEgMy42IDcuOCAxNi0xLjEgMjMuNy0yMS41IDM3LTE3LjEgMTAuOS00MC43IDE1LjItNTYuMiAxNi44bDEzIDEyLjkgNDcuNyA0Ny43YzE3LjQgMTcuOS0xMSA0NS44LTI4LjYgMjguNi0xMi0xMi4yLTI5LjUtMjkuNy00Ny43LTQ3LjlsLTQ3LjcgNDcuOWMtMTcuNyAxNy4yLTQ2LTExLTI4LjQtMjguNiAzLjctMy43IDcuOS03LjkgMTIuNS0xMi41IDEwLjQtMTAuNCAyMi42LTIyLjcgMzUuMi0zNS4ybDEyLjktMTIuOWMtMTUuNC0xLjYtMzkuMy01LjctNTYuNi0xNi44LTIwLjMtMTMuMy0yOS4zLTIwLjktMjEuNC0zNyA0LjYtOS4xIDE3LjMtMTYuOCAzNC4xLTMuNiAwIDAgMjIuNyAxOCA1OS4zIDE4czU5LjMtMTggNTkuMy0xOHoiXQogICAgfTsKICAgIGZhT2Rub2tsYXNzbmlraVNxdWFyZSA9IGZhU3F1YXJlT2Rub2tsYXNzbmlraTsKICAgIGZhTWFya2Rvd24gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibWFya2Rvd24iLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjYwZiIsICJNNTkzLjggNTkuMWwtNTQ3LjYgMEMyMC43IDU5LjEgMCA3OS44IDAgMTA1LjJMMCA0MDYuN2MwIDI1LjUgMjAuNyA0Ni4yIDQ2LjIgNDYuMmw1NDcuNyAwYzI1LjUgMCA0Ni4yLTIwLjcgNDYuMS00Ni4xbDAtMzAxLjZjMC0yNS40LTIwLjctNDYuMS00Ni4yLTQ2LjF6TTMzOC41IDM2MC42bC02MS41IDAgMC0xMjAtNjEuNSA3Ni45LTYxLjUtNzYuOSAwIDEyMC02MS43IDAgMC0yMDkuMiA2MS41IDAgNjEuNSA3Ni45IDYxLjUtNzYuOSA2MS41IDAgMCAyMDkuMiAuMiAwem0xMzUuMyAzLjFsLTkyLjMtMTA3LjcgNjEuNSAwIDAtMTA0LjYgNjEuNSAwIDAgMTA0LjYgNjEuNSAwLTkyLjIgMTA3Ljd6Il0KICAgIH07CiAgICBmYVR5cG8zID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInR5cG8zIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY0MmIiLCAiTTE3OC43IDc4LjRjMC0yNC43IDUuNC0zMi40IDEzLjktMzkuNC02OS41IDguNS0xNDkuMyAzNC0xNzYuMyA2Ni40LTUuNCA3LjctOS4zIDIwLjgtOS4zIDM3LjEgMCAxMDMuNSAxMDYuOCAzMzcuNSAxODQuMSAzMzcuNSAzNi4zIDAgOTcuMy01OS41IDE0Ni43LTEzOS03IDIuMy0xMS42IDIuMy0xOC41IDIuMy01Ny4yIDAtMTQwLjYtMTk4LjUtMTQwLjYtMjY0Ljl6TTMwMS41IDMyYy0zMC4xIDAtNDEuNyA1LjQtNDEuNyAzNi4zIDAgNjYuNCA1My44IDE5OC41IDEwMS43IDE5OC41IDI2LjMgMCA3OC44LTk5LjcgNzguOC0xODIuMyAwLTQwLjktNjctNTIuNS0xMzguOC01Mi41eiJdCiAgICB9OwogICAgZmFKb29tbGEgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiam9vbWxhIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYxYWEiLCAiTS42IDkyLjFjMC0zMy4zIDI2LjgtNjAuMSA1OS44LTYwLjEgMzAgMCA1NC41IDIxLjkgNTkuMiA1MC4yIDMyLjYtNy42IDY3LjEgLjYgOTYuNSAzMGwtNDQuMyA0NC4zYy0yMC41LTIwLjUtNDIuNi0xNi4zLTU1LjQtMy41LTE0LjMgMTQuMy0xNC4zIDM3LjkgMCA1Mi4ybDk5LjUgOTkuNS00NCA0NC4zYy04Ny43LTg3LjItNDkuNy00OS43LTk5LjgtOTkuNy0yNi44LTI2LjUtMzUtNjQuOC0yNC44LTk4LjktMjYuOS01LjgtNDYuNy0yOS43LTQ2LjctNTguM3pNMTMwLjEgMjA4LjVsNDQuMyA0NC4zYzEwLTEwIDg5LjctODkuNyA5OS43LTk5LjggMTQuMy0xNC4zIDM3LjYtMTQuMyA1MS45IDAgMTIuOCAxMi44IDE3IDM1LTMuNSA1NS40bDQ0IDQ0LjNjMzEuMi0zMS4yIDM4LjUtNjcuNiAyOC45LTEwMS4yIDI5LjItNC4xIDUxLjktMjkuMiA1MS45LTU5LjUgMC0zMy4yLTI2LjgtNjAuMS01OS44LTYwLjEtMzAuMyAwLTU1LjQgMjIuNS01OS41IDUxLjYtMzMuOC05LjktNzEuNy0xLjUtOTguMyAyNS4xLTE4LjMgMTkuMS03MS4xIDcxLjUtOTkuNiA5OS45ek0zOTYuNCAzNjAuN2M4LjItMzIuNy0uOS02OC41LTI2LjMtOTMuOS0xMS44LTEyLjIgNSA0LjctOTkuNS05OS43bC00NC4zIDQ0LjMgOTkuNyA5OS43YzE0LjMgMTQuMyAxNC4zIDM3LjYgMCA1MS45LTEyLjggMTIuOC0zNSAxNy01NS40LTMuNWwtNDQgNDQuM2MyNy42IDMwLjIgNjggMzguOCAxMDIuNyAyOCA1LjUgMjcuNCAyOS43IDQ4LjEgNTguOSA0OC4xIDMzIDAgNTkuOC0yNi44IDU5LjgtNjAuMSAwLTMwLjItMjIuNS01NS01MS42LTU5LjF6bS04NC4zLTUzLjFsLTQ0LTQ0LjNjLTg3IDg2LjQtNTAuNCA1MC40LTk5LjcgOTkuOC0xNC4zIDE0LjMtMzcuNiAxNC4zLTUxLjkgMC0xMy4xLTEzLjQtMTYuOS0zNS4zIDMuMi01NS40bC00NC00NC4zYy0zMC4yIDMwLjItMzggNjUuMi0yOS41IDk4LjMtMjYuNyA2LTQ2LjIgMjkuOS00Ni4yIDU4LjIgMCAzMy4zIDI2LjggNjAuMSA1OS44IDYwLjEgMjguNiAwIDUyLjUtMTkuOCA1OC42LTQ2LjcgMzIuNyA4LjIgNjguNS0uNiA5NC4yLTI2IDMyLjEtMzIgMTIuMi0xMi40IDk5LjUtOTkuN3oiXQogICAgfTsKICAgIGZhV2VpeGluID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIndlaXhpbiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMWQ3IiwgIk0zODUuMiAxNjcuNmM2LjQgMCAxMi42IC4zIDE4LjggMS4xLTE2LjYtNzguNC0xMDAuNy0xMzYuNy0xOTYuMy0xMzYuNy0xMDcuMiAwLTE5NC43IDcyLjgtMTk0LjcgMTY1LjQgMCA1My40IDI5LjMgOTcuNSA3Ny45IDEzMS42bC0xOS4zIDU4LjYgNjgtMzQuMWMyNC40IDQuOCA0My44IDkuNyA2OC4yIDkuNyA2LjIgMCAxMi4xLS4zIDE4LjMtLjgtNC0xMi45LTYuMi0yNi42LTYuMi00MC44LS4xLTg0LjkgNzIuOS0xNTQgMTY1LjMtMTU0ek0yODAuNyAxMTQuN2MxNC41IDAgMjQuMiA5LjcgMjQuMiAyNC40IDAgMTQuNS05LjcgMjQuMi0yNC4yIDI0LjItMTQuOCAwLTI5LjMtOS43LTI5LjMtMjQuMiAuMS0xNC43IDE0LjYtMjQuNCAyOS4zLTI0LjR6TTE0NC4zIDE2My4zYy0xNC41IDAtMjkuMy05LjctMjkuMy0yNC4yIDAtMTQuOCAxNC44LTI0LjQgMjkuMy0yNC40IDE0LjggMCAyNC40IDkuNyAyNC40IDI0LjQgMCAxNC42LTkuNiAyNC4yLTI0LjQgMjQuMnpNNTYzIDMxOS40YzAtNzcuOS03Ny45LTE0MS4zLTE2NS40LTE0MS4zLTkyLjcgMC0xNjUuNCA2My40LTE2NS40IDE0MS4zUzMwNSA0NjAuNyAzOTcuNiA0NjAuN2MxOS4zIDAgMzguOS01LjEgNTguNi05LjlsNTMuNCAyOS4zLTE0LjgtNDguNkM1MzQgNDAyLjEgNTYzIDM2My4yIDU2MyAzMTkuNHpNMzQzLjkgMjk0LjljLTkuNyAwLTE5LjMtOS43LTE5LjMtMTkuNiAwLTkuNyA5LjctMTkuMyAxOS4zLTE5LjMgMTQuOCAwIDI0LjQgOS43IDI0LjQgMTkuMyAwIDEwLTkuNyAxOS42LTI0LjQgMTkuNnptMTA3LjEgMGMtOS43IDAtMTkuMy05LjctMTkuMy0xOS42IDAtOS43IDkuNy0xOS4zIDE5LjMtMTkuMyAxNC41IDAgMjQuNCA5LjcgMjQuNCAxOS4zIC4xIDEwLTkuOSAxOS42LTI0LjQgMTkuNnoiXQogICAgfTsKICAgIGZhR3J1bnQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZ3J1bnQiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjNhZCIsICJNNjEuNiAxODkuM2MtMS4xIDEwIDUuMiAxOS4xIDUuMiAxOS4xIC43LTcuNSAyLjItMTIuOCA0LTE2LjYgLjQgMTAuMyAzLjIgMjMuNSAxMi44IDM0LjEgNi45IDcuNiAzNS42IDIzLjMgNTQuOSA2LjEgMSAyLjQgMi4xIDUuMyAzIDguNSAyLjkgMTAuMy0yLjcgMjUuMy0yLjcgMjUuM3MxNS4xLTE3LjEgMTMuOS0zMi41YzEwLjgtLjUgMjEuNC04LjQgMjEuMS0xOS41IDAgMC0xOC45IDEwLjQtMzUuNS04LjgtOS43LTExLjItNDAuOS00Mi04My4xLTMxLjggNC4zIDEgOC45IDIuNCAxMy41IDQuMWwtLjEgMGMtNC4yIDItNi41IDcuMS03IDEyem0yOC4zLTEuOGMxOS41IDExIDM3LjQgMjUuNyA0NC45IDM3LTUuNyAzLjMtMjEuNyAxMC40LTM4LTEuNy0xMC4zLTcuNi05LjgtMjYuMi02LjktMzUuM3pNMjMyIDIzMy4zYy0xLjIgMTUuNSAxMy45IDMyLjUgMTMuOSAzMi41cy01LjYtMTUtMi43LTI1LjNjLjktMy4yIDItNiAzLTguNSAxOS4zIDE3LjMgNDggMS41IDU0LjgtNi4xIDkuNi0xMC42IDEyLjMtMjMuOCAxMi44LTM0LjEgMS44IDMuOCAzLjQgOS4xIDQgMTYuNiAwIDAgNi40LTkuMSA1LjItMTkuMS0uNi01LTIuOS0xMC03LTExLjhsLS4xIDBjNC42LTEuOCA5LjItMy4yIDEzLjUtNC4xLTQyLjMtMTAuMi03My40IDIwLjYtODMuMSAzMS44LTE2LjcgMTkuMi0zNS41IDguOC0zNS41IDguOC0uMiAxMC45IDEwLjQgMTguOSAyMS4yIDE5LjN6bTYyLjctNDUuOGMzIDkuMSAzLjQgMjcuNy03IDM1LjQtMTYuMyAxMi4xLTMyLjIgNS0zNy45IDEuNiA3LjUtMTEuNCAyNS40LTI2IDQ0LjktMzd6bS0xMzQuNCAyMzFsLTI5LjQgMGMtNS41IDAtOC4yIDEuNi05LjUgMi45LTEuOSAyLTIuMiA0LjctLjkgOC4xIDMuNSA5LjEgMTEuNCAxNi41IDEzLjcgMTguNiAzLjEgMi43IDcuNSA0LjMgMTEuOCA0LjMgNC40IDAgOC4zLTEuNyAxMS00LjYgNy41LTguMiAxMS45LTE3LjEgMTMtMTkuOCAuNi0xLjUgMS4zLTQuNS0uOS02LjgtMS44LTEuOC00LjctMi43LTguOC0yLjd6TTM0OS41IDMxNy4zYy0yLjQgMTcuOS0xMyAzMy44LTI0LjYgNDMuNy0zLjEtMjIuNy0zLjctNTUuNS0zLjctNjIuNCAwLTE0LjcgOS41LTI0LjUgMTIuMi0yNi4xIDIuNS0xLjUgNS40LTMgOC4zLTQuNiAxOC05LjYgNDAuNC0yMS42IDQwLjQtNDMuNyAwLTE2LjItOS4zLTIzLjItMTUuNC0yNy44LS44LS42LTEuNS0xLjEtMi4yLTEuNy0yLjEtMS43LTMuNy0zLTQuMy00LjQtNC40LTkuOC0zLjYtMzQuMi0xLjctMzcuNiAuNi0uNiAxNi43LTIwLjkgMTEuOC0zOS4yLTItNy40LTYuOS0xMy4zLTE0LjEtMTctNS4zLTIuNy0xMS45LTQuMi0xOS41LTQuNS0uMS0yLS41LTMuOS0uOS01LjktLjYtMi42LTEuMS01LjMtLjktOC4xIC40LTQuNyAuOC05IDIuMi0xMS4zIDguNC0xMy4zIDI4LjgtMTcuNiAyOS0xNy42bDEyLjMtMi40LTguMS05LjVjLS4xLS4yLTE3LjMtMTcuNS00Ni4zLTE3LjUtNy45IDAtMTYgMS4zLTI0LjEgMy45LTI0LjIgNy44LTQyLjkgMzAuNS00OS40IDM5LjMtMy4xLTEtNi4zLTEuOS05LjYtMi43LTQuMi0xNS44IDktMzguNSA5LTM4LjVzLTEzLjYtMy0zMy43IDE1LjJjLTIuNi02LjUtOC4xLTIwLjUtMS44LTM3LjItMjkuNSAxMC40LTM2LjkgMjYuMy0zOS4xIDQwLjctNy42LTUuNC02LjctMjMuMS03LjItMjcuNi03LjUgLjktMjkuMiAyMS45LTI4LjIgNDguMy0yIC41LTMuOSAxLjEtNS45IDEuNy02LjUtOC44LTI1LjEtMzEuNS00OS40LTM5LjMtNy45LTIuMi0xNi0zLjUtMjMuOS0zLjUtMjkgMC00Ni4xIDE3LjMtNDYuMyAxNy41bC04LjEgOS40IDEyLjMgMi40Yy4yIDAgMjAuNiA0LjMgMjkgMTcuNiAxLjQgMi4yIDEuOCA2LjYgMi4yIDExLjMgLjIgMi44LS40IDUuNS0uOSA4LjEtLjQgMS45LS44IDMuOS0uOSA1LjktNy43IC4zLTE0LjIgMS44LTE5LjUgNC41LTcuMiAzLjctMTIuMSA5LjYtMTQuMSAxNy01IDE4LjIgMTEuMiAzOC41IDExLjggMzkuMiAxLjkgMy40IDIuNyAyNy44LTEuNyAzNy42LS42IDEuNC0yLjIgMi43LTQuMyA0LjQtLjcgLjUtMS40IDEuMS0yLjIgMS43LTYuMSA0LjYtMTUuNCAxMS43LTE1LjQgMjcuOCAwIDIyLjEgMjIuNCAzNC4xIDQwLjQgNDMuNyAzIDEuNiA1LjggMy4xIDguMyA0LjYgMi43IDEuNiAxMi4yIDExLjQgMTIuMiAyNi4xIDAgNi45LS42IDM5LjctMy43IDYyLjQtMTEuNi05LjktMjIuMi0yNS45LTI0LjYtNDMuOCAwIDAtMjkuMiAyMi42LTIwLjYgNzAuOCA1LjIgMjkuNSAyMy4yIDQ2LjEgNDcgNTQuNyA4LjggMTkuMSAyOS40IDQ1LjcgNjcuMyA0OS42IDE0LjQgMTEuOCAzNC40IDE5LjUgNjMuNiAxOS41bC4yIDBjMjkuMSAwIDQ5LjEtNy43IDYzLjYtMTkuNSAzNy45LTMuOSA1OC41LTMwLjUgNjcuMy00OS42IDIzLjgtOC43IDQxLjctMjUuMiA0Ny01NC43IDguMi00OC40LTIxLjEtNzAuOS0yMS4xLTcwLjl6TTMwNiAzNy43YzUuNi0xLjggMTEuNi0yLjcgMTcuNy0yLjcgMTEgMCAxOS45IDMgMjQuNyA1LTMuMSAxLjQtNi40IDMuMi05LjcgNS4zLTIuNC0uNC01LjYtLjgtOS4yLS44LTEwLjUgMC0yMC41IDMuMS0yOC43IDguOS0xMi4zIDguNy0xOCAxNi45LTIwLjcgMjIuNC0yLjItMS4zLTQuNS0yLjUtNy4xLTMuNy0xLjYtLjgtMy4xLTEuNS00LjctMi4yIDYuMS05LjEgMTkuOS0yNi41IDM3LjctMzIuMnptMjEgMTguMmMtLjggMS0xLjYgMi4xLTIuMyAzLjItMy4zIDUuMi0zLjkgMTEuNi00LjQgMTcuOC0uNSA2LjQtMS4xIDEyLjUtNC40IDE3LTQuMiAuOC04LjEgMS43LTExLjUgMi43LTIuMy0zLjEtNS42LTctMTAuNS0xMS4yIDEuNC00LjggNS41LTE2LjEgMTMuNS0yMi41IDUuNi00LjMgMTIuMi02LjcgMTkuNi03ek00NS45IDQ1LjNjLTMuMy0yLjItNi42LTQtOS43LTUuMyA0LjgtMiAxMy43LTUgMjQuNy01IDYuMSAwIDEyIC45IDE3LjcgMi43IDE3LjggNS44IDMxLjYgMjMuMiAzNy43IDMyLjEtMS42IC43LTMuMiAxLjQtNC44IDIuMi0yLjUgMS4yLTQuOSAyLjUtNy4xIDMuNy0yLjYtNS40LTguMy0xMy43LTIwLjctMjIuNC04LjMtNS44LTE4LjItOC45LTI4LjgtOC45LTMuNCAuMS02LjYgLjUtOSAuOXpNOTAuNiA4NS40Yy00LjkgNC4yLTguMyA4LTEwLjUgMTEuMi0zLjQtLjktNy4zLTEuOS0xMS41LTIuNy0zLjMtNC40LTMuOC0xMC41LTQuMy0xNi45LS41LTYuMi0xLjEtMTIuNi00LjQtMTcuOC0uNy0xLjEtMS41LTIuMi0yLjMtMy4yIDcuNCAuMyAxNCAyLjYgMTkuNSA3IDggNi4zIDEyLjEgMTcuNiAxMy41IDIyLjR6TTU4LjQgMjU5LjljLTIuNy0xLjYtNS42LTMuMS04LjQtNC42LTE0LjktOC0zMC4yLTE2LjMtMzAuMi0zMC41IDAtMTEuMSA0LjMtMTQuNiA4LjktMTguMmwuNS0uNGMuNy0uNiAxLjQtMS4yIDIuMi0xLjgtLjkgNy4yLTEuOSAxMy4zLTIuNyAxNC45IDAgMCAxMi4xLTE1IDE1LjctNDQuMyAxLjQtMTEuNS0xLjEtMzQuMy01LjEtNDMgLjIgNC45IDAgOS44LS4zIDE0LjQtLjQtLjgtLjgtMS42LTEuMy0yLjItMy4yLTQtMTEuOC0xNy41LTkuNC0yNi42IC45LTMuNSAzLjEtNiA2LjctNy44IDMuOC0xLjkgOC44LTIuOSAxNS4xLTIuOSAxMi4zIDAgMjUuOSAzLjcgMzIuOSA2IDI1LjEgOCA1NS40IDMwLjkgNjQuMSAzNy43IC4yIC4yIC40IC4zIC40IC4zbDUuNiAzLjktMy41LTUuOGMtLjItLjMtMTkuMS0zMS40LTUzLjItNDYuNSAyLTIuOSA3LjQtOC4xIDIxLjYtMTUuMSAyMS40LTEwLjUgNDYuNS0xNS44IDc0LjMtMTUuOCAyNy45IDAgNTIuOSA1LjMgNzQuMyAxNS44IDE0LjIgNi45IDE5LjYgMTIuMiAyMS42IDE1LjEtMzQgMTUuMS01Mi45IDQ2LjItNTMuMSA0Ni41bC0zLjUgNS44IDUuNi0zLjlzLjItLjEgLjQtLjNjOC43LTYuOCAzOS0yOS44IDY0LjEtMzcuNyA3LTIuMiAyMC42LTYgMzIuOS02IDYuMyAwIDExLjMgMSAxNS4xIDIuOSAzLjUgMS44IDUuNyA0LjQgNi43IDcuOCAyLjUgOS4xLTYuMSAyMi42LTkuNCAyNi42LS41IC42LS45IDEuMy0xLjMgMi4yLS4zLTQuNi0uNS05LjUtLjMtMTQuNC00IDguOC02LjUgMzEuNS01LjEgNDMgMy42IDI5LjMgMTUuNyA0NC4zIDE1LjcgNDQuMy0uOC0xLjYtMS44LTcuNy0yLjctMTQuOSAuNyAuNiAxLjUgMS4yIDIuMiAxLjhsLjUgLjRjNC42IDMuNyA4LjkgNy4xIDguOSAxOC4yIDAgMTQuMi0xNS40IDIyLjUtMzAuMiAzMC41LTIuOSAxLjUtNS43IDMuMS04LjQgNC42LTguNyA1LTE4IDE2LjctMTkuMSAzNC4yLS45IDE0LjYgLjkgNDkuOSAzLjQgNzUuOS0xMi40IDQuOC0yNi43IDYuNC0zOS43IDYuOC0yLTQuMS0zLjktOC41LTUuNS0xMy4xLS43LTItMTkuNi01MS4xLTI2LjQtNjIuMiA1LjUgMzkgMTcuNSA3My43IDIzLjUgODkuNi0zLjUtLjUtNy4zLS43LTExLjctLjdsLTExNyAwYy00LjQgMC04LjMgLjMtMTEuNyAuNyA2LTE1LjkgMTguMS01MC42IDIzLjUtODkuNi02LjggMTEuMi0yNS43IDYwLjMtMjYuNCA2Mi4yLTEuNiA0LjYtMy41IDktNS41IDEzLjEtMTMtLjQtMjcuMi0yLTM5LjctNi44IDIuNS0yNiA0LjMtNjEuMiAzLjQtNzUuOS0uOS0xNy40LTEwLjMtMjkuMi0xOS0zNC4yek0zNS4xIDQwNC42Yy0xMi4xLTIwLTguNy01NC4xLTMuNy01OS4xIDEwLjkgMzQuNCA0Ny4yIDQ0LjMgNzQuNCA0NS40LTIuNyA0LjItNS4yIDcuNi03IDEwbC0xLjQgMS40Yy03LjIgNy44LTguNiAxOC41LTQuMSAzMS44LTIyLjctLjEtNDYuMy05LjgtNTguMi0yOS41em00NS43IDQzLjVjNiAxLjEgMTIuMiAxLjkgMTguNiAyLjQgMy41IDggNy40IDE1LjkgMTIuMyAyMy4xLTE0LjQtNS45LTI0LjQtMTYtMzAuOS0yNS41em0xMTEuNSA1MC4xYy02MC42LS4xLTc4LjMtNDUuOC04NC45LTY0LjctMy43LTEwLjUtMy40LTE4LjIgLjktMjMuMSAyLjktMy4zIDkuNS03LjIgMjQuNi03LjJsMTE4LjggMGMxNS4xIDAgMjEuOCAzLjkgMjQuNiA3LjIgNC4yIDQuOCA0LjUgMTIuNiAuOSAyMy4xLTYuNiAxOC44LTI0LjMgNjQuNi04NC45IDY0Ljd6bTgwLjYtMjQuNmM0LjktNy4yIDguOC0xNS4xIDEyLjMtMjMuMSA2LjQtLjUgMTIuNi0xLjMgMTguNi0yLjQtNi41IDkuNS0xNi41IDE5LjYtMzAuOSAyNS41em03Ni42LTY5Yy0xMiAxOS43LTM1LjYgMjkuMy01OC4xIDI5LjcgNC41LTEzLjMgMy4xLTI0LjEtNC4xLTMxLjgtLjQtLjUtLjktMS0xLjQtMS41LTEuOC0yLjQtNC4zLTUuOC03LTEwIDI3LjItMS4yIDYzLjUtMTEgNzQuNC00NS40IDUgNSA4LjQgMzkuMS0zLjggNTl6TTE5Mi4yIDE4Ny43bC4yIDBjMTIuNy0uMSAyNy4yLTE3LjggMjcuMi0xNy44LTkuOSA2LTE4LjggOC4xLTI3LjMgOC4zLTguNS0uMi0xNy40LTIuMy0yNy4zLTguMyAwIDAgMTQuNSAxNy42IDI3LjIgMTcuOHptNjEuNyAyMzAuN2wtMjkuNCAwYy00LjIgMC03LjIgLjktOC45IDIuNy0yLjIgMi4zLTEuNSA1LjItLjkgNi43IDEgMi42IDUuNSAxMS4zIDEzIDE5LjMgMi43IDIuOSA2LjYgNC41IDExIDQuNXM4LjctMS42IDExLjgtNC4yYzIuMy0yIDEwLjItOS4yIDEzLjctMTguMSAxLjMtMy4zIDEtNi0uOS03LjktMS4zLTEuMy00LTIuOS05LjQtM3oiXQogICAgfTsKICAgIGZhUm9ja3JtcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJyb2Nrcm1zIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzZTkiLCAiTTI1NiA4YTI0OCAyNDggMCAxIDAgMCA0OTYgMjQ4IDI0OCAwIDEgMCAwLTQ5NnpNNDEzLjQgNDI3LjVsLTkwIDAtMTEyLTEzMS4zYy0xNy45LTIwLjQtMy45LTU2LjEgMjYuNi01Ni4xbDc1LjMgMC04NC42LTk5LjMtODQuMyA5OC45LTkwIDAgMTQ3LjEtMTcyLjVjMTQuNC0xOC40IDQxLjMtMTcuMyA1NC41IDBMNDEzLjcgMjUyLjNjMTkgMjIuOCAyIDU3LjItMjcuNiA1Ni4xLS42IDAtNzQuMiAuMi03NC4yIC4yTDQxMy40IDQyNy41eiJdCiAgICB9OwogICAgZmFVbnNwbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ1bnNwbGFzaCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlMDdjIiwgIk00NDggMjMwLjJsMCAyNDkuOC00NDggMCAwLTI0OS44IDE0MS4xIDAgMCAxMjQuOSAxNjUuNyAwIDAtMTI0LjkgMTQxLjEgMHpNMzA2LjkgMzJsLTE2NS43IDAgMCAxMjQuOSAxNjUuNyAwIDAtMTI0Ljl6Il0KICAgIH07CiAgICBmYVNxdWFyZUluc3RhZ3JhbSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtaW5zdGFncmFtIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImluc3RhZ3JhbS1zcXVhcmUiXSwgImUwNTUiLCAiTTE5NC40IDIxMS43YTUzLjMgNTMuMyAwIDEgMCA1OS4yIDg4LjYgNTMuMyA1My4zIDAgMSAwIC01OS4yLTg4LjZ6bTE0Mi4zLTY4LjRjLTUuMi01LjItMTEuNS05LjMtMTguNC0xMi0xOC4xLTcuMS01Ny42LTYuOC04My4xLTYuNS00LjEgMC03LjkgLjEtMTEuMiAuMXMtNy4yIDAtMTEuNC0uMWMtMjUuNS0uMy02NC44LS43LTgyLjkgNi41LTYuOSAyLjctMTMuMSA2LjgtMTguNCAxMnMtOS4zIDExLjUtMTIgMTguNGMtNy4xIDE4LjEtNi43IDU3LjctNi41IDgzLjIgMCA0LjEgLjEgNy45IC4xIDExLjFzMCA3LS4xIDExLjFjLS4yIDI1LjUtLjYgNjUuMSA2LjUgODMuMiAyLjcgNi45IDYuOCAxMy4xIDEyIDE4LjRzMTEuNSA5LjMgMTguNCAxMmMxOC4xIDcuMSA1Ny42IDYuOCA4My4xIDYuNSA0LjEgMCA3LjktLjEgMTEuMi0uMXM3LjIgMCAxMS40IC4xYzI1LjUgLjMgNjQuOCAuNyA4Mi45LTYuNSA2LjktMi43IDEzLjEtNi44IDE4LjQtMTJzOS4zLTExLjUgMTItMTguNGM3LjItMTggNi44LTU3LjQgNi41LTgzIDAtNC4yLS4xLTguMS0uMS0xMS40czAtNy4xIC4xLTExLjRjLjMtMjUuNSAuNy02NC45LTYuNS04My0yLjctNi45LTYuOC0xMy4xLTEyLTE4LjRsMCAuMnptLTY3LjEgNDQuNWMxOC4xIDEyLjEgMzAuNiAzMC45IDM0LjkgNTIuMnMtLjIgNDMuNS0xMi4zIDYxLjZjLTYgOS0xMy43IDE2LjYtMjIuNiAyMi42cy0xOSAxMC4xLTI5LjYgMTIuMmMtMjEuMyA0LjItNDMuNS0uMi02MS42LTEyLjNzLTMwLjYtMzAuOS0zNC45LTUyLjIgLjItNDMuNSAxMi4yLTYxLjYgMzAuOS0zMC42IDUyLjItMzQuOSA0My41IC4yIDYxLjYgMTIuMmwuMSAwem0yOS4yLTEuM2MtMy4xLTIuMS01LjYtNS4xLTcuMS04LjZzLTEuOC03LjMtMS4xLTExLjEgMi42LTcuMSA1LjItOS44IDYuMS00LjUgOS44LTUuMiA3LjYtLjQgMTEuMSAxLjEgNi41IDMuOSA4LjYgNyAzLjIgNi44IDMuMiAxMC42YzAgMi41LS41IDUtMS40IDcuM3MtMi40IDQuNC00LjEgNi4yLTMuOSAzLjItNi4yIDQuMi00LjggMS41LTcuMyAxLjVjLTMuOCAwLTcuNS0xLjEtMTAuNi0zLjJsLS4xIDB6TTQ0OCA5NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwek0zNTcgMzg5Yy0xOC43IDE4LjctNDEuNCAyNC42LTY3IDI1LjktMjYuNCAxLjUtMTA1LjYgMS41LTEzMiAwLTI1LjYtMS4zLTQ4LjMtNy4yLTY3LTI1LjlzLTI0LjYtNDEuNC0yNS44LTY3Yy0xLjUtMjYuNC0xLjUtMTA1LjYgMC0xMzIgMS4zLTI1LjYgNy4xLTQ4LjMgMjUuOC02N3M0MS41LTI0LjYgNjctMjUuOGMyNi40LTEuNSAxMDUuNi0xLjUgMTMyIDAgMjUuNiAxLjMgNDguMyA3LjEgNjcgMjUuOHMyNC42IDQxLjQgMjUuOCA2N2MxLjUgMjYuMyAxLjUgMTA1LjQgMCAxMzEuOS0xLjMgMjUuNi03LjEgNDguMy0yNS44IDY3bDAgLjF6Il0KICAgIH07CiAgICBmYUluc3RhZ3JhbVNxdWFyZSA9IGZhU3F1YXJlSW5zdGFncmFtOwogICAgZmFGaXJzdE9yZGVyQWx0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImZpcnN0LW9yZGVyLWFsdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNTBhIiwgIk0yNTYgOGEyNDggMjQ4IDAgMSAwIDAgNDk2IDI0OCAyNDggMCAxIDAgMC00OTZ6bTAgNy44YTI0MC4yIDI0MC4yIDAgMSAxIDAgNDgwLjQgMjQwLjIgMjQwLjIgMCAxIDEgMC00ODAuNHptMCAyMC41YTIxOS43IDIxOS43IDAgMSAwIDAgNDM5LjQgMjE5LjcgMjE5LjcgMCAxIDAgMC00MzkuNHptMCA4LjJhMjExLjUgMjExLjUgMCAxIDEgMCA0MjMgMjExLjUgMjExLjUgMCAxIDEgMC00MjN6bTE4Ni4yIDI2MGMtNC40IDE3LjEtMTEuMiAzMy41LTIwLjEgNDguN2wtNzQuMS0zNS45IDYxLjUgNTQuOGMtMTAuNiAxNC4xLTIzLjIgMjYuNi0zNy4yIDM3LjNsLTU0LjgtNjEuNiAzNS45IDc0LjNjLTE1LjIgOS0zMS42IDE1LjgtNDguNiAyMC4ybC0yNy4zLTc4LjUgNC44IDgyLjljLTguNiAxLjItMTcuNCAxLjgtMjYuMyAxLjhzLTE3LjctLjYtMjYuMy0xLjhsNC44LTgyLjUtMjcuMiA3OGMtMTcuMS00LjUtMzMuNC0xMS4zLTQ4LjctMjAuMmwzNS45LTc0LjMtNTQuOSA2MS42Yy0xNC0xMC43LTI2LjYtMjMuMi0zNy4yLTM3LjNsNjEuNi01NC45LTc0LjMgMzUuOUM4MC43IDMzOCA3NCAzMjEuNyA2OS41IDMwNC42bDc3LjgtMjcuMS04Mi4yIDQuOGMtMS4yLTguNi0xLjgtMTcuMy0xLjgtMjYuMiAwLTkgLjYtMTcuOCAxLjgtMjYuNWw4Mi40IDQuOC03Ny45LTI3LjJjNC41LTE3LjEgMTEuMy0zMy41IDIwLjItNDguN2w3NC4yIDM1LjktNjEuNS01NC45YzEwLjctMTQgMjMuMi0yNi42IDM3LjMtMzcuMmw1NC44IDYxLjUtMzUuOC03NC4yYzE1LjItOC45IDMxLjYtMTUuNyA0OC42LTIwLjFsMjYuOSA3Ny4yLTQuNy04MS42YzguNi0xLjIgMTcuNC0xLjggMjYuMy0xLjhzMTcuNyAuNiAyNi4zIDEuOGwtNC43IDgyLjIgMjctNzcuOGMxNy4zIDQuNSAzMy42IDExLjQgNDguNiAyMC4ybC0zNS44IDc0LjEgNTQuNy02MS41YzE0LjEgMTAuNyAyNi42IDIzLjIgMzcuMiAzNy4ybC02MS40IDU0LjggNzQuMS0zNS45YzguOSAxNS4yIDE1LjcgMzEuNiAyMC4yIDQ4LjZsLTc3LjggMjcuMSA4Mi4yLTQuN2MxLjIgOC43IDEuOCAxNy41IDEuOCAyNi41IDAgOC45LS42IDE3LjYtMS44IDI2LjJsLTgyLjEtNC43IDc3LjcgMjcuMXoiXQogICAgfTsKICAgIGZhRnVsY3J1bSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmdWxjcnVtIiwKICAgICAgaWNvbjogWzI1NiwgNTEyLCBbXSwgImY1MGIiLCAiTTYzLjggMTY0LjFMMjguNCAyMDcuNy03IDE2NC4xIDI4LjQgMTIwLjYgNjMuOCAxNjQuMXpNMTEyLjIgMGwtMjAuNSAxOTguMi01MSA1Ny44IDUxIDU3LjggMjAuNSAxOTguMiAwLTIxMS4xLTQxLjEtNDQuOSA0MS4xLTQ0LjkgMC0yMTEuMXptNzkuNyAxNjQuMWwzNS40IDQzLjYgMzUuNC00My42LTM1LjQtNDMuNS0zNS40IDQzLjV6bS00OC41IDQ3bDQxLjEgNDQuOS00MS4xIDQ0LjkgMCAyMTEuMSAyMC42LTE5OC4yIDUxLTU3LjgtNTEtNTcuOC0yMC42LTE5OC4yIDAgMjExLjF6Il0KICAgIH07CiAgICBmYUJyYXZlUmV2ZXJzZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJicmF2ZS1yZXZlcnNlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU2M2QiLCAiTTI5OC41IDBjMyAwIDUuOCAxLjMgNy44IDMuNmwzOC4xIDQ0Yy41LS4xIDEtLjIgMS41LS4zIDkuMi0xLjYgMTguNi0yLjIgMjcuNy0xLjIgMTEuNiAxLjQgMjEuNSA1LjQgMjguOSAxMi45IDcuNyA3LjggMTUuNCAxNS44IDIyLjYgMjMuNiAyLjUgMi43IDQuOSA1LjIgNi45IDcuNCAuNyAuOCAxLjQgMS41IDEuOSAyIDMuNCAzLjcgNC4yIDguMSAyLjcgMTEuOWwtOS44IDI0LjYgMTMuMSAzOC4xYy43IDIgLjggNC4xIC4yIDYuMi0uMSAuNC0uMSAuNC0uNSAyLjFsLTEuNSA1LjhjLTEuNiA2LjMtMy41IDEzLjMtNS40IDIwLjktNS42IDIxLjYtMTEuMiA0My4yLTE2LjQgNjMuNC0xMi45IDQ5LjktMjEuNCA4Mi43LTIzLjQgOTAuOS0xMS4xIDQ0LjUtMTkuOSA2MC00OC4zIDgwLjMtMjQuOSAxNy44LTc2LjggNTMuNi04Ni44IDYwLTEgLjYtMiAxLjMtMy40IDIuMy0uNSAuNC0zLjIgMi4yLTMuOSAyLjctNC45IDMuMy04LjMgNS41LTEyLjEgNy4zLTQuNyAyLjItOS4zIDMuNS0xMy45IDMuNXMtOS4xLTEuMi0xMy45LTMuNWMtMy43LTEuOC03LjItMy45LTEyLjEtNy4zLS44LS41LTMuNC0yLjQtMy45LTIuNy0xLjQtMS0yLjUtMS43LTMuNC0yLjMtMTAtNi40LTYxLjktNDIuMS04Ni44LTYwLTI4LjQtMjAuNC0zNy4yLTM1LjgtNDguMy04MC4zLTItOC4yLTEwLjUtNDEtMjMuMy05MC41LTUuMy0yMC42LTEwLjktNDIuMi0xNi41LTYzLjgtMi03LjYtMy44LTE0LjYtNS40LTIwLjlsLTEuNS01LjgtLjUtMi4xYy0uNS0yLS40LTQuMiAuMi02LjJsMTMuMS0zOC4xLTkuOS0yNC41Yy0xLjUtMy44LS43LTguMiAyLTExLjIgMS4yLTEuMyAxLjgtMiAyLjYtMi44IDItMi4yIDQuNC00LjcgNi45LTcuNCA3LjMtNy43IDE1LTE1LjcgMjIuNy0yMy41IDcuNC03LjUgMTcuMy0xMS42IDI4LjktMTIuOSA5LjEtMS4xIDE4LjUtLjUgMjcuNyAxLjIgLjUgLjEgMSAuMiAxLjUgLjNsMzguMS00NGMyLTIuNCA0LjgtMy43IDcuOC0zLjdsMTQ4IDB6bS00LjcgMjEuMWwtMTM4LjYgMC0zOS4xIDQ1LjFjLTIuNiAzLTYuNyA0LjMtMTAuNiAzLjItLjItLjEtLjctLjItMS41LS40LTEuMy0uMy0yLjktLjYtNC41LS45LTcuNC0xLjMtMTQuOS0xLjgtMjEuNy0xLTcuMyAuOS0xMyAzLjItMTYuNiA2LjktNy42IDcuNy0xNS4yIDE1LjYtMjIuMyAyMy4zLTEuNyAxLjgtMy4zIDMuNS00LjggNS4xbDguOCAyMmMxIDIuNCAxIDUgLjIgNy41TDI5LjcgMTcwLjZjLjQgMS40IC41IDEuOSAxLjIgNC44IDEuNiA2LjMgMy41IDEzLjMgNS40IDIwLjkgNS42IDIxLjYgMTEuMiA0My4yIDE2LjQgNjMuNCAxMi45IDUwIDIxLjQgODIuOCAyMy40IDkxIDEwLjEgNDAuMSAxNi40IDUxLjMgNDAuMiA2OC4zIDI0LjYgMTcuNiA3Ni4zIDUzLjIgODUuOSA1OS4zIDEuMiAuOCAyLjUgMS42IDQgMi43IC42IC40IDMuMiAyLjIgMy45IDIuNyA0IDIuOCA2LjcgNC40IDkuMiA1LjYgMi4yIDEgMy45IDEuNSA1LjEgMS41czIuOS0uNSA1LjEtMS41YzIuNS0xLjIgNS4yLTIuOCA5LjItNS42IC43LS41IDMuMy0yLjMgMy45LTIuNyAxLjYtMS4xIDIuOC0xLjkgNC0yLjcgOS42LTYuMSA2MS4zLTQxLjcgODUuOS01OS4zIDIzLjgtMTcuMSAzMC4yLTI4LjIgNDAuMS02OC4zIDIuMS04LjMgMTAuNS00MS4xIDIzLjMtOTAuNyA1LjMtMjAuNiAxMC45LTQyLjIgMTYuNS02My44IDItNy42IDMuOC0xNC42IDUuNC0yMC45IC43LTIuOSAuOS0zLjQgMS4yLTQuOGwtMTMuMy0zOC44Yy0uOC0yLjQtLjgtNS4xIC4yLTcuNWw4LjgtMjJjLTEuNS0xLjYtMy4xLTMuMy00LjgtNS4xLTcuMi03LjYtMTQuNy0xNS41LTIyLjMtMjMuMy0zLjctMy43LTkuMy02LTE2LjYtNi45LTYuOC0uOC0xNC40LS4zLTIxLjcgMS0xLjcgLjMtMy4yIC42LTQuNSAuOS0uOCAuMi0xLjMgLjMtMS41IC40LTMuOCAxLjEtNy45LS4yLTEwLjYtMy4yTDI5My44IDIxLjF6TTIyNC41IDMxNmMyLjggMCAyMC45IDYuNSAzNS40IDE0LjFzMjUgMTMgMjguMyAxNS4yIDEuMyA2LjItMS43IDguNC00NC4xIDM0LjYtNDguMSAzOC4yLTkuOCA5LjUtMTMuOCA5LjUtOS44LTUuOS0xMy44LTkuNS00NS4xLTM2LTQ4LjEtMzguMi01LjEtNi4yLTEuNy04LjQgMTMuOS03LjUgMjguMy0xNS4yIDMyLjUtMTQuMSAzNS40LTE0LjFsLS4yIDB6bS4xLTIzMC43Yy43IDAgOC44IC4yIDIwLjUgNC4yIDEyLjMgNC4yIDI1LjcgOS40IDMxLjkgOS40czUxLjktOC45IDUxLjktOC45IDU0LjIgNjYuNyA1NC4yIDgxLTYuOCAxOC0xMy43IDI1LjQtMzYuOCAzOS44LTQwLjcgNDMuOS0xMS45IDEwLjUtNy4xIDIxLjggMTEuNyAyNS44IDMuOSA0MC40LTIxIDI0LjQtMjkuNCAyMi44LTI4LjQtMTIuMi0zNS43LTE3LjEtMzAuNS0yNC4zLTMwLjUtMzEuOCAyNC0yMC44IDI4LjQtMjMuOSAyNC43LTE0LjggMjUuMS0xOS40IC4zLTYtNS43LTE3LjQtMTYuNy0yNi43LTE0LjktMzYuOCAxOS4xLTE1LjQgMzEuNS0yMC4yIDM2LjItMTMuNyAzOS4yLTE1LjEgMi4yLTIuNy02LjgtMy42LTM0LjYtNC4zLTQ2LjEtMS4xLTMxLjIgOC4yLTMyLjggMTAuOS0zIDIuNy0xLjQgMTEuOCAxMC4xIDUyLjggMTAuOSA2MC42IDIuNCAxMi45LTUuOCAxNC44LTIyLjEgNS4yLTI2LjggNS4yLTE4LjYtMy4zLTI2LjgtNS4yLTYuNi03LTUuOC0xNC44IDkuMy01MS41IDEwLjktNjAuNiAuMi05LjItMS40LTExLjgtMjEuMy03LjYtMzIuOC0xMC45LTM3LjEgLjItNDYuMSAxLjEtOS44IDIuMi02LjggMy42IDI2LjggMTAuNCAzOS4yIDE1LjEgMjkuNyAxMCAzMS41IDIwLjItOSAyNS40LTE0LjkgMzYuOC02LjEgMTIuOC01LjcgMTcuNCAyMC42IDE2LjQgMjUuMSAxOS40IDI4LjQgMTYuNCAyOC40IDIzLjktMjMuMiAyNy0zMC41IDMxLjgtMjcuMiAxNS40LTM1LjcgMTcuMS0yMS43LTguMi0yOS40LTIyLjgtLjgtMjkuMSAzLjktNDAuNC0zLjMtMTcuNy03LjEtMjEuOC0zMy44LTM2LjUtNDAuNy00My45LTEzLjctMTEuMi0xMy43LTI1LjQgNTQuMi04MSA1NC4yLTgxIDQ1LjggOC45IDUxLjkgOC45IDE5LjUtNS4yIDMxLjktOS40IDIwLjYtNC4yIDIwLjYtNC4ybC0uMyAweiJdCiAgICB9OwogICAgZmFBdmlhbmV4ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImF2aWFuZXgiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjM3NCIsICJNNDUzLjIgMzJsLTMxMiAwQzEwMi4zIDMyIDY1IDYzLjIgNTcuOSAxMDEuN0wxLjMgNDEwLjNDLTUuOCA0NDguOCAyMCA0ODAgNTkgNDgwbDMxMiAwYzM4LjkgMCA3Ni4yLTMxLjIgODMuMy02OS43TDUxMSAxMDEuOEM1MTggNjMuMiA0OTIuMiAzMiA0NTMuMiAzMnpNMzk1IDM3OS4zbC0zMiAxMy41LTExNS40LTExMGMtMTQuNyAxMC0yOS4yIDE5LjUtNDEuNyAyNy4xbDIyLjEgNjQuMi0xNy45IDEyLjctNDAuNi02MS01Mi40LTQ4LjEgMTUuNy0xNS40IDU4IDMxLjFjOS4zLTEwLjUgMjAuOC0yMi42IDMyLjgtMzQuOWwtMjAuNS0yOS42LTY4LjgtOTkuOCAxOC44LTI4LjkgOC45LTQuOCAxMDMuMSAxMTIuNCA0LjkgNC41YzE5LjQtMTguOCAzMy44LTMyLjQgMzMuOC0zMi40IDcuNy02LjUgMjEuNS0yLjkgMzAuNyA3LjkgOSAxMC41IDEwLjYgMjQuNyAyLjcgMzEuMy0xLjggMS4zLTE1LjUgMTEuNC0zNS4zIDI1LjZsNC41IDcuMyA5NC45IDExOS40LTYuMyA3Ljl6Il0KICAgIH07CiAgICBmYU5zOCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJuczgiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjNkNSIsICJNMTA0LjMgMjY5LjJsMjYuMSAwIDAtMjYuMi0yNi4xIDAgMCAyNi4yek0xNTYuOCAyNDNsLS4xLTI2LjIgMC0uOWMtLjItMTAuNC00LjQtMjAuMy0xMS45LTI3LjZzLTE3LjUtMTEuMy0yNy45LTExLjEtMjAuMyA0LjQtMjcuNiAxMS44LTExLjMgMTcuNS0xMS4yIDI3LjlsMCAuMiAyNi40IDAgMC0uMmMuMS0zLjQgMS41LTYuNiAzLjktOXM1LjctMy43IDkuMS0zLjcgNi43IDEuMyA5LjEgMy43IDMuOCA1LjYgMy45IDlsMCAyNi4yIDI2LjMgMHptNTIuNCAyNS44YzAgMTItMi40IDIzLjgtNi45IDM0LjlzLTExLjMgMjEuMS0xOS43IDI5LjYtMTguNSAxNS4yLTI5LjYgMTkuNy0yMi45IDYuOS0zNC45IDYuOWwtLjYgMGMtMjQuMiAwLTQ3LjMtOS42LTY0LjQtMjYuN1MyNi4zIDI5MyAyNi4zIDI2OC44bC0yNi4zIDAgMCAuMmMwIDE1LjQgMy4xIDMwLjcgOSA0NC45czE0LjYgMjcuMiAyNS41IDM4LjEgMjMuOSAxOS41IDM4LjEgMjUuNCAyOS41IDguOSA0NC45IDguOWwuOCAwYzE1LjQgMCAzMC43LTMgNDQuOS05czI3LjItMTQuNiAzOC4xLTI1LjUgMTkuNS0yMy44IDI1LjQtMzguMSA4LjktMjkuNSA4LjktNDQuOWwwLTI2LTI2LjMgMCAwIDI2em0tMTU3LjIgMGMuMSAxNy4zIDcgMzMuOSAxOS4yIDQ2LjFzMjguOCAxOS4xIDQ2LjEgMTkuMSAzMy45LTYuOSA0Ni4xLTE5LjEgMTkuMi0yOC44IDE5LjItNDYuMWwtMjYuMyAwYy0uMiAxMC4yLTQuNCAyMC0xMS43IDI3LjJzLTE3LjEgMTEuMi0yNy40IDExLjItMjAuMS00LTI3LjQtMTEuMi0xMS41LTE2LjktMTEuNy0yNy4ybDAtMjYtMjYuMyAwIDAtMjYuNmMuMy0xNy4zIDcuNC0zMy44IDE5LjctNDUuOHMyOS0xOC44IDQ2LjMtMTguNiAzMy44IDcuMiA0NS45IDE5LjUgMTguOSAyOC45IDE4LjkgNDYuMmwwIDI1LjMgMjYuMyAwIDAtMjUuM2MwLTI0LjMtOS43LTQ3LjctMjYuOS02NC45cy00MC41LTI2LjktNjQuOS0yNi45LTQ3LjcgOS43LTY0LjkgMjYuOS0yNi45IDQwLjUtMjYuOSA2NC45bDAgMjUuNCAyNi4zIDAgMCAyNnptNDE4LjQtNzEuMmMxMy43IDAgMjQuNiA2LjYgMzAuMSAxOC4zbC43IDEuNSAyMy4yLTExLjUtLjYtMS40Yy04LTE5LjMtMjguNS0zMS4zLTUzLjQtMzEuMy0yMy4xIDAtNDMuNiAxMS40LTUxIDI4LjQtLjEgMjYuOS0uMiAyMy45IDAgMjQuOCA0LjcgMTEgMTQuNiAxOS40IDI4LjcgMjQuMiA2LjUgMiAxMy4xIDMuMyAxOS44IDQgNS41IC43IDEwLjYgMS40IDE1LjggMy4xIDYuNCAyLjEgMTAuNSA1LjMgMTIuOCA5LjhsMCA5LjljLTMuNyA3LjUtMTMuOCAxMi4zLTI1LjggMTIuMy0xNC4zIDAtMjYtNi45LTMxLjktMTlsLS43LTEuNS0yMyAxMS41IC42IDEuNGM3LjkgMTkuNCAyOS42IDMyIDU1LjMgMzIgMjMuNiAwIDQ0LjYtMTEuNCA1Mi4zLTI4LjRsLjItMjUuOS0uMi0uN2MtNC45LTExLTE1LjItMTkuNi0yOC45LTI0LjItNy43LTIuNy0xNC4zLTMuNi0yMC43LTQuNC01LS41LTEwLTEuNS0xNC44LTIuOS02LjMtMS45LTEwLjQtNS4xLTEyLjYtOS42bDAtOC40YzMuNC03LjQgMTIuOS0xMi4xIDI0LjItMTIuMWwwIDB6TTI4Ny42IDMxMS4zbDI2LjEgMCAwLTY4LjQtMjYuMSAwIDAgNjguNHpNNjM5LjggMjU4Yy0yLjktNi4zLTguMy0xMi0xNS40LTE2LjcgNS42LTMuOCAxMC4xLTkuMSAxMy0xNS4zbC4yLTI1LjMtLjItLjdjLTcuNC0xNi0yNi43LTI2LjctNDguMi0yNi43UzU0OC41IDE4NCA1NDEuMSAyMDBsLS4yIDI1LjMgLjIgLjdjMi45IDYuMSA3LjQgMTEuNCAxMyAxNS4zLTcuMiA0LjctMTIuNSAxMC41LTE1LjQgMTYuN2wtLjIgMjguOSAuMiAuN2M3LjYgMTYgMjcuOSAyNi43IDUwLjYgMjYuN3M0My4xLTEwLjcgNTAuNi0yNi43bC4yLTI4LjktLjItLjd6bS03My4yLTUwLjhjMy42LTYuMyAxMi42LTEwLjUgMjIuNi0xMC41czE5IDQuMiAyMi42IDEwLjVsMCAxMy43Yy0zLjUgNi4yLTEyLjYgMTAuMy0yMi42IDEwLjNzLTE5LjEtNC4yLTIyLjYtMTAuM2wwLTEzLjd6bTQ3LjMgNzIuMmMtMy44IDYuNi0xMy4zIDEwLjktMjQuNyAxMC45LTExLjEgMC0yMS00LjQtMjQuNy0xMC45bDAtMTYuMmMzLjctNi4zIDEzLjUtMTAuNSAyNC43LTEwLjUgMTEuMyAwIDIwLjkgNC4xIDI0LjcgMTAuNWwwIDE2LjJ6TTM3Ni40IDI2NmwtNTkuOC04OS43LTI5IDAgMCA0MC42IDI2LjUgMCAwIC40IDYyLjUgOTQuMSAyNS43IDAgMC0xMzUuMS0yNS45IDAgMCA4OS43eiJdCiAgICB9OwogICAgZmFTcXVhcmVQaW50ZXJlc3QgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXBpbnRlcmVzdCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJwaW50ZXJlc3Qtc3F1YXJlIl0sICJmMGQzIiwgIk0zODQgMzJMNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGw3Mi42IDAtMi4yLS44Yy01LjQtNDguMS0zLjEtNTcuNSAxNS43LTEzNC43IDMuOS0xNiA4LjUtMzUgMTMuOS01Ny45IDAgMC03LjMtMTQuOC03LjMtMzYuNSAwLTcwLjcgNzUuNS03OCA3NS41LTI1IDAgMTMuNS01LjQgMzEuMS0xMS4yIDQ5LjgtMy4zIDEwLjYtNi42IDIxLjUtOS4xIDMyLTUuNyAyNC41IDEyLjMgNDQuNCAzNi40IDQ0LjQgNDMuNyAwIDc3LjItNDYgNzcuMi0xMTIuNCAwLTU4LjgtNDIuMy05OS45LTEwMi42LTk5LjktNjkuOSAwLTExMC45IDUyLjQtMTEwLjkgMTA2LjYgMCAyMS4xIDguMiA0My43IDE4LjMgNTYgMiAyLjQgMi4zIDQuNSAxLjcgNy0xLjEgNC43LTMuMSAxMi45LTQuNyAxOS4yLTEgNC0xLjggNy4zLTIuMSA4LjYtMS4xIDQuNS0zLjUgNS41LTguMiAzLjMtMzAuNi0xNC4zLTQ5LjgtNTkuMS00OS44LTk1LjEgMC03Ny41IDU2LjItMTQ4LjYgMTYyLjItMTQ4LjYgODUuMiAwIDE1MS40IDYwLjcgMTUxLjQgMTQxLjggMCA4NC42LTUzLjMgMTUyLjctMTI3LjQgMTUyLjctMjQuOSAwLTQ4LjMtMTIuOS01Ni4zLTI4LjIgMCAwLTEyLjMgNDYuOS0xNS4zIDU4LjQtNSAxOS4zLTE3LjYgNDIuOS0yNy40IDU5LjNMMzg0IDQ4MGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NHoiXQogICAgfTsKICAgIGZhUGludGVyZXN0U3F1YXJlID0gZmFTcXVhcmVQaW50ZXJlc3Q7CiAgICBmYUJsdWV0b290aEIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYmx1ZXRvb3RoLWIiLAogICAgICBpY29uOiBbMjU2LCA1MTIsIFtdLCAiZjI5NCIsICJNMTY0LjkgMjYwTDI1Ny41IDE1Ni43IDExMS42IDAgMTExLjYgMjA2LjMgMjUuNCAxMjAuMi02IDE1MS42IDEwMi4xIDI2MC02IDM2OC40IDI1LjQgMzk5LjggMTExLjYgMzEzLjcgMTE0LjMgNTEyIDI2Mi44IDM2My40IDE2NC45IDI2MHptNDAuOS0xMDNsLTUwIDUwLS4zLTEwMC4zIDUwLjMgNTAuM3ptLTUwIDE1Nmw1MCA1MC01MC4zIDUwLjMgLjMtMTAwLjN6Il0KICAgIH07CiAgICBmYUdyaXBmaXJlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdyaXBmaXJlIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbXSwgImYzYWMiLCAiTTgwLjUgMzAxLjRjMC03My44IDEwNS4xLTEyMi41IDEwNS4xLTIwMyAwLTQ3LjEtMzQtODgtMzkuMS05MC40IC40IDMuMyAuNiA2LjcgLjYgMTAgMCA5Mi4xLTE0Ny4xIDE1My45LTE0Ny4xIDI2OC42IDAgNDkuOCAzMi4yIDc5LjIgNjYuNSAxMDguMyA2NS4xIDQ2LjcgNzguMSA3MS40IDc4LjEgODYuNiAwIDEwLjEtNC44IDE3LTQuOCAyMi4zIDEzLjEtMTYuNyAxNy40LTMxLjkgMTcuNS00Ni40IDAtMjkuNi0yMS43LTU2LjMtNDQuMi04Ni41LTE2LTIyLjMtMzIuNi00Mi42LTMyLjYtNjkuNXptMjA1LjMtMzljLTEyLjEtNjYuOC03OC0xMjQuNC05NC43LTEzMC45bDQgNy4yYzIuNCA1LjEgMy40IDEwLjkgMy40IDE3LjEgMCA0NC43LTU0LjIgMTExLjItNTYuNiAxMTYuNy0yLjIgNS4xLTMuMiAxMC41LTMuMiAxNS44IDAgMjAuMSAxNS4yIDQyLjEgMTcuOSA0Mi4xIDIuNCAwIDU2LjYtNTUuNCA1OC4xLTg3LjcgNi40IDExLjcgOS4xIDIyLjYgOS4xIDMzLjQgMCA0MS4yLTQxLjggOTYuOS00MS44IDk2LjkgMCAxMS42IDMxLjkgNTMuMiAzNS41IDUzLjIgMSAwIDIuMi0xLjQgMy4yLTIuNCAzNy45LTM5LjMgNjcuMy04NSA2Ny4zLTEzNi44IDAtOC0uNy0xNi4yLTIuMi0yNC42eiJdCiAgICB9OwogICAgZmFTcXVhcmVHb29nbGVQbHVzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1nb29nbGUtcGx1cyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJnb29nbGUtcGx1cy1zcXVhcmUiXSwgImYwZDQiLCAiTTQ0OCA5NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwek02NCAyNTZjMC01NS4zIDQ0LjctMTAwIDEwMC0xMDAgMjcgMCA0OS41IDkuOCA2NyAyNi4ybC0yNy4xIDI2LjFjLTcuNC03LjEtMjAuMy0xNS40LTM5LjgtMTUuNC0zNC4xIDAtNjEuOSAyOC4yLTYxLjkgNjMuMiAwIDM0LjkgMjcuOCA2My4yIDYxLjkgNjMuMiAzOS42IDAgNTQuNC0yOC41IDU2LjgtNDMuMWwtNTYuOSAwIDAtMzQuNCA5NC40IDBjMSA1IDEuNiAxMC4xIDEuNiAxNi42IDAgNTcuMS0zOC4zIDk3LjYtOTYgOTcuNi01NS4zIDAtMTAwLTQ0LjctMTAwLTEwMHptMjkxIDE4LjJsMCAyOS0yOS4yIDAgMC0yOS0yOSAwIDAtMjkuMiAyOSAwIDAtMjkgMjkuMiAwIDAgMjkgMjkgMCAwIDI5LjItMjkgMHoiXQogICAgfTsKICAgIGZhR29vZ2xlUGx1c1NxdWFyZSA9IGZhU3F1YXJlR29vZ2xlUGx1czsKICAgIGZhQXBwU3RvcmUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYXBwLXN0b3JlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzNmYiLCAiTTI1NS45IDEyMC45bDkuMS0xNS43YzUuNi05LjggMTguMS0xMy4xIDI3LjktNy41czEzLjEgMTguMSA3LjUgMjcuOWwtODcuNSAxNTEuNSA2My4zIDBjMjAuNSAwIDMyIDI0LjEgMjMuMSA0MC44bC0xODUuNSAwYy0xMS4zIDAtMjAuNC05LjEtMjAuNC0yMC40czkuMS0yMC40IDIwLjQtMjAuNGw1MiAwIDY2LjYtMTE1LjQtMjAuOC0zNi4xYy01LjYtOS44LTIuMy0yMi4yIDcuNS0yNy45IDkuOC01LjYgMjIuMi0yLjMgMjcuOSA3LjVsOC45IDE1Ljd6bS03OC43IDIxOGwtMTkuNiAzNGMtNS42IDkuOC0xOC4xIDEzLjEtMjcuOSA3LjVzLTEzLjEtMTguMS03LjUtMjcuOWwxNC42LTI1LjJjMTYuNC01LjEgMjkuOC0xLjIgNDAuNCAxMS42em0xNjguOS02MS43bDUzLjEgMGMxMS4zIDAgMjAuNCA5LjEgMjAuNCAyMC40UzQxMC41IDMxOCAzOTkuMiAzMThsLTI5LjUgMCAxOS45IDM0LjVjNS42IDkuOCAyLjMgMjIuMi03LjUgMjcuOS05LjggNS42LTIyLjIgMi4zLTI3LjktNy41LTMzLjUtNTguMS01OC43LTEwMS42LTc1LjQtMTMwLjYtMTcuMS0yOS41LTQuOS01OS4xIDcuMi02OS4xIDEzLjQgMjMgMzMuNCA1Ny43IDYwLjEgMTA0ek0yNTYgOGEyNDggMjQ4IDAgMSAwIDAgNDk2IDI0OCAyNDggMCAxIDAgMC00OTZ6TTQwIDI1NmEyMTYgMjE2IDAgMSAxIDQzMiAwIDIxNiAyMTYgMCAxIDEgLTQzMiAweiJdCiAgICB9OwogICAgZmFXaXggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAid2l4IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY1Y2YiLCAiTTM5My40IDEzMS43YzAgMTMgMi4xIDMyLjctMjguNyA0My44LTkuNSAzLjQtMTYgOS43LTE2IDkuNyAwLTMxIDQuNy00Mi4yIDE3LjQtNDguOSA5LjgtNS4xIDI3LjItNC42IDI3LjItNC42ek0yNzcuNiAxNjcuMmwtMzQuMiAxMzIuNy0yOC41LTEwOC42Yy03LjctMzItMjAuOC00OC41LTQ4LjQtNDguNS0yNy40IDAtNDAuNyAxNi4yLTQ4LjQgNDguNUw4OS41IDI5OS45IDU1LjMgMTY3LjJDNDkuNyAxNDAuNSAyMy45IDEyOSAwIDEzMkw2NS42IDM3OS45czIxLjYgMS42IDMyLjUtNGMxNC4yLTcuMiAyMS0xMi44IDI5LjYtNDYuNiA3LjctMzAuMSAyOS4xLTExOC40IDMxLjEtMTI0LjcgNC44LTE0LjkgMTEuMS0xMy44IDE1LjQgMCAyIDYuMyAyMy41IDk0LjYgMzEuMSAxMjQuNyA4LjYgMzMuNyAxNS40IDM5LjMgMjkuNiA0Ni42IDEwLjggNS41IDMyLjUgNCAzMi41IDRMMzMyLjkgMTMyYy0yNC40LTMuMS00OS44IDguOS01NS4zIDM1LjN6bTExNS44IDUuMnMtNC4xIDYuMy0xMy41IDExLjZjLTYgMy40LTExLjggNS42LTE4IDguNi0xNS4xIDcuMy0xMy4yIDEzLjktMTMuMiAzNS4ybDAgMTUyLjFzMTYuNiAyLjEgMjcuNC0zLjRjMTMuOS03LjEgMTcuMS0xNCAxNy4zLTQ0LjhsMC0xNTAuMyAwIDAgMC05em0xNjMuNCA4NC4xTDY0MCAxMzIuOHMtMzUuMS02LTUyLjUgOS44Yy0xMy4zIDEyLjEtMjQuNCAyOS42LTU0LjIgNzIuNS0uNSAuNy02LjMgMTAuNS0xMy4xIDAtMjkuMy00Mi4yLTQwLjgtNjAuMy01NC4yLTcyLjUtMTcuNC0xNS44LTUyLjUtOS44LTUyLjUtOS44bDgzLjIgMTIzLjctODMgMTIzLjRzMzYuNiA0LjYgNTQtMTEuMmMxMS41LTEwLjUgMTcuNi0yMC40IDUyLjUtNzAuNyA2LjgtMTAuNSAxMi42LS44IDEzLjEgMCAyOS40IDQyLjQgMzkuMiA1OC4xIDUzLjEgNzAuNyAxNy40IDE1LjggNTMuMyAxMS4yIDUzLjMgMTEuMmwtODMtMTIzLjR6Il0KICAgIH07CiAgICBmYUludGVyY29tID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImludGVyY29tIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY3YWYiLCAiTTM5MiAzMkw1NiAzMkMyNS4xIDMyIDAgNTcuMSAwIDg4TDAgNDI0YzAgMzAuOSAyNS4xIDU2IDU2IDU2bDMzNiAwYzMwLjkgMCA1Ni0yNS4xIDU2LTU2bDAtMzM2YzAtMzAuOS0yNS4xLTU2LTU2LTU2ek0yODMuNyAxMTQuMWMwLTE5LjggMjkuOS0xOS44IDI5LjkgMGwwIDE5OS41YzAgMTkuOC0yOS45IDE5LjgtMjkuOSAwbDAtMTk5LjV6bS03NC42LTcuNWMwLTE5LjggMjkuOS0xOS44IDI5LjkgMGwwIDIxNi41YzAgMTkuOC0yOS45IDE5LjgtMjkuOSAwbDAtMjE2LjV6bS03NC43IDcuNWMwLTE5LjggMjkuOS0xOS44IDI5LjkgMGwwIDE5OS41YzAgMTkuOC0yOS45IDE5LjgtMjkuOSAwbDAtMTk5LjV6TTU5LjcgMTQ0YzAtMTkuOCAyOS45LTE5LjggMjkuOSAwbDAgMTM0LjNjMCAxOS44LTI5LjkgMTkuOC0yOS45IDBsMC0xMzQuM3pNMzgzLjEgMzcxLjhjLTcyLjggNjMtMjQxLjcgNjUuNC0zMTguMSAwLTE1LTEyLjggNC40LTM1LjUgMTkuNC0yMi43IDY1LjkgNTUuMyAyMTYuMSA1My45IDI3OS4zIDAgMTQuOS0xMi45IDM0LjMgOS44IDE5LjQgMjIuN3ptNS4yLTkzLjVjMCAxOS44LTI5LjkgMTkuOC0yOS45IDBsMC0xMzQuM2MwLTE5LjggMjkuOS0xOS44IDI5LjkgMGwwIDEzNC4zeiJdCiAgICB9OwogICAgZmFSZWFjdGV1cm9wZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJyZWFjdGV1cm9wZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNzVkIiwgIk0yNTAuNyAyMTEuN2w1LjgtNC4xIDUuOCA0LjEtMi4xLTYuOCA1LjctNC4zLTcuMS0uMS0yLjMtNi44LTIuMyA2LjgtNy4yIC4xIDUuNyA0LjMtMiA2Ljh6bTYzLjcgMGw1LjgtNC4xIDUuOCA0LjEtMi4xLTYuOCA1LjctNC4zLTcuMi0uMS0yLjMtNi44LTIuMyA2LjgtNy4yIC4xIDUuNyA0LjMtMS45IDYuOHptLTkxLjMgNTAuNWwtMy40IDBjLTQuOCAwLTMuOCA0LTMuOCAxMi4xIDAgNC43LTIuMyA2LjEtNS44IDYuMXMtNS44LTEuNC01LjgtNi4xbDAtMzYuNmMwLTQuNyAyLjMtNi4xIDUuOC02LjFzNS44IDEuNCA1LjggNi4xYzAgNy4yLS43IDEwLjUgMy44IDEwLjVsMy40IDBjNC43LS4xIDMuOC0zLjkgMy44LTEyLjMgMC05LjktNi43LTE0LjEtMTYuOC0xNC4xbC0uMiAwYy0xMC4xIDAtMTYuOCA0LjItMTYuOCAxNC4xbDAgNDAuMWMwIDEwLjQgNi43IDE0LjEgMTYuOCAxNC4xbC4yIDBjMTAuMSAwIDE2LjgtMy44IDE2LjgtMTQuMSAwLTkuOSAxLjEtMTMuOC0zLjgtMTMuOHptLTgwLjcgMTcuNGwtMTQuNyAwIDAtMTkuMyAxMS40IDBjMi41IDAgMy44LTEuMyAzLjgtMy44bDAtMi4xYzAtMi41LTEuMy0zLjgtMy44LTMuOGwtMTEuNCAwIDAtMTguMyAxNC40IDBjMi41IDAgMy44LTEuMyAzLjgtMy44bDAtMi4xYzAtMi41LTEuMy0zLjgtMy44LTMuOGwtMjEuNyAwYy0yLjQtLjEtMy43IDEuMy0zLjcgMy44bDAgNTkuMWMwIDIuNSAxLjMgMy44IDMuOCAzLjhsMjEuOSAwYzIuNSAwIDMuOC0xLjMgMy44LTMuOGwwLTIuMWMwLTIuNS0xLjMtMy44LTMuOC0zLjh6bS00Mi0xOC41YzQuNi0yIDcuMy02IDcuMy0xMi40bDAtMTEuOWMwLTEwLjEtNi43LTE0LjEtMTYuOC0xNC4xbC0xMy40IDBjLTIuNSAwLTMuOCAxLjMtMy44IDMuOGwwIDU5LjFjMCAyLjUgMS4zIDMuOCAzLjggMy44bDMuNCAwYzIuNSAwIDMuOC0xLjMgMy44LTMuOGwwLTIyLjkgNS42IDAgNy40IDIzLjVjLjIgMSAuOCAxLjggMS42IDIuNHMxLjggLjkgMi43IC44bDMuMyAwYzIuOCAwIDQtMS44IDMuMi00LjRsLTguMS0yMy45em0tMy44LTE0YzAgNC44LTIuNSA2LjEtNi4xIDYuMWwtNS44IDAgMC0yMC45IDUuOCAwYzMuNiAwIDYuMSAxLjMgNi4xIDYuMWwwIDguN3pNMTc2LjEgMjI2Yy0uMS0uNS0uMi0xLS40LTEuNHMtLjYtLjgtMS0xLjEtLjgtLjYtMS4zLS43LTEtLjItMS41LS4xbC02LjkgMGMtLjUgMC0xIDAtMS40IC4ycy0uOSAuNC0xLjMgLjctLjcgLjctLjkgMS4xLS40IC45LS40IDEuNGwtMTEgNTkuMmMtLjUgMi43IC45IDQuMSAzLjQgNC4xbDMgMGMuNSAuMSAxIDAgMS41LS4ycy45LS40IDEuMy0uNyAuNy0uNyAuOS0xLjIgLjQtLjkgLjQtMS40bDEuOC0xMS4zIDEyLjIgMCAxLjggMTEuM2MwIC41IC4yIDEgLjQgMS40cy41IC45IC45IDEuMiAuOCAuNiAxLjMgLjcgMSAuMiAxLjUgLjJsMy41IDBjMi42IDAgMy45LTEuNCAzLjQtNC4xTDE3Ni4xIDIyNnptLTEyLjMgMzkuM2w0LjctMjkuNyA0LjcgMjkuNy05LjQgMHptODkuMyAyMC4ybDAtNTMuMiA3LjUgMGMyLjUgMCAzLjgtMS4zIDMuOC0zLjhsMC0yLjFjMC0yLjUtMS4zLTMuOC0zLjgtMy44bC0yNS44IDBjLTIuNSAwLTMuOCAxLjMtMy44IDMuOGwwIDIuMWMwIDIuNSAxLjMgMy44IDMuOCAzLjhsNy4zIDAgMCA1My4yYzAgMi41IDEuMyAzLjggMy44IDMuOGwzLjQgMGMyLjUgMCAzLjgtMS4zIDMuOC0zLjhsMCAwem0yNDgtLjhsLTE5LjQgMCAwLTI2LjcgMTYuMSAwYy4zIDAgLjUgMCAuOC0uMXMuNS0uMiAuNy0uNCAuMy0uNCAuNC0uNyAuMS0uNSAuMS0uOGwwLS44YzAtLjMgMC0uNS0uMS0uOHMtLjItLjUtLjQtLjctLjQtLjMtLjctLjQtLjUtLjEtLjgtLjFsLTE2LjEgMCAwLTI1LjggMTkuMSAwYy4zIDAgLjUgMCAuOC0uMXMuNS0uMiAuNy0uNCAuMy0uNCAuNC0uNyAuMS0uNSAuMS0uOGwwLS44YzAtLjMgMC0uNS0uMS0uOHMtLjItLjUtLjQtLjctLjQtLjMtLjctLjQtLjUtLjEtLjgtLjFsLTIyLjIgMGMtLjMtLjEtLjUtLjEtLjggMHMtLjUgLjItLjcgLjQtLjMgLjQtLjQgLjctLjEgLjUtLjEgLjhsMCA2M2MwIC4zIDAgLjUgLjEgLjhzLjIgLjUgLjQgLjYgLjQgLjMgLjcgLjQgLjUgLjEgLjggLjFsMjIuNSAwYy4zIDAgLjUgMCAuOC0uMXMuNS0uMiAuNy0uNCAuMy0uNCAuNC0uNiAuMS0uNSAuMS0uOGwwLS44YzAtLjMgMC0uNS0uMS0uOHMtLjItLjUtLjQtLjctLjQtLjMtLjctLjQtLjUtLjEtLjgtLjFsMCAwek00MDggMjIxLjhsLS44IDBjLTEwLjEgMC0xNS4zIDQuNy0xNS4zIDE0LjFsMCA0MC4xYzAgOS4zIDUuMiAxNC4xIDE1LjMgMTQuMWwuOCAwYzEwLjEgMCAxNS4zLTQuOCAxNS4zLTE0LjFsMC00MC4xYzAtOS40LTUuMi0xNC4xLTE1LjMtMTQuMWwwIDB6bTEwLjIgNTIuNGMtLjEgOC0zIDExLjEtMTAuNSAxMS4xcy0xMC41LTMuMS0xMC41LTExLjFsMC0zNi42YzAtNy45IDMtMTEuMSAxMC41LTExLjFzMTAuNSAzLjIgMTAuNSAxMS4xbDAgMzYuNnptLTQ2LjUtMTQuNWM2LjEtMS42IDkuMi02LjEgOS4yLTEzLjNsMC05LjdjMC05LjQtNS4yLTE0LjEtMTUuMy0xNC4xbC0xMy43IDBjLS4zIDAtLjUgMC0uOCAuMXMtLjUgLjItLjcgLjQtLjMgLjQtLjQgLjYtLjEgLjUtLjEgLjhsMCA2M2MwIC4zIDAgLjUgLjEgLjhzLjIgLjUgLjQgLjYgLjQgLjMgLjcgLjQgLjUgLjEgLjggLjFsMS4yIDBjLjMgMCAuNSAwIC44LS4xcy41LS4yIC42LS40IC4zLS40IC40LS42IC4xLS41IC4xLS44bDAtMjYuOSAxMS42IDAgMTAuNCAyNy4yYy4yIC41IC41IC45IC45IDEuMXMuOSAuNCAxLjQgLjRsMS41IDBjMS40IDAgMi0xIDEuNS0yLjNsLTEwLjYtMjcuM3ptLTYuNC0zLjlsLTEwLjIgMCAwLTI4LjUgMTAuMiAwYzcuNSAwIDEwLjUgMy4xIDEwLjUgMTEuMWwwIDYuNGMwIDcuOC0zIDExLTEwLjUgMTFsMCAwem04NS45LTMzLjFsLTEzLjcgMGMtLjMtLjEtLjUtLjEtLjggMHMtLjUgLjItLjcgLjQtLjMgLjQtLjQgLjctLjEgLjUtLjEgLjhsMCA2M2MwIC4zIDAgLjUgLjEgLjhzLjIgLjUgLjQgLjYgLjQgLjMgLjcgLjQgLjUgLjEgLjggLjFsMS4yIDBjLjMgMCAuNSAwIC44LS4xcy41LS4yIC42LS40IC4zLS40IC40LS42IC4xLS41IC4xLS44bDAtMjYuMSAxMC42IDBjMTAuMSAwIDE1LjMtNC44IDE1LjMtMTQuMWwwLTEwLjVjMC05LjQtNS4yLTE0LjEtMTUuMy0xNC4xem0xMC4yIDIyLjhjMCA3LjktMyAxMS4xLTEwLjUgMTEuMWwtMTAuMiAwIDAtMjkuMiAxMC4yIDBjNy41LS4xIDEwLjUgMy4xIDEwLjUgMTFsMCA3LjF6TTI1OS42IDMwOGwtMi4zLTYuOC0yLjMgNi44LTcuMSAuMSA1LjcgNC4zLTIuMSA2LjggNS44LTQuMSA1LjggNC4xLTIuMS02LjggNS43LTQuMy03LjEtLjF6TTQ4Ny4yIDE3MS45Yy0xMS43LTQuNC0yMy41LTguMS0zNS42LTExLjMgMTkuNi03OCAxMS42LTEzNC43LTIyLjMtMTUzLjktMzQuNS0xOS40LTg1LjkgNC4zLTEzOC4yIDU1LjIgMy40IDMuMyA2LjggNi43IDEwLjIgMTAuMiA4Mi41LTgwIDExOS42LTUzLjUgMTIwLjktNTIuOCAyMi40IDEyLjcgMzYgNTUuOCAxNS41IDEzNy44LTI3LjgtNi40LTU2LjEtMTAuNy04NC42LTEzLTcxLjktMTAwLjUtMTQwLjYtMTQyLjEtMTgyLjItMTQyLjEtMzAuOCAwLTQzLjggMjEtNDcuNiAyNy43LTE4LjEgMzItMTMuMyA4NC4yIC4xIDEzMy44LTcwLjUgMjAuMy0xMjAuNyA1NC4xLTEyMC4zIDk1IC41IDU5LjYgMTAzLjIgODcuOCAxMjIuMSA5Mi44LTIwLjUgODEuOS0xMC4xIDEzNS42IDIyLjMgMTUzLjkgMjggMTUuOCA3NS4xIDYgMTM4LjItNTUuMi0zLjQtMy4zLTYuOC02LjctMTAuMi0xMC4yLTgyLjUgODAtMTE5LjcgNTMuNS0xMjAuOSA1Mi44LTIyLjMtMTIuNi0zNi01NS42LTE1LjUtMTM3LjkgMTIuNCAyLjkgNDEuOCA5LjUgODQuNiAxMyA3MS45IDEwMC40IDE0MC42IDE0MiAxODIuMSAxNDIgMzAuOCAwIDQzLjgtMjEgNDcuNi0yNy43IDE4LTMxLjkgMTMuMy04NC4xLS4xLTEzMy44IDE1Mi4zLTQzLjggMTU2LjItMTMwLjIgMzMuOS0xNzYuM2wwIDB6TTEzNiAzNi44YzIuOS01LjEgMTEuOS0yMC4zIDM0LjktMjAuMyAzNi44IDAgOTguOCAzOS42IDE2My4zIDEyNi4yLTMxLjMtMS44LTYyLjctMS41LTkzLjkgLjkgMTMtMTguMyAyNy4xLTM1LjggNDIuMi01Mi40LTMuNC0zLjUtNi44LTYuOS0xMC4yLTEwLjItMTguMyAyMC4yLTM1LjMgNDEuNy01MC43IDY0LjItMjguNSAyLjctNTYuNyA3LjYtODQuNCAxNC42LS4yLTEuNC0yNC4zLTgyLjItMS4yLTEyM2wwIDB6TTQ0MC44IDQ3NS4xYy0yLjkgNS4xLTExLjggMjAuMy0zNC45IDIwLjMtMzYuNyAwLTk4LjctMzkuNC0xNjMuMy0xMjYuMiAzMS4zIDEuOCA2Mi43IDEuNSA5My45LS45LTEzIDE4LjMtMjcuMSAzNS44LTQyLjIgNTIuNCAzLjQgMy41IDYuOCA2LjkgMTAuMiAxMC4yIDE4LjQtMjAuMiAzNS4zLTQxLjcgNTAuNy02NC4yIDQ3LjMtNC43IDgwLjMtMTMuNSA4NC40LTE0LjYgMjIuNyA4NC40IDQuNSAxMTcgMS4yIDEyM3ptOS4xLTEzOC42Yy0zLjYtMTEuOS03LjctMjQuMS0xMi40LTM2LjQtMi4xIDAtNC4yLS41LTYuMS0xLjVzLTMuNS0yLjQtNC42LTQuMmwtLjEgLjFjLTEuNiAxLjUtMy40IDIuNy01LjQgMy42IDUuNyAxNC4zIDEwLjYgMjguNCAxNC43IDQyLjItMjMuNyA2LTQ3LjcgMTAuMy03MiAxMyAzLjUtNS4zIDE3LjItMjYuMiAzMi4yLTU0LjItMi4xLS44LTQuMi0xLjktNi0zLjItMS4xIDEuMi0zLjYgNC4yLTEwLjkgNC4yLTYuMiAxMS4yLTE3LjQgMzAuOS0zMy45IDU1LjItMzcuNCAzLjMtNzUgMy42LTExMi40IDEtNy45LTExLjItMjEuNS0zMS4xLTM2LjgtNTcuOC0xLS40LTItLjktMy0xLjUtMS45IDEuNi0zLjkgMy4yLTEyLjYgMy4yIDYuMyAxMS4yIDE3LjUgMzAuNyAzMy44IDU0LjYtMjQuMy0yLjMtNDguNC02LjItNzIuMi0xMS43IDMuOS0xNCA4LjYtMjguMyAxNC4xLTQyLjktMy4yIDAtNS40IC4yLTguNC0xLTIuMiAuOC00LjYgMS4xLTYuOSAxLTQuOSAxMy40LTkuMSAyNi41LTEyLjcgMzkuNC0xNTkuOS00Mi42LTE0MC4zLTEyMy42LTEuNS0xNjQgMy42IDExLjkgNy43IDI0LjEgMTIuNCAzNi40IDEwLjQgMCAxMi45IDMuNCAxNC40IDUuMyAuNy0uOCAxLjQtMS42IDIuMy0yLjItNS44LTE0LjctMTAuOS0yOS4yLTE1LjItNDMuMyA3LTEuOCAzMi40LTguNCA3Mi0xMy0xNS45IDI0LjMtMjYuNyA0My45LTMyLjggNTUuMyAzLjEgMS44IDUuMyA0LjYgNi40IDggMi41LTMuNyA2LjEtNi42IDEwLjItOC40IDYuNS0xMS43IDE3LjktMzEuOSAzNC44LTU2LjkgMzcuNC0zLjMgNzUtMy42IDExMi40LTEgMzEuNSA0NC42IDI4LjkgNDguMSA0Mi41IDY0LjUgMi42LTMuNSA2LjMtNiAxMC40LTcuNC02LjQtMTEuNC0xNy42LTMxLTM0LjMtNTUuNSA0MC40IDQuMSA2NSAxMCA3Mi4yIDExLjctNCAxNC40LTguOSAyOS4yLTE0LjYgNDQuMiAyLjUgMSA0LjggMi40IDYuOCA0LjNsLjEgLjFjMS0xLjUgMi4zLTIuOCAzLjgtMy44czMuMy0xLjYgNS4xLTEuOGM0LjktMTMuNCA5LjItMjYuNiAxMi44LTM5LjUgMTEuNyAzLjEgMjMuMiA2LjggMzQuNSAxMSAxMDYuMSAzOS45IDc0IDg3LjkgNzIuNiA5MC40LTE5LjggMzUuMS04MC4xIDU1LjItMTA1LjcgNjIuNXptLTExNC40LTExNGwtMS4yIDBjLS4zIDAtLjUgMC0uOCAuMXMtLjUgLjItLjYgLjQtLjMgLjQtLjQgLjYtLjEgLjUtLjEgLjhsMCA0OS44YzAgNy45LTIuNiAxMS4xLTEwLjEgMTEuMXMtMTAuMS0zLjEtMTAuMS0xMS4xbDAtNDkuOGMwLS4zIDAtLjUtLjEtLjhzLS4yLS41LS40LS43LS40LS4zLS43LS40LS41LS4xLS44LS4xbC0xLjIgMGMtLjMgMC0uNSAwLS44IC4xcy0uNSAuMi0uNyAuNC0uMyAuNC0uNCAuNi0uMSAuNS0uMSAuOGwwIDUxLjVjMCA5LjYgNSAxNC4xIDE1LjEgMTQuMWwuNCAwYzEwLjEgMCAxNS4xLTQuNiAxNS4xLTE0LjFsMC01MS41YzAtLjMtLjEtLjUtLjItLjhzLS4zLS41LS41LS42LS40LS4zLS43LS40LS41LS4xLS44LS4xek0zMjEuOCAzMDhsLTIuMy02LjgtMi4zIDYuOC03LjEgLjEgNS43IDQuMy0yLjEgNi44IDUuOC00LjEgNS44IDQuMS0yLjEtNi44IDUuNy00LjMtNy4xLS4xem0tMzEuMSA3LjRsLTIuMy02LjgtMi4zIDYuOC03LjEgLjEgNS43IDQuMy0yLjEgNi44IDUuOC00LjEgNS44IDQuMS0yLjEtNi44IDUuNy00LjMtNy4xLS4xem01LjEtMzAuOGwtMTkuNCAwIDAtMjYuNyAxNi4xIDBjLjMgMCAuNSAwIC44LS4xcy41LS4yIC43LS40IC4zLS40IC40LS43IC4xLS41IC4xLS44bDAtLjhjMC0uMyAwLS41LS4xLS44cy0uMi0uNS0uNC0uNy0uNC0uMy0uNy0uNC0uNS0uMS0uOC0uMWwtMTYuMSAwIDAtMjUuOCAxOS4xIDBjLjMgMCAuNSAwIC44LS4xcy41LS4yIC43LS40IC4zLS40IC40LS43IC4xLS41IC4xLS44bDAtLjhjMC0uMyAwLS41LS4xLS44cy0uMi0uNS0uNC0uNy0uNC0uMy0uNy0uNC0uNS0uMS0uOC0uMWwtMjIuMiAwYy0uMyAwLS41IDAtLjggLjFzLS41IC4yLS43IC40LS4zIC40LS40IC42LS4xIC41LS4xIC44bDAgNjNjMCAuMyAwIC41IC4xIC44cy4yIC41IC40IC42IC40IC4zIC43IC40IC41IC4xIC44IC4xbDIyLjUgMGMuMyAwIC41IDAgLjgtLjFzLjUtLjIgLjctLjQgLjMtLjQgLjQtLjcgLjEtLjUgLjEtLjhsMC0uOGMwLS4zIDAtLjYtLjEtLjhzLS4yLS41LS40LS43LS40LS40LS43LS40LS41LS4xLS44LS4xbDAgMHptLTcuNC05OS40bC0yLjMgNi44LTcuMSAuMSA1LjcgNC4zLTIuMSA2LjggNS44LTQuMSA1LjggNC4xLTIuMS02LjggNS43LTQuMy03LjEtLjEtMi4zLTYuOHoiXQogICAgfTsKICAgIGZhV2F6ZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ3YXplIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY4M2YiLCAiTTUwMi42IDIwMS43YzE0LjUgODUuOS0zMC45IDE2Ny45LTExMy4yIDIwOC4xIDEzIDM0LjEtMTIuNCA3MC4yLTQ4LjMgNzAuMi0xMy4yIDAtMjYtNS4xLTM1LjYtMTQuMnMtMTUuMy0yMS42LTE2LTM0LjhjLTYuNCAuMi02NC4yIDAtNzYuMy0uNi0uMyA2LjgtMS45IDEzLjUtNC43IDE5LjZzLTYuOSAxMS43LTExLjkgMTYuMy0xMC44IDguMi0xNy4yIDEwLjUtMTMuMiAzLjQtMTkuOSAzLjFjLTMzLjktMS40LTU4LTM0LjgtNDctNjcuOS0zNy4yLTEzLjEtNzIuNS0zNC45LTk5LjYtNzAuOC0xMy0xNy4zLS41LTQxLjggMjAuOC00MS44IDQ2LjMgMCAzMi4yLTU0LjIgNDMuMi0xMTAuMyAxOC40LTkzLjkgMTE2LjgtMTU3LjEgMjExLjctMTU3LjEgMTAyLjUgMCAxOTcuMiA3MC43IDIxNC4xIDE2OS43ek0zNzMuOSAzODguM2M0Mi0xOS4yIDgxLjMtNTYuNyA5Ni4zLTEwMi4xIDQwLjUtMTIzLjEtNjQuMi0yMjgtMTgxLjctMjI4LTgzLjQgMC0xNzAuMyA1NS40LTE4Ni4xIDEzNi05LjUgNDguOSA1IDEzMS40LTY4LjcgMTMxLjQgMjQuOSAzMy4xIDU4LjMgNTIuNiA5My43IDY0IDI0LjctMjEuOCA2My45LTE1LjUgNzkuOCAxNC4zIDE0LjIgMSA3OS4yIDEuMiA4Ny45IC44IDMuNS02LjkgOC41LTEyLjkgMTQuNy0xNy41czEzLjItNy45IDIwLjgtOS41IDE1LjQtMS40IDIyLjkgLjQgMTQuNSA1LjMgMjAuNSAxMC4yek0yMDUuNSAxODcuMWMwLTM0LjcgNTAuOC0zNC43IDUwLjggMHMtNTAuOCAzNC43LTUwLjggMHptMTE2LjYgMGMwLTM0LjcgNTAuOS0zNC43IDUwLjkgMHMtNTAuOSAzNC44LTUwLjkgMHpNMTk5LjUgMjU3LjhjLTMuNC0xNi45IDIyLjItMjIuMiAyNS42LTUuMmwuMSAuM2M0LjEgMjEuNCAyOS44IDQ0IDY0LjEgNDMuMSAzNS43LS45IDU5LjMtMjIuMiA2NC4xLTQyLjggNC41LTE2LjEgMjguNi0xMC40IDI1LjUgNi01LjIgMjIuMi0zMS4yIDYyLTkxLjUgNjIuOS00Mi42IDAtODAuOS0yNy44LTg3LjktNjQuMmwwIDB6Il0KICAgIH07CiAgICBmYUNyZWF0aXZlQ29tbW9uc1JlbWl4ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNyZWF0aXZlLWNvbW1vbnMtcmVtaXgiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjRlZSIsICJNMjU1LjYgOEMzOTcuNCA4IDUwNCAxMTguMSA1MDQgMjU2IDUwNCA0MDMuMSAzODUuNSA1MDQgMjU1LjYgNTA0IDEyMS42IDUwNCA4IDM5NC41IDggMjU2IDggMTIzLjEgMTEyLjcgOCAyNTUuNiA4em0uOCA0NC43Yy0xMTguMiAwLTIwMy43IDk3LjktMjAzLjcgMjAzLjMgMCAxMDkuOCA5MS4yIDIwMi44IDIwMy43IDIwMi44IDEwMy4yIDAgMjAyLjgtODEuMSAyMDIuOC0yMDIuOCAuMS0xMTMuOC05MC4yLTIwMy4zLTIwMi44LTIwMy4zek00MTguMSAyNjAuNGw0LjkgMi4yIDAgNzBjLTcuMiAzLjYtNjMuNCAyNy41LTY3LjMgMjguOC02LjUtMS44LTExMy43LTQ2LjgtMTM3LjMtNTYuMmwtNjQuMiAyNi42LTYzLjMtMjcuNSAwLTYzLjggNTkuMy0yNC44Yy0uNy0uNy0uNCA1LS40LTcwLjRsNjcuMy0yOS43IDE1MS45IDYyLjkgMCA2MS42IDQ5LjEgMjAuM3ptLTcwLjQgODEuNWwwLTQzLjgtLjQgMCAwLTEuOC0xMTMuOC00Ni41IDAgNDUuMiAxMTMuOCA0Ni45IDAtLjQgLjQgLjR6bTcuNS01Ny42bDM5LjktMTYuNC0zNi44LTE1LjUtMzkgMTYuNCAzNS45IDE1LjV6bTUyLjMgMzguMWwwLTQzLTQ0LjMgMTguNiAwIDQzLjQgNDQuMy0xOXoiXQogICAgfTsKICAgIGZhQmFuZGNhbXAgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYmFuZGNhbXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjJkNSIsICJNMjU2IDhhMjQ4IDI0OCAwIDEgMCAwIDQ5NiAyNDggMjQ4IDAgMSAwIDAtNDk2em00OC4yIDMyNi4xbC0xODEgMCA4NC43LTE1Ni4xIDE4MSAwLTg0LjcgMTU2LjF6Il0KICAgIH07CiAgICBmYVNxdWFyZVdlYkF3ZXNvbWVTdHJva2UgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXdlYi1hd2Vzb21lLXN0cm9rZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNjg0IiwgIk02NCA2NEM0Ni4zIDY0IDMyIDc4LjMgMzIgOTZsMCAzMjBjMCAxNy43IDE0LjMgMzIgMzIgMzJsMzIwIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0zMjBjMC0xNy43LTE0LjMtMzItMzItMzJMNjQgNjR6TTAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMzIwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2em0yMzUgODEuNmw1MyA0Ni40IDUyLjItMTAuNGMtMi42LTMuOS00LjItOC41LTQuMi0xMy42IDAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRjMCAxMy0xMC4zIDIzLjYtMjMuMiAyNEwzMDQuNSAzNDkuMWMtNS4yIDExLjUtMTYuNiAxOC45LTI5LjIgMTguOWwtMTAyLjYgMGMtMTIuNiAwLTI0LTcuNC0yOS4yLTE4LjlMODcuMiAyMjRjLTEyLjktLjQtMjMuMi0xMS0yMy4yLTI0IDAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRjMCA1LTEuNSA5LjctNC4yIDEzLjZMMTYwIDIyNCAyMTMuMSAxNzcuNmMtOC45LTQuMS0xNS0xMy4xLTE1LTIzLjYgMC0xNC40IDExLjYtMjYgMjYtMjZzMjYgMTEuNiAyNiAyNmMwIDEwLjUtNi4yIDE5LjUtMTUuMSAyMy42eiJdCiAgICB9OwogICAgZmFWaW1lb1YgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidmltZW8tdiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMjdkIiwgIk00NDcuOCAxNTMuNmMtMiA0My42LTMyLjQgMTAzLjMtOTEuNCAxNzkuMS02MC45IDc5LjItMTEyLjQgMTE4LjgtMTU0LjYgMTE4LjgtMjYuMSAwLTQ4LjItMjQuMS02Ni4zLTcyLjMtMzUuMi0xMjkuMi01MC4yLTIwNC45LTc5LjMtMjA0LjktMy40IDAtMTUuMSA3LjEtMzUuMiAyMS4xTDAgMTY4LjJjNTEuNi00NS4zIDEwMC45LTk1LjcgMTMxLjgtOTguNSAzNC45LTMuNCA1Ni4zIDIwLjUgNjQuNCA3MS41IDI4LjcgMTgxLjUgNDEuNCAyMDguOSA5My42IDEyNi43IDE4LjctMjkuNiAyOC44LTUyLjEgMzAuMi02Ny42IDQuOC00NS45LTM1LjgtNDIuOC02My4zLTMxIDIyLTcyLjEgNjQuMS0xMDcuMSAxMjYuMi0xMDUuMSA0NS44IDEuMiA2Ny41IDMxLjEgNjQuOSA4OS40eiJdCiAgICB9OwogICAgZmFTdHJhdmEgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3RyYXZhIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY0MjgiLCAiTTE1OC40IDBMNyAyOTIgOTYuMiAyOTIgMTU4LjQgMTc1LjkgMjIwLjEgMjkyIDMwOC42IDI5MiAxNTguNCAwek0zMDguNiAyOTJsLTQzLjkgODguMi00NC42LTg4LjItNjcuNiAwIDExMi4yIDIyMCAxMTEuNS0yMjAtNjcuNiAweiJdCiAgICB9OwogICAgZmFVbmlyZWdpc3RyeSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ1bmlyZWdpc3RyeSIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmNDA0IiwgIk0xOTIgNDgwYzM5LjUgMCA3Ni4yLTExLjggMTA2LjgtMzIuMmwtMjEzLjUgMEMxMTUuOCA0NjguMiAxNTIuNSA0ODAgMTkyIDQ4MHpNMTAyLjkgMjg2LjlsMC0xMi40LTEwMi45IDAgMCAxMi40YzAgMi41IDAgNSAuMSA3LjRsMTAzLjEgMGMtLjItMi40LS4zLTQuOS0uMy03LjR6bTIwLjUgNTdsLTExNC45IDBjMi42IDguNSA1LjggMTYuOCA5LjYgMjQuOGwxMzguMyAwYy0xMi45LTUuNy0yNC4xLTE0LjItMzMtMjQuOHptLTE3LjctMzQuN2wtMTA0LjQgMGMuOSA3LjYgMi4yIDE1IDMuOSAyMi4zbDEwOS43IDBjLTQtNi45LTcuMi0xNC40LTkuMi0yMi4zem0tMi44LTY5LjNsLTEwMi45IDAgMCAxNy4zIDEwMi45IDAgMC0xNy4zem0wLTE3My4ybC0xMDIuOSAwIDAgNC45IDEwMi45IDAgMC00Ljl6bTAtMzQuN2wtMTAyLjkgMCAwIDIuNSAxMDIuOSAwIDAtMi41em0wIDY5LjNsLTEwMi45IDAgMCA3LjQgMTAyLjkgMCAwLTcuNHptMCAxMDRsLTEwMi45IDAgMCAxNC44IDEwMi45IDAgMC0xNC44em0wLTY5LjNsLTEwMi45IDAgMCA5LjkgMTAyLjkgMCAwLTkuOXptMCAzNC42bC0xMDIuOSAwIDAgMTIuNCAxMDIuOSAwIDAtMTIuNHpNMjY5LjEgMzMxLjVsMTA5LjcgMGMxLjgtNy4zIDMuMS0xNC43IDMuOS0yMi4zbC0xMDQuNCAwYy0yLjEgNy45LTUuMiAxNS40LTkuMiAyMi4zem0xMi0xODUuN2wxMDIuOSAwIDAtOS44LTEwMi45IDAgMCA5Ljh6bTAgMzcuMmwxMDIuOSAwIDAtMTIuNC0xMDIuOSAwIDAgMTIuNHptMC03NC4zbDEwMi45IDAgMC03LjQtMTAyLjkgMCAwIDcuNHptMC03Ni43bDAgMi41IDEwMi45IDAgMC0yLjUtMTAyLjkgMHpNNzguMSA0NDIuOWwyMjcuNyAwYzExLjgtOC43IDIyLjctMTguNiAzMi4yLTI5LjdsLTI5My4xIDBjOS42IDExIDIxLjQgMjEgMzMuMiAyOS43em0yMDMtMzcxLjNsMTAyLjkgMCAwLTQuOS0xMDIuOSAwIDAgNC45em0wIDE0OC41bDEwMi45IDAgMC0xNC44LTEwMi45IDAgMCAxNC44ek0zOC44IDQwNS43bDMwNS4zIDBjNi43LTguNSAxMi42LTE3LjYgMTcuOC0yNy4yTDIzIDM3OC41YzUuMiA5LjYgOS4yIDE4LjcgMTUuOCAyNy4yem0xODguOC0zNy4xbDEzOS40IDBjMy43LTggNS44LTE2LjIgOC41LTI0LjhsLTExNSAwYy04LjggMTAuNy0yMC4xIDE5LjItMzIuOSAyNC44em01My41LTgxLjdjMCAyLjUtLjEgNS0uNCA3LjRsMTAzLjEgMGMuMS0yLjUgLjItNC45IC4yLTcuNGwwLTEyLjQtMTAyLjkgMCAwIDEyLjR6bTAtMjkuN2wxMDIuOSAwIDAtMTcuMy0xMDIuOSAwIDAgMTcuM3oiXQogICAgfTsKICAgIGZhQ2NEaW5lcnNDbHViID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNjLWRpbmVycy1jbHViIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYyNGMiLCAiTTIzOS43IDc5LjlhMTc1LjggMTc1LjggMCAxIDAgMCAzNTEuNiAxNzUuOCAxNzUuOCAwIDEgMCAwLTM1MS42ek0xOTkuOCAzNTkuNWMtNDEuNy0xNS45LTcxLjQtNTYuNC03MS40LTEwMy44czI5LjctODcuOSA3MS40LTEwNC4xbDAgMjA3Ljl6bTc5LjggLjNsMC0yMDguMmM0MS43IDE2LjIgNzEuNCA1Ni43IDcxLjQgMTA0LjFzLTI5LjcgODcuOS03MS40IDEwNC4xek01MjggMzJMNDggMzJDMjEuNSAzMiAwIDUzLjUgMCA4MEwwIDQzMmMwIDI2LjUgMjEuNSA0OCA0OCA0OGw0ODAgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTM1MmMwLTI2LjUtMjEuNS00OC00OC00OHpNMzI5LjcgNDQ4bC05MC4zIDBDMTMzLjIgNDQ4IDQ1LjYgMzYyLjUgNDUuNiAyNTcuOCA0NS42IDE0My4yIDEzMy4yIDY0IDIzOS40IDY0bDkwLjMgMGMxMDUgMCAyMDAuNyA3OS4yIDIwMC43IDE5My44IDAgMTA0LjctOTUuNyAxOTAuMi0yMDAuNyAxOTAuMnoiXQogICAgfTsKICAgIGZhUGludGVyZXN0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInBpbnRlcmVzdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMGQyIiwgIk01MDQgMjU2YzAgMTM3LTExMSAyNDgtMjQ4IDI0OC0yNS42IDAtNTAuMi0zLjktNzMuNC0xMS4xIDEwLjEtMTYuNSAyNS4yLTQzLjUgMzAuOC02NSAzLTExLjYgMTUuNC01OSAxNS40LTU5IDguMSAxNS40IDMxLjcgMjguNSA1Ni44IDI4LjUgNzQuOCAwIDEyOC43LTY4LjggMTI4LjctMTU0LjMgMC04MS45LTY2LjktMTQzLjItMTUyLjktMTQzLjItMTA3IDAtMTYzLjkgNzEuOC0xNjMuOSAxNTAuMSAwIDM2LjQgMTkuNCA4MS43IDUwLjMgOTYuMSA0LjcgMi4yIDcuMiAxLjIgOC4zLTMuMyAuOC0zLjQgNS0yMC4zIDYuOS0yOC4xIC42LTIuNSAuMy00LjctMS43LTcuMS0xMC4xLTEyLjUtMTguMy0zNS4zLTE4LjMtNTYuNiAwLTU0LjcgNDEuNC0xMDcuNiAxMTItMTA3LjYgNjAuOSAwIDEwMy42IDQxLjUgMTAzLjYgMTAwLjkgMCA2Ny4xLTMzLjkgMTEzLjYtNzggMTEzLjYtMjQuMyAwLTQyLjYtMjAuMS0zNi43LTQ0LjggNy0yOS41IDIwLjUtNjEuMyAyMC41LTgyLjYgMC0xOS0xMC4yLTM0LjktMzEuNC0zNC45LTI0LjkgMC00NC45IDI1LjctNDQuOSA2MC4yIDAgMjIgNy40IDM2LjggNy40IDM2LjhzLTI0LjUgMTAzLjgtMjkgMTIzLjJDMTYxLjUgNDM3LjIgMTYzLjUgNDY3LjQgMTY1LjYgNDg3IDczLjQgNDUwLjkgOCAzNjEuMSA4IDI1NiA4IDExOSAxMTkgOCAyNTYgOFM1MDQgMTE5IDUwNCAyNTZ6Il0KICAgIH07CiAgICBmYUFsZ29saWEgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYWxnb2xpYSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMzZjIiwgIk0yNTYgMGMtMTM5LjkgMC0yNTQgMTEyLjctMjU2IDI1Mi4xLTIgMTQxLjUgMTEyLjkgMjU4LjcgMjU0LjUgMjU5LjUgNDMuNyAuMyA4NS45LTEwLjQgMTIzLjMtMzAuNyAzLjYtMiA0LjItNyAxLjEtOS43bC0yNC0yMS4yYy00LjktNC4zLTExLjgtNS41LTE3LjgtMy0yNi4xIDExLjEtNTQuNSAxNi44LTgzLjcgMTYuNC0xMTQuNC0xLjUtMjA2LjktOTYuNi0yMDUuMS0yMTEgMS44LTExMi45IDk0LjMtMjA0LjIgMjA3LjctMjA0LjJsMjA3LjcgMCAwIDM2OS0xMTcuOC0xMDQuN2MtMy44LTMuNC05LjctMi43LTEyLjcgMS4zLTE4LjkgMjUtNDkuNyA0MC42LTgzLjkgMzguMi00Ny41LTMuMy04NS45LTQxLjUtODkuNS04OC45LTQuMi01Ni42IDQwLjYtMTAzLjkgOTYuMy0xMDMuOSA1MC40IDAgOTEuOSAzOC44IDk2LjIgODggLjQgNC40IDIuNCA4LjUgNS43IDExLjRsMzAuNyAyNy4yYzMuNSAzLjEgOSAxLjIgOS45LTMuNCAyLjItMTEuOCAzLTI0LjIgMi4xLTM2LjgtNC45LTcyLTYzLjMtMTMwLTEzNS40LTEzNC40LTgyLjctNS4xLTE1MS44IDU5LjUtMTU0IDE0MC42LTIuMSA3OC45IDYyLjYgMTQ3IDE0MS42IDE0OC43IDMzIC43IDYzLjYtOS42IDg4LjMtMjcuNkw0OTUgNTA5LjRjNi42IDUuOCAxNyAxLjIgMTctNy43bDAtNDkyYzAtNS40LTQuNC05LjctOS43LTkuN0wyNTYgMHoiXQogICAgfTsKICAgIGZhU3RhY2twYXRoID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInN0YWNrcGF0aCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmODQyIiwgIk0yNDQuNiAyMzIuNGMwIDguNS00LjMgMjAuNS0yMS4zIDIwLjVsLTE5LjYgMCAwLTQxLjUgMTkuNiAwYzE3LjEgMCAyMS4zIDEyLjQgMjEuMyAyMXpNNDQ4IDMybDAgNDQ4LTQ0OCAwIDAtNDQ4IDQ0OCAwek0xNTEuMyAyODcuOGMwLTIxLjItMTIuMS0zNC41LTQ2LjctNDQuOC0yMC42LTcuNC0yNi0xMC45LTI2LTE4LjZzNy0xNC42IDIwLjQtMTQuNmMxNC4xIDAgMjAuOCA4LjQgMjAuOCAxOC40bDMwLjcgMCAuMi0uNmMuNS0xOS42LTE1LjEtNDEuNi01MS4xLTQxLjYtMjMuNCAwLTUyLjYgMTAuOC01Mi42IDM4LjMgMCAxOS40IDkuMiAzMS4zIDUwLjcgNDQuNCAxNy4zIDYuMiAyMS45IDEwLjQgMjEuOSAxOS41IDAgMTUuMi0xOS4xIDE0LjItMTkuNSAxNC4yLTIwLjQgMC0yNS43LTkuMS0yNS43LTIxLjlsLTMwLjggMC0uMiAuNmMtLjcgMzEuMyAyOC40IDQ1LjIgNTYuNiA0NS4yIDMwIDAgNTEuMS0xMy42IDUxLjEtMzguM3ptMTI1LjQtNTUuNmMwLTI1LjMtMTguNC00NS41LTUzLjQtNDUuNWwtNTEuOCAwIDAgMTM4LjIgMzIuMiAwIDAtNDcuNCAxOS42IDBjMzAuMyAwIDUzLjQtMTYgNTMuNC00NS40ek0yOTcuOSAzMjVsNDkuMS0xMzguMi0zMS4xIDAtNDcuOSAxMzguMiAyOS45IDB6TTQwNC41IDE4Ni44bC0zMS4xIDAtNDcuOSAxMzguMiAyOS45IDAgNDkuMS0xMzguMnoiXQogICAgfTsKICAgIGZhT2N0b3B1c0RlcGxveSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJvY3RvcHVzLWRlcGxveSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMDgyIiwgIk00NTUuNyAzNDkuMmMtNDUuOS0zOS4xLTM2LjctNzcuOS0xNi4xLTEyOC4xIDM1LjctODctMjMuNS0xODYuOS0xMDkuNi0yMTIuOC05Mi45LTI3LjktMTk1LjcgMTYtMjMwLjMgMTA4LjgtOC43IDIzLjUtMTIuNSA0OC41LTExIDczLjUgMS43IDI5LjUgMTQuNyA1MyAyNC4xIDgwLjMgMTcuMiA1MC4yLTI4LjEgOTIuNy02Ni43IDExNy42LTQ2LjggMzAuMi0zNi4zIDM5LjktOC40IDQxLjkgMjMuNCAxLjcgNDQuNS00LjUgNjUuMy0xNSA5LjItNC42IDQwLjctMTguOSA0NS4xLTI4LjYtMTIuMiAyNi42LTM3IDcyLjctMjEuNSAxMDIuMSAxOS4xIDM2LjIgNjcuMS0zMS44IDc2LjctNDUuOCA4LjYtMTIuNiA0My04MS4zIDYzLjYtNDYuOSAxOC45IDMxLjQgOC42IDc2LjQgMzUuNyAxMDQuNiAzMi45IDM0LjIgNTEuMi0xOC4zIDUxLjQtNDQuMiAuMi0xNi40LTYuMS05NS45IDI5LjktNTkuOSAyMS40IDIxLjQgNTIuOSA3MS4yIDg4LjYgNjcgMzguNy00LjUtMjIuMS02OC0yOC4zLTc4LjcgNS40IDQuMyA1My43IDM0LjEgNTMuOCA5LjUgLjEtMTguOC0zMC4xLTM0LjctNDIuNS00NS4zeiJdCiAgICB9OwogICAgZmFZYW1tZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAieWFtbWVyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY4NDAiLCAiTTUwMC43IDE1OS41Yy0uNC0xLjgtMS4yLTMuNC0yLjMtNC44cy0yLjUtMi42LTQuMS0zLjVjLTMuMS0xLjYtNi43LTItMTAuMS0xLjFsLTI2LjQgNi42IDAtLjItMjIuMyA1LjgtMS4yIC4zLS42LTIuMmMtMTUuNS01OC4zLTQ1LTExMS45LTg2LjEtMTU2LjItMi42LTIuNy02LjEtNC4yLTkuOC00LjNzLTcuMyAxLjMtMTAgMy44bC0xMDIuOSAxMDIuNy0xOTkuOSAwYy02LjYgMC0xMi45IDIuNi0xNy42IDcuM1MwIDEyNC44IDAgMTMxLjRsMCAyNDlDMCAzODcgMi42IDM5My4zIDcuMyAzOThzMTEgNy4zIDE3LjYgNy4zTDIyNSA0MDUuMyAzMjguMSA1MDhjMi42IDIuNiA2IDQgOS43IDRzNy4xLTEuNCA5LjctNGMuMS0uMSAuMi0uMyAuNC0uNCAyOS4zLTMxLjUgNTIuOC02Ny44IDY5LjYtMTA3LjQgNi45LTE2LjUgMTIuNy0zMy41IDE3LjMtNTAuOGwwIDAgMjAuNCA1LjMgMC0uMSAyOC4zIDcuM2MuOSAuMiAxLjcgLjQgMi42IC41IDEuNCAuMiAyLjggLjIgNC4xLS4xIDIuNS0uNSA0LjgtMS43IDYuNy0zLjRzMy4yLTQgMy44LTYuNWMxNS4yLTYzLjQgMTUuMi0xMjkuNiAuMS0xOTNsMCAwek0zMzcuMSAyNC43bDAgMCAwIDAgMCAwek0yMjYuOSAxODkuOGwtNTIuNiA5MS4zYy0xIDEuNy0xLjUgMy43LTEuNSA1LjdsMCA0Ni4yYzAgNS44LTIuMyAxMS40LTYuNSAxNS42cy05LjcgNi40LTE1LjYgNi40bC0zLjQgMGMtNS44IDAtMTEuNC0yLjMtMTUuNi02LjRzLTYuNS05LjctNi41LTE1LjZsMC00NS43YzAtMS45LS41LTMuOC0xLjQtNS41TDcyLjMgMTg5LjZjLTEuOS0zLjQtMi44LTcuMS0yLjgtMTFzMS4xLTcuNiAzLTEwLjkgNC43LTYuMSA4LjEtOCA3LjEtMi45IDExLTIuOWwzLjMgMGM0IDAgOCAxLjEgMTEuNSAzLjJzNi4zIDUuMSA4LjEgOC43bDM2LjQgNzAuMyAzNy41LTcwLjVjMS44LTMuNSA0LjYtNi40IDcuOS04LjRzNy4yLTMuMiAxMS4xLTMuMiA3LjggLjkgMTEuMiAyLjggNi4zIDQuNyA4LjIgOC4xYzIgMy4zIDMgNy4xIDMgMTFzLTEgNy43LTMgMTFsMCAwek0zMzcuMSAyNC43YzM1LjkgNDAuNiA2MS45IDg5IDc1LjggMTQxLjNsLjYgMi0xMTQuMSAyOS42IDAtNjYuMWMwLTYuNi0yLjctMTIuOS03LjMtMTcuNnMtMTEtNy4zLTE3LjYtNy4zbC0xOS40IDAgODIuMS04MS44ek0zOTcuNiAzOTJsMCAwIDAgMGMtMTQuNyAzNC44LTM1LjEgNjctNjAuMiA5NS4ybC04Mi4yLTgxLjkgMTkuMiAwYzYuNiAwIDEyLjktMi42IDE3LjYtNy4zczcuMy0xMSA3LjMtMTcuNmwwLTY2LjIgMTE0LjYgMjkuOWMtNC40IDE2LjMtOS44IDMyLjMtMTYuMyA0Ny45bDAgMHptODQtNTIuNGwwIDAtNTAuNi0xMy4xLTEzMS43LTM0LjMgMC03Mi41IDExOS43LTMxIDQuNS0xLjJjMjkuOS03LjcgNDkuMi0xMi44IDU4LjEtMTUuMSAxMiA1NS4xIDEyIDExMi4xIDAgMTY3LjJ6Il0KICAgIH07CiAgICBmYU1vZHggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibW9keCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMjg1IiwgIk0zNTYgMjQxLjhsMzYuNyAyMy43IDAgMjE0LjUtMTMzLTgzLjggOTYuMy0xNTQuNHpNNDQwIDc1bC0yMTMuNyAwLTIzIDM3LjggMTUzLjUgOTYuNSA4My4yLTEzNC4zek0zNTEgMjE3LjhsLTI5NS44LTE4NS44IDAgMjE0LjUgNDYgMjkgMjQ5LjgtNTcuN3pNOTcgMjk0LjJMOCA0MzcgMjIxLjcgNDM3IDM0Ni43IDIzNi41IDk3IDI5NC4yeiJdCiAgICB9OwogICAgZmFTcXVhcmVUaHJlYWRzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS10aHJlYWRzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU2MTkiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6TTI5NC4yIDI0NC4zYzE5LjUgOS4zIDMzLjcgMjMuNSA0MS4yIDQwLjkgMTAuNCAyNC4zIDExLjQgNjMuOS0yMC4yIDk1LjQtMjQuMiAyNC4xLTUzLjUgMzUtOTUuMSAzNS4zbC0uMiAwYy00Ni44LS4zLTgyLjgtMTYuMS0xMDYuOS00Ni44LTIxLjUtMjcuMy0zMi42LTY1LjQtMzMtMTEzLjFsMC0uMmMuNC00Ny43IDExLjUtODUuNyAzMy0xMTMuMSAyNC4yLTMwLjcgNjAuMi00Ni41IDEwNi45LTQ2LjhsLjIgMGM0Ni45IC4zIDgzLjMgMTYgMTA4LjIgNDYuNiAxMi4zIDE1LjEgMjEuMyAzMy4zIDI3IDU0LjRsLTI2LjkgNy4yYy00LjctMTcuMi0xMS45LTMxLjktMjEuNC00My42LTE5LjQtMjMuOS00OC43LTM2LjEtODctMzYuNC0zOCAuMy02Ni44IDEyLjUtODUuNSAzNi4yLTE3LjUgMjIuMy0yNi42IDU0LjQtMjYuOSA5NS41IC4zIDQxLjEgOS40IDczLjMgMjYuOSA5NS41IDE4LjcgMjMuOCA0Ny40IDM2IDg1LjUgMzYuMiAzNC4zLS4zIDU2LjktOC40IDc1LjgtMjcuMyAyMS41LTIxLjUgMjEuMS00Ny45IDE0LjItNjQtNC05LjQtMTEuNC0xNy4zLTIxLjMtMjMuMy0yLjQgMTgtNy45IDMyLjItMTYuNSA0My4yLTExLjQgMTQuNS0yNy43IDIyLjQtNDguNCAyMy41LTE1LjcgLjktMzAuOC0yLjktNDIuNi0xMC43LTEzLjktOS4yLTIyLTIzLjItMjIuOS0zOS41LTEuNy0zMi4yIDIzLjgtNTUuMyA2My41LTU3LjYgMTQuMS0uOCAyNy4zLS4yIDM5LjUgMS45LTEuNi05LjktNC45LTE3LjctOS44LTIzLjQtNi43LTcuOC0xNy4xLTExLjgtMzAuOC0xMS45bC0uNCAwYy0xMSAwLTI2IDMuMS0zNS42IDE3LjZsLTIzLTE1LjhjMTIuOC0xOS40IDMzLjYtMzAuMSA1OC41LTMwLjFsLjYgMGM0MS44IC4zIDY2LjYgMjYuMyA2OS4xIDcxLjggMS40IC42IDIuOCAxLjIgNC4yIDEuOWwuMSAuNXptLTcxLjggNjcuNWMxNy0uOSAzNi40LTcuNiAzOS43LTQ4LjgtOC44LTEuOS0xOC42LTIuOS0yOS0yLjktMy4yIDAtNi40IC4xLTkuNiAuMy0yOC42IDEuNi0zOC4xIDE1LjUtMzcuNCAyNy45IC45IDE2LjcgMTkgMjQuNSAzNi40IDIzLjZsLS4xLS4xeiJdCiAgICB9OwogICAgZmFPbGRSZXB1YmxpYyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJvbGQtcmVwdWJsaWMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjUxMCIsICJNMjQzLjggMTAuMmM3LjUtLjMgMTUtLjMgMjIuNS0uMSAzLjYgLjEgNy4yIC40IDEwLjggLjcgNC45IC4zIDkuOCAxIDE0LjcgMS42IDIuOSAuNCA1LjggMSA4LjcgMS41IDcuOSAxLjMgMTUuNyAzLjMgMjMuNCA1LjQgMTIuMiAzLjUgMjQuMiA3LjkgMzUuOCAxMy4yIDI2LjYgMTIuMiA1MC45IDI5LjIgNzEuNiA0OS45IDIwIDIwLjEgMzYuNyA0My41IDQ4LjkgNjkuMiAxLjEgMi42IDIuNCA1LjEgMy41IDcuNyAyLjggNi40IDUuNCAxMyA3LjYgMTkuNiA0LjEgMTIuMyA3LjMgMjUgOS40IDM3LjggLjYgMy4xIDEgNi4zIDEuNCA5LjUgLjUgMy44IC45IDcuNyAxLjIgMTEuNiAuOCA4LjMgLjggMTYuNyAuOCAyNS4xLS4xIDUtLjMgOS45LS43IDE0LjktLjIgMy40LS41IDYuOC0xIDEwLjEtLjQgMi43LS42IDUuNS0xLjEgOC4yLS45IDUuMS0xLjcgMTAuMy0yLjkgMTUuNC00LjEgMTguNS0xMC4zIDM2LjYtMTguNSA1My42LTE1LjggMzIuOC0zOC44IDYyLjItNjcuMSA4NS4xLTE3LjMgMTQuMS0zNi40IDI1LjktNTYuOSAzNC45LTYuMiAyLjctMTIuNSA1LjMtMTguOSA3LjQtMy41IDEuMi03IDIuNC0xMC42IDMuNC02LjYgMS45LTEzLjMgMy42LTIwIDUtNC43IC45LTkuMyAxLjctMTQgMi41LTUuMyAuNy0xMC41IDEuNC0xNS44IDEuNy02LjcgLjctMTMuNCAuOC0yMC4xIC44LTYuOCAwLTEzLjYtLjEtMjAuNC0uOC0zLjMtLjItNi42LS41LTkuOC0xLTIuNy0uNC01LjUtLjYtOC4yLTEuMS00LjEtLjctOC4yLTEuNC0xMi40LTIuMi00LjItLjktOC41LTEuOS0xMi43LTMtOC42LTIuMi0xNy4xLTUtMjUuNC04LjEtMTAuNS00LjEtMjAuOC04LjctMzAuNi0xNC4yLTIuMS0xLjItNC4zLTIuMy02LjQtMy42LTExLjItNi42LTIxLjktMTQuMS0zMS45LTIyLjMtMzQuNy0yOC40LTYxLjQtNjYuNC03Ni40LTEwOC43LTMuMS04LjctNS43LTE3LjYtNy44LTI2LjctMS41LTYuMi0yLjUtMTIuNC0zLjYtMTguNy0uNC0yLjMtLjYtNC43LTEtNy4xLS42LTQtLjgtOC0xLjItMTEuOS0uOC05LjUtLjctMTktLjUtMjguNSAuMS0zLjUgLjMtNyAuNy0xMC41IC4zLTMuMiAuNS02LjQgLjktOS41IC40LTIuOCAuNy01LjYgMS4yLTguNCAuNy0zLjkgMS4zLTcuOSAyLjEtMTEuOCAzLjQtMTYuNSA4LjUtMzIuNyAxNS4zLTQ4LjIgMS4yLTIuOSAyLjYtNS43IDMuOS04LjYgOC4xLTE2LjcgMTcuOS0zMi42IDI5LjUtNDcuMSAyMC0yNS40IDQ1LjEtNDYuNyA3My4zLTYyLjUgNy41LTQuMiAxNS4yLTggMjMuMS0xMS40IDE1LjgtNi45IDMyLjQtMTIgNDkuMy0xNS40IDMuNS0uNyA3LTEuMiAxMC42LTEuOCAyLjYtLjUgNS4zLS43IDcuOS0xLjEgMy41LS41IDcuMS0uNyAxMC42LTEgMi41LS4yIDQuOS0uNCA3LjQtLjV6bTguNiAyNC40Yy05LjIgLjEtMTguNCAxLTI3LjYgMi4yLTcuMyAxLjEtMTQuNSAyLjYtMjEuNyA0LjMtMTMuOSAzLjUtMjcuNSA4LjMtNDAuNSAxNC40LTEwLjUgNS0yMC42IDEwLjctMzAuMiAxNy4yLTQuMiAyLjktOC40IDUuOC0xMi4zIDktNS4xIDQtMTAgOC4yLTE0LjcgMTIuNi0yLjUgMi4yLTQuOCA0LjctNy4yIDcuMS0yOC4yIDI4LjgtNDguNCA2NS40LTU3LjUgMTA0LjctMiA4LjQtMy41IDE3LTQuNCAyNS42LTEuMSA4LjktMS40IDE3LjktMS40IDI2LjggLjEgNy4xIC40IDE0LjMgMS4yIDIxLjQgLjYgNy4xIDEuOSAxNC4yIDMuMiAyMS4yIDEuMSA0LjYgMiA5LjMgMy4zIDEzLjkgNi4zIDIzLjQgMTYuNSA0NS43IDMwLjEgNjUuOCA4LjYgMTMgMTguOCAyNC45IDMwIDM1LjggMTYuMyAxNS44IDM1IDI5IDU1LjMgMzkuMiA3LjMgMy41IDE0LjcgNi45IDIyLjMgOS42IDUgMS44IDEwLjEgMy42IDE1LjIgNSAxMS4zIDMuMiAyMi44IDUuNiAzNC40IDcuMSAyLjkgLjMgNS44IC42IDguNyAuOSAxMy44IDEuMSAyNy43IDEgNDEuNS0uNCA0LjQtLjYgOC45LTEgMTMuMy0xLjggMy42LS43IDcuMy0xLjIgMTAuOS0yLjEgNC4xLTEgOC4zLTEuOSAxMi40LTMuMSAyNi41LTcuMyA1MS42LTE5LjcgNzMuNi0zNi4yIDE1LjgtMTEuOCAzMC0yNS44IDQyLjEtNDEuMyAzLjMtNCA2LjItOC4zIDkuMS0xMi42IDMuNC01LjEgNi42LTEwLjIgOS42LTE1LjUgMi40LTQuNCA0LjctOC45IDctMTMuNCA1LjctMTIuMSAxMC4zLTI0LjYgMTMuOC0zNy41IDIuNi0xMCA0LjctMjAuMiA1LjktMzAuNCAxLjgtMTMuNSAxLjktMjcuMSAxLjMtNDAuNy0uMy0zLjktLjctNy44LTEtMTEuNy0yLjItMTkuMS02LjgtMzcuOS0xMy44LTU1LjgtNi0xNS4xLTEzLjUtMjkuNi0yMi42LTQzLjEtMTIuNy0xOC44LTI4LjItMzUuNy00Ni00OS44LTI1LTIwLTU0LjUtMzQuNS04NS42LTQyLjEtNy44LTEuOS0xNS43LTMuMy0yMy42LTQuNC0zLjktLjYtNy44LS44LTExLjgtMS4yLTcuNC0uNi0xNC44LS43LTIyLjItLjZ6TTE0Ny4zIDgzLjVjMTMuMy04LjkgMjguMS0xNS40IDQzLjMtMjAuMi0zLjIgMS44LTYuNCAzLjQtOS41IDUuMy0xMS4yIDYuNy0yMS41IDE0LjktMzAuNCAyNC41LTYuOCA3LjQtMTIuOCAxNS43LTE3IDI0LjktMy4zIDYuOS01LjYgMTQuMi02LjkgMjEuNy0uOSA0LjgtMS4zIDkuOC0xLjIgMTQuOCAuMSAxMy43IDQuNCAyNy4xIDExLjMgMzguOCA1LjkgMTAuMiAxMy42IDE5LjMgMjIuNCAyNy4zIDQuOSA0LjQgMTAuMiA4LjEgMTUgMTIuNiAyLjMgMi4yIDQuNSA0LjQgNi40IDYuOSAyLjYgMy4zIDQuOSA3IDYgMTEuMSAuOSAzIC43IDYuMiAuNyA5LjMgMCA0LjEgMCA4LjIgMCAxMi4zIC4xIDMuNSAwIDcuMSAuMSAxMC42IC4xIDIuNCAwIDQuOCAuMSA3LjEgLjIgNS44IC4xIDExLjUgLjEgMTcuMyAuMSAyLjkgMCA1LjggLjEgOC43IDAgMS42IC4xIDMuMyAwIDQuOS0uOSAuMS0xLjggLjItMi43IC4yLTExIDAtMjEuOS0yLjYtMzItNi45LTYtMi43LTExLjgtNS45LTE3LjEtOS44LTUuOC00LjItMTEuMS05LTE1LjgtMTQuMy02LjUtNy4yLTEyLTE1LjQtMTYuNi0yMy45LTEuMS0yLTIuMi00LTMuMi02LjEtMS4yLTIuNi0yLjYtNS4xLTMuNy03LjgtNC05LjctNi42LTE5LjktOC4xLTMwLjMtLjUtNC40LTEuMS04LjktMS4yLTEzLjMtLjctMTUuNyAuOC0zMS42IDQuNy00Ni44IDIuMS04LjIgNC44LTE2LjIgOC4zLTIzLjggNi4zLTE0LjIgMTUuMy0yNy4yIDI2LjMtMzguMiA2LjMtNi4yIDEzLjEtMTEuOCAyMC41LTE2Ljd6TTMyMi43IDYzLjRjMi43IC43IDUuNCAxLjcgOC4xIDIuNyA2LjQgMi4zIDEyLjcgNC44IDE4LjcgOCAxMy4xIDYuNCAyNS4zIDE0LjggMzUuOCAyNSAxMC4yIDEwIDE4LjcgMjEuNiAyNS4xIDM0LjMgMS4zIDIuNyAyLjYgNS41IDMuOCA4LjMgNi4zIDE1LjEgMTAgMzEuMyAxMS4yIDQ3LjYgLjQgNC41IC40IDkuMSAuNSAxMy42IC4xIDExLjYtMS41IDIzLjMtNC4zIDM0LjUtMiA3LjMtNC4zIDE0LjUtNy45IDIxLjItMy4yIDYuNi02LjcgMTMuMi0xMC44IDE5LjItNi45IDEwLjUtMTUuNiAxOS45LTI1LjggMjcuMi0xMC41IDcuNi0yMi42IDEzLTM1LjQgMTUuNC0zLjUgLjctNy4xIDEuMS0xMC43IDEuMi0xLjggLjEtMy43IC4yLTUuNi0uMS0uMy0yLjEgMC00LjMgMC02LjUgMC0zLjcgLjEtNy40IC4xLTExLjIgLjItNyAwLTE0LjEgLjItMjEuMSAwLTIuNCAwLTQuOCAwLTcuMSAuMi01LjEgMC0xMC4xIC4xLTE1LjIgLjEtMy0uMi02IC41LTkgLjctMi41IDEuOC00LjkgMy4xLTcuMSA0LjUtNy4zIDExLjEtMTMgMTcuNy0xOC4zIDUuNC00LjIgMTAuNS04LjggMTUtMTMuOCA3LjctOC40IDE0LjItMTcuOSAxOC44LTI4LjMgMi41LTUuOSA0LjUtMTIuMSA1LjUtMTguNSAuOS00LjQgMS4xLTguOCAxLTEzLjMgMC03LjgtMS40LTE1LjYtMy42LTIzLjItMS44LTUuNy00LjMtMTEuMi03LjEtMTYuNC0zLjktNi45LTguNi0xMy4zLTE0LTE5LjItOS45LTEwLjgtMjEuOC0xOS45LTM0LjYtMjcuMS0xLjgtMS0zLjgtMS44LTUuNi0zek0yMjEuOSAxMjEuOWMxLTEuMiAyLTIuMyAzLjEtMy40LS42IC45LTEuMyAxLjgtMiAyLjctMy4xIDMuOS01LjUgOC4zLTcgMTMuMS0uOSAzLjMtMS43IDYuNi0xLjcgMTAtLjEgMi41LS4xIDUuMSAuMyA3LjYgMS4xIDcuNiA0LjMgMTQuOSA4LjggMjEuMSAyIDIuNyA0LjIgNS4zIDYuOSA3LjMgMS42IDEuMyAzLjUgMi4xIDUuMyAzIDMuMSAxLjcgNi4zIDMuMiA5LjEgNS41IDIuNyAyLjEgNC42IDUuMyA0LjQgOC44IDAgNzMuNyAwIDE0Ny4zIDAgMjIxIDAgMS40LS4xIDIuNyAwIDQgLjEgMS41IC44IDIuOCAxLjUgNC4xIC45IDEuNyAxLjggMy4zIDMuMiA0LjYgLjkgLjggMiAxLjQgMy4yIDEuMiAxLjUtLjIgMi43LTEuNCAzLjQtMi42IDEtMS41IDEuNy0zLjIgMi4zLTQuOSAuOC0yLjEgLjQtNC40IC41LTYuNiAuMS00IDAtOC4xIC4xLTEyLjEgMC01LjkgMC0xMS44IC4xLTE3LjcgLjEtMy42IDAtNy4yIC4xLTEwLjkgLjItNCAwLTguMSAuMS0xMi4xIDAtNiAwLTEyIC4xLTE4IC4xLTMuNiAwLTcuMiAuMS0xMC45IC4xLTMuOSAwLTcuOSAuMS0xMS44IDAtNiAwLTEyIC4xLTE4IC4yLTMuOSAwLTcuOSAuMi0xMS44IC4zIDEuNCAuMSAyLjkgLjIgNC40IC4yIDMuNiAuNCA3LjIgLjggMTAuOCAuMyAzLjQgLjQgNi45IC45IDEwLjMgLjQgMy4xIC41IDYuMiAxIDkuMyAuNiA0LjEgLjkgOC4yIDEuNSAxMi4zIDEuNSA5IDIuOCAxOC4xIDUuMSAyNyAxLjEgNC44IDIuNCA5LjYgNCAxNC4zIDIuNSA3LjkgNS43IDE1LjcgMTAuMyAyMi42IDEuNyAyLjYgMy45IDUgNi4xIDcuMiAuMyAuMiAuNiAuNSAuOSAuNyAuNiAuMyAxLjMtLjEgMS43LS42IC43LS45IDEuMi0xLjkgMS43LTIuOSA0LjEtNy44IDguMi0xNS42IDEyLjMtMjMuMyAuNy0xLjMgMS40LTIuNiAyLjYtMy42IDEuOC0xLjYgMy44LTIuNyA2LTMuNiAyLjktMS4yIDUuOS0yLjIgOS0yLjQgNi42LS42IDEzLjEgLjcgMTkuNiAxLjggMy43IC42IDcuNCAxLjIgMTEuMSAxLjQgMy43IC4xIDcuNSAuMSAxMS4yLS4zIDguNi0uOSAxNy0zIDI0LjktNi4yIDUuMy0yLjIgMTAuNS00LjggMTUuMy03LjkgMTEuNS03LjIgMjEuNS0xNi42IDMwLTI3IDEuMi0xLjQgMi4yLTIuOSAzLjUtNC4zLTEuMiAzLjItMi43IDYuNC00LjIgOS41LTEuMyAyLjktMi44IDUuNi00LjMgOC40LTUuMiA5LjYtMTEgMTguOS0xNy44IDI3LjUtNCA1LjItOC41IDEwLjEtMTMuMyAxNC42LTYuNiA2LjEtMTQuMSAxMS40LTIyLjQgMTQuOC04LjIgMy40LTE3LjMgNC42LTI2LjEgMy4zLTMuNi0uNi03LTEuNy0xMC40LTIuOS0yLjgtMS01LjQtMi40LTgtMy43LTMuNC0xLjctNi42LTMuOC05LjctNi4xIDIuNyAzLjEgNS43IDUuOSA4LjcgOC42IDQuMyAzLjggOC43IDcuMyAxMy42IDEwLjIgNCAyLjUgOC4zIDQuNCAxMi44IDUuNSAxLjUgLjQgMyAuNSA0LjUgLjYtMS4zIDEuMS0yLjYgMi00IDMtOS42IDYuNS0yMCAxMS45LTMwLjcgMTYuNC0yMC45IDguNy00My4yIDE0LTY1LjcgMTUuMy00LjcgLjItOS4zIC40LTE0IC40LTUtLjEtMTAtLjEtMTQuOS0uNy0xMS4yLS44LTIyLjMtMi43LTMzLjItNS40LTEwLjQtMi43LTIwLjYtNi4xLTMwLjMtMTAuNi04LjctMy45LTE3LjEtOC40LTI1LTEzLjgtMS44LTEuMy0zLjctMi41LTUuNC00LjEgNi42LTEuMiAxMy0zLjQgMTktNi41IDUuNy0yLjkgMTEtNi43IDE1LjYtMTEuMSAyLjItMi4yIDQuMy00LjYgNi4yLTcuMS0zLjQgMi4xLTYuOSA0LjItMTAuNiA1LjgtNC40IDIuMi05LjEgMy44LTEzLjggNS01LjcgMS41LTExLjcgMS43LTE3LjYgMS4xLTguMS0xLTE1LjktNC4zLTIyLjUtOS00LjMtMi45LTguMi02LjQtMTItMTAuMS05LjktMTAuMi0xOC4yLTIxLjgtMjUuNy0zMy45LTMuOS02LjMtNy41LTEyLjctMTEuMS0xOS4yLTEtMi0yLjEtNC4xLTMuMi02LjEgMi44IDIuOSA1LjYgNiA4LjQgOC45IDE5LjIgMTkuMiAzNy42IDMyLjMgNTMuNyAzNS41IDMuMSAuNyA2LjMgLjUgOS41IC44IDIuOCAuMyA1LjYgLjIgOC4zIC4zIDUgLjEgMTAuMSAwIDE1LjItLjIgMy42LS4yIDcuMy0uNyAxMC45LTEuMSAyLjEtLjIgNC4xLS43IDYuMS0xLjIgMy45LTEgOC4xLTEgMTEuOCAuNiA0LjggMS44IDguNCA1LjYgMTEuNCA5LjcgMi4yIDMgNC4xIDYuMiA1LjcgOS42IDEuMiAyLjQgMi41IDQuOCAzLjYgNy4zIDEgMi4yIDIuMiA0LjQgMy40IDYuNSAuNyAxIDEuNCAyLjIgMi42IDIuNiAxLjEtLjggMS43LTEuOSAyLjMtMyAyLjEtNC4yIDMuNC04LjYgNC45LTEzIDItNi42IDMuOC0xMy4zIDUuMi0yMCAyLjItOS4zIDMuMi0xOC43IDQuNS0yOC4xIC42LTQgLjgtOCAxLjMtMTIgLjktMTAuNiAxLjktMjEuMyAyLjItMzEuOSAuMS0xLjkgLjItMy43IC4zLTUuNiAwLTQuMyAuMi04LjcgLjItMTMgMC0yLjQgMC00LjggMC03LjEgMC01LjEtLjItMTAuMS0uMi0xNS4yLS4yLTYuNi0uNy0xMy4yLTEuMy0xOS44LS43LTUuOS0xLjUtMTEuOC0zLjEtMTcuNS0yLTcuNy01LjYtMTUtOS44LTIxLjgtMy4yLTUuMS02LjgtOS45LTExLjEtMTQtMy45LTMuOS04LjYtNy4xLTEzLjktOC40LTEuNS0uNC0zLjEtLjQtNC42LS42IC4xLTMgLjctNS45IDEuMy04LjggMS42LTcuNyAzLjgtMTUuMyA2LjgtMjIuNiAxLjUtNCAzLjQtNy45IDUuNC0xMS43IDMuNC02LjYgNy42LTEyLjggMTIuNS0xOC41em0zMS4zIDEuN2MuNC0uMSAuNy0uMSAxLjEtLjIgLjIgMS44IC4xIDMuNiAuMSA1LjRsMCAzOC4xYzAgMS43IC4xIDMuNS0uMiA1LjItLjQgMC0uNyAwLTEuMSAwLS45LTMuOC0xLjctNy42LTIuNi0xMS4zLS40LTEuNS0uNi0zLjEtMS4xLTQuNi0xLjctLjItMy40LS4yLTUuMi0uMi01LjEgMC0xMC4xIDAtMTUuMiAwLTEuNyAwLTMuMyAuMS01IDAgMC0uNC0uMy0uOSAuMi0xLjIgMS4zLS43IDIuNy0uOSA0LjEtMS40IDMuNC0xLjEgNi45LTIuMiAxMC4zLTMuMyAxLjQtLjUgMi45LS43IDQuMi0xLjUgMC0uNiAwLTEuMSAwLTEuNy0xLjItLjYtMi41LS45LTMuOC0xLjMtMy4xLTEtNi4zLTItOS40LTMtMS44LS42LTMuNy0xLTUuNC0xLjggMC0uNC0uMS0uNy0uMS0xLjEgNS4xLS4yIDEwLjIgLjEgMTUuMy0uMSAzLjQtLjEgNi43IC4xIDEwLjEtLjEgLjEtLjQgLjMtLjggLjQtMS4yIDEuMS00LjkgMi4zLTkuOCAzLjQtMTQuN3ptNi0uMmMuNCAwIC43IC4xIDEuMSAuMiAxIDMuOCAxLjcgNy44IDIuNyAxMS42IC40IDEuNCAuNiAyLjkgMSA0LjMgMi41IC4yIDUuMSAwIDcuNiAwIDUuMiAuMSAxMC4zIC4xIDE1LjUgLjEgLjggMCAxLjUgMCAyLjMgLjEgMCAuNC0uMSAuNy0uMSAxLjEtMS44IC44LTMuOCAxLjItNS43IDEuOS0zLjcgMS4yLTcuNSAyLjQtMTEuMiAzLjYtLjYgLjItMS4xIC40LTEuNyAuNi0uMiAuNi0uMiAxLjEtLjEgMS43IC45IC41IDEuOCAuOCAyLjggMS4xIDQuOSAxLjUgOS43IDMuMSAxNC42IDQuNiAuNCAuMSAuOCAuMyAxLjEgLjUgLjQgLjMgLjIgLjggLjIgMS4yLTEuNyAuMS0zLjMgMC01IDAtNS4yIDAtMTAuMyAwLTE1LjUgMC0xLjYgMC0zLjIgMC00LjggLjItLjUgMS43LS43IDMuNC0xLjIgNS4xLS45IDMuNi0xLjUgNy4yLTIuNSAxMC44LS40IDAtLjcgMC0xLjEgLjEtLjMtMS43LS4yLTMuNS0uMi01LjJsMC0zOC4xYzAtMS44LS4xLTMuNiAuMS01LjR6bS0xODYgNDVjMS4xLTIuMiAyLjEtNC40IDMuNC02LjUtMS44IDcuNi0yLjkgMTUuMy0zLjYgMjMtLjggNy43LS44IDE1LjUtLjUgMjMuMiAxLjEgMTkuOSA1LjUgMzkuOCAxNC4yIDU3LjkgMyA2IDYuNCAxMS44IDEwLjUgMTcuMSA2LjEgNy41IDEyLjUgMTQuOCAxOS44IDIxLjEgNC44IDQuMSAxMCA3LjggMTUuNSAxMC44IDMuMyAxLjcgNi41IDMuNCA5LjkgNC43IDUgMiAxMC4yIDMuNiAxNS40IDQuOSAzLjggMSA3LjggMS40IDExLjUgMi43IDUgMS42IDkuNSA0LjYgMTMgOC40IDQuOSA1LjIgOC4xIDExLjkgMTAuMiAxOC43IDEgMi45IDEuNiA1LjkgMi4yIDguOSAuMiAuOCAuMiAxLjUgLjIgMi4zLTYuNSAyLjgtMTMuMyA1LjEtMjAuMyA2LjItNC4xIC44LTguMyAxLTEyLjUgMS4xLTEwLjIgLjItMjAuNS0xLjgtMzAuMS01LjEtMy43LTEuNC03LjUtMi45LTExLTQuNy04LjEtMy44LTE1LjYtOC43LTIyLjUtMTQuNS0yLjktMi42LTUuOC01LjEtOC40LTgtOS4yLTkuOC0xNi4zLTIxLjQtMjEuOC0zMy43LTIuNC01LjUtNC42LTExLjItNi40LTE3LTEuMi0zLjktMi40LTcuOS0zLjMtMTEuOS0uNy0yLjktMS4yLTUuOS0xLjktOC45LS41LTIuMS0uNy00LjMtMS02LjUtLjgtNS40LTEuMy0xMC45LTEuMy0xNi40IC4xLTYuMiAuMi0xMi40IDEuMS0xOC41IC40LTIuOSAuNy01LjcgMS4yLTguNiAxLTUuNyAyLjEtMTEuNCAzLjctMTYuOSAzLjEtMTEuNiA3LjUtMjMgMTIuNy0zMy44em0zNjMuNy02LjRjMS4xIDEuNyAxLjkgMy41IDIuOCA1LjMgMi4xIDQuNSA0LjIgOC45IDYgMTMuNSA3LjYgMTguOCAxMi4zIDM4LjggMTMgNTkgMCAxLjggLjEgMy41IC4xIDUuMyAuMSA5LjYtMS4zIDE5LjEtMy4yIDI4LjUtLjcgMy42LTEuNSA3LjItMi42IDEwLjctNCAxNC43LTEwIDI5LTE4LjQgNDEuOC04LjIgMTIuNi0xOSAyMy41LTMxLjggMzEuNC01LjcgMy42LTExLjggNi42LTE4IDkuMi01LjggMi4yLTExLjcgNC0xNy44IDUuMS02LjQgMS0xMi45IDEuNS0xOS40IDEuMi03LjktLjUtMTUuOC0yLjEtMjMuMi00LjgtMS45LS44LTMuOS0xLjUtNS44LTIuMy0uMi0xLjUgLjItMyAuNS00LjUgMS4yLTUuNyAzLTExLjQgNS43LTE2LjYgMi40LTQuNSA1LjUtOC43IDkuNS0xMS45IDIuNC0yLjEgNS4yLTMuNiA4LjItNC44IDMuNi0xLjUgNy41LTIgMTEuMi0yLjggNy4yLTEuNyAxNC40LTMuOSAyMS4yLTcgMTAuMy00LjcgMTkuNy0xMS40IDI3LjYtMTkuNSAxLjYtMS42IDMuMi0zLjIgNC43LTQuOSAzLjQtMy44IDYuNy03LjYgOS44LTExLjUgNy41LTEwLjEgMTIuOC0yMS42IDE2LjctMzMuNSAxLjYtNS4zIDMuMi0xMC42IDQuMi0xNi4xIC42LTIuOSAxLTUuOCAxLjUtOC43IC45LTYuMSAxLjYtMTIuMiAxLjctMTguNCAuMS02LjYgLjEtMTMuMy0uNS0xOS45LS43LTgtMS45LTE2LTMuNy0yMy44eiJdCiAgICB9OwogICAgZmFTdXNlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInN1c2UiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjdkNiIsICJNNjA0LjUgMjEwYTEwLjQgMTAuNCAwIDEgMSAtMTEuNC0xNy40IDEwLjQgMTAuNCAwIDEgMSAxMS40IDE3LjR6TTYyMSAxODcuMmEzOC41IDM4LjUgMCAxIDEgLTc1IDE3LjYgMzguNSAzOC41IDAgMSAxIDc1LTE3LjZ6TTQzMy43IDMzNi43YzMuMiA0LjYgNS44IDkgNy4zIDEzLjQgMSAzLjEgMi40IDcuMyA1LjUgOC45IC4yIC4xIC4zIC4yIC41IC4yIDUuNyAyLjEgMjAuMyAxLjcgMjAuMyAxLjdsMjYuOCAwYzIuMyAwIDIyLjQgMCAyMS45LTIuMy0yLjQtMTAuOC0xNC45LTEyLjctMjQuNC0xOC4zLTguNy01LjItMTctMTEuMS0yMC44LTIxLjMtMi01LjItLjgtMTcuNCAyLjYtMjEuOCAyLjUtMy4yIDYuMS01LjMgMTAtNi4yIDQuMy0uOSA4LjgtLjEgMTMuMSAuMyA1LjMgLjUgMTAuNiAxLjUgMTUuOSAyLjIgMTAuMyAxLjMgMjAuNiAxLjkgMzEgMS42IDE3LjEtLjUgMzQuMi0zLjIgNTAuNC04LjcgMTEuMy0zLjggMjIuNC04LjkgMzItMTYuMSAxMC45LTguMSA4LjEtNy40LTMtNi4yLTEzLjMgMS40LTI2LjYgMS42LTM5LjkgLjgtMTIuNC0uNy0yNC43LTIuMi0zNS45LTcuOS04LjgtNC42LTE2LjQtOS4xLTIzLjQtMTYuMi0xLTEuMS0xLjctNC4yIC4yLTYuMiAxLjktMS45IDUuOC0uOCA3IC4yIDEyLjIgMTAuMiAzMC41IDE4LjYgNDkuMyAxOS41IDEwLjIgLjUgMjAuMSAuNyAzMC40IC4zIDUuMS0uMiAxMi44LS4yIDE3LjktLjMgMi42IDAgOS44IC43IDExLjItMi4xIC40LS44IC40LTEuOCAuMy0yLjctMS41LTQwLjktNC41LTg2LjktNDcuMy0xMDYuNS0zMS45LTE0LjYtNzkuNy0zNy4yLTk5LjktNDYuNi00LjctMi4yLTEwLjIgMS4zLTEwLjIgNi41IDAgMTMuNiAuNyAzMy4zIC43IDUxLjEtOS43LTkuOS0yNi0xNi4xLTM4LjQtMjEuOC0xNC4xLTYuNS0yOC43LTEyLTQzLjUtMTYuNi0yOS44LTkuMi02MC43LTE0LjktOTEuNy0xOC0zNS4yLTMuNS03MS0xLjgtMTA1LjcgNS4zLTU2LjkgMTIuMi0xMTMuMSAzOS43LTE1NS43IDc5LjgtMjYuMSAyNC42LTQ2LjYgNTkuNy00OCA5NS4yLTIgNTAuMyAxMi4xIDc3LjMgMzggMTA1LjIgNDEuMyA0NC40IDEzMC4yIDUwLjYgMTY2LjItMiAxNi4yLTIzLjcgMTkuNy01NS44IDgtODItMTEuOC0yNi4yLTM4LjgtNDUuMS02Ny40LTQ2LTIyLjItLjctNDUuOSAxMC42LTU0LjUgMzEuMS02LjUgMTUuNy0yLjggMzUuMSA5IDQ3LjMgNC42IDQuOCAxMC45IDguNyAxNy43IDcuMSA0LS45IDcuNC0zLjkgOC04IC45LTYtNC40LTkuOS03LjYtMTQuNS01LjgtOC4zLTQuNy0yMC45IDIuNy0yNy45IDYuMi02IDE1LjMtNy44IDIzLjktNy43IDggMCAxNi4yIDEuNCAyMy4xIDUuNSA5LjcgNS43IDE2LjIgMTYuMiAxOC40IDI3LjIgNi43IDMzLTIwLjIgNTkuOS01Ni42IDYyLTE4LjYgMS4xLTM3LjYtMy44LTUyLjEtMTUuNS0zNi45LTI5LjgtNDUuOS05MC4zLTMuOC0xMjIuNyA0MC0zMC43IDkwLjQtMjIuOCAxMjAuMi02LjggMjMuOCAxMi44IDQxLjUgMzMuNiA1NSA1Ni43IDYuNyAxMS42IDEyLjUgMjMuNyAxNy44IDM2LjEgNS4xIDExLjggOS45IDIzLjggMjAuMiAzMi41IDYuOCA1LjggMTUuMiA1LjYgMjQuMSA1LjZsNTAuOCAwYzYuOSAwIDUuMi00LjYgMi4yLTcuNy02LjctNi45LTE2LjQtOC40LTI1LjQtMTAuOS0yMC41LTUuNi0xOC40LTMyLjgtMTIuNy0zMi44IDE4LjMgMCAxOC45IC42IDM0LjkgLjMgMjMuMi0uMyAzMC4yLTEuNyA0OC4zIDUgOS43IDMuNiAxOSAxMy4xIDI1LjEgMjEuN3oiXQogICAgfTsKICAgIGZhQXBwU3RvcmVJb3MgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYXBwLXN0b3JlLWlvcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMzcwIiwgIk00MDAgMzJMNDggMzJDMjEuNSAzMiAwIDUzLjUgMCA4MEwwIDQzMmMwIDI2LjUgMjEuNSA0OCA0OCA0OGwzNTIgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTM1MmMwLTI2LjUtMjEuNS00OC00OC00OHpNMTI3IDM4NC41Yy01LjUgOS42LTE3LjggMTIuOC0yNy4zIDcuMy05LjYtNS41LTEyLjgtMTcuOC03LjMtMjcuM2wxNC4zLTI0LjdjMTYuMS00LjkgMjkuMy0xLjEgMzkuNiAxMS40TDEyNyAzODQuNXptMTM4LjktNTMuOUw4NCAzMzAuNmMtMTEgMC0yMC05LTIwLTIwczktMjAgMjAtMjBsNTEgMCA2NS40LTExMy4yLTIwLjUtMzUuNGMtNS41LTkuNi0yLjItMjEuOCA3LjMtMjcuMyA5LjYtNS41IDIxLjgtMi4yIDI3LjMgNy4zbDguOSAxNS40IDguOS0xNS40YzUuNS05LjYgMTcuOC0xMi44IDI3LjMtNy4zIDkuNiA1LjUgMTIuOCAxNy44IDcuMyAyNy4zbC04NS44IDE0OC42IDYyLjEgMGMyMC4yIDAgMzEuNSAyMy43IDIyLjcgNDB6bTk4LjEgMGwtMjkgMCAxOS42IDMzLjljNS41IDkuNiAyLjIgMjEuOC03LjMgMjcuMy05LjYgNS41LTIxLjggMi4yLTI3LjMtNy4zLTMyLjktNTYuOS01Ny41LTk5LjctNzQtMTI4LjEtMTYuNy0yOS00LjgtNTggNy4xLTY3LjggMTMuMSAyMi43IDMyLjcgNTYuNyA1OC45IDEwMmw1MiAwYzExIDAgMjAgOSAyMCAyMCAwIDExLjEtOSAyMC0yMCAyMHoiXQogICAgfTsKICAgIGZhU3F1YXJlRHJpYmJibGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLWRyaWJiYmxlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImRyaWJiYmxlLXNxdWFyZSJdLCAiZjM5NyIsICJNMTY1LjkgMTMyLjVjLTM4LjMgMTgtNjYuOCA1My4zLTc1LjcgOTUuNyA2LjEgLjEgNjIuNCAuMyAxMjYuNC0xNi43LTIyLjctNDAuMi00Ny4xLTc0LjEtNTAuNy03OXptMjYuMS05LjFjMy44IDUuMSAyOC42IDM4LjkgNTEgODAgNDguNi0xOC4zIDY5LjEtNDUuOSA3MS42LTQ5LjQtMzMuNi0yOS44LTc5LjMtNDEuMS0xMjIuNi0zMC42ek0yNzcuNCAzODJjLTItMTItMTAtNTMuOC0yOS4yLTEwMy42LTU1LjEgMTguOC05My44IDU2LjQtMTA4LjEgODUuNiA0MC41IDMxLjYgOTMuMyAzNi43IDEzNy4zIDE4ek0yMjcuOCAyMzIuNkMxNTkuNiAyNTMgOTMuNCAyNTIuMiA4Ny40IDI1MmwwIDQuMmMwIDM1LjEgMTMuMyA2Ny4xIDM1LjEgOTEuNCAyMi4yLTM3LjkgNjcuMS03Ny45IDExNi41LTkxLjgtMy40LTcuOC03LjItMTUuNS0xMS4xLTIzLjJsLS4xIDB6bTcyLjUgMTM2LjljMzAuNy0yMC43IDUyLjUtNTMuNiA1OC42LTkxLjYtNC42LTEuNS00Mi4zLTEyLjctODUuMS01LjggMTcuOSA0OS4xIDI1LjEgODkuMSAyNi41IDk3LjR6bS0zNC44LTExOWM0NS41LTUuNyA5MC43IDMuNCA5NS4yIDQuNC0uMy0zMi4zLTExLjgtNjEuOS0zMC45LTg1LjEtMi45IDMuOS0yNS44IDMzLjItNzYuMyA1My45IDQuOCA5LjggOC4zIDE3LjggMTIgMjYuOHpNMzg0IDMyTDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjR6TTIyNCA5NmExNjAgMTYwIDAgMSAxIDAgMzIwIDE2MCAxNjAgMCAxIDEgMC0zMjB6Il0KICAgIH07CiAgICBmYURyaWJiYmxlU3F1YXJlID0gZmFTcXVhcmVEcmliYmJsZTsKICAgIGZhVWlraXQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidWlraXQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjQwMyIsICJNNDQzLjkgMTI4bDAgMjU2LTIyNS45IDEyOC0yMTgtMTI4IDAtMjE0LjMgODcuNiA0NS4xIDAgMTE3IDEzMy41IDc1LjUgMTM1LjgtNzUuNSAwLTE1MS0xMDEuMS01Ny42IDg3LjYtNTMuMSAxMDAuNSA1Ny45ek0zMDguNiA0OS4xbC04NC44LTQ5LjEtODguNiA1NC44IDg2IDQ3LjMgODcuNC01M3oiXQogICAgfTsKICAgIGZhU3VwZXJwb3dlcnMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3VwZXJwb3dlcnMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjJkZCIsICJNNDQ4IDMyYy04My4zIDExLTE2Ni44IDIyLTI1MCAzMy05MiAxMi41LTE2My4zIDg2LjctMTY5IDE4MC0zLjMgNTUuNSAxOCAxMDkuNSA1Ny44IDE0OC4yTDAgNDgwYzgzLjMtMTEgMTY2LjUtMjIgMjQ5LjgtMzMgOTEuOC0xMi41IDE2My4zLTg2LjggMTY4LjctMTc5LjggMy41LTU1LjUtMTgtMTA5LjUtNTcuNy0xNDguMkw0NDggMzJ6TTM2OC4zIDI2NC4zYy00LjIgNzkuNS03NCAxMzkuMi0xNTIuOCAxMzQuNS03OS41LTQuNy0xNDAuNy03MS0xMzYuMy0xNTEgNC41LTc5LjIgNzQuMy0xMzkuMyAxNTMtMTM0LjUgNzkuMyA0LjcgMTQwLjUgNzEgMTM2LjEgMTUxeiJdCiAgICB9OwogICAgZmFZb3V0dWJlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInlvdXR1YmUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFs2MTgwMl0sICJmMTY3IiwgIk01NDkuNyAxMjQuMUM1NDMuNSAxMDAuNCA1MjQuOSA4MS44IDUwMS40IDc1LjUgNDU4LjkgNjQgMjg4LjEgNjQgMjg4LjEgNjRTMTE3LjMgNjQgNzQuNyA3NS41QzUxLjIgODEuOCAzMi43IDEwMC40IDI2LjQgMTI0LjEgMTUgMTY3IDE1IDI1Ni40IDE1IDI1Ni40czAgODkuNCAxMS40IDEzMi4zYzYuMyAyMy42IDI0LjggNDEuNSA0OC4zIDQ3LjggNDIuNiAxMS41IDIxMy40IDExLjUgMjEzLjQgMTEuNXMxNzAuOCAwIDIxMy40LTExLjVjMjMuNS02LjMgNDItMjQuMiA0OC4zLTQ3LjggMTEuNC00Mi45IDExLjQtMTMyLjMgMTEuNC0xMzIuM3MwLTg5LjQtMTEuNC0xMzIuM3pNMjMyLjIgMzM3LjZsMC0xNjIuNCAxNDIuNyA4MS4yLTE0Mi43IDgxLjJ6Il0KICAgIH07CiAgICBmYUVtYmVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImVtYmVyIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY0MjMiLCAiTTYzOS45IDI1NC42Yy0xLjEtMTAuNy0xMC43LTYuOC0xMC43LTYuOHMtMTUuNiAxMi4xLTI5LjMgMTAuN2MtMTMuNy0xLjMtOS40LTMyLTkuNC0zMnMzLTI4LjEtNS4xLTMwLjRjLTguMS0yLjQtMTggNy4zLTE4IDcuM3MtMTIuNCAxMy43LTE4LjMgMzEuMmwtMS42IC41czEuOS0zMC42LS4zLTM3LjZjLTEuNi0zLjUtMTYuNC0zLjItMTguOCAzcy0xNC4yIDQ5LjItMTUgNjcuMmMwIDAtMjMuMSAxOS42LTQzLjMgMjIuOHMtMjUtOS40LTI1LTkuNCA1NC44LTE1LjMgNTIuOS01OS4xLTQ0LjItMjcuNi00OS0yNGMtNC42IDMuNS0yOS40IDE4LjQtMzYuNiA1OS43LS4yIDEuNC0uNyA3LjUtLjcgNy41cy0yMS4yIDE0LjItMzMgMThjMCAwIDMzLTU1LjYtNy4zLTgwLjktMTEuNC02LjgtMjEuMy0uNS0yNy4yIDUuMyAxMy42LTE3LjMgNDYuNC02NC4yIDM2LjktMTA1LjItNS44LTI0LjQtMTgtMjcuMS0yOS4yLTIzLjEtMTcgNi43LTIzLjUgMTYuNy0yMy41IDE2LjdzLTIyIDMyLTI3LjEgNzkuNS0xMi42IDEwNS4xLTEyLjYgMTA1LjEtMTAuNSAxMC4yLTIwLjIgMTAuNy01LjQtMjguNy01LjQtMjguNyA3LjUtNDQuNiA3LTUyLjEtMS4xLTExLjYtOS45LTE0LjJjLTguOS0yLjctMTguNSA4LjYtMTguNSA4LjZzLTI1LjUgMzguNy0yNy43IDQ0LjZsLTEuMyAyLjQtMS4zLTEuNnMxOC01Mi43IC44LTUzLjUtMjguNSAxOC44LTI4LjUgMTguOC0xOS42IDMyLjgtMjAuNCAzNi41bC0xLjMtMS42czguMS0zOC4yIDYuNC00Ny42Yy0xLjYtOS40LTEwLjUtNy41LTEwLjUtNy41cy0xMS4zLTEuMy0xNC4yIDUuOS0xMy43IDU1LjMtMTUgNzAuN2MwIDAtMjguMiAyMC4yLTQ2LjggMjAuNC0xOC41IC4zLTE2LjctMTEuOC0xNi43LTExLjhzNjgtMjMuMyA0OS40LTY5LjJjLTguMy0xMS44LTE4LTE1LjUtMzEuNy0xNS4zLTEzLjcgLjMtMzAuMyA4LjYtNDEuMyAzMy4zLTUuMyAxMS44LTYuOCAyMy03LjggMzEuNSAwIDAtMTIuMyAyLjQtMTguOC0yLjlzLTEwIDAtMTAgMC0xMS4yIDE0LS4xIDE4LjMgMjguMSA2LjEgMjguMSA2LjFjMS42IDcuNSA2LjIgMTkuNSAxOS42IDI5LjcgMjAuMiAxNS4zIDU4LjgtMS4zIDU4LjgtMS4zbDE1LjktOC44cy41IDE0LjYgMTIuMSAxNi43IDE2LjQgMSAzNi41LTQ3LjljMTEuOC0yNSAxMi42LTIzLjYgMTIuNi0yMy42bDEuMy0uM3MtOS4xIDQ2LjgtNS42IDU5LjdDMTg3LjcgMzE5LjQgMjAzIDMxOCAyMDMgMzE4czguMyAyLjQgMTUtMjEuMiAxOS42LTQ5LjkgMTkuNi00OS45bDEuNiAwcy01LjYgNDguMSAzIDYzLjcgMzAuOSA1LjMgMzAuOSA1LjMgMTUuNi03LjggMTgtMTAuMmMwIDAgMTguNSAxNS44IDQ0LjYgMTIuOSA1OC4zLTExLjUgNzkuMS0yNS45IDc5LjEtMjUuOXMxMCAyNC40IDQxLjEgMjYuN2MzNS41IDIuNyA1NC44LTE4LjYgNTQuOC0xOC42cy0uMyAxMy41IDEyLjEgMTguNiAyMC43LTIyLjggMjAuNy0yMi44bDIwLjctNTcuMiAxLjkgMHMxLjEgMzcuMyAyMS41IDQzLjIgNDctMTMuNyA0Ny0xMy43IDYuNC0zLjUgNS4zLTE0LjN6bS01NzggNS4zYy44LTMyIDIxLjgtNDUuOSAyOS0zOSA3LjMgNyA0LjYgMjItOS4xIDMxLjQtMTMuNyA5LjUtMTkuOSA3LjYtMTkuOSA3LjZ6TTMzNC43IDEzNi4xczE5LjEtNDkuNyAyMy42LTI1LjUtNDAgOTYuMi00MCA5Ni4yYy41LTE2LjIgMTYuNC03MC43IDE2LjQtNzAuN3ptMjIuOCAxMzguNGMtMTIuNiAzMy00My4zIDE5LjYtNDMuMyAxOS42cy0zLjUtMTEuOCA2LjQtNDQuOSAzMy4zLTIwLjIgMzMuMy0yMC4yIDE2LjIgMTIuNCAzLjYgNDUuNXptODQuNi0xNC42cy0zLTEwLjUgOC4xLTMwLjZjMTEtMjAuMiAxOS42LTkuMSAxOS42LTkuMXM5LjQgMTAuMi0xLjMgMjUuNS0yNi40IDE0LjItMjYuNCAxNC4yeiJdCiAgICB9OwogICAgZmFCb290c3RyYXAgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYm9vdHN0cmFwIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY4MzYiLCAiTTMzMy41IDIwMS40YzAtMjIuMS0xNS42LTM0LjMtNDMtMzQuM2wtNTAuNCAwIDAgNzEuMiA0Mi41IDBjMzIuOC0uMSA1MC45LTEzLjMgNTAuOS0zNi45ek01MTcgMTg4LjZjLTkuNS0zMC45LTEwLjktNjguOC05LjgtOTguMSAxLjEtMzAuNS0yMi43LTU4LjUtNTQuNy01OC41TDEyMy43IDMyYy0zMi4xIDAtNTUuOCAyOC4xLTU0LjcgNTguNSAxIDI5LjMtLjMgNjcuMi05LjggOTguMS05LjYgMzEtMjUuNyA1MC42LTUyLjIgNTMuMWwwIDI4LjVjMjYuNCAyLjUgNDIuNiAyMi4xIDUyLjIgNTMuMSA5LjUgMzAuOSAxMC45IDY4LjggOS44IDk4LjEtMS4xIDMwLjUgMjIuNyA1OC41IDU0LjcgNTguNWwzMjguNyAwYzMyLjEgMCA1NS44LTI4LjEgNTQuNy01OC41LTEtMjkuMyAuMy02Ny4yIDkuOC05OC4xIDkuNi0zMSAyNS43LTUwLjYgNTIuMS01My4xbDAtMjguNWMtMjYuMy0yLjUtNDIuNS0yMi4xLTUyLTUzLjF6TTMwMC4yIDM3NS4xbC05Ny45IDAgMC0yMzguMyA5Ny40IDBjNDMuMyAwIDcxLjcgMjMuNCA3MS43IDU5LjQgMCAyNS4zLTE5LjEgNDcuOS00My41IDUxLjhsMCAxLjNjMzMuMiAzLjYgNTUuNSAyNi42IDU1LjUgNTguMyAwIDQyLjEtMzEuMyA2Ny41LTgzLjIgNjcuNXptLTEwLTEwOC43bC01MC4xIDAgMCA3OC40IDUyLjMgMGMzNC4yIDAgNTIuMy0xMy43IDUyLjMtMzkuNSAwLTI1LjctMTguNi0zOC45LTU0LjUtMzguOXoiXQogICAgfTsKICAgIGZhSXR1bmVzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIml0dW5lcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmM2I0IiwgIk0yMjMuNiA4MC4zYTE3MS4zIDE3MS4zIDAgMSAwIC4yIDM0Mi41IDE3MS4zIDE3MS4zIDAgMSAwIC0uMi0zNDIuNXptNzkuNCAyNDBjLTMuMiAxMy42LTEzLjUgMjEuMi0yNy4zIDIzLjgtMTIuMSAyLjItMjIuMiAyLjgtMzEuOS01LTExLjgtMTAtMTItMjYuNC0xLjQtMzYuOCA4LjQtOCAyMC4zLTkuNiAzOC0xMi44IDMtLjUgNS42LTEuMiA3LjctMy43IDMuMi0zLjYgMi4yLTIgMi4yLTgwLjggMC01LjYtMi43LTcuMS04LjQtNi4xLTQgLjctOTEuOSAxNy4xLTkxLjkgMTcuMS01IDEuMS02LjcgMi42LTYuNyA4LjMgMCAxMTYuMSAuNSAxMTAuOC0xLjIgMTE4LjUtMi4xIDktNy42IDE1LjgtMTQuOSAxOS42LTguMyA0LjYtMjMuNCA2LjYtMzEuNCA1LjItMjEuNC00LTI4LjktMjguNy0xNC40LTQyLjkgOC40LTggMjAuMy05LjYgMzgtMTIuOCAzLS41IDUuNi0xLjIgNy43LTMuNyA1LTUuNyAuOS0xMjcgMi42LTEzMy43IC40LTIuNiAxLjUtNC44IDMuNS02LjQgMi4xLTEuNyA1LjgtMi43IDYuNy0yLjcgMTAxLTE5IDExMy4zLTIxLjQgMTE1LjEtMjEuNCA1LjctLjQgOSAzIDkgOC43LS4xIDE3MC42IC40IDE2MS40LTEgMTY3LjZ6TTM0NS4yIDMyTDEwMi44IDMyQzQ1LjkgMzIgMCA3Ny45IDAgMTM0LjhMMCAzNzcuMkMwIDQzNC4xIDQ1LjkgNDgwIDEwMi44IDQ4MGwyNDIuNCAwYzU3IDAgMTAyLjgtNDUuOSAxMDIuOC0xMDIuOGwwLTI0Mi40QzQ0OCA3Ny45IDQwMi4xIDMyIDM0NS4yIDMyek0yMjMuNiA1OWExOTIuNSAxOTIuNSAwIDEgMSAwIDM4NSAxOTIuNSAxOTIuNSAwIDEgMSAwLTM4NXoiXQogICAgfTsKICAgIGZhU3F1YXJlWGluZyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUteGluZyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJ4aW5nLXNxdWFyZSJdLCAiZjE2OSIsICJNNDQ4IDk2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjB6TTkzLjggMzIwLjJjLTUuNSAwLTguNy01LjMtNi0xMC4zbDQ5LjMtODYuN2MuMSAwIC4xLS4xIDAtLjJsLTMxLjQtNTRjLTMtNS42IC4yLTEwLjEgNi0xMC4xbDQ2LjYgMGM1LjIgMCA5LjUgMi45IDEyLjkgOC43bDMxLjkgNTUuM2MtMS4zIDIuMy0xOCAzMS43LTUwLjEgODguMi0zLjUgNi4yLTcuNyA5LjEtMTIuNiA5LjFsLTQ2LjYgMHptMTYzLjUtMzMuNGwwIC4yIDY1LjUgMTE5YzIuOCA1LjEgLjEgMTAuMS02IDEwLjFsLTQ2LjYgMGMtNS41IDAtOS43LTIuOS0xMi45LTguN2wtNjYtMTIwLjNjMS44LTMuMiAyMi45LTQwLjQgNjMuMy0xMTEuNiAxMS43LTIwLjcgMjUuMS00NC4zIDQwLjEtNzAuOCAzLjMtNS44IDcuNC04LjcgMTIuNS04LjdsNDYuOSAwYzUuNy0uMSA4LjggNC43IDYgMTBMMjU3LjMgMjg2Ljh6Il0KICAgIH07CiAgICBmYVhpbmdTcXVhcmUgPSBmYVNxdWFyZVhpbmc7CiAgICBmYUNzczNBbHQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY3NzMy1hbHQiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjM4YiIsICJNMCAzMkwzNC45IDQyNy44IDE5MiA0ODAgMzQ5LjEgNDI3LjggMzg0IDMyIDAgMzJ6bTMxMy4xIDgwbC00LjggNDcuMy0xMTUuMyA0OS4zLS4zIC4xIDExMS41IDAtMTIuOCAxNDYuNi05OC4yIDI4LjctOTguOC0yOS4yLTYuNC03My45IDQ4LjkgMCAzLjIgMzguMyA1Mi42IDEzLjMgNTQuNy0xNS40IDMuNy02MS42LTE2Ni4zLS41IDAtLjEtLjIgLjEtMy42LTQ2LjMgMTEyLjEtNDYuNyA2LjUtMi43LTEyMi45IDAtNS44LTQ3LjMgMjQyLjIgMHoiXQogICAgfTsKICAgIGZhU3F1YXJlc3BhY2UgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlc3BhY2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjViZSIsICJNMTg2LjEgMzQzLjNjLTkuNyA5LjctOS43IDI1LjMgMCAzNC45czI1LjMgOS42IDM0LjkgMEwzNzguMyAyMjEuMWMxOS4zLTE5LjMgNTAuNi0xOS4zIDY5LjkgMHMxOS4zIDUwLjYgMCA2OS45TDI5NCA0NDUuMWMxOS4zIDE5LjMgNTAuNSAxOS4zIDY5LjggMGwwIDAgMTE5LjMtMTE5LjJjMzguNi0zOC42IDM4LjYtMTAxLjEgMC0xMzkuNy0zOC42LTM4LjYtMTAxLjItMzguNi0xMzkuNyAwTDE4Ni4xIDM0My4zek00MzAuNyAyMzguNWMtOS43LTkuNy0yNS4zLTkuNy0zNC45IDBMMjM4LjUgMzk1LjdjLTE5LjMgMTkuMy01MC41IDE5LjMtNjkuOCAwbDAgMGMtOS42LTkuNi0yNS4zLTkuNy0zNC45IDBsMCAwYy05LjcgOS42LTkuNyAyNS4zIDAgMzQuOWwwIDBjMzguNiAzOC42IDEwMS4xIDM4LjYgMTM5LjcgMEw0MzAuNyAyNzMuNWM5LjYtOS43IDkuNi0yNS4zIDAtMzQuOXptLTI2MiA4Ny4zTDMyNS45IDE2OC43YzkuNi05LjYgOS42LTI1LjMgMC0zNC45LTkuNi05LjYtMjUuMy05LjYtMzQuOSAwTDEzMy43IDI5MC45Yy0xOS4zIDE5LjMtNTAuNiAxOS4zLTY5LjkgMGwwIDBjLTE5LjMtMTkuMy0xOS4zLTUwLjUgMC02OS44bDAgMCAxNTQuMi0xNTQuMmMtMTkuMy0xOS4zLTUwLjUtMTkuMy02OS44IDBsMCAwLTExOS4yIDExOS4zYy0zOC42IDM4LjYtMzguNiAxMDEuMSAwIDEzOS43IDM4LjYgMzguNiAxMDEuMSAzOC42IDEzOS43IDB6TTgxLjMgMjczLjVjOS42IDkuNiAyNS4zIDkuNiAzNC45IDBMMjczLjUgMTE2LjNjMTkuMy0xOS4zIDUwLjYtMTkuMyA2OS44IDBsMCAwYzkuNyA5LjYgMjUuMyA5LjYgMzQuOSAwczkuNi0yNS4zIDAtMzQuOWMtMzguNi0zOC42LTEwMS4xLTM4LjYtMTM5LjcgMEw4MS4zIDIzOC41Yy05LjYgOS42LTkuNiAyNS4zIDAgMzQuOWwwIDB6Il0KICAgIH07CiAgICBmYVRyZWxsbyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ0cmVsbG8iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjE4MSIsICJNMzkyLjMgMzJMNTYuMSAzMmMtMzEgMC01Ni4xIDI1LjEtNTYuMSA1Ni0uMSAwIDAtNCAwIDMzNiAwIDMwLjkgMjUuMSA1NiA1NiA1NmwzMzYuMiAwYzMwLjgtLjIgNTUuNy0yNS4yIDU1LjctNTZsMC0zMzZjLjEtMzAuOC0yNC44LTU1LjgtNTUuNi01NnpNMTk3IDM3MS4zYy0uMiAxNC43LTEyLjEgMjYuNi0yNi45IDI2LjZsLTgyLjcgMGMtMTQuOCAuMS0yNi45LTExLjgtMjctMjYuNmwwLTI1NC4yYzAtMTQuOCAxMi0yNi45IDI2LjktMjYuOWw4Mi45IDBjMTQuOCAwIDI2LjkgMTIgMjYuOSAyNi45bDAgMjU0LjItLjEgMHptMTkzLjEtMTEyYzAgMTQuOC0xMiAyNi45LTI2LjkgMjYuOWwtODEgMGMtMTQuOCAwLTI2LjktMTItMjYuOS0yNi45bDAtMTQyLjFjMC0xNC44IDEyLTI2LjkgMjYuOC0yNi45bDgxLjEgMGMxNC44IDAgMjYuOSAxMiAyNi45IDI2LjlsMCAxNDIuMXoiXQogICAgfTsKICAgIGZhVmlhZGVvID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInZpYWRlbyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMmE5IiwgIk0yNzYuNCAxNTAuNWwwIC43Yy0xNy45LTUyLjYtNDIuNi0xMDMuNC03MC44LTE1MS4yIDQzLjMgMjkuMiA2NyAxMDAgNzAuOCAxNTAuNXptMzIuNyAxMjEuN2M3LjYgMTguMiAxMSAzNy41IDExIDU3IDAgNzcuNy01Ny44IDE0MS0xMzcuOCAxMzkuNGwzLjgtLjNjNzQuMi00Ni43IDEwOS4zLTExOC42IDEwOS4zLTIwNS4xIDAtMzguMS02LjUtNzUuOS0xOC45LTExMiAxIDExLjcgMSAyMy43IDEgMzUuNCAwIDkxLjgtMTguMSAyNDEuNi0xMTYuNiAyODAtNjUuNy0xMS40LTExMS4zLTY4LjYtMTExLjMtMTM3LjQgMC03NS42IDU3LjQtMTQyLjMgMTM1LjQtMTQyLjMgMTYuOCAwIDMzLjcgMy4xIDQ5LjEgOS42IDEuNy0xNS4xIDYuNS0yOS45IDEzLjQtNDMuMy0xOS45LTcuMi00MS4yLTEwLjctNjIuNS0xMC43LTE2MS41IDAtMjM4LjcgMTk1LjktMTI5LjkgMzEzLjcgNjcuOSA3NC42IDE5MiA3My45IDI1OS44IDAgNTYuNi02MS4zIDYwLjktMTQyLjQgMzYuNC0yMDEtMTIuNyA4LTI3LjEgMTMuOS00Mi4yIDE3ek00MTguMyAxMS43Yy0zMSA2Ni41LTgxLjMgNDcuMi0xMTUuOCA4MC4xLTEyLjQgMTItMjAuNiAzNC0yMC42IDUwLjUgMCAxNC4xIDQuNSAyNy4xIDEyIDM4LjggNDcuNC0xMSA5OC4zLTQ2IDExOC4yLTkwLjctLjcgNS41LTQuOCAxNC40LTcuMiAxOS4yLTIwLjMgMzUuNy02NC42IDY1LjYtOTkuNyA4NC45IDE0LjggMTQuNCAzMy43IDI1LjggNTUgMjUuOCA3OSAwIDExMC4xLTEzNC42IDU4LjEtMjA4LjZ6Il0KICAgIH07CiAgICBmYVNlYXJjaGVuZ2luID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNlYXJjaGVuZ2luIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzZWIiLCAiTTIxNC42IDEzMC4zbC02Ny4yIDI4LjIgMC0xMTUuMy01NC43IDE5MC4zIDU0LjctMjQuMiAwIDEzMC4zIDY3LjItMjA5LjN6TTEzMS40IDMzLjZsLTEuMyA0LjctMTUuMiA1Mi45Qzc0LjYgMTA2LjcgNDYgMTQ1LjggNDYgMTkxLjUgNDYgMjQzLjggODAuMyAyODcuNCAxMjkuNCAyOTdsMCA1My42QzUxLjUgMzQwLjEtNiAyNzIuNC02IDE5MS42LTYgMTExLjEgNTMuOCA0NC40IDEzMS40IDMzLjZ6TTQ0Mi44IDQ4MC44Yy0xMS4yIDExLjItMjMuMSAxMi4zLTI4LjYgMTAuNS01LjQtMS44LTI3LjEtMTkuOS02MC40LTQ0LjQtMzMuMy0yNC42LTMzLjYtMzUuNy00My01Ni43LTkuNC0yMC45LTMwLjQtNDIuNi01Ny41LTUyLjRsLTkuNy0xNC43Yy0yNC43IDE2LjktNTMgMjYuOS04MS4zIDI4LjdsMi4xLTYuNiAxNS45LTQ5LjVjNDYuNS0xMS45IDgwLjktNTQgODAuOS0xMDQuMiAwLTU0LjUtMzguNC0xMDIuMS05Ni0xMDcuMWwwLTUyLjFjODMuMiA1LjEgMTQ4LjggNzQuNSAxNDguOCAxNTkuMyAwIDMzLjYtMTEuMiA2NC43LTI5IDkwLjRsMTQuNiA5LjZjOS44IDI3LjEgMzEuNSA0OCA1Mi40IDU3LjRzMzIuMiA5LjcgNTYuOCA0M2MyNC42IDMzLjIgNDIuNyA1NC45IDQ0LjUgNjAuM3MuNyAxNy4zLTEwLjUgMjguNXptLTkuOS0xNy45YzAtNC40LTMuNi04LTgtOHMtOCAzLjYtOCA4IDMuNiA4IDggOCA4LTMuNiA4LTh6Il0KICAgIH07CiAgICBmYVBheXBhbCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwYXlwYWwiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjFlZCIsICJNMTExLjkgMjk1LjljLTMuNSAxOS4yLTE3LjQgMTA4LjctMjEuNSAxMzQtLjMgMS44LTEgMi41LTMgMi41bC03NC42IDBjLTcuNiAwLTEzLjEtNi42LTEyLjEtMTMuOUw1OS4zIDQ2LjZjMS41LTkuNiAxMC4xLTE2LjkgMjAtMTYuOSAxNTIuMyAwIDE2NS4xLTMuNyAyMDQgMTEuNCA2MC4xIDIzLjMgNjUuNiA3OS41IDQ0IDE0MC4zLTIxLjUgNjIuNi03Mi41IDg5LjUtMTQwLjEgOTAuMy00My40IC43LTY5LjUtNy03NS4zIDI0LjJ6TTM1Ny42IDE1MmMtMS44LTEuMy0yLjUtMS44LTMgMS4zLTIgMTEuNC01LjEgMjIuNS04LjggMzMuNi0zOS45IDExMy44LTE1MC41IDEwMy45LTIwNC41IDEwMy45LTYuMSAwLTEwLjEgMy4zLTEwLjkgOS40LTIyLjYgMTQwLjQtMjcuMSAxNjkuNy0yNy4xIDE2OS43LTEgNy4xIDMuNSAxMi45IDEwLjYgMTIuOWw2My41IDBjOC42IDAgMTUuNy02LjMgMTcuNC0xNC45IC43LTUuNC0xLjEgNi4xIDE0LjQtOTEuMyA0LjYtMjIgMTQuMy0xOS43IDI5LjMtMTkuNyA3MSAwIDEyNi40LTI4LjggMTQyLjktMTEyLjMgNi41LTM0LjggNC42LTcxLjQtMjMuOC05Mi42eiJdCiAgICB9OwogICAgZmFTcXVhcmVCbHVlc2t5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1ibHVlc2t5IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU2YTMiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6TTIyNCAyNDcuNGMxNC41LTMwIDU0LTg1LjggOTAuNy0xMTMuMyAyNi41LTE5LjkgNjkuMy0zNS4yIDY5LjMgMTMuNyAwIDkuOC01LjYgODIuMS04LjkgOTMuOC0xMS40IDQwLjgtNTMgNTEuMi05MCA0NC45IDY0LjcgMTEgODEuMiA0Ny41IDQ1LjYgODQtNjcuNSA2OS4zLTk3LTE3LjQtMTA0LjYtMzkuNmwtLjMtLjljLS45LTIuNi0xLjQtNC4xLTEuOC00LjFzLS45IDEuNS0xLjggNC4xYy0uMSAuMy0uMiAuNi0uMyAuOS03LjYgMjIuMi0zNy4xIDEwOC44LTEwNC42IDM5LjYtMzUuNS0zNi41LTE5LjEtNzMgNDUuNi04NC0zNyA2LjMtNzguNi00LjEtOTAtNDQuOS0zLjMtMTEuNy04LjktODQtOC45LTkzLjggMC00OC45IDQyLjktMzMuNSA2OS4zLTEzLjcgMzYuNyAyNy41IDc2LjIgODMuNCA5MC43IDExMy4zeiJdCiAgICB9OwogICAgZmFEQW5kREJleW9uZCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJkLWFuZC1kLWJleW9uZCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNmNhIiwgIk0zMTMuOCAyNDEuNWMxMy44IDAgMjEtMTAuMSAyNC44LTE3LjktMS0xLjEtNS00LjItNy40LTYuNi0yLjQgNC4zLTguMiAxMC43LTEzLjkgMTAuNy0xMC4yIDAtMTUuNC0xNC43LTMuMi0yNi42LS41LS4yLTQuMy0xLjgtOCAyLjQgMC0zIDEtNS4xIDIuMS02LjYtMy41IDEuMy05LjggNS42LTExLjQgNy45IC4yLTUuOCAxLjYtNy41IC42LTlsLS4yLS4ycy04LjUgNS42LTkuMyAxNC43YzAgMCAxLjEtMS42IDIuMS0xLjkgLjYtLjMgMS4zIDAgLjYgMS45LS4yIC42LTUuOCAxNS43IDUuMSAyNi0uNi0xLjYtMS45LTcuNiAyLjQtMS45LS4zIC4xIDUuOCA3LjEgMTUuNyA3LjF6bTUyLjQtMjEuMWMwLTQtNC45LTQuNC01LjYtNC41IDIgMy45IC45IDcuNSAuMiA5IDIuNS0uNCA1LjQtMS42IDUuNC00LjV6bTEwLjMgNS4yYzAtNi40LTYuMi0xMS40LTEzLjUtMTAuNyA4IDEuMyA1LjYgMTMuOC01IDExLjQgMy43LTIuNiAzLjItOS45LTEuMy0xMi41IDEuNCA0LjItMyA4LjItNy40IDQuNi0yLjQtMS45LTgtNi42LTEwLjYtOC42LTIuNC0yLjEtNS41LTEtNi42LTEuOC0xLjMtMS4xLS41LTMuOC0yLjItNS0xLjYtLjgtMy0uMy00LjgtMS0xLjYtLjYtMi43LTEuOS0yLjYtMy41LTIuNSA0LjQgMy40IDYuMyA0LjUgOC41IDEgMS45LS44IDQuOCA0IDguNSAxNC44IDExLjYgOS4xIDggMTAuNCAxOC4xIC42IDQuMyA0LjIgNi43IDYuNCA3LjQtMi4xLTEuOS0yLjktNi40IDAtOS4zIDAgMTMuOSAxOS4yIDEzLjMgMjMuMSA2LjQtMi40IDEuMS03LS4yLTktMS45IDcuNyAxIDE0LjItNC4xIDE0LjYtMTAuNnptLTM5LjQtMTguNGMyIC44IDEuNiAuNyA2LjQgNC41IDEwLjItMjQuNSAyMS43LTE1LjcgMjItMTUuNSAyLjItMS45IDkuOC0zLjggMTMuOC0yLjctMi40LTIuNy03LjUtNi4yLTEzLjMtNi4yLTQuNyAwLTcuNCAyLjItOCAxLjMtLjgtMS40IDMuMi0zLjQgMy4yLTMuNC01LjQgLjItOS42IDYuNy0xMS4yIDUuOS0xLjEtLjUgMS40LTMuNyAxLjQtMy43LTUuMSAyLjktOS4zIDkuMS0xMC4yIDEzIDQuNi01LjggMTMuOC05LjggMTkuNy05LTEwLjUgLjUtMTkuNSA5LjctMjMuOCAxNS44em0yNDIuNSA1MS45Yy0yMC43IDAtNDAgMS4zLTUwLjMgMi4xbDcuNCA4LjIgMCA3Ny4yLTcuNCA4LjJjMTAuNCAuOCAzMC45IDIuMSA1MS42IDIuMSA0Mi4xIDAgNTkuMS0yMC43IDU5LjEtNDguOSAwLTI5LjMtMjMuMi00OC45LTYwLjQtNDguOXptLTE1LjEgNzUuNmwwLTUzLjNjMzAuMS0zLjMgNDYuOCAzLjggNDYuOCAyNi4zIDAgMjUuNi0yMS40IDMwLjItNDYuOCAyN3pNMzAxLjYgMTgxYy0xLTMuNC0uMi02LjkgMS4xLTkuNCAxIDMgMi42IDYuNCA3LjUgOS0uNS0yLjQtLjItNS42IC41LTgtMS40LTUuNCAyLjEtOS45IDYuNC05LjkgNi45IDAgOC41IDguOCA0LjcgMTQuNCAyLjEgMy4yIDUuNSA1LjYgNy43IDcuOCAzLjItMy43IDUuNS05LjUgNS41LTEzLjggMC04LjItNS41LTE1LjktMTYuNy0xNi41LTIwLS45LTIwLjIgMTYuNi0yMCAxOC45IC41IDUuMiAzLjQgNy44IDMuMyA3LjV6bS0uNCA2Yy0uNSAxLjgtNyAzLjctMTAuMiA2LjkgNC44LTEgNy0uMiA3LjggMS44IC41IDEuNC0uMiAzLjQtLjUgNS42IDEuNi0xLjggNy01LjUgMTEtNi4yLTEtLjMtMy40LS44LTQuMy0uOCAyLjktMy40IDkuMy00LjUgMTIuOC0zLjctMi4yLS4yLTYuNyAxLjEtOC41IDIuNiAxLjYgLjMgMyAuNiA0LjMgMS4xLTIuMSAuOC00LjggMy40LTUuOCA2LjEgNy01IDEzLjEgNS4yIDcgOC4yIC44IC4yIDIuNyAwIDMuNS0uNS0uMyAxLjEtMS45IDMtMyAzLjQgMi45IDAgNy0xLjkgOC4yLTQuNiAwIDAtMS44IC42LTIuNi0uMnMuMy00LjMgLjMtNC4zYy0yLjMgMi45LTMuNC0xLjMtMS4zLTQuMi0xLS4zLTMuNS0uNi00LjYtLjUgMy4yLTEuMSAxMC40LTEuOCAxMS4yLS4zIC42IDEuMS0xIDMuNC0xIDMuNCA0LS41IDguMyAxLjEgNi43IDUuMSAyLjktMS40IDUuNS01LjkgNC44LTEwLjQtLjMgMS0xLjYgMi40LTIuOSAyLjcgLjItMS40LTEtMi4yLTEuOS0yLjYgMS43LTkuNi0xNC42LTE0LjItMTQuMS0yMy45LTEgMS4zLTEuOCA1LS44IDcuMSAyLjcgMy4yIDguNyA2LjcgMTAuMSAxMi4yLTIuNi02LjQtMTUuMS0xMS40LTE0LjYtMjAuMi0xLjYgMS42LTIuNiA3LjgtMS4zIDExIDIuNCAxLjQgNC41IDMuOCA0LjggNi4xLTIuMi01LjEtMTEuNC02LjEtMTMuOS0xMi4yLS42IDIuMi0uMyA1IDEgNi43IDAgMC0yLjItLjgtNy0uNiAxLjcgLjYgNS4xIDMuNSA0LjggNS4yem0yNS45IDcuNGMtMi43IDAtMy41LTIuMS00LjItNC4zIDMuMyAxLjMgNC4yIDQuMyA0LjIgNC4zem0zOC45IDMuN2wtMS0uNmMtMS4xLTEtMi45LTEuNC00LjctMS40LTIuOSAwLTUuOCAxLjMtNy41IDMuNC0uOCAuOC0xLjQgMS44LTIuMSAyLjZsMCAxNS43YzMuNSAyLjYgNy4xLTIuOSAzLTcuMiAxLjUgLjMgNC42IDIuNyA1LjEgMy4yIDAgMCAyLjYtLjUgNS0uNSAyLjEgMCAzLjkgLjMgNS42IDEuMWwwLTE4LjRjLTEuMSAuNS0yLjIgMS0yLjcgMS40bC0uNyAuN3pNNzkuOSAzMDUuOWMxNy4yLTQuNiAxNi4yLTE4IDE2LjItMTkuOSAwLTIwLjYtMjQuMS0yNS0zNy0yNWwtNTYuMSAwIDguMyA4LjYgMCAyOS41LTExLjMgMCAxMS40IDE0LjYgMCAzMi4zLTguNCA4LjZjNjEuNyAwIDczLjggMS41IDg2LjQtNS45IDYuNy00IDkuOS05LjggOS45LTE3LjYgMC01LjEgMi42LTE4LjgtMTkuNC0yNS4yek0zOC42IDI3OC40YzIwIDAgMjkuNi0uOCAyOS42IDkuMWwwIDNjMCAxMi4xLTE5IDguOC0yOS42IDguOGwwLTIwLjl6bTAgNTkuMmwwLTIyLjZjMTIuMiAwIDMyLjctMi4zIDMyLjcgOC44bDAgNC41IC4yIDBjMCAxMS4yLTEyLjUgOS4zLTMyLjkgOS4zem0xMDEuMi0xOS4zbDIzLjEgLjIgMC0uMiAxNC4xLTIxLjItMzcuMiAwIDAtMTQuOSA1Mi40IDAtMTQuMS0yMSAwLS4yLTczLjUgLjIgNy40IDguMiAwIDc3LjEtNy40IDguMiA4MS4yIDAgMTQuMS0yMS4yLTYwLjEgLjIgMC0xNS40em0yMTQuNy02MC4xYy03My45IDAtNzcuNSA5OS4zLS4zIDk5LjMgNzcuOSAwIDc0LjEtOTkuMyAuMy05OS4zem0tLjMgNzcuNWMtMzcuNCAwLTM2LjktNTUuMyAuMi01NS4zIDM2LjggLjEgMzguOCA1NS4zLS4yIDU1LjN6bS05MS4zLTguM2w0NC4xLTY2LjItNDEuNyAwIDYuMSA3LjItMjAuNSAzNy4yLS4zIDAtMjEtMzcuMiA2LjQtNy4yLTQ0LjkgMCA0NC4xIDY1LjggLjIgMTkuNC03LjcgOC4yIDQyLjYgMC03LjItOC4yLS4yLTE5ek0yMzQuNSAxNzYuMWMxLjYgMS4zIDIuOSAyLjQgMi45IDYuNmwwIDM4LjhjMCA0LjItLjggNS4zLTIuNyA2LjQtLjEgLjEtNy41IDQuNS03LjkgNC42bDM1LjEgMGMxMCAwIDE3LjQtMS41IDI2LTguNi0uNi01IC4yLTkuNSAuOC0xMiAwLS4yLTEuOCAxLjQtMi43IDMuNSAwLTUuNyAxLjYtMTUuNCA5LjYtMjAuNS0uMSAwLTMuNy0uOC05IDEuMSAyLTMuMSAxMC03LjkgMTAuNC03LjktOC4yLTI2LTM4LTIyLjktMzIuMi0yMi45LTMwLjkgMC0zMi42IC4zLTM5LjktNCAuMSAuOCAuNSA4LjIgOS42IDE0Ljl6bTIxLjUgNS41YzQuNiAwIDIzLjEtMy4zIDIzLjEgMTcuMyAwIDIwLjctMTguNCAxNy4zLTIzLjEgMTcuM2wwLTM0LjZ6bTIyOC45IDc5LjZsNyA4LjMgMCA0Mi41LS4zIDBjLTUuNC0xNC40LTQyLjMtNDEuNS00NS4yLTUwLjlsLTMxLjYgMCA3LjQgOC41IDAgNzYuOS03LjIgOC4zIDM5IDAtNy40LTguMiAwLTQ3LjQgLjMgMGMzLjcgMTAuNiA0NC41IDQyLjkgNDguNSA1NS42bDIxLjMgMCAwLTg1LjIgNy40LTguMy0zOS4yLS4xek0zNzguMiAxNjUuMWMtMzIuMiAwLTMyLjggLjItMzkuOS00IC4xIC43IC41IDguMyA5LjYgMTQuOSAzLjEgMiAyLjkgNC4zIDIuOSA5LjUgMS44LTEuMSAzLjgtMi4yIDYuMS0zLTEuMSAxLjEtMi43IDIuNy0zLjUgNC41IDEtMS4xIDcuNS01LjEgMTQuNi0zLjUtMS42IC4zLTQgMS4xLTYuMSAyLjkgLjEgMCAyLjEtMS4xIDcuNS0uM2wwLTQuM2M0LjcgMCAyMy4xLTMuNCAyMy4xIDE3LjMgMCAyMC41LTE4LjUgMTcuMy0xOS43IDE3LjMgNS43IDQuNCA1LjggMTIgMi4yIDE2LjNsLjMgMGMzMy40IDAgMzYuNy0yNy4zIDM2LjctMzQgMC0zLjgtMS4xLTMyLTMzLjgtMzMuNnoiXQogICAgfTsKICAgIGZhTWljcm9zb2Z0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1pY3Jvc29mdCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmM2NhIiwgIk0wIDMybDIxNC42IDAgMCAyMTQuNi0yMTQuNiAwIDAtMjE0LjZ6bTIzMy40IDBsMjE0LjYgMCAwIDIxNC42LTIxNC42IDAgMC0yMTQuNnpNMCAyNjUuNGwyMTQuNiAwIDAgMjE0LjYtMjE0LjYgMCAwLTIxNC42em0yMzMuNCAwbDIxNC42IDAgMCAyMTQuNi0yMTQuNiAwIDAtMjE0LjZ6Il0KICAgIH07CiAgICBmYUZseSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmbHkiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZjQxNyIsICJNMTY1LjkgNDI3LjhjMTIuOSAxMS43IDMzLjcgMzMuMyAzMy4yIDUwLjcgMCAuOC0uMSAxLjYtLjEgMi41LTEuOCAxOS44LTE4LjggMzEuMS0zOS4xIDMxLTI1LS4xLTM5LjktMTYuOC0zOC43LTM1LjggMS0xNi4yIDIwLjUtMzYuNyAzMi40LTQ3LjYgMi4zLTIuMSAyLjctMi43IDUuNi0zLjYgMy40IDAgMy45IC4zIDYuNyAyLjh6TTMwMCA2Ny4zYy0xNi4zLTI1LjctMzguNi00MC42LTYzLjMtNTIuMS0yNS41LTEwLjctNTQuNi0xNS40LTc2LjYtMTUuMi00NC4xIDAtNzEuMiAxMy4yLTgxLjEgMTcuMy01My42IDI3LjktODQuNCA2OS45LTgyLjkgMTQxLjMgNy4xIDgyLjIgOTcgMTc2IDE1NS44IDIzMy44IDEuNyAxLjYgNC41IDQuNSA2LjIgNS4xbDMuMyAuMWMyLjEtLjcgMS44LS41IDMuNS0yLjEgNTIuMy00OS4yIDE0MC43LTE0NS44IDE1NS45LTIxNS43IDctMzkuMiAzLjEtNzIuNS0yMC44LTExMi41ek0xNTQuOSAzNTEuOWMtMjgtNTEuMS02NS4yLTEzMC43LTY5LjMtMTg5LTMuNC00Ny41IDExLjQtMTMxLjIgNjkuMy0xMzYuN2wwIDMyNS43ek0yOTYuOCAxODBjLTE2LjQgNTYuOC03Ny4zIDEyOC0xMTguOSAxNzAuMyAyNy44LTUxLjkgNjUuMi0xMzMuMyA2Ny4yLTE5MS45IDEuNi00NS45LTkuOC0xMDUuOC00OC0xMzEuNCA4OC44IDE4LjMgMTE1LjUgOTguMSA5OS43IDE1M3oiXQogICAgfTsKICAgIGZhQ2NTdHJpcGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY2Mtc3RyaXBlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYxZjUiLCAiTTQ5Mi40IDIyMC44Yy04LjkgMC0xOC43IDYuNy0xOC43IDIyLjdsMzYuNyAwYzAtMTYtOS4zLTIyLjctMTgtMjIuN3pNMzc1IDIyMy40Yy04LjIgMC0xMy4zIDIuOS0xNyA3bC4yIDUyLjhjMy41IDMuNyA4LjUgNi43IDE2LjggNi43IDEzLjEgMCAyMS45LTE0LjMgMjEuOS0zMy40IDAtMTguNi05LTMzLjItMjEuOS0zMy4xek01MjggMzJMNDggMzJDMjEuNSAzMiAwIDUzLjUgMCA4MEwwIDQzMmMwIDI2LjUgMjEuNSA0OCA0OCA0OGw0ODAgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTM1MmMwLTI2LjUtMjEuNS00OC00OC00OHpNMTIyLjIgMjgxLjFjMCAyNS42LTIwLjMgNDAuMS00OS45IDQwLjMtMTIuMiAwLTI1LjYtMi40LTM4LjgtOC4xbDAtMzMuOWMxMiA2LjQgMjcuMSAxMS4zIDM4LjkgMTEuMyA3LjkgMCAxMy42LTIuMSAxMy42LTguNyAwLTE3LTU0LTEwLjYtNTQtNDkuOSAwLTI1LjIgMTkuMi00MC4yIDQ4LTQwLjIgMTEuOCAwIDIzLjUgMS44IDM1LjMgNi41bDAgMzMuNGMtMTAuOC01LjgtMjQuNS05LjEtMzUuMy05LjEtNy41IDAtMTIuMSAyLjItMTIuMSA3LjcgMCAxNiA1NC4zIDguNCA1NC4zIDUwLjd6TTE5MSAyMjQuNWwtMjcgMCAwIDUwLjVjMCAyMC45IDIyLjUgMTQuNCAyNyAxMi42bDAgMjguOWMtNC43IDIuNi0xMy4zIDQuNy0yNC45IDQuNy0yMS4xIDAtMzYuOS0xNS41LTM2LjktMzYuNWwuMi0xMTMuOSAzNC43LTcuNCAwIDMwLjggMjYuOSAwIDAgMzAuM3ptNzQgMi40Yy00LjUtMS41LTE4LjctMy42LTI3LjEgNy40bDAgODQuNC0zNS41IDAgMC0xMjQuNSAzMC43IDAgMi4yIDEwLjVjOC4zLTE1LjMgMjQuOS0xMi4yIDI5LjYtMTAuNWwuMSAwIDAgMzIuN3ptNDQuMSA5MS44bC0zNS43IDAgMC0xMjQuNSAzNS43IDAgMCAxMjQuNXptMC0xNDIuOWwtMzUuNyA3LjYgMC0yOC45IDM1LjctNy42IDAgMjguOXptNzQuMSAxNDUuNWMtMTIuNCAwLTIwLTUuMy0yNS4xLTlsLS4xIDQwLjItMzUuNSA3LjUgMC0xNjUuOCAzMS4zIDAgMS44IDguOGM0LjktNC41IDEzLjktMTEuMSAyNy44LTExLjEgMjQuOSAwIDQ4LjQgMjIuNSA0OC40IDYzLjggMCA0NS4xLTIzLjIgNjUuNS00OC42IDY1LjZ6bTE2MC40LTUxLjVsLTY5LjUgMGMxLjYgMTYuNiAxMy44IDIxLjUgMjcuNiAyMS41IDE0LjEgMCAyNS4yLTMgMzQuOS03LjlsMCAyOC42Yy05LjcgNS4zLTIyLjQgOS4yLTM5LjQgOS4yLTM0LjYgMC01OC44LTIxLjctNTguOC02NC41IDAtMzYuMiAyMC41LTY0LjkgNTQuMy02NC45IDMzLjcgMCA1MS4zIDI4LjcgNTEuMyA2NS4xIDAgMy41LS4zIDEwLjktLjQgMTIuOXoiXQogICAgfTsKICAgIGZhV29yZHByZXNzU2ltcGxlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIndvcmRwcmVzcy1zaW1wbGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjQxMSIsICJNMjU2IDhhMjQ4IDI0OCAwIDEgMCAwIDQ5NiAyNDggMjQ4IDAgMSAwIDAtNDk2ek0zMyAyNTZjMC0zMi4zIDYuOS02MyAxOS4zLTkwLjdMMTU4LjcgNDU2LjdDODQuMyA0MjAuNSAzMyAzNDQuMiAzMyAyNTZ6TTI1NiA0NzljLTIxLjkgMC00My0zLjItNjMtOS4xbDY2LjktMTk0LjQgNjguNSAxODcuOGMuNSAxLjEgMSAyLjEgMS42IDMuMS0yMy4xIDguMS00OCAxMi42LTc0IDEyLjZ6bTMwLjctMzI3LjVjMTMuNC0uNyAyNS41LTIuMSAyNS41LTIuMSAxMi0xLjQgMTAuNi0xOS4xLTEuNC0xOC40IDAgMC0zNi4xIDIuOC01OS40IDIuOC0yMS45IDAtNTguNy0yLjgtNTguNy0yLjgtMTItLjctMTMuNCAxNy43LTEuNCAxOC40IDAgMCAxMS40IDEuNCAyMy40IDIuMWwzNC43IDk1LjItNDguOCAxNDYuMy04MS4yLTI0MS41YzEzLjQtLjcgMjUuNS0yLjEgMjUuNS0yLjEgMTItMS40IDEwLjYtMTkuMS0xLjQtMTguNCAwIDAtMzYuMSAyLjgtNTkuNCAyLjgtNC4yIDAtOS4xLS4xLTE0LjQtLjMgMzkuOS02MC41IDEwOC40LTEwMC41IDE4Ni4zLTEwMC41IDU4IDAgMTEwLjkgMjIuMiAxNTAuNiA1OC41LTEtLjEtMS45LS4yLTIuOS0uMi0yMS45IDAtMzcuNCAxOS4xLTM3LjQgMzkuNiAwIDE4LjQgMTAuNiAzMy45IDIxLjkgNTIuMyA4LjUgMTQuOCAxOC40IDMzLjkgMTguNCA2MS41IDAgMTkuMS03LjMgNDEuMi0xNyA3Mi4xbC0yMi4yIDc0LjMtODAuNy0yMzkuNnptODEuNCAyOTcuMmw2OC4xLTE5Ni45YzEyLjctMzEuOCAxNy01Ny4yIDE3LTc5LjkgMC04LjItLjUtMTUuOC0xLjUtMjIuOSAxNy40IDMxLjggMjcuMyA2OC4yIDI3LjMgMTA3IDAgODIuMy00NC42IDE1NC4xLTExMC45IDE5Mi43eiJdCiAgICB9OwogICAgZmFTZWxsc3kgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2VsbHN5IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYyMTMiLCAiTTU0MCAyMzcuM2MzLjEtMTIuMyA0LjMtMjQuOCA0LjMtMzcuNCAwLTkyLjUtNzUuNC0xNjcuOS0xNjcuOS0xNjcuOS03Ny4yIDAtMTQ0LjYgNTMtMTYzIDEyNy44LTE1LjMtMTMuMi0zNC45LTIwLjUtNTUuMi0yMC41LTQ2LjMgMC04NCAzNy43LTg0IDg0IDAgNy40IC45IDE1IDMuMSAyMi40LTQyLjkgMjAuMi03MC44IDYzLjctNzAuOCAxMTEuMiAwIDY4IDU1LjUgMTIzLjIgMTIzLjIgMTIzLjJsMzgxLjIgMGM2Ny43IDAgMTIzLjItNTUuMiAxMjMuMi0xMjMuMiAwLTU2LjQtMzguOS0xMDYtOTQuMS0xMTkuNXpNMjAwLjIgNDAxLjZjMCA4LjMtNyAxNS4zLTE1LjMgMTUuM2wtMzAuOSAwYy04LjMgMC0xNS4zLTctMTUuMy0xNS4zbDAtMTEwLjljMC04LjMgNy0xNS4zIDE1LjMtMTUuM2wzMC45IDBjOC4zIDAgMTUuMyA3IDE1LjMgMTUuM2wwIDExMC45em04OS41IDBjMCA4LjMtNyAxNS4zLTE1LjMgMTUuM2wtMzAuOSAwYy04LjMgMC0xNS4zLTctMTUuMy0xNS4zbDAtMTMxLjVjMC04LjMgNy0xNS4zIDE1LjMtMTUuM2wzMC45IDBjOC4zIDAgMTUuMyA3IDE1LjMgMTUuM2wwIDEzMS41em04OS41IDBjMCA4LjMtNyAxNS4zLTE1LjMgMTUuM2wtMzEgMGMtOC4zIDAtMTUuMy03LTE1LjMtMTUuM2wwLTE2Mi43YzAtOC4zIDctMTUuMyAxNS4zLTE1LjNsMzEgMGM4LjMgMCAxNS4zIDcgMTUuMyAxNS4zbDAgMTYyLjd6bTg3IDBjMCA4LjMtNyAxNS4zLTE1LjMgMTUuM2wtMjguNSAwYy04LjMgMC0xNS4zLTctMTUuMy0xNS4zbDAtMjI0LjZjMC04LjYgNy0xNS42IDE1LjMtMTUuNmwyOC41IDBjOC4zIDAgMTUuMyA3IDE1LjMgMTUuNmwwIDIyNC42eiJdCiAgICB9OwogICAgZmFEYXNoY3ViZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJkYXNoY3ViZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMjEwIiwgIk0zMjYuOSAxMDRsLTIxNi4yIDBjLTUxLjEgMC05MS4yIDQzLjMtOTEuMiA5My41bDAgMjI5LjVjMCA1MC41IDQwLjEgODUgOTEuMiA4NWwyMjcuMiAwYzUxLjEgMCA5MS4yLTM0LjUgOTEuMi04NWwwLTQyNy0xMDIuMiAxMDR6TTE1NC4yIDQxNi41Yy0xNy43IDAtMzIuNC0xNS4xLTMyLjQtMzIuOGwwLTE0Mi45YzAtMTcuNyAxNC43LTMyLjUgMzIuNC0zMi41bDE0MC43IDBjMTcuNyAwIDMyIDE0LjggMzIgMzIuNWwwIDEyMy41IDUxLjEgNTIuMy0yMjMuOCAwIDAtLjF6Il0KICAgIH07CiAgICBmYUdpdHRlciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnaXR0ZXIiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjQyNiIsICJNNjYuNCAzMjIuNWwtNTAuNCAwIDAtMzIyLjUgNTAuNCAwIDAgMzIyLjV6TTE2Ni45IDc2LjFsLTUwLjQgMCAwIDQzNS45IDUwLjQgMCAwLTQzNS45em0xMDAuNiAwbC01MC40IDAgMCA0MzUuOSA1MC40IDAgMC00MzUuOXpNMzY4IDc2bC01MC40IDAgMCAyNDcgNTAuNCAwIDAtMjQ3eiJdCiAgICB9OwogICAgZmFXb2xmUGFja0JhdHRhbGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ3b2xmLXBhY2stYmF0dGFsaW9uIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY1MTQiLCAiTTIzNi4yIDQ3MS41bDEwLjYgMTUuOCA1LjMtMTIuMyA1LjMgNyAwIDI5LjljMjEuMS03LjkgMjEuMS02Ni45IDI1LjUtOTcuMiA0LjYtMzEuOS0uOS05Mi44IDgxLjQtMTQ5LjEtOC45LTIzLjYtMTItNDkuNC0yLjYtODAgMjcuOSAzLjQgNTMuOSAxMC42IDYzLjMgNTQuMWwtMzAuMyA4LjRjMTEuMSAyMyAxNyA0Ni44IDEzLjIgNzIuMWwtMjcuMy03LTYuMiAzMy40LTE4LjUtNy04LjggMzMuNC0xOS40LTcgMjYuNCAyMS4xIDguOC0yOC4yIDI0LjYgNS4yIDctMzUuNiAyNi40IDE0LjVjLjItMjAgNy01OC4xLTguOC04NC41bDI2LjQgNS4zYzQtMjIuMS0yLjQtMzkuMi03LjktNTYuN2wyMi40IDkuN2MtLjQtMjUuMS0yOS45LTU2LjgtNjEuNi01OC41LTIwLjItMS4xLTU2LjctMjUuMi01NC4xLTUxLjkgMi0xOS45IDE3LjQtNDIuNiA0My4xLTQ5LjctNDQgMzYuNS05LjcgNjcuMyA1LjMgNzMuNSA0LjQtMTEuNCAxNy41LTY5LjEgMC0xMzAuMi00MC40IDIyLjktODkuNyA2NS4xLTkzLjIgMTQ3LjhsLTU4IDM4LjctMy41IDkzLjIgMTA3LjMtNTkuOCA3IDctMTcuNiAzLjUtNDQgMzguNy0xNS44LTUuMy0yOC4xIDQ5LjMtMy41IDExOS42IDIxLjEgMTUuOC0zMi41IDE1LjgtMzIuNi0xNS44IDIxLjEtMTUuOC0zLjUtMTE5LjYtMjguMi00OS4zLTE1LjggNS4zLTQ0LTM4LjctMTcuNi0zLjUgNy03IDEwNy4zIDU5LjgtMy41LTkzLjMtNTguMS0zOC43Yy0zLjUtODIuOC01Mi43LTEyNS05My4yLTE0Ny45LTE3LjUgNjEuMS00LjQgMTE4LjggMCAxMzAuMiAxNS02LjIgNDkuMy0zNyA1LjMtNzMuNSAyNS43IDcuMSA0MS4xIDI5LjggNDMuMSA0OS43IDIuNiAyNi43LTMzLjkgNTAuOC01NC4xIDUxLjktMzEuNyAxLjctNjEuMiAzMy40LTYxLjYgNTguNWwyMi40LTkuN0MxMy40IDIyNC43IDcgMjQxLjggMTEgMjYzLjlsMjYuNC01LjNjLTE1LjggMjYuNC05LjEgNjQuNC04LjggODQuNGwyNi40LTE0LjUgNyAzNS42IDI0LjYtNS4zIDguOCAyOC4yIDI2LjQtMjEuMS0xOS40IDctOC44LTMzLjQtMTguNSA3LTYuMi0zMy40LTI3LjMgN0MzOCAyOTQuOCA0My44IDI3MSA1NSAyNDhsLTMwLjMtOC40YzkuNC00My41IDM1LjUtNTAuOCA2My4zLTU0LjEgOS40IDMwLjYgNi4yIDU2LjUtMi42IDgwLjEgODIuMyA1Ni4zIDc2LjggMTE3LjIgODEuNCAxNDkuMSA0LjQgMzAuMyA0LjQgODkuMyAyNS41IDk3LjJsMC0yOS44IDUuMy03IDUuMyAxMi4zIDEwLjYtMTUuOCAxMS40IDIxLjEgMTEuNC0yMS4xIDAgMHptNzkuMi05NUwyOTkuNSAzNjZjNy41LTQuNCAxMy44LTguNCAxOS40LTEyLjMtLjYgNy4yLS4zIDEzLjgtMy41IDIyLjhsMCAwem0yOC4yLTQ5LjNjLS40IDEwLjktLjkgMjEuNy0xLjggMzEuNy03LjgtMS45LTE1LjYtMy44LTIxLjEtNyA4LjItNy45IDE1LjYtMTYuMyAyMi45LTI0LjdsMCAwem0yNC42IDUuM2MwLTEzLjQtMi4xLTI0LjItNS4zLTMzLjQtNS41IDkuNS0xMS43IDE4LjYtMTguNSAyNy4zbDIzLjggNi4yem0zLjUtODAuOWMxOS40IDEyLjggMjcuOCAzMy43IDI5LjkgNTYuMy0xMi4zLTQuNS0yNC42LTkuMy0zNy0xMC42IDUuMS0xMiA2LjYtMjguMSA3LTQ1LjdsMCAwem0tMS44LTQ1LjdjLjggMTQuMyAxLjggMjguOCAxLjggNDIuMiAxOS4yLTguMSAyOS44LTkuNyA0NC0xNC4xLTEwLjYtMTktMjcuMi0yNS41LTQ1LjgtMjguMmwwIDB6TTEzNC4yIDM3Ni41TDE1MCAzNjZjLTcuNS00LjQtMTMuOC04LjQtMTkuNC0xMi4zIC42IDcuMyAuMyAxMy45IDMuNSAyMi45bDAgMHpNMTA2IDMyNy4zYy40IDEwLjkgLjkgMjEuNyAxLjggMzEuNyA3LjgtMS45IDE1LjYtMy44IDIxLjEtNy04LjItNy45LTE1LjYtMTYuMy0yMi45LTI0Ljd6bS0yNC42IDUuM2MwLTEzLjQgMi0yNC4yIDUuMy0zMy40IDUuNSA5LjUgMTEuNyAxOC42IDE4LjUgMjcuM2wtMjMuOCA2LjJ6bS0zLjUtODAuOWMtMTkuNCAxMi44LTI3LjggMzMuNy0yOS45IDU2LjMgMTIuMy00LjUgMjQuNi05LjMgMzctMTAuNi01LTEyLTYuNi0yOC4xLTctNDUuN2wtLjEgMHptMS44LTQ1LjdjLS44IDE0LjMtMS44IDI4LjgtMS44IDQyLjItMTkuMi04LjEtMjkuOC05LjctNDQtMTQuMSAxMC42LTE5IDI3LjItMjUuNSA0NS44LTI4LjF6Il0KICAgIH07CiAgICBmYUxhc3RmbSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJsYXN0Zm0iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjIwMiIsICJNMjI1LjggMzY3LjFsLTE4LjgtNTFzLTMwLjUgMzQtNzYuMiAzNGMtNDAuNSAwLTY5LjItMzUuMi02OS4yLTkxLjUgMC03Mi4xIDM2LjQtOTcuOSA3Mi4xLTk3LjkgNjYuNSAwIDc0LjggNTMuMyAxMDAuOSAxMzQuOSAxOC44IDU2LjkgNTQgMTAyLjYgMTU1LjQgMTAyLjYgNzIuNyAwIDEyMi0yMi4zIDEyMi04MC45IDAtNzIuOS02Mi43LTgwLjYtMTE1LTkyLjEtMjUuOC01LjktMzMuNC0xNi40LTMzLjQtMzQgMC0xOS45IDE1LjgtMzEuNyA0MS42LTMxLjcgMjguMiAwIDQzLjQgMTAuNiA0NS43IDM1LjhsNTguNi03Yy00LjctNTIuOC00MS4xLTc0LjUtMTAwLjktNzQuNS01Mi44IDAtMTA0LjQgMTkuOS0xMDQuNCA4My45IDAgMzkuOSAxOS40IDY1LjEgNjggNzYuOCA0NC45IDEwLjYgNzkuOCAxMy44IDc5LjggNDUuNyAwIDIxLjctMjEuMSAzMC41LTYxIDMwLjUtNTkuMiAwLTgzLjktMzEuMS05Ny45LTczLjktMzItOTYuOC00My42LTE2My0xNjEuMy0xNjMtODYuMSAwLTEzMS44IDU0LjUtMTMxLjggMTQ3LjIgMCA4OS4xIDQ1LjcgMTM3LjIgMTI3LjkgMTM3LjIgNjYuMiAwIDk3LjktMzEuMSA5Ny45LTMxLjF6Il0KICAgIH07CiAgICBmYVNob3B3YXJlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNob3B3YXJlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1YjUiLCAiTTQwMy41IDQ1NS40Yy00Mi42IDMxLjctOTQuNCA0OC43LTE0Ny41IDQ4LjYtMTM3LjIgMC0yNDgtMTExLTI0OC0yNDggMC0xMzcuMiAxMTEtMjQ4IDI0OC0yNDggNjEuMi0uMSAxMjAuMiAyMi42IDE2NS43IDYzLjUgLjYgLjUgLjkgMS4yIDEuMSAxLjlzLjEgMS41LS4zIDIuMi0uOCAxLjMtMS41IDEuNi0xLjQgLjUtMi4yIC40Yy0xOC44LTIuNS0zNy43LTMuNy01Ni43LTMuNy0xMjkuNCAwLTIyMi40IDUzLjUtMjIyLjQgMTU1LjQgMCAxMDkgOTIuMSAxNDUuOSAxNzYuOCAxNzguNyAzMy42IDEzIDY1LjQgMjUuNCA4NyA0MS42IC40IC4zIC44IC44IDEuMSAxLjNzLjQgMSAuNCAxLjYtLjEgMS4xLS40IDEuNi0uNiAuOS0xLjEgMS4zbC0uMSAwek01MDMgMjMzLjFjLS4xLS45LS41LTEuOC0xLjMtMi40LTUxLjgtNDMtOTMuNi02MC41LTE0NC41LTYwLjUtODQuMSAwLTgwLjMgNTIuMi04MC4zIDUzLjYgMCA0Mi42IDUyLjEgNjIgMTEyLjMgODQuNSAzMS4xIDExLjYgNjMuMiAyMy42IDkyLjcgMzkuOSAuNCAuMiAuOSAuNCAxLjQgLjRzMSAwIDEuNS0uMiAuOS0uNCAxLjMtLjggLjYtLjggLjgtMS4yYzE0LjEtMzYgMTkuNS03NC44IDE2LTExMy4zeiJdCiAgICB9OwogICAgZmFCbG9nZ2VyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImJsb2dnZXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjM3YyIsICJNMTYyLjQgMTk2YzQuOC00LjkgNi4yLTUuMSAzNi40LTUuMSAyNy4yIDAgMjguMSAuMSAzMi4xIDIuMSA1LjggMi45IDguMyA3IDguMyAxMy42IDAgNS45LTIuNCAxMC03LjYgMTMuNC0yLjggMS44LTQuNSAxLjktMzEuMSAyLjEtMTYuNCAuMS0yOS41LS4yLTMxLjUtLjgtMTAuMy0yLjktMTQuMS0xNy43LTYuNi0yNS4zem02MS40IDk0LjVjLTUzLjkgMC01NS44IC4yLTYwLjIgNC4xLTMuNSAzLjEtNS43IDkuNC01LjEgMTMuOSAuNyA0LjcgNC44IDEwLjEgOS4yIDEyIDIuMiAxIDE0LjEgMS43IDU2LjMgMS4ybDQ3LjktLjYgOS4yLTEuNWM5LTUuMSAxMC41LTE3LjQgMy4xLTI0LjQtNS4zLTQuNy01LTQuNy02MC40LTQuN3pNNDQ3LjIgNDIwLjZjLTMuNSAyOC40LTIzIDUwLjQtNTEuMSA1Ny41LTcuMiAxLjgtOS43IDEuOS0xNzIuOSAxLjgtMTU3LjggMC0xNjUuOS0uMS0xNzItMS44LTguNC0yLjItMTUuNi01LjUtMjIuMy0xMC01LjYtMy44LTEzLjktMTEuOC0xNy0xNi40LTMuOC01LjYtOC4yLTE1LjMtMTAtMjJTMCA0MjAuMyAwIDI1Ni4zYzAtMTYzLjEgMC0xNjYuNiAxLjgtMTczLjcgNi4zLTI0LjcgMjUuOS00My42IDUxLjItNDkuMiA3LjMtMS42IDMzMi4xLTEuOSAzNDAtLjMgMjEuMiA0LjMgMzcuOSAxNy4xIDQ3LjYgMzYuNCA3LjcgMTUuMyA3LTEuNSA3LjMgMTgwLjYgLjIgMTE1LjggMCAxNjQuNS0uNyAxNzAuNXpNMzYxLjggMjM1LjRjLTEuMS01LTQuMi05LjYtNy43LTExLjUtMS4xLS42LTgtMS4zLTE1LjUtMS43LTEyLjQtLjYtMTMuOC0uOC0xNy44LTMuMS02LjItMy42LTcuOS03LjYtOC0xOC4zIDAtMjAuNC04LjUtMzkuNC0yNS4zLTU2LjUtMTItMTIuMi0yNS4zLTIwLjUtNDAuNi0yNS4xLTMuNi0xLjEtMTEuOC0xLjUtMzkuMi0xLjgtNDIuOS0uNS01Mi41IC40LTY3LjEgNi4yLTI3IDEwLjctNDYuMyAzMy40LTUzLjQgNjIuNC0xLjMgNS40LTEuNiAxNC4yLTEuOSA2NC4zLS40IDYyLjggMCA3Mi4xIDQgODQuNSA5LjcgMzAuNyAzNy4xIDUzLjQgNjQuNiA1OC40IDkuMiAxLjcgMTIyLjIgMi4xIDEzMy43IC41IDIwLjEtMi43IDM1LjktMTAuOCA1MC43LTI1LjkgMTAuNy0xMC45IDE3LjQtMjIuOCAyMS44LTM4LjUgMy4yLTEwLjkgMi45LTg4LjQgMS43LTkzLjl6Il0KICAgIH07CiAgICBmYUVkZ2UgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZWRnZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjgyIiwgIk0xMjAuMSAzNy40YzQxLTI1LjIgODcuNi0zOC4yIDEzNC45LTM3LjQgMTY4IDAgMjU3IDEyMy44IDI1NyAyMTkuNS0uMSAzMi43LTEzIDYzLjktMzUuOSA4Ny4yLTIyLjkgMjMuMi01NCAzNi41LTg2LjcgMzctNzUuMiAwLTkxLjUtMjMuMS05MS41LTMyIDAtMy44IDEuMi02LjIgNC44LTkuNGwxLTEuMiAuNC0xLjZjMTAuNS0xMS41IDE1LjktMjYuMiAxNS45LTQxLjYgMC03OC43LTgyLjItMTQyLjctMTg0LTE0Mi43LTM3LjUtLjMtNzQuNSA4LjktMTA3LjUgMjYuOSAyNy01Ny41IDgyLjctOTcuNiA5MS4zLTEwMy44IC44LS42IC4zLS44IC4zLS44em0xNS42IDMxOC4xYy0xLjQgMzAgNC42IDYwIDE2LjQgODcuMiAxMy42IDI2LjQgMzIuNyA1MSA1Ni41IDY5LjMtNTkuNS0xMS41LTExMS41LTQzLjktMTQ5LjQtODkuMy0zOC4xLTQ2LjQtNTkuMi0xMDQuMy01OS4yLTE2NC44IDAtNTEuMiA2Mi40LTk0LjQgMTM2LTk0LjQgMzYuNi0uNiA3Mi40IDEwLjkgMTAxLjggMzIuN2wtMy42IDEuMmMtNTEuNSAxNy42LTk4LjUgOTAuNy05OC41IDE1OC4xek00NjkuOCA0MDBsLS43IC4xYy0xMS44IDE4LjgtMjUuOSAzNS4xLTQyLjIgNDkuNS0zMC44IDI4LTY4LjEgNDUuNS0xMDguOCA0OS45LTE4LjYgLjMtMzYuOC0zLjItNTMuOC0xMS40LTI1LjYtMTAuMy00Ny4xLTMwLTYxLjYtNTMtMTQuNC0yMy45LTIxLjEtNTEuNy0xOS03OS42LS42LTIwLjEgNS40LTQwLjMgMTUtNTguMiAxMy45IDMzLjEgMzcuNSA2MS4zIDY3LjYgODAuOHM2NS41IDI5LjUgMTAxLjQgMjguNmMzMSAuMyA2Mi4xLTYuNyA5MC4yLTIwLjVsMS45LS45YzMuOS0yLjMgNy43LTMuOSAxMS42IDAgNC41IDQuOSAxLjggOS4yLTEuMiAxNC0uMiAuMi0uMyAuNS0uNCAuN3oiXQogICAgfTsKICAgIGZhSW94aG9zdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJpb3hob3N0IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYyMDgiLCAiTTYxNiAxNjBsLTY3LjMgMEM1MTEuMiA3MC43IDQyMi45IDggMzIwIDggMTgzIDggNzIgMTE5IDcyIDI1NiA3MiAyNzIuNCA3My42IDI4OC41IDc2LjcgMzA0TDI0IDMwNGMtMTMuMyAwLTI0IDEwLjgtMjQgMjQgMCAxMy4zIDEwLjcgMjQgMjQgMjRsNjcuMyAwYzM3LjUgODkuMyAxMjUuOCAxNTIgMjI4LjcgMTUyIDEzNyAwIDI0OC0xMTEgMjQ4LTI0OCAwLTE2LjQtMS42LTMyLjUtNC43LTQ4bDUyLjcgMGMxMy4zIDAgMjQtMTAuOCAyNC0yNCAwLTEzLjMtMTAuNy0yNC0yNC0yNHptLTk2IDk2YzAgMTEwLjUtODkuNSAyMDAtMjAwIDIwMC03NS43IDAtMTQxLjYtNDItMTc1LjUtMTA0TDQyNCAzNTJjMTMuMyAwIDI0LTEwLjggMjQtMjQgMC0xMy4zLTEwLjctMjQtMjQtMjRsLTI5OC4yIDBjLTMuOC0xNS40LTUuOC0zMS40LTUuOC00OCAwLTExMC41IDg5LjUtMjAwIDIwMC0yMDAgNzUuNyAwIDE0MS42IDQyIDE3NS41IDEwNEwyMTYgMTYwYy0xMy4zIDAtMjQgMTAuOC0yNCAyNCAwIDEzLjMgMTAuNyAyNCAyNCAyNGwyOTguMiAwYzMuOCAxNS40IDUuOCAzMS40IDUuOCA0OHpNMjE2IDIzMmwyMDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNCAwIDEzLjItMTAuNyAyNC0yNCAyNGwtMjA4IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0IDAtMTMuMiAxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFTY2hsaXggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2NobGl4IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzZWEiLCAiTTM1MC41IDE1Ny43bC01NC4yLTQ2LjEgNzMuNC0zOSA3OC4zIDQ0LjItOTcuNSA0MC45ek0xOTIgMTIyLjFsNDUuNy0yOC4yIDM0LjcgMzQuNi01NS40IDI5LTI1LTM1LjR6bS02NS4xIDYuNmwzMS45LTIyLjEgMTcuMiAyOC40LTM2LjcgMjIuNS0xMi40LTI4Ljh6bS0yMy4zIDg4LjJsLTguOC0zNC44IDI5LjYtMTguMyAxMy4xIDM1LjMtMzMuOSAxNy44ek04Mi40IDEzMy4ybDIzLjktMTguMSA4LjkgMjQtMjYuNyAxOC4zLTYuMS0yNC4yek01OSAyMDYuNWwtMy42LTI4LjQgMjIuMy0xNS41IDYuMSAyOC43LTI0LjggMTUuMnpNMjguNCAyMjMuMWwyMC44LTEyLjggMy4zIDMzLjQtMjIuOSAxMi0xLjItMzIuNnpNMS40IDI2OEwyMC42IDI1Ny44IDIxIDI5NiAwIDMwNC44IDEuNCAyNjh6bTU5LjEgNTkuM2wtMjguMyA4LjMtMS42LTQ2LjggMjUuMS0xMC43IDQuOCA0OS4yek05OSAyNjMuMmwtMzEuMSAxMy01LjItNDAuOCAyNy40LTE0LjQgOC45IDQyLjJ6TTEyMy4yIDM3N2wtNDEuNiA1LjktOC4xLTYzLjUgMzUuMi0xMC44IDE0LjUgNjguNHptMjguNS0xMzkuOWwyMS4yIDU3LjEtNDYuMiAxMy42LTEzLjctNTQuMSAzOC43LTE2LjZ6bTg1LjcgMjMwLjVsLTcwLjktMy4zLTI0LjMtOTUuOCA1NS4yLTguNiA0MCAxMDcuN3pNMTUyLjUgMTg3LjlsNDIuMi0yMi40IDI4IDQ1LjktNTAuOCAyMS4zLTE5LjQtNDQuOHptNDEgOTQuOWw2MS4zLTE4LjcgNTIuOCA4Ni42LTc5LjggMTEuMy0zNC4zLTc5LjJ6bTUxLjQtODUuNmw2Ny4zLTI4LjggNjUuNSA2NS40LTg4LjYgMjYuMi00NC4yLTYyLjh6Il0KICAgIH07CiAgICBmYURBbmREID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImQtYW5kLWQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjM4ZCIsICJNODIuOSA5OC45Yy0uNi0xNy4yIDItMzMuOCAxMi43LTQ4LjIgLjMgNy40IDEuMiAxNC41IDQuMiAyMS42IDUuOS0yNy41IDE5LjctNDkuMyA0Mi4zLTY1LjUtMS45IDUuOS0zLjUgMTEuOC0zIDE3LjcgOC43LTcuNCAxOC44LTE3LjggNDQuNC0yMi43IDE0LjctMi44IDI5LjctMiA0Mi4xIDEgMzguNSA5LjMgNjEgMzQuMyA2OS43IDcyLjMgNS4zIDIzLjEgLjcgNDUtOC4zIDY2LjQtNS4yIDEyLjQtMTIgMjQuNC0yMC43IDM1LjEtMi0xLjktMy45LTMuOC01LjgtNS42LTQyLjgtNDAuOC0yNi44LTI1LjItMzcuNC0zNy40LTEuMS0xLjItMS0yLjItLjEtMy42IDguMy0xMy41IDExLjgtMjguMiAxMC00NC0xLjEtOS44LTQuMy0xOC45LTExLjMtMjYuMi0xNC41LTE1LjMtMzkuMi0xNS01My41IC42LTExLjQgMTIuNS0xNC4xIDI3LjQtMTAuOSA0My42IC4yIDEuMyAuNCAyLjcgMCAzLjktMy40IDEzLjctNC42IDI3LjYtMi41IDQxLjYgLjEgLjUgLjEgMS4xIC4xIDEuNiAwIC4zLS4xIC41LS4yIDEuMS0yMS44LTExLTM2LTI4LjMtNDMuMi01Mi4yLTguMyAxNy44LTExLjEgMzUuNS02LjYgNTQuMS0xNS42LTE1LjItMjEuMy0zNC4zLTIyLTU1LjJ6TTU1Mi41IDIyMi4xYy0xMS42LTExLjYtMjUtMjAuNC00MC4xLTI2LjYtMTIuOC01LjItMjYtNy45LTM5LjktNy4xLTEwIC42LTE5LjYgMy4xLTI5IDYuNC0yLjUgLjktNS4xIDEuNi03LjcgMi4yLTQuOSAxLjItNy4zLTMuMS00LjctNi44IDMuMi00LjYgMy40LTQuMiAxNS0xMiAuNi0uNCAxLjItLjggMi4yLTEuNWwtMi41IDBjLS42IDAtMS4yIC4yLTEuOSAuMy0xOS4zIDMuMy0zMC43IDE1LjUtNDguOSAyOS42LTEwLjQgOC4xLTEzLjggMy44LTEyLS41IDEuNC0zLjUgMy4zLTYuNyA1LjEtMTAgMS0xLjggMi4zLTMuNCAzLjUtNS4xLS4yLS4yLS41LS4zLS43LS41LTI3IDE4LjMtNDYuNyA0Mi40LTU3LjcgNzMuMyAuMyAuMyAuNyAuNiAxIC45IC4zLS42IC41LTEuMiAuOS0xLjcgMTAuNC0xMi4xIDIyLjgtMjEuOCAzNi42LTI5LjggMTguMi0xMC42IDM3LjUtMTguMyA1OC43LTIwLjIgNC4zLS40IDguNy0uMSAxMy4xLS4xLTEuOCAuNy0zLjUgLjktNS4zIDEuMS0xOC41IDIuNC0zNS41IDktNTEuNSAxOC41LTMwLjIgMTcuOS01NC41IDQyLjItNzUuMSA3MC40LS4zIC40LS40IC45LS43IDEuMyAxNC41IDUuMyAyNCAxNy4zIDM2LjEgMjUuNiAuMi0uMSAuMy0uMiAuNC0uNGwxLjItMi43YzEyLjItMjYuOSAyNy01Mi4zIDQ2LjctNzQuNSAxNi43LTE4LjggMzgtMjUuMyA2Mi41LTIwIDUuOSAxLjMgMTEuNCA0LjQgMTcuMiA2LjggMi4zLTEuNCA1LjEtMy4yIDgtNC43IDguNC00LjMgMTcuNC03IDI2LjctOSAxNC43LTMuMSAyOS41LTQuOSA0NC41LTEuM2wwLS41Yy0uNS0uNC0xLjItLjgtMS43LTEuNHpNMzE3LjEgMzk3LjZjLTM5LjQtMzMtMjIuOC0xOS41LTQyLjctMzUuNi0uOCAuOSAwLS4yLTEuOSAzLTExLjIgMTkuMS0yNS41IDM1LjMtNDQgNDcuNi0xMC4zIDYuOC0yMS41IDExLjgtMzQuMSAxMS44LTIxLjYgMC0zOC4yLTkuNS00OS40LTI3LjgtMTItMTkuNS0xMy4zLTQwLjctOC4yLTYyLjYgNy44LTMzLjggMzAuMS01NS4yIDM4LjYtNjQuMy0xOC43LTYuMi0zMyAxLjctNDYuNCAxMy45IC44LTEzLjkgNC4zLTI2LjIgMTEuOC0zNy4zLTI0LjMgMTAuNi00NS45IDI1LTY0LjggNDMuOS0uMy01LjggNS40LTQzLjcgNS42LTQ0LjcgLjMtMi43LS42LTUuMy0zLTcuNC0yNC4yIDI0LjctNDQuNSA1MS44LTU2LjEgODQuNiA3LjQtNS45IDE0LjktMTEuNCAyMy42LTE2LjItOC4zIDIyLjMtMTkuNiA1Mi44LTcuOCAxMDEuMSA0LjYgMTkgMTEuOSAzNi44IDI0LjEgNTIuMyAyLjkgMy43IDYuMyA2LjkgOS41IDEwLjMgLjItLjIgLjQtLjMgLjYtLjUtMS40LTctMi4yLTE0LjEtMS41LTIxLjkgMi4yIDMuMiAzLjkgNiA1LjkgOC42IDEyLjYgMTYgMjguNyAyNy40IDQ3LjIgMzUuNiAyNSAxMS4zIDUxLjEgMTMuMyA3Ny45IDguNiA1NC45LTkuNyA5MC43LTQ4LjYgMTE2LTk4LjggMS0xLjggLjYtMi45LS45LTQuMnptMTcyLTQ2LjRjLTkuNS0zLjEtMjIuMi00LjItMjguNy0yLjkgOS45IDQgMTQuMSA2LjYgMTguOCAxMiAxMi42IDE0LjQgMTAuNCAzNC43LTUuNCA0NS42LTExLjcgOC4xLTI0LjkgMTAuNS0zOC45IDkuMS0xLjItLjEtMi4zLS40LTMtLjYgMi44LTMuNyA2LTcgOC4xLTEwLjggOS40LTE2LjggNS40LTQyLjEtOC43LTU2LjEtMi4xLTIuMS00LjYtMy45LTctNS45LS4zIDEuMy0uMSAyLjEgLjEgMi44IDQuMiAxNi42LTguMSAzMi40LTI0LjggMzEuOC03LjYtLjMtMTMuOS0zLjgtMTkuNi04LjUtMTkuNS0xNi4xLTM5LjEtMzIuMS01OC41LTQ4LjMtNS45LTQuOS0xMi41LTguMS0yMC4xLTguNy00LjYtLjQtOS4zLS42LTEzLjktLjktNS45LS40LTguOC0yLjgtMTAuNC04LjQtLjktMy40LTEuNS02LjgtMi4yLTEwLjItMS41LTguMS02LjItMTMtMTQuMy0xNC4yLTQuNC0uNy04LjktMS0xMy4zLTEuNS0xMy0xLjQtMTkuOC03LjQtMjIuNi0yMC4zLTUgMTEtMS42IDIyLjQgNy4zIDI5LjkgNC41IDMuOCA5LjMgNy4zIDEzLjggMTEuMiA0LjYgMy44IDcuNCA4LjcgNy45IDE0LjggLjQgNC43IC44IDkuNSAxLjggMTQuMSAyLjIgMTAuNiA4LjkgMTguNCAxNyAyNS4xIDE2LjUgMTMuNyAzMyAyNy4zIDQ5LjUgNDEuMSAxNy45IDE1IDEzLjkgMzIuOCAxMyA1Ni0uOSAyMi45IDEyLjIgNDIuOSAzMy41IDUxLjIgMSAuNCAyIC42IDMuNiAxLjEtMTUuNy0xOC4yLTEwLjEtNDQuMSAuNy01Mi4zIC4zIDIuMiAuNCA0LjMgLjkgNi40IDkuNCA0NC4xIDQ1LjQgNjQuMiA4NSA1Ni45IDE2LTIuOSAzMC42LTguOSA0Mi45LTE5LjggMi0xLjggMy43LTQuMSA1LjktNi41LTE5LjMgNC42LTM1LjggLjEtNTAuOS0xMC42IC43LS4zIDEuMy0uMyAxLjktLjMgMjEuMyAxLjggNDAuNi0zLjQgNTctMTcuNCAxOS41LTE2LjYgMjYuNi00Mi45IDE3LjQtNjYtOC4zLTIwLjEtMjMuNi0zMi4zLTQzLjgtMzguOXpNOTkuOCAxNzkuM2MtNS4zLTkuMi0xMy4yLTE1LjYtMjIuMS0yMS4zIDEzLjctLjUgMjYuNiAuMiAzOS42IDMuNy03LTEyLjItOC41LTI0LjctNS0zOC43IDUuMyAxMS45IDEzLjcgMjAuMSAyMy42IDI2LjggMTkuNyAxMy4yIDM1LjcgMTkuNiA0Ni43IDMwLjIgMy40IDMuMyA2LjMgNy4xIDkuNiAxMC45LS44LTIuMS0xLjQtNC4xLTIuMi02LTUtMTAuNi0xMy0xOC42LTIyLjYtMjUtMS44LTEuMi0yLjgtMi41LTMuNC00LjUtMy4zLTEyLjUtMy0yNS4xLS43LTM3LjYgMS01LjUgMi44LTEwLjkgNC41LTE2LjMgLjgtMi40IDIuMy00LjYgNC02LjYgLjYgNi45IDAgMjUuNSAxOS42IDQ2IDEwLjggMTEuMyAyMi40IDIxLjkgMzMuOSAzMi43IDkgOC41IDE4LjMgMTYuNyAyNS41IDI2LjggMS4xIDEuNiAyLjIgMy4zIDMuOCA0LjctNS0xMy0xNC4yLTI0LjEtMjQuMi0zMy44LTkuNi05LjMtMTkuNC0xOC40LTI5LjItMjcuNC0zLjMtMy00LjYtNi43LTUuMS0xMC45LTEuMi0xMC40IDAtMjAuNiA0LjMtMzAuMiAuNS0xIDEuMS0yIDEuOS0zLjMgLjUgNC4yIC42IDcuOSAxLjQgMTEuNiA0LjggMjMuMSAyMC40IDM2LjMgNDkuMyA2My41IDEwIDkuNCAxOS4zIDE5LjIgMjUuNiAzMS42IDQuOCA5LjMgNy4zIDE5IDUuNyAyOS42LS4xIC42IC41IDEuNyAxLjEgMiA2LjIgMi42IDEwIDYuOSA5LjcgMTQuMyA3LjctMi42IDEyLjUtOCAxNi40LTE0LjUgNC4yIDIwLjItOS4xIDUwLjMtMjcuMiA1OC43IC40LTQuNSA1LTIzLjQtMTYuNS0yNy43LTYuOC0xLjMtMTIuOC0xLjMtMjIuOS0yLjEgNC43LTkgMTAuNC0yMC42IC41LTIyLjQtMjQuOS00LjYtNTIuOCAxLjktNTcuOCA0LjYgOC4yIC40IDE2LjMgMSAyMy41IDMuMy0yIDYuNS00IDEyLjctNS44IDE4LjktMS45IDYuNSAyLjEgMTQuNiA5LjMgOS42IDEuMi0uOSAyLjMtMS45IDMuMy0yLjctMy4xIDE3LjktMi45IDE1LjktMi44IDE4LjMgLjMgMTAuMiA5LjUgNy44IDE1LjcgNy4zLTIuNSAxMS44LTI5LjUgMjcuMy00NS40IDI1LjggNy00LjcgMTIuNy0xMC4zIDE1LjktMTcuOS02LjUgLjgtMTIuOSAxLjYtMTkuMiAyLjRsLS4zLS45YzQuNy0zLjQgOC03LjggMTAuMi0xMy4xIDguNy0yMS4xLTMuNi0zOC0yNS0zOS45LTkuMS0uOC0xNy44IC44LTI1LjkgNS41IDYuMi0xNS42IDE3LjItMjYuNiAzMi42LTM0LjUtMTUuMi00LjMtOC45LTIuNy0yNC42LTYuMyAxNC42LTkuMyAzMC4yLTEzLjIgNDYuNS0xNC42LTUuMi0zLjItNDguMS0zLjYtNzAuMiAyMC45IDcuOSAxLjQgMTUuNSAyLjggMjMuMiA0LjItMjMuOCA3LTQ0IDE5LjctNjIuNCAzNS42IDEuMS00LjggMi43LTkuNSAzLjMtMTQuMyAuNi00LjUgLjgtOS4yIC4xLTEzLjYtMS41LTkuNC04LjktMTUuMS0xOS43LTE2LjMtNy45LS45LTE1LjYgLjEtMjMuMyAxLjMtLjkgLjEtMS43IC4zLTIuOSAwIDE1LjgtMTQuOCAzNi0yMS43IDUzLjEtMzMuNSA2LTQuNSA2LjgtOC4yIDMtMTQuOXptMTI4LjQgMjYuOGMzLjMgMTYgMTIuNiAyNS41IDIzLjggMjQuMy00LjYtMTEuMy0xMi4xLTE5LjUtMjMuOC0yNC4zeiJdCiAgICB9OwogICAgZmFWdWVqcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ2dWVqcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNDFmIiwgIk0zNTYuOSA2NC4zbC03Ni45IDAtNTYgODguNi00OC04OC42LTE3NiAwIDIyNCAzODMuNyAyMjQtMzgzLjctOTEuMSAwek01NS43IDk2LjNsNTMuOCAwIDExNC41IDE5OC4yIDExNC40LTE5OC4yIDUzLjggMC0xNjguMiAyODguMi0xNjguMy0yODguMnoiXQogICAgfTsKICAgIGZhTWV0YSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJtZXRhIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU0OWIiLCAiTTY0MCAzMTcuOWMwIDkxLjMtMzkuNCAxNDguNS0xMTAuMyAxNDguNS02Mi42IDAtOTUuOC0zNC42LTE1Ni45LTEzNi42bC0zMS40LTUyLjZjLTguMy0xMi41LTE0LjUtMjQuMi0yMS4yLTM1LTIwLjEgMzMuOC00Ny4xIDgzLTQ3LjEgODMtNjcgMTE2LjYtMTA0LjYgMTQxLjItMTU2LjkgMTQxLjItNzIuOCAwLTExNi4yLTU3LjMtMTE2LjItMTQ1LjkgMC0xNDMgNzkuOC0yNzguMSAxODMuOS0yNzguMSA1MC4yIDAgOTMuOCAyNC43IDE0NC44IDg5LjUgMzcuMS01MC4xIDc4LjEtODkuNSAxMzAuNi04OS41IDk5LjEgMCAxODAuNyAxMjUuNyAxODAuNyAyNzUuNXpNMjg3LjQgMTkyLjJjLTQyLjktNjIuMS03MC45LTgwLjUtMTA0LjQtODAuNS02MS45IDAtMTEzLjggMTA2LjEtMTEzLjggMjEwIDAgNDguNSAxOC41IDc1LjcgNDkuNiA3NS43IDMwLjIgMCA0OS0xOSAxMDMuMi0xMDMuOCAwIDAgMjQuNy0zOS4xIDY1LjQtMTAxLjR6TTUzMS4yIDM5Ny40YzMyLjIgMCA0Ni45LTI3LjUgNDYuOS03NC45IDAtMTI0LjItNTQuMy0yMjUuNC0xMjMuMi0yMjUuNC0zMy4yIDAtNjEuMSAyNS45LTk0LjkgNzggOS40IDEzLjggMTkuMSAyOSAyOS4zIDQ1LjRsMzcuNSA2Mi40YzU4LjcgOTQuMSA3My41IDExNC41IDEwNC40IDExNC41eiJdCiAgICB9OwogICAgZmFDcmVhdGl2ZUNvbW1vbnNTaGFyZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjcmVhdGl2ZS1jb21tb25zLXNoYXJlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0ZjIiLCAiTTI1NS42IDhDMzk3LjQgOCA1MDQgMTE4LjEgNTA0IDI1NiA1MDQgNDAzLjEgMzg1LjUgNTA0IDI1NS42IDUwNCAxMjEuNiA1MDQgOCAzOTQuNSA4IDI1NiA4IDEyMy4xIDExMi43IDggMjU1LjYgOHptLjggNDQuN2MtMTE4LjIgMC0yMDMuNyA5Ny45LTIwMy43IDIwMy4zIDAgMTA5LjggOTEuMiAyMDIuOCAyMDMuNyAyMDIuOCAxMDMuMiAwIDIwMi44LTgxLjEgMjAyLjgtMjAyLjggLjEtMTEzLjgtOTAuMi0yMDMuMy0yMDIuOC0yMDMuM3ptMTAxIDEzMi40YzcuOCAwIDEzLjcgNi4xIDEzLjcgMTMuN2wwIDE4Mi41YzAgNy43LTYuMSAxMy43LTEzLjcgMTMuN2wtMTM1LjEgMGMtNy43IDAtMTMuNy02LTEzLjctMTMuN2wwLTU0LTU0IDBjLTcuOCAwLTEzLjctNi0xMy43LTEzLjdsMC0xODIuNWMwLTguMiA2LjYtMTIuNyAxMi40LTEzLjdsMTM2LjQgMGM3LjcgMCAxMy43IDYgMTMuNyAxMy43bDAgNTQgNTQgMHpNMTY3LjkgMzAwLjNsNDAuNyAwIDAtMTAxLjRjMC03LjQgNS44LTEyLjYgMTItMTMuN2w1NS44IDAgMC00MC4zLTEwOC41IDAgMCAxNTUuNHptMTc2LjItODguMWwtMTA4LjUgMCAwIDE1NS40IDEwOC41IDAgMC0xNTUuNHoiXQogICAgfTsKICAgIGZhU3R1ZGlvdmluYXJpID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInN0dWRpb3ZpbmFyaSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmM2Y4IiwgIk00ODAuNyAxODcuN2w0LjIgMjggMCAyOC0yNS4xIDQ0LjEtMzkuOCA3OC40LTU2LjEgNjcuNS03OS4xIDM3LjgtMTcuNyAyNC41LTcuNyAxMi05LjYgNHMxNy4zLTYzLjYgMTkuNC02My42IDIwLjMgLjcgMjAuMyAuN2w2Ni43LTM4LjYtOTIuNSAyNi4xLTU1LjkgMzYuOC0yMi44IDI4LTYuNiAxLjQgMjAuOC03My42IDYuOS01LjUgMjAuNyAxMi45IDg4LjMtNDUuMiA1Ni44LTUxLjUgMTQuOC02OC40LTEyNS40IDIzLjMgMTUuMi0xOC4yLTE3My40LTUzLjMgODEuOS0xMC41LTE2Ni0xMjIuOSAxMTQuOSAxOC4xLTEwMS4zLTEwOCAyNTIuOSAxMjYuNi0zMS41LTM4IDEyNC40IDc0LjQtMTQzLjMtOTkgMTguNyAzOC40LTQ5LjYtMTguMS00NS41LTg0LjMgMTk0LjYgMTIyLTQyLjktNTUuOCAxMDggOTYuNCAxMi04LjktMjEtMTYuNCA0LjItMzcuOCAzNy44LTEwLjQgMjkuMiAyNC43IDExLjUgNC4yLTcgNi4yIDguNSAxMi0xMy4xIDcuNC0xMC4zIDIwLjIgMTAuNSAyMy45eiJdCiAgICB9OwogICAgZmFCaXRidWNrZXQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYml0YnVja2V0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjE4MTBdLCAiZjE3MSIsICJNMjIuMiAzMmMtMi4xIDAtNC4yIC40LTYuMSAxLjFzLTMuNyAxLjktNS4yIDMuNC0yLjcgMy4yLTMuNSA1LjEtMS4zIDQtMS4zIDYuMWMwIC45IC4xIDEuOSAuMiAyLjhMNzQuMSA0NjIuN2MuOCA1LjEgMy40IDkuNyA3LjMgMTNzOC44IDUuMiAxNCA1LjJsMzI1LjcgMGMzLjggLjEgNy41LTEuMyAxMC41LTMuN3M0LjktNS45IDUuNS05LjdMNTA1IDUwLjdjLjctNC4yLS4zLTguNC0yLjgtMTEuOXMtNi4yLTUuNy0xMC40LTYuNGMtLjktLjEtMS45LS4yLTIuOC0uMkwyMi4yIDMyek0zMDguMSAzMjkuOGwtMTA0IDAtMjguMS0xNDcgMTU3LjMgMC0yNS4yIDE0N3oiXQogICAgfTsKICAgIGZhVmsgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidmsiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjE4OSIsICJNMzEuNSA2My41QzAgOTUgMCAxNDUuNyAwIDI0N0wwIDI2NUMwIDM2Ni4zIDAgNDE3IDMxLjUgNDQ4LjVTMTEzLjcgNDgwIDIxNSA0ODBsMTcuOSAwYzEwMS40IDAgMTUyLjEgMCAxODMuNS0zMS41UzQ0OCAzNjYuMyA0NDggMjY1bDAtMTcuOWMwLTEwMS40IDAtMTUyLjEtMzEuNS0xODMuNVMzMzQuMyAzMiAyMzMgMzJMMjE1IDMyQzExMy43IDMyIDYzIDMyIDMxLjUgNjMuNXpNNzUuNiAxNjguM2w1MS4xIDBjMS43IDg1LjUgMzkuNCAxMjEuNyA2OS4zIDEyOS4ybDAtMTI5LjIgNDguMiAwIDAgNzMuN2MyOS41LTMuMiA2MC41LTM2LjggNzAuOS03My43bDQ4LjIgMGMtMy45IDE5LjItMTEuOCAzNy4zLTIzLjEgNTMuM3MtMjUuNyAyOS41LTQyLjUgMzkuNmMxOC43IDkuMyAzNS4yIDIyLjQgNDguNCAzOC41czIyLjkgMzQuOSAyOC4zIDU1bC01MyAwYy00LjktMTcuNS0xNC44LTMzLjEtMjguNi00NXMtMzAuNy0xOS40LTQ4LjctMjEuNmwwIDY2LjYtNS44IDBjLTEwMi4xIDAtMTYwLjMtNzAtMTYyLjgtMTg2LjV6Il0KICAgIH07CiAgICBmYUdpdGh1YiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnaXRodWIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjA5YiIsICJNMTczLjkgMzk3LjRjMCAyLTIuMyAzLjYtNS4yIDMuNi0zLjMgLjMtNS42LTEuMy01LjYtMy42IDAtMiAyLjMtMy42IDUuMi0zLjYgMy0uMyA1LjYgMS4zIDUuNiAzLjZ6bS0zMS4xLTQuNWMtLjcgMiAxLjMgNC4zIDQuMyA0LjkgMi42IDEgNS42IDAgNi4yLTJzLTEuMy00LjMtNC4zLTUuMmMtMi42LS43LTUuNSAuMy02LjIgMi4zem00NC4yLTEuN2MtMi45IC43LTQuOSAyLjYtNC42IDQuOSAuMyAyIDIuOSAzLjMgNS45IDIuNiAyLjktLjcgNC45LTIuNiA0LjYtNC42LS4zLTEuOS0zLTMuMi01LjktMi45ek0yNTIuOCA4Yy0xMzguNyAwLTI0NC44IDEwNS4zLTI0NC44IDI0NCAwIDExMC45IDY5LjggMjA1LjggMTY5LjUgMjM5LjIgMTIuOCAyLjMgMTcuMy01LjYgMTcuMy0xMi4xIDAtNi4yLS4zLTQwLjQtLjMtNjEuNCAwIDAtNzAgMTUtODQuNy0yOS44IDAgMC0xMS40LTI5LjEtMjcuOC0zNi42IDAgMC0yMi45LTE1LjcgMS42LTE1LjQgMCAwIDI0LjkgMiAzOC42IDI1LjggMjEuOSAzOC42IDU4LjYgMjcuNSA3Mi45IDIwLjkgMi4zLTE2IDguOC0yNy4xIDE2LTMzLjctNTUuOS02LjItMTEyLjMtMTQuMy0xMTIuMy0xMTAuNSAwLTI3LjUgNy42LTQxLjMgMjMuNi01OC45LTIuNi02LjUtMTEuMS0zMy4zIDIuNi02Ny45IDIwLjktNi41IDY5IDI3IDY5IDI3IDIwLTUuNiA0MS41LTguNSA2Mi44LTguNXM0Mi44IDIuOSA2Mi44IDguNWMwIDAgNDguMS0zMy42IDY5LTI3IDEzLjcgMzQuNyA1LjIgNjEuNCAyLjYgNjcuOSAxNiAxNy43IDI1LjggMzEuNSAyNS44IDU4LjkgMCA5Ni41LTU4LjkgMTA0LjItMTE0LjggMTEwLjUgOS4yIDcuOSAxNyAyMi45IDE3IDQ2LjQgMCAzMy43LS4zIDc1LjQtLjMgODMuNiAwIDYuNSA0LjYgMTQuNCAxNy4zIDEyLjEgMTAwLTMzLjIgMTY3LjgtMTI4LjEgMTY3LjgtMjM5IDAtMTM4LjctMTEyLjUtMjQ0LTI1MS4yLTI0NHpNMTA1LjIgMzUyLjljLTEuMyAxLTEgMy4zIC43IDUuMiAxLjYgMS42IDMuOSAyLjMgNS4yIDEgMS4zLTEgMS0zLjMtLjctNS4yLTEuNi0xLjYtMy45LTIuMy01LjItMXptLTEwLjgtOC4xYy0uNyAxLjMgLjMgMi45IDIuMyAzLjkgMS42IDEgMy42IC43IDQuMy0uNyAuNy0xLjMtLjMtMi45LTIuMy0zLjktMi0uNi0zLjYtLjMtNC4zIC43em0zMi40IDM1LjZjLTEuNiAxLjMtMSA0LjMgMS4zIDYuMiAyLjMgMi4zIDUuMiAyLjYgNi41IDEgMS4zLTEuMyAuNy00LjMtMS4zLTYuMi0yLjItMi4zLTUuMi0yLjYtNi41LTF6bS0xMS40LTE0LjdjLTEuNiAxLTEuNiAzLjYgMCA1LjlzNC4zIDMuMyA1LjYgMi4zYzEuNi0xLjMgMS42LTMuOSAwLTYuMi0xLjQtMi4zLTQtMy4zLTUuNi0yeiJdCiAgICB9OwogICAgZmFDb2RpZXBpZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjb2RpZXBpZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjg0IiwgIk00NDIuNSAyMDIuOWMzMC43IDAgMzMuNSA1My4xLS4zIDUzLjFsLTEwLjggMCAwIDQ0LjMtMjYuNiAwIDAtOTcuNCAzNy43IDB6TTQ5MiAzNTIuNkM0NDkuOSA0NDQuNSAzNzAuNCA1MDQgMjY4IDUwNCAxMzEgNTA0IDIwIDM5MyAyMCAyNTZTMTMxIDggMjY4IDhjOTcuNCAwIDE3Mi44IDUzLjcgMjE4LjIgMTM4LjRMMzAwLjIgMjU1LjIgNDkyIDM1Mi42em0tMzguNSAxMi41bC02MC4zLTMwLjdjLTI3LjEgNDQuMy03MC40IDcxLjQtMTIyLjQgNzEuNC04Mi41IDAtMTQ5LjItNjYuNy0xNDkuMi0xNDguOSAwLTgyLjUgNjYuNy0xNDkuMiAxNDkuMi0xNDkuMiA0OC40IDAgODguOSAyMy41IDExNi45IDYzLjRsNTkuNS0zNC42QzQwNi41IDczLjkgMzQyLjUgMzYuNSAyNjggMzYuNSAxNDYuOCAzNi41IDQ4LjUgMTM0LjggNDguNSAyNTZTMTQ2LjggNDc1LjUgMjY4IDQ3NS41Yzc4LjYgMCAxNDYuNS00Mi4xIDE4NS41LTExMC40eiJdCiAgICB9OwogICAgZmFQaWVkUGlwZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicGllZC1waXBlciIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMmFlIiwgIk00NDAuMiAyMy4yYy0yNi43IDYuOC02OC4xIDI4LjUtMTE0LjYgNjcuNS0zMC45LTE3LjUtNjUuOC0yNi43LTEwMS40LTI2LjctMTE0LjkgMC0yMDggOTMuMS0yMDggMjA4czkzLjEgMjA4IDIwOCAyMDggMjA4LTkzLjEgMjA4LTIwOGMuMS01NC4xLTIxLTEwNi4xLTU4LjctMTQ0LjgtNi42IDguNS0xMi4zIDE3LjctMTcgMjcuNCAyOC45IDMyLjMgNDQuOCA3NC4xIDQ0LjkgMTE3LjQgMCA5Ny43LTc5LjQgMTc3LjEtMTc3LjEgMTc3LjEtMzAuOCAwLTYxLTguMS04Ny42LTIzLjQgODIuOS0xMDcuMyAxNTAuOC0zNy44IDE4NC4zLTIyNi42IDUuOC0zMi42IDI4LTk0LjMgMTI2LjItMTYwLjIgOC4xLTUuNCAyLjQtMTguMS03LTE1Ljd6TTEwOS4zIDQwNi40Qzg5LjggMzg5LjggNzQuMiAzNjkuMiA2My41IDM0NnMtMTYuMy00OC41LTE2LjMtNzRjMC05Ny43IDc5LjQtMTc3LjEgMTc3LjEtMTc3LjEgMjYuNiAwIDUyLjggNi4xIDc2LjYgMTcuOC02NiA2Mi4xLTEyNi45IDE1Mi45LTE5MS42IDI5My44eiJdCiAgICB9OwogICAgZmFSYXNwYmVycnlQaSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJyYXNwYmVycnktcGkiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjdiYiIsICJNMzkyLjUgMjMyLjVsLTMuNy02LjVjLjEtNDYuNC0yMS40LTY1LjMtNDYuNS03OS43IDcuNi0yIDE1LjQtMy42IDE3LjYtMTMuMiAxMy4xLTMuMyAxNS44LTkuNCAxNy4xLTE1LjggMy40LTIuMyAxNC44LTguNyAxMy42LTE5LjcgNi40LTQuNCAxMC0xMC4xIDguMS0xOC4xIDYuOS03LjUgOC43LTEzLjcgNS44LTE5LjQgOC4zLTEwLjMgNC42LTE1LjYgMS4xLTIwLjkgNi4yLTExLjIgLjctMjMuMi0xNi42LTIxLjItNi45LTEwLjEtMjEuOS03LjgtMjQuMi03LjgtMi42LTMuMi02LTYtMTYuNS00LjctNi44LTYuMS0xNC40LTUtMjIuMy0yLjEtOS4zLTcuMy0xNS41LTEuNC0yMi42IC44LTExLjMtMy42LTEzLjkgMS4zLTE5LjQgMy40LTEyLjMtMi42LTE2LjEgMy0yMiA4LjlsLTYuOS0uMWMtMTguNiAxMC44LTI3LjggMzIuOC0zMS4xIDQ0LjEtMy4zLTExLjMtMTIuNS0zMy4zLTMxLjEtNDQuMWwtNi45IC4xYy01LjktNS45LTkuNy0xMS41LTIyLTguOS01LjYtMi04LjEtNy0xOS40LTMuNC00LjYtMS40LTguOS00LjQtMTMuOS00LjMtMi42IC4xLTUuNSAxLTguNyAzLjUtNy45LTMtMTUuNS00LTIyLjMgMi4xLTEwLjUtMS4zLTE0IDEuNC0xNi41IDQuNy0yLjMgMC0xNy4zLTIuMy0yNC4yIDcuOC0xNy4zLTItMjIuNyAxMC0xNi41IDIxLjItMy41IDUuNC03LjIgMTAuNyAxLjEgMjAuOS0yLjkgNS43LTEuMSAxMS45IDUuOCAxOS40LTEuOCA4IDEuOCAxMy43IDguMSAxOC4xLTEuMiAxMSAxMC4yIDE3LjQgMTMuNiAxOS43IDEuMyA2LjQgNCAxMi40IDE3LjEgMTUuOCAyLjIgOS41IDEwIDExLjIgMTcuNiAxMy4yLTI1LjEgMTQuNC00Ni42IDMzLjMtNDYuNSA3OS43bC0zLjcgNi41Yy0yOC44IDE3LjItNTQuNyA3Mi43LTE0LjIgMTE3LjcgMi42IDE0LjEgNy4xIDI0LjIgMTEgMzUuNCA1LjkgNDUuMiA0NC41IDY2LjMgNTQuNiA2OC44IDE0LjkgMTEuMiAzMC44IDIxLjggNTIuMiAyOS4yIDIwLjMgMjAuNiA0Mi4zIDI4LjQgNjQuMyAyOC40bDEgMGMyMi4xIDAgNDQtNy44IDY0LjItMjguNCAyMS41LTcuNCAzNy4zLTE4IDUyLjItMjkuMiAxMC4yLTIuNSA0OC43LTIzLjYgNTQuNi02OC44IDMuOS0xMS4yIDguNC0yMS4zIDExLTM1LjQgNDAuNi00NS4xIDE0LjctMTAwLjUtMTQtMTE3Ljd6bS0yMi4yLThjLTEuNSAxOC43LTk4LjktNjUuMS04Mi4xLTY3LjkgNDUuNy03LjUgODMuNiAxOS4yIDgyLjEgNjcuOXptLTQzIDkzLjFjLTI0LjUgMTUuOC01OS44IDUuNi03OC44LTIyLjhzLTE0LjYtNjQuMiA5LjktODAgNTkuOC01LjYgNzguOCAyMi44IDE0LjYgNjQuMi05LjkgODB6TTI1OS40IDI5LjNjLjggNC4yIDEuOCA2LjggMi45IDcuNiA1LjQtNS44IDkuOC0xMS43IDE2LjgtMTcuMyAwIDMuMy0xLjcgNi44IDIuNSA5LjQgMy43LTUgOC44LTkuNSAxNS41LTEzLjMtMy4yIDUuNi0uNiA3LjMgMS4yIDkuNiA1LjEtNC40IDEwLTguOCAxOS40LTEyLjMtMi42IDMuMS02LjIgNi4yLTIuNCA5LjggNS4zLTMuMyAxMC42LTYuNiAyMy4xLTguOS0yLjggMy4xLTguNyA2LjMtNS4xIDkuNCA2LjYtMi41IDE0LTQuNCAyMi4xLTUuNC0zLjkgMy4yLTcuMSA2LjMtMy45IDguOCA3LjEtMi4yIDE2LjktNS4xIDI2LjQtMi42bC02IDYuMWMtLjcgLjggMTQuMSAuNiAyMy45IC44LTMuNiA1LTcuMiA5LjctOS4zIDE4LjIgMSAxIDUuOCAuNCAxMC40IDAtNC43IDkuOS0xMi44IDEyLjMtMTQuNyAxNi42IDIuOSAyLjIgNi44IDEuNiAxMS4yIC4xLTMuNCA2LjktMTAuNCAxMS43LTE2IDE3LjMgMS40IDEgMy45IDEuNiA5LjcgLjktNS4yIDUuNS0xMS40IDEwLjUtMTguOCAxNSAxLjMgMS41IDUuOCAxLjUgMTAgMS42LTYuNyA2LjUtMTUuMyA5LjktMjMuNCAxNC4yIDQgMi43IDYuOSAyLjEgMTAgMi4xLTUuNyA0LjctMTUuNCA3LjEtMjQuNCAxMCAxLjcgMi43IDMuNCAzLjQgNy4xIDQuMS05LjUgNS4zLTIzLjIgMi45LTI3IDUuNiAuOSAyLjcgMy42IDQuNCA2LjcgNS44LTE1LjQgLjktNTcuMy0uNi02NS40LTMyLjMgMTUuNy0xNy4zIDQ0LjQtMzcuNSA5My43LTYyLjYtMzguNCAxMi44LTczIDMwLTEwMiA1My41LTM0LjMtMTUuOS0xMC44LTU1LjkgNS44LTcxLjh6TTIyNSAxNDMuOWMyNC4yLS4zIDU0LjEgMTcuOCA1NCAzNC43LS4xIDE1LTIxIDI3LjEtNTMuOCAyNi45LTMyLjEtLjQtNTMuNy0xNS4yLTUzLjYtMjkuOCAwLTExLjkgMjYuMi0zMi41IDUzLjQtMzEuOHpNMTAyIDEzMS4xYzMuNy0uNyA1LjQtMS41IDcuMS00LjEtOS0yLjgtMTguNy01LjMtMjQuNC0xMCAzLjEgMCA2IC43IDEwLTIuMS04LjEtNC4zLTE2LjctNy43LTIzLjQtMTQuMiA0LjItLjEgOC43IDAgMTAtMS42LTcuNC00LjUtMTMuNi05LjUtMTguOC0xNSA1LjggLjcgOC4zIC4xIDkuNy0uOS01LjYtNS42LTEyLjctMTAuNC0xNi0xNy4zIDQuMyAxLjUgOC4zIDIgMTEuMi0uMS0xLjktNC4yLTEwLTYuNy0xNC43LTE2LjYgNC42IC40IDkuNCAxIDEwLjQgMC0yLjEtOC41LTUuOC0xMy4zLTkuMy0xOC4yIDkuOC0uMSAyNC42IDAgMjMuOS0uOGwtNi02LjFjOS41LTIuNSAxOS4zIC40IDI2LjQgMi42IDMuMi0yLjUtLjEtNS42LTMuOS04LjggOC4xIDEuMSAxNS40IDIuOSAyMi4xIDUuNCAzLjUtMy4xLTIuMy02LjMtNS4xLTkuNCAxMi41IDIuMyAxNy44IDUuNiAyMy4xIDguOSAzLjgtMy42IC4yLTYuNy0yLjQtOS44IDkuNCAzLjQgMTQuMyA3LjkgMTkuNCAxMi4zIDEuNy0yLjMgNC40LTQgMS4yLTkuNiA2LjcgMy44IDExLjggOC4zIDE1LjUgMTMuMyA0LjEtMi42IDIuNS02LjIgMi41LTkuNCA3IDUuNiAxMS40IDExLjUgMTYuOCAxNy4zIDEuMS0uOCAyLTMuNCAyLjktNy42IDE2LjYgMTUuOSA0MC4xIDU1LjkgNiA3MS44LTI5LTIzLjUtNjMuNi00MC43LTEwMi01My41IDQ5LjMgMjUgNzggNDUuMyA5My43IDYyLjYtOCAzMS44LTUwIDMzLjItNjUuNCAzMi4zIDMuMS0xLjQgNS44LTMuMiA2LjctNS44LTQtMi44LTE3LjYtLjQtMjcuMi01LjZ6bTYwLjEgMjQuMWMxNi44IDIuOC04MC42IDg2LjUtODIuMSA2Ny45LTEuNS00OC43IDM2LjUtNzUuNSA4Mi4xLTY3Ljl6TTU4LjcgMzQyYy0yMy43LTE4LjgtMzEuMy03My43IDEyLjYtOTguMyAyNi41LTcgOSAxMDcuOC0xMi42IDk4LjN6bTkxIDk4LjJjLTEzLjMgNy45LTQ1LjggNC43LTY4LjgtMjcuOS0xNS41LTI3LjQtMTMuNS01NS4yLTIuNi02My40IDE2LjMtOS44IDQxLjUgMy40IDYwLjkgMjUuNiAxNi45IDIwIDI0LjYgNTUuMyAxMC41IDY1Ljd6TTEyMy4zIDMyMC41Yy0yNC41LTE1LjgtMjguOS01MS42LTkuOS04MHM1NC4zLTM4LjYgNzguOC0yMi44IDI4LjkgNTEuNiA5LjkgODBjLTE5LjEgMjguNC01NC40IDM4LjYtNzguOCAyMi44ek0yMjUuNSA0OTZjLTI5LjQgMS4yLTU4LjItMjMuNy01Ny44LTMyLjMtLjQtMTIuNyAzNS44LTIyLjYgNTkuMy0yMiAyMy43LTEgNTUuNiA3LjUgNTUuNyAxOC45IC41IDExLTI4LjggMzUuOS01Ny4yIDM1LjR6bTU4LjktMTI0LjljLjIgMjkuNy0yNi4yIDUzLjgtNTguOCA1NHMtNTkuMi0yMy44LTU5LjQtNTMuNGwwLS42Yy0uMi0yOS43IDI2LjItNTMuOCA1OC44LTU0czU5LjIgMjMuOCA1OS40IDUzLjRsMCAuNnptODIuMiA0Mi43Yy0yNS4zIDM0LjYtNTkuNiAzNS45LTcyLjMgMjYuMy0xMy4zLTEyLjQtMy4yLTUwLjkgMTUuMS03MiAyMC45LTIzLjMgNDMuMy0zOC41IDU4LjktMjYuNiAxMC41IDEwLjMgMTYuNyA0OS4xLTEuNyA3Mi4zem0yMi45LTczLjJjLTIxLjUgOS40LTM5LTEwNS4zLTEyLjYtOTguMyA0My45IDI0LjcgMzYuMyA3OS42IDEyLjYgOTguM3oiXQogICAgfTsKICAgIGZhQ3NzMyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjc3MzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxM2MiLCAiTTQ4MCAzMmwtNjQgMzY4LTIyMy4zIDgwLTE5Mi43LTgwIDE5LjYtOTQuOCA4MiAwLTggNDAuNiAxMTYuNCA0NC40IDEzNC4xLTQ0LjQgMTguOC05Ny4xLTMzMy40IDAgMTYtODIgMzMzLjcgMCAxMC41LTUyLjctMzMzLjQgMCAxNi4zLTgyIDQwNy40IDB6Il0KICAgIH07CiAgICBmYUh1YnNwb3QgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaHVic3BvdCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmM2IyIiwgIk0yMzUuOCAyMTEuNmMtMjUuMSAyMy43LTQwLjggNTcuMy00MC44IDk0LjYgMCAyOS4zIDkuNyA1Ni4zIDI2IDc4TDE3MS41IDQzNGMtNC40LTEuNi05LjEtMi41LTE0LTIuNS0xMC44IDAtMjAuOSA0LjItMjguNSAxMS44cy0xMS44IDE3LjgtMTEuOCAyOC42IDQuMiAyMC45IDExLjggMjguNSAxNy44IDExLjYgMjguNSAxMS42YzEwLjggMCAyMC45LTMuOSAyOC42LTExLjYgNy42LTcuNiAxMS44LTE3LjggMTEuOC0yOC41IDAtNC4yLS42LTguMi0xLjktMTIuMWw1MC01MC4yYzIyIDE2LjkgNDkuNCAyNi45IDc5LjMgMjYuOSA3MS45IDAgMTMwLTU4LjMgMTMwLTEzMC4yIDAtNjUuMi00Ny43LTExOS4yLTExMC4yLTEyOC43bDAtNjEuNmMxNy41LTcuNCAyOC4yLTIzLjggMjguMi00Mi45IDAtMjYuMS0yMC45LTQ3LjktNDctNDcuOVMyNzkuNiA0NyAyNzkuNiA3My4xYzAgMTkuMSAxMC43IDM1LjUgMjguMiA0Mi45bDAgNjEuMmMtMTUuMiAyLjEtMjkuNiA2LjctNDIuNyAxMy42LTI3LjYtMjAuOS0xMTcuNS04NS43LTE2OC45LTEyNC44IDEuMi00LjQgMi05IDItMTMuOCAwLTI4LjgtMjMuNS01Mi4yLTUyLjQtNTIuMi0yOC44IDAtNTIuMiAyMy40LTUyLjIgNTIuMiAwIDI4LjkgMjMuNCA1Mi4zIDUyLjIgNTIuMyA5LjggMCAxOC45LTIuOSAyNi44LTcuNkwyMzUuOCAyMTEuNnptODkuNSAyNS42YTY5IDY5IDAgMSAxIDAgMTM4IDY5IDY5IDAgMSAxIDAtMTM4eiJdCiAgICB9OwogICAgZmFDbXBsaWQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY21wbGlkIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImUzNjAiLCAiTTIyNi4xIDM4OC4yYzAtLjctLjItMS41LS42LTIuMXMtMS0xLjEtMS43LTEuNGMtLjUtLjItMS4xLS40LTEuNi0uNGwtMTQ5LjYgMGMtMy4xIDAtNi4yLS44LTguOS0yLjJzLTUuMS0zLjUtNi45LTYuMS0yLjktNS41LTMuMy04LjYgMC02LjIgMS4xLTkuMUw4MS42IDI1NS43YzItNy4yIDYuMi0xMy41IDEyLTE4LjJzMTIuOS03LjQgMjAuNC03LjhsMTQ4LjYgMGMxLjUtLjEgMi45LS42IDQtMS42czItMi4yIDIuNC0zLjZsMTAuOC00MS4xYy40LTEgLjMtMi0uMS0yLjlzLTEuMi0xLjYtMi4xLTJjLS40LS4yLS45LS4zLTEuNC0uMy0uMSAwLS4xIDAtLjIgMGwtMTQ4LjUgMGMtMjIuMiAxLjItNDMuNCA5LjItNjAuOCAyM3MtMzAgMzIuNy0zNi4yIDU0LjFMMy41IDM1OC44Yy0zLjIgOC43LTQuMiAxOC0zIDI3LjFzNC42IDE3LjkgOS45IDI1LjUgMTIuMyAxMy44IDIwLjUgMTggMTcuMyA2LjUgMjYuNSA2LjZjMSAwIDEuOSAwIDIuOS0uMWwxNDguNiAwYzEuNS0uMSAyLjktLjcgNC0xLjZzMi0yLjIgMi40LTMuNmwxMC43LTQxLjFjLjItLjUgLjMtLjkgLjMtMS40em04MC41LTMwN2MuMi0uNCAuMy0uOSAuMy0xLjQgMC0uNS0uMS0xLS4zLTEuNXMtLjUtLjktLjgtMS4yLS44LS42LTEuMi0uOC0xLS4zLTEuNS0uM2wtNDEuMiAwYy0xLjUgLjEtMi45IC42LTQgMS42cy0yIDIuMi0yLjQgMy42bC0yMS4zIDgwLjkgNTEuMSAwIDIxLjQtODAuOXptLTEyNi4zIDI4N2w1MS4xIDAgMzItMTIyLjYtNTEuMSAwLTMyIDEyMi42ek01MTEuOSA3OS43YzAtMS0uNS0xLjktMS4yLTIuNnMtMS43LTEuMS0yLjYtMS4xYy0uMSAwLS4xIDAtLjIgMGwtNDEgMGMtMS41IC4xLTIuOSAuNi00LjEgMS41cy0yIDIuMi0yLjUgMy42TDM2OC45IDQzMC42Yy0uMiAuNC0uMyAuOS0uMyAxLjMgMCAxIC40IDIgMS4xIDIuN3MxLjcgMS4xIDIuNyAxLjFsNDEuMiAwYzEuNS0uMSAyLjktLjYgNC0xLjZzMi0yLjIgMi40LTMuNkw1MTEuNSA4MS4yYy4yLS41IC4zLTEgLjMtMS41ek0zMjQuNiAzODQuNWwtNDEgMGMtMS41IC4xLTIuOSAuNy00IDEuNnMtMiAyLjItMi40IDMuNmwtMTAuNyA0MS4xYy0uMiAuNC0uMyAuOS0uMyAxLjQgMCAuNSAuMSAxIC4zIDEuNXMuNSAuOSAuOCAxLjIgLjggLjYgMS4yIC44IDEgLjMgMS41IC4zYy4xIDAgLjIgMCAuMyAwbDQwLjkgMGMxLjUtLjEgMi45LS42IDQtMS42czItMi4yIDIuNC0zLjZsMTAuOC00MS4xYy4yLS42IC4zLTEuMiAuMy0xLjhzLS4zLTEuMi0uNi0xLjctLjgtLjktMS4zLTEuMi0xLjItLjQtMS44LS40Yy0uMSAwLS4yIDAtLjMgMGwwIDB6TTYzNiA3Ni4xbC00MSAwYy0xLjUgLjEtMi45IC42LTQgMS41cy0yIDIuMi0yLjQgMy42TDQ5Ny4xIDQzMC42Yy0uMiAuNC0uMiAuOS0uMiAxLjMgMCAxIC40IDIgMS4xIDIuN3MxLjcgMS4xIDIuNyAxLjFsNDEuMSAwYzEuNS0uMSAyLjktLjYgNC0xLjZzMi0yLjIgMi40LTMuNkw2MzkuNyA4MS4yYy4yLS41IC4zLTEgLjMtMS41LS4xLTEtLjUtMS45LTEuMi0yLjVzLTEuNi0xLTIuNi0xYy0uMSAwLS4xIDAtLjIgMGwwLS4xek0zNzEuNiAyMjUuMmwxMC44LTQxLjFjLjItLjQgLjItLjkgLjItMS40IDAtMS0uNC0yLTEuMS0yLjdzLTEuNy0xLjEtMi43LTEuMWwtNDEuMyAwYy0xLjUgLjEtMi45IC43LTQgMS42cy0yIDIuMi0yLjQgMy42bC0xMC44IDQxLjFjLS4yIC41LS4zIDEtLjMgMS41bDAgLjJjLjEgMSAuNSAxLjggMS4yIDIuNXMxLjYgMSAyLjYgMWMuMSAwIC4yIDAgLjMgMGw0MS4xIDBjMS41LS4xIDIuOS0uNiA0LTEuNnMyLTIuMiAyLjQtMy42eiJdCiAgICB9OwogICAgZmFEeWFsb2cgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZHlhbG9nIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzOTkiLCAiTTE2IDMybDAgMTE5LjIgNjQgMCAwLTU1LjIgMTA3LjIgMEMzMDAuNiA5NiAzNjggMTc2LjIgMzY4IDI1NS45IDM2OCAzMzIgMzA5LjQgNDE2IDE4Ny4yIDQxNmwtMTcxLjIgMCAwIDY0IDE3MS4yIDBDMzQ3LjkgNDgwIDQzMiAzNjcuMyA0MzIgMjU1LjkgNDMyIDE5Ny4yIDQwOS45IDE0Mi41IDM2OS43IDEwMS42IDMyNC45IDU2IDI2MS43IDMyIDE4Ny4yIDMyTDE2IDMyeiJdCiAgICB9OwogICAgZmFFbGVtZW50b3IgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZWxlbWVudG9yIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0MzAiLCAiTS41IDI1NmMwIDE0MSAxMTMuNiAyNTUgMjU0LjYgMjU1IDE0MiAwIDI1Ni0xMTQgMjU2LTI1NSAwLTE0MC0xMTQtMjUzLjktMjU2LTI1My45LTE0MSAwLTI1NC42IDExMy45LTI1NC42IDI1My45ek0xOTIuMSAxNTBsMCAyMTMtNDMgMCAwLTIxMyA0MyAwem00MiAwbDEyOCAwIDAgNDMtMTI4IDAgMC00M3ptMTI4IDg1bDAgNDMtMTI4IDAgMC00MyAxMjggMHptLTEyOCA4NWwxMjggMCAwIDQzLTEyOCAwIDAtNDN6Il0KICAgIH07CiAgICBmYUZpcnN0T3JkZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZmlyc3Qtb3JkZXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjJiMCIsICJNMTMuMyAyMjkuMmMuMS0uMSAuMi0uMyAuMy0uNCAwIC4xIDAgLjMtLjEgLjRsLS4yIDB6TTIyNC40IDk2LjZjLTcuMSAwLTE0LjYgLjYtMjEuNCAxLjdsMy43IDY3LjQtMjItNjRjLTE0LjMgMy43LTI3LjcgOS40LTQwIDE2LjZsMjkuNCA2MS40LTQ1LjEtNTAuOWMtMTEuNCA4LjktMjEuNyAxOS4xLTMwLjYgMzAuOWw1MC42IDQ1LjQtNjEuMS0yOS43Yy03LjEgMTIuMy0xMi45IDI1LjctMTYuNiA0MGw2NC4zIDIyLjYtNjgtNGMtLjkgNy4xLTEuNCAxNC42LTEuNCAyMnMuNiAxNC42IDEuNCAyMS43bDY3LjctNC02NCAyMi42YzMuNyAxNC4zIDkuNCAyNy43IDE2LjYgNDAuM0wxNDkgMzA2LjkgOTguMSAzNTJjOC45IDExLjcgMTkuMSAyMi4zIDMwLjkgMzAuOWw0NC45LTUwLjktMjkuNSA2MS40YzEyLjMgNy40IDI1LjcgMTMuMSA0MCAxNi45bDIyLjMtNjQuNi00IDY4YzcuMSAxLjEgMTQuNiAxLjcgMjEuNyAxLjcgNy40IDAgMTQuNi0uNiAyMS43LTEuN2wtNC02OC42IDIyLjYgNjUuMWMxNC4zLTQgMjcuNy05LjQgNDAtMTYuOWwtMjkuNC02MS4zIDQ0LjkgNTAuOWMxMS43LTguOSAyMi0xOS4xIDMwLjYtMzAuOWwtNTAuNi00NS4xIDYxLjEgMjkuNGM3LjEtMTIuMyAxMi45LTI1LjcgMTYuNi00MC4zbC02NC0yMi4zIDY3LjQgNGMxLjEtNy4xIDEuNC0xNC4zIDEuNC0yMS43cy0uMy0xNC45LTEuNC0yMmwtNjcuNyA0IDY0LTIyLjNjLTMuNy0xNC4zLTkuMS0yOC0xNi42LTQwLjNsLTYwLjkgMjkuNyA1MC42LTQ1LjRjLTguOS0xMS43LTE5LjEtMjItMzAuNi0zMC45bC00NS4xIDUwLjkgMjkuNC02MS4xYy0xMi4zLTcuNC0yNS43LTEzLjEtNDAtMTYuOWwtMjIuMyA2NC4zIDQtNjcuN2MtNy4xLTEuMi0xNC4zLTEuNy0yMS43LTEuN3pNNDQzLjggMTI4TDQ0My44IDM4NCAyMjQuNCA1MTIgNSAzODQgNSAxMjggMjI0LjQgMCA0NDMuOCAxMjh6bS0xNy4xIDEwLjNsLTIwMi4zLTExNy40LTIwMi4zIDExNy40IDAgMjM1LjEgMjAyLjMgMTE3LjcgMjAyLjMtMTE3LjcgMC0yMzUuMXpNMjI0LjQgMzcuMWwxODcuNyAxMDkuNCAwIDIxOC45LTE4Ny43IDEwOS41LTE4Ny43LTEwOS41IDAtMjE4LjggMTg3LjctMTA5LjV6bTAgNTAuOWMtOTIuMyAwLTE2Ni45IDc1LjEtMTY2LjkgMTY4IDAgOTIuNiA3NC42IDE2Ny43IDE2Ni45IDE2Ny43IDkyIDAgMTY2LjktNzUuMSAxNjYuOS0xNjcuNyAwLTkyLjktNzQuOS0xNjgtMTY2LjktMTY4eiJdCiAgICB9OwogICAgZmFEcmliYmJsZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJkcmliYmJsZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMTdkIiwgIk0yNTYgOGEyNDggMjQ4IDAgMSAwIDAgNDk2IDI0OCAyNDggMCAxIDAgMC00OTZ6TTQyMCAxMjIuNGMyOS41IDM2IDQ3LjQgODIgNDcuOCAxMzItNy0xLjUtNzctMTUuNy0xNDcuNS02LjgtNS44LTE0LTExLjItMjYuNC0xOC42LTQxLjYgNzguMy0zMiAxMTMuOC03Ny41IDExOC4zLTgzLjV6TTM5Ni40IDk3LjljLTMuOCA1LjQtMzUuNyA0OC4zLTExMSA3Ni41LTM0LjctNjMuOC03My4yLTExNi4yLTc5LTEyNCA2Ny4yLTE2LjIgMTM4IDEuMyAxOTAuMSA0Ny41ek0xNjUuOSA2NC42YzUuNiA3LjcgNDMuNCA2MC4xIDc4LjUgMTIyLjUtOTkuMSAyNi4zLTE4Ni40IDI1LjktMTk1LjggMjUuOCAxMy43LTY1LjcgNTgtMTIwLjQgMTE3LjMtMTQ4LjN6TTQ0LjIgMjU2LjNjMC0yLjIgMC00LjMgLjEtNi41IDkuMyAuMiAxMTEuOSAxLjUgMjE3LjctMzAuMSA2LjEgMTEuOSAxMS45IDIzLjkgMTcuMiAzNS45LTc2LjYgMjEuNi0xNDYuMiA4My41LTE4MC41IDE0Mi4zLTMzLjgtMzcuNi01NC41LTg3LjItNTQuNS0xNDEuNnpNMTI2IDQyMy40YzIyLjEtNDUuMiA4Mi4yLTEwMy42IDE2Ny42LTEzMi44IDI5LjcgNzcuMyA0MiAxNDIuMSA0NS4yIDE2MC42LTY4LjEgMjktMTUwIDIxLjEtMjEyLjgtMjcuOXptMjQ4LjQgOC41Yy0yLjItMTIuOS0xMy40LTc0LjktNDEuMi0xNTEgNjYuNC0xMC42IDEyNC43IDYuOCAxMzEuOSA5LjEtOS40IDU4LjktNDMuMyAxMDkuOC05MC44IDE0MnoiXQogICAgfTsKICAgIGZhTGlua2VkaW4gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibGlua2VkaW4iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjA4YyIsICJNNDE2IDMyTDMxLjkgMzJDMTQuMyAzMiAwIDQ2LjUgMCA2NC4zTDAgNDQ3LjdDMCA0NjUuNSAxNC4zIDQ4MCAzMS45IDQ4MEw0MTYgNDgwYzE3LjYgMCAzMi0xNC41IDMyLTMyLjNsMC0zODMuNEM0NDggNDYuNSA0MzMuNiAzMiA0MTYgMzJ6TTEzNS40IDQxNmwtNjYuNCAwIDAtMjEzLjggNjYuNSAwIDAgMjEzLjgtLjEgMHpNMTAyLjIgOTZhMzguNSAzOC41IDAgMSAxIDAgNzcgMzguNSAzOC41IDAgMSAxIDAtNzd6TTM4NC4zIDQxNmwtNjYuNCAwIDAtMTA0YzAtMjQuOC0uNS01Ni43LTM0LjUtNTYuNy0zNC42IDAtMzkuOSAyNy0zOS45IDU0LjlsMCAxMDUuOC02Ni40IDAgMC0yMTMuOCA2My43IDAgMCAyOS4yIC45IDBjOC45LTE2LjggMzAuNi0zNC41IDYyLjktMzQuNSA2Ny4yIDAgNzkuNyA0NC4zIDc5LjcgMTAxLjlsMCAxMTcuMnoiXQogICAgfTsKICAgIGZhQ2NQYXlwYWwgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY2MtcGF5cGFsIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYxZjQiLCAiTTE4Ni4zIDI1OC4yYzAgMTIuMi05LjcgMjEuNS0yMiAyMS41LTkuMiAwLTE2LTUuMi0xNi0xNSAwLTEyLjIgOS41LTIyIDIxLjctMjIgOS4zIDAgMTYuMyA1LjcgMTYuMyAxNS41ek04MC41IDIwOS43bC00LjcgMGMtMS41IDAtMyAxLTMuMiAyLjdsLTQuMyAyNi43IDguMi0uM2MxMSAwIDE5LjUtMS41IDIxLjUtMTQuMiAyLjMtMTMuNC02LjItMTQuOS0xNy41LTE0Ljl6bTI4NCAwbC00LjUgMGMtMS44IDAtMyAxLTMuMiAyLjdsLTQuMiAyNi43IDgtLjNjMTMgMCAyMi0zIDIyLTE4LS4xLTEwLjYtOS42LTExLjEtMTguMS0xMS4xek01NzYgODBsMCAzNTJjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNDgwYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDgwQzAgNTMuNSAyMS41IDMyIDQ4IDMybDQ4MCAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4ek0xMjguMyAyMTUuNGMwLTIxLTE2LjItMjgtMzQuNy0yOGwtNDAgMGMtMi41IDAtNSAyLTUuMiA0LjdMMzIgMjk0LjJjLS4zIDIgMS4yIDQgMy4yIDRsMTkgMGMyLjcgMCA1LjItMi45IDUuNS01LjdsNC41LTI2LjZjMS03LjIgMTMuMi00LjcgMTgtNC43IDI4LjYgMCA0Ni4xLTE3IDQ2LjEtNDUuOHptODQuMiA4LjhsLTE5IDBjLTMuOCAwLTQgNS41LTQuMiA4LjItNS44LTguNS0xNC4yLTEwLTIzLjctMTAtMjQuNSAwLTQzLjIgMjEuNS00My4yIDQ1LjIgMCAxOS41IDEyLjIgMzIuMiAzMS43IDMyLjIgOSAwIDIwLjItNC45IDI2LjUtMTEuOS0uNSAxLjUtMSA0LjctMSA2LjIgMCAyLjMgMSA0IDMuMiA0bDE3LjIgMGMyLjcgMCA1LTIuOSA1LjUtNS43bDEwLjItNjQuM2MuMy0xLjktMS4yLTMuOS0zLjItMy45ek0yNTMgMzIyLjFsNjMuNy05Mi42Yy41LS41IC41LTEgLjUtMS43IDAtMS43LTEuNS0zLjUtMy4yLTMuNWwtMTkuMiAwYy0xLjcgMC0zLjUgMS00LjUgMi41bC0yNi41IDM5LTExLTM3LjVjLS44LTIuMi0zLTQtNS41LTRsLTE4LjcgMGMtMS43IDAtMy4yIDEuOC0zLjIgMy41IDAgMS4yIDE5LjUgNTYuOCAyMS4yIDYyLjEtMi43IDMuOC0yMC41IDI4LjYtMjAuNSAzMS42IDAgMS44IDEuNSAzLjIgMy4yIDMuMmwxOS4yIDBjMS44LS4xIDMuNS0xLjEgNC41LTIuNnpNNDEyLjMgMjE1LjRjMC0yMS0xNi4yLTI4LTM0LjctMjhsLTM5LjcgMGMtMi43IDAtNS4yIDItNS41IDQuN2wtMTYuMiAxMDJjLS4yIDIgMS4zIDQgMy4yIDRsMjAuNSAwYzIgMCAzLjUtMS41IDQtMy4ybDQuNS0yOWMxLTcuMiAxMy4yLTQuNyAxOC00LjcgMjguNCAwIDQ1LjktMTcgNDUuOS00NS44em04NC4yIDguOGwtMTkgMGMtMy44IDAtNCA1LjUtNC4zIDguMi01LjUtOC41LTE0LTEwLTIzLjctMTAtMjQuNSAwLTQzLjIgMjEuNS00My4yIDQ1LjIgMCAxOS41IDEyLjIgMzIuMiAzMS43IDMyLjIgOS4zIDAgMjAuNS00LjkgMjYuNS0xMS45LS4zIDEuNS0xIDQuNy0xIDYuMiAwIDIuMyAxIDQgMy4yIDRsMTcuMyAwYzIuNyAwIDUtMi45IDUuNS01LjdsMTAuMi02NC4zYy4zLTEuOS0xLjItMy45LTMuMi0zLjl6TTU0NCAxOTAuOWMwLTItMS41LTMuNS0zLjItMy41bC0xOC41IDBjLTEuNSAwLTMgMS4yLTMuMiAyLjdsLTE2LjIgMTA0LS4zIC41YzAgMS44IDEuNSAzLjUgMy41IDMuNWwxNi41IDBjMi41IDAgNS0yLjkgNS4yLTUuN2wxNi4yLTEwMS4yIDAtLjN6bS05MCA1MS44Yy0xMi4yIDAtMjEuNyA5LjctMjEuNyAyMiAwIDkuNyA3IDE1IDE2LjIgMTUgMTIgMCAyMS43LTkuMiAyMS43LTIxLjUgLjEtOS44LTYuOS0xNS41LTE2LjItMTUuNXoiXQogICAgfTsKICAgIGZhRGhsID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImRobCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNzkwIiwgIk0yMzggMzAxLjJsNTguNyAwIDIyLjMtMzAuMi01OC43IDAtMjIuMyAzMC4yek0wIDI4Mi45bDAgNi40IDgxLjggMCA0LjctNi40LTg2LjUgMHpNMTcyLjkgMjcxYy04LjcgMC02LTMuNi00LjYtNS41IDIuOC0zLjggNy42LTEwLjQgMTAuNC0xNC4xczIuOC01LjktMi44LTUuOWwtNTEgMC00MS4xIDU1LjggMTAwLjEgMGMzMy4xIDAgNTEuNS0yMi41IDU3LjItMzAuM2wtNjguMiAwem0zMTcuNS02LjlsMzkuMy01My40LTYyLjIgMC0zOS4zIDUzLjQgNjIuMiAwek05NS4zIDI3MWwtOTUuMyAwIDAgNi40IDkwLjYgMCA0LjctNi40em0xMTEtMjYuNmMtMi44IDMuOC03LjUgMTAuNC0xMC4zIDE0LjItMS40IDItNC4xIDUuNSA0LjYgNS41bDQ1LjYgMHM3LjMtMTAgMTMuNS0xOC40YzguNC0xMS40IC43LTM1LTI5LjItMzVsLTExNy45IDAtMjAuNCAyNy44IDExMS40IDBjNS42IDAgNS41IDIuMiAyLjcgNS45ek0wIDMwMS4ybDczLjEgMCA0LjctNi40LTc3LjggMCAwIDYuNHptMzIzIDBsNTguNyAwIDIyLjMtMzAuMi01OC43IDBjLS4xIDAtMjIuMyAzMC4yLTIyLjMgMzAuMnptMjIyIC4xbDk1IDAgMC02LjQtOTAuMyAwLTQuNyA2LjR6TTU2Ny4zIDI3MWwtNC43IDYuNCA3Ny40IDAgMC02LjQtNzIuNyAwem0tMTMuNSAxOC4zbDg2LjIgMCAwLTYuNC04MS41IDAtNC43IDYuNHpNMzg5LjYgMjEwLjdsLTIyLjUgMzAuNi0yNi4yIDAgMjIuNS0zMC42LTU4LjcgMC0zOS4zIDUzLjQgMTQzLjYgMCAzOS4zLTUzLjQtNTguNyAwek00MjMuMSAyNzFzLTQuMyA1LjktNi40IDguN2MtNy40IDEwLS45IDIxLjYgMjMuMiAyMS42bDk0LjMgMCAyMi4zLTMwLjMtMTMzLjQgMHoiXQogICAgfTsKICAgIGZhVGV4ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInRleCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlN2ZmIiwgIk02MjAuOCA5NS40Yy0zMC44IC40LTQyLjEgMTYuNi00Ny43IDI0LjVsLS4xIC4xLTU1LjcgODAuNSA4Mi44IDEyMS4xYzcuNSAxMC42IDExLjMgMTIuNSAzNS40IDEyLjVsMCA5LjFjLTkuMS0uNy0yOC0uNy0zNy43LS43LTEyLjQgMC0zMC44IDAtNDIuOSAuN2wwLTkuMWMxMy4yLS44IDE2LjYtNy4zIDE2LjYtMTAuMiAwLTEuMSAwLTIuMy0zLTYuNGwtNjUuNS05Ni4zLTYwLjIgODcuOWMtMS45IDIuNy0zLjggNS40LTMuOCAxMC4yIDAgNi4xIDMuNCAxMy42IDE1IDE0LjdsMCA5LjFjLTkuNC0uNy0yNy4xLS43LTM3LjItLjdsLTIuOCAwLTExLjcgODIuNi0xOTUuOSAwIDAtOS4xYzI2LjcgMCAzMC45IDAgMzAuOS0xNi45bDAtMjAzLjJjMC0xNi45LTQuMy0xNi45LTMwLjktMTYuOWwwLTEwLjMgMTkuOCAwYy00LjgtNjEuMS0xMC44LTcxLjctNjgtNzEuOGwtMjAuNyAwYy02LjggMS41LTYuOCA2LjEtNi44IDE0LjRsMCAyMDVjMCAxMy42IDEuMSAxNy44IDMyLjQgMTcuOGwxMC41IDAgMCA5LjEtLjQgMGMtMTcuOS0uMy0zNi43LS43LTU0LjktLjdzLTM2LjkgLjMtNTQuOCAuN2wtLjYgMCAwLTkuMSAxMC43IDBjMzEuNyAwIDMyLjgtNC4xIDMyLjgtMTcuOGwwLTIwNWMwLTguNyAwLTEzLjItNy4yLTE0LjNsLTIwLjggMGMtNTguNCAwLTYzLjcgMTAuOS02OC42IDczLjNsLTYuOCAwIDYuMy04My4zIDIxNy41IDAgNi4xIDgxLjggMTY0LjEgMCA5IDgzLjMtNi44IDBjLTUuMy00OS44LTEyLjEtNzMtNzAuMy03M2wtNTEuNSAwYy0xNSAwLTE1LjggMS45LTE1LjggMTQuNmwwIDkzLjMgMzUuNSAwYzM1LjUgMCAzOC45LTEyLjggMzguOS00NGw2IDAgMCA5Ny45LTYgMGMwLTMxLjgtMy40LTQ0LjgtMzguOS00NC44bC0zNS41IDAgMCAxMDUuMmMwIDEzIC43IDE0LjggMTUuOCAxNC44bDUyLjIgMGM2MS4xIDAgNjkuOS0yNS44IDc3LjQtNzMuNi03LjcgMC0xNi4zIC4yLTIyLjIgLjdsMC05LjFjNy4yIDAgMzEuNy0uNCA0Ny44LTIzLjhsNjUuNS05NS43LTcyLjctMTA2LjdjLTguMy0xMS43LTE1LjEtMTIuNS0zNS44LTEyLjVsMC05LjFjOS4xIC43IDI3LjkgLjcgMzcuNyAuNyAxMi40IDAgMzAuOCAwIDQyLjktLjdsMCA5LjFjLTEyLjUgLjQtMTYuNiA2LjgtMTYuNiAxMC4yIDAgMS4xIC40IDIuMyAzIDYuNGw1NS43IDgxLjYgNDkuNy03Mi4xYzIuNy0zLjcgNC41LTYuOCA0LjUtMTEuMyAwLTYuMS0zLTEzLjYtMTUtMTQuOGwwLTkuMWM5LjQgLjcgMjQuOCAuNyAzNy4yIC43IDkgMCAyMy4zIDAgMzItLjdsMCA5LjF6Il0KICAgIH07CiAgICBmYVNob3BpZnkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2hvcGlmeSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlMDU3IiwgIk0zODguNSAxMDQuMWMtLjItMS4xLS43LTIuMS0xLjUtMi44cy0xLjgtMS4yLTIuOS0xLjJjLTIgMC0zNy4yLS44LTM3LjItLjhzLTIxLjYtMjAuOC0yOS42LTI4LjhsMCA0MzIuNyAxMjUuNy0zMS4ycy01NC0zNjUuNS01NC40LTM2Ny45ek0yODguOSA3MC41Yy0xLjktNi4xLTQuMy0xMS45LTcuMi0xNy42LTEwLjQtMjAtMjYtMzAuOS00NC40LTMwLjktMS4zIDAtMi43IC4xLTQgLjQtLjQtLjgtMS4yLTEuMi0xLjYtMi04LTguOC0xOC40LTEyLjgtMzAuOC0xMi40LTI0IC44LTQ4IDE4LTY3LjIgNDguOC0xMy42IDIxLjYtMjQgNDguOC0yNi44IDcwLjEtMjcuNiA4LjQtNDYuOCAxNC40LTQ3LjIgMTQuOC0xNCA0LjQtMTQuNCA0LjgtMTYgMTgtMS4yIDEwLTM4IDI5MS44LTM4IDI5MS44bDMwMi42IDUyLjUgMC00MzguM2MtMS41IC4xLTIuOSAuMi00LjQgLjQgMCAwLTUuNiAxLjYtMTQuOCA0LjR6TTIzMy42IDg3LjdjLTE2IDQuOC0zMy42IDEwLjQtNTAuOCAxNS42IDQuOC0xOC44IDE0LjQtMzcuNiAyNS42LTUwIDQuNC00LjQgMTAuNC05LjYgMTcuMi0xMi44IDYuOCAxNC40IDguNCAzNCA4IDQ3LjJ6TTIwMC44IDI0LjRjNS0uMiAxMCAxLjEgMTQuNCAzLjYtNi40IDMuMi0xMi44IDguNC0xOC44IDE0LjQtMTUuMiAxNi40LTI2LjggNDItMzEuNiA2Ni41LTE0LjQgNC40LTI4LjggOC44LTQyIDEyLjggOC44LTM4LjQgNDEuMi05Ni40IDc4LTk3LjJ6TTE1NC40IDI0NC42YzEuNiAyNS42IDY5LjIgMzEuMiA3My4yIDkxLjcgMi44IDQ3LjYtMjUuMiA4MC4xLTY1LjYgODIuNS00OC44IDMuMi03NS42LTI1LjYtNzUuNi0yNS42bDEwLjQtNDRzMjYuOCAyMC40IDQ4LjQgMTguOGMxNC0uOCAxOS4yLTEyLjQgMTguOC0yMC40LTItMzMuNi01Ny4yLTMxLjYtNjAuOC04Ni45LTMuMi00Ni40IDI3LjItOTMuMyA5NC41LTk3LjcgMjYtMS42IDM5LjIgNC44IDM5LjIgNC44bC0xNS4yIDU3LjZzLTE3LjItOC0zNy42LTYuNGMtMjkuNiAyLTMwIDIwLjgtMjkuNiAyNS42ek0yNDkuNiA4Mi45YzAtMTItMS42LTI5LjItNy4yLTQzLjYgMTguNCAzLjYgMjcuMiAyNCAzMS4yIDM2LjQtNy4yIDItMTUuMiA0LjQtMjQgNy4yeiJdCiAgICB9OwogICAgZmFTcXVhcmVSZWRkaXQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXJlZGRpdCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJyZWRkaXQtc3F1YXJlIl0sICJmMWEyIiwgIk02NCAzMmwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJ6TTMwNS45IDE2Ni40YzIwLjYgMCAzNy4zLTE2LjcgMzcuMy0zNy4zcy0xNi43LTM3LjMtMzcuMy0zNy4zYy0xOCAwLTMzLjEgMTIuOC0zNi42IDI5LjgtMzAuMiAzLjItNTMuOCAyOC44LTUzLjggNTkuOWwwIC4yYy0zMi44IDEuNC02Mi44IDEwLjctODYuNiAyNS41LTguOC02LjgtMTkuOS0xMC45LTMyLTEwLjktMjguOSAwLTUyLjMgMjMuNC01Mi4zIDUyLjMgMCAyMSAxMi4zIDM5IDMwLjEgNDcuNCAxLjcgNjAuNyA2Ny45IDEwOS42IDE0OS4zIDEwOS42czE0Ny42LTQ4LjkgMTQ5LjMtMTA5LjdjMTcuNy04LjQgMjkuOS0yNi40IDI5LjktNDcuMyAwLTI4LjktMjMuNC01Mi4zLTUyLjMtNTIuMy0xMiAwLTIzIDQtMzEuOSAxMC44LTI0LTE0LjktNTQuMy0yNC4yLTg3LjUtMjUuNGwwLS4xYzAtMjIuMiAxNi41LTQwLjcgMzcuOS00My43IDMuOSAxNi41IDE4LjcgMjguNyAzNi4zIDI4LjdsLjItLjJ6TTE1NSAyNDguMWMxNC42IDAgMjUuOCAxNS40IDI1IDM0LjRzLTExLjggMjUuOS0yNi41IDI1LjktMjcuNS03LjctMjYuNi0yNi43IDEzLjUtMzMuNSAyOC4xLTMzLjVsMC0uMXptMTY2LjQgMzMuNWMuOSAxOS0xMiAyNi43LTI2LjYgMjYuN3MtMjUuNi02LjktMjYuNS0yNS45IDEwLjMtMzQuNCAyNS0zNC40IDI3LjMgMTQuNiAyOC4xIDMzLjVsMCAuMXptLTQyLjEgNDkuNmMtOSAyMS41LTMwLjMgMzYuNy01NS4xIDM2LjdzLTQ2LjEtMTUuMS01NS4xLTM2LjdjLTEuMS0yLjYgLjctNS40IDMuNC01LjcgMTYuMS0xLjYgMzMuNS0yLjUgNTEuNy0yLjVzMzUuNiAuOSA1MS43IDIuNWMyLjcgLjMgNC41IDMuMSAzLjQgNS43eiJdCiAgICB9OwogICAgZmFSZWRkaXRTcXVhcmUgPSBmYVNxdWFyZVJlZGRpdDsKICAgIGZhQ3JlYXRpdmVDb21tb25zTmMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY3JlYXRpdmUtY29tbW9ucy1uYyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNGU4IiwgIk0yNTUuNiA4QzM5NS40IDggNTA0IDExNS45IDUwNCAyNTYgNTA0IDQwMy4yIDM4NS41IDUwNCAyNTUuNiA1MDQgMTIxLjEgNTA0IDggMzkzLjIgOCAyNTYgOCAxMjMuMSAxMTIuNyA4IDI1NS42IDh6TTYzLjggMTg5LjFjLTcuNCAyMC40LTExLjEgNDIuNy0xMS4xIDY2LjkgMCAxMTAuOSA5Mi4xIDIwMi40IDIwMy43IDIwMi40IDEyMi40IDAgMTc3LjItMTAxLjggMTc4LjUtMTA0LjFsLTkzLjQtNDEuNmMtNy43IDM3LjEtNDEuMiA1My02OC4yIDU1LjRsMCAzOC4xLTI4LjggMCAwLTM4LjJjLTI3LjUtLjMtNTIuNi0xMC4yLTc1LjMtMjkuN2wzNC4xLTM0LjVjMzEuNyAyOS40IDg2LjQgMzEuOCA4Ni40LTIuMiAwLTYuMi0yLjItMTEuMi02LjYtMTUuMS0xNC4yLTYtMS44LS4xLTIxOS4zLTk3LjR6TTI1Ni40IDUyLjNDMjE4IDUyLjMgMTQ0IDYxIDg1LjkgMTQ1LjNsOTQuOCA0Mi41YzEwLTMxLjMgNDAuNC00Mi45IDYzLjgtNDQuM2wwLTM4LjEgMjguOCAwIDAgMzguMWMyMi43IDEuMiA0My40IDguOSA2MiAyM0wzMDMgMTk5LjdjLTQyLjctMjkuOS04My41LTgtNzAgMTEuMSA1My40IDI0LjEgNDMuOCAxOS44IDkzIDQxLjZsMTI3LjEgNTYuN2M0LjEtMTcuNCA2LjItMzUuMSA2LjItNTMuMSAwLTU3LTE5LjgtMTA1LTU5LjMtMTQzLjktMzkuMy0zOS45LTg3LjItNTkuOC0xNDMuNi01OS44eiJdCiAgICB9OwogICAgZmFHYWxhY3RpY1JlcHVibGljID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdhbGFjdGljLXJlcHVibGljIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1MGMiLCAiTTI1NiA4YTI0OCAyNDggMCAxIDEgMCA0OTYgMjQ4IDI0OCAwIDEgMSAwLTQ5NnptMCAxNi41YTIzMS41IDIzMS41IDAgMSAwIDAgNDYyLjkgMjMxLjUgMjMxLjUgMCAxIDAgMC00NjIuOXptMjcuNiAyMS44bDAgMjQuNmMzMC4zIDQuNSA1OSAxNi4zIDgzLjYgMzQuNWwxNy40LTE3LjRjLTI4LjctMjIuMS02My4zLTM2LjktMTAxLTQxLjh6bS01NS40IC4xYy0zNy42IDQuOS03Mi4yIDE5LjgtMTAwLjkgNDEuOWwxNy4zIDE3LjQgLjEgMGMyNC4xLTE3LjggNTIuNi0zMC4xIDgzLjUtMzQuN2wwLTI0LjV6bTEyLjIgNTAuMmwwIDgyLjljLTEwIDItMTkuNCA1LjktMjcuNyAxMS40bC01OC42LTU4LjYtMjEuOSAyMS45IDU4LjcgNTguN2MtNS41IDguMi05LjQgMTcuNi0xMS41IDI3LjZsLTgyLjkgMCAwIDMxIDgyLjkgMGMyIDEwIDYgMTkuMyAxMS41IDI3LjVsLTU4LjcgNTguNyAyMS45IDIxLjkgNTguNi01OC42YzguNCA1LjYgMTcuOCA5LjUgMjcuNyAxMS41bDAgODIuOSAzMSAwIDAtODIuOWMxMC0yIDE5LjQtNi4xIDI3LjYtMTEuNWw1OC43IDU4LjcgMjEuOS0yMS45LTU4LjctNTguN2M1LjUtOC4yIDkuNS0xNy41IDExLjUtMjcuNWw4Mi45IDAgMC0zMS04Mi45IDBjLTItMTAtNi0xOS40LTExLjUtMjcuNmw1OC43LTU4LjctMjEuOS0yMS45LTU4LjcgNTguN2MtOC4yLTUuNS0xNy42LTkuNS0yNy42LTExLjVsMC04Mi45LTMxIDB6bTE4My4yIDMwLjdsLTE3LjQgMTcuNGMxOC4zIDI0LjYgMzAuMiA1My40IDM0LjcgODMuN2wyNC42IDBjLTUtMzcuNy0xOS44LTcyLjMtNDEuOS0xMDF6bS0zMzUuNiAuMWMtMjIuMSAyOC43LTM2LjkgNjMuMy00MS44IDEwMC45bDI0LjYgMGM0LjYtMzEgMTYuOC01OS40IDM0LjYtODMuNUw4OC4yIDEyNy40ek00Ni4zIDI4My43YzQuOSAzNy42IDE5LjcgNzIuMiA0MS44IDEwMC45bDE3LjQtMTcuNEM4Ny43IDM0My4xIDc1LjYgMzE0LjYgNzEgMjgzLjdsLTI0LjYgMCAwIDB6bTM5NC43IDBjLTQuNiAzMS0xNi44IDU5LjUtMzQuNyA4My42bDE3LjQgMTcuNGMyMi4xLTI4LjcgMzctNjMuMyA0MS45LTEwMWwtMjQuNiAwek0xNDQuNyA0MDYuNGwtMTcuNCAxNy40YzI4LjcgMjIuMSA2My4zIDM3IDEwMSA0MS45bDAtMjQuNmMtMzEtNC42LTU5LjUtMTYuOC04My42LTM0LjZ6bTIyMi41IDBjLTI0LjEgMTcuOC01Mi42IDMwLjEtODMuNiAzNC43bDAgMjQuNmMzNy43LTQuOSA3Mi4yLTE5LjggMTAxLTQxLjhsLTE3LjMtMTcuNC0uMSAweiJdCiAgICB9OwogICAgZmFGYWNlYm9vayA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlYm9vayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYyZTNdLCAiZjA5YSIsICJNNTEyIDI1NkM1MTIgMTE0LjYgMzk3LjQgMCAyNTYgMFMwIDExNC42IDAgMjU2QzAgMzc2IDgyLjcgNDc2LjggMTk0LjIgNTA0LjVsMC0xNzAuMy01Mi44IDAgMC03OC4yIDUyLjggMCAwLTMzLjdjMC04Ny4xIDM5LjQtMTI3LjUgMTI1LTEyNy41IDE2LjIgMCA0NC4yIDMuMiA1NS43IDYuNGwwIDcwLjhjLTYtLjYtMTYuNS0xLTI5LjYtMS00MiAwLTU4LjIgMTUuOS01OC4yIDU3LjJsMCAyNy44IDgzLjYgMC0xNC40IDc4LjItNjkuMyAwIDAgMTc1LjlDNDEzLjggNDk0LjggNTEyIDM4Ni45IDUxMiAyNTZ6Il0KICAgIH07CiAgICBmYUdpdGxhYiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnaXRsYWIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjI5NiIsICJNNTA0IDIwNC42bC0uNy0xLjgtNjkuNy0xODEuOGMtMS40LTMuNi0zLjktNi42LTcuMi04LjYtMi40LTEuNi01LjEtMi41LTgtMi44cy01LjcgLjEtOC40IDEuMS01LjEgMi43LTcuMSA0LjhjLTEuOSAyLjEtMy4zIDQuNy00LjEgNy40bC00NyAxNDQtMTkwLjUgMC00Ny4xLTE0NGMtLjgtMi44LTIuMi01LjMtNC4xLTcuNC0yLTIuMS00LjQtMy43LTcuMS00LjgtMi42LTEtNS41LTEuNC04LjQtMS4xcy01LjYgMS4yLTggMi44Yy0zLjIgMi01LjggNS4xLTcuMiA4LjZMOS44IDIwMi44IDkgMjA0LjZjLTEwIDI2LjItMTEuMyA1NS0zLjUgODIgNy43IDI2LjkgMjQgNTAuNyA0Ni40IDY3LjZsLjMgLjIgLjYgLjQgMTA2IDc5LjVjMzguNSAyOS4xIDY2LjcgNTAuMyA4NC42IDYzLjkgMy43IDEuOSA4LjMgNC4zIDEzIDQuM3M5LjMtMi40IDEzLTQuM2MxNy45LTEzLjUgNDYuMS0zNC45IDg0LjYtNjMuOWwxMDYuNy03OS45IC4zLS4zYzIyLjQtMTYuOSAzOC43LTQwLjYgNDUuNi02Ny41IDguNi0yNyA3LjQtNTUuOC0yLjYtODJ6Il0KICAgIH07CiAgICBmYVFxID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInFxIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYxZDYiLCAiTTQzNC4xIDQyMC40Yy0xMS41IDEuNC00NC45LTUyLjctNDQuOS01Mi43IDAgMzEuMy0xNi4xIDcyLjItNTEgMTAxLjggMTYuOCA1LjIgNTQuOCAxOS4yIDQ1LjggMzQuNC03LjMgMTIuMy0xMjUuNSA3LjktMTU5LjYgNC0zNC4xIDMuOC0xNTIuMyA4LjMtMTU5LjYtNC05LTE1LjIgMjguOS0yOS4yIDQ1LjgtMzQuNC0zNC45LTI5LjUtNTEuMS03MC40LTUxLjEtMTAxLjggMCAwLTMzLjMgNTQuMS00NC45IDUyLjctNS40LS42LTEyLjQtMjkuNiA5LjMtOTkuNyAxMC4zLTMzIDIyLTYwLjUgNDAuMS0xMDUuOC0zLjEtMTE2LjkgNDUuMi0yMTUgMTYwLjMtMjE1IDExMy43IDAgMTYzLjIgOTYuMSAxNjAuMyAyMTUgMTguMSA0NS4yIDI5LjkgNzIuOSA0MC4xIDEwNS44IDIxLjggNzAuMSAxNC43IDk5LjEgOS4zIDk5Ljd6Il0KICAgIH07CiAgICBmYVN0cmlwZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzdHJpcGUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjQyOSIsICJNMTY1IDE0NC43bC00My4zIDkuMi0uMiAxNDIuNGMwIDI2LjMgMTkuOCA0My4zIDQ2LjEgNDMuMyAxNC42IDAgMjUuMy0yLjcgMzEuMi01LjlsMC0zMy44Yy01LjcgMi4zLTMzLjcgMTAuNS0zMy43LTE1LjdsMC02My4yIDMzLjcgMCAwLTM3LjgtMzMuNyAwLS4xLTM4LjV6bTg5LjEgNTEuNmwtMi43LTEzLjEtMzguNCAwIDAgMTUzLjIgNDQuMyAwIDAtMTAzLjFjMTAuNS0xMy44IDI4LjItMTEuMSAzMy45LTkuM2wwLTQwLjhjLTYtMi4xLTI2LjctNi0zNy4xIDEzLjF6TTM0Ni40IDEyNGwtNDQuNiA5LjUgMCAzNi4yIDQ0LjYtOS41IDAtMzYuMnpNNDQuOSAyMjguM2MwLTYuOSA1LjgtOS42IDE1LjEtOS43IDEzLjUgMCAzMC43IDQuMSA0NC4yIDExLjRsMC00MS44Yy0xNC43LTUuOC0yOS40LTguMS00NC4xLTguMS0zNiAwLTYwIDE4LjgtNjAgNTAuMiAwIDQ5LjIgNjcuNSA0MS4yIDY3LjUgNjIuNCAwIDguMi03LjEgMTAuOS0xNyAxMC45LTE0LjcgMC0zMy43LTYuMS00OC42LTE0LjJsMCA0MGMxNi41IDcuMSAzMy4yIDEwLjEgNDguNSAxMC4xIDM2LjkgMCA2Mi4zLTE1LjggNjIuMy00Ny44IDAtNTIuOS02Ny45LTQzLjQtNjcuOS02My40ek02NDAgMjYxLjZjMC00NS41LTIyLTgxLjQtNjQuMi04MS40cy02Ny45IDM1LjktNjcuOSA4MS4xYzAgNTMuNSAzMC4zIDc4LjIgNzMuNSA3OC4yIDIxLjIgMCAzNy4xLTQuOCA0OS4yLTExLjVsMC0zMy40Yy0xMi4xIDYuMS0yNiA5LjgtNDMuNiA5LjgtMTcuMyAwLTMyLjUtNi4xLTM0LjUtMjYuOWw4Ni45IDBjLjItMi4zIC42LTExLjYgLjYtMTUuOXptLTg3LjktMTYuOGMwLTIwIDEyLjMtMjguNCAyMy40LTI4LjQgMTAuOSAwIDIyLjUgOC40IDIyLjUgMjguNGwtNDUuOSAwek00MzkuMiAxODAuMmMtMTcuNCAwLTI4LjYgOC4yLTM0LjggMTMuOWwtMi4zLTExLTM5LjEgMCAwIDIwNC44IDQ0LjQtOS40IC4xLTUwLjJjNi40IDQuNyAxNS45IDExLjIgMzEuNCAxMS4yIDMxLjggMCA2MC44LTIzLjIgNjAuOC03OS42IC4xLTUxLjYtMjkuMy03OS43LTYwLjUtNzkuN3pNNDI4LjYgMzAyLjdjLTEwLjQgMC0xNi42LTMuOC0yMC45LTguNGwtLjMtNjZjNC42LTUuMSAxMS04LjggMjEuMi04LjggMTYuMiAwIDI3LjQgMTguMiAyNy40IDQxLjQgLjEgMjMuOS0xMC45IDQxLjgtMjcuNCA0MS44ek0zMDEuOSAzMzYuNGw0NC42IDAgMC0xNTMuMi00NC42IDAgMCAxNTMuMnoiXQogICAgfTsKICAgIGZhRGFpbHltb3Rpb24gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZGFpbHltb3Rpb24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTA1MiIsICJNMjk4LjkgMjY3Yy03LjQtNC4yLTE1LjgtNi4zLTI0LjQtNi4yLTEzLjIgMC0yNC40IDQuNC0zMy40IDEzLjNzLTEzLjYgMjAtMTMuNiAzMy40YzAgMTQuMSA0LjQgMjUuNiAxMy4zIDM0LjZzMjAgMTMuNCAzMy40IDEzLjRjMTMuNyAwIDI1LTQuNiAzNC4xLTEzLjhTMzIyIDMyMS4xIDMyMiAzMDcuNWMwLTguMi0yLjEtMTYuMy02LjEtMjMuNS00LTcuMS05LjgtMTMtMTctMTd6TTAgMzJsMCA0NDggNDQ4IDAgMC00NDgtNDQ4IDB6TTM3NC43IDQwNS4zbC01My4xIDAgMC0yMy45LS43IDBjLTEwLjUgMTcuNS0yOS4xIDI2LjItNTUuOCAyNi4yLTE4LjQgMC0zNC43LTQuNC00OC45LTEzLjEtMTQuMS04LjYtMjUuNS0yMS0zMi45LTM1LjgtNy43LTE1LjEtMTEuNi0zMi4xLTExLjYtNTAuOSAwLTE4LjQgMy45LTM1LjEgMTEuOC01MC4yIDcuNS0xNC43IDE4LjktMjcuMSAzMi45LTM1LjggMTQuMS04LjcgMzAtMTMuMSA0Ny43LTEzLjEgMTAuMi0uMSAyMC4yIDEuNiAyOS43IDUuMiA4LjkgMy41IDE3LjIgOS4xIDI1IDE3bDAtNzcuOSA1NS44LTEyLjEgMCAyNjQuNHoiXQogICAgfTsKICAgIGZhU3RlYW0gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3RlYW0iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjFiNiIsICJNNTA0IDI1NmMwIDEzNy0xMTEuMiAyNDgtMjQ4LjQgMjQ4LTExMy44IDAtMjA5LjYtNzYuMy0yMzktMTgwLjRsOTUuMiAzOS4zYzYuNCAzMi4xIDM0LjkgNTYuNCA2OC45IDU2LjQgMzkuMiAwIDcxLjktMzIuNCA3MC4yLTczLjVsODQuNS02MC4yYzUyLjEgMS4zIDk1LjgtNDAuOSA5NS44LTkzLjUgMC01MS42LTQyLTkzLjUtOTMuNy05My41cy05My43IDQyLTkzLjcgOTMuNWwwIDEuMi01OS4yIDg1LjdjLTE1LjUtLjktMzAuNyAzLjQtNDMuNSAxMi4xTDggMjM2LjFDMTguMiAxMDguNCAxMjUuMSA4IDI1NS42IDggMzkyLjggOCA1MDQgMTE5IDUwNCAyNTZ6TTE2My43IDM4NC4zbC0zMC41LTEyLjZjNS42IDExLjYgMTUuMyAyMC44IDI3LjIgMjUuOCAyNi45IDExLjIgNTcuOC0xLjYgNjktMjguNCA1LjQtMTMgNS41LTI3LjMgLjEtNDAuM1MyMTQgMzA1LjYgMjAxIDMwMC4yYy0xMi45LTUuNC0yNi43LTUuMi0zOC45LS42bDMxLjUgMTNjMTkuOCA4LjIgMjkuMiAzMC45IDIwLjkgNTAuNy04LjMgMTkuOS0zMSAyOS4yLTUwLjggMjF6TTMzNy41IDEyOS44YTYyLjMgNjIuMyAwIDEgMSAwIDEyNC42IDYyLjMgNjIuMyAwIDEgMSAwLTEyNC42em0uMSAxMDlhNDYuOCA0Ni44IDAgMSAwIDAtOTMuNiA0Ni44IDQ2LjggMCAxIDAgMCA5My42eiJdCiAgICB9OwogICAgZmFTbmFwY2hhdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzbmFwY2hhdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYyMTI0LCAic25hcGNoYXQtZ2hvc3QiXSwgImYyYWIiLCAiTTQ5Ny4xIDM2Ni42Yy0zLjQtOS4yLTkuOC0xNC4xLTE3LjEtMTguMi0xLjQtLjgtMi42LTEuNS0zLjctMS45LTIuMi0xLjEtNC40LTIuMi02LjYtMy40LTIyLjgtMTIuMS00MC42LTI3LjMtNTMtNDUuNC0zLjUtNS4xLTYuNi0xMC41LTkuMS0xNi4xLTEuMS0zLTEtNC43LS4yLTYuMyAuOC0xLjIgMS43LTIuMiAyLjktMyAzLjktMi42IDgtNS4yIDEwLjctNyA0LjktMy4yIDguOC01LjcgMTEuMi03LjQgOS40LTYuNSAxNS45LTEzLjUgMjAtMjEuMyAyLjktNS40IDQuNS0xMS4zIDQuOS0xNy40cy0uNi0xMi4yLTIuOC0xNy44Yy02LjItMTYuMy0yMS42LTI2LjQtNDAuMy0yNi40LTMuOSAwLTcuOSAuNC0xMS43IDEuMi0xIC4yLTIuMSAuNS0zLjEgLjcgLjItMTEuMi0uMS0yMi45LTEuMS0zNC41LTMuNS00MC44LTE3LjgtNjIuMS0zMi43LTc5LjItOS41LTEwLjctMjAuNy0xOS43LTMzLjItMjYuNy0yMi42LTEyLjktNDguMi0xOS40LTc2LjEtMTkuNHMtNTMuNCA2LjUtNzYgMTkuNGMtMTIuNSA3LTIzLjcgMTYuMS0zMy4zIDI2LjgtMTQuOSAxNy0yOS4yIDM4LjQtMzIuNyA3OS4yLTEgMTEuNi0xLjIgMjMuNC0xLjEgMzQuNS0xLS4zLTItLjUtMy4xLS43LTMuOS0uOC03LjgtMS4yLTExLjctMS4yLTE4LjcgMC0zNC4xIDEwLjEtNDAuMyAyNi40LTIuMiA1LjctMy4yIDExLjgtMi44IDE3LjhzMiAxMiA0LjkgMTcuNGM0LjEgNy44IDEwLjcgMTQuNyAyMCAyMS4zIDIuNSAxLjcgNi40IDQuMiAxMS4yIDcuNCAyLjYgMS43IDYuNSA0LjIgMTAuMyA2LjcgMS4zIC45IDIuNCAyIDMuMyAzLjMgLjggMS42IC44IDMuNC0uNCA2LjYtMi41IDUuNS01LjUgMTAuOC04LjkgMTUuOC0xMi4xIDE3LjctMjkuNCAzMi42LTUxLjQgNDQuNi0xMS43IDYuMi0yMy45IDEwLjMtMjkgMjQuMy0zLjkgMTAuNS0xLjMgMjIuNSA4LjUgMzIuNiAzLjYgMy44IDcuOCA2LjkgMTIuNCA5LjQgOS42IDUuMyAxOS44IDkuMyAzMC4zIDEyLjEgMi4yIC42IDQuMyAxLjUgNi4xIDIuNyAzLjYgMy4xIDMuMSA3LjkgNy44IDE0LjggMi40IDMuNiA1LjQgNi43IDkgOS4xIDEwIDYuOSAyMS4zIDcuNCAzMy4yIDcuOCAxMC44IC40IDIzIC45IDM2LjkgNS41IDUuOCAxLjkgMTEuOCA1LjYgMTguNyA5LjkgMTYuNyAxMC4zIDM5LjYgMjQuMyA3Ny44IDI0LjNzNjEuMy0xNC4xIDc4LjEtMjQuNGM2LjktNC4yIDEyLjktNy45IDE4LjUtOS44IDEzLjktNC42IDI2LjItNS4xIDM2LjktNS41IDExLjktLjUgMjMuMi0uOSAzMy4yLTcuOCA0LjItMi45IDcuNy02LjcgMTAuMi0xMS4yIDMuNC01LjggMy40LTkuOSA2LjYtMTIuOCAxLjgtMS4yIDMuNy0yLjEgNS44LTIuNiAxMC43LTIuOCAyMS02LjkgMzAuOC0xMi4yIDQuOS0yLjYgOS4zLTYuMSAxMy0xMC4ybC4xLS4yYzkuMi05LjkgMTEuNS0yMS41IDcuOC0zMS44em0tMzQgMTguM2MtMjAuNyAxMS41LTM0LjUgMTAuMi00NS4zIDE3LjEtOS4xIDUuOS0zLjcgMTguNS0xMC4zIDIzLjEtOC4xIDUuNi0zMi4yLS40LTYzLjIgOS45LTI1LjYgOC41LTQyIDMyLjgtODggMzIuOHMtNjItMjQuMy04OC4xLTMyLjljLTMxLTEwLjMtNTUuMS00LjItNjMuMi05LjktNi42LTQuNi0xLjItMTcuMi0xMC4zLTIzLjEtMTAuNy02LjktMjQuNS01LjctNDUuMy0xNy4xLTEzLjItNy4zLTUuNy0xMS44LTEuMy0xMy45IDc1LjEtMzYuNCA4Ny4xLTkyLjYgODcuNy05Ni43IC42LTUgMS40LTktNC4yLTE0LjEtNS40LTUtMjkuMi0xOS43LTM1LjgtMjQuMy0xMC45LTcuNi0xNS43LTE1LjMtMTIuMi0yNC42IDIuNS02LjUgOC41LTguOSAxNC45LTguOSAyIDAgNCAuMiA2IC43IDEyIDIuNiAyMy43IDguNiAzMC40IDEwLjIgLjggLjIgMS42IC4zIDIuNSAuMyAzLjYgMCA0LjktMS44IDQuNi01LjktLjgtMTMuMS0yLjYtMzguNy0uNi02Mi42IDIuOC0zMi45IDEzLjQtNDkuMiAyNi02My42IDYuMS02LjkgMzQuNS0zNyA4OC45LTM3UzMzOSA3NC4yIDM0NSA4MS4xYzEyLjYgMTQuNCAyMy4yIDMwLjcgMjYgNjMuNiAyLjEgMjMuOSAuMyA0OS41LS42IDYyLjYtLjMgNC4zIDEgNS45IDQuNiA1LjkgLjggMCAxLjctLjEgMi41LS4zIDYuNy0xLjYgMTguNC03LjYgMzAuNC0xMC4yIDItLjQgNC0uNyA2LS43IDYuNCAwIDEyLjQgMi41IDE0LjkgOC45IDMuNSA5LjQtMS4yIDE3LTEyLjIgMjQuNi02LjYgNC42LTMwLjQgMTkuMy0zNS44IDI0LjMtNS42IDUuMS00LjggOS4xLTQuMiAxNC4yIC41IDQuMiAxMi41IDYwLjQgODcuNyA5Ni43IDQuNCAyLjIgMTEuOSA2LjctMS4zIDE0LjF6Il0KICAgIH07CiAgICBmYVNuYXBjaGF0R2hvc3QgPSBmYVNuYXBjaGF0OwogICAgZmFHYWxhY3RpY1NlbmF0ZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnYWxhY3RpYy1zZW5hdGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjUwZCIsICJNMjQ5LjkgMzMuNWwwIDI2LjFjLTEzLjYgMjAuNi0yMy45IDEwOC42LTI0LjUgMjE1LjMgMTEuNy0xNS42IDE5LjEtMzMuMyAxOS4xLTQ4LjJsMC0xNi45YzAtNS4zIC44LTEwLjUgMi4yLTE1LjYgLjYtMi4xIDEuNC00LjEgMi42LTUuOHMzLjQtMy44IDYuNy0zLjggNS40IDIuMSA2LjcgMy44YzEuMiAxLjggMiAzLjcgMi42IDUuOCAxLjQgNS4xIDIuMiAxMC4zIDIuMiAxNS42bDAgMTYuOWMwIDE0LjkgNy40IDMyLjYgMTkuMSA0OC4yLS42LTEwNi44LTEwLjktMTk0LjctMjQuNS0yMTUuM2wwLTI2LjEtMTIuMyAwek0yMjMuNSAxODEuM2MtOS41IDIuMS0xOC43IDUuMi0yNy41IDkuMSA4LjkgMTYuMSA5LjggMzIuNiAxLjcgMzcuMy04IDQuNi0yMS44LTQuMi0zMS40LTE5LjgtMTEuNiA4LjgtMjEuOSAxOS4zLTMwLjYgMzEuMSAxNC43IDkuNiAyMi45IDIyLjkgMTguMyAzMC43LTQuNSA3LjctMjAgNy4xLTM1LjUtMS01LjggMTMuMi05LjcgMjcuNS0xMS42IDQyLjQgOS43IC4yIDE4LjcgMi40IDI2LjIgNiAxNy44LS4zIDMyLjgtMiA0MC41LTQuMiA1LjYtMjYuNCAyMy00OC4yIDQ2LjMtNTkuNSAuNy0yNS42IDEuOS00OS43IDMuNS03Mi4xem02NSAwYzEuNiAyMi40IDIuNyA0Ni41IDMuNSA3Mi4xIDIzLjMgMTEuMyA0MC44IDMzLjIgNDYuMyA1OS41IDcuNyAyLjMgMjIuNyAzLjkgNDAuNSA0LjIgNy41LTMuNyAxNi41LTUuOCAyNi4yLTYtMS45LTE0LjktNS45LTI5LjItMTEuNy00Mi40LTE1LjQgOC4xLTMwLjkgOC43LTM1LjUgMS00LjYtNy43IDMuNi0yMS4xIDE4LjMtMzAuNy04LjctMTEuOC0xOS0yMi4zLTMwLjYtMzEuMS05LjUgMTUuNi0yMy40IDI0LjQtMzEuNCAxOS44LTguMS00LjYtNy4yLTIxLjIgMS43LTM3LjMtOC44LTMuOS0xOC03LTI3LjQtOS4xek0yNTYgMTg5LjljLTMuMiAwLTUuOSA4LjgtNi4xIDE5LjlsMCAwIDAgMTYuOWMwIDQxLjQtNDkgOTUtOTMuNSA5NS01MiAwLTEyMi44LTEuNC0xNTYuNCAyOS4ybDAgMi41YzkuNCAxNy4xIDIwLjYgMzMuMiAzMy4yIDQ4IDEyLjUtMjEuMSA1MS42LTQxIDEwOC00MS40IDQ1LjcgMSA3OSAyMC4zIDkwLjggNDAuOSAwIDAgMCAwIDAgLjEgNy43IDIuMSAxNS44IDMuMiAyNCAzLjIgOC4yIDAgMTYuNC0xLjEgMjQtMy4yIDAgMCAwIDAgMC0uMSAxMS43LTIwLjUgNDUuMS0zOS44IDkwLjgtNDAuOSA1Ni40IC40IDk1LjUgMjAuMyAxMDggNDEuNCAxMi42LTE0LjggMjMuOC0zMC45IDMzLjItNDhsMC0yLjVjLTMzLjYtMzAuNi0xMDQuNC0yOS4yLTE1Ni40LTI5LjItNDQuNSAwLTkzLjUtNTMuNi05My41LTk1bDAtMTYuOS0uMSAwYy0uMi0xMS4xLTIuOS0xOS45LTYuMS0xOS45em0wIDE3Ny45YTQwLjYgNDAuNiAwIDEgMSAwLTgxLjMgNDAuNiA0MC42IDAgMSAxIDAgODEuM3ptMC03My42YTMzIDMzIDAgMSAwIDAgNjUuOSAzMyAzMyAwIDEgMCAwLTY1Ljl6bTAgNTkuOGEyNi44IDI2LjggMCAxIDEgMC01My42IDI2LjggMjYuOCAwIDEgMSAwIDUzLjZ6bS0xMTQuOCAxM2MtMTAuMiAuMS0yMS42IC40LTMwLjUgMS43IC40IDQuNCAxLjUgMTguNiA3LjEgMjkuOCA5LjEtMi42IDE4LjQtMy45IDI3LjYtMy45IDQxLjMgLjkgNzEuNSAzNC40IDc4LjMgNzQuNWwuMSA0LjdjMTAuNCAxLjkgMjEuMiAyLjkgMzIuMiAyLjkgMTEgMCAyMS44LTEgMzIuMi0yLjlsLjEtNC43YzYuOC00MC4xIDM3LTczLjUgNzguMy03NC41IDkuMyAwIDE4LjUgMS4zIDI3LjYgMy45IDUuNi0xMS4xIDYuNy0yNS4zIDcuMS0yOS44LTguOS0xLjMtMjAuMy0xLjYtMzAuNS0xLjctMTguOCAuNC0zNS4yIDQuMi00OC42IDkuNy0xMi41IDE2LTI5LjIgMzAtNDkuNiAzMy4xLS4xIDAtLjIgMC0uMyAwIDAgMC0uMSAwLS4yIC4xLTUuMiAxLjEtMTAuNiAxLjYtMTYuMiAxLjYtNS41IDAtMTAuOS0uNS0xNi4yLTEuNi0uMSAwLS4xIDAtLjItLjEtLjEgMC0uMiAwLS4zIDAtMjAuNC0zLTM3LTE3LTQ5LjYtMzMuMS0xMy40LTUuNS0yOS45LTkuMi00OC42LTkuN3oiXQogICAgfTsKICAgIGZhUGhvZW5peEZyYW1ld29yayA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwaG9lbml4LWZyYW1ld29yayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmM2RjIiwgIk0yMTIuOSAzNDQuM2MzLjgtLjEgMjIuOC0xLjQgMjUuNi0yLjItMi40LTIuNi00My42LTEtNjgtNDkuNi00LjMtOC42LTcuNS0xNy42LTYuNC0yNy42IDIuOS0yNS41IDMyLjktMzAgNTItMTguNSAzNiAyMS42IDYzLjMgOTEuMyAxMTMuNyA5Ny41IDM3IDQuNSA4NC42LTE3IDEwOC4yLTQ1LjQtLjYtLjEtLjgtLjItMS0uMS0uNCAuMS0uOCAuMi0xLjEgLjMtMzMuMyAxMi4xLTk0LjMgOS43LTEzNC43LTE0LjgtMzcuNi0yMi44LTUzLjEtNTguNy01MS44LTc0LjYgMS44LTIxLjMgMjIuOS0yMy4yIDM1LjktMTkuNiAxNC40IDMuOSAyNC40IDE3LjYgMzguOSAyNy40IDE1LjYgMTAuNCAzMi45IDEzLjcgNTEuMyAxMC4zIDE0LjktMi43IDM0LjQtMTIuMyAzNi41LTE0LjUtMS4xLS4xLTEuOC0uMS0yLjUtLjItNi4yLS42LTEyLjQtLjgtMTguNS0xLjctMTExLjItMTYuNS0xMjguOS0xNjMuNi0yNTIuNS0xNzMuMS00NC4zLTMuNC05OS40IDguMS0xMzYuMyAzNS0uOCAuNi0xLjUgMS4yLTIuMiAxLjggLjEgLjIgLjEgLjMgLjIgLjUgLjggMCAxLjYtLjEgMi40LS4yIDYuMy0xIDEyLjUtLjggMTguNyAuMyAyMy44IDQuMyA0Ny43IDIzLjEgNTUuOSA3Ni41IDUuMyAzNC4zLS43IDUwLjggOCA4Ni4xIDE5IDc3LjEgOTEgMTA3LjYgMTI3LjcgMTA2LjR6TTc1LjMgNjQuOWMtLjktMS0uOS0xLjItMS4zLTIgMTIuMS0yLjYgMjQuMi00LjEgMzYuNi00LjgtMS4xIDE0LjctMjIuMiAyMS4zLTM1LjMgNi44ek0yNzIuMiA0MTUuNGMtNDIuOCAxLjItOTItMjYuNy0xMjMuNS02MS40LTQuNi01LTE2LjgtMjAuMi0xOC42LTIzLjRsLjQtLjRjNi42IDQuMSAyNS43IDE4LjYgNTQuOCAyNyAyNC4yIDcgNDguMSA2LjMgNzEuNi0zLjMgMjIuNy05LjMgNDEtLjUgNDMuMSAyLjktMTguNSAzLjgtMjAuMSA0LjQtMjQgNy45LTUuMSA0LjQtNC42IDExLjcgNyAxNy4yIDI2LjIgMTIuNCA2My0yLjggOTcuMiAyNS40IDIuNCAyIDguMSA3LjggMTAuMSAxMC43LS4xIC4yLS4zIC4zLS40IC41LTQuOC0xLjUtMTYuNC03LjUtNDAuMi05LjMtMjQuNy0yLTQ2LjMgNS4zLTc3LjUgNi4yek00NDcgMTYzLjRjMTYuNC01LjIgNDEuMy0xMy40IDY2LjUtMy4zIDE2LjEgNi41IDI2LjIgMTguNyAzMi4xIDM0LjYgMy41IDkuNCA1LjEgMTkuNyA1LjEgMjguNy0uMiAwLS40IDAtLjYgLjEtLjItLjQtLjQtLjktLjUtMS4zLTUtMjItMjkuOS00My44LTY3LjYtMjkuOS01MC4yIDE4LjYtMTMwLjQgOS43LTE3Ni45LTQ4LS43LS45LTIuNC0xLjctMS4zLTMuMiAuMS0uMiAyLjEgLjYgMyAxLjMgMTguMSAxMy40IDM4LjMgMjEuOSA2MC4zIDI2LjIgMzAuNSA2LjEgNTQuNiAyLjkgNzkuOS01LjJ6TTU0OS43IDI4MC45Yy0zMi40IC4yLTMzLjggNTAuMS0xMDMuNiA2NC40LTE4LjIgMy43LTM4LjcgNC42LTQ0LjkgNC4ybDAtLjRjMi44LTEuNSAxNC43LTIuNiAyOS43LTE2LjYgNy45LTcuMyAxNS4zLTE1LjEgMjIuOC0yMi45IDE5LjUtMjAuMiA0MS40LTQyLjIgODEuOS0zOSAyMy4xIDEuOCAyOS4zIDguMiAzNi4xIDEyLjcgLjMgLjIgLjQgLjUgLjcgLjktLjUgMC0uNyAuMS0uOSAwLTctMi43LTE0LjMtMy4zLTIxLjgtMy4zem0tMTIuMy0yNC4xYy0uMSAuMi0uMSAuNC0uMiAuNi0yOC45LTQuNC00OC03LjktNjguNSA0LTE3IDkuOS0zMS40IDIwLjUtNjIgMjQuNC0yNy4xIDMuNC00NS4xIDIuNC02Ni4xLTgtLjMtLjItLjYtLjQtMS0uNiAwLS4yIC4xLS4zIC4xLS41IDI0LjkgMy44IDM2LjQgNS4xIDU1LjUtNS44IDIyLjMtMTIuOSA0MC4xLTI2LjYgNzEuMy0zMSAyOS42LTQuMSA1MS4zIDIuNSA3MC45IDE2Ljl6TTI2OC42IDk3LjNjLS42LS42LTEuMS0xLjItMi4xLTIuMyA3LjYgMCAyOS43LTEuMiA1My40IDguNCAxOS43IDggMzIuMiAyMSA1MC4yIDMyLjkgMTEuMSA3LjMgMjMuNCA5LjMgMzYuNCA4LjEgNC4zLS40IDguNS0xLjIgMTIuOC0xLjcgLjQtLjEgLjkgMCAxLjUgLjMtLjYgLjQtMS4yIC45LTEuOCAxLjItOC4xIDQtMTYuNyA2LjMtMjUuNiA3LjEtMjYuMSAyLjYtNTAuMy0zLjctNzMuNC0xNS40LTE5LjMtOS45LTM2LjQtMjIuOS01MS40LTM4LjZ6TTY0MCAzMzUuN2MtMy41IDMuMS0yMi43IDExLjYtNDIuNyA1LjMtMTIuMy0zLjktMTkuNS0xNC45LTMxLjYtMjQuMS0xMC03LjYtMjAuOS03LjktMjguMS04LjQgLjYtLjggLjktMS4yIDEuMi0xLjQgMTQuOC05LjIgMzAuNS0xMi4yIDQ3LjMtNi41IDEyLjUgNC4yIDE5LjIgMTMuNSAzMC40IDI0LjIgMTAuOCAxMC40IDIxIDkuOSAyMy4xIDEwLjUgLjEtLjEgLjIgMCAuNCAuNHptLTIxMi41IDEzN2MyLjIgMS4yIDEuNiAxLjUgMS41IDItMTguNS0xLjQtMzMuOS03LjYtNDYuOC0yMi4yLTIxLjgtMjQuNy00MS43LTI3LjktNDguNi0yOS43IC41LS4yIC44LS40IDEuMS0uNCAxMy4xIC4xIDI2LjEgLjcgMzguOSAzLjkgMjUuMyA2LjQgMzUgMjUuNCA0MS42IDM1LjMgMy4yIDQuOCA3LjMgOC4zIDEyLjMgMTEuMXoiXQogICAgfTsKICAgIGZhR2l0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdpdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMWQzIiwgIk0yMTYuMyAxNTguNGwtNzkuMyAwYy00MC0xMC41LTEzMC41LTcuOC0xMzAuNSA3NC44IDAgMzAuMSAxNSA1MS4yIDM1IDYxLTI1LjEgMjMtMzcgMzMuOC0zNyA0OS4yIDAgMTEgNC41IDIxLjEgMTcuOSAyNi44LTE0LjMgMTMuNC0yMi40IDIzLjEtMjIuNCA0MS40IDAgMzIuMSAyOCA1MC44IDEwMS42IDUwLjggNzAuOCAwIDExMS44LTI2LjQgMTExLjgtNzMuMiAwLTU4LjctNDUuMi01Ni41LTE1MS42LTYzbDEzLjQtMjEuNmMyNy4zIDcuNiAxMTguNyAxMCAxMTguNy02Ny45IDAtMTguNy03LjctMzEuNy0xNS00MS4xbDM3LjQtMi44IDAtMzQuNXpNMTUyLjkgNDAwLjNjMCAzMi4xLTEwNC45IDMyLjEtMTA0LjkgMi40IDAtOC4xIDUuMy0xNSAxMC42LTIxLjUgNzcuNyA1LjMgOTQuMyAzLjQgOTQuMyAxOS4xek0xMDIuMSAyNjUuN2MtNTIuOCAwLTUwLjUtNzEuMiAxLjItNzEuMiA0OS41IDAgNTAuOCA3MS4yLTEuMiA3MS4yek0yMzUuNCAzNjYuMmwwLTMyLjFjMjYuNy0zLjcgMjcuMi0yIDI3LjItMTFsMC0xMTkuNWMwLTguNS0yLjEtNy40LTI3LjItMTYuM2w0LjUtMzIuOSA4NC4yIDAgMCAxNjguN2MwIDYuNSAuNCA3LjMgNi41IDguMWwyMC43IDIuOCAwIDMyLjEtMTE1LjkgMHptNTIuNS0yNDQuM2MtMjMuMiAwLTM2LjYtMTMuNC0zNi42LTM2LjZzMTMuNC0zNS44IDM2LjYtMzUuOGMyMy42IDAgMzcgMTIuNiAzNyAzNS44cy0xMy40IDM2LjYtMzcgMzYuNnpNNTEyIDM1MC41Yy0xNy41IDguNS00My4xIDE2LjMtNjYuMyAxNi4zLTQ4LjQgMC02Ni43LTE5LjUtNjYuNy02NS41bDAtMTA2LjVjMC01LjQgMS00LjEtMzEuNy00LjFsMC0zNi4yYzM1LjgtNC4xIDUwLTIyIDU0LjUtNjYuM2wzOC42IDBjMCA2NS44LTEuMyA2MS44IDMuMyA2MS44bDU3LjMgMCAwIDQwLjYtNjAuNiAwIDAgOTcuMWMwIDYuOS00LjkgNTEuNCA2MC42IDI2LjhsMTEgMzUuOHoiXQogICAgfTsKICAgIGZhT3B0aW5Nb25zdGVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm9wdGluLW1vbnN0ZXIiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjIzYyIsICJNNTcyLjggNDIxLjRjNS42LTkuNSA0LjctMTUuMi01LjQtMTEuNi0zLTQuOS03LTkuNS0xMS4xLTEzLjggMi45LTkuNy0uNy0xNC4yLTEwLjgtOS4yLTQuNi0zLjItMTAuMy02LjUtMTUuOS05LjIgMC0xNS4xLTExLjYtMTEuNi0xNy42LTUuNy0xMC40LTEuNS0xOC43LS4zLTI2LjggNS43IC4zLTYuNSAuMy0xMyAuMy0xOS43IDEyLjYgMCA0MC4yLTExIDQ1LjktMzYuMiAxLjQtNi44IDEuNi0xMy44LS4zLTIxLjktMy0xMy41LTE0LjMtMjEuMy0yNS4xLTI1LjctLjgtNS45LTcuNi0xNC4zLTE0LjktMTUuOXMtMTIuNCA0LjktMTQuMSAxMC4zYy04LjUgMC0xOS4yIDIuOC0yMS4xIDguNC01LjQtLjUtMTEuMS0xLjQtMTYuOC0xLjkgMi43LTEuOSA1LjQtMy41IDguNC00LjYgNS40LTkuMiAxNC42LTExLjQgMjUuNy0xMS42bDAtMi44YzE5LjUtLjUgNDMtNS45IDUzLjgtMTguMSAxMi43LTEzLjggMTQuNi0zNy4zIDEyLjQtNTUuMS0yLjQtMTcuMy05LjctMzcuNi0yNC42LTQ4LjEtOC40LTUuOS0yMS42LS44LTIyLjcgOS41LTIuMiAxOS42IDEuMiAzMC0zOC42IDI1LjEtMTAuMy0yMy44LTI0LjYtNDQuNi00Mi43LTYwLTY5LjYtNTkuNy0xNjcuNy01My44LTI0NC4yLTM3LjYgMTkuNyA0LjYgNDEuMSA4LjYgNTkuNyAxNi41LTI2LjIgMi40LTUyLjcgMTEuMy03Ni4yIDIzLjItMzIuOCAxNy00NCAyOS45LTU2LjcgNDIuNCAxNC45LTIuMiAyOC45LTUuMSA0My44LTMuOC05LjcgNS40LTE4LjQgMTIuMi0yNi41IDIwLTI1LjggLjktMjMuOC01LjMtMjYuMi0yNS45LTEuMS0xMC41LTE0LjMtMTUuNC0yMi43LTkuNy0yOC4xIDE5LjktMzMuNSA3OS45LTEyLjIgMTAzLjUgMTAuOCAxMi4yIDM1LjEgMTcuMyA1NC45IDE3LjgtLjMgMS4xLS4zIDEuOS0uMyAyLjcgMTAuOCAuNSAxOS41IDIuNyAyNC42IDExLjYgMyAxLjEgNS43IDIuNyA4LjEgNC42LTUuNCAuNS0xMS4xIDEuNC0xNi41IDEuOS0zLjMtNi42LTEzLjctOC4xLTIxLjEtOC4xLTEuNi01LjctNi41LTEyLjItMTQuMS0xMC4zLTYuOCAxLjktMTQuMSAxMC0xNC45IDE1LjktMjIuNSA5LjUtMzAuMSAyNi44LTI1LjEgNDcuNiA1LjMgMjQuOCAzMyAzNi4yIDQ1LjkgMzYuMmwwIDE5LjdjLTYuNi01LTE0LjMtNy41LTI2LjgtNS43LTUuNS01LjUtMTcuMy0xMC4xLTE3LjMgNS43LTUuOSAyLjctMTEuNCA1LjktMTUuOSA5LjItOS44LTQuOS0xMy42LTEuNy0xMS4xIDkuMi00LjEgNC4zLTcuOCA4LjYtMTEuMSAxMy44LTEwLjItMy43LTExIDIuMi01LjQgMTEuNi0xLjEgMy41LTEuNiA3LTEuOSAxMC44LS41IDMxLjYgNDQuNiA2NCA3My41IDY1LjEgMTcuMyAuNSAzNC42LTguNCA0My0yMy41IDExMy4yIDQuOSAyMjYuNyA0LjEgMzQwLjIgMCA4LjEgMTUuMSAyNS40IDI0LjMgNDIuNyAyMy41IDI5LjItMS4xIDc0LjMtMzMuNSA3My41LTY1LjEgLjItMy43LS43LTcuMi0xLjctMTAuN3pNNDk5IDE2Ny40YzEuMS0zIDIuNC04LjQgMi40LTE0LjYgMC01LjkgNi44LTguMSAxNC4xLS44IDExLjEgMTEuNiAxNC45IDQwLjUgMTMuOCA1MS4xLTQuMS0xMy42LTEzLTI5LTMwLjMtMzUuN3ptLTQuNiA2LjdjMTkuNSA2LjIgMjguNiAyNy42IDI5LjcgNDguOS0xLjEgMi43LTMgNS40LTQuOSA3LjYtNS43IDUuOS0xNS40IDEwLTI2LjIgMTIuMiA0LjMtMjEuMyAuMy00Ny4zLTEyLjctNjMgNC45LS44IDEwLjktMi40IDE0LjEtNS43em0tMjQuMSA2LjhjMTMuOCAxMS45IDIwIDM5LjIgMTQuMSA2My41LTQuMSAuNS04LjEgLjgtMTEuNiAuOC0xLjktMjEuOS02LjgtNDQtMTQuMy02NC42IDMuNyAuMyA4LjEgLjMgMTEuOCAuM3pNNDcuNyAyMDNjLTEuMS0xMC41IDIuNC0zOS41IDEzLjgtNTEuMSA3LTcuMyAxNC4xLTUuMSAxNC4xIC44IDAgNi4yIDEuNCAxMS42IDIuNCAxNC42LTE3LjMgNi44LTI2LjIgMjIuMi0zMC4zIDM1Ljd6bTkuNyAyNy42Yy0xLjktMi4yLTMuNS00LjktNC45LTcuNiAxLjQtMjEuMyAxMC4zLTQyLjcgMjkuNy00OC45IDMuMiAzLjIgOS4yIDQuOSAxNC4xIDUuNy0xMyAxNS43LTE3IDQxLjYtMTIuNyA2My0xMC44LTIuMi0yMC41LTYtMjYuMi0xMi4yem00Ny45IDE0LjZjLTQuMSAwLTguMS0uMy0xMi43LS44LTQuNi0xOC42LTEuOS0zOC45IDUuNC01M2wwIC4zIDEyLjItNS4xYzQuOS0xLjkgOS43LTMuOCAxNC45LTQuOS0xMC43IDE5LjctMTcuNCA0MS4zLTE5LjggNjMuNXptMTg0LTEwLjVhNzYuMSA3Ni4xIDAgMSAxIDAtMTUyLjIgNzYuMSA3Ni4xIDAgMSAxIDAgMTUyLjJ6bTExNS42IDIyLjFjLS4zIDE3LjgtNyA0OC45LTIzIDU3LTEzLjIgNi42LTYuNS03LjUtMTYuNS01OC4xIDEzLjMgLjMgMjYuNiAuMyAzOS41IDEuMXptLTU0LTEuNmMuOCA0LjkgMy44IDQwLjMtMS42IDQxLjktMTEuNiAzLjUtNDAgNC4zLTUxLjEtMS4xLTQuMS0zLTQuNi0zNS45LTQuMy00MS4xbDAgLjNjMTguOS0uMyAzOC4xLS4zIDU3IDB6TTI3OC41IDMwOWMtMTMgMy41LTQxLjYgNC4xLTU0LjYtMS42LTYuNS0yLjctMy44LTQyLjQtMS45LTUxLjYgMTkuMi0uNSAzOC40LS41IDU3LjgtLjhsMCAuM2MxLjEgOC4zIDMuMyA1MS4yLTEuMyA1My43ek0xNzIgMjU3LjljMTIuMi0uOCAyNC42LTEuNCAzNi44LTEuNi0yLjQgMTUuNC0zIDQzLjUtNC45IDUyLjItMS4xIDYuOC00LjMgNi44LTkuNyA0LjMtMjEuOS05LjgtMjcuNi0zNS4yLTIyLjItNTQuOXptLTM1LjQgMzEuM2M3LjgtMS4xIDE1LjctMS45IDIzLjUtMi43IDEuNiA2LjIgMy44IDExLjkgNyAxNy42IDEwIDE3IDQ0IDM1LjcgNDUuMSA3IDYuMiAxNC45IDQwLjggMTIuMiA1NC45IDEwLjggMTUuNy0xLjQgMjMuOC0xLjQgMjYuOC0xNC4zIDEyLjQgNC4zIDMwLjggNC4xIDQ0IDMgMTEuMy0uOCAyMC44LS41IDI0LjYtOC45IDEuMSA1LjEgMS45IDExLjYgNC42IDE2LjggMTAuOCAyMS4zIDM3LjMgMS40IDQ2LjgtMzEuNiA4LjYgLjggMTcuNiAxLjkgMjYuNSAyLjctLjQgMS4zLTMuOCA3LjMgNy4zIDExLjYtNDcuNiA0Ny05NS43IDg3LjgtMTYzLjIgMTA3LTYzLjItMjAuOC0xMTIuMS01OS41LTE1NS45LTEwNi41IDkuNi0zLjQgMTAuNC04LjggOC0xMi41ek0xMTUgNDYxLjdjLTMuOCAxNy44LTIxLjkgMjkuNy0zOS43IDI4LjktMTkuMi0uOC00Ni41LTE3LTU5LjItMzYuNS0yLjctMzEuMSA0My44LTYxLjMgNjYuMi01NC42IDE0LjkgNC4zIDI3LjggMzAuOCAzMy41IDU0IDAgMy0uMyA1LjctLjggOC4yem0tOC43LTY2Yy0uNS0xMy41LS41LTI3LS4zLTQwLjVsLjMgMGMyLjctMS42IDUuNy0zLjggNy44LTYuNSA2LjUtMS42IDEzLTUuMSAxNS4xLTkuMiAzLjMtNy4xLTctNy41LTUuNC0xMi40IDIuNy0xLjEgNS43LTIuMiA3LjgtMy41IDI5LjIgMjkuMiA1OC42IDU2LjUgOTcuMyA3Ny0zNi44IDExLjMtNzIuNCAyNy42LTEwNS45IDQ3LTEuMi0xOC42LTcuNy0zNS45LTE2LjctNTEuOXptMzM3LjYgNjQuNmMtMTAzIDMuNS0yMDYuMiA0LjEtMzA5LjQgMCAwIC4zIDAgLjMtLjMgLjNsMC0uMyAuMyAwYzM1LjEtMjEuNiA3Mi4yLTM5LjIgMTEyLjQtNTAuOCAxMS42IDUuMSAyMyA5LjUgMzQuOSAxMy4yIDIuMiAuOCAyLjIgLjggNC4zIDAgMTQuMy00LjEgMjguNC05LjIgNDIuMi0xNS40IDQxLjUgMTEuNyA3OC44IDMxLjcgMTE1LjYgNTN6bTEwLjUtMTIuNGMtMzUuOS0xOS41LTczLTM1LjktMTExLjktNDcuNiAzOC4xLTIwIDcxLjktNDcuMyAxMDMuNS03Ni43IDIuMiAxLjQgNC42IDIuNCA3LjYgMy4yIDAgLjggLjMgMS45IC41IDIuNC00LjYgMi43LTcuOCA2LjItNS45IDEwLjMgMi4yIDMuOCA4LjYgNy42IDE1LjEgOC45IDIuNCAyLjcgNS4xIDUuMSA4LjEgNi44IDAgMTMuOC0uMyAyNy42LS44IDQxLjNsLjMtLjNjLTkuMyAxNS45LTE1LjUgMzctMTYuNSA1MS43em0xMDUuOSA2LjJjLTEyLjcgMTkuNS00MCAzNS43LTU5LjIgMzYuNS0xOS4zIC45LTQwLjUtMTMuMi00MC41LTM3IDUuNy0yMy4yIDE4LjktNDkuNyAzMy41LTU0IDIyLjctNi45IDY5LjIgMjMuNCA2Ni4yIDU0LjV6TTM3My4xIDc1LjJjLTMuOC03Mi4xLTEwMC44LTc5LjctMTI2LTIzLjUgNDQuNi0yNC4zIDkwLjMtMTUuNyAxMjYgMjMuNXpNNzUgNDA3LjFjLTE1LjcgMS42LTQ5LjUgMjUuNC00OS41IDQzLjIgMCAxMS42IDE1LjcgMTkuNSAzMi4yIDE0LjkgMTIuMi0zLjIgMzEuMS0xNy42IDM1LjktMjcuMyA2LTExLjYtMy43LTMyLjctMTguNi0zMC44ek0yOTAuOSAyMzAuOWMyOC42IDAgNTEuOS0yMS42IDUxLjktNDguNCAwLTM2LjEtNDAuNS01OC4xLTcyLjItNDQuMyA5LjUgMyAxNi41IDExLjYgMTYuNSAyMS42IDAgMjMuMy0zMy4zIDMyLTQ2LjUgMTEuMy03LjMgMzQuMSAxOS40IDU5LjggNTAuMyA1OS44ek02OC4yIDQ3NC4xYy41IDYuNSAxMi4yIDEyLjcgMjEuNiA5LjUgNi44LTIuNyAxNC42LTEwLjUgMTcuMy0xNi4yIDMtNy0xLjEtMjAtOS43LTE4LjQtOC45IDEuNi0yOS43IDE2LjctMjkuMiAyNS4xem00MzMuMi02N2MtMTQuOS0xLjktMjQuNiAxOS4yLTE4LjkgMzAuOCA0LjkgOS43IDI0LjEgMjQuMSAzNi4yIDI3LjMgMTYuNSA0LjYgMzIuMi0zLjIgMzIuMi0xNC45IDAtMTcuOC0zMy44LTQxLjYtNDkuNS00My4yek00NzkgNDQ5Yy04LjQtMS42LTEyLjQgMTEuMy05LjUgMTguNCAyLjQgNS43IDEwLjMgMTMuNSAxNy4zIDE2LjIgOS4yIDMuMiAyMS4xLTMgMjEuMy05LjUgLjktOC40LTIwLjItMjMuNS0yOS4xLTI1LjF6Il0KICAgIH07CiAgICBmYUplbmtpbnMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiamVua2lucyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmM2I2IiwgIk00NTUuNCA0MjVjLTEuNC0xMS4yLTE5LTIzLjEtMjguMi0zMS45LTUuMS01LTI5LTIzLjEtMzAuNC0yOS45LTEuNC02LjYgOS43LTIxLjUgMTMuMy0yOC45IDUuMS0xMC43IDguOC0yMy43IDExLjMtMzIuNiAxOC44LTY2LjEgMjAuNy0xNTYuOS02LjItMjExLjItMTAuMi0yMC42LTM4LjYtNDktNTYuNC02Mi41LTQyLTMxLjctMTE5LjYtMzUuMy0xNzAuMS0xNi42LTE0LjEgNS4yLTI3LjggOS44LTQwLjEgMTcuMS0zMy4xIDE5LjQtNjguMyAzMi41LTc4LjEgNzEuNi0yNC4yIDEwLjgtMzEuNSA0MS44LTMwLjMgNzcuOCAuMiA3IDQuMSAxNS44IDIuNyAyMi40LS43IDMuMy01LjIgNy42LTYuMSA5LjgtMTEuNiAyNy43LTIuMyA2NCAxMS4xIDgzLjcgOC4xIDExLjkgMjEuNSAyMi40IDM5LjIgMjUuMiAuNyAxMC42IDMuMyAxOS43IDguMiAzMC40IDMuMSA2LjggMTQuNyAxOSAxMC40IDI3LjctMi4yIDQuNC0yMSAxMy44LTI3LjMgMTcuNi0yMS4xIDEyLjUtMzYuNCAyMC4zLTU1LjkgMzQuMy0xMi42IDktMzIuMyAxMC4yLTI5LjIgMzEuMSAyLjEgMTQuMSAxMC4xIDMxLjYgMTQuNyA0NS44IC43IDIgMS40IDQuMSAyLjEgNmw0MjIgMGM0LjktMTUuMyA5LjctMzAuOSAxNC42LTQ3LjIgMy40LTExLjQgMTAuMi0yNy44IDguNy0zOS43ek0xNzQuMiAzMy43YzEuOC0uNSAzLjQgLjcgNC45IDIuNC0uMiA1LjItNS40IDUuMS04LjkgNi44LTUuNCA2LjctMTMuNCA5LjgtMjAgMTcuMi02LjggNy41LTE0LjQgMjcuNy0yMy40IDMwLTQuNSAxLjEtOS43LS44LTEzLjYtLjUtMTAuNCAuNy0xNy43IDYtMjguMyA3LjUgMTMuNi0yOS45IDU2LjEtNTQgODkuMy02My40ek02OS40IDEyNy4zYzEzLjUtMTQuOSAzMi4xLTI0LjEgNTQuOC0yNS45IDExLjcgMjkuNy04LjQgNjUtLjkgOTcuNiAyLjMgOS45IDEwLjIgMjUuNC0yLjQgMjUuNyAuMy0yOC4zLTM0LjgtNDYuMy02MS4zLTI5LjYtMS44LTIxLjUtNC45LTUxLjcgOS44LTY3Ljh6bTM2LjcgMjAwLjJjLTEtNC4xLTIuNy0xMi45LTIuMy0xNS4xIDEuNi04LjcgMTcuMS0xMi41IDExLTI0LjctMTEuMy0uMS0xMy44IDEwLjItMjQuMSAxMS4zLTI2LjcgMi42LTQ1LjYtMzUuNC00NC40LTU4LjQgMS0xOS41IDE3LjYtMzguMiA0MC4xLTM1LjggMTYgMS44IDIxLjQgMTkuMiAyNC41IDM0LjcgOS4yIC41IDIyLjUtLjQgMjYuOS03LjYtLjYtMTcuNS04LjgtMzEuNi04LjItNDcuNyAxLTMwLjMgMTcuNS01Ny42IDQuOC04Ny40IDEzLjYtMzAuOSA1My41LTU1LjMgODMuMS03MCAzNi42LTE4LjMgOTQuOS0zLjcgMTI5LjMgMTUuOCAxOS43IDExLjEgMzQuNCAzMi43IDQ4LjMgNTAuNy0xOS41LTUuOC0zNi4xIDQuMi0zMy4xIDIwLjMgMTYuMy0xNC45IDQ0LjItLjIgNTIuNSAxNi40IDcuOSAxNS44IDcuOCAzOS4zIDkgNjIuOCAyLjkgNTctMTAuNCAxMTUuOS0zOS4xIDE1Ny4xLTcuNyAxMS0xNC4xIDIzLTI0LjkgMzAuNi0yNiAxOC4yLTY1LjQgMzQuNy05OS4yIDIzLjQtNDQuNy0xNS02NS00NC44LTg5LjUtNzguOCAuNyAxOC43IDEzLjggMzQuMSAyNi44IDQ4LjQgMTEuMyAxMi41IDI1IDI2LjYgMzkuNyAzMi40LTEyLjMtMi45LTMxLjEtMy44LTM2LjIgNy4yLTI4LjYtMS45LTU1LjEtNC44LTY4LjctMjQuMi0xMC42LTE1LjQtMjEuNC00MS40LTI2LjMtNjEuNHptMjIyIDEyNC4xYzQuMS0zIDExLjEtMi45IDE3LjQtMy42LTUuNC0yLjctMTMtMy43LTE5LjMtMi4yLS4xLTQuMi0yLTYuOC0zLjItMTAuMiAxMC42LTMuOCAzNS41LTI4LjUgNDkuNi0yMC4zIDYuNyAzLjkgOS41IDI2LjIgMTAuMSAzNyAuNCA5LS44IDE4LTQuNSAyMi44LTE4LjgtLjYtMzUuOC0yLjgtNTAuNy03IC45LTYuMS0xLTEyLjEgLjYtMTYuNXptLTE3LjItMjBjLTE2LjggLjgtMjYtMS4yLTM4LjMtMTAuOCAuMi0uOCAxLjQtLjUgMS41LTEuNCAxOCA4IDQwLjgtMy4zIDU5LTQuOS03LjkgNS4xLTE0LjYgMTEuNi0yMi4yIDE3LjF6bS0xMi4xIDMzLjJjLTEuNi05LjQtMy41LTEyLTIuOC0yMC4yIDI1LTE2LjYgMjkuNyAyOC42IDIuOCAyMC4yek0xOTQuMyA0MzguNmMtMTEuNi0uNy00OC4xLTE0LTM4LjUtMjMuNyA5LjQgNi41IDI3LjUgNC45IDQxLjMgNy4zIC44IDQuNC0yLjggMTAuMi0yLjggMTYuNHpNMjYgNDk3LjFjLTQuMy0xMi43LTkuMi0yNS4xLTE0LjgtMzYuOSAzMC44LTIzLjggNjUuMy00OC45IDEwMi4yLTYzLjUgMi44LTEuMSAyMy4yIDI1LjQgMjYuMiAyNy42IDE2LjUgMTEuNyAzNyAyMSA1Ni4yIDMwLjIgMS4yIDguOCAzLjkgMjAuMiA4LjcgMzUuNSAuNyAyLjMgMS40IDQuNyAyLjIgNy4ybC0xODAuNyAwIDAtLjF6bTI0MC42IDUuN2wtLjggMGMuMy0uMiAuNS0uNCAuOC0uNWwwIC41em03LjUtNS43YzIuMS0xLjQgNC4zLTIuOCA2LjQtNC4zIDEuMSAxLjQgMi4yIDIuOCAzLjIgNC4zbC05LjYgMHptMTUuMS0yNC43Yy0xMC44IDcuMy0yMC42IDE4LjMtMzMuMyAyNS4yLTYgMy4zLTI3IDExLjctMzMuNCAxMC4yLTMuNi0uOC0zLjktNS4zLTUuNC05LjUtMy4xLTktMTAuMS0yMy40LTEwLjgtMzctLjgtMTcuMi0yLjUtNDYgMTYtNDIuNCAxNC45IDIuOSAzMi4zIDkuNyA0My45IDE2LjEgNy4xIDMuOSAxMS4xIDguNiAyMS45IDkuNS0uMSAxLjQtLjEgMi44LS4yIDQuMy01LjkgMy45LTE1LjMgMy44LTIxLjggNy4xIDkuNSAuNCAxNyAyLjcgMjMuNSA1LjktLjEgMy40LS4zIDctLjQgMTAuNnptNTMuNCAyNC43bC0xNCAwYy0uMS0zLjItMi44LTUuOC02LjEtNS44cy01LjkgMi42LTYuMSA1LjhsLTE3LjQgMGMtMi44LTQuNC01LjctOC42LTguOS0xMi41IDIuMS0yLjIgNC00LjcgNi02LjkgOSAzLjcgMTQuOC00LjkgMjEuNy00LjIgNy45IC44IDE0LjIgMTEuNyAyNS40IDExbC0uNiAxMi42em04LjcgMGMuMi00IC40LTcuOCAuNi0xMS41IDE1LjYtNy4zIDI5IDEuMyAzNS43IDExLjVsLTM2LjMgMHptODMuNC0zN2MtMi4zIDExLjItNS44IDI0LTkuOSAzNy4xLS4yLS4xLS40LS4xLS42LS4xbC0yNy45IDBjLjYtMS4xIDEuMi0yLjIgMS45LTMuMy0yLjYtNi4xLTktOC43LTEwLjktMTUuNSAxMi4xLTIyLjcgNi41LTkzLjQtMjQuMi03OC41IDQuMy02LjMgMTUuNi0xMS41IDIwLjgtMTkuMyAxMyAxMC40IDIwLjggMjAuMyAzMy4yIDMxLjQgNi44IDYgMjAgMTMuMyAyMS40IDIzLjEgLjggNS41LTIuNiAxOC45LTMuOCAyNS4xek0xOTAuNSAxMzAuNWM1LjQtMTQuOSAyNy4yLTM0LjcgNDUtMzIgNy43IDEuMiAxOCA4LjIgMTIuMiAxNy43LTMwLjItNy00NS4yIDEyLjYtNTQuNCAzMy4xLTguMS0yLTQuOS0xMy4xLTIuOC0xOC44em0xODQuMSA2My4xYzguMi0zLjYgMjIuNC0uNyAyOS42LTUuMy00LjItMTEuNS0xMC4zLTIxLjQtOS4zLTM3LjcgLjUgMCAxIDAgMS40IC4xIDYuOCAxNC4yIDEyLjcgMjkuMiAyMS40IDQxLjctNS43IDEzLjUtNDMuNiAyNS40LTQzLjEgMS4yem0tOTYuOCAyLjdjLTYuOC0xMC45LTE5LTMyLjUtMTQuNS00NS4zIDYuNSAxMS45IDguNiAyNC40IDE3LjggMzMuMyA0LjEgNCAxMi4yIDkgOC4yIDIwLjItLjkgMi43LTcuOCA4LjYtMTEuNyA5LjctMTQuNCA0LjMtNDcuOSAuOS0zNi42LTE3LjEgMTEuOSAuNyAyNy45IDcuOCAzNi44LS44em0yNy4zIDcwYzMuOCA2LjYgMS40IDE4LjcgMTIuMSAyMC42IDIwLjIgMy40IDQzLjYtMTIuMyA1OC4xLTE3LjggOS0xNS4yLS44LTIwLjctOC45LTMwLjUtMTYuNi0yMC0zOC44LTQ0LjgtMzgtNzQuNyA2LjctNC45IDcuMyA3LjQgOC4yIDkuNyA4LjcgMjAuMyAzMC40IDQ2LjIgNDYuMyA2My41IDMuOSA0LjMgMTAuMyA4LjQgMTEgMTEuMiAyLjEgOC4yLTUuNCAxOC00LjUgMjMuNS0yMS43IDEzLjktNDUuOCAyOS4xLTgxLjQgMjUuNi03LjQtNi43LTEwLjMtMjEuNC0yLjktMzEuMXptLTIwMS4zLTkuMmMtNi44LTMuOS04LjQtMjEtMTYuNC0yMS40LTExLjQtLjctOS4zIDIyLjItOS4zIDM1LjUtNy44LTcuMS05LjItMjkuMS0zLjUtNDAuMy02LjYtMy4yLTkuNSAzLjYtMTMuMSA1LjkgNC43LTM0LjEgNDkuOC0xNS44IDQyLjMgMjAuM3ptMjk5LjYgMjguOGMtMTAuMSAxOS4yLTI0LjQgNDAuNC01NCA0MS0uNi02LjItMS4xLTE1LjYgMC0xOS40IDIyLjctMi4yIDM2LjYtMTMuNyA1NC0yMS42ek0yNjEuNSAyOTguM2MxOC45IDkuOSA1My42IDExIDc5LjMgMTAuMiAxLjQgNS42IDEuMyAxMi42IDEuNCAxOS40LTMzIDEuOC03Mi02LjQtODAuNy0yOS42ek0zNTMuNyAzNDVjLTEuNyA0LjMtNS4zIDkuMy05LjggMTEuMS0xMi4xIDQuOS00NS42IDguNy02Mi40LS4zLTEwLjctNS43LTE3LjUtMTguNS0yMy40LTI2LTIuOC0zLjYtMTYuOS0xMi45LS4yLTEyLjkgMTMuMSAzMi43IDU4IDI5IDk1LjggMjguMXoiXQogICAgfTsKICAgIGZhU2xpZGVzaGFyZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzbGlkZXNoYXJlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxZTciLCAiTTE4Ny45IDE1My43Yy0zNCAwLTYxLjcgMjUuNy02MS43IDU3LjcgMCAzMS43IDI3LjcgNTcuNyA2MS43IDU3LjdzNjEuNy0yNiA2MS43LTU3LjdjMC0zMi0yNy43LTU3LjctNjEuNy01Ny43em0xNDMuNCAwYy0zNCAwLTYxLjcgMjUuNy02MS43IDU3LjcgMCAzMS43IDI3LjcgNTcuNyA2MS43IDU3LjcgMzQuMyAwIDYxLjctMjYgNjEuNy01Ny43IC4xLTMyLTI3LjQtNTcuNy02MS43LTU3Ljd6bTE1Ni42IDkwbC02IDQuMyAwLTE5OC4zYzAtMjcuNC0yMC42LTQ5LjctNDYtNDkuN0w3Ni44IDBjLTI1LjQgMC00NiAyMi4zLTQ2IDQ5LjdsMCAxOTguM2MtMi0xLjQtNC4zLTIuOS02LjMtNC4zLTE1LjEtMTAuNi0yNS4xIDQtMTYgMTcuNyAxOC4zIDIyLjYgNTMuMSA1MC4zIDEwNi4zIDcyLTU2LjMgMTkxLjcgMTM3LjQgMjIyLjMgMTM0LjMgMTI0LjEgMC0uNyAuMy01Ni42IC4zLTk2LjYgNS4xIDEuMSA5LjQgMi4zIDEzLjcgMy4xIDAgMzkuNyAuMyA5Mi44IC4zIDkzLjUtMy4xIDk4LjMgMTkwLjYgNjcuNyAxMzQuMy0xMjQgNTMuMS0yMS43IDg4LTQ5LjQgMTA2LjMtNzIgOS4xLTEzLjgtLjktMjguMy0xNi4xLTE3Ljh6bS0zMC41IDE5LjJjLTY4LjkgMzcuNC0xMjguMyAzMS4xLTE2MC42IDI5LjctMjMuNy0uOS0zMi42IDkuMS0zMy43IDI0LjktMTAuMy03LjctMTguNi0xNS41LTIwLjMtMTcuMS01LjEtNS40LTEzLjctOC0yNy4xLTcuNy0zMS43IDEuMS04OS43IDcuNC0xNTcuNC0yOGwwLTE5Mi40YzAtMzQuOSA4LjktNDUuNyA0MC42LTQ1LjdsMzE3LjcgMGMzMC4zIDAgNDAuOSAxMi45IDQwLjkgNDUuN2wwIDE5MC42LS4xIDB6Il0KICAgIH07CiAgICBmYVViZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidWJlciIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNDAyIiwgIk00MTQuMSAzMkwzMy45IDMyQzE1LjIgMzIgMCA0Ny4yIDAgNjUuOUwwIDQ0NmMwIDE4LjggMTUuMiAzNCAzMy45IDM0TDQxNCA0ODBjMTguNyAwIDMzLjktMTUuMiAzMy45LTMzLjlsMC0zODAuMkM0NDggNDcuMiA0MzIuOCAzMiA0MTQuMSAzMnpNMjM3LjYgMzkxLjFDMTYzIDM5OC42IDk2LjQgMzQ0LjIgODguOSAyNjkuNmw5NC40IDAgMCAyMC40YzAgMy43IDMgNi44IDYuOCA2LjhsNjcuOSAwYzMuNyAwIDYuOC0zIDYuOC02LjhsMC02Ny45YzAtMy43LTMtNi44LTYuOC02LjhsLTY3LjkgMGMtMy43IDAtNi44IDMtNi44IDYuOGwwIDIwLjQtOTQuNCAwYzctNjkuNCA2NS40LTEyMi4yIDEzNS4xLTEyMi4yczEyOC4xIDUyLjggMTM1LjEgMTIyLjJjNy41IDc0LjUtNDYuOSAxNDEuMS0xMjEuNSAxNDguNnoiXQogICAgfTsKICAgIGZhRGlnaXRhbE9jZWFuID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImRpZ2l0YWwtb2NlYW4iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjM5MSIsICJNODcgNDgxLjhsNzMuNyAwIDAtNzMuNi03My43IDAgMCA3My42ek0yNS40IDM0Ni42bDAgNjEuNiA2MS42IDAgMC02MS42LTYxLjYgMHpNNDkxLjYgMTc2LjlDNDY4LjYgMTAyLjcgNDA5LjIgNDMuNiAzMzUgMjAuMyAxNjQuOS0zMi44IDggOTMuNyA4IDI1NS45bDk1LjggMGMwLTEwMS44IDEwMS0xODAuNSAyMDguMS0xNDEuNyAzOS43IDE0LjMgNzEuNSA0Ni4xIDg1LjggODUuNyAzOS4xIDEwNy0zOS43IDIwNy44LTE0MS40IDIwOGwwIC4zLS4zIDAgMCA5NS44YzE2Mi42IDAgMjg4LjgtMTU2LjggMjM1LjYtMzI3LjF6bS0yMzUuMyAyMzFsMC05NS4zLTk1LjYgMCAwIDk1LjYgOTUuMyAwIDAtLjMgLjMgMHoiXQogICAgfTsKICAgIGZhU291bmRjbG91ZCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzb3VuZGNsb3VkIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYxYmUiLCAiTTY0MC4yIDI5OC42Yy0xLjMgMjMuMS0xMS41IDQ0LjgtMjguNCA2MC41cy0zOS4yIDI0LjQtNjIuMyAyNC4xbC0yMTggMGMtNC44IDAtOS40LTItMTIuOC01LjRzLTUuMy04LTUuMy0xMi44bDAtMjM0LjhjLS4yLTQgLjktOCAzLjEtMTEuNHM1LjMtNi4xIDktNy43YzAgMCAyMC4xLTEzLjkgNjIuMy0xMy45IDI1LjggMCA1MS4xIDYuOSA3My4zIDIwLjEgMTcuMyAxMC4yIDMyLjMgMjMuOCA0NC4xIDQwLjFzMjAgMzQuOCAyNC4yIDU0LjRjNy41LTIuMSAxNS4zLTMuMiAyMy4xLTMuMiAxMS43LS4xIDIzLjMgMi4yIDM0LjIgNi43czIwLjUgMTEuMyAyOC43IDE5LjcgMTQuNiAxOC4zIDE4LjkgMjkuMyA2LjMgMjIuNiA1LjkgMzQuM3ptLTM1NC0xNTMuNWMuMS0xIDAtMi0uMy0yLjlzLS44LTEuOC0xLjUtMi42LTEuNS0xLjMtMi40LTEuN2MtMS44LS44LTQtLjgtNS44IDAtLjkgLjQtMS43IDEtMi40IDEuN3MtMS4yIDEuNi0xLjUgMi42LS40IDEuOS0uMyAyLjljLTYgNzguOS0xMC42IDE1Mi45IDAgMjMxLjYgLjIgMS43IDEgMy4zIDIuMyA0LjUgMi42IDIuNCA2LjggMi40IDkuNCAwIDEuMy0xLjIgMi4xLTIuOCAyLjMtNC41IDExLjMtNzkuNCA2LjYtMTUyIDAtMjMxLjZsLjIgMHptLTQ0IDI3LjNjLS4yLTEuOC0xLjEtMy41LTIuNC00LjdzLTMuMS0xLjktNS0xLjktMy42IC43LTUgMS45LTIuMiAyLjktMi40IDQuN2MtNy45IDY3LjktNy45IDEzNi41IDAgMjA0LjQgLjMgMS44IDEuMiAzLjQgMi41IDQuNXMzLjEgMS44IDQuOCAxLjggMy41LS42IDQuOC0xLjggMi4yLTIuOCAyLjUtNC41YzguOC02Ny44IDguOC0xMzYuNSAuMS0yMDQuNGwuMSAwem0tNDQuMy02LjljLS4yLTEuOC0xLTMuNC0yLjMtNC42cy0zLTEuOC00LjgtMS44LTMuNSAuNy00LjggMS44LTIuMSAyLjgtMi4zIDQuNmMtNi43IDcyLTEwLjIgMTM5LjMgMCAyMTEuMSAwIDEuOSAuNyAzLjcgMi4xIDVzMy4xIDIuMSA1IDIuMSAzLjctLjcgNS0yLjEgMi4xLTMuMSAyLjEtNWMxMC41LTcyLjggNy4zLTEzOC4yIC4xLTIxMS4xbC0uMSAwem0tNDQgMjAuNmMwLTEuOS0uOC0zLjgtMi4xLTUuMnMtMy4yLTIuMS01LjItMi4xLTMuOCAuOC01LjIgMi4xLTIuMSAzLjItMi4xIDUuMmMtOC4xIDYzLjMtOC4xIDEyNy41IDAgMTkwLjggLjIgMS44IDEgMy40IDIuNCA0LjZzMy4xIDEuOSA0LjggMS45IDMuNS0uNyA0LjgtMS45IDIuMi0yLjggMi40LTQuNmM4LjgtNjMuMyA4LjktMTI3LjUgLjMtMTkwLjhsLS4xIDB6bS00NC41IDQ3LjZjMC0xLjktLjgtMy44LTIuMS01LjFzLTMuMi0yLjEtNS4xLTIuMS0zLjggLjgtNS4xIDIuMS0yLjEgMy4yLTIuMSA1LjFjLTEwLjUgNDkuMi01LjUgOTMuOSAuNCAxNDMuNiAuMyAxLjYgMS4xIDMuMSAyLjMgNC4yczIuOCAxLjcgNC41IDEuNyAzLjItLjYgNC41LTEuNyAyLjEtMi41IDIuMy00LjJjNi42LTUwLjQgMTEuNi05NC4xIC40LTE0My42em0tNDQuMS03LjVjLS4yLTEuOC0xLjEtMy41LTIuNC00LjhzLTMuMi0xLjktNS0xLjktMy42IC43LTUgMS45LTIuMiAyLjktMi40IDQuOGMtOS4zIDUwLjItNi4yIDk0LjQgLjMgMTQ0LjUgLjcgNy42IDEzLjYgNy41IDE0LjQgMCA3LjItNTAuOSAxMC41LTkzLjggLjMtMTQ0LjVsLS4yIDB6TTIwLjcgMjUwLjhjLS4yLTEuOC0xLjEtMy41LTIuNC00LjhzLTMuMi0xLjktNS0xLjktMy42IC43LTUgMS45LTIuMyAyLjktMi40IDQuOGMtOC41IDMzLjctNS45IDYxLjYgLjYgOTUuNCAuMiAxLjcgMSAzLjMgMi4zIDQuNHMyLjkgMS44IDQuNyAxLjggMy40LS42IDQuNy0xLjggMi4xLTIuNyAyLjMtNC40YzcuNS0zNC41IDExLjItNjEuOCAuNC05NS40bC0uMiAweiJdCiAgICB9OwogICAgZmFTcXVhcmVGaWdtYSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtZmlnbWEiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTdlNCIsICJNMzg0IDMyYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMHpNMTczLjcgOTZjLTMzIDAtNTkuOCAyNi44LTU5LjggNTkuOCAwIDIxIDEwLjggMzkuNCAyNy4yIDUwLjEtMTYuNCAxMC43LTI3LjIgMjkuMS0yNy4yIDUwLjFzMTAuOCAzOS41IDI3LjIgNTAuMWMtMTYuNCAxMC43LTI3LjIgMjkuMS0yNy4yIDUwLjEgMCAzMy4xIDI3LjEgNTkuOCA2MC4xIDU5LjggMzMuMiAwIDYwLjYtMjYuOSA2MC42LTYwLjNsMC01NS43YzEwLjYgOS44IDI0LjggMTUuOCA0MC40IDE1LjhsMS4xIDBjMzMgMCA1OS44LTI2LjggNTkuOC01OS44IDAtMjEtMTAuOC0zOS41LTI3LjItNTAuMSAxNi40LTEwLjcgMjcuMi0yOS4xIDI3LjItNTAuMSAwLTMzLTI2LjgtNTkuOC01OS44LTU5LjhMMTczLjcgOTZ6bTQxLjYgMjE5LjhsMCAzOS45YzAgMjIuNi0xOC42IDQxLTQxLjMgNDEtMjIuNCAwLTQwLjctMTguMi00MC43LTQwLjUgMC0yMi4zIDE4LjEtNDAuNCA0MC4zLTQwLjRsNDEuNyAwem0wLTEwMC4zbDAgODAuOS00MS43IDBjLTIyLjMtLjEtNDAuMy0xOC4yLTQwLjMtNDAuNSAwLTIyLjMgMTguMS00MC41IDQwLjUtNDAuNWw0MS42IDB6bTYwLjggMGMyMi4zIDAgNDAuNSAxOC4xIDQwLjUgNDAuNXMtMTguMSA0MC41LTQwLjUgNDAuNWwtMS4xIDBjLTIyLjMgMC00MC40LTE4LjEtNDAuNC00MC41czE4LjEtNDAuNSA0MC40LTQwLjVsMS4xIDB6bS02MC44LTE5LjNsLTQxLjYgMGMtMjIuMyAwLTQwLjUtMTguMS00MC41LTQwLjRzMTguMS00MC41IDQwLjUtNDAuNWw0MS42IDAgMCA4MC45em02MC44LTgwLjljMjIuMyAwIDQwLjUgMTguMSA0MC41IDQwLjVzLTE4LjEgNDAuNC00MC41IDQwLjRsLTQxLjUgMCAwLTgwLjkgNDEuNSAweiJdCiAgICB9OwogICAgZmFDcmVhdGl2ZUNvbW1vbnNTYSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjcmVhdGl2ZS1jb21tb25zLXNhIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0ZWYiLCAiTTI1NS42IDhDMzk3LjQgOCA1MDQgMTE4LjEgNTA0IDI1NiA1MDQgNDAzLjEgMzg1LjUgNTA0IDI1NS42IDUwNCAxMjEuNiA1MDQgOCAzOTQuNSA4IDI1NiA4IDEyMy4xIDExMi43IDggMjU1LjYgOHptLjggNDQuN2MtMTE4LjIgMC0yMDMuNyA5Ny45LTIwMy43IDIwMy4zIDAgMTA5LjggOTEuMiAyMDIuOCAyMDMuNyAyMDIuOCAxMDMuMiAwIDIwMi44LTgxLjEgMjAyLjgtMjAyLjggLjEtMTEzLjgtOTAuMi0yMDMuMy0yMDIuOC0yMDMuM3pNMTQ1LjcgMjIxYzEzLTgzLjkgODAuNS05NS43IDEwOC45LTk1LjcgOTkuOCAwIDEyNy41IDgyLjUgMTI3LjUgMTM0LjIgMCA2My42LTQxIDEzMi45LTEyOC45IDEzMi45LTM4LjkgMC05OS4xLTIwLTEwOS40LTk3bDYyLjUgMGMxLjUgMzAuMSAxOS42IDQ1LjIgNTQuNSA0NS4yIDIzLjMgMCA1OC0xOC4yIDU4LTgyLjggMC04Mi41LTQ5LjEtODAuNi01Ni43LTgwLjYtMzMuMSAwLTUxLjcgMTQuNi01NS44IDQzLjhsMTguMiAwLTQ5LjIgNDkuMi00OS00OS4yIDE5LjQgMHoiXQogICAgfTsKICAgIGZhQ2hyb21lID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNocm9tZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjY4IiwgIk0wIDI1NmMwLTQ2LjYgMTIuNS05MC40IDM0LjMtMTI4LjlMMTQ0LjEgMzE4LjNjMjEuOSAzOS4yIDYzLjggNjUuNyAxMTEuOSA2NS43IDE0LjMgMCAyNy4xLTIuMyA0MC44LTYuNkwyMjAuNSA1MDkuNkM5NS45IDQ5Mi4zIDAgMzg1LjMgMCAyNTZ6bTM2NS4xIDY1LjZjMTIuMy0xOS4yIDE4LjktNDIuNSAxOC45LTY1LjYgMC0zOC4yLTE2LjgtNzIuNS00My4zLTk2bDE1Mi43IDBjMTIgMjkuNiAxOC42IDYyLjEgMTguNiA5NiAwIDE0MS40LTExNC42IDI1NS4xLTI1NiAyNTZMMzY1LjEgMzIxLjZ6TTQ3Ny44IDEyOEwyNTYgMTI4Yy02Mi45IDAtMTEzLjcgNDQuMS0xMjUuNSAxMDIuN0w1NC4yIDk4LjVDMTAxIDM4LjUgMTc0IDAgMjU2IDAgMzUwLjggMCA0MzMuNSA1MS41IDQ3Ny44IDEyOHpNMzQ0IDI1NmE4OCA4OCAwIDEgMSAtMTc2IDAgODggODggMCAxIDEgMTc2IDB6Il0KICAgIH07CiAgICBmYVRyYWRlRmVkZXJhdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ0cmFkZS1mZWRlcmF0aW9uIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1MTMiLCAiTTI1NiA4LjhhMjQ3LjIgMjQ3LjIgMCAxIDAgMCA0OTQuNCAyNDcuMiAyNDcuMiAwIDEgMCAwLTQ5NC40em0wIDExLjZhMjM1LjYgMjM1LjYgMCAxIDEgMCA0NzEuMiAyMzUuNiAyMzUuNiAwIDEgMSAwLTQ3MS4yek00MTEuMSAxNjMuMWwwLTQ2LjgtMTkzLjggMCAwIDgxLjctMTU1LjEgMCAzNi43IDQ2IDExNy43IDAgMCAxOTYuOCA0OC44IDAgMC0xOTUuOCA4My4zIDAgMC00Ny04My4zIDAgMC0zNC44IDE0NS43IDAgMC0uMXptLTczLjMgNDUuMWwwIDIzLjktODIuOSAwIDAgMTk3LjQtMjYuOCAwIDAtMTk3LjQtMTIzLjggMC0yMC4xLTIzLjkgMTQzLjkgMCAwLTgwLjYgMTcxLjggMCAwIDI0LjQtMTQ1IDAgMCA1Ni4yIDgyLjkgMHptLTE2MS4zLTY5bC0xMi40LTIwLjcgMi4xIDIzLjgtMjMuNSA1LjQgMjMuMyA1LjQtMi4xIDI0IDEyLjMtMjAuNSAyMi4yIDkuNS0xNS43LTE4LjEgMTUuOC0xOC4xLTIyIDkuM3ptLTI5LjYtMTkuN2w5LjMtMTEuNS0xMi43IDUuOS04LTEyLjQgMS43IDEzLjktMTQuMyAzLjggMTMuNyAyLjctLjggMTQuNyA2LjgtMTIuMiAxMy44IDUuMy05LjUtMTAuMnpNMzEyLjMgMjY0LjdsLTEzLjEgNS42LTcuMy0xMi4yIDEuMyAxNC4yLTEzLjkgMy4yIDEzLjkgMy4yLTEuMiAxNC4yIDcuMy0xMi4yIDEzLjEgNS41LTkuNC0xMC43IDkuMy0xMC44em0xMDYuOS03Ny4ybC0yMC45IDkuMS0xMi0xOS42IDIuMiAyMi43LTIyLjMgNS40IDIyLjIgNC45LTEuOCAyMi45IDExLjUtMTkuNiAyMS4yIDguOC0xNS4xLTE3IDE1LTE3LjZ6TTI1NiAyOS45YTIyNi4xIDIyNi4xIDAgMSAwIDAgNDUyLjIgMjI2LjEgMjI2LjEgMCAxIDAgMC00NTIuMnpNMzUwLjYgMTk2bDAgNTEtODMuMyAwIDAgMTk1LjctNTIuNyAwIDAtMTk2LjgtMTE2LjcgMC00MC00OS45IDE1Ny40IDAgMC04MS42IDE5Ny44IDAgMCA1MC43LTE0NS43IDAgMCAzMC45IDgzLjIgMHpNMjU2IDQzLjJjNjAuMyAwIDExNC44IDI1IDE1My42IDY1LjJsLTE5OS4xIDAgMCA4MS42LTE1Ny40IDBDODEuMSAxMDQuOCAxNjEuNCA0My4yIDI1NiA0My4yem0wIDQyNy4xYy0xMTcuOSAwLTIxMy42LTk1LjYtMjEzLjYtMjEzLjUgMC0yMS4yIDMuMS00MS44IDguOS02MS4xbDQzLjggNTYuMyAxMTQuNyAwIDAgMTk2LjggNjQuNiAwIDAtMTk1LjggODMuMyAwIDAtNjIuNy04My4yIDAgMC0xOS4yIDE0NS42IDAgMC01MC44YzMwLjggMzcgNDkuMyA4NC42IDQ5LjMgMTM2LjUgLjEgMTE3LjktOTUuNSAyMTMuNS0yMTMuNCAyMTMuNXpNMTg2LjggMjc1bC0xMS0yMS40IDEuNyAyNC41LTIzLjcgMy45IDIzLjggNS45LTMuNyAyMy44IDEzLTIwLjkgMjEuNSAxMC44LTE1LjgtMTguOCAxNi45LTE3LjEtMjIuNyA5LjN6Il0KICAgIH07CiAgICBmYVZhYWRpbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ2YWFkaW4iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjQwOCIsICJNMjI0LjUgMTQwLjdDMjI2IDEyMy4xIDIyOS40IDg4IDI3NC4zIDg4bDk4LjYgMGMyMC43IDAgMzIuMS03LjggMzIuMS0yMS42bDAtMTIuM2MwLTEyLjIgOS4zLTIyLjEgMjEuNS0yMi4xUzQ0OCA0MS45IDQ0OCA1NC4xbDAgMzYuNWMwIDQyLjktMjEuNSA2Mi02Ni44IDYybC0xMDAuNSAwYy0zMC4xIDAtMzMgMTQuNy0zMyAyNy4xIDAgMS4zLS4xIDIuNS0uMiAzLjctLjcgMTIuMy0xMC45IDIyLjItMjMuNCAyMi4ycy0yMi43LTkuOC0yMy40LTIyLjJjLS4xLTEuMi0uMi0yLjQtLjItMy43IDAtMTIuMy0zLTI3LjEtMzMtMjcuMWwtMTAwLjcgMEMyMS41IDE1Mi42IDAgMTMzLjUgMCA5MC42TDAgNTQuMUMwIDQxLjkgOS40IDMyIDIxLjYgMzJzMjEuNSA5LjkgMjEuNSAyMi4xbDAgMTIuM0M0My4xIDgwLjIgNTQuNSA4OCA3NS4yIDg4bDk4LjYgMGM0NC44IDAgNDguMyAzNS4xIDQ5LjggNTIuN2wuOSAwek0yMjQgNDU2YzExLjUgMCAyMS40LTcgMjUuNy0xNi4zIDEuMS0xLjggOTcuMS0xNjkuNiA5OC4yLTE3MS40IDExLjktMTkuNi0zLjItNDQuMy0yNy4yLTQ0LjMtMTMuOSAwLTIzLjMgNi40LTI5LjggMjAuM0wyMjQgMzYyIDE1Ny4xIDI0NC4zYy02LjQtMTMuOS0xNS45LTIwLjMtMjkuOC0yMC4zLTI0IDAtMzkuMSAyNC42LTI3LjIgNDQuMyAxLjEgMS45IDk3LjEgMTY5LjYgOTguMiAxNzEuNCA0LjMgOS4zIDE0LjIgMTYuMyAyNS43IDE2LjN6Il0KICAgIH07CiAgICBmYURldmlhbnRhcnQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZGV2aWFudGFydCIsCiAgICAgIGljb246IFszMjAsIDUxMiwgW10sICJmMWJkIiwgIk0zMjAgOTMuMmwtOTguMiAxNzkuMSA3LjQgOS41IDkwLjggMCAwIDEyNy43LTE2MC45IDAtMTMuNSA5LjItNDMuNyA4NGMtLjMgMC04LjYgOC42LTkuMiA5LjJsLTkyLjcgMCAwLTkzLjIgOTMuMi0xNzkuNC03LjQtOS4yLTg1LjggMCAwLTEyNy42IDE1NiAwIDEzLjUtOS4yIDQzLjctODRjLjMgMCA4LjYtOC42IDkuMi05LjJsOTcuNiAwIDAgOTMuMXoiXQogICAgfTsKICAgIGZhTWVkaXVtID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1lZGl1bSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzYyNDA3LCAibWVkaXVtLW0iXSwgImYyM2EiLCAiTTM2OS40IDMyYzQzLjQgMCA3OC42IDM1LjIgNzguNiA3OC42bDAgODMuOGMtMS45LS4xLTMuOC0uMi01LjctLjJsLS40IDBjLTEwIDAtMjIuMyAyLjQtMzEuMSA2LjgtMTAgNC42LTE4LjcgMTEuNS0yNiAyMC42LTExLjggMTQuNi0xOC45IDM0LjMtMjAuNiA1Ni40LS4xIC43LS4xIDEuMy0uMiAycy0uMSAxLjItLjEgMS45Yy0uMSAxLjItLjEgMi40LS4xIDMuNiAwIDEuOS0uMSAzLjggMCA1LjggMS4yIDUwLjEgMjguMiA5MC4yIDc2LjMgOTAuMiAyLjcgMCA1LjMtLjEgNy45LS40bDAgMjAuNGMwIDQzLjQtMzUuMiA3OC42LTc4LjYgNzguNkw3OC42IDQ4MEMzNS4yIDQ4MCAwIDQ0NC44IDAgNDAxLjRMMCAxMTAuNkMwIDY3LjIgMzUuMiAzMiA3OC42IDMybDI5MC44IDB6TTgyLjMgMTM4LjlsLjMgLjFjMTMuMiAzIDE5LjggNy40IDE5LjggMjMuNGwwIDE4Ny4yYzAgMTYtNi43IDIwLjQtMTkuOSAyMy40bC0uMyAuMSAwIDIuOCA1Mi44IDAgMC0yLjgtLjMtLjFjLTEzLjItMy0xOS45LTcuNC0xOS45LTIzLjRsMC0xNzYuMyA4Ni4xIDIwMi41IDQuOSAwIDg4LjYtMjA4LjIgMCAxODYuNmMtMS4xIDEyLjYtNy44IDE2LjUtMTkuNyAxOS4ybC0uMyAuMSAwIDIuNyA5MS45IDAgMC0yLjctLjMtLjFjLTExLjktMi43LTE4LjctNi42LTE5LjktMTkuMmwtLjEtMTkxLjggLjEgMGMwLTE2IDYuNy0yMC40IDE5LjktMjMuNGwuMy0uMSAwLTIuNy03Mi4yIDAtNjcgMTU3LjQtNjctMTU3LjQtNzcuOCAwIDAgMi43ek00NDggMzQwLjNjLTI1LjEtNy40LTQzLTM1LjEtNDEuMi02Ny44bDAgMCA0MS4xIDAgMCA2Ny44em0tNi40LTEzNS42YzIuMyAwIDQuNCAuMyA2LjQgLjlsMCA1Ny40LTQwLjIgMGMxLjUtMzMuNiAxMy42LTU3LjkgMzMuOC01OC4zeiJdCiAgICB9OwogICAgZmFNZWRpdW1NID0gZmFNZWRpdW07CiAgICBmYU9wZW5jYXJ0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm9wZW5jYXJ0IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYyM2QiLCAiTTMzMS44IDQ0MC40YTQ1LjggNDUuOCAwIDEgMSA5MS41IC4zIDQ1LjggNDUuOCAwIDEgMSAtOTEuNS0uM3pNMTY5LjQgMzk0LjlhNDUuNyA0NS43IDAgMSAwIC4zIDkxLjMgNDUuNyA0NS43IDAgMSAwIC0uMy05MS4zem0yOTEuNy0yNzBjLTMwMi4yIDAtMzc5LjItMTIuOC00NjEuMS05OS4yIDM0LjQgNTEuNyA1My4zIDE0OC45IDM3My4xIDE0NC4yIDMzMy4zLTUgMTMwIDg2LjEgNzAuOCAxODguOSAxODYuNy0xNjYuNyAzMTkuNC0yMzMuOSAxNy4yLTIzMy45eiJdCiAgICB9OwogICAgZmFZQ29tYmluYXRvciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ5LWNvbWJpbmF0b3IiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjIzYiIsICJNNDQ4IDMybDAgNDQ4LTQ0OCAwIDAtNDQ4IDQ0OCAwek0yMzYgMjg3LjVsNzcuNS0xNDUuNS0zMi43IDAtNDUuOCA5MWMtNC43IDkuMy05IDE4LjMtMTIuOCAyNi44bC0xMi4yLTI2LjgtNDUuMi05MS0zNSAwIDc2LjcgMTQzLjggMCA5NC41IDI5LjUgMCAwLTkyLjh6Il0KICAgIH07CiAgICBmYUxpbmUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibGluZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmM2MwIiwgIk0zMTEgMTk2LjhsMCA4MS4zYzAgMi4xLTEuNiAzLjctMy43IDMuN2wtMTMgMGMtMS4zIDAtMi40LS43LTMtMS41TDI1NCAyMzAgMjU0IDI3OC4yYzAgMi4xLTEuNiAzLjctMy43IDMuN2wtMTMgMGMtMi4xIDAtMy43LTEuNi0zLjctMy43bDAtODEuM2MwLTIuMSAxLjYtMy43IDMuNy0zLjdsMTIuOSAwYzEuMSAwIDIuNCAuNiAzIDEuNmwzNy4zIDUwLjMgMC00OC4yYzAtMi4xIDEuNi0zLjcgMy43LTMuN2wxMyAwYzIuMS0uMSAzLjggMS42IDMuOCAzLjVsMCAuMXptLTkzLjctMy43bC0xMyAwYy0yLjEgMC0zLjcgMS42LTMuNyAzLjdsMCA4MS4zYzAgMi4xIDEuNiAzLjcgMy43IDMuN2wxMyAwYzIuMSAwIDMuNy0xLjYgMy43LTMuN2wwLTgxLjNjMC0xLjktMS42LTMuNy0zLjctMy43em0tMzEuNCA2OC4xbC0zNS42IDAgMC02NC40YzAtMi4xLTEuNi0zLjctMy43LTMuN2wtMTMgMGMtMi4xIDAtMy43IDEuNi0zLjcgMy43bDAgODEuM2MwIDEgLjMgMS44IDEgMi41IC43IC42IDEuNSAxIDIuNSAxbDUyLjIgMGMyLjEgMCAzLjctMS42IDMuNy0zLjdsMC0xM2MwLTEuOS0xLjYtMy43LTMuNS0zLjdsLjEgMHptMTkzLjctNjguMWwtNTIuMyAwYy0xLjkgMC0zLjcgMS42LTMuNyAzLjdsMCA4MS4zYzAgMS45IDEuNiAzLjcgMy43IDMuN2w1Mi4yIDBjMi4xIDAgMy43LTEuNiAzLjctMy43bDAtMTMuMWMwLTIuMS0xLjYtMy43LTMuNy0zLjdsLTM1LjUgMCAwLTEzLjYgMzUuNSAwYzIuMSAwIDMuNy0xLjYgMy43LTMuN2wwLTEzLjFjMC0yLjEtMS42LTMuNy0zLjctMy43bC0zNS41IDAgMC0xMy43IDM1LjUgMGMyLjEgMCAzLjctMS42IDMuNy0zLjdsMC0xM2MtLjEtMS45LTEuNy0zLjctMy43LTMuN2wuMSAwek01MTIgOTMuNGwwIDMyNmMtLjEgNTEuMi00Mi4xIDkyLjctOTMuNCA5Mi42bC0zMjYgMEM0MS40IDUxMS45LS4xIDQ2OS44IDAgNDE4LjZsMC0zMjZDLjEgNDEuNCA0Mi4yLS4xIDkzLjQgMGwzMjYgMGM1MS4yIC4xIDkyLjcgNDIuMSA5Mi42IDkzLjR6TTQ0MS42IDIzMy41YzAtODMuNC04My43LTE1MS4zLTE4Ni40LTE1MS4zUzY4LjggMTUwLjEgNjguOCAyMzMuNWMwIDc0LjcgNjYuMyAxMzcuNCAxNTUuOSAxNDkuMyAyMS44IDQuNyAxOS4zIDEyLjcgMTQuNCA0Mi4xLS44IDQuNy0zLjggMTguNCAxNi4xIDEwLjFzMTA3LjMtNjMuMiAxNDYuNS0xMDguMmMyNy0yOS43IDM5LjktNTkuOCAzOS45LTkzLjFsMC0uMnoiXQogICAgfTsKICAgIGZhQW1pbGlhID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImFtaWxpYSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMzZkIiwgIk0yNDAuMiAzMmMtNjEuOSAwLTEzMS41IDE2LjktMTg0LjIgNTUuNC01LjEgMy4xLTkuMSA5LjItNy4yIDE5LjQgMS4xIDUuMSA1LjEgMjcuNCAxMC4yIDM5LjYgNC4xIDEwLjIgMTQuMiAxMC4yIDIwLjMgNi4xIDMyLjUtMjIuMyA5Ni41LTQ3LjcgMTUyLjMtNDcuNyA1Ny45IDAgNTguOSAyOC40IDU4LjkgNzMuMWwwIDM4LjVDMjAzLjEgMjI3LjcgNzguMyAyNTEgNDYuOCAyNjQuMiAxMS4zIDI4MC41IDE2LjQgMzU3LjcgMTYuNCAzNzZTMzEuNiA0ODAgMTQxLjMgNDgwYzQ3LjggMCAxMTMuNy0yMC43IDE1My4zLTQyLjFsMCAyNS40YzAgMyAyLjEgOC4yIDYuMSA5LjEgMy4xIDEgNTAuNyAyIDU5LjkgMnM2Mi41IC4zIDY2LjUtLjdjNC4xLTEgNS4xLTYuMSA1LjEtOS4xbDAtMjk2LjZjLS4xLTgwLjMtNTcuOS0xMzYtMTkyLTEzNnptNTAuMiAzNDhjLTIxLjQgMTMuMi00OC43IDI0LjQtNzkuMSAyNC40LTUyLjggMC01OC45LTMzLjUtNTktNDQuNyAwLTEyLjItMy00Mi43IDE4LjMtNTIuOSAyNC4zLTEzLjIgNzUuMS0yOS40IDExOS44LTMzLjVsMCAxMDYuN3oiXQogICAgfTsKICAgIGZhQXN5bW1ldHJpayA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhc3ltbWV0cmlrIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYzNzIiLCAiTTUxNy41IDMwOS4yYzM4LjgtNDAgNTguMS04MCA1OC41LTExNi4xIC44LTY1LjUtNTkuNC0xMTguMi0xNjkuNC0xMzUtMTI4LjctMTkuNy0yODguNSAxNS41LTQwNi42IDgyLjQgNTItMjYuNSAxMTAuNi00OC4yIDE3MC43LTU4LjIgNzQuNS0yMC41IDE1My0yNS40IDIyMS4zLTE0LjggMTUyLjUgMjMuOCAxOTYuOCAxMjcuNSA5OC44IDIzMS43LTEwLjIgMTAuOC0yMiAyMS4xLTM1IDMwLjZMMzA0LjkgMTAzLjQgMTE0LjcgMzg4LjljLTY1LjYtMjkuNC03Ni41LTkwLjItMTkuMS0xNTEuMiAyMC44LTIyLjIgNDguMy00MS45IDc5LjUtNTguMSAyMC0xMi4yIDM5LjctMjIuNiA2Mi0zMC43LTY1LjEgMjAuMy0xMjIuNyA1Mi45LTE2MS42IDkyLjktMjcuNyAyOC42LTQxLjQgNTcuMS00MS43IDgyLjktLjUgMzUuMSAyMy40IDY1LjEgNjguNCA4M2wtMzQuNSA1MS43IDEwMS42IDAgMjItMzQuNGMyMi4yIDEgNDUuMyAwIDY4LjYtMi43bC0yMi44IDM3LjEgMTM1LjUgMC0zMi42LTUzLjFjMTguNi01LjMgMzYuOS0xMS41IDU0LjUtMTguN2w0NS45IDcxLjggMTAxLjYgMC03My40LTExMC40YzE4LjUtMTIuMSAzNS0yNS41IDQ4LjktMzkuOHpNMzI5LjkgMzg5LjdsLTI1LTQwLjYtMzIuNyA1My4zYy0yMy40IDMuNS00Ni43IDUuMS02OS4yIDQuNGwxMDEuOS0xNTkuMyA3OC43IDEyM2MtMTcuMiA3LjQtMzUuMyAxMy45LTUzLjcgMTkuMnoiXQogICAgfTsKICAgIGZhUGhhYnJpY2F0b3IgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicGhhYnJpY2F0b3IiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjNkYiIsICJNMzMxLjEgMjYyLjFsLS4xLTEzczIxLjctMTkuOCAyMS4xLTIxLjJsLTkuNS0yMGMtLjYtMS40LTI5LjUtLjUtMjkuNS0uNWwtOS40LTkuM3MuMi0yOC41LTEuMi0yOS4xbC0yMC4xLTkuMmMtMS40LS42LTIwLjcgMjEtMjAuNyAyMWwtMTMuMS0uMnMtMjAuNS0yMS40LTIxLjktMjAuOGwtMjAgOC4zYy0xLjQgLjUgLjIgMjguOSAuMiAyOC45bC05LjEgOS4xcy0yOS4yLS45LTI5LjcgLjRMMTYwIDIyNi4zYy0uNiAxLjQgMjEgMjEgMjEgMjFsLjEgMTIuOVMxNTkuNCAyODAgMTYwIDI4MS40bDkuNSAyMGMuNiAxLjQgMjkuNSAuNSAyOS41IC41bDkuNCA5LjNzLS4yIDMxLjggMS4yIDMyLjNsMjAuMSA4LjNjMS40IC42IDIwLjctMjMuNSAyMC43LTIzLjVsMTMuMSAuMnMyMC41IDIzLjggMjEuOCAyMy4zbDIwLTcuNWMxLjQtLjYtLjItMzIuMS0uMi0zMi4xbDkuMS05LjFzMjkuMiAuOSAyOS43LS41bDguMS0xOS44Yy43LTEuMS0yMC45LTIwLjctMjAuOS0yMC43em0tNDQuOS04LjdjLjcgMTcuMS0xMi44IDMxLjYtMzAuMSAzMi40cy0zMi4xLTEyLjUtMzIuOC0yOS42IDEyLjgtMzEuNiAzMC4xLTMyLjNjMTcuMy0uOCAzMi4xIDEyLjUgMzIuOCAyOS41em0yMDEuMi0zNy45bC05Ny05Ny0uMSAuMWMtNzUuMS03My4zLTE5NS40LTcyLjgtMjY5LjggMS42LTUwLjkgNTEtMjcuOCAyNy45LTk1LjcgOTUuMy0yMi4zIDIyLjMtMjIuMyA1OC43IDAgODEgNjkuOSA2OS40IDQ2LjQgNDYgOTcuNCA5N2wuMS0uMWM3NS4xIDczLjMgMTk1LjQgNzIuOSAyNjkuOC0xLjYgNTEtNTAuOSAyNy45LTI3LjkgOTUuMy05NS4zIDIyLjMtMjIuMyAyMi4zLTU4LjcgMC04MXpNMzYzLjUgMTQ4LjJhMTUyLjMgMTUyLjMgMCAxIDEgLTIxNSAyMTUuNiAxNTIuMyAxNTIuMyAwIDEgMSAyMTUtMjE1LjZ6Il0KICAgIH07CiAgICBmYUJvdHMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYm90cyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlMzQwIiwgIk04Ni4zIDE5Ny44Yy04LS4xLTE1LjkgMS43LTIzLjEgNS4xcy0xMy41IDguNi0xOC40IDE0LjlsMC02MS45YzAtMi4yLS45LTQuMy0yLjQtNS44cy0zLjYtMi40LTUuOC0yLjRsLTI4LjQgMGMtMi4yIDAtNC4zIC45LTUuOCAyLjRTMCAxNTMuOCAwIDE1NkwwIDMzMy42YzAgMS4xIC4yIDIuMSAuNiAzLjFzMSAxLjkgMS44IDIuNyAxLjcgMS40IDIuNyAxLjggMi4xIC42IDMuMSAuNmwyOC40IDBjMS4xIDAgMi4xLS4yIDMuMS0uNnMxLjktMSAyLjctMS44IDEuNC0xLjcgMS44LTIuNyAuNi0yLjEgLjYtMy4xbDAtOC4xYzExLjYgMTMuNCAyNS45IDE5LjggNDEuNiAxOS44IDM0LjYgMCA2MS45LTI2LjIgNjEuOS03My44IDAtNDUuOS0yNy03My42LTYxLjktNzMuNnpNNzEuNSAzMDUuN2MtOS42IDAtMjEuMi00LjktMjYuNy0xMi41bDAtNDNjNS41LTcuNiAxNy4yLTEyLjggMjYuNy0xMi44IDE3LjcgMCAzMS4xIDEzLjEgMzEuMSAzNCAwIDIxLjItMTMuNCAzNC4zLTMxLjEgMzQuM3ptMTU2LjQtNTlhMTcuNCAxNy40IDAgMSAwIDAgMzQuOCAxNy40IDE3LjQgMCAxIDAgMC0zNC44em00Ni4xLTkwbDAtNDQuN2MyLjgtMS4yIDUuMi0zLjMgNi42LTZzMS45LTUuOCAxLjMtOC45LTIuMi01LjctNC42LTcuNy01LjQtMy04LjQtMy02LjEgMS4xLTguNCAzLTQgNC43LTQuNiA3LjctLjEgNi4xIDEuMyA4LjkgMy44IDQuOCA2LjYgNmwwIDQ0LjdjLTI4IDEuMy01NC40IDEzLjYtNzMuNiAzNC4xcy0yOS41IDQ3LjctMjguOCA3NS44IDEyLjMgNTQuNyAzMi40IDc0LjMgNDcgMzAuNiA3NS4xIDMwLjYgNTUtMTEgNzUuMS0zMC42IDMxLjctNDYuMyAzMi40LTc0LjMtOS43LTU1LjMtMjguOC03NS44LTQ1LjUtMzIuOC03My42LTM0LjF6bTg2IDEwNy40YzAgMzAuNS00MC44IDU1LjMtOTEuMSA1NS4zcy05MS4xLTI0LjctOTEuMS01NS4zIDQwLjgtNTUuMyA5MS4xLTU1LjMgOTEuMSAyNC43IDkxLjEgNTUuM2wwIDB6bS01MC4yIDE3LjRjMy40IDAgNi44LTEgOS43LTIuOXM1LjEtNC42IDYuNC03LjggMS43LTYuNyAxLTEwLjEtMi4zLTYuNS00LjgtOC45LTUuNS00LjEtOC45LTQuOC02LjktLjMtMTAuMSAxLTUuOSAzLjUtNy44IDYuNC0yLjkgNi4yLTIuOSA5LjdjMCA0LjYgMS44IDkgNS4xIDEyLjNzNy43IDUuMSAxMi4zIDUuMWwwIDB6bTI3MC45LTMxYy0xNC44LTIuNi0yMi40LTMuOC0yMi40LTkuOSAwLTUuNSA3LjMtOS45IDE3LjctOS45IDEyLjIgLjEgMjQuMiAzLjYgMzQuNSAxMC4xIDEuOCAxLjIgNCAxLjYgNi4yIDEuMXM0LTEuNyA1LjEtMy42Yy4xLS4xIC4xLS4yIC4yLS4zbDguNi0xNC45YzEuMS0xLjkgMS40LTQuMSAuOC02LjFzLTEuOS0zLjktMy43LTVjLTE1LjctOS40LTMzLjctMTQuMy01Mi0xNC4xLTM5IDAtNjAuMiAyMS41LTYwLjIgNDYuMiAwIDM2LjMgMzMuNyA0MS45IDU3LjYgNDUuNiAxMy40IDIuMyAyNC4xIDQuNCAyNC4xIDExIDAgNi40LTUuNSAxMC44LTE4LjkgMTAuOC0xMy42IDAtMzEtNi4yLTQyLjYtMTMuNi0uOS0uNi0xLjktMS0zLTEuMnMtMi4xLS4yLTMuMiAuMS0yLjEgLjctMi45IDEuMy0xLjYgMS40LTIuMiAyLjNjMCAuMS0uMSAuMS0uMSAuMmwtMTAuMiAxNi45Yy0xLjEgMS44LTEuNCA0LTEgNnMxLjcgMy45IDMuNSA1YzE1LjIgMTAuMyAzNy43IDE2LjcgNTkuNCAxNi43IDQwLjQgMCA2NC0xOS44IDY0LTQ2LjUgMC0zOC4xLTM1LjUtNDMuOS01OS4zLTQ4LjN6bS05NS45IDYwLjhjLS41LTItMS44LTMuNy0zLjYtNC44cy0zLjktMS41LTUuOS0xLjFjLTEuNCAuMy0yLjggLjQtNC4yIC40LTcuOCAwLTEyLjUtNi4xLTEyLjUtMTQuMmwwLTUxLjIgMjAuMyAwYzIuMiAwIDQuMi0uOSA1LjgtMi40czIuNC0zLjYgMi40LTUuOGwwLTIyLjdjMC0yLjItLjktNC4yLTIuNC01LjhzLTMuNi0yLjQtNS44LTIuNGwtMjAuMyAwIDAtMzAuMmMwLTIuMi0uOS00LjItMi40LTUuOHMtMy42LTIuNC01LjgtMi40bC0yOC4yIDBjLTIuMiAwLTQuMiAuOS01LjggMi40cy0yLjQgMy42LTIuNCA1LjhsMCAzMC4yLTE1LjEgMGMtMS4xIDAtMi4xIC4yLTMuMSAuNnMtMS45IDEtMi42IDEuOC0xLjQgMS43LTEuOCAyLjYtLjYgMi0uNiAzLjFsMCAyMi43YzAgMS4xIC4yIDIuMSAuNiAzLjFzMSAxLjkgMS44IDIuNiAxLjcgMS40IDIuNiAxLjggMiAuNiAzLjEgLjZsMTUuMSAwIDAgNjMuN2MwIDI3IDE1LjQgNDEuMyA0My45IDQxLjMgMTIuMiAwIDIxLjQtMi4yIDI3LjYtNS40IDEuNi0uOCAyLjktMi4yIDMuNy0zLjlzLjktMy42IC41LTUuNGwtNS0xOS4zeiJdCiAgICB9OwogICAgZmFWaW5lID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInZpbmUiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjFjYSIsICJNMzg0IDI1NC43bDAgNTIuMWMtMTguNCA0LjItMzYuOSA2LjEtNTIuMSA2LjEtMzYuOSA3Ny40LTEwMyAxNDMuOC0xMjUuMSAxNTYuMi0xNCA3LjktMjcuMSA4LjQtNDIuNy0uOC0yNy4xLTE2LjMtMTI5LjktMTAwLjYtMTY0LjEtMzY1LjZsNzQuNSAwYzE4LjcgMTU5LjEgNjQuNSAyNDAuNyAxMTQuOCAzMDEuOCAyNy45LTI3LjkgNTQuOC02NS4xIDc1LjYtMTA2LjktNDkuOC0yNS4zLTgwLjEtODAuOS04MC4xLTE0NS42IDAtNjUuNiAzNy43LTExNS4xIDEwMi4yLTExNS4xIDExNC45IDAgMTA2LjIgMTI3LjkgODEuNiAxODEuNSAwIDAtNDYuNCA5LjItNjMuNS0yMC41IDMuNC0xMS4zIDguMi0zMC44IDguMi00OC41IDAtMzEuMy0xMS4zLTQ2LjYtMjguNC00Ni42LTE4LjIgMC0zMC44IDE3LjEtMzAuOCA1MCAuMSA3OS4yIDU5LjQgMTE4LjcgMTI5LjkgMTAxLjl6Il0KICAgIH07CiAgICBmYU1lZHJ0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1lZHJ0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYzYzgiLCAiTTEyOS43IDI1NmMwIDEyMS44IDgzLjkgMjIyLjggMTkzLjUgMjQxLjEtMTguNyA0LjUtMzguMiA2LjktNTguMiA2LjktMTM3LjYgMC0yNDktMTExLTI0OS0yNDhTMTI3LjQgOCAyNjQuOSA4YzIwLjEgMCAzOS42IDIuNCA1OC4yIDYuOS0xMDkuNiAxOC4zLTE5My40IDExOS4zLTE5My40IDI0MS4xek00MjcuMSAzNTYuM2MtNzcuNyA1NS40LTE3OS42IDQ3LjUtMjQwLjQtMTQuNiA1LjUgMTQuMSAxMi43IDI3LjcgMjEuNyA0MC41IDYxLjYgODguMiAxODIuNCAxMDkuMyAyNjkuNyA0N3MxMDguMS0xODQuMyA0Ni41LTI3Mi42Yy05LTEyLjktMTkuMy0yNC4zLTMwLjUtMzQuMiAzNy40IDc4LjggMTAuNyAxNzguNS02NyAyMzMuOXptLTIxOC44LTI0NGMtMS40IDEtMi43IDIuMS00IDMuMSA2NC4zLTE3LjggMTM1LjkgNCAxNzguOSA2MC41IDM1LjcgNDcgNDIuOSAxMDYuNiAyNC40IDE1OCA1Ni43LTU2LjIgNjcuNi0xNDIuMSAyMi4zLTIwMS44LTUwLTY1LjUtMTQ5LjEtNzQuNC0yMjEuNi0xOS44ek0zMTIgMjI0Yy00LjQgMC04LTMuNi04LThsMC00MGMwLTQuNC0zLjYtOC04LThsLTQ4IDBjLTQuNCAwLTggMy42LTggOGwwIDQwYzAgNC40LTMuNiA4LTggOGwtNDAgMGMtNC40IDAtOCAzLjYtOCA4bDAgNDhjMCA0LjQgMy42IDggOCA4bDQwIDBjNC40IDAgOCAzLjYgOCA4bDAgNDBjMCA0LjQgMy42IDggOCA4bDQ4IDBjNC40IDAgOC0zLjYgOC04bDAtNDBjMC00LjQgMy42LTggOC04bDQwIDBjNC40IDAgOC0zLjYgOC04bDAtNDhjMC00LjQtMy42LTgtOC04bC00MCAweiJdCiAgICB9OwogICAgZmFPc2kgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAib3NpIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0MWEiLCAiTTggMjY2LjRjMi4zLTEzNS44IDk3LjQtMjMyLjQgMjEzLjgtMjQ4LjEgMTM4LjgtMTguNiAyNTUuNiA3NS44IDI3OCAyMDEuMSAyMS4zIDExOC44LTQ0IDIzMC0xNTEuNiAyNzQtOS4zIDMuOC0xNC40IDEuNy0xOC03LjctMTcuOC00Ni4zLTM1LjYtOTIuNi01My40LTEzOS0zLjEtOC4xLTEtMTMuMiA3LTE2LjggMjQuMi0xMSAzOS4zLTI5LjQgNDMuMy01NS44IDEuNS05LjcgMS0xOS42LTEuNS0yOS4xcy02LjktMTguNC0xMi45LTI2LjEtMTMuNi0xNC4xLTIyLjItMTguOC0xOC4xLTcuNS0yNy45LTguM2MtMzktMy40LTcxLjggMjMuNy03Ny41IDU5LjctNS4yIDMzIDExLjEgNjMuNyA0MS45IDc3LjcgOS42IDQuNCAxMS41IDguNiA3LjggMTguNC0xNy45IDQ2LjYtMzUuOCA5My4yLTUzLjcgMTM5LjktMi42IDYuOS04LjMgOS4zLTE1LjUgNi41LTUyLjYtMjAuMy0xMDEuNC02MS0xMzAuOC0xMTktMjQuOS00OS4yLTI1LjItODcuNy0yNi44LTEwOC43em0yMC45LTEuOWMuNCA2LjYgLjYgMTQuMyAxLjMgMjIuMSA2LjMgNzEuOSA0OS42IDE0My41IDEzMSAxODMuMSAzLjIgMS41IDQuNCAuOCA1LjYtMi4zIDE0LjktMzkuMSAyOS45LTc4LjIgNDUtMTE3LjMgMS4zLTMuMyAuNi00LjgtMi40LTYuNy0zMS42LTE5LjktNDcuMy00OC41LTQ1LjYtODYgMS0yMS42IDkuMy00MC41IDIzLjgtNTYuMyAzMC0zMi43IDc3LTM5LjggMTE1LjUtMTcuNiAxNS42IDkgMjguMiAyMi4zIDM2LjIgMzguNHMxMS4yIDM0LjIgOSA1MmMtMy42IDMwLjYtMTkuMyA1My45LTQ1LjcgNjkuOC0yLjcgMS42LTMuNSAyLjktMi4zIDYgMTUuMiAzOS4yIDMwLjMgNzguNCA0NS4yIDExNy43IDEuMiAzLjEgMi40IDMuOCA1LjYgMi4zIDM1LjUtMTYuNiA2NS4yLTQwLjMgODguMS03MiAzNC44LTQ4LjIgNDkuMS0xMDEuOSA0Mi4zLTE2MS0xMy43LTExNy41LTExOS40LTIxNC44LTI1NS41LTE5OC0xMDYuMSAxMy0xOTUuMyAxMDIuNS0xOTcuMSAyMjUuOHoiXQogICAgfTsKICAgIGZhR2cgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZ2ciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjI2MCIsICJNMTc5LjIgMjMwLjRsMTAyLjQgMTAyLjQtMTAyLjQgMTAyLjQtMTc5LjItMTc5LjIgMTc5LjItMTc5LjIgNDQuOCA0NC44LTI1LjYgMjUuNi0xOS4yLTE5LjItMTI4IDEyOCAxMjggMTI4IDUxLjUtNTEuNS03Ny4xLTc2LjUgMjUuNi0yNS42ek0zMzIuOCA3Ni44bC0xMDIuNCAxMDIuNCAxMDIuNCAxMDIuNCAyNS42LTI1LjYtNzcuMS03Ni41IDUxLjUtNTEuNSAxMjggMTI4LTEyOCAxMjgtMTkuMi0xOS4yLTI1LjYgMjUuNiA0NC44IDQ0LjggMTc5LjItMTc5LjItMTc5LjItMTc5LjJ6Il0KICAgIH07CiAgICBmYUJ1eXNlbGxhZHMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYnV5c2VsbGFkcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMjBkIiwgIk0yMjQgMTUwLjdsNDIuOSAxNjAuNy04NS44IDAgNDIuOS0xNjAuN3pNNDQ4IDgwbDAgMzUyYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDQ4IDQ4MGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCA4MEMwIDUzLjUgMjEuNSAzMiA0OCAzMmwzNTIgMGMyNi41IDAgNDggMjEuNSA0OCA0OHpNMzgyLjcgNDA1LjNsLTk0LjUtMjk4LjctMTI4LjQgMC05NC41IDI5OC43IDkwLjcgMCAxMTEuNy05MS42IDI0LjIgOTEuNiA5MC44IDB6Il0KICAgIH07CiAgICBmYUdvb2dsZVBsdXMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZ29vZ2xlLXBsdXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjJiMyIsICJNMjU2IDhhMjQ4IDI0OCAwIDEgMCAwIDQ5NiAyNDggMjQ4IDAgMSAwIDAtNDk2ek0xODUuMyAzODBjLTMyLjkgMC02NC40LTEzLjEtODcuNy0zNi4zcy0zNi4zLTU0LjgtMzYuMy04Ny43IDEzLjEtNjQuNCAzNi4zLTg3LjcgNTQuOC0zNi4zIDg3LjctMzYuM2MzMS4zIDAgNjAuMSAxMSA4MyAzMi4zbC0zMy42IDMyLjZjLTEzLjItMTIuOS0zMS4zLTE5LjEtNDkuNC0xOS4xLTQyLjkgMC03Ny4yIDM1LjUtNzcuMiA3OC4xUzE0Mi4zIDMzNCAxODUuMyAzMzRjMzIuNiAwIDY0LjktMTkuMSA3MC4xLTUzLjNsLTcwLjEgMCAwLTQyLjYgMTE2LjkgMGMxLjMgNi44IDEuOSAxMy44IDEuOSAyMC43IDAgNzAuOC00Ny41IDEyMS4yLTExOC44IDEyMS4yek00MTUuNSAyNzMuOGwwIDM1LjUtMzUuNSAwIDAtMzUuNS0zNS41IDAgMC0zNS41IDM1LjUgMCAwLTM1LjUgMzUuNSAwIDAgMzUuNSAzNS4yIDAgMCAzNS41LTM1LjIgMHoiXQogICAgfTsKICAgIGZhU2NyZWVucGFsID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNjcmVlbnBhbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTcwIiwgIk0yNzguNiAyMi41YTIyLjUgMjIuNSAwIDEgMSAtNDUgMCAyMi41IDIyLjUgMCAxIDEgNDUgMHpNMTk4LjcgMjU5YTU3LjQgNTcuNCAwIDEgMSAxMTQuOCAwIDU3LjQgNTcuNCAwIDEgMSAtMTE0LjggMHptMTM4LjYgOTFjMjIuMy0xOS45IDM2LjUtNDcuMyAzOS45LTc3bDExOS41IDBjLTMuNSA2MS40LTMwLjQgMTE5LjItNzUuMiAxNjEuNC00NC43IDQyLjItMTAzLjkgNjUuOC0xNjUuNCA2NS44UzEzNS40IDQ3Ni42IDkwLjcgNDM0LjRDNDUuOSAzOTIuMiAxOS4xIDMzNC40IDE1LjUgMjczbDExOS43IDBjMy40IDI5LjcgMTcuNiA1Ny4xIDM5LjkgNzdzNTEuMiAzMC45IDgxLjEgMzAuOWMyOSAwIDU4LjctMTEgODEuMS0zMC45ek0yOC4zIDE0MS43YTIyLjUgMjIuNSAwIDEgMSA0NS0xLjQgMjIuNSAyMi41IDAgMSAxIC00NSAxLjR6bTQ1NS42LS43YTIyLjQgMjIuNCAwIDEgMSAtNDQuOSAwIDIyLjQgMjIuNCAwIDEgMSA0NC45IDB6TTMxOCA5NS4zYy0xNy4zIDEzLjgtMzkuMiAyMi44LTYxLjkgMjIuOHMtNDQuNi05LTYxLjktMjIuOGMtMTcuMy0xNC43LTI4LjgtMzUuMS0zMi40LTU3LjUgMTUuMS02LjQgMzAuOC0xMS4zIDQ2LjktMTQuNSAwIDEyLjYgNSAyNC42IDEzLjkgMzMuNXMyMC45IDEzLjkgMzMuNSAxMy45IDI0LjYtNSAzMy41LTEzLjkgMTMuOS0yMC45IDEzLjktMzMuNWMxNi4xIDMuMiAzMS44IDguMSA0Ni45IDE0LjUtMy42IDIyLjQtMTUuMSA0Mi44LTMyLjQgNTcuNXpNODIuOSAyMzFjLTIxLjQgNy42LTQ0LjcgNy40LTY1LjktLjYgMi0xNi4zIDUuNi0zMi4zIDEwLjgtNDcuOSA1LjQgMy4xIDExLjMgNS4xIDE3LjUgNiA2LjIgLjggMTIuNCAuNCAxOC41LTEuMiA2LTEuNyAxMS42LTQuNCAxNi42LTguMnM5LjEtOC41IDEyLjItMTMuOSA1LjEtMTEuNCA2LTE3LjVjLjgtNi4yIC40LTEyLjUtMS4yLTE4LjVzLTQuNC0xMS42LTguMi0xNi42Yy0zLjgtNC45LTguNS05LjEtMTMuOS0xMi4yIDEwLjgtMTIuMyAyMi45LTIzLjUgMzYtMzMuMyAxNy42IDE0LjMgMjkuNSAzNC41IDMzLjYgNTYuOHMuMSA0NS40LTExLjIgNjVjLTExLjQgMTkuNi0yOS40IDM0LjUtNTAuNyA0Mi4xem0zNDYuNCAuMWMtMjEuMy03LjYtMzkuMy0yMi42LTUwLjctNDIuMi0xMS4zLTE5LjYtMTUuMi00Mi43LTExLjEtNjUgNC4xLTIyLjIgMTYtNDIuNCAzMy41LTU2LjcgMTMuMSA5LjggMjUuMiAyMSAzNiAzMy4zLTEwLjcgNi40LTE4LjQgMTYuNy0yMS41IDI4LjgtMy4yIDEyLTIuMyAyNC44IDQuOCAzNS42IDYuMiAxMC44IDE2LjQgMTguNyAyOC40IDIyczI0LjkgMS43IDM1LjctNC4zYzUuMyAxNS41IDguOSAzMS42IDEwLjkgNDcuOC0yMi4xIDguMS00NC42IDguMy02NiAuN3oiXQogICAgfTsKICAgIGZhQml0Y29pbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJiaXRjb2luIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzNzkiLCAiTTggMjU2YTI0OCAyNDggMCAxIDEgNDk2IDAgMjQ4IDI0OCAwIDEgMSAtNDk2IDB6bTM1NC4zLTM1LjNjNC45LTMzLTIwLjItNTAuNy01NC42LTYyLjZsMTEuMS00NC43LTI3LjItNi44LTEwLjkgNDMuNWMtNy4yLTEuOC0xNC41LTMuNS0yMS44LTUuMWwxMC45LTQzLjgtMjcuMi02LjgtMTEuMiA0NC43Yy01LjktMS4zLTExLjctMi43LTE3LjQtNC4xbDAtLjEtMzcuNS05LjQtNy4yIDI5LjFzMjAuMiA0LjYgMTkuOCA0LjljMTEgMi44IDEzIDEwIDEyLjcgMTUuOGwtMTIuNyA1MC45Yy44IC4yIDEuNyAuNSAyLjggLjktLjktLjItMS45LS41LTIuOS0uN2wtMTcuOCA3MS4zYy0xLjMgMy4zLTQuOCA4LjQtMTIuNSA2LjUgLjMgLjQtMTkuOC00LjktMTkuOC00LjlsLTEzLjUgMzEuMSAzNS40IDguOGM2LjYgMS43IDEzIDMuNCAxOS40IDVsLTExLjMgNDUuMiAyNy4yIDYuOCAxMS4yLTQ0LjdjNy4yIDIgMTQuNCAzLjggMjEuNyA1LjZsLTExLjEgNDQuNSAyNy4yIDYuOCAxMS4zLTQ1LjFjNDYuNCA4LjggODEuMyA1LjIgOTYtMzYuNyAxMS44LTMzLjgtLjYtNTMuMy0yNS02NiAxNy44LTQuMSAzMS4yLTE1LjggMzQuNy0zOS45em0tNjIuMiA4Ny4yYy04LjQgMzMuOC02NS4zIDE1LjUtODMuOCAxMC45bDE0LjktNTkuOWMxOC40IDQuNiA3Ny42IDEzLjcgNjguOCA0OXptOC40LTg3LjdjLTcuNyAzMC43LTU1IDE1LjEtNzAuNCAxMS4zbDEzLjUtNTQuM2MxNS40IDMuOCA2NC44IDExIDU2LjggNDN6Il0KICAgIH07CiAgICBmYVN3aWZ0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInN3aWZ0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY4ZTEiLCAiTTQ0OCAxNTYuMWMwLTQuNS0uMS05LS4yLTEzLjUtLjEtOS45LTEtMTkuNy0yLjYtMjkuNC0xLjctOS43LTQuOC0xOS4yLTkuMi0yOC05LTE3LjctMjMuNC0zMi4xLTQxLjItNDEuMS04LjgtNC41LTE4LjMtNy42LTI4LTkuMi05LjctMS42LTE5LjYtMi41LTI5LjQtMi42LTQuNS0uMS05LS4yLTEzLjUtLjJMMTI0LjEgMzJjLTQuNSAwLTkgLjEtMTMuNSAuMi0yLjQgLjEtNC45IC4yLTcuNCAuMy03LjQgLjMtMTQuOCAxLjEtMjIuMSAyLjMtNy4zIDEuMy0xNC40IDMuMy0yMS4yIDYuMS0yLjMgMS00LjYgMi02LjggMy4xLTYuNiAzLjQtMTIuOCA3LjUtMTguNCAxMi4zLTEuOSAxLjYtMy43IDMuMy01LjQgNS03IDctMTIuOSAxNS0xNy40IDIzLjgtNC40IDguOC03LjYgMTguMy05LjIgMjgtMS42IDkuNy0yLjQgMTkuNi0yLjUgMjkuNC0uMSA0LjUtLjIgOS0uMiAxMy41TDAgMzU1LjljMCA0LjUgLjEgOSAuMiAxMy41IC4xIDkuOSAxIDE5LjcgMi42IDI5LjQgMS43IDkuNyA0LjggMTkuMiA5LjIgMjggOSAxNy43IDIzLjQgMzIuMSA0MS4xIDQxLjEgOC44IDQuNCAxOC4zIDcuNSAyOCA5LjIgOS43IDEuNiAxOS42IDIuNSAyOS40IDIuNiA0LjUgLjEgOSAuMiAxMy41IC4ybDE5OS44IDBjNC41IDAgOS0uMSAxMy41LS4yIDkuOS0uMSAxOS43LTEgMjkuNC0yLjYgOS43LTEuNyAxOS4yLTQuOCAyOC05LjIgMTcuNy05IDMyLjEtMjMuNCA0MS4xLTQxLjIgNC40LTguOCA3LjYtMTguMyA5LjItMjggMS42LTkuNyAyLjUtMTkuNiAyLjYtMjkuNCAuMS00LjUgLjItOSAuMi0xMy41bDAtMTgzLjhjMC01LjQgMC0xMC43IDAtMTZ6bS02OS45IDI0MWMtMjAtMzguOS01Ny4yLTI5LjMtNzYuMy0xOS41LTEuNyAxLTMuNSAyLTUuMiAzbC0uNCAuMmMtMzkuNSAyMS05Mi41IDIyLjUtMTQ1LjgtLjQtNDMuNC0xOC44LTgwLjEtNTAuMy0xMDUuMy05MC40IDEyLjMgOS4xIDI1LjQgMTYuOSAzOS4yIDIzLjQgNTYuNCAyNi40IDExMyAyNC41IDE1MyAwLTU3LTQzLjgtMTA0LjYtMTAxLTE0MS4xLTE0Ny4yLTctOC4xLTEzLjItMTYuOC0xOC44LTI1LjkgNDMuNyA0MCAxMTIuNyA5MC4yIDEzNy41IDEwNC4xLTUyLjYtNTUuNS05OC45LTEyMy45LTk2LjctMTIxLjcgODIuOCA4My40IDE1OS4yIDEzMC42IDE1OS4yIDEzMC42IDIuOSAxLjYgNSAyLjggNi43IDQgMS42LTQuMSAzLTguMiA0LjItMTIuNSAxMy4yLTQ4LjMtMS43LTEwMy42LTM1LjMtMTQ5LjIgNzYuOCA0Ni4xIDEyMi4yIDEzMy43IDEwMy42IDIwNy44LS40IDEuNy0xIDMuNC0xLjQgNS4xIDM4LjUgNDcuNCAyOCA5OC4yIDIzLjEgODguNmwwIDB6Il0KICAgIH07CiAgICBmYUZpbGVzUGlud2hlZWwgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZmlsZXMtcGlud2hlZWwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTY5ZiIsICJNMjUzLjUgMjQ2LjRMMTM3LjIgMTMwLjJjLS42LS42LTEtMS4zLTEuNC0ycy0uNS0xLjYtLjUtMi40IC4yLTEuNiAuNS0yLjQgLjgtMS40IDEuNC0yTDI1My42IDUuMWMuOS0uOSAyLTEuNSAzLjItMS43czIuNS0uMSAzLjYgLjMgMi4xIDEuMyAyLjggMi4zIDEuMSAyLjIgMS4xIDMuNWwwIDIzMi41YzAgMS4zLS4zIDIuNS0xIDMuNnMtMS43IDEuOS0yLjkgMi40LTIuNSAuNi0zLjcgLjMtMi40LS45LTMuMi0xLjl6bTQwLjMtNC40bDAtMTM0LjRjMC0uOCAuMS0xLjYgLjUtMi40cy44LTEuNSAxLjMtMi4xIDEuMy0xLjEgMi0xLjQgMS42LS41IDIuNC0uNWwxMzQuNCAwYzEuMiAwIDIuNSAuNCAzLjUgMS4xczEuOCAxLjcgMi4zIDIuOCAuNiAyLjQgLjMgMy42LS45IDIuMy0xLjcgMy4yTDMwNC4zIDI0Ni40Yy0uOSAuOC0yIDEuNC0zLjIgMS42cy0yLjQgLjEtMy41LS40LTIuMS0xLjMtMi44LTIuMy0xLjEtMi4yLTEuMS0zLjRsLjEgLjF6bTMwLjYgMzVjLTEuMiAwLTIuNS0uMy0zLjUtMXMtMS45LTEuNi0yLjQtMi44LS42LTIuNC0uNC0zLjYgLjgtMi4zIDEuNy0zLjJMNDA0IDE4Mi4yYy42LS42IDEuMy0xIDItMS40czEuNi0uNSAyLjQtLjUgMS42IC4yIDIuNCAuNSAxLjQgLjggMiAxLjRsODQuNCA4NC4yYy45IC45IDEuNSAyIDEuNyAzLjJzLjEgMi41LS4zIDMuNi0xLjMgMi4xLTIuMyAyLjgtMi4yIDEuMS0zLjUgMS4xbC0xNjguNSAwIC4xLS4xem05MC43IDEzMWwtOTUuMy05NS4yYy0uOS0uOS0xLjUtMi0xLjctMy4ycy0uMS0yLjUgLjQtMy43IDEuMy0yLjEgMi40LTIuOCAyLjMtMSAzLjUtMWw5NS4yIDBjMS43IDAgMy4yIC43IDQuNCAxLjhzMS44IDIuOCAxLjggNC40bDAgOTUuM2MwIDEuMi0uNCAyLjUtMS4xIDMuNXMtMS43IDEuOC0yLjggMi4zLTIuNCAuNi0zLjYgLjMtMi4zLS45LTMuMi0xLjd6TTE2LjggMzAyLjFsMjE2LjkgMGMxLjIgMCAyLjUgLjQgMy41IDEuMXMxLjggMS43IDIuMyAyLjggLjYgMi40IC4zIDMuNi0uOCAyLjMtMS43IDMuMkwxMjkuNyA0MjEuMmMtLjYgLjYtMS4zIDEtMiAxLjRzLTEuNiAuNS0yLjQgLjUtMS42LS4yLTIuNC0uNS0xLjQtLjgtMi0xLjRMMTIuMyAzMTIuOGMtLjktLjktMS41LTItMS43LTMuMnMtLjEtMi41IC40LTMuNiAxLjMtMi4xIDIuMy0yLjggMi4zLTEgMy41LTFsMC0uMXpNMjY0LjMgNDY1LjNjMCAuOC0uMiAxLjYtLjUgMi40cy0uOCAxLjUtMS40IDItMS4zIDEtMiAxLjQtMS42IC41LTIuNCAuNWwtMTI4IDBjLTEuMiAwLTIuNS0uNC0zLjUtMS4xcy0xLjgtMS43LTIuMy0yLjgtLjYtMi40LS4zLTMuNiAuOC0yLjMgMS43LTMuMmwxMjgtMTI4Yy45LS45IDItMS41IDMuMi0xLjdzMi41LS4xIDMuNiAuMyAyLjEgMS4zIDIuOCAyLjMgMS4xIDIuMiAxLjEgMy41bDAgMTI4em00MC0xMzIuNWw4Mi44IDgyLjdjLjYgLjYgMSAxLjMgMS40IDJzLjUgMS42IC41IDIuNC0uMiAxLjYtLjUgMi40LS44IDEuNC0xLjQgMkwzMDQuMyA1MDdjLS45IC45LTIgMS41LTMuMiAxLjdzLTIuNSAuMS0zLjYtLjMtMi4xLTEuMy0yLjgtMi4zLTEuMS0yLjItMS4xLTMuNWwwLTE2NS40YzAtMS4yIC40LTIuNSAxLjEtMy41czEuNy0xLjggMi44LTIuMyAyLjQtLjYgMy42LS4zIDIuMyAuOCAzLjIgMS43ek03OSAxMjIuNGMwLTEuMiAuMy0yLjUgMS0zLjVzMS43LTEuOCAyLjgtMi4zIDIuNC0uNiAzLjYtLjQgMi4zIC44IDMuMiAxLjdMMjM4LjEgMjY2LjRjLjkgLjkgMS41IDIgMS43IDMuMnMuMSAyLjUtLjMgMy42LTEuMyAyLjEtMi4zIDIuOC0yLjIgMS4xLTMuNSAxLjFsLTE0OC40IDBjLTEuNyAwLTMuMi0uNy00LjQtMS44cy0xLjgtMi44LTEuOC00LjRsMC0xNDguNC0uMS0uMXoiXQogICAgfTsKICAgIGZhTGFyYXZlbCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJsYXJhdmVsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzYmQiLCAiTTUwNC42IDExNS44Yy0uMS0uMi0uMi0uNS0uMy0uNy0uMS0uNC0uMy0uOC0uNS0xLjItLjItLjItLjMtLjUtLjUtLjctLjItLjMtLjUtLjYtLjctLjktLjItLjItLjUtLjQtLjgtLjYtLjMtLjItLjYtLjUtLjktLjdMNDA0LjYgNTUuNWMtMS4yLS43LTIuNi0xLjEtNC0xLjFzLTIuOCAuNC00IDEuMUwzMDAuMyAxMTFjLS4zIC4yLS42IC40LS45IC43LS4zIC4yLS41IC40LS44IC42LS4zIC4zLS41IC42LS43IC45LS4yIC4yLS40IC40LS41IC43LS4yIC40LS40IC44LS41IDEuMi0uMSAuMi0uMiAuNC0uMyAuNy0uMiAuNy0uMyAxLjQtLjMgMi4xbDAgMTA1LjItODAuMiA0Ni4yIDAtMjA1LjljMC0uNy0uMS0xLjQtLjMtMi4xLS4xLS4yLS4yLS40LS4zLS43LS4xLS40LS4zLS44LS41LTEuMi0uMS0uMy0uNC0uNS0uNS0uNy0uMi0uMy0uNS0uNi0uNy0uOS0uMi0uMi0uNS0uNC0uOC0uNi0uMy0uMi0uNi0uNS0uOS0uN0wxMTUuOCAxLjFjLTEuMi0uNy0yLjYtMS4xLTQtMS4xcy0yLjggLjQtNCAxLjFMMTEuNSA1Ni41Yy0uMyAuMi0uNiAuNC0uOSAuNy0uMyAuMi0uNSAuNC0uOCAuNi0uMyAuMy0uNSAuNi0uNyAuOS0uMiAuMy0uNCAuNS0uNiAuNy0uMiAuNC0uNCAuOC0uNSAxLjItLjEgLjItLjIgLjQtLjMgLjctLjIgLjctLjMgMS40LS4zIDIuMWwwIDMyOS43YzAgMS40IC40IDIuOCAxLjEgNHMxLjcgMi4yIDIuOSAyLjlMMjA0IDUxMC45Yy40IC4yIC45IC40IDEuMyAuNSAuMiAuMSAuNCAuMiAuNiAuMyAxLjMgLjQgMi44IC40IDQuMSAwIC4yLS4xIC40LS4yIC42LS4yIC41LS4yIDEtLjMgMS40LS42TDQwNC42IDQwMC4xYzEuMi0uNyAyLjItMS43IDIuOS0yLjlzMS4xLTIuNiAxLjEtNGwwLTEwNS4zIDkyLjItNTMuMWMxLjItLjcgMi4yLTEuNyAyLjktM3MxLjEtMi42IDEuMS00bDAtMTA5LjhjMC0uNy0uMS0xLjQtLjItMi4xek0xMTEuOCAxNy4zbDgwLjIgNDYuMS04MC4yIDQ2LjItODAuMi00Ni4yIDgwLjItNDYuMnptODguMiA2MGwwIDIwMS4zYy0zMy4yIDE5LjEtNTkuOSAzNC41LTgwLjIgNDYuMmwwLTIwMS4zQzE1MyAxMDQuNCAxNzkuNyA4OSAyMDAgNzcuM3ptMCA0MTIuOEwyMy41IDM4OC41IDIzLjUgNzcuM2MyMC4zIDExLjcgNDcuMSAyNy4xIDgwLjIgNDYuMmwwIDIxNS4yYzAgLjMgLjEgLjYgLjEgLjkgMCAuNCAuMSAuOCAuMiAxLjIgLjEgLjMgLjIgLjYgLjQgLjkgLjEgLjMgLjMgLjcgLjQgMSAuMiAuMyAuNCAuNSAuNiAuOCAuMiAuMyAuNCAuNiAuNyAuOCAuMiAuMiAuNSAuNCAuOCAuNiAuMyAuMiAuNiAuNSAuOSAuN2w5Mi4yIDUyLjIgLjEgOTIuNHptOC0xMDYuMkwxMjggMzM4LjZjNTQuNy0zMS41IDExMy41LTY1LjMgMTc2LjMtMTAxLjVsODAuMSA0Ni4xQzM1NSAzMDAgMjk2LjIgMzMzLjUgMjA4IDM4My45em0xODQuNSA0LjZsLTE3Ni41IDEwMS42IDAtOTIuM0MzMTcuNCAzNDAgMzc2LjIgMzA2LjQgMzkyLjUgMjk3bDAgOTEuNHptMC0xMTkuMWMtMjAuMy0xMS42LTQ3LjEtMjctODAuMi00Ni4xbDAtOTEuNGMyMC4zIDExLjcgNDcuMSAyNy4xIDgwLjIgNDYuMmwwIDkxLjN6bTgtMTA1LjNsLTgwLjItNDYuMiA4MC4yLTQ2LjIgODAuMiA0Ni4xLTgwLjIgNDYuMnptOCAxMDUuM2wwLTkxLjNjMzMuMi0xOS4xIDYwLTM0LjUgODAuMy00Ni4ybDAgOTEuNC04MC4zIDQ2LjJ6Il0KICAgIH07CiAgICBmYVdwZm9ybXMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAid3Bmb3JtcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMjk4IiwgIk00NDggNzUuMmwwIDM2MS43YzAgMjQuMy0xOSA0My4yLTQzLjIgNDMuMmwtMzYxLjYgMEMxOS4zIDQ4MCAwIDQ2MS40IDAgNDM2LjhMMCA3NS4yQzAgNTEuMSAxOC44IDMyIDQzLjIgMzJsMzYxLjcgMGMyNCAwIDQzLjEgMTguOCA0My4xIDQzLjJ6TTQxMC43IDQzNi44bDAtMzYxLjZjMC0zLTIuNi01LjgtNS44LTUuOGwtOS4zIDAtMTEwLjMgNzQuNi02MS4zLTQ5LjktNjEuMiA0OS45LTExMC4zLTc0LjctOS4zIDBjLTMuMiAwLTUuOCAyLjgtNS44IDUuOGwwIDM2MS43YzAgMyAyLjYgNS44IDUuOCA1LjhsMzYxLjcgMGMzLjIgLjEgNS44LTIuNyA1LjgtNS44ek0xNTAuMiAxODZsMCAzNy03My41IDAgMC0zNyA3My41IDB6bTAgNzQuNGwwIDM3LjMtNzMuNSAwIDAtMzcuMyA3My41IDB6bTExLjEtMTQ3LjNsNTQtNDMuNy0xMTguNSAwIDY0LjUgNDMuN3ptMjEwIDcyLjlsMCAzNy0xOTYgMCAwLTM3IDE5NiAwem0wIDc0LjRsMCAzNy4zLTE5NiAwIDAtMzcuMyAxOTYgMHpNMjg2LjcgMTEzLjFsNjQuNS00My43LTExOC40IDAgNTMuOSA0My43ek0zNzEuMyAzMzVsMCAzNy4zLTk5LjQgMCAwLTM3LjMgOTkuNCAweiJdCiAgICB9OwogICAgZmFTcGVha2VyRGVjayA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcGVha2VyLWRlY2siLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjgzYyIsICJNMjEzLjkgMjk2TDEwMCAyOTZjLTI2LjUgMC01Mi0xMC41LTcwLjctMjkuM1MwIDIyMi41IDAgMTk2IDEwLjUgMTQ0IDI5LjMgMTI1LjMgNzMuNSA5NiAxMDAgOTZsMTMyLjggMGMxMC42IDAgMjAuOCA0LjIgMjguMyAxMS43czExLjcgMTcuNyAxMS43IDI4LjMtNC4yIDIwLjgtMTEuNyAyOC4zLTE3LjcgMTEuNy0yOC4zIDExLjdMOTggMTc2Yy0yNi41IDAtMjYuNCA0MCAwIDQwbDExMy44IDBjMjYuNSAwIDUyIDEwLjUgNzAuNyAyOS4zczI5LjMgNDQuMiAyOS4zIDcwLjctMTAuNSA1Mi0yOS4zIDcwLjctNDQuMiAyOS4zLTcwLjcgMjkuM0w0MCA0MTZjLTEwLjYgMC0yMC44LTQuMi0yOC4zLTExLjdTMCAzODYuNiAwIDM3NiA0LjIgMzU1LjIgMTEuNyAzNDcuNyAyOS40IDMzNiA0MCAzMzZsMTczLjkgMGMyNi41IDAgMjYuNS00MCAwLTQwek0yOTggNDE2YzEzLjUtOS4yIDI1LTIxIDMzLjgtMzQuN3MxNC43LTI5LjIgMTcuMy00NS4zbDY0LjYgMGMyLjYgMCA1LjItLjYgNy42LTEuNnM0LjYtMi41IDYuNC00LjQgMy4zLTQuMSA0LjItNi41IDEuNS01IDEuNC03LjZsMC0xMjBjMC0yLjYtLjUtNS4yLTEuNC03LjZzLTIuNC00LjYtNC4yLTYuNS00LTMuMy02LjQtNC40LTUtMS42LTcuNi0xLjZsLTExNy4yIDBjOS43LTExLjEgMTUtMjUuMyAxNS00MHMtNS4zLTI4LjktMTUtNDBsMTM2LjkgMGM0My40IDAgNzguNiAzNS44IDc4LjYgODBsMCAxNjBjMCA0NC4yLTM1LjIgODAtNzguNiA4MEwyOTggNDE2eiJdCiAgICB9OwogICAgZmFGbGlja3IgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZmxpY2tyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYxNmUiLCAiTTQwMCAzMkw0OCAzMkMyMS41IDMyIDAgNTMuNSAwIDgwTDAgNDMyYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDM1MiAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMzUyYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4ek0xNDQuNSAxOTJhNjMuNSA2My41IDAgMSAxIDAgMTI3IDYzLjUgNjMuNSAwIDEgMSAwLTEyN3ptMTU5IDBhNjMuNSA2My41IDAgMSAxIDAgMTI3IDYzLjUgNjMuNSAwIDEgMSAwLTEyN3oiXQogICAgfTsKICAgIGZhQ2NWaXNhID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNjLXZpc2EiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjFmMCIsICJNNDcwLjEgMjMxLjNzNy42IDM3LjIgOS4zIDQ1bC0zMy40IDBjMy4zLTguOSAxNi00My41IDE2LTQzLjUtLjIgLjMgMy4zLTkuMSA1LjMtMTQuOWwyLjggMTMuNHpNNTc2IDgwbDAgMzUyYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDQ4IDQ4MGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCA4MEMwIDUzLjUgMjEuNSAzMiA0OCAzMmw0ODAgMGMyNi41IDAgNDggMjEuNSA0OCA0OHpNMTUyLjUgMzMxLjJsNjMuMi0xNTUuMi00Mi41IDAtMzkuMyAxMDYtNC4zLTIxLjUtMTQtNzEuNGMtMi4zLTkuOS05LjQtMTIuNy0xOC4yLTEzLjFsLTY0LjcgMC0uNyAzLjFjMTUuOCA0IDI5LjkgOS44IDQyLjIgMTcuMWwzNS44IDEzNSA0Mi41IDB6bTk0LjQgLjJsMjUuMi0xNTUuNC00MC4yIDAtMjUuMSAxNTUuNCA0MC4xIDB6bTEzOS45LTUwLjhjLjItMTcuNy0xMC42LTMxLjItMzMuNy00Mi4zLTE0LjEtNy4xLTIyLjctMTEuOS0yMi43LTE5LjIgLjItNi42IDcuMy0xMy40IDIzLjEtMTMuNCAxMy4xLS4zIDIyLjcgMi44IDI5LjkgNS45bDMuNiAxLjcgNS41LTMzLjZjLTcuOS0zLjEtMjAuNS02LjYtMzYtNi42LTM5LjcgMC02Ny42IDIxLjItNjcuOCA1MS40LS4zIDIyLjMgMjAgMzQuNyAzNS4yIDQyLjIgMTUuNSA3LjYgMjAuOCAxMi42IDIwLjggMTkuMy0uMiAxMC40LTEyLjYgMTUuMi0yNC4xIDE1LjItMTYgMC0yNC42LTIuNS0zNy43LTguM2wtNS4zLTIuNS01LjYgMzQuOWM5LjQgNC4zIDI2LjggOC4xIDQ0LjggOC4zIDQyLjIgLjEgNjkuNy0yMC44IDcwLTUzek01MjggMzMxLjRsLTMyLjQtMTU1LjQtMzEuMSAwYy05LjYgMC0xNi45IDIuOC0yMSAxMi45bC01OS43IDE0Mi41IDQyLjIgMHM2LjktMTkuMiA4LjQtMjMuM2w1MS42IDBjMS4yIDUuNSA0LjggMjMuMyA0LjggMjMuM2wzNy4yIDB6Il0KICAgIH07CiAgICBmYVVwd29yayA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ1cHdvcmsiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTY0MSIsICJNNDkzLjkgMjk1LjZjLTUwLjMgMC04My41LTM4LjktOTIuOC01My45IDExLjktOTUuMyA0Ni44LTEyNS40IDkyLjgtMTI1LjQgNDUuNSAwIDgwLjkgMzYuNCA4MC45IDg5LjdzLTM1LjQgODkuNy04MC45IDg5LjdsMC0uMXptMC0yMzcuOGMtODEuOSAwLTEyNy44IDUzLjQtMTQxIDEwOC40LTE0LjktMjgtMjUuOS02NS41LTM0LjUtMTAwLjNsLTExMy4yIDAgMCAxNDFjMCA1MS4xLTIzLjMgODktNjguOCA4OXMtNzEuNi0zNy44LTcxLjYtODlsLjUtMTQxLTY1LjMgMCAwIDE0MWMwIDQxLjEgMTMuMyA3OC40IDM3LjYgMTA1LjEgMjUgMjcuNSA1OS4yIDQxLjggOTguOCA0MS44IDc4LjggMCAxMzMuOC02MC40IDEzMy44LTE0Ni45bDAtOTQuOGM4LjIgMzEuMiAyNy44IDkxLjEgNjUuMyAxNDMuNmwtMzUgMTk5LjQgNjYuNCAwIDIzLjEtMTQxLjNjNy42IDYuMyAxNS43IDEyIDI0LjIgMTcgMjIuMiAxNCA0Ny43IDIxLjkgNzMuOSAyMi44IDAgMCA0IC4yIDYuMSAuMiA4MS4yIDAgMTQ1LjktNjIuOSAxNDUuOS0xNDcuOFM1NzUuMyA1Ny45IDQ5NC4xIDU3LjlsLS4yLS4xeiJdCiAgICB9OwogICAgZmFLYWthb1RhbGsgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAia2FrYW8tdGFsayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlN2Q3IiwgIk0yODggMi41YzE1OS4xIDAgMjg4IDEwMS43IDI4OCAyMjcuMSAwIDEyNS40LTEyOC45IDIyNy4xLTI4OCAyMjcuMS0xNy41IDAtMzQuNi0xLjItNTEuMi0zLjYtMTYuNiAxMS43LTExMi42IDc5LjEtMTIxLjcgODAuNCAwIDAtMy43IDEuNC02LjktLjRzLTIuNi02LjctMi42LTYuN0MxMDYuNiA1MTkuOCAxMzAuNiA0MzcuMiAxMzUgNDIxLjkgNTMuOSAzODEuOCAwIDMxMC42IDAgMjI5LjUgMCAxMDQuMSAxMjguOSAyLjUgMjg4IDIuNXpNODYuMiAxNjEuN2MtOSAwLTE2LjMgNy4zLTE2LjMgMTYuM3M3LjMgMTYuMyAxNi4zIDE2LjNsMjUuOSAwIDAgOTguN2MwIDguOCA3LjUgMTUuOSAxNi42IDE1LjlzMTYuNi03LjEgMTYuNi0xNS45bDAtOTguNyAyNS45IDBjOSAwIDE2LjMtNy4zIDE2LjMtMTYuM3MtNy4zLTE2LjMtMTYuMy0xNi4zbC04NS4xIDB6bTE0MC44IDBjLTEwLjggLjItMTkuMyA4LjQtMjIuMSAxNi40TDE2NS4yIDI4Mi43Yy01IDE1LjctLjYgMjEuNSAzLjkgMjMuNiAzLjIgMS41IDYuOSAyLjMgMTAuNiAyLjMgNi45IDAgMTIuMi0yLjggMTMuOC03LjNsOC4yLTIxLjYgNTAuNyAwIDguMiAyMS41YzEuNiA0LjUgNi45IDcuMyAxMy44IDcuMyAzLjcgMCA3LjMtLjggMTAuNi0yLjMgNC42LTIuMSA5LTcuOSAzLjktMjMuNkwyNDkuMiAxNzguMWMtMi44LTgtMTEuMy0xNi4yLTIyLjItMTYuNHptMTgwLjkgMGMtOS4yIDAtMTYuNiA3LjUtMTYuNiAxNi42bDAgMTEzLjdjMCA5LjIgNy41IDE2LjYgMTYuNiAxNi42czE2LjYtNy41IDE2LjYtMTYuNmwwLTM2LjIgNS44LTUuOCAzOC45IDUxLjZjMy4yIDQuMiA4IDYuNiAxMy4zIDYuNiAzLjYgMCA3LjEtMS4xIDEwLTMuMyAzLjUtMi43IDUuOC02LjYgNi40LTExcy0uNS04LjgtMy4yLTEyLjNsLTQwLjktNTQuMiAzNy45LTM3LjhjMi42LTIuNiAzLjktNi4yIDMuNy0xMC4xLS4yLTMuOS0yLTcuNi00LjktMTAuNS0zLjEtMy4xLTcuMy00LjktMTEuNC00LjktMy42IDAtNi44IDEuMy05LjIgMy43bC00Ni4zIDQ2LjQgMC0zNS43YzAtOS4yLTcuNS0xNi42LTE2LjYtMTYuNnptLTkxLjMgMGMtOS4zIDAtMTYuOSA3LjUtMTYuOSAxNi42bDAgMTEyLjhjMCA4LjQgNy4xIDE1LjIgMTUuOSAxNS4zbDUzLjMgMGM4LjggMCAxNS45LTYuOSAxNS45LTE1LjNzLTcuMi0xNS4yLTE1LjktMTUuMmwtMzUuMyAwIDAtOTcuNmMwLTkuMi03LjYtMTYuNi0xNy0xNi42em0tNzMgODguNmwtMzMuMiAwIDE2LjYtNDcuMSAxNi42IDQ3LjF6Il0KICAgIH07CiAgICBmYUZsdXR0ZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZmx1dHRlciIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNjk0IiwgIk00MjkuNSAyMzYuM0wyOTEuNyAzNzQuMSA0MjkuNSA1MTIgMjcyIDUxMmMtMzYuMS0zNi4xLTgyLjEtODIuMS0xMzcuOS0xMzcuOWwxMzcuOS0xMzcuOCAxNTcuNSAwek0yNzIgMEwxNiAyNTYgOTQuOCAzMzQuOCA0MjkuNSAwIDI3MiAweiJdCiAgICB9OwogICAgZmFCdWZmZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYnVmZmVyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY4MzciLCAiTTQyOC4yIDM4MC43TDIzMS43IDQ3OC41Yy0yLjMgMS00LjggMS41LTcuMyAxLjVzLTUtLjUtNy4zLTEuNUwyMC41IDM4MC43Yy00LTItNC01LjMgMC03LjNMNjcuNiAzNTBjMi4zLTEgNC44LTEuNSA3LjMtMS41czUgLjUgNy4zIDEuNWwxMzQuOCA2N2MyLjMgMSA0LjggMS41IDcuMyAxLjVzNS0uNSA3LjMtMS41bDEzNC44LTY3YzIuMy0xIDQuOC0xLjUgNy4zLTEuNXM1IC41IDcuMyAxLjVsNDcuMSAyMy40YzQgMiA0IDUuMiAwIDcuMnptMC0xMzYuNWwtNDcuMS0yMy40Yy0yLjMtMS00LjgtMS41LTcuMy0xLjVzLTUgLjUtNy4zIDEuNUwyMzEuNyAyODcuOGMtMi4zIDEtNC44IDEuNS03LjMgMS41cy01LS41LTcuMy0xLjVMODIuMyAyMjAuN2MtMi4zLTEtNC44LTEuNS03LjMtMS41cy01IC41LTcuMyAxLjVMMjAuNSAyNDQuMWMtNCAyLTQgNS4zIDAgNy4zbDE5Ni41IDk3LjhjMi4zIDEgNC44IDEuNSA3LjMgMS41czUtLjUgNy4zLTEuNWwxOTYuNS05Ny44YzQtMiA0LTUuMyAwLTcuM3pNMjAuNSAxMzAuNEwyMTcgMjIwLjdjNC43IDEuOSAxMCAxLjkgMTQuNyAwbDE5Ni41LTkwLjNjNC0xLjkgNC00LjkgMC02LjdMMjMxLjcgMzMuNGMtNC43LTEuOS0xMC0xLjktMTQuNyAwTDIwLjUgMTIzLjdjLTQgMS44LTQgNC45IDAgNi43eiJdCiAgICB9OwogICAgZmFHcmF0aXBheSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJncmF0aXBheSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMTg0IiwgIk0yNTYgMGEyNTYgMjU2IDAgMSAwIDAgNTEyIDI1NiAyNTYgMCAxIDAgMC01MTJ6TTM3NC4zIDIzMy43TDI1Ny43IDM5MS4zIDE0MS4zIDIzMy43Yy05LTEyLjMtMTkuNy01MiAxNC03NC4zIDI5LTE4LjcgNTYuNC00LjMgNzAuNyAxMi4zIDE2LjQgMTguNSA0OC4xIDE3LjQgNjMuNyAwIDE0LjMtMTYuNiA0MS43LTMxIDcwLjMtMTIuMyAzNCAyMi4zIDIzLjMgNjEuOSAxNC4yIDc0LjN6Il0KICAgIH07CiAgICBmYUdvb2dsZVBheSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnb29nbGUtcGF5IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImUwNzkiLCAiTTEwNS43IDIxNWwwIDQxLjIgNTcuMSAwYy0xLjIgNi42LTMuNiAxMi45LTcuMiAxOC41cy04LjQgMTAuNC0xMy45IDE0LjFjLTkuNSA2LjYtMjEuNyAxMC4zLTM2IDEwLjMtMjcuNiAwLTUwLjktMTguOS01OS4zLTQ0LjItNC40LTEzLjMtNC40LTI3LjcgMC00MSA4LjQtMjUuNSAzMS43LTQ0LjQgNTkuMy00NC40IDcuNS0uMSAxNC45IDEuMiAyMS45IDRzMTMuMyA2LjkgMTguNiAxMi4xTDE3Ni41IDE1NWMtMTkuMS0xOC4xLTQ0LjQtMjguMS03MC43LTI3LjgtMTkuNyAuMS0zOC45IDUuNy01NS42IDE2LjFzLTMwLjEgMjUuMy0zOC44IDQzQzMuOSAyMDEuMiAwIDIxNy43IDAgMjM0LjRzMy45IDMzLjIgMTEuMyA0OC4xbDAgLjJjOC43IDE3LjcgMjIuMSAzMi41IDM4LjggNDNzMzUuOSAxNiA1NS42IDE2YzI4LjUgMCA1Mi41LTkuNSA3MC0yNS45IDIwLTE4LjYgMzEuNC00Ni4yIDMxLjQtNzguOSAwLTcuMy0uNi0xNC42LTEuOC0yMS44bC05OS43IDB6bTM4OS40LTRjLTEwLjEtOS40LTIzLjktMTQuMS00MS40LTE0LjEtMjIuNSAwLTM5LjMgOC4zLTUwLjUgMjQuOUw0MjQuMSAyMzVjNy42LTExLjMgMTguMS0xNyAzMS4zLTE3IDguNCAwIDE2LjUgMy4yIDIyLjcgOC44IDMgMi42IDUuNSA1LjkgNy4xIDkuNnMyLjUgNy42IDIuNSAxMS43bDAgNS41Yy05LjEtNS4xLTIwLjYtNy44LTM0LjYtNy44LTE2LjQgMC0yOS42IDMuOS0zOS41IDExLjhzLTE0LjggMTguMy0xNC44IDMxLjZjLS4yIDUuOSAxIDExLjggMy40IDE3LjJzNiAxMC4yIDEwLjUgMTQuMWM5LjIgOC4zIDIxIDEyLjUgMzQuOCAxMi41IDE2LjMgMCAyOS4yLTcuMyAzOS0yMS45bDEgMCAwIDE3LjcgMjIuNiAwIDAtNzguN2MuMS0xNi42LTQuOS0yOS43LTE1LTM5em0tMTkuMiA4OS4zYy0zLjUgMy41LTcuNiA2LjMtMTIuMiA4LjJzLTkuNSAyLjktMTQuNCAyLjljLTYuNyAuMS0xMy4xLTIuMS0xOC4zLTYuMi0yLjQtMS44LTQuNC00LjItNS43LTYuOXMtMi01LjctMi04LjdjMC03IDMuMi0xMi44IDkuNS0xNy40czE0LjUtNyAyNC4xLTdjMTMuMi0uMiAyMy41IDIuOCAzMC44IDguOCAwIDEwLjEtNCAxOC45LTExLjcgMjYuNHptLTkzLjctMTQyYy01LjMtNS4zLTExLjYtOS41LTE4LjYtMTIuM3MtMTQuNC00LjItMjEuOS00bC02Mi43IDAgMCAxODYuNyAyMy42IDAgMC03NS42IDM5IDBjMTYgMCAyOS41LTUuNCA0MC41LTE1LjkgLjktLjkgMS44LTEuOCAyLjYtMi43IDkuNi0xMC41IDE0LjgtMjQuNCAxNC4zLTM4LjZzLTYuNi0yNy43LTE2LjktMzcuNmwwIDB6bS0xNi42IDYyLjJjLTMgMy4yLTYuNiA1LjctMTAuNiA3LjRzLTguNCAyLjUtMTIuNyAyLjNsLTM5LjYgMCAwLTY1LjIgMzkuNiAwYzguNSAwIDE2LjYgMy4zIDIyLjYgOS4yIDYuMSA2LjEgOS42IDE0LjMgOS44IDIzcy0zLjEgMTctOSAyMy4zbDAgMHpNNjE0LjMgMjAxbC0zNi41IDkxLjctLjUgMC0zNy40LTkxLjctMjUuNyAwIDUxLjggMTE5LjYtMjkuNCA2NC4zIDI0LjMgMCA3OS0xODMuOS0yNS43IDB6Il0KICAgIH07CiAgICBmYUFwcGxlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImFwcGxlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYxNzkiLCAiTTMxOS4xIDI2OC43Yy0uMi0zNi43IDE2LjQtNjQuNCA1MC04NC44LTE4LjgtMjYuOS00Ny4yLTQxLjctODQuNy00NC42LTM1LjUtMi44LTc0LjMgMjAuNy04OC41IDIwLjctMTUgMC00OS40LTE5LjctNzYuNC0xOS43LTU1LjggLjktMTE1LjEgNDQuNS0xMTUuMSAxMzMuMiAwIDI2LjIgNC44IDUzLjMgMTQuNCA4MS4yIDEyLjggMzYuNyA1OSAxMjYuNyAxMDcuMiAxMjUuMiAyNS4yLS42IDQzLTE3LjkgNzUuOC0xNy45IDMxLjggMCA0OC4zIDE3LjkgNzYuNCAxNy45IDQ4LjYtLjcgOTAuNC04Mi41IDEwMi42LTExOS4zLTY1LjItMzAuNy02MS43LTkwLTYxLjctOTEuOXpNMjYyLjUgMTA0LjVjMjcuMy0zMi40IDI0LjgtNjEuOSAyNC03Mi41LTI0LjEgMS40LTUyIDE2LjQtNjcuOSAzNC45LTE3LjUgMTkuOC0yNy44IDQ0LjMtMjUuNiA3MS45IDI2LjEgMiA0OS45LTExLjQgNjkuNS0zNC4zeiJdCiAgICB9OwogICAgZmFUdW1ibHIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidHVtYmxyIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbXSwgImYxNzMiLCAiTTMwOS45IDQ4MC4zYy0xMy42IDE0LjUtNTAgMzEuNy05Ny40IDMxLjctMTIwLjggMC0xNDctODguOC0xNDctMTQwLjZsMC0xNDQtNDcuNSAwYy01LjUgMC0xMC00LjUtMTAtMTBsMC02OGMwLTcuMiA0LjUtMTMuNiAxMS4zLTE2IDYyLTIxLjggODEuNS03NiA4NC4zLTExNy4xIC44LTExIDYuNS0xNi4zIDE2LjEtMTYuM2w3MC45IDBjNS41IDAgMTAgNC41IDEwIDEwbDAgMTE1LjIgODMgMGM1LjUgMCAxMCA0LjQgMTAgOS45bDAgODEuN2MwIDUuNS00LjUgMTAtMTAgMTBsLTgzLjQgMCAwIDEzMy4yYzAgMzQuMiAyMy43IDUzLjYgNjggMzUuOCA0LjgtMS45IDktMy4yIDEyLjctMi4yIDMuNSAuOSA1LjggMy40IDcuNCA3LjlsMjIgNjQuM2MxLjggNSAzLjMgMTAuNi0uNCAxNC41eiJdCiAgICB9OwogICAgZmFQaG9lbml4U3F1YWRyb24gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicGhvZW5peC1zcXVhZHJvbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNTExIiwgIk05NiA2My40YzQ2LjUtMzYuMSAxMDUuNi01Ni4xIDE2NC41LTU0LjYgMjkuNi0uNCA1OS4xIDUuNCA4Ni45IDE1LjMtMjQuMS00LjYtNDktNi4zLTczLjQtMi41LTQyLjkgNS4zLTgzIDI3LjItMTExLjggNTkuMiA1LjctMSAxMC44LTMuNyAxNi01LjkgMTguMS03LjkgMzcuNS0xMy4zIDU3LjItMTQuOCAxOS43LTIuMSAzOS42LS40IDU5LjMgMS45LTE0LjQgMi44LTI5LjEgNC42LTQzIDkuNi0zNC40IDExLjEtNjUuMyAzMy4yLTg2LjMgNjIuNi0xMy44IDE5LjctMjMuNiA0Mi45LTI0LjcgNjcuMS0uNCAxNi41IDUuMiAzNC44IDE5LjggNDQgMTEuMiA2LjggMjQuNiA5LjIgMzcuNSA2LjcgMTUuNC0yLjUgMzAuMS04LjYgNDMuNi0xNi4zIDExLjUtNi44IDIyLjctMTQuNiAzMi0yNC4zIDMuOC0zLjIgMi41LTguNCAyLjYtMTIuOC0yLjEtLjMtNC40LTEuMS02LjMgLjMtMTEuNCA2LjMtMjMuNCAxMS40LTM1LjggMTUuNC0yMCA2LjItNDIuMiA4LjUtNjIuMSAuOCAxMi44IDEuNyAyNi4xIC4zIDM3LjctNS40IDIwLjItOS43IDM2LjgtMjUuMiA1NC40LTM4LjggMjcuNy0yMS4zIDU3LjUtMzkuOSA4OC45LTU1LjMgMjUuNy0xMiA1Mi45LTIyLjggODEuNi0yNC4xLTE1LjYgMTMuNy0zMi4xIDI2LjUtNDYuOCA0MS40LTE0LjUgMTQtMjcuNSAyOS41LTQwLjEgNDUuMi0zLjUgNC42LTkgNi45LTEzLjYgMTAuMi0yMi40IDE1LTQwLjMgMzUuOC01MS45IDYwLjEtOS4zIDE5LjctMTQuNSA0MS45LTExLjggNjMuNiAxLjkgMTMuNyA4LjcgMjcuNiAyMC45IDM0LjkgMTIuOSA4IDI5IDguMSA0My41IDUuMSAzMi44LTcuNCA2MS40LTI4LjkgODEtNTUuOCAyMC40LTI3LjUgMzAuNS02Mi4yIDI5LjItOTYuMy0uNS03LjUtMS42LTE1LTEuNy0yMi41IDggMTkuNSAxNC44IDM5LjcgMTYuNiA2MC44IDIgMTQuMyAuNyAyOC44LTEuNiA0Mi45LTEuOSAxMS01LjcgMjEuNS03LjggMzIuNCAyMC40LTIyLjkgMzQtNTAuOSAzOS4zLTgxLjEgNS42LTM1LjUgLjctNzEuOS0xNC4yLTEwNC42IDIwLjggMzIgMzIuMyA2OS42IDM1LjcgMTA3LjUgLjUgMTIuNyAuNSAyNS41IDAgMzguMi0yLjggMzQuMy0xMi45IDY3LjYtMjkuNiA5Ny44LTI2LjEgNDcuMy02OCA4NS42LTExNy4yIDEwOC03OC4zIDM2LjItMTc0LjcgMzEuMy0yNDgtMTQuNy0zOS0yMy44LTcwLjYtNTgtOTEuNC05OC43LTE0LjctMjguOS0yMy4zLTYwLjUtMjUuNC05Mi45bDAtMzEuM0MzLjkgMTcyIDQwLjkgMTA1LjggOTYgNjMuNHptMjIyIDgwLjNjNS41LS45IDEwLjgtMi40IDE2LTQuNSA1LTEuOCA5LjItNS45IDEwLjMtMTEuMi05IDUtMTggOS45LTI2LjMgMTUuN3oiXQogICAgfTsKICAgIGZhQ2VudGVyY29kZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjZW50ZXJjb2RlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzODAiLCAiTTIwMS44IDI1NC44YTY0LjEgNjQuMSAwIDEgMSAxMjcuNCAxMy44IDY0LjEgNjQuMSAwIDEgMSAtMTI3LjQtMTMuOHptNDEuNiAyNDguOUM5Ni43IDQ5Ni04LjIgMzY1LjUgMTAuMSAyMjQuMyAyMS4zIDEzNy43IDc1LjkgNjcuNCAxNDkuMiAzMi4zIDMxMC4yLTQ0LjggNDk4LjkgNjkuNyA1MDMuOSAyNDguOSA1MDggMzk1LjkgMzg1LjUgNTExLjEgMjQzLjQgNTAzLjd6bTE3OS45LTE4MGMyNy45LTExOC0xNjAuNS0yMDUuOS0yMzcuMi0yMzQuMi01Ny41IDU2LjMtNjkuMSAxODguNi0zMy44IDM0NC40IDY4LjggMTUuOCAxNjkuMS0yNi40IDI3MS0xMTAuMnoiXQogICAgfTsKICAgIGZhRGViaWFuID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImRlYmlhbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNjBiIiwgIk0zODAuNCAyNDUuNmMzLTcuNiA1LjUtMTQgNS4yLTI0LjRsLTQuMyA5YzQuNC0xMy4yIDQtMjcuMSAzLjYtNDAuNC0uMi02LS4zLTExLjggMC0xNy40bC0xLjgtLjVjLTEuNS00NS4yLTQwLjYtOTMuMS03NS4zLTEwOS40LTMwLTEzLjgtNzYuMS0xNi4yLTk3LjMtNS44IDEuMy0xLjEgNC4yLTIgNi44LTIuN2wuMy0uMWMzLjMtMSA2LTEuNyA0LTIuOS0xOS4yIDEuOS0yNC45IDUuNS0zMS4xIDkuNGwtLjEgMGMtNC42IDIuOS05LjUgNi0yMC4zIDguNy0zLjUgMy40IDEuNyAyIDUuOCAuOXM3LjItMS45LS4xIDIuNGMtMy41IDEtNi42IDEuMy05LjYgMS42bC0uMSAwYy04LjMgLjgtMTUuOCAxLjYtMzAuNyAxNyAuOCAxLjMgMy40LS4yIDUuMy0xLjNsLjEtLjFjMi4zLTEuNCAzLjQtMi0xLjcgNC40LTE5LjEtMi40LTYwLjMgNDMuNy02OS4xIDU5bDQuNiAuOGMtMy4yIDgtNi44IDE0LjgtMTAgMjAuOC00LjMgOC4xLTcuOSAxNC45LTguNyAyMS4zLS4zIDUuMS0xIDExLTEuNyAxNy4zLS4xIDEtLjIgMi0uMyAzbC0uMSAuNmMtMyAyNy4zLTYuNyA2MC44IDMuOSA3M2wtMS4zIDEzYy42IDEuMiAxLjEgMi4zIDEuNiAzLjUgLjIgLjQgLjQgLjggLjUgMS4xIDEgMi4xIDIgNC4yIDMuMyA2LjJsLTMgLjJjNyAyMi4xIDEwLjggMjIuNSAxNS4xIDIyLjkgNC40IC40IDkuMyAuOSAxOC43IDI0LjItMi43LS45LTUuNS0xLjktOS40LTcuMi0uNSA0LjEgNS44IDE2LjMgMTMuMSAyNS44bC0zLjEgMy42YzIuMSAzLjcgNC44IDYuMiA3LjYgOC44IDEgLjkgMi4xIDEuOSAzLjEgMi45LTExLjktNi41IDMuMiAxMy43IDExLjkgMjUuMiAuOCAxLjEgMS41IDIgMi4yIDIuOSAxLjQgMS45IDIuNSAzLjQgMi45IDQuMWwyLjQtNC4yYy0uMyA2LjEgNC4zIDEzLjkgMTMuMSAyNC43bDcuMy0uM2MzIDYgMTQgMTYuNyAyMC43IDE3LjJsLTQuNCA1LjhjOC4xIDIuNiAxMC4zIDQuMyAxMi43IDYuMiAyLjYgMi4xIDUuNCA0LjMgMTYuMSA4LjFsLTQuMi03LjRjMy41IDMgNi4yIDUuOSA4LjggOC43bC4xIC4xYzUuMiA1LjYgOS45IDEwLjYgMTkuNyAxNS4zIDEwLjcgMy43IDE2LjYgNC43IDIyLjcgNS44IC4zIDAgLjYgLjEgLjkgLjEgNS40IC44IDExLjIgMS44IDIwLjggNC41LTEuMS0uMS0yLjItLjEtMy4zLS4xLTIuMy0uMS00LjctLjEtNy0uMS0xNC40LS4yLTI5LjItLjQtNDIuNy01LjItOTYuNi0yNS43LTE4NC45LTEzOS0xNzguNC0yNTUuNi0uNi05LjktLjMtMjAuOSAwLTMwLjcgLjQtMTMuNSAuNy0yNC44LTEuNi0yOC4zbDEtMy4xYzUuMy0xNy40IDExLjctMzguMiAyMy44LTYyLjhsLS4xLS4yIDAtLjFjLjQgLjQgMy40IDMuNCA4LjgtNS44IC44LTEuOCAxLjYtMy43IDIuNC01LjYgLjUtMS4xIC45LTIuMiAxLjQtMy4yIDIuNS02LjEgNS4xLTEyLjMgOC40LTE3LjlsMi42LS42YzEuNy0xMC4xIDE3LTIzLjggMjkuOC0zNS4ybDEuMS0xYzUuNy01LjEgMTAuNy05LjcgMTMuNi0xMy4xbC43IDQuNGMxNy0xNS45IDQ0LjYtMjcuNSA2NS42LTM2LjRsLjUtLjJjNC44LTIgOS4zLTMuOSAxMy4zLTUuNy0zLjQgMy44IDIuMiAyLjcgMTAgMSA0LjgtMSAxMC40LTIuMSAxNS4zLTIuNGwtMy45IDIuMWMtMi43IDEuNC01LjQgMi44LTggNC42IDguMS0yIDExLjctMS40IDE1LjctLjhsLjMgMGMzLjUgLjYgNy4zIDEuMiAxNC42IC4yLTUuNiAuOC0xMi4zIDMtMTEuMiAzLjggNy45IC45IDEyLjgtLjEgMTcuMi0xbC4yIDBjNS41LTEuMSAxMC4zLTIgMTkuMyAuOWwtMS00LjhjNy4zIDIuNiAxMi43IDQuMyAxNy41IDUuOGwuNSAuMWMxMCAzIDE3LjYgNS4zIDM0LjIgMTQuMSAzLjIgLjIgNS4zLS41IDcuNC0xLjJsLjEgMGMzLjYtMS4xIDctMi4xIDE1LjIgMS4yIC4zIC41IC41IDEgLjcgMS40IC4xIC4yIC4yIC41IC4zIC43bDAgLjFjMSAyLjYgMS44IDQuNiAxNC42IDEyLjEgMS43LS43LTIuNy00LjctNi40LTguMmwtLjEtLjFjLS4yLS4xLS4zLS4zLS41LS40IDMyLjIgMTcuMyA2Ny4zIDU0LjEgNzggOTMuNS02LTExLjEtNS4yLTUuNS00LjMgLjUgLjYgNCAxLjIgOC4xLS4yIDcuNSA0LjUgMTIuMSA4LjEgMjQuNSAxMC40IDM3LjRsLS44LTIuOS0uMS0uM2MtMy4zLTExLjktOS42LTM0LjMtMTkuOS00OS4zLS40IDQuMy0yLjggMy45LTUuMiAzLjVsLS4xIDBjLTMuMy0uNi02LjItMS4xLTEuOSAxMi42IDIuNiAzLjggMy4xIDIuNCAzLjUgMS4xIC41LTEuNSAuOS0yLjcgNC43IDUuMiAuMSA0LjEgMSA4LjIgMi4xIDEyLjdsLjEgLjZjLjEgLjMgLjEgLjUgLjIgLjhsLjEgLjZjLjYgMi42IDEuMyA1LjQgMS44IDguNC0xLjEtLjItMi4zLTIuMi0zLjQtNC4yLTEuNC0yLjQtMi44LTQuNy0zLjctMy4yIDIuNCAxMS41IDYuNSAxNy40IDggMTguMy0uMyAuNi0uNiAuNy0xLjEgLjctLjggMC0xLjggLjEtMS45IDUuMyAuNyAxMy43IDMuMyAxMi41IDUuMyAxMS42IC42LS4zIDEuMi0uNiAxLjctLjQtLjYgMi41LTEuNiA1LjEtMi43IDcuOS0yLjggNy4xLTYgMTUuNC0zLjQgMjYuMS0uOC0zLTItNi0zLjEtOC45bC0uMS0uNGMtLjItLjUtLjQtMS0uNi0xLjUtLjMtLjgtLjYtMS42LS45LTIuMy0uNiA0LjQtLjMgNy43LS4xIDEwLjZsMCAuN2MuNCA1LjMgLjcgMTAtMyAxOS45IDQuMy0xNC4yIDMuOC0yNi45LS4yLTIwLjggMSAxMC45LTMuNyAyMC40LTggMjguOWwtLjEgLjJjLTMuNiA3LjEtNi44IDEzLjUtNS45IDE5LjNsLTUuMi03LjFjLTcuNSAxMC45LTcgMTMuMy02LjUgMTUuNWwwIC4xYy41IDEuOSAxIDMuOC0zLjQgMTAuOCAxLjctMi45IDEuMy0zLjYgMS00LjItLjQtLjgtLjctMS41IDEuNy01LjEtMS42IC4xLTUuNSAzLjktMTAuMSA4LjUtMy45IDMuOS04LjUgOC40LTEyLjggMTEuOC0zNy41IDMwLjEtODIuMyAzNC0xMjUuNiAxNy44IC4yLTEtLjItMi4xLTMuMS00LjEtMzYuOC0yOC4yLTU4LjUtNTIuMS01MC45LTEwNy41IDIuMS0xLjYgMy42LTUuOCA1LjMtMTAuOGwuMi0uNCAuMS0uMyAwLS4xYzIuOS04LjQgNi41LTE4LjggMTQuMy0yMy44IDcuOC0xNy4zIDMxLjMtMzMuMyA1Ni40LTMzLjcgMjUuNi0xLjQgNDcuMiAxMy43IDU4LjEgMjcuOS0xOS44LTE4LjQtNTIuMS0yNC03OS43LTEwLjQtMjguMiAxMi43LTQ1IDQzLjgtNDIuNSA3NC43IC4zLS40IC42LS42IC45LS44bC4yLS4yYy42LS41IDEuMS0uOSAxLjQtMy4zLS45IDYwLjIgNjQuOCAxMDQuMyAxMTIuMSA4MmwuNiAxLjNjMTIuNy0zLjUgMTUuOS02LjUgMjAuMy0xMC43bC4xLS4xYzIuMi0yLjEgNC43LTQuNSA4LjktNy4zLS4zIC43LTEuMyAxLjctMi40IDIuNy0yLjIgMi4xLTQuNiA0LjUtMS42IDQuNiA1LTEuMyAxOC41LTEzLjQgMjguNS0yMi4zIC42LS41IDEuMi0xIDEuNy0xLjUgMS41LTEuMyAyLjgtMi41IDQtMy42bC4zLS4zYzEuOS00LjIgMS42LTUuNiAxLjMtN2wwLS4xYy0uNC0xLjYtLjgtMy4zIDIuNC05LjZsNy4zLTMuN2MuOC0yLjEgMS41LTQuMSAyLjItNiAuMi0uNiAuNS0xLjIgLjctMS44bC0uNC0uMi0uMS0uMXpNMjQ4IDMzNC4xYy02LTMtMTMuNy04LjktMTQuOC0xMS40bC0uNCAuM2MtLjMgLjYtLjUgMS4zLS4yIDIuMi0xMi4yLTUuNy0yMy40LTE0LjMtMzIuNi0yNC45IDQuOSA3LjEgMTAuMSAxNC4xIDE3IDE5LjUtNi45LTIuMy0xNS4xLTExLjgtMjEuNi0xOS4zbC0uMS0uMWMtNC4zLTUtNy45LTkuMS05LjctOS41IDE5LjggMzUuNSA4MC41IDYyLjMgMTEyLjMgNDktMTQuNyAuNS0zMy40IC4zLTQ5LjktNS44em03OS4zLTExOS43bC0uMS0uMmMtLjUtMS41LTEuMS0zLjEtMS43LTMuNCAxLjQtNS44IDUuNC0xMC43IDQuNCA0LjYtMSAzLjgtMS44IDEuNS0yLjYtMXptLTQuMiAyMi4yYy0xLjMgNy45LTUgMTUuNS0xMC4xIDIyLjUgLjItMi0xLjItMi40LTIuNi0yLjgtMi45LS44LTUuOS0xLjYgNS42LTE2LjEtLjUgMS45LTIuMSA0LjYtMy43IDcuM2wtLjMgLjRjLTMuNiA1LjktNi43IDExIDQgNC4zbDEtMS44YzIuNi00LjUgNS04LjggNi0xMy44bC4xIDB6bS01NS42IDMzLjljNy4xIC42IDE0LjEgLjYgMjEtMS4xLTIuNSAyLjQtNS4yIDQuOC04LjMgNy4yLTExLjEtMS43LTIxLjItNi0xMi43LTYuMXptLTkyLjYgMTEuNmMzLjYgNy4xIDYuNCAxMS41IDkgMTUuN2wuMSAuMmMyLjMgMy43IDQuNCA3LjEgNi44IDExLjctNS4xLTQuMi04LjctOS41LTEyLjUtMTVsLS4zLS41Yy0xLjQtMi4xLTIuOC00LjItNC40LTYuMmwxLjItNS45IC4xIDB6bTcuNS05LjZjMS42IDMuMyAzLjIgNi40IDUuNyA5LjFsMi42IDcuNy0xLjMtMi4xYy0zLjItNS4zLTYuMy0xMC42LTgtMTYuN2wxIDJ6bTIzOC45LTQxLjZjLTIuMyAxNy40LTcuNyAzNC42LTE2IDUwLjMgNy42LTE0LjkgMTIuNS0zMC45IDE0LjgtNDcuMmwxLjItMy4xek0zNS44IDExMC42Yy40IC44IDEuNCAuNSAyLjMgLjMgMS45LS41IDMuNi0uOS0uMSA3LjYtLjUgLjMtMSAuNy0xLjUgMS0xLjQgLjktMi44IDEuOS0zLjkgMyAxLjktMy44IDMuNS03LjQgMy4yLTExLjl6TTI1LjUgMTUyLjNjLS43IDMuNy0xLjUgNy45LTMuNCAxMy45IC4yLTEuOSAwLTMuNS0uMi00LjlsMC0uMWMtLjQtMy40LS43LTYuMyA0LjMtMTIuOC0uMyAxLjItLjUgMi41LS43IDMuOGwwIC4xeiJdCiAgICB9OwogICAgZmFNYXN0b2RvbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJtYXN0b2RvbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNGY2IiwgIk00MzMgMTc5LjFjMC05Ny4yLTYzLjctMTI1LjctNjMuNy0xMjUuNy02Mi41LTI4LjctMjI4LjYtMjguNC0yOTAuNSAwIDAgMC02My43IDI4LjUtNjMuNyAxMjUuNyAwIDExNS43LTYuNiAyNTkuNCAxMDUuNiAyODkuMSA0MC41IDEwLjcgNzUuMyAxMyAxMDMuMyAxMS40IDUwLjgtMi44IDc5LjMtMTguMSA3OS4zLTE4LjFsLTEuNy0zNi45cy0zNi4zIDExLjQtNzcuMSAxMC4xYy00MC40LTEuNC04My00LjQtODkuNi01NC0uNi00LjYtLjktOS4zLS45LTEzLjkgODUuNiAyMC45IDE1OC43IDkuMSAxNzguNyA2LjcgNTYuMS02LjcgMTA1LTQxLjMgMTExLjItNzIuOSA5LjgtNDkuOCA5LTEyMS41IDktMTIxLjV6TTM1Ny45IDMwNC4zbC00Ni42IDAgMC0xMTQuMmMwLTQ5LjctNjQtNTEuNi02NCA2LjlsMCA2Mi41LTQ2LjMgMCAwLTYyLjVjMC01OC41LTY0LTU2LjYtNjQtNi45bDAgMTE0LjItNDYuNyAwYzAtMTIyLjEtNS4yLTE0Ny45IDE4LjQtMTc1IDI1LjktMjguOSA3OS44LTMwLjggMTAzLjggNi4xbDExLjYgMTkuNSAxMS42LTE5LjVjMjQuMS0zNy4xIDc4LjEtMzQuOCAxMDMuOC02LjEgMjMuNyAyNy4zIDE4LjQgNTMgMTguNCAxNzVsMCAweiJdCiAgICB9OwogICAgZmFTa2V0Y2ggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2tldGNoIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY3YzYiLCAiTTI3LjggMTYyLjJsLTE4LjUgMjQuOSA5MC41IDAgNi45LTEzMC43LTc4LjkgMTA1Ljh6TTM5Ni42IDQ1LjdMMjY4IDMyIDQwMy43IDE3OS4yIDM5Ni42IDQ1Ljd6TTExMi41IDIxOC4zbC0xMS4yLTIyLTkxLjEgMCAyMjQuOSAyNjEuNy0xMjIuNi0yMzkuN3ptMi0zMS4ybDI4NCAwQzM0MC42IDEyNC4zIDI5My4zIDcyLjkgMjU2LjYgMzNMMTE0LjUgMTg3LjF6bTI5Ny4zIDkuMWwtMTMzLjkgMjYxLjggMjI0LjgtMjYxLjctOTAuOSAwIDAtLjF6TTQxNS43IDY5bC05LjQtMTIuNiAuOSAxNy4zIDYuMSAxMTMuNCA5MC4zIDAtODcuOS0xMTguMXpNMTEzLjggOTMuNUwxMDkuMiAxNzkuMSAyNDUgMzIgMTE2LjQgNDUuNyAxMTMuOCA5My41ek00MDEuNSAxOTYuMmwtMjkwIDBjMTguMiAzNS42IDY2LjYgMTMwLjIgMTQ1LjEgMjgzLjhMNDAxLjUgMTk2LjJ6Il0KICAgIH07CiAgICBmYVdlYkF3ZXNvbWUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAid2ViLWF3ZXNvbWUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTY4MiIsICJNMzcyLjIgNTJjMCAyMC45LTEyLjQgMzktMzAuMiA0Ny4yTDQ0OCAxOTIgNTUyLjQgMTcxLjFjLTUuMy03LjctOC40LTE3LjEtOC40LTI3LjEgMC0yNi41IDIxLjUtNDggNDgtNDhzNDggMjEuNSA0OCA0OGMwIDI2LTIwLjYgNDcuMS00Ni40IDQ4TDQ4MSA0NDIuM2MtMTAuMyAyMy0zMy4yIDM3LjctNTguNCAzNy43bC0yMDUuMiAwYy0yNS4yIDAtNDgtMTQuOC01OC40LTM3LjdMNDYuNCAxOTJDMjAuNiAxOTEuMSAwIDE3MCAwIDE0NCAwIDExNy41IDIxLjUgOTYgNDggOTZzNDggMjEuNSA0OCA0OGMwIDEwLjEtMy4xIDE5LjQtOC40IDI3LjFMMTkyIDE5MiAyOTguMSA5OS4xYy0xNy43LTguMy0zMC0yNi4zLTMwLTQ3LjEgMC0yOC43IDIzLjMtNTIgNTItNTJzNTIgMjMuMyA1MiA1MmwuMSAweiJdCiAgICB9OwogICAgZmFTYXNzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNhc3MiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjQxZSIsICJNMzAxLjggMzc4LjlsMCAwem0yNDkuMS04N2MtMjAuMSAwLTQwIDQuNi01OCAxMy41LTUuOS0xMS45LTEyLTIyLjMtMTMtMzAuMS0xLjItOS4xLTIuNS0xNC41LTEuMS0yNS4zczcuNy0yNi4xIDcuNi0yNy4yLTEuNC02LjYtMTQuMy02LjctMjQgMi41LTI1LjMgNS45Yy0yLjMgNi4yLTQuMSAxMi42LTUuMyAxOS4xLTIuMyAxMS43LTI1LjggNTMuNS0zOS4xIDc1LjMtNC40LTguNS04LjEtMTYtOC45LTIyLTEuMi05LjEtMi41LTE0LjUtMS4xLTI1LjNzNy43LTI2LjEgNy42LTI3LjItMS40LTYuNi0xNC4zLTYuNy0yNCAyLjUtMjUuMyA1LjktMi43IDExLjQtNS4zIDE5LjEtMzMuOSA3Ny4zLTQyLjEgOTUuNGMtNC4yIDkuMi03LjggMTYuNi0xMC40IDIxLjYtLjQgLjgtLjcgMS4zLS45IDEuNyAuMy0uNSAuNS0xIC41LS44LTIuMiA0LjMtMy41IDYuNy0zLjUgNi43bDAgLjFjLTEuNyAzLjItMy42IDYuMS00LjUgNi4xLS42IDAtMS45LTguNCAuMy0xOS45IDQuNy0yNC4yIDE1LjgtNjEuOCAxNS43LTYzLjEtLjEtLjcgMi4xLTcuMi03LjMtMTAuNy05LjEtMy4zLTEyLjQgMi4yLTEzLjIgMi4ycy0xLjQgMi0xLjQgMiAxMC4xLTQyLjQtMTkuNC00Mi40Yy0xOC40IDAtNDQgMjAuMi01Ni42IDM4LjUtNy45IDQuMy0yNSAxMy42LTQzIDIzLjUtNi45IDMuOC0xNCA3LjctMjAuNyAxMS40LS41LS41LS45LTEtMS40LTEuNS0zNS44LTM4LjItMTAxLjktNjUuMi05OS4xLTExNi41IDEtMTguNyA3LjUtNjcuOCAxMjcuMS0xMjcuNCA5OC00OC44IDE3Ni4zLTM1LjQgMTg5LjgtNS42IDE5LjQgNDIuNS00MS45IDEyMS42LTE0My43IDEzMy0zOC44IDQuMy01OS4yLTEwLjctNjQuMy0xNi4zLTUuMy01LjktNi4xLTYuMi04LjEtNS4xLTMuMyAxLjgtMS4yIDcgMCAxMC4xIDMgNy45IDE1LjUgMjEuOSAzNi44IDI4LjkgMTguNyA2LjEgNjQuMiA5LjUgMTE5LjItMTEuOCA2MS44LTIzLjggMTA5LjktOTAuMSA5NS44LTE0NS42LTE0LjQtNTYuNC0xMDcuOS03NC45LTE5Ni4zLTQzLjUtNTIuNyAxOC43LTEwOS43IDQ4LjEtMTUwLjcgODYuNC00OC43IDQ1LjYtNTYuNSA4NS4zLTUzLjMgMTAxLjkgMTEuNCA1OC45IDkyLjYgOTcuMyAxMjUuMSAxMjUuNy0xLjYgLjktMy4xIDEuNy00LjUgMi41LTE2LjMgOC4xLTc4LjIgNDAuNS05My43IDc0LjctMTcuNSAzOC44IDIuOSA2Ni42IDE2LjMgNzAuNCA0MS44IDExLjYgODQuNi05LjMgMTA3LjYtNDMuNnMyMC4yLTc5LjEgOS42LTk5LjVjLS4xLS4zLS4zLS41LS40LS44IDQuMi0yLjUgOC41LTUgMTIuOC03LjUgOC4zLTQuOSAxNi40LTkuNCAyMy41LTEzLjMtNCAxMC44LTYuOSAyMy44LTguNCA0Mi42LTEuOCAyMiA3LjMgNTAuNSAxOS4xIDYxLjcgNS4yIDQuOSAxMS41IDUgMTUuNCA1IDEzLjggMCAyMC0xMS40IDI2LjktMjUgOC41LTE2LjYgMTYtMzUuOSAxNi0zNS45cy05LjQgNTIuMiAxNi4zIDUyLjJjOS40IDAgMTguOC0xMi4xIDIzLTE4LjNsMCAuMXMuMi0uNCAuNy0xLjJjMS0xLjUgMS41LTIuNCAxLjUtMi40bDAtLjNjMy44LTYuNSAxMi4xLTIxLjQgMjQuNi00NiAxNi4yLTMxLjggMzEuNy03MS41IDMxLjctNzEuNSAxLjUgOC43IDMuNiAxNy4zIDYuMiAyNS44IDIuOCA5LjUgOC43IDE5LjkgMTMuNCAzMC0zLjggNS4yLTYuMSA4LjItNi4xIDguMiAwIC4xIDAgLjEgLjEgLjItMyA0LTYuNCA4LjMtOS45IDEyLjUtMTIuOCAxNS4yLTI4IDMyLjYtMzAgMzcuNi0yLjQgNS45LTEuOCAxMC4zIDIuOCAxMy43IDMuNCAyLjYgOS40IDMgMTUuNyAyLjUgMTEuNS0uOCAxOS42LTMuNiAyMy41LTUuNCA3LjItMi42IDE0LTYuMSAyMC4yLTEwLjYgMTIuNS05LjIgMjAuMS0yMi40IDE5LjQtMzkuOC0uNC05LjYtMy41LTE5LjItNy4zLTI4LjIgMS4xLTEuNiAyLjMtMy4zIDMuNC01IDE5LjgtMjguOSAzNS4xLTYwLjYgMzUuMS02MC42IDEuNSA4LjcgMy42IDE3LjMgNi4yIDI1LjggMi40IDguMSA3LjEgMTcgMTEuNCAyNS43LTE4LjYgMTUuMS0zMC4xIDMyLjYtMzQuMSA0NC4xLTcuNCAyMS4zLTEuNiAzMC45IDkuMyAzMy4xIDQuOSAxIDExLjktMS4zIDE3LjEtMy41IDcuNy0yLjYgMTUtNi4zIDIxLjYtMTEuMSAxMi41LTkuMiAyNC42LTIyLjEgMjMuOC0zOS42LS4zLTcuOS0yLjUtMTUuOC01LjQtMjMuNCAxNS43LTYuNiAzNi4xLTEwLjIgNjIuMS03LjIgNTUuNyA2LjUgNjYuNiA0MS4zIDY0LjUgNTUuOHMtMTMuOCAyMi42LTE3LjcgMjUtNS4xIDMuMy00LjggNS4xYy41IDIuNiAyLjMgMi41IDUuNiAxLjkgNC42LS44IDI5LjItMTEuOCAzMC4zLTM4LjcgMS42LTM0LTMxLjEtNzEuNC04OS03MS4xbDAgMHpNMTIxLjggNDM2LjZjLTE4LjQgMjAuMS00NC4yIDI3LjctNTUuMyAyMS4zLTExLjktNi45LTcuMi0zNi41IDE1LjUtNTcuOSAxMy44LTEzIDMxLjYtMjUgNDMuNC0zMi40IDIuNy0xLjYgNi42LTQgMTEuNC02LjkgLjgtLjUgMS4yLS43IDEuMi0uNyAuOS0uNiAxLjktMS4xIDIuOS0xLjcgOC4zIDMwLjQgLjMgNTcuMi0xOS4xIDc4LjNsMCAwem0xMzQuNC05MS40Yy02LjQgMTUuNy0xOS45IDU1LjctMjguMSA1My42LTctMS44LTExLjMtMzIuMy0xLjQtNjIuMyA1LTE1LjEgMTUuNi0zMy4xIDIxLjktNDAuMSAxMC4xLTExLjMgMjEuMi0xNC45IDIzLjgtMTAuNCAzLjUgNS45LTEyLjIgNDkuNC0xNi4yIDU5LjJ6bTExMSA1M2MtMi43IDEuNC01LjIgMi4zLTYuNCAxLjYtLjktLjUgMS4xLTIuNCAxLjEtMi40czEzLjktMTQuOSAxOS40LTIxLjdjMy4yLTQgNi45LTguNyAxMC45LTEzLjkgMCAuNSAuMSAxIC4xIDEuNi0uMSAxNy45LTE3LjMgMzAtMjUuMSAzNC44bDAgMHptODUuNi0xOS41Yy0yLTEuNC0xLjctNi4xIDUtMjAuNyAyLjYtNS43IDguNi0xNS4zIDE5LTI0LjUgMS4yIDMuNSAxLjggNy4xIDEuOSAxMC44LS4xIDIyLjUtMTYuMiAzMC45LTI1LjkgMzQuNGwwIDB6Il0KICAgIH07CiAgICBmYVNxdWFyZVdoYXRzYXBwID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS13aGF0c2FwcCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJ3aGF0c2FwcC1zcXVhcmUiXSwgImY0MGMiLCAiTTkyLjEgMjU0LjZjMCAyNC45IDcgNDkuMiAyMC4yIDcwLjFsMy4xIDUtMTMuMyA0OC42IDQ5LjktMTMuMSA0LjggMi45YzIwLjIgMTIgNDMuNCAxOC40IDY3LjEgMTguNGwuMSAwYzcyLjYgMCAxMzMuMy01OS4xIDEzMy4zLTEzMS44IDAtMzUuMi0xNS4yLTY4LjMtNDAuMS05My4yLTI1LTI1LTU4LTM4LjctOTMuMi0zOC43LTcyLjcgMC0xMzEuOCA1OS4xLTEzMS45IDEzMS44ek0yNzQuOCAzMzBjLTEyLjYgMS45LTIyLjQgLjktNDcuNS05LjktMzYuOC0xNS45LTYxLjgtNTEuNS02Ni45LTU4LjctLjQtLjYtLjctLjktLjgtMS4xLTItMi42LTE2LjItMjEuNS0xNi4yLTQxIDAtMTguNCA5LTI3LjkgMTMuMi0zMi4zIC4zLS4zIC41LS41IC43LS44IDMuNi00IDcuOS01IDEwLjYtNSAyLjYgMCA1LjMgMCA3LjYgLjFsLjggMGMyLjMgMCA1LjIgMCA4LjEgNi44IDEuMiAyLjkgMyA3LjMgNC45IDExLjggMy4zIDggNi43IDE2LjMgNy4zIDE3LjYgMSAyIDEuNyA0LjMgLjMgNi45LTMuNCA2LjgtNi45IDEwLjQtOS4zIDEzLTMuMSAzLjItNC41IDQuNy0yLjMgOC42IDE1LjMgMjYuMyAzMC42IDM1LjQgNTMuOSA0Ny4xIDQgMiA2LjMgMS43IDguNi0xIDIuMy0yLjYgOS45LTExLjYgMTIuNS0xNS41IDIuNi00IDUuMy0zLjMgOC45LTJzMjMuMSAxMC45IDI3LjEgMTIuOWMuOCAuNCAxLjUgLjcgMi4xIDEgMi44IDEuNCA0LjcgMi4zIDUuNSAzLjYgLjkgMS45IC45IDkuOS0yLjQgMTkuMS0zLjMgOS4zLTE5LjEgMTcuNy0yNi43IDE4Ljh6TTQ0OCA5NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwek0xNDguMSAzOTMuOUw2NCA0MTYgODYuNSAzMzMuOGMtMTMuOS0yNC0yMS4yLTUxLjMtMjEuMi03OS4zIC4xLTg3LjQgNzEuMi0xNTguNSAxNTguNi0xNTguNSA0Mi40IDAgODIuMiAxNi41IDExMi4yIDQ2LjUgMjkuOSAzMCA0Ny45IDY5LjggNDcuOSAxMTIuMiAwIDg3LjQtNzIuNyAxNTguNS0xNjAuMSAxNTguNS0yNi42IDAtNTIuNy02LjctNzUuOC0xOS4zeiJdCiAgICB9OwogICAgZmFXaGF0c2FwcFNxdWFyZSA9IGZhU3F1YXJlV2hhdHNhcHA7CiAgICBmYVNreXBlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNreXBlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYxN2UiLCAiTTQyNC43IDI5OS44YzIuOS0xNCA0LjctMjguOSA0LjctNDMuOCAwLTExMy41LTkxLjktMjA1LjMtMjA1LjMtMjA1LjMtMTQuOSAwLTI5LjcgMS43LTQzLjggNC43LTE5LTE0LjctNDIuNi0yMy40LTY4LjMtMjMuNC02MS44IDAtMTEyIDUwLjItMTEyIDExMiAwIDI1LjcgOC43IDQ5LjMgMjMuMyA2OC4yLTIuOSAxNC00LjcgMjguOS00LjcgNDMuOCAwIDExMy41IDkxLjkgMjA1LjMgMjA1LjMgMjA1LjMgMTQuOSAwIDI5LjctMS43IDQzLjgtNC43IDE5IDE0LjYgNDIuNiAyMy4zIDY4LjIgMjMuMyA2MS44IDAgMTEyLTUwLjIgMTEyLTExMiAuMS0yNS42LTguNi00OS4yLTIzLjItNjguMXpNMjMwLjEgMzkxLjNjLTY1LjYgMC0xMjAuNS0yOS4yLTEyMC41LTY1IDAtMTYgOS0zMC42IDI5LjUtMzAuNiAzMS4yIDAgMzQuMSA0NC45IDg4LjEgNDQuOSAyNS43IDAgNDIuMy0xMS40IDQyLjMtMjYuMyAwLTE4LjctMTYtMjEuNi00Mi0yOC02Mi41LTE1LjQtMTE3LjgtMjItMTE3LjgtODcuMiAwLTU5LjIgNTguNi04MS4xIDEwOS4xLTgxLjEgNTUuMSAwIDExMC44IDIxLjkgMTEwLjggNTUuNCAwIDE2LjktMTEuNCAzMS44LTMwLjMgMzEuOC0yOC4zIDAtMjkuMi0zMy41LTc1LTMzLjUtMjUuNyAwLTQyIDctNDIgMjIuNSAwIDE5LjggMjAuOCAyMS44IDY5LjEgMzMgNDEuNCA5LjMgOTAuNyAyNi44IDkwLjcgNzcuNiAwIDU5LjEtNTcuMSA4Ni41LTExMiA4Ni41eiJdCiAgICB9OwogICAgZmFBbmd1bGFyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImFuZ3VsYXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjQyMCIsICJNMTg1LjcgMjY4LjFsNzYuMiAwLTM4LjEtOTEuNi0zOC4xIDkxLjZ6TTIyMy44IDMyTDE2IDEwNi40IDQ3LjggMzgyLjEgMjIzLjggNDgwIDM5OS44IDM4Mi4xIDQzMS42IDEwNi40IDIyMy44IDMyek0zNTQgMzczLjhsLTQ4LjYgMC0yNi4yLTY1LjQtMTEwLjYgMC0yNi4yIDY1LjQtNDguNyAwIDEzMC4xLTI5Mi4zIDEzMC4yIDI5Mi4zeiJdCiAgICB9OwogICAgZmFPcGVuc3VzZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJvcGVuc3VzZSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNjJiIiwgIk00NzEuMSAxMDIuN3MtLjMgMTguMy0uMyAyMC4zYy05LjEtMy03NC40LTI0LjEtMTM1LjctMjYuMy01MS45LTEuOC0xMjIuOC00LjMtMjIzIDU3LjMtMTkuNCAxMi40LTczLjkgNDYuMS05OS42IDEwOS43LTUuNSAxMy4zLTEyLjYgNDMuMy01LjUgNzEuNCAzLjMgMTIuOCA4LjkgMjQuOSAxNi41IDM1LjcgMTcuNCAyNSA0Ni42IDQxLjYgNzguMSA0NC40IDQ0LjQgMy45IDc4LjEtMTYgOTAtNTMuMyA4LjItMjUuOCAwLTYzLjYtMzEuNS04Mi45LTI1LjYtMTUuNy01My4zLTEyLjEtNjkuMi0xLjYtMTMuOSA5LjItMjEuOCAyMy41LTIxLjYgMzkuMiAuMyAyNy44IDI0LjMgNDIuNiA0MS41IDQyLjYgNS40IDAgMTAuNy0uOSAxNS44LTIuNyA2LjUtMS44IDEzLjMtNi41IDEzLjMtMTQuOSAwLTEyLjEtMTEuNi0xNC44LTE2LjgtMTMuOS0yLjkgLjUtNC41IDItMTEuOCAyLjQtMi0uMi0xMi0zLjEtMTItMTRsMC0uMWMuMi0xMi4zIDEzLjItMTggMjUuNS0xNi45IDMyLjMgMi44IDQ3LjcgNDAuNyAyOC41IDY1LjctMTguMyAyMy43LTc2LjYgMjMuMi05OS43LTIwLjQtMjYtNDkuMiAxMi43LTExMS4yIDg3LTk4LjQgMzMuMiA1LjcgODMuNiAzNS41IDEwMi40IDEwNC4zbDQ1LjkgMGMtNS43LTE3LjYtOC45LTY4LjMgNDIuNy02OC4zIDU2LjcgMCA2My45IDM5LjkgNzkuOCA2OC4zbDQ4LjYgMGMtMTIuOC0xOC4zLTIxLjctMzguNy0xOC45LTU1LjggNS42LTMzLjggMzkuNy0xOC40IDgyLjQtMTcuNCA2Ni41IC40IDEwMi4xLTI3IDEwMy4xLTI4IDMuNy0zLjEgNi41LTE1LjggNy0xNy43IDEuMy01LjEtMy4yLTIuNC0zLjItMi40LTguNyA1LjItMzAuNSAxNS4yLTUwLjkgMTUuNi0yNS4zIC41LTc2LjItMjUuNC04MS42LTI4LjItLjMtLjQgLjEgMS4yLTExLTI1LjUgODguNCA1OC4zIDExOC4zIDQwLjUgMTQ1LjIgMjEuNyAuOC0uNiA0LjMtMi45IDMuNi01LjctMTMuOC00OC4xLTIyLjQtNjIuNy0zNC41LTY5LjYtMzctMjEuNi0xMjUtMzQuNy0xMjkuMi0zNS4zIC4xLS4xLS45LS4zLS45IC43em02MC40IDcyLjhhMzcuNiAzNy42IDAgMSAxIDc1LjIgMi42IDM3LjYgMzcuNiAwIDEgMSAtNzUuMi0yLjZ6bTM4LjYtMjUuM2MtMy42LS4zLTcuMSAuMS0xMC41IDEuMnMtNi41IDIuOS05LjIgNS4zLTQuOCA1LjMtNi4zIDguNS0yLjQgNi43LTIuNSAxMC4zIC41IDcuMSAxLjggMTAuNCAzLjMgNi4zIDUuOCA4LjkgNS41IDQuNSA4LjggNS45IDYuOSAyIDEwLjQgMS45YzMuNiAuMyA3LjEtLjEgMTAuNS0xLjJzNi41LTIuOSA5LjItNS4zIDQuOC01LjMgNi4zLTguNSAyLjQtNi43IDIuNS0xMC4zLS41LTcuMS0xLjgtMTAuNC0zLjMtNi4zLTUuOC04LjktNS41LTQuNS04LjgtNS45LTYuOS0yLTEwLjQtMS45em00LjMgMjguOGMtMTUuNCAwLTE1LjQtMTUuNiAwLTE1LjZzMTUuNCAxNS42IDAgMTUuNnoiXQogICAgfTsKICAgIGZhRHJvcGJveCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJkcm9wYm94IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYxNmIiLCAiTTI4OC40IDExNi4zbC0xMzIgODQuMyAxMzIgODQuMy0xMzIgODQuMy0xMzIuNC04NS4xIDEzMi4zLTg0LjMtMTMyLjMtODMuNSAxMzIuMy04NC4zIDEzMi4xIDg0LjN6TTE1NS42IDM5NS43bDEzMi04NC4zIDEzMiA4NC4zLTEzMiA4NC4zLTEzMi04NC4zek0yODguNCAyODQuMWwxMzItODQuMy0xMzItODMuNiAxMzEuMy04NC4yIDEzMi4zIDg0LjMtMTMyLjMgODQuMyAxMzIuMyA4NC4yLTEzMi4zIDg0LjMtMTMxLjMtODV6Il0KICAgIH07CiAgICBmYURlZXplciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJkZWV6ZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTA3NyIsICJNMTQuOCAxMDEuMUM2LjYgMTAxLjEgMCAxMjcuNiAwIDE2MC4zczYuNiA1OS4yIDE0LjggNTkuMiAxNC44LTI2LjUgMTQuOC01OS4yLTYuNi01OS4yLTE0LjgtNTkuMnpNNDQ4LjcgNDAuOWMtNy43IDAtMTQuNSAxNy4xLTE5LjQgNDQuMS03LjctNDYuNy0yMC4yLTc3LTM0LjItNzctMTYuOCAwLTMxLjEgNDIuOS0zOCAxMDUuNC02LjYtNDUuNC0xNi44LTc0LjItMjguMy03NC4yLTE2LjEgMC0yOS42IDU2LjktMzQuNyAxMzYuMi05LjQtNDAuOC0yMy4yLTY2LjMtMzguMy02Ni4zcy0yOC44IDI1LjUtMzguMyA2Ni4zYy01LjEtNzkuMy0xOC42LTEzNi4yLTM0LjctMTM2LjItMTEuNSAwLTIxLjcgMjguOC0yOC4zIDc0LjItNi42LTYyLjUtMjEuMi0xMDUuNC0zNy44LTEwNS40LTE0IDAtMjYuNSAzMC40LTM0LjIgNzctNC44LTI3LTExLjctNDQuMS0xOS40LTQ0LjEtMTQuMyAwLTI2IDU5LjItMjYgMTMyLjFTNDkgMzA1LjIgNjMuMyAzMDUuMmM1LjkgMCAxMS41LTkuOSAxNS44LTI2LjggNi45IDYxLjcgMjEuMiAxMDQuMSAzOCAxMDQuMSAxMyAwIDI0LjUtMjUuNSAzMi4xLTY1LjYgNS40IDc2LjMgMTguNiAxMzAuNCAzNC4yIDEzMC40IDkuNyAwIDE4LjYtMjEuNCAyNS4zLTU2LjQgNy45IDcyLjIgMjYuMyAxMjIuNyA0Ny43IDEyMi43czM5LjUtNTAuNSA0Ny43LTEyMi43YzYuNiAzNSAxNS42IDU2LjQgMjUuMyA1Ni40IDE1LjYgMCAyOC44LTU0LjEgMzQuMi0xMzAuNCA3LjcgNDAuMSAxOS40IDY1LjYgMzIuMSA2NS42IDE2LjYgMCAzMC45LTQyLjMgMzgtMTA0LjEgNC4zIDE2LjggOS43IDI2LjggMTUuOCAyNi44IDE0LjMgMCAyNi01OS4yIDI2LTEzMi4xUzQ2MyA0MC45IDQ0OC43IDQwLjl6bTQ4LjUgNjAuMmMtOC4yIDAtMTQuOCAyNi41LTE0LjggNTkuMnM2LjYgNTkuMiAxNC44IDU5LjIgMTQuOC0yNi41IDE0LjgtNTkuMi02LjYtNTkuMi0xNC44LTU5LjJ6Il0KICAgIH07CiAgICBmYUNyZWF0aXZlQ29tbW9uc1NhbXBsaW5nID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNyZWF0aXZlLWNvbW1vbnMtc2FtcGxpbmciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjRmMCIsICJNMjU1LjYgOEMzOTcuNCA4IDUwNCAxMTguMSA1MDQgMjU2IDUwNCA0MDMuMSAzODUuNSA1MDQgMjU1LjYgNTA0IDEyMS42IDUwNCA4IDM5NC41IDggMjU2IDggMTIzLjEgMTEyLjcgOCAyNTUuNiA4em0uOCA0NC43Yy0xMTguMiAwLTIwMy43IDk3LjktMjAzLjcgMjAzLjMgMCAxMDkuOCA5MS4yIDIwMi44IDIwMy43IDIwMi44IDEwMy4yIDAgMjAyLjgtODEuMSAyMDIuOC0yMDIuOCAuMS0xMTMuOC05MC4yLTIwMy4zLTIwMi44LTIwMy4zem0zLjYgNTMuMmMyLjgtLjMgMTEuNSAxIDExLjUgMTEuNWw2LjYgMTA3LjIgNC45LTU5LjNjMC02IDQuNy0xMC42IDEwLjYtMTAuNnMxMC42IDQuNyAxMC42IDEwLjZjMCAyLjUtLjUtNS43IDUuNyA4MS41bDUuOC02NC4yYy4zLTIuOSAyLjktOS4zIDEwLjItOS4zIDMuOCAwIDkuOSAyLjMgMTAuNiA4LjlsMTEuNSA5Ni41IDUuMy0xMi44YzEuOC00LjQgNS4yLTYuNiAxMC4yLTYuNmw1OCAwIDAgMjEuMy01MC45IDAtMTguMiA0NC4zYy0zLjkgOS45LTE5LjUgOS4xLTIwLjgtMy4xbC00LTMxLjktNy41IDkyLjZjLS4zIDMtMyA5LjMtMTAuMiA5LjMtMyAwLTkuOC0yLjEtMTAuNi05LjMgMC0xLjkgLjYgNS44LTYuMi03Ny45bC01LjMgNzIuMmMtMS4xIDQuOC00LjggOS4zLTEwLjYgOS4zLTIuOSAwLTkuOC0yLTEwLjYtOS4zIDAtMS45IC41IDYuNy01LjgtODcuN0wyNTUgMzgzLjljMCA2LjMtMy42IDEyLjQtMTAuNiAxMi40LTUuMiAwLTEwLjYtNC4xLTEwLjYtMTJMMjI4IDI5Ni42Yy01LjggOTIuNS01LjMgODQtNS4zIDg1LjktMS4xIDQuOC00LjggOS4zLTEwLjYgOS4zLTMgMC05LjgtMi4xLTEwLjYtOS4zIDAtLjctLjQtMS4xLS40LTIuNmwtNi4yLTg4LjYtNC45IDU2LjdjLS43IDYuNS02LjcgOS4zLTEwLjYgOS4zLTUuOCAwLTkuNi00LjEtMTAuNi04LjlMMTU3LjcgMjcyYy0yIDQtMy41IDguNC0xMS4xIDguNGwtNTEuNCAwIDAtMjEuMyA0NC44IDAgMTMuNy0yNy45YzQuNC05LjkgMTguMi03LjIgMTkuOSAyLjdsMy4xIDIwLjQgOC40LTk3LjljMC02IDQuOC0xMC42IDEwLjYtMTAuNiAuNSAwIDEwLjYtLjIgMTAuNiAxMi40bDQuOSA2OS4xIDYuNi05Mi42YzAtMTAuMSA5LjUtMTAuNiAxMC4yLTEwLjYgLjYgMCAxMC42IC43IDEwLjYgMTAuNmw1LjMgODAuNiA2LjItOTcuOWMuMS0xLjEtLjYtMTAuMyA5LjktMTEuNXoiXQogICAgfTsKICAgIGZhSmVkaU9yZGVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImplZGktb3JkZXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjUwZSIsICJNMzk4LjkgMzczLjZjOTUuOS0xMjIuMSAxNy4yLTIzMy4xIDE3LjItMjMzLjEgNDUuNCA4NS44LTQxLjQgMTcwLjUtNDEuNCAxNzAuNSAxMDUtMTcxLjUtNjAuNS0yNzEuNS02MC41LTI3MS41IDk2LjkgNzIuNy0xMC4xIDE5MC43LTEwLjEgMTkwLjcgODUuOCAxNTguNC02OC42IDIzMC4xLTY4LjYgMjMwLjFzLS40LTE2LjktMi4yLTg1LjdjNC4zIDQuNSAzNC41IDM2LjIgMzQuNSAzNi4ybC0yNC4yLTQ3LjQgNjIuNi05LjEtNjIuNi05LjEgMjAuMi01NS41LTMxLjQgNDUuOWMtMi4yLTg3LjctNy44LTMwNS4xLTcuOS0zMDYuOSAwIDEtNS42IDIxOS03LjkgMzA2LjlsLTMxLjQtNDUuOSAyMC4yIDU1LjUtNjIuNiA5LjEgNjIuNiA5LjEtMjQuMiA0Ny40IDM0LjUtMzYuMmMtMS44IDY4LjgtMi4yIDg1LjctMi4yIDg1LjdTNTkuMSAzODguNiAxNDQuOSAyMzAuMmMwIDAtMTA3LTExOC4xLTEwLjEtMTkwLjcgMCAwLTE2NS41IDk5LjktNjAuNSAyNzEuNSAwIDAtODYuOC04NC44LTQxLjQtMTcwLjUgMCAwLTc4LjcgMTExIDE3LjIgMjMzLjEgMCAwLTI2LjItMTYuMS00OS40LTc3LjcgMCAwIDE2LjkgMTgzLjMgMjIyIDE4NS43bDQuMSAwYzIwNS0yLjQgMjIyLTE4NS43IDIyMi0xODUuNy0yMy42IDYxLjUtNDkuOSA3Ny43LTQ5LjkgNzcuN3oiXQogICAgfTsKICAgIGZhUlByb2plY3QgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAici1wcm9qZWN0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY0ZjciLCAiTTU3OC41IDIyNi42QzU3OC41IDExOS4xIDQ0OC40IDMyIDI4OCAzMlMtMi41IDExOS4xLTIuNSAyMjYuNmMwIDk1LjggMTAzLjMgMTc1LjQgMjM5LjQgMTkxLjVsMCA2MS45IDk5LjEgMCAwLTYxLjVjMjQuMy0yLjcgNDcuNi03LjQgNjkuNC0xMy45bDQwLjEgNzUuNCAxMTIgMC02Ny40LTExMy43YzU0LjUtMzUuNCA4OC40LTg0LjkgODguNC0xMzkuN3pNMTExLjcgMjQxLjFjMC03My41IDk4LjktMTMzIDIyMC44LTEzM3MyMTEuOSA0MC43IDIxMS45IDEzM2MwIDUwLjEtMjYuNSA4NS03MC4zIDEwNi40LTIuNC0xLjYtNC43LTIuOS02LjQtMy43LTEwLjItNS4yLTI3LjgtMTAuNS0yNy44LTEwLjVzODYuNi02LjQgODYuNi05Mi43LTkwLjYtODcuOS05MC42LTg3LjlsLTE5OSAwIDAgMjA4LjNjLTc0LjEtMjEuNS0xMjUuMi02Ny4xLTEyNS4yLTExOS45em0yMjUuMSAzOC4zbDAtNTUuNmM1Ny44IDAgODcuOC02LjggODcuOCAyNy4zIDAgMzYuNS0zOC4yIDI4LjMtODcuOCAyOC4zem0tLjkgNzIuNWwyNi42IDBjMTAuOCAwIDE4LjkgMTEuNyAyNCAxOS4yLTE2LjEgMS45LTMzIDIuOC01MC42IDIuOWwwLTIyLjF6Il0KICAgIH07CiAgICBmYUluc3RhbG9kID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImluc3RhbG9kIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUwODEiLCAiTTE1My42IDQ4MGwyMzMuNyAwIDExNS40LTIwNC4yLTI5OC4zIDU3LjQtNTAuOCAxNDYuOHpNNTA1IDI0MC4xTDM4Ny40IDMyIDE1NS45IDMyIDM2MC41IDI2Ny45IDUwNSAyNDAuMXpNMTI0LjYgNDguOEw3LjUgMjU2IDEyMy41IDQ2MS4yIDIyNS45IDE2NS42IDEyNC42IDQ4Ljh6Il0KICAgIH07CiAgICBmYUNhbmFkaWFuTWFwbGVMZWFmID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNhbmFkaWFuLW1hcGxlLWxlYWYiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjc4NSIsICJNMzgzLjggMzUxLjdjMi41LTIuNSAxMDUuMi05Mi40IDEwNS4yLTkyLjRsLTE3LjUtNy41Yy0xMC00LjktNy40LTExLjUtNS0xNy40IDIuNC03LjYgMjAuMS02Ny4zIDIwLjEtNjcuM3MtNDcuNyAxMC01Ny43IDEyLjVjLTcuNSAyLjQtMTAtMi41LTEyLjUtNy41cy0xNS0zMi40LTE1LTMyLjQtNTIuNiA1OS45LTU1LjEgNjIuM2MtMTAgNy41LTIwLjEgMC0xNy42LTEwIDAtMTAgMjcuNi0xMjkuNiAyNy42LTEyOS42cy0zMC4xIDE3LjQtNDAuMSAyMi40Yy03LjUgNS0xMi42IDUtMTcuNi01LTUuMS03LjUtNDIuNy03OS44LTQyLjctNzkuOHMtMzcuNSA3Mi4zLTQyLjUgNzkuOGMtNSAxMC0xMCAxMC0xNy42IDUtMTAtNS00MC4xLTIyLjQtNDAuMS0yMi40UzE4My4zIDE4MiAxODMuMyAxOTJjMi41IDEwLTcuNSAxNy41LTE3LjYgMTAtMi41LTIuNS01NS4xLTYyLjMtNTUuMS02Mi4zcy0xMi41IDI3LjMtMTUgMzIuMy01IDkuOS0xMi41IDcuNUM3MyAxNzcgMjUuNCAxNjcgMjUuNCAxNjdTNDMgMjI2LjcgNDUuNSAyMzQuM2MyLjQgNiA1IDEyLjUtNSAxNy40TDIzIDI1OS4zczEwMi42IDg5LjkgMTA1LjIgOTIuNGM1LjEgNSAxMCA3LjUgNS4xIDIyLjUtNS4xIDE1LTEwLjEgMzUuMS0xMC4xIDM1LjFzOTUuMi0yMC4xIDEwNS4zLTIyLjZjOC43LS45IDE4LjMgMi41IDE4LjMgMTIuNVMyNDEgNTEyIDI0MSA1MTJsMzAgMHMtNS44LTEwMi43LTUuOC0xMTIuOCA5LjUtMTMuNCAxOC40LTEyLjVjMTAgMi41IDEwNS4yIDIyLjYgMTA1LjIgMjIuNnMtNS0yMC4xLTEwLTM1LjEgMC0xNy41IDUtMjIuNXoiXQogICAgfTsKICAgIGZhRXRoZXJldW0gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZXRoZXJldW0iLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZjQyZSIsICJNMzExLjkgMjYwLjhMMTYwIDM1My42IDggMjYwLjggMTYwIDAgMzExLjkgMjYwLjh6TTE2MCAzODMuNEw4IDI5MC42IDE2MCA1MTIgMzEyIDI5MC42IDE2MCAzODMuNHoiXQogICAgfTsKICAgIGZhSG91enogPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaG91enoiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjI3YyIsICJNMjc2IDMzMC43bC0xMDQuNiAwIDAgMTQ5LjMtMTU0LjMgMCAwLTQ0OCAxMDkuNSAwIDAgMTA0LjUgMzA1LjEgODUuNiAwIDI1Ny45LTE1NS43IDAgMC0xNDkuM3oiXQogICAgfTsKICAgIGZhVmliZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidmliZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjQwOSIsICJNNDQ0LjMgNDkuOWMtMTIuNy0xMS43LTY0LjEtNDktMTc4LjctNDkuNSAwIDAtMTM1LjEtOC4xLTIwMC45IDUyLjMtMzYuNiAzNi42LTQ5LjUgOTAuMy01MC45IDE1Ni44cy0zLjEgMTkxLjEgMTE3IDIyNC45bC4xIDAtLjEgNTEuNnMtLjggMjAuOSAxMyAyNS4xYzE2LjYgNS4yIDI2LjQtMTAuNyA0Mi4zLTI3LjggOC43LTkuNCAyMC43LTIzLjIgMjkuOC0zMy43IDgyLjIgNi45IDE0NS4zLTguOSAxNTIuNS0xMS4yIDE2LjYtNS40IDExMC41LTE3LjQgMTI1LjctMTQyIDE1LjgtMTI4LjYtNy42LTIwOS44LTQ5LjgtMjQ2LjV6TTQ1OC4yIDI4N2MtMTIuOSAxMDQtODkgMTEwLjYtMTAzIDExNS4xLTYgMS45LTYxLjUgMTUuNy0xMzEuMiAxMS4yIDAgMC01MiA2Mi43LTY4LjIgNzktNS4zIDUuMy0xMS4xIDQuOC0xMS01LjcgMC02LjkgLjQtODUuNyAuNC04NS43bDAgMEM0My40IDM3Mi43IDQ5LjQgMjY2LjYgNTAuNSAyMTEuMXMxMS42LTEwMSA0Mi42LTEzMS42YzU1LjctNTAuNSAxNzAuNC00MyAxNzAuNC00MyA5Ni45IC40IDE0My4zIDI5LjYgMTU0LjEgMzkuNCAzNS43IDMwLjYgNTMuOSAxMDMuOCA0MC42IDIxMS4xem0tMTM5LTgwLjhjLjQgOC42LTEyLjUgOS4yLTEyLjkgLjYtMS4xLTIyLTExLjQtMzIuNy0zMi42LTMzLjktOC42LS41LTcuOC0xMy40IC43LTEyLjkgMjcuOSAxLjUgNDMuNCAxNy41IDQ0LjggNDYuMnptMjAuMyAxMS4zYzEtNDIuNC0yNS41LTc1LjYtNzUuOC03OS4zLTguNS0uNi03LjYtMTMuNSAuOS0xMi45IDU4IDQuMiA4OC45IDQ0LjEgODcuOCA5Mi41LS4xIDguNi0xMy4xIDguMi0xMi45LS4zem00NyAxMy40Yy4xIDguNi0xMi45IDguNy0xMi45IC4xLS42LTgxLjUtNTQuOS0xMjUuOS0xMjAuOC0xMjYuNC04LjUtLjEtOC41LTEyLjkgMC0xMi45IDczLjcgLjUgMTMzIDUxLjQgMTMzLjcgMTM5LjJ6TTM3NS4yIDMyOWwwIC4yYy0xMC44IDE5LTMxIDQwLTUxLjggMzMuM2wtLjItLjNjLTIxLjEtNS45LTcwLjgtMzEuNS0xMDIuMi01Ni41LTE2LjItMTIuOC0zMS0yNy45LTQyLjQtNDIuNC0xMC4zLTEyLjktMjAuNy0yOC4yLTMwLjgtNDYuNi0yMS4zLTM4LjUtMjYtNTUuNy0yNi01NS43LTYuNy0yMC44IDE0LjItNDEgMzMuMy01MS44bC4yIDBjOS4yLTQuOCAxOC0zLjIgMjMuOSAzLjkgMCAwIDEyLjQgMTQuOCAxNy43IDIyLjEgNSA2LjggMTEuNyAxNy43IDE1LjIgMjMuOCA2LjEgMTAuOSAyLjMgMjItMy43IDI2LjZsLTEyIDkuNmMtNi4xIDQuOS01LjMgMTQtNS4zIDE0czE3LjggNjcuMyA4NC4zIDg0LjNjMCAwIDkuMSAuOCAxNC01LjNsOS42LTEyYzQuNi02IDE1LjctOS44IDI2LjYtMy43IDE0LjcgOC4zIDMzLjQgMjEuMiA0NS44IDMyLjkgNyA1LjcgOC42IDE0LjQgMy44IDIzLjZ6Il0KICAgIH07CiAgICBmYUtpY2tzdGFydGVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImtpY2tzdGFydGVyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInNxdWFyZS1raWNrc3RhcnRlciJdLCAiZjNiYiIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnpNMzIwLjggMjMzbC0yMy4zIDIzLjEgMjMuMyAyMi45YzI0LjEgMjMuOSAyNC4xIDYzIDAgODYuOXMtNjMuNCAyMy45LTg3LjYgMGwtOC41LTguNGMtMTEuMyAxNi0yOS43IDI2LjUtNTAuOSAyNi41LTM0LjEgMC02MS45LTI3LjUtNjEuOS02MS40bDAtMTMzLjJjMC0zMy44IDI3LjctNjEuNCA2MS45LTYxLjQgMjEuMSAwIDM5LjYgMTAuNSA1MC45IDI2LjVsOC41LTguNGMyNC4xLTIzLjkgNjMuNC0yMy45IDg3LjYgMHMyNC4xIDYzIDAgODYuOXoiXQogICAgfTsKICAgIGZhU3F1YXJlS2lja3N0YXJ0ZXIgPSBmYUtpY2tzdGFydGVyOwogICAgZmFTcG90aWZ5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNwb3RpZnkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjFiYyIsICJNMjU2IDhhMjQ4IDI0OCAwIDEgMCAwIDQ5NiAyNDggMjQ4IDAgMSAwIDAtNDk2ek0zNTYuNyAzNzIuOWMtNC4yIDAtNi44LTEuMy0xMC43LTMuNi02Mi40LTM3LjYtMTM1LTM5LjItMjA2LjctMjQuNS0zLjkgMS05IDIuNi0xMS45IDIuNi05LjcgMC0xNS44LTcuNy0xNS44LTE1LjggMC0xMC4zIDYuMS0xNS4yIDEzLjYtMTYuOCA4MS45LTE4LjEgMTY1LjYtMTYuNSAyMzcgMjYuMiA2LjEgMy45IDkuNyA3LjQgOS43IDE2LjVzLTcuMSAxNS40LTE1LjIgMTUuNHptMjYuOS02NS42Yy01LjIgMC04LjctMi4zLTEyLjMtNC4yLTYyLjUtMzctMTU1LjctNTEuOS0yMzguNi0yOS40LTQuOCAxLjMtNy40IDIuNi0xMS45IDIuNi0xMC43IDAtMTkuNC04LjctMTkuNC0xOS40czUuMi0xNy44IDE1LjUtMjAuN2MyNy44LTcuOCA1Ni4yLTEzLjYgOTcuOC0xMy42IDY0LjkgMCAxMjcuNiAxNi4xIDE3NyA0NS41IDguMSA0LjggMTEuMyAxMSAxMS4zIDE5LjctLjEgMTAuOC04LjUgMTkuNS0xOS40IDE5LjV6bTMxLTc2LjJjLTUuMiAwLTguNC0xLjMtMTIuOS0zLjktNzEuMi00Mi41LTE5OC41LTUyLjctMjgwLjktMjkuNy0zLjYgMS04LjEgMi42LTEyLjkgMi42LTEzLjIgMC0yMy4zLTEwLjMtMjMuMy0yMy42IDAtMTMuNiA4LjQtMjEuMyAxNy40LTIzLjkgMzUuMi0xMC4zIDc0LjYtMTUuMiAxMTcuNS0xNS4yIDczIDAgMTQ5LjUgMTUuMiAyMDUuNCA0Ny44IDcuOCA0LjUgMTIuOSAxMC43IDEyLjkgMjIuNiAwIDEzLjYtMTEgMjMuMy0yMy4yIDIzLjN6Il0KICAgIH07CiAgICBmYUxlYW5wdWIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibGVhbnB1YiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMjEyIiwgIk0zODYuNiAxMTEuNWwxNS4xIDI0OS0xMS0uM2MtMzYuMi0uOC03MS42IDguOC0xMDIuNyAyOC0zMS0xOS4yLTY2LjQtMjgtMTAyLjctMjgtNDUuNiAwLTgyLjEgMTAuNy0xMjMuNSAyNy43TDkzLjIgMTI5LjZjMjguNS0xMS44IDYxLjUtMTguMSA5Mi4yLTE4LjEgNDEuMiAwIDczLjggMTMuMiAxMDIuNyA0Mi41IDI3LjctMjguMyA1OS00MS43IDk4LjUtNDIuNXpNNTY5LjIgNDQ4Yy0yNS41IDAtNDcuNS01LjItNzAuNS0xNS42LTM0LjMtMTUuNi03MC0yNS0xMDcuOS0yNS0zOSAwLTc0LjkgMTIuOS0xMDIuNyA0MC42LTI3LjctMjcuNy02My43LTQwLjYtMTAyLjctNDAuNi0zNy45IDAtNzMuNiA5LjMtMTA3LjkgMjUtMjIuMiA5LjktNDQuNyAxNS42LTY5LjIgMTUuNkw3IDQ0OCA0OS42IDk4LjljMzkuMy0yMi4yIDg3LTM0LjkgMTMyLjMtMzQuOSAzNy4xIDAgNzUuMiA3LjcgMTA2LjIgMjkuMSAzMS0yMS40IDY5LjItMjkuMSAxMDYuMi0yOS4xIDQ1LjMgMCA5MyAxMi42IDEzMi4zIDM0LjlMNTY5LjIgNDQ4em0tNDMuNC00NC43TDQ5MS44IDEyM2MtMzAuNy0xNC02Ny4yLTIxLjQtMTAxLTIxLjQtMzguNCAwLTc0LjQgMTIuMS0xMDIuNyAzOC43LTI4LjMtMjYuNi02NC4yLTM4LjctMTAyLjctMzguNy0zMy44IDAtNzAuMyA3LjQtMTAxIDIxLjRsLTM0IDI4MC4yYzQ3LjItMTkuNSA4Mi45LTMzLjUgMTM1LTMzLjUgMzcuNiAwIDcwLjggOS42IDEwMi43IDI5LjYgMzEuOC0yMCA2NS4xLTI5LjYgMTAyLjctMjkuNiA1Mi4yIDAgODcuOCAxNCAxMzUgMzMuNXoiXQogICAgfTsKICAgIGZhSmF2YSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJqYXZhIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY0ZTQiLCAiTTI3Ny44IDMxMi45YzkuOC02LjcgMjMuNC0xMi41IDIzLjQtMTIuNXMtMzguNyA3LTc3LjIgMTAuMmMtNDcuMSAzLjktOTcuNyA0LjctMTIzLjEgMS4zLTYwLjEtOCAzMy0zMC4xIDMzLTMwLjFzLTM2LjEtMi40LTgwLjYgMTljLTUyLjUgMjUuNCAxMzAgMzcgMjI0LjUgMTIuMXptLTg1LjQtMzIuMWMtMTktNDIuNy04My4xLTgwLjIgMC0xNDUuOCAxMDMuNy04MS44IDUwLjUtMTM1IDUwLjUtMTM1IDIxLjUgODQuNS03NS42IDExMC4xLTExMC43IDE2Mi42LTIzLjkgMzUuOSAxMS43IDc0LjQgNjAuMiAxMTguMnpNMzA3IDEwNC42Yy4xIDAtMTc1LjIgNDMuOC05MS41IDE0MC4yIDI0LjcgMjguNC02LjUgNTQtNi41IDU0czYyLjctMzIuNCAzMy45LTcyLjlDMjE2IDE4OC4xIDE5NS40IDE2OS4zIDMwNyAxMDQuNnptLTYuMSAyNzAuNWMtLjUgMS0xLjIgMS44LTIgMi42IDEyOC4zLTMzLjcgODEuMS0xMTguOSAxOS44LTk3LjMtMy4zIDEuMi02LjIgMy40LTguMiA2LjMgMy42LTEuMyA3LjMtMi4zIDExLTMgMzEtNi41IDc1LjUgNDEuNS0yMC42IDkxLjR6TTM0OCA0MzcuNHMxNC41IDExLjktMTUuOSAyMS4yYy01Ny45IDE3LjUtMjQwLjggMjIuOC0yOTEuNiAuNy0xOC4zLTcuOSAxNi0xOSAyNi44LTIxLjMgMTEuMi0yLjQgMTcuNy0yIDE3LjctMi0yMC4zLTE0LjMtMTMxLjMgMjguMS01Ni40IDQwLjIgMjA0LjIgMzMuMiAzNzIuNC0xNC45IDMxOS40LTM4Ljh6TTEyNC41IDM5NmMtNzguNyAyMiA0Ny45IDY3LjQgMTQ4LjEgMjQuNS05LjgtMy44LTE5LjItOC40LTI4LjItMTMuOC00NC43IDguNS02NS40IDkuMS0xMDYgNC41LTMzLjUtMy44LTEzLjktMTUuMi0xMy45LTE1LjJ6bTE3OS44IDk3LjJjLTc4LjcgMTQuOC0xNzUuOCAxMy4xLTIzMy4zIDMuNiAwLS4xIDExLjggOS43IDcyLjQgMTMuNiA5Mi4yIDUuOSAyMzMuOC0zLjMgMjM3LjEtNDYuOSAwIDAtNi40IDE2LjUtNzYuMiAyOS43ek0yNjAuNyAzNTNjLTU5LjIgMTEuNC05My41IDExLjEtMTM2LjggNi42LTMzLjUtMy41LTExLjYtMTkuNy0xMS42LTE5LjctODYuOCAyOC44IDQ4LjIgNjEuNCAxNjkuNSAyNS45LTcuOC0yLjgtMTUtNy4xLTIxLjEtMTIuOHoiXQogICAgfTsKICAgIGZhTmZjU3ltYm9sID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm5mYy1zeW1ib2wiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTUzMSIsICJNMzYwLjkgMzIuNGM3LjctMS4zIDE1LjcgLjUgMjEuMiA1IDg0LjEgNTguNyAxMjkuOSAxMzYuMyAxMjkuOSAyMTcuNyAwIDgzLjEtNDUuOCAxNjAuOC0xMjkuOSAyMTkuNS00LjggNC0xMS43IDUuOS0xOC42IDUuMy03LS42LTEzLjUtMy42LTE4LjQtOC41TDE2MS43IDI4OC43Yy01LjYtNS41LTguNy0xMy05LjYtMjAuOSAwLTcuOCA0LTE1LjMgOS41LTIwLjkgNS42LTUuNSAxMy4xLTguNyAyMC45LTguNyA3LjkgMCAxNS40IDMuMSAyMC45IDguNkwzNjguNSA0MTEuMmM1NC42LTQ0LjcgODQuMy05OS4yIDg0LjMtMTU2LjEgMC02MS42LTM2LjktMTIyLjItMTAzLjktMTY5LjMtNi40LTQuNS0xMC44LTExLjQtMTIuMS0xOS4xLTEuNC03LjcgLjQtMTUuNyA1LTIyLjEgNC41LTYuNCAxMS40LTEwLjggMTkuMS0xMi4xem0tMjA2IDQ0Ny4yYy03LjcgMS4zLTE1LjYtLjUtMjIuMS01LTgzLjEtNTguNy0xMjktMTM2LjQtMTI5LTIxOS41IDAtODEuNCA0NS44LTE1OSAxMjktMjE3LjcgNS43LTQgMTIuNi01LjkgMTkuNi01LjMgNi45IC42IDEzLjQgMy42IDE4LjMgOC41TDM1NC4xIDIyMy4zYzUuNiA1LjUgOC43IDEzIDguNyAyMC45IC4xIDYuOS0zIDE1LjMtOC42IDIwLjktNS41IDUuNS0xMyA4LjctMjAuOSA4LjctNy44IDAtMTYuMi0zLjEtMjAuOS04LjZMMTQ3LjMgMTAwLjdjLTU0LjYgNDUuMi04NC4zIDk5LjItODQuMyAxNTQuNCAwIDYzLjQgMzYuOSAxMjQgMTAzLjEgMTcxLjEgNy4zIDQuNiAxMS42IDExLjQgMTMgMTkuMiAxLjMgNy43LS41IDE1LjctNSAyMi4xcy0xMS40IDEwLjctMTkuMiAxMi4xeiJdCiAgICB9OwogICAgZmFXb2R1ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIndvZHUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTA4OCIsICJNMTc4LjQgMzM5LjdsLTM3LjMgMC0yOC45LTExNi4yLS41IDAtMjguNSAxMTYuMi0zOCAwLTQ1LjItMTcwLjggMzcuNSAwIDI3IDExNi4yIC41IDAgMjkuNy0xMTYuMiAzNS4yIDAgMjkuMiAxMTcuNyAuNSAwIDI4LTExNy43IDM2LjggMC00NS45IDE3MC44em05My0xMjdjMzkgMCA2NC4xIDI1LjggNjQuMSA2NS4zIDAgMzkuMi0yNS4xIDY1LTY0LjEgNjUtMzguNyAwLTYzLjktMjUuOC02My45LTY1IDAtMzkuNSAyNS4xLTY1LjMgNjMuOS02NS4zem0wIDEwNC44YzIzLjIgMCAzMC4xLTE5LjkgMzAuMS0zOS41IDAtMTkuOS02LjktMzkuNy0zMC4xLTM5LjctMjcuNyAwLTI5LjkgMTkuOS0yOS45IDM5LjcgMCAxOS42IDYuOSAzOS41IDI5LjkgMzkuNXptMTYzLjcgNi41bC0uNSAwYy03LjkgMTMuNC0yMS44IDE5LjEtMzcuNSAxOS4xLTM3LjMgMC01NS41LTMyLTU1LjUtNjYuMiAwLTMzLjIgMTguNC02NC4xIDU0LjgtNjQuMSAxNC42IDAgMjguOSA2LjIgMzYuOCAxOC40bC4yIDAgMC02Mi4yIDM0IDAgMCAxNzAuOC0zMi4zIDAgMC0xNS44em0tMjkuNy04NS42Yy0yMi4yIDAtMjkuOSAxOS4xLTI5LjkgMzkuNSAwIDE5LjQgOC44IDM5LjcgMjkuOSAzOS43IDIyLjUgMCAyOS4yLTE5LjYgMjkuMi0zOS45IDAtMjAuMS03LjItMzkuMi0yOS4yLTM5LjJ6TTU5MyAzMzkuN2wtMzIuMyAwIDAtMTcuMi0uNyAwYy04LjYgMTMuOS0yMy40IDIwLjYtMzcuOCAyMC42LTM2LjEgMC00NS4yLTIwLjMtNDUuMi01MC45bDAtNzYuMSAzNCAwIDAgNjkuOGMwIDIwLjMgNiAzMC40IDIxLjggMzAuNCAxOC40IDAgMjYuMy0xMC4zIDI2LjMtMzUuNGwwLTY0LjggMzQgMCAwIDEyMy42em05LjUtMzYuOGwzNy41IDAgMCAzNi44LTM3LjUgMCAwLTM2Ljh6Il0KICAgIH07CiAgICBmYVNxdWFyZVN0ZWFtID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1zdGVhbSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJzdGVhbS1zcXVhcmUiXSwgImYxYjciLCAiTTE2NS42IDMwOS4xYzE4LjYgNy43IDI3LjMgMjguOSAxOS42IDQ3LjRzLTI5IDI3LjItNDcuNiAxOS40bC0yOC41LTExLjhjNSAxMC42IDEzLjggMTkuNCAyNS40IDI0LjIgMjUuMiAxMC41IDU0LjEtMS40IDY0LjYtMjYuNSA1LjEtMTIuMSA1LjEtMjUuNSAuMS0zNy43LTUuMS0xMi4xLTE0LjUtMjEuNi0yNi43LTI2LjctMTIuMS01LTI1LTQuOC0zNi40LS41bDI5LjUgMTIuMnpNNDQ4IDk2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZsMCAxNDQuNyAxMTYuNiA0OC4xYzEyLTguMiAyNi4yLTEyLjEgNDAuNy0xMS4zbDU1LjQtODAuMiAwLTEuMWMwLTQ4LjIgMzkuMy04Ny41IDg3LjYtODcuNXM4Ny42IDM5LjMgODcuNiA4Ny41YzAgNDkuMi00MC45IDg4LjctODkuNiA4Ny41bC03OSA1Ni4zYzEuNiAzOC41LTI5LjEgNjguOC02NS43IDY4LjgtMzEuOCAwLTU4LjUtMjIuNy02NC41LTUyLjdMMCAzMTkuMiAwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMHpNMjQxLjkgMTk2LjJhNTguNCA1OC40IDAgMSAwIDExNi44IDAgNTguNCA1OC40IDAgMSAwIC0xMTYuOCAwem0xMDIuNC0uMWE0My45IDQzLjkgMCAxIDEgLTg3LjggMCA0My45IDQzLjkgMCAxIDEgODcuOCAweiJdCiAgICB9OwogICAgZmFTdGVhbVNxdWFyZSA9IGZhU3F1YXJlU3RlYW07CiAgICBmYUNyZWF0aXZlQ29tbW9uc05jRXUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY3JlYXRpdmUtY29tbW9ucy1uYy1ldSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNGU5IiwgIk0yNTUuNyA4QzExMS42IDggOCAxMjQuOCA4IDI1NiA4IDM5Mi4zIDExOS43IDUwNCAyNTUuNyA1MDQgMzg1LjkgNTA0IDUwNCA0MDMuMSA1MDQgMjU2IDUwNCAxMTcgMzk2LjQgOCAyNTUuNyA4em0uNiA0NTAuN2MtMTEyIDAtMjAzLjYtOTIuNS0yMDMuNi0yMDIuNyAwLTIzLjIgMy43LTQ1LjIgMTAuOS02Nmw2NS43IDI5LjEtNC43IDAgMCAyOS41IDIzLjMgMGMwIDYuMi0uNCAzLjItLjQgMTkuNWwtMjIuOCAwIDAgMjkuNSAyNyAwYzExLjQgNjcgNjcuMiAxMDEuMyAxMjQuNiAxMDEuMyAyNi42IDAgNTAuNi03LjkgNjQuOC0xNS44bC0xMC00Ni4xYy04LjcgNC42LTI4LjIgMTAuOC00Ny4zIDEwLjgtMjguMiAwLTU4LjEtMTAuOS02Ny4zLTUwLjJsOTAuMyAwIDEyOC4zIDU2LjhjLTEuNSAyLjEtNTYuMiAxMDQuMy0xNzguOCAxMDQuM3pNMjM5LjYgMjY4LjFsLS41LS40IC45IC40LS40IDB6bTc3LjItMTkuNWwzLjcgMCAwLTI5LjUtNzAuMyAwLTI4LjYtMTIuNmMyLjUtNS41IDUuNC0xMC41IDguOC0xNC4zIDEyLjktMTUuOCAzMS4xLTIyLjQgNTEuMS0yMi40IDE4LjMgMCAzNS4zIDUuNCA0Ni4xIDEwbDExLjYtNDcuM2MtMTUtNi42LTM3LTEyLjQtNjIuMy0xMi40LTM5IDAtNzIuMiAxNS44LTk1LjkgNDIuMy01LjMgNi4xLTkuOCAxMi45LTEzLjkgMjAuMUw4NS41IDE0Ni40YzY0LjYtOTYuOCAxNTcuNy05My42IDE3MC43LTkzLjYgMTEzIDAgMjAzIDkwLjIgMjAzIDIwMy40IDAgMTguNy0yLjEgMzYuMy02LjMgNTIuOUwzMTYuOCAyNDguNnoiXQogICAgfTsKICAgIGZhTnBtID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm5wbSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmM2Q0IiwgIk0yODggMjg4bC0zMiAwIDAtNjQgMzIgMCAwIDY0ek01NzYgMTYwbDAgMTkyLTI4OCAwIDAgMzItMTI4IDAgMC0zMi0xNjAgMCAwLTE5MiA1NzYgMHpNMTYwIDE5MmwtMTI4IDAgMCAxMjggNjQgMCAwLTk2IDMyIDAgMCA5NiAzMiAwIDAtMTI4em0xNjAgMGwtMTI4IDAgMCAxNjAgNjQgMCAwLTMyIDY0IDAgMC0xMjh6bTIyNCAwbC0xOTIgMCAwIDEyOCA2NCAwIDAtOTYgMzIgMCAwIDk2IDMyIDAgMC05NiAzMiAwIDAgOTYgMzIgMCAwLTEyOHoiXQogICAgfTsKICAgIGZhQ2xvdWRzY2FsZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjbG91ZHNjYWxlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzODMiLCAiTTMxOC4xIDE1NGwtOS40IDcuNmMtMjIuNS0xOS4zLTUxLjUtMzMuNi04My4zLTMzLjYtNzEuNiAwLTEyOS40IDYwLjgtMTI5LjQgMTMyLjMgMCA2LjYgLjQgMTMuMSAxLjQgMTkuNC0yLTU2IDQxLjgtOTcuNCA5Mi42LTk3LjQgMjQuMiAwIDQ2LjIgOS40IDYyLjYgMjQuN2wtMjUuMiAyMC40Yy04LjMtLjktMTYuOCAxLjgtMjMuMSA4LjEtMTEuMSAxMS0xMS4xIDI4LjkgMCA0MCAxMS4xIDExIDI4LjkgMTEgNDAgMCA2LjMtNi4zIDktMTQuOSA4LjEtMjMuMWw3NS4yLTg4LjhjNi4zLTYuNS0zLjMtMTUuOS05LjUtOS42ek0yMTMuNyAyNDYuNWExNCAxNCAwIDEgMSAyMC42IDE5IDE0IDE0IDAgMSAxIC0yMC42LTE5ek0yMjQgMzJhMjI0IDIyNCAwIDEgMCAwIDQ0OCAyMjQgMjI0IDAgMSAwIDAtNDQ4em0wIDY0YTE2MCAxNjAgMCAxIDEgMCAzMjAgMTYwIDE2MCAwIDEgMSAwLTMyMHoiXQogICAgfTsKICAgIGZhVGhlbWVjbyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ0aGVtZWNvIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY1YzYiLCAiTTIwMi45IDguNGM5LjktNS43IDI2LTUuOCAzNi0uMkw0MzAgMTE1LjljMTAgNS42IDE4IDE5LjQgMTggMzAuOUw0NDggMzY0YzAgMTEuNC04LjEgMjUuMy0xOCAzMUwyMzguOCA1MDMuN2MtOS45IDUuNy0yNiA1LjYtMzUuOC0uMkwxNy45IDM5NS4xQzggMzg5LjMgMCAzNzUuNCAwIDM2NEwwIDE0Ni43YzAtMTEuNCA4LTI1LjQgMTcuOS0zMS4xTDIwMi45IDguNHpNMTI1LjUgMjA4LjNjLTE1LjkgMC0zMS45IC4xLTQ3LjggLjFsMCAxMDEuNCAxOS4xIDAgMC0yOS44IDI4LjcgMGM0OS43IDAgNDkuNi03MS43IDAtNzEuN3pNMjY1LjYgMzA4LjZsLTMwLjctMzQuNmMzNy03LjUgMzQuOC02NS4yLTEwLjktNjUuNS0xNi4xIDAtMzIuMi0uMS00OC4zLS4xbDAgMTAxLjYgMTkuMSAwIDAtMzMuOSAxOC40IDAgMjkuNiAzMy45IDIyLjggMCAwLTEuM3ptLTQxLjYtODIuM2MyMy4zIDAgMjMuMyAzMi41IDAgMzIuNWwtMjkuMSAwIDAtMzIuNSAyOS4xIDB6bS05NS42LTEuNmMyMS4yIDAgMjEuMSAzOC45IDAgMzguOWwtMzIuMyAwIDAtMzguOCAzMi4zIDB6bTE5Mi42LTE4LjJjLTY4LjUgMC03MSAxMDUuOCAwIDEwNS44IDY5LjUgMCA2OS40LTEwNS44IDAtMTA1Ljh6bTAgMTcuNGM0NC4xIDAgNDQuOCA3MC45IDAgNzAuOXMtNDQuNC03MC45IDAtNzAuOXoiXQogICAgfTsKICAgIGZhR29vZ2xlUGxheSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnb29nbGUtcGxheSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmM2FiIiwgIk0yOTMuNiAyMzQuM0w3Mi45IDEzIDM1My43IDE3NC4yIDI5My42IDIzNC4zek0xNS4zIDBDMi4zIDYuOC02LjQgMTkuMi02LjQgMzUuM2wwIDQ0MS4zYzAgMTYuMSA4LjcgMjguNSAyMS43IDM1LjNMMjcxLjkgMjU1LjkgMTUuMyAwek00NDAuNSAyMjUuNmwtNTguOS0zNC4xLTY1LjcgNjQuNSA2NS43IDY0LjUgNjAuMS0zNC4xYzE4LTE0LjMgMTgtNDYuNS0xLjItNjAuOHpNNzIuOSA0OTlMMzUzLjcgMzM3LjggMjkzLjYgMjc3LjcgNzIuOSA0OTl6Il0KICAgIH07CiAgICBmYUtvcnZ1ZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJrb3J2dWUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjQyZiIsICJNMzg3LjYgMzRsLTMyNyAwQzI3LjkgMzQgMS4xIDYwLjggMS4xIDkzLjVsMCAzMjcuMWMwIDMyLjYgMjYuOCA1OS40IDU5LjUgNTkuNGwzMjcuMSAwYzMzIDAgNTkuNS0yNi44IDU5LjUtNTkuNWwwLTMyN0M0NDcuMSA2MC44IDQyMC4zIDM0IDM4Ny42IDM0ek04OC4yIDEyMC44bDk2IDAgMCAxMTYgNjEuOC0xMTYgMTEwLjkgMC04MS4yIDEzMi0xODcuNSAwIDAtMTMyek0yNTAgMzkyLjlsLTY1LjctMTEzLjYgMCAxMTMuNi05NiAwIDAtMTMwLjggMTkxLjUgMCA4OC42IDEzMC44LTExOC40IDB6Il0KICAgIH07CiAgICBmYVczYyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ3M2MiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTdkZSIsICJNMTA1LjIgMzA1LjNsMzAuOS0xMDQuN2M3LjktMjYuNyA4LjYtNDAuNiAuMi02OC44bC0xMC4xLTMzLjkgNDQuMSAwIDYxIDIwNy40IDQ1LjctMTU1LjVjMTMuMy00NS4zIDIxLjEtNTEuOSA1OS40LTUxLjlsMTMyLjggMGMtMjQuMiA0Mi45LTQ5LjMgODUuMi03My45IDEyNy45IDIuNiAuOCA1LjIgMS44IDcuNyAyLjggMTcuMyA3LjEgMzIuMiAxOS40IDQyIDM1LjUgMTEuMiAxOC41IDE2LjggNDAuMiAxNi44IDY1LjIgMCAzMC44LTguMiA1Ni44LTI0LjYgNzcuOC0xNC41IDE4LjYtMzUgMjkuNS01OC4yIDMxLjIgMCAuMy01LjIgLjQtNS44IC40LTM5LjctLjEtNzAuOC0zMi4xLTgzLjEtNjguN2w0Mi45IDBjMy41IDUuMyA2LjggMTAuNyAxMS4yIDE1LjUgOC4xIDcuMyAxOC41IDEwLjkgMjkuMyAxMS4xIDEzLjEgMCAyMy4zLTkuMSAyOS45LTE5LjggOC4xLTEzLjIgMTIuMi0yOSAxMi4yLTQ3LjUgMC0xMy4xLTEuOC0yNC4zLTUuMy0zMy42LS45LTIuMy0xLjktNC41LTMtNi42LTEuNC0yLjYtMi45LTUuMS00LjctNy40LTEwLjEtMTMuMi0yOS4zLTE5LjctNDcuNS0xOS44bC0yOC4yIDAgNzAuMy0xMjItMzUuNiAwYy00My4xIDAtMzUuOS01LjQtNTAuNCA0My4zbC03NS43IDI1NS4zLTQuMiAwLTYzLjEtMjExLjEtNjMuMSAyMTEuMS00LjIgMC0xMDEtMzQwLjcgNDQuMiAwIDYxIDIwNy40ek00NjcgMzM1LjdjLjMgLjYgMTEuMyAyMC4zIDE4LjMgMzAuMyA3LjEgMTAuMSAxOS44IDIwLjkgMjQuOCAyNC42czE5LjEgMTIuNSAzNC4zIDEzLjljMTUuMiAxLjUgMjMuMyAuMiAzOC43LTYuNiAxNS40LTYuOCAyNy45LTIwLjQgMzQuOS0yOC4xIDYuOS03LjYgMTcuOS0yNy4zIDE4LjItMjcuN2wzLjMgMTYuOGMxLjcgOS0xIDIzLjctNC4xIDMwLTQuMyA4LjYtNy42IDEzLjUtMTQgMjAuMy02LjEgNi41LTE2LjcgMTMuNS0yMS4zIDE2LjQtNC42IDIuOS0yMy4xIDE1LjEtNTAuMSAxMC4zcy00NC43LTI1LjktNTMuOS0zOC4yYy05LjgtMTMuMi0xNi43LTI4LjMtMTktMzMuMi0zLjgtOC40LTkuOS0yOC4yLTEwLjEtMjguOHptMTY5LjctMjE4YzMuMyAyMC4zLS4xIDI4LjctOS4xIDQ2bC0xMi43IDI0LjJjLS4zLS42LTEwLTIwLjctMjUuOS0zMS45LTEzLjYtOS42LTIyLjUtMTEuNy0zNi4zLTguOC0xNy44IDMuNy0zOCAyNS00Ni44IDUxLjItMTAuNSAzMS40LTEwLjcgNDYuNi0xMSA2MC42LS42IDIyLjQgMi45IDM1LjYgMi45IDM1LjZzLTE1LjQtMjguNS0xNS4yLTcwLjFjLjEtMjkuNyA0LjgtNTYuNyAxOC41LTgzLjMgMTIuMS0yMy40IDMwLjEtMzcuNCA0Ni4xLTM5LjEgMTYuNS0xLjcgMjkuNiA2LjMgMzkuNyAxNC45IDEwLjYgOSAyMS4zIDI4LjggMjEuMyAyOC44bDI0LjktNDkuOCAzLjYgMjEuOHoiXQogICAgfTsKICAgIGZhR3JhdiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJncmF2IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyZDYiLCAiTTMwMi42IDIxMC42YzQuNSA0LjUgNC41IDEyLjMgMCAxNi44bC0xMCAxMGMtNC41IDQuOS0xMi4zIDQuOS0xNy4xIDBsLTEwLjgtMTAuOGMtNC41LTQuOS00LjUtMTIuMyAwLTE3LjFsMTAtMTBjNC41LTQuNSAxMi4zLTQuNSAxNy4xIDBsMTAuOCAxMS4xem0tMzEuMi0yMC4zYTcuNyA3LjcgMCAxIDAgLTEwLjYtMTEgNy43IDcuNyAwIDEgMCAxMC42IDExem0tMjYuOCA1LjVhNy41IDcuNSAwIDEgMCAxMC43IDEwLjUgNy41IDcuNSAwIDEgMCAtMTAuNy0xMC41ek0zMTkuNCAxODJjLTIwLjUtMTQuOS0zNC45LTQ0LjYtMTIuMy03MC4zIDIyLjMtMjUuNyA0Mi0xNy44IDYxLjcgLjggMTIuMyAxMS43IDMwLjIgMjUuNyAxNy44IDQ5LjgtMTIuOSAyNC4zLTQ2LjYgMzQuMy02Ny4yIDE5Ljd6bTQ5LjItNDUuOWMtOS4yLTEwLjMtMjQuMSA3LjEtMTYgMTYuNiA3LjYgOS4zIDMzLjEgMi41IDE2LTE2LjZ6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTQ0My43IDQ0YzIuNi0xNi42LTIwLjktMTcuMS0yNi0yNi41LTE0LTI0LjktMjguNi0zOC01Ni4zLTMxLjQgMTItOC4zIDI0LjMtNi4zIDI0LjMtNi4zIC4zLTYuNiAwLTEzLjQtOS43LTI1LjcgNC0xMi45IC4zLTIzLjEgLjMtMjMuMSAxNi04LjkgMjcuNy0yNS4yIDMwLTQ0LjYgMy43LTMyLTE5LjQtNjEuMS01MS40LTY0LjgtMjIuOC0yLjYtNDUuMSA3LjktNTYuMSAyNi41LTIzLjkgNDEuNCAxLjQgNzMuMiAyMy4xIDg0LTE0LjktMS40LTM1LjQtMTIuMy00MS40LTM1LjQtNi44LTI2LjUgMi45LTUxLjQgOS4yLTYzLjQgMCAwLTQuNS02LTguMy05LjIgMCAwLTE0LjIgMC0yNS40IDUuNSAxMi4zLTE1LjcgMjYtMTQuOSAyNi0xNC45IDAtNi42LS42LTE1LjQtMy43LTIyLjMtNS42LTExLjQtMjQuNi0xMy4zLTMyLjcgMi45IC4xLS4yIC4zLS40IC40LS41LTUuMiAxMi4zLTEuMSA1Ny43IDE3LjQgOTAtMi42IDEuNC05LjQgNi4zLTEzLjQgMTAuMy0yMi4zIDEwLTU4IDYyLjItNTggNjIuMi0yOS4xIDExLjEtNzkuNyA1Mi41LTcyLjkgODIuMyAuMyAzLjEgMS40IDUuNyAzLjEgNy43LTIuOSAyLjMtNS43IDUuMi04LjYgOC42LTEyLjMgMTQuMi01LjUgMzYuMyAxOC4zIDI1LjIgMTYuMy03LjQgMzAuNi0yMC45IDM3LjUtMzEuNCAwIDAtNS43LTUuMi0xNi44LTQuNSAyOC42LTYuOCAzNS40LTkuNyA0Ny43LTkuNCA4LjMgNCA4LjMtMzUuNCA4LjMtMzUuNCAwLTE1LjItMi4zLTMyLTExLjUtNDIuOCAxMi45IDEyLjYgMzAgMzMuOCAyOC45IDYyLjYtLjggMTguOS0xNS43IDIzLjctMTUuNyAyMy43LTkuNCAxNy4xLTQ0LjYgNjgtMzEuNCAxMDkuNCAwIDAtMTAtMTUuNC0xMC41LTIyLjgtMTggMjAtNDggNTQtMjUuNCA2Ni42IDI3LjUgMTUuMiAxMTIuMy05MS41IDEzMC4zLTE0Ni45IDM1LjctMjEuNSA1Ny4yLTQ4LjggNjYtNjcuMSAyMi43IDQ0LjkgOTguNCA5Ny41IDEwNC40IDYwLjl6Il0KICAgIH07CiAgICBmYUF3cyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhd3MiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjM3NSIsICJNMTgwLjQgMjAzYy0uNyAyMi42IDEwLjYgMzIuNyAxMC45IDM5LS4xIDEuMy0uNiAyLjUtMS4zIDMuNnMtMS43IDItMi44IDIuNmwtMTIuOCA5Yy0xLjcgMS4yLTMuNiAxLjgtNS42IDEuOS0uNCAwLTguMiAxLjgtMjAuNS0yNS42LTcuNSA5LjQtMTcgMTYuOS0yNy45IDIycy0yMi43IDcuNy0zNC43IDcuNWMtMTYuMyAuOS02MC40LTkuMi01OC4xLTU2LjItMS42LTM4LjMgMzQuMS02Mi4xIDcwLjktNjAgNy4xIDAgMjEuNiAuNCA0NyA2LjNsMC0xNS42YzIuNy0yNi41LTE0LjctNDctNDQuOC00My45LTIuNCAwLTE5LjQtLjUtNDUuOCAxMC4xLTcuNCAzLjQtOC4zIDIuOC0xMC44IDIuOC03LjQgMC00LjQtMjEuNS0yLjktMjQuMiA1LjItNi40IDM1LjktMTguNCA2NS45LTE4LjIgMjAuMS0xLjggNDAuMSA0LjQgNTUuNyAxNy4zIDYuMyA3LjEgMTEuMiAxNS40IDE0LjIgMjQuNHM0LjIgMTguNSAzLjUgMjhsMCA2OS4zek05NCAyMzUuNGMzMi40LS41IDQ2LjItMjAgNDkuMy0zMC41IDIuNS0xMC4xIDIuMS0xNi40IDIuMS0yNy40LTkuNy0yLjMtMjMuNi00LjktMzkuNi00LjktMTUuMi0xLjEtNDIuOCA1LjYtNDEuNyAzMi4zLTEuMiAxNi44IDExLjEgMzEuNCAzMCAzMC41em0xNzAuOSAyMy4xYy03LjkgLjctMTEuNS00LjktMTIuNy0xMC40TDIwMi40IDgzLjRjLTEtMi44LTEuNi01LjYtMS45LTguNi0uMi0xLjIgLjEtMi40IC44LTMuNHMxLjgtMS42IDMtMS44Yy4yIDAtMi4xIDAgMjIuMiAwIDguOC0uOSAxMS42IDYgMTIuNiAxMC40TDI3NC45IDIyMC44IDMwOC4xIDgwYy41LTMuMiAyLjktMTEuMSAxMi44LTEwLjJsMTcuMiAwYzIuMi0uMiAxMS4xLS41IDEyLjcgMTAuNEwzODQuMSAyMjIuNyA0MjEgODAuMWMuNS0yLjIgMi43LTExLjQgMTIuNy0xMC40bDE5LjcgMGMuOS0uMSA2LjItLjggNS4zIDguNi0uNCAxLjggMy40LTEwLjctNTIuOCAxNjkuOS0xLjEgNS41LTQuOCAxMS4xLTEyLjcgMTAuNGwtMTguNyAwYy0xMC45IDEuMi0xMi41LTkuNy0xMi43LTEwLjdsLTMzLjItMTM3LjEtMzIuOCAxMzdjLS4yIDEuMS0xLjcgMTEuOS0xMi43IDEwLjdsLTE4LjMgMCAwIDB6bTI3My41IDUuNmMtNS45IDAtMzMuOS0uMy01Ny40LTEyLjMtMi4zLTEtNC4zLTIuNi01LjctNC44cy0yLjEtNC42LTIuMS03LjFsMC0xMC43YzAtOC41IDYuMi02LjkgOC44LTUuOSAxMCA0LjEgMTYuNSA3LjEgMjguOCA5LjYgMzYuNyA3LjUgNTIuOC0yLjMgNTYuNy00LjUgMTMuMi03LjggMTQuMi0yNS43IDUuMy0zNC45LTEwLjUtOC44LTE1LjUtOS4xLTUzLjEtMjEtNC42LTEuMy00My43LTEzLjYtNDMuOC01Mi40LS42LTI4LjIgMjUtNTYuMiA2OS41LTU2IDEyLjcgMCA0Ni40IDQuMSA1NS42IDE1LjYgMS40IDIuMSAyIDQuNiAxLjkgN2wwIDEwLjFjMCA0LjQtMS42IDYuNy00LjkgNi43LTcuNy0uOS0yMS40LTExLjItNDkuMi0xMC44LTYuOS0uNC0zOS45IC45LTM4LjQgMjUtLjQgMTkgMjYuNiAyNi4xIDI5LjcgMjYuOSAzNi41IDExIDQ4LjYgMTIuOCA2My4xIDI5LjYgMTcuMSAyMi4yIDcuOSA0OC4zIDQuMyA1NS40LTE5LjEgMzcuNS02OC40IDM0LjQtNjkuMyAzNC40em00MC4yIDEwNC45Yy03MCA1MS43LTE3MS43IDc5LjItMjU4LjUgNzkuMi0xMTcuMSAuOC0yMzAuMy00Mi4zLTMxNy4zLTEyMC43LTYuNS01LjktLjgtMTQgNy4yLTkuNSA5Ni41IDU1LjIgMjA1LjcgODQuMiAzMTYuOSA4NC4xIDgzLS40IDE2NS4xLTE3LjMgMjQxLjYtNDkuNSAxMS44LTUgMjEuOCA3LjggMTAuMSAxNi40em0yOS4yLTMzLjNjLTktMTEuNS01OS4zLTUuNC04MS44LTIuNy02LjggLjgtNy45LTUuMS0xLjgtOS41IDQwLjEtMjguMiAxMDUuOS0yMC4xIDExMy40LTEwLjYgNy41IDkuNS0yLjEgNzUuNC0zOS42IDEwNi45LTUuOCA0LjktMTEuMyAyLjMtOC43LTQuMSA4LjQtMjEuMyAyNy40LTY4LjUgMTguNC04MHoiXQogICAgfTsKICAgIGZhR2xpZGVHID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdsaWRlLWciLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjJhNiIsICJNNDA3LjEgMjExLjJjLTMuNS0xLjQtMTEuNi0zLjgtMTUuNC0zLjgtMzcuMSAwLTYyLjIgMTYuOC05My41IDM0LjVsLS45LS45YzctNDcuMyAyMy41LTkxLjkgMjMuNS0xNDAuNCAwLTcxLjUtMzguMi0xMDAuNi0xMDguNC0xMDAuNi0xMTUuMSAwLTE3My40IDExMy43LTE3My40IDE5OC40IDAgODcuOSA1MS4zIDEzNi42IDEzOC42IDEzNi42IDEyIDAgMTEtMSAxMSAzLjgtMTYuOSAxMjguOS05MC44IDEzMy4xLTkwLjggOTQuNiAwLTM5LjIgNDUtNTguNiA0NS41LTYxLS4zLTEyLjItNDctMjcuNi01OC45LTI3LjYtMzMuOSAuMS01Mi40IDUxLjItNTIuNCA3OS4zIDAgNTEuOSAzMi44IDg3LjkgODUuNSA4Ny45IDc3LjQgMCAxMzQtNzcuOCAxNTEuNC0xNDUuNCAxNS4xLTYwLjUgMTEuMi02My4zIDE5LjctNjcuNiAzMi4yLTE2LjIgNTcuNS0yNyA5My44LTI3IDE3LjggMCAzMC41IDMuNyA1OC45IDguNCAyLjkgMCA2LjctMi45IDYuNy01LjggMC04LTMzLjQtNjAuNS00MC45LTYzLjR6TTIzMS44IDEyNi44Yy05LjMgNDQuNy0xOC42IDg5LjYtMjcuOCAxMzQuMy0yLjMgMTAuMi0xMy4zIDcuOC0yMiA3LjgtMzguMyAwLTQ5LTQxLjgtNDktNzMuMSAwLTQ3IDE4LTEwOS4zIDYxLjgtMTMzLjQgNy00LjEgMTQuOC02LjcgMjIuNi02LjcgMTguNiAwIDIwIDEzLjMgMjAgMjguNy0uMSAxNC4zLTIuNyAyOC41LTUuNiA0Mi40eiJdCiAgICB9OwogICAgZmFKc2ZpZGRsZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJqc2ZpZGRsZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMWNjIiwgIk01MTEuMSAyMzcuNWMtNC43LTIuNi01LjctNS43LTYuNC0xMC44LTIuNC0xNi41LTMuNS0zMy42LTkuMS00OS4xLTM1LjktMTAwLTE1NC0xNDMuNC0yNDYuOC05MS42LTI3LjQgMTUuMi00OSAzNi40LTY1LjUgNjMuOS0zLjItMS41LTUuNS0yLjctNy44LTMuNy0zMC4xLTEyLjQtNTktMTAuMS04NS4zIDkuMi0yNS41IDE4LjctMzYuNCA0NC41LTMyLjcgNzYuNCAuNCAzLTIgNy42LTQuNSA5LjUtMzkuNyAzMC01NiA3OC4xLTQxLjkgMTI0LjYgMTMuOCA0NS42IDU3LjUgNzkuOCAxMDUuNiA4MS40IDMwLjMgMSA2MC42IC41IDkxIC41IDg0IDAgMTY4LjEgLjUgMjUyLjEtLjUgNTIuNy0uNiA5Ni4xLTM2LjkgMTA4LjItODcuMyAxMS41LTQ4LjEtMTEuMS05Ny4zLTU2LjgtMTIyLjZ6bTIxLjEgMTU2LjljLTE4LjIgMjIuNC00Mi4zIDM1LjMtNzEuMyAzNS43LTU2LjkgLjgtMTEzLjggLjItMTcwLjcgLjIgMCAuNy0xNjMgLjItMTYzLjcgLjItNDMuOS0uMy03Ni43LTE5LjgtOTUuMi02MC0xOC45LTQxLjItNC05MC44IDM0LjItMTE2LjEgOS4yLTYuMSAxMi41LTExLjYgMTAuMS0yMy4xLTUuNS0yNi40IDQuNS00OCAyNi40LTYzIDIzLTE1LjcgNDcuNC0xNi4xIDcyLTMuMSAxMC4zIDUuNCAxNC42IDExLjYgMjIuMi0yLjUgMTQuMi0yNi40IDM0LjYtNDYuNyA2MC43LTYxLjMgOTcuNS01NC40IDIyOC40IDcuNiAyMzAuMiAxMzIuNyAuMSA4LjIgMi40IDEyLjQgOS44IDE1LjkgNTcuNiAyNi44IDc0LjUgOTYuMSAzNS4xIDE0NC41em0tODcuOC04MC41Yy01LjggMzEuMi0zNC42IDU1LjEtNjYuNyA1NS4xLTE3IDAtMzIuMS02LjUtNDQuMS0xNy43LTI3LjctMjUuNy03MS4xLTc1LTk1LjktOTMuNC0yMC4xLTE0LjktNDItMTIuMy02MC4zIDMuOC01MCA0NC4xIDE1LjkgMTIxLjggNjcuMSA3Ny4yIDQuNS00IDcuOC05LjUgMTIuNy0xMi44IDguMi01LjUgMjAuOC0uOSAxMy4yIDEwLjYtMTcuNCAyNi4zLTQ5LjMgMzguMi03OC45IDI5LjMtMjguOS04LjctNDguOC0zNi00OC42LTcwLjIgMS4yLTIyLjUgMTIuNC00My4xIDM1LjQtNTYgMjIuNi0xMi42IDQ2LjQtMTMuMSA2NyAyLjUgNTAuOCAzOC41IDc1LjYgODEuNyAxMDcuMyAxMDEuMiAyNC42IDE1LjEgNTQuMyA3LjQgNjguOC0xNy41IDI4LjgtNDkuMi0zNC42LTEwNS03OC45LTYzLjUtNCAzLjctNi45IDguOS0xMS40IDExLjctMTEgNi44LTE3LjMtNC4xLTEyLjgtMTAuNCAyMC43LTI4LjYgNTAuNS00MC40IDgzLjMtMjguMiAzMS40IDExLjcgNDkuMSA0NC40IDQyLjggNzguMnoiXQogICAgfTsKICAgIGZhS2V5YmFzZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJrZXliYXNlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY0ZjUiLCAiTTI4Ni4yIDQxOWExOCAxOCAwIDEgMCAwIDM2IDE4IDE4IDAgMSAwIDAtMzZ6TTM5OC4xIDI3MS40Yy05LjUtMTQuNi0zOS40LTUyLjQtODcuMy03My43LTYuMS0yLjctMTIuMi01LjEtMTguNC03LjMgNC4xLTkuOSA2LTIwLjYgNS44LTMxLjRzLTIuNy0yMS4zLTcuMi0zMS4xLTEwLjktMTguNS0xOC45LTI1LjctMTcuNC0xMi42LTI3LjYtMTZjLTEyLjQtNC4xLTIzLjMtNi0zMi40LTUuOC0uNi0yLTEuOS0xMSA5LjQtMzVsLTIyLjktMTMuNS01LjUgNy42Yy04LjcgMTIuMS0xNi45IDIzLjYtMjQuMyAzNC45LTIuNy0uNi01LjUtMS4xLTguMy0xLjItNDEuNS0yLjQtMzktMi4zLTQxLjEtMi4zLTUwLjYgMC01MC44IDUyLjEtNTAuOCA0NS45bC0yLjQgMzYuN2MtMS42IDI3IDE5LjggNTAuMiA0Ny42IDUxLjhsOC45IC41QzEwNiAyMTUuNSA5MC40IDIyNy41IDc2LjYgMjQxLjQgMTQgMzA0LjcgMTQgMzc0IDE0IDQyOS44bDAgMzMuNiAyMy4zLTI5LjhjMy4xIDEzLjEgOCAyNS44IDE0LjYgMzcuNiA1LjggMTAuMSAxNC45IDkuNCAxOS42IDcuMyA0LjItMS45IDEwLTYuOSAzLjgtMjAuMS04LTE2LjgtMTMuMy0zNC43LTE1LjgtNTMuMWw0Ni44LTU5LjgtMjQuNyA3NC4xYzU4LjItNDIuNCAxNTcuNC02MS44IDIzNi4yLTM4LjYgMzQuMiAxMC4xIDY3LjQgLjcgODQuNy0yMy44IC43LTEgMS4yLTIuMiAxLjgtMy4yIDEuOCA5LjQgMi43IDE4LjkgMi44IDI4LjQgMCAyMy4zLTMuNyA1Mi45LTE0LjkgODEuNi0yLjUgNi41IDEuOCAxNC41IDguNiAxNS43IDcuNCAxLjYgMTUuMy0zLjEgMTguNC0xMS4xIDkuNi0yNS41IDE0LjYtNTQuNiAxNC42LTg2LjIgMC0zOC42LTEzLTc3LjUtMzUuOS0xMTAuOXpNMTQyLjQgMTI4LjZsLTE1LjctLjktMS40IDIxLjggMTMuMSAuOGMtLjYgNi41LS41IDEzLjEgLjMgMTkuNmwtMjIuNC0xLjNjLTEuNi0uMS0zLjItLjUtNC43LTEuMXMtMi44LTEuNi0zLjktMi44LTEuOS0yLjYtMi41LTQuMS0uOC0zLjEtLjctNC43TDEwNyAxMTljMS0xMi4yIDEzLjktMTEuMyAxMy4zLTExLjNsMjkuMSAxLjdjLTIuOCA2LjItNS4xIDEyLjYtNyAxOS4yek0yOTAuOCAzMDAuOGMtMi4xIDEuNi00LjggMi40LTcuNSAyLjJzLTUuMS0xLjUtNi45LTMuNWwtOS43LTExLjUtMzQuNCAyN2MtMS42IDEuMy0zLjcgMS45LTUuOCAxLjdzLTQtMS4yLTUuMy0yLjhsLTE1LjgtMTguNmMtMS4yLTEuNi0xLjctMy41LTEuNS01LjRzMS4zLTMuNyAyLjgtNC45bDM0LjYtMjcuMi0xNC4xLTE2LjctMTcuMSAxMy41Yy0xLjYgMS4yLTMuNSAxLjgtNS41IDEuNnMtMy44LTEuMS01LjEtMi42YzAgMC0zLjctNC40LTMuOC00LjUtMS4yLTEuNi0xLjctMy41LTEuNS01LjVzMS4zLTMuNyAyLjgtNC45TDIxNCAyMjUuMnMtMTguNS0yMi0xOC42LTIyLjFjLS44LTEtMS4zLTIuMS0xLjctMy4zcy0uNC0yLjUtLjMtMy43IC42LTIuNCAxLjItMy41IDEuNS0yIDIuNS0yLjhjMi4xLTEuNyA0LjgtMi40IDcuNC0yLjJzNS4xIDEuNSA2LjkgMy42bDgxLjEgOTYuM2MuOCAxIDEuMyAyLjEgMS43IDMuM3MuNCAyLjUgLjMgMy43LS42IDIuNS0xLjIgMy41LTEuNSAyLjEtMi41IDIuOHpNMTg3LjQgNDE5YTE4IDE4IDAgMSAwIDAgMzYgMTggMTggMCAxIDAgMC0zNnoiXQogICAgfTsKICAgIGZhTHVtb25Ecm9wID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImx1bW9uLWRyb3AiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTdlMyIsICJNNDgwIDMyYzUzIDAgOTYgNDMgOTYgOTZsMCAyMjRjMCA1My00MyA5Ni05NiA5Nkw5NiA0NDhjLTUzIDAtOTYtNDMtOTYtOTZMMCAxMjhDMCA3NSA0MyAzMiA5NiAzMmwzODQgMHpNMzAyLjQgMTE0LjdjLTkuOC0xNi40LTIwLjUtMTYuNC0yOS42IDBsLTY4LjkgMTE0Yy0xMC43IDE1LjYtMTYuNCAzMi44LTE2LjQgNTIuNSAwIDUwLjkgNDQuMyA5NC4zIDEwMC4xIDk0LjMgNTUgMCAxMDAuOS00My41IDEwMC45LTk0LjMgMC0xOS43LTYuNi0zNy44LTE3LjItNTIuNWwtNjguOS0xMTR6Il0KICAgIH07CiAgICBmYVdlZWJseSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ3ZWVibHkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjVjYyIsICJNNDI1LjEgNjUuOGMtMzkuOSAwLTczLjMgMjUuNy04My43IDY0LjMtMTguMi01OC4xLTY1LjUtNjQuMy04NS02NC4zLTE5LjggMC02Ni44IDYuMy04NS4zIDY0LjMtMTAuNC0zOC42LTQzLjQtNjQuMy04My43LTY0LjMtNDkgMC04Ny41IDMzLjktODcuNSA3Ny4yIDAgMjkgNC4yIDMzLjMgNzcuMiAyMzMuNSAyMi40IDYwLjYgNjcuOCA2OS40IDkyLjcgNjkuNCAzOS4yIDAgNzAtMTkuNSA4NS45LTU0IDE1LjkgMzQuOCA0Ni43IDU0LjMgODUuOSA1NC4zIDI1IDAgNzAuNC05LjEgOTIuNy02OS43IDc2LjYtMjA4LjYgNzcuNS0yMDUuNiA3Ny41LTIyNy4yIC42LTQ4LjMtMzYtODMuNS04Ni45LTgzLjV6bTI2LjMgMTE0LjhMMzg1LjkgMzU3LjFjLTcuOSAyMS41LTIxLjIgMzcuMi00Ni4yIDM3LjItMjMuNCAwLTM3LjQtMTIuNC00NC0zMy45bC0zOS4zLTExNy40LTEgMC0zOS4zIDExNy40Yy03IDIxLjUtMjAuOSAzMy42LTQ0IDMzLjYtMjUgMC0zOC4zLTE1LjctNDYuMi0zNy4yTDYwLjkgMTgxLjZjLTUuNC0xNC44LTcuOS0yMy45LTcuOS0zNC41IDAtMTYuMyAxNS44LTI5LjQgMzguMy0yOS40IDE4LjcgMCAzMiAxMS44IDM2LjEgMjkuMWw0NCAxMzkuOCAxIDAgNDQuNy0xMzYuOGM2LTE5LjcgMTYuNS0zMi4xIDM5LTMyLjFzMzIuOSAxMi4xIDM5IDMyLjFsNDQuNyAxMzYuOCAxIDAgNDQtMTM5LjhjNC4xLTE3LjIgMTcuNC0yOS4xIDM2LjEtMjkuMSAyMi4yIDAgMzguMyAxMy4zIDM4LjMgMzUuNy0uMyA3LjktNC4xIDE2LTcuNiAyNy4yeiJdCiAgICB9OwogICAgZmFEb2NrZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZG9ja2VyIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYzOTUiLCAiTTM0OS45IDIzNi4zbC02Ni4xIDAgMC01OS40IDY2LjEgMCAwIDU5LjR6bTAtMjA0LjNsLTY2LjEgMCAwIDYwLjcgNjYuMSAwIDAtNjAuN3ptNzguMiAxNDQuOGwtNjYuMSAwIDAgNTkuNCA2Ni4xIDAgMC01OS40ek0yNzEuOCAxMDQuN2wtNjYuMSAwIDAgNjAuMSA2Ni4xIDAgMC02MC4xem03OC4xIDBsLTY2LjEgMCAwIDYwLjEgNjYuMSAwIDAtNjAuMXptMjc2LjggMTAwYy0xNC40LTkuNy00Ny42LTEzLjItNzMuMS04LjQtMy4zLTI0LTE2LjctNDQuOS00MS4xLTYzLjdsLTE0LTkuMy05LjMgMTRjLTE4LjQgMjcuOC0yMy40IDczLjYtMy43IDEwMy44LTguNyA0LjctMjUuOCAxMS4xLTQ4LjQgMTAuN2wtNDM0LjcgMGMtOC43IDUwLjggNS44IDExNi44IDQ0IDE2Mi4xIDM3LjEgNDMuOSA5Mi43IDY2LjIgMTY1LjQgNjYuMiAxNTcuNCAwIDI3My45LTcyLjUgMzI4LjQtMjA0LjIgMjEuNCAuNCA2Ny42IC4xIDkxLjMtNDUuMiAxLjUtMi41IDYuNi0xMy4yIDguNS0xNy4xbC0xMy4zLTguOXpNMTE1LjYgMTc2LjhsLTY2IDAgMCA1OS40IDY2LjEgMCAwLTU5LjQtLjEgMHptNzguMSAwbC02Ni4xIDAgMCA1OS40IDY2LjEgMCAwLTU5LjR6bTc4LjEgMGwtNjYuMSAwIDAgNTkuNCA2Ni4xIDAgMC01OS40em0tNzguMS03Mi4xbC02Ni4xIDAgMCA2MC4xIDY2LjEgMCAwLTYwLjF6Il0KICAgIH07CiAgICBmYU1hZ2VudG8gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibWFnZW50byIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmM2M0IiwgIk00NDUuOSAxMjcuOWwwIDI1Ni4xLTYzLjQgMzYuNSAwLTI1NS44LTE1OC41LTkxLjYtMTU4LjYgOTEuNiAuNCAyNTUuOS02My4zLTM2LjYgMC0yNTUuOSAyMjEuOS0xMjguMSAyMjEuNSAxMjcuOXpNMjU1LjggNDIwLjVsLTMxLjYgMTguNC0zMS44LTE4LjIgMC0yNTYtNjMuMyAzNi42IC4xIDI1NS45IDk0LjkgNTQuOSA5NS4xLTU0LjkgMC0yNTYtNjMuNC0zNi42IDAgMjU1Ljl6Il0KICAgIH07CiAgICBmYUdpdEFsdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnaXQtYWx0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY4NDEiLCAiTTQzOS42IDIzNi4xTDI0NCA0MC41QzIzOC42IDM1IDIzMS4yIDMyIDIyMy42IDMycy0xNSAzLTIwLjQgOC40bC00MC43IDQwLjYgNTEuNSA1MS41YzI3LjEtOS4xIDUyLjcgMTYuOCA0My40IDQzLjdsNDkuNyA0OS43YzM0LjItMTEuOCA2MS4yIDMxIDM1LjUgNTYuNy0yNi41IDI2LjUtNzAuMi0yLjktNTYtMzcuM2wtNDYuMy00Ni4zIDAgMTIxLjljMjUuMyAxMi41IDIyLjMgNDEuOCA5LjEgNTUtNi40IDYuNC0xNS4yIDEwLjEtMjQuMyAxMC4xcy0xNy44LTMuNi0yNC4zLTEwLjFjLTE3LjYtMTcuNi0xMS4xLTQ2LjkgMTEuMi01NmwwLTEyM2MtMjAuOC04LjUtMjQuNi0zMC43LTE4LjYtNDVMMTQyLjYgMTAxIDguNSAyMzUuMUMzIDI0MC42IDAgMjQ3LjkgMCAyNTUuNXMzIDE1IDguNSAyMC40TDIwNC4xIDQ3MS42YzUuNCA1LjQgMTIuNyA4LjQgMjAuNCA4LjRzMTUtMyAyMC40LTguNEw0MzkuNiAyNzYuOWM1LjQtNS40IDguNC0xMi44IDguNC0yMC40cy0zLTE1LTguNC0yMC40eiJdCiAgICB9OwogICAgZmFGaXJlZm94QnJvd3NlciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmaXJlZm94LWJyb3dzZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTAwNyIsICJNMTMwLjIgMTI3LjVsMCAwem0zNTEuNCA0NS40Yy0xMC42LTI1LjUtMzIuMS01My00OC45LTYxLjcgMTMuNyAyNi45IDIxLjcgNTMuOSAyNC43IDc0IDAgLjEgMCAuMyAuMSAuNC0yNy42LTY4LjgtNzQuNC05Ni41LTExMi42LTE1Ni44LTE1LTIzLjctMTAuOS0yNS4yLTEzLjEtMjQuN2wtLjEgLjFjLTQ2LjcgMjYtNzUuMyA3OC40LTgyLjYgMTIyLjctMTYuNiAuOS0zMi45IDUtNDcuOSAxMi4xLTEuNCAuNi0yLjUgMS43LTMuMSAzcy0uOSAyLjgtLjYgNC4zYy4yIC44IC42IDEuNiAxLjEgMi4zczEuMiAxLjMgMS45IDEuNyAxLjYgLjcgMi40IC44IDEuNyAwIDIuNS0uM2wuNS0uMmMxNS41LTcuMyAzMi40LTExLjIgNDkuNS0xMS4zIDYyLjgtLjYgOTcuMiA0NCAxMDcuNiA2Mi4zLTEzLTkuMi0zNi40LTE4LjItNTguOC0xNC4zIDg3LjcgNDMuOSA2NC4yIDE5NC41LTU3LjQgMTg5LjItNTkuNS0yLjYtOTcuMS01MS0xMDAuNS05MC44IDAgMCAxMS4yLTQxLjkgODAuNi00MS45IDcuNSAwIDI4LjktMjAuOSAyOS4zLTI3LS4xLTItNDIuNS0xOC45LTU5LjEtMzUuMi04LjgtOC43LTEzLjEtMTIuOS0xNi44LTE2LjEtMi0xLjctNC4xLTMuMy02LjMtNC44LTUuNi0xOS41LTUuOC00MC0uNy01OS42LTI1LjEgMTEuNC00NC42IDI5LjQtNTguNyA0NS40bC0uMSAwYy05LjctMTIuMi05LTUyLjYtOC40LTYxLjEtLjEtLjUtNy4yIDMuNy04LjIgNC4zLTguNiA2LjEtMTYuNSAxMi45LTIzLjggMjAuNC0xNi4zIDE2LjYtNDQuMSA1MC4yLTU1LjUgMTAxLjItNC41IDIwLjQtNi44IDQ0LjQtNi44IDUyLjMgMCAxMzQuNyAxMDkuMiAyNDMuOSAyNDMuOSAyNDMuOSAxMjAuNiAwIDIyMy04Ny4yIDI0MC40LTIwMi42IDExLjYtNzYuNy0xNC43LTEzMS4xLTE0LjctMTMyeiJdCiAgICB9OwogICAgZmFDbG91ZHNtaXRoID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNsb3Vkc21pdGgiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjM4NCIsICJNNTEyIDIyNy42TDUxMiAyODQuNSAyODQuNCA1MTIgMjI3LjYgNTEyIDAgMjg0LjQgMCAyMjcuNiAyMjcuNiAwIDI4NC41IDAgNTEyIDIyNy42em0tMjU2IDE2MmMxNy44IC41IDM1LjYtMi42IDUyLjItOS4xczMxLjgtMTYuMiA0NC42LTI4LjcgMjMtMjcuMyAyOS45LTQzLjggMTAuNS0zNC4xIDEwLjUtNTItMy42LTM1LjUtMTAuNS01Mi0xNy4xLTMxLjMtMjkuOS00My44LTI4LTIyLjItNDQuNi0yOC43LTM0LjQtOS42LTUyLjItOS4xYy0xNy44LS41LTM1LjYgMi42LTUyLjIgOS4xcy0zMS44IDE2LjMtNDQuNiAyOC43LTIzIDI3LjMtMjkuOSA0My44LTEwLjUgMzQuMS0xMC41IDUyIDMuNiAzNS41IDEwLjUgNTIgMTcuMSAzMS4zIDI5LjkgNDMuOCAyOCAyMi4yIDQ0LjYgMjguNyAzNC40IDkuNiA1Mi4yIDkuMXoiXQogICAgfTsKICAgIGZhV2l6YXJkc09mVGhlQ29hc3QgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAid2l6YXJkcy1vZi10aGUtY29hc3QiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjczMCIsICJNMjE5LjIgMzQ1LjdjLTEuOSAxLjQtMTEuMSA4LjQtLjMgMjMuNiA0LjYgNi40IDE0LjEgMTIuOCAyMS43IDYuNiA2LjUtNC45IDcuNC0xMi45IC4zLTIzLTUuNS03LjgtMTQuMy0xMi45LTIxLjctNy4xem0zMzYuOCA3NS45Yy0uMyAxLjctLjYgMS43IC44IDAgMi4xLTQuMiA0LjItMTAuMiA1LTE5LjkgMy4xLTM4LjUtNDAuMy03MS41LTEwMS4zLTc4LTU0LjctNi0xMjQuNCA5LjItMTg4LjggNjAuNWwtLjMgMS42YzIuNiA1IDUgMTAuNyAzLjQgMjEuMmwuOCAuM2M2My45LTU4LjQgMTMxLjItNzcuMiAxODQuNC03My44IDU4LjQgMy43IDEwMCAzNCAxMDAgNjguMSAwIDEwLTIuNiAxNS43LTMuOSAyMC4yek0zOTIuMyAyNDAuNGMuOCA3LjEgNC4yIDEwLjIgOS4yIDEwLjUgNS41IC4zIDkuNC0yLjYgMTAuNS02LjYgLjgtMy40IDIuMS0yOS44IDIuMS0yOS44UzQwMi44IDIyMSAzOTkuMSAyMjVjLTMuNyAzLjctNy4zIDguNC02LjggMTUuNXptLTUwLTE1MS4xYy0yMDQuNSAwLTMyOS4yIDEzNy41LTM0MS41IDE1MS45LTEgLjUtMS4zIC44IC44IDEuMyA2MC41IDE2LjUgMTU1LjggODEuMiAxOTYuMSAyMDIuMmwxIC4zYzU1LjItNjkuOSAxNDAuOS0xMjguMSAyMzctMTI4LjEgODAuOSAwIDEzMC4yIDQyLjIgMTMwLjIgODAuNCAwIDE4LjMtNi42IDMzLjUtMjIuMyA0Ni4zIDAgMS0uMiAuOCAuOCAuOCAxNC43LTEwLjcgMjcuNS0yOC44IDI3LjUtNDguMiAwLTIyLjgtMTIuMS0zOC4yLTEyLjEtMzguMiA3LjEgNy4xIDEwLjcgMTYuMiAxMC43IDE2LjIgNS44LTQwLjkgMjctNjIuMyAyNy02Mi4zLTIuNC05LjctNi44LTE3LjgtNi44LTE3LjggNy42IDguMSAxNC40IDI3LjUgMTQuNCA0MS40IDAgMTAuNS0zLjQgMjIuOC0xMi42IDMxLjlsLjMgLjVjOC4xLTUgMTYuNS0xNi44IDE2LjUtMzggMC0xNS43LTQuNy0yNS45LTQuNy0yNS45IDUuOC01LjIgMTEuMy05LjIgMTYtMTEuOCAuOCAzLjQgMi4xIDkuNyAyLjQgMTQuOSAwIDEgLjggMS44IDEgMCAuOC01LjgtLjMtMTYuMi0uMy0xNi41IDYtMy4xIDkuNy00LjUgOS43LTQuNS0xNS43LTExMC4zLTE0NC0xOTYuOS0yOTEuMi0xOTYuOXpNMjQzIDM3OC45Yy0xMS4xIDktMjQuMiA0LjEtMzAuNi00LjItNy40LTkuNi02LjgtMjQuMSA0LjItMzIuNSAxNC44LTExLjQgMjcuMS0uNSAzMS4yIDUuNSAuMyAuNCAxMi4xIDE2LjYtNC43IDMxLjJ6bTIuMS0xMzYuNGw5LjQtMTcuOCAxMS44IDcxLTEyLjYgNi0yNC42LTI4LjggMTQuMS0yNi43IDMuNyA0LjQtMS44LTguMXptMTguNiAxMTcuNmwtLjMtLjNjMi00LjEtMi41LTYuNi0xNy41LTMxLjctMS4zLTIuNC0zLjEtMi45LTQuNC0yLjZsLS4zLS41YzcuOS01LjggMTUuNC0xMC4yIDI1LjQtMTUuN2wuNSAuM2MxLjMgMS44IDIuMSAyLjkgMy40IDQuN2wtLjMgLjVjLTEtLjMtMi40LS44LTUuMiAuMy0yLjEgLjgtNy45IDMuNy0xMi4zIDcuNmwwIDEuM2MxLjYgMi40IDMuOSA2LjYgNS44IDkuN2wuMyAwYzEwLTYuMyA3LjYtNC41IDExLjUtNy45bC4zIDBjLjUgMS44IC41IDEuOCAxLjggNS41bC0uMyAuM2MtMy4xIC42LTQuNyAuMy0xMS41IDUuNWwwIC4zYzkuNSAxNyAxMSAxNi44IDEyLjYgMTZsLjMgLjNjLTIuMyAxLjYtNi4zIDQuMi05LjcgNi42ek0zMTkgMzI3LjZjLTMuMSAxLjYtNiAyLjktMTAgNWwtLjMtLjNjMS4zLTIuNiAxLjItMi43LTExLjgtMzIuNWwtLjMtLjNjLS4yIDAtOC45IDMuNy0xMCA3LjNsLS41IDAtMS01LjggLjMtLjVjNy4zLTQuNiAyNS41LTExLjYgMjcuOC0xMi42bC41IC4zIDMuMSA1LS4zIC41Yy0zLjUtMS44LTcuNCAuOC0xMi4zIDIuNmwwIC4zYzEyLjMgMzIgMTIuNyAzMC42IDE0LjcgMzAuNmwwIC4yem00NC44LTE2LjVjLTQuMiAxLTUuMiAxLjMtOS43IDIuOWwtLjMtLjMgLjUtNC41Yy0xLTMuNC0zLjEtMTEuNS0zLjctMTMuNmwtLjMtLjNjLTMuNCAuOC04LjkgMi42LTEyLjggMy45bC0uMyAuM2MuOCAyLjYgMy4xIDkuOSA0LjIgMTMuOSAuOCAyLjQgMS44IDIuOSAyLjkgMy4xbDAgLjVjLTMuNyAxLTcuMSAyLjYtMTAuMiAzLjlsLS4zLS4zYzEtMS4zIDEtMi45IC4zLTUtMS0zLjEtOC4xLTIzLjgtOS4yLTI3LjItLjUtMS44LTEuNi0zLjEtMi42LTMuMWwwLS41YzMuMS0xIDYtMi4xIDEwLjctMy40bC4zIC4zLS4zIDQuN2MxLjMgMy45IDIuNCA3LjYgMy4xIDkuN2wuMyAwYzMuOS0xLjMgOS40LTIuOSAxMi44LTMuOWwuMy0uMy0yLjYtOS40Yy0uNS0xLjgtMS0zLjQtMi42LTMuOWwwLS4zYzQuNC0xIDcuMy0xLjggMTAuNy0yLjRsLjMgLjNjLTEgMS4zLTEgMi45LS41IDQuNCAxLjYgNi4zIDQuNyAyMC40IDYuMyAyNi41IC41IDIuNiAxLjggMy40IDIuNiAzLjl6bTMyLjItNi44bC0uMyAuM2MtNC43IC41LTE0LjEgMi40LTIyLjUgNC4ybC0uMy0uMyAuOC00LjJjLTEuNi03LjktMy40LTE4LjYtNS0yNi4yLS4zLTEuOC0uOC0yLjktMi42LTMuN2wuOC0uNWM5LjItMS42IDIwLjItMi40IDI0LjktMi42bC4zIC4zYy41IDIuNCAuOCAzLjEgMS42IDUuNWwtLjMgLjNjLTEuMS0xLjEtMy4zLTMuMi0xNi4yLS44bC0uMyAuM2MuMyAxLjYgMSA2LjYgMS42IDkuOWwuMyAuM2M5LjUtMS43IDQuOC0uMSAxMC43LTIuNGwuMyAwYzAgMS42LS4zIDEuOC0uMyA1LjJsLS4zIDBjLTQuOC0xLTIuMi0uOS0xMC4yIDBsLS4zIC4zYy4zIDIuMSAxLjYgOS40IDIuMSAxMi42bC4zIC4zYzEuMiAuNCAxNC4yLS42IDE2LjItNC43bC4zIDBjLS41IDIuNC0xIDQuMi0xLjYgNnptMTAuNy00NC41Yy00LjUgMi40LTguMSAyLjktMTEgMi45LS4yIDAtMTEuNCAxLjEtMTcuNS0xMC02LjctMTAuOC0xLTI1LjIgNS41LTMxLjcgOC44LTguMSAyMy40LTEwLjEgMjguNS0xNyA4LTEwLjMtMTMtMjIuMy0yOS42LTUuOGwtMi42LTIuOSA1LjItMTYuMmMyNS42LTEuNiA0NS4yLTMgNTAgMTYuMiAuOCAzLjEgMCA5LjQtLjMgMTIuMSAwIDIuNi0xLjggMTguOC0yLjEgMjMtLjUgNC4yLS44IDE4LjMtLjggMjAuNyAuMyAyLjQgLjUgNC4yIDEuNiA1LjUgMS42IDEuOCA1LjggMS44IDUuOCAxLjhsLS44IDQuN2MtMTEuOC0xLjEtMTAuMy0uNi0yMC40LTEtMy4yLTUuMS0yLjItMy4zLTQuMi03LjkgMCAwLTQuMiAzLjktNy4zIDUuNXpNNDQzLjkgMjgxYy02LjQtMTAuNi0xOS44LTcuMi0yMS43IDUuNS0yLjYgMTcuMSAxNC4zIDE5LjggMjAuNyAxMC4ybC4zIC4zYy0uNSAxLjgtMS44IDYtMS44IDYuM2wtLjUgLjVjLTEwLjMgNi45LTI4LjUtMi41LTI1LjctMTguNiAxLjktMTAuOSAxNC40LTE4LjkgMjguOC05LjlsLjMgLjVjMCAxLjEtLjMgMy40LS4zIDUuM3ptNS44LTg3LjdsMC02LjZjLjcgMCAxOS42IDMuMyAyNy44IDcuM2wtMS42IDE3LjVzMTAuMi05LjQgMTUuNC0xMC43YzUuMi0xLjYgMTQuOSA3LjMgMTQuOSA3LjNsLTExLjMgMTEuM2MtMTIuMS02LjQtMTkuNi0uMS0yMC43IC44LTUuMyAzOC43LTguNiA0Mi4yIDQuNCA0Ni4xbC0uNSA0LjdjLTE3LjYtNC4zLTE4LjUtNC41LTM2LjktNy4zbC44LTQuN2M3LjMgMCA3LjUtNS4zIDcuNi02LjggMCAwIDUtNTMuMiA1LTU1LjMgMC0yLjktNS0zLjctNS0zLjd6bTExIDExNC40Yy04LjEtMi4xLTE0LjEtMTEtMTAuNy0yMC43IDMuMS05LjQgMTIuMy0xMi4zIDE4LjktMTAuMiA5LjIgMi42IDEyLjggMTEuOCAxMC43IDE5LjQtMi42IDguOS05LjQgMTMuOS0xOC45IDExLjV6bTQyLjIgOS43Yy0yLjQtLjUtNy4xLTIuNC04LjYtMi45bDAtLjMgMS42LTEuOGMuNi04LjIgLjYtNy4zIC4zLTcuNi00LjgtMS44LTYuNy0yLjQtNy4xLTIuNC0xLjMgMS44LTIuOSA0LjUtMy43IDUuNWwtLjggMy40IDAgLjNjLTEuMy0uMy0zLjktMS4zLTYtMS42bDAtLjMgMi42LTEuOGMzLjQtNC43IDEwLTE0LjEgMTMuOS0yMC4ybDAtMi4xIC41LS4zYzIuMSAuOCA1LjUgMi4xIDcuNiAyLjkgLjUgLjUgLjItMS45LTEgMjUuMS0uMiAxLjggMCAyLjYgLjggMy45em0tNC43LTg5LjhjMTEuMy0xOC4zIDMwLjgtMTYuMiAzNC0zLjRsNy42LTI2LjJjMi4zLTYuMi0yLjgtOS45LTQuNS0xMS4zbDEuOC0zLjdjMTIuMiAxMC40IDE2LjQgMTQgMjIuNSAyMC40LTI1LjkgNzMuMS0zMC44IDgwLjgtMjQuNiA4NC4zbC0xLjggNC40Yy02LjQtMy4zLTguOS00LjQtMTcuOC04LjZsMi4xLTYuOGMtLjMtLjMtMy45IDMuOS05LjcgMy43LTE5LjEtMS4zLTIyLjktMzEuNy05LjctNTIuOXptMjkuMyA3OS4zYzAtNS43LTYuMy03LjktNy45LTUuMi0xLjMgMi4xIDEgNSAyLjkgOC40IDEuNiAyLjYgMi42IDYuMyAxIDkuNC0yLjYgNi4zLTEyLjQgNS4zLTE1LjQtLjggMC0uNy0uMyAuMSAxLjgtNC43bC44LS4zYy0uNiA1LjcgNi4xIDkuNiA4LjQgNSAxLTIuMS0uNS01LjUtMi4xLTguNC0xLjYtMi42LTMuNy02LjMtMS44LTkuNyAyLjctNS4xIDExLjMtNC41IDE0LjcgMi40bDAgLjUtMi40IDMuNHptMjEuMiAxMy40Yy0yLTMuMy0uOS0yLjEtNC41LTQuN2wtLjMgMGMtMi40IDQuMi01LjggMTAuNS04LjYgMTYuMi0xLjMgMi40LTEgMy40LS44IDMuOWwtLjMgLjMtNS44LTQuNCAuMy0uMyAyLjEtMS4zYzMuMS01LjggNi42LTEyLjEgOS4yLTE3bDAtLjNjLTIuNi0yLTEuMi0xLjUtNi0xLjhsMC0uMyAzLjEtMy40IC4zIDBjMy43IDIuNCAxMCA2LjggMTIuMyA4LjlsLjMgLjMtMS4zIDMuOXpNNTc1LjggMjc2bC0yLjktMi45Yy44LTIuNCAxLjgtNSAyLjEtNy42IC43LTkuNy0xMS41LTExLjgtMTEuNS01IDAgNSA3LjkgMTkuNCA3LjkgMjcuOCAwIDEwLjItNS44IDE1LjctMTMuOSAxNi41LTguNCAuOC0yMC4yLTEwLjUtMjAuMi0xMC41bDUtMTQuNCAyLjkgMi4xYy0zIDE3LjggMTcuNyAyMC40IDEzLjMgNS4yLTEuMS00LTE4LjctMzQuMiAyLjEtMzguMiAxMy42LTIuNCAyMyAxNi41IDIzIDE2LjVMNTc1LjggMjc2em0zNS42LTEwLjJjLTExLTMwLjQtNjAuNS0xMjcuNS0xOTItMTI5LjYtNTMuNC0xLTk0LjMgMTUuNC0xMzIuOCAzOGw4NS42LTkuMi05MS40IDIwLjcgMjUuMSAxOS42LTMuOS0xNi41YzcuNS0xLjcgMzkuMS04LjUgNjYuOC04LjlsLTIyLjMgODAuNGMxMy42LS43IDE5LTkgMTkuNi0yMi44bDUtMSAuMyAyNi43Yy0yMi41IDMuMi0zNy4zIDYuNy00OS41IDkuOWwxMy4xLTQzLjItNjEuNS0zNi43IDIuNCA4LjEgMTAuMiA1YzYuMyAxOC42IDE5LjQgNTYuNiAyMC40IDU4LjcgMiA0LjMgMy4yIDUuOCAxMiA0LjVsMS4xIDVjLTE2LjEgNC45LTIzLjcgNy42LTM5IDE0LjRsLTIuNC00LjdjNC40LTIuOSA4LjctMy45IDUuNS0xMi44LTIzLjctNjIuNS0yMS41LTU4LjEtMjIuOC01OS40bDIuNC00LjQgMzMuNSA2Ny4zYy0zLjgtMTEuOSAxLjcgMS43LTMzLTc4LjhsLTQxLjkgODguNSA0LjctMTMuOS0zNS45LTQyLjIgMjcuOCA5My41LTExLjggOC40Yy0xMTEuOS0xMDEuNy0xMDUuOC05OC40LTExMy43LTk4LjctNS41LS4zLTEzLjYgNS41LTEzLjYgNS41bC01LTZjMzAuNi0yMy41IDMxLjYtMjQuMyA1OC40LTQyLjdsNC4yIDcuMXMtNS44IDQuMi03LjkgNy4xYy01LjkgOS4zIDEuNyAxMy4zIDYxLjggNzUuN2wtMTguOC01OC45IDM5LjgtMTAuMiAyNS43IDMwLjYgNC40LTEyLjMtNS0yNC42IDEzLjEtMy40IC41IDMuMSAzLjctMTAuNS05NC4zIDI5LjMgMTEuMy01LTEzLjYtNDIuNCAxNy4zLTkuMiAzMC4xIDM2LjEgMjguNS0xMy4xYy0xLjQtNy41LTIuNS0xNC41LTQuNy0xOS42bDE3LjMgMTMuOSA0LjctMi4xLTU5LjItNDIuNyAyMy4xIDExLjVjMTktNi4xIDI1LjItNy41IDMyLjItOS43bDIuNiAxMWMtMTIuNiAxMi42IDEuNCAxNi44IDYuNSAxOS40bC0xMy42LTYxIDEyIDI4LjNjNC4yLTEuMyA3LjMtMi4xIDcuMy0yLjFsMi42IDguNnMtMy4xIDEtNi4zIDIuMWw4LjkgMjEgMzMuOC02NS43LTIwLjcgNjFjNDIuNC0yNC4xIDgxLjQtMzYuNyAxMzItMzUuOSA2NyAxIDE2Ny4zIDQwLjggMTk5LjggMTM5LjggLjggMi4xIDAgMi42LS44IC4zem0tNDA4LTExMy40czEuOC0uNSA0LjItMS4zbDkuNCA3LjZjLS40IDAtMy40LS4zLTExLjMgMi40bC0yLjQtOC42em0xNDMuOCAzOC41Yy0xLjYtLjYtMjYuNS00LjgtMzMuMyAyMC43bDIxLjcgMTcgMTEuNS0zNy43ek0zMTguNCA2Ny4xYy01OC40IDAtMTA2LjEgMTItMTE1IDE0LjRsMCAuOGM4LjQgMi4xIDE0LjQgNC4yIDIxLjIgMTEuOGwxLjYgLjNjNi42LTEuOCA0OS0xMy45IDExMC4yLTEzLjkgMTgwLjIgMCAzMDEuNyAxMTYuOCAzMDEuNyAyMjMuNGwwIDEwYzAgMS4zIC44IDIuNiAxLjEgLjUgLjUtMi4xIC44LTguNiAuOC0xOS42IC4zLTgzLjgtOTYuNi0yMjcuNi0zMjEuNi0yMjcuNnpNNTI5LjUgMjM2LjhjMS4zLTUuOCAwLTEyLjMtNy4zLTEzLjEtOS42LTEuMS0xNi4xIDIzLjgtMTcgMzMuNS0uOCA1LjUtMS4zIDE0LjkgNiAxNC45IDQuNyAwIDkuNy0uOSAxOC4zLTM1LjR6TTQ2OCAyNzkuN2MtMi42LS44LTkuNC0uOC0xMi42IDEwLjUtMS44IDYuOCAuNSAxMy40IDYgMTQuNyAzLjcgMS4xIDguOSAuNSAxMS44LTEwLjcgMi42LTkuOS0xLjgtMTMuNi01LjItMTQuNHptMjMgMjFjMS44IC41IDMuMSAxIDUuOCAxLjggMC0xLjggLjUtOC40IC44LTEyLjEtMSAxLjMtNS41IDguMS02LjYgMTBsMCAuM3oiXQogICAgfTsKICAgIGZhQ3JlYXRpdmVDb21tb25zTmQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY3JlYXRpdmUtY29tbW9ucy1uZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNGViIiwgIk0yNTUuNiA4QzM5Ny40IDggNTA0IDExOC4xIDUwNCAyNTYgNTA0IDQwMy4xIDM4NS41IDUwNCAyNTUuNiA1MDQgMTIxLjYgNTA0IDggMzk0LjUgOCAyNTYgOCAxMjMuMSAxMTIuNyA4IDI1NS42IDh6bS44IDQ0LjdjLTExOC4yIDAtMjAzLjcgOTcuOS0yMDMuNyAyMDMuMyAwIDEwOS44IDkxLjIgMjAyLjggMjAzLjcgMjAyLjggMTAzLjIgMCAyMDIuOC04MS4xIDIwMi44LTIwMi44IC4xLTExMy44LTkwLjItMjAzLjMtMjAyLjgtMjAzLjN6bTk0IDE0NC4zbDAgNDIuNS0xODAuMyAwIDAtNDIuNSAxODAuMyAwem0wIDc5LjhsMCA0Mi41LTE4MC4zIDAgMC00Mi41IDE4MC4zIDB6Il0KICAgIH07CiAgICBmYVVzcHMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidXNwcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmN2UxIiwgIk00MjguMyAyNDEuN2MyNS44LTQxLjMgMTUuMi00OC44LTExLjctNDguOGwtMjcgMGMtLjEgMC0xLjUtMS40LTEwLjkgOC0xMS4yIDUuNi0zNy45IDYuMy0zNy45IDguNyAwIDQuNSA3MC4zLTMuMSA4OC4xIDAgOS41IDEuNS0xLjUgMjAuNC00LjQgMzItLjUgNC41IDIuNCAyLjMgMy44IC4xek0zMTYuMiAyNjQuM2M2NC0yMS4zIDk3LjMtMjMuOSAxMDItMjYuMiA0LjQtMi45LTQuNC02LjYtMjYuMi01LjgtNTEuNyAyLjItMTM3LjYgMzcuMS0xNzIuNiA1My45bC0zMC43LTkzLjMgMTk2LjYgMGMtMi43LTI4LjItMTUyLjktMjIuNi0zMzcuOS0yMi42TC01IDQxNS44YzE5Ni40LTk3LjMgMjU4LjktMTMwLjMgMzIxLjItMTUxLjV6TTYyLjcgOTZjMjUzLjMgNTMuNyAzMzAgNjUuNyAzMzIuMSA4NS4yIDM2LjQgMCA0NS45IDAgNTIuNCA2LjYgMjEuMSAxOS43LTE0LjYgNjcuNy0xNC42IDY3LjctNC40IDIuOS00MDYuNCAxNjAuMi00MDYuNCAxNjAuMkw0NDkuMyA0MTUuNyA1MTcgOTYgNjIuNyA5NnoiXQogICAgfTsKICAgIGZhU3F1YXJlTGV0dGVyYm94ZCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtbGV0dGVyYm94ZCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNjJlIiwgIk0zODQgMzJjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDMyMCAwek0xMDUuMSAxODdDNjYuNCAxODcgMzUgMjE4LjMgMzUgMjU3czMxLjQgNzAgNzAuMSA3MGMyNC44IDAgNDYuNS0xMi44IDU5LTMyLjJsLjUtLjctLjQtLjZjLTYuNS0xMC42LTEwLjItMjMuMS0xMC4yLTM2LjUgMC0xMy42IDMuOS0yNi4zIDEwLjYtMzcuMS0xMi40LTE5LjgtMzQuNC0zMi45LTU5LjUtMzIuOXpNMjI0IDE4N2MtMjQuOCAwLTQ2LjUgMTIuOC01OSAzMi4ybC0uNSAuNyAuNCAuNmM2LjUgMTAuNiAxMC4yIDIzLjEgMTAuMiAzNi41IDAgMTMuNi0zLjkgMjYuMy0xMC42IDM3LjEgMTIuNCAxOS43IDM0LjQgMzIuOSA1OS41IDMyLjkgMjQuOCAwIDQ2LjUtMTIuOCA1OS0zMi4ybC41LS43LS40LS42Yy02LjUtMTAuNi0xMC4yLTIzLjEtMTAuMi0zNi41IDAtMTMuNiAzLjktMjYuMyAxMC42LTM3LjEtMTIuNC0xOS43LTM0LjQtMzIuOS01OS41LTMyLjl6bTExOC45IDBjLTI0LjggMC00Ni41IDEyLjgtNTkgMzIuMmwtLjUgLjcgLjQgLjZjNi41IDEwLjYgMTAuMiAyMy4xIDEwLjIgMzYuNSAwIDEzLjYtMy45IDI2LjMtMTAuNiAzNy4xIDEyLjQgMTkuOCAzNC40IDMyLjkgNTkuNSAzMi45IDM4LjcgMCA3MC4xLTMxLjMgNzAuMS03MHMtMzEuNC03MC03MC4xLTcweiJdCiAgICB9OwogICAgZmFNYW5kYWxvcmlhbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJtYW5kYWxvcmlhbiIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmNTBmIiwgIk0yMDAuNiA1MTEuOWMtMS0zLjMtMS43LTE1LjgtMS40LTI0LjYgLjYtMTUuOSAxLTI0LjcgMS40LTI4LjggLjYtNi4yIDIuOS0yMC43IDMuMy0yMS40IC42LTEgLjQtMjcuOS0uMi0zMy4xLS4zLTIuNi0uNi0xMS45LS43LTIwLjctLjEtMTYuNS0uNS0yMC4xLTIuNy0yNC44LTEuMS0yLjMtMS4yLTMuOC0xLTExLjQgLjItNC4yIC4xLTguNS0uMy0xMi43LTItMTMtMy41LTI3LjctMy4yLTMzLjlzLjQtNy4xIDIuMS05LjdjMy4xLTQuNyA2LjUtMTQgOC42LTIzLjMgMi4zLTkuOSAzLjktMTcuMiA0LjYtMjAuNyAxLjEtNS4xIDIuNi0xMC4xIDQuNC0xNS4xIDIuMy02LjIgMi41LTE1LjQgLjQtMTUuNC0uMyAwLTEuNCAxLjItMi40IDIuN3MtNC44IDQuOC04LjMgNy40Yy04LjQgNi4xLTExLjcgOS40LTEyLjcgMTIuNnMtMSA3LjItLjIgNy44Yy4zIC4yIDEuMyAyLjQgMi4xIDQuOSAxLjYgNSAxLjkgMTAuMyAuNyAxNS40LS40IDEuOC0xIDUuNS0xLjUgOC4ycy0xIDYuNS0xLjMgOC4yYy0uMiAxLjUtLjcgMy0xLjUgNC4zLTEgMS0xLjEgLjktMi4xLS41LS43LTEuNS0xLjItMy4xLTEuNC00LjctLjItMS43LTEuNi03LjEtMy4xLTExLjktMy4zLTEwLjktMy41LTE2LjItMS0yMSAuOC0xLjQgMS40LTMgMS43LTQuNiAwLTIuNC0yLjItNS4zLTcuNC05LjktNy02LjItOC42LTcuOS0xMC4yLTExLjMtMS43LTMuNi0zLjEtNC4xLTQuNS0xLjUtMS44IDMtMi42IDkuMS0zIDIybC0uMyAxMi4yIDIgMi4yYzMuMiAzLjcgMTIuMSAxNi41IDEzLjggMTkuOCAzLjQgNi43IDQuMyAxMS43IDQuNCAyMy42czEgMjIuOCAyIDI0LjdjLjQgLjcgLjUgMS40IC4zIDEuNXMuNCAyLjEgMS4zIDQuM2MxIDIuOSAxLjcgNS45IDIuMSA5IC40IDMuNSAuOSA3IDEuNyAxMC40IDIuMiA5LjYgMi44IDE0LjEgMi40IDIwLjEtLjIgMy4zLS41IDExLjEtLjcgMTcuMy0xLjMgNDEuOC0xLjggNTgtMiA2MS4yLS4xIDItLjQgMTEuNS0uNiAyMS4xLS40IDE2LjMtMS4zIDI3LjQtMi40IDI4LjYtLjYgLjctOC4xLTQuOS0xMi41LTkuNS0zLjgtMy45LTQtNC44LTIuOC05LjkgLjctMyAyLjMtMTguMyAzLjMtMzIuNiAuNC00LjggLjgtMTAuNSAxLTEyLjcgLjgtOS40IDEuNy0yMC4zIDIuNi0zNC44IC42LTguNSAxLjMtMTYuNCAxLjctMTcuN3MuOS05LjkgMS4xLTE5LjFsLjQtMTYuOC0yLjMtNC4zYy0xLjctMy4zLTQuOS02LjktMTMuMi0xNS4zLTYtNi4xLTExLjgtMTIuMy0xMi45LTEzLjhsLTItMi44IC44LTEwLjljMS4xLTE1LjcgMS4xLTQ4LjYgMC01OS4xbC0uOS04LjctMy4zLTQuNWMtNS45LTguMS01LjgtNy43LTYuMi0zMy4zLS4xLTYuMS0uNC0xMS41LS42LTEyLjEtLjgtMS45LTMtMi43LTguNS0zLTguOS0uNi0xMS0xLjktMjMuOC0xNC42LTYuMi02LTEyLjMtMTItMTMuOC0xMy4yLTIuOC0yLjQtMi44LTItLjYtOS42bDEuNC00LjYtMS43LTNjLS44LTEuNC0xLjYtMi44LTIuNi00LjEtMS4zLTEuNS01LjUtMTAuOS02LTEzLjUtLjItLjctLjItMS40LS4xLTIuMXMuNS0xLjMgLjktMS44YzIuMi0yLjkgMy40LTUuNyA0LjUtMTAuNyAyLjMtMTEuMiA3LjctMjYuMSAxMC42LTI5LjIgMy4yLTMuNSA3LjctMSA5LjQgNSAxLjMgNC44IDEuNCA5LjggLjEgMTguNi0uNSAzLjctLjkgNy40LTEgMTEuMSAwIDQgLjIgNC43IDIuMyA3LjQgMy4zIDQuNCA3LjcgNy40IDE1LjIgMTAuNSAxLjcgLjcgMy4zIDEuNyA0LjcgMi44IDExLjIgMTAuNyAxOC42IDE2LjIgMjIuOSAxNi45IDUuMiAuOCA4IDQuNSAxMCAxMy40IDEuMyA1LjcgNCAxMS4xIDUuNSAxMS4xIDEuMi0uMiAyLjMtLjcgMy4zLTEuNCAyLTEuMiAyLjItMS43IDIuMi00LjItLjMtNi0uOS0xMS45LTItMTcuOC0uNC0xLjctLjgtNC4xLS45LTUuNHMtLjYtMy44LTEtNS43Yy0yLjYtMTEuMi0zLjYtMTUuNS00LjEtMTYtMS42LTItNC4xLTEwLjItNC45LTE1LjktMS42LTExLjEtNC0xNC4yLTEyLjktMTcuNC00LjktMS44LTkuNC00LjUtMTMuMy03LjktMS4yLTEtNC0zLjItNi40LTUuMXMtNC40LTMuNS00LjYtMy44Yy0uOC0uNy0xLjctMS40LTIuNy0yLTYuMi00LjItOC44LTctMTEuMy0xMmwtMi40LTVjLS4xLTguNy0uMy0xNy4zLS40LTI2bDYuOS02LjZjNC0zLjggOC41LTcuNCAxMC42LTguNCAzLjMtMS43IDQuNC0xLjkgMTEuNC0yIDguNS0uMiAxMC4xIDAgMTEuNyAxLjZzMS40IDYuNC0uMyA4LjVjLS42IC43LTEuMSAxLjUtMS4zIDIuMyAwIC42LTIuNiA0LjktNS40IDktMS4xIDIuMi0xLjkgNC41LTIuNCA2LjggMjAuNCAxMy40IDIxLjYgMy44IDE0LjEgMjlsMTEuNCAyLjVjMy4xLTguNyA2LjUtMTcuMyA4LjYtMjYuMiAuMy03LjYtMTItNC4yLTE1LjQtOC43LTIuMy01LjkgMy4xLTE0LjIgNi4xLTE5LjIgMS42LTIuMyA2LjYtNC43IDguOC00LjEgLjkgLjIgNC4yLS40IDcuNC0xLjMgMi41LS44IDUtMS4zIDcuNS0xLjcgMi0uMiA0LjEtLjcgNi0xLjMgMy43LTEuMSA0LjUtMS4yIDYuMy0uNCAxLjkgLjYgMy44IDEuMSA1LjggMS40IDIuMSAuMyA0LjEgLjkgNiAxLjkgMS42IC45IDMuMyAxLjcgNSAyLjIgMi41IC43IDMgLjYgNy0xLjdMMjI2IDUuNCAyMzYuNyA1YzEwLjQtLjQgMTAuOC0uNSAxNS4zLTIuN0wyNTYuNSAwIDI1OSAxLjRjMS44IDEgMy4xIDIuNyA0LjkgNiAyLjQgNC41IDIuNCA0LjYgMS40IDcuNC0uOSAyLjQtLjkgMy4zLS4xIDYuNCAuNSAyIDEuMiA0IDIuMSA1LjkgLjYgMS4zIDEuMSAyLjYgMS4zIDQgLjMgNC4zIDAgNS4zLTIuNCA2LjktMi4yIDEuNS03IDcuOS03IDkuMy0uMiAxLS42IDItMS4xIDMtNSAxMS41LTYuOCAxMy42LTE0LjMgMTctOS4yIDQuMi0xMi4zIDUuMi0xNi4yIDUuMi0zLjEgMC00IC4yLTQuNSAxLjMtMS4yIDEuNC0yLjUgMi43LTQuMSAzLjctMS44IDEuMi0zLjMgMi45LTQuNCA0LjgtLjUgMS4yLTEuNCAyLjItMi41IDIuOS0uOSAuNC0xLjggMS0yLjUgMS43LTIuMiAxLjktNC42IDMuNy03IDUuNC0zLjMgMi4zLTYuOSA1LTcuOSA2LS43IC43LTEuNSAxLjMtMi40IDEuNy0uOCAuNC0xLjYgLjktMi4xIDEuNi0xLjMgMS40LTEuNSAyLjEtMS4xIDQuNiAuMyAyIC44IDQgMS40IDUuOSAxLjMgMy44IDEuMyA3LjkgMCAxMC42cy0uOSA2LjcgMS40IDkuNmMyIDIuNiAyLjIgNC42IC43IDguOC0uOCAyLjktMS4xIDUuOS0xLjEgOC45IDAgNC45IC4yIDYuMyAxLjUgOC40czEuOCAyLjUgMy4yIDIuM2MyLS4yIDIuMy0xLjEgNC43LTEyLjEgMi4yLTEwIDMuNy0xMS45IDEzLjgtMTcuMSAyLjktMS41IDcuNS00IDEwLTUuNHM2LjgtMy43IDkuNC00LjljNS45LTIuNiAxMS4yLTYuNiAxNS4yLTExLjcgNy4xLTguOCAxMC0xNi4yIDEyLjgtMzMuMyAuNC0yLjggMS4zLTUuNCAyLjktNy43IDEuNC0yLjIgMi40LTQuNyAyLjktNy4zIDEtNS4zIDIuOS05LjEgNS42LTExLjUgNC43LTQuMiA2LTEuMSA0LjYgMTAuOS0uNSAzLjktMS4xIDEwLjMtMS40IDE0LjRsLS42IDcuNGMzIDIuNyA1LjkgNS41IDguOSA4LjJsLjEgOC40Yy4xIDQuNiAuNSA5LjUgLjkgMTAuOWwuOCAyLjUtNi40IDYuM2MtOC41IDguMy0xMi45IDEzLjktMTYuOCAyMS42LTEuOCAzLjUtMy43IDcuMS00LjQgOC0yLjIgMy4xLTYuNSAxMy04LjggMjAuM2wtMi4zIDcuMi03IDYuNWMtMy44IDMuNi04IDcuMi05LjIgOC4yLTMgMi4zLTQuMyA1LjEtNC4zIDEwLS4xIDIuNSAuNCA1IDEuNiA3LjMgLjggMS42IDEuNSAzLjIgMi4xIDQuOCAuMyAxIC45IDIgMS42IDIuOSAxLjQgMS42IDEuOSAxNi4xIC44IDIzLjItLjcgNC41LTMuNiAxMi00LjcgMTItMS44IDAtNC4xIDkuMy01LjEgMjAuNy0uMiAyLS42IDUuOS0xIDguN3MtMSAxMC0xLjQgMTZjLS44IDEyLjItLjIgMTguOCAyIDIzLjIgMy40IDYuNyAuNSAxMi43LTExIDIyLjhsLTQgMy41IC4xIDUuMmMuMSAzIC40IDYgMS4xIDguOSA0LjYgMTYgNC43IDE2LjkgNC40IDM3LjEtLjUgMjYuNC0uMyA0MC4zIC42IDQ0LjIgLjUgMi4zIC45IDQuNiAxLjEgNyAuMiAyIC43IDUuMyAxLjEgNy40IC41IDIuMyAuOCAxMSAuOCAyMi43bDAgMTkuMS0xLjggMi42Yy0yLjcgMy45LTE1LjEgMTMuNS0xNS41IDEyLjNsLjEgMHptMjkuNS00NS4xYy0uMi0uMy0uMy02LjktLjMtMTQuNiAwLTE0LjEtLjktMjcuNS0yLjMtMzQuNC0uNC0yLS44LTkuNy0uOS0xNy4xLS4yLTExLjktMS40LTI0LjQtMi42LTI2LjQtLjctMS4xLTMtMTcuNy0zLTIxLjMgMC00LjIgMS02IDUuMy05LjFzNC45LTMuMSA1LjUtLjdjLjMgMS4xIDEuNCA1LjYgMi42IDEwIDMuOSAxNS4xIDQuMSAxNi4zIDQgMjEuNy0uMSA1LjgtLjEgNi4xLTEuNyAxNy43LTEgNy4xLTEuMiAxMi40LTEgMjguNCAuMiAxOS40LS42IDM1LjctMiA0MS4zLS43IDIuOC0yLjggNS41LTMuNCA0LjRsLS4xIDB6bS03MS0zNy42Yy0uOC0zLjYtMS4zLTcuMi0xLjctMTAuOHMtMS03LjItMS43LTEwLjhjLS41LTIuMS0uOS00LjMtMS02LjUtLjMtMy4yLS45LTcuNS0xLjMtOS41LTEtNC44LTMuMy0xOS40LTMuNC0yMS4xIDAtLjctLjMtNC0uNy03LjQtLjctNi4yLS44LTI3LjctLjItMjguMyAxLTEgNi42IDIuOCAxMS4zIDcuNGw1LjMgNS4zLS40IDYuNWMtLjIgMy42LS42IDEwLjItLjggMTQuOC0uNSAxMy4zLS43IDguNy0xLjYgMjguNC0uOCAxNy40LTEuOSAzMS4zLTIuNiAzMi0uMSAuMS0uMiAuMS0uMiAuMnMtLjIgMC0uMyAwLS4yIDAtLjMtLjEtLjEtLjEtLjItLjJsMCAwek03MiAxNjIuNmMyMS4xIDEyLjggMTcuOCAxNC4yIDI4LjUgMTcuNyAxMyA0LjMgMTguOSA3LjEgMjMuMiAxNi45LTQzLjcgMzYuMS02OSA1Ny45LTc2LjcgNzAuOS0zMSA1Mi02IDEwMS42IDYyLjggODcuMi0xNC4yIDI5LjItNzggMjguNi05OC43LTQuOS0yNC43LTQwLTIyLjEtMTE4LjMgNjEtMTg3LjdsMCAwem0yMTAuOCAxNzljNTYuNyA2LjkgODIuMy0zNy43IDQ2LjUtODkuMiAwIDAtMjYuOS0yOS4zLTY0LjMtNjggMy0xNS41IDkuNS0zMi4xIDMwLjYtNTMuOCA4OS4yIDYzLjUgOTIgMTQxLjYgOTIuNSAxNDkuNCA0LjMgNzAuNi03OC43IDkxLjItMTA1LjMgNjEuN2wwIDB6Il0KICAgIH07CiAgICBmYVNsYWNrID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNsYWNrIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbNjI0NDcsICJzbGFjay1oYXNoIl0sICJmMTk4IiwgIk05NC4xIDMxNS4xYzAgMjUuOS0yMS4yIDQ3LjEtNDcuMSA0Ny4xUzAgMzQxIDAgMzE1LjEgMjEuMiAyNjggNDcuMSAyNjhsNDcuMSAwIDAgNDcuMXptMjMuNyAwYzAtMjUuOSAyMS4yLTQ3LjEgNDcuMS00Ny4xUzIxMiAyODkuMiAyMTIgMzE1LjFsMCAxMTcuOGMwIDI1LjktMjEuMiA0Ny4xLTQ3LjEgNDcuMXMtNDcuMS0yMS4yLTQ3LjEtNDcuMWwwLTExNy44em00Ny4xLTE4OWMtMjUuOSAwLTQ3LjEtMjEuMi00Ny4xLTQ3LjFTMTM5IDMyIDE2NC45IDMyIDIxMiA1My4yIDIxMiA3OS4xbDAgNDcuMS00Ny4xIDB6bTAgMjMuN2MyNS45IDAgNDcuMSAyMS4yIDQ3LjEgNDcuMVMxOTAuOCAyNDQgMTY0LjkgMjQ0TDQ3LjEgMjQ0QzIxLjIgMjQ0IDAgMjIyLjggMCAxOTYuOXMyMS4yLTQ3LjEgNDcuMS00Ny4xbDExNy44IDB6bTE4OSA0Ny4xYzAtMjUuOSAyMS4yLTQ3LjEgNDcuMS00Ny4xUzQ0OCAxNzEgNDQ4IDE5Ni45IDQyNi44IDI0NCA0MDAuOSAyNDRsLTQ3LjEgMCAwLTQ3LjF6bS0yMy43IDBjMCAyNS45LTIxLjIgNDcuMS00Ny4xIDQ3LjFTMjM2IDIyMi44IDIzNiAxOTYuOWwwLTExNy44QzIzNiA1My4yIDI1Ny4yIDMyIDI4My4xIDMyczQ3LjEgMjEuMiA0Ny4xIDQ3LjFsMCAxMTcuOHptLTQ3LjEgMTg5YzI1LjkgMCA0Ny4xIDIxLjIgNDcuMSA0Ny4xUzMwOSA0ODAgMjgzLjEgNDgwIDIzNiA0NTguOCAyMzYgNDMyLjlsMC00Ny4xIDQ3LjEgMHptMC0yMy43Yy0yNS45IDAtNDcuMS0yMS4yLTQ3LjEtNDcuMVMyNTcuMiAyNjggMjgzLjEgMjY4bDExNy44IDBjMjUuOSAwIDQ3LjEgMjEuMiA0Ny4xIDQ3LjFzLTIxLjIgNDcuMS00Ny4xIDQ3LjFsLTExNy44IDB6Il0KICAgIH07CiAgICBmYVNsYWNrSGFzaCA9IGZhU2xhY2s7CiAgICBmYUFuZ2VsbGlzdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhbmdlbGxpc3QiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjIwOSIsICJNMzE1LjYgMjE1LjRjMTEuNy0zMi42IDQ1LjQtMTI2LjkgNDUuNC0xNTcuMSAwLTI2LjYtMTUuNy00OC45LTQzLjctNDguOS00NC42IDAtODQuNiAxMzEuNy05Ny4xIDE2My4xLTkuNy0yOC41LTU1LjEtMTcyLjUtOTUuMS0xNzIuNS0zMS4xIDAtNDUuNyAyMi45LTQ1LjcgNTEuNyAwIDM1LjMgMzQuMiAxMjYuOCA0Ni42IDE2Mi02LjMtMi4zLTEzLjEtNC4zLTIwLTQuMy0yMy40IDAtNDguMyAyOS4xLTQ4LjMgNTIuNiAwIDguOSA0LjkgMjEuNCA4IDI5LjctMzYuOSAxMC01MS4xIDM0LjYtNTEuMSA3MS43LS4xIDcyLjIgNjguMyAxNDguNiAxNjQuNSAxNDguNiAxMTggMCAxOTEuNC04OC42IDE5MS40LTIwMi45IDAtNDMuMS02LjktODItNTQuOS05My43ek0yODAuMiAxMDhjNC0xMi4zIDIxLjEtNjQuMyAzNy4xLTY0LjMgOC42IDAgMTAuOSA4LjkgMTAuOSAxNiAwIDE5LjEtMzguNiAxMjQuNi00Ny4xIDE0OGwtMzQtNiAzMy4xLTkzLjd6TTExMC44IDQ4LjNjMC0xMS45IDE0LjUtNDUuNyA0Ni4zIDQ3LjFsMzQuNiAxMDAuM2MtMTUuNi0xLjMtMjcuNy0zLTM1LjQgMS40LTEwLjktMjguOC00NS41LTExOS43LTQ1LjUtMTQ4Ljh6TTEwOC41IDI0NGMyOS4zIDAgNjcuMSA5NC42IDY3LjEgMTA3LjQgMCA1LjEtNC45IDExLjQtMTAuNiAxMS40LTIwLjkgMC03Ni45LTc2LjktNzYuOS05Ny43IC4xLTcuNyAxMi43LTIxLjEgMjAuNC0yMS4xek0yOTIuOCA0MzAuM2MtMjkuMSAzMi02Ni4zIDQ4LjYtMTA5LjcgNDguNi01OS40IDAtMTA2LjMtMzIuNi0xMjguOS04OC4zLTE3LjEtNDMuNCAzLjgtNjguMyAyMC42LTY4LjMgMTEuNCAwIDU0LjMgNjAuMyA1NC4zIDczLjEgMCA0LjktNy43IDguMy0xMS43IDguMy0xNi4xIDAtMjIuNC0xNS41LTUxLjEtNTEuNC0yOS43IDI5LjcgMjAuNSA4Ni45IDU4LjMgODYuOSAyNi4xIDAgNDMuMS0yNC4yIDM4LTQyIDMuNyAwIDguMyAuMyAxMS43LS42IDEuMSAyNy4xIDkuMSA1OS40IDQxLjcgNjEuNyAwLS45IDItNy4xIDItNy40IDAtMTcuNC0xMC42LTMyLjYtMTAuNi01MC4zIDAtMjguMyAyMS43LTU1LjcgNDMuNy03MS43IDgtNiAxNy43LTkuNyAyNy4xLTEzLjEgOS43LTMuNyAyMC04IDI3LjQtMTUuNC0xLjEtMTEuMi01LjctMjEuMS0xNi45LTIxLjEtMjcuNyAwLTEyMC42IDQtMTIwLjYtMzkuNyAwLTYuNyAuMS0xMy4xIDE3LjQtMTMuMSAzMi4zIDAgMTE0LjMgOCAxMzguMyAyOS4xIDE4LjEgMTYuMSAyNC4zIDExMy4yLTMxIDE3NC43em0tOTguNi0xMjZjOS43IDMuMSAxOS43IDQgMjkuNyA2LTcuNCA1LjQtMTQgMTItMjAuMyAxOS4xLTIuOC04LjUtNi4yLTE2LjgtOS40LTI1LjF6Il0KICAgIH07CiAgICBmYUFuZHJvaWQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYW5kcm9pZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMTdiIiwgIk00MjAuNSAyNTMuOWEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6bS0yNjUuMSAwYTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHptMjczLjctOTYuNWw0Ny45LTgzYy44LTEuMSAxLjMtMi40IDEuNS0zLjhzLjItMi43LS4xLTQuMS0uOS0yLjYtMS43LTMuNy0xLjgtMi0zLTIuNy0yLjUtMS4xLTMuOS0xLjMtMi43IDAtNCAuNC0yLjUgMS4xLTMuNiAxLjktMS45IDItMi41IDMuMmwtNDguNSA4NC4xYy0zOC44LTE3LjQtODAuOC0yNi40LTEyMy4zLTI2LjRzLTg0LjUgOS0xMjMuMyAyNi40TDExNi4yIDY0LjRjLS42LTEuMi0xLjUtMi4zLTIuNS0zLjJzLTIuMy0xLjUtMy42LTEuOS0yLjctLjUtNC0uNC0yLjcgLjYtMy45IDEuMy0yLjIgMS42LTMgMi43LTEuNCAyLjQtMS43IDMuNy0uMyAyLjctLjEgNC4xIC44IDIuNiAxLjUgMy44bDQ3LjkgODNDNjQuNSAyMDIuMiA4LjIgMjg1LjUgMCAzODRsNTc2IDBjLTguMi05OC41LTY0LjUtMTgxLjgtMTQ2LjktMjI2LjZ6Il0KICAgIH07CiAgICBmYU1lZXR1cCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJtZWV0dXAiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjJlMCIsICJNMTMxLjEgNDE0LjNjMS4xIDUuNy0yLjMgMTEuMS04IDEyLjMtNS40IDEuMS0xMC45LTIuMy0xMi04LTEuMS01LjQgMi4zLTExLjEgNy43LTEyLjNzMTEuMSAyLjMgMTIuMyA4em0xNDMuMSA3MS40Yy02LjMgNC42LTggMTMuNC0zLjcgMjAgNC42IDYuNiAxMy40IDguMyAyMCAzLjcgNi4zLTQuNiA4LTEzLjQgMy40LTIwLTQuMi02LjUtMTMuMS04LjMtMTkuNy0zLjd6bS04Ni00NjIuM2ExMS44IDExLjggMCAxIDAgLTQuOS0yMyAxMS44IDExLjggMCAxIDAgNC45IDIzek02Ni41IDIyNi4zYTIyLjIgMjIuMiAwIDEgMCAtMjQuNyAzNi45IDIyLjIgMjIuMiAwIDEgMCAyNC43LTM2Ljl6bTI3Mi0xNzAuOWEyMi4xIDIyLjEgMCAxIDAgLTIyLjQtMzggMjIuMSAyMi4xIDAgMSAwIDIyLjQgMzh6bS0xOTEuMSA1OGExNi45IDE2LjkgMCAxIDAgLTE4LjgtMjggMTYuOSAxNi45IDAgMSAwIDE4LjggMjh6bTM3Mi4zIDE1NmMtNy40IDEuNy0xMi4zIDkuMS0xMC42IDE2LjkgMS40IDcuNCA4LjkgMTIuMyAxNi4zIDEwLjYgNy40LTEuNCAxMi4zLTguOSAxMC42LTE2LjYtMS41LTcuNC04LjktMTIuMy0xNi4zLTEwLjl6bTM5LjctNTYuOGExMC4xIDEwLjEgMCAxIDAgLTE5LjggNC4zIDEwLjEgMTAuMSAwIDEgMCAxOS44LTQuM3ptLTgwLjMtNzMuN2ExOC44IDE4LjggMCAxIDAgMjAuNyAzMS4zIDE4LjggMTguOCAwIDEgMCAtMjAuNy0zMS4zem0tNi4zIDEzOS40YzI2LjMgNDMuMSAxNS4xIDEwMC0yNi4zIDEyOS4xLTE3LjQgMTIuMy0zNy4xIDE3LjctNTYuOSAxNy4xLTEyIDQ3LjEtNjkuNCA2NC42LTEwNS4xIDMyLjYtMS4xIC45LTIuNiAxLjctMy43IDIuOS0zOS4xIDI3LjEtOTIuMyAxNy40LTExOS40LTIyLjMtOS43LTE0LjMtMTQuNi0zMC42LTE1LjEtNDYuOS02NS40LTEwLjktOTAtOTQtNDEuMS0xMzkuNy0yOC4zLTQ2LjkgLjYtMTA3LjQgNTMuNC0xMTQuOSAyNS4xLTY2LjIgMTA3LjYtOTcuNiAxNjMuNi01NC4yIDY3LjQtMjIuMyAxMzYuMyAyOS40IDEzMC45IDEwMS4xIDQxLjEgMTIuNiA1Mi44IDY2LjkgMTkuNyA5NS4yem0tNzAgNzQuM2MtMy4xLTIwLjYtNDAuOS00LjYtNDMuMS0yNy4xLTMuMS0zMiA0My43LTEwMS4xIDQwLTEyOC0zLjQtMjQtMTkuNC0yOS4xLTMzLjQtMjkuNC0xMy40LS4zLTE2LjkgMi0yMS40IDQuNi0yLjkgMS43LTYuNiA0LjktMTEuNy0uMy02LjMtNi0xMS4xLTExLjctMTkuNC0xMi45LTEyLjMtMi0xNy43IDItMjYuNiA5LjctMy40IDIuOS0xMiAxMi45LTIwIDkuMS0zLjQtMS43LTE1LjQtNy43LTI0LTExLjQtMTYuMy03LjEtNDAgNC42LTQ4LjYgMjAtMTIuOSAyMi45LTM4IDExMy4xLTQxLjcgMTI1LjEtOC42IDI2LjYgMTAuOSA0OC42IDM2LjkgNDcuMSAxMS4xLS42IDE4LjMtNC42IDI1LjQtMTcuNCA0LTcuNCA0MS43LTEwNy43IDQ0LjYtMTEyLjYgMi0zLjQgOC45LTggMTQuNi01LjEgNS43IDMuMSA2LjkgOS40IDYgMTUuMS0xLjEgOS43LTI4IDcwLjktMjguOSA3Ny43LTMuNCAyMi45IDI2LjkgMjYuNiAzOC42IDQgMy43LTcuMSA0NS43LTkyLjYgNDkuNC05OC4zIDQuMy02LjMgNy40LTguMyAxMS43LTggMy4xIDAgOC4zIC45IDcuMSAxMC45LTEuNCA5LjQtMzUuMSA3Mi4zLTM4LjkgODcuNy00LjYgMjAuNiA2LjYgNDEuNCAyNC45IDUwLjYgMTEuNCA1LjcgNjIuNSAxNS43IDU4LjUtMTEuMXptNS43IDkyLjNhMjMuMyAyMy4zIDAgMSAwIDI2LjIgMzguNCAyMy4zIDIzLjMgMCAxIDAgLTI2LjItMzguNHoiXQogICAgfTsKICAgIGZhRm9udGljb25zRmkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZm9udGljb25zLWZpIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYzYTIiLCAiTTExNC40IDIyNGw5Mi40IDAtMTUuMiA1MS4yLTc2LjQgMCAwIDE1Ny44YzAgOC0yLjggOS4yIDQuNCAxMGw1OS42IDUuNiAwIDM0LjQtMTc5LjIgMCAwLTM1LjIgMjkuMi0yLjhjNy4yLS44IDkuMi0zLjIgOS4yLTEwLjhsMC0xNTUuOGMwLTMuMi00LTMuMi04LTMuMmwtMzAuNCAwIDAtNTEuMiAzOC40IDAgMC0yOC44YzAtNjggMzYuNC05NiAxMDYtOTYgNDYuOCAwIDg4LjggMTEuMiA4OC44IDcyLjRMMTYzLjYgMTgwYy40LTI1LjYtNi0zMS42LTIyLjQtMzEuNi0yNS4yIDAtMjYgMTMuNi0yNiAzNy42bDAgMzJjMCAzLjItNC44IDYtLjggNnpNMzg0IDQ4M2wtMTQwLjggMCAwLTM0LjQgMjgtMy42YzcuMi0uOCAxMC40LTIuNCAxMC40LTEwbDAtMTQ4YzAtNS42LTQtOS4yLTkuMi0xMC44bC0zMy4yLTguOCA5LjItNDAuNCAxMTAgMCAwIDIwOGMwIDgtMy42IDguOCA0IDEwbDIxLjYgMy42IDAgMzQuNHpNMzU0IDEzNS44bDEyLjQgNDUuNi0xMCAxMC00Mi44LTIyLjgtNDIuOCAyMi44LTEwLTEwIDEyLjQtNDUuNi0zMC0zNi40IDQuOC0xMCAzOCAwIDIxLjItMzguNCAxMi44IDAgMjEuMiAzOC40IDM4IDAgNC44IDEzLjItMzAgMzMuMnoiXQogICAgfTsKICAgIGZhUGFsZmVkID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInBhbGZlZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmM2Q4IiwgIk0zODQuOSAxOTMuOWMwLTQ3LjQtNTUuMi00NC4yLTk1LjQtMjkuOC0xLjMgMzkuNC0yLjUgODAuNy0zIDExOS44IC43IDIuOCAyLjYgNi4yIDE1LjEgNi4yIDM2LjggMCA4My40LTQyLjggODMuMy05Ni4yek0xOTAuNCAyNjYuMWMuMiAwIDYuNS0yLjcgMTEuMi0yLjcgMjYuNiAwIDIwLjcgNDQuMS0xNC40IDQ0LjEtMjEuNSAwLTM3LjEtMTguMS0zNy4xLTQzIDAtNDIgNDIuOS05NS42IDEwMC43LTEyNi41IDEtMTIuNCAzLTIyIDEwLjUtMjguMiAxMS4yLTkgMjYuNi0zLjUgMjkuNSAxMS4xIDcyLjItMjIuMiAxMzUuMiAxIDEzNS4yIDcyIDAgNzcuOS03OS4zIDE1Mi42LTE0MC4xIDEzOC4yLS4xIDM5LjQgLjkgNzQuNCAyLjcgMTAwbDAgLjJjLjIgMy40IC42IDEyLjUtNS4zIDE5LjEtOS42IDEwLjYtMzMuNCAxMC0zNi40LTIyLjMtNC4xLTQ0LjQgLjItMjA2LjEgMS40LTI0Mi41LTIxLjUgMTUtNTguNSA1MC4zLTU4LjUgNzUuOSAuMiAyLjUgLjQgNCAuNiA0LjZ6TTggMTgxLjFzLS4xIDM3LjQgMzguNCAzNy40bDMwIDAgMjIuNCAyMTcuMnMwIDQ0LjMgNDQuNyA0NC4zbDI4OC45IDBzNDQuNy0uNCA0NC43LTQ0LjNsMjIuNC0yMTcuMiAzMCAwczM4LjQgMS4yIDM4LjQtMzcuNGMwIDAgLjEtMzcuNC0zOC40LTM3LjRsLTMwLjEgMGMtNy4zLTI1LjYtMzAuMi03NC4zLTExOS40LTc0LjNsLTI4IDAgMC0xOS4xcy0yLjctMTguNC0yMS4xLTE4LjRsLTg1LjggMFMyMjQgMzEuOSAyMjQgNTAuM2wwIDE5LjEtMjguMSAwcy0xMDUgNC4yLTEyMC41IDc0LjNsLTI5IDBTOCAxNDIuNSA4IDE4MS4xeiJdCiAgICB9OwogICAgZmFXcGJlZ2lubmVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIndwYmVnaW5uZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjI5NyIsICJNNDYzLjIgMzIyLjRjNTYuMiA2NC4zIDQuMiAxNTcuNi05MS45IDE1Ny42LTM5LjYgMC03OC44LTE3LjctMTAwLjEtNTAtNi45IC40LTIyLjcgLjQtMjkuNiAwLTIxLjQgMzIuNC02MC42IDUwLTEwMC4xIDUwLTk1LjUgMC0xNDguMy05My05MS45LTE1Ny42LTc5LjEtMTMxLjkgMzEuMy0yOTAuNCAyMDYuOC0yOTAuNCAxNzUuNiAwIDI4NS45IDE1OC42IDIwNi44IDI5MC40em0tMzM5LjYtODNsNDEuNSAwIDAtNTguMS00MS41IDAgMCA1OC4xem0yMTcuMiA4Ni4xbDAtMjMuOGMtNjAuNSAyMC45LTEzMi40IDkuMi0xODcuNi0zNGwuMiAyNC45YzUxLjEgNDYuNCAxMzEuNyA1Ny45IDE4Ny4zIDMyLjl6TTE5MCAyMzkuNGwxNjYuMSAwIDAtNTguMS0xNjYuMSAwIDAgNTguMXoiXQogICAgfTsKICAgIGZhRGlhc3BvcmEgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZGlhc3BvcmEiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjc5MSIsICJNMjE5LjcgMzU0LjZjLTEuNCAwLTg4IDExOS45LTg4LjcgMTE5LjlTNDQuNCA0MTQgNDQgNDEzLjMgMTMwLjYgMjg3LjUgMTMwLjYgMjg1LjhjMC0yLjItMTI5LjYtNDQtMTM3LjYtNDcuMS0xLjMtLjUgMzEuNC0xMDEuOCAzMS43LTEwMi4xIC42LS43IDE0NC40IDQ3IDE0NS41IDQ3IC40IDAgLjktLjYgMS0xLjMgLjQtMiAxLTE0OC42IDEuNy0xNDkuNiAuOC0xLjIgMTA0LjUtLjcgMTA1LjEtLjMgMS41IDEgMy41IDE1Ni4xIDYuMSAxNTYuMSAxLjQgMCAxMzguNy00NyAxMzkuMy00Ni4zIC44IC45IDMxLjkgMTAyLjIgMzEuNSAxMDIuNi0uOSAuOS0xNDAuMiA0Ny4xLTE0MC42IDQ4LjgtLjMgMS40IDgyLjggMTIyLjEgODIuNSAxMjIuOXMtODUuNSA2My41LTg2LjMgNjMuNWMtMS0uMi04OS0xMjUuNS05MC45LTEyNS41bDAgMHoiXQogICAgfTsKICAgIGZhUHJvZHVjdEh1bnQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicHJvZHVjdC1odW50IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyODgiLCAiTTMyNi4zIDIxOC44YzAgMjAuNS0xNi43IDM3LjItMzcuMiAzNy4ybC03MC4zIDAgMC03NC40IDcwLjMgMGMyMC41IDAgMzcuMiAxNi43IDM3LjIgMzcuMnpNOCAyNTZhMjQ4IDI0OCAwIDEgMSA0OTYgMCAyNDggMjQ4IDAgMSAxIC00OTYgMHptMzY3LjktMzcuMmMwLTQ3LjktMzguOS04Ni44LTg2LjgtODYuOGwtMTE5LjkgMCAwIDI0OCA0OS42IDAgMC03NC40IDcwLjMgMGM0Ny45IDAgODYuOC0zOC45IDg2LjgtODYuOHoiXQogICAgfTsKICAgIGZhU3F1YXJlVXB3b3JrID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS11cHdvcmsiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTY3YyIsICJNNTYgMzJsMzM2IDBjMzAuOSAwIDU2IDI1LjEgNTYgNTZsMCAzMzZjMCAzMC45LTI1LjEgNTYtNTYgNTZMNTYgNDgwYy0zMC45IDAtNTYtMjUuMS01Ni01NkwwIDg4QzAgNTcuMSAyNS4xIDMyIDU2IDMyek0yNzAuOSAyNzQuMmM2LjYtNTIuOSAyNS45LTY5LjUgNTEuNC02OS41IDI1LjMgMCA0NC45IDIwLjIgNDQuOSA0OS43cy0xOS43IDQ5LjctNDQuOSA0OS43Yy0yNy45IDAtNDYuMy0yMS41LTUxLjQtMjkuOXptLTI2LjctNDEuOGMtOC4yLTE1LjUtMTQuMy0zNi4zLTE5LjItNTUuNmwtNjIuOSAwIDAgNzguMWMwIDI4LjQtMTIuOSA0OS40LTM4LjIgNDkuNFM4NC4xIDI4My40IDg0LjEgMjU1bC4zLTc4LjEtMzYuMiAwIDAgNzguMWMwIDIyLjggNy40IDQzLjUgMjAuOSA1OC4yIDEzLjkgMTUuMiAzMi44IDIzLjIgNTQuOCAyMy4yIDQzLjcgMCA3NC4yLTMzLjUgNzQuMi04MS41bDAtNTIuNWM0LjYgMTcuMyAxNS40IDUwLjUgMzYuMiA3OS43bC0xOS4zIDExMC41IDM2LjggMCAxMi44LTc4LjRjNC4yIDMuNSA4LjcgNi42IDEzLjQgOS40IDEyLjMgNy44IDI2LjQgMTIuMiA0MC45IDEyLjZsMy40IDBjNDUuMSAwIDgwLjktMzQuOSA4MC45LTgxLjlzLTM1LjktODIuMi04MC45LTgyLjJjLTQ1LjQgMC03MC45IDI5LjctNzguMSA2MC4xbDAgLjJ6Il0KICAgIH07CiAgICBmYUN1dHRsZWZpc2ggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY3V0dGxlZmlzaCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMzhjIiwgIk0zNDggMzA1LjVjLTE3LjUgMzEuNi01Ny40IDU0LjUtOTYgNTQuNS01Ni42IDAtMTA0LTQ3LjQtMTA0LTEwNHM0Ny40LTEwNCAxMDQtMTA0YzM4LjYgMCA3OC41IDIyLjkgOTYgNTQuNSAxMy43LTUwLjkgNDEuNy05My4zIDg3LTExNy44LTQ1LjMtNDkuNi0xMTAuNS04MC43LTE4My04MC43LTEzNyAwLTI0OCAxMTEtMjQ4IDI0OFMxMTUgNTA0IDI1MiA1MDRjNzIuNSAwIDEzNy43LTMxLjEgMTgzLTgwLjctNDUuMy0yNC41LTczLjMtNjYuOS04Ny0xMTcuOHoiXQogICAgfTsKICAgIGZhTWVkYXBwcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJtZWRhcHBzIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbXSwgImYzYzYiLCAiTTExOC4zIDIzOC40YzMuNS0xMi41IDYuOS0zMy42IDEzLjItMzMuNiA4LjMgMS44IDkuNiAyMy40IDE4LjYgMzYuNiA0LjYtMjMuNSA1LjMtODUuMSAxNC4xLTg2LjcgOS0uNyAxOS43IDY2LjUgMjIgNzcuNSA5LjkgNC4xIDQ4LjkgNi42IDQ4LjkgNi42IDEuOSA3LjMtMjQgNy42LTQwIDcuOC00LjYgMTQuOC01LjQgMjcuNy0xMS40IDI4LTQuNyAuMi04LjItMjguOC0xNy41LTQ5LjZsLTkuNCA2NS41Yy00LjQgMTMtMTUuNS0yMi41LTIxLjktMzkuMy0zLjMtLjEtNjIuNC0xLjYtNDcuNi03LjhsMzEtNXpNMjI4IDQ0OGMyMS4yIDAgMjEuMi0zMiAwLTMyTDkyIDQxNmMtMjEuMiAwLTIxLjIgMzIgMCAzMmwxMzYgMHptLTI0IDY0YzIxLjIgMCAyMS4yLTMyIDAtMzJsLTg4IDBjLTIxLjIgMC0yMS4yIDMyIDAgMzJsODggMHptMzQuMi0xNDEuNWMzLjItMTguOSA1LjItMzYuNCAxMS45LTQ4LjggNy45LTE0LjcgMTYuMS0yOC4xIDI0LTQxIDI0LjYtNDAuNCA0NS45LTc1LjIgNDUuOS0xMjUuNSAwLTg1LjYtNzEuOC0xNTUuMi0xNjAtMTU1LjJTMCA2OS42IDAgMTU1LjJjMCA1MC4yIDIxLjMgODUuMSA0NS45IDEyNS41IDcuOSAxMi45IDE2IDI2LjMgMjQgNDEgNi43IDEyLjUgOC43IDI5LjggMTEuOSA0OC45IDMuNSAyMSAzNi4xIDE1LjcgMzIuNi01LjEtMy42LTIxLjctNS42LTQwLjctMTUuMy01OC42LTMyLjYtNjAuNC02Ni4xLTk1LjYtNjYuMS0xNTEuNyAwLTY3LjkgNTctMTIzLjIgMTI3LTEyMy4yUzI4NyA4Ny4zIDI4NyAxNTUuMmMwIDU2LjEtMzMuNSA5MS4zLTY2LjEgMTUxLjYtOS43IDE4LTExLjcgMzcuNC0xNS4zIDU4LjYtMy40IDIwLjYgMjkgMjYuNCAzMi42IDUuMXoiXQogICAgfTsKICAgIGZhUGl4ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInBpeCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNDNhIiwgIk0yNDIuNCAyOTIuNWM1LjQtNS40IDE0LjctNS40IDIwLjEgMGw3NyA3N2MxNC4yIDE0LjIgMzMuMSAyMiA1My4xIDIybDE1LjEgMC05Ny4xIDk3LjFjLTMwLjMgMjkuNS03OS41IDI5LjUtMTA5LjggMGwtOTcuNS05Ny40IDkuMyAwYzIwIDAgMzguOS03LjggNTMuMS0yMmw3Ni43LTc2Ljd6bTIwLjEtNzMuNmMtNi40IDUuNS0xNC42IDUuNi0yMC4xIDBsLTc2LjctNzYuN2MtMTQuMi0xNS4xLTMzLjEtMjItNTMuMS0yMmwtOS4zIDAgOTcuNC05Ny40YzMwLjQtMzAuMyA3OS42LTMwLjMgMTA5LjkgMGw5Ny4yIDk3LjEtMTUuMiAwYy0yMCAwLTM4LjkgNy44LTUzLjEgMjJsLTc3IDc3ek0xMTIuNiAxNDIuN2MxMy44IDAgMjYuNSA1LjYgMzcuMSAxNS40bDc2LjcgNzYuN2M3LjIgNi4zIDE2LjYgMTAuOCAyNi4xIDEwLjggOS40IDAgMTguOC00LjUgMjYtMTAuOGw3Ny03N2M5LjgtOS43IDIzLjMtMTUuMyAzNy4xLTE1LjNsMzcuNyAwIDU4LjMgNTguM2MzMC4zIDMwLjMgMzAuMyA3OS41IDAgMTA5LjhsLTU4LjMgNTguMy0zNy43IDBjLTEzLjggMC0yNy4zLTUuNi0zNy4xLTE1LjRsLTc3LTc3Yy0xMy45LTEzLjktMzguMi0xMy45LTUyLjEgLjFsLTc2LjcgNzYuNmMtMTAuNiA5LjgtMjMuMyAxNS40LTM3LjEgMTUuNGwtMzEuOCAwLTU4LTU4Yy0zMC4zLTMwLjMtMzAuMy03OS41IDAtMTA5LjhsNTgtNTguMSAzMS44IDB6Il0KICAgIH07CiAgICBmYVNxdWFyZVR1bWJsciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtdHVtYmxyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInR1bWJsci1zcXVhcmUiXSwgImYxNzQiLCAiTTQ0OCA5NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwek0yNTYuOCA0MTZjLTc1LjUgMC05MS45LTU1LjUtOTEuOS04Ny45bDAtOTAtMjkuNyAwYy0zLjQgMC02LjItMi44LTYuMi02LjJsMC00Mi41YzAtNC41IDIuOC04LjUgNy4xLTEwIDM4LjgtMTMuNyA1MC45LTQ3LjUgNTIuNy03My4yIC41LTYuOSA0LjEtMTAuMiAxMC0xMC4ybDQ0LjMgMGMzLjQgMCA2LjIgMi44IDYuMiA2LjJsMCA3MiA1MS45IDBjMy40IDAgNi4yIDIuOCA2LjIgNi4ybDAgNTEuMWMwIDMuNC0yLjggNi4yLTYuMiA2LjJsLTUyLjEgMCAwIDgzLjNjMCAyMS40IDE0LjggMzMuNSA0Mi41IDIyLjQgMy0xLjIgNS42LTIgOC0xLjQgMi4yIC41IDMuNiAyLjEgNC42IDQuOUwzMTggMzg3LjFjMSAzLjIgMiA2LjctLjMgOS4xLTguNSA5LjEtMzEuMiAxOS44LTYwLjkgMTkuOHoiXQogICAgfTsKICAgIGZhVHVtYmxyU3F1YXJlID0gZmFTcXVhcmVUdW1ibHI7CiAgICBmYVJlYWN0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInJlYWN0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0MWIiLCAiTTQxOC4yIDE3Ny4yYy01LjQtMS44LTEwLjgtMy41LTE2LjItNS4xIC45LTMuNyAxLjctNy40IDIuNS0xMS4xIDEyLjMtNTkuNiA0LjItMTA3LjUtMjMuMS0xMjMuMy0yNi4zLTE1LjEtNjkuMiAuNi0xMTIuNiAzOC40LTQuMyAzLjctOC41IDcuNi0xMi41IDExLjUtMi43LTIuNi01LjUtNS4yLTguMy03LjctNDUuNS00MC40LTkxLjEtNTcuNC0xMTguNC00MS41LTI2LjIgMTUuMi0zNCA2MC4zLTIzIDExNi43IDEuMSA1LjYgMi4zIDExLjEgMy43IDE2LjctNi40IDEuOC0xMi43IDMuOC0xOC42IDUuOS01My40IDE4LjUtOTEuNyA0Ny43LTkxLjcgNzcuOSAwIDMxLjIgNDAuOCA2Mi41IDk2LjMgODEuNSA0LjUgMS41IDkgMyAxMy42IDQuMy0xLjUgNi0yLjggMTEuOS00IDE4LTEwLjUgNTUuNS0yLjMgOTkuNSAyMy45IDExNC42IDI3IDE1LjYgNzIuNC0uNCAxMTYuNi0zOS4xIDMuNS0zLjEgNy02LjMgMTAuNS05LjcgNC40IDQuMyA5IDguNCAxMy42IDEyLjQgNDIuOCAzNi44IDg1LjEgNTEuNyAxMTEuMiAzNi42IDI3LTE1LjYgMzUuOC02Mi45IDI0LjQtMTIwLjUtLjktNC40LTEuOS04LjktMy0xMy41IDMuMi0uOSA2LjMtMS45IDkuNC0yLjkgNTcuNy0xOS4xIDk5LjUtNTAgOTkuNS04MS43IDAtMzAuMy0zOS40LTU5LjctOTMuOC03OC40ek0yODIuOSA5Mi4zYzM3LjItMzIuNCA3MS45LTQ1LjEgODcuNy0zNiAxNi45IDkuNyAyMy40IDQ4LjkgMTIuOCAxMDAuNC0uNyAzLjQtMS40IDYuNy0yLjMgMTAtMjIuMi01LTQ0LjctOC42LTY3LjMtMTAuNi0xMy0xOC42LTI3LjItMzYuNC00Mi42LTUzLjEgMy45LTMuNyA3LjctNy4yIDExLjctMTAuN3pNMTY3LjIgMzA3LjVjNS4xIDguNyAxMC4zIDE3LjQgMTUuOCAyNS45LTE1LjYtMS43LTMxLjEtNC4yLTQ2LjQtNy41IDQuNC0xNC40IDkuOS0yOS4zIDE2LjMtNDQuNSA0LjYgOC44IDkuMyAxNy41IDE0LjMgMjYuMXpNMTM2LjkgMTg3LjJjMTQuNC0zLjIgMjkuNy01LjggNDUuNi03LjgtNS4zIDguMy0xMC41IDE2LjgtMTUuNCAyNS40LTQuOSA4LjUtOS43IDE3LjItMTQuMiAyNi02LjMtMTQuOS0xMS42LTI5LjUtMTYtNDMuNnptMjcuNCA2OC45YzYuNi0xMy44IDEzLjgtMjcuMyAyMS40LTQwLjZzMTUuOC0yNi4yIDI0LjQtMzguOWMxNS0xLjEgMzAuMy0xLjcgNDUuOS0xLjdzMzEgLjYgNDUuOSAxLjdjOC41IDEyLjYgMTYuNiAyNS41IDI0LjMgMzguN3MxNC45IDI2LjcgMjEuNyA0MC40Yy02LjcgMTMuOC0xMy45IDI3LjQtMjEuNiA0MC44LTcuNiAxMy4zLTE1LjcgMjYuMi0yNC4yIDM5LTE0LjkgMS4xLTMwLjQgMS42LTQ2LjEgMS42cy0zMC45LS41LTQ1LjYtMS40Yy04LjctMTIuNy0xNi45LTI1LjctMjQuNi0zOXMtMTQuOC0yNi44LTIxLjUtNDAuNnptMTgwLjYgNTEuMmM1LjEtOC44IDkuOS0xNy43IDE0LjYtMjYuNyA2LjQgMTQuNSAxMiAyOS4yIDE2LjkgNDQuMy0xNS41IDMuNS0zMS4yIDYuMi00NyA4IDUuNC04LjQgMTAuNS0xNyAxNS41LTI1LjZ6bTE0LjQtNzYuNWMtNC43LTguOC05LjUtMTcuNi0xNC41LTI2LjItNC45LTguNS0xMC0xNi45LTE1LjMtMjUuMiAxNi4xIDIgMzEuNSA0LjcgNDUuOSA4LTQuNiAxNC44LTEwIDI5LjItMTYuMSA0My40ek0yNTYuMiAxMTguM2MxMC41IDExLjQgMjAuNCAyMy40IDI5LjYgMzUuOC0xOS44LS45LTM5LjctLjktNTkuNSAwIDkuOC0xMi45IDE5LjktMjQuOSAyOS45LTM1Ljh6TTE0MC4yIDU3YzE2LjgtOS44IDU0LjEgNC4yIDkzLjQgMzkgMi41IDIuMiA1IDQuNiA3LjYgNy0xNS41IDE2LjctMjkuOCAzNC41LTQyLjkgNTMuMS0yMi42IDItNDUgNS41LTY3LjIgMTAuNC0xLjMtNS4xLTIuNC0xMC4zLTMuNS0xNS41LTkuNC00OC40LTMuMi04NC45IDEyLjYtOTR6TTExNS43IDMyMC42Yy00LjItMS4yLTguMy0yLjUtMTIuNC0zLjktMjEuMy02LjctNDUuNS0xNy4zLTYzLTMxLjItMTAuMS03LTE2LjktMTcuOC0xOC44LTI5LjkgMC0xOC4zIDMxLjYtNDEuNyA3Ny4yLTU3LjYgNS43LTIgMTEuNS0zLjggMTcuMy01LjUgNi44IDIxLjcgMTUgNDMgMjQuNSA2My42LTkuNiAyMC45LTE3LjkgNDIuNS0yNC44IDY0LjV6bTExNi42IDk4Yy0xNi41IDE1LjEtMzUuNiAyNy4xLTU2LjQgMzUuMy0xMS4xIDUuMy0yMy45IDUuOC0zNS4zIDEuMy0xNS45LTkuMi0yMi41LTQ0LjUtMTMuNS05MiAxLjEtNS42IDIuMy0xMS4yIDMuNy0xNi43IDIyLjQgNC44IDQ1IDguMSA2Ny45IDkuOCAxMy4yIDE4LjcgMjcuNyAzNi42IDQzLjIgNTMuNC0zLjIgMy4xLTYuNCA2LjEtOS42IDguOXptMjQuNS0yNC4zYy0xMC4yLTExLTIwLjQtMjMuMi0zMC4zLTM2LjMgOS42IC40IDE5LjUgLjYgMjkuNSAuNiAxMC4zIDAgMjAuNC0uMiAzMC40LS43LTkuMiAxMi43LTE5LjEgMjQuOC0yOS42IDM2LjR6bTEzMC43IDMwYy0uOSAxMi4yLTYuOSAyMy42LTE2LjUgMzEuMy0xNS45IDkuMi00OS44LTIuOC04Ni40LTM0LjItNC4yLTMuNi04LjQtNy41LTEyLjctMTEuNSAxNS4zLTE2LjkgMjkuNC0zNC44IDQyLjItNTMuNiAyMi45LTEuOSA0NS43LTUuNCA2OC4yLTEwLjUgMSA0LjEgMS45IDguMiAyLjcgMTIuMiA0LjkgMjEuNiA1LjcgNDQuMSAyLjUgNjYuM3ptMTguMi0xMDcuNWMtMi44IC45LTUuNiAxLjgtOC41IDIuNi03LTIxLjgtMTUuNi00My4xLTI1LjUtNjMuOCA5LjYtMjAuNCAxNy43LTQxLjQgMjQuNS02Mi45IDUuMiAxLjUgMTAuMiAzLjEgMTUgNC43IDQ2LjYgMTYgNzkuMyAzOS44IDc5LjMgNTggMCAxOS42LTM0LjkgNDQuOS04NC44IDYxLjR6TTI1NiAzMDEuOGE0NS44IDQ1LjggMCAxIDAgMC05MS42IDQ1LjggNDUuOCAwIDEgMCAwIDkxLjZ6Il0KICAgIH07CiAgICBmYUp4bCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJqeGwiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTY3YiIsICJNNDEyLjIgMzJMMzUuOCAzMkMxNiAzMiAwIDQ4IDAgNjcuOEwwIDQ0NC4yQzAgNDY0IDE2IDQ4MCAzNS44IDQ4MGwzNzYuNCAwYzE5LjggMCAzNS44LTE2IDM1LjgtMzUuOGwwLTM3Ni40QzQ0OCA0OCA0MzIgMzIgNDEyLjIgMzJ6TTM3OC42IDMzMy43YzAgNDAuMi0zMi42IDcyLjgtNzIuOCA3Mi44bC0yMzUuNiAwYzAtNDAuMiAzMi42LTcyLjggNzIuOC03Mi44bDIzNS42IDB6bTAtMTEzLjljMCA0MC4yLTMyLjYgNzIuOC03Mi44IDcyLjhsLTIzNS42IDBjMC00MC4yIDMyLjYtNzIuOCA3Mi44LTcyLjhsMjM1LjYgMHptMC0xMTMuOWMwIDQwLjItMzIuNiA3Mi44LTcyLjggNzIuOGwtMjM1LjYgMGMwLTQwLjIgMzIuNi03Mi44IDcyLjgtNzIuOGwyMzUuNiAweiJdCiAgICB9OwogICAgZmFTcXVhcmVMaW5rZWRpbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtbGlua2VkaW4iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTdkMCIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnptNSAxNzAuMmw2Ni41IDAgMCAyMTMuOC02Ni41IDAgMC0yMTMuOHptNzEuNy02Ny43YTM4LjUgMzguNSAwIDEgMSAtNzcgMCAzOC41IDM4LjUgMCAxIDEgNzcgMHpNMzE3LjkgNDE2bDAtMTA0YzAtMjQuOC0uNS01Ni43LTM0LjUtNTYuNy0zNC42IDAtMzkuOSAyNy0zOS45IDU0LjlsMCAxMDUuOC02Ni40IDAgMC0yMTMuOCA2My43IDAgMCAyOS4yIC45IDBjOC45LTE2LjggMzAuNi0zNC41IDYyLjktMzQuNSA2Ny4yIDAgNzkuNyA0NC4zIDc5LjcgMTAxLjlsMCAxMTcuMi02Ni40IDB6Il0KICAgIH07CiAgICBmYUNzcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjc3MiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTZhMiIsICJNMzc2LjMgMzJMMCAzMiAwIDQwOC4zYzAgMTkgNy42IDM3LjIgMjEgNTAuN3MzMS43IDIxIDUwLjcgMjFsMzA0LjYgMGMxOSAwIDM3LjItNy42IDUwLjctMjFzMjEtMzEuNyAyMS01MC43bDAtMzA0LjZjMC0xOS03LjYtMzcuMi0yMS01MC43cy0zMS43LTIxLTUwLjctMjF6TTMzMi40IDQzMS40Yy03LjctOC41LTExLjctMjAuNy0xMi0zNi42bDMxLjMgMGMuMiAxNC4xIDUuMSAyMS4xIDE0LjggMjEuMWM0LjkgMCA4LjQtMS42IDEwLjUtNC43YzItMy4xIDMtOCAzLTE0LjhjMC01LjQtMS4zLTkuOS00LTEzLjRjLTMuNS00LjItOC4xLTcuNS0xMy4yLTkuNUwzNTEuMiAzNjhjLTEwLjMtNC45LTE3LjgtMTAuOC0yMi41LTE3LjZjLTQuNS02LjgtNi43LTE2LjMtNi43LTI4LjRjMC0xMy42IDQtMjQuNiAxMS44LTMzLjFjOC4xLTguNSAxOS4xLTEyLjcgMzMuMi0xMi43YzEzLjYgMCAyNC4xIDQuMiAzMS41IDEyLjVjNy41IDguNCAxMS41IDIwLjMgMTEuOCAzNS45bC0zMC4xIDBjLjItNS4xLS45LTEwLjItMy0xNC44Yy0xLjctMy40LTUtNS4xLTEwLTUuMWMtOC44IDAtMTMuMiA1LjItMTMuMiAxNS43YzAgNS4zIDEuMSA5LjQgMy4yIDEyLjZjMy4xIDMuNSA3IDYuMiAxMS40IDcuOGwxMS4xIDQuOWMxMS41IDUuMyAxOS43IDExLjcgMjQuOCAxOS40YzUuMSA3LjcgNy42IDE4IDcuNiAzMWMwIDE1LjUtNCAyNy40LTEyLjMgMzUuN2MtOC4yIDguMy0xOS41IDEyLjUtMzQuMSAxMi41cy0yNS42LTQuMi0zMy40LTEyLjd6bS0xMDEgMGMtNy43LTguNS0xMS43LTIwLjctMTItMzYuNmwzMS4zIDBjLjIgMTQuMSA1LjEgMjEuMSAxNC44IDIxLjFjNC45IDAgOC40LTEuNiAxMC40LTQuN2MyLTMuMSAzLTggMy0xNC44YzAtNS40LTEuMy05LjktMy45LTEzLjRjLTMuNS00LjItOC4xLTcuNS0xMy4yLTkuNUwyNTAuMiAzNjhjLTEwLjMtNC45LTE3LjgtMTAuOC0yMi41LTE3LjZjLTQuNS02LjgtNi43LTE2LjMtNi43LTI4LjRjMC0xMy42IDQtMjQuNiAxMS44LTMzLjFjOC4xLTguNSAxOS4xLTEyLjcgMzMuMi0xMi43YzEzLjYgMCAyNC4xIDQuMiAzMS40IDEyLjVjNy42IDguNCAxMS41IDIwLjMgMTEuOSAzNS45bC0zMC4xIDBjLjItNS4xLS45LTEwLjItMy0xNC44Yy0xLjctMy40LTUtNS4xLTEwLTUuMWMtOC44IDAtMTMuMiA1LjItMTMuMiAxNS43YzAgNS4zIDEuMSA5LjQgMy4yIDEyLjZjMy4xIDMuNSA3IDYuMiAxMS40IDcuOGwxMS4xIDQuOWMxMS41IDUuMyAxOS43IDExLjcgMjQuOCAxOS40YzUuMSA3LjcgNy42IDE4IDcuNiAzMWMwIDE1LjUtNC4xIDI3LjQtMTIuMyAzNS43cy0xOS41IDEyLjUtMzQuMSAxMi41cy0yNS42LTQuMi0zMy40LTEyLjd6bS0xMDUuNiAxLjFjLTguNC03LjctMTIuNS0xOS4yLTEyLjUtMzQuNWwwLTc1LjRjMC0xNS4yIDQuNC0yNi43IDEzLjItMzQuNmM4LjktNy44IDIwLjctMTEuOCAzNS4yLTExLjhjMTQuMSAwIDI1LjIgNCAzMy40IDEyYzguMyA4IDEyLjUgMjAgMTIuNSAzNS45bDAgNi0zMy4xIDAgMC01LjhjMC02LjEtMS4zLTEwLjctNC0xMy42Yy0xLjEtMS41LTIuNi0yLjctNC4zLTMuNXMtMy41LTEuMi01LjQtMS4xYy01LjQgMC05LjIgMS44LTExLjQgNS42Yy0yLjMgNS4yLTMuMyAxMC44LTMgMTYuNGwwIDY1LjVjMCAxMy43IDQuOCAyMC42IDE0LjQgMjAuOGM0LjUgMCA3LjktMS42IDEwLjItNC44YzIuNS00LjEgMy43LTguOCAzLjUtMTMuNmwwLTQuOSAzMy4xIDAgMCA1LjFjMCAxMC42LTIuMSAxOS41LTYuMiAyNi42Yy00IDYuOS05LjkgMTIuNS0xNy4xIDE2Yy03LjcgMy43LTE2LjEgNS41LTI0LjYgNS4zYy0xNC4yIDAtMjUuNS0zLjktMzMuOC0xMS42eiJdCiAgICB9OwogICAgZmFIYXNobm9kZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJoYXNobm9kZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNDk5IiwgIk0zNS43IDE3MS4xYy00Ni45IDQ2LTQ2LjkgMTIyLjkgMCAxNjkuOEwxNzEuNiA0NzYuOGM0NiA0Ni45IDEyMi45IDQ2LjkgMTY5LjggMEw0NzcuMyAzNDAuOWM0Ni45LTQ2LjkgNDYuOS0xMjMuOCAwLTE2OS44TDM0MS40IDM1LjJjLTQ2LjktNDYuOS0xMjMuOC00Ni45LTE2OS44IDBMMzUuNyAxNzEuMXpNMTk2IDE5Ni41YTg0LjUgODQuNSAwIDEgMSAxMjAgMTE5IDg0LjUgODQuNSAwIDEgMSAtMTIwLTExOXoiXQogICAgfTsKICAgIGZhUmVkZGl0QWxpZW4gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicmVkZGl0LWFsaWVuIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyODEiLCAiTTM3MyAxMzguNmMtMjUuMiAwLTQ2LjMtMTcuNS01MS45LTQxLTMwLjYgNC4zLTU0LjIgMzAuNy01NC4yIDYyLjRsMCAuMmM0Ny40IDEuOCA5MC42IDE1LjEgMTI0LjkgMzYuMyAxMi42LTkuNyAyOC40LTE1LjUgNDUuNS0xNS41IDQxLjMgMCA3NC43IDMzLjQgNzQuNyA3NC43IDAgMjkuOC0xNy40IDU1LjUtNDIuNyA2Ny41LTIuNCA4Ni44LTk3IDE1Ni42LTIxMy4yIDE1Ni42UzQ1LjUgNDEwLjEgNDMgMzIzLjRjLTI1LjQtMTEuOS00My0zNy43LTQzLTY3LjcgMC00MS4zIDMzLjQtNzQuNyA3NC43LTc0LjcgMTcuMiAwIDMzIDUuOCA0NS43IDE1LjYgMzQtMjEuMSA3Ni44LTM0LjQgMTIzLjctMzYuNGwwLS4zYzAtNDQuMyAzMy43LTgwLjkgNzYuOC04NS41IDQuOS0yNC4yIDI2LjMtNDIuNCA1Mi4xLTQyLjQgMjkuNCAwIDUzLjMgMjMuOSA1My4zIDUzLjNzLTIzLjkgNTMuMy01My4zIDUzLjN6TTE1Ny41IDI1NS4zYy0yMC45IDAtMzguOSAyMC44LTQwLjIgNDcuOXMxNy4xIDM4LjEgMzggMzguMSAzNi42LTkuOCAzNy44LTM2LjktMTQuNy00OS4xLTM1LjctNDkuMWwuMSAwek0zOTUgMzAzLjFjLTEuMi0yNy4xLTE5LjItNDcuOS00MC4yLTQ3LjlzLTM2LjkgMjItMzUuNyA0OS4xIDE2LjkgMzYuOSAzNy44IDM2LjkgMzkuMy0xMSAzOC0zOC4xbC4xIDB6bS02MC4xIDcwLjhjMS41LTMuNi0xLTcuNy00LjktOC4xLTIzLTIuMy00Ny45LTMuNi03My44LTMuNnMtNTAuOCAxLjMtNzMuOCAzLjZjLTMuOSAuNC02LjQgNC41LTQuOSA4LjEgMTIuOSAzMC44IDQzLjMgNTIuNCA3OC43IDUyLjRzNjUuOC0yMS42IDc4LjctNTIuNHoiXQogICAgfTsKICAgIGZhVGlrdG9rID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInRpa3RvayIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlMDdiIiwgIk00NDguNSAyMDkuOWMtNDQgLjEtODctMTMuNi0xMjIuOC0zOS4ybDAgMTc4LjdjMCAzMy4xLTEwLjEgNjUuNC0yOSA5Mi42cy00NS42IDQ4LTc2LjYgNTkuNi02NC44IDEzLjUtOTYuOSA1LjMtNjAuOS0yNS45LTgyLjctNTAuOC0zNS4zLTU2LTM5LTg4LjkgMi45LTY2LjEgMTguNi05NS4yIDQwLTUyLjcgNjkuNi02Ny43IDYyLjktMjAuNSA5NS43LTE2bDAgODkuOWMtMTUtNC43LTMxLjEtNC42LTQ2IC40cy0yNy45IDE0LjYtMzcgMjcuMy0xNCAyOC4xLTEzLjkgNDMuOSA1LjIgMzEgMTQuNSA0My43IDIyLjQgMjIuMSAzNy40IDI2LjkgMzEuMSA0LjggNDYtLjEgMjgtMTQuNCAzNy4yLTI3LjEgMTQuMi0yOC4xIDE0LjItNDMuOGwwLTM0OS40IDg4IDBjLS4xIDcuNCAuNiAxNC45IDEuOSAyMi4yIDMuMSAxNi4zIDkuNCAzMS45IDE4LjcgNDUuN3MyMS4zIDI1LjYgMzUuMiAzNC42YzE5LjkgMTMuMSA0My4yIDIwLjEgNjcgMjAuMWwwIDg3LjR6Il0KICAgIH07CiAgICBmYVdvcmRwcmVzcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ3b3JkcHJlc3MiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjE5YSIsICJNNjEuNyAxNjkuNGwxMDEuNSAyNzhjLTcxLTM0LjQtMTE5LjktMTA3LjItMTE5LjktMTkxLjQgMC0zMC45IDYuNi02MC4xIDE4LjQtODYuNnptMzM3LjkgNzUuOWMwLTI2LjMtOS40LTQ0LjUtMTcuNS01OC43LTEwLjgtMTcuNS0yMC45LTMyLjQtMjAuOS00OS45IDAtMTkuNiAxNC44LTM3LjggMzUuNy0zNy44IC45IDAgMS44IC4xIDIuOCAuMi0zNy45LTM0LjctODguMy01NS45LTE0My43LTU1LjktNzQuMyAwLTEzOS43IDM4LjEtMTc3LjggOTUuOSA1IC4yIDkuNyAuMyAxMy43IC4zIDIyLjIgMCA1Ni43LTIuNyA1Ni43LTIuNyAxMS41LS43IDEyLjggMTYuMiAxLjQgMTcuNSAwIDAtMTEuNSAxLjMtMjQuMyAybDc3LjUgMjMwLjQgNDYuNi0xMzkuNi0zMy4xLTkwLjhjLTExLjUtLjctMjIuMy0yLTIyLjMtMi0xMS41LS43LTEwLjEtMTguMiAxLjMtMTcuNSAwIDAgMzUuMSAyLjcgNTYgMi43IDIyLjIgMCA1Ni43LTIuNyA1Ni43LTIuNyAxMS41LS43IDEyLjggMTYuMiAxLjQgMTcuNSAwIDAtMTEuNSAxLjMtMjQuMyAybDc2LjkgMjI4LjcgMjEuMi03MC45YzktMjkuNCAxNi01MC41IDE2LTY4Ljd6TTI1OS43IDI3NC42TDE5NS45IDQ2MC4xYzE5LjEgNS42IDM5LjIgOC43IDYwLjEgOC43IDI0LjggMCA0OC41LTQuMyA3MC42LTEyLjEtLjYtLjktMS4xLTEuOS0xLjUtMi45TDI1OS43IDI3NC42em0xODMtMTIwLjdjLjkgNi44IDEuNCAxNCAxLjQgMjEuOSAwIDIxLjYtNCA0NS44LTE2LjIgNzYuMmwtNjUgMTg3LjljNjMuMy0zNi45IDEwNS44LTEwNS40IDEwNS44LTE4My45IDAtMzctOS40LTcxLjgtMjYtMTAyLjF6TTggMjU2YTI0OCAyNDggMCAxIDEgNDk2IDAgMjQ4IDI0OCAwIDEgMSAtNDk2IDB6bTQ4NC42IDBhMjM2LjYgMjM2LjYgMCAxIDAgLTQ3My4yIDAgMjM2LjYgMjM2LjYgMCAxIDAgNDczLjIgMHoiXQogICAgfTsKICAgIGZhSWRlYWwgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaWRlYWwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTAxMyIsICJNOTMuOCAxNjUuNWE0OS4xIDQ5LjEgMCAxIDAgMCA5OC4xIDQ5LjEgNDkuMSAwIDEgMCAwLTk4LjF6TTU0LjMgNDI1LjhsNzguOSAwIDAtMTQwLjUtNzguOSAwIDAgMTQwLjV6TTIwNS44IDIxNC4yYzAtMjAtMTAtMjIuNS0xOC43LTIyLjVsLTE0IDAgMCA0NS44IDE0IDBjOS43IDAgMTguNy0yLjggMTguNy0yMy4zem0yMDEuNyA0NmwwLTkxLjMgMjIuOCAwIDAgNjguNiAzMy43IDBDNDU0LjYgMTEzLjEgMzU2LjggODYuMiAyNjcuOCA4Ni4ybC05NC44IDAgMCA4Mi44IDE0IDBjMjUuNiAwIDQxLjUgMTcuNCA0MS41IDQ1LjMgMCAyOC44LTE1LjUgNDYtNDEuNSA0NmwtMTQgMCAwIDE2NS42IDk0LjggMGMxNDQuNiAwIDE5NC45LTY3LjIgMTk2LjctMTY1LjZsLTU3LjEgMHptLTEwOS44IDBsLTU2LjIgMCAwLTkxLjIgNTQuNCAwIDAgMjIuNy0zMS43IDAgMCAxMC42IDMwIDAgMCAyMi43LTMwIDAgMCAxMi41IDMzLjUgMCAwIDIyLjd6bTc0LjcgMGwtNS4yLTE3LjctMjkuNyAwLTUuMiAxNy43LTIzLjcgMCAyNy41LTkxLjMgMzIuMyAwIDI3LjUgOTEuMy0yMy43IDB6TTI2Ny44IDMyTC4xIDMyIC4xIDQ4MCAyNjcuOCA0ODBjMTYxLjggMCAyNTEtNzkuNyAyNTEtMjI0LjUgMC04My41LTMyLjYtMjIzLjUtMjUxLTIyMy41em0wIDQyNi45bC0yNDYuNiAwIDAtNDA1LjkgMjQ2LjYgMGMxNDIuMSAwIDIyOS45IDY0LjYgMjI5LjkgMjAyLjQgMCAxMzQuMS04MSAyMDMuNC0yMjkuOSAyMDMuNHptODMuOS0yNjQuOWwtNy41IDI1LjggMTYuNCAwLTcuNS0yNS44LTEuNCAweiJdCiAgICB9OwogICAgZmFQaWVkUGlwZXJQcCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwaWVkLXBpcGVyLXBwIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYxYTciLCAiTTIwNS4zIDE3NC42YzAgMjEuMS0xNC4yIDM4LjEtMzEuNyAzOC4xLTcuMSAwLTEyLjgtMS4yLTE3LjItMy43bDAtNjhjNC40LTIuNyAxMC4xLTQuMiAxNy4yLTQuMiAxNy41IDAgMzEuNyAxNi45IDMxLjcgMzcuOHptNTIuNiA2N2MtNy4xIDAtMTIuOCAxLjUtMTcuMiA0LjJsMCA2OGM0LjQgMi41IDEwLjEgMy43IDE3LjIgMy43IDE3LjQgMCAzMS43LTE2LjkgMzEuNy0zNy44IDAtMjEuMS0xNC4zLTM4LjEtMzEuNy0zOC4xek00NDggODBsMCAzNTJjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNDgwYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDgwQzAgNTMuNSAyMS41IDMyIDQ4IDMybDM1MiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4ek0xODUgMjU1LjFjNDEgMCA3NC4yLTM1LjYgNzQuMi03OS42UzIyNiA5NS45IDE4NSA5NS45Yy0xMiAwLTI0LjEgMy4yLTM0LjYgOC44bC00NS43IDAgMCAyMDYuMyA1MS44LTEwLjEgMC01MC42YzguNiAzLjEgMTguMSA0LjggMjguNSA0Ljh6bTE1OC40IDI1LjNjMC00NC0zMy4yLTc5LjYtNzMuOS03OS42LTMuMiAwLTYuNCAuMi05LjYgLjctMy43IDEyLjUtMTAuMSAyMy44LTE5LjIgMzMuNC0xMy44IDE1LTMyLjIgMjMuOC01MS44IDI0LjhsMCAxNTYuMyA1MS44LTEwLjEgMC01MC42YzguNiAzLjIgMTguMiA0LjcgMjguNyA0LjcgNDAuOCAwIDc0LTM1LjYgNzQtNzkuNnoiXQogICAgfTsKICAgIGZhVXNzdW5uYWggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidXNzdW5uYWgiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjQwNyIsICJNNDk2LjkgMjY4LjFjMCA2My45LTI1LjQgMTI1LjItNzAuNiAxNzAuM1MzMTkuOSA1MDkgMjU2IDUwOSAxMzAuOCA0ODMuNSA4NS43IDQzOC40IDE1LjEgMzMxLjkgMTUuMSAyNjhjMC02My45IDI1LjQtMTI1LjIgNzAuNi0xNzAuNFMxOTIuMiAyNy4xIDI1Ni4xIDI3LjEgMzgxLjMgNTIuNCA0MjYuNSA5Ny42IDQ5NyAyMDQuMSA0OTcgMjY4bC0uMSAuMXpNMzkuNSAyNjhjLS42IDI4LjggNC41IDU3LjUgMTUuMSA4NC4zczI2LjQgNTEuMiA0Ni42IDcxLjggNDQuMiAzNyA3MC44IDQ4LjEgNTUuMSAxNi45IDgzLjkgMTYuOSA1Ny40LTUuOCA4My45LTE2LjkgNTAuNi0yNy41IDcwLjgtNDguMSAzNi00NSA0Ni42LTcxLjggMTUuNy01NS41IDE1LjEtODQuM2MuNi0yOC44LTQuNS01Ny41LTE1LjEtODQuM3MtMjYuNC01MS4yLTQ2LjYtNzEuOC00NC4yLTM3LTcwLjgtNDguMS01NS4xLTE2LjktODMuOS0xNi45LTU3LjQgNS44LTgzLjkgMTYuOS01MC42IDI3LjUtNzAuOCA0OC4xLTM2IDQ1LTQ2LjYgNzEuOC0xNS43IDU1LjUtMTUuMSA4NC4zem0zODUuOSA2My4zYy0xMi43IDAtMjEuNi0xLjktMjYuNy01LjktNS41LTQuMy04LjItMTIuMy04LjItMjMuOGwwLTk2LjVjMC02LjUtNS4yLTIwLjItMTUuNy00MS4yIDcgMCAxNy05LjEgMzAtMjcuMmwwIDE0Ny44YzAgMTEgMi40IDE5LjQgNyAyNS4zIDMuNyA0LjcgMTAuMSA4LjkgMTkgMTIuNiAxLjIgLjQgMi42IC45IDQuMSAxLjQgMi45IC45IDYuMyAyLjEgMTAuMyAzLjUtMS44IDIuNy04LjMgNC0xOS45IDRsLjEgMHptLTIxOSAwYy0xLjMgMi40LTMuNiA1LjUtNi44IDkuNGwtMTguNSAyMi41Yy0xLTYuMS00LTEzLTkuMy0yMC42cy05LjctMTEuNC0xMy40LTExLjRsLTg5LjggMGMzLjMtNS4zIDQuOS04LjggNC45LTEwLjhzLS44LTUuMy0yLjQtOS43Yy0xLjUtNC40LTIuNC04LjUtMi40LTEyLjQgMC03LjQgMi4xLTEzLjkgNi4zLTE5LjNsMjAtMjUuNi03LjEtMTcuNyAxNi4xLTE5LjggNi43IDE2LjggOC0xMC4zYy0xLjggNi40LTIuNiAxMi4zLTIuNiAxNy43IDAgNC4yIDIuOCAxMy4zIDguMyAyNy4zbDE2LjIgNDAuNyAxNy43IDBjMi44IC40IDcuNyA1IDE0LjYgMTMuOSAxLjggMi40IDQuMyA1LjggNy43IDEwLjIgMS40IDEuOSAyLjkgMy45IDQuNiA2LjEgMS4zLTIuMyAyLTQuNiAyLTcuMSAwLTItMS4zLTYuNi00LTEzLjRMMTc4IDMwNC4xYy00LTEwLjYtNi4xLTE3LjctNi4xLTIxLjMgMC02LjMgMS45LTEyLjMgNS44LTE3LjkgLjUtLjYgMS0xLjMgMS41LTEuOSA0LjQtNS42IDguOC0xMS4xIDEzLjMtMTYuNS0xLjEgNC42LTEuNyA4LjctMS43IDEyIDAgMy43IDEuNyA5LjkgNS4xIDE4LjhsNy45IDIwLjRjMS45IDQuNyAzIDguMiAzLjcgMTAuM2wyNS45IDAtLjktMi42Yy0xLjQtMy45LTQtNy03LjctOS4zbDE1LjYtMjAuMSAxMi4zIDMyIDEzLjQgMC02LjEtMTUuOGMtMS41LTMuOS00LTctNy43LTkuM2wxNS43LTIwLjEgMTcuMyA0NS4yIDEzLjQgMC0xMS40LTI5LjRjLTEuNS0zLjktNC03LTcuNy05LjNsMTUuNi0yMCAyMi40IDU4LjcgMjYuMiAwYzEuNSAwIDMtMS4xIDQuNS0zLjFzMi4yLTQuMSAyLjItNi4zbDAtOTMuNWMwLTYuNS00LjUtMjAuMy0xMy43LTQxLjIgNS40IDAgMTQuMS05LjEgMjYuMi0yNy4ybDAgMTYzLjVjMCA3LjIgLjYgMTIgMS43IDE0LjYgMS42IDMuNCA1LjMgNi4yIDExLjEgOC4yLTMuOSA1LjYtOC43IDguNS0xNC41IDguNWwtMTU0LjggMC0uMS0uMnptLTk4LTQ0Yy0yLjctNi43LTQtMTEuNy00LTE1LS42IDEuMi0yLjQgMy43LTUuNCA3LjYtMS40IDEuOS0yLjIgMy43LTIuMiA1LjMgMCAyLjYgLjggNS43IDIuMiA5LjNsNS42IDEzLjljNSAwIDkgMCAxMS45LS4xbC04LjItMjAuOSAuMS0uMXptMTMuNS03Mi40Yy0zLTUuMi03LTkuMy0xMS45LTExLjktMy41LTEuOS01LjMtNC4zLTUuMy03LjQgMC0yLjQgNC42LTguNiAxNC0xOC4zIC4yIDMuOCAxLjkgNy42IDQuOSAxMS4yIDMuMSAzLjYgNC42IDcgNC42IDEwLjEgMCAyLjYtMi4xIDgtNi4yIDE2LjNsLS4xIDB6bS0yNy42IDBjLTMtNS4yLTctOS4zLTExLjktMTEuOS0zLjUtMS45LTUuMy00LjMtNS4zLTcuNCAwLTIuNCA0LjYtOC42IDE0LTE4LjMgLjIgMy44IDEuOSA3LjYgNC45IDExLjIgMy4xIDMuNiA0LjYgNyA0LjYgMTAuMSAwIDIuNi0yLjEgOC02LjIgMTYuM2wtLjEgMHptODcgMjcuNWMtMy01LjItNy05LjMtMTEuOS0xMS45LTMuNS0xLjktNS4zLTQuMy01LjMtNy40IDAtMi40IDQuNi04LjYgMTQtMTguMyAuMiAzLjggMS45IDcuNiA0LjkgMTEuMiAzLjEgMy42IDQuNiA3IDQuNiAxMC4xIDAgMi42LTIuMSA4LTYuMiAxNi4zbC0uMSAweiJdCiAgICB9OwogICAgZmFGb3J0QXdlc29tZUFsdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmb3J0LWF3ZXNvbWUtYWx0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzYTMiLCAiTTIwOCAyMzcuNGwtMjIuMiAwYy0yLjEgMC0zLjcgMS42LTMuNyAzLjdsMCA1MS43YzAgMi4xIDEuNiAzLjcgMy43IDMuN2wyMi4yIDBjMi4xIDAgMy43LTEuNiAzLjctMy43bDAtNTEuN2MwLTIuMS0xLjYtMy43LTMuNy0zLjd6bTExOC4yIDBsLTIyLjIgMGMtMi4xIDAtMy43IDEuNi0zLjcgMy43bDAgNTEuN2MwIDIuMSAxLjYgMy43IDMuNyAzLjdsMjIuMiAwYzIuMSAwIDMuNy0xLjYgMy43LTMuN2wwLTUxLjdjLS4xLTIuMS0xLjctMy43LTMuNy0zLjd6bTEzMi0xMjUuMWMtMi4zLTMuMi00LjYtNi40LTcuMS05LjUtOS44LTEyLjUtMjAuOC0yNC0zMi44LTM0LjQtNC41LTMuOS05LjEtNy42LTEzLjktMTEuMi0xLjYtMS4yLTMuMi0yLjMtNC44LTMuNS0yNy42LTE5LjYtNTkuMy0zMy43LTkzLjYtNDAuNy0xNi4yLTMuMy0zMi45LTUtNTAtNXMtMzMuOSAxLjctNTAgNWMtMzQuMyA3LjEtNjYgMjEuMi05My4zIDQwLjgtMS42IDEuMS0zLjIgMi4zLTQuOCAzLjUtNC44IDMuNi05LjQgNy4zLTEzLjkgMTEuMi0zIDIuNi01LjkgNS4zLTguOCA4cy01LjcgNS41LTguNCA4LjRjLTUuNSA1LjctMTAuNyAxMS44LTE1LjYgMTgtMi40IDMuMS00LjggNi4zLTcuMSA5LjUtMjguOSA0MC42LTQ1LjggOTAuMS00NS44IDE0My42IDAgMiAuMSA0IC4xIDYgLjEgLjcgLjEgMS4zIC4xIDIgLjEgMS4zIC4xIDIuNyAuMiA0IDAgLjggLjEgMS41IC4xIDIuMyAwIDEuMyAuMSAyLjUgLjIgMy43IC4xIC44IC4xIDEuNiAuMiAyLjQgLjEgMS4xIC4yIDIuMyAuMyAzLjUgMCAuOCAuMSAxLjYgLjIgMi40IC4xIDEuMiAuMyAyLjQgLjQgMy42IC4xIC44IC4yIDEuNSAuMyAyLjMgLjEgMS4zIC4zIDIuNiAuNSAzLjkgLjEgLjYgLjIgMS4zIC4zIDEuOWwuOSA1LjdjLjEgLjYgLjIgMS4xIC4zIDEuNyAuMyAxLjMgLjUgMi43IC44IDQgLjIgLjggLjMgMS42IC41IDIuNCAuMiAxIC41IDIuMSAuNyAzLjIgLjIgLjkgLjQgMS43IC42IDIuNiAuMiAxIC40IDIgLjcgMyAuMiAuOSAuNSAxLjggLjcgMi43IC4zIDEgLjUgMS45IC44IDIuOSAuMyAuOSAuNSAxLjggLjggMi43IC4yIC45IC41IDEuOSAuOCAyLjhzLjUgMS44IC44IDIuN2MuMyAxIC42IDEuOSAuOSAyLjggLjYgMS42IDEuMSAzLjMgMS43IDQuOSAuNCAxIC43IDEuOSAxIDIuOCAuMyAxIC43IDIgMS4xIDMgLjMgLjggLjYgMS41IC45IDIuM2wxLjIgM2MuMyAuNyAuNiAxLjUgLjkgMi4yIC40IDEgLjkgMiAxLjMgM2wuOSAyLjFjLjUgMSAuOSAyIDEuNCAzIC4zIC43IC42IDEuMyAuOSAyIC41IDEgMSAyLjEgMS41IDMuMSAuMiAuNiAuNSAxLjEgLjggMS43IC42IDEuMSAxLjEgMi4yIDEuNyAzLjMgLjEgLjIgLjIgLjMgLjMgLjUgMi4yIDQuMSA0LjQgOC4yIDYuOCAxMi4yIC4yIC40IC41IC44IC43IDEuMiAuNyAxLjEgMS4zIDIuMiAyIDMuMyAuMyAuNSAuNiAuOSAuOSAxLjQgLjYgMS4xIDEuMyAyLjEgMiAzLjIgLjMgLjUgLjYgLjkgLjkgMS40IC43IDEuMSAxLjQgMi4xIDIuMSAzLjIgLjIgLjQgLjUgLjggLjggMS4yIC43IDEuMSAxLjUgMi4yIDIuMyAzLjMgLjIgLjIgLjMgLjUgLjUgLjcgMzcuNSA1MS43IDk0LjQgODguNSAxNjAgOTkuNCAuOSAuMSAxLjcgLjMgMi42IC40IDEgLjIgMi4xIC40IDMuMSAuNXMxLjkgLjMgMi44IC40YzEgLjIgMiAuMyAzIC40IC45IC4xIDEuOSAuMiAyLjkgLjNzMS45IC4yIDIuOSAuMyAyLjEgLjIgMy4xIC4zYy45IC4xIDEuOCAuMSAyLjcgLjIgMS4xIC4xIDIuMyAuMSAzLjQgLjIgLjggMCAxLjcgLjEgMi41IC4xIDEuMyAwIDIuNiAuMSAzLjkgLjEgLjcgLjEgMS40IC4xIDIuMSAuMSAyIC4xIDQgLjEgNiAuMXM0LS4xIDYtLjFjLjcgMCAxLjQtLjEgMi4xLS4xIDEuMyAwIDIuNiAwIDMuOS0uMSAuOCAwIDEuNy0uMSAyLjUtLjEgMS4xLS4xIDIuMy0uMSAzLjQtLjIgLjkgMCAxLjgtLjEgMi43LS4yIDEtLjEgMi4xLS4yIDMuMS0uM3MxLjktLjIgMi45LS4zYy45LS4xIDEuOS0uMiAyLjktLjNzMi0uMyAzLS40IDEuOS0uMyAyLjgtLjRjMS0uMiAyLjEtLjMgMy4xLS41IC45LS4xIDEuNy0uMyAyLjYtLjQgNjUuNi0xMSAxMjIuNS00Ny43IDE2MC4xLTEwMi40IC4yLS4yIC4zLS41IC41LS43IC44LTEuMSAxLjUtMi4yIDIuMy0zLjMgLjItLjQgLjUtLjggLjgtMS4yIC43LTEuMSAxLjQtMi4xIDIuMS0zLjIgLjMtLjUgLjYtLjkgLjktMS40IC42LTEuMSAxLjMtMi4xIDItMy4yIC4zLS41IC42LS45IC45LTEuNCAuNy0xLjEgMS4zLTIuMiAyLTMuMyAuMi0uNCAuNS0uOCAuNy0xLjIgMi40LTQgNC42LTguMSA2LjgtMTIuMiAuMS0uMiAuMi0uMyAuMy0uNSAuNi0xLjEgMS4xLTIuMiAxLjctMy4zIC4yLS42IC41LTEuMSAuOC0xLjcgLjUtMSAxLTIuMSAxLjUtMy4xIC4zLS43IC42LTEuMyAuOS0yIC41LTEgMS0yIDEuNC0zbC45LTIuMWMuNS0xIC45LTIgMS4zLTMgLjMtLjcgLjYtMS41IC45LTIuMmwxLjItM2MuMy0uOCAuNi0xLjUgLjktMi4zIC40LTEgLjctMiAxLjEtM3MuNy0xLjkgMS0yLjhjLjYtMS42IDEuMi0zLjMgMS43LTQuOSAuMy0xIC42LTEuOSAuOS0yLjhzLjUtMS44IC44LTIuN2MuMi0uOSAuNS0xLjkgLjgtMi44cy42LTEuOCAuOC0yLjdjLjMtMSAuNS0xLjkgLjgtMi45IC4yLS45IC41LTEuOCAuNy0yLjcgLjItMSAuNS0yIC43LTMgLjItLjkgLjQtMS43IC42LTIuNiAuMi0xIC41LTIuMSAuNy0zLjIgLjItLjggLjMtMS42IC41LTIuNCAuMy0xLjMgLjYtMi43IC44LTQgLjEtLjYgLjItMS4xIC4zLTEuN2wuOS01LjdjLjEtLjYgLjItMS4zIC4zLTEuOSAuMS0xLjMgLjMtMi42IC41LTMuOSAuMS0uOCAuMi0xLjUgLjMtMi4zIC4xLTEuMiAuMy0yLjQgLjQtMy42IDAtLjggLjEtMS42IC4yLTIuNCAuMS0xLjEgLjItMi4zIC4zLTMuNSAuMS0uOCAuMS0xLjYgLjItMi40IC4xIDEuNyAuMSAuNSAuMi0uNyAwLS44IC4xLTEuNSAuMS0yLjMgLjEtMS4zIC4yLTIuNyAuMi00IC4xLS43IC4xLTEuMyAuMS0yIC4xLTIgLjEtNCAuMS02IDAtNTMuNS0xNi45LTEwMy00NS44LTE0My43ek00NDggMzcxLjVjLTkuNCAxNS41LTIwLjYgMjkuOS0zMy42IDQyLjktMjAuNiAyMC42LTQ0LjUgMzYuNy03MS4yIDQ4LTEzLjkgNS44LTI4LjIgMTAuMy00Mi45IDEzLjJsMC03NS44YzAtNTguNi04OC42LTU4LjYtODguNiAwbDAgNzUuOGMtMTQuNy0yLjktMjktNy4zLTQyLjktMTMuMi0yNi43LTExLjMtNTAuNi0yNy40LTcxLjItNDgtMTMtMTMtMjQuMi0yNy40LTMzLjYtNDIuOWwwLTcxLjNjMC0yLjEgMS42LTMuNyAzLjctMy43bDIyLjEgMGMyLjEgMCAzLjcgMS42IDMuNyAzLjdsMCAyNS44IDI5LjYgMCAwLTE0NGMwLTIuMSAxLjYtMy43IDMuNy0zLjdsMjIuMSAwYzIuMSAwIDMuNyAxLjYgMy43IDMuN2wwIDI1LjkgMjkuNSAwIDAtMjUuOWMwLTIuMSAxLjYtMy43IDMuNy0zLjdsMjIuMiAwYzIuMSAwIDMuNyAxLjYgMy43IDMuN2wwIDI1LjkgMjkuNSAwIDAtMjUuOWMwLTQuOCA2LjUtMy43IDkuNS0zLjdsMC05MC4yYy00LjQtMi03LjQtNi43LTcuNC0xMS41IDAtMTYuOCAyNS40LTE2LjggMjUuNCAwIDAgNC44LTMgOS40LTcuNCAxMS41bDAgMy45YzYuMy0xLjQgMTIuNy0yLjMgMTkuMi0yLjMgOS40IDAgMTguNCAzLjUgMjYuMyAzLjUgNy4yIDAgMTUuMi0zLjUgMTkuNC0zLjUgMi4xIDAgMy43IDEuNiAzLjcgMy43bDAgNDguNGMwIDUuNi0xOC43IDYuNS0yMi40IDYuNS04LjYgMC0xNi42LTMuNS0yNS40LTMuNS03IDAtMTQuMSAxLjItMjAuOCAyLjhsMCAzMC43YzMgMCA5LjUtMS4xIDkuNSAzLjdsMCAyNS45IDI5LjUgMCAwLTI1LjljMC0yLjEgMS42LTMuNyAzLjctMy43bDIyLjIgMGMyLjEgMCAzLjcgMS42IDMuNyAzLjdsMCAyNS45IDI5LjUgMCAwLTI1LjljMC0yLjEgMS42LTMuNyAzLjctMy43bDIyLjEgMGMyLjEgMCAzLjcgMS42IDMuNyAzLjdsMCAxNDQgMjkuNSAwIDAtMjUuOGMwLTIuMSAxLjYtMy43IDMuNy0zLjdsMjIuMiAwYzIuMSAwIDMuNyAxLjYgMy43IDMuN2wwIDcxLjN6Il0KICAgIH07CiAgICBmYUJ1cm9tb2JlbGV4cGVydGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYnVyb21vYmVsZXhwZXJ0ZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMzdmIiwgIk0wIDMybDAgMTI4IDEyOCAwIDAtMTI4LTEyOCAwek0xMjAgMTUybC0xMTIgMCAwLTExMiAxMTIgMCAwIDExMnpNMTYwIDMybDAgMTI4IDEyOCAwIDAtMTI4LTEyOCAwek0yODAgMTUybC0xMTIgMCAwLTExMiAxMTIgMCAwIDExMnpNMzIwIDMybDAgMTI4IDEyOCAwIDAtMTI4LTEyOCAwek00NDAgMTUybC0xMTIgMCAwLTExMiAxMTIgMCAwIDExMnpNMCAxOTJsMCAxMjggMTI4IDAgMC0xMjgtMTI4IDB6TTEyMCAzMTJsLTExMiAwIDAtMTEyIDExMiAwIDAgMTEyem00MC0xMjBsMCAxMjggMTI4IDAgMC0xMjgtMTI4IDB6TTI4MCAzMTJsLTExMiAwIDAtMTEyIDExMiAwIDAgMTEyem00MC0xMjBsMCAxMjggMTI4IDAgMC0xMjgtMTI4IDB6TTQ0MCAzMTJsLTExMiAwIDAtMTEyIDExMiAwIDAgMTEyek0wIDM1MmwwIDEyOCAxMjggMCAwLTEyOC0xMjggMHpNMTIwIDQ3MmwtMTEyIDAgMC0xMTIgMTEyIDAgMCAxMTJ6bTQwLTEyMGwwIDEyOCAxMjggMCAwLTEyOC0xMjggMHpNMjgwIDQ3MmwtMTEyIDAgMC0xMTIgMTEyIDAgMCAxMTJ6bTQwLTEyMGwwIDEyOCAxMjggMCAwLTEyOC0xMjggMHoiXQogICAgfTsKICAgIGZhQmlsaWJpbGkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYmlsaWJpbGkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTNkOSIsICJNNDg4LjYgMTA0LjFjMTYuNyAxOC4xIDI0LjQgMzkuNyAyMy4zIDY1LjdsMCAyMDIuNGMtLjQgMjYuNC05LjIgNDguMS0yNi41IDY1LjEtMTcuMiAxNy0zOS4xIDI1LjktNjUuNSAyNi43TDkyIDQ2NGMtMjYuNC0uOC00OC4yLTkuOC02NS4zLTI3LjItMTcuMS0xNy40LTI2LTQwLjMtMjYuNy02OC42TDAgMTY5LjhjLjgtMjYgOS43LTQ3LjYgMjYuNy02NS43IDE3LjEtMTYuMyAzOC44LTI1LjMgNjUuMy0yNi4xbDI5LjQgMC0yNS40LTI1LjhjLTUuNy01LjctOC42LTEzLTguNi0yMS44czIuOS0xNi4xIDguNi0yMS44IDEzLTguNiAyMS45LTguNiAxNi4xIDIuOSAyMS45IDguNmw3My4zIDY5LjQgODggMCA3NC41LTY5LjRDMzgxLjcgMi45IDM4OS4yIDAgMzk4IDBzMTYuMSAyLjkgMjEuOSA4LjZjNS43IDUuNyA4LjYgMTMgOC42IDIxLjhzLTIuOSAxNi4xLTguNiAyMS44TDM5NC42IDc4IDQyMy45IDc4YzI2LjQgLjggNDggOS44IDY0LjcgMjYuMXptLTM4LjggNjkuN2MtLjQtOS42LTMuNy0xNy40LTEwLjctMjMuNS01LjItNi4xLTE0LTkuNC0yMi43LTkuOGwtMzIwLjQgMGMtOS42IC40LTE3LjQgMy43LTIzLjYgOS44LTYuMSA2LjEtOS40IDEzLjktOS44IDIzLjVsMCAxOTQuNGMwIDkuMiAzLjMgMTcgOS44IDIzLjVzMTQuNCA5LjggMjMuNiA5LjhsMzIwLjQgMGM5LjIgMCAxNy0zLjMgMjMuMy05LjhzOS43LTE0LjMgMTAuMS0yMy41bDAtMTk0LjR6TTE4NS41IDIxNi41YzYuMyA2LjMgOS43IDE0LjEgMTAuMSAyMy4ybDAgMzMuM2MtLjQgOS4yLTMuNyAxNi45LTkuOCAyMy4yLTYuMiA2LjMtMTQgOS41LTIzLjYgOS41cy0xNy41LTMuMi0yMy42LTkuNS05LjQtMTQtOS44LTIzLjJsMC0zMy4zYy40LTkuMSAzLjgtMTYuOSAxMC4xLTIzLjJzMTMuMi05LjYgMjMuMy0xMGM5LjIgLjQgMTcgMy43IDIzLjMgMTB6bTE5MS41IDBjNi4zIDYuMyA5LjcgMTQuMSAxMC4xIDIzLjJsMCAzMy4zYy0uNCA5LjItMy43IDE2LjktOS44IDIzLjJzLTE0IDkuNS0yMy42IDkuNS0xNy40LTMuMi0yMy42LTkuNWMtNy02LjMtOS40LTE0LTkuNy0yMy4ybDAtMzMuM2MuMy05LjEgMy43LTE2LjkgMTAtMjMuMnMxNC4xLTkuNiAyMy4zLTEwYzkuMiAuNCAxNyAzLjcgMjMuMyAxMHoiXQogICAgfTsKICAgIGZhTmVvcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJuZW9zIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY2MTIiLCAiTTM4My44IDUxMmwtOTUuMSAwLTEwOC4yLTE1NC41IDAgOTEuMS04Ni40IDYzLjQtOTcuNyAwIDAtNDgyLjIgNDAuNS0yOS44IDEwOCAwIDEyMy43IDE3Ni4xIDAtMTEyLjcgODYuNC02My40IDk3LjcgMCAwIDQ2MS41LTY4LjkgNTAuNXpNNy4yIDM1LjNsMCA0NjAuNyA3Mi01Mi45IDAtMjQ5LjEgMjE1LjUgMzA3LjYgODQuOCAwIDUyLjQtMzguMi03OC4zIDAtMzE2LjEtNDUwLjUtMzAuMiAyMi4zek04OS43IDUwMS45bDgwLTU4LjggMC0xMDEtNzkuOC0xMTQuNCAwIDIyMC45LTcyLjYgNTMuMyA3Mi4zIDAgMCAwek00OSAxMC44bDMxMC42IDQ0Mi42IDgyLjQgMCAwLTQ0Mi42LTc5LjggMCAwIDMxNy42LTIyMi45LTMxNy42LTkwLjMgMHpNMjc5LjQgMTkxLjZsNzIgMTAyLjggMC0yNzguNS03MiA1MyAwIDEyMi43eiJdCiAgICB9OwogICAgZmFEZXYgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZGV2IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY2Y2MiLCAiTTEyMC4xIDIwOC4zYy0zLjktMi45LTcuOC00LjMtMTEuNi00LjNsLTE3LjQgMCAwIDEwNC41IDE3LjQgMGMzLjkgMCA3LjgtMS40IDExLjYtNC4zczUuOC03LjMgNS44LTEzLjFsMC02OS43YzAtNS44LTItMTAuMi01LjgtMTMuMXpNNDA0LjEgMzJMNDMuOSAzMkMxOS43IDMyIC4xIDUxLjYgMCA3NS44TDAgNDM2LjJDLjEgNDYwLjQgMTkuNyA0ODAgNDMuOSA0ODBsMzYwLjIgMGMyNC4yIDAgNDMuOC0xOS42IDQzLjktNDMuOGwwLTM2MC40QzQ0Ny45IDUxLjYgNDI4LjMgMzIgNDA0LjEgMzJ6TTE1NC4yIDI5MS4yYzAgMTguOC0xMS42IDQ3LjMtNDguNCA0Ny4zbC00Ni40IDAgMC0xNjUuNSA0Ny40IDBjMzUuNCAwIDQ3LjQgMjguNSA0Ny40IDQ3LjNsMCA3MC45em0xMDAuNy04OC43bC01My4zIDAgMCAzOC40IDMyLjYgMCAwIDI5LjYtMzIuNiAwIDAgMzguNCA1My4zIDAgMCAyOS42LTYyLjIgMGMtMTEuMiAuMy0yMC40LTguNS0yMC43LTE5LjdsMC0xMjUuMWMtLjMtMTEuMSA4LjYtMjAuNCAxOS43LTIwLjdsNjMuMiAwIDAgMjkuNXpNMzU4LjUgMzE3LjhjLTEzLjIgMzAuNy0zNi44IDI0LjYtNDcuNCAwbC0zOC41LTE0NC44IDMyLjYgMCAyOS43IDExMy43IDI5LjYtMTEzLjcgMzIuNiAwLTM4LjUgMTQ0Ljh6Il0KICAgIH07CiAgICBmYUhvdGphciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJob3RqYXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjNiMSIsICJNMzYxLjggMGMwIDEzMS42LTgwLjcgMTc2LjgtMTQwLjIgMjA5LjQtLjYgLjMtMS4xIC42LTEuNiAuOS01My44IDMwLjItODguNyA0OS44LTg5LjYgMTIybC05OC4xIDBjMC0xMzEuNSA4MC43LTE3Ni43IDE0MC4yLTIwOS4zIDU0LjgtMjkuOCA5MC4zLTUwIDkwLjMtMTIzbDk5IDB6TTMwMS4zIDMwMi42YzU0LjgtMjkuOCA5MC4zLTUwIDkwLjMtMTIzbDk4IDBjMCAxMzEuNi04MC43IDE3Ni43LTE0MC4yIDIwOS40LTU0LjggMjkuOC05MC4zIDUwLTkwLjMgMTIzbC05OCAwYzAtMTMxLjYgODAuNy0xNzYuOCAxNDAuMi0yMDkuNHoiXQogICAgfTsKICAgIGZhRG9jaHViID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImRvY2h1YiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMzk0IiwgIk00MTMuOSAxNjBMMjcyIDE2MCAyNzIgMTkuNiA0MTMuOSAxNjB6TTMyMCAxOTJsMCAxMzBjMCA2Ni44LTM2LjUgMTAwLjEtMTEzLjMgMTAwLjFsLTk0LjcgMCAwLTMzNy4zIDk0LjcgMGMxMiAwIDIzLjEgLjggMzMuMSAyLjVsMC04NEMyMjguOSAxLjEgMjE3LjQgMCAyMDUuMiAwTDE2IDAgMTYgNTEyIDIwNS4yIDUxMkMzNDUuNyA1MTIgNDE2IDQ0Ny40IDQxNiAzMTguMWwwLTEyNi4xLTk2IDB6Il0KICAgIH07CiAgICBmYVZpbWVvID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInZpbWVvIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY0MGEiLCAiTTQwMy4yIDMyTDQ0LjggMzJDMjAuMSAzMiAwIDUyLjEgMCA3Ni44TDAgNDM1LjJDMCA0NTkuOSAyMC4xIDQ4MCA0NC44IDQ4MGwzNTguNCAwYzI0LjcgMCA0NC44LTIwLjEgNDQuOC00NC44bDAtMzU4LjRDNDQ4IDUyLjEgNDI3LjkgMzIgNDAzLjIgMzJ6TTM3NyAxODAuOGMtMS40IDMxLjUtMjMuNCA3NC43LTY2IDEyOS40LTQ0IDU3LjItODEuMyA4NS44LTExMS43IDg1LjgtMTguOSAwLTM0LjgtMTcuNC00Ny45LTUyLjMtMjUuNS05My4zLTM2LjQtMTQ4LTU3LjQtMTQ4LTIuNCAwLTEwLjkgNS4xLTI1LjQgMTUuMkw1My40IDE5MS4zYzM3LjMtMzIuOCA3Mi45LTY5LjIgOTUuMi03MS4yIDI1LjItMi40IDQwLjcgMTQuOCA0Ni41IDUxLjcgMjAuNyAxMzEuMiAyOS45IDE1MSA2Ny42IDkxLjYgMTMuNS0yMS40IDIwLjgtMzcuNyAyMS44LTQ4LjkgMy41LTMzLjItMjUuOS0zMC45LTQ1LjgtMjIuNCAxNS45LTUyLjEgNDYuMy03Ny40IDkxLjItNzYgMzMuMyAuOSA0OSAyMi41IDQ3LjEgNjQuN3oiXQogICAgfTsKICAgIGZhTWF4Y2RuID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1heGNkbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMTM2IiwgIk00NjEuMSA0NDIuN2wtOTcuNCAwIDUxLjktMjQyLjdjMi4zLTEwLjIgLjktMTkuNS00LjQtMjUuNy01LTYuMS0xMy43LTkuNi0yNC4yLTkuNmwtNDkuMyAwLTU5LjUgMjc4LTk3LjQgMCA1OS41LTI3OC04My40IDAtNTkuNSAyNzgtOTcuNCAwIDU5LjUtMjc4LTQ0LjYtOTUuNCAzNzIuMSAwYzM5LjQgMCA3NS4zIDE2LjMgOTguMyA0NC45IDIzLjMgMjguNiAzMS44IDY3LjQgMjMuNiAxMDUuOUw0NjEuMSA0NDIuN3oiXQogICAgfTsKICAgIGZhU3F1YXJlRm9udEF3ZXNvbWVTdHJva2UgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLWZvbnQtYXdlc29tZS1zdHJva2UiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiZm9udC1hd2Vzb21lLWFsdCJdLCAiZjM1YyIsICJNNjQgNjRDNDYuMyA2NCAzMiA3OC4zIDMyIDk2bDAgMzIwYzAgMTcuNyAxNC4zIDMyIDMyIDMybDMyMCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMzIwYzAtMTcuNy0xNC4zLTMyLTMyLTMyTDY0IDY0ek0wIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NnptMTU0IDU4YzAgOS4zLTQuOCAxNy40LTEyLjEgMjJsMTg4LjkgMGM3LjMgMCAxMy4yIDUuOSAxMy4yIDEzLjIgMCAxLjgtLjQgMy43LTEuMSA1LjRMMzEyIDI2NCAzNDIuOSAzMzMuNGMuOCAxLjcgMS4xIDMuNSAxLjEgNS40IDAgNy4zLTUuOSAxMy4yLTEzLjIgMTMuMmwtMTg2LjggMCAwIDMyLTMyIDAgMC0yMDkuNWMtNi4xLTQuOC0xMC0xMi4yLTEwLTIwLjUgMC0xNC40IDExLjYtMjYgMjYtMjZzMjYgMTEuNiAyNiAyNnoiXQogICAgfTsKICAgIGZhRm9udEF3ZXNvbWVBbHQgPSBmYVNxdWFyZUZvbnRBd2Vzb21lU3Ryb2tlOwogICAgZmFTcGVha2FwID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNwZWFrYXAiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjNmMyIsICJNNjQuNCAzOTEuOEMtMTUgMzAzLjYtNy42IDE2Ny40IDgxLjEgODcuNnMyMjQuOC03MyAzMDQuMiAxNS4yIDcyIDIyNC40LTE2LjYgMzA0LjFjLTE4LjcgMTYuOSA2NCA0My4xIDQyIDUyLjMtODIuMSAzNC4yLTI1My45IDM1LTM0Ni4yLTY3LjVsMCAwek0yNzcuNyAxODAuMmwzOC41LTQwLjljLTkuNi04LjktMzItMjYuOC03Ni4yLTI3LjYtNTIuMy0uOS05NS45IDI4LjMtOTYuOCA4MC0uMiAxMS4zIC4zIDM2LjcgMjkuNCA1NC44IDM0LjUgMjEuNCA4Ni41IDIxLjUgODYgNTIuMy0uNCAyMS4zLTI2LjQgMjUuOC0zOC42IDI1LjYtMyAwLTMwLjItLjUtNDcuNi0yNC42bC00MCA0Mi42YzI4LjIgMjcgNTkgMzIuNiA4My41IDMzIDEwLjIgLjIgOTYuNCAuMyA5Ny44LTgxIC4zLTE1LjgtMi4xLTM5LjctMjguOS01Ni42LTM0LjQtMjEuNi04NS0xOS40LTg0LjQtNDkuNyAuNC0yMy4zIDMxLTI1LjQgMzcuNS0yNS4zIC40IDAgMjYuNiAuMyAzOS42IDE3LjRsMCAweiJdCiAgICB9OwogICAgZmFGYW50YXN5RmxpZ2h0R2FtZXMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZmFudGFzeS1mbGlnaHQtZ2FtZXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjZkYyIsICJNMjU2IDMyLjlMMzIuOSAyNTYgMjU2IDQ3OS4xIDQ3OS4xIDI1NiAyNTYgMzIuOXpNODguMyAyNTUuOGMyLTIgMTEuOS0xMi4zIDk2LjUtOTcuNSA0MS40LTQxLjggODYuMi00My44IDExOS44LTE4LjcgMjQuNiAxOC40IDYyLjEgNTguOSA2Mi4xIDU5IC43IC43IDEuMSAyLjkgLjYgMy40LTExLjMgMTEuOC0yMi43IDIzLjUtMzMuNSAzNC43LTM0LjItMzIuMy00MC41LTM4LjItNDguNS00NC0xNy44LTEyLjctNDEuNC0xMC4xLTU3IDUuMS0yLjIgMi4xLTEuOCAzLjQgLjEgNS40IDIuOSAyLjkgMjguMSAyOC4zIDM1LjEgMzUuOC0xMS45IDExLjYtMjMuNyAyMy0zNS43IDM0LjctMTItMTIuNS0yNC41LTI1LjUtMzYuNS0zOC4xLTIxLjQgMjEuMS00MS43IDQxLjEtNjEuOCA2MUw4OC4zIDI1NS44ek0zMjMuMiAzNTcuNGMtMzUuNSAzNS40LTc4LjEgMzguMS0xMDcgMjAuNS0yMi4xLTEzLjUtMzkuNC0zMi4xLTcyLjktNjYuOCAxMi0xMi40IDIzLjgtMjQuNCAzNS40LTM2LjMgMzMgMzEuOSAzNy4xIDM2IDQ0LjcgNDIuMSAxOC41IDE0LjcgNDIuNSAxMy43IDU5LjMtMS44IDMuNy0zLjQgMy43LTMuNiAuMS03LjItMTAuNi0xMC43LTIxLjItMjEuNC0zMS44LTMyLjItMS4zLTEuMy0zLTIuNS0uOC00LjcgMTAuOC0xMC43IDIxLjUtMjEuNSAzMi4yLTMyLjMgLjMtLjMgLjYtLjQgMS45LTEuMSAxMi40IDEyLjkgMjQuOSAyNS45IDM3LjIgMzguOCAyMS0yMC43IDQxLjItNDAuNyA2MS4zLTYwLjQgMTMuNyAxMy40IDI3LjEgMjYuNiA0MC45IDQwLTIwLjIgMjAuOS04MS43IDgyLjctMTAwLjUgMTAxLjV6TTI1NiAwTDAgMjU2IDI1NiA1MTIgNTEyIDI1NiAyNTYgMHpNMTYgMjU2TDI1NiAxNiA0OTYgMjU2IDI1NiA0OTYgMTYgMjU2eiJdCiAgICB9OwogICAgZmFMaW51eCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJsaW51eCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMTdjIiwgIk0yMjAuOSAxMjMuM2MxIC41IDEuOCAxLjcgMyAxLjcgMS4xIDAgMi44LS40IDIuOS0xLjUgLjItMS40LTEuOS0yLjMtMy4yLTIuOS0xLjctLjctMy45LTEtNS41LS4xLS40IC4yLS44IC43LS42IDEuMSAuMyAxLjMgMi4zIDEuMSAzLjQgMS43ek0xOTkgMTI1YzEuMiAwIDItMS4yIDMtMS43IDEuMS0uNiAzLjEtLjQgMy41LTEuNiAuMi0uNC0uMi0uOS0uNi0xLjEtMS42LS45LTMuOC0uNi01LjUgLjEtMS4zIC42LTMuNCAxLjUtMy4yIDIuOSAuMSAxIDEuOCAxLjUgMi44IDEuNHpNNDIwIDQwMy44Yy0zLjYtNC01LjMtMTEuNi03LjItMTkuNy0xLjgtOC4xLTMuOS0xNi44LTEwLjUtMjIuNC0xLjMtMS4xLTIuNi0yLjEtNC0yLjktMS4zLS44LTIuNy0xLjUtNC4xLTIgOS4yLTI3LjMgNS42LTU0LjUtMy43LTc5LjEtMTEuNC0zMC4xLTMxLjMtNTYuNC00Ni41LTc0LjQtMTcuMS0yMS41LTMzLjctNDEuOS0zMy40LTcyIC41LTQ1LjkgNS4xLTEzMS4yLTc1LjgtMTMxLjMtMTAyLjQtLjItNzYuOCAxMDMuNC03Ny45IDEzNS4yLTEuNyAyMy40LTYuNCA0MS44LTIyLjUgNjQuNy0xOC45IDIyLjUtNDUuNSA1OC44LTU4LjEgOTYuNy02IDE3LjktOC44IDM2LjEtNi4yIDUzLjMtNi41IDUuOC0xMS40IDE0LjctMTYuNiAyMC4yLTQuMiA0LjMtMTAuMyA1LjktMTcgOC4zcy0xNCA2LTE4LjUgMTQuNWMtMi4xIDMuOS0yLjggOC4xLTIuOCAxMi40IDAgMy45IC42IDcuOSAxLjIgMTEuOCAxLjIgOC4xIDIuNSAxNS43IC44IDIwLjgtNS4yIDE0LjQtNS45IDI0LjQtMi4yIDMxLjcgMy44IDcuMyAxMS40IDEwLjUgMjAuMSAxMi4zIDE3LjMgMy42IDQwLjggMi43IDU5LjMgMTIuNSAxOS44IDEwLjQgMzkuOSAxNC4xIDU1LjkgMTAuNCAxMS42LTIuNiAyMS4xLTkuNiAyNS45LTIwLjIgMTIuNS0uMSAyNi4zLTUuNCA0OC4zLTYuNiAxNC45LTEuMiAzMy42IDUuMyA1NS4xIDQuMSAuNiAyLjMgMS40IDQuNiAyLjUgNi43bDAgLjFjOC4zIDE2LjcgMjMuOCAyNC4zIDQwLjMgMjMgMTYuNi0xLjMgMzQuMS0xMSA0OC4zLTI3LjkgMTMuNi0xNi40IDM2LTIzLjIgNTAuOS0zMi4yIDcuNC00LjUgMTMuNC0xMC4xIDEzLjktMTguMyAuNC04LjItNC40LTE3LjMtMTUuNS0yOS43ek0yMjMuOCA4Ny4zYzkuOC0yMi4yIDM0LjItMjEuOCA0NC0uNCA2LjUgMTQuMiAzLjYgMzAuOS00LjMgNDAuNC0xLjYtLjgtNS45LTIuNi0xMi42LTQuOSAxLjEtMS4yIDMuMS0yLjcgMy45LTQuNiA0LjgtMTEuOC0uMi0yNy05LjEtMjcuMy03LjMtLjUtMTMuOSAxMC44LTExLjggMjMtNC4xLTItOS40LTMuNS0xMy00LjQtMS02LjktLjMtMTQuNiAyLjktMjEuOHpNMTgzLjEgNzUuOGMxMC4xIDAgMjAuOCAxNC4yIDE5LjEgMzMuNS0zLjUgMS03LjEgMi41LTEwLjIgNC42IDEuMi04LjktMy4zLTIwLjEtOS42LTE5LjYtOC40IC43LTkuOCAyMS4yLTEuOCAyOC4xIDEgLjggMS45LS4yLTUuOSA1LjUtMTUuNi0xNC42LTEwLjUtNTIuMSA4LjQtNTIuMXptLTEzLjYgNjAuN2M2LjItNC42IDEzLjYtMTAgMTQuMS0xMC41IDQuNy00LjQgMTMuNS0xNC4yIDI3LjktMTQuMiA3LjEgMCAxNS42IDIuMyAyNS45IDguOSA2LjMgNC4xIDExLjMgNC40IDIyLjYgOS4zIDguNCAzLjUgMTMuNyA5LjcgMTAuNSAxOC4yLTIuNiA3LjEtMTEgMTQuNC0yMi43IDE4LjEtMTEuMSAzLjYtMTkuOCAxNi0zOC4yIDE0LjktMy45LS4yLTctMS05LjYtMi4xLTgtMy41LTEyLjItMTAuNC0yMC0xNS04LjYtNC44LTEzLjItMTAuNC0xNC43LTE1LjMtMS40LTQuOSAwLTkgNC4yLTEyLjN6bTMuMyAzMzRjLTIuNyAzNS4xLTQzLjkgMzQuNC03NS4zIDE4LTI5LjktMTUuOC02OC42LTYuNS03Ni41LTIxLjktMi40LTQuNy0yLjQtMTIuNyAyLjYtMjYuNGwwLS4yYzIuNC03LjYgLjYtMTYtLjYtMjMuOS0xLjItNy44LTEuOC0xNSAuOS0yMCAzLjUtNi43IDguNS05LjEgMTQuOC0xMS4zIDEwLjMtMy43IDExLjgtMy40IDE5LjYtOS45IDUuNS01LjcgOS41LTEyLjkgMTQuMy0xOCA1LjEtNS41IDEwLTguMSAxNy43LTYuOSA4LjEgMS4yIDE1LjEgNi44IDIxLjkgMTZsMTkuNiAzNS42YzkuNSAxOS45IDQzLjEgNDguNCA0MSA2OC45em0tMS40LTI1LjljLTQuMS02LjYtOS42LTEzLjYtMTQuNC0xOS42IDcuMSAwIDE0LjItMi4yIDE2LjctOC45IDIuMy02LjIgMC0xNC45LTcuNC0yNC45LTEzLjUtMTguMi0zOC4zLTMyLjUtMzguMy0zMi41LTEzLjUtOC40LTIxLjEtMTguNy0yNC42LTI5LjlzLTMtMjMuMy0uMy0zNS4yYzUuMi0yMi45IDE4LjYtNDUuMiAyNy4yLTU5LjIgMi4zLTEuNyAuOCAzLjItOC43IDIwLjgtOC41IDE2LjEtMjQuNCA1My4zLTIuNiA4Mi40IC42LTIwLjcgNS41LTQxLjggMTMuOC02MS41IDEyLTI3LjQgMzcuMy03NC45IDM5LjMtMTEyLjcgMS4xIC44IDQuNiAzLjIgNi4yIDQuMSA0LjYgMi43IDguMSA2LjcgMTIuNiAxMC4zIDEyLjQgMTAgMjguNSA5LjIgNDIuNCAxLjIgNi4yLTMuNSAxMS4yLTcuNSAxNS45LTkgOS45LTMuMSAxNy44LTguNiAyMi4zLTE1IDcuNyAzMC40IDI1LjcgNzQuMyAzNy4yIDk1LjcgNi4xIDExLjQgMTguMyAzNS41IDIzLjYgNjQuNiAzLjMtLjEgNyAuNCAxMC45IDEuNCAxMy44LTM1LjctMTEuNy03NC4yLTIzLjMtODQuOS00LjctNC42LTQuOS02LjYtMi42LTYuNSAxMi42IDExLjIgMjkuMiAzMy43IDM1LjIgNTkgMi44IDExLjYgMy4zIDIzLjcgLjQgMzUuNyAxNi40IDYuOCAzNS45IDE3LjkgMzAuNyAzNC44LTIuMi0uMS0zLjIgMC00LjIgMCAzLjItMTAuMS0zLjktMTcuNi0yMi44LTI2LjEtMTkuNi04LjYtMzYtOC42LTM4LjMgMTIuNS0xMi4xIDQuMi0xOC4zIDE0LjctMjEuNCAyNy4zLTIuOCAxMS4yLTMuNiAyNC43LTQuNCAzOS45LS41IDcuNy0zLjYgMTgtNi44IDI5LTMyLjEgMjIuOS03Ni43IDMyLjktMTE0LjMgNy4yem0yNTcuNC0xMS41Yy0uOSAxNi44LTQxLjIgMTkuOS02My4yIDQ2LjUtMTMuMiAxNS43LTI5LjQgMjQuNC00My42IDI1LjVzLTI2LjUtNC44LTMzLjctMTkuM2MtNC43LTExLjEtMi40LTIzLjEgMS4xLTM2LjMgMy43LTE0LjIgOS4yLTI4LjggOS45LTQwLjYgLjgtMTUuMiAxLjctMjguNSA0LjItMzguNyAyLjYtMTAuMyA2LjYtMTcuMiAxMy43LTIxLjEgLjMtLjIgLjctLjMgMS0uNSAuOCAxMy4yIDcuMyAyNi42IDE4LjggMjkuNSAxMi42IDMuMyAzMC43LTcuNSAzOC40LTE2LjMgOS0uMyAxNS43LS45IDIyLjYgNS4xIDkuOSA4LjUgNy4xIDMwLjMgMTcuMSA0MS42IDEwLjYgMTEuNiAxNCAxOS41IDEzLjcgMjQuNnpNMTczLjQgMTQ4LjdjMiAxLjkgNC43IDQuNSA4IDcuMSA2LjYgNS4yIDE1LjggMTAuNiAyNy4zIDEwLjYgMTEuNiAwIDIyLjUtNS45IDMxLjgtMTAuOCA0LjktMi42IDEwLjktNyAxNC44LTEwLjRzNS45LTYuMyAzLjEtNi42LTIuNiAyLjYtNiA1LjFjLTQuNCAzLjItOS43IDcuNC0xMy45IDkuOC03LjQgNC4yLTE5LjUgMTAuMi0yOS45IDEwLjJzLTE4LjctNC44LTI0LjktOS43Yy0zLjEtMi41LTUuNy01LTcuNy02LjktMS41LTEuNC0xLjktNC42LTQuMy00LjktMS40LS4xLTEuOCAzLjcgMS43IDYuNXoiXQogICAgfTsKICAgIGZhQ290dG9uQnVyZWF1ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNvdHRvbi1idXJlYXUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjg5ZSIsICJNNDc0LjMgMzMwLjRDNDUwLjYgNDIyLjMgMzgwLjEgNDc1IDI3Mi40IDQ3OC44bDAtNDkuMmMwLTQ4IDI2LjQtNzQuNCA3NC40LTc0LjQgNjIgMCA5OS4yLTM3LjIgOTkuMi05OS4yIDAtNjEuNC0zNi41LTk4LjMtOTcuNC05OS4xLTMzLTY5LjMtMTQ2LjUtNjQuNy0xNzcuMiAwLTYwLjkgLjgtOTcuNCAzNy43LTk3LjQgOTkuMSAwIDYyLjEgMzcuMyA5OS40IDk5LjQgOTkuNCA0OCAwIDc0LjYgMjYuMiA3NC42IDc0LjRsMCA0OS4yYy0xMzQuNC01LTIxMS4xLTg1LjEtMjExLjEtMjIzIDAtMTQxLjggODEuNC0yMjMuMiAyMjMuMi0yMjMuMiAxMTQuOCAwIDE4OS44IDUzLjIgMjE0LjcgMTQ4LjhsMjUuMyAwQzQ3My45IDcxLjUgMzg4LjIgOCAyNTkuOCA4IDEwNSA4IDEyIDEwMS4yIDEyIDI1NS44IDEyIDQxMS4xIDEwNS4yIDUwNC4zIDI1OS44IDUwNCAzODguMSA1MDQgNDczLjcgNDQwLjIgNDk5LjUgMzMwLjRsLTI1LjIgMHpNMzU3IDE4Mi4zYzQxLjQgMy40IDY0LjIgMjkgNjQuMiA3My43IDAgNDgtMjYuNCA3NC40LTc0LjQgNzQuNC0yOC42IDAtNDkuMy05LjYtNjEuNi0yNy4zIDgzLjEtMTYuNSA3NS42LTk5LjcgNzEuOC0xMjAuN3ptLTgxLjcgOTcuNGMtMi41LTEwLjMtMTYuMy04NyA1Ni4yLTk3IDIuMyAxMC4xIDE2LjUgODcuMS01Ni4zIDk3bDAgMHpNMjYwIDEzMmMyOC42IDAgNDkgOS43IDYxLjQgMjcuNi0yOC40IDUuNS00OS40IDIwLjYtNjEuNiA0My40LTEyLjItMjIuOS0zMy4yLTM4LTYxLjYtNDMuNCAxMi40LTE3LjcgMzMuMy0yNy40IDYxLjYtMjcuNGwuMi0uM3ptLTcxLjUgNTAuN2M3My4yIDEwLjYgNTguOSA4Ni44IDU2LjUgOTctNzIuNC05LjgtNTktODctNTYuMi05N2wtLjIgMHpNMTczLjIgMzMwLjRjLTQ4IDAtNzQuNC0yNi40LTc0LjQtNzQuNCAwLTQ0LjQgMjIuOS03MCA2NC4yLTczLjctNi44IDM3LjItMS40IDEwNi41IDcxLjYgMTIwLjctMTIuMSAxNy42LTMyLjggMjcuMy02MS4xIDI3LjNsLS4zIDB6bTUzLjIgMTIuNGMxNC4zLTcuNiAyNi0xOS4zIDMzLjYtMzMuNSA3LjggMTQuNSAxOS4zIDI1LjUgMzMuOCAzMy41LTE0LjQgNy42LTI2LjEgMTkuNC0zMy42IDMzLjgtOC0xNC41LTE5LjEtMjYuMi0zMy42LTMzLjhsLS4zIDB6Il0KICAgIH07CiAgICBmYUdvb2dsZVdhbGxldCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnb29nbGUtd2FsbGV0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYxZWUiLCAiTTE1Ni44IDEyNi44YzM3LjYgNjAuNiA2NC4yIDExMy4xIDg0LjMgMTYyLjUtOC4zIDMzLjgtMTguOCA2Ni41LTMxLjMgOTguMy0xMy4yLTUyLjMtMjYuNS0xMDEuMy01Ni0xNDguNSA2LjUtMzYuNCAyLjMtNzMuNiAzLTExMi4zek0xMDkuMyAyMDBsLTkzLjIgMGMtNi41IDAtMTAuNSA3LjUtNi41IDEyLjcgNDIuMiA1NC4zIDcxLjcgMTE3LjggOTEuNyAxODcuM2wxMDMuNSAwYy0xNi4yLTY5LjctMzguNy0xMzMuNy04Mi41LTE5My41LTMtNC04LTYuNS0xMy02LjV6bTQ3LjgtODhjNjguNSAxMDggMTMwIDIzNC41IDEzOC4yIDM2OEw0MDkgNDgwYy0xMi0xMzgtNjguNC0yNjUtMTQzLjItMzY4bC0xMDguNyAwek00MDguOSA0My41Yy0xLjgtNi44LTguMi0xMS41LTE1LjItMTEuNWwtODguMyAwYy01LjMgMC05IDUtNy44IDEwLjMgMTMuMiA0Ni41IDIyLjMgOTUuNSAyNi41IDE0NiA0OC4yIDg2LjIgNzkuNyAxNzguMyA5MC42IDI3MC44IDE1LjgtNjAuNSAyNS4zLTEzMy41IDI1LjMtMjAzIDAtNzMuNi0xMi4xLTE0NS4xLTMxLjEtMjEyLjZ6Il0KICAgIH07CiAgICBmYUZvdXJzcXVhcmUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZm91cnNxdWFyZSIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMTgwIiwgIk0zMzEuMSAzTDU3LjkgM0MyMC40IDMgOCAzMS4zIDggNDkuMUw4IDQ4Mi45YzAgMjAuMyAxMi4xIDI3LjcgMTguMiAzMC4xIDYuMiAyLjUgMjIuOCA0LjYgMzIuOS03LjEgMTI4LjktMTQ5LjQgMTMxLjEtMTUxLjkgMTMxLjEtMTUxLjkgMy4xLTMuNCAzLjQtMy4xIDYuOC0zLjFsODMuNCAwYzM1LjEgMCA0MC42LTI1LjIgNDQuMy0zOS43bDQ4LjYtMjQzQzM4MS44IDI1LjggMzcxLjEgMyAzMzEuMSAzek0zMTQuOCA3Ni44bC0xMS40IDU5LjdjLTEuMiA2LjUtOS41IDEzLjItMTYuOSAxMy4ybC0xMDYuNCAwYy0xMiAwLTIwLjYgOC4zLTIwLjYgMjAuM2wwIDEzYzAgMTIgOC42IDIwLjYgMjAuNiAyMC42bDkwLjQgMGM4LjMgMCAxNi42IDkuMiAxNC44IDE4LjItMS44IDguOS0xMC41IDUzLjgtMTEuNCA1OC44LS45IDQuOS02LjggMTMuNS0xNi45IDEzLjVsLTczLjUgMGMtMTMuNSAwLTE3LjIgMS44LTI2LjUgMTIuNiAwIDAtOC45IDExLjQtODkuNSAxMDguMy0uOSAuOS0xLjggLjYtMS44LS4zbDAtMzM4LjhjMC03LjcgNi44LTE2LjYgMTYuNi0xNi42bDIxOSAwYzguMiAwIDE1LjYgNy43IDEzLjUgMTcuNXoiXQogICAgfTsKICAgIGZhU2hpcnRzaW5idWxrID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNoaXJ0c2luYnVsayIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMjE0IiwgIk0xMDAgNDEwLjNsMzAuNiAxMy40IDQuNC05LjktMzAuNi0xMy40LTQuNCA5Ljl6bTM5LjQgMTcuNWwzMC42IDEzLjQgNC40LTkuOS0zMC42LTEzLjQtNC40IDkuOXptMTcyLjEtMTRsNC40IDkuOSAzMC42LTEzLjQtNC40LTkuOS0zMC42IDEzLjR6TTE3OS4xIDQ0NWwzMC4zIDEzLjcgNC40LTkuOS0zMC4zLTEzLjQtNC40IDkuNnpNNjAuNCAzOTIuOGwzMC42IDEzLjQgNC40LTkuNi0zMC42LTEzLjctNC40IDkuOXptMjExLjQgMzguNWw0LjQgOS45IDMwLjYtMTMuNC00LjQtOS45LTMwLjYgMTMuNHptLTM5LjMgMTcuNWw0LjQgOS45IDMwLjYtMTMuNy00LjQtOS42LTMwLjYgMTMuNHptMTE4LjQtNTIuMmw0LjQgOS42IDMwLjYtMTMuNC00LjQtOS45LTMwLjYgMTMuN3pNMTcwIDQ2LjZsLTMzLjUgMCAwIDEwLjUgMzMuNSAwIDAtMTAuNXptLTQ3LjIgMGwtMzMuNiAwIDAgMTAuNSAzMy41IDAgLjEtMTAuNXptLTQ3LjMgMGwtMzMuMiAwIDAgMTAuNSAzMy4zIDAtLjEtMTAuNXptMTQxLjUgMGwtMzMuMiAwIDAgMTAuNSAzMy4yIDAgMC0xMC41em05NC41IDBsLTMzLjUgMCAwIDEwLjUgMzMuNSAwIDAtMTAuNXptNDcuMyAwbC0zMy41IDAgMCAxMC41IDMzLjUgMCAwLTEwLjV6bS05NC42IDBsLTMzLjIgMCAwIDEwLjUgMzMuMiAwIDAtMTAuNXptMTQxLjUgMGwtMzMuMyAwIDAgMTAuNSAzMy4zIDAgMC0xMC41ek01Mi44IDM1MS4xbC0xMC44IDAgMCAzMy41IDEwLjggMCAwLTMzLjV6bTcwLTIxNS45bC0zMy42IDAgMCAxMC41IDMzLjUgMCAuMS0xMC41em0tNzAgMTAuNmwyMi44IDAgMC0xMC41LTMzLjYgMCAwIDMzLjUgMTAuOCAwIDAtMjN6TTIyMS43IDM3NC40YTkxLjMgOTEuMyAwIDEgMCAwLTE4Mi42IDkxLjMgOTEuMyAwIDEgMCAwIDE4Mi42ek0xNzMuNSAyNjMuM2MwLTI1LjQgMjkuNS0zMS44IDQ5LjYtMzEuOCAxNi45IDAgMjkuMiA1LjggNDQuMyAxMmwtOC44IDE2LjktLjkgMGMtNi40LTkuOS0yNC44LTEzLjEtMzUuNi0xMy4xLTkgMC0yOS44IDEuOC0yOS44IDE0LjkgMCAyMS42IDc4LjUtMTAuMiA3OC41IDM3LjkgMCAyNS40LTMxLjUgMzEuMi01MSAzMS4yLTE4LjEgMC0zMi40LTIuOS00Ny4yLTEyLjJsOS0xOC40IC45IDBjNi4xIDEyLjIgMjMuNiAxNC45IDM1LjkgMTQuOSA4LjcgMCAzMi43LTEuMiAzMi43LTE0LjMgMC0yNi4xLTc3LjYgNi4zLTc3LjYtMzh6TTUyLjggMTc4LjRsLTEwLjggMCAwIDMzLjYgMTAuOCAwIDAtMzMuNnpNMzk1LjIgMzg0LjZsMTAuOCAwIDAtMzMuNS0xMC44IDAgMCAzMy41ek01Mi44IDMwNy45bC0xMC44IDAgMCAzMy41IDEwLjggMCAwLTMzLjV6TTAgMy43bDAgNDA2IDIyMS43IDk4LjYgMjI2LjMtOTguNiAwLTQwNi00NDggMHpNNDE4LjggMzkwLjhsLTE5Ni44IDg1LjctMTkyLjgtODUuNyAwLTI3MC4xIDM4OS43IDAgMCAyNzAuMS0uMSAwem0wLTI5OS4zbC0zODkuNiAwIDAtNTguNiAzODkuNyAwIDAgNTguNi0uMSAwek01Mi44IDIyMS42bC0xMC44IDAgMCAzMy41IDEwLjggMCAwLTMzLjV6bTAgNDMuMmwtMTAuOCAwIDAgMzMuNSAxMC44IDAgMC0zMy41ek0xNzAgMTM1LjJsLTMzLjUgMCAwIDEwLjUgMzMuNSAwIDAtMTAuNXpNMzk1LjIgMjk4LjNsMTAuOCAwIDAtMzMuNS0xMC44IDAgMCAzMy41em0wLTQzLjJsMTAuOCAwIDAtMzMuNS0xMC44IDAgMCAzMy41ek0yMTcgMTM1LjJsLTMzLjIgMCAwIDEwLjUgMzMuMiAwIDAtMTAuNXpNMzk1LjIgMjEybDEwLjggMCAwLTMzLjUtMTAuOCAwIDAgMzMuNXptMCAxMjkuNWwxMC44IDAgMC0zMy41LTEwLjggMCAwIDMzLjV6bS0xMzEtMjA2LjNsLTMzLjIgMCAwIDEwLjUgMzMuMiAwIDAtMTAuNXptNDcuMyAwbC0zMy41IDAgMCAxMC41IDMzLjUgMCAwLTEwLjV6bTgzLjcgMzMuNmwxMC44IDAgMC0zMy41LTMzLjUgMCAwIDEwLjUgMjIuOCAwLS4xIDIzem0tMzYuNC0zMy42bC0zMy41IDAgMCAxMC41IDMzLjUgMCAwLTEwLjV6Il0KICAgIH07CiAgICBmYU1pbnRiaXQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibWludGJpdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNjJmIiwgIk03My4yIDUxMmwwLTczLjEgMjkyLjUgMCAwLTczLjIgNzMuMiAwIDAtMTQ2LjMgNzMuMSAwIDAtMjE5LjQtMjE5LjQgMCAwIDczLjEtMTQ2LjMgMCAwIDczLjItNzMuMSAwIDAgMjkyLjYtNzMuMiAwIDAgNzMuMSA3My4yIDB6bTczLjEtMjE5LjRsNzMuMiAwIDAgNzMuMS03My4yIDAgMC03My4xem03My4yLTczLjFsNzMuMSAwIDAgNzMuMS03My4yIDAgMC03My4yIC4xIC4xem03My4xIDBsMC03My4yIDczLjIgMCAwIDczLjEtNzMuMiAwIDAgLjF6TTM2NS43IDczLjFsNzMuMiAwIDAgNzMuMi03My4yIDAgMC03My4yeiJdCiAgICB9OwogICAgZmFTdGF5bGlua2VkID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInN0YXlsaW5rZWQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjNmNSIsICJNMzg2LjcgMjkyLjVsMi43IDIuNy0xNzAtMTY3LjNjLTMuNS0zLjUtOS43LTMuNy0xMy44LS41TDE0OC4zIDE3MWMtNC4yIDMuMi00LjYgOC43LTEuMSAxMi4ybDY4LjEgNjQuM2MzLjYgMy41IDkuOSAzLjcgMTQgLjVsLjEtLjFjNC4xLTMuMiAxMC40LTMgMTQgLjVsODQgODEuM2MzLjYgMy41IDMuMiA5LS45IDEyLjJsLTkzLjIgNzRjLTQuMiAzLjMtMTAuNSAzLjEtMTQuMi0uNEw2Ny4yIDI2OGMtMy41LTMuNS05LjctMy43LTEzLjktLjVMNy41IDMwMi40Yy00LjIgMy4yLTQuNyA4LjctMS4yIDEyLjJMMjE1IDUxMC43czcuNCA2LjggMTcuMy0uOEw0MzAuMyAzNDZjNC0zLjIgNC40LTguNyAuNy0xMi4ybC00NC4zLTQxLjN6bTU0LjUtODMuNEwyMzAuNyAyLjVjLTEuNS0xLjItOC01LjUtMTYuMyAxLjFMNy42IDE2NS43Yy00LjIgMy4yLTQuOCA4LjctMS4yIDEyLjJsNDIuMyA0MS43IDE3MS43IDE2NS4xYzMuNyAzLjUgMTAuMSAzLjcgMTQuMyAuNGw1MC4yLTM4LjgtLjMtLjMgNy43LTZjNC4yLTMuMiA0LjYtOC43IC45LTEyLjJsLTU3LjEtNTQuNGMtMy42LTMuNS0xMC0zLjctMTQuMi0uNWwtLjEgLjFjLTQuMiAzLjItMTAuNSAzLjEtMTQuMi0uNEwxMTMgMTgwLjhjLTMuNi0zLjUtMy4xLTguOSAxLjEtMTIuMmw5Mi4yLTcxLjVjNC4xLTMuMiAxMC4zLTMgMTMuOSAuNWwxNjAuNCAxNTljMy43IDMuNSAxMCAzLjcgMTQuMSAuNWw0NS44LTM1LjhjNC4xLTMuMiA0LjQtOC43IC43LTEyLjJ6Il0KICAgIH07CiAgICBmYVdlYmZsb3cgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAid2ViZmxvdyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNjVjIiwgIk02NDAgNjRsLTIwNC4yIDM5OS4yLTE5MS44IDAgODUuNS0xNjUuNS0zLjggMEMyNTUuMSAzODkuMyAxNDkuOSA0NDkuNSAwIDQ2My4yTDAgMzAwLjFzOTUuOS01LjcgMTUyLjMtNjQuOWwtMTUyLjMgMCAwLTE3MS4yIDE3MS4xIDAgMCAxNDAuOCAzLjggMCA3MC0xNDAuOCAxMjkuNCAwIDAgMTM5LjkgMy44IDAgNzIuNi0xMzkuOSAxODkuMyAweiJdCiAgICB9OwogICAgZmFSZW5yZW4gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicmVucmVuIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxOGIiLCAiTTIxNCAxNjkuMUMyMTQgMjc5LjUgMTUzIDM3NC41IDY2LjQgNDE2LjUgMzAgMzczLjIgOCAzMTcuNyA4IDI1Ni42IDggMTMzLjkgOTcuMSAzMi4yIDIxNCAxMi41bDAgMTU2LjZ6TTI1NSA1MDRjLTQyLjkgMC04My4zLTExLTExOC41LTMwLjQgNTcuMi0zNi4xIDEwMy40LTkwLjcgMTE4LjUtMTU0LjYgMTUuNSA2My45IDYxLjcgMTE4LjUgMTE4LjggMTU0LjctMzUuMSAxOS4zLTc1LjUgMzAuMy0xMTguOCAzMC4zem0xOTAuNi04Ny41QzM1OSAzNzQuNSAyOTggMjc5LjYgMjk4IDE2OS4xbDAtMTU2LjZjMTE2LjkgMTkuNyAyMDYgMTIxLjQgMjA2IDI0NC4xIDAgNjEuMS0yMiAxMTYuNi01OC40IDE1OS45eiJdCiAgICB9OwogICAgZmFSZXYgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicmV2IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY1YjIiLCAiTTE1OC43IDI3NC45YTY1LjYgNjUuNiAwIDEgMSAxMzEuMiAwIDY1LjYgNjUuNiAwIDEgMSAtMTMxLjIgMHptMjcwLjctNS4xbC0uMSAwYy0uNy0yOS4zLTcuNy01OC4yLTIwLjUtODQuNnMtMzEuMi00OS43LTUzLjgtNjguNEwzMDkuNiAxNDNjMjIgMTQuMiA0MC4xIDMzLjggNTIuNyA1Ni44czE5LjEgNDguOCAxOS4xIDc1LjFjMCA4Ni42LTcwLjUgMTU3LjEtMTU3LjEgMTU3LjFTNjcuMiAzNjEuNSA2Ny4yIDI3NC45YzAtODEuOSA2My0xNDkuMyAxNDMtMTU2LjRsMCAzOS4xIDEwOC44LTYyLjgtMTA4LjgtNjIuOCAwIDM4LjNjLTEwNi43IDcuMi0xOTEgOTYtMTkxIDIwNC42IDAgMTExLjYgODkuMSAyMDIuMyAyMDAuMSAyMDVsMCAuMSAyMTAuMiAwIDAtMjEwLjJ6Il0KICAgIH07CiAgICBmYUtleWNkbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJrZXljZG4iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjNiYSIsICJNNjMuOCA0MDkuM2w2MC41LTU5YzMyLjEgNDIuOCA3MS4xIDY2IDEyNi42IDY3LjQgMzAuNSAuNyA2MC4zLTcgODYuNC0yMi40IDUuMSA1LjMgMTguNSAxOS41IDIwLjkgMjItMzIuMiAyMC43LTY5LjYgMzEuMS0xMDguMSAzMC4yLTQzLjMtMS4xLTg0LjYtMTYuNy0xMTcuNy00NC40IC4zLS42LTM4LjIgMzcuNS0zOC42IDM3LjkgOS41IDI5LjgtMTMuMSA2Mi40LTQ2LjMgNjIuNC0yNi44LS4xLTQ3LjUtMjEuNy00Ny41LTQ4LjUgMC0zNC4zIDMzLjEtNTYuNiA2My44LTQ1LjZ6TTQxOC43IDE1Ni45YzE5LjEgMzEuMyAyOS42IDY3LjQgMjguNyAxMDQtMS4xIDQ0LjgtMTkgODcuNS00OC42IDEyMSAuMyAuMyAyMy44IDI1LjIgMjQuMSAyNS41IDkuNi0xLjMgMTkuMiAyIDI1LjkgOS4xIDExLjMgMTIgMTAuOSAzMC45LTEuMSA0Mi40LTEyIDExLjMtMzAuOSAxMC45LTQyLjQtMS4xLTYuNy03LTkuNC0xNi44LTcuNi0yNi4zLTI0LjktMjYuNi00NC40LTQ3LjItNDQuNC00Ny4yIDQyLjctMzQuMSA2My4zLTc5LjYgNjQuNC0xMjQuMiAuNy0yOC45LTcuMi01Ny4yLTIxLjEtODIuMmwyMi4xLTIxek0xMDQgNTMuMWM2LjcgNyA5LjQgMTYuOCA3LjYgMjYuM2w0NS45IDQ4LjFjLTQuNyAzLjgtMTMuMyAxMC40LTIyLjggMjEuMy0yNS40IDI4LjUtMzkuNiA2NC44LTQwLjcgMTAyLjktLjcgMjguOSA2LjEgNTcuMiAyMCA4Mi40TDkyIDM1NS42Yy0xOS4zLTMxLjYtMjguOS02Ny43LTI3LjgtMTA0LjcgMS00NC42IDE4LjMtODcuNiA0Ny41LTEyMS4xTDg2LjQgMTAzLjRjLTkuNiAxLjMtMTkuMi0yLTI1LjktOS4xLTExLjMtMTItMTAuOS0zMC45IDEuMS00Mi40IDExLjktMTEuMiAzMC42LTEwLjkgNDIuNCAxLjJ6TTQ2NC45IDhjMjYgMCA0Ny4xIDIyLjQgNDcuMSA0OC4zUzQ5MC45IDEwNCA0NjQuOSAxMDRjLTYuMyAuMS0xNC0xLjEtMTUuOS0xLjhsLTYyLjkgNTkuN2MtMzIuNy00My42LTc2LjctNjUuOS0xMjYuOS02Ny4yLTMwLjUtLjctNjAuMyA2LjgtODYuMiAyMi40bC0yMS4xLTIyQzE4NC4xIDc0LjMgMjIxLjUgNjQgMjYwIDY0LjkgMzAzLjMgNjYgMzQ0LjYgODEuNiAzNzcuNyAxMDkuNWw0MS4xLTM4LjZjLTEuNS00LjctMi4yLTkuNi0yLjItMTQuNS0uMS0yNi43IDIyLjMtNDguNCA0OC4zLTQ4LjR6TTI1Ni43IDExMy40YzUuNSAwIDEwLjkgLjQgMTYuNCAxLjEgNzguMSA5LjggMTMzLjQgODEuMSAxMjMuOCAxNTkuMS05LjggNzguMS04MS4xIDEzMy40LTE1OS4xIDEyMy44LTc4LjEtOS44LTEzMy40LTgxLjEtMTIzLjgtMTU5LjIgOS4zLTcyLjQgNzAuMS0xMjQuNiAxNDIuNy0xMjQuOHptLTU5IDExOS40Yy42IDIyLjcgMTIuMiA0MS44IDMyLjQgNTIuMmwtMTEgNTEuNyA3My43IDAtMTEtNTEuN2MyMC4xLTEwLjkgMzIuMS0yOSAzMi40LTUyLjItLjQtMzIuOC0yNS44LTU3LjUtNTguMy01OC4zLTMyLjEgLjgtNTcuMyAyNC44LTU4LjIgNTguM3oiXQogICAgfTsKICAgIGZhSGlyZUFIZWxwZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaGlyZS1hLWhlbHBlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmM2IwIiwgIk00NDMuMSAwTDcxLjkgMEM2Ny45IDM3LjMgMzcuNCA2Ny44IDAgNzEuN0wwIDQ0My4yYzM3LjQgNC45IDY2IDMyLjQgNzEuOSA2OC44bDM3Mi4yIDBjMy0zNi40IDMyLjUtNjUuOCA2Ny45LTY5LjhsMC0zNzAuNUM0NzUuNiA2NS44IDQ0NyAzNi40IDQ0My4xIDB6bS0zNyA0MDQuOWMtMzYuMyAwLTE4LjgtMi01NS4xLTItMzUuOCAwLTIxIDItNTYuMSAyLTUuOSAwLTQuOS04LjIgMC05LjggMjIuOC03LjYgMjIuOS0xMC4yIDI0LjYtMTIuOCAxMC40LTE1LjYgNS45LTgzIDUuOS0xMTMgMC01LjMtNi40LTEyLjgtMTMuOC0xMi44bC0xMTEuMiAwYy03LjQgMC0xMy44IDcuNS0xMy44IDEyLjggMCAzMC00LjUgOTcuNCA1LjkgMTEzIDEuNyAyLjUgMS44IDUuMiAyNC42IDEyLjggNC45IDEuNiA2IDkuOCAwIDkuOC0zNS4xIDAtMjAuMy0yLTU2LjEtMi0zNi4zIDAtMTguOCAyLTU1LjEgMi03LjkgMC01LjgtMTAuOCAwLTEwLjggMTAuMi0zLjQgMTMuNS0zLjUgMjEuNy0xMy44IDcuNy0xMi45IDcuOS00NC40IDcuOS0xMjcuOGwwLTEwMS4yYzAtMjIuMi0xMi4yLTI4LjMtMjguNi0zMi40LTguOC0yLjItNC0xMS44IDEtMTEuOCAzNi41IDAgMjAuNiAyIDU3LjEgMiAzMi43IDAgMTYuNS0yIDQ5LjItMiAzLjMgMCA4LjUgOC4zIDEgMTAuOC00LjkgMS42LTI3LjYgMy43LTI3LjYgMzkuMyAwIDQ1LjYtLjIgNTUuOCAxIDY4LjggMCAxLjMgMi4zIDEyLjggMTIuOCAxMi44bDEwOS4yIDBjMTAuNSAwIDEyLjgtMTEuNSAxMi44LTEyLjggMS4yLTEzIDEtMjMuMiAxLTY4LjggMC0zNS42LTIyLjctMzcuNy0yNy42LTM5LjMtNy41LTIuNS0yLjMtMTAuOCAxLTEwLjggMzIuNyAwIDE2LjUgMiA0OS4yIDIgMzYuNSAwIDIwLjYtMiA1Ny4xLTIgNC45IDAgOS45IDkuNiAxIDExLjgtMTYuNCA0LjEtMjguNiAxMC4zLTI4LjYgMzIuNGwwIDEwMS4yYzAgODMuNCAuMSAxMTQuOSA3LjkgMTI3LjggOC4yIDEwLjIgMTEuNCAxMC40IDIxLjcgMTMuOCA1LjggMCA3LjggMTAuOCAwIDEwLjh6Il0KICAgIH07CiAgICBmYVNxdWFyZUhhY2tlck5ld3MgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLWhhY2tlci1uZXdzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImhhY2tlci1uZXdzLXNxdWFyZSJdLCAiZjNhZiIsICJNNDQ4IDk2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjB6TTIxIDIyOS4ycy4xLS4xIC4xLS4yIC4xLS4yIC4yLS4yYzAgLjEgMCAuMy0uMSAuNGwtLjIgMHpNMjM5LjIgMzg0bC0zMS40IDAgMC0xMDIuNy03OS44LTE1My4zIDM3LjMgMGM0MS41IDc3LjcgNDguMSA5NS44IDU0LjEgMTEyIDEuNiA0LjMgMy4xIDguNSA1LjIgMTMuNiAzLjItNyA1LjEtMTEuOSA3LjEtMTcuMyA1LjktMTUuMyAxMi44LTMzLjIgNTMuNS0xMDguM2wzNC44IDAtODAuOCAxNTUuMSAwIDEwMC45eiJdCiAgICB9OwogICAgZmFIYWNrZXJOZXdzU3F1YXJlID0gZmFTcXVhcmVIYWNrZXJOZXdzOwogICAgZmFDcmVhdGl2ZUNvbW1vbnNQZEFsdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjcmVhdGl2ZS1jb21tb25zLXBkLWFsdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNGVkIiwgIk0yNTUuNiA4QzExMi43IDggOCAxMjMuMSA4IDI1NiA4IDM5NC41IDEyMS42IDUwNCAyNTUuNiA1MDQgMzg1LjUgNTA0IDUwNCA0MDMuMSA1MDQgMjU2IDUwNCAxMTguMSAzOTcuNCA4IDI1NS42IDh6bS44IDQ1MC44Yy0xMTIuNSAwLTIwMy43LTkzLTIwMy43LTIwMi44IDAtMTA1LjQgODUuNS0yMDMuMyAyMDMuNy0yMDMuMyAxMTIuNiAwIDIwMi45IDg5LjUgMjAyLjggMjAzLjMgMCAxMjEuNy05OS42IDIwMi44LTIwMi44IDIwMi44ek0zMjQuNyAxODZsLTUzLjIgMCAwIDEzNy4yIDUzLjIgMGMyMS40IDAgNzAtNS4xIDcwLTY4LjYgMC02My40LTQ4LjYtNjguNi03MC02OC42em0uOCAxMDguNWwtMTkuOSAwIDAtNzkuNyAxOS40LS4xYzMuOCAwIDM1LTIuMSAzNSAzOS45IDAgMjQuNi0xMC41IDM5LjktMzQuNSAzOS45ek0yMTEuNyAxODZsLTY4LjIgMCAwIDEzNy4zIDM0LjYgMCAwLTQ0LjMgMjcgMGM1NC4xIDAgNTcuMS0zNy41IDU3LjEtNDYuNSAwLTMxLTE2LjgtNDYuNS01MC41LTQ2LjV6bS00LjkgNjcuM2wtMjkuMiAwIDAtNDEuNiAyOC4zIDBjMzAuOSAwIDI4LjggNDEuNiAuOSA0MS42eiJdCiAgICB9OwogICAgZmFPcmNpZCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJvcmNpZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmOGQyIiwgIk0yOTQuNyAxODguMmwtNDUuOSAwIDAgMTUzLjggNDcuNSAwYzY3LjYgMCA4My4xLTUxLjMgODMuMS03Ni45IDAtNDEuNi0yNi41LTc2LjktODQuNy03Ni45ek0yNTYgOGEyNDggMjQ4IDAgMSAwIDAgNDk2IDI0OCAyNDggMCAxIDAgMC00OTZ6TTE3NS4yIDM2OC44bC0yOS44IDAgMC0yMDcuNSAyOS44IDAgMCAyMDcuNXpNMTYwLjMgOTguNWExOS42IDE5LjYgMCAxIDEgMCAzOS4yIDE5LjYgMTkuNiAwIDEgMSAwLTM5LjJ6TTMwMCAzNjlsLTgxIDAgMC0yMDcuNyA4MC42IDBjNzYuNyAwIDExMC40IDU0LjggMTEwLjQgMTAzLjkgMCA1My4zLTQxLjcgMTAzLjktMTEwIDEwMy45eiJdCiAgICB9OwogICAgZmFCZWhhbmNlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImJlaGFuY2UiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjFiNCIsICJNMjMyIDIzNy4yYzMxLjgtMTUuMiA0OC40LTM4LjIgNDguNC03NCAwLTcwLjYtNTIuNi04Ny44LTExMy4zLTg3LjhsLTE2Ny4xIDAgMCAzNTQuNCAxNzEuOCAwYzY0LjQgMCAxMjQuOS0zMC45IDEyNC45LTEwMi45IDAtNDQuNS0yMS4xLTc3LjQtNjQuNy04OS43ek03Ny45IDEzNS45bDczLjEgMGMyOC4xIDAgNTMuNCA3LjkgNTMuNCA0MC41IDAgMzAuMS0xOS43IDQyLjItNDcuNSA0Mi4ybC03OSAwIDAtODIuN3ptODMuMyAyMzMuN2wtODMuMyAwIDAtOTcuNiA4NC45IDBjMzQuMyAwIDU2IDE0LjMgNTYgNTAuNiAwIDM1LjgtMjUuOSA0Ny01Ny42IDQ3ek01MTkuNyAxMjguOWwtMTQzLjcgMCAwLTM0LjkgMTQzLjcgMCAwIDM0Ljl6TTU3NiAzMDUuMmMwLTc1LjktNDQuNC0xMzkuMi0xMjQuOS0xMzkuMi03OC4yIDAtMTMxLjMgNTguOC0xMzEuMyAxMzUuOCAwIDc5LjkgNTAuMyAxMzQuNyAxMzEuMyAxMzQuNyA2MS4zIDAgMTAxLTI3LjYgMTIwLjEtODYuM2wtNjIuMiAwYy02LjcgMjEuOS0zNC4zIDMzLjUtNTUuNyAzMy41LTQxLjMgMC02My0yNC4yLTYzLTY1LjNsMTg1LjEgMGMuMy00LjIgLjYtOC43IC42LTEzLjJ6TTM5MC40IDI3NGMyLjMtMzMuNyAyNC43LTU0LjggNTguNS01NC44IDM1LjQgMCA1My4yIDIwLjggNTYuMiA1NC44bC0xMTQuNyAweiJdCiAgICB9OwogICAgZmFNb25lcm8gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibW9uZXJvIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzZDAiLCAiTTM2MCAzODRsMTA4LjQgMEM0MjUgNDU1LjkgMzQ2LjEgNTA0IDI1NiA1MDRTODcgNDU1LjkgNDMuNiAzODRsMTA4LjQgMCAwLTEyNy44IDEwNCAxMDQuOCAxMDQtMTA1IDAgMTI4ek05NiAzMzZsMC0yMDggMTU5LjQgMTU5LjQgMTYwLjYtMTU5LjQgMCAyMDggNzQuOCAwYzguNS0yNS4xIDEzLjItNTIgMTMuMi04MCAwLTEzNy0xMTEtMjQ4LTI0OC0yNDhTOCAxMTkgOCAyNTZjMCAyOCA0LjYgNTQuOSAxMy4yIDgwTDk2IDMzNnoiXQogICAgfTsKICAgIGZhRmlnbWEgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZmlnbWEiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjc5OSIsICJNMTQgOTUuOEMxNCA0Mi45IDU2LjkgMCAxMDkuOCAwTDI3NC4yIDBjNTIuOSAwIDk1LjggNDIuOSA5NS44IDk1LjggMCAzMy41LTE3LjIgNjMtNDMuMiA4MC4xIDI2IDE3LjEgNDMuMiA0Ni42IDQzLjIgODAuMSAwIDUyLjktNDIuOSA5NS44LTk1LjggOTUuOGwtMi4xIDBjLTI0LjggMC00Ny40LTkuNC02NC40LTI0LjlsMCA4OC4zYzAgNTMuNi00NCA5Ni44LTk3LjQgOTYuOC01Mi44IDAtOTYuMy00Mi44LTk2LjMtOTUuOCAwLTMzLjUgMTcuMi02MyA0My4yLTgwLjEtMjYtMTcuMS00My4yLTQ2LjYtNDMuMi04MC4xczE3LjItNjMgNDMuMi04MC4xQzMxLjIgMTU4LjggMTQgMTI5LjMgMTQgOTUuOHptMTYyLjMgOTUuOGwtNjYuNSAwYy0zNS42IDAtNjQuNCAyOC44LTY0LjQgNjQuNCAwIDM1LjQgMjguNiA2NC4yIDY0IDY0LjRsNjYuOSAwIDAtMTI4Ljh6TTIwNy43IDI1NmMwIDM1LjYgMjguOCA2NC40IDY0LjQgNjQuNGwyLjEgMGMzNS42IDAgNjQuNC0yOC44IDY0LjQtNjQuNHMtMjguOC02NC40LTY0LjQtNjQuNGwtMi4xIDBjLTM1LjYgMC02NC40IDI4LjgtNjQuNCA2NC40em0tOTcuOSA5NS44bC0uNCAwYy0zNS40IC4yLTY0IDI5LTY0IDY0LjRzMjkuMiA2NC40IDY0LjkgNjQuNGMzNi4zIDAgNjYtMjkuNCA2Ni02NS41bDAtNjMuNC02Ni41IDB6bTAtMzIwLjRjLTM1LjYgMC02NC40IDI4LjgtNjQuNCA2NC40czI4LjggNjQuNCA2NC40IDY0LjRsNjYuNSAwIDAtMTI4LjgtNjYuNSAwem05Ny45IDEyOC44bDY2LjUgMGMzNS42IDAgNjQuNC0yOC44IDY0LjQtNjQuNHMtMjguOC02NC40LTY0LjQtNjQuNGwtNjYuNSAwIDAgMTI4Ljh6Il0KICAgIH07CiAgICBmYUluc3RhZ3JhbSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJpbnN0YWdyYW0iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjE2ZCIsICJNMjI0LjMgMTQxYTExNSAxMTUgMCAxIDAgLS42IDIzMCAxMTUgMTE1IDAgMSAwIC42LTIzMHptLS42IDQwLjRhNzQuNiA3NC42IDAgMSAxIC42IDE0OS4yIDc0LjYgNzQuNiAwIDEgMSAtLjYtMTQ5LjJ6bTkzLjQtNDUuMWEyNi44IDI2LjggMCAxIDEgNTMuNiAwIDI2LjggMjYuOCAwIDEgMSAtNTMuNiAwem0xMjkuNyAyNy4yYy0xLjctMzUuOS05LjktNjcuNy0zNi4yLTkzLjktMjYuMi0yNi4yLTU4LTM0LjQtOTMuOS0zNi4yLTM3LTIuMS0xNDcuOS0yLjEtMTg0LjkgMC0zNS44IDEuNy02Ny42IDkuOS05My45IDM2LjFzLTM0LjQgNTgtMzYuMiA5My45Yy0yLjEgMzctMi4xIDE0Ny45IDAgMTg0LjkgMS43IDM1LjkgOS45IDY3LjcgMzYuMiA5My45czU4IDM0LjQgOTMuOSAzNi4yYzM3IDIuMSAxNDcuOSAyLjEgMTg0LjkgMCAzNS45LTEuNyA2Ny43LTkuOSA5My45LTM2LjIgMjYuMi0yNi4yIDM0LjQtNTggMzYuMi05My45IDIuMS0zNyAyLjEtMTQ3LjggMC0xODQuOHpNMzk5IDM4OGMtNy44IDE5LjYtMjIuOSAzNC43LTQyLjYgNDIuNi0yOS41IDExLjctOTkuNSA5LTEzMi4xIDlzLTEwMi43IDIuNi0xMzIuMS05Yy0xOS42LTcuOC0zNC43LTIyLjktNDIuNi00Mi42LTExLjctMjkuNS05LTk5LjUtOS0xMzIuMXMtMi42LTEwMi43IDktMTMyLjFjNy44LTE5LjYgMjIuOS0zNC43IDQyLjYtNDIuNiAyOS41LTExLjcgOTkuNS05IDEzMi4xLTlzMTAyLjctMi42IDEzMi4xIDljMTkuNiA3LjggMzQuNyAyMi45IDQyLjYgNDIuNiAxMS43IDI5LjUgOSA5OS41IDkgMTMyLjFzMi43IDEwMi43LTkgMTMyLjF6Il0KICAgIH07CiAgICBmYVBlcmJ5dGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicGVyYnl0ZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlMDgzIiwgIk0zMDUuMyAyODQuNmwtNTguNyAwIDAgOTguNyA1OC43IDBjMTYuMyAwIDI5LTQuNiAzOC4yLTEzLjhzMTMuOC0yMS4yIDEzLjgtMzYuMWMwLTE0LjYtNC43LTI2LjMtMTQtMzUuM3MtMjItMTMuNS0zNy45LTEzLjV6TTE0OS40IDEyOC43bC01OC43IDAgMCA5OC43IDU4LjcgMGMxNi4zIDAgMjktNC42IDM4LjItMTMuOHMxMy44LTIxLjIgMTMuOC0zNi4xYzAtMTQuNi00LjctMjYuMy0xNC0zNS4zcy0yMi0xMy41LTM3LjktMTMuNXpNMzY2LjYgMzJMODEuNCAzMmMtMjEuNiAwLTQyLjIgOC42LTU3LjUgMjMuOVMwIDkxLjggMCAxMTMuNEwwIDM5OC42YzAgMjEuNiA4LjYgNDIuMiAyMy45IDU3LjVTNTkuOCA0ODAgODEuNCA0ODBsMjg1LjMgMGMyMS42IDAgNDIuMi04LjYgNTcuNS0yMy45UzQ0OCA0MjAuMiA0NDggMzk4LjZsMC0yODUuM2MwLTIxLjYtOC42LTQyLjItMjMuOS01Ny41UzM4OC4yIDMyIDM2Ni42IDMyem02My42IDM2Ni42YzAgMTYuOS02LjcgMzMtMTguNyA0NXMtMjguMSAxOC42LTQ1IDE4LjdsLTI4NS4zIDBjLTE2LjkgMC0zMy02LjctNDUtMTguN3MtMTguNi0yOC4xLTE4LjctNDVsMC0yODUuM2MwLTE2LjkgNi43LTMzIDE4LjctNDVzMjguMS0xOC42IDQ1LTE4LjdsMjg1LjMgMGMxNi45IDAgMzMgNi43IDQ1IDE4LjdzMTguNiAyOC4xIDE4LjcgNDVsMCAyODUuM3ptLTEyNS0yNjkuOWwtNTguNyAwIDAgOTguNyA1OC43IDBjMTYuMyAwIDI5LTQuNiAzOC4yLTEzLjhzMTMuOC0yMS4yIDEzLjgtMzYuMWMwLTE0LjYtNC43LTI2LjMtMTQtMzUuM3MtMjItMTMuNS0zNy45LTEzLjV6Il0KICAgIH07CiAgICBmYVNxdWFyZVZpbWVvID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS12aW1lbyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJ2aW1lby1zcXVhcmUiXSwgImYxOTQiLCAiTTQ0OCA5NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwek0zMTguNSAzMDkuNWMtNDMuNSA1Ni41LTgwLjMgODQuOC0xMTAuNCA4NC44LTE4LjcgMC0zNC40LTE3LjItNDcuMy01MS42LTMuOC0xMy45LTcuMy0yNi45LTEwLjUtMzktMTguMi02OC4zLTI4LjYtMTA3LjQtNDYuMi0xMDcuNC0yLjQgMC0xMC44IDUtMjUuMSAxNS4xTDY0IDE5MmM3LTYuMSAxMy45LTEyLjQgMjAuNi0xOC41IDI5LjEtMjYuMyA1NS42LTUwLjMgNzMuNS01MS45IDI0LjktMi40IDQwLjIgMTQuNiA0NiA1MS4xIDIwLjUgMTI5LjYgMjkuNiAxNDkuMiA2Ni44IDkwLjUgMTMuNC0yMS4yIDIwLjYtMzcuMiAyMS41LTQ4LjMgMy40LTMyLjgtMjUuNi0zMC42LTQ1LjItMjIuMiAxNS43LTUxLjUgNDUuOC03Ni41IDkwLjEtNzUuMSAzMi45IDEgNDguNCAyMi40IDQ2LjUgNjQtMS40IDMxLjEtMjMuMiA3My44LTY1LjMgMTI3Ljl6Il0KICAgIH07CiAgICBmYVZpbWVvU3F1YXJlID0gZmFTcXVhcmVWaW1lbzsKICAgIGZhUHVzaGVkID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInB1c2hlZCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmM2UxIiwgIk00MTUuMSAxMTEuOWwtOTguNS05IDE0LTMzLjRjMTAuNC0yMy41LTEwLjgtNDAuNC0yOC43LTM3TDMwLjYgNzYuOWMtMTUuMSAyLjctMjYgMTguMy0yMS40IDM2LjZMMTE0LjMgNDYxLjhjNi41IDIxLjMgMzYuNyAyNC4yIDQ3LjcgN0wxOTcuMyAzODggNDMyLjUgMTU2LjdjMTYuNC0xNi44IDQuMy00Mi45LTE3LjQtNDQuOHpNMzA1LjcgNTMuNmM1LjEtLjcgNy41IDIuNSA1LjIgNy40bC0xNi44IDM5LjktMTc3LjQtMTYuMyAxODktMzF6TTMwLjggMTA3LjljLTMuMS01LjEgMS0xMCA2LjEtOS4xbDI0OC43IDIyLjctOTYuOSAyMzAuNy0xNTcuOS0yNDQuM3pNMTQ0LjEgNDU2LjRjLTIuNiA0LTcuOSAzLjEtOS40LTEuMkw1MS42IDE3OS43IDE3OS4zIDM3Ny4zYy03IDE1LTM1LjIgNzkuMS0zNS4yIDc5LjF6TTQxNi45IDE0MS45bC0xOTguNyAxOTUuNCA4OS43LTIxMy43IDEwNi40IDkuN2M0IDEuMSA1LjcgNS4zIDIuNiA4LjZ6Il0KICAgIH07CiAgICBmYU1peGNsb3VkID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1peGNsb3VkIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYyODkiLCAiTTIxMyAzNDYuNmwtMzMuMiAwIDAtMTUxLjUgNi4yLTIxLjYtMTAuNyAwLTM4LjEgMTczLjEtNjEgMC0zOC40LTE3My4xLTEwLjUgMCA1LjkgMjEuNiAwIDE1MS41LTMzLjIgMCAwLTE4MS42IDY1LjcgMCAzNi42IDE3My4xIDguNSAwIDM2LjYtMTczLjEgNjUuNyAwIDAgMTgxLjZ6bTMzMS41LTYzbC04NiA2Mi4xIDAtMzguMSA3Mi45LTUxLjgtNzIuOS01MS44IDAtMzguMSA4NiA2Mi4zIDkuMyAwIDg2LjMtNjIuMyAwIDM4LjEtNzMuMSA1MS44IDczLjEgNTEuOCAwIDM4LjEtODYuMy02Mi4xLTkuMyAwek00MzAuMiAyNzIuM2wtMTgyIDAgMC0zMy4xIDE4MiAwIDAgMzMuMXoiXQogICAgfTsKICAgIGZhWWFuZGV4SW50ZXJuYXRpb25hbCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ5YW5kZXgtaW50ZXJuYXRpb25hbCIsCiAgICAgIGljb246IFszMjAsIDUxMiwgW10sICJmNDE0IiwgIk0xMjkuNSA1MTJsMC0xNjYuMS0xMTEtMjk3LjkgNTUuOCAwIDgxLjggMjI5LjcgOTQuMS0yNzcuNyA1MS4zIDAtMTIwLjcgMzQ3LjggMCAxNjQuMi01MS4zIDB6Il0KICAgIH07CiAgICBmYUhpdmUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaGl2ZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMDdmIiwgIk0yNjAuNCAyNTQuOUwxMzEuNSAzMy4xYy0uMi0uMy0uNS0uNi0uOC0uOHMtLjctLjMtMS4xLS4zLS44IC4xLTEuMSAuMy0uNiAuNS0uOCAuOEwuMyAyNTQuOWMtLjIgLjMtLjMgLjctLjMgMS4xcy4xIC44IC4zIDEuMUwxMjkuMSA0NzguOWMuMiAuMyAuNSAuNiAuOCAuOHMuNyAuMyAxLjEgLjMgLjgtLjEgMS4xLS4zIC42LS41IC44LS44TDI2MC40IDI1Ny4xYy4yLS4zIC4zLS43IC4zLTEuMXMtLjEtLjgtLjMtMS4xem0zOS4xLTI1LjdjLjIgLjMgLjUgLjYgLjggLjhzLjcgLjMgMS4xIC4zbDY2LjUgMGMuNCAwIC44LS4xIDEuMS0uM3MuNi0uNSAuOC0uOCAuMy0uNyAuMy0xLjEtLjEtLjgtLjMtMS4xTDI1OS4xIDMzLjFjLS4yLS4zLS41LS42LS44LS44cy0uNy0uMy0xLjEtLjNsLTY2LjUgMGMtLjQgMC0uOCAuMS0xLjEgLjNzLS42IC41LS44IC44LS4zIC43LS4zIDEuMSAuMSAuOCAuMyAxLjFMMjk5LjQgMjI5LjJ6bTIxMi4zIDI1LjdMMzg0LjkgMzMuMWMtLjItLjMtLjUtLjYtLjgtLjhzLS43LS4zLTEuMS0uM2wtNjYuNiAwYy0uNCAwLS44IC4xLTEuMSAuM3MtLjYgLjUtLjggLjgtLjMgLjctLjMgMS4xIC4xIC44IC4zIDEuMUw0NDAuNyAyNTYgMzE0LjUgNDc2LjdjLS4yIC4zLS4zIC43LS4zIDEuMXMuMSAuOCAuMyAxLjEgLjUgLjYgLjggLjggLjcgLjMgMS4xIC4zbDY2LjYgMGMuNCAwIC44LS4xIDEuMS0uM3MuNi0uNSAuOC0uOEw1MTEuNyAyNTcuMWMuMi0uMyAuMy0uNyAuMy0xLjFzLS4xLS44LS4zLTEuMXpNMzY2IDI4NC45bC02Ni41IDBjLS40IDAtLjggLjEtMS4xIC4zcy0uNiAuNS0uOCAuOEwxODguOCA0NzYuN2MtLjIgLjMtLjMgLjctLjMgMS4xcy4xIC44IC4zIDEuMSAuNSAuNiAuOCAuOCAuNyAuMyAxLjEgLjNsNjYuNSAwYy40IDAgLjgtLjEgMS4xLS4zcy42LS41IC44LS44TDM2Ny45IDI4OC4zYy4yLS4zIC4zLS43IC4zLTEuMXMtLjEtLjgtLjMtMS4xLS41LS42LS44LS44LS43LS4zLTEuMS0uM3oiXQogICAgfTsKICAgIGZhQ3JlYXRpdmVDb21tb25zWmVybyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjcmVhdGl2ZS1jb21tb25zLXplcm8iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjRmMyIsICJNMjU1LjYgOEMzOTcuNCA4IDUwNCAxMTguMSA1MDQgMjU2IDUwNCA0MDMuMSAzODUuNSA1MDQgMjU1LjYgNTA0IDEyMS42IDUwNCA4IDM5NC41IDggMjU2IDggMTIzLjEgMTEyLjcgOCAyNTUuNiA4em0uOCA0NC43Yy0xMTguMiAwLTIwMy43IDk3LjktMjAzLjcgMjAzLjMgMCAxMDkuOCA5MS4yIDIwMi44IDIwMy43IDIwMi44IDEwMy4yIDAgMjAyLjgtODEuMSAyMDIuOC0yMDIuOCAuMS0xMTMuOC05MC4yLTIwMy4zLTIwMi44LTIwMy4zem0tLjQgNjAuNWMtODEuOSAwLTEwMi41IDc3LjMtMTAyLjUgMTQyLjhTMTc0LjEgMzk4LjggMjU2IDM5OC44IDM1OC41IDMyMS41IDM1OC41IDI1NiAzMzcuOSAxMTMuMiAyNTYgMTEzLjJ6bTAgNTMuOWMzLjMgMCA2LjQgLjUgOS4yIDEuMiA1LjkgNS4xIDguOCAxMi4xIDMuMSAyMS45TDIxMy44IDI5MC40Yy0xLjctMTIuNy0xLjktMjUuMS0xLjktMzQuNCAwLTI4LjggMi04OC45IDQ0LjEtODguOXptNDAuOCA0Ni4yYzIuOSAxNS40IDMuMyAzMS40IDMuMyA0Mi43IDAgMjguOS0yIDg4LjktNDQuMSA4OC45LTEzLjUgMC0zMi42LTcuNy0yMC4xLTI2LjRsNjAuOS0xMDUuMnoiXQogICAgfTsKICAgIGZhU3F1YXJlU25hcGNoYXQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXNuYXBjaGF0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInNuYXBjaGF0LXNxdWFyZSJdLCAiZjJhZCIsICJNMzg0IDMyTDY0IDMyYy0xNyAwLTMzLjMgNi43LTQ1LjMgMTguN1MwIDc5IDAgOTZMMCA0MTZjMCAxNyA2LjcgMzMuMyAxOC43IDQ1LjNTNDcgNDgwIDY0IDQ4MGwzMjAgMGMxNyAwIDMzLjMtNi43IDQ1LjMtMTguN1M0NDggNDMzIDQ0OCA0MTZsMC0zMjBjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNTNDAxIDMyIDM4NCAzMnptLTMuOSAzMTkuM2wtLjEgLjFjLTIuNSAyLjgtNS40IDUuMS04LjcgNi44LTYuNSAzLjYtMTMuNCA2LjMtMjAuNiA4LjItMS40IC40LTIuNyAxLTMuOSAxLjgtMi4yIDEuOS0yLjEgNC42LTQuNCA4LjYtMS43IDMtNCA1LjUtNi44IDcuNS02LjcgNC42LTE0LjIgNC45LTIyLjIgNS4yLTcuMiAuMy0xNS40IC42LTI0LjcgMy43LTMuOCAxLjItNy44IDMuNy0xMi40IDYuNS0xMS4zIDYuOS0yNi43IDE2LjQtNTIuMyAxNi40cy00MC45LTkuNC01Mi4xLTE2LjNjLTQuNy0yLjktOC43LTUuNC0xMi41LTYuNi05LjMtMy4xLTE3LjUtMy40LTI0LjctMy43LTgtLjMtMTUuNS0uNi0yMi4yLTUuMi0yLjQtMS42LTQuNC0zLjctNi02LjEtMy4yLTQuNi0yLjktNy44LTUuMy05LjktMS4zLS44LTIuNi0xLjUtNC4xLTEuOC03LjEtMS45LTEzLjktNC42LTIwLjMtOC4xLTMuMS0xLjYtNS45LTMuOC04LjMtNi4zLTYuNi02LjgtOC4zLTE0LjgtNS43LTIxLjggMy40LTkuMyAxMS42LTEyLjEgMTkuNC0xNi4zIDE0LjgtOCAyNi4zLTE4LjEgMzQuNC0yOS45IDIuMy0zLjMgNC4zLTYuOSA2LTEwLjYgLjgtMi4yIC44LTMuMyAuMi00LjQtLjYtLjktMS4zLTEuNi0yLjItMi4yLTIuNS0xLjctNS4xLTMuNC02LjktNC41LTMuMy0yLjEtNS45LTMuOC03LjUtNS02LjMtNC40LTEwLjYtOS0xMy40LTE0LjItMS45LTMuNi0zLTcuNi0zLjMtMTEuNnMuNC04LjEgMS45LTExLjljNC4xLTEwLjkgMTQuNS0xNy43IDI3LTE3LjcgMi42IDAgNS4zIC4zIDcuOCAuOCAuNyAuMiAxLjQgLjMgMiAuNS0uMS03LjQgLjEtMTUuNCAuNy0yMy4xIDIuNC0yNy4zIDExLjktNDEuNiAyMS45LTUzIDYuNC03LjIgMTMuOS0xMy4yIDIyLjMtMTcuOSAxNS4xLTguNiAzMi4yLTEzIDUwLjktMTNzMzUuOCA0LjQgNTAuOSAxM2M4LjMgNC43IDE1LjkgMTAuOCAyMi4yIDE3LjkgMTAgMTEuNCAxOS41IDI1LjcgMjEuOSA1MyAuNiA3LjcgLjkgMTUuNCAuNyAyMy4xIC43LS4yIDEuNC0uMyAyLjEtLjUgMi42LS42IDUuMi0uOCA3LjgtLjggMTIuNSAwIDIyLjggNi44IDI3IDE3LjcgMS41IDMuOCAyLjEgNy45IDEuOSAxMS45cy0xLjQgOC0zLjMgMTEuNmMtMi43IDUuMi03LjEgOS45LTEzLjQgMTQuMi0xLjcgMS4yLTQuMyAyLjktNy41IDUtMS44IDEuMi00LjUgMi45LTcuMiA0LjctLjggLjUtMS40IDEuMi0xLjkgMi0uNSAxLS41IDIuMiAuMiA0LjIgMS43IDMuOCAzLjcgNy40IDYuMSAxMC44IDguMyAxMi4xIDIwLjIgMjIuMyAzNS41IDMwLjQgMS41IC44IDMgMS41IDQuNCAyLjMgLjcgLjMgMS42IC44IDIuNSAxLjMgNC45IDIuNyA5LjIgNiAxMS41IDEyLjIgMi41IDYuOSAxIDE0LjctNS4yIDIxLjN6bS0xNi43LTE4LjVjLTUwLjMtMjQuMy01OC4zLTYxLjktNTguNy02NC43LS40LTMuNC0uOS02IDIuOC05LjUgMy42LTMuMyAxOS41LTEzLjIgMjQtMTYuMyA3LjMtNS4xIDEwLjUtMTAuMiA4LjItMTYuNS0xLjctNC4zLTUuNy02LTEwLTYtMS4zIDAtMi43IC4yLTQgLjQtOCAxLjctMTUuOCA1LjgtMjAuNCA2LjktLjUgLjEtMS4xIC4yLTEuNyAuMi0yLjQgMC0zLjMtMS4xLTMuMS00IC42LTguOCAxLjgtMjUuOSAuNC00MS45LTEuOS0yMi05LTMyLjktMTcuNC00Mi42LTQuMS00LjYtMjMuMS0yNC43LTU5LjUtMjQuN3MtNTUuNCAyMC4xLTU5LjUgMjQuOGMtOC40IDkuNy0xNS41IDIwLjYtMTcuNCA0Mi42LTEuNCAxNi0uMSAzMy4xIC40IDQxLjkgLjIgMi44LS43IDQtMy4xIDQtLjYgMC0xLjEtLjEtMS43LS4yLTQuNS0xLjEtMTIuMy01LjEtMjAuMy02LjktMS4zLS4zLTIuNi0uNC00LS40LTQuMyAwLTguMyAxLjYtMTAgNi0yLjQgNi4zIC44IDExLjQgOC4yIDE2LjUgNC40IDMuMSAyMC40IDEzIDI0IDE2LjMgMy43IDMuNCAzLjIgNi4xIDIuOCA5LjUtLjQgMi44LTguNCA0MC40LTU4LjcgNjQuNy0yLjkgMS40LTggNC40IC45IDkuMyAxMy45IDcuNiAyMy4xIDYuOCAzMC4zIDExLjQgNi4xIDMuOSAyLjUgMTIuNCA2LjkgMTUuNCA1LjUgMy44IDIxLjYtLjMgNDIuMyA2LjYgMTcuNCA1LjcgMjguMSAyMiA1OSAyMnM0MS44LTE2LjMgNTguOS0yMmMyMC44LTYuOSAzNi45LTIuOCA0Mi4zLTYuNiA0LjQtMy4xIC44LTExLjUgNi45LTE1LjQgNy4yLTQuNiAxNi40LTMuOCAzMC4zLTExLjUgOC44LTQuOSAzLjgtNy45IC45LTkuNHoiXQogICAgfTsKICAgIGZhU25hcGNoYXRTcXVhcmUgPSBmYVNxdWFyZVNuYXBjaGF0OwogICAgZmFUaGVtZWlzbGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidGhlbWVpc2xlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyYjIiLCAiTTIwOCA4OC4zYzAtMTAgNi4zLTIxLjcgMTcuNy0yMS43IDExLjEgMCAxNy43IDExLjcgMTcuNyAyMS43IDAgMTAuMy02LjYgMjEuNy0xNy43IDIxLjctMTEuNCAwLTE3LjctMTEuNC0xNy43LTIxLjd6bTMwNCAxNjBjMCAzNi0xMS40IDEwMi4zLTM2LjMgMTI5LjctMjIuOSAyNC45LTg3LjQgNjEuMS0xMjAuOSA3MC42bC0xLjEgLjMgMCAzMi42YzAgMTYuMy0xMi42IDMwLjYtMjkuMSAzMC42LTEwIDAtMTkuNC01LjctMjQuNi0xNC4zLTUuNCA4LjYtMTQuOSAxNC4zLTI0LjkgMTQuM3MtMTkuNC01LjctMjQuOS0xNC4zYy01LjEgOC42LTE0LjYgMTQuMy0yNC42IDE0LjMtMTAuMyAwLTE5LjQtNS43LTI0LjktMTQuMy01LjEgOC42LTE0LjYgMTQuMy0yNC42IDE0LjMtMTguOSAwLTI5LjQtMTUuNy0yOS40LTMyLjktMTYuMyAxMi4zLTM1LjcgMTkuNC01Ni42IDE5LjQtMjIgMC00My40LTguMy02MC4zLTIyLjkgMTAuMy0uMyAyMC42LTIuMyAzMC4zLTUuNy0yMC45LTUuNy0zOS40LTE4LjktNTItMzYuMyAyMS40IDQuNiA0Ni4yIDEuNyA2Ny4xLTExLjEtMjItMjItNTYuNi01OC45LTY4LjYtODcuNC01LjctMTMuNC02LjktMzEuNC02LjktNDUuNyAwLTQ5LjcgMjAuMy0xNjAgODYuMy0xNjAgMTAuNiAwIDE4LjkgNC45IDIzLjEgMTQuOSAzLjctNS40IDcuNy0xMC41IDEyLTE1LjQgMi0yLjYgNS43LTUuNCA3LjEtOC4zIDgtMTIuNiAxMS43LTIxLjEgMjEuNy0zNCAzMi4zLTQxLjEgODEuNy02OS40IDEzNC45LTY5LjQgNiAwIDEyIC4zIDE3LjcgMS4xIDEwLjktMTEuNyAyNi0xOC4zIDQxLjctMTguMyAxNC42IDAgMjkuNyA2IDQwIDE2LjMgLjkgLjkgMS40IDIuMyAxLjQgMy40IDAgMy43LTEwLjMgMTMuNC0xMi45IDE2LjMgNC4zIDEuNCAxNS43IDYuOSAxNS43IDEyIDAgMi45LTIuOSA1LjEtNC42IDcuMSAzMS40IDI3LjcgNDkuNCA2Ny4xIDU2LjMgMTA4IDQuMy01LjEgMTAuMy04LjYgMTcuMS04LjYgMTAuNiAwIDIwLjkgNy4xIDI4LjYgMTQgMjAuOSAxOC42IDI1LjcgNTMuMSAyNS43IDc5Ljd6TTE4OCA4OS40YzAgMTguMyAxMi42IDM3LjEgMzIuMyAzNy4xczMyLjMtMTguOSAzMi4zLTM3LjFjMC0xOC0xMi42LTM2LjktMzIuMy0zNi45UzE4OCA3MS40IDE4OCA4OS40ek0yMzcuNyAxOTRjMC0xOS43IDMuNy0zOS4xIDguNi01OC4zLTUyIDc5LjUtMTMuNSAxODQuNiA2OC45IDE4NC42IDIxLjQgMCA0Mi42LTcuNyA2MC0yMCAyLTcuNCAzLjctMTQuOSAzLjctMjIuNiAwLTE0LjMtNi4zLTIxLjQtMjAuNi0yMS40LTQuNiAwLTkuMSAuOS0xMy40IDEuNy02My4zIDEyLjctMTA3LjEgMy43LTEwNy4xLTY0ek0xOTYuNiA0NDguOWMwLTExLjEtOC45LTIwLjktMjAuMy0yMC45cy0yMCA5LjctMjAgMjAuOWwwIDMyLjZjMCAxMS4xIDguNiAyMS4xIDIwIDIxLjFzMjAuMy05LjcgMjAuMy0yMS4xbDAtMzIuNnptNDkuMSAwYzAtMTEuMS04LjYtMjAuOS0yMC0yMC45cy0yMC4zIDkuNy0yMC4zIDIwLjlsMCAzMi42YzAgMTEuMSA4LjkgMjEuMSAyMC4zIDIxLjFzMjAtMTAgMjAtMjEuMWwwLTMyLjZ6bTQ5LjcgMGMwLTExLjEtOC45LTIwLjktMjAuMy0yMC45cy0yMC4zIDkuNy0yMC4zIDIwLjlsMCAzMi42YzAgMTEuMSA4LjkgMjEuMSAyMC4zIDIxLjFzMjAuMy05LjcgMjAuMy0yMS4xbDAtMzIuNnptNDkuNyAwYzAtMTEuMS04LjktMjAuOS0yMC4zLTIwLjlzLTIwLjMgOS43LTIwLjMgMjAuOWwwIDMyLjZjMCAxMS4xIDguOSAyMS4xIDIwLjMgMjEuMXMyMC4zLTEwIDIwLjMtMjEuMWwwLTMyLjZ6TTQyMS43IDI4NmMtMzAuOSA1OS4xLTkwLjMgMTAyLjYtMTU4LjYgMTAyLjYtOTYuNiAwLTE2MC42LTg0LjYtMTYwLjYtMTc2LjYgMC0xNi45IDItMzMuNCA2LTQ5LjctMjAgMzMuNy0yOS43IDcyLjYtMjkuNyAxMTEuNCAwIDYwLjMgMjQuOSAxMjEuNyA3MS40IDE2MC45IDUuMS05LjcgMTQuOS0xNi4zIDI2LTE2LjMgMTAgMCAxOS40IDUuNyAyNC42IDE0LjMgNS40LTguNiAxNC42LTE0LjMgMjQuOS0xNC4zIDEwIDAgMTkuNCA1LjcgMjQuNiAxNC4zIDUuNC04LjYgMTQuOS0xNC4zIDI0LjktMTQuM3MxOS40IDUuNyAyNC45IDE0LjNjNS4xLTguNiAxNC42LTE0LjMgMjQuNi0xNC4zIDEwLjkgMCAyMC45IDYuNiAyNS43IDE2IDQzLjQtMzYuMyA2OC42LTkyIDcxLjQtMTQ4LjN6bTEwLjYtOTkuN2MwLTUzLjctMzQuNi0xMDUuNy05Mi42LTEwNS43LTMwLjMgMC01OC42IDE1LjEtNzguOSAzNi45LTIwIDY2LjQtMjcuNCAxMzYuNiA0MS40IDEzNi42IDI4LjggMCA5Ny40LTI4LjUgODQuMyAzNi45IDI4LjktMjYgNDUuNy02NS43IDQ1LjctMTA0LjZ6Il0KICAgIH07CiAgICBmYURhcnRMYW5nID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImRhcnQtbGFuZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNjkzIiwgIk0zNzguNiA3OC45Yy0yLjgtLjEtNS42LS4yLTguNS0uMmwtMjY0LjEgMCAxNDMuMi03MmM3LjQtNC40IDE4LjgtNi43IDMwLjQtNi43IDEzLjUgMCAyOS40IDkuMiAzNyAxNi44bDYyIDYyIDAgLjF6TTEwNy4zIDk2LjVsMjYyLjggMGMxNiAwIDI1LjQgMS40IDM1LjQgOS4zbDEwNi41IDEwNi40IDAgMjA4LjgtNzkuMyAuNy0zMjUuNC0zMjUuMnpNOTYuNSAzNzNsMC0yNjIuMiAzMjMuOCAzMjMuOCAuNyA3Ny40LTIxMi4yIDAtOTguMS05OC4yQzk5LjQgNDAyLjUgOTYuNSAzOTguNSA5Ni41IDM3M3pNNzguNyAxMDUuM2wwIDI2Ny43YzAgMy4zIC4xIDYuMyAuMiA5LjFsLTYyLTYyQzYuNSAzMDkuMyAwIDI5NC4zIDAgMjc5LjYgMCAyNzIuOCAzLjkgMjYyLjEgNi43IDI1Nmw3Mi0xNTAuN3oiXQogICAgfTsKICAgIGZhRGVwbG95ZG9nID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImRlcGxveWRvZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMzhlIiwgIk0zODIuMiAxMzZsNTEuNyAwIDAgMjM5LjYtNTEuNyAwIDAtMjAuN2MtMTkuOCAyNC44LTUyLjggMjQuMS03My44IDE0LjctMjYuMi0xMS43LTQ0LjMtMzguMS00NC4zLTcxLjggMC0yOS44IDE0LjgtNTcuOSA0My4zLTcwLjggMjAuMi05LjEgNTIuNy0xMC42IDc0LjggMTIuOWwwLTEwMy45ek0zMTcuNSAyOTcuOGEzMy4yIDMzLjIgMCAxIDAgNjYuNCAxIDMzLjIgMzMuMiAwIDEgMCAtNjYuNC0xek0xODguNSAxMzZsNTEuNyAwIDAgMjM5LjYtNTEuNyAwIDAtMjAuN2MtMTkuOCAyNC44LTUyLjggMjQuMS03My44IDE0LjctMjYuMi0xMS43LTQ0LjMtMzguMS00NC4zLTcxLjggMC0yOS44IDE0LjgtNTcuOSA0My4zLTcwLjggMjAuMi05LjEgNTIuNy0xMC42IDc0LjggMTIuOWwwLTEwMy45ek0xMjMuOCAyOTcuOGEzMy4yIDMzLjIgMCAxIDAgNjYuNCAxIDMzLjIgMzMuMiAwIDEgMCAtNjYuNC0xek00NDggOTZjMTcuNSAwIDMyIDE0LjQgMzIgMzJsMCAyNTZjMCAxNy41LTE0LjQgMzItMzIgMzJMNjQgNDE2Yy0xNy41IDAtMzItMTQuNC0zMi0zMmwwLTI1NmMwLTE3LjUgMTQuNC0zMiAzMi0zMmwzODQgMHptMC0zMkw2NCA2NEMyOC44IDY0IDAgOTIuOCAwIDEyOEwwIDM4NGMwIDM1LjIgMjguOCA2NCA2NCA2NGwzODQgMGMzNS4yIDAgNjQtMjguOCA2NC02NGwwLTI1NmMwLTM1LjItMjguOC02NC02NC02NHoiXQogICAgfTsKICAgIGZhRmxpcGJvYXJkID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImZsaXBib2FyZCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNDRkIiwgIk0wIDMybDAgNDQ4IDQ0OCAwIDAtNDQ4LTQ0OCAwek0zNTguNCAyMTEuMmwtODkuNiAwIDAgODkuNi04OS42IDAgMCA4OS42LTg5LjYgMCAwLTI2OC44IDI2OC44IDAgMCA4OS42eiJdCiAgICB9OwogICAgZmFCdXlOTGFyZ2UgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYnV5LW4tbGFyZ2UiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjhhNiIsICJNMjg4LjIgMzJDMTMzLjUgMzIgOCAxMzIuMyA4IDI1NlMxMzMuNSA0ODAgMjg4LjIgNDgwIDU2OC40IDM3OS43IDU2OC40IDI1NiA0NDIuOSAzMiAyODguMiAzMnpNMjAyLjggMzg5LjJsLTEzOC41IDEuNCA3Ny4yLTI5MC43IDEzMy40IDBjNjMuMiAwIDg0LjkgMjguNiA3OCA3Mi44LS40IDIuMy0uOSA0LjYtMS41IDYuOS01LjYtMS4zLTExLjQtMS45LTE3LjItMS45LTQyLjMgMC03Ni43IDMzLjktNzYuNyA3NS43IDAgMzcuMSAyNy4xIDY4IDYyLjkgNzQuNS0xOC4yIDM3LjItNTYuMiA2MC45LTExNy43IDYxLjV6TTM1OC4yIDIwNy4xbDMyIDAtMjIuMiA5MC4zLTM1LjQgMC0xMS4yLTM1LjYtNy44IDM1LjYtMzcuOCAwIDI2LjYtOTAuMyAzMS4zIDAgMTUgMzYuOCA5LjQtMzYuOHpNNTA0LjEgMzg5LjJsLTE5Ny4xIDAgMTUuOC02MS4yYzMuOCAuNiA3LjYgLjggMTEuNSAuOCA0Mi4zIDAgNzYuNy0zMy45IDc2LjctNzUuNiAwLTMyLjYtMjEtNjAuNS01MC40LTcxLjFsMjEuMy04Mi40IDkyLjUgMC01MyAyMDUuNCAxMDMuOSAwLTIxLjIgODQuMXpNMjExLjkgMjY5LjRsLTI0LjcgMC0xMy44IDU2LjUgMjQuNyAwYzE2LjEgMCAzMi4xLTMuMiAzNy45LTI2LjYgNS42LTIyLjMtOC0yOS44LTI0LjEtMjkuOHpNMjMzLjIgMTcwbC0yMS4zIDAtMTEuNyA0Ny43IDIxLjQgMGMxOCAwIDM1LjQtMTQuNiAzOS4yLTMwLjEgNC42LTE4LjktOS41LTE3LjYtMjcuNi0xNy42eiJdCiAgICB9OwogICAgZmFXYXRjaG1hbk1vbml0b3JpbmcgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAid2F0Y2htYW4tbW9uaXRvcmluZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMDg3IiwgIk0yNTYgMTZhMjQwIDI0MCAwIDEgMCAwIDQ4MCAyNDAgMjQwIDAgMSAwIDAtNDgwek0xMjEuNyA0MjkuMWMtNTEuNi00MC4yLTg0LjktMTAyLjgtODQuOS0xNzMuMSAwLTIxLjcgMy4yLTQzLjMgOS42LTY0LjFsMTAyLjktMTcuOS0uMSAxMS0xMy45IDJzLS4xIDEyLjUtLjEgMTkuNWMwIDIgLjQgNCAxLjIgNS44czIuMSAzLjQgMy43IDQuNmw5LjUgNy40LTI3LjcgMjA0Ljl6TTIyNy40IDE0NS45bDguNS03LjZzNi45LTUuNC0uMS05LjNjLTcuMi00LTM5LjUtMzQuNS0zOS41LTM0LjUtNS4zLTUuNS04LjMtNy4zLTE1LjUgMCAwIDAtMzIuMyAzMC41LTM5LjUgMzQuNS03LjEgNC0uMSA5LjMtLjEgOS4zbDguNSA3LjYgMCA0LjQtNzMuNS0xOS4yYzM5LjYtNTYuOSAxMDUuNS05NC4zIDE4MC05NC4zIDMxLjMgMCA2Mi4yIDYuNyA5MC42IDE5LjZzNTMuOCAzMS44IDc0LjMgNTUuNGwtMTkzLjUgMzcuNyAwLTMuNnptMzQuMSAzMjkuM2wtMzMuOS0yNTAuOSA5LjUtNy40YzEuNi0xLjIgMi44LTIuOCAzLjctNC42czEuMy0zLjggMS4yLTUuOGMwLTctLjEtMTkuNS0uMS0xOS41bC0xMy45LTItLjEtMTAuNSAyNDEuNyAzMS40YzMuOSAxNi40IDUuOCAzMy4zIDUuOCA1MC4xIDAgMTE5LjEtOTUuNCAyMTYuMi0yMTMuOCAyMTkuMXoiXQogICAgfTsKICAgIGZhSGlwcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJoaXBzIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY0NTIiLCAiTTI1MS42IDE1Ny42YzAtMS45LS45LTIuOC0yLjgtMi44bC00MC45IDBjLTEuNiAwLTIuNyAxLjQtMi43IDIuOGwwIDIwMS44YzAgMS40IDEuMSAyLjggMi43IDIuOGw0MC45IDBjMS45IDAgMi44LS45IDIuOC0yLjhsMC0yMDEuOHpNMTU2LjUgMTY4Yy0xNi4xLTExLjgtMzYuMy0xNy45LTYwLjMtMTgtMTguMS0uMS0zNC42IDMuNy00OS44IDExLjRsMC04MS4yYzAtMS44LS45LTIuNy0yLjgtMi43bC00MC45IDBDLjkgNzcuNSAwIDc4LjQgMCA4MC4yTDAgMzU5LjRjMCAxLjkgLjkgMi44IDIuNyAyLjhsNDEgMGMxLjkgMCAyLjgtLjkgMi44LTIuOGwwLTEzNi4xYzAtLjgtMi44LTI3IDQ1LjgtMjcgNDguNSAwIDQ1LjggMjYuMSA0NS44IDI3bDAgMTIyLjZjMCA5IDcuMyAxNi4zIDE2LjQgMTYuM2wyNy4zIDBjMS44IDAgMi43LS45IDIuNy0yLjhsMC0xMzYuMWMwLTIzLjQtOS4zLTQxLjgtMjgtNTUuM3pNNjM0LjkgMjc4LjFjLTYuOC0xNS43LTE4LjQtMjctMzQuOS0zNC4xbC01Ny42LTI1LjNjLTguNi0zLjYtOS4yLTExLjItMi42LTE2LjEgNy40LTUuNSA0NC4zLTEzLjkgODQgNi44IDEuNyAxIDQtLjMgNC0yLjRsMC00NC43YzAtMS4zLS42LTIuMS0xLjktMi42LTE3LjctNi42LTM2LjEtOS45LTU1LjEtOS45LTI2LjUgMC00NS4zIDUuOC01OC41IDE1LjQtLjUgLjQtMjguNCAyMC0yMi43IDUzLjcgMy40IDE5LjYgMTUuOCAzNC4yIDM3LjIgNDMuNkw1ODAuNCAyODZjMTEuNiA1LjEgMTUuMiAxMy4zIDEyLjIgMjEuMi0zLjcgOS4xLTEzLjIgMTMuNi0zNi41IDEzLjYtMjQuMyAwLTQ0LjctOC45LTU4LjQtMTkuMS0yLjEtMS40LTQuNCAuMi00LjQgMi4zbDAgMzQuNGMwIDEwLjQgNC45IDE3LjMgMTQuNiAyMC43IDE1LjYgNS41IDMxLjYgOC4yIDQ4LjIgOC4yIDEyLjcgMCAyNS44LTEuMiAzNi4zLTQuMyAuNy0uMyAzNi04LjkgNDUuNi00NS44IDMuNS0xMy41IDIuNC0yNi41LTMuMS0zOS4xek0zNzYuMiAxNDkuOGMtMzEuNyAwLTEwNC4yIDIwLjEtMTA0LjIgMTAzLjVsMCAxODMuNWMwIC44IC42IDIuNyAyLjcgMi43bDQwLjkgMGMxLjkgMCAyLjgtLjkgMi44LTIuN2wwLTg4LjhjMTYuNSAxMi43IDM1LjggMTkuMSA1Ny43IDE5LjEgNjAuNSAwIDEwOC43LTQ4LjUgMTA4LjctMTA4LjcgLjEtNjAuMy00OC4yLTEwOC42LTEwOC42LTEwOC42em0wIDQ2LjZhNjIuMiA2Mi4yIDAgMSAxIDAgMTI0LjMgNjIuMiA2Mi4yIDAgMSAxIDAtMTI0LjN6TTIyOC4zIDcyLjVjLTE1LjkgMC0yOC44IDEyLjktMjguOSAyOC45IDAgMTUuNiAxMi43IDI4LjkgMjguOSAyOC45czI4LjktMTMuMSAyOC45LTI4LjljMC0xNi4yLTEzLTI4LjktMjguOS0yOC45eiJdCiAgICB9OwogICAgZmFDbG91ZHZlcnNpZnkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY2xvdWR2ZXJzaWZ5IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYzODUiLCAiTTE2MC42IDMwNGM4LjIgNjguNSA2Ny40IDExNS41IDE0NiAxMTEuMyA1MS4yIDQzLjMgMTM2LjggNDUuOCAxODYuNC01LjYgNjkuMiAxLjEgMTE4LjUtNDQuNiAxMzEuNS05OS41IDE0LjgtNjIuNS0xOC4yLTEzMi41LTkyLjEtMTU1LjEtMzMtODguMS0xMzEuNC0xMDEuNS0xODYuNS04NS01Ny4zIDE3LjMtODQuMyA1My4yLTk5LjMgMTA5LjctNy44IDIuNy0yNi41IDguOS00NSAyNC4xIDExLjcgMCAxNS4yIDguOSAxNS4yIDE5LjVsMCAyMC40YzAgMTAuNy04LjcgMTkuNS0xOS41IDE5LjVsLTIwLjIgMGMtMTAuNyAwLTE5LjUtNi0xOS41LTE2LjdsMC02LjYtNDYuOCAwYy0zLjggMC0xMC44IDQuMy0xMC44IDExLjlsMCA0MC40YzAgNi40IDUuMyAxMS44IDExLjcgMTEuOGw0OC45IDAgMC0uMXpNMzg4IDMxMmMtMTAuNyA0Ni4zIDIxLjcgNzIuNCA1NS4zIDg2LjgtMTA3LjIgMzMuOC0xNzEuNi01MC44LTEzNS4zLTExMC44LTMzLjIgMjEuNi0zMy43IDcxLjItMjkuMiA5Mi45LTE3LjktMTIuNC01My44LTMyLjQtNTcuNC03OS44LTMtMzkuOSAyMS41LTc1LjcgNTctOTMuOSAzMC42LTE1LjggMTAzLjUtOC41IDEzMy42IDQwLjgtMTQuMS00OC01My44LTcwLjEtMTAxLjgtNzQuOCAzMC45LTMwLjcgNjQuNC01MC4zIDExNC4yLTQzLjcgNjkuOCA5LjMgMTMzLjIgODIuOCA2Ny43IDE1MC41IDM1LTE2LjMgNDguNy01NC40IDQ3LjUtNzYuOWwxMC41IDE5LjZjMTEuOCAyMiAxNS4yIDQ3LjYgOS40IDcyLTkuMiAzOS00MC42IDY4LjgtNzkuNyA3Ni41LTMyLjEgNi4zLTgzLjEtNS4xLTkxLjgtNTkuMnpNMTQwIDIwOGwtMzkuOCAwYy04LjkgMC0xNi4yLTcuMy0xNi4yLTE2LjJsMC0zOS42YzAtOC45IDcuMy0xNi4yIDE2LjItMTYuMmwzOS44IDBjOC45IDAgMTYuMiA3LjMgMTYuMiAxNi4ybDAgMzkuNmMwIDguOS03LjMgMTYuMi0xNi4yIDE2LjJ6TTIyLjEgMTY4Yy01LjYgMC0xMC4xLTQuNS0xMC4xLTEwLjFsMC0yNy44YzAtNS42IDQuNS0xMC4xIDEwLjEtMTAuMWwyNy43IDBjNS41IDAgMTAuMSA0LjUgMTAuMSAxMC4xbDAgMjcuOGMwIDUuNi00LjUgMTAuMS0xMC4xIDEwLjFsLTI3LjcgMHpNMTgwIDE0Mi43bDAtMjEuNGMwLTUuMSA0LjItOS4zIDkuMy05LjNsMjEuNCAwYzUuMSAwIDkuMyA0LjIgOS4zIDkuM2wwIDIxLjRjMCA1LjEtNC4yIDkuMy05LjMgOS4zbC0yMS40IDBjLTUuMSAwLTkuMy00LjItOS4zLTkuM3pNNjggMjM1LjVsMCAyNWMwIDYuMy01LjEgMTEuNS0xMS40IDExLjVsLTI1LjIgMGMtNi4zIDAtMTEuNC01LjItMTEuNC0xMS41bDAtMjVjMC02LjMgNS4xLTExLjUgMTEuNC0xMS41bDI1LjEgMGM2LjQgMCAxMS41IDUuMiAxMS41IDExLjV6Il0KICAgIH07CiAgICBmYUdvb2RyZWFkcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnb29kcmVhZHMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjNhOCIsICJNMjk5LjkgMTkxLjJjNS4xIDM3LjMtNC43IDc5LTM1LjkgMTAwLjctMjIuMyAxNS41LTUyLjggMTQuMS03MC44IDUuNy0zNy4xLTE3LjMtNDkuNS01OC42LTQ2LjgtOTcuMiA0LjMtNjAuOSA0MC45LTg3LjkgNzUuMy04Ny41IDQ2LjktLjIgNzEuOCAzMS44IDc4LjIgNzguM3pNNDQ4IDg4bDAgMzM2YzAgMzAuOS0yNS4xIDU2LTU2IDU2TDU2IDQ4MGMtMzAuOSAwLTU2LTI1LjEtNTYtNTZMMCA4OEMwIDU3LjEgMjUuMSAzMiA1NiAzMmwzMzYgMGMzMC45IDAgNTYgMjUuMSA1NiA1NnpNMzMwIDMxMy4ycy0uMS0zNC0uMS0yMTcuM2wtMjkgMCAwIDQwLjNjLS44IC4zLTEuMi0uNS0xLjYtMS4yLTkuNi0yMC43LTM1LjktNDYuMy03Ni00Ni01MS45IC40LTg3LjIgMzEuMi0xMDAuNiA3Ny44LTQuMyAxNC45LTUuOCAzMC4xLTUuNSA0NS42IDEuNyA3Ny45IDQ1LjEgMTE3LjggMTEyLjQgMTE1LjIgMjguOS0xLjEgNTQuNS0xNyA2OS00NS4yIC41LTEgMS4xLTEuOSAxLjctMi45IC4yIC4xIC40IC4xIC42IC4yIC4zIDMuOCAuMiAzMC43IC4xIDM0LjUtLjIgMTQuOC0yIDI5LjUtNy4yIDQzLjUtNy44IDIxLTIyLjMgMzQuNy00NC41IDM5LjUtMTcuOCAzLjktMzUuNiAzLjgtNTMuMi0xLjItMjEuNS02LjEtMzYuNS0xOS00MS4xLTQxLjgtLjMtMS42LTEuMy0xLjMtMi4zLTEuM2wtMjYuOCAwYy44IDEwLjYgMy4yIDIwLjMgOC41IDI5LjIgMjQuMiA0MC41IDgyLjcgNDguNSAxMjguMiAzNy40IDQ5LjktMTIuMyA2Ny4zLTU0LjkgNjcuNC0xMDYuM3oiXQogICAgfTsKICAgIGZhVGlkYWwgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidGlkYWwiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTdkYyIsICJNMTA3LjIgNDhsLTEuMyAwYy0zMi4zIDMzLjEtNjUuNCA2NS41LTk4IDk4LjUtMi42IDIuOC02LjEgNS4xLTcuOSA4LjYgMzUuNiAzNS40IDcxIDcxIDEwNi42IDEwNi40IDM1LjQtMzUuMyA3MC43LTcwLjggMTA2LjEtMTA2LjFsMC0xLjMtNzMuMi03My4yQzEyOC44IDY5LjggMTE3LjMgNTkuNiAxMDcuMiA0OHptMjEzLjUgMGwtMS4zIDBjLTM0LjkgMzYuMS03MS41IDcxLTEwNi4zIDEwNy4yIDM1LjkgMzUuMSA3MSA3MSAxMDYuNyAxMDYuMyAzNC4zLTM0LjEgNjguNC02OC40IDEwMi42LTEwMi40IDEuNS0xLjUgMy4zLTIuOCA0LjEtNC44LTM0LjYtMzMuOC02OC40LTY4LjItMTAyLjYtMTAyLjEtMS4zLTEuMy0yLjMtMi42LTMuMy00LjF6bTIxMy41IDBsLTEuMyAwYy0xNy4yIDE4LTM1LjEgMzUuMy01Mi42IDUzLTE3LjkgMTcuNy0zNS40IDM1LjctNTMuNSA1My4zIC44IDIuMyAzIDMuNiA0LjYgNS41TDUzMy4zIDI2MS41YzM2LjEtMzQuOSA3MC44LTcxLjIgMTA2LjctMTA2LjEtLjUtMi4yLTIuNi0zLjUtNC01TDU1NS44IDcwLjJjLTcuMS03LjQtMTQuOS0xNC4yLTIxLjUtMjIuMnpNMzE5LjYgMjYxLjdjLTM0LjkgMzUuMS03MCA3MC0xMDQuOSAxMDQuOS0uMyAuNy0uNyAxLjctMSAyLjMgMjQgMjMuNyA0Ny43IDQ3LjUgNzEuNSA3MS4zIDExLjggMTEuMyAyMi44IDIzLjUgMzQuOSAzNC40IDguNC03LjQgMTYuNC0xNi40IDI0LjctMjQuMyAyNS41LTI1LjMgNTEtNTEgNzYuNS03Ni4zIDEuOC0yLjIgNC4zLTMuNiA1LjUtNi4zLTM1LjQtMzQuOS03MC41LTcwLjItMTA1LjYtMTA1LjRsLTEuNS0uN3oiXQogICAgfTsKICAgIGZhVW5pdHkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidW5pdHkiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTA0OSIsICJNMjQzLjYgOTEuNmw4MC4xIDQ2LjhjMi45IDEuNiAzIDYuMiAwIDcuOGwtOTUuMiA1NS42Yy0yLjkgMS43LTYuMyAxLjYtOSAwbC05NS4yLTU1LjZjLTIuOS0xLjYtMy02LjMgMC03LjhsODAuMS00Ni44IDAtOTEuNi0yMDQuNCAxMTkuNCAwIDIzOC44IDc4LjQtNDUuOCAwLTkzLjZjLS4xLTMuMyAzLjgtNS43IDYuNy0zLjlsOTUuMiA1NS42YzIuOSAxLjcgNC41IDQuNyA0LjUgNy44bDAgMTExLjJjLjEgMy4zLTMuOCA1LjctNi43IDMuOUw5OCAzNDYuOCAxOS42IDM5Mi42IDIyNCA1MTIgNDI4LjQgMzkyLjYgMzUwIDM0Ni44IDI2OS45IDM5My42Yy0yLjggMS43LTYuOC0uNS02LjctMy45bDAtMTExLjJjMC0zLjMgMS44LTYuMyA0LjUtNy44TDM2Mi45IDIxNWMyLjgtMS43IDYuOCAuNSA2LjcgMy45bDAgOTMuNiA3OC40IDQ1LjggMC0yMzguOC0yMDQuNC0xMTkuNCAwIDkxLjZ6Il0KICAgIH07CiAgICBmYVRlbmNlbnRXZWlibyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ0ZW5jZW50LXdlaWJvIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbXSwgImYxZDUiLCAiTTQwLjUgNDk1LjhjMS40IDE5LjktMjcuNiAyMi4yLTI5LjcgMi45LTExLjYtMTI5LjkgMzEuMS0yMzkuNSAxMDEuNC0zMTMuMi0xNS42LTM0IDkuMi03Ny4xIDUwLjYtNzcuMSAzMC4zIDAgNTUuMSAyNC42IDU1LjEgNTUuMSAwIDQ0LTQ5LjUgNzAuOC04Ni45IDQ1LjEtNjUuNyA3MS4zLTEwMS40IDE2OS44LTkwLjUgMjg3LjJ6TTE2MC4yIC4xYy0xMjUuOSAwLTIwNC4zIDEzNC4yLTE0OC4zIDI0Mi4zIDguNyAxNy40IDM1LjMgNC41IDI2LjMtMTMuNC00Ni4zLTkyLjYgMjEtMTk5LjIgMTIyLTE5OS4yIDc1LjQgMCAxMzYuOSA2MS40IDEzNi45IDEzNi45IDAgOTAuOC04Ni45IDE1My45LTE2Ny43IDEzMy4xLTE5LjEtNC4xLTI1LjYgMjQuNC02LjYgMjkuMSAxMTAuNyAyMy4yIDIwNC02MCAyMDQtMTYyLjMgMC05MS45LTc0LjYtMTY2LjUtMTY2LjYtMTY2LjV6Il0KICAgIH07CiAgICBmYUZyZWVDb2RlQ2FtcCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmcmVlLWNvZGUtY2FtcCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMmM1IiwgIk05Ny40IDk2LjJjMTAuNC0xMC42IDE2LTE3LjEgMTYtMjEuOSAwLTIuOC0xLjktNS41LTMuOC03LjQtMi40LTEuOC01LjQtMi44LTguNC0yLjgtOC41IDAtMjAuOSA4LjgtMzUuOCAyNS43LTQxLjUgNDcuMy02Mi43IDkzLjEtNjEuOCAxNjAuNlMyMSAzNjcuMyA1Ny42IDQxMi4yYzE4LjggMjMuNiAzMy4yIDM1LjggNDMuNSAzNS44IDMuMi0uMyA2LjEtMS42IDguNC0zLjggMS45LTIuOCAzLjgtNS42IDMuOC04LjQgMC01LjYtMy45LTEyLjItMTMuMi0yMC42LTQ0LjUtNDIuMy02Ny4zLTk3LTY3LjUtMTY1LS4yLTYxLjQgMjEuNi0xMTIuNCA2NC44LTE1NHpNMjM5LjYgNDIwLjFjLjYgLjQgLjkgLjYgLjkgLjZsLS45LS42em05My44IC42bC4yLS4xYy0uMiAuMS0uMyAuMi0uMiAuMXptMy4xLTE1OC4yYy0xNi4yLTQuMiA1MC40LTgyLjktNjguMS0xNzcuMiAwIDAgMTUuNSA0OS40LTYyLjggMTU5LjYtNzQuMyAxMDQuNCAyMy41IDE2OC43IDM0IDE3NS4yLTYuNy00LjMtNDcuNC0zNS43IDkuNi0xMjguNiAxMS0xOC4zIDI1LjUtMzQuOSA0My41LTcyLjIgMCAwIDE1LjkgMjIuNCA3LjYgNzEuMS0xMi41IDczLjYgNTMuOCA1Mi41IDU0LjggNTMuNSAyMi44IDI2LjgtMTcuNyA3My41LTIxLjYgNzYuNiA1LjUtMy43IDExNy43LTc4IDMzLTE4OC4xLTYgNi0xMy44IDM0LjItMzAgMzAuMXpNNTExIDg5LjdjLTE0LjktMTYuOS0yNy40LTI1LjctMzUuOS0yNS43LTMgLjEtNS45IDEuMS04LjQgMi44LTEuOSAxLjktMy44IDQuNy0zLjggNy40IDAgNC44IDUuNiAxMS4zIDE2IDIxLjkgNDMuMiA0MS42IDY1IDkyLjYgNjQuOCAxNTQuMS0uMiA2OC0yMyAxMjIuNi02Ny41IDE2NS05LjMgOC40LTEzLjIgMTQuOS0xMy4yIDIwLjYgMCAyLjcgMS45IDUuNiAzLjggOC40IDIuMyAyLjIgNS4yIDMuNiA4LjQgMy44IDEwLjMgMCAyNC43LTEyLjEgNDMuNS0zNS44IDM2LjYtNDQuOSA1My4xLTk0LjQgNTQuMS0xNjEuOVM1NTIuNSAxMzcgNTExIDg5Ljd6Il0KICAgIH07CiAgICBmYVhUd2l0dGVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIngtdHdpdHRlciIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNjFiIiwgIk0zNTcuMiA0OEw0MjcuOCA0OCAyNzMuNiAyMjQuMiA0NTUgNDY0IDMxMyA0NjQgMjAxLjcgMzE4LjYgNzQuNSA0NjQgMy44IDQ2NCAxNjguNyAyNzUuNS01LjIgNDggMTQwLjQgNDggMjQwLjkgMTgwLjkgMzU3LjIgNDh6TTMzMi40IDQyMS44bDM5LjEgMC0yNTIuNC0zMzMuOC00MiAwIDI1NS4zIDMzMy44eiJdCiAgICB9OwogICAgZmFTdGlja2VyTXVsZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzdGlja2VyLW11bGUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjNmNyIsICJNNTYxLjcgMTk5LjZsMCAwem0tNi4yLTc3LjRjLTcuNy0yMi4zLTUuMS03LjItMTMuNC0zNi45LTEuNi02LjUtMy42LTE0LjUtNi4yLTIwLTQuNC04LjctNC42LTcuNS00LjYtOS41IDAtNS4zIDMwLjctNDUuMyAxOS00Ni45LTUuNy0uNi0xMi4yIDExLjYtMjAuNiAxNy04LjYgNC4yLTggNS0xMC4zIDUtMi42IDAtNS43LTMtNi4yLTUtMi01LjcgMS45LTI1LjktMy42LTI1LjktMy42IDAtMTIuMyAyNC44LTE3IDI1LjgtNS4yIDEuMy0yNy45LTExLjQtNzUuMSAxOC0yNS4zIDEzLjItODYuOSA2NS4yLTg3IDY1LjMtNi43IDQuNy0yMCA0LjctMzUuNSAxNi00NC40IDMwLjEtMTA5LjYgOS40LTExMC43IDktMTEwLjYtMjYuOC0xMjgtMTUuMi0xNTkgMTEuNS0yMC44IDE3LjktMjMuNyAzNi41LTI0LjIgMzguOS00LjIgMjAuNCA1LjIgNDguMyA2LjcgNjQuMyAxLjggMTkuMy0yLjcgMTcuNyA3LjcgOTguMyAuNSAxIDQuMSAwIDUuMSAxLjUgMCA4LjQtMy44IDEyLjEtNC4xIDEzLTEuNSA0LjUtMS41IDEwLjUgMCAxNiAyLjMgOC4yIDguMiAzNy4yIDguMiA0Ni45IDAgNDEuOCAuNCA0NCAyLjYgNDkuNCAzLjkgMTAgMTIuNSA5LjEgMTcgMTIgMy4xIDMuNS0uNSA4LjUgMSAxMi41IC41IDIgMy42IDQgNi4yIDUgOS4yIDMuNiAyNyAuMyAyOS45LTIuNSAxLjYtMS41IC41LTQuNSAzLjEtNSA1LjEgMCAxMC44LS41IDE0LjQtMi41IDUuMS0yLjUgNC4xLTYgMS41LTEwLjUtLjQtLjgtNy0xMy4zLTkuOC0xNi0yLjEtMi01LjEtMy03LjItNC41LTUuOC00LjktMTAuMy0xOS40LTEwLjMtMTkuNS00LjYtMTkuNC0xMC4zLTQ2LjMtNC4xLTY2LjggNC42LTE3LjIgMzkuNS04Ny43IDM5LjYtODcuOCA0LjEtNi41IDE3LTExLjUgMjcuMy03IDYgMS45IDE5LjMgMjIgNjUuNCAzMC45IDQ3LjkgOC43IDk3LjQtMiAxMTIuMi0yIDIuOCAyLTEuOSAxMy0uNSAzOC45IDAgMjYuNC0uNCAxMy43LTQuMSAyOS45LTIuMiA5LjcgMy40IDIzLjItMS41IDQ2LjktMS40IDkuOC05LjkgMzIuNy04LjIgNDMuNCAuNSAxIDEgMiAxLjUgMy41IC41IDQuNSAxLjUgOC41IDQuNiAxMCA3LjMgMy42IDEyLTMuNSA5LjggMTEuNS0uNyAzLjEtMi42IDEyIDEuNSAxNSA0LjQgMy43IDMwLjYgMy40IDM2LjUgLjUgMi42LTEuNSAxLjYtNC41IDYuNC03LjQgMS45LS45IDExLjMtLjQgMTEuMy02LjUgLjMtMS44LTkuMi0xOS45LTkuMy0yMC0yLjYtMy41LTkuMi00LjUtMTEuMy04LTYuOS0xMC4xLTEuNy01Mi42IC41LTU5LjQgMy0xMSA1LjYtMjIuNCA4LjctMzIuNCAxMS00Mi41IDEwLjMtNTAuNiAxNi41LTY4LjMgLjgtMS44IDYuNC0yMy4xIDEwLjMtMjkuOSA5LjMtMTcgMjEuNy0zMi40IDMzLjUtNDcuNCAxOC0yMi45IDM0LTQ2LjkgNTItNjkuOCA2LjEtNyA4LjItMTMuNyAxOC04IDEwLjggNS43IDIxLjYgNyAzMS45IDE3IDE0LjYgMTIuOCAxMC4yIDE4LjIgMTEuOCAyMi45IDEuNSA1IDcuNyAxMC41IDE0LjkgOS41IDEwLjQtMiAxMy0yLjUgMTMuNC0yLjUgMi42LS41IDUuNy01IDcuMi04IDMuMS01LjUgNy4yLTkgNy4yLTE2LjUgMC03LjctLjQtMi44LTIwLjYtNTIuOXoiXQogICAgfTsKICAgIGZhVHdpdGNoID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInR3aXRjaCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMWU4IiwgIk0zNTkuNCAxMDMuNWwtMzguNiAwIDAgMTA5LjcgMzguNiAwIDAtMTA5Ljd6TTI1My4yIDEwM2wtMzguNiAwIDAgMTA5LjggMzguNiAwIDAtMTA5Ljh6TTg5IDBsLTk2LjUgOTEuNCAwIDMyOS4yIDExNS44IDAgMCA5MS40IDk2LjUtOTEuNCA3Ny4zIDAgMTczLjgtMTY0LjYgMC0yNTYtMzY2LjkgMHpNNDE3LjMgMjM3LjhsLTc3LjIgNzMuMS03Ny4yIDAtNjcuNiA2NCAwLTY0LTg2LjkgMCAwLTI3NC4zIDMwOC45IDAgMCAyMDEuMnoiXQogICAgfTsKICAgIGZhS2lja3N0YXJ0ZXJLID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImtpY2tzdGFydGVyLWsiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjNiYyIsICJNMzU2LjcgMjU2LjJsNDAuOC00MC41YzQyLjItNDEuOSA0Mi4yLTExMC4zIDAtMTUyLjFzLTExMS00MS45LTE1My4yIDBMMjI5LjMgNzguNEMyMDkuNiA1MC4zIDE3Ny4xIDMyIDE0MC4yIDMyIDgwLjUgMzIgMzIgODAuMiAzMiAxMzkuNWwwIDIzM2MwIDU5LjQgNDguNSAxMDcuNSAxMDguMiAxMDcuNSAzNy4xIDAgNjkuMy0xOC4zIDg5LTQ2LjRsMTQuOSAxNC43YzQyLjIgNDEuOSAxMTEgNDEuOSAxNTMuMiAwczQyLjItMTEwLjMgMC0xNTIuMWwtNDAuOC00MCAuMSAweiJdCiAgICB9OwogICAgZmFDcml0aWNhbFJvbGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY3JpdGljYWwtcm9sZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNmM5IiwgIk0yMjUuOCAwYy4zIC4yIDIxNi42IDEyNC41IDIxNy4xIDEyNC43IDMgMS4yIDMuNyAzLjUgMy43IDYuNi0uMSA4My40LS4xIDE2Ni45IDAgMjUwLjQgLjEgMS4yLS4yIDIuNC0uOCAzLjRzLTEuNSAxLjktMi42IDIuNGMtMjEuNCAxMi0yMDcuOSAxMTguMy0yMTguOSAxMjQuNmwtMyAwYy03OS4zLTQ1LjctMjE4LjMtMTI1LjQtMjE4LjQtMTI1LjUtLjYtLjMtMS4xLS43LTEuNC0xLjNzLS41LTEuMi0uNC0xLjljMC0uOSAwLTIyNS45LS4xLTI1My4xLS4xLTEgLjItMiAuNy0yLjlzMS4zLTEuNiAyLjItMkMyNy4yIDExMi4xIDIxMy4yIDYgMjI0LjEgMGwxLjggMHpNMjE1LjQgMjAuNGwtLjItLjJjLTY0LjcgMzYuOS0xMjkuNSA3My43LTE5NC4yIDExMC42IDAgLjEgLjEgLjIgLjEgLjRMNTIgMTQyLjljLTcuNyA2LTguMyA2LTEwLjYgNS4xLS4xIDAtMjQuMi05LjMtMjYuOC0xMGwwIDIzMC40Yy45LTEuNCA2NC4xLTExMC45IDY0LjEtMTExIDEuNi0yLjggMy0xLjkgOS4xLTEuNSAxLjQgLjEgMS41IC4yIC44IDEuNC00MS4yIDcxLjMtMzYuNCA2My02Ny41IDExNi45LS44IDEuNC0uNiAxLjEgMS4yIDEuMWwxODYuNSAwYzEuNCAwIDEuNy0uMiAxLjctMS42bDAtOC45YzAtMS4zIDIuNC0uOC0xOC40LTEtNy41LS4xLTE0LjEtMy4yLTIxLjQtMTIuNy03LjQtOS43LTE0LjYtMTkuNC0yMS44LTI5LjItMi4zLTMuMS0zLjQtMi40LTE2LjgtMi40LTEuOCAwLTEuOCAwLTEuOCAxLjggLjMgMjYuMiAuMiAyNS4zIDEgMzIuNyAuNSA0LjQgMi4yIDQuMiA5LjcgNC44IDMuMSAuMyAzLjkgNC4xIC41IDQuOS0xLjYgLjQtMzEuNiAuNS0zMy43LS4xLS41LS4xLTEtLjUtMS4zLS45cy0uNS0xLS40LTEuNiAuMy0xLjEgLjYtMS41IC45LS43IDEuNC0uOGMzLjMtLjggNi4yIC44IDYuNy00LjQgMS4zLTEzLjcgMS4yLTkgMS4xLTc5LjQgMC0xMC44LS40LTEyLjYtNS40LTEzLjYtMS4yLS4yLTMuNS0uMi00LjctLjYtMi45LTEtMi00LjggMS44LTQuOCAzMy43IDAgNDYuMS0xLjEgNTYuMSA0LjkgNy43IDQuNiAxMiAxMS41IDEyLjUgMjAuNCAuOSAxNC42LTYuNSAyMi4zLTE1IDMyLjYtLjIgLjEtLjMgLjMtLjQgLjVzLS4xIC40LS4xIC42IDAgLjQgLjEgLjYgLjIgLjQgLjQgLjVjMi42IDMuMiA1IDYuNiA3LjcgOS44IDI3LjYgMzMuMiAyNC4xIDMwLjUgNDEuMyAzMy4xIC45IC4xIDEtLjQgMS0xLjJsMC0xMWMwLTEgLjMtMS40IDEuNC0xLjMgNy44IDEuMiAxNS44IDEuMSAyMy42LS4zIDEuMS0uMSAxLjUgLjIgMS41IDEuMyAwIC4xIC45IDI2LjcgLjkgMjYuOCAwIDEuNSAuNyAxLjYgMS45IDEuNmwxODYuNyAwYy0yNy4yLTQ3LTU0LjItOTQtODEuMi0xNDAuOCAyLjMtLjctLjQgMCA2LjctMS40IDItLjQgMi4xLS40IDMuMSAxLjQgNy4zIDEyLjYgNzcuMyAxMzQgNzcuNCAxMzQuMWwwLTIzMC40Yy0xLjcgLjUtMTAzLjMgMzguNy0xMDUuOCAzOS43LTEuMSAuNC0xLjUgLjItMS45LS45LS42LTEuOS0xLjMtMy44LTIuMS01LjYtLjMtLjgtLjEtMS4xIC42LTEuNCAuMSAwIDk1LjUtMzUuOCAxMDMtMzguOC02NS40LTM3LjYtMTMwLjYtNzUtMTk2LTExMi42bDg2LjggMTUwLjQtLjMgLjNjLTkuNi0uOS0xMC41LTEuNi0xMS44LTMuOS0xLTEuNy03My41LTEyNy43LTgyLTE0Mi4yLTkuMSAxNC43LTgzLjYgMTQ2LjItODUuNCAxNDYuMy0yLjkgLjItNS45IC4xLTkuMiAuMSAyOC44LTQ5LjggNTcuNi05OS41IDg2LjItMTQ5bDAgMHptNTEuOSAxMjkuOWMxLjktLjEgMy43LS40IDUuNS0uOCAxLjctLjMgMi41IC4yIDIuNiAxLjkgMCAuMSAuMSAxOS4xLS45IDIwLjVzLTEuOSAxLjItMi42LS4yYy01LTkuNyA2LjItOS43LTM5LjEtMTItLjcgMC0xIC4yLTEgLjkgMCAuMSAzLjcgMTIyIDMuNyAxMjIuMSAwIC45IC41IDEuMiAxLjIgMS41IDMgMS4yIDUuOSAyLjUgOC43IDQgNy4zIDQuMyAxMS40IDEwLjggMTIuNCAxOS4zIDEuNCAxMS44LTIuOCAzNS44LTMyLjIgMzcuMS0yLjggLjEtMjguMyAxLjEtMzQuMS0yMy4zLTQuNy0xOS4zIDguMy0zMi43IDE5LjktMzYuNCAuNi0uMSAxLjItLjQgMS41LS45cy41LTEuMSAuNS0xLjdjLjEtNS42IDMtMTA3LjEgMy43LTEyMS4zIDAtMS4xLS42LTEuMi0xLjQtMS4xLTMyLjMgLjUtMzYuNy0uMy00MC4yIDguNS0yLjQgNi4yLTQuMSAxLjMtNCAuMiAxLjEtNiAyLjItMTIgMy4zLTE4IC40LTIuMSAxLjQtMi42IDMuNC0xLjkgNS42IDIuMSA2LjcgMS43IDM3LjIgMS45IDEuNyAwIDEuOC0uMSAxLjgtMS44IC43LTI3LjUgLjYtMjIuNiAxLTI5LjYgLjEtLjYtLjEtMS4yLS4zLTEuN3MtLjctLjktMS4zLTEuMWMtNS42LTIuOS04LjgtNy42LTguOS0xMy45LS40LTE0LjggMTcuNy0yMS43IDI3LjQtMTEuNSA2LjggNy4yIDUuOCAxOC45LTIuNSAyNC4yLS44IC40LTEuNCAxLjEtMS44IDEuOHMtLjYgMS42LS40IDIuNWMwIC42LS4xLTQuMyAxIDMwIDAgLjkgLjQgMS4xIDEuMiAxLjEgLjEgMCAyMy0uMSAzNC41LS40bDAtLjF6TTY4LjMgMTQxLjdjMTkuOC00LjUgMzIuNy0uNiA1Mi41IDEuNyAyLjggLjMgMy43IDEuMiAzLjYgNC0uMiA1LTEuMiAyMi4zLTEuMiAyMy4xIDAgLjUtLjIgMS0uNSAxLjRzLS43IC43LTEuMiAuOWMtNC4xIDEuNy0zLjYtNC40LTQtNy4zLTMuMS0yMi40LTczLjktMzIuNy03NC42IDI1LjQtLjMgMjMuOSAxNyA1My42IDU0LjEgNTAuOSAyNy4yLTIgMTktMjAuMiAyNC44LTIwLjUgLjQtLjEgLjkgMCAxLjMgLjFzLjggLjQgMS4xIC43IC41IC43IC42IDEuMiAuMSAuOSAwIDEuM2MtMS44IDEwLjgtMy40IDE5LTMuNCAxOS4yLTEuNSA5LjItODYuNyAyMi4xLTkzLjQtNDIuMS0yLjctMjUuOCAxMC40LTUzLjQgNDAuMy02MC4yem04MCA4Ny43bC0xOS41IDBjLS42IDAtMS4yLS4xLTEuNi0uNHMtLjgtLjgtMS0xLjRjMi40LTMuOCA1LjkgLjkgNS45LTYuMS0uMS0yNS44IC4yLTM4IC4yLTQwLjEgMC0zLjQtLjUtNC42LTMuMy00LjktNy0uNy0zLjEtMy40LTEuMS0zLjQgMTEuOC0uMSAyMi42LS4yIDMwIC43IDguOCAxLjEgMTYuNyAxMi42IDcuOSAyMi42LTIgMi4yLTQgNC40LTYuMSA2LjcgMSAxLjIgNi45IDguOCAxNy4zIDE5LjcgMi43IDIuOCA2LjIgMy41IDkuOSAzLjEgLjYgMCAxLjEtLjIgMS41LS42cy43LS45IC43LTEuNWMuMy0zLjQgLjMgNC43IC40LTQwLjYgMC01LjYtLjMtNi42LTMuMi02LjgtNC0uNC00LTIuMy0uNy0zLjRsMTkuMS0uMWMuMyAwIDQuNSAuNSAxIDMuNCAwIDAtLjIgMC0uMiAwLTMuNiAuMy0zLjkgMS00IDQuNi0uMyA0My45IC4xIDQwLjIgLjQgNDIuOCAuMSAuOCAuMyAyLjIgNS4xIDIuMSAyLjUgMCAzLjkgMy40IDAgMy40LTEwLjQgLjEtMjAuNyAwLTMxLjEgLjEtMTAuNyAwLTEzLjUtNi4yLTI0LjItMjAuOC0xLjYtMi4yLTguMy0yLjQtOC4yLS40IC45IDE2LjUgMCAxNy44IDQgMTcuNyA0LjgtLjEgNC43IDMuNiAuOCAzLjVsLjEgMHptMjc1LTEwLjFjLTEuMiA3LjEgLjIgMTAuNC01LjMgMTAuMy02MS41LS40LTQ3LjgtLjItNTAuNy0uMy0xLjItLjEtMi40LS40LTMuNi0uNy0yLjUtLjYgMS41LTEuMi0uNC01LjYtMS40LTMuNC0yLjgtNi44LTQuMS0xMC4yLS4xLS40LS40LS44LS43LTEuMXMtLjgtLjQtMS4zLS40Yy00LjktLjItOS43LS4yLTE0LjYgLjEtLjMgMC0uNiAuMi0uOSAuM3MtLjUgLjQtLjcgLjdjLTEuNiAzLjYtMy4xIDcuMy00LjUgMTEtMS4zIDMuMiA3LjkgMS4zIDEyLjIgMi4yIDMgLjYgNC41IDMuNyAuNyAzLjdsLTI2LjQgMGMtMi45IDAtMy4xLTMuMi0uNy0zLjIgMS4yIC4xIDIuNC0uMiAzLjUtLjlzMS45LTEuNSAyLjQtMi42YzEuNS0zIDIuOC02IDQuMS05LjEgMTguMi00Mi4xIDE3LjEtNDAuMiAxOC40LTQxLjYgLjItLjIgLjQtLjQgLjctLjZzLjYtLjIgLjgtLjIgLjYgLjEgLjggLjIgLjUgLjMgLjcgLjZjMi45IDMuMyAxOC40IDQ0LjcgMjMuNiA1MS45IDIgMi43IDUuNyAyIDYuNCAyIDMuNiAuMSA0LTEuMSA0LjEtNC4zIC4xLTEuOSAuMSAxLjIgLjEtNDEuMiAwLTQuNS0yLjQtMy43LTUuNi00LjMtLjMgMC0yLjYtLjYtLjEtMy4xIC4yLS4yLS45LS4yIDIxLjctLjIgMi4zIDAgNS4zIDIuOC0xLjIgMy40LS40IDAtLjcgMC0xLjEgLjJzLS42IC4zLS45IC42LS40IC42LS42IC45LS4yIC43LS4xIDEuMWMtLjEgMS42LS4yIDM4LjkgLjMgNDEuMiAuMiAuNyAuNiAxLjQgMS4yIDEuOHMxLjMgLjcgMi4xIC42YzEzLjMgLjQgMTQuOSAuNCAxNi0zLjQgMS43LTUuOCA0LjEtMi41IDMuNy0uMmwwIC4xek0zMTguNiAyODMuNmMtNC4yIDAtNC40LTMuNC0uNi0zLjQgMzUuOS0uMiAyOC4xIC40IDM3LjItLjYgMS43LS4yIDIuNCAuMiAyLjMgMS45LS4zIDMuNC0uNiA2LjgtMSAxMC4yLS4yIDIuMi0zLjIgMi42LTMuNC0uMi0uNC01LjMtMi4yLTQuNS0xNS42LTUuMS0xLjYtLjEtMS42IDAtMS42IDEuNWwwIDE2LjFjMCAxLjcgMCAxLjYgMS42IDEuNSAzLjEtLjIgMTAuMyAuMyAxNS43LTEuNSAuNS0uMiAzLjMtMS44IDMuMSAxLjggMCAuMi0uOCAxMC40LTEuMiAxMS40LS41IDEuMy0xLjkgMS41LTIuNiAuMy0xLjItMiAwLTUuMS0zLjctNS4zLTE1LjQtLjktMTIuOS0yLjUtMTIuOSA2IDAgMTIuMy0uOCAxNi4xIDMuOSAxNi4yIDE2LjYgLjUgMTQuNCAwIDE2LjQtNS43IC44LTIuNCAzLjUtMS44IDMuMiAuNi0uNCAzLjItLjggNi40LTEuMiA5LjYgMCAuNC0uMiAyLjQtNC43IDIuNC0zNy4yLS4xLTM0LjUtLjItMzUuMi0uMy0yLjctLjUtMi4yLTMgLjItMy40IDEuMS0uMiA0IC41IDQuMi0yLjYgMi40LTU2LjItLjEtNTEuMy0zLjktNTEuM2wwIDB6bS0uNC0xMDkuNWMyLjUgLjYgMy4xIDEuOCAzIDQuNi0uMyA1LjMtLjMgOS0uNiA5LjctLjcgMi4yLTMuMSAyLjEtMy4zLS4zLS40LTQuOC0zLTcuOC03LjYtOS4xLTI2LjMtNy43LTMyLjggMTUuNS0yNy4yIDMwLjIgNS45IDE1LjQgMjIgMTUuOSAyOC45IDEzLjggNS45LTEuOSA1LjktNi41IDYuOS03LjYgMS4yLTEuMyAyLjItMS44IDMuMSAxLjEgMCAuMSAuNiAxMS45LTYgMTIuNy0xLjYgLjItMTkuNCAzLjctMzIuNy0zLjQtMjEtMTEuMi0xNi43LTM1LjUtNi45LTQ1LjMgMTQtMTQuMSAzOS45LTcuMSA0Mi4zLTYuNWwwIDB6TTI4OS44IDI4MC4xYzMuMyAwIDMuNyAzIC4yIDMuNC0yLjYgLjMtNS0uNC01IDUuNSAwIDItLjIgMjkgLjQgNDEuNCAuMSAyLjMgMS4yIDMuNSAzLjQgMy43IDIyIDEuMiAxNS0xLjcgMTguOC02LjMgMS44LTIuMiAyLjggLjggMi44IDEuMSAuMyAxMy42LTQgMTIuNC01LjIgMTIuNGwtMzguMi0uMmMtMS45LS4yLTIuMS0zLS40LTMuNCAyLS41IDQuOSAuNCA1LjEtMi44IDEtMTUuOSAuNi00NC42IC4zLTQ3LjgtLjMtMy44LTIuOC0zLjMtNS43LTMuNy0yLjUtLjQtMi0zLjIgLjMtMy4yIDEuNCAwIDE4IDAgMjMuMSAwem0tMzEuNi01Ny44Yy4xIDQuMSAyLjkgMy41IDYgMy42IDIuNiAuMSAyLjUgMy40LS4xIDMuNC02LjUgMC0xMy43IDAtMjEuNi0uMS0zLjggMC0zLjQtMy40IDAtMy40IDQuNSAwIDMuMiAxLjYgMy40LTQ1LjUgMC01LjEtMy4zLTMuNS00LjctNC4yLTIuNi0xLjItMS40LTMuMSAuNC0zLjIgMS4zIDAgMjAuMi0uNCAyMS4yIC4yczEuOSAxLjYtLjQgMi45Yy0xIC41LTMuOS0uMy00LjIgMi41IDAgLjItLjggMS42LS4xIDQzLjhsMCAwek0yMjEuMyA0OTYuNmMuNSAuMyAxIC41IDEuNiAuNXMxLjEtLjIgMS42LS41YzE3LTkuOCAxODItMTAzLjYgMTk3LjQtMTEyLjUtLjEtLjQgMTEuMy0uMi0xODEuNS0uMy0xLjIgMC0xLjYgLjQtMS41IDEuNiAwIC4xIDEuMyA0NC41IDEuMiA1MC40LS4xIDIuNi0uNiA1LjItMS40IDcuNy0uNiAxLjggLjQtLjUtMTMuNSAzMi4yLS43IDEuNy0xIDIuMi0yLS4xLTQuMi0xMC4zLTguMy0yMC43LTEyLjYtMzEtMS41LTMuNC0yLjItNy4xLTItMTAuOCAuMi0yLjUgLjgtMTYuMSAxLjUtNDggMC0xLjkgMC0yLTItMmwtMTgzIDBjMi42IDEuNiAxNzguMyAxMDIuNiAxOTYgMTEyLjhsLjEgMHpNMTMwLjQgMzA3LjljMCAyLjQgLjQgMi44IDIuOCAzIDExLjUgMS4yIDIxIDMuNyAyNS42LTcuMyA2LTE0LjUgMi43LTM0LjQtMTIuNS0zOC44LTItLjYtMTYtMi44LTE1LjkgMS41IDAgOCAwIDExLjYgMCA0MS42em0xMDUuOC0xNWMwIDIuMSAxLjEgMzguNyAxLjEgMzkuMSAuMyA5LjktMjUuNiA1LjgtMjUuMi0yLjYgLjEtMiAxLjQtMzcuNCAxLjEtMzkuNC0xNC4xIDcuNC0xNC40IDQwLjIgNi40IDQ4LjggNCAxLjcgOC40IDEuOSAxMi41IC42czcuNi00IDkuOS03LjdjNC45LTcuOCA2LjgtMjkuNS01LjQtMzktLjEgLjEtLjIgLjEtLjQgLjFsMCAwem0tMTIuMy0xOThjLTkuOCAwLTkuNyAxNC44LS4xIDE0LjlzMTAuMS0xNC45IC4xLTE0LjlsMCAwek0xNDMuNyAxOTguNmMwIDEuOCAuNCAyLjQgMi4yIDIuNiAxMy42IDEuNCAxMi41LTExIDEyLjItMTMuNC0xLjctMTEuMi0xNC40LTEwLjItMTQuNC03LjggMCA0LjUgMCAxMy43IDAgMTguNnpNMzU2IDIwNWwtNi4xLTE1LjhjLTIuMiA1LjUtNC4yIDEwLjYtNi4yIDE1LjhsMTIuMyAweiJdCiAgICB9OwogICAgZmFTdGVhbVN5bWJvbCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzdGVhbS1zeW1ib2wiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjNmNiIsICJNMjczLjUgMTc3LjVhNjEgNjEgMCAxIDEgMTIyIDAgNjEgNjEgMCAxIDEgLTEyMiAwem0xNzQuNSAuMmMwIDYzLTUxIDExMy44LTExMy43IDExMy44TDIyNSAzNzEuM2MtNCA0My00MC41IDc2LjgtODQuNSA3Ni44LTQwLjUgMC03NC43LTI4LjgtODMtNjdMMCAzNTggMCAyNTAuNyA5Ny4yIDI5MGMxNS4xLTkuMiAzMi4yLTEzLjMgNTItMTEuNWw3MS0xMDEuN0MyMjAuNyAxMTQuNSAyNzEuNyA2NCAzMzQuMiA2NCAzOTcgNjQgNDQ4IDExNSA0NDggMTc3Ljd6TTIwMyAzNjNjMC0zNC43LTI3LjgtNjIuNS02Mi41LTYyLjUtNC41IDAtOSAuNS0xMy41IDEuNWwyNiAxMC41YzI1LjUgMTAuMiAzOCAzOSAyNy43IDY0LjUtMTAuMiAyNS41LTM5LjIgMzgtNjQuNyAyNy41LTEwLjItNC0yMC41LTguMy0zMC43LTEyLjIgMTAuNSAxOS43IDMxLjIgMzMuMiA1NS4yIDMzLjIgMzQuNyAwIDYyLjUtMjcuOCA2Mi41LTYyLjV6TTQxMC41IDE3Ny43YTc2LjQgNzYuNCAwIDEgMCAtMTUyLjggMCA3Ni40IDc2LjQgMCAxIDAgMTUyLjggMHoiXQogICAgfTsKICAgIGZhTWFpbGNoaW1wID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1haWxjaGltcCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNTllIiwgIk0zMzEgMjQzLjVjMy4xLS40IDYuMi0uNCA5LjMgMCAxLjctMy44IDItMTAuNCAuNS0xNy42LTIuMi0xMC43LTUuMy0xNy4xLTExLjUtMTYuMXMtNi41IDguNy00LjIgMTkuNGMxLjMgNiAzLjUgMTEuMSA2IDE0LjNsMCAwek0yNzcuNCAyNTJjNC41IDIgNy4yIDMuMyA4LjMgMi4xIDEuOS0xLjktMy41LTkuNC0xMi4xLTEzLjEtNS0yLjEtMTAuNC0yLjgtMTUuOC0yLjJzLTEwLjUgMi43LTE0LjggNS44Yy0zIDIuMi01LjggNS4yLTUuNCA3LjEgLjkgMy43IDEwLTIuNyAyMi42LTMuNSA3LS40IDEyLjggMS44IDE3LjMgMy43bDAgMHptLTkgNS4xYy05LjEgMS40LTE1IDYuNS0xMy41IDEwLjEgLjkgLjMgMS4yIC44IDUuMi0uOCA2LTIuMyAxMi40LTIuOSAxOC43LTEuOSAyLjkgLjMgNC4zIC41IDQuOS0uNSAxLjUtMi4yLTUuNy04LTE1LjQtNi45bDAgMHptNTQuMiAxNy4xYzMuNC02LjktMTAuOS0xMy45LTE0LjMtN3MxMC45IDEzLjkgMTQuMyA3bDAgMHptMTUuNy0yMC41Yy03LjctLjEtOCAxNS44LS4zIDE1LjlzOC0xNS44IC4zLTE2bDAgMHpNMTE5LjUgMzMyLjdjLTEuMyAuMy02IDEuNS04LjUtMi4zLTUuMi04IDExLjEtMjAuNCAzLTM1LjgtOS4xLTE3LjUtMjcuOC0xMy41LTM1LTUuNS04LjcgOS42LTguNyAyMy41LTUgMjQuMSA0LjMgLjYgNC4xLTYuNSA3LjQtMTEuNiAuOS0xLjQgMi4xLTIuNiAzLjUtMy42czMtMS42IDQuNi0yIDMuNC0uNCA1IDAgMy4zIDEgNC43IDEuOWMxMS42IDcuNiAxLjQgMTcuOCAyLjMgMjguNiAxLjQgMTYuNyAxOC40IDE2LjQgMjEuNiA5IC4yLS40IC4zLS44IC4zLTEuMnMtLjItLjgtLjUtMS4xYzAgLjkgLjctMS4zLTMuNC0uNGwwIDB6bTI5OS43LTE3LjFjLTMuMy0xMS43LTIuNi05LjItNi44LTIwLjUgMi40LTMuNyAxNS4zLTI0LTMuMS00My4zLTEwLjQtMTAuOS0zMy45LTE2LjUtNDEuMS0xOC41LTEuNS0xMS40IDQuNi01OC43LTIxLjUtODMgMjAuOC0yMS42IDMzLjgtNDUuMyAzMy43LTY1LjctLjEtMzkuMi00OC4yLTUxLTEwNy40LTI2LjVsLTEyLjUgNS4zYy0uMSAwLTIyLjctMjIuMy0yMy4xLTIyLjYtNjcuNS01OC45LTI3OC44IDE3NS45LTIxMS4zIDIzMi45bDE0LjggMTIuNWMtNCAxMC43LTUuNCAyMi4yLTQuMSAzMy41IDMuNCAzMy40IDM2IDYwLjQgNjcuNSA2MC40IDU3LjcgMTMzLjEgMjY3LjkgMTMzLjMgMzIyLjMgMyAxLjctNC41IDkuMS0yNC42IDkuMS00Mi40cy0xMC4xLTI1LjMtMTYuNS0yNS4zbDAgMHptLTMxNiA0OC4yYy0yMi44LS42LTQ3LjUtMjEuMS00OS45LTQ1LjUtNi4yLTYxLjMgNzQuMy03NS4zIDg0LTEyLjMgNC41IDI5LjYtNC43IDU4LjUtMzQuMSA1Ny44bDAgMHpNODQuNyAyNDkuNmMtMTUuMiAzLTI4LjUgMTEuNS0zNi43IDIzLjUtNC45LTQuMS0xNC0xMi0xNS42LTE1LTEzLTI0LjggMTQuMi03MyAzMy4zLTEwMC4yIDQ3LjEtNjcuMiAxMjAuOS0xMTguMSAxNTUtMTA4LjkgNS41IDEuNiAyMy45IDIyLjkgMjMuOSAyMi45cy0zNC4xIDE4LjktNjUuOCA0NS4zQzEzNi4yIDE1MCAxMDQgMTk3LjcgODQuNyAyNDkuNnpNMzIzLjYgMzUwLjdzLTM1LjcgNS4zLTY5LjUtNy4xYzYuMi0yMC4yIDI3IDYuMSA5Ni40LTEzLjggMTUuMy00LjQgMzUuNC0xMyA1MS0yNS40IDMuNCA3LjggNS44IDE1LjkgNy4xIDI0LjMgMy43LS43IDE0LjItLjUgMTEuNCAxOC4xLTMuMyAxOS45LTExLjcgMzYtMjUuOSA1MC44LTguOSA5LjYtMTkuNCAxNy41LTMxLjIgMjMuMy02LjUgMy40LTEzLjMgNi4zLTIwLjMgOC42LTUzLjUgMTcuNS0xMDguMy0xLjctMTI2LTQzLTEuNC0zLjEtMi42LTYuNC0zLjYtOS43LTcuNS0yNy4yLTEuMS01OS44IDE4LjgtODAuNCAxLjItMS4zIDIuNS0yLjkgMi41LTQuOC0uMi0xLjctLjgtMy4zLTEuOS00LjUtNy0xMC4xLTMxLjItMjcuNC0yNi4zLTYwLjggMy41LTI0IDI0LjUtNDAuOSA0NC4xLTM5LjlsNSAuM2M4LjUgLjUgMTUuOSAxLjYgMjIuOSAxLjkgMTEuNyAuNSAyMi4yLTEuMiAzNC42LTExLjYgNC4yLTMuNSA3LjYtNi41IDEzLjMtNy41IDIuMy0uNiA0LjctLjcgNy0uM3M0LjYgMS4yIDYuNiAyLjVjMTAgNi42IDExLjQgMjIuNyAxMS45IDM0LjUgLjMgNi43IDEuMSAyMyAxLjQgMjcuNiAuNiAxMC43IDMuNCAxMi4yIDkuMSAxNCAzLjIgMSA2LjIgMS44IDEwLjUgMy4xIDEzLjIgMy43IDIxIDcuNSAyNiAxMi4zIDIuNSAyLjUgNC4yIDUuOCA0LjcgOS4zIDEuNiAxMS40LTguOCAyNS40LTM2LjMgMzguMi00Ni43IDIxLjctOTMuNyAxNC40LTEwMC41IDEzLjctMjAuMi0yLjctMzEuNiAyMy4zLTE5LjUgNDEuMSAyMi42IDMzLjQgMTIyLjQgMjAgMTUxLjQtMjEuNCAuNy0xIC4xLTEuNi0uNy0xLTQxLjggMjguNi05Ny4xIDM4LjItMTI4LjUgMjYtNC44LTEuOC0xNC43LTYuNC0xNS45LTE2LjcgNDMuNiAxMy41IDcxIC43IDcxIC43czItMi44LS42LTIuNXpNMTcxLjcgMTU3LjVjMTYuNy0xOS40IDM3LjQtMzYuMiA1NS44LTQ1LjYgLjEtLjEgLjMtLjEgLjUtLjFzLjMgLjEgLjQgLjIgLjIgLjMgLjIgLjQgMCAuMy0uMSAuNWMtMS41IDIuNy00LjMgOC4zLTUuMiAxMi43IDAgLjEgMCAuMyAwIC40cy4yIC4zIC4zIC40IC4zIC4xIC40IC4xIC4zIDAgLjQtLjFjMTEuNS03LjggMzEuNS0xNi4yIDQ5LTE3LjMgLjIgMCAuMyAwIC41IC4xcy4yIC4yIC4zIC40IC4xIC4zIDAgLjUtLjEgLjMtLjMgLjRjLTIuOSAyLjItNS41IDQuOC03LjcgNy43LS4xIC4xLS4xIC4yLS4xIC40czAgLjMgLjEgLjQgLjIgLjIgLjMgLjMgLjIgLjEgLjQgLjFjMTIuMyAuMSAyOS43IDQuNCA0MSAxMC43IC44IC40IC4yIDEuOS0uNiAxLjctNjkuNS0xNS45LTEyMy4xIDE4LjUtMTM0LjUgMjYuOC0uMiAuMS0uMyAuMS0uNSAuMXMtLjMtLjEtLjUtLjItLjItLjMtLjItLjUgLjEtLjQgLjItLjVsLS4xIDB6Il0KICAgIH07CiAgICBmYUx1bW9uID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImx1bW9uIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU3ZTIiLCAiTTQ1Mi41IDIyMy41YzkuOCAwIDE2LjUgNi4zIDE2LjUgMTYuNmwwIDMxLjhjMCAxMC4zLTYuNiAxNi42LTE2LjYgMTYuNmwtNTYuMiAwYy05LjggMC0xNi41LTYuMy0xNi41LTE2LjZsMC0zMS44YzAtMTAuMyA2LjctMTYuNiAxNi41LTE2LjZsNTYuMyAwem0tMjUuNyAxMy4xYy0xLjUtMi42LTMuMi0yLjYtNC42IDBsLTEwLjcgMTcuNmMtMS43IDIuNC0yLjYgNS4xLTIuNiA4LjIgMCA3LjkgNi45IDE0LjYgMTUuNiAxNC42IDguNSAwIDE1LjYtNi43IDE1LjYtMTQuNiAwLTMtMS01LjgtMi43LTguMmwtMTAuNy0xNy42ek04NS44IDIyMy44YzEgMCAxLjUgLjYgMS41IDEuNWwwIDUwLjMgNjQuNiAwYzEgMCAxLjYgLjYgMS42IDEuNWwwIDkuN2MwIC45LS42IDEuNS0xLjYgMS41bC03OC40IDBjLTEgMC0xLjYtLjYtMS42LTEuNWwwLTYxLjRjMC0uOSAuNi0xLjUgMS42LTEuNWwxMi4zIDB6bTg4LjMgMGMxIDAgMS41IC42IDEuNSAxLjVsMCA0NWMwIDQgMiA1LjIgNS43IDUuMmw0Ni45IDBjMy44IDAgNS43LTEuMyA1LjctNS4ybDAtNDVjMC0uOSAuNS0xLjUgMS41LTEuNWwxMi4zIDBjMSAwIDEuNiAuNiAxLjYgMS41bDAgNDZjMCAxMC41LTUuMyAxNi44LTE3LjYgMTYuOGwtNTQgMGMtMTIuMyAwLTE3LjYtNi4zLTE3LjYtMTYuOGwwLTQ2YzAtLjkgLjYtMS41IDEuNi0xLjVsMTIuMyAwem0xMDguMiAwYzEgMCAxLjYgLjUgMi4yIDEuNGwzMC41IDQ2LjQgMS40IDAgMzAuNS00Ni40Yy42LS45IDEuMi0xLjQgMi4yLTEuNGwxOCAwYzEgMCAxLjUgLjYgMS41IDEuNWwwIDYxLjRjMCAuOS0uNSAxLjUtMS41IDEuNWwtMTIuMyAwYy0xIDAtMS42LS42LTEuNi0xLjVsMC00My44LTEuMSAwLTI4LjcgNDMuOGMtLjYgLjktMS4zIDEuNS0yLjQgMS41bC0xMC43IDBjLTEgMC0xLjctLjYtMi4zLTEuNWwtMjguNy00My44LTEuMSAwIDAgNDMuOGMwIC45LS41IDEuNS0xLjUgMS41bC0xMi4zIDBjLTEgMC0xLjYtLjYtMS42LTEuNWwwLTYxLjRjMC0uOSAuNi0xLjUgMS42LTEuNWwxNy45IDB6bTIxNC40IDBjLjkgMCAxLjMgLjQgMi4yIDEuMWw1Mi43IDQ2LjMgMS4zIDAgMC00NmMwLS45IC42LTEuNSAxLjYtMS41bDEyLjMgMGMxIDAgMS42IC42IDEuNiAxLjVsMCA2MS40YzAgLjktLjYgMS41LTEuNiAxLjVsLTE0LjQgMGMtMSAwLTEuNC0uNC0yLjMtMS4xbC01Mi42LTQ2LjMtMS40IDAgMCA0NmMwIC45LS41IDEuNS0xLjUgMS41bC0xMi4zIDBjLTEgMC0xLjYtLjYtMS42LTEuNWwwLTYxLjRjMC0uOSAuNi0xLjUgMS42LTEuNWwxNC40IDB6TTMyMCAxMTQuMWM4Ny45IDAgMTY3LjcgMTUuNyAyMjUuNSA0MWwyLjcgMS4yQzU4Ny4xIDE3My44IDY0MCAyMDYuNSA2NDAgMjU2cy01Mi45IDgyLjItOTEuOCA5OS42bC0yLjcgMS4yYy01Ny44IDI1LjQtMTM3LjYgNDEtMjI1LjUgNDEtNzYuMiAwLTE1NS4xLTEwLjUtMjI1LjUtNDEtMzkuNi0xNy40LTk0LjUtNTAuMy05NC41LTEwMC44czU0LjktODMuNSA5NC41LTEwMC44YzcwLjQtMzAuNSAxNDkuMy00MSAyMjUuNS00MXptLTg4LjkgMjI5YzIwLjMgMjkgNTIuOCA0OS42IDg4LjkgNDkuNiAzNi4yIDAgNjguNy0yMC42IDg5LTQ5LjdsLTE3Ny45IC4xem0tOTYuMSAwYzQzLjMgMjkuNyA5Ni43IDQzLjUgMTQ4LjQgNDgtMjQuMi05LjEtNDQuNC0yNi43LTU4LjYtNDguMWwtODkuOSAwem0yODAuMy0uMWMtMTQuMiAyMS40LTM0LjQgMzkuMS01OC42IDQ4LjEgNTEuOC00LjUgMTA1LjMtMTguMyAxNDguNi00OC4ybC05MCAwem0tMzM3LjQgLjFjNDQuMSAyMy4xIDkzLjcgMzUuNCAxNDIuNyA0Mi42LTMzLjQtOC42LTY2LjUtMjEuOS05NC40LTQyLjZsLTQ4LjMgMHptNDM2LjItLjJjLTI3LjkgMjAuOC02MS4xIDM0LjItOTQuNiA0Mi44IDQ3LjMtNi45IDg5LjYtMTguNSAxMjMuOS0zMy42bDEuNy0uOGM2LjEtMi43IDExLjktNS41IDE3LjQtOC40bC00OC41IDB6TTUyMCAxNzMuNmMxMC43IDguNyAxOS44IDE4LjEgMjcgMjguMiAuNCAuNiAuNSAxLjMgLjEgMnMtMSAxLTEuNyAxbC0xLjYgMGMtLjYgMC0xLjItLjMtMS41LS44LTcuOS0xMC45LTE4LjItMjEuMS0zMC42LTMwLjRsLTkzLjUgMGM1LjQgOC44IDkuOSAxOC41IDEzLjQgMjguNiAuMiAuNiAuMSAxLjItLjIgMS43cy0uOSAuOC0xLjYgLjhsLTEuNCAwYy0uOCAwLTEuNS0uNS0xLjgtMS4zLTMuOC0xMC43LTguNy0yMC44LTE0LjUtMjkuOWwtMTg0LjMgLjFjLTUuOCA5LjEtMTAuNyAxOS4xLTE0LjQgMjkuOC0uMyAuOC0xIDEuMy0xLjggMS4zbC0xLjQgMGMtLjYgMC0xLjItLjMtMS42LS44cy0uNS0xLjEtLjItMS43YzMuNS0xMC4yIDgtMTkuNyAxMy40LTI4LjZsLTkzLjYgMGMtMTIuMyA5LjMtMjIuNiAxOS40LTMwLjQgMzAuMy0uNCAuNS0uOSAuOC0xLjUgLjhsLTEuNiAwYy0uNyAwLTEuNC0uNC0xLjctMXMtLjMtMS40IC4xLTJjNy42LTEwLjUgMTYuNy0xOS45IDI2LjgtMjhsLTUxIDBjLTI4LjkgMTYuNi02MiA0My4zLTYzLjUgNzkuN2w0NC43IDBjLjUgMCAxIC4yIDEuMyAuNnMuNiAuOCAuNiAxLjNsMCAxLjNjMCAxLjEtLjkgMS45LTEuOSAxLjlsLTQ0LjcgMEM2LjggMjk1IDQwIDMyMS43IDY5IDMzOC4zbDUwLjkgMGMtMTAuMy04LjQtMTkuMS0xNy40LTI2LjEtMjdsLS44LTEuMWMtLjQtLjYtLjUtMS4zLS4xLTJzMS0xIDEuNy0xbDEuNiAwIC4yIDBjLjUgLjEgMSAuMyAxLjMgLjggNy45IDEwLjkgMTguMSAyMSAzMC41IDMwLjNsOTMuNiAwYy01LjMtOC44LTkuOC0xOC40LTEzLjQtMjguNS0uMi0uNi0uMS0xLjIgLjItMS43cy45LS44IDEuNi0uOGwxLjQgMCAuMiAwYy43IC4xIDEuNCAuNiAxLjcgMS4zIDMuOCAxMC43IDguNiAyMC43IDE0LjQgMjkuOGwxODQuNS0uMWM1LjgtOS4xIDEwLjYtMTkuMSAxNC40LTI5LjdsLjEtLjFjLjMtLjcgMS0xLjEgMS43LTEuMWwxLjQgMGMuNiAwIDEuMiAuMyAxLjYgLjhzLjUgMS4yIC4yIDEuN2MtMy41IDEwLjEtOCAxOS43LTEzLjMgMjguNWw5My43IDBjMTIuMy05LjMgMjIuNS0xOS40IDMwLjMtMzAuMmwuMS0uMmMuNC0uNCAuOS0uNiAxLjQtLjZsMS42IDBjLjcgMCAxLjQgLjQgMS43IDFzLjMgMS40LS4xIDJjLTcuMSAxMC0xNi4xIDE5LjMtMjYuNyAyNy45bDUxLjEgMGMyOC44LTE2LjYgNjEuOC00My4zIDYzLjQtNzkuNmwtNDQuNyAwYy0xIDAtMS45LS45LTEuOS0xLjlsMC0xLjNjMC0xLjEgLjktMS45IDEuOS0xLjlsNDQuNyAwYy0xLjYtMzYuNS0zNC45LTYzLjMtNjMuOS03OS45bC01MC45IDB6TTIyMC41IDEyNi4yYy00OS4xIDcuMS05OC43IDE5LjUtMTQzIDQyLjdsNDguNCAwYzI3LjktMjAuOCA2MS0zNC4xIDk0LjUtNDIuN3ptNjIuOC01LjRjLTUxLjggNC41LTEwNS4yIDE4LjMtMTQ4LjYgNDguMWw5MCAwYzE0LjItMjEuNCAzNC40LTM5IDU4LjYtNDguMXptMzYuNi0xLjZjLTM2LjIgMC02OC43IDIwLjYtODkgNDkuN2wxNzcuOS0uMWMtMjAuMy0yOS4xLTUyLjctNDkuNi04OC45LTQ5LjZ6bTM2LjYgMS42YzI0LjIgOS4xIDQ0LjQgMjYuNiA1OC41IDQ4bDg5LjggMGMtNDMuMy0yOS43LTk2LjYtNDMuNS0xNDguMy00OHptNjIuOCA1LjRjMzMuNCA4LjUgNjYuNCAyMS45IDk0LjMgNDIuNWw0OC4zIDBjLTQ0LjEtMjMuMS05My42LTM1LjQtMTQyLjYtNDIuNXoiXQogICAgfTsKICAgIGZhTnV0cml0aW9uaXggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibnV0cml0aW9uaXgiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjNkNiIsICJNMTEyIDguMVMyNDUuNC0uMSAyMzMgMTEyLjVjMCAwIDE5LjEtNzQuOSAxMDMtNDAuNiAwIDAtMTcuNyA3NC04OCA1NiAwIDAgMTQuNi01NC42IDY2LjEtNTYuNiAwIDAtMzkuOS0xMC4zLTgyLjEgNDguOCAwIDAtMTkuOC05NC41LTkzLjYtOTkuNyAwIDAgNzUuMiAxOS40IDc3LjYgMTA3LjUgMCAuMS0xMDYuNCA3LTEwNC0xMTkuOHpNNDI0IDMyMy43YzAgNDguNS05LjcgOTUuMy0zMiAxMzIuMy00Mi4yIDMwLjktMTA1IDQ4LTE2OCA0OC02Mi45IDAtMTI1LjgtMTcuMS0xNjgtNDgtMjIuMy0zNy0zMi04My44LTMyLTEzMi4zIDAtNDguNCAxNy43LTk0LjcgNDAtMTMxLjcgNDIuMi0zMC45IDk3LjEtNDguNiAxNjAtNDguNiA2MyAwIDExNy44IDE3LjYgMTYwIDQ4LjYgMjIuMyAzNyA0MCA4My4zIDQwIDEzMS43ek0xNDQgNDI4YTI4IDI4IDAgMSAwIC01NiAwIDI4IDI4IDAgMSAwIDU2IDB6bTAtNjYuMmEyOCAyOCAwIDEgMCAtNTYgMCAyOCAyOCAwIDEgMCA1NiAwem0wLTY2LjJhMjggMjggMCAxIDAgLTU2IDAgMjggMjggMCAxIDAgNTYgMHpNMjE2IDQyOGEyOCAyOCAwIDEgMCAtNTYgMCAyOCAyOCAwIDEgMCA1NiAwem0wLTY2LjJhMjggMjggMCAxIDAgLTU2IDAgMjggMjggMCAxIDAgNTYgMHptMC02Ni4yYTI4IDI4IDAgMSAwIC01NiAwIDI4IDI4IDAgMSAwIDU2IDB6TTI4OCA0MjhhMjggMjggMCAxIDAgLTU2IDAgMjggMjggMCAxIDAgNTYgMHptMC02Ni4yYTI4IDI4IDAgMSAwIC01NiAwIDI4IDI4IDAgMSAwIDU2IDB6bTAtNjYuMmEyOCAyOCAwIDEgMCAtNTYgMCAyOCAyOCAwIDEgMCA1NiAwek0zNjAgNDI4YTI4IDI4IDAgMSAwIC01NiAwIDI4IDI4IDAgMSAwIDU2IDB6bTAtNjYuMmEyOCAyOCAwIDEgMCAtNTYgMCAyOCAyOCAwIDEgMCA1NiAwem0wLTY2LjJhMjggMjggMCAxIDAgLTU2IDAgMjggMjggMCAxIDAgNTYgMHpNMzg0IDI1NmMtNC44LTIyLjMtNy40LTM2LjktMTYtNTYtMzguOC0xOS45LTkwLjUtMzItMTQ0LTMyUzExOC44IDE4MC4xIDgwIDIwMGMtOC44IDE5LjUtMTEuMiAzMy45LTE2IDU2IDQyLjItNy45IDk4LjctMTQuOCAxNjAtMTQuOHMxMTcuOCA2LjkgMTYwIDE0Ljh6Il0KICAgIH07CiAgICBmYUNyZWF0aXZlQ29tbW9uc1NhbXBsaW5nUGx1cyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjcmVhdGl2ZS1jb21tb25zLXNhbXBsaW5nLXBsdXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjRmMSIsICJNMjU1LjYgOEMzOTcuNCA4IDUwNCAxMTguMSA1MDQgMjU2IDUwNCA0MDMuMSAzODUuNSA1MDQgMjU1LjYgNTA0IDEyMS42IDUwNCA4IDM5NC41IDggMjU2IDggMTIzLjEgMTEyLjcgOCAyNTUuNiA4em0uOCA0NC43Yy0xMTguMiAwLTIwMy43IDk3LjktMjAzLjcgMjAzLjMgMCAxMDkuOCA5MS4yIDIwMi44IDIwMy43IDIwMi44IDEwMy4yIDAgMjAyLjgtODEuMSAyMDIuOC0yMDIuOCAuMS0xMTMuOC05MC4yLTIwMy4zLTIwMi44LTIwMy4zem0xMDcgMjA1LjZjLTQuNyAwLTkgMi44LTEwLjcgNy4ybC00IDkuNS0xMS05Mi44Yy0xLjctMTMuOS0yMi0xMy40LTIzLjEgLjRsLTQuMyA1MS40LTUuMi02OC44Yy0xLjEtMTQuMy0yMi4xLTE0LjItMjMuMiAwbC0zLjUgNDQuOS01LjktOTQuM2MtLjktMTQuNS0yMi4zLTE0LjQtMjMuMiAwbC01LjEgODMuNy00LjMtNjYuM2MtLjktMTQuNC0yMi4yLTE0LjQtMjMuMiAwbC01LjMgODAuMi00LjEtNTdjLTEuMS0xNC4zLTIyLTE0LjMtMjMuMi0uMmwtNy43IDg5LjgtMS44LTEyLjJjLTEuNy0xMS40LTE3LjEtMTMuNi0yMi0zLjNsLTEzLjIgMjcuNy00My45IDAgMCAyMy4yIDUxLjMgMGM0LjQgMCA4LjQtMi41IDEwLjQtNi40bDEwLjcgNzMuMWMyIDEzLjUgMjEuOSAxMyAyMy4xLS43bDMuOC00My42IDUuNyA3OC4zYzEuMSAxNC40IDIyLjMgMTQuMiAyMy4yLS4xbDQuNi03MC40IDQuOCA3My4zYy45IDE0LjQgMjIuMyAxNC40IDIzLjItLjFsNC45LTgwLjUgNC41IDcxLjhjLjkgMTQuMyAyMi4xIDE0LjUgMjMuMiAuMmw0LjYtNTguNiA0LjkgNjQuNGMxLjEgMTQuMyAyMiAxNC4yIDIzLjEgLjFsNi44LTgzIDIuNyAyMi4zYzEuNCAxMS44IDE3LjcgMTQuMSAyMi4zIDMuMWwxOC00My40IDUwLjUgMCAwLTIzLjItNTguNCAuM3ptLTc4IDUuMmwtMjEuOSAwIDAgMjEuOWMwIDQuMS0zLjMgNy41LTcuNSA3LjUtNC4xIDAtNy41LTMuMy03LjUtNy41bDAtMjEuOS0yMS45IDBjLTQuMSAwLTcuNS0zLjMtNy41LTcuNSAwLTQuMSAzLjQtNy41IDcuNS03LjVsMjEuOSAwIDAtMjEuOWMwLTQuMSAzLjQtNy41IDcuNS03LjVzNy41IDMuMyA3LjUgNy41bDAgMjEuOSAyMS45IDBjNC4xIDAgNy41IDMuMyA3LjUgNy41IDAgNC4xLTMuNCA3LjUtNy41IDcuNXoiXQogICAgfTsKICAgIGZhUmVkaGF0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInJlZGhhdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmN2JjIiwgIk0zNDEuNSAyODUuNmMzMy43IDAgODIuMy02LjkgODIuMy00NyAuMi02LjcgLjktMS44LTIwLjktOTYuMi00LjYtMTkuMS04LjctMjcuOC00Mi4zLTQ0LjYtMjYuMS0xMy4zLTgyLjktMzUuNC05OS43LTM1LjQtMTUuNyAwLTIwLjIgMjAuMi0zOC45IDIwLjItMTggMC0zMS4zLTE1LjEtNDguMS0xNS4xLTE2LjEgMC0yNi43IDExLTM0LjggMzMuNi0yNy41IDc3LjYtMjYuMyA3NC4zLTI2LjEgNzguMyAwIDI0LjggOTcuNiAxMDYuMSAyMjguNSAxMDYuMXpNNDI5IDI1NC44YzQuNyAyMiA0LjcgMjQuMyA0LjcgMjcuMiAwIDM3LjctNDIuMyA1OC42LTk4IDU4LjYtMTI1LjcgLjEtMjM1LjktNzMuNi0yMzUuOS0xMjIuMyAwLTYuOCAxLjQtMTMuNSA0LjEtMTkuNy00NS4yIDIuMy0xMDMuOCAxMC4zLTEwMy44IDYyIDAgODQuNyAyMDAuNiAxODkgMzU5LjUgMTg5IDEyMS44IDAgMTUyLjUtNTUuMSAxNTIuNS05OC42IDAtMzQuMi0yOS42LTczLTgyLjktOTYuMnoiXQogICAgfTsKICAgIGZhU3F1YXJlUGllZFBpcGVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1waWVkLXBpcGVyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInBpZWQtcGlwZXItc3F1YXJlIl0sICJlMDFlIiwgIk0zMi4xIDQxOWwtMzIgNjAuMiAuOC0zMjhDLjkgODUuMyA1NC4xIDMyIDEyMC4xIDMybDMyNy4yIDBDMzU0LjMgNjAuOSAyNTcuNCAxMjYuMiAxOTMuNCAyMDAuNiAxMjIuOCAyODIgODIuNyAzMzggMzIuMSA0MTl6bTQxNi0zODdTMzA1LjMgOTguOCAyNjEuNyAxOTkuMWMtMjMuMiA1My42LTI4LjkgMTE4LjEtNzEgMTU4LjYtMjguOSAyNy44LTY5LjggMzguMi0xMDUuMyA1Ni4zLTIzLjIgMTItNjYuNCA0MC41LTg0LjkgNjZsMzI4LjQgMGM2NiAwIDExOS4zLTUzLjMgMTE5LjMtMTE5LjItLjEgMC0uMS0zMjguOC0uMS0zMjguOHoiXQogICAgfTsKICAgIGZhUGllZFBpcGVyU3F1YXJlID0gZmFTcXVhcmVQaWVkUGlwZXI7CiAgICBmYVdoYXRzYXBwID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIndoYXRzYXBwIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyMzIiLCAiTTM4MC45IDk3LjFjLTQxLjktNDItOTcuNy02NS4xLTE1Ny02NS4xLTEyMi40IDAtMjIyIDk5LjYtMjIyIDIyMiAwIDM5LjEgMTAuMiA3Ny4zIDI5LjYgMTExTDAgNDgwIDExNy43IDQ0OS4xYzMyLjQgMTcuNyA2OC45IDI3IDEwNi4xIDI3bC4xIDBjMTIyLjMgMCAyMjQuMS05OS42IDIyNC4xLTIyMiAwLTU5LjMtMjUuMi0xMTUtNjcuMS0xNTd6bS0xNTcgMzQxLjZjLTMzLjIgMC02NS43LTguOS05NC0yNS43bC02LjctNC02OS44IDE4LjMgMTguNi02OC4xLTQuNC03Yy0xOC41LTI5LjQtMjguMi02My4zLTI4LjItOTguMiAwLTEwMS43IDgyLjgtMTg0LjUgMTg0LjYtMTg0LjUgNDkuMyAwIDk1LjYgMTkuMiAxMzAuNCA1NC4xczU2LjIgODEuMiA1Ni4xIDEzMC41YzAgMTAxLjgtODQuOSAxODQuNi0xODYuNiAxODQuNnpNMzI1LjEgMzAwLjVjLTUuNS0yLjgtMzIuOC0xNi4yLTM3LjktMTgtNS4xLTEuOS04LjgtMi44LTEyLjUgMi44cy0xNC4zIDE4LTE3LjYgMjEuOGMtMy4yIDMuNy02LjUgNC4yLTEyIDEuNC0zMi42LTE2LjMtNTQtMjkuMS03NS41LTY2LTUuNy05LjggNS43LTkuMSAxNi4zLTMwLjMgMS44LTMuNyAuOS02LjktLjUtOS43cy0xMi41LTMwLjEtMTcuMS00MS4yYy00LjUtMTAuOC05LjEtOS4zLTEyLjUtOS41LTMuMi0uMi02LjktLjItMTAuNi0uMnMtOS43IDEuNC0xNC44IDYuOWMtNS4xIDUuNi0xOS40IDE5LTE5LjQgNDYuM3MxOS45IDUzLjcgMjIuNiA1Ny40YzIuOCAzLjcgMzkuMSA1OS43IDk0LjggODMuOCAzNS4yIDE1LjIgNDkgMTYuNSA2Ni42IDEzLjkgMTAuNy0xLjYgMzIuOC0xMy40IDM3LjQtMjYuNHM0LjYtMjQuMSAzLjItMjYuNGMtMS4zLTIuNS01LTMuOS0xMC41LTYuNnoiXQogICAgfTsKICAgIGZhSW1kYiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJpbWRiIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyZDgiLCAiTTg5LjUgMzIzLjZsLTM1LjYgMCAwLTEzNy40IDM1LjYgMCAwIDEzNy40em02Ni42LTczLjFsOS4xLTY0LjMgNDYuMyAwIDAgMTM3LjQtMzEgMCAwLTkyLjctMTMuNCA5Mi43LTIxLjMgMC0xMy05MC43LS4xIDkwLjctMzEuMiAwIDAtMTM3LjQgNDYuMSAwYy41IDguMyAyLjggMTguMSA0LjMgMjkuNGw0LjIgMzQuOXptNjcuNiA3My4xbDAtMTM3LjQgMjYuNiAwYzE3IDAgMjcgLjkgMzMgMi40IDYuMSAxLjcgMTAuNyA0LjIgMTMuOSA3LjkgMy4xIDMuMyA1LjEgNi42IDUuOCAxMiAuOSA0LjQgMS40IDEzLjEgMS40IDI2LjJsMCA0OC4yYzAgMTIuMy0uNyAyMC41LTEuOSAyNC43LTEuMSA0LjEtMy4xIDcuNC02IDkuNy0yLjggMi40LTYuNCA0LjEtMTAuNyA1LTQuMiAuOC0xMC42IDEuMy0xOS4xIDEuM2wtNDMgMHptMzUuNS0xMTMuOWwwIDg5LjRjNS4xIDAgOC4zLTEgOS40LTIuMyAxLjEtMiAxLjgtNy42IDEuOC0xNi43bDAtNTMuM2MwLTYuMi0uMS0xMC4yLS43LTEyLS4zLTEuOC0xLjItMy0yLjYtNC43LTEuNCAwLTQuMS0uNC03LjktLjR6bTU3LjMgMTEzLjlsMC0xMzcuNCAzNC4xIDAgMCA0My45YzIuOS0yLjQgNi4xLTQuOSA5LjUtNi42IDMuNi0xLjUgOC44LTIuNCAxMi44LTIuNCA0LjggMCA4LjkgLjggMTIuMyAyLjIgMy40IDEuNSA2IDMuNSA4IDYuMiAxLjcgMi42IDIuNyA1LjMgMy4xIDcuOCAuNCAyLjYtLjIgOC0uMiAxNi4ybDAgMzguNmMwIDguMiAuMiAxNC4zLS44IDE4LjQtMS4xIDQtMy44IDcuNi03LjggOS42LTQuMSAzLjktOC45IDUuMy0xNC42IDUuMy00IDAtOS4yLS45LTEyLjctMi41LTMuNS0xLjgtNi43LTQuNS05LjYtOGwtMi4xIDguNy0zMiAwem00NS4xLTIwLjdjLjctMS44IDEtNiAxLTEyLjVsMC0zNS40YzAtNS42LS4zLTkuNS0xLjEtMTEuMi0uNy0xLjktMy43LTIuNy01LjgtMi43LTIgMC0zLjQgLjgtNC4xIDIuMy0uNiAxLjUtMSA1LjQtMSAxMS42bDAgMzYuNGMwIDYuMSAuNCAxMCAxLjIgMTEuNiAuNiAxLjcgMi4xIDIuNSA0LjEgMi41IDIuMiAwIDQuMi0uOCA1LjctMi42ek00MTguNCAzMmMxNS43IDEuMiAyOC43IDE1LjIgMjguNyAzMS45bDAgMzg0LjJjMCAxNi40LTExLjkgMzAuNC0yOC4yIDMxLS4zIDAtLjUgLjktLjggLjlMMjkuOSA0ODBjLS4zIDAtLjYtLjktLjgtLjEtMTUuNy0xLjQtMjcuOS0xMy44LTI5LTMwLjJMMCA2MS44QzEuMSA0NS45IDEzLjggMzMuMSAzMC4zIDMxLjFsMzg3LjQgMGMuMiAwIC41IC45IC43IC45ek0zMC4zIDQxLjNDMTkgNDIgMTAgNTEgOS4zIDYyLjRsMCAzODcuM2MuNCA1LjQgMi43IDEwLjUgNi40IDE0LjMgMy44IDMuOSA4LjggNi4zIDE0LjIgNi43bDM4OC4yIDBjMTEuNS0xIDIwLjYtMTEuNiAyMC42LTIyLjZsMC0zODQuMmMwLTUuNy0yLjEtMTEuMy02LTE1LjVzLTkuMy02LjgtMTUtNy4ybC0zODcuNCAweiJdCiAgICB9OwogICAgZmFQeXRob24gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicHl0aG9uIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzZTIiLCAiTTQzOS44IDIwMC41Yy03LjctMzAuOS0yMi4zLTU0LjItNTMuNC01NC4ybC00MC4xIDAgMCA0Ny40YzAgMzYuOC0zMS4yIDY3LjgtNjYuOCA2Ny44bC0xMDYuOCAwYy0yOS4yIDAtNTMuNCAyNS01My40IDU0LjNsMCAxMDEuOGMwIDI5IDI1LjIgNDYgNTMuNCA1NC4zIDMzLjggOS45IDY2LjMgMTEuNyAxMDYuOCAwIDI2LjktNy44IDUzLjQtMjMuNSA1My40LTU0LjNsMC00MC43LTEwNi43IDAgMC0xMy42IDE2MC4yIDBjMzEuMSAwIDQyLjYtMjEuNyA1My40LTU0LjIgMTEuMi0zMy41IDEwLjctNjUuNyAwLTEwOC42ek0yODYuMiA0NDQuN2EyMC40IDIwLjQgMCAxIDEgMC00MC43IDIwLjQgMjAuNCAwIDEgMSAwIDQwLjd6TTE2Ny44IDI0OC4xbDEwNi44IDBjMjkuNyAwIDUzLjQtMjQuNSA1My40LTU0LjNsMC0xMDEuOWMwLTI5LTI0LjQtNTAuNy01My40LTU1LjYtMzUuOC01LjktNzQuNy01LjYtMTA2LjggLjEtNDUuMiA4LTUzLjQgMjQuNy01My40IDU1LjZsMCA0MC43IDEwNi45IDAgMCAxMy42LTE0NyAwYy0zMS4xIDAtNTguMyAxOC43LTY2LjggNTQuMi05LjggNDAuNy0xMC4yIDY2LjEgMCAxMDguNiA3LjYgMzEuNiAyNS43IDU0LjIgNTYuOCA1NC4ybDM2LjcgMCAwLTQ4LjhjMC0zNS4zIDMwLjUtNjYuNCA2Ni44LTY2LjR6TTE2MS4yIDY0LjdhMjAuNCAyMC40IDAgMSAxIDAgNDAuOCAyMC40IDIwLjQgMCAxIDEgMC00MC44eiJdCiAgICB9OwogICAgZmFDYXNoQXBwID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNhc2gtYXBwIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU3ZDQiLCAiTTQ0MC4zIDk2LjljLTkuNC0yNi41LTMwLjMtNDcuNC01Ni44LTU3LTI0LjEtNy45LTQ2LjMtNy45LTkxLjYtNy45TDE1NiAzMmMtNDQuOCAwLTY3LjIgMC05MS4zIDcuNS0yNi41IDkuNi00Ny40IDMwLjUtNTcgNTctNy43IDI0LjMtNy43IDQ2LjctNy43IDkxLjdMMCAzMjMuOGMwIDQ1LjIgMCA2Ny40IDcuNSA5MS41IDkuNiAyNi41IDMwLjUgNDcuNCA1NyA1NyAyNC4zIDcuNyA0Ni43IDcuNyA5MS42IDcuN2wxMzUuNyAwYzQ1IDAgNjcuNCAwIDkxLjYtNy43IDI2LjUtOS42IDQ3LjQtMzAuNSA1Ny01NyA3LjctMjQuMyA3LjctNDYuNyA3LjctOTEuNWwwLTEzNS41YzAtNDUgMC02Ny40LTcuNy05MS41ek0zMjMuMSAxODUuNGwtMjUuOCAyMS4xYy0yLjMgMS45LTUuNSAxLjUtNy4zLS45LTEzLjItMTYuMi0zMy43LTI1LjQtNTYuMS0yNS40LTI1IDAtNDAuNiAxMC45LTQwLjYgMjYuMi0uNCAxMi44IDExLjcgMTkuNiA0OS4xIDI3LjcgNDcuMiAxMCA2OC43IDI5LjcgNjguNyA2Mi43IDAgNDEuNC0zMy43IDcxLjktODYuNCA3NS4zbC01LjEgMjQuNWMtLjQgMi4zLTIuNiA0LjEtNS4xIDQuMWwtNDAuNiAwYy0zLjQgMC01LjgtMy4yLTUuMS02LjRsNi40LTI3LjNjLTI2LTcuNS00Ny4yLTIyLTU5LjMtMzkuNy0xLjUtMi4zLTEuMS01LjMgMS4xLTdsMjguMi0yMmMyLjMtMS45IDUuOC0xLjMgNy41IDEuMSAxNC45IDIwLjkgMzggMzMuMyA2NS43IDMzLjMgMjUgMCA0My44LTEyLjIgNDMuOC0yOS43IDAtMTMuNC05LjQtMTkuNi00MS4yLTI2LjItNTQuMi0xMS43LTc1LjgtMzEuOC03NS44LTY0LjkgMC0zOC40IDMyLjItNjcuMiA4MC45LTcxbDUuMy0yNS40Yy40LTIuMyAyLjYtNC4xIDUuMS00LjFsMzkuOSAwYzMuMiAwIDUuOCAzIDUuMSA2LjJsLTYuMiAyOC40YzIwLjkgNi40IDM4IDE3LjkgNDguNyAzMi4yIDEuNyAyLjEgMS4zIDUuMy0uOSA3eiJdCiAgICB9OwogICAgZmFQaW50ZXJlc3RQID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInBpbnRlcmVzdC1wIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYyMzEiLCAiTTIwNCA2LjVjLTEwMi42IDAtMjA0IDY4LjQtMjA0IDE3OS4xIDAgNzAuNCAzOS42IDExMC40IDYzLjYgMTEwLjQgOS45IDAgMTUuNi0yNy42IDE1LjYtMzUuNCAwLTkuMy0yMy43LTI5LjEtMjMuNy02Ny44IDAtODAuNCA2MS4yLTEzNy40IDE0MC40LTEzNy40IDY4LjEgMCAxMTguNSAzOC43IDExOC41IDEwOS44IDAgNTMuMS0yMS4zIDE1Mi43LTkwLjMgMTUyLjctMjQuOSAwLTQ2LjItMTgtNDYuMi00My44IDAtMzcuOCAyNi40LTc0LjQgMjYuNC0xMTMuNCAwLTY2LjItOTMuOS01NC4yLTkzLjkgMjUuOCAwIDE2LjggMi4xIDM1LjQgOS42IDUwLjctMTMuOCA1OS40LTQyIDE0Ny45LTQyIDIwOS4xIDAgMTguOSAyLjcgMzcuNSA0LjUgNTYuNCAzLjQgMy44IDEuNyAzLjQgNi45IDEuNSA1MC40LTY5IDQ4LjYtODIuNSA3MS40LTE3Mi44IDEyLjMgMjMuNCA0NC4xIDM2IDY5LjMgMzYgMTA2LjIgMCAxNTMuOS0xMDMuNSAxNTMuOS0xOTYuOCAwLTk5LjMtODUuOC0xNjQuMS0xODAtMTY0LjF6Il0KICAgIH07CiAgICBmYVdobWNzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIndobWNzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY0MGQiLCAiTTQ0OCAxNjFsMC0yMS4zLTI4LjUtOC44LTIuMi0xMC40IDIwLjEtMjAuNy0xMC40LTE5LjQtMjkgNy41LTcuMi03LjUgNy41LTI4LjItMTkuMS0xMS42LTIxLjMgMjEtMTAuNy0zLjItNy0yNi40LTIyLjYgMC02LjIgMjYuNC0xMi4xIDMuMi0xOS43LTIxLTE5LjQgMTEgOC4xIDI3LjctOC4xIDguNC0yOC41LTcuNS0xMSAxOS4xIDIwLjcgMjEtMi45IDEwLjQtMjguNSA3LjgtLjMgMjEuNyAyOC44IDcuNSAyLjQgMTIuMS0yMC4xIDE5LjkgMTAuNCAxOC41IDI5LjYtNy41IDcuMiA4LjYtOC4xIDI2LjkgMTkuOSAxMS42IDE5LjQtMjAuNCAxMS42IDIuOSA2LjcgMjguNSAyMi42IC4zIDYuNy0yOC44IDExLjYtMy41IDIwLjcgMjEuNiAyMC40LTEyLjEtOC44LTI4IDcuOC04LjEgMjguOCA4LjggMTAuMy0yMC4xLTIwLjktMTguOCAyLjItMTIuMSAyOS4xLTd6TTMyOC44IDkyLjZhNTYuOCA1Ni44IDAgMSAxIDAgMTEzLjYgNTYuOCA1Ni44IDAgMSAxIDAtMTEzLjZ6bTcyLjMgMTMwbDQ2LjkgMTQuNSAwIDM5LjktNTUuMSAxMy40LTQuMSAyMi43IDM4LjkgMzUuMy0xOS4yIDM3LjktNTQtMTYuNy0xNC42IDE1LjIgMTYuNyA1Mi41LTM4LjMgMjIuNy0zOC45LTQwLjUtMjEuNyA2LjYtMTIuNiA1NC00Mi40LS41LTEyLjYtNTMuNi0yMS43LTUuNi0zNi40IDM4LjQtMzcuNC0yMS43IDE1LjItNTAuNS0xMy43LTE2LjEtNTUuNSAxNC4xLTE5LjctMzQuOCAzNy45LTM3LjQtNC44LTIyLjgtNTQtMTQuMSAuNS00MC45IDUzLjUtMTQuNyA1LjctMTkuNy0zOC45LTM5LjQgMjAuNy0zNS44IDUzLjYgMTQuMSAxNS4yLTE1LjctMTUuMi01MiAzNi40LTIwLjcgMzYuOCAzOS40IDIyLjctNi4xIDExLjYtNTIgNDIuNCAwIDExLjYgNDUuOS0yMi42LTUuOS02LjMtMS43LTMuMyA1LjctMTEgMTkuMS0zLjMgNS42IDQuNiA0LjYgMTcuMiAxNy40LS4zIDEtMjMuOCA2LjUtNi4yIDEuN2MwIDMuMi0uMSA5LjYtLjMgMTkuMy00Ny41IDEwLjQtODMuMyA1Mi44LTgzLjMgMTAzLjUgMCA1OC4zIDQ3LjMgMTA1LjcgMTA1LjcgMTA1LjcgNTAuNSAwIDkyLjctMzUuNCAxMDMuMi04Mi44IDkuOSAuMSAxNi42IC4yIDIwLjEgLjNsMS42LTYuNyA1LjYtMjQgMS45LS42IDE3LjEgMTcuOCA0LjcgNC45IDUuOC0zLjQgMjAuNC0xMi4xIDUuOC0zLjUtMi02LjUtNi44LTIxLjJ6Il0KICAgIH07CiAgICBmYUpvZ2V0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImpvZ2V0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzYjciLCAiTTM4Ni4xIDQ1QzM0NS42IDE5LjkgMzAwLjYgOCAyNTYuMiA4IDE3MyA4IDkxLjggNDkuOSA0NC45IDEyNS45LTI3IDI0Mi41IDkuMyAzOTUuMiAxMjUuOSA0NjcuMXMyNjkuMyAzNS42IDM0MS4yLTgwLjlDNTM5IDI2OS42IDUwMi43IDExNi44IDM4Ni4xIDQ1em01MS44IDMyMy4yYy00MC40IDY1LjUtMTEwLjQgMTAxLjUtMTgyIDEwMS41LTYuOCAwLTEzLjYtLjQtMjAuNC0xLTktMTMuNi0xOS45LTMzLjMtMjMuNy00Mi40LTUuNy0xMy43LTI3LjItNDUuNiAzMS4yLTY3LjEgNTEuNy0xOS4xIDE3Ni43LTE2LjUgMjA4LjgtMTcuNi00IDktOC42IDE3LjktMTMuOSAyNi42ek0yMzcuMSAyODEuOWMtNTUuNS0xLjQtODEuNy0yMC44LTU4LjUtNDguMnM1MS4xLTQwLjcgNjguOS01MS4yYzE3LjktMTAuNSAyNy4zLTMzLjctMjMuNi0yOS43LTEyOC42IDguNy0xNjcuMyA5OS4zLTE3OC4zIDE0MC4yLTguOC00OS43LS4xLTEwMi43IDI4LjUtMTQ5LjEgNjEuOS0xMDAuNSAxOTMuNS0xMzEuNyAyOTQtNjkuOCA3NC44IDQ2LjEgMTExLjIgMTMwLjkgOTkuMyAyMTIuNy0yNC45LS41LTE3OS4zLTMuNi0yMzAuMy00Ljl6bTE4My44LTU0LjhjLTIyLjctNi01NyAxMS4zLTg2LjcgMjcuMi0yOS43IDE1LjgtMzEuMSA4LjItMzEuMSA4LjJzNDAuMi0yOC4xIDUwLjctMzQuNSAzMS45LTE0IDEzLjQtMjQuNmMtMy4yLTEuOC02LjctMi43LTEwLjQtMi43LTE3LjggMC00MS41IDE4LjctNjcuNSAzNS42LTMxLjUgMjAuNS02NS4zIDMxLjMtNjUuMyAzMS4zTDM5My41IDI2NiA0NDAgMjQyLjZzMy42LTkuNS0xOS4xLTE1LjV6Il0KICAgIH07CiAgICBmYVNxdWFyZVlvdXR1YmUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXlvdXR1YmUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs2MTc5OCwgInlvdXR1YmUtc3F1YXJlIl0sICJmNDMxIiwgIk0yODIgMjU2LjJsLTk1LjItNTQuMSAwIDEwOC4yIDk1LjItNTQuMXpNMzg0IDMyTDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjR6bTE0LjQgMTM2LjFjNy42IDI4LjYgNy42IDg4LjIgNy42IDg4LjJzMCA1OS42LTcuNiA4OC4xYy00LjIgMTUuOC0xNi41IDI3LjctMzIuMiAzMS45LTI4LjMgNy43LTE0Mi4yIDcuNy0xNDIuMiA3LjdzLTExMy45IDAtMTQyLjItNy42Yy0xNS43LTQuMi0yOC0xNi4xLTMyLjItMzEuOS03LjYtMjguNi03LjYtODguMi03LjYtODguMnMwLTU5LjcgNy42LTg4LjJjNC4yLTE1LjggMTYuNS0yOC4yIDMyLjItMzIuNCAyOC4zLTcuNyAxNDIuMi03LjcgMTQyLjItNy43czExMy45IDAgMTQyLjIgNy43YzE1LjcgNC4yIDI4IDE2LjYgMzIuMiAzMi40eiJdCiAgICB9OwogICAgZmFZb3V0dWJlU3F1YXJlID0gZmFTcXVhcmVZb3V0dWJlOwogICAgZmFBdGxhc3NpYW4gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYXRsYXNzaWFuIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY3N2IiLCAiTTE1Mi4yIDIzNi40Yy03LjctOC4yLTE5LjctNy43LTI0LjggMi44TDEuNiA0OTAuMmMtNSAxMCAyLjQgMjEuNyAxMy40IDIxLjdsMTc1IDBjNS44IC4xIDExLTMuMiAxMy40LTguNCAzNy45LTc3LjggMTUuMS0xOTYuMy01MS4yLTI2Ny4xek0yNDQuNCA4LjFjLTEyMi4zIDE5My40LTguNSAzNDguNiA2NSA0OTUuNSAyLjUgNS4xIDcuNyA4LjQgMTMuNCA4LjRMNDk3IDUxMmMxMS4yIDAgMTguNC0xMS44IDEzLjQtMjEuNyAwIDAtMjM0LjUtNDcwLjYtMjQwLjQtNDgyLjMtNS4zLTEwLjYtMTguOC0xMC44LTI1LjYgLjF6Il0KICAgIH07CiAgICBmYVBpZWRQaXBlckhhdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwaWVkLXBpcGVyLWhhdCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNGU1IiwgIk02NDAgMjQuOWMtODAuOCA1My42LTg5LjQgOTIuNS05Ni40IDEwNC40LTYuNyAxMi4yLTExLjcgNjAuMy0yMy4zIDgzLjYtMTEuNyAyMy42LTU0LjIgNDIuMi02Ni4xIDUwLTExLjcgNy44LTI4LjMgMzguMS00MS45IDY0LjItMTA4LjEtNC40LTE2Ny40IDM4LjgtMjU5LjIgOTMuNiAyOS40LTkuNyA0My4zLTE2LjcgNDMuMy0xNi43IDk0LjItMzYgMTM5LjMtNjguMyAyODEuMS00OS4yIDEuMSAwIDEuOSAuNiAyLjggLjggMy45IDIuMiA1LjMgNi45IDMuMSAxMC44bC01My45IDk1LjhjLTIuNSA0LjctNy44IDcuMi0xMy4xIDYuMS0xMjYuOC0yMy44LTIyNi45IDE3LjMtMzE4LjkgMTguNi03My40IDEuMS05Ny41LTMzLjUtOTcuNS0zNS4xIDAtMS4xIC42LTEuNyAxLjctMS43IDAgMCAzOC4zIDAgMTAzLjEtMTUuMyA3My42LTE0MC4zIDEzOS4yLTE4OS40IDIxMC42LTE4OS40IDAgMCA3MS43IDAgOTAuNiA2MS45IDIyLjgtMzkuNyAyOC4zLTQ5LjIgMjguMy00OS4yIDUuMy05LjQgMzUtNzcuMiA4Ni40LTE0MS40IDUxLjUtNjQgOTAuNC03OS45IDExOS4zLTkxLjh6Il0KICAgIH07CiAgICBmYUludGVybmV0RXhwbG9yZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaW50ZXJuZXQtZXhwbG9yZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjI2YiIsICJNNDgzLjEgMTU5LjdjMTAuOS0yNC42IDIxLjQtNjAuNCAyMS40LTg3LjkgMC03Mi43LTc5LjYtOTguNC0yMDkuNy0zOC42LTEwNy42LTcuMi0yMTEuMiA3My43LTIzNy4xIDE4Ni41IDMwLjktMzQuOSA3OC4zLTgyLjMgMTIyLTEwMS4yLTU0LjMgNDguMy0xMDAuNiAxMDkuNC0xMzUuNyAxNzMuMi0yMC43IDM3LjktNDQgOTkuMi00NCAxNDUgMCA5OC42IDkyLjkgODYuNSAxODAuMyA0MiAzMS40IDE1LjQgNjYuNiAxNS42IDEwMS43IDE1LjYgOTcuMSAwIDE4NC4yLTU0LjMgMjE2LjgtMTQ2bC0xMjAuOCAwYy01Mi41IDg4LjYtMTk2LjggNTMtMTk2LjgtNDcuNGwzMjguOCAwYzYuNC00My42LTEuNy05NS43LTI2LjktMTQxLjJ6TTY0LjYgMzQ2LjlDODIuMyAzOTggMTE4LjMgNDQyLjcgMTY0LjggNDcwLjIgNzYuMSA1MTkuMS04LjQgNDk5LjMgNjQuNiAzNDYuOXpNMTgwLjUgMjM4YzItNTUuMiA1MC4zLTk0LjkgMTA0LTk0LjkgNTMuNCAwIDEwMiAzOS43IDEwNCA5NC45bC0yMDggMHpNMzY1LjEgNTAuNGMyMS40LTEwLjMgNDguNi0yMiA3Mi42LTIyIDMxLjQgMCA1NC4zIDIxLjcgNTQuMyA1My43IDAgMjAtNy40IDQ5LTE0LjYgNjcuOS0yNi4zLTQyLjMtNjYtODEuNi0xMTIuMy05OS42eiJdCiAgICB9OwogICAgZmFBaXJibmIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYWlyYm5iIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY4MzQiLCAiTTIyNC41IDM3My4xYy0yNS4yLTMxLjctNDAuMS01OS40LTQ1LTgzLjItMjIuNS04OCAxMTIuNi04OCA5MC4xIDAtNS40IDI0LjItMjAuMyA1Mi00NSA4My4ybC0uMSAwem0xMzguMiA3My4yYy00Mi4xIDE4LjMtODMuNy0xMC45LTExOS4zLTUwLjUgMTAzLjktMTMwLjEgNDYuMS0yMDAtMTguOC0yMDAtNTQuOSAwLTg1LjIgNDYuNS03My4zIDEwMC41IDYuOSAyOS4yIDI1LjIgNjIuNCA1NC40IDk5LjUtMzIuNSAzNi02MC41IDUyLjctODUuMiA1NC45LTUwIDcuNC04OS4xLTQxLjEtNzEuMy05MS4xIDE1LjEtMzkuMiAxMTEuNy0yMzEuMiAxMTUuOS0yNDEuNiAxNS44LTMwLjEgMjUuNi01Ny40IDU5LjQtNTcuNCAzMi4zIDAgNDMuNCAyNS45IDYwLjQgNTkuOSAzNiA3MC42IDg5LjQgMTc3LjUgMTE0LjggMjM5LjEgMTMuMiAzMy4xLTEuNCA3MS4zLTM3IDg2LjZ6bTQ3LTEzNi4xYy0xMjguOS0yNzQuMy0xMzYtMjc4LjItMTg1LjEtMjc4LjItNDUuNSAwLTY0LjkgMzEuNy04NC43IDcyLjgtMTA2LjIgMjEyLjMtMTE2LjQgMjQyLjQtMTE3LjMgMjQ1LTI1LjIgNjkuMyAyNi43IDEzMC4yIDg5LjYgMTMwLjIgMjEuNyAwIDYwLjYtNi4xIDExMi40LTYyLjQgNTguNyA2My44IDEwMS4zIDYyLjQgMTEyLjQgNjIuNCA2Mi45IC4xIDExNC45LTYwLjkgODkuNi0xMzAuMiAwLTMuOS0xNi44LTM4LjktMTYuOC0zOS42bDAgMHoiXQogICAgfTsKICAgIGZhSnMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAianMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjNiOCIsICJNMCAzMmwwIDQ0OCA0NDggMCAwLTQ0OC00NDggMHpNMjQzLjggMzgxLjRjMCA0My42LTI1LjYgNjMuNS02Mi45IDYzLjUtMzMuNyAwLTUzLjItMTcuNC02My4yLTM4LjVMMTUyIDM4NS43YzYuNiAxMS43IDEyLjYgMjEuNiAyNy4xIDIxLjYgMTMuOCAwIDIyLjYtNS40IDIyLjYtMjYuNWwwLTE0My4xIDQyLjEgMCAwIDE0My43em05OS42IDYzLjVjLTM5LjEgMC02NC40LTE4LjYtNzYuNy00M0wzMDEgMzgyLjFjOSAxNC43IDIwLjggMjUuNiA0MS41IDI1LjYgMTcuNCAwIDI4LjYtOC43IDI4LjYtMjAuOCAwLTE0LjQtMTEuNC0xOS41LTMwLjctMjhsLTEwLjUtNC41Yy0zMC40LTEyLjktNTAuNS0yOS4yLTUwLjUtNjMuNSAwLTMxLjYgMjQuMS01NS42IDYxLjYtNTUuNiAyNi44IDAgNDYgOS4zIDU5LjggMzMuN0wzNjggMjkwYy03LjItMTIuOS0xNS0xOC0yNy4xLTE4LTEyLjMgMC0yMC4xIDcuOC0yMC4xIDE4IDAgMTIuNiA3LjggMTcuNyAyNS45IDI1LjZsMTAuNSA0LjVjMzUuOCAxNS4zIDU1LjkgMzEgNTUuOSA2Ni4yIDAgMzcuOC0yOS44IDU4LjYtNjkuNyA1OC42eiJdCiAgICB9OwogICAgZmFRdWluc2NhcGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicXVpbnNjYXBlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0NTkiLCAiTTMxMy43IDQ3NC42bC0xIDBjLTQxLjkgMC04Mi4xLTE2LjctMTExLjgtNDYuM3MtNDYuMy02OS45LTQ2LjMtMTExLjggMTYuNy04Mi4xIDQ2LjMtMTExLjggNjkuOS00Ni4zIDExMS44LTQ2LjNjOTQuOSAwIDE2OC4yIDgzLjEgMTU3IDE3Ni42IDQgNS4xIDguMiA5LjYgMTEuMiAxNS4zIDEzLjQtMzAuMyAyMC4zLTYyLjQgMjAuMy05Ny43IDAtMTM1LjEtMTA5LjUtMjQ0LjYtMjQ0LjYtMjQ0LjZTMTIuMSAxMTcuNSAxMi4xIDI1Mi42IDEyMS42IDQ5Ny4yIDI1Ni42IDQ5Ny4yYzIzLjggLjIgNDcuNi0zLjIgNzAuNC0xMC4xLTUuMi0zLjUtOC45LTguMS0xMy4zLTEyLjV6bTc4LjMtMTY5YTk5LjIgOTkuMiAwIDEgMCAwIDE5OC40IDk5LjIgOTkuMiAwIDEgMCAwLTE5OC40eiJdCiAgICB9OwogICAgZmFBZHZlcnNhbCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhZHZlcnNhbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMzZhIiwgIk00ODIuMSAzMkwyOC43IDMyQzUuOCAzMiAwIDM3LjkgMCA2MC45TDAgNDUxLjFDMCA0NzQuNCA1LjggNDgwIDI4LjcgNDgwbDQ1My40IDBjMjQuNCAwIDI5LjktNS4yIDI5LjktMjkuN2wwLTM4OC4xYzAtMjQuNi01LjQtMzAuMi0yOS45LTMwLjJ6TTE3OC40IDIyMC4zYy0yNy41LTIwLjItNzIuMS04LjctODQuMiAyMy40LTQuMyAxMS4xLTkuMyA5LjUtMTcuNSA4LjMtOS43LTEuNS0xNy4yLTMuMi0yMi41LTUuNS0yOC44LTExLjQgOC42LTU1LjMgMjQuOS02NC4zIDQxLjEtMjEuNCA4My40LTIyLjIgMTI1LjMtNC44IDQwLjkgMTYuOCAzNC41IDU5LjIgMzQuNSAxMjguNSAyLjcgMjUuOC00LjMgNTguMyA5LjMgODguOCAxLjkgNC40IC40IDcuOS0yLjcgMTAuNy04LjQgNi43LTM5LjMgMi4yLTQ2LjYtNy40LTEuOS0yLjItMS44LTMuNi0zLjktNi4yLTMuNi0zLjktNy4zLTIuMi0xMS45IDEtNTcuNCAzNi40LTE0MC4zIDIxLjQtMTQ3LTQzLjMtMy4xLTI5LjMgMTIuNC01Ny4xIDM5LjYtNzEgMzguMi0xOS41IDExMi4yLTExLjggMTE0LTMwLjkgMS4xLTEwLjItMS45LTIwLjEtMTEuMy0yNy4zem0yODYuNyAyMjJjMCAxNS4xLTExLjEgOS45LTE3LjggOS45bC0zOTQuOSAwYy03LjQgMC0xOC4yIDQuOC0xNy44LTEwLjcgLjQtMTMuOSAxMC41LTkuMSAxNy4xLTkuMSAxMzIuMy0uNCAyNjQuNS0uNCAzOTYuOCAwIDYuOCAwIDE2LjYtNC40IDE2LjYgOS45em0zLjgtMzQwLjVsMCAyOTFjMCA1LjctLjcgMTMuOS04LjEgMTMuOS0xMi40LS40LTI3LjUgNy4xLTM2LjEtNS42LTUuOC04LjctNy44LTQtMTIuNC0xLjItNTMuNCAyOS43LTEyOC4xIDcuMS0xNDQuNC04NS4yLTYuMS0zMy40LS43LTY3LjEgMTUuNy0xMDAgMTEuOC0yMy45IDU2LjktNzYuMSAxMzYuMS0zMC41bDAtNzFjMC0yNi4yLS4xLTI2LjIgMjYtMjYuMiAzLjEgMCA2LjYgLjQgOS43IDAgMTAuMS0uOCAxMy42IDQuNCAxMy42IDE0LjMtLjEgLjItLjEgLjMtLjEgLjV6TTQxNy40IDMzNC4xYy0xOS41IDQ3LjYtNzIuOSA0My4zLTkwIDUuMi0xNS4xLTMzLjMtMTUuNS02OC4yIC40LTEwMS41IDE2LjMtMzQuMSA1OS43LTM1LjcgODEuNS00LjggMjAuNiAyOC44IDE0LjkgODQuNiA4LjEgMTAxLjF6TTEyMi42IDM2OS40Yy03LjUtMS4zLTMzLTMuMy0zMy43LTI3LjgtLjQtMTMuOSA3LjgtMjMgMTkuOC0yNS44IDI0LjQtNS45IDQ5LjMtOS45IDczLjctMTQuNyA4LjktMiA3LjQgNC40IDcuOCA5LjUgMS40IDMzLTI2LjEgNTkuMi02Ny42IDU4Ljh6Il0KICAgIH07CiAgICBmYUNyZWF0aXZlQ29tbW9ucyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjcmVhdGl2ZS1jb21tb25zIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyNWUiLCAiTTI1My44IDIxNC45bC0zMy4yIDE3LjNjLTkuNC0xOS42LTI1LjItMTkuOS0yNy41LTE5LjktMjIuMSAwLTMzLjIgMTQuNi0zMy4yIDQzLjggMCAyMy42IDkuMiA0My44IDMzLjIgNDMuOCAxNC41IDAgMjQuNi03LjEgMzAuNi0yMS4zbDMwLjYgMTUuNWMtNi4yIDExLjUtMjUuNyAzOS02NS4xIDM5LTIyLjYgMC03NC0xMC4zLTc0LTc3IDAtNTguNyA0My03Ny4xIDcyLjYtNzcuMSAzMC43IDAgNTIuNyAxMS45IDY2IDM1Ljl6bTE0MyAwbC0zMi44IDE3LjNjLTkuNS0xOS44LTI1LjctMTkuOS0yNy45LTE5LjktMjIuMSAwLTMzLjIgMTQuNi0zMy4yIDQzLjggMCAyMy41IDkuMiA0My44IDMzLjIgNDMuOCAxNC40IDAgMjQuNi03LjEgMzAuNS0yMS4zbDMxIDE1LjVjLTIuMSAzLjgtMjEuNCAzOS02NS4xIDM5LTIyLjcgMC03NC05LjktNzQtNzcgMC01OC43IDQzLTc3LjEgNzIuNi03Ny4xIDMwLjcgMCA1Mi42IDExLjkgNjUuNiAzNS45ek0yNTUuNiA4QzExMi43IDggOCAxMjMuMSA4IDI1Ni4xIDggMzk0LjUgMTIxLjYgNTA0LjEgMjU1LjYgNTA0LjEgMzg1LjUgNTA0LjEgNTA0IDQwMy4yIDUwNCAyNTYuMSA1MDQgMTE4LjIgMzk3LjQgOCAyNTUuNiA4em0uOSA0NTAuOGMtMTEyLjUgMC0yMDMuNy05My0yMDMuNy0yMDIuOCAwLTEwNS40IDg1LjQtMjAzLjMgMjAzLjctMjAzLjMgMTEyLjUgMCAyMDIuOCA4OS41IDIwMi44IDIwMy4zIDAgMTIxLjctOTkuNyAyMDIuOC0yMDIuOCAyMDIuOHoiXQogICAgfTsKICAgIGZhTm90aW9uID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm5vdGlvbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlN2Q5IiwgIk05NC45IDEwMC4yYzE0LjkgMTIuMSAyMC41IDExLjIgNDguNiA5LjNMNDA3LjggOTMuNmM1LjYgMCAuOS01LjYtLjktNi41TDM2Mi45IDU1LjRjLTguNC02LjUtMTkuNi0xNC00MS4xLTEyLjFMNjUuOSA2MS45Yy05LjMgLjktMTEuMiA1LjYtNy41IDkuM2wzNi40IDI4Ljl6bTE1LjkgNjEuNmwwIDI3OC4xYzAgMTQuOSA3LjUgMjAuNSAyNC4zIDE5LjZsMjkwLjUtMTYuOGMxNi44LS45IDE4LjctMTEuMiAxOC43LTIzLjNsMC0yNzYuMmMwLTEyLjEtNC43LTE4LjctMTUtMTcuN0wxMjUuNyAxNDMuMWMtMTEuMiAuOS0xNC45IDYuNS0xNC45IDE4Ljd6bTI4Ni43IDE0LjljMS45IDguNCAwIDE2LjgtOC40IDE3LjhsLTE0IDIuOCAwIDIwNS4zYy0xMi4yIDYuNS0yMy40IDEwLjMtMzIuNyAxMC4zLTE1IDAtMTguNy00LjctMjkuOS0xOC43bC05MS41LTE0My43IDAgMTM5IDI5IDYuNXMwIDE2LjgtMjMuNCAxNi44bC02NC40IDMuN2MtMS45LTMuNyAwLTEzLjEgNi41LTE0LjlsMTYuOC00LjcgMC0xODMuOC0yMy4zLTEuOWMtMS45LTguNCAyLjgtMjAuNSAxNS45LTIxLjVsNjkuMS00LjcgOTUuMyAxNDUuNiAwLTEyOC44LTI0LjMtMi44Yy0xLjktMTAuMyA1LjYtMTcuNyAxNC45LTE4LjdsNjQuNS0zLjh6TTQ0LjQgMzYuN0wzMTAuNiAxNy4xYzMyLjctMi44IDQxLjEtLjkgNjEuNiAxNGw4NSA1OS43YzE0IDEwLjMgMTguNyAxMy4xIDE4LjcgMjQuM2wwIDMyNy42YzAgMjAuNS03LjUgMzIuNy0zMy42IDM0LjVMMTMzLjIgNDk1LjhjLTE5LjYgLjktMjktMS45LTM5LjItMTQuOUwzMS40IDM5OS43Yy0xMS4yLTE0LjktMTUuOS0yNi4xLTE1LjktMzkuMmwwLTI5MS4yYzAtMTYuOCA3LjUtMzAuOCAyOC45LTMyLjd6Il0KICAgIH07CiAgICBmYUNocm9tZWNhc3QgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY2hyb21lY2FzdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmODM4IiwgIk00NDggNjRMNjQuMiA2NGMtMjMuNiAwLTQyLjcgMTkuMS00Mi43IDQyLjdsMCA2My45IDQyLjcgMCAwLTYzLjkgMzgzLjggMCAwIDI5OC42LTE0OS4yIDAgMCA0Mi43IDE0OS40IDBjMjMuNiAwIDQyLjctMTkuMSA0Mi43LTQyLjdsMC0yOTguNkM0OTAuOSA4My4xIDQ3MS42IDY0IDQ0OCA2NHpNMjEuNSAzODMuNmwwIDYzLjkgNjMuOSAwYzAtMzUuMy0yOC42LTYzLjktNjMuOS02My45em0wLTg1bDAgNDIuNGM1OC45IDAgMTA2LjYgNDguMSAxMDYuNiAxMDdsNDIuNyAwYy4xLTgyLjQtNjYuOS0xNDkuMy0xNDkuMy0xNDkuNHpNMjEzLjYgNDQ4bDQyLjcgMEMyNTUuOCAzMTguNSAxNTEgMjEzLjcgMjEuNSAyMTMuNGwwIDQyLjRjMTA2LS4yIDE5MiA4Ni4yIDE5Mi4xIDE5Mi4yeiJdCiAgICB9OwogICAgZmFXaWtpcGVkaWFXID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIndpa2lwZWRpYS13IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYyNjYiLCAiTTY0MCA1MS4ybC0uMyAxMi4yYy0yOC4xIC44LTQ1IDE1LjgtNTUuOCA0MC4zLTI1IDU3LjgtMTAzLjMgMjQwLTE1NS4zIDM1OC42bC0xMy42IDAtODEuOS0xOTMuMWMtMzIuNSA2My42LTY4LjMgMTMwLTk5LjIgMTkzLjEtLjMgLjMtMTUgMC0xNS0uMy00Ni45LTEwOS43LTk2LjEtMjE4LjYtMTQzLjEtMzI4LjYtMTEuNC0yNi43LTQ5LjQtNzAtNzUuNi02OS43IDAtMy4xLS4zLTEwLS4zLTE0LjJsMTYxLjkgMCAwIDEzLjljLTE5LjIgMS4xLTUyLjggMTMuMy00My4zIDM0LjIgMjEuOSA0OS43IDEwMy42IDI0MC4zIDEyNS42IDI4OC42IDE1LTI5LjcgNTcuOC0xMDkuMiA3NS4zLTE0Mi44LTEzLjktMjguMy01OC42LTEzMy45LTcyLjgtMTYwLTkuNy0xNy44LTM2LjEtMTkuNC01NS44LTE5LjdsMC0xMy45IDE0Mi41IC4zIDAgMTMuMWMtMTkuNCAuNi0zOC4xIDcuOC0yOS40IDI2LjEgMTguOSA0MCAzMC42IDY4LjEgNDguMSAxMDQuNyA1LjYtMTAuOCAzNC43LTY5LjQgNDguMS0xMDAuOCA4LjktMjAuNi0zLjktMjguNi0zOC42LTI5LjQgLjMtMy42IDAtMTAuMyAuMy0xMy42IDQ0LjQtLjMgMTExLjEtLjMgMTIzLjEtLjZsMCAxMy42QzQ2Mi40IDY0IDQzOS4xIDc2IDQyNi44IDk0LjlMMzY3LjYgMjE3LjdjNi40IDE2LjEgNjMuMyAxNDIuOCA2OS4yIDE1Ni43TDU1OS4yIDkxLjhjLTguNi0yMy4xLTM2LjQtMjguMS00Ny4yLTI4LjNsMC0xMy45IDEyNy44IDEuMSAuMiAuNXoiXQogICAgfTsKICAgIGZhU2l0cm94ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNpdHJveCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNDRhIiwgIk0yMTIuNCAwbDAgMCAyMzUuNiAwIDAgMTI4LTM4NCAwQzY0IDU3LjYgMTQxLjggLjUgMjEyLjQgMHptMjQuOCAxOTJsMCAwYzY5LjkgLjUgMTQ2LjcgNTcuNiAxNDYuNyAxMjhsLTE3My4yIDAgMCAwQzE0MC45IDMxOS42IDY0IDI2Mi40IDY0IDE5MmwxNzMuMyAwem0tMS43IDMyMGM3MC43LS41IDE0OC40LTU3LjYgMTQ4LjQtMTI4bC0zODQgMCAwIDEyOCAyMzUuNiAwIDAgMHoiXQogICAgfTsKICAgIGZhU3F1YXJlR2l0bGFiID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1naXRsYWIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiZ2l0bGFiLXNxdWFyZSJdLCAiZTVhZSIsICJNMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2em0zMzcuNSAxMi41bDQ0LjYgMTE2LjQgLjQgMS4yYzUuNiAxNi44IDcuMiAzNS4yIDIuMyA1Mi41LTUgMTcuMi0xNS40IDMyLjQtMjkuOCA0My4zbC0uMiAuMS02OC40IDUxLjItNTQuMSA0MC45Yy0uNSAuMi0xLjEgLjUtMS43IC44LTIgMS00LjQgMi02LjcgMi0zIDAtNi44LTEuOC04LjMtMi44bC01NC4yLTQwLjktNjcuOS01MC45LS40LS4zLS4yLS4xYy0xNC4zLTEwLjgtMjQuOC0yNi0yOS43LTQzLjNzLTQuMi0zNS43IDIuMi01Mi41bC41LTEuMiA0NC43LTExNi40Yy45LTIuMyAyLjUtNC4zIDQuNS01LjYgMS42LTEgMy40LTEuNiA1LjItMS44IDEuMy0uNyAyLjEtLjQgMy40IC4xIC42IC4yIDEuMiAuNSAyIC43IDEgLjQgMS42IC45IDIuNCAxLjUgLjYgLjQgMS4yIDEgMi4xIDEuNSAxLjIgMS40IDIuMiAzIDIuNyA0LjhsMjkuMiA5Mi4yIDEyMi45IDAgMzAuMi05Mi4yYy41LTEuOCAxLjQtMy40IDIuNi00LjhzMi44LTIuNCA0LjUtMy4xYzEuNy0uNiAzLjYtLjkgNS40LS43czMuNiAuOCA1LjIgMS44YzIgMS4zIDMuNyAzLjMgNC42IDUuNnoiXQogICAgfTsKICAgIGZhR2l0bGFiU3F1YXJlID0gZmFTcXVhcmVHaXRsYWI7CiAgICBmYVNob2VsYWNlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNob2VsYWNlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU2MGMiLCAiTTQwNS4yIDMzMWMyLjItMS4xIDQuNC0yLjMgNi41LTMuN2w4LjMtNC44YzEuNS0xLjEgNC40LTMuNCA4LjctNi43bC41LS41YzMuNC0zLjQgNy4yLTUgMTEuMy00LjkgMS44IDAgMy45IC41IDYuNCAxLjVsMzEtMjcuNWMuOS0uNyAxLjctMS4zIDIuNi0xLjhsLjIgMGMzLjMtMS45IDYtMS44IDguMiAuNCAzLjkgMi4xIDQuMiA1LjYgLjkgMTAuNkw0NTcuMiAzMjJjLjIgLjUgLjQgMSAuNCAxLjUgLjUgMi4yIC4zIDQuNC0uNSA2LjYtLjcgMS41LTEuOCAyLjktMy4xIDQuMi0xLjQgMS40LTIuNyAyLjgtNC4yIDQuMkw0MzEgMzUyLjJjLTEuNyAxLjItMy40IDIuMy01LjEgMy4zLTIuMSAxLjMtNC4zIDIuNS02LjYgMy42LTEgLjQtMS45IC45LTIuOSAxLjMtNS45IDIuNS0xMS45IDQuMi0xOC4yIDUtMi45IDI0LjUtMTEuMyA0Ny4xLTI1LjEgNjcuOC0xNy41IDI1LjctNDEuNCA0NS40LTcxLjggNTguOC0zMC4yIDEzLjUtNjMgMjAuMi05OC4yIDIwLjItNDguNi0uNS04OC0xMS40LTExOC4yLTMyLjgtMzUuMS0yNS01Mi42LTU3LjktNTIuNi05OS4xbDAtNS42YzEuMi0yOC4xIDkuNS01NC42IDI0LjgtNzkuOCAxNS4xLTI0LjkgMzcuMS00MS43IDY2LjEtNTAuNSAxNC45LTQuNCAyOS45LTYuNiA0NS02LjYgMTUuNSAwIDMxLjYgMi45IDQ4LjEgOC42czM1LjIgMTUuNSA1NS45IDI5LjVsNTQuMSAzNi4zYzE1LjEgOS44IDI4LjggMTYuNSA0MS4yIDIwLTIuNi0yNS4xLTExLjctNDYuNi0yNy4zLTY0LjUtMTUuNy0xOC4xLTM1LjYtMzEuMy01OS45LTM5LjdMMjU3IDIyMGMtMjEuNC03LjUtMzcuMy0xNC45LTQ3LjctMjIuMi0yOC4yLTE5LjEtNDMuOC00NS4yLTQ3LTc4LjVsLS41LTkuOGMwLTMyLjEgMTMtNTguOSAzOS04MC41IDIzLTE5LjMgNTAuNi0yOSA4Mi41LTI5IDI0IDAgNDUuNiA2LjkgNjQuNyAyMC44IDE5LjIgMTQgMzAuMSAzMy44IDMyLjYgNTkuNGwuNSAxMGMwIDE4LjYtNC44IDM0LjUtMTQuNCA0Ny43LTkuOCAxMy4yLTE4LjUgMTkuOS0yNiAxOS45LTEuNi0uMS0zLjEtLjMtNC41LS42bC0zNCAzMmMtNS41IDMtOS4yIDIuNS0xMS4xLTEuNi0xLjktMi4yLTEuOC00LjkgLjUtOC4ybC4yLS4yYy41LS43IDEuMi0xLjUgMi0yLjRsMzEuNi0zMGMtLjQtMS41LS42LTMuMS0uNi00LjggMC00LjEgMS42LTcuNiA0LjktMTAuNCAxMy44LTEyLjQgMjAuOC0yNi43IDIwLjgtNDIuOCAwLTE2LTYuMS0yOS41LTE4LjItNDAuNHMtMjguNy0xNi41LTQ5LjctMTYuOGMtMjYuMiAwLTQ3LjggNy45LTY0LjcgMjMuN1MxOTIuNiA4OS45IDE5Mi42IDExMmMwIDE3LjggNi45IDMzLjkgMjAuNiA0OC4zIDEzLjYgMTQuMiAzNC42IDI1LjQgNjMgMzMuNSAzOS44IDExLjUgNzAuMiAzMSA5MS4zIDU4LjMgMTguNyAyNC4yIDI5LjEgNTEuMyAzMS4zIDgxLjQgMi4yLS43IDQuMy0xLjUgNi41LTIuNmwtLjEgLjF6TTI5NC40IDE3OC43YzAgMS4xIC42IDEuNiAxLjggMS42IC4xIDAgOS43LTguOSAyOC44LTI2LjYgMC0yLjQtNS4xIC45LTE1LjMgMTAtMTAuMiA5LjItMTUuMyAxNC4yLTE1LjMgMTQuOWwwIC4xem04IDYuNGMwLTEtLjUtMS41LTEuNS0xLjUtMS4xIDAtMi4xIC41LTIuOSAxLjYtMS45LS4xLTMuMyAuMS00LjIgLjctLjQgLjItLjUgLjUtLjUgLjcgMCAuNyAuNSAxLjMgMS41IDEuNmwzLjMgMGMyLjktMS4xIDQuNC0yLjIgNC40LTMuM2wtLjEgLjJ6TTMyNSAxNjUuMmMwLTIuOC0xLjYtMi44LTQuOSAwLTEuNiAxLjUtMy42IDMuNS02IDYuMi0uOCAuNi0yLjYgMi4yLTUuMyA0LjktMi44IDIuOS00LjIgNC43LTQuMiA1LjNsLjIgMS4zYy43IC4yIDEuMiAuNCAxLjUgLjQgLjEgMCAzLjMtMi45IDkuNS04LjdzOS4zLTguOSA5LjMtOS4zbC0uMS0uMXptMTU5LjcgMTIwbC0zMC42IDI3YzEuOCAxIDMuMiAyLjQgNCA0LjJsMzAuMi0yN2MuMi0xLjIgLjEtMi4yLS41LTIuOS0uNi0uNS0xLjYtLjktMy4xLTEuM3ptLTEuNi0uOWwtLjctLjctMjcgMjEuOSAxLjYgMiAyNi0yMy4xIC4xLS4xek0zNjYuOSAzNjMuOWMtOC0yLjEtMTUuNC00LjYtMjIuMi03LjUtMTUuMy02LjItMzQuMy0xNy01Ny0zMi40bC0zNy40LTI1LjNjLTE1LjgtMTAuMS0zMC4yLTE3LjYtNDMuMi0yMi42LTEzLjEtNC45LTI2LTcuMy0zOC42LTcuM2wtNS41IDBjLTMyLjIgMS43LTU3LjIgMTMuOC03NSAzNi4yLTE2LjYgMjAuOC0yNSA0NS4zLTI1IDczLjYgMCAzMS44IDEyLjggNTYuNyAzOC4yIDc0LjcgMjUuNCAxOC4xIDYwLjIgMjcuMSAxMDQuNCAyNy4xIDM0LjcgMCA2NC02LjIgODcuOC0xOC42IDIzLjctMTIuNCA0Mi4xLTI4LjggNTUuMi00OS4yIDkuOC0xNS41IDE1LjktMzEuOCAxOC4yLTQ4LjhsLjEgLjF6Il0KICAgIH07CiAgICBmYVNlbGxjYXN0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNlbGxjYXN0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyZGEiLCAiTTM1My41IDMyTDk0LjggMzJDNDIuNyAzMiAuMSA3NC42IC4xIDEyNi42bDAgMjU4LjdDLjEgNDM3LjQgNDIuNyA0ODAgOTQuOCA0ODBsMjU4LjcgMGM1Mi4xIDAgOTQuNy00Mi42IDk0LjctOTQuNmwwLTI1OC44YzAtNTItNDIuNi05NC42LTk0LjctOTQuNnptLTUwIDMxNi40Yy0yNy45IDQ4LjItODkuOSA2NC45LTEzOC4yIDM3LjItMjIuOSAzOS44LTU0LjkgOC42LTQyLjMtMTMuMmwxNS43LTI3LjJjNS45LTEwLjMgMTkuMi0xMy45IDI5LjUtNy45IDE4LjYgMTAuOC0uMS0uMSAxOC41IDEwLjcgMjcuNiAxNS45IDYzLjQgNi4zIDc5LjQtMjEuMyAxNS45LTI3LjYgNi4zLTYzLjQtMjEuMy03OS40LTE3LjgtMTAuMi0uNi0uNC0xOC42LTEwLjYtMjQuNi0xNC4yLTMuNC01MS45IDIxLjYtMzcuNSAxOC42IDEwLjgtLjEtLjEgMTguNSAxMC43IDQ4LjQgMjggNjUuMSA5MC4zIDM3LjIgMTM4LjV6bTIxLjgtMjA4LjhjLTE3IDI5LjUtMTYuMyAyOC44LTE5IDMxLjUtNi41IDYuNS0xNi4zIDguNy0yNi41IDMuNi0xOC42LTEwLjggLjEgLjEtMTguNS0xMC43LTI3LjYtMTUuOS02My40LTYuMy03OS40IDIxLjNzLTYuMyA2My40IDIxLjMgNzkuNGMwIDAgMTguNSAxMC42IDE4LjYgMTAuNiAyNC42IDE0LjIgMy40IDUxLjktMjEuNiAzNy41LTE4LjYtMTAuOCAuMSAuMS0xOC41LTEwLjctNDguMi0yNy44LTY0LjktOTAuMS0zNy4xLTEzOC40IDI3LjktNDguMiA4OS45LTY0LjkgMTM4LjItMzcuMmw0LjgtOC40YzE0LjMtMjQuOSA1Mi0zLjMgMzcuNyAyMS41eiJdCiAgICB9OwogICAgZmFNaXggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibWl4IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzY2IiLCAiTTAgNjRMMCA0MTIuOWMwIDU2LjIgODggNTguMSA4OCAwbDAtMjM4LjZjNy45LTUyLjkgODgtNTAuNCA4OCA2LjVsMCAxNzUuM2MwIDU3LjkgOTYgNTggOTYgMEwyNzIgMjQwYzUuMy01NC43IDg4LTUyLjUgODggNC4zbDAgMjMuOGMwIDU5LjkgODggNTYuNiA4OCAwTDQ0OCA2NCAwIDY0eiJdCiAgICB9OwogICAgZmFDY0FwcGxlUGF5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNjLWFwcGxlLXBheSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNDE2IiwgIk0zMDIuMiAyMTguNGMwIDE3LjItMTAuNSAyNy4xLTI5IDI3LjFsLTI0LjMgMCAwLTU0LjIgMjQuNCAwYzE4LjQgMCAyOC45IDkuOCAyOC45IDI3LjF6TTM0OS43IDI4MWMwIDguMyA3LjIgMTMuNyAxOC41IDEzLjcgMTQuNCAwIDI1LjItOS4xIDI1LjItMjEuOWwwLTcuNy0yMy41IDEuNWMtMTMuMyAuOS0yMC4yIDUuOC0yMC4yIDE0LjR6TTU3NiA3OWwwIDM1MmMwIDI2LjUtMjEuNSA0OC00OCA0OEw0OCA0NzljLTI2LjUgMC00OC0yMS41LTQ4LTQ4TDAgNzlDMCA1Mi41IDIxLjUgMzEgNDggMzFsNDgwIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDh6TTEyNy44IDE5Ny4yYzguNCAuNyAxNi44LTQuMiAyMi4xLTEwLjQgNS4yLTYuNCA4LjYtMTUgNy43LTIzLjctNy40IC4zLTE2LjYgNC45LTIxLjkgMTEuMy00LjggNS41LTguOSAxNC40LTcuOSAyMi44em02MC42IDc0LjVjLS4yLS4yLTE5LjYtNy42LTE5LjgtMzAtLjItMTguNyAxNS4zLTI3LjcgMTYtMjguMi04LjgtMTMtMjIuNC0xNC40LTI3LjEtMTQuNy0xMi4yLS43LTIyLjYgNi45LTI4LjQgNi45LTUuOSAwLTE0LjctNi42LTI0LjMtNi40LTEyLjUgLjItMjQuMiA3LjMtMzAuNSAxOC42LTEzLjEgMjIuNi0zLjQgNTYgOS4zIDc0LjQgNi4yIDkuMSAxMy43IDE5LjEgMjMuNSAxOC43IDkuMy0uNCAxMy02IDI0LjItNiAxMS4zIDAgMTQuNSA2IDI0LjMgNS45IDEwLjItLjIgMTYuNS05LjEgMjIuOC0xOC4yIDYuOS0xMC40IDkuOC0yMC40IDEwLTIxem0xMzUuNC01My40YzAtMjYuNi0xOC41LTQ0LjgtNDQuOS00NC44bC01MS4yIDAgMCAxMzYuNCAyMS4yIDAgMC00Ni42IDI5LjMgMGMyNi44IDAgNDUuNi0xOC40IDQ1LjYtNDV6bTkwIDIzLjdjMC0xOS43LTE1LjgtMzIuNC00MC0zMi40LTIyLjUgMC0zOS4xIDEyLjktMzkuNyAzMC41bDE5LjEgMGMxLjYtOC40IDkuNC0xMy45IDIwLTEzLjkgMTMgMCAyMC4yIDYgMjAuMiAxNy4ybDAgNy41LTI2LjQgMS42Yy0yNC42IDEuNS0zNy45IDExLjYtMzcuOSAyOS4xIDAgMTcuNyAxMy43IDI5LjQgMzMuNCAyOS40IDEzLjMgMCAyNS42LTYuNyAzMS4yLTE3LjRsLjQgMCAwIDE2LjQgMTkuNiAwIDAtNjggLjEgMHpNNTE2IDIxMC45bC0yMS41IDAtMjQuOSA4MC42LS40IDAtMjQuOS04MC42LTIyLjMgMCAzNS45IDk5LjMtMS45IDZjLTMuMiAxMC4yLTguNSAxNC4yLTE3LjkgMTQuMi0xLjcgMC00LjktLjItNi4yLS4zbDAgMTYuNGMxLjIgLjQgNi41IC41IDguMSAuNSAyMC43IDAgMzAuNC03LjkgMzguOS0zMS44TDUxNiAyMTAuOXoiXQogICAgfTsKICAgIGZhQnJhdmUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYnJhdmUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTYzYyIsICJNMTQ1LjYgMGwxNTcgMCA0NC43IDUwLjhzMzkuMy0xMC45IDU3LjggNy42IDMzLjggMzQuOSAzMy44IDM0LjlsLTEyIDI5LjUgMTUuMyA0My43cy00NC45IDE3MC4yLTUwLjEgMTkxYy0xMC40IDQwLjktMTcuNCA1Ni44LTQ2LjkgNzcuNXMtODIuOSA1Ni44LTkxLjYgNjIuMmMtMS45IDEuMi0zLjkgMi41LTUuOSAzLjktNy41IDUuMS0xNS44IDEwLjgtMjMuNSAxMC44cy0xNi4xLTUuNy0yMy41LTEwLjhjLTItMS40LTQtMi44LTUuOS0zLjktOC43LTUuNS02Mi4xLTQxLjUtOTEuNi02Mi4ycy0zNi41LTM2LjYtNDYuOS03Ny41Yy01LjMtMjAuOC01MC4xLTE5MS01MC4xLTE5MUwyMS41IDEyMi44IDkuMyA5My4zczE1LjMtMTYuNCAzMy44LTM0LjkgNTcuOC03LjYgNTcuOC03LjZMMTQ1LjYgMHptNzguNSA0MDcuNmMzLjcgMCA4LjktNC43IDEzLTguNCAuNi0uNSAxLjItMS4xIDEuNy0xLjUgNC4yLTMuNyA0Ny44LTM3LjUgNTEtMzkuOHM1LjQtNi41IDEuOS04LjdjLTIuOC0xLjctMTAtNS41LTIwLjMtMTAuOC0zLTEuNi02LjMtMy4yLTkuNy01LTE1LjQtOC0zNC41LTE0LjctMzcuNS0xNC43cy0yMi4xIDYuOC0zNy41IDE0LjdjLTMuNSAxLjgtNi43IDMuNS05LjcgNS0xMC4zIDUuMy0xNy42IDkuMS0yMC4zIDEwLjgtMy42IDIuMi0xLjQgNi40IDEuOSA4LjdzNDYuOCAzNi4xIDUxIDM5LjhjLjUgLjUgMS4xIDEgMS43IDEuNSA0LjEgMy43IDkuMyA4LjQgMTMgOC40bC0uMiAwem0wLTE2NS43YzQuNyAwIDE3LjYtMyAyNi40LTVsMi0uNWM3LjgtMS44IDcuMy02LjMgNi40LTEzLS4xLS44LS4yLTEuNi0uMy0yLjQtLjYtNi4xLTUuOC0zMy4xLTkuMS01MC4zLTEuMS01LjgtMi0xMC41LTIuNC0xMi45LTEuNS04LjEtLjYtOS40IC43LTExLjMgLjItLjMgLjUtLjcgLjctMS4xIDEuNC0yLjMgMTYtNi4yIDI3LjktOS41IDIuNS0uNyA0LjgtMS4zIDYuOS0xLjkgMTAuNi0zIDMyLjQtLjYgNDQuMiAuNiAxLjggLjIgMy40IC40IDQuNyAuNSA5LjYgLjkgMTAuNCAyLjMgNy4yIDMuOC0yLjMgMS4xLTE2LjIgNi4zLTI4LjcgMTAuOS00LjcgMS44LTkuMiAzLjUtMTIuOCA0LjgtMS41IC41LTMgMS4xLTQuNSAxLjctMTIuNSA0LjYtMjcuMiAxMC0yOC45IDE5LjQtMS41IDguMyA1LjIgMTkuOSAxMS4zIDMwLjMgMS42IDIuOCAzLjIgNS41IDQuNiA4LjEgNi4zIDExLjkgNi41IDEzLjMgNi4xIDE4LjEtLjQgMy45LTE0LjUgMTIuNy0yMi40IDE3LjYtMS44IDEuMS0zLjMgMi4xLTQuMiAyLjctLjggLjUtMi4xIDEuNC0zLjggMi40LTguNiA1LjItMjYuMyAxNi0yNi4zIDIyLjUgMCA3LjggMjQuNiAyOC4xIDMyLjQgMzMuMnMyOC45IDE2LjEgMzcuOSAxNy44IDIzLTguNSAzMS4yLTIzLjhjNy43LTE0LjQgMS43LTI4LjUtMy4yLTQwbC0uOS0yLjJjLTQuNS0xMC42IDEuOS0xNyA2LjItMjEuMyAuNS0uNSAxLTEgMS40LTEuNGw0My00NS43YzEuMy0xLjMgMi41LTIuNiAzLjctMy44IDUuOC01LjcgMTAuOC0xMC41IDEwLjgtMjIuOCAwLTE0LjktNTcuNS04NC41LTU3LjUtODQuNXMtNDguNSA5LjMtNTUuMSA5LjNjLTUuMiAwLTE1LjMtMy41LTI1LjgtNy4xLTIuNy0uOS01LjQtMS45LTgtMi43LTEzLTQuMy0yMS44LTQuNC0yMS44LTQuNHMtOC43IDAtMjEuOCA0LjRjLTIuNyAuOS01LjQgMS44LTggMi43LTEwLjUgMy42LTIwLjYgNy4xLTI1LjggNy4xLTYuNSAwLTU1LjEtOS4zLTU1LjEtOS4zcy01Ny41IDY5LjYtNTcuNSA4NC41YzAgMTIuMyA0LjkgMTcuMSAxMC44IDIyLjggMS4yIDEuMiAyLjUgMi40IDMuNyAzLjhsNDMuMSA0NS44Yy40IC41IC45IC45IDEuNCAxLjQgNC4zIDQuMyAxMC42IDEwLjcgNi4yIDIxLjNsLS45IDIuMmMtNC45IDExLjUtMTEgMjUuNi0zLjIgNDAgOC4yIDE1LjMgMjIuMiAyNS41IDMxLjIgMjMuOHMzMC4xLTEyLjcgMzcuOS0xNy44IDMyLjQtMjUuNCAzMi40LTMzLjJjMC02LjUtMTcuNy0xNy4zLTI2LjMtMjIuNS0xLjctMS0zLjEtMS45LTMuOC0yLjQtLjktLjYtMi40LTEuNS00LjItMi43LTcuOS00LjktMjItMTMuNy0yMi40LTE3LjYtLjQtNC44LS4zLTYuMiA2LjEtMTguMSAxLjMtMi41IDIuOS01LjMgNC42LTguMSA2LTEwLjQgMTIuOC0yMiAxMS4zLTMwLjMtMS43LTkuNC0xNi40LTE0LjgtMjguOS0xOS40LTEuNi0uNi0zLjEtMS4xLTQuNS0xLjctMy42LTEuNC04LjEtMy4xLTEyLjgtNC44bC0uMSAwYy0xMi41LTQuNy0yNi40LTkuOS0yOC43LTEwLjktMy4yLTEuNS0yLjMtMi44IDcuMi0zLjggMS4zLS4xIDIuOS0uMyA0LjctLjUgMTEuOC0xLjMgMzMuNi0zLjYgNDQuMi0uNiAyLjEgLjYgNC40IDEuMiA2LjkgMS45IDExLjkgMy4yIDI2LjUgNy4yIDI3LjkgOS41IC4yIC40IC41IC43IC43IDEuMSAxLjMgMS45IDIuMiAzLjIgLjcgMTEuMy0uNCAyLjQtMS4zIDcuMS0yLjQgMTIuOS0zLjMgMTcuMi04LjUgNDQuMi05LjEgNTAuMy0uMSAuOC0uMiAxLjctLjMgMi40LS44IDYuNy0xLjQgMTEuMiA2LjQgMTNsMiAuNWM4LjggMiAyMS44IDUgMjYuNCA1bDAtLjF6Il0KICAgIH07CiAgICBmYUV0c3kgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZXRzeSIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMmQ3IiwgIk0zODQgMzQ4Yy0xLjggMTAuNy0xMy44IDExMC0xNS41IDEzMi0xMTcuOS00LjMtMjE5LjktNC43LTM2OC41IDBsMC0yNS41YzQ1LjUtOC45IDYwLjYtOCA2MS0zNS4yIDEuOC03Mi4zIDMuNS0yNDQuMSAwLTMyMi0xLTI4LjUtMTIuMS0yNi44LTYxLTM2TDAgMzUuOGM3My45IDIuNCAyNTUuOSA4LjYgMzYzLTMuOC0zLjUgMzguMi03LjggMTI2LjUtNy44IDEyNi41bC0yMy4yIDBDMzIwLjkgMTE1LjcgMzEzLjIgNjggMjc3LjMgNjhsLTEzNyAwYy0xMC4yIDAtMTAuNyAzLjUtMTAuNyA5LjhsMCAxNjMuOGM1OCAuNSA4OC41LTIuNSA4OC41LTIuNSAyOS44LTEgMjcuNi04LjUgNDAuNy02NS4zbDI1LjggMGMtNC40IDEwMS40LTMuOSA2MS44LTEuOCAxNjAuM0wyNTcgMzM0Yy05LjItNDAuMS05LjEtNjEtMzkuNS02MS41IDAgMC0yMS41LTItODgtMmwwIDEzOWMwIDI2IDE0LjMgMzguMyA0NC4zIDM4LjNsODkuMyAwYzYzLjYgMCA2Ni42LTI1IDk4LjctOTkuOGwyMi4yIDB6Il0KICAgIH07CiAgICBmYUJ0YyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJidGMiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjE1YSIsICJNMzEwLjQgMjQyLjZjMjcuNy0xNC4yIDQ1LjQtMzkuNCA0MS4zLTgxLjMtNS40LTU3LjQtNTIuNS03Ni42LTExNC44LTgxLjlsMC03OS40LTQ4LjUgMCAwIDc3LjJjLTEyLjYgMC0yNS41IC4zLTM4LjQgLjZsMC03Ny44LTQ4LjUgMCAwIDc5LjRjLTE3LjggLjUtMzguNiAuMy05Ny40IDBsMCA1MS43YzM4LjMtLjcgNTguNC0zLjEgNjMgMjEuNGwwIDIxNy40Yy0yLjkgMTkuNS0xOC41IDE2LjctNTMuMyAxNi4xTDQgNDQzLjdjODguNSAwIDk3LjQgLjMgOTcuNCAuM2wwIDY4IDQ4LjUgMCAwLTY3LjFjMTMuMiAuMyAyNi4yIC4zIDM4LjQgLjNsMCA2Ni43IDQ4LjUgMCAwLTY4YzgxLjMtNC40IDEzNS42LTI0LjkgMTQyLjktMTAxLjUgNS43LTYxLjQtMjMuMy04OC45LTY5LjMtOTkuOXpNMTUwLjggMTM0LjZjMjcuNCAwIDExMy4xLTguNSAxMTMuMSA0OC41IDAgNTQuNS04NS43IDQ4LjItMTEzLjEgNDguMmwwLTk2Ljd6bTAgMjUxLjhsMC0xMDYuNWMzMi44IDAgMTMzLjEtOS4xIDEzMy4xIDUzLjMgMCA2MC4yLTEwMC40IDUzLjMtMTMzLjEgNTMuM3oiXQogICAgfTsKICAgIGZhQWRuID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImFkbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMTcwIiwgIk0yNTYgMTY3LjVsNjQuOSA5OC44LTEyOS44IDAgNjQuOS05OC44ek04IDI1NmEyNDggMjQ4IDAgMSAxIDQ5NiAwIDI0OCAyNDggMCAxIDEgLTQ5NiAwem0zOTYuMiA4Mi43bC0xNDguMi0yMjMuMi0xNDguMiAyMjMuMiAzMC40IDAgMzMuNi01MS43IDE2OC42IDAgMzMuNiA1MS43IDMwLjIgMHoiXQogICAgfTsKICAgIGZhU3F1YXJlWFR3aXR0ZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXgtdHdpdHRlciIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNjFhIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyem0yOTcuMSA4NGwtMTAzLjggMTE4LjYgMTIyLjEgMTYxLjQtOTUuNiAwLTc0LjgtOTcuOS04NS43IDk3LjktNDcuNSAwIDExMS0xMjYuOS0xMTcuMS0xNTMuMSA5OCAwIDY3LjcgODkuNSA3OC4yLTg5LjUgNDcuNSAwek0zMjMuMyAzNjcuNmwtMTY5LjktMjI0LjctMjguMyAwIDE3MS44IDIyNC43IDI2LjQgMHoiXQogICAgfTsKICAgIGZhU3F1YXJlRm9udEF3ZXNvbWUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLWZvbnQtYXdlc29tZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNWFkIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyem05MCAxMjJjMCA5LjMtNC44IDE3LjQtMTIuMSAyMmwxODguOSAwYzcuMyAwIDEzLjIgNS45IDEzLjIgMTMuMiAwIDEuOC0uNCAzLjctMS4xIDUuNEwzMTIgMjY0IDM0Mi45IDMzMy40Yy43IDEuNyAxLjEgMy41IDEuMSA1LjQgMCA3LjMtNS45IDEzLjItMTMuMiAxMy4ybC0xODYuOCAwIDAgMzItMzIgMCAwLTIwOS41Yy02LjEtNC44LTEwLTEyLjItMTAtMjAuNSAwLTE0LjQgMTEuNi0yNiAyNi0yNnMyNiAxMS42IDI2IDI2eiJdCiAgICB9OwogICAgZmFGb3J1bWJlZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmb3J1bWJlZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMjExIiwgIk01LjggMzA5LjdDMiAyOTIuNyAwIDI3NS41IDAgMjU4LjMgMCAxMzUgOTkuOCAzNSAyMjMuMSAzNSAyMzkuNyAzNSAyNTYuNCAzNyAyNzIuNCA0MC41IDE0OSA4Ny41IDUxLjkgMTg2IDUuOCAzMDkuN3pNMzk4LjcgMTIwLjVjLTEzLjctMTcuNS0yOS43LTMyLjctNDcuOC00NS4zLTE0OS42IDQ0LjMtMjY2LjMgMTYyLjEtMzA5LjcgMzEyIDEyLjUgMTguMSAyOCAzNS42IDQ1LjIgNDkgNDMuMS0xNTEuMyAxNjEuMi0yNzEuNyAzMTIuMy0zMTUuN3ptMTUuOCAyNTIuN2MxNS4yLTI1LjEgMjUuNC01My43IDI5LjUtODIuOC03OS40IDQyLjktMTQ1IDExMC42LTE4Ny42IDE5MC4zIDMwLTQuNCA1OC45LTE1LjMgODQuNi0zMS4zIDM1IDEzLjEgNzAuOSAyNC4zIDEwNyAzMy42LTkuMy0zNi41LTIwLjQtNzQuNS0zMy41LTEwOS44em0yOS43LTE0NS41Yy0yLjYtMTkuNS03LjktMzguNy0xNS44LTU2LjgtMTM3LjkgNDUuOC0yNDYuNCAxNTYuNi0yOTEuMyAyOTUuMSAxOC4xIDcuNiAzNyAxMi41IDU2LjYgMTUuMiA0Ni4zLTExNC4xIDEzNi44LTIwNi44IDI1MC41LTI1My41eiJdCiAgICB9OwogICAgZmE0Mkdyb3VwID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIjQyLWdyb3VwIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbImlubm9zb2Z0Il0sICJlMDgwIiwgIk0zMjAgOTZsMCAzMjBjMjEgMCA0MS44LTQuMSA2MS4yLTEyLjJzMzctMTkuOCA1MS45LTM0LjcgMjYuNi0zMi41IDM0LjctNTEuOSAxMi4yLTQwLjIgMTIuMi02MS4yLTQuMS00MS44LTEyLjItNjEuMi0xOS44LTM3LjEtMzQuNy01MS45LTMyLjUtMjYuNi01MS45LTM0LjctNDAuMi0xMi4yLTYxLjItMTIuMnpNMCAyNTZMMTYwIDQxNiAzMjAgMjU2IDE2MCA5NiAwIDI1NnptNDgwIDBjMCAyMSA0LjEgNDEuOCAxMi4yIDYxLjJzMTkuOCAzNyAzNC43IDUxLjkgMzIuNSAyNi42IDUxLjkgMzQuNyA0MC4yIDEyLjIgNjEuMiAxMi4ybDAtMzIwYy00Mi40IDAtODMuMSAxNi45LTExMy4xIDQ2LjlTNDgwIDIxMy42IDQ4MCAyNTZ6Il0KICAgIH07CiAgICBmYUlubm9zb2Z0ID0gZmE0Mkdyb3VwOwogICAgZmFTdHVtYmxldXBvbkNpcmNsZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzdHVtYmxldXBvbi1jaXJjbGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjFhMyIsICJNMjY0IDhhMjQ4IDI0OCAwIDEgMCAwIDQ5NiAyNDggMjQ4IDAgMSAwIDAtNDk2em0wIDE3Ny41Yy05LjggMC0xNy44IDgtMTcuOCAxNy44bDAgMTA2LjljMCA0MC45LTMzLjkgNzMuOS03NC45IDczLjktNDEuNCAwLTc0LjktMzMuNS03NC45LTc0LjlsMC00Ni41IDU3LjMgMCAwIDQ1LjhjMCAxMCA4IDE3LjggMTcuOCAxNy44czE3LjgtNy45IDE3LjgtMTcuOGwwLTEwOC40YzAtNDAgMzQuMi03Mi4xIDc0LjctNzIuMSA0MC43IDAgNzQuNyAzMi4zIDc0LjcgNzIuNmwwIDIzLjctMzQuMSAxMC4xLTIyLjktMTAuNyAwLTIwLjZjLjEtOS42LTcuOS0xNy42LTE3LjctMTcuNnpNNDMxLjYgMzA5LjFjMCA0MS40LTMzLjUgNzQuOS03NC45IDc0LjktNDEuMiAwLTc0LjktMzMuMi03NC45LTc0LjJsMC00Ni44IDIyLjkgMTAuNyAzNC4xLTEwLjEgMCA0Ny4xYzAgOS44IDggMTcuNiAxNy44IDE3LjZzMTcuOC03LjkgMTcuOC0xNy42bDAtNDggNTcuMyAwYy0uMSA0NS45LS4xIDQ2LjQtLjEgNDYuNHoiXQogICAgfTsKICAgIGZhU3ltZm9ueSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzeW1mb255IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY4M2QiLCAiTTI1NiA4YTI0OCAyNDggMCAxIDAgMCA0OTYgMjQ4IDI0OCAwIDEgMCAwLTQ5NnpNMzg5LjcgMTUxLjVjLTExLjUgLjQtMTkuNC02LjQtMTkuOC0xNi45LS4zLTkuMiA2LjctMTMuNCA2LjUtMTguOS0uMi02LjUtMTAuMi02LjgtMTIuOS02LjctMzkuOCAxLjMtNDguNiA1Ny01OC45IDExMy44IDIxLjQgMy4yIDM2LjYtLjcgNDUuMS02LjIgMTItNy43LTMuMy0xNS43LTEuNC0yNC42IDQtMTguMiAzMi42LTE5IDMyIDUuMy0uNCAxNy45LTI1LjkgNDEuOC03Ny42IDM1LjctMTAuOCA1OS41LTE4LjQgMTE1LTU4LjIgMTYxLjctMjkgMzQuNS01OC40IDM5LjgtNzEuNiA0MC4zLTI0LjYgLjktNDEtMTIuMy00MS42LTI5LjgtLjYtMTcgMTQuNC0yNi4zIDI0LjMtMjYuNiAyMS45LS44IDMwLjEgMjUuNyAxNC45IDM0LTEyLjEgOS43IC4xIDEyLjYgMi4xIDEyLjYgMTAuNC0uNCAxNy4zLTUuNSAyMi4yLTkgMjQtMjAgMzMuMi01NC45IDQ1LjQtMTE4LjMgOC4yLTQ5LjcgMTctNzggMTguMi04Mi0xNi45LTEyLjctMjcuMS0yOC42LTQ5LjgtMzQuNy0xNS42LTQuMi0yNS4xLS42LTMxLjggNy44LTcuOSAxMC01LjMgMjMgMi40IDMwLjdsMTIuNiAxNGMxNS41IDE3LjkgMjQgMzEuOSAyMC44IDUwLjYtNS4xIDI5LjktNDAuNyA1Mi45LTgyLjkgMzkuOS0zNi0xMS4xLTQyLjctMzYuNi0zOC40LTUwLjYgNy41LTI0LjIgNDIuNC0xMS43IDM0LjYgMTMuNi0yLjggOC42LTQuOSA4LjctNi4zIDEzLjEtNC42IDE0LjggNDEuOCAyOC40IDUxLTEuNCA0LjUtMTQuNS01LjMtMjEuNy0yMi4yLTM5LjktMjguNS0zMS43LTE2LTY1LjUgMi45LTc5LjcgNTIuOC0zOS40IDEwMC41IDE3LjUgMTEwLjYgMjUuOCAzNy4yLTEwOSAxMDAuNS0xMDUuNSAxMDIuNC0xMDUuNSAyNS4yLS44IDQ0LjIgMTAuNiA0NC44IDI4LjYgLjIgNy43LTQuMiAyMi42LTE5LjUgMjMuMXoiXQogICAgfTsKICAgIGZhU2FsZXNmb3JjZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzYWxlc2ZvcmNlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY4M2IiLCAiTTI0OS40IDI0NS42bC0yNi40IDBjLjctNS4yIDMuMy0xNC4xIDEzLjYtMTQuMSA2LjggMCAxMiAzLjggMTIuNyAxNC4xek0zODYgMjMxLjhjLS41IDAtMTQuMS0xLjgtMTQuMSAyMHMxMy42IDIwIDE0LjEgMjBjMTMgMCAxNC4xLTEzLjUgMTQuMS0yMCAwLTIxLjgtMTMuNy0yMC0xNC4xLTIwek0xNDIuOCAyNTUuNWMtMS4xIC45LTIgMi0yLjUgMy4ycy0uOCAyLjctLjcgNGMwIDQuOCAyLjEgNi4xIDMuMyA3IDQuNyAzLjcgMTUuMSAyLjEgMjAuOSAxbDAtMTYuOWMtNS4zLTEuMS0xNi43LTItMjAuOSAxLjZ6TTY0MC41IDIzMmMwIDg3LjYtODAgMTU0LjQtMTY1LjQgMTM2LjQtMTguNCAzMy03MC43IDcwLjgtMTMyLjIgNDEuNi00MS4yIDk2LTE3Ny45IDkyLjItMjEzLjgtNS4yLTExOS43IDIzLjktMTc4LjgtMTM4LjQtNzUuMy0xOTkuMy0zNC44LTc5LjQgMjIuNi0xNzMuNiAxMTQuMy0xNzMuNiAxOS4xIDAgMzcuOSA0LjQgNTUgMTIuOXMzMiAyMC43IDQzLjYgMzUuOGMyMC43LTIxLjQgNDkuNC0zNC44IDgxLjEtMzQuOCA0Mi4zIDAgNzkgMjMuNSA5OC44IDU4LjYgOTIuOC00MC43IDE5My44IDI4LjIgMTkzLjggMTI3LjV6TTEyMC45IDI2My44YzAtMTEuOC0xMS43LTE1LjItMTcuOS0xNy4yLTUuMy0yLjEtMTMuNC0zLjUtMTMuNC04LjkgMC05LjUgMTctNi43IDI1LjItMi4xIDAgMCAxLjIgLjcgMS42LS41IC4yLS43IDIuNC02LjYgMi42LTcuMyAuMS0uMyAuMS0uNi0uMS0uOHMtLjQtLjUtLjYtLjZjLTEyLjMtNy42LTQwLjctOC41LTQwLjcgMTIuNyAwIDEyLjUgMTEuNSAxNS40IDE3LjkgMTcuMiA0LjcgMS42IDEzLjIgMyAxMy4yIDguNyAwIDQtMy41IDcuMS05LjIgNy4xLTYuOSAwLTEzLjUtMi4yLTE5LTYuMy0uNS0uMi0xLjQtLjctMS42IC43bC0yLjQgNy41Yy0uNSAuOSAuMiAxLjIgLjIgMS40IDEuOCAxLjQgMTAuMyA2LjYgMjIuOCA2LjYgMTMuMiAwIDIxLjQtNy4xIDIxLjQtMTguMWwwIDB6bTMyLTQyLjZjLTEwLjEgMC0xOC43IDMuMi0yMS40IDUuMi0uMSAuMS0uMiAuMi0uMyAuM3MtLjEgLjItLjEgLjQgMCAuMyAwIC40IC4xIC4zIC4yIC40bDIuNiA3LjFjLjEgLjIgLjIgLjUgLjUgLjZzLjUgLjIgLjcgLjFjLjYgMCA2LjgtNCAxNi45LTQgNCAwIDcuMSAuNyA5LjIgMi40IDMuNiAyLjggMy4xIDguMyAzLjEgMTAuNi00LjgtLjMtMTkuMS0zLjQtMjkuNCAzLjgtMi4zIDEuNi00LjMgMy44LTUuNSA2LjNzLTEuOSA1LjQtMS44IDguMmMwIDUuOSAxLjUgMTAuNCA2LjYgMTQuNCAxMi4yIDguMiAzNi4zIDIgMzguMSAxLjQgMS42LS4zIDMuNS0uNyAzLjUtMS45bDAtMzMuOWMwLTQuNiAuMy0yMS42LTIyLjgtMjEuNmwwIC4xem00Ni42LTIxYzAtLjIgMC0uMy0uMS0uNXMtLjEtLjMtLjMtLjQtLjItLjItLjQtLjMtLjMtLjEtLjUtLjFsLTkuOCAwYy0uMiAwLS4zIDAtLjUgLjFzLS4zIC4xLS40IC4zLS4yIC4yLS4zIC40LS4xIC4zLS4xIC41bDAgNzljMCAuMiAwIC4zIC4xIC41cy4xIC4zIC4zIC40IC4yIC4yIC40IC4zIC4zIC4xIC41IC4xbDkuOSAwYy4yIDAgLjMgMCAuNS0uMXMuMy0uMSAuNC0uMyAuMi0uMiAuMy0uNCAuMS0uMyAuMS0uNWwtLjEtNzl6bTU1LjcgMjguOWMtMi4xLTIuMy02LjgtNy41LTE3LjYtNy41LTMuNSAwLTE0LjIgLjItMjAuNyA4LjktNi40IDcuNi02LjYgMTguMS02LjYgMjEuNCAwIDMuMSAuMiAxNC4zIDcuMSAyMS4yIDIuNiAyLjkgOS4xIDguMiAyMi44IDguMiAxMC44IDAgMTYuNS0yLjMgMTguNi0zLjggLjUtLjIgLjctLjcgLjItMS45bC0yLjMtNi44Yy0uMS0uMy0uMy0uNS0uNi0uNnMtLjUtLjItLjgtLjFjLTIuNiAuOS02LjMgMi44LTE1LjMgMi44LTE3LjQgMC0xNi44LTE0LjctMTYuOS0xNi43bDM3LjIgMGMuMyAwIC41LS4xIC43LS4zcy40LS40IC40LS43Yy0uMyAwIDIuMS0xNC43LTYuMS0yNC4ybDAgMHptMzYuNyA1Mi43YzEzLjIgMCAyMS40LTcuMSAyMS40LTE4LjEgMC0xMS44LTExLjctMTUuMi0xNy45LTE3LjItNC4xLTEuNy0xMy40LTMuNC0xMy40LTguOSAwLTMuOCAzLjMtNi40IDguNS02LjQgNS44IC4xIDExLjUgMS42IDE2LjcgNC4yIDAgMCAxLjIgLjcgMS42LS41IC4yLS43IDIuNC02LjYgMi42LTcuMyAuMS0uMyAuMS0uNi0uMS0uOHMtLjQtLjUtLjYtLjZjLTcuOS00LjktMTYuNy00LjktMjAuMi00LjktMTIgMC0yMC41IDcuMy0yMC41IDE3LjYgMCAxMi41IDExLjUgMTUuNCAxNy45IDE3LjIgNi4xIDIgMTMuMiAzLjMgMTMuMiA4LjcgMCA0LTMuNSA3LjEtOS4yIDcuMS02LjkgMC0xMy41LTIuMi0xOS02LjQtLjEtLjEtLjMtLjItLjUtLjJzLS40IDAtLjUgLjEtLjMgLjItLjQgLjMtLjIgLjMtLjIgLjVsLTIuMyA3LjVjLS41IC45IC4yIDEuMiAuMiAxLjQgMS43IDEuNCAxMC4zIDYuNiAyMi44IDYuNmwwIDB6TTM1Ny42IDIyNGMwLS43LS4yLTEuMi0xLjItMS4ybC0xMS44IDBjMC0uMSAuOS04LjkgNC41LTEyLjUgNC4yLTQuMiAxMS44LTEuNiAxMi0xLjYgMS4yIC41IDEuNCAwIDEuNi0uNWwyLjgtNy44Yy43LS45IDAtMS4yLS4yLTEuNC01LjEtMi0xNy40LTIuOS0yNC41IDQuMi01LjUgNS41LTcgMTMuOS04IDE5LjVsLTguNSAwYy0uMyAwLS42IC4yLS44IC40cy0uMyAuNS0uNCAuOGwtMS40IDcuOGMwIC43IC4yIDEuMiAxLjIgMS4ybDguMiAwYy04LjUgNDcuOS04LjcgNTAuMi0xMC4zIDU1LjUtMS4xIDMuNi0zLjMgNi45LTUuOSA3LjgtLjEgMC0zLjkgMS43LTkuNi0uMiAwIDAtLjktLjUtMS40IC43LS4yIC43LTIuNiA2LjgtMi44IDcuNXMwIDEuNCAuNSAxLjRjNS4xIDIgMTMgMS44IDE3LjkgMCA2LjMtMi4zIDkuNy03LjkgMTEuNS0xMi45IDIuOC03LjcgMi44LTkuOCAxMS44LTU5LjdsMTIuMiAwYy4zIDAgLjYtLjIgLjgtLjRzLjMtLjUgLjQtLjhsMS40LTcuOHpNNDExIDI0MGMtLjYtMS43LTUuMS0xOC4xLTI1LjItMTguMS0xNS4yIDAtMjMgMTAtMjUuMiAxOC4xLTEgMy0zLjIgMTQgMCAyMy41IC4xIC4zIDQuNCAxOC4xIDI1LjIgMTguMSAxNSAwIDIyLjktOS42IDI1LjItMTguMSAzLjItOS42IDEtMjAuNSAwLTIzLjV6bTQ1LjQtMTYuN2MtNS0xLjctMTYuNi0xLjktMjIuMSA1LjRsMC00LjVjMC0uMiAwLS4zLS4xLS41cy0uMS0uMy0uMy0uNC0uMi0uMi0uNC0uMy0uMy0uMS0uNS0uMWwtOS40IDBjLS4yIDAtLjMgMC0uNSAuMXMtLjMgLjEtLjQgLjMtLjIgLjItLjMgLjQtLjEgLjMtLjEgLjVsMCA1NS4zYzAgLjIgMCAuMyAuMSAuNXMuMSAuMyAuMyAuNCAuMiAuMiAuNCAuMyAuMyAuMSAuNSAuMWw5LjYgMGMuMiAwIC4zIDAgLjUtLjFzLjMtLjEgLjQtLjMgLjItLjIgLjMtLjQgLjEtLjMgLjEtLjVsMC0yNy44YzAtMi45IC4xLTExLjQgNC41LTE1LjEgNC45LTQuOSAxMi0zLjQgMTMuNC0zLjEgLjMgMCAuNi0uMSAuOC0uM3MuNC0uNCAuNi0uN2MxLjItMi42IDIuMi01LjMgMy4xLTggLjEtLjMgLjEtLjUgMC0uOHMtLjMtLjUtLjUtLjZsMCAwem00Ni44IDU0LjFsLTIuMS03LjNjLS41LTEuMi0xLjQtLjctMS40LS43LTQuMiAxLjgtMTAuMSAxLjktMTEuMyAxLjktNC42IDAtMTcuMi0xLjEtMTcuMi0xOS44IDAtNi4yIDEuOC0xOS44IDE2LjUtMTkuOCAzLjktLjEgNy44IC41IDExLjUgMS42IDAgMCAuOSAuNSAxLjItLjcgLjktMi42IDEuNi00LjUgMi42LTcuNSAuMi0uOS0uNS0xLjItLjctMS4yLTExLjYtMy45LTIyLjMtMi41LTI3LjggMC0xLjYgLjctMTYuMiA2LjUtMTYuMiAyNy41IDAgMi45LS42IDMwLjEgMjguOSAzMC4xIDUuMyAwIDEwLjYtMSAxNS41LTIuOCAuMi0uMiAuNC0uNCAuNS0uNnMuMS0uNSAwLS44bDAgMHptNTMuOS0zOS41Yy0uOC0zLTUuNC0xNi4yLTIyLjMtMTYuMi0xNiAwLTIzLjUgMTAuMS0yNS42IDE4LjYtMS4yIDMuOC0xLjcgNy44LTEuNyAxMS44IDAgMjUuOSAxOC44IDI5LjQgMjkuOSAyOS40IDEwLjggMCAxNi41LTIuMyAxOC42LTMuOCAuNS0uMiAuNy0uNyAuMi0xLjlsLTIuNC02LjhjLS4xLS4zLS4zLS41LS42LS42cy0uNi0uMi0uOC0uMWMtMi42IC45LTYuMyAyLjgtMTUuMyAyLjgtMTcuNCAwLTE2LjktMTQuNy0xNi45LTE2LjdsMzcuMiAwYy4zIDAgLjUtLjEgLjctLjNzLjQtLjQgLjQtLjdjLS4yIDAgLjktNy4xLTEuNC0xNS41bDAgMHptLTIzLjMtNi40Yy0xMC4zIDAtMTMgOS0xMy42IDE0LjFsMjYuNCAwYy0uOS0xMS45LTcuNi0xNC4xLTEyLjctMTQuMWwwIDB6Il0KICAgIH07CiAgICBmYVNvdXJjZXRyZWUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic291cmNldHJlZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmN2QzIiwgIk00MjcuNCAyMDNjMC0xMTIuMS05MC45LTIwMy0yMDMtMjAzLTExMi4xLS4yLTIwMyA5MC42LTIwMy4yIDIwMi42LS4xIDQzIDEzLjUgODQuOCAzOC43IDExOS42czYwLjkgNjAuNiAxMDEuOCA3My44bDAgMTAxLjdjMCAzLjggMS41IDcuNCA0LjIgMTAuMXM2LjMgNC4yIDEwLjEgNC4ybDk2LjQgMGMzLjggMCA3LjQtMS41IDEwLjEtNC4yczQuMi02LjMgNC4yLTEwLjFsMC0xMDEuNmM0MC44LTEzLjIgNzYuNS0zOSAxMDEuNy03My43czM4LjktNzYuNSAzOS0xMTkuNHptLTI3MS42IDBjMC05MC44IDEzNy4zLTkwLjggMTM3LjMgMC0uMSA4OS45LTEzNy4zIDkxLTEzNy4zIDB6Il0KICAgIH07CiAgICBmYUxpbmtlZGluSW4gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibGlua2VkaW4taW4iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjBlMSIsICJNMTAwLjMgNDQ4bC05Mi45IDAgMC0yOTkuMSA5Mi45IDAgMCAyOTkuMXpNNTMuOCAxMDguMUMyNC4xIDEwOC4xIDAgODMuNSAwIDUzLjggMCAzOS41IDUuNyAyNS45IDE1LjggMTUuOHMyMy44LTE1LjggMzgtMTUuOCAyNy45IDUuNyAzOCAxNS44IDE1LjggMjMuOCAxNS44IDM4YzAgMjkuNy0yNC4xIDU0LjMtNTMuOCA1NC4zek00NDcuOSA0NDhsLTkyLjcgMCAwLTE0NS42YzAtMzQuNy0uNy03OS4yLTQ4LjMtNzkuMi00OC4zIDAtNTUuNyAzNy43LTU1LjcgNzYuN2wwIDE0OC4xLTkyLjggMCAwLTI5OS4xIDg5LjEgMCAwIDQwLjggMS4zIDBjMTIuNC0yMy41IDQyLjctNDguMyA4Ny45LTQ4LjMgOTQgMCAxMTEuMyA2MS45IDExMS4zIDE0Mi4zbDAgMTY0LjMtLjEgMHoiXQogICAgfTsKICAgIGZhSHRtbDUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaHRtbDUiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjEzYiIsICJNMCAzMkwzNC45IDQyNy44IDE5MS41IDQ4MCAzNDkuMSA0MjcuOCAzODQgMzIgMCAzMnpNMzA4LjIgMTU5LjlsLTE4My44IDAgNC4xIDQ5LjQgMTc1LjYgMC0xMy42IDE0OC40LTk3LjkgMjcgMCAuMy0xLjEgMC05OC43LTI3LjMtNi03NS44IDQ3LjcgMCAzLjUgMzguMSA1My41IDE0LjUgNTMuNy0xNC41IDYtNjIuMi0xNjYuOSAwLTEyLjgtMTQ1LjYgMjQxLjEgMC00LjQgNDcuN3oiXQogICAgfTsKICAgIGZhUnVzdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJydXN0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUwN2EiLCAiTTUwOC41IDI0OS44bC0yMS44LTEzLjVjLS4yLTItLjMtMy45LS41LTUuOWwxOC43LTE3LjVjLjktLjkgMS42LTEuOSAyLTMuMXMuNS0yLjUgLjItMy43LS44LTIuNC0xLjYtMy4zLTEuOC0xLjctMy0yLjFsLTI0LTljLS41LTEuOS0xLjEtMy44LTEuNy01LjZsMTUtMjAuOGMuNy0xIDEuMi0yLjIgMS4zLTMuNHMwLTIuNS0uNS0zLjctMS4yLTIuMi0yLjItMi45LTIuMS0xLjMtMy40LTEuNWwtMjUuNC00LjJjLS45LTEuNy0xLjgtMy40LTIuNy01LjJsMTAuNy0yMy40Yy41LTEuMSAuNy0yLjQgLjYtMy42cy0uNS0yLjQtMS4yLTMuNS0xLjYtMS45LTIuOC0yLjUtMi40LS44LTMuNi0uOGwtMjUuOCAuOWMtMS4yLTEuNS0yLjQtMi45LTMuNi00LjRMNDM5IDgxLjhjLjMtMS4yIC4zLTIuNS0uMS0zLjdzLTEtMi4zLTEuOS0zLjItMi0xLjUtMy4yLTEuOS0yLjUtLjQtMy43LS4xTDQwNSA3OC45Yy0xLjQtMS4yLTIuOS0yLjQtNC40LTMuNmwuOS0yNS44Yy4xLTEuMy0uMi0yLjUtLjgtMy42cy0xLjQtMi4xLTIuNS0yLjgtMi4yLTEuMS0zLjUtMS4yLTIuNSAuMS0zLjcgLjZMMzY3LjcgNTMuMmMtMS43LS45LTMuNC0xLjgtNS4xLTIuN2wtNC4yLTI1LjRjLS4yLTEuMi0uNy0yLjQtMS41LTMuNHMtMS44LTEuNy0yLjktMi4yLTIuNC0uNy0zLjctLjUtMi40IC42LTMuNCAxLjNMMzI2IDM1LjNjLTEuOS0uNi0zLjgtMS4xLTUuNi0xLjdsLTktMjRjLS40LTEuMi0xLjItMi4yLTIuMS0zcy0yLjEtMS40LTMuMy0xLjYtMi41LS4yLTMuNyAuMi0yLjMgMS4xLTMuMSAyTDI4MS42IDI1LjljLTItLjItMy45LS40LTUuOS0uNUwyNjIuMyAzLjVjLS43LTEuMS0xLjYtMS45LTIuNy0yLjZzLTIuMy0uOS0zLjYtLjktMi41IC4zLTMuNiAuOS0yIDEuNS0yLjcgMi42TDIzNi4yIDI1LjNjLTIgLjItMy45IC4zLTUuOSAuNkwyMTIuOSA3LjFjLS45LS45LTEuOS0xLjYtMy4xLTJzLTIuNS0uNS0zLjctLjItMi40IC44LTMuMyAxLjYtMS43IDEuOC0yLjEgM2wtOSAyNGMtMS45IC42LTMuOCAxLjEtNS43IDEuN2wtMjAuOC0xNWMtMS0uNy0yLjItMS4yLTMuNC0xLjNzLTIuNSAwLTMuNyAuNS0yLjIgMS4yLTIuOSAyLjItMS4zIDIuMS0xLjUgMy40bC00LjIgMjUuNGMtMS43IC45LTMuNCAxLjgtNS4yIDIuN0wxMjAuOSA0Mi42Yy0xLjEtLjUtMi40LS43LTMuNy0uNnMtMi41IC41LTMuNSAxLjItMS45IDEuNy0yLjUgMi44LS44IDIuNC0uOCAzLjZsLjkgMjUuOGMtMS41IDEuMi0zIDIuNC00LjQgMy42TDgxLjggNzNjLTEuMi0uMy0yLjUtLjMtMy43IC4xcy0yLjMgMS0zLjIgMS45LTEuNSAyLTEuOSAzLjItLjQgMi41LS4xIDMuN0w3OC45IDEwN2MtMS4yIDEuNC0yLjQgMi45LTMuNiA0LjRsLTI1LjgtLjljLTEuMyAwLTIuNSAuMi0zLjYgLjhzLTIuMSAxLjQtMi44IDIuNC0xLjEgMi4yLTEuMiAzLjUgLjEgMi41IC42IDMuNmwxMC43IDIzLjRjLS45IDEuNy0xLjggMy40LTIuNyA1LjJsLTI1LjQgNC4xYy0xLjIgLjItMi40IC43LTMuNCAxLjVzLTEuNyAxLjgtMi4yIDIuOS0uNyAyLjQtLjUgMy43IC42IDIuNCAxLjMgMy40bDE1IDIwLjhjLS42IDEuOS0xLjEgMy44LTEuNyA1LjdsLTI0IDljLTEuMiAuNC0yLjIgMS4yLTMgMi4xcy0xLjQgMi4xLTEuNiAzLjMtLjIgMi41IC4yIDMuNyAxLjEgMi4zIDIgMy4xbDE4LjcgMTcuNWMtLjIgMi0uNCAzLjktLjYgNS45TDMuNSAyNDkuOGMtMS4xIC43LTEuOSAxLjYtMi42IDIuN3MtLjkgMi4zLS45IDMuNiAuMyAyLjUgLjkgMy42IDEuNSAyIDIuNiAyLjdsMjEuOCAxMy41Yy4yIDIgLjMgMy45IC42IDUuOUw3LjEgMjk5LjFjLS45IC45LTEuNiAxLjktMiAzLjFzLS41IDIuNS0uMiAzLjcgLjggMi40IDEuNiAzLjMgMS44IDEuNyAzIDIuMWwyNCA5Yy42IDEuOSAxLjEgMy44IDEuNyA1LjZsLTE1IDIwLjhjLS43IDEtMS4yIDIuMi0xLjMgMy40czAgMi41IC41IDMuNyAxLjIgMi4yIDIuMiAyLjkgMi4xIDEuMyAzLjQgMS41bDI1LjQgNC4yYy45IDEuNyAxLjggMy40IDIuNyA1LjFMNDIuNiAzOTEuMWMtLjUgMS4xLS43IDIuNC0uNiAzLjZzLjUgMi41IDEuMiAzLjVjLjcgMS4xIDEuNiAxLjkgMi43IDIuNXMyLjQgLjggMy42IC44bDI1LjgtLjljMS4yIDEuNSAyLjQgMi45IDMuNiA0LjRMNzMgNDMwLjJjLS4zIDEuMi0uMyAyLjUgLjEgMy43czEgMi4zIDEuOSAzLjIgMiAxLjUgMy4yIDEuOSAyLjUgLjQgMy43IC4xbDI1LjItNS45YzEuNSAxLjIgMi45IDIuNCA0LjQgMy42bC0uOSAyNS44YzAgMS4zIC4yIDIuNSAuOCAzLjZzMS40IDIuMSAyLjUgMi44IDIuMiAxLjEgMy41IDEuMiAyLjUtLjEgMy42LS42bDIzLjQtMTAuN2MxLjcgLjkgMy40IDEuOCA1LjEgMi43bDQuMiAyNS40Yy4yIDEuMiAuNyAyLjQgMS41IDMuNHMxLjggMS44IDIuOSAyLjIgMi40IC43IDMuNyAuNSAyLjQtLjYgMy40LTEuM2wyMC44LTE1YzEuOSAuNiAzLjggMS4xIDUuNiAxLjdsOSAyNGMuNCAxLjIgMS4yIDIuMiAyLjEgM3MyLjEgMS40IDMuMyAxLjYgMi41IC4yIDMuNy0uMiAyLjMtMS4xIDMuMS0ybDE3LjUtMTguN2MyIC4yIDMuOSAuNCA1LjkgLjZsMTMuNSAyMS44Yy43IDEuMSAxLjYgMS45IDIuNyAyLjZzMi4zIC45IDMuNiAuOSAyLjUtLjMgMy42LS45IDItMS41IDIuNy0yLjZsMTMuNS0yMS44YzItLjIgMy45LS4zIDUuOS0uNmwxNy41IDE4LjdjLjkgLjkgMS45IDEuNiAzLjEgMnMyLjUgLjUgMy43IC4yIDIuNC0uOCAzLjMtMS42IDEuNy0xLjggMi4xLTNsOS0yNGMxLjktLjYgMy44LTEuMSA1LjYtMS43bDIwLjggMTVjMSAuNyAyLjIgMS4yIDMuNCAxLjNzMi41IDAgMy43LS41IDIuMi0xLjIgMi45LTIuMiAxLjMtMi4xIDEuNS0zLjRsNC4yLTI1LjRjMS43LS45IDMuNC0xLjggNS4xLTIuN2wyMy40IDEwLjdjMS4xIC41IDIuNCAuNyAzLjYgLjZzMi40LS41IDMuNS0xLjIgMS45LTEuNiAyLjUtMi44IC44LTIuNCAuOC0zLjZsLS45LTI1LjhjMS41LTEuMiAyLjktMi40IDQuNC0zLjZsMjUuMiA1LjljMS4yIC4zIDIuNSAuMyAzLjctLjFzMi4zLTEgMy4yLTEuOSAxLjUtMiAxLjktMy4yIC40LTIuNSAuMS0zLjdMNDMzLjEgNDA1YzEuMi0xLjQgMi40LTIuOSAzLjYtNC40bDI1LjggLjljMS4zIC4xIDIuNS0uMiAzLjYtLjhzMi4xLTEuNCAyLjgtMi41Yy43LTEgMS4xLTIuMiAxLjItMy41cy0uMS0yLjUtLjYtMy42bC0xMC43LTIzLjRjLjktMS43IDEuOC0zLjQgMi43LTUuMWwyNS40LTQuMmMxLjItLjIgMi40LS43IDMuNC0xLjVzMS44LTEuOCAyLjItMi45IC43LTIuNCAuNS0zLjctLjYtMi40LTEuMy0zLjRsLTE1LTIwLjhjLjYtMS45IDEuMS0zLjggMS43LTUuNmwyNC05YzEuMi0uNCAyLjItMS4yIDMtMi4xczEuNC0yLjEgMS42LTMuMyAuMi0yLjUtLjItMy43LTEuMS0yLjMtMi0zLjFsLTE4LjctMTcuNWMuMi0xLjkgLjQtMy45IC42LTUuOWwyMS44LTEzLjVjMS4xLS43IDEuOS0xLjYgMi42LTIuN3MuOS0yLjMgLjktMy42LS4zLTIuNS0uOS0zLjYtMS41LTItMi42LTIuN2wwIDB6bS0xNTEgMTI5LjFjLTMuNi0uOC03LjQtLjEtMTAuNSAxLjlzLTUuMyA1LjItNiA4LjhsLTcuNiAzNS43Yy0yNC42IDExLjEtNTEuMyAxNi44LTc4LjMgMTYuN3MtNTMuNi02LjEtNzguMS0xNy40bC03LjYtMzUuN2MtLjQtMS44LTEuMS0zLjUtMi4xLTVzLTIuNC0yLjgtMy45LTMuOC0zLjItMS43LTUtMi0zLjYtLjMtNS40IC4xbC0zMS41IDYuOGMtNS44LTYtMTEuMy0xMi41LTE2LjMtMTkuMmwxNTMuMiAwYzEuNyAwIDIuOS0uMyAyLjktMS45bDAtNTQuMmMwLTEuNi0xLjItMS45LTIuOS0xLjlsLTQ0LjggMCAwLTM0LjQgNDguNSAwYzQuNCAwIDIzLjcgMS4zIDI5LjggMjUuOSAxLjkgNy41IDYuMiAzMi4xIDkuMSA0MCAyLjkgOC44IDE0LjYgMjYuNSAyNy4xIDI2LjVsNzkgMGMtNS4zIDcuMS0xMS4xIDEzLjgtMTcuMyAyMC4xbC0zMi4xLTYuOXptMjUuOCAzNC41YzAgMy0uOSA2LTIuNiA4LjVzLTQgNC41LTYuOCA1LjYtNS44IDEuNS04LjggLjktNS43LTItNy44LTQuMi0zLjYtNC44LTQuMi03LjgtLjMtNiAuOC04LjggMy4xLTUuMiA1LjYtNi45IDUuNC0yLjYgOC41LTIuNmwuNCAwYzQgLjEgNy43IDEuOCAxMC41IDQuNnM0LjMgNi43IDQuMyAxMC42bC4xIDB6bS0yMjUuNi0uN2MwIDMtLjkgNi0yLjYgOC41cy00LjEgNC41LTYuOCA1LjYtNS44IDEuNS04LjggLjktNS43LTItNy44LTQuMi0zLjYtNC44LTQuMi03LjgtLjMtNiAuOS04LjggMy4xLTUuMiA1LjYtNi44IDUuNC0yLjYgOC41LTIuNmwuNSAwYzQgLjEgNy43IDEuOCAxMC41IDQuNnM0LjMgNi43IDQuMyAxMC42bC4xIDB6TTY5LjYgMjM0LjJsMzIuOC0xNC42YzEuNy0uNyAzLjItMS44IDQuNC0zLjFzMi4yLTIuOSAyLjktNC42IDEtMy41IC45LTUuMy0uNS0zLjYtMS4yLTUuM2wtNi44LTE1LjIgMjYuNiAwIDAgMTE5LjctNTMuNiAwYy02LjYtMjMuMi04LjctNDcuNi02LjEtNzEuNnpNNTguMyAxOTguMWMwLTIgLjQtNCAxLjItNS44czEuOS0zLjUgMy4zLTQuOSAzLjEtMi41IDQuOS0zLjMgMy44LTEuMiA1LjgtMS4ybC41IDBjMyAuMSA1LjkgMSA4LjMgMi44czQuMyA0LjEgNS40IDYuOSAxLjMgNS44IC43IDguOC0yLjEgNS42LTQuMyA3LjctNC45IDMuNS03LjggNC4xLTYgLjItOC43LS45LTUuMS0zLjEtNi44LTUuNi0yLjUtNS40LTIuNS04LjRsMCAwem0xNTUuMiAyNC41bDAtMzUuMyA2My4zIDBjMy4zIDAgMjMuMSAzLjggMjMuMSAxOC42IDAgMTIuMy0xNS4yIDE2LjctMjcuNyAxNi43bC01OC43IDB6TTM5OSAzMDYuN2MtOS44IDEuMS0yMC42LTQuMS0yMi0xMC4xLTUuOC0zMi41LTE1LjQtMzkuNC0zMC42LTUxLjQgMTguOS0xMiAzOC41LTI5LjYgMzguNS01My4zIDAtMjUuNS0xNy41LTQxLjYtMjkuNC00OS41LTE2LjgtMTEtMzUuMy0xMy4yLTQwLjMtMTMuMmwtMTk4LjkgMGMyNy41LTMwLjcgNjQuNC01MS41IDEwNC45LTU5LjJsMjMuNSAyNC42YzEuMyAxLjMgMi44IDIuNCA0LjQgMy4xczMuNSAxLjEgNS4zIDEuMiAzLjYtLjMgNS4zLS45IDMuMi0xLjcgNC42LTIuOWwyNi4zLTI1YzI2LjggNSA1Mi4xIDE1LjggNzQuMyAzMS42czQwLjYgMzYuMiA1NC4xIDU5LjlsLTE4IDQwLjZjLTEuNSAzLjQtMS41IDcuMi0uMiAxMC42czMuOSA2LjIgNy4zIDcuN2wzNC42IDE1LjNjMS4xIDEwLjggMS4yIDIxLjcgLjQgMzIuNWwtMTkuMyAwYy0xLjkgMC0yLjcgMS4zLTIuNyAzLjFsMCA4LjhjMCAyMC44LTExLjcgMjUuMy0yMiAyNi41ek0yNDAgNjAuMmMwLTQgMS42LTcuOSA0LjUtMTAuN3M2LjctNC41IDEwLjctNC41bC40IDBjMyAuMSA1LjkgMSA4LjQgMi44czQuMyA0LjEgNS40IDYuOSAxLjMgNS44IC43IDguOC0yLjEgNS42LTQuMyA3LjctNC45IDMuNS03LjggNC02IC4yLTguNy0uOS01LjEtMy4xLTYuOC01LjYtMi41LTUuNC0yLjUtOC40ek00MzYuOCAyMTRjLTIgMC00LS40LTUuOC0xLjJzLTMuNS0xLjktNC45LTMuMy0yLjUtMy4xLTMuMy00LjktMS4yLTMuOC0xLjItNS44IC40LTQgMS4yLTUuOCAxLjktMy41IDMuMy00LjkgMy4xLTIuNSA0LjktMy4zIDMuOC0xLjIgNS44LTEuMmwuNCAwYzQgLjEgNy45IDEuNyAxMC43IDQuNnM0LjQgNi44IDQuMyAxMC44LTEuNyA3LjktNC42IDEwLjctNi44IDQuNC0xMC44IDQuM3oiXQogICAgfTsKICAgIGZhSG9ybmJpbGwgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaG9ybmJpbGwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjU5MiIsICJNNzYuOCAzNzAuM2MxIDcuOC0uNCAxNS44LTQuMSAyMi44cy05LjYgMTIuNi0xNi43IDE2LjEtMTUuMSA0LjctMjIuOSAzLjMtMTUtNS4xLTIwLjYtMTAuNy05LjItMTIuOS0xMC41LTIwLjcgMC0xNS44IDMuNi0yMi45IDkuMy0xMi44IDE2LjMtMTYuNSAxNS01IDIyLjktMy45Yy03OC4zLTExMS4zIDUyLTE5MC41IDUyLTE5MC41LTUuOSA0My04LjIgOTEuMi04LjIgOTEuMi02Ny4zIDQxLjUgLjkgNjQuMSAzOS44IDcyLjkgOS45IDI3IDI3LjggNTAuMiA1MS40IDY2LjdzNTEuNiAyNS4zIDgwLjMgMjUuM2MxLjkgMCAzLjgtLjIgNS43LS4zbC4xIDE4LjljLTk5LjIgMS40LTE1OC43LTI5LjEtMTg4LjktNTEuNnptMTA4LTMyNy43Yy45LTcuMi0uMi0xNC42LTMuNC0yMS4yLTMtNi4yLTcuNi0xMS41LTEzLjQtMTUuM3MtMTIuNS01LjktMTkuNC02LjItMTMuOCAxLjQtMTkuOCA0LjctMTEuMSA4LjMtMTQuNSAxNC4zLTUuMiAxMi44LTUgMTkuNyAyLjIgMTMuNyA1LjkgMTkuNSA4LjkgMTAuNiAxNS4xIDEzLjYgMTMuMSA0LjQgMjAgMy45Yy0yMi42IDI5LjktNTMuOCA4OS42LTUyLjQgMTkwbDIxLjgtLjJjMC0uOS0uMS0xLjgtLjEtMi43IDAtMjggOC40LTU1LjMgMjQuMS03OC41czM3LjktNDEuMiA2My44LTUxLjZjOC0zNy43IDMwLjctMTE0LjMgNzMuOC00NC4zIDAgMCA0OC4xIDIuNCA5MS4yIDguMiAwIDAtNzcuOC0xMjgtMTg3LjYtNTQuMWwwIDB6TTQ4OSAxNzYuOGM2LjMtMyAxMS43LTcuNyAxNS41LTEzLjZzNS45LTEyLjcgNi4xLTE5LjgtMS42LTE0LTUuMi0yMC04LjctMTEtMTQuOS0xNC4zLTEzLjItNC44LTIwLjItNC40LTEzLjggMi44LTE5LjUgNi45LTEwLjIgOS42LTEzIDE2LjEtMy43IDEzLjYtMi43IDIwLjVjLTMxLjctMjEuOS04OS44LTQ5LjEtMTgzLjQtNDcuN2wuMSAyMi41YzIuNy0uMiA1LjQtLjQgOC4xLS40IDI4LjEgMCA1NS42IDguNSA3OC45IDI0LjNzNDEuMiAzOC4zIDUxLjYgNjQuNWMzOS4xIDkgMTA1LjEgMzEuNiAzOC41IDcyLjUgMCAwLTIuMyA0OC4xLTguMiA5MS4yIDAgMCAxMzMuNC04MS4yIDQ5LTE5NC42IDYuNiAuNiAxMy4zLS42IDE5LjMtMy41bDAgMHpNMzc0LjQgNDM2LjJjMjEuNC0zMi41IDQ2LjQtODkuNyA0NS4xLTE3OS43bC0xOS41IC4xYy4xIDIuMSAuMyA0LjEgLjMgNi4yIDAgMjguNi04LjggNTYuNS0yNS4xIDgwcy0zOS41IDQxLjQtNjYuMyA1MS40Yy04LjkgMzktMzEuNCAxMDYuNy03Mi44IDM5LjUgMCAwLTQ4LjEtMi4zLTkxLjItOC4yIDAgMCA3OS45IDEzMS4zIDE5MS45IDUxIC4zIDQuOSAxLjUgOS42IDMuNiAxNCAyLjkgNi4xIDcuNSAxMS40IDEzLjEgMTUuMXMxMi4yIDYgMTkgNi40IDEzLjYtMS4xIDE5LjYtNC4yIDExLjEtNy44IDE0LjctMTMuNiA1LjYtMTIuNCA1LjctMTkuMi0xLjUtMTMuNS00LjgtMTkuNC04LjItMTAuOS0xNC4xLTE0LjMtMTIuNi01LjItMTkuNC01LjFsMC0uMXoiXQogICAgfTsKICAgIGZhUGhwID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInBocCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNDU3IiwgIk0zMjAgMTA0LjVjMTcxLjQgMCAzMDMuMiA3Mi4yIDMwMy4yIDE1MS41UzQ5MS4zIDQwNy41IDMyMCA0MDcuNUMxNDguNiA0MDcuNSAxNi44IDMzNS4zIDE2LjggMjU2UzE0OC43IDEwNC41IDMyMCAxMDQuNXptMC0xNi44QzE0My4zIDg3LjcgMCAxNjMgMCAyNTZTMTQzLjMgNDI0LjMgMzIwIDQyNC4zIDY0MCAzNDkgNjQwIDI1NiA0OTYuNyA4Ny43IDMyMCA4Ny43ek0yMTguMiAyNDIuNWMtNy45IDQwLjUtMzUuOCAzNi4zLTcwLjEgMzYuM2wxMy43LTcwLjZjMzggMCA2My44LTQuMSA1Ni40IDM0LjN6TTk3LjQgMzUwLjNsMzYuNyAwIDguNy00NC44YzQxLjEgMCA2Ni42IDMgOTAuMi0xOS4xIDI2LjEtMjQgMzIuOS02Ni43IDE0LjMtODguMS05LjctMTEuMi0yNS4zLTE2LjctNDYuNS0xNi43bC03MC43IDAtMzIuNyAxNjguN3pNMjgzLjEgMTM2LjdsMzYuNSAwLTguNyA0NC44YzMxLjUgMCA2MC43LTIuMyA3NC44IDEwLjcgMTQuOCAxMy42IDcuNyAzMS04LjMgMTEzLjFsLTM3IDBjMTUuNC03OS40IDE4LjMtODYgMTIuNy05Mi01LjQtNS44LTE3LjctNC42LTQ3LjQtNC42bC0xOC44IDk2LjYtMzYuNSAwIDMyLjctMTY4LjZ6TTUwNSAyNDIuNWMtOCA0MS4xLTM2LjcgMzYuMy03MC4xIDM2LjNsMTMuNy03MC42YzM4LjIgMCA2My44LTQuMSA1Ni40IDM0LjN6TTM4NC4yIDM1MC4zbDM2LjggMCA4LjctNDQuOGM0My4yIDAgNjcuMSAyLjUgOTAuMi0xOS4xIDI2LjEtMjQgMzIuOS02Ni43IDE0LjMtODguMS05LjctMTEuMi0yNS4zLTE2LjctNDYuNS0xNi43bC03MC43IDAtMzIuOCAxNjguN3oiXQogICAgfTsKICAgIGZhRGlzcXVzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImRpc3F1cyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlN2Q1IiwgIk0yOTAuMiA1MTJjLTYyLjYgMC0xMTkuOS0yMi45LTE2NC4yLTYwLjhMMTcgNDY2LjEgNTkuMSAzNjIuMmMtMTQuNy0zMi40LTIyLjktNjguMy0yMi45LTEwNi4yIDAtMTQxLjQgMTEzLjctMjU2IDI1NC0yNTYgMTQwLjMgMCAyNTQgMTE0LjYgMjU0IDI1NiAwIDE0MS40LTExMy43IDI1Ni0yNTQgMjU2ek00MjguOSAyNTUuM2wwLS43QzQyOC45IDE4MC43IDM3Ni44IDEyOCAyODcgMTI4bC05NyAwIDAgMjU2IDk1LjYgMGM5MC41IDAgMTQzLjQtNTQuOSAxNDMuNC0xMjguN3pNMjg4IDMyMS4xbC0yOC40IDAgMC0xMzAuMiAyOC40IDBjNDEuNyAwIDY5LjMgMjMuOCA2OS4zIDY0LjdsMCAuN2MwIDQxLjMtMjcuNyA2NC43LTY5LjMgNjQuN3oiXQogICAgfTsKICAgIGZhNTAwcHggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiNTAwcHgiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjI2ZSIsICJNNzEuOCAzNDQuM2MtNi41LTE0LjItNi45LTE4LjMgNy40LTIzLjEgMjUuNi04IDggOS4yIDQzLjIgNDkuMmwuMyAwIDAtOTMuOWMxLjItNTAuMiA0NC05Mi4yIDk3LjctOTIuMiA1My45IDAgOTcuNyA0My41IDk3LjcgOTYuOCAwIDYzLjQtNjAuOCAxMTMuMi0xMjguNSA5My4zLTEwLjUtNC4yLTIuMS0zMS43IDguNS0yOC42IDUzIDAgODkuNC0xMC4xIDg5LjQtNjQuNCAwLTYxLTc3LjEtODkuNi0xMTYuOS00NC42LTIzLjUgMjYuNC0xNy42IDQyLjEtMTcuNiAxNTcuNiA1MC43IDMxIDExOC4zIDIyIDE2MC40LTIwLjEgMjQuOC0yNC44IDM4LjUtNTggMzguNS05MyAwLTM1LjItMTMuOC02OC4yLTM4LjgtOTMuMy0yNC44LTI0LjgtNTcuOC0zOC41LTkzLjMtMzguNVMxNTEgMTYzLjMgMTI2LjMgMTg4Yy0uMyAuMy0xNiAxNi41LTIxLjIgMjMuOWwtLjUgLjZjLTMuMyA0LjctNi4zIDkuMS0yMC4xIDYuMS02LjktMS43LTE0LjMtNS44LTE0LjMtMTEuOEw3MC4yIDIwYzAtNSAzLjktMTAuNSAxMC41LTEwLjVMMzIyIDkuNWM4LjMgMCA4LjMgMTEuNiA4LjMgMTUuMSAwIDMuOSAwIDE1LjEtOC4zIDE1LjFsLTIyMy4yIDAgMCAxMzIuOSAuMyAwYzEwNC4yLTEwOS44IDI4Mi44LTM2IDI4Mi44IDEwOC45IDAgMTc4LjEtMjQ0LjggMjIwLjMtMzEwLjEgNjIuOHpNMTM1LjEgODMuNWMtLjUgNC4yIDQuNiAyNC41IDE0LjYgMjAuNiAxMjQuOC00Ny41IDIwMi44IDQwLjQgMjA5LjQgNDAuNCA0LjggMCAyMi44LTE1LjMgMTQuMy0yMi44LTkzLjItODktMjM0LjUtNTctMjM4LjMtMzguMnpNMzYxLjUgNDE0LjdjLTExMCAxMDkuOS0yOTkgNjAuOC0zMzItMTA0LjIgMC0xMi4yLTMwLjQtNy40LTI4LjkgMy4zIDI0IDE3My40IDI0NiAyNTYuOSAzODEuNiAxMjEuMyA2LjktNy44LTEyLjYtMjguNC0yMC43LTIwLjR6TTE4Mi4xIDMwNi42YzAgNCA0LjMgNy4zIDUuNSA4LjUgMyAzIDYuMSA0LjQgOC41IDQuNCAzLjggMCAyLjYgLjIgMjIuMy0xOS41IDE5LjYgMTkuMyAxOS4xIDE5LjUgMjIuMyAxOS41IDUuNCAwIDE4LjUtMTAuNCAxMC43LTE4LjJsLTE3LjMtMTcuMyAxOC4yLTE4LjJjNi4zLTYuOC0xMC4xLTIxLjgtMTYuMi0xNS43TDIxOC4yIDI2OGMtMTguNi0xOC44LTE4LjQtMTkuNS0yMS41LTE5LjUtNSAwLTE4IDExLjctMTIuNCAxNy4zTDIwMi41IDI4NGMtMTguMSAxNy45LTIwLjQgMTkuMi0yMC40IDIyLjZ6Il0KICAgIH07CiAgICBmYUFmZmlsaWF0ZXRoZW1lID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImFmZmlsaWF0ZXRoZW1lIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzNmIiLCAiTTE1OS43IDIzNy40QzEwOC40IDMwOC4zIDQzLjEgMzQ4LjIgMTQgMzI2LjYtMTUuMiAzMDQuOSAyLjggMjMwIDU0LjIgMTU5LjEgMTA1LjUgODguMiAxNzAuOCA0OC4zIDE5OS45IDY5LjlzMTEuMSA5Ni42LTQwLjIgMTY3LjV6bTM1MS4yLTU3LjNjLTczLjggMTIzLjQtMTkxLjkgMTg3LjctMjY0LjUgMTQzLjYtMjUtMTUuMi00MS4zLTQxLjItNDktNzMuOC0zMy42IDY0LjgtOTIuOCAxMTMuOC0xNjQuMSAxMzMuMiA0OS44IDU5LjMgMTI0LjEgOTYuOSAyMDcgOTYuOSAxNTAgMCAyNzEuNi0xMjMuMSAyNzEuNi0yNzQuOSAuMS04LjUtLjMtMTYuOC0xLTI1eiJdCiAgICB9OwogICAgZmFSZWRSaXZlciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJyZWQtcml2ZXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjNlMyIsICJNMzUzLjIgMzJMOTQuOCAzMkM0Mi40IDMyIDAgNzQuNCAwIDEyNi44TDAgMzg1LjJDMCA0MzcuNiA0Mi40IDQ4MCA5NC44IDQ4MGwyNTguNCAwYzUyLjQgMCA5NC44LTQyLjQgOTQuOC05NC44bDAtMjU4LjRDNDQ4IDc0LjQgNDA1LjYgMzIgMzUzLjIgMzJ6TTE0NC45IDIwMC45bDAgNTYuM2MwIDI3LTIxLjkgNDguOS00OC45IDQ4LjlsMC0xNTQuMmMwLTEzLjIgMTAuNy0yMy45IDIzLjktMjMuOWwxNTQuMiAwYzAgMjctMjEuOSA0OC45LTQ4LjkgNDguOWwtNTYuMyAwYy0xMi4zLS42LTI0LjYgMTEuNi0yNCAyNHptMTc2LjMgNzJsLTU2LjMgMGMtMTIuMy0uNi0yNC42IDExLjYtMjQgMjRsMCA1Ni4zYzAgMjctMjEuOSA0OC45LTQ4LjkgNDguOWwwLTE1NC4yYzAtMTMuMiAxMC43LTIzLjkgMjMuOS0yMy45bDE1NC4yIDBjMCAyNy0yMS45IDQ4LjktNDguOSA0OC45eiJdCiAgICB9OwogICAgZmFUd2l0dGVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInR3aXR0ZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjA5OSIsICJNNDU5LjQgMTUxLjdjLjMgNC41IC4zIDkuMSAuMyAxMy42IDAgMTM4LjctMTA1LjYgMjk4LjYtMjk4LjYgMjk4LjYtNTkuNSAwLTExNC43LTE3LjItMTYxLjEtNDcuMSA4LjQgMSAxNi42IDEuMyAyNS4zIDEuMyA0OS4xIDAgOTQuMi0xNi42IDEzMC4zLTQ0LjgtNDYuMS0xLTg0LjgtMzEuMi05OC4xLTcyLjggNi41IDEgMTMgMS42IDE5LjggMS42IDkuNCAwIDE4LjgtMS4zIDI3LjYtMy42LTQ4LjEtOS43LTg0LjEtNTItODQuMS0xMDNsMC0xLjNjMTQgNy44IDMwLjIgMTIuNyA0Ny40IDEzLjMtMjguMy0xOC44LTQ2LjgtNTEtNDYuOC04Ny40IDAtMTkuNSA1LjItMzcuNCAxNC4zLTUzIDUxLjcgNjMuNyAxMjkuMyAxMDUuMyAyMTYuNCAxMDkuOC0xLjYtNy44LTIuNi0xNS45LTIuNi0yNCAwLTU3LjggNDYuOC0xMDQuOSAxMDQuOS0xMDQuOSAzMC4yIDAgNTcuNSAxMi43IDc2LjcgMzMuMSAyMy43LTQuNSA0Ni41LTEzLjMgNjYuNi0yNS4zLTcuOCAyNC40LTI0LjQgNDQuOC00Ni4xIDU3LjggMjEuMS0yLjMgNDEuNi04LjEgNjAuNC0xNi4yLTE0LjMgMjAuOC0zMi4yIDM5LjMtNTIuNiA1NC4zeiJdCiAgICB9OwogICAgZmFGb3J0QXdlc29tZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmb3J0LWF3ZXNvbWUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjI4NiIsICJNNDg5LjUgMjg3LjlsLTI3LjQgMGMtMi42IDAtNC42IDItNC42IDQuNmwwIDMyLTM2LjYgMCAwLTE3OC4zYzAtMi42LTItNC42LTQuNi00LjZsLTI3LjQgMGMtMi42IDAtNC42IDItNC42IDQuNmwwIDMyLTM2LjYgMCAwLTMyYzAtMi42LTItNC42LTQuNi00LjZsLTI3LjQgMGMtMi42IDAtNC42IDItNC42IDQuNmwwIDMyLTM2LjYgMCAwLTMyYzAtNi04LTQuNi0xMS43LTQuNmwwLTM4YzguMy0yIDE3LjEtMy40IDI1LjctMy40IDEwLjkgMCAyMC45IDQuMyAzMS40IDQuMyA0LjYgMCAyNy43LTEuMSAyNy43LThsMC02MGMwLTIuNi0yLTQuNi00LjYtNC42LTUuMSAwLTE1LjEgNC4zLTI0IDQuMy05LjcgMC0yMC45LTQuMy0zMi42LTQuMy04IDAtMTYgMS4xLTIzLjcgMi45bDAtNC45YzUuNC0yLjYgOS4xLTguMyA5LjEtMTQuMyAwLTIwLjctMzEuNC0yMC44LTMxLjQgMCAwIDYgMy43IDExLjcgOS4xIDE0LjNsMCAxMTEuN2MtMy43IDAtMTEuNy0xLjQtMTEuNyA0LjZsMCAzMi0zNi42IDAgMC0zMmMwLTIuNi0yLTQuNi00LjYtNC42bC0yNy40IDBjLTIuNiAwLTQuNiAyLTQuNiA0LjZsMCAzMi0zNi4zIDAgMC0zMmMwLTIuNi0yLTQuNi00LjYtNC42bC0yNy40IDBjLTIuNiAwLTQuNiAyLTQuNiA0LjZsMCAxNzguMy0zNi42IDAgMC0zMmMwLTIuNi0yLTQuNi00LjYtNC42bC0yNy40IDBjLTIuNiAwLTQuNiAyLTQuNiA0LjZsMCAyMTkuNSAxODIuOSAwIDAtOTZjMC03Mi42IDEwOS43LTcyLjYgMTA5LjcgMGwwIDk2IDE4Mi45IDAgMC0yMTkuNWMuMS0yLjYtMS45LTQuNi00LjUtNC42em0tMjg4LjEtNC41YzAgMi42LTIgNC42LTQuNiA0LjZsLTI3LjQgMGMtMi42IDAtNC42LTItNC42LTQuNmwwLTY0YzAtMi42IDItNC42IDQuNi00LjZsMjcuNCAwYzIuNiAwIDQuNiAyIDQuNiA0LjZsMCA2NHptMTQ2LjQgMGMwIDIuNi0yIDQuNi00LjYgNC42bC0yNy40IDBjLTIuNiAwLTQuNi0yLTQuNi00LjZsMC02NGMwLTIuNiAyLTQuNiA0LjYtNC42bDI3LjQgMGMyLjYgMCA0LjYgMiA0LjYgNC42bDAgNjR6Il0KICAgIH07CiAgICBmYU1peGVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1peGVyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImUwNTYiLCAiTTgyLjYgNzYuMWMtMy44LTUuMS04LjctOS40LTE0LjItMTIuNXMtMTEuNy01LjEtMTguMS01LjctMTIuOCAuMS0xOC44IDIuMi0xMS42IDUuMy0xNi4zIDkuNmMtMTcuNiAxNi4yLTE5IDQzLjUtNC44IDYyLjhsOTEuOCAxMjMtOTIuMyAxMjQuMWMtMTQuMiAxOS4zLTEzLjEgNDYuNiA0LjcgNjIuOCA0LjcgNC4zIDEwLjMgNy42IDE2LjMgOS42czEyLjUgMi44IDE4LjggMi4yIDEyLjUtMi41IDE4LjEtNS43IDEwLjQtNy40IDE0LjItMTIuNUwyMTAuOSAyNjIuN2MxLjUtMi4xIDIuMy00LjYgMi4zLTcuMXMtLjgtNS0yLjMtNy4xTDgyLjYgNzYuMXpNNDM4LjIgMzc5LjZsLTkyLjMtMTI0LjEgOTEuOC0xMjNjMTQuMi0xOS4yIDEyLjgtNDYuNi00LjctNjIuOC00LjctNC4zLTEwLjMtNy42LTE2LjMtOS42cy0xMi41LTIuOC0xOC44LTIuMi0xMi41IDIuNS0xOC4xIDUuNy0xMC40IDcuNC0xNC4yIDEyLjVsLTEyOCAxNzIuMWMtMS41IDIuMS0yLjMgNC42LTIuMyA3LjFzLjggNSAyLjMgNy4xTDM2NiA0MzUuOWMzLjggNS4xIDguNyA5LjQgMTQuMiAxMi41czExLjcgNS4xIDE4LjEgNS43IDEyLjgtLjEgMTguOC0yLjIgMTEuNi01LjMgMTYuMy05LjZjMTcuOC0xNi4yIDE5LTQzLjUgNC43LTYyLjh6Il0KICAgIH07CiAgICBmYUx5ZnQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibHlmdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmM2MzIiwgIk0wIDgxLjFsNzcuOCAwIDAgMjA4LjdjMCAzMy4xIDE1IDUyLjggMjcuMiA2MS0xMi43IDExLjEtNTEuMiAyMC45LTgwLjItMi44LTE3LTE0LTI0LjgtMzcuMy0yNC44LTU5TDAgODEuMXpNNDg1LjkgMjU0LjZsMC0yMiAyMy44IDAgMC03Ni44LTI2LjEgMGMtMTAuMS00Ni4zLTUxLjItODAuNy0xMDAuMy04MC43LTU2LjYgMC0xMDIuNyA0Ni0xMDIuNyAxMDIuN2wwIDE3OS4yYzE2IDIuMyAzNS40LS4zIDUxLjctMTQgMTcuMS0xNCAyNC44LTM3LjIgMjQuOC01OWwwLTYuNyAzOC44IDAgMC03Ni44LTM4LjggMCAwLTIzLjNjMC0zNC42IDUyLjItMzQuNiA1Mi4yIDBsMCA3Ny4xYzAgNTYuNiA0NiAxMDIuNyAxMDIuNyAxMDIuN2wwLTc2LjVjLTE0LjUgMC0yNi4xLTExLjctMjYuMS0yNS45em0tMjk0LjMtOTlsMCAxMTNjMCAxNS40LTIzLjggMTUuNC0yMy44IDBsMC0xMTMtNzYuOCAwIDAgMTMyLjdjMCAyMy44IDggNTQgNDUgNjMuOSAzNyA5LjggNTguMi0xMC42IDU4LjItMTAuNi0yLjEgMTMuNC0xNC41IDIzLjMtMzQuOSAyNS4zLTE1LjUgMS42LTM1LjItMy42LTQ1LTcuOGwwIDcwLjNjMjUuMSA3LjUgNTEuNSA5LjggNzcuNiA0LjcgNDcuMS05LjEgNzYuOC00OC40IDc2LjgtMTAwLjhsMC0xNzguMi03Ny4xIDAgMCAuNXoiXQogICAgfTsKICAgIGZhQXBwbGVQYXkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYXBwbGUtcGF5IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY0MTUiLCAiTTExNi45IDE1OC41Yy03LjUgOC45LTE5LjUgMTUuOS0zMS41IDE0LjktMS41LTEyIDQuNC0yNC44IDExLjMtMzIuNiA3LjUtOS4xIDIwLjYtMTUuNiAzMS4zLTE2LjEgMS4yIDEyLjQtMy43IDI0LjctMTEuMSAzMy44em0xMC45IDE3LjJjLTE3LjQtMS0zMi4zIDkuOS00MC41IDkuOS04LjQgMC0yMS05LjQtMzQuOC05LjEtMTcuOSAuMy0zNC41IDEwLjQtNDMuNiAyNi41LTE4LjggMzIuMy00LjkgODAgMTMuMyAxMDYuMyA4LjkgMTMgMTkuNSAyNy4zIDMzLjUgMjYuOCAxMy4zLS41IDE4LjUtOC42IDM0LjUtOC42IDE2LjEgMCAyMC44IDguNiAzNC44IDguNCAxNC41LS4zIDIzLjYtMTMgMzIuNS0yNiAxMC4xLTE0LjggMTQuMy0yOS4xIDE0LjUtMjkuOS0uMy0uMy0yOC0xMC45LTI4LjMtNDIuOS0uMy0yNi44IDIxLjktMzkuNSAyMi45LTQwLjMtMTIuNS0xOC42LTMyLTIwLjYtMzguOC0yMS4xem0xMDAuNC0zNi4ybDAgMTk0LjkgMzAuMyAwIDAtNjYuNiA0MS45IDBjMzguMyAwIDY1LjEtMjYuMyA2NS4xLTY0LjNzLTI2LjQtNjQtNjQuMS02NGwtNzMuMiAwek0yNTguNSAxNjVsMzQuOSAwYzI2LjMgMCA0MS4zIDE0IDQxLjMgMzguNnMtMTUgMzguOC00MS40IDM4LjhsLTM0LjggMCAwLTc3LjR6TTQyMC43IDMzNS45YzE5IDAgMzYuNi05LjYgNDQuNi0yNC45bC42IDAgMCAyMy40IDI4IDAgMC05N2MwLTI4LjEtMjIuNS00Ni4zLTU3LjEtNDYuMy0zMi4xIDAtNTUuOSAxOC40LTU2LjggNDMuNmwyNy4zIDBjMi4zLTEyIDEzLjQtMTkuOSAyOC42LTE5LjkgMTguNSAwIDI4LjkgOC42IDI4LjkgMjQuNWwwIDEwLjgtMzcuOCAyLjNjLTM1LjEgMi4xLTU0LjEgMTYuNS01NC4xIDQxLjUgLjEgMjUuMiAxOS43IDQyIDQ3LjggNDJ6bTguMi0yMy4xYy0xNi4xIDAtMjYuNC03LjgtMjYuNC0xOS42IDAtMTIuMyA5LjktMTkuNCAyOC44LTIwLjVsMzMuNi0yLjEgMCAxMWMwIDE4LjItMTUuNSAzMS4yLTM2IDMxLjJ6bTEwMi41IDc0LjZjMjkuNSAwIDQzLjQtMTEuMyA1NS41LTQ1LjRsNTMuMS0xNDktMzAuOCAwLTM1LjYgMTE1LjEtLjYgMC0zNS42LTExNS4xLTMxLjYgMCA1MS4yIDE0MS45LTIuOCA4LjZjLTQuNiAxNC42LTEyLjEgMjAuMy0yNS41IDIwLjMtMi40IDAtNy0uMy04LjktLjVsMCAyMy40YzEuOCAuNCA5LjMgLjcgMTEuNiAuN3oiXQogICAgfTsKICAgIGZhQXJ0c3RhdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhcnRzdGF0aW9uIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY3N2EiLCAiTTIuMSAzNzcuNGw0MyA3NC4zYzQuMyA4LjUgMTAuOCAxNS43IDE4LjkgMjAuN3MxNy40IDcuNiAyNyA3LjZsMjg1LjQgMC01OS4yLTEwMi42LTMxNS4xIDB6TTUwMS45IDM1MEwzMzUuNyA1OS4zYy00LjQtOC4yLTEwLjktMTUuMS0xOC45LTIwUzI5OS43IDMyIDI5MC40IDMybC04OC40IDAgMjU3LjMgNDQ3LjYgNDAuNy03MC41YzEuOS0zLjIgMjEtMjkuNyAyLTU5LjF6TTI3NS4yIDMwNC41bC0xMTUuNS0yMDAtMTE1LjUgMjAwIDIzMSAweiJdCiAgICB9OwogICAgZmFOb2RlSnMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibm9kZS1qcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmM2QzIiwgIk0yMjQuNSA1MDhjLTYuNyAwLTEzLjUtMS44LTE5LjQtNS4ybC02MS43LTM2LjVjLTkuMi01LjItNC43LTctMS43LTggMTIuMy00LjMgMTQuOC01LjIgMjcuOS0xMi43IDEuNC0uOCAzLjItLjUgNC42IC40bDQ3LjQgMjguMWMxLjcgMSA0LjEgMSA1LjcgMEw0MTIgMzY3LjVjMS43LTEgMi44LTMgMi44LTVsMC0yMTMuMmMwLTIuMS0xLjEtNC0yLjktNS4xTDIyNy4zIDM3LjdjLTEuNy0xLTQtMS01LjcgMEwzNy4xIDE0NC4zYy0xLjggMS0yLjkgMy0yLjkgNS4xbDAgMjEzLjFjMCAyIDEuMSA0IDIuOSA0LjlsNTAuNiAyOS4yYzI3LjUgMTMuNyA0NC4zLTIuNCA0NC4zLTE4LjdsMC0yMTAuNGMwLTMgMi40LTUuMyA1LjQtNS4zbDIzLjQgMGMyLjkgMCA1LjQgMi4zIDUuNCA1LjNsMCAyMTAuNWMwIDM2LjYtMjAgNTcuNi01NC43IDU3LjYtMTAuNyAwLTE5LjEgMC00Mi41LTExLjZMMjAuNiAzOTYuMWMtMTItNi45LTE5LjQtMTkuOC0xOS40LTMzLjdsMC0yMTMuMWMwLTEzLjggNy40LTI2LjggMTkuNC0zMy43TDIwNS4xIDljMTEuNy02LjYgMjcuMi02LjYgMzguOCAwTDQyOC42IDExNS43YzEyIDYuOSAxOS40IDE5LjggMTkuNCAzMy43bDAgMjEzLjFjMCAxMy44LTcuNCAyNi43LTE5LjQgMzMuN0wyNDMuOSA1MDIuOGMtNS45IDMuNC0xMi42IDUuMi0xOS40IDUuMnpNMzczLjYgMjk3LjljMC0zOS45LTI3LTUwLjUtODMuNy01OC01Ny40LTcuNi02My4yLTExLjUtNjMuMi0yNC45IDAtMTEuMSA0LjktMjUuOSA0Ny40LTI1LjkgMzcuOSAwIDUxLjkgOC4yIDU3LjcgMzMuOCAuNSAyLjQgMi43IDQuMiA1LjIgNC4ybDI0IDBjMS41IDAgMi45LS42IDMuOS0xLjdzMS41LTIuNiAxLjQtNC4xYy0zLjctNDQuMS0zMy02NC42LTkyLjItNjQuNi01Mi43IDAtODQuMSAyMi4yLTg0LjEgNTkuNSAwIDQwLjQgMzEuMyA1MS42IDgxLjggNTYuNiA2MC41IDUuOSA2NS4yIDE0LjggNjUuMiAyNi43IDAgMjAuNi0xNi42IDI5LjQtNTUuNSAyOS40LTQ4LjkgMC01OS42LTEyLjMtNjMuMi0zNi42LS40LTIuNi0yLjYtNC41LTUuMy00LjVsLTIzLjkgMGMtMyAwLTUuMyAyLjQtNS4zIDUuMyAwIDMxLjEgMTYuOSA2OC4yIDk3LjggNjguMiA1OC40LS4xIDkyLTIzLjIgOTItNjMuNHoiXQogICAgfTsKICAgIGZhVW5jaGFydGVkID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInVuY2hhcnRlZCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlMDg0IiwgIk0xNzEuOCAyMzIuOGMxLjEgMCAyLjEtLjMgMy0uOXMxLjYtMS40IDItMi40YzIuMi05LjggNy40LTE4LjYgMTQuOS0yNS4zIDEuMi0uOCAxLjctMi41IDEuNy00LjEtLjEtLjctLjMtMS4zLS42LTEuOXMtLjktMS4xLTEuNC0xLjRMNzQuNSAxMjguNSAxNDkuMSA4NWMxLjUtLjggMi43LTIgMy42LTMuNXMxLjQtMy4xIDEuNC00LjhjMC0xLjctLjQtMy40LTEuMy00LjlzLTIuMi0yLjctMy43LTMuNEwxMjYuNyA1NS42Yy0xLjUtLjgtMy4xLTEuMi00LjgtMS4ycy0zLjMgLjQtNC44IDEuMkwxNyAxMTMuNmMtMS41IC44LTIuNyAyLTMuNiAzLjVzLTEuNCAzLjEtMS40IDQuOEwxMiAyMzdjMCAxLjcgLjQgMy40IDEuMyA0LjlzMi4yIDIuNyAzLjcgMy40bDIyLjQgMTIuOGMxLjUgLjkgMy4yIDEuMyA1IDEuMiAyLjQgLjEgNC44LS44IDYuNi0yLjUgMS44LTEuOSAyLjgtNC40IDIuOS03bDAtODUuMyAxMTUuOSA2Ny45Yy42IC4zIDEuNCAuNCAyLjEgLjR6TTMyMy40IDM3Ny43Yy0xLjcgLjEtMy40IC41LTUgMS4ybC03NC41IDQzLjEgMC0xMzQuMmMwLTIuOS0yLjktNS44LTYuMi00LjYtOS40IDIuOC0xOS41IDMtMjkgLjQtLjctLjItMS41LS4yLTIuMi0uMXMtMS40IC40LTIgLjktMS4xIDEtMS40IDEuNy0uNSAxLjQtLjUgMi4xbDAgMTMzLjMtNzQuNS00My4xYy0xLjUtLjktMy4yLTEuMy01LTEuMi0yLjUgMC00LjkgMS02LjcgMi44cy0yLjggNC4yLTIuOCA2LjdsMCAyNi4xYzAgMS43IC40IDMuNCAxLjMgNC45czIuMiAyLjcgMy43IDMuNGwxMDAuMiA1Ny42YzEuNSAuOSAzLjIgMS4zIDUgMS4yIDEuNyAwIDMuNC0uNCA1LTEuMmwxMDAuMi01Ny42YzEuNS0uOCAyLjctMiAzLjYtMy41czEuNC0zLjEgMS40LTQuOGwwLTI2LjFjLS44LTQuNi01LjQtOS4xLTEwLjQtOS4xek0yODYuMSA3OGEyMyAyMyAwIDEgMCAwLTQ2IDIzIDIzIDAgMSAwIDAgNDZ6bTYzLjYtMTAuMWEyMyAyMyAwIDEgMCAwIDQ2IDIzIDIzIDAgMSAwIDAtNDZ6bTYzLjIgODMuN2EyMyAyMyAwIDEgMCAwLTQ2IDIzIDIzIDAgMSAwIDAgNDZ6bS02My4yLTkuMmEyMyAyMyAwIDEgMCAwIDQ2IDIzIDIzIDAgMSAwIDAtNDZ6bS02My42IDgzLjJjNC41IDAgOS0xLjMgMTIuOC0zLjlzNi43LTYuMSA4LjUtMTAuMyAyLjItOC44IDEuMy0xMy4zLTMuMS04LjYtNi4zLTExLjgtNy4zLTUuNC0xMS44LTYuMy05LjEtLjQtMTMuMyAxLjMtNy44IDQuNy0xMC4zIDguNS0zLjkgOC4yLTMuOSAxMi44YzAgMyAuNiA2IDEuOCA4LjhzMi45IDUuMyA1IDcuNSA0LjcgMy44IDcuNSA1IDUuOCAxLjggOC44IDEuOGwwIDB6TTIyNCAyNjJjNC41IDAgOS0xLjQgMTIuOC0zLjlzNi43LTYuMSA4LjUtMTAuMyAyLjItOC44IDEuMy0xMy4zLTMuMS04LjYtNi4zLTExLjgtNy4zLTUuNC0xMS44LTYuMy05LjEtLjQtMTMuMyAxLjMtNy44IDQuNy0xMC4zIDguNS0zLjkgOC4yLTMuOSAxMi44YzAgMyAuNiA2IDEuNyA4LjhzMi44IDUuMyA1IDcuNSA0LjcgMy44IDcuNSA1IDUuOCAxLjggOC44IDEuOGwwIDB6bTE4OC45LTgyLjRjLTQuNiAwLTkgMS4zLTEyLjggMy45cy02LjcgNi4xLTguNSAxMC4zLTIuMiA4LjgtMS4zIDEzLjMgMy4xIDguNiA2LjMgMTEuOCA3LjMgNS40IDExLjggNi4zIDkuMSAuNCAxMy4zLTEuMyA3LjgtNC43IDEwLjMtOC41IDMuOS04LjIgMy45LTEyLjhjMC02LjEtMi40LTExLjktNi43LTE2LjNzLTEwLjItNi43LTE2LjMtNi43bDAgMHptMCA3Mi4zYy00LjYgMC05IDEuMy0xMi44IDMuOXMtNi43IDYuMS04LjUgMTAuMy0yLjIgOC44LTEuMyAxMy4zIDMuMSA4LjYgNi4zIDExLjggNy4zIDUuNCAxMS44IDYuMyA5LjEgLjQgMTMuMy0xLjMgNy44LTQuNyAxMC4zLTguNSAzLjktOC4yIDMuOS0xMi44YzAtNi4xLTIuNC0xMS45LTYuNy0xNi4zcy0xMC4yLTYuNy0xNi4zLTYuN2wwIDB6Il0KICAgIH07CiAgICBmYVBsYXlzdGF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInBsYXlzdGF0aW9uIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYzZGYiLCAiTTU3MSAzNzIuM2MtMTEuMyAxNC4yLTM4LjggMjQuMy0zOC44IDI0LjNsLTIwNS4xIDczLjYgMC01NC4zIDE1MC45LTUzLjhjMTcuMS02LjEgMTkuOC0xNC44IDUuOC0xOS40LTEzLjktNC42LTM5LjEtMy4zLTU2LjIgMi45bC0xMDAuNSAzNS41IDAtNTYuNGMyMy4yLTcuOCA0Ny4xLTEzLjYgNzUuNy0xNi44IDQwLjktNC41IDkwLjkgLjYgMTMwLjIgMTUuNSA0NC4yIDE0IDQ5LjIgMzQuNyAzOCA0OC45ek0zNDYuNiAyNzkuOGwwLTEzOWMwLTE2LjMtMy0zMS4zLTE4LjMtMzUuNi0xMS43LTMuOC0xOSA3LjEtMTkgMjMuNGwwIDM0Ny45LTkzLjgtMjkuOCAwLTQxNC43YzM5LjkgNy40IDk4IDI0LjkgMTI5LjIgMzUuNCA3OS41IDI3LjMgMTA2LjQgNjEuMyAxMDYuNCAxMzcuOCAwIDc0LjUtNDYgMTAyLjgtMTA0LjUgNzQuNnpNNDMuMyA0MTAuMmMtNDUuNC0xMi44LTUzLTM5LjUtMzIuMy01NC44IDE5LjEtMTQuMiA1MS43LTI0LjkgNTEuNy0yNC45bDEzNC41LTQ3LjggMCA1NC41LTk2LjggMzQuNmMtMTcuMSA2LjEtMTkuNyAxNC44LTUuOCAxOS40czM5LjEgMy4zIDU2LjItMi45bDQ2LjQtMTYuOSAwIDQ4LjhjLTUxLjYgOS4zLTEwMS40IDcuMy0xNTMuOS0xMHoiXQogICAgfTsKICAgIGZhTWljcm9ibG9nID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1pY3JvYmxvZyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlMDFhIiwgIk0zOTkuOCAzNjIuMmMyOS41LTM0LjcgNDcuMS03OC4zIDQ3LjEtMTI1LjggMC0xMTMtOTkuNi0yMDQuNC0yMjIuNS0yMDQuNFMyIDEyMy41IDIgMjM2LjQgMTAxLjYgNDQwLjkgMjI0LjUgNDQwLjljMjcgMCA1My45LTQuNSA3OS40LTEzLjQgMS40LS41IDMtLjUgNC41LS4xczIuNyAxLjQgMy42IDIuNmMxOC42IDI1LjEgNDcuNiA0Mi43IDc5LjkgNDkuOSAxLjEgLjIgMi4zIDAgMy4zLS42czEuNy0xLjYgMS45LTIuOGMuMS0uNiAuMS0xLjMgMC0xLjlzLS40LTEuMi0uOC0xLjdjLTEyLjMtMTYtMTguNy0zNS44LTE4LTU2czguNC0zOS41IDIxLjctNTQuN2wtLjIgLjF6TTMzMCAyMTIuNGwtNTcuMyA0My41IDIwLjggNjguOWMuNCAxLjMgLjQgMi43LS4xIDRzLTEuMiAyLjQtMi4zIDMuMi0yLjQgMS4yLTMuOCAxLjItMi43LS40LTMuOC0xLjJsLTU5LjEtNDEtNTkuMSA0MS4xYy0xLjEgLjgtMi40IDEuMi0zLjggMS4ycy0yLjctLjQtMy44LTEuMi0xLjktMS45LTIuMy0zLjItLjUtMi43LS4xLTRsMjAuOC02OC45LTU3LjMtNDMuNWMtMS4xLS44LTEuOS0xLjktMi4zLTMuMnMtLjQtMi43IDAtNCAxLjItMi40IDIuMy0zLjIgMi40LTEuMyAzLjctMS4zbDcxLjktMS41IDIzLjctNjcuOWMuNC0xLjMgMS4zLTIuNCAyLjQtMy4yczIuNC0xLjIgMy44LTEuMiAyLjcgLjQgMy44IDEuMiAxLjkgMS45IDIuNCAzLjJsMjMuNyA2Ny45IDcxLjkgMS41YzEuNCAwIDIuNyAuNCAzLjggMS4yczEuOSAxLjkgMi4zIDMuMiAuNCAyLjcgMCA0LTEuMiAyLjQtMi4zIDMuM2wwIDB6Il0KICAgIH07CiAgICBmYUdpdGtyYWtlbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnaXRrcmFrZW4iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjNhNiIsICJNNTU3LjcgMTE4LjFjLTIuMy02LjEtOS4zLTkuMi0xNS4zLTYuNi01LjcgMi40LTguNSA4LjktNi4zIDE0LjYgMTAuOSAyOSAxNi45IDYwLjUgMTYuOSA5My4zIDAgMTM0LjYtMTAwLjMgMjQ1LjctMjMwLjIgMjYyLjdsMC0xMjMuN2M3LjktMS41IDE1LjUtMy42IDIzLTYuMmwwIDEwNGMxMDYuNy0yNS45IDE4NS45LTEyMi4xIDE4NS45LTIzNi44IDAtOTEuOC01MC44LTE3MS44LTEyNS44LTIxMy4zLTUuNy0zLjItMTMtLjktMTUuOSA1LTIuNyA1LjUtLjYgMTIuMiA0LjcgMTUuMSA2Ny45IDM3LjYgMTEzLjkgMTEwIDExMy45IDE5My4yIDAgOTMuMy01Ny45IDE3My4xLTEzOS44IDIwNS40bDAtOTIuMmMxNC4yLTQuNSAyNC45LTE3LjcgMjQuOS0zMy41IDAtMTMuMS02LjgtMjQuNC0xNy4zLTMwLjUgOC4zLTc5LjUgNDQuNS01OC42IDQ0LjUtODMuOWwwLTE0LjdjMC0zOC04Ny45LTE2MS44LTEyOS0xNjQuNy0yLjUtLjItNS0uMi03LjYgMC00MS4yIDMtMTI5LjEgMTI2LjctMTI5LjEgMTY0LjdsMCAxNC44YzAgMjUuMyAzNi4zIDQuMyA0NC41IDgzLjktMTAuNiA2LjEtMTcuMyAxNy40LTE3LjMgMzAuNSAwIDE1LjggMTAuNiAyOSAyNC44IDMzLjVsMCA5Mi4yYy04MS45LTMyLjItMTM5LjgtMTEyLTEzOS44LTIwNS40IDAtODMuMSA0Ni0xNTUuNSAxMTMuOS0xOTMuMiA1LjQtMyA3LjQtOS42IDQuNy0xNS4xLTIuOS01LjktMTAuMS04LjItMTUuOS01LTc1IDQxLjUtMTI1LjggMTIxLjUtMTI1LjggMjEzLjMgMCAxMTQuNyA3OS4yIDIxMC44IDE4NS45IDIzNi44bDAtMTA0YzcuNiAyLjUgMTUuMSA0LjYgMjMgNi4ybDAgMTIzLjdjLTEyOS44LTE3LTIzMC4yLTEyOC4xLTIzMC4yLTI2Mi43IDAtMzIuOCA2LTY0LjMgMTYuOS05My4zIDIuMi01LjgtLjYtMTIuMi02LjMtMTQuNi02LTIuNi0xMyAuNC0xNS4zIDYuNi0xMS44IDMxLjUtMTguMyA2NS42LTE4LjMgMTAxLjMgMCAxNTUuMSAxMjIuNiAyODEuNiAyNzYuMyAyODcuOGwwLTE0NS45YzYuOCAuNCAxNSAuNSAyMy40IDBsMCAxNDUuOGMxNTMuNy02LjEgMjc2LjMtMTMyLjYgMjc2LjMtMjg3LjcgMC0zNS43LTYuNS02OS44LTE4LjMtMTAxLjR6TTM1Ny45IDMyMi45YTIzLjcgMjMuNyAwIDEgMSAwLTQ3LjQgMjMuNyAyMy43IDAgMSAxIDAgNDcuNHpNMjE4LjEgMjc1LjRhMjMuNyAyMy43IDAgMSAxIDAgNDcuNCAyMy43IDIzLjcgMCAxIDEgMC00Ny40eiJdCiAgICB9OwogICAgZmFUZWxlZ3JhbSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ0ZWxlZ3JhbSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYyNDYyLCAidGVsZWdyYW0tcGxhbmUiXSwgImYyYzYiLCAiTTI1NiA4YTI0OCAyNDggMCAxIDAgMCA0OTYgMjQ4IDI0OCAwIDEgMCAwLTQ5NnpNMzcxIDE3Ni43Yy0zLjcgMzkuMi0xOS45IDEzNC40LTI4LjEgMTc4LjMtMy41IDE4LjYtMTAuMyAyNC44LTE2LjkgMjUuNC0xNC40IDEuMy0yNS4zLTkuNS0zOS4zLTE4LjctMjEuOC0xNC4zLTM0LjItMjMuMi01NS4zLTM3LjItMjQuNS0xNi4xLTguNi0yNSA1LjMtMzkuNSAzLjctMy44IDY3LjEtNjEuNSA2OC4zLTY2LjcgLjItLjcgLjMtMy4xLTEuMi00LjRzLTMuNi0uOC01LjEtLjVjLTIuMiAuNS0zNy4xIDIzLjUtMTA0LjYgNjkuMS05LjkgNi44LTE4LjkgMTAuMS0yNi45IDkuOS04LjktLjItMjUuOS01LTM4LjYtOS4xLTE1LjUtNS0yNy45LTcuNy0yNi44LTE2LjMgLjYtNC41IDYuNy05IDE4LjQtMTMuNyA3Mi4zLTMxLjUgMTIwLjUtNTIuMyAxNDQuNi02Mi4zIDY4LjktMjguNiA4My4yLTMzLjYgOTIuNS0zMy44IDIuMSAwIDYuNiAuNSA5LjYgMi45IDIgMS43IDMuMiA0LjEgMy41IDYuNyAuNSAzLjIgLjYgNi41IC40IDkuOHoiXQogICAgfTsKICAgIGZhVGVsZWdyYW1QbGFuZSA9IGZhVGVsZWdyYW07CiAgICBmYUl0dW5lc05vdGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaXR1bmVzLW5vdGUiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjNiNSIsICJNMzgxLjkgMzg4LjJjLTYuNCAyNy40LTI3LjIgNDIuOC01NS4xIDQ4LTI0LjUgNC41LTQ0LjkgNS42LTY0LjUtMTAuMi0yMy45LTIwLjEtMjQuMi01My40LTIuNy03NC40IDE3LTE2LjIgNDAuOS0xOS41IDc2LjgtMjUuOCA2LTEuMSAxMS4yLTIuNSAxNS42LTcuNCA2LjQtNy4yIDQuNC00LjEgNC40LTE2My4yIDAtMTEuMi01LjUtMTQuMy0xNy0xMi4zLTguMiAxLjQtMTg1LjcgMzQuNi0xODUuNyAzNC42LTEwLjIgMi4yLTEzLjQgNS4yLTEzLjQgMTYuNyAwIDIzNC43IDEuMSAyMjMuOS0yLjUgMjM5LjUtNC4yIDE4LjItMTUuNCAzMS45LTMwLjIgMzkuNS0xNi44IDkuMy00Ny4yIDEzLjQtNjMuNCAxMC40LTQzLjItOC4xLTU4LjQtNTgtMjkuMS04Ni42IDE3LTE2LjIgNDAuOS0xOS41IDc2LjgtMjUuOCA2LTEuMSAxMS4yLTIuNSAxNS42LTcuNCAxMC4xLTExLjUgMS44LTI1Ni42IDUuMi0yNzAuMiAuOC01LjIgMy05LjYgNy4xLTEyLjkgNC4yLTMuNSAxMS44LTUuNSAxMy40LTUuNSAyMDQtMzguMiAyMjguOS00My4xIDIzMi40LTQzLjEgMTEuNS0uOCAxOC4xIDYgMTguMSAxNy42IC4yIDM0NC41IDEuMSAzMjYtMS44IDMzOC41eiJdCiAgICB9OwogICAgZmFMZXNzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImxlc3MiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjQxZCIsICJNNjEzLjIgMjE5YzAtMjAuNSAzLjItMzIuNiAzLjItNTQuNiAwLTM0LjItMTIuNi00NS4yLTQwLjUtNDUuMmwtMjAuNSAwIDAgMjQuMiA2LjMgMGMxNC4yIDAgMTcuMyA0LjcgMTcuMyAyMi4xIDAgMTYuMy0xLjYgMzIuNi0xLjYgNTEuNSAwIDI0LjIgNy45IDMzLjYgMjMuNiAzNy4zbDAgMS42Yy0xNS44IDMuNy0yMy42IDEzLjEtMjMuNiAzNy4zIDAgMTguOSAxLjYgMzQuMiAxLjYgNTEuNSAwIDE3LjktMy43IDIyLjYtMTcuMyAyMi42bDAgLjUtNi4zIDAgMCAyNS4yIDIwLjUgMGMyNy44IDAgNDAuNS0xMSA0MC41LTQ1LjIgMC0yMi42LTMuMi0zNC4yLTMuMi01NC42IDAtMTEgNi44LTIyLjYgMjcuMy0yMy42bDAtMjcuM2MtMjAuNS0uNy0yNy4zLTEyLjMtMjcuMy0yMy4zek01MDcuNiAyNTFjLTE1LjgtNi4zLTMwLjUtMTAtMzAuNS0yMC41IDAtNy45IDYuMy0xMi42IDE3LjktMTIuNnMyMi4xIDQuNyAzMy42IDEzLjFsMjEtMjcuOGMtMTMuMS0xMC0zMS0yMC41LTU1LjItMjAuNS0zNS43IDAtNTkuOSAyMC41LTU5LjkgNDkuNCAwIDI1LjcgMjIuNiAzOC45IDQxLjUgNDYuMiAxNi4zIDYuMyAzMi4xIDExLjYgMzIuMSAyMi4xIDAgNy45LTYuMyAxMy4xLTIwLjUgMTMuMS0xMy4xIDAtMjYuMy01LjMtNDAuNS0xNi4zbC0yMSAzMC41YzE1LjggMTMuMSAzOS45IDIyLjEgNTkuOSAyMi4xIDQyIDAgNjQuNi0yMi4xIDY0LjYtNTFzLTIyLjUtNDEtNDMtNDcuOHpNMTQ4LjcgMzEwLjRjLTMuNyAwLTguNC0zLjItOC40LTEzLjFsMC0xNzguMi03NC42IDBjLTI4LjQgMC00MSAxMS00MSA0NS4yIDAgMjIuNiAzLjIgMzUuMiAzLjIgNTQuNiAwIDExLTYuOCAyMi42LTI3LjMgMjMuNmwwIDI3LjNjMjAuNSAuNSAyNy4zIDEyLjEgMjcuMyAyMy4xIDAgMTkuNC0zLjIgMzEtMy4yIDUzLjYgMCAzNC4yIDEyLjYgNDUuMiA0MC41IDQ1LjJsMjAuNSAwIDAtMjQuMi02LjMgMGMtMTMuMSAwLTE3LjMtNS4zLTE3LjMtMjIuNnMxLjYtMzIuMSAxLjYtNTEuNWMwLTI0LjItNy45LTMzLjYtMjMuNi0zNy4zbDAtMS42YzE1LjgtMy43IDIzLjYtMTMuMSAyMy42LTM3LjMgMC0xOC45LTEuNi0zNC4yLTEuNi01MS41czMuNy0yMi4xIDE3LjMtMjIuMWwxNC4xIDAgMCAxNTAuOGMwIDMyLjEgMTEgNTMuMSA0My4xIDUzLjEgMTAgMCAxNy45LTEuNiAyMy42LTMuN2wtNS4zLTM0LjJjLTMuMSAuOC00LjYgLjgtNi4yIC44ek0zODAuNCAyNTFjLTE2LjMtNi4zLTMxLTEwLTMxLTIwLjUgMC03LjkgNi4zLTEyLjYgMTcuOS0xMi42czIyLjEgNC43IDMzLjYgMTMuMWwyMS0yNy44Yy0xMy4xLTEwLTMxLTIwLjUtNTUuMi0yMC41LTM1LjcgMC01OS45IDIwLjUtNTkuOSA0OS40IDAgMjUuNyAyMi42IDM4LjkgNDEuNSA0Ni4yIDE2LjMgNi4zIDMyLjEgMTEuNiAzMi4xIDIyLjEgMCA3LjktNi4zIDEzLjEtMjAuNSAxMy4xLTEzLjEgMC0yNi4zLTUuMy00MC41LTE2LjNsLTIwLjUgMzAuNWMxNS44IDEzLjEgMzkuOSAyMi4xIDU5LjkgMjIuMSA0MiAwIDY0LjYtMjIuMSA2NC42LTUxIC4xLTI4LjktMjIuNS00MS00My00Ny44em0tMTU1LTY4LjhjLTM4LjQgMC03NS4xIDMyLjEtNzQuMSA4Mi41IDAgNTIgMzQuMiA4Mi41IDc5LjMgODIuNSAxOC45IDAgMzkuOS02LjggNTYuMi0xNy45TDI3MSAzMDEuNWMtMTEuNiA2LjgtMjIuNiAxMC0zNC4yIDEwLTIxIDAtMzcuMy0xMC00MS41LTM0LjJsOTUuMiAwYy41LTMuNyAxLjYtMTEgMS42LTE5LjQgLjYtNDIuNi0yMi42LTc1LjctNjYuNy03NS43em0tMzAgNjYuMmMzLjItMjEgMTUuOC0zMSAzMC41LTMxIDE4LjkgMCAyNi4zIDEzLjEgMjYuMyAzMWwtNTYuOCAweiJdCiAgICB9OwogICAgZmFGaXJlZm94ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImZpcmVmb3giLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjI2OSIsICJNNTAzLjUgMjQxLjVjLS4xLTEuNi0uMi0zLjEtLjItNC43bDAtLjEtLjQtNC43IDAtLjFjLTEuMy0xMy45LTMuNy0yNy43LTcuMy00MS4yIDAtLjEgMC0uMS0uMS0uMmwtMS4xLTRjLS4xLS4yLS4xLS41LS4yLS42LS40LTEuMi0uNy0yLjUtMS4xLTMuNy0uMS0uMi0uMS0uNi0uMi0uOC0uNC0xLjItLjctMi40LTEuMS0zLjUtLjEtLjQtLjItLjYtLjQtMS0uNC0xLjItLjctMi4zLTEuMi0zLjVsLS40LTEuMWMtLjQtMS4xLS44LTIuMy0xLjItMy40LS4xLS4zLS4yLS43LS40LTEtLjUtMS4xLS44LTIuMy0xLjMtMy40LS4xLS4yLS4yLS42LS40LS44LS41LTEuMi0xLTIuMy0xLjQtMy41IDAtLjEtLjEtLjItLjEtLjQtMS42LTMuOC0zLjItNy43LTUtMTEuNGwtLjQtLjdjLS41LTEtLjgtMS44LTEuMy0yLjYtLjItLjUtLjUtMS4xLS43LTEuNi0uNC0uOC0uOC0xLjYtMS4yLTIuNC0uNC0uNi0uNi0xLjItMS0xLjhzLS44LTEuNC0xLjItMi4zYy0uNC0uNi0uNy0xLjMtMS4xLTEuOXMtLjgtMS40LTEuMi0yLjJjLS40LS43LS44LTEuNC0xLjItMi0uNC0uNy0uOC0xLjMtMS4yLTJzLS44LTEuMy0xLjItMi0uOC0xLjMtMS4yLTEuOS0uOC0xLjQtMS4zLTIuMmMtLjQtLjYtLjgtMS4yLTEuMi0xLjhsLTEuNC0yLjFjLS40LS42LS44LTEuMi0xLjItMS44LS41LS43LTEuMS0xLjYtMS42LTIuMy0uNC0uNS0uNy0xLjEtMS4xLTEuNmwtMS44LTIuNWMtLjQtLjUtLjYtLjgtMS0xLjMtMS0xLjMtMS44LTIuNS0yLjgtMy43LTcuMi05LjQtMTUtMTguMy0yMy41LTI2LjYtNS43LTYtMTEuOC0xMS41LTE4LjMtMTYuNy00LTMuNS04LjItNi43LTEyLjUtOS44LTcuNy01LjgtMTYtMTAuOC0yNC42LTE1LjEtMi40LTEuMy00LjgtMi41LTcuMi0zLjctMTcuNy04LjYtMzYuMy0xNS4yLTU1LjQtMTkuNi0xLjktLjQtMy44LS44LTUuNi0xLjJsLS4xIDBjLTEtLjEtMS44LS40LTIuOC0uNS0xMi41LTIuNC0yNS4yLTMuNy0zOC00bC0xMC42IDBjLTE1LjMgLjItMzAuNSAxLjktNDUuNSA1LTMzLjYgNy4xLTYzLjIgMjEuMi04Mi45IDM5LTEuMSAxLTEuOSAxLjctMi40IDIuMmwtLjUgLjUgLjEgMGMwIDAgLjEgMCAuMSAwczAtLjEgMC0uMWwtLjEgLjFjLjEtLjEgLjEtLjEgLjItLjEgMTQuNi04LjggMzQuOS0xNiA0OS40LTE5LjZsNS45LTEuNGMuNC0uMSAuOC0uMSAxLjItLjIgMS43LS40IDMuNC0uNyA1LjItMS4xIC4yIDAgLjYtLjEgLjgtLjEgNjQuMi0xMS43IDEzMi42IDcuNSAxODAuMiA1MyAxMC4zIDkuOCAxOS4zIDIwLjggMjYuOSAzMi44IDMwLjQgNDkuMiAyNy41IDExMS4xIDMuOCAxNDcuNi0zNC40IDUzLTExMS40IDcxLjMtMTU5IDI0LjgtMTYtMTUuNS0yNS4yLTM2LjctMjUuNi01OS0uMi0xMC43IDItMjEuMiA2LjItMzEgMS43LTMuOCAxMy4xLTI1LjcgMTguMi0yNC42LTEzLjEtMi44LTM3LjUgMi42LTU0LjcgMjguMi0xNS40IDIyLjktMTQuNSA1OC4yLTUgODMuMy02LTEyLjQtMTAuMS0yNS42LTEyLjEtMzkuMi0xMi4yLTgyLjYgNDMuMy0xNTMgOTQuMy0xNzAuNS0yNy41LTI0LTk2LjUtMjIuMy0xNDcuNyAxNS40LTI5LjkgMjItNTEuMiA1My4yLTYyLjUgOTAuNCAxLjctMjAuOSA5LjYtNTIuMSAyNS44LTgzLjktMTcuMiA4LjktMzkgMzctNDkuOCA2Mi45LTE1LjYgMzcuNC0yMSA4Mi4yLTE2LjEgMTI0LjggLjQgMy4yIC43IDYuNCAxLjEgOS42IDE5LjkgMTE3LjEgMTIyIDIwNi40IDI0NC44IDIwNi40IDEzNy4xIDAgMjQ4LjMtMTExLjIgMjQ4LjMtMjQ4LjQtLjEtNC41LS4yLTkuMS0uNS0xMy41eiJdCiAgICB9OwogICAgZmFLYWdnbGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAia2FnZ2xlIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbXSwgImY1ZmEiLCAiTTMwNC4yIDUwMS41TDE1OC40IDMyMC4zIDI5OC4yIDE4NWMyLjYtMi43IDEuNy0xMC41LTUuMy0xMC41bC02OS4yIDBjLTMuNSAwLTcgMS44LTEwLjUgNS4zbC0xMzIuMyAxMzMuNyAwLTMwNmMwLTUtMi41LTcuNS03LjUtNy41TDIxLjUgMEMxNi41IDAgMTQgMi41IDE0IDcuNWwwIDQ5N2MwIDUgMi41IDcuNSA3LjUgNy41bDUxLjkgMGM1IDAgNy41LTIuNSA3LjUtNy41bDAtMTA5IDMwLjgtMjkuMyAxMTAuNSAxNDAuNmMzIDMuNSA2LjUgNS4zIDEwLjUgNS4zbDY2LjkgMGMzLjUgMCA1LjUtMSA2LTNsLTEuNC03LjZ6Il0KICAgIH07CiAgICBmYUZhY2Vib29rTWVzc2VuZ2VyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImZhY2Vib29rLW1lc3NlbmdlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMzlmIiwgIk0yNTYuNiA4Yy0xNDAgMC0yNDguNiAxMDIuMy0yNDguNiAyNDAuNiAwIDcyLjMgMjkuNyAxMzQuOCA3OC4xIDE3Ny45IDguMyA3LjUgNi42IDExLjkgOCA1OC4yIC4xIDMuMiAxIDYuNCAyLjYgOS4yczMuOSA1LjIgNi43IDYuOSA1LjkgMi44IDkuMSAzIDYuNS0uMyA5LjUtMS42QzE3NC45IDQ3OSAxNzUuNiA0NzcuMiAxODQuNiA0NzkuNiAzMzcuOCA1MjEuOCA1MDQgNDIzLjcgNTA0IDI0OC42IDUwNCAxMTAuMyAzOTYuNiA4IDI1Ni42IDh6TTQwNS44IDE5My4xbC03MyAxMTUuNmMtMi44IDQuMy02LjQgOC4xLTEwLjYgMTFzLTkuMSA0LjgtMTQuMSA1LjgtMTAuMyAuOC0xNS4zLS40LTkuNy0zLjQtMTMuOC02LjRsLTU4LjEtNDMuNWMtMi42LTEuOS01LjgtMy05LTNzLTYuNCAxLjEtOSAzbC03OC40IDU5LjRjLTEwLjUgNy45LTI0LjItNC42LTE3LjEtMTUuN2w3My0xMTUuNmMyLjgtNC4zIDYuNC04LjEgMTAuNi0xMXM5LjEtNC44IDE0LjEtNS44IDEwLjMtLjggMTUuMyAuNCA5LjcgMy40IDEzLjkgNi40bDU4LjEgNDMuNWMyLjYgMS45IDUuOCAzIDkgM3M2LjQtMS4xIDktM2w3OC40LTU5LjRjMTAuNC04IDI0LjEgNC41IDE3LjEgMTUuNnoiXQogICAgfTsKICAgIGZhQXVkaWJsZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhdWRpYmxlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYzNzMiLCAiTTY0MCAxOTkuOWwwIDU0LTMyMCAyMDAtMzIwLTE5OS45IDAtNTQgMzIwIDIwMCAzMjAtMjAwLjF6bS0xOTQuNSA3Mmw0Ny4xLTI5LjRjLTM3LjItNTUuOC0xMDAuNy05Mi42LTE3Mi43LTkyLjZzLTEzNS41IDM2LjctMTcyLjYgOTIuNGwuMyAwYzIuNS0yLjMgNS4xLTQuNSA3LjctNi43IDg5LjctNzQuNCAyMTkuNC01OC4xIDI5MC4yIDM2LjN6TTIyNS40IDI5MC43YzE2LjktMTEuOSAzNi41LTE4LjcgNTcuNC0xOC43IDM0LjQgMCA2NS4yIDE4LjQgODYuNCA0Ny42bDQ1LjQtMjguNGMtMjAuOS0yOS45LTU1LjYtNDkuNS05NC44LTQ5LjUtMzguOSAwLTczLjQgMTkuNC05NC40IDQ5ek0xMDMuNiAxNjEuMUMyMzUuNCA1Ni44IDQyMS44IDg0LjcgNTIxLjEgMjIzLjJsLjcgMSA0OC44LTMwLjRjLTUzLjUtODEuNy0xNDUuOC0xMzUuNy0yNTAuNy0xMzUuNy0xMDMuNSAwLTE5Ni42IDUzLjUtMjUwLjUgMTM1LjYgOS45LTEwLjUgMjIuNy0yMy41IDM0LjItMzIuNnoiXQogICAgfTsKICAgIGZhUGF0cmVvbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwYXRyZW9uIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzZDkiLCAiTTQ5MCAxNTMuOGMtLjEtNjUuNC01MS0xMTktMTEwLjctMTM4LjMtNzQuMi0yNC0xNzItMjAuNS0yNDIuOSAxMi45LTg1LjggNDAuNS0xMTIuOCAxMjkuMy0xMTMuOCAyMTcuOC0uOCA3Mi44IDYuNCAyNjQuNCAxMTQuNiAyNjUuOCA4MC4zIDEgOTIuMy0xMDIuNSAxMjkuNS0xNTIuMyAyNi40LTM1LjUgNjAuNS00NS41IDEwMi40LTU1LjkgNzItMTcuOCAxMjEuMS03NC43IDEyMS0xNTBsLS4xIDB6Il0KICAgIH07CiAgICBmYVZudiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ2bnYiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjQwYiIsICJNMTA0LjkgMzUyYy0zNC4xIDAtNDYuNC0zMC40LTQ2LjQtMzAuNEwyLjYgMjEwLjFTLTcuOCAxOTIgMTMgMTkybDMyLjggMGMxMC40IDAgMTMuMiA4LjcgMTguOCAxOC4xbDM2LjcgNzQuNXM1LjIgMTMuMSAyMS4xIDEzLjEgMjEuMS0xMy4xIDIxLjEtMTMuMWwzNi43LTc0LjVjNS42LTkuNSA4LjQtMTguMSAxOC44LTE4LjFsMzIuOCAwYzIwLjggMCAxMC40IDE4LjEgMTAuNCAxOC4xTDE4Ni40IDMyMS42UzE3NC4yIDM1MiAxNDAgMzUybC0zNS4xIDB6bTM5NSAwYy0zNC4xIDAtNDYuNC0zMC40LTQ2LjQtMzAuNEwzOTcuNiAyMTAuMVMzODcuMiAxOTIgNDA4IDE5MmwzMi44IDBjMTAuNCAwIDEzLjIgOC43IDE4LjggMTguMWwzNi43IDc0LjVzNS4yIDEzLjEgMjEuMSAxMy4xIDIxLjEtMTMuMSAyMS4xLTEzLjFsMzYuOC03NC41YzUuNi05LjUgOC40LTE4LjEgMTguOC0xOC4xbDMyLjkgMGMyMC44IDAgMTAuNCAxOC4xIDEwLjQgMTguMUw1ODEuNSAzMjEuNlM1NjkuMyAzNTIgNTM1LjEgMzUybC0zNS4yIDB6TTMzNy42IDE5MmMzNC4xIDAgNDYuNCAzMC40IDQ2LjQgMzAuNGw1NS45IDExMS41UzQ1MC4zIDM1MiA0MjkuNSAzNTJsLTMyLjggMGMtMTAuNCAwLTEzLjItOC43LTE4LjgtMTguMWwtMzYuNy03NC41cy01LjItMTMuMS0yMS4xLTEzLjEtMjEuMSAxMy4xLTIxLjEgMTMuMWwtMzYuNyA3NC41Yy01LjYgOS40LTguNCAxOC4xLTE4LjggMTguMWwtMzIuOSAwYy0yMC44IDAtMTAuNC0xOC4xLTEwLjQtMTguMWw1NS45LTExMS41UzI2OC4zIDE5MiAzMDIuNSAxOTJsMzUuMSAweiJdCiAgICB9OwogICAgZmFQYWdlbGluZXMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicGFnZWxpbmVzIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYxOGMiLCAiTTM4NC4xIDMxMi43Yy01NS4xIDEzNi43LTE4Ny4xIDU0LTE4Ny4xIDU0LTQwLjUgODEuOC0xMDcuNCAxMzQuNC0xODQuNiAxMzQuNy0xNi4xIDAtMTYuNi0yNC40IDAtMjQuNCA2NC40LS4zIDEyMC41LTQyLjcgMTU3LjItMTEwLjEtNDEuMSAxNS45LTExOC42IDI3LjktMTYxLjYtODIuMiAxMDktNDQuOSAxNTkuMSAxMS4yIDE3OC4zIDQ1LjUgOS45LTI0LjQgMTctNTAuOSAyMS42LTc5LjcgMCAwLTEzOS43IDIxLjktMTQ5LjUtOTguMSAxMTkuMS00Ny45IDE1Mi42IDc2LjcgMTUyLjYgNzYuNyAxLjYtMTYuNyAzLjMtNTIuNiAzLjMtNTMuNCAwIDAtMTA2LjMtNzMuNy0zOC4xLTE2NS4yIDEyNC42IDQzIDYxLjQgMTYyLjQgNjEuNCAxNjIuNCAuNSAxLjYgLjUgMjMuOCAwIDMzLjQgMCAwIDQ1LjItODkgMTM2LjQtNTcuNS00LjIgMTM0LTE0MS45IDEwNi40LTE0MS45IDEwNi40LTQuNCAyNy40LTExLjIgNTMuNC0yMCA3Ny41IDAgMCA4My05MS44IDE3Mi0yMHoiXQogICAgfTsKICAgIGZhQW1hem9uID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImFtYXpvbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMjcwIiwgIk0yNTcuNyAxNjIuN2MtNDguNyAxLjgtMTY5LjUgMTUuNS0xNjkuNSAxMTcuNSAwIDEwOS41IDEzOC4zIDExNCAxODMuNSA0My4yIDYuNSAxMC4yIDM1LjQgMzcuNSA0NS4zIDQ2LjhsNTYuOC01NnMtMzIuMy0yNS4zLTMyLjMtNTIuOGwwLTE0Ny4xQzM0MS41IDg5IDMxNyAzMiAyMjkuMiAzMiAxNDEuMiAzMiA5NC41IDg3IDk0LjUgMTM2LjNsNzMuNSA2LjhjMTYuMy00OS41IDU0LjItNDkuNSA1NC4yLTQ5LjUgNDAuNy0uMSAzNS41IDI5LjggMzUuNSA2OS4xem0wIDg2LjhjMCA4MC04NC4yIDY4LTg0LjIgMTcuMiAwLTQ3LjIgNTAuNS01Ni43IDg0LjItNTcuOGwwIDQwLjZ6TTM5My43IDQxM2MtNy43IDEwLTcwIDY3LTE3NC41IDY3UzM0LjcgNDA4LjUgMTAuMiAzNzljLTYuOC03LjcgMS0xMS4zIDUuNS04LjMgNzMuMyA0NC41IDE4Ny44IDExNy44IDM3Mi41IDMwLjMgNy41LTMuNyAxMy4zIDIgNS41IDEyem0zOS44IDIuMmMtNi41IDE1LjgtMTYgMjYuOC0yMS4yIDMxLTUuNSA0LjUtOS41IDIuNy02LjUtMy44czE5LjMtNDYuNSAxMi43LTU1Yy02LjUtOC4zLTM3LTQuMy00OC0zLjItMTAuOCAxLTEzIDItMTQtLjMtMi4zLTUuNyAyMS43LTE1LjUgMzcuNS0xNy41IDE1LjctMS44IDQxLS44IDQ2IDUuNyAzLjcgNS4xIDAgMjcuMS02LjUgNDMuMXoiXQogICAgfTsKICAgIGZhRW52aXJhID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImVudmlyYSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMjk5IiwgIk0wIDMyYzQ3Ny42IDAgMzY2LjYgMzE3LjMgMzY3LjEgMzY2LjNsODAuOSA4MS43LTI2IDAtNzAuNC03MS4yQzMxMi42IDQxMyAyMjcuMiA0NDMuMyAxMzcuMiAzNzEuOCA0NyAzMDAuMyA1MiAyMTQuNyAwIDMyek03OS43IDc4Yy00OS43LTIzLjUtNS4yIDkuMi01LjIgOS4yIDQ1LjIgMzEuMiA2NiA3My43IDkwLjIgMTE5LjkgMzEuNSA2MC4yIDc5IDEzOS43IDE0NC4yIDE2Ny43IDY1IDI4IDM0LjIgMTIuNSA2LTguNS0yOC4yLTIxLjItNjguMi04Ny05MS0xMzAuMi0zMS43LTYwLTYxLTExOC42LTE0NC4yLTE1OC4xeiJdCiAgICB9OwogICAgZmFMaW5vZGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibGlub2RlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyYjgiLCAiTTM2Ni4zIDE4Ni45bC01OS41IDM2LjktLjggMzYuOS0yOS4zLTE5LjMtMzkuNCAyNC4zYzIuMiA1NS4yIDIuNSA1OS4zIDIuNSA1OS41bC05Ny4yIDY1LjQtMTUuMS0xMDQuNyAxMDguMS02Mi00MC4yLTI2LTc1LjQgMzguNS0yMS0xNDMuMyAxMjktNDkuNC05MS4zLTQzLjYtMTI1LjcgMzkuNCAyNy43IDEzNC45IDQxLjkgMzIuNy0zMS44IDE1LjEgMjAuOSAxMDEuNCAyOS4zIDI3LjctMjAuOSAxMi42IDE2LjggNzguOCA2Ni4yIDY5LjZjLTEwLjgtNzQuOC0xMS43LTc4LjYtMTEuNy03OC44bDc3LjktNTUuM0MyNDQgMzY1LjQgMjQyLjMgMzY3IDI0Mi4zIDM2N2wuOCAyNC4zIDMzLjUgMjguNS0uOC03Ny4xIDQ2LjktMzMuNSAyNi44LTE4LjQtMi41IDM2IDI1LjEgMTcuNiA2LjctNzQuNiA1OC43LTQzLjYtNzEuMi0zOS40eiJdCiAgICB9OwogICAgZmFBY2N1c29mdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhY2N1c29mdCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmMzY5IiwgIk0zMjIuMSAyNTJsMC0xLTUxLjItNjUuOHMtMTIgMS42LTI1IDE1LjFjLTkgOS4zLTI0Mi4xIDIzOS4xLTI0My40IDI0MC45LTcgMTAgMS42IDYuOCAxNS43IDEuNyAuOCAwIDExNC41LTM2LjYgMTE0LjUtMzYuNiAuNS0uNi0uMS0uMSAuNi0uNi0uNC01LjEtLjgtMjYuMi0xLTI3LjctLjYtNS4yIDIuMi02LjkgNy04LjlsOTIuNi0zMy44Yy42LS44IDg4LjUtODEuNyA5MC4yLTgzLjN6TTQ4Mi4yIDM3Mi4xYzEzLjMgMTYuMSAyMC43IDEzLjMgMzAuOCA5LjMgMy4yLTEuMiAxMTUuNC00Ny42IDExNy44LTQ4LjkgOC00LjMtMS43LTE2LjctNy4yLTIzLjQtMi4xLTIuNS0yMDUuMS0yNDUuNi0yMDcuMi0yNDguMy05LjctMTIuMi0xNC4zLTEyLjktMzguNC0xMi44LTEwLjIgMC0xMDYuOCAuNS0xMTYuNSAuNi0xOS4yIC4xLTMyLjktLjMtMTkuMiAxNi45IDcuNyA5LjUgMjM0LjIgMjk5LjcgMjM5LjkgMzA2LjZ6bTE1Mi43IDEuNmMtMi4zLS4zLTI0LjYtNC43LTM4LTcuMiAwIDAtMTE1IDUwLjQtMTE3LjUgNTEuNi0xNiA3LjMtMjYuOS0zLjItMzYuNy0xNC42bC01Ny4xLTc0Yy01LjQtLjktNjAuNC05LjYtNjUuMy05LjMtMy4xIC4yLTkuNiAuOC0xNC40IDIuOS00LjkgMi4xLTE0NS4yIDUyLjgtMTUwLjIgNTQuNy01LjEgMi0xMS40IDMuNi0xMS4xIDcuNiAuMiAyLjUgMiAyLjYgNC42IDMuNSAyLjcgLjggMzAwLjkgNjcuNiAzMDggNjkuMSAxNS42IDMuMyAzOC41IDEwLjUgNTMuNiAxLjcgMi4xLTEuMiAxMjMuOC03Ni40IDEyNS44LTc3LjggNS40LTQgNC4zLTYuOC0xLjctOC4yeiJdCiAgICB9OwogICAgZmFFcmxhbmcgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZXJsYW5nIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYzOWQiLCAiTTg3LjIgNTMuNWwtODcuMiAwIDAgNDA1IDEwMC40IDBjLTQ5LjctNTIuNi03OC44LTEyNS4zLTc4LjctMjEyLjEtLjEtNzYuNyAyNC0xNDIuNyA2NS41LTE5Mi45em0yMzguMiA5LjdjLTQ1LjkgLjEtODUuMSAzMy41LTg5LjIgODMuMmwxNjkuOSAwYy0xLjEtNDkuNy0zNC41LTgzLjEtODAuNy04My4yem0yMzAuNy05LjZsLjMgMC0uMS0uMS0uMiAuMXptLjMgMGMzMS40IDQyLjcgNDguNyA5Ny41IDQ2LjIgMTYyLjcgLjUgNiAuNSAxMS43IDAgMjQuMWwtMzcyLjQgMGMtLjIgMTA5LjcgMzguOSAxOTQuOSAxMzguNiAxOTUuMyA2OC41LS4zIDExOC01MSAxNTEuOS0xMDYuMWw5Ni40IDQ4LjJjLTE3LjQgMzAuOS0zNi41IDU3LjgtNTcuOSA4MC44bDgwLjggMCAwLTQwNS04My42IDB6Il0KICAgIH07CiAgICBmYUNjRGlzY292ZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY2MtZGlzY292ZXIiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjFmMiIsICJNNTIwLjQgMTk2LjFjMC03LjktNS41LTEyLjEtMTUuNi0xMi4xbC00LjkgMCAwIDI0LjkgNC43IDBjMTAuMyAwIDE1LjgtNC40IDE1LjgtMTIuOHpNNTI4IDMyTDQ4IDMyQzIxLjUgMzIgMCA1My41IDAgODBMMCA0MzJjMCAyNi41IDIxLjUgNDggNDggNDhsNDgwIDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0zNTJjMC0yNi41LTIxLjUtNDgtNDgtNDh6TTQ4My45IDE3MC45YzIyLjYgMCA1Mi45LTQuMSA1Mi45IDI0LjQgMCAxMi42LTYuNiAyMC43LTE4LjcgMjMuMmwyNS44IDM0LjQtMTkuNiAwLTIyLjItMzIuOC0yLjIgMCAwIDMyLjgtMTYgMCAwLTgyek00MjggMTcxbDQ1LjMgMCAwIDE0LTI5LjMgMCAwIDE4LjIgMjguMyAwIDAgMTMuOC0yOC4zIDAgMCAyMi4yIDI5LjMgMCAwIDEzLjgtNDUuMyAwIDAtODJ6bS02OC43IDBsMjEuOSA1NS4yIDIyLjItNTUuMiAxNy41IDAtMzUuNSA4NC4yLTguNiAwLTM1LTg0LjIgMTcuNSAwem0tNTUuOSA4Ni4yYTQ0LjYgNDQuNiAwIDEgMSAwLTg5LjIgNDQuNiA0NC42IDAgMSAxIDAgODkuMnptLTQ5LjMtODMuMWwwIDE5Yy0yMC4xLTIwLjEtNDYuOC00LjctNDYuOCAxOSAwIDI1IDI3LjUgMzguNSA0Ni44IDE5LjJsMCAxOWMtMjkuNyAxNC4zLTYzLjMtNS43LTYzLjMtMzguMiAwLTMxLjIgMzMuMS01MyA2My4zLTM4em0tOTcuMiA2Ni4zYzExLjQgMCAyMi40LTE1LjMtMy4zLTI0LjQtMTUtNS41LTIwLjItMTEuNC0yMC4yLTIyLjcgMC0yMy4yIDMwLjYtMzEuNCA0OS43LTE0LjNsLTguNCAxMC44Yy0xMC40LTExLjYtMjQuOS02LjItMjQuOSAyLjUgMCA0LjQgMi43IDYuOSAxMi4zIDEwLjMgMTguMiA2LjYgMjMuNiAxMi41IDIzLjYgMjUuNiAwIDI5LjUtMzguOCAzNy40LTU2LjYgMTEuM2wxMC4zLTkuOWMzLjcgNy4xIDkuOSAxMC44IDE3LjUgMTAuOHpNNTUuNCAyNTNsLTIzLjQgMCAwLTgyIDIzLjQgMGMyNi4xIDAgNDQuMSAxNyA0NC4xIDQxLjEgMCAxOC41LTEzLjIgNDAuOS00NC4xIDQwLjl6bTY3LjUgMGwtMTYgMCAwLTgyIDE2IDAgMCA4MnpNNTQ0IDQzM2MwIDguMi02LjggMTUtMTUgMTVsLTQwMSAwYzE4OS42LTM1LjYgMzgyLjctMTM5LjIgNDE2LTE2MGwwIDE0NXpNNzQuMSAxOTEuNmMtNS4yLTQuOS0xMS42LTYuNi0yMS45LTYuNmwtNC4yIDAgMCA1NC4yIDQuMiAwYzEwLjMgMCAxNy0yIDIxLjktNi40IDUuNy01LjIgOC45LTEyLjggOC45LTIwLjdzLTMuMi0xNS41LTguOS0yMC41eiJdCiAgICB9OwogICAgZmFTYWZhcmkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2FmYXJpIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyNjciLCAiTTI3NC43IDI3NC43TDIzNy4zIDIzNy4zIDE2NiAzNDYgMjc0LjcgMjc0Ljd6TTI1NiA4YTI0OCAyNDggMCAxIDAgMCA0OTYgMjQ4IDI0OCAwIDEgMCAwLTQ5NnpNNDExLjggMTgyLjhsMTQuOC02LjFjMS0uNCAyLS42IDMuMS0uNnMyLjEgLjIgMy4xIC42IDEuOCAxIDIuNiAxLjcgMS4zIDEuNiAxLjcgMi42IC42IDIgLjYgMy4xLS4yIDIuMS0uNiAzLjEtMSAxLjktMS43IDIuNi0xLjYgMS4zLTIuNiAxLjdMNDE4IDE5Ny42Yy0yIC44LTQuMiAuOC02LjEgMHMtMy41LTIuNC00LjMtNC4zLS44LTQuMiAwLTYuMSAyLjQtMy41IDQuMy00LjN6TTMxNC40IDk0bDYuMS0xNC44Yy44LTIgMi40LTMuNSA0LjMtNC4zczQuMi0uOCA2LjEgMCAzLjUgMi40IDQuMyA0LjMgLjggNC4yIDAgNi4xbC02LjEgMTQuOGMtLjggMi0yLjQgMy41LTQuMyA0LjNzLTQuMiAuOC02LjEgMGMtMS0uNC0xLjktMS0yLjYtMS43cy0xLjMtMS42LTEuNy0yLjYtLjYtMi0uNi0zLjEgLjItMi4xIC42LTMuMXpNMjU2IDYwYzIuMSAwIDQuMiAuOCA1LjcgMi4zUzI2NCA2NS45IDI2NCA2OGwwIDE2YzAgMi4xLS44IDQuMi0yLjMgNS43cy0zLjUgMi4zLTUuNyAyLjMtNC4yLS44LTUuNy0yLjMtMi4zLTMuNS0yLjMtNS43bDAtMTZjMC0yLjEgLjgtNC4yIDIuMy01LjdTMjUzLjkgNjAgMjU2IDYwek0xODEgNzQuOWMxLS40IDItLjYgMy4xLS42czIuMSAuMiAzLjEgLjYgMS45IDEgMi42IDEuNyAxLjMgMS42IDEuNyAyLjZMMTk3LjYgOTRjLjQgMSAuNyAyIC43IDMuMXMtLjIgMi4xLS42IDMuMS0xIDEuOS0xLjcgMi42LTEuNiAxLjQtMi42IDEuOC0yIC42LTMuMSAuNi0yLjEtLjItMy4xLS42LTEuOS0xLTIuNi0xLjgtMS4zLTEuNy0xLjctMi43bC02LjEtMTQuOGMtLjgtMi0uOC00LjIgMC02LjFzMi40LTMuNSA0LjMtNC4zem0tNjMuNiA0Mi41YzEuNS0xLjUgMy41LTIuMyA1LjctMi4zczQuMiAuOCA1LjcgMi4zTDE0MCAxMjguN2MxLjUgMS41IDIuMyAzLjUgMi4zIDUuNnMtLjggNC4xLTIuMyA1LjZjLTEuNSAxLjUtMy41IDIuMy01LjcgMi4zcy00LjItLjgtNS43LTIuM2wtMTEuMy0xMS4zYy0xLjUtMS41LTIuMy0zLjUtMi4zLTUuNnMuOC00LjEgMi4zLTUuNmwwIDB6TTYwIDI1NmMwLTIuMSAuOC00LjIgMi4zLTUuN1M2NS45IDI0OCA2OCAyNDhsMTYgMGMyLjEgMCA0LjIgLjggNS43IDIuM3MyLjMgMy41IDIuMyA1LjctLjggNC4yLTIuMyA1LjctMy41IDIuMy01LjcgMi4zbC0xNiAwYy0yLjEgMC00LjItLjgtNS43LTIuM1M2MCAyNTguMSA2MCAyNTZ6bTQwLjIgNzMuMmwtMTQuOCA2LjFjLTEgLjQtMiAuNi0zLjEgLjZzLTIuMS0uMi0zLjEtLjYtMS45LTEtMi42LTEuNy0xLjMtMS42LTEuNy0yLjYtLjYtMi0uNi0zLjEgLjItMi4xIC42LTMuMSAxLTEuOSAxLjctMi42IDEuNi0xLjMgMi42LTEuN0w5NCAzMTQuNGMyLS44IDQuMi0uOCA2LjEgMHMzLjUgMi40IDQuMyA0LjMgLjggNC4yIDAgNi4xLTIuNCAzLjUtNC4zIDQuM3ptNC4zLTEzNmMtLjQgMS0xIDEuOS0xLjcgMi42cy0xLjYgMS4zLTIuNiAxLjctMiAuNi0zLjEgLjYtMi4xLS4yLTMuMS0uNmwtMTQuOC02LjFjLTItLjgtMy41LTIuNC00LjMtNC4zcy0uOC00LjIgMC02LjEgMi40LTMuNSA0LjMtNC4zIDQuMi0uOCA2LjEgMGwxNC44IDYuMWMyIC44IDMuNSAyLjQgNC4zIDQuM3MuOCA0LjIgMCA2LjFsMCAwek0xOTcuNiA0MThsLTYuMSAxNC44Yy0uNCAxLTEgMS45LTEuNyAyLjZzLTEuNiAxLjMtMi42IDEuNy0yIC42LTMuMSAuNi0yLjEtLjItMy4xLS42LTEuOS0xLTIuNi0xLjctMS4zLTEuNi0xLjctMi42LS42LTItLjYtMy4xIC4yLTIuMSAuNi0zLjFsNi4xLTE0LjhjLjQtMSAxLTEuOSAxLjctMi43czEuNi0xLjQgMi42LTEuOCAyLS42IDMuMS0uNiAyLjEgLjIgMy4xIC42IDEuOSAxIDIuNiAxLjggMS4zIDEuNyAxLjcgMi42IC42IDIgLjYgMy4xLS4yIDIuMS0uNyAzLjF6TTI2NCA0NDRjMCAyLjEtLjggNC4yLTIuMyA1LjdzLTMuNSAyLjMtNS43IDIuMy00LjItLjgtNS43LTIuMy0yLjMtMy41LTIuMy01LjdsMC0xNmMwLTIuMSAuOC00LjIgMi4zLTUuN3MzLjUtMi4zIDUuNy0yLjMgNC4yIC44IDUuNyAyLjMgMi4zIDMuNSAyLjMgNS43bDAgMTZ6bTY3LTYuOWMtMSAuNC0yIC42LTMuMSAuNnMtMi4xLS4yLTMuMS0uNi0xLjktMS0yLjYtMS43LTEuMy0xLjYtMS43LTIuNkwzMTQuNCA0MThjLS44LTItLjgtNC4yIDAtNi4xczIuNC0zLjUgNC4zLTQuMyA0LjItLjggNi4xIDAgMy41IDIuNCA0LjMgNC4zbDYuMSAxNC44Yy44IDIgLjggNC4yIDAgNi4xcy0yLjQgMy41LTQuMyA0LjN6bTYzLjYtNDIuNWMtMS41IDEuNS0zLjUgMi4zLTUuNyAyLjNzLTQuMi0uOC01LjctMi4zTDM3MiAzODMuM2MtMS41LTEuNS0yLjMtMy41LTIuMy01LjZzLjgtNC4xIDIuMy01LjYgMy41LTIuMyA1LjctMi4zIDQuMiAuOCA1LjcgMi4zbDExLjMgMTEuM2MxLjUgMS41IDIuMyAzLjUgMi4zIDUuNnMtLjggNC4xLTIuMyA1LjZsMCAwek0yODYuMiAyODYuMkwxMTAuMyA0MDEuNyAyMjUuOCAyMjUuOCA0MDEuNyAxMTAuMyAyODYuMiAyODYuMnpNNDM3LjEgMzMxYy0uOCAyLTIuNCAzLjUtNC4zIDQuM3MtNC4yIC44LTYuMSAwbC0xNC44LTYuMWMtMi0uOC0zLjUtMi40LTQuMy00LjNzLS44LTQuMiAwLTYuMWMuNC0xIDEtMS45IDEuNy0yLjZzMS42LTEuMyAyLjYtMS43IDItLjYgMy4xLS42IDIuMSAuMiAzLjEgLjZsMTQuOCA2LjFjMiAuOCAzLjUgMi40IDQuMyA0LjNzLjggNC4yIDAgNi4xem02LjktNjdsLTE2IDBjLTIuMSAwLTQuMi0uOC01LjctMi4zcy0yLjMtMy41LTIuMy01LjcgLjgtNC4yIDIuMy01LjcgMy41LTIuMyA1LjctMi4zbDE2IDBjMi4xIDAgNC4yIC44IDUuNyAyLjNzMi4zIDMuNSAyLjMgNS43LS44IDQuMi0yLjMgNS43LTMuNSAyLjMtNS43IDIuM3oiXQogICAgfTsKICAgIGZhU3BhY2VBd2Vzb21lID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNwYWNlLWF3ZXNvbWUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTVhYyIsICJNOTYgMjU2bDMyIDAgMCAyNTYtMTI4IDAgMC0xNjAgMzIgMCAwLTMyIDMyIDAgMC0zMiAzMiAwIDAtMzJ6bTQxNiA5NmwwIDE2MC0xMjggMCAwLTI1NiAzMiAwIDAgMzIgMzIgMCAwIDMyIDMyIDAgMCAzMiAzMiAwek0zMjAgNjRsMzIgMCAwIDM4NC0zMiAwIDAtMzItMTI4IDAgMCAzMi0zMiAwIDAtMzg0IDMyIDAgMC0zMiAzMiAwIDAtMzIgNjQgMCAwIDMyIDMyIDAgMCAzMnptLTMyIDY0bC02NCAwIDAgNjQgNjQgMCAwLTY0eiJdCiAgICB9OwogICAgZmFOb2RlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm5vZGUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjQxOSIsICJNMzE2LjMgNDUyYy0yLjEgMC00LjItLjYtNi4xLTEuNkwyOTEgNDM5Yy0yLjktMS42LTEuNS0yLjItLjUtMi41IDMuOC0xLjMgNC42LTEuNiA4LjctNCAuNC0uMiAxLS4xIDEuNCAuMWwxNC44IDguOGMuNSAuMyAxLjMgLjMgMS44IDBMMzc1IDQwOGMuNS0uMyAuOS0uOSAuOS0xLjZsMC02Ni43YzAtLjctLjMtMS4zLS45LTEuNmwtNTcuOC0zMy4zYy0uNS0uMy0xLjItLjMtMS44IDBsLTU3LjggMzMuM2MtLjYgLjMtLjkgMS0uOSAxLjZsMCA2Ni43YzAgLjYgLjQgMS4yIC45IDEuNWwxNS44IDkuMWM4LjYgNC4zIDEzLjktLjggMTMuOS01LjhsMC02NS45YzAtLjkgLjctMS43IDEuNy0xLjdsNy4zIDBjLjkgMCAxLjcgLjcgMS43IDEuN2wwIDY1LjljMCAxMS41LTYuMiAxOC0xNy4xIDE4LTMuMyAwLTYgMC0xMy4zLTMuNmwtMTUuMi04LjdjLTMuNy0yLjItNi4xLTYuMi02LjEtMTAuNWwwLTY2LjdjMC00LjMgMi4zLTguNCA2LjEtMTAuNWw1Ny44LTMzLjRjMy43LTIuMSA4LjUtMi4xIDEyLjEgMGw1Ny44IDMzLjRjMy43IDIuMiA2LjEgNi4yIDYuMSAxMC41bDAgNjYuN2MwIDQuMy0yLjMgOC40LTYuMSAxMC41bC01Ny44IDMzLjRjLTEuNyAxLjEtMy44IDEuNy02IDEuN3pNMzYzIDM4Ni4yYzAtMTIuNS04LjQtMTUuOC0yNi4yLTE4LjItMTgtMi40LTE5LjgtMy42LTE5LjgtNy44IDAtMy41IDEuNS04LjEgMTQuOC04LjEgMTEuOSAwIDE2LjMgMi42IDE4LjEgMTAuNiAuMiAuOCAuOCAxLjMgMS42IDEuM2w3LjUgMGMuNSAwIC45LS4yIDEuMi0uNSAuMy0uNCAuNS0uOCAuNC0xLjMtMS4yLTEzLjgtMTAuMy0yMC4yLTI4LjgtMjAuMi0xNi41IDAtMjYuMyA3LTI2LjMgMTguNiAwIDEyLjcgOS44IDE2LjEgMjUuNiAxNy43IDE4LjkgMS45IDIwLjQgNC42IDIwLjQgOC4zIDAgNi41LTUuMiA5LjItMTcuNCA5LjItMTUuMyAwLTE4LjctMy44LTE5LjgtMTEuNC0uMS0uOC0uOC0xLjQtMS43LTEuNGwtNy41IDBjLS45IDAtMS43IC43LTEuNyAxLjcgMCA5LjcgNS4zIDIxLjMgMzAuNiAyMS4zIDE4LjUgMCAyOS03LjIgMjktMTkuOHptNTQuNS01MC4xYzAgNi4xLTUgMTEuMS0xMS4xIDExLjFzLTExLjEtNS0xMS4xLTExLjFjMC02LjMgNS4yLTExLjEgMTEuMS0xMS4xIDYtLjEgMTEuMSA0LjggMTEuMSAxMS4xem0tMS44IDBjMC01LjItNC4yLTkuMy05LjQtOS4zLTUuMSAwLTkuMyA0LjEtOS4zIDkuM3M0LjIgOS40IDkuMyA5LjRjNS4yLS4xIDkuNC00LjMgOS40LTkuNHptLTQuNSA2LjJsLTIuNiAwYy0uMS0uNi0uNS0zLjgtLjUtMy45LS4yLS43LS40LTEuMS0xLjMtMS4xbC0yLjIgMCAwIDUtMi40IDAgMC0xMi41IDQuMyAwYzEuNSAwIDQuNCAwIDQuNCAzLjMgMCAyLjMtMS41IDIuOC0yLjQgMy4xIDEuNyAuMSAxLjggMS4yIDIuMSAyLjggLjEgMSAuMyAyLjcgLjYgMy4zem0tMi44LTguOGMwLTEuNy0xLjItMS43LTEuOC0xLjdsLTIgMCAwIDMuNSAxLjkgMGMxLjYgMCAxLjktMS4xIDEuOS0xLjh6TTEzNy4zIDE5MWMwLTIuNy0xLjQtNS4xLTMuNy02LjRMNzIuMyAxNDkuM2MtMS0uNi0yLjItLjktMy40LTFsLS42IDBjLTEuMiAwLTIuMyAuNC0zLjQgMUwzLjcgMTg0LjZDMS40IDE4NS45IDAgMTg4LjQgMCAxOTFsLjEgOTVjMCAxLjMgLjcgMi41IDEuOCAzLjJzMi41IC43IDMuNyAwTDQyIDI2OC4zYzIuMy0xLjQgMy43LTMuOCAzLjctNi40bDAtNDQuNGMwLTIuNiAxLjQtNS4xIDMuNy02LjRsMTUuNS04LjljMS4yLS43IDIuNC0xIDMuNy0xczIuNiAuMyAzLjcgMWwxNS41IDguOWMyLjMgMS4zIDMuNyAzLjggMy43IDYuNGwwIDQ0LjRjMCAyLjYgMS40IDUuMSAzLjcgNi40bDM2LjQgMjAuOWMxLjEgLjcgMi42IC43IDMuNyAwIDEuMS0uNiAxLjgtMS45IDEuOC0zLjJsLjItOTV6TTQ3Mi41IDg3LjNsMCAxNzYuNGMwIDIuNi0xLjQgNS4xLTMuNyA2LjRsLTYxLjMgMzUuNGMtMi4zIDEuMy01LjEgMS4zLTcuNCAwbC02MS4zLTM1LjRjLTIuMy0xLjMtMy43LTMuOC0zLjctNi40bDAtNzAuOGMwLTIuNiAxLjQtNS4xIDMuNy02LjRsNjEuMy0zNS40YzIuMy0xLjMgNS4xLTEuMyA3LjQgMGwxNS4zIDguOGMxLjcgMSAzLjktLjMgMy45LTIuMmwwLTk0YzAtMi44IDMtNC42IDUuNS0zLjJsMzYuNSAyMC40YzIuMyAxLjIgMy44IDMuNyAzLjggNi40em0tNDYgMTI4LjljMC0uNy0uNC0xLjMtLjktMS42bC0yMS0xMi4yYy0uNi0uMy0xLjMtLjMtMS45IDBsLTIxIDEyLjJjLS42IC4zLS45IC45LS45IDEuNmwwIDI0LjNjMCAuNyAuNCAxLjMgLjkgMS42bDIxIDEyLjFjLjYgLjMgMS4zIC4zIDEuOCAwbDIxLTEyLjFjLjYtLjMgLjktLjkgLjktMS42bDAtMjQuMyAuMSAwem0yMDkuOC0uN2MyLjMtMS4zIDMuNy0zLjggMy43LTYuNGwwLTE3LjFjMC0yLjYtMS40LTUuMS0zLjctNi40bC02MC45LTM1LjRjLTIuMy0xLjMtNS4xLTEuMy03LjQgMGwtNjEuMyAzNS40Yy0yLjMgMS4zLTMuNyAzLjgtMy43IDYuNGwwIDcwLjhjMCAyLjcgMS40IDUuMSAzLjcgNi40bDYwLjkgMzQuN2MyLjIgMS4zIDUgMS4zIDcuMyAwbDM2LjgtMjAuNWMyLjUtMS40IDIuNS01IDAtNi40TDU1MCAyNDEuNmMtMS4yLS43LTEuOS0xLjktMS45LTMuMmwwLTIyLjJjMC0xLjMgLjctMi41IDEuOS0zLjJsMTkuMi0xMS4xYzEuMS0uNyAyLjYtLjcgMy43IDBMNTkyLjEgMjEzYzEuMSAuNyAxLjkgMS45IDEuOSAzLjJsMCAxNy40YzAgMi44IDMuMSA0LjYgNS42IDMuMmwzNi43LTIxLjN6TTU1OSAyMTljLS40IC4zLS43IC43LS43IDEuMmwwIDEzLjZjMCAuNSAuMyAxIC43IDEuMmwxMS44IDYuOGMuNCAuMyAxIC4zIDEuNCAwTDU4NCAyMzVjLjQtLjMgLjctLjcgLjctMS4ybDAtMTMuNmMwLS41LS4zLTEtLjctMS4ybC0xMS44LTYuOGMtLjQtLjMtMS0uMy0xLjQgMEw1NTkgMjE5ek0zMDQuOCAyNjIuNWwwLTcwLjRjMC0yLjYtMS42LTUuMS0zLjktNi40bC02MS4xLTM1LjJjLTIuMS0xLjItNS0xLjQtNy40IDBsLTYxLjEgMzUuMmMtMi4zIDEuMy0zLjkgMy43LTMuOSA2LjRsMCA3MC40YzAgMi44IDEuOSA1LjIgNCA2LjRsNjEuMiAzNS4yYzIuNCAxLjQgNS4yIDEuMyA3LjQgMGw2MS0zNS4yYzEuOC0xIDMuMS0yLjcgMy42LTQuNyAuMS0uNSAuMi0xLjEgLjItMS43ek0yMzAuNSAxMzcuNmwtLjggLjUgMS4xIDAtLjMtLjV6bTc2LjIgMTMwLjJsLS40LS43IDAgLjkgLjQtLjJ6Il0KICAgIH07CiAgICBmYUNvZGVwZW4gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY29kZXBlbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMWNiIiwgIk01MDIuMyAxNTkuN2wtMjM0LTE1NmMtOC00LjktMTYuNS01LTI0LjYgMGwtMjM0IDE1NmMtNiA0LTkuNyAxMS4xLTkuNyAxOC4zTDAgMzM0YzAgNy4xIDMuNyAxNC4zIDkuNyAxOC4zbDIzNCAxNTZjOCA0LjkgMTYuNSA1IDI0LjYgMGwyMzQtMTU2YzYtNCA5LjctMTEuMSA5LjctMTguM2wwLTE1NmMwLTcuMS0zLjctMTQuMy05LjctMTguM3pNMjc4IDYzLjFsMTcyLjMgMTE0LjktNzYuOSA1MS40LTk1LjQtNjMuNyAwLTEwMi42em0tNDQgMEwyMzQgMTY1LjcgMTM4LjYgMjI5LjQgNjEuNyAxNzggMjM0IDYzLjF6TTQ0IDIxOS4xTDk5LjEgMjU2IDQ0IDI5Mi44IDQ0IDIxOS4xek0yMzQgNDQ4LjhMNjEuNyAzMzQgMTM4LjYgMjgyLjYgMjM0IDM0Ni4zIDIzNCA0NDguOHpNMjU2IDMwOGwtNzcuNy01MiA3Ny43LTUyIDc3LjcgNTItNzcuNyA1MnptMjIgMTQwLjlsMC0xMDIuNiA5NS40LTYzLjcgNzYuOSA1MS40LTE3Mi4zIDExNC45em0xOTAtMTU2bC01NS4xLTM2LjkgNTUuMS0zNi45IDAgNzMuN3oiXQogICAgfTsKICAgIGZhUmF2ZWxyeSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJyYXZlbHJ5IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyZDkiLCAiTTQ5OC42IDIzNC4yYy0xLjItMTAuMy0xLjctMjAuOC0zLjctMzEtMi41LTEyLjQtNS43LTI0LjYtOS42LTM2LjYtNi44LTIwLjktMTcuMi00MC4zLTMwLjktNTcuNS01LjktNy42LTEyLjEtMTQuOC0xOC44LTIxLjctMTQuMS0xNC0zMC0yNi4xLTQ3LjEtMzYuMS0xNy44LTEwLjYtMzYuOC0xOC45LTU2LjctMjQuNy0xMS0zLjEtMjIuMy01LjQtMzMuNS03LjYtNi44LTEuMy0xMy43LTEuNy0yMC42LTIuNS0uMyAwLS42LS40LS45LS42LTEwLjggMC0yMS41IDAtMzIuMyAwLTIuNCAuNC00LjggLjktNy4yIDEuMi0xMS42IDEuMi0yMy4xIDMuNi0zNC4zIDcuMS0xMy44IDQuMS0yNy4xIDkuNi0zOS44IDE2LjQtMTMuMyA3LTI2LjEgMTUuMS0zOC4xIDI0LjItNi4yIDQuNi0xMi4zIDkuNC0xOCAxNC41LTEwLjIgOS4yLTIwLjQgMTguNC0yOS45IDI4LjMtMTIuOCAxMy4zLTI0LjEgMjguMS0zMy42IDQ0LTguNiAxNC0xNS41IDI5LTIwLjUgNDQuNi03LjIgMjIuNy0xMC4zIDQ2LjYtOS4yIDcwLjMgLjYgMTMuNSAyIDI2LjkgNC40IDQwLjIgMy40IDE4LjQgOSAzNi4zIDE2LjcgNTMuMyAxMy42IDI5LjIgMzIuMSA1MS41IDUwLjQgNjcuOSAxMi44IDExLjYgMjYuOCAyMS45IDQxLjggMzAuNiAxNy43IDEwLjQgMzYuNCAxOC45IDU1LjkgMjUuMyAxMy4zIDQuMyAyNi45IDcuNiA0MC42IDkuOCA2LjEgMSAxMi4zIDEuMyAxOC40IDEuOSAuNCAuMSAuOCAuMyAxLjIgLjZsMzIuMyAwYzIuNS0uNCA1LS45IDcuNS0xLjEgMTYuMy0xLjMgMzIuMS01LjMgNDcuNS0xMC43IDE3LjItNS45IDMzLjctMTMuOSA0OS0yMy44IDkuNy02LjQgMTkuNC0xMy4xIDI4LjctMjAuMSA1LjgtNC4zIDExLTkuNSAxNi4zLTE0LjUgNC0zLjcgNy44LTcuNiAxMS41LTExLjUgMTItMTIuNyAyMi42LTI2LjYgMzEuNC00MS42IDkuNS0xNiAxNy40LTMyLjkgMjIuMy01MC45IDIuOS0xMC40IDQuOS0yMSA3LTMxLjcgMS01LjMgMS4zLTEwLjcgMS45LTE2LjEgMC0uMyAuNC0uNiAuNi0uOWwwLTM3LjFjLS4yLS42LS40LTEuMi0uNi0xLjh6bS0xNjEuMS0xLjJzLTE2LjYtMy0yOC41LTNjLTI3LjIgMC0zMy42IDE0LjktMzMuNiAzN2wwIDkzLjctNzMuNSAwIDAtMTkwLjcgNzMuNSAwIDAgMzEuOWM4LjktMjYuOCAyNi44LTM2LjIgNjItMzYuMmwwIDY3LjN6Il0KICAgIH07CiAgICBmYUFsaXBheSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhbGlwYXkiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjY0MiIsICJNMzc3LjcgMzJMNzAuMyAzMkMzMS40IDMyIDAgNjMuNCAwIDEwMi4zTDAgNDA5LjdDMCA0NDguNiAzMS40IDQ4MCA3MC4zIDQ4MGwzMDcuNSAwYzM4LjUgMCA2OS44LTMxLjEgNzAuMy02OS42LTQ2LTI1LjYtMTEwLjYtNjAuMy0xNzEuNi04OC40LTMyLjEgNDQtODQuMSA4MS0xNDguNiA4MS03MC42IDAtOTMuNy00NS4zLTk3LTc2LjQtNC0zOSAxNC45LTgxLjUgOTkuNS04MS41IDM1LjQgMCA3OS40IDEwLjIgMTI3LjEgMjUgMTYuNS0zMC4xIDI2LjUtNjAuMyAyNi41LTYwLjNsLTE3OC4yIDAgMC0xNi43IDkyLjEgMCAwLTMxLjItMTA5LjQgMCAwLTE5IDEwOS40IDAgMC01MC40IDUwLjkgMCAwIDUwLjQgMTA5LjQgMCAwIDE5LTEwOS40IDAgMCAzMS4yIDg4LjggMHMtMTUuMiA0Ni42LTM4LjMgOTAuOWM0OC45IDE2LjcgMTAwIDM2IDE0OC42IDUyLjdsMC0yMzQuNGMuMi0zOC43LTMxLjItNzAuMy02OS45LTcwLjN6TTQ3LjMgMzIzYzEgMjAuMiAxMC4yIDUzLjcgNjkuOSA1My43IDUyLjEgMCA5Mi42LTM5LjcgMTE3LjktNzIuOS00NC42LTE4LjctODQuNS0zMS40LTEwOS40LTMxLjQtNjcuNCAwLTc5LjQgMzMuMS03OC40IDUwLjZ6Il0KICAgIH07CiAgICBmYUNjQW1leCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjYy1hbWV4IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYxZjMiLCAiTTAgNDMyYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDQ4MCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMS4xLTYxLjcgMC0zMS45LTM1LjEtMzEuOSAzNS4xLTIwMy43IDAgMC0xNjMuOC02NS44IDAgODEuNy0xODQuNyA3OC42IDAgMjguMSA2My4yIDAtNjMuMiA5Ny4yIDAgMTYuOSA0Ny42IDE3LTQ3LjYgNzUuNSAwIDAtMi40YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4TDQ4IDMyQzIxLjUgMzIgMCA1My41IDAgODBMMCA0MzJ6bTQ0MC40LTIxLjdsNDIuMi00Ni4zIDQyIDQ2LjMgNTEuNCAwLTY4LTcyLjEgNjgtNzIuMS01MC42IDAtNDIgNDYuNy00MS41LTQ2LjctNTEuNCAwIDY3LjUgNzIuNS02Ny40IDcxLjYgMC0zMy4xLTgzIDAgMC0yMi4yIDgwLjkgMCAwLTMyLjMtODAuOSAwIDAtMjIuNCA4MyAwIDAtMzMuMS0xMjIgMCAwIDE0My4yIDE3MS44IDB6bTk2LjMtNzJsMzkuMyA0MS45IDAtODMuMy0zOS4zIDQxLjR6bS0zNi4zLTkybDM2LjktMTAwLjYgMCAxMDAuNiAzOC43IDAgMC0xNDMuMy02MC4yIDAtMzIuMiA4OS4zLTMxLjktODkuMy02MS4yIDAgMCAxNDMuMS02My4yLTE0My4xLTUxLjIgMC02Mi40IDE0My4zIDQzIDAgMTEuOS0yOC43IDY1LjkgMCAxMiAyOC43IDgyLjcgMCAwLTEwMC4zIDM2LjggMTAwLjMgMzQuNCAwek0yODIgMTg1LjRsMTkuNS00Ni45IDE5LjQgNDYuOS0zOC45IDB6Il0KICAgIH07CiAgICBmYVBpZWRQaXBlckFsdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwaWVkLXBpcGVyLWFsdCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMWE4IiwgIk0yNDQgMjQ2Yy0zLjItMi02LjMtMi45LTEwLjEtMi45LTYuNiAwLTEyLjYgMy4yLTE5LjMgMy43bDEuNyA0LjkgMjcuNy01Ljd6TTM3OS45IDQ0My45Yy0xOSAwLTY0LjEgOS41LTc5LjkgMTkuOGw2LjkgNDUuMWMzNS43IDYuMSA3MC4xIDMuNiAxMDYtOS44LTQuOC0xMC0yMy41LTU1LjEtMzMtNTUuMXpNMzQwLjggMTc3YzYuNiAyLjggMTEuNSA5LjIgMjIuNyAyMi4xIDItMS40IDcuNS01LjIgNy41LTguNiAwLTQuOS0xMS44LTEzLjItMTMuMi0yMyAxMS4yLTUuNyAyNS4yLTYgMzcuNi04LjkgNjguMS0xNi40IDExNi4zLTUyLjkgMTQ2LjgtMTE2LjcgNi4xLTEyLjYgMTEuOC0yNS44IDEyLjQtMzkuOWwtMiAyLjZjLTI4LjQgNTAtMzMgNjMuMi04MS4zIDEwMC0zMS45IDI0LjQtNjkuMiA0MC4yLTEwNi42IDU0LjZsLTYuMy0uMyAwLTIxLjhjLTE5LjYgMS42LTE5LjctMTQuNi0zMS42LTIzLTE4LjcgMjAuNi0zMS42IDQwLjgtNTguOSA1MS4xLTEyLjcgNC44LTE5LjYgMTAtMjUuOSAyMS44IDM0LjktMTYuNCA5MS4yLTEzLjUgOTguOC0xMHpNNTU1LjUgMGwtLjYgMS4xLS4zIC45IC42LS42IC4zLTEuNHpNNDk2LjMgMzgyLjFjLTMzLjktNTYuOS03NS4zLTExOC40LTE1MC0xMTUuNWwtLjMtNmMtMS4xLTEzLjUgMzIuOCAzLjIgMzUuMS0zMWwtMTQuNCA3LjJjLTE5LjgtNDUuNy04LjYtNTQuMy02NS41LTU0LjMtMTQuNyAwLTI2LjcgMS43LTQxLjQgNC42IDIuOSAxOC42IDIuMiAzNi43LTEwLjkgNTAuM2wxOS41IDUuNWMtMS43IDMuMi0yLjkgNi4zLTIuOSA5LjggMCAyMSA0Mi44IDIuOSA0Mi44IDMzLjYgMCAxOC40LTM2LjggNjAuMS01NC45IDYwLjEtOCAwLTUzLjctNTAtNTMuNC02MC4xbC4zLTQuNiA1Mi4zLTExLjVjMTMtMi42IDEyLjMtMjIuNy0yLjktMjIuNy0zLjcgMC00My4xIDkuMi00OS40IDEwLjYtMi01LjItNy41LTE0LjEtMTMuOC0xNC4xLTMuMiAwLTYuMyAzLjItOS41IDQtOS4yIDIuNi0zMSAyLjktMjEuNSAyMC4xTDE1LjkgMjk4LjVjLTUuNSAxLjEtOC45IDYuMy04LjkgMTEuOCAwIDYgNS41IDEwLjkgMTEuNSAxMC45IDggMCAxMzEuMy0yOC40IDE0Ny40LTMyLjIgMi42IDMuMiA0LjYgNi4zIDcuOCA4LjYgMjAuMSAxNC40IDU5LjggODUuOSA3Ni40IDg1LjkgMjQuMSAwIDU4LTIyLjQgNzEuMy00MS45IDMuMi00LjMgNi45LTcuNSAxMi40LTYuOSAuNiAxMy44LTMxLjYgMzQuMi0zMyA0My43LTEuNCAxMC4yLTEgMzUuMi0uMyA0MS4xIDI2LjcgOC4xIDUyLTMuNiA3Ny45LTIuOSA0LjMtMjEgMTAuNi00MS45IDkuOC02My41bC0uMy05LjVjLTEuNC0zNC4yLTEwLjktMzguNS0zNC44LTU4LjYtMS4xLTEuMS0yLjYtMi42LTMuNy00IDIuMi0xLjQgMS4xLTEgNC42LTEuNyA4OC41IDAgNTYuMyAxODMuNiAxMTEuNSAyMjkuOSAzMy4xLTE1IDcyLjUtMjcuOSAxMDMuNS00Ny4yLTI5LTI1LjYtNTIuNi00NS43LTcyLjctNzkuOXpNMzAwLjEgNDI4LjJsMCAyNy4yIDExLjgtMy40LTIuOS0yMy44LTguOSAwek0yMzEuNCAyNzcuOGwyNC4xIDYxLjIgMjEtMTMuOC0zMS4zLTUwLjktMTMuOCAzLjV6bTg0LjQgMTU0LjlsMiAxMi40YzktMS41IDU4LjQtNi42IDU4LjQtMTQuMSAwLTEuNC0uNi0zLjItLjktNC42LTI2LjggMC0zNi45IDMuOC01OS41IDYuM3oiXQogICAgfTsKICAgIGZhTGV0dGVyYm94ZCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJsZXR0ZXJib3hkIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU2MmQiLCAiTTUyMS4zIDEyOEM1ODYuOSAxMjggNjQwIDE4MS4xIDY0MCAyNDYuNlM1ODYuOSAzNjUuMiA1MjEuMyAzNjUuMmMtNDIuNSAwLTc5LjctMjIuMy0xMDAuNy01NS44IDExLjQtMTguMiAxOC0zOS43IDE4LTYyLjhzLTYuNi00NC42LTE4LTYyLjhsLjgtMS4yYzIwLjgtMzIuMyA1Ni44LTUzLjkgOTcuOS01NC42bDIgMHpNMzIwIDEyOGM0Mi41IDAgNzkuNyAyMi4zIDEwMC43IDU1LjgtMTEuNCAxOC4yLTE4IDM5LjctMTggNjIuOHM2LjYgNDQuNiAxOCA2Mi44bC0uOCAxLjJjLTIwLjggMzIuMy01Ni44IDUzLjktOTcuOSA1NC42bC0yIDBjLTQyLjUgMC03OS43LTIyLjMtMTAwLjctNTUuOCAxMS40LTE4LjIgMTgtMzkuNyAxOC02Mi44cy02LjYtNDQuNi0xOC02Mi44bC44LTEuMmMyMC44LTMyLjMgNTYuOC01My45IDk3LjktNTQuNmwyIDB6bS0yMDEuMyAwYzQyLjUgMCA3OS43IDIyLjMgMTAwLjcgNTUuOC0xMS40IDE4LjItMTggMzkuNy0xOCA2Mi44czYuNiA0NC42IDE4IDYyLjhsLS44IDEuMmMtMjAuOCAzMi4zLTU2LjggNTMuOS05Ny45IDU0LjZsLTIgMEM1My4xIDM2NS4xIDAgMzEyLjEgMCAyNDYuNlM1My4xIDEyOCAxMTguNyAxMjh6Il0KICAgIH07CiAgICBmYU9wZXJhID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm9wZXJhIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyNmEiLCAiTTMyMS45IDMyLjdjLTE3MC4yIDAtMjUyLjYgMjIzLjgtMTQ3LjUgMzU1LjEgMzYuNSA0NS40IDg4LjYgNzUuNiAxNDcuNSA3NS42IDM2LjMgMCA3MC4zLTExLjEgOTkuNC0zMC40LTQzLjggMzkuMi0xMDEuOSA2My0xNjUuMyA2My0zLjkgMC04IDAtMTEuOS0uMy0xMzEuNS02LjEtMjM2LjEtMTE0LjYtMjM2LjEtMjQ3LjcgMC0xMzcgMTExLTI0OCAyNDgtMjQ4bC44IDBjNjMuMSAuMyAxMjAuNyAyNC4xIDE2NC40IDYzLjEtMjktMTkuNC02My4xLTMwLjQtOTkuMy0zMC40ek00MjMuNyA0MzAuNGMtNDAuOSAyNC43LTkwLjcgMjMuNi0xMzItNS44IDU2LjItMjAuNSA5Ny43LTkxLjYgOTcuNy0xNzYuNiAwLTg0LjctNDEuMi0xNTUuOC05Ny40LTE3Ni42IDQxLjgtMjkuMiA5MS4yLTMwLjMgMTMyLjktNSAxMDUuOSA5OC43IDEwNS41IDI2NS43LTEuMiAzNjR6Il0KICAgIH07CiAgICBmYVdlaWJvID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIndlaWJvIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxOGEiLCAiTTQwNyAxNzcuNmM3LjYtMjQtMTMuNC00Ni44LTM3LjQtNDEuNy0yMiA0LjgtMjguOC0yOC4xLTcuMS0zMi44IDUwLjEtMTAuOSA5Mi4zIDM3LjEgNzYuNSA4NC44LTYuOCAyMS4yLTM4LjggMTAuOC0zMi0xMC4zek0yMTQuOCA0NDYuN2MtMTA2LjMgMC0yMTQuOC01MS40LTIxNC44LTEzNi4zIDAtNDQuMyAyOC05NS40IDc2LjMtMTQzLjcgOTkuNy05OS43IDIwMy4yLTEwMC45IDE3My42LTUuNy00IDEzLjEgMTIuMyA1LjcgMTIuMyA2IDc5LjUtMzMuNiAxNDAuNS0xNi44IDExNCA1MS40LTMuNyA5LjQgMS4xIDEwLjkgOC4zIDEzLjEgMTM1LjcgNDIuMyAzNC44IDIxNS4yLTE2OS43IDIxNS4yek0zNTguNSAzMDAuNGMtNS40LTU1LjctNzguNS05NC0xNjMuNC04NS43LTg0LjggOC42LTE0OC44IDYwLjMtMTQzLjQgMTE2czc4LjUgOTQgMTYzLjQgODUuN2M4NC44LTguNiAxNDguOC02MC4zIDE0My40LTExNnpNMzQ3LjkgMzUuMWMtMjUuOSA1LjYtMTYuOCA0My43IDguMyAzOC4zIDcyLjMtMTUuMiAxMzQuOCA1Mi44IDExMS43IDEyNC03LjQgMjQuMiAyOS4xIDM3IDM3LjQgMTIgMzEuOS05OS44LTU1LjEtMTk1LjktMTU3LjQtMTc0LjN6bS03OC41IDMxMWMtMTcuMSAzOC44LTY2LjggNjAtMTA5LjEgNDYuMy00MC44LTEzLjEtNTgtNTMuNC00MC4zLTg5LjcgMTcuNy0zNS40IDYzLjEtNTUuNCAxMDMuNC00NS4xIDQyIDEwLjggNjMuMSA1MC4yIDQ2IDg4LjV6bS04Ni4zLTMwYy0xMi45LTUuNC0zMCAuMy0zOCAxMi45LTguMyAxMi45LTQuMyAyOCA4LjYgMzQgMTMuMSA2IDMwLjggLjMgMzkuMS0xMi45IDgtMTMuMSAzLjctMjguMy05LjctMzR6bTMyLjYtMTMuNGMtNS4xLTEuNy0xMS40IC42LTE0LjMgNS40LTIuOSA1LjEtMS40IDEwLjYgMy43IDEyLjkgNS4xIDIgMTEuNy0uMyAxNC42LTUuNCAyLjgtNS4yIDEuMS0xMC45LTQtMTIuOXoiXQogICAgfTsKICAgIGZhUmVhZG1lID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInJlYWRtZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNGQ1IiwgIk01MjguMyA0Ni41bC0xMzkuOCAwYy00OC4xIDAtODkuOSAzMy4zLTEwMC40IDgwLjMtMTAuNi00Ny01Mi4zLTgwLjMtMTAwLjQtODAuM0w0OCA0Ni41QzIxLjUgNDYuNSAwIDY4IDAgOTQuNUwwIDM0MC4zYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDg5LjcgMGMxMDIuMiAwIDEzMi43IDI0LjQgMTQ3LjMgNzUgLjcgMi44IDUuMiAyLjggNiAwIDE0LjctNTAuNiA0NS4yLTc1IDE0Ny4zLTc1bDg5LjcgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTI0NS43YzAtMjYuNC0yMS4zLTQ3LjktNDcuNy00OC4xek0yNDIgMzExLjljMCAxLjktMS41IDMuNS0zLjUgMy41bC0xNjAuMyAwYy0xLjkgMC0zLjUtMS41LTMuNS0zLjVsMC0yMi45YzAtMS45IDEuNS0zLjUgMy41LTMuNWwxNjAuNCAwYzEuOSAwIDMuNSAxLjUgMy41IDMuNWwwIDIyLjktLjEgMHptMC02MC45YzAgMS45LTEuNSAzLjUtMy41IDMuNWwtMTYwLjMgMGMtMS45IDAtMy41LTEuNS0zLjUtMy41bDAtMjIuOWMwLTEuOSAxLjUtMy41IDMuNS0zLjVsMTYwLjQgMGMxLjkgMCAzLjUgMS41IDMuNSAzLjVsMCAyMi45LS4xIDB6bTAtNjAuOWMwIDEuOS0xLjUgMy41LTMuNSAzLjVsLTE2MC4zIDBjLTEuOSAwLTMuNS0xLjUtMy41LTMuNWwwLTIyLjljMC0xLjkgMS41LTMuNSAzLjUtMy41bDE2MC40IDBjMS45IDAgMy41IDEuNSAzLjUgMy41bDAgMjIuOS0uMSAwek01MDEuMyAzMTEuOGMwIDEuOS0xLjUgMy41LTMuNSAzLjVsLTE2MC4zIDBjLTEuOSAwLTMuNS0xLjUtMy41LTMuNWwwLTIyLjljMC0xLjkgMS41LTMuNSAzLjUtMy41bDE2MC40IDBjMS45IDAgMy41IDEuNSAzLjUgMy41bDAgMjIuOS0uMSAwem0wLTYwLjljMCAxLjktMS41IDMuNS0zLjUgMy41bC0xNjAuMyAwYy0xLjkgMC0zLjUtMS41LTMuNS0zLjVsMC0yMi45YzAtMS45IDEuNS0zLjUgMy41LTMuNWwxNjAuNCAwYzEuOSAwIDMuNSAxLjUgMy41IDMuNWwwIDIyLjktLjEgMHptMC02MC45YzAgMS45LTEuNSAzLjUtMy41IDMuNWwtMTYwLjMgMGMtMS45IDAtMy41LTEuNS0zLjUtMy41bDAtMjIuOGMwLTEuOSAxLjUtMy41IDMuNS0zLjVsMTYwLjQgMGMxLjkgMCAzLjUgMS41IDMuNSAzLjVsMCAyMi44LS4xIDB6Il0KICAgIH07CiAgICBmYUdvbGFuZyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnb2xhbmciLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTQwZiIsICJNNDAwLjEgMTk0LjhjLTEwLjkgMi44LTE5LjkgNC4zLTI5LjEgNy42LTcuMyAxLjktMTQuNyAzLjktMjMuMiA2LjFsLS42IC4xYy00LjIgMS4yLTQuNiAxLjMtOC41LTMuMi00LjctNS4zLTguMS04LjctMTQuNi0xMS45LTE5LjctOS42LTM4LjctNi44LTU2LjQgNC43LTIxLjIgMTMuNy0zMi4xIDM0LTMxLjggNTkuMiAuMyAyNSAxNy40IDQ1LjUgNDEuMiA0OC45IDIyIDIuOCAzOS44LTQuNiA1My44LTIwLjUgMi4xLTIuNiA0LTUuMyA2LjEtOC4zIC44LTEgMS41LTIuMSAyLjMtMy4zbC02MC4xIDBjLTYuNSAwLTguMS00LTUuOS05LjMgNC05LjcgMTEuNS0yNS45IDE1LjktMzQgLjktMS44IDMuMS01LjggNi45LTUuOGwxMDEuMSAwYzQuNS0xMy40IDExLjgtMjYuOSAyMS42LTM5LjcgMjIuNy0yOS45IDQ5LjMtNDUuNSA4Ny4yLTUyIDMxLjgtNS42IDYxLjctMi41IDg4LjkgMTUuOSAyNC42IDE2LjggMzkuOCAzOS42IDQzLjkgNjkuNSA1LjMgNDIuMS02LjkgNzYuMy0zNi43IDEwNS42LTE5LjcgMjAuOS00NC45IDM0LTczLjkgMzkuOS01LjYgMS0xMS4xIDEuNS0xNi41IDItMi45IC4yLTUuNyAuNS04LjUgLjgtMjguMy0uNi01NC4yLTguNy03Ni0yNy40LTE1LjMtMTMuMy0yNS45LTI5LjYtMzEuMS00OC41LTMuNyA3LjMtOCAxNC40LTE0IDIxLjEtMjEuNiAyOS42LTUwLjkgNDgtODcuOSA1Mi45LTMwLjYgNC4xLTU4LjktMS44LTgzLjktMjAuNS0yMy0xNy41LTM2LjEtNDAuNS0zOS41LTY5LjItNC4xLTM0IDUuOS02NS40IDI2LjQtOTEuMyAyMi4yLTI5IDUxLjUtNDcuNCA4Ny4zLTUzLjkgMjkuMy02LjIgNTcuMy0xLjkgODIuNiAxNS4zIDE2LjUgMTAuOSAyOC4zIDI1LjggMzYuMSA0My45IDEuOSAyLjggLjYgNC40LTMuMSA1LjN6TTQ4LjMgMjAwLjRjLTEuMyAwLTEuNi0uNi0uOS0xLjZsNi42LTguNGMuNi0uOSAyLjItMS41IDMuNC0xLjVsMTExLjMgMGMxLjIgMCAxLjUgLjkgLjkgMS44bC01LjMgOC4xYy0uNiAxLTIuMiAxLjktMy4xIDEuOWwtMTEyLjgtLjN6TTEuMiAyMjkuMWMtMS4yIDAtMS42LS43LS45LTEuNmw2LjUtOC40Yy42LS45IDIuMi0xLjYgMy40LTEuNmwxNDIuMSAwYzEuMiAwIDEuOCAxIDEuNSAxLjlsLTIuNSA3LjVjLS4zIDEuMi0xLjUgMS45LTIuOCAxLjlMMS4yIDIyOS4xem03NC41IDI2LjhjLS42IC45LS4zIDEuOCAuOSAxLjhsNjggLjNjLjkgMCAyLjItLjkgMi4yLTIuMWwuNi03LjVjMC0xLjMtLjYtMi4yLTEuOS0yLjJsLTYyLjMgMGMtMS4yIDAtMi41IC45LTMuMSAxLjlsLTQuNCA3Ljh6bTUwMS41LTE4Yy0uMi0yLjYtLjMtNC44LS43LTctNS42LTMwLjgtMzQtNDguMy02My42LTQxLjQtMjkgNi41LTQ3LjcgMjQuOS01NC41IDU0LjItNS42IDI0LjMgNi4yIDQ4LjkgMjguNiA1OC45IDE3LjIgNy41IDM0LjMgNi42IDUwLjgtMS45IDI0LjYtMTMuNiAzOC0zMi43IDM5LjYtNTkuNS0uMS0xLjItLjEtMi4zLS4yLTMuM3oiXQogICAgfTsKICAgIGZhU3RhY2tFeGNoYW5nZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzdGFjay1leGNoYW5nZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMThkIiwgIk0xOC4xIDMzMi4zbDQxMi43IDAgMCAyMmMwIDM3LjctMjkuMyA2OC02NS4zIDY4bC0xOSAwLTg2LjggODkuNyAwLTg5LjctMTc2LjMgMGMtMzYgMC02NS4zLTMwLjMtNjUuMy02OGwwLTIyem0wLTIzLjZsNDEyLjcgMCAwLTg1LTQxMi43IDAgMCA4NXptMC0xMDkuNGw0MTIuNyAwIDAtODUtNDEyLjcgMCAwIDg1ek0zNjUuNCAwTDgzLjQgMGMtMzYgMC02NS4zIDMwLjMtNjUuMyA2Ny43bDAgMjIuMyA0MTIuNyAwIDAtMjIuM0M0MzAuNyAzMC4zIDQwMS40IDAgMzY1LjQgMHoiXQogICAgfTsKICAgIGZhR3VscCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJndWxwIiwKICAgICAgaWNvbjogWzI1NiwgNTEyLCBbXSwgImYzYWUiLCAiTTIxMCAzOTEuMWwtMTQuMSAyNC42LTQuNiA4MC4yYzAgOC45LTI4LjMgMTYuMS02My4xIDE2LjFzLTYzLjEtNy4yLTYzLjEtMTYuMWwtNS44LTc5LjQtMTQuOS0yNS40YzQxLjIgMTcuMyAxMjYgMTYuNyAxNjUuNiAwek0xNCAxMzcuOEwyNy42IDI2My4zYzUuOS0yMCAyMC44LTQ3IDQwLTU1LjIgNi4zLTIuNyAxMi43LTIuNyAxOC43IC45IDUuMiAzIDkuNiA5LjMgMTAuMSAxMS44IDEuMiA2LjUtMiA5LjEtNC41IDkuMS0zIDAtNS4zLTQuNi02LjgtNy4zLTQuMS03LjMtMTAuMy03LjYtMTYuOS0yLjgtNi45IDUtMTIuOSAxMy40LTE3LjEgMjAuNy01LjEgOC44LTkuNCAxOC41LTEyIDI4LjItMS41IDUuNi0yLjkgMTQuNi0uNiAxOS45IDEgMi4yIDIuNSAzLjYgNC45IDMuNiA1IDAgMTIuMy02LjYgMTUuOC0xMC4xIDQuNS00LjUgMTAuMy0xMS41IDEyLjUtMTZsNS4yLTE1LjVjMi42LTYuOCA5LjktNS42IDkuOSAwIDAgMTAuMi0zLjcgMTMuNi0xMCAzNC43LTUuOCAxOS41LTcuNiAyNS44LTcuNiAyNS44LS43IDIuOC0zLjQgNy41LTYuMyA3LjUtMS4yIDAtMi4xLS40LTIuNi0xLjItMS0xLjQtLjktNS4zLS44LTYuMyAuMi0zLjIgNi4zLTIyLjIgNy4zLTI1LjItMiAyLjItNC4xIDQuNC02LjQgNi42LTUuNCA1LjEtMTQuMSAxMS44LTIxLjUgMTEuOC0zLjQgMC01LjYtLjktNy43LTIuNGw3LjYgNzkuNmMyIDUgMzkuMiAxNy4xIDg4LjIgMTcuMSA0OS4xIDAgODYuMy0xMi4yIDg4LjItMTcuMWwxMC45LTk0LjZjLTUuNyA1LjItMTIuMyAxMS42LTE5LjYgMTQuOC01LjQgMi4zLTE3LjQgMy44LTE3LjQtNS43IDAtNS4yIDkuMS0xNC44IDE0LjQtMjEuNSAxLjQtMS43IDQuNy01LjkgNC43LTguMSAwLTIuOS02LTIuMi0xMS43IDIuNS0zLjIgMi43LTYuMiA2LjMtOC43IDkuNy00LjMgNi02LjYgMTEuMi04LjUgMTUuNS02LjIgMTQuMi00LjEgOC42LTkuMSAyMi01IDEzLjMtNC4yIDExLjgtNS4yIDE0LS45IDEuOS0yLjIgMy41LTQgNC41LTEuOSAxLTQuNSAuOS02LjEtLjMtLjktLjYtMS4zLTEuOS0xLjMtMy43IDAtLjkgLjEtMS44IC4zLTIuNyAxLjUtNi4xIDcuOC0xOC4xIDE1LTM0LjMgMS42LTMuNyAxLTIuNiAuOC0yLjMtNi4yIDYtMTAuOSA4LjktMTQuNCAxMC41LTUuOCAyLjYtMTMgMi42LTE0LjUtNC4xLS4xLS40LS4xLS44LS4yLTEuMi0xMS44IDkuMi0yNC4zIDExLjctMjAtOC4xLTQuNiA4LjItMTIuNiAxNC45LTIyLjQgMTQuOS00LjEgMC03LjEtMS40LTguNi01LjEtMi4zLTUuNSAxLjMtMTQuOSA0LjYtMjMuOCAxLjctNC41IDQtOS45IDcuMS0xNi4yIDEuNi0zLjQgNC4yLTUuNCA3LjYtNC41IC42IC4yIDEuMSAuNCAxLjYgLjcgMi42IDEuOCAxLjYgNC41IC4zIDcuMi0zLjggNy41LTcuMSAxMy05LjMgMjAuOC0uOSAzLjMtMiA5IDEuNSA5IDIuNCAwIDQuNy0uOCA2LjktMi40IDQuNi0zLjQgOC4zLTguNSAxMS4xLTEzLjUgMi0zLjYgNC40LTguMyA1LjYtMTIuMyAuNS0xLjcgMS4xLTMuMyAxLjgtNC44IDEuMS0yLjUgMi42LTUuMSA1LjItNS4xIDEuMyAwIDIuNCAuNSAzLjIgMS41IDEuNyAyLjIgMS4zIDQuNSAuNCA2LjktMiA1LjYtNC43IDEwLjYtNi45IDE2LjctMS4zIDMuNS0yLjcgOC0yLjcgMTEuNyAwIDMuNCAzLjcgMi42IDYuOCAxLjIgMi40LTEuMSA0LjgtMi44IDYuOC00LjUgMS4yLTQuOSAuOS0zLjggMjYuNC02OC4yIDEuMy0zLjMgMy43LTQuNyA2LjEtNC43IDEuMiAwIDIuMiAuNCAzLjIgMS4xIDEuNyAxLjMgMS43IDQuMSAxIDYuMi0uNyAxLjktLjYgMS4zLTQuNSAxMC41LTUuMiAxMi4xLTguNiAyMC44LTEzLjIgMzEuOS0xLjkgNC42LTcuNyAxOC45LTguNyAyMi4zLS42IDIuMi0xLjMgNS44IDEgNS44IDUuNCAwIDE5LjMtMTMuMSAyMy4xLTE3IC4yLS4zIC41LS40IC45LS42IC42LTEuOSAxLjItMy43IDEuNy01LjUgMS40LTMuOCAyLjctOC4yIDUuMy0xMS4zIC44LTEgMS43LTEuNiAyLjctMS42IDIuOCAwIDQuMiAxLjIgNC4yIDQgMCAxLjEtLjcgNS4xLTEuMSA2LjIgMS40LTEuNSAyLjktMyA0LjUtNC41IDE1LTEzLjkgMjUuNy02LjggMjUuNyAuMiAwIDcuNC04LjkgMTcuNy0xMy44IDIzLjQtMS42IDEuOS00LjkgNS40LTUgNi40IDAgMS4zIC45IDEuOCAyLjIgMS44IDIgMCA2LjQtMy41IDgtNC43IDUtMy45IDExLjgtOS45IDE2LjYtMTQuMWwxNC44LTEzNi44Yy0zMC41IDE3LjEtMTk3LjYgMTcuMi0yMjguMyAuMnptMjI5LjctOC41YzAgMjEtMjMxLjIgMjEtMjMxLjIgMCAwLTguOCA1MS44LTE1LjkgMTE1LjYtMTUuOSA5IDAgMTcuOCAuMSAyNi4zIC40TDE2NyA2NS4xIDIyOC4zIC42YzEuNC0xLjQgNS44LS4yIDkuOSAzLjVzNi42IDcuOSA1LjMgOS4zbC0uMSAuMS01Ny4zIDYwLjUtMTAgNDAuN2MzOS45IDIuNiA2Ny42IDguMSA2Ny42IDE0LjZ6bS02OS40IDQuNmMwLS44LS45LTEuNS0yLjUtMi4xbC0uMiAuOGMwIDEuMy01IDIuNC0xMS4xIDIuNHMtMTEuMS0xLjEtMTEuMS0yLjRjMC0uMSAwLS4yIC4xLS4zbC4yLS43Yy0xLjggLjYtMyAxLjQtMyAyLjMgMCAyLjEgNi4yIDMuNyAxMy43IDMuNyA3LjcgLjEgMTMuOS0xLjYgMTMuOS0zLjd6Il0KICAgIH07CiAgICBmYVllbHAgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAieWVscCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMWU5IiwgIk00Mi45IDI0MC4zbDk5LjYgNDguNmMxOS4yIDkuNCAxNi4yIDM3LjUtNC41IDQyLjdMMzAuNSAzNTguNWMtMy4yIC44LTYuNCAuOS05LjYgLjNzLTYuMi0xLjgtOC45LTMuNy00LjktNC4zLTYuNi03LjEtMi43LTUuOS0zLjEtOS4yYy0zLjMtMjguOC0uMi01Ny45IDktODUuMyAxLTMuMSAyLjctNS45IDQuOS04LjNzNC45LTQuMiA3LjktNS41IDYuMi0xLjggOS41LTEuOCA2LjQgLjkgOS4zIDIuM3ptNDQgMjM5LjNjMjMuOCAxNi4zIDUwLjkgMjcuMyA3OS40IDMyLjEgMy4yIC42IDYuNSAuNCA5LjYtLjRzNi4xLTIuMyA4LjYtNC40IDQuNi00LjYgNi03LjUgMi4zLTYuMSAyLjQtOS40bDMuOS0xMTAuOGMuNy0yMS4zLTI1LjUtMzEuOS0zOS44LTE2LjFMODIuOCA0NDUuNWMtMi4yIDIuNC0zLjggNS4zLTQuOCA4LjRzLTEuMyA2LjQtLjkgOS42IDEuNSA2LjMgMy4xIDkuMSAzLjkgNS4yIDYuNiA3bDAgMHpNMjMyLjIgMzY5LjdsNTguOCA5NGMxLjcgMi44IDQgNS4xIDYuOCA2LjlzNS44IDMgOSAzLjUgNi41IC4zIDkuNy0uNSA2LjEtMi40IDguNi00LjRjMjIuMy0xOC40IDQwLjMtNDEuNSA1Mi43LTY3LjYgMS40LTIuOSAyLjEtNi4xIDIuMi05LjRzLS42LTYuNS0xLjktOS40LTMuMi01LjctNS42LTcuOC01LjItMy45LTguMy00LjlMMjU4LjcgMzM1LjdjLTIwLjMtNi41LTM3LjggMTUuOC0yNi41IDMzLjl6TTM4MC42IDIzNy40Yy0xMS41LTI2LjUtMjguNy01MC4yLTUwLjQtNjkuMy0yLjQtMi4xLTUuMy0zLjctOC40LTQuN3MtNi40LTEuMi05LjYtLjgtNi4zIDEuNS05LjEgMy4yLTUuMSA0LTYuOSA2LjdsLTYyIDkxLjljLTExLjkgMTcuNyA0LjcgNDAuNiAyNS4yIDM0LjdMMzY2IDI2OC42YzMuMS0uOSA2LTIuNSA4LjUtNC42czQuNS00LjcgNS44LTcuNyAyLjEtNi4yIDIuMi05LjQtLjYtNi41LTEuOS05LjVsMCAwek02Mi4xIDMwLjJjLTIuOCAxLjQtNS40IDMuMy03LjQgNS43cy0zLjYgNS4yLTQuNSA4LjItMS4yIDYuMi0uOSA5LjMgMS4zIDYuMSAyLjkgOC45TDE1Ni4zIDI0Mi42YzExLjcgMjAuMiA0Mi42IDExLjkgNDIuNi0xMS40bDAtMjA4LjNjMC0zLjEtLjYtNi4zLTEuOC05LjJzLTMuMS01LjUtNS40LTcuNi01LTMuOC04LTQuOC02LjEtMS40LTkuMy0xLjJjLTM5IDMuMS03NyAxMy4zLTExMi4zIDMwLjF6Il0KICAgIH07CiAgICBmYUdvZm9yZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnb2ZvcmUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjNhNyIsICJNMzQ4IDMxOS44bC0xMy4yIDAgMCAzNC43Yy0yNC41IDIzLjEtNTYuMyAzNS44LTg5LjkgMzUuOC03My4yIDAtMTMyLjQtNjAuMi0xMzIuNC0xMzQuNCAwLTc0LjEgNTkuMi0xMzQuNCAxMzIuNC0xMzQuNCAzNS4zIDAgNjguNiAxNCA5My42IDM5LjRsNjIuMy02My4zYy00MS44LTQyLjMtOTcuMS02NS42LTE1Ni4xLTY1LjYtMTIyLjcgMC0yMjAuNyAxMDAuNi0yMjAuNyAyMjQgMCAxMjIuNSA5NyAyMjQgMjIwLjcgMjI0IDYzLjIgMCAxMjQuNS0yNi4yIDE3MS04Mi41LTItMjcuNi0xMy40LTc3LjctNjcuNy03Ny43ek0zMzUuOSAyMDcuM2wtMTA2LjMgMCAwIDg5IDExOC40IDBjMzMuNSAwIDYwLjUgMTUuMSA3NiA0MS44bDAtMzAuNmMwLTY1LjItNDAuNC0xMDAuMi04OC4xLTEwMC4yeiJdCiAgICB9OwogICAgZmFBdmlhdG8gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYXZpYXRvIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY0MjEiLCAiTTEwNy4yIDI4My41bC0xOS00MS44LTUyLjEgMC0xOSA0MS44LTE3LjEgMCA2Mi4yLTEzMS40IDYyLjIgMTMxLjQtMTcuMiAwem0tNDUtOTguMWwtMTkuNiA0Mi41IDM5LjIgMC0xOS42LTQyLjV6TTE3NC45IDI4Ny44bC02Mi4yLTEzMS40IDE3LjEgMCA0NS4xIDk2IDQ1LjEtOTYgMTcgMC02Mi4xIDEzMS40em04MC42LTQuM2wwLTEyNy4xIDE1LjUgMCAwIDEyNy4xLTE1LjUgMHpNNDY0LjYgMTY3LjlsMCAxMTUuNi0xNy4zIDAgMC0xMTUuNi00MS4yIDAgMC0xMS41IDk5LjYgMCAwIDExLjUtNDEuMSAwek02NDAgMjE4LjhjMCA5LjItMS43IDE3LjgtNS4xIDI1LjhzLTguMiAxNS4xLTE0LjIgMjEuMS0xMy4xIDEwLjgtMjEuMSAxNC4yLTE2LjYgNS4xLTI1LjggNS4xLTE3LjgtMS43LTI1LjgtNS4xLTE1LjEtOC4yLTIxLjEtMTQuMi0xMC44LTEzLTE0LjItMjEuMWMtMy40LTgtNS4xLTE2LjYtNS4xLTI1LjhzMS43LTE3LjggNS4xLTI1LjggOC4yLTE1LjEgMTQuMi0yMS4xIDEzLTguNCAyMS4xLTExLjljOC0zLjQgMTYuNi01LjEgMjUuOC01LjFzMTcuOCAxLjcgMjUuOCA1LjEgMTUuMSA1LjggMjEuMSAxMS45YzYgNiAxMC43IDEzLjEgMTQuMiAyMS4xIDMuNCA4IDUuMSAxNi42IDUuMSAyNS44em0tMTUuNSAwYzAtNy4zLTEuMy0xNC0zLjktMjAuM3MtNi4yLTExLjctMTAuOC0xNi4zLTEwLTguMi0xNi4yLTEwLjktMTIuOC00LTE5LjgtNC0xMy42IDEuMy0xOS44IDQtMTEuNiA2LjMtMTYuMiAxMC45LTguMiAxMC0xMC44IDE2LjMtMy45IDEzLjEtMy45IDIwLjNjMCA3LjMgMS4zIDE0IDMuOSAyMC4zczYuMiAxMS43IDEwLjggMTYuMyAxMCA4LjIgMTYuMiAxMC45IDEyLjggNCAxOS44IDQgMTMuNi0xLjMgMTkuOC00IDExLjYtNi4zIDE2LjItMTAuOSA4LjItMTAgMTAuOC0xNi4zIDMuOS0xMy4xIDMuOS0yMC4zem0tOTQuOCA5Ni43bDAtNi4zIDg4LjktMTAtMjQyLjkgMTMuNGMuNi0yLjIgMS4xLTQuNiAxLjQtNy4yIC4zLTIgLjUtNC4yIC42LTYuNWw2NC44LTguMS02NC45IDEuOWMwLS40LS4xLS43LS4xLTEuMS0yLjgtMTcuMi0yNS41LTIzLjctMjUuNS0yMy43bC0xLjEtMjYuMyAyMy44IDAgMTkgNDEuOCAxNy4xIDAtNjIuMi0xMzEuNC02Mi4yIDEzMS40IDE3LjEgMCAxOS00MS44IDIzLjYgMC0xLjEgMjYuNHMtMjIuNyA2LjUtMjUuNSAyMy43Yy0uMSAuMy0uMSAuNy0uMSAxLjFsLTY0LjktMS45IDY0LjggOC4xYy4xIDIuMyAuMyA0LjQgLjYgNi41IC4zIDIuNiAuOCA1IDEuNCA3LjJsLTI0Mi45LTEzLjUgODguOSAxMCAwIDYuM2MtNS45IC45LTEwLjUgNi0xMC41IDEyLjIgMCA2LjggNS42IDEyLjQgMTIuNCAxMi40czEyLjQtNS42IDEyLjQtMTIuNGMwLTYuMi00LjYtMTEuMy0xMC41LTEyLjJsMC01LjggODAuMyA5IDAgNS40Yy01LjcgMS4xLTkuOSA2LjItOS45IDEyLjEgMCA2LjggNS42IDEwLjIgMTIuNCAxMC4yczEyLjQtMy40IDEyLjQtMTAuMmMwLTYtNC4zLTExLTkuOS0xMi4xbDAtNC45IDI4LjQgMy4yIDAgMjMuNy01LjkgMCAwIDEzLjkgNS45IDAgMC02LjYgNSAwIDAgNi42IDUuOSAwIDAtMTMuOC01LjkgMCAwLTIzLjIgMzguMyA0LjNjOC4xIDExLjQgMTkgMTMuNiAxOSAxMy42bC0uMSA2LjctNS4xIC4yLS4xIDEyLjEgNC4xIDAgLjEtNSA1LjIgMCAuMSA1IDQuMSAwLS4xLTEyLjEtNS4xLS4yLS4xLTYuN3MxMC45LTIuMSAxOS0xMy42bDM4LjMtNC4zIDAgMjMuMi01LjkgMCAwIDEzLjggNS45IDAgMC02LjYgNSAwIDAgNi42IDUuOSAwIDAtMTMuOC01LjkgMCAwLTIzLjcgMjguNC0zLjIgMCA0LjljLTUuNyAxLjEtOS45IDYuMi05LjkgMTIuMSAwIDYuOCA1LjYgMTAuMiAxMi40IDEwLjJzMTIuNC0zLjQgMTIuNC0xMC4yYzAtNi00LjMtMTEtOS45LTEyLjFsMC01LjQgODAuMy05IDAgNS44Yy01LjkgLjktMTAuNSA2LTEwLjUgMTIuMiAwIDYuOCA1LjYgMTIuNCAxMi40IDEyLjRzMTIuNC01LjYgMTIuNC0xMi40Yy0uMi02LjMtNC43LTExLjQtMTAuNy0xMi4zek0zMjguOSAyMjcuOWwxOS42LTQyLjUgMTkuNiA0Mi41LTE3LjkgMC0xLjctNDAuMy0xLjcgNDAuMy0xNy45IDB6Il0KICAgIH07CiAgICBmYVBhZGxldCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwYWRsZXQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTRhMCIsICJNMjk3LjkgMGwuMSAwYzcuNiAuMSAxNC40IDQuNyAxNy41IDExLjhsMTMyIDMwOC41IC4zLS4xIC4yIC40LTIuOCAxMC00Mi45IDE1OGMtMy43IDE2LjItMTkuNyAyNi4zLTM1LjggMjIuNmwtNjguNC0xNS42LTY4LjUgMTUuNmMtMTYuMSAzLjctMzIuMS02LjQtMzUuOC0yMi42bC00Mi45LTE1OC0yLjctMTAgLjEtLjQgMTMyLjEtMzA4LjRjMy03IDkuOS0xMS42IDE3LjUtMTEuOHpNMTYwLjEgMzIyLjFsMTMxIDM5LjEgNi45IDEyMi41IDcuOS0xMjEuNSAxMzAuNi0zOS4zIC4yLS4xLTEzMSAyNS4xLTguNi0zMjAuMi01LjIgMzIwLjItMTMxLjgtMjUuOHpNNDI2IDIyMi42bDk0LjQtNDEgNzMuOCAwLTE1NyAyNDcuNiAzMS42LTEwOS00Mi44LTk3LjZ6bTE3MS41LTQxLjJsNDEuNCA3Ni4yYzQgNy41LTMuOSAxNS45LTExLjYgMTIuMmwtNDcuNi0yMi43IDE3LjgtNjUuN3pNMTI3LjMgMzE4LjVMMTU4LjcgNDMwIDEuNiAxNTQuNWMtNS45LTEwLjQgNS41LTIyIDE1LjktMTYuMmwxNTEuOCA4NC4yLTQyLjEgOTZ6Il0KICAgIH07CiAgICBmYUVkZ2VMZWdhY3kgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZWRnZS1sZWdhY3kiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTA3OCIsICJNLTYgMjI4LjJsLjQtLjVjMCAuMiAwIC4zLS4xIC41bC0uMyAwem00NjAuNiAxNS41YzAtNDQtNy44LTg0LjUtMjguOC0xMjIuNC00MS03My40LTExMy42LTExMy4zLTE5OC42LTExMy4zLTEzOS45LS4zLTIxOC4zIDEwNS4yLTIzMi44IDIxOS43IDQyLjQtNjEuMyAxMTcuMS0xMjEuNCAyMjAuNC0xMjUgMCAwIDEwOS43IDAgOTkuNCAxMDVsLTE3NS44IDBjNi40LTM3LjQgMTguNS01OSAzNC4zLTc4LjktNzUgMzQuOS0xMjEuOCA5Ni4xLTEyMC44IDE4OC4zIC44IDcxLjUgNTAuMSAxNDQuOCAxMjAuOCAxNzIgODMuNCAzMS44IDE5Mi44IDcuMiAyNDAuMS0yMS4zbDAtMTA0LjRjLTgwLjkgNTYuNS0yNzAuOSA2MC45LTI3Mi4zLTY3LjZsMzE0LjEgMCAwLTUyLjF6Il0KICAgIH07CiAgICBmYVNxdWFyZUxhc3RmbSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtbGFzdGZtIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImxhc3RmbS1zcXVhcmUiXSwgImYyMDMiLCAiTTQ0OCA5NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwek0yMTAuNyAyODAuOGMtMS44LTUuNS0zLjQtMTAuOC01LTE1LjktMTIuOS00MS45LTIxLTY4LjQtNTgtNjguNC0yMi40IDAtNDUuMSAxNi4xLTQ1LjEgNjEuMiAwIDM1LjIgMTggNTcuMiA0My4zIDU3LjIgMjguNiAwIDQ3LjYtMjEuMyA0Ny42LTIxLjNsMTEuNyAzMS45cy0xOS44IDE5LjQtNjEuMiAxOS40Yy01MS4zIDAtNzkuOS0zMC4xLTc5LjktODUuOCAwLTU3LjkgMjguNi05MiA4Mi41LTkyIDY3LjkgMCA3OS4zIDM1LjMgOTYuNCA4OC40IDEuNCA0LjQgMi45IDguOSA0LjQgMTMuNSA4LjggMjYuOCAyNC4yIDQ2LjIgNjEuMiA0Ni4yIDI0LjkgMCAzOC4xLTUuNSAzOC4xLTE5LjEgMC0xNy41LTE2LjktMjEuMi00MC0yNi40LTMuMi0uNy02LjUtMS40LTkuOS0yLjItMzAuNC03LjMtNDIuNS0yMy4xLTQyLjUtNDggMC00MCAzMi4zLTUyLjQgNjUuMi01Mi40IDM3LjQgMCA2MC4xIDEzLjYgNjMgNDYuNmwtMzYuNyA0LjRjLTEuNS0xNS44LTExLTIyLjQtMjguNi0yMi40LTE2LjEgMC0yNiA3LjMtMjYgMTkuOCAwIDExIDQuOCAxNy42IDIwLjkgMjEuMyAyLjIgLjUgNC41IDEgNi43IDEuNCAzMS4xIDYuNSA2NS4xIDEzLjcgNjUuMSA1Ni4xIC4xIDM2LjctMzAuNyA1MC42LTc2LjEgNTAuNi02My40IDAtODUuNC0yOC42LTk3LjEtNjQuMXoiXQogICAgfTsKICAgIGZhTGFzdGZtU3F1YXJlID0gZmFTcXVhcmVMYXN0Zm07CiAgICBmYUdvb2RyZWFkc0cgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZ29vZHJlYWRzLWciLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZjNhOSIsICJNMTAuOCA0MDMuM2wyLjggMGMxMi43IDAgMjUuNSAwIDM4LjIgLjEgMS42IDAgMy4xLS40IDMuNiAyLjEgNy4xIDM0LjkgMzAgNTQuNiA2Mi45IDYzLjkgMjYuOSA3LjYgNTQuMSA3LjggODEuMyAxLjggMzMuOC03LjQgNTYtMjguMyA2OC02MC40IDgtMjEuNSAxMC43LTQzLjggMTEtNjYuNSAuMS01LjggLjMtNDctLjItNTIuOGwtLjktLjNjLS44IDEuNS0xLjcgMi45LTIuNSA0LjQtMjIuMSA0My4xLTYxLjMgNjcuNC0xMDUuNCA2OS4xLTEwMyA0LTE2OS40LTU3LTE3Mi0xNzYuMi0uNS0yMy43IDEuOC00Ni45IDguMy02OS43IDIwLjYtNzEuMSA3NC42LTExOC4yIDE1My45LTExOC44IDYxLjMtLjQgMTAxLjUgMzguNyAxMTYuMiA3MC4zIC41IDEuMSAxLjMgMi4zIDIuNCAxLjlsMC02MS42IDQ0LjMgMGMwIDI4MC4zIC4xIDMzMi4yIC4xIDMzMi4yLS4xIDc4LjUtMjYuNyAxNDMuNy0xMDMgMTYyLjItNjkuNSAxNi45LTE1OSA0LjgtMTk2LTU3LjItOC0xMy41LTExLjgtMjguMy0xMy00NC41ek0xNTcuMSAzNi41Yy01Mi41LS41LTEwOC41IDQwLjctMTE1IDEzMy44LTQuMSA1OSAxNC44IDEyMi4yIDcxLjUgMTQ4LjYgMjcuNiAxMi45IDc0LjMgMTUgMTA4LjMtOC43IDQ3LjYtMzMuMiA2Mi43LTk3IDU0LjgtMTU0LTkuNy03MS4xLTQ3LjgtMTIwLTExOS42LTExOS43eiJdCiAgICB9OwogICAgZmFDY01hc3RlcmNhcmQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY2MtbWFzdGVyY2FyZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMWYxIiwgIk00ODIuOSA0MTAuM2MwIDYuOC00LjYgMTEuNy0xMS4yIDExLjctNi44IDAtMTEuMi01LjItMTEuMi0xMS43czQuNC0xMS43IDExLjItMTEuN2M2LjYgMCAxMS4yIDUuMiAxMS4yIDExLjd6TTE3Mi4xIDM5OC42Yy03LjEgMC0xMS4yIDUuMi0xMS4yIDExLjdTMTY1IDQyMiAxNzIuMSA0MjJjNi41IDAgMTAuOS00LjkgMTAuOS0xMS43LS4xLTYuNS00LjQtMTEuNy0xMC45LTExLjd6bTExNy41LS4zYy01LjQgMC04LjcgMy41LTkuNSA4LjdsMTkuMSAwYy0uOS01LjctNC40LTguNy05LjYtOC43em0xMDcuOCAuM2MtNi44IDAtMTAuOSA1LjItMTAuOSAxMS43czQuMSAxMS43IDEwLjkgMTEuNyAxMS4yLTQuOSAxMS4yLTExLjdjMC02LjUtNC40LTExLjctMTEuMi0xMS43em0xMDUuOSAyNi4xYzAgLjMgLjMgLjUgLjMgMS4xIDAgLjMtLjMgLjUtLjMgMS4xLS4zIC4zLS4zIC41LS41IC44LS4zIC4zLS41IC41LTEuMSAuNS0uMyAuMy0uNSAuMy0xLjEgLjMtLjMgMC0uNSAwLTEuMS0uMy0uMyAwLS41LS4zLS44LS41LS4zLS4zLS41LS41LS41LS44LS4zLS41LS4zLS44LS4zLTEuMSAwLS41IDAtLjggLjMtMS4xIDAtLjUgLjMtLjggLjUtMS4xIC4zLS4zIC41LS4zIC44LS41IC41LS4zIC44LS4zIDEuMS0uMyAuNSAwIC44IDAgMS4xIC4zIC41IC4zIC44IC4zIDEuMSAuNXMuMiAuNiAuNSAxLjF6bS0yLjIgMS40Yy41IDAgLjUtLjMgLjgtLjMgLjMtLjMgLjMtLjUgLjMtLjhzMC0uNS0uMy0uOGMtLjMgMC0uNS0uMy0xLjEtLjNsLTEuNiAwIDAgMy41IC44IDAgMC0xLjQgLjMgMCAxLjEgMS40IC44IDAtMS4xLTEuM3pNNTc2IDgxbDAgMzUyYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDQ4IDQ4MWMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCA4MUMwIDU0LjUgMjEuNSAzMyA0OCAzM2w0ODAgMGMyNi41IDAgNDggMjEuNSA0OCA0OHpNNjQgMjIwLjZjMCA3Ni41IDYyLjEgMTM4LjUgMTM4LjUgMTM4LjUgMjcuMiAwIDUzLjktOC4yIDc2LjUtMjMuMS03Mi45LTU5LjMtNzIuNC0xNzEuMiAwLTIzMC41LTIyLjYtMTUtNDkuMy0yMy4xLTc2LjUtMjMuMS03Ni40LS4xLTEzOC41IDYyLTEzOC41IDEzOC4yek0yODggMzI5LjRjNzAuNS01NSA3MC4yLTE2Mi4yIDAtMjE3LjUtNzAuMiA1NS4zLTcwLjUgMTYyLjYgMCAyMTcuNXpNMTQ1LjcgNDA1LjdjMC04LjctNS43LTE0LjQtMTQuNy0xNC43LTQuNiAwLTkuNSAxLjQtMTIuOCA2LjUtMi40LTQuMS02LjUtNi41LTEyLjItNi41LTMuOCAwLTcuNiAxLjQtMTAuNiA1LjRsMC00LjQtOC4yIDAgMCAzNi43IDguMiAwYzAtMTguOS0yLjUtMzAuMiA5LTMwLjIgMTAuMiAwIDguMiAxMC4yIDguMiAzMC4ybDcuOSAwYzAtMTguMy0yLjUtMzAuMiA5LTMwLjIgMTAuMiAwIDguMiAxMCA4LjIgMzAuMmw4LjIgMCAwLTIzLS4yIDB6TTE5MC42IDM5MmwtNy45IDAgMCA0LjRjLTIuNy0zLjMtNi41LTUuNC0xMS43LTUuNC0xMC4zIDAtMTguMiA4LjItMTguMiAxOS4zIDAgMTEuMiA3LjkgMTkuMyAxOC4yIDE5LjMgNS4yIDAgOS0xLjkgMTEuNy01LjRsMCA0LjYgNy45IDAgMC0zNi44em00MC41IDI1LjZjMC0xNS0yMi45LTguMi0yMi45LTE1LjIgMC01LjcgMTEuOS00LjggMTguNS0xLjFsMy4zLTYuNWMtOS40LTYuMS0zMC4yLTYtMzAuMiA4LjIgMCAxNC4zIDIyLjkgOC4zIDIyLjkgMTUgMCA2LjMtMTMuNSA1LjgtMjAuNyAuOGwtMy41IDYuM2MxMS4yIDcuNiAzMi42IDYgMzIuNi03LjV6bTM1LjQgOS4zbC0yLjItNi44Yy0zLjggMi4xLTEyLjIgNC40LTEyLjItNC4xbDAtMTYuNiAxMy4xIDAgMC03LjQtMTMuMSAwIDAtMTEuMi04LjIgMCAwIDExLjItNy42IDAgMCA3LjMgNy42IDAgMCAxNi43YzAgMTcuNiAxNy4zIDE0LjQgMjIuNiAxMC45em0xMy4zLTEzLjRsMjcuNSAwYzAtMTYuMi03LjQtMjIuNi0xNy40LTIyLjYtMTAuNiAwLTE4LjIgNy45LTE4LjIgMTkuMyAwIDIwLjUgMjIuNiAyMy45IDMzLjggMTQuMmwtMy44LTZjLTcuOCA2LjQtMTkuNiA1LjgtMjEuOS00Ljl6TTMzOC45IDM5MmMtNC42LTItMTEuNi0xLjgtMTUuMiA0LjRsMC00LjQtOC4yIDAgMCAzNi43IDguMiAwIDAtMjAuN2MwLTExLjYgOS41LTEwLjEgMTIuOC04LjRsMi40LTcuNnptMTAuNiAxOC4zYzAtMTEuNCAxMS42LTE1LjEgMjAuNy04LjRsMy44LTYuNWMtMTEuNi05LjEtMzIuNy00LjEtMzIuNyAxNSAwIDE5LjggMjIuNCAyMy44IDMyLjcgMTVsLTMuOC02LjVjLTkuMiA2LjUtMjAuNyAyLjYtMjAuNy04LjZ6TTQxNi4yIDM5MmwtOC4yIDAgMCA0LjRjLTguMy0xMS0yOS45LTQuOC0yOS45IDEzLjkgMCAxOS4yIDIyLjQgMjQuNyAyOS45IDEzLjlsMCA0LjYgOC4yIDAgMC0zNi44em0zMy43IDBjLTIuNC0xLjItMTEtMi45LTE1LjIgNC40bDAtNC40LTcuOSAwIDAgMzYuNyA3LjkgMCAwLTIwLjdjMC0xMSA5LTEwLjMgMTIuOC04LjRsMi40LTcuNnptNDAuMy0xNC45bC03LjkgMCAwIDE5LjNjLTguMi0xMC45LTI5LjktNS4xLTI5LjkgMTMuOSAwIDE5LjQgMjIuNSAyNC42IDI5LjkgMTMuOWwwIDQuNiA3LjkgMCAwLTUxLjd6bTcuNi03NS4xbDAgNC42IC44IDAgMC00LjYgMS45IDAgMC0uOC00LjYgMCAwIC44IDEuOSAwem02LjYgMTIzLjhjMC0uNSAwLTEuMS0uMy0xLjYtLjMtLjMtLjUtLjgtLjgtMS4xcy0uOC0uNS0xLjEtLjhjLS41IDAtMS4xLS4zLTEuNi0uMy0uMyAwLS44IC4zLTEuNCAuMy0uNSAuMy0uOCAuNS0xLjEgLjgtLjUgLjMtLjggLjgtLjggMS4xLS4zIC41LS4zIDEuMS0uMyAxLjYgMCAuMyAwIC44IC4zIDEuNCAwIC4zIC4zIC44IC44IDEuMSAuMyAuMyAuNSAuNSAxLjEgLjggLjUgLjMgMS4xIC4zIDEuNCAuMyAuNSAwIDEuMSAwIDEuNi0uMyAuMy0uMyAuOC0uNSAxLjEtLjhzLjUtLjggLjgtMS4xYy4zLS42IC4zLTEuMSAuMy0xLjR6bTMuMi0xMjQuN2wtMS40IDAtMS42IDMuNS0xLjYtMy41LTEuNCAwIDAgNS40IC44IDAgMC00LjEgMS42IDMuNSAxLjEgMCAxLjQtMy41IDAgNC4xIDEuMSAwIDAtNS40em00LjQtODAuNWMwLTc2LjItNjIuMS0xMzguMy0xMzguNS0xMzguMy0yNy4yIDAtNTMuOSA4LjItNzYuNSAyMy4xIDcyLjEgNTkuMyA3My4yIDE3MS41IDAgMjMwLjUgMjIuNiAxNSA0OS41IDIzLjEgNzYuNSAyMy4xIDc2LjQgLjEgMTM4LjUtNjEuOSAxMzguNS0xMzguNHoiXQogICAgfTsKICAgIGZhRGlzY291cnNlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImRpc2NvdXJzZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMzkzIiwgIk0yMjUuOSAzMkMxMDMuMyAzMiAwIDEzMC41IDAgMjUyLjEgMCAyNTYgLjEgNDgwIC4xIDQ4MGwyMjUuOC0uMkMzNDguNiA0NzkuOCA0NDggMzc3LjUgNDQ4IDI1NS45UzM0OC42IDMyIDIyNS45IDMyek0yMjQgMzg0Yy0xOS40IDAtMzcuOS00LjMtNTQuNC0xMi4xTDg4LjUgMzkyIDExMS40IDMxN2MtOS44LTE4LjEtMTUuNC0zOC45LTE1LjQtNjEgMC03MC43IDU3LjMtMTI4IDEyOC0xMjhzMTI4IDU3LjMgMTI4IDEyOC01Ny4zIDEyOC0xMjggMTI4eiJdCiAgICB9OwogICAgZmFCbGFja1RpZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJibGFjay10aWUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjI3ZSIsICJNMCAzMmwwIDQ0OCA0NDggMCAwLTQ0OC00NDggMHpNMzE2LjUgMzU3LjJsLTkyLjUgODguNy05Mi41LTg4LjcgNjQuNS0xODQtNjQuNS04Ni42IDE4NC45IDAtNjQuNCA4Ni42IDY0LjUgMTg0eiJdCiAgICB9OwogICAgZmFTcXVhcmVGYWNlYm9vayA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtZmFjZWJvb2siLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiZmFjZWJvb2stc3F1YXJlIl0sICJmMDgyIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDk4LjIgMCAwLTE0NS44LTUyLjggMCAwLTc4LjIgNTIuOCAwIDAtMzMuN2MwLTg3LjEgMzkuNC0xMjcuNSAxMjUtMTI3LjUgMTYuMiAwIDQ0LjIgMy4yIDU1LjcgNi40bDAgNzAuOGMtNi0uNi0xNi41LTEtMjkuNi0xLTQyIDAtNTguMiAxNS45LTU4LjIgNTcuMmwwIDI3LjggODMuNiAwLTE0LjQgNzguMi02OS4zIDAgMCAxNDUuOCAxMjkgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnoiXQogICAgfTsKICAgIGZhRmFjZWJvb2tTcXVhcmUgPSBmYVNxdWFyZUZhY2Vib29rOwogICAgZmFCYXR0bGVOZXQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYmF0dGxlLW5ldCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmODM1IiwgIk00NDguOCAyMjUuNmMyNi45IC4yIDM1LjYtNy40IDM4LjktMTIuNCAxMi41LTE2LjMtNy4xLTQ3LjYtNTIuOC03MS4zIDE3LjgtMzMuNiAzMC4xLTYzLjcgMzYuMy04NS4zIDMuNC0xMS44IDEuMS0xOSAuNS0yMC4zLTEuNyAxMC41LTE1LjggNDguNS00OC4yIDEwMC0yNS0xMS4yLTU2LjUtMjAuMS05My44LTIzLjgtOC45LTE2LjktMzQuOS02My45LTYwLjUtODguOS0xNi44LTE2LjUtMzAuMy0yMi42LTQwLjgtMjMuNWwwIDBjLTEzLjgtMS42LTIyLjcgNS44LTI3LjQgMTEtMTcuMiAxOC41LTI0LjMgNDguOS0yNSA4NC4xLTcuMi0xMi4zLTE3LjItMjQuNi0yOC41LTI1LjlsLS4yIDBjLTIwLjctMy41LTM4LjQgMjkuMi0zNiA4MS4zLTM4LjQgMS40LTcxIDUuOC05MyAxMS4yLTkuOSAyLjQtMTYuMiA3LjMtMTcuOCA5LjcgMS0uNCAyMi40LTkuMiAxMTEuNi05LjIgNS4yIDUzIDI5LjggMTAxLjggMjYgOTMuMi05LjcgMTUuNC0zOC4yIDYyLjQtNDcuMyA5Ny43LTUuOSAyMi45LTQuNCAzNy42IC4yIDQ3LjEgNS42IDEyLjggMTYuNCAxNi43IDIzLjIgMTguMyAyNSA1LjcgNTUuNC0zLjYgODYuNy0yMS4xLTcuNSAxMi44LTEzLjkgMjguNS05LjEgMzkuMyA3LjMgMTkuNiA0NC41IDE4LjcgODguNC05LjQgMjAuMiAzMi4yIDQwLjEgNTcuOSA1NS43IDc0LjEgMi42IDIuOCA1LjUgNS4yIDguOCA3LjEgNS4xIDMuMiA4LjYgMy40IDguNiAzLjQtOC4yLTYuNy0zNC0zOC02Mi41LTkxLjggMjIuMi0xNiA0NS43LTM4LjkgNjcuNS02OS4zIDEyMi44IDQuNiAxNDMuMy0yNC44IDE0OC0zMS42IDE0LjctMTkuOSAzLjQtNTcuNC01Ny4zLTkzLjd6TTM3MSAzMzEuOGMyMy44LTM3LjcgMzAuMy02Ny44IDI5LjQtOTIuMyAyNy45IDE3LjYgNDcuMiAzNy42IDQ5LjEgNTguOCAxLjEgMTIuOS04LjEgMjkuMS03OC41IDMzLjV6TTIxNy4xIDM4Ny43YzkuOC02LjIgMTkuNS0xMy4xIDI5LjItMjAuNSA2LjcgMTMuMyAxMy42IDI2LjEgMjAuNiAzOC4yLTQwLjYgMjEuOS02OC44IDEyLjgtNDkuOC0xNy43em0yMTUtMTcxLjNjLTEwLjMtNS4zLTIxLjItMTAuMy0zMi40LTE1IDcuOS0xMi4xIDE1LjUtMjQuNCAyMi43LTM2LjkgMzkuMSAyNC4xIDQ1LjkgNTMuMiA5LjYgNTEuOXpNMjc5LjQgMzk4Yy01LjUtMTEuNC0xMS0yMy41LTE2LjUtMzYuNCA0My4yIDEuMyA2Mi40LTE4LjcgNjMuMy0yMC40IDAgLjEtMjUgMTUuNi02Mi41IDEyLjIgMzAuNi0yNS42IDU5LjEtNTMuNyA4NS4xLTg0IDguNy0xMC4yIDE3LTIwLjYgMjQuOS0zMS4xLS40LS4zLTEuNS0zLTE2LjUtMTItNTEuNyA2MC4zLTEwMi4zIDk4LTEzMi44IDExNS45LTIwLjYtMTEuMi00MC44LTMxLjgtNTUuNy02MS41LTIwLTM5LjktMzAtODIuNC0zMS42LTExNi4xIDEyLjMgLjkgMjUuMyAyLjIgMzguOCAzLjktMjIuMyAzNi44LTE0LjQgNjMtMTMuNSA2NC4yIDAtLjEtMS0yOS4yIDIwLjEtNTkuNiA5IDUyLjUgMjQgMTAzLjggNDQuNyAxNTIuOCAuOS0uNCAxLjggLjkgMTguNy04LjItMjYuMy03NC41LTMzLjgtMTM4LjItMzQtMTczLjQgMjAtMTIuNCA0OC4yLTE5LjggODEuNi0xNy44IDQ0LjYgMi43IDg2LjQgMTUuMiAxMTYuMyAzMC43LTcuMSAxMC40LTE0LjkgMjEuMy0yMy4zIDMyLjUtMjAuNy0zNy43LTQ3LjMtNDMuOS00OC45LTQzLjcgLjEgMCAyNS45IDE0LjEgNDEuNSA0Ny4yLTM3LjUtMTMuOC03Ni4xLTI0LjQtMTE1LjMtMzEuNy0xMy4xLTIuNC0yNi4yLTQuNC0zOS40LTYtLjEgLjQtMS44IDEuOC0yLjIgMjAuMyA3Ny45IDE0LjUgMTM2LjYgMzkuOSAxNjcuMiA1Ny4yIC43IDIzLjYtNyA1MS42LTI1LjQgNzkuNi0yNC42IDM3LjMtNTYuNCA2Ny4yLTg0LjggODUuNHptMjcuNC0yODdjLTQ0LjYtMS43LTczLjYgNy40LTk0LjcgMjAuNyAyLTUyLjMgMjEuMy03Ni40IDM4LjItNzUuMyAxNi45LTQuMiA1NC45IDUyLjIgNTYuNSA1NC42em0tMTMwLjcgMy4xYy41IDEyLjEgMS42IDI0LjYgMy4yIDM3LjMtMTQuNi0uOS0yOC43LTEuMy00Mi40LTEuMy0uMSAzLjItLjEtNTEgMjQuNy00OS42bC4xIDBjNS44IDEuMSAxMC42IDYuOSAxNC40IDEzLjZ6bS0yOC4xIDE2MmMyMC44IDM5LjcgNDMuMyA2MC42IDY1LjMgNzIuMy00Ni44IDI0LjgtNzcuNSAyMC04NC45IDQuNS0uMi0uMi0xMS4xLTE1LjMgMTkuNy03Ni44bDAgMHoiXQogICAgfTsKICAgIGZhQmltb2JqZWN0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImJpbW9iamVjdCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMzc4IiwgIk00MTYgMzJMMzIgMzJDMTQuNCAzMiAwIDQ2LjQgMCA2NEwwIDQ0OGMwIDE3LjYgMTQuNCAzMiAzMiAzMmwzODQgMGMxNy42IDAgMzItMTQuNCAzMi0zMmwwLTM4NGMwLTE3LjYtMTQuNC0zMi0zMi0zMnpNMzUyIDI4OS40YzAgNDkuNC0xMS40IDgyLjYtMTAzLjggODIuNmwtMTYuOSAwYy00NC4xIDAtNjIuNC0xNC45LTcwLjQtMzguOGwtLjkgMCAwIDM0LjgtNjQgMCAwLTIzMiA2NCAwIDAgNzQuNyAxLjEgMGM0LjYtMzAuNSAzOS43LTM4LjggNjkuNy0zOC44bDE3LjMgMGM5Mi40IDAgMTAzLjggMzMuMSAxMDMuOCA4Mi41bDAgMzUgLjEgMHptLTY0LTI4LjlsMCAyMi45YzAgMjEuNy0zLjQgMzMuOC0zOC40IDMzLjhsLTQ1LjMgMGMtMjguOSAwLTQ0LjEtNi41LTQ0LjEtMzUuN2wwLTE5YzAtMjkuMyAxNS4yLTM1LjcgNDQuMS0zNS43bDQ1LjMgMGMzNS0uMiAzOC40IDEyIDM4LjQgMzMuN3oiXQogICAgfTsKICAgIGljb25zID0gewogICAgICBmYVNxdWFyZUdpdGh1YiwKICAgICAgZmFHaXRodWJTcXVhcmUsCiAgICAgIGZhVGhpbmtQZWFrcywKICAgICAgZmFHb29nbGVEcml2ZSwKICAgICAgZmFBdXRvcHJlZml4ZXIsCiAgICAgIGZhU3F1YXJlVmlhZGVvLAogICAgICBmYVZpYWRlb1NxdWFyZSwKICAgICAgZmFDcGFuZWwsCiAgICAgIGZhTWVuZGVsZXksCiAgICAgIGZhRHJhZnQyZGlnaXRhbCwKICAgICAgZmFSZXBseWQsCiAgICAgIGZhRW1waXJlLAogICAgICBmYUFjY2Vzc2libGVJY29uLAogICAgICBmYVF1b3JhLAogICAgICBmYUNjSmNiLAogICAgICBmYUZlZG9yYSwKICAgICAgZmFEdW9saW5nbywKICAgICAgZmFGaXJzdGRyYWZ0LAogICAgICBmYUZyZWVic2QsCiAgICAgIGZhT2R5c2VlLAogICAgICBmYUdnQ2lyY2xlLAogICAgICBmYUNsb3VkZmxhcmUsCiAgICAgIGZhSGFja2VycmFuaywKICAgICAgZmFTa3lhdGxhcywKICAgICAgZmFEZXNrcHJvLAogICAgICBmYVJlc29sdmluZywKICAgICAgZmFCbGFja2JlcnJ5LAogICAgICBmYVN0cmlwZVMsCiAgICAgIGZhU3F1YXJlQmVoYW5jZSwKICAgICAgZmFCZWhhbmNlU3F1YXJlLAogICAgICBmYVNlcnZpY2VzdGFjaywKICAgICAgZmFSb2NrZXRjaGF0LAogICAgICBmYVJlYmVsLAogICAgICBmYVNxdWFyZVdlYkF3ZXNvbWUsCiAgICAgIGZhTGlua3RyZWUsCiAgICAgIGZhU2ltcGx5YnVpbHQsCiAgICAgIGZhU3R1YmJlciwKICAgICAgZmFBcHBlciwKICAgICAgZmFHb29nbGVTY2hvbGFyLAogICAgICBmYVlhcm4sCiAgICAgIGZhU3RhY2tPdmVyZmxvdywKICAgICAgZmFCbHVldG9vdGgsCiAgICAgIGZhQ3JlYXRpdmVDb21tb25zTmNKcCwKICAgICAgZmFSZWRkaXQsCiAgICAgIGZhQ29ubmVjdGRldmVsb3AsCiAgICAgIGZhUmVzZWFyY2hnYXRlLAogICAgICBmYVNpZ25hbE1lc3NlbmdlciwKICAgICAgZmFYaW5nLAogICAgICBmYVNxdWFyZUpzLAogICAgICBmYUpzU3F1YXJlLAogICAgICBmYUZvbnRpY29ucywKICAgICAgZmFVcHMsCiAgICAgIGZhQW1hem9uUGF5LAogICAgICBmYVBhbmRvcmEsCiAgICAgIGZhT3BlbmlkLAogICAgICBmYVZzY28sCiAgICAgIGZhVWJ1bnR1LAogICAgICBmYVZpYWNvaW4sCiAgICAgIGZhWmhpaHUsCiAgICAgIGZhWWFuZGV4LAogICAgICBmYVBpeGl2LAogICAgICBmYU9wZW5haSwKICAgICAgZmFTaXRoLAogICAgICBmYU5mY0RpcmVjdGlvbmFsLAogICAgICBmYUNyZWF0aXZlQ29tbW9uc0J5LAogICAgICBmYVVtYnJhY28sCiAgICAgIGZhSG9vbGksCiAgICAgIGZhU3F1YXJlR2l0LAogICAgICBmYUdpdFNxdWFyZSwKICAgICAgZmFPZG5va2xhc3NuaWtpLAogICAgICBmYURydXBhbCwKICAgICAgZmFCbG9nZ2VyQiwKICAgICAgZmFJbnZpc2lvbiwKICAgICAgZmFGYWNlYm9va0YsCiAgICAgIGZhQ2VudG9zLAogICAgICBmYUNjQW1hem9uUGF5LAogICAgICBmYUViYXksCiAgICAgIGZhQ29udGFvLAogICAgICBmYUVsbG8sCiAgICAgIGZhU2lzdHJpeCwKICAgICAgZmFQZXJpc2NvcGUsCiAgICAgIGZhRXhwZWRpdGVkc3NsLAogICAgICBmYU5hcHN0ZXIsCiAgICAgIGZhRGVsaWNpb3VzLAogICAgICBmYUd1aWxkZWQsCiAgICAgIGZhWGJveCwKICAgICAgZmFVbnRhcHBkLAogICAgICBmYUdvb2dsZVBsdXNHLAogICAgICBmYUdpdGh1YkFsdCwKICAgICAgZmFHZXRQb2NrZXQsCiAgICAgIGZhR2xpZGUsCiAgICAgIGZhQml0eSwKICAgICAgZmFXcGV4cGxvcmVyLAogICAgICBmYU1lZ2Fwb3J0LAogICAgICBmYU1kYiwKICAgICAgZmFQYWdlNCwKICAgICAgZmFUaGVSZWRZZXRpLAogICAgICBmYUppcmEsCiAgICAgIGZhRmVkZXgsCiAgICAgIGZhRXZlcm5vdGUsCiAgICAgIGZhVXNiLAogICAgICBmYUFuZ3J5Y3JlYXRpdmUsCiAgICAgIGZhTWl6dW5pLAogICAgICBmYUl0Y2hJbywKICAgICAgZmFXaW5kb3dzLAogICAgICBmYVN0dW1ibGV1cG9uLAogICAgICBmYUdvb2dsZSwKICAgICAgZmFEaXNjb3JkLAogICAgICBmYUhhY2tlck5ld3MsCiAgICAgIGZhRWxldmVudHksCiAgICAgIGZhMTF0eSwKICAgICAgZmFUZWFtc3BlYWssCiAgICAgIGZhU3VwcGxlLAogICAgICBmYVNxdWFyZVR3aXR0ZXIsCiAgICAgIGZhVHdpdHRlclNxdWFyZSwKICAgICAgZmFGb250QXdlc29tZSwKICAgICAgZmFGb250QXdlc29tZUZsYWcsCiAgICAgIGZhRm9udEF3ZXNvbWVMb2dvRnVsbCwKICAgICAgZmFXaXJzaW5kaGFuZHdlcmssCiAgICAgIGZhV3NoLAogICAgICBmYUNvbmZsdWVuY2UsCiAgICAgIGZhRGlnZywKICAgICAgZmFUaHJlYWRzLAogICAgICBmYVdwcmVzc3IsCiAgICAgIGZhUmVuZGFjdCwKICAgICAgZmFZb2FzdCwKICAgICAgZmFOaW1ibHIsCiAgICAgIGZhUGl4ZWxmZWQsCiAgICAgIGZhWWFob28sCiAgICAgIGZhQmx1ZXNreSwKICAgICAgZmFTY3JpYmQsCiAgICAgIGZhQ3JlYXRpdmVDb21tb25zUGQsCiAgICAgIGZhRWFybHliaXJkcywKICAgICAgZmFTcXVhcmVPZG5va2xhc3NuaWtpLAogICAgICBmYU9kbm9rbGFzc25pa2lTcXVhcmUsCiAgICAgIGZhTWFya2Rvd24sCiAgICAgIGZhVHlwbzMsCiAgICAgIGZhSm9vbWxhLAogICAgICBmYVdlaXhpbiwKICAgICAgZmFHcnVudCwKICAgICAgZmFSb2Nrcm1zLAogICAgICBmYVVuc3BsYXNoLAogICAgICBmYVNxdWFyZUluc3RhZ3JhbSwKICAgICAgZmFJbnN0YWdyYW1TcXVhcmUsCiAgICAgIGZhRmlyc3RPcmRlckFsdCwKICAgICAgZmFGdWxjcnVtLAogICAgICBmYUJyYXZlUmV2ZXJzZSwKICAgICAgZmFBdmlhbmV4LAogICAgICBmYU5zOCwKICAgICAgZmFTcXVhcmVQaW50ZXJlc3QsCiAgICAgIGZhUGludGVyZXN0U3F1YXJlLAogICAgICBmYUJsdWV0b290aEIsCiAgICAgIGZhR3JpcGZpcmUsCiAgICAgIGZhU3F1YXJlR29vZ2xlUGx1cywKICAgICAgZmFHb29nbGVQbHVzU3F1YXJlLAogICAgICBmYUFwcFN0b3JlLAogICAgICBmYVdpeCwKICAgICAgZmFJbnRlcmNvbSwKICAgICAgZmFSZWFjdGV1cm9wZSwKICAgICAgZmFXYXplLAogICAgICBmYUNyZWF0aXZlQ29tbW9uc1JlbWl4LAogICAgICBmYUJhbmRjYW1wLAogICAgICBmYVNxdWFyZVdlYkF3ZXNvbWVTdHJva2UsCiAgICAgIGZhVmltZW9WLAogICAgICBmYVN0cmF2YSwKICAgICAgZmFVbmlyZWdpc3RyeSwKICAgICAgZmFDY0RpbmVyc0NsdWIsCiAgICAgIGZhUGludGVyZXN0LAogICAgICBmYUFsZ29saWEsCiAgICAgIGZhU3RhY2twYXRoLAogICAgICBmYU9jdG9wdXNEZXBsb3ksCiAgICAgIGZhWWFtbWVyLAogICAgICBmYU1vZHgsCiAgICAgIGZhU3F1YXJlVGhyZWFkcywKICAgICAgZmFPbGRSZXB1YmxpYywKICAgICAgZmFTdXNlLAogICAgICBmYUFwcFN0b3JlSW9zLAogICAgICBmYVNxdWFyZURyaWJiYmxlLAogICAgICBmYURyaWJiYmxlU3F1YXJlLAogICAgICBmYVVpa2l0LAogICAgICBmYVN1cGVycG93ZXJzLAogICAgICBmYVlvdXR1YmUsCiAgICAgIGZhRW1iZXIsCiAgICAgIGZhQm9vdHN0cmFwLAogICAgICBmYUl0dW5lcywKICAgICAgZmFTcXVhcmVYaW5nLAogICAgICBmYVhpbmdTcXVhcmUsCiAgICAgIGZhQ3NzM0FsdCwKICAgICAgZmFTcXVhcmVzcGFjZSwKICAgICAgZmFUcmVsbG8sCiAgICAgIGZhVmlhZGVvLAogICAgICBmYVNlYXJjaGVuZ2luLAogICAgICBmYVBheXBhbCwKICAgICAgZmFTcXVhcmVCbHVlc2t5LAogICAgICBmYURBbmREQmV5b25kLAogICAgICBmYU1pY3Jvc29mdCwKICAgICAgZmFGbHksCiAgICAgIGZhQ2NTdHJpcGUsCiAgICAgIGZhV29yZHByZXNzU2ltcGxlLAogICAgICBmYVNlbGxzeSwKICAgICAgZmFEYXNoY3ViZSwKICAgICAgZmFHaXR0ZXIsCiAgICAgIGZhV29sZlBhY2tCYXR0YWxpb24sCiAgICAgIGZhTGFzdGZtLAogICAgICBmYVNob3B3YXJlLAogICAgICBmYUJsb2dnZXIsCiAgICAgIGZhRWRnZSwKICAgICAgZmFJb3hob3N0LAogICAgICBmYVNjaGxpeCwKICAgICAgZmFEQW5kRCwKICAgICAgZmFWdWVqcywKICAgICAgZmFNZXRhLAogICAgICBmYUNyZWF0aXZlQ29tbW9uc1NoYXJlLAogICAgICBmYVN0dWRpb3ZpbmFyaSwKICAgICAgZmFCaXRidWNrZXQsCiAgICAgIGZhVmssCiAgICAgIGZhR2l0aHViLAogICAgICBmYUNvZGllcGllLAogICAgICBmYVBpZWRQaXBlciwKICAgICAgZmFSYXNwYmVycnlQaSwKICAgICAgZmFDc3MzLAogICAgICBmYUh1YnNwb3QsCiAgICAgIGZhQ21wbGlkLAogICAgICBmYUR5YWxvZywKICAgICAgZmFFbGVtZW50b3IsCiAgICAgIGZhRmlyc3RPcmRlciwKICAgICAgZmFEcmliYmJsZSwKICAgICAgZmFMaW5rZWRpbiwKICAgICAgZmFDY1BheXBhbCwKICAgICAgZmFEaGwsCiAgICAgIGZhVGV4LAogICAgICBmYVNob3BpZnksCiAgICAgIGZhU3F1YXJlUmVkZGl0LAogICAgICBmYVJlZGRpdFNxdWFyZSwKICAgICAgZmFDcmVhdGl2ZUNvbW1vbnNOYywKICAgICAgZmFHYWxhY3RpY1JlcHVibGljLAogICAgICBmYUZhY2Vib29rLAogICAgICBmYUdpdGxhYiwKICAgICAgZmFRcSwKICAgICAgZmFTdHJpcGUsCiAgICAgIGZhRGFpbHltb3Rpb24sCiAgICAgIGZhU3RlYW0sCiAgICAgIGZhU25hcGNoYXQsCiAgICAgIGZhU25hcGNoYXRHaG9zdCwKICAgICAgZmFHYWxhY3RpY1NlbmF0ZSwKICAgICAgZmFQaG9lbml4RnJhbWV3b3JrLAogICAgICBmYUdpdCwKICAgICAgZmFPcHRpbk1vbnN0ZXIsCiAgICAgIGZhSmVua2lucywKICAgICAgZmFTbGlkZXNoYXJlLAogICAgICBmYVViZXIsCiAgICAgIGZhRGlnaXRhbE9jZWFuLAogICAgICBmYVNvdW5kY2xvdWQsCiAgICAgIGZhU3F1YXJlRmlnbWEsCiAgICAgIGZhQ3JlYXRpdmVDb21tb25zU2EsCiAgICAgIGZhQ2hyb21lLAogICAgICBmYVRyYWRlRmVkZXJhdGlvbiwKICAgICAgZmFWYWFkaW4sCiAgICAgIGZhRGV2aWFudGFydCwKICAgICAgZmFNZWRpdW0sCiAgICAgIGZhTWVkaXVtTSwKICAgICAgZmFPcGVuY2FydCwKICAgICAgZmFZQ29tYmluYXRvciwKICAgICAgZmFMaW5lLAogICAgICBmYUFtaWxpYSwKICAgICAgZmFBc3ltbWV0cmlrLAogICAgICBmYVBoYWJyaWNhdG9yLAogICAgICBmYUJvdHMsCiAgICAgIGZhVmluZSwKICAgICAgZmFNZWRydCwKICAgICAgZmFPc2ksCiAgICAgIGZhR2csCiAgICAgIGZhQnV5c2VsbGFkcywKICAgICAgZmFHb29nbGVQbHVzLAogICAgICBmYVNjcmVlbnBhbCwKICAgICAgZmFCaXRjb2luLAogICAgICBmYVN3aWZ0LAogICAgICBmYUZpbGVzUGlud2hlZWwsCiAgICAgIGZhTGFyYXZlbCwKICAgICAgZmFXcGZvcm1zLAogICAgICBmYVNwZWFrZXJEZWNrLAogICAgICBmYUZsaWNrciwKICAgICAgZmFDY1Zpc2EsCiAgICAgIGZhVXB3b3JrLAogICAgICBmYUtha2FvVGFsaywKICAgICAgZmFGbHV0dGVyLAogICAgICBmYUJ1ZmZlciwKICAgICAgZmFHcmF0aXBheSwKICAgICAgZmFHb29nbGVQYXksCiAgICAgIGZhQXBwbGUsCiAgICAgIGZhVHVtYmxyLAogICAgICBmYVBob2VuaXhTcXVhZHJvbiwKICAgICAgZmFDZW50ZXJjb2RlLAogICAgICBmYURlYmlhbiwKICAgICAgZmFNYXN0b2RvbiwKICAgICAgZmFTa2V0Y2gsCiAgICAgIGZhV2ViQXdlc29tZSwKICAgICAgZmFTYXNzLAogICAgICBmYVNxdWFyZVdoYXRzYXBwLAogICAgICBmYVdoYXRzYXBwU3F1YXJlLAogICAgICBmYVNreXBlLAogICAgICBmYUFuZ3VsYXIsCiAgICAgIGZhT3BlbnN1c2UsCiAgICAgIGZhRHJvcGJveCwKICAgICAgZmFEZWV6ZXIsCiAgICAgIGZhQ3JlYXRpdmVDb21tb25zU2FtcGxpbmcsCiAgICAgIGZhSmVkaU9yZGVyLAogICAgICBmYVJQcm9qZWN0LAogICAgICBmYUluc3RhbG9kLAogICAgICBmYUNhbmFkaWFuTWFwbGVMZWFmLAogICAgICBmYUV0aGVyZXVtLAogICAgICBmYUhvdXp6LAogICAgICBmYVZpYmVyLAogICAgICBmYUtpY2tzdGFydGVyLAogICAgICBmYVNxdWFyZUtpY2tzdGFydGVyLAogICAgICBmYVNwb3RpZnksCiAgICAgIGZhTGVhbnB1YiwKICAgICAgZmFKYXZhLAogICAgICBmYU5mY1N5bWJvbCwKICAgICAgZmFXb2R1LAogICAgICBmYVNxdWFyZVN0ZWFtLAogICAgICBmYVN0ZWFtU3F1YXJlLAogICAgICBmYUNyZWF0aXZlQ29tbW9uc05jRXUsCiAgICAgIGZhTnBtLAogICAgICBmYUNsb3Vkc2NhbGUsCiAgICAgIGZhVGhlbWVjbywKICAgICAgZmFHb29nbGVQbGF5LAogICAgICBmYUtvcnZ1ZSwKICAgICAgZmFXM2MsCiAgICAgIGZhR3JhdiwKICAgICAgZmFBd3MsCiAgICAgIGZhR2xpZGVHLAogICAgICBmYUpzZmlkZGxlLAogICAgICBmYUtleWJhc2UsCiAgICAgIGZhTHVtb25Ecm9wLAogICAgICBmYVdlZWJseSwKICAgICAgZmFEb2NrZXIsCiAgICAgIGZhTWFnZW50bywKICAgICAgZmFHaXRBbHQsCiAgICAgIGZhRmlyZWZveEJyb3dzZXIsCiAgICAgIGZhQ2xvdWRzbWl0aCwKICAgICAgZmFXaXphcmRzT2ZUaGVDb2FzdCwKICAgICAgZmFDcmVhdGl2ZUNvbW1vbnNOZCwKICAgICAgZmFVc3BzLAogICAgICBmYVNxdWFyZUxldHRlcmJveGQsCiAgICAgIGZhTWFuZGFsb3JpYW4sCiAgICAgIGZhU2xhY2ssCiAgICAgIGZhU2xhY2tIYXNoLAogICAgICBmYUFuZ2VsbGlzdCwKICAgICAgZmFBbmRyb2lkLAogICAgICBmYU1lZXR1cCwKICAgICAgZmFGb250aWNvbnNGaSwKICAgICAgZmFQYWxmZWQsCiAgICAgIGZhV3BiZWdpbm5lciwKICAgICAgZmFEaWFzcG9yYSwKICAgICAgZmFQcm9kdWN0SHVudCwKICAgICAgZmFTcXVhcmVVcHdvcmssCiAgICAgIGZhQ3V0dGxlZmlzaCwKICAgICAgZmFNZWRhcHBzLAogICAgICBmYVBpeCwKICAgICAgZmFTcXVhcmVUdW1ibHIsCiAgICAgIGZhVHVtYmxyU3F1YXJlLAogICAgICBmYVJlYWN0LAogICAgICBmYUp4bCwKICAgICAgZmFTcXVhcmVMaW5rZWRpbiwKICAgICAgZmFDc3MsCiAgICAgIGZhSGFzaG5vZGUsCiAgICAgIGZhUmVkZGl0QWxpZW4sCiAgICAgIGZhVGlrdG9rLAogICAgICBmYVdvcmRwcmVzcywKICAgICAgZmFJZGVhbCwKICAgICAgZmFQaWVkUGlwZXJQcCwKICAgICAgZmFVc3N1bm5haCwKICAgICAgZmFGb3J0QXdlc29tZUFsdCwKICAgICAgZmFCdXJvbW9iZWxleHBlcnRlLAogICAgICBmYUJpbGliaWxpLAogICAgICBmYU5lb3MsCiAgICAgIGZhRGV2LAogICAgICBmYUhvdGphciwKICAgICAgZmFEb2NodWIsCiAgICAgIGZhVmltZW8sCiAgICAgIGZhTWF4Y2RuLAogICAgICBmYVNxdWFyZUZvbnRBd2Vzb21lU3Ryb2tlLAogICAgICBmYUZvbnRBd2Vzb21lQWx0LAogICAgICBmYVNwZWFrYXAsCiAgICAgIGZhRmFudGFzeUZsaWdodEdhbWVzLAogICAgICBmYUxpbnV4LAogICAgICBmYUNvdHRvbkJ1cmVhdSwKICAgICAgZmFHb29nbGVXYWxsZXQsCiAgICAgIGZhRm91cnNxdWFyZSwKICAgICAgZmFTaGlydHNpbmJ1bGssCiAgICAgIGZhTWludGJpdCwKICAgICAgZmFTdGF5bGlua2VkLAogICAgICBmYVdlYmZsb3csCiAgICAgIGZhUmVucmVuLAogICAgICBmYVJldiwKICAgICAgZmFLZXljZG4sCiAgICAgIGZhSGlyZUFIZWxwZXIsCiAgICAgIGZhU3F1YXJlSGFja2VyTmV3cywKICAgICAgZmFIYWNrZXJOZXdzU3F1YXJlLAogICAgICBmYUNyZWF0aXZlQ29tbW9uc1BkQWx0LAogICAgICBmYU9yY2lkLAogICAgICBmYUJlaGFuY2UsCiAgICAgIGZhTW9uZXJvLAogICAgICBmYUZpZ21hLAogICAgICBmYUluc3RhZ3JhbSwKICAgICAgZmFQZXJieXRlLAogICAgICBmYVNxdWFyZVZpbWVvLAogICAgICBmYVZpbWVvU3F1YXJlLAogICAgICBmYVB1c2hlZCwKICAgICAgZmFNaXhjbG91ZCwKICAgICAgZmFZYW5kZXhJbnRlcm5hdGlvbmFsLAogICAgICBmYUhpdmUsCiAgICAgIGZhQ3JlYXRpdmVDb21tb25zWmVybywKICAgICAgZmFTcXVhcmVTbmFwY2hhdCwKICAgICAgZmFTbmFwY2hhdFNxdWFyZSwKICAgICAgZmFUaGVtZWlzbGUsCiAgICAgIGZhRGFydExhbmcsCiAgICAgIGZhRGVwbG95ZG9nLAogICAgICBmYUZsaXBib2FyZCwKICAgICAgZmFCdXlOTGFyZ2UsCiAgICAgIGZhV2F0Y2htYW5Nb25pdG9yaW5nLAogICAgICBmYUhpcHMsCiAgICAgIGZhQ2xvdWR2ZXJzaWZ5LAogICAgICBmYUdvb2RyZWFkcywKICAgICAgZmFUaWRhbCwKICAgICAgZmFVbml0eSwKICAgICAgZmFUZW5jZW50V2VpYm8sCiAgICAgIGZhRnJlZUNvZGVDYW1wLAogICAgICBmYVhUd2l0dGVyLAogICAgICBmYVN0aWNrZXJNdWxlLAogICAgICBmYVR3aXRjaCwKICAgICAgZmFLaWNrc3RhcnRlckssCiAgICAgIGZhQ3JpdGljYWxSb2xlLAogICAgICBmYVN0ZWFtU3ltYm9sLAogICAgICBmYU1haWxjaGltcCwKICAgICAgZmFMdW1vbiwKICAgICAgZmFOdXRyaXRpb25peCwKICAgICAgZmFDcmVhdGl2ZUNvbW1vbnNTYW1wbGluZ1BsdXMsCiAgICAgIGZhUmVkaGF0LAogICAgICBmYVNxdWFyZVBpZWRQaXBlciwKICAgICAgZmFQaWVkUGlwZXJTcXVhcmUsCiAgICAgIGZhV2hhdHNhcHAsCiAgICAgIGZhSW1kYiwKICAgICAgZmFQeXRob24sCiAgICAgIGZhQ2FzaEFwcCwKICAgICAgZmFQaW50ZXJlc3RQLAogICAgICBmYVdobWNzLAogICAgICBmYUpvZ2V0LAogICAgICBmYVNxdWFyZVlvdXR1YmUsCiAgICAgIGZhWW91dHViZVNxdWFyZSwKICAgICAgZmFBdGxhc3NpYW4sCiAgICAgIGZhUGllZFBpcGVySGF0LAogICAgICBmYUludGVybmV0RXhwbG9yZXIsCiAgICAgIGZhQWlyYm5iLAogICAgICBmYUpzLAogICAgICBmYVF1aW5zY2FwZSwKICAgICAgZmFBZHZlcnNhbCwKICAgICAgZmFDcmVhdGl2ZUNvbW1vbnMsCiAgICAgIGZhTm90aW9uLAogICAgICBmYUNocm9tZWNhc3QsCiAgICAgIGZhV2lraXBlZGlhVywKICAgICAgZmFTaXRyb3gsCiAgICAgIGZhU3F1YXJlR2l0bGFiLAogICAgICBmYUdpdGxhYlNxdWFyZSwKICAgICAgZmFTaG9lbGFjZSwKICAgICAgZmFTZWxsY2FzdCwKICAgICAgZmFNaXgsCiAgICAgIGZhQ2NBcHBsZVBheSwKICAgICAgZmFCcmF2ZSwKICAgICAgZmFFdHN5LAogICAgICBmYUJ0YywKICAgICAgZmFBZG4sCiAgICAgIGZhU3F1YXJlWFR3aXR0ZXIsCiAgICAgIGZhU3F1YXJlRm9udEF3ZXNvbWUsCiAgICAgIGZhRm9ydW1iZWUsCiAgICAgIGZhNDJHcm91cCwKICAgICAgZmFJbm5vc29mdCwKICAgICAgZmFTdHVtYmxldXBvbkNpcmNsZSwKICAgICAgZmFTeW1mb255LAogICAgICBmYVNhbGVzZm9yY2UsCiAgICAgIGZhU291cmNldHJlZSwKICAgICAgZmFMaW5rZWRpbkluLAogICAgICBmYUh0bWw1LAogICAgICBmYVJ1c3QsCiAgICAgIGZhSG9ybmJpbGwsCiAgICAgIGZhUGhwLAogICAgICBmYURpc3F1cywKICAgICAgZmE1MDBweCwKICAgICAgZmFBZmZpbGlhdGV0aGVtZSwKICAgICAgZmFSZWRSaXZlciwKICAgICAgZmFUd2l0dGVyLAogICAgICBmYUZvcnRBd2Vzb21lLAogICAgICBmYU1peGVyLAogICAgICBmYUx5ZnQsCiAgICAgIGZhQXBwbGVQYXksCiAgICAgIGZhQXJ0c3RhdGlvbiwKICAgICAgZmFOb2RlSnMsCiAgICAgIGZhVW5jaGFydGVkLAogICAgICBmYVBsYXlzdGF0aW9uLAogICAgICBmYU1pY3JvYmxvZywKICAgICAgZmFHaXRrcmFrZW4sCiAgICAgIGZhVGVsZWdyYW0sCiAgICAgIGZhVGVsZWdyYW1QbGFuZSwKICAgICAgZmFJdHVuZXNOb3RlLAogICAgICBmYUxlc3MsCiAgICAgIGZhRmlyZWZveCwKICAgICAgZmFLYWdnbGUsCiAgICAgIGZhRmFjZWJvb2tNZXNzZW5nZXIsCiAgICAgIGZhQXVkaWJsZSwKICAgICAgZmFQYXRyZW9uLAogICAgICBmYVZudiwKICAgICAgZmFQYWdlbGluZXMsCiAgICAgIGZhQW1hem9uLAogICAgICBmYUVudmlyYSwKICAgICAgZmFMaW5vZGUsCiAgICAgIGZhQWNjdXNvZnQsCiAgICAgIGZhRXJsYW5nLAogICAgICBmYUNjRGlzY292ZXIsCiAgICAgIGZhU2FmYXJpLAogICAgICBmYVNwYWNlQXdlc29tZSwKICAgICAgZmFOb2RlLAogICAgICBmYUNvZGVwZW4sCiAgICAgIGZhUmF2ZWxyeSwKICAgICAgZmFBbGlwYXksCiAgICAgIGZhQ2NBbWV4LAogICAgICBmYVBpZWRQaXBlckFsdCwKICAgICAgZmFMZXR0ZXJib3hkLAogICAgICBmYU9wZXJhLAogICAgICBmYVdlaWJvLAogICAgICBmYVJlYWRtZSwKICAgICAgZmFHb2xhbmcsCiAgICAgIGZhU3RhY2tFeGNoYW5nZSwKICAgICAgZmFHdWxwLAogICAgICBmYVllbHAsCiAgICAgIGZhR29mb3JlLAogICAgICBmYUF2aWF0bywKICAgICAgZmFQYWRsZXQsCiAgICAgIGZhRWRnZUxlZ2FjeSwKICAgICAgZmFTcXVhcmVMYXN0Zm0sCiAgICAgIGZhTGFzdGZtU3F1YXJlLAogICAgICBmYUdvb2RyZWFkc0csCiAgICAgIGZhQ2NNYXN0ZXJjYXJkLAogICAgICBmYURpc2NvdXJzZSwKICAgICAgZmFCbGFja1RpZSwKICAgICAgZmFTcXVhcmVGYWNlYm9vaywKICAgICAgZmFGYWNlYm9va1NxdWFyZSwKICAgICAgZmFCYXR0bGVOZXQsCiAgICAgIGZhQmltb2JqZWN0CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGZvcnRhd2Vzb21lK2ZyZWUtcmVndWxhci1zdmctaWNvbnNANy4xLjAvbm9kZV9tb2R1bGVzL0Bmb3J0YXdlc29tZS9mcmVlLXJlZ3VsYXItc3ZnLWljb25zL2luZGV4Lm1qcwp2YXIgcHJlZml4MiwgZmFTcXVhcmVNaW51cywgZmFNaW51c1NxdWFyZSwgZmFDYWxlbmRhckNoZWNrLCBmYUZhY2VLaXNzLCBmYUtpc3MsIGZhUGFzdGUsIGZhRmlsZUNsaXBib2FyZCwgZmFIYW5kUG9pbnRMZWZ0LCBmYUZpbGVFeGNlbCwgZmFFbnZlbG9wZSwgZmFTcXVhcmVDYXJldERvd24sIGZhQ2FyZXRTcXVhcmVEb3duLCBmYVRydWNrLCBmYUJlbGwsIGZhTWVzc2FnZSwgZmFDb21tZW50QWx0LCBmYUZhY2VEaXp6eSwgZmFEaXp6eSwgZmFDYWxlbmRhckRheXMsIGZhQ2FsZW5kYXJBbHQsIGZhSGFuZFBvaW50VXAsIGZhSGFuZExpemFyZCwgZmFTcXVhcmVGdWxsLCBmYUNpcmNsZVBhdXNlLCBmYVBhdXNlQ2lyY2xlLCBmYUhhcmREcml2ZSwgZmFIZGQsIGZhRmlsZVppcHBlciwgZmFGaWxlQXJjaGl2ZSwgZmFGbG9wcHlEaXNrLCBmYVNhdmUsIGZhRmFjZUdyaW5Ub25ndWVTcXVpbnQsIGZhR3JpblRvbmd1ZVNxdWludCwgZmFDYW1lcmEsIGZhQ2FtZXJhQWx0LCBmYUZhY2VHcmluU3RhcnMsIGZhR3JpblN0YXJzLCBmYUV5ZSwgZmFGYWNlU2FkVGVhciwgZmFTYWRUZWFyLCBmYVNoYXJlRnJvbVNxdWFyZSwgZmFTaGFyZVNxdWFyZSwgZmFOb3RlU3RpY2t5LCBmYVN0aWNreU5vdGUsIGZhSGFuZEJhY2tGaXN0LCBmYUhhbmRSb2NrLCBmYUNoZXNzUXVlZW4sIGZhRmFjZUdyaW5UZWFycywgZmFHcmluVGVhcnMsIGZhUGVuVG9TcXVhcmUsIGZhRWRpdCwgZmFGYWNlR3JpbkJlYW1Td2VhdCwgZmFHcmluQmVhbVN3ZWF0LCBmYUNsb2NrLCBmYUNsb2NrRm91ciwgZmFGYWNlTGF1Z2hXaW5rLCBmYUxhdWdoV2luaywgZmFQYXBlclBsYW5lLCBmYUhlYXJ0LCBmYUZvbnRBd2Vzb21lMiwgZmFGb250QXdlc29tZUZsYWcyLCBmYUZvbnRBd2Vzb21lTG9nb0Z1bGwyLCBmYUNsb25lLCBmYUZvbGRlck9wZW4sIGZhV2luZG93TWluaW1pemUsIGZhU3RhckhhbGYsIGZhQWxhcm1DbG9jaywgZmFOZXdzcGFwZXIsIGZhSG9zcGl0YWwsIGZhSG9zcGl0YWxBbHQsIGZhSG9zcGl0YWxXaWRlLCBmYUNpcmNsZVN0b3AsIGZhU3RvcENpcmNsZSwgZmFPYmplY3RVbmdyb3VwLCBmYUNvbW1lbnQsIGZhQ2hlc3NQYXduLCBmYUNhbGVuZGFyUGx1cywgZmFDbGlwYm9hcmQsIGZhVGh1bWJzRG93biwgZmFJZEJhZGdlLCBmYVNxdWFyZUNoZWNrLCBmYUNoZWNrU3F1YXJlLCBmYUNoZXNzQmlzaG9wLCBmYUVudmVsb3BlT3BlbiwgZmFDaXJjbGVYbWFyaywgZmFUaW1lc0NpcmNsZSwgZmFYbWFya0NpcmNsZSwgZmFTcXVhcmVDYXJldFVwLCBmYUNhcmV0U3F1YXJlVXAsIGZhRmlsZUltYWdlLCBmYVNxdWFyZUNhcmV0UmlnaHQsIGZhQ2FyZXRTcXVhcmVSaWdodCwgZmFTdW4sIGZhSW1hZ2UsIGZhTGlnaHRidWxiLCBmYUFkZHJlc3NDYXJkLCBmYUNvbnRhY3RDYXJkLCBmYVZjYXJkLCBmYUZhY2VNZWgsIGZhTWVoLCBmYU1hcCwgZmFIYW5kUG9pbnREb3duLCBmYUZhY2VNZWhCbGFuaywgZmFNZWhCbGFuaywgZmFGYWNlR3JpblRvbmd1ZSwgZmFHcmluVG9uZ3VlLCBmYUZ1dGJvbCwgZmFGdXRib2xCYWxsLCBmYVNvY2NlckJhbGwsIGZhRmFjZVN1cnByaXNlLCBmYVN1cnByaXNlLCBmYUZvbGRlciwgZmFGb2xkZXJCbGFuaywgZmFDbG91ZCwgZmFDaXJjbGUsIGZhRmFjZUdyaW5TcXVpbnQsIGZhR3JpblNxdWludCwgZmFDaXJjbGVVc2VyLCBmYVVzZXJDaXJjbGUsIGZhUmVjdGFuZ2xlTGlzdCwgZmFMaXN0QWx0LCBmYUhhbmQsIGZhSGFuZFBhcGVyLCBmYVRodW1ic1VwLCBmYUJ1aWxkaW5nLCBmYUNoZXNzUm9vaywgZmFDaXJjbGVRdWVzdGlvbiwgZmFRdWVzdGlvbkNpcmNsZSwgZmFGaWxlLCBmYUZhY2VTYWRDcnksIGZhU2FkQ3J5LCBmYUNhbGVuZGFyTWludXMsIGZhRmFjZVRpcmVkLCBmYVRpcmVkLCBmYUhhbmRQb2ludFJpZ2h0LCBmYUNpcmNsZVVwLCBmYUFycm93QWx0Q2lyY2xlVXAsIGZhSGFuZFNjaXNzb3JzLCBmYUdlbSwgZmFSZWN0YW5nbGVYbWFyaywgZmFSZWN0YW5nbGVUaW1lcywgZmFUaW1lc1JlY3RhbmdsZSwgZmFXaW5kb3dDbG9zZSwgZmFUcmFzaENhbiwgZmFUcmFzaEFsdCwgZmFMaWZlUmluZywgZmFDb3B5cmlnaHQsIGZhQ2lyY2xlTGVmdCwgZmFBcnJvd0FsdENpcmNsZUxlZnQsIGZhQ2FsZW5kYXIsIGZhRmFjZUZyb3duT3BlbiwgZmFGcm93bk9wZW4sIGZhQ2hhcnRCYXIsIGZhQmFyQ2hhcnQsIGZhSG91c2UsIGZhSG9tZSwgZmFIb21lQWx0LCBmYUhvbWVMZ0FsdCwgZmFGYWNlRnJvd24sIGZhRnJvd24sIGZhVXNlciwgZmFVc2VyQWx0LCBmYVVzZXJMYXJnZSwgZmFTbm93Zmxha2UsIGZhQm9va21hcmssIGZhU3F1YXJlQ2FyZXRMZWZ0LCBmYUNhcmV0U3F1YXJlTGVmdCwgZmFIYW5kc2hha2UsIGZhSGFuZHNoYWtlQWx0LCBmYUhhbmRzaGFrZVNpbXBsZSwgZmFGYWNlU21pbGVXaW5rLCBmYVNtaWxlV2luaywgZmFGYWNlR3JpblNxdWludFRlYXJzLCBmYUdyaW5TcXVpbnRUZWFycywgZmFGaWxlQXVkaW8sIGZhQ2FsZW5kYXJYbWFyaywgZmFDYWxlbmRhclRpbWVzLCBmYUNpcmNsZURvd24sIGZhQXJyb3dBbHRDaXJjbGVEb3duLCBmYUZpbGVMaW5lcywgZmFGaWxlQWx0LCBmYUZpbGVUZXh0LCBmYUNvbW1lbnRzLCBmYUNpcmNsZUNoZWNrLCBmYUNoZWNrQ2lyY2xlLCBmYU1vb24sIGZhQ2xvc2VkQ2FwdGlvbmluZywgZmFJbWFnZXMsIGZhQ2lyY2xlUmlnaHQsIGZhQXJyb3dBbHRDaXJjbGVSaWdodCwgZmFJZENhcmQsIGZhRHJpdmVyc0xpY2Vuc2UsIGZhQ2lyY2xlUGxheSwgZmFQbGF5Q2lyY2xlLCBmYUZhY2VMYXVnaEJlYW0sIGZhTGF1Z2hCZWFtLCBmYUFkZHJlc3NCb29rLCBmYUNvbnRhY3RCb29rLCBmYUhvdXJnbGFzcywgZmFIb3VyZ2xhc3NFbXB0eSwgZmFIZWFkcGhvbmVzLCBmYUhlYWRwaG9uZXNBbHQsIGZhSGVhZHBob25lc1NpbXBsZSwgZmFGaWxlUG93ZXJwb2ludCwgZmFXaW5kb3dNYXhpbWl6ZSwgZmFDb21tZW50RG90cywgZmFDb21tZW50aW5nLCBmYUZhY2VHcmluVG9uZ3VlV2luaywgZmFHcmluVG9uZ3VlV2luaywgZmFIb3VyZ2xhc3NIYWxmLCBmYUhvdXJnbGFzczIsIGZhQ3JlZGl0Q2FyZCwgZmFDcmVkaXRDYXJkQWx0LCBmYUhhbmRTcG9jaywgZmFCZWxsU2xhc2gsIGZhU3RhciwgZmFGbGFnLCBmYUxlbW9uLCBmYVdpbmRvd1Jlc3RvcmUsIGZhRmFjZUdyaW5IZWFydHMsIGZhR3JpbkhlYXJ0cywgZmFGYWNlS2lzc0JlYW0sIGZhS2lzc0JlYW0sIGZhRmlsZVBkZiwgZmFGYWNlR3JpbldpZGUsIGZhR3JpbkFsdCwgZmFGYWNlTGF1Z2hTcXVpbnQsIGZhTGF1Z2hTcXVpbnQsIGZhRmFjZUtpc3NXaW5rSGVhcnQsIGZhS2lzc1dpbmtIZWFydCwgZmFDb3B5LCBmYUNoZXNzS2luZywgZmFTcXVhcmVQbHVzLCBmYVBsdXNTcXVhcmUsIGZhRmlsZUNvZGUsIGZhRmFjZUdyaW5XaW5rLCBmYUdyaW5XaW5rLCBmYU1vbmV5QmlsbDEsIGZhTW9uZXlCaWxsQWx0LCBmYUV5ZVNsYXNoLCBmYUZpbGVXb3JkLCBmYUZhY2VBbmdyeSwgZmFBbmdyeSwgZmFDaGVzc0tuaWdodCwgZmFGYWNlR3JpbkJlYW0sIGZhR3JpbkJlYW0sIGZhSGFuZFBlYWNlLCBmYUNvbXBhc3MsIGZhU3F1YXJlLCBmYUZhY2VHcmluLCBmYUdyaW4sIGZhRmFjZVNtaWxlLCBmYVNtaWxlLCBmYUZhY2VTbWlsZUJlYW0sIGZhU21pbGVCZWFtLCBmYUZvbGRlckNsb3NlZCwgZmFLZXlib2FyZCwgZmFGYWNlUm9sbGluZ0V5ZXMsIGZhTWVoUm9sbGluZ0V5ZXMsIGZhRmFjZUdyaW1hY2UsIGZhR3JpbWFjZSwgZmFDaXJjbGVEb3QsIGZhRG90Q2lyY2xlLCBmYU9iamVjdEdyb3VwLCBmYUZhY2VGbHVzaGVkLCBmYUZsdXNoZWQsIGZhU3RhckhhbGZTdHJva2UsIGZhU3RhckhhbGZBbHQsIGZhRmlsZVZpZGVvLCBmYUZhY2VMYXVnaCwgZmFMYXVnaCwgZmFIYW5kUG9pbnRlciwgZmFSZWdpc3RlcmVkLCBpY29uczI7CnZhciBpbml0X2ZyZWVfcmVndWxhcl9zdmdfaWNvbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZm9ydGF3ZXNvbWUrZnJlZS1yZWd1bGFyLXN2Zy1pY29uc0A3LjEuMC9ub2RlX21vZHVsZXMvQGZvcnRhd2Vzb21lL2ZyZWUtcmVndWxhci1zdmctaWNvbnMvaW5kZXgubWpzIigpIHsKICAgIHByZWZpeDIgPSAiZmFyIjsKICAgIGZhU3F1YXJlTWludXMgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLW1pbnVzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbNjE3NjcsICJtaW51cy1zcXVhcmUiXSwgImYxNDYiLCAiTTY0IDgwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMjBjMCA4LjggNy4yIDE2IDE2IDE2bDMyMCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyMGMwLTguOC03LjItMTYtMTYtMTZMNjQgODB6TTAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMzIwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2ek0xMzYgMjMybDE3NiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNzYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhTWludXNTcXVhcmUgPSBmYVNxdWFyZU1pbnVzOwogICAgZmFDYWxlbmRhckNoZWNrID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNhbGVuZGFyLWNoZWNrIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyNzQiLCAiTTMyOCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgNDAgMzIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI4OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDMyIDAgMC00MGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgNDAgMTYwIDAgMC00MGMwLTEzLjMgMTAuNy0yNCAyNC0yNHpNNjQgMTEyYy04LjggMC0xNiA3LjItMTYgMTZsMCAyODhjMCA4LjggNy4yIDE2IDE2IDE2bDMyMCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTI4OGMwLTguOC03LjItMTYtMTYtMTZMNjQgMTEyem0yMzAuNyA2NS45YzcuOC0xMC43IDIyLjgtMTMuMSAzMy41LTUuMyAxMC43IDcuOCAxMy4xIDIyLjggNS4zIDMzLjVMMjExLjQgMzc0LjFjLTQuMSA1LjctMTAuNSA5LjMtMTcuNSA5LjgtNyAuNS0xMy45LTItMTguOC02LjlsLTU1LjktNTUuOWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDM2IDM2IDEwNS42LTE0NS4yeiJdCiAgICB9OwogICAgZmFGYWNlS2lzcyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWtpc3MiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MzUsICJraXNzIl0sICJmNTk2IiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDAgLTQxNiAwIDIwOCAyMDggMCAxIDAgNDE2IDB6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTI0MCAwbDMyIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDggMCAxMi4zLTQuNiAyMy41LTEyLjIgMzIgNy42IDguNSAxMi4yIDE5LjcgMTIuMiAzMiAwIDI2LjUtMjEuNSA0OC00OCA0OGwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNmwxNiAwYzguOCAwIDE2LTcuMiAxNi0xNnMtNy4yLTE2LTE2LTE2bC0xNiAwYy04LjggMC0xNi03LjItMTYtMTZzNy4yLTE2IDE2LTE2bDE2IDBjOC44IDAgMTYtNy4yIDE2LTE2cy03LjItMTYtMTYtMTZsLTE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZ6bS05Ni00OGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0xOTItMzJhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFLaXNzID0gZmFGYWNlS2lzczsKICAgIGZhUGFzdGUgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAicGFzdGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiZmlsZS1jbGlwYm9hcmQiXSwgImYwZWEiLCAiTTY0IDQ4bDIyNCAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDQ4IDQ4IDAgMC00OGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAwQzI4LjcgMCAwIDI4LjcgMCA2NEwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxMTIgMCAwLTQ4LTExMiAwYy04LjggMC0xNi03LjItMTYtMTZMNDggNjRjMC04LjggNy4yLTE2IDE2LTE2em0xNzYgNzJjMC0xMy4zLTEwLjctMjQtMjQtMjRMMTA0IDk2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDEwNS42IDBjOC44LTguNiAxOS0xNS44IDMwLjItMjEuMSAuMS0uOSAuMi0xLjkgLjItMi45ek00NDggNDY0bC0xNjAgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMjI0YzAtOC44IDcuMi0xNiAxNi0xNmwxMDEuNSAwYzQuMiAwIDguMyAxLjcgMTEuMyA0LjdsNTguNSA1OC41YzMgMyA0LjcgNy4xIDQuNyAxMS4zTDQ2NCA0NDhjMCA4LjgtNy4yIDE2LTE2IDE2ek0yMjQgMjI0bDAgMjI0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE2MCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTY1LjVjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNsLTU4LjUtNTguNWMtMTItMTItMjguMy0xOC43LTQ1LjMtMTguN0wyODggMTYwYy0zNS4zIDAtNjQgMjguNy02NCA2NHoiXQogICAgfTsKICAgIGZhRmlsZUNsaXBib2FyZCA9IGZhUGFzdGU7CiAgICBmYUhhbmRQb2ludExlZnQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1wb2ludC1sZWZ0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYwYTUiLCAiTTY0IDEyOGwxNzcuNiAwYy0xIDUuMi0xLjYgMTAuNS0xLjYgMTZsMCAxNi0xNzYgMGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNnptMjI0IDE2YzAtMTcuNyAxNC4zLTMyIDMyLTMybDI0IDBjNjYuMyAwIDEyMCA1My43IDEyMCAxMjBsMCA0OGMwIDUyLjUtMzMuNyA5Ny4xLTgwLjcgMTEzLjQgLjUtMy4xIC43LTYuMiAuNy05LjQgMC0yMC05LjItMzcuOS0yMy42LTQ5LjcgNC45LTkgNy42LTE5LjQgNy42LTMwLjMgMC0xNS4xLTUuMy0yOS0xNC00MCA4LjgtMTEgMTQtMjQuOSAxNC00MGwwLTQwYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgNDBjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC04MHptMzItODBsMCAwYy0xOCAwLTM0LjYgNi00OCAxNkw2NCA4MEMyOC43IDgwIDAgMTA4LjcgMCAxNDRzMjguNyA2NCA2NCA2NGw4MiAwYy0xLjMgNS4xLTIgMTAuNS0yIDE2IDAgMjUuMyAxNC43IDQ3LjIgMzYgNTcuNi0yLjYgNy00IDE0LjUtNCAyMi40IDAgMjAgOS4yIDM3LjkgMjMuNiA0OS43LTQuOSA5LTcuNiAxOS40LTcuNiAzMC4zIDAgMzUuMyAyOC43IDY0IDY0IDY0bDg4IDBjOTIuOCAwIDE2OC03NS4yIDE2OC0xNjhsMC00OGMwLTkyLjgtNzUuMi0xNjgtMTY4LTE2OGwtMjQgMHpNMjU2IDQwMGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNmw2NCAwYzguOCAwIDE2IDcuMiAxNiAxNnMtNy4yIDE2LTE2IDE2bC02NCAwek0yNDAgMjI0YzAgNS41IC43IDEwLjkgMiAxNmwtMzQgMGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNmwzMiAwIDAgMTZ6bTI0IDY0bDQwIDBjOC44IDAgMTYgNy4yIDE2IDE2cy03LjIgMTYtMTYgMTZsLTY0IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsMjQgMHoiXQogICAgfTsKICAgIGZhRmlsZUV4Y2VsID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZpbGUtZXhjZWwiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjFjMyIsICJNNjQgNDhsMTEyIDAgMCA4OGMwIDM5LjggMzIuMiA3MiA3MiA3Mmw4OCAwIDAgMjQwYzAgOC44LTcuMiAxNi0xNiAxNkw2NCA0NjRjLTguOCAwLTE2LTcuMi0xNi0xNkw0OCA2NGMwLTguOCA3LjItMTYgMTYtMTZ6TTIyNCA2Ny45bDkyLjEgOTIuMS02OC4xIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtNjguMXpNNjQgMEMyOC43IDAgMCAyOC43IDAgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjU2IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNjEuNWMwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0wyNDIuNyAxOC43QzIzMC43IDYuNyAyMTQuNSAwIDE5Ny41IDBMNjQgMHptOTkuMiAyNjUuNmMtOC0xMC42LTIzLTEyLjgtMzMuNi00LjhzLTEyLjggMjMtNC44IDMzLjZMMTYyIDM0NCAxMjQuOCAzOTMuNmMtOCAxMC42LTUuOCAyNS42IDQuOCAzMy42czI1LjYgNS44IDMzLjYtNC44TDE5MiAzODQgMjIwLjggNDIyLjRjOCAxMC42IDIzIDEyLjggMzMuNiA0LjhzMTIuOC0yMyA0LjgtMzMuNkwyMjIgMzQ0IDI1OS4yIDI5NC40YzgtMTAuNiA1LjgtMjUuNi00LjgtMzMuNnMtMjUuNi01LjgtMzMuNiA0LjhMMTkyIDMwNCAxNjMuMiAyNjUuNnoiXQogICAgfTsKICAgIGZhRW52ZWxvcGUgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZW52ZWxvcGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgzODYsIDk5OTMsIDYxNDQzXSwgImYwZTAiLCAiTTYxLjQgNjRDMjcuNSA2NCAwIDkxLjUgMCAxMjUuNCAwIDEyNi4zIDAgMTI3LjEgLjEgMTI4TDAgMTI4IDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2LS4xIDBjMC0uOSAuMS0xLjcgLjEtMi42IDAtMzMuOS0yNy41LTYxLjQtNjEuNC02MS40TDYxLjQgNjR6TTQ2NCAxOTIuM0w0NjQgMzg0YzAgOC44LTcuMiAxNi0xNiAxNkw2NCA0MDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTE5MS43IDE1NC44IDExNy40YzMxLjQgMjMuOSA3NC45IDIzLjkgMTA2LjQgMEw0NjQgMTkyLjN6TTQ4IDEyNS40QzQ4IDExOCA1NCAxMTIgNjEuNCAxMTJsMzg5LjIgMGM3LjQgMCAxMy40IDYgMTMuNCAxMy40IDAgNC4yLTIgOC4yLTUuMyAxMC43TDI4MC4yIDI3MS41Yy0xNC4zIDEwLjgtMzQuMSAxMC44LTQ4LjQgMEw1My4zIDEzNi4xYy0zLjMtMi41LTUuMy02LjUtNS4zLTEwLjd6Il0KICAgIH07CiAgICBmYVNxdWFyZUNhcmV0RG93biA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtY2FyZXQtZG93biIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJjYXJldC1zcXVhcmUtZG93biJdLCAiZjE1MCIsICJNMzg0IDQzMmM4LjggMCAxNi03LjIgMTYtMTZsMC0zMjBjMC04LjgtNy4yLTE2LTE2LTE2TDY0IDgwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMjBjMCA4LjggNy4yIDE2IDE2IDE2bDMyMCAwem02NC0xNmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMzIwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjB6TTIyNCAzNTJjLTYuNyAwLTEzLTIuOC0xNy42LTcuN2wtMTA0LTExMmMtNi41LTctOC4yLTE3LjItNC40LTI1LjlTMTEwLjUgMTkyIDEyMCAxOTJsMjA4IDBjOS41IDAgMTguMiA1LjcgMjIgMTQuNHMyLjEgMTguOS00LjQgMjUuOWwtMTA0IDExMmMtNC41IDQuOS0xMC45IDcuNy0xNy42IDcuN3oiXQogICAgfTsKICAgIGZhQ2FyZXRTcXVhcmVEb3duID0gZmFTcXVhcmVDYXJldERvd247CiAgICBmYVRydWNrID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInRydWNrIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4NjY2LCA5OTUxXSwgImYwZDEiLCAiTTY0IDgwYy04LjggMC0xNiA3LjItMTYgMTZsMCAyODhjMCA4LjggNy4yIDE2IDE2IDE2bDMuMyAwYzEwLjQtMzYuOSA0NC40LTY0IDg0LjctNjRzNzQuMiAyNy4xIDg0LjcgNjRsMTAyLjYgMGM0LjktMTcuNCAxNS4xLTMyLjcgMjguNy00My45TDM2OCA5NmMwLTguOC03LjItMTYtMTYtMTZMNjQgODB6bTMuMyAzNjhMNjQgNDQ4Yy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDI4OCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIgNTUuNCAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43bDQwLjYgNDAuNmMxMiAxMiAxOC43IDI4LjMgMTguNyA0NS4zTDU3NiAzODRjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTMuMyAwYy0xMC40IDM2LjktNDQuNCA2NC04NC43IDY0cy03NC4yLTI3LjEtODQuNy02NGwtMTAyLjYgMGMtMTAuNCAzNi45LTQ0LjQgNjQtODQuNyA2NHMtNzQuMi0yNy4xLTg0LjctNjR6TTQxNiAyNTZsMTEyIDAgMC0yMy40YzAtNC4yLTEuNy04LjMtNC43LTExLjNsLTQwLjYtNDAuNmMtMy0zLTcuMS00LjctMTEuMy00LjdsLTU1LjQgMCAwIDgwem0wIDQ4bDAgMzIuNGMyLjYtLjIgNS4zLS40IDgtLjQgNDAuMyAwIDc0LjIgMjcuMSA4NC43IDY0bDMuMyAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTgwLTExMiAwek0xNTIgNDY0YTQwIDQwIDAgMSAwIDAtODAgNDAgNDAgMCAxIDAgMCA4MHptMjcyIDBhNDAgNDAgMCAxIDAgMC04MCA0MCA0MCAwIDEgMCAwIDgweiJdCiAgICB9OwogICAgZmFCZWxsID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImJlbGwiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjgyNzYsIDYxNjAyXSwgImYwZjMiLCAiTTIyNCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDkuN0MxMTguNiA0NS4zIDU2IDExNS40IDU2IDIwMGwwIDE0LjVjMCAzNy43LTEwIDc0LjctMjkgMTA3LjNMNS4xIDM1OS4yQzEuOCAzNjUgMCAzNzEuNSAwIDM3OC4yIDAgMzk5LjEgMTYuOSA0MTYgMzcuOCA0MTZsMzcyLjQgMGMyMC45IDAgMzcuOC0xNi45IDM3LjgtMzcuOCAwLTYuNy0xLjgtMTMuMy01LjEtMTlMNDIxIDMyMS43Yy0xOS0zMi42LTI5LTY5LjYtMjktMTA3LjNsMC0xNC41YzAtODQuNi02Mi42LTE1NC43LTE0NC0xNjYuM2wwLTkuN2MwLTEzLjMtMTAuNy0yNC0yNC0yNHpNMzkyLjQgMzY4bC0zMzYuOSAwIDEyLjktMjIuMUM5MS43IDMwNiAxMDQgMjYwLjYgMTA0IDIxNC41bDAtMTQuNWMwLTY2LjMgNTMuNy0xMjAgMTIwLTEyMHMxMjAgNTMuNyAxMjAgMTIwbDAgMTQuNWMwIDQ2LjIgMTIuMyA5MS41IDM1LjUgMTMxLjRMMzkyLjQgMzY4ek0xNTYuMSA0NjRjOS45IDI4IDM2LjYgNDggNjcuOSA0OHM1OC0yMCA2Ny45LTQ4bC0xMzUuOCAweiJdCiAgICB9OwogICAgZmFNZXNzYWdlID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogIm1lc3NhZ2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiY29tbWVudC1hbHQiXSwgImYyN2EiLCAiTTIwMy43IDUxMi45czAgMCAwIDBsLTM3LjggMjYuN2MtNy4zIDUuMi0xNi45IDUuOC0yNC45IDEuN1MxMjggNTI5IDEyOCA1MjBsMC03Mi0zMiAwYy01MyAwLTk2LTQzLTk2LTk2TDAgMTI4QzAgNzUgNDMgMzIgOTYgMzJsMzIwIDBjNTMgMCA5NiA0MyA5NiA5NmwwIDIyNGMwIDUzLTQzIDk2LTk2IDk2bC0xMjAuNCAwLTkxLjkgNjQuOXptNjQuMy0xMDQuMWM4LjEtNS43IDE3LjgtOC44IDI3LjctOC44TDQxNiA0MDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0yMjRjMC0yNi41LTIxLjUtNDgtNDgtNDhMOTYgODBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgMjI0YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDU2IDBjMTAuNCAwIDE5LjMgNi42IDIyLjYgMTUuOSAuOSAyLjUgMS40IDUuMiAxLjQgOC4xbDAgNDkuN2MzMi43LTIzLjEgNjMuMy00NC43IDkxLjktNjQuOXoiXQogICAgfTsKICAgIGZhQ29tbWVudEFsdCA9IGZhTWVzc2FnZTsKICAgIGZhRmFjZURpenp5ID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2UtZGl6enkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiZGl6enkiXSwgImY1NjciLCAiTTQ2NCAyNTZhMjA4IDIwOCAwIDEgMCAtNDE2IDAgMjA4IDIwOCAwIDEgMCA0MTYgMHpNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHpNMTM0LjEgMTUzLjlsMjUuOSAyNS45IDI1LjktMjUuOWM3LjgtNy44IDIwLjUtNy44IDI4LjMgMHM3LjggMjAuNSAwIDI4LjNsLTI1LjkgMjUuOSAyNS45IDI1LjljNy44IDcuOCA3LjggMjAuNSAwIDI4LjNzLTIwLjUgNy44LTI4LjMgMGwtMjUuOS0yNS45LTI1LjkgMjUuOWMtNy44IDcuOC0yMC41IDcuOC0yOC4zIDBzLTcuOC0yMC41IDAtMjguM2wyNS45LTI1LjktMjUuOS0yNS45Yy03LjgtNy44LTcuOC0yMC41IDAtMjguM3MyMC41LTcuOCAyOC4zIDB6bTE5MiAwbDI1LjkgMjUuOSAyNS45LTI1LjljNy44LTcuOCAyMC41LTcuOCAyOC4zIDBzNy44IDIwLjUgMCAyOC4zbC0yNS45IDI1LjkgMjUuOSAyNS45YzcuOCA3LjggNy44IDIwLjUgMCAyOC4zcy0yMC41IDcuOC0yOC4zIDBsLTI1LjktMjUuOS0yNS45IDI1LjljLTcuOCA3LjgtMjAuNSA3LjgtMjguMyAwcy03LjgtMjAuNSAwLTI4LjNsMjUuOS0yNS45LTI1LjktMjUuOWMtNy44LTcuOC03LjgtMjAuNSAwLTI4LjNzMjAuNS03LjggMjguMyAwek0yNTYgMjg4YTY0IDY0IDAgMSAxIDAgMTI4IDY0IDY0IDAgMSAxIDAtMTI4eiJdCiAgICB9OwogICAgZmFEaXp6eSA9IGZhRmFjZURpenp5OwogICAgZmFDYWxlbmRhckRheXMgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY2FsZW5kYXItZGF5cyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJjYWxlbmRhci1hbHQiXSwgImYwNzMiLCAiTTEyMCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgNDAgMTYwIDAgMC00MGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgNDAgMzIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI4OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDMyIDAgMC00MGMwLTEzLjMgMTAuNy0yNCAyNC0yNHpNMzg0IDQzMmM4LjggMCAxNi03LjIgMTYtMTZsMC02NC04OCAwIDAgODAgNzIgMHptMTYtMTI4bDAtODAtODggMCAwIDgwIDg4IDB6bS0xMzYgMGwwLTgwLTgwIDAgMCA4MCA4MCAwem0tMTI4IDBsMC04MC04OCAwIDAgODAgODggMHpNNDggMzUybDAgNjRjMCA4LjggNy4yIDE2IDE2IDE2bDcyIDAgMC04MC04OCAwem0xMzYgMGwwIDgwIDgwIDAgMC04MC04MCAwek0xMjAgMTEybC01NiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCA0OCAzNTIgMCAwLTQ4YzAtOC44LTcuMi0xNi0xNi0xNmwtMjY0IDB6Il0KICAgIH07CiAgICBmYUNhbGVuZGFyQWx0ID0gZmFDYWxlbmRhckRheXM7CiAgICBmYUhhbmRQb2ludFVwID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImhhbmQtcG9pbnQtdXAiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFs5NzU3XSwgImYwYTYiLCAiTTY0IDY0bDAgMTc3LjZjNS4yLTEgMTAuNS0xLjYgMTYtMS42bDE2IDAgMC0xNzZjMC04LjgtNy4yLTE2LTE2LTE2UzY0IDU1LjIgNjQgNjR6TTgwIDI4OGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAyNGMwIDY2LjMgNTMuNyAxMjAgMTIwIDEyMGw0OCAwYzUyLjUgMCA5Ny4xLTMzLjcgMTEzLjQtODAuNy0zLjEgLjUtNi4yIC43LTkuNCAuNy0yMCAwLTM3LjktOS4yLTQ5LjctMjMuNi05IDQuOS0xOS40IDcuNi0zMC4zIDcuNi0xNS4xIDAtMjktNS4zLTQwLTE0LTExIDguOC0yNC45IDE0LTQwIDE0bC00MCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDQwIDBjOC44IDAgMTYtNy4yIDE2LTE2cy03LjItMTYtMTYtMTZsLTgwIDB6TTAgMzIwbDAgMGMwLTE4IDYtMzQuNiAxNi00OEwxNiA2NEMxNiAyOC43IDQ0LjcgMCA4MCAwczY0IDI4LjcgNjQgNjRsMCA4MmM1LjEtMS4zIDEwLjUtMiAxNi0yIDI1LjMgMCA0Ny4yIDE0LjcgNTcuNiAzNiA3LTIuNiAxNC41LTQgMjIuNC00IDIwIDAgMzcuOSA5LjIgNDkuNyAyMy42IDktNC45IDE5LjQtNy42IDMwLjMtNy42IDM1LjMgMCA2NCAyOC43IDY0IDY0bDAgODhjMCA5Mi44LTc1LjIgMTY4LTE2OCAxNjhsLTQ4IDBDNzUuMiA1MTIgMCA0MzYuOCAwIDM0NGwwLTI0em0zMzYtNjRjMC04LjgtNy4yLTE2LTE2LTE2cy0xNiA3LjItMTYgMTZsMCA2NGMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtNjR6TTE2MCAyNDBjNS41IDAgMTAuOSAuNyAxNiAybDAtMzRjMC04LjgtNy4yLTE2LTE2LTE2cy0xNiA3LjItMTYgMTZsMCAzMiAxNiAwem02NCAyNGwwIDQwYzAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZsMC02NGMwLTguOC03LjItMTYtMTYtMTZzLTE2IDcuMi0xNiAxNmwwIDI0eiJdCiAgICB9OwogICAgZmFIYW5kTGl6YXJkID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImhhbmQtbGl6YXJkIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyNTgiLCAiTTcyIDExMmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNjggMGMzNS4zIDAgNjQgMjguNyA2NCA2NHMtMjguNyA2NC02NCA2NGwtMTA0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTUyIDBjNC41IDAgOC45IDEuMyAxMi43IDMuNmw2NCA0MGM3IDQuNCAxMS4zIDEyLjEgMTEuMyAyMC40bDAgMjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0xMC43LTQ2LjktMjkuMy0xNDUuMSAwYy0zOS44IDAtNzItMzIuMi03Mi03MnMzMi4yLTcyIDcyLTcybDEwNCAwYzguOCAwIDE2LTcuMiAxNi0xNnMtNy4yLTE2LTE2LTE2TDcyIDIwOGMtMzkuOCAwLTcyLTMyLjItNzItNzJTMzIuMiA2NCA3MiA2NGwyMDkuNiAwYzQ2LjcgMCA5MC45IDIxLjUgMTE5LjcgNTguM2w3OC40IDEwMC4xYzIwLjkgMjYuNyAzMi4zIDU5LjcgMzIuMyA5My43TDUxMiA0MjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0xMDcuOWMwLTIzLjItNy44LTQ1LjgtMjIuMS02NC4xTDM2My41IDE1MS45Yy0xOS43LTI1LjItNDkuOS0zOS45LTgxLjktMzkuOUw3MiAxMTJ6Il0KICAgIH07CiAgICBmYVNxdWFyZUZ1bGwgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLWZ1bGwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg5OTcsIDEyODk5OCwgMTI4OTk5LCAxMjllMywgMTI5MDAxLCAxMjkwMDIsIDEyOTAwMywgMTEwMzUsIDExMDM2XSwgImY0NWMiLCAiTTQ0OCA0OGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzODRjMCA4LjgtNy4yIDE2LTE2IDE2TDY0IDQ2NGMtOC44IDAtMTYtNy4yLTE2LTE2TDQ4IDY0YzAtOC44IDcuMi0xNiAxNi0xNmwzODQgMHpNNjQgMEMyOC43IDAgMCAyOC43IDAgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zODRjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMHoiXQogICAgfTsKICAgIGZhQ2lyY2xlUGF1c2UgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLXBhdXNlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjIwOTIsICJwYXVzZS1jaXJjbGUiXSwgImYyOGIiLCAiTTI1NiA0OGEyMDggMjA4IDAgMSAxIDAgNDE2IDIwOCAyMDggMCAxIDEgMC00MTZ6bTAgNDY0YTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMjI0IDE4NGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDE0NGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTQ0em0xMTIgMGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDE0NGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTQ0eiJdCiAgICB9OwogICAgZmFQYXVzZUNpcmNsZSA9IGZhQ2lyY2xlUGF1c2U7CiAgICBmYUhhcmREcml2ZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJoYXJkLWRyaXZlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI4NDM2LCAiaGRkIl0sICJmMGEwIiwgIk02NCA4MGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMTYyYzUuMS0xLjMgMTAuNS0yIDE2LTJsMzIwIDBjNS41IDAgMTAuOSAuNyAxNiAybDAtMTYyYzAtOC44LTcuMi0xNi0xNi0xNkw2NCA4MHpNNDggMzIwbDAgOTZjMCA4LjggNy4yIDE2IDE2IDE2bDMyMCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTk2YzAtOC44LTcuMi0xNi0xNi0xNkw2NCAzMDRjLTguOCAwLTE2IDcuMi0xNiAxNnpNMCAzMjBMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtOTZ6bTIxNiA0OGEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwem0xMjAtMjRhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4eiJdCiAgICB9OwogICAgZmFIZGQgPSBmYUhhcmREcml2ZTsKICAgIGZhRmlsZVppcHBlciA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLXppcHBlciIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJmaWxlLWFyY2hpdmUiXSwgImYxYzYiLCAiTTY0IDQ4bDExMiAwIDAgODhjMCAzOS44IDMyLjIgNzIgNzIgNzJsODggMCAwIDI0MGMwIDguOC03LjIgMTYtMTYgMTZMNjQgNDY0Yy04LjggMC0xNi03LjItMTYtMTZMNDggNjRjMC04LjggNy4yLTE2IDE2LTE2ek0yMjQgNjcuOWw5Mi4xIDkyLjEtNjguMSAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTY4LjF6TTY0IDBDMjguNyAwIDAgMjguNyAwIDY0TDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI1NiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjYxLjVjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNMMjQyLjcgMTguN0MyMzAuNyA2LjcgMjE0LjUgMCAxOTcuNSAwTDY0IDB6TTgwIDEwNGMwIDEzLjMgMTAuNyAyNCAyNCAyNGwxNiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xNiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHptMCA4MGMwIDEzLjMgMTAuNyAyNCAyNCAyNGwzMiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0zMiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHptNjQgNTZsLTMyIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgNDhjMCAyNi41IDIxLjUgNDggNDggNDhzNDgtMjEuNSA0OC00OGwwLTQ4YzAtMTcuNy0xNC4zLTMyLTMyLTMyem0tMTYgNjRhMTYgMTYgMCAxIDEgMCAzMiAxNiAxNiAwIDEgMSAwLTMyeiJdCiAgICB9OwogICAgZmFGaWxlQXJjaGl2ZSA9IGZhRmlsZVppcHBlcjsKICAgIGZhRmxvcHB5RGlzayA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmbG9wcHktZGlzayIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyODE5MCwgMTI4NDI2LCAic2F2ZSJdLCAiZjBjNyIsICJNNjQgODBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyMGMwIDguOCA3LjIgMTYgMTYgMTZsMzIwIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMjQyLjdjMC00LjItMS43LTguMy00LjctMTEuM0wzMjAgODYuNiAzMjAgMTc2YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0xNjAgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC05Ni0zMiAwem04MCAwbDAgODAgMTI4IDAgMC04MC0xMjggMHpNMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwyNDIuNyAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDQyOS4zIDEyOGMxMiAxMiAxOC43IDI4LjMgMTguNyA0NS4zTDQ0OCA0MTZjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2ek0xNjAgMzIwYTY0IDY0IDAgMSAxIDEyOCAwIDY0IDY0IDAgMSAxIC0xMjggMHoiXQogICAgfTsKICAgIGZhU2F2ZSA9IGZhRmxvcHB5RGlzazsKICAgIGZhRmFjZUdyaW5Ub25ndWVTcXVpbnQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1ncmluLXRvbmd1ZS1zcXVpbnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1NDEsICJncmluLXRvbmd1ZS1zcXVpbnQiXSwgImY1OGEiLCAiTTQ2NCAyNTZjMC0xMTQuOS05My4xLTIwOC0yMDgtMjA4UzQ4IDE0MS4xIDQ4IDI1NmMwIDc1LjkgNDAuNyAxNDIuNCAxMDEuNSAxNzguNy0zLjYtMTAuOS01LjUtMjIuNi01LjUtMzQuN2wwLTM3LjVjLTEwLjItMTIuNi0xOC4zLTI2LjktMjMuOC00Mi40LTQuMS0xMS42IDcuOC0yMS40IDE5LjYtMTcuOCAzNC43IDEwLjYgNzQuMiAxNi41IDExNi4xIDE2LjUgNDIgMCA4MS41LTYgMTE2LjMtMTYuNiAxMS44LTMuNiAyMy43IDYuMSAxOS42IDE3LjgtNS41IDE1LjYtMTMuNiAyOS45LTIzLjggNDIuNWwwIDM3LjVjMCAxMi4xLTEuOSAyMy44LTUuNSAzNC43IDYwLjgtMzYuMyAxMDEuNS0xMDIuNyAxMDEuNS0xNzguN3pNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMTI1LjgtNzUuN2MtNi4yLTUuMi03LjYtMTQuMy0zLjEtMjEuMXMxMy4zLTkuMiAyMC42LTUuNWw3OS42IDQwYzUuNCAyLjcgOC44IDguMiA4LjggMTQuM3MtMy40IDExLjYtOC44IDE0LjNsLTc5LjYgNDBjLTcuMyAzLjYtMTYuMSAxLjMtMjAuNi01LjVzLTMuMS0xNS45IDMuMS0yMS4xTDE1OSAyMDggMTI1LjggMTgwLjN6bTI2My42LTIxLjFjNC41IDYuOCAzLjEgMTUuOS0zLjEgMjEuMUwzNTMgMjA4IDM4Ni4yIDIzNS43YzYuMiA1LjIgNy42IDE0LjMgMy4xIDIxLjFzLTEzLjMgOS4yLTIwLjYgNS41bC03OS42LTQwYy01LjQtMi43LTguOC04LjItOC44LTE0LjNzMy40LTExLjYgOC44LTE0LjNsNzkuNi00MGM3LjMtMy42IDE2LjEtMS4zIDIwLjYgNS41ek0zMjAgNDE2bDAtMzcuNGMwLTE0LjctMTEuOS0yNi42LTI2LjYtMjYuNmwtMiAwYy0xMS4zIDAtMjEuMSA3LjktMjMuNiAxOC45LTIuOCAxMi42LTIwLjggMTIuNi0yMy42IDAtMi41LTExLjEtMTIuMy0xOC45LTIzLjYtMTguOWwtMiAwYy0xNC43IDAtMjYuNiAxMS45LTI2LjYgMjYuNmwwIDM3LjRjMCAzNS4zIDI4LjcgNjQgNjQgNjRzNjQtMjguNyA2NC02NHoiXQogICAgfTsKICAgIGZhR3JpblRvbmd1ZVNxdWludCA9IGZhRmFjZUdyaW5Ub25ndWVTcXVpbnQ7CiAgICBmYUNhbWVyYSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjYW1lcmEiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MjI1OCwgImNhbWVyYS1hbHQiXSwgImYwMzAiLCAiTTE5My4xIDMyYy0xOC43IDAtMzYuMiA5LjQtNDYuNiAyNC45TDEyMC41IDk2IDY0IDk2QzI4LjcgOTYgMCAxMjQuNyAwIDE2MEwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzODQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI1NmMwLTM1LjMtMjguNy02NC02NC02NGwtNTYuNSAwLTI2LTM5LjFDMzU1LjEgNDEuNCAzMzcuNiAzMiAzMTguOSAzMkwxOTMuMSAzMnptLTYuNyA1MS42YzEuNS0yLjIgNC0zLjYgNi43LTMuNmwxMjUuNyAwYzIuNyAwIDUuMiAxLjMgNi43IDMuNmwzMy4yIDQ5LjhjNC41IDYuNyAxMS45IDEwLjcgMjAgMTAuN2w2OS4zIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMjU2YzAgOC44LTcuMiAxNi0xNiAxNkw2NCA0MzJjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTI1NmMwLTguOCA3LjItMTYgMTYtMTZsNjkuMyAwYzggMCAxNS41LTQgMjAtMTAuN2wzMy4yLTQ5Ljh6TTI1NiAzODRhMTEyIDExMiAwIDEgMCAwLTIyNCAxMTIgMTEyIDAgMSAwIDAgMjI0ek0xOTIgMjcyYTY0IDY0IDAgMSAxIDEyOCAwIDY0IDY0IDAgMSAxIC0xMjggMHoiXQogICAgfTsKICAgIGZhQ2FtZXJhQWx0ID0gZmFDYW1lcmE7CiAgICBmYUZhY2VHcmluU3RhcnMgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1ncmluLXN0YXJzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI5MzIxLCAiZ3Jpbi1zdGFycyJdLCAiZjU4NyIsICJNMCAyNTZjMC0yOS42IDUtNTcuOSAxNC4yLTg0LjRsMTcuMyAxNi45LTQuNiAyN2MtNC4yIDI0LjQgNS42IDQ2LjIgMjIgNTkuOSA5LjggMTA1LjggOTguOCAxODguNyAyMDcuMSAxODguN3MxOTcuNC04Mi44IDIwNy4xLTE4OC42YzE2LjQtMTMuNyAyNi4xLTM1LjQgMjItNTkuOWwtNC42LTI3IDE3LjMtMTYuOWM5LjIgMjYuNCAxNC4yIDU0LjggMTQuMiA4NC40IDAgMTQxLjQtMTE0LjYgMjU2LTI1NiAyNTZTMCAzOTcuNCAwIDI1NnpNMjU2IDQ4Yy0xNS4yIDAtMzAgMS42LTQ0LjMgNC43TDIwMS40IDMxLjhDMTk3IDIzIDE5MS4xIDE1LjggMTg0LjIgMTAuMiAyMDcgMy42IDIzMS4xIDAgMjU2IDBzNDkgMy42IDcxLjggMTAuMkMzMjAuOSAxNS44IDMxNSAyMyAzMTAuNiAzMS44TDMwMC4zIDUyLjdDMjg2IDQ5LjYgMjcxLjIgNDggMjU2IDQ4ek0zNzIuMiAzMDIuM2MxMS44LTMuNiAyMy43IDYuMSAxOS42IDE3LjgtMTkuOCA1NS45LTczLjEgOTYtMTM1LjggOTYtNjIuNyAwLTExNi00MC0xMzUuOC05NS45LTQuMS0xMS42IDcuOC0yMS40IDE5LjYtMTcuOCAzNC43IDEwLjYgNzQuMiAxNi41IDExNi4xIDE2LjUgNDIgMCA4MS41LTYgMTE2LjMtMTYuNnpNMzUzLjcgNTMuMWM1LjktMTEuOSAyMi44LTExLjkgMjguNyAwbDIzLjMgNDcuMiA1MiA3LjZjMTMuMSAxLjkgMTguNCAxOCA4LjkgMjcuM2wtMzcuNyAzNi43IDguOSA1MS44YzIuMiAxMy4xLTExLjUgMjMtMjMuMiAxNi45TDM2OCAyMTYgMzIxLjUgMjQwLjVjLTExLjcgNi4yLTI1LjUtMy44LTIzLjItMTYuOWw4LjktNTEuOC0zNy43LTM2LjdjLTkuNS05LjMtNC4zLTI1LjQgOC45LTI3LjNsNTItNy42IDIzLjMtNDcuMnptLTE5NS4zIDBsMjMuMyA0Ny4yIDUyIDcuNmMxMy4xIDEuOSAxOC40IDE4IDguOSAyNy4zbC0zNy43IDM2LjcgOC45IDUxLjhjMi4yIDEzLjEtMTEuNSAyMy0yMy4yIDE2LjlMMTQ0IDIxNiA5Ny41IDI0MC41Yy0xMS43IDYuMi0yNS41LTMuOC0yMy4yLTE2LjlsOC45LTUxLjgtMzcuNy0zNi43Yy05LjUtOS4zLTQuMy0yNS40IDguOS0yNy4zbDUyLTcuNiAyMy4zLTQ3LjJjNS45LTExLjkgMjIuOC0xMS45IDI4LjcgMHoiXQogICAgfTsKICAgIGZhR3JpblN0YXJzID0gZmFGYWNlR3JpblN0YXJzOwogICAgZmFFeWUgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZXllIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4MDY1XSwgImYwNmUiLCAiTTI4OCA4MEMyMjIuOCA4MCAxNjkuMiAxMDkuNiAxMjguMSAxNDcuNyA4OS42IDE4My41IDYzIDIyNiA0OS40IDI1NiA2MyAyODYgODkuNiAzMjguNSAxMjguMSAzNjQuMyAxNjkuMiA0MDIuNCAyMjIuOCA0MzIgMjg4IDQzMnMxMTguOC0yOS42IDE1OS45LTY3LjdDNDg2LjQgMzI4LjUgNTEzIDI4NiA1MjYuNiAyNTYgNTEzIDIyNiA0ODYuNCAxODMuNSA0NDcuOSAxNDcuNyA0MDYuOCAxMDkuNiAzNTMuMiA4MCAyODggODB6TTk1LjQgMTEyLjZDMTQyLjUgNjguOCAyMDcuMiAzMiAyODggMzJzMTQ1LjUgMzYuOCAxOTIuNiA4MC42YzQ2LjggNDMuNSA3OC4xIDk1LjQgOTMgMTMxLjEgMy4zIDcuOSAzLjMgMTYuNyAwIDI0LjYtMTQuOSAzNS43LTQ2LjIgODcuNy05MyAxMzEuMS00Ny4xIDQzLjctMTExLjggODAuNi0xOTIuNiA4MC42UzE0Mi41IDQ0My4yIDk1LjQgMzk5LjRjLTQ2LjgtNDMuNS03OC4xLTk1LjQtOTMtMTMxLjEtMy4zLTcuOS0zLjMtMTYuNyAwLTI0LjYgMTQuOS0zNS43IDQ2LjItODcuNyA5My0xMzEuMXpNMjg4IDMzNmM0NC4yIDAgODAtMzUuOCA4MC04MCAwLTI5LjYtMTYuMS01NS41LTQwLTY5LjMtMS40IDU5LjctNDkuNiAxMDcuOS0xMDkuMyAxMDkuMyAxMy44IDIzLjkgMzkuNyA0MCA2OS4zIDQwem0tNzkuNi04OC40YzIuNSAuMyA1IC40IDcuNiAuNCAzNS4zIDAgNjQtMjguNyA2NC02NCAwLTIuNi0uMi01LjEtLjQtNy42LTM3LjQgMy45LTY3LjIgMzMuNy03MS4xIDcxLjF6bTQ1LjYtMTE1YzEwLjgtMyAyMi4yLTQuNSAzMy45LTQuNSA4LjggMCAxNy41IC45IDI1LjggMi42IC4zIC4xIC41IC4xIC44IC4yIDU3LjkgMTIuMiAxMDEuNCA2My43IDEwMS40IDEyNS4yIDAgNzAuNy01Ny4zIDEyOC0xMjggMTI4LTYxLjYgMC0xMTMtNDMuNS0xMjUuMi0xMDEuNC0xLjgtOC42LTIuOC0xNy41LTIuOC0yNi42IDAtMTEgMS40LTIxLjggNC0zMiAuMi0uNyAuMy0xLjMgLjUtMS45IDExLjktNDMuNCA0Ni4xLTc3LjYgODkuNS04OS41eiJdCiAgICB9OwogICAgZmFGYWNlU2FkVGVhciA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLXNhZC10ZWFyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTQ2LCAic2FkLXRlYXIiXSwgImY1YjQiLCAiTTQ2NCAyNTZjMC0xMTQuOS05My4xLTIwOC0yMDgtMjA4UzQ4IDE0MS4xIDQ4IDI1NmMwIDQxLjggMTIuMyA4MC43IDMzLjYgMTEzLjMgOC4yIDQ0LjcgNDcuMyA3OC42IDk0LjMgNzguNyAyNC43IDEwLjMgNTEuNyAxNiA4MC4xIDE2IDExNC45IDAgMjA4LTkzLjEgMjA4LTIwOHpNMjg4IDM1MmMtNS41IDAtMTAuOSAuNi0xNiAxLjggMC0uNiAwLTEuMiAwLTEuOCAwLTE2LjItNC0zMS41LTExLjEtNDQuOSA4LjctMiAxNy44LTMuMSAyNy4xLTMuMSA0MC4yIDAgNzUuNyAxOS44IDk3LjUgNTAgNy43IDEwLjggNS4zIDI1LjgtNS41IDMzLjVzLTI1LjggNS4zLTMzLjUtNS41Yy0xMy4xLTE4LjItMzQuNC0zMC01OC41LTMwek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0xNzYtODBhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em0xMjggMzJhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHpNMTg1LjQgMjc2LjhjNi41IDcuOCAxMi42IDE2LjEgMTguMyAyNC42IDkgMTMuNCAyMC4zIDMwLjIgMjAuMyA0Ny40IDAgMjguMy0yMS41IDUxLjItNDggNTEuMnMtNDgtMjIuOS00OC01MS4yYzAtMTcuMiAxMS4yLTM0IDIwLjMtNDcuNCA1LjctOC41IDExLjktMTYuNyAxOC4zLTI0LjYgMi40LTIuOSA1LjctNC44IDkuNC00LjhzNyAxLjkgOS40IDQuOHoiXQogICAgfTsKICAgIGZhU2FkVGVhciA9IGZhRmFjZVNhZFRlYXI7CiAgICBmYVNoYXJlRnJvbVNxdWFyZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJzaGFyZS1mcm9tLXNxdWFyZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzYxNTA5LCAic2hhcmUtc3F1YXJlIl0sICJmMTRkIiwgIk00MjUuNSA3Yy02LjktNi45LTE3LjItOC45LTI2LjItNS4yUzM4NC41IDE0LjMgMzg0LjUgMjRsMCA1Ni00OCAwYy04OC40IDAtMTYwIDcxLjYtMTYwIDE2MCAwIDQ2LjcgMjAuNyA4MC40IDQzLjYgMTAzLjQgOC4xIDguMiAxNi41IDE0LjkgMjQuMyAyMC40IDkuMiA2LjUgMjEuNyA1LjcgMzAuMS0xLjlzMTAuMi0yMCA0LjUtMjkuOGMtMy42LTYuMy02LjUtMTQuOS02LjUtMjYuNyAwLTM2LjIgMjkuMy02NS41IDY1LjUtNjUuNWw0Ni41IDAgMCA1NmMwIDkuNyA1LjggMTguNSAxNC44IDIyLjJzMTkuMyAxLjcgMjYuMi01LjJsMTM2LTEzNmM5LjQtOS40IDkuNC0yNC42IDAtMzMuOUw0MjUuNSA3em03IDk3bDAtMjIuMSA3OC4xIDc4LjEtNzguMSA3OC4xIDAtMjIuMWMwLTEzLjMtMTAuNy0yNC0yNC0yNEwzMzggMTkyYy01MC45IDAtOTMuOSAzMy41LTEwOC4zIDc5LjYtMy4zLTkuNC01LjItMTkuOC01LjItMzEuNiAwLTYxLjkgNTAuMS0xMTIgMTEyLTExMmw3MiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0em0tMzIwLThjLTQ0LjIgMC04MCAzNS44LTgwIDgwbDAgMjU2YzAgNDQuMiAzNS44IDgwIDgwIDgwbDI1NiAwYzQ0LjIgMCA4MC0zNS44IDgwLTgwbDAtMjRjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAyNGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMjU2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMjU2YzAtMTcuNyAxNC4zLTMyIDMyLTMybDI0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTI0IDB6Il0KICAgIH07CiAgICBmYVNoYXJlU3F1YXJlID0gZmFTaGFyZUZyb21TcXVhcmU7CiAgICBmYU5vdGVTdGlja3kgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAibm90ZS1zdGlja3kiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs2MjAyNiwgInN0aWNreS1ub3RlIl0sICJmMjQ5IiwgIk0yNDAgNDMyTDY0IDQzMmMtOC44IDAtMTYtNy4yLTE2LTE2TDQ4IDk2YzAtOC44IDcuMi0xNiAxNi0xNmwzMjAgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAxNzYtODggMGMtMzkuOCAwLTcyIDMyLjItNzIgNzJsMCA4OHpNMzgwLjEgMzIwTDI4OCA0MTIuMSAyODggMzQ0YzAtMTMuMyAxMC43LTI0IDI0LTI0bDY4LjEgMHpNMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTk3LjUgMGMxNyAwIDMzLjMtNi43IDQ1LjMtMTguN0w0MjkuMyAzMzguN2MxMi0xMiAxOC43LTI4LjMgMTguNy00NS4zTDQ0OCA5NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2eiJdCiAgICB9OwogICAgZmFTdGlja3lOb3RlID0gZmFOb3RlU3RpY2t5OwogICAgZmFIYW5kQmFja0Zpc3QgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1iYWNrLWZpc3QiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsiaGFuZC1yb2NrIl0sICJmMjU1IiwgIk05NiA0MDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgNDhjMCAxNy43IDE0LjMgMzIgMzIgMzJsMjI0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC00OGMwLTE3LjctMTQuMy0zMi0zMi0zMkw5NiA0MDB6TTczLjIgMzUybDY0LjYgMC03OS41LTg4LjNDNTEuNyAyNTYuMyA0OCAyNDYuOCA0OCAyMzYuOUw0OCAyMDRjMC0xNi4xIDExLjktMjkuNSAyNy40LTMxLjcgMTEuOC0xLjcgMjAuNi0xMS44IDIwLjYtMjMuOEw5NiA3MmMwLTEzLjMgMTAuNy0yNCAyNC0yNCA3LjIgMCAxMy42IDMuMSAxOCA4LjEgNC42IDUuMiAxMS4xIDguMSAxOCA4LjFzMTMuNC0zIDE4LTguMWM0LjQtNSAxMC44LTguMSAxOC04LjEgOC41IDAgMTUuOSA0LjQgMjAuMiAxMS4xIDYuOSAxMC43IDIwLjkgMTQuMiAzMiA4IDMuNS0xLjkgNy40LTMuMSAxMS44LTMuMSAxMC42IDAgMTkuNyA2LjkgMjIuOCAxNi42IDMuOCAxMS43IDE1LjkgMTguNyAyOCAxNiAxLjctLjQgMy40LS42IDUuMi0uNiAxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDkyLjJjMCAxNC40LTMuNSAyOC41LTEwLjIgNDEuMmwtNTIuMiA5OC42IDU0LjMgMCA0MC4zLTc2LjJjMTAuNC0xOS42IDE1LjgtNDEuNSAxNS44LTYzLjZsMC05Mi4yYzAtMzguNC0zMC4xLTY5LjgtNjguMS03MS45LTEyLjktMTkuMy0zNC45LTMyLjEtNTkuOS0zMi4xLTUuNyAwLTExLjIgLjctMTYuNSAxLjktMTIuNy0xMS4xLTI5LjMtMTcuOS00Ny41LTE3LjktMTMuMSAwLTI1LjQgMy41LTM2IDkuNi0xMC42LTYuMS0yMi45LTkuNi0zNi05LjYtMzkuOCAwLTcyIDMyLjItNzIgNzJsMCA1OC43QzE5LjcgMTQzIDAgMTcxLjIgMCAyMDRsMCAzMi45YzAgMjEuNyA4IDQyLjcgMjIuNiA1OC45TDczLjIgMzUyeiJdCiAgICB9OwogICAgZmFIYW5kUm9jayA9IGZhSGFuZEJhY2tGaXN0OwogICAgZmFDaGVzc1F1ZWVuID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNoZXNzLXF1ZWVuIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTgxOV0sICJmNDQ1IiwgIk0zMjUuMyA5MC44YzkuMS00LjggMjAuNi0zLjMgMjguMiA0LjNsMzkuOCAzOS44IDMuNyAzLjNjOS4xIDcuMSAyMC45IDEwIDMyLjQgNy43bDQ2LjQtOS4zIDMuNS0uNGM4LS40IDE1LjggMy4yIDIwLjYgOS44IDUuNSA3LjYgNi4xIDE3LjYgMS42IDI1LjhsLTExMi42IDIwMi42IDUxLjUgNzAuOSAxLjggMi43YzQgNi42IDYuMiAxNC4yIDYuMiAyMiAwIDIzLjMtMTguOSA0Mi4xLTQyLjEgNDIuMWwtMjk5LjggMGMtMjEuOCAwLTM5LjgtMTYuNi00MS45LTM3LjhsLS4yLTQuMyAuMS0zLjNjLjYtNy43IDMuNC0xNS4xIDcuOS0yMS40bDUxLjUtNzAuOS0xMTIuNS0yMDIuNmMtNC41LTguMi0zLjktMTguMyAxLjYtMjUuOHMxNC45LTExLjIgMjQuMS05LjRsNDYuNCA5LjNjMTMuMSAyLjYgMjYuNy0xLjUgMzYuMS0xMC45TDE1OS41IDk1IDE2MyA5Mi4yYzguNi01LjggMjAuMS01LjYgMjguNSAxLjFsNDAgMzIgMi44IDIuMWMxNC40IDkuNiAzMy41IDguOSA0Ny4yLTIuMWw0MC0zMiAzLjgtMi41ek0xNjQuNyA0MDBsLTQ2LjYgNjQgMjc2LjcgMC00Ni42LTY0LTE4My42IDB6TTMxMS41IDE2Mi44Yy0zMC4xIDI0LjEtNzIuMSAyNS42LTEwMy44IDQuNWwtNi4yLTQuNS0yMy4zLTE4LjYtMjQuNiAyNC42Yy0xOS44IDE5LjgtNDcuNyAyOC45LTc1LjEgMjQuOGw4OC4xIDE1OC41IDE3OS44IDAgODgtMTU4LjVjLTI1LjcgMy44LTUxLjctMy45LTcxLjEtMjFsLTQtMy43LTI0LjYtMjQuNi0yMy4yIDE4LjZ6TTI1Ni41IDcyYTQwIDQwIDAgMSAxIDAtODAgNDAgNDAgMCAxIDEgMCA4MHoiXQogICAgfTsKICAgIGZhRmFjZUdyaW5UZWFycyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWdyaW4tdGVhcnMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjg1MTQsICJncmluLXRlYXJzIl0sICJmNTg4IiwgIk01MDQuMSAzNTNDNTEyLjkgMzY3LjIgNTI1LjMgMzc5IDUzOS44IDM4Ny4yIDQ5NS4xIDQ2MiA0MTMuNCA1MTIgMzIwIDUxMlMxNDQuOSA0NjIgMTAwLjIgMzg3LjJjMTQuNi04LjIgMjYuOS0yMCAzNS44LTM0LjMgMzQuOSA2NiAxMDQuMiAxMTEgMTg0LjEgMTExczE0OS4yLTQ1IDE4NC4xLTExMXptMTYuNC0xNTIuNUM0OTYuMiAxMTIuNiA0MTUuNyA0OCAzMjAgNDhTMTQzLjggMTEyLjYgMTE5LjUgMjAwLjVjLTEwLjYtNC44LTIyLjctNi44LTM1LjQtNWwtMTMuNCAxLjlDOTcuMiA4NC4zIDE5OC44IDAgMzIwIDBTNTQyLjggODQuMyA1NjkuMyAxOTcuNGwtMTMuNC0xLjljLTEyLjctMS44LTI0LjggLjItMzUuNCA1ek00NTUuOCAzMjBjLTE5LjggNTUuOS03My4xIDk2LTEzNS44IDk2LTYyLjcgMC0xMTYtNDAtMTM1LjgtOTUuOS00LjEtMTEuNiA3LjgtMjEuNCAxOS42LTE3LjggMzQuNyAxMC42IDc0LjIgMTYuNSAxMTYuMSAxNi41IDQyIDAgODEuNS02IDExNi4zLTE2LjYgMTEuOC0zLjYgMjMuNyA2LjEgMTkuNiAxNy44ek0yMTIgMjA4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMzcuNiAzMC40LTY4IDY4LTY4czY4IDMwLjQgNjggNjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0xNS41LTEyLjUtMjgtMjgtMjhzLTI4IDEyLjUtMjggMjh6bTE4OC0yOGMtMTUuNSAwLTI4IDEyLjUtMjggMjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0zNy42IDMwLjQtNjggNjgtNjhzNjggMzAuNCA2OCA2OGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTE1LjUtMTIuNS0yOC0yOC0yOHpNNjQwIDMwMC42YzAgMjguNC0yMyA1MS40LTUxLjQgNTEuNC0yNS42IDAtNDcuMy0xOC44LTUwLjktNDQuMUw1MzEgMjYxLjFjLTEuNS0xMC42IDcuNS0xOS42IDE4LjEtMTguMWw0Ni43IDYuN2MyNS4zIDMuNiA0NC4xIDI1LjMgNDQuMSA1MC45em0tNjQwIDBjMC0yNS42IDE4LjgtNDcuMyA0NC4xLTUwLjlMOTAuOSAyNDNjMTAuNi0xLjUgMTkuNiA3LjUgMTguMSAxOC4xbC02LjcgNDYuN0M5OC43IDMzMy4yIDc3IDM1MiA1MS40IDM1MiAyMyAzNTIgMCAzMjkgMCAzMDAuNnoiXQogICAgfTsKICAgIGZhR3JpblRlYXJzID0gZmFGYWNlR3JpblRlYXJzOwogICAgZmFQZW5Ub1NxdWFyZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJwZW4tdG8tc3F1YXJlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImVkaXQiXSwgImYwNDQiLCAiTTQ0MSA1OC45TDQ1My4xIDcxYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45TDQyNCAxMzQuMSAzNzcuOSA4OCA0MDcgNTguOWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHpNMjA5LjggMjU2LjJMMzQ0IDEyMS45IDM5MC4xIDE2OCAyNTUuOCAzMDIuMmMtMi45IDIuOS02LjUgNS0xMC40IDYuMWwtNTguNSAxNi43IDE2LjctNTguNWMxLjEtMy45IDMuMi03LjUgNi4xLTEwLjR6TTM3My4xIDI1TDE3NS44IDIyMi4yYy04LjcgOC43LTE1IDE5LjQtMTguMyAzMS4xbC0yOC42IDEwMGMtMi40IDguNC0uMSAxNy40IDYuMSAyMy42czE1LjIgOC41IDIzLjYgNi4xbDEwMC0yOC42YzExLjgtMy40IDIyLjUtOS43IDMxLjEtMTguM0w0ODcgMTM4LjljMjguMS0yOC4xIDI4LjEtNzMuNyAwLTEwMS44TDQ3NC45IDI1QzQ0Ni44LTMuMSA0MDEuMi0zLjEgMzczLjEgMjV6TTg4IDY0QzM5LjQgNjQgMCAxMDMuNCAwIDE1MkwwIDQyNGMwIDQ4LjYgMzkuNCA4OCA4OCA4OGwyNzIgMGM0OC42IDAgODgtMzkuNCA4OC04OGwwLTExMmMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDExMmMwIDIyLjEtMTcuOSA0MC00MCA0MEw4OCA0NjRjLTIyLjEgMC00MC0xNy45LTQwLTQwbDAtMjcyYzAtMjIuMSAxNy45LTQwIDQwLTQwbDExMiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0TDg4IDY0eiJdCiAgICB9OwogICAgZmFFZGl0ID0gZmFQZW5Ub1NxdWFyZTsKICAgIGZhRmFjZUdyaW5CZWFtU3dlYXQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1ncmluLWJlYW0tc3dlYXQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjg1MTcsICJncmluLWJlYW0tc3dlYXQiXSwgImY1ODMiLCAiTTUzMC4yIDE1LjljLTguOC0xMC43LTE4LjUtMjAuOS0yOS0zMC0zLTIuNi03LjQtMi42LTEwLjQgMC0xMC41IDkuMS0yMC4xIDE5LjMtMjkgMzAtMTQuNyAxNy44LTI5LjggNDAuMS0yOS44IDY0LjEgMCAzNi40IDI3LjYgNjQgNjQgNjRzNjQtMjcuNiA2NC02NGMwLTI0LTE1LjItNDYuMy0yOS44LTY0LjF6bS0xMzIgOC45QzM2NC44IDguOSAzMjcuNCAwIDI4OCAwIDE0Ni42IDAgMzIgMTE0LjYgMzIgMjU2UzE0Ni42IDUxMiAyODggNTEyIDU0NCAzOTcuNCA1NDQgMjU2YzAtMjQuNC0zLjQtNDgtOS44LTcwLjQtMTEuOSA0LjItMjQuNyA2LjQtMzguMiA2LjQtMy40IDAtNi44LS4xLTEwLjItLjQgNi42IDIwLjMgMTAuMiA0MS45IDEwLjIgNjQuNCAwIDExNC45LTkzLjEgMjA4LTIwOCAyMDhTODAgMzcwLjkgODAgMjU2IDE3My4xIDQ4IDI4OCA0OGMzNC44IDAgNjcuNSA4LjUgOTYuMyAyMy42IDEuNC0xNy40IDYuOS0zMy4xIDEzLjgtNDYuOHpNNDIzLjggMzIwYzQuMS0xMS42LTcuOC0yMS40LTE5LjYtMTcuOC0zNC44IDEwLjYtNzQuMyAxNi42LTExNi4zIDE2LjYtNDEuOSAwLTgxLjQtNi0xMTYuMS0xNi41LTExLjgtMy42LTIzLjcgNi4xLTE5LjYgMTcuOCAxOS44IDU1LjkgNzMuMSA5NS45IDEzNS44IDk1LjkgNjIuNyAwIDExNi00MC4xIDEzNS44LTk2ek0xODAgMjA4YzAtMTUuNSAxMi41LTI4IDI4LTI4czI4IDEyLjUgMjggMjhsMCA4YzAgMTEgOSAyMCAyMCAyMHMyMC05IDIwLTIwbDAtOGMwLTM3LjYtMzAuNC02OC02OC02OHMtNjggMzAuNC02OCA2OGwwIDhjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC04em0xODgtMjhjMTUuNSAwIDI4IDEyLjUgMjggMjhsMCA4YzAgMTEgOSAyMCAyMCAyMHMyMC05IDIwLTIwbDAtOGMwLTM3LjYtMzAuNC02OC02OC02OHMtNjggMzAuNC02OCA2OGwwIDhjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC04YzAtMTUuNSAxMi41LTI4IDI4LTI4eiJdCiAgICB9OwogICAgZmFHcmluQmVhbVN3ZWF0ID0gZmFGYWNlR3JpbkJlYW1Td2VhdDsKICAgIGZhQ2xvY2sgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY2xvY2siLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgzMzksICJjbG9jay1mb3VyIl0sICJmMDE3IiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDEgLTQxNiAwIDIwOCAyMDggMCAxIDEgNDE2IDB6TTAgMjU2YTI1NiAyNTYgMCAxIDAgNTEyIDAgMjU2IDI1NiAwIDEgMCAtNTEyIDB6TTIzMiAxMjBsMCAxMzZjMCA4IDQgMTUuNSAxMC43IDIwbDk2IDY0YzExIDcuNCAyNS45IDQuNCAzMy4zLTYuN3M0LjQtMjUuOS02LjctMzMuM0wyODAgMjQzLjIgMjgwIDEyMGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNHoiXQogICAgfTsKICAgIGZhQ2xvY2tGb3VyID0gZmFDbG9jazsKICAgIGZhRmFjZUxhdWdoV2luayA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWxhdWdoLXdpbmsiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsibGF1Z2gtd2luayJdLCAiZjU5YyIsICJNNDY0IDI1NmEyMDggMjA4IDAgMSAwIC00MTYgMCAyMDggMjA4IDAgMSAwIDQxNiAwek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0xMTguMyA1OC4yYy00LjItMTMuNyA3LjEtMjYuMiAyMS40LTI2LjJsMjMyLjYgMGMxNC4zIDAgMjUuNiAxMi41IDIxLjQgMjYuMi0xOCA1OC45LTcyLjkgMTAxLjgtMTM3LjcgMTAxLjhTMTM2LjMgMzczLjEgMTE4LjMgMzE0LjJ6TTE0NCAxOTJhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptMTY0IDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwYzAtMzMuMSAyNi45LTYwIDYwLTYwbDE2IDBjMzMuMSAwIDYwIDI2LjkgNjAgNjAgMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwLTktMjAtMjAtMjBsLTE2IDBjLTExIDAtMjAgOS0yMCAyMHoiXQogICAgfTsKICAgIGZhTGF1Z2hXaW5rID0gZmFGYWNlTGF1Z2hXaW5rOwogICAgZmFQYXBlclBsYW5lID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInBhcGVyLXBsYW5lIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbNjE5MTNdLCAiZjFkOCIsICJNMjkwLjUgMjg3LjdMNDkxLjQgODYuOSAzNTkgNDU2LjMgMjkwLjUgMjg3Ljd6TTQ1Ny40IDUzTDI1Ni42IDI1My44IDg4IDE4NS4zIDQ1Ny40IDUzek0zOC4xIDIxNi44bDIwNS44IDgzLjYgODMuNiAyMDUuOGM1LjMgMTMuMSAxOC4xIDIxLjcgMzIuMyAyMS43IDE0LjcgMCAyNy44LTkuMiAzMi44LTIzLjFMNTcwLjYgOGMzLjUtOS44IDEtMjAuNi02LjMtMjhzLTE4LjItOS44LTI4LTYuM0wzOS40IDE1MS43Yy0xMy45IDUtMjMuMSAxOC4xLTIzLjEgMzIuOCAwIDE0LjIgOC42IDI3IDIxLjcgMzIuM3oiXQogICAgfTsKICAgIGZhSGVhcnQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiaGVhcnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgxNTMsIDEyODE1NCwgMTI4MTU1LCAxMjgxNTYsIDEyODQyMCwgMTI5MjkzLCAxMjkyOTQsIDEyOTUwNSwgOTgyOSwgMTAwODQsIDYxNTc4XSwgImYwMDQiLCAiTTM3OC45IDgwYy0yNy4zIDAtNTMgMTMuMS02OSAzNS4ybC0zNC40IDQ3LjZjLTQuNSA2LjItMTEuNyA5LjktMTkuNCA5LjlzLTE0LjktMy43LTE5LjQtOS45bC0zNC40LTQ3LjZjLTE2LTIyLjEtNDEuNy0zNS4yLTY5LTM1LjItNDcgMC04NS4xIDM4LjEtODUuMSA4NS4xIDAgNDkuOSAzMiA5OC40IDY4LjEgMTQyLjMgNDEuMSA1MCA5MS40IDk0IDEyNS45IDEyMC4zIDMuMiAyLjQgNy45IDQuMiAxNCA0LjJzMTAuOC0xLjggMTQtNC4yYzM0LjUtMjYuMyA4NC44LTcwLjQgMTI1LjktMTIwLjMgMzYuMi00My45IDY4LjEtOTIuNCA2OC4xLTE0Mi4zIDAtNDctMzguMS04NS4xLTg1LjEtODUuMXpNMjcxIDg3LjFjMjUtMzQuNiA2NS4yLTU1LjEgMTA3LjktNTUuMSA3My41IDAgMTMzLjEgNTkuNiAxMzMuMSAxMzMuMSAwIDY4LjYtNDIuOSAxMjguOS03OS4xIDE3Mi44LTQ0LjEgNTMuNi05Ny4zIDEwMC4xLTEzMy44IDEyNy45LTEyLjMgOS40LTI3LjUgMTQuMS00My4xIDE0LjFzLTMwLjgtNC43LTQzLjEtMTQuMUMxNzYuNCA0MzggMTIzLjIgMzkxLjUgNzkuMSAzMzggNDIuOSAyOTQuMSAwIDIzMy43IDAgMTY1LjEgMCA5MS42IDU5LjYgMzIgMTMzLjEgMzIgMTc1LjggMzIgMjE2IDUyLjUgMjQxIDg3LjFsMTUgMjAuNyAxNS0yMC43eiJdCiAgICB9OwogICAgZmFGb250QXdlc29tZTIgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZm9udC1hd2Vzb21lIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjI1MDEsIDYyNjk0LCAiZm9udC1hd2Vzb21lLWZsYWciLCAiZm9udC1hd2Vzb21lLWxvZ28tZnVsbCJdLCAiZjJiNCIsICJNOTEuNyA5NkMxMDYuMyA4Ni44IDExNiA3MC41IDExNiA1MiAxMTYgMjMuMyA5Mi43IDAgNjQgMFMxMiAyMy4zIDEyIDUyYzAgMTYuNyA3LjggMzEuNSAyMCA0MWwwIDQxOSA0OCAwIDAtNjQgMzg5LjYgMGMxNC42IDAgMjYuNC0xMS44IDI2LjQtMjYuNCAwLTMuNy0uOC03LjMtMi4zLTEwLjdMNDMyIDI3MiA0OTMuNyAxMzMuMWMxLjUtMy40IDIuMy03IDIuMy0xMC43IDAtMTQuNi0xMS44LTI2LjQtMjYuNC0yNi40TDkxLjcgOTZ6TTgwIDQwMGwwLTI1NiAzNTYuNCAwLTQ4LjIgMTA4LjVjLTUuNSAxMi40LTUuNSAyNi42IDAgMzlMNDM2LjQgNDAwIDgwIDQwMHoiXQogICAgfTsKICAgIGZhRm9udEF3ZXNvbWVGbGFnMiA9IGZhRm9udEF3ZXNvbWUyOwogICAgZmFGb250QXdlc29tZUxvZ29GdWxsMiA9IGZhRm9udEF3ZXNvbWUyOwogICAgZmFDbG9uZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjbG9uZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjRkIiwgIk0yODggNDY0TDY0IDQ2NGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMjI0YzAtOC44IDcuMi0xNiAxNi0xNmw0OCAwIDAtNDgtNDggMGMtMzUuMyAwLTY0IDI4LjctNjQgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjI0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC00OC00OCAwIDAgNDhjMCA4LjgtNy4yIDE2LTE2IDE2ek0yMjQgMzA0Yy04LjggMC0xNi03LjItMTYtMTZsMC0yMjRjMC04LjggNy4yLTE2IDE2LTE2bDIyNCAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDIyNGMwIDguOC03LjIgMTYtMTYgMTZsLTIyNCAwem0tNjQtMTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjI0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yMjRjMC0zNS4zLTI4LjctNjQtNjQtNjRMMjI0IDBjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgMjI0eiJdCiAgICB9OwogICAgZmFGb2xkZXJPcGVuID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZvbGRlci1vcGVuIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4MTk0LCAxMjg0NDksIDYxNzE3XSwgImYwN2MiLCAiTTk3LjUgNDAwbDUwLTE2MCAzNzkuNCAwLTUwIDE2MC0zNzkuNCAwem0xOTAuNyA0OEw0NzcgNDQ4YzIxIDAgMzkuNi0xMy42IDQ1LjgtMzMuN2w1MC0xNjBjOS43LTMwLjktMTMuNC02Mi4zLTQ1LjgtNjIuM2wtMzc5LjQgMGMtMjEgMC0zOS42IDEzLjYtNDUuOCAzMy43TDgwLjIgMjk0LjQgODAuMiA5NmMwLTguOCA3LjItMTYgMTYtMTZsMTM4LjcgMGMzLjUgMCA2LjggMS4xIDkuNiAzLjJMMjgyLjkgMTEyYzEzLjggMTAuNCAzMC43IDE2IDQ4IDE2bDExNy4zIDBjOC44IDAgMTYgNy4yIDE2IDE2bDQ4IDBjMC0zNS4zLTI4LjctNjQtNjQtNjRMMzMwLjkgODBjLTYuOSAwLTEzLjctMi4yLTE5LjItNi40TDI3My4zIDQ0LjhDMjYyLjIgMzYuNSAyNDguOCAzMiAyMzQuOSAzMkw5Ni4yIDMyYy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDI4OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxOTIgMHoiXQogICAgfTsKICAgIGZhV2luZG93TWluaW1pemUgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAid2luZG93LW1pbmltaXplIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NDY5XSwgImYyZDEiLCAiTTAgNDI0YzAtMTMuMyAxMC43LTI0IDI0LTI0bDQ2NCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0TDI0IDQ0OGMtMTMuMyAwLTI0LTEwLjctMjQtMjR6Il0KICAgIH07CiAgICBmYVN0YXJIYWxmID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInN0YXItaGFsZiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzYxNzMxXSwgImYwODkiLCAiTTI4NS43LTE1LjhjMTAuOCAyLjYgMTguNCAxMi4yIDE4LjQgMjMuM2wwIDM4Ny4xYzAgOS01LjEgMTcuMy0xMy4xIDIxLjRMMTQzLjggNDkxYy04IDQuMS0xNy43IDMuMy0yNS0ycy0xMS0xNC4yLTkuNi0yMy4yTDEzNC40IDMwNS45IDIwIDE5MS40Yy02LjQtNi40LTguNi0xNS44LTUuOC0yNC40czEwLjEtMTQuOSAxOS4xLTE2LjNMMTkzLjEgMTI1LjMgMjU4LjgtMy4zYzUtOS45IDE2LjItMTUgMjctMTIuNHpNMjU2LjEgMTA3LjRMMjMwLjMgMTU4Yy0zLjUgNi44LTEwIDExLjYtMTcuNiAxMi44bC0xMjUuNSAyMCA4OS44IDg5LjljNS40IDUuNCA3LjkgMTMuMSA2LjcgMjAuN2wtMTkuOCAxMjUuNSA5Mi4yLTQ2LjkgMC0yNzIuNnoiXQogICAgfTsKICAgIGZhQWxhcm1DbG9jayA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJhbGFybS1jbG9jayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzkyMDBdLCAiZjM0ZSIsICJNNDAyLjYgNTAuMmMtNS40IDEuNy0xMS4zIDEuOC0xNi4yLS45LTUuOC0zLjItMTEuOC02LjItMTcuOC04LjktMTAuNC00LjctMTMuNy0xOC4zLTQuMS0yNC42IDE1LTkuOSAzMy0xNS43IDUyLjMtMTUuNyA1Mi42IDAgOTUuMiA0Mi42IDk1LjIgOTUuMiAwIDEzLjItMi43IDI1LjgtNy42IDM3LjMtNC41IDEwLjUtMTguNCA5LjgtMjQuOSAuNC0zLjgtNS41LTcuOC0xMC44LTEyLTE2LTMuNS00LjQtNC41LTEwLjItMy44LTE1LjggLjItMS45IC40LTMuOSAuNC01LjkgMC0yNi4xLTIxLjItNDcuMi00Ny4yLTQ3LjItNC45IDAtOS43IC44LTE0LjIgMi4yek0zMi41IDEzMi45Yy02LjUgOS40LTIwLjUgMTAuMS0yNC45LS40LTQuOS0xMS41LTcuNi0yNC4xLTcuNi0zNy4zIDAtNTIuNiA0Mi42LTk1LjIgOTUuMi05NS4yIDE5LjMgMCAzNy4zIDUuOCA1Mi4zIDE1LjcgOS42IDYuMyA2LjMgMTkuOS00LjEgMjQuNi02LjEgMi44LTEyIDUuNy0xNy44IDguOS00LjkgMi43LTEwLjkgMi42LTE2LjIgLjktNC41LTEuNC05LjItMi4yLTE0LjItMi4yLTI2LjEgMC00Ny4yIDIxLjItNDcuMiA0Ny4yIDAgMiAuMSA0IC40IDUuOSAuNyA1LjYtLjMgMTEuNC0zLjggMTUuOC00LjIgNS4yLTguMiAxMC41LTEyIDE2ek00MzIgMjg4YTE3NiAxNzYgMCAxIDAgLTM1MiAwIDE3NiAxNzYgMCAxIDAgMzUyIDB6TTM5Ni41IDQ2Mi41QzM1OC4xIDQ5My40IDMwOS4yIDUxMiAyNTYgNTEycy0xMDIuMS0xOC42LTE0MC41LTQ5LjVMNzMgNTA1Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45bDQyLjUtNDIuNUM1MC42IDM5MC4xIDMyIDM0MS4yIDMyIDI4OCAzMiAxNjQuMyAxMzIuMyA2NCAyNTYgNjRTNDgwIDE2NC4zIDQ4MCAyODhjMCA1My4yLTE4LjYgMTAyLjEtNDkuNSAxNDAuNUw0NzMgNDcxYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTQyLjUtNDIuNXpNMjgwIDE4NGwwIDk0LjEgNDEgNDFjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtNDgtNDhjLTQuNS00LjUtNy0xMC42LTctMTdsMC0xMDRjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNHoiXQogICAgfTsKICAgIGZhTmV3c3BhcGVyID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogIm5ld3NwYXBlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODI0MF0sICJmMWVhIiwgIk0xNjggODBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMzA0YzAgOC40LTEuNCAxNi41LTQuMSAyNEw0NDAgNDMyYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtMzA0YzAtMTMuMy0xMC43LTI0LTI0LTI0TDE2OCA4MHpNNzIgNDgwYy0zOS44IDAtNzItMzIuMi03Mi03MkwwIDExMkMwIDk4LjcgMTAuNyA4OCAyNCA4OHMyNCAxMC43IDI0IDI0bDAgMjk2YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0zMDRjMC0zOS44IDMyLjItNzIgNzItNzJsMjcyIDBjMzkuOCAwIDcyIDMyLjIgNzIgNzJsMCAzMDRjMCAzOS44LTMyLjIgNzItNzIgNzJMNzIgNDgwek0xOTIgMTUyYzAtMTMuMyAxMC43LTI0IDI0LTI0bDQ4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA0OGMwIDEzLjMtMTAuNyAyNC0yNCAyNGwtNDggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC00OHptMTUyIDI0bDQ4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTQ4IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6TTIxNiAyNTZsMTc2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE3NiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0em0wIDgwbDE3NiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNzYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhSG9zcGl0YWwgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiaG9zcGl0YWwiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjc5NzMsIDYyNTg5LCAiaG9zcGl0YWwtYWx0IiwgImhvc3BpdGFsLXdpZGUiXSwgImYwZjgiLCAiTTE3NiAwYy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDQ4LTQ4IDBjLTM1LjMgMC02NCAyOC43LTY0IDY0TDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDQ0OCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjcyYzAtMzUuMy0yOC43LTY0LTY0LTY0bC00OCAwIDAtNDhjMC0zNS4zLTI4LjctNjQtNjQtNjRMMTc2IDB6TTE2MCA2NGMwLTguOCA3LjItMTYgMTYtMTZsMjI0IDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgNzJjMCAxMy4zIDEwLjcgMjQgMjQgMjRsNzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAyNzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0xNzYgMCAwLTgwYzAtMTcuNy0xNC4zLTMyLTMyLTMybC0zMiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDgwLTE3NiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0yNzJjMC04LjggNy4yLTE2IDE2LTE2bDcyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC03MnpNMTEyIDIyNGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwek05NiAzMzZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnptMzIwIDBsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnptMTYtMTEyYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDB6TTI2NCAxMDRsMCAzMi0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAxNmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMCAwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwxNiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyIDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMTZjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwIDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0xNiAwYy04LjggMC0xNiA3LjItMTYgMTZ6Il0KICAgIH07CiAgICBmYUhvc3BpdGFsQWx0ID0gZmFIb3NwaXRhbDsKICAgIGZhSG9zcGl0YWxXaWRlID0gZmFIb3NwaXRhbDsKICAgIGZhQ2lyY2xlU3RvcCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtc3RvcCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYyMDk0LCAic3RvcC1jaXJjbGUiXSwgImYyOGQiLCAiTTI1NiA0OGEyMDggMjA4IDAgMSAxIDAgNDE2IDIwOCAyMDggMCAxIDEgMC00MTZ6bTAgNDY0YTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMTYwIDE5MmwwIDEyOGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxMjggMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTEyOGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtMTI4IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyem00OCAxMTJsMC05NiA5NiAwIDAgOTYtOTYgMHoiXQogICAgfTsKICAgIGZhU3RvcENpcmNsZSA9IGZhQ2lyY2xlU3RvcDsKICAgIGZhT2JqZWN0VW5ncm91cCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJvYmplY3QtdW5ncm91cCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmMjQ4IiwgIk00OC4yIDY2LjhjLS4xLS44LS4yLTEuNy0uMi0yLjVsMC0uMmMwLTguOCA3LjItMTYgMTYtMTYgLjkgMCAxLjkgLjEgMi44IC4yIDcuNSAxLjMgMTMuMiA3LjkgMTMuMiAxNS44IDAgOC44LTcuMiAxNi0xNiAxNi03LjkgMC0xNC41LTUuNy0xNS44LTEzLjJ6TTAgNjRjMCAyNi45IDE2LjUgNDkuOSA0MCA1OS4zbDAgMTA1LjNjLTIzLjUgOS41LTQwIDMyLjUtNDAgNTkuMyAwIDM1LjMgMjguNyA2NCA2NCA2NCAyNi45IDAgNDkuOS0xNi41IDU5LjMtNDBsMjAxLjMgMGM5LjUgMjMuNSAzMi41IDQwIDU5LjMgNDAgMzUuMyAwIDY0LTI4LjcgNjQtNjQgMC0yNi45LTE2LjUtNDkuOS00MC01OS4zbDAtMTA1LjNjMjMuNS05LjUgNDAtMzIuNSA0MC01OS4zIDAtMzUuMy0yOC43LTY0LTY0LTY0LTI2LjkgMC00OS45IDE2LjUtNTkuMyA0MEwxMjMuMyA0MEMxMTMuOSAxNi41IDkwLjkgMCA2NCAwIDI4LjcgMCAwIDI4LjcgMCA2NHptMzY4IDBhMTYgMTYgMCAxIDEgMzIgMCAxNiAxNiAwIDEgMSAtMzIgMHpNMzI0LjcgODhjNi41IDE2IDE5LjMgMjguOSAzNS4zIDM1LjNsMCAxMDUuM2MtMTYgNi41LTI4LjkgMTkuMy0zNS4zIDM1LjNsLTIwMS4zIDBjLTYuNS0xNi0xOS4zLTI4LjktMzUuMy0zNS4zbDAtMTA1LjNjMTYtNi41IDI4LjktMTkuMyAzNS4zLTM1LjNsMjAxLjMgMHpNMzg0IDI3MmExNiAxNiAwIDEgMSAwIDMyIDE2IDE2IDAgMSAxIDAtMzJ6TTgwIDI4OGMwIDcuOS01LjcgMTQuNS0xMy4yIDE1LjgtLjggLjEtMS43IC4yLTIuNSAuMmwtLjIgMGMtOC44IDAtMTYtNy4yLTE2LTE2IDAtLjkgLjEtMS45IC4yLTIuOCAxLjMtNy41IDcuOS0xMy4yIDE1LjgtMTMuMiA4LjggMCAxNiA3LjIgMTYgMTZ6bTQzNi43LTQwYzYuNSAxNiAxOS4zIDI4LjkgMzUuMyAzNS4zbDAgMTA1LjNjLTE2IDYuNS0yOC45IDE5LjMtMzUuMyAzNS4zbC0yMDEuMyAwYy02LjUtMTYtMTkuMy0yOC45LTM1LjMtMzUuM2wwLTIwLjctNDggMCAwIDIwLjdjLTIzLjUgOS41LTQwIDMyLjUtNDAgNTkuMyAwIDM1LjMgMjguNyA2NCA2NCA2NCAyNi45IDAgNDkuOS0xNi41IDU5LjMtNDBsMjAxLjMgMGM5LjUgMjMuNSAzMi41IDQwIDU5LjMgNDAgMzUuMyAwIDY0LTI4LjcgNjQtNjQgMC0yNi45LTE2LjUtNDkuOS00MC01OS4zbDAtMTA1LjNjMjMuNS05LjUgNDAtMzIuNSA0MC01OS4zIDAtMzUuMy0yOC43LTY0LTY0LTY0LTI2LjkgMC00OS45IDE2LjUtNTkuMyA0MGwtNTIuNyAwIDAgOS42YzEwLjcgMTAuOSAxOS4xIDIzLjkgMjQuNiAzOC40bDI4IDB6bTU5LjMtOGExNiAxNiAwIDEgMSAwLTMyIDE2IDE2IDAgMSAxIDAgMzJ6TTI3MS44IDQ1MC43YTE2IDE2IDAgMSAxIC0zMS41LTUuNSAxNiAxNiAwIDEgMSAzMS41IDUuNXptMzAxLjUgMTNjLTcuNS0xLjMtMTMuMi03LjktMTMuMi0xNS44IDAtOC44IDcuMi0xNiAxNi0xNiA3LjkgMCAxNC41IDUuNyAxNS44IDEzLjJsMCAuMWMuMSAuOSAuMiAxLjggLjIgMi43IDAgOC44LTcuMiAxNi0xNiAxNi0uOSAwLTEuOS0uMS0yLjgtLjJ6Il0KICAgIH07CiAgICBmYUNvbW1lbnQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY29tbWVudCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODQ4OSwgNjE2NjldLCAiZjA3NSIsICJNNTEuOSAzODQuOUMxOS4zIDM0NC42IDAgMjk0LjQgMCAyNDAgMCAxMDcuNSAxMTQuNiAwIDI1NiAwUzUxMiAxMDcuNSA1MTIgMjQwIDM5Ny40IDQ4MCAyNTYgNDgwYy0zNi41IDAtNzEuMi03LjItMTAyLjYtMjBMMzcgNTA5LjljLTMuNyAxLjYtNy41IDIuMS0xMS41IDIuMS0xNC4xIDAtMjUuNS0xMS40LTI1LjUtMjUuNSAwLTQuMyAxLjEtOC41IDMuMS0xMi4ybDQ4LjgtODkuNHptMzcuMy0zMC4yYzEyLjIgMTUuMSAxNC4xIDM2LjEgNC44IDUzLjJsLTE4IDMzLjEgNTguNS0yNS4xYzExLjgtNS4xIDI1LjItNS4yIDM3LjEtLjMgMjUuNyAxMC41IDU0LjIgMTYuNCA4NC4zIDE2LjQgMTE3LjggMCAyMDgtODguOCAyMDgtMTkyUzM3My44IDQ4IDI1NiA0OCA0OCAxMzYuOCA0OCAyNDBjMCA0Mi44IDE1LjEgODIuNCA0MS4yIDExNC43eiJdCiAgICB9OwogICAgZmFDaGVzc1Bhd24gPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY2hlc3MtcGF3biIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzk4MjNdLCAiZjQ0MyIsICJNMTkyLTMyYzY2LjMgMCAxMjAgNTMuNyAxMjAgMTIwIDAgMjcuNi05LjMgNTIuOS0yNC45IDczLjIgOS44IDMgMTYuOSAxMi4xIDE2LjkgMjIuOCAwIDEzLjMtMTAuNyAyNC0yNCAyNGwtLjYgMCAyNC42IDE2MCA1My42IDY3YzYuNyA4LjQgMTAuNCAxOC44IDEwLjQgMjkuNiAwIDI2LjItMjEuMiA0Ny40LTQ3LjQgNDcuNEw2My40IDUxMmMtMjYuMiAwLTQ3LjQtMjEuMi00Ny40LTQ3LjQgMC0xMC44IDMuNy0yMS4yIDEwLjQtMjkuNmw1My42LTY3IDI0LjYtMTYwLS42IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0IDAtMTAuOCA3LjEtMTkuOCAxNi45LTIyLjgtMTUuNi0yMC4zLTI0LjktNDUuNi0yNC45LTczLjIgMC02Ni4zIDUzLjctMTIwIDEyMC0xMjB6TTExNS45IDQwMGwtNTEuMiA2NCAyNTQuNyAwLTUxLjItNjQtMTUyLjIgMHptMzYuMi0xODQuN2wtMjEgMTM2LjcgMTIxLjkgMC0yMS0xMzYuNy0xLjEtNy4zLTc3LjYgMC0xLjEgNy4zek0xOTIgMTZhNzIgNzIgMCAxIDAgMCAxNDQgNzIgNzIgMCAxIDAgMC0xNDR6Il0KICAgIH07CiAgICBmYUNhbGVuZGFyUGx1cyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjYWxlbmRhci1wbHVzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyNzEiLCAiTTEyMCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgNDAgMTYwIDAgMC00MGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgNDAgMzIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI4OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDMyIDAgMC00MGMwLTEzLjMgMTAuNy0yNCAyNC0yNHptMCAxMTJsLTU2IDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDI4OGMwIDguOCA3LjIgMTYgMTYgMTZsMzIwIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMjg4YzAtOC44LTcuMi0xNi0xNi0xNmwtMjY0IDB6bTEwNCA2NGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDQ4IDQ4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTQ4IDAgMCA0OGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTQ4LTQ4IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsNDggMCAwLTQ4YzAtMTMuMyAxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFDbGlwYm9hcmQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY2xpcGJvYXJkIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4MjAzXSwgImYzMjgiLCAiTTIzMiA5NmwtODAgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGw4MCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0em0wIDQ4YzM3LjEgMCA2Ny42LTI4IDcxLjYtNjRMMzIwIDgwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDM1MmMwIDguOC03LjIgMTYtMTYgMTZMNjQgNDY0Yy04LjggMC0xNi03LjItMTYtMTZMNDggOTZjMC04LjggNy4yLTE2IDE2LTE2bDE2LjQgMGM0IDM2IDM0LjUgNjQgNzEuNiA2NGw4MCAwek0yOTEuOSAzMkMyNzkgMTIuNyAyNTcgMCAyMzIgMEwxNTIgMGMtMjUgMC00NyAxMi43LTU5LjkgMzJMNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTM1MmMwLTM1LjMtMjguNy02NC02NC02NGwtMjguMSAweiJdCiAgICB9OwogICAgZmFUaHVtYnNEb3duID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInRodW1icy1kb3duIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MDc4LCA2MTU3Nl0sICJmMTY1IiwgIk0zNjAgMzJsNy40IC40YzM1IDMuNiA2Mi41IDMyLjIgNjQuNCA2Ny43IDE3LjggMTEuOCAzMC4xIDMxLjQgMzIgNTMuOWwuMiA2YzAgNS43LS43IDExLjItMiAxNi41IDEwLjIgMTEuNSAxNi44IDI2LjMgMTcuOCA0Mi43bC4yIDQuOGMwIDEzLjItMy42IDI1LjQtOS44IDM2IDQuOSA4LjQgOC4yIDE3LjkgOS4zIDI4bC40IDhjMCAzNy4zLTI4LjMgNjcuOS02NC42IDcxLjZsLTcuNCAuNC0xMDkuNyAwIDE0LjEgMzAgMy4xIDcuNmMxMi41IDM1LjctMS44IDc1LjUtMzQuMiA5NWwtNy4yIDMuOWMtMzcuNSAxNy42LTgxLjcgMy42LTEwMi42LTMxLjJsLS42LS45LTIuNy01LS42LTEuMi0zMC4xLTY0Yy05LjQgMTcuOC0yOCAyOS45LTQ5LjUgMjkuOWwtMzIgMGMtMzAuOSAwLTU2LTI1LjEtNTYtNTZMMCAxNTJjMC0zMC45IDI1LjEtNTYgNTYtNTZsMzIgMGMxMi40IDAgMjMuOSA0LjEgMzMuMiAxMSAxMy4yLTIxLjQgMzItMzkuNCA1NS01MS42bDEyLjItNi41IC43LS4zIDYuNi0zLjIgLjctLjMgNy4xLTNjMTYuNy02LjYgMzQuNS05LjkgNTIuNi05LjlMMzYwIDMyek0yNTUuOSA4MGMtMTIgMC0yMy45IDIuMy0zNS4xIDYuNmwtNC43IDItNS4zIDIuNiAwIDAtMTIuMiA2LjVjLTI5LjIgMTUuNS00OC4zIDQ0LjktNTAuNyA3Ny42bC0uMiA4IDAgMTEyLjkgLjEgNC4xYy41IDguMiAyLjUgMTYuMiA2IDIzLjdsNTYuOCAxMjAuOSAyLjEgMy44YzguNCAxMy43IDI2IDE5LjEgNDAuOCAxMi4ybDIuOS0xLjZjMTMtNy44IDE4LjctMjMuNyAxMy43LTM4bC0xLjItMy0zMC4yLTY0LjJjLTMuNS03LjQtMi45LTE2LjEgMS41LTIzLjFzMTItMTEuMSAyMC4yLTExLjFsMTQ3LjUgMCAyLjQtLjFjMTEuMy0xLjEgMjAuMy0xMC4xIDIxLjQtMjEuNGwuMS0yLjVjMC03LjEtMy4xLTEzLjUtOC4yLTE4LTUuMi00LjYtOC4yLTExLjEtOC4yLTE4czMtMTMuNCA4LjItMThjNC40LTMuOSA3LjQtOS4zIDgtMTUuM2wuMi0yLjdjMC04LjQtNC40LTE1LjktMTEuMi0yMC4yLTEwLjctNi45LTE0LjItMjAuOS04LTMyIDEuNS0yLjYgMi41LTUuNiAyLjktOC42bC4yLTMuMmMwLTEwLjYtNi45LTE5LjYtMTYuNi0yMi44LTExLjctMy44LTE4LjctMTUuOS0xNi0yOCAuMi0uOSAuMy0xLjggLjQtMi42bC4yLTIuNmMwLTEyLjQtOS41LTIyLjYtMjEuNi0yMy44TDM2MCA4MCAyNTUuOSA4MHpNNTYgMTQ0Yy00LjQgMC04IDMuNi04IDhsMCAyMjRjMCA0LjQgMy42IDggOCA4bDMyIDBjNC40IDAgOC0zLjYgOC04bDAtMjI0YzAtNC40LTMuNi04LTgtOGwtMzIgMHoiXQogICAgfTsKICAgIGZhSWRCYWRnZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJpZC1iYWRnZSIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMmMxIiwgIk0yNTYgNDhsMCAxNmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtNjQgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0xNi02NCAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzODRjMCA4LjggNy4yIDE2IDE2IDE2bDI1NiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTM4NGMwLTguOC03LjItMTYtMTYtMTZsLTY0IDB6TTAgNjRDMCAyOC43IDI4LjcgMCA2NCAwTDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzg0YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA2NHpNMTYwIDMyMGw2NCAwYzQ0LjIgMCA4MCAzNS44IDgwIDgwIDAgOC44LTcuMiAxNi0xNiAxNkw5NiA0MTZjLTguOCAwLTE2LTcuMi0xNi0xNiAwLTQ0LjIgMzUuOC04MCA4MC04MHptLTI0LTk2YTU2IDU2IDAgMSAxIDExMiAwIDU2IDU2IDAgMSAxIC0xMTIgMHoiXQogICAgfTsKICAgIGZhU3F1YXJlQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLWNoZWNrIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbOTc0NSwgOTk4OSwgNjE1MTAsICJjaGVjay1zcXVhcmUiXSwgImYxNGEiLCAiTTM4NCAzMmMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMzIwIDB6TTY0IDgwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMjBjMCA4LjggNy4yIDE2IDE2IDE2bDMyMCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyMGMwLTguOC03LjItMTYtMTYtMTZMNjQgODB6bTIzMC43IDg5LjljNy44LTEwLjcgMjIuOC0xMy4xIDMzLjUtNS4zIDEwLjcgNy44IDEzLjEgMjIuOCA1LjMgMzMuNUwyMTEuNCAzNjYuMWMtNC4xIDUuNy0xMC41IDkuMy0xNy41IDkuOC03IC41LTEzLjktMi0xOC44LTYuOWwtNTUuOS01NS45Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBsMzYgMzYgMTA1LjYtMTQ1LjJ6Il0KICAgIH07CiAgICBmYUNoZWNrU3F1YXJlID0gZmFTcXVhcmVDaGVjazsKICAgIGZhQ2hlc3NCaXNob3AgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY2hlc3MtYmlzaG9wIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbOTgyMV0sICJmNDNhIiwgIk0yMTYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTYgMCA4MS44IDk4LjFjMjQuNyAyOS42IDM4LjIgNjcgMzguMiAxMDUuNiAwIDQzLjctMTcuNCA4NS43LTQ4LjMgMTE2LjZsLTguNiA4LjYgNDYuNSA1OC4yYzYuNyA4LjQgMTAuNCAxOC44IDEwLjQgMjkuNiAwIDI2LjItMjEuMiA0Ny40LTQ3LjQgNDcuNEw0Ny40IDUxMkMyMS4yIDUxMiAwIDQ5MC44IDAgNDY0LjYgMCA0NTMuOSAzLjcgNDQzLjQgMTAuNCA0MzVsNDYuNS01OC4yLTguNi04LjZDMTcuNCAzMzcuNCAwIDI5NS40IDAgMjUxLjcgMCAyMTMuMSAxMy41IDE3NS44IDM4LjIgMTQ2LjFMMTIwIDQ4IDEwNCA0OEM5MC43IDQ4IDgwIDM3LjMgODAgMjRTOTAuNyAwIDEwNCAwTDIxNiAwek05NC40IDQwNi44bC00NS43IDU3LjIgMjIyLjcgMC00NS43LTU3LjEtNS41LTYuOS0xMjAuMyAwLTUuNSA2Ljh6TTE1Ni45IDc4LjdMNzUuMSAxNzYuOGMtMTUuMyAxOC40LTI0LjYgNDEtMjYuNyA2NC43TDQ4IDI1MS43YzAgMzEgMTIuMyA2MC43IDM0LjIgODIuN2wxNy43IDE3LjcgMTIwLjIgMGM2LjItNi4yIDEyLjEtMTIuMSAxNy44LTE3LjcgMjEuOS0yMS45IDM0LjItNTEuNiAzNC4yLTgyLjZsLS40LTEwLjJjLTEuNS0xNy02LjctMzMuMy0xNS4yLTQ4TDIwOSAyNDFjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsNTEuOC01MS44LTYzLjctNzYuNS0zLjEtMy44LTMuMSAzLjh6Il0KICAgIH07CiAgICBmYUVudmVsb3BlT3BlbiA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJlbnZlbG9wZS1vcGVuIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjIxMzVdLCAiZjJiNiIsICJNNTEyIDQxNmMwIDM1LjMtMjguNSA2NC02My45IDY0TDY0IDQ4MGMtMzUuNCAwLTY0LTI4LjctNjQtNjRMMCAxNjRjLjEtMTUuNSA3LjgtMzAgMjAuNS0zOC44TDIwNi0yLjdjMzAuMS0yMC43IDY5LjgtMjAuNyA5OS45IDBMNDkxLjUgMTI1LjJjMTIuOCA4LjggMjAuNCAyMy4zIDIwLjUgMzguOGwwIDI1MnpNNjQgNDMybDM4NC4xIDBjOC44IDAgMTUuOS03LjEgMTUuOS0xNmwwLTE5MS43LTE1NC44IDExNy40Yy0zMS40IDIzLjktNzQuOSAyMy45LTEwNi40IDBMNDggMjI0LjMgNDggNDE2YzAgOC45IDcuMiAxNiAxNiAxNnpNNDYzLjYgMTY0LjRMMjc4LjcgMzYuOGMtMTMuNy05LjQtMzEuNy05LjQtNDUuNCAwTDQ4LjQgMTY0LjQgMjMxLjggMzAzLjVjMTQuMyAxMC44IDM0LjEgMTAuOCA0OC40IDBMNDYzLjYgMTY0LjR6Il0KICAgIH07CiAgICBmYUNpcmNsZVhtYXJrID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNpcmNsZS14bWFyayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYxNTMyLCAidGltZXMtY2lyY2xlIiwgInhtYXJrLWNpcmNsZSJdLCAiZjA1NyIsICJNMjU2IDQ4YTIwOCAyMDggMCAxIDEgMCA0MTYgMjA4IDIwOCAwIDEgMSAwLTQxNnptMCA0NjRhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0xNjcgMTY3Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOWw1NSA1NS01NSA1NWMtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDU1LTU1IDU1IDU1YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNTUtNTUgNTUtNTVjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMGwtNTUgNTUtNTUtNTVjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAweiJdCiAgICB9OwogICAgZmFUaW1lc0NpcmNsZSA9IGZhQ2lyY2xlWG1hcms7CiAgICBmYVhtYXJrQ2lyY2xlID0gZmFDaXJjbGVYbWFyazsKICAgIGZhU3F1YXJlQ2FyZXRVcCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtY2FyZXQtdXAiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiY2FyZXQtc3F1YXJlLXVwIl0sICJmMTUxIiwgIk02NCA4MGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzIwYzAgOC44IDcuMiAxNiAxNiAxNmwzMjAgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMjBjMC04LjgtNy4yLTE2LTE2LTE2TDY0IDgwek0wIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NnptMjI0IDY0YzYuNyAwIDEzIDIuOCAxNy42IDcuN2wxMDQgMTEyYzYuNSA3IDguMiAxNy4yIDQuNCAyNS45UzMzNy41IDMyMCAzMjggMzIwbC0yMDggMGMtOS41IDAtMTguMi01LjctMjItMTQuNHMtMi4xLTE4LjkgNC40LTI1LjlsMTA0LTExMmM0LjUtNC45IDEwLjktNy43IDE3LjYtNy43eiJdCiAgICB9OwogICAgZmFDYXJldFNxdWFyZVVwID0gZmFTcXVhcmVDYXJldFVwOwogICAgZmFGaWxlSW1hZ2UgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1pbWFnZSIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyODQ0M10sICJmMWM1IiwgIk0xNzYgNDhMNjQgNDhjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDM4NGMwIDguOCA3LjIgMTYgMTYgMTZsMjU2IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMjQwLTg4IDBjLTM5LjggMC03Mi0zMi4yLTcyLTcybDAtODh6TTMxNi4xIDE2MEwyMjQgNjcuOSAyMjQgMTM2YzAgMTMuMyAxMC43IDI0IDI0IDI0bDY4LjEgMHpNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMMTk3LjUgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN0wzNjUuMyAxNDEuM2MxMiAxMiAxOC43IDI4LjMgMTguNyA0NS4zTDM4NCA0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDY0ek0yNTkuNCA0MzJsLTEzNC44IDBjLTE1LjggMC0yOC42LTEyLjgtMjguNi0yOC42IDAtNi40IDIuMS0xMi41IDYtMTcuNmw2Ny42LTg2LjlDMTc1IDI5MiAxODMuMyAyODggMTkyIDI4OHMxNyA0IDIyLjQgMTAuOUwyODIgMzg1LjljMy45IDUgNiAxMS4yIDYgMTcuNiAwIDE1LjgtMTIuOCAyOC42LTI4LjYgMjguNnpNMTEyIDIyNGEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYVNxdWFyZUNhcmV0UmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLWNhcmV0LXJpZ2h0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImNhcmV0LXNxdWFyZS1yaWdodCJdLCAiZjE1MiIsICJNNDAwIDk2YzAtOC44LTcuMi0xNi0xNi0xNkw2NCA4MGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzIwYzAgOC44IDcuMiAxNiAxNiAxNmwzMjAgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMjB6TTM4NCAzMmMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMzIwIDB6TTMyMCAyNTZjMCA2LjctMi44IDEzLTcuNyAxNy42bC0xMTIgMTA0Yy03IDYuNS0xNy4yIDguMi0yNS45IDQuNFMxNjAgMzY5LjUgMTYwIDM2MGwwLTIwOGMwLTkuNSA1LjctMTguMiAxNC40LTIyczE4LjktMi4xIDI1LjkgNC40bDExMiAxMDRjNC45IDQuNSA3LjcgMTAuOSA3LjcgMTcuNnoiXQogICAgfTsKICAgIGZhQ2FyZXRTcXVhcmVSaWdodCA9IGZhU3F1YXJlQ2FyZXRSaWdodDsKICAgIGZhU3VuID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInN1biIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzk3MjhdLCAiZjE4NSIsICJNMjAwLjYtNy45Yy02LjctNC40LTE1LjEtNS4yLTIyLjUtMi4yUzE2NS40LS41IDE2My45IDcuM0wxNDMgMTEwLjYgMzkuNyAxMzEuNGMtNy44IDEuNi0xNC40IDctMTcuNCAxNC4zcy0yLjIgMTUuOCAyLjIgMjIuNUw4Mi43IDI1NiAyNC41IDM0My44Yy00LjQgNi43LTUuMiAxNS4xLTIuMiAyMi41czkuNiAxMi44IDE3LjQgMTQuM0wxNDMgNDAxLjQgMTYzLjkgNTA0LjdjMS42IDcuOCA3IDE0LjQgMTQuMyAxNy40czE1LjggMi4yIDIyLjUtMi4ybDg3LjgtNTguMiA4Ny44IDU4LjJjNi43IDQuNCAxNS4xIDUuMiAyMi41IDIuMnMxMi44LTkuNiAxNC4zLTE3LjRsMjAuOS0xMDMuMiAxMDMuMi0yMC45YzcuOC0xLjYgMTQuNC03IDE3LjQtMTQuM3MyLjItMTUuOC0yLjItMjIuNWwtNTguMi04Ny44IDU4LjItODcuOGM0LjQtNi43IDUuMi0xNS4xIDIuMi0yMi41cy05LjYtMTIuOC0xNy40LTE0LjNMNDMzLjggMTEwLjYgNDEzIDcuM0M0MTEuNC0uNSA0MDYtNyAzOTguNi0xMC4xcy0xNS44LTIuMi0yMi41IDIuMkwyODguNCA1MC4zIDIwMC42LTcuOXpNMTg2LjkgMTM1LjdsMTctODMuOSA3MS4zIDQ3LjNjOCA1LjMgMTguNSA1LjMgMjYuNSAwbDcxLjMtNDcuMyAxNyA4My45YzEuOSA5LjUgOS4zIDE2LjggMTguOCAxOC44bDgzLjkgMTctNDcuMyA3MS4zYy01LjMgOC01LjMgMTguNSAwIDI2LjVsNDcuMyA3MS4zLTgzLjkgMTdjLTkuNSAxLjktMTYuOSA5LjMtMTguOCAxOC44bC0xNyA4My45LTcxLjMtNDcuM2MtOC01LjMtMTguNS01LjMtMjYuNSAwbC03MS4zIDQ3LjMtMTctODMuOWMtMS45LTkuNS05LjMtMTYuOS0xOC44LTE4LjhsLTgzLjktMTcgNDcuMy03MS4zYzUuMy04IDUuMy0xOC41IDAtMjYuNWwtNDcuMy03MS4zIDgzLjktMTdjOS41LTEuOSAxNi44LTkuMyAxOC44LTE4Ljh6TTIzOS42IDI1NmE0OC40IDQ4LjQgMCAxIDEgOTYuOCAwIDQ4LjQgNDguNCAwIDEgMSAtOTYuOCAwem0xNDQuOCAwYTk2LjQgOTYuNCAwIDEgMCAtMTkyLjggMCA5Ni40IDk2LjQgMCAxIDAgMTkyLjggMHoiXQogICAgfTsKICAgIGZhSW1hZ2UgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiaW1hZ2UiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjAzZSIsICJNNjQgODBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyMGMwIDguOCA3LjIgMTYgMTYgMTZsMzIwIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzIwYzAtOC44LTcuMi0xNi0xNi0xNkw2NCA4MHpNMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZ6bTEyOCAzMmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6bTEzNiA3MmM4LjUgMCAxNi40IDQuNSAyMC43IDExLjhsODAgMTM2YzQuNCA3LjQgNC40IDE2LjYgLjEgMjQuMVMzNTIuNiAzODQgMzQ0IDM4NGwtMjQwIDBjLTguOSAwLTE3LjItNS0yMS4zLTEyLjlzLTMuNS0xNy41IDEuNi0yNC44bDU2LTgwYzQuNS02LjQgMTEuOC0xMC4yIDE5LjctMTAuMnMxNS4yIDMuOCAxOS43IDEwLjJsMTcuMiAyNC42IDQ2LjUtNzljNC4zLTcuMyAxMi4yLTExLjggMjAuNy0xMS44eiJdCiAgICB9OwogICAgZmFMaWdodGJ1bGIgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAibGlnaHRidWxiIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4MTYxXSwgImYwZWIiLCAiTTI5Ni41IDI5MS4xQzMyMSAyNjUuMiAzMzYgMjMwLjQgMzM2IDE5MiAzMzYgMTEyLjUgMjcxLjUgNDggMTkyIDQ4UzQ4IDExMi41IDQ4IDE5MmMwIDM4LjQgMTUgNzMuMiAzOS41IDk5LjEgMjEuMyAyMi40IDQ0LjkgNTQgNTMuMyA5Mi45bDEwMi40IDBjOC40LTM5IDMyLTcwLjUgNTMuMy05Mi45em0zNC44IDMzQzMwNy43IDM0OSAyODggMzc5LjQgMjg4IDQxMy43bDAgMTguM2MwIDQ0LjItMzUuOCA4MC04MCA4MGwtMzIgMGMtNDQuMiAwLTgwLTM1LjgtODAtODBsMC0xOC4zQzk2IDM3OS40IDc2LjMgMzQ5IDUyLjcgMzI0LjEgMjAgMjg5LjcgMCAyNDMuMiAwIDE5MiAwIDg2IDg2IDAgMTkyIDBTMzg0IDg2IDM4NCAxOTJjMCA1MS4yLTIwIDk3LjctNTIuNyAxMzIuMXpNMTQ0IDE4NGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGMwLTQ4LjYgMzkuNC04OCA4OC04OCAxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGMtMjIuMSAwLTQwIDE3LjktNDAgNDB6Il0KICAgIH07CiAgICBmYUFkZHJlc3NDYXJkID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImFkZHJlc3MtY2FyZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzYyMTQwLCAiY29udGFjdC1jYXJkIiwgInZjYXJkIl0sICJmMmJiIiwgIk01MTIgODBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzIwYzAgOC44LTcuMiAxNi0xNiAxNkw2NCA0MzJjLTguOCAwLTE2LTcuMi0xNi0xNkw0OCA5NmMwLTguOCA3LjItMTYgMTYtMTZsNDQ4IDB6TTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsNDQ4IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6TTIwOCAyNDhhNTYgNTYgMCAxIDAgMC0xMTIgNTYgNTYgMCAxIDAgMCAxMTJ6bS0zMiA0MGMtNDQuMiAwLTgwIDM1LjgtODAgODAgMCA4LjggNy4yIDE2IDE2IDE2bDE5MiAwYzguOCAwIDE2LTcuMiAxNi0xNiAwLTQ0LjItMzUuOC04MC04MC04MGwtNjQgMHpNMzc2IDE0NGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw4MCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC04MCAwem0wIDk2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDgwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTgwIDB6Il0KICAgIH07CiAgICBmYUNvbnRhY3RDYXJkID0gZmFBZGRyZXNzQ2FyZDsKICAgIGZhVmNhcmQgPSBmYUFkZHJlc3NDYXJkOwogICAgZmFGYWNlTWVoID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2UtbWVoIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTI4LCAibWVoIl0sICJmMTFhIiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDEgLTQxNiAwIDIwOCAyMDggMCAxIDEgNDE2IDB6TTI1NiAwYTI1NiAyNTYgMCAxIDAgMCA1MTIgMjU2IDI1NiAwIDEgMCAwLTUxMnpNMTc2IDI0MGEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6bTE5Mi0zMmEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwek0xODQgMzIwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDE0NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xNDQgMHoiXQogICAgfTsKICAgIGZhTWVoID0gZmFGYWNlTWVoOwogICAgZmFNYXAgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAibWFwIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTA2LCA2MjA3Ml0sICJmMjc5IiwgIk01MTIgNDhjMC04LjMtNC4zLTE2LTExLjMtMjAuNHMtMTUuOS00LjgtMjMuMy0xLjFMMzUyLjUgODguMSAxODAgMjkuNGMtMTMuNy00LjctMjguNy0zLjgtNDEuOSAyLjNMMTMuOCA5MC4zQzUuNCA5NC4yIDAgMTAyLjcgMCAxMTJMMCA0NjRjMCA4LjIgNC4yIDE1LjkgMTEuMSAyMC4zczE1LjYgNC45IDIzLjEgMS40bDEyNy4zLTU5LjkgMTcwLjcgNTYuOWMxMy43IDQuNiAyOC41IDMuNyA0MS42LTIuNWwxMjQuNC01OC41YzguNC00IDEzLjgtMTIuNCAxMy44LTIxLjdsMC0zNTJ6TTE0NCA4Mi4xbDAgMjk5LTk2IDQ1LjIgMC0yOTkgOTYtNDUuMnptNDggMzAzLjNsMC0zMDEuMSAxMjggNDMuNSAwIDMwMC4zLTEyOC00Mi43ek0zNjggMTM0bDk2LTQ3LjQgMCAyOTguMi05NiA0NS4yIDAtMjk2eiJdCiAgICB9OwogICAgZmFIYW5kUG9pbnREb3duID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImhhbmQtcG9pbnQtZG93biIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMGE3IiwgIk02NCA0NDhsMC0xNzcuNmM1LjIgMSAxMC41IDEuNiAxNiAxLjZsMTYgMCAwIDE3NmMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNnpNODAgMjI0Yy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTI0YzAtNjYuMyA1My43LTEyMCAxMjAtMTIwbDQ4IDBjNTIuNSAwIDk3LjEgMzMuNyAxMTMuNCA4MC43LTMuMS0uNS02LjItLjctOS40LS43LTIwIDAtMzcuOSA5LjItNDkuNyAyMy42LTktNC45LTE5LjQtNy42LTMwLjMtNy42LTE1LjEgMC0yOSA1LjMtNDAgMTQtMTEtOC44LTI0LjktMTQtNDAtMTRsLTQwIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDAgMGM4LjggMCAxNiA3LjIgMTYgMTZzLTcuMiAxNi0xNiAxNmwtODAgMHpNMCAxOTJsMCAwYzAgMTggNiAzNC42IDE2IDQ4bDAgMjA4YzAgMzUuMyAyOC43IDY0IDY0IDY0czY0LTI4LjcgNjQtNjRsMC04MmM1LjEgMS4zIDEwLjUgMiAxNiAyIDI1LjMgMCA0Ny4yLTE0LjcgNTcuNi0zNiA3IDIuNiAxNC41IDQgMjIuNCA0IDIwIDAgMzcuOS05LjIgNDkuNy0yMy42IDkgNC45IDE5LjQgNy42IDMwLjMgNy42IDM1LjMgMCA2NC0yOC43IDY0LTY0bDAtODhDMzg0IDc1LjIgMzA4LjggMCAyMTYgMEwxNjggMEM3NS4yIDAgMCA3NS4yIDAgMTY4bDAgMjR6bTMzNiA2NGMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTY0YzAtOC44IDcuMi0xNiAxNi0xNnMxNiA3LjIgMTYgMTZsMCA2NHpNMTYwIDI3MmM1LjUgMCAxMC45LS43IDE2LTJsMCAzNGMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTMyIDE2IDB6bTY0LTI0bDAtNDBjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDY0YzAgOC44LTcuMiAxNi0xNiAxNnMtMTYtNy4yLTE2LTE2bDAtMjR6Il0KICAgIH07CiAgICBmYUZhY2VNZWhCbGFuayA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLW1laC1ibGFuayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU2NiwgIm1laC1ibGFuayJdLCAiZjVhNCIsICJNMjU2IDQ4YTIwOCAyMDggMCAxIDAgMCA0MTYgMjA4IDIwOCAwIDEgMCAwLTQxNnpNNTEyIDI1NmEyNTYgMjU2IDAgMSAxIC01MTIgMCAyNTYgMjU2IDAgMSAxIDUxMiAwek0xNDQgMjA4YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTE5Mi0zMmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYU1laEJsYW5rID0gZmFGYWNlTWVoQmxhbms7CiAgICBmYUZhY2VHcmluVG9uZ3VlID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi10b25ndWUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MzksICJncmluLXRvbmd1ZSJdLCAiZjU4OSIsICJNNDY0IDI1NmMwLTExNC45LTkzLjEtMjA4LTIwOC0yMDhTNDggMTQxLjEgNDggMjU2YzAgNzQuMSAzOC44IDEzOS4yIDk3LjEgMTc2LS43LTUuMi0xLjEtMTAuNi0xLjEtMTZsMC01My41Yy0xMC4yLTEyLjYtMTguMy0yNi45LTIzLjgtNDIuNC00LjEtMTEuNiA3LjgtMjEuNCAxOS42LTE3LjggMzQuNyAxMC42IDc0LjIgMTYuNSAxMTYuMSAxNi41IDQyIDAgODEuNS02IDExNi4zLTE2LjYgMTEuOC0zLjYgMjMuNyA2LjEgMTkuNiAxNy44LTUuNSAxNS42LTEzLjYgMjkuOS0yMy44IDQyLjVsMCA1My41YzAgNS40LS40IDEwLjgtMS4xIDE2IDU4LjQtMzYuOCA5Ny4xLTEwMS45IDk3LjEtMTc2em00OCAwYzAgMTE2LjMtNzcuNiAyMTQuNi0xODMuOSAyNDUuNy0xOS41IDE2LjQtNDQuNiAyNi4zLTcyLjEgMjYuM3MtNTIuNi05LjktNzIuMS0yNi4zQzc3LjYgNDcwLjYgMCAzNzIuMyAwIDI1NiAwIDExNC42IDExNC42IDAgMjU2IDBTNTEyIDExNC42IDUxMiAyNTZ6TTE3NiAxNzZhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em0xMjggMzJhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptMTYgMjA4bDAtMzcuNGMwLTE0LjctMTEuOS0yNi42LTI2LjYtMjYuNmwtMiAwYy0xMS4zIDAtMjEuMSA3LjktMjMuNiAxOC45LTIuOCAxMi42LTIwLjggMTIuNi0yMy42IDAtMi41LTExLjEtMTIuMy0xOC45LTIzLjYtMTguOWwtMiAwYy0xNC43IDAtMjYuNiAxMS45LTI2LjYgMjYuNmwwIDM3LjRjMCAzNS4zIDI4LjcgNjQgNjQgNjRzNjQtMjguNyA2NC02NHoiXQogICAgfTsKICAgIGZhR3JpblRvbmd1ZSA9IGZhRmFjZUdyaW5Ub25ndWU7CiAgICBmYUZ1dGJvbCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmdXRib2wiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5OTE3LCAiZnV0Ym9sLWJhbGwiLCAic29jY2VyLWJhbGwiXSwgImYxZTMiLCAiTTM4NyAyMjguM2MtNC40LTIuOC03LjYtNy05LjItMTEuOXMtMS40LTEwLjIgLjUtMTVMNDExLjYgMTE4Yy0xOS45LTIyLjQtNDQuNi00MC41LTcyLjQtNTIuN2wtNjkuMSA1Ny42Yy00IDMuMy05IDUuMS0xNC4xIDUuMXMtMTAuMi0xLjgtMTQuMS01LjFMMTcyLjggNjUuM2MtMjcuOCAxMi4yLTUyLjUgMzAuMy03Mi40IDUyLjdsMzMuNCA4My40YzEuOSA0LjggMi4xIDEwLjEgLjUgMTVzLTQuOSA5LjEtOS4yIDExLjlMNDkgMjc2LjJjMyAzMC45IDEyLjcgNTkuNyAyNy42IDg1LjJsODkuNy02YzUuMi0uMyAxMC4zIDEuMSAxNC41IDQuMnM3LjIgNy40IDguNCAxMi41bDIyIDg3LjJjMTQuNCAzLjIgMjkuNCA0LjggNDQuOCA0LjhzMzAuMy0xLjcgNDQuOC00LjhsMjItODcuMmMxLjMtNSA0LjItOS40IDguNC0xMi41czkuMy00LjUgMTQuNS00LjJsODkuNyA2YzE1LTI1LjQgMjQuNy01NC4zIDI3LjYtODUuMUwzODcgMjI4LjN6TTI1NiAwYTI1NiAyNTYgMCAxIDEgMCA1MTIgMjU2IDI1NiAwIDEgMSAwLTUxMnptNjIgMjIxYzguNCA2LjEgMTEuOSAxNi45IDguNyAyNi44bC0xOC4zIDU2LjNjLTMuMiA5LjktMTIuNCAxNi42LTIyLjggMTYuNmwtNTkuMiAwYy0xMC40IDAtMTkuNi02LjctMjIuOC0xNi42bC0xOC4zLTU2LjNjLTMuMi05LjkgLjMtMjAuNyA4LjctMjYuOGw0Ny45LTM0LjhjOC40LTYuMSAxOS44LTYuMSAyOC4yIDBMMzE4IDIyMXoiXQogICAgfTsKICAgIGZhRnV0Ym9sQmFsbCA9IGZhRnV0Ym9sOwogICAgZmFTb2NjZXJCYWxsID0gZmFGdXRib2w7CiAgICBmYUZhY2VTdXJwcmlzZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLXN1cnByaXNlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTU4LCAic3VycHJpc2UiXSwgImY1YzIiLCAiTTQ2NCAyNTZhMjA4IDIwOCAwIDEgMCAtNDE2IDAgMjA4IDIwOCAwIDEgMCA0MTYgMHpNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMTc2LTgwYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHptMTI4IDMyYTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bS00OCA4MGE2NCA2NCAwIDEgMSAwIDEyOCA2NCA2NCAwIDEgMSAwLTEyOHoiXQogICAgfTsKICAgIGZhU3VycHJpc2UgPSBmYUZhY2VTdXJwcmlzZTsKICAgIGZhRm9sZGVyID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZvbGRlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODE5MywgMTI4NDQ3LCA2MTcxNiwgImZvbGRlci1ibGFuayJdLCAiZjA3YiIsICJNNjQgNDAwbDM4NCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTI0MGMwLTguOC03LjItMTYtMTYtMTZsLTE0OS4zIDBjLTE3LjMgMC0zNC4yLTUuNi00OC0xNkwyMTIuMyA4My4yYy0yLjgtMi4xLTYuMS0zLjItOS42LTMuMkw2NCA4MGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMjg4YzAgOC44IDcuMiAxNiAxNiAxNnptMzg0IDQ4TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwxMzguNyAwYzEzLjggMCAyNy4zIDQuNSAzOC40IDEyLjhsMzguNCAyOC44YzUuNSA0LjIgMTIuMyA2LjQgMTkuMiA2LjRMNDQ4IDgwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjQwYzAgMzUuMy0yOC43IDY0LTY0IDY0eiJdCiAgICB9OwogICAgZmFGb2xkZXJCbGFuayA9IGZhRm9sZGVyOwogICAgZmFDbG91ZCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjbG91ZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzk3MjldLCAiZjBjMiIsICJNODAgMTkyYzAtODguNCA3MS42LTE2MCAxNjAtMTYwIDQ3LjEgMCA4OS40IDIwLjQgMTE4LjcgNTIuNyAxMC42LTMuMSAyMS44LTQuNyAzMy4zLTQuNyA2Ni4zIDAgMTIwIDUzLjcgMTIwIDEyMCAwIDEzLjItMi4xIDI1LjktNi4xIDM3LjggNDEuNiAyMS4xIDcwLjEgNjQuMyA3MC4xIDExNC4yIDAgNzAuNy01Ny4zIDEyOC0xMjggMTI4bC0zMDQgMGMtNzkuNSAwLTE0NC02NC41LTE0NC0xNDQgMC01Ni44IDMyLjktMTA1LjkgODAuNy0xMjkuNC0uNC00LjgtLjctOS43LS43LTE0LjZ6TTI0MCA4MGMtNjEuOSAwLTExMiA1MC4xLTExMiAxMTIgMCA4LjQgLjkgMTYuNiAyLjcgMjQuNSAyLjcgMTIuMS00LjMgMjQuMy0xNi4xIDI4LjEtMzguNyAxMi40LTY2LjYgNDguNy02Ni42IDkxLjQgMCA1MyA0MyA5NiA5NiA5NmwzMDQgMGM0NC4yIDAgODAtMzUuOCA4MC04MCAwLTM3LjQtMjUuNy02OC45LTYwLjUtNzcuNi03LjUtMS45LTEzLjYtNy4yLTE2LjUtMTQuM3MtMi4xLTE1LjIgMi0yMS43YzctMTEuMSAxMS0yNC4yIDExLTM4LjMgMC0zOS44LTMyLjItNzItNzItNzItMTEuMSAwLTIxLjUgMi41LTMwLjggNi45LTEwLjUgNS0yMy4xIDEuNy0yOS44LTcuOC0yMC4zLTI4LjYtNTMuNy00Ny4xLTkxLjMtNDcuMXoiXQogICAgfTsKICAgIGZhQ2lyY2xlID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNpcmNsZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODMwOCwgMTI4MzA5LCAxMjg5OTIsIDEyODk5MywgMTI4OTk0LCAxMjg5OTUsIDEyODk5NiwgOTY3OSwgOTg5OCwgOTg5OSwgMTEwNDQsIDYxNzA4LCA2MTkxNV0sICJmMTExIiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDAgLTQxNiAwIDIwOCAyMDggMCAxIDAgNDE2IDB6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6Il0KICAgIH07CiAgICBmYUZhY2VHcmluU3F1aW50ID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi1zcXVpbnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MTgsICJncmluLXNxdWludCJdLCAiZjU4NSIsICJNNDY0IDI1NmEyMDggMjA4IDAgMSAwIC00MTYgMCAyMDggMjA4IDAgMSAwIDQxNiAwek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0zNzIuMiA0Ni4zYzExLjgtMy42IDIzLjcgNi4xIDE5LjYgMTcuOC0xOS44IDU1LjktNzMuMSA5Ni0xMzUuOCA5Ni02Mi43IDAtMTE2LTQwLTEzNS44LTk1LjktNC4xLTExLjYgNy44LTIxLjQgMTkuNi0xNy44IDM0LjcgMTAuNiA3NC4yIDE2LjUgMTE2LjEgMTYuNSA0MiAwIDgxLjUtNiAxMTYuMy0xNi42em0tMjQ5LjYtMTQzYzQuNS02LjggMTMuMy05LjIgMjAuNi01LjVsNzkuNiA0MGM1LjQgMi43IDguOCA4LjIgOC44IDE0LjNzLTMuNCAxMS42LTguOCAxNC4zbC03OS42IDQwYy03LjMgMy42LTE2LjEgMS4zLTIwLjYtNS41cy0zLjEtMTUuOSAzLjEtMjEuMUwxNTkgMjA4IDEyNS44IDE4MC4zYy02LjItNS4yLTcuNi0xNC4zLTMuMS0yMS4xem0yNjMuNiAyMS4xTDM1MyAyMDggMzg2LjIgMjM1LjdjNi4yIDUuMiA3LjYgMTQuMyAzLjEgMjEuMXMtMTMuMyA5LjItMjAuNiA1LjVsLTc5LjYtNDBjLTUuNC0yLjctOC44LTguMi04LjgtMTQuM3MzLjQtMTEuNiA4LjgtMTQuM2w3OS42LTQwYzcuMy0zLjYgMTYuMS0xLjMgMjAuNiA1LjVzMy4xIDE1LjktMy4xIDIxLjF6Il0KICAgIH07CiAgICBmYUdyaW5TcXVpbnQgPSBmYUZhY2VHcmluU3F1aW50OwogICAgZmFDaXJjbGVVc2VyID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNpcmNsZS11c2VyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjIxNDIsICJ1c2VyLWNpcmNsZSJdLCAiZjJiZCIsICJNNDA2LjUgMzk5LjZDMzg3LjQgMzUyLjkgMzQxLjUgMzIwIDI4OCAzMjBsLTY0IDBjLTUzLjUgMC05OS40IDMyLjktMTE4LjUgNzkuNi0zNS42LTM3LjMtNTcuNS04Ny45LTU3LjUtMTQzLjYgMC0xMTQuOSA5My4xLTIwOCAyMDgtMjA4czIwOCA5My4xIDIwOCAyMDhjMCA1NS43LTIxLjkgMTA2LjItNTcuNSAxNDMuNnptLTQwLjEgMzIuN0MzMzQuNCA0NTIuNCAyOTYuNiA0NjQgMjU2IDQ2NHMtNzguNC0xMS42LTExMC41LTMxLjdjNy4zLTM2LjcgMzkuNy02NC4zIDc4LjUtNjQuM2w2NCAwYzM4LjggMCA3MS4yIDI3LjYgNzguNSA2NC4zek0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnptMC0yNzJhNDAgNDAgMCAxIDEgMC04MCA0MCA0MCAwIDEgMSAwIDgwem0tODgtNDBhODggODggMCAxIDAgMTc2IDAgODggODggMCAxIDAgLTE3NiAweiJdCiAgICB9OwogICAgZmFVc2VyQ2lyY2xlID0gZmFDaXJjbGVVc2VyOwogICAgZmFSZWN0YW5nbGVMaXN0ID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInJlY3RhbmdsZS1saXN0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImxpc3QtYWx0Il0sICJmMDIyIiwgIk02NCAxMTJjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDI1NmMwIDguOCA3LjIgMTYgMTYgMTZsMzg0IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMjU2YzAtOC44LTcuMi0xNi0xNi0xNkw2NCAxMTJ6TTAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjU2YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjh6TTE2MCAzMjBhMzIgMzIgMCAxIDEgLTY0IDAgMzIgMzIgMCAxIDEgNjQgMHptLTMyLTk2YTMyIDMyIDAgMSAxIDAtNjQgMzIgMzIgMCAxIDEgMCA2NHptMTA0LTU2bDE2MCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNjAgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHptMCAxMjhsMTYwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE2MCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFMaXN0QWx0ID0gZmFSZWN0YW5nbGVMaXN0OwogICAgZmFIYW5kID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImhhbmQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjkzMDYsIDk5OTUsICJoYW5kLXBhcGVyIl0sICJmMjU2IiwgIk0yNTYuNSAwYy0yNS4zIDAtNDcuMiAxNC43LTU3LjYgMzYtNy0yLjYtMTQuNS00LTIyLjQtNC0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDE2NS41LTIuNy0yLjdjLTI1LTI1LTY1LjUtMjUtOTAuNSAwcy0yNSA2NS41IDAgOTAuNUwxMDcgNDM3YzQ4IDQ4IDExMy4xIDc1IDE4MSA3NWwxNi41IDBjMS41IDAgMy0uMSA0LjUtLjQgOTEuNy02LjIgMTY1LTc5LjQgMTcxLjEtMTcxLjEgLjMtMS41IC40LTMgLjQtNC41bDAtMTc2YzAtMzUuMy0yOC43LTY0LTY0LTY0LTUuNSAwLTEwLjkgLjctMTYgMmwwLTJjMC0zNS4zLTI4LjctNjQtNjQtNjQtNy45IDAtMTUuNCAxLjQtMjIuNCA0LTEwLjQtMjEuMy0zMi4zLTM2LTU3LjYtMzZ6bS0xNiA5Ni4xbDAtLjEgMC0zMmMwLTguOCA3LjItMTYgMTYtMTZzMTYgNy4yIDE2IDE2bDAgMTY4YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xMzZjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDEzNmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNzJjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDE3Mi45Yy0uMSAuNi0uMSAxLjMtLjIgMS45LTMuNCA2OS43LTU5LjMgMTI1LjYtMTI5IDEyOS0uNiAwLTEuMyAuMS0xLjkgLjJMMjg4IDQ2NEMyMzIuOSA0NjQgMTgwIDQ0Mi4xIDE0MSA0MDMuMUw1My4yIDMxNS4zYy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBsNDMuNyA0My43YzYuOSA2LjkgMTcuMiA4LjkgMjYuMiA1LjJzMTQuOC0xMi41IDE0LjgtMjIuMmwwLTIyMy40YzAtOC44IDcuMi0xNiAxNi0xNiA4LjggMCAxNiA3LjEgMTYgMTUuOWwwIDEzNi4xYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xMzUuOXoiXQogICAgfTsKICAgIGZhSGFuZFBhcGVyID0gZmFIYW5kOwogICAgZmFUaHVtYnNVcCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJ0aHVtYnMtdXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgwNzcsIDYxNTc1XSwgImYxNjQiLCAiTTE3MS41IDM4LjhDMTkyLjMgNCAyMzYuNS0xMCAyNzQgNy42bDcuMiAzLjhDMzE2IDMyLjMgMzMwIDc2LjUgMzEyLjQgMTE0bDAgMC0xNC4xIDMwIDEwOS43IDAgNy40IC40YzM2LjMgMy43IDY0LjYgMzQuNCA2NC42IDcxLjYgMCAxMy4yLTMuNiAyNS40LTkuOCAzNiA2LjEgMTAuNiA5LjcgMjIuOCA5LjggMzYgMCAxOC4zLTYuOSAzNC44LTE4IDQ3LjUgMS4zIDUuMyAyIDEwLjggMiAxNi41IDAgMjUuMS0xMi45IDQ3LTMyLjIgNTkuOS0xLjkgMzUuNS0yOS40IDY0LjItNjQuNCA2Ny43bC03LjQgLjQtMTA0LjEgMGMtMTggMC0zNS45LTMuNC01Mi42LTkuOWwtNy4xLTMtLjctLjMtNi42LTMuMi0uNy0uMy0xMi4yLTYuNWMtMTIuMy02LjUtMjMuMy0xNC43LTMyLjktMjQuMS00LjEgMjYuOS0yNy4zIDQ3LjQtNTUuMyA0Ny40bC0zMiAwYy0zMC45IDAtNTYtMjUuMS01Ni01NkwwIDIwMGMwLTMwLjkgMjUuMS01NiA1Ni01NmwzMiAwYzEwLjggMCAyMC45IDMuMSAyOS41IDguNWw1MC4xLTEwNi41IC42LTEuMiAyLjctNSAuNi0uOXpNNTYgMTkyYy00LjQgMC04IDMuNi04IDhsMCAyMjRjMCA0LjQgMy42IDggOCA4bDMyIDBjNC40IDAgOC0zLjYgOC04bDAtMjI0YzAtNC40LTMuNi04LTgtOGwtMzIgMHpNMjUzLjYgNTFjLTE0LjgtNi45LTMyLjMtMS42LTQwLjcgMTJsLTIuMiA0LTU2LjggMTIwLjljLTMuNSA3LjUtNS41IDE1LjUtNiAyMy43bC0uMSA0LjIgMCAxMTIuOSAuMiA3LjljMi40IDMyLjcgMjEuNCA2Mi4xIDUwLjcgNzcuN2wxMS41IDYuMSA2LjMgMy4xYzEyLjQgNS42IDI1LjggOC41IDM5LjQgOC41bDEwNC4xIDAgMi40LS4xYzEyLjEtMS4yIDIxLjYtMTEuNSAyMS42LTIzLjlsLS4yLTIuNmMtLjEtLjktLjItMS43LS40LTIuNi0yLjctMTIuMSA0LjMtMjQuMiAxNi0yOCA5LjctMy4xIDE2LjYtMTIuMiAxNi42LTIyLjggMC00LjMtMS4xLTguMi0zLjEtMTEuOC02LjMtMTEuMS0yLjgtMjUuMiA4LTMyIDYuOC00LjMgMTEuMi0xMS44IDExLjItMjAuMiAwLTcuMS0zLjEtMTMuNS04LjItMTgtNS4yLTQuNi04LjItMTEuMS04LjItMThzMy0xMy40IDguMi0xOGM1LjEtNC41IDguMi0xMC45IDguMi0xOGwtLjEtMi40Yy0xLjEtMTEuMy0xMC4xLTIwLjMtMjEuNC0yMS40bC0yLjQtLjEtMTQ3LjUgMGMtOC4yIDAtMTUuOC00LjItMjAuMi0xMS4xLTQuNC02LjktNS0xNS43LTEuNS0yMy4xTDI2OSA5My42YzctMTUgMS40LTMyLjctMTIuNS00MUwyNTMuNiA1MXoiXQogICAgfTsKICAgIGZhQnVpbGRpbmcgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiYnVpbGRpbmciLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjc5NzAsIDYxNjg3XSwgImYxYWQiLCAiTTY0IDQ4Yy04LjggMC0xNiA3LjItMTYgMTZsMCAzODRjMCA4LjggNy4yIDE2IDE2IDE2bDgwIDAgMC04MGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgODAgODAgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zODRjMC04LjgtNy4yLTE2LTE2LTE2TDY0IDQ4ek0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDM4NGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6bTk2IDQ4YzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJ6TTI0MCA5NmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2ek05NiAyNDBjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMnptMTQ0LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZ6Il0KICAgIH07CiAgICBmYUNoZXNzUm9vayA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjaGVzcy1yb29rIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbOTgyMF0sICJmNDQ3IiwgIk0zNTIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDEzOC43YzAgMTMuOC00LjUgMjcuMy0xMi44IDM4LjRsLTM1LjIgNDYuOSAwIDExMiA0MC44IDY4LjFjNC43IDcuOCA3LjIgMTYuNyA3LjIgMjUuOCAwIDI3LjctMjIuNCA1MC4xLTUwLjEgNTAuMUw1MC4xIDUxMmMtMjcuNyAwLTUwLjEtMjIuNC01MC4xLTUwLjEgMC05LjEgMi41LTE4IDcuMi0yNS44TDQ4IDM2OCA0OCAyNTYgMTIuOCAyMDkuMUM0LjUgMTk4IDAgMTg0LjUgMCAxNzAuN0wwIDMyQzAgMTQuMyAxNC4zIDAgMzIgMEwzNTIgMHpNNDguMyA0NjAuOGwtLjMgMS4xYzAgMS4yIDEgMi4xIDIuMSAyLjFsMjgzLjggMGMxLjIgMCAyLjEtMSAyLjEtMi4xbC0uMy0xLjEtMzYuNS02MC44LTIxNC40IDAtMzYuNSA2MC44ek00OCAxNzAuN2MwIDIuNiAuNiA1LjEgMS44IDcuNGwxLjQgMi4yIDAgMCAzNS4yIDQ2LjkgOS42IDEyLjggMCAxMTIgMTkyIDAgMC0xMTIgOS42LTEyLjggMzUuMi00Ni45IDAgMCAxLjQtMi4yYzEuMi0yLjMgMS44LTQuOCAxLjgtNy40bDAtMTIyLjctNjQgMCAwIDI0YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMjQtNjQgMCAwIDI0YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMjQtNjQgMCAwIDEyMi43eiJdCiAgICB9OwogICAgZmFDaXJjbGVRdWVzdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtcXVlc3Rpb24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MjEwOCwgInF1ZXN0aW9uLWNpcmNsZSJdLCAiZjA1OSIsICJNNDY0IDI1NmEyMDggMjA4IDAgMSAwIC00MTYgMCAyMDggMjA4IDAgMSAwIDQxNiAwek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0yNTYtODBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyIDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtNDQuMiAzNS44LTgwIDgwLTgwczgwIDM1LjggODAgODBjMCA0Ny4yLTM2IDY3LjItNTYgNzQuNWwwIDMuOGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTguMWMwLTIwLjUgMTQuOC0zNS4yIDMwLjEtNDAuMiA2LjQtMi4xIDEzLjItNS41IDE4LjItMTAuMyA0LjMtNC4yIDcuNy0xMCA3LjctMTkuNiAwLTE3LjctMTQuMy0zMi0zMi0zMnpNMjI0IDM2OGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAweiJdCiAgICB9OwogICAgZmFRdWVzdGlvbkNpcmNsZSA9IGZhQ2lyY2xlUXVlc3Rpb247CiAgICBmYUZpbGUgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmlsZSIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyODE5NiwgMTI4NDU5LCA2MTQ2Ml0sICJmMTViIiwgIk0xNzYgNDhMNjQgNDhjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDM4NGMwIDguOCA3LjIgMTYgMTYgMTZsMjU2IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMjQwLTg4IDBjLTM5LjggMC03Mi0zMi4yLTcyLTcybDAtODh6TTMxNi4xIDE2MEwyMjQgNjcuOSAyMjQgMTM2YzAgMTMuMyAxMC43IDI0IDI0IDI0bDY4LjEgMHpNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMMTk3LjUgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN0wzNjUuMyAxNDEuM2MxMiAxMiAxOC43IDI4LjMgMTguNyA0NS4zTDM4NCA0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDY0eiJdCiAgICB9OwogICAgZmFGYWNlU2FkQ3J5ID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2Utc2FkLWNyeSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU1NywgInNhZC1jcnkiXSwgImY1YjMiLCAiTTQwMCA0MDYuMUw0MDAgMjg4YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTUyLjZjLTI4LjcgMTUtNjEuNCAyMy40LTk2IDIzLjRzLTY3LjMtOC41LTk2LTIzLjRMMTYwIDI4OGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDExOC4xQzcyLjYgMzY4LjIgNDggMzE1IDQ4IDI1NiA0OCAxNDEuMSAxNDEuMSA0OCAyNTYgNDhzMjA4IDkzLjEgMjA4IDIwOGMwIDU5LTI0LjYgMTEyLjItNjQgMTUwLjF6TTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0xNTIgMTk2bDE2IDBjMTEgMCAyMCA5IDIwIDIwczkgMjAgMjAgMjAgMjAtOSAyMC0yMGMwLTMzLjEtMjYuOS02MC02MC02MGwtMTYgMGMtMzMuMSAwLTYwIDI2LjktNjAgNjAgMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjAgOS0yMCAyMC0yMHptMTcyIDIwYzAtMTEgOS0yMCAyMC0yMGwxNiAwYzExIDAgMjAgOSAyMCAyMHM5IDIwIDIwIDIwIDIwLTkgMjAtMjBjMC0zMy4xLTI2LjktNjAtNjAtNjBsLTE2IDBjLTMzLjEgMC02MCAyNi45LTYwIDYwIDAgMTEgOSAyMCAyMCAyMHMyMC05IDIwLTIwek0yMDggMzM2bDAgMzJjMCAyNi41IDIxLjUgNDggNDggNDhzNDgtMjEuNSA0OC00OGwwLTMyYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4cy00OCAyMS41LTQ4IDQ4eiJdCiAgICB9OwogICAgZmFTYWRDcnkgPSBmYUZhY2VTYWRDcnk7CiAgICBmYUNhbGVuZGFyTWludXMgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY2FsZW5kYXItbWludXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjI3MiIsICJNMTIwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA0MCAxNjAgMCAwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA0MCAzMiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjg4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsMzIgMCAwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0em0wIDExMmwtNTYgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMjg4YzAgOC44IDcuMiAxNiAxNiAxNmwzMjAgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0yODhjMC04LjgtNy4yLTE2LTE2LTE2bC0yNjQgMHptMzIgMTM2bDE0NCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNDQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhRmFjZVRpcmVkID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2UtdGlyZWQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1NTUsICJ0aXJlZCJdLCAiZjVjOCIsICJNNDY0IDI1NmEyMDggMjA4IDAgMSAwIC00MTYgMCAyMDggMjA4IDAgMSAwIDQxNiAwek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0xNzYuNSA2NC4zQzE5Ni4xIDMwMi4xIDIyMy44IDI4OCAyNTYgMjg4czU5LjkgMTQuMSA3OS41IDMyLjNjMTkgMTcuOCAzMi41IDQxLjcgMzIuNSA2My43IDAgNS40LTIuNyAxMC40LTcuMiAxMy40cy0xMC4yIDMuNC0xNS4yIDEuM2wtMTcuMi03LjVjLTIyLjgtMTAtNDcuNS0xNS4xLTcyLjQtMTUuMXMtNDkuNiA1LjItNzIuNCAxNS4xbC0xNy4yIDcuNWMtNC45IDIuMi0xMC43IDEuNy0xNS4yLTEuM3MtNy4yLTgtNy4yLTEzLjRjMC0yMiAxMy41LTQ1LjkgMzIuNS02My43ek0xMjIuNiAxNTkuMmM0LjUtNi44IDEzLjMtOS4yIDIwLjYtNS41bDc5LjYgNDBjNS40IDIuNyA4LjggOC4yIDguOCAxNC4zcy0zLjQgMTEuNi04LjggMTQuM2wtNzkuNiA0MGMtNy4zIDMuNi0xNi4xIDEuMy0yMC42LTUuNXMtMy4xLTE1LjkgMy4xLTIxLjFMMTU5IDIwOCAxMjUuOCAxODAuM2MtNi4yLTUuMi03LjYtMTQuMy0zLjEtMjEuMXptMjYzLjYgMjEuMUwzNTMgMjA4IDM4Ni4yIDIzNS43YzYuMiA1LjIgNy42IDE0LjMgMy4xIDIxLjFzLTEzLjMgOS4yLTIwLjYgNS41bC03OS42LTQwYy01LjQtMi43LTguOC04LjItOC44LTE0LjNzMy40LTExLjYgOC44LTE0LjNsNzkuNi00MGM3LjMtMy42IDE2LjEtMS4zIDIwLjYgNS41czMuMSAxNS45LTMuMSAyMS4xeiJdCiAgICB9OwogICAgZmFUaXJlZCA9IGZhRmFjZVRpcmVkOwogICAgZmFIYW5kUG9pbnRSaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kLXBvaW50LXJpZ2h0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYwYTQiLCAiTTQ0OCAxMjhsLTE3Ny42IDBjMSA1LjIgMS42IDEwLjUgMS42IDE2bDAgMTYgMTc2IDBjOC44IDAgMTYtNy4yIDE2LTE2cy03LjItMTYtMTYtMTZ6TTIyNCAxNDRjMC0xNy43LTE0LjMtMzItMzItMzJsLTI0IDBjLTY2LjMgMC0xMjAgNTMuNy0xMjAgMTIwbDAgNDhjMCA1Mi41IDMzLjcgOTcuMSA4MC43IDExMy40LS41LTMuMS0uNy02LjItLjctOS40IDAtMjAgOS4yLTM3LjkgMjMuNi00OS43LTQuOS05LTcuNi0xOS40LTcuNi0zMC4zIDAtMTUuMSA1LjMtMjkgMTQtNDAtOC44LTExLTE0LTI0LjktMTQtNDBsMC00MGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgNDBjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTgwek0xOTIgNjRsMCAwYzE4IDAgMzQuNiA2IDQ4IDE2bDIwOCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0cy0yOC43IDY0LTY0IDY0bC04MiAwYzEuMyA1LjEgMiAxMC41IDIgMTYgMCAyNS4zLTE0LjcgNDcuMi0zNiA1Ny42IDIuNiA3IDQgMTQuNSA0IDIyLjQgMCAyMC05LjIgMzcuOS0yMy42IDQ5LjcgNC45IDkgNy42IDE5LjQgNy42IDMwLjMgMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTg4IDBDNzUuMiA0NDggMCAzNzIuOCAwIDI4MGwwLTQ4QzAgMTM5LjIgNzUuMiA2NCAxNjggNjRsMjQgMHptNjQgMzM2YzguOCAwIDE2LTcuMiAxNi0xNnMtNy4yLTE2LTE2LTE2bC02NCAwYy04LjggMC0xNiA3LjItMTYgMTZzNy4yIDE2IDE2IDE2bDY0IDB6bTE2LTE3NmMwIDUuNS0uNyAxMC45LTIgMTZsMzQgMGM4LjggMCAxNi03LjIgMTYtMTZzLTcuMi0xNi0xNi0xNmwtMzIgMCAwIDE2em0tMjQgNjRsLTQwIDBjLTguOCAwLTE2IDcuMi0xNiAxNnM3LjIgMTYgMTYgMTZsNjQgMGM4LjggMCAxNi03LjIgMTYtMTZzLTcuMi0xNi0xNi0xNmwtMjQgMHoiXQogICAgfTsKICAgIGZhQ2lyY2xlVXAgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLXVwIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjE0NjcsICJhcnJvdy1hbHQtY2lyY2xlLXVwIl0sICJmMzViIiwgIk0yNTYgNDhhMjA4IDIwOCAwIDEgMSAwIDQxNiAyMDggMjA4IDAgMSAxIDAtNDE2em0wIDQ2NGEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6bTExLjMtMzg3LjNjLTYuMi02LjItMTYuNC02LjItMjIuNiAwbC0xMDQgMTA0Yy00LjYgNC42LTUuOSAxMS41LTMuNSAxNy40czguMyA5LjkgMTQuOCA5LjlsNzIgMCAwIDEwNGMwIDEzLjMgMTAuNyAyNCAyNCAyNGwxNiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtMTA0IDcyIDBjNi41IDAgMTIuMy0zLjkgMTQuOC05LjlzMS4xLTEyLjktMy41LTE3LjRsLTEwNC0xMDR6Il0KICAgIH07CiAgICBmYUFycm93QWx0Q2lyY2xlVXAgPSBmYUNpcmNsZVVwOwogICAgZmFIYW5kU2Npc3NvcnMgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1zY2lzc29ycyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjU3IiwgIk0uMiAyNzYuM2MtMS4yLTM1LjMgMjYuNC02NSA2MS43LTY2LjJsMy4zLS4xLTguMi0xLjhDMjIuNSAyMDAuNSAuNyAxNjYuMyA4LjMgMTMxLjhTNTAuMiA3NS41IDg0LjcgODMuMmwxNzMgMzguM2MyLjMtMi45IDQuNi01LjcgNy4xLTguNWwxOC40LTIwLjNDMjk5LjkgNzQuNSAzMjMuNSA2NCAzNDguMyA2NGwxMC4yIDBjNTQuMSAwIDEwNC4xIDI4LjcgMTMxLjMgNzUuNGwxLjUgMi42YzEzLjYgMjMuMiAyMC43IDQ5LjcgMjAuNyA3Ni42TDUxMiAzNDRjMCA2Ni4zLTUzLjcgMTIwLTEyMCAxMjBsLTEwNCAwYy0zNS4zIDAtNjQtMjguNy02NC02NCAwLTIuOCAuMi01LjYgLjUtOC4zLTE5LjQtMTEtMzIuNS0zMS44LTMyLjUtNTUuNyAwLS44IDAtMS42IDAtMi40TDY2LjQgMzM4Yy0zNS4zIDEuMi02NS0yNi40LTY2LjItNjEuN3ptNjMuNC0xOC4yYy04LjggLjMtMTUuNyA3LjctMTUuNCAxNi42czcuNyAxNS43IDE2LjUgMTUuNGwxNjEuNS01LjZjOS44LS4zIDE4LjcgNS4zIDIyLjcgMTQuMnMyLjIgMTkuMy00LjUgMjYuNGMtMi44IDIuOS00LjQgNi43LTQuNCAxMSAwIDguOCA3LjIgMTYgMTYgMTYgOS4xIDAgMTcuNCA1LjEgMjEuNSAxMy4zczMuMiAxNy45LTIuMyAyNS4xYy0yIDIuNy0zLjIgNi0zLjIgOS42IDAgOC44IDcuMiAxNiAxNiAxNmwxMDQgMGMzOS44IDAgNzItMzIuMiA3Mi03MmwwLTEyNS40YzAtMTguNC00LjktMzYuNS0xNC4yLTUyLjRsLTEuNS0yLjZjLTE4LjYtMzItNTIuOC01MS42LTg5LjgtNTEuNmwtMTAuMiAwYy0xMS4zIDAtMjIgNC44LTI5LjYgMTMuMWwwIDAtMTguNCAyMC4zYy0uNiAuNi0xLjEgMS4zLTEuNyAxLjlsNTcgMTMuMmM4LjYgMiAxNCAxMC42IDEyIDE5LjJzLTEwLjYgMTQtMTkuMiAxMkwyNjIuOCAxNzEuOCA3NC4zIDEzMGMtOC42LTEuOS0xNy4yIDMuNS0xOS4xIDEyLjJzMy41IDE3LjIgMTIuMiAxOS4xbDE4Ny41IDQxLjZjMTAuMiAyLjMgMTcuOCAxMC45IDE4LjcgMjEuNGwuMSAxYy42IDYuNi0xLjUgMTMuMS01LjggMTguMXMtMTAuNiA3LjktMTcuMiA4LjJMNjMuNiAyNTguMXoiXQogICAgfTsKICAgIGZhR2VtID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImdlbSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODE0Ml0sICJmM2E1IiwgIk0xNjguNSA3Mmw4Ny41IDkzIDg3LjUtOTMtMTc1IDB6TTM4My45IDk5LjFsLTcyLjMgNzYuOSAxMjkgMC01Ni42LTc2Ljl6bTUwIDEyNC45TDc4LjEgMjI0IDI1NiA0MjAuMyA0MzMuOSAyMjR6TTcxLjUgMTc2bDEyOSAwLTcyLjMtNzYuOS01Ni42IDc2Ljl6bTQzNC4zIDQwLjFsLTIzMiAyNTZjLTQuNSA1LTExIDcuOS0xNy44IDcuOXMtMTMuMi0yLjktMTcuOC03LjlsLTIzMi0yNTZjLTcuNy04LjUtOC4zLTIxLjItMS41LTMwLjRsMTEyLTE1MmM0LjUtNi4xIDExLjctOS44IDE5LjMtOS44bDI0MCAwYzcuNiAwIDE0LjggMy42IDE5LjMgOS44bDExMiAxNTJjNi44IDkuMiA2LjEgMjEuOS0xLjUgMzAuNHoiXQogICAgfTsKICAgIGZhUmVjdGFuZ2xlWG1hcmsgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAicmVjdGFuZ2xlLXhtYXJrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjIxNjQsICJyZWN0YW5nbGUtdGltZXMiLCAidGltZXMtcmVjdGFuZ2xlIiwgIndpbmRvdy1jbG9zZSJdLCAiZjQxMCIsICJNNjQgMTEyYy04LjggMC0xNiA3LjItMTYgMTZsMCAyNTZjMCA4LjggNy4yIDE2IDE2IDE2bDM4NCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTI1NmMwLTguOC03LjItMTYtMTYtMTZMNjQgMTEyek0wIDEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGwzODQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI1NmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0NDhjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTI4em0zMzQuMSA0OS45YzkuNCA5LjQgOS40IDI0LjYgMCAzMy45bC00NC4xIDQ0LjEgNDQuMSA0NC4xYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTQ0LjEtNDQuMS00NC4xIDQ0LjFjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsNDQuMS00NC4xLTQ0LjEtNDQuMWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDQ0LjEgNDQuMSA0NC4xLTQ0LjFjOS40LTkuNCAyNC42LTkuNCAzMy45IDB6Il0KICAgIH07CiAgICBmYVJlY3RhbmdsZVRpbWVzID0gZmFSZWN0YW5nbGVYbWFyazsKICAgIGZhVGltZXNSZWN0YW5nbGUgPSBmYVJlY3RhbmdsZVhtYXJrOwogICAgZmFXaW5kb3dDbG9zZSA9IGZhUmVjdGFuZ2xlWG1hcms7CiAgICBmYVRyYXNoQ2FuID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInRyYXNoLWNhbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzYxNDYwLCAidHJhc2gtYWx0Il0sICJmMmVkIiwgIk0xNjYuMi0xNmMtMTMuMyAwLTI1LjMgOC4zLTMwIDIwLjhMMTIwIDQ4IDI0IDQ4QzEwLjcgNDggMCA1OC43IDAgNzJTMTAuNyA5NiAyNCA5Nmw0MDAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtOTYgMC0xNi4yLTQzLjJDMzA3LjEtNy43IDI5NS4yLTE2IDI4MS44LTE2TDE2Ni4yLTE2ek0zMiAxNDRsMCAzMDRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjU2IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMDQtNDggMCAwIDMwNGMwIDguOC03LjIgMTYtMTYgMTZMOTYgNDY0Yy04LjggMC0xNi03LjItMTYtMTZsMC0zMDQtNDggMHptMTYwIDcyYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTc2YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xNzZ6bTExMiAwYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTc2YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xNzZ6Il0KICAgIH07CiAgICBmYVRyYXNoQWx0ID0gZmFUcmFzaENhbjsKICAgIGZhTGlmZVJpbmcgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAibGlmZS1yaW5nIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxY2QiLCAiTTM4NS4xIDQxOS4xQzM0OS43IDQ0Ny4yIDMwNC44IDQ2NCAyNTYgNDY0cy05My43LTE2LjgtMTI5LjEtNDQuOWw4MC40LTgwLjRjMTQuMyA4LjQgMzEgMTMuMyA0OC44IDEzLjNzMzQuNS00LjggNDguOC0xMy4zbDgwLjQgODAuNHptNjguMSAuMkM0ODkuOSAzNzQuOSA1MTIgMzE4LjEgNTEyIDI1NlM0ODkuOSAxMzcuMSA0NTMuMiA5Mi43TDQ2NSA4MWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwTDQxOS4zIDU4LjhDMzc0LjkgMjIuMSAzMTguMSAwIDI1NiAwUzEzNy4xIDIyLjEgOTIuNyA1OC44TDgxIDQ3Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMFMzNy43IDcxLjYgNDcgODFMNTguOCA5Mi43QzIyLjEgMTM3LjEgMCAxOTMuOSAwIDI1NlMyMi4xIDM3NC45IDU4LjggNDE5LjNMNDcgNDMxYy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBsMTEuOC0xMS44QzEzNy4xIDQ4OS45IDE5My45IDUxMiAyNTYgNTEyczExOC45LTIyLjEgMTYzLjMtNTguOEw0MzEgNDY1YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtMTEuOC0xMS44em0tMzQuMS0zNC4xbC04MC40LTgwLjRjOC40LTE0LjMgMTMuMy0zMSAxMy4zLTQ4LjhzLTQuOC0zNC41LTEzLjMtNDguOGw4MC40LTgwLjRDNDQ3LjIgMTYyLjMgNDY0IDIwNy4yIDQ2NCAyNTZzLTE2LjggOTMuNy00NC45IDEyOS4xek0zODUuMSA5Mi45bC04MC40IDgwLjRjLTE0LjMtOC40LTMxLTEzLjMtNDguOC0xMy4zcy0zNC41IDQuOC00OC44IDEzLjNMMTI2LjkgOTIuOUMxNjIuMyA2NC44IDIwNy4yIDQ4IDI1NiA0OHM5My43IDE2LjggMTI5LjEgNDQuOXpNMTczLjMgMzA0LjhMOTIuOSAzODUuMUM2NC44IDM0OS43IDQ4IDMwNC44IDQ4IDI1NnMxNi44LTkzLjcgNDQuOS0xMjkuMWw4MC40IDgwLjRjLTguNCAxNC4zLTEzLjMgMzEtMTMuMyA0OC44czQuOCAzNC41IDEzLjMgNDguOHpNMjA4IDI1NmE0OCA0OCAwIDEgMSA5NiAwIDQ4IDQ4IDAgMSAxIC05NiAweiJdCiAgICB9OwogICAgZmFDb3B5cmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY29weXJpZ2h0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTY5XSwgImYxZjkiLCAiTTI1NiA0OGEyMDggMjA4IDAgMSAxIDAgNDE2IDIwOCAyMDggMCAxIDEgMC00MTZ6bTAgNDY0YTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMjA1LjEgMzA2LjljLTI4LjEtMjguMS0yOC4xLTczLjcgMC0xMDEuOHM3My43LTI4LjEgMTAxLjggMGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjljLTQ2LjktNDYuOS0xMjIuOC00Ni45LTE2OS43IDBzLTQ2LjkgMTIyLjggMCAxNjkuNyAxMjIuOCA0Ni45IDE2OS43IDBjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMGMtMjguMSAyOC4xLTczLjcgMjguMS0xMDEuOCAweiJdCiAgICB9OwogICAgZmFDaXJjbGVMZWZ0ID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1sZWZ0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjE4NDAsICJhcnJvdy1hbHQtY2lyY2xlLWxlZnQiXSwgImYzNTkiLCAiTTQ4IDI1NmEyMDggMjA4IDAgMSAxIDQxNiAwIDIwOCAyMDggMCAxIDEgLTQxNiAwem00NjQgMGEyNTYgMjU2IDAgMSAwIC01MTIgMCAyNTYgMjU2IDAgMSAwIDUxMiAwek0xMjQuNyAyNDQuN2MtNi4yIDYuMi02LjIgMTYuNCAwIDIyLjZsMTA0IDEwNGM0LjYgNC42IDExLjUgNS45IDE3LjQgMy41czkuOS04LjMgOS45LTE0LjhsMC03MiAxMDQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTE2YzAtMTMuMy0xMC43LTI0LTI0LTI0bC0xMDQgMCAwLTcyYzAtNi41LTMuOS0xMi4zLTkuOS0xNC44cy0xMi45LTEuMS0xNy40IDMuNWwtMTA0IDEwNHoiXQogICAgfTsKICAgIGZhQXJyb3dBbHRDaXJjbGVMZWZ0ID0gZmFDaXJjbGVMZWZ0OwogICAgZmFDYWxlbmRhciA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjYWxlbmRhciIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyODE5NywgMTI4MTk4XSwgImYxMzMiLCAiTTEyMCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgNDAgMTYwIDAgMC00MGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgNDAgMzIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI4OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDMyIDAgMC00MGMwLTEzLjMgMTAuNy0yNCAyNC0yNHptMCAxMTJsLTU2IDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDQ4IDM1MiAwIDAtNDhjMC04LjgtNy4yLTE2LTE2LTE2bC0yNjQgMHpNNDggMjI0bDAgMTkyYzAgOC44IDcuMiAxNiAxNiAxNmwzMjAgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0xOTItMzUyIDB6Il0KICAgIH07CiAgICBmYUZhY2VGcm93bk9wZW4gPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1mcm93bi1vcGVuIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTUwLCAiZnJvd24tb3BlbiJdLCAiZjU3YSIsICJNNDY0IDI1NmEyMDggMjA4IDAgMSAwIC00MTYgMCAyMDggMjA4IDAgMSAwIDQxNiAwek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwek0xODIuNCAzODIuNWMtMTIuNCA1LjItMjYuNS00LjEtMjEuMS0xNi40IDE2LTM2LjYgNTIuNC02Mi4xIDk0LjgtNjIuMXM3OC44IDI1LjYgOTQuOCA2Mi4xYzUuNCAxMi4zLTguNyAyMS42LTIxLjEgMTYuNC0yMi40LTkuNS00Ny40LTE0LjgtNzMuNy0xNC44cy01MS4zIDUuMy03My43IDE0Ljh6TTE0NCAyMDhhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptMTkyLTMyYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhRnJvd25PcGVuID0gZmFGYWNlRnJvd25PcGVuOwogICAgZmFDaGFydEJhciA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjaGFydC1iYXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiYmFyLWNoYXJ0Il0sICJmMDgwIiwgIk00OCA1NmMwLTEzLjMtMTAuNy0yNC0yNC0yNFMwIDQyLjcgMCA1NkwwIDQwMGMwIDQ0LjIgMzUuOCA4MCA4MCA4MGw0MDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNEw4MCA0MzJjLTE3LjcgMC0zMi0xNC4zLTMyLTMyTDQ4IDU2em0xMDQgNzJsMjA4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRMMTUyIDgwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0em0wIDY0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDE0NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xNDQgMHptMCAxMTJjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMjcyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTI3MiAweiJdCiAgICB9OwogICAgZmFCYXJDaGFydCA9IGZhQ2hhcnRCYXI7CiAgICBmYUhvdXNlID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImhvdXNlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3OTY4LCA2MzQ5OCwgNjM1MDAsICJob21lIiwgImhvbWUtYWx0IiwgImhvbWUtbGctYWx0Il0sICJmMDE1IiwgIk0yNDAgNi4xYzkuMS04LjIgMjIuOS04LjIgMzIgMGwyMzIgMjA4YzkuOSA4LjggMTAuNyAyNCAxLjggMzMuOXMtMjQgMTAuNy0zMy45IDEuOGwtOC03LjIgMCAyMDUuM2MwIDM1LjMtMjguNyA2NC02NCA2NGwtMjg4IDBjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMjA1LjMtOCA3LjJjLTkuOSA4LjgtMjUgOC0zMy45LTEuOHMtOC0yNSAxLjgtMzMuOUwyNDAgNi4xem0xNiA1MC4xTDk2IDE5OS43IDk2IDQ0OGMwIDguOCA3LjIgMTYgMTYgMTZsNDggMCAwLTEwNGMwLTM5LjggMzIuMi03MiA3Mi03Mmw0OCAwYzM5LjggMCA3MiAzMi4yIDcyIDcybDAgMTA0IDQ4IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMjQ4LjMtMTYwLTE0My40ek0yMDggNDY0bDk2IDAgMC0xMDRjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTQ4IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMTA0eiJdCiAgICB9OwogICAgZmFIb21lID0gZmFIb3VzZTsKICAgIGZhSG9tZUFsdCA9IGZhSG91c2U7CiAgICBmYUhvbWVMZ0FsdCA9IGZhSG91c2U7CiAgICBmYUZhY2VGcm93biA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWZyb3duIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTc4NSwgImZyb3duIl0sICJmMTE5IiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDAgLTQxNiAwIDIwOCAyMDggMCAxIDAgNDE2IDB6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6TTMzNC43IDM4NC42QzMxOS43IDM2OSAyOTMuNiAzNTIgMjU2IDM1MnMtNjMuNyAxNy03OC43IDMyLjZjLTkuMiA5LjYtMjQuNCA5LjktMzMuOSAuN3MtOS45LTI0LjQtLjctMzMuOWMyMi4xLTIzIDYwLTQ3LjQgMTEzLjMtNDcuNHM5MS4yIDI0LjQgMTEzLjMgNDcuNGM5LjIgOS42IDguOSAyNC44LS43IDMzLjlzLTI0LjggOC45LTMzLjktLjd6TTE0NCAyMDhhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptMTkyLTMyYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhRnJvd24gPSBmYUZhY2VGcm93bjsKICAgIGZhVXNlciA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJ1c2VyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI4MTAwLCA2MjE0NCwgNjI0NzAsICJ1c2VyLWFsdCIsICJ1c2VyLWxhcmdlIl0sICJmMDA3IiwgIk0xNDQgMTI4YTgwIDgwIDAgMSAxIDE2MCAwIDgwIDgwIDAgMSAxIC0xNjAgMHptMjA4IDBhMTI4IDEyOCAwIDEgMCAtMjU2IDAgMTI4IDEyOCAwIDEgMCAyNTYgMHpNNDggNDgwYzAtNzAuNyA1Ny4zLTEyOCAxMjgtMTI4bDk2IDBjNzAuNyAwIDEyOCA1Ny4zIDEyOCAxMjhsMCA4YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC04YzAtOTcuMi03OC44LTE3Ni0xNzYtMTc2bC05NiAwQzc4LjggMzA0IDAgMzgyLjggMCA0ODBsMCA4YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC04eiJdCiAgICB9OwogICAgZmFVc2VyQWx0ID0gZmFVc2VyOwogICAgZmFVc2VyTGFyZ2UgPSBmYVVzZXI7CiAgICBmYVNub3dmbGFrZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJzbm93Zmxha2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMDA1MiwgMTAwNTRdLCAiZjJkYyIsICJNMjgwLjEtOGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDc4LjEtMjMtMjNjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwcy05LjQgMjQuNiAwIDMzLjlsNTcgNTcgMCA3Ni41LTY2LjItMzguMi0yMC45LTc3LjhjLTMuNC0xMi44LTE2LjYtMjAuNC0yOS40LTE3Uzk1LjIgOTggOTguNyAxMTAuOGw4LjQgMzEuNS02Ny42LTM5QzI4IDk2LjYgMTMuMyAxMDAuNSA2LjcgMTEyUzQgMTM4LjIgMTUuNSAxNDQuOGw2Ny42IDM5LTMxLjUgOC40Yy0xMi44IDMuNC0yMC40IDE2LjYtMTcgMjkuNHMxNi42IDIwLjQgMjkuNCAxN2w3Ny44LTIwLjkgNjYuMiAzOC4yLTY2LjIgMzguMi03Ny44LTIwLjljLTEyLjgtMy40LTI2IDQuMi0yOS40IDE3czQuMiAyNiAxNyAyOS40bDMxLjUgOC40LTY3LjYgMzlDNCAzNzMuOCAuMSAzODguNSA2LjcgNDAwczIxLjMgMTUuNCAzMi44IDguOGw2Ny42LTM5LTguNCAzMS41Yy0zLjQgMTIuOCA0LjIgMjYgMTcgMjkuNHMyNi00LjIgMjkuNC0xN2wyMC45LTc3LjggNjYuMi0zOC4yIDAgNzYuNS01NyA1N2MtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDIzLTIzIDAgNzguMWMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNzguMSAyMyAyM2M5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTU3LTU3IDAtNzYuNSA2Ni4yIDM4LjIgMjAuOSA3Ny44YzMuNCAxMi44IDE2LjYgMjAuNCAyOS40IDE3czIwLjQtMTYuNiAxNy0yOS40bC04LjQtMzEuNSA2Ny42IDM5YzExLjUgNi42IDI2LjIgMi43IDMyLjgtOC44czIuNy0yNi4yLTguOC0zMi44bC02Ny42LTM5IDMxLjUtOC40YzEyLjgtMy40IDIwLjQtMTYuNiAxNy0yOS40cy0xNi42LTIwLjQtMjkuNC0xN2wtNzcuOCAyMC45LTY2LjItMzguMiA2Ni4yLTM4LjIgNzcuOCAyMC45YzEyLjggMy40IDI2LTQuMiAyOS40LTE3cy00LjItMjYtMTctMjkuNGwtMzEuNS04LjQgNjcuNi0zOWMxMS41LTYuNiAxNS40LTIxLjMgOC44LTMyLjhzLTIxLjMtMTUuNC0zMi44LTguOGwtNjcuNiAzOSA4LjQtMzEuNWMzLjQtMTIuOC00LjItMjYtMTctMjkuNHMtMjYgNC4yLTI5LjQgMTdsLTIwLjkgNzcuOC02Ni4yIDM4LjIgMC03Ni41IDU3LTU3YzkuNC05LjQgOS40LTI0LjYgMC0zMy45cy0yNC42LTkuNC0zMy45IDBsLTIzIDIzIDAtNzguMXoiXQogICAgfTsKICAgIGZhQm9va21hcmsgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiYm9va21hcmsiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjgyNzgsIDYxNTkxXSwgImYwMmUiLCAiTTAgNjRDMCAyOC43IDI4LjcgMCA2NCAwTDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgNDE3LjFjMCAyNS42LTI4LjUgNDAuOC00OS44IDI2LjZMMTkyIDQxMi44IDQ5LjggNTA3LjdDMjguNSA1MjEuOSAwIDUwNi42IDAgNDgxLjFMMCA2NHpNNjQgNDhjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDM4Ny4yIDExNy40LTc4LjJjMTYuMS0xMC43IDM3LjEtMTAuNyA1My4yIDBMMzM2IDQ1MS4yIDMzNiA2NGMwLTguOC03LjItMTYtMTYtMTZMNjQgNDh6Il0KICAgIH07CiAgICBmYVNxdWFyZUNhcmV0TGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtY2FyZXQtbGVmdCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJjYXJldC1zcXVhcmUtbGVmdCJdLCAiZjE5MSIsICJNNDggNDE2YzAgOC44IDcuMiAxNiAxNiAxNmwzMjAgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMjBjMC04LjgtNy4yLTE2LTE2LTE2TDY0IDgwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMjB6bTE2IDY0Yy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MHptNjQtMjI0YzAtNi43IDIuOC0xMyA3LjctMTcuNmwxMTItMTA0YzctNi41IDE3LjItOC4yIDI1LjktNC40UzI4OCAxNDIuNSAyODggMTUybDAgMjA4YzAgOS41LTUuNyAxOC4yLTE0LjQgMjJzLTE4LjkgMi4xLTI1LjktNC40bC0xMTItMTA0Yy00LjktNC41LTcuNy0xMC45LTcuNy0xNy42eiJdCiAgICB9OwogICAgZmFDYXJldFNxdWFyZUxlZnQgPSBmYVNxdWFyZUNhcmV0TGVmdDsKICAgIGZhSGFuZHNoYWtlID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImhhbmRzaGFrZSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzEyOTMwOSwgNjI2NjIsICJoYW5kc2hha2UtYWx0IiwgImhhbmRzaGFrZS1zaW1wbGUiXSwgImYyYjUiLCAiTTU5OC4xIDc1LjRjMTAuNy03LjggMTMuMS0yMi44IDUuMy0zMy41cy0yMi44LTEzLjEtMzMuNS01LjNsLTc0LjUgNTQuMi05LjktNi42QzQ2NS44IDcxIDQ0Mi42IDY0IDQxOC45IDY0bC01OS4yIDAtLjQgMC0xNDMuNiAwYy0yNi43IDAtNTIuNSA4LjktNzMuNCAyNS4xTDcwLjEgMzYuNmMtMTAuNy03LjgtMjUuNy01LjQtMzMuNSA1LjNzLTUuNCAyNS43IDUuMyAzMy41bDg4IDY0YzkuNiA2LjkgMjIuNyA1LjkgMzEuMS0yLjRsMy45LTMuOWMxMy41LTEzLjUgMzEuOC0yMS4xIDUwLjktMjEuMWw0Ni4zIDAtOTEuNyA5MS43Yy0xNS42IDE1LjYtMTUuNiA0MC45IDAgNTYuNmwuOCAuOEMyMTggMzA4IDI5NCAzMDggMzQwLjkgMjYxLjFsMjcuMS0yNy4xIDk3LjggOTcuOGMxNS42IDE1LjYgMTUuNiA0MC45IDAgNTYuNmwtOS44IDkuOC0zMS0zMWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWwyOCAyOGMtMTcuNSAxMC40LTM3LjIgMTYuNy01Ny42IDE4LjVMMzEzIDM5OWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWwxNSAxNS0zLjggMGMtMzYuMSAwLTcwLjctMTQuMy05Ni4yLTM5LjhMNjUgMjc5Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45TDE2MC4yIDQ0Mi4xYzM0LjUgMzQuNSA4MS4zIDUzLjkgMTMwLjEgNTMuOWw1MS44IDAgMSAxIDEtMSA1LjcgMGM0OC44IDAgOTUuNi0xOS40IDEzMC4xLTUzLjlsMTkuOS0xOS45YzEuMi0xLjIgMi4zLTIuMyAzLjQtMy41IC43LS41IDEuMy0xLjEgMS45LTEuN0w2MDkgMzEzYzkuNC05LjQgOS40LTI0LjYgMC0zMy45cy0yNC42LTkuNC0zMy45IDBsLTUzLjggNTMuOGMtNC4yLTEyLjgtMTEuMy0yNC45LTIxLjUtMzUuMUwzODUgMTgzYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMGwtNDQuMSA0NC4xYy0yNi41IDI2LjUtNjguNSAyOC05Ni43IDQuNmw5OC43LTk4LjdjMTMuNC0xMy40IDMxLjYtMjEgNTAuNi0yMS4xbDguNSAwIC4yIDAgNTAuOCAwYzE0LjIgMCAyOC4xIDQuMiAzOS45IDEyLjFMNDgyLjcgMTQwYzguNCA1LjYgMTkuMyA1LjMgMjcuNC0uNmw4OC02NHoiXQogICAgfTsKICAgIGZhSGFuZHNoYWtlQWx0ID0gZmFIYW5kc2hha2U7CiAgICBmYUhhbmRzaGFrZVNpbXBsZSA9IGZhSGFuZHNoYWtlOwogICAgZmFGYWNlU21pbGVXaW5rID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2Utc21pbGUtd2luayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODUyMSwgInNtaWxlLXdpbmsiXSwgImY0ZGEiLCAiTTQ2NCAyNTZhMjA4IDIwOCAwIDEgMCAtNDE2IDAgMjA4IDIwOCAwIDEgMCA0MTYgMHpNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMTc3LjMgNjMuNEMxOTIuMyAzMzUgMjE4LjQgMzUyIDI1NiAzNTJzNjMuNy0xNyA3OC43LTMyLjZjOS4yLTkuNiAyNC40LTkuOSAzMy45LS43czkuOSAyNC40IC43IDMzLjljLTIyLjEgMjMtNjAgNDcuNC0xMTMuMyA0Ny40cy05MS4yLTI0LjQtMTEzLjMtNDcuNGMtOS4yLTkuNi04LjktMjQuOCAuNy0zMy45czI0LjgtOC45IDMzLjkgLjd6TTE0NCAyMDhhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptMTY0IDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwYzAtMzMuMSAyNi45LTYwIDYwLTYwbDE2IDBjMzMuMSAwIDYwIDI2LjkgNjAgNjAgMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwLTktMjAtMjAtMjBsLTE2IDBjLTExIDAtMjAgOS0yMCAyMHoiXQogICAgfTsKICAgIGZhU21pbGVXaW5rID0gZmFGYWNlU21pbGVXaW5rOwogICAgZmFGYWNlR3JpblNxdWludFRlYXJzID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi1zcXVpbnQtdGVhcnMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjkzMTUsICJncmluLXNxdWludC10ZWFycyJdLCAiZjU4NiIsICJNNDAzLjEgNDAzLjFjNjcuMi02Ny4yIDc4LjgtMTY4LjkgMzQuOS0yNDhsMzYuNy01LjJjNC41LS42IDguOC0xLjYgMTMuMS0yLjggNDQuNiA5NC45IDI3LjcgMjExLjUtNTAuNyAyOTBzLTE5NS4xIDk1LjMtMjkwIDUwLjdjMS4yLTQuMiAyLjEtOC42IDIuOC0xMy4xbDUuMi0zNi43Yzc5LjEgNDMuOSAxODAuOCAzMi4zIDI0OC0zNC45ek03NSA3NWM3OC40LTc4LjQgMTk1LjEtOTUuMyAyOTAtNTAuNy0xLjIgNC4yLTIuMSA4LjYtMi44IDEzLjFsLTUuMiAzNi43Yy03OS4xLTQzLjktMTgwLjgtMzIuMy0yNDggMzQuOXMtNzguOCAxNjguOS0zNC45IDI0OGwtMzYuNyA1LjJjLTQuNSAuNi04LjggMS42LTEzLjEgMi44LTQ0LjYtOTQuOS0yNy43LTIxMS41IDUwLjctMjkwek0zNzAuOSAyMDYuNWM1LjgtMTAuOSAyMS4xLTEyLjQgMjYuNC0xLjMgMjUuNiA1My41IDE2LjIgMTE5LjYtMjguMiAxNjMuOS00NC4zIDQ0LjMtMTEwLjMgNTMuNy0xNjMuOCAyOC4yLTExLjEtNS4zLTkuNi0yMC42IDEuMy0yNi40IDMyLTE3LjEgNjQuMi00MC44IDkzLjgtNzAuNCAyOS43LTI5LjcgNTMuNC02MS45IDcwLjUtOTR6TTkzLjMgMjgxLjljLTEuNy04IDIuOS0xNS45IDEwLjYtMTguNGw4NC42LTI4YzUuNy0xLjkgMTIuMS0uNCAxNi4zIDMuOXM1LjggMTAuNiAzLjkgMTYuM2wtMjggODQuNmMtMi42IDcuNy0xMC41IDEyLjMtMTguNCAxMC42cy0xMy40LTktMTIuNy0xNy4xbDMuOS00My4xLTQzLjEgMy45Yy04LjEgLjctMTUuNS00LjctMTcuMS0xMi43ek0yOTQuNiAxMTAuNGwtMy45IDQzLjEgNDMuMS0zLjljOC4xLS43IDE1LjUgNC43IDE3LjEgMTIuN3MtMi45IDE1LjktMTAuNiAxOC40bC04NC42IDI4Yy01LjcgMS45LTEyLjEgLjQtMTYuMy0zLjlzLTUuOC0xMC42LTMuOS0xNi4zbDI4LTg0LjZjMi42LTcuNyAxMC41LTEyLjMgMTguNC0xMC42czEzLjQgOSAxMi43IDE3LjF6TTUxMiA1MS40YzAgMjUuNi0xOC44IDQ3LjMtNDQuMSA1MC45TDQyMS4xIDEwOWMtMTAuNiAxLjUtMTkuNi03LjUtMTguMS0xOC4xbDYuNy00Ni43QzQxMy4zIDE4LjggNDM1IDAgNDYwLjYgMCA0ODkgMCA1MTIgMjMgNTEyIDUxLjR6TTQ0LjEgNDA5LjdMOTAuOSA0MDNjMTAuNi0xLjUgMTkuNiA3LjUgMTguMSAxOC4xbC02LjcgNDYuN0M5OC43IDQ5My4yIDc3IDUxMiA1MS40IDUxMiAyMyA1MTIgMCA0ODkgMCA0NjAuNiAwIDQzNSAxOC44IDQxMy4zIDQ0LjEgNDA5Ljd6Il0KICAgIH07CiAgICBmYUdyaW5TcXVpbnRUZWFycyA9IGZhRmFjZUdyaW5TcXVpbnRUZWFyczsKICAgIGZhRmlsZUF1ZGlvID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZpbGUtYXVkaW8iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjFjNyIsICJNNjQgNDhsMTEyIDAgMCA4OGMwIDM5LjggMzIuMiA3MiA3MiA3Mmw4OCAwIDAgMjQwYzAgOC44LTcuMiAxNi0xNiAxNkw2NCA0NjRjLTguOCAwLTE2LTcuMi0xNi0xNkw0OCA2NGMwLTguOCA3LjItMTYgMTYtMTZ6TTIyNCA2Ny45bDkyLjEgOTIuMS02OC4xIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtNjguMXpNNjQgMEMyOC43IDAgMCAyOC43IDAgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjU2IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNjEuNWMwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0wyNDIuNyAxOC43QzIzMC43IDYuNyAyMTQuNSAwIDE5Ny41IDBMNjQgMHpNMjIxLjkgMjY3LjZjLTQuNyAxMC0uMyAyMS45IDkuNyAyNi42IDE5LjIgOC45IDMyLjQgMjguMyAzMi40IDUwLjhzLTEzLjIgNDEuOS0zMi40IDUwLjhjLTEwIDQuNy0xNC40IDE2LjYtOS43IDI2LjZzMTYuNiAxNC40IDI2LjYgOS43QzI4MS4yIDQxNi44IDMwNCAzODMuNiAzMDQgMzQ1cy0yMi44LTcxLjktNTUuNi04Ny4xYy0xMC00LjctMjEuOS0uMy0yNi42IDkuN3pNMTA0IDMwNWMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAzMmMwIDEzLjMgMTAuNyAyNCAyNCAyNGwxNiAwIDI3LjIgMzRjMyAzLjggNy42IDYgMTIuNSA2bC4zIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMTI4YzAtOC44LTcuMi0xNi0xNi0xNmwtLjMgMGMtNC45IDAtOS41IDIuMi0xMi41IDZsLTI3LjIgMzQtMTYgMHpNMjIzLjMgMzczYzkuOS01LjQgMTYuNy0xNiAxNi43LTI4LjFzLTYuNy0yMi43LTE2LjctMjguMWMtNy44LTQuMi0xNS4zIDMuMy0xNS4zIDEyLjFsMCAzMmMwIDguOCA3LjYgMTYuMyAxNS4zIDEyLjF6Il0KICAgIH07CiAgICBmYUNhbGVuZGFyWG1hcmsgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY2FsZW5kYXIteG1hcmsiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiY2FsZW5kYXItdGltZXMiXSwgImYyNzMiLCAiTTEyMCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgNDAgMTYwIDAgMC00MGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgNDAgMzIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI4OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDMyIDAgMC00MGMwLTEzLjMgMTAuNy0yNCAyNC0yNHptMCAxMTJsLTU2IDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDI4OGMwIDguOCA3LjIgMTYgMTYgMTZsMzIwIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMjg4YzAtOC44LTcuMi0xNi0xNi0xNmwtMjY0IDB6bTE3MS45IDkyLjFjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlsLTMzLjkgMzMuOSAzMy45IDMzLjljOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtMzMuOS0zMy45LTMzLjkgMzMuOWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWwzMy45LTMzLjktMzMuOS0zMy45Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBsMzMuOSAzMy45IDMzLjktMzMuOWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHoiXQogICAgfTsKICAgIGZhQ2FsZW5kYXJUaW1lcyA9IGZhQ2FsZW5kYXJYbWFyazsKICAgIGZhQ2lyY2xlRG93biA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtZG93biIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYxNDY2LCAiYXJyb3ctYWx0LWNpcmNsZS1kb3duIl0sICJmMzU4IiwgIk0yNTYgNDY0YTIwOCAyMDggMCAxIDEgMC00MTYgMjA4IDIwOCAwIDEgMSAwIDQxNnpNMjU2IDBhMjU2IDI1NiAwIDEgMCAwIDUxMiAyNTYgMjU2IDAgMSAwIDAtNTEyek0yNDQuNyAzODcuM2M2LjIgNi4yIDE2LjQgNi4yIDIyLjYgMGwxMDQtMTA0YzQuNi00LjYgNS45LTExLjUgMy41LTE3LjRTMzY2LjUgMjU2IDM2MCAyNTZsLTcyIDAgMC0xMDRjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTE2IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMTA0LTcyIDBjLTYuNSAwLTEyLjMgMy45LTE0LjggOS45cy0xLjEgMTIuOSAzLjUgMTcuNGwxMDQgMTA0eiJdCiAgICB9OwogICAgZmFBcnJvd0FsdENpcmNsZURvd24gPSBmYUNpcmNsZURvd247CiAgICBmYUZpbGVMaW5lcyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLWxpbmVzIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4NDQxLCAxMjg0NjIsIDYxNjg2LCAiZmlsZS1hbHQiLCAiZmlsZS10ZXh0Il0sICJmMTVjIiwgIk02NCA0OGwxMTIgMCAwIDg4YzAgMzkuOCAzMi4yIDcyIDcyIDcybDg4IDAgMCAyNDBjMCA4LjgtNy4yIDE2LTE2IDE2TDY0IDQ2NGMtOC44IDAtMTYtNy4yLTE2LTE2TDQ4IDY0YzAtOC44IDcuMi0xNiAxNi0xNnpNMjI0IDY3LjlsOTIuMSA5Mi4xLTY4LjEgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC02OC4xek02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI2MS41YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI0Mi43IDE4LjdDMjMwLjcgNi43IDIxNC41IDAgMTk3LjUgMEw2NCAwem01NiAyNTZjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTQ0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE0NCAwem0wIDk2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDE0NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xNDQgMHoiXQogICAgfTsKICAgIGZhRmlsZUFsdCA9IGZhRmlsZUxpbmVzOwogICAgZmFGaWxlVGV4dCA9IGZhRmlsZUxpbmVzOwogICAgZmFDb21tZW50cyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjb21tZW50cyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyODQ5MCwgNjE2NzBdLCAiZjA4NiIsICJNNzYuMiAyNTguN2M2LjEtMTUuMiA0LTMyLjYtNS42LTQ1LjktMTQuNS0yMC4xLTIyLjYtNDMuNy0yMi42LTY4LjggMC02Ni44IDYwLjUtMTI4IDE0NC0xMjhzMTQ0IDYxLjIgMTQ0IDEyOC02MC41IDEyOC0xNDQgMTI4Yy0xNS45IDAtMzEuMS0yLjMtNDUuMy02LjUtMTAuMy0zLjEtMjEuNC0yLjUtMzEuNCAxLjVsLTUwLjQgMjAuMiAxMS40LTI4LjV6TTAgMTQ0YzAgMzUuOCAxMS42IDY5LjEgMzEuNyA5Ni44TDEuOSAzMTUuMmMtMS4zIDMuMi0xLjkgNi42LTEuOSAxMCAwIDE0LjggMTIgMjYuOCAyNi44IDI2LjggMy40IDAgNi44LS43IDEwLTEuOWw5Ni4zLTM4LjVjMTguNiA1LjUgMzguNCA4LjQgNTguOSA4LjQgMTA2IDAgMTkyLTc4LjggMTkyLTE3NlMyOTgtMzIgMTkyLTMyIDAgNDYuOCAwIDE0NHpNMzg0IDUxMmMyMC42IDAgNDAuMy0zIDU4LjktOC40bDk2LjMgMzguNWMzLjIgMS4zIDYuNiAxLjkgMTAgMS45IDE0LjggMCAyNi44LTEyIDI2LjgtMjYuOCAwLTMuNC0uNy02LjgtMS45LTEwbC0yOS43LTc0LjRjMjAtMjcuOCAzMS43LTYxLjEgMzEuNy05Ni44IDAtODIuNC02MS43LTE1MS41LTE0NS0xNzAuNy0xLjYgMTYuMy01LjEgMzEuOS0xMC4xIDQ2LjkgNjMuOSAxNC44IDEwNy4yIDY3LjMgMTA3LjIgMTIzLjkgMCAyNS4xLTguMSA0OC43LTIyLjYgNjguOC05LjYgMTMuMy0xMS43IDMwLjYtNS42IDQ1LjlsMTEuNCAyOC41LTUwLjQtMjAuMmMtMTAtNC0yMS4xLTQuNS0zMS40LTEuNS0xNC4yIDQuMi0yOS40IDYuNS00NS4zIDYuNS03Mi4yIDAtMTI3LjEtNDUuNy0xNDAuNy0xMDEuMi0xNS42IDMuMi0zMS43IDUtNDguMSA1LjIgMTYuNCA4MS45IDk0LjcgMTQ0IDE4OC44IDE0NHoiXQogICAgfTsKICAgIGZhQ2lyY2xlQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLWNoZWNrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjE1MzMsICJjaGVjay1jaXJjbGUiXSwgImYwNTgiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMSAwLTUxMiAyNTYgMjU2IDAgMSAxIDAgNTEyem0wLTQ2NGEyMDggMjA4IDAgMSAwIDAgNDE2IDIwOCAyMDggMCAxIDAgMC00MTZ6bTcwLjcgMTIxLjljNy44LTEwLjcgMjIuOC0xMy4xIDMzLjUtNS4zIDEwLjcgNy44IDEzLjEgMjIuOCA1LjMgMzMuNUwyNDMuNCAzNjYuMWMtNC4xIDUuNy0xMC41IDkuMy0xNy41IDkuOC03IC41LTEzLjktMi0xOC44LTYuOWwtNTUuOS01NS45Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBsMzYgMzYgMTA1LjYtMTQ1LjJ6Il0KICAgIH07CiAgICBmYUNoZWNrQ2lyY2xlID0gZmFDaXJjbGVDaGVjazsKICAgIGZhTW9vbiA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJtb29uIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3NzY5LCA5MjE0XSwgImYxODYiLCAiTTIzOS4zIDQ4LjdjLTEwNy4xIDguNS0xOTEuMyA5OC4xLTE5MS4zIDIwNy4zIDAgMTE0LjkgOTMuMSAyMDggMjA4IDIwOCAzMy4zIDAgNjQuNy03LjggOTIuNi0yMS43LTEwMy40LTIzLjQtMTgwLjYtMTE1LjgtMTgwLjYtMjI2LjMgMC02NS44IDI3LjQtMTI1LjEgNzEuMy0xNjcuM3pNMCAyNTZjMC0xNDEuNCAxMTQuNi0yNTYgMjU2LTI1NiAxOS40IDAgMzguNCAyLjIgNTYuNyA2LjMgOS45IDIuMiAxNy4zIDEwLjUgMTguNSAyMC41cy00IDE5LjgtMTMuMSAyNC40Yy02MC42IDMwLjItMTAyLjEgOTIuNy0xMDIuMSAxNjQuOCAwIDEwMS42IDgyLjQgMTg0IDE4NCAxODQgNSAwIDkuOS0uMiAxNC44LS42IDEwLjEtLjggMTkuNiA0LjggMjMuOCAxNC4xczIgMjAuMS01LjMgMjcuMUMzODcuMyA0ODQuOCAzMjQuOCA1MTIgMjU2IDUxMiAxMTQuNiA1MTIgMCAzOTcuNCAwIDI1NnoiXQogICAgfTsKICAgIGZhQ2xvc2VkQ2FwdGlvbmluZyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjbG9zZWQtY2FwdGlvbmluZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjBhIiwgIk00NDggMTEyYzguOCAwIDE2IDcuMiAxNiAxNmwwIDI1NmMwIDguOC03LjIgMTYtMTYgMTZMNjQgNDAwYy04LjggMC0xNi03LjItMTYtMTZsMC0yNTZjMC04LjggNy4yLTE2IDE2LTE2bDM4NCAwek02NCA2NEMyOC43IDY0IDAgOTIuNyAwIDEyOEwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwzODQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI1NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCA2NHptODggMTQ0bDMyIDBjNC40IDAgOCAzLjYgOCA4IDAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRjMC0zMC45LTI1LjEtNTYtNTYtNTZsLTMyIDBjLTMwLjkgMC01NiAyNS4xLTU2IDU2bDAgODBjMCAzMC45IDI1LjEgNTYgNTYgNTZsMzIgMGMzMC45IDAgNTYtMjUuMSA1Ni01NiAwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGMwIDQuNC0zLjYgOC04IDhsLTMyIDBjLTQuNCAwLTgtMy42LTgtOGwwLTgwYzAtNC40IDMuNi04IDgtOHptMTY4IDhjMC00LjQgMy42LTggOC04bDMyIDBjNC40IDAgOCAzLjYgOCA4IDAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRjMC0zMC45LTI1LjEtNTYtNTYtNTZsLTMyIDBjLTMwLjkgMC01NiAyNS4xLTU2IDU2bDAgODBjMCAzMC45IDI1LjEgNTYgNTYgNTZsMzIgMGMzMC45IDAgNTYtMjUuMSA1Ni01NiAwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGMwIDQuNC0zLjYgOC04IDhsLTMyIDBjLTQuNCAwLTgtMy42LTgtOGwwLTgweiJdCiAgICB9OwogICAgZmFJbWFnZXMgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiaW1hZ2VzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYzMDIiLCAiTTQ4MCA4MGM4LjggMCAxNiA3LjIgMTYgMTZsMCAyNTZjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMjAgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMjU2YzAtOC44IDcuMi0xNiAxNi0xNmwzMjAgMHpNMTYwIDMyYy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDI1NmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI1NmMwLTM1LjMtMjguNy02NC02NC02NEwxNjAgMzJ6bTgwIDExMmEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem0xNDAuNyAzLjhjLTQuMy03LjMtMTIuMi0xMS44LTIwLjctMTEuOHMtMTYuNCA0LjUtMjAuNyAxMS44bC00Ni41IDc5LTE3LjItMjQuNmMtNC41LTYuNC0xMS44LTEwLjItMTkuNy0xMC4ycy0xNS4yIDMuOC0xOS43IDEwLjJsLTU2IDgwYy01LjEgNy4zLTUuOCAxNi45LTEuNiAyNC44UzE5MS4xIDMyMCAyMDAgMzIwbDI0MCAwYzguNiAwIDE2LjYtNC42IDIwLjgtMTIuMXM0LjItMTYuNy0uMS0yNC4xbC04MC0xMzZ6TTQ4IDE1MmMwLTEzLjMtMTAuNy0yNC0yNC0yNFMwIDEzOC43IDAgMTUyTDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM2MCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0TDY0IDQ2NGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMjk2eiJdCiAgICB9OwogICAgZmFDaXJjbGVSaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtcmlnaHQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MTgzOCwgImFycm93LWFsdC1jaXJjbGUtcmlnaHQiXSwgImYzNWEiLCAiTTQ2NCAyNTZhMjA4IDIwOCAwIDEgMSAtNDE2IDAgMjA4IDIwOCAwIDEgMSA0MTYgMHpNMCAyNTZhMjU2IDI1NiAwIDEgMCA1MTIgMCAyNTYgMjU2IDAgMSAwIC01MTIgMHptMzg3LjMgMTEuM2M2LjItNi4yIDYuMi0xNi40IDAtMjIuNmwtMTA0LTEwNGMtNC42LTQuNi0xMS41LTUuOS0xNy40LTMuNVMyNTYgMTQ1LjUgMjU2IDE1MmwwIDcyLTEwNCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDE2YzAgMTMuMyAxMC43IDI0IDI0IDI0bDEwNCAwIDAgNzJjMCA2LjUgMy45IDEyLjMgOS45IDE0LjhzMTIuOSAxLjEgMTcuNC0zLjVsMTA0LTEwNHoiXQogICAgfTsKICAgIGZhQXJyb3dBbHRDaXJjbGVSaWdodCA9IGZhQ2lyY2xlUmlnaHQ7CiAgICBmYUlkQ2FyZCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJpZC1jYXJkIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbNjIxNDcsICJkcml2ZXJzLWxpY2Vuc2UiXSwgImYyYzIiLCAiTTQ4IDQxNmwwLTI1NiA0ODAgMCAwIDI1NmMwIDguOC03LjIgMTYtMTYgMTZsLTE5MiAwYzAtNDQuMi0zNS44LTgwLTgwLTgwbC02NCAwYy00NC4yIDAtODAgMzUuOC04MCA4MGwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2ek02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDQ0OCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyek0yMDggMzEyYTU2IDU2IDAgMSAwIDAtMTEyIDU2IDU2IDAgMSAwIDAgMTEyek0zNzYgMjA4Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDgwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTgwIDB6bTAgOTZjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsODAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtODAgMHoiXQogICAgfTsKICAgIGZhRHJpdmVyc0xpY2Vuc2UgPSBmYUlkQ2FyZDsKICAgIGZhQ2lyY2xlUGxheSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtcGxheSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYxNDY5LCAicGxheS1jaXJjbGUiXSwgImYxNDQiLCAiTTI1NiA0OGEyMDggMjA4IDAgMSAxIDAgNDE2IDIwOCAyMDggMCAxIDEgMC00MTZ6bTAgNDY0YTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMjEyLjUgMTQ3LjVjLTcuNC00LjUtMTYuNy00LjctMjQuMy0uNVMxNzYgMTU5LjMgMTc2IDE2OGwwIDE3NmMwIDguNyA0LjcgMTYuNyAxMi4zIDIwLjlzMTYuOCA0LjEgMjQuMy0uNWwxNDQtODhjNy4xLTQuNCAxMS41LTEyLjEgMTEuNS0yMC41cy00LjQtMTYuMS0xMS41LTIwLjVsLTE0NC04OHpNMjk4IDI1NmwtNzQgNDUuMiAwLTkwLjQgNzQgNDUuMnoiXQogICAgfTsKICAgIGZhUGxheUNpcmNsZSA9IGZhQ2lyY2xlUGxheTsKICAgIGZhRmFjZUxhdWdoQmVhbSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWxhdWdoLWJlYW0iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MTMsICJsYXVnaC1iZWFtIl0sICJmNTlhIiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDAgLTQxNiAwIDIwOCAyMDggMCAxIDAgNDE2IDB6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTExOC4zIDU4LjJjLTQuMi0xMy43IDcuMS0yNi4yIDIxLjQtMjYuMmwyMzIuNiAwYzE0LjMgMCAyNS42IDEyLjUgMjEuNCAyNi4yLTE4IDU4LjktNzIuOSAxMDEuOC0xMzcuNyAxMDEuOFMxMzYuMyAzNzMuMSAxMTguMyAzMTQuMnpNMTc2IDE4MGMtMTUuNSAwLTI4IDEyLjUtMjggMjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0zNy42IDMwLjQtNjggNjgtNjhzNjggMzAuNCA2OCA2OGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTE1LjUtMTIuNS0yOC0yOC0yOHptMTMyIDI4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMzcuNiAzMC40LTY4IDY4LTY4czY4IDMwLjQgNjggNjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0xNS41LTEyLjUtMjgtMjgtMjhzLTI4IDEyLjUtMjggMjh6Il0KICAgIH07CiAgICBmYUxhdWdoQmVhbSA9IGZhRmFjZUxhdWdoQmVhbTsKICAgIGZhQWRkcmVzc0Jvb2sgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiYWRkcmVzcy1ib29rIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjIxMzgsICJjb250YWN0LWJvb2siXSwgImYyYjkiLCAiTTM4NCA0OGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzODRjMCA4LjgtNy4yIDE2LTE2IDE2TDk2IDQ2NGMtOC44IDAtMTYtNy4yLTE2LTE2TDgwIDY0YzAtOC44IDcuMi0xNiAxNi0xNmwyODggMHpNOTYgMEM2MC43IDAgMzIgMjguNyAzMiA2NGwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyODggMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTM4NGMwLTM1LjMtMjguNy02NC02NC02NEw5NiAwek0yNDAgMjQ4YTU2IDU2IDAgMSAwIDAtMTEyIDU2IDU2IDAgMSAwIDAgMTEyem0tMzIgNDBjLTQ0LjIgMC04MCAzNS44LTgwIDgwIDAgOC44IDcuMiAxNiAxNiAxNmwxOTIgMGM4LjggMCAxNi03LjIgMTYtMTYgMC00NC4yLTM1LjgtODAtODAtODBsLTY0IDB6TTUxMiA4MGMwLTguOC03LjItMTYtMTYtMTZzLTE2IDcuMi0xNiAxNmwwIDY0YzAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZsMC02NHpNNDk2IDE5MmMtOC44IDAtMTYgNy4yLTE2IDE2bDAgNjRjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTY0YzAtOC44LTcuMi0xNi0xNi0xNnptMTYgMTQ0YzAtOC44LTcuMi0xNi0xNi0xNnMtMTYgNy4yLTE2IDE2bDAgNjRjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTY0eiJdCiAgICB9OwogICAgZmFDb250YWN0Qm9vayA9IGZhQWRkcmVzc0Jvb2s7CiAgICBmYUhvdXJnbGFzcyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJob3VyZ2xhc3MiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFs5MjAzLCA2MjAzMiwgImhvdXJnbGFzcy1lbXB0eSJdLCAiZjI1NCIsICJNMjQgMEMxMC43IDAgMCAxMC43IDAgMjRTMTAuNyA0OCAyNCA0OGw4IDAgMCAxOWMwIDQwLjMgMTYgNzkgNDQuNSAxMDcuNWw4MS41IDgxLjUtODEuNSA4MS41QzQ4IDM2NiAzMiA0MDQuNyAzMiA0NDVsMCAxOS04IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMzM2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTggMCAwLTE5YzAtNDAuMy0xNi03OS00NC41LTEwNy41bC04MS41LTgxLjUgODEuNS04MS41QzMzNiAxNDYgMzUyIDEwNy4zIDM1MiA2N2wwLTE5IDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNFMzNzMuMyAwIDM2MCAwTDI0IDB6TTE5MiAyODkuOWw4MS41IDgxLjVDMjkzIDM5MSAzMDQgNDE3LjQgMzA0IDQ0NWwwIDE5LTIyNCAwIDAtMTljMC0yNy42IDExLTU0IDMwLjUtNzMuNUwxOTIgMjg5Ljl6bTAtNjcuOWwtODEuNS04MS41QzkxIDEyMSA4MCA5NC42IDgwIDY3bDAtMTkgMjI0IDAgMCAxOWMwIDI3LjYtMTEgNTQtMzAuNSA3My41TDE5MiAyMjIuMXoiXQogICAgfTsKICAgIGZhSG91cmdsYXNzRW1wdHkgPSBmYUhvdXJnbGFzczsKICAgIGZhSGVhZHBob25lcyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJoZWFkcGhvbmVzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI3OTExLCA2Mjg2MywgImhlYWRwaG9uZXMtYWx0IiwgImhlYWRwaG9uZXMtc2ltcGxlIl0sICJmMDI1IiwgIk00OCAyMjRjMC05Ny4yIDc4LjgtMTc2IDE3Ni0xNzZzMTc2IDc4LjggMTc2IDE3NmwwIDQ0LjhjLTE0LjEtOC4yLTMwLjUtMTIuOC00OC0xMi44bC0xNiAwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDEyOGMwIDI2LjUgMjEuNSA0OCA0OCA0OGwxNiAwYzUzIDAgOTYtNDMgOTYtOTZsMC0xNjBDNDQ4IDEwMC4zIDM0Ny43IDAgMjI0IDBTMCAxMDAuMyAwIDIyNEwwIDM4NGMwIDUzIDQzIDk2IDk2IDk2bDE2IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0xMjhjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTE2IDBjLTE3LjUgMC0zMy45IDQuNy00OCAxMi44TDQ4IDIyNHptMCAxMjhjMC0yNi41IDIxLjUtNDggNDgtNDhsMTYgMCAwIDEyOC0xNiAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTMyem0zNTIgMGwwIDMyYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xNiAwIDAtMTI4IDE2IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDh6Il0KICAgIH07CiAgICBmYUhlYWRwaG9uZXNBbHQgPSBmYUhlYWRwaG9uZXM7CiAgICBmYUhlYWRwaG9uZXNTaW1wbGUgPSBmYUhlYWRwaG9uZXM7CiAgICBmYUZpbGVQb3dlcnBvaW50ID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZpbGUtcG93ZXJwb2ludCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMWM0IiwgIk02NCA0OGwxMTIgMCAwIDg4YzAgMzkuOCAzMi4yIDcyIDcyIDcybDg4IDAgMCAyNDBjMCA4LjgtNy4yIDE2LTE2IDE2TDY0IDQ2NGMtOC44IDAtMTYtNy4yLTE2LTE2TDQ4IDY0YzAtOC44IDcuMi0xNiAxNi0xNnpNMjI0IDY3LjlsOTIuMSA5Mi4xLTY4LjEgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC02OC4xek02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI2MS41YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI0Mi43IDE4LjdDMjMwLjcgNi43IDIxNC41IDAgMTk3LjUgMEw2NCAwem04OCAyNTZjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMTI4YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xNiAyOCAwYzM3LjYgMCA2OC0zMC40IDY4LTY4cy0zMC40LTY4LTY4LTY4bC01MiAwem01MiA4OGwtMjggMCAwLTQwIDI4IDBjMTEgMCAyMCA5IDIwIDIwcy05IDIwLTIwIDIweiJdCiAgICB9OwogICAgZmFXaW5kb3dNYXhpbWl6ZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJ3aW5kb3ctbWF4aW1pemUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg0NzBdLCAiZjJkMCIsICJNNDggMjI0bDAgMTYwYzAgOC44IDcuMiAxNiAxNiAxNmwzODQgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0xNjAtNDE2IDB6TTAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjU2YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjh6Il0KICAgIH07CiAgICBmYUNvbW1lbnREb3RzID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNvbW1lbnQtZG90cyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODE3MiwgNjIwNzUsICJjb21tZW50aW5nIl0sICJmNGFkIiwgIk0wIDI0MGMwIDU0LjQgMTkuMyAxMDQuNiA1MS45IDE0NC45TDMuMSA0NzQuM2MtMiAzLjctMy4xIDcuOS0zLjEgMTIuMiAwIDE0LjEgMTEuNCAyNS41IDI1LjUgMjUuNSA0IDAgNy44LS42IDExLjUtMi4xTDE1My40IDQ2MGMzMS40IDEyLjkgNjYuMSAyMCAxMDIuNiAyMCAxNDEuNCAwIDI1Ni0xMDcuNSAyNTYtMjQwUzM5Ny40IDAgMjU2IDAgMCAxMDcuNSAwIDI0MHpNOTQgNDA3LjljOS4zLTE3LjEgNy40LTM4LjEtNC44LTUzLjItMjYuMS0zMi4zLTQxLjItNzEuOS00MS4yLTExNC43IDAtMTAzLjIgOTAuMi0xOTIgMjA4LTE5MnMyMDggODguOCAyMDggMTkyLTkwLjIgMTkyLTIwOCAxOTJjLTMwLjIgMC01OC43LTUuOS04NC4zLTE2LjQtMTEuOS00LjktMjUuMy00LjgtMzcuMSAuM0w3NiA0NDAuOSA5NCA0MDcuOXpNMTQ0IDI3MmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6bTE0NC0zMmEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem04MCAzMmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6Il0KICAgIH07CiAgICBmYUNvbW1lbnRpbmcgPSBmYUNvbW1lbnREb3RzOwogICAgZmFGYWNlR3JpblRvbmd1ZVdpbmsgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1ncmluLXRvbmd1ZS13aW5rIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTQwLCAiZ3Jpbi10b25ndWUtd2luayJdLCAiZjU4YiIsICJNMzY2LjkgNDMyYy44LTUuMiAxLjEtMTAuNiAxLjEtMTZsMC01My41YzEwLjItMTIuNiAxOC4zLTI2LjkgMjMuOC00Mi41IDQuMS0xMS42LTcuOC0yMS40LTE5LjYtMTcuOC0zNC44IDEwLjYtNzQuMyAxNi42LTExNi4zIDE2LjYtNDEuOSAwLTgxLjQtNi0xMTYuMS0xNi41LTExLjgtMy42LTIzLjcgNi4xLTE5LjYgMTcuOCA1LjUgMTUuNSAxMy42IDI5LjkgMjMuOCA0Mi40bDAgNTMuNWMwIDUuNCAuNCAxMC44IDEuMSAxNi01OC40LTM2LjgtOTcuMS0xMDEuOS05Ny4xLTE3NiAwLTExNC45IDkzLjEtMjA4IDIwOC0yMDhzMjA4IDkzLjEgMjA4IDIwOGMwIDc0LjEtMzguOCAxMzkuMi05Ny4xIDE3NnptLTM4LjggNjkuN0M0MzQuNCA0NzAuNiA1MTIgMzcyLjMgNTEyIDI1NiA1MTIgMTE0LjYgMzk3LjQgMCAyNTYgMFMwIDExNC42IDAgMjU2QzAgMzcyLjMgNzcuNiA0NzAuNiAxODMuOSA1MDEuNyAyMDMuNCA1MTguMSAyMjguNSA1MjggMjU2IDUyOHM1Mi42LTkuOSA3Mi4xLTI2LjN6TTMyMCAzNzguNmwwIDM3LjRjMCAzNS4zLTI4LjcgNjQtNjQgNjRzLTY0LTI4LjctNjQtNjRsMC0zNy40YzAtMTQuNyAxMS45LTI2LjYgMjYuNi0yNi42bDIgMGMxMS4zIDAgMjEuMSA3LjkgMjMuNiAxOC45IDIuOCAxMi42IDIwLjggMTIuNiAyMy42IDAgMi41LTExLjEgMTIuMy0xOC45IDIzLjYtMTguOWwyIDBjMTQuNyAwIDI2LjYgMTEuOSAyNi42IDI2LjZ6TTEzMiAyMzJjMC0xMSA5LTIwIDIwLTIwbDE2IDBjMTEgMCAyMCA5IDIwIDIwczkgMjAgMjAgMjAgMjAtOSAyMC0yMGMwLTMzLjEtMjYuOS02MC02MC02MGwtMTYgMGMtMzMuMSAwLTYwIDI2LjktNjAgNjAgMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjB6bTIyOC40LTI0YTI0IDI0IDAgMSAwIC00OCAwIDI0IDI0IDAgMSAwIDQ4IDB6TTI4OCAyMDhhNDggNDggMCAxIDEgOTYgMCA0OCA0OCAwIDEgMSAtOTYgMHptMTI4IDBhODAgODAgMCAxIDAgLTE2MCAwIDgwIDgwIDAgMSAwIDE2MCAweiJdCiAgICB9OwogICAgZmFHcmluVG9uZ3VlV2luayA9IGZhRmFjZUdyaW5Ub25ndWVXaW5rOwogICAgZmFIb3VyZ2xhc3NIYWxmID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImhvdXJnbGFzcy1oYWxmIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbImhvdXJnbGFzcy0yIl0sICJmMjUyIiwgIk0wIDI0QzAgMTAuNyAxMC43IDAgMjQgMEwzNjAgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtOCAwIDAgMTljMCA0MC4zLTE2IDc5LTQ0LjUgMTA3LjVsLTgxLjUgODEuNSA4MS41IDgxLjVDMzM2IDM2NiAzNTIgNDA0LjcgMzUyIDQ0NWwwIDE5IDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNEwyNCA1MTJjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsOCAwIDAtMTljMC00MC4zIDE2LTc5IDQ0LjUtMTA3LjVsODEuNS04MS41LTgxLjUtODEuNUM0OCAxNDYgMzIgMTA3LjMgMzIgNjdsMC0xOS04IDBDMTAuNyA0OCAwIDM3LjMgMCAyNHpNMTEwLjUgMzcxLjVjLTMuOSAzLjktNy41IDguMS0xMC43IDEyLjVsMTg0LjQgMGMtMy4yLTQuNC02LjgtOC42LTEwLjctMTIuNWwtODEuNS04MS41LTgxLjUgODEuNXpNODAuOCA0MzJjLS41IDQuMy0uOCA4LjYtLjggMTNsMCAxOSAyMjQgMCAwLTE5YzAtNC40LS4zLTguNy0uOC0xM0w4MC44IDQzMnpNMjU0LjEgMTYwbC0xMjQuMSAwIDYyLjEgNjIuMSA2Mi4xLTYyLjF6bTM5LjctNDhDMzAwLjQgOTguMSAzMDQgODIuNyAzMDQgNjdsMC0xOS0yMjQgMCAwIDE5YzAgMTUuNyAzLjYgMzEuMSAxMC4yIDQ1bDIwMy41IDB6Il0KICAgIH07CiAgICBmYUhvdXJnbGFzczIgPSBmYUhvdXJnbGFzc0hhbGY7CiAgICBmYUNyZWRpdENhcmQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY3JlZGl0LWNhcmQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgxNzksIDYyMDgzLCAiY3JlZGl0LWNhcmQtYWx0Il0sICJmMDlkIiwgIk00NDggMTEyYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyLTQxNiAwIDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDM4NCAwem0xNiAxMTJsMCAxNjBjMCA4LjgtNy4yIDE2LTE2IDE2TDY0IDQwMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMTYwIDQxNiAwek02NCA2NEMyOC43IDY0IDAgOTIuNyAwIDEyOEwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwzODQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI1NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCA2NHpNODAgMzQ0YzAgMTMuMyAxMC43IDI0IDI0IDI0bDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTQ4IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0em0xNDQgMGMwIDEzLjMgMTAuNyAyNCAyNCAyNGw2NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC02NCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHoiXQogICAgfTsKICAgIGZhQ3JlZGl0Q2FyZEFsdCA9IGZhQ3JlZGl0Q2FyZDsKICAgIGZhSGFuZFNwb2NrID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImhhbmQtc3BvY2siLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg0MDZdLCAiZjI1OSIsICJNMTM4LjMgODAuOGMtOS4yLTMzLjggMTAuNS02OC44IDQ0LjMtNzguNCAzNC05LjYgNjkuNCAxMC4yIDc5IDQ0LjJMMjkxLjkgMTUzLjcgMzA1LjEgODRjNi42LTM0LjcgNDAuMS01Ny41IDc0LjgtNTAuOSAzMS40IDYgNTMgMzMuOSA1MiA2NC45IDEwLTIuNiAyMC44LTIuOCAzMS41LS4xIDM0LjMgOC42IDU1LjEgNDMuMyA0Ni42IDc3LjZMNDU0LjcgMzk3LjJDNDM3LjggNDY0LjcgMzc3LjIgNTEyIDMwNy42IDUxMmwtMzMuNyAwYy01Ni45IDAtMTEyLjItMTktMTU3LjItNTMuOWwtOTItNzEuNmMtMjcuOS0yMS43LTMyLjktNjEuOS0xMS4yLTg5LjhzNjEuOS0zMi45IDg5LjgtMTEuMmwxNyAxMy4yLTUxLjgtMTMxLjJjLTEzLTMyLjkgMy4yLTcwLjEgMzYtODMgMTEuMS00LjQgMjIuNy01LjQgMzMuNy0zLjd6bTc3LjEtMjEuMmMtMi40LTguNS0xMS4yLTEzLjQtMTkuNy0xMXMtMTMuNCAxMS4yLTExIDE5LjdsNTQuOCAxODIuNGMzLjUgMTIuMy0zLjMgMjUuMi0xNS40IDI5LjNzLTI1LjMtMi0zMC0xMy45TDE0Mi45IDEzOC4xYy0zLjItOC4yLTEyLjUtMTIuMy0yMC44LTlzLTEyLjMgMTIuNS05IDIwLjhsNzMuMyAxODUuNmMxMiAzMC4zLTIzLjcgNTctNDkuNCAzN0w3My44IDMyMy40Yy03LTUuNC0xNy00LjItMjIuNSAyLjhzLTQuMiAxNyAyLjggMjIuNWw5MiA3MS42YzM2LjUgMjguNCA4MS40IDQzLjggMTI3LjcgNDMuOGwzMy43IDBjNDcuNSAwIDg5LTMyLjQgMTAwLjUtNzguNWw1NS40LTIyMS42YzIuMS04LjYtMy4xLTE3LjMtMTEuNi0xOS40cy0xNy4zIDMuMS0xOS40IDExLjZsLTI2IDEwNGMtMi45IDExLjctMTMuNCAxOS45LTI1LjUgMTkuOS0xNi41IDAtMjguOS0xNS0yNS44LTMxLjJMMzgzLjcgOTljMS43LTguNy00LTE3LjEtMTIuNy0xOC43UzM1NCA4NC4zIDM1Mi4zIDkzTDMyMC41IDI2MGMtMi4yIDExLjYtMTIuNCAyMC0yNC4yIDIwLTExIDAtMjAuNy03LjMtMjMuNy0xNy45TDIxNS40IDU5LjZ6Il0KICAgIH07CiAgICBmYUJlbGxTbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJiZWxsLXNsYXNoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4Mjc3LCA2MTk0M10sICJmMWY2IiwgIk00MS0yNC45Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMFMtMi4zLS4zIDcgOS4xbDUyOCA1MjhjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC04Ny44LTg3LjhjMTcuNS0zLjMgMzAuOC0xOC43IDMwLjgtMzcuMSAwLTYuNy0xLjgtMTMuMy01LjEtMTlMNDg1IDMyMS43Yy0xOS0zMi42LTI5LTY5LjYtMjktMTA3LjNsMC0xNC41YzAtODQuNi02Mi42LTE1NC43LTE0NC0xNjYuM2wwLTkuN2MwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDkuN2MtNDIuMiA2LTc5LjQgMjcuOC0xMDUuNCA1OS4xTDQxLTI0Ljl6TTE5Mi44IDEyNi45QzIxNC43IDk4LjQgMjQ5LjIgODAgMjg4IDgwIDM1NC4zIDgwIDQwOCAxMzMuNyA0MDggMjAwbDAgMTQuNWMwIDQ2LjIgMTIuMyA5MS41IDM1LjUgMTMxLjRsMTIuOSAyMi4xLTIyLjYgMC0yNDEuMS0yNDEuMXpNMTMyLjUgMzQ1LjljMTkuNS0zMy40IDMxLjMtNzAuNyAzNC42LTEwOWwtNDYuNy00Ni43Yy0uMiAzLjMtLjMgNi42LS4zIDkuOWwwIDE0LjVjMCAzNy43LTEwIDc0LjctMjkgMTA3LjNMNjkuMSAzNTkuMmMtMy40IDUuOC01LjEgMTIuMy01LjEgMTkgMCAyMC45IDE2LjkgMzcuOCAzNy44IDM3LjhsMjQ0LjQgMC00OC00OC0xNzguNiAwIDEyLjktMjIuMXpNMjIwLjEgNDY0YzkuOSAyOCAzNi42IDQ4IDY3LjkgNDhzNTgtMjAgNjcuOS00OGwtMTM1LjggMHoiXQogICAgfTsKICAgIGZhU3RhciA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJzdGFyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTEwODgsIDYxNDQ2XSwgImYwMDUiLCAiTTI4OC4xLTMyYzkgMCAxNy4zIDUuMSAyMS40IDEzLjFMMzgzIDEyNS4zIDU0Mi45IDE1MC43YzguOSAxLjQgMTYuMyA3LjcgMTkuMSAxNi4zcy41IDE4LTUuOCAyNC40TDQ0MS43IDMwNS45IDQ2NyA0NjUuOGMxLjQgOC45LTIuMyAxNy45LTkuNiAyMy4ycy0xNyA2LjEtMjUgMkwyODguMSA0MTcuNiAxNDMuOCA0OTFjLTggNC4xLTE3LjcgMy4zLTI1LTJzLTExLTE0LjItOS42LTIzLjJMMTM0LjQgMzA1LjkgMjAgMTkxLjRjLTYuNC02LjQtOC42LTE1LjgtNS44LTI0LjRzMTAuMS0xNC45IDE5LjEtMTYuM2wxNTkuOS0yNS40IDczLjYtMTQ0LjJjNC4xLTggMTIuNC0xMy4xIDIxLjQtMTMuMXptMCA3Ni44TDIzMC4zIDE1OGMtMy41IDYuOC0xMCAxMS42LTE3LjYgMTIuOGwtMTI1LjUgMjAgODkuOCA4OS45YzUuNCA1LjQgNy45IDEzLjEgNi43IDIwLjdsLTE5LjggMTI1LjUgMTEzLjMtNTcuNmM2LjgtMy41IDE0LjktMy41IDIxLjggMGwxMTMuMyA1Ny42LTE5LjgtMTI1LjVjLTEuMi03LjYgMS4zLTE1LjMgNi43LTIwLjdsODkuOC04OS45LTEyNS41LTIwYy03LjYtMS4yLTE0LjEtNi0xNy42LTEyLjhMMjg4LjEgNDQuOHoiXQogICAgfTsKICAgIGZhRmxhZyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmbGFnIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI3OTg4LCA2MTcyNV0sICJmMDI0IiwgIk00OCAyNEM0OCAxMC43IDM3LjMgMCAyNCAwUzAgMTAuNyAwIDI0TDAgNDg4YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xMDAgODAuMy0yMC4xYzQxLjEtMTAuMyA4NC42LTUuNSAxMjIuNSAxMy40IDQ0LjIgMjIuMSA5NS41IDI0LjggMTQxLjcgNy40bDM0LjctMTNjMTIuNS00LjcgMjAuOC0xNi42IDIwLjgtMzBsMC0yNzkuN2MwLTIzLTI0LjItMzgtNDQuOC0yNy43bC05LjYgNC44Yy00Ni4zIDIzLjItMTAwLjggMjMuMi0xNDcuMSAwLTM1LjEtMTcuNi03NS40LTIyLTExMy41LTEyLjVMNDggNTIgNDggMjR6bTAgNzcuNWw5Ni42LTI0LjJjMjctNi43IDU1LjUtMy42IDgwLjQgOC44IDU0LjkgMjcuNCAxMTguNyAyOS43IDE3NSA2LjhsMCAyNDEuOC0yNC40IDkuMWMtMzMuNyAxMi42LTcxLjIgMTAuNy0xMDMuNC01LjQtNDguMi0yNC4xLTEwMy4zLTMwLjEtMTU1LjYtMTcuMWwtNjguNiAxNy4yIDAtMjM3eiJdCiAgICB9OwogICAgZmFMZW1vbiA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJsZW1vbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyNzgxOV0sICJmMDk0IiwgIk0zNjggODBjLTMuMiAwLTYuMiAuNC04LjkgMS4zLTE5LjEgNS41LTQ2LjEgMTAuNy03NC4zIDMuMy01Ny40LTE0LjktMTI0LjYgNy40LTE3NC43IDU3LjVTMzcuNyAyNTkuNCA1Mi42IDMxNi44YzcuMyAyOC4yIDIuMiA1NS4yLTMuMyA3NC4zLS44IDIuOC0xLjMgNS44LTEuMyA4LjkgMCAxNy43IDE0LjMgMzIgMzIgMzIgMy4yIDAgNi4yLS40IDguOS0xLjMgMTkuMS01LjUgNDYuMS0xMC43IDc0LjMtMy4zIDU3LjQgMTQuOSAxMjQuNi03LjQgMTc0LjctNTcuNXM3Mi40LTExNy4zIDU3LjUtMTc0LjdjLTcuMy0yOC4yLTIuMi01NS4yIDMuMy03NC4zIC44LTIuOCAxLjMtNS44IDEuMy04LjkgMC0xNy43LTE0LjMtMzItMzItMzJ6bTAtNDhjNDQuMiAwIDgwIDM1LjggODAgODAgMCA3LjctMS4xIDE1LjItMy4xIDIyLjMtNC42IDE1LjgtNy4xIDMyLjktMyA0OC45IDIwLjEgNzcuNi0xMC45IDE2MS41LTcwIDIyMC43cy0xNDMuMSA5MC4yLTIyMC43IDcwYy0xNi00LjEtMzMtMS42LTQ4LjkgMy03LjEgMi0xNC42IDMuMS0yMi4zIDMuMS00NC4yIDAtODAtMzUuOC04MC04MCAwLTcuNyAxLjEtMTUuMiAzLjEtMjIuMyA0LjYtMTUuOCA3LjEtMzIuOSAzLTQ4LjktMjAuMS03Ny42IDEwLjktMTYxLjUgNzAtMjIwLjdTMjE5LjMgMTggMjk2LjggMzguMWMxNiA0LjEgMzMgMS42IDQ4LjktMyA3LjEtMiAxNC42LTMuMSAyMi4zLTMuMXpNMjQ2LjcgMTY3Yy01MiAxNS4yLTk2LjUgNTkuNy0xMTEuNyAxMTEuNy0zLjcgMTIuNy0xNy4xIDIwLTI5LjggMTYuM1M4NS4yIDI3OCA4OSAyNjUuM2MxOS44LTY3LjcgNzYuNi0xMjQuNSAxNDQuMy0xNDQuMyAxMi43LTMuNyAyNi4xIDMuNiAyOS44IDE2LjNzLTMuNiAyNi4xLTE2LjMgMjkuOHoiXQogICAgfTsKICAgIGZhV2luZG93UmVzdG9yZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJ3aW5kb3ctcmVzdG9yZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMmQyIiwgIk01MTIgODBMMjI0IDgwYy04LjggMC0xNiA3LjItMTYgMTZsMCAxNi00OCAwIDAtMTZjMC0zNS4zIDI4LjctNjQgNjQtNjRsMjg4IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAxOTJjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTQ4IDAgMC00OCA0OCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTE5MmMwLTguOC03LjItMTYtMTYtMTZ6TTM2OCAyODhsLTMyMCAwIDAgMTI4YzAgOC44IDcuMiAxNiAxNiAxNmwyODggMGM4LjggMCAxNi03LjIgMTYtMTZsMC0xMjh6TTY0IDE2MGwyODggMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDE5MmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMjI0YzAtMzUuMyAyOC43LTY0IDY0LTY0eiJdCiAgICB9OwogICAgZmFGYWNlR3JpbkhlYXJ0cyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWdyaW4taGVhcnRzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTI1LCAiZ3Jpbi1oZWFydHMiXSwgImY1ODQiLCAiTTQ2NCAyNTZjMCAxMTQuOS05My4xIDIwOC0yMDggMjA4UzQ4IDM3MC45IDQ4IDI1NmMwLTMuNSAuMS03LjEgLjMtMTAuNi0xNC0xMy45LTI5LjctMzMuMS0zOS4zLTU2LjctNS44IDIxLjQtOC45IDQ0LTguOSA2Ny4zIDAgMTQxLjQgMTE0LjYgMjU2IDI1NiAyNTZTNTEyIDM5Ny40IDUxMiAyNTZjMC0yMy4zLTMuMS00NS45LTguOS02Ny4zLTkuNiAyMy43LTI1LjQgNDIuOC0zOS4zIDU2LjcgLjIgMy41IC4zIDcgLjMgMTAuNnpNMzY4IDU4LjljMTEuNy02IDI0LjUtOS42IDM3LjctMTAuNi00Mi4xLTMwLjQtOTMuOC00OC4zLTE0OS43LTQ4LjNTMTQ4LjQgMTcuOSAxMDYuMyA0OC4zYzEzLjIgMSAyNiA0LjYgMzcuNyAxMC42IDEzLjgtNy4xIDI5LjMtMTAuOSA0NS4xLTEwLjlsMi45IDBjOC45IDAgMTcuNiAxLjIgMjUuOCAzLjUgMTIuNC0yLjMgMjUuMi0zLjUgMzguMi0zLjVzMjUuOCAxLjIgMzguMiAzLjVjOC4yLTIuMyAxNi45LTMuNSAyNS44LTMuNWwyLjkgMGMxNS44IDAgMzEuMyAzLjggNDUuMSAxMC45em00LjIgMjQzLjRjLTM0LjggMTAuNi03NC4zIDE2LjYtMTE2LjMgMTYuNi00MS45IDAtODEuNC02LTExNi4xLTE2LjUtMTEuOC0zLjYtMjMuNyA2LjEtMTkuNiAxNy44IDE5LjggNTUuOSA3My4xIDk1LjkgMTM1LjggOTUuOSA2Mi43IDAgMTE2LTQwLjEgMTM1LjgtOTYgNC4xLTExLjYtNy44LTIxLjQtMTkuNi0xNy44ek0zMjIuOSA5NkwzMjAgOTZjLTI2LjUgMC00OCAyMS41LTQ4IDQ4IDAgNTMuNCA2Ni45IDk1LjcgODkgMTA4LjIgNC40IDIuNSA5LjYgMi41IDE0IDAgMjIuMS0xMi41IDg5LTU0LjggODktMTA4LjIgMC0yNi41LTIxLjUtNDgtNDgtNDhsLTIuOSAwYy0xMy41IDAtMjYuNSA1LjQtMzYgMTQuOWwtOS4xIDkuMS05LjEtOS4xYy05LjUtOS41LTIyLjUtMTQuOS0zNi0xNC45em0tMTg4IDE0LjljLTkuNS05LjUtMjIuNS0xNC45LTM2LTE0LjlMOTYgOTZjLTI2LjUgMC00OCAyMS41LTQ4IDQ4IDAgNTMuNCA2Ni45IDk1LjcgODkgMTA4LjIgNC40IDIuNSA5LjYgMi41IDE0IDAgMjIuMS0xMi41IDg5LTU0LjggODktMTA4LjIgMC0yNi41LTIxLjUtNDgtNDgtNDhsLTIuOSAwYy0xMy41IDAtMjYuNSA1LjQtMzYgMTQuOWwtOS4xIDkuMS05LjEtOS4xeiJdCiAgICB9OwogICAgZmFHcmluSGVhcnRzID0gZmFGYWNlR3JpbkhlYXJ0czsKICAgIGZhRmFjZUtpc3NCZWFtID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2Uta2lzcy1iZWFtIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTM3LCAia2lzcy1iZWFtIl0sICJmNTk3IiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDAgLTQxNiAwIDIwOCAyMDggMCAxIDAgNDE2IDB6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTI0MCAxNmwzMiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4IDAgMTIuMy00LjYgMjMuNS0xMi4yIDMyIDcuNiA4LjUgMTIuMiAxOS43IDEyLjIgMzIgMCAyNi41LTIxLjUgNDgtNDggNDhsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsMTYgMGM4LjggMCAxNi03LjIgMTYtMTZzLTcuMi0xNi0xNi0xNmwtMTYgMGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNmwxNiAwYzguOCAwIDE2LTcuMiAxNi0xNnMtNy4yLTE2LTE2LTE2bC0xNiAwYy04LjggMC0xNi03LjItMTYtMTZzNy4yLTE2IDE2LTE2em0tNjQtOTJjLTE1LjUgMC0yOCAxMi41LTI4IDI4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMzcuNiAzMC40LTY4IDY4LTY4czY4IDMwLjQgNjggNjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0xNS41LTEyLjUtMjgtMjgtMjh6bTEzMiAyOGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTM3LjYgMzAuNC02OCA2OC02OHM2OCAzMC40IDY4IDY4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMTUuNS0xMi41LTI4LTI4LTI4cy0yOCAxMi41LTI4IDI4eiJdCiAgICB9OwogICAgZmFLaXNzQmVhbSA9IGZhRmFjZUtpc3NCZWFtOwogICAgZmFGaWxlUGRmID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZpbGUtcGRmIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYxYzEiLCAiTTIwOCA0OEw5NiA0OGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzg0YzAgOC44IDcuMiAxNiAxNiAxNmw4MCAwIDAgNDgtODAgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMzIgNjRDMzIgMjguNyA2MC43IDAgOTYgMEwyMjkuNSAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDM5Ny4zIDE0MS4zYzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNsMCAxNDkuNS00OCAwIDAtMTI4LTg4IDBjLTM5LjggMC03Mi0zMi4yLTcyLTcybDAtODh6TTM0OC4xIDE2MEwyNTYgNjcuOSAyNTYgMTM2YzAgMTMuMyAxMC43IDI0IDI0IDI0bDY4LjEgMHpNMjQwIDM4MGwzMiAwYzMzLjEgMCA2MCAyNi45IDYwIDYwcy0yNi45IDYwLTYwIDYwbC0xMiAwIDAgMjhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtMTI4YzAtMTEgOS0yMCAyMC0yMHptMzIgODBjMTEgMCAyMC05IDIwLTIwcy05LTIwLTIwLTIwbC0xMiAwIDAgNDAgMTIgMHptOTYtODBsMzIgMGMyOC43IDAgNTIgMjMuMyA1MiA1MmwwIDY0YzAgMjguNy0yMy4zIDUyLTUyIDUybC0zMiAwYy0xMSAwLTIwLTktMjAtMjBsMC0xMjhjMC0xMSA5LTIwIDIwLTIwem0zMiAxMjhjNi42IDAgMTItNS40IDEyLTEybDAtNjRjMC02LjYtNS40LTEyLTEyLTEybC0xMiAwIDAgODggMTIgMHptNzYtMTA4YzAtMTEgOS0yMCAyMC0yMGw0OCAwYzExIDAgMjAgOSAyMCAyMHMtOSAyMC0yMCAyMGwtMjggMCAwIDI0IDI4IDBjMTEgMCAyMCA5IDIwIDIwcy05IDIwLTIwIDIwbC0yOCAwIDAgNDRjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtMTI4eiJdCiAgICB9OwogICAgZmFGYWNlR3JpbldpZGUgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1ncmluLXdpZGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MTUsICJncmluLWFsdCJdLCAiZjU4MSIsICJNNDY0IDI1NmEyMDggMjA4IDAgMSAwIC00MTYgMCAyMDggMjA4IDAgMSAwIDQxNiAwek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0zNzIuMiA0Ni4zYzExLjgtMy42IDIzLjcgNi4xIDE5LjYgMTcuOC0xOS44IDU1LjktNzMuMSA5Ni0xMzUuOCA5Ni02Mi43IDAtMTE2LTQwLTEzNS44LTk1LjktNC4xLTExLjYgNy44LTIxLjQgMTkuNi0xNy44IDM0LjcgMTAuNiA3NC4yIDE2LjUgMTE2LjEgMTYuNSA0MiAwIDgxLjUtNiAxMTYuMy0xNi42ek0yMjQgMTkyYzAgMzUuMy0xNC4zIDY0LTMyIDY0cy0zMi0yOC43LTMyLTY0IDE0LjMtNjQgMzItNjQgMzIgMjguNyAzMiA2NHptOTYgNjRjLTE3LjcgMC0zMi0yOC43LTMyLTY0czE0LjMtNjQgMzItNjQgMzIgMjguNyAzMiA2NC0xNC4zIDY0LTMyIDY0eiJdCiAgICB9OwogICAgZmFHcmluQWx0ID0gZmFGYWNlR3JpbldpZGU7CiAgICBmYUZhY2VMYXVnaFNxdWludCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWxhdWdoLXNxdWludCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJsYXVnaC1zcXVpbnQiXSwgImY1OWIiLCAiTTQ2NCAyNTZhMjA4IDIwOCAwIDEgMCAtNDE2IDAgMjA4IDIwOCAwIDEgMCA0MTYgMHpNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMTI1LjIgNzYuNGMtNi41LTE0IDUtMjguNCAyMC40LTI4LjRsMjIwLjggMGMxNS40IDAgMjYuOCAxNC40IDIwLjQgMjguNC0yMi44IDQ5LjQtNzIuOCA4My42LTEzMC44IDgzLjZzLTEwNy45LTM0LjItMTMwLjgtODMuNnptLTIuNi0xNzMuMmM0LjUtNi44IDEzLjMtOS4yIDIwLjYtNS41bDc5LjYgNDBjNS40IDIuNyA4LjggOC4yIDguOCAxNC4zcy0zLjQgMTEuNi04LjggMTQuM2wtNzkuNiA0MGMtNy4zIDMuNi0xNi4xIDEuMy0yMC42LTUuNXMtMy4xLTE1LjkgMy4xLTIxLjFMMTU5IDIwOCAxMjUuOCAxODAuM2MtNi4yLTUuMi03LjYtMTQuMy0zLjEtMjEuMXptMjYzLjYgMjEuMUwzNTMgMjA4IDM4Ni4yIDIzNS43YzYuMiA1LjIgNy42IDE0LjMgMy4xIDIxLjFzLTEzLjMgOS4yLTIwLjYgNS41bC03OS42LTQwYy01LjQtMi43LTguOC04LjItOC44LTE0LjNzMy40LTExLjYgOC44LTE0LjNsNzkuNi00MGM3LjMtMy42IDE2LjEtMS4zIDIwLjYgNS41czMuMSAxNS45LTMuMSAyMS4xeiJdCiAgICB9OwogICAgZmFMYXVnaFNxdWludCA9IGZhRmFjZUxhdWdoU3F1aW50OwogICAgZmFGYWNlS2lzc1dpbmtIZWFydCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWtpc3Mtd2luay1oZWFydCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzEyODUzNiwgImtpc3Mtd2luay1oZWFydCJdLCAiZjU5OCIsICJNMzg2IDQzOS41Yy0yOS4yIDE1LjYtNjIuNSAyNC41LTk4IDI0LjUtMTE0LjkgMC0yMDgtOTMuMS0yMDgtMjA4UzE3My4yIDQ4IDI4OCA0OGMxMTMuMiAwIDIwNS4yIDkwLjQgMjA3LjkgMjAyLjkgMTQuMyAxLjUgMjguNiA2IDQxLjkgMTMuNyAyIDEuMiA0IDIuNCA1LjkgMy43IC4yLTQuMSAuMy04LjIgLjMtMTIuMyAwLTE0MS40LTExNC42LTI1Ni0yNTYtMjU2UzMyIDExNC42IDMyIDI1NiAxNDYuNiA1MTIgMjg4IDUxMmM0MS40IDAgODAuNS05LjggMTE1LjEtMjcuMy01LjgtMTIuOS0xMi0yOC41LTE3LjItNDUuMnpNMjU2IDI4OGMwIDguOCA3LjIgMTYgMTYgMTZsMTYgMGM4LjggMCAxNiA3LjIgMTYgMTZzLTcuMiAxNi0xNiAxNmwtMTYgMGMtOC44IDAtMTYgNy4yLTE2IDE2czcuMiAxNiAxNiAxNmwxNiAwYzguOCAwIDE2IDcuMiAxNiAxNnMtNy4yIDE2LTE2IDE2bC0xNiAwYy04LjggMC0xNiA3LjItMTYgMTZzNy4yIDE2IDE2IDE2bDMyIDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDggMC0xMi4zLTQuNi0yMy41LTEyLjItMzIgNy42LTguNSAxMi4yLTE5LjcgMTIuMi0zMiAwLTI2LjUtMjEuNS00OC00OC00OGwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2em0tNDgtNDhhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0em0xNTItNDRsMTYgMGMxMSAwIDIwIDkgMjAgMjBzOSAyMCAyMCAyMCAyMC05IDIwLTIwYzAtMzMuMS0yNi45LTYwLTYwLTYwbC0xNiAwYy0zMy4xIDAtNjAgMjYuOS02MCA2MCAwIDExIDkgMjAgMjAgMjBzMjAtOSAyMC0yMCA5LTIwIDIwLTIwek01NDIuOCAzNTBjLTIuMi0xOC4zLTEyLjktMzQuNi0yOC45LTQzLjgtMjguMS0xNi4yLTYzLjktNi42LTgwLjEgMjEuNWwtMi43IDQuNmMtMjQuNSA0Mi41IDcuOSAxMTcuOSAyNC40IDE1MC44IDUuMSAxMC4xIDE1LjUgMTYuMSAyNi44IDE1LjUgMzYuNy0yLjIgMTE4LjItMTEuNyAxNDIuOC01NC4ybDIuNy00LjZjMTYuMi0yOC4xIDYuNi02My45LTIxLjUtODAuMS0xNi05LjItMzUuNC0xMC40LTUyLjQtMy4xbC05LjggNC4yLTEuMy0xMC42eiJdCiAgICB9OwogICAgZmFLaXNzV2lua0hlYXJ0ID0gZmFGYWNlS2lzc1dpbmtIZWFydDsKICAgIGZhQ29weSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjb3B5IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYwYzUiLCAiTTM4NCAzMzZsLTE5MiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0yNTZjMC04LjggNy4yLTE2IDE2LTE2bDEzMy41IDBjNC4yIDAgOC4zIDEuNyAxMS4zIDQuN2w1OC41IDU4LjVjMyAzIDQuNyA3LjEgNC43IDExLjNMNDAwIDMyMGMwIDguOC03LjIgMTYtMTYgMTZ6TTE5MiAzODRsMTkyIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xOTcuNWMwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0wzNzAuNyAxOC43QzM1OC43IDYuNyAzNDIuNSAwIDMyNS41IDBMMTkyIDBjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgMjU2YzAgMzUuMyAyOC43IDY0IDY0IDY0ek02NCAxMjhjLTM1LjMgMC02NCAyOC43LTY0IDY0TDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE5MiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTYtNDggMCAwIDE2YzAgOC44LTcuMiAxNi0xNiAxNkw2NCA0NjRjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTI1NmMwLTguOCA3LjItMTYgMTYtMTZsMTYgMCAwLTQ4LTE2IDB6Il0KICAgIH07CiAgICBmYUNoZXNzS2luZyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjaGVzcy1raW5nIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbOTgxOF0sICJmNDNmIiwgIk0yMjQtMzJjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA0MCA0OCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC00OCAwIDAgODAgMTYxLjggMGMyMS4xIDAgMzguMiAxNy4xIDM4LjIgMzguMiAwIDYuNC0xLjYgMTIuNy00LjcgMTguM0wzNTcuMiAzNzQuNSA0MDUuNiA0MzVjNi43IDguNCAxMC40IDE4LjggMTAuNCAyOS42IDAgMjYuMi0yMS4yIDQ3LjQtNDcuNCA0Ny40TDc5LjQgNTEyYy0yNi4yIDAtNDcuNC0yMS4yLTQ3LjQtNDcuNCAwLTEwLjggMy43LTIxLjIgMTAuNC0yOS42TDkwLjggMzc0LjUgNC43IDIxNi42QzEuNiAyMTAuOSAwIDIwNC42IDAgMTk4LjIgMCAxNzcuMSAxNy4xIDE2MCAzOC4yIDE2MGwxNjEuOCAwIDAtODAtNDggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGw0OCAwIDAtNDBjMC0xMy4zIDEwLjctMjQgMjQtMjR6TTEzMS44IDQwMGwtMy42IDQuNC00Ny42IDU5LjYgMjg2LjYgMC00Ny42LTU5LjYtMy42LTQuNC0xODQuMyAwem0xLjEtNDguNWwuMyAuNSAxODEuNiAwIC4zLS41IDc4LjMtMTQzLjUtMzM4LjcgMCA3OC4zIDE0My41eiJdCiAgICB9OwogICAgZmFTcXVhcmVQbHVzID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1wbHVzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbNjE4NDYsICJwbHVzLXNxdWFyZSJdLCAiZjBmZSIsICJNNjQgODBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyMGMwIDguOCA3LjIgMTYgMTYgMTZsMzIwIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzIwYzAtOC44LTcuMi0xNi0xNi0xNkw2NCA4MHpNMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZ6TTIwMCAzNDRsMC02NC02NCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDY0IDAgMC02NGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgNjQgNjQgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNjQgMCAwIDY0YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0eiJdCiAgICB9OwogICAgZmFQbHVzU3F1YXJlID0gZmFTcXVhcmVQbHVzOwogICAgZmFGaWxlQ29kZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLWNvZGUiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjFjOSIsICJNNjQgNDhsMTEyIDAgMCA4OGMwIDM5LjggMzIuMiA3MiA3MiA3Mmw4OCAwIDAgMjQwYzAgOC44LTcuMiAxNi0xNiAxNkw2NCA0NjRjLTguOCAwLTE2LTcuMi0xNi0xNkw0OCA2NGMwLTguOCA3LjItMTYgMTYtMTZ6TTIyNCA2Ny45bDkyLjEgOTIuMS02OC4xIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtNjguMXpNNjQgMEMyOC43IDAgMCAyOC43IDAgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjU2IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNjEuNWMwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0wyNDIuNyAxOC43QzIzMC43IDYuNyAyMTQuNSAwIDE5Ny41IDBMNjQgMHpNMTcwLjIgMjk1LjZjOC42LTEwLjEgNy41LTI1LjItMi42LTMzLjhzLTI1LjItNy41LTMzLjggMi42bC00OCA1NmMtNy43IDktNy43IDIyLjIgMCAzMS4ybDQ4IDU2YzguNiAxMC4xIDIzLjggMTEuMiAzMy44IDIuNnMxMS4yLTIzLjggMi42LTMzLjhsLTM0LjYtNDAuNCAzNC42LTQwLjR6bTgwLTMxLjJjLTguNi0xMC4xLTIzLjgtMTEuMi0zMy44LTIuNnMtMTEuMiAyMy44LTIuNiAzMy44bDM0LjYgNDAuNC0zNC42IDQwLjRjLTguNiAxMC4xLTcuNSAyNS4yIDIuNiAzMy44czI1LjIgNy41IDMzLjgtMi42bDQ4LTU2YzcuNy05IDcuNy0yMi4yIDAtMzEuMmwtNDgtNTZ6Il0KICAgIH07CiAgICBmYUZhY2VHcmluV2luayA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWdyaW4td2luayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJncmluLXdpbmsiXSwgImY1OGMiLCAiTTQ2NCAyNTZhMjA4IDIwOCAwIDEgMCAtNDE2IDAgMjA4IDIwOCAwIDEgMCA0MTYgMHpNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMzcyLjIgNDYuM2MxMS44LTMuNiAyMy43IDYuMSAxOS42IDE3LjgtMTkuOCA1NS45LTczLjEgOTYtMTM1LjggOTYtNjIuNyAwLTExNi00MC0xMzUuOC05NS45LTQuMS0xMS42IDcuOC0yMS40IDE5LjYtMTcuOCAzNC43IDEwLjYgNzQuMiAxNi41IDExNi4xIDE2LjUgNDIgMCA4MS41LTYgMTE2LjMtMTYuNnpNMTQ0IDIwOGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0xNjQgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBjMC0zMy4xIDI2LjktNjAgNjAtNjBsMTYgMGMzMy4xIDAgNjAgMjYuOSA2MCA2MCAwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjAtOS0yMC0yMC0yMGwtMTYgMGMtMTEgMC0yMCA5LTIwIDIweiJdCiAgICB9OwogICAgZmFHcmluV2luayA9IGZhRmFjZUdyaW5XaW5rOwogICAgZmFNb25leUJpbGwxID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogIm1vbmV5LWJpbGwtMSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJtb25leS1iaWxsLWFsdCJdLCAiZjNkMSIsICJNMTEyIDExMmMwIDM1LjMtMjguNyA2NC02NCA2NGwwIDE2MGMzNS4zIDAgNjQgMjguNyA2NCA2NGwyODggMGMwLTM1LjMgMjguNy02NCA2NC02NGwwLTE2MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsLTI4OCAwek0wIDEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGwzODQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI1NmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0NDhjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTI4em0yNTYgMTZhMTEyIDExMiAwIDEgMSAwIDIyNCAxMTIgMTEyIDAgMSAxIDAtMjI0em0tMTYgNDRjLTExIDAtMjAgOS0yMCAyMCAwIDkuNyA2LjkgMTcuNyAxNiAxOS42bDAgNDguNC00IDBjLTExIDAtMjAgOS0yMCAyMHM5IDIwIDIwIDIwbDQ4IDBjMTEgMCAyMC05IDIwLTIwcy05LTIwLTIwLTIwbC00IDAgMC02OGMwLTExLTktMjAtMjAtMjBsLTE2IDB6Il0KICAgIH07CiAgICBmYU1vbmV5QmlsbEFsdCA9IGZhTW9uZXlCaWxsMTsKICAgIGZhRXllU2xhc2ggPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZXllLXNsYXNoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYwNzAiLCAiTTQxLTI0LjljLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwUy0yLjMtLjMgNyA5LjFsNTI4IDUyOGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTk2LjQtOTYuNGMyLjctMi40IDUuNC00LjggOC03LjIgNDYuOC00My41IDc4LjEtOTUuNCA5My0xMzEuMSAzLjMtNy45IDMuMy0xNi43IDAtMjQuNi0xNC45LTM1LjctNDYuMi04Ny43LTkzLTEzMS4xLTQ3LjEtNDMuNy0xMTEuOC04MC42LTE5Mi42LTgwLjYtNTYuOCAwLTEwNS42IDE4LjItMTQ2IDQ0LjJMNDEtMjQuOXpNMTc2LjkgMTExLjFjMzIuMS0xOC45IDY5LjItMzEuMSAxMTEuMS0zMS4xIDY1LjIgMCAxMTguOCAyOS42IDE1OS45IDY3LjcgMzguNSAzNS43IDY1LjEgNzguMyA3OC42IDEwOC4zLTEzLjYgMzAtNDAuMiA3Mi41LTc4LjYgMTA4LjMtMy4xIDIuOC02LjIgNS42LTkuNCA4LjRMMzkzLjggMzI4YzE0LTIwLjUgMjIuMi00NS4zIDIyLjItNzIgMC03MC43LTU3LjMtMTI4LTEyOC0xMjgtMjYuNyAwLTUxLjUgOC4yLTcyIDIyLjJsLTM5LjEtMzkuMXptMTgyIDE4MmwtMTA4LTEwOGMxMS4xLTUuOCAyMy43LTkuMSAzNy4xLTkuMSA0NC4yIDAgODAgMzUuOCA4MCA4MCAwIDEzLjQtMy4zIDI2LTkuMSAzNy4xek0xMDMuNCAxNzMuMmwtMzQtMzRjLTMyLjYgMzYuOC01NSA3NS44LTY2LjkgMTA0LjUtMy4zIDcuOS0zLjMgMTYuNyAwIDI0LjYgMTQuOSAzNS43IDQ2LjIgODcuNyA5MyAxMzEuMSA0Ny4xIDQzLjcgMTExLjggODAuNiAxOTIuNiA4MC42IDM3LjMgMCA3MS4yLTcuOSAxMDEuNS0yMC42TDM1Mi4yIDQyMmMtMjAgNi40LTQxLjQgMTAtNjQuMiAxMC02NS4yIDAtMTE4LjgtMjkuNi0xNTkuOS02Ny43LTM4LjUtMzUuNy02NS4xLTc4LjMtNzguNi0xMDguMyAxMC40LTIzLjEgMjguNi01My42IDU0LTgyLjh6Il0KICAgIH07CiAgICBmYUZpbGVXb3JkID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZpbGUtd29yZCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMWMyIiwgIk02NCA0OGwxMTIgMCAwIDg4YzAgMzkuOCAzMi4yIDcyIDcyIDcybDg4IDAgMCAyNDBjMCA4LjgtNy4yIDE2LTE2IDE2TDY0IDQ2NGMtOC44IDAtMTYtNy4yLTE2LTE2TDQ4IDY0YzAtOC44IDcuMi0xNiAxNi0xNnpNMjI0IDY3LjlsOTIuMSA5Mi4xLTY4LjEgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC02OC4xek02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI2MS41YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI0Mi43IDE4LjdDMjMwLjcgNi43IDIxNC41IDAgMTk3LjUgMEw2NCAwem03MS4zIDI3NC4yYy0zLjItMTIuOS0xNi4yLTIwLjctMjkuMS0xNy41Uzg1LjUgMjczIDg4LjcgMjg1LjhsMzIgMTI4YzIuNSAxMC4yIDExLjQgMTcuNSAyMS45IDE4LjFzMjAuMS01LjcgMjMuOC0xNS41bDI1LjUtNjguMSAyNS41IDY4LjFjMy43IDkuOCAxMy4zIDE2LjEgMjMuOCAxNS41czE5LjQtNy45IDIxLjktMTguMWwzMi0xMjhjMy4yLTEyLjktNC42LTI1LjktMTcuNS0yOS4xcy0yNS45IDQuNi0yOS4xIDE3LjVsLTEzLjMgNTMuMi0yMC45LTU1LjhDMjExIDI2Mi4yIDIwMiAyNTYgMTkyIDI1NnMtMTkgNi4yLTIyLjUgMTUuNmwtMjAuOSA1NS44LTEzLjMtNTMuMnoiXQogICAgfTsKICAgIGZhRmFjZUFuZ3J5ID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2UtYW5ncnkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1NDQsICJhbmdyeSJdLCAiZjU1NiIsICJNMjU2IDQ4YTIwOCAyMDggMCAxIDEgMCA0MTYgMjA4IDIwOCAwIDEgMSAwLTQxNnptMCA0NjRhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyem0wLTE0NGMyNC4xIDAgNDUuNCAxMS44IDU4LjUgMzAgNy43IDEwLjggMjIuNyAxMy4yIDMzLjUgNS41czEzLjItMjIuNyA1LjUtMzMuNWMtMjEuNy0zMC4yLTU3LjMtNTAtOTcuNS01MHMtNzUuNyAxOS44LTk3LjUgNTBjLTcuNyAxMC44LTUuMyAyNS44IDUuNSAzMy41czI1LjggNS4zIDMzLjUtNS41YzEzLjEtMTguMiAzNC40LTMwIDU4LjUtMzB6bS04MC05NmMxNy43IDAgMzItMTQuMyAzMi0zMmwwLS4zIDkuNyAzLjJjMTAuNSAzLjUgMjEuOC0yLjIgMjUuMy0xMi42cy0yLjItMjEuOC0xMi42LTI1LjNsLTk2LTMyYy0xMC41LTMuNS0yMS44IDIuMi0yNS4zIDEyLjZzMi4yIDIxLjggMTIuNiAyNS4zbDI4LjkgOS42Yy00LjEgNS40LTYuNiAxMi4xLTYuNiAxOS40IDAgMTcuNyAxNC4zIDMyIDMyIDMyem0xOTItMzJjMC03LjMtMi40LTE0LTYuNi0xOS40bDI4LjktOS42YzEwLjUtMy41IDE2LjEtMTQuOCAxMi42LTI1LjNzLTE0LjgtMTYuMS0yNS4zLTEyLjZsLTk2IDMyYy0xMC41IDMuNS0xNi4xIDE0LjgtMTIuNiAyNS4zczE0LjggMTYuMSAyNS4zIDEyLjZsOS43LTMuMiAwIC4zYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJ6Il0KICAgIH07CiAgICBmYUFuZ3J5ID0gZmFGYWNlQW5ncnk7CiAgICBmYUNoZXNzS25pZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNoZXNzLWtuaWdodCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzk4MjJdLCAiZjQ0MSIsICJNMjMyLTMyYzExMC41IDAgMjAwIDg5LjUgMjAwIDIwMGwwIDEyNy43YzAgMTguOS02LjEgMzcuMS0xNy4yIDUyLjJsLTUuMSA2LjItMzYuMyA0MC43IDMyLjEgNDAuMmM2LjcgOC40IDEwLjQgMTguOCAxMC40IDI5LjZsLS4yIDQuOGMtMi40IDIzLjktMjIuNiA0Mi41LTQ3LjEgNDIuNWwtMjg5LjIgMC00LjgtLjJjLTIzLjktMi40LTQyLjUtMjIuNi00Mi41LTQ3LjEgMC0xMC44IDMuNy0yMS4yIDEwLjQtMjkuNmwzNy42LTQ3IDAtMjQuM2MwLTI0LjMgMTAuMS00Ny42IDI3LjgtNjQuMmw2My41LTU5LjUtMTcuNCAwLS4yIC4yYy0yMC4zIDIwLjMtNDkuNiAyOC4yLTc3LjEgMjEuMWwtNS41LTEuNmMtMzAuOS0xMC4zLTUyLjMtMzgtNTQuOS03MC4xbC0uMi02LjQgMC0xLjRjMC0xOS43IDcuMS0zOC44IDE5LjktNTMuOGw3Ni4xLTg4LjggMC00Ny4xIC4xLTIuNUMxMTMuNC0yMi42IDEyMy42LTMyIDEzNi0zMmw5NiAwek04MC43IDQ2NGwyODYuNiAwLTM4LjQtNDgtMjA5LjkgMC0zOC40IDQ4ek0xNjAgNDhjMCA1LjctMi4xIDExLjMtNS44IDE1LjZMNzIuMyAxNTkuMUM2NyAxNjUuNCA2NCAxNzMuNCA2NCAxODEuN2wwIDEuNCAuNCA1LjJjMS45IDExLjkgMTAuMyAyMS45IDIxLjkgMjUuOGw0LjUgMS4xYzEwLjUgMS45IDIxLjMtMS40IDI5LTlsNy4yLTcuMiAzLjctM2MzLjktMi42IDguNS00IDEzLjMtNGw4OCAwYzkuOCAwIDE4LjcgNiAyMi4zIDE1LjJzMS4zIDE5LjYtNS45IDI2LjNsLTEwNy44IDEwMWMtOC4xIDcuNi0xMi43IDE4LjEtMTIuNyAyOS4ybDAgNC4zIDIwNS4yIDAgNDAuNy00NS44IDIuMy0yLjhjNS4xLTYuOCA3LjgtMTUuMiA3LjgtMjMuN0wzODQgMTY4YzAtODMuOS02OC4xLTE1Mi0xNTItMTUybC03MiAwIDAgMzJ6bTMyIDcyYTI0IDI0IDAgMSAxIDAtNDggMjQgMjQgMCAxIDEgMCA0OHoiXQogICAgfTsKICAgIGZhRmFjZUdyaW5CZWFtID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi1iZWFtIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTE2LCAiZ3Jpbi1iZWFtIl0sICJmNTgyIiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDAgLTQxNiAwIDIwOCAyMDggMCAxIDAgNDE2IDB6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTM3Mi4yIDQ2LjNjMTEuOC0zLjYgMjMuNyA2LjEgMTkuNiAxNy44LTE5LjggNTUuOS03My4xIDk2LTEzNS44IDk2LTYyLjcgMC0xMTYtNDAtMTM1LjgtOTUuOS00LjEtMTEuNiA3LjgtMjEuNCAxOS42LTE3LjggMzQuNyAxMC42IDc0LjIgMTYuNSAxMTYuMSAxNi41IDQyIDAgODEuNS02IDExNi4zLTE2LjZ6TTE3NiAxODBjLTE1LjUgMC0yOCAxMi41LTI4IDI4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMzcuNiAzMC40LTY4IDY4LTY4czY4IDMwLjQgNjggNjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0xNS41LTEyLjUtMjgtMjgtMjh6bTEzMiAyOGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTM3LjYgMzAuNC02OCA2OC02OHM2OCAzMC40IDY4IDY4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMTUuNS0xMi41LTI4LTI4LTI4cy0yOCAxMi41LTI4IDI4eiJdCiAgICB9OwogICAgZmFHcmluQmVhbSA9IGZhRmFjZUdyaW5CZWFtOwogICAgZmFIYW5kUGVhY2UgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1wZWFjZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzk5OTZdLCAiZjI1YiIsICJNMjE5IDEuNGMtMzUuMi0zLjctNjYuNiAyMS44LTcwLjMgNTdsLTYuNCA2MC42LTE3LjQtNDkuNEMxMTMuMiAzNi4zIDc2LjYgMTguOCA0My4zIDMwLjVTLTcuNiA3OC44IDQuMSAxMTIuMUw1Ni45IDI2Mi4yQzQxLjcgMjc2LjcgMzIuMiAyOTcuMyAzMi4yIDMyMGwwIDI0YzAgOTIuOCA3NS4yIDE2OCAxNjggMTY4bDQ4IDBjOTIuOCAwIDE2OC03NS4yIDE2OC0xNjhsMC0xMjBjMC0zNS4zLTI4LjctNjQtNjQtNjQtNy45IDAtMTUuNCAxLjQtMjIuNCA0LTEwLjQtMjEuMy0zMi4zLTM2LTU3LjYtMzYtLjcgMC0xLjUgMC0yLjIgMGw1LjktNTYuM2MzLjctMzUuMi0yMS44LTY2LjYtNTctNzAuM3ptLS4yIDE1NS40Yy02LjYgMTAuMS0xMC41IDIyLjItMTAuNSAzNS4ybDAgNDhjMCAuNyAwIDEuNCAwIDItNS4xLTEuMy0xMC41LTItMTYtMmwtNy40IDAtNS40LTE1LjMgMTctMTYxLjNjLjktOC44IDguOC0xNS4yIDE3LjYtMTQuMnMxNS4yIDguOCAxNC4yIDE3LjZsLTkuNSA5MC4xek03OS42IDg1LjZsNTQuMyAxNTQuNC0yMS43IDBjLTQgMC04IC4zLTExLjkgLjlMNDkuNCA5Ni4yYy0yLjktOC4zIDEuNS0xNy41IDkuOC0yMC40czE3LjUgMS41IDIwLjQgOS44ek0yNTYuMiAxOTJjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDQ4YzAgOC44LTcuMiAxNi0xNiAxNnMtMTYtNy4yLTE2LTE2bDAtNDh6bTM4LjQgMTA4YzEwLjQgMjEuMyAzMi4zIDM2IDU3LjYgMzYgNS41IDAgMTAuOS0uNyAxNi0ybDAgMTBjMCA2Ni4zLTUzLjcgMTIwLTEyMCAxMjBsLTQ4IDBjLTY2LjMgMC0xMjAtNTMuNy0xMjAtMTIwbDAtMjRjMC0xNy43IDE0LjMtMzIgMzItMzJsODAgMGM4LjggMCAxNiA3LjIgMTYgMTZzLTcuMiAxNi0xNiAxNmwtNDAgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw0MCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0IDAtLjcgMC0xLjQgMC0yIDUuMSAxLjMgMTAuNSAyIDE2IDIgNy45IDAgMTUuNC0xLjQgMjIuNC00em03My42LTI4YzAgOC44LTcuMiAxNi0xNiAxNnMtMTYtNy4yLTE2LTE2bDAtNDhjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDQ4eiJdCiAgICB9OwogICAgZmFDb21wYXNzID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNvbXBhc3MiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjk1MTddLCAiZjE0ZSIsICJNNDY0IDI1NmEyMDggMjA4IDAgMSAwIC00MTYgMCAyMDggMjA4IDAgMSAwIDQxNiAwek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0zMDYuNyA2OS4xTDE2Mi40IDM4MC42Yy0xOS40IDcuNS0zOC41LTExLjYtMzEtMzFsNTUuNS0xNDQuM2MzLjMtOC41IDkuOS0xNS4xIDE4LjQtMTguNGwxNDQuMy01NS41YzE5LjQtNy41IDM4LjUgMTEuNiAzMSAzMUwzMjUuMSAzMDYuN2MtMy4zIDguNS05LjkgMTUuMS0xOC40IDE4LjR6TTI4OCAyNTZhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHoiXQogICAgfTsKICAgIGZhU3F1YXJlID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInNxdWFyZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzk2MzIsIDk3MjMsIDk3MjQsIDYxNTkwXSwgImYwYzgiLCAiTTM4NCA4MGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMjBjMCA4LjgtNy4yIDE2LTE2IDE2TDY0IDQzMmMtOC44IDAtMTYtNy4yLTE2LTE2TDQ4IDk2YzAtOC44IDcuMi0xNiAxNi0xNmwzMjAgMHpNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnoiXQogICAgfTsKICAgIGZhRmFjZUdyaW4gPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1ncmluIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTEyLCAiZ3JpbiJdLCAiZjU4MCIsICJNNDY0IDI1NmEyMDggMjA4IDAgMSAwIC00MTYgMCAyMDggMjA4IDAgMSAwIDQxNiAwek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0zNzIuMiA0Ni4zYzExLjgtMy42IDIzLjcgNi4xIDE5LjYgMTcuOC0xOS44IDU1LjktNzMuMSA5Ni0xMzUuOCA5Ni02Mi43IDAtMTE2LTQwLTEzNS44LTk1LjktNC4xLTExLjYgNy44LTIxLjQgMTkuNi0xNy44IDM0LjcgMTAuNiA3NC4yIDE2LjUgMTE2LjEgMTYuNSA0MiAwIDgxLjUtNiAxMTYuMy0xNi42ek0xNDQgMjA4YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTE5Mi0zMmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYUdyaW4gPSBmYUZhY2VHcmluOwogICAgZmFGYWNlU21pbGUgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1zbWlsZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU3OCwgInNtaWxlIl0sICJmMTE4IiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDAgLTQxNiAwIDIwOCAyMDggMCAxIDAgNDE2IDB6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTE3Ny4zIDYzLjRDMTkyLjMgMzM1IDIxOC40IDM1MiAyNTYgMzUyczYzLjctMTcgNzguNy0zMi42YzkuMi05LjYgMjQuNC05LjkgMzMuOS0uN3M5LjkgMjQuNCAuNyAzMy45Yy0yMi4xIDIzLTYwIDQ3LjQtMTEzLjMgNDcuNHMtOTEuMi0yNC40LTExMy4zLTQ3LjRjLTkuMi05LjYtOC45LTI0LjggLjctMzMuOXMyNC44LTguOSAzMy45IC43ek0xNDQgMjA4YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTE5Mi0zMmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYVNtaWxlID0gZmFGYWNlU21pbGU7CiAgICBmYUZhY2VTbWlsZUJlYW0gPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1zbWlsZS1iZWFtIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTIyLCAic21pbGUtYmVhbSJdLCAiZjViOCIsICJNNDY0IDI1NmEyMDggMjA4IDAgMSAwIC00MTYgMCAyMDggMjA4IDAgMSAwIDQxNiAwek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0xNzcuMyA2My40QzE5Mi4zIDMzNSAyMTguNCAzNTIgMjU2IDM1MnM2My43LTE3IDc4LjctMzIuNmM5LjItOS42IDI0LjQtOS45IDMzLjktLjdzOS45IDI0LjQgLjcgMzMuOWMtMjIuMSAyMy02MCA0Ny40LTExMy4zIDQ3LjRzLTkxLjItMjQuNC0xMTMuMy00Ny40Yy05LjItOS42LTguOS0yNC44IC43LTMzLjlzMjQuOC04LjkgMzMuOSAuN3pNMTc2IDE4MGMtMTUuNSAwLTI4IDEyLjUtMjggMjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0zNy42IDMwLjQtNjggNjgtNjhzNjggMzAuNCA2OCA2OGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTE1LjUtMTIuNS0yOC0yOC0yOHptMTMyIDI4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMzcuNiAzMC40LTY4IDY4LTY4czY4IDMwLjQgNjggNjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0xNS41LTEyLjUtMjgtMjgtMjhzLTI4IDEyLjUtMjggMjh6Il0KICAgIH07CiAgICBmYVNtaWxlQmVhbSA9IGZhRmFjZVNtaWxlQmVhbTsKICAgIGZhRm9sZGVyQ2xvc2VkID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZvbGRlci1jbG9zZWQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTE4NSIsICJNNDQ4IDQwMEw2NCA0MDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTE0NCA0MTYgMCAwIDE0NGMwIDguOC03LjIgMTYtMTYgMTZ6bTE2LTIwOGwtNDE2IDAgMC05NmMwLTguOCA3LjItMTYgMTYtMTZsMTM4LjcgMGMzLjUgMCA2LjggMS4xIDkuNiAzLjJMMjUwLjcgMTEyYzEzLjggMTAuNCAzMC43IDE2IDQ4IDE2TDQ0OCAxMjhjOC44IDAgMTYgNy4yIDE2IDE2bDAgNDh6TTY0IDQ0OGwzODQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI0MGMwLTM1LjMtMjguNy02NC02NC02NEwyOTguNyA4MGMtNi45IDAtMTMuNy0yLjItMTkuMi02LjRMMjQxLjEgNDQuOEMyMzAgMzYuNSAyMTYuNSAzMiAyMDIuNyAzMkw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0eiJdCiAgICB9OwogICAgZmFLZXlib2FyZCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJrZXlib2FyZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzllM10sICJmMTFjIiwgIk02NCAxMTJjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDI1NmMwIDguOCA3LjIgMTYgMTYgMTZsNDQ4IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMjU2YzAtOC44LTcuMi0xNi0xNi0xNkw2NCAxMTJ6TTAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDQ0OCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjU2YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjh6TTE3NiAzMjBsMjI0IDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMTZjMCA4LjgtNy4yIDE2LTE2IDE2bC0yMjQgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMTZjMC04LjggNy4yLTE2IDE2LTE2em0tNzItNzJjMC04LjggNy4yLTE2IDE2LTE2bDE2IDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMTZjMCA4LjgtNy4yIDE2LTE2IDE2bC0xNiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0xNnptMTYtOTZsMTYgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAxNmMwIDguOC03LjIgMTYtMTYgMTZsLTE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTE2YzAtOC44IDcuMi0xNiAxNi0xNnptNjQgOTZjMC04LjggNy4yLTE2IDE2LTE2bDE2IDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMTZjMCA4LjgtNy4yIDE2LTE2IDE2bC0xNiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0xNnptMTYtOTZsMTYgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAxNmMwIDguOC03LjIgMTYtMTYgMTZsLTE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTE2YzAtOC44IDcuMi0xNiAxNi0xNnptNjQgOTZjMC04LjggNy4yLTE2IDE2LTE2bDE2IDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMTZjMCA4LjgtNy4yIDE2LTE2IDE2bC0xNiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0xNnptMTYtOTZsMTYgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAxNmMwIDguOC03LjIgMTYtMTYgMTZsLTE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTE2YzAtOC44IDcuMi0xNiAxNi0xNnptNjQgOTZjMC04LjggNy4yLTE2IDE2LTE2bDE2IDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMTZjMCA4LjgtNy4yIDE2LTE2IDE2bC0xNiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0xNnptMTYtOTZsMTYgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAxNmMwIDguOC03LjIgMTYtMTYgMTZsLTE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTE2YzAtOC44IDcuMi0xNiAxNi0xNnptNjQgOTZjMC04LjggNy4yLTE2IDE2LTE2bDE2IDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMTZjMCA4LjgtNy4yIDE2LTE2IDE2bC0xNiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0xNnptMTYtOTZsMTYgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAxNmMwIDguOC03LjIgMTYtMTYgMTZsLTE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTE2YzAtOC44IDcuMi0xNiAxNi0xNnoiXQogICAgfTsKICAgIGZhRmFjZVJvbGxpbmdFeWVzID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2Utcm9sbGluZy1leWVzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTgwLCAibWVoLXJvbGxpbmctZXllcyJdLCAiZjVhNSIsICJNMjU2IDQ4YTIwOCAyMDggMCAxIDEgMCA0MTYgMjA4IDIwOCAwIDEgMSAwLTQxNnptMCA0NjRhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0xNzYgMzc2YzAgMTMuMyAxMC43IDI0IDI0IDI0bDExMiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xMTIgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjR6TTE2MCAyNjRjLTIyLjEgMC00MC0xNy45LTQwLTQwIDAtOS41IDMuMy0xOC4xIDguOC0yNSAzLjIgMTQuMyAxNiAyNSAzMS4yIDI1czI4LTEwLjcgMzEuMi0yNWM1LjUgNi44IDguOCAxNS41IDguOCAyNSAwIDIyLjEtMTcuOSA0MC00MCA0MHptMCA0MGE4MCA4MCAwIDEgMCAwLTE2MCA4MCA4MCAwIDEgMCAwIDE2MHptMTkyLTQwYy0yMi4xIDAtNDAtMTcuOS00MC00MCAwLTkuNSAzLjMtMTguMSA4LjgtMjUgMy4yIDE0LjMgMTYgMjUgMzEuMiAyNXMyOC0xMC43IDMxLjItMjVjNS41IDYuOCA4LjggMTUuNSA4LjggMjUgMCAyMi4xLTE3LjkgNDAtNDAgNDB6bTAgNDBhODAgODAgMCAxIDAgMC0xNjAgODAgODAgMCAxIDAgMCAxNjB6Il0KICAgIH07CiAgICBmYU1laFJvbGxpbmdFeWVzID0gZmFGYWNlUm9sbGluZ0V5ZXM7CiAgICBmYUZhY2VHcmltYWNlID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3JpbWFjZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU1NiwgImdyaW1hY2UiXSwgImY1N2YiLCAiTTI1NiA0OGEyMDggMjA4IDAgMSAwIDAgNDE2IDIwOCAyMDggMCAxIDAgMC00MTZ6TTUxMiAyNTZhMjU2IDI1NiAwIDEgMSAtNTEyIDAgMjU2IDI1NiAwIDEgMSA1MTIgMHpNMTUyIDM1MmMwIDExLjkgOC42IDIxLjggMjAgMjMuN2wwLTQ3LjNjLTExLjQgMS45LTIwIDExLjgtMjAgMjMuN3ptODQgMjRsMC00OC0yNCAwIDAgNDggMjQgMHptNjQgMGwwLTQ4LTI0IDAgMCA0OCAyNCAwem00MC0uM2MxMS40LTEuOSAyMC0xMS44IDIwLTIzLjdzLTguNi0yMS44LTIwLTIzLjdsMCA0Ny4zek0xNzYgMjg4bDE2MCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0cy0yOC43IDY0LTY0IDY0bC0xNjAgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRzMjguNy02NCA2NC02NHptMC0xMTJhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em0xMjggMzJhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHoiXQogICAgfTsKICAgIGZhR3JpbWFjZSA9IGZhRmFjZUdyaW1hY2U7CiAgICBmYUNpcmNsZURvdCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtZG90IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MjgwLCAiZG90LWNpcmNsZSJdLCAiZjE5MiIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAxIDAtNTEyIDI1NiAyNTYgMCAxIDEgMCA1MTJ6bTAtNDY0YTIwOCAyMDggMCAxIDAgMCA0MTYgMjA4IDIwOCAwIDEgMCAwLTQxNnptMCAzMDRhOTYgOTYgMCAxIDEgMC0xOTIgOTYgOTYgMCAxIDEgMCAxOTJ6Il0KICAgIH07CiAgICBmYURvdENpcmNsZSA9IGZhQ2lyY2xlRG90OwogICAgZmFPYmplY3RHcm91cCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJvYmplY3QtZ3JvdXAiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjI0NyIsICJNNDAgNjRhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHptNDggNTkuM2MxNi02LjUgMjguOS0xOS4zIDM1LjMtMzUuM2wzMjkuMyAwYzYuNSAxNiAxOS4zIDI4LjkgMzUuMyAzNS4zbDAgMjY1LjNjLTE2IDYuNS0yOC45IDE5LjMtMzUuMyAzNS4zbC0zMjkuMyAwYy02LjUtMTYtMTkuMy0yOC45LTM1LjMtMzUuM2wwLTI2NS4zek01MTIgMGMtMjYuOSAwLTQ5LjkgMTYuNS01OS4zIDQwTDEyMy4zIDQwQzExMy45IDE2LjUgOTAuOSAwIDY0IDAgMjguNyAwIDAgMjguNyAwIDY0IDAgOTAuOSAxNi41IDExMy45IDQwIDEyMy4zbDAgMjY1LjNjLTIzLjUgOS41LTQwIDMyLjUtNDAgNTkuMyAwIDM1LjMgMjguNyA2NCA2NCA2NCAyNi45IDAgNDkuOS0xNi41IDU5LjMtNDBsMzI5LjMgMGM5LjUgMjMuNSAzMi41IDQwIDU5LjMgNDAgMzUuMyAwIDY0LTI4LjcgNjQtNjQgMC0yNi45LTE2LjUtNDkuOS00MC01OS4zbDAtMjY1LjNjMjMuNS05LjUgNDAtMzIuNSA0MC01OS4zIDAtMzUuMy0yOC43LTY0LTY0LTY0ek00ODggNjRhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHpNNjQgNDI0YTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHptNDI0IDI0YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6TTE5MiAxNzZsODggMCAwIDU2LTg4IDAgMC01NnptLTgtNDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgNzJjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTA0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC03MmMwLTE3LjctMTQuMy0zMi0zMi0zMmwtMTA0IDB6bTcyIDE4NGwwIDI0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDEwNCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNzJjMC0xNy43LTE0LjMtMzItMzItMzJsLTI0IDBjMCAxNC42LTMuOSAyOC4yLTEwLjcgNDBsMjYuNyAwIDAgNTYtODggMCAwLTE2LjRjLTIuNiAuMy01LjMgLjQtOCAuNGwtMzIgMHoiXQogICAgfTsKICAgIGZhRmFjZUZsdXNoZWQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1mbHVzaGVkIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTYzLCAiZmx1c2hlZCJdLCAiZjU3OSIsICJNNDY0IDI1NmEyMDggMjA4IDAgMSAxIC00MTYgMCAyMDggMjA4IDAgMSAxIDQxNiAwek0yNTYgMGEyNTYgMjU2IDAgMSAwIDAgNTEyIDI1NiAyNTYgMCAxIDAgMC01MTJ6TTE2MCAyNDhhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4em0yMTYtMjRhMjQgMjQgMCAxIDAgLTQ4IDAgMjQgMjQgMCAxIDAgNDggMHpNMTkyIDM1MmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxMjggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTI4IDB6TTE2MCAxNzZhNDggNDggMCAxIDEgMCA5NiA0OCA0OCAwIDEgMSAwLTk2em0wIDEyOGE4MCA4MCAwIDEgMCAwLTE2MCA4MCA4MCAwIDEgMCAwIDE2MHptMTQ0LTgwYTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6bTEyOCAwYTgwIDgwIDAgMSAwIC0xNjAgMCA4MCA4MCAwIDEgMCAxNjAgMHoiXQogICAgfTsKICAgIGZhRmx1c2hlZCA9IGZhRmFjZUZsdXNoZWQ7CiAgICBmYVN0YXJIYWxmU3Ryb2tlID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInN0YXItaGFsZi1zdHJva2UiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsic3Rhci1oYWxmLWFsdCJdLCAiZjVjMCIsICJNMzA5LjUtMTguOWMtNC4xLTgtMTIuNC0xMy4xLTIxLjQtMTMuMXMtMTcuMyA1LjEtMjEuNCAxMy4xTDE5My4xIDEyNS4zIDMzLjIgMTUwLjdjLTguOSAxLjQtMTYuMyA3LjctMTkuMSAxNi4zcy0uNSAxOCA1LjggMjQuNGwxMTQuNCAxMTQuNS0yNS4yIDE1OS45Yy0xLjQgOC45IDIuMyAxNy45IDkuNiAyMy4yczE2LjkgNi4xIDI1IDJMMjg4LjEgNDE3LjYgNDMyLjQgNDkxYzggNC4xIDE3LjcgMy4zIDI1LTJzMTEtMTQuMiA5LjYtMjMuMkw0NDEuNyAzMDUuOSA1NTYuMSAxOTEuNGM2LjQtNi40IDguNi0xNS44IDUuOC0yNC40cy0xMC4xLTE0LjktMTkuMS0xNi4zTDM4MyAxMjUuMyAzMDkuNS0xOC45ek0yNjQuMSA5MS44bDAgMjg0LjEtMTAwLjEgNTAuOSAxOS44LTEyNS41YzEuMi03LjYtMS4zLTE1LjMtNi43LTIwLjdsLTg5LjgtODkuOSAxMjUuNS0yMGM3LjYtMS4yIDE0LjEtNiAxNy42LTEyLjhsMzMuOC02Ni4yem00OCAyODQuMWwwLTI4NC4xIDMzLjggNjYuMmMzLjUgNi44IDEwIDExLjYgMTcuNiAxMi44bDEyNS41IDIwLTg5LjggODkuOWMtNS40IDUuNC03LjkgMTMuMS02LjcgMjAuN2wxOS44IDEyNS41LTEwMC4xLTUwLjl6Il0KICAgIH07CiAgICBmYVN0YXJIYWxmQWx0ID0gZmFTdGFySGFsZlN0cm9rZTsKICAgIGZhRmlsZVZpZGVvID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZpbGUtdmlkZW8iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjFjOCIsICJNNjQgNDhsMTEyIDAgMCA4OGMwIDM5LjggMzIuMiA3MiA3MiA3Mmw4OCAwIDAgMjQwYzAgOC44LTcuMiAxNi0xNiAxNkw2NCA0NjRjLTguOCAwLTE2LTcuMi0xNi0xNkw0OCA2NGMwLTguOCA3LjItMTYgMTYtMTZ6TTIyNCA2Ny45bDkyLjEgOTIuMS02OC4xIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtNjguMXpNNjQgMEMyOC43IDAgMCAyOC43IDAgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjU2IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNjEuNWMwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0wyNDIuNyAxOC43QzIzMC43IDYuNyAyMTQuNSAwIDE5Ny41IDBMNjQgMHpNODAgMjg4bDAgOTZjMCAxNy43IDE0LjMgMzIgMzIgMzJsOTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTI0IDM1IDM1YzMuMiAzLjIgNy41IDUgMTIgNSA5LjQgMCAxNy03LjYgMTctMTdsMC05NC4xYzAtOS40LTcuNi0xNy0xNy0xNy00LjUgMC04LjggMS44LTEyIDVsLTM1IDM1IDAtMjRjMC0xNy43LTE0LjMtMzItMzItMzJsLTk2IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyeiJdCiAgICB9OwogICAgZmFGYWNlTGF1Z2ggPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1sYXVnaCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJsYXVnaCJdLCAiZjU5OSIsICJNNDY0IDI1NmEyMDggMjA4IDAgMSAwIC00MTYgMCAyMDggMjA4IDAgMSAwIDQxNiAwek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0xMTguMyA1OC4yYy00LjItMTMuNyA3LjEtMjYuMiAyMS40LTI2LjJsMjMyLjYgMGMxNC4zIDAgMjUuNiAxMi41IDIxLjQgMjYuMi0xOCA1OC45LTcyLjkgMTAxLjgtMTM3LjcgMTAxLjhTMTM2LjMgMzczLjEgMTE4LjMgMzE0LjJ6TTE0NCAxOTJhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptMTkyLTMyYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhTGF1Z2ggPSBmYUZhY2VMYXVnaDsKICAgIGZhSGFuZFBvaW50ZXIgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1wb2ludGVyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyNWEiLCAiTTE2MCA2NGMwLTguOCA3LjItMTYgMTYtMTZzMTYgNy4yIDE2IDE2bDAgMTM2YzAgMTAuMyA2LjYgMTkuNSAxNi40IDIyLjhzMjAuNi0uMSAyNi44LTguM2MzLTMuOSA3LjYtNi40IDEyLjgtNi40IDguOCAwIDE2IDcuMiAxNiAxNiAwIDEwLjMgNi42IDE5LjUgMTYuNCAyMi44czIwLjYtLjEgMjYuOC04LjNjMy0zLjkgNy42LTYuNCAxMi44LTYuNCA3LjggMCAxNC4zIDUuNiAxNS43IDEzIDEuNiA4LjIgNy4zIDE1LjEgMTUuMSAxOHMxNi43IDEuNiAyMy4zLTMuNmMyLjctMi4xIDYuMS0zLjQgOS45LTMuNCA4LjggMCAxNiA3LjIgMTYgMTZsMCAxMjBjMCAzOS44LTMyLjIgNzItNzIgNzJsLTExNi42IDBjLTM3LjQgMC03Mi40LTE4LjctOTMuMi00OS45TDUwLjcgMzEyLjljLTQuOS03LjQtMi45LTE3LjMgNC40LTIyLjJzMTcuMy0yLjkgMjIuMiA0LjRMMTE2IDM1My4yYzUuOSA4LjggMTYuOCAxMi43IDI2LjkgOS43czE3LTEyLjQgMTctMjNMMTYwIDY0ek0xNzYgMGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCAxOTcuN0M5MS4yIDIzOCA1NS41IDIzMi44IDI4LjUgMjUwLjctLjkgMjcwLjQtOC45IDMxMC4xIDEwLjggMzM5LjVMNzguMyA0NDAuOGMyOS43IDQ0LjUgNzkuNiA3MS4yIDEzMy4xIDcxLjJMMzI4IDUxMmM2Ni4zIDAgMTIwLTUzLjcgMTIwLTEyMGwwLTEyMGMwLTM1LjMtMjguNy02NC02NC02NC00LjUgMC04LjggLjUtMTMgMS4zLTExLjctMTUuNC0zMC4yLTI1LjMtNTEtMjUuMy02LjkgMC0xMy41IDEuMS0xOS43IDMuMS0xMS42LTE2LjQtMzAuNy0yNy4xLTUyLjMtMjcuMS0yLjcgMC01LjQgLjItOCAuNUwyNDAgNjRjMC0zNS4zLTI4LjctNjQtNjQtNjR6bTQ4IDMwNGMwLTguOC03LjItMTYtMTYtMTZzLTE2IDcuMi0xNiAxNmwwIDk2YzAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZsMC05NnptNDgtMTZjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDk2YzAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZsMC05NmMwLTguOC03LjItMTYtMTYtMTZ6bTgwIDE2YzAtOC44LTcuMi0xNi0xNi0xNnMtMTYgNy4yLTE2IDE2bDAgOTZjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTk2eiJdCiAgICB9OwogICAgZmFSZWdpc3RlcmVkID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInJlZ2lzdGVyZWQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxNzRdLCAiZjI1ZCIsICJNMjU2IDQ4YTIwOCAyMDggMCAxIDEgMCA0MTYgMjA4IDIwOCAwIDEgMSAwLTQxNnptMCA0NjRhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0yMDAgMTQ0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDE3NmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNTYgMzQuNCAwIDQxIDY4LjNjNi44IDExLjQgMjEuNiAxNSAzMi45IDguMnMxNS0yMS42IDguMi0zMi45bC0zMC4yLTUwLjNjMjQuNi0xMS41IDQxLjYtMzYuNCA0MS42LTY1LjMgMC0zOS44LTMyLjItNzItNzItNzJsLTgwIDB6bTcyIDk2bC00OCAwIDAtNDggNTYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtOCAweiJdCiAgICB9OwogICAgaWNvbnMyID0gewogICAgICBmYVNxdWFyZU1pbnVzLAogICAgICBmYU1pbnVzU3F1YXJlLAogICAgICBmYUNhbGVuZGFyQ2hlY2ssCiAgICAgIGZhRmFjZUtpc3MsCiAgICAgIGZhS2lzcywKICAgICAgZmFQYXN0ZSwKICAgICAgZmFGaWxlQ2xpcGJvYXJkLAogICAgICBmYUhhbmRQb2ludExlZnQsCiAgICAgIGZhRmlsZUV4Y2VsLAogICAgICBmYUVudmVsb3BlLAogICAgICBmYVNxdWFyZUNhcmV0RG93biwKICAgICAgZmFDYXJldFNxdWFyZURvd24sCiAgICAgIGZhVHJ1Y2ssCiAgICAgIGZhQmVsbCwKICAgICAgZmFNZXNzYWdlLAogICAgICBmYUNvbW1lbnRBbHQsCiAgICAgIGZhRmFjZURpenp5LAogICAgICBmYURpenp5LAogICAgICBmYUNhbGVuZGFyRGF5cywKICAgICAgZmFDYWxlbmRhckFsdCwKICAgICAgZmFIYW5kUG9pbnRVcCwKICAgICAgZmFIYW5kTGl6YXJkLAogICAgICBmYVNxdWFyZUZ1bGwsCiAgICAgIGZhQ2lyY2xlUGF1c2UsCiAgICAgIGZhUGF1c2VDaXJjbGUsCiAgICAgIGZhSGFyZERyaXZlLAogICAgICBmYUhkZCwKICAgICAgZmFGaWxlWmlwcGVyLAogICAgICBmYUZpbGVBcmNoaXZlLAogICAgICBmYUZsb3BweURpc2ssCiAgICAgIGZhU2F2ZSwKICAgICAgZmFGYWNlR3JpblRvbmd1ZVNxdWludCwKICAgICAgZmFHcmluVG9uZ3VlU3F1aW50LAogICAgICBmYUNhbWVyYSwKICAgICAgZmFDYW1lcmFBbHQsCiAgICAgIGZhRmFjZUdyaW5TdGFycywKICAgICAgZmFHcmluU3RhcnMsCiAgICAgIGZhRXllLAogICAgICBmYUZhY2VTYWRUZWFyLAogICAgICBmYVNhZFRlYXIsCiAgICAgIGZhU2hhcmVGcm9tU3F1YXJlLAogICAgICBmYVNoYXJlU3F1YXJlLAogICAgICBmYU5vdGVTdGlja3ksCiAgICAgIGZhU3RpY2t5Tm90ZSwKICAgICAgZmFIYW5kQmFja0Zpc3QsCiAgICAgIGZhSGFuZFJvY2ssCiAgICAgIGZhQ2hlc3NRdWVlbiwKICAgICAgZmFGYWNlR3JpblRlYXJzLAogICAgICBmYUdyaW5UZWFycywKICAgICAgZmFQZW5Ub1NxdWFyZSwKICAgICAgZmFFZGl0LAogICAgICBmYUZhY2VHcmluQmVhbVN3ZWF0LAogICAgICBmYUdyaW5CZWFtU3dlYXQsCiAgICAgIGZhQ2xvY2ssCiAgICAgIGZhQ2xvY2tGb3VyLAogICAgICBmYUZhY2VMYXVnaFdpbmssCiAgICAgIGZhTGF1Z2hXaW5rLAogICAgICBmYVBhcGVyUGxhbmUsCiAgICAgIGZhSGVhcnQsCiAgICAgIGZhRm9udEF3ZXNvbWU6IGZhRm9udEF3ZXNvbWUyLAogICAgICBmYUZvbnRBd2Vzb21lRmxhZzogZmFGb250QXdlc29tZUZsYWcyLAogICAgICBmYUZvbnRBd2Vzb21lTG9nb0Z1bGw6IGZhRm9udEF3ZXNvbWVMb2dvRnVsbDIsCiAgICAgIGZhQ2xvbmUsCiAgICAgIGZhRm9sZGVyT3BlbiwKICAgICAgZmFXaW5kb3dNaW5pbWl6ZSwKICAgICAgZmFTdGFySGFsZiwKICAgICAgZmFBbGFybUNsb2NrLAogICAgICBmYU5ld3NwYXBlciwKICAgICAgZmFIb3NwaXRhbCwKICAgICAgZmFIb3NwaXRhbEFsdCwKICAgICAgZmFIb3NwaXRhbFdpZGUsCiAgICAgIGZhQ2lyY2xlU3RvcCwKICAgICAgZmFTdG9wQ2lyY2xlLAogICAgICBmYU9iamVjdFVuZ3JvdXAsCiAgICAgIGZhQ29tbWVudCwKICAgICAgZmFDaGVzc1Bhd24sCiAgICAgIGZhQ2FsZW5kYXJQbHVzLAogICAgICBmYUNsaXBib2FyZCwKICAgICAgZmFUaHVtYnNEb3duLAogICAgICBmYUlkQmFkZ2UsCiAgICAgIGZhU3F1YXJlQ2hlY2ssCiAgICAgIGZhQ2hlY2tTcXVhcmUsCiAgICAgIGZhQ2hlc3NCaXNob3AsCiAgICAgIGZhRW52ZWxvcGVPcGVuLAogICAgICBmYUNpcmNsZVhtYXJrLAogICAgICBmYVRpbWVzQ2lyY2xlLAogICAgICBmYVhtYXJrQ2lyY2xlLAogICAgICBmYVNxdWFyZUNhcmV0VXAsCiAgICAgIGZhQ2FyZXRTcXVhcmVVcCwKICAgICAgZmFGaWxlSW1hZ2UsCiAgICAgIGZhU3F1YXJlQ2FyZXRSaWdodCwKICAgICAgZmFDYXJldFNxdWFyZVJpZ2h0LAogICAgICBmYVN1biwKICAgICAgZmFJbWFnZSwKICAgICAgZmFMaWdodGJ1bGIsCiAgICAgIGZhQWRkcmVzc0NhcmQsCiAgICAgIGZhQ29udGFjdENhcmQsCiAgICAgIGZhVmNhcmQsCiAgICAgIGZhRmFjZU1laCwKICAgICAgZmFNZWgsCiAgICAgIGZhTWFwLAogICAgICBmYUhhbmRQb2ludERvd24sCiAgICAgIGZhRmFjZU1laEJsYW5rLAogICAgICBmYU1laEJsYW5rLAogICAgICBmYUZhY2VHcmluVG9uZ3VlLAogICAgICBmYUdyaW5Ub25ndWUsCiAgICAgIGZhRnV0Ym9sLAogICAgICBmYUZ1dGJvbEJhbGwsCiAgICAgIGZhU29jY2VyQmFsbCwKICAgICAgZmFGYWNlU3VycHJpc2UsCiAgICAgIGZhU3VycHJpc2UsCiAgICAgIGZhRm9sZGVyLAogICAgICBmYUZvbGRlckJsYW5rLAogICAgICBmYUNsb3VkLAogICAgICBmYUNpcmNsZSwKICAgICAgZmFGYWNlR3JpblNxdWludCwKICAgICAgZmFHcmluU3F1aW50LAogICAgICBmYUNpcmNsZVVzZXIsCiAgICAgIGZhVXNlckNpcmNsZSwKICAgICAgZmFSZWN0YW5nbGVMaXN0LAogICAgICBmYUxpc3RBbHQsCiAgICAgIGZhSGFuZCwKICAgICAgZmFIYW5kUGFwZXIsCiAgICAgIGZhVGh1bWJzVXAsCiAgICAgIGZhQnVpbGRpbmcsCiAgICAgIGZhQ2hlc3NSb29rLAogICAgICBmYUNpcmNsZVF1ZXN0aW9uLAogICAgICBmYVF1ZXN0aW9uQ2lyY2xlLAogICAgICBmYUZpbGUsCiAgICAgIGZhRmFjZVNhZENyeSwKICAgICAgZmFTYWRDcnksCiAgICAgIGZhQ2FsZW5kYXJNaW51cywKICAgICAgZmFGYWNlVGlyZWQsCiAgICAgIGZhVGlyZWQsCiAgICAgIGZhSGFuZFBvaW50UmlnaHQsCiAgICAgIGZhQ2lyY2xlVXAsCiAgICAgIGZhQXJyb3dBbHRDaXJjbGVVcCwKICAgICAgZmFIYW5kU2Npc3NvcnMsCiAgICAgIGZhR2VtLAogICAgICBmYVJlY3RhbmdsZVhtYXJrLAogICAgICBmYVJlY3RhbmdsZVRpbWVzLAogICAgICBmYVRpbWVzUmVjdGFuZ2xlLAogICAgICBmYVdpbmRvd0Nsb3NlLAogICAgICBmYVRyYXNoQ2FuLAogICAgICBmYVRyYXNoQWx0LAogICAgICBmYUxpZmVSaW5nLAogICAgICBmYUNvcHlyaWdodCwKICAgICAgZmFDaXJjbGVMZWZ0LAogICAgICBmYUFycm93QWx0Q2lyY2xlTGVmdCwKICAgICAgZmFDYWxlbmRhciwKICAgICAgZmFGYWNlRnJvd25PcGVuLAogICAgICBmYUZyb3duT3BlbiwKICAgICAgZmFDaGFydEJhciwKICAgICAgZmFCYXJDaGFydCwKICAgICAgZmFIb3VzZSwKICAgICAgZmFIb21lLAogICAgICBmYUhvbWVBbHQsCiAgICAgIGZhSG9tZUxnQWx0LAogICAgICBmYUZhY2VGcm93biwKICAgICAgZmFGcm93biwKICAgICAgZmFVc2VyLAogICAgICBmYVVzZXJBbHQsCiAgICAgIGZhVXNlckxhcmdlLAogICAgICBmYVNub3dmbGFrZSwKICAgICAgZmFCb29rbWFyaywKICAgICAgZmFTcXVhcmVDYXJldExlZnQsCiAgICAgIGZhQ2FyZXRTcXVhcmVMZWZ0LAogICAgICBmYUhhbmRzaGFrZSwKICAgICAgZmFIYW5kc2hha2VBbHQsCiAgICAgIGZhSGFuZHNoYWtlU2ltcGxlLAogICAgICBmYUZhY2VTbWlsZVdpbmssCiAgICAgIGZhU21pbGVXaW5rLAogICAgICBmYUZhY2VHcmluU3F1aW50VGVhcnMsCiAgICAgIGZhR3JpblNxdWludFRlYXJzLAogICAgICBmYUZpbGVBdWRpbywKICAgICAgZmFDYWxlbmRhclhtYXJrLAogICAgICBmYUNhbGVuZGFyVGltZXMsCiAgICAgIGZhQ2lyY2xlRG93biwKICAgICAgZmFBcnJvd0FsdENpcmNsZURvd24sCiAgICAgIGZhRmlsZUxpbmVzLAogICAgICBmYUZpbGVBbHQsCiAgICAgIGZhRmlsZVRleHQsCiAgICAgIGZhQ29tbWVudHMsCiAgICAgIGZhQ2lyY2xlQ2hlY2ssCiAgICAgIGZhQ2hlY2tDaXJjbGUsCiAgICAgIGZhTW9vbiwKICAgICAgZmFDbG9zZWRDYXB0aW9uaW5nLAogICAgICBmYUltYWdlcywKICAgICAgZmFDaXJjbGVSaWdodCwKICAgICAgZmFBcnJvd0FsdENpcmNsZVJpZ2h0LAogICAgICBmYUlkQ2FyZCwKICAgICAgZmFEcml2ZXJzTGljZW5zZSwKICAgICAgZmFDaXJjbGVQbGF5LAogICAgICBmYVBsYXlDaXJjbGUsCiAgICAgIGZhRmFjZUxhdWdoQmVhbSwKICAgICAgZmFMYXVnaEJlYW0sCiAgICAgIGZhQWRkcmVzc0Jvb2ssCiAgICAgIGZhQ29udGFjdEJvb2ssCiAgICAgIGZhSG91cmdsYXNzLAogICAgICBmYUhvdXJnbGFzc0VtcHR5LAogICAgICBmYUhlYWRwaG9uZXMsCiAgICAgIGZhSGVhZHBob25lc0FsdCwKICAgICAgZmFIZWFkcGhvbmVzU2ltcGxlLAogICAgICBmYUZpbGVQb3dlcnBvaW50LAogICAgICBmYVdpbmRvd01heGltaXplLAogICAgICBmYUNvbW1lbnREb3RzLAogICAgICBmYUNvbW1lbnRpbmcsCiAgICAgIGZhRmFjZUdyaW5Ub25ndWVXaW5rLAogICAgICBmYUdyaW5Ub25ndWVXaW5rLAogICAgICBmYUhvdXJnbGFzc0hhbGYsCiAgICAgIGZhSG91cmdsYXNzMiwKICAgICAgZmFDcmVkaXRDYXJkLAogICAgICBmYUNyZWRpdENhcmRBbHQsCiAgICAgIGZhSGFuZFNwb2NrLAogICAgICBmYUJlbGxTbGFzaCwKICAgICAgZmFTdGFyLAogICAgICBmYUZsYWcsCiAgICAgIGZhTGVtb24sCiAgICAgIGZhV2luZG93UmVzdG9yZSwKICAgICAgZmFGYWNlR3JpbkhlYXJ0cywKICAgICAgZmFHcmluSGVhcnRzLAogICAgICBmYUZhY2VLaXNzQmVhbSwKICAgICAgZmFLaXNzQmVhbSwKICAgICAgZmFGaWxlUGRmLAogICAgICBmYUZhY2VHcmluV2lkZSwKICAgICAgZmFHcmluQWx0LAogICAgICBmYUZhY2VMYXVnaFNxdWludCwKICAgICAgZmFMYXVnaFNxdWludCwKICAgICAgZmFGYWNlS2lzc1dpbmtIZWFydCwKICAgICAgZmFLaXNzV2lua0hlYXJ0LAogICAgICBmYUNvcHksCiAgICAgIGZhQ2hlc3NLaW5nLAogICAgICBmYVNxdWFyZVBsdXMsCiAgICAgIGZhUGx1c1NxdWFyZSwKICAgICAgZmFGaWxlQ29kZSwKICAgICAgZmFGYWNlR3JpbldpbmssCiAgICAgIGZhR3JpbldpbmssCiAgICAgIGZhTW9uZXlCaWxsMSwKICAgICAgZmFNb25leUJpbGxBbHQsCiAgICAgIGZhRXllU2xhc2gsCiAgICAgIGZhRmlsZVdvcmQsCiAgICAgIGZhRmFjZUFuZ3J5LAogICAgICBmYUFuZ3J5LAogICAgICBmYUNoZXNzS25pZ2h0LAogICAgICBmYUZhY2VHcmluQmVhbSwKICAgICAgZmFHcmluQmVhbSwKICAgICAgZmFIYW5kUGVhY2UsCiAgICAgIGZhQ29tcGFzcywKICAgICAgZmFTcXVhcmUsCiAgICAgIGZhRmFjZUdyaW4sCiAgICAgIGZhR3JpbiwKICAgICAgZmFGYWNlU21pbGUsCiAgICAgIGZhU21pbGUsCiAgICAgIGZhRmFjZVNtaWxlQmVhbSwKICAgICAgZmFTbWlsZUJlYW0sCiAgICAgIGZhRm9sZGVyQ2xvc2VkLAogICAgICBmYUtleWJvYXJkLAogICAgICBmYUZhY2VSb2xsaW5nRXllcywKICAgICAgZmFNZWhSb2xsaW5nRXllcywKICAgICAgZmFGYWNlR3JpbWFjZSwKICAgICAgZmFHcmltYWNlLAogICAgICBmYUNpcmNsZURvdCwKICAgICAgZmFEb3RDaXJjbGUsCiAgICAgIGZhT2JqZWN0R3JvdXAsCiAgICAgIGZhRmFjZUZsdXNoZWQsCiAgICAgIGZhRmx1c2hlZCwKICAgICAgZmFTdGFySGFsZlN0cm9rZSwKICAgICAgZmFTdGFySGFsZkFsdCwKICAgICAgZmFGaWxlVmlkZW8sCiAgICAgIGZhRmFjZUxhdWdoLAogICAgICBmYUxhdWdoLAogICAgICBmYUhhbmRQb2ludGVyLAogICAgICBmYVJlZ2lzdGVyZWQKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZm9ydGF3ZXNvbWUrZnJlZS1zb2xpZC1zdmctaWNvbnNANy4xLjAvbm9kZV9tb2R1bGVzL0Bmb3J0YXdlc29tZS9mcmVlLXNvbGlkLXN2Zy1pY29ucy9pbmRleC5tanMKdmFyIHByZWZpeDMsIGZhMCwgZmExLCBmYTIsIGZhMywgZmE0LCBmYTUsIGZhNiwgZmE3LCBmYTgsIGZhOSwgZmFEb2xsYXJTaWduLCBmYURvbGxhciwgZmFVc2QsIGZhRG9nLCBmYVRydWNrTW92aW5nLCBmYVJvdGF0ZSwgZmFTeW5jQWx0LCBmYVNxdWFyZU1pbnVzMiwgZmFNaW51c1NxdWFyZTIsIGZhQWxpZ25KdXN0aWZ5LCBmYUNhbGVuZGFyQ2hlY2syLCBmYUZhY2VLaXNzMiwgZmFLaXNzMiwgZmFLaXRjaGVuU2V0LCBmYURuYSwgZmFDaGlsZFJlYWNoaW5nLCBmYVBhc3RlMiwgZmFGaWxlQ2xpcGJvYXJkMiwgZmFNZXRlb3IsIGZhR2VhcnMsIGZhQ29ncywgZmFGaWxlQ2lyY2xlUGx1cywgZmFJY2ljbGVzLCBmYUFycm93VHJlbmRVcCwgZmFIZXhhZ29uTm9kZXNCb2x0LCBmYVF1ZXN0aW9uLCBmYUhhbmRzQm91bmQsIGZhUGVyc29uV2Fsa2luZ0x1Z2dhZ2UsIGZhRmlsZUFycm93RG93biwgZmFGaWxlRG93bmxvYWQsIGZhUGVyc29uQm9vdGgsIGZhTG9jdXN0LCBmYVJpZ2h0TG9uZywgZmFMb25nQXJyb3dBbHRSaWdodCwgZmFUcnVja0Ryb3BsZXQsIGZhSGFuZEhvbGRpbmdNZWRpY2FsLCBmYUhhbmRQb2ludExlZnQyLCBmYUNhbGN1bGF0b3IsIGZhTWludXMsIGZhU3VidHJhY3QsIGZhQXJyb3dVcFpBLCBmYVNvcnRBbHBoYVVwQWx0LCBmYU1pY3JvcGhvbmVTbGFzaCwgZmFTcXVhcmVQZW4sIGZhUGVuU3F1YXJlLCBmYVBlbmNpbFNxdWFyZSwgZmFIYW5kRmlzdCwgZmFGaXN0UmFpc2VkLCBmYUNvbW1lbnRTbXMsIGZhU21zLCBmYVNpbUNhcmQsIGZhU2NhbGVCYWxhbmNlZCwgZmFCYWxhbmNlU2NhbGUsIGZhQ2FyLCBmYUF1dG9tb2JpbGUsIGZhQ3JvcFNpbXBsZSwgZmFDcm9wQWx0LCBmYU1lZGFsLCBmYVNjcm9sbCwgZmFGaWxlRXhjZWwyLCBmYUZpbHRlciwgZmFEcnVtLCBmYU1hcFBpbiwgZmFTY2FsZVVuYmFsYW5jZWRGbGlwLCBmYUJhbGFuY2VTY2FsZVJpZ2h0LCBmYUFycm93c1RvQ2lyY2xlLCBmYUVudmVsb3BlMiwgZmFCYWJ5LCBmYVNxdWFyZUNhcmV0RG93bjIsIGZhQ2FyZXRTcXVhcmVEb3duMiwgZmFUZW50LCBmYUEsIGZhUGFyYWNodXRlQm94LCBmYUNhcnRBcnJvd0Rvd24sIGZhQnJpZGdlQ2lyY2xlRXhjbGFtYXRpb24sIGZhQ2xvdWRBcnJvd1VwLCBmYUNsb3VkVXBsb2FkLCBmYUNsb3VkVXBsb2FkQWx0LCBmYUF0LCBmYUluZGlhblJ1cGVlU2lnbiwgZmFJbmRpYW5SdXBlZSwgZmFJbnIsIGZhVHJ1Y2syLCBmYUNoYWxrYm9hcmRVc2VyLCBmYUNoYWxrYm9hcmRUZWFjaGVyLCBmYVVzZXJDaGVjaywgZmFVc2VyTmluamEsIGZhUGxhbnRXaWx0LCBmYVdlaWdodFNjYWxlLCBmYVdlaWdodCwgZmFDYXJldFJpZ2h0LCBmYUZsb3JpblNpZ24sIGZhQmVsbDIsIGZhTGFyaVNpZ24sIGZhTWlsbFNpZ24sIGZhUGVyc29uU25vd2JvYXJkaW5nLCBmYVNub3dib2FyZGluZywgZmFUdHksIGZhVGVsZXR5cGUsIGZhVXNlcnNSZWN0YW5nbGUsIGZhTW9iaWxlLCBmYU1vYmlsZUFuZHJvaWQsIGZhTW9iaWxlUGhvbmUsIGZhQXJyb3dzVHVyblRvRG90cywgZmFFeGNsYW1hdGlvbiwgZmFDaHVyY2gsIGZhVG9nZ2xlT2ZmLCBmYVNob2VQcmludHMsIGZhRmlsZUNpcmNsZUV4Y2xhbWF0aW9uLCBmYVdhbGxldCwgZmFNZXNzYWdlMiwgZmFDb21tZW50QWx0MiwgZmFUcm9waHksIGZhRmFjZURpenp5MiwgZmFEaXp6eTIsIGZhQmFjdGVyaWEsIGZhRWFyRGVhZiwgZmFEZWFmLCBmYURlYWZuZXNzLCBmYUhhcmRPZkhlYXJpbmcsIGZhUGVvcGxlQXJyb3dzLCBmYVBlb3BsZUFycm93c0xlZnRSaWdodCwgZmFIYW5kc0NsYXBwaW5nLCBmYVZpcnVzQ292aWRTbGFzaCwgZmFDYWxlbmRhckRheXMyLCBmYUNhbGVuZGFyQWx0MiwgZmFEaWFtb25kVHVyblJpZ2h0LCBmYURpcmVjdGlvbnMsIGZhSGFuZFBvaW50VXAyLCBmYUJlemllckN1cnZlLCBmYVBlcnNvbkhhbGZEcmVzcywgZmFTcXVhcmVQb2xsSG9yaXpvbnRhbCwgZmFQb2xsSCwgZmFTY2hvb2xDaXJjbGVYbWFyaywgZmFIYW5kTGl6YXJkMiwgZmFDaGFsa2JvYXJkLCBmYUJsYWNrYm9hcmQsIGZhVXBSaWdodEZyb21TcXVhcmUsIGZhRXh0ZXJuYWxMaW5rQWx0LCBmYVNxdWFyZUZ1bGwyLCBmYUNsb3ZlciwgZmFUZWV0aE9wZW4sIGZhQmFyc1N0YWdnZXJlZCwgZmFSZW9yZGVyLCBmYVN0cmVhbSwgZmFXYXJlaG91c2UsIGZhU3dhdGNoYm9vaywgZmFDYW1wZ3JvdW5kLCBmYVBlcnNvbldhbGtpbmdBcnJvd1JpZ2h0LCBmYUdsYXNzZXMsIGZhQ2lyY2xlUGF1c2UyLCBmYVBhdXNlQ2lyY2xlMiwgZmFNZW1vcnksIGZhR2lmdCwgZmFNb25leUJpbGxXaGVhdCwgZmFEdW5nZW9uLCBmYVN1aXRjYXNlTWVkaWNhbCwgZmFNZWRraXQsIGZhUGVyc29uQ2FuZSwgZmFHYXVnZSwgZmFEYXNoYm9hcmQsIGZhR2F1Z2VNZWQsIGZhVGFjaG9tZXRlckFsdEF2ZXJhZ2UsIGZhRW52ZWxvcGVPcGVuVGV4dCwgZmFUb29sYm94LCBmYVBvd2VyT2ZmLCBmYVNpZ25hbCwgZmFTaWduYWw1LCBmYVNpZ25hbFBlcmZlY3QsIGZhQXJyb3dzU3BpbiwgZmFKb2ludCwgZmFCcmFpbGxlLCBmYUJhc2tldFNob3BwaW5nLCBmYVNob3BwaW5nQmFza2V0LCBmYUJyaWRnZSwgZmFQbGFuZUFycml2YWwsIGZhQ2FzaFJlZ2lzdGVyLCBmYVJpbmcsIGZhU2hhcmVOb2RlcywgZmFTaGFyZUFsdCwgZmFQZXJzb25DaXJjbGVFeGNsYW1hdGlvbiwgZmFCaW5vY3VsYXJzLCBmYUtpcFNpZ24sIGZhSGFyZERyaXZlMiwgZmFIZGQyLCBmYVJhbmtpbmdTdGFyLCBmYVVzZXJUaWUsIGZhRWxsaXBzaXMsIGZhRWxsaXBzaXNILCBmYVN0b3JlU2xhc2gsIGZhUGVyY2VudCwgZmFQZXJjZW50YWdlLCBmYUZpbGVaaXBwZXIyLCBmYUZpbGVBcmNoaXZlMiwgZmFEaXNwbGF5LCBmYUljb25zLCBmYUhlYXJ0TXVzaWNDYW1lcmFCb2x0LCBmYVJ1bGVyVmVydGljYWwsIGZhTWFwTG9jYXRpb25Eb3QsIGZhTWFwTWFya2VkQWx0LCBmYUhlYXJ0Q3JhY2ssIGZhSGVhcnRCcm9rZW4sIGZhQ293LCBmYVJzcywgZmFGZWVkLCBmYU1hZ25pZnlpbmdHbGFzcywgZmFTZWFyY2gsIGZhQ2xvdWRNb29uLCBmYUJveGVzU3RhY2tlZCwgZmFCb3hlcywgZmFCb3hlc0FsdCwgZmFDb2RlQnJhbmNoLCBmYUJhbiwgZmFDYW5jZWwsIGZhSnVnRGV0ZXJnZW50LCBmYVJlcGx5LCBmYU1haWxSZXBseSwgZmFTdW5QbGFudFdpbHQsIGZhQmFjdGVyaXVtLCBmYVJlY29yZFZpbnlsLCBmYUZsb3BweURpc2syLCBmYVNhdmUyLCBmYVRvaWxldHNQb3J0YWJsZSwgZmFPLCBmYVBhbGV0dGUsIGZhVW5sb2NrLCBmYUVhckxpc3RlbiwgZmFBc3Npc3RpdmVMaXN0ZW5pbmdTeXN0ZW1zLCBmYUNvZGVQdWxsUmVxdWVzdCwgZmFLZXksIGZhU2t1bGwsIGZhTWFyc1N0cm9rZVVwLCBmYU1hcnNTdHJva2VWLCBmYUZpcmVGbGFtZVNpbXBsZSwgZmFCdXJuLCBmYVRyZWUsIGZhU21vZywgZmFTLCBmYUplZGksIGZhUGVyc29uSGlraW5nLCBmYUhpa2luZywgZmFBcnJvd3NVcFRvTGluZSwgZmFNYXJzRG91YmxlLCBmYVRoZXJtb21ldGVyLCBmYVBhaW50YnJ1c2gsIGZhUGFpbnRCcnVzaCwgZmFOZXV0ZXIsIGZhU3F1YXJlUGhvbmVGbGlwLCBmYVBob25lU3F1YXJlQWx0LCBmYUZhY2VHcmluVG9uZ3VlU3F1aW50MiwgZmFHcmluVG9uZ3VlU3F1aW50MiwgZmFDb21tZW50RG9sbGFyLCBmYUhpcHBvLCBmYUJvd2xGb29kLCBmYVNxdWFyZVZpcnVzLCBmYUNsb3VkU3VuUmFpbiwgZmFBcnJvd1JpZ2h0TG9uZywgZmFMb25nQXJyb3dSaWdodCwgZmFCdWlsZGluZ1VuLCBmYVRlbXBlcmF0dXJlTG93LCBmYURvb3JPcGVuLCBmYUFsaWduTGVmdCwgZmFDYW1lcmEyLCBmYUNhbWVyYUFsdDIsIGZhVXNlcnNSYXlzLCBmYVJhaW5ib3csIGZhU2l0ZW1hcCwgZmFGYWNlR3JpblN0YXJzMiwgZmFHcmluU3RhcnMyLCBmYVNvcnRVcCwgZmFTb3J0QXNjLCBmYUV5ZTIsIGZhQ2FyZXRMZWZ0LCBmYUFwcGxlV2hvbGUsIGZhQXBwbGVBbHQsIGZhU2Nyb2xsVG9yYWgsIGZhVG9yYWgsIGZhSG91c2VMb2NrLCBmYUFycm93c0xlZnRSaWdodFRvTGluZSwgZmFUcmFzaCwgZmFGYWNlU2FkVGVhcjIsIGZhU2FkVGVhcjIsIGZhRmF4LCBmYVBlcnNvbkNpcmNsZVBsdXMsIGZhSGFtc2EsIGZhUGVyc29uQ2lyY2xlUXVlc3Rpb24sIGZhQ2xpcGJvYXJkQ2hlY2ssIGZhU2hhcmVGcm9tU3F1YXJlMiwgZmFTaGFyZVNxdWFyZTIsIGZhUmVjZWlwdCwgZmFFcXVhbHMsIGZhQ2hldnJvblVwLCBmYVZpcnVzU2xhc2gsIGZhU2xhc2gsIGZhRXhwYW5kLCBmYU5vdGVTdGlja3kyLCBmYVN0aWNreU5vdGUyLCBmYVRhYmxlQ29sdW1ucywgZmFDb2x1bW5zLCBmYVBlcnNvblNoZWx0ZXIsIGZhQ2lyY2xlTm90Y2gsIGZhV2F0ZXIsIGZhRGVsZXRlTGVmdCwgZmFCYWNrc3BhY2UsIGZhQnJvb21CYWxsLCBmYVF1aWRkaXRjaCwgZmFRdWlkZGl0Y2hCcm9vbUJhbGwsIGZhSiwgZmFTaHV0dGxlU3BhY2UsIGZhU3BhY2VTaHV0dGxlLCBmYVlpbllhbmcsIGZhU3RvcCwgZmFUcm93ZWwsIGZhSGFuZEJhY2tGaXN0MiwgZmFIYW5kUm9jazIsIGZhVGVtcGVyYXR1cmVIaWdoLCBmYUdyZWF0ZXJUaGFuLCBmYUNydXRjaCwgZmFTZXB0YWdvbiwgZmFIZXB0YWdvbiwgZmFTdHJlZXRWaWV3LCBmYVdhdmVTcXVhcmUsIGZhQW5nbGVMZWZ0LCBmYVNjcmV3ZHJpdmVyLCBmYVRyYWN0b3IsIGZhQnJpZGdlQ2lyY2xlWG1hcmssIGZhVmlhbHMsIGZhU3RldGhvc2NvcGUsIGZhUG9kY2FzdCwgZmFBcnJvd1VwUmlnaHREb3RzLCBmYUNoZXNzUXVlZW4yLCBmYUFuY2hvckNpcmNsZUV4Y2xhbWF0aW9uLCBmYUVsbGlwc2lzVmVydGljYWwsIGZhRWxsaXBzaXNWLCBmYUhlYXJ0Q2lyY2xlRXhjbGFtYXRpb24sIGZhQnVpbGRpbmdDaXJjbGVFeGNsYW1hdGlvbiwgZmFQZXJzb25BcnJvd1VwRnJvbUxpbmUsIGZhTm90RXF1YWwsIGZhVHJhaW5UcmFtLCBmYVBsYW5lRGVwYXJ0dXJlLCBmYVJpZ2h0VG9CcmFja2V0LCBmYVNpZ25JbkFsdCwgZmFTZENhcmQsIGZhSG91c2VDaXJjbGVFeGNsYW1hdGlvbiwgZmFTaGVrZWxTaWduLCBmYUlscywgZmFTaGVrZWwsIGZhU2hlcWVsLCBmYVNoZXFlbFNpZ24sIGZhUmFkaW8sIGZhSGFuZERvdHMsIGZhQWxsZXJnaWVzLCBmYUJvb2tTa3VsbCwgZmFCb29rRGVhZCwgZmFVbmxvY2tLZXlob2xlLCBmYVVubG9ja0FsdCwgZmFGaWxlQXJyb3dVcCwgZmFGaWxlVXBsb2FkLCBmYUZhY2VHcmluVGVhcnMyLCBmYUdyaW5UZWFyczIsIGZhUGVuVG9TcXVhcmUyLCBmYUVkaXQyLCBmYUVhcnRoRXVyb3BlLCBmYUdsb2JlRXVyb3BlLCBmYUZhY2VHcmluQmVhbVN3ZWF0MiwgZmFHcmluQmVhbVN3ZWF0MiwgZmFDaXJjbGVIYWxmU3Ryb2tlLCBmYUFkanVzdCwgZmFQZXJzb25NaWxpdGFyeVRvUGVyc29uLCBmYVRhYmxlQ2VsbHNDb2x1bW5Mb2NrLCBmYVRydWNrRmllbGRVbiwgZmFDbG9jazIsIGZhQ2xvY2tGb3VyMiwgZmFCb29rLCBmYUZhY2VMYXVnaFdpbmsyLCBmYUxhdWdoV2luazIsIGZhQ2xvdWRNZWF0YmFsbCwgZmFDaGFydEFyZWEsIGZhQXJlYUNoYXJ0LCBmYVJ1cGlhaFNpZ24sIGZhVGV4dFdpZHRoLCBmYVNhdGVsbGl0ZSwgZmFNYWduaWZ5aW5nR2xhc3NNaW51cywgZmFTZWFyY2hNaW51cywgZmFQZW9wbGVHcm91cCwgZmFTcXVhcmVCaW5hcnksIGZhTWFza3NUaGVhdGVyLCBmYVRoZWF0ZXJNYXNrcywgZmFDYXJ0UGx1cywgZmFIYW5kc0FzbEludGVycHJldGluZywgZmFBbWVyaWNhblNpZ25MYW5ndWFnZUludGVycHJldGluZywgZmFBc2xJbnRlcnByZXRpbmcsIGZhSGFuZHNBbWVyaWNhblNpZ25MYW5ndWFnZUludGVycHJldGluZywgZmFUYWJsZUNlbGxzUm93VW5sb2NrLCBmYVJvY2tldCwgZmFTaHJpbXAsIGZhVGVuZ2VTaWduLCBmYVRlbmdlLCBmYUhvdXNlQ2hpbW5leU1lZGljYWwsIGZhQ2xpbmljTWVkaWNhbCwgZmFVc2Vyc1NsYXNoLCBmYVBhcGVyUGxhbmUyLCBmYUJvb2tBdGxhcywgZmFBdGxhcywgZmFUYWJsZSwgZmFIZWFydDIsIGZhQ2lyY2xlQ2hldnJvblVwLCBmYUNoZXZyb25DaXJjbGVVcCwgZmFCYXR0ZXJ5SGFsZiwgZmFCYXR0ZXJ5MywgZmFGb250QXdlc29tZTMsIGZhRm9udEF3ZXNvbWVGbGFnMywgZmFGb250QXdlc29tZUxvZ29GdWxsMywgZmFIYW5kY3VmZnMsIGZhSGF0Q293Ym95U2lkZSwgZmFJbmR1c3RyeSwgZmFMaW5lc0xlYW5pbmcsIGZhUGFzc3BvcnQsIGZhSW5maW5pdHksIGZhQ2xvbmUyLCBmYUZvcndhcmQsIGZhTSwgZmFSb2FkU3Bpa2VzLCBmYU1vdW50YWluLCBmYUNoZXNzLCBmYVRlbXBlcmF0dXJlVGhyZWVRdWFydGVycywgZmFUZW1wZXJhdHVyZTMsIGZhVGhlcm1vbWV0ZXIzLCBmYVRoZXJtb21ldGVyVGhyZWVRdWFydGVycywgZmFCLCBmYVNoaWVsZFZpcnVzLCBmYUxpdGVjb2luU2lnbiwgZmFEaWNlRDYsIGZhR3JpcExpbmVzVmVydGljYWwsIGZhR29sZkJhbGxUZWUsIGZhR29sZkJhbGwsIGZhSGV4YWdvbiwgZmFGb2xkZXJPcGVuMiwgZmFLYWFiYSwgZmFIYW5kSG9sZGluZywgZmFTaW5nbGVRdW90ZVJpZ2h0LCBmYUJvdHRsZURyb3BsZXQsIGZhV2luZG93TWluaW1pemUyLCBmYUNoZXZyb25SaWdodCwgZmFFZ2csIGZhTGFuZG1hcmtEb21lLCBmYUxhbmRtYXJrQWx0LCBmYVdvcm0sIGZhVXNlckluanVyZWQsIGZhU3RyaWtldGhyb3VnaCwgZmFCbG9nLCBmYVN0b3B3YXRjaDIwLCBmYVRydWNrUGlja3VwLCBmYVNlZWRsaW5nLCBmYVNwcm91dCwgZmFUcmFuc2dlbmRlciwgZmFUcmFuc2dlbmRlckFsdCwgZmFTdGFySGFsZjIsIGZhUGhvdG9GaWxtLCBmYVBob3RvVmlkZW8sIGZhUHVtcE1lZGljYWwsIGZhRmlyZSwgZmFNYWduaWZ5aW5nR2xhc3NQbHVzLCBmYVNlYXJjaFBsdXMsIGZhRmxhc2ssIGZhQWxpZ25SaWdodCwgZmFDYWJsZUNhciwgZmFUcmFtLCBmYUtpdE1lZGljYWwsIGZhRmlyc3RBaWQsIGZhR3JpcExpbmVzLCBmYUJ1cmdlciwgZmFIYW1idXJnZXIsIGZhU25vd21hbiwgZmFIb3RlbCwgZmFQcmludCwgZmFWb2xsZXliYWxsLCBmYVZvbGxleWJhbGxCYWxsLCBmYVRyYWZmaWNMaWdodCwgZmFQbGFuZUNpcmNsZUNoZWNrLCBmYVVzZXJzLCBmYUNlcnRpZmljYXRlLCBmYUFsYXJtQ2xvY2syLCBmYUhlbGljb3B0ZXJTeW1ib2wsIGZhSG91c2VDaGltbmV5Q3JhY2ssIGZhSG91c2VEYW1hZ2UsIGZhUGVyc29uTWlsaXRhcnlQb2ludGluZywgZmFEYXRhYmFzZSwgZmFOZXdzcGFwZXIyLCBmYUNsb3VkUmFpbiwgZmFNYXhpbWl6ZSwgZmFFeHBhbmRBcnJvd3NBbHQsIGZhTG9jYXRpb25BcnJvdywgZmFDaXR5LCBmYVhSYXksIGZhVW1icmVsbGFCZWFjaCwgZmFBcnJvd1JpZ2h0VG9CcmFja2V0LCBmYVNpZ25JbiwgZmFIZWFkc2V0LCBmYVNwbG90Y2gsIGZhVXBMb25nLCBmYUxvbmdBcnJvd0FsdFVwLCBmYUhleGFnb25Ob2RlcywgZmFIb3NwaXRhbDIsIGZhSG9zcGl0YWxBbHQyLCBmYUhvc3BpdGFsV2lkZTIsIGZhUGVyc29uSGFyYXNzaW5nLCBmYU1vbmV5QmlsbFRyZW5kVXAsIGZhUGVuUnVsZXIsIGZhUGVuY2lsUnVsZXIsIGZhUmVwZWF0LCBmYUJvbmUsIGZhRmlyZUZsYW1lQ3VydmVkLCBmYUZpcmVBbHQsIGZhQnVzU2ltcGxlLCBmYUJ1c0FsdCwgZmFWZW51c01hcnMsIGZhQmxlbmRlciwgZmFVLCBmYVNoYXJlLCBmYU1haWxGb3J3YXJkLCBmYVBob25lRmxpcCwgZmFQaG9uZUFsdCwgZmFUb2lsZXRQb3J0YWJsZSwgZmFQZXJzb25QcmVnbmFudCwgZmFMZXNzVGhhbiwgZmFTdXBlcnNjcmlwdCwgZmFDaXJjbGVTdG9wMiwgZmFTdG9wQ2lyY2xlMiwgZmFBcnJvd3NVcERvd24sIGZhQXJyb3dzViwgZmFQb29TdG9ybSwgZmFQb29Cb2x0LCBmYVZpZGVvU2xhc2gsIGZhU3F1YXJlWG1hcmssIGZhVGltZXNTcXVhcmUsIGZhWG1hcmtTcXVhcmUsIGZhSGFuZEhvbGRpbmdEcm9wbGV0LCBmYUhhbmRIb2xkaW5nV2F0ZXIsIGZhV29uU2lnbiwgZmFLcncsIGZhV29uLCBmYU9iamVjdFVuZ3JvdXAyLCBmYUNvbW1lbnQyLCBmYUhpbGxBdmFsYW5jaGUsIGZhQXJyb3dzVG9FeWUsIGZhU25vd3Bsb3csIGZhQ2hhcnRHYW50dCwgZmFWaWRlbywgZmFWaWRlb0NhbWVyYSwgZmFDaGVzc1Bhd24yLCBmYVN5bmFnb2d1ZSwgZmFCdWlsZGluZ0NpcmNsZUNoZWNrLCBmYUNhbGVuZGFyUGx1czIsIGZhV2hlZWxjaGFpck1vdmUsIGZhV2hlZWxjaGFpckFsdCwgZmFVc2VyU2hpZWxkLCBmYUJvbGQsIGZhSGVhcnRQdWxzZSwgZmFIZWFydGJlYXQsIGZhU3F1YXJlUm9vdFZhcmlhYmxlLCBmYVNxdWFyZVJvb3RBbHQsIGZhSGFuZHNCdWJibGVzLCBmYUhhbmRzV2FzaCwgZmFNYXJrZXIsIGZhQ2xpcGJvYXJkMiwgZmFQbGFjZU9mV29yc2hpcCwgZmFDYW5uYWJpcywgZmFQZW9wbGVSb29mLCBmYURpc2Vhc2UsIGZhQm9va0JpYmxlLCBmYUJpYmxlLCBmYUNoZXNzQm9hcmQsIGZhTWFycywgZmFMYXB0b3AsIGZhVXNlclhtYXJrLCBmYVVzZXJUaW1lcywgZmFGbGFnVXNhLCBmYUhhbmRNaWRkbGVGaW5nZXIsIGZhTW9ydGFyUGVzdGxlLCBmYUhlYWRTaWRlQ291Z2gsIGZhUGxhbmVMb2NrLCBmYUJhdHRlcnlUaHJlZVF1YXJ0ZXJzLCBmYUJhdHRlcnk0LCBmYUZyYW5jU2lnbiwgZmFGaWx0ZXJDaXJjbGVEb2xsYXIsIGZhRnVubmVsRG9sbGFyLCBmYUNoZWVzZSwgZmFDaXJjbGVILCBmYUhvc3BpdGFsU3ltYm9sLCBmYVNjaG9vbCwgZmFEaWNlRml2ZSwgZmFUb3JuYWRvLCBmYUpldEZpZ2h0ZXIsIGZhRmlnaHRlckpldCwgZmFUaHVtYnNEb3duMiwgZmFCcm9vbSwgZmFGaWxlSW1wb3J0LCBmYUFycm93UmlnaHRUb0ZpbGUsIGZhVXRlbnNpbHMsIGZhQ3V0bGVyeSwgZmFJZEJhZGdlMiwgZmFTcGlkZXIsIGZhTW9iaWxlUmV0cm8sIGZhU2lnbnNQb3N0LCBmYU1hcFNpZ25zLCBmYUdyb3VwQXJyb3dzUm90YXRlLCBmYUFycm93c1NwbGl0VXBBbmRMZWZ0LCBmYUZpbGxEcmlwLCBmYVNoaWVsZEhlYXJ0LCBmYVBlcnNvblNraWluZ05vcmRpYywgZmFTa2lpbmdOb3JkaWMsIGZhU3F1YXJlQ2hlY2syLCBmYUNoZWNrU3F1YXJlMiwgZmFCYXRoLCBmYUJhdGh0dWIsIGZhQ2hlc3NCaXNob3AyLCBmYVByZXNjcmlwdGlvbkJvdHRsZU1lZGljYWwsIGZhUHJlc2NyaXB0aW9uQm90dGxlQWx0LCBmYURyYXdQb2x5Z29uLCBmYVZlY3RvclBvbHlnb24sIGZhSUN1cnNvciwgZmFIZWFydENpcmNsZVBsdXMsIGZhU2hpZWxkRG9nLCBmYUdyZWF0ZXJUaGFuRXF1YWwsIGZhRW52ZWxvcGVPcGVuMiwgZmFNb3VuZCwgZmFWb2ljZW1haWwsIGZhVmVzdCwgZmFBdWRpb0Rlc2NyaXB0aW9uLCBmYVcsIGZhRXllRHJvcHBlciwgZmFFeWVEcm9wcGVyRW1wdHksIGZhRXllZHJvcHBlciwgZmFDaXJjbGVYbWFyazIsIGZhVGltZXNDaXJjbGUyLCBmYVhtYXJrQ2lyY2xlMiwgZmFUcmFpbGVyLCBmYVR1cmtpc2hMaXJhU2lnbiwgZmFUcnksIGZhVHVya2lzaExpcmEsIGZhVm9sY2FubywgZmFXYW5kU3BhcmtsZXMsIGZhTWljcm9waG9uZSwgZmFDcm93biwgZmFUZW50QXJyb3dUdXJuTGVmdCwgZmFUcnVja0Zhc3QsIGZhU2hpcHBpbmdGYXN0LCBmYVVzZXJQZW4sIGZhVXNlckVkaXQsIGZhVXNlckNsb2NrLCBmYVNob3dlciwgZmFTcXVhcmVDYXJldFVwMiwgZmFDYXJldFNxdWFyZVVwMiwgZmFNYXBMb2NhdGlvbiwgZmFNYXBNYXJrZWQsIGZhUGVuRmFuY3ksIGZhRXVyb1NpZ24sIGZhRXVyLCBmYUV1cm8sIGZhSG91c2VDaXJjbGVYbWFyaywgZmFMaXJhU2lnbiwgZmFZZW5TaWduLCBmYUNueSwgZmFKcHksIGZhUm1iLCBmYVllbiwgZmFCb3hPcGVuLCBmYVRydWNrRmllbGQsIGZhTG9jYXRpb25QaW5Mb2NrLCBmYVBlcnNvblByYXlpbmcsIGZhUHJheSwgZmFDbGlwYm9hcmRMaXN0LCBmYVNhY2tEb2xsYXIsIGZhTW91bnRhaW5TdW4sIGZhQXJyb3dVcFdpZGVTaG9ydCwgZmFTb3J0QW1vdW50VXAsIGZhVXNlcnNMaW5lLCBmYVN0YXJPZkRhdmlkLCBmYU5vdGVzTWVkaWNhbCwgZmFBdXN0cmFsU2lnbiwgZmFDbGlwYm9hcmRVc2VyLCBmYUZpbGVJbWFnZTIsIGZhU3F1YXJlQ2FyZXRSaWdodDIsIGZhQ2FyZXRTcXVhcmVSaWdodDIsIGZhVmlhbCwgZmFIZWxpY29wdGVyLCBmYU1pdHRlbiwgZmFHYXNQdW1wLCBmYUVudmVsb3BlQ2lyY2xlQ2hlY2ssIGZhUGVyc29uU2thdGluZywgZmFTa2F0aW5nLCBmYVN1bjIsIGZhQmFzZWJhbGwsIGZhQmFzZWJhbGxCYWxsLCBmYUltYWdlMiwgZmFOb3RkZWYsIGZhQmFza2V0YmFsbCwgZmFCYXNrZXRiYWxsQmFsbCwgZmFQZW5jaWwsIGZhUGVuY2lsQWx0LCBmYVBlcnNvbldhbGtpbmdBcnJvd0xvb3BMZWZ0LCBmYURpY2VTaXgsIGZhQW5nbGVzRG93biwgZmFBbmdsZURvdWJsZURvd24sIGZhU3lyaW5nZSwgZmFXaGVhdEF3biwgZmFXaGVhdEFsdCwgZmFQbGFuZVVwLCBmYUFsaWduQ2VudGVyLCBmYUhvY2tleVB1Y2ssIGZhQ2lyY2xlQXJyb3dMZWZ0LCBmYUFycm93Q2lyY2xlTGVmdCwgZmFQbHVnQ2lyY2xlQm9sdCwgZmFSZXN0cm9vbSwgZmFBbmNob3JMb2NrLCBmYVRpbWVsaW5lLCBmYUxpZ2h0YnVsYjIsIGZhQ2lyY2xlQXJyb3dSaWdodCwgZmFBcnJvd0NpcmNsZVJpZ2h0LCBmYU1hcnNBbmRWZW51cywgZmFOZXR3b3JrV2lyZWQsIGZhQnVpbGRpbmdTaGllbGQsIGZhQ29kZSwgZmFGZWF0aGVyUG9pbnRlZCwgZmFGZWF0aGVyQWx0LCBmYUZpbGVDaXJjbGVRdWVzdGlvbiwgZmFTaWduYXR1cmUsIGZhRWFydGhBbWVyaWNhcywgZmFFYXJ0aCwgZmFFYXJ0aEFtZXJpY2EsIGZhR2xvYmVBbWVyaWNhcywgZmFDYXJyb3QsIGZhVGVtcGVyYXR1cmVGdWxsLCBmYVRlbXBlcmF0dXJlNCwgZmFUaGVybW9tZXRlcjQsIGZhVGhlcm1vbWV0ZXJGdWxsLCBmYVRhYmxlQ2VsbHNSb3dMb2NrLCBmYUJvbHRMaWdodG5pbmcsIGZhQ2xvdWRTaG93ZXJzV2F0ZXIsIGZhQXJyb3dVcExvbmcsIGZhTG9uZ0Fycm93VXAsIGZhQWRkcmVzc0NhcmQyLCBmYUNvbnRhY3RDYXJkMiwgZmFWY2FyZDIsIGZhQW5nbGVSaWdodCwgZmFGYWNlTWVoMiwgZmFNZWgyLCBmYUFycm93VXBGcm9tR3JvdW5kV2F0ZXIsIGZhTWFwMiwgZmFVc2VyUGx1cywgZmFWZW51cywgZmFEaWFncmFtU3VjY2Vzc29yLCBmYUhlYWRTaWRlQ291Z2hTbGFzaCwgZmFEaWFncmFtUHJvamVjdCwgZmFQcm9qZWN0RGlhZ3JhbSwgZmFUZXJtaW5hbCwgZmFIb3VzZUZpcmUsIGZhTWFzaywgZmFIdXJyaWNhbmUsIGZhRWFydGhBZnJpY2EsIGZhR2xvYmVBZnJpY2EsIGZhVGh1bWJ0YWNrLCBmYVRodW1iVGFjaywgZmFIYW5kUG9pbnREb3duMiwgZmFGYWNlTWVoQmxhbmsyLCBmYU1laEJsYW5rMiwgZmFUZW1wZXJhdHVyZUVtcHR5LCBmYVRlbXBlcmF0dXJlMCwgZmFUaGVybW9tZXRlcjAsIGZhVGhlcm1vbWV0ZXJFbXB0eSwgZmFCb3JkZXJOb25lLCBmYUhpZ2hsaWdodGVyLCBmYU1vbmV5QmlsbFdhdmUsIGZhVG9pbGV0UGFwZXJTbGFzaCwgZmFGaWxlU2hpZWxkLCBmYVRleHRIZWlnaHQsIGZhRmFjZUdyaW5Ub25ndWUyLCBmYUdyaW5Ub25ndWUyLCBmYUZpbGVTaWduYXR1cmUsIGZhQnVpbGRpbmdXaGVhdCwgZmFQbHVnQ2lyY2xlTWludXMsIGZhRnV0Ym9sMiwgZmFGdXRib2xCYWxsMiwgZmFTb2NjZXJCYWxsMiwgZmFDaXJjbGVQbHVzLCBmYVBsdXNDaXJjbGUsIGZhQnJhemlsaWFuUmVhbFNpZ24sIGZhU3RhckFuZENyZXNjZW50LCBmYUZhY2VTdXJwcmlzZTIsIGZhU3VycHJpc2UyLCBmYUhvc3BpdGFsVXNlciwgZmFBcnJvd0Rvd25VcExvY2ssIGZhRm9sZGVyMiwgZmFGb2xkZXJCbGFuazIsIGZhSG9sbHlCZXJyeSwgZmFWZW51c0RvdWJsZSwgZmFDbGlwYm9hcmRRdWVzdGlvbiwgZmFIb3Rkb2csIGZhQXJyb3dVcEZyb21CcmFja2V0LCBmYU1pY3Jvc2NvcGUsIGZhQ2xvdWQyLCBmYUJhc2ViYWxsQmF0QmFsbCwgZmFDYXJSZWFyLCBmYUNhckFsdCwgZmFUaHVtYnRhY2tTbGFzaCwgZmFUaHVtYlRhY2tTbGFzaCwgZmFQbHVzTWludXMsIGZhSG91c2VDaXJjbGVDaGVjaywgZmFDYWxlbmRhckRheSwgZmFDaXJjbGUyLCBmYU1vYmlsZVZpYnJhdGUsIGZhRmFjZUdyaW5TcXVpbnQyLCBmYUdyaW5TcXVpbnQyLCBmYVVzZXJzQmV0d2VlbkxpbmVzLCBmYUhvdXNlTWVkaWNhbENpcmNsZVhtYXJrLCBmYVRhYmxlTGlzdCwgZmFUaExpc3QsIGZhRmxhc2tWaWFsLCBmYUNpcmNsZUV4Y2xhbWF0aW9uLCBmYUV4Y2xhbWF0aW9uQ2lyY2xlLCBmYVRheGksIGZhQ2FiLCBmYVRleHRTbGFzaCwgZmFSZW1vdmVGb3JtYXQsIGZhUGVvcGxlUHVsbGluZywgZmFCYWNrd2FyZCwgZmFDYXJCdXJzdCwgZmFDYXJDcmFzaCwgZmFMaW5rLCBmYUNoYWluLCBmYUJhY2t3YXJkU3RlcCwgZmFTdGVwQmFja3dhcmQsIGZhWCwgZmFDaXJjbGVVc2VyMiwgZmFVc2VyQ2lyY2xlMiwgZmFSZWN0YW5nbGVMaXN0MiwgZmFMaXN0QWx0MiwgZmFIYW5kMiwgZmFIYW5kUGFwZXIyLCBmYVZhblNodXR0bGUsIGZhU2h1dHRsZVZhbiwgZmFTdGFpcnMsIGZhSG9yc2VIZWFkLCBmYVZhdWx0LCBmYURydW1TdGVlbHBhbiwgZmFUaHVtYnNVcDIsIGZhU3RhbXAsIGZhTWVub3JhaCwgZmFDaGlsZHJlbiwgZmFDaGFydExpbmUsIGZhTGluZUNoYXJ0LCBmYVNxdWFyZUVudmVsb3BlLCBmYUVudmVsb3BlU3F1YXJlLCBmYUJhblNtb2tpbmcsIGZhU21va2luZ0JhbiwgZmFUcnVja0Zyb250LCBmYUJ1aWxkaW5nMiwgZmFCdWxsc2V5ZSwgZmFBcnJvd0xlZnRMb25nLCBmYUxvbmdBcnJvd0xlZnQsIGZhQ2hlc3NSb29rMiwgZmFCbGVuZGVyUGhvbmUsIGZhQXJyb3dUdXJuVXAsIGZhTGV2ZWxVcCwgZmFCaWN5Y2xlLCBmYUNpcmNsZUFycm93RG93biwgZmFBcnJvd0NpcmNsZURvd24sIGZhR2VhciwgZmFDb2csIGZhTWFyc0FuZFZlbnVzQnVyc3QsIGZhT3R0ZXIsIGZhQ2lyY2xlQ2hldnJvbkxlZnQsIGZhQ2hldnJvbkNpcmNsZUxlZnQsIGZhQ2lyY2xlUXVlc3Rpb24yLCBmYVF1ZXN0aW9uQ2lyY2xlMiwgZmFXYWxraWVUYWxraWUsIGZhVXNlckdyb3VwLCBmYVVzZXJGcmllbmRzLCBmYUhvdXNlQ2hpbW5leSwgZmFIb21lTGcsIGZhUmlnaHRGcm9tQnJhY2tldCwgZmFTaWduT3V0QWx0LCBmYUZpbGUyLCBmYVBsYW5lU2xhc2gsIGZhQ2xvdWRTaG93ZXJzSGVhdnksIGZhUGVyc29uRmFsbGluZywgZmFUdXJuRG93biwgZmFMZXZlbERvd25BbHQsIGZhVXBSaWdodEFuZERvd25MZWZ0RnJvbUNlbnRlciwgZmFFeHBhbmRBbHQsIGZhVXNlclRhZywgZmFIYW5kU3BhcmtsZXMsIGZhQXJyb3dzVG9Eb3QsIGZhRmFjZVNhZENyeTIsIGZhU2FkQ3J5MiwgZmFEb25nU2lnbiwgZmFQZW9wbGVMaW5lLCBmYVNxdWFyZVJzcywgZmFSc3NTcXVhcmUsIGZhQ2FsZW5kYXJNaW51czIsIGZhQ2hhcnREaWFncmFtLCBmYUZhY2VUaXJlZDIsIGZhVGlyZWQyLCBmYUhhbmRQb2ludFJpZ2h0MiwgZmFBcnJvd1VwLCBmYUN1YmVzU3RhY2tlZCwgZmFDaGlsZENvbWJhdGFudCwgZmFDaGlsZFJpZmxlLCBmYVZlc3RQYXRjaGVzLCBmYU1hcnRpbmlHbGFzc0VtcHR5LCBmYUdsYXNzTWFydGluaSwgZmFNYWduZXQsIGZhUm9hZEJhcnJpZXIsIGZhQ29tcGFzc0RyYWZ0aW5nLCBmYURyYWZ0aW5nQ29tcGFzcywgZmFTcXVhcmVQZXJzb25Db25maW5lZCwgZmFQbGF0ZVdoZWF0LCBmYVNpZ25IYW5naW5nLCBmYVNpZ24sIGZhQ2FyQmF0dGVyeSwgZmFCYXR0ZXJ5Q2FyLCBmYVNoaXJ0LCBmYVRTaGlydCwgZmFUc2hpcnQsIGZhUGFyYWdyYXBoLCBmYUVudmVsb3Blc0J1bGssIGZhTWFpbEJ1bGssIGZhR3VpdGFyLCBmYVN1aXRjYXNlLCBmYUNpcmNsZVVwMiwgZmFBcnJvd0FsdENpcmNsZVVwMiwgZmFGLCBmYVhtYXJrc0xpbmVzLCBmYUVhcnRoT2NlYW5pYSwgZmFHbG9iZU9jZWFuaWEsIGZhQ29tbWVudFNsYXNoLCBmYVBsYXksIGZhVmlhbENpcmNsZUNoZWNrLCBmYUJyaWRnZUNpcmNsZUNoZWNrLCBmYUNlZGlTaWduLCBmYVB1enpsZVBpZWNlLCBmYUhlbG1ldFVuLCBmYUdsYXNzV2F0ZXIsIGZhSGVhcnRDaXJjbGVCb2x0LCBmYVB1bXBTb2FwLCBmYUhhbmRTY2lzc29yczIsIGZhRG9sbHksIGZhRG9sbHlCb3gsIGZhUGFwZXJjbGlwLCBmYURlbW9jcmF0LCBmYVNxdWFyZUFycm93VXBSaWdodCwgZmFFeHRlcm5hbExpbmtTcXVhcmUsIGZhRmVycnksIGZhTW9zcXVpdG8sIGZhQnVpbGRpbmdDaXJjbGVBcnJvd1JpZ2h0LCBmYUxlZnRSaWdodCwgZmFBcnJvd3NBbHRILCBmYVZpcnVzLCBmYUdlbTIsIGZhVG9pbGV0LCBmYVNpbmdsZVF1b3RlTGVmdCwgZmFNb25leUJpbGxzLCBmYVRhYmxldEJ1dHRvbiwgZmFSZWN0YW5nbGVYbWFyazIsIGZhUmVjdGFuZ2xlVGltZXMyLCBmYVRpbWVzUmVjdGFuZ2xlMiwgZmFXaW5kb3dDbG9zZTIsIGZhV3JlbmNoLCBmYVRyYXNoQ2FuMiwgZmFUcmFzaEFsdDIsIGZhVGFibGVDZWxscywgZmFUaCwgZmFSaWJib24sIGZhTGFuZG1hcmtGbGFnLCBmYVVwRG93bkxlZnRSaWdodCwgZmFBcnJvd3NBbHQsIGZhQ2FyU2lkZSwgZmFUcmFzaEFycm93VXAsIGZhVHJhc2hSZXN0b3JlLCBmYUxpZmVSaW5nMiwgZmFDb3B5cmlnaHQyLCBmYUZpbGVQcmVzY3JpcHRpb24sIGZhRXJhc2VyLCBmYUhvdXJnbGFzc1N0YXJ0LCBmYUhvdXJnbGFzczEsIGZhQ2lyY2xlTGVmdDIsIGZhQXJyb3dBbHRDaXJjbGVMZWZ0MiwgZmFDcnV6ZWlyb1NpZ24sIGZhU21va2luZywgZmFTcXVhcmVQb2xsVmVydGljYWwsIGZhUG9sbCwgZmFQZXJzb25DaXJjbGVNaW51cywgZmFCaW9oYXphcmQsIGZhQmVsbENvbmNpZXJnZSwgZmFDb25jaWVyZ2VCZWxsLCBmYVJ1bGVySG9yaXpvbnRhbCwgZmFIb3JzZSwgZmFDYWxlbmRhcjIsIGZhSGFuZHNIb2xkaW5nQ2hpbGQsIGZhSXRhbGljLCBmYUtoYW5kYSwgZmFGYWNlRnJvd25PcGVuMiwgZmFGcm93bk9wZW4yLCBmYUNoZWNrLCBmYUZpbmdlcnByaW50LCBmYUNoYXJnaW5nU3RhdGlvbiwgZmFVc2VyTG9jaywgZmFNb2JpbGVTY3JlZW5CdXR0b24sIGZhTW9iaWxlQWx0LCBmYUFuY2hvckNpcmNsZUNoZWNrLCBmYVBlcnNvbldhbGtpbmdXaXRoQ2FuZSwgZmFCbGluZCwgZmFGaWxlV2F2ZWZvcm0sIGZhRmlsZU1lZGljYWxBbHQsIGZhSG91c2VDcmFjaywgZmFIYXRXaXphcmQsIGZhVXNlckRvY3RvciwgZmFVc2VyTWQsIGZhQ2hhcnRCYXIyLCBmYUJhckNoYXJ0MiwgZmFTcHJheUNhblNwYXJrbGVzLCBmYUFpckZyZXNoZW5lciwgZmFCYWh0U2lnbiwgZmFUZW1wZXJhdHVyZUFycm93VXAsIGZhVGVtcGVyYXR1cmVVcCwgZmFXZWJBd2Vzb21lMiwgZmFOb25CaW5hcnksIGZhTiwgZmFBcnJvd3NVcERvd25MZWZ0UmlnaHQsIGZhQXJyb3dzLCBmYUhvdXNlMiwgZmFIb21lMiwgZmFIb21lQWx0MiwgZmFIb21lTGdBbHQyLCBmYVNwaW5uZXIsIGZhR2F2ZWwsIGZhTGVnYWwsIGZhVGlja2V0U2ltcGxlLCBmYVRpY2tldEFsdCwgZmFEb3ZlLCBmYVRhcnBEcm9wbGV0LCBmYVRyZWVDaXR5LCBmYVR1cm5VcCwgZmFMZXZlbFVwQWx0LCBmYVRlbXBlcmF0dXJlUXVhcnRlciwgZmFUZW1wZXJhdHVyZTEsIGZhVGhlcm1vbWV0ZXIxLCBmYVRoZXJtb21ldGVyUXVhcnRlciwgZmFTbGlkZXJzLCBmYVNsaWRlcnNILCBmYU1vc3F1ZSwgZmFILCBmYUluZm8sIGZhUGVyc29uV2Fsa2luZywgZmFXYWxraW5nLCBmYUFycm93VHVybkRvd24sIGZhTGV2ZWxEb3duLCBmYVJvYWQsIGZhU3BpcmFsLCBmYUZhY2VGcm93bjIsIGZhRnJvd24yLCBmYVdpbmVHbGFzc0VtcHR5LCBmYVdpbmVHbGFzc0FsdCwgZmFDbGFwcGVyYm9hcmQsIGZhRm9yd2FyZFN0ZXAsIGZhU3RlcEZvcndhcmQsIGZhU3F1YXJlVXBSaWdodCwgZmFFeHRlcm5hbExpbmtTcXVhcmVBbHQsIGZhQm9va0pvdXJuYWxXaGlsbHMsIGZhSm91cm5hbFdoaWxscywgZmFDaGFtcGFnbmVHbGFzc2VzLCBmYUdsYXNzQ2hlZXJzLCBmYUR1bXBzdGVyLCBmYUhlYXJ0Q2lyY2xlWG1hcmssIGZhQ29tcHV0ZXIsIGZhV2FuZE1hZ2ljLCBmYU1hZ2ljLCBmYUJyYWluLCBmYUJyaWVmY2FzZU1lZGljYWwsIGZhSG91c2VNZWRpY2FsQ2lyY2xlRXhjbGFtYXRpb24sIGZhQ29kZUNvbW1pdCwgZmFQZXJzb25CcmVhc3RmZWVkaW5nLCBmYVBlcnNvblJheXMsIGZhTWFuYXRTaWduLCBmYVNvcnQsIGZhVW5zb3J0ZWQsIGZhQ2lyY2xlUmFkaWF0aW9uLCBmYVJhZGlhdGlvbkFsdCwgZmFMYXB0b3BDb2RlLCBmYVNpbmssIGZhQXJyb3dVcEZyb21XYXRlclB1bXAsIGZhTWljcm9waG9uZUxpbmVzU2xhc2gsIGZhTWljcm9waG9uZUFsdFNsYXNoLCBmYVNlcnZlciwgZmFVc2VyMiwgZmFVc2VyQWx0MiwgZmFVc2VyTGFyZ2UyLCBmYVNub3dmbGFrZTIsIGZhU2t1bGxDcm9zc2JvbmVzLCBmYVBlc29TaWduLCBmYVdpbmVHbGFzcywgZmFUZW1wZXJhdHVyZUhhbGYsIGZhVGVtcGVyYXR1cmUyLCBmYVRoZXJtb21ldGVyMiwgZmFUaGVybW9tZXRlckhhbGYsIGZhVGlja2V0LCBmYVdoZWF0QXduQ2lyY2xlRXhjbGFtYXRpb24sIGZhQXJyb3dzVHVyblJpZ2h0LCBmYUNhbmR5Q2FuZSwgZmFXaGVlbGNoYWlyLCBmYVNwZWxsQ2hlY2ssIGZhVm9sdW1lT2ZmLCBmYUx1bmdzLCBmYUJvb2ttYXJrMiwgZmFCYXJjb2RlLCBmYUxpc3RPbCwgZmFMaXN0MTIsIGZhTGlzdE51bWVyaWMsIGZhRmlsZUNpcmNsZVhtYXJrLCBmYUN1YmUsIGZhVGFwZSwgZmFCb21iLCBmYVNjYWxlVW5iYWxhbmNlZCwgZmFCYWxhbmNlU2NhbGVMZWZ0LCBmYVNxdWFyZUNhcmV0TGVmdDIsIGZhQ2FyZXRTcXVhcmVMZWZ0MiwgZmFSdWxlciwgZmFJLCBmYVZvbHVtZVhtYXJrLCBmYVZvbHVtZU11dGUsIGZhVm9sdW1lVGltZXMsIGZhQXJjaHdheSwgZmFQZXJzb25EaWdnaW5nLCBmYURpZ2dpbmcsIGZhR2F1Z2VIaWdoLCBmYVRhY2hvbWV0ZXJBbHQsIGZhVGFjaG9tZXRlckFsdEZhc3QsIGZhR2VuZGVybGVzcywgZmFDbG91ZFN1biwgZmFBcnJvd1JpZ2h0LCBmYUhhbmRzaGFrZTIsIGZhSGFuZHNoYWtlQWx0MiwgZmFIYW5kc2hha2VTaW1wbGUyLCBmYVBlcnNvblNraWluZywgZmFTa2lpbmcsIGZhQnJpZGdlV2F0ZXIsIGZhQnVpbGRpbmdOZ28sIGZhSWdsb28sIGZhQ2lyY2xlRG9sbGFyVG9TbG90LCBmYURvbmF0ZSwgZmFZLCBmYUZhY2VTbWlsZVdpbmsyLCBmYVNtaWxlV2luazIsIGZhRGljZUZvdXIsIGZhRmFjZUdyaW5TcXVpbnRUZWFyczIsIGZhR3JpblNxdWludFRlYXJzMiwgZmFGaWxlQXVkaW8yLCBmYUFycm93c0Rvd25Ub0xpbmUsIGZhRywgZmFWaWhhcmEsIGZhRmxhZ0NoZWNrZXJlZCwgZmFHYXVnZVNpbXBsZSwgZmFHYXVnZVNpbXBsZU1lZCwgZmFUYWNob21ldGVyQXZlcmFnZSwgZmFSaWdodExlZnQsIGZhRXhjaGFuZ2VBbHQsIGZhUGlsbHMsIGZhRXhwbG9zaW9uLCBmYUFycm93c0Rvd25Ub1Blb3BsZSwgZmFVc2Vyc1ZpZXdmaW5kZXIsIGZhQ2FyT24sIGZhU2xlaWdoLCBmYUR1bWJiZWxsLCBmYUJhYnlDYXJyaWFnZSwgZmFDYXJyaWFnZUJhYnksIGZhS2l3aUJpcmQsIGZhQ2FsZW5kYXJYbWFyazIsIGZhQ2FsZW5kYXJUaW1lczIsIGZhQ2lyY2xlRG93bjIsIGZhQXJyb3dBbHRDaXJjbGVEb3duMiwgZmFGaWxlTWVkaWNhbCwgZmFYbWFyaywgZmFDbG9zZSwgZmFNdWx0aXBseSwgZmFSZW1vdmUsIGZhVGltZXMsIGZhU2hhcGVzLCBmYVRyaWFuZ2xlQ2lyY2xlU3F1YXJlLCBmYURpY2VPbmUsIGZhTG9ja09wZW4sIGZhUGVwcGVySG90LCBmYURyb3BsZXRTbGFzaCwgZmFUaW50U2xhc2gsIGZhRHJvcGxldCwgZmFUaW50LCBmYUZpbGVMaW5lczIsIGZhRmlsZUFsdDIsIGZhRmlsZVRleHQyLCBmYUNvbW1lbnRzRG9sbGFyLCBmYU1hZ25pZnlpbmdHbGFzc0xvY2F0aW9uLCBmYVNlYXJjaExvY2F0aW9uLCBmYUZpbGVJbnZvaWNlLCBmYVBlbnRhZ29uLCBmYVJlcHVibGljYW4sIGZhU2hvcCwgZmFTdG9yZUFsdCwgZmFGaWxtLCBmYUZpbG1BbHQsIGZhRmlsbVNpbXBsZSwgZmFCdWlsZGluZ0NpcmNsZVhtYXJrLCBmYUNvbW1lbnRzMiwgZmFUYWdzLCBmYUd1biwgZmFDaXJjbGVDaGVjazIsIGZhQ2hlY2tDaXJjbGUyLCBmYUlkQ2FyZENsaXAsIGZhSWRDYXJkQWx0LCBmYU1vb24yLCBmYU9pbFdlbGwsIGZhVGFjaG9ncmFwaERpZ2l0YWwsIGZhRGlnaXRhbFRhY2hvZ3JhcGgsIGZhVGFibGV0LCBmYVRhYmxldEFuZHJvaWQsIGZhUnVibGVTaWduLCBmYVJvdWJsZSwgZmFSdWIsIGZhUnVibGUsIGZhQ2xvc2VkQ2FwdGlvbmluZzIsIGZhUGVuLCBmYVBsYW5lLCBmYUltYWdlczIsIGZhTW9iaWxlU2NyZWVuLCBmYU1vYmlsZUFuZHJvaWRBbHQsIGZhR3VhcmFuaVNpZ24sIGZhQmFnU2hvcHBpbmcsIGZhU2hvcHBpbmdCYWcsIGZhQ2lyY2xlUmlnaHQyLCBmYUFycm93QWx0Q2lyY2xlUmlnaHQyLCBmYVBob25lVm9sdW1lLCBmYVZvbHVtZUNvbnRyb2xQaG9uZSwgZmFDdWJlcywgZmFQaG9uZSwgZmFUb3JpaUdhdGUsIGZhQmFjb24sIGZhUGVyc29uRmFsbGluZ0J1cnN0LCBmYVF1b3RlUmlnaHQsIGZhUXVvdGVSaWdodEFsdCwgZmFIb3VzZU1lZGljYWxGbGFnLCBmYVByZXNjcmlwdGlvbiwgZmFEaWNlVGhyZWUsIGZhQnVpbGRpbmdMb2NrLCBmYUlkQ2FyZDIsIGZhRHJpdmVyc0xpY2Vuc2UyLCBmYUNpcmNsZVBsYXkyLCBmYVBsYXlDaXJjbGUyLCBmYUZhY2VMYXVnaEJlYW0yLCBmYUxhdWdoQmVhbTIsIGZhTGVhZiwgZmFIb3VzZUNoaW1uZXlVc2VyLCBmYVJvdGF0ZVJpZ2h0LCBmYVJlZG9BbHQsIGZhUm90YXRlRm9yd2FyZCwgZmFUb290aCwgZmFIb3VzZUNoaW1uZXlXaW5kb3csIGZhTW90b3JjeWNsZSwgZmFCYWNrd2FyZEZhc3QsIGZhRmFzdEJhY2t3YXJkLCBmYUFkZHJlc3NCb29rMiwgZmFDb250YWN0Qm9vazIsIGZhU2FpbGJvYXQsIGZhQm9va0Jvb2ttYXJrLCBmYU1hZ25pZnlpbmdHbGFzc0Fycm93UmlnaHQsIGZhTWljcm9waG9uZUxpbmVzLCBmYU1pY3JvcGhvbmVBbHQsIGZhUmVwbHlBbGwsIGZhTWFpbFJlcGx5QWxsLCBmYVVuaXZlcnNhbEFjY2VzcywgZmFUb2lsZXRQYXBlciwgZmFUb2lsZXRQYXBlckFsdCwgZmFUb2lsZXRQYXBlckJsYW5rLCBmYVZyQ2FyZGJvYXJkLCBmYVBpenphU2xpY2UsIGZhU3ByYXlDYW4sIGZhVm9sdW1lTG93LCBmYVZvbHVtZURvd24sIGZhQ3Jvc3MsIGZhUGVyc29uLCBmYU1hbGUsIGZhSG91cmdsYXNzMywgZmFIb3VyZ2xhc3NFbXB0eTIsIGZhRmlzaCwgZmFEcnVtc3RpY2tCaXRlLCBmYUNoYXJ0U2ltcGxlLCBmYUF0b20sIGZhUCwgZmFKZXRGaWdodGVyVXAsIGZhUGx1Z0NpcmNsZVhtYXJrLCBmYVNoZWV0UGxhc3RpYywgZmFWLCBmYUxpc3QsIGZhTGlzdFNxdWFyZXMsIGZhU29sYXJQYW5lbCwgZmFMYW5kTWluZU9uLCBmYUhlYWRwaG9uZXMyLCBmYUhlYWRwaG9uZXNBbHQyLCBmYUhlYWRwaG9uZXNTaW1wbGUyLCBmYUJ1cywgZmFGaWxlUG93ZXJwb2ludDIsIGZhUXVvdGVMZWZ0LCBmYVF1b3RlTGVmdEFsdCwgZmFDaGV2cm9uRG93biwgZmFFYXJ0aEFzaWEsIGZhR2xvYmVBc2lhLCBmYUNlbnRTaWduLCBmYVNoaWVsZENhdCwgZmFTY2hvb2xDaXJjbGVDaGVjaywgZmFNYXJ0aW5pR2xhc3MsIGZhR2xhc3NNYXJ0aW5pQWx0LCBmYVBsdWcsIGZhUGFub3JhbWEsIGZhQ2xvY2tSb3RhdGVMZWZ0LCBmYUhpc3RvcnksIGZhSmFyV2hlYXQsIGZhQ2xvdWRBcnJvd0Rvd24sIGZhQ2xvdWREb3dubG9hZCwgZmFDbG91ZERvd25sb2FkQWx0LCBmYVRydWNrUmFtcEJveCwgZmFUcnVja0xvYWRpbmcsIGZhQW5nbGVEb3duLCBmYVBsdWdDaXJjbGVDaGVjaywgZmFXaW5kb3dNYXhpbWl6ZTIsIGZhSGFuZHNIb2xkaW5nQ2lyY2xlLCBmYUxvY2F0aW9uUGluLCBmYU1hcE1hcmtlciwgZmFCb3dsaW5nQmFsbCwgZmFDYXJ0RmxhdGJlZCwgZmFEb2xseUZsYXRiZWQsIGZhSG91c2VVc2VyLCBmYUhvbWVVc2VyLCBmYUdob3N0LCBmYUNvbW1lbnROb2RlcywgZmFQZXJzb25BcnJvd0Rvd25Ub0xpbmUsIGZhUGx1Z0NpcmNsZVBsdXMsIGZhUGVyc29uU3dpbW1pbmcsIGZhU3dpbW1lciwgZmFDb21tZW50RG90czIsIGZhQ29tbWVudGluZzIsIGZhQ2hhcnRQaWUsIGZhUGllQ2hhcnQsIGZhRnJvZywgZmFXaW5lQm90dGxlLCBmYUluYm94LCBmYVNxdWFyZUgsIGZhSFNxdWFyZSwgZmFIb3VzZU1lZGljYWwsIGZhQ2lyY2xlQ2hldnJvblJpZ2h0LCBmYUNoZXZyb25DaXJjbGVSaWdodCwgZmFGaWxlQ3N2LCBmYUhhdENvd2JveSwgZmFGYWNlR3JpblRvbmd1ZVdpbmsyLCBmYUdyaW5Ub25ndWVXaW5rMiwgZmFMLCBmYUFycm93RG93blNob3J0V2lkZSwgZmFTb3J0QW1vdW50RGVzYywgZmFTb3J0QW1vdW50RG93bkFsdCwgZmFIb3VyZ2xhc3NIYWxmMiwgZmFIb3VyZ2xhc3MyMiwgZmFTcG9vbiwgZmFVdGVuc2lsU3Bvb24sIGZhQ3JlZGl0Q2FyZDIsIGZhQ3JlZGl0Q2FyZEFsdDIsIGZhRmlsZUludm9pY2VEb2xsYXIsIGZhU3BhZ2hldHRpTW9uc3RlckZseWluZywgZmFQYXN0YWZhcmlhbmlzbSwgZmFNYXJ0aW5pR2xhc3NDaXRydXMsIGZhQ29ja3RhaWwsIGZhQnVsbGhvcm4sIGZhQm94VGlzc3VlLCBmYU1hdHRyZXNzUGlsbG93LCBmYUNoZXZyb25MZWZ0LCBmYUNsb3VkTW9vblJhaW4sIGZhQXJyb3dEb3duMTksIGZhU29ydE51bWVyaWNBc2MsIGZhU29ydE51bWVyaWNEb3duLCBmYUhhbmRTcG9jazIsIGZhV2FuZE1hZ2ljU3BhcmtsZXMsIGZhTWFnaWNXYW5kU3BhcmtsZXMsIGZhQ29tbWVudE1lZGljYWwsIGZhQmVsbFNsYXNoMiwgZmFIYW5kc2hha2VTbGFzaCwgZmFIYW5kc2hha2VBbHRTbGFzaCwgZmFIYW5kc2hha2VTaW1wbGVTbGFzaCwgZmFCb3R0bGVXYXRlciwgZmFEaWNlRDIwLCBmYUFycm93RG93blpBLCBmYVNvcnRBbHBoYURlc2MsIGZhU29ydEFscGhhRG93bkFsdCwgZmFCcnVzaCwgZmFQZXJzb25XYWxraW5nRGFzaGVkTGluZUFycm93UmlnaHQsIGZhQXJyb3dVcFNob3J0V2lkZSwgZmFTb3J0QW1vdW50VXBBbHQsIGZhR3JpcFZlcnRpY2FsLCBmYUdyaWRWZXJ0aWNhbCwgZmFDYXJUdW5uZWwsIGZhQ2hhcnRDb2x1bW4sIGZhVHJ1Y2tBcnJvd1JpZ2h0LCBmYVR2LCBmYVRlbGV2aXNpb24sIGZhVHZBbHQsIGZhU2VjdGlvbiwgZmFQZWFjZSwgZmFTdGFyMiwgZmFGbGFnMiwgZmFUcmlhbmdsZUV4Y2xhbWF0aW9uLCBmYUV4Y2xhbWF0aW9uVHJpYW5nbGUsIGZhV2FybmluZywgZmFTY2hvb2xDaXJjbGVFeGNsYW1hdGlvbiwgZmFHcmFkdWF0aW9uQ2FwLCBmYU1vcnRhckJvYXJkLCBmYVN0b3JlLCBmYVVzZXJBc3Ryb25hdXQsIGZhQnVpbGRpbmdGbGFnLCBmYU11Z1NhdWNlciwgZmFDb2ZmZWUsIGZhTGVtb24yLCBmYUNhcmF2YW4sIGZhUSwgZmFMb2NrLCBmYVBhaW50Um9sbGVyLCBmYVZvbHVtZUhpZ2gsIGZhVm9sdW1lVXAsIGZhRm9sZGVyUGx1cywgZmFNZXJjdXJ5LCBmYUFuY2hvciwgZmFTcXVhcmVQYXJraW5nLCBmYVBhcmtpbmcsIGZhSGFudWtpYWgsIGZhUm90YXRlTGVmdCwgZmFSb3RhdGVCYWNrLCBmYVJvdGF0ZUJhY2t3YXJkLCBmYVVuZG9BbHQsIGZhSGVhZGluZywgZmFIZWFkZXIsIGZhQ3Jvc3NoYWlycywgZmFDaXJjbGVOb2RlcywgZmFXaW5kb3dSZXN0b3JlMiwgZmFSLCBmYUZpbHRlckNpcmNsZVhtYXJrLCBmYUdvcHVyYW0sIGZhSGVhcnRDaXJjbGVNaW51cywgZmFTdGFyT2ZMaWZlLCBmYUJ1c2luZXNzVGltZSwgZmFCcmllZmNhc2VDbG9jaywgZmFGaXJlRXh0aW5ndWlzaGVyLCBmYUFycm93RG93bkxvbmcsIGZhTG9uZ0Fycm93RG93biwgZmFVc2VyTWludXMsIGZhTW9uZXlDaGVjaywgZmFIb3VzZUxhcHRvcCwgZmFMYXB0b3BIb3VzZSwgZmFEb3dubG9hZCwgZmFDb3VjaCwgZmFSb2FkTG9jaywgZmFTY2lzc29ycywgZmFDdXQsIGZhQnVnLCBmYUFycm93UmlnaHRGcm9tQnJhY2tldCwgZmFTaWduT3V0LCBmYUhhbmRIb2xkaW5nSGFuZCwgZmFTdHJvb3B3YWZlbCwgZmFDaGlsZCwgZmFJY2VDcmVhbSwgZmFDb21wdXRlck1vdXNlLCBmYU1vdXNlLCBmYUZhdWNldCwgZmFBd2FyZCwgZmFQZXJzb25Ecm93bmluZywgZmFDYW1lcmFSb3RhdGUsIGZhRmFjZUdyaW5IZWFydHMyLCBmYUdyaW5IZWFydHMyLCBmYUZpbGVGcmFnbWVudCwgZmFQZXJzb25NaWxpdGFyeVJpZmxlLCBmYVRvZ2dsZU9uLCBmYUx1bmdzVmlydXMsIGZhVGFibGVUZW5uaXNQYWRkbGVCYWxsLCBmYVBpbmdQb25nUGFkZGxlQmFsbCwgZmFUYWJsZVRlbm5pcywgZmFCb3hlc1BhY2tpbmcsIGZhUGVyc29uQ2hhbGtib2FyZCwgZmFEaWNlVHdvLCBmYUFycm93UmlnaHRBcnJvd0xlZnQsIGZhRXhjaGFuZ2UsIGZhRm9vdGJhbGwsIGZhRm9vdGJhbGxCYWxsLCBmYVRydWNrTW9uc3RlciwgZmFBc3RlcmlzaywgZmFCYXR0ZXJ5RnVsbCwgZmFCYXR0ZXJ5LCBmYUJhdHRlcnk1LCBmYUNoaWxkRHJlc3MsIGZhRmFjZUtpc3NCZWFtMiwgZmFLaXNzQmVhbTIsIGZhVHJhc2hDYW5BcnJvd1VwLCBmYVRyYXNoUmVzdG9yZUFsdCwgZmFGb250LCBmYUJvcmVIb2xlLCBmYVZpcnVzQ292aWQsIGZhRmlsZVBkZjIsIGZhTGFuZ3VhZ2UsIGZhU2hpZWxkSGFsdmVkLCBmYVNoaWVsZEFsdCwgZmFDYXJldFVwLCBmYUZpbGVQZW4sIGZhRmlsZUVkaXQsIGZhUGVyc29uQmlraW5nLCBmYUJpa2luZywgZmFCb29rT3BlblJlYWRlciwgZmFCb29rUmVhZGVyLCBmYUdsYXNzV2F0ZXJEcm9wbGV0LCBmYVRvd2VyQnJvYWRjYXN0LCBmYUJyb2FkY2FzdFRvd2VyLCBmYU1pbmltaXplLCBmYUNvbXByZXNzQXJyb3dzQWx0LCBmYUFycm93UmlnaHRUb0NpdHksIGZhTGFwdG9wTWVkaWNhbCwgZmFCcmVhZFNsaWNlLCBmYUdsb2JlLCBmYUZvbGRlck1pbnVzLCBmYU1hc2tGYWNlLCBmYUJvbmcsIGZhUm9hZEJyaWRnZSwgZmFBcnJvd1VwOTEsIGZhU29ydE51bWVyaWNVcEFsdCwgZmFNb3VudGFpbkNpdHksIGZhQXJyb3dEb3duOTEsIGZhU29ydE51bWVyaWNEZXNjLCBmYVNvcnROdW1lcmljRG93bkFsdCwgZmFGYWNlR3JpbldpZGUyLCBmYUdyaW5BbHQyLCBmYVBvb3AsIGZhRGhhcm1hY2hha3JhLCBmYUJhdHRlcnlRdWFydGVyLCBmYUJhdHRlcnkyLCBmYUFua2gsIGZhRGlhbW9uZCwgZmFTdWJzY3JpcHQsIGZhUnVwZWVTaWduLCBmYVJ1cGVlLCBmYVBlcnNvblJpZmxlLCBmYUQsIGZhU3F1YXJlTmZpLCBmYVRlZXRoLCBmYU1hZ25pZnlpbmdHbGFzc0RvbGxhciwgZmFTZWFyY2hEb2xsYXIsIGZhRHVtcHN0ZXJGaXJlLCBmYVVwbG9hZCwgZmFVc2VyU2xhc2gsIGZhVXNlckFsdFNsYXNoLCBmYVVzZXJMYXJnZVNsYXNoLCBmYUFycm93TGVmdCwgZmFWaWFsVmlydXMsIGZhQ2hlY2tEb3VibGUsIGZhUGF3LCBmYUhlbG1ldFNhZmV0eSwgZmFIYXJkSGF0LCBmYUhhdEhhcmQsIGZhRSwgZmFGYWNlTGF1Z2hTcXVpbnQyLCBmYUxhdWdoU3F1aW50MiwgZmFEb3duTGVmdEFuZFVwUmlnaHRUb0NlbnRlciwgZmFDb21wcmVzc0FsdCwgZmFHaWZ0cywgZmFCZWQsIGZhTW9uZXlCaWxsVHJhbnNmZXIsIGZhUGVyc29uUnVubmluZywgZmFSdW5uaW5nLCBmYUNpcmNsZUNoZXZyb25Eb3duLCBmYUNoZXZyb25DaXJjbGVEb3duLCBmYVVzZXJOdXJzZSwgZmFGYWNlS2lzc1dpbmtIZWFydDIsIGZhS2lzc1dpbmtIZWFydDIsIGZhRmlsbCwgZmFNb25leUJpbGwxV2F2ZSwgZmFNb25leUJpbGxXYXZlQWx0LCBmYUxhbmRtYXJrLCBmYU11c2ljLCBmYUJvb2tNZWRpY2FsLCBmYVNodWZmbGUsIGZhUmFuZG9tLCBmYVVuZGVybGluZSwgZmFCdWlsZGluZ1VzZXIsIGZhUm9ib3QsIGZhUGx1cywgZmFBZGQsIGZhQ29weTIsIGZhQ2hlc3NLaW5nMiwgZmFIb3VzZUZsb29kV2F0ZXIsIGZhQml0Y29pblNpZ24sIGZhQm94LCBmYVNxdWFyZVBsdXMyLCBmYVBsdXNTcXVhcmUyLCBmYUFycm93c0xlZnRSaWdodCwgZmFBcnJvd3NILCBmYUZhbiwgZmFDcm93LCBmYUZpbGVDaXJjbGVDaGVjaywgZmFMaW5rU2xhc2gsIGZhQ2hhaW5Ccm9rZW4sIGZhQ2hhaW5TbGFzaCwgZmFVbmxpbmssIGZhQXJyb3dSb3RhdGVSaWdodCwgZmFBcnJvd1JpZ2h0Um90YXRlLCBmYUFycm93Um90YXRlRm9yd2FyZCwgZmFSZWRvLCBmYVBlbkNsaXAsIGZhUGVuQWx0LCBmYURvb3JDbG9zZWQsIGZhQXJyb3dEb3duV2lkZVNob3J0LCBmYVNvcnRBbW91bnRBc2MsIGZhU29ydEFtb3VudERvd24sIGZhQ2FyZXREb3duLCBmYUssIGZhQ2hlY2tUb1Nsb3QsIGZhVm90ZVllYSwgZmFGaXNoRmlucywgZmFDb21wcmVzcywgZmFBcnJvd1VwQVosIGZhU29ydEFscGhhVXAsIGZhVXNlckdyYWR1YXRlLCBmYUZpbGVDb2RlMiwgZmFTb2FwLCBmYVJlY3ljbGUsIGZhRmFjZUdyaW5XaW5rMiwgZmFHcmluV2luazIsIGZhV2F0ZXJMYWRkZXIsIGZhTGFkZGVyV2F0ZXIsIGZhU3dpbW1pbmdQb29sLCBmYVRvd2VyQ2VsbCwgZmFDb2xvblNpZ24sIGZhTGFwdG9wRmlsZSwgZmFCYWhhaSwgZmFIYXlrYWwsIGZhTW9uZXlCaWxsMTIsIGZhTW9uZXlCaWxsQWx0MiwgZmFDbG91ZEJvbHQsIGZhVGh1bmRlcnN0b3JtLCBmYUV0aGVybmV0LCBmYUhyeXZuaWFTaWduLCBmYUhyeXZuaWEsIGZhRXllU2xhc2gyLCBmYUNhcnRGbGF0YmVkU3VpdGNhc2UsIGZhTHVnZ2FnZUNhcnQsIGZhUmFkaWF0aW9uLCBmYUZpbGVXb3JkMiwgZmFCZWRQdWxzZSwgZmFQcm9jZWR1cmVzLCBmYVRlbnRzLCBmYU11Z0hvdCwgZmFCb2x0LCBmYVphcCwgZmFKYXIsIGZhVHJ1Y2tQbGFuZSwgZmFIYW5kSG9sZGluZ0hlYXJ0LCBmYUFycm93Um90YXRlTGVmdCwgZmFBcnJvd0xlZnRSb3RhdGUsIGZhQXJyb3dSb3RhdGVCYWNrLCBmYUFycm93Um90YXRlQmFja3dhcmQsIGZhVW5kbywgZmFGYWNlQW5ncnkyLCBmYUFuZ3J5MiwgZmFCdXJzdCwgZmFaLCBmYUJhbmRhZ2UsIGZhQmFuZEFpZCwgZmFQbGFuZUNpcmNsZUV4Y2xhbWF0aW9uLCBmYUJ1c1NpZGUsIGZhQnVncywgZmFCZWVyTXVnRW1wdHksIGZhQmVlciwgZmFQZXJzb25DaXJjbGVDaGVjaywgZmFTdGFwbGVyLCBmYUhvdXNlTWVkaWNhbENpcmNsZUNoZWNrLCBmYU5haXJhU2lnbiwgZmFXaWZpLCBmYVdpZmkzLCBmYVdpZmlTdHJvbmcsIGZhTW9uZXlDaGVja0RvbGxhciwgZmFNb25leUNoZWNrQWx0LCBmYUV5ZUxvd1Zpc2lvbiwgZmFMb3dWaXNpb24sIGZhQ2lyY2xlQXJyb3dVcCwgZmFBcnJvd0NpcmNsZVVwLCBmYUNhbWVyYVJldHJvLCBmYUNhcHN1bGVzLCBmYVBvbywgZmFFbGV2YXRvciwgZmFUYWcsIGZhRmlsZUNpcmNsZU1pbnVzLCBmYURvd25Mb25nLCBmYUxvbmdBcnJvd0FsdERvd24sIGZhQ29tcGFjdERpc2MsIGZhU3VpdGNhc2VSb2xsaW5nLCBmYUJvb2tRdXJhbiwgZmFRdXJhbiwgZmFQaG9uZVNsYXNoLCBmYVJvYWRDaXJjbGVDaGVjaywgZmFTaG9wTG9jaywgZmFJbWFnZVBvcnRyYWl0LCBmYVBvcnRyYWl0LCBmYUJyaWRnZUxvY2ssIGZhSGFtbWVyLCBmYUFycm93VXAxOSwgZmFTb3J0TnVtZXJpY1VwLCBmYUNoZXNzS25pZ2h0MiwgZmFIb3VzZUZsb29kV2F0ZXJDaXJjbGVBcnJvd1JpZ2h0LCBmYUFycm93VXBSaWdodEZyb21TcXVhcmUsIGZhRXh0ZXJuYWxMaW5rLCBmYUFycm93RG93blVwQWNyb3NzTGluZSwgZmFGYWNlR3JpbkJlYW0yLCBmYUdyaW5CZWFtMiwgZmFSZWN0YW5nbGVBZCwgZmFBZCwgZmFCb29rVGFuYWtoLCBmYVRhbmFraCwgZmFIb3RUdWJQZXJzb24sIGZhSG90VHViLCBmYUZpbGVIYWxmRGFzaGVkLCBmYU91dGRlbnQsIGZhRGVkZW50LCBmYUhhbmRQZWFjZTIsIGZhSGVhZFNpZGVWaXJ1cywgZmFDb21wYXNzMiwgZmFQZW5OaWIsIGZhVGVudEFycm93c0Rvd24sIGZhRm9yd2FyZEZhc3QsIGZhRmFzdEZvcndhcmQsIGZhQ3JvcCwgZmFXaGlza2V5R2xhc3MsIGZhR2xhc3NXaGlza2V5LCBmYVNxdWFyZTIsIGZhRmFjZUdyaW4yLCBmYUdyaW4yLCBmYUZpbGVDb250cmFjdCwgZmFBbmdsZVVwLCBmYUZhY2VTbWlsZTIsIGZhU21pbGUyLCBmYVBlcnNvbkRyZXNzQnVyc3QsIGZhRGl2aWRlLCBmYUNvZGVGb3JrLCBmYUhvdXNlRmxhZywgZmFCdWlsZGluZ0NvbHVtbnMsIGZhQmFuaywgZmFJbnN0aXR1dGlvbiwgZmFNdXNldW0sIGZhVW5pdmVyc2l0eSwgZmFSdWcsIGZhQ29kZU1lcmdlLCBmYUhvdXNlVHN1bmFtaSwgZmFNYWduaWZ5aW5nR2xhc3NDaGFydCwgZmFVbWJyZWxsYSwgZmFIaWxsUm9ja3NsaWRlLCBmYVVzZXJTZWNyZXQsIGZhUGFnZXIsIGZhQnJpZWZjYXNlLCBmYVRyb3dlbEJyaWNrcywgZmFTb2NrcywgZmFULCBmYU1pY3JvY2hpcCwgZmFUcnVja01lZGljYWwsIGZhQW1idWxhbmNlLCBmYU9tLCBmYU1vc3F1aXRvTmV0LCBmYVByZXNjcmlwdGlvbkJvdHRsZSwgZmFVc2Vyc0dlYXIsIGZhVXNlcnNDb2csIGZhUm9hZENpcmNsZUV4Y2xhbWF0aW9uLCBmYVBhdXNlLCBmYVN0YWZmU25ha2UsIGZhUm9kQXNjbGVwaXVzLCBmYVJvZFNuYWtlLCBmYVN0YWZmQWVzY3VsYXBpdXMsIGZhUGlnZ3lCYW5rLCBmYU1vbnVtZW50LCBmYUFuZ2xlc1JpZ2h0LCBmYUFuZ2xlRG91YmxlUmlnaHQsIGZhRGVza3RvcCwgZmFEZXNrdG9wQWx0LCBmYVBsYW5lQ2lyY2xlWG1hcmssIGZhUmV0d2VldCwgZmFVc2VyR2VhciwgZmFVc2VyQ29nLCBmYUJvcmRlckFsbCwgZmFDb2lucywgZmFNYXJzU3Ryb2tlLCBmYUhhbmRzaGFrZUFuZ2xlLCBmYUhhbmRzSGVscGluZywgZmFBcnJvd0Rvd24sIGZhTG9jYXRpb25Eb3QsIGZhTWFwTWFya2VyQWx0LCBmYVBsdWdDaXJjbGVFeGNsYW1hdGlvbiwgZmFDb29raWVCaXRlLCBmYVNjcmV3ZHJpdmVyV3JlbmNoLCBmYVRvb2xzLCBmYUluZGVudCwgZmFCYXJzLCBmYU5hdmljb24sIGZhSGFuZHNQcmF5aW5nLCBmYVByYXlpbmdIYW5kcywgZmFWaXJ1c2VzLCBmYVNjaG9vbEZsYWcsIGZhVHJhZGVtYXJrLCBmYUZpcmVCdXJuZXIsIGZhRmFjZVNtaWxlQmVhbTIsIGZhU21pbGVCZWFtMiwgZmFUZW50QXJyb3dMZWZ0UmlnaHQsIGZhUm91dGUsIGZhQW5nbGVzVXAsIGZhQW5nbGVEb3VibGVVcCwgZmFCdWNrZXQsIGZhTGVzc1RoYW5FcXVhbCwgZmFGb2xkZXJDbG9zZWQyLCBmYVBlcnNvblRocm91Z2hXaW5kb3csIGZhU2Nob29sTG9jaywgZmFQZXJzb25CdXJzdCwgZmFMZWZ0TG9uZywgZmFMb25nQXJyb3dBbHRMZWZ0LCBmYUxvY2F0aW9uQ3Jvc3NoYWlycywgZmFMb2NhdGlvbiwgZmFQZXJzb25Eb3RzRnJvbUxpbmUsIGZhRGlhZ25vc2VzLCBmYUdhdWdlU2ltcGxlSGlnaCwgZmFUYWNob21ldGVyLCBmYVRhY2hvbWV0ZXJGYXN0LCBmYUFuZ2xlc0xlZnQsIGZhQW5nbGVEb3VibGVMZWZ0LCBmYVVwRG93biwgZmFBcnJvd3NBbHRWLCBmYUJhdHRlcnlFbXB0eSwgZmFCYXR0ZXJ5MCwgZmFLZXlib2FyZDIsIGZhQ29va2llLCBmYVN0b3B3YXRjaCwgZmFFamVjdCwgZmFTYXRlbGxpdGVEaXNoLCBmYUZhY2VSb2xsaW5nRXllczIsIGZhTWVoUm9sbGluZ0V5ZXMyLCBmYUxpc3RDaGVjaywgZmFUYXNrcywgZmFTYWNrWG1hcmssIGZhSGFzaHRhZywgZmFUcmFpbiwgZmFHYW1lcGFkLCBmYUZpbGVFeHBvcnQsIGZhQXJyb3dSaWdodEZyb21GaWxlLCBmYUZhY2VHcmltYWNlMiwgZmFHcmltYWNlMiwgZmFUcmFpblN1YndheSwgZmFTdWJ3YXksIGZhQ2lyY2xlRG90MiwgZmFEb3RDaXJjbGUyLCBmYU9iamVjdEdyb3VwMiwgZmFTaGlwLCBmYUMsIGZhU3F1YXJlUGhvbmUsIGZhUGhvbmVTcXVhcmUsIGZhUnVsZXJDb21iaW5lZCwgZmFBcnJvd3NSb3RhdGUsIGZhUmVmcmVzaCwgZmFTeW5jLCBmYVBlcnNvbkRyZXNzLCBmYUZlbWFsZSwgZmFCb29rT3BlbiwgZmFGb2xkZXJUcmVlLCBmYUJveEFyY2hpdmUsIGZhQXJjaGl2ZSwgZmFUZW50QXJyb3dEb3duVG9MaW5lLCBmYVFyY29kZSwgZmFEcmFnb24sIGZhSG91cmdsYXNzRW5kLCBmYUhvdXJnbGFzczMyLCBmYUdyaXAsIGZhR3JpZEhvcml6b250YWwsIGZhR3JpcEhvcml6b250YWwsIGZhQm9yZGVyVG9wTGVmdCwgZmFCb3JkZXJTdHlsZSwgZmFMaXN0VWwsIGZhTGlzdERvdHMsIGZhUGVvcGxlUm9iYmVyeSwgZmFNb2JpbGVCdXR0b24sIGZhQXJyb3dEb3duQVosIGZhU29ydEFscGhhQXNjLCBmYVNvcnRBbHBoYURvd24sIGZhTW9uZXlCaWxsLCBmYUNpcmNsZU1pbnVzLCBmYU1pbnVzQ2lyY2xlLCBmYUFycm93UG9pbnRlciwgZmFNb3VzZVBvaW50ZXIsIGZhU3F1YXJlU2hhcmVOb2RlcywgZmFTaGFyZUFsdFNxdWFyZSwgZmFUYWJsZUNlbGxzTGFyZ2UsIGZhVGhMYXJnZSwgZmFDYXQsIGZhQ2FsZW5kYXJXZWVrLCBmYUNvZGVDb21wYXJlLCBmYVJvYWRDaXJjbGVYbWFyaywgZmFQYWxsZXQsIGZhQ2FrZUNhbmRsZXMsIGZhQmlydGhkYXlDYWtlLCBmYUNha2UsIGZhQnVnU2xhc2gsIGZhVGFycCwgZmFEaWFncmFtUHJlZGVjZXNzb3IsIGZhRmFjZUZsdXNoZWQyLCBmYUZsdXNoZWQyLCBmYURpYWdyYW1OZXh0LCBmYUFuY2hvckNpcmNsZVhtYXJrLCBmYVBlcnNvbkNpcmNsZVhtYXJrLCBmYVNwYSwgZmFCYXJzUHJvZ3Jlc3MsIGZhVGFza3NBbHQsIGZhSGVhcnRDaXJjbGVDaGVjaywgZmFNYXJzU3Ryb2tlUmlnaHQsIGZhTWFyc1N0cm9rZUgsIGZhVG93ZXJPYnNlcnZhdGlvbiwgZmFTdGVybGluZ1NpZ24sIGZhR2JwLCBmYVBvdW5kU2lnbiwgZmFGYXVjZXREcmlwLCBmYUNpcmNsZUluZm8sIGZhSW5mb0NpcmNsZSwgZmFGZWF0aGVyLCBmYUJvd2xSaWNlLCBmYVN0YXJIYWxmU3Ryb2tlMiwgZmFTdGFySGFsZkFsdDIsIGZhVGVtcGVyYXR1cmVBcnJvd0Rvd24sIGZhVGVtcGVyYXR1cmVEb3duLCBmYU1hc2tWZW50aWxhdG9yLCBmYUZpbGVWaWRlbzIsIGZhQXJyb3dUcmVuZERvd24sIGZhT2lsQ2FuLCBmYVBlb3BsZUNhcnJ5Qm94LCBmYVBlb3BsZUNhcnJ5LCBmYUNoYWlyLCBmYVdpbmQsIGZhTGF5ZXJHcm91cCwgZmFIZWFkU2lkZU1hc2ssIGZhSGFuZHMsIGZhU2lnbkxhbmd1YWdlLCBmYVNpZ25pbmcsIGZhVGFibGV0cywgZmFXZWlnaHRIYW5naW5nLCBmYURpY2UsIGZhU2hvcFNsYXNoLCBmYVN0b3JlQWx0U2xhc2gsIGZhU29ydERvd24sIGZhU29ydERlc2MsIGZhUGVzZXRhU2lnbiwgZmFUYWJsZXRTY3JlZW5CdXR0b24sIGZhVGFibGV0QWx0LCBmYUhhbmRIb2xkaW5nRG9sbGFyLCBmYUhhbmRIb2xkaW5nVXNkLCBmYVNoaWVsZCwgZmFTaGllbGRCbGFuaywgZmFGYWNlTGF1Z2gyLCBmYUxhdWdoMiwgZmFIYW5kc0hvbGRpbmcsIGZhQ2FydFNob3BwaW5nLCBmYVNob3BwaW5nQ2FydCwgZmFPY3RhZ29uLCBmYUhhbmRQb2ludGVyMiwgZmFSZWdpc3RlcmVkMiwgZmFIb3VzZVNpZ25hbCwgZmFCYW5nbGFkZXNoaVRha2FTaWduLCBpY29uczM7CnZhciBpbml0X2ZyZWVfc29saWRfc3ZnX2ljb25zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGZvcnRhd2Vzb21lK2ZyZWUtc29saWQtc3ZnLWljb25zQDcuMS4wL25vZGVfbW9kdWxlcy9AZm9ydGF3ZXNvbWUvZnJlZS1zb2xpZC1zdmctaWNvbnMvaW5kZXgubWpzIigpIHsKICAgIHByZWZpeDMgPSAiZmFzIjsKICAgIGZhMCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICIwIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbXSwgIjMwIiwgIk0wIDE5MkMwIDEwMy42IDcxLjYgMzIgMTYwIDMyczE2MCA3MS42IDE2MCAxNjBsMCAxMjhjMCA4OC40LTcxLjYgMTYwLTE2MCAxNjBTMCA0MDguNCAwIDMyMEwwIDE5MnpNMTYwIDk2Yy01MyAwLTk2IDQzLTk2IDk2bDAgMTI4YzAgNTMgNDMgOTYgOTYgOTZzOTYtNDMgOTYtOTZsMC0xMjhjMC01My00My05Ni05Ni05NnoiXQogICAgfTsKICAgIGZhMSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICIxIiwKICAgICAgaWNvbjogWzI1NiwgNTEyLCBbXSwgIjMxIiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0UzE0LjMgOTYgMzIgOTZsNjQgMCAwIDMyMC02NCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDE5MiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC02NCAwIDAtMzUyYzAtMTcuNy0xNC4zLTMyLTMyLTMyTDMyIDMyeiJdCiAgICB9OwogICAgZmEyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIjIiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiMzIiLCAiTTQ4IDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMybDE3MSAwYzYwLjIgMCAxMDkgNDguOCAxMDkgMTA5IDAgNDMuOC0yNi4yIDgzLjMtNjYuNCAxMDAuNGwtMTM5LjEgNTlDMTE5IDMxNS40IDk2IDM1MC4yIDk2IDM4OC43bDAgMjcuMyAyMjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkw2NCA0ODBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNTkuM2MwLTY0LjIgMzguNC0xMjIuMiA5Ny41LTE0Ny4zbDEzOS4xLTU5YzE2LjYtNy4xIDI3LjQtMjMuNCAyNy40LTQxLjQgMC0yNC45LTIwLjItNDUtNDUtNDVMODAgOTZDNjIuMyA5NiA0OCA4MS43IDQ4IDY0eiJdCiAgICB9OwogICAgZmEzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIjMiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiMzMiLCAiTTgwIDI4OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxMTIgMGMzNS4zIDAgNjQtMjguNyA2NC02NHMtMjguNy02NC02NC02NEwzMiA5NkMxNC4zIDk2IDAgODEuNyAwIDY0UzE0LjMgMzIgMzIgMzJsMTYwIDBjNzAuNyAwIDEyOCA1Ny4zIDEyOCAxMjggMCAzOC4yLTE2LjggNzIuNS00My4zIDk2IDI2LjYgMjMuNSA0My4zIDU3LjggNDMuMyA5NiAwIDcwLjctNTcuMyAxMjgtMTI4IDEyOEwzMiA0ODBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMTYwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRzLTI4LjctNjQtNjQtNjRMODAgMjg4eiJdCiAgICB9OwogICAgZmE0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIjQiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiMzQiLCAiTTY0IDY0YzAtMTcuNy0xNC4zLTMyLTMyLTMyUzAgNDYuMyAwIDY0TDAgMjg4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE5MiAwIDAgOTZjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTk2IDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTMyIDAgMC0yMjRjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAyMjQtMTkyIDAgMC0yMjR6Il0KICAgIH07CiAgICBmYTUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiNSIsCiAgICAgIGljb246IFszMjAsIDUxMiwgW10sICIzNSIsICJNMCA2NEMwIDQ2LjMgMTQuMyAzMiAzMiAzMmwyMjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTkyIDAgMCAxMTIgMTIwIDBjNzUuMSAwIDEzNiA2MC45IDEzNiAxMzZTMjU5LjEgNDgwIDE4NCA0ODBMMzIgNDgwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDE1MiAwYzM5LjggMCA3Mi0zMi4yIDcyLTcycy0zMi4yLTcyLTcyLTcyTDMyIDI3MmMtMTcuNyAwLTMyLTE0LjMtMzItMzJMMCA2NHoiXQogICAgfTsKICAgIGZhNiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICI2IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgIjM2IiwgIk0yNTYgMzJjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTg4IDBjLTQ4LjYgMC04OCAzOS40LTg4IDg4bDAgMzIuMmMyMi45LTE1LjMgNTAuNC0yNC4yIDgwLTI0LjJsNDggMGM3OS41IDAgMTQ0IDY0LjUgMTQ0IDE0NFMyODcuNSA0ODAgMjA4IDQ4MGwtNDggMEM4MC41IDQ4MCAxNiA0MTUuNSAxNiAzMzZsMC0xNTJDMTYgMTAwLjEgODQuMSAzMiAxNjggMzJsODggMHpNODAgMzM2YzAgNDQuMiAzNS44IDgwIDgwIDgwbDQ4IDBjNDQuMiAwIDgwLTM1LjggODAtODBzLTM1LjgtODAtODAtODBsLTQ4IDBjLTQ0LjIgMC04MCAzNS44LTgwIDgweiJdCiAgICB9OwogICAgZmE3ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIjciLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiMzciLCAiTTAgNjRDMCA0Ni4zIDE0LjMgMzIgMzIgMzJsMjU2IDBjMTEuNSAwIDIyIDYuMSAyNy43IDE2LjFzNS43IDIyLjItLjEgMzIuMWwtMjI0IDM4NGMtOC45IDE1LjMtMjguNSAyMC40LTQzLjggMTEuNXMtMjAuNC0yOC41LTExLjUtNDMuOEwyMzIuMyA5NiAzMiA5NkMxNC4zIDk2IDAgODEuNyAwIDY0eiJdCiAgICB9OwogICAgZmE4ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIjgiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiMzgiLCAiTTMwNCAxNjBjMC03MC43LTU3LjMtMTI4LTEyOC0xMjhsLTMyIDBjLTcwLjcgMC0xMjggNTcuMy0xMjggMTI4IDAgMzQuNiAxMy43IDY2IDM2IDg5LTMxLjUgMjMuMy01MiA2MC44LTUyIDEwMyAwIDcwLjcgNTcuMyAxMjggMTI4IDEyOGw2NCAwYzcwLjcgMCAxMjgtNTcuMyAxMjgtMTI4IDAtNDIuMi0yMC41LTc5LjctNTItMTAzIDIyLjMtMjMgMzYtNTQuNCAzNi04OXpNMTc2LjEgMjg4bDE1LjkgMGMzNS4zIDAgNjQgMjguNyA2NCA2NHMtMjguNyA2NC02NCA2NGwtNjQgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRzMjguNy02NCA2NC02NGw0OC4xIDB6bTAtNjRMMTQ0IDIyNGMtMzUuMyAwLTY0LTI4LjctNjQtNjQgMC0zNS4zIDI4LjctNjQgNjQtNjRsMzIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NCAwIDM1LjMtMjguNiA2NC02NCA2NHoiXQogICAgfTsKICAgIGZhOSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICI5IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgIjM5IiwgIk0yMDggMzIwYzI5LjYgMCA1Ny4xLTguOSA4MC0yNC4ybDAgMzIuMmMwIDQ4LjYtMzkuNCA4OC04OCA4OEw5NiA0MTZjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMTA0IDBjODMuOSAwIDE1Mi02OC4xIDE1Mi0xNTJsMC0xNTIuMUMzNTEuOSA5Ni40IDI4Ny41IDMyIDIwOCAzMmwtNDggMEM4MC41IDMyIDE2IDk2LjUgMTYgMTc2UzgwLjUgMzIwIDE2MCAzMjBsNDggMHptODAtMTQ0YzAgNDQuMi0zNS44IDgwLTgwIDgwbC00OCAwYy00NC4yIDAtODAtMzUuOC04MC04MHMzNS44LTgwIDgwLTgwbDQ4IDBjNDQuMiAwIDgwIDM1LjggODAgODB6Il0KICAgIH07CiAgICBmYURvbGxhclNpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZG9sbGFyLXNpZ24iLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFsxMjgxNzgsIDYxNzgxLCAiZG9sbGFyIiwgInVzZCJdLCAiMjQiLCAiTTEzNiAyNGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgNDAgNTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTE0LjkgMGMtMjQuOSAwLTQ1LjEgMjAuMi00NS4xIDQ1LjEgMCAyMi41IDE2LjUgNDEuNSAzOC43IDQ0LjdsOTEuNiAxMy4xYzUzLjggNy43IDkzLjcgNTMuNyA5My43IDEwOCAwIDYwLjMtNDguOSAxMDkuMS0xMDkuMSAxMDkuMWwtMTAuOSAwIDAgNDBjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC00MC03MiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDEzMC45IDBjMjQuOSAwIDQ1LjEtMjAuMiA0NS4xLTQ1LjEgMC0yMi41LTE2LjUtNDEuNS0zOC43LTQ0LjdsLTkxLjYtMTMuMUM1NS45IDI3My41IDE2IDIyNy40IDE2IDE3My4xIDE2IDExMi45IDY0LjkgNjQgMTI1LjEgNjRsMTAuOSAwIDAtNDB6Il0KICAgIH07CiAgICBmYURvbGxhciA9IGZhRG9sbGFyU2lnbjsKICAgIGZhVXNkID0gZmFEb2xsYXJTaWduOwogICAgZmFEb2cgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZG9nIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4MDIxXSwgImY2ZDMiLCAiTTMyIDExMmMxNi42IDAgMzAuMiAxMi42IDMxLjggMjguN2wuMyA2LjZDNjUuOCAxNjMuNCA3OS40IDE3NiA5NiAxNzZsMTc5LjEgMCAxNDAuOSA2MC40IDAgMjQzLjZjMCAxNy43LTE0LjMgMzItMzIgMzJsLTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTMxLjNDMjk2IDM2MSAyNjguOCAzNjggMjQwIDM2OHMtNTYtNy04MC0xOS4zTDE2MCA0ODBjMCAxNy43LTE0LjMgMzItMzIgMzJsLTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMjQ1LjZjLTM3LjMtMTMuMi02NC00OC42LTY0LTkwLjQgMC0xNy43IDE0LjMtMzIgMzItMzJ6TTM1NS44LTMyYzcuNyAwIDE0LjkgMy42IDE5LjYgOS44TDM5MiAwIDQ0NC4xIDBjMTIuNyAwIDI0LjkgNS4xIDMzLjkgMTQuMUw0OTYgMzIgNTUyIDMyYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgMjRjMCA0NC4yLTM1LjggODAtODAgODBsLTY0IDAtNyAyOC0xMjQuNy01My40IDMxLjYtMTQ3LjJDMzM0LjMtMjMuOSAzNDQuMi0zMiAzNTUuOC0zMnpNNDQ4IDQ0YTIwIDIwIDAgMSAwIDAgNDAgMjAgMjAgMCAxIDAgMC00MHoiXQogICAgfTsKICAgIGZhVHJ1Y2tNb3ZpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHJ1Y2stbW92aW5nIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY0ZGYiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MjRjMCA0OC42IDM5LjQgODggODggODggMjUuMiAwIDQ4LTEwLjYgNjQtMjcuNiAxNiAxNyAzOC44IDI3LjYgNjQgMjcuNiA0MC4zIDAgNzQuMi0yNy4xIDg0LjctNjRsMTM0LjYgMGMxMC40IDM2LjkgNDQuNCA2NCA4NC43IDY0IDQzIDAgNzguOS0zMC45IDg2LjUtNzEuNyAyMC0xMC44IDMzLjUtMzIgMzMuNS01Ni4zbDAtMTQ2LjdjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNMNTc2IDE0Ni43Yy0xMi0xMi0yOC4zLTE4LjctNDUuMy0xOC43bC01MC43IDAgMC0zMmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnpNNDgwIDE5Mmw1MC43IDAgNDUuMyA0NS4zIDAgNTAuNy05NiAwIDAtOTZ6TTg4IDM4NGE0MCA0MCAwIDEgMSAwIDgwIDQwIDQwIDAgMSAxIDAtODB6bTM5MiA0MGE0MCA0MCAwIDEgMSA4MCAwIDQwIDQwIDAgMSAxIC04MCAwek0yMTYgMzg0YTQwIDQwIDAgMSAxIDAgODAgNDAgNDAgMCAxIDEgMC04MHoiXQogICAgfTsKICAgIGZhUm90YXRlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJvdGF0ZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODI2MCwgInN5bmMtYWx0Il0sICJmMmYxIiwgIk00ODAuMSAxOTJsNy45IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC0xNDRjMC05LjctNS44LTE4LjUtMTQuOC0yMi4yUzQ3Ny45IC4yIDQ3MSA3TDQxOS4zIDU4LjhDMzc1IDIyLjEgMzE4IDAgMjU2IDAgMTI3IDAgMjAuMyA5NS40IDIuNiAyMTkuNSAuMSAyMzcgMTIuMiAyNTMuMiAyOS43IDI1NS43czMzLjctOS43IDM2LjItMjcuMUM3OS4yIDEzNS41IDE1OS4zIDY0IDI1NiA2NCAzMDAuNCA2NCAzNDEuMiA3OSAzNzMuNyAxMDQuM0wzMjcgMTUxYy02LjkgNi45LTguOSAxNy4yLTUuMiAyNi4yUzMzNC4zIDE5MiAzNDQgMTkybDEzNi4xIDB6bTI5LjQgMTAwLjVjMi41LTE3LjUtOS43LTMzLjctMjcuMS0zNi4ycy0zMy43IDkuNy0zNi4yIDI3LjFjLTEzLjMgOTMtOTMuNCAxNjQuNS0xOTAuMSAxNjQuNS00NC40IDAtODUuMi0xNS0xMTcuNy00MC4zTDE4NSAzNjFjNi45LTYuOSA4LjktMTcuMiA1LjItMjYuMlMxNzcuNyAzMjAgMTY4IDMyMEwyNCAzMjBjLTEzLjMgMC0yNCAxMC43LTI0IDI0TDAgNDg4YzAgOS43IDUuOCAxOC41IDE0LjggMjIuMlMzNC4xIDUxMS44IDQxIDUwNWw1MS44LTUxLjhDMTM3IDQ4OS45IDE5NCA1MTIgMjU2IDUxMiAzODUgNTEyIDQ5MS43IDQxNi42IDUwOS40IDI5Mi41eiJdCiAgICB9OwogICAgZmFTeW5jQWx0ID0gZmFSb3RhdGU7CiAgICBmYVNxdWFyZU1pbnVzMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtbWludXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs2MTc2NywgIm1pbnVzLXNxdWFyZSJdLCAiZjE0NiIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnptNzIgMjAwbDE3NiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNzYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhTWludXNTcXVhcmUyID0gZmFTcXVhcmVNaW51czI7CiAgICBmYUFsaWduSnVzdGlmeSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhbGlnbi1qdXN0aWZ5IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYwMzkiLCAiTTQ0OCA2NGMwLTE3LjctMTQuMy0zMi0zMi0zMkwzMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0UzE0LjMgOTYgMzIgOTZsMzg0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJ6bTAgMjU2YzAtMTcuNy0xNC4zLTMyLTMyLTMyTDMyIDI4OGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzODQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnpNMCAxOTJjMCAxNy43IDE0LjMgMzIgMzIgMzJsMzg0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgMTYwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnpNNDQ4IDQ0OGMwLTE3LjctMTQuMy0zMi0zMi0zMkwzMiA0MTZjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzg0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJ6Il0KICAgIH07CiAgICBmYUNhbGVuZGFyQ2hlY2syID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhbGVuZGFyLWNoZWNrIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyNzQiLCAiTTMyMCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzIgMzIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI4OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDMyIDAgMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMzIgMTI4IDAgMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnptMjIgMTYxLjdjLTEwLjctNy44LTI1LjctNS40LTMzLjUgNS4zTDE4OS4xIDMzMS4yIDEzNyAyNzkuMWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWw3MiA3MmM1IDUgMTEuOSA3LjUgMTguOCA3czEzLjQtNC4xIDE3LjUtOS44TDM0Ny4zIDE5NS4yYzcuOC0xMC43IDUuNC0yNS43LTUuMy0zMy41eiJdCiAgICB9OwogICAgZmFGYWNlS2lzczIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1raXNzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTM1LCAia2lzcyJdLCAiZjU5NiIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTI0MCAyODhsMzIgMGMyNi41IDAgNDggMjEuNSA0OCA0OCAwIDEyLjMtNC42IDIzLjUtMTIuMiAzMiA3LjYgOC41IDEyLjIgMTkuNyAxMi4yIDMyIDAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZzNy4yLTE2IDE2LTE2bDE2IDBjOC44IDAgMTYtNy4yIDE2LTE2cy03LjItMTYtMTYtMTZsLTE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsMTYgMGM4LjggMCAxNi03LjIgMTYtMTZzLTcuMi0xNi0xNi0xNmwtMTYgMGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNnptLTk2LTgwYTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTE5Mi0zMmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYUtpc3MyID0gZmFGYWNlS2lzczI7CiAgICBmYUtpdGNoZW5TZXQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAia2l0Y2hlbi1zZXQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUxYSIsICJNMjQwIDE0NGE5NiA5NiAwIDEgMCAtMTkyIDAgOTYgOTYgMCAxIDAgMTkyIDB6bTQ0LjQgMzJDMjY5LjkgMjQwLjEgMjEyLjUgMjg4IDE0NCAyODggNjQuNSAyODggMCAyMjMuNSAwIDE0NFM2NC41IDAgMTQ0IDBjNjguNSAwIDEyNS45IDQ3LjkgMTQwLjQgMTEybDcxLjggMGM4LjgtOS44IDIxLjYtMTYgMzUuOC0xNmwxMDQgMGMyNi41IDAgNDggMjEuNSA0OCA0OHMtMjEuNSA0OC00OCA0OGwtMTA0IDBjLTE0LjIgMC0yNy02LjItMzUuOC0xNmwtNzEuOCAwek0xNDQgODBhNjQgNjQgMCAxIDEgMCAxMjggNjQgNjQgMCAxIDEgMC0xMjh6TTQwMCAyNDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA4IDk2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTI0MCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDk2IDAgMC04YzAtMTMuMyAxMC43LTI0IDI0LTI0ek0yODggNDY0bDAtMTEyIDIyNCAwIDAgMTEyYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xMjggMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDh6TTQ4IDMyMGwxMjggMGMyNi41IDAgNDggMjEuNSA0OCA0OHMtMjEuNSA0OC00OCA0OGwtMTYgMGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtNjQgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC04MGMwLTguOCA3LjItMTYgMTYtMTZ6bTEyOCA2NGM4LjggMCAxNi03LjIgMTYtMTZzLTcuMi0xNi0xNi0xNmwtMTYgMCAwIDMyIDE2IDB6TTI0IDQ2NGwxNzYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNEwyNCA1MTJjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYURuYSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkbmEiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjk1MTZdLCAiZjQ3MSIsICJNMzUyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzIgMCA1Ny44LTI0LjQgMTA0LjgtNTcuNCAxNDQuNS0yNC4xIDI4LjktNTMuOCA1NS4xLTgzLjYgNzkuNSAyOS44IDI0LjUgNTkuNSA1MC42IDgzLjYgNzkuNSAzMyAzOS42IDU3LjQgODYuNyA1Ny40IDE0NC41IDAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMyTDY0IDQ4MGMwIDE3LjctMTQuMyAzMi0zMiAzMlMwIDQ5Ny43IDAgNDgwQzAgNDIyLjIgMjQuNCAzNzUuMiA1Ny40IDMzNS41IDgxLjUgMzA2LjYgMTExLjIgMjgwLjUgMTQxIDI1NiAxMTEuMiAyMzEuNSA4MS41IDIwNS40IDU3LjQgMTc2LjUgMjQuNCAxMzYuOCAwIDg5LjggMCAzMiAwIDE0LjMgMTQuMyAwIDMyIDBTNjQgMTQuMyA2NCAzMmwyNTYgMGMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNMjgzLjUgMzg0bC0xODIuOSAwYy04LjIgMTAuNS0xNS4xIDIxLjEtMjAuNiAzMmwyMjQuMiAwYy01LjYtMTAuOS0xMi41LTIxLjUtMjAuNi0zMnpNMjM4IDMzNmMtMTQuMy0xMy0yOS44LTI1LjgtNDYtMzktMTYuMiAxMy4xLTMxLjcgMjYtNDYgMzlsOTIgMHpNMTAwLjUgMTI4bDE4Mi45IDBjOC4yLTEwLjUgMTUuMS0yMS4xIDIwLjYtMzJMNzkuOSA5NmM1LjYgMTAuOSAxMi41IDIxLjUgMjAuNiAzMnpNMTQ2IDE3NmMxNC4zIDEzIDI5LjggMjUuOCA0NiAzOSAxNi4yLTEzLjEgMzEuNy0yNiA0Ni0zOWwtOTIgMHoiXQogICAgfTsKICAgIGZhQ2hpbGRSZWFjaGluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGlsZC1yZWFjaGluZyIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlNTlkIiwgIk0yNTYgNjRhNjQgNjQgMCAxIDAgLTEyOCAwIDY0IDY0IDAgMSAwIDEyOCAwek0xNTIuOSAxNjkuM2MtMjMuNy04LjQtNDQuNS0yNC4zLTU4LjgtNDUuOEw3NC42IDk0LjJDNjQuOCA3OS41IDQ1IDc1LjYgMzAuMyA4NS40UzExLjYgMTE1IDIxLjQgMTI5LjhMNDAuOSAxNTljMTguMSAyNy4xIDQyLjggNDguNCA3MS4xIDYyLjRMMTEyIDQ4MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtOTYgMzIgMCAwIDk2YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yNTguNGMyOS4xLTE0LjIgNTQuNC0zNi4yIDcyLjctNjQuMmwxOC4yLTI3LjljOS42LTE0LjggNS40LTM0LjYtOS40LTQ0LjNzLTM0LjYtNS41LTQ0LjMgOS40TDI5MSAxMjIuNGMtMjEuOCAzMy40LTU4LjkgNTMuNi05OC44IDUzLjYtMTIuNiAwLTI0LjktMi0zNi42LTUuOC0uOS0uMy0xLjgtLjctMi43LS45eiJdCiAgICB9OwogICAgZmFQYXN0ZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGFzdGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiZmlsZS1jbGlwYm9hcmQiXSwgImYwZWEiLCAiTTY0IDBDMjguNyAwIDAgMjguNyAwIDY0TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDExMiAwIDAtMjI0YzAtNjEuOSA1MC4xLTExMiAxMTItMTEybDY0IDAgMC00OGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAwek0yNDggMTEybC0xNDQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxNDQgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNHptNDAgNDhjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgMjI0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE2MCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTY1LjVjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNsLTU4LjUtNTguNWMtMTItMTItMjguMy0xOC43LTQ1LjMtMTguN0wyODggMTYweiJdCiAgICB9OwogICAgZmFGaWxlQ2xpcGJvYXJkMiA9IGZhUGFzdGUyOwogICAgZmFNZXRlb3IgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWV0ZW9yIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTczMl0sICJmNzUzIiwgIk00OTMuNyAuOWwtMTk0LjIgNzQuNyAyLjMtMjkuM2MxLTEyLjgtMTIuOC0yMS41LTI0LTE1LjFMMTAxLjMgMTMzLjRDMzguNiAxNjkuNyAwIDIzNi42IDAgMzA5IDAgNDIxLjEgOTAuOSA1MTIgMjAzIDUxMiAyNzUuNCA1MTIgMzQyLjMgNDczLjQgMzc4LjYgNDEwLjdMNDgwLjggMjM0LjNjNi41LTExLjEtMi4yLTI1LTE1LjEtMjRsLTI5LjMgMi4zIDc0LjctMTk0LjJjLjYtMS41IC45LTMuMiAuOS00LjggMC03LjUtNi0xMy41LTEzLjUtMTMuNS0xLjcgMC0zLjMgLjMtNC44IC45ek0xOTIgMTkyYTEyOCAxMjggMCAxIDEgMCAyNTYgMTI4IDEyOCAwIDEgMSAwLTI1NnptMCA5NmEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem0xNiA5NmExNiAxNiAwIDEgMCAwLTMyIDE2IDE2IDAgMSAwIDAgMzJ6Il0KICAgIH07CiAgICBmYUdlYXJzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImdlYXJzIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbImNvZ3MiXSwgImYwODUiLCAiTTQxNS45IDIxMC41YzEyLjItMy4zIDI1IDIuNSAzMC41IDEzLjhMNDY1IDI2MS45YzEwLjMgMS40IDIwLjQgNC4yIDI5LjkgOC4xbDM1LTIzLjNjMTAuNS03IDI0LjQtNS42IDMzLjMgMy4zbDE5LjIgMTkuMmM4LjkgOC45IDEwLjMgMjIuOSAzLjMgMzMuM2wtMjMuMyAzNC45YzEuOSA0LjcgMy42IDkuNiA1IDE0LjcgMS40IDUuMSAyLjMgMTAuMSAzIDE1LjJsMzcuNyAxOC42YzExLjMgNS42IDE3LjEgMTguNCAxMy44IDMwLjVsLTcgMjYuMmMtMy4zIDEyLjEtMTQuNiAyMC4zLTI3LjIgMTkuNWwtNDItMi43Yy02LjMgOC4xLTEzLjYgMTUuNi0yMS45IDIybDIuNyA0MS45Yy44IDEyLjYtNy40IDI0LTE5LjUgMjcuMmwtMjYuMiA3Yy0xMi4yIDMuMy0yNC45LTIuNS0zMC41LTEzLjhsLTE4LjYtMzcuNmMtMTAuMy0xLjQtMjAuNC00LjItMjkuOS04LjFsLTM1IDIzLjNjLTEwLjUgNy0yNC40IDUuNi0zMy4zLTMuM2wtMTkuMi0xOS4yYy04LjktOC45LTEwLjMtMjIuOC0zLjMtMzMuM2wyMy4zLTM1Yy0xLjktNC43LTMuNi05LjYtNS0xNC43cy0yLjMtMTAuMi0zLTE1LjJsLTM3LjctMTguNmMtMTEuMy01LjYtMTctMTguNC0xMy44LTMwLjVsNy0yNi4yYzMuMy0xMi4xIDE0LjYtMjAuMyAyNy4yLTE5LjVsNDEuOSAyLjdjNi4zLTguMSAxMy42LTE1LjYgMjEuOS0yMmwtMi43LTQxLjhjLS44LTEyLjYgNy40LTI0IDE5LjUtMjcuMmwyNi4yLTd6TTQ0OC40IDM0MGE0NCA0NCAwIDEgMCAuMSA4OCA0NCA0NCAwIDEgMCAtLjEtODh6TTIyNC45LTQ1LjVsMjYuMiA3YzEyLjEgMy4zIDIwLjMgMTQuNyAxOS41IDI3LjJsLTIuNyA0MS44YzguMyA2LjQgMTUuNiAxMy44IDIxLjkgMjJsNDItMi43YzEyLjUtLjggMjMuOSA3LjQgMjcuMiAxOS41bDcgMjYuMmMzLjIgMTIuMS0yLjUgMjQuOS0xMy44IDMwLjVsLTM3LjcgMTguNmMtLjcgNS4xLTEuNyAxMC4yLTMgMTUuMnMtMy4xIDEwLTUgMTQuN2wyMy4zIDM1YzcgMTAuNSA1LjYgMjQuNC0zLjMgMzMuM0wzMDcuMyAyNjJjLTguOSA4LjktMjIuOCAxMC4zLTMzLjMgMy4zTDIzOSAyNDJjLTkuNSAzLjktMTkuNiA2LjctMjkuOSA4LjFsLTE4LjYgMzcuNmMtNS42IDExLjMtMTguNCAxNy0zMC41IDEzLjhsLTI2LjItN2MtMTIuMi0zLjMtMjAuMy0xNC43LTE5LjUtMjcuMmwyLjctNDEuOWMtOC4zLTYuNC0xNS42LTEzLjgtMjEuOS0yMmwtNDIgMi43Yy0xMi41IC44LTIzLjktNy40LTI3LjItMTkuNWwtNy0yNi4yYy0zLjItMTIuMSAyLjUtMjQuOSAxMy44LTMwLjVsMzcuNy0xOC42Yy43LTUuMSAxLjctMTAuMSAzLTE1LjIgMS40LTUuMSAzLTEwIDUtMTQuN0w1NS4xIDQ2LjVjLTctMTAuNS01LjYtMjQuNCAzLjMtMzMuM0w3Ny42LTZjOC45LTguOSAyMi44LTEwLjMgMzMuMy0zLjNsMzUgMjMuM2M5LjUtMy45IDE5LjYtNi43IDI5LjktOC4xbDE4LjYtMzcuNmM1LjYtMTEuMyAxOC4zLTE3IDMwLjUtMTMuOHpNMTkyLjQgODRhNDQgNDQgMCAxIDAgMCA4OCA0NCA0NCAwIDEgMCAwLTg4eiJdCiAgICB9OwogICAgZmFDb2dzID0gZmFHZWFyczsKICAgIGZhRmlsZUNpcmNsZVBsdXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1jaXJjbGUtcGx1cyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzU4NjA2XSwgImU0OTQiLCAiTTk2IDBDNjAuNyAwIDMyIDI4LjcgMzIgNjRsMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTgwIDBjLTIyLjctMzEuNS0zNi03MC4yLTM2LTExMiAwLTEwMC42IDc3LjQtMTgzLjIgMTc2LTE5MS4zbDAtMzguMWMwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0wyOTAuNyAxOC43QzI3OC43IDYuNyAyNjIuNSAwIDI0NS41IDBMOTYgMHpNMzU3LjUgMTc2TDI2NCAxNzZjLTEzLjMgMC0yNC0xMC43LTI0LTI0TDI0MCA1OC41IDM1Ny41IDE3NnpNNDMyIDU0NGExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6bTE2LTIwOGwwIDQ4IDQ4IDBjOC44IDAgMTYgNy4yIDE2IDE2cy03LjIgMTYtMTYgMTZsLTQ4IDAgMCA0OGMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTQ4LTQ4IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsNDggMCAwLTQ4YzAtOC44IDcuMi0xNiAxNi0xNnMxNiA3LjIgMTYgMTZ6Il0KICAgIH07CiAgICBmYUljaWNsZXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaWNpY2xlcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmN2FkIiwgIk03NS44IDMwNC44TDEgMzUuN0MuMyAzMy4yIDAgMzAuNyAwIDI4LjIgMCAxMi42IDEyLjYgMCAyOC4yIDBMNDgyLjQgMGMxNi4zIDAgMjkuNiAxMy4yIDI5LjYgMjkuNiAwIDEuNi0uMSAzLjMtLjQgNC45TDQzNC42IDQ5Ni4xYy0xLjUgOS4yLTkuNSAxNS45LTE4LjggMTUuOS05LjIgMC0xNy4xLTYuNi0xOC43LTE1LjZMMzM2IDE2MCAzMDcuMiAzMDMuOWMtMS45IDkuMy0xMC4xIDE2LjEtMTkuNiAxNi4xLTkuMiAwLTE3LjItNi4yLTE5LjQtMTUuMUwyNDAgMTkyIDIxMC42IDM2OC4yYy0xLjUgOS4xLTkuNCAxNS44LTE4LjYgMTUuOHMtMTcuMS02LjctMTguNi0xNS44TDE0NCAxOTIgMTE1LjkgMzA0LjNjLTIuMyA5LjItMTAuNiAxNS43LTIwLjEgMTUuNy05LjMgMC0xNy41LTYuMi0yMC0xNS4yeiJdCiAgICB9OwogICAgZmFBcnJvd1RyZW5kVXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctdHJlbmQtdXAiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTA5OCIsICJNMzg0IDE2MGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxNjAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDE2MGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTgyLjctMTY5LjQgMTY5LjRjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwTDE5MiAyNjkuMyA1NC42IDQwNi42Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM2wxNjAtMTYwYzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwTDMyMCAzMDYuNyA0NjYuNyAxNjAgMzg0IDE2MHoiXQogICAgfTsKICAgIGZhSGV4YWdvbk5vZGVzQm9sdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoZXhhZ29uLW5vZGVzLWJvbHQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTY5YSIsICJNMjQ4IDEwNi42YzE4LjktOSAzMi0yOC4zIDMyLTUwLjZjMC0zMC45LTI1LjEtNTYtNTYtNTZzLTU2IDI1LjEtNTYgNTZjMCAyMi4zIDEzLjEgNDEuNiAzMiA1MC42bDAgOTguOGMtMi44IDEuMy01LjUgMi45LTggNC43bC04MC4xLTQ1LjhjMS42LTIwLjgtOC42LTQxLjYtMjcuOS01Mi44QzU3LjIgOTYgMjMgMTA1LjIgNy41IDEzMlMxLjIgMTkzIDI4IDIwOC41YzEuMyAuOCAyLjYgMS41IDQgMi4xbDAgOTAuOGMtMS4zIC42LTIuNyAxLjMtNCAyLjFDMS4yIDMxOS04IDM1My4yIDcuNSAzODBTNTcuMiA0MTYgODQgNDAwLjVjMTkuMy0xMS4xIDI5LjQtMzIgMjcuOC01Mi44bDUwLjUtMjguOWMtMTEuNS0xMS4yLTE5LjktMjUuNi0yMy44LTQxLjdMODggMzA2LjFjLTIuNi0xLjgtNS4yLTMuMy04LTQuN2wwLTkwLjhjMi44LTEuMyA1LjUtMi45IDgtNC43bDgwLjEgNDUuOGMtLjEgMS40LS4yIDIuOC0uMiA0LjNjMCAyMi4zIDEzLjEgNDEuNiAzMiA1MC42bDAgOTguOGMtMTguOSA5LTMyIDI4LjMtMzIgNTAuNmMwIDMwLjkgMjUuMSA1NiA1NiA1NmMzMC43IDAgNTUuNi0yNC43IDU2LTU1LjJjLTcuNS0xMi45LTEzLjUtMjYuOC0xNy42LTQxLjVjLTQuMi00LTkuMS03LjMtMTQuNC05LjlsMC05OC44YzIuOC0xLjMgNS41LTIuOSA4LTQuN2wxMC41IDZjNS41LTE1LjMgMTMuMS0yOS41IDIyLjQtNDIuNWwtOS4xLTUuMmMuMS0xLjQgLjItMi44IC4yLTQuM2MwLTIyLjMtMTMuMS00MS42LTMyLTUwLjZsMC05OC44ek00NDAuNSAxMzJDNDI1IDEwNS4yIDM5MC44IDk2IDM2NCAxMTEuNWMtMTkuMyAxMS4xLTI5LjQgMzItMjcuOCA1Mi44bC01MC42IDI4LjljMTEuNSAxMS4yIDE5LjkgMjUuNiAyMy44IDQxLjdMMzYwIDIwNS45Yy40IC4zIC44IC42IDEuMyAuOWMyMS43LTkuNSA0NS42LTE0LjggNzAuOC0xNC44YzIgMCA0IDAgNS45IC4xYzEyLjEtMTcuMyAxMy44LTQwLjYgMi42LTYwLjF6TTQzMiA1MTJhMTQ0IDE0NCAwIDEgMCAwLTI4OCAxNDQgMTQ0IDAgMSAwIDAgMjg4em00Ny45LTIyNWM0LjMgMy43IDUuNCA5LjkgMi42IDE0LjlMNDUyLjQgMzU2bDM1LjYgMGM1LjIgMCA5LjggMy4zIDExLjQgOC4ycy0uMSAxMC4zLTQuMiAxMy40bC05NiA3MmMtNC41IDMuNC0xMC44IDMuMi0xNS4xLS42cy01LjQtOS45LTIuNi0xNC45TDQxMS42IDM4MCAzNzYgMzgwYy01LjIgMC05LjgtMy4zLTExLjQtOC4ycy4xLTEwLjMgNC4yLTEzLjRsOTYtNzJjNC41LTMuNCAxMC44LTMuMiAxNS4xIC42eiJdCiAgICB9OwogICAgZmFRdWVzdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJxdWVzdGlvbiIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWzEwMDY3LCAxMDA2OCwgNjE3MzZdLCAiM2YiLCAiTTY0IDE2MGMwLTUzIDQzLTk2IDk2LTk2czk2IDQzIDk2IDk2YzAgNDIuNy0yNy45IDc4LjktNjYuNSA5MS40LTI4LjQgOS4yLTYxLjUgMzUuMy02MS41IDc2LjZsMCAyNGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjRjMC0xLjcgLjYtNC4xIDMuNS03LjMgMy0zLjMgNy45LTYuNSAxMy43LTguNCA2NC4zLTIwLjcgMTEwLjgtODEgMTEwLjgtMTUyLjMgMC04OC40LTcxLjYtMTYwLTE2MC0xNjBTMCA3MS42IDAgMTYwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJ6bTk2IDM1MmMyMi4xIDAgNDAtMTcuOSA0MC00MHMtMTcuOS00MC00MC00MC00MCAxNy45LTQwIDQwIDE3LjkgNDAgNDAgNDB6Il0KICAgIH07CiAgICBmYUhhbmRzQm91bmQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZHMtYm91bmQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRmOSIsICJNNjQgMzJDNjQgMTQuMyA0OS43IDAgMzIgMFMwIDE0LjMgMCAzMkwwIDIxMy45YzAgMTQuMiA1LjEgMjcuOSAxNC4zIDM4LjdMOTkuNiAzNTIgOTYgMzUyYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDM4NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0zLjYgMCA4NS4zLTk5LjVjOS4yLTEwLjggMTQuMy0yNC41IDE0LjMtMzguN0w1NzYgMzJjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAxMTIuOC02OS4zIDkyLjRjLTUuNyA3LjYtMTYuMSA5LjYtMjQuMiA0LjgtOS43LTUuNy0xMi4xLTE4LjctNS4xLTI3LjVMNDQxIDE4MGMxMC44LTEzLjUgOC45LTMzLjMtNC40LTQ0LjVzLTMzLTkuOC00NC41IDMuMmwtNDYuNyA1Mi41QzMyOSAyMDkuNyAzMjAgMjMzLjQgMzIwIDI1OC4xbDAgOTMuOS02NCAwIDAtOTMuOWMwLTI0LjYtOS00OC40LTI1LjQtNjYuOGwtNDYuNy01Mi41Yy0xMS41LTEzLTMxLjMtMTQuNC00NC41LTMuMlMxMjQuMiAxNjYuNCAxMzUgMTgwbDI3LjYgMzQuNWM3IDguOCA0LjcgMjEuOC01LjEgMjcuNS04LjEgNC44LTE4LjYgMi43LTI0LjItNC44TDY0IDE0NC44IDY0IDMyem02NCA0NDhsMCAzMiAxMjggMCAwLTMyIDY0IDAgMCAzMiAxMjggMCAwLTMyIDMyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRMOTYgNDMyYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDMyIDB6Il0KICAgIH07CiAgICBmYVBlcnNvbldhbGtpbmdMdWdnYWdlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi13YWxraW5nLWx1Z2dhZ2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTU1NCIsICJNMjY0LjMgMjRhNTYgNTYgMCAxIDEgMTEyIDAgNTYgNTYgMCAxIDEgLTExMiAwem0tOCAxODEuM2wtMjIuNiAyMi42Yy02IDYtOS40IDE0LjEtOS40IDIyLjZsMCAzNy41YzAgMTIuMy03IDIzLTE3LjIgMjguNC0uOSA0LjItMi40IDguNC00LjMgMTIuM2wtNjkgMTM4LjEtLjgtLjQtMjcuNyA1NS4zYy05LjkgMTkuOC0zMy45IDI3LjgtNTMuNyAxNy45TDE0LjYgNTIxYy0xOS44LTkuOS0yNy44LTMzLjktMTcuOS01My43TDQ3LjMgMzY2LjNjOS45LTE5LjggMzMuOS0yNy44IDUzLjctMTcuOWwzMC43IDE1LjMgMjguMy01Ni42Yy4zLS42IC40LTEuMiAuNC0xLjhsMC0xNi45YzAtLjIgMC0uMyAwLS41bDAtMzcuNWMwLTI1LjUgMTAuMS00OS45IDI4LjEtNjcuOWwzNS4xLTM1LjFjMjIuOC0yMi44IDUzLjYtMzUuNiA4NS44LTM1LjYgMzYuOSAwIDcxLjggMTYuOCA5NC44IDQ1LjZMNDIyLjEgMTgwYzYuMSA3LjYgMTUuMyAxMiAyNSAxMmwzMy4yIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTMzLjIgMGMtMjkuMiAwLTU2LjctMTMuMy03NS0zNmwtMy44LTQuNyAwIDExNS4yIDM0LjUgMjkuNmMxNy43IDE1LjIgMjkuMyAzNi4yIDMyLjYgNTkuM0w0NDggNTA3LjVjMi41IDE3LjUtOS43IDMzLjctMjcuMiAzNi4ycy0zMy43LTkuNy0zNi4yLTI3LjJMMzcyIDQyOC40Yy0xLjEtNy43LTUtMTQuNy0xMC45LTE5LjhsLTcxLjQtNjEuMmMtMjEuMy0xOC4yLTMzLjUtNDQuOS0zMy41LTcyLjlsMC02OS4zem0uMSAxNjUuOGMyLjQgMi4zIDQuOCA0LjYgNy40IDYuOGw0NiAzOS40LTIuMiA3LjZjLTQuNSAxNS43LTEyLjkgMzAtMjQuNCA0MS41bC02OC4zIDY4LjNjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwcy0xMi41LTMyLjggMC00NS4zTDIzOCA0MjEuMWMzLjgtMy44IDYuNi04LjYgOC4xLTEzLjhMMjU2LjQgMzcxeiJdCiAgICB9OwogICAgZmFGaWxlQXJyb3dEb3duID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbGUtYXJyb3ctZG93biIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJmaWxlLWRvd25sb2FkIl0sICJmNTZkIiwgIk0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwyMTMuNSAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDM2NS4zIDEyNS4zYzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNMMzg0IDQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6bTIwOC01LjVsMCA5My41YzAgMTMuMyAxMC43IDI0IDI0IDI0TDMyNS41IDE3NiAyMDggNTguNXpNMTc1IDQ0MWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMGw2NC02NGM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwbC0yMyAyMyAwLTg2LjFjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCA4Ni4xLTIzLTIzYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDY0IDY0eiJdCiAgICB9OwogICAgZmFGaWxlRG93bmxvYWQgPSBmYUZpbGVBcnJvd0Rvd247CiAgICBmYVBlcnNvbkJvb3RoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1ib290aCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNzU2IiwgIk00MCAyNEE1NiA1NiAwIDEgMSAxNTIgMjQgNTYgNTYgMCAxIDEgNDAgMjR6bTUxLjEgODhjMjMuNSAwIDQ1LjUgMTEuMyA1OS4xIDMwLjRsNDguNyA2OC4yYzYgOC40IDE1LjcgMTMuNCAyNiAxMy40bDMxLjEgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzEuMSAwYy0zMSAwLTYwLjEtMTUtNzguMS00MC4ybC0yLjgtMy45IDAgODAuMSA0MS42IDMxLjJDMjA5LjggMzczLjMgMjI0IDQwMS44IDIyNCA0MzJsMCA4MGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTgwYzAtMTAuMS00LjctMTkuNi0xMi44LTI1LjZMNzAuNCAzNDguOEM0Ni4yIDMzMC43IDMyIDMwMi4yIDMyIDI3MmwwLTEwMC45QzMyIDEzOC41IDU4LjUgMTEyIDkxLjEgMTEyek0zMiA1MTJsMC0xMzIuN2MzLjEgMi43IDYuMyA1LjQgOS42IDcuOUw5NiA0MjggOTYgNTEyYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMyem01NDQtODhsMCA5NmMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTcyLTE2OCAwYy03LjEgMC0xMy44LTMuMS0xOC40LTguNnMtNi41LTEyLjYtNS4zLTE5LjZsMzAuNy0xNzYuNy02My4xLTEzNy42IDAgNzJjLTUuMi0xLTEwLjUtMS42LTE2LTEuNmwtMzIgMCAwLTEyMGMwLTMwLjkgMjUuMS01NiA1Ni01Nkw1MjAgMGMzMC45IDAgNTYgMjUuMSA1NiA1NmwwIDM2OHpNMjg4IDMzNmM1LjUgMCAxMC44LS42IDE2LTEuNkwzMDQgNTIwYzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMTg0IDMyIDB6Il0KICAgIH07CiAgICBmYUxvY3VzdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsb2N1c3QiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUyMCIsICJNMzI4IDMyYzEzNyAwIDI0OCAxMTEgMjQ4IDI0OGwwIDQwLS40IDguMkM1NzEuNSAzNjguNSA1MzcuNCA0MDAgNDk2IDQwMGwtMTIuMyAwIDI1LjIgNDQuMWM2LjYgMTEuNSAyLjYgMjYuMi04LjkgMzIuOHMtMjYuMiAyLjYtMzIuNy04LjlsLTM4LjgtNjcuOS04MC40IDAtNDguMiA2OS43Yy03LjUgMTAuOS0yMi41IDEzLjYtMzMuNCA2LjFzLTEzLjYtMjIuNS02LjEtMzMuNGwyOS4zLTQyLjMtNzQuNSAwLTUxLjcgNzAuMmMtNy45IDEwLjctMjIuOSAxMi45LTMzLjYgNS4xcy0xMi45LTIyLjktNS4xLTMzLjZsNDAuNS01NS00My0xNi40LTc5LjMgMTAwLjVjLTguMiAxMC40LTIzLjMgMTIuMi0zMy43IDRzLTEyLjItMjMuMy00LTMzLjdsMjQwLTMwNCAyLjEtMi4zYzUuMi01LjEgMTIuNS03LjUgMTkuOS02LjYgOC40IDEuMSAxNS42IDYuNSAxOC45IDE0LjNsMjEuNyA1MC43IDQwLjktNTUuNSAyLjEtMi40YzUuMS01LjMgMTIuNS04IDIwLTcuMiA4LjUgMSAxNS45IDYuNSAxOS4zIDE0LjRsNDEuOCA5Ny41IDY0LjIgMGMxMC4yIDAgMjAgMiAyOSA1LjUtMTYuNC05NC05OC4zLTE2NS41LTE5Ny0xNjUuNWwtMTYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxNiAwek00ODggMjk2YTI0IDI0IDAgMSAwIDAgNDggMjQgMjQgMCAxIDAgMC00OHpNNDMuNSAzMzEuMUMzNi4yIDMyMS40IDMyIDMwOS41IDMyIDI5Ni44IDMyIDI2NS41IDU3LjUgMjQwIDg4LjkgMjQwbDI3LjYgMC03Mi45IDkxLjF6TTIyNS4xIDI0MGw0OC4yIDAgMS40LTEuOS0xNi45LTM5LjUtMzIuNyA0MS41em0xMDcuOCAwbDQ2LjcgMC0xNy4yLTQwLTI5LjUgNDB6Il0KICAgIH07CiAgICBmYVJpZ2h0TG9uZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyaWdodC1sb25nIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImxvbmctYXJyb3ctYWx0LXJpZ2h0Il0sICJmMzBiIiwgIk01NjYuNiAyMzMuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM2wtMTI4IDEyOGMtOS4yIDkuMi0yMi45IDExLjktMzQuOSA2LjlTMzg0IDM5Ni45IDM4NCAzODRsMC02NC0zMzYgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC0zMmMwLTI2LjUgMjEuNS00OCA0OC00OGwzMzYgMCAwLTY0YzAtMTIuOSA3LjgtMjQuNiAxOS44LTI5LjZzMjUuNy0yLjIgMzQuOSA2LjlsMTI4IDEyOHoiXQogICAgfTsKICAgIGZhTG9uZ0Fycm93QWx0UmlnaHQgPSBmYVJpZ2h0TG9uZzsKICAgIGZhVHJ1Y2tEcm9wbGV0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRydWNrLWRyb3BsZXQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTU4YyIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwzLjMgMGMxMC40IDM2LjkgNDQuNCA2NCA4NC43IDY0czc0LjItMjcuMSA4NC43LTY0bDEwMi42IDBjMTAuNCAzNi45IDQ0LjQgNjQgODQuNyA2NHM3NC4yLTI3LjEgODQuNy02NGwzLjMgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTE0Ni43YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDUxMiAxNDYuN2MtMTItMTItMjguMy0xOC43LTQ1LjMtMTguN2wtNTAuNyAwIDAtMzJjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6TTUxMiAyMzcuM2wwIDUwLjctOTYgMCAwLTk2IDUwLjcgMCA0NS4zIDQ1LjN6TTE1MiAzODRhNDAgNDAgMCAxIDEgMCA4MCA0MCA0MCAwIDEgMSAwLTgwem0yMzIgNDBhNDAgNDAgMCAxIDEgODAgMCA0MCA0MCAwIDEgMSAtODAgMHpNMjA4IDMwNGMtMzkuOCAwLTcyLTMyLjItNzItNzIgMC0zMy4yIDM0LjUtNzggNTUuOC0xMDIuNCA4LjctMTAgMjMuOC0xMCAzMi41IDAgMjEuMiAyNC40IDU1LjggNjkuMSA1NS44IDEwMi40IDAgNDgtMzIuMiA3Mi03MiA3MnoiXQogICAgfTsKICAgIGZhSGFuZEhvbGRpbmdNZWRpY2FsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbmQtaG9sZGluZy1tZWRpY2FsIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImUwNWMiLCAiTTI0MCAyNGMwLTEzLjMgMTAuNy0yNCAyNC0yNGw0OCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgNTYgNTYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0bC01NiAwIDAgNTZjMCAxMy4zLTEwLjcgMjQtMjQgMjRsLTQ4IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtNTYtNTYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC00OGMwLTEzLjMgMTAuNy0yNCAyNC0yNGw1NiAwIDAtNTZ6TTY2LjcgMzg0bDQyLjUtNDIuNWMyNC0yNCA1Ni42LTM3LjUgOTAuNS0zNy41TDM1MiAzMDRjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTcyIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTEyLjYgMCAxMTkuNy04OC4yYzE3LjgtMTMuMSA0Mi44LTkuMyA1NS45IDguNXM5LjMgNDIuOC04LjUgNTUuOUw0MzMuMSA0ODUuNWMtMjMuNCAxNy4yLTUxLjYgMjYuNS04MC43IDI2LjVMMzIgNTEyYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTY0YzAtMTcuNyAxNC4zLTMyIDMyLTMybDM0LjcgMHoiXQogICAgfTsKICAgIGZhSGFuZFBvaW50TGVmdDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1wb2ludC1sZWZ0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYwYTUiLCAiTTMyIDk2QzE0LjMgOTYgMCAxMTAuMyAwIDEyOHMxNC4zIDMyIDMyIDMybDIwOCAwIDAtNjQtMjA4IDB6TTE5MiAyODhjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNjQgMHptLTY0LTY0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDQ4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTQ4IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyem05NiAxNjBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNjQgMHptODgtOTZsLS42IDBjNS40IDkuNCA4LjYgMjAuMyA4LjYgMzIgMCAxMy4yLTQgMjUuNC0xMC44IDM1LjYgMjQuOSA4LjcgNDIuOCAzMi41IDQyLjggNjAuNCAwIDExLjctMy4xIDIyLjYtOC42IDMybDguNiAwYzg4LjQgMCAxNjAtNzEuNiAxNjAtMTYwbDAtNjEuN2MwLTQyLjQtMTYuOS04My4xLTQ2LjktMTEzLjFsLTExLjYtMTEuNkM0MjkuNSA3Ny41IDM5Ni45IDY0IDM2MyA2NGwtMjcgMGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCA4OGMwIDIyLjEgMTcuOSA0MCA0MCA0MHM0MC0xNy45IDQwLTQwbDAtNTZjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDU2YzAgMzkuOC0zMi4yIDcyLTcyIDcyeiJdCiAgICB9OwogICAgZmFDYWxjdWxhdG9yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhbGN1bGF0b3IiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjg0MjVdLCAiZjFlYyIsICJNNjQgMEMyOC43IDAgMCAyOC43IDAgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjU2IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zODRjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMHpNOTYgNjRsMTkyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAzMmMwIDE3LjctMTQuMyAzMi0zMiAzMkw5NiAxNjBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMzJjMC0xNy43IDE0LjMtMzIgMzItMzJ6bTE2IDE2OGEyNCAyNCAwIDEgMSAtNDggMCAyNCAyNCAwIDEgMSA0OCAwem04MCAyNGEyNCAyNCAwIDEgMSAwLTQ4IDI0IDI0IDAgMSAxIDAgNDh6bTEyOC0yNGEyNCAyNCAwIDEgMSAtNDggMCAyNCAyNCAwIDEgMSA0OCAwek04OCAzNTJhMjQgMjQgMCAxIDEgMC00OCAyNCAyNCAwIDEgMSAwIDQ4em0xMjgtMjRhMjQgMjQgMCAxIDEgLTQ4IDAgMjQgMjQgMCAxIDEgNDggMHptODAgMjRhMjQgMjQgMCAxIDEgMC00OCAyNCAyNCAwIDEgMSAwIDQ4ek02NCA0MjRjMC0xMy4zIDEwLjctMjQgMjQtMjRsMTEyIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRMODggNDQ4Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNHptMjMyLTI0YzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0LTI0LTEwLjctMjQtMjQgMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhTWludXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWludXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs4MjExLCA4NzIyLCAxMDEzNCwgInN1YnRyYWN0Il0sICJmMDY4IiwgIk0wIDI1NmMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzODQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiAyODhjLTE3LjcgMC0zMi0xNC4zLTMyLTMyeiJdCiAgICB9OwogICAgZmFTdWJ0cmFjdCA9IGZhTWludXM7CiAgICBmYUFycm93VXBaQSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy11cC16LWEiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsic29ydC1hbHBoYS11cC1hbHQiXSwgImY4ODIiLCAiTTE1MC42IDQxLjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwbC04MCA4MGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMEw5NiAxNDEuMyA5NiA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTMwNi43IDI1LjQgMjUuNGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zbC04MC04MHpNMjg4IDY0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDUwLjcgMC03My40IDczLjRjLTkuMiA5LjItMTEuOSAyMi45LTYuOSAzNC45UzMwNy4xIDIyNCAzMjAgMjI0bDEyOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC01MC43IDAgNzMuNC03My40YzkuMi05LjIgMTEuOS0yMi45IDYuOS0zNC45UzQ2MSAzMiA0NDggMzJMMzIwIDMyYy0xNy43IDAtMzIgMTQuMy0zMiAzMnpNNDEyLjYgMjczLjdDNDA3LjIgMjYyLjggMzk2LjEgMjU2IDM4NCAyNTZzLTIzLjIgNi44LTI4LjYgMTcuN2wtODAgMTYwYy03LjkgMTUuOC0xLjUgMzUgMTQuMyA0Mi45czM1IDEuNSA0Mi45LTE0LjNsNy4yLTE0LjMgODguNCAwIDcuMiAxNC4zYzcuOSAxNS44IDI3LjEgMjIuMiA0Mi45IDE0LjNzMjIuMi0yNy4xIDE0LjMtNDIuOWwtODAtMTYwek0zODQgMzU5LjZsMjAuMiA0MC40LTQwLjQgMCAyMC4yLTQwLjR6Il0KICAgIH07CiAgICBmYVNvcnRBbHBoYVVwQWx0ID0gZmFBcnJvd1VwWkE7CiAgICBmYU1pY3JvcGhvbmVTbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtaWNyb3Bob25lLXNsYXNoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYxMzEiLCAiTTQxLTI0LjljLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwUy0yLjMtLjMgNyA5LjFsNTI4IDUyOGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlMNDI0LjcgMzU4LjhDNDU4LjkgMzI0LjIgNDgwIDI3Ni42IDQ4MCAyMjRsMC00MGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDQwYzAgMzkuMy0xNS43IDc0LjktNDEuMyAxMDAuOUwzNTYuOCAyOTFDMzczLjYgMjczLjcgMzg0IDI1MCAzODQgMjI0bDAtMTI4YzAtNTMtNDMtOTYtOTYtOTZzLTk2IDQzLTk2IDk2bDAgMzAuMi0xNTEtMTUxem0yOTguMyA0MzRsLTQxLjQtNDEuNGMtMy4zIC4yLTYuNSAuMy05LjggLjMtNzkuNSAwLTE0NC02NC41LTE0NC0xNDRsMC0xMC4yLTQzLjYtNDMuNmMtMi44IDMuOS00LjQgOC43LTQuNCAxMy44bDAgNDBjMCA5Ny45IDczLjMgMTc4LjcgMTY4IDE5MC41bDAgNDkuNS00OCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDE0NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC00OCAwIDAtNDkuNWM5LjMtMS4yIDE4LjQtMyAyNy4zLTUuNHoiXQogICAgfTsKICAgIGZhU3F1YXJlUGVuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1wZW4iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsicGVuLXNxdWFyZSIsICJwZW5jaWwtc3F1YXJlIl0sICJmMTRiIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyek0zMjUuOCAxMzkuN2wxNC40IDE0LjRjMTUuNiAxNS42IDE1LjYgNDAuOSAwIDU2LjZsLTIzLjggMjMuOC03MS03MSAyMy44LTIzLjhjMTUuNi0xNS42IDQwLjktMTUuNiA1Ni42IDB6TTExOS45IDI4OWw5MS41LTkxLjYgNzEgNzEtOTEuNiA5MS41Yy00LjEgNC4xLTkuMiA3LTE0LjkgOC40bC02MC4xIDE1Yy01LjUgMS40LTExLjItLjItMTUuMi00LjJzLTUuNi05LjctNC4yLTE1LjJsMTUtNjAuMWMxLjQtNS42IDQuMy0xMC44IDguNC0xNC45eiJdCiAgICB9OwogICAgZmFQZW5TcXVhcmUgPSBmYVNxdWFyZVBlbjsKICAgIGZhUGVuY2lsU3F1YXJlID0gZmFTcXVhcmVQZW47CiAgICBmYUhhbmRGaXN0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbmQtZmlzdCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzk5OTQsICJmaXN0LXJhaXNlZCJdLCAiZjZkZSIsICJNMTYwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxMTItNjQgMCAwLTExMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNMzIgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJTOTYgNDYuMyA5NiA2NGwwIDgwLTY0IDAgMC04MHptMTkyIDBjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDk2YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtOTZ6bTk2IDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY0em0tOTYgODhsMC0uNmM5LjQgNS40IDIwLjMgOC42IDMyIDguNiAxMy4yIDAgMjUuNC00IDM1LjYtMTAuOCA4LjcgMjQuOSAzMi41IDQyLjggNjAuNCA0Mi44IDExLjcgMCAyMi42LTMuMSAzMi04LjZsMCA4LjZjMCA1Mi4zLTI1LjEgOTguOC02NCAxMjhsMCA5NmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMTYwIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNzguNGMtMTcuMy03LjktMzMuMi0xOC44LTQ2LjktMzIuNUwzNy41IDM1Ny41QzEzLjUgMzMzLjUgMCAzMDAuOSAwIDI2N2wwLTI3YzAtMzUuMyAyOC43LTY0IDY0LTY0bDg4IDBjMjIuMSAwIDQwIDE3LjkgNDAgNDBzLTE3LjkgNDAtNDAgNDBsLTU2IDBjLTguOCAwLTE2IDcuMi0xNiAxNnM3LjIgMTYgMTYgMTZsNTYgMGMzOS44IDAgNzItMzIuMiA3Mi03MnoiXQogICAgfTsKICAgIGZhRmlzdFJhaXNlZCA9IGZhSGFuZEZpc3Q7CiAgICBmYUNvbW1lbnRTbXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY29tbWVudC1zbXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsic21zIl0sICJmN2NkIiwgIk0yNTYgNDgwYzE0MS40IDAgMjU2LTEwNy41IDI1Ni0yNDBTMzk3LjQgMCAyNTYgMCAwIDEwNy41IDAgMjQwYzAgNTQuMyAxOS4yIDEwNC4zIDUxLjYgMTQ0LjVMMi44IDQ3Ni44Yy00LjggOS0zLjMgMjAgMy42IDI3LjVzMTcuOCA5LjggMjcuMSA1LjhsMTE4LjQtNTAuN0MxODMuNyA0NzIuNiAyMTguOSA0ODAgMjU2IDQ4MHpNMTQwLjggMTcyLjhsMTkuMiAwYzguOCAwIDE2IDcuMiAxNiAxNnMtNy4yIDE2LTE2IDE2bC0xOS4yIDBjLTUuMyAwLTkuNiA0LjMtOS42IDkuNnM0LjMgOS42IDkuNiA5LjZjMjMgMCA0MS42IDE4LjYgNDEuNiA0MS42cy0xOC42IDQxLjYtNDEuNiA0MS42bC0yNS42IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsMjUuNiAwYzUuMyAwIDkuNi00LjMgOS42LTkuNnMtNC4zLTkuNi05LjYtOS42Yy0yMyAwLTQxLjYtMTguNi00MS42LTQxLjZzMTguNi00MS42IDQxLjYtNDEuNnptMTg4LjggNDEuNmMwLTIzIDE4LjYtNDEuNiA0MS42LTQxLjZsMTkuMiAwYzguOCAwIDE2IDcuMiAxNiAxNnMtNy4yIDE2LTE2IDE2bC0xOS4yIDBjLTUuMyAwLTkuNiA0LjMtOS42IDkuNnM0LjMgOS42IDkuNiA5LjZjMjMgMCA0MS42IDE4LjYgNDEuNiA0MS42cy0xOC42IDQxLjYtNDEuNiA0MS42bC0yNS42IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsMjUuNiAwYzUuMyAwIDkuNi00LjMgOS42LTkuNnMtNC4zLTkuNi05LjYtOS42Yy0yMyAwLTQxLjYtMTguNi00MS42LTQxLjZ6bS05OC4zLTMzLjhsMjQuNyA0MS4xIDI0LjctNDEuMWMzLjctNi4yIDExLjEtOS4xIDE4LTcuMnMxMS43IDguMiAxMS43IDE1LjRsMCAxMDIuNGMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTQ0LjYtOC43IDE0LjVjLTIuOSA0LjgtOC4xIDcuOC0xMy43IDcuOHMtMTAuOC0zLTEzLjctNy44bC04LjctMTQuNSAwIDQ0LjZjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC0xMDIuNGMwLTcuMiA0LjgtMTMuNSAxMS43LTE1LjRzMTQuMyAxIDE4IDcuMnoiXQogICAgfTsKICAgIGZhU21zID0gZmFDb21tZW50U21zOwogICAgZmFTaW1DYXJkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNpbS1jYXJkIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY3YzQiLCAiTTAgNjRDMCAyOC43IDI4LjcgMCA2NCAwTDI1OC43IDBjMTcgMCAzMy4zIDYuNyA0NS4zIDE4LjdMMzY1LjMgODBjMTIgMTIgMTguNyAyOC4zIDE4LjcgNDUuM0wzODQgNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA2NHpNOTYgMjU2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDQwIDEyOCAwIDAtNzItOTYgMHpNNjQgNDE2YzAgMTcuNyAxNC4zIDMyIDMyIDMybDQ4IDAgMC03Mi04MCAwIDAgNDB6bTI1NiAwbDAtNDAtMTI4IDAgMCA3MiA5NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMyem0wLTEyOGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtNDggMCAwIDcyIDgwIDAgMC00MHoiXQogICAgfTsKICAgIGZhU2NhbGVCYWxhbmNlZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzY2FsZS1iYWxhbmNlZCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzk4NzgsICJiYWxhbmNlLXNjYWxlIl0sICJmMjRlIiwgIk0zODQgMzJsMTI4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzk4LjQgOTZjLTUuMiAyNS44LTIyLjkgNDcuMS00Ni40IDU3LjNsMCAyOTQuNyAxNjAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzg0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMTYwIDAgMC0yOTQuN2MtMjMuNS0xMC4zLTQxLjItMzEuNi00Ni40LTU3LjNMMTI4IDk2Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDEyOCAwYzE0LjYtMTkuNCAzNy44LTMyIDY0LTMyczQ5LjQgMTIuNiA2NCAzMnptNTUuNiAyODhMNTg0LjQgMzIwIDUxMiAxOTUuOCA0MzkuNiAzMjB6TTUxMiA0MTZjLTYyLjkgMC0xMTUuMi0zNC0xMjYtNzguOS0yLjYtMTEgMS0yMi4zIDYuNy0zMi4xbDk1LjItMTYzLjJjNS04LjYgMTQuMi0xMy44IDI0LjEtMTMuOHMxOS4xIDUuMyAyNC4xIDEzLjhsOTUuMiAxNjMuMmM1LjcgOS44IDkuMyAyMS4xIDYuNyAzMi4xLTEwLjggNDQuOC02My4xIDc4LjktMTI2IDc4Ljl6TTEyNi44IDE5NS44TDU0LjQgMzIwIDE5OS4zIDMyMCAxMjYuOCAxOTUuOHpNLjkgMzM3LjFjLTIuNi0xMSAxLTIyLjMgNi43LTMyLjFsOTUuMi0xNjMuMmM1LTguNiAxNC4yLTEzLjggMjQuMS0xMy44czE5LjEgNS4zIDI0LjEgMTMuOGw5NS4yIDE2My4yYzUuNyA5LjggOS4zIDIxLjEgNi43IDMyLjEtMTAuOCA0NC44LTYzLjEgNzguOS0xMjYgNzguOVMxMS43IDM4MiAuOSAzMzcuMXoiXQogICAgfTsKICAgIGZhQmFsYW5jZVNjYWxlID0gZmFTY2FsZUJhbGFuY2VkOwogICAgZmFDYXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NjY0LCAiYXV0b21vYmlsZSJdLCAiZjFiOSIsICJNMTM1LjIgMTE3LjRsLTI2LjEgNzQuNiAyOTMuOCAwLTI2LjEtNzQuNkMzNzIuMyAxMDQuNiAzNjAuMiA5NiAzNDYuNiA5NkwxNjUuNCA5NmMtMTMuNiAwLTI1LjcgOC42LTMwLjIgMjEuNHpNMzkuNiAxOTYuOEw3NC44IDk2LjNDODguMyA1Ny44IDEyNC42IDMyIDE2NS40IDMybDE4MS4yIDBjNDAuOCAwIDc3LjEgMjUuOCA5MC42IDY0LjNsMzUuMiAxMDAuNWMyMy4yIDkuNiAzOS42IDMyLjUgMzkuNiA1OS4ybDAgMTkyYzAgMTcuNy0xNC4zIDMyLTMyIDMybC0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTMyLTMyMCAwIDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJsLTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyTDAgMjU2YzAtMjYuNyAxNi40LTQ5LjYgMzkuNi01OS4yek0xMjggMzA0YTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6bTI4OCAzMmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6Il0KICAgIH07CiAgICBmYUF1dG9tb2JpbGUgPSBmYUNhcjsKICAgIGZhQ3JvcFNpbXBsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjcm9wLXNpbXBsZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJjcm9wLWFsdCJdLCAiZjU2NSIsICJNMTI4IDMyYzAtMTcuNy0xNC4zLTMyLTMyLTMyUzY0IDE0LjMgNjQgMzJsMCAzMi0zMiAwQzE0LjMgNjQgMCA3OC4zIDAgOTZzMTQuMyAzMiAzMiAzMmwzMiAwIDAgMjU2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDIwOCAwIDAtNjQtMjA4IDAgMC0zNTJ6TTM4NCA0ODBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTMyIDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTMyIDAgMC0yNTZjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTIwOCAwIDAgNjQgMjA4IDAgMCAzNTJ6Il0KICAgIH07CiAgICBmYUNyb3BBbHQgPSBmYUNyb3BTaW1wbGU7CiAgICBmYU1lZGFsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1lZGFsIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI3OTQxXSwgImY1YTIiLCAiTTIyNC4zIDEyOEwxMzkuNy0xMi45Yy02LjUtMTAuOC0yMC4xLTE0LjctMzEuMy05LjFMMjEuOCAyMS4zQzkuOSAyNy4yIDUuMSA0MS42IDExIDUzLjVMODAuNiAxOTIuNmMtMzAuMSAzMy45LTQ4LjMgNzguNS00OC4zIDEyNy40IDAgMTA2IDg2IDE5MiAxOTIgMTkyczE5Mi04NiAxOTItMTkyYzAtNDguOS0xOC4zLTkzLjUtNDguMy0xMjcuNEw0MzcuNiA1My41YzUuOS0xMS45IDEuMS0yNi4zLTEwLjctMzIuMkwzNDAuMi0yMi4xYy0xMS4yLTUuNi0yNC45LTEuNi0zMS4zIDkuMUwyMjQuMyAxMjh6bTMwLjggMTQyLjVjMS40IDIuOCA0IDQuNyA3IDUuMWw1MC4xIDcuM2M3LjcgMS4xIDEwLjcgMTAuNSA1LjIgMTZsLTM2LjMgMzUuNGMtMi4yIDIuMi0zLjIgNS4yLTIuNyA4LjNsOC42IDQ5LjljMS4zIDcuNi02LjcgMTMuNS0xMy42IDkuOWwtNDQuOC0yMy42Yy0yLjctMS40LTYtMS40LTguNyAwbC00NC44IDIzLjZjLTYuOSAzLjYtMTQuOS0yLjItMTMuNi05LjlsOC42LTQ5LjljLjUtMy0uNS02LjEtMi43LTguM2wtMzYuMy0zNS40Yy01LjYtNS40LTIuNS0xNC44IDUuMi0xNmw1MC4xLTcuM2MzLS40IDUuNy0yLjQgNy01LjFsMjIuNC00NS40YzMuNC03IDEzLjMtNyAxNi44IDBsMjIuNCA0NS40eiJdCiAgICB9OwogICAgZmFTY3JvbGwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2Nyb2xsIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4MjIwXSwgImY3MGUiLCAiTTAgMTEyQzAgNzAuNSAzMS42IDM2LjQgNzIgMzIuNGwwLS40IDI4MCAwYzUzIDAgOTYgNDMgOTYgOTZsMCAxNzYtMTc2IDBjLTM5LjggMC03MiAzMi4yLTcyIDcybDAgNjBjMCAyNC4zLTE5LjcgNDQtNDQgNDRzLTQ0LTE5LjctNDQtNDRsMC0yMjgtNjQgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC00OHpNMjM2LjggNDgwYzcuMS0xMy4xIDExLjItMjguMSAxMS4yLTQ0bDAtNjBjMC0xMy4zIDEwLjctMjQgMjQtMjRsMjQ4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCAyNGMwIDQ0LjItMzUuOCA4MC04MCA4MGwtMjI3LjIgMHpNODAgODBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgNDggNjQgMCAwLTQ4YzAtMTcuNy0xNC4zLTMyLTMyLTMyeiJdCiAgICB9OwogICAgZmFGaWxlRXhjZWwyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbGUtZXhjZWwiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjFjMyIsICJNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMMjEzLjUgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN0wzNjUuMyAxMjUuM2MxMiAxMiAxOC43IDI4LjMgMTguNyA0NS4zTDM4NCA0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDY0em0yMDgtNS41bDAgOTMuNWMwIDEzLjMgMTAuNyAyNCAyNCAyNEwzMjUuNSAxNzYgMjA4IDU4LjV6TTE2NCAyNjYuN2MtNy40LTExLTIyLjMtMTQtMzMuMy02LjdzLTE0IDIyLjMtNi43IDMzLjNMMTYzLjIgMzUyIDEyNCA0MTAuN2MtNy40IDExLTQuNCAyNS45IDYuNyAzMy4zczI1LjkgNC40IDMzLjMtNi43bDI4LTQyIDI4IDQyYzcuNCAxMSAyMi4zIDE0IDMzLjMgNi43czE0LTIyLjMgNi43LTMzLjNMMjIwLjggMzUyIDI2MCAyOTMuM2M3LjQtMTEgNC40LTI1LjktNi43LTMzLjNzLTI1LjktNC40LTMzLjMgNi43bC0yOCA0Mi0yOC00MnoiXQogICAgfTsKICAgIGZhRmlsdGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbHRlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMGIwIiwgIk0zMiA2NEMxOS4xIDY0IDcuNCA3MS44IDIuNCA4My44Uy4yIDEwOS41IDkuNCAxMTguNkwxOTIgMzAxLjMgMTkyIDQxNmMwIDguNSAzLjQgMTYuNiA5LjQgMjIuNmw2NCA2NGM5LjIgOS4yIDIyLjkgMTEuOSAzNC45IDYuOVMzMjAgNDkyLjkgMzIwIDQ4MGwwLTE3OC43IDE4Mi42LTE4Mi42YzkuMi05LjIgMTEuOS0yMi45IDYuOS0zNC45UzQ5Mi45IDY0IDQ4MCA2NEwzMiA2NHoiXQogICAgfTsKICAgIGZhRHJ1bSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkcnVtIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI5MzQ1XSwgImY1NjkiLCAiTTUwMS4yIDc2LjFjMTEuMS03LjMgMTQuMi0yMi4xIDYuOS0zMy4ycy0yMi4xLTE0LjItMzMuMi02LjlMMzcwLjIgMTA0LjVDMzM1LjggOTguNyAyOTcgOTYgMjU2IDk2IDExNC42IDk2IDAgMTI4IDAgMjA4TDAgMzY4YzAgMzEuMyAyNy40IDU4LjggNzIgNzguN0w3MiAzNDRjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDExOS40YzMzIDguOSA3MS4xIDE0LjUgMTEyIDE2LjFMMjMyIDM3NmMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgMTAzLjVjNDAuOS0xLjYgNzktNy4yIDExMi0xNi4xTDM5MiAzNDRjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDEwMi43YzQ0LjYtMTkuOSA3Mi00Ny40IDcyLTc4LjdsMC0xNjBjMC00MS4xLTMwLjItNjkuNS03OC44LTg3LjRsNjcuOS00NC41ek0zMDcuNCAxNDUuNmwtNjQuNiA0Mi4zYy0xMS4xIDcuMy0xNC4yIDIyLjEtNi45IDMzLjJzMjIuMSAxNC4yIDMzLjIgNi45bDExMS4xLTcyLjhjMTQuNyAzLjIgMjcuOSA3IDM5LjQgMTEuNSAzOC44IDE1LjEgNDQuNCAzMC42IDQ0LjQgNDEuMyAwIC44LTIuNyAxNy4yLTQ2IDM1LjktMzguOSAxNi44LTk2IDI4LjEtMTYyIDI4LjFTMTMyLjkgMjYwLjcgOTQgMjQzLjljLTQzLjMtMTguNy00Ni0zNS4xLTQ2LTM1LjkgMC0xMC42IDUuNi0yNi4yIDQ0LjQtNDEuMyAzOC4zLTE0LjkgOTUuNC0yMi43IDE2My42LTIyLjcgMTggMCAzNS4xIC41IDUxLjQgMS42eiJdCiAgICB9OwogICAgZmFNYXBQaW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFwLXBpbiIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWzEyODIwNV0sICJmMjc2IiwgIk0xOTIgMjg0LjRDMjU2LjEgMjY5LjkgMzA0IDIxMi41IDMwNCAxNDQgMzA0IDY0LjUgMjM5LjUgMCAxNjAgMFMxNiA2NC41IDE2IDE0NGMwIDY4LjUgNDcuOSAxMjUuOSAxMTIgMTQwLjRMMTI4IDQ4MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTk1LjZ6TTE2OCA5NmMtMzAuOSAwLTU2IDI1LjEtNTYgNTYgMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRjMC01Ny40IDQ2LjYtMTA0IDEwNC0xMDQgMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjR6Il0KICAgIH07CiAgICBmYVNjYWxlVW5iYWxhbmNlZEZsaXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2NhbGUtdW5iYWxhbmNlZC1mbGlwIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbImJhbGFuY2Utc2NhbGUtcmlnaHQiXSwgImY1MTYiLCAiTTExOC4yIDYyLjRDMTAxLjUgNTYuOCA5Mi40IDM4LjYgOTggMjEuOVMxMjEuNy0zLjkgMTM4LjUgMS42bDExMyAzNy43YzEzLjktMjMuNSAzOS42LTM5LjMgNjguOS0zOS4zIDQ0LjIgMCA4MCAzNS44IDgwIDgwIDAgMy0uMiA1LjktLjUgOC44bDEyMi42IDQwLjljMTYuOCA1LjYgMjUuOCAyMy43IDIwLjIgNDAuNXMtMjMuNyAyNS44LTQwLjUgMjAuMkwzNjYuNyAxNDUuMmMtNC41IDMuMi05LjMgNS45LTE0LjQgOC4ybDAgMzI2LjdjMCAxNy43LTE0LjMgMzItMzIgMzJsLTE5MiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDE2MCAwIDAtMjk0LjdjLTIxLTkuMi0zNy4yLTI3LTQ0LjItNDlsLTEyNS45LTQyek0yMDAuOCAyODhMMTI4LjMgMTYzLjggNTUuOSAyODggMjAwLjggMjg4em0tNzIuNCA5NmMtNjIuOSAwLTExNS4yLTM0LTEyNi03OC45LTIuNi0xMSAxLTIyLjMgNi43LTMyLjFsOTUuMi0xNjMuMmM1LTguNiAxNC4yLTEzLjggMjQuMS0xMy44czE5LjEgNS4zIDI0LjEgMTMuOGw5NS4yIDE2My4yYzUuNyA5LjggOS4zIDIxLjEgNi43IDMyLjEtMTAuOCA0NC44LTYzLjEgNzguOS0xMjYgNzguOXptMzgyLjgtOTIuMmwtNzIuNCAxMjQuMiAxNDQuOSAwLTcyLjQtMTI0LjJ6bTEyNiAxNDEuM0M2MjYuNCA0NzggNTc0LjEgNTEyIDUxMS4yIDUxMnMtMTE1LjItMzQtMTI2LTc4LjljLTIuNi0xMSAxLTIyLjMgNi43LTMyLjFsOTUuMi0xNjMuMmM1LTguNiAxNC4yLTEzLjggMjQuMS0xMy44czE5LjEgNS4zIDI0LjEgMTMuOGw5NS4yIDE2My4yYzUuNyA5LjggOS4zIDIxLjEgNi43IDMyLjF6Il0KICAgIH07CiAgICBmYUJhbGFuY2VTY2FsZVJpZ2h0ID0gZmFTY2FsZVVuYmFsYW5jZWRGbGlwOwogICAgZmFBcnJvd3NUb0NpcmNsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvd3MtdG8tY2lyY2xlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU0YmQiLCAiTTkuNCA5LjRDMjEuOS0zLjEgNDIuMS0zLjEgNTQuNiA5LjRMMTI4IDgyLjcgMTI4IDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCA5NmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtOTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxOC43IDAtNzMuNC03My40Qy0zLjEgNDIuMS0zLjEgMjEuOSA5LjQgOS40ek0yMDAgMjU2YTU2IDU2IDAgMSAxIDExMiAwIDU2IDU2IDAgMSAxIC0xMTIgMHpNNTAyLjYgNTQuNkw0MjkuMyAxMjggNDQ4IDEyOGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtOTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC05NmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMTguNyA3My40LTczLjRjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM3ptLTQ1LjMgNDQ4TDM4NCA0MjkuMyAzODQgNDQ4YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtOTZjMC0xNy43IDE0LjMtMzIgMzItMzJsOTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTguNyAwIDczLjQgNzMuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMHpNOS40IDQ1Ny40TDgyLjcgMzg0IDY0IDM4NGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw5NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgOTZjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xOC43LTczLjQgNzMuNGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjN6Il0KICAgIH07CiAgICBmYUVudmVsb3BlMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJlbnZlbG9wZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODM4NiwgOTk5MywgNjE0NDNdLCAiZjBlMCIsICJNNDggNjRjLTI2LjUgMC00OCAyMS41LTQ4IDQ4IDAgMTUuMSA3LjEgMjkuMyAxOS4yIDM4LjRsMjA4IDE1NmMxNy4xIDEyLjggNDAuNSAxMi44IDU3LjYgMGwyMDgtMTU2YzEyLjEtOS4xIDE5LjItMjMuMyAxOS4yLTM4LjQgMC0yNi41LTIxLjUtNDgtNDgtNDhMNDggNjR6TTAgMTk2TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTg4LTE5OC40IDE0OC44Yy0zNC4xIDI1LjYtODEuMSAyNS42LTExNS4yIDBMMCAxOTZ6Il0KICAgIH07CiAgICBmYUJhYnkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmFieSIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmNzdjIiwgIk0xMjAgODhhNzIgNzIgMCAxIDEgMTQ0IDAgNzIgNzIgMCAxIDEgLTE0NCAwek03LjcgMTQ0LjVjMTMtMTcuOSAzOC0yMS44IDU1LjktOC44TDk5LjggMTYyYzI2LjggMTkuNSA1OS4xIDMwIDkyLjIgMzBzNjUuNC0xMC41IDkyLjItMzBsMzYuMi0yNi40YzE3LjktMTMgNDIuOS05IDU1LjkgOC44czkgNDIuOS04LjggNTUuOWwtMzYuMiAyNi40Yy0xMy42IDkuOS0yOC4xIDE4LjItNDMuMyAyNWwwIDM2LjMtMTkyIDAgMC0zNi4zYy0xNS4yLTYuNy0yOS43LTE1LjEtNDMuMy0yNUwxNi41IDIwMC4zYy0xNy45LTEzLTIxLjgtMzgtOC44LTU1Ljl6TTk3LjUgMzI5LjNsNjAuNiA1My0yNiAzNy4yIDI0LjMgMjQuM2MxNS42IDE1LjYgMTUuNiA0MC45IDAgNTYuNnMtNDAuOSAxNS42LTU2LjYgMGwtNDgtNDhDMzggNDM4LjYgMzYuMSA0MTcgNDcuMiA0MDEuMWw1MC4yLTcxLjh6bTEyOC41IDUzbDYwLjYtNTMgNTAuMiA3MS44YzExLjEgMTUuOSA5LjIgMzcuNS00LjUgNTEuMmwtNDggNDhjLTE1LjYgMTUuNi00MC45IDE1LjYtNTYuNiAwcy0xNS42LTQwLjkgMC01Ni42bDI0LjMtMjQuMy0yNi0zNy4yeiJdCiAgICB9OwogICAgZmFTcXVhcmVDYXJldERvd24yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1jYXJldC1kb3duIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImNhcmV0LXNxdWFyZS1kb3duIl0sICJmMTUwIiwgIk0zODQgNDgwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDB6TTIyNCAzNTJjLTYuNyAwLTEzLTIuOC0xNy42LTcuN2wtMTA0LTExMmMtNi41LTctOC4yLTE3LjItNC40LTI1LjlTMTEwLjUgMTkyIDEyMCAxOTJsMjA4IDBjOS41IDAgMTguMiA1LjcgMjIgMTQuNHMyLjEgMTguOS00LjQgMjUuOWwtMTA0IDExMmMtNC41IDQuOS0xMC45IDcuNy0xNy42IDcuN3oiXQogICAgfTsKICAgIGZhQ2FyZXRTcXVhcmVEb3duMiA9IGZhU3F1YXJlQ2FyZXREb3duMjsKICAgIGZhVGVudCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0ZW50IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1N2QiLCAiTTI2LjkgMjA2LjlMMy43IDQ0NC45QzEuOCA0NjMuNyAxNi42IDQ4MCAzNS41IDQ4MGwxNzIuNyAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMTI5YzAtOC4zIDYuNy0xNSAxNS0xNSA1LjUgMCAxMC42IDMgMTMuMiA3LjlsODYuMSAxNTljOC40IDE1LjUgMjQuNiAyNS4xIDQyLjIgMjUuMWw2NC4xIDBjMTguOSAwIDMzLjctMTYuMyAzMS44LTM1LjFMNDg1LjYgMjA3LjFjLTEuOS0xOS42LTEyLjgtMzcuMy0yOS41LTQ3LjhMMjgwLjkgNDguM2MtMTUuNy0xMC0zNS44LTkuOS01MS41IC4xTDU2LjEgMTU5LjJjLTE2LjUgMTAuNi0yNy4zIDI4LjItMjkuMiA0Ny43eiJdCiAgICB9OwogICAgZmFBID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImEiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFs5N10sICI0MSIsICJNMjIxLjUgNTEuN0MyMTYuNiAzOS44IDIwNC45IDMyIDE5MiAzMnMtMjQuNiA3LjgtMjkuNSAxOS43Yy05My4zIDIyNC0xNDYuNyAzNTItMTYwIDM4NC02LjggMTYuMyAuOSAzNSAxNy4yIDQxLjhzMzUtLjkgNDEuOC0xNy4ybDMxLjgtNzYuMyAxOTcuMyAwIDMxLjggNzYuM2M2LjggMTYuMyAyNS41IDI0IDQxLjggMTcuMnMyNC0yNS41IDE3LjItNDEuOGMtMTMuMy0zMi02Ni43LTE2MC0xNjAtMzg0ek0yNjQgMzIwbC0xNDQgMCA3Mi0xNzIuOCA3MiAxNzIuOHoiXQogICAgfTsKICAgIGZhUGFyYWNodXRlQm94ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBhcmFjaHV0ZS1ib3giLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjRjZCIsICJNMTI4IDIyNEMxMjggMTUyLjIgMTQ0LjMgODguNCAxNjkuNSA0My40IDE5NS4xLTIuNCAyMjYuNi0yNCAyNTYtMjRzNjAuOSAyMS42IDg2LjUgNjcuNEMzNjcuNyA4OC40IDM4NCAxNTIuMiAzODQgMjI0bC0xMDQgMCAwIDk2IDggMGM5LjMgMCAxOC4xIDIgMjYgNS41bDExOC40LTEwMS41LS41IDBjMC03OC40LTE3LjctMTUwLjYtNDcuNi0yMDQtNi4xLTExLTEyLjktMjEuMy0yMC4zLTMwLjkgODYuNSAzNS45IDE0Ny44IDExNS4xIDE0Ny44IDIxOC45IDAgNy0zLjEgMTMuNy04LjQgMTguMkwzNDcuNCAzNjAuMWMzIDcuNCA0LjYgMTUuNCA0LjYgMjMuOWwwIDY0YzAgMzUuMy0yOC43IDY0LTY0IDY0bC02NCAwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTY0YzAtOC40IDEuNi0xNi41IDQuNi0yMy45TDguNCAyMjYuMkMzLjEgMjIxLjcgMCAyMTUgMCAyMDggMCAxMDQuMiA2MS4zIDI0LjkgMTQ3LjgtMTAuOSAxNDAuNS0xLjQgMTMzLjcgOSAxMjcuNiAyMCA5Ny43IDczLjQgODAgMTQ1LjYgODAgMjI0bC0uNSAwIDExOC40IDEwMS41YzgtMy41IDE2LjgtNS41IDI2LTUuNWw4IDAgMC05Ni0xMDQgMHoiXQogICAgfTsKICAgIGZhQ2FydEFycm93RG93biA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYXJ0LWFycm93LWRvd24iLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjIxOCIsICJNMCA4QzAtNS4zIDEwLjctMTYgMjQtMTZsNDUuMyAwYzI3LjEgMCA1MC4zIDE5LjQgNTUuMSA0NmwuNCAyIDE4Ny4yIDAgMCAxMDIuMS0zMS0zMWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWw3MiA3MmM5LjQgOS40IDI0LjYgOS40IDMzLjkgMGw3Mi03MmM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwbC0zMSAzMSAwLTEwMi4xIDE3Ny40IDBjMjAgMCAzNS4xIDE4LjIgMzEuNCAzNy45TDUzNy44IDIzNS44Yy01LjcgMzAuMy0zMi4xIDUyLjItNjIuOSA1Mi4ybC0zMDMuNiAwIDUuMSAyOC4zYzIuMSAxMS40IDEyIDE5LjcgMjMuNiAxOS43TDQ1NiAzMzZjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTI1NS45IDBjLTM0LjggMC02NC42LTI0LjktNzAuOC01OS4xTDc3LjIgMzguNmMtLjctMy44LTQtNi42LTcuOS02LjZMMjQgMzJDMTAuNyAzMiAwIDIxLjMgMCA4ek0xNjAgNDY0YTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6bTIyNCAwYTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6Il0KICAgIH07CiAgICBmYUJyaWRnZUNpcmNsZUV4Y2xhbWF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJyaWRnZS1jaXJjbGUtZXhjbGFtYXRpb24iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRjYSIsICJNMzIgMzJDMTQuMyAzMiAwIDQ2LjMgMCA2NFMxNC4zIDk2IDMyIDk2bDggMCAwIDY0LTQwIDAgMCAxMTJjMzcuNiA5LjQgNjQgNDMuMiA2NCA4MmwwIDk0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC02NGMwLTUzIDQzLTk2IDk2LTk2IDYuNCAwIDEyLjcgLjYgMTguNyAxLjggMzQuNy00OS41IDkyLjItODEuOCAxNTcuMy04MS44IDI4LjYgMCA1NS42IDYuMiA4MCAxNy40bDAtNjUuNC00MCAwIDAtNjQgOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDMyIDMyek00MjQgOTZsMCA2NC04MCAwIDAtNjQgODAgMHpNMjk2IDk2bDAgNjQtODAgMCAwLTY0IDgwIDB6TTg4IDk2bDgwIDAgMCA2NC04MCAwIDAtNjR6TTQzMiA1NDRhMTQ0IDE0NCAwIDEgMCAwLTI4OCAxNDQgMTQ0IDAgMSAwIDAgMjg4em0wLTEwMGEyMCAyMCAwIDEgMSAwIDQwIDIwIDIwIDAgMSAxIDAtNDB6bTAtMTQwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDgwYzAgOC44LTcuMiAxNi0xNiAxNnMtMTYtNy4yLTE2LTE2bDAtODBjMC04LjggNy4yLTE2IDE2LTE2eiJdCiAgICB9OwogICAgZmFDbG91ZEFycm93VXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2xvdWQtYXJyb3ctdXAiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFs2MjMzOCwgImNsb3VkLXVwbG9hZCIsICJjbG91ZC11cGxvYWQtYWx0Il0sICJmMGVlIiwgIk0xNDQgNDgwYy03OS41IDAtMTQ0LTY0LjUtMTQ0LTE0NCAwLTYzLjQgNDEtMTE3LjIgOTcuOS0xMzYuNS0xLjMtNy43LTEuOS0xNS41LTEuOS0yMy41IDAtNzkuNSA2NC41LTE0NCAxNDQtMTQ0IDU1LjQgMCAxMDMuNSAzMS4zIDEyNy42IDc3LjEgMTQuMi04LjMgMzAuOC0xMy4xIDQ4LjQtMTMuMSA1MyAwIDk2IDQzIDk2IDk2IDAgMTUuNy0zLjggMzAuNi0xMC41IDQzLjcgNDQgMjAuMyA3NC41IDY0LjcgNzQuNSAxMTYuMyAwIDcwLjctNTcuMyAxMjgtMTI4IDEyOGwtMzA0IDB6TTMwNSAxOTFjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwbC03MiA3MmMtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDMxLTMxIDAgMTAyLjFjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTEwMi4xIDMxIDMxYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNzItNzJ6Il0KICAgIH07CiAgICBmYUNsb3VkVXBsb2FkID0gZmFDbG91ZEFycm93VXA7CiAgICBmYUNsb3VkVXBsb2FkQWx0ID0gZmFDbG91ZEFycm93VXA7CiAgICBmYUF0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImF0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjE5NDZdLCAiNDAiLCAiTTI1NiA2NEMxNTAgNjQgNjQgMTUwIDY0IDI1NnM4NiAxOTIgMTkyIDE5MmMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkMxMTQuNiA1MTIgMCAzOTcuNCAwIDI1NlMxMTQuNiAwIDI1NiAwIDUxMiAxMTQuNiA1MTIgMjU2bDAgMzJjMCA1My00MyA5Ni05NiA5Ni0yOS4zIDAtNTUuNi0xMy4yLTczLjItMzMuOS0yMi44IDIxLTUzLjMgMzMuOS04Ni44IDMzLjktNzAuNyAwLTEyOC01Ny4zLTEyOC0xMjhzNTcuMy0xMjggMTI4LTEyOGMyNy45IDAgNTMuNyA4LjkgNzQuNyAyNC4xIDUuNy01IDEzLjEtOC4xIDIxLjMtOC4xIDE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTEyYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zMmMwLTEwNi04Ni0xOTItMTkyLTE5MnptNjQgMTkyYTY0IDY0IDAgMSAwIC0xMjggMCA2NCA2NCAwIDEgMCAxMjggMHoiXQogICAgfTsKICAgIGZhSW5kaWFuUnVwZWVTaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImluZGlhbi1ydXBlZS1zaWduIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbImluZGlhbi1ydXBlZSIsICJpbnIiXSwgImUxYmMiLCAiTTAgNjRDMCA0Ni4zIDE0LjMgMzIgMzIgMzJsMjY0IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTc2LjcgMGMxNy43IDE5LjggMzAuMSA0NC42IDM0LjcgNzJsNDIgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNDIgMGMtMTAuNCA2Mi4yLTYwLjggMTEwLjktMTIzLjggMTE4LjlMMjc0LjYgNDIyYzE0LjQgMTAuMyAxNy43IDMwLjMgNy40IDQ0LjZzLTMwLjMgMTcuNy00NC42IDcuNEwxMy40IDMxNEMyLjEgMzA2LTIuNyAyOTEuNSAxLjUgMjc4LjJTMTguMSAyNTYgMzIgMjU2bDgwIDBjMzUuOCAwIDY2LjEtMjMuNSA3Ni4zLTU2TDI0IDIwMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxNjQuMyAwYy0xMC4yLTMyLjUtNDAuNS01Ni03Ni4zLTU2TDMyIDk2QzE0LjMgOTYgMCA4MS43IDAgNjR6Il0KICAgIH07CiAgICBmYUluZGlhblJ1cGVlID0gZmFJbmRpYW5SdXBlZVNpZ247CiAgICBmYUluciA9IGZhSW5kaWFuUnVwZWVTaWduOwogICAgZmFUcnVjazIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHJ1Y2siLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjg2NjYsIDk5NTFdLCAiZjBkMSIsICJNMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwyODggMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyIDUwLjcgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN0w1NTcuMyAxOTJjMTIgMTIgMTguNyAyOC4zIDE4LjcgNDUuM0w1NzYgMzg0YzAgMzUuMy0yOC43IDY0LTY0IDY0bC0zLjMgMGMtMTAuNCAzNi45LTQ0LjQgNjQtODQuNyA2NHMtNzQuMi0yNy4xLTg0LjctNjRsLTEwMi42IDBjLTEwLjQgMzYuOS00NC40IDY0LTg0LjcgNjRzLTc0LjItMjcuMS04NC43LTY0TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NnpNNTEyIDI4OGwwLTUwLjctNDUuMy00NS4zLTUwLjcgMCAwIDk2IDk2IDB6TTE5MiA0MjRhNDAgNDAgMCAxIDAgLTgwIDAgNDAgNDAgMCAxIDAgODAgMHptMjMyIDQwYTQwIDQwIDAgMSAwIDAtODAgNDAgNDAgMCAxIDAgMCA4MHoiXQogICAgfTsKICAgIGZhQ2hhbGtib2FyZFVzZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hhbGtib2FyZC11c2VyIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbImNoYWxrYm9hcmQtdGVhY2hlciJdLCAiZjUxYyIsICJNMTI4IDk2YzAtMzUuMyAyOC43LTY0IDY0LTY0bDM1MiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjQwLTk2IDAgMC0xNmMwLTE3LjctMTQuMy0zMi0zMi0zMmwtNjQgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAxNi0xMjkuMSAwYzEwLjktMTguOCAxNy4xLTQwLjcgMTcuMS02NCAwLTcwLjctNTcuMy0xMjgtMTI4LTEyOC01LjQgMC0xMC44IC4zLTE2IDFsMC00OXpNMzMzIDQ0OGMtNS4xLTI0LjItMTYuMy00Ni4xLTMyLjEtNjRMNjA4IDM4NGMwIDM1LjMtMjguNyA2NC02NCA2NGwtMjExIDB6TTY0IDI3MmE4MCA4MCAwIDEgMSAxNjAgMCA4MCA4MCAwIDEgMSAtMTYwIDB6TTAgNDgwYzAtNTMgNDMtOTYgOTYtOTZsOTYgMGM1MyAwIDk2IDQzIDk2IDk2IDAgMTcuNy0xNC4zIDMyLTMyIDMyTDMyIDUxMmMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6Il0KICAgIH07CiAgICBmYUNoYWxrYm9hcmRUZWFjaGVyID0gZmFDaGFsa2JvYXJkVXNlcjsKICAgIGZhVXNlckNoZWNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXItY2hlY2siLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjRmYyIsICJNMjg2IDMwNGM5OC41IDAgMTc4LjMgNzkuOCAxNzguMyAxNzguMyAwIDE2LjQtMTMuMyAyOS43LTI5LjcgMjkuN0w3OCA1MTJjLTE2LjQgMC0yOS43LTEzLjMtMjkuNy0yOS43IDAtOTguNSA3OS44LTE3OC4zIDE3OC4zLTE3OC4zbDU5LjQgMHpNNTg1LjcgMTA1LjljNy44LTEwLjcgMjIuOC0xMy4xIDMzLjUtNS4zczEzLjEgMjIuOCA1LjMgMzMuNUw1MjIuMSAyNzQuOWMtNC4yIDUuNy0xMC43IDkuNC0xNy43IDkuOHMtMTQtMi4yLTE4LjktNy4zbC00Ni40LTQ4Yy05LjItOS41LTktMjQuNyAuNi0zMy45IDkuNS05LjIgMjQuNy04LjkgMzMuOSAuNmwyNi41IDI3LjQgODUuNi0xMTcuN3pNMjU2LjMgMjQ4YTEyMCAxMjAgMCAxIDEgMC0yNDAgMTIwIDEyMCAwIDEgMSAwIDI0MHoiXQogICAgfTsKICAgIGZhVXNlck5pbmphID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXItbmluamEiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjkzOTldLCAiZjUwNCIsICJNMzUyIDEyOGMwIDcwLjctNTcuMyAxMjgtMTI4IDEyOC01Ny4yIDAtMTA1LjYtMzcuNS0xMjItODkuMy0xLjEgMS4zLTIuMiAyLjYtMy41IDMuOC0xNS44IDE1LjgtMzguOCAyMC43LTUzLjYgMjIuMS04LjEgLjgtMTQuNi01LjctMTMuOC0xMy44IDEuNC0xNC43IDYuMy0zNy44IDIyLjEtNTMuNiA1LjgtNS44IDEyLjYtMTAuMSAxOS42LTEzLjQtNy0zLjItMTMuOC03LjYtMTkuNi0xMy40LTE1LjgtMTUuOC0yMC43LTM4LjgtMjIuMS01My42LS44LTguMSA1LjctMTQuNiAxMy44LTEzLjggMTQuNyAxLjQgMzcuOCA2LjMgNTMuNiAyMi4xIDQuOCA0LjggOC43IDEwLjQgMTEuNyAxNi4xIDIxLjMtNDEuMiA2NC4zLTY5LjQgMTEzLjgtNjkuNCA3MC43IDAgMTI4IDU3LjMgMTI4IDEyOHpNMTQ0IDExMmMwIDguOCA3LjIgMTYgMTYgMTZsMTI4IDBjOC44IDAgMTYtNy4yIDE2LTE2cy03LjItMTYtMTYtMTZMMTYwIDk2Yy04LjggMC0xNiA3LjItMTYgMTZ6bS0xLjQgMjExbDY3IDUwLjJjOC41IDYuNCAyMC4zIDYuNCAyOC44IDBsNjctNTAuMmM2LjUtNC45IDE1LjItNi4yIDIyLjYtMi44IDYxLjQgMjguMiAxMDQuMSA5MC4yIDEwNC4xIDE2Mi4xIDAgMTYuNC0xMy4zIDI5LjctMjkuNyAyOS43TDQ1LjcgNTEyYy0xNi40IDAtMjkuNy0xMy4zLTI5LjctMjkuNyAwLTcyIDQyLjctMTM0IDEwNC4xLTE2Mi4xIDcuNC0zLjQgMTYuMS0yLjEgMjIuNiAyLjh6Il0KICAgIH07CiAgICBmYVBsYW50V2lsdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwbGFudC13aWx0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1YWEiLCAiTTM0NC0zMmM2Ni4zIDAgMTIwIDUzLjcgMTIwIDEyMGwwIDYuMmMyOS4zIDEyLjIgNDggNDEuMyA0OCA3Ni45IDAgMjcuOS0yNS4zIDc0LjgtNjYgMTExLjctMy44IDMuNS04LjggNS4zLTE0IDUuM3MtMTAuMi0xLjgtMTQtNS4zYy00MC43LTM2LjgtNjYtODMuNy02Ni0xMTEuNyAwLTM1LjYgMTguNy02NC43IDQ4LTc2LjlsMC02LjJjMC0zMC45LTI1LjEtNTYtNTYtNTZzLTU2IDI1LjEtNTYgNTZsMCA0MjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0yOTZjMC0zMC45LTI1LjEtNTYtNTYtNTZzLTU2IDI1LjEtNTYgNTZsMCAzOC4yYzI5LjMgMTIuMiA0OCA0MS4zIDQ4IDc2LjkgMCAyNy45LTI1LjMgNzQuOC02NiAxMTEuNy0zLjggMy41LTguOCA1LjMtMTQgNS4zcy0xMC4yLTEuOC0xNC01LjNDMjUuMyA0MDUuOSAwIDM1OSAwIDMzMS4xIDAgMjk1LjQgMTguNyAyNjYuNCA0OCAyNTQuMkw0OCAyMTZjMC02Ni4zIDUzLjctMTIwIDEyMC0xMjAgMjAuMiAwIDM5LjMgNSA1NiAxMy44TDIyNCA4OGMwLTY2LjMgNTMuNy0xMjAgMTIwLTEyMHoiXQogICAgfTsKICAgIGZhV2VpZ2h0U2NhbGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid2VpZ2h0LXNjYWxlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbIndlaWdodCJdLCAiZjQ5NiIsICJNMTE2LjYgMTkyYy0zLTEwLjEtNC42LTIwLjktNC42LTMyIDAtNjEuOSA1MC4xLTExMiAxMTItMTEyUzMzNiA5OC4xIDMzNiAxNjBjMCAxMS4xLTEuNiAyMS45LTQuNiAzMmwtNzEgMCAyNC42LTQ0LjNjNi40LTExLjYgMi4zLTI2LjItOS4zLTMyLjZzLTI2LjItMi4zLTMyLjYgOS4zbC0zNy42IDY3LjctODguOCAwek0xMjggMzJMNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NGwtNjQgMEMyOTMuMyAxMS45IDI2MCAwIDIyNCAwcy02OS4zIDExLjktOTYgMzJ6Il0KICAgIH07CiAgICBmYVdlaWdodCA9IGZhV2VpZ2h0U2NhbGU7CiAgICBmYUNhcmV0UmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FyZXQtcmlnaHQiLAogICAgICBpY29uOiBbMjU2LCA1MTIsIFtdLCAiZjBkYSIsICJNMjQ5LjMgMjM1LjhjMTAuMiAxMi42IDkuNSAzMS4xLTIuMiA0Mi44bC0xMjggMTI4Yy05LjIgOS4yLTIyLjkgMTEuOS0zNC45IDYuOVM2NC41IDM5Ni45IDY0LjUgMzg0bDAtMjU2YzAtMTIuOSA3LjgtMjQuNiAxOS44LTI5LjZzMjUuNy0yLjIgMzQuOSA2LjlsMTI4IDEyOCAyLjIgMi40eiJdCiAgICB9OwogICAgZmFGbG9yaW5TaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZsb3Jpbi1zaWduIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImUxODQiLCAiTTMxNC43IDMyYy0zOC44IDAtNzMuNyAyMy4zLTg4LjYgNTkuMUwxNzAuNyAyMjQgNjQgMjI0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDgwIDAtNDUuMSAxMDguM2MtNSAxMS45LTE2LjYgMTkuNy0yOS41IDE5LjdMMzIgNDE2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDM3LjMgMGMzOC44IDAgNzMuNy0yMy4zIDg4LjYtNTkuMUwyMTMuMyAyODggMzIwIDI4OGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtODAgMCA0NS4xLTEwOC4zYzUtMTEuOSAxNi42LTE5LjcgMjkuNS0xOS43TDM1MiA5NmMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMzcuMyAweiJdCiAgICB9OwogICAgZmFCZWxsMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiZWxsIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI4Mjc2LCA2MTYwMl0sICJmMGYzIiwgIk0yMjQgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAzLjJDMTE5IDUwIDY0IDExNC42IDY0IDE5MmwwIDIxLjdjMCA0OC4xLTE2LjQgOTQuOC00Ni40IDEzMi40TDcuOCAzNTguM0MyLjcgMzY0LjYgMCAzNzIuNCAwIDM4MC41IDAgNDAwLjEgMTUuOSA0MTYgMzUuNSA0MTZsMzc2LjkgMGMxOS42IDAgMzUuNS0xNS45IDM1LjUtMzUuNSAwLTguMS0yLjctMTUuOS03LjgtMjIuMmwtOS44LTEyLjJDNDAwLjQgMzA4LjUgMzg0IDI2MS44IDM4NCAyMTMuN2wwLTIxLjdjMC03Ny40LTU1LTE0Mi0xMjgtMTU2LjhsMC0zLjJjMC0xNy43LTE0LjMtMzItMzItMzJ6TTE2MiA0NjRjNy4xIDI3LjYgMzIuMiA0OCA2MiA0OHM1NC45LTIwLjQgNjItNDhsLTEyNCAweiJdCiAgICB9OwogICAgZmFMYXJpU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsYXJpLXNpZ24iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZTFjOCIsICJNMTQ0IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA0MS41YzcuOS0xIDE1LjktMS41IDI0LTEuNXMxNi4xIC41IDI0IDEuNUwyMTYgMjRjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDU0YzU4LjkgMjMuOCAxMDMuMiA3NiAxMTYuMiAxMzkuNyAzLjUgMTcuMy03LjcgMzQuMi0yNSAzNy43cy0zNC4yLTcuNy0zNy43LTI1Yy02LjctMzMuMi0yNi40LTYxLjgtNTMuNC04MC4ybDAgODEuOGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTEwMS44Yy03LjgtMS41LTE1LjgtMi4yLTI0LTIuMnMtMTYuMiAuOC0yNCAyLjJMMTY4IDIzMmMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTgxLjhjLTMzLjggMjMtNTYgNjEuOS01NiAxMDUuOCAwIDcwLjcgNTcuMyAxMjggMTI4IDEyOGwxNjAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA0NDhjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMTYuOSAwQzE4LjUgMzUwIDAgMzA1LjIgMCAyNTYgMCAxNzUuNCA0OS42IDEwNi40IDEyMCA3OGwwLTU0YzAtMTMuMyAxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFNaWxsU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtaWxsLXNpZ24iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZTFlZCIsICJNMjk3LTIyLjJjMTIuMyA1IDE4LjIgMTkgMTMuMiAzMS4zbC0yOSA3MS4zQzMzOC44IDg1LjEgMzg0IDEzMy4zIDM4NCAxOTJsMCAyMDhjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0yMDhjMC0yNi41LTIxLjUtNDgtNDgtNDgtNi40IDAtMTIuNSAxLjItMTggMy41bC0zMCA3My44IDAgMTc4LjdjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0yMS4yLTU3LjggMTQyLjJjLTUgMTIuMy0xOSAxOC4yLTMxLjMgMTMuMnMtMTguMi0xOS0xMy4yLTMxLjNMMTYwIDI1MS4zIDE2MCAxOTJjMC0yNi41LTIxLjUtNDgtNDgtNDhzLTQ4IDIxLjUtNDggNDhsMCAyMDhjMCAxNy43LTE0LjMgMzItMzIgMzJTMCA0MTcuNyAwIDQwMEwwIDExMmMwLTE3LjcgMTQuMy0zMiAzMi0zMiAxMC45IDAgMjAuNSA1LjQgMjYuMyAxMy43IDE2LTguNyAzNC4zLTEzLjcgNTMuNy0xMy43IDMxLjMgMCA1OS43IDEyLjkgODAgMzMuNiA5LjYtOS44IDIwLjktMTcuOCAzMy41LTIzLjVMMjY1LjgtOWM1LTEyLjMgMTktMTguMiAzMS4zLTEzLjJ6Il0KICAgIH07CiAgICBmYVBlcnNvblNub3dib2FyZGluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tc25vd2JvYXJkaW5nIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI3OTM4LCAic25vd2JvYXJkaW5nIl0sICJmN2NlIiwgIk00MjQuNSAxNmE1NiA1NiAwIDEgMSAwIDExMiA1NiA1NiAwIDEgMSAwLTExMnpNMTY2LjQgNDUuNWMxMC4yLTE0LjQgMzAuMi0xNy45IDQ0LjYtNy43bDI3MiAxOTJjMTQuNCAxMC4yIDE3LjkgMzAuMiA3LjcgNDQuNnMtMzAuMiAxNy45LTQ0LjYgNy43bC05Mi4yLTY1LjEtNjIuMiA1My4zIDMyLjEgMjYuN2MxOC4yIDE1LjIgMjguOCAzNy43IDI4LjggNjEuNWwwIDg3LjggNzcuNSAxNS4yYzYuMiAxLjIgMTIuNiAuOSAxOC43LS44bDQxLjItMTEuOGMxMi43LTMuNiAyNiAzLjcgMjkuNyAxNi41cy0zLjcgMjYtMTYuNSAyOS43bC00MS4yIDExLjhjLTEzLjQgMy44LTI3LjQgNC40LTQxLjEgMS44TDg3LjEgNDQzLjNjLTE3LjItMy40LTMzLTExLjgtNDUuMy0yNC4xTDE1LjUgMzkzYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBsMjYuMiAyNi4yYzUuNiA1LjYgMTIuOCA5LjQgMjAuNiAxMWw2NC4yIDEyLjYgMC0xMjMuN2MwLTI3LjcgMTItNTQgMzIuOC03Mi4ybDY5LTYwLjQtODguMi02Mi4zQzE1OS42IDgwIDE1Ni4yIDYwIDE2Ni40IDQ1LjV6bTU4LjEgMzc1LjdsNjQgMTIuNSAwLTc1LjNjMC00LjctMi4xLTkuMy01LjgtMTIuM2wtNTguMi00OC41IDAgMTIzLjZ6Il0KICAgIH07CiAgICBmYVNub3dib2FyZGluZyA9IGZhUGVyc29uU25vd2JvYXJkaW5nOwogICAgZmFUdHkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHR5IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInRlbGV0eXBlIl0sICJmMWU0IiwgIk00NTAuMiAyNjYuOGMxNS44IDYuNSAzNC4xIC4zIDQyLjYtMTQuNmwyLjQtNC4yYzI3LjktNDguOSAyMy42LTExOC44LTMxLjMtMTU0LjUtMTI2LTgyLTI4OS42LTgyLTQxNS42IDAtNTQuOSAzNS43LTU5LjMgMTA1LjctMzEuMyAxNTQuNWwyLjQgNC4yYzguNSAxNC45IDI2LjcgMjEuMSA0Mi42IDE0LjZsODEuOS0zMy43YzEzLjktNS43IDIyLjQtMTkuOSAyMC45LTM0LjlsLTUuMS01MWM2Mi41LTIxIDEzMC44LTE5LjkgMTkyLjYgMy4zbC00LjggNDcuN2MtMS41IDE1IDcgMjkuMiAyMC45IDM0LjlsODEuOSAzMy43ek0zMiAzNTJhMzIgMzIgMCAxIDAgNjQgMCAzMiAzMiAwIDEgMCAtNjQgMHptOTYgMGEzMiAzMiAwIDEgMCA2NCAwIDMyIDMyIDAgMSAwIC02NCAwek02NCA0MTZhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDEgMCAwLTY0em0zNTIgMzJhMzIgMzIgMCAxIDAgNjQgMCAzMiAzMiAwIDEgMCAtNjQgMHpNMjU2IDMyMGEzMiAzMiAwIDEgMCAwIDY0IDMyIDMyIDAgMSAwIDAtNjR6bTY0IDMyYTMyIDMyIDAgMSAwIDY0IDAgMzIgMzIgMCAxIDAgLTY0IDB6bTEyOC0zMmEzMiAzMiAwIDEgMCAwIDY0IDMyIDMyIDAgMSAwIDAtNjR6TTEyOCA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTkyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTE5MiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnoiXQogICAgfTsKICAgIGZhVGVsZXR5cGUgPSBmYVR0eTsKICAgIGZhVXNlcnNSZWN0YW5nbGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlcnMtcmVjdGFuZ2xlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1OTQiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsNDQ4IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6bTIyNCA3MmE1NiA1NiAwIDEgMSAwIDExMiA1NiA1NiAwIDEgMSAwLTExMnptMCAxNTJjNTMgMCA5NiA0MyA5NiA5NmwwIDI0YzAgMTMuMy0xMC43IDI0LTI0IDI0bC0xNDQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC0yNGMwLTUzIDQzLTk2IDk2LTk2em05Ni02NGE0OCA0OCAwIDEgMSA5NiAwIDQ4IDQ4IDAgMSAxIC05NiAwek0xNjggMjcyLjNjLTE1LjIgMjIuOC0yNCA1MC4yLTI0IDc5LjdsMCAyNGMwIDguNCAxLjQgMTYuNSA0LjEgMjRsLTQ2LjggMEM4OS42IDQwMCA4MCAzOTAuNCA4MCAzNzguN0w4MCAzNjhjMC01MC4zIDM4LjctOTEuNiA4OC05NS43ek00MjcuOSA0MDBjMi43LTcuNSA0LjEtMTUuNiA0LjEtMjRsMC0yNGMwLTI5LjUtOC44LTU2LjktMjQtNzkuNyA0OS4zIDQuMSA4OCA0NS4zIDg4IDk1LjdsMCAxMC43YzAgMTEuOC05LjYgMjEuMy0yMS4zIDIxLjNsLTQ2LjggMHpNOTYgMTkyYTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6Il0KICAgIH07CiAgICBmYU1vYmlsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb2JpbGUiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjgyNDEsICJtb2JpbGUtYW5kcm9pZCIsICJtb2JpbGUtcGhvbmUiXSwgImYzY2UiLCAiTTgwIDBDNDQuNyAwIDE2IDI4LjcgMTYgNjRsMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjI0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zODRjMC0zNS4zLTI4LjctNjQtNjQtNjRMODAgMHptNzIgNDE2bDgwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTgwIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYU1vYmlsZUFuZHJvaWQgPSBmYU1vYmlsZTsKICAgIGZhTW9iaWxlUGhvbmUgPSBmYU1vYmlsZTsKICAgIGZhQXJyb3dzVHVyblRvRG90cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvd3MtdHVybi10by1kb3RzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU0YzEiLCAiTTI2NS40LTYuNmMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zTDI4NS4zIDY0IDM1MiA2NGM1MyAwIDk2IDQzIDk2IDk2bDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0zMmMwLTE3LjctMTQuMy0zMi0zMi0zMmwtNjYuNyAwIDI1LjQgMjUuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMGwtODAtODBjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zbDgwLTgwem0tODIuNyAyNzJsODAgODBjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNsLTgwIDgwYy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM0wxNjIuNyA0MDAgOTYgNDAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDMyYzAgMTcuNy0xNC4zIDMyLTMyIDMyUzAgNDgxLjcgMCA0NjRsMC0zMmMwLTUzIDQzLTk2IDk2LTk2bDY2LjcgMC0yNS40LTI1LjRjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zczMyLjgtMTIuNSA0NS4zIDB6TTMyMCAzNjhhNjQgNjQgMCAxIDEgMTI4IDAgNjQgNjQgMCAxIDEgLTEyOCAwek02NCAxNjBhNjQgNjQgMCAxIDEgMC0xMjggNjQgNjQgMCAxIDEgMCAxMjh6Il0KICAgIH07CiAgICBmYUV4Y2xhbWF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImV4Y2xhbWF0aW9uIiwKICAgICAgaWNvbjogWzEyOCwgNTEyLCBbMTAwNjksIDEwMDcxLCA2MTczOF0sICIyMSIsICJNNjQgNDMyYzIyLjEgMCA0MCAxNy45IDQwIDQwcy0xNy45IDQwLTQwIDQwLTQwLTE3LjktNDAtNDBjMC0yMi4xIDE3LjktNDAgNDAtNDB6TTY0IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDggMCAuNiAwIDEuMSAwIDEuN2wtMTYgMzA0Yy0uOSAxNy0xNSAzMC4zLTMyIDMwLjNTMzMgMzcwLjcgMzIgMzUzLjdMMTYgNDkuN2MwLS42IDAtMS4xIDAtMS43IDAtMjYuNSAyMS41LTQ4IDQ4LTQ4eiJdCiAgICB9OwogICAgZmFDaHVyY2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2h1cmNoIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTk2Ml0sICJmNTFkIiwgIk0yODAtOGMwLTEzLjMtMTAuNy0yNC0yNC0yNFMyMzItMjEuMyAyMzItOGwwIDI0LTMyIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMzIgMCAwIDQ4LTk4LjYgNjUuOEMxMjAgMTg2LjcgMTEyIDIwMS42IDExMiAyMTcuN2wwIDM4LjMtNzkuOCA0NS42QzEyLjMgMzEzIDAgMzM0LjIgMCAzNTcuMUwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NCA3NC43IDAgODUuNCAwIDMyMCAwbDY0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC05MC45YzAtMjMtMTIuMy00NC4yLTMyLjItNTUuNkw0MDAgMjU2IDQwMCAyMTcuN2MwLTE2LTgtMzEtMjEuNC0zOS45bC05OC42LTY1LjggMC00OCAzMiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0zMiAwIDAtMjR6TTI1NiAzMjBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCA4MC0xMjggMCAwLTgwYzAtMzUuMyAyOC43LTY0IDY0LTY0eiJdCiAgICB9OwogICAgZmFUb2dnbGVPZmYgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidG9nZ2xlLW9mZiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMjA0IiwgIk0zODQgMTI4YzcwLjcgMCAxMjggNTcuMyAxMjggMTI4UzQ1NC43IDM4NCAzODQgMzg0bC0xOTIgMGMtNzAuNyAwLTEyOC01Ny4zLTEyOC0xMjhzNTcuMy0xMjggMTI4LTEyOGwxOTIgMHpNNTc2IDI1NmMwLTEwNi04Ni0xOTItMTkyLTE5MkwxOTIgNjRDODYgNjQgMCAxNTAgMCAyNTZTODYgNDQ4IDE5MiA0NDhsMTkyIDBjMTA2IDAgMTkyLTg2IDE5Mi0xOTJ6TTE5MiAzMzZhODAgODAgMCAxIDAgMC0xNjAgODAgODAgMCAxIDAgMCAxNjB6Il0KICAgIH07CiAgICBmYVNob2VQcmludHMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2hvZS1wcmludHMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjU0YiIsICJNMjk2IDE5MmMtMjEuMS0xMi4xLTQyLjMtMjQuMi03Mi0yOS4zbDAtMTQwLjNDMjU3LjcgMTMgMzExLjQgMCAzNTIgMCA0NDggMCA1NzYgNDggNTc2IDEyOHMtMTE5LjYgOTYtMTc2IDk2Yy00OCAwLTc2LTE2LTEwNC0zMnpNMTI4IDMybDQ4IDAgMCAxMjgtNDggMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRzMjguNy02NCA2NC02NHpNMjMyIDMyMGMyOC0xNiA1Ni0zMiAxMDQtMzIgNTYuNCAwIDE3NiAxNiAxNzYgOTZTMzg0IDUxMiAyODggNTEyYy00MC41IDAtOTQuMy0xMy0xMjgtMjIuNGwwLTE0MC4zYzI5LjctNS4yIDUwLjktMTcuMyA3Mi0yOS40ek02NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0czI4LjctNjQgNjQtNjRsNDggMCAwIDEyOC00OCAweiJdCiAgICB9OwogICAgZmFGaWxlQ2lyY2xlRXhjbGFtYXRpb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1jaXJjbGUtZXhjbGFtYXRpb24iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRlYiIsICJNOTYgMEM2MC43IDAgMzIgMjguNyAzMiA2NGwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxODAgMGMtMjIuNy0zMS41LTM2LTcwLjItMzYtMTEyIDAtMTAwLjYgNzcuNC0xODMuMiAxNzYtMTkxLjNsMC0zOC4xYzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI5MC43IDE4LjdDMjc4LjcgNi43IDI2Mi41IDAgMjQ1LjUgMEw5NiAwek0zNTcuNSAxNzZMMjY0IDE3NmMtMTMuMyAwLTI0LTEwLjctMjQtMjRMMjQwIDU4LjUgMzU3LjUgMTc2ek00MzIgNTQ0YTE0NCAxNDQgMCAxIDAgMC0yODggMTQ0IDE0NCAwIDEgMCAwIDI4OHptMC0xMDBhMjAgMjAgMCAxIDEgMCA0MCAyMCAyMCAwIDEgMSAwLTQwem0wLTE0MGM4LjggMCAxNiA3LjIgMTYgMTZsMCA4MGMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTgwYzAtOC44IDcuMi0xNiAxNi0xNnoiXQogICAgfTsKICAgIGZhV2FsbGV0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIndhbGxldCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNTU1IiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTkyYzAtMzUuMy0yOC43LTY0LTY0LTY0TDcyIDEyOGMtMTMuMyAwLTI0LTEwLjctMjQtMjRTNTguNyA4MCA3MiA4MGwzODQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNEw2NCAzMnpNNDE2IDI1NmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYU1lc3NhZ2UyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1lc3NhZ2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiY29tbWVudC1hbHQiXSwgImYyN2EiLCAiTTAgMzUyTDAgMTI4QzAgNzUgNDMgMzIgOTYgMzJsMzIwIDBjNTMgMCA5NiA0MyA5NiA5NmwwIDIyNGMwIDUzLTQzIDk2LTk2IDk2bC0xMjAgMGMtNS4yIDAtMTAuMiAxLjctMTQuNCA0LjhMMTY2LjQgNTM5LjJjLTQuMiAzLjEtOS4yIDQuOC0xNC40IDQuOC0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTcyLTMyIDBjLTUzIDAtOTYtNDMtOTYtOTZ6Il0KICAgIH07CiAgICBmYUNvbW1lbnRBbHQyID0gZmFNZXNzYWdlMjsKICAgIGZhVHJvcGh5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRyb3BoeSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyNzk0Ml0sICJmMDkxIiwgIk0xNDQuMyAwbDIyNCAwYzI2LjUgMCA0OC4xIDIxLjggNDcuMSA0OC4yLS4yIDUuMy0uNCAxMC42LS43IDE1LjhsNDkuNiAwYzI2LjEgMCA0OS4xIDIxLjYgNDcuMSA0OS44LTcuNSAxMDMuNy02MC41IDE2MC43LTExOCAxOTAuNS0xNS44IDguMi0zMS45IDE0LjMtNDcuMiAxOC44LTIwLjIgMjguNi00MS4yIDQzLjctNTcuOSA1MS44bDAgNzMuMSA2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0xOTIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw2NCAwIDAtNzMuMWMtMTYtNy43LTM1LjktMjItNTUuMy00OC4zLTE4LjQtNC44LTM4LjQtMTIuMS01Ny45LTIzLjEtNTQuMS0zMC4zLTEwMi45LTg3LjQtMTA5LjktMTg5LjktMS45LTI4LjEgMjEtNDkuNyA0Ny4xLTQ5LjdsNDkuNiAwYy0uMy01LjItLjUtMTAuNC0uNy0xNS44LTEtMjYuNSAyMC42LTQ4LjIgNDcuMS00OC4yek0xMDEuNSAxMTJsLTUyLjQgMGM2LjIgODQuNyA0NS4xIDEyNy4xIDg1LjIgMTQ5LjYtMTQuNC0zNy4zLTI2LjMtODYtMzIuOC0xNDkuNnpNMzgwIDI1Ni44YzQwLjUtMjMuOCA3Ny4xLTY2LjEgODMuMy0xNDQuOEw0MTEgMTEyYy02LjIgNjAuOS0xNy40IDEwOC4yLTMxIDE0NC44eiJdCiAgICB9OwogICAgZmFGYWNlRGl6enkyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZGl6enkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiZGl6enkiXSwgImY1NjciLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0xMzQuMSAxNTMuOWwyNS45IDI1LjkgMjUuOS0yNS45YzcuOC03LjggMjAuNS03LjggMjguMyAwczcuOCAyMC41IDAgMjguM2wtMjUuOSAyNS45IDI1LjkgMjUuOWM3LjggNy44IDcuOCAyMC41IDAgMjguM3MtMjAuNSA3LjgtMjguMyAwbC0yNS45LTI1LjktMjUuOSAyNS45Yy03LjggNy44LTIwLjUgNy44LTI4LjMgMHMtNy44LTIwLjUgMC0yOC4zbDI1LjktMjUuOS0yNS45LTI1LjljLTcuOC03LjgtNy44LTIwLjUgMC0yOC4zczIwLjUtNy44IDI4LjMgMHptMTkyIDBsMjUuOSAyNS45IDI1LjktMjUuOWM3LjgtNy44IDIwLjUtNy44IDI4LjMgMHM3LjggMjAuNSAwIDI4LjNsLTI1LjkgMjUuOSAyNS45IDI1LjljNy44IDcuOCA3LjggMjAuNSAwIDI4LjNzLTIwLjUgNy44LTI4LjMgMGwtMjUuOS0yNS45LTI1LjkgMjUuOWMtNy44IDcuOC0yMC41IDcuOC0yOC4zIDBzLTcuOC0yMC41IDAtMjguM2wyNS45LTI1LjktMjUuOS0yNS45Yy03LjgtNy44LTcuOC0yMC41IDAtMjguM3MyMC41LTcuOCAyOC4zIDB6TTI1NiAzMDRhNjQgNjQgMCAxIDEgMCAxMjggNjQgNjQgMCAxIDEgMC0xMjh6Il0KICAgIH07CiAgICBmYURpenp5MiA9IGZhRmFjZURpenp5MjsKICAgIGZhQmFjdGVyaWEgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmFjdGVyaWEiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTA1OSIsICJNMjU2LTMyYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgMTFjOC42IDIuMiAxNi45IDUuNiAyNC44IDEwLjNMMzExIDdjOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45bC02LjMgNi4zYzQuNiA3LjggOCAxNi4yIDEwLjMgMjQuOGwxMSAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xMSAwYy0yLjIgOC42LTUuNiAxNi45LTEwLjMgMjQuOEwzNDUgMTUxYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTQuMS00LjEtMzAuMSAzMC4xIDQuMSA0LjFjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtNC4xLTQuMWMtMTAgMTAtMjAgMjAtMzAuMSAzMC4xTDIxNyAyNzljOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtNi4zLTYuM2MtNy44IDQuNi0xNi4yIDgtMjQuOCAxMC4zbDAgMTFjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0xMWMtOC42LTIuMi0xNi45LTUuNi0yNC44LTEwLjNMNzMgMzEzYy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45bDYuMy02LjNjLTQuNi03LjgtOC0xNi4yLTEwLjMtMjQuOGwtMTEgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxMSAwYzIuMi04LjYgNS42LTE2LjkgMTAuMy0yNC44TDM5IDE2OWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDQuMSA0LjFjMTAtMTAgMjAtMjAgMzAuMS0zMC4xTDEwMyAxMDVjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGw0LjEgNC4xIDMwLjEtMzAuMS00LjEtNC4xYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOVMxOTEuNi0yLjMgMjAxIDdsNi4zIDYuM2M3LjgtNC42IDE2LjItOCAyNC44LTEwLjNsMC0xMWMwLTEzLjMgMTAuNy0yNCAyNC0yNHpNMTI4IDI1NmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6TTI0MCAxNDRhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHptMjk2IDQwbDAgMTFjOC42IDIuMiAxNi45IDUuNiAyNC44IDEwLjNMNTY3IDE5OWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjlsLTYuMyA2LjNjNC42IDcuOCA4IDE2LjIgMTAuMyAyNC44bDExIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTExIDBjLTIuMiA4LjYtNS42IDE2LjktMTAuMyAyNC44TDYwMSAzNDNjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtNC4xLTQuMS0zMC4xIDMwLjEgNC4xIDQuMWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwbC00LjEtNC4xYy0xMCAxMC0yMCAyMC0zMC4xIDMwLjFMNDczIDQ3MWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwbC02LjMtNi4zYy03LjggNC42LTE2LjIgOC0yNC44IDEwLjNsMCAxMWMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTExYy04LjYtMi4yLTE2LjktNS42LTI0LjgtMTAuM0wzMjkgNTA1Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45bDYuMy02LjNjLTQuNi03LjgtOC0xNi4yLTEwLjMtMjQuOGwtMTEgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxMSAwYzIuMi04LjYgNS42LTE2LjkgMTAuMy0yNC44TDI5NSAzNjFjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGw0LjEgNC4xYzEwLTEwIDIwLTIwIDMwLjEtMzAuMUwzNTkgMjk3Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBsNC4xIDQuMSAzMC4xLTMwLjEtNC4xLTQuMWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDYuMyA2LjNjNy44LTQuNiAxNi4yLTggMjQuOC0xMC4zbDAtMTFjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNHpNNDQ4IDM4NGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAweiJdCiAgICB9OwogICAgZmFFYXJEZWFmID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImVhci1kZWFmIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImRlYWYiLCAiZGVhZm5lc3MiLCAiaGFyZC1vZi1oZWFyaW5nIl0sICJmMmE0IiwgIk01MDIuNiA1NC42bC00MCA0MGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNsNDAtNDBjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM3ptLTMyMCAzMjBsLTEyOCAxMjhjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwcy0xMi41LTMyLjggMC00NS4zbDEyOC0xMjhjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM3pNMjQwIDEyOGMtNTcuNiAwLTEwNS4xIDQzLjYtMTExLjMgOTkuNS0xLjkgMTcuNi0xNy44IDMwLjItMzUuMyAyOC4zcy0zMC4yLTE3LjgtMjguMy0zNS4zYzkuNy04OCA4NC4zLTE1Ni41IDE3NC45LTE1Ni41IDk3LjIgMCAxNzYgNzguOCAxNzYgMTc2IDAgNDYtMTcuNyA4Ny45LTQ2LjYgMTE5LjMtMTIgMTMtMTcuNCAyNC44LTE3LjQgMzQuN2wwIDYuMWMwIDYxLjktNTAuMSAxMTItMTEyIDExMi0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMyYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtNi4xYzAtMzIuOSAxNy40LTU5LjYgMzQuNC03OCAxOC40LTIwIDI5LjYtNDYuNiAyOS42LTc1LjkgMC02MS45LTUwLjEtMTEyLTExMi0xMTJ6bTAgODBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyIDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtNDQuMiAzNS44LTgwIDgwLTgwczgwIDM1LjggODAgODBjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRjMC0xNy43LTE0LjMtMzItMzItMzJ6Il0KICAgIH07CiAgICBmYURlYWYgPSBmYUVhckRlYWY7CiAgICBmYURlYWZuZXNzID0gZmFFYXJEZWFmOwogICAgZmFIYXJkT2ZIZWFyaW5nID0gZmFFYXJEZWFmOwogICAgZmFQZW9wbGVBcnJvd3MgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVvcGxlLWFycm93cyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJwZW9wbGUtYXJyb3dzLWxlZnQtcmlnaHQiXSwgImUwNjgiLCAiTTMyIDY0QTY0IDY0IDAgMSAxIDE2MCA2NCA2NCA2NCAwIDEgMSAzMiA2NHpNMCAyMjRjMC0zNS4zIDI4LjctNjQgNjQtNjRsNjQgMGMzLjIgMCA2LjQgLjIgOS41IC43TDkzLjEgMjA1LjFDNjUgMjMzLjIgNjUgMjc4LjggOTMuMSAzMDYuOWw1NiA1NmMzLjQgMy40IDcgNi40IDEwLjkgOWwwIDkyLjFjMCAyNi41LTIxLjUgNDgtNDggNDhsLTMyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMTIwLjZDMTIuOSAzMzIuNCAwIDMxMS43IDAgMjg4bDAtNjR6TTM1MiA2NGE2NCA2NCAwIDEgMSAxMjggMCA2NCA2NCAwIDEgMSAtMTI4IDB6bTY2LjkgMTQxLjFsLTQ0LjQtNDQuNGMzLjEtLjUgNi4zLS43IDkuNS0uN2w2NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgNjRjMCAyMy43LTEyLjkgNDQuNC0zMiA1NS40TDQ4MCA0NjRjMCAyNi41LTIxLjUgNDgtNDggNDhsLTMyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtOTIuMWMzLjktMi42IDcuNS01LjYgMTAuOS05bDU2LTU2YzI4LjEtMjguMSAyOC4xLTczLjcgMC0xMDEuOHpNMzAyLjggMTc3LjhjOS0zLjcgMTkuMy0xLjcgMjYuMiA1LjJsNTYgNTZjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlsLTU2IDU2Yy02LjkgNi45LTE3LjIgOC45LTI2LjIgNS4yUzI4OCAzMjEuNyAyODggMzEybDAtMjQtNjQgMCAwIDI0YzAgOS43LTUuOCAxOC41LTE0LjggMjIuMnMtMTkuMyAxLjctMjYuMi01LjJsLTU2LTU2Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOWw1Ni01NmM2LjktNi45IDE3LjItOC45IDI2LjItNS4yUzIyNCAxOTAuMyAyMjQgMjAwbDAgMjQgNjQgMCAwLTI0YzAtOS43IDUuOC0xOC41IDE0LjgtMjIuMnoiXQogICAgfTsKICAgIGZhUGVvcGxlQXJyb3dzTGVmdFJpZ2h0ID0gZmFQZW9wbGVBcnJvd3M7CiAgICBmYUhhbmRzQ2xhcHBpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZHMtY2xhcHBpbmciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTFhOCIsICJNMzQ0IDhsMCA2NGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTY0YzAtMTMuMyAxMC43LTI0IDI0LTI0UzM0NC01LjMgMzQ0IDh6TTIyMCAxMC43bDMyIDQ4YzcuNCAxMSA0LjQgMjUuOS02LjcgMzMuM3MtMjUuOSA0LjQtMzMuMy02LjdsLTMyLTQ4Yy03LjQtMTEtNC40LTI1LjkgNi43LTMzLjNTMjEyLjYtLjMgMjIwIDEwLjd6TTEzNSAxMTljOS40LTkuNCAyNC42LTkuNCAzMy45IDBMMjkyLjcgMjQyLjdjMTAuMSAxMC4xIDI3LjMgMi45IDI3LjMtMTEuM2wwLTM5LjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDE1My42YzAgNTcuMS0zMCAxMTAtNzguOSAxMzkuNC02NCAzOC40LTE0NS44IDI4LjMtMTk4LjUtMjQuNEw3IDM2MWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDUzIDUzYzYuMSA2LjEgMTYgNi4xIDIyLjEgMHM2LjEtMTYgMC0yMi4xTDIzIDI2NWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDkzIDkzYzYuMSA2LjEgMTYgNi4xIDIyLjEgMHM2LjEtMTYgMC0yMi4xTDU1IDE4NWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDExNyAxMTdjNi4xIDYuMSAxNiA2LjEgMjIuMSAwczYuMS0xNiAwLTIyLjFsLTkzLTkzYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXpNNDMzLjEgNDg0LjljLTI0LjIgMTQuNS01MC45IDIyLjEtNzcuNyAyMy4xIDQ4LjEtMzkuNiA3Ni42LTk5IDc2LjYtMTYyLjRsMC05OC4xYzguMi0uMSAxNi02LjQgMTYtMTZsMC0zOS40YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAxNTMuNmMwIDU3LjEtMzAgMTEwLTc4LjkgMTM5LjR6TTQ1My4zIDRjMTEgNy40IDE0IDIyLjMgNi43IDMzLjNsLTMyIDQ4Yy03LjQgMTEtMjIuMyAxNC0zMy4zIDYuN3MtMTQtMjIuMy02LjctMzMuM2wzMi00OGM3LjQtMTEgMjIuMy0xNCAzMy4zLTYuN3oiXQogICAgfTsKICAgIGZhVmlydXNDb3ZpZFNsYXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZpcnVzLWNvdmlkLXNsYXNoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU0YTkiLCAiTTQxLTI0LjljLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwUy0yLjMtLjMgNyA5LjFsNTI4IDUyOGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTgzLTgzIDExLjQtMTEuNGM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwbC0xMS4zIDExLjMtMjMuOC0yMy44YzE3LjktMjMuNSAyOS45LTUxLjcgMzQuMS04Mi4zbDMzLjYgMCAwIDE2YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC04MGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDE2LTMzLjYgMGMtNC4yLTMwLjctMTYuMy01OC44LTM0LjEtODIuM2wyMy44LTIzLjggMTEuMyAxMS4zYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOUw0NDAuNyA0Ni43Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDExLjMgMTEuMy0yMy44IDIzLjhDMzcwLjggOTcuOSAzNDIuNyA4NS44IDMxMiA4MS42bDAtMzMuNiAxNiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0UzM0MS4zIDAgMzI4IDBMMjQ4IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTYgMCAwIDMzLjZjLTMwLjcgNC4yLTU4LjggMTYuMy04Mi4zIDM0LjFMMTU3LjkgOTIgMTY5LjIgODAuNmM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwTDEyMy45IDU4LjEgNDEtMjQuOXpNMTEzLjYgMjMybC0zMy42IDAgMC0xNmMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDgwYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xNiAzMy42IDBjNC4yIDMwLjcgMTYuMyA1OC44IDM0LjEgODIuM2wtMjMuOCAyMy44LTExLjMtMTEuM2MtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWw1Ni42IDU2LjZjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC0xMS4zLTExLjMgMjMuOC0yMy44YzIzLjUgMTcuOSA1MS43IDI5LjkgODIuMyAzNC4xbDAgMzMuNi0xNiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDgwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE2IDAgMC0zMy42YzEzLjQtMS44IDI2LjQtNS4yIDM4LjctOS45TDEyMy41IDE5My4zYy00LjcgMTIuMy04IDI1LjItOS45IDM4Ljd6Il0KICAgIH07CiAgICBmYUNhbGVuZGFyRGF5czIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FsZW5kYXItZGF5cyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJjYWxlbmRhci1hbHQiXSwgImYwNzMiLCAiTTEyOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzIgMTI4IDAgMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMzIgMzIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI4OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDMyIDAgMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNNjQgMjQwbDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6bTEyOCAwbDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6bTE0NC0xNmMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwek02NCAzNjhsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnptMTQ0LTE2Yy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDB6bTExMiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2eiJdCiAgICB9OwogICAgZmFDYWxlbmRhckFsdDIgPSBmYUNhbGVuZGFyRGF5czI7CiAgICBmYURpYW1vbmRUdXJuUmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZGlhbW9uZC10dXJuLXJpZ2h0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImRpcmVjdGlvbnMiXSwgImY1ZWIiLCAiTTIxNSAxN0wxNyAyMTVDNi4xIDIyNS45IDAgMjQwLjYgMCAyNTZzNi4xIDMwLjEgMTcgNDFMMjE1IDQ5NWMxMC45IDEwLjkgMjUuNiAxNyA0MSAxN3MzMC4xLTYuMSA0MS0xN0w0OTUgMjk3YzEwLjktMTAuOSAxNy0yNS42IDE3LTQxcy02LjEtMzAuMS0xNy00MUwyOTcgMTdDMjg2LjEgNi4xIDI3MS40IDAgMjU2IDBzLTMwLjEgNi4xLTQxIDE3ek0zODUgMjU3bC03MiA3MmMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWwzMS0zMS03OC4xIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgNDBjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC00MGMwLTM5LjggMzIuMi03MiA3Mi03Mmw3OC4xIDAtMzEtMzFjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGw3MiA3MmM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXoiXQogICAgfTsKICAgIGZhRGlyZWN0aW9ucyA9IGZhRGlhbW9uZFR1cm5SaWdodDsKICAgIGZhSGFuZFBvaW50VXAyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbmQtcG9pbnQtdXAiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFs5NzU3XSwgImYwYTYiLCAiTTMyIDMyQzMyIDE0LjMgNDYuMyAwIDY0IDBTOTYgMTQuMyA5NiAzMmwwIDIwOC02NCAwIDAtMjA4ek0yMjQgMTkyYzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY0em0tNjQtNjRjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA0OGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTQ4YzAtMTcuNyAxNC4zLTMyIDMyLTMyem0xNjAgOTZjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNjR6bS05NiA4OGwwLS42YzkuNCA1LjQgMjAuMyA4LjYgMzIgOC42IDEzLjIgMCAyNS40LTQgMzUuNi0xMC44IDguNyAyNC45IDMyLjUgNDIuOCA2MC40IDQyLjggMTEuNyAwIDIyLjYtMy4xIDMyLTguNmwwIDguNmMwIDg4LjQtNzEuNiAxNjAtMTYwIDE2MGwtNjEuNyAwYy00Mi40IDAtODMuMS0xNi45LTExMy4xLTQ2LjlMMzcuNSA0NTMuNUMxMy41IDQyOS41IDAgMzk2LjkgMCAzNjNsMC0yN2MwLTM1LjMgMjguNy02NCA2NC02NGw4OCAwYzIyLjEgMCA0MCAxNy45IDQwIDQwcy0xNy45IDQwLTQwIDQwbC01NiAwYy04LjggMC0xNiA3LjItMTYgMTZzNy4yIDE2IDE2IDE2bDU2IDBjMzkuOCAwIDcyLTMyLjIgNzItNzJ6Il0KICAgIH07CiAgICBmYUJlemllckN1cnZlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJlemllci1jdXJ2ZSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNTViIiwgIk0yOTYgMTM2bDAtNDggNDggMCAwIDQ4LTQ4IDB6TTI4OCAzMmMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCA0LTExOC40IDBDMTExLjIgNjIuNyA4OS4zIDQ4IDY0IDQ4IDI4LjcgNDggMCA3Ni43IDAgMTEyczI4LjcgNjQgNjQgNjRjMjUuMyAwIDQ3LjItMTQuNyA1Ny42LTM2bDY2LjkgMGMtNTguOSAzOS42LTk4LjkgMTA1LTEwNCAxODBMODAgMzIwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDY0YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDY0IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC02NGMwLTI2LjUtMjEuNS00OC00OC00OGwtMy4zIDBjNS45LTY3IDQ4LjUtMTIzLjQgMTA3LjUtMTQ5LjEgOC42IDEyLjcgMjMuMiAyMS4xIDM5LjggMjEuMWw2NCAwYzE2LjYgMCAzMS4xLTguNCAzOS44LTIxLjEgNTkgMjUuNyAxMDEuNiA4Mi4xIDEwNy41IDE0OS4xbC0zLjMgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCA2NGMwIDI2LjUgMjEuNSA0OCA0OCA0OGw2NCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtNjRjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTQuNSAwYy01LTc1LTQ1LjEtMTQwLjQtMTA0LTE4MGw2Ni45IDBjMTAuNCAyMS4zIDMyLjMgMzYgNTcuNiAzNiAzNS4zIDAgNjQtMjguNyA2NC02NHMtMjguNy02NC02NC02NGMtMjUuMyAwLTQ3LjIgMTQuNy01Ny42IDM2bC0xMTguNCAwIDAtNGMwLTI2LjUtMjEuNS00OC00OC00OGwtNjQgMHpNODggMzc2bDQ4IDAgMCA0OC00OCAwIDAtNDh6bTQxNiA0OGwwLTQ4IDQ4IDAgMCA0OC00OCAweiJdCiAgICB9OwogICAgZmFQZXJzb25IYWxmRHJlc3MgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLWhhbGYtZHJlc3MiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZTU0OCIsICJNMTQzLjQtMy45YzkuNy0xNi44IDI3LjgtMjguMSA0OC42LTI4LjEgMzAuOSAwIDU2IDI1LjEgNTYgNTYgMCAyNS40LTE2LjkgNDYuOC00MCA1My43bDAgMGMtNS4xIDEuNS0xMC40IDIuMy0xNiAyLjMtMzAuOSAwLTU2LTI1LjEtNTYtNTZsMCAwYzAtMTAuMSAyLjctMTkuNyA3LjQtMjcuOXpNMzE4LjMgMjk5LjFMMjcyIDIzNi43IDI3MiA1MTJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xNjAgMC0uNCAwLTIzOC42YzM2LjIgNC40IDY5LjIgMjMuNCA5MS4yIDUzbDcwLjUgOTVjMTAuNSAxNC4yIDcuNiAzNC4yLTYuNiA0NC44cy0zNC4yIDcuNi00NC44LTYuNnpNMTc2IDExM2wwIDM5OWMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTEyOC0yNS44IDBjLTEwLjkgMC0xOC42LTEwLjctMTUuMi0yMS4xbDQzLTEyOS00OC4zIDY1LjFjLTEwLjUgMTQuMi0zMC42IDE3LjItNDQuOCA2LjZzLTE3LjItMzAuNi02LjYtNDQuOGw3MC41LTk1YzIyLTI5LjYgNTUuMS00OC42IDkxLjItNTN6Il0KICAgIH07CiAgICBmYVNxdWFyZVBvbGxIb3Jpem9udGFsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1wb2xsLWhvcml6b250YWwiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsicG9sbC1oIl0sICJmNjgyIiwgIk00NDggOTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMHpNMjU2IDE1MmMwIDEzLjMtMTAuNyAyNC0yNCAyNGwtMTEyIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMTEyIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjR6bTcyIDgwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0yMDggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwyMDggMHpNMTkyIDM2MGMwIDEzLjMtMTAuNyAyNC0yNCAyNGwtNDggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGw0OCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0eiJdCiAgICB9OwogICAgZmFQb2xsSCA9IGZhU3F1YXJlUG9sbEhvcml6b250YWw7CiAgICBmYVNjaG9vbENpcmNsZVhtYXJrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNjaG9vbC1jaXJjbGUteG1hcmsiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU2ZCIsICJNNjQgMTI4Yy0zNS4zIDAtNjQgMjguNy02NCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNzYgMGMtMTAuNS0xNC42LTE5LTMwLjctMjUuMS00OGwtOTAuOSAwIDAtODhjMC0yMi4xIDE3LjktNDAgNDAtNDBsNDggMGMxIDAgMS45IDAgMi45IC4xIDI2LjMtNzQuNiA5Ny41LTEyOC4xIDE4MS4xLTEyOC4xIDI4LjYgMCA1NS42IDYuMiA4MCAxNy40bDAtMzMuNGMwLTM1LjMtMjguNy02NC02NC02NGwtNjQgMC0xMjcuOS0xMTUuMWMtMTguMy0xNi40LTQ2LTE2LjQtNjQuMiAwTDEyOCAxMjggNjQgMTI4em02NCAyNDBjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMnpNMTEyIDI1NmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2ek0yODggMTI4YTY0IDY0IDAgMSAxIDAgMTI4IDY0IDY0IDAgMSAxIDAtMTI4ek00OTYgNTQ0YTE0NCAxNDQgMCAxIDAgMC0yODggMTQ0IDE0NCAwIDEgMCAwIDI4OHptNTkuMy0xODAuN2wtMzYuNyAzNi43IDM2LjcgMzYuN2M2LjIgNi4yIDYuMiAxNi40IDAgMjIuNnMtMTYuNCA2LjItMjIuNiAwbC0zNi43LTM2LjctMzYuNyAzNi43Yy02LjIgNi4yLTE2LjQgNi4yLTIyLjYgMHMtNi4yLTE2LjQgMC0yMi42bDM2LjctMzYuNy0zNi43LTM2LjdjLTYuMi02LjItNi4yLTE2LjQgMC0yMi42czE2LjQtNi4yIDIyLjYgMGwzNi43IDM2LjcgMzYuNy0zNi43YzYuMi02LjIgMTYuNC02LjIgMjIuNiAwczYuMiAxNi40IDAgMjIuNnoiXQogICAgfTsKICAgIGZhSGFuZExpemFyZDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1saXphcmQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjI1OCIsICJNMCAxMTJDMCA4NS41IDIxLjUgNjQgNDggNjRsMjM4LjUgMGMzNi44IDAgNzEuMiAxOCA5Mi4xIDQ4LjJsMTEzLjUgMTY0YzEzIDE4LjcgMTkuOSA0MSAxOS45IDYzLjhsMCA3NmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtOTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0xMy44LTc4LjEtNTAuMi0xNjEuOSAwYy0yNi41IDAtNDgtMjEuNS00OC00OHMyMS41LTQ4IDQ4LTQ4bDEyOCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4cy0yMS41LTQ4LTQ4LTQ4TDQ4IDE2MGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDh6Il0KICAgIH07CiAgICBmYUNoYWxrYm9hcmQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hhbGtib2FyZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJibGFja2JvYXJkIl0sICJmNTFiIiwgIk05NiA2NGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCAyNTZjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNTEyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsMC0yNTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMOTYgNjR6TTQ4MCAzODRsLTY0IDAgMC0zMmMwLTE3LjctMTQuMy0zMi0zMi0zMmwtOTYgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAzMi0xNjAgMCAwLTI1NiAzODQgMCAwIDI1NnoiXQogICAgfTsKICAgIGZhQmxhY2tib2FyZCA9IGZhQ2hhbGtib2FyZDsKICAgIGZhVXBSaWdodEZyb21TcXVhcmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXAtcmlnaHQtZnJvbS1zcXVhcmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiZXh0ZXJuYWwtbGluay1hbHQiXSwgImYzNWQiLCAiTTI5MC40IDE5LjhDMjk1LjQgNy44IDMwNy4xIDAgMzIwIDBMNDgwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxNjBjMCAxMi45LTcuOCAyNC42LTE5LjggMjkuNnMtMjUuNyAyLjItMzQuOS02LjlMNDAwIDE1Ny4zIDI0Ni42IDMxMC42Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM0wzNTQuNyAxMTIgMjk3LjQgNTQuNmMtOS4yLTkuMi0xMS45LTIyLjktNi45LTM0Ljl6TTAgMTc2YzAtNDQuMiAzNS44LTgwIDgwLTgwbDgwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTgwIDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDI1NmMwIDguOCA3LjIgMTYgMTYgMTZsMjU2IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtODBjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDgwYzAgNDQuMi0zNS44IDgwLTgwIDgwTDgwIDUxMmMtNDQuMiAwLTgwLTM1LjgtODAtODBMMCAxNzZ6Il0KICAgIH07CiAgICBmYUV4dGVybmFsTGlua0FsdCA9IGZhVXBSaWdodEZyb21TcXVhcmU7CiAgICBmYVNxdWFyZUZ1bGwyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1mdWxsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4OTk3LCAxMjg5OTgsIDEyODk5OSwgMTI5ZTMsIDEyOTAwMSwgMTI5MDAyLCAxMjkwMDMsIDExMDM1LCAxMTAzNl0sICJmNDVjIiwgIk0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEw0NDggMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDM4NGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6Il0KICAgIH07CiAgICBmYUNsb3ZlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjbG92ZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTEzOSIsICJNMzEwLjQgMTZDMzQ2LjYgMTYgMzc2IDQ1LjQgMzc2IDgxLjdsMCA1LjJjMCAxMS4yLTIuNyAyMi4zLTcuOCAzMi4ybC0yLjMgNC4yLTIwLjEgMzMuNWMtMS4xIDEuOS0xLjIgMy40LTEuMSA0LjUgLjIgMS4zIC45IDIuNyAyLjEgMy45czIuNiAxLjkgMy45IDIuMWMxLjEgLjIgMi42IC4xIDQuNS0xLjFsMzMuNS0yMC4xIDQuMi0yLjNjMTAtNS4xIDIxLTcuOCAzMi4yLTcuOGw1LjIgMGMzNi4yIDAgNjUuNiAyOS40IDY1LjYgNjUuNyAwIDE3LjQtNi45IDM0LjEtMTkuMiA0Ni40bC0xLjMgMS4zYy0zLjcgMy43LTMuNyA5LjYgMCAxMy4zbDEuMyAxLjNjMTIuMyAxMi4zIDE5LjIgMjkgMTkuMiA0Ni40IDAgMzYuMi0yOS40IDY1LjYtNjUuNiA2NS42bC01LjIgMGMtMTIuOCAwLTI1LjUtMy41LTM2LjUtMTAuMWwtMzMuNS0yMC4xYy0xLjktMS4xLTMuNC0xLjItNC41LTEuMS0xLjMgLjItMi43IC45LTMuOSAyLjFzLTEuOSAyLjYtMi4xIDMuOWMtLjIgMS4xLS4xIDIuNiAxLjEgNC41bDIwLjEgMzMuNWM2LjYgMTEgMTAuMSAyMy42IDEwLjEgMzYuNWwwIDUuMmMwIDM2LjItMjkuNCA2NS42LTY1LjYgNjUuNi0xNy40IDAtMzQuMS02LjktNDYuNC0xOS4ybC0xLjMtMS4zYy0zLjctMy43LTkuNi0zLjctMTMuMyAwbC0xLjMgMS4zYy0xMi4zIDEyLjMtMjkgMTkuMi00Ni40IDE5LjItMzYuMiAwLTY1LjYtMjkuNC02NS43LTY1LjZsMC01LjJjMC0xMi44IDMuNS0yNS41IDEwLjEtMzYuNWwyMC4xLTMzLjVjMS4xLTEuOSAxLjItMy40IDEuMS00LjUtLjItMS4zLS45LTIuNy0yLjEtMy45cy0yLjYtMS45LTMuOS0yLjFjLS41LS4xLTEuMi0uMS0xLjkgMGwtMi41IDEtMzMuNSAyMC4xYy0xMSA2LjYtMjMuNiAxMC4xLTM2LjUgMTAuMWwtNS4yIDBDNDUuNCAzNzYgMTYgMzQ2LjYgMTYgMzEwLjQgMTYgMjkzIDIyLjkgMjc2LjMgMzUuMiAyNjRsMS4zLTEuMyAxLjItMS41YzIuMS0zLjEgMi4xLTcuMiAwLTEwLjNsLTEuMi0xLjUtMS4zLTEuM0MyMi45IDIzNS44IDE2IDIxOS4xIDE2IDIwMS43IDE2IDE2NS40IDQ1LjQgMTM2IDgxLjcgMTM2bDUuMiAwYzEyLjggMCAyNS41IDMuNSAzNi41IDEwLjFsMzMuNSAyMC4xIDIuNSAxYy43IC4xIDEuNCAuMSAxLjkgLjEgMS4zLS4yIDIuNy0uOSAzLjktMi4xczEuOS0yLjYgMi4xLTMuOWMuMS0uNSAuMS0xLjItLjEtMS45bC0xLTIuNS0yMC4xLTMzLjVjLTYuNi0xMS0xMC4xLTIzLjYtMTAuMS0zNi41bDAtNS4yYzAtMzYuMiAyOS40LTY1LjcgNjUuNy02NS43IDE3LjQgMCAzNC4xIDYuOSA0Ni40IDE5LjJsMS4zIDEuM2MzLjcgMy42IDkuNiAzLjcgMTMuMyAwbDEuMy0xLjMgNC44LTQuNEMyODAuNSAyMS4zIDI5NS4xIDE2IDMxMC40IDE2eiJdCiAgICB9OwogICAgZmFUZWV0aE9wZW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGVldGgtb3BlbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNjJmIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2bDAgODBjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC04MGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnptMCAyNzJjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgNDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC00OGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMDR6bTgwLTE2MGMwLTI2LjUgMjEuNS00OCA0OC00OHM0OCAyMS41IDQ4IDQ4bDAgMjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRsLTQ4IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtMjR6bTEyOCAwYzAtMjYuNSAyMS41LTQ4IDQ4LTQ4czQ4IDIxLjUgNDggNDhsMCAyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNGwtNDggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC0yNHpNODAgMTEyYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRsLTE2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtMjRjMC0xNy43IDE0LjMtMzIgMzItMzJ6bTMyMCAzMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRsLTE2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtMjR6TTQ4IDM4NGwwLTE2YzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDE2YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMyem0xNDQgNDhjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMTZjMC04LjggNy4yLTE2IDE2LTE2bDY0IDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMTZjMCAyNi41LTIxLjUgNDgtNDggNDh6bTEyOCAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTE2YzAtOC44IDcuMi0xNiAxNi0xNmw2NCAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDE2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4em0xMTItMTZjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTZjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMTZjMCAxNy43LTE0LjMgMzItMzIgMzJ6Il0KICAgIH07CiAgICBmYUJhcnNTdGFnZ2VyZWQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmFycy1zdGFnZ2VyZWQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsicmVvcmRlciIsICJzdHJlYW0iXSwgImY1NTAiLCAiTTAgOTZDMCA3OC4zIDE0LjMgNjQgMzIgNjRsMzg0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgMTI4QzE0LjMgMTI4IDAgMTEzLjcgMCA5NnpNNjQgMjU2YzAtMTcuNyAxNC4zLTMyIDMyLTMybDM4NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDk2IDI4OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6TTQ0OCA0MTZjMCAxNy43LTE0LjMgMzItMzIgMzJMMzIgNDQ4Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDM4NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMyeiJdCiAgICB9OwogICAgZmFSZW9yZGVyID0gZmFCYXJzU3RhZ2dlcmVkOwogICAgZmFTdHJlYW0gPSBmYUJhcnNTdGFnZ2VyZWQ7CiAgICBmYVdhcmVob3VzZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3YXJlaG91c2UiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjQ5NCIsICJNMCAxNDIuMUwwIDQ4MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjQwYzAtMTcuNyAxNC4zLTMyIDMyLTMybDM4NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMjQwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zMzcuOWMwLTI3LjUtMTcuNi01Mi00My44LTYwLjdMMzAzLjIgNS4xYy05LjktMy4zLTIwLjUtMy4zLTMwLjQgMEw0My44IDgxLjRDMTcuNiA5MC4xIDAgMTE0LjYgMCAxNDIuMXpNNDY0IDI1NmwtMzUyIDAgMCA2NCAzNTIgMCAwLTY0ek0xMTIgNDE2bDM1MiAwIDAtNjQtMzUyIDAgMCA2NHptMzUyIDMybC0zNTIgMCAwIDY0IDM1MiAwIDAtNjR6Il0KICAgIH07CiAgICBmYVN3YXRjaGJvb2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3dhdGNoYm9vayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNWMzIiwgIk0wIDQ4QzAgMjEuNSAyMS41IDAgNDggMGw5NiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMzY4YzAgNTMtNDMgOTYtOTYgOTZTMCA0NjkgMCA0MTZMMCA0OHpNMjQwIDQwOS42bDAtMjcxLjUgNDguMS00OC4xYzE4LjctMTguNyA0OS4xLTE4LjcgNjcuOSAwbDY3LjkgNjcuOWMxOC43IDE4LjcgMTguNyA0OS4xIDAgNjcuOUwyNDAgNDA5LjZ6TTIwNS41IDUxMmwxOTItMTkyIDY2LjYgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDk2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0yNTguNSAwek04MCA2NGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2TDgwIDY0ek02NCAyMDhsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnpNOTYgNDQwYTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiXQogICAgfTsKICAgIGZhQ2FtcGdyb3VuZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYW1wZ3JvdW5kIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTk3OF0sICJmNmJiIiwgIk0zNDQuOCA1Mi4zYzExLjItMTMuNyA5LjItMzMuOC00LjUtNDVzLTMzLjgtOS4yLTQ1IDQuNWwtMzkuMiA0OC0zOS4yLTQ4QzIwNS42LTEuOSAxODUuNC00IDE3MS43IDcuMnMtMTUuNyAzMS40LTQuNSA0NWw0Ny40IDU4LTIwMiAyNDYuOUM0LjUgMzY3LjEgMCAzNzkuNiAwIDM5Mi42TDAgNDMyYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDQxNiAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMzkuNGMwLTEyLjktNC41LTI1LjUtMTIuNy0zNS41bC0yMDItMjQ2LjkgNDcuNC01OHpNMjU2IDI4OGwxMTIgMTI4LTIyNCAwIDExMi0xMjh6Il0KICAgIH07CiAgICBmYVBlcnNvbldhbGtpbmdBcnJvd1JpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi13YWxraW5nLWFycm93LXJpZ2h0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1NTIiLCAiTTEwNC41IDI0YTU2IDU2IDAgMSAxIDExMiAwIDU2IDU2IDAgMSAxIC0xMTIgMHptLTggMTgxLjNMNzMuOSAyMjcuOWMtNiA2LTkuNCAxNC4xLTkuNCAyMi42bDAgMzcuNWMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTM3LjVjMC0yNS41IDEwLjEtNDkuOSAyOC4xLTY3LjlsMzUuMS0zNS4xYzIyLjgtMjIuOCA1My42LTM1LjYgODUuOC0zNS42IDM2LjkgMCA3MS44IDE2LjggOTQuOCA0NS42TDI2Mi4zIDE4MGM2LjEgNy42IDE1LjMgMTIgMjUgMTJsMzMuMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0zMy4yIDBjLTI5LjIgMC01Ni43LTEzLjMtNzUtMzZsLTMuOC00LjcgMCAxMTUuMiAzNC41IDI5LjZjMTcuNyAxNS4yIDI5LjMgMzYuMiAzMi42IDU5LjNsMTIuNiA4OC4xYzIuNSAxNy41LTkuNyAzMy43LTI3LjIgMzYuMnMtMzMuNy05LjctMzYuMi0yNy4ybC0xMi42LTg4LjFjLTEuMS03LjctNS0xNC43LTEwLjktMTkuOEwxMzAgMzQ3LjVjLTIxLjMtMTguMi0zMy41LTQ0LjktMzMuNS03Mi45bDAtNjkuM3pNOTYuNiAzNzFjMi40IDIuMyA0LjggNC42IDcuNCA2LjhsNDYgMzkuNC0yLjIgNy42Yy00LjUgMTUuNy0xMi45IDMwLTI0LjQgNDEuNUw1NS4xIDUzNC42Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM2w2OC4zLTY4LjNjMy44LTMuOCA2LjYtOC42IDguMS0xMy44TDk2LjYgMzcxek01MDUuNSAzNDVjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsMzEtMzEtMTAyLjEgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxMDIuMSAwLTMxLTMxYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBsNzIgNzJjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlsLTcyIDcyeiJdCiAgICB9OwogICAgZmFHbGFzc2VzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImdsYXNzZXMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjUzMCIsICJNMTQzLjMgOTZjLTE0IDAtMjYuNSA5LjItMzAuNiAyMi42TDcwLjQgMjU2IDIyNCAyNTZjMTcuNyAwIDMyIDE0LjMgMzIgMzJsNjQgMGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwxNTMuNiAwLTQyLjMtMTM3LjRDNDU5LjIgMTA1LjIgNDQ2LjggOTYgNDMyLjcgOTZMNDAwIDk2Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDMyLjcgMGM0Mi4xIDAgNzkuNCAyNy41IDkxLjggNjcuOGw0NS40IDE0Ny41YzQuMSAxMy4yIDYuMSAyNi45IDYuMSA0MC43bDAgOTZjMCA1My00MyA5Ni05NiA5NmwtNjQgMGMtNTMgMC05Ni00My05Ni05NmwwLTMyLTY0IDAgMCAzMmMwIDUzLTQzIDk2LTk2IDk2bC02NCAwYy01MyAwLTk2LTQzLTk2LTk2bDAtOTZjMC0xMy44IDIuMS0yNy41IDYuMS00MC43TDUxLjUgOTkuOEM2My45IDU5LjUgMTAxLjEgMzIgMTQzLjMgMzJMMTc2IDMyYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0zMi43IDB6TTY0IDMyMGwwIDY0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDY0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC02NC0xMjggMHptNDE2IDk2YzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNjQtMTI4IDAgMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmw2NCAweiJdCiAgICB9OwogICAgZmFDaXJjbGVQYXVzZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLXBhdXNlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjIwOTIsICJwYXVzZS1jaXJjbGUiXSwgImYyOGIiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0yMjQgMTkybDAgMTI4YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTI4YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJ6bTEyOCAwbDAgMTI4YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTI4YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJ6Il0KICAgIH07CiAgICBmYVBhdXNlQ2lyY2xlMiA9IGZhQ2lyY2xlUGF1c2UyOwogICAgZmFNZW1vcnkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWVtb3J5IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1MzgiLCAiTTY0IDY0QzI4LjcgNjQgMCA5Mi43IDAgMTI4bDAgNy40QzAgMTQyLjIgNC40IDE0OCAxMC4xIDE1MS43IDIzLjMgMTYwLjMgMzIgMTc1LjEgMzIgMTkycy04LjcgMzEuNy0yMS45IDQwLjNDNC40IDIzNiAwIDI0MS44IDAgMjQ4LjZsMCA1NS40IDUxMiAwIDAtNTUuNGMwLTYuOC00LjQtMTIuNi0xMC4xLTE2LjMtMTMuMi04LjYtMjEuOS0yMy40LTIxLjktNDAuM3M4LjctMzEuNyAyMS45LTQwLjNjNS43LTMuNyAxMC4xLTkuNSAxMC4xLTE2LjNsMC03LjRjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgNjR6TTUxMiA0MTZsMC02NC01MTIgMCAwIDY0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDY0IDAgMC0yNGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgMjQgODggMCAwLTI0YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCAyNCA4OCAwIDAtMjRjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDI0IDY0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJ6TTE2MCAxNjBsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJ6bTEyOCAwbDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02NGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMyem0xMjggMGwwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMnoiXQogICAgfTsKICAgIGZhR2lmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnaWZ0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3ODczXSwgImYwNmIiLCAiTTMyMS41IDY4LjhDMzI5LjEgNTUuOSAzNDIuOSA0OCAzNTcuOCA0OGwyLjIgMGMyMi4xIDAgNDAgMTcuOSA0MCA0MHMtMTcuOSA0MC00MCA0MGwtNzMuMyAwIDM0LjgtNTkuMnptLTEzMSAwbDM0LjggNTkuMi03My4zIDBjLTIyLjEgMC00MC0xNy45LTQwLTQwczE3LjktNDAgNDAtNDBsMi4yIDBjMTQuOSAwIDI4LjggNy45IDM2LjMgMjAuOHptODkuNi0yNC4zbC0yNC4xIDQxLTI0LjEtNDFDMjE1LjcgMTYuOSAxODYuMSAwIDE1NC4yIDBMMTUyIDBjLTQ4LjYgMC04OCAzOS40LTg4IDg4IDAgMTQuNCAzLjUgMjggOS42IDQwTDMyIDEyOGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMmw0NDggMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTMyYzAtMTcuNy0xNC4zLTMyLTMyLTMybC00MS42IDBjNi4xLTEyIDkuNi0yNS42IDkuNi00MCAwLTQ4LjYtMzkuNC04OC04OC04OGwtMi4yIDBjLTMxLjkgMC02MS41IDE2LjktNzcuNyA0NC40ek00ODAgMjcybC0yMDAgMCAwIDIwOCAxMzYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTE0NHptLTI0OCAwbC0yMDAgMCAwIDE0NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxMzYgMCAwLTIwOHoiXQogICAgfTsKICAgIGZhTW9uZXlCaWxsV2hlYXQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibW9uZXktYmlsbC13aGVhdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTJhIiwgIk0xNzYtMTZjNDQuMiAwIDgwIDM1LjggODAgODAgMCA4LjgtNy4yIDE2LTE2IDE2LTQ0LjIgMC04MC0zNS44LTgwLTgwIDAtOC44IDcuMi0xNiAxNi0xNnpNNTYgMGw0OCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0TDU2IDQ4QzQyLjcgNDggMzIgMzcuMyAzMiAyNFM0Mi43IDAgNTYgMHpNMjQgNzJsMTEyIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRMMjQgMTIwQzEwLjcgMTIwIDAgMTA5LjMgMCA5NlMxMC43IDcyIDI0IDcyem04IDk2YzAtMTMuMyAxMC43LTI0IDI0LTI0bDQ4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTQ4IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0ek0yNzIgMGMwLTguOCA3LjItMTYgMTYtMTYgNDQuMiAwIDgwIDM1LjggODAgODAgMCA4LjgtNy4yIDE2LTE2IDE2LTQ0LjIgMC04MC0zNS44LTgwLTgwek00MDAtMTZjNDQuMiAwIDgwIDM1LjggODAgODAgMCA4LjgtNy4yIDE2LTE2IDE2LTQ0LjIgMC04MC0zNS44LTgwLTgwIDAtOC44IDcuMi0xNiAxNi0xNnptODAgMTQ0YzAgNDQuMi0zNS44IDgwLTgwIDgwLTguOCAwLTE2LTcuMi0xNi0xNiAwLTQ0LjIgMzUuOC04MCA4MC04MCA4LjggMCAxNiA3LjIgMTYgMTZ6TTM1MiAxMTJjOC44IDAgMTYgNy4yIDE2IDE2IDAgNDQuMi0zNS44IDgwLTgwIDgwLTguOCAwLTE2LTcuMi0xNi0xNiAwLTQ0LjIgMzUuOC04MCA4MC04MHptLTk2IDE2YzAgNDQuMi0zNS44IDgwLTgwIDgwLTguOCAwLTE2LTcuMi0xNi0xNiAwLTQ0LjIgMzUuOC04MCA4MC04MCA4LjggMCAxNiA3LjIgMTYgMTZ6TTAgMzA0YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDQxNiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMTYwYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDQ4IDUxMmMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCAzMDR6TTQ4IDQxNmwwIDQ4IDQ4IDBjMC0yNi41LTIxLjUtNDgtNDgtNDh6TTk2IDMwNGwtNDggMCAwIDQ4YzI2LjUgMCA0OC0yMS41IDQ4LTQ4ek00NjQgNDE2Yy0yNi41IDAtNDggMjEuNS00OCA0OGw0OCAwIDAtNDh6TTQxNiAzMDRjMCAyNi41IDIxLjUgNDggNDggNDhsMC00OC00OCAwem0tOTYgODBhNjQgNjQgMCAxIDAgLTEyOCAwIDY0IDY0IDAgMSAwIDEyOCAweiJdCiAgICB9OwogICAgZmFEdW5nZW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImR1bmdlb24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjZkOSIsICJNMzQ3LjUgMTQ0LjhjNi41IDUuNCAxMi41IDExLjMgMTggMTcuNyA4LjcgMTAuMiAyMy43IDE0IDM1LjEgNi45bDU0LjEtMzMuOGMxMS4yLTcgMTQuNy0yMS43IDYuOS0zMi4yLTE1LjMtMjAuNS0zMy41LTM4LjYtNTQuMS01My44LTEwLjQtNy42LTI0LjctNC4zLTMxLjggNi40bC0zNS4xIDUyLjZjLTcuOCAxMS42LTMuOCAyNy4zIDcgMzYuMnpNMzI3LjggNDEuMWM4LjYtMTIuOSAyLjktMzAuNS0xMi4yLTM0LjEtMTkuMS00LjYtMzkuMS03LTU5LjYtN3MtNDAuNCAyLjQtNTkuNiA3Yy0xNS4xIDMuNi0yMC44IDIxLjItMTIuMiAzNC4xbDQwIDYwYzUuMiA3LjggMTQuNSAxMS43IDIzLjkgMTEuMiA1LjItLjMgMTAuNi0uMyAxNS44IDAgOS40IC41IDE4LjctMy40IDIzLjktMTEuMmw0MC02MHpNNTAuNSAxMDMuM2MtNy45IDEwLjUtNC4zIDI1LjMgNi45IDMyLjJsNTQuMSAzMy44YzExLjQgNy4xIDI2LjMgMy4zIDM1LjEtNi45IDUuNS02LjQgMTEuNS0xMi4zIDE4LTE3LjcgMTAuOC04LjkgMTQuOC0yNC42IDctMzYuMkwxMzYuNCA1NS45Yy03LjEtMTAuNy0yMS41LTE0LTMxLjgtNi40LTIwLjYgMTUuMS0zOC44IDMzLjMtNTQuMSA1My44em02MiAxNDEuMWMuOC05LjktMy4zLTE5LjktMTEuOC0yNS4xTDQxIDE4MmMtMTIuOS04LTI5LjktMi4zLTMzLjYgMTIuNS00LjkgMTkuNy03LjUgNDAuMy03LjUgNjEuNmwwIDI0YzAgMTMuMyAxMC43IDI0IDI0IDI0bDY0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC0yNGMwLTMuOSAuMi03LjggLjUtMTEuNnptMjg3LjEgMGMuMyAzLjggLjUgNy43IC41IDExLjZsMCAyNGMwIDEzLjMgMTAuNyAyNCAyNCAyNGw2NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtMjRjMC0yMS4yLTIuNi00MS44LTcuNS02MS42LTMuNi0xNC43LTIwLjctMjAuNS0zMy42LTEyLjVsLTU5LjcgMzcuM2MtOC40IDUuMy0xMi42IDE1LjItMTEuOCAyNS4xek04OCAzNTJsLTY0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0TDAgNDg4YzAgMTMuMyAxMC43IDI0IDI0IDI0bDY0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC0xMTJjMC0xMy4zLTEwLjctMjQtMjQtMjR6bTQwMCAwbC02NCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDExMmMwIDEzLjMgMTAuNyAyNCAyNCAyNGw2NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtMTEyYzAtMTMuMy0xMC43LTI0LTI0LTI0ek0yODAgMTg0YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMzA0YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0zMDR6bS04MCAzMmMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDI3MmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMjcyem0xNjAgMGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDI3MmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMjcyeiJdCiAgICB9OwogICAgZmFTdWl0Y2FzZU1lZGljYWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3VpdGNhc2UtbWVkaWNhbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJtZWRraXQiXSwgImYwZmEiLCAiTTE5MiA1NmwwIDQwIDEyOCAwIDAtNDBjMC00LjQtMy42LTgtOC04TDIwMCA0OGMtNC40IDAtOCAzLjYtOCA4em0tNDggOGwwLThjMC0zMC45IDI1LjEtNTYgNTYtNTZMMzEyIDBjMzAuOSAwIDU2IDI1LjEgNTYgNTZsMCA0MjQtMjI0IDAgMC00MTZ6TTk2IDE3NmwwIDMwNC0zMiAwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDE2MGMwLTM1LjMgMjguNy02NCA2NC02NGwzMiAwIDAgODB6TTQxNiA0ODBsMC0zODQgMzIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI1NmMwIDM1LjMtMjguNyA2NC02NCA2NGwtMzIgMHpNMjQ0IDIwOGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzYtMzYgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMjRjMCA4LjggNy4yIDE2IDE2IDE2bDM2IDAgMCAzNmMwIDguOCA3LjIgMTYgMTYgMTZsMjQgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zNiAzNiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTI0YzAtOC44LTcuMi0xNi0xNi0xNmwtMzYgMCAwLTM2YzAtOC44LTcuMi0xNi0xNi0xNmwtMjQgMHoiXQogICAgfTsKICAgIGZhTWVka2l0ID0gZmFTdWl0Y2FzZU1lZGljYWw7CiAgICBmYVBlcnNvbkNhbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLWNhbmUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTUzYyIsICJNMjMyLTMyYTU2IDU2IDAgMSAxIDAgMTEyIDU2IDU2IDAgMSAxIDAtMTEyek0xNDQgMjM2LjdMOTcuNyAyOTkuMWMtMTAuNSAxNC4yLTMwLjYgMTcuMi00NC44IDYuNnMtMTcuMi0zMC42LTYuNi00NC44bDcwLjUtOTVDMTQyIDEzMiAxODEuNyAxMTIgMjI0IDExMnM4MiAyMCAxMDcuMiA1My45bDcwLjUgOTVjMTAuNSAxNC4yIDcuNiAzNC4yLTYuNiA0NC44cy0zNC4yIDcuNi00NC44LTYuNkwzMDQgMjM2LjcgMzA0IDUxMmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTE2MGMwLTguOC03LjItMTYtMTYtMTZzLTE2IDcuMi0xNiAxNmwwIDE2MGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTI3NS4zek0zOTIgMzg0Yy00LjQgMC04IDMuNi04IDggMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRjMC0zMC45IDI1LjEtNTYgNTYtNTZzNTYgMjUuMSA1NiA1NmwwIDEyOGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTEyOGMwLTQuNC0zLjYtOC04LTh6Il0KICAgIH07CiAgICBmYUdhdWdlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImdhdWdlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImRhc2hib2FyZCIsICJnYXVnZS1tZWQiLCAidGFjaG9tZXRlci1hbHQtYXZlcmFnZSJdLCAiZjYyNCIsICJNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMzIwIDk2YzAtMjYuOS0xNi41LTQ5LjktNDAtNTkuM0wyODAgMTIwYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTcyLjdjLTIzLjUgOS41LTQwIDMyLjUtNDAgNTkuMyAwIDM1LjMgMjguNyA2NCA2NCA2NHM2NC0yOC43IDY0LTY0ek0xNDQgMTc2YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHptLTE2IDgwYTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6bTI4OCAzMmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6TTQwMCAxNDRhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHoiXQogICAgfTsKICAgIGZhRGFzaGJvYXJkID0gZmFHYXVnZTsKICAgIGZhR2F1Z2VNZWQgPSBmYUdhdWdlOwogICAgZmFUYWNob21ldGVyQWx0QXZlcmFnZSA9IGZhR2F1Z2U7CiAgICBmYUVudmVsb3BlT3BlblRleHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZW52ZWxvcGUtb3Blbi10ZXh0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY2NTgiLCAiTTI4OCAzMy45TDk2LjQgMTc1LjggMjU0LjUgMjkzYzUuMyAzLjkgMTEuMiA2LjkgMTcuNSA4LjdMMjcyIDQ2NGMwIDUuNSAuNSAxMC44IDEuMyAxNkw5NiA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMjM5LjljMC0yMC4zIDkuNi0zOS40IDI1LjktNTEuNEwyNTQuNS0yMWM5LjctNy4yIDIxLjQtMTEgMzMuNS0xMXMyMy44IDMuOSAzMy41IDExTDUxOC4xIDEyNC43YzcuMiA1LjMgMTMuMSAxMiAxNy40IDE5LjYtMi41LS4yLTUtLjMtNy41LS4zTDQzNi42IDE0NCAyODggMzMuOXpNMzIwIDI0MGMwLTI2LjUgMjEuNS00OCA0OC00OGwxNjAgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDIyNGMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTYwIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMjI0em04MCAxNmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw5NiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC05NiAwem0wIDk2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDU2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTU2IDB6Il0KICAgIH07CiAgICBmYVRvb2xib3ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidG9vbGJveCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyOTUyMF0sICJmNTUyIiwgIk0xNzYgNTZsMCA0MCAxNjAgMCAwLTQwYzAtNC40LTMuNi04LTgtOEwxODQgNDhjLTQuNCAwLTggMy42LTggOHpNMTI4IDk2bDAtNDBjMC0zMC45IDI1LjEtNTYgNTYtNTZMMzI4IDBjMzAuOSAwIDU2IDI1LjEgNTYgNTZsMCA0MCAyOC4xIDBjMTIuNyAwIDI0LjkgNS4xIDMzLjkgMTQuMWw1MS45IDUxLjljOSA5IDE0LjEgMjEuMiAxNC4xIDMzLjlsMCA3Ni4xLTEzNiAwIDAtMTZjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAxNi0xNDQgMCAwLTE2YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTYtMTM2IDAgMC03Ni4xYzAtMTIuNyA1LjEtMjQuOSAxNC4xLTMzLjlsNTEuOS01MS45YzktOSAyMS4yLTE0LjEgMzMuOS0xNC4xTDEyOCA5NnpNMCA0MTZsMC05NiAxMzYgMCAwIDE2YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xNiAxNDQgMCAwIDE2YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xNiAxMzYgMCAwIDk2YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjR6Il0KICAgIH07CiAgICBmYVBvd2VyT2ZmID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBvd2VyLW9mZiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzkyMTFdLCAiZjAxMSIsICJNMjg4IDBjMC0xNy43LTE0LjMtMzItMzItMzJTMjI0LTE3LjcgMjI0IDBsMCAyNTZjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMkwyODggMHpNMTQ2LjMgOTguNGMxNC41LTEwLjEgMTgtMzAuMSA3LjktNDQuNnMtMzAuMS0xOC00NC42LTcuOUM0My40IDkyLjEgMCAxNjkgMCAyNTYgMCAzOTcuNCAxMTQuNiA1MTIgMjU2IDUxMlM1MTIgMzk3LjQgNTEyIDI1NmMwLTg3LTQzLjQtMTYzLjktMTA5LjctMjEwLjEtMTQuNS0xMC4xLTM0LjQtNi42LTQ0LjYgNy45cy02LjYgMzQuNCA3LjkgNDQuNmM0OS44IDM0LjggODIuMyA5Mi40IDgyLjMgMTU3LjYgMCAxMDYtODYgMTkyLTE5MiAxOTJTNjQgMzYyIDY0IDI1NmMwLTY1LjIgMzIuNS0xMjIuOSA4Mi4zLTE1Ny42eiJdCiAgICB9OwogICAgZmFTaWduYWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2lnbmFsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MjQ2LCAic2lnbmFsLTUiLCAic2lnbmFsLXBlcmZlY3QiXSwgImYwMTIiLCAiTTQ4OCA1NmMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDQwMGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNDAwek0zNjAgMTI4Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDMwNGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMzA0YzAtMTMuMy0xMC43LTI0LTI0LTI0ek0yODAgMjQ4YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMjA4YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0yMDh6TTE1MiAzMjBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMTEyYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xMTJjMC0xMy4zLTEwLjctMjQtMjQtMjR6TTQ4IDM4NGMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCA0OGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNDhjMC0xMy4zLTEwLjctMjQtMjQtMjR6Il0KICAgIH07CiAgICBmYVNpZ25hbDUgPSBmYVNpZ25hbDsKICAgIGZhU2lnbmFsUGVyZmVjdCA9IGZhU2lnbmFsOwogICAgZmFBcnJvd3NTcGluID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93cy1zcGluIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU0YmIiLCAiTTQ4MS43IDI0MC4xYy0xNy42LTEuMi0zMi45IDEyLTM0LjIgMjkuNy0zLjMgNDctMjMuNiA4OS40LTU0LjggMTIxTDM2MSAzNTljLTYuOS02LjktMTcuMi04LjktMjYuMi01LjJTMzIwIDM2Ni4zIDMyMCAzNzZsMCAxMTJjMCAxMy4zIDEwLjcgMjQgMjQgMjRsMTEyIDBjOS43IDAgMTguNS01LjggMjIuMi0xNC44czEuNy0xOS4zLTUuMi0yNi4ybC0zNS0zNWM0MS43LTQyLjIgNjguOS05OC44IDczLjQtMTYxLjggMS4yLTE3LjYtMTItMzIuOS0yOS43LTM0LjJ6TTM5IDQxTDc0IDc2Yy00MS43IDQyLjItNjguOSA5OC44LTczLjQgMTYxLjgtMS4yIDE3LjYgMTIgMzIuOSAyOS43IDM0LjJzMzIuOS0xMiAzNC4yLTI5LjdjMy4zLTQ3IDIzLjYtODkuNCA1NC44LTEyMUwxNTEgMTUzYzYuOSA2LjkgMTcuMiA4LjkgMjYuMiA1LjJTMTkyIDE0NS43IDE5MiAxMzZsMC0xMTJjMC0xMy4zLTEwLjctMjQtMjQtMjRMNTYgMEM0Ni4zIDAgMzcuNSA1LjggMzMuOCAxNC44UzMyLjIgMzQuMSAzOSA0MXptMjAxLTEwLjdjLTEuMiAxNy42IDEyIDMyLjkgMjkuNyAzNC4yIDQ3IDMuMyA4OS40IDIzLjYgMTIxIDU0LjhMMzU5IDE1MWMtNi45IDYuOS04LjkgMTcuMi01LjIgMjYuMlMzNjYuMyAxOTIgMzc2IDE5MmwxMTIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTExMmMwLTkuNy01LjgtMTguNS0xNC44LTIyLjJTNDc3LjkgMzIuMiA0NzEgMzlMNDM2IDc0Yy00Mi4yLTQxLjctOTguOC02OC45LTE2MS44LTczLjQtMTcuNi0xLjItMzIuOSAxMi0zNC4yIDI5Ljd6TTQxIDQ3M2wzNS0zNWM0Mi4yIDQxLjcgOTguOCA2OC45IDE2MS44IDczLjQgMTcuNiAxLjIgMzIuOS0xMiAzNC4yLTI5LjdzLTEyLTMyLjktMjkuNy0zNC4yYy00Ny0zLjMtODkuNC0yMy42LTEyMS01NC44TDE1MyAzNjFjNi45LTYuOSA4LjktMTcuMiA1LjItMjYuMlMxNDUuNyAzMjAgMTM2IDMyMEwyNCAzMjBjLTEzLjMgMC0yNCAxMC43LTI0IDI0TDAgNDU2YzAgOS43IDUuOCAxOC41IDE0LjggMjIuMlMzNC4xIDQ3OS44IDQxIDQ3M3oiXQogICAgfTsKICAgIGZhSm9pbnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiam9pbnQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjU5NSIsICJNMzYwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCAxOWMwIDQwLjMgMTYgNzkgNDQuNSAxMDcuNWwyMSAyMUM0NjkgMTkxIDQ4MCAyMTcuNCA0ODAgMjQ1bDAgMTljMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0xOWMwLTE0LjktNS45LTI5LjEtMTYuNC0zOS42bC0yMS0yMUMzNTcuMSAxNDYuOSAzMzYgOTYgMzM2IDQzbDAtMTljMC0xMy4zIDEwLjctMjQgMjQtMjR6TTU1MiAyODhjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtMTljMC00MC4zLTE2LTc5LTQ0LjUtMTA3LjVsLTIxLTIxQzQ0MyA5NyA0MzIgNzAuNiA0MzIgNDNsMC0xOWMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgMTljMCAxNC45IDUuOSAyOS4xIDE2LjQgMzkuNmwyMSAyMUM1NTQuOSAxNDEuMSA1NzYgMTkyIDU3NiAyNDVsMCAxOWMwIDEzLjMtMTAuNyAyNC0yNCAyNHpNMjkyLjcgMzIwYzUuNiAwIDEwLjcgMi45IDEzLjYgNy42TDM5NC42IDQ3MWMxLjMgMi4xIDAgNC45LTIuNCA1LjItMTYuMSAyLjUtMzIuNCAzLjctNDguNyAzLjdsLTM4LjEgMGMtNS42IDAtMTAuNy0yLjktMTMuNi03LjZsLTc5LTEyOC40Yy02LTkuOCAwLTIyLjYgMTEuNS0yMy4zIDYuNy0uNCAxMy40LS42IDIwLjItLjZsNDguMyAwek00NTkuMyA0NjUuOWMtNi40IDEtMTIuNy0xLjktMTYuMS03LjRMMzc0LjEgMzQ2LjFjLTYuNy0xMC45IDEuNS0yNC43IDE0LjItMjIuOSAxLjMgLjIgMi42IC40IDMuOCAuNmwxMzYuNCAyMWMyNy4zIDQuMiA0Ny40IDI3LjcgNDcuNCA1NS4zcy0yMC4xIDUxLjEtNDcuNCA1NS4zbC02OS4yIDEwLjZ6TTEzOC43IDMzNmM2LjctMS41IDEzLjYgMS40IDE3LjIgNy4ybDY4LjkgMTEyYzYuNiAxMC43LTEuMiAyNC40LTEzLjggMjMuMS0xMy0xLjQtMjUuOS0zLjUtMzguNi02LjVMMzEuMiA0MzkuMkMxMi45IDQzNSAwIDQxOC43IDAgNDAwczEyLjktMzUgMzEuMi0zOS4yTDEzOC43IDMzNnoiXQogICAgfTsKICAgIGZhQnJhaWxsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJicmFpbGxlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYyYTEiLCAiTTgwIDE0NGE4MCA4MCAwIDEgMCAwLTE2MCA4MCA4MCAwIDEgMCAwIDE2MHptMCAxOTJhODAgODAgMCAxIDAgMC0xNjAgODAgODAgMCAxIDAgMCAxNjB6bTAgMTM2Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0IDI0IDEwLjcgMjQgMjQtMTAuNyAyNC0yNCAyNHptMCA1NmM0NC4yIDAgODAtMzUuOCA4MC04MHMtMzUuOC04MC04MC04MC04MCAzNS44LTgwIDgwIDM1LjggODAgODAgODB6bTI0OC04MGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNCAxMC43LTI0IDI0LTI0IDI0IDEwLjcgMjQgMjR6bTU2IDBjMC00NC4yLTM1LjgtODAtODAtODBzLTgwIDM1LjgtODAgODAgMzUuOCA4MCA4MCA4MCA4MC0zNS44IDgwLTgwek0zMDQgMjMyYTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHptMCAxMDRhODAgODAgMCAxIDAgMC0xNjAgODAgODAgMCAxIDAgMCAxNjB6bTAtMTkyYTgwIDgwIDAgMSAwIDAtMTYwIDgwIDgwIDAgMSAwIDAgMTYweiJdCiAgICB9OwogICAgZmFCYXNrZXRTaG9wcGluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYXNrZXQtc2hvcHBpbmciLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsic2hvcHBpbmctYmFza2V0Il0sICJmMjkxIiwgIk0yODggMGM2LjYgMCAxMi45IDIuNyAxNy40IDcuNWwxNDQgMTUyIC41IC41IDc4LjEgMGMxNy43IDAgMzIgMTQuMyAzMiAzMiAwIDE0LjUtOS42IDI2LjctMjIuOCAzMC43TDQ5MS4xIDQyOS45Yy02LjUgMjkuMy0zMi41IDUwLjEtNjIuNSA1MC4xbC0yODEuMyAwYy0zMCAwLTU2LTIwLjgtNjIuNS01MC4xbC00Ni0yMDcuMmMtMTMuMi0zLjktMjIuOC0xNi4yLTIyLjgtMzAuNyAwLTE3LjcgMTQuMy0zMiAzMi0zMmw3OC4xIDAgLjUtLjUgMTQ0LTE1MkMyNzUuMSAyLjcgMjgxLjQgMCAyODggMHptMCA1OC45TDE5Mi4yIDE2MCAzODMuOCAxNjAgMjg4IDU4Ljl6TTIwOCAyNjRjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAxMTJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTExMnptODAtMjRjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMTEyYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xMTJjMC0xMy4zLTEwLjctMjQtMjQtMjR6bTEyOCAyNGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDExMmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTEyeiJdCiAgICB9OwogICAgZmFTaG9wcGluZ0Jhc2tldCA9IGZhQmFza2V0U2hvcHBpbmc7CiAgICBmYUJyaWRnZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJicmlkZ2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTRjOCIsICJNMzIgMzJDMTQuMyAzMiAwIDQ2LjMgMCA2NFMxNC4zIDk2IDMyIDk2bDggMCAwIDY0LTQwIDAgMCAxMTJjMzcuNiA5LjQgNjQgNDMuMiA2NCA4MmwwIDk0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC02NGMwLTUzIDQzLTk2IDk2LTk2czk2IDQzIDk2IDk2bDAgNjRjMCAxNy43IDE0LjMgMzIgMzIgMzJsMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTk0YzAtMzguOCAyNi40LTcyLjYgNjQtODJsMC0xMTItNDAgMCAwLTY0IDggMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwzMiAzMnpNNDI0IDk2bDAgNjQtODAgMCAwLTY0IDgwIDB6TTI5NiA5NmwwIDY0LTgwIDAgMC02NCA4MCAwek04OCA5Nmw4MCAwIDAgNjQtODAgMCAwLTY0eiJdCiAgICB9OwogICAgZmFQbGFuZUFycml2YWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGxhbmUtYXJyaXZhbCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyODc0OF0sICJmNWFmIiwgIk0zODYuNiAxOTMuMUwyNjUuOSAzLjdjLTQuOC03LjYtMTIuNi0xMi44LTIxLjQtMTQuM2wtNDMuMS03LjZjLTEwLjgtMS45LTIwLjIgNy4zLTE4LjYgMTguMWwyNCAxNjEuNi0xMDUtMTguNS0zMy44LTYxLjhDNjQuNSA3NC43IDU4LjIgNzAuMiA1MS4xIDY5TDM0IDY2Yy05LjgtMS43LTE4LjggNS45LTE4LjggMTUuOGwuNiAxMDYuM2MuMiAzMC45IDIyLjQgNTcuMyA1Mi45IDYyLjdsMTMuNSAyLjQgMCAwIDQxNy42IDczLjZjMzAuNSA1LjQgNTkuNS0xNSA2NC45LTQ1LjRzLTE1LTU5LjUtNDUuNC02NC45TDM4Ni42IDE5My4xek0yMjQgMzg0YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHptMTMxLjItMTUuM2EzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwek0zMiA0NDhjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNTEyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgNDQ4eiJdCiAgICB9OwogICAgZmFDYXNoUmVnaXN0ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FzaC1yZWdpc3RlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNzg4IiwgIk05NiAwQzYwLjcgMCAzMiAyOC43IDMyIDY0czI4LjcgNjQgNjQgNjRsNDggMCAwIDMyLTU3IDBjLTMxLjYgMC01OC41IDIzLjEtNjMuMyA1NC40TDEuMSAzNjQuMUMuNCAzNjguOCAwIDM3My42IDAgMzc4LjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC02OS42YzAtNC44LS40LTkuNi0xLjEtMTQuNEw0ODguMiAyMTQuNEM0ODMuNSAxODMuMSA0NTYuNiAxNjAgNDI1IDE2MGwtMjE3IDAgMC0zMiA0OCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0UzI5MS4zIDAgMjU2IDBMOTYgMHptMCA0OGwxNjAgMGM4LjggMCAxNiA3LjIgMTYgMTZzLTcuMiAxNi0xNiAxNkw5NiA4MGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNnpNNjQgNDI0YzAtMTMuMyAxMC43LTI0IDI0LTI0bDMzNiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0TDg4IDQ0OGMtMTMuMyAwLTI0LTEwLjctMjQtMjR6bTQ4LTE2MGEyNCAyNCAwIDEgMSAwLTQ4IDI0IDI0IDAgMSAxIDAgNDh6bTEyMC0yNGEyNCAyNCAwIDEgMSAtNDggMCAyNCAyNCAwIDEgMSA0OCAwek0xNjAgMzQ0YTI0IDI0IDAgMSAxIDAtNDggMjQgMjQgMCAxIDEgMCA0OHpNMzI4IDI0MGEyNCAyNCAwIDEgMSAtNDggMCAyNCAyNCAwIDEgMSA0OCAwek0yNTYgMzQ0YTI0IDI0IDAgMSAxIDAtNDggMjQgMjQgMCAxIDEgMCA0OHpNNDI0IDI0MGEyNCAyNCAwIDEgMSAtNDggMCAyNCAyNCAwIDEgMSA0OCAwek0zNTIgMzQ0YTI0IDI0IDAgMSAxIDAtNDggMjQgMjQgMCAxIDEgMCA0OHoiXQogICAgfTsKICAgIGZhUmluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyaW5nIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY3MGIiLCAiTTY0IDIwOGMwIDcuOCA0LjQgMTguNyAxNy4xIDMwLjMgNDUuNC0yNC4yIDEwNy43LTM4LjMgMTc0LjktMzguM3MxMjkuNSAxNC4xIDE3NC45IDM4LjNjMTIuOC0xMS42IDE3LjEtMjIuNSAxNy4xLTMwLjMgMC0xMi4zLTEwLjgtMzItNDcuOS01MC42LTM1LjItMTcuNi04Ni4xLTI5LjQtMTQ0LjEtMjkuNHMtMTA4LjkgMTEuOC0xNDQuMSAyOS40Qzc0LjggMTc2IDY0IDE5NS43IDY0IDIwOHptMTkyIDQwYy00NyAwLTg5LjMgNy42LTEyMi45IDE5LjcgMzMuMiAxMi40IDc1LjcgMjAuMyAxMjIuOSAyMC4zczg5LjctNy44IDEyMi45LTIwLjNDMzQ1LjMgMjU1LjYgMzAzIDI0OCAyNTYgMjQ4ek0wIDIwOEMwIDE1OC40IDM5LjQgMTIyLjIgODMuMyAxMDAuMiAxMjkuMSA3Ny4zIDE5MC4zIDY0IDI1NiA2NHMxMjYuOSAxMy4zIDE3Mi43IDM2LjJjNDMuOSAyMiA4My4zIDU4LjIgODMuMyAxMDcuOGwwIDk2YzAgNDkuNi0zOS40IDg1LjgtODMuMyAxMDcuOC00NS45IDIyLjktMTA3IDM2LjItMTcyLjcgMzYuMlMxMjkuMSA0MzQuNyA4My4zIDQxMS44QzM5LjQgMzg5LjggMCAzNTMuNiAwIDMwNGwwLTk2eiJdCiAgICB9OwogICAgZmFTaGFyZU5vZGVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNoYXJlLW5vZGVzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNoYXJlLWFsdCJdLCAiZjFlMCIsICJNMzg0IDE5MmM1MyAwIDk2LTQzIDk2LTk2cy00My05Ni05Ni05Ni05NiA0My05NiA5NmMwIDUuNCAuNSAxMC44IDEuMyAxNkwxNTkuNiAxODQuMWMtMTYuOS0xNS0zOS4yLTI0LjEtNjMuNi0yNC4xLTUzIDAtOTYgNDMtOTYgOTZzNDMgOTYgOTYgOTZjMjQuNCAwIDQ2LjYtOS4xIDYzLjYtMjQuMUwyODkuMyA0MDBjLS45IDUuMi0xLjMgMTAuNS0xLjMgMTYgMCA1MyA0MyA5NiA5NiA5NnM5Ni00MyA5Ni05Ni00My05Ni05Ni05NmMtMjQuNCAwLTQ2LjYgOS4xLTYzLjYgMjQuMUwxOTAuNyAyNzJjLjktNS4yIDEuMy0xMC41IDEuMy0xNnMtLjUtMTAuOC0xLjMtMTZsMTI5LjctNzIuMWMxNi45IDE1IDM5LjIgMjQuMSA2My42IDI0LjF6Il0KICAgIH07CiAgICBmYVNoYXJlQWx0ID0gZmFTaGFyZU5vZGVzOwogICAgZmFQZXJzb25DaXJjbGVFeGNsYW1hdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tY2lyY2xlLWV4Y2xhbWF0aW9uIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1M2YiLCAiTTI4MCAyNGE1NiA1NiAwIDEgMCAtMTEyIDAgNTYgNTYgMCAxIDAgMTEyIDB6bTI0IDIxMi43TDM0MSAyODYuNmMxMi44LTE3LjUgMjguNS0zMi43IDQ2LjMtNDVsLTU2LjItNzUuN0MzMDYgMTMyIDI2Ni4zIDExMiAyMjQgMTEycy04MiAyMC0xMDcuMiA1My45bC03MC41IDk1Yy0xMC41IDE0LjItNy42IDM0LjIgNi42IDQ0LjhzMzQuMiA3LjYgNDQuOC02LjZMMTQ0IDIzNi43IDE0NCA1MTJjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE2MGMwLTguOCA3LjItMTYgMTYtMTZzMTYgNy4yIDE2IDE2bDAgMTYwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yNzUuM3pNNDk2IDU0NGExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6bTAtMTAwYTIwIDIwIDAgMSAxIDAgNDAgMjAgMjAgMCAxIDEgMC00MHptMC0xNDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgODBjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC04MGMwLTguOCA3LjItMTYgMTYtMTZ6Il0KICAgIH07CiAgICBmYUJpbm9jdWxhcnMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmlub2N1bGFycyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMWU1IiwgIk0xMjggMzJsMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDMyLTk2IDAgMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnptNjQgOTZsMCAzMjBjMCAxNy43LTE0LjMgMzItMzIgMzJMMzIgNDgwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTU5LjFjMC0zNC42IDkuNC02OC42IDI3LjItOTguMyAxMy43LTIyLjggMjIuNS00OC4yIDI1LjgtNzQuNkw2MC41IDE1NmMyLTE2IDE1LjYtMjggMzEuOC0yOGw5OS44IDB6bTIyNy44IDBjMTYuMSAwIDI5LjggMTIgMzEuOCAyOEw0NTkgMjE2YzMuMyAyNi40IDEyLjEgNTEuOCAyNS44IDc0LjYgMTcuOCAyOS43IDI3LjIgNjMuNyAyNy4yIDk4LjNsMCA1OS4xYzAgMTcuNy0xNC4zIDMyLTMyIDMybC0xMjggMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0zMjAgOTkuOCAwek0zMjAgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJsMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDMyLTk2IDAgMC0zMnptLTMyIDY0bDAgMTYwLTY0IDAgMC0xNjAgNjQgMHoiXQogICAgfTsKICAgIGZhS2lwU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJraXAtc2lnbiIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlMWM0IiwgIk0zNDAuOCA4OC4zYzEzLjQtMTEuNSAxNS0zMS43IDMuNS00NS4xcy0zMS43LTE1LTQ1LjEtMy41TDEyOCAxODYuNCAxMjggNjRjMC0xNy43LTE0LjMtMzItMzItMzJTNjQgNDYuMyA2NCA2NGwwIDE2OC0zMiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDMyIDAgMCAxNjhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTEyMi40IDE3MS4yIDE0Ni43YzEzLjQgMTEuNSAzMy42IDkuOSA0NS4xLTMuNXM5LjktMzMuNi0zLjUtNDUuMUwxNzMuMiAyODAgMzUyIDI4MGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNEwxNzMuMiAyMzIgMzQwLjggODguM3oiXQogICAgfTsKICAgIGZhSGFyZERyaXZlMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYXJkLWRyaXZlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI4NDM2LCAiaGRkIl0sICJmMGEwIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgMjYwLjFDMTguMSAyNDcuNCA0MC4yIDI0MCA2NCAyNDBsMzIwIDBjMjMuOCAwIDQ1LjkgNy40IDY0IDIwLjFMNDQ4IDk2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyek00NDggMzUyYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDI4OGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCA2NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTY0ek0yMjQgMzg0YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTEyOC0zMmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYUhkZDIgPSBmYUhhcmREcml2ZTI7CiAgICBmYVJhbmtpbmdTdGFyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJhbmtpbmctc3RhciIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTYxIiwgIk0zMjEuOCA1NC4xTDI5OC4yIDYuM2MtMy45LTguMy0xNi4xLTguNi0yMC40IDBsLTIzLjYgNDcuOC01Mi4zIDcuNWMtOS4zIDEuNC0xMy4zIDEyLjktNi40IDE5LjhsMzggMzctOSA1Mi4xYy0xLjQgOS4zIDguMiAxNi41IDE2LjggMTIuMmw0Ni45LTI0LjggNDYuNiAyNC40YzguNiA0LjMgMTguMy0yLjkgMTYuOC0xMi4ybC05LTUyLjEgMzgtMzYuNmM2LjgtNi44IDIuOS0xOC4zLTYuNC0xOS44bC01Mi4zLTcuNXpNMjU2IDI1NmMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCAxNjBjMCAyNi41IDIxLjUgNDggNDggNDhsNjQgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTE2MGMwLTI2LjUtMjEuNS00OC00OC00OGwtNjQgMHpNNDggMzIwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDk2YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDY0IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC05NmMwLTI2LjUtMjEuNS00OC00OC00OGwtNjQgMHpNNDE2IDQzMmwwIDMyYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDY0IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0zMmMwLTI2LjUtMjEuNS00OC00OC00OGwtNjQgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDh6Il0KICAgIH07CiAgICBmYVVzZXJUaWUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlci10aWUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjUwOCIsICJNMjI0IDI0OGExMjAgMTIwIDAgMSAxIDAtMjQwIDEyMCAxMjAgMCAxIDEgMCAyNDB6bS0zMC41IDU2bDYxIDBjOS43IDAgMTcuNSA3LjggMTcuNSAxNy41IDAgNC4yLTEuNSA4LjItNC4yIDExLjRsLTI3LjQgMzIgMzEgMTE1LjEgLjYgMCAzNC42LTEzOC41YzIuMi04LjcgMTEuMS0xNCAxOS41LTEwLjggNjEuOSAyMy42IDEwNS45IDgzLjYgMTA1LjkgMTUzLjggMCAxNS4xLTEyLjMgMjcuNC0yNy40IDI3LjRMNDMuNCA1MTJjLTE1LjEgMC0yNy40LTEyLjMtMjcuNC0yNy40IDAtNzAuMiA0NC0xMzAuMiAxMDUuOS0xNTMuOCA4LjQtMy4yIDE3LjMgMi4xIDE5LjUgMTAuOGwzNC42IDEzOC41IC42IDAgMzEtMTE1LjEtMjcuNC0zMmMtMi43LTMuMi00LjItNy4yLTQuMi0xMS40IDAtOS43IDcuOC0xNy41IDE3LjUtMTcuNXoiXQogICAgfTsKICAgIGZhRWxsaXBzaXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZWxsaXBzaXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiZWxsaXBzaXMtaCJdLCAiZjE0MSIsICJNMCAyNTZhNTYgNTYgMCAxIDEgMTEyIDAgNTYgNTYgMCAxIDEgLTExMiAwem0xNjggMGE1NiA1NiAwIDEgMSAxMTIgMCA1NiA1NiAwIDEgMSAtMTEyIDB6bTIyNC01NmE1NiA1NiAwIDEgMSAwIDExMiA1NiA1NiAwIDEgMSAwLTExMnoiXQogICAgfTsKICAgIGZhRWxsaXBzaXNIID0gZmFFbGxpcHNpczsKICAgIGZhU3RvcmVTbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzdG9yZS1zbGFzaCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlMDcxIiwgIk00MS0yNC45Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMFMtMi4zLS4zIDcgOS4xbDUyOCA1MjhjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC01OC42LTU4LjZjMS4xLTQgMS42LTguMiAxLjYtMTIuNWwwLTE1MS4yYy0xMi41IDQuNi0yNi4xIDcuMi00MC41IDcuMi04LjEgMC0xNS45LS44LTIzLjUtMi40bDAgNjYuNC0zMC4yIDAtMTM3LjUtMTM3LjVjMi45LTMuNiA1LjUtNy40IDcuNi0xMS41IDExLjYgMjIgMzQuNyAzNyA2MS4zIDM3IDI2LjggMCA0OS44LTE1LjEgNjEuNC0zNy4xIDExLjQgMjIuMSAzNC41IDM3LjEgNjAuOCAzNy4xIDQ1LjYgMCA3OC40LTQzLjcgNjUuNi04Ny41TDUxMy44IDcyLjNDNTA2LjggNDguNCA0ODQuOSAzMiA0NjAgMzJMMTE2IDMyYy01LjUgMC0xMC44IC44LTE1LjkgMi4zTDQxLTI0Ljl6TTE1MS41IDIyMS4zTDQ4LjcgMTE4LjYgMzguOSAxNTIuNWMtMTIuOCA0My43IDIwIDg3LjUgNjUuNiA4Ny41IDE4LjEgMCAzNC43LTcuMSA0Ny0xOC43ek00MTAuMiA0ODBsLTEyOC0xMjgtMTU0LjIgMCAwLTY2LjRjLTcuNiAxLjYtMTUuNSAyLjQtMjMuNSAyLjQtMTQuNCAwLTI4LTIuNi00MC41LTcuMkw2NCA0MzJjMCAyNi41IDIxLjUgNDggNDggNDhsMjk4LjIgMHoiXQogICAgfTsKICAgIGZhUGVyY2VudCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJjZW50IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbNjIxMDEsIDYyNzg1LCAicGVyY2VudGFnZSJdLCAiMjUiLCAiTTE5MiAxMjhhOTYgOTYgMCAxIDAgLTE5MiAwIDk2IDk2IDAgMSAwIDE5MiAwek00NDggMzg0YTk2IDk2IDAgMSAwIC0xOTIgMCA5NiA5NiAwIDEgMCAxOTIgMHpNNDM4LjYgODYuNmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMGwtMzg0IDM4NGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMGwzODQtMzg0eiJdCiAgICB9OwogICAgZmFQZXJjZW50YWdlID0gZmFQZXJjZW50OwogICAgZmFGaWxlWmlwcGVyMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLXppcHBlciIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJmaWxlLWFyY2hpdmUiXSwgImYxYzYiLCAiTTAgNjRDMCAyOC43IDI4LjcgMCA2NCAwTDIxMy41IDBjMTcgMCAzMy4zIDYuNyA0NS4zIDE4LjdMMzY1LjMgMTI1LjNjMTIgMTIgMTguNyAyOC4zIDE4LjcgNDUuM0wzODQgNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA2NHptMjA4LTUuNWwwIDkzLjVjMCAxMy4zIDEwLjcgMjQgMjQgMjRMMzI1LjUgMTc2IDIwOCA1OC41ek02NCA3MmMwIDEzLjMgMTAuNyAyNCAyNCAyNGw0OCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0TDg4IDQ4Qzc0LjcgNDggNjQgNTguNyA2NCA3MnptMCA5NmMwIDEzLjMgMTAuNyAyNCAyNCAyNGw0OCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC00OCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHptNjQgNzJsLTMyIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgNDhjMCAyNi41IDIxLjUgNDggNDggNDhzNDgtMjEuNSA0OC00OGwwLTQ4YzAtMTcuNy0xNC4zLTMyLTMyLTMyem0tMTYgNjRhMTYgMTYgMCAxIDEgMCAzMiAxNiAxNiAwIDEgMSAwLTMyeiJdCiAgICB9OwogICAgZmFGaWxlQXJjaGl2ZTIgPSBmYUZpbGVaaXBwZXIyOwogICAgZmFEaXNwbGF5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRpc3BsYXkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTE2MyIsICJNNDQ4IDk2bDAgMjU2LTM4NCAwIDAtMjU2IDM4NCAwek02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgMzUyYzAgMzUuMyAyOC43IDY0IDY0IDY0bDE0NCAwLTE2IDQ4LTcyIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMjcyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTcyIDAtMTYtNDggMTQ0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6Il0KICAgIH07CiAgICBmYUljb25zID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImljb25zIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImhlYXJ0LW11c2ljLWNhbWVyYS1ib2x0Il0sICJmODZkIiwgIk0xNzQuOSAyNzJjMTAuNyAwIDIwLjcgNS4zIDI2LjYgMTQuMmwxMS44IDE3LjggMjYuNyAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMTEyYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDQ4IDUxMmMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCAzNTJjMC0yNi41IDIxLjUtNDggNDgtNDhsMjYuNyAwIDExLjgtMTcuOGM1LjktOC45IDE1LjktMTQuMiAyNi42LTE0LjJsNjEuNyAwem0yNzguNi0xMmM1LjYtNC45IDEzLjktNS4zIDE5LjktLjlzOC4zIDEyLjQgNS4zIDE5LjNMNDQwLjMgMzY4IDQ5NiAzNjhjNi43IDAgMTIuNiA0LjEgMTUgMTAuNHMuNiAxMy4zLTQuNCAxNy43bC0xMjggMTEyYy01LjYgNC45LTEzLjkgNS4zLTE5LjkgLjlzLTguMy0xMi40LTUuMy0xOS4zbDM4LjUtODkuNy01NS44IDBjLTYuNyAwLTEyLjYtNC4xLTE1LTEwLjRzLS42LTEzLjMgNC40LTE3LjdsMTI4LTExMnpNMTQ0IDM2MGE0OCA0OCAwIDEgMCAwIDk2IDQ4IDQ4IDAgMSAwIDAtOTZ6TTQ4My44IC40YzYuNS0xLjEgMTMuMSAuNCAxOC41IDQuNCA2LjEgNC41IDkuNyAxMS43IDkuNyAxOS4ybDAgMTUyLS4zIDQuOWMtMy4zIDI0LjItMzAuNSA0My4xLTYzLjcgNDMuMS0zNS4zIDAtNjQtMjEuNS02NC00OHMyOC43LTQ4IDY0LTQ4YzUuNSAwIDEwLjkgLjYgMTYgMS42bDAtNDkuMy0xMTIgMzMuNiAwIDExMC4yLS4zIDQuOWMtMy4zIDI0LjItMzAuNSA0My4xLTYzLjcgNDMuMS0zNS4zIDAtNjQtMjEuNS02NC00OHMyOC43LTQ4IDY0LTQ4YzUuNSAwIDEwLjkgLjYgMTYgMS42TDMwNCA3MmMwLTEwLjYgNy0yMCAxNy4xLTIzbDE2MC00OCAyLjctLjZ6TTE4OC45IDBDMjI2IDAgMjU2IDMwIDI1NiA2Ny4xbDAgNi4xYzAgNTYuMS03NS4yIDExMi4xLTExMC4zIDEzNS4zLTEwLjggNy4xLTI0LjYgNy4xLTM1LjQgMC0zNS4xLTIzLjEtMTEwLjMtNzkuMi0xMTAuMy0xMzUuM2wwLTYuMUMwIDMwIDMwIDAgNjcuMSAwIDg4LjIgMCAxMDggOS45IDEyMC43IDI2LjhsNy4zIDkuOCA3LjMtOS44QzE0OCA5LjkgMTY3LjggMCAxODguOSAweiJdCiAgICB9OwogICAgZmFIZWFydE11c2ljQ2FtZXJhQm9sdCA9IGZhSWNvbnM7CiAgICBmYVJ1bGVyVmVydGljYWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicnVsZXItdmVydGljYWwiLAogICAgICBpY29uOiBbMjU2LCA1MTIsIFtdLCAiZjU0OCIsICJNMCAxNkMwLTEwLjUgMjEuNS0zMiA0OC0zMmwxNjAgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDI0LTEwNCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDEwNCAwIDAgNDgtNzIgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw3MiAwIDAgNDgtMTA0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTA0IDAgMCA0OC03MiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDcyIDAgMCA0OC0xMDQgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxMDQgMCAwIDI0YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDQ4IDU0NGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCAxNnoiXQogICAgfTsKICAgIGZhTWFwTG9jYXRpb25Eb3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFwLWxvY2F0aW9uLWRvdCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWyJtYXAtbWFya2VkLWFsdCJdLCAiZjVhMCIsICJNNTc2IDQ4YzAtMTEuMS01LjctMjEuNC0xNS4yLTI3LjJzLTIxLjItNi40LTMxLjEtMS40TDQxMy41IDc3LjUgMjM0LjEgMTcuNmMtOC4xLTIuNy0xNi44LTIuMS0yNC40IDEuN2wtMTI4IDY0QzcwLjggODguOCA2NCA5OS45IDY0IDExMmwwIDM1MmMwIDExLjEgNS43IDIxLjQgMTUuMiAyNy4yczIxLjIgNi40IDMxLjEgMS40bDExNi4xLTU4LjEgMTczLjMgNTcuOGMtNC4zLTYuNC04LjUtMTMuMS0xMi42LTE5LjktMTEtMTguMy0yMS45LTM5LjMtMzAtNjEuOGwtMTAxLjItMzMuNyAwLTI4NC41IDEyOCA0Mi43IDAgOTkuM2MzMS0zNS44IDc3LTU4LjQgMTI4LTU4LjQgMjIuNiAwIDQ0LjIgNC40IDY0IDEyLjVMNTc2IDQ4ek01MTIgMjI0Yy02Ni4zIDAtMTIwIDUyLjgtMTIwIDExNy45IDAgNjguOSA2NC4xIDE1MC40IDk4LjYgMTg5LjMgMTEuNiAxMyAzMS4zIDEzIDQyLjkgMCAzNC41LTM4LjkgOTguNi0xMjAuNCA5OC42LTE4OS4zIDAtNjUuMS01My43LTExNy45LTEyMC0xMTcuOXpNNDcyIDM0NGE0MCA0MCAwIDEgMSA4MCAwIDQwIDQwIDAgMSAxIC04MCAweiJdCiAgICB9OwogICAgZmFNYXBNYXJrZWRBbHQgPSBmYU1hcExvY2F0aW9uRG90OwogICAgZmFIZWFydENyYWNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhlYXJ0LWNyYWNrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MTQ4LCAiaGVhcnQtYnJva2VuIl0sICJmN2E5IiwgIk0xMzMuMSAzMmMxNy4zIDAgMzQuMiAzLjQgNDkuOSA5LjdsNTQuOCA4NS4yLTc1LjQgNzUuNGMtMS41IDEuNS0yLjQgMy42LTIuMyA1LjhzMSA0LjIgMi42IDUuN2wxMTIgMTA0YzIuOSAyLjcgNy40IDIuOSAxMC41IC4zczMuOC03IDEuNy0xMC40bC02MC40LTk4LjEgOTAuNy03NS42YzIuNi0yLjEgMy41LTUuNyAyLjQtOC44TDI5Ni40IDYwLjZDMzE5LjYgNDIuMyAzNDguNiAzMiAzNzguOSAzMiA0NTIuNCAzMiA1MTIgOTEuNiA1MTIgMTY1LjFsMCAyLjZjMCAxMTIuMi0xMzkuOSAyNDIuNS0yMTIuOSAyOTguMi0xMi40IDkuNC0yNy42IDE0LjEtNDMuMSAxNC4xcy0zMC44LTQuNi00My4xLTE0LjFDMTM5LjkgNDEwLjIgMCAyNzkuOSAwIDE2Ny43bDAtMi42QzAgOTEuNiA1OS42IDMyIDEzMy4xIDMyeiJdCiAgICB9OwogICAgZmFIZWFydEJyb2tlbiA9IGZhSGVhcnRDcmFjazsKICAgIGZhQ293ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvdyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzEyODAwNF0sICJmNmM4IiwgIk05NiAyMjRsMCAxOTJjMCAxNy43IDE0LjMgMzIgMzIgMzJsMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTg4LjJjOS45IDYuNiAyMC42IDEyIDMyIDE2LjFsMCAyNC4yYzAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZsMC0xNi45YzUuMyAuNiAxMC42IC45IDE2IC45czEwLjctLjMgMTYtLjlsMCAxNi45YzAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZsMC0yNC4yYzExLjQtNCAyMi4xLTkuNCAzMi0xNi4xbDAgODguMmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMTYwIDMyIDMyIDAgNDkuNWMwIDkuNSAyLjggMTguNyA4LjEgMjYuNkw1MzAgNDI3YzguOCAxMy4xIDIzLjUgMjEgMzkuMyAyMSAyMi41IDAgNDEuOS0xNS45IDQ2LjMtMzhsMjAuMy0xMDEuNmMyLjYtMTMtLjMtMjYuNS04LTM3LjNsLTMuOS01LjUgMC04MS42YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTQuNC01Mi45LTc0LjFDNDk2IDg2LjUgNDUyLjQgNjQgNDA1LjkgNjRMMTQ0IDY0Qzc3LjcgNjQgMjQgMTE3LjcgMjQgMTg0bDAgNTRDOS40IDI0OS44IDAgMjY3LjggMCAyODhsMCAxNy42YzAgOCA2LjQgMTQuNCAxNC40IDE0LjQgMzEuOCAwIDU3LjYtMjUuOCA1Ny42LTU3LjZMNzIgMTg0YzAtMjQuMyAxMi4xLTQ1LjggMzAuNS01OC45LTQuMiAxMC44LTYuNSAyMi42LTYuNSAzNC45bDAgNjR6TTU2MCAzMzZhMTYgMTYgMCAxIDEgMzIgMCAxNiAxNiAwIDEgMSAtMzIgMHpNMTY2LjYgMTY2LjZjLTQuMi00LjItNi42LTEwLTYuNi0xNiAwLTEyLjUgMTAuMS0yMi42IDIyLjYtMjIuNmwxNzguNyAwYzEyLjUgMCAyMi42IDEwLjEgMjIuNiAyMi42IDAgNi0yLjQgMTEuOC02LjYgMTZsLTIzLjQgMjMuNEMzMzIuMiAyMTEuOCAzMDIuNyAyMjQgMjcyIDIyNHMtNjAuMi0xMi4yLTgxLjktMzMuOWwtMjMuNC0yMy40eiJdCiAgICB9OwogICAgZmFSc3MgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicnNzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImZlZWQiXSwgImYwOWUiLCAiTTAgNjRjMC0xNy43IDE0LjMtMzIgMzItMzIgMjI5LjggMCA0MTYgMTg2LjIgNDE2IDQxNiAwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMkMzODQgMjUzLjYgMjI2LjQgOTYgMzIgOTYgMTQuMyA5NiAwIDgxLjcgMCA2NHpNMCA0MTZhNjQgNjQgMCAxIDEgMTI4IDAgNjQgNjQgMCAxIDEgLTEyOCAwek0zMiAxNjBjMTU5LjEgMCAyODggMTI4LjkgMjg4IDI4OCAwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmMwLTEyMy43LTEwMC4zLTIyNC0yMjQtMjI0LTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJ6Il0KICAgIH07CiAgICBmYUZlZWQgPSBmYVJzczsKICAgIGZhTWFnbmlmeWluZ0dsYXNzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hZ25pZnlpbmctZ2xhc3MiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgyNjksICJzZWFyY2giXSwgImYwMDIiLCAiTTQxNiAyMDhjMCA0NS45LTE0LjkgODguMy00MCAxMjIuN0w1MDIuNiA0NTcuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMEwzMzAuNyAzNzZDMjk2LjMgNDAxLjEgMjUzLjkgNDE2IDIwOCA0MTYgOTMuMSA0MTYgMCAzMjIuOSAwIDIwOFM5My4xIDAgMjA4IDAgNDE2IDkzLjEgNDE2IDIwOHpNMjA4IDM1MmExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6Il0KICAgIH07CiAgICBmYVNlYXJjaCA9IGZhTWFnbmlmeWluZ0dsYXNzOwogICAgZmFDbG91ZE1vb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2xvdWQtbW9vbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNmMzIiwgIk00ODAgMGMxNC42IDAgMjguOCAxLjYgNDIuNSA0LjcgNy40IDEuNyAxMyA3LjggMTMuOSAxNS40cy0zIDE0LjktOS44IDE4LjNjLTQ1LjQgMjIuNi03Ni42IDY5LjUtNzYuNiAxMjMuNiAwIDc2LjIgNjEuOCAxMzggMTM4IDEzOCAzLjcgMCA3LjQtLjEgMTEuMS0uNCA3LjYtLjYgMTQuNyAzLjYgMTcuOCAxMC42czEuNSAxNS4xLTMuOSAyMC40Yy0yNiAyNS01OS4xIDQyLjctOTUuOSA0OS45LTExLjEtMjUuMy0zMC4yLTQ2LjMtNTQuMS01OS44LTcuNi02My40LTYxLjYtMTEyLjYtMTI3LjEtMTEyLjYtMTEuMiAwLTIyLjEgMS41LTMyLjUgNC4yLTQuOC00LjItOS45LTguMi0xNS4yLTExLjgtLjEtMi44LS4yLTUuNi0uMi04LjQgMC0xMDYgODYtMTkyIDE5Mi0xOTJ6bS0uMSA0MzEuOWMwIDQ0LjItMzUuOCA4MC04MCA4MGwtMjcxLjkgMGMtNTMgMC05Ni00My05Ni05NiAwLTQ3LjYgMzQuNi04NyA4MC05NC42LS40LTUyLjggNDIuOS05Ny4zIDk2LTk3LjMgMzQuOSAwIDY1LjQgMTguNiA4Mi4yIDQ2LjQgMTMtOS4xIDI4LjgtMTQuNCA0NS44LTE0LjQgNDQuMiAwIDgwIDM1LjggODAgODAgMCA1LjktLjYgMTEuNy0xLjkgMTcuMiAzNy40IDYuNyA2NS44IDM5LjQgNjUuOCA3OC43eiJdCiAgICB9OwogICAgZmFCb3hlc1N0YWNrZWQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm94ZXMtc3RhY2tlZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYyNjI1LCAiYm94ZXMiLCAiYm94ZXMtYWx0Il0sICJmNDY4IiwgIk0yMjQgMGwwIDY0YzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTY0IDMyIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAxMjhjMCA1LjUtLjcgMTAuOS0yIDE2bC0yNTIgMGMtMS4zLTUuMS0yLTEwLjUtMi0xNmwwLTEyOGMwLTM1LjMgMjguNy02NCA2NC02NGwzMiAwem05NiA1MTJjLTExLjIgMC0yMS44LTIuOS0zMS04IDkuNS0xNi41IDE1LTM1LjYgMTUtNTZsMC0xMjhjMC0yMC40LTUuNS0zOS41LTE1LTU2IDkuMi01LjEgMTkuNy04IDMxLThsMzIgMCAwIDY0YzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTY0IDMyIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAxMjhjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTEyOCAwek0wIDMyMGMwLTM1LjMgMjguNy02NCA2NC02NGwzMiAwIDAgNjRjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtNjQgMzIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDEyOGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMzIweiJdCiAgICB9OwogICAgZmFCb3hlcyA9IGZhQm94ZXNTdGFja2VkOwogICAgZmFCb3hlc0FsdCA9IGZhQm94ZXNTdGFja2VkOwogICAgZmFDb2RlQnJhbmNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvZGUtYnJhbmNoIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYxMjYiLCAiTTgwIDEwNGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6bTgwLTI0YzAgMzIuOC0xOS43IDYxLTQ4IDczLjNsMCA3MC43IDE3NiAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMjIuN2MtMjguMy0xMi4zLTQ4LTQwLjUtNDgtNzMuMyAwLTQ0LjIgMzUuOC04MCA4MC04MHM4MCAzNS44IDgwIDgwYzAgMzIuOC0xOS43IDYxLTQ4IDczLjNsMCAyMi43YzAgNjEuOS01MC4xIDExMi0xMTIgMTEybC0xNzYgMCAwIDcwLjdjMjguMyAxMi4zIDQ4IDQwLjUgNDggNzMuMyAwIDQ0LjItMzUuOCA4MC04MCA4MFMwIDQ3Ni4yIDAgNDMyYzAtMzIuOCAxOS43LTYxIDQ4LTczLjNsMC0yMDUuM0MxOS43IDE0MSAwIDExMi44IDAgODAgMCAzNS44IDM1LjggMCA4MCAwczgwIDM1LjggODAgODB6bTIzMiAwYTI0IDI0IDAgMSAwIC00OCAwIDI0IDI0IDAgMSAwIDQ4IDB6TTgwIDQ1NmEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6Il0KICAgIH07CiAgICBmYUJhbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYW4iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg2ODMsICJjYW5jZWwiXSwgImYwNWUiLCAiTTM2Ny4yIDQxMi41TDk5LjUgMTQ0LjhjLTIyLjQgMzEuNC0zNS41IDY5LjgtMzUuNSAxMTEuMiAwIDEwNiA4NiAxOTIgMTkyIDE5MiA0MS41IDAgNzkuOS0xMy4xIDExMS4yLTM1LjV6bTQ1LjMtNDUuM2MyMi40LTMxLjQgMzUuNS02OS44IDM1LjUtMTExLjIgMC0xMDYtODYtMTkyLTE5Mi0xOTItNDEuNSAwLTc5LjkgMTMuMS0xMTEuMiAzNS41TDQxMi41IDM2Ny4yek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAweiJdCiAgICB9OwogICAgZmFDYW5jZWwgPSBmYUJhbjsKICAgIGZhSnVnRGV0ZXJnZW50ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImp1Zy1kZXRlcmdlbnQiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZTUxOSIsICJNOTYgMjRjMC0xMy4zIDEwLjctMjQgMjQtMjRsODAgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDI0IDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNEw4OCA5NkM3NC43IDk2IDY0IDg1LjMgNjQgNzJTNzQuNyA0OCA4OCA0OGw4IDAgMC0yNHpNMCAyNTZjMC03MC43IDU3LjMtMTI4IDEyOC0xMjhsMTI4IDBjNzAuNyAwIDEyOCA1Ny4zIDEyOCAxMjhsMCAxOTJjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDI1NnptMjU2IDBsMCA5NmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtOTZjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJ6Il0KICAgIH07CiAgICBmYVJlcGx5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJlcGx5IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjE3MTQsICJtYWlsLXJlcGx5Il0sICJmM2U1IiwgIk0yMDQuMiAxOC40YzEyIDUgMTkuOCAxNi42IDE5LjggMjkuNmwwIDgwIDExMiAwYzk3LjIgMCAxNzYgNzguOCAxNzYgMTc2IDAgMTEzLjMtODEuNSAxNjMuOS0xMDAuMiAxNzQuMS0yLjUgMS40LTUuMyAxLjktOC4xIDEuOS0xMC45IDAtMTkuNy04LjktMTkuNy0xOS43IDAtNy41IDQuMy0xNC40IDkuOC0xOS41IDkuNC04LjggMjIuMi0yNi40IDIyLjItNTYuNyAwLTUzLTQzLTk2LTk2LTk2bC05NiAwIDAgODBjMCAxMi45LTcuOCAyNC42LTE5LjggMjkuNnMtMjUuNyAyLjItMzQuOS02LjlsLTE2MC0xNjBjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zbDE2MC0xNjBjOS4yLTkuMiAyMi45LTExLjkgMzQuOS02Ljl6Il0KICAgIH07CiAgICBmYU1haWxSZXBseSA9IGZhUmVwbHk7CiAgICBmYVN1blBsYW50V2lsdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzdW4tcGxhbnQtd2lsdCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTdhIiwgIk0xNjAgMGMtNS41IDAtMTAuNiAyLjgtMTMuNSA3LjRsLTEuMSAyLjEtMjQuOCA1NS40LTU2LjctMjEuN2MtNS45LTIuMi0xMi41LS44LTE3IDMuN1M0MSA1OCA0My4yIDYzLjlsMjEuNyA1Ni43LTU1LjQgMjQuOEMzLjcgMTQ4IDAgMTUzLjcgMCAxNjBzMy43IDEyIDkuNSAxNC42bDU1LjQgMjQuOC0yMS43IDU2LjdjLTIuMiA1LjktLjggMTIuNSAzLjcgMTdzMTEuMSA1LjkgMTcgMy43bDU2LjctMjEuNyAyNC44IDU1LjRjMi42IDUuOCA4LjMgOS41IDE0LjYgOS41czEyLTMuNyAxNC42LTkuNWwyNC44LTU1LjQgNTYuOCAyMS43YzUuOSAyLjIgMTIuNSAuOCAxNy0zLjdzNS45LTExLjEgMy43LTE3bC0yMS43LTU2LjcgNTUuNC0yNC44YzUuOC0yLjYgOS41LTguMyA5LjUtMTQuNnMtMy43LTEyLTkuNS0xNC42bC01NS40LTI0LjggMjEuNy01Ni43IC43LTIuMmMxLjItNS4zLS40LTEwLjktNC4zLTE0LjhzLTkuNS01LjUtMTQuOC00LjNsLTIuMiAuNy01Ni44IDIxLjctMjQuOC01NS40QzE3MiAzLjcgMTY2LjMgMCAxNjAgMHptMCA5NmE2NCA2NCAwIDEgMSAwIDEyOCA2NCA2NCAwIDEgMSAwLTEyOHptMzIgNjRhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHptMzc2IDE2bDAgNTMuNGMtMTQuOCA3LjctMjQgMjMuMS0yNCA0NC42IDAgMTYuOCAxNiA0NCAzNy40IDY3LjIgNS44IDYuMiAxNS41IDYuMiAyMS4yIDAgMjEuNC0yMy4zIDM3LjQtNTAuNiAzNy40LTY3LjIgMC0yMS41LTkuMi0zNy0yNC00NC42bDAtNTMuNGMwLTQ0LjItMzUuOC04MC04MC04MHMtODAgMzUuOC04MCA4MGwwIDIyLjdjLTkuOC00LjMtMjAuNi02LjctMzItNi43LTQ0LjIgMC04MCAzNS44LTgwIDgwbDAgMjEuNGMtMTQuOCA3LjYtMjQgMjMuMS0yNCA0NC42IDAgMTYuOCAxNiA0NCAzNy40IDY3LjIgNS44IDYuMiAxNS41IDYuMiAyMS4yIDAgMjEuNC0yMy4zIDM3LjQtNTAuNiAzNy40LTY3LjIgMC0yMS41LTkuMi0zNy0yNC00NC42bDAtMjEuNGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMTc2LTQyNCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDU3NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0xMDQgMCAwLTI3MmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMyeiJdCiAgICB9OwogICAgZmFCYWN0ZXJpdW0gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmFjdGVyaXVtIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImUwNWEiLCAiTTQwOCAxNmMwLTEzLjMtMTAuNy0yNC0yNC0yNFMzNjAgMi43IDM2MCAxNmwwIDIzLjRjLTEzLjkgNS4zLTI2LjkgMTMuNS0zOC4yIDI0LjVMMzA1IDQ3Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDE2LjggMTYuOC0zMC4xIDMwLjEtMTYuOC0xNi44Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDE2LjggMTYuOGMtMTAgMTAtMjAgMjAtMzAuMSAzMC4xTDE3NyAxNzVjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwcy05LjQgMjQuNiAwIDMzLjlsMTYuOCAxNi44LTMwLjEgMzAuMS0xNi44LTE2LjhjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwcy05LjQgMjQuNiAwIDMzLjlsMTYuOCAxNi44Yy0xMSAxMS4zLTE5LjIgMjQuMy0yNC41IDM4LjJMNDggMzI4Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDE2LjMgMGMxLjMgMTguMyA3LjEgMzYuNCAxNy40IDUyLjRMNzEgNDM5Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBsMTAuNi0xMC42YzE2IDEwLjMgMzQuMSAxNi4xIDUyLjQgMTcuNGwwIDE2LjNjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTIzLjRjMTMuOS01LjMgMjYuOS0xMy41IDM4LjItMjQuNUwyNzEgNDY1YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtMTYuOC0xNi44IDMwLjEtMzAuMSAxNi44IDE2LjhjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC0xNi44LTE2LjhjMTAtMTAgMjAtMjAgMzAuMS0zMC4xTDM5OSAzMzdjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC0xNi44LTE2LjggMzAuMS0zMC4xIDE2LjggMTYuOGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTE2LjgtMTYuOGMxMS0xMS4zIDE5LjItMjQuMyAyNC41LTM4LjJsMjMuNCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xNi4zIDBjLTEuMy0xOC4zLTcuMS0zNi40LTE3LjQtNTIuNEw1MDUgNzNjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMEw0NjAuNCA0OS43Yy0xNi0xMC4zLTM0LjEtMTYuMS01Mi40LTE3LjRMNDA4IDE2ek0xNjAgMzUyYTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6TTI3MiAyNDBhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFSZWNvcmRWaW55bCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyZWNvcmQtdmlueWwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjhkOSIsICJNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMjU2LTk2YTk2IDk2IDAgMSAxIDAgMTkyIDk2IDk2IDAgMSAxIDAtMTkyem0wIDI0MGExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6bTAtMTEyYTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHoiXQogICAgfTsKICAgIGZhRmxvcHB5RGlzazIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmxvcHB5LWRpc2siLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjgxOTAsIDEyODQyNiwgInNhdmUiXSwgImYwYzciLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNDIuN2MwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0wzNTIgNTAuN0MzNDAgMzguNyAzMjMuNyAzMiAzMDYuNyAzMkw2NCAzMnptMzIgOTZjMC0xNy43IDE0LjMtMzIgMzItMzJsMTYwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMTYwIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjR6TTIyNCAyODhhNjQgNjQgMCAxIDEgMCAxMjggNjQgNjQgMCAxIDEgMC0xMjh6Il0KICAgIH07CiAgICBmYVNhdmUyID0gZmFGbG9wcHlEaXNrMjsKICAgIGZhVG9pbGV0c1BvcnRhYmxlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRvaWxldHMtcG9ydGFibGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTU4NCIsICJNNjQgMGw5NiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMTYtMjI0IDAgMC0xNkMwIDI4LjcgMjguNyAwIDY0IDB6TTAgMTI4bDIyNCAwIDAgMzYwYzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtOC0xMjggMCAwIDhjMCAxMy4zLTEwLjcgMjQtMjQgMjRTMCA1MDEuMyAwIDQ4OEwwIDEyOHpNMTI4IDI0OGwwIDQ4YzAgMTMuMyAxMC43IDI0IDI0IDI0bDI0IDAgMC05Ni0yNCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHpNMzUyIDBsOTYgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDE2LTIyNCAwIDAtMTZjMC0zNS4zIDI4LjctNjQgNjQtNjR6TTI4OCAxMjhsMjI0IDAgMCAzNjBjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC04LTEyOCAwIDAgOGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTM2MHpNNDE2IDI0OGwwIDQ4YzAgMTMuMyAxMC43IDI0IDI0IDI0bDI0IDAgMC05Ni0yNCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHoiXQogICAgfTsKICAgIGZhTyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJvIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTExXSwgIjRmIiwgIk0yMjQgOTZhMTYwIDE2MCAwIDEgMCAwIDMyMCAxNjAgMTYwIDAgMSAwIDAtMzIwek00NDggMjU2YTIyNCAyMjQgMCAxIDEgLTQ0OCAwIDIyNCAyMjQgMCAxIDEgNDQ4IDB6Il0KICAgIH07CiAgICBmYVBhbGV0dGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGFsZXR0ZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyNzkxMl0sICJmNTNmIiwgIk01MTIgMjU2YzAgLjkgMCAxLjggMCAyLjctLjQgMzYuNS0zMy42IDYxLjMtNzAuMSA2MS4zTDM0NCAzMjBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4IDAgMy40IC40IDYuNyAxIDkuOSAyLjEgMTAuMiA2LjUgMjAgMTAuOCAyOS45IDYuMSAxMy44IDEyLjEgMjcuNSAxMi4xIDQyIDAgMzEuOC0yMS42IDYwLjctNTMuNCA2Mi0zLjUgLjEtNyAuMi0xMC42IC4yLTE0MS40IDAtMjU2LTExNC42LTI1Ni0yNTZTMTE0LjYgMCAyNTYgMCA1MTIgMTE0LjYgNTEyIDI1NnpNMTI4IDI4OGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem0wLTk2YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHpNMjg4IDk2YTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6bTk2IDk2YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHoiXQogICAgfTsKICAgIGZhVW5sb2NrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVubG9jayIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyODI3NV0sICJmMDljIiwgIk0xMjggOTZjMC0zNS4zIDI4LjctNjQgNjQtNjQgMzEuNyAwIDU4IDIzIDYzLjEgNTMuMyAyLjkgMTcuNCAxOS40IDI5LjIgMzYuOSAyNi4zczI5LjItMTkuNCAyNi4zLTM2LjlDMzA4LjEgMTQuMSAyNTUuNS0zMiAxOTItMzIgMTIxLjMtMzIgNjQgMjUuMyA2NCA5NmwwIDY0Yy0zNS4zIDAtNjQgMjguNy02NCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTIyNGMwLTM1LjMtMjguNy02NC02NC02NGwtMTkyIDAgMC02NHoiXQogICAgfTsKICAgIGZhRWFyTGlzdGVuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImVhci1saXN0ZW4iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiYXNzaXN0aXZlLWxpc3RlbmluZy1zeXN0ZW1zIl0sICJmMmEyIiwgIk0zNzkuNiAuM2MtOC45IDEuMi0xNy4yIDYuMi0yMi40IDE0LjEtNi44IDEwLjQtNyAyNC4xLS40IDM0LjYgNS42IDguOSAxNS41IDEyLjcgMjMuOCAxOC41IDcuNSA1LjIgMTcuNiAxMy4yIDI3LjcgMjQuMiAyMCAyMS43IDM5LjUgNTQuMyAzOS41IDEwMC4zIDAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJjMC02Ni0yOC41LTExMy40LTU2LjUtMTQzLjctMTMuOS0xNS4xLTI3LjgtMjYuMS0zOC4zLTMzLjMtMTEtNy42LTIzLjUtMTYuNi0zNy42LTE0Ljd6TTI0MCAxMjhjLTU3LjYgMC0xMDUuMSA0My42LTExMS4zIDk5LjUtMS45IDE3LjYtMTcuOCAzMC4yLTM1LjMgMjguM3MtMzAuMi0xNy44LTI4LjMtMzUuM2M5LjctODggODQuMy0xNTYuNSAxNzQuOS0xNTYuNSA5Ny4yIDAgMTc2IDc4LjggMTc2IDE3NiAwIDQ2LTE3LjcgODcuOS00Ni42IDExOS4zLTEyIDEzLTE3LjQgMjQuOC0xNy40IDM0LjdsMCA2LjFjMCA2MS45LTUwLjEgMTEyLTExMiAxMTItMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTYuMWMwLTMyLjkgMTcuNC01OS42IDM0LjQtNzggMTguNC0yMCAyOS42LTQ2LjYgMjkuNi03NS45IDAtNjEuOS01MC4xLTExMi0xMTItMTEyek0wIDQ4MGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0xNjAtOTZhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0ek04Ni42IDM2MS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2w2NCA2NGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zbC02NC02NHpNMjQwIDIwOGMtMTcuNyAwLTMyIDE0LjMtMzIgMzIgMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRjMC00NC4yIDM1LjgtODAgODAtODBzODAgMzUuOCA4MCA4MGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGMwLTE3LjctMTQuMy0zMi0zMi0zMnoiXQogICAgfTsKICAgIGZhQXNzaXN0aXZlTGlzdGVuaW5nU3lzdGVtcyA9IGZhRWFyTGlzdGVuOwogICAgZmFDb2RlUHVsbFJlcXVlc3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY29kZS1wdWxsLXJlcXVlc3QiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTEzYyIsICJNMzI4IDI0YzAtOS43LTUuOC0xOC41LTE0LjgtMjIuMlMyOTMuOSAuMiAyODcgN0wyMzEgNjNjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45bDU2IDU2YzYuOSA2LjkgMTcuMiA4LjkgMjYuMiA1LjJTMzI4IDE0NS43IDMyOCAxMzZsMC0yNCAyNCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMjE0LjdjLTI4LjMgMTIuMy00OCA0MC41LTQ4IDczLjMgMCA0NC4yIDM1LjggODAgODAgODBzODAtMzUuOCA4MC04MGMwLTMyLjgtMTkuNy02MS00OC03My4zTDQ0OCAxNDRjMC01My00My05Ni05Ni05NmwtMjQgMCAwLTI0ek03MiA4MGEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwem01NiA3My4zYzI4LjMtMTIuMyA0OC00MC41IDQ4LTczLjMgMC00NC4yLTM1LjgtODAtODAtODBTMTYgMzUuOCAxNiA4MGMwIDMyLjggMTkuNyA2MSA0OCA3My4zbDAgMjA1LjNjLTI4LjMgMTIuMy00OCA0MC41LTQ4IDczLjMgMCA0NC4yIDM1LjggODAgODAgODBzODAtMzUuOCA4MC04MGMwLTMyLjgtMTkuNy02MS00OC03My4zbDAtMjA1LjN6TTcyIDQzMmEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwem0zNDQtMjRhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4eiJdCiAgICB9OwogICAgZmFLZXkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAia2V5IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MjczXSwgImYwODQiLCAiTTMzNiAzNTJjOTcuMiAwIDE3Ni03OC44IDE3Ni0xNzZTNDMzLjIgMCAzMzYgMCAxNjAgNzguOCAxNjAgMTc2YzAgMTguNyAyLjkgMzYuOCA4LjMgNTMuN0w3IDM5MWMtNC41IDQuNS03IDEwLjYtNyAxN2wwIDgwYzAgMTMuMyAxMC43IDI0IDI0IDI0bDgwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC00MCA0MCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtNDAgNDAgMGM2LjQgMCAxMi41LTIuNSAxNy03bDMzLjMtMzMuM2MxNi45IDUuNCAzNSA4LjMgNTMuNyA4LjN6TTM3NiA5NmE0MCA0MCAwIDEgMSAwIDgwIDQwIDQwIDAgMSAxIDAtODB6Il0KICAgIH07CiAgICBmYVNrdWxsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNrdWxsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MTI4XSwgImY1NGMiLCAiTTQxNiA0MjcuNGM1OC41LTQ0IDk2LTExMS42IDk2LTE4Ny40IDAtMTMyLjUtMTE0LjYtMjQwLTI1Ni0yNDBTMCAxMDcuNSAwIDI0MGMwIDc1LjggMzcuNSAxNDMuNCA5NiAxODcuNEw5NiA0NjRjMCAyNi41IDIxLjUgNDggNDggNDhsMzIgMCAwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA0MCA2NCAwIDAtNDBjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDQwIDMyIDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0zNi42ek05NiAyNTZhNjQgNjQgMCAxIDEgMTI4IDAgNjQgNjQgMCAxIDEgLTEyOCAwem0yNTYtNjRhNjQgNjQgMCAxIDEgMCAxMjggNjQgNjQgMCAxIDEgMC0xMjh6Il0KICAgIH07CiAgICBmYU1hcnNTdHJva2VVcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtYXJzLXN0cm9rZS11cCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzk4OTYsICJtYXJzLXN0cm9rZS12Il0sICJmMjJhIiwgIk0xOTIgMjU2YTExMiAxMTIgMCAxIDAgMCAyMjQgMTEyIDExMiAwIDEgMCAwLTIyNHpNMTYgMzY4YzAtODYuMyA2Mi4xLTE1OC4xIDE0NC4xLTE3My4xLS4xLS45LS4xLTEuOS0uMS0yLjlsMC0xNi0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDMyIDAgMC02MS40LTI4IDIyLjRjLTEzLjggMTEtMzMuOSA4LjgtNDUtNXMtOC44LTMzLjkgNS00NWw4MC02NGMxMS43LTkuMyAyOC4zLTkuMyA0MCAwbDgwIDY0YzEzLjggMTEgMTYgMzEuMiA1IDQ1cy0zMS4yIDE2LTQ1IDVsLTI4LTIyLjQgMCA2MS40IDMyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTMyIDAgMCAxNmMwIDEgMCAxLjktLjEgMi45IDgyIDE1IDE0NC4xIDg2LjggMTQ0LjEgMTczLjEgMCA5Ny4yLTc4LjggMTc2LTE3NiAxNzZTMTYgNDY1LjIgMTYgMzY4eiJdCiAgICB9OwogICAgZmFNYXJzU3Ryb2tlViA9IGZhTWFyc1N0cm9rZVVwOwogICAgZmFGaXJlRmxhbWVTaW1wbGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlyZS1mbGFtZS1zaW1wbGUiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsiYnVybiJdLCAiZjQ2YSIsICJNMzcyLjUgMjU2LjVsLS43LTEuOUMzMzcuOCAxNjAuOCAyODIgNzYuNSAyMDkuMSA4LjVsLTMuMy0zQzIwMi4xIDIgMTk3LjEgMCAxOTIgMHMtMTAuMSAyLTEzLjggNS41bC0zLjMgM0MxMDIgNzYuNSA0Ni4yIDE2MC44IDEyLjIgMjU0LjZsLS43IDEuOUMzLjkgMjc3LjMgMCAyOTkuNCAwIDMyMS42IDAgNDI2LjcgODYuOCA1MTIgMTkyIDUxMnMxOTItODUuMyAxOTItMTkwLjRjMC0yMi4yLTMuOS00NC4yLTExLjUtNjUuMXptLTkwLjggNDkuNWM0LjEgOS4zIDYuMiAxOS40IDYuMiAyOS41IDAgNTMtNDMgOTYuNS05NiA5Ni41cy05Ni00My41LTk2LTk2LjVjMC0xMC4xIDIuMS0yMC4zIDYuMi0yOS41bDEuOS00LjNjMTUuOC0zNS40IDM3LjktNjcuNyA2NS4zLTk1LjFsOC45LTguOWMzLjYtMy42IDguNS01LjYgMTMuNi01LjZzMTAgMiAxMy42IDUuNmw4LjkgOC45YzI3LjQgMjcuNCA0OS42IDU5LjcgNjUuMyA5NS4xbDEuOSA0LjN6Il0KICAgIH07CiAgICBmYUJ1cm4gPSBmYUZpcmVGbGFtZVNpbXBsZTsKICAgIGZhVHJlZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cmVlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI3Nzk0XSwgImYxYmIiLCAiTTIyNC0zMmM3IDAgMTMuNyAzLjEgMTguMyA4LjVsMTM2IDE2MGM2LjEgNy4xIDcuNCAxNy4xIDMuNSAyNS42UzM2OS40IDE3NiAzNjAgMTc2bC0yNC45IDAgNzUuMiA4OC41YzYuMSA3LjEgNy40IDE3LjEgMy41IDI1LjZTNDAxLjQgMzA0IDM5MiAzMDRsLTM4LjUgMCA4OC44IDEwNC41YzYuMSA3LjEgNy40IDE3LjEgMy41IDI1LjZTNDMzLjQgNDQ4IDQyNCA0NDhsLTE2OCAwIDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02NC0xNjggMGMtOS40IDAtMTcuOS01LjQtMjEuOC0xMy45cy0yLjYtMTguNSAzLjUtMjUuNkw5NC41IDMwNCA1NiAzMDRjLTkuNCAwLTE3LjktNS40LTIxLjgtMTMuOXMtMi42LTE4LjUgMy41LTI1LjZMMTEyLjkgMTc2IDg4IDE3NmMtOS40IDAtMTcuOS01LjQtMjEuOC0xMy45cy0yLjYtMTguNSAzLjUtMjUuNmwxMzYtMTYwQzIxMC4zLTI4LjkgMjE3LTMyIDIyNC0zMnoiXQogICAgfTsKICAgIGZhU21vZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzbW9nIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY3NWYiLCAiTTE3NiAyODhDOTYuNSAyODggMzIgMjIzLjUgMzIgMTQ0Uzk2LjUgMCAxNzYgMGMyNy4yIDAgNTIuNiA3LjUgNzQuMyAyMC42IDIwLjEtMTMgNDQtMjAuNiA2OS43LTIwLjYgNDcuNCAwIDg4LjcgMjUuNyAxMTAuOSA2NGwxLjEgMGM2MS45IDAgMTEyIDUwLjEgMTEyIDExMiAwIDYwLjMtNDcuNiAxMDkuNC0xMDcuMiAxMTEuOS0yMi42IDIwLTUyLjMgMzIuMS04NC44IDMyLjEtMzIuNSAwLTYyLjEtMTIuMS04NC43LTMyTDE3NiAyODh6TTUxMiAzOTJjMCAxMy4zLTEwLjcgMjQtMjQgMjRMMjQgNDE2Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDQ2NCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0ek04OCA0NjRsODAgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtODAgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHptMTc2IDBsMjg4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTI4OCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFTID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInMiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFsxMTVdLCAiNTMiLCAiTTAgMTU3LjVDMCA4OC4yIDU2LjIgMzIgMTI1LjUgMzJMMjcyIDMyYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDEyNS41IDk2Yy0zNCAwLTYxLjUgMjcuNS02MS41IDYxLjUgMCAzMSAyMy4xIDU3LjIgNTMuOSA2MUwyMTAuMSAyMzBDMjcyLjkgMjM3LjkgMzIwIDI5MS4yIDMyMCAzNTQuNSAzMjAgNDIzLjggMjYzLjggNDgwIDE5NC41IDQ4MEw0OCA0ODBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMTQ2LjUgMGMzNCAwIDYxLjUtMjcuNSA2MS41LTYxLjUgMC0zMS0yMy4xLTU3LjItNTMuOS02MUwxMDkuOSAyODJDNDcuMSAyNzQuMSAwIDIyMC44IDAgMTU3LjV6Il0KICAgIH07CiAgICBmYUplZGkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiamVkaSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNjY5IiwgIk0yNDYgMzE1LjdsLTIxLjItMzEuOWMtMi4xLTMuMi0xLjctNy40IDEtMTAuMXM2LjktMy4xIDEwLjEtMWwyOS41IDE5LjdjMi4xIDEuNCA0LjktLjEgNS0yLjZMMjc5LjcgOGMuMS00LjUgMy44LTggOC4zLThzOC4xIDMuNSA4LjMgOGw5LjQgMjgxLjljLjEgMi41IDIuOSAzLjkgNSAyLjZsMjkuNS0xOS43YzMuMi0yLjEgNy40LTEuNyAxMC4xIDFzMy4xIDYuOSAxIDEwLjFMMzMwIDMxNS43Yy0xLjMgMS45LS4yIDQuNSAyIDQuOWwzNy42IDcuNWMzLjcgLjcgNi40IDQgNi40IDcuOHMtMi43IDcuMS02LjQgNy44TDMzMiAzNTEuNGMtMi4yIC40LTMuMyAzLTIgNC45bDIxLjIgMzEuOWMyLjEgMy4yIDEuNyA3LjQtMSAxMC4xcy02LjkgMy4xLTEwLjEgMWwtMjYuMy0xNy42Yy0yLjItMS40LTUuMSAuMi01IDIuOGwyLjEgNjEuNWM1OS44LTEwLjggMTA1LjEtNjMuMSAxMDUuMS0xMjYgMC0zNy0xNS43LTcwLjQtNDAuOC05My43LTctNi41LTYuNS0xOC42IDEtMjQuNCAzNC0yNi4zIDU1LjgtNjcuNSA1NS44LTExMy45IDAtMTYuOC0yLjktMzMtOC4yLTQ4LTQuNi0xMyAxMC4yLTMwIDIxLjQtMjIgNTMuNSAzOCA5Mi43IDk0LjggMTA3LjggMTYwLjcgLjUgMi4xLS4yIDQuMy0xLjcgNS45bC0yOC40IDI4LjRjLTQgNC0xLjIgMTAuOSA0LjUgMTAuOWwyNiAwYzMuNCAwIDYuMiAyLjYgNi4zIDYgLjEgMy4zIC4yIDYuNiAuMiAxMCAwIDE3LjUtMS43IDM0LjctNC44IDUxLjMtLjIgMS4yLS45IDIuNC0xLjcgMy4zbC00Ni41IDQ2LjVjLTQgNC0xLjIgMTAuOSA0LjUgMTAuOWwxNC42IDBjNC42IDAgNy43IDQuOCA1LjcgOS00NC41IDg5LjUtMTM2LjkgMTUxLTI0My43IDE1MVM4OC44IDQ1MC41IDQ0LjMgMzYxYy0yLjEtNC4yIDEtOSA1LjctOWwxNC42IDBjNS43IDAgOC42LTYuOSA0LjUtMTAuOUwyMi42IDI5NC42Yy0uOS0uOS0xLjUtMi0xLjctMy4zLTMuMi0xNi42LTQuOC0zMy44LTQuOC01MS4zIDAtMy4zIC4xLTYuNyAuMi0xMCAuMS0zLjQgMi45LTYgNi4zLTZsMjYgMGM1LjcgMCA4LjYtNi45IDQuNS0xMC45TDI0LjYgMTg0LjZjLTEuNS0xLjUtMi4yLTMuOC0xLjctNS45IDE1LjItNjYgNTQuMy0xMjIuOCAxMDcuOC0xNjAuNyAxMS4zLTggMjYgOC45IDIxLjQgMjItNS4zIDE1LTguMiAzMS4yLTguMiA0OCAwIDQ2LjMgMjEuOSA4Ny41IDU1LjggMTEzLjkgNy41IDUuOCA4IDE3LjkgMSAyNC40LTI1LjEgMjMuNC00MC44IDU2LjctNDAuOCA5My43IDAgNjIuOSA0NS40IDExNS4yIDEwNS4xIDEyNmwyLjEtNjEuNWMuMS0yLjYtMi44LTQuMi01LTIuOGwtMjYuMyAxNy42Yy0zLjIgMi4xLTcuNCAxLjctMTAuMS0xcy0zLjEtNi45LTEtMTAuMUwyNDYgMzU2LjNjMS4zLTEuOSAuMi00LjUtMi00LjlsLTM3LjYtNy41Yy0zLjctLjctNi40LTQtNi40LTcuOHMyLjctNy4xIDYuNC03LjhsMzcuNi03LjVjMi4yLS40IDMuMy0zIDItNC45eiJdCiAgICB9OwogICAgZmFQZXJzb25IaWtpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLWhpa2luZyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJoaWtpbmciXSwgImY2ZWMiLCAiTTE5Mi0zMmE1NiA1NiAwIDEgMSAwIDExMiA1NiA1NiAwIDEgMSAwLTExMnpNMTI4IDE3My42YzAtMzQgMjcuNi02MS42IDYxLjYtNjEuNiAyMC4zIDAgMzkuNyA4LjEgNTQgMjIuNGw0OC4yIDQ4LjJjNiA2IDE0LjEgOS40IDIyLjYgOS40bDM3LjUgMGM1LjggMCAxMS4zIDEuNiAxNiA0LjNsMC03Ni4zYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA0MDBjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0yNjguM2MtNC43IDIuNy0xMC4yIDQuMy0xNiA0LjNsLTM3LjUgMGMtMjUuNSAwLTQ5LjktMTAuMS02Ny45LTI4LjFsLTYuNi02LjYgMCAxMDkuMiAzNC41IDI5LjZjMTcuNyAxNS4yIDI5LjMgMzYuMiAzMi42IDU5LjNsMTIuNiA4OC4xYzIuNSAxNy41LTkuNyAzMy43LTI3LjIgMzYuMnMtMzMuNy05LjctMzYuMi0yNy4ybC0xMi42LTg4LjFjLTEuMS03LjctNS0xNC43LTEwLjktMTkuOGwtNzEuNC02MS4yYy0yMS4zLTE4LjItMzMuNS00NC45LTMzLjUtNzIuOWwwLTEwMXptLTQuOCAyMDMuN2MyLjMgMi4zIDQuNyA0LjQgNy4xIDYuNWw0NC45IDM4LjVjLTMuNiA4LjQtOC41IDE2LjMtMTQuNCAyMy40TDg4LjYgNTMyLjVjLTExLjMgMTMuNi0zMS41IDE1LjQtNDUuMSA0LjFzLTE1LjQtMzEuNS00LjEtNDUuMWw3Mi4zLTg2LjdjMi42LTMuMSA0LjUtNi42IDUuOC0xMC40bDUuNy0xNy4xek0wIDE2MGMwLTM1LjMgMjguNy02NCA2NC02NCAxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDEyOGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMzIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC05NnoiXQogICAgfTsKICAgIGZhSGlraW5nID0gZmFQZXJzb25IaWtpbmc7CiAgICBmYUFycm93c1VwVG9MaW5lID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93cy11cC10by1saW5lIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU0YzIiLCAiTTMyIDBDMTQuMyAwIDAgMTQuMyAwIDMyUzE0LjMgNjQgMzIgNjRsMzg0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJTNDMzLjcgMCA0MTYgMEwzMiAwem04Ni42IDEzNy40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMGwtNjQgNjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBMNjQgMjM3LjMgNjQgNDgwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yNDIuNyA5LjQgOS40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTY0LTY0em0yNTYgMGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTY0IDY0Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwbDkuNC05LjQgMCAyNDIuN2MwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjQyLjcgOS40IDkuNGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zbC02NC02NHoiXQogICAgfTsKICAgIGZhTWFyc0RvdWJsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtYXJzLWRvdWJsZSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzk4OTFdLCAiZjIyNyIsICJNMjg4IDMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyTDQ0OCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTI4YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNTAuNy05NSA5NWMxOS41IDI4LjQgMzEgNjIuNyAzMSA5OS44IDAgOTcuMi03OC44IDE3Ni0xNzYgMTc2UzAgNDAxLjIgMCAzMDQgNzguOCAxMjggMTc2IDEyOGMzNyAwIDcxLjQgMTEuNCA5OS44IDMxbDk1LTk1LTUwLjcgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6TTE3NiA0MTZhMTEyIDExMiAwIDEgMCAwLTIyNCAxMTIgMTEyIDAgMSAwIDAgMjI0em0xNjAgNjRjLTYuOCAwLTEzLjQtLjQtMjAtMS4xIDIzLjYtMTguOSA0My4zLTQyLjUgNTcuNi02OS40IDQzLjMtMTUuNSA3NC40LTU2LjkgNzQuNC0xMDUuNSAwLTI1LjItOC4zLTQ4LjUtMjIuNC02Ny4yIDcuMSAyLjEgMTQuNiAzLjIgMjIuNCAzLjIgMTcgMCAzMi43LTUuMyA0NS43LTE0LjMgMTEuNyAyMy42IDE4LjMgNTAuMiAxOC4zIDc4LjMgMCA5Ny4yLTc4LjggMTc2LTE3NiAxNzZ6TTUyOCAxNTcuM0w1MjggMzJjMC0xMS40LTIuNC0yMi4yLTYuNy0zMkw2MDggMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDEyOGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTUwLjctNDggNDh6Il0KICAgIH07CiAgICBmYVRoZXJtb21ldGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRoZXJtb21ldGVyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0OTEiLCAiTTk2IDM4Mi4xbDAtODguOGMwLTE0LjkgNS45LTI5LjEgMTYuNC0zOS42bDIxLjctMjEuNyA0MSA0MWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTQxLTQxIDQ2LjEtNDYuMSA0MSA0MWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTQxLTQxIDQ2LjEtNDYuMSA0MSA0MWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTQxLTQxIDcuOC03LjhjMTkuNC0xOS40IDQ1LjYtMzAuMiA3My0zMC4yIDU3IDAgMTAzLjIgNDYuMiAxMDMuMiAxMDMuMiAwIDI3LjQtMTAuOSA1My42LTMwLjIgNzNMMjU4LjMgMzk5LjZjLTEwLjUgMTAuNS0yNC43IDE2LjQtMzkuNiAxNi40bC04OC44IDAtODkgODljLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwUy0yLjMgNDgwLjQgNyA0NzFsODktODl6Il0KICAgIH07CiAgICBmYVBhaW50YnJ1c2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGFpbnRicnVzaCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyODM5NiwgInBhaW50LWJydXNoIl0sICJmMWZjIiwgIk00ODAuNSAxMC4zTDI1OS4xIDE1OGMtMjkuMSAxOS40LTQ3LjYgNTAuOS01MC42IDg1LjMgNjIuMyAxMi44IDExMS40IDYxLjkgMTI0LjMgMTI0LjMgMzQuNS0zIDY1LjktMjEuNSA4NS4zLTUwLjZMNTY1LjcgOTUuNWM2LjctMTAuMSAxMC4zLTIxLjkgMTAuMy0zNC4xIDAtMzMuOS0yNy41LTYxLjQtNjEuNC02MS40LTEyLjEgMC0yNCAzLjYtMzQuMSAxMC4zek0yODggNDAwYzAtNjEuOS01MC4xLTExMi0xMTItMTEyUzY0IDMzOC4xIDY0IDQwMGMwIDMuOSAuMiA3LjggLjYgMTEuNiAxLjggMTcuNS0xMC4yIDM2LjQtMjcuOCAzNi40TDMyIDQ0OGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwxNDQgMGM2MS45IDAgMTEyLTUwLjEgMTEyLTExMnoiXQogICAgfTsKICAgIGZhUGFpbnRCcnVzaCA9IGZhUGFpbnRicnVzaDsKICAgIGZhTmV1dGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm5ldXRlciIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzk5MDZdLCAiZjIyYyIsICJNODAgMTc2YTExMiAxMTIgMCAxIDEgMjI0IDAgMTEyIDExMiAwIDEgMSAtMjI0IDB6TTIyMy45IDM0OS4xQzMwNS45IDMzNC4xIDM2OCAyNjIuMyAzNjggMTc2IDM2OCA3OC44IDI4OS4yIDAgMTkyIDBTMTYgNzguOCAxNiAxNzZjMCA4Ni4zIDYyLjEgMTU4LjEgMTQ0LjEgMTczLjEtLjEgMS0uMSAxLjktLjEgMi45bDAgMTYwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xNjBjMC0xIDAtMS45LS4xLTIuOXoiXQogICAgfTsKICAgIGZhU3F1YXJlUGhvbmVGbGlwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1waG9uZS1mbGlwIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInBob25lLXNxdWFyZS1hbHQiXSwgImY4N2IiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6bTIzMiA5Ni43bDIuOCAuOGMzMi4zIDguOCA1OS45IDQwLjEgNTEuOCA3OC4yLTE4LjUgODcuNS04Ny40IDE1Ni4zLTE3NC45IDE3NC45LTM4LjEgOC4xLTY5LjQtMTkuNS03OC4yLTUxLjhsLS44LTIuOGMtMi43LTkuOCAyLjQtMjAuMSAxMS44LTI0bDQ4LjctMjAuM2M4LjMtMy40IDE3LjgtMS4xIDIzLjUgNS45bDE5LjMgMjMuNmMzNS4xLTE3LjQgNjMuNC00Ni42IDc5LjYtODIuNGwtMjIuMS0xOGMtNi45LTUuNy05LjMtMTUuMi01LjktMjMuNWwyMC4zLTQ4LjdjMy45LTkuNCAxNC4yLTE0LjQgMjQtMTEuOHoiXQogICAgfTsKICAgIGZhUGhvbmVTcXVhcmVBbHQgPSBmYVNxdWFyZVBob25lRmxpcDsKICAgIGZhRmFjZUdyaW5Ub25ndWVTcXVpbnQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi10b25ndWUtc3F1aW50IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTQxLCAiZ3Jpbi10b25ndWUtc3F1aW50Il0sICJmNThhIiwgIk0wIDI1NmMwIDEwNC40IDYyLjUgMTk0LjIgMTUyLjIgMjM0LjEtNS4zLTEzLTguMi0yNy4yLTguMi00Mi4xbDAtNjEuN2MtMTYuOS0xNi41LTMwLjEtMzYuNy0zOC4zLTU5LjMtNC4zLTExLjggNy43LTIxLjggMTkuNi0xOC4xIDM5LjIgMTIuMiA4My43IDE5LjEgMTMwLjcgMTkuMXM5MS41LTYuOSAxMzAuNy0xOS4xYzExLjktMy43IDIzLjkgNi4zIDE5LjYgMTguMS04LjMgMjIuNi0yMS41IDQyLjgtMzguMyA1OS4zbDAgNjEuN2MwIDE0LjktMi45IDI5LjEtOC4yIDQyLjEgODkuNy0zOS44IDE1Mi4yLTEyOS42IDE1Mi4yLTIzNC4xIDAtMTQxLjQtMTE0LjYtMjU2LTI1Ni0yNTZTMCAxMTQuNiAwIDI1NnptMTI1LjgtOTEuN2MtNi4yLTUuMi03LjYtMTQuMy0zLjEtMjEuMXMxMy4zLTkuMiAyMC42LTUuNWw3OS42IDQwYzUuNCAyLjcgOC44IDguMiA4LjggMTQuM3MtMy40IDExLjYtOC44IDE0LjNsLTc5LjYgNDBjLTcuMyAzLjYtMTYuMSAxLjMtMjAuNi01LjVzLTMuMS0xNS45IDMuMS0yMS4xTDE1OSAxOTIgMTI1LjggMTY0LjN6bTI2My42LTIxLjFjNC41IDYuOCAzLjEgMTUuOS0zLjEgMjEuMUwzNTMgMTkyIDM4Ni4yIDIxOS43YzYuMiA1LjIgNy42IDE0LjMgMy4xIDIxLjFzLTEzLjMgOS4yLTIwLjYgNS41bC03OS42LTQwYy01LjQtMi43LTguOC04LjItOC44LTE0LjNzMy40LTExLjYgOC44LTE0LjNsNzkuNi00MGM3LjMtMy42IDE2LjEtMS4zIDIwLjYgNS41ek0zMjAgNDQ4bDAtNDUuNGMwLTE0LjctMTEuOS0yNi42LTI2LjYtMjYuNmwtMiAwYy0xMS4zIDAtMjEuMSA3LjktMjMuNiAxOC45LTIuOCAxMi42LTIwLjggMTIuNi0yMy42IDAtMi41LTExLjEtMTIuMy0xOC45LTIzLjYtMTguOWwtMiAwYy0xNC43IDAtMjYuNiAxMS45LTI2LjYgMjYuNmwwIDQ1LjRjMCAzNS4zIDI4LjcgNjQgNjQgNjRzNjQtMjguNyA2NC02NHoiXQogICAgfTsKICAgIGZhR3JpblRvbmd1ZVNxdWludDIgPSBmYUZhY2VHcmluVG9uZ3VlU3F1aW50MjsKICAgIGZhQ29tbWVudERvbGxhciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjb21tZW50LWRvbGxhciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNjUxIiwgIk0yNTYgNDgwYzE0MS40IDAgMjU2LTEwNy41IDI1Ni0yNDBTMzk3LjQgMCAyNTYgMCAwIDEwNy41IDAgMjQwYzAgNTQuMyAxOS4yIDEwNC4zIDUxLjYgMTQ0LjVMMi44IDQ3Ni44Yy00LjggOS0zLjMgMjAgMy42IDI3LjVzMTcuOCA5LjggMjcuMSA1LjhsMTE4LjQtNTAuN0MxODMuNyA0NzIuNiAyMTguOSA0ODAgMjU2IDQ4MHptNC0zNTJjMTEgMCAyMCA5IDIwIDIwbDAgNCA4IDBjMTEgMCAyMCA5IDIwIDIwcy05IDIwLTIwIDIwbC00Ny41IDBjLTYuOSAwLTEyLjUgNS42LTEyLjUgMTIuNSAwIDYuMSA0LjQgMTEuMyAxMC40IDEyLjNsNDEuNyA3YzI1LjMgNC4yIDQzLjkgMjYuMSA0My45IDUxLjggMCAyNi4xLTE5IDQ3LjctNDQgNTEuOGwwIDQuN2MwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC00LTI0IDBjLTExIDAtMjAtOS0yMC0yMHM5LTIwIDIwLTIwbDU1LjUgMGM2LjkgMCAxMi41LTUuNiAxMi41LTEyLjUgMC02LjEtNC40LTExLjMtMTAuNC0xMi4zbC00MS43LTdjLTI1LjMtNC4yLTQzLjktMjYuMS00My45LTUxLjggMC0yOC44IDIzLjItNTIuMiA1Mi01Mi41bDAtNGMwLTExIDktMjAgMjAtMjB6Il0KICAgIH07CiAgICBmYUhpcHBvID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhpcHBvIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI5NDM1XSwgImY2ZWQiLCAiTTQwNyA0N2M5LjQtOS40IDI0LjYtOS40IDMzLjkgMGwxNy4yIDE3LjJjMS45LS4xIDMuOS0uMiA1LjgtLjJsMzIgMGMxMS4yIDAgMjEuOSAyLjMgMzEuNiA2LjVMNTQzIDU1YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOUw1NjQgMTAxLjljNy42IDEyLjIgMTIgMjYuNyAxMiA0Mi4xIDAgMTAuMiA3LjQgMTguOCAxNi43IDIzIDI3LjkgMTIuNSA0Ny4zIDQwLjUgNDcuMyA3MyAwIDI2LjItMTIuNiA0OS40LTMyIDY0bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0xNi02NCAwIDAgMTZjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0xNy42Yy0xMS44LTIuNC0yMi43LTcuNC0zMi0xNC40LTEuNS0xLjEtMi45LTIuMy00LjMtMy41LTE3LTE0LjctMjcuNy0zNi40LTI3LjctNjAuNSAwLTguOC03LjItMTYtMTYtMTZzLTE2IDcuMi0xNiAxNmMwIDQ0LjcgMjYuMiA4My4yIDY0IDEwMS4ybDAgMTAuOGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMiAwIDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNzZjLTE5LjggNy43LTQxLjQgMTItNjQgMTJzLTQ0LjItNC4zLTY0LTEybDAgNzZjMCAxNy43LTE0LjMgMzItMzIgMzJsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTE4LjktMTguMSA0MC43Yy01LjQgMTIuMS0xOS42IDE3LjYtMzEuNyAxMi4yUy0zLjMgMzYyLjQgMi4xIDM1MC4zTDI0IDMwMC45YzUuMy0xMS45IDgtMjQuNyA4LTM3LjcgMC0xMDcuNSA4NS4yLTE5NS4yIDE5MS44LTE5OS4xbC4yLS4xIDY0IDBjNDEuNyAwIDgzLjQgMTIuMSAxMTcuMiAyNS43IDEuNy0xLjggMy41LTMuNiA1LjMtNS4yTDQwNyA4MWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjl6bTczIDE4NWEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAwem04OCAyNGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6TTQ4MCAxNDRhMTYgMTYgMCAxIDAgLTMyIDAgMTYgMTYgMCAxIDAgMzIgMHptNDggMTZhMTYgMTYgMCAxIDAgMC0zMiAxNiAxNiAwIDEgMCAwIDMyeiJdCiAgICB9OwogICAgZmFCb3dsRm9vZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib3dsLWZvb2QiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTRjNiIsICJNMCAxNzZjMC0zNS4zIDI4LjctNjQgNjQtNjQgLjUgMCAxLjEgMCAxLjYgMCA3LjQtMzYuNSAzOS43LTY0IDc4LjQtNjQgMTUgMCAyOSA0LjEgNDAuOSAxMS4yIDEzLjMtMjUuNyA0MC4xLTQzLjIgNzEuMS00My4yczU3LjggMTcuNiA3MS4xIDQzLjJjMTItNy4xIDI2LTExLjIgNDAuOS0xMS4yIDM4LjcgMCA3MSAyNy41IDc4LjQgNjQgLjUgMCAxLjEgMCAxLjYgMCAzNS4zIDAgNjQgMjguNyA2NCA2NCAwIDExLjctMy4xIDIyLjYtOC42IDMyTDguNiAyMDhDMy4xIDE5OC42IDAgMTg3LjcgMCAxNzZ6TTAgMjgzLjRDMCAyNjguMyAxMi4zIDI1NiAyNy40IDI1Nmw0NTcuMSAwYzE1LjEgMCAyNy40IDEyLjMgMjcuNCAyNy40IDAgNzAuNS00NC40IDEzMC43LTEwNi43IDE1NC4xTDQwMy41IDQ1MmMtMiAxNi0xNS42IDI4LTMxLjggMjhsLTIzMS41IDBjLTE2LjEgMC0yOS44LTEyLTMxLjgtMjhsLTEuOC0xNC40QzQ0LjQgNDE0LjEgMCAzNTMuOSAwIDI4My40eiJdCiAgICB9OwogICAgZmFTcXVhcmVWaXJ1cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtdmlydXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTU3OCIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnptMTYwIDgwYzEzLjMgMCAyNCAxMC43IDI0IDI0IDAgMjIuOSAyNy43IDM0LjQgNDMuOSAxOC4yIDkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOWMtMTYuMiAxNi4yLTQuNyA0My45IDE4LjIgNDMuOSAxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGMtMjIuOSAwLTM0LjQgMjcuNy0xOC4yIDQzLjkgOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGMtMTYuMi0xNi4yLTQzLjktNC43LTQzLjkgMTguMiAwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGMwLTIyLjktMjcuNy0zNC40LTQzLjktMTguMi05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45YzE2LjItMTYuMiA0LjctNDMuOS0xOC4yLTQzLjktMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGMyMi45IDAgMzQuNC0yNy43IDE4LjItNDMuOS05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBjMTYuMiAxNi4yIDQzLjkgNC43IDQzLjktMTguMiAwLTEzLjMgMTAuNy0yNCAyNC0yNHpNMTkyIDI0OGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6bTg4IDQwYTI0IDI0IDAgMSAwIC00OCAwIDI0IDI0IDAgMSAwIDQ4IDB6Il0KICAgIH07CiAgICBmYUNsb3VkU3VuUmFpbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjbG91ZC1zdW4tcmFpbiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyNzc4Ml0sICJmNzQzIiwgIk0zMDMuMi0zLjJjLTEuMS01LjItNC42LTkuNS05LjUtMTEuNnMtMTAuNS0xLjUtMTQuOSAxLjRMMjA4IDMzLjYgMTM3LjMtMTMuM2MtNC40LTIuOS0xMC0zLjUtMTQuOS0xLjRzLTguNSA2LjQtOS41IDExLjZMOTYgODAgMTIuOCA5Ni44Yy01LjIgMS4xLTkuNSA0LjYtMTEuNiA5LjVzLTEuNSAxMC41IDEuNCAxNC45TDQ5LjYgMTkyIDIuNyAyNjIuN2MtMi45IDQuNC0zLjUgMTAtMS40IDE0LjlzNi40IDguNSAxMS42IDkuNUw5NiAzMDQgMTEyLjggMzg3LjJjMS4xIDUuMiA0LjYgOS41IDkuNSAxMS42czEwLjUgMS41IDE0LjktMS40bDY3LjMtNDQuNmMtMTUuOC0xOS40LTI2LTQzLjUtMjguMi02OS45LTM3LjUtMTMuMS02NC40LTQ4LjctNjQuNC05MC43IDAtNTMgNDMtOTYgOTYtOTYgMjEuNyAwIDQxLjggNy4yIDU3LjggMTkuNCAxNS41LTE3LjYgMzYuOS0zMCA2MS4xLTM0TDMyMCA4MCAzMDMuMi0zLjJ6TTI0MyAxNTkuMWMtOC44LTkuMy0yMS4yLTE1LjEtMzUtMTUuMS0yNi41IDAtNDggMjEuNS00OCA0OCAwIDE3IDguOSAzMiAyMi4yIDQwLjUgMTAuMi0zMS40IDMyLjEtNTcuNCA2MC43LTczbC4xLS40ek0zMDQgMzUybDE5MiAwYzQ0LjIgMCA4MC0zNS44IDgwLTgwIDAtMzMuOS0yMS4xLTYyLjktNTAuOS03NC41IDEuOS02LjggMi45LTE0IDIuOS0yMS41IDAtNDQuMi0zNS44LTgwLTgwLTgwLTMwLjggMC01Ny41IDE3LjQtNzAuOSA0Mi44LTkuMy02LjgtMjAuNy0xMC44LTMzLjEtMTAuOC0zMC45IDAtNTYgMjUuMS01NiA1NiAwIDMuMiAuMyA2LjQgLjggOS40LTM2LjkgNy4xLTY0LjggMzkuNi02NC44IDc4LjYgMCA0NC4yIDM1LjggODAgODAgODB6bS0xOSA0OS4xYy0xMi42LTQuMi0yNi4yIDIuNi0zMC40IDE1LjJsLTIxLjQgNjQuMWMtNC4yIDEyLjYgMi42IDI2LjIgMTUuMiAzMC40czI2LjItMi42IDMwLjQtMTUuMmwyMS40LTY0LjFjNC4yLTEyLjYtMi42LTI2LjItMTUuMi0zMC40em0xMjAgMGMtMTIuNi00LjItMjYuMiAyLjYtMzAuNCAxNS4ybC0yMS40IDY0LjFjLTQuMiAxMi42IDIuNiAyNi4yIDE1LjIgMzAuNHMyNi4yLTIuNiAzMC40LTE1LjJsMjEuNC02NC4xYzQuMi0xMi42LTIuNi0yNi4yLTE1LjItMzAuNHptMTIwIDBjLTEyLjYtNC4yLTI2LjIgMi42LTMwLjQgMTUuMmwtMjEuNCA2NC4xYy00LjIgMTIuNiAyLjYgMjYuMiAxNS4yIDMwLjRzMjYuMi0yLjYgMzAuNC0xNS4ybDIxLjQtNjQuMWM0LjItMTIuNi0yLjYtMjYuMi0xNS4yLTMwLjR6Il0KICAgIH07CiAgICBmYUFycm93UmlnaHRMb25nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXJpZ2h0LWxvbmciLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsibG9uZy1hcnJvdy1yaWdodCJdLCAiZjE3OCIsICJNNTY2LjYgMjc4LjZjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNsLTEyOC0xMjhjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zTDQ2Ni43IDIyNCAzMiAyMjRjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNDM0LjcgMC03My40IDczLjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBsMTI4LTEyOHoiXQogICAgfTsKICAgIGZhTG9uZ0Fycm93UmlnaHQgPSBmYUFycm93UmlnaHRMb25nOwogICAgZmFCdWlsZGluZ1VuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJ1aWxkaW5nLXVuIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU0ZDkiLCAiTTMyIDY0QzMyIDI4LjcgNjAuNyAwIDk2IDBMMzUyIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyNzItMTEyIDBjLTIwLjkgMC0zOS41IDEwLjEtNTEuMiAyNS42LTgtNi0xOC05LjYtMjguOC05LjYtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCA2NCA2NCAwIDAgNDgtMTQ0IDBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDMyIDY0ek0xNDQgOTZjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHptMTEyIDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6TTE0NCAyMjRjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHptMTEyIDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6TTQyNy40IDM4MC41YzktMi4xIDE4LjMgMi4yIDIyLjUgMTAuNWwyNi4xIDUyLjIgMC00My4zYzAtMTEgOS0yMCAyMC0yMHMyMCA5IDIwIDIwbDAgMTI4YzAgOS4zLTYuNCAxNy4zLTE1LjQgMTkuNXMtMTguMy0yLjItMjIuNS0xMC41TDQ1MiA0ODQuNyA0NTIgNTI4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLTEyOGMwLTkuMyA2LjQtMTcuMyAxNS40LTE5LjV6TTMyNCA0MDBsMCA5NmMwIDYuNiA1LjQgMTIgMTIgMTJzMTItNS40IDEyLTEybDAtOTZjMC0xMSA5LTIwIDIwLTIwczIwIDkgMjAgMjBsMCA5NmMwIDI4LjctMjMuMyA1Mi01MiA1MnMtNTItMjMuMy01Mi01MmwwLTk2YzAtMTEgOS0yMCAyMC0yMHMyMCA5IDIwIDIweiJdCiAgICB9OwogICAgZmFUZW1wZXJhdHVyZUxvdyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0ZW1wZXJhdHVyZS1sb3ciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjc2YiIsICJNOTYgOTZjMC01MyA0My05NiA5Ni05NnM5NiA0MyA5NiA5NmwwIDE2NC43YzI5LjUgMjYuNCA0OCA2NC43IDQ4IDEwNy4zIDAgNzkuNS02NC41IDE0NC0xNDQgMTQ0UzQ4IDQ0Ny41IDQ4IDM2OGMwLTQyLjYgMTguNS04MSA0OC0xMDcuM0w5NiA5NnptOTYgMzM2YzM1LjMgMCA2NC0yOC43IDY0LTY0IDAtMjYuOS0xNi41LTQ5LjktNDAtNTkuM2wwLTI4LjdjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAyOC43Yy0yMy41IDkuNS00MCAzMi41LTQwIDU5LjMgMCAzNS4zIDI4LjcgNjQgNjQgNjR6TTQ2NCA4MGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwek0zNTIgODBhODAgODAgMCAxIDEgMTYwIDAgODAgODAgMCAxIDEgLTE2MCAweiJdCiAgICB9OwogICAgZmFEb29yT3BlbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkb29yLW9wZW4iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjUyYiIsICJNMjg4IDY0bDY0IDAgMCA0MTZjMCAxNy43IDE0LjMgMzIgMzIgMzJsMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwwLTM4NGMwLTM1LjMtMjguNy02NC02NC02NGwtOTYgMCAwIDAtMTYwIDBDNjAuNyAwIDMyIDI4LjcgMzIgNjRsMCAzODRjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMjI0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC00MTZ6TTE2MCAyNTZhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHoiXQogICAgfTsKICAgIGZhQWxpZ25MZWZ0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFsaWduLWxlZnQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjAzNiIsICJNMjg4IDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMyTDMyIDk2QzE0LjMgOTYgMCA4MS43IDAgNjRTMTQuMyAzMiAzMiAzMmwyMjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnptMCAyNTZjMCAxNy43LTE0LjMgMzItMzIgMzJMMzIgMzUyYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDIyNCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMyek0wIDE5MmMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzODQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiAyMjRjLTE3LjcgMC0zMi0xNC4zLTMyLTMyek00NDggNDQ4YzAgMTcuNy0xNC4zIDMyLTMyIDMyTDMyIDQ4MGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwzODQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnoiXQogICAgfTsKICAgIGZhQ2FtZXJhMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYW1lcmEiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MjI1OCwgImNhbWVyYS1hbHQiXSwgImYwMzAiLCAiTTE0OS4xIDY0LjhMMTM4LjcgOTYgNjQgOTZDMjguNyA5NiAwIDEyNC43IDAgMTYwTDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0bC03NC43IDAtMTAuNC0zMS4yQzM1Ni40IDQ1LjIgMzM4LjEgMzIgMzE3LjQgMzJMMTk0LjYgMzJjLTIwLjcgMC0zOSAxMy4yLTQ1LjUgMzIuOHpNMjU2IDE5MmE5NiA5NiAwIDEgMSAwIDE5MiA5NiA5NiAwIDEgMSAwLTE5MnoiXQogICAgfTsKICAgIGZhQ2FtZXJhQWx0MiA9IGZhQ2FtZXJhMjsKICAgIGZhVXNlcnNSYXlzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXJzLXJheXMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU5MyIsICJNMzEtMzNDMjEuNy0yMy42IDIxLjctOC40IDMxIDFMODcgNTdjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45TDY1LTMzYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHpNNjA5LTMzYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMEw1MTkgMjNjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMEw2MDkgMWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXpNNjUgNTQ1bDU2LTU2YzkuNC05LjQgOS40LTI0LjYgMC0zMy45cy0yNC42LTkuNC0zMy45IDBMMzEgNTExYy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDB6bTU0NCAwYzkuNC05LjQgOS40LTI0LjYgMC0zMy45bC01Ni01NmMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWw1NiA1NmM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHpNMzIwIDIwOGE2NCA2NCAwIDEgMCAwLTEyOCA2NCA2NCAwIDEgMCAwIDEyOHptMCAzMmMtNjEuOSAwLTExMiA1MC4xLTExMiAxMTJsMCA4YzAgMTMuMyAxMC43IDI0IDI0IDI0bDE3NiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtOGMwLTYxLjktNTAuMS0xMTItMTEyLTExMnptMjE2LTgwYTU2IDU2IDAgMSAwIC0xMTIgMCA1NiA1NiAwIDEgMCAxMTIgMHpNNDUxLjIgMjYwLjRDNDY5LjQgMjg2LjMgNDgwIDMxNy45IDQ4MCAzNTJsMCA4YzAgOC40LTEuNCAxNi41LTQuMSAyNGw3OC44IDBjMTEuOCAwIDIxLjMtOS42IDIxLjMtMjEuM2wwLTEwLjdjMC01My00My05Ni05Ni05Ni0xMCAwLTE5LjcgMS41LTI4LjggNC40em0tMjYyLjQgMGMtOS4xLTIuOS0xOC44LTQuNC0yOC44LTQuNC01MyAwLTk2IDQzLTk2IDk2bDAgMTAuN2MwIDExLjggOS42IDIxLjMgMjEuMyAyMS4zbDc4LjggMGMtMi43LTcuNS00LjEtMTUuNi00LjEtMjRsMC04YzAtMzQuMSAxMC42LTY1LjcgMjguOC05MS42ek0yMTYgMTYwYTU2IDU2IDAgMSAwIC0xMTIgMCA1NiA1NiAwIDEgMCAxMTIgMHoiXQogICAgfTsKICAgIGZhUmFpbmJvdyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyYWluYm93IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI3NzUyXSwgImY3NWIiLCAiTTMyMCA5NkMxNzguNiA5NiA2NCAyMTAuNiA2NCAzNTJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMlMwIDQzMy43IDAgNDE2bDAtNjRDMCAxNzUuMyAxNDMuMyAzMiAzMjAgMzJTNjQwIDE3NS4zIDY0MCAzNTJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY0QzU3NiAyMTAuNiA0NjEuNCA5NiAzMjAgOTZ6bTAgMTEyYy03OS41IDAtMTQ0IDY0LjUtMTQ0IDE0NGwwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNjRjMC0xMTQuOSA5My4xLTIwOCAyMDgtMjA4czIwOCA5My4xIDIwOCAyMDhsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY0YzAtNzkuNS02NC41LTE0NC0xNDQtMTQ0ek0yODggMzUybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02NGMwLTUzIDQzLTk2IDk2LTk2czk2IDQzIDk2IDk2bDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMnoiXQogICAgfTsKICAgIGZhU2l0ZW1hcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaXRlbWFwIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYwZTgiLCAiTTE5MiA2NGMwLTE3LjcgMTQuMy0zMiAzMi0zMmw2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTggMCAwIDY0IDEyMCAwYzM5LjggMCA3MiAzMi4yIDcyIDcybDAgNTYgOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJsOCAwIDAtNTZjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTEyMCAwIDAgODAgOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJsOCAwIDAtODAtMTIwIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgNTYgOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJsOCAwIDAtNTZjMC0zOS44IDMyLjItNzIgNzItNzJsMTIwIDAgMC02NC04IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjR6Il0KICAgIH07CiAgICBmYUZhY2VHcmluU3RhcnMyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi1zdGFycyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyOTMyMSwgImdyaW4tc3RhcnMiXSwgImY1ODciLCAiTTI1NiA1MTJjMTQxLjQgMCAyNTYtMTE0LjYgMjU2LTI1NiAwLTI0LjQtMy40LTQ4LjEtOS44LTcwLjUgMTguNi0zNi4xLTIuNy04My42LTQ2LjctOTAtNDYuOS01OC4zLTExOC45LTk1LjUtMTk5LjUtOTUuNVMxMDMuNCAzNy4zIDU2LjUgOTUuNWMtNDQgNi40LTY1LjMgNTMuOS00Ni43IDkwLTYuNCAyMi40LTkuOCA0Ni05LjggNzAuNSAwIDE0MS40IDExNC42IDI1NiAyNTYgMjU2ek0zODYuNyAzMjQuOWMxMS45LTMuNyAyMy45IDYuMyAxOS42IDE4LjEtMjIuNCA2MS4zLTgxLjMgMTA1LjEtMTUwLjMgMTA1LjFTMTI4LjEgNDA0LjIgMTA1LjcgMzQyLjljLTQuMy0xMS44IDcuNy0yMS44IDE5LjYtMTguMSAzOS4yIDEyLjIgODMuNyAxOS4xIDEzMC43IDE5LjFzOTEuNS02LjkgMTMwLjctMTkuMXptLTMxLjYtMjMxYzUuMy0xMC43IDIwLjUtMTAuNyAyNS44IDBsMjAuOSA0Mi40IDQ2LjcgNi44YzExLjggMS43IDE2LjUgMTYuMiA4IDI0LjVsLTMzLjggMzMgOCA0Ni42YzIgMTEuNy0xMC4zIDIwLjctMjAuOSAxNS4ybC00MS44LTIyLTQxLjggMjJjLTEwLjUgNS41LTIyLjktMy40LTIwLjktMTUuMmw4LTQ2LjYtMzMuOC0zM2MtOC41LTguMy0zLjgtMjIuOCA4LTI0LjVsNDYuNy02LjggMjAuOS00Mi40em0tMTk4LjIgMGwyMC45IDQyLjQgNDYuNyA2LjhjMTEuOCAxLjcgMTYuNSAxNi4yIDggMjQuNWwtMzMuOCAzMyA4IDQ2LjZjMiAxMS43LTEwLjMgMjAuNy0yMC45IDE1LjJsLTQxLjgtMjItNDEuOCAyMmMtMTAuNSA1LjUtMjIuOS0zLjQtMjAuOS0xNS4ybDgtNDYuNi0zMy44LTMzYy04LjUtOC4zLTMuOC0yMi44IDgtMjQuNWw0Ni43LTYuOCAyMC45LTQyLjRjNS4zLTEwLjcgMjAuNS0xMC43IDI1LjggMHoiXQogICAgfTsKICAgIGZhR3JpblN0YXJzMiA9IGZhRmFjZUdyaW5TdGFyczI7CiAgICBmYVNvcnRVcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzb3J0LXVwIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbInNvcnQtYXNjIl0sICJmMGRlIiwgIk0zMiAyMjRjLTEyLjkgMC0yNC42LTcuOC0yOS42LTE5LjhTLjIgMTc4LjUgOS40IDE2OS40bDE2MC0xNjBjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBsMTYwIDE2MGM5LjIgOS4yIDExLjkgMjIuOSA2LjkgMzQuOVMzNjQuOSAyMjQgMzUyIDIyNEwzMiAyMjR6Il0KICAgIH07CiAgICBmYVNvcnRBc2MgPSBmYVNvcnRVcDsKICAgIGZhRXllMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJleWUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgwNjVdLCAiZjA2ZSIsICJNMjg4IDMyYy04MC44IDAtMTQ1LjUgMzYuOC0xOTIuNiA4MC42LTQ2LjggNDMuNS03OC4xIDk1LjQtOTMgMTMxLjEtMy4zIDcuOS0zLjMgMTYuNyAwIDI0LjYgMTQuOSAzNS43IDQ2LjIgODcuNyA5MyAxMzEuMSA0Ny4xIDQzLjcgMTExLjggODAuNiAxOTIuNiA4MC42czE0NS41LTM2LjggMTkyLjYtODAuNmM0Ni44LTQzLjUgNzguMS05NS40IDkzLTEzMS4xIDMuMy03LjkgMy4zLTE2LjcgMC0yNC42LTE0LjktMzUuNy00Ni4yLTg3LjctOTMtMTMxLjEtNDcuMS00My43LTExMS44LTgwLjYtMTkyLjYtODAuNnpNMTQ0IDI1NmExNDQgMTQ0IDAgMSAxIDI4OCAwIDE0NCAxNDQgMCAxIDEgLTI4OCAwem0xNDQtNjRjMCAzNS4zLTI4LjcgNjQtNjQgNjQtMTEuNSAwLTIyLjMtMy0zMS43LTguNC0xIDEwLjktLjEgMjIuMSAyLjkgMzMuMiAxMy43IDUxLjIgNjYuNCA4MS42IDExNy42IDY3LjlzODEuNi02Ni40IDY3LjktMTE3LjZjLTEyLjItNDUuNy01NS41LTc0LjgtMTAxLjEtNzAuOCA1LjMgOS4zIDguNCAyMC4xIDguNCAzMS43eiJdCiAgICB9OwogICAgZmFDYXJldExlZnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FyZXQtbGVmdCIsCiAgICAgIGljb246IFsyNTYsIDUxMiwgW10sICJmMGQ5IiwgIk03LjcgMjM1LjhjLTEwLjMgMTIuNi05LjUgMzEuMSAyLjIgNDIuOGwxMjggMTI4YzkuMiA5LjIgMjIuOSAxMS45IDM0LjkgNi45czE5LjgtMTYuNiAxOS44LTI5LjZsMC0yNTZjMC0xMi45LTcuOC0yNC42LTE5LjgtMjkuNnMtMjUuNy0yLjItMzQuOSA2LjlsLTEyOCAxMjgtMi4yIDIuNHoiXQogICAgfTsKICAgIGZhQXBwbGVXaG9sZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcHBsZS13aG9sZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyNzgyMiwgMTI3ODIzLCAiYXBwbGUtYWx0Il0sICJmNWQxIiwgIk0yMjQgMTEyYy04LjggMC0xNi03LjItMTYtMTZsMC0xNmMwLTQ0LjIgMzUuOC04MCA4MC04MGwxNiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDE2YzAgNDQuMi0zNS44IDgwLTgwIDgwbC0xNiAwek0wIDI4OGMwLTc2LjMgMzUuNy0xNjAgMTEyLTE2MCAyNy4zIDAgNTkuNyAxMC4zIDgyLjcgMTkuMyAxOC44IDcuMyAzOS45IDcuMyA1OC43IDAgMjIuOS04LjkgNTUuNC0xOS4zIDgyLjctMTkuMyA3Ni4zIDAgMTEyIDgzLjcgMTEyIDE2MCAwIDEyOC04MCAyMjQtMTYwIDIyNC0xNi41IDAtMzguMS02LjYtNTEuNS0xMS4zLTguMS0yLjgtMTYuOS0yLjgtMjUgMC0xMy40IDQuNy0zNSAxMS4zLTUxLjUgMTEuMy04MCAwLTE2MC05Ni0xNjAtMjI0eiJdCiAgICB9OwogICAgZmFBcHBsZUFsdCA9IGZhQXBwbGVXaG9sZTsKICAgIGZhU2Nyb2xsVG9yYWggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2Nyb2xsLXRvcmFoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInRvcmFoIl0sICJmNmEwIiwgIk0wIDQ4QzAgMjEuNSAyMS41IDAgNDggMCA2OC45IDAgODYuNyAxMy40IDkzLjMgMzJsMzg5LjUgMGM2LjYtMTguNiAyNC40LTMyIDQ1LjMtMzIgMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA0MTZjMCAyNi41LTIxLjUgNDgtNDggNDgtMjAuOSAwLTM4LjctMTMuNC00NS4zLTMyTDkzLjMgNDgwYy02LjYgMTguNi0yNC40IDMyLTQ1LjMgMzItMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCA0OHpNMTc3LjkgMzAxYy0xLjIgMi0xLjkgNC4yLTEuOSA2LjYgMCA2LjkgNS42IDEyLjUgMTIuNSAxMi41bDU2LjkgMCAzMC41IDQ5LjJjMi42IDQuMiA3LjIgNi44IDEyLjIgNi44czkuNi0yLjYgMTIuMi02LjhsMzAuNS00OS4yIDU2LjkgMGM2LjkgMCAxMi41LTUuNiAxMi41LTEyLjUgMC0yLjMtLjYtNC42LTEuOS02LjZsLTI3LjgtNDUgMjcuOC00NWMxLjItMiAxLjktNC4yIDEuOS02LjYgMC02LjktNS42LTEyLjUtMTIuNS0xMi41bC01Ni45IDAtMzAuNS00OS4yYy0yLjYtNC4yLTcuMi02LjgtMTIuMi02LjhzLTkuNiAyLjYtMTIuMiA2LjhsLTMwLjUgNDkuMi01Ni45IDBjLTYuOSAwLTEyLjUgNS42LTEyLjUgMTIuNSAwIDIuMyAuNiA0LjYgMS45IDYuNmwyNy44IDQ1LTI3LjggNDV6Il0KICAgIH07CiAgICBmYVRvcmFoID0gZmFTY3JvbGxUb3JhaDsKICAgIGZhSG91c2VMb2NrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLWxvY2siLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTUxMCIsICJNNTI4IDIyNC4xYzQ0LjIgMCA4MCAzNS44IDgwIDgwbDAgNTAuNmMxOC42IDYuNiAzMiAyNC40IDMyIDQ1LjNsMCA5NmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTI4IDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtOTZjMC0yMC45IDEzLjQtMzguNyAzMi00NS4zbDAtNTAuNmMwLTQ0LjIgMzUuOC04MCA4MC04MHpNMjY4LjYgNi41YzEyLjItOS4zIDI5LjctOC43IDQxLjIgMmwxODUgMTcxLjhDNDQwLjIgMTk1IDQwMCAyNDQuOCA0MDAgMzA0bDAgMjQuNGMtMTkuNiAxNy42LTMyIDQzLjEtMzIgNzEuNWwwIDk2YzAgNS41IC41IDEwLjkgMS4zIDE2LjFMMTQ0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0xNzYtMTYgMGMtMTMuMiAwLTI1LTguMS0yOS44LTIwLjNzLTEuNi0yNi4yIDgtMzUuMWwyMjQtMjA4IDIuNC0yek0yNzIgMzIwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDk2IDk2IDAgMC04Ny4zYzAtMTYuNSA3LTMxLjUgMTguNC00Mi4xLTguNy05LTIwLjktMTQuNi0zNC40LTE0LjZsLTMyIDB6bTI1Ni00Ny45Yy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDQ3LjkgNjQgMCAwLTQ3LjljMC0xNy43LTE0LjMtMzItMzItMzJ6Il0KICAgIH07CiAgICBmYUFycm93c0xlZnRSaWdodFRvTGluZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvd3MtbGVmdC1yaWdodC10by1saW5lIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU0YmEiLCAiTTMyIDk2QzE0LjMgOTYgMCAxMTAuMyAwIDEyOEwwIDM4NGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjU2YzAtMTcuNy0xNC4zLTMyLTMyLTMyek0zOTAuNiAzNDIuNmw2NC02NGMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM2wtNjQtNjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zbDkuNCA5LjQtMTMzLjUgMCA5LjQtOS40YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwbC02NCA2NGMtNiA2LTkuNCAxNC4xLTkuNCAyMi42czMuNCAxNi42IDkuNCAyMi42bDY0IDY0YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTkuNC05LjQgMTMzLjUgMC05LjQgOS40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwek01NzYgMTI4YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMjU2YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yNTZ6Il0KICAgIH07CiAgICBmYVRyYXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRyYXNoIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYxZjgiLCAiTTEzNi43IDUuOUwxMjggMzIgMzIgMzJDMTQuMyAzMiAwIDQ2LjMgMCA2NFMxNC4zIDk2IDMyIDk2bDM4NCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC05NiAwLTguNy0yNi4xQzMwNi45LTcuMiAyOTQuNy0xNiAyODAuOS0xNkwxNjcuMS0xNmMtMTMuOCAwLTI2IDguOC0zMC40IDIxLjl6TTQxNiAxNDRMMzIgMTQ0IDUzLjEgNDY3LjFDNTQuNyA0OTIuNCA3NS43IDUxMiAxMDEgNTEyTDM0NyA1MTJjMjUuMyAwIDQ2LjMtMTkuNiA0Ny45LTQ0LjlMNDE2IDE0NHoiXQogICAgfTsKICAgIGZhRmFjZVNhZFRlYXIyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2Utc2FkLXRlYXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1NDYsICJzYWQtdGVhciJdLCAiZjViNCIsICJNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMjcxIDk4YzUuNS0xLjMgMTEuMS0yIDE3LTIgMjQuMSAwIDQ1LjQgMTEuOCA1OC41IDMwIDcuNyAxMC44IDIyLjcgMTMuMiAzMy41IDUuNXMxMy4yLTIyLjcgNS41LTMzLjVjLTIxLjctMzAuMi01Ny4zLTUwLTk3LjUtNTAtMTIuNSAwLTI0LjYgMS45LTM1LjkgNS41IDkuOCAxMi43IDE2LjUgMjcuOSAxOC45IDQ0LjZ6TTE3NiAyNDBhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0em0xOTItMzJhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHpNMTg1LjQgMjkyLjhjLTIuNC0yLjktNS43LTQuOC05LjQtNC44cy03IDEuOS05LjQgNC44Yy02LjUgNy44LTEyLjYgMTYuMS0xOC4zIDI0LjYtOSAxMy40LTIwLjMgMzAuMi0yMC4zIDQ3LjQgMCAyOC4zIDIxLjUgNTEuMiA0OCA1MS4yczQ4LTIyLjkgNDgtNTEuMmMwLTE3LjItMTEuMi0zNC0yMC4zLTQ3LjQtNS43LTguNS0xMS45LTE2LjctMTguMy0yNC42eiJdCiAgICB9OwogICAgZmFTYWRUZWFyMiA9IGZhRmFjZVNhZFRlYXIyOwogICAgZmFGYXggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmF4IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MjI0LCAxMjg0MzldLCAiZjFhYyIsICJNMTYwIDY0bDAgODAgNjQgMCAwLTgwIDE0Ni43IDAgNDUuMyA0NS4zIDAgMzQuNyA2NCAwIDAtMzQuN2MwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0w0MTYgMTguN0M0MDQgNi43IDM4Ny43IDAgMzcwLjcgMEwyMjQgMGMtMzUuMyAwLTY0IDI4LjctNjQgNjR6TTMyIDEyOGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJMMCA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJsNDggMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTI4OGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtNDggMHptNDQ4IDY0bC0zMjAgMCAwIDI1NmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwyODggMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTIyNGMwLTE3LjctMTQuMy0zMi0zMi0zMnpNMjI0IDI4OGEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwem0wIDk2YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6TTMzNiAyNjRhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4ek0zMTIgMzg0YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6TTQyNCAyNjRhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4ek00MDAgMzg0YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6Il0KICAgIH07CiAgICBmYVBlcnNvbkNpcmNsZVBsdXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLWNpcmNsZS1wbHVzIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NDEiLCAiTTI4MCAyNGE1NiA1NiAwIDEgMCAtMTEyIDAgNTYgNTYgMCAxIDAgMTEyIDB6bTI0IDIxMi43TDM0MSAyODYuNmMxMi44LTE3LjUgMjguNS0zMi43IDQ2LjMtNDVsLTU2LjItNzUuN0MzMDYgMTMyIDI2Ni4zIDExMiAyMjQgMTEycy04MiAyMC0xMDcuMiA1My45bC03MC41IDk1Yy0xMC41IDE0LjItNy42IDM0LjIgNi42IDQ0LjhzMzQuMiA3LjYgNDQuOC02LjZMMTQ0IDIzNi43IDE0NCA1MTJjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE2MGMwLTguOCA3LjItMTYgMTYtMTZzMTYgNy4yIDE2IDE2bDAgMTYwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yNzUuM3pNNDk2IDU0NGExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6bTE2LTIwOGwwIDQ4IDQ4IDBjOC44IDAgMTYgNy4yIDE2IDE2cy03LjIgMTYtMTYgMTZsLTQ4IDAgMCA0OGMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTQ4LTQ4IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsNDggMCAwLTQ4YzAtOC44IDcuMi0xNiAxNi0xNnMxNiA3LjIgMTYgMTZ6Il0KICAgIH07CiAgICBmYUhhbXNhID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbXNhIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY2NjUiLCAiTTM0LjYgMjg4TDgwIDI4OGM4LjggMCAxNi03LjIgMTYtMTZMOTYgNzJjMC0yMi4xIDE3LjktNDAgNDAtNDBzNDAgMTcuOSA0MCA0MGwwIDEzMmMwIDExIDkgMjAgMjAgMjBzMjAtOSAyMC0yMGwwLTE2NGMwLTIyLjEgMTcuOS00MCA0MC00MHM0MCAxNy45IDQwIDQwbDAgMTY0YzAgMTEgOSAyMCAyMCAyMHMyMC05IDIwLTIwbDAtMTMyYzAtMjIuMSAxNy45LTQwIDQwLTQwczQwIDE3LjkgNDAgNDBsMCAyMDBjMCA4LjggNy4yIDE2IDE2IDE2bDQ1LjQgMGMxOS4xIDAgMzQuNiAxNS41IDM0LjYgMzQuNiAwIDguNi0zLjIgMTYuOS05IDIzLjNMNDE2LjYgNDQxYy00MS4xIDQ1LjItOTkuNCA3MS0xNjAuNiA3MVMxMzYuNiA0ODYuMiA5NS40IDQ0MUw5IDM0NS45Yy01LjgtNi40LTktMTQuNy05LTIzLjMgMC0xOS4xIDE1LjUtMzQuNiAzNC42LTM0LjZ6TTI1NiAyODhjLTM4LjQgMC03Ni44IDM1LjgtOTAuNiA1MC4yLTMuNiAzLjctNS40IDguNy01LjQgMTMuOHMxLjggMTAuMSA1LjQgMTMuOEMxNzkuMiAzODAuMiAyMTcuNiA0MTYgMjU2IDQxNnM3Ni44LTM1LjggOTAuNi01MC4yYzMuNi0zLjcgNS40LTguNyA1LjQtMTMuOHMtMS44LTEwLjEtNS40LTEzLjhDMzMyLjggMzIzLjggMjk0LjQgMjg4IDI1NiAyODh6bTAgMzJhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFQZXJzb25DaXJjbGVRdWVzdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tY2lyY2xlLXF1ZXN0aW9uIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NDIiLCAiTTI4MCAyNGE1NiA1NiAwIDEgMCAtMTEyIDAgNTYgNTYgMCAxIDAgMTEyIDB6bTI0IDIxMi43TDM0MSAyODYuNmMxMi44LTE3LjUgMjguNS0zMi43IDQ2LjMtNDVsLTU2LjItNzUuN0MzMDYgMTMyIDI2Ni4zIDExMiAyMjQgMTEycy04MiAyMC0xMDcuMiA1My45bC03MC41IDk1Yy0xMC41IDE0LjItNy42IDM0LjIgNi42IDQ0LjhzMzQuMiA3LjYgNDQuOC02LjZMMTQ0IDIzNi43IDE0NCA1MTJjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE2MGMwLTguOCA3LjItMTYgMTYtMTZzMTYgNy4yIDE2IDE2bDAgMTYwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yNzUuM3pNNDk2IDU0NGExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6bTAtMTAwYTIwIDIwIDAgMSAxIDAgNDAgMjAgMjAgMCAxIDEgMC00MHptMC0xMDBjLTExLjYgMC0yMS4zIDguMi0yMy41IDE5LjItMS44IDguNy0xMC4yIDE0LjMtMTguOSAxMi41cy0xNC4zLTEwLjItMTIuNS0xOC45YzUuMi0yNS42IDI3LjgtNDQuOCA1NC45LTQ0LjggMzAuOSAwIDU2IDI1LjEgNTYgNTYgMCAxOS44LTExLjcgMzcuOC0yOS44IDQ1LjlsLTEwLjQgNC42Yy0xLjIgNy43LTcuOCAxMy41LTE1LjggMTMuNS04LjggMC0xNi03LjItMTYtMTYgMC0xMS4yIDYuNi0yMS4zIDE2LjgtMjUuOWwxMi40LTUuNWM2LjYtMi45IDEwLjgtOS40IDEwLjgtMTYuNiAwLTEzLjMtMTAuNy0yNC0yNC0yNHoiXQogICAgfTsKICAgIGZhQ2xpcGJvYXJkQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2xpcGJvYXJkLWNoZWNrIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY0NmMiLCAiTTI1NiAwYzIzLjcgMCA0NC40IDEyLjkgNTUuNCAzMmw4LjYgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDM1MmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsOC42IDBDODMuNiAxMi45IDEwNC4zIDAgMTI4IDBMMjU2IDB6bTI2LjkgMjEyLjZjLTEwLjctNy44LTI1LjctNS40LTMzLjUgNS4zbC04NS42IDExNy43LTI2LjUtMjcuNGMtOS4yLTkuNS0yNC40LTkuOC0zMy45LS42cy05LjggMjQuNC0uNiAzMy45bDQ2LjQgNDhjNC45IDUuMSAxMS44IDcuOCAxOC45IDcuM3MxMy42LTQuMSAxNy44LTkuOEwyODguMiAyNDYuMWM3LjgtMTAuNyA1LjQtMjUuNy01LjMtMzMuNXpNMTM2IDY0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDExMiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0TDEzNiA2NHoiXQogICAgfTsKICAgIGZhU2hhcmVGcm9tU3F1YXJlMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaGFyZS1mcm9tLXNxdWFyZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzYxNTA5LCAic2hhcmUtc3F1YXJlIl0sICJmMTRkIiwgIk0zODQuNSAyNGwwIDcyLTY0IDBjLTc5LjUgMC0xNDQgNjQuNS0xNDQgMTQ0IDAgOTMuNCA4Mi44IDEzNC44IDEwMC42IDE0Mi42IDIuMiAxIDQuNiAxLjQgNy4xIDEuNGwyLjUgMGM5LjggMCAxNy44LTggMTcuOC0xNy44IDAtOC4zLTUuOS0xNS41LTEyLjgtMjAuMy04LjktNi4yLTE5LjItMTguMi0xOS4yLTQwLjUgMC00NSAzNi41LTgxLjUgODEuNS04MS41bDMwLjUgMCAwIDcyYzAgOS43IDUuOCAxOC41IDE0LjggMjIuMnMxOS4zIDEuNyAyNi4yLTUuMmwxMzYtMTM2YzkuNC05LjQgOS40LTI0LjYgMC0zMy45TDQyNS41IDdjLTYuOS02LjktMTcuMi04LjktMjYuMi01LjJTMzg0LjUgMTQuMyAzODQuNSAyNHptLTI3MiA3MmMtNDQuMiAwLTgwIDM1LjgtODAgODBsMCAyNTZjMCA0NC4yIDM1LjggODAgODAgODBsMjU2IDBjNDQuMiAwIDgwLTM1LjggODAtODBsMC0zMmMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMjU2IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTI1NmMwLTguOCA3LjItMTYgMTYtMTZsMTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTYgMHoiXQogICAgfTsKICAgIGZhU2hhcmVTcXVhcmUyID0gZmFTaGFyZUZyb21TcXVhcmUyOwogICAgZmFSZWNlaXB0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJlY2VpcHQiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjk1MzRdLCAiZjU0MyIsICJNMTQgMi4yQzIyLjUtMS43IDMyLjUtLjMgMzkuNiA1LjhMODAgNDAuNCAxMjAuNCA1LjhjOS03LjcgMjIuMy03LjcgMzEuMiAwTDE5MiA0MC40IDIzMi40IDUuOGM5LTcuNyAyMi4yLTcuNyAzMS4yIDBMMzA0IDQwLjQgMzQ0LjQgNS44YzcuMS02LjEgMTcuMS03LjUgMjUuNi0zLjZTMzg0IDE0LjYgMzg0IDI0bDAgNDY0YzAgOS40LTUuNSAxNy45LTE0IDIxLjhzLTE4LjUgMi41LTI1LjYtMy42bC00MC40LTM0LjYtNDAuNCAzNC42Yy05IDcuNy0yMi4yIDcuNy0zMS4yIDBsLTQwLjQtMzQuNi00MC40IDM0LjZjLTkgNy43LTIyLjMgNy43LTMxLjIgMEw4MCA0NzEuNiAzOS42IDUwNi4yYy03LjEgNi4xLTE3LjEgNy41LTI1LjYgMy42UzAgNDk3LjQgMCA0ODhMMCAyNEMwIDE0LjYgNS41IDYuMSAxNCAyLjJ6TTEwNCAxMzZjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTc2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE3NiAwek04MCAzNTJjMCAxMy4zIDEwLjcgMjQgMjQgMjRsMTc2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE3NiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHptMjQtMTIwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDE3NiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xNzYgMHoiXQogICAgfTsKICAgIGZhRXF1YWxzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImVxdWFscyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzYyNzY0XSwgIjNkIiwgIk0zMiAxMjhjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzg0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgMTI4em0wIDE5MmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzODQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwzMiAzMjB6Il0KICAgIH07CiAgICBmYUNoZXZyb25VcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGV2cm9uLXVwIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYwNzciLCAiTTIwMS40IDEwNS40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDE5MiAxOTJjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNzLTMyLjggMTIuNS00NS4zIDBMMjI0IDE3My4zIDU0LjYgMzQyLjZjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwcy0xMi41LTMyLjggMC00NS4zbDE5Mi0xOTJ6Il0KICAgIH07CiAgICBmYVZpcnVzU2xhc2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidmlydXMtc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTA3NSIsICJNNDEtMjQuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTLTIuMy0uMyA3IDkuMWw1MjggNTI4YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtODguNi04OC42YzEuNy0xMi4xLTItMjQuOC0xMS4zLTM0LTMxLjItMzEuMi05LjEtODQuNSAzNS04NC41IDIyLjEgMCA0MC0xNy45IDQwLTQwcy0xNy45LTQwLTQwLTQwYy00NC4xIDAtNjYuMS01My4zLTM1LTg0LjUgMTUuNi0xNS42IDE1LjYtNDAuOSAwLTU2LjZzLTQwLjktMTUuNi01Ni42IDBjLTMxLjIgMzEuMi04NC41IDkuMS04NC41LTM1IDAtMjIuMS0xNy45LTQwLTQwLTQwcy00MCAxNy45LTQwIDQwYzAgNDQuMS01My4zIDY2LjEtODQuNSAzNS05LjMtOS4zLTIyLTEzLTM0LTExLjNMNDEtMjQuOXpNNzIgMjE2Yy0yMi4xIDAtNDAgMTcuOS00MCA0MHMxNy45IDQwIDQwIDQwYzQ0LjEgMCA2Ni4xIDUzLjMgMzUgODQuNS0xNS42IDE1LjYtMTUuNiA0MC45IDAgNTYuNnM0MC45IDE1LjYgNTYuNiAwYzMxLjItMzEuMiA4NC41LTkuMSA4NC41IDM1IDAgMjIuMSAxNy45IDQwIDQwIDQwczQwLTE3LjkgNDAtNDBjMC0yMS40IDEyLjYtMzcuNiAyOS4xLTQ1LjFsLTI0MC0yNDBDMTA5LjYgMjAzLjQgOTMuNCAyMTYgNzIgMjE2eiJdCiAgICB9OwogICAgZmFTbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzbGFzaCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNzE1IiwgIk03LTI1YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwTDU2OSA1MDNjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMEw3IDlDLTIuMy0uNC0yLjMtMTUuNiA3LTI1eiJdCiAgICB9OwogICAgZmFFeHBhbmQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZXhwYW5kIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYwNjUiLCAiTTMyIDMyQzE0LjMgMzIgMCA0Ni4zIDAgNjRsMCA5NmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtNjQgNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwzMiAzMnpNNjQgMzUyYzAtMTcuNy0xNC4zLTMyLTMyLTMyUzAgMzM0LjMgMCAzNTJsMCA5NmMwIDE3LjcgMTQuMyAzMiAzMiAzMmw5NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC02NCAwIDAtNjR6TTMyMCAzMmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmw2NCAwIDAgNjRjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTk2YzAtMTcuNy0xNC4zLTMyLTMyLTMybC05NiAwek00NDggMzUyYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgNjQtNjQgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmw5NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtOTZ6Il0KICAgIH07CiAgICBmYU5vdGVTdGlja3kyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm5vdGUtc3RpY2t5IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbNjIwMjYsICJzdGlja3ktbm90ZSJdLCAiZjI0OSIsICJNNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjEzLjVjMCAxNy02LjcgMzMuMy0xOC43IDQ1LjNMMzIyLjcgNDYxLjNjLTEyIDEyLTI4LjMgMTguNy00NS4zIDE4LjdMNjQgNDgwek0zODkuNSAzMDRMMjk2IDMwNGMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCA5My41IDExNy41LTExNy41eiJdCiAgICB9OwogICAgZmFTdGlja3lOb3RlMiA9IGZhTm90ZVN0aWNreTI7CiAgICBmYVRhYmxlQ29sdW1ucyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWJsZS1jb2x1bW5zIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImNvbHVtbnMiXSwgImYwZGIiLCAiTTAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMzIwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2em02NCA2NGwwIDI1NiAxMjggMCAwLTI1Ni0xMjggMHptMzIwIDBsLTEyOCAwIDAgMjU2IDEyOCAwIDAtMjU2eiJdCiAgICB9OwogICAgZmFDb2x1bW5zID0gZmFUYWJsZUNvbHVtbnM7CiAgICBmYVBlcnNvblNoZWx0ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLXNoZWx0ZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTU0ZiIsICJNMjcxLjkgNC4yYy05LjgtNS42LTIxLjktNS42LTMxLjggMGwtMjI0IDEyOEM2LjIgMTM3LjkgMCAxNDguNSAwIDE2MEwwIDQ4MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMyTDY0IDE3OC42IDI1NiA2OC45IDQ0OCAxNzguNiA0NDggNDgwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zMjBjMC0xMS41LTYuMi0yMi4xLTE2LjEtMjcuOGwtMjI0LTEyOHpNMjU2IDIwOGE0MCA0MCAwIDEgMCAwLTgwIDQwIDQwIDAgMSAwIDAgODB6bS04IDE5MmwxNiAwIDAgODhjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTE3NC41IDI2LjkgNDkuOWM2LjMgMTEuNyAyMC44IDE2IDMyLjUgOS44czE2LTIwLjggOS44LTMyLjVsLTMzLjItNjEuN0MzMjkuNyAyNDUuMSAyOTQuNCAyMjQgMjU2IDIyNHMtNzMuNyAyMS4xLTkxLjkgNTQuOWwtMzMuMiA2MS43Yy02LjMgMTEuNy0xLjkgMjYuMiA5LjggMzIuNXMyNi4yIDEuOSAzMi41LTkuOEwyMDAgMzEzLjUgMjAwIDQ4OGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtODh6Il0KICAgIH07CiAgICBmYUNpcmNsZU5vdGNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1ub3RjaCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMWNlIiwgIk0yMjIuNyAzMi4xYzUgMTYuOS00LjYgMzQuOC0yMS41IDM5LjgtNzkuMyAyMy42LTEzNy4xIDk3LjEtMTM3LjEgMTg0LjEgMCAxMDYgODYgMTkyIDE5MiAxOTJzMTkyLTg2IDE5Mi0xOTJjMC04Ni45LTU3LjgtMTYwLjQtMTM3LjEtMTg0LjEtMTYuOS01LTI2LjYtMjIuOS0yMS41LTM5LjhzMjIuOS0yNi42IDM5LjgtMjEuNUM0MzQuOSA0Mi4xIDUxMiAxNDAgNTEyIDI1NiA1MTIgMzk3LjQgMzk3LjQgNTEyIDI1NiA1MTJTMCAzOTcuNCAwIDI1NmMwLTExNiA3Ny4xLTIxMy45IDE4Mi45LTI0NS40IDE2LjktNSAzNC44IDQuNiAzOS44IDIxLjV6Il0KICAgIH07CiAgICBmYVdhdGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIndhdGVyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY3NzMiLCAiTTQxMC42IDEyNC4xYzIwLjcgMTUuNiA0NiAzMC43IDc0LjIgMzQuNSAxMy4xIDEuOCAyNS4yLTcuNSAyNy0yMC42cy03LjUtMjUuMi0yMC42LTI3Yy0xNS45LTIuMS0zMy4yLTExLjMtNTEuNy0yNS4yLTM4LjQtMjktOTAuNS0yOS0xMjkgMC0yNCAxOC4xLTQwLjcgMjYuMy01NC41IDI2LjNzLTMwLjUtOC4yLTU0LjUtMjYuM2MtMzguNC0yOS05MC41LTI5LTEyOSAwLTE4LjUgMTMuOS0zNS44IDIzLjEtNTEuNyAyNS4yLTEzLjEgMS44LTIyLjQgMTMuOC0yMC42IDI3czEzLjggMjIuNCAyNyAyMC42YzI4LjItMy44IDUzLjYtMTguOSA3NC4yLTM0LjUgMjEuMy0xNi4xIDQ5LjktMTYuMSA3MS4yIDAgMjQuMiAxOC4zIDUyLjMgMzUuOSA4My40IDM1LjlzNTkuMS0xNy43IDgzLjQtMzUuOWMyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMHptMCAxNDRjMjAuNyAxNS42IDQ2IDMwLjcgNzQuMiAzNC41IDEzLjEgMS44IDI1LjItNy41IDI3LTIwLjZzLTcuNS0yNS4yLTIwLjYtMjdjLTE1LjktMi4xLTMzLjItMTEuMy01MS43LTI1LjItMzguNC0yOS05MC41LTI5LTEyOSAwLTI0IDE4LjEtNDAuNyAyNi4zLTU0LjUgMjYuM3MtMzAuNS04LjItNTQuNS0yNi4zYy0zOC40LTI5LTkwLjUtMjktMTI5IDAtMTguNSAxMy45LTM1LjggMjMuMS01MS43IDI1LjItMTMuMSAxLjctMjIuNCAxMy44LTIwLjYgMjdzMTMuOCAyMi40IDI3IDIwLjZjMjguMi0zLjggNTMuNi0xOC45IDc0LjItMzQuNSAyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAyNC4yIDE4LjMgNTIuMyAzNS45IDgzLjQgMzUuOXM1OS4xLTE3LjcgODMuNC0zNS45YzIxLjMtMTYuMSA0OS45LTE2LjEgNzEuMiAwem0tNzEuMiAxNDRjMjEuMy0xNi4xIDQ5LjktMTYuMSA3MS4yIDAgMjAuNyAxNS42IDQ2IDMwLjcgNzQuMiAzNC41IDEzLjEgMS44IDI1LjItNy41IDI3LTIwLjZzLTcuNS0yNS4yLTIwLjYtMjdjLTE1LjktMi4xLTMzLjItMTEuMy01MS43LTI1LjItMzguNC0yOS05MC41LTI5LTEyOSAwLTI0IDE4LjEtNDAuNyAyNi4zLTU0LjUgMjYuM3MtMzAuNS04LjItNTQuNS0yNi4zYy0zOC40LTI5LTkwLjUtMjktMTI5IDAtMTguNSAxMy45LTM1LjggMjMuMS01MS43IDI1LjItMTMuMSAxLjgtMjIuNCAxMy44LTIwLjYgMjdzMTMuOCAyMi40IDI3IDIwLjZjMjguMi0zLjggNTMuNi0xOC45IDc0LjItMzQuNSAyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAyNC4yIDE4LjMgNTIuMyAzNS45IDgzLjQgMzUuOXM1OS4xLTE3LjcgODMuNC0zNS45eiJdCiAgICB9OwogICAgZmFEZWxldGVMZWZ0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRlbGV0ZS1sZWZ0IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbOTAwMywgImJhY2tzcGFjZSJdLCAiZjU1YSIsICJNNTc2IDEyOGMwLTM1LjMtMjguNy02NC02NC02NEwyMDUuMyA2NGMtMTcgMC0zMy4zIDYuNy00NS4zIDE4LjdMOS40IDIzMy40Yy02IDYtOS40IDE0LjEtOS40IDIyLjZzMy40IDE2LjYgOS40IDIyLjZMMTYwIDQyOS4zYzEyIDEyIDI4LjMgMTguNyA0NS4zIDE4LjdMNTEyIDQ0OGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI1NnpNMjg0LjEgMTg4LjFjOS40LTkuNCAyNC42LTkuNCAzMy45IDBsMzMuOSAzMy45IDMzLjktMzMuOWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjlsLTMzLjkgMzMuOSAzMy45IDMzLjljOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtMzMuOS0zMy45LTMzLjkgMzMuOWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWwzMy45LTMzLjktMzMuOS0zMy45Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXoiXQogICAgfTsKICAgIGZhQmFja3NwYWNlID0gZmFEZWxldGVMZWZ0OwogICAgZmFCcm9vbUJhbGwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnJvb20tYmFsbCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJxdWlkZGl0Y2giLCAicXVpZGRpdGNoLWJyb29tLWJhbGwiXSwgImY0NTgiLCAiTTQ5NiA1NDRhODAgODAgMCAxIDEgMC0xNjAgODAgODAgMCAxIDEgMCAxNjB6TTEwNi44IDI3Ny4yYzMwLjYtMzAuNiA3My4xLTQ1LjkgMTE1LjgtNDIuMkwzNDEgMzUzLjNjMy43IDQyLjgtMTEuNiA4NS4yLTQyLjIgMTE1LjktMjcuNCAyNy40LTY0LjYgNDIuOC0xMDMuMyA0Mi44TDIyLjEgNTEyYy0xMi4yIDAtMjIuMS05LjktMjIuMS0yMi4xIDAtNi4zIDIuNy0xMi4zIDcuMy0xNi41TDEzMy43IDM1OS43YzQuMi0zLjctLjQtMTAuNC01LjQtNy45TDc3LjIgMzc3LjRjLTYuMSAzLTEzLjItMS40LTEzLjItOC4yIDAtMzEuNSAxMi41LTYxLjggMzQuOC04NGw4LTh6bTQxNy0yNzBjMTIuNi0xMC4zIDMxLjEtOS41IDQyLjggMi4yczEyLjQgMzAuMiAyLjIgNDIuOGwtMi4yIDIuNC0xOTIgMTkyIDM0LjggMzQuN2M0LjIgNC4yIDYuNiAxMCA2LjYgMTYgMCAxMi41LTEwLjEgMjIuNi0yMi42IDIyLjZsLTI5LjEgMC0xMDguMy0xMDguMyAwLTI5LjFjMC0xMi41IDEwLjEtMjIuNiAyMi42LTIyLjYgNiAwIDExLjggMi40IDE2IDYuNmwzNC44IDM0LjcgMTkyLTE5MiAyLjQtMi4yeiJdCiAgICB9OwogICAgZmFRdWlkZGl0Y2ggPSBmYUJyb29tQmFsbDsKICAgIGZhUXVpZGRpdGNoQnJvb21CYWxsID0gZmFCcm9vbUJhbGw7CiAgICBmYUogPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaiIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWzEwNl0sICI0YSIsICJNMjg4IDMyYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMjU2YzAgODguNC03MS42IDE2MC0xNjAgMTYwUzAgNDA4LjQgMCAzMjBsMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMzJjMCA1MyA0MyA5NiA5NiA5NnM5Ni00MyA5Ni05NmwwLTI1NmMwLTE3LjcgMTQuMy0zMiAzMi0zMnoiXQogICAgfTsKICAgIGZhU2h1dHRsZVNwYWNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNodXR0bGUtc3BhY2UiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsic3BhY2Utc2h1dHRsZSJdLCAiZjE5NyIsICJNMCAzNjhsMCA2NGMwIDI2LjUgMjEuNSA0OCA0OCA0OGw1MCAwYzQwLjYgMCA4MC40LTExIDExNS4yLTMxLjlsMTMzLjUtODAuMS05My4zIDAtNjQuOSAzOC45Yy0xNCA4LjQtMjguOSAxNC43LTQ0LjUgMTlsMC02Ni40YzkuNy01LjYgMTcuOC0xMy43IDIzLjQtMjMuNGwxOTguOCAwYzY3LjEgMCAxMjcuOC0yMC42IDE3MC4zLTcwLjYgNC42LTUuNCA0LjYtMTMuMyAwLTE4LjgtNDIuNS01MC4xLTEwMy4yLTcwLjYtMTcwLjMtNzAuNmwtMTk4LjggMGMtNS42LTkuNy0xMy43LTE3LjgtMjMuNC0yMy40bDAtNjYuNGMxNS42IDQuMiAzMC42IDEwLjYgNDQuNSAxOWw2NC45IDM4LjkgOTMuMyAwLTEzMy41LTgwLjFDMTc4LjQgNDMgMTM4LjYgMzIgOTggMzJMNDggMzJDMjEuNSAzMiAwIDUzLjUgMCA4MEwwIDM2OHptOTYgMGwwIDY0LTQ4IDAgMC02NCA0OCAwek05NiA4MGwwIDY0LTQ4IDAgMC02NCA0OCAwek00MTYgMjI0YzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNnMtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2eiJdCiAgICB9OwogICAgZmFTcGFjZVNodXR0bGUgPSBmYVNodXR0bGVTcGFjZTsKICAgIGZhWWluWWFuZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ5aW4teWFuZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzk3NzVdLCAiZjZhZCIsICJNMjI0IDE2MGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0zMiAzNTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyem0wLTQ0OGM1MyAwIDk2IDQzIDk2IDk2cy00MyA5Ni05NiA5Ni05NiA0My05NiA5NiA0MyA5NiA5NiA5NkMxNTAgNDQ4IDY0IDM2MiA2NCAyNTZTMTUwIDY0IDI1NiA2NHpNMjI0IDM1MmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAweiJdCiAgICB9OwogICAgZmFTdG9wID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN0b3AiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs5MjA5XSwgImYwNGQiLCAiTTY0IDMybDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMnoiXQogICAgfTsKICAgIGZhVHJvd2VsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRyb3dlbCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTg5IiwgIk00MDcuOSAxODEuNEwyNzcuMyAzMTIgMzQyLjYgMzc3LjRjNy45IDcuOSAxMS4xIDE5LjQgOC40IDMwLjNzLTEwLjggMTkuNi0yMS41IDIyLjlsLTI1NiA4MGMtMTEuNCAzLjUtMjMuOCAuNS0zMi4yLTcuOXMtMTEuNS0yMC44LTcuOS0zMi4ybDgwLTI1NmMzLjMtMTAuNyAxMi0xOC45IDIyLjktMjEuNXMyMi40IC41IDMwLjMgOC40TDIzMiAyNjYuNyAzNjIuNiAxMzYuMWMtMTQuMy0xNC42LTE0LjItMzggLjMtNTIuNWw5NS40LTk1LjRjMjYuOS0yNi45IDcwLjUtMjYuOSA5Ny41IDBzMjYuOSA3MC41IDAgOTcuNWwtOTUuNCA5NS40Yy0xNC41IDE0LjUtMzcuOSAxNC42LTUyLjUgLjN6Il0KICAgIH07CiAgICBmYUhhbmRCYWNrRmlzdDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1iYWNrLWZpc3QiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsiaGFuZC1yb2NrIl0sICJmMjU1IiwgIk03LjQgMjUzLjZDMi42IDI0NS45IDAgMjM3LjEgMCAyMjhsMC0zNmMwLTI2LjUgMjEuNS00OCA0OC00OGwxNiAwIDAtODBjMC0yNi41IDIxLjUtNDggNDgtNDggMTcuMyAwIDMyLjQgOS4xIDQwLjkgMjIuOCA0LjMtMjIuMSAyMy44LTM4LjggNDcuMS0zOC44IDIzLjQgMCA0Mi45IDE2LjggNDcuMSAzOC45IDcuMy00LjQgMTUuOC02LjkgMjQuOS02LjkgMjIuMSAwIDQwLjggMTUgNDYuMyAzNS40IDUuNS0yLjIgMTEuNC0zLjQgMTcuNy0zLjQgMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA5Ni45YzAgOS45LTIuMyAxOS43LTYuOCAyOC42bC0zOS42IDc5LjFjLTEwLjggMjEuNy0zMyAzNS40LTU3LjIgMzUuNEw5NiAzNTJjLTE2LjUgMC0zMS44LTguNC00MC42LTIyLjRsLTQ4LTc2ek0zMiA0ODBsMC00OGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwyNTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDQ4YzAgMTcuNy0xNC4zIDMyLTMyIDMyTDY0IDUxMmMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6Il0KICAgIH07CiAgICBmYUhhbmRSb2NrMiA9IGZhSGFuZEJhY2tGaXN0MjsKICAgIGZhVGVtcGVyYXR1cmVIaWdoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRlbXBlcmF0dXJlLWhpZ2giLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjc2OSIsICJNOTYgOTZjMC01MyA0My05NiA5Ni05NnM5NiA0MyA5NiA5NmwwIDE2NC43YzI5LjUgMjYuNCA0OCA2NC43IDQ4IDEwNy4zIDAgNzkuNS02NC41IDE0NC0xNDQgMTQ0UzQ4IDQ0Ny41IDQ4IDM2OGMwLTQyLjYgMTguNS04MSA0OC0xMDcuM0w5NiA5NnptOTYgMzM2YzM1LjMgMCA2NC0yOC43IDY0LTY0IDAtMjYuOS0xNi41LTQ5LjktNDAtNTkuM0wyMTYgOTZjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAyMTIuN2MtMjMuNSA5LjUtNDAgMzIuNS00MCA1OS4zIDAgMzUuMyAyOC43IDY0IDY0IDY0ek00NjQgODBhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHpNMzUyIDgwYTgwIDgwIDAgMSAxIDE2MCAwIDgwIDgwIDAgMSAxIC0xNjAgMHoiXQogICAgfTsKICAgIGZhR3JlYXRlclRoYW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ3JlYXRlci10aGFuIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjI3NjldLCAiM2UiLCAiTTM0LjkgNTAuNmMtNy40IDE2LS40IDM1LjEgMTUuNiA0Mi41TDQwMy42IDI1NiA1MC42IDQxOWMtMTYgNy40LTIzLjEgMjYuNC0xNS42IDQyLjVzMjYuNCAyMyA0Mi41IDE1LjZsNDE2LTE5MmMxMS4zLTUuMiAxOC42LTE2LjYgMTguNi0yOS4xcy03LjMtMjMuOC0xOC42LTI5LjFMNzcuNCAzNWMtMTYtNy40LTM1LjEtLjQtNDIuNSAxNS42eiJdCiAgICB9OwogICAgZmFDcnV0Y2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY3J1dGNoIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY3ZjciLCAiTTI5Ny40IDkuNGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMGwxNjAgMTYwYzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zcy0zMi44IDEyLjUtNDUuMyAwbC0xLjQtMS40LTE1OC42IDE1OC42Yy0xOCAxOC00Mi40IDI4LjEtNjcuOSAyOC4xbC01OSAwYy04LjUgMC0xNi42IDMuNC0yMi42IDkuNC02MS43IDYxLjctOTIuOCA5Mi44LTkzLjMgOTMuMy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM2wxNi0xNiAwIDAgNzcuMy03Ny4zYzYtNiA5LjQtMTQuMSA5LjQtMjIuNmwwLTU5YzAtMjUuNSAxMC4xLTQ5LjkgMjguMS02Ny45TDI5OC43IDU2IDI5Ny40IDU0LjZjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zek0zNDQgMTAxLjNMMjYxLjMgMTg0IDMyOCAyNTAuNyA0MTAuNyAxNjggMzQ0IDEwMS4zem0tMTI4IDEyOGwtMzAuNiAzMC42Yy02IDYtOS40IDE0LjEtOS40IDIyLjZsMCA1My41IDUzLjUgMGM4LjUgMCAxNi42LTMuNCAyMi42LTkuNEwyODIuNyAyOTYgMjE2IDIyOS4zeiJdCiAgICB9OwogICAgZmFTZXB0YWdvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzZXB0YWdvbiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJoZXB0YWdvbiJdLCAiZTgyMCIsICJNMjY3LjQtMzEuNWMxNS45LTUuNSAzMy41LTQuNiA0OC44IDIuN2wxNzIuNCA4MyA2LjMgMy41YzE0LjIgOSAyNC41IDIzLjMgMjguMyAzOS45bDQyLjYgMTg2LjUgMS4yIDcuMmMxLjYgMTQuMy0xLjcgMjguOC05LjQgNDEuMWwtNC4yIDUuOS0xMTkuMyAxNDkuNmMtMTIuMSAxNS4yLTMwLjYgMjQuMS01MCAyNC4xbC0xOTEuMyAwYy0xOS41IDAtMzcuOS04LjktNTAtMjQuMUwyMy41IDMzOC40Yy0xMi4xLTE1LjItMTYuNy0zNS4yLTEyLjMtNTQuMmw0Mi42LTE4Ni41IDItN2M1LjYtMTUuOSAxNy4yLTI5IDMyLjYtMzYuNGwxNzIuNC04MyA2LjctMi43eiJdCiAgICB9OwogICAgZmFIZXB0YWdvbiA9IGZhU2VwdGFnb247CiAgICBmYVN0cmVldFZpZXcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3RyZWV0LXZpZXciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjIxZCIsICJNMjU2IDBhNjQgNjQgMCAxIDEgMCAxMjggNjQgNjQgMCAxIDEgMC0xMjh6TTIyNCAxNjBsNjQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDQ4YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0xLjggMC0xMS4xIDk5LjVjLTEuOCAxNi4yLTE1LjUgMjguNS0zMS44IDI4LjVsLTM4LjcgMGMtMTYuMyAwLTMwLTEyLjMtMzEuOC0yOC41bC0xMS4xLTk5LjUtMS44IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNDhjMC0zNS4zIDI4LjctNjQgNjQtNjR6TTQxMi40IDQwMC4yYy0xNi4xLTQuMi0zNC44LTcuNi01NS40LTEwLjJsNS4zLTQ3LjdjMjIuNyAyLjkgNDMuNyA2LjcgNjIuMSAxMS41IDIyLjQgNS44IDQyLjYgMTMuMyA1Ny44IDIzLjMgMTQuNyA5LjYgMjkuOCAyNC45IDI5LjggNDdzLTE1LjEgMzcuNC0yOS44IDQ3Yy0xNS4yIDkuOS0zNS41IDE3LjUtNTcuOCAyMy4zLTQ1LjEgMTEuNy0xMDUuMyAxNy44LTE2OC40IDE3LjhzLTEyMy4zLTYuMS0xNjguNC0xNy44QzY1LjIgNDg4LjQgNDUgNDgwLjkgMjkuOCA0NzEgMTUuMSA0NjEuNCAwIDQ0Ni4xIDAgNDI0czE1LjEtMzcuNCAyOS44LTQ3YzE1LjItOS45IDM1LjUtMTcuNSA1Ny44LTIzLjMgMTguNS00LjggMzkuNS04LjYgNjIuMS0xMS41TDE1NSAzOTBjLTIwLjYgMi42LTM5LjMgNi4xLTU1LjQgMTAuMi01Ni42IDE0LjYtNTYuNiAzMi45IDAgNDcuNSAzOS45IDEwLjMgOTUuOCAxNi4yIDE1Ni40IDE2LjJzMTE2LjUtNS45IDE1Ni40LTE2LjJjNTYuNi0xNC42IDU2LjYtMzIuOSAwLTQ3LjV6Il0KICAgIH07CiAgICBmYVdhdmVTcXVhcmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid2F2ZS1zcXVhcmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjgzZSIsICJNNjQgOTZjMC0xNy43IDE0LjMtMzIgMzItMzJsMTYwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAyODggOTYgMCAwLTEyOGMwLTE3LjcgMTQuMy0zMiAzMi0zMmw2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0zMiAwIDAgMTI4YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0xNjAgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0yODgtOTYgMCAwIDEyOGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtNjQgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwzMiAwIDAtMTI4eiJdCiAgICB9OwogICAgZmFBbmdsZUxlZnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYW5nbGUtbGVmdCIsCiAgICAgIGljb246IFsyNTYsIDUxMiwgWzgyNDldLCAiZjEwNCIsICJNOS40IDIzMy40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM2wxNjAgMTYwYzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNMNzcuMyAyNTYgMjE0LjYgMTE4LjZjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBsLTE2MCAxNjB6Il0KICAgIH07CiAgICBmYVNjcmV3ZHJpdmVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNjcmV3ZHJpdmVyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI5NjkxXSwgImY1NGEiLCAiTTM1Mi4xIDE0Ni43bDAtNDkuNmMwLTEwLjcgNS4zLTIwLjcgMTQuMi0yNi42TDQ4NS4yLTguN2M2LjMtNC4yIDE0LjgtMy40IDIwLjIgMmw0NS40IDQ1LjVjNS40IDUuNCA2LjIgMTMuOCAyIDIwLjJMNDczLjYgMTc3LjhjLTUuOSA4LjktMTUuOSAxNC4yLTI2LjYgMTQuMmwtNDkuNiAwLTkwLjcgOTAuN2MxNSAzMy4zIDguOSA3My45LTE4LjUgMTAxLjNMMTYyLjEgNTEwLjFjLTE4LjcgMTguNy00OS4xIDE4LjctNjcuOSAwTDM0LjEgNDQ5LjljLTE4LjctMTguNy0xOC43LTQ5LjEgMC02Ny45TDE2MC4xIDI1NmMyNy40LTI3LjQgNjcuOS0zMy42IDEwMS4zLTE4LjVsOTAuNy05MC43eiJdCiAgICB9OwogICAgZmFUcmFjdG9yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRyYWN0b3IiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjg2NjhdLCAiZjcyMiIsICJNMTYwIDk2bDAgOTYgMTMzLjQgMC01Ny42LTk2LTc1LjggMHpNOTYgMjIzTDk2IDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMybDEwNy44IDBjMjIuNSAwIDQzLjMgMTEuOCA1NC45IDMxLjFsNzcuNCAxMjguOSA2NCAwIDAtNzJjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDcyIDQ4IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA0MS41YzAgMTQuMi02LjMgMjcuOC0xNy4zIDM2LjlsLTM1IDI5LjJjMjYuNSAxNS4yIDQ0LjMgNDMuNyA0NC4zIDc2LjQgMCA0OC42LTM5LjQgODgtODggODhzLTg4LTM5LjQtODgtODhjMC0xNC40IDMuNS0yOCA5LjYtNDBsLTEwMS4yIDBjLTMgMTMuNC03LjkgMjYtMTQuNCAzNy43IDcuNyA5LjQgNy4yIDIzLjQtMS42IDMyLjJsLTIyLjYgMjIuNmMtOC44IDguOC0yMi43IDkuMy0zMi4yIDEuNi05LjMgNS4yLTE5LjMgOS4zLTI5LjggMTIuMy0xLjIgMTIuMS0xMS40IDIxLjYtMjMuOSAyMS42bC0zMiAwYy0xMi40IDAtMjIuNy05LjUtMjMuOS0yMS42LTEwLjUtMy0yMC40LTcuMi0yOS44LTEyLjMtOS40IDcuNy0yMy40IDcuMi0zMi4yLTEuNkwzNS41IDQ1My44Yy04LjgtOC44LTkuMy0yMi43LTEuNi0zMi4yLTUuMi05LjMtOS4zLTE5LjMtMTIuMy0yOS44LTEyLjEtMS4yLTIxLjYtMTEuNC0yMS42LTIzLjlsMC0zMmMwLTEyLjQgOS41LTIyLjcgMjEuNi0yMy45IDMtMTAuNSA3LjItMjAuNCAxMi4zLTI5LjgtNy43LTkuNC03LjItMjMuNCAxLjYtMzIuMmwyMi42LTIyLjZjOC44LTguOCAyMi43LTkuMyAzMi4yLTEuNiAxLjktMSAzLjctMiA1LjctM3ptNjQgNjVhNjQgNjQgMCAxIDAgMCAxMjggNjQgNjQgMCAxIDAgMC0xMjh6TTQ0MCA0MjRhNDAgNDAgMCAxIDAgODAgMCA0MCA0MCAwIDEgMCAtODAgMHoiXQogICAgfTsKICAgIGZhQnJpZGdlQ2lyY2xlWG1hcmsgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnJpZGdlLWNpcmNsZS14bWFyayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNGNiIiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0UzE0LjMgOTYgMzIgOTZsOCAwIDAgNjQtNDAgMCAwIDExMmMzNy42IDkuNCA2NCA0My4yIDY0IDgybDAgOTRjMCAxNy43IDE0LjMgMzIgMzIgMzJsMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTY0YzAtNTMgNDMtOTYgOTYtOTYgNi40IDAgMTIuNyAuNiAxOC43IDEuOCAzNC43LTQ5LjUgOTIuMi04MS44IDE1Ny4zLTgxLjggMjguNiAwIDU1LjYgNi4yIDgwIDE3LjRsMC02NS40LTQwIDAgMC02NCA4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgMzJ6TTQyNCA5NmwwIDY0LTgwIDAgMC02NCA4MCAwek0yOTYgOTZsMCA2NC04MCAwIDAtNjQgODAgMHpNODggOTZsODAgMCAwIDY0LTgwIDAgMC02NHpNNDMyIDU0NGExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6bTU5LjMtMTgwLjdsLTM2LjcgMzYuNyAzNi43IDM2LjdjNi4yIDYuMiA2LjIgMTYuNCAwIDIyLjZzLTE2LjQgNi4yLTIyLjYgMGwtMzYuNy0zNi43LTM2LjcgMzYuN2MtNi4yIDYuMi0xNi40IDYuMi0yMi42IDBzLTYuMi0xNi40IDAtMjIuNmwzNi43LTM2LjctMzYuNy0zNi43Yy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBsMzYuNyAzNi43IDM2LjctMzYuN2M2LjItNi4yIDE2LjQtNi4yIDIyLjYgMHM2LjIgMTYuNCAwIDIyLjZ6Il0KICAgIH07CiAgICBmYVZpYWxzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZpYWxzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0OTMiLCAiTTMyIDBDMTQuMyAwIDAgMTQuMyAwIDMyUzE0LjMgNjQgMzIgNjRsMCAzNTJjMCA1MyA0MyA5NiA5NiA5NnM5Ni00MyA5Ni05NmwwLTM1MiA2NCAwIDAgMzUyYzAgNTMgNDMgOTYgOTYgOTZzOTYtNDMgOTYtOTZsMC0zNTJjMTcuNyAwIDMyLTE0LjMgMzItMzJTNDk3LjcgMCA0ODAgMEwzMiAwek0xNjAgNjRsMCAxMjgtNjQgMCAwLTEyOCA2NCAwem0yNTYgMGwwIDEyOC02NCAwIDAtMTI4IDY0IDB6Il0KICAgIH07CiAgICBmYVN0ZXRob3Njb3BlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN0ZXRob3Njb3BlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI5NjU4XSwgImYwZjEiLCAiTTMyIDQ4QzMyIDIxLjUgNTMuNSAwIDgwIDBsNDggMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIgMCAwIDEyOGMwIDUzIDQzIDk2IDk2IDk2czk2LTQzIDk2LTk2bDAtMTI4LTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyUzIzOC4zIDAgMjU2IDBsNDggMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDE0NGMwIDc3LjQtNTUgMTQyLTEyOCAxNTYuOGwwIDE5LjJjMCA2MS45IDUwLjEgMTEyIDExMiAxMTJzMTEyLTUwLjEgMTEyLTExMmwwLTg1LjVjLTM3LjMtMTMuMi02NC00OC43LTY0LTkwLjUgMC01MyA0My05NiA5Ni05NnM5NiA0MyA5NiA5NmMwIDQxLjgtMjYuNyA3Ny40LTY0IDkwLjVsMCA4NS41YzAgOTcuMi03OC44IDE3Ni0xNzYgMTc2UzE2MCA0NjUuMiAxNjAgMzY4bDAtMTkuMkM4NyAzMzQgMzIgMjY5LjQgMzIgMTkyTDMyIDQ4ek00ODAgMjI0YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHoiXQogICAgfTsKICAgIGZhUG9kY2FzdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwb2RjYXN0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyY2UiLCAiTTMzNiAzNTkuOGMzOS4xLTMyLjMgNjQtODEuMSA2NC0xMzUuOCAwLTk3LjItNzguOC0xNzYtMTc2LTE3NlM0OCAxMjYuOCA0OCAyMjRDNDggMjc4LjcgNzIuOSAzMjcuNSAxMTIgMzU5LjggMTEyLjQgMzc3LjQgMTE1LjIgNDAwLjIgMTE4LjQgNDIxLjYgNDggMzgzLjkgMCAzMDkuNSAwIDIyNCAwIDEwMC4zIDEwMC4zIDAgMjI0IDBTNDQ4IDEwMC4zIDQ0OCAyMjRjMCA4NS42LTQ4IDE1OS45LTExOC41IDE5Ny42IDMuMy0yMS40IDYtNDQuMiA2LjQtNjEuOHptLTE0LTUzLjRjLTguMy0xMi42LTE5LjItMjEuNi0zMC40LTI3LjgtMi4xLTEuMS00LjItMi4yLTYuMy0zLjIgMTEuNy0xMy45IDE4LjgtMzEuOSAxOC44LTUxLjUgMC00NC4yLTM1LjgtODAtODAtODBzLTgwIDM1LjgtODAgODBjMCAxOS42IDcuMSAzNy42IDE4LjggNTEuNS0yLjEgMS00LjIgMi02LjMgMy4yLTExLjIgNi4yLTIyLjEgMTUuMi0zMC40IDI3LjgtMTguOC0yMi4zLTMwLjEtNTEtMzAuMS04Mi40IDAtNzAuNyA1Ny4zLTEyOCAxMjgtMTI4czEyOCA1Ny4zIDEyOCAxMjhjMCAzMS40LTExLjMgNjAuMi0zMC4xIDgyLjR6TTIyNCAzMTJjMzIuOSAwIDY0IDguNiA2NCA0My44IDAgMzMtMTIuOSAxMDQuMS0yMC42IDEzMi45LTUuMSAxOS0yNC41IDIzLjQtNDMuNCAyMy40cy0zOC4yLTQuNC00My40LTIzLjRjLTcuOC0yOC41LTIwLjYtOTkuNy0yMC42LTEzMi44IDAtMzUuMSAzMS4xLTQzLjggNjQtNDMuOHptMC0xMjhhNDAgNDAgMCAxIDEgMCA4MCA0MCA0MCAwIDEgMSAwLTgweiJdCiAgICB9OwogICAgZmFBcnJvd1VwUmlnaHREb3RzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXVwLXJpZ2h0LWRvdHMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTRiNyIsICJNOTYgMzJDNzguMyAzMiA2NCA0Ni4zIDY0IDY0Uzc4LjMgOTYgOTYgOTZMMTE0LjcgOTYgOS40IDIwMS40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwTDE2MCAxNDEuMyAxNjAgMTYwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC05NmMwLTE3LjctMTQuMy0zMi0zMi0zMkw5NiAzMnpNNDAzLjggNzAuMWEzOC4xIDM4LjEgMCAxIDAgNzYuMiAwIDM4LjEgMzguMSAwIDEgMCAtNzYuMiAwek0yNzkuNyAxOTQuMmEzOC4xIDM4LjEgMCAxIDAgNzYuMiAwIDM4LjEgMzguMSAwIDEgMCAtNzYuMiAwem0xNjIuMi0zOC4xYTM4LjEgMzguMSAwIDEgMCAwIDc2LjIgMzguMSAzOC4xIDAgMSAwIDAtNzYuMnpNMTU2LjIgMzE3LjhhMzguMSAzOC4xIDAgMSAwIDc2LjIgMCAzOC4xIDM4LjEgMCAxIDAgLTc2LjIgMHptMTYxLjYtMzguMWEzOC4xIDM4LjEgMCAxIDAgMCA3Ni4yIDM4LjEgMzguMSAwIDEgMCAwLTc2LjJ6bTg2LjEgMzguMWEzOC4xIDM4LjEgMCAxIDAgNzYuMiAwIDM4LjEgMzguMSAwIDEgMCAtNzYuMiAwek03MC4xIDQwMy44YTM4LjEgMzguMSAwIDEgMCAwIDc2LjIgMzguMSAzOC4xIDAgMSAwIDAtNzYuMnptODYuMSAzOC4xYTM4LjEgMzguMSAwIDEgMCA3Ni4yIDAgMzguMSAzOC4xIDAgMSAwIC03Ni4yIDB6bTE2MS42LTM4LjFhMzguMSAzOC4xIDAgMSAwIDAgNzYuMiAzOC4xIDM4LjEgMCAxIDAgMC03Ni4yem04Ni4xIDM4LjFhMzguMSAzOC4xIDAgMSAwIDc2LjIgMCAzOC4xIDM4LjEgMCAxIDAgLTc2LjIgMHoiXQogICAgfTsKICAgIGZhQ2hlc3NRdWVlbjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hlc3MtcXVlZW4iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5ODE5XSwgImY0NDUiLCAiTTI1NiA4MGE0OCA0OCAwIDEgMCAwLTk2IDQ4IDQ4IDAgMSAwIDAgOTZ6TTUuNSAxODVMMTI4IDM4NCA3MS44IDQ1NC4zYy01IDYuMy03LjggMTQuMS03LjggMjIuMiAwIDE5LjYgMTUuOSAzNS41IDM1LjUgMzUuNWwzMTIuOSAwYzE5LjYgMCAzNS41LTE1LjkgMzUuNS0zNS41IDAtOC4xLTIuNy0xNS45LTcuOC0yMi4yTDM4NCAzODQgNTA2LjUgMTg1YzMuNi01LjkgNS41LTEyLjcgNS41LTE5LjZsMC0uNmMwLTIwLjMtMTYuNS0zNi44LTM2LjgtMzYuOC03LjMgMC0xNC40IDIuMi0yMC40IDYuMmwtMTYuOSAxMS4zYy0xMi43IDguNS0yOS42IDYuOC00MC40LTRsLTM0LjEtMzQuMUMzNTYuMSAxMDAuMSAzNDYuMiA5NiAzMzYgOTZzLTIwLjEgNC4xLTI3LjMgMTEuM2wtMzAuMSAzMC4xYy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMGwtMzAuMS0zMC4xQzE5Ni4xIDEwMC4xIDE4Ni4yIDk2IDE3NiA5NnMtMjAuMSA0LjEtMjcuMyAxMS4zbC0zNC4xIDM0LjFjLTEwLjggMTAuOC0yNy43IDEyLjUtNDAuNCA0TDU3LjMgMTM0LjJjLTYuMS00LTEzLjItNi4yLTIwLjQtNi4yLTIwLjMgMC0zNi44IDE2LjUtMzYuOCAzNi44bDAgLjZjMCA2LjkgMS45IDEzLjcgNS41IDE5LjZ6Il0KICAgIH07CiAgICBmYUFuY2hvckNpcmNsZUV4Y2xhbWF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFuY2hvci1jaXJjbGUtZXhjbGFtYXRpb24iLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTRhYiIsICJNMzIwLjUgOTZhMzIgMzIgMCAxIDEgLTY0IDAgMzIgMzIgMCAxIDEgNjQgMHptLTMyLTk2Yy01MyAwLTk2IDQzLTk2IDk2IDAgNDEuOCAyNi43IDc3LjQgNjQgOTAuNWwwIDI1Ny45Yy02Mi45LTE0LjMtMTEwLjItNjkuNy0xMTEuOS0xMzYuNWwxNi4xIDE0LjFjMTAgOC43IDI1LjEgNy43IDMzLjktMi4zczcuNy0yNS4xLTIuMy0zMy45bC02NC01NmMtOS03LjktMjIuNi03LjktMzEuNiAwbC02NCA1NmMtMTAgOC43LTExIDIzLjktMi4zIDMzLjlzMjMuOSAxMSAzMy45IDIuM2wxNi4yLTE0LjJjMi4xIDExMy4xIDk0LjQgMjA0LjEgMjA4IDIwNC4xIDE2LjYgMCAzMi43LTEuOSA0OC4yLTUuNi0yMC4zLTMwLjUtMzIuMi02Ny0zMi4yLTEwNi40IDAtMjcuMyA1LjctNTMuMyAxNi03Ni45bDAtMTM2LjZjMzcuMy0xMy4yIDY0LTQ4LjcgNjQtOTAuNSAwLTUzLTQzLTk2LTk2LTk2em0yMDggNTQ0YTE0NCAxNDQgMCAxIDAgMC0yODggMTQ0IDE0NCAwIDEgMCAwIDI4OHptMC0xMDBhMjAgMjAgMCAxIDEgMCA0MCAyMCAyMCAwIDEgMSAwLTQwem0wLTE0MGM4LjggMCAxNiA3LjIgMTYgMTZsMCA4MGMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTgwYzAtOC44IDcuMi0xNiAxNi0xNnoiXQogICAgfTsKICAgIGZhRWxsaXBzaXNWZXJ0aWNhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJlbGxpcHNpcy12ZXJ0aWNhbCIsCiAgICAgIGljb246IFsxMjgsIDUxMiwgWyJlbGxpcHNpcy12Il0sICJmMTQyIiwgIk02NCAxNDRhNTYgNTYgMCAxIDEgMC0xMTIgNTYgNTYgMCAxIDEgMCAxMTJ6bTAgMjI0YzMwLjkgMCA1NiAyNS4xIDU2IDU2cy0yNS4xIDU2LTU2IDU2LTU2LTI1LjEtNTYtNTYgMjUuMS01NiA1Ni01NnptNTYtMTEyYzAgMzAuOS0yNS4xIDU2LTU2IDU2cy01Ni0yNS4xLTU2LTU2IDI1LjEtNTYgNTYtNTYgNTYgMjUuMSA1NiA1NnoiXQogICAgfTsKICAgIGZhRWxsaXBzaXNWID0gZmFFbGxpcHNpc1ZlcnRpY2FsOwogICAgZmFIZWFydENpcmNsZUV4Y2xhbWF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhlYXJ0LWNpcmNsZS1leGNsYW1hdGlvbiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNGZlIiwgIk0yNDEgODcuMWwxNSAyMC43IDE1LTIwLjdDMjk2IDUyLjUgMzM2LjIgMzIgMzc4LjkgMzIgNDUyLjQgMzIgNTEyIDkxLjYgNTEyIDE2NS4xbDAgMi42YzAgMTcuNi0zLjQgMzUuNi05LjUgNTMuNy0yMS44LTguNi00NS42LTEzLjQtNzAuNS0xMy40LTEwNiAwLTE5MiA4Ni0xOTIgMTkyIDAgMjguNSA2LjIgNTUuNiAxNy40IDgwLS41IDAtLjkgMC0xLjQgMC0xNS41IDAtMzAuOC00LjYtNDMuMS0xNC4xLTczLTU1LjctMjEyLjktMTg2LTIxMi45LTI5OC4ybDAtMi42QzAgOTEuNiA1OS42IDMyIDEzMy4xIDMyIDE3NS44IDMyIDIxNiA1Mi41IDI0MSA4Ny4xek00MzIgMjU2YTE0NCAxNDQgMCAxIDEgMCAyODggMTQ0IDE0NCAwIDEgMSAwLTI4OHptMCAyMjhhMjAgMjAgMCAxIDAgMC00MCAyMCAyMCAwIDEgMCAwIDQwem0wLTE4MGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgODBjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTgwYzAtOC44LTcuMi0xNi0xNi0xNnoiXQogICAgfTsKICAgIGZhQnVpbGRpbmdDaXJjbGVFeGNsYW1hdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJidWlsZGluZy1jaXJjbGUtZXhjbGFtYXRpb24iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRkMyIsICJNOTYgMEM2MC43IDAgMzIgMjguNyAzMiA2NGwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxODAgMGMtMTAuNS0xNC42LTE5LTMwLjctMjUuMS00OGwtNzQuOSAwIDAtODBjMC0xNy43IDE0LjMtMzIgMzItMzJsMzIgMGMyIDAgNCAuMiA1LjkgLjUgNi0yMy42IDE2LjMtNDUuNCAzMC4xLTY0LjVsLTQgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgNGMyNy41LTE5LjggNjAuMy0zMi40IDk2LTM1LjRMNDE2IDY0YzAtMzUuMy0yOC43LTY0LTY0LTY0TDk2IDB6bTMyIDExMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyek0yNzIgOTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNnpNMTI4IDI0MGMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyek00MzIgNTQ0YTE0NCAxNDQgMCAxIDAgMC0yODggMTQ0IDE0NCAwIDEgMCAwIDI4OHptMC0xMDBhMjAgMjAgMCAxIDEgMCA0MCAyMCAyMCAwIDEgMSAwLTQwem0wLTE0MGM4LjggMCAxNiA3LjIgMTYgMTZsMCA4MGMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTgwYzAtOC44IDcuMi0xNiAxNi0xNnoiXQogICAgfTsKICAgIGZhUGVyc29uQXJyb3dVcEZyb21MaW5lID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1hcnJvdy11cC1mcm9tLWxpbmUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUzOSIsICJNMTkyLTMyYTU2IDU2IDAgMSAxIDAgMTEyIDU2IDU2IDAgMSAxIDAtMTEyek0zMTguMyAyOTkuMWwtNDYuMy02Mi40IDAgMjQzLjMgMjcyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgNTQ0Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDgwIDAgMC0yNDMuMy00Ni4zIDYyLjRjLTEwLjUgMTQuMi0zMC42IDE3LjItNDQuOCA2LjZzLTE3LjItMzAuNi02LjYtNDQuOGw3MC41LTk1QzExMCAxMzIgMTQ5LjcgMTEyIDE5MiAxMTJzODIgMjAgMTA3LjIgNTMuOWw3MC41IDk1YzEwLjUgMTQuMiA3LjYgMzQuMi02LjYgNDQuOHMtMzQuMiA3LjYtNDQuOC02LjZ6TTIwOCA0ODBsMC0xMjhjMC04LjgtNy4yLTE2LTE2LTE2cy0xNiA3LjItMTYgMTZsMCAxMjggMzIgMHpNNTY2LjYgMTAyLjZjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwTDQ5NiA3Ny4zIDQ5NiAyMjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xNDYuNy0yNS40IDI1LjRjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwcy0xMi41LTMyLjggMC00NS4zbDgwLTgwYzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDgwIDgwYzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zeiJdCiAgICB9OwogICAgZmFOb3RFcXVhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJub3QtZXF1YWwiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjUzZSIsICJNMzc4LjYgODEuOGM5LjgtMTQuNyA1LjgtMzQuNi04LjktNDQuNHMtMzQuNi01LjgtNDQuNCA4LjlMMjcwLjkgMTI4IDMyIDEyOGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwxOTYuMiAwLTg1LjMgMTI4LTExMC45IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNjguMiAwLTMwLjggNDYuMmMtOS44IDE0LjctNS44IDM0LjYgOC45IDQ0LjRzMzQuNiA1LjggNDQuNC04LjlMMTc3LjEgMzg0IDQxNiAzODRjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTE5Ni4yIDAgODUuMy0xMjggMTEwLjkgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNjguMiAwIDMwLjgtNDYuMnoiXQogICAgfTsKICAgIGZhVHJhaW5UcmFtID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRyYWluLXRyYW0iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjg2NTBdLCAiZTViNCIsICJNMCA4QzAtNS4zIDEwLjctMTYgMjQtMTZsMzM2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCAzMmMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTgtMTIwIDAgMCA2NCA0MCAwYzUzIDAgOTYgNDMgOTYgOTZsMCAxNjBjMCAzMS4yLTE0LjkgNTktMzggNzYuNWw2NC4zIDc2YzguNiAxMC4xIDcuMyAyNS4zLTIuOCAzMy44cy0yNS4zIDcuMy0zMy44LTIuOGwtNzQuNi04OC4xYy0zLjYgLjQtNy4zIC42LTExLjEgLjZsLTEyOCAwYy0zLjggMC03LjUtLjItMTEuMS0uNkw0Mi4zIDUzNS41Yy04LjYgMTAuMS0yMy43IDExLjQtMzMuOCAyLjhzLTExLjQtMjMuNy0yLjgtMzMuOGw2NC4zLTc2QzQ2LjkgNDExIDMyIDM4My4yIDMyIDM1MmwwLTE2MGMwLTUzIDQzLTk2IDk2LTk2bDQwIDAgMC02NC0xMjAgMCAwIDhjMCAxMy4zLTEwLjcgMjQtMjQgMjRTMCA1My4zIDAgNDBMMCA4ek0xMjggMTYwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMybDEyOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMzJjMC0xNy43LTE0LjMtMzItMzItMzJsLTEyOCAwem0zMiAxOTJhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHptOTYgMzJhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFQbGFuZURlcGFydHVyZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwbGFuZS1kZXBhcnR1cmUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjg3NDddLCAiZjViMCIsICJNMzcyIDE0My45TDE3Mi43IDQwLjJjLTgtNC4xLTE3LjMtNC44LTI1LjctMS43bC00MS4xIDE1Yy0xMC4zIDMuNy0xMy44IDE2LjQtNy4xIDI1TDIwMC4zIDIwNi40IDEwMC4xIDI0Mi44IDQwIDIwNi4yYy02LjItMy44LTEzLjgtNC41LTIwLjctMi4xTDMgMjEwLjFjLTkuNCAzLjQtMTMuNCAxNC41LTguMyAyMy4xbDUzLjYgOTEuOGMxNS42IDI2LjcgNDguMSAzOC40IDc3LjEgMjcuOGwxMi45LTQuNyAwIDAgMzk4LjQtMTQ1YzI5LjEtMTAuNiA0NC00Mi43IDMzLjUtNzEuOHMtNDIuNy00NC03MS44LTMzLjVMMzcyIDE0My45ek0zMi4yIDQ0OGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmw1MTIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNTEyIDB6Il0KICAgIH07CiAgICBmYVJpZ2h0VG9CcmFja2V0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJpZ2h0LXRvLWJyYWNrZXQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsic2lnbi1pbi1hbHQiXSwgImYyZjYiLCAiTTM0NSAyNzNjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlMMjAxIDk1Yy02LjktNi45LTE3LjItOC45LTI2LjItNS4yUzE2MCAxMDIuMyAxNjAgMTEybDAgODAtMTEyIDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgMzJjMCAyNi41IDIxLjUgNDggNDggNDhsMTEyIDAgMCA4MGMwIDkuNyA1LjggMTguNSAxNC44IDIyLjJzMTkuMyAxLjcgMjYuMi01LjJMMzQ1IDI3M3ptNyAxNDNjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNjQgMGM1MyAwIDk2LTQzIDk2LTk2bDAtMjU2YzAtNTMtNDMtOTYtOTYtOTZsLTY0IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDI1NmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtNjQgMHoiXQogICAgfTsKICAgIGZhU2lnbkluQWx0ID0gZmFSaWdodFRvQnJhY2tldDsKICAgIGZhU2RDYXJkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNkLWNhcmQiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjdjMiIsICJNMzg0IDY0YzAtMzUuMy0yOC43LTY0LTY0LTY0TDEyNS4zIDBDMTA4LjMgMCA5MiA2LjcgODAgMTguN0wxOC43IDgwQzYuNyA5MiAwIDEwOC4zIDAgMTI1LjNMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjU2IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zODR6TTE2MCA4OGwwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNDhjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNHptODggMGwwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNDhjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNHptODggMGwwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNDhjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNHoiXQogICAgfTsKICAgIGZhSG91c2VDaXJjbGVFeGNsYW1hdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VzZS1jaXJjbGUtZXhjbGFtYXRpb24iLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTUwYSIsICJNNDk2IDU0NGExNDQgMTQ0IDAgMSAxIDAtMjg4IDE0NCAxNDQgMCAxIDEgMCAyODh6TTI2OC42IDYuNWMxMi4yLTkuMyAyOS43LTguNyA0MS4yIDJsMjE3LjYgMjAyYy0xMC4yLTEuNy0yMC43LTIuNi0zMS4zLTIuNi03OC42IDAtMTQ2LjEgNDcuMi0xNzUuOCAxMTQuOC01LjEtMS44LTEwLjUtMi44LTE2LjItMi44bC0zMiAwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDk2IDkxIDBjNi4xIDE3LjMgMTQuNiAzMy40IDI1LjEgNDhMMTQ0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0xNzYtMTYgMGMtMTMuMiAwLTI1LTguMS0yOS44LTIwLjNzLTEuNi0yNi4yIDgtMzUuMWwyMjQtMjA4IDIuNC0yek00OTYgNDQ0YTIwIDIwIDAgMSAwIDAgNDAgMjAgMjAgMCAxIDAgMC00MHptMC0xNDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDgwYzAgOC44IDcuMiAxNiAxNiAxNiA4LjggMCAxNi03LjIgMTYtMTZsMC04MGMwLTguOC03LjItMTYtMTYtMTZ6Il0KICAgIH07CiAgICBmYVNoZWtlbFNpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2hla2VsLXNpZ24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs4MzYyLCAiaWxzIiwgInNoZWtlbCIsICJzaGVxZWwiLCAic2hlcWVsLXNpZ24iXSwgImYyMGIiLCAiTTMyIDMyQzE0LjMgMzIgMCA0Ni4zIDAgNjRMMCA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTM1MiAxMjggMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDE2MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTYwYzAtNzAuNy01Ny4zLTEyOC0xMjgtMTI4TDMyIDMyek0zMjAgNDgwYzcwLjcgMCAxMjgtNTcuMyAxMjgtMTI4bDAtMjg4YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMjg4YzAgMzUuMy0yOC43IDY0LTY0IDY0bC0xMjggMCAwLTIyNGMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDI1NmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxNjAgMHoiXQogICAgfTsKICAgIGZhSWxzID0gZmFTaGVrZWxTaWduOwogICAgZmFTaGVrZWwgPSBmYVNoZWtlbFNpZ247CiAgICBmYVNoZXFlbCA9IGZhU2hla2VsU2lnbjsKICAgIGZhU2hlcWVsU2lnbiA9IGZhU2hla2VsU2lnbjsKICAgIGZhUmFkaW8gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicmFkaW8iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgyNTFdLCAiZjhkNyIsICJNNDk0LjggMTVjMTIuNy0zLjcgMjAtMTcuMSAxNi4zLTI5LjhTNDk0LTM0LjggNDgxLjMtMzFMNTEuOCA5NC45QzQyLjQgOTcuNiAzMy45IDEwMi4xIDI2LjYgMTA4IDEwLjUgMTE5LjcgMCAxMzguNiAwIDE2MEwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzODQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI1NmMwLTM1LjMtMjguNy02NC02NC02NEwyMTguNSA5NiA0OTQuOCAxNXpNMzY4IDIwOGE4MCA4MCAwIDEgMSAwIDE2MCA4MCA4MCAwIDEgMSAwLTE2MHpNNjQgMjQ4YzAtMTMuMyAxMC43LTI0IDI0LTI0bDExMiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0TDg4IDI3MmMtMTMuMyAwLTI0LTEwLjctMjQtMjR6bTAgOTZjMC0xMy4zIDEwLjctMjQgMjQtMjRsMTEyIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRMODggMzY4Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNHoiXQogICAgfTsKICAgIGZhSGFuZERvdHMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1kb3RzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImFsbGVyZ2llcyJdLCAiZjQ2MSIsICJNMjg4IDMyYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMjA4YzAgOC44LTcuMiAxNi0xNiAxNnMtMTYtNy4yLTE2LTE2bDAtMTc2YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMjcyYzAgMS41IDAgMy4xIC4xIDQuNkw2Ny42IDI4M2MtMTYtMTUuMi00MS4zLTE0LjYtNTYuNiAxLjRTLTMuNiAzMjUuNyAxMi40IDM0MUwxMjQuOCA0NDhjNDMuMSA0MS4xIDEwMC40IDY0IDE2MCA2NGwxOS4yIDBjOTcuMiAwIDE3Ni03OC44IDE3Ni0xNzZsMC0yMDhjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAxMTJjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC0xNzZjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAxNzZjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC0yMDh6TTIwMCAzNTJhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHptMTIwLTU2YTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHptNDAgODhhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHptLTg4IDI0YTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHoiXQogICAgfTsKICAgIGZhQWxsZXJnaWVzID0gZmFIYW5kRG90czsKICAgIGZhQm9va1NrdWxsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvb2stc2t1bGwiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiYm9vay1kZWFkIl0sICJmNmI3IiwgIk05NiA1MTJsMzIwIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsMC02Ni43YzE4LjYtNi42IDMyLTI0LjQgMzItNDUuM2wwLTI4OGMwLTI2LjUtMjEuNS00OC00OC00OEw5NiAwQzQzIDAgMCA0MyAwIDk2TDAgNDE2YzAgNTMgNDMgOTYgOTYgOTZ6TTY0IDQxNmMwLTE3LjcgMTQuMy0zMiAzMi0zMmwyNTYgMCAwIDY0LTI1NiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnpNMjcyIDE2My4ybDAgMTIuOGMwIDguOC03LjIgMTYtMTYgMTZsLTY0IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTEyLjhjLTE5LjQtMTEuNy0zMi0zMC4zLTMyLTUxLjIgMC0zNS4zIDM1LjgtNjQgODAtNjRzODAgMjguNyA4MCA2NGMwIDIwLjktMTIuNiAzOS41LTMyIDUxLjJ6TTIwOCAxMTJhMTYgMTYgMCAxIDAgLTMyIDAgMTYgMTYgMCAxIDAgMzIgMHptNDggMTZhMTYgMTYgMCAxIDAgMC0zMiAxNiAxNiAwIDEgMCAwIDMyem03NC4yIDk1LjdjNC42IDEwLjEgLjEgMjEuOS05LjkgMjYuNWwtNDcuOSAyMS44IDQ3LjkgMjEuOGMxMC4xIDQuNiAxNC41IDE2LjQgOS45IDI2LjVzLTE2LjQgMTQuNS0yNi41IDkuOUwyMjQgMjk0IDE0NC4zIDMzMC4yYy0xMC4xIDQuNi0yMS45IC4xLTI2LjUtOS45cy0uMS0yMS45IDkuOS0yNi41bDQ3LjktMjEuOC00Ny45LTIxLjhjLTEwLjEtNC42LTE0LjUtMTYuNC05LjktMjYuNXMxNi40LTE0LjUgMjYuNS05LjlMMjI0IDI1MCAzMDMuNyAyMTMuOGMxMC4xLTQuNiAyMS45LS4xIDI2LjUgOS45eiJdCiAgICB9OwogICAgZmFCb29rRGVhZCA9IGZhQm9va1NrdWxsOwogICAgZmFVbmxvY2tLZXlob2xlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVubG9jay1rZXlob2xlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbInVubG9jay1hbHQiXSwgImYxM2UiLCAiTTE5MiAzMmMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCA2NCAxOTIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDIyNGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMjI0YzAtMzUuMyAyOC43LTY0IDY0LTY0bDAtNjRjMC03MC43IDU3LjMtMTI4IDEyOC0xMjggNjMuNSAwIDExNi4xIDQ2LjEgMTI2LjIgMTA2LjcgMi45IDE3LjQtOC44IDMzLjktMjYuMyAzNi45cy0zMy45LTguOC0zNi45LTI2LjNDMjUwIDU1LjEgMjIzLjcgMzIgMTkyIDMyem00MCAzMjhjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTgwIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsODAgMHoiXQogICAgfTsKICAgIGZhVW5sb2NrQWx0ID0gZmFVbmxvY2tLZXlob2xlOwogICAgZmFGaWxlQXJyb3dVcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLWFycm93LXVwIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbImZpbGUtdXBsb2FkIl0sICJmNTc0IiwgIk0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwyMTMuNSAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDM2NS4zIDEyNS4zYzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNMMzg0IDQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6bTIwOC01LjVsMCA5My41YzAgMTMuMyAxMC43IDI0IDI0IDI0TDMyNS41IDE3NiAyMDggNTguNXpNMjA5IDI2M2MtOS40LTkuNC0yNC42LTkuNC0zMy45IDBsLTY0IDY0Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBsMjMtMjMgMCA4Ni4xYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC04Ni4xIDIzIDIzYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNjQtNjR6Il0KICAgIH07CiAgICBmYUZpbGVVcGxvYWQgPSBmYUZpbGVBcnJvd1VwOwogICAgZmFGYWNlR3JpblRlYXJzMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWdyaW4tdGVhcnMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjg1MTQsICJncmluLXRlYXJzIl0sICJmNTg4IiwgIk01NTQuOCAyMDMuNGwxNi4zIDIuM0M1NDcuNyA4OC40IDQ0NC4yIDAgMzIwIDBTOTIuMyA4OC40IDY4LjkgMjA1LjdsMTYuMy0yLjNjMzctNS4zIDY4LjYgMjYuNCA2My40IDYzLjRsLTYuNyA0Ni43Yy00LjEgMjktMjEuNiA1My4yLTQ1LjggNjYuOCA0My43IDc4LjUgMTI3LjYgMTMxLjcgMjIzLjggMTMxLjdzMTgwLjEtNTMuMSAyMjMuOC0xMzEuN2MtMjQuMS0xMy41LTQxLjYtMzcuOC00NS44LTY2LjhsLTYuNy00Ni43Yy01LjMtMzcgMjYuNC02OC42IDYzLjQtNjMuNHpNNDcwLjMgMzI2LjlDNDQ3LjkgMzg4LjIgMzg5LjEgNDMyIDMyMCA0MzJTMTkyLjEgMzg4LjIgMTY5LjcgMzI2LjljLTQuMy0xMS44IDcuNy0yMS44IDE5LjYtMTguMSAzOS4yIDEyLjIgODMuNyAxOS4xIDEzMC43IDE5LjFzOTEuNS02LjkgMTMwLjctMTkuMWMxMS45LTMuNyAyMy45IDYuMyAxOS42IDE4LjF6TTIxMiAyMDhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0zNy42IDMwLjQtNjggNjgtNjhzNjggMzAuNCA2OCA2OGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTE1LjUtMTIuNS0yOC0yOC0yOHMtMjggMTIuNS0yOCAyOHptMTg4LTI4Yy0xNS41IDAtMjggMTIuNS0yOCAyOGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTM3LjYgMzAuNC02OCA2OC02OHM2OCAzMC40IDY4IDY4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMTUuNS0xMi41LTI4LTI4LTI4ek02NDAgMzAwLjZjMC0yNS42LTE4LjgtNDcuMy00NC4xLTUwLjlMNTQ5LjEgMjQzYy0xMC42LTEuNS0xOS42IDcuNS0xOC4xIDE4LjFsNi43IDQ2LjdjMy42IDI1LjMgMjUuMyA0NC4xIDUwLjkgNDQuMSAyOC40IDAgNTEuNC0yMyA1MS40LTUxLjR6bS02NDAgMEMwIDMyOSAyMyAzNTIgNTEuNCAzNTIgNzcgMzUyIDk4LjcgMzMzLjIgMTAyLjMgMzA3LjlsNi43LTQ2LjdjMS41LTEwLjYtNy41LTE5LjYtMTguMS0xOC4xbC00Ni43IDYuN0MxOC44IDI1My4zIDAgMjc1IDAgMzAwLjZ6Il0KICAgIH07CiAgICBmYUdyaW5UZWFyczIgPSBmYUZhY2VHcmluVGVhcnMyOwogICAgZmFQZW5Ub1NxdWFyZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVuLXRvLXNxdWFyZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJlZGl0Il0sICJmMDQ0IiwgIk00NzEuNiAyMS43Yy0yMS45LTIxLjktNTcuMy0yMS45LTc5LjIgMEwzNjggNDYuMSA0NjUuOSAxNDQgNDkwLjMgMTE5LjZjMjEuOS0yMS45IDIxLjktNTcuMyAwLTc5LjJMNDcxLjYgMjEuN3ptLTI5OS4yIDIyMGMtNi4xIDYuMS0xMC44IDEzLjYtMTMuNSAyMS45bC0yOS42IDg4LjhjLTIuOSA4LjYtLjYgMTguMSA1LjggMjQuNnMxNS45IDguNyAyNC42IDUuOGw4OC44LTI5LjZjOC4yLTIuNyAxNS43LTcuNCAyMS45LTEzLjVMNDMyIDE3Ny45IDMzNC4xIDgwIDE3Mi40IDI0MS43ek05NiA2NEM0MyA2NCAwIDEwNyAwIDE2MEwwIDQxNmMwIDUzIDQzIDk2IDk2IDk2bDI1NiAwYzUzIDAgOTYtNDMgOTYtOTZsMC05NmMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDk2YzAgMTcuNy0xNC4zIDMyLTMyIDMyTDk2IDQ0OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0yNTZjMC0xNy43IDE0LjMtMzIgMzItMzJsOTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkw5NiA2NHoiXQogICAgfTsKICAgIGZhRWRpdDIgPSBmYVBlblRvU3F1YXJlMjsKICAgIGZhRWFydGhFdXJvcGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZWFydGgtZXVyb3BlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImdsb2JlLWV1cm9wZSJdLCAiZjdhMiIsICJNMjU2LjIgNDhjMTE0LjggLjEgMjA3LjggOTMuMiAyMDcuOCAyMDggMCAyMi4xLTMuNCA0My40LTkuOCA2My40LTIgLjQtNC4xIC42LTYuMiAuNmwtMi43IDBjLTguNSAwLTE2LjYtMy40LTIyLjYtOS40bC0yOS4zLTI5LjNjLTYtNi05LjQtMTQuMS05LjQtMjIuNmwwLTUwLjdjMC04LjggNy4yLTE2IDE2LTE2czE2LTcuMiAxNi0xNi03LjItMTYtMTYtMTZsLTI0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0cy0xMC43IDI0LTI0IDI0bC01NiAwYy04LjggMC0xNiA3LjItMTYgMTZzLTcuMiAxNi0xNiAxNmwtMjUuNCAwYy0xMi41IDAtMjIuNi0xMC4xLTIyLjYtMjIuNiAwLTYgMi40LTExLjggNi42LTE2bDcwLjEtNzAuMWMyLjEtMi4xIDMuMy01IDMuMy04IDAtNi4yLTUuMS0xMS4zLTExLjMtMTEuM2wtMTQuMSAwYy0xMi41IDAtMjIuNi0xMC4xLTIyLjYtMjIuNiAwLTYgMi40LTExLjggNi42LTE2bDIzLjEtMjMuMWMuOC0uOCAxLjYtMS41IDIuNS0yLjJ6TTQzOC40IDM1Ni4xYy0zMi44IDU5LjYtOTMuOSAxMDEuNC0xNjUuMiAxMDcuMi0uNy0yLjMtMS4xLTQuOC0xLjEtNy4zIDAtMTMuMy0xMC43LTI0LTI0LTI0bC0yNi43IDBjLTguNSAwLTE2LjYtMy40LTIyLjYtOS40bC0yOS4zLTI5LjNjLTYtNi05LjQtMTQuMS05LjQtMjIuNmwwLTY2LjdjMC0xNy43IDE0LjMtMzIgMzItMzJsOTguNyAwYzguNSAwIDE2LjYgMy40IDIyLjYgOS40bDI5LjMgMjkuM2M2IDYgMTQuMSA5LjQgMjIuNiA5LjRsNS41IDBjOC41IDAgMTYuNiAzLjQgMjIuNiA5LjRsMTYgMTZjNC4yIDQuMiAxMCA2LjYgMTYgNi42IDQuOCAwIDkuMyAxLjUgMTMgNC4xek0yNTYgNTEybDI2LjItMS4zYy04LjYgLjktMTcuMyAxLjMtMjYuMiAxLjN6bTI2LjItMS4zQzQxMS4zIDQ5Ny42IDUxMiAzODguNiA1MTIgMjU2IDUxMiAxMTQuNiAzOTcuNCAwIDI1NiAwbDAgMEMxMTQuNiAwIDAgMTE0LjYgMCAyNTYgMCAzODMuNSA5My4yIDQ4OS4zIDIxNS4zIDUwOC44IDIyOC41IDUxMC45IDI0Mi4xIDUxMiAyNTYgNTEyek0xODcuMyAxMjMuM2wtMzIgMzJjLTYuMiA2LjItMTYuNCA2LjItMjIuNiAwcy02LjItMTYuNCAwLTIyLjZsMzItMzJjNi4yLTYuMiAxNi40LTYuMiAyMi42IDBzNi4yIDE2LjQgMCAyMi42eiJdCiAgICB9OwogICAgZmFHbG9iZUV1cm9wZSA9IGZhRWFydGhFdXJvcGU7CiAgICBmYUZhY2VHcmluQmVhbVN3ZWF0MiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWdyaW4tYmVhbS1zd2VhdCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyODUxNywgImdyaW4tYmVhbS1zd2VhdCJdLCAiZjU4MyIsICJNNTQ2LjItLjFjMTQuNyAxNy44IDI5LjggNDAuMSAyOS44IDY0LjEgMCAzNi40LTI3LjYgNjQtNjQgNjRzLTY0LTI3LjYtNjQtNjRjMC0yNCAxNS4yLTQ2LjMgMjkuOC02NC4xIDguOC0xMC43IDE4LjUtMjAuOCAyOS0zMCAzLTIuNiA3LjQtMi42IDEwLjQgMCAxMC41IDkuMSAyMC4xIDE5LjMgMjkgMzB6TTI4OCAwYzQyLjUgMCA4Mi42IDEwLjQgMTE3LjggMjguNy0zLjYgMTAuOS01LjggMjIuNy01LjggMzUuMyAwIDYyLjkgNDkuMSAxMTIgMTEyIDExMiA2LjQgMCAxMi43LS41IDE4LjgtMS41IDguNiAyNS42IDEzLjIgNTMgMTMuMiA4MS41IDAgMTQxLjQtMTE0LjYgMjU2LTI1NiAyNTZTMzIgMzk3LjQgMzIgMjU2IDE0Ni42IDAgMjg4IDB6TTQxOC43IDMwOC45QzM3OS41IDMyMS4xIDMzNS4xIDMyOCAyODggMzI4cy05MS41LTYuOS0xMzAuNy0xOS4xYy0xMS45LTMuNy0yMy45IDYuMy0xOS42IDE4LjEgMjIuNCA2MS4zIDgxLjMgMTA1LjEgMTUwLjMgMTA1LjFzMTI3LjktNDMuOCAxNTAuMy0xMDUuMWM0LjMtMTEuOC03LjctMjEuOC0xOS42LTE4LjF6TTIwOCAxODBjMTUuNSAwIDI4IDEyLjUgMjggMjhsMCA4YzAgMTEgOSAyMCAyMCAyMHMyMC05IDIwLTIwbDAtOGMwLTM3LjYtMzAuNC02OC02OC02OHMtNjggMzAuNC02OCA2OGwwIDhjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC04YzAtMTUuNSAxMi41LTI4IDI4LTI4em0xMzIgMjhjMC0xNS41IDEyLjUtMjggMjgtMjhzMjggMTIuNSAyOCAyOGwwIDhjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC04YzAtMzcuNi0zMC40LTY4LTY4LTY4cy02OCAzMC40LTY4IDY4bDAgOGMwIDExIDkgMjAgMjAgMjBzMjAtOSAyMC0yMGwwLTh6Il0KICAgIH07CiAgICBmYUdyaW5CZWFtU3dlYXQyID0gZmFGYWNlR3JpbkJlYW1Td2VhdDI7CiAgICBmYUNpcmNsZUhhbGZTdHJva2UgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLWhhbGYtc3Ryb2tlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTY4MCwgImFkanVzdCJdLCAiZjA0MiIsICJNNDQ4IDI1NmMwLTEwNi04Ni0xOTItMTkyLTE5MmwwIDM4NGMxMDYgMCAxOTItODYgMTkyLTE5MnpNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHoiXQogICAgfTsKICAgIGZhQWRqdXN0ID0gZmFDaXJjbGVIYWxmU3Ryb2tlOwogICAgZmFQZXJzb25NaWxpdGFyeVRvUGVyc29uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1taWxpdGFyeS10by1wZXJzb24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTU0YyIsICJNNzEgMTIuNWMtOC42IDEtMTUgOC4yLTE1IDE2LjggMCA5LjMgNy41IDE2LjggMTYuNyAxNi45bDExMS40IDBjOC44LS4xIDE1LjktNy4yIDE1LjktMTZMMjAwIDE2YzAtOS41LTguMy0xNy0xNy44LTE1LjlMNzEgMTIuNXpNMTg5LjUgNzguMWwtMTIyLjkgMGMtMS42IDUuNy0yLjUgMTEuNy0yLjUgMTcuOSAwIDM1LjMgMjguNyA2NCA2NCA2NHM2NC0yOC43IDY0LTY0YzAtNi4yLS45LTEyLjItMi41LTE3Ljl6TTMyIDI1NmwwIDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMybDEyOCAwYzEuOCAwIDMuNS0uMSA1LjItLjRMNTMgMjA4LjZDNDAuMSAyMjAuMyAzMiAyMzcuMiAzMiAyNTZ6bTE5MC4yIDQyLjVjMS4xLTMuMyAxLjgtNi44IDEuOC0xMC41bDAtMzJjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTY0IDBjLTMuNyAwLTcuNCAuMy0xMC45IC45TDIyMi4yIDI5OC41ek0zODQgMTYwYTY0IDY0IDAgMSAwIDAtMTI4IDY0IDY0IDAgMSAwIDAgMTI4em0tMzIgMzJjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTI4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0zMmMwLTM1LjMtMjguNy02NC02NC02NGwtNjQgMHpNMjE1LjggNDUwLjFjNS4yLTQuNiA4LjItMTEuMSA4LjItMTguMXMtMy0xMy41LTguMi0xOC4xbC02NC01NmMtNy4xLTYuMi0xNy4xLTcuNy0yNS43LTMuOFMxMTIgMzY2LjYgMTEyIDM3NmwwIDMyLTg4IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsODggMCAwIDMyYzAgOS40IDUuNSAxOCAxNC4xIDIxLjlzMTguNiAyLjQgMjUuNy0zLjhsNjQtNTZ6TTI4OCA0MzEuOWMwIDYuOSAzIDEzLjUgOC4xIDE4LjFsNjQgNTYuNGM3LjEgNi4yIDE3LjEgNy44IDI1LjcgMy45UzQwMCA0OTcuOCA0MDAgNDg4LjRsMC0zMi40IDg4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTg4IDAgMC0zMmMwLTkuNC01LjUtMTgtMTQuMS0yMS45cy0xOC42LTIuNC0yNS43IDMuOGwtNjQgNTZjLTUuMiA0LjUtOC4yIDExLjEtOC4yIDE4eiJdCiAgICB9OwogICAgZmFUYWJsZUNlbGxzQ29sdW1uTG9jayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWJsZS1jZWxscy1jb2x1bW4tbG9jayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNjc4IiwgIk0yNTYgMjI0bDAgMTkyIDY0IDAgMC0xOTItNjQgMHptMjU2LTc5Yy00Ni43IDUuOC04NS42IDM2LjgtMTAyLjcgNzlsLTI1LjMgMCAwIDkwLjhjLTEwLjEgMTUuMi0xNiAzMy40LTE2IDUzLjFsMCA5NmMwIDUuNSAuNSAxMC45IDEuMyAxNi4xTDEyOCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDY0IDk2YzAtMzUuMyAyOC43LTY0IDY0LTY0bDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgNDl6TTEyOCAyMjRsMCAxOTIgNjQgMCAwLTE5Mi02NCAwem00MzIgNDguMWMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDQ3LjkgNjQgMCAwLTQ3Ljl6TTQxNiAzNjhjMC0yMC45IDEzLjQtMzguNyAzMi00NS4zbDAtNTAuNmMwLTQ0LjIgMzUuOC04MCA4MC04MHM4MCAzNS44IDgwIDgwbDAgNTAuNmMxOC42IDYuNiAzMiAyNC40IDMyIDQ1LjNsMCA5NmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTI4IDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtOTZ6Il0KICAgIH07CiAgICBmYVRydWNrRmllbGRVbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cnVjay1maWVsZC11biIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNThlIiwgIk05NiAzMkM2MC43IDMyIDMyIDYwLjcgMzIgOTZsMCAzMmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA5NmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwwIDQ4YzAgMjEuMSAxMy43IDM5LjEgMzIuNiA0NS41LS40IDMuNC0uNiA3LS42IDEwLjUgMCA0OC42IDM5LjQgODggODggODhzODgtMzkuNCA4OC04OGMwLTIuNy0uMS01LjQtLjQtOGwxNDQuNyAwYy0uMiAyLjYtLjQgNS4zLS40IDggMCA0OC42IDM5LjQgODggODggODhzODgtMzkuNCA4OC04OGMwLTIuNy0uMS01LjQtLjQtOGwuNCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtNjRjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTI0LjcgMC0xLjctNC4yLTQzLjgtMTA2LjNjLTEyLjMtMzAtNDEuNi00OS41LTc0LTQ5LjVsLTQwLjQgMEMzNjQuNCA0NC45IDM0My43IDMyIDMyMCAzMkw5NiAzMnpNMzg0IDIyNGwwLTk2IDMxLjkgMGM2LjUgMCAxMi4zIDMuOSAxNC44IDkuOWwzNS40IDg2LjEtODIuMSAwek0xNTIgMzUyYTQwIDQwIDAgMSAxIDAgODAgNDAgNDAgMCAxIDEgMC04MHptMjgwIDQwYTQwIDQwIDAgMSAxIDgwIDAgNDAgNDAgMCAxIDEgLTgwIDB6TTI1Ni42IDEzMi45bDI3LjQgNDEgMC0yOS45YzAtMTEgOS0yMCAyMC0yMHMyMCA5IDIwIDIwbDAgOTZjMCA4LjgtNS44IDE2LjYtMTQuMiAxOS4xcy0xNy41LS43LTIyLjQtOGwtMjcuNC00MSAwIDI5LjljMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOTZjMC04LjggNS44LTE2LjYgMTQuMi0xOS4xczE3LjUgLjcgMjIuNCA4ek0xMzIgMTQ0bDAgNjRjMCA2LjYgNS40IDEyIDEyIDEyczEyLTUuNCAxMi0xMmwwLTY0YzAtMTEgOS0yMCAyMC0yMHMyMCA5IDIwIDIwbDAgNjRjMCAyOC43LTIzLjMgNTItNTIgNTJzLTUyLTIzLjMtNTItNTJsMC02NGMwLTExIDktMjAgMjAtMjBzMjAgOSAyMCAyMHoiXQogICAgfTsKICAgIGZhQ2xvY2syID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNsb2NrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MzM5LCAiY2xvY2stZm91ciJdLCAiZjAxNyIsICJNMjU2IDBhMjU2IDI1NiAwIDEgMSAwIDUxMiAyNTYgMjU2IDAgMSAxIDAtNTEyek0yMzIgMTIwbDAgMTM2YzAgOCA0IDE1LjUgMTAuNyAyMGw5NiA2NGMxMSA3LjQgMjUuOSA0LjQgMzMuMy02LjdzNC40LTI1LjktNi43LTMzLjNMMjgwIDI0My4yIDI4MCAxMjBjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjR6Il0KICAgIH07CiAgICBmYUNsb2NrRm91cjIgPSBmYUNsb2NrMjsKICAgIGZhQm9vayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib29rIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI4MjEyXSwgImYwMmQiLCAiTTM4NCA1MTJMOTYgNTEyYy01MyAwLTk2LTQzLTk2LTk2TDAgOTZDMCA0MyA0MyAwIDk2IDBMNDAwIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAyODhjMCAyMC45LTEzLjQgMzguNy0zMiA0NS4zbDAgNjYuN2MxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIgMHpNOTYgMzg0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDI1NiAwIDAtNjQtMjU2IDB6bTMyLTIzMmMwIDEzLjMgMTAuNyAyNCAyNCAyNGwxNzYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTc2IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0em0yNCA3MmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNzYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTc2IDB6Il0KICAgIH07CiAgICBmYUZhY2VMYXVnaFdpbmsyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtbGF1Z2gtd2luayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJsYXVnaC13aW5rIl0sICJmNTljIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMTAxLjYgMzE0Yy0zLjctMTMuNyA3LjUtMjYgMjEuNy0yNmwyNjUuNCAwYzE0LjIgMCAyNS40IDEyLjMgMjEuNyAyNi0xOC41IDY4LTgwLjYgMTE4LTE1NC40IDExOFMxMjAgMzgyIDEwMS42IDMxNHpNMTQ0IDE5MmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0xNjQgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBjMC0zMy4xIDI2LjktNjAgNjAtNjBsMTYgMGMzMy4xIDAgNjAgMjYuOSA2MCA2MCAwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjAtOS0yMC0yMC0yMGwtMTYgMGMtMTEgMC0yMCA5LTIwIDIweiJdCiAgICB9OwogICAgZmFMYXVnaFdpbmsyID0gZmFGYWNlTGF1Z2hXaW5rMjsKICAgIGZhQ2xvdWRNZWF0YmFsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjbG91ZC1tZWF0YmFsbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNzNiIiwgIk0wIDIyNGMwIDUzIDQzIDk2IDk2IDk2bDI2LjkgMGMzLjUtMTIuMSAxMC4xLTIzLjMgMTkuMi0zMi40bDEuNC0xLjRjMTUtMTUgMzUuMy0yMi45IDU2LjEtMjIuMiAxNC4yLTE1LjEgMzQuMi0yMy45IDU1LjQtMjMuOWwyIDBjMjEuMSAwIDQxLjEgOC44IDU1LjQgMjMuOSAyMC44LS42IDQxLjEgNy4zIDU2LjEgMjIuMmwxLjQgMS40YzkuMiA5LjIgMTUuNyAyMC40IDE5LjIgMzIuNGwyNi45IDBjNTMgMCA5Ni00MyA5Ni05NnMtNDMtOTYtOTYtOTZjLS41IDAtMS4xIDAtMS42IDAgMS4xLTUuMiAxLjYtMTAuNSAxLjYtMTYgMC00NC4yLTM1LjgtODAtODAtODAtMjQuMyAwLTQ2LjEgMTAuOS02MC44IDI4LTE4LjctMzUuNy01Ni4xLTYwLTk5LjItNjAtNjEuOSAwLTExMiA1MC4xLTExMiAxMTIgMCA3LjEgLjcgMTQuMSAxLjkgMjAuOC0zOC4zIDEyLjYtNjUuOSA0OC43LTY1LjkgOTEuMnpNMTU2LjUgNDI0LjNjOS41IDYuMyAxNC4yIDE3LjcgMTEuOSAyOC44LTEuOCA5LjIgMSAxOC43IDcuNyAyNS4zbDEuNCAxLjRjNi42IDYuNiAxNi4xIDkuNSAyNS4zIDcuNyAxMS4xLTIuMiAyMi41IDIuNSAyOC44IDExLjkgNS4yIDcuOCAxNCAxMi41IDIzLjMgMTIuNWwyIDBjOS40IDAgMTguMS00LjcgMjMuMy0xMi41IDYuMy05LjUgMTcuNy0xNC4yIDI4LjgtMTEuOSA5LjIgMS44IDE4LjctMSAyNS4zLTcuN2wxLjQtMS40YzYuNi02LjYgOS41LTE2LjEgNy43LTI1LjMtMi4yLTExLjEgMi41LTIyLjUgMTEuOS0yOC44IDcuOC01LjIgMTIuNS0xNCAxMi41LTIzLjNsMC0yYzAtOS40LTQuNy0xOC4xLTEyLjUtMjMuMy05LjUtNi4zLTE0LjItMTcuNy0xMS45LTI4LjggMS44LTkuMi0xLTE4LjctNy43LTI1LjNsLTEuNC0xLjRjLTYuNi02LjYtMTYuMS05LjUtMjUuMy03LjctMTEuMSAyLjItMjIuNS0yLjUtMjguOC0xMS45LTUuMi03LjgtMTQtMTIuNS0yMy4zLTEyLjVsLTIgMGMtOS40IDAtMTguMSA0LjctMjMuMyAxMi41LTYuMyA5LjUtMTcuNyAxNC4yLTI4LjggMTEuOS05LjItMS44LTE4LjcgMS0yNS4zIDcuN2wtMS40IDEuNGMtNi42IDYuNi05LjUgMTYuMS03LjcgMjUuMyAyLjIgMTEuMS0yLjUgMjIuNS0xMS45IDI4LjgtNy44IDUuMi0xMi41IDE0LTEyLjUgMjMuM2wwIDJjMCA5LjQgNC43IDE4LjEgMTIuNSAyMy4zek00OCA0NDhhNDggNDggMCAxIDAgMC05NiA0OCA0OCAwIDEgMCAwIDk2em00MTYgMGE0OCA0OCAwIDEgMCAwLTk2IDQ4IDQ4IDAgMSAwIDAgOTZ6Il0KICAgIH07CiAgICBmYUNoYXJ0QXJlYSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGFydC1hcmVhIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImFyZWEtY2hhcnQiXSwgImYxZmUiLCAiTTMyIDMyYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzM2YzAgOC44IDcuMiAxNiAxNiAxNmw0MDAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkw4MCA0ODBjLTQ0LjIgMC04MC0zNS44LTgwLTgwTDAgNjRDMCA0Ni4zIDE0LjMgMzIgMzIgMzJ6TTI0MCA5NmM2LjcgMCAxMy4xIDIuOCAxNy43IDcuOEwzMjguOCAxODEuMyAzNzUgMTM1YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwbDY0IDY0YzQuNSA0LjUgNyAxMC42IDcgMTdsMCAxMTJjMCAxMy4zLTEwLjcgMjQtMjQgMjRsLTMwNCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTExMmMwLTYgMi4zLTExLjggNi4zLTE2LjJsODgtOTZjNC41LTUgMTEtNy44IDE3LjctNy44eiJdCiAgICB9OwogICAgZmFBcmVhQ2hhcnQgPSBmYUNoYXJ0QXJlYTsKICAgIGZhUnVwaWFoU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJydXBpYWgtc2lnbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMjNkIiwgIk0wIDY0QzAgNDYuMyAxNC4zIDMyIDMyIDMybDgwIDBjNzkuNSAwIDE0NCA2NC41IDE0NCAxNDQgMCA1NC4zLTMwIDEwMS41LTc0LjQgMTI2LjFsNDEgMTM2LjdjNS4xIDE2LjktNC41IDM0LjgtMjEuNSAzOS44cy0zNC44LTQuNS0zOS44LTIxLjVMMTIwLjEgMzE5LjhjLTIuNyAuMS01LjQgLjItOC4xIC4ybC00OCAwIDAgMTI4YzAgMTcuNy0xNC4zIDMyLTMyIDMyUzAgNDY1LjcgMCA0NDhMMCA2NHpNNjQgMjU2bDQ4IDBjNDQuMiAwIDgwLTM1LjggODAtODBzLTM1LjgtODAtODAtODBsLTQ4IDAgMCAxNjB6bTI1Ni0zMmw4MCAwYzYxLjkgMCAxMTIgNTAuMSAxMTIgMTEyUzQ2MS45IDQ0OCA0MDAgNDQ4bC00OCAwIDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0yNTZjMC0xNy43IDE0LjMtMzIgMzItMzJ6bTgwIDE2MGMyNi41IDAgNDgtMjEuNSA0OC00OHMtMjEuNS00OC00OC00OGwtNDggMCAwIDk2IDQ4IDB6Il0KICAgIH07CiAgICBmYVRleHRXaWR0aCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0ZXh0LXdpZHRoIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYwMzUiLCAiTTQwIDBDMTcuOSAwIDAgMTcuOSAwIDQwTDAgOTZjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTMyIDEyOCAwIDAgMTYwLTMyIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMTI4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTMyIDAgMC0xNjAgMTI4IDAgMCAzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtNTZjMC0yMi4xLTE3LjktNDAtNDAtNDBMNDAgMHptNzguNiA0MDYuNmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMGwtNjQgNjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zbDY0IDY0YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTkuNC05LjQgMjI5LjUgMC05LjQgOS40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwbDY0LTY0YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zbC02NC02NGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNsOS40IDkuNC0yMjkuNSAwIDkuNC05LjR6Il0KICAgIH07CiAgICBmYVNhdGVsbGl0ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzYXRlbGxpdGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg3NTJdLCAiZjdiZiIsICJNMTk5IDdjOS40LTkuNCAyNC42LTkuNCAzMy45IDBsODkuNCA4OS40IDU1LTU1YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDQ4IDQ4YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zbC01NSA1NSA4OS40IDg5LjRjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlsLTk2IDk2Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMGwtODkuNC04OS40LTE1LjUgMTUuNWMxMS40IDI0LjYgMTcuOCA1MiAxNy44IDgwLjkgMCAzMS43LTcuNyA2MS41LTIxLjIgODcuOC00LjcgOS0xNi43IDEwLjMtMjMuOCAzLjFsLTk2LjMtOTYuMy02MCA2MGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNsNjAtNjAtOTYuMy05Ni4zYy03LjItNy4yLTUuOS0xOS4yIDMuMS0yMy44IDI2LjMtMTMuNiA1Ni4yLTIxLjIgODcuOC0yMS4yIDI4LjkgMCA1Ni4zIDYuNCA4MC45IDE3LjhMMTkyLjQgMjI2LjMgMTAzIDEzN2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlMMTk5IDd6bTE3IDUwLjlsLTYyLjEgNjIuMSA3Mi40IDcyLjQgNjIuMS02Mi4xLTcyLjQtNzIuNHpNMzkyIDM1OC4xbDYyLjEtNjIuMS03Mi40LTcyLjQtNjIuMSA2Mi4xIDcyLjQgNzIuNHoiXQogICAgfTsKICAgIGZhTWFnbmlmeWluZ0dsYXNzTWludXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFnbmlmeWluZy1nbGFzcy1taW51cyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJzZWFyY2gtbWludXMiXSwgImYwMTAiLCAiTTQxNiAyMDhjMCA0NS45LTE0LjkgODguMy00MCAxMjIuN0w1MDIuNiA0NTcuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMEwzMzAuNyAzNzZDMjk2LjMgNDAxLjEgMjUzLjkgNDE2IDIwOCA0MTYgOTMuMSA0MTYgMCAzMjIuOSAwIDIwOFM5My4xIDAgMjA4IDAgNDE2IDkzLjEgNDE2IDIwOHpNMTM2IDE4NGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNDQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTQ0IDB6Il0KICAgIH07CiAgICBmYVNlYXJjaE1pbnVzID0gZmFNYWduaWZ5aW5nR2xhc3NNaW51czsKICAgIGZhUGVvcGxlR3JvdXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVvcGxlLWdyb3VwIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1MzMiLCAiTTI1NiAwYTY0IDY0IDAgMSAxIDAgMTI4IDY0IDY0IDAgMSAxIDAtMTI4em05NiAzMTJjMCAyNS0xMi43IDQ3LTMyIDU5LjlsMCA5Mi4xYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0zMiAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTkyLjFDMTcyLjcgMzU5IDE2MCAzMzcgMTYwIDMxMmwwLTQwYzAtNTMgNDMtOTYgOTYtOTZzOTYgNDMgOTYgOTZsMCA0MHpNOTYgMzJhNTYgNTYgMCAxIDEgMCAxMTIgNTYgNTYgMCAxIDEgMC0xMTJ6bTE2IDI0MGwwIDMyYzAgMzIuNSAxMi4xIDYyLjEgMzIgODQuN2wwIDc1LjNjMCAxLjIgMCAyLjUgLjEgMy43LTguNSA3LjYtMTkuNyAxMi4zLTMyLjEgMTIuM2wtMzIgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC01Ni42QzEyLjkgMzY0LjQgMCAzNDMuNyAwIDMyMGwwLTMyYzAtNTMgNDMtOTYgOTYtOTYgMTIuNyAwIDI0LjggMi41IDM1LjkgNi45LTEyLjYgMjEuNC0xOS45IDQ2LjQtMTkuOSA3My4xek0zNjggNDY0bDAtNzUuM2MxOS45LTIyLjUgMzItNTIuMiAzMi04NC43bDAtMzJjMC0yNi43LTcuMy01MS42LTE5LjktNzMuMSAxMS4xLTQuNSAyMy4yLTYuOSAzNS45LTYuOSA1MyAwIDk2IDQzIDk2IDk2bDAgMzJjMCAyMy43LTEyLjkgNDQuNC0zMiA1NS40bDAgNTYuNmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMzIgMGMtMTIuMyAwLTIzLjYtNC42LTMyLjEtMTIuMyAwLTEuMiAuMS0yLjUgLjEtMy43ek00MTYgMzJhNTYgNTYgMCAxIDEgMCAxMTIgNTYgNTYgMCAxIDEgMC0xMTJ6Il0KICAgIH07CiAgICBmYVNxdWFyZUJpbmFyeSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtYmluYXJ5IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU2OWIiLCAiTTAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMzIwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2em0xNDQgNGMtMjQuMyAwLTQ0IDE5LjctNDQgNDRsMCA0OGMwIDI0LjMgMTkuNyA0NCA0NCA0NGwzMiAwYzI0LjMgMCA0NC0xOS43IDQ0LTQ0bDAtNDhjMC0yNC4zLTE5LjctNDQtNDQtNDRsLTMyIDB6bS00IDQ0YzAtMi4yIDEuOC00IDQtNGwzMiAwYzIuMiAwIDQgMS44IDQgNGwwIDQ4YzAgMi4yLTEuOCA0LTQgNGwtMzIgMGMtMi4yIDAtNC0xLjgtNC00bDAtNDh6bTE0MC00NGMtMTEgMC0yMCA5LTIwIDIwIDAgOS43IDYuOSAxNy43IDE2IDE5LjZsMCA3Ni40YzAgMTEgOSAyMCAyMCAyMHMyMC05IDIwLTIwbDAtOTZjMC0xMS05LTIwLTIwLTIwbC0xNiAwek0xMzIgMjk2YzAgOS43IDYuOSAxNy43IDE2IDE5LjZsMCA3Ni40YzAgMTEgOSAyMCAyMCAyMHMyMC05IDIwLTIwbDAtOTZjMC0xMS05LTIwLTIwLTIwbC0xNiAwYy0xMSAwLTIwIDktMjAgMjB6bTk2IDI0bDAgNDhjMCAyNC4zIDE5LjcgNDQgNDQgNDRsMzIgMGMyNC4zIDAgNDQtMTkuNyA0NC00NGwwLTQ4YzAtMjQuMy0xOS43LTQ0LTQ0LTQ0bC0zMiAwYy0yNC4zIDAtNDQgMTkuNy00NCA0NHptNDQtNGwzMiAwYzIuMiAwIDQgMS44IDQgNGwwIDQ4YzAgMi4yLTEuOCA0LTQgNGwtMzIgMGMtMi4yIDAtNC0xLjgtNC00bDAtNDhjMC0yLjIgMS44LTQgNC00eiJdCiAgICB9OwogICAgZmFNYXNrc1RoZWF0ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFza3MtdGhlYXRlciIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyNzkxNywgInRoZWF0ZXItbWFza3MiXSwgImY2MzAiLCAiTS01IDExOEwyMy41IDI3OS43YzE0IDc5LjUgNzYuMyAxNDEuOCAxNTUuOCAxNTUuOGwxMi43IDIuMmMtMTYuNS0yOC42LTI3LjEtNjAuNy0zMC42LTk0LjVsLTI0LjEgNC4zYy05LjcgMS43LTE4LjgtNS44LTE2LjktMTUuNSA0LjgtMjQuNyAxOS4xLTQ2LjYgMzkuNy02MC45bDAtNzQuNmMtMS40IC44LTMgMS4zLTQuNyAxLjZsLTYzIDExLjFjLTguNyAxLjUtMTcuMy00LjQtMTUuOS0xMy4xIDMuMS0xOS42IDE4LjQtMzYgMzkuMS0zOS43IDE3LjItMyAzMy45IDMuNSA0NC42IDE1LjhsMC0yMi43YzAtMjIuNSA2LjktNTIuNCAzMi4zLTczLjQgMjYtMjEuNSA2Ny43LTQzLjkgMTI0LjktNTQuMi0zMC41LTE2LjMtODYuMy0zMi0xNjMuOC0xOC40LTgwLjMgMTQuMi0xMjggNTAuMS0xNTAuMSA3Ni4xLTkgMTAuNS0xMC44IDI0LjktOC40IDM4LjV6TTIwOCAxMzguN2wwIDE3NC44YzAgODAuNyA1MC41IDE1Mi45IDEyNi40IDE4MC40TDM2Mi4xIDUwNGMxNC4xIDUuMSAyOS42IDUuMSA0My43IDBMNDMzLjYgNDk0QzUwOS41IDQ2Ni40IDU2MCAzOTQuMyA1NjAgMzEzLjVsMC0xNzQuOGMwLTYuOS0yLjEtMTMuOC03LTE4LjYtMjIuNi0yMi41LTc4LjItNTYtMTY5LTU2cy0xNDYuNCAzMy42LTE2OSA1NmMtNC45IDQuOS03IDExLjctNyAxOC42em02Ni4xIDE4Ny4xYy0xLjQtNyA3LTExIDEyLjctNi42IDI2LjkgMjAuNiA2MC42IDMyLjkgOTcuMiAzMi45czcwLjItMTIuMyA5Ny4yLTMyLjljNS43LTQuNCAxNC4xLS40IDEyLjcgNi42LTEwLjEgNTEuNC01NS41IDkwLjMtMTA5LjkgOTAuM3MtOTkuOC0zOC44LTEwOS45LTkwLjN6bS41LTEwMS41QzI4MS4yIDIwNS41IDI5OSAxOTIgMzIwIDE5MnMzOC45IDEzLjUgNDUuNCAzMi4zYzIuOSA4LjQtNC41IDE1LjctMTMuNCAxNS43bC02NCAwYy04LjggMC0xNi4zLTcuNC0xMy40LTE1Ljd6TTQ4MCAyNDBsLTY0IDBjLTguOCAwLTE2LjMtNy40LTEzLjQtMTUuNyA2LjUtMTguOCAyNC40LTMyLjMgNDUuNC0zMi4zczM4LjkgMTMuNSA0NS40IDMyLjNjMi45IDguNC00LjUgMTUuNy0xMy40IDE1Ljd6Il0KICAgIH07CiAgICBmYVRoZWF0ZXJNYXNrcyA9IGZhTWFza3NUaGVhdGVyOwogICAgZmFDYXJ0UGx1cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYXJ0LXBsdXMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjIxNyIsICJNMCA4QzAtNS4zIDEwLjctMTYgMjQtMTZsNDUuMyAwYzI3LjEgMCA1MC4zIDE5LjQgNTUuMSA0NmwuNCAyIDQxMi43IDBjMjAgMCAzNS4xIDE4LjIgMzEuNCAzNy45TDUzNy44IDIzNS44Yy01LjcgMzAuMy0zMi4xIDUyLjItNjIuOSA1Mi4ybC0zMDMuNiAwIDUuMSAyOC4zYzIuMSAxMS40IDEyIDE5LjcgMjMuNiAxOS43TDQ1NiAzMzZjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTI1NS45IDBjLTM0LjggMC02NC42LTI0LjktNzAuOC01OS4xTDc3LjIgMzguNmMtLjctMy44LTQtNi42LTcuOS02LjZMMjQgMzJDMTAuNyAzMiAwIDIxLjMgMCA4ek0xNjAgNDY0YTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6bTIyNCAwYTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6TTMzNiA3OC40Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDMzLjYtMzMuNiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDMzLjYgMCAwIDMzLjZjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTMzLjYgMzMuNiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0zMy42IDAgMC0zMy42YzAtMTMuMy0xMC43LTI0LTI0LTI0eiJdCiAgICB9OwogICAgZmFIYW5kc0FzbEludGVycHJldGluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kcy1hc2wtaW50ZXJwcmV0aW5nIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbImFtZXJpY2FuLXNpZ24tbGFuZ3VhZ2UtaW50ZXJwcmV0aW5nIiwgImFzbC1pbnRlcnByZXRpbmciLCAiaGFuZHMtYW1lcmljYW4tc2lnbi1sYW5ndWFnZS1pbnRlcnByZXRpbmciXSwgImYyYTMiLCAiTTE1Ni42IDQ2LjNjNy45LTE1LjggMS41LTM1LTE0LjMtNDIuOXMtMzUtMS41LTQyLjkgMTQuM0wxMy41IDE4OS40QzQuNiAyMDcuMiAwIDIyNi44IDAgMjQ2LjdMMCAyNTZjMCA3MC43IDU3LjMgMTI4IDEyOCAxMjhsODAgMCAwLS4zYzM1LjItMi43IDY1LjQtMjIuOCA4Mi4xLTUxLjcgOC44LTE1LjMgMy42LTM0LjktMTEuNy00My43cy0zNC45LTMuNi00My43IDExLjdjLTcgMTItMTkuOSAyMC0zNC43IDIwLTIyLjEgMC00MC0xNy45LTQwLTQwczE3LjktNDAgNDAtNDBjMTQuOCAwIDI3LjcgOCAzNC43IDIwIDguOCAxNS4zIDI4LjQgMjAuNSA0My43IDExLjdzMjAuNS0yOC40IDExLjctNDMuN2MtMTIuOC0yMi4xLTMzLjYtMzkuMS01OC40LTQ3LjFsODAuOC0yMmMxNy00LjYgMjcuMS0yMi4yIDIyLjUtMzkuM3MtMjIuMi0yNy4xLTM5LjMtMjIuNWwtMTAwLjcgMjcuNSA4MS42LTY4YzEzLjYtMTEuMyAxNS40LTMxLjUgNC4xLTQ1LjFTMjQ5LjEtMy45IDIzNS41IDcuNGwtMTAxLjkgODQuOSAyMy00NnpNNDgzLjQgNDY1LjdjLTcuOSAxNS44LTEuNSAzNSAxNC4zIDQyLjlzMzUgMS41IDQyLjktMTQuM2w4NS45LTE3MS43YzguOS0xNy44IDEzLjUtMzcuNCAxMy41LTU3LjJsMC05LjNjMC03MC43LTU3LjMtMTI4LTEyOC0xMjhsLTgwIDAgMCAuM2MtMzUuMiAyLjctNjUuNCAyMi44LTgyLjEgNTEuNy04LjkgMTUuMy0zLjYgMzQuOSAxMS43IDQzLjdzMzQuOSAzLjYgNDMuNy0xMS43YzctMTIgMTkuOS0yMCAzNC43LTIwIDIyLjEgMCA0MCAxNy45IDQwIDQwcy0xNy45IDQwLTQwIDQwYy0xNC44IDAtMjcuNy04LTM0LjctMjAtOC45LTE1LjMtMjguNC0yMC41LTQzLjctMTEuN3MtMjAuNSAyOC40LTExLjcgNDMuN2MxMi44IDIyLjEgMzMuNiAzOS4xIDU4LjQgNDcuMWwtODAuOCAyMmMtMTcuMSA0LjYtMjcuMSAyMi4yLTIyLjUgMzkuM3MyMi4yIDI3LjEgMzkuMyAyMi41bDEwMC43LTI3LjUtODEuNiA2OGMtMTMuNiAxMS4zLTE1LjQgMzEuNS00LjEgNDUuMXMzMS41IDE1LjQgNDUuMSA0LjFsMTAxLjktODQuOS0yMyA0NnoiXQogICAgfTsKICAgIGZhQW1lcmljYW5TaWduTGFuZ3VhZ2VJbnRlcnByZXRpbmcgPSBmYUhhbmRzQXNsSW50ZXJwcmV0aW5nOwogICAgZmFBc2xJbnRlcnByZXRpbmcgPSBmYUhhbmRzQXNsSW50ZXJwcmV0aW5nOwogICAgZmFIYW5kc0FtZXJpY2FuU2lnbkxhbmd1YWdlSW50ZXJwcmV0aW5nID0gZmFIYW5kc0FzbEludGVycHJldGluZzsKICAgIGZhVGFibGVDZWxsc1Jvd1VubG9jayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWJsZS1jZWxscy1yb3ctdW5sb2NrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU2OTEiLCAiTTI1NiAyMjRsMCAxOTIgNjQgMCAwLTE5Mi02NCAwem0yNTYtNzljLTQ2LjcgNS44LTg1LjYgMzYuOC0xMDIuNyA3OWwtMjUuMyAwIDAgOTAuOGMtMTAuMSAxNS4yLTE2IDMzLjQtMTYgNTMuMWwwIDk2YzAgNS41IC41IDEwLjkgMS4zIDE2LjFMMTI4IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMNjQgOTZjMC0zNS4zIDI4LjctNjQgNjQtNjRsMzIwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCA0OXpNMTI4IDIyNGwwIDE5MiA2NCAwIDAtMTkyLTY0IDB6bTQzMiA0OGMtLjEtMTcuNi0xNC40LTMxLjktMzItMzEuOS0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDQ3LjkgOTYgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDk2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xMjggMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC05NmMwLTIwLjkgMTMuNC0zOC43IDMyLTQ1LjNsMC01MC42YzAtNDQuMiAzNS44LTgwIDgwLTgwIDQ0LjIgMCA3OS45IDM1LjggODAgNzkuOWwtNDggMHoiXQogICAgfTsKICAgIGZhUm9ja2V0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJvY2tldCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMTM1IiwgIk0xMjggMzIwTDI0LjUgMzIwYy0yNC45IDAtNDAuMi0yNy4xLTI3LjQtNDguNUw1MCAxODMuM0M1OC43IDE2OC44IDc0LjMgMTYwIDkxLjIgMTYwbDk1IDBjNzYuMS0xMjguOSAxODkuNi0xMzUuNCAyNjUuNS0xMjQuMyAxMi44IDEuOSAyMi44IDExLjkgMjQuNiAyNC42IDExLjEgNzUuOSA0LjYgMTg5LjQtMTI0LjMgMjY1LjVsMCA5NWMwIDE2LjktOC44IDMyLjUtMjMuMyA0MS4ybC04OC4yIDUyLjljLTIxLjMgMTIuOC00OC41LTIuNi00OC41LTI3LjRMMTkyIDM4NGMwLTM1LjMtMjguNy02NC02NC02NGwtLjEgMHpNNDAwIDE2MGE0OCA0OCAwIDEgMCAtOTYgMCA0OCA0OCAwIDEgMCA5NiAweiJdCiAgICB9OwogICAgZmFTaHJpbXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2hyaW1wIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI5NDI0XSwgImU0NDgiLCAiTTcyIDMyQzMyLjIgMzIgMCA2NC4yIDAgMTA0IDAgMTQxLjkgMjkuMyAxNzIuOSA2Ni40IDE3NS44IDc3LjYgMjU3LjIgMTQ3LjQgMzIwIDIzMiAzMjBsNTYgMCAwLTE5Mi0yMTYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRTNTguNyA4MCA3MiA4MGwzODQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNEw3MiAzMnpNMjI0IDQ1NmMwIDEzLjMgMTAuNyAyNCAyNCAyNGw3MiAwIDAtNzIuMi02NC4xLTIyLjRjLTEyLjUtNC40LTI2LjIgMi4yLTMwLjYgMTQuN3MyLjIgMjYuMiAxNC43IDMwLjZsNC41IDEuNkMyMzMgNDMzLjkgMjI0IDQ0My45IDIyNCA0NTZ6bTEyOCAyMy4zYzM2LjQtMy4zIDY5LjUtMTcuNiA5Ni4xLTM5LjZsLTg2LjUtMzQuNmMtMyAxLjgtNi4yIDMuMi05LjYgNC4zbDAgNjkuOXpNNDcyLjYgNDE1YzI0LjYtMzAuMyAzOS40LTY4LjkgMzkuNC0xMTEgMC0xMi4zLTEuMy0yNC4zLTMuNy0zNS45TDM4Mi44IDM1NS4xYy44IDMuNCAxLjIgNyAxLjIgMTAuNiAwIDQuNi0uNyA5LTEuOSAxMy4xTDQ3Mi42IDQxNXpNMzM2IDEyOGwtMTYgMCAwIDE5MiAxOC4zIDBjOS45IDAgMTkuMSAzLjIgMjYuNiA4LjVsMTMzLjUtOTIuNEM0NzEuOCAxNzIuNiA0MDkuMSAxMjggMzM2IDEyOHpNMTY4IDE5MmEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAweiJdCiAgICB9OwogICAgZmFUZW5nZVNpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGVuZ2Utc2lnbiIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzgzNzYsICJ0ZW5nZSJdLCAiZjdkNyIsICJNMCA1NkMwIDQyLjcgMTAuNyAzMiAyNCAzMmwzMzYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNEwyNCA4MEMxMC43IDgwIDAgNjkuMyAwIDU2ek0wIDE2MGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzMjAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTI4IDAgMCAyNTZjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0yNTYtMTI4IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyeiJdCiAgICB9OwogICAgZmFUZW5nZSA9IGZhVGVuZ2VTaWduOwogICAgZmFIb3VzZUNoaW1uZXlNZWRpY2FsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLWNoaW1uZXktbWVkaWNhbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJjbGluaWMtbWVkaWNhbCJdLCAiZjdmMiIsICJNMjM0LjIgOC42YzEyLjMtMTEuNCAzMS4zLTExLjQgNDMuNSAwTDM2OCA5Mi4zIDM2OCA4MGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTAxLjUgMzcuOCAzNS4xYzkuNiA5IDEyLjggMjIuOSA4IDM1LjFTNDkzLjIgMjcyIDQ4MCAyNzJsLTE2IDAgMCAxNzZjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTI4OCAwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTE3Ni0xNiAwYy0xMy4yIDAtMjUtOC4xLTI5LjgtMjAuM3MtMS42LTI2LjIgOC0zNS4xbDIyNC0yMDh6TTIyNCAyNDhsMCA0MC00MCAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsNDAgMCAwIDQwYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTQwIDQwIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC00MCAwIDAtNDBjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6Il0KICAgIH07CiAgICBmYUNsaW5pY01lZGljYWwgPSBmYUhvdXNlQ2hpbW5leU1lZGljYWw7CiAgICBmYVVzZXJzU2xhc2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlcnMtc2xhc2giLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTA3MyIsICJNNzMtMjQuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTMjkuNy0uMyAzOSA5LjFsNTI4IDUyOGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlMMzIxLjggMjI0YzU2LjYtMSAxMDIuMi00Ny4yIDEwMi4yLTEwNCAwLTU3LjQtNDYuNi0xMDQtMTA0LTEwNC01Ni44IDAtMTAzIDQ1LjYtMTA0IDEwMi4yTDczLTI0Ljl6TTUxMiAyODhjLTE3LjIgMC0zMy43IDMuNC00OC43IDkuNmwxNzAgMTcwYzQuMi01LjQgNi43LTEyLjIgNi43LTE5LjZsMC0zMmMwLTcwLjctNTcuMy0xMjgtMTI4LTEyOHpNNTkuOSA5Ny43Yy0yMS41IDEyLjUtMzUuOSAzNS43LTM1LjkgNjIuMyAwIDM5LjggMzIuMiA3MiA3MiA3MiAyNi42IDAgNDkuOC0xNC40IDYyLjMtMzUuOUw1OS45IDk3Ljd6TTI1MC4yIDI4OEMxOTYuOCAzMTMuOSAxNjAgMzY4LjcgMTYwIDQzMmwwIDE2YzAgMTcuNyAxNC4zIDMyIDMyIDMybDI1MC4yIDAtMTkyLTE5MnpNMTI4IDI4OEM1Ny4zIDI4OCAwIDM0NS4zIDAgNDE2bDAgMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJsODYuNyAwYy00LjMtOS44LTYuNy0yMC42LTYuNy0zMmwwLTE2YzAtNTMuMiAyMC0xMDEuOCA1Mi45LTEzOC42LTExLjctMy41LTI0LjEtNS40LTM2LjktNS40ek02MTYgMTYwYTcyIDcyIDAgMSAwIC0xNDQgMCA3MiA3MiAwIDEgMCAxNDQgMHoiXQogICAgfTsKICAgIGZhUGFwZXJQbGFuZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGFwZXItcGxhbmUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFs2MTkxM10sICJmMWQ4IiwgIk01MzYuNC0yNi4zYzkuOC0zLjUgMjAuNi0xIDI4IDYuM3M5LjggMTguMiA2LjMgMjhsLTE3OCA0OTYuOWMtNSAxMy45LTE4LjEgMjMuMS0zMi44IDIzLjEtMTQuMiAwLTI3LTguNi0zMi4zLTIxLjdsLTY0LjItMTU4Yy00LjUtMTEtMi41LTIzLjYgNS4yLTMyLjZsOTQuNS0xMTIuNGM1LjEtNi4xIDQuNy0xNS0uOS0yMC42cy0xNC42LTYtMjAuNi0uOUwyMjkuMiAyNzYuMWMtOS4xIDcuNi0yMS42IDkuNi0zMi42IDUuMkwzOC4xIDIxNi44Yy0xMy4xLTUuMy0yMS43LTE4LjEtMjEuNy0zMi4zIDAtMTQuNyA5LjItMjcuOCAyMy4xLTMyLjhsNDk2LjktMTc4eiJdCiAgICB9OwogICAgZmFCb29rQXRsYXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm9vay1hdGxhcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJhdGxhcyJdLCAiZjU1OCIsICJNOTYgNTEybDMyMCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybDAtNjYuN2MxOC42LTYuNiAzMi0yNC40IDMyLTQ1LjNsMC0yODhjMC0yNi41LTIxLjUtNDgtNDgtNDhMOTYgMEM0MyAwIDAgNDMgMCA5NkwwIDQxNmMwIDUzIDQzIDk2IDk2IDk2ek02NCA0MTZjMC0xNy43IDE0LjMtMzIgMzItMzJsMjU2IDAgMCA2NC0yNTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6TTMxMC42IDIwOEwyNzkgMjA4Yy0xLjQgMjMuMS02IDQ0LjItMTIuNiA2MS4yIDIyLjctMTIuNSAzOS40LTM0LjggNDQuMi02MS4yem0tMTczLjEgMGM0LjggMjYuNCAyMS41IDQ4LjcgNDQuMiA2MS4yLTYuNy0xNy0xMS4yLTM4LTEyLjYtNjEuMmwtMzEuNiAwem03Ni40IDU1YzQuNSA5LjYgOC4yIDEzLjggMTAuMiAxNS41IDItMS43IDUuNy01LjggMTAuMi0xNS41IDYuMi0xMy40IDExLjEtMzIuNSAxMi43LTU1bC00NS44IDBjMS42IDIyLjUgNi41IDQxLjYgMTIuNyA1NXptLTEyLjctODdsNDUuOCAwYy0xLjYtMjIuNS02LjUtNDEuNi0xMi43LTU1LTQuNS05LjYtOC4yLTEzLjgtMTAuMi0xNS41LTIgMS43LTUuNyA1LjgtMTAuMiAxNS41LTYuMiAxMy40LTExLjEgMzIuNS0xMi43IDU1em0xMDkuNSAwYy00LjgtMjYuNC0yMS41LTQ4LjctNDQuMi02MS4yIDYuNyAxNyAxMS4yIDM4IDEyLjYgNjEuMmwzMS42IDB6TTE2OSAxNzZjMS40LTIzLjEgNi00NC4yIDEyLjYtNjEuMi0yMi43IDEyLjUtMzkuNCAzNC44LTQ0LjIgNjEuMmwzMS42IDB6TTk2IDE5MmExMjggMTI4IDAgMSAxIDI1NiAwIDEyOCAxMjggMCAxIDEgLTI1NiAweiJdCiAgICB9OwogICAgZmFBdGxhcyA9IGZhQm9va0F0bGFzOwogICAgZmFUYWJsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWJsZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMGNlIiwgIk0yNTYgMTYwbDAgOTYgMTI4IDAgMC05Ni0xMjggMHptLTY0IDBsLTEyOCAwIDAgOTYgMTI4IDAgMC05NnpNMCAzMjBMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtOTZ6bTM4NCAwbC0xMjggMCAwIDk2IDEyOCAwIDAtOTZ6TTE5MiA0MTZsMC05Ni0xMjggMCAwIDk2IDEyOCAweiJdCiAgICB9OwogICAgZmFIZWFydDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGVhcnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgxNTMsIDEyODE1NCwgMTI4MTU1LCAxMjgxNTYsIDEyODQyMCwgMTI5MjkzLCAxMjkyOTQsIDEyOTUwNSwgOTgyOSwgMTAwODQsIDYxNTc4XSwgImYwMDQiLCAiTTI0MSA4Ny4xbDE1IDIwLjcgMTUtMjAuN0MyOTYgNTIuNSAzMzYuMiAzMiAzNzguOSAzMiA0NTIuNCAzMiA1MTIgOTEuNiA1MTIgMTY1LjFsMCAyLjZjMCAxMTIuMi0xMzkuOSAyNDIuNS0yMTIuOSAyOTguMi0xMi40IDkuNC0yNy42IDE0LjEtNDMuMSAxNC4xcy0zMC44LTQuNi00My4xLTE0LjFDMTM5LjkgNDEwLjIgMCAyNzkuOSAwIDE2Ny43bDAtMi42QzAgOTEuNiA1OS42IDMyIDEzMy4xIDMyIDE3NS44IDMyIDIxNiA1Mi41IDI0MSA4Ny4xeiJdCiAgICB9OwogICAgZmFDaXJjbGVDaGV2cm9uVXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLWNoZXZyb24tdXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiY2hldnJvbi1jaXJjbGUtdXAiXSwgImYxMzkiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0zNzcgMjcxYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTg3LTg3LTg3IDg3Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45TDIzOSAxNjdjOS40LTkuNCAyNC42LTkuNCAzMy45IDBMMzc3IDI3MXoiXQogICAgfTsKICAgIGZhQ2hldnJvbkNpcmNsZVVwID0gZmFDaXJjbGVDaGV2cm9uVXA7CiAgICBmYUJhdHRlcnlIYWxmID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhdHRlcnktaGFsZiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWyJiYXR0ZXJ5LTMiXSwgImYyNDIiLCAiTTUyOCAxMjhjOC44IDAgMTYgNy4yIDE2IDE2bDAgMjI0YzAgOC44LTcuMiAxNi0xNiAxNmwtNDE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTIyNGMwLTguOCA3LjItMTYgMTYtMTZsNDE2IDB6TTExMiA2NGMtNDQuMiAwLTgwIDM1LjgtODAgODBsMCAyMjRjMCA0NC4yIDM1LjggODAgODAgODBsNDE2IDBjNDQuMiAwIDgwLTM1LjggODAtODBsMC00OGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTY0YzAtMTcuNy0xNC4zLTMyLTMyLTMybDAtNDhjMC00NC4yLTM1LjgtODAtODAtODBMMTEyIDY0em01NiAxMTJjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMTEyYzAgMTMuMyAxMC43IDI0IDI0IDI0bDE0NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtMTEyYzAtMTMuMy0xMC43LTI0LTI0LTI0bC0xNDQgMHoiXQogICAgfTsKICAgIGZhQmF0dGVyeTMgPSBmYUJhdHRlcnlIYWxmOwogICAgZmFGb250QXdlc29tZTMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZm9udC1hd2Vzb21lIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjI1MDEsIDYyNjk0LCAiZm9udC1hd2Vzb21lLWZsYWciLCAiZm9udC1hd2Vzb21lLWxvZ28tZnVsbCJdLCAiZjJiNCIsICJNOTEuNyA5NkMxMDYuMyA4Ni44IDExNiA3MC41IDExNiA1MiAxMTYgMjMuMyA5Mi43IDAgNjQgMFMxMiAyMy4zIDEyIDUyYzAgMTYuNyA3LjggMzEuNSAyMCA0MWwwIDQxOSA2NCAwIDAtNjQgMzczLjYgMGMxNC42IDAgMjYuNC0xMS44IDI2LjQtMjYuNCAwLTMuNy0uOC03LjMtMi4zLTEwLjdMNDMyIDI3MiA0OTMuNyAxMzMuMWMxLjUtMy40IDIuMy03IDIuMy0xMC43IDAtMTQuNi0xMS44LTI2LjQtMjYuNC0yNi40TDkxLjcgOTZ6Il0KICAgIH07CiAgICBmYUZvbnRBd2Vzb21lRmxhZzMgPSBmYUZvbnRBd2Vzb21lMzsKICAgIGZhRm9udEF3ZXNvbWVMb2dvRnVsbDMgPSBmYUZvbnRBd2Vzb21lMzsKICAgIGZhSGFuZGN1ZmZzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbmRjdWZmcyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNGY4IiwgIk0zMjAtMzJjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzIgMTQuMyAzMiAzMiAzMiAzMi0xNC4zIDMyLTMyek0xOTIgNjRhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0ek0xNTIgOTZjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMTZjMCAxIC4xIDEuOSAuMiAyLjktNzQuNyAyNi4zLTEyOC4yIDk3LjUtMTI4LjIgMTgxLjEgMCAxMDYgODYgMTkyIDE5MiAxOTJzMTkyLTg2IDE5Mi0xOTJjMC04My43LTUzLjUtMTU0LjgtMTI4LjItMTgxLjEgLjEtLjkgLjItMS45IC4yLTIuOWwwLTE2YzAtMTMuMy0xMC43LTI0LTI0LTI0bC04MCAwek02NCAzMjBhMTI4IDEyOCAwIDEgMSAyNTYgMCAxMjggMTI4IDAgMSAxIC0yNTYgMHptNDQ4IDBjMCA2Ni45LTUxLjMgMTIxLjgtMTE2LjYgMTI3LjUtMTQuMyAyMi44LTMyLjQgNDMuMS01My40IDU5LjkgMTMuNSAzIDI3LjYgNC42IDQyIDQuNiAxMDYgMCAxOTItODYgMTkyLTE5MiAwLTgzLjctNTMuNS0xNTQuOC0xMjguMi0xODEuMSAuMS0uOSAuMi0xLjkgLjItMi45bDAtMTZjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTgwIDBjLTEyLjMgMC0yMi40IDkuMi0yMy44IDIxLjEgMzAuMyAxOS4yIDU2LjEgNDUgNzUuMiA3NS40IDY1LjQgNS44IDExNi42IDYwLjYgMTE2LjYgMTI3LjV6TTM4NCA2NGEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6Il0KICAgIH07CiAgICBmYUhhdENvd2JveVNpZGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGF0LWNvd2JveS1zaWRlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY4YzEiLCAiTTY0MCAzODguM2MwIDE2LjktNy4xIDMyLjItMTguNCA0My4xbC0zNS0yMy4zLTI5Mi43LTE5NS4xYy0zNi4xLTI0LjEtNzguNi0zNi45LTEyMi0zNi45bC0zLjkgMGMtMi43IDAtNS40IDAtOCAuMWwyMi4yLTEwMGM1LjctMjUuOCAyOC42LTQ0LjEgNTUtNDQuMSAxMi4yIDAgMjQuMSA0IDMzLjggMTEuM2w0LjcgMy41YzI2LjMgMTkuNyA2Mi40IDE5LjcgODguNiAwbDQuNy0zLjVjOS44LTcuMyAyMS42LTExLjMgMzMuOC0xMS4zIDI2LjQgMCA0OS4zIDE4LjMgNTUgNDQuMWwzMyAxNDguNUM1NzQuNSAyMzIuMyA2NDAgMzAyLjYgNjQwIDM4OC4zek0xNzEuOSAyMjRjMzMuOSAwIDY3LjEgMTAgOTUuNCAyOC45TDU2MCA0NDggNTYgNDQ4Yy0zMC45IDAtNTYtMjUuMS01Ni01NiAwLTkyLjggNzUuMi0xNjggMTY4LTE2OGwzLjkgMHoiXQogICAgfTsKICAgIGZhSW5kdXN0cnkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaW5kdXN0cnkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjI3NSIsICJNMzIgMzJDMTQuMyAzMiAwIDQ2LjMgMCA2NEwwIDQzMmMwIDI2LjUgMjEuNSA0OCA0OCA0OGw0MTYgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTI3OS44YzAtMTguMi0xOS40LTI5LjctMzUuNC0yMS4xbC0xNTYuNiA4NC4zIDAtNjMuMmMwLTE4LjItMTkuNC0yOS43LTM1LjQtMjEuMUwxMjggMjE1LjQgMTI4IDY0YzAtMTcuNy0xNC4zLTMyLTMyLTMyTDMyIDMyeiJdCiAgICB9OwogICAgZmFMaW5lc0xlYW5pbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGluZXMtbGVhbmluZyIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlNTFlIiwgIk0xOTAuNCA3NC4xYzUuNi0xNi44LTMuNS0zNC45LTIwLjItNDAuNXMtMzQuOSAzLjUtNDAuNSAyMC4ybC0xMjggMzg0Yy01LjYgMTYuOCAzLjUgMzQuOSAyMC4yIDQwLjVzMzQuOS0zLjUgNDAuNS0yMC4ybDEyOC0zODR6bTcwLjktNDEuN2MtMTcuNC0yLjktMzMuOSA4LjktMzYuOCAyNi4zbC02NCAzODRjLTIuOSAxNy40IDguOSAzMy45IDI2LjMgMzYuOHMzMy45LTguOSAzNi44LTI2LjNsNjQtMzg0YzIuOS0xNy40LTguOS0zMy45LTI2LjMtMzYuOHpNMzUyIDMyYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDM4NGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzg0YzAtMTcuNy0xNC4zLTMyLTMyLTMyeiJdCiAgICB9OwogICAgZmFQYXNzcG9ydCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwYXNzcG9ydCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmNWFiIiwgIk0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDM4NGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6TTk2IDQwOGMwIDEzLjMgMTAuNyAyNCAyNCAyNGwxNDQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTQ0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0ek0yNzguNiAyMDhjLTQuOCAyNi40LTIxLjUgNDguNy00NC4yIDYxLjIgNi43LTE3IDExLjItMzggMTIuNi02MS4ybDMxLjYgMHptLTE3My4xIDBsMzEuNiAwYzEuNCAyMy4xIDYgNDQuMiAxMi42IDYxLjItMjIuNy0xMi41LTM5LjQtMzQuOC00NC4yLTYxLjJ6bTc2LjQgNTVjLTYuMi0xMy40LTExLjEtMzIuNS0xMi43LTU1bDQ1LjggMGMtMS42IDIyLjUtNi41IDQxLjYtMTIuNyA1NS00LjUgOS42LTguMiAxMy44LTEwLjIgMTUuNS0yLTEuNy01LjctNS44LTEwLjItMTUuNXptMC0xNDJjNC41LTkuNiA4LjItMTMuOCAxMC4yLTE1LjUgMiAxLjcgNS43IDUuOCAxMC4yIDE1LjUgNi4yIDEzLjQgMTEuMSAzMi41IDEyLjcgNTVsLTQ1LjggMGMxLjYtMjIuNSA2LjUtNDEuNiAxMi43LTU1em05Ni43IDU1TDI0NyAxNzZjLTEuNC0yMy4xLTYtNDQuMi0xMi42LTYxLjIgMjIuNyAxMi41IDM5LjQgMzQuOCA0NC4yIDYxLjJ6TTEzNyAxNzZsLTMxLjYgMGM0LjgtMjYuNCAyMS41LTQ4LjcgNDQuMi02MS4yLTYuNyAxNy0xMS4yIDM4LTEyLjYgNjEuMnptMTgzIDE2YTEyOCAxMjggMCAxIDAgLTI1NiAwIDEyOCAxMjggMCAxIDAgMjU2IDB6Il0KICAgIH07CiAgICBmYUluZmluaXR5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImluZmluaXR5IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbODczNCwgOTg1NF0sICJmNTM0IiwgIk0wIDI1NmMwLTg4LjQgNzEuNi0xNjAgMTYwLTE2MCA1MC40IDAgOTcuOCAyMy43IDEyOCA2NGwzMiA0Mi43IDMyLTQyLjdjMzAuMi00MC4zIDc3LjYtNjQgMTI4LTY0IDg4LjQgMCAxNjAgNzEuNiAxNjAgMTYwUzU2OC40IDQxNiA0ODAgNDE2Yy01MC40IDAtOTcuOC0yMy43LTEyOC02NGwtMzItNDIuNy0zMiA0Mi43Yy0zMC4yIDQwLjMtNzcuNiA2NC0xMjggNjQtODguNCAwLTE2MC03MS42LTE2MC0xNjB6bTI4MCAwbC00My4yLTU3LjZjLTE4LjEtMjQuMi00Ni42LTM4LjQtNzYuOC0zOC40LTUzIDAtOTYgNDMtOTYgOTZzNDMgOTYgOTYgOTZjMzAuMiAwIDU4LjctMTQuMiA3Ni44LTM4LjRMMjgwIDI1NnptODAgMGw0My4yIDU3LjZjMTguMSAyNC4yIDQ2LjYgMzguNCA3Ni44IDM4LjQgNTMgMCA5Ni00MyA5Ni05NnMtNDMtOTYtOTYtOTZjLTMwLjIgMC01OC43IDE0LjItNzYuOCAzOC40TDM2MCAyNTZ6Il0KICAgIH07CiAgICBmYUNsb25lMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjbG9uZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjRkIiwgIk0yODggNDQ4bC0yMjQgMCAwLTIyNCA0OCAwIDAtNjQtNDggMGMtMzUuMyAwLTY0IDI4LjctNjQgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjI0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC00OC02NCAwIDAgNDh6bS02NC05NmwyMjQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTIyNGMwLTM1LjMtMjguNy02NC02NC02NEwyMjQgMGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCAyMjRjMCAzNS4zIDI4LjcgNjQgNjQgNjR6Il0KICAgIH07CiAgICBmYUZvcndhcmQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZm9yd2FyZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzkxOTNdLCAiZjA0ZSIsICJNMzcxLjcgNDMuMUMzNjAuMSAzMiAzNDMgMjguOSAzMjguMyAzNS4yUzMwNCA1NiAzMDQgNzJsMCAxMzYuMy0xNzIuMy0xNjUuMUMxMjAuMSAzMiAxMDMgMjguOSA4OC4zIDM1LjJTNjQgNTYgNjQgNzJsMCAzNjhjMCAxNiA5LjYgMzAuNSAyNC4zIDM2LjhzMzEuOCAzLjIgNDMuNC03LjlMMzA0IDMwMy43IDMwNCA0NDBjMCAxNiA5LjYgMzAuNSAyNC4zIDM2LjhzMzEuOCAzLjIgNDMuNC03LjlsMTkyLTE4NGM3LjktNy41IDEyLjMtMTggMTIuMy0yOC45cy00LjUtMjEuMy0xMi4zLTI4LjlsLTE5Mi0xODR6Il0KICAgIH07CiAgICBmYU0gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEwOV0sICI0ZCIsICJNMjIuNyAzMy40YzEzLjUtNC4xIDI4LjEgMS4xIDM1LjkgMTIuOUwyMjQgMjk0LjMgMzg5LjQgNDYuM2M3LjgtMTEuNyAyMi40LTE3IDM1LjktMTIuOVM0NDggNDkuOSA0NDggNjRsMCAzODRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0yNzguMy0xMzMuNCAyMDAuMWMtNS45IDguOS0xNS45IDE0LjItMjYuNiAxNC4ycy0yMC43LTUuMy0yNi42LTE0LjJMNjQgMTY5LjcgNjQgNDQ4YzAgMTcuNy0xNC4zIDMyLTMyIDMyUzAgNDY1LjcgMCA0NDhMMCA2NEMwIDQ5LjkgOS4yIDM3LjUgMjIuNyAzMy40eiJdCiAgICB9OwogICAgZmFSb2FkU3Bpa2VzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJvYWQtc3Bpa2VzIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NjgiLCAiTTY0IDExNi44YzAtMTUuOCAyMC41LTIyIDI5LjMtOC45bDk4LjcgMTQ4IDAtMTM5LjJjMC0xNS44IDIwLjUtMjIgMjkuMy04LjlsOTguNyAxNDggMC0xMzkuMmMwLTE1LjggMjAuNS0yMiAyOS4zLTguOWw5OC43IDE0OCAwLTEzOS4yYzAtMTUuOCAyMC41LTIyIDI5LjMtOC45TDYwNi44IDMwMi4yYzE0LjIgMjEuMy0xLjEgNDkuOC0yNi42IDQ5LjhMNjQgMzUyIDY0IDExNi44ek0zMiAzODRsNTc2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgNDQ4Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMyeiJdCiAgICB9OwogICAgZmFNb3VudGFpbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb3VudGFpbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyNzk1Nl0sICJmNmZjIiwgIk0yNTYuNSAwYzE0LjcgMCAyOC4yIDguMSAzNS4yIDIxbDIxNiA0MDBjNi43IDEyLjQgNi40IDI3LjQtLjggMzkuNS03LjIgMTIuMS0yMC4zIDE5LjUtMzQuMyAxOS41bC00MzIgMGMtMTQuMSAwLTI3LjEtNy40LTM0LjMtMTkuNXMtNy41LTI3LjEtLjgtMzkuNWwyMTYtNDAwIDIuOS00LjZDMjMxLjcgNi4yIDI0My42IDAgMjU2LjUgMHpNMTcwLjQgMjQ5LjlsMjYuOCAyNi44YzYuMiA2LjIgMTYuNCA2LjIgMjIuNiAwbDQzLjMtNDMuM2M2LTYgMTQuMS05LjQgMjIuNi05LjRsNDIuOCAwLTcyLjEtMTMzLjUtODYuMSAxNTkuNHoiXQogICAgfTsKICAgIGZhQ2hlc3MgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hlc3MiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjQzOSIsICJNMTY4IDU2bDAgNDAtNzguMSAwYy0xNC4zIDAtMjUuOSAxMS42LTI1LjkgMjUuOSAwIDQgLjkgOCAyLjcgMTEuNmwzMy40IDY2LjhjLTExLjQgMS44LTIwLjIgMTEuNy0yMC4yIDIzLjcgMCAxMy4zIDEwLjcgMjQgMjQgMjRsNS42IDAtMTMuNiAxMzYtNTYuMiA3MC4zYy01IDYuMy03LjggMTQuMS03LjggMjIuMiAwIDE5LjYgMTUuOSAzNS41IDM1LjUgMzUuNWwyNDguOSAwYzE5LjYgMCAzNS41LTE1LjkgMzUuNS0zNS41IDAtOC4xLTIuNy0xNS45LTcuOC0yMi4yTDI4OCAzODQgMjc0LjQgMjQ4IDI4MCAyNDhjMTMuMyAwIDI0LTEwLjcgMjQtMjQgMC0xMS45LTguNy0yMS45LTIwLjItMjMuN2wzMy40LTY2LjhjMS44LTMuNiAyLjctNy42IDIuNy0xMS42IDAtMTQuMy0xMS42LTI1LjktMjUuOS0yNS45bC03OC4xIDAgMC00MCAxNiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0UzI0NS4zIDggMjMyIDhsLTE2IDAgMC0xNmMwLTEzLjMtMTAuNy0yNC0yNC0yNFMxNjgtMjEuMyAxNjgtOGwwIDE2LTE2IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTYgMHpNMzI1LjggMjc5LjZsOC41IDg1LjUgNDcuNCA1OS4yIDQuMiA1LjdjOS4yIDEzLjcgMTQuMSAyOS45IDE0LjEgNDYuNSAwIDEyLjctMi44IDI0LjgtNy45IDM1LjVsODMuMSAwYzIwLjMgMCAzNi44LTE2LjUgMzYuOC0zNi44IDAtNy4zLTIuMi0xNC40LTYuMi0yMC40bC0yNS44LTM4LjcgMC02NCAxMy4zLTEzLjNjMTItMTIgMTguNy0yOC4zIDE4LjctNDUuM0w1MTIgMTkyYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMTYtMzIgMCAwLTE2YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMzJjMCAyMi40LTEwLjIgNDIuNC0yNi4yIDU1LjZ6Il0KICAgIH07CiAgICBmYVRlbXBlcmF0dXJlVGhyZWVRdWFydGVycyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0ZW1wZXJhdHVyZS10aHJlZS1xdWFydGVycyIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWyJ0ZW1wZXJhdHVyZS0zIiwgInRoZXJtb21ldGVyLTMiLCAidGhlcm1vbWV0ZXItdGhyZWUtcXVhcnRlcnMiXSwgImYyYzgiLCAiTTE2MCAwQzEwNyAwIDY0IDQzIDY0IDk2bDAgMTY0LjdDMzQuNSAyODcgMTYgMzI1LjQgMTYgMzY4IDE2IDQ0Ny41IDgwLjUgNTEyIDE2MCA1MTJzMTQ0LTY0LjUgMTQ0LTE0NGMwLTQyLjYtMTguNS04MS00OC0xMDcuM0wyNTYgOTZjMC01My00My05Ni05Ni05NnptNjQgMzY4YzAgMzUuMy0yOC43IDY0LTY0IDY0cy02NC0yOC43LTY0LTY0YzAtMjYuOSAxNi41LTQ5LjkgNDAtNTkuM0wxMzYgMTUyYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCAxNTYuN2MyMy41IDkuNSA0MCAzMi41IDQwIDU5LjN6Il0KICAgIH07CiAgICBmYVRlbXBlcmF0dXJlMyA9IGZhVGVtcGVyYXR1cmVUaHJlZVF1YXJ0ZXJzOwogICAgZmFUaGVybW9tZXRlcjMgPSBmYVRlbXBlcmF0dXJlVGhyZWVRdWFydGVyczsKICAgIGZhVGhlcm1vbWV0ZXJUaHJlZVF1YXJ0ZXJzID0gZmFUZW1wZXJhdHVyZVRocmVlUXVhcnRlcnM7CiAgICBmYUIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYiIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWzk4XSwgIjQyIiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0TDAgNDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMybDE2MCAwYzcwLjcgMCAxMjgtNTcuMyAxMjgtMTI4IDAtNDYuNS0yNC44LTg3LjMtNjItMTA5LjcgMTguNy0yMi4zIDMwLTUxIDMwLTgyLjMgMC03MC43LTU3LjMtMTI4LTEyOC0xMjhMMzIgMzJ6TTE2MCAyMjRsLTk2IDAgMC0xMjggOTYgMGMzNS4zIDAgNjQgMjguNyA2NCA2NHMtMjguNyA2NC02NCA2NHpNNjQgMjg4bDEyOCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0cy0yOC43IDY0LTY0IDY0bC0xMjggMCAwLTEyOHoiXQogICAgfTsKICAgIGZhU2hpZWxkVmlydXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2hpZWxkLXZpcnVzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUwNmMiLCAiTTI1My40IDIuOUMyNDkuMiAxIDI0NC43IDAgMjQwIDBzLTkuMiAxLTEzLjQgMi45TDM4LjMgODIuOGMtMjIgOS4zLTM4LjQgMzEtMzguMyA1Ny4yIC41IDk5LjIgNDEuMyAyODAuNyAyMTMuNiAzNjMuMiAxNi43IDggMzYuMSA4IDUyLjggMCAxNzIuNC04Mi41IDIxMy4yLTI2NCAyMTMuNi0zNjMuMiAuMS0yNi4yLTE2LjMtNDcuOS0zOC4zLTU3LjJMMjUzLjQgMi45ek0yNDAgMTI4YzEzLjMgMCAyNCAxMC43IDI0IDI0IDAgMjIuOSAyNy43IDM0LjQgNDMuOSAxOC4yIDkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOWMtMTYuMiAxNi4yLTQuNyA0My45IDE4LjIgNDMuOSAxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGMtMjIuOSAwLTM0LjQgMjcuNy0xOC4yIDQzLjkgOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGMtMTYuMi0xNi4yLTQzLjktNC43LTQzLjkgMTguMiAwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGMwLTIyLjktMjcuNy0zNC40LTQzLjktMTguMi05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45YzE2LjItMTYuMiA0LjctNDMuOS0xOC4yLTQzLjktMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGMyMi45IDAgMzQuNC0yNy43IDE4LjItNDMuOS05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBjMTYuMiAxNi4yIDQzLjkgNC43IDQzLjktMTguMiAwLTEzLjMgMTAuNy0yNCAyNC0yNHpNMjA4IDI2NGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6bTg4IDQwYTI0IDI0IDAgMSAwIC00OCAwIDI0IDI0IDAgMSAwIDQ4IDB6Il0KICAgIH07CiAgICBmYUxpdGVjb2luU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsaXRlY29pbi1zaWduIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImUxZDMiLCAiTTEyOCA2NGMwLTE3LjctMTQuMy0zMi0zMi0zMlM2NCA0Ni4zIDY0IDY0bDAgMTU3LjktMzguNiAxMWMtMTIuNyAzLjYtMjAuMSAxNi45LTE2LjUgMjkuN3MxNi45IDIwLjEgMjkuNyAxNi41TDY0IDI3MS44IDY0IDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwyNTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMjI0IDAgMC0xNjIuNSAxMzQuNi0zOC41YzEyLjctMy42IDIwLjEtMTYuOSAxNi41LTI5LjdzLTE2LjktMjAuMS0yOS43LTE2LjVMMTI4IDIwMy42IDEyOCA2NHoiXQogICAgfTsKICAgIGZhRGljZUQ2ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRpY2UtZDYiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjZkMSIsICJNMjI0LjQgOC4zQzI0NC0yLjggMjY4LTIuOCAyODcuNiA4LjNsMTc2IDk5LjdjMjAgMTEuNCAzMi40IDMyLjYgMzIuNCA1NS43bDAgMTk3LjRjMCAyMy0xMi40IDQ0LjMtMzIuNCA1NS43bC0xNzYgOTkuN2MtMTkuNiAxMS4xLTQzLjYgMTEuMS02My4xIDBsLTE3Ni05OS43QzI4LjQgNDA1LjUgMTYgMzg0LjIgMTYgMzYxLjJsMC0xOTcuNGMwLTIzIDEyLjQtNDQuMyAzMi40LTU1LjdsMTc2LTk5Ljd6TTEwMi42IDE1NS42Yy04LjgtMy4xLTE4LjggLjMtMjMuOCA4LjZzLTMuMiAxOC43IDMuNiAyNWwzLjIgMi40IDE1MC4yIDkwLjIgMCAxNDguN2MwIDExIDkgMjAgMjAgMjAgMTEgMCAyMC05IDIwLTIwbDAtMTQ4LjcgMTUwLjMtOTAuMmM5LjUtNS43IDEyLjYtMTggNi45LTI3LjRzLTE4LTEyLjUtMjcuNC02LjlsLTE0OS43IDg5LjgtMTQ5LjctODkuOC0zLjctMS43eiJdCiAgICB9OwogICAgZmFHcmlwTGluZXNWZXJ0aWNhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJncmlwLWxpbmVzLXZlcnRpY2FsIiwKICAgICAgaWNvbjogWzE5MiwgNTEyLCBbXSwgImY3YTUiLCAiTTY0IDY0YzAtMTcuNy0xNC4zLTMyLTMyLTMyUzAgNDYuMyAwIDY0TDAgNDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJMNjQgNjR6bTEyOCAwYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMzg0YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zODR6Il0KICAgIH07CiAgICBmYUdvbGZCYWxsVGVlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImdvbGYtYmFsbC10ZWUiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsiZ29sZi1iYWxsIl0sICJmNDUwIiwgIk0yOTguNSAzODQuMWMxMi4xIDEuMiAyMS41IDExLjUgMjEuNSAyMy45cy05LjQgMjIuNi0yMS41IDIzLjlsLTIuNSAuMS04MCAwIDAgODhjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC04OC04MCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNCAwLTEyLjQgOS40LTIyLjYgMjEuNS0yMy45bDIuNS0uMSAyMDggMCAyLjUgLjF6TTE5MiAwYzEwNiAwIDE5MiA4NiAxOTIgMTkyIDAgNTcuNC0yNS4yIDEwOC44LTY1LjEgMTQ0TDY1LjEgMzM2QzI1LjIgMzAwLjggMCAyNDkuNCAwIDE5MiAwIDg2IDg2IDAgMTkyIDB6bTMyIDI0MGMtNy43IDAtMTQuMiA1LjUtMTUuNyAxMi44bC0uNiA2LjRjLTEuMyA2LjMtNi4yIDExLjItMTIuNSAxMi41bC02LjQgLjZjLTcuMyAxLjUtMTIuOCA4LTEyLjggMTUuNyAwIDguOCA3LjIgMTYgMTYgMTYgMjYuNSAwIDQ4LTIxLjUgNDgtNDggMC04LjgtNy4yLTE2LTE2LTE2em02NC02NGMtNy43IDAtMTQuMiA1LjUtMTUuNyAxMi44bC0uNiA2LjRjLTEuMyA2LjMtNi4yIDExLjItMTIuNSAxMi41bC02LjQgLjZjLTcuMyAxLjUtMTIuOCA4LTEyLjggMTUuNyAwIDguOCA3LjIgMTYgMTYgMTYgMjYuNSAwIDQ4LTIxLjUgNDgtNDggMC04LjgtNy4yLTE2LTE2LTE2em0tODAtMTZjLTcuNyAwLTE0LjIgNS41LTE1LjcgMTIuOGwtLjYgNi40Yy0xLjMgNi4zLTYuMiAxMS4yLTEyLjUgMTIuNWwtNi40IC42Yy03LjMgMS41LTEyLjggOC0xMi44IDE1LjcgMCA4LjggNy4yIDE2IDE2IDE2IDI2LjUgMCA0OC0yMS41IDQ4LTQ4IDAtOC44LTcuMi0xNi0xNi0xNnoiXQogICAgfTsKICAgIGZhR29sZkJhbGwgPSBmYUdvbGZCYWxsVGVlOwogICAgZmFIZXhhZ29uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhleGFnb24iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMTA0M10sICJmMzEyIiwgIk0zMy41IDIyMC4zYy0xMi43IDIyLjItMTIuNyA0OS40IDAgNzEuNWw5Ni4yIDE2OC4xYzEyLjggMjIuNCAzNi43IDM2LjIgNjIuNSAzNi4ybDE5MS42IDBjMjUuOCAwIDQ5LjctMTMuOCA2Mi41LTM2LjJsOTYuMi0xNjguMWMxMi43LTIyLjIgMTIuNy00OS40IDAtNzEuNUw0NDYuMyA1Mi4yQzQzMy41IDI5LjggNDA5LjYgMTYgMzgzLjggMTZMMTkyLjIgMTZjLTI1LjggMC00OS43IDEzLjgtNjIuNSAzNi4yTDMzLjUgMjIwLjN6Il0KICAgIH07CiAgICBmYUZvbGRlck9wZW4yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZvbGRlci1vcGVuIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4MTk0LCAxMjg0NDksIDYxNzE3XSwgImYwN2MiLCAiTTU2IDIyNS42TDMyLjQgMjk2LjIgMzIuNCA5NmMwLTM1LjMgMjguNy02NCA2NC02NGwxMzguNyAwYzEzLjggMCAyNy4zIDQuNSAzOC40IDEyLjhsMzguNCAyOC44YzUuNSA0LjIgMTIuMyA2LjQgMTkuMiA2LjRsMTE3LjMgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDE2LTM2NS40IDBjLTQxLjMgMC03OCAyNi40LTkxLjEgNjUuNnpNNDc3LjggNDQ4TDk5IDQ0OGMtMzIuOCAwLTU1LjktMzIuMS00NS41LTYzLjJsNDgtMTQ0QzEwOCAyMjEuMiAxMjYuNCAyMDggMTQ3IDIwOGwzNzguOCAwYzMyLjggMCA1NS45IDMyLjEgNDUuNSA2My4ybC00OCAxNDRjLTYuNSAxOS42LTI0LjkgMzIuOC00NS41IDMyLjh6Il0KICAgIH07CiAgICBmYUthYWJhID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImthYWJhIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MzMxXSwgImY2NmIiLCAiTTI1NiA1MS4zTDkyLjggMTEyLjQgMjQ3LjUgMTcxLjFjNS41IDIuMSAxMS41IDIuMSAxNyAwTDQxOS4yIDExMi40IDI1NiA1MS4zek0wIDEyOS4zYzAtMjAgMTIuNC0zNy45IDMxLjEtNDQuOWwyMDgtNzhjMTAuOS00LjEgMjIuOC00LjEgMzMuNyAwbDIwOCA3OGMxOC43IDcgMzEuMSAyNC45IDMxLjEgNDQuOWwwIDM2LTI1My4yIDk2Yy0xLjggLjctMy44IC43LTUuNyAwbC0yNTMuMi05NiAwLTM2em0wIDE0MGwwLTUyLjcgMjM2LjEgODkuNmMxMi44IDQuOSAyNi45IDQuOSAzOS43IDBsMjM2LjEtODkuNiAwIDUyLjctMTI4IDQ4LjYgMCA1MS4zIDEyOC00OC42IDAgNjIuMmMwIDIwLTEyLjQgMzcuOS0zMS4xIDQ0LjlsLTIwOCA3OGMtMTAuOSA0LjEtMjIuOCA0LjEtMzMuNyAwbC0yMDgtNzhDMTIuNCA0MjAuNyAwIDQwMi43IDAgMzgyLjdsMC02Mi4yIDEyOCA0OC42IDAtNTEuMy0xMjgtNDguNnpNMjM2LjEgNDEwLjFjMTIuOCA0LjkgMjYuOSA0LjkgMzkuNyAwbDYwLjEtMjIuOCAwLTUxLjMtNzcuMiAyOS4zYy0xLjggLjctMy44IC43LTUuNyAwbC03Ny4yLTI5LjMgMCA1MS4zIDYwLjEgMjIuOHoiXQogICAgfTsKICAgIGZhSGFuZEhvbGRpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1ob2xkaW5nIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY0YmQiLCAiTTY2LjcgMzg0bDQyLjUtNDIuNWMyNC0yNCA1Ni42LTM3LjUgOTAuNS0zNy41TDM1MiAzMDRjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTcyIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTEyLjYgMCAxMTkuNy04OC4yYzE3LjgtMTMuMSA0Mi44LTkuMyA1NS45IDguNXM5LjMgNDIuOC04LjUgNTUuOUw0MzMuMSA0ODUuNWMtMjMuNCAxNy4yLTUxLjYgMjYuNS04MC43IDI2LjVMMzIgNTEyYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTY0YzAtMTcuNyAxNC4zLTMyIDMyLTMybDM0LjcgMHoiXQogICAgfTsKICAgIGZhU2luZ2xlUXVvdGVSaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaW5nbGUtcXVvdGUtcmlnaHQiLAogICAgICBpY29uOiBbMTkyLCA1MTIsIFtdLCAiZTgxYyIsICJNNjQgNDE2Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDggMGMzMC45IDAgNTYtMjUuMSA1Ni01NmwwLTgtNjQgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC02NGMwLTM1LjMgMjguNy02NCA2NC02NGw2NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMTM2YzAgNjYuMy01My43IDEyMC0xMjAgMTIwbC04IDB6Il0KICAgIH07CiAgICBmYUJvdHRsZURyb3BsZXQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm90dGxlLWRyb3BsZXQiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZTRjNCIsICJNODAgMGMwLTE3LjcgMTQuMy0zMiAzMi0zMmw5NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybDAgMTAzLjNjNjQuOSAyMC40IDExMiA4MSAxMTIgMTUyLjdsMCAxOTJjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTQ0Yy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDI4OGMwLTcxLjYgNDcuMS0xMzIuMyAxMTItMTUyLjdMMTEyIDMyQzk0LjMgMzIgODAgMTcuNyA4MCAwem04MCA0MTZjMzUuMyAwIDY0LTMyLjQgNjQtNjQgMC0yMS4yLTI4LjktNjQuNS00Ny45LTkwLjYtOC4xLTExLjEtMjQuMi0xMS4xLTMyLjMgMC0xOSAyNi4xLTQ3LjkgNjkuNC00Ny45IDkwLjYgMCAzMS42IDI4LjcgNjQgNjQgNjR6Il0KICAgIH07CiAgICBmYVdpbmRvd01pbmltaXplMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3aW5kb3ctbWluaW1pemUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg0NjldLCAiZjJkMSIsICJNMCA0MTZjMC0xNy43IDE0LjMtMzIgMzItMzJsNDQ4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgNDQ4Yy0xNy43IDAtMzItMTQuMy0zMi0zMnoiXQogICAgfTsKICAgIGZhQ2hldnJvblJpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoZXZyb24tcmlnaHQiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFs5MDAyXSwgImYwNTQiLCAiTTMxMS4xIDIzMy40YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zbC0xOTIgMTkyYy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM0wyNDMuMiAyNTYgNzMuOSA4Ni42Yy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM3MzMi44LTEyLjUgNDUuMyAwbDE5MiAxOTJ6Il0KICAgIH07CiAgICBmYUVnZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJlZ2ciLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjkzNzBdLCAiZjdmYiIsICJNMTkyIDQ5NkM4NiA0OTYgMCAzOTQgMCAyODggMCAxNzYgNjQgMTYgMTkyIDE2UzM4NCAxNzYgMzg0IDI4OGMwIDEwNi04NiAyMDgtMTkyIDIwOHpNMTU0LjggMTM0YzYuNS02IDctMTYuMSAxLTIyLjZzLTE2LjEtNy0yMi42LTFjLTIzLjkgMjEuOC00MS4xIDUyLjctNTIuMyA4NC4yLTExLjIgMzEuNi0xNi45IDY1LjEtMTYuOSA5My41IDAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZjMC0yNC41IDUtNTQuNCAxNS4xLTgyLjggMTAuMS0yOC41IDI1LTU0LjEgNDMuNy03MS4yeiJdCiAgICB9OwogICAgZmFMYW5kbWFya0RvbWUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGFuZG1hcmstZG9tZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJsYW5kbWFyay1hbHQiXSwgImY3NTIiLCAiTTI1NiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMiAwIC45IDAgMS44IC4xIDIuNi04MC41IDEzLjQtMTQ0IDc2LjktMTU3LjUgMTU3LjRMNjQgMTkyYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDAgMTYwLTUxLjIgMzguNEM0LjcgNDYwLjQgMCA0NjkuOSAwIDQ4MCAwIDQ5Ny43IDE0LjMgNTEyIDMyIDUxMmw0NDggMGMxNy43IDAgMzItMTQuMyAzMi0zMiAwLTEwLjEtNC43LTE5LjYtMTIuOC0yNS42TDQ0OCA0MTYgNDQ4IDI1NmMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMi43IDBjLTEzLjUtODAuNC03Ny0xNDMuOS0xNTcuNS0xNTcuNCAuMS0uOSAuMS0xLjcgLjEtMi42IDAtMTcuNy0xNC4zLTMyLTMyLTMyem04MCAyNTZsNjQgMCAwIDE2MC02NCAwIDAtMTYwek0yMjQgNDE2bDAtMTYwIDY0IDAgMCAxNjAtNjQgMHpNMTEyIDI1Nmw2NCAwIDAgMTYwLTY0IDAgMC0xNjB6Il0KICAgIH07CiAgICBmYUxhbmRtYXJrQWx0ID0gZmFMYW5kbWFya0RvbWU7CiAgICBmYVdvcm0gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid29ybSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNTk5IiwgIk0yMjQgOTZjMC01MyA0My05NiA5Ni05NmwzOC40IDBDNDA3LjkgMCA0NDggNDAuMSA0NDggODkuNkw0NDggMzc2YzAgNzUuMS02MC45IDEzNi0xMzYgMTM2UzE3NiA0NTEuMSAxNzYgMzc2bDAtODBjMC0yMi4xLTE3LjktNDAtNDAtNDBzLTQwIDE3LjktNDAgNDBsMCAxNjhjMCAyNi41LTIxLjUgNDgtNDggNDhTMCA0OTAuNSAwIDQ2NEwwIDI5NmMwLTc1LjEgNjAuOS0xMzYgMTM2LTEzNnMxMzYgNjAuOSAxMzYgMTM2bDAgODBjMCAyMi4xIDE3LjkgNDAgNDAgNDBzNDAtMTcuOSA0MC00MGwwLTE4NC0zMiAwYy01MyAwLTk2LTQzLTk2LTk2em0xNDQtOGEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAweiJdCiAgICB9OwogICAgZmFVc2VySW5qdXJlZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1c2VyLWluanVyZWQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjcyOCIsICJNMjQyLjcgODBMMzM0IDgwYy0xMC43LTI0LjYtMjkuNS00NC45LTUyLjktNTcuNkwyNDIuNyA4MHptLS45LTcwLjdDMjM2IDguNCAyMzAgOCAyMjQgOCAxNzQuOCA4IDEzMi41IDM3LjYgMTE0IDgwbDgwLjYgMCA0Ny4xLTcwLjd6TTIyNCAyNDhjNjYuMyAwIDEyMC01My43IDEyMC0xMjBsLTI0MCAwYzAgNjYuMyA1My43IDEyMCAxMjAgMTIwek05OC43IDM0MS44QzQ5LjMgMzcwLjIgMTYgNDIzLjUgMTYgNDg0LjYgMTYgNDk5LjcgMjguMyA1MTIgNDMuNCA1MTJsMTUxIDAtOTUuOC0xNzAuMnptNDUuMS0xNy43bDQyLjcgNzUuOSA4NS41IDBjNDQuMiAwIDgwIDM1LjggODAgODAgMCAxMS40LTIuNCAyMi4yLTYuNyAzMmw1OS4yIDBjMTUuMSAwIDI3LjQtMTIuMyAyNy40LTI3LjQgMC05MC45LTczLjctMTY0LjYtMTY0LjYtMTY0LjZsLTg2LjkgMGMtMTIuNiAwLTI0LjkgMS40LTM2LjcgNC4xek0yMTMuNSA0NDhsMzYgNjQgMjIuNSAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC01OC41IDB6Il0KICAgIH07CiAgICBmYVN0cmlrZXRocm91Z2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3RyaWtldGhyb3VnaCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMGNjIiwgIk05NiAxNTcuNUM5NiA4OC4yIDE1Mi4yIDMyIDIyMS41IDMyTDM2OCAzMmMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwyMjEuNSA5NmMtMzQgMC02MS41IDI3LjUtNjEuNSA2MS41IDAgMzEgMjMuMSA1Ny4yIDUzLjkgNjFsNDQuMSA1LjUgMjIyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgMjg4Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDgzLjEgMEMxMDMgMjA0LjYgOTYgMTgxLjggOTYgMTU3LjV6TTM0OS4yIDMzNmw2NS41IDBjLjkgNi4xIDEuNCAxMi4yIDEuNCAxOC41IDAgNjkuMy01Ni4yIDEyNS41LTEyNS41IDEyNS41TDE0NCA0ODBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMTQ2LjUgMGMzNCAwIDYxLjUtMjcuNSA2MS41LTYxLjUgMC02LjQtMS0xMi43LTIuOC0xOC41eiJdCiAgICB9OwogICAgZmFCbG9nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJsb2ciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjc4MSIsICJNMjI0IDI0YzAtMTMuMyAxMC43LTI0IDI0LTI0IDE0NS44IDAgMjY0IDExOC4yIDI2NCAyNjQgMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRjMC0xMTkuMy05Ni43LTIxNi0yMTYtMjE2LTEzLjMgMC0yNC0xMC43LTI0LTI0ek04MCA5NmMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDIyNGMwIDI2LjUgMjEuNSA0OCA0OCA0OHM0OC0yMS41IDQ4LTQ4LTIxLjUtNDgtNDgtNDhjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTY0YzAtOC44IDcuMi0xNiAxNi0xNiA3OS41IDAgMTQ0IDY0LjUgMTQ0IDE0NFMyNTUuNSA1MTIgMTc2IDUxMiAzMiA0NDcuNSAzMiAzNjhsMC0yMjRjMC0yNi41IDIxLjUtNDggNDgtNDh6bTE2OCAwYzkyLjggMCAxNjggNzUuMiAxNjggMTY4IDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtNjYuMy01My43LTEyMC0xMjAtMTIwLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYVN0b3B3YXRjaDIwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN0b3B3YXRjaC0yMCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlMDZmIiwgIk0xNjguNSAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDMyIDAgMCAyNS4zYy0xMDggMTEuOS0xOTIgMTAzLjUtMTkyIDIxNC43IDAgMTE5LjMgOTYuNyAyMTYgMjE2IDIxNnMyMTYtOTYuNyAyMTYtMjE2YzAtMzkuOC0xMC44LTc3LjEtMjkuNi0xMDkuMmwyOC4yLTI4LjJjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBsLTIzLjQgMjMuNGMtMzIuOS0zMC4yLTc1LjItNTAuMy0xMjItNTUuNWwwLTI1LjMgMzIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTEyIDB6bS02MCAyNDBjMC0yOC43IDIzLjMtNTIgNTItNTJzNTIgMjMuMyA1MiA1MmwwIDMuOGMwIDExLjctMy4yIDIzLjEtOS4zIDMzbC00My44IDcxLjIgMzMuMSAwYzExIDAgMjAgOSAyMCAyMHMtOSAyMC0yMCAyMGwtNTcuOCAwYy0xNC41IDAtMjYuMi0xMS43LTI2LjItMjYuMiAwLTQuOSAxLjMtOS42IDMuOS0xMy44bDU2LjctOTIuMWMyLjItMy42IDMuNC03LjggMy40LTEyLjFsMC0zLjhjMC02LjYtNS40LTEyLTEyLTEycy0xMiA1LjQtMTIgMTJjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwem0xODAtNTJjMjguNyAwIDUyIDIzLjMgNTIgNTJsMCA5NmMwIDI4LjctMjMuMyA1Mi01MiA1MnMtNTItMjMuMy01Mi01MmwwLTk2YzAtMjguNyAyMy4zLTUyIDUyLTUyem0tMTIgNTJsMCA5NmMwIDYuNiA1LjQgMTIgMTIgMTJzMTItNS40IDEyLTEybDAtOTZjMC02LjYtNS40LTEyLTEyLTEycy0xMiA1LjQtMTIgMTJ6Il0KICAgIH07CiAgICBmYVRydWNrUGlja3VwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRydWNrLXBpY2t1cCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzEyODc2M10sICJmNjNjIiwgIk0zNjMuOCA5Nmw1Ny42IDk2LTEzMy40IDAgMC05NiA3NS44IDB6TTQ5NiAxOTJMNDE4LjYgNjMuMUM0MDcuMSA0My44IDM4Ni4yIDMyIDM2My44IDMyTDI1NiAzMmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAxMjgtMTQ0IDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgODBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzIuNCAwYy0uMiAyLjYtLjQgNS4zLS40IDggMCA0OC42IDM5LjQgODggODggODhzODgtMzkuNCA4OC04OGMwLTIuNy0uMS01LjQtLjQtOGwxNjAuNyAwYy0uMiAyLjYtLjQgNS4zLS40IDggMCA0OC42IDM5LjQgODggODggODhzODgtMzkuNCA4OC04OGMwLTIuNy0uMS01LjQtLjQtOGwzMi40IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsMC04MGMwLTI2LjUtMjEuNS00OC00OC00OGwtNjQgMHpNMTEyIDM5MmE0MCA0MCAwIDEgMSA4MCAwIDQwIDQwIDAgMSAxIC04MCAwem0zNzYtNDBhNDAgNDAgMCAxIDEgMCA4MCA0MCA0MCAwIDEgMSAwLTgweiJdCiAgICB9OwogICAgZmFTZWVkbGluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzZWVkbGluZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyNzc5MywgInNwcm91dCJdLCAiZjRkOCIsICJNNTEyIDMyQzUxMiAxNDAuMSA0MzUuNCAyMzAuMyAzMzMuNiAyNTEuNCAzMjUuNyAxOTMuMyAyOTkuNiAxNDEgMjYxLjEgMTAwLjUgMzAxLjIgNDAgMzY5LjkgMCA0NDggMGwzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMyek0wIDk2QzAgNzguMyAxNC4zIDY0IDMyIDY0bDMyIDBjMTIzLjcgMCAyMjQgMTAwLjMgMjI0IDIyNGwwIDE5MmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTE2MEMxMDAuMyAzMjAgMCAyMTkuNyAwIDk2eiJdCiAgICB9OwogICAgZmFTcHJvdXQgPSBmYVNlZWRsaW5nOwogICAgZmFUcmFuc2dlbmRlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cmFuc2dlbmRlciIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzk4OTUsICJ0cmFuc2dlbmRlci1hbHQiXSwgImYyMjUiLCAiTTEyOC0zMmMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkw5Ny45IDMyIDEzNiA3MC4xIDE1MSA1NWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjlsLTE1IDE1IDE0LjIgMTQuMmMyNy45LTIzLjggNjQuMi0zOC4yIDEwMy44LTM4LjIgMzYuNyAwIDcwLjYgMTIuNCA5Ny42IDMzLjJMNDY2LjcgMzIgNDQ4IDMyYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDk2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA5NmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTE4LjctODQuNCA4NC40YzEzIDIzLjEgMjAuNCA0OS45IDIwLjQgNzguMyAwIDc3LjQtNTUgMTQyLTEyOCAxNTYuOGwwIDM1LjIgMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIgMCAwIDE2YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTYtMzIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwzMiAwIDAtMzUuMmMtNzMtMTQuOC0xMjgtNzkuNC0xMjgtMTU2LjggMC0zMS40IDktNjAuNyAyNC43LTg1LjRsLTE2LjctMTYuNy0xNSAxNWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWwxNS0xNS0zOC4xLTM4LjEgMCAzMC4xYzAgMTcuNy0xNC4zIDMyLTMyIDMyUzAgMTEzLjcgMCA5NkwwIDBDMC0xNy43IDE0LjMtMzIgMzItMzJsOTYgMHpNMjg4IDMzNmE5NiA5NiAwIDEgMCAwLTE5MiA5NiA5NiAwIDEgMCAwIDE5MnoiXQogICAgfTsKICAgIGZhVHJhbnNnZW5kZXJBbHQgPSBmYVRyYW5zZ2VuZGVyOwogICAgZmFTdGFySGFsZjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3Rhci1oYWxmIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbNjE3MzFdLCAiZjA4OSIsICJNMzA0LjEgNy42YzAtMTEuMS03LjYtMjAuNy0xOC40LTIzLjNzLTIxLjkgMi41LTI3IDEyLjRMMTkzLjEgMTI1LjMgMzMuMiAxNTAuN2MtOC45IDEuNC0xNi4zIDcuNy0xOS4xIDE2LjNzLS41IDE4IDUuOCAyNC40bDExNC40IDExNC41LTI1LjIgMTU5LjljLTEuNCA4LjkgMi4zIDE3LjkgOS42IDIzLjJzMTYuOSA2LjEgMjUgMkwyOTEgNDE2LjFjOC00LjEgMTMuMS0xMi40IDEzLjEtMjEuNGwwLTM4Ny4xeiJdCiAgICB9OwogICAgZmFQaG90b0ZpbG0gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGhvdG8tZmlsbSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWyJwaG90by12aWRlbyJdLCAiZjg3YyIsICJNMTkyIDY0YzAtMzUuMyAyOC43LTY0IDY0LTY0TDU3NiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjI0YzAgMzUuMy0yOC43IDY0LTY0IDY0bC0zMjAgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0yMjR6TTMyMCA5NmEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem0xNTYuNSAxMS41QzQ3Mi4xIDEwMC40IDQ2NC40IDk2IDQ1NiA5NnMtMTYuMSA0LjQtMjAuNSAxMS41bC01NCA4OC4zLTE3LjktMjUuNmMtNC41LTYuNC0xMS44LTEwLjItMTkuNy0xMC4ycy0xNS4yIDMuOC0xOS43IDEwLjJsLTU2IDgwYy01LjEgNy4zLTUuOCAxNi45LTEuNiAyNC44UzI3OS4xIDI4OCAyODggMjg4bDI1NiAwYzguNyAwIDE2LjctNC43IDIwLjktMTIuM3M0LjEtMTYuOC0uNS0yNC4zbC04OC0xNDR6TTE0NCAxMjhsMCAxNjBjMCA2MS45IDUwLjEgMTEyIDExMiAxMTJsMTkyIDAgMCAxNmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTkyYzAtMzUuMyAyOC43LTY0IDY0LTY0bDgwIDB6TTUyIDE5NmwwIDI0YzAgOC44IDcuMiAxNiAxNiAxNmwyNCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTI0YzAtOC44LTcuMi0xNi0xNi0xNmwtMjQgMGMtOC44IDAtMTYgNy4yLTE2IDE2em0xNiA4MGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMjRjMCA4LjggNy4yIDE2IDE2IDE2bDI0IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMjRjMC04LjgtNy4yLTE2LTE2LTE2bC0yNCAwem0wIDk2Yy04LjggMC0xNiA3LjItMTYgMTZsMCAyNGMwIDguOCA3LjIgMTYgMTYgMTZsMjQgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0yNGMwLTguOC03LjItMTYtMTYtMTZsLTI0IDB6Il0KICAgIH07CiAgICBmYVBob3RvVmlkZW8gPSBmYVBob3RvRmlsbTsKICAgIGZhUHVtcE1lZGljYWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicHVtcC1tZWRpY2FsIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbXSwgImUwNmEiLCAiTTk2IDBsMCA4MCAxMjggMCAwLTI0IDcyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRTMzA5LjMgOCAyOTYgOGwtNzIgMCAwLThjMC0xNy43LTE0LjMtMzItMzItMzJsLTY0IDBDMTEwLjMtMzIgOTYtMTcuNyA5NiAwek02NCAxMjhjLTM1LjMgMC02NCAyOC43LTY0IDY0TDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE5MiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDEyOHptNjQgMTIwYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDQwIDQwIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC00MCAwIDAgNDBjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC00MC00MCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsNDAgMCAwLTQweiJdCiAgICB9OwogICAgZmFGaXJlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpcmUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjgyOTNdLCAiZjA2ZCIsICJNMTYwLjUtMjYuNGM5LjMtNy44IDIzLTcuNSAzMS45IC45IDEyLjMgMTEuNiAyMy4zIDI0LjQgMzMuOSAzNy40IDEzLjUgMTYuNSAyOS43IDM4LjMgNDUuMyA2NC4yIDUuMi02LjggMTAtMTIuOCAxNC4yLTE3LjkgMS4xLTEuMyAyLjItMi43IDMuMy00LjEgNy45LTkuOCAxNy43LTIyLjEgMzAuOC0yMi4xIDEzLjQgMCAyMi44IDExLjkgMzAuOCAyMi4xIDEuMyAxLjcgMi42IDMuMyAzLjkgNC44IDEwLjMgMTIuNCAyNCAzMC4zIDM3LjcgNTIuNCAyNy4yIDQzLjkgNTUuNiAxMDYuNCA1NS42IDE3Ni42IDAgMTIzLjctMTAwLjMgMjI0LTIyNCAyMjRTMCA0MTEuNyAwIDI4OGMwLTkxLjEgNDEuMS0xNzAgODAuNS0yMjUgMTkuOS0yNy43IDM5LjctNDkuOSA1NC42LTY1LjEgOC4yLTguNCAxNi41LTE2LjcgMjUuNS0yNC4yek0yMjUuNyA0MTZjMjUuMyAwIDQ3LjctNyA2OC44LTIxIDQyLjEtMjkuNCA1My40LTg4LjIgMjguMS0xMzQuNC00LjUtOS0xNi05LjYtMjIuNS0ybC0yNS4yIDI5LjNjLTYuNiA3LjYtMTguNSA3LjQtMjQuNy0uNS0xNy4zLTIyLjEtNDkuMS02Mi40LTY1LjMtODMtNS40LTYuOS0xNS4yLTgtMjEuNS0xLjktMTguMyAxNy44LTUxLjUgNTYuOC01MS41IDEwNC4zIDAgNjguNiA1MC42IDEwOS4yIDExMy43IDEwOS4yeiJdCiAgICB9OwogICAgZmFNYWduaWZ5aW5nR2xhc3NQbHVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hZ25pZnlpbmctZ2xhc3MtcGx1cyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJzZWFyY2gtcGx1cyJdLCAiZjAwZSIsICJNNDE2IDIwOGMwIDQ1LjktMTQuOSA4OC4zLTQwIDEyMi43TDUwMi42IDQ1Ny40YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zcy0zMi44IDEyLjUtNDUuMyAwTDMzMC43IDM3NkMyOTYuMyA0MDEuMSAyNTMuOSA0MTYgMjA4IDQxNiA5My4xIDQxNiAwIDMyMi45IDAgMjA4UzkzLjEgMCAyMDggMCA0MTYgOTMuMSA0MTYgMjA4ek0yMDggMTEyYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDQ4LTQ4IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDggMCAwIDQ4YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC00OCA0OCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC00OCAwIDAtNDhjMC0xMy4zLTEwLjctMjQtMjQtMjR6Il0KICAgIH07CiAgICBmYVNlYXJjaFBsdXMgPSBmYU1hZ25pZnlpbmdHbGFzc1BsdXM7CiAgICBmYUZsYXNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZsYXNrIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYwYzMiLCAiTTI4OCAwTDEyOCAwQzExMC4zIDAgOTYgMTQuMyA5NiAzMnMxNC4zIDMyIDMyIDMyTDEyOCAyMTUuNSA3LjUgNDI2LjNDMi42IDQzNSAwIDQ0NC43IDAgNDU0LjcgMCA0ODYuNCAyNS42IDUxMiA1Ny4zIDUxMmwzMzMuNCAwYzMxLjYgMCA1Ny4zLTI1LjYgNTcuMy01Ny4zIDAtMTAtMi42LTE5LjgtNy41LTI4LjRMMzIwIDIxNS41IDMyMCA2NGMxNy43IDAgMzItMTQuMyAzMi0zMlMzMzcuNyAwIDMyMCAwTDI4OCAwek0xOTIgMjE1LjVsMC0xNTEuNSA2NCAwIDAgMTUxLjVjMCAxMS4xIDIuOSAyMi4xIDguNCAzMS44bDQxLjYgNzIuNy0xNjQgMCA0MS42LTcyLjdjNS41LTkuNyA4LjQtMjAuNiA4LjQtMzEuOHoiXQogICAgfTsKICAgIGZhQWxpZ25SaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhbGlnbi1yaWdodCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMDM4IiwgIk00NDggNjRjMCAxNy43LTE0LjMgMzItMzIgMzJMMTkyIDk2Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDIyNCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMyem0wIDI1NmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMjI0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMjI0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJ6TTAgMTkyYzAtMTcuNyAxNC4zLTMyIDMyLTMybDM4NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDIyNGMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6TTQ0OCA0NDhjMCAxNy43LTE0LjMgMzItMzIgMzJMMzIgNDgwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDM4NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMyeiJdCiAgICB9OwogICAgZmFDYWJsZUNhciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYWJsZS1jYXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg2NzMsIDU3NTUxLCAidHJhbSJdLCAiZjdkYSIsICJNMjg4LTMyYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHpNMTYwIDI0YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6TTMyIDI4OGMwLTM1LjMgMjguNy02NCA2NC02NGwxMzYgMCAwLTk2LjItMTkzLjQgNTUuM2MtMTIuNyAzLjYtMjYtMy43LTI5LjctMTYuNXMzLjctMjYgMTYuNS0yOS43bDIyNC02NCAwIDAgMjI0LTY0YzEyLjctMy42IDI2IDMuNyAyOS43IDE2LjVzLTMuNyAyNi0xNi41IDI5LjdsLTIwNi42IDU5IDAgMTA5LjkgMTM2IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAxNjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMOTYgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTE2MHptODAgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgNjRjMCA4LjggNy4yIDE2IDE2IDE2bDU2IDAgMC05Ni01NiAwem0xODQgOTZsMC05Ni04MCAwIDAgOTYgODAgMHptNDggMGw1NiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTY0YzAtOC44LTcuMi0xNi0xNi0xNmwtNTYgMCAwIDk2eiJdCiAgICB9OwogICAgZmFUcmFtID0gZmFDYWJsZUNhcjsKICAgIGZhS2l0TWVkaWNhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJraXQtbWVkaWNhbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJmaXJzdC1haWQiXSwgImY0NzkiLCAiTTY0IDY0QzI4LjcgNjQgMCA5Mi43IDAgMTI4TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE2IDAgMC0zODQtMTYgMHptNjQgMGwwIDM4NCAyNTYgMCAwLTM4NC0yNTYgMHpNNDQ4IDQ0OGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI1NmMwLTM1LjMtMjguNy02NC02NC02NGwtMTYgMCAwIDM4NCAxNiAwek0yMjQgMTg0YzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDQwIDQwIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC00MCAwIDAgNDBjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC00MC00MCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsNDAgMCAwLTQweiJdCiAgICB9OwogICAgZmFGaXJzdEFpZCA9IGZhS2l0TWVkaWNhbDsKICAgIGZhR3JpcExpbmVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImdyaXAtbGluZXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjdhNCIsICJNMzIgMjg4Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDM4NCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDMyIDI4OHptMC0xMjhjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzg0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgMTYweiJdCiAgICB9OwogICAgZmFCdXJnZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnVyZ2VyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImhhbWJ1cmdlciJdLCAiZjgwNSIsICJNNDggMzg0Yy04LjggMC0xNiA3LjItMTYgMTYgMCA0NC4yIDM1LjggODAgODAgODBsMjg4IDBjNDQuMiAwIDgwLTM1LjggODAtODAgMC04LjgtNy4yLTE2LTE2LTE2TDQ4IDM4NHpNMzIgMjAyYzAgMTIuMiA5LjkgMjIgMjIgMjJMNDU4IDIyNGMxMi4yIDAgMjItOS45IDIyLTIyIDAtMTcuMi0yLjYtMzQuNC0xMC44LTQ5LjUtMjIuMi00MC44LTgyLjMtMTIwLjUtMjEzLjItMTIwLjVTNjUgMTExLjYgNDIuOCAxNTIuNUMzNC42IDE2Ny42IDMyIDE4NC44IDMyIDIwMnpNMCAzMDRjMCAxNy43IDE0LjMgMzIgMzIgMzJsNDQ4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgMjcyYy0xNy43IDAtMzIgMTQuMy0zMiAzMnpNMjU2IDcyYTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHpNMTIwIDEyOGEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwem0yNDgtMjRhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4eiJdCiAgICB9OwogICAgZmFIYW1idXJnZXIgPSBmYUJ1cmdlcjsKICAgIGZhU25vd21hbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzbm93bWFuIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbOTczMSwgOTkyNF0sICJmN2QwIiwgIk00MDMgMjExLjdjMzIuMi0yNC45IDUzLTYzLjkgNTMtMTA3LjcgMC03NS4xLTYwLjktMTM2LTEzNi0xMzZTMTg0IDI4LjkgMTg0IDEwNGMwIDQzLjkgMjAuOCA4Mi45IDUzIDEwNy43LTMyLjIgMTYuMy01OSA0MS44LTc2LjggNzMuMUwxMTIgMjY0LjIgMTEyIDIyNGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDE5LjYtMjIuNS05LjdjLTEyLjItNS4yLTI2LjMgLjQtMzEuNSAxMi42cy40IDI2LjMgMTIuNiAzMS41YzM2LjEgMTUuNSA3NS45IDMyLjUgMTE5LjQgNTEuMi0zLjkgMTQuOS02IDMwLjYtNiA0Ni43IDAgNzAgMzkuMSAxMzAuOCA5Ni42IDE2MS45IDcuOSA0LjMgMTYuOSA2LjEgMjUuOSA2LjFsMTIzIDBjOSAwIDE4LTEuOCAyNS45LTYuMSA1Ny41LTMxLjEgOTYuNi05MiA5Ni42LTE2MS45IDAtMTYuMi0yLjEtMzEuOC02LTQ2LjcgNDMuNS0xOC43IDgzLjQtMzUuNyAxMTkuNC01MS4yIDEyLjItNS4yIDE3LjgtMTkuMyAxMi42LTMxLjVzLTE5LjMtMTcuOC0zMS41LTEyLjZsLTIyLjUgOS43IDAtMTkuNmMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDQwLjItNDguMiAyMC42Yy0xNy45LTMxLjMtNDQuNi01Ni44LTc2LjgtNzMuMXpNMjk2IDQxNmEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwem0yNC0xMjBhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4ek0yNDggODBhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHpNMzY4IDU2YTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHpNMjkyLjIgMTU5LjNjLTIuNy00LjgtNC4yLTEwLjItNC4yLTE1LjcgMC0xNy41IDE0LjItMzEuNiAzMS42LTMxLjZsLjggMGMxNy41IDAgMzEuNiAxNC4yIDMxLjYgMzEuNiAwIDUuNS0xLjQgMTAuOS00LjIgMTUuN0wzMjcgMTk1LjhjLTMuMSA1LjQtMTAuOCA1LjQtMTMuOSAwbC0yMC45LTM2LjZ6Il0KICAgIH07CiAgICBmYUhvdGVsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdGVsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3OTc2XSwgImY1OTQiLCAiTTE2IDI0QzE2IDEwLjcgMjYuNyAwIDQwIDBMNDcyIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTggMCAwIDQxNiA4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRMNDAgNTEyYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDggMCAwLTQxNi04IDBDMjYuNyA0OCAxNiAzNy4zIDE2IDI0em0yMDggODhsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnpNMTI4IDk2Yy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDB6bTk2IDExMmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2ek0zNTIgOTZjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHpNMTEyIDIwOGwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2em0yNDAtMTZjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHpNMjg4IDM4NGw0My44IDBjOS45IDAgMTcuNS05IDE0LTE4LjItMTMuOC0zNi4xLTQ4LjgtNjEuOC04OS43LTYxLjhzLTc1LjkgMjUuNy04OS43IDYxLjhjLTMuNSA5LjIgNC4xIDE4LjIgMTQgMTguMmw0My44IDAgMCA4MCA2NCAwIDAtODB6Il0KICAgIH07CiAgICBmYVByaW50ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInByaW50IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NDI0LCAxMjg0MzgsIDkxMTNdLCAiZjAyZiIsICJNNjQgNjRDNjQgMjguNyA5Mi43IDAgMTI4IDBMMzQxLjUgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN2w0Mi41IDQyLjVjMTIgMTIgMTguNyAyOC4zIDE4LjcgNDUuM2wwIDM3LjUtMzg0IDAgMC04MHpNMCAyNTZjMC0zNS4zIDI4LjctNjQgNjQtNjRsMzg0IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCA5NmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMzIgMCAwIDY0YzAgMzUuMy0yOC43IDY0LTY0IDY0bC0yNTYgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC02NC0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTk2ek0xMjggNDE2bDAgMzIgMjU2IDAgMC05Ni0yNTYgMCAwIDY0ek00NTYgMjcyYTI0IDI0IDAgMSAwIC00OCAwIDI0IDI0IDAgMSAwIDQ4IDB6Il0KICAgIH07CiAgICBmYVZvbGxleWJhbGwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidm9sbGV5YmFsbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyNzk1MiwgInZvbGxleWJhbGwtYmFsbCJdLCAiZjQ1ZiIsICJNNTEyIDI1OC45Yy0yMy40IDgtNDcuOCAxMy4xLTcyLjYgMTUuMSA1LjktOTguNi0zMC43LTE5MS4xLTk0LjktMjU4LjMgOTcuOCAzNiAxNjcuNSAxMzAgMTY3LjUgMjQwLjMgMCAxIDAgMS45IDAgMi45em0tNS45IDUyYy01LjIgMjMuNy0xMy42IDQ2LjItMjQuOSA2Ni45LTk0LjcgNTIuMi0yMTQgNTAtMzA4LjQtMTMuNiAyMS43LTMxLjMgNDkuOC01OC45IDgzLjgtODAuNSA3OS41IDQxLjYgMTY4LjUgNDkuMSAyNDkuNSAyNy4xek0yNzkuNyAyNDEuNmMtMy43LTg5LjctNDEuNy0xNzAuNS0xMDEuMy0yMjkuNyAyMi4zLTcuMSA0Ni0xMS4yIDcwLjUtMTEuOSA5Mi41IDU1LjkgMTUwLjMgMTYwLjMgMTQyLjQgMjczLjgtMzgtMy4yLTc1LjktMTMuNy0xMTEuNi0zMi4zek0xMzAuNSAzMi44QzE0OS4xIDQ5LjEgMTY1LjggNjcuNyAxNzkuOSA4OC4yIDkxLjUgMTMyLjMgMjkuNyAyMTAuMyAzLjcgMjk5LjUgMS4zIDI4NS4zIDAgMjcwLjggMCAyNTYgMCAxNjAuMiA1Mi42IDc2LjcgMTMwLjUgMzIuOHptNzMuNCA5N2MxNi4zIDM0LjUgMjYuMSA3Mi42IDI3LjkgMTEyLjgtNzUuOCA0OC0xMjYuOCAxMjEuMy0xNDguMyAyMDIuNS0xNy42LTE2LjEtMzMtMzQuNi00NS41LTU1IDIuMS0xMDguMSA2My43LTIxMC40IDE2NS45LTI2MC4zek0yNTYgNTEyYy00Ny43IDAtOTIuMy0xMy0xMzAuNS0zNS43IDQuOC0yNC4zIDEyLjYtNDggMjMuMi03MC40IDgyLjQgNTQuNCAxODAuOCA2OC45IDI3MSA0Ny00NC40IDM3LTEwMS41IDU5LjItMTYzLjcgNTkuMnoiXQogICAgfTsKICAgIGZhVm9sbGV5YmFsbEJhbGwgPSBmYVZvbGxleWJhbGw7CiAgICBmYVRyYWZmaWNMaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cmFmZmljLWxpZ2h0IiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbMTI4Njc4XSwgImY2MzciLCAiTTY0LTMyQzI4LjctMzIgMC0zLjMgMCAzMkwwIDM4NGMwIDg4LjQgNzEuNiAxNjAgMTYwIDE2MHMxNjAtNzEuNiAxNjAtMTYwbDAtMzUyYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0LTMyem05NiAzOTJjMzAuOSAwIDU2IDI1LjEgNTYgNTZzLTI1LjEgNTYtNTYgNTYtNTYtMjUuMS01Ni01NiAyNS4xLTU2IDU2LTU2em01Ni0xMDRhNTYgNTYgMCAxIDEgLTExMiAwIDU2IDU2IDAgMSAxIDExMiAwek0xNjAgMTUyYTU2IDU2IDAgMSAxIDAtMTEyIDU2IDU2IDAgMSAxIDAgMTEyeiJdCiAgICB9OwogICAgZmFQbGFuZUNpcmNsZUNoZWNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBsYW5lLWNpcmNsZS1jaGVjayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTU1IiwgIk0yMzIgMjRjMC0zMC45IDI1LjEtNTYgNTYtNTZzNTYgMjUuMSA1NiA1NmwwIDEyNy4zIDc4IDcxLjVjLTY5LjMgMjktMTE4IDk3LjQtMTE4IDE3Ny4yIDAgNDkuMyAxOC42IDk0LjMgNDkuMSAxMjguM0wyODggNTEyIDE3OS45IDUzOWMtMTAuMSAyLjUtMTkuOS01LjEtMTkuOS0xNS41bDAtMTkuOGMwLTQuOSAyLjItOS41IDYtMTIuNWw2Ni01Mi44IDAtOTkuNy0xNjIuOSA1NC4zQzU4LjcgMzk2LjQgNDggMzg4LjcgNDggMzc3LjhsMC00My43YzAtOSAzLjgtMTcuNSAxMC40LTIzLjZMMjMyIDE1MS4zIDIzMiAyNHpNMzUyIDQwMGExNDQgMTQ0IDAgMSAxIDI4OCAwIDE0NCAxNDQgMCAxIDEgLTI4OCAwem0yMDEuNC02MC45Yy03LjEtNS4yLTE3LjItMy42LTIyLjQgMy41bC01MyA3Mi45LTI2LjgtMjYuOGMtNi4yLTYuMi0xNi40LTYuMi0yMi42IDBzLTYuMiAxNi40IDAgMjIuNmw0MCA0MGMzLjMgMy4zIDcuOSA1IDEyLjYgNC42czguOS0yLjggMTEuNy02LjVsNjQtODhjNS4yLTcuMSAzLjYtMTcuMi0zLjUtMjIuM3oiXQogICAgfTsKICAgIGZhVXNlcnMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlcnMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjBjMCIsICJNMzIwIDE2YTEwNCAxMDQgMCAxIDEgMCAyMDggMTA0IDEwNCAwIDEgMSAwLTIwOHpNOTYgODhhNzIgNzIgMCAxIDEgMCAxNDQgNzIgNzIgMCAxIDEgMC0xNDR6TTAgNDE2YzAtNzAuNyA1Ny4zLTEyOCAxMjgtMTI4IDEyLjggMCAyNS4yIDEuOSAzNi45IDUuNC0zMi45IDM2LjgtNTIuOSA4NS40LTUyLjkgMTM4LjZsMCAxNmMwIDExLjQgMi40IDIyLjIgNi43IDMyTDMyIDQ4MGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0zMnptNTIxLjMgNjRjNC4zLTkuOCA2LjctMjAuNiA2LjctMzJsMC0xNmMwLTUzLjItMjAtMTAxLjgtNTIuOS0xMzguNiAxMS43LTMuNSAyNC4xLTUuNCAzNi45LTUuNCA3MC43IDAgMTI4IDU3LjMgMTI4IDEyOGwwIDMyYzAgMTcuNy0xNC4zIDMyLTMyIDMybC04Ni43IDB6TTQ3MiAxNjBhNzIgNzIgMCAxIDEgMTQ0IDAgNzIgNzIgMCAxIDEgLTE0NCAwek0xNjAgNDMyYzAtODguNCA3MS42LTE2MCAxNjAtMTYwczE2MCA3MS42IDE2MCAxNjBsMCAxNmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMjU2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTZ6Il0KICAgIH07CiAgICBmYUNlcnRpZmljYXRlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNlcnRpZmljYXRlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYwYTMiLCAiTTIzOS4yLThjLTYuMS02LjItMTUtOC43LTIzLjQtNi40UzIwMC45LTUuNiAxOTguOCAyLjhMMTgzLjUgNjNjLTEuMSA0LjQtNS42IDctOS45IDUuN0wxMTMuOCA1MS45Yy04LjQtMi40LTE3LjQgMC0yMy41IDYuMXMtOC41IDE1LjEtNi4xIDIzLjVsMTYuOSA1OS44YzEuMiA0LjMtMS40IDguOC01LjcgOS45TDM1LjEgMTY2LjVjLTguNCAyLjEtMTUgOC43LTE3LjMgMTcuMXMuMiAxNy4zIDYuNCAyMy40bDQ0LjUgNDMuM2MzLjIgMy4xIDMuMiA4LjMgMCAxMS41TDI0LjMgMzA1LjFjLTYuMiA2LjEtOC43IDE1LTYuNCAyMy40czguOSAxNC45IDE3LjMgMTcuMWw2MC4yIDE1LjNjNC40IDEuMSA3IDUuNiA1LjcgOS45TDg0LjIgNDMwLjVjLTIuNCA4LjQgMCAxNy40IDYuMSAyMy41czE1LjEgOC41IDIzLjUgNi4xbDU5LjgtMTYuOWM0LjMtMS4yIDguOCAxLjQgOS45IDUuN2wxNS4zIDYwLjJjMi4xIDguNCA4LjcgMTUgMTcuMSAxNy4zczE3LjMtLjIgMjMuNC02LjRsNDMuMy00NC41YzMuMS0zLjIgOC4zLTMuMiAxMS41IDBMMzM3LjMgNTIwYzYuMSA2LjIgMTUgOC43IDIzLjQgNi40czE0LjktOC45IDE3LjEtMTcuM0wzOTMuMSA0NDljMS4xLTQuNCA1LjYtNyA5LjktNS43bDU5LjggMTYuOWM4LjQgMi40IDE3LjQgMCAyMy41LTYuMXM4LjUtMTUuMSA2LjEtMjMuNWwtMTYuOS01OS44Yy0xLjItNC4zIDEuNC04LjggNS43LTkuOWw2MC4yLTE1LjNjOC40LTIuMSAxNS04LjcgMTcuMy0xNy4xcy0uMi0xNy40LTYuNC0yMy40bC00NC41LTQzLjNjLTMuMi0zLjEtMy4yLTguMyAwLTExLjVsNDQuNS00My4zYzYuMi02LjEgOC43LTE1IDYuNC0yMy40cy04LjktMTQuOS0xNy4zLTE3LjFsLTYwLjItMTUuM2MtNC40LTEuMS03LTUuNi01LjctOS45bDE2LjktNTkuOGMyLjQtOC40IDAtMTcuNC02LjEtMjMuNXMtMTUuMS04LjUtMjMuNS02LjFMNDAzIDY4LjhjLTQuMyAxLjItOC44LTEuNC05LjktNS43TDM3Ny44IDIuOGMtMi4xLTguNC04LjctMTUtMTcuMS0xNy4zcy0xNy4zIC4yLTIzLjQgNi40TDI5NCAzNi41Yy0zLjEgMy4yLTguMyAzLjItMTEuNSAwTDIzOS4yLTh6Il0KICAgIH07CiAgICBmYUFsYXJtQ2xvY2syID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFsYXJtLWNsb2NrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTIwMF0sICJmMzRlIiwgIk01MDQuNCAxMzIuNWMtNC41IDEwLjUtMTguNCA5LjgtMjQuOSAuNC0yNy44LTQwLTY2LjEtNzIuMi0xMTEtOTIuNi0xMC40LTQuNy0xMy43LTE4LjMtNC4xLTI0LjYgMTUtOS45IDMzLTE1LjcgNTIuMy0xNS43IDUyLjYgMCA5NS4yIDQyLjYgOTUuMiA5NS4yIDAgMTMuMi0yLjcgMjUuOC03LjYgMzcuM3ptLTQ3MS45IC40Yy02LjUgOS40LTIwLjUgMTAuMS0yNC45LS40LTQuOS0xMS41LTcuNi0yNC4xLTcuNi0zNy4zIDAtNTIuNiA0Mi42LTk1LjIgOTUuMi05NS4yIDE5LjMgMCAzNy4zIDUuOCA1Mi4zIDE1LjcgOS42IDYuMyA2LjMgMTkuOS00LjEgMjQuNi00NC44IDIwLjQtODMuMSA1Mi42LTExMSA5Mi42ek0zOTAuMiA0NjcuNEMzNTIuOCA0OTUuNCAzMDYuMyA1MTIgMjU2IDUxMnMtOTYuOC0xNi42LTEzNC4xLTQ0LjZMODYuNiA1MDIuNmMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNsMzUuMi0zNS4yQzQ4LjYgMzg0LjggMzIgMzM4LjMgMzIgMjg4IDMyIDE2NC4zIDEzMi4zIDY0IDI1NiA2NFM0ODAgMTY0LjMgNDgwIDI4OGMwIDUwLjMtMTYuNiA5Ni44LTQ0LjYgMTM0LjJsMzUuMiAzNS4yYzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zcy0zMi44IDEyLjUtNDUuMyAwbC0zNS4yLTM1LjJ6TTI4MCAxODRjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAxMDRjMCA2LjQgMi41IDEyLjUgNyAxN2w1NiA1NmM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTQ5LTQ5IDAtOTQuMXoiXQogICAgfTsKICAgIGZhSGVsaWNvcHRlclN5bWJvbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoZWxpY29wdGVyLXN5bWJvbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTAyIiwgIk00NDUuNCAyMjRsNjQuNyAwQzQ5NS42IDEwOC4yIDQwMy44IDE2LjQgMjg4IDJsMCA2NC43QzM2OC40IDgwLjEgNDMxLjkgMTQzLjYgNDQ1LjQgMjI0ek01MTAgMjg4bC02NC43IDBDNDMxLjkgMzY4LjQgMzY4LjQgNDMxLjkgMjg4IDQ0NS4zbDAgNjQuN2MxMTUuOC0xNC40IDIwNy42LTEwNi4yIDIyMi0yMjJ6TTIgMjg4QzE2LjQgNDAzLjggMTA4LjIgNDk1LjYgMjI0IDUxMGwwLTY0LjdDMTQzLjYgNDMxLjkgODAuMiAzNjguNCA2Ni43IDI4OEwyIDI4OHptMC02NGw2NC43IDBDODAuMiAxNDMuNiAxNDMuNiA4MC4xIDIyNCA2Ni43TDIyNCAyQzEwOC4yIDE2LjQgMTYuNCAxMDguMiAyIDIyNHptMjA2LTY0YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMTkyYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC02NCA5NiAwIDAgNjRjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE5MmMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDY0LTk2IDAgMC02NHoiXQogICAgfTsKICAgIGZhSG91c2VDaGltbmV5Q3JhY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG91c2UtY2hpbW5leS1jcmFjayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJob3VzZS1kYW1hZ2UiXSwgImY2ZjEiLCAiTTIzNC4yIDguNmMxMi4zLTExLjQgMzEuMy0xMS40IDQzLjUgMEwzNjggOTIuMyAzNjggODBjMC0xNy43IDE0LjMtMzIgMzItMzJsMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDEwMS41IDM3LjggMzUuMWM5LjYgOSAxMi44IDIyLjkgOCAzNS4xUzQ5My4yIDI3MiA0ODAgMjcybC0xNiAwIDAgMTc2YzAgMzUuMy0yOC43IDY0LTY0IDY0bC0xMDUuNiAwLTM4LjQtNjQgODAuOC02Ny4zYzcuOC02LjUgNy42LTE4LjYtLjQtMjQuOUwyMTguNiAyNjMuMmMtMTQuNi0xMS41LTMzLjggNy0yMi44IDIyTDI1NiAzNjggMTcwLjUgNDM5LjJjLTYuMSA1LTcuNSAxMy44LTMuNSAyMC41bDMxLjMgNTIuMi04Ni40IDBjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMTc2LTE2IDBjLTEzLjIgMC0yNS04LjEtMjkuOC0yMC4zcy0xLjYtMjYuMiA4LTM1LjFsMjI0LTIwOHoiXQogICAgfTsKICAgIGZhSG91c2VEYW1hZ2UgPSBmYUhvdXNlQ2hpbW5leUNyYWNrOwogICAgZmFQZXJzb25NaWxpdGFyeVBvaW50aW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1taWxpdGFyeS1wb2ludGluZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTRhIiwgIk0yMTQuOSAxNC4xQzIwMiAxNS4yIDE5MiAyNiAxOTIgMzkgMTkyIDUyLjggMjAzLjIgNjQgMjE3IDY0bDE1MSAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMwLjZDMzg0IDggMzc2IC43IDM2Ni43IDEuNEwyMTQuOSAxNC4xek0yMDggMTEyYzAgNDQuMiAzNS44IDgwIDgwIDgwczgwLTM1LjggODAtODBjMC01LjUtLjYtMTAuOC0xLjYtMTZMMjA5LjYgOTZjLTEgNS4yLTEuNiAxMC41LTEuNiAxNnpNNDAgMjI0Yy0yMi4xIDAtNDAgMTcuOS00MCA0MHMxNy45IDQwIDQwIDQwbDE1MiAwIDAgODkuNCAxNjIuOC0xNjIuOGMtMTMuMy00LjMtMjcuMy02LjUtNDEuNi02LjVMNDAgMjI0em0zNDUuNyAyMC45bC0xNzEuMSAxNzEuMSAxNjkuNCAwIDAtNDYuMyA1My42IDkwLjZjMTEuMiAxOSAzNS44IDI1LjMgNTQuOCAxNC4xczI1LjMtMzUuOCAxNC4xLTU0LjhMNDMwLjMgMjkwLjhjLTExLjItMTktMjYuNi0zNC41LTQ0LjYtNDUuOXpNMTkyIDQ0OGwwIDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMybDEyOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMzItMTkyIDB6Il0KICAgIH07CiAgICBmYURhdGFiYXNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRhdGFiYXNlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYxYzAiLCAiTTQ0OCAyMDUuOGMtMTQuOCA5LjgtMzEuOCAxNy43LTQ5LjUgMjQtNDcgMTYuOC0xMDguNyAyNi4yLTE3NC41IDI2LjJTOTYuNCAyNDYuNSA0OS41IDIyOS44Yy0xNy42LTYuMy0zNC43LTE0LjItNDkuNS0yNEwwIDI4OGMwIDQ0LjIgMTAwLjMgODAgMjI0IDgwczIyNC0zNS44IDIyNC04MGwwLTgyLjJ6bTAtNzcuOGwwLTQ4QzQ0OCAzNS44IDM0Ny43IDAgMjI0IDBTMCAzNS44IDAgODBsMCA0OGMwIDQ0LjIgMTAwLjMgODAgMjI0IDgwczIyNC0zNS44IDIyNC04MHpNMzk4LjUgMzg5LjhDMzUxLjYgNDA2LjUgMjg5LjkgNDE2IDIyNCA0MTZTOTYuNCA0MDYuNSA0OS41IDM4OS44Yy0xNy42LTYuMy0zNC43LTE0LjItNDkuNS0yNEwwIDQzMmMwIDQ0LjIgMTAwLjMgODAgMjI0IDgwczIyNC0zNS44IDIyNC04MGwwLTY2LjJjLTE0LjggOS44LTMxLjggMTcuNy00OS41IDI0eiJdCiAgICB9OwogICAgZmFOZXdzcGFwZXIyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm5ld3NwYXBlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODI0MF0sICJmMWVhIiwgIk0wIDQxNkwwIDEyMGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgMjg4YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRMOTYgOTZjMC0zNS4zIDI4LjctNjQgNjQtNjRsMjg4IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NHpNMTYwIDEyOGwwIDY0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDY0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtNjQgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6bTI0IDI0MGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwyNDAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMjQwIDB6bS0yNC03MmMwIDEzLjMgMTAuNyAyNCAyNCAyNGwyNDAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMjQwIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0ek0zNjAgMTc2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDY0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTY0IDB6Il0KICAgIH07CiAgICBmYUNsb3VkUmFpbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjbG91ZC1yYWluIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3NzgzLCA5OTI2XSwgImY3M2QiLCAiTTk2IDMyMGMtNTMgMC05Ni00My05Ni05NiAwLTQyLjUgMjcuNi03OC42IDY1LjktOTEuMi0xLjMtNi43LTEuOS0xMy43LTEuOS0yMC44IDAtNjEuOSA1MC4xLTExMiAxMTItMTEyIDQzLjEgMCA4MC41IDI0LjMgOTkuMiA2MCAxNC43LTE3LjEgMzYuNS0yOCA2MC44LTI4IDQ0LjIgMCA4MCAzNS44IDgwIDgwIDAgNS41LS42IDEwLjgtMS42IDE2IC41IDAgMS4xIDAgMS42IDAgNTMgMCA5NiA0MyA5NiA5NnMtNDMgOTYtOTYgOTZMOTYgMzIwem0xLjYgNjguMmMxLjEtMi41IDMuNi00LjIgNi40LTQuMnM1LjMgMS42IDYuNCA0LjJsMzAuMiA2OC4yYzIuMiA1LjEgMy40IDEwLjUgMy40IDE2IDAgMjEuOS0xOC4xIDM5LjYtNDAgMzkuNnMtNDAtMTcuNy00MC0zOS42YzAtNS41IDEuMi0xMSAzLjQtMTZsMzAuMi02OC4yem0xNTIgMGMxLjEtMi41IDMuNi00LjIgNi40LTQuMnM1LjMgMS42IDYuNCA0LjJsMzAuMiA2OC4yYzIuMiA1LjEgMy40IDEwLjUgMy40IDE2IDAgMjEuOS0xOC4xIDM5LjYtNDAgMzkuNnMtNDAtMTcuNy00MC0zOS42YzAtNS41IDEuMi0xMSAzLjQtMTZsMzAuMi02OC4yem0xMjEuOCA2OC4ybDMwLjItNjguMmMxLjEtMi41IDMuNi00LjIgNi40LTQuMnM1LjMgMS42IDYuNCA0LjJsMzAuMiA2OC4yYzIuMiA1LjEgMy40IDEwLjUgMy40IDE2IDAgMjEuOS0xOC4xIDM5LjYtNDAgMzkuNnMtNDAtMTcuNy00MC0zOS42YzAtNS41IDEuMi0xMSAzLjQtMTZ6Il0KICAgIH07CiAgICBmYU1heGltaXplID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1heGltaXplIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImV4cGFuZC1hcnJvd3MtYWx0Il0sICJmMzFlIiwgIk0xNjggMzJMMjQgMzJDMTAuNyAzMiAwIDQyLjcgMCA1NkwwIDIwMGMwIDkuNyA1LjggMTguNSAxNC44IDIyLjJTMzQuMSAyMjMuOCA0MSAyMTdsNDAtNDAgNzkgNzktNzkgNzktNDAtNDBjLTYuOS02LjktMTcuMi04LjktMjYuMi01LjJTMCAzMDIuMyAwIDMxMkwwIDQ1NmMwIDEzLjMgMTAuNyAyNCAyNCAyNGwxNDQgMGM5LjcgMCAxOC41LTUuOCAyMi4yLTE0LjhzMS43LTE5LjMtNS4yLTI2LjJsLTQwLTQwIDc5LTc5IDc5IDc5LTQwIDQwYy02LjkgNi45LTguOSAxNy4yLTUuMiAyNi4yUzI3MC4zIDQ4MCAyODAgNDgwbDE0NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtMTQ0YzAtOS43LTUuOC0xOC41LTE0LjgtMjIuMnMtMTkuMy0xLjctMjYuMiA1LjJsLTQwIDQwLTc5LTc5IDc5LTc5IDQwIDQwYzYuOSA2LjkgMTcuMiA4LjkgMjYuMiA1LjJTNDQ4IDIwOS43IDQ0OCAyMDBsMC0xNDRjMC0xMy4zLTEwLjctMjQtMjQtMjRMMjgwIDMyYy05LjcgMC0xOC41IDUuOC0yMi4yIDE0LjhTMjU2LjIgNjYuMSAyNjMgNzNsNDAgNDAtNzkgNzktNzktNzkgNDAtNDBjNi45LTYuOSA4LjktMTcuMiA1LjItMjYuMlMxNzcuNyAzMiAxNjggMzJ6Il0KICAgIH07CiAgICBmYUV4cGFuZEFycm93c0FsdCA9IGZhTWF4aW1pemU7CiAgICBmYUxvY2F0aW9uQXJyb3cgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibG9jYXRpb24tYXJyb3ciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjEyNCIsICJNNDc3LjkgNzUuNWM0LjUtMTEuOCAxLjctMjUuMi03LjItMzQuMXMtMjIuMy0xMS44LTM0LjEtNy4ybC00MTYgMTYwQzcuOSAxOTktLjMgMjExLjIgMCAyMjQuN3M5LjEgMjUuNCAyMS45IDI5LjZsMTc2LjggNTguOSA1OC45IDE3Ni44YzQuMyAxMi44IDE2LjEgMjEuNiAyOS42IDIxLjlzMjUuNy03LjkgMzAuNi0yMC41bDE2MC00MTZ6Il0KICAgIH07CiAgICBmYUNpdHkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2l0eSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyNzk2MV0sICJmNjRmIiwgIk0zMjAgMGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCAzMi00OCAwIDAtNzJjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCA3Mi02NCAwIDAtNzJDOTYgMTAuNyA4NS4zIDAgNzIgMFM0OCAxMC43IDQ4IDI0bDAgNzRjLTI3LjYgNy4xLTQ4IDMyLjItNDggNjJMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsNDQ4IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xOTJjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTY0IDAgMC0xMjhjMC0zNS4zLTI4LjctNjQtNjQtNjRMMzIwIDB6bTY0IDExMmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2em0tMTYgODBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMHptMTYgMTEybDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZ6bTExMi0xNmM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwek0yNTYgMzA0bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZ6TTI0MCAxOTJjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMHpNMTI4IDMwNGwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2ek0xMTIgMTkyYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDB6Il0KICAgIH07CiAgICBmYVhSYXkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAieC1yYXkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjQ5NyIsICJNMCA2NEMwIDQ2LjMgMTQuMyAzMiAzMiAzMmw0NDggMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwwIDMyMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA0ODBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJMMzIgOTZDMTQuMyA5NiAwIDgxLjcgMCA2NHptMjgwIDU2YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTYtNjQgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw2NCAwIDAgNDgtODAgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw4MCAwIDAgNDgtNjQgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw2NCAwIDAgMTZjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTE2IDY0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTY0IDAgMC00OCA4MCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC04MCAwIDAtNDggNjQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNjQgMCAwLTE2eiJdCiAgICB9OwogICAgZmFVbWJyZWxsYUJlYWNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVtYnJlbGxhLWJlYWNoIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3OTU4XSwgImY1Y2EiLCAiTTQ5Ny41IDM0MS4xYy01LjkgMTYuNy0yNS4zIDIzLTQxLjEgMTUuMWwtMTc4LjItODkuMS0xLjYgMy4yLTg4LjggMTc3LjcgMjkyLjIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA1MTJjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsODQuMiAwIDEwMy4yLTIwNi4zIDEuNi0zLjItMTY1LjQtODIuN2MtMTUuOC03LjktMjIuNC0yNy4zLTEyLjUtNDIgNDUuOS02OC42IDEyNC4xLTExMy44IDIxMi45LTExMy44IDE0MS40IDAgMjU2IDExNC42IDI1NiAyNTYgMCAyOS44LTUuMSA1OC41LTE0LjUgODUuMXoiXQogICAgfTsKICAgIGZhQXJyb3dSaWdodFRvQnJhY2tldCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy1yaWdodC10by1icmFja2V0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNpZ24taW4iXSwgImYwOTAiLCAiTTM1MiA5Nmw2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMjU2YzAgMTcuNy0xNC4zIDMyLTMyIDMybC02NCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDY0IDBjNTMgMCA5Ni00MyA5Ni05NmwwLTI1NmMwLTUzLTQzLTk2LTk2LTk2bC02NCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMyem0tOS40IDE4Mi42YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zbC0xMjgtMTI4Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM0wyNDIuNyAyMjQgMzIgMjI0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDIxMC43IDAtNzMuNCA3My40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwbDEyOC0xMjh6Il0KICAgIH07CiAgICBmYVNpZ25JbiA9IGZhQXJyb3dSaWdodFRvQnJhY2tldDsKICAgIGZhSGVhZHNldCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoZWFkc2V0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY1OTAiLCAiTTIyNCA2NGMtNzkgMC0xNDQuNyA1Ny4zLTE1Ny43IDEzMi43IDkuMy0zIDE5LjMtNC43IDI5LjctNC43bDE2IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA5NmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTYgMGMtNTMgMC05Ni00My05Ni05NmwwLTY0QzAgMTAwLjMgMTAwLjMgMCAyMjQgMFM0NDggMTAwLjMgNDQ4IDIyNGwwIDE2OC4xYzAgNjYuMy01My44IDEyMC0xMjAuMSAxMjBsLTg3LjktLjEtMzIgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhzMjEuNS00OCA0OC00OGwzMiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMCA0MCAwYzM5LjggMCA3Mi0zMi4yIDcyLTcybDAtMjAuOWMtMTQuMSA4LjItMzAuNSAxMi44LTQ4IDEyLjhsLTE2IDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtOTZjMC0yNi41IDIxLjUtNDggNDgtNDhsMTYgMGMxMC40IDAgMjAuMyAxLjYgMjkuNyA0LjctMTMtNzUuMy03OC42LTEzMi43LTE1Ny43LTEzMi43eiJdCiAgICB9OwogICAgZmFTcGxvdGNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNwbG90Y2giLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjViYyIsICJNMjA4LjUgNjIuM2wyOC4xLTM2LjlDMjQ4LjggOS40IDI2Ny44IDAgMjg4IDAgMzE2LjUgMCAzNDEuNiAxOC43IDM0OS44IDQ2bDE3LjggNTkuNGMxMC4zIDM0LjQgMzYuMSA2MiA2OS44IDc0LjZsMzkuOCAxNC45YzIwLjkgNy45IDM0LjggMjcuOSAzNC44IDUwLjIgMCAxNi45LTcuOSAzMi44LTIxLjUgNDIuOWwtNjcuMyA1MC41Yy0yNC4zIDE4LjItMzcuMiA0Ny45LTMzLjggNzguMWwyLjUgMjIuN2M0LjMgMzguNy0yNiA3Mi42LTY1IDcyLjYtMTQuOCAwLTI5LjMtNS4xLTQwLjktMTQuM2wtNTUuMy00NC4zYy00LjUtMy42LTkuMy02LjctMTQuNS05LjItMTUuOC03LjktMzMuNy0xMC40LTUxLTcuM0w4Mi40IDQ1MS45Yy0zNC42IDYuMy02Ni40LTIwLjMtNjYuNC01NS40IDAtMTMuMiA0LjctMjYgMTMuMS0zNi4ybDExLjItMTMuNGMxNC42LTE3LjQgMjIuNi0zOS40IDIyLjYtNjIuMSAwLTE4LjgtNS41LTM3LjItMTUuOC01M0w4LjggMTczLjVDMy4xIDE2NC43IDAgMTU0LjQgMCAxNDMuOSAwIDExMC41IDMwLjEgODUuMSA2MyA5MC43bDUxLjMgOC43YzM1LjkgNi4xIDcyLjItOC4yIDk0LjItMzcuMXoiXQogICAgfTsKICAgIGZhVXBMb25nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVwLWxvbmciLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFsibG9uZy1hcnJvdy1hbHQtdXAiXSwgImYzMGMiLCAiTTEzNy40LTIyLjZjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBsMTI4IDEyOGM5LjIgOS4yIDExLjkgMjIuOSA2LjkgMzQuOVMzMDAuOSAxNjAgMjg4IDE2MGwtNjQgMCAwIDMzNmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMzIgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC0zMzYtNjQgMGMtMTIuOSAwLTI0LjYtNy44LTI5LjYtMTkuOFMuMiAxMTQuNSA5LjQgMTA1LjRsMTI4LTEyOHoiXQogICAgfTsKICAgIGZhTG9uZ0Fycm93QWx0VXAgPSBmYVVwTG9uZzsKICAgIGZhSGV4YWdvbk5vZGVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhleGFnb24tbm9kZXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTY5OSIsICJNMjQ4IDEwNi42YzE4LjktOSAzMi0yOC4zIDMyLTUwLjZjMC0zMC45LTI1LjEtNTYtNTYtNTZzLTU2IDI1LjEtNTYgNTZjMCAyMi4zIDEzLjEgNDEuNiAzMiA1MC42bDAgOTguOGMtMi44IDEuMy01LjUgMi45LTggNC43bC04MC4xLTQ1LjhjMS42LTIwLjgtOC42LTQxLjYtMjcuOS01Mi44QzU3LjIgOTYgMjMgMTA1LjIgNy41IDEzMlMxLjIgMTkzIDI4IDIwOC41YzEuMyAuOCAyLjYgMS41IDQgMi4xbDAgOTAuOGMtMS4zIC42LTIuNyAxLjMtNCAyLjFDMS4yIDMxOS04IDM1My4yIDcuNSAzODBTNTcuMiA0MTYgODQgNDAwLjVjMTkuMy0xMS4xIDI5LjQtMzIgMjcuOC01Mi44bDUwLjUtMjguOWMtMTEuNS0xMS4yLTE5LjktMjUuNi0yMy44LTQxLjdMODggMzA2LjFjLTIuNi0xLjgtNS4yLTMuMy04LTQuN2wwLTkwLjhjMi44LTEuMyA1LjUtMi45IDgtNC43bDgwLjEgNDUuOGMtLjEgMS40LS4yIDIuOC0uMiA0LjNjMCAyMi4zIDEzLjEgNDEuNiAzMiA1MC42bDAgOTguOGMtMTguOSA5LTMyIDI4LjMtMzIgNTAuNmMwIDMwLjkgMjUuMSA1NiA1NiA1NnM1Ni0yNS4xIDU2LTU2YzAtMjIuMy0xMy4xLTQxLjYtMzItNTAuNmwwLTk4LjhjMi44LTEuMyA1LjUtMi45IDgtNC43bDgwLjEgNDUuOGMtMS42IDIwLjggOC42IDQxLjYgMjcuOCA1Mi44YzI2LjggMTUuNSA2MSA2LjMgNzYuNS0yMC41czYuMy02MS0yMC41LTc2LjVjLTEuMy0uOC0yLjctMS41LTQtMi4xbDAtOTAuOGMxLjQtLjYgMi43LTEuMyA0LTIuMWMyNi44LTE1LjUgMzYtNDkuNyAyMC41LTc2LjVTMzkwLjggOTYgMzY0IDExMS41Yy0xOS4zIDExLjEtMjkuNCAzMi0yNy44IDUyLjhsLTUwLjYgMjguOWMxMS41IDExLjIgMTkuOSAyNS42IDIzLjggNDEuN0wzNjAgMjA1LjljMi42IDEuOCA1LjIgMy4zIDggNC43bDAgOTAuOGMtMi44IDEuMy01LjUgMi45LTggNC42bC04MC4xLTQ1LjhjLjEtMS40IC4yLTIuOCAuMi00LjNjMC0yMi4zLTEzLjEtNDEuNi0zMi01MC42bDAtOTguOHoiXQogICAgfTsKICAgIGZhSG9zcGl0YWwyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvc3BpdGFsIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI3OTczLCA2MjU4OSwgImhvc3BpdGFsLWFsdCIsICJob3NwaXRhbC13aWRlIl0sICJmMGY4IiwgIk0xMjggNjRjMC0zNS4zIDI4LjctNjQgNjQtNjRMMzg0IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCA2NCA2NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjU2YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxOTJjMC0zNS4zIDI4LjctNjQgNjQtNjRsNjQgMCAwLTY0ek0yNzIgMzUyYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDgwIDk2IDAgMC04MGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtMzIgMHpNMTI4IDM2OGwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2ek0xMTIgMjU2YzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDB6TTUxMiAzNjhsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNnpNNDk2IDI1NmM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwek0yNjQgMTA0bDAgMzItMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMTZjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDAgMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMTYgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMiAzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTE2YzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMCAwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMTYgMGMtOC44IDAtMTYgNy4yLTE2IDE2eiJdCiAgICB9OwogICAgZmFIb3NwaXRhbEFsdDIgPSBmYUhvc3BpdGFsMjsKICAgIGZhSG9zcGl0YWxXaWRlMiA9IGZhSG9zcGl0YWwyOwogICAgZmFQZXJzb25IYXJhc3NpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLWhhcmFzc2luZyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTQ5IiwgIk0xOTIgOTZhNDggNDggMCAxIDAgMC05NiA0OCA0OCAwIDEgMCAwIDk2ek01OS40IDMwNC41TDg4IDI1Ni45IDg4IDQ4MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTI4IDE2IDAgMCAxMjhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTI0NC43IDQ3LjQgNTcuMWMxMS4zIDEzLjYgMzEuNSAxNS41IDQ1LjEgNC4yczE1LjUtMzEuNSA0LjItNDUuMWwtNzMuNy04OC45Yy0xOC4yLTIyLTQ1LjMtMzQuNy03My45LTM0LjdsLTM1LjkgMGMtMzMuNyAwLTY0LjkgMTcuNy04Mi4zIDQ2LjZsLTU4LjMgOTdjLTkuMSAxNS4xLTQuMiAzNC44IDEwLjkgNDMuOXMzNC44IDQuMiA0My45LTEwLjl6TTQ4MCAyNDBhNDggNDggMCAxIDAgLTk2IDAgNDggNDggMCAxIDAgOTYgMHpNNDY0IDM0NGwwIDU4LjctNDEuNC00MS40Yy03LjMtNy4zLTE3LjYtMTAuNi0yNy44LTlzLTE4LjkgOC4xLTIzLjUgMTcuM2wtNDggOTZjLTcuOSAxNS44LTEuNSAzNSAxNC4zIDQyLjlzMzUgMS41IDQyLjktMTQuM2wyOC4xLTU2LjMgNTQuNyA1NC43YzEyLjQgMTIuNCAyOS4xIDE5LjMgNDYuNiAxOS4zIDM2LjQgMCA2NS45LTI5LjUgNjUuOS02NS45TDU3NiAzNDRjMC0zMC45LTI1LjEtNTYtNTYtNTZzLTU2IDI1LjEtNTYgNTZ6TTI4OCA0OGMwIDguOCA3LjIgMTYgMTYgMTZsNTYgMGM4LjggMCAxNi03LjIgMTYtMTZzLTcuMi0xNi0xNi0xNmwtNTYgMGMtOC44IDAtMTYgNy4yLTE2IDE2em0tLjggNDkuN2MtNy45LTQtMTcuNS0uNy0yMS41IDcuMnMtLjcgMTcuNSA3LjIgMjEuNWw0OCAyNGM3LjkgNCAxNy41IC43IDIxLjUtNy4ycy43LTE3LjUtNy4yLTIxLjVsLTQ4LTI0eiJdCiAgICB9OwogICAgZmFNb25leUJpbGxUcmVuZFVwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vbmV5LWJpbGwtdHJlbmQtdXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTUyOSIsICJNNDgwIDhjMC0xMy4zLTEwLjctMjQtMjQtMjRMMzU0LjItMTZjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDMuOSAwLTExMS4zIDExMS4zLTk1LjEtODEuNWMtOS03LjctMjIuMi03LjctMzEuMiAwbC0xMTIgOTZjLTEwLjEgOC42LTExLjIgMjMuOC0yLjYgMzMuOHMyMy44IDExLjIgMzMuOCAyLjZsOTYuNC04Mi42IDk2LjQgODIuNmM5LjUgOC4yIDIzLjcgNy42IDMyLjYtMS4zbDEyNy0xMjcgMCA0My45YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRMNDgwIDh6TTQ4IDI1NmMtMjYuNSAwLTQ4IDIxLjUtNDggNDhMMCA0NjRjMCAyNi41IDIxLjUgNDggNDggNDhsNDE2IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0xNjBjMC0yNi41LTIxLjUtNDgtNDgtNDhMNDggMjU2em00Ny4zIDU2Yy0zLjQgMjAuMS0xOS4yIDM2LTM5LjQgMzkuNC00LjQgLjctOC0yLjktOC03LjNsMC0zMmMwLTQuNCAzLjYtOCA4LThsMzIgMGM0LjQgMCA4LjEgMy42IDcuMyA4em0wIDE0NC4xYy43IDQuNC0yLjkgOC03LjMgOGwtMzIgMGMtNC40IDAtOC0zLjYtOC04bDAtMzJjMC00LjQgMy42LTguMSA4LTcuMyAyMC4xIDMuNCAzNiAxOS4yIDM5LjQgMzkuNHpNNDU2IDQxNi43YzQuNC0uNyA4IDIuOSA4IDcuM2wwIDMyYzAgNC40LTMuNiA4LTggOGwtMzIgMGMtNC40IDAtOC4xLTMuNi03LjMtOCAzLjQtMjAuMSAxOS4yLTM2IDM5LjQtMzkuNHpNNDE2LjcgMzEyYy0uNy00LjQgMi45LTggNy4zLThsMzIgMGM0LjQgMCA4IDMuNiA4IDhsMCAzMmMwIDQuNC0zLjYgOC4xLTggNy4zLTIwLjEtMy40LTM2LTE5LjItMzkuNC0zOS40ek0xOTIgMzg0YTY0IDY0IDAgMSAxIDEyOCAwIDY0IDY0IDAgMSAxIC0xMjggMHoiXQogICAgfTsKICAgIGZhUGVuUnVsZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVuLXJ1bGVyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInBlbmNpbC1ydWxlciJdLCAiZjVhZSIsICJNNDA0IDBjMTkuMiAwIDM3LjYgNy42IDUxLjEgMjEuMmwzNS43IDM1LjdDNTA0LjQgNzAuNCA1MTIgODguOCA1MTIgMTA4cy03LjYgMzcuNi0yMS4yIDUxLjFMNDQ1LjkgMjA0IDMwOCA2Ni4xIDM1Mi45IDIxLjJDMzY2LjQgNy42IDM4NC44IDAgNDA0IDB6TTU4LjkgMzE1LjFMMjc0LjEgMTAwIDQxMiAyMzcuOSAxOTYuOSA0NTMuMWMtMTAuNyAxMC43LTI0LjEgMTguNS0zOC43IDIyLjZMMzAuNCA1MTEuMWMtOC4zIDIuMy0xNy4zIDAtMjMuNC02LjJzLTguNS0xNS4xLTYuMi0yMy40TDM2LjQgMzUzLjhjNC4xLTE0LjYgMTEuOC0yNy45IDIyLjYtMzguN3pNMjI1LjQgODAuOEw4MC44IDIyNS40IDExLjcgMTU2LjNjLTE1LjYtMTUuNi0xNS42LTQwLjkgMC01Ni42bDg4LTg4YzE1LjYtMTUuNiA0MC45LTE1LjYgNTYuNiAwbDUuOSA1LjktNTYuMyA1Ni4zYy03LjggNy44LTcuOCAyMC41IDAgMjguM3MyMC41IDcuOCAyOC4zIDBsNTYuMy01Ni4zIDM0LjkgMzQuOXpNNDMxLjIgMjg2LjZsMzQuOSAzNC45LTU2LjMgNTYuM2MtNy44IDcuOC03LjggMjAuNSAwIDI4LjNzMjAuNSA3LjggMjguMyAwbDU2LjMtNTYuMyA1LjkgNS45YzE1LjYgMTUuNiAxNS42IDQwLjkgMCA1Ni42bC04OCA4OGMtMTUuNiAxNS42LTQwLjkgMTUuNi01Ni42IDBsLTY5LjEtNjkuMSAxNDQuNi0xNDQuNnoiXQogICAgfTsKICAgIGZhUGVuY2lsUnVsZXIgPSBmYVBlblJ1bGVyOwogICAgZmFSZXBlYXQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicmVwZWF0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MjU3XSwgImYzNjMiLCAiTTQ3MC42IDExOC42YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zbC02NC02NGMtOS4yLTkuMi0yMi45LTExLjktMzQuOS02LjlTMzUyIDE5LjEgMzUyIDMybDAgMzItMTYwIDBDODYgNjQgMCAxNTAgMCAyNTYgMCAyNzMuNyAxNC4zIDI4OCAzMiAyODhzMzItMTQuMyAzMi0zMmMwLTcwLjcgNTcuMy0xMjggMTI4LTEyOGwxNjAgMCAwIDMyYzAgMTIuOSA3LjggMjQuNiAxOS44IDI5LjZzMjUuNyAyLjIgMzQuOS02LjlsNjQtNjR6TTQxLjQgMzkzLjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zbDY0IDY0YzkuMiA5LjIgMjIuOSAxMS45IDM0LjkgNi45UzE2MCA0OTIuOSAxNjAgNDgwbDAtMzIgMTYwIDBjMTA2IDAgMTkyLTg2IDE5Mi0xOTIgMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJjMCA3MC43LTU3LjMgMTI4LTEyOCAxMjhsLTE2MCAwIDAtMzJjMC0xMi45LTcuOC0yNC42LTE5LjgtMjkuNnMtMjUuNy0yLjItMzQuOSA2LjlsLTY0IDY0eiJdCiAgICB9OwogICAgZmFCb25lID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvbmUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjk0NjBdLCAiZjVkNyIsICJNMTk3LjQgMTYwYy0zLjkgMC03LjItMi44LTguMS02LjYtMTAuMi00Mi4xLTQ4LjEtNzMuNC05My4zLTczLjQtNTMgMC05NiA0My05NiA5NiAwIDI5LjEgMTIuOSA1NS4xIDMzLjMgNzIuNyA0LjMgMy43IDQuMyAxMC44IDAgMTQuNS0yMC40IDE3LjYtMzMuMyA0My43LTMzLjMgNzIuNyAwIDUzIDQzIDk2IDk2IDk2IDQ1LjIgMCA4My4xLTMxLjMgOTMuMy03My40IC45LTMuOCA0LjItNi42IDguMS02LjZsMjQ1LjEgMGMzLjkgMCA3LjIgMi44IDguMSA2LjYgMTAuMiA0Mi4xIDQ4LjEgNzMuNCA5My4zIDczLjQgNTMgMCA5Ni00MyA5Ni05NiAwLTI5LjEtMTIuOS01NS4xLTMzLjMtNzIuNy00LjMtMy43LTQuMy0xMC44IDAtMTQuNSAyMC40LTE3LjYgMzMuMy00My43IDMzLjMtNzIuNyAwLTUzLTQzLTk2LTk2LTk2LTQ1LjIgMC04My4xIDMxLjMtOTMuMyA3My40LS45IDMuOC00LjIgNi42LTguMSA2LjZsLTI0NS4xIDB6Il0KICAgIH07CiAgICBmYUZpcmVGbGFtZUN1cnZlZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaXJlLWZsYW1lLWN1cnZlZCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJmaXJlLWFsdCJdLCAiZjdlNCIsICJNMTUzLjYgMjkuOWwxNi0yMS4zQzE3My42IDMuMiAxODAgMCAxODYuNyAwIDE5OC40IDAgMjA4IDkuNiAyMDggMjEuM2wwIDIyLjFjMCAxMy4xIDUuNCAyNS43IDE0LjkgMzQuN0wzMDcuNiAxNTlDMzU2LjQgMjA1LjYgMzg0IDI3MC4yIDM4NCAzMzcuNyAzODQgNDM0IDMwNiA1MTIgMjA5LjcgNTEyTDE5MiA1MTJDODYgNTEyIDAgNDI2IDAgMzIwbDAtMy44YzAtNDguOCAxOS40LTk1LjYgNTMuOS0xMzAuMWwzLjUtMy41YzQuMi00LjIgMTAtNi42IDE2LTYuNiAxMi41IDAgMjIuNiAxMC4xIDIyLjYgMjIuNkw5NiAyODhjMCAzNS4zIDI4LjcgNjQgNjQgNjRzNjQtMjguNyA2NC02NGwwLTMuOWMwLTE4LTcuMi0zNS4zLTE5LjktNDhsLTM4LjYtMzguNmMtMjQtMjQtMzcuNS01Ni43LTM3LjUtOTAuNyAwLTI3LjcgOS01NC44IDI1LjYtNzYuOXoiXQogICAgfTsKICAgIGZhRmlyZUFsdCA9IGZhRmlyZUZsYW1lQ3VydmVkOwogICAgZmFCdXNTaW1wbGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnVzLXNpbXBsZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJidXMtYWx0Il0sICJmNTVlIiwgIk05NiAwQzQzIDAgMCA0MyAwIDk2TDAgMzg0YzAgMjkuOCAyMC40IDU0LjkgNDggNjJsMCAzNGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxNiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMzIgMTkyIDAgMCAzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxNiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMzRjMjcuNi03LjEgNDgtMzIuMiA0OC02MmwwLTI4OGMwLTUzLTQzLTk2LTk2LTk2TDk2IDB6TTY0IDEyOGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwyNTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDk2YzAgMTcuNy0xNC4zIDMyLTMyIDMyTDk2IDI1NmMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC05NnpNOTYgMzIwYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHptMjU2IDBhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFCdXNBbHQgPSBmYUJ1c1NpbXBsZTsKICAgIGZhVmVudXNNYXJzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZlbnVzLW1hcnMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFs5ODkyXSwgImYyMjgiLCAiTTQ4MC02NGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJTNDYyLjMgMCA0ODAgMEw1MzAuNyAwIDQ3NCA1Ni43Yy0yNi4zLTE1LjctNTcuMS0yNC43LTkwLTI0LjctMzUuNCAwLTY4LjQgMTAuNS05NiAyOC41LTI3LjYtMTgtNjAuNi0yOC41LTk2LTI4LjUtOTcuMiAwLTE3NiA3OC44LTE3NiAxNzYgMCA4Ni4zIDYyLjEgMTU4LjEgMTQ0IDE3My4xbDAgMzQuOS0zMiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDMyIDAgMCAzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzIgMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMzIgMCAwLTM0LjljMjMuMy00LjMgNDQuOS0xMy4xIDY0LTI1LjYgMjcuNiAxOCA2MC42IDI4LjUgOTYgMjguNSA5Ny4yIDAgMTc2LTc4LjggMTc2LTE3NiAwLTQxLjEtMTQuMS03OS0zNy44LTEwOUw1NzYgNDUuMyA1NzYgOTZjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTEyOGMwLTE3LjctMTQuMy0zMi0zMi0zMkw0ODAtNjR6TTMzNiAzMDkuMmMyMC4yLTI4LjYgMzItNjMuNSAzMi0xMDEuMnMtMTEuOC03Mi42LTMyLTEwMS4yYzE0LjYtNi45IDMwLjgtMTAuOCA0OC0xMC44IDYxLjkgMCAxMTIgNTAuMSAxMTIgMTEyUzQ0NS45IDMyMCAzODQgMzIwYy0xNy4yIDAtMzMuNS0zLjktNDgtMTAuOHpNMjg4IDE1MC4zYzEwLjIgMTYuOSAxNiAzNi42IDE2IDU3LjdzLTUuOCA0MC45LTE2IDU3LjdjLTEwLjItMTYuOS0xNi0zNi42LTE2LTU3LjdzNS44LTQwLjkgMTYtNTcuN3ptLTQ4LTQzLjVjLTIwLjIgMjguNi0zMiA2My41LTMyIDEwMS4yczExLjggNzIuNiAzMiAxMDEuMmMtMTQuNSA2LjktMzAuOCAxMC44LTQ4IDEwLjgtNjEuOSAwLTExMi01MC4xLTExMi0xMTJTMTMwLjEgOTYgMTkyIDk2YzE3LjIgMCAzMy41IDMuOSA0OCAxMC44eiJdCiAgICB9OwogICAgZmFCbGVuZGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJsZW5kZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjUxNyIsICJNMCA1NkMwIDI1LjEgMjUuMSAwIDU2IDBMNDM3LjYgMGMyMS4zIDAgMzYuNiAyMC4zIDMwLjggNDAuOEw0NTcuMSA4MCAzNDQgODBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsOTkuNCAwLTE4LjMgNjQtODEuMSAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDY3LjQgMC0yNy40IDk2LTI1NiAwLTkuMS05Ni02Mi45IDBjLTMwLjkgMC01Ni0yNS4xLTU2LTU2TDAgNTZ6TTExNC4zIDE5MkwxMDAuNiA0OCA1NiA0OGMtNC40IDAtOCAzLjYtOCA4bDAgMTI4YzAgNC40IDMuNiA4IDggOGw1OC4zIDB6TTEzNiAzODRsMjQwIDBjMjIuMSAwIDQwIDE3LjkgNDAgNDBsMCA0OGMwIDIyLjEtMTcuOSA0MC00MCA0MGwtMjQwIDBjLTIyLjEgMC00MC0xNy45LTQwLTQwbDAtNDhjMC0yMi4xIDE3LjktNDAgNDAtNDB6bTEyMCA4OGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6Il0KICAgIH07CiAgICBmYVUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidSIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzExN10sICI1NSIsICJNMzIgMzJjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAyMjRjMCA3MC43IDU3LjMgMTI4IDEyOCAxMjhzMTI4LTU3LjMgMTI4LTEyOGwwLTIyNGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMjI0YzAgMTA2LTg2IDE5Mi0xOTIgMTkyUzAgMzk0IDAgMjg4TDAgNjRDMCA0Ni4zIDE0LjMgMzIgMzIgMzJ6Il0KICAgIH07CiAgICBmYVNoYXJlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNoYXJlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbIm1haWwtZm9yd2FyZCJdLCAiZjA2NCIsICJNMzA3LjggMTguNGMtMTIgNS0xOS44IDE2LjYtMTkuOCAyOS42bDAgODAtMTEyIDBjLTk3LjIgMC0xNzYgNzguOC0xNzYgMTc2IDAgMTEzLjMgODEuNSAxNjMuOSAxMDAuMiAxNzQuMSAyLjUgMS40IDUuMyAxLjkgOC4xIDEuOSAxMC45IDAgMTkuNy04LjkgMTkuNy0xOS43IDAtNy41LTQuMy0xNC40LTkuOC0xOS41LTkuNC04LjgtMjIuMi0yNi40LTIyLjItNTYuNyAwLTUzIDQzLTk2IDk2LTk2bDk2IDAgMCA4MGMwIDEyLjkgNy44IDI0LjYgMTkuOCAyOS42czI1LjcgMi4yIDM0LjktNi45bDE2MC0xNjBjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNsLTE2MC0xNjBjLTkuMi05LjItMjIuOS0xMS45LTM0LjktNi45eiJdCiAgICB9OwogICAgZmFNYWlsRm9yd2FyZCA9IGZhU2hhcmU7CiAgICBmYVBob25lRmxpcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwaG9uZS1mbGlwIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MzgxLCAicGhvbmUtYWx0Il0sICJmODc5IiwgIk0zNTEuOCAyNWM3LjgtMTguOCAyOC40LTI4LjkgNDguMS0yMy41bDUuNSAxLjVjNjQuNiAxNy42IDExOS44IDgwLjIgMTAzLjcgMTU2LjQtMzcuMSAxNzUtMTc0LjggMzEyLjctMzQ5LjggMzQ5LjgtNzYuMyAxNi4yLTEzOC44LTM5LjEtMTU2LjQtMTAzLjdsLTEuNS01LjVjLTUuNC0xOS43IDQuNy00MC4zIDIzLjUtNDguMWw5Ny4zLTQwLjVjMTYuNS02LjkgMzUuNi0yLjEgNDcgMTEuOGwzOC42IDQ3LjJjNzAuMy0zNC45IDEyNi44LTkzLjMgMTU5LjMtMTY0LjlsLTQ0LjEtMzYuMWMtMTMuOS0xMS4zLTE4LjYtMzAuNC0xMS44LTQ3TDM1MS44IDI1eiJdCiAgICB9OwogICAgZmFQaG9uZUFsdCA9IGZhUGhvbmVGbGlwOwogICAgZmFUb2lsZXRQb3J0YWJsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0b2lsZXQtcG9ydGFibGUiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZTU4MyIsICJNMCA2NGwwIDE2IDMyMCAwIDAtMTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMEMyOC43IDAgMCAyOC43IDAgNjR6bTI0IDY0TDAgMTI4IDAgNDg4YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC04IDIyNCAwIDAgOGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMzYwLTI5NiAwem0yMjQgOTZsMjQgMCAwIDk2LTI0IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtNDhjMC0xMy4zIDEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYVBlcnNvblByZWduYW50ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1wcmVnbmFudCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlMzFlIiwgIk0xOTIgODBhNTYgNTYgMCAxIDAgMC0xMTIgNTYgNTYgMCAxIDAgMCAxMTJ6bTgwIDMyMS4yYzguNi00LjUgMTYuOC0xMCAyNC4zLTE2LjVsNC0zLjRjMjIuNi0xOS40IDM1LjctNDcuNyAzNS43LTc3LjYgMC0zNS45LTE4LjgtNjkuMS00OS42LTg3LjZsLTMwLjQtMTguMiAwLTEuOGMwLTQ2LjUtMzcuNy04NC4xLTg0LjEtODQuMS0yOC4xIDAtNTQuNCAxNC4xLTcwIDM3LjVMMjEuNCAyNzAuMmMtOS44IDE0LjctNS44IDM0LjYgOC45IDQ0LjRzMzQuNiA1LjggNDQuNC04LjlsMjktNDMuNS0zMC41IDExMy41Yy0yLjYgOS42LS42IDE5LjkgNS41IDI3LjhTOTQgNDE2IDEwNCA0MTZsOCAwIDAgOTZjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTk2IDMyIDAgMCA5NmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTEwLjh6Il0KICAgIH07CiAgICBmYUxlc3NUaGFuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxlc3MtdGhhbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYyNzc0XSwgIjNjIiwgIk00NzcuMSA1MC42YzcuNCAxNiAuNCAzNS4xLTE1LjYgNDIuNUwxMDguNCAyNTYgNDYxLjQgNDE5YzE2IDcuNCAyMyAyNi40IDE1LjYgNDIuNXMtMjYuNCAyMy00Mi41IDE1LjZsLTQxNi0xOTJDNy4zIDI3OS44IDAgMjY4LjUgMCAyNTZTNy4zIDIzMi4yIDE4LjYgMjI3bDQxNi0xOTJjMTYtNy40IDM1LjEtLjQgNDIuNSAxNS42eiJdCiAgICB9OwogICAgZmFTdXBlcnNjcmlwdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzdXBlcnNjcmlwdCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMTJiIiwgIk01NDQgMzJjMC0xMS4xLTUuNy0yMS40LTE1LjItMjcuMnMtMjEuMi02LjQtMzEuMS0xLjRsLTMyIDE2QzQ0OS45IDI3LjMgNDQzLjUgNDYuNSA0NTEuNCA2Mi4zIDQ1NyA3My41IDQ2OC4zIDgwIDQ4MCA4MGwwIDgwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDY0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsMC0xMjh6TTk2IDY0Qzc4LjMgNjQgNjQgNzguMyA2NCA5NnMxNC4zIDMyIDMyIDMybDE1LjMgMCA4OS42IDEyOC04OS42IDEyOC0xNS4zIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzIgMGMxMC40IDAgMjAuMi01LjEgMjYuMi0xMy42TDI0MCAzMTEuOCAzMjUuOCA0MzQuNGM2IDguNiAxNS44IDEzLjYgMjYuMiAxMy42bDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTE1LjMgMC04OS42LTEyOCA4OS42LTEyOCAxNS4zIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTMyIDBjLTEwLjQgMC0yMC4yIDUuMS0yNi4yIDEzLjZMMjQwIDIwMC4yIDE1NC4yIDc3LjZDMTQ4LjIgNjkuMSAxMzguNCA2NCAxMjggNjRMOTYgNjR6Il0KICAgIH07CiAgICBmYUNpcmNsZVN0b3AyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1zdG9wIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjIwOTQsICJzdG9wLWNpcmNsZSJdLCAiZjI4ZCIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTE5MiAxNjBsMTI4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxMjhjMCAxNy43LTE0LjMgMzItMzIgMzJsLTEyOCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTEyOGMwLTE3LjcgMTQuMy0zMiAzMi0zMnoiXQogICAgfTsKICAgIGZhU3RvcENpcmNsZTIgPSBmYUNpcmNsZVN0b3AyOwogICAgZmFBcnJvd3NVcERvd24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3dzLXVwLWRvd24iLAogICAgICBpY29uOiBbMjU2LCA1MTIsIFsiYXJyb3dzLXYiXSwgImYwN2QiLCAiTTE1MC42LTIyLjZjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwbC05NiA5NmMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMEw5NiA3Ny4zIDk2IDQzNC43IDU0LjYgMzkzLjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zbDk2IDk2YzYgNiAxNC4xIDkuNCAyMi42IDkuNHMxNi42LTMuNCAyMi42LTkuNGw5Ni05NmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMGwtNDEuNCA0MS40IDAtMzU3LjUgNDEuNCA0MS40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTk2LTk2eiJdCiAgICB9OwogICAgZmFBcnJvd3NWID0gZmFBcnJvd3NVcERvd247CiAgICBmYVBvb1N0b3JtID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBvby1zdG9ybSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJwb28tYm9sdCJdLCAiZjc1YSIsICJNMjY4LjktMzEuOGMtNS41LS43LTExIDEuNC0xNC41IDUuN3MtNC42IDEwLjEtMi44IDE1LjNjMi44IDguMiA0LjMgMTYuOSA0LjMgMjYuMSAwIDIxLjctOC41IDM3LjItMjEuOSA0Ny42LTEzLjkgMTAuOC0zNC4xIDE3LTU4LjEgMTdsLTI0IDBjLTQ4LjYgMC04OCAzOS40LTg4IDg4IDAgMTQuOCAzLjcgMjguOCAxMC4yIDQxLjEtNDIgNi42LTc0LjIgNDMtNzQuMiA4Ni45IDAgNDYuNiAzNi4yIDg0LjcgODEuOSA4Ny44IDMuMS0xMi40IDkuOS0yMy44IDE5LjYtMzIuNUwyNDIuNyAyMjVjMTIuMi0xMC45IDI4LTE3IDQ0LjQtMTcgNDQuNiAwIDc2LjUgNDMgNjMuNyA4NS43bC0xMi43IDQyLjRjMjguOCAxLjIgNTIuNyAyMS4xIDU5LjggNDcuOWwyNi4yIDBjNDguNiAwIDg4LTM5LjQgODgtODggMC00My45LTMyLjEtODAuMy03NC4yLTg2LjkgNi41LTEyLjMgMTAuMi0yNi4yIDEwLjItNDEuMSAwLTQ4LjYtMzkuNC04OC04OC04OGwtOS40IDBjLjktNS40IDEuNC0xMC45IDEuNC0xNi42IDAtNDguNy0zNi4xLTg4LjktODMuMS05NS4yek0xNDQuNiA0MTZsNjEuOCAwLTMxLjIgMTA0LjFjLTMuNiAxMS45IDUuMyAyMy45IDE3LjggMjMuOSA0LjYgMCA5LTEuNyAxMi40LTQuN0wzNDYuNSA0MTIuOWMzLjUtMy4xIDUuNS03LjYgNS41LTEyLjQgMC05LjItNy40LTE2LjYtMTYuNi0xNi42bC02MS44IDAgMzEuMi0xMDQuMWMzLjYtMTEuOS01LjMtMjMuOS0xNy44LTIzLjktNC42IDAtOSAxLjctMTIuNCA0LjdMMTMzLjUgMzg3LjFjLTMuNSAzLjEtNS41IDcuNi01LjUgMTIuNCAwIDkuMiA3LjQgMTYuNiAxNi42IDE2LjZ6Il0KICAgIH07CiAgICBmYVBvb0JvbHQgPSBmYVBvb1N0b3JtOwogICAgZmFWaWRlb1NsYXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZpZGVvLXNsYXNoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY0ZTIiLCAiTTQxLTI0LjljLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwUy0yLjMtLjMgNyA5LjFsNTI4IDUyOGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTE1My0xNTMgMC0yMjIuMmMwLTM1LjMtMjguNy02NC02NC02NEwxMjkuOCA2NCA0MS0yNC45ek0zMiAxMjhsMCAyNTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjU2IDBjNy44IDAgMTUuMy0xLjQgMjIuMi00TDM2IDEwNS44Yy0yLjYgNi45LTQgMTQuNC00IDIyLjJ6TTQ2NCAzMzZsNzMuNSA1OC44YzQuMiAzLjQgOS40IDUuMiAxNC44IDUuMiAxMy4xIDAgMjMuNy0xMC42IDIzLjctMjMuN2wwLTI0MC42YzAtMTMuMS0xMC42LTIzLjctMjMuNy0yMy43LTUuNCAwLTEwLjYgMS44LTE0LjggNS4yTDQ2NCAxNzYgNDY0IDMzNnoiXQogICAgfTsKICAgIGZhU3F1YXJlWG1hcmsgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXhtYXJrIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTAwNjIsICJ0aW1lcy1zcXVhcmUiLCAieG1hcmstc3F1YXJlIl0sICJmMmQzIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyem03MSAxMzVjOS40LTkuNCAyNC42LTkuNCAzMy45IDBsNTUgNTUgNTUtNTVjOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45bC01NSA1NSA1NSA1NWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwbC01NS01NS01NSA1NWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWw1NS01NS01NS01NWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjl6Il0KICAgIH07CiAgICBmYVRpbWVzU3F1YXJlID0gZmFTcXVhcmVYbWFyazsKICAgIGZhWG1hcmtTcXVhcmUgPSBmYVNxdWFyZVhtYXJrOwogICAgZmFIYW5kSG9sZGluZ0Ryb3BsZXQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1ob2xkaW5nLWRyb3BsZXQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsiaGFuZC1ob2xkaW5nLXdhdGVyIl0sICJmNGMxIiwgIk0yNzUuNSA2LjZMMjA5LjIgMTAzQzE5OCAxMTkuMyAxOTIgMTM4LjYgMTkyIDE1OC4zbDAgMS43YzAgNTMgNDMgOTYgOTYgOTZzOTYtNDMgOTYtOTZsMC0xLjdjMC0xOS44LTYtMzktMTcuMi01NS4zTDMwMC41IDYuNkMyOTcuNyAyLjUgMjkzIDAgMjg4IDBzLTkuNyAyLjUtMTIuNSA2LjZ6TTEwOS4zIDM0MS41TDY2LjcgMzg0IDMyIDM4NGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMjAuNSAwYzI5IDAgNTcuMy05LjMgODAuNy0yNi41bDEyNi42LTkzLjNjMTcuOC0xMy4xIDIxLjYtMzguMSA4LjUtNTUuOXMtMzguMS0yMS42LTU1LjktOC41TDM5Mi42IDQxNiAyODAgNDE2Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDcyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTE1Mi4yIDBjLTMzLjkgMC02Ni41IDEzLjUtOTAuNSAzNy41eiJdCiAgICB9OwogICAgZmFIYW5kSG9sZGluZ1dhdGVyID0gZmFIYW5kSG9sZGluZ0Ryb3BsZXQ7CiAgICBmYVdvblNpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid29uLXNpZ24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs4MzYxLCAia3J3IiwgIndvbiJdLCAiZjE1OSIsICJNNjIuNCA1My45QzU2LjggMzcuMSAzOC43IDI4LjEgMjEuOSAzMy42Uy0zLjkgNTcuNCAxLjcgNzQuMUw1Ni45IDI0MCAzMiAyNDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDAuOSAwIDU2LjcgMTcwLjFjNC41IDEzLjUgMTcuNCAyMi40IDMxLjYgMjEuOXMyNi40LTEwLjQgMjkuOC0yNC4yTDIzMyAyODggMjc5IDI4OCAzMjEgNDU1LjhjMy40IDEzLjggMTUuNiAyMy43IDI5LjggMjQuMnMyNy4xLTguNCAzMS42LTIxLjlMNDM5LjEgMjg4IDQ4MCAyODhjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTI0LjkgMCA1NS4zLTE2NS45YzUuNi0xNi44LTMuNS0zNC45LTIwLjItNDAuNXMtMzQuOSAzLjUtNDAuNSAyMC4ybC02MiAxODYuMS01NC42IDAtNDUuOS0xODMuOEMyODMuNSA0MiAyNzAuNyAzMiAyNTYgMzJzLTI3LjUgMTAtMzEgMjQuMkwxNzkgMjQwIDEyNC40IDI0MCA2Mi40IDUzLjl6bTc4IDIzNC4xbDI2LjYgMC0xMS40IDQ1LjYtMTUuMi00NS42ek0yNDUgMjQwbDExLTQ0LjEgMTEgNDQuMS0yMiAwem0xMDAgNDhsMjYuNiAwLTE1LjIgNDUuNi0xMS40LTQ1LjZ6Il0KICAgIH07CiAgICBmYUtydyA9IGZhV29uU2lnbjsKICAgIGZhV29uID0gZmFXb25TaWduOwogICAgZmFPYmplY3RVbmdyb3VwMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJvYmplY3QtdW5ncm91cCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmMjQ4IiwgIk0zMiAxMTkuNEMxMi45IDEwOC40IDAgODcuNyAwIDY0IDAgMjguNyAyOC43IDAgNjQgMCA4Ny43IDAgMTA4LjQgMTIuOSAxMTkuNCAzMmwyMDkuMSAwYzExLjEtMTkuMSAzMS43LTMyIDU1LjQtMzIgMzUuMyAwIDY0IDI4LjcgNjQgNjQgMCAyMy43LTEyLjkgNDQuNC0zMiA1NS40bDAgMTEzLjFjMTkuMSAxMS4xIDMyIDMxLjcgMzIgNTUuNCAwIDM1LjMtMjguNyA2NC02NCA2NC0yMy43IDAtNDQuNC0xMi45LTU1LjQtMzJsLTIwOS4xIDBjLTExLjEgMTkuMS0zMS43IDMyLTU1LjQgMzItMzUuMyAwLTY0LTI4LjctNjQtNjQgMC0yMy43IDEyLjktNDQuNCAzMi01NS40bDAtMTEzLjF6TTExOS40IDk2Yy01LjYgOS43LTEzLjcgMTcuOC0yMy40IDIzLjRsMCAxMTMuMWM5LjcgNS42IDE3LjggMTMuNyAyMy40IDIzLjRsMjA5LjEgMGM1LjYtOS43IDEzLjctMTcuOCAyMy40LTIzLjRsMC0xMTMuMWMtOS43LTUuNi0xNy44LTEzLjctMjMuNC0yMy40TDExOS40IDk2ek01NDQgMjc5LjRjLTkuNy01LjYtMTcuOC0xMy43LTIzLjQtMjMuNGwtMjkuMiAwYy01LjMtMTcuNy0xNC44LTMzLjUtMjcuNC00Ni40bDAtMTcuNiA1Ni42IDBjMTEuMS0xOS4xIDMxLjctMzIgNTUuNC0zMiAzNS4zIDAgNjQgMjguNyA2NCA2NCAwIDIzLjctMTIuOSA0NC40LTMyIDU1LjRsMCAxMTMuMWMxOS4xIDExLjEgMzIgMzEuNyAzMiA1NS40IDAgMzUuMy0yOC43IDY0LTY0IDY0LTIzLjcgMC00NC40LTEyLjktNTUuNC0zMmwtMjA5LjEgMGMtMTEuMSAxOS4xLTMxLjcgMzItNTUuNCAzMi0zNS4zIDAtNjQtMjguNy02NC02NCAwLTIzLjcgMTIuOS00NC40IDMyLTU1LjRsMC0yNC42IDY0IDAgMCAyNC42YzkuNyA1LjYgMTcuOCAxMy43IDIzLjQgMjMuNGwyMDkuMSAwYzUuNi05LjcgMTMuNy0xNy44IDIzLjQtMjMuNGwwLTExMy4xeiJdCiAgICB9OwogICAgZmFDb21tZW50MiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjb21tZW50IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NDg5LCA2MTY2OV0sICJmMDc1IiwgIk01MTIgMjQwYzAgMTMyLjUtMTE0LjYgMjQwLTI1NiAyNDAtMzcuMSAwLTcyLjMtNy40LTEwNC4xLTIwLjdMMzMuNSA1MTAuMWMtOS40IDQtMjAuMiAxLjctMjcuMS01LjhTLTIgNDg1LjggMi44IDQ3Ni44bDQ4LjgtOTIuMkMxOS4yIDM0NC4zIDAgMjk0LjMgMCAyNDAgMCAxMDcuNSAxMTQuNiAwIDI1NiAwUzUxMiAxMDcuNSA1MTIgMjQweiJdCiAgICB9OwogICAgZmFIaWxsQXZhbGFuY2hlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhpbGwtYXZhbGFuY2hlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1MDciLCAiTTQ0MC4xIDQwMS45YzM0LjIgMjMuMSA4MS4xIDE5LjUgMTExLjQtMTAuOCAzNC40LTM0LjQgMzQuNC05MC4xIDAtMTI0LjUtMjcuOC0yNy44LTY5LjUtMzMuMS0xMDIuNi0xNi0xMS44IDYuMS0xNi40IDIwLjYtMTAuMyAzMi4zczIwLjYgMTYuNCAzMi4zIDEwLjNjMTUuMS03LjggMzQtNS4zIDQ2LjYgNy4zIDE1LjYgMTUuNiAxNS42IDQwLjkgMCA1Ni42cy00MC45IDE1LjYtNTYuNiAwbC04MS43LTgxLjdjMjIuMy0xNC4yIDM3LjEtMzkuMSAzNy4xLTY3LjUgMC0zMy45LTIxLjEtNjIuOS01MC45LTc0LjUgMS45LTYuOCAyLjktMTQgMi45LTIxLjUgMC00NC4yLTM1LjgtODAtODAtODAtMjcuMyAwLTUxLjUgMTMuNy02NS45IDM0LjYtNS44LTIwLTI0LjItMzQuNi00Ni4xLTM0LjYtMjYuNSAwLTQ4IDIxLjUtNDggNDggMCA0IC41IDcuOSAxLjQgMTEuNkw0NDAuMSA0MDEuOXpNNDgwLjQgNjRhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHptMCAxMjhhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0ek02OC43IDg3QzQzLjUgNjEuOCAuNCA3OS43IC40IDExNS4zTC40IDQzMmMwIDQ0LjIgMzUuOCA4MCA4MCA4MGwzMTYuNyAwYzM1LjYgMCA1My41LTQzLjEgMjguMy02OC4zTDY4LjcgODd6Il0KICAgIH07CiAgICBmYUFycm93c1RvRXllID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93cy10by1leWUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTRiZiIsICJNMTc2IDU2YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMzguMS02My02M2MtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTMjEuNyA1NS42IDMxIDY1bDYzIDYzLTM4LjEgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw5NiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtOTZ6bTAgNDAwbDAtOTZjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTk2IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMzguMSAwLTYzIDYzYy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBsNjMtNjMgMCAzOC4xYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjR6bTMxMiAyNGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTM4LjEgNjMgNjNjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC02My02MyAzOC4xIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTk2IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgOTZjMCAxMy4zIDEwLjcgMjQgMjQgMjR6TTQ2NCA1NmwwIDk2YzAgMTMuMyAxMC43IDI0IDI0IDI0bDk2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTM4LjEgMCA2My02M2M5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwbC02MyA2MyAwLTM4LjFjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjR6TTMyMCAxMjBjLTU3LjMgMC05OS40IDM0LTEyNS42IDY0LjMtMjAgMjMuMS0zMi40IDQ1LjgtMzcuNiA1Ni4xLTIuNSA1LTQuOSA5LjctNC45IDE1LjZzMi4zIDEwLjYgNC45IDE1LjZjNS4yIDEwLjMgMTcuNiAzMyAzNy42IDU2LjEgMjYuMiAzMC4zIDY4LjIgNjQuMyAxMjUuNiA2NC4zczk5LjQtMzQgMTI1LjYtNjQuM2MyMC0yMy4xIDMyLjQtNDUuOCAzNy42LTU2LjEgMi41LTUgNC45LTkuNyA0LjktMTUuNnMtMi4zLTEwLjYtNC45LTE1LjZjLTUuMi0xMC4zLTE3LjYtMzMtMzcuNi01Ni4xLTI2LjItMzAuMy02OC4yLTY0LjMtMTI1LjYtNjQuM3pNMjU2IDI1NmE2NCA2NCAwIDEgMSAxMjggMCA2NCA2NCAwIDEgMSAtMTI4IDB6Il0KICAgIH07CiAgICBmYVNub3dwbG93ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNub3dwbG93IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY3ZDIiLCAiTTEyOCAxNjBsMC05NmMwLTM1LjMgMjguNy02NCA2NC02NEwyOTYuNCAwYzI0LjIgMCA0Ni40IDEzLjcgNTcuMiAzNS40bDg3LjYgMTc1LjFjNC40IDguOSA2LjggMTguNyA2LjggMjguNmwwIDU2LjkgODAgMCAwLTgwYzAtNDguNiAzOS40LTg4IDg4LTg4IDEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0Yy0yMi4xIDAtNDAgMTcuOS00MCA0MGwwIDIwOGMwIDIyLjEgMTcuOSA0MCA0MCA0MCAxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGMtNDguNiAwLTg4LTM5LjQtODgtODhsMC04MC02MyAwYzkuNSAxNi41IDE1IDM1LjYgMTUgNTYgMCA2MS45LTUwLjEgMTEyLTExMiAxMTJsLTIyNCAwYy02MS45IDAtMTEyLTUwLjEtMTEyLTExMiAwLTMwLjUgMTIuMi01OC4yIDMyLTc4LjRMNjQgMjI0YzAtMzUuMyAyOC43LTY0IDY0LTY0em05MS43IDM0LjlsNDMuNiAyOS4xIDExMy4yIDAtODAtMTYwLTEwNC40IDAgMCAxMDguOCAyNy43IDIyLjF6TTQxNiA0MDBjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTIyNCAwYy0yNi41IDAtNDggMjEuNS00OCA0OHMyMS41IDQ4IDQ4IDQ4bDIyNCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4em0tMjgwIDBhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHptMjE2LTI0YTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHpNMjMyIDQwMGEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAweiJdCiAgICB9OwogICAgZmFDaGFydEdhbnR0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoYXJ0LWdhbnR0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUwZTQiLCAiTTY0IDY0YzAtMTcuNy0xNC4zLTMyLTMyLTMyUzAgNDYuMyAwIDY0TDAgNDAwYzAgNDQuMiAzNS44IDgwIDgwIDgwbDQwMCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDgwIDQxNmMtOC44IDAtMTYtNy4yLTE2LTE2TDY0IDY0em05NiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDk2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTk2IDB6bTY0IDExMmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwxMjggMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTI4IDB6TTM4NCAyODhjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNjQgMHoiXQogICAgfTsKICAgIGZhVmlkZW8gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidmlkZW8iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsidmlkZW8tY2FtZXJhIl0sICJmMDNkIiwgIk05NiA2NGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCAyNTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjU2IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMOTYgNjR6TTQ2NCAzMzZsNzMuNSA1OC44YzQuMiAzLjQgOS40IDUuMiAxNC44IDUuMiAxMy4xIDAgMjMuNy0xMC42IDIzLjctMjMuN2wwLTI0MC42YzAtMTMuMS0xMC42LTIzLjctMjMuNy0yMy43LTUuNCAwLTEwLjYgMS44LTE0LjggNS4yTDQ2NCAxNzYgNDY0IDMzNnoiXQogICAgfTsKICAgIGZhVmlkZW9DYW1lcmEgPSBmYVZpZGVvOwogICAgZmFDaGVzc1Bhd24yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoZXNzLXBhd24iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFs5ODIzXSwgImY0NDMiLCAiTTE5Mi0zMmM2Ni4zIDAgMTIwIDUzLjcgMTIwIDEyMCAwIDI3LTguOSA1MS45LTI0IDcyIDE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0xMC43IDAgMjYuNyAxNjAgNTYuMiA3MC4zYzUgNi4zIDcuOCAxNC4xIDcuOCAyMi4yIDAgMTkuNi0xNS45IDM1LjUtMzUuNSAzNS41TDUxLjUgNTEyYy0xOS42IDAtMzUuNS0xNS45LTM1LjUtMzUuNSAwLTguMSAyLjctMTUuOSA3LjgtMjIuMkw4MCAzODQgMTA2LjcgMjI0IDk2IDIyNGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmMtMTUuMS0yMC4xLTI0LTQ1LTI0LTcyIDAtNjYuMyA1My43LTEyMCAxMjAtMTIweiJdCiAgICB9OwogICAgZmFTeW5hZ29ndWUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3luYWdvZ3VlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4MzMzXSwgImY2OWIiLCAiTTE2IDgwYzAtMzUuMyAyOC43LTY0IDY0LTY0czY0IDI4LjcgNjQgNjRsMCAzMi0xMjggMCAwLTMyem0wIDM2OGwwLTI4OCAxMjggMCAxMjYuMi04NC4yYzEwLjctNy4yIDI0LjgtNy4yIDM1LjUgMGwxMjYuMiA4NC4yIDEyOCAwIDAgMjg4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDgwIDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjR6TTU2MCAxMTJsLTEyOCAwIDAtMzJjMC0zNS4zIDI4LjctNjQgNjQtNjRzNjQgMjguNyA2NCA2NGwwIDMyek0yMjQgMzg0bDAgODAgMTI4IDAgMC04MGMwLTM1LjMtMjguNy02NC02NC02NHMtNjQgMjguNy02NCA2NHptNjQtMTUyYTQwIDQwIDAgMSAwIDAtODAgNDAgNDAgMCAxIDAgMCA4MHoiXQogICAgfTsKICAgIGZhQnVpbGRpbmdDaXJjbGVDaGVjayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJidWlsZGluZy1jaXJjbGUtY2hlY2siLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRkMiIsICJNOTYgMEM2MC43IDAgMzIgMjguNyAzMiA2NGwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxODAgMGMtMTAuNS0xNC42LTE5LTMwLjctMjUuMS00OGwtNzQuOSAwIDAtODBjMC0xNy43IDE0LjMtMzIgMzItMzJsMzIgMGMyIDAgNCAuMiA1LjkgLjUgNi0yMy42IDE2LjMtNDUuNCAzMC4xLTY0LjVsLTQgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgNGMyNy41LTE5LjggNjAuMy0zMi40IDk2LTM1LjRMNDE2IDY0YzAtMzUuMy0yOC43LTY0LTY0LTY0TDk2IDB6bTMyIDExMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyek0yNzIgOTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNnpNMTI4IDI0MGMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyek01NzYgNDAwYTE0NCAxNDQgMCAxIDAgLTI4OCAwIDE0NCAxNDQgMCAxIDAgMjg4IDB6bS04Ni42LTYwLjljNy4xIDUuMiA4LjcgMTUuMiAzLjUgMjIuM2wtNjQgODhjLTIuOCAzLjgtNyA2LjItMTEuNyA2LjVzLTkuMy0xLjMtMTIuNi00LjZsLTQwLTQwYy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBsMjYuOCAyNi44IDUzLTcyLjljNS4yLTcuMSAxNS4yLTguNyAyMi40LTMuNXoiXQogICAgfTsKICAgIGZhQ2FsZW5kYXJQbHVzMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYWxlbmRhci1wbHVzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyNzEiLCAiTTEyOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzIgMTI4IDAgMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMzIgMzIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI4OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDMyIDAgMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnptOTYgMTkyYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDQ4LTQ4IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDggMCAwIDQ4YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC00OCA0OCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC00OCAwIDAtNDhjMC0xMy4zLTEwLjctMjQtMjQtMjR6Il0KICAgIH07CiAgICBmYVdoZWVsY2hhaXJNb3ZlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIndoZWVsY2hhaXItbW92ZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJ3aGVlbGNoYWlyLWFsdCJdLCAiZTJjZSIsICJNMzEyIDU2YTU2IDU2IDAgMSAxIDExMiAwIDU2IDU2IDAgMSAxIC0xMTIgMHpNMjA1LjQgMTI0LjFjLTYuNC01LjItMTUuNi00LjctMjEuNCAxLjFsLTMzLjQgMzMuNGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNMMTM4LjggODBjMjktMjkgNzUuMi0zMS40IDEwNy01LjVsODEuMyA2NmMyMS40IDE3LjQgMjMuOCA0OS4yIDUuMiA2OS41bC00MS44IDQ2IDk4IDBjMzAuMyAwIDUzIDI3LjcgNDcuMSA1Ny40TDQwNy40IDQ1NC4zYy0zLjUgMTcuMy0yMC4zIDI4LjYtMzcuNyAyNS4xcy0yOC42LTIwLjMtMjUuMS0zNy43TDM2OSAzMjAgMzE2LjggMzIwYzIuMSAxMC4zIDMuMiAyMSAzLjIgMzIgMCA4OC40LTcxLjYgMTYwLTE2MCAxNjBTMCA0NDAuNCAwIDM1MiA3MS42IDE5MiAxNjAgMTkyYzYgMCAxMS45IC4zIDE3LjggMWw1MC40LTUwLjQtMjIuNy0xOC41ek0xNjAgNDQ4YTk2IDk2IDAgMSAwIDAtMTkyIDk2IDk2IDAgMSAwIDAgMTkyeiJdCiAgICB9OwogICAgZmFXaGVlbGNoYWlyQWx0ID0gZmFXaGVlbGNoYWlyTW92ZTsKICAgIGZhVXNlclNoaWVsZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1c2VyLXNoaWVsZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNTA1IiwgIk0yMjQgMjQ4YTEyMCAxMjAgMCAxIDAgMC0yNDAgMTIwIDEyMCAwIDEgMCAwIDI0MHptLTI5LjcgNTZDOTUuOCAzMDQgMTYgMzgzLjggMTYgNDgyLjMgMTYgNDk4LjcgMjkuMyA1MTIgNDUuNyA1MTJsMjUxLjUgMEMyNjEgNDY5LjQgMjQwIDQxNC41IDI0MCAzNTYuNGwwLTMxLjFjMC03LjMgMS0xNC41IDIuOS0yMS4zbC00OC42IDB6bTI1MSAxODQuNWwtMTMuMyA2LjMgMC0xODguMSA5NiAzMiAwIDE5LjZjMCA1NS44LTMyLjIgMTA2LjUtODIuNyAxMzAuM3pNNDIxLjkgMjU5LjVsLTExMiAzNy4zYy0xMy4xIDQuNC0yMS45IDE2LjYtMjEuOSAzMC40bDAgMzEuMWMwIDc0LjQgNDMgMTQyLjEgMTEwLjIgMTczLjdsMTguNSA4LjdjNC44IDIuMiAxMCAzLjQgMTUuMiAzLjRzMTAuNS0xLjIgMTUuMi0zLjRsMTguNS04LjdDNTMzIDUwMC4zIDU3NiA0MzIuNiA1NzYgMzU4LjJsMC0zMS4xYzAtMTMuOC04LjgtMjYtMjEuOS0zMC40bC0xMTItMzcuM2MtNi42LTIuMi0xMy43LTIuMi0yMC4yIDB6Il0KICAgIH07CiAgICBmYUJvbGQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm9sZCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMDMyIiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0UzE0LjMgOTYgMzIgOTZsMzIgMCAwIDMyMC0zMiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDIyNCAwYzcwLjcgMCAxMjgtNTcuMyAxMjgtMTI4IDAtNDYuNS0yNC44LTg3LjMtNjItMTA5LjcgMTguNy0yMi4zIDMwLTUxIDMwLTgyLjMgMC03MC43LTU3LjMtMTI4LTEyOC0xMjhMMzIgMzJ6TTI4OCAxNjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTk2IDAgMC0xMjggOTYgMGMzNS4zIDAgNjQgMjguNyA2NCA2NHpNMTI4IDQxNmwwLTEyOCAxMjggMGMzNS4zIDAgNjQgMjguNyA2NCA2NHMtMjguNyA2NC02NCA2NGwtMTI4IDB6Il0KICAgIH07CiAgICBmYUhlYXJ0UHVsc2UgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGVhcnQtcHVsc2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiaGVhcnRiZWF0Il0sICJmMjFlIiwgIk0yNTYgMTA3LjlMMjQxIDg3LjFDMjE2IDUyLjUgMTc1LjkgMzIgMTMzLjEgMzIgNTkuNiAzMiAwIDkxLjYgMCAxNjUuMWwwIDIuNmMwIDIzLjYgNi4yIDQ4IDE2LjYgNzIuM2wxMDYgMGMzLjIgMCA2LjEtMS45IDcuNC00LjlsMzEuOC03Ni4zYzMuNy04LjggMTIuMy0xNC42IDIxLjgtMTQuOHMxOC4zIDUuNCAyMi4yIDE0LjFsNTEuMyAxMTMuOSA0MS40LTgyLjhjNC4xLTguMSAxMi40LTEzLjMgMjEuNS0xMy4zczE3LjQgNS4xIDIxLjUgMTMuM2wyMy4yIDQ2LjNjMS40IDIuNyA0LjEgNC40IDcuMiA0LjRsMTIzLjYgMGMxMC41LTI0LjMgMTYuNi00OC43IDE2LjYtNzIuM2wwLTIuNkM1MTIgOTEuNiA0NTIuNCAzMiAzNzguOSAzMiAzMzYuMiAzMiAyOTYgNTIuNSAyNzEgODcuMWwtMTUgMjAuN3pNNDY5LjYgMjg4bC05Ny44IDBjLTIxLjIgMC00MC42LTEyLTUwLjEtMzFsLTEuNy0zLjQtNDIuNSA4NS4xYy00LjEgOC4zLTEyLjcgMTMuNS0yMiAxMy4zcy0xNy42LTUuNy0yMS40LTE0LjFsLTQ5LjMtMTA5LjUtMTAuNSAyNS4yYy04LjcgMjAuOS0yOS4xIDM0LjUtNTEuNyAzNC41bC04MC4yIDBjNDcuMiA3My44IDEyMyAxNDEuNyAxNzAuNCAxNzcuOSAxMi40IDkuNCAyNy42IDE0LjEgNDMuMSAxNC4xczMwLjgtNC42IDQzLjEtMTQuMUMzNDYuNiA0MjkuNyA0MjIuNCAzNjEuOCA0NjkuNiAyODh6Il0KICAgIH07CiAgICBmYUhlYXJ0YmVhdCA9IGZhSGVhcnRQdWxzZTsKICAgIGZhU3F1YXJlUm9vdFZhcmlhYmxlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1yb290LXZhcmlhYmxlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInNxdWFyZS1yb290LWFsdCJdLCAiZjY5OCIsICJNMjgyLjYgNzguMWM4LTI3LjMgMzMtNDYuMSA2MS40LTQ2LjFsMjAwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzQ0IDk2IDIzOC43IDQ1N2MtMy42IDEyLjMtMTQuMSAyMS4yLTI2LjggMjIuOHMtMjUuMS00LjYtMzEuNS0xNS42TDc3LjYgMjg4IDMyIDI4OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw0NS42IDBjMjIuOCAwIDQzLjggMTIuMSA1NS4zIDMxLjhsNjUuMiAxMTEuOCA4NC40LTI4OS41ek0zOTMuNCAyMzMuNGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMGw0MS40IDQxLjQgNDEuNC00MS40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwczEyLjUgMzIuOCAwIDQ1LjNsLTQxLjQgNDEuNCA0MS40IDQxLjRjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNzLTMyLjggMTIuNS00NS4zIDBsLTQxLjQtNDEuNC00MS40IDQxLjRjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwcy0xMi41LTMyLjggMC00NS4zbDQxLjQtNDEuNC00MS40LTQxLjRjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zeiJdCiAgICB9OwogICAgZmFTcXVhcmVSb290QWx0ID0gZmFTcXVhcmVSb290VmFyaWFibGU7CiAgICBmYUhhbmRzQnViYmxlcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kcy1idWJibGVzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImhhbmRzLXdhc2giXSwgImUwNWUiLCAiTTM4NCA2NGEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6bTk2IDEyOGEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6TTEyOCA0NjRhNDggNDggMCAxIDAgLTk2IDAgNDggNDggMCAxIDAgOTYgMHpNMCAxNjBsLjEgNzIuNmMwIDQ0LjggMTcuNiA4Ny4xIDQ3LjkgMTE4LjQgLjMtNzcgNDAuMS0xNDguNCAxMDUuNC0xODkuM2wxLjktMS4yYy0yLjUtMy43LTIuOC04LjYtLjQtMTIuN2w2Mi0xMDcuNGM2LjYtMTEuNSAyLjctMjYuMi04LjgtMzIuOFMxODIgNSAxNzUuNCAxNi41bC02OCAxMTcuOCAwIDAgMCAwLTQzLjMgNzUgMC00OS4zYzAtMTcuNy0xNC40LTMyLTMyLTMyUzAgMTQyLjQgMCAxNjB6bTIxMy42LTM1LjljMTQuMS04LjggMjkuOC0xMi43IDQ1LjItMTIuMWwzNi41LTYzLjNjNi42LTExLjUgMi43LTI2LjItOC44LTMyLjhzLTI2LjItMi43LTMyLjggOC44bC02Ny4xIDExNi4yIDI3LTE2Ljl6bTg2LjUtMzUuN2wtMTYuNCAyOC40YzE1LjEgNS41IDI4LjYgMTUuNiAzOC4zIDI5LjdsMTkuNy0zNC4yYzYuNi0xMS41IDIuNy0yNi4yLTguOC0zMi44cy0yNi4yLTIuNy0zMi44IDguOHptNDYuNCA2My43bC0xMi41IDIxLjdjMiA4LjYgMi41IDE3LjUgMS43IDI2LjFsNC4zIDAgMCAwIDM0LjQgMCAxMy43LTIzLjhjNi42LTExLjUgMi43LTI2LjItOC44LTMyLjhzLTI2LjItMi43LTMyLjggOC44ek0yODMuMSAxNzVjLTkuNC0xNS0yOS4xLTE5LjUtNDQuMS0xMC4ybC02MC4yIDM3LjZDMTI3LjMgMjM0LjcgOTYgMjkxLjIgOTYgMzUybDAgOGMwIDguOSAuOCAxNy42IDIuMiAyNi4xIDM1LjQgOC4yIDYxLjggNDAgNjEuOCA3Ny45IDAgNi4zLS43IDEyLjUtMi4xIDE4LjQgMjUuMiAxOC42IDU2LjQgMjkuNiA5MC4xIDI5LjZsMTc2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTkyIDBjLTYuNiAwLTEyLTUuNC0xMi0xMnM1LjQtMTIgMTItMTJsMTI0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTEyNCAwYy02LjYgMC0xMi01LjQtMTItMTJzNS40LTEyIDEyLTEybDE1NiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xNTYgMGMtNi42IDAtMTItNS40LTEyLTEyczUuNC0xMiAxMi0xMmwxMjQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTM2IDAgMCAwIDAgMC05My4yIDAgNDYuMi0yOC45YzE1LTkuNCAxOS41LTI5LjEgMTAuMi00NC4xeiJdCiAgICB9OwogICAgZmFIYW5kc1dhc2ggPSBmYUhhbmRzQnViYmxlczsKICAgIGZhTWFya2VyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hcmtlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNWExIiwgIk00MDguOCAwYy0yNy40IDAtNTMuNiAxMC45LTczIDMwLjJMMzE4LjEgNDggMzA1IDM0LjljLTI4LjEtMjguMS03My43LTI4LjEtMTAxLjggMEwxMDMgMTM1Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBMMjM3LjEgNjguOWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMEwyODQuMSA4MS45IDE4NCAxODIuMSAzMjkuOSAzMjggNDgxLjggMTc2LjJjMTkuNC0xOS40IDMwLjItNDUuNiAzMC4yLTczIDAtNTctNDYuMi0xMDMuMi0xMDMuMi0xMDMuMnpNMTAyLjQgMjYzLjdjLTQ5LjkgNDkuOS04My4zIDExNC05NS41IDE4My41TC40IDQ4My44Qy0xIDQ5MS42IDEuNSA0OTkuNCA3IDUwNXMxMy40IDggMjEuMSA2LjdsMzYuNy02LjVjNjkuNS0xMi4zIDEzMy42LTQ1LjYgMTgzLjUtOTUuNUwyOTYgMzYxLjkgMTUwLjEgMjE2IDEwMi40IDI2My43eiJdCiAgICB9OwogICAgZmFDbGlwYm9hcmQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNsaXBib2FyZCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyODIwM10sICJmMzI4IiwgIk0zMjAgMzJsLTguNiAwQzMwMC40IDEyLjkgMjc5LjcgMCAyNTYgMEwxMjggMEMxMDQuMyAwIDgzLjYgMTIuOSA3Mi42IDMyTDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjU2IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zNTJjMC0zNS4zLTI4LjctNjQtNjQtNjR6TTEzNiAxMTJjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMTEyIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTExMiAweiJdCiAgICB9OwogICAgZmFQbGFjZU9mV29yc2hpcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwbGFjZS1vZi13b3JzaGlwIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY2N2YiLCAiTTE2MCA3OWwwIDgxLTQ0LjggMzMuNkMxMDMuMSAyMDIuNyA5NiAyMTYuOSA5NiAyMzJsMCA0MC02MC42IDMwLjNDMTMuNyAzMTMuMiAwIDMzNS4zIDAgMzU5LjZMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjQgNzQuNyAwIDg1LjQgMCAzMjAgMGw2NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtODguNGMwLTI0LjItMTMuNy00Ni40LTM1LjQtNTcuMkw0MTYgMjcyIDQxNiAyMzJjMC0xNS4xLTcuMS0yOS4zLTE5LjItMzguNEwzNTIgMTYwIDM1MiA3OWMwLTkuNS00LjItMTguNS0xMS41LTI0LjZMMjcxLjQtMy4yYy04LjktNy40LTIxLjgtNy40LTMwLjcgMEwxNzEuNSA1NC40QzE2NC4yIDYwLjUgMTYwIDY5LjUgMTYwIDc5em05NiAyNDFjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCA4MC0xMjggMCAwLTgwYzAtMzUuMyAyOC43LTY0IDY0LTY0eiJdCiAgICB9OwogICAgZmFDYW5uYWJpcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYW5uYWJpcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNTVmIiwgIk0yNTYgMGM1LjMgMCAxMC4zIDIuNyAxMy4zIDcuMSAxNS44IDIzLjUgMzYuNyA2My43IDQ5LjIgMTA5IDcuMyAyNi40IDExLjggNTUuMyAxMC4zIDg0IDExLjYtOC45IDIzLjctMTYuNyAzNS45LTIzLjcgNDEtMjMuMyA4NC40LTM2LjkgMTEyLjItNDIuNSA1LjItMSAxMC43IC42IDE0LjQgNC40czUuNCA5LjIgNC40IDE0LjVjLTUuNiAyNy43LTE5LjMgNzAuOS00Mi43IDExMS43LTkuMSAxNS45LTE5LjkgMzEuNy0zMi41IDQ2LjMgMjcuOSA2LjYgNTIuNSAxNy4yIDY3LjMgMjUuNCA1LjEgMi44IDguMiA4LjIgOC4yIDE0cy0zLjIgMTEuMi04LjIgMTRjLTE1LjIgOC40LTQwLjkgMTkuNS02OS44IDI2LjEtMjAuMiA0LjYtNDIuOSA3LjItNjUuMiA0LjZsOC4zIDMzLjJjMS41IDYuMS0uNiAxMi41LTUuNSAxNi40cy0xMS42IDQuNi0xNy4yIDEuOEwyODAgNDE3LjIgMjgwIDQ4OGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTcwLjgtNTguNSAyOS4xYy01LjYgMi44LTEyLjMgMi4xLTE3LjItMS44cy03LTEwLjMtNS41LTE2LjRsOC4zLTMzLjJjLTIyLjIgMi42LTQ1IDAtNjUuMi00LjYtMjguOS02LjYtNTQuNS0xNy42LTY5LjgtMjYuMS01LjEtMi44LTguMi04LjItOC4yLTE0czMuMi0xMS4yIDguMi0xNGw2LjItMy4zYzE1LTcuNiAzNi44LTE2LjQgNjEuMS0yMi4yLTEyLjUtMTQuNS0yMy4zLTMwLjQtMzIuNC00Ni4yLTIzLjQtNDAuOC0zNy4xLTg0LTQyLjctMTExLjctMS4xLTUuMiAuNi0xMC43IDQuNC0xNC41czkuMi01LjQgMTQuNC00LjRjMjcuOSA1LjUgNzEuMiAxOS4yIDExMi4yIDQyLjUgMTIuMiA2LjkgMjQuMyAxNC44IDM1LjggMjMuNy0xLjQtMjguNyAzLjEtNTcuNiAxMC4zLTg0IDEyLjUtNDUuMyAzMy40LTg1LjUgNDkuMi0xMDlsMS4yLTEuNkMyNDYuOSAyIDI1MS4zIDAgMjU2IDB6Il0KICAgIH07CiAgICBmYVBlb3BsZVJvb2YgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVvcGxlLXJvb2YiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUzNyIsICJNMzAyLjMtMTIuNmMtOS00LjUtMTkuNi00LjUtMjguNiAwbC0yNTYgMTI4QzEuOSAxMjMuMy00LjUgMTQyLjUgMy40IDE1OC4zczI3LjEgMjIuMiA0Mi45IDE0LjNMMjg4IDUxLjggNTI5LjcgMTcyLjZjMTUuOCA3LjkgMzUgMS41IDQyLjktMTQuM3MxLjUtMzUtMTQuMy00Mi45bC0yNTYtMTI4ek0yODggMjcyYTU2IDU2IDAgMSAwIDAtMTEyIDU2IDU2IDAgMSAwIDAgMTEyem0wIDQ4Yy01MyAwLTk2IDQzLTk2IDk2bDAgMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTI4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0zMmMwLTUzLTQzLTk2LTk2LTk2ek0xNjAgMjU2YTQ4IDQ4IDAgMSAwIC05NiAwIDQ4IDQ4IDAgMSAwIDk2IDB6bTM1MiAwYTQ4IDQ4IDAgMSAwIC05NiAwIDQ4IDQ4IDAgMSAwIDk2IDB6TTExMiAzMzZjLTQ0LjIgMC04MCAzNS44LTgwIDgwbDAgMzMuMWMwIDE3IDEzLjggMzAuOSAzMC45IDMwLjlsODcuOCAwYy00LjMtOS44LTYuNy0yMC42LTYuNy0zMmwwLTQ4YzAtMTguNCAzLjUtMzYgOS44LTUyLjItMTIuMi03LjUtMjYuNS0xMS44LTQxLjgtMTEuOHpNNDI1LjQgNDgwbDg3LjggMGMxNyAwIDMwLjktMTMuOCAzMC45LTMwLjlsMC0zMy4xYzAtNDQuMi0zNS44LTgwLTgwLTgwLTE1LjMgMC0yOS42IDQuMy00MS44IDExLjggNi4zIDE2LjIgOS44IDMzLjggOS44IDUyLjJsMCA0OGMwIDExLjQtMi40IDIyLjItNi43IDMyeiJdCiAgICB9OwogICAgZmFEaXNlYXNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRpc2Vhc2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjdmYSIsICJNMjM2LjUgMjkuNEwyMjQgNDhjLTIwIDMwLTUzLjYgNDgtODkuNyA0OEw2OCA5NmMtMzcuNSAwLTY3LjkgMzAuNC02Ny45IDY3LjkgMCAxOCA3LjIgMzUuMiAxOS45IDQ3LjlsMjcgMjdjMTEgMTEgMTcuMiAyNS45IDE3LjIgNDEuNSAwIDE1LjgtNi40IDMwLjktMTcuNyA0MkwzMy40IDMzNS4xYy0xMS4xIDEwLjgtMTcuMyAyNS43LTE3LjMgNDEuMiAwIDM2LjggMzQuMSA2NC4yIDcwLjEgNTYuMmw2Mi4zLTEzLjhjNy43LTEuNyAxNS43LTIuNiAyMy42LTIuNiAzMi44IDAgNjQuMiAxNC42IDg1LjIgMzkuOGwzMC41IDM2LjZjMTAuNCAxMi40IDI1LjcgMTkuNiA0MS45IDE5LjYgMzAuMSAwIDU0LjUtMjQuNCA1NC41LTU0LjVsMC01MS4yYzAtNDEuNCAyNS40LTc4LjUgNjQtOTMuNWwyMi4yLTguNmMyNS4yLTkuOCA0MS44LTM0LjEgNDEuOC02MS4xIDAtMjYuNC0xNS45LTUwLjMtNDAuMy02MC41TDQyOSAxNjQuOGMtMzMuMi0xMy45LTU3LjYtNDMtNjUuNS03OC4xbC03LjktMzUuMmMtNi44LTMwLjEtMzMuNS01MS41LTY0LjMtNTEuNS0yMiAwLTQyLjYgMTEtNTQuOCAyOS40ek0xNjAgMTkyYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHptOTYgMGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0zMiA5NmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYUJvb2tCaWJsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib29rLWJpYmxlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImJpYmxlIl0sICJmNjQ3IiwgIk05NiA1MTJjLTUzIDAtOTYtNDMtOTYtOTZMMCA5NkMwIDQzIDQzIDAgOTYgMEw0MDAgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDI4OGMwIDIwLjktMTMuNCAzOC43LTMyIDQ1LjNsMCA2Ni43YzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDk2IDUxMnptMC0xMjhjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMjU2IDAgMC02NC0yNTYgMHpNMTkyIDgwbDAgNDgtNDggMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDQ4IDAgMCAxMTJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMTEyIDQ4IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC00OCAwIDAtNDhjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6Il0KICAgIH07CiAgICBmYUJpYmxlID0gZmFCb29rQmlibGU7CiAgICBmYUNoZXNzQm9hcmQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hlc3MtYm9hcmQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjQzYyIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnptNjQgNjRsMCA2NCA2NCAwIDAtNjQgNjQgMCAwIDY0IDY0IDAgMC02NCA2NCAwIDAgNjQtNjQgMCAwIDY0IDY0IDAgMCA2NC02NCAwIDAgNjQgNjQgMCAwIDY0LTY0IDAgMC02NC02NCAwIDAgNjQtNjQgMCAwLTY0LTY0IDAgMCA2NC02NCAwIDAtNjQgNjQgMCAwLTY0LTY0IDAgMC02NCA2NCAwIDAtNjQtNjQgMCAwLTY0IDY0IDB6bTY0IDEyOGw2NCAwIDAtNjQtNjQgMCAwIDY0em0wIDY0bDAtNjQtNjQgMCAwIDY0IDY0IDB6bTY0IDBsLTY0IDAgMCA2NCA2NCAwIDAtNjR6bTAgMGw2NCAwIDAtNjQtNjQgMCAwIDY0eiJdCiAgICB9OwogICAgZmFNYXJzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hcnMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5Nzk0XSwgImYyMjIiLCAiTTMyMCAzMmMwLTE3LjcgMTQuMy0zMiAzMi0zMkw0ODAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDEyOGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTUwLjctOTUgOTVjMTkuNSAyOC40IDMxIDYyLjcgMzEgOTkuOCAwIDk3LjItNzguOCAxNzYtMTc2IDE3NlMzMiA0MDEuMiAzMiAzMDQgMTEwLjggMTI4IDIwOCAxMjhjMzcgMCA3MS40IDExLjQgOTkuOCAzMWw5NS05NS01MC43IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyek0yMDggNDE2YTExMiAxMTIgMCAxIDAgMC0yMjQgMTEyIDExMiAwIDEgMCAwIDIyNHoiXQogICAgfTsKICAgIGZhTGFwdG9wID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxhcHRvcCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzEyODE4N10sICJmMTA5IiwgIk0xMjggMzJDOTIuNyAzMiA2NCA2MC43IDY0IDk2bDAgMjQwIDY0IDAgMC0yNDAgMzg0IDAgMCAyNDAgNjQgMCAwLTI0MGMwLTM1LjMtMjguNy02NC02NC02NEwxMjggMzJ6TTE5LjIgMzg0QzguNiAzODQgMCAzOTIuNiAwIDQwMy4yIDAgNDQ1LjYgMzQuNCA0ODAgNzYuOCA0ODBsNDg2LjQgMGM0Mi40IDAgNzYuOC0zNC40IDc2LjgtNzYuOCAwLTEwLjYtOC42LTE5LjItMTkuMi0xOS4yTDE5LjIgMzg0eiJdCiAgICB9OwogICAgZmFVc2VyWG1hcmsgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlci14bWFyayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWyJ1c2VyLXRpbWVzIl0sICJmMjM1IiwgIk0xMzYuNCAxMjhhMTIwIDEyMCAwIDEgMSAyNDAgMCAxMjAgMTIwIDAgMSAxIC0yNDAgMHptLTg4IDM1NC4zYzAtOTguNSA3OS44LTE3OC4zIDE3OC4zLTE3OC4zbDU5LjQgMGM5OC41IDAgMTc4LjMgNzkuOCAxNzguMyAxNzguMyAwIDE2LjQtMTMuMyAyOS43LTI5LjcgMjkuN0w3OC4xIDUxMmMtMTYuNCAwLTI5LjctMTMuMy0yOS43LTI5Ljd6TTYxMi4zIDEyNC4xYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45bC0zMy45IDMzLjkgMzMuOSAzMy45YzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTMzLjktMzMuOS0zMy45IDMzLjljLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsMzMuOS0zMy45LTMzLjktMzMuOWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDMzLjkgMzMuOSAzMy45LTMzLjljOS40LTkuNCAyNC42LTkuNCAzMy45IDB6Il0KICAgIH07CiAgICBmYVVzZXJUaW1lcyA9IGZhVXNlclhtYXJrOwogICAgZmFGbGFnVXNhID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZsYWctdXNhIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY3NGQiLCAiTTMyIDBDNDkuNyAwIDY0IDE0LjMgNjQgMzJsMCAxNiA2OS0xNy4yYzM4LjEtOS41IDc4LjMtNS4xIDExMy41IDEyLjUgNDYuMyAyMy4yIDEwMC44IDIzLjIgMTQ3LjEgMGw5LjYtNC44QzQyMy44IDI4LjEgNDQ4IDQzLjEgNDQ4IDY2LjFsMCAzNi4xLTQ0LjcgMTYuMmMtNDIuOCAxNS42LTkwIDEzLjktMTMxLjYtNC42bC0xNi4xLTcuMmMtMjAuMy05LTQxLjgtMTQuNy02My42LTE2LjlsMCAzMi4yYzE3LjQgMi4xIDM0LjQgNi43IDUwLjYgMTMuOWwxNi4xIDcuMmM0OS4yIDIxLjkgMTA1IDIzLjggMTU1LjYgNS40bDMzLjctMTIuMyAwIDYyLTQ0LjcgMTYuMmMtNDIuOCAxNS42LTkwIDEzLjktMTMxLjYtNC42bC0xNi4xLTcuMmMtNDAuMi0xNy45LTg1LTIyLjUtMTI4LjEtMTMuM2wtNjMuNSAxMy42IDAgMzIuNyA3MC4yLTE1LjFjMzYuNC03LjggNzQuMy0zLjkgMTA4LjQgMTEuM2wxNi4xIDcuMmM0OS4yIDIxLjkgMTA1IDIzLjggMTU1LjYgNS40bDMzLjctMTIuMyAwIDYxLjktNDQuNyAxNi4yYy00Mi44IDE1LjYtOTAgMTMuOS0xMzEuNi00LjZsLTE2LjEtNy4yYy00MC4yLTE3LjktODUtMjIuNS0xMjguMS0xMy4zbC02My41IDEzLjYgMCAzMi43IDcwLjItMTUuMWMzNi40LTcuOCA3NC4zLTMuOSAxMDguNCAxMS4zbDE2LjEgNy4yYzQ5LjIgMjEuOSAxMDUgMjMuOCAxNTUuNiA1LjRsMzMuNy0xMi4zIDAgMzMuNWMwIDEzLjMtOC4zIDI1LjMtMjAuOCAzMGwtMzQuNyAxM2MtNDYuMiAxNy4zLTk3LjYgMTQuNi0xNDEuNy03LjQtMzcuOS0xOS04MS40LTIzLjctMTIyLjUtMTMuNEw2NCA0MDAgNjQgNDgwYzAgMTcuNy0xNC4zIDMyLTMyIDMyUzAgNDk3LjcgMCA0ODBMMCAzMkMwIDE0LjMgMTQuMyAwIDMyIDB6bTgwIDk2YTE2IDE2IDAgMSAwIC0zMiAwIDE2IDE2IDAgMSAwIDMyIDB6bTMyIDBhMTYgMTYgMCAxIDAgMC0zMiAxNiAxNiAwIDEgMCAwIDMyem0tMzIgNDhhMTYgMTYgMCAxIDAgLTMyIDAgMTYgMTYgMCAxIDAgMzIgMHptMzIgMGExNiAxNiAwIDEgMCAwLTMyIDE2IDE2IDAgMSAwIDAgMzJ6Il0KICAgIH07CiAgICBmYUhhbmRNaWRkbGVGaW5nZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1taWRkbGUtZmluZ2VyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI4NDA1XSwgImY4MDYiLCAiTTIzMiAwYy0yMi4xIDAtNDAgMTcuOS00MCA0MGwwIDE2NC4yYy04LjUtNy42LTE5LjctMTIuMi0zMi0xMi4yLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgODBjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC01NS43Yy0yIDEuNC0zLjkgMy01LjggNC41TDU1IDI4NC44QzQwLjQgMjk3IDMyIDMxNSAzMiAzMzRMMzIgMzcyYzAgMzggMTYuOSA3NCA0Ni4xIDk4LjNsNS40IDQuNWMyOC44IDI0IDY1IDM3LjEgMTAyLjQgMzcuMUwzMDQgNTEyYzcwLjcgMCAxMjgtNTcuMyAxMjgtMTI4bDAtOTZjMC0yNi41LTIxLjUtNDgtNDgtNDgtMTIuNCAwLTIzLjYgNC43LTMyLjEgMTIuMy0xLjktMjQuOC0yMi42LTQ0LjMtNDcuOS00NC4zLTEyLjMgMC0yMy41IDQuNi0zMiAxMi4yTDI3MiA0MGMwLTIyLjEtMTcuOS00MC00MC00MHoiXQogICAgfTsKICAgIGZhTW9ydGFyUGVzdGxlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vcnRhci1wZXN0bGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjVhNyIsICJNNTA0LjMgMTEuMUM0OTMuMy0xLjYgNDc0LjUtMy43IDQ2MSA2LjJMMjUyLjMgMTYwIDM5Ny4zIDE2MCA1MDIuNiA1NC42YzExLjgtMTEuOCAxMi42LTMwLjggMS42LTQzLjV6TTMyIDE5MmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmMwIDgyLjUgNDMuNCAxNDcuNyAxMjMuOSAxNzYuMi0xMS4xIDEzLjktMTkuNCAzMC4zLTIzLjkgNDguMS00LjQgMTcuMSAxMC40IDMxLjcgMjguMSAzMS43bDE5MiAwYzE3LjcgMCAzMi40LTE0LjYgMjguMS0zMS43LTQuNS0xNy44LTEyLjgtMzQuMS0yMy45LTQ4LjEgODAuNS0yOC42IDEyMy45LTkzLjcgMTIzLjktMTc2LjIgMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgMTkyeiJdCiAgICB9OwogICAgZmFIZWFkU2lkZUNvdWdoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhlYWQtc2lkZS1jb3VnaCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMDYxIiwgIk05NiA1MTJsNjQgMGM1MyAwIDk2LTQzIDk2LTk2bDAtODBjMC04LjggNy4yLTE2IDE2LTE2bDEgMGMyNiAwIDQ3LTIxIDQ3LTQ3IDAtMTEtMy45LTIxLjYtMTAuOS0zMC4xTDI3My4zIDIwMEMyNzEuNCAxOTcuNiAyNzAuMSAxOTQuNyAyNjkuNyAxOTEuNyAyNTQgODMuMyAxNjAuNyAwIDQ4IDAgNDAuNCAwIDMyLjkgLjQgMjUuNCAxLjEgMTAuNSAyLjYgMCAxNS45IDAgMzAuOUwwIDQ4MGMwIDE3LjcgMTQuMyAzMiAzMiAzMmw2NCAwem0xNi0zMjBhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptNjMuMSAyMzcuMmwtNDEuNS0zLjVjLTEyLjItMS0yMS42LTExLjItMjEuNi0yMy40IDAtMTAuOCA3LjMtMjAuMiAxNy44LTIyLjhsNDAuNC0xMC4xYzE5LjItNC44IDM3LjggOS43IDM3LjggMjkuNSAwIDE3LjgtMTUuMiAzMS44LTMyLjkgMzAuM3pNNDgwIDMxMmEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6bS00MCAyNGEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAwem0tNjQgNDhhMjQgMjQgMCAxIDAgLTQ4IDAgMjQgMjQgMCAxIDAgNDggMHptMTI4IDBhMjQgMjQgMCAxIDAgLTQ4IDAgMjQgMjQgMCAxIDAgNDggMHpNNDgwIDUwNGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6bS00MC03MmEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAweiJdCiAgICB9OwogICAgZmFQbGFuZUxvY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGxhbmUtbG9jayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTU4IiwgIk0yMzIgMjRjMC0zMC45IDI1LjEtNTYgNTYtNTZzNTYgMjUuMSA1NiA1NmwwIDEyNy4zIDgyLjEgNzUuMkM0MDkuNyAyNDguMSA0MDAgMjc0LjkgNDAwIDMwNGwwIDI0LjRjLTcuMyA2LjYtMTMuNiAxNC4yLTE4LjcgMjIuN2wtMzcuMy0xMi40IDAgOTkuNyAyNCAxOS4yIDAgMzguM2MwIDEzLjUgMi44IDI2LjQgNy44IDM4LjFMMjg4IDUxMiAxNzkuOSA1MzljLTEwLjEgMi41LTE5LjktNS4xLTE5LjktMTUuNWwwLTE5LjhjMC00LjkgMi4yLTkuNSA2LTEyLjVsNjYtNTIuOCAwLTk5LjctMTYyLjkgNTQuM0M1OC43IDM5Ni40IDQ4IDM4OC43IDQ4IDM3Ny44bDAtNDMuN2MwLTkgMy44LTE3LjUgMTAuNC0yMy42TDIzMiAxNTEuMyAyMzIgMjR6TTU2MCAzMDQuMWMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDQ3LjkgNjQgMCAwLTQ3Ljl6TTQxNiA0MDBjMC0yMC45IDEzLjQtMzguNyAzMi00NS4zbDAtNTAuNmMwLTQ0LjIgMzUuOC04MCA4MC04MHM4MCAzNS44IDgwIDgwbDAgNTAuNmMxOC42IDYuNiAzMiAyNC40IDMyIDQ1LjNsMCA5NmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTI4IDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtOTZ6Il0KICAgIH07CiAgICBmYUJhdHRlcnlUaHJlZVF1YXJ0ZXJzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhdHRlcnktdGhyZWUtcXVhcnRlcnMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsiYmF0dGVyeS00Il0sICJmMjQxIiwgIk01MjggMTI4YzguOCAwIDE2IDcuMiAxNiAxNmwwIDIyNGMwIDguOC03LjIgMTYtMTYgMTZsLTQxNiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0yMjRjMC04LjggNy4yLTE2IDE2LTE2bDQxNiAwek0xMTIgNjRjLTQ0LjIgMC04MCAzNS44LTgwIDgwbDAgMjI0YzAgNDQuMiAzNS44IDgwIDgwIDgwbDQxNiAwYzQ0LjIgMCA4MC0zNS44IDgwLTgwbDAtNDhjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMmwwLTQ4YzAtNDQuMi0zNS44LTgwLTgwLTgwTDExMiA2NHptNTYgMTEyYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDExMmMwIDEzLjMgMTAuNyAyNCAyNCAyNGwyMjQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTExMmMwLTEzLjMtMTAuNy0yNC0yNC0yNGwtMjI0IDB6Il0KICAgIH07CiAgICBmYUJhdHRlcnk0ID0gZmFCYXR0ZXJ5VGhyZWVRdWFydGVyczsKICAgIGZhRnJhbmNTaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZyYW5jLXNpZ24iLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZTE4ZiIsICJNODAgMzJDNjIuMyAzMiA0OCA0Ni4zIDQ4IDY0bDAgMjU2LTI0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMjQgMCAwIDgwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC04MCA4OCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC04OCAwIDAtNjQgMTQ0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTE0NCAwIDAtOTYgMTc2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMODAgMzJ6Il0KICAgIH07CiAgICBmYUZpbHRlckNpcmNsZURvbGxhciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWx0ZXItY2lyY2xlLWRvbGxhciIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJmdW5uZWwtZG9sbGFyIl0sICJmNjYyIiwgIk0zMiA2NEMxOS4xIDY0IDcuNCA3MS44IDIuNCA4My44Uy4yIDEwOS41IDkuNCAxMTguNkwxOTIgMzAxLjMgMTkyIDQxNmMwIDguNSAzLjQgMTYuNiA5LjQgMjIuNmw2NCA2NGMyLjUgMi41IDUuMyA0LjUgOC4zIDYtMjEuMi0zMC45LTMzLjYtNjguMy0zMy42LTEwOC42IDAtOTkuNCA3NS41LTE4MS4xIDE3Mi4zLTE5MWw5MC40LTkwLjRjOS4yLTkuMiAxMS45LTIyLjkgNi45LTM0LjlTNDkyLjkgNjQgNDgwIDY0TDMyIDY0ek01NzYgNDAwYTE0NCAxNDQgMCAxIDAgLTI4OCAwIDE0NCAxNDQgMCAxIDAgMjg4IDB6TTQxNiAzMjBjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDggMTYgMGM4LjggMCAxNiA3LjIgMTYgMTZzLTcuMiAxNi0xNiAxNmwtNDUuOCAwYy01LjYgMC0xMC4yIDQuNi0xMC4yIDEwLjIgMCA0LjkgMy41IDkuMSA4LjMgMTBsNDUgOC4yYzIwIDMuNiAzNC42IDIxLjEgMzQuNiA0MS41IDAgMjMuMy0xOC45IDQyLjItNDIuMiA0Mi4ybC01LjggMCAwIDhjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC04LTE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsNTMuOCAwYzUuNiAwIDEwLjItNC42IDEwLjItMTAuMiAwLTQuOS0zLjUtOS4xLTguMy0xMGwtNDUtOC4yYy0yMC0zLjYtMzQuNi0yMS4xLTM0LjYtNDEuNSAwLTIyLjYgMTcuNy00MSA0MC00Mi4xbDAtOC4xeiJdCiAgICB9OwogICAgZmFGdW5uZWxEb2xsYXIgPSBmYUZpbHRlckNpcmNsZURvbGxhcjsKICAgIGZhQ2hlZXNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoZWVzZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmN2VmIiwgIk01MTIgMjQwLjJsMCAxNS44LTUxMiAwYzAtMjAgMTAtMzguNyAyNi42LTQ5LjhMMjc0LjkgNDAuN2M4LjYtNS43IDE4LjYtOC43IDI4LjktOC43IDExNSAwIDIwOC4yIDkzLjIgMjA4LjIgMjA4LjJ6bTAgNjMuOGwwIDExMmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMTEyIDUxMiAweiJdCiAgICB9OwogICAgZmFDaXJjbGVIID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1oIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTQwNSwgImhvc3BpdGFsLXN5bWJvbCJdLCAiZjQ3ZSIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6bTk2LTM0NGwwIDE3NmMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTY0LTk2IDAgMCA2NGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTE3NmMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgNjQgOTYgMCAwLTY0YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjR6Il0KICAgIH07CiAgICBmYUhvc3BpdGFsU3ltYm9sID0gZmFDaXJjbGVIOwogICAgZmFTY2hvb2wgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2Nob29sIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI3OTc5XSwgImY1NDkiLCAiTTAgMTkyYzAtMzUuMyAyOC43LTY0IDY0LTY0bDY0IDAgMTI3LjktMTE1LjFjMTguMy0xNi40IDQ2LTE2LjQgNjQuMiAwTDQ0OCAxMjggNTEyIDEyOGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI1NmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTkyek0yMjQgMzc2bDAgODggMTI4IDAgMC04OGMwLTIyLjEtMTcuOS00MC00MC00MGwtNDggMGMtMjIuMSAwLTQwIDE3LjktNDAgNDB6bS0xMTIgOGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwem0xNi0xNDRsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNnpNNDk2IDM4NGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwem0xNi0xNDRsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNnpNMjg4IDI1NmE2NCA2NCAwIDEgMCAwLTEyOCA2NCA2NCAwIDEgMCAwIDEyOHoiXQogICAgfTsKICAgIGZhRGljZUZpdmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZGljZS1maXZlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbOTg2MF0sICJmNTIzIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyem02NCA5NmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6TTk2IDM1MmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwek0yMjQgMjI0YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHptNjQtNjRhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptMzIgMTYwYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhVG9ybmFkbyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0b3JuYWRvIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI3Nzg2XSwgImY3NmYiLCAiTTAgMzJMMCA0NS42QzAgNjIuNyAxLjcgNzkuNiA1IDk2bDM1Mi44IDBjMy4yLTYuOSA3LjUtMTMuMyAxMy0xOC44bDM4LjYtMzguNmM0LjItNC4yIDYuNi0xMCA2LjYtMTYgMC0xMi41LTEwLjEtMjIuNi0yMi42LTIyLjZMMzIgMEMxNC4zIDAgMCAxNC4zIDAgMzJ6TTM1NS43IDE0NGwtMzM2IDBjMTIuNCAyOS43IDMwLjIgNTYuOCA1Mi43IDgwbDMzOS42IDAtNDcuMi02Mi45Yy0zLjktNS4yLTctMTEtOS4yLTE3LjF6TTI0Mi42IDMzNC43YzguMiA0LjggMTUuOCAxMC43IDIyLjUgMTcuM0w0NDUgMzUyYzItOS44IDMtMTkuOSAzLTMwLjEgMC0xNy4xLTIuOS0zNC04LjYtNDkuOUwxMzYgMjcyIDI0Mi42IDMzNC43ek0yOTQuMyA0MDBjNS4zIDE3IDYuNSAzNS4yIDMuNiA1M2wtNS45IDM1LjdjLTIgMTIuMiA3LjQgMjMuNCAxOS44IDIzLjQgNS4zIDAgMTAuNC0yLjEgMTQuMi01LjlsNzguMi03OC4yYzguNS04LjUgMTUuOC0xNy44IDIxLjktMjcuOWwtMTMxLjggMHoiXQogICAgfTsKICAgIGZhSmV0RmlnaHRlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJqZXQtZmlnaHRlciIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJmaWdodGVyLWpldCJdLCAiZjBmYiIsICJNNDk2LjIgMjA2LjhjLTEwLjctNC41LTIyLjItNi44LTMzLjgtNi44TDM2MiAyMDAgMjQ4IDQ4IDI5NiA0OGMxMy4zIDAgMjQtMTAuNyAyNC0yNFMzMDkuMyAwIDI5NiAwTDE1MiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDggMCAwIDE1Mi01NC40IDAtNTIuOC02NmMtMy0zLjgtNy42LTYtMTIuNS02TDE2IDEyOGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgODggNDAgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNDAgMCAwIDg4YzAgOC44IDcuMiAxNiAxNiAxNmwyNC4zIDBjNC45IDAgOS41LTIuMiAxMi41LTZsNTIuOC02NiA1NC40IDAgMCAxNTItOCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDE0NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC00OCAwIDExNC0xNTIgMTAwLjQgMGMxMS42IDAgMjMuMS0yLjMgMzMuOC02LjhsNjUtMjcuMWM4LjktMy43IDE0LjgtMTIuNSAxNC44LTIyLjJzLTUuOC0xOC40LTE0LjgtMjIuMmwtNjUtMjcuMXoiXQogICAgfTsKICAgIGZhRmlnaHRlckpldCA9IGZhSmV0RmlnaHRlcjsKICAgIGZhVGh1bWJzRG93bjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGh1bWJzLWRvd24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgwNzgsIDYxNTc2XSwgImYxNjUiLCAiTTM4NCAzMmMyNi41IDAgNDggMjEuNSA0OCA0OCAwIDYuMy0xLjMgMTIuMi0zLjQgMTcuNyAyMC40IDUuNSAzNS40IDI0LjEgMzUuNCA0Ni4zIDAgOS4xLTIuNiAxNy42LTcgMjQuOSAyMi4yIDQuMiAzOSAyMy43IDM5IDQ3LjEgMCAxOS43LTExLjkgMzYuNi0yOC45IDQ0IDE3IDcuNCAyOC45IDI0LjMgMjguOSA0NCAwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTYwIDAgMjguMiA3MC40YzIuNSA2LjMgMy44IDEzLjEgMy44IDE5LjlsMCA0LjJjMCAyNy4zLTIyLjEgNDkuNC00OS40IDQ5LjQtMTguNyAwLTM1LjgtMTAuNi00NC4yLTI3LjNMMTcwLjEgMzU2LjNjLTYuNy0xMy4zLTEwLjEtMjgtMTAuMS00Mi45bDAtMTg2LjZjMC0xOS40IDguOS0zNy44IDI0LTUwbDEyLjItOS43QzIyNC42IDQ0LjQgMjU5LjggMzIgMjk2LjEgMzJMMzg0IDMyek04MCA5NmMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDI1NmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtNDggMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJMMCAxMjhjMC0xNy43IDE0LjMtMzIgMzItMzJsNDggMHoiXQogICAgfTsKICAgIGZhQnJvb20gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnJvb20iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjk1MjldLCAiZjUxYSIsICJNNTY2LjYgNTQuNmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMGwtMTkyIDE5Mi0zNC43LTM0LjdjLTQuMi00LjItMTAtNi42LTE2LTYuNi0xMi41IDAtMjIuNiAxMC4xLTIyLjYgMjIuNmwwIDI5LjEgMTA4LjMgMTA4LjMgMjkuMSAwYzEyLjUgMCAyMi42LTEwLjEgMjIuNi0yMi42IDAtNi0yLjQtMTEuOC02LjYtMTZsLTM0LjctMzQuNyAxOTItMTkyek0zNDEuMSAzNTMuNEwyMjIuNiAyMzQuOWMtNDIuNy0zLjctODUuMiAxMS43LTExNS44IDQyLjNsLTggOGMtMjIuMyAyMi4zLTM0LjggNTIuNS0zNC44IDg0IDAgNi44IDcuMSAxMS4yIDEzLjIgOC4ybDUxLjEtMjUuNWM1LTIuNSA5LjUgNC4xIDUuNCA3LjlMNy4zIDQ3My40QzIuNyA0NzcuNiAwIDQ4My42IDAgNDg5LjkgMCA1MDIuMSA5LjkgNTEyIDIyLjEgNTEybDE3My4zIDBjMzguOCAwIDc1LjktMTUuNCAxMDMuNC00Mi44IDMwLjYtMzAuNiA0NS45LTczLjEgNDIuMy0xMTUuOHoiXQogICAgfTsKICAgIGZhRmlsZUltcG9ydCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLWltcG9ydCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJhcnJvdy1yaWdodC10by1maWxlIl0sICJmNTZmIiwgIk02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NGwwIDI0MCAxODIuMSAwLTMxLTMxYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBsNzIgNzJjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlsLTcyIDcyYy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45bDMxLTMxLTE4Mi4xIDAgMCA5NmMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI3Ny41YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI1OC43IDE4LjdDMjQ2LjcgNi43IDIzMC41IDAgMjEzLjUgMEw2NCAwek0zMjUuNSAxNzZMMjMyIDE3NmMtMTMuMyAwLTI0LTEwLjctMjQtMjRMMjA4IDU4LjUgMzI1LjUgMTc2eiJdCiAgICB9OwogICAgZmFBcnJvd1JpZ2h0VG9GaWxlID0gZmFGaWxlSW1wb3J0OwogICAgZmFVdGVuc2lscyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1dGVuc2lscyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyNzg2MCwgNjE2ODUsICJjdXRsZXJ5Il0sICJmMmU3IiwgIk02My45IDE0LjRDNjMuMSA2LjIgNTYuMiAwIDQ4IDBzLTE1LjEgNi4yLTE2IDE0LjNMMTcuOSAxNDkuN2MtMS4zIDYtMS45IDEyLjEtMS45IDE4LjIgMCA0NS45IDM1LjEgODMuNiA4MCA4Ny43TDk2IDQ4MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjI0LjRjNDQuOS00LjEgODAtNDEuOCA4MC04Ny43IDAtNi4xLS42LTEyLjItMS45LTE4LjJMMjIzLjkgMTQuM0MyMjMuMSA2LjIgMjE2LjIgMCAyMDggMHMtMTUuMSA2LjItMTUuOSAxNC40TDE3OC41IDE0OS45Yy0uNiA1LjctNS40IDEwLjEtMTEuMSAxMC4xLTUuOCAwLTEwLjYtNC40LTExLjItMTAuMkwxNDMuOSAxNC42QzE0My4yIDYuMyAxMzYuMyAwIDEyOCAwcy0xNS4yIDYuMy0xNS45IDE0LjZMOTkuOCAxNDkuOGMtLjUgNS44LTUuNCAxMC4yLTExLjIgMTAuMi01LjggMC0xMC42LTQuNC0xMS4xLTEwLjFMNjMuOSAxNC40ek00NDggMEM0MzIgMCAzMjAgMzIgMzIwIDE3NmwwIDExMmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMiAwIDAgMTI4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC00NDhjMC0xNy43LTE0LjMtMzItMzItMzJ6Il0KICAgIH07CiAgICBmYUN1dGxlcnkgPSBmYVV0ZW5zaWxzOwogICAgZmFJZEJhZGdlMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJpZC1iYWRnZSIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMmMxIiwgIk02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTM4NGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAwem05NiAzNTJsNjQgMGM0NC4yIDAgODAgMzUuOCA4MCA4MCAwIDguOC03LjIgMTYtMTYgMTZMOTYgNDQ4Yy04LjggMC0xNi03LjItMTYtMTYgMC00NC4yIDM1LjgtODAgODAtODB6bS0yNC05NmE1NiA1NiAwIDEgMSAxMTIgMCA1NiA1NiAwIDEgMSAtMTEyIDB6TTE1MiA2NGw4MCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC04MCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFTcGlkZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3BpZGVyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4Mzc1XSwgImY3MTciLCAiTTM2OS4zLTMxYzExLjktMy41IDI0LjQgMi43IDI5IDEzLjlsLjggMi4zIDQwIDEzNmMyLjUgOC40IC4xIDE3LjUtNi4xIDIzLjdsLTY0LjEgNjQuMSA3Ni40LTIwLjggMTkuOS01OS44IC45LTIuM2M1LTExLjEgMTcuNy0xNi44IDI5LjUtMTIuOSAxMS44IDMuOSAxOC41IDE2LjEgMTUuOCAyOGwtLjcgMi40LTI0IDcyYy0yLjUgNy42LTguNyAxMy40LTE2LjUgMTUuNmwtOTEuMSAyNC44IDkxLjEgMjQuOGM3LjcgMi4xIDEzLjkgOCAxNi41IDE1LjZsMjQgNzIgLjcgMi40YzIuNyAxMS45LTQuMSAyNC4xLTE1LjggMjgtMTEuOCAzLjktMjQuNS0xLjgtMjkuNS0xMi45bC0uOS0yLjMtMTkuOS01OS44LTc2LjQtMjAuOCA2NC4xIDY0LjFjNi4xIDYuMSA4LjUgMTUuMSA2LjIgMjMuNGwtNDAgMTQ0LS44IDIuM2MtNC40IDExLjMtMTYuOCAxNy43LTI4LjggMTQuNC0xMi0zLjMtMTkuMy0xNS4yLTE3LjItMjcuMmwuNS0yLjQgMzYuMi0xMzAuNS0zNy4yLTM3LjJDMzUxIDQwNiAzMDguNCA0NDggMjU2IDQ0OHMtOTUtNDItOTYtOTQuMWwtMzcgMzcgMzYgMTIyLjMgLjYgMi40YzIuMiAxMS45LTQuOSAyMy45LTE2LjggMjcuNC0xMS45IDMuNS0yNC40LTIuNy0yOS0xMy45bC0uOC0yLjMtNDAtMTM2Yy0yLjUtOC40LS4xLTE3LjUgNi4xLTIzLjhsNjQuMS02NC4xLTc2LjQgMjAuOC0xOS45IDU5LjgtLjkgMi4zYy01IDExLjEtMTcuNyAxNi44LTI5LjUgMTIuOXMtMTguNS0xNi4xLTE1LjgtMjhsLjctMi40IDI0LTcyYzIuNS03LjYgOC43LTEzLjQgMTYuNS0xNS42bDkxLjEtMjQuOC05MS4xLTI0LjhjLTcuNy0yLjEtMTMuOS04LTE2LjUtMTUuNmwtMjQtNzItLjctMi40Yy0yLjctMTEuOSA0LjEtMjQuMSAxNS44LTI4czI0LjUgMS44IDI5LjUgMTIuOWwuOSAyLjMgMTkuOSA1OS44IDc2LjQgMjAuOC02NC4xLTY0LjFjLTYuMi02LjItOC41LTE1LjMtNi4xLTIzLjdsNDAtMTM2IC44LTIuM2M0LjYtMTEuMyAxNy4xLTE3LjQgMjktMTMuOSAxMS45IDMuNSAxOSAxNS41IDE2LjggMjcuNGwtLjYgMi40LTM2IDEyMi4zIDUzIDUzYzEtNDMuMyAzNi40LTc4LjEgNzkuOS03OC4xczc4LjkgMzQuOCA3OS45IDc4LjJsNTMuMS01My4xLTM2LTEyMi4zLS42LTIuNGMtMi4yLTEyIDQuOS0yMy45IDE2LjgtMjcuNHoiXQogICAgfTsKICAgIGZhTW9iaWxlUmV0cm8gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibW9iaWxlLXJldHJvIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImU1MjciLCAiTTE2IDY0QzE2IDI4LjcgNDQuNyAwIDgwIDBMMzA0IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzODRjMCAzNS4zLTI4LjcgNjQtNjQgNjRMODAgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwxNiA2NHptODAgOTZsMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxMjggMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTY0YzAtMTcuNy0xNC4zLTMyLTMyLTMybC0xMjggMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6bTggMTkyYTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHptMjQgNzJjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjQgMTAuNyAyNCAyNCAyNCAyNC0xMC43IDI0LTI0em02NC03MmEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6bTI0IDcyYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0IDEwLjcgMjQgMjQgMjQgMjQtMTAuNyAyNC0yNHptNjQtNzJhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4em0yNCA3MmMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNCAxMC43IDI0IDI0IDI0IDI0LTEwLjcgMjQtMjR6TTE2OCA0MGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw0OCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC00OCAweiJdCiAgICB9OwogICAgZmFTaWduc1Bvc3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2lnbnMtcG9zdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJtYXAtc2lnbnMiXSwgImYyNzciLCAiTTI1Ni40IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgMzItMTYwIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgNjRjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTYwIDAgMCA2NC0xNTMuNCAwYy00LjIgMC04LjMgMS43LTExLjMgNC43bC00OCA0OGMtNi4yIDYuMi02LjIgMTYuNCAwIDIyLjZsNDggNDhjMyAzIDcuMSA0LjcgMTEuMyA0LjdsMTUzLjQgMCAwIDk2YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC05NiAxNjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTY0YzAtMTcuNy0xNC4zLTMyLTMyLTMybC0xNjAgMCAwLTY0IDE1My40IDBjNC4yIDAgOC4zLTEuNyAxMS4zLTQuN2w0OC00OGM2LjItNi4yIDYuMi0xNi40IDAtMjIuNmwtNDgtNDhjLTMtMy03LjEtNC43LTExLjMtNC43bC0xNTMuNCAwIDAtMzJjMC0xNy43LTE0LjMtMzItMzItMzJ6Il0KICAgIH07CiAgICBmYU1hcFNpZ25zID0gZmFTaWduc1Bvc3Q7CiAgICBmYUdyb3VwQXJyb3dzUm90YXRlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImdyb3VwLWFycm93cy1yb3RhdGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTRmNiIsICJNMzcuNiAxMjIuM2MtMTEuNSAxOC43LTIwLjYgMzktMjcgNjAuNS01IDE2LjkgNC42IDM0LjggMjEuNSAzOS44czM0LjgtNC42IDM5LjgtMjEuNWMxOC40LTYxLjkgNjcuMy0xMTAuOCAxMjkuMi0xMjkuMiAxNi45LTUgMjYuNi0yMi45IDIxLjUtMzkuOFMxOTkuOCA1LjYgMTgyLjkgMTAuNkMxNjEuNCAxNyAxNDEuMSAyNi4xIDEyMi4zIDM3LjYgMTEyLjMgMTUuNCA4OS45IDAgNjQgMCAyOC43IDAgMCAyOC43IDAgNjQgMCA4OS45IDE1LjQgMTEyLjMgMzcuNiAxMjIuM3ptNDM2LjcgMGMyMi4yLTEwIDM3LjYtMzIuNCAzNy42LTU4LjMgMC0zNS4zLTI4LjctNjQtNjQtNjQtMjUuOSAwLTQ4LjMgMTUuNC01OC4zIDM3LjYtMTguNy0xMS41LTM5LTIwLjYtNjAuNS0yNy0xNi45LTUtMzQuOCA0LjYtMzkuOCAyMS41czQuNiAzNC44IDIxLjUgMzkuOGM2MS45IDE4LjQgMTEwLjggNjcuMyAxMjkuMiAxMjkuMiA1IDE2LjkgMjIuOSAyNi42IDM5LjggMjEuNXMyNi42LTIyLjkgMjEuNS0zOS44Yy02LjQtMjEuNS0xNS41LTQxLjgtMjctNjAuNXpNNTEyIDQ0OGMwLTI1LjktMTUuNC00OC4zLTM3LjYtNTguMyAxMS41LTE4LjcgMjAuNi0zOSAyNy02MC41IDUtMTYuOS00LjYtMzQuOC0yMS41LTM5LjhzLTM0LjggNC42LTM5LjggMjEuNWMtMTguNCA2MS45LTY3LjMgMTEwLjgtMTI5LjIgMTI5LjItMTYuOSA1LTI2LjYgMjIuOS0yMS41IDM5LjhzMjIuOSAyNi42IDM5LjggMjEuNWMyMS41LTYuNCA0MS44LTE1LjUgNjAuNS0yNyAxMCAyMi4yIDMyLjQgMzcuNiA1OC4zIDM3LjYgMzUuMyAwIDY0LTI4LjcgNjQtNjR6TTM3LjYgMzg5LjdjLTIyLjIgMTAtMzcuNiAzMi40LTM3LjYgNTguMyAwIDM1LjMgMjguNyA2NCA2NCA2NCAyNS45IDAgNDguMy0xNS40IDU4LjMtMzcuNiAxOC43IDExLjUgMzkgMjAuNiA2MC41IDI3IDE2LjkgNSAzNC44LTQuNiAzOS44LTIxLjVzLTQuNi0zNC44LTIxLjUtMzkuOGMtNjEuOS0xOC40LTExMC44LTY3LjMtMTI5LjItMTI5LjItNS0xNi45LTIyLjktMjYuNi0zOS44LTIxLjVTNS42IDMxMi4yIDEwLjYgMzI5LjFjNi40IDIxLjUgMTUuNSA0MS44IDI3IDYwLjV6TTI1NiAxOTJjMTUuNiAwIDMwIDUuNiA0MS4xIDE0LjlsLTE1LjMgMTUuM2MtNi42IDYuNi0xLjkgMTcuOCA3LjQgMTcuOGw2MC41IDBjNS43IDAgMTAuNC00LjcgMTAuNC0xMC40bDAtNjAuNWMwLTkuMy0xMS4yLTEzLjktMTcuOC03LjRsLTExLjIgMTEuMmMtMTkuOC0xNy45LTQ2LjItMjguOS03NS4xLTI4LjktNDMuNiAwLTgxLjMgMjQuOS05OS44IDYxLjEtNiAxMS44LTEuNCAyNi4zIDEwLjQgMzIuM3MyNi4zIDEuNCAzMi4zLTEwLjRjMTAuNi0yMC44IDMyLjItMzQuOSA1Ny0zNC45em01OC42IDkzLjFjLTEwLjYgMjAuOC0zMi4yIDM0LjktNTcgMzQuOS0xNS43IDAtMzAtNS42LTQxLjEtMTQuOWwxNS4zLTE1LjNjNi42LTYuNiAxLjktMTcuOC03LjQtMTcuOEwxNjQgMjcyYy01LjcgMC0xMC40IDQuNy0xMC40IDEwLjRsMCA2MC41YzAgOS4zIDExLjIgMTMuOSAxNy44IDcuNGwxMS4yLTExLjJjMTkuOCAxNy45IDQ2LjIgMjguOSA3NS4xIDI4LjkgNDMuNiAwIDgxLjMtMjQuOSA5OS44LTYxLjEgNi0xMS44IDEuNC0yNi4zLTEwLjQtMzIuM3MtMjYuMy0xLjQtMzIuMyAxMC40eiJdCiAgICB9OwogICAgZmFBcnJvd3NTcGxpdFVwQW5kTGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvd3Mtc3BsaXQtdXAtYW5kLWxlZnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTRiYyIsICJNMzQyLjYtMjIuNmMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTk2IDk2Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwbDQxLjQtNDEuNCAwIDE5NS45Yy0xOC44LTEwLjktNDAuNy0xNy4xLTY0LTE3LjFsLTExNC43IDAgNDEuNC00MS40YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwbC05NiA5NmMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNsOTYgOTZjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBzMTIuNS0zMi44IDAtNDUuM0wxMDkuMyAzMjAgMjI0IDMyMGMzNS4zIDAgNjQgMjguNyA2NCA2NCAwIDcwLjcgNTcuMyAxMjggMTI4IDEyOGwzMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0zMiAwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTMwNi43IDQxLjQgNDEuNGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zbC05Ni05NnoiXQogICAgfTsKICAgIGZhRmlsbERyaXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsbC1kcmlwIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY1NzYiLCAiTTMwOS43IDcxLjZsLTY0LjQgNjQuNCAzMy40IDMzLjRjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNzLTMyLjggMTIuNS00NS4zIDBsLTMzLjQtMzMuNC05Ni40IDk2LjRjLTIuOSAyLjktNS4xIDYuNS02LjMgMTAuM2wzMjEuNSAwIDUzLjctNTMuN2M0LjktNC45IDcuNi0xMS41IDcuNi0xOC4zcy0yLjctMTMuNS03LjYtMTguM0wzNDYuMyA3MS42QzM0MS41IDY2LjcgMzM0LjkgNjQgMzI4IDY0cy0xMy41IDIuNy0xOC4zIDcuNnpNNTguMyAyMzIuNGw5Ni40LTk2LjQtNDkuNC00OS40Yy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM3MzMi44LTEyLjUgNDUuMyAwTDIwMCA5MC43IDI2NC40IDI2LjNDMjgxLjMgOS41IDMwNC4xIDAgMzI4IDBzNDYuNyA5LjUgNjMuNiAyNi4zTDUxNy43IDE1Mi40QzUzNC41IDE2OS4zIDU0NCAxOTIuMSA1NDQgMjE2cy05LjUgNDYuNy0yNi4zIDYzLjZMMzExLjYgNDg1LjdDMjk0LjcgNTAyLjUgMjcxLjkgNTEyIDI0OCA1MTJzLTQ2LjctOS41LTYzLjYtMjYuM0w1OC4zIDM1OS42QzQxLjUgMzQyLjcgMzIgMzE5LjkgMzIgMjk2czkuNS00Ni43IDI2LjMtNjMuNnpNNTEyIDU0NGMtMzUuMyAwLTY0LTI4LjctNjQtNjQgMC0yNS4yIDMyLjYtNzkuNiA1MS4yLTEwOC43IDYtOS40IDE5LjUtOS40IDI1LjUgMCAxOC43IDI5LjEgNTEuMiA4My41IDUxLjIgMTA4LjcgMCAzNS4zLTI4LjcgNjQtNjQgNjR6Il0KICAgIH07CiAgICBmYVNoaWVsZEhlYXJ0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNoaWVsZC1oZWFydCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTc0IiwgIk0yNjkuNCAyLjlDMjY1LjIgMSAyNjAuNyAwIDI1NiAwcy05LjIgMS0xMy40IDIuOUw1NC4zIDgyLjhjLTIyIDkuMy0zOC40IDMxLTM4LjMgNTcuMiAuNSA5OS4yIDQxLjMgMjgwLjcgMjEzLjYgMzYzLjIgMTYuNyA4IDM2LjEgOCA1Mi44IDAgMTcyLjQtODIuNSAyMTMuMi0yNjQgMjEzLjYtMzYzLjIgLjEtMjYuMi0xNi4zLTQ3LjktMzguMy01Ny4yTDI2OS40IDIuOXpNMjQ5LjYgMTgzLjVsNi40IDguNSA2LjQtOC41YzExLjEtMTQuOCAyOC41LTIzLjUgNDYuOS0yMy41IDMyLjQgMCA1OC43IDI2LjMgNTguNyA1OC43bDAgNS4zYzAgNDkuMS02NS44IDk4LjEtOTYuNSAxMTguMy05LjUgNi4yLTIxLjUgNi4yLTMwLjkgMC0zMC43LTIwLjItOTYuNS02OS4zLTk2LjUtMTE4LjNsMC01LjNjMC0zMi40IDI2LjMtNTguNyA1OC43LTU4LjcgMTguNSAwIDM1LjkgOC43IDQ2LjkgMjMuNXoiXQogICAgfTsKICAgIGZhUGVyc29uU2tpaW5nTm9yZGljID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1za2lpbmctbm9yZGljIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInNraWluZy1ub3JkaWMiXSwgImY3Y2EiLCAiTTQyNC44IDE2YTU2IDU2IDAgMSAxIDAgMTEyIDU2IDU2IDAgMSAxIDAtMTEyem05OS44IDE5My43YzcuNiAxNS4yIDEuOSAzMy42LTEyLjYgNDJsMCAxODAuMy0zMiAwIDAtMTY0LjItMTAuMSA1Yy0yNy40IDEzLjctNjAuNyA2LjEtNzkuNC0xOC4ybC0xOS42LTI1LjUtMzkuNSA2OC44IDI0LjggMTIuNGMyOS41IDE0LjcgNDIuOSA0OS41IDMxLjEgODAuMmwtMjguMiA3My40IDE0OS40IDBjNy45IDAgMTUuNi0yLjMgMjIuMi02LjdsNy45LTUuM2MxMS03LjQgMjUuOS00LjQgMzMuMyA2LjdzNC40IDI1LjktNi43IDMzLjNsLTcuOSA1LjNDNTQzIDUwNi45IDUyNiA1MTIgNTA4LjYgNTEybC0xODkuMSAwYy0uNSAwLTEgMC0xLjUgMEwyNCA1MTJjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsODggMGMwLTguMiAzLjEtMTYuNCA5LjQtMjIuNmw3NC4xLTc0LjEgMTAuMi0zNS45YzExLjMgMTguMyAyNy43IDMzLjggNDguNCA0NC4ybDQuOCAyLjQtMS45IDYuOGMtMyAxMC41LTguNiAyMC0xNi4zIDI3LjdsLTUxLjUgNTEuNSAxMDEuMyAwIDM3LjEtOTYuNC01NS42LTI3LjhDMjMwLjQgMzE5IDIxNS4zIDI2NyAyMzkuMyAyMjcuMWwzNy43LTYyLjctMjcuNy03LjdjLTktMi41LTE4LjEgMy4yLTIwIDEyLjNsLTUuOSAyOS4zYy0zLjEgMTUuNi0xNy4xIDI2LjMtMzIuNSAyNS43bC0xMzAgMjA4LTM3LjcgMCAxNDAuNi0yMjVjLTMuNC02LjMtNC42LTEzLjgtMy4xLTIxLjNsNS45LTI5LjNjOS4xLTQ1LjYgNTUuMS03My44IDk5LjktNjEuNGwzMi41IDljNDYuNyAxMyA4OCA0MC44IDExNy42IDc5LjNsMjQuOSAzMi4zIDQwLjQtMjAuMmMxNS44LTcuOSAzNS0xLjUgNDIuOSAxNC4zeiJdCiAgICB9OwogICAgZmFTa2lpbmdOb3JkaWMgPSBmYVBlcnNvblNraWluZ05vcmRpYzsKICAgIGZhU3F1YXJlQ2hlY2syID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1jaGVjayIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzk3NDUsIDk5ODksIDYxNTEwLCAiY2hlY2stc3F1YXJlIl0sICJmMTRhIiwgIk0zODQgMzJjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDMyMCAwek0zNDIgMTQ1LjdjLTEwLjctNy44LTI1LjctNS40LTMzLjUgNS4zTDE4OS4xIDMxNS4yIDEzNyAyNjMuMWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWw3MiA3MmM1IDUgMTEuOSA3LjUgMTguOCA3czEzLjQtNC4xIDE3LjUtOS44TDM0Ny4zIDE3OS4yYzcuOC0xMC43IDUuNC0yNS43LTUuMy0zMy41eiJdCiAgICB9OwogICAgZmFDaGVja1NxdWFyZTIgPSBmYVNxdWFyZUNoZWNrMjsKICAgIGZhQmF0aCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYXRoIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NzA1LCAiYmF0aHR1YiJdLCAiZjJjZCIsICJNOTYgNzcuM2MwLTcuMyA1LjktMTMuMyAxMy4zLTEzLjMgMy41IDAgNi45IDEuNCA5LjQgMy45bDE0LjkgMTQuOWMtMy42IDkuMS01LjUgMTguOS01LjUgMjkuMiAwIDE5LjkgNy4yIDM4IDE5LjIgNTItNS4zIDkuMi00IDIxLjEgMy44IDI5IDkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwTDI4OSA4OWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOS03LjgtNy45LTE5LjgtOS4xLTI5LTMuOC0xNC0xMi0zMi4xLTE5LjItNTItMTkuMi0xMC4zIDAtMjAuMiAyLTI5LjIgNS41TDE2My45IDIyLjZDMTQ5LjQgOC4xIDEyOS43IDAgMTA5LjMgMCA2Ni42IDAgMzIgMzQuNiAzMiA3Ny4zTDMyIDI1NmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwwIDQ4YzAgMjguNCAxMi40IDU0IDMyIDcxLjZMNjQgNDgwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xNiAyNTYgMCAwIDE2YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC00MC40YzE5LjYtMTcuNiAzMi00My4xIDMyLTcxLjZsMC00OGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkw5NiAyNTYgOTYgNzcuM3oiXQogICAgfTsKICAgIGZhQmF0aHR1YiA9IGZhQmF0aDsKICAgIGZhQ2hlc3NCaXNob3AyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoZXNzLWJpc2hvcCIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWzk4MjFdLCAiZjQzYSIsICJNNjQgMzg0TDQ4LjMgMzY4LjNDMTcuNCAzMzcuNCAwIDI5NS40IDAgMjUxLjcgMCAyMTMuMSAxMy41IDE3NS44IDM4LjIgMTQ2LjFMMTA2LjcgNjQgOTYgNjRDNzguMyA2NCA2NCA0OS43IDY0IDMyUzc4LjMgMCA5NiAwTDIyNCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0xMC43IDAgNDcuNiA1Ny4xLTg1LjkgODUuOWMtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDgyLjMtODIuM2MxOC43IDI3LjMgMjguNyA1OS43IDI4LjcgOTMgMCA0My43LTE3LjQgODUuNy00OC4zIDExNi42TDI1NiAzODQgMzEyLjIgNDU0LjNjNSA2LjMgNy44IDE0LjEgNy44IDIyLjIgMCAxOS42LTE1LjkgMzUuNS0zNS41IDM1LjVMMzUuNSA1MTJjLTE5LjYgMC0zNS41LTE1LjktMzUuNS0zNS41IDAtOC4xIDIuNy0xNS45IDcuOC0yMi4yTDY0IDM4NHoiXQogICAgfTsKICAgIGZhUHJlc2NyaXB0aW9uQm90dGxlTWVkaWNhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwcmVzY3JpcHRpb24tYm90dGxlLW1lZGljYWwiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsicHJlc2NyaXB0aW9uLWJvdHRsZS1hbHQiXSwgImY0ODYiLCAiTTAgMzJDMCAxNC4zIDE0LjMgMCAzMiAwTDM1MiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJMMzIgOTZDMTQuMyA5NiAwIDgxLjcgMCA2NEwwIDMyek0zMiAxNDRsMzIwIDAgMCAzMDRjMCAzNS4zLTI4LjcgNjQtNjQgNjRMOTYgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTMwNHpNMTYwIDI0OGwwIDQwLTQwIDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmw0MCAwIDAgNDBjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtNDAgNDAgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTQwIDAgMC00MGMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnoiXQogICAgfTsKICAgIGZhUHJlc2NyaXB0aW9uQm90dGxlQWx0ID0gZmFQcmVzY3JpcHRpb25Cb3R0bGVNZWRpY2FsOwogICAgZmFEcmF3UG9seWdvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkcmF3LXBvbHlnb24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs1ODA1NSwgInZlY3Rvci1wb2x5Z29uIl0sICJmNWVlIiwgIk02NCAwYzIzLjcgMCA0NC40IDEyLjkgNTUuNCAzMmwyNzMuMSAwYzExLjEtMTkuMSAzMS43LTMyIDU1LjQtMzIgMzUuMyAwIDY0IDI4LjcgNjQgNjQgMCAzNC0yNi41IDYxLjgtNjAgNjMuOWwtMi4xIDIuOS03MS41IDk5LjFjMy42IDggNS42IDE2LjkgNS42IDI2LjJzLTIgMTguMi01LjYgMjYuMmwyLjIgMy4xIDY5LjMgOTYgMi4xIDIuOWMzMy41IDIuMSA2MCAyOS45IDYwIDYzLjkgMCAzNS4zLTI4LjcgNjQtNjQgNjQtMjMuNyAwLTQ0LjQtMTIuOS01NS40LTMybC0yNzMuMSAwYy0xMS4xIDE5LjEtMzEuNyAzMi01NS40IDMyLTM1LjMgMC02NC0yOC43LTY0LTY0IDAtMjMuNyAxMi45LTQ0LjQgMzItNTUuNGwwLTI3My4xQzEyLjkgMTA4LjQgMCA4Ny43IDAgNjQgMCAyOC43IDI4LjcgMCA2NCAwek0zOTQuMiA0MTMuNGwtNjUuNS05MC42LTIuMi0zLjFjLTIuMSAuMi00LjMgLjMtNi41IC4zLTM1LjMgMC02NC0yOC43LTY0LTY0czI4LjctNjQgNjQtNjRjMi4yIDAgNC40IC4xIDYuNSAuM2w2Ny43LTkzLjdjLS42LS45LTEuMS0xLjctMS42LTIuNkwxMTkuNCA5NmMtNS42IDkuNy0xMy43IDE3LjgtMjMuNCAyMy40bDAgMjczLjFjOS43IDUuNiAxNy44IDEzLjcgMjMuNCAyMy40bDI3My4xIDBjLjUtLjkgMS4xLTEuOCAxLjYtMi42eiJdCiAgICB9OwogICAgZmFWZWN0b3JQb2x5Z29uID0gZmFEcmF3UG9seWdvbjsKICAgIGZhSUN1cnNvciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJpLWN1cnNvciIsCiAgICAgIGljb246IFsyNTYsIDUxMiwgW10sICJmMjQ2IiwgIk0uMSAyOS4zQy0xLjQgNDcgMTEuNyA2Mi40IDI5LjMgNjMuOWw4IC43QzcwLjUgNjcuMyA5NiA5NSA5NiAxMjguM2wwIDk1LjctMzIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzMiAwIDAgOTUuN2MwIDMzLjMtMjUuNSA2MS01OC43IDYzLjhsLTggLjdDMTEuNyA0NDkuNi0xLjQgNDY1IC4xIDQ4Mi43UzE3IDUxMy40IDM0LjcgNTExLjlsOC0uN2MzNC4xLTIuOCA2NC4yLTE4LjkgODUuNC00Mi45IDIxLjIgMjQgNTEuMiA0MCA4NS40IDQyLjlsOCAuN2MxNy42IDEuNSAzMy4xLTExLjYgMzQuNS0yOS4ycy0xMS42LTMzLjEtMjkuMi0zNC41bC04LS43QzE4NS41IDQ0NC43IDE2MCA0MTcgMTYwIDM4My43bDAtOTUuNyAzMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0zMiAwIDAtOTUuN2MwLTMzLjMgMjUuNS02MSA1OC43LTYzLjhsOC0uN2MxNy42LTEuNSAzMC43LTE2LjkgMjkuMi0zNC41UzIzOS0xLjQgMjIxLjMgLjFsLTggLjdjLTM0LjEgMi44LTY0LjIgMTguOS04NS40IDQyLjktMjEuMi0yNC01MS4yLTQwLTg1LjQtNDIuOWwtOC0uN0MxNy0xLjQgMS42IDExLjcgLjEgMjkuM3oiXQogICAgfTsKICAgIGZhSGVhcnRDaXJjbGVQbHVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhlYXJ0LWNpcmNsZS1wbHVzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1MDAiLCAiTTI0MSA4Ny4xbDE1IDIwLjcgMTUtMjAuN0MyOTYgNTIuNSAzMzYuMiAzMiAzNzguOSAzMiA0NTIuNCAzMiA1MTIgOTEuNiA1MTIgMTY1LjFsMCAyLjZjMCAxNy42LTMuNCAzNS42LTkuNSA1My43LTIxLjgtOC42LTQ1LjYtMTMuNC03MC41LTEzLjQtMTA2IDAtMTkyIDg2LTE5MiAxOTIgMCAyOC41IDYuMiA1NS42IDE3LjQgODAtLjUgMC0uOSAwLTEuNCAwLTE1LjUgMC0zMC44LTQuNi00My4xLTE0LjEtNzMtNTUuNy0yMTIuOS0xODYtMjEyLjktMjk4LjJsMC0yLjZDMCA5MS42IDU5LjYgMzIgMTMzLjEgMzIgMTc1LjggMzIgMjE2IDUyLjUgMjQxIDg3LjF6TTQzMiAyNTZhMTQ0IDE0NCAwIDEgMSAwIDI4OCAxNDQgMTQ0IDAgMSAxIDAtMjg4em0xNiA4MGMwLTguOC03LjItMTYtMTYtMTZzLTE2IDcuMi0xNiAxNmwwIDQ4LTQ4IDBjLTguOCAwLTE2IDcuMi0xNiAxNnM3LjIgMTYgMTYgMTZsNDggMCAwIDQ4YzAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZsMC00OCA0OCAwYzguOCAwIDE2LTcuMiAxNi0xNnMtNy4yLTE2LTE2LTE2bC00OCAwIDAtNDh6Il0KICAgIH07CiAgICBmYVNoaWVsZERvZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaGllbGQtZG9nIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1NzMiLCAiTTI2OS40IDIuOUMyNjUuMiAxIDI2MC43IDAgMjU2IDBzLTkuMiAxLTEzLjQgMi45TDU0LjMgODIuOGMtMjIgOS4zLTM4LjQgMzEtMzguMyA1Ny4yIC41IDk5LjIgNDEuMyAyODAuNyAyMTMuNiAzNjMuMiAxNi43IDggMzYuMSA4IDUyLjggMCAxNzIuNC04Mi41IDIxMy4yLTI2NCAyMTMuNi0zNjMuMiAuMS0yNi4yLTE2LjMtNDcuOS0zOC4zLTU3LjJMMjY5LjQgMi45ek0xNjAuOSAyODYuMmM0LjggMS4yIDkuOSAxLjggMTUuMSAxLjggMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC02NCA0NC4yIDBjMTIuMSAwIDIzLjIgNi44IDI4LjYgMTcuN2w3LjIgMTQuMyA2NCAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgNDQuMi0zNS44IDgwLTgwIDgwbC00OCAwIDAgNTAuN2MwIDcuMy01LjkgMTMuMy0xMy4zIDEzLjMtMS44IDAtMy42LS40LTUuMi0xLjFsLTk4LjctNDIuM2MtNi42LTIuOC0xMC44LTkuMy0xMC44LTE2LjQgMC0yLjggLjYtNS41IDEuOS04bDE1LTMwek0xNjAgMTYwbDQ4IDAgMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTQ4YzAtOC44IDcuMi0xNiAxNi0xNnptMTI4IDQ4YTE2IDE2IDAgMSAwIC0zMiAwIDE2IDE2IDAgMSAwIDMyIDB6Il0KICAgIH07CiAgICBmYUdyZWF0ZXJUaGFuRXF1YWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ3JlYXRlci10aGFuLWVxdWFsIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY1MzIiLCAiTTIxLjkgOTQuNEM1LjEgODguOC0zLjkgNzAuNiAxLjcgNTMuOVMyNS40IDI4LjEgNDIuMSAzMy42bDM4NCAxMjhDNDM5LjIgMTY2IDQ0OCAxNzguMiA0NDggMTkycy04LjggMjYtMjEuOSAzMC40bC0zODQgMTI4Yy0xNi44IDUuNi0zNC45LTMuNS00MC41LTIwLjJzMy41LTM0LjkgMjAuMi00MC41TDMxNC44IDE5MiAyMS45IDk0LjR6TTQxNiA0MTZjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgNDgwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDM4NCAweiJdCiAgICB9OwogICAgZmFFbnZlbG9wZU9wZW4yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImVudmVsb3BlLW9wZW4iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MjEzNV0sICJmMmI2IiwgIk02NC40IDE3NS44TDI1NiAzMy45IDQ0Ny42IDE3NS44IDI4OS41IDI5M2MtOS43IDcuMi0yMS40IDExLTMzLjUgMTFzLTIzLjgtMy45LTMzLjUtMTFMNjQuNCAxNzUuOHpNMjU2LTMyYy0xMi4xIDAtMjMuOCAzLjktMzMuNSAxMUwyNS45IDEyNC43QzkuNiAxMzYuOCAwIDE1NS44IDAgMTc2LjFMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yMzkuOWMwLTIwLjMtOS42LTM5LjQtMjUuOS01MS40TDI4OS41LTIxYy05LjctNy4yLTIxLjQtMTEtMzMuNS0xMXoiXQogICAgfTsKICAgIGZhTW91bmQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibW91bmQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTUyZCIsICJNMTEyLjQgMTc5LjJDMTQyIDEyNy43IDE5Ni44IDk2IDI1Ni4yIDk2czExNC4yIDMxLjcgMTQzLjkgODMuMkw1MDguNyAzNjhjMTIuMyAyMS4zLTMuMSA0OC0yNy43IDQ4TDMxLjUgNDE2Yy0yNC42IDAtNDAtMjYuNi0yNy43LTQ4TDExMi40IDE3OS4yeiJdCiAgICB9OwogICAgZmFWb2ljZW1haWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidm9pY2VtYWlsIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY4OTciLCAiTTE0NCAxNjBhODAgODAgMCAxIDEgMCAxNjAgODAgODAgMCAxIDEgMC0xNjB6TTI2My44IDMyMGMxNS4zLTIyLjkgMjQuMi01MC40IDI0LjItODAgMC03OS41LTY0LjUtMTQ0LTE0NC0xNDRTMCAxNjAuNSAwIDI0MCA2NC41IDM4NCAxNDQgMzg0bDM1MiAwYzc5LjUgMCAxNDQtNjQuNSAxNDQtMTQ0UzU3NS41IDk2IDQ5NiA5NiAzNTIgMTYwLjUgMzUyIDI0MGMwIDI5LjYgOC45IDU3LjEgMjQuMiA4MGwtMTEyLjUgMHpNNDk2IDE2MGE4MCA4MCAwIDEgMSAwIDE2MCA4MCA4MCAwIDEgMSAwLTE2MHoiXQogICAgfTsKICAgIGZhVmVzdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ2ZXN0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImUwODUiLCAiTTIwMCA0NjRsMC0xNzAuMWMwLTMuOS0uNS03LjgtMS40LTExLjZMMTQ0LjQgNjUuNEMxNjIuMSA3Ny4yIDE4OC4yIDg4IDIyNCA4OHM2MS45LTEwLjggNzkuNi0yMi42TDI0OS40IDI4Mi4zYy0xIDMuOC0xLjQgNy43LTEuNCAxMS42TDI0OCA0NjRjMCAyNi41IDIxLjUgNDggNDggNDhsMTA0IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0xOTMuNWMwLTkuNS0yLjgtMTguNy04LjEtMjYuNmwtNDcuOS03MS44Yy01LjMtNy45LTguMS0xNy4xLTguMS0yNi42TDM4NCA0OGMwLTI2LjUtMjEuNS00OC00OC00OGwtMy41IDBjLS4zIDAtLjYgMC0xIDAtLjYgMC0xLjIgMC0xLjggMC0xOC44IDAtMzQuMSA5LjctNDQuMSAxOC44LTkuMyA4LjQtMjguNSAyMS4yLTYxLjcgMjEuMnMtNTIuNC0xMi44LTYxLjctMjEuMmMtMTAtOS4xLTI1LjMtMTguOC00NC4xLTE4LjgtLjYgMC0xLjIgMC0xLjggMC0uMyAwLS42IDAtMSAwTDExMiAwQzg1LjUgMCA2NCAyMS41IDY0IDQ4bDAgOTcuNWMwIDkuNS0yLjggMTguNy04LjEgMjYuNkw4LjEgMjQzLjlDMi44IDI1MS44IDAgMjYxLjEgMCAyNzAuNUwwIDQ2NGMwIDI2LjUgMjEuNSA0OCA0OCA0OGwxMDQgMGMyNi41IDAgNDgtMjEuNSA0OC00OHoiXQogICAgfTsKICAgIGZhQXVkaW9EZXNjcmlwdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhdWRpby1kZXNjcmlwdGlvbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjllIiwgIk0wIDEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGwzODQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI1NmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0NDhjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTI4em05NiA5NmwwIDEwNGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMjQgNDggMCAwIDI0YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xMDRjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTE2IDBjLTM1LjMgMC02NCAyOC43LTY0IDY0em00OCAzMmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmwxNiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyLTQ4IDB6bTE1Mi05NmMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAxNDRjMCAxMy4zIDEwLjcgMjQgMjQgMjRsNDggMGMzOS44IDAgNzItMzIuMiA3Mi03MmwwLTQ4YzAtMzkuOC0zMi4yLTcyLTcyLTcybC00OCAwem00OCAxNDRsLTI0IDAgMC05NiAyNCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgNDhjMCAxMy4zLTEwLjcgMjQtMjQgMjR6Il0KICAgIH07CiAgICBmYVcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzExOV0sICI1NyIsICJNMjAuOCAzNGMxNi41LTYuMiAzNSAyLjIgNDEuMiAxOC43TDE3Mi4yIDM0Ni43IDI1Ny4zIDU1YzQtMTMuNyAxNi41LTIzIDMwLjctMjNzMjYuNyA5LjQgMzAuNyAyM0w0MDMuOCAzNDYuNyA1MTQgNTIuOGM2LjItMTYuNSAyNC42LTI0LjkgNDEuMi0xOC43UzU4MC4yIDU4LjcgNTc0IDc1LjJsLTE0NCAzODRjLTQuOCAxMi45LTE3LjQgMjEuMy0zMS4yIDIwLjdzLTI1LjctOS44LTI5LjUtMjNMMjg4IDE3OC4zIDIwNi43IDQ1N2MtMy45IDEzLjItMTUuOCAyMi41LTI5LjUgMjNzLTI2LjMtNy44LTMxLjItMjAuN0wyIDc1LjJDLTQuMiA1OC43IDQuMiA0MC4yIDIwLjggMzR6Il0KICAgIH07CiAgICBmYUV5ZURyb3BwZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZXllLWRyb3BwZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiZXllLWRyb3BwZXItZW1wdHkiLCAiZXllZHJvcHBlciJdLCAiZjFmYiIsICJNMzQxLjYgMjkuMmwtMTAxLjYgMTAxLjYtOS40LTkuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNsMTYwIDE2MGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zbC05LjQtOS40IDEwMS42LTEwMS42YzM5LTM5IDM5LTEwMi4yIDAtMTQxLjFzLTEwMi4yLTM5LTE0MS4xIDB6TTU1LjQgMzIzLjNjLTE1IDE1LTIzLjQgMzUuNC0yMy40IDU2LjZsMCA0Mi40LTI2LjYgMzkuOWMtOC41IDEyLjctNi44IDI5LjYgNCA0MC40czI3LjcgMTIuNSA0MC40IDRsMzkuOS0yNi42IDQyLjQgMGMyMS4yIDAgNDEuNi04LjQgNTYuNi0yMy40bDEwOS40LTEwOS40LTQ1LjMtNDUuMy0xMDkuNCAxMDkuNGMtMyAzLTcuMSA0LjctMTEuMyA0LjdsLTM2LjEgMCAwLTM2LjFjMC00LjIgMS43LTguMyA0LjctMTEuM2wxMDkuNC0xMDkuNC00NS4zLTQ1LjMtMTA5LjQgMTA5LjR6Il0KICAgIH07CiAgICBmYUV5ZURyb3BwZXJFbXB0eSA9IGZhRXllRHJvcHBlcjsKICAgIGZhRXllZHJvcHBlciA9IGZhRXllRHJvcHBlcjsKICAgIGZhQ2lyY2xlWG1hcmsyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS14bWFyayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYxNTMyLCAidGltZXMtY2lyY2xlIiwgInhtYXJrLWNpcmNsZSJdLCAiZjA1NyIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTE2NyAxNjdjOS40LTkuNCAyNC42LTkuNCAzMy45IDBsNTUgNTUgNTUtNTVjOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45bC01NSA1NSA1NSA1NWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwbC01NS01NS01NSA1NWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWw1NS01NS01NS01NWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjl6Il0KICAgIH07CiAgICBmYVRpbWVzQ2lyY2xlMiA9IGZhQ2lyY2xlWG1hcmsyOwogICAgZmFYbWFya0NpcmNsZTIgPSBmYUNpcmNsZVhtYXJrMjsKICAgIGZhVHJhaWxlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cmFpbGVyIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImUwNDEiLCAiTTMyIDk2YzAtMzUuMyAyOC43LTY0IDY0LTY0bDM4NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjU2IDY0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTI5Ni40IDBjLjIgMi42IC40IDUuMyAuNCA4IDAgNDguNi0zOS40IDg4LTg4IDg4cy04OC0zOS40LTg4LTg4YzAtMi43IC4xLTUuNCAuNC04TDk2IDQxNmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMzIgOTZ6bTQwOCAxNmMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAxNjBjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTE2MGMwLTEzLjMtMTAuNy0yNC0yNC0yNHpNMTEyIDEzNmwwIDE2MGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTYwYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0em0xNzYtMjRjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMTYwYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xNjBjMC0xMy4zLTEwLjctMjQtMjQtMjR6TTI2NCA0MjRhNDAgNDAgMCAxIDAgLTgwIDAgNDAgNDAgMCAxIDAgODAgMHoiXQogICAgfTsKICAgIGZhVHVya2lzaExpcmFTaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInR1cmtpc2gtbGlyYS1zaWduIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInRyeSIsICJ0dXJraXNoLWxpcmEiXSwgImUyYmIiLCAiTTE2MCAzMmMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDQzLjYgMTIxLjQtMzQuN2MxMi43LTMuNiAyNiAzLjcgMjkuNyAxNi41cy0zLjcgMjYtMTYuNSAyOS43bC0xMzQuNiAzOC41IDAgNDYuMSAxMjEuNC0zNC43YzEyLjctMy42IDI2IDMuNyAyOS43IDE2LjVzLTMuNyAyNi0xNi41IDI5LjdsLTEzNC42IDM4LjUgMCAxNjIuNSA3MiAwYzUzIDAgOTYtNDMgOTYtOTYgMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmMwIDg4LjQtNzEuNiAxNjAtMTYwIDE2MGwtMTA0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTc2LjItMjUuNCA3LjNjLTEyLjcgMy42LTI2LTMuNy0yOS43LTE2LjVzMy43LTI2IDE2LjUtMjkuN2wzOC42LTExIDAtNDYuMS0yNS40IDcuM2MtMTIuNyAzLjYtMjYtMy43LTI5LjctMTYuNXMzLjctMjYgMTYuNS0yOS43bDM4LjYtMTEgMC02MS45YzAtMTcuNyAxNC4zLTMyIDMyLTMyeiJdCiAgICB9OwogICAgZmFUcnkgPSBmYVR1cmtpc2hMaXJhU2lnbjsKICAgIGZhVHVya2lzaExpcmEgPSBmYVR1cmtpc2hMaXJhU2lnbjsKICAgIGZhVm9sY2FubyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ2b2xjYW5vIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3NzU1XSwgImY3NzAiLCAiTTE2MCAxNDRjLTM1LjMgMC02NC0yOC43LTY0LTY0czI4LjctNjQgNjQtNjRjMTUuNyAwIDMwIDUuNiA0MS4yIDE1IDExLjItMTguNiAzMS42LTMxIDU0LjgtMzFzNDMuNiAxMi40IDU0LjggMzFjMTEuMS05LjQgMjUuNS0xNSA0MS4yLTE1IDM1LjMgMCA2NCAyOC43IDY0IDY0cy0yOC43IDY0LTY0IDY0Yy0xNC43IDAtMjguMy01LTM5LjEtMTMuM2wtMzIgNDhDMjc1LjMgMTg3IDI2NiAxOTIgMjU2IDE5MnMtMTkuMy01LTI0LjktMTMuM2wtMzItNDhDMTg4LjMgMTM5IDE3NC43IDE0NCAxNjAgMTQ0ek0xNDQgMzUybDQ4LjQtMjQuMmMxMC4yLTUuMSAyMS42LTcuOCAzMy03LjggMTkuNiAwIDM4LjQgNy44IDUyLjIgMjEuNmwzMi41IDMyLjVjNi4zIDYuMyAxNC45IDkuOSAyMy44IDkuOSAxMS4zIDAgMjEuOC01LjYgMjgtMTVsOS43LTE0LjYtNTktNjYuM2MtOS4xLTEwLjItMjIuMi0xNi4xLTM1LjktMTYuMWwtNDEuOCAwYy0xMy43IDAtMjYuOCA1LjktMzUuOSAxNi4xbC01OS45IDY3LjQgNC43LTMuNXptMTkuNC05NS44YzE4LjItMjAuNSA0NC4zLTMyLjIgNzEuOC0zMi4ybDQxLjggMGMyNy40IDAgNTMuNSAxMS43IDcxLjggMzIuMmwxNTAuMiAxNjljOC41IDkuNSAxMy4yIDIxLjkgMTMuMiAzNC43IDAgMjguOC0yMy40IDUyLjItNTIuMiA1Mi4yTDUyLjIgNTEyQzIzLjQgNTEyIDAgNDg4LjYgMCA0NTkuOCAwIDQ0Ny4xIDQuNyA0MzQuNyAxMy4yIDQyNS4ybDE1MC4yLTE2OXoiXQogICAgfTsKICAgIGZhV2FuZFNwYXJrbGVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIndhbmQtc3BhcmtsZXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjcyYiIsICJNNDY0IDYuMWM5LjUtOC41IDI0LTguMSAzMyAuOWw4IDhjOSA5IDkuNCAyMy41IC45IDMzbC04NS44IDk1LjljLTIuNiAyLjktNC4xIDYuNy00LjEgMTAuN2wwIDIxLjRjMCA4LjgtNy4yIDE2LTE2IDE2bC0xNS44IDBjLTQuNiAwLTguOSAxLjktMTEuOSA1LjNMMTAwLjcgNTAwLjljLTYuMyA3LjEtMTUuMyAxMS4xLTI0LjggMTEuMS04LjggMC0xNy4zLTMuNS0yMy41LTkuOEw5LjcgNDU5LjdjLTYuMi02LjItOS43LTE0LjctOS43LTIzLjUgMC05LjUgNC0xOC41IDExLjEtMjQuOGwxMTEuNi05OS44YzMuNC0zIDUuMy03LjQgNS4zLTExLjlsMC0yNy42YzAtOC44IDcuMi0xNiAxNi0xNmwzNC42IDBjMy45IDAgNy43LTEuNSAxMC43LTQuMUw0NjQgNi4xek00MzIgMjg4YzMuNiAwIDYuNyAyLjQgNy43IDUuOGwxNC44IDUxLjcgNTEuNyAxNC44YzMuNCAxIDUuOCA0LjEgNS44IDcuN3MtMi40IDYuNy01LjggNy43bC01MS43IDE0LjgtMTQuOCA1MS43Yy0xIDMuNC00LjEgNS44LTcuNyA1LjhzLTYuNy0yLjQtNy43LTUuOGwtMTQuOC01MS43LTUxLjctMTQuOGMtMy40LTEtNS44LTQuMS01LjgtNy43czIuNC02LjcgNS44LTcuN2w1MS43LTE0LjggMTQuOC01MS43YzEtMy40IDQuMS01LjggNy43LTUuOHpNODcuNyA2OS44bDE0LjggNTEuNyA1MS43IDE0LjhjMy40IDEgNS44IDQuMSA1LjggNy43cy0yLjQgNi43LTUuOCA3LjdsLTUxLjcgMTQuOC0xNC44IDUxLjdjLTEgMy40LTQuMSA1LjgtNy43IDUuOHMtNi43LTIuNC03LjctNS44TDU3LjUgMTY2LjUgNS44IDE1MS43Yy0zLjQtMS01LjgtNC4xLTUuOC03LjdzMi40LTYuNyA1LjgtNy43bDUxLjctMTQuOCAxNC44LTUxLjdjMS0zLjQgNC4xLTUuOCA3LjctNS44czYuNyAyLjQgNy43IDUuOHpNMjA4IDBjMy43IDAgNi45IDIuNSA3LjggNi4xbDYuOCAyNy4zIDI3LjMgNi44YzMuNiAuOSA2LjEgNC4xIDYuMSA3LjhzLTIuNSA2LjktNi4xIDcuOGwtMjcuMyA2LjgtNi44IDI3LjNjLS45IDMuNi00LjEgNi4xLTcuOCA2LjFzLTYuOS0yLjUtNy44LTYuMWwtNi44LTI3LjMtMjcuMy02LjhjLTMuNi0uOS02LjEtNC4xLTYuMS03LjhzMi41LTYuOSA2LjEtNy44bDI3LjMtNi44IDYuOC0yNy4zYy45LTMuNiA0LjEtNi4xIDcuOC02LjF6Il0KICAgIH07CiAgICBmYU1pY3JvcGhvbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWljcm9waG9uZSIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMTMwIiwgIk0xOTIgMEMxMzkgMCA5NiA0MyA5NiA5NmwwIDEyOGMwIDUzIDQzIDk2IDk2IDk2czk2LTQzIDk2LTk2bDAtMTI4YzAtNTMtNDMtOTYtOTYtOTZ6TTQ4IDE4NGMwLTEzLjMtMTAuNy0yNC0yNC0yNFMwIDE3MC43IDAgMTg0bDAgNDBjMCA5Ny45IDczLjMgMTc4LjcgMTY4IDE5MC41bDAgNDkuNS00OCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDE0NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC00OCAwIDAtNDkuNWM5NC43LTExLjggMTY4LTkyLjYgMTY4LTE5MC41bDAtNDBjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCA0MGMwIDc5LjUtNjQuNSAxNDQtMTQ0IDE0NFM0OCAzMDMuNSA0OCAyMjRsMC00MHoiXQogICAgfTsKICAgIGZhQ3Jvd24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY3Jvd24iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgwODFdLCAiZjUyMSIsICJNMzEzIDg3LjJjOS4yLTcuMyAxNS0xOC42IDE1LTMxLjIgMC0yMi4xLTE3LjktNDAtNDAtNDBzLTQwIDE3LjktNDAgNDBjMCAxMi42IDUuOSAyMy45IDE1IDMxLjJMMTk0LjYgMTk0LjhjLTEwIDE1LjctMzEuMyAxOS42LTQ2LjIgOC40TDg4LjkgMTU4LjdjNC41LTYuNCA3LjEtMTQuMyA3LjEtMjIuNyAwLTIyLjEtMTcuOS00MC00MC00MHMtNDAgMTcuOS00MCA0MGMwIDIxLjggMTcuNSAzOS42IDM5LjIgNDBMODcuOCAzOTMuNWM0LjcgMzEuMyAzMS42IDU0LjUgNjMuMyA1NC41bDI3My44IDBjMzEuNyAwIDU4LjYtMjMuMiA2My4zLTU0LjVMNTIwLjggMTc2YzIxLjctLjQgMzkuMi0xOC4yIDM5LjItNDAgMC0yMi4xLTE3LjktNDAtNDAtNDBzLTQwIDE3LjktNDAgNDBjMCA4LjQgMi42IDE2LjMgNy4xIDIyLjdsLTU5LjQgNDQuNmMtMTQuOSAxMS4yLTM2LjIgNy4zLTQ2LjItOC40TDMxMyA4Ny4yeiJdCiAgICB9OwogICAgZmFUZW50QXJyb3dUdXJuTGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0ZW50LWFycm93LXR1cm4tbGVmdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTgwIiwgIk0tLjUgMTEzbDcyIDcyYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtMzEtMzEgMzUwLjEgMGMyMi4xIDAgNDAgMTcuOSA0MCA0MGwwIDI0YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0yNGMwLTQ4LjYtMzkuNC04OC04OC04OGwtMzUwLjEgMCAzMS0zMWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOVM4MC45LTIuMyA3MS41IDdMLS41IDc5Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXpNNjAuMyAyOTIuNkwzNy4xIDQ3NmMtMi40IDE5LjEgMTIuNSAzNiAzMS43IDM2bDE1NC41IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0xMTcuNGMwLTUuOSA0LjctMTAuNiAxMC42LTEwLjYgNCAwIDcuNyAyLjMgOS41IDUuOWw2OC4yIDEzNi41YzUuNCAxMC44IDE2LjUgMTcuNyAyOC42IDE3LjdsNzEuOSAwYzE5LjMgMCAzNC4yLTE2LjkgMzEuNy0zNkw0NTIuNyAyOTIuN2MtMS4yLTkuNy02LjktMTguNC0xNS4zLTIzLjRMMjcxLjkgMTY5LjljLTEwLjItNi4xLTIyLjktNi4xLTMzLjEgLjFMNzUuNCAyNjkuM2MtOC4zIDUuMS0xMy45IDEzLjctMTUuMSAyMy4zeiJdCiAgICB9OwogICAgZmFUcnVja0Zhc3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHJ1Y2stZmFzdCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWyJzaGlwcGluZy1mYXN0Il0sICJmNDhiIiwgIk02NCA5NmMwLTM1LjMgMjguNy02NCA2NC02NGwyODggMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyIDUwLjcgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN0w2MjEuMyAxOTJjMTIgMTIgMTguNyAyOC4zIDE4LjcgNDUuM0w2NDAgMzg0YzAgMzUuMy0yOC43IDY0LTY0IDY0bC0zLjMgMGMtMTAuNCAzNi45LTQ0LjQgNjQtODQuNyA2NHMtNzQuMi0yNy4xLTg0LjctNjRsLTEwMi42IDBjLTEwLjQgMzYuOS00NC40IDY0LTg0LjcgNjRzLTc0LjItMjcuMS04NC43LTY0bC0zLjMgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC00OC00MCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDExMiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0TDI0IDI0MGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxNzYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNEwyNCAxNDRjLTEzLjMgMC0yNC0xMC43LTI0LTI0UzEwLjcgOTYgMjQgOTZsNDAgMHpNNTc2IDI4OGwwLTUwLjctNDUuMy00NS4zLTUwLjcgMCAwIDk2IDk2IDB6TTI1NiA0MjRhNDAgNDAgMCAxIDAgLTgwIDAgNDAgNDAgMCAxIDAgODAgMHptMjMyIDQwYTQwIDQwIDAgMSAwIDAtODAgNDAgNDAgMCAxIDAgMCA4MHoiXQogICAgfTsKICAgIGZhU2hpcHBpbmdGYXN0ID0gZmFUcnVja0Zhc3Q7CiAgICBmYVVzZXJQZW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlci1wZW4iLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsidXNlci1lZGl0Il0sICJmNGZmIiwgIk0yNTYuMSAyNDhhMTIwIDEyMCAwIDEgMCAwLTI0MCAxMjAgMTIwIDAgMSAwIDAgMjQwem0tMjkuNyA1NmMtOTguNSAwLTE3OC4zIDc5LjgtMTc4LjMgMTc4LjMgMCAxNi40IDEzLjMgMjkuNyAyOS43IDI5LjdsMTk2LjUgMCAxMC45LTU0LjVjNC4zLTIxLjcgMTUtNDEuNiAzMC42LTU3LjJsNjcuMy02Ny4zYy0yOC0xOC4zLTYxLjQtMjguOS05Ny40LTI4LjlsLTU5LjQgMHpNMzMyLjMgNDY2LjlsLTExLjkgNTkuNmMtLjIgLjktLjMgMS45LS4zIDIuOSAwIDggNi41IDE0LjYgMTQuNiAxNC42IDEgMCAxLjktLjEgMi45LS4zbDU5LjYtMTEuOWMxMi40LTIuNSAyMy44LTguNiAzMi43LTE3LjVsMTE4LjktMTE4LjktODAtODAtMTE4LjkgMTE4LjljLTguOSA4LjktMTUgMjAuMy0xNy41IDMyLjd6bTI2Ny44LTEyM2MyMi4xLTIyLjEgMjIuMS01Ny45IDAtODBzLTU3LjktMjIuMS04MCAwbC0yOC44IDI4LjggODAgODAgMjguOC0yOC44eiJdCiAgICB9OwogICAgZmFVc2VyRWRpdCA9IGZhVXNlclBlbjsKICAgIGZhVXNlckNsb2NrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXItY2xvY2siLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjRmZCIsICJNMjI0IDhhMTIwIDEyMCAwIDEgMSAwIDI0MCAxMjAgMTIwIDAgMSAxIDAtMjQwek0xOTQuMyAzMDRsNTkuNCAwYzMuOSAwIDcuOSAuMSAxMS44IC40LTE2LjIgMjguMi0yNS41IDYwLjgtMjUuNSA5NS42IDAgNDEuOCAxMy40IDgwLjUgMzYgMTEyTDQ1LjcgNTEyQzI5LjMgNTEyIDE2IDQ5OC43IDE2IDQ4Mi4zIDE2IDM4My44IDk1LjggMzA0IDE5NC4zIDMwNHpNMjg4IDQwMGExNDQgMTQ0IDAgMSAxIDI4OCAwIDE0NCAxNDQgMCAxIDEgLTI4OCAwem0xNDQtODBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDY0YzAgOC44IDcuMiAxNiAxNiAxNmw0OCAwYzguOCAwIDE2LTcuMiAxNi0xNnMtNy4yLTE2LTE2LTE2bC0zMiAwIDAtNDhjMC04LjgtNy4yLTE2LTE2LTE2eiJdCiAgICB9OwogICAgZmFTaG93ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2hvd2VyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NzAzXSwgImYyY2MiLCAiTTY0IDEzMS45YzAtMTkuOCAxNi4xLTM1LjkgMzUuOS0zNS45IDkuNSAwIDE4LjYgMy44IDI1LjQgMTAuNWwxNi4yIDE2LjJjLTIxIDM4LjktMTcuNCA4Ny41IDEwLjkgMTIzTDE1MSAyNDdjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMEwzNDUgMTIxYzkuNC05LjQgOS40LTI0LjYgMC0zMy45cy0yNC42LTkuNC0zMy45IDBsLTEuMyAxLjNjLTM1LjUtMjguMy04NC4xLTMxLjktMTIzLTEwLjlMMTcwLjUgNjEuM0MxNTEuOCA0Mi41IDEyNi40IDMyIDk5LjkgMzIgNDQuNyAzMiAwIDc2LjcgMCAxMzEuOUwwIDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzE2LjF6TTI1NiAzNTJhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0em02NCA2NGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem0wLTEyOGEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6bTY0IDY0YTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6bTAtMTI4YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHptNjQgNjRhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHptMzItMzJhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFTcXVhcmVDYXJldFVwMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtY2FyZXQtdXAiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiY2FyZXQtc3F1YXJlLXVwIl0sICJmMTUxIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyek0yMjQgMTYwYzYuNyAwIDEzIDIuOCAxNy42IDcuN2wxMDQgMTEyYzYuNSA3IDguMiAxNy4yIDQuNCAyNS45UzMzNy41IDMyMCAzMjggMzIwbC0yMDggMGMtOS41IDAtMTguMi01LjctMjItMTQuNHMtMi4xLTE4LjkgNC40LTI1LjlsMTA0LTExMmM0LjUtNC45IDEwLjktNy43IDE3LjYtNy43eiJdCiAgICB9OwogICAgZmFDYXJldFNxdWFyZVVwMiA9IGZhU3F1YXJlQ2FyZXRVcDI7CiAgICBmYU1hcExvY2F0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hcC1sb2NhdGlvbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWyJtYXAtbWFya2VkIl0sICJmNTlmIiwgIk01NzYgNDhjMC0xMS4xLTUuNy0yMS40LTE1LjItMjcuMnMtMjEuMi02LjQtMzEuMS0xLjRMNDEzLjUgNzcuNSAyMzQuMSAxNy42Yy04LjEtMi43LTE2LjgtMi4xLTI0LjQgMS43bC0xMjggNjRDNzAuOCA4OC44IDY0IDk5LjkgNjQgMTEybDAgMzUyYzAgMTEuMSA1LjcgMjEuNCAxNS4yIDI3LjJzMjEuMiA2LjQgMzEuMSAxLjRsMTE2LjEtNTguMSAxNzMuMyA1Ny44Yy00LjMtNi40LTguNS0xMy4xLTEyLjYtMTkuOS0xMS0xOC4zLTIxLjktMzkuMy0zMC02MS44bC0xMDEuMi0zMy43IDAtMjg0LjUgMTI4IDQyLjcgMCA5OS4zYzMxLTM1LjggNzctNTguNCAxMjgtNTguNCAyMi42IDAgNDQuMiA0LjQgNjQgMTIuNUw1NzYgNDh6TTM5MiAzNDEuOWMwIDY4LjkgNjQuMSAxNTAuNCA5OC42IDE4OS4zIDExLjYgMTMgMzEuMyAxMyA0Mi45IDAgMzQuNS0zOC45IDk4LjYtMTIwLjQgOTguNi0xODkuMyAwLTY1LjEtNTMuNy0xMTcuOS0xMjAtMTE3LjlTMzkyIDI3Ni44IDM5MiAzNDEuOXoiXQogICAgfTsKICAgIGZhTWFwTWFya2VkID0gZmFNYXBMb2NhdGlvbjsKICAgIGZhUGVuRmFuY3kgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVuLWZhbmN5IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4Mzk1LCAxMDAwMl0sICJmNWFjIiwgIk0zNzMuNSAyNy4xYzE1LTE3LjIgMzYuNy0yNy4xIDU5LjYtMjcuMSA0My42IDAgNzkgMzUuNCA3OSA3OSAwIDIyLjgtOS45IDQ0LjYtMjcuMSA1OS42TDI4My43IDMxMy44IDI3MyAzMDMgMjA5IDIzOSAxOTguMiAyMjguMyAzNzMuNSAyNy4xek0xNjEuMSAyNTlDMTYyIDI2MCAxODggMjg2IDIzOSAzMzdsMTMuOSAxMy45LTE3LjEgNzQuMmMtMy45IDE3LjEtMTYuOSAzMC43LTMzLjggMzUuNGwtMTY5LjggNDcuNSA5Mi4zLTkyLjNjMS4yIC4xIDIuMyAuMiAzLjUgLjIgMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzItMzIgMTQuMy0zMiAzMmMwIDEuMiAuMSAyLjQgLjIgMy41TDMuOSA0NzkuOCA1MS41IDMxMGM0LjctMTYuOSAxOC4zLTI5LjkgMzUuNC0zMy44TDE2MS4xIDI1OXoiXQogICAgfTsKICAgIGZhRXVyb1NpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZXVyby1zaWduIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbODM2NCwgImV1ciIsICJldXJvIl0sICJmMTUzIiwgIk03My4zIDE5MkMxMDAuOCA5OS41IDE4Ni41IDMyIDI4OCAzMmw2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC02NCAwYy02NS42IDAtMTIyIDM5LjUtMTQ2LjcgOTZMMjcyIDE5MmMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTQzLjIgMGMtLjUgNS4zLS44IDEwLjYtLjggMTZzLjMgMTAuNyAuOCAxNkwyNzIgMjcyYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xMzAuNyAwYzI0LjcgNTYuNSA4MS4xIDk2IDE0Ni43IDk2bDY0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTY0IDBjLTEwMS41IDAtMTg3LjItNjcuNS0yMTQuNy0xNjBMNDAgMzIwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDI0LjYgMGMtLjctMTAuNS0uNy0yMS41IDAtMzJMNDAgMjQwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDMzLjMgMHoiXQogICAgfTsKICAgIGZhRXVyID0gZmFFdXJvU2lnbjsKICAgIGZhRXVybyA9IGZhRXVyb1NpZ247CiAgICBmYUhvdXNlQ2lyY2xlWG1hcmsgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG91c2UtY2lyY2xlLXhtYXJrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1MGIiLCAiTTQ5NiA1NDRhMTQ0IDE0NCAwIDEgMSAwLTI4OCAxNDQgMTQ0IDAgMSAxIDAgMjg4ek0yNjguNiA2LjVjMTIuMi05LjMgMjkuNy04LjcgNDEuMiAybDIxNy42IDIwMmMtMTAuMi0xLjctMjAuNy0yLjYtMzEuMy0yLjYtNzguNiAwLTE0Ni4yIDQ3LjItMTc1LjkgMTE0LjgtNS0xLjgtMTAuNS0yLjgtMTYuMS0yLjhsLTMyIDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgOTYgOTAuOSAwYzYuMSAxNy4zIDE0LjYgMzMuNCAyNS4yIDQ4TDE0NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMTc2LTE2IDBjLTEzLjIgMC0yNS04LjEtMjkuOC0yMC4zcy0xLjYtMjYuMiA4LTM1LjFsMjI0LTIwOCAyLjQtMnpNNTU1LjMgMzQwLjdjLTYuMi02LjItMTYuNC02LjItMjIuNiAwbC0zNi43IDM2LjctMzYuNy0zNi43Yy02LjItNi4yLTE2LjQtNi4yLTIyLjYgMHMtNi4yIDE2LjQgMCAyMi42bDM2LjcgMzYuNy0zNi43IDM2LjdjLTYuMiA2LjItNi4yIDE2LjQgMCAyMi42czE2LjQgNi4yIDIyLjYgMGwzNi43LTM2LjcgMzYuNyAzNi43YzYuMiA2LjIgMTYuNCA2LjIgMjIuNiAwczYuMi0xNi40IDAtMjIuNmwtMzYuNy0zNi43IDM2LjctMzYuN2M2LjItNi4yIDYuMi0xNi40IDAtMjIuNnoiXQogICAgfTsKICAgIGZhTGlyYVNpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGlyYS1zaWduIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbODM1Nl0sICJmMTk1IiwgIk04NC45IDI1NmwtMjguNCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDExLjYgMEM1My4yIDEyNC43IDExNi44IDQyIDIwNy42IDQybDguMiAwYzMzLjYgMCA2Ni4yIDExLjMgOTIuNSAzMi4ybDE2LjEgMTIuN2MxMy45IDExIDE2LjIgMzEuMSA1LjIgNDVzLTMxLjEgMTYuMi00NSA1LjJsLTE2LjEtMTIuN2MtMTUtMTEuOS0zMy42LTE4LjQtNTIuOC0xOC40bC04LjIgMGMtNTMuOCAwLTkwLjEgNTIuOS03My41IDEwMmwxNjIuNCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNDUuMSAwYzIuMyAxMC42IDMuNiAyMS4zIDMuOSAzMmwxNDEuMiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0TDE1MCAzMzZjLTQuOCAxOC42LTEyLjYgMzYuNS0yMy42IDUyLjlsLTE4LjEgMjcuMSAyMTIuMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0yNzIgMGMtMTEuOCAwLTIyLjYtNi41LTI4LjItMTYuOXMtNS0yMyAxLjYtMzIuOWw1MS4yLTc2LjhjMy43LTUuNiA2LjktMTEuNCA5LjQtMTcuNGwtMjYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwzNC44IDBjLS41LTEwLjgtMi42LTIxLjYtNi40LTMyeiJdCiAgICB9OwogICAgZmFZZW5TaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInllbi1zaWduIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTY1LCAiY255IiwgImpweSIsICJybWIiLCAieWVuIl0sICJmMTU3IiwgIk03NC45IDQ2LjdjLTkuNi0xNC45LTI5LjQtMTkuMi00NC4yLTkuNlMxMS41IDY2LjQgMjEuMSA4MS4zTDE0My43IDI3MiA4OCAyNzJjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNzIgMCAwIDMyLTcyIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNzIgMCAwIDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC00OCA3MiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC03MiAwIDAtMzIgNzIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNTUuNyAwIDEyMi42LTE5MC43YzkuNi0xNC45IDUuMy0zNC43LTkuNi00NC4ycy0zNC43LTUuMy00NC4yIDkuNkwxOTIgMjI4LjggNzQuOSA0Ni43eiJdCiAgICB9OwogICAgZmFDbnkgPSBmYVllblNpZ247CiAgICBmYUpweSA9IGZhWWVuU2lnbjsKICAgIGZhUm1iID0gZmFZZW5TaWduOwogICAgZmFZZW4gPSBmYVllblNpZ247CiAgICBmYUJveE9wZW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm94LW9wZW4iLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjQ5ZSIsICJNNTYwLjMgMjM3LjJjMTAuNCAxMS44IDI4LjMgMTQuNCA0MS44IDUuNSAxNC43LTkuOCAxOC43LTI5LjcgOC45LTQ0LjRsLTQ4LTcyYy0yLjgtNC4yLTYuNi03LjctMTEuMS0xMC4yTDM1MS40IDQuN2MtMTkuMy0xMC43LTQyLjgtMTAuNy02Mi4yIDBMODguOCAxMTZjLTUuNCAzLTkuNyA3LjQtMTIuNiAxMi44TDI3LjcgMjE4LjdjLTEyLjYgMjMuNC0zLjggNTIuNSAxOS42IDY1LjFsMzMgMTcuNyAwIDUzLjNjMCAyMyAxMi40IDQ0LjMgMzIuNCA1NS43bDE3NiA5OS43YzE5LjYgMTEuMSA0My41IDExLjEgNjMuMSAwbDE3Ni05OS43YzIwLjEtMTEuNCAzMi40LTMyLjYgMzIuNC01NS43bDAtMTE3LjV6bS0yNDAtOS44TDE3MC4yIDE0NCAzMjAuMyA2MC42IDQ3MC40IDE0NCAzMjAuMyAyMjcuNHptLTQxLjUgNTAuMmwtMjEuMyA0Ni4yLTE2NS44LTg4LjggMjUuNC00Ny4yIDE2MS43IDg5Ljh6Il0KICAgIH07CiAgICBmYVRydWNrRmllbGQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHJ1Y2stZmllbGQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU4ZCIsICJNMzIgOTZjMC0zNS4zIDI4LjctNjQgNjQtNjRsMjI0IDBjMjMuNyAwIDQ0LjQgMTIuOSA1NS40IDMybDQwLjQgMGMzMi40IDAgNjEuNiAxOS42IDc0IDQ5LjVsNDMuOCAxMDYuMyAxLjcgNC4yIDI0LjcgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDY0YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0uNCAwYy4yIDIuNiAuNCA1LjMgLjQgOCAwIDQ4LjYtMzkuNCA4OC04OCA4OHMtODgtMzkuNC04OC04OGMwLTIuNyAuMS01LjQgLjQtOGwtMTQ0LjcgMGMuMiAyLjYgLjQgNS4zIC40IDggMCA0OC42LTM5LjQgODgtODggODhzLTg4LTM5LjQtODgtODhjMC0zLjYgLjItNy4xIC42LTEwLjUtMTktNi40LTMyLjYtMjQuNC0zMi42LTQ1LjVsMC00OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC05NmMwLTE3LjcgMTQuMy0zMiAzMi0zMmwwLTMyem0zNTIgMzJsMCA5NiA4Mi4xIDAtMzUuNC04Ni4xYy0yLjUtNi04LjMtOS45LTE0LjgtOS45TDM4NCAxMjh6TTE5MiAzOTJhNDAgNDAgMCAxIDAgLTgwIDAgNDAgNDAgMCAxIDAgODAgMHptMjgwIDQwYTQwIDQwIDAgMSAwIDAtODAgNDAgNDAgMCAxIDAgMCA4MHoiXQogICAgfTsKICAgIGZhTG9jYXRpb25QaW5Mb2NrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxvY2F0aW9uLXBpbi1sb2NrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1MWYiLCAiTTAgMTg4LjZDMCA4NC40IDg2IDAgMTkyIDAgMjk0LjEgMCAzNzcuNiA3OC4zIDM4My42IDE3NyAzMjAuNyAxODUuMSAyNzIgMjM4LjggMjcyIDMwNGwwIDI0LjRjLTE5LjYgMTcuNi0zMiA0My4xLTMyIDcxLjVsMCA3NS43Yy05LjkgMTEuNi0xOC45IDIxLjctMjYuNCAyOS44LTExLjggMTIuOC0zMS41IDEyLjgtNDMuMyAwLTUwLjItNTQuNS0xNzAuNC0xOTcuNS0xNzAuNC0zMTYuOHpNMTkyIDI1NmE2NCA2NCAwIDEgMCAwLTEyOCA2NCA2NCAwIDEgMCAwIDEyOHptMjQwIDQ4LjFjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA0Ny45IDY0IDAgMC00Ny45ek0yODggNDAwYzAtMjAuOSAxMy40LTM4LjcgMzItNDUuM2wwLTUwLjZjMC00NC4yIDM1LjgtODAgODAtODBzODAgMzUuOCA4MCA4MGwwIDUwLjZjMTguNiA2LjYgMzIgMjQuNCAzMiA0NS4zbDAgOTZjMCAyNi41LTIxLjUgNDgtNDggNDhsLTEyOCAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTk2eiJdCiAgICB9OwogICAgZmFQZXJzb25QcmF5aW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1wcmF5aW5nIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4NzIwLCAicHJheSJdLCAiZjY4MyIsICJNMzIwIDY0YTY0IDY0IDAgMSAwIC0xMjggMCA2NCA2NCAwIDEgMCAxMjggMHpNMjAwLjcgMjY0bDIyLjkgMzEuNWM2LjUgOC45IDE2LjMgMTQuNyAyNy4yIDE2LjFzMjEuOS0xLjcgMzAuNC04LjdsODgtNzJjMTcuMS0xNCAxOS42LTM5LjIgNS42LTU2LjNzLTM5LjItMTkuNi01Ni4zLTUuNmwtNTUuMiA0NS4yLTI2LjItMzZjLTE1LjYtMjEuNS00MC42LTM0LjItNjcuMi0zNC4yLTMwLjkgMC01OS4yIDE3LjEtNzMuNiA0NC40TDQ3LjggMjgwLjljLTIwLjIgMzguNS05LjQgODUuOSAyNS42IDExMS44TDEyNi42IDQzMiA0MCA0MzJjLTIyLjEgMC00MCAxNy45LTQwIDQwczE3LjkgNDAgNDAgNDBsMjA4IDBjMTcuMyAwIDMyLjYtMTEuMSAzOC0yNy41cy0uMy0zNC40LTE0LjItNDQuN2wtMTE2LjEtODUuOCA0NS05MHoiXQogICAgfTsKICAgIGZhUHJheSA9IGZhUGVyc29uUHJheWluZzsKICAgIGZhQ2xpcGJvYXJkTGlzdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjbGlwYm9hcmQtbGlzdCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmNDZkIiwgIk0zMTEuNCAzMmw4LjYgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDM1MmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsOC42IDBDODMuNiAxMi45IDEwNC4zIDAgMTI4IDBMMjU2IDBjMjMuNyAwIDQ0LjQgMTIuOSA1NS40IDMyek0yNDggMTEyYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0TDEzNiA2NGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxMTIgMHpNMTI4IDI1NmEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem0zMiAwYzAgMTMuMyAxMC43IDI0IDI0IDI0bDExMiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xMTIgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjR6bTAgMTI4YzAgMTMuMyAxMC43IDI0IDI0IDI0bDExMiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xMTIgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjR6TTk2IDQxNmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6Il0KICAgIH07CiAgICBmYVNhY2tEb2xsYXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2Fjay1kb2xsYXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgxNzZdLCAiZjgxZCIsICJNMzI4IDExMmwtMTQ0IDAtMzcuMy03NC41Yy0xLjgtMy42LTIuNy03LjYtMi43LTExLjYgMC0xNC4zIDExLjYtMjUuOSAyNS45LTI1LjlMMzQyLjEgMGMxNC4zIDAgMjUuOSAxMS42IDI1LjkgMjUuOSAwIDQtLjkgOC0yLjcgMTEuNkwzMjggMTEyek0xNjkuNiAxNjBsMTcyLjggMCA0OC43IDQwLjZDNDU3LjYgMjU2IDQ5NiAzMzggNDk2IDQyNC41IDQ5NiA0NzIuOCA0NTYuOCA1MTIgNDA4LjUgNTEybC0zMDUuMSAwQzU1LjIgNTEyIDE2IDQ3Mi44IDE2IDQyNC41IDE2IDMzOCA1NC40IDI1NiAxMjAuOSAyMDAuNkwxNjkuNiAxNjB6TTI2MCAyMjRjLTExIDAtMjAgOS0yMCAyMGwwIDRjLTI4LjggLjMtNTIgMjMuNy01MiA1Mi41IDAgMjUuNyAxOC41IDQ3LjYgNDMuOSA1MS44bDQxLjcgN2M2IDEgMTAuNCA2LjIgMTAuNCAxMi4zIDAgNi45LTUuNiAxMi41LTEyLjUgMTIuNUwyMTYgMzg0Yy0xMSAwLTIwIDktMjAgMjBzOSAyMCAyMCAyMGwyNCAwIDAgNGMwIDExIDkgMjAgMjAgMjBzMjAtOSAyMC0yMGwwLTQuN2MyNS00LjEgNDQtMjUuNyA0NC01MS44IDAtMjUuNy0xOC41LTQ3LjYtNDMuOS01MS44bC00MS43LTdjLTYtMS0xMC40LTYuMi0xMC40LTEyLjMgMC02LjkgNS42LTEyLjUgMTIuNS0xMi41bDQ3LjUgMGMxMSAwIDIwLTkgMjAtMjBzLTktMjAtMjAtMjBsLTggMCAwLTRjMC0xMS05LTIwLTIwLTIweiJdCiAgICB9OwogICAgZmFNb3VudGFpblN1biA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb3VudGFpbi1zdW4iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUyZiIsICJNMjU2LjUgMGMxNC43IDAgMjguMiA4LjEgMzUuMiAyMWwyMTYgNDAwYzYuNyAxMi40IDYuNCAyNy40LS44IDM5LjUtNy4yIDEyLjEtMjAuMyAxOS41LTM0LjMgMTkuNWwtNDMyIDBjLTE0LjEgMC0yNy4xLTcuNC0zNC4zLTE5LjVzLTcuNS0yNy4xLS44LTM5LjVsMjE2LTQwMCAyLjktNC42QzIzMS43IDYuMiAyNDMuNiAwIDI1Ni41IDB6TTE3MC40IDI0OS45bDI2LjggMjYuOGM2LjIgNi4yIDE2LjQgNi4yIDIyLjYgMGw0My4zLTQzLjNjNi02IDE0LjEtOS40IDIyLjYtOS40bDQyLjggMC03Mi4xLTEzMy41LTg2LjEgMTU5LjR6TTQ5Ni41IDE2MGE4MCA4MCAwIDEgMSAwLTE2MCA4MCA4MCAwIDEgMSAwIDE2MHoiXQogICAgfTsKICAgIGZhQXJyb3dVcFdpZGVTaG9ydCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy11cC13aWRlLXNob3J0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInNvcnQtYW1vdW50LXVwIl0sICJmMTYxIiwgIk0xNTAuNiA0MS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMGwtOTYgOTZjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBMOTYgMTQxLjMgOTYgNDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zMDYuNyA0MS40IDQxLjRjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBzMTIuNS0zMi44IDAtNDUuM2wtOTYtOTZ6TTMyMCA0ODBsMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMzIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMnptMC0xMjhsOTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtOTYgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMnptMC0xMjhsMTYwIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTE2MCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMyem0wLTEyOGwyMjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwzMjAgMzJjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJ6Il0KICAgIH07CiAgICBmYVNvcnRBbW91bnRVcCA9IGZhQXJyb3dVcFdpZGVTaG9ydDsKICAgIGZhVXNlcnNMaW5lID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXJzLWxpbmUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTU5MiIsICJNMjI0IDEyOGE2NCA2NCAwIDEgMSAxMjggMCA2NCA2NCAwIDEgMSAtMTI4IDB6TTE3NiAzMzZjMC02MS45IDUwLjEtMTEyIDExMi0xMTJzMTEyIDUwLjEgMTEyIDExMmwwIDhjMCAxMy4zLTEwLjcgMjQtMjQgMjRsLTE3NiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTh6TTM5MiAxNDRhNTYgNTYgMCAxIDEgMTEyIDAgNTYgNTYgMCAxIDEgLTExMiAwem0yNy4yIDEwMC40YzkuMS0yLjkgMTguOC00LjQgMjguOC00LjQgNTMgMCA5NiA0MyA5NiA5NmwwIDEwLjdjMCAxMS44LTkuNiAyMS4zLTIxLjMgMjEuM2wtNzguOCAwYzIuNy03LjUgNC4xLTE1LjYgNC4xLTI0bDAtOGMwLTM0LjEtMTAuNi02NS43LTI4LjgtOTEuNnptLTI2Mi40IDBjLTE4LjIgMjYtMjguOCA1Ny41LTI4LjggOTEuNmwwIDhjMCA4LjQgMS40IDE2LjUgNC4xIDI0bC03OC44IDBDNDEuNiAzNjggMzIgMzU4LjQgMzIgMzQ2LjdMMzIgMzM2YzAtNTMgNDMtOTYgOTYtOTYgMTAgMCAxOS43IDEuNSAyOC44IDQuNHpNNzIgMTQ0YTU2IDU2IDAgMSAxIDExMiAwIDU2IDU2IDAgMSAxIC0xMTIgMHpNMCA0NDBjMC0xMy4zIDEwLjctMjQgMjQtMjRsNTI4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRMMjQgNDY0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNHoiXQogICAgfTsKICAgIGZhU3Rhck9mRGF2aWQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3Rhci1vZi1kYXZpZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEwMDE3XSwgImY2OWEiLCAiTTQxNS45IDMxMS45bC0yNy44IDQ4LjEgNTUuNyAwLTI3LjgtNDguMXpNMzgzLjYgMjU2bC02MC4yLTEwNC0xMzQuOCAwLTYwLjIgMTA0IDYwLjIgMTA0IDEzNC44IDAgNjAuMi0xMDR6bTY0LjcgMGw1OC40IDEwMC45YzMuNSA2IDUuMyAxMi44IDUuMyAxOS43IDAgMjEuNy0xNy42IDM5LjQtMzkuNCAzOS40bC0xMTcgMC02MS4zIDEwNS44QzI4Ni41IDUzNS42IDI3MS44IDU0NCAyNTYgNTQ0cy0zMC41LTguNC0zOC40LTIyLjJsLTYxLjMtMTA1LjgtMTE3IDBjLTIxLjcgMC0zOS40LTE3LjYtMzkuNC0zOS40IDAtNi45IDEuOC0xMy43IDUuMy0xOS43TDYzLjcgMjU2IDUuMyAxNTUuMUMxLjggMTQ5LjEgMCAxNDIuMyAwIDEzNS40IDAgMTEzLjYgMTcuNiA5NiAzOS40IDk2bDExNyAwIDYxLjMtMTA1LjhDMjI1LjUtMjMuNiAyNDAuMi0zMiAyNTYtMzJzMzAuNSA4LjQgMzguNCAyMi4ybDYxLjMgMTA1LjggMTE3IDBjMjEuNyAwIDM5LjQgMTcuNiAzOS40IDM5LjQgMCA2LjktMS44IDEzLjctNS4zIDE5LjdMNDQ4LjMgMjU2ek0zODguMSAxNTJsMjcuOCA0OC4xIDI3LjgtNDguMS01NS43IDB6TTI5MSA5NmwtMzUtNjAuNC0zNSA2MC40IDcwIDB6TTEyMy45IDE1MmwtNTUuNyAwIDI3LjggNDguMSAyNy44LTQ4LjF6TTk2LjEgMzExLjlsLTI3LjggNDguMSA1NS43IDAtMjcuOC00OC4xek0yMjEgNDE2bDM1IDYwLjQgMzUtNjAuNC03MCAweiJdCiAgICB9OwogICAgZmFOb3Rlc01lZGljYWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibm90ZXMtbWVkaWNhbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNDgxIiwgIk05NiAzNTJjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTgxLjUgMGMxNyAwIDMzLjMtNi43IDQ1LjMtMTguN0w0OTMuMyAyOTAuN2MxMi0xMiAxOC43LTI4LjMgMTguNy00NS4zTDUxMiA2NGMwLTM1LjMtMjguNy02NC02NC02NEwxNjAgMEMxMjQuNyAwIDk2IDI4LjcgOTYgNjRsMCAyODh6TTI4OCAxMTJsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCA0OCA0OCAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtNDggMCAwIDQ4YzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtNDgtNDggMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDQ4IDAgMC00OGMwLTguOCA3LjItMTYgMTYtMTZ6TTQ4IDEyMGMwLTEzLjMtMTAuNy0yNC0yNC0yNFMwIDEwNi43IDAgMTIwTDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI2NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0TDY0IDQ2NGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzI4eiJdCiAgICB9OwogICAgZmFBdXN0cmFsU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhdXN0cmFsLXNpZ24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTBhOSIsICJNMjY2LjUgMjQwbC04NSAwIDQyLjUtMTA2LjQgNDIuNSAxMDYuNHptNjguOSAwTDI2Mi45IDU4LjNDMjU2LjUgNDIuNCAyNDEuMSAzMiAyMjQgMzJzLTMyLjUgMTAuNC0zOC45IDI2LjNMMTEyLjYgMjQwIDMyIDI0MGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw2MS40IDAtMTkuMiA0OC00Mi4zIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMjMuMSAwLTIwLjggNTIuMWMtNi42IDE2LjQgMS40IDM1IDE3LjkgNDEuNnMzNS0xLjQgNDEuNi0xNy45bDMwLjMtNzUuOSAyMDAgMCAzMC4zIDc1LjljNi42IDE2LjQgMjUuMiAyNC40IDQxLjYgMTcuOXMyNC40LTI1LjIgMTcuOS00MS42TDM5Mi45IDM4NCA0MTYgMzg0YzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC00Mi4zIDAtMTkuMi00OCA2MS40IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTgwLjYgMHptLTQ5LjcgNDhsMTkuMiA0OC0xNjEuNiAwIDE5LjItNDggMTIzLjMgMHoiXQogICAgfTsKICAgIGZhQ2xpcGJvYXJkVXNlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjbGlwYm9hcmQtdXNlciIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmN2YzIiwgIk0zMTEuNCAzMmw4LjYgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDM1MmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsOC42IDBDODMuNiAxMi45IDEwNC4zIDAgMTI4IDBMMjU2IDBjMjMuNyAwIDQ0LjQgMTIuOSA1NS40IDMyek0yNDggMTEyYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0TDEzNiA2NGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxMTIgMHpNMTkyIDM0NGE1NiA1NiAwIDEgMCAwLTExMiA1NiA1NiAwIDEgMCAwIDExMnpNOTguMyA0MTNjLTEyLjkgMTUuNiAyLjIgMzUgMjIuNCAzNWwxNDIuNSAwYzIwLjIgMCAzNS4zLTE5LjQgMjIuNC0zNS0xNC43LTE3LjctMzYuOS0yOS02MS43LTI5bC02NCAwYy0yNC44IDAtNDcgMTEuMy02MS43IDI5eiJdCiAgICB9OwogICAgZmFGaWxlSW1hZ2UyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbGUtaW1hZ2UiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjg0NDNdLCAiZjFjNSIsICJNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMMjEzLjUgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN0wzNjUuMyAxMjUuM2MxMiAxMiAxOC43IDI4LjMgMTguNyA0NS4zTDM4NCA0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDY0em0yMDgtNS41bDAgOTMuNWMwIDEzLjMgMTAuNyAyNCAyNCAyNEwzMjUuNSAxNzYgMjA4IDU4LjV6TTEyOCAyNTZhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHpNOTIuNiA0NDhsMTk4LjggMGMxNS44IDAgMjguNi0xMi44IDI4LjYtMjguNiAwLTcuMy0yLjgtMTQuNC03LjktMTkuN0wyMTUuMyAyOTcuOWMtNi02LjMtMTQuNC05LjktMjMuMi05LjlsLS4zIDBjLTguOCAwLTE3LjEgMy42LTIzLjIgOS45TDcxLjkgMzk5LjdDNjYuOCA0MDUgNjQgNDEyLjEgNjQgNDE5LjQgNjQgNDM1LjIgNzYuOCA0NDggOTIuNiA0NDh6Il0KICAgIH07CiAgICBmYVNxdWFyZUNhcmV0UmlnaHQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1jYXJldC1yaWdodCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJjYXJldC1zcXVhcmUtcmlnaHQiXSwgImYxNTIiLCAiTTQ0OCA5NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwek0zMjAgMjU2YzAgNi43LTIuOCAxMy03LjcgMTcuNmwtMTEyIDEwNGMtNyA2LjUtMTcuMiA4LjItMjUuOSA0LjRTMTYwIDM2OS41IDE2MCAzNjBsMC0yMDhjMC05LjUgNS43LTE4LjIgMTQuNC0yMnMxOC45LTIuMSAyNS45IDQuNGwxMTIgMTA0YzQuOSA0LjUgNy43IDEwLjkgNy43IDE3LjZ6Il0KICAgIH07CiAgICBmYUNhcmV0U3F1YXJlUmlnaHQyID0gZmFTcXVhcmVDYXJldFJpZ2h0MjsKICAgIGZhVmlhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ2aWFsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI5NTE0XSwgImY0OTIiLCAiTTM0Mi42IDkuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNMMzA2LjcgNjQgMjguMSAzNDIuNkMxMC4xIDM2MC42IDAgMzg1IDAgNDEwLjVMMCA0MTZjMCA1MyA0MyA5NiA5NiA5Nmw1LjUgMGMyNS41IDAgNDkuOS0xMC4xIDY3LjktMjguMWwyNzguNi0yNzguNiA5LjQgOS40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTE2MC0xNjB6TTIwNS4zIDI1NmwxNDYuNy0xNDYuNyA1MC43IDUwLjctOTYgOTYtMTAxLjUgMHoiXQogICAgfTsKICAgIGZhSGVsaWNvcHRlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoZWxpY29wdGVyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4NjQxXSwgImY1MzMiLCAiTTE3NiAzMmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNTIgMCAwIDQ4LTIyMC44IDAtMzIuOC0zOS40QzY5LjkgODMuMiA2My4xIDgwIDU2IDgwTDI0IDgwQzE1LjcgODAgOCA4NC4zIDMuNiA5MS40cy00LjggMTUuOS0xLjEgMjMuNGw0OCA5NkM1NC42IDIxOC45IDYyLjkgMjI0IDcyIDIyNGwxMDcuOCAwIDEwNCAxNDMuMWMxNS4xIDIwLjcgMzkuMSAzMi45IDY0LjcgMzIuOWw3NS41IDBjNzUuMSAwIDEzNi02MC45IDEzNi0xMzZTNDk5LjEgMTI4IDQyNCAxMjhsLTQ4IDAgMC00OCAxNTIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNEwxNzYgMzJ6TTM3NiAxOTJsNDggMGMzOS44IDAgNzIgMzIuMiA3MiA3MnMtMzIuMiA3Mi03MiA3MmwtNDggMCAwLTE0NHpNNTUyIDQxNmMtMTMuMyAwLTI0IDEwLjctMjQgMjQgMCA0LjQtMy42IDgtOCA4bC0yNzIgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwyNzIgMGMzMC45IDAgNTYtMjUuMSA1Ni01NiAwLTEzLjMtMTAuNy0yNC0yNC0yNHoiXQogICAgfTsKICAgIGZhTWl0dGVuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1pdHRlbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmN2I1IiwgIk0zNTIgMzg0TDY0IDM4NCA1LjQgMTc4LjlDMS44IDE2Ni40IDAgMTUzLjQgMCAxNDAuMyAwIDYyLjggNjIuOCAwIDE0MC4zIDBsMy40IDBjNjYgMCAxMjMuNSA0NC45IDEzOS41IDEwOC45bDMxLjQgMTI1LjggMTcuNi0yMC4xQzM0NC44IDIwMC4yIDM2Mi45IDE5MiAzODIgMTkybDIuOCAwYzM0LjkgMCA2My4zIDI4LjMgNjMuMyA2My4zIDAgMTUuOS02IDMxLjItMTYuOCA0Mi45TDM1MiAzODR6TTMyIDQ2NGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwyODggMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDE2YzAgMTcuNy0xNC4zIDMyLTMyIDMyTDY0IDUxMmMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0xNnoiXQogICAgfTsKICAgIGZhR2FzUHVtcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnYXMtcHVtcCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzk5ODFdLCAiZjUyZiIsICJNMzIgNjRDMzIgMjguNyA2MC43IDAgOTYgMEwyNTYgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDE5MiA4IDBjNDguNiAwIDg4IDM5LjQgODggODhsMCAzMmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTU0Yy0yNy42LTcuMS00OC0zMi4yLTQ4LTYybDAtNTkuNS0yNS44LTI4LjNjLTguOS05LjgtOC4yLTI1IDEuNi0zMy45czI1LTguMiAzMy45IDEuNmw3MS43IDc4LjhjOS40IDEwLjMgMTQuNiAyMy43IDE0LjYgMzcuN0w1MTIgMzc2YzAgMzkuOC0zMi4yIDcyLTcyIDcycy03Mi0zMi4yLTcyLTcybDAtMzJjMC0yMi4xLTE3LjktNDAtNDAtNDBsLTggMCAwIDE2MS40YzkuMyAzLjMgMTYgMTIuMiAxNiAyMi42IDAgMTMuMy0xMC43IDI0LTI0IDI0TDQwIDUxMmMtMTMuMyAwLTI0LTEwLjctMjQtMjQgMC0xMC41IDYuNy0xOS4zIDE2LTIyLjZMMzIgNjR6TTk2IDgwbDAgOTZjMCA4LjggNy4yIDE2IDE2IDE2bDEyOCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTk2YzAtOC44LTcuMi0xNi0xNi0xNkwxMTIgNjRjLTguOCAwLTE2IDcuMi0xNiAxNnoiXQogICAgfTsKICAgIGZhRW52ZWxvcGVDaXJjbGVDaGVjayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJlbnZlbG9wZS1jaXJjbGUtY2hlY2siLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTRlOCIsICJNNjQgMTEyYzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDQxNiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgODEuNGMtMjQuNC0xMS4yLTUxLjQtMTcuNC04MC0xNy40LTg3LjcgMC0xNjEuNyA1OC44LTE4NC43IDEzOS4yLTcuMS0xLjMtMTQuMS00LjItMjAuMS04LjhsLTIwOC0xNTZDNzEuMSAxNDEuMyA2NCAxMjcuMSA2NCAxMTJ6TTMwNCAzNjhjMCAyOC42IDYuMiA1NS42IDE3LjQgODBMMTI4IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0xODggMTk4LjQgMTQ4LjhjMTIuNiA5LjQgMjYuOSAxNS40IDQxLjcgMTcuOSAwIDEuOC0uMSAzLjUtLjEgNS4zem00OCAwYTE0NCAxNDQgMCAxIDEgMjg4IDAgMTQ0IDE0NCAwIDEgMSAtMjg4IDB6bTIwMS40LTYwLjljLTcuMS01LjItMTcuMi0zLjYtMjIuNCAzLjVsLTUzIDcyLjktMjYuOC0yNi44Yy02LjItNi4yLTE2LjQtNi4yLTIyLjYgMHMtNi4yIDE2LjQgMCAyMi42bDQwIDQwYzMuMyAzLjMgNy45IDUgMTIuNiA0LjZzOC45LTIuOCAxMS43LTYuNWw2NC04OGM1LjItNy4xIDMuNi0xNy4yLTMuNS0yMi4zeiJdCiAgICB9OwogICAgZmFQZXJzb25Ta2F0aW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1za2F0aW5nIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNrYXRpbmciXSwgImY3YzUiLCAiTTM2OCA1NmE1NiA1NiAwIDEgMSAxMTIgMCA1NiA1NiAwIDEgMSAtMTEyIDB6TTEyOCAxMjhjMC0xNy43IDE0LjMtMzIgMzItMzJsMTUwLjEgMGM0OS45IDAgNzQuOSA2MC4zIDM5LjYgOTUuNmwtNjMuOSA2My45IDY5LjggMzFjMTcuMyA3LjcgMjguNSAyNC45IDI4LjUgNDMuOWwwIDg1LjZjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC03NS4yLTgyLjQtMzYuNmMtNDEtMTguMi01MS03Mi0xOS4zLTEwMy43bDQwLjQtNDAuNC05OC43IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyek04OS40IDM2MS40bDc1LjktNzUuOWM3LjcgMTkuNyAyMS42IDM3LjMgNDEgNDkuNmwtNzEuNiA3MS42Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM3ptMzQ2LjUgODcuMWM4LjYgMi4xIDEzLjggMTAuOCAxMS42IDE5LjRsLS40IDEuN2MtNi4yIDI0LjktMjguNiA0Mi40LTU0LjMgNDIuNEwzMDQgNTEyYy04LjggMC0xNi03LjItMTYtMTZzNy4yLTE2IDE2LTE2bDg4LjggMGMxMSAwIDIwLjYtNy41IDIzLjMtMTguMmwuNC0xLjdjMi4xLTguNiAxMC44LTEzLjggMTkuNC0xMS42ek0xNDMuMiA0ODYuM2wtNi4yIDMuMWMtMjEuNiAxMC44LTQ3LjYgNi42LTY0LjYtMTAuNUwxMi43IDQxOS4zYy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBsNTkuNiA1OS42YzcuMyA3LjMgMTguNSA5LjEgMjcuNyA0LjVsNi4yLTMuMWM3LjktNCAxNy41LS43IDIxLjUgNy4ycy43IDE3LjUtNy4yIDIxLjV6Il0KICAgIH07CiAgICBmYVNrYXRpbmcgPSBmYVBlcnNvblNrYXRpbmc7CiAgICBmYVN1bjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3VuIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbOTcyOF0sICJmMTg1IiwgIk0xNzguMi0xMC4xYzcuNC0zLjEgMTUuOC0yLjIgMjIuNSAyLjJsODcuOCA1OC4yIDg3LjgtNTguMmM2LjctNC40IDE1LjEtNS4yIDIyLjUtMi4yUzQxMS40LS41IDQxMyA3LjNsMjAuOSAxMDMuMiAxMDMuMiAyMC45YzcuOCAxLjYgMTQuNCA3IDE3LjQgMTQuM3MyLjIgMTUuOC0yLjIgMjIuNWwtNTguMiA4Ny44IDU4LjIgODcuOGM0LjQgNi43IDUuMiAxNS4xIDIuMiAyMi41cy05LjYgMTIuOC0xNy40IDE0LjNMNDMzLjggNDAxLjQgNDEzIDUwNC43Yy0xLjYgNy44LTcgMTQuNC0xNC4zIDE3LjRzLTE1LjggMi4yLTIyLjUtMi4ybC04Ny44LTU4LjItODcuOCA1OC4yYy02LjcgNC40LTE1LjEgNS4yLTIyLjUgMi4ycy0xMi44LTkuNi0xNC4zLTE3LjRMMTQzIDQwMS40IDM5LjcgMzgwLjVjLTcuOC0xLjYtMTQuNC03LTE3LjQtMTQuM3MtMi4yLTE1LjggMi4yLTIyLjVMODIuNyAyNTYgMjQuNSAxNjguMmMtNC40LTYuNy01LjItMTUuMS0yLjItMjIuNXM5LjYtMTIuOCAxNy40LTE0LjNMMTQzIDExMC42IDE2My45IDcuM2MxLjYtNy44IDctMTQuNCAxNC4zLTE3LjR6TTIwNy42IDI1NmE4MC40IDgwLjQgMCAxIDEgMTYwLjggMCA4MC40IDgwLjQgMCAxIDEgLTE2MC44IDB6bTIwOC44IDBhMTI4LjQgMTI4LjQgMCAxIDAgLTI1Ni44IDAgMTI4LjQgMTI4LjQgMCAxIDAgMjU2LjggMHoiXQogICAgfTsKICAgIGZhQmFzZWJhbGwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmFzZWJhbGwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjkzNTgsIDk5MTgsICJiYXNlYmFsbC1iYWxsIl0sICJmNDMzIiwgIk0yMzIuNCAxLjFjLTEyMi4yIDExLjQtMjE5LjUgMTA4LjctMjMwLjkgMjMwLjkgMTYuMi0uMSAzMi0xLjggNDcuMi01IDEzLTIuNyAyNS43IDUuNSAyOC40IDE4LjVzLTUuNSAyNS43LTE4LjUgMjguNGMtMTguNCAzLjktMzcuNiA2LTU3LjEgNi4xIDExLjQgMTIyLjIgMTA4LjcgMjE5LjUgMjMwLjkgMjMwLjkgLjEtMTkuNSAyLjItMzguNyA2LjEtNTcuMSAyLjctMTMgMTUuNS0yMS4zIDI4LjQtMTguNXMyMS4zIDE1LjUgMTguNSAyOC40Yy0zLjIgMTUuMi00LjkgMzEtNSA0Ny4yIDEyMi4yLTExLjQgMjE5LjUtMTA4LjcgMjMwLjktMjMwLjktMTYuMiAuMS0zMiAxLjgtNDcuMiA1LTEzIDIuNy0yNS43LTUuNS0yOC40LTE4LjVzNS41LTI1LjcgMTguNS0yOC40YzE4LjQtMy45IDM3LjYtNiA1Ny4xLTYuMS0xMS40LTEyMi4yLTEwOC43LTIxOS41LTIzMC45LTIzMC45LS4xIDE5LjUtMi4yIDM4LjctNi4xIDU3LjEtMi43IDEzLTE1LjUgMjEuMy0yOC40IDE4LjVzLTIxLjMtMTUuNS0xOC41LTI4LjRjMy4yLTE1LjIgNC45LTMxIDUtNDcuMnptMi44IDE1MS40Yy0yMS40IDMyLjktNDkuNSA2MC45LTgyLjMgODIuMy0xMS4xIDcuMi0yNiA0LjEtMzMuMi03cy00LjEtMjYgNy0zMy4yYzI3LjItMTcuNyA1MC41LTQxIDY4LjMtNjguMyA3LjItMTEuMSAyMi4xLTE0LjMgMzMuMi03czE0LjMgMjIuMSA3IDMzLjJ6TTM5My4xIDI4NC4yYzcuMiAxMS4xIDQuMSAyNi03IDMzLjItMjcuMiAxNy43LTUwLjUgNDEtNjguMyA2OC4zLTcuMiAxMS4xLTIyLjEgMTQuMy0zMy4yIDdzLTE0LjMtMjIuMS03LTMzLjJjMjEuNC0zMi45IDQ5LjUtNjAuOSA4Mi4zLTgyLjMgMTEuMS03LjIgMjYtNC4xIDMzLjIgN3oiXQogICAgfTsKICAgIGZhQmFzZWJhbGxCYWxsID0gZmFCYXNlYmFsbDsKICAgIGZhSW1hZ2UyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImltYWdlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYwM2UiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6bTY0IDgwYTQ4IDQ4IDAgMSAxIDAgOTYgNDggNDggMCAxIDEgMC05NnpNMjcyIDIyNGM4LjQgMCAxNi4xIDQuNCAyMC41IDExLjVsODggMTQ0YzQuNSA3LjQgNC43IDE2LjcgLjUgMjQuM1MzNjguNyA0MTYgMzYwIDQxNkw4OCA0MTZjLTguOSAwLTE3LjItNS0yMS4zLTEyLjlzLTMuNS0xNy41IDEuNi0yNC44bDU2LTgwYzQuNS02LjQgMTEuOC0xMC4yIDE5LjctMTAuMnMxNS4yIDMuOCAxOS43IDEwLjJsMjYuNCAzNy44IDYxLjQtMTAwLjVjNC40LTcuMSAxMi4xLTExLjUgMjAuNS0xMS41eiJdCiAgICB9OwogICAgZmFOb3RkZWYgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibm90ZGVmIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImUxZmUiLCAiTTY0IDM5MC4zTDE1My41IDI1NiA2NCAxMjEuNyA2NCAzOTAuM3pNMTAyLjUgNDQ4TDI4MS41IDQ0OCAxOTIgMzEzLjcgMTAyLjUgNDQ4em0xMjgtMTkyTDMyMCAzOTAuMyAzMjAgMTIxLjcgMjMwLjUgMjU2ek0yODEuNSA2NEwxMDIuNSA2NCAxOTIgMTk4LjMgMjgxLjUgNjR6TTAgNDhDMCAyMS41IDIxLjUgMCA0OCAwTDMzNiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgNDE2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDQ4IDUxMmMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCA0OHoiXQogICAgfTsKICAgIGZhQmFza2V0YmFsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYXNrZXRiYWxsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3OTM2LCAiYmFza2V0YmFsbC1iYWxsIl0sICJmNDM0IiwgIk05Mi43IDU4LjhsNzguNCA3OC40YzE4LjItMjUgMjguOS01NS45IDI4LjktODkuMiAwLTE0LjEtMS45LTI3LjctNS41LTQwLjYtMzggOS40LTcyLjYgMjcuMi0xMDEuOCA1MS40ek01OC44IDkyLjdjLTI0LjIgMjkuMi00MiA2My44LTUxLjQgMTAxLjggMTIuOSAzLjYgMjYuNSA1LjUgNDAuNiA1LjUgMzMuMyAwIDY0LjEtMTAuNyA4OS4yLTI4LjlMNTguOCA5Mi43ek0yNTYgMGMtNC42IDAtOS4yIC4xLTEzLjcgLjQgMy43IDE1LjMgNS43IDMxLjIgNS43IDQ3LjYgMCA0Ni42LTE1LjkgODkuNC00Mi42IDEyMy40TDI1NiAyMjIuMSA0MTkuMyA1OC44QzM3NC45IDIyLjEgMzE4LjEgMCAyNTYgMHpNNDggMjQ4Yy0xNi40IDAtMzIuNC0yLTQ3LjYtNS43LS4yIDQuNS0uNCA5LjEtLjQgMTMuNyAwIDYyLjEgMjIuMSAxMTguOSA1OC44IDE2My4zTDIyMi4xIDI1NiAxNzEuNCAyMDUuNEMxMzcuNCAyMzIuMSA5NC42IDI0OCA0OCAyNDh6bTQ2My42IDIxLjdjLjItNC41IC40LTkuMSAuNC0xMy43IDAtNjIuMS0yMi4xLTExOC45LTU4LjgtMTYzLjNMMjg5LjkgMjU2IDM0MC42IDMwNi42YzM0LTI2LjcgNzYuOS00Mi42IDEyMy40LTQyLjYgMTYuNCAwIDMyLjQgMiA0Ny42IDUuN3ptLTcuMSA0Ny44Yy0xMi45LTMuNi0yNi41LTUuNS00MC42LTUuNS0zMy4zIDAtNjQuMSAxMC43LTg5LjIgMjguOWw3OC40IDc4LjRjMjQuMi0yOS4yIDQyLTYzLjggNTEuNC0xMDEuOHpNMzQwLjkgMzc0LjhjLTE4LjIgMjUtMjguOSA1NS45LTI4LjkgODkuMiAwIDE0LjEgMS45IDI3LjcgNS41IDQwLjYgMzgtOS40IDcyLjYtMjcuMiAxMDEuOC01MS40bC03OC40LTc4LjR6bS0zNC4zLTM0LjNMMjU2IDI4OS45IDkyLjcgNDUzLjJjNDQuMyAzNi43IDEwMS4yIDU4LjggMTYzLjMgNTguOCA0LjYgMCA5LjItLjEgMTMuNy0uNC0zLjctMTUuMy01LjctMzEuMi01LjctNDcuNiAwLTQ2LjYgMTUuOS04OS40IDQyLjYtMTIzLjR6Il0KICAgIH07CiAgICBmYUJhc2tldGJhbGxCYWxsID0gZmFCYXNrZXRiYWxsOwogICAgZmFQZW5jaWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVuY2lsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTk5OSwgNjE1MDQsICJwZW5jaWwtYWx0Il0sICJmMzAzIiwgIk0zNi40IDM1My4yYzQuMS0xNC42IDExLjgtMjcuOSAyMi42LTM4LjdsMTgxLjItMTgxLjIgMzMuOS0zMy45YzE2LjYgMTYuNiA1MS4zIDUxLjMgMTA0IDEwNGwzMy45IDMzLjktMzMuOSAzMy45LTE4MS4yIDE4MS4yYy0xMC43IDEwLjctMjQuMSAxOC41LTM4LjcgMjIuNkwzMC40IDUxMC42Yy04LjMgMi4zLTE3LjMgMC0yMy40LTYuMlMtMS40IDQ4OS4zIC45IDQ4MUwzNi40IDM1My4yem01NS42LTMuN2MtNC40IDQuNy03LjYgMTAuNC05LjMgMTYuNmwtMjQuMSA4Ni45IDg2LjktMjQuMWM2LjQtMS44IDEyLjItNS4xIDE3LTkuN0w5MS45IDM0OS41em0zNTQtMTQ2LjFjLTE2LjYtMTYuNi01MS4zLTUxLjMtMTA0LTEwNEwzMDggNjUuNUMzMzQuNSAzOSAzNDkuNCAyNC4xIDM1Mi45IDIwLjYgMzY2LjQgNyAzODQuOC0uNiA0MDQtLjZTNDQxLjYgNyA0NTUuMSAyMC42bDM1LjcgMzUuN0M1MDQuNCA2OS45IDUxMiA4OC4zIDUxMiAxMDcuNHMtNy42IDM3LjYtMjEuMiA1MS4xYy0zLjUgMy41LTE4LjQgMTguNC00NC45IDQ0Ljl6Il0KICAgIH07CiAgICBmYVBlbmNpbEFsdCA9IGZhUGVuY2lsOwogICAgZmFQZXJzb25XYWxraW5nQXJyb3dMb29wTGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24td2Fsa2luZy1hcnJvdy1sb29wLWxlZnQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU1MSIsICJNMTYwIDgwYTU2IDU2IDAgMSAwIDAtMTEyIDU2IDU2IDAgMSAwIDAgMTEyek03My40IDIyNy45bDIyLjYtMjIuNiAwIDY5LjNjMCAyOCAxMi4yIDU0LjcgMzMuNSA3Mi45bDcxLjQgNjEuMmM1LjkgNS4xIDkuOCAxMi4xIDEwLjkgMTkuOGwxMi42IDg4LjFjMi41IDE3LjUgMTguNyAyOS43IDM2LjIgMjcuMnMyOS43LTE4LjcgMjcuMi0zNi4ybC0xMi42LTg4LjFjLTMuMy0yMy4xLTE0LjktNDQuMS0zMi42LTU5LjNsLTM0LjUtMjkuNiAwLTExNS4yIDMuOCA0LjdjMTguMiAyMi44IDQ1LjggMzYgNzUgMzZsMzMuMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0zMy4yIDBjLTkuNyAwLTE4LjktNC40LTI1LTEybC0xNy45LTIyLjRjLTIzLTI4LjgtNTcuOS00NS42LTk0LjgtNDUuNi0zMi4yIDAtNjMuMSAxMi44LTg1LjggMzUuNkwyOC4xIDE4Mi42QzEwLjEgMjAwLjYgMCAyMjUgMCAyNTAuNUwwIDI4OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzcuNWMwLTguNSAzLjQtMTYuNiA5LjQtMjIuNnpNODUuOCA0MDcuM2MtMS41IDUuMi00LjMgMTAtOC4xIDEzLjhMOS40IDQ4OS40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwbDY4LjMtNjguM2MxMS41LTExLjUgMTkuOS0yNS44IDI0LjQtNDEuNWwyLjItNy42LTQ2LTM5LjRjLTIuNS0yLjItNS00LjQtNy40LTYuOEw4NS44IDQwNy4zek0zNTkgMzM1Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOWw3MiA3MmM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTMxLTMxIDEwMi4xIDBjMS4yIDAgMi40LS4xIDMuNS0uMyA1Ni4xLTMuOSAxMDAuNS01MC42IDEwMC41LTEwNy43IDAtNTkuNi00OC40LTEwOC0xMDgtMTA4bC05MiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDkyIDBjMzMuMSAwIDYwIDI2LjkgNjAgNjBzLTI2LjkgNjAtNjAgNjBsLTk4LjEgMCAzMS0zMWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwbC03MiA3MnoiXQogICAgfTsKICAgIGZhRGljZVNpeCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkaWNlLXNpeCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzk4NjFdLCAiZjUyNiIsICJNMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZ6bTE2MCA2NGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwek0xMjggMjg4YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHptMzIgNjRhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHpNMzIwIDE5MmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6bTMyIDY0YTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6TTMyMCAzODRhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFBbmdsZXNEb3duID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFuZ2xlcy1kb3duIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbImFuZ2xlLWRvdWJsZS1kb3duIl0sICJmMTAzIiwgIk0yMTQuNiA0NzAuNmMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBsLTE2MC0xNjBjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zczMyLjgtMTIuNSA0NS4zIDBMMTkyIDQwMi43IDMyOS40IDI2NS40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwczEyLjUgMzIuOCAwIDQ1LjNsLTE2MCAxNjB6bTE2MC0zNTJsLTE2MCAxNjBjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwbC0xNjAtMTYwYy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM3MzMi44LTEyLjUgNDUuMyAwTDE5MiAyMTAuNyAzMjkuNCA3My40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwczEyLjUgMzIuOCAwIDQ1LjN6Il0KICAgIH07CiAgICBmYUFuZ2xlRG91YmxlRG93biA9IGZhQW5nbGVzRG93bjsKICAgIGZhU3lyaW5nZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzeXJpbmdlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4MTM3XSwgImY0OGUiLCAiTTQ5Ny41LTE3Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDE1IDE1LTQ2LjEgNDYuMS02My02M2MtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWw3IDctNzguMSA3OC4xIDQxIDQxYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTQxLTQxLTQ2LjEgNDYuMSA0MSA0MWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwbC00MS00MS0zNy43IDM3LjdjLTEwLjUgMTAuNS0xNi40IDI0LjctMTYuNCAzOS42bDAgODguOC01NyA1N2MtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDU3LTU3IDg4LjggMGMxNC45IDAgMjkuMS01LjkgMzkuNi0xNi40bDIyOS43LTIyOS43IDcgN2M5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTYzLTYzIDQ2LjEtNDYuMSAxNSAxNWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTY0LTY0eiJdCiAgICB9OwogICAgZmFXaGVhdEF3biA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3aGVhdC1hd24iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsid2hlYXQtYWx0Il0sICJlMmNkIiwgIk03OS43IDIzNC42YzYuMi00LjEgMTQuNy0zLjQgMjAuMSAyLjFsNDYuMSA0Ni4xIDYuMSA2LjdjMTkuNyAyMy44IDI2LjMgNTUgMTkuMiA4My45IDMxLjctNy43IDY2LjIgMSA5MC42IDI1LjNsNDYuMSA0Ni4xYzYuMiA2LjIgNi4yIDE2LjQgMCAyMi42bC03LjQgNy40Yy0zNy41IDM3LjUtOTguMyAzNy41LTEzNS44IDBMMTM0LjEgNDQ0LjMgNDkuNCA1MjljLTkuNCA5LjQtMjQuNSA5LjQtMzMuOSAwLTkuNC05LjQtOS40LTI0LjYgMC0zMy45bDg0LjctODQuNy0zMC41LTMwLjVjLTM3LjUtMzcuNS0zNy41LTk4LjMgMC0xMzUuN2w3LjQtNy40IDIuNS0yLjF6bTEwNC0xMDRjNi4yLTQuMSAxNC43LTMuNCAyMC4xIDIuMWw0Ni4xIDQ2LjEgNi4xIDYuN2MxOS43IDIzLjggMjYuMyA1NSAxOS4yIDgzLjkgMzEuNy03LjcgNjYuMiAxIDkwLjYgMjUuM2w0Ni4xIDQ2LjFjNi4yIDYuMiA2LjIgMTYuNCAwIDIyLjZsLTcuNCA3LjRjLTM3LjUgMzcuNS05OC4zIDM3LjUtMTM1LjggMGwtOTQuOS05NC45Yy0zNy41LTM3LjUtMzcuNS05OC4zIDAtMTM1LjdsNy40LTcuNCAyLjUtMi4xek00OTUuMiAxNWM5LjQtOS40IDI0LjYtOS40IDM0IDAgOC44IDguOCA5LjMgMjIuNyAxLjYgMzIuMkw1MjkuMiA0OSA0MTQuNyAxNjMuNGM3LjcgMSAxNS4yIDMgMjIuNSA1LjlMNDk1LjUgMTExYzkuNC05LjQgMjQuNi05LjQgMzQgMCA4LjggOC44IDkuMyAyMi43IDEuNiAzMi4xbC0xLjcgMS44LTUyLjcgNTIuNyAzOSAzOWM2LjIgNi4yIDYuMiAxNi40IDAgMjIuNmwtNy40IDcuNGMtMzcuNSAzNy41LTk4LjMgMzcuNS0xMzUuOCAwbC05NC45LTk0LjljLTM3LjUtMzcuNS0zNy41LTk4LjMgMC0xMzUuN2w3LjQtNy40IDIuNS0yLjFjNi4yLTQuMSAxNC43LTMuNCAyMC4xIDIuMWwzOSAzOSA1Mi43LTUyLjdjOS40LTkuNCAyNC42LTkuNCAzNCAwIDguOCA4LjggOS4zIDIyLjcgMS42IDMyLjFsLTEuNyAxLjgtNTguMyA1OC4zYzIuOCA3LjEgNC43IDE0LjUgNS43IDIyLjFMNDk1LjIgMTV6Il0KICAgIH07CiAgICBmYVdoZWF0QWx0ID0gZmFXaGVhdEF3bjsKICAgIGZhUGxhbmVVcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwbGFuZS11cCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMjJkIiwgIk0yMDAgMjRjMC0zMC45IDI1LjEtNTYgNTYtNTZzNTYgMjUuMSA1NiA1NmwwIDEyNy4zIDE3My42IDE1OS4yYzYuNiA2LjEgMTAuNCAxNC42IDEwLjQgMjMuNmwwIDQzLjdjMCAxMC45LTEwLjcgMTguNi0yMS4xIDE1LjJsLTE2Mi45LTU0LjMgMCA5OS43IDY2IDUyLjhjMy44IDMgNiA3LjYgNiAxMi41bDAgMTkuOGMwIDEwLjQtOS44IDE4LTE5LjkgMTUuNUwyNTYgNTEyIDE0Ny45IDUzOWMtMTAuMSAyLjUtMTkuOS01LjEtMTkuOS0xNS41bDAtMTkuOGMwLTQuOSAyLjItOS41IDYtMTIuNWw2Ni01Mi44IDAtOTkuNy0xNjIuOSA1NC4zQzI2LjcgMzk2LjQgMTYgMzg4LjcgMTYgMzc3LjhsMC00My43YzAtOSAzLjgtMTcuNSAxMC40LTIzLjZMMjAwIDE1MS4zIDIwMCAyNHoiXQogICAgfTsKICAgIGZhQWxpZ25DZW50ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYWxpZ24tY2VudGVyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYwMzciLCAiTTM1MiA2NGMwLTE3LjctMTQuMy0zMi0zMi0zMkwxMjggMzJjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMTkyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJ6bTk2IDEyOGMwLTE3LjctMTQuMy0zMi0zMi0zMkwzMiAxNjBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzg0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJ6TTAgNDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMybDM4NCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDMyIDQxNmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6TTM1MiAzMjBjMC0xNy43LTE0LjMtMzItMzItMzJsLTE5MiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDE5MiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMyeiJdCiAgICB9OwogICAgZmFIb2NrZXlQdWNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvY2tleS1wdWNrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0NTMiLCAiTTI1NiAyNTZDMTE0LjYgMjU2IDAgMjEzIDAgMTYwczExNC42LTk2IDI1Ni05NiAyNTYgNDMgMjU2IDk2LTExNC42IDk2LTI1NiA5NnpNMCAzNTJMMCAyNDIuN2MxNi45IDEyLjMgMzcgMjIuMiA1OC4xIDMwLjEgNTMgMTkuOSAxMjMgMzEuMiAxOTcuOSAzMS4yczE0NC45LTExLjMgMTk3LjktMzEuMmMyMS4yLTcuOSA0MS4yLTE3LjggNTguMS0zMC4xTDUxMiAzNTJjMCA1My0xMTQuNiA5Ni0yNTYgOTZTMCA0MDUgMCAzNTJ6Il0KICAgIH07CiAgICBmYUNpcmNsZUFycm93TGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtYXJyb3ctbGVmdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJhcnJvdy1jaXJjbGUtbGVmdCJdLCAiZjBhOCIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTEzNSAyMzlsODAtODBjOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45bC0zOSAzOSAxNTAuMSAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNTAuMSAwIDM5IDM5YzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTgwLTgwYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXoiXQogICAgfTsKICAgIGZhQXJyb3dDaXJjbGVMZWZ0ID0gZmFDaXJjbGVBcnJvd0xlZnQ7CiAgICBmYVBsdWdDaXJjbGVCb2x0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBsdWctY2lyY2xlLWJvbHQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU1YiIsICJNMTkyLTMyYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgOTYgMTI4IDAgMC05NmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgOTYgNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwwIDQ4LjdjLTk4LjYgOC4xLTE3NiA5MC43LTE3NiAxOTEuMyAwIDI3LjMgNS43IDUzLjMgMTYgNzYuOWwwIDMuMWMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY2LjdDMTY1LjIgMzk4LjEgOTYgMzE5LjEgOTYgMjI0bDAtNjRjLTE3LjcgMC0zMi0xNC4zLTMyLTMyUzc4LjMgOTYgOTYgOTZsNjQgMCAwLTk2YzAtMTcuNyAxNC4zLTMyIDMyLTMyek0zNTIgNDAwYTE0NCAxNDQgMCAxIDEgMjg4IDAgMTQ0IDE0NCAwIDEgMSAtMjg4IDB6bTE3Ny40LTc3Yy01LjgtNC4yLTEzLjgtNC0xOS40IC41bC04MCA2NGMtNS4zIDQuMi03LjQgMTEuNC01LjEgMTcuOFM0MzMuMiA0MTYgNDQwIDQxNmwzMi45IDAtMTUuOSA0Mi40Yy0yLjUgNi43LS4yIDE0LjMgNS42IDE4LjZzMTMuOCA0IDE5LjQtLjVsODAtNjRjNS4zLTQuMiA3LjQtMTEuNCA1LjEtMTcuOFM1NTguOCAzODQgNTUyIDM4NGwtMzIuOSAwIDE1LjktNDIuNGMyLjUtNi43IC4yLTE0LjMtNS42LTE4LjZ6Il0KICAgIH07CiAgICBmYVJlc3Ryb29tID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJlc3Ryb29tIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY3YmQiLCAiTTgwIDQ4YTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6bTQwIDMwNGwwIDEyOGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTE1NC44Yy04LjEgOS4yLTIxLjEgMTMuMi0zMy41IDkuNC0xNi45LTUuMy0yNi4zLTIzLjItMjEtNDAuMWwyOS43LTk1LjJDNDQuNCAxNTYuOSA4My42IDEyOCAxMjggMTI4czgzLjYgMjguOSA5Ni44IDcxLjJsMjkuNyA5NS4yYzUuMyAxNi45LTQuMSAzNC44LTIxIDQwLjEtMTIuNCAzLjktMjUuNC0uMi0zMy41LTkuNEwyMDAgNDgwYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTI4LTE2IDB6TTMyMCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgNDY0YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNDY0YzAtMTMuMyAxMC43LTI0IDI0LTI0ek00NjQgNDhhNDggNDggMCAxIDEgOTYgMCA0OCA0OCAwIDEgMSAtOTYgMHpNNDQwIDQ4MGwwLTk2LTE3LjggMGMtMTAuOSAwLTE4LjYtMTAuNy0xNS4yLTIxLjFsOS0yNi45Yy0zLjIgMC02LjQtLjUtOS41LTEuNS0xNi45LTUuMy0yNi4zLTIzLjItMjEtNDAuMWwyOS43LTk1LjJDNDI4LjQgMTU2LjkgNDY3LjYgMTI4IDUxMiAxMjhzODMuNiAyOC45IDk2LjggNzEuMmwyOS43IDk1LjJjNS4zIDE2LjktNC4xIDM0LjgtMjEgNDAuMS0zLjIgMS02LjQgMS41LTkuNSAxLjVsOSAyNi45YzMuNSAxMC40LTQuMyAyMS4xLTE1LjIgMjEuMWwtMTcuOCAwIDAgOTZjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC05Ni0xNiAwIDAgOTZjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJ6Il0KICAgIH07CiAgICBmYUFuY2hvckxvY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYW5jaG9yLWxvY2siLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTRhZCIsICJNMzIwLjUgOTZhMzIgMzIgMCAxIDEgLTY0IDAgMzIgMzIgMCAxIDEgNjQgMHptLTMyLTk2Yy01MyAwLTk2IDQzLTk2IDk2IDAgNDEuOCAyNi43IDc3LjQgNjQgOTAuNWwwIDI1Ny45Yy02Mi45LTE0LjMtMTEwLjItNjkuNy0xMTEuOS0xMzYuNWwxNi4xIDE0LjFjMTAgOC43IDI1LjEgNy43IDMzLjktMi4zczcuNy0yNS4xLTIuMy0zMy45bC02NC01NmMtOS03LjktMjIuNi03LjktMzEuNiAwbC02NCA1NmMtMTAgOC43LTExIDIzLjktMi4zIDMzLjlzMjMuOSAxMSAzMy45IDIuM2wxNi4yLTE0LjJjMi4xIDExMy4xIDk0LjQgMjA0LjEgMjA4IDIwNC4xIDI4LjMgMCA1NS40LTUuNyA4MC0xNS45bDAtLjIgMC03Mi4yYy0xNC40IDkuNi0zMC42IDE2LjctNDggMjAuN2wwLTI1Ny45YzM3LjMtMTMuMiA2NC00OC43IDY0LTkwLjUgMC01My00My05Ni05Ni05NnptMjcyIDMwNC4xbDAgNDcuOS02NCAwIDAtNDcuOWMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMyek00MTYuNSA0MDBsMCA5NmMwIDI2LjUgMjEuNSA0OCA0OCA0OGwxMjggMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTk2YzAtMjAuOS0xMy40LTM4LjctMzItNDUuM2wwLTUwLjZjMC00NC4yLTM1LjgtODAtODAtODBzLTgwIDM1LjgtODAgODBsMCA1MC42Yy0xOC42IDYuNi0zMiAyNC40LTMyIDQ1LjN6Il0KICAgIH07CiAgICBmYVRpbWVsaW5lID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRpbWVsaW5lIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImUyOWMiLCAiTTE2MCAxNjkuM2MyOC4zLTEyLjMgNDgtNDAuNSA0OC03My4zIDAtNDQuMi0zNS44LTgwLTgwLTgwUzQ4IDUxLjggNDggOTZjMCAzMi44IDE5LjcgNjEgNDggNzMuM2wwIDU0LjctNjQgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwyMjQgMCAwIDU0LjdjLTI4LjMgMTIuMy00OCA0MC41LTQ4IDczLjMgMCA0NC4yIDM1LjggODAgODAgODBzODAtMzUuOCA4MC04MGMwLTMyLjgtMTkuNy02MS00OC03My4zbDAtNTQuNyAyMjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNjQgMCAwLTU0LjdjMjguMy0xMi4zIDQ4LTQwLjUgNDgtNzMuMyAwLTQ0LjItMzUuOC04MC04MC04MHMtODAgMzUuOC04MCA4MGMwIDMyLjggMTkuNyA2MSA0OCA3My4zbDAgNTQuNy0yNTYgMCAwLTU0Ljd6Il0KICAgIH07CiAgICBmYUxpZ2h0YnVsYjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGlnaHRidWxiIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4MTYxXSwgImYwZWIiLCAiTTI5Mi45IDM4NGM3LjMtMjIuMyAyMS45LTQyLjUgMzguNC01OS45IDMyLjctMzQuNCA1Mi43LTgwLjkgNTIuNy0xMzIuMSAwLTEwNi04Ni0xOTItMTkyLTE5MlMwIDg2IDAgMTkyYzAgNTEuMiAyMCA5Ny43IDUyLjcgMTMyLjEgMTYuNSAxNy40IDMxLjIgMzcuNiAzOC40IDU5LjlsMjAxLjcgMHpNMjg4IDQzMmwtMTkyIDAgMCAxNmMwIDQ0LjIgMzUuOCA4MCA4MCA4MGwzMiAwYzQ0LjIgMCA4MC0zNS44IDgwLTgwbDAtMTZ6TTE4NCAxMTJjLTM5LjggMC03MiAzMi4yLTcyIDcyIDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtNjYuMyA1My43LTEyMCAxMjAtMTIwIDEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0eiJdCiAgICB9OwogICAgZmFDaXJjbGVBcnJvd1JpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1hcnJvdy1yaWdodCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJhcnJvdy1jaXJjbGUtcmlnaHQiXSwgImYwYTkiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyem00MS0xNTljLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsMzktMzktMTUwLjEgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxNTAuMSAwLTM5LTM5Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBsODAgODBjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlsLTgwIDgweiJdCiAgICB9OwogICAgZmFBcnJvd0NpcmNsZVJpZ2h0ID0gZmFDaXJjbGVBcnJvd1JpZ2h0OwogICAgZmFNYXJzQW5kVmVudXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFycy1hbmQtdmVudXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5ODkzXSwgImYyMjQiLCAiTTM2OCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDExMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTEyYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMzQuNy02MyA2M2MxOS41IDI4LjQgMzEgNjIuNyAzMSA5OS44IDAgODYuMy02Mi4xIDE1OC4xLTE0NCAxNzMuMWwwIDM0LjkgMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIgMCAwIDMyYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMzItMzIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwzMiAwIDAtMzQuOWMtODEuOS0xNS0xNDQtODYuOC0xNDQtMTczLjEgMC05Ny4yIDc4LjgtMTc2IDE3Ni0xNzYgMzcgMCA3MS40IDExLjQgOTkuOCAzMWw2My02My0zNC43IDB6TTM1MiAyMDhhMTEyIDExMiAwIDEgMCAtMjI0IDAgMTEyIDExMiAwIDEgMCAyMjQgMHoiXQogICAgfTsKICAgIGZhTmV0d29ya1dpcmVkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm5ldHdvcmstd2lyZWQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjZmZiIsICJNMjQ4IDg4bDgwIDAgMCA0OC04MCAwIDAtNDh6bS04LTU2Yy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDY0YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDE2IDAgMCAzMi0yMjQgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmw5NiAwIDAgMzItMTYgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCA2NGMwIDI2LjUgMjEuNSA0OCA0OCA0OGw5NiAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtNjRjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTE2IDAgMC0zMiAxOTIgMCAwIDMyLTE2IDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgNjRjMCAyNi41IDIxLjUgNDggNDggNDhsOTYgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTY0YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC0xNiAwIDAtMzIgOTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMjI0IDAgMC0zMiAxNiAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtNjRjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTk2IDB6TTQ0OCAzNzZsOCAwIDAgNDgtODAgMCAwLTQ4IDcyIDB6bS0yNTYgMGw4IDAgMCA0OC04MCAwIDAtNDggNzIgMHoiXQogICAgfTsKICAgIGZhQnVpbGRpbmdTaGllbGQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnVpbGRpbmctc2hpZWxkIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU0ZDgiLCAiTTk2IDBDNjAuNyAwIDMyIDI4LjcgMzIgNjRsMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjAxLjIgMGMtMTIuNS0xNC43LTIzLjItMzAuOC0zMS44LTQ4bC04OS41IDAgMC04MGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzMiAwIDAtMjYuN2MwLTE4LjEgNi4xLTM1LjIgMTYuNi00OC44LS40LTEuNC0uNi0yLjktLjYtNC41bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMSA4Ni43LTI4LjljMy4xLTEgNi4yLTEuOCA5LjMtMi41TDQxNiA2NGMwLTM1LjMtMjguNy02NC02NC02NEw5NiAwem0zMiAxMTJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMnpNMjcyIDk2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZ6TTEyOCAyNDBjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMnpNNDQ1LjMgNDg4LjVsLTEzLjMgNi4zIDAtMTg4LjEgOTYgMzIgMCAxOS42YzAgNTUuOC0zMi4yIDEwNi41LTgyLjcgMTMwLjN6TTQyMS45IDI1OS41bC0xMTIgMzcuM2MtMTMuMSA0LjQtMjEuOSAxNi42LTIxLjkgMzAuNGwwIDMxLjFjMCA3NC40IDQzIDE0Mi4xIDExMC4yIDE3My43bDE4LjUgOC43YzQuOCAyLjIgMTAgMy40IDE1LjIgMy40czEwLjUtMS4yIDE1LjItMy40bDE4LjUtOC43QzUzMyA1MDAuMyA1NzYgNDMyLjYgNTc2IDM1OC4ybDAtMzEuMWMwLTEzLjgtOC44LTI2LTIxLjktMzAuNGwtMTEyLTM3LjNjLTYuNi0yLjItMTMuNy0yLjItMjAuMiAweiJdCiAgICB9OwogICAgZmFDb2RlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvZGUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjEyMSIsICJNMzYwLjggMS4yYy0xNy00LjktMzQuNyA1LTM5LjYgMjJsLTEyOCA0NDhjLTQuOSAxNyA1IDM0LjcgMjIgMzkuNnMzNC43LTUgMzkuNi0yMmwxMjgtNDQ4YzQuOS0xNy01LTM0LjctMjItMzkuNnptNjQuNiAxMzYuMWMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNsNzMuNCA3My40LTczLjQgNzMuNGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMGw5Ni05NmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM2wtOTYtOTZjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwem0tMjc0LjcgMGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTk2IDk2Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM2w5NiA5NmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zTDc3LjMgMjU2IDE1MC42IDE4Mi42YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zeiJdCiAgICB9OwogICAgZmFGZWF0aGVyUG9pbnRlZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmZWF0aGVyLXBvaW50ZWQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiZmVhdGhlci1hbHQiXSwgImY1NmIiLCAiTTQ3NS4zIC4xYzkuOS0uOCAxOS42IDMgMjYuNiAxMHMxMC44IDE2LjcgMTAgMjYuNmMtNCA0OS4zLTE3LjQgMTI2LjItNDYuMyAxOTkuNy0xLjggNC41LTUuNSA3LjktMTAuMiA5LjNMMzc0LjUgMjcwYy0zLjkgMS4yLTYuNSA0LjctNi41IDguOCAwIDUuMSA0LjEgOS4yIDkuMiA5LjJsMzguNiAwYzEyIDAgMTkuNyAxMi44IDEzLjUgMjMuMS00IDYuNy04LjMgMTMuMi0xMi43IDE5LjYtMiAyLjktNSA1LTguNCA2LjFMMzEwLjUgMzY2Yy0zLjkgMS4yLTYuNSA0LjctNi41IDguOCAwIDUuMSA0LjEgOS4yIDkuMiA5LjJsMTYgMGMxNC42IDAgMjEgMTcuNCA4LjggMjUuNC02OCA0NS0xMzcuNyA0My4zLTE4Mi40IDMxLjMtMTIuNy0zLjQtMjQtOS45LTM0LjQtMTcuOUw0OCA0OTZjLTguOCA4LjgtMjMuMiA4LjgtMzIgMHMtOC44LTIzLjIgMC0zMmw4MC04MCAuNSAuNWMuNy0xLjMgMS42LTIuNSAyLjctMy42TDI1NiAyMjRjOC44LTguOCA4LjgtMjMuMiAwLTMycy0yMy4yLTguOC0zMiAwTDg5LjcgMzI2LjJjLTguOSA4LjktMjQgNC40LTI1LTguMi00LjMtNTMuMiA5LjMtMTIzLjEgNzIuNi0xODYuNCA5MS4xLTkxLjEgMjU0LjItMTI0LjcgMzM3LjktMTMxLjV6Il0KICAgIH07CiAgICBmYUZlYXRoZXJBbHQgPSBmYUZlYXRoZXJQb2ludGVkOwogICAgZmFGaWxlQ2lyY2xlUXVlc3Rpb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1jaXJjbGUtcXVlc3Rpb24iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRlZiIsICJNOTYgMEM2MC43IDAgMzIgMjguNyAzMiA2NGwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxODAgMGMtMjIuNy0zMS41LTM2LTcwLjItMzYtMTEyIDAtMTAwLjYgNzcuNC0xODMuMiAxNzYtMTkxLjNsMC0zOC4xYzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI5MC43IDE4LjdDMjc4LjcgNi43IDI2Mi41IDAgMjQ1LjUgMEw5NiAwek0zNTcuNSAxNzZMMjY0IDE3NmMtMTMuMyAwLTI0LTEwLjctMjQtMjRMMjQwIDU4LjUgMzU3LjUgMTc2ek00MzIgNTQ0YTE0NCAxNDQgMCAxIDAgMC0yODggMTQ0IDE0NCAwIDEgMCAwIDI4OHptMC0xMDBhMjAgMjAgMCAxIDEgMCA0MCAyMCAyMCAwIDEgMSAwLTQwem0wLTEwMGMtMTEuNiAwLTIxLjMgOC4yLTIzLjUgMTkuMi0xLjggOC43LTEwLjIgMTQuMy0xOC45IDEyLjVzLTE0LjMtMTAuMi0xMi41LTE4LjljNS4yLTI1LjYgMjcuOC00NC44IDU0LjktNDQuOCAzMC45IDAgNTYgMjUuMSA1NiA1NiAwIDE5LjgtMTEuNyAzNy44LTI5LjggNDUuOWwtMTAuNCA0LjZjLTEuMiA3LjctNy44IDEzLjUtMTUuOCAxMy41LTguOCAwLTE2LTcuMi0xNi0xNiAwLTExLjIgNi42LTIxLjMgMTYuOC0yNS45bDEyLjQtNS41YzYuNi0yLjkgMTAuOC05LjQgMTAuOC0xNi42IDAtMTMuMy0xMC43LTI0LTI0LTI0eiJdCiAgICB9OwogICAgZmFTaWduYXR1cmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2lnbmF0dXJlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY1YjciLCAiTTE5MiAxMjhjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDcuOGMwIDI3LjctMi40IDU1LjMtNy4xIDgyLjVsLTg0LjQgMjUuM2MtNDAuNiAxMi4yLTY4LjQgNDkuNi02OC40IDkybDAgMzIuNC03MiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDcyLjUgMGM0LjIgMzYgMzQuOCA2NCA3MiA2NCAyNiAwIDUwLTEzLjkgNjIuOS0zNi41bDEzLjktMjQuM2MyNi44LTQ3IDQ2LjUtOTcuNyA1OC40LTE1MC41bDk0LjQtMjguMy0xMi41IDM3LjVjLTMuMyA5LjgtMS42IDIwLjUgNC40IDI4LjhTNDA1LjcgMzIwIDQxNiAzMjBsMTI4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTgzLjYgMCAxOC01My45YzMuOC0xMS4zIC45LTIzLjgtNy40LTMyLjRzLTIwLjctMTEuOC0zMi4yLTguNEwzMTYuNCAxOTguMWMyLjQtMjAuNyAzLjYtNDEuNCAzLjYtNjIuM2wwLTcuOGMwLTUzLTQzLTk2LTk2LTk2cy05NiA0My05NiA5NmwwIDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zMnptLTkuMiAxNzdsNDktMTQuN2MtMTAuNCAzMy44LTI0LjUgNjYuNC00Mi4xIDk3LjJsLTEzLjkgMjQuM2MtMS41IDIuNi00LjMgNC4zLTcuNCA0LjMtNC43IDAtOC41LTMuOC04LjUtOC41bDAtNzEuOWMwLTE0LjEgOS4zLTI2LjYgMjIuOC0zMC43ek02MTYgNDE2YzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0yOTIuOSAwYy02LjUgMTYuMy0xMy43IDMyLjMtMjEuNiA0OEw2MTYgNDE2eiJdCiAgICB9OwogICAgZmFFYXJ0aEFtZXJpY2FzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImVhcnRoLWFtZXJpY2FzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3NzU4LCAiZWFydGgiLCAiZWFydGgtYW1lcmljYSIsICJnbG9iZS1hbWVyaWNhcyJdLCAiZjU3ZCIsICJNNTUuNyAxOTkuN2wzMC45IDMwLjljNiA2IDE0LjEgOS40IDIyLjYgOS40bDIxLjUgMGM4LjUgMCAxNi42IDMuNCAyMi42IDkuNGwyOS4zIDI5LjNjNiA2IDkuNCAxNC4xIDkuNCAyMi42bDAgMzcuNWMwIDguNSAzLjQgMTYuNiA5LjQgMjIuNmwxMy4zIDEzLjNjNiA2IDkuNCAxNC4xIDkuNCAyMi42bDAgMTguN2MwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMi43YzAtOC41IDMuNC0xNi42IDkuNC0yMi42bDQ1LjMtNDUuM2M2LTYgOS40LTE0LjEgOS40LTIyLjZsMC0zNC43YzAtMTcuNy0xNC4zLTMyLTMyLTMybC04Mi43IDBjLTguNSAwLTE2LjYtMy40LTIyLjYtOS40bC0xNi0xNmMtNC4yLTQuMi02LjYtMTAtNi42LTE2IDAtMTIuNSAxMC4xLTIyLjYgMjIuNi0yMi42bDM0LjcgMGMxMi41IDAgMjIuNi0xMC4xIDIyLjYtMjIuNiAwLTYtMi40LTExLjgtNi42LTE2bC0xOS43LTE5LjdDMjQyIDEzMCAyNDAgMTI1LjEgMjQwIDEyMHMyLTEwIDUuNy0xMy43bDE3LjMtMTcuM2M1LjgtNS44IDkuMS0xMy43IDkuMS0yMS45IDAtNy4yLTIuNC0xMy43LTYuNC0xOC45LTMuMi0uMS02LjQtLjItOS42LS4yLTk1LjQgMC0xNzUuNyA2NC4yLTIwMC4zIDE1MS43ek00NjQgMjU2YzAtMzQuNi04LjQtNjcuMi0yMy40LTk1LjgtNi40IC45LTEyLjcgMy45LTE3LjkgOS4xbC0xMy40IDEzLjRjLTYgNi05LjQgMTQuMS05LjQgMjIuNmwwIDM0LjdjMCAxNy43IDE0LjMgMzIgMzIgMzJsMjQuMSAwYzIuNSAwIDUtLjMgNy4zLS44IC40LTUgLjUtMTAuMSAuNS0xNS4yek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAweiJdCiAgICB9OwogICAgZmFFYXJ0aCA9IGZhRWFydGhBbWVyaWNhczsKICAgIGZhRWFydGhBbWVyaWNhID0gZmFFYXJ0aEFtZXJpY2FzOwogICAgZmFHbG9iZUFtZXJpY2FzID0gZmFFYXJ0aEFtZXJpY2FzOwogICAgZmFDYXJyb3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2Fycm90IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI5MzY1XSwgImY3ODciLCAiTTQ1My4xLTM2LjdMNDQwLjktMjQuNmMtMzEuMiAzMS4yLTMxLjIgODEuOSAwIDExMy4xIDE1LjYgMTUuNiAzMS4yIDMxLjIgNDYuOSA0Ni45IDMxLjIgMzEuMiA4MS45IDMxLjIgMTEzLjEgMGwxMi4xLTEyLjFjNi4yLTYuMiA2LjItMTYuNCAwLTIyLjZMNjAwLjkgODguNmMtMzEuMi0zMS4yLTgxLjktMzEuMi0xMTMuMSAwIDMxLjItMzEuMiAzMS4yLTgxLjkgMC0xMTMuMUw0NzUuNy0zNi43Yy02LjItNi4yLTE2LjQtNi4yLTIyLjYgMHpNMzMxLjYgOTZjLTQ1LjIgMC04Ny4xIDIwLjQtMTE1IDU0LjNMMjczLjMgMjA3YzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBMMTkxLjYgMTkzLjIgNjcuMiA0NjYuOGMtNS41IDEyLjEtMi45IDI2LjQgNi41IDM1LjlzMjMuNyAxMiAzNS45IDYuNWwxNDEuNi02NC40LTQzLjgtNDMuOGMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDU2LjUgNTYuNSA5NS4zLTQzLjNjNTMuMS0yNC4xIDg3LjItNzcuMSA4Ny4yLTEzNS41IDAtODIuMi02Ni42LTE0OC44LTE0OC44LTE0OC44eiJdCiAgICB9OwogICAgZmFUZW1wZXJhdHVyZUZ1bGwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGVtcGVyYXR1cmUtZnVsbCIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWyJ0ZW1wZXJhdHVyZS00IiwgInRoZXJtb21ldGVyLTQiLCAidGhlcm1vbWV0ZXItZnVsbCJdLCAiZjJjNyIsICJNMTYwIDBDMTA3IDAgNjQgNDMgNjQgOTZsMCAxNjQuN0MzNC41IDI4NyAxNiAzMjUuNCAxNiAzNjggMTYgNDQ3LjUgODAuNSA1MTIgMTYwIDUxMnMxNDQtNjQuNSAxNDQtMTQ0YzAtNDIuNi0xOC41LTgxLTQ4LTEwNy4zTDI1NiA5NmMwLTUzLTQzLTk2LTk2LTk2em02NCAzNjhjMCAzNS4zLTI4LjcgNjQtNjQgNjRzLTY0LTI4LjctNjQtNjRjMC0yNi45IDE2LjUtNDkuOSA0MC01OS4zTDEzNiA5NmMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgMjEyLjdjMjMuNSA5LjUgNDAgMzIuNSA0MCA1OS4zeiJdCiAgICB9OwogICAgZmFUZW1wZXJhdHVyZTQgPSBmYVRlbXBlcmF0dXJlRnVsbDsKICAgIGZhVGhlcm1vbWV0ZXI0ID0gZmFUZW1wZXJhdHVyZUZ1bGw7CiAgICBmYVRoZXJtb21ldGVyRnVsbCA9IGZhVGVtcGVyYXR1cmVGdWxsOwogICAgZmFUYWJsZUNlbGxzUm93TG9jayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWJsZS1jZWxscy1yb3ctbG9jayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNjdhIiwgIk0yNTYgMjg4bDAtNjQgMTUzLjMgMGMxNy4xLTQyLjIgNTYtNzMuMiAxMDIuNy03OWwwLTQ5YzAtMzUuMy0yOC43LTY0LTY0LTY0TDEyOCAzMkM5Mi43IDMyIDY0IDYwLjcgNjQgOTZsMCAzMjBjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjQxLjMgMGMtLjktNS4yLTEuMy0xMC42LTEuMy0xNi4xbDAtNDcuOS0xMTIgMCAwLTY0IDExMy4zIDBjMy43LTIyIDE0LjgtNDEuNCAzMC43LTU1LjZsMC04LjQtMTQ0IDB6bTAtMTkybDE5MiAwIDAgNjQtMTkyIDAgMC02NHpNNTYwIDI3Mi4xbDAgNDcuOS02NCAwIDAtNDcuOWMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMyek00MTYgMzY4bDAgOTZjMCAyNi41IDIxLjUgNDggNDggNDhsMTI4IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC05NmMwLTIwLjktMTMuNC0zOC43LTMyLTQ1LjNsMC01MC42YzAtNDQuMi0zNS44LTgwLTgwLTgwcy04MCAzNS44LTgwIDgwbDAgNTAuNmMtMTguNiA2LjYtMzIgMjQuNC0zMiA0NS4zeiJdCiAgICB9OwogICAgZmFCb2x0TGlnaHRuaW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvbHQtbGlnaHRuaW5nIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImUwYjciLCAiTTAgMjU2TDI4LjUgMjhjMi0xNiAxNS42LTI4IDMxLjgtMjhMMjI4LjkgMGMxNSAwIDI3LjEgMTIuMSAyNy4xIDI3LjEgMCAzLjItLjYgNi41LTEuNyA5LjVMMjA4IDE2MCAzNDcuMyAxNjBjMjAuMiAwIDM2LjcgMTYuNCAzNi43IDM2LjcgMCA3LjQtMi4yIDE0LjYtNi40IDIwLjdsLTE5Mi4yIDI4MWMtNS45IDguNi0xNS42IDEzLjctMjUuOSAxMy43bC0yLjkgMGMtMTUuNyAwLTI4LjUtMTIuOC0yOC41LTI4LjUgMC0yLjMgLjMtNC42IC45LTYuOUwxNzYgMjg4IDMyIDI4OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6Il0KICAgIH07CiAgICBmYUNsb3VkU2hvd2Vyc1dhdGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNsb3VkLXNob3dlcnMtd2F0ZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTRlNCIsICJNMjc5LjIgNTUuN0MyNjMuOSAyMi44IDIzMC42IDAgMTkyIDAgMTM5IDAgOTYgNDMgOTYgOTYgNjAuNyA5NiAzMiAxMjQuNyAzMiAxNjBzMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NHMtMjguNy02NC02NC02NGwtMS42IDBjLTcuNC0zNi41LTM5LjctNjQtNzguNC02NC0yMi4yIDAtNDIuMyA5LjEtNTYuOCAyMy43ek00MTAuNiA0NzYuMWMyMC43IDE1LjYgNDYgMzAuNyA3NC4yIDM0LjUgMTMuMSAxLjggMjUuMi03LjUgMjctMjAuNnMtNy41LTI1LjItMjAuNi0yN2MtMTUuOS0yLjEtMzMuMi0xMS4zLTUxLjctMjUuMi0zOC40LTI5LTkwLjUtMjktMTI5IDAtMjQgMTguMS00MC43IDI2LjMtNTQuNSAyNi4zcy0zMC41LTguMi01NC41LTI2LjNjLTM4LjQtMjktOTAuNS0yOS0xMjkgMC0xOC41IDEzLjktMzUuOCAyMy4xLTUxLjcgMjUuMi0xMy4xIDEuOC0yMi40IDEzLjgtMjAuNiAyN3MxMy44IDIyLjQgMjcgMjAuNmMyOC4yLTMuOCA1My42LTE4LjkgNzQuMi0zNC41IDIxLjMtMTYuMSA0OS45LTE2LjEgNzEuMiAwIDI0LjIgMTguMyA1Mi4zIDM1LjkgODMuNCAzNS45czU5LjEtMTcuNyA4My40LTM1LjljMjEuMy0xNi4xIDQ5LjktMTYuMSA3MS4yIDB6TTEwMC4xIDMwMy42YzQuMi0xMi42LTIuNi0yNi4yLTE1LjItMzAuNHMtMjYuMiAyLjYtMzAuNCAxNS4ybC0yMS4zIDY0QzI5IDM2NSAzNS44IDM3OC42IDQ4LjQgMzgyLjhzMjYuMi0yLjYgMzAuNC0xNS4ybDIxLjMtNjR6bTEyMCAwYzQuMi0xMi42LTIuNi0yNi4yLTE1LjItMzAuNHMtMjYuMiAyLjYtMzAuNCAxNS4ybC0yMS4zIDY0Yy00LjIgMTIuNiAyLjYgMjYuMiAxNS4yIDMwLjRzMjYuMi0yLjYgMzAuNC0xNS4ybDIxLjMtNjR6bTExMiAwYzQuMi0xMi42LTIuNi0yNi4yLTE1LjItMzAuNHMtMjYuMiAyLjYtMzAuNCAxNS4ybC0yMS4zIDY0Yy00LjIgMTIuNiAyLjYgMjYuMiAxNS4yIDMwLjRzMjYuMi0yLjYgMzAuNC0xNS4ybDIxLjMtNjR6bTEyMCAwYzQuMi0xMi42LTIuNi0yNi4yLTE1LjItMzAuNHMtMjYuMiAyLjYtMzAuNCAxNS4ybC0yMS4zIDY0Yy00LjIgMTIuNiAyLjYgMjYuMiAxNS4yIDMwLjRzMjYuMi0yLjYgMzAuNC0xNS4ybDIxLjMtNjR6Il0KICAgIH07CiAgICBmYUFycm93VXBMb25nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXVwLWxvbmciLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFsibG9uZy1hcnJvdy11cCJdLCAiZjE3NiIsICJNMTgyLjYtMjIuNmMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTEyOCAxMjhjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBMMTI4IDc3LjMgMTI4IDUxMmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtNDM0LjcgNzMuNCA3My40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTEyOC0xMjh6Il0KICAgIH07CiAgICBmYUxvbmdBcnJvd1VwID0gZmFBcnJvd1VwTG9uZzsKICAgIGZhQWRkcmVzc0NhcmQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFkZHJlc3MtY2FyZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzYyMTQwLCAiY29udGFjdC1jYXJkIiwgInZjYXJkIl0sICJmMmJiIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDQ0OCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyem04MCAyNTZsNjQgMGM0NC4yIDAgODAgMzUuOCA4MCA4MCAwIDguOC03LjIgMTYtMTYgMTZMODAgMzg0Yy04LjggMC0xNi03LjItMTYtMTYgMC00NC4yIDM1LjgtODAgODAtODB6bS0yNC05NmE1NiA1NiAwIDEgMSAxMTIgMCA1NiA1NiAwIDEgMSAtMTEyIDB6bTI0MC00OGwxMTIgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTEyIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6bTAgOTZsMTEyIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTExMiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFDb250YWN0Q2FyZDIgPSBmYUFkZHJlc3NDYXJkMjsKICAgIGZhVmNhcmQyID0gZmFBZGRyZXNzQ2FyZDI7CiAgICBmYUFuZ2xlUmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYW5nbGUtcmlnaHQiLAogICAgICBpY29uOiBbMjU2LCA1MTIsIFs4MjUwXSwgImYxMDUiLCAiTTI0Ny4xIDIzMy40YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zbC0xNjAgMTYwYy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM0wxNzkuMiAyNTYgNDEuOSAxMTguNmMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMGwxNjAgMTYweiJdCiAgICB9OwogICAgZmFGYWNlTWVoMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLW1laCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODUyOCwgIm1laCJdLCAiZjExYSIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTE3NiAxNzZhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em0xMjggMzJhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHpNMTc2IDMyMGwxNjAgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTYwIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYU1laDIgPSBmYUZhY2VNZWgyOwogICAgZmFBcnJvd1VwRnJvbUdyb3VuZFdhdGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXVwLWZyb20tZ3JvdW5kLXdhdGVyIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU0YjUiLCAiTTMwMyA3YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwbDg4IDg4YzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTQ3LTQ3IDAgMjc4LjFjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0yNzguMS00NyA0N2MtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOUwzMDMgN3pNMjQwIDE5MmwwIDE2My4xYy0xMC42LTIuMi0yMS4zLTMuMi0zMi0zLjEtMzIuNSAuMi02NC45IDEwLjctOTIuMyAzMS40LTguOCA2LjYtMTUuOSAxMC45LTIxLjcgMTMuNWwtLjggLjRjLTMuNyAxLjctNi40IDIuOS05LjggLjMtNi00LjUtMTIuNi04LTE5LjMtMTAuNEw2NCAyNDBjMC0yNi41IDIxLjUtNDggNDgtNDhsMTI4IDB6bTMzNiA0OGwwIDE1NS4yYy0xLjEgLjgtMi4yIDEuNS0zLjMgMi40LTQuMSAzLjEtOC4zIC44LTEyLjYtMS41LS42LS4zLTEuMi0uNi0xLjgtMS01LjItMi43LTExLjEtNi42LTE4LTExLjctMjguMS0yMS4xLTYxLjMtMzEuNi05NC40LTMxLjQtMTUuNSAuMS0zMSAyLjUtNDYgNy4zbDAtMTY3LjMgMTI4IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDh6TTQwMy40IDQ3Ni4xQzM3OS4xIDQ5NC4zIDM1MS4xIDUxMiAzMjAgNTEycy01OS4xLTE3LjctODMuNC0zNS45Yy0yMS4zLTE2LjEtNDkuOS0xNi4xLTcxLjIgMC0yMy44IDE3LjktNTQuMSAzNS41LTg4LjEgMzUuMy0yMC40LS4xLTQwLjctNi43LTU5LjgtMjEuMS0xMC42LTgtMTIuNy0yMy00LjctMzMuNnMyMy0xMi43IDMzLjYtNC43YzExLjMgOC41IDIxLjYgMTEuNCAzMS4yIDExLjUgMTcuNiAuMSAzNy4zLTkuNCA1OC45LTI1LjcgMzguNC0yOSA5MC41LTI5IDEyOSAwIDI0IDE4LjEgNDAuNyAyNi4zIDU0LjUgMjYuM3MzMC41LTguMiA1NC41LTI2LjNjMzguNC0yOSA5MC41LTI5IDEyOSAwIDE2LjkgMTIuNyAzMi45IDIxLjUgNDcuOCAyNC42IDEzLjcgMi44IDI3LjQgLjkgNDIuMy0xMC4zIDEwLjYtOCAyNS42LTUuOSAzMy42IDQuN3M1LjkgMjUuNi00LjcgMzMuNmMtMjYuNCAxOS45LTU0LjIgMjQuNC04MC43IDE5LjEtMjUuMy01LjEtNDguMS0xOC45LTY3LjItMzMuMy0yMS4zLTE2LjEtNDkuOS0xNi4xLTcxLjIgMHoiXQogICAgfTsKICAgIGZhTWFwMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtYXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MDYsIDYyMDcyXSwgImYyNzkiLCAiTTUxMiA0OGMwLTExLjEtNS43LTIxLjQtMTUuMi0yNy4ycy0yMS4yLTYuNC0zMS4xLTEuNEwzNDkuNSA3Ny41IDE3MC4xIDE3LjZjLTguMS0yLjctMTYuOC0yLjEtMjQuNCAxLjdsLTEyOCA2NEM2LjggODguOCAwIDk5LjkgMCAxMTJMMCA0NjRjMCAxMS4xIDUuNyAyMS40IDE1LjIgMjcuMnMyMS4yIDYuNCAzMS4xIDEuNGwxMTYuMS01OC4xIDE3OS40IDU5LjhjOC4xIDIuNyAxNi44IDIuMSAyNC40LTEuN2wxMjgtNjRjMTAuOC01LjQgMTcuNy0xNi41IDE3LjctMjguNmwwLTM1MnpNMTkyIDM3Ni45bDAtMjg0LjUgMTI4IDQyLjcgMCAyODQuNS0xMjgtNDIuN3oiXQogICAgfTsKICAgIGZhVXNlclBsdXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlci1wbHVzIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYyMzQiLCAiTTEzNiAxMjhhMTIwIDEyMCAwIDEgMSAyNDAgMCAxMjAgMTIwIDAgMSAxIC0yNDAgMHpNNDggNDgyLjNDNDggMzgzLjggMTI3LjggMzA0IDIyNi4zIDMwNGw1OS40IDBjOTguNSAwIDE3OC4zIDc5LjggMTc4LjMgMTc4LjMgMCAxNi40LTEzLjMgMjkuNy0yOS43IDI5LjdMNzcuNyA1MTJDNjEuMyA1MTIgNDggNDk4LjcgNDggNDgyLjN6TTU0NCA5NmMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDQ4IDQ4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTQ4IDAgMCA0OGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTQ4LTQ4IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsNDggMCAwLTQ4YzAtMTMuMyAxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFWZW51cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ2ZW51cyIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzk3OTJdLCAiZjIyMSIsICJNODAgMTc2YTExMiAxMTIgMCAxIDEgMjI0IDAgMTEyIDExMiAwIDEgMSAtMjI0IDB6TTIyMy45IDM0OS4xQzMwNS45IDMzNC4xIDM2OCAyNjIuMyAzNjggMTc2IDM2OCA3OC44IDI4OS4yIDAgMTkyIDBTMTYgNzguOCAxNiAxNzZjMCA4Ni4zIDYyLjEgMTU4LjEgMTQ0LjEgMTczLjEtLjEgMS0uMSAxLjktLjEgMi45bDAgNjQtMzIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzMiAwIDAgMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTMyIDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTMyIDAgMC02NGMwLTEgMC0xLjktLjEtMi45eiJdCiAgICB9OwogICAgZmFEaWFncmFtU3VjY2Vzc29yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRpYWdyYW0tc3VjY2Vzc29yIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU0N2EiLCAiTTI4OS4yIDEzNy45YzIuNS02IDguMy05LjkgMTQuOC05LjlsNDAgMCAwLTI0YzAtMTMuMy0xMC43LTI0LTI0LTI0bC05OCAwYzEuMyA1LjEgMiAxMC41IDIgMTZsMCA2NGMwIDM1LjMtMjguNyA2NC02NCA2NGwtOTYgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwyNTYgMGMzOS44IDAgNzIgMzIuMiA3MiA3MmwwIDI0IDQwIDBjNi41IDAgMTIuMyAzLjkgMTQuOCA5LjlzMS4xIDEyLjktMy41IDE3LjRsLTY0IDY0Yy02LjIgNi4yLTE2LjQgNi4yLTIyLjYgMGwtNjQtNjRjLTQuNi00LjYtNS45LTExLjUtMy41LTE3LjR6TTM4NCA0ODBMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTY0YzAtMzUuMyAyOC43LTY0IDY0LTY0bDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgNjRjMCAzNS4zLTI4LjcgNjQtNjQgNjR6TTE2MCAxNjBsMC02NC05NiAwIDAgNjQgOTYgMHoiXQogICAgfTsKICAgIGZhSGVhZFNpZGVDb3VnaFNsYXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhlYWQtc2lkZS1jb3VnaC1zbGFzaCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlMDYyIiwgIk01MzUtMjQuOWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjlMNDEgNTM3LjFjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsMjUtMjUgMC00NDcuMmMwLTE1IDEwLjUtMjguMyAyNS40LTI5LjggNy40LS43IDE0LjktMS4xIDIyLjYtMS4xIDExMi43IDAgMjA2IDgzLjMgMjIxLjcgMTkxLjcgLjQgMyAxLjcgNS45IDMuNiA4LjNsMi4yIDIuNiAyMjcuNS0yMjcuNXpNMTMzLjggNTEyTDI4OCAzNTcuOCAyODggNDE2YzAgNTMtNDMgOTYtOTYgOTZsLTU4LjIgMHpNMTc2IDIyNGEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6bTMzNiA0MGEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6bS04OCA3MmEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwem0tNjQgNDhhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHptMTI4IDBhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHptMjQgNzJhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4em0tODgtMjRhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHoiXQogICAgfTsKICAgIGZhRGlhZ3JhbVByb2plY3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZGlhZ3JhbS1wcm9qZWN0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInByb2plY3QtZGlhZ3JhbSJdLCAiZjU0MiIsICJNMCA4MEMwIDUzLjUgMjEuNSAzMiA0OCAzMmw5NiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMTYgMTI4IDAgMC0xNmMwLTI2LjUgMjEuNS00OCA0OC00OGw5NiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgOTZjMCAyNi41LTIxLjUgNDgtNDggNDhsLTk2IDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMTYtMTI4IDAgMCAxNmMwIDcuMy0xLjcgMTQuMy00LjYgMjAuNWw2OC42IDkxLjUgODAgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDk2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC05NiAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTk2YzAtNy4zIDEuNy0xNC4zIDQuNi0yMC41TDEyOCAyMjQgNDggMjI0Yy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDgweiJdCiAgICB9OwogICAgZmFQcm9qZWN0RGlhZ3JhbSA9IGZhRGlhZ3JhbVByb2plY3Q7CiAgICBmYVRlcm1pbmFsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRlcm1pbmFsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxMjAiLCAiTTkuNCAxMTguNmMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMGwxNjAgMTYwYzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zbC0xNjAgMTYwYy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM0wxNDYuNyAyNTYgOS40IDExOC42ek0yMjQgMzg0bDI1NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0yNTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMnoiXQogICAgfTsKICAgIGZhSG91c2VGaXJlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLWZpcmUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTUwYyIsICJNNDQ4IDE5MmMxNC4xIC40IDIzLjggMTEuNCAzMi43IDIxLjcgMiAyLjMgNCA0LjYgNiA2LjdsMTkgMTkuOSAxMi4yLTEzLjhjNS40LTYuMSAxMy4zLTguOSAyMC45LTguOSA3LjIgMCAxNC4zIDIuNiAxOS45IDcuOCAxOS43IDE4LjMgMzkuOCA0My4yIDU1IDcwLjYgMTUuMSAyNy4yIDI2LjIgNTguMiAyNi4yIDg4LjIgMCA4OC43LTcxLjMgMTU5LjgtMTYwIDE1OS44LTg5LjYgMC0xNjAtNzEuMy0xNjAtMTU5LjggMC0zNy4zIDE2LTczLjQgMzYuOC0xMDQuNSAyMC45LTMxLjMgNDcuNS01OSA3MC45LTgwLjEgNS43LTUuMiAxMy4xLTcuNyAyMC4zLTcuNXpNMjY4LjYgNi41YzEyLjItOS4zIDI5LjctOC43IDQxLjIgMmwxNDcuNSAxMzdjLTE5LjItNC4zLTQwIC41LTU1LjUgMTQuNC0zNi40IDMyLjYtNjcuNyA2OS44LTkwLjMgMTA2LjQtMTAuMyAxNi42LTE5LjcgMzQuOS0yNi44IDUzLjdMMjcyIDMyMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCA5NiA2NC42IDBjNy4zIDE3LjIgMTYuOCAzMy40IDI4LjIgNDhMMTQ0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0xNzYtMTYgMGMtMTMuMiAwLTI1LTguMS0yOS44LTIwLjNzLTEuNi0yNi4yIDgtMzUuMWwyMjQtMjA4IDIuNC0yek00ODkuMyAzNDMuN2MtNS40LTQuNy0xMy4xLTQuNy0xOC41IDAtMTcuNyAxNS40LTU0LjcgNTEuOS01NC43IDg4LjQgMCAzNS4zIDI4LjcgNjQgNjQgNjRzNjQtMjguNyA2NC02NGMwLTM2LjUtMzctNzMtNTQuNy04OC40eiJdCiAgICB9OwogICAgZmFNYXNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hc2siLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjZmYSIsICJNMjg4IDY0QzY0IDY0IDAgMTYwIDAgMjcyUzgwIDQ0OCAxNzYgNDQ4bDguNCAwYzI0LjIgMCA0Ni40LTEzLjcgNTcuMi0zNS40bDIzLjItNDYuM2M0LjQtOC44IDEzLjMtMTQuMyAyMy4yLTE0LjNzMTguOCA1LjUgMjMuMiAxNC4zbDIzLjIgNDYuM2MxMC44IDIxLjcgMzMgMzUuNCA1Ny4yIDM1LjRsOC40IDBjOTYgMCAxNzYtNjQgMTc2LTE3NlM1MTIgNjQgMjg4IDY0ek05NiAyNTZhNjQgNjQgMCAxIDEgMTI4IDAgNjQgNjQgMCAxIDEgLTEyOCAwem0zMjAtNjRhNjQgNjQgMCAxIDEgMCAxMjggNjQgNjQgMCAxIDEgMC0xMjh6Il0KICAgIH07CiAgICBmYUh1cnJpY2FuZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJodXJyaWNhbmUiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjc1MSIsICJNMCAyMDhDMCAxMDQuNCA3NS43IDE4LjUgMTc0LjkgMi42IDE4NCAxLjIgMTkyIDguNiAxOTIgMTcuOWwwIDYzLjNjMCA4LjQgNi41IDE1LjMgMTQuNyAxNi41IDEwMC4zIDE0LjkgMTc3LjMgMTAxLjMgMTc3LjMgMjA1LjcgMCAxMDMuNi03NS43IDE4OS41LTE3NC45IDIwNS40LTkuMiAxLjUtMTcuMS01LjktMTcuMS0xNS4ybDAtNjMuM0MxOTIgNDIxLjkgMTg1LjUgNDE1IDE3Ny4zIDQxMy43IDc3IDM5OC45IDAgMzEyLjQgMCAyMDh6bTI4OCA0OGE5NiA5NiAwIDEgMCAtMTkyIDAgOTYgOTYgMCAxIDAgMTkyIDB6bS05Ni0zMmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYUVhcnRoQWZyaWNhID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImVhcnRoLWFmcmljYSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyNzc1NywgImdsb2JlLWFmcmljYSJdLCAiZjU3YyIsICJNNDQ3LjYgMTc1Yy0zMS42LTc0LjYtMTA1LjUtMTI3LTE5MS42LTEyNy0yMi4xIDAtNDMuNCAzLjUtNjMuNCA5LjgtLjQgMi0uNiA0LjEtLjYgNi4ybDAgNzMuNGMwIDEyLjUgMTAuMSAyMi42IDIyLjYgMjIuNiA2IDAgMTEuOC0yLjQgMTYtNi42bDE2LTE2YzYtNiAxNC4xLTkuNCAyMi42LTkuNGw1LjUgMGMyOC41IDAgNDIuOCAzNC41IDIyLjYgNTQuNi02IDYtMTQuMSA5LjQtMjIuNiA5LjRsLTYxLjUgMGMtOC41IDAtMTYuNiAzLjQtMjIuNiA5LjRsLTIxLjMgMjEuM2MtNiA2LTkuNCAxNC4xLTkuNCAyMi42bDAgNDIuN2MwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJsMi43IDBjOC41IDAgMTYuNi0zLjQgMjIuNi05LjRsMjkuMy0yOS4zYzYtNiA5LjQtMTQuMSA5LjQtMjIuNmwwLTE4LjdjMC04LjggNy4yLTE2IDE2LTE2czE2LTcuMiAxNi0xNmwwLTM0LjdjMC04LjUtMy40LTE2LjYtOS40LTIyLjZsLTE2LTE2Yy00LjItNC4yLTYuNi0xMC02LjYtMTYgMC0xMi41IDEwLjEtMjIuNiAyMi42LTIyLjZsNDUgMGMxMi40IDAgMjIuNy03LjEgMjgtMTd6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6Il0KICAgIH07CiAgICBmYUdsb2JlQWZyaWNhID0gZmFFYXJ0aEFmcmljYTsKICAgIGZhVGh1bWJ0YWNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRodW1idGFjayIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyODIwNCwgMTI4MzkyLCAidGh1bWItdGFjayJdLCAiZjA4ZCIsICJNMzIgMzJDMzIgMTQuMyA0Ni4zIDAgNjQgMEwzMjAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMjkuNSAwIDEwLjMgMTM0LjFjMzcuMSAyMS4yIDY1LjggNTYuNCA3OC4yIDk5LjdsMy44IDEzLjRjMi44IDkuNyAuOCAyMC01LjIgMjguMVMzNjIgMzUyIDM1MiAzNTJMMzIgMzUyYy0xMCAwLTE5LjUtNC43LTI1LjUtMTIuN3MtOC0xOC40LTUuMi0yOC4xTDUgMjk3LjhjMTIuNC00My4zIDQxLTc4LjUgNzguMi05OS43TDkzLjUgNjQgNjQgNjRDNDYuMyA2NCAzMiA0OS43IDMyIDMyek0xNjAgNDAwbDY0IDAgMCAxMTJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xMTJ6Il0KICAgIH07CiAgICBmYVRodW1iVGFjayA9IGZhVGh1bWJ0YWNrOwogICAgZmFIYW5kUG9pbnREb3duMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kLXBvaW50LWRvd24iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjBhNyIsICJNMzIgNDgwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yMDgtNjQgMCAwIDIwOHpNMjI0IDMyMGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtNjRjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA2NHptLTY0IDY0YzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNDhjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnptMTYwLTk2YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDY0em0tOTYtODhsMCAuNmM5LjQtNS40IDIwLjMtOC42IDMyLTguNiAxMy4yIDAgMjUuNCA0IDM1LjYgMTAuOCA4LjctMjQuOSAzMi41LTQyLjggNjAuNC00Mi44IDExLjcgMCAyMi42IDMuMSAzMiA4LjZsMC04LjZDMzg0IDcxLjYgMzEyLjQgMCAyMjQgMEwxNjIuMyAwQzExOS44IDAgNzkuMSAxNi45IDQ5LjEgNDYuOUwzNy41IDU4LjVDMTMuNSA4Mi41IDAgMTE1LjEgMCAxNDlsMCAyN2MwIDM1LjMgMjguNyA2NCA2NCA2NGw4OCAwYzIyLjEgMCA0MC0xNy45IDQwLTQwcy0xNy45LTQwLTQwLTQwbC01NiAwYy04LjggMC0xNi03LjItMTYtMTZzNy4yLTE2IDE2LTE2bDU2IDBjMzkuOCAwIDcyIDMyLjIgNzIgNzJ6Il0KICAgIH07CiAgICBmYUZhY2VNZWhCbGFuazIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1tZWgtYmxhbmsiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1NjYsICJtZWgtYmxhbmsiXSwgImY1YTQiLCAiTTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTIwOC00OGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem0xMjggMzJhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFNZWhCbGFuazIgPSBmYUZhY2VNZWhCbGFuazI7CiAgICBmYVRlbXBlcmF0dXJlRW1wdHkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGVtcGVyYXR1cmUtZW1wdHkiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFsidGVtcGVyYXR1cmUtMCIsICJ0aGVybW9tZXRlci0wIiwgInRoZXJtb21ldGVyLWVtcHR5Il0sICJmMmNiIiwgIk02NCA5NmMwLTUzIDQzLTk2IDk2LTk2czk2IDQzIDk2IDk2bDAgMTY0LjdjMjkuNSAyNi40IDQ4IDY0LjcgNDggMTA3LjMgMCA3OS41LTY0LjUgMTQ0LTE0NCAxNDRTMTYgNDQ3LjUgMTYgMzY4YzAtNDIuNiAxOC41LTgxIDQ4LTEwNy4zTDY0IDk2em05NiAzMzZjMzUuMyAwIDY0LTI4LjcgNjQtNjRzLTI4LjctNjQtNjQtNjQtNjQgMjguNy02NCA2NCAyOC43IDY0IDY0IDY0eiJdCiAgICB9OwogICAgZmFUZW1wZXJhdHVyZTAgPSBmYVRlbXBlcmF0dXJlRW1wdHk7CiAgICBmYVRoZXJtb21ldGVyMCA9IGZhVGVtcGVyYXR1cmVFbXB0eTsKICAgIGZhVGhlcm1vbWV0ZXJFbXB0eSA9IGZhVGVtcGVyYXR1cmVFbXB0eTsKICAgIGZhQm9yZGVyTm9uZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib3JkZXItbm9uZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmODUwIiwgIk0zMiA0MTZjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzIgMzItMTQuMyAzMi0zMi0xNC4zLTMyLTMyLTMyek0xNjAgMzJhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDEgMCAwLTY0ek0yODggNDE2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMyIDMyLTE0LjMgMzItMzItMTQuMy0zMi0zMi0zMnpNMTYwIDQ4MGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMi0zMiAxNC4zLTMyIDMyIDE0LjMgMzIgMzIgMzJ6TTI4OCAzMmEzMiAzMiAwIDEgMCAwIDY0IDMyIDMyIDAgMSAwIDAtNjR6TTQxNiA0ODBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzItMzIgMTQuMy0zMiAzMiAxNC4zIDMyIDMyIDMyem0wLTM4NGEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6TTMyIDMyYTMyIDMyIDAgMSAwIDAgNjQgMzIgMzIgMCAxIDAgMC02NHpNNDE2IDM1MmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6TTMyIDE2MGEzMiAzMiAwIDEgMCAwIDY0IDMyIDMyIDAgMSAwIDAtNjR6bTAgMTkyYTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHpNNDE2IDE2MGEzMiAzMiAwIDEgMCAwIDY0IDMyIDMyIDAgMSAwIDAtNjR6Il0KICAgIH07CiAgICBmYUhpZ2hsaWdodGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhpZ2hsaWdodGVyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY1OTEiLCAiTTMxNSAzMTVMNDczLjQgOTkuOSA0NDQuMSA3MC42IDIyOSAyMjkgMzE1IDMxNXptLTE4NyA1bDAgMCAwLTcxLjdjMC0xNS4zIDcuMi0yOS42IDE5LjUtMzguNkw0MjAuNiA4LjRDNDI4IDIuOSA0MzcgMCA0NDYuMiAwIDQ1Ny42IDAgNDY4LjUgNC41IDQ3Ni42IDEyLjZsNTQuOCA1NC44YzguMSA4LjEgMTIuNiAxOSAxMi42IDMwLjUgMCA5LjItMi45IDE4LjItOC40IDI1LjZMMzM0LjQgMzk2LjVjLTkgMTIuMy0yMy40IDE5LjUtMzguNiAxOS41bC03MS43IDAtMjUuNCAyNS40Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMGwtNTAuNy01MC43Yy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM0wxMjggMzIwek03IDQ2Ni4zbDUxLjctNTEuNyA3MC42IDcwLjYtMTkuNyAxOS43Yy00LjUgNC41LTEwLjYgNy0xNyA3TDI0IDUxMmMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC00LjdjMC02LjQgMi41LTEyLjUgNy0xN3oiXQogICAgfTsKICAgIGZhTW9uZXlCaWxsV2F2ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb25leS1iaWxsLXdhdmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjUzYSIsICJNMCA0MTkuNkwwIDEwOS41YzAtMjMuMiAyNC4xLTM4LjYgNDYuMy0zMiA4Ny43IDI2LjIgMTQ5LjcgNS41IDIxMi4xLTE1LjMgNjQuNS0yMS41IDEyOS40LTQzLjEgMjIzLjMtMTMuMSAxOC41IDUuOSAzMC4zIDIzLjggMzAuMyA0My4zbDAgMzEwLjFjMCAyMy4yLTI0LjEgMzguNi00Ni4yIDMyLTg3LjctMjYuMi0xNDkuOC01LjUtMjEyLjEgMTUuMy02NC41IDIxLjUtMTI5LjQgNDMuMS0yMjMuMyAxMy4xLTE4LjUtNS45LTMwLjMtMjMuOC0zMC4zLTQzLjN6TTMzNiAyNTZjMC01My0zNS44LTk2LTgwLTk2cy04MCA0My04MCA5NiAzNS44IDk2IDgwIDk2IDgwLTQzIDgwLTk2ek0xMjAgNDEzLjZjNC40IDAgNy45LTMuOCA3LjItOC4xLTQuNi0yNy44LTI3LTQ5LjUtNTUuMi01My00LjQtLjUtOCAzLjEtOCA3LjVsMCAzOS45YzAgMy42IDIuNCA2LjggNiA3LjcgMTcuOSA0LjIgMzQuMyA2LjEgNTAgNi4xem0zMTguNS01MS4xYzUgLjggOS41LTMgOS41LThsMC00Mi42YzAtNC40LTMuNi04LjEtOC03LjUtMjUuMiAzLjEtNDUuOSAyMC45LTUzLjIgNDQuNi0xLjQgNC43IDIuMyA5LjEgNy4yIDkuMiAxNC4yIC40IDI5IDEuNyA0NC40IDQuM3pNNDQ4IDE1MmwwLTM5LjljMC0zLjYtMi41LTYuOC02LTcuNy0xNy45LTQuMi0zNC4zLTYuMS01MC02LjEtNC40IDAtNy45IDMuOC03LjIgOC4xIDQuNiAyNy44IDI3IDQ5LjUgNTUuMiA1MyA0LjQgLjUgOC0zLjEgOC03LjV6TTEyNS4yIDE2Mi45YzEuNC00LjctMi4zLTkuMS03LjItOS4yLTE0LjItLjQtMjktMS43LTQ0LjQtNC4zLTUtLjgtOS41IDMtOS41IDhMNjQgMjAwYzAgNC40IDMuNiA4LjEgOCA3LjUgMjUuMi0zLjEgNDUuOS0yMC45IDUzLjItNDQuNnoiXQogICAgfTsKICAgIGZhVG9pbGV0UGFwZXJTbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0b2lsZXQtcGFwZXItc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTA3MiIsICJNNDEtMjQuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTLTIuMy0uMyA3IDkuMWw1MjggNTI4YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtOTQuNS05NC41YzQwLjItMjMgNjkuNS05Ni45IDY5LjUtMTg0LjYgMC0xMDYtNDMtMTkyLTk2LTE5MnMtOTYgODYtOTYgMTkyYzAgMjQuMSAyLjIgNDcuMiA2LjMgNjguNEwzMDQgMjM4LjIgMzA0IDIyNGMwLTU4LjkgMTEuOC0xMTQuNSAzMy4yLTE1Ny4yIDUuOS0xMS43IDEzLjEtMjMuNyAyMS45LTM0LjhMMTI4IDMyYy04LjMgMC0xNi40IDIuMS0yNC4xIDYuMWwtNjMtNjN6TTMyIDIyNGwwIDI2NGMwIDMwLjkgMjUuMSA1NiA1NiA1NmwxNjAgMGMzMC45IDAgNTYtMjUuMSA1Ni01NmwwLTExNC4yLTI1Ni0yNTZDMzcuOSAxNDguMiAzMiAxODQuNyAzMiAyMjR6bTQxNiA2NGMtMTcuNyAwLTMyLTI4LjctMzItNjRzMTQuMy02NCAzMi02NCAzMiAyOC43IDMyIDY0LTE0LjMgNjQtMzIgNjR6Il0KICAgIH07CiAgICBmYUZpbGVTaGllbGQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1zaGllbGQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRmMCIsICJNOTYgMEM2MC43IDAgMzIgMjguNyAzMiA2NGwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyMDEuMiAwQzI2MSA0NjkuNCAyNDAgNDE0LjUgMjQwIDM1Ni40bDAtMzEuMWMwLTM0LjQgMjItNjUgNTQuNy03NS45bDExMi0zNy4zYzMuMS0xIDYuMi0xLjggOS4zLTIuNWwwLTM5LjFjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNMMjkwLjcgMTguN0MyNzguNyA2LjcgMjYyLjUgMCAyNDUuNSAwTDk2IDB6TTM1Ny41IDE3NkwyNjQgMTc2Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNEwyNDAgNTguNSAzNTcuNSAxNzZ6bTg3LjggMzEyLjVsLTEzLjMgNi4zIDAtMTg4LjEgOTYgMzIgMCAxOS42YzAgNTUuOC0zMi4yIDEwNi41LTgyLjcgMTMwLjN6TTQyMS45IDI1OS41bC0xMTIgMzcuM2MtMTMuMSA0LjQtMjEuOSAxNi42LTIxLjkgMzAuNGwwIDMxLjFjMCA3NC40IDQzIDE0Mi4xIDExMC4yIDE3My43bDE4LjUgOC43YzQuOCAyLjIgMTAgMy40IDE1LjIgMy40czEwLjUtMS4yIDE1LjItMy40bDE4LjUtOC43QzUzMyA1MDAuMyA1NzYgNDMyLjYgNTc2IDM1OC4ybDAtMzEuMWMwLTEzLjgtOC44LTI2LTIxLjktMzAuNGwtMTEyLTM3LjNjLTYuNi0yLjItMTMuNy0yLjItMjAuMiAweiJdCiAgICB9OwogICAgZmFUZXh0SGVpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRleHQtaGVpZ2h0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYwMzQiLCAiTTQwIDMyQzE3LjkgMzIgMCA0OS45IDAgNzJsMCA1NmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzIgNjQgMCAwIDMyMC0zMiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDEyOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0zMiAwIDAtMzIwIDY0IDAgMCAzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtNTZjMC0yMi4xLTE3LjktNDAtNDAtNDBMNDAgMzJ6TTQzOC42IDM2MS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2w2NCA2NGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGw2NC02NGMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMGwtOS40IDkuNCAwLTIyOS41IDkuNCA5LjRjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBzMTIuNS0zMi44IDAtNDUuM2wtNjQtNjRjLTYtNi0xNC4xLTkuNC0yMi42LTkuNHMtMTYuNiAzLjQtMjIuNiA5LjRsLTY0IDY0Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwbDkuNC05LjQgMCAyMjkuNS05LjQtOS40eiJdCiAgICB9OwogICAgZmFGYWNlR3JpblRvbmd1ZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1ncmluLXRvbmd1ZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODUzOSwgImdyaW4tdG9uZ3VlIl0sICJmNTg5IiwgIk0wIDI1NmMwIDEwNC40IDYyLjUgMTk0LjIgMTUyLjIgMjM0LjEtNS4zLTEzLTguMi0yNy4yLTguMi00Mi4xbDAtNjEuN2MtMTYuOS0xNi41LTMwLjEtMzYuNy0zOC4zLTU5LjMtNC4zLTExLjggNy43LTIxLjggMTkuNi0xOC4xIDM5LjIgMTIuMiA4My43IDE5LjEgMTMwLjcgMTkuMXM5MS41LTYuOSAxMzAuNy0xOS4xYzExLjktMy43IDIzLjkgNi4zIDE5LjYgMTguMS04LjMgMjIuNi0yMS41IDQyLjgtMzguMyA1OS4zbDAgNjEuN2MwIDE0LjktMi45IDI5LjEtOC4yIDQyLjEgODkuNy0zOS44IDE1Mi4yLTEyOS42IDE1Mi4yLTIzNC4xIDAtMTQxLjQtMTE0LjYtMjU2LTI1Ni0yNTZTMCAxMTQuNiAwIDI1NnptMTc2LTgwYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHptMTI4IDMyYTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTE2IDI0MGwwLTQ1LjRjMC0xNC43LTExLjktMjYuNi0yNi42LTI2LjZsLTIgMGMtMTEuMyAwLTIxLjEgNy45LTIzLjYgMTguOS0yLjggMTIuNi0yMC44IDEyLjYtMjMuNiAwLTIuNS0xMS4xLTEyLjMtMTguOS0yMy42LTE4LjlsLTIgMGMtMTQuNyAwLTI2LjYgMTEuOS0yNi42IDI2LjZsMCA0NS40YzAgMzUuMyAyOC43IDY0IDY0IDY0czY0LTI4LjcgNjQtNjR6Il0KICAgIH07CiAgICBmYUdyaW5Ub25ndWUyID0gZmFGYWNlR3JpblRvbmd1ZTI7CiAgICBmYUZpbGVTaWduYXR1cmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1zaWduYXR1cmUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjU3MyIsICJNNjQuMSA2NGMwLTM1LjMgMjguNy02NCA2NC02NEwyNzcuNiAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDQyOS4zIDEyNS4zYzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNsMCA5Ny41LTEzMiAxMzItNDIuMSAwLTE2LjEtNTMuNmMtNC43LTE1LjctMTkuMS0yNi40LTM1LjUtMjYuNC0xMS4zIDAtMjEuOSA1LjEtMjguOSAxMy45TDEzMy4zIDQwOWMtOC4zIDEwLjMtNi42IDI1LjUgMy43IDMzLjdzMjUuNSA2LjYgMzMuNy0zLjhsNDcuMS01OC44IDE1LjIgNTAuN2MzIDEwLjIgMTIuNCAxNy4xIDIzIDE3LjFsMzEuNSAwYy0uOSAzLjEtMS43IDYuMy0yLjMgOS41bC0xMC45IDU0LjUtMTQ2LjIgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0zODR6bTIwOC01LjVsMCA5My41YzAgMTMuMyAxMC43IDI0IDI0IDI0bDkzLjUgMC0xMTcuNS0xMTcuNXptNjAuMiA0MDguNGMyLjUtMTIuNCA4LjYtMjMuOCAxNy41LTMyLjdsMTE4LjktMTE4LjkgODAgODAtMTE4LjkgMTE4LjljLTguOSA4LjktMjAuMyAxNS0zMi43IDE3LjVsLTU5LjYgMTEuOWMtLjkgLjItMS45IC4zLTIuOSAuMy04IDAtMTQuNi02LjUtMTQuNi0xNC42IDAtMSAuMS0xLjkgLjMtMi45bDExLjktNTkuNnptMjY3LjgtMTIzbC0yOC44IDI4LjgtODAtODAgMjguOC0yOC44YzIyLjEtMjIuMSA1Ny45LTIyLjEgODAgMHMyMi4xIDU3LjkgMCA4MHoiXQogICAgfTsKICAgIGZhQnVpbGRpbmdXaGVhdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJidWlsZGluZy13aGVhdCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNGRiIiwgIk05NiAwQzYwLjcgMCAzMiAyOC43IDMyIDY0bDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI0OS4zIDBjLTYtMTQuOC05LjMtMzEtOS4zLTQ4IDAtMTcuNyA3LjItMzMuNyAxOC44LTQ1LjMtMTEuOS0xOS40LTE4LjgtNDIuMy0xOC44LTY2LjcgMC0xNy43IDcuMi0zMy43IDE4LjgtNDUuMy0xMS45LTE5LjQtMTguOC00Mi4zLTE4LjgtNjYuNyAwLTI1LjIgMTQuNS00Ni45IDM1LjYtNTcuNC0yLjQtNy4xLTMuNi0xNC43LTMuNi0yMi42bDAtMzJDMzY4IDk2LjcgMzg4IDcwLjEgNDE1LjkgNjAuMSA0MTMuOSAyNi42IDM4NiAwIDM1MiAwTDk2IDB6TTIwOCAzNTJsMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDgwLTk2IDAgMC04MGMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNMTI4IDExMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyek0yNzIgOTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNnpNMTI4IDI0MGMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyem0xNDQtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNnptMzUyIDBsLTE2IDBjLTQ0LjIgMC04MCAzNS44LTgwIDgwIDAgOC44IDcuMiAxNiAxNiAxNmwxNiAwYzQ0LjIgMCA4MC0zNS44IDgwLTgwIDAtOC44LTcuMi0xNi0xNi0xNnptMTYgMTI4YzAtOC44LTcuMi0xNi0xNi0xNmwtMTYgMGMtNDQuMiAwLTgwIDM1LjgtODAgODAgMCA4LjggNy4yIDE2IDE2IDE2bDE2IDBjNDQuMiAwIDgwLTM1LjggODAtODB6bTAgMTEyYzAtOC44LTcuMi0xNi0xNi0xNmwtMTYgMGMtNDQuMiAwLTgwIDM1LjgtODAgODAgMCA4LjggNy4yIDE2IDE2IDE2bDE2IDBjNDQuMiAwIDgwLTM1LjggODAtODB6TTQ5NiA1MjhjMC00NC4yLTM1LjgtODAtODAtODBsLTE2IDBjLTguOCAwLTE2IDcuMi0xNiAxNiAwIDQ0LjIgMzUuOCA4MCA4MCA4MGwxNiAwYzguOCAwIDE2LTcuMiAxNi0xNnptLTE2LTk2YzguOCAwIDE2LTcuMiAxNi0xNiAwLTQ0LjItMzUuOC04MC04MC04MGwtMTYgMGMtOC44IDAtMTYgNy4yLTE2IDE2IDAgNDQuMiAzNS44IDgwIDgwIDgwbDE2IDB6bTE2LTEyOGMwLTQ0LjItMzUuOC04MC04MC04MGwtMTYgMGMtOC44IDAtMTYgNy4yLTE2IDE2IDAgNDQuMiAzNS44IDgwIDgwIDgwbDE2IDBjOC44IDAgMTYtNy4yIDE2LTE2ek01MTIgNjRjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMTA0YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xMDRjMC0xMy4zLTEwLjctMjQtMjQtMjR6bTk2IDY0YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMzJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTMyek00NDAgMTA0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDMyYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0zMmMwLTEzLjMtMTAuNy0yNC0yNC0yNHoiXQogICAgfTsKICAgIGZhUGx1Z0NpcmNsZU1pbnVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBsdWctY2lyY2xlLW1pbnVzIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NWUiLCAiTTE5Mi0zMmMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDk2IDEyOCAwIDAtOTZjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDk2IDY0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsMCA0OC43Yy05OC42IDguMS0xNzYgOTAuNy0xNzYgMTkxLjMgMCAyNy4zIDUuNyA1My4zIDE2IDc2LjlsMCAzLjFjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02Ni43QzE2NS4yIDM5OC4xIDk2IDMxOS4xIDk2IDIyNGwwLTY0Yy0xNy43IDAtMzItMTQuMy0zMi0zMlM3OC4zIDk2IDk2IDk2bDY0IDAgMC05NmMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNMzUyIDQwMGExNDQgMTQ0IDAgMSAxIDI4OCAwIDE0NCAxNDQgMCAxIDEgLTI4OCAwem0yMjQgMGMwLTguOC03LjItMTYtMTYtMTZsLTEyOCAwYy04LjggMC0xNiA3LjItMTYgMTZzNy4yIDE2IDE2IDE2bDEyOCAwYzguOCAwIDE2LTcuMiAxNi0xNnoiXQogICAgfTsKICAgIGZhRnV0Ym9sMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmdXRib2wiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5OTE3LCAiZnV0Ym9sLWJhbGwiLCAic29jY2VyLWJhbGwiXSwgImYxZTMiLCAiTTQxNy4zIDM2MC4xbC03MS42LTQuOGMtNS4yLS4zLTEwLjMgMS4xLTE0LjUgNC4ycy03LjIgNy40LTguNCAxMi41bC0xNy42IDY5LjZDMjg5LjUgNDQ1LjggMjczIDQ0OCAyNTYgNDQ4cy0zMy41LTIuMi00OS4yLTYuNEwxODkuMiAzNzJjLTEuMy01LTQuMy05LjQtOC40LTEyLjVzLTkuMy00LjUtMTQuNS00LjJsLTcxLjYgNC44Yy0xNy42LTI3LjItMjguNS01OS4yLTMwLjQtOTMuNkwxMjUgMjI4LjNjNC40LTIuOCA3LjYtNyA5LjItMTEuOXMxLjQtMTAuMi0uNS0xNWwtMjYuNy02Ni42QzEyOCAxMDkuMiAxNTUuMyA4OSAxODYuNyA3Ni45bDU1LjIgNDZjNCAzLjMgOSA1LjEgMTQuMSA1LjFzMTAuMi0xLjggMTQuMS01LjFsNTUuMi00NmMzMS4zIDEyLjEgNTguNyAzMi4zIDc5LjYgNTcuOWwtMjYuNyA2Ni42Yy0xLjkgNC44LTIuMSAxMC4xLS41IDE1czQuOSA5LjEgOS4yIDExLjlsNjAuNyAzOC4yYy0xLjkgMzQuNC0xMi44IDY2LjQtMzAuNCA5My42ek0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnptMTQuMS0zMjUuN2MtOC40LTYuMS0xOS44LTYuMS0yOC4yIDBMMTk0IDIyMWMtOC40IDYuMS0xMS45IDE2LjktOC43IDI2LjhsMTguMyA1Ni4zYzMuMiA5LjkgMTIuNCAxNi42IDIyLjggMTYuNmw1OS4yIDBjMTAuNCAwIDE5LjYtNi43IDIyLjgtMTYuNmwxOC4zLTU2LjNjMy4yLTkuOS0uMy0yMC43LTguNy0yNi44bC00Ny45LTM0Ljh6Il0KICAgIH07CiAgICBmYUZ1dGJvbEJhbGwyID0gZmFGdXRib2wyOwogICAgZmFTb2NjZXJCYWxsMiA9IGZhRnV0Ym9sMjsKICAgIGZhQ2lyY2xlUGx1cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtcGx1cyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJwbHVzLWNpcmNsZSJdLCAiZjA1NSIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTIzMiAzNDRsMC02NC02NCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDY0IDAgMC02NGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgNjQgNjQgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNjQgMCAwIDY0YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0eiJdCiAgICB9OwogICAgZmFQbHVzQ2lyY2xlID0gZmFDaXJjbGVQbHVzOwogICAgZmFCcmF6aWxpYW5SZWFsU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJicmF6aWxpYW4tcmVhbC1zaWduIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU0NmMiLCAiTTQwMCAxNmMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDE2IDE2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTQ4LjkgMGMtMjYgMC00Ny4xIDIxLjEtNDcuMSA0Ny4xIDAgMjIuNSAxNS45IDQxLjggMzcuOSA0Ni4ybDMyLjggNi42YzUxLjkgMTAuNCA4OS4zIDU2IDg5LjMgMTA5IDAgNTAuNi0zMy44IDkzLjMtODAgMTA2LjdsMCAyMC40YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTYtMzIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw2NC45IDBjMjYgMCA0Ny4xLTIxLjEgNDcuMS00Ny4xIDAtMjIuNS0xNS45LTQxLjgtMzcuOS00Ni4ybC0zMi44LTYuNmMtNTEuOS0xMC40LTg5LjMtNTYtODkuMy0xMDkgMC01MC42IDMzLjgtOTMuMiA4MC0xMDYuN0wzNjggNDhjMC0xNy43IDE0LjMtMzIgMzItMzJ6TTAgNjRDMCA0Ni4zIDE0LjMgMzIgMzIgMzJsODAgMGM3OS41IDAgMTQ0IDY0LjUgMTQ0IDE0NCAwIDU0LjMtMzAgMTAxLjUtNzQuNCAxMjYuMWw0MSAxMzYuN2M1LjEgMTYuOS00LjUgMzQuOC0yMS41IDM5LjhzLTM0LjgtNC41LTM5LjgtMjEuNUwxMjAuMSAzMTkuOGMtMi43IC4xLTUuNCAuMi04LjEgLjJsLTQ4IDAgMCAxMjhjMCAxNy43LTE0LjMgMzItMzIgMzJTMCA0NjUuNyAwIDQ0OEwwIDY0ek02NCAyNTZsNDggMGM0NC4yIDAgODAtMzUuOCA4MC04MHMtMzUuOC04MC04MC04MGwtNDggMCAwIDE2MHoiXQogICAgfTsKICAgIGZhU3RhckFuZENyZXNjZW50ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN0YXItYW5kLWNyZXNjZW50IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTc3MF0sICJmNjk5IiwgIk0wIDI1NmMwLTE0MS40IDExNC42LTI1NiAyNTYtMjU2IDMzIDAgNjQuNiA2LjMgOTMuNiAxNy43IDcuNCAyLjkgMTEuNSAxMC43IDkuOCAxOC40cy04LjggMTMtMTYuNyAxMi40Yy00LjgtLjMtOS43LS41LTE0LjYtLjUtMTE0LjkgMC0yMDggOTMuMS0yMDggMjA4czkzLjEgMjA4IDIwOCAyMDhjNC45IDAgOS44LS4yIDE0LjYtLjUgNy45LS41IDE1IDQuNyAxNi43IDEyLjRzLTIuNCAxNS41LTkuOCAxOC40QzMyMC42IDUwNS43IDI4OSA1MTIgMjU2IDUxMiAxMTQuNiA1MTIgMCAzOTcuNCAwIDI1NnpNMzc1LjQgMTM3LjRjMy41LTcuMSAxMy43LTcuMSAxNy4yIDBsMzEuNSA2My44YzEuNCAyLjggNC4xIDQuOCA3LjIgNS4zbDcwLjQgMTAuMmM3LjkgMS4xIDExIDEwLjggNS4zIDE2LjRsLTUwLjkgNDkuNmMtMi4zIDIuMi0zLjMgNS40LTIuOCA4LjVsMTIgNzAuMWMxLjMgNy44LTYuOSAxMy44LTEzLjkgMTAuMWwtNjMtMzMuMWMtMi44LTEuNS02LjEtMS41LTguOSAwbC02MyAzMy4xYy03IDMuNy0xNS4zLTIuMy0xMy45LTEwLjFsMTItNzAuMWMuNS0zLjEtLjUtNi4zLTIuOC04LjVMMjYxIDIzMy4xYy01LjctNS42LTIuNi0xNS4yIDUuMy0xNi40bDcwLjQtMTAuMmMzLjEtLjUgNS44LTIuNCA3LjItNS4zbDMxLjUtNjMuOHoiXQogICAgfTsKICAgIGZhRmFjZVN1cnByaXNlMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLXN1cnByaXNlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTU4LCAic3VycHJpc2UiXSwgImY1YzIiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0xNzYgMTc2YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHptMTI4IDMyYTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bS00OCA4MGE2NCA2NCAwIDEgMSAwIDEyOCA2NCA2NCAwIDEgMSAwLTEyOHoiXQogICAgfTsKICAgIGZhU3VycHJpc2UyID0gZmFGYWNlU3VycHJpc2UyOwogICAgZmFIb3NwaXRhbFVzZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG9zcGl0YWwtdXNlciIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmODBkIiwgIk02NCA2NEM2NCAyOC43IDkyLjcgMCAxMjggMEwzODQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDEyMS4zYy00Ni45IDE5LTgwIDY1LTgwIDExOC43IDAgMjcuNyA4LjggNTMuNCAyMy44IDc0LjQtNTEuNSAyMS04Ny44IDcxLjYtODcuOCAxMzAuNyAwIDEgMCAxLjkgMCAyLjlsLTE3NiAwYy0zNS4zIDAtNjQtMjguNy02NC02NEw2NCA2NHpNMjA4IDQwMGwwIDY0IDUzLjQgMGM3LjItMjkuNCAyMS4zLTU2LjEgNDAuNC03OC4zLTYuMS0xOS41LTI0LjMtMzMuNy00NS44LTMzLjctMjYuNSAwLTQ4IDIxLjUtNDggNDh6TTI0OCA4OGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzItMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMTZjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDAgMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMTYgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMiAzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTE2YzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMCAwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMTYgMHpNNDE2IDMwNGE4MCA4MCAwIDEgMSAxNjAgMCA4MCA4MCAwIDEgMSAtMTYwIDB6TTM1MiA1MTJjMC01MyA0My05NiA5Ni05Nmw5NiAwYzUzIDAgOTYgNDMgOTYgOTYgMCAxNy43LTE0LjMgMzItMzIgMzJsLTIyNCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnoiXQogICAgfTsKICAgIGZhQXJyb3dEb3duVXBMb2NrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LWRvd24tdXAtbG9jayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNGIwIiwgIk0yNjIuNiA0MjIuNmwtODAgODBjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwbC04MC04MGMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMGwyNS40IDI1LjQgMC0xMTQuNy02NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDI1NiAwIDAtMTE0LjctMjUuNCAyNS40Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM2w4MC04MGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMGw4MCA4MGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMGwtMjUuNC0yNS40IDAgOTQuOGMtMjUuMyAyMC4zLTQyLjggNTAuMS00NyA4My45bC0xNDUgMCAwIDExNC43IDI1LjQtMjUuNGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zek0xOTIgMzJsMCAxNDQtNjQgMCAwLTE0NGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMyek00OTYgMzA0LjFjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA0Ny45IDY0IDAgMC00Ny45ek0zNTIgNDAwYzAtMjAuOSAxMy40LTM4LjcgMzItNDUuM2wwLTUwLjZjMC00NC4yIDM1LjgtODAgODAtODBzODAgMzUuOCA4MCA4MGwwIDUwLjZjMTguNiA2LjYgMzIgMjQuNCAzMiA0NS4zbDAgOTZjMCAyNi41LTIxLjUgNDgtNDggNDhsLTEyOCAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTk2eiJdCiAgICB9OwogICAgZmFGb2xkZXIyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZvbGRlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODE5MywgMTI4NDQ3LCA2MTcxNiwgImZvbGRlci1ibGFuayJdLCAiZjA3YiIsICJNNjQgNDQ4bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjQwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDI5OC43IDgwYy02LjkgMC0xMy43LTIuMi0xOS4yLTYuNEwyNDEuMSA0NC44QzIzMCAzNi41IDIxNi41IDMyIDIwMi43IDMyTDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjR6Il0KICAgIH07CiAgICBmYUZvbGRlckJsYW5rMiA9IGZhRm9sZGVyMjsKICAgIGZhSG9sbHlCZXJyeSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob2xseS1iZXJyeSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmN2FhIiwgIk0yNTYuMiA5NmE0OCA0OCAwIDEgMCAwLTk2IDQ4IDQ4IDAgMSAwIDAgOTZ6bS04MCA5NmE0OCA0OCAwIDEgMCAwLTk2IDQ4IDQ4IDAgMSAwIDAgOTZ6TTI3NyAzODMuOGMxIC4xIDIuMSAuMiAzLjIgLjIgMzkuOCAwIDcyIDMyLjIgNzIgNzJsMCAyMi43YzAgMTYuNCAxNiAyNy45IDMxLjYgMjIuOGwxMi44LTQuM2MxOC02IDM3LjMtNi41IDU1LjYtMS41bDE5LjQgNS4zYzE3LjkgNC45IDM0LjQtMTEuNiAyOS41LTI5LjVMNDk1LjkgNDUyYy01LTE4LjMtNC40LTM3LjYgMS41LTU1LjZsNC4zLTEyLjhjNS4yLTE1LjUtNi40LTMxLjYtMjIuOC0zMS42LTM0LjYgMC02Mi43LTI4LjEtNjIuNy02Mi43bDAtMzJjMC0xNi40LTE2LTI3LjktMzEuNi0yMi44bC0xMi44IDQuM2MtMTggNi0zNy4zIDYuNS01NS42IDEuNWwtMjkuNi04LjFjLTIuOS0uOC01LjktMS04LjctLjcgNC4yIDkuNyA1LjggMjAuOCAzLjcgMzIuM2wtNi4zIDM0LjhjLTEuNSA4LjQtMS40IDE3IC41IDI1LjNsNS4zIDIzLjljMi44IDEyLjcgMS4xIDI1LjItNCAzNS45ek0xMjcuOCAyMzQuNWMtMTUuNS01LjItMzEuNiA2LjQtMzEuNiAyMi44bDAgMzJjMCAzNC42LTI4LjEgNjIuNy02Mi43IDYyLjctMTYuNCAwLTI3LjkgMTYtMjIuOCAzMS42TDE1IDM5Ni40YzYgMTggNi41IDM3LjMgMS41IDU1LjZsLTUuMyAxOS40QzYuNCA0ODkuNCAyMi44IDUwNS44IDQwLjcgNTAxbDE5LjQtNS4zYzE4LjMtNSAzNy42LTQuNSA1NS42IDEuNWwxMi44IDQuM2MxNS41IDUuMiAzMS42LTYuNCAzMS42LTIyLjhsMC0zMmMwLTM0LjYgMjguMS02Mi43IDYyLjctNjIuNyAxNi40IDAgMjcuOS0xNiAyMi44LTMxLjZsLTQuMy0xMi44Yy02LTE4LTYuNS0zNy4zLTEuNS01NS42bDUuMy0xOS40YzQuOS0xNy45LTExLjYtMzQuNC0yOS41LTI5LjVsLTE5LjQgNS4zYy0xOC4zIDUtMzcuNiA0LjQtNTUuNi0xLjVsLTEyLjgtNC4zek0zODQuMiAxNDRhNDggNDggMCAxIDAgLTk2IDAgNDggNDggMCAxIDAgOTYgMHoiXQogICAgfTsKICAgIGZhVmVudXNEb3VibGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidmVudXMtZG91YmxlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbOTg5MF0sICJmMjI2IiwgIk0xOTIgMjg4YTExMiAxMTIgMCAxIDAgMC0yMjQgMTEyIDExMiAwIDEgMCAwIDIyNHpNMzY4IDE3NmMwIDg2LjMtNjIuMSAxNTguMS0xNDQuMSAxNzMuMSAuMSAxIC4xIDEuOSAuMSAyLjlsMCA2NCAzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0zMiAwIDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0zMi0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDMyIDAgMC02NGMwLTEgMC0xLjkgLjEtMi45LTgyLTE1LTE0NC4xLTg2LjgtMTQ0LjEtMTczLjEgMC05Ny4yIDc4LjgtMTc2IDE3Ni0xNzZTMzY4IDc4LjggMzY4IDE3NnpNMzU3LjUgMzI3YzE0LjQtMTUuOCAyNi42LTMzLjcgMzYuMS01My4xIDE2LjEgOSAzNC43IDE0LjEgNTQuNSAxNC4xIDYxLjkgMCAxMTItNTAuMSAxMTItMTEyUzUwOS45IDY0IDQ0OCA2NGMtMTkuOCAwLTM4LjMgNS4xLTU0LjUgMTQuMS05LjUtMTkuNC0yMS42LTM3LjMtMzYuMS01My4xIDI2LjQtMTUuOSA1Ny40LTI1IDkwLjUtMjUgOTcuMiAwIDE3NiA3OC44IDE3NiAxNzYgMCA4Ni4zLTYyLjEgMTU4LjEtMTQ0LjEgMTczLjEgLjEgLjkgLjEgMS45IC4xIDIuOWwwIDY0IDMyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTMyIDAgMCAzMmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTMyLTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMzIgMCAwLTY0YzAtMSAwLTEuOSAuMS0yLjktMjEuMS0zLjktNDAuOS0xMS41LTU4LjYtMjIuMnoiXQogICAgfTsKICAgIGZhQ2xpcGJvYXJkUXVlc3Rpb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2xpcGJvYXJkLXF1ZXN0aW9uIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImU0ZTMiLCAiTTMxMS40IDMybDguNiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzUyYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmw4LjYgMEM4My42IDEyLjkgMTA0LjMgMCAxMjggMEwyNTYgMGMyMy43IDAgNDQuNCAxMi45IDU1LjQgMzJ6TTI0OCAxMTJjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRMMTM2IDY0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDExMiAwek0xOTIgMjQ4YzE2LjEgMCAyOS4yIDEzLjEgMjkuMiAyOS4yIDAgOC43LTMuMSAxMy45LTYuOSAxNy43LTQuNSA0LjQtMTAuNyA3LjUtMTYuOCA5LjUtMTQuOSA1LTI5LjUgMTkuMy0yOS41IDM5LjUgMCAxMy4zIDEwLjcgMjQgMjQgMjQgMTEuNSAwIDIxLjItOC4xIDIzLjUtMTkgMTkuMi03LjEgNTMuNy0yNi4zIDUzLjctNzEuOCAwLTQyLjYtMzQuNi03Ny4yLTc3LjItNzcuMnMtNzcuMiAzNC42LTc3LjIgNzcuMmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0YzAtMTYuMSAxMy4xLTI5LjIgMjkuMi0yOS4yem0yOCAxNjhjMC0xNS41LTEyLjUtMjgtMjgtMjhzLTI4IDEyLjUtMjggMjggMTIuNSAyOCAyOCAyOCAyOC0xMi41IDI4LTI4eiJdCiAgICB9OwogICAgZmFIb3Rkb2cgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG90ZG9nIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3Nzg5XSwgImY4MGYiLCAiTTI4OCAwYy0yMC41IDAtNDAuMSA4LjEtNTQuNiAyMi42TDIyLjYgMjMzLjRDOC4xIDI0Ny45IDAgMjY3LjUgMCAyODggMCAzMDAuMiAyLjkgMzEyLjEgOC4yIDMyMi43TDMyMi43IDguMkMzMTIuMSAyLjkgMzAwLjIgMCAyODggMHpNMjI0IDUxMmMyMC41IDAgNDAuMS04LjEgNTQuNi0yMi42TDQ4OS40IDI3OC42YzE0LjUtMTQuNSAyMi42LTM0LjEgMjIuNi01NC42IDAtMTIuMi0yLjktMjQuMS04LjItMzQuN0wxODkuMyA1MDMuOGMxMC43IDUuNCAyMi42IDguMiAzNC43IDguMnpNNDU2LjYgMTY4LjZjMzEuMi0zMS4yIDMxLjItODEuOSAwLTExMy4xcy04MS45LTMxLjItMTEzLjEgMGwtMjg4IDI4OGMtMzEuMiAzMS4yLTMxLjIgODEuOSAwIDExMy4xczgxLjkgMzEuMiAxMTMuMSAwbDI4OC0yODh6Il0KICAgIH07CiAgICBmYUFycm93VXBGcm9tQnJhY2tldCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy11cC1mcm9tLWJyYWNrZXQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTA5YSIsICJNMjQ2LjYgOS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMGwtMTI4IDEyOGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMEwxOTIgMTA5LjMgMTkyIDMyMGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjEwLjcgNzMuNCA3My40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTEyOC0xMjh6TTY0IDM1MmMwLTE3LjctMTQuMy0zMi0zMi0zMlMwIDMzNC4zIDAgMzUybDAgNjRjMCA1MyA0MyA5NiA5NiA5NmwyNTYgMGM1MyAwIDk2LTQzIDk2LTk2bDAtNjRjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMkw5NiA0NDhjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjR6Il0KICAgIH07CiAgICBmYU1pY3Jvc2NvcGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWljcm9zY29wZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODMwMF0sICJmNjEwIiwgIk0xNzYgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCAyMDhjMCAyNi41IDIxLjUgNDggNDggNDhsNjQgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTY0IDMyIDBjNzAuNyAwIDEyOCA1Ny4zIDEyOCAxMjhTMzkwLjcgNDQ4IDMyMCA0NDhMMzIgNDQ4Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDQ0OCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0xNi45IDBjMzAuNC0zNCA0OC45LTc4LjggNDguOS0xMjggMC0xMDYtODYtMTkyLTE5Mi0xOTJsLTMyIDAgMC04MGMwLTI2LjUtMjEuNS00OC00OC00OEwxNzYgMHpNMTIwIDM1MmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNzYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTc2IDB6Il0KICAgIH07CiAgICBmYUNsb3VkMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjbG91ZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzk3MjldLCAiZjBjMiIsICJNMCAzMzZjMCA3OS41IDY0LjUgMTQ0IDE0NCAxNDRsMzA0IDBjNzAuNyAwIDEyOC01Ny4zIDEyOC0xMjggMC01MS42LTMwLjUtOTYuMS03NC41LTExNi4zIDYuNy0xMy4xIDEwLjUtMjggMTAuNS00My43IDAtNTMtNDMtOTYtOTYtOTYtMTcuNyAwLTM0LjIgNC44LTQ4LjQgMTMuMS0yNC4xLTQ1LjgtNzIuMi03Ny4xLTEyNy42LTc3LjEtNzkuNSAwLTE0NCA2NC41LTE0NCAxNDQgMCA4IC43IDE1LjkgMS45IDIzLjUtNTYuOSAxOS4yLTk3LjkgNzMuMS05Ny45IDEzNi41eiJdCiAgICB9OwogICAgZmFCYXNlYmFsbEJhdEJhbGwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmFzZWJhbGwtYmF0LWJhbGwiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjQzMiIsICJNNDY0LjEgNTQ0YTgwIDgwIDAgMSAxIDAtMTYwIDgwIDgwIDAgMSAxIDAgMTYwem04LjQtNTc2YzE1LjEgMCAyOS43IDUuOCA0MC43IDE2LjJsNDcuMiA0NC44YzEyLjYgMTIgMTkuMSAyOSAxNy41IDQ2LjMtMS4yIDEzLjMtNyAyNS44LTE2LjUgMzUuMkwzNjMuMSAzMDljLTcuMyA3LjMtMTUuNyAxMy40LTI1IDE4TDIwNiAzOTNjLTkuMiA0LjYtMTcuNyAxMC43LTI1IDE4bC05MiA5MiAxLjcgMS44YzcuNyA5LjQgNy4xIDIzLjMtMS43IDMyLjFzLTIyLjcgOS4zLTMyLjEgMS43bC0xLjgtMS43LTQ4LTQ4LTEuNy0xLjhjLTcuNy05LjQtNy4xLTIzLjMgMS43LTMyLjFzMjIuNy05LjMgMzIuMS0xLjdsMS44IDEuNyA5Mi05MmM3LjMtNy4zIDEzLjQtMTUuNyAxOC0yNWw2Ni4xLTEzMi4xYzQuNi05LjIgMTAuNy0xNy43IDE4LTI1TDQzMC44LTE0LjdDNDQxLjktMjUuOCA0NTYuOS0zMiA0NzIuNS0zMnoiXQogICAgfTsKICAgIGZhQ2FyUmVhciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYXItcmVhciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJjYXItYWx0Il0sICJmNWRlIiwgIk0xNjUuNCA5NmwxODEuMiAwYzEzLjYgMCAyNS43IDguNiAzMC4yIDIxLjRsMjYuMSA3NC42LTI5My44IDAgMjYuMS03NC42YzQuNS0xMi44IDE2LjYtMjEuNCAzMC4yLTIxLjR6bS05MC42IC4zTDM5LjYgMTk2LjhDMTYuNCAyMDYuNCAwIDIyOS4zIDAgMjU2bDAgOTZjMCAyMy43IDEyLjkgNDQuNCAzMiA1NS40TDMyIDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMzIgMjU2IDAgMCAzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNDAuNmMxOS4xLTExLjEgMzItMzEuNyAzMi01NS40bDAtOTZjMC0yNi43LTE2LjQtNDkuNi0zOS42LTU5LjJMNDM3LjIgOTYuM0M0MjMuNyA1Ny44IDM4Ny40IDMyIDM0Ni42IDMyTDE2NS40IDMyYy00MC44IDAtNzcuMSAyNS44LTkwLjYgNjQuM3pNMjA4IDI4OGw5NiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtOTYgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2ek00OCAyODBjMC0xMy4zIDEwLjctMjQgMjQtMjRsMzIgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMzIgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjR6bTM2MC0yNGwzMiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0zMiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFDYXJBbHQgPSBmYUNhclJlYXI7CiAgICBmYVRodW1idGFja1NsYXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRodW1idGFjay1zbGFzaCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJ0aHVtYi10YWNrLXNsYXNoIl0sICJlNjhmIiwgIk00MS0yNC45Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMFMtMi4zLS4zIDcgOS4xbDUyOCA1MjhjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45TDQxNy44IDM1MiA0NDggMzUyYzEwIDAgMTkuNS00LjcgMjUuNS0xMi43czgtMTguNCA1LjItMjguMUw0NzUgMjk3LjhjLTEyLjQtNDMuMy00MS03OC41LTc4LjItOTkuN0wzODYuNSA2NCA0MTYgNjRjMTcuNyAwIDMyLTE0LjMgMzItMzJTNDMzLjcgMCA0MTYgMEwxNjAgMGMtNy40IDAtMTQuMSAyLjUtMTkuNSA2LjZMMTkwLjEgNTYuMyAxODUuMyAxMTkuNCA0MS0yNC45ek0yODIuMiAzNTJMMTQ5LjcgMjE5LjZjLTIyLjcgMjAuNS0zOS44IDQ3LjQtNDguNyA3OC4zbC0zLjggMTMuNGMtMi44IDkuNy0uOCAyMCA1LjIgMjguMVMxMTggMzUyIDEyOCAzNTJsMTU0LjIgMHpNMjU2IDUxMmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTEyLTY0IDAgMCAxMTJ6Il0KICAgIH07CiAgICBmYVRodW1iVGFja1NsYXNoID0gZmFUaHVtYnRhY2tTbGFzaDsKICAgIGZhUGx1c01pbnVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBsdXMtbWludXMiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZTQzYyIsICJNMjI0IDMyYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMTI4LTEyOCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDEyOCAwIDAgMTI4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xMjggMTI4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTEyOCAwIDAtMTI4ek0wIDQ4MGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwzMiA0NDhjLTE3LjcgMC0zMiAxNC4zLTMyIDMyeiJdCiAgICB9OwogICAgZmFIb3VzZUNpcmNsZUNoZWNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLWNpcmNsZS1jaGVjayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTA5IiwgIk00OTYgNTQ0YTE0NCAxNDQgMCAxIDEgMC0yODggMTQ0IDE0NCAwIDEgMSAwIDI4OHpNMjY4LjYgNi41YzEyLjItOS4zIDI5LjctOC43IDQxLjIgMmwyMTcuNiAyMDJjLTEwLjItMS43LTIwLjctMi42LTMxLjMtMi42LTc4LjYgMC0xNDYuMSA0Ny4yLTE3NS44IDExNC44LTUuMS0xLjgtMTAuNS0yLjgtMTYuMi0yLjhsLTMyIDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgOTYgOTEgMGM2LjEgMTcuMyAxNC42IDMzLjQgMjUuMSA0OEwxNDQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTE3Ni0xNiAwYy0xMy4yIDAtMjUtOC4xLTI5LjgtMjAuM3MtMS42LTI2LjIgOC0zNS4xbDIyNC0yMDggMi40LTJ6TTU1My40IDMzOS4xYy03LjEtNS4yLTE3LjEtMy42LTIyLjMgMy41bC01MyA3Mi44LTI2LjctMjYuOGMtNi4yLTYuMi0xNi40LTYuMi0yMi42IDAtNi4yIDYuMi02LjIgMTYuNCAwIDIyLjZsNDAgNDBjMy4zIDMuMyA3LjkgNSAxMi42IDQuN3M4LjktMi44IDExLjctNi42bDY0LTg4YzUuMi03LjEgMy42LTE3LjEtMy41LTIyLjN6Il0KICAgIH07CiAgICBmYUNhbGVuZGFyRGF5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhbGVuZGFyLWRheSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNzgzIiwgIk0xMjggMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDMyIDEyOCAwIDAtMzJjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDMyIDMyIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyODhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGwzMiAwIDAtMzJjMC0xNy43IDE0LjMtMzIgMzItMzJ6bTAgMjU2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDY0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDY0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtNjQgMHoiXQogICAgfTsKICAgIGZhQ2lyY2xlMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgzMDgsIDEyODMwOSwgMTI4OTkyLCAxMjg5OTMsIDEyODk5NCwgMTI4OTk1LCAxMjg5OTYsIDk2NzksIDk4OTgsIDk4OTksIDExMDQ0LCA2MTcwOCwgNjE5MTVdLCAiZjExMSIsICJNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHoiXQogICAgfTsKICAgIGZhTW9iaWxlVmlicmF0ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb2JpbGUtdmlicmF0ZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlODE2IiwgIk0zODQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDM4NGMwIDM1LjMtMjguNyA2NC02NCA2NGwtMTkyIDBjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMzg0YzAtMzUuMyAyOC43LTY0IDY0LTY0TDM4NCAwek0yNDggNDE2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDgwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTgwIDB6TTQ4LjggMTMzLjRjOS40LTcuNyAyMy4zLTcuMSAzMi4xIDEuNyA5LjQgOS40IDkuNCAyNC42IDAgMzMuOWwtMzEgMzEgMjUuNCAyNS40IDIuOSAzLjJjNi4zIDcuNyA5LjggMTcuNCA5LjggMjcuNCAwIDExLjUtNC42IDIyLjUtMTIuNyAzMC42bC0yNS40IDI1LjQgMzEgMzEgMS43IDEuOGM3LjcgOS40IDcuMSAyMy4zLTEuNyAzMi4xcy0yMi43IDkuMy0zMi4xIDEuN0w0NyAzNzcgMTIuNyAzNDIuNkM1LjYgMzM1LjUgMS4yIDMyNi4yIC4yIDMxNi4zTDAgMzEyIC4yIDMwNy43YzEtOS45IDUuNC0xOS4yIDEyLjUtMjYuM0wzOC4xIDI1NiAxMi43IDIzMC42QzUuNiAyMjMuNSAxLjIgMjE0LjIgLjIgMjA0LjNMMCAyMDAgLjIgMTk1LjdjMS05LjkgNS40LTE5LjIgMTIuNS0yNi4zTDQ3IDEzNSA0OC44IDEzMy40ek00OTUgMTM1YzguOC04LjggMjIuNy05LjMgMzIuMS0xLjdsMS44IDEuNyAzNC4zIDM0LjNjNy4xIDcuMSAxMS41IDE2LjQgMTIuNSAyNi4zbC4yIDQuMy0uMiA0LjNjLTEgOS45LTUuNCAxOS4yLTEyLjUgMjYuM2wtMjUuNCAyNS40IDI1LjQgMjUuNGM3LjEgNy4xIDExLjUgMTYuNCAxMi41IDI2LjNsLjIgNC4zLS4yIDQuM2MtMSA5LjktNS40IDE5LjItMTIuNSAyNi4zbC0zNC4zIDM0LjMtMS44IDEuN2MtOS40IDcuNy0yMy4zIDcuMS0zMi4xLTEuN3MtOS4zLTIyLjctMS43LTMyLjFsMS43LTEuOCAzMS0zMS0yNS40LTI1LjRjLTguMS04LjEtMTIuNy0xOS4xLTEyLjctMzAuNiAwLTEwIDMuNS0xOS43IDkuOC0yNy40bDIuOS0zLjIgMjUuNC0yNS40LTMxLTMxYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXoiXQogICAgfTsKICAgIGZhRmFjZUdyaW5TcXVpbnQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi1zcXVpbnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MTgsICJncmluLXNxdWludCJdLCAiZjU4NSIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTM4Ni43IDMwOC45YzExLjktMy43IDIzLjkgNi4zIDE5LjYgMTguMS0yMi40IDYxLjMtODEuMyAxMDUuMS0xNTAuMyAxMDUuMVMxMjguMSAzODguMiAxMDUuNyAzMjYuOWMtNC4zLTExLjggNy43LTIxLjggMTkuNi0xOC4xIDM5LjIgMTIuMiA4My43IDE5LjEgMTMwLjcgMTkuMXM5MS41LTYuOSAxMzAuNy0xOS4xek0xMjIuNiAxNDMuMmM0LjUtNi44IDEzLjMtOS4yIDIwLjYtNS41bDc5LjYgNDBjNS40IDIuNyA4LjggOC4yIDguOCAxNC4zcy0zLjQgMTEuNi04LjggMTQuM2wtNzkuNiA0MGMtNy4zIDMuNi0xNi4xIDEuMy0yMC42LTUuNXMtMy4xLTE1LjkgMy4xLTIxLjFMMTU5IDE5MiAxMjUuOCAxNjQuM2MtNi4yLTUuMi03LjYtMTQuMy0zLjEtMjEuMXptMjYzLjYgMjEuMUwzNTMgMTkyIDM4Ni4yIDIxOS43YzYuMiA1LjIgNy42IDE0LjMgMy4xIDIxLjFzLTEzLjMgOS4yLTIwLjYgNS41bC03OS42LTQwYy01LjQtMi43LTguOC04LjItOC44LTE0LjNzMy40LTExLjYgOC44LTE0LjNsNzkuNi00MGM3LjMtMy42IDE2LjEtMS4zIDIwLjYgNS41czMuMSAxNS45LTMuMSAyMS4xeiJdCiAgICB9OwogICAgZmFHcmluU3F1aW50MiA9IGZhRmFjZUdyaW5TcXVpbnQyOwogICAgZmFVc2Vyc0JldHdlZW5MaW5lcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1c2Vycy1iZXR3ZWVuLWxpbmVzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1OTEiLCAiTTI0IDE2bDUyOCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0TDI0IDY0QzEwLjcgNjQgMCA1My4zIDAgNDBTMTAuNyAxNiAyNCAxNnptMCA0NDhsNTI4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRMMjQgNTEyYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0ek0zOTIgMTkyYTU2IDU2IDAgMSAxIDExMiAwIDU2IDU2IDAgMSAxIC0xMTIgMHptMjcuMiAxMDAuNGM5LjEtMi45IDE4LjgtNC40IDI4LjgtNC40IDUzIDAgOTYgNDMgOTYgOTZsMCAxMC43YzAgMTEuOC05LjYgMjEuMy0yMS4zIDIxLjNsLTc4LjggMGMyLjctNy41IDQuMS0xNS42IDQuMS0yNGwwLThjMC0zNC4xLTEwLjYtNjUuNy0yOC44LTkxLjZ6bS0yNjIuNCAwQzEzOC42IDMxOC4zIDEyOCAzNDkuOSAxMjggMzg0bDAgOGMwIDguNCAxLjQgMTYuNSA0LjEgMjRsLTc4LjggMEM0MS42IDQxNiAzMiA0MDYuNCAzMiAzOTQuN0wzMiAzODRjMC01MyA0My05NiA5Ni05NiAxMCAwIDE5LjcgMS41IDI4LjggNC40ek03MiAxOTJhNTYgNTYgMCAxIDEgMTEyIDAgNTYgNTYgMCAxIDEgLTExMiAwem0xNTItMTZhNjQgNjQgMCAxIDEgMTI4IDAgNjQgNjQgMCAxIDEgLTEyOCAwek0xNzYgMzg0YzAtNjEuOSA1MC4xLTExMiAxMTItMTEyczExMiA1MC4xIDExMiAxMTJsMCA4YzAgMTMuMy0xMC43IDI0LTI0IDI0bC0xNzYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC04eiJdCiAgICB9OwogICAgZmFIb3VzZU1lZGljYWxDaXJjbGVYbWFyayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VzZS1tZWRpY2FsLWNpcmNsZS14bWFyayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTEzIiwgIk0zMDkuOCA4LjZjLTEyLjMtMTEuNC0zMS4zLTExLjQtNDMuNSAwbC0yMjQgMjA4Yy05LjYgOS0xMi44IDIyLjktOCAzNS4xUzUwLjggMjcyIDY0IDI3MmwxNiAwIDAgMTc2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE5NiAwYy0yMS4yLTI5LjUtMzQuMy02NS4zLTM1LjktMTA0TDI3MiA0MDhjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTQwLTQwIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmw0MCAwIDAtNDBjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgNDAgMjAgMGMzNC45LTQ4LjUgOTEuNy04MCAxNTYtODAgMTAuNyAwIDIxLjEgLjkgMzEuMyAyLjVMMzA5LjggOC42ek00OTYgNTQ0YTE0NCAxNDQgMCAxIDAgMC0yODggMTQ0IDE0NCAwIDEgMCAwIDI4OHptMjIuNi0xNDRsMzYuNyAzNi43YzYuMiA2LjIgNi4yIDE2LjQgMCAyMi42cy0xNi40IDYuMi0yMi42IDBsLTM2LjctMzYuNy0zNi43IDM2LjdjLTYuMiA2LjItMTYuNCA2LjItMjIuNiAwcy02LjItMTYuNCAwLTIyLjZsMzYuNy0zNi43LTM2LjctMzYuN2MtNi4yLTYuMi02LjItMTYuNCAwLTIyLjZzMTYuNC02LjIgMjIuNiAwbDM2LjcgMzYuNyAzNi43LTM2LjdjNi4yLTYuMiAxNi40LTYuMiAyMi42IDBzNi4yIDE2LjQgMCAyMi42TDUxOC42IDQwMHoiXQogICAgfTsKICAgIGZhVGFibGVMaXN0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRhYmxlLWxpc3QiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsidGgtbGlzdCJdLCAiZjAwYiIsICJNMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZ6bTY0IDBsMCA2NCA2NCAwIDAtNjQtNjQgMHptMzIwIDBsLTE5MiAwIDAgNjQgMTkyIDAgMC02NHpNNjQgMjI0bDAgNjQgNjQgMCAwLTY0LTY0IDB6bTMyMCAwbC0xOTIgMCAwIDY0IDE5MiAwIDAtNjR6TTY0IDM1MmwwIDY0IDY0IDAgMC02NC02NCAwem0zMjAgMGwtMTkyIDAgMCA2NCAxOTIgMCAwLTY0eiJdCiAgICB9OwogICAgZmFUaExpc3QgPSBmYVRhYmxlTGlzdDsKICAgIGZhRmxhc2tWaWFsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZsYXNrLXZpYWwiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTRmMyIsICJNMTg0LjYgNDExLjVjLTMuMSA3LjMtNS40IDE0LjktNi44IDIyLjYtMTQuNSA4LjgtMzEuNSAxMy45LTQ5LjggMTMuOS01MyAwLTk2LTQzLTk2LTk2TDMyIDY0QzE0LjMgNjQgMCA0OS43IDAgMzJTMTQuMyAwIDMyIDBMMjI0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsMCAyNTUuNi0zOS40IDkxLjl6TTk2IDY0bDAgMTI4IDY0IDAgMC0xMjgtNjQgMHpNMzUyIDBMNTEyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsMCAxNTMuNCA5MS4zIDIxM2MyLjMgNS40IDMuOCAxMS4xIDQuNCAxN2wuMyAuNi0uMyAwYy4yIDEuOCAuMyAzLjYgLjMgNS40IDAgMzIuMy0yNi4yIDU4LjYtNTguNiA1OC42bC0yNjYuOSAwYy0zMi4zIDAtNTguNi0yNi4yLTU4LjYtNTguNiAwLTEuOCAuMS0zLjYgLjMtNS40bC0uMyAwIC4zLS42Yy42LTUuOCAyLjEtMTEuNiA0LjQtMTdMMzIwIDIxNy40IDMyMCA2NGMtMTcuNyAwLTMyLTE0LjMtMzItMzJTMzAyLjMgMCAzMjAgMGwzMiAwek00NTMuMiAyNDIuNmMtMy40LTgtNS4yLTE2LjUtNS4yLTI1LjJsMC0xNTMuNC02NCAwIDAgMTUzLjRjMCA4LjctMS44IDE3LjItNS4yIDI1LjJsLTMzLjIgNzcuNCAxNDAuNyAwLTMzLjItNzcuNHoiXQogICAgfTsKICAgIGZhQ2lyY2xlRXhjbGFtYXRpb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLWV4Y2xhbWF0aW9uIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImV4Y2xhbWF0aW9uLWNpcmNsZSJdLCAiZjA2YSIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAxIDAtNTEyIDI1NiAyNTYgMCAxIDEgMCA1MTJ6bTAtMTkyYTMyIDMyIDAgMSAwIDAgNjQgMzIgMzIgMCAxIDAgMC02NHptMC0xOTJjLTE4LjIgMC0zMi43IDE1LjUtMzEuNCAzMy43bDcuNCAxMDRjLjkgMTIuNiAxMS40IDIyLjMgMjMuOSAyMi4zIDEyLjYgMCAyMy05LjcgMjMuOS0yMi4zbDcuNC0xMDRjMS4zLTE4LjItMTMuMS0zMy43LTMxLjQtMzMuN3oiXQogICAgfTsKICAgIGZhRXhjbGFtYXRpb25DaXJjbGUgPSBmYUNpcmNsZUV4Y2xhbWF0aW9uOwogICAgZmFUYXhpID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRheGkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg2NjIsICJjYWIiXSwgImYxYmEiLCAiTTE5MiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDMyLTguOSAwYy00MiAwLTc5LjEgMjcuMy05MS42IDY3LjRsLTIzIDczLjVDMTQuNSAyMTkuMSAwIDI0My45IDAgMjcyTDAgNDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMybDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0zMiAzMjAgMCAwIDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMybDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0xNzZjMC0yOC4xLTE0LjUtNTIuOS0zNi40LTY3LjFsLTIzLTczLjVDNDQwLjEgOTEuMyA0MDIuOSA2NCAzNjAuOSA2NGwtOC45IDAgMC0zMmMwLTE3LjctMTQuMy0zMi0zMi0zMkwxOTIgMHpNMTUxLjEgMTI4bDIwOS45IDBjMTQgMCAyNi40IDkuMSAzMC41IDIyLjVsMTMgNDEuNS0yOTYuOSAwIDEzLTQxLjVjNC4yLTEzLjQgMTYuNS0yMi41IDMwLjUtMjIuNXpNOTYgMjcyYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHptMjg4IDMyYTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6Il0KICAgIH07CiAgICBmYUNhYiA9IGZhVGF4aTsKICAgIGZhVGV4dFNsYXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRleHQtc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsicmVtb3ZlLWZvcm1hdCJdLCAiZjg3ZCIsICJNNDEtMjQuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTLTIuMy0uMyA3IDkuMWw1MjggNTI4YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOUwzMjIuNyAyNTYuOSAzNjguMiA5NiA0NzEgOTYgNDY1IDEyMC4yYy00LjMgMTcuMSA2LjEgMzQuNSAyMy4zIDM4LjhzMzQuNS02LjEgMzguOC0yMy4zbDExLTQ0LjFDNTQ1LjYgNjEuMyA1MjIuNyAzMiA0OTEuNSAzMmwtMzE5IDBjLTE5LjggMC0zNy4zIDEyLjEtNDQuNSAzMC4xbC04Ny04N3pNMTgwLjQgMTE0LjVsNC42LTE4LjUgMTE2LjcgMC0zMC44IDEwOS05MC41LTkwLjV6TTI0MSAzMTAuOEwyMTEuMyA0MTYgMTYwIDQxNmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwxNjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNDIuMiAwIDE1LjEtNTMuMy01MS45LTUxLjl6Il0KICAgIH07CiAgICBmYVJlbW92ZUZvcm1hdCA9IGZhVGV4dFNsYXNoOwogICAgZmFQZW9wbGVQdWxsaW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlb3BsZS1wdWxsaW5nIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1MzUiLCAiTTgwIDk2YTQ4IDQ4IDAgMSAwIDAtOTYgNDggNDggMCAxIDAgMCA5NnpNNjQgMTI4Yy0zNS4zIDAtNjQgMjguNy02NCA2NEwwIDMyMGMwIDE3LjcgMTQuMyAzMiAzMiAzMiA5LjggMCAxOC41LTQuNCAyNC40LTExLjJMODAuNCA0ODUuM2MyLjkgMTcuNCAxOS40IDI5LjIgMzYuOCAyNi4zczI5LjItMTkuNCAyNi4zLTM2LjhsLTIwLjUtMTIyLjcgMTUuNyAwIDMwIDEzNC45YzMuOCAxNy4zIDIwLjkgMjguMSAzOC4yIDI0LjNzMjguMS0yMC45IDI0LjMtMzguMmwtNTcuMy0yNTggMTE2LjMgNTMuOGMuNSAuMyAxLjEgLjUgMS42IC43IDguNiAzLjYgMTggMy4xIDI1LjktLjcgMy40LTEuNiA2LjYtMy45IDkuMy02LjcgMy4xLTMuMiA1LjUtNyA3LjEtMTEuNCAuMS0uMyAuMi0uNyAuMy0xbDIuNS03LjVjNS43LTE3LjEgMTguMy0zMC45IDM0LjctMzguMmw4LTMuNWMxLS40IDEuOS0uOCAyLjktMS4ybC0xNi45IDYzLjVjLTUuNiAyMS4xLS4xIDQzLjYgMTQuNyA1OS43bDcwLjcgNzcuMSAyMiA4OC4xYzQuMyAxNy4xIDIxLjcgMjcuNiAzOC44IDIzLjNzMjcuNi0yMS43IDIzLjMtMzguOGwtMjMtOTIuMWMtMS45LTcuOC01LjgtMTQuOS0xMS4yLTIwLjhsLTQ5LjUtNTQgMTkuMy02NS41IDkuNiAyM2M0LjQgMTAuNiAxMi41IDE5LjMgMjIuOCAyNC41bDI2LjcgMTMuM2MxNS44IDcuOSAzNSAxLjUgNDIuOS0xNC4zczEuNS0zNS0xNC4zLTQyLjlsLTIxLjQtMTAuNy0xNS4zLTM2LjhjLTE3LjEtNDEuMS01Ny4zLTY3LjktMTAxLjktNjcuOS0yMi44IDAtNDUuMyA0LjgtNjYuMSAxNGwtOCAzLjVjLTI0LjQgMTAuOS00NC42IDI5LTU4LjEgNTEuNkwxNTcuMyAxMzYuOUMxNDQuNyAxMzEgMTMwLjkgMTI4IDExNyAxMjhsLTUzIDB6TTQ2NCA5NmE0OCA0OCAwIDEgMCAwLTk2IDQ4IDQ4IDAgMSAwIDAgOTZ6TTM0OS43IDMzNS42bC0yNSA2Mi40LTU5LjQgNTkuNGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMEwzNzIuMyA0NDFjNC42LTQuNiA4LjItMTAuMSAxMC42LTE2LjFsMTQuNS0zNi4yLTQwLjctNDQuNGMtMi41LTIuNy00LjgtNS42LTctOC42eiJdCiAgICB9OwogICAgZmFCYWNrd2FyZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYWNrd2FyZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzkxOTRdLCAiZjA0YSIsICJNMjA0LjMgNDMuMUMyMTUuOSAzMiAyMzMgMjguOSAyNDcuNyAzNS4yUzI3MiA1NiAyNzIgNzJsMCAxMzYuMyAxNzIuMy0xNjUuMUM0NTUuOSAzMiA0NzMgMjguOSA0ODcuNyAzNS4yUzUxMiA1NiA1MTIgNzJsMCAzNjhjMCAxNi05LjYgMzAuNS0yNC4zIDM2LjhzLTMxLjggMy4yLTQzLjQtNy45TDI3MiAzMDMuNyAyNzIgNDQwYzAgMTYtOS42IDMwLjUtMjQuMyAzNi44cy0zMS44IDMuMi00My40LTcuOWwtMTkyLTE4NEM0LjUgMjc3LjMgMCAyNjYuOSAwIDI1NnM0LjUtMjEuMyAxMi4zLTI4LjlsMTkyLTE4NHoiXQogICAgfTsKICAgIGZhQ2FyQnVyc3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FyLWJ1cnN0IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbImNhci1jcmFzaCJdLCAiZjVlMSIsICJNMjMyIDE2LjFsMC00OGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDQ4YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjR6TTMyIDE2OC4xbDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTQ4IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjR6TTI4MS41IDcwLjZjOS40IDkuNCAyNC42IDkuNCAzMy45IDBsMzMuOS0zMy45YzkuNC05LjQgOS40LTI0LjYgMC0zMy45cy0yNC42LTkuNC0zMy45IDBMMjgxLjUgMzYuNmMtOS40IDkuNC05LjQgMjQuNiAwIDMzLjl6bS0xODEgMjE1bDMzLjktMzMuOWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwTDY2LjYgMjUxLjZjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMHpNNjYuNiAyLjdjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45bDMzLjkgMzMuOWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlMMTAwLjUgMi43QzkxLjEtNi43IDc2LTYuNyA2Ni42IDIuN3pNMzUyLjkgMTc1LjRMNTA1IDIxNi4yYzYuNCAxLjcgMTEuMSA3LjMgMTEuOCAxMy45bDcuMiA3NC0yMzEuNS02MiA0My4yLTYwLjVjMy45LTUuNCAxMC43LTcuOSAxNy4yLTYuMnpNMjIzLjYgMjI4LjVsLTIuMSAyLjljLTIxLjcgNS41LTM5LjkgMjIuMy00Ni4xIDQ1LjUtNC4xIDE1LjUtMTIuNCA0Ni40LTI0LjggOTIuN2wtOC4zIDMwLjljLTQuNiAxNy4xIDUuNiAzNC42IDIyLjYgMzkuMmwxNS41IDQuMWMxNy4xIDQuNiAzNC42LTUuNiAzOS4yLTIyLjZsOC4zLTMwLjkgMjc4LjIgNzQuNS04LjMgMzAuOWMtNC42IDE3LjEgNS42IDM0LjYgMjIuNiAzOS4ybDE1LjUgNC4xYzE3LjEgNC42IDM0LjYtNS42IDM5LjItMjIuNiA0LjEtMTUuNSAxMi40LTQ2LjQgMjQuOC05Mi43bDguMy0zMC45YzYuMi0yMy4yLTEuMS00Ni44LTE3LjItNjIuNWwtLjMtMy42LTEwLTEwM2MtMy4yLTMzLjItMjYuNy02MC45LTU4LjktNjkuNUwzNjkuNSAxMTMuNmMtMzIuMi04LjYtNjYuNCAzLjYtODUuOCAzMC44bC02MC4yIDg0LjJ6bTQ4LjcgNTcuOGEzMiAzMiAwIDEgMSAtMTYuNiA2MS44IDMyIDMyIDAgMSAxIDE2LjYtNjEuOHptMjA4LjEgODguOWEzMiAzMiAwIDEgMSA2MS44IDE2LjYgMzIgMzIgMCAxIDEgLTYxLjgtMTYuNnoiXQogICAgfTsKICAgIGZhQ2FyQ3Jhc2ggPSBmYUNhckJ1cnN0OwogICAgZmFMaW5rID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxpbmsiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgyNzksICJjaGFpbiJdLCAiZjBjMSIsICJNNDE5LjUgOTZjLTE2LjYgMC0zMi43IDQuNS00Ni44IDEyLjctMTUuOC0xNi0zNC4yLTI5LjQtNTQuNS0zOS41IDI4LjItMjQgNjQuMS0zNy4yIDEwMS4zLTM3LjIgODYuNCAwIDE1Ni41IDcwIDE1Ni41IDE1Ni41IDAgNDEuNS0xNi41IDgxLjMtNDUuOCAxMTAuNmwtNzEuMSA3MS4xYy0yOS4zIDI5LjMtNjkuMSA0NS44LTExMC42IDQ1LjgtODYuNCAwLTE1Ni41LTcwLTE1Ni41LTE1Ni41IDAtMS41IDAtMyAuMS00LjUgLjUtMTcuNyAxNS4yLTMxLjYgMzIuOS0zMS4xczMxLjYgMTUuMiAzMS4xIDMyLjljMCAuOSAwIDEuOCAwIDIuNiAwIDUxLjEgNDEuNCA5Mi41IDkyLjUgOTIuNSAyNC41IDAgNDgtOS43IDY1LjQtMjcuMWw3MS4xLTcxLjFjMTcuMy0xNy4zIDI3LjEtNDAuOSAyNy4xLTY1LjQgMC01MS4xLTQxLjQtOTIuNS05Mi41LTkyLjV6TTI3NS4yIDE3My4zYy0xLjktLjgtMy44LTEuOS01LjUtMy4xLTEyLjYtNi41LTI3LTEwLjItNDIuMS0xMC4yLTI0LjUgMC00OCA5LjctNjUuNCAyNy4xTDkxLjEgMjU4LjJjLTE3LjMgMTcuMy0yNy4xIDQwLjktMjcuMSA2NS40IDAgNTEuMSA0MS40IDkyLjUgOTIuNSA5Mi41IDE2LjUgMCAzMi42LTQuNCA0Ni43LTEyLjYgMTUuOCAxNiAzNC4yIDI5LjQgNTQuNiAzOS41LTI4LjIgMjMuOS02NCAzNy4yLTEwMS4zIDM3LjItODYuNCAwLTE1Ni41LTcwLTE1Ni41LTE1Ni41IDAtNDEuNSAxNi41LTgxLjMgNDUuOC0xMTAuNmw3MS4xLTcxLjFjMjkuMy0yOS4zIDY5LjEtNDUuOCAxMTAuNi00NS44IDg2LjYgMCAxNTYuNSA3MC42IDE1Ni41IDE1Ni45IDAgMS4zIDAgMi42IDAgMy45LS40IDE3LjctMTUuMSAzMS42LTMyLjggMzEuMnMtMzEuNi0xNS4xLTMxLjItMzIuOGMwLS44IDAtMS41IDAtMi4zIDAtMzMuNy0xOC02My4zLTQ0LjgtNzkuNnoiXQogICAgfTsKICAgIGZhQ2hhaW4gPSBmYUxpbms7CiAgICBmYUJhY2t3YXJkU3RlcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYWNrd2FyZC1zdGVwIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbInN0ZXAtYmFja3dhcmQiXSwgImYwNDgiLCAiTTM2MyAzNi44Yy0xMi45LTctMjguNy02LjMtNDEgMS44TDY0IDIwOC4xIDY0IDY0YzAtMTcuNy0xNC4zLTMyLTMyLTMyUzAgNDYuMyAwIDY0TDAgNDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xNDQuMSAyNTggMTY5LjZjMTIuMyA4LjEgMjggOC44IDQxIDEuOHMyMS0yMC41IDIxLTM1LjJsMC0zNjhjMC0xNC43LTguMS0yOC4yLTIxLTM1LjJ6Il0KICAgIH07CiAgICBmYVN0ZXBCYWNrd2FyZCA9IGZhQmFja3dhcmRTdGVwOwogICAgZmFYID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIngiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjBdLCAiNTgiLCAiTTM3Ni42IDg0LjVjMTEuMy0xMy42IDkuNS0zMy44LTQuMS00NS4xcy0zMy44LTkuNS00NS4xIDQuMUwxOTIgMjA2IDU2LjYgNDMuNUM0NS4zIDI5LjkgMjUuMSAyOC4xIDExLjUgMzkuNFMtMy45IDcwLjkgNy40IDg0LjVMMTUwLjMgMjU2IDcuNCA0MjcuNWMtMTEuMyAxMy42LTkuNSAzMy44IDQuMSA0NS4xczMzLjggOS41IDQ1LjEtNC4xTDE5MiAzMDYgMzI3LjQgNDY4LjVjMTEuMyAxMy42IDMxLjUgMTUuNCA0NS4xIDQuMXMxNS40LTMxLjUgNC4xLTQ1LjFMMjMzLjcgMjU2IDM3Ni42IDg0LjV6Il0KICAgIH07CiAgICBmYUNpcmNsZVVzZXIyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS11c2VyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjIxNDIsICJ1c2VyLWNpcmNsZSJdLCAiZjJiZCIsICJNMzk5IDM4NC4yQzM3Ni45IDM0NS44IDMzNS40IDMyMCAyODggMzIwbC02NCAwYy00Ny40IDAtODguOSAyNS44LTExMSA2NC4yIDM1LjIgMzkuMiA4Ni4yIDYzLjggMTQzIDYzLjhzMTA3LjgtMjQuNyAxNDMtNjMuOHpNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMjU2IDE2YTcyIDcyIDAgMSAwIDAtMTQ0IDcyIDcyIDAgMSAwIDAgMTQ0eiJdCiAgICB9OwogICAgZmFVc2VyQ2lyY2xlMiA9IGZhQ2lyY2xlVXNlcjI7CiAgICBmYVJlY3RhbmdsZUxpc3QyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJlY3RhbmdsZS1saXN0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImxpc3QtYWx0Il0sICJmMDIyIiwgIk02NCA2NEMyOC43IDY0IDAgOTIuNyAwIDEyOEwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwzODQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI1NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCA2NHptOTYgMjU2YTMyIDMyIDAgMSAxIC02NCAwIDMyIDMyIDAgMSAxIDY0IDB6bS0zMi05NmEzMiAzMiAwIDEgMSAwLTY0IDMyIDMyIDAgMSAxIDAgNjR6bTEyMC01NmwxNDQgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTQ0IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6bTAgMTI4bDE0NCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNDQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhTGlzdEFsdDIgPSBmYVJlY3RhbmdsZUxpc3QyOwogICAgZmFIYW5kMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI5MzA2LCA5OTk1LCAiaGFuZC1wYXBlciJdLCAiZjI1NiIsICJNMjg4IDMyYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMjA4YzAgOC44LTcuMiAxNi0xNiAxNnMtMTYtNy4yLTE2LTE2bDAtMTc2YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMjcyYzAgMS41IDAgMy4xIC4xIDQuNkw2Ny42IDI4M2MtMTYtMTUuMi00MS4zLTE0LjYtNTYuNiAxLjRTLTMuNiAzMjUuNyAxMi40IDM0MUwxMjQuOCA0NDhjNDMuMSA0MS4xIDEwMC40IDY0IDE2MCA2NGwxOS4yIDBjOTcuMiAwIDE3Ni03OC44IDE3Ni0xNzZsMC0yMDhjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAxMTJjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC0xNzZjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAxNzZjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC0yMDh6Il0KICAgIH07CiAgICBmYUhhbmRQYXBlcjIgPSBmYUhhbmQyOwogICAgZmFWYW5TaHV0dGxlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZhbi1zaHV0dGxlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4NjU2LCAic2h1dHRsZS12YW4iXSwgImY1YjYiLCAiTTY0IDY0QzI4LjcgNjQgMCA5Mi43IDAgMTI4TDAgMzM2YzAgMzUuMyAyOC43IDY0IDY0IDY0bC40IDBjNCA0NC45IDQxLjcgODAgODcuNiA4MHM4My42LTM1LjEgODcuNi04MGwxMDQuNyAwYzQgNDQuOSA0MS43IDgwIDg3LjYgODAgNDYuMSAwIDgzLjktMzUuNCA4Ny43LTgwLjUgMzEuNy0zLjggNTYuMy0zMC44IDU2LjMtNjMuNWwwLTEwMS4zYzAtMTMuOC00LjUtMjcuMy0xMi44LTM4LjRsLTgwLTEwNi43QzQ3MS4xIDczLjUgNDUyLjEgNjQgNDMyIDY0TDY0IDY0ek01MDQgMjI0bC0xMjAgMCAwLTk2IDQ4IDAgNzIgOTZ6TTY0IDIyNGwwLTk2IDk2IDAgMCA5Ni05NiAwem0xNjAgMGwwLTk2IDk2IDAgMCA5Ni05NiAwek0zOTIgMzkyYTQwIDQwIDAgMSAxIDgwIDAgNDAgNDAgMCAxIDEgLTgwIDB6TTE1MiAzNTJhNDAgNDAgMCAxIDEgMCA4MCA0MCA0MCAwIDEgMSAwLTgweiJdCiAgICB9OwogICAgZmFTaHV0dGxlVmFuID0gZmFWYW5TaHV0dGxlOwogICAgZmFTdGFpcnMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3RhaXJzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImUyODkiLCAiTTM4NCA2NGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwxMjggMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtOTYgMCAwIDk2YzAgMTcuNy0xNC4zIDMyLTMyIDMybC05NiAwIDAgOTZjMCAxNy43LTE0LjMgMzItMzIgMzJsLTk2IDAgMCA5NmMwIDE3LjctMTQuMyAzMi0zMiAzMkwzMiA0ODBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsOTYgMCAwLTk2YzAtMTcuNyAxNC4zLTMyIDMyLTMybDk2IDAgMC05NmMwLTE3LjcgMTQuMy0zMiAzMi0zMmw5NiAwIDAtOTZ6Il0KICAgIH07CiAgICBmYUhvcnNlSGVhZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3JzZS1oZWFkIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY3YWIiLCAiTTAgNDY0TDAgMzE2LjlDMCAyMDguNSA2OC4zIDExMS44IDE3MC41IDc1LjZMMzQwLjIgMTUuNWMyMS40LTcuNiA0My44IDguMyA0My44IDMwLjkgMCAxMS01LjUgMjEuMi0xNC42IDI3LjNMMzM2IDk2YzQ4LjEgMCA5MS4yIDI5LjggMTA4LjEgNzQuOWw0OC42IDEyOS41YzExLjggMzEuNCA0LjEgNjYuOC0xOS42IDkwLjUtMTYgMTYtMzcuOCAyNS4xLTYwLjUgMjUuMWwtMy40IDBjLTI2LjEgMC01MC45LTExLjYtNjcuNi0zMS43bC0zMi4zLTM4LjdjLTExLjcgNC4xLTI0LjIgNi40LTM3LjMgNi40bC0uMSAwYy02LjMgMC0xMi41LS41LTE4LjYtMS41LTMuNi0uNi03LjItMS40LTEwLjctMi4zbDAgMGMtMjguOS03LjgtNTMuMS0yNi44LTY3LjgtNTIuMi00LjQtNy43LTE0LjItMTAuMy0yMS45LTUuOHMtMTAuMyAxNC4yLTUuOCAyMS45YzI0IDQxLjUgNjguMyA3MCAxMTkuMyA3MS45bDQ3LjIgNzAuOGM0IDYuMSA2LjIgMTMuMiA2LjIgMjAuNCAwIDIwLjMtMTYuNSAzNi44LTM2LjggMzYuOEw0OCA1MTJjLTI2LjUgMC00OC0yMS41LTQ4LTQ4ek0zMjggMjI0YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiXQogICAgfTsKICAgIGZhVmF1bHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidmF1bHQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTJjNSIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NCAwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDI1NiAwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6TTI1NiAyNTZhNjQgNjQgMCAxIDAgLTEyOCAwIDY0IDY0IDAgMSAwIDEyOCAwek02NCAyNTZhMTI4IDEyOCAwIDEgMSAyNTYgMCAxMjggMTI4IDAgMSAxIC0yNTYgMHptMzg0LTQ4YzAgMTcuOC05LjcgMzMuMy0yNCA0MS42bDAgNzguNGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTc4LjRjLTE0LjMtOC4zLTI0LTIzLjgtMjQtNDEuNiAwLTI2LjUgMjEuNS00OCA0OC00OHM0OCAyMS41IDQ4IDQ4eiJdCiAgICB9OwogICAgZmFEcnVtU3RlZWxwYW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZHJ1bS1zdGVlbHBhbiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNTZhIiwgIk0yODggMzJjMTU5LjEgMCAyODggNDggMjg4IDEyOGwwIDE5MmMwIDgwLTEyOC45IDEyOC0yODggMTI4UzAgNDMyIDAgMzUyTDAgMTYwQzAgODAgMTI4LjkgMzIgMjg4IDMyek01MjggMTYwYzAtOS45LTgtMjkuOS01NS00OS44LTE4LjYtNy45LTQwLjktMTQuNC02Ni0xOS40bC0yNy44IDQzLjZjLTcuMyAxMS41LTExLjIgMjQuOC0xMS4yIDM4LjQgMCAxNy41IDYuNCAzNC40IDE4LjEgNDcuNWw5LjggMTFjMjkuOC01LjIgNTUuOS0xMi41IDc3LjItMjEuNSA0Ny4xLTE5LjkgNTUtMzkuOSA1NS00OS44ek0zNDkuMiAyMzcuM2MtOC0yNi4yLTMyLjQtNDUuMy02MS4yLTQ1LjNzLTUzLjMgMTkuMS02MS4yIDQ1LjNjMTkuNCAxLjcgMzkuOSAyLjcgNjEuMiAyLjdzNDEuOC0uOSA2MS4yLTIuN3pNMTY5IDkwLjhjLTI1LjIgNS00Ny40IDExLjYtNjYgMTkuNC00Ny4xIDE5LjktNTUgMzkuOS01NSA0OS44czggMjkuOSA1NSA0OS44YzIxLjMgOSA0Ny40IDE2LjMgNzcuMiAyMS41bDkuOC0xMWMxMS42LTEzLjEgMTguMS0zMCAxOC4xLTQ3LjUgMC0xMy42LTMuOS0yNi45LTExLjItMzguNEwxNjkgOTAuOHptNTYuMy04Yy0uOSA0LjMtMS40IDguNy0xLjQgMTMuMiAwIDM1LjMgMjguNyA2NCA2NCA2NHM2NC0yOC43IDY0LTY0YzAtNC41LS41LTktMS40LTEzLjItMTkuOC0xLjgtNDAuOC0yLjgtNjIuNi0yLjhzLTQyLjggMS02Mi42IDIuOHoiXQogICAgfTsKICAgIGZhVGh1bWJzVXAyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRodW1icy11cCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODA3NywgNjE1NzVdLCAiZjE2NCIsICJNODAgMTYwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMjU2YzAgMTcuNy0xNC4zIDMyLTMyIDMybC00OCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMkwwIDE5MmMwLTE3LjcgMTQuMy0zMiAzMi0zMmw0OCAwek0yNzAuNiAxNkMyOTcuOSAxNiAzMjAgMzguMSAzMjAgNjUuNGwwIDQuMmMwIDYuOC0xLjMgMTMuNi0zLjggMTkuOUwyODggMTYwIDQ0OCAxNjBjMjYuNSAwIDQ4IDIxLjUgNDggNDggMCAxOS43LTExLjkgMzYuNi0yOC45IDQ0IDE3IDcuNCAyOC45IDI0LjMgMjguOSA0NCAwIDIzLjQtMTYuOCA0Mi45LTM5IDQ3LjEgNC40IDcuMyA3IDE1LjggNyAyNC45IDAgMjIuMi0xNSA0MC44LTM1LjQgNDYuMyAyLjIgNS41IDMuNCAxMS41IDMuNCAxNy43IDAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC04Ny45IDBjLTM2LjMgMC03MS42LTEyLjQtOTkuOS0zNS4xTDE4NCA0MzUuMmMtMTUuMi0xMi4xLTI0LTMwLjUtMjQtNTBsMC0xODYuNmMwLTE0LjkgMy41LTI5LjYgMTAuMS00Mi45TDIyNi4zIDQzLjNDMjM0LjcgMjYuNiAyNTEuOCAxNiAyNzAuNiAxNnoiXQogICAgfTsKICAgIGZhU3RhbXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3RhbXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjViZiIsICJNMzEyIDIwMS44YzAtMTcuNCA5LjItMzMuMiAxOS45LTQ3IDEyLjYtMTYuMiAyMC4xLTM2LjYgMjAuMS01OC44IDAtNTMtNDMtOTYtOTYtOTZzLTk2IDQzLTk2IDk2YzAgMjIuMSA3LjUgNDIuNSAyMC4xIDU4LjggMTAuNyAxMy44IDE5LjkgMjkuNiAxOS45IDQ3IDAgMjkuOS0yNC4zIDU0LjItNTQuMiA1NC4yTDExMiAyNTZjLTYxLjkgMC0xMTIgNTAuMS0xMTIgMTEyIDAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDQxNiAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4IDAtNjEuOS01MC4xLTExMi0xMTItMTEybC0zMy44IDBjLTI5LjkgMC01NC4yLTI0LjMtNTQuMi01NC4yek01NiA0NjRjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDAwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRMNTYgNDY0eiJdCiAgICB9OwogICAgZmFNZW5vcmFoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1lbm9yYWgiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjY3NiIsICJNMjAuOCA3LjRDMjIuOCAyLjkgMjcuMSAwIDMyIDBzOS4yIDIuOSAxMS4yIDcuNEw2MS4zIDQ5LjdjMS44IDQuMSAyLjcgOC42IDIuNyAxMy4xTDY0IDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMyUzAgODEuNyAwIDY0bDAtMS4yYzAtNC41IC45LTguOSAyLjctMTMuMUwyMC44IDcuNHptOTYgMEMxMTguOCAyLjkgMTIzLjEgMCAxMjggMHM5LjIgMi45IDExLjIgNy40bDE4LjIgNDIuNGMxLjggNC4xIDIuNyA4LjYgMi43IDEzLjFsMCAxLjJjMCAxNy43LTE0LjMgMzItMzIgMzJTOTYgODEuNyA5NiA2NGwwLTEuMmMwLTQuNSAuOS04LjkgMi43LTEzLjFMMTE2LjggNy40em03Ny44IDQyLjRMMjEyLjggNy40QzIxNC44IDIuOSAyMTkuMSAwIDIyNCAwczkuMiAyLjkgMTEuMiA3LjRsMTguMiA0Mi40YzEuOCA0LjEgMi43IDguNiAyLjcgMTMuMWwwIDEuMmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTEuMmMwLTQuNSAuOS04LjkgMi43LTEzLjF6TTMwOC44IDcuNEMzMTAuOCAyLjkgMzE1LjEgMCAzMjAgMHM5LjIgMi45IDExLjIgNy40bDE4LjIgNDIuNGMxLjggNC4xIDIuNyA4LjYgMi43IDEzLjFsMCAxLjJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xLjJjMC00LjUgLjktOC45IDIuNy0xMy4xTDMwOC44IDcuNHptNzcuOCA0Mi40TDQwNC44IDcuNEM0MDYuOCAyLjkgNDExLjEgMCA0MTYgMHM5LjIgMi45IDExLjIgNy40bDE4LjIgNDIuNGMxLjggNC4xIDIuNyA4LjYgMi43IDEzLjFsMCAxLjJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xLjJjMC00LjUgLjktOC45IDIuNy0xMy4xek01MDAuOCA3LjRDNTAyLjggMi45IDUwNy4xIDAgNTEyIDBzOS4yIDIuOSAxMS4yIDcuNGwxOC4yIDQyLjRjMS44IDQuMSAyLjcgOC42IDIuNyAxMy4xbDAgMS4yYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMS4yYzAtNC41IC45LTguOSAyLjctMTMuMUw1MDAuOCA3LjR6bTc3LjggNDIuNEw1OTYuOCA3LjRDNTk4LjggMi45IDYwMy4xIDAgNjA4IDBzOS4yIDIuOSAxMS4yIDcuNGwxOC4yIDQyLjRjMS44IDQuMSAyLjcgOC42IDIuNyAxMy4xbDAgMS4yYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMS4yYzAtNC41IC45LTguOSAyLjctMTMuMXpNMzIgMTI4YzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTI4YzAgMTcuNyAxNC4zIDMyIDMyIDMybDE5MiAwIDAtMTYwYzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAxNjAgMTkyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0xMjhjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDEyOGMwIDUzLTQzIDk2LTk2IDk2bC0xOTIgMCAwIDY0IDEyOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0zMjAgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxMjggMCAwLTY0LTE5MiAwYy01MyAwLTk2LTQzLTk2LTk2TDAgMTYwYzAtMTcuNyAxNC4zLTMyIDMyLTMyem05NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTI4LTY0IDAgMC0xMjhjMC0xNy43IDE0LjMtMzIgMzItMzJ6bTk2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxMjgtNjQgMCAwLTEyOGMwLTE3LjcgMTQuMy0zMiAzMi0zMnptMTkyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxMjgtNjQgMCAwLTEyOGMwLTE3LjcgMTQuMy0zMiAzMi0zMnptOTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDEyOC02NCAwIDAtMTI4YzAtMTcuNyAxNC4zLTMyIDMyLTMyeiJdCiAgICB9OwogICAgZmFDaGlsZHJlbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGlsZHJlbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNGUxIiwgIk0xNjAuNSAwYTY0IDY0IDAgMSAxIDAgMTI4IDY0IDY0IDAgMSAxIDAtMTI4em0tNzIgNDgwbDAtODAtMTcuOCAwYy0xMC45IDAtMTguNi0xMC43LTE1LjItMjEuMUw4Ni43IDI4NS41IDU4IDMyMy4zYy0xMC43IDE0LjEtMzAuOCAxNi44LTQ0LjggNi4yUy0zLjcgMjk4LjcgNyAyODQuN0w2NS45IDIwN2MyMi40LTI5LjYgNTcuNS00NyA5NC42LTQ3czcyLjIgMTcuNCA5NC42IDQ3TDMxNCAyODQuN2MxMC43IDE0LjEgNy45IDM0LjItNi4yIDQ0LjhzLTM0LjIgNy45LTQ0LjgtNi4ybC0yOC43LTM3LjggMzEuMSA5My40YzMuNSAxMC40LTQuMyAyMS4xLTE1LjIgMjEuMWwtMTcuOCAwIDAgODBjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC04MC0xNiAwIDAgODBjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJ6TTQ4MC41IDBhNjQgNjQgMCAxIDEgMCAxMjggNjQgNjQgMCAxIDEgMC0xMjh6bS04IDM4NGwwIDk2YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTc5LjUtMTIuOSAyMC41Yy05LjQgMTUtMjkuMiAxOS40LTQ0LjEgMTBzLTE5LjQtMjkuMi0xMC00NC4xbDUxLjctODIuMWMxNy42LTI3LjkgNDguMy00NC45IDgxLjItNDQuOWwxMi4zIDBjMzMgMCA2My43IDE2LjkgODEuMiA0NC45TDYxOS42IDI4N2M5LjQgMTUgNC45IDM0LjctMTAgNDQuMXMtMzQuNyA0LjktNDQuMS0xMGwtMTIuOS0yMC41IDAgMTc5LjVjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC05Ni0xNiAweiJdCiAgICB9OwogICAgZmFDaGFydExpbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hhcnQtbGluZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJsaW5lLWNoYXJ0Il0sICJmMjAxIiwgIk02NCA2NGMwLTE3LjctMTQuMy0zMi0zMi0zMlMwIDQ2LjMgMCA2NEwwIDQwMGMwIDQ0LjIgMzUuOCA4MCA4MCA4MGw0MDAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkw4MCA0MTZjLTguOCAwLTE2LTcuMi0xNi0xNkw2NCA2NHptNDA2LjYgODYuNmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMEwzMjAgMjEwLjcgMjYyLjYgMTUzLjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwbC05NiA5NmMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMGw3My40LTczLjQgNTcuNCA1Ny40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwbDEyOC0xMjh6Il0KICAgIH07CiAgICBmYUxpbmVDaGFydCA9IGZhQ2hhcnRMaW5lOwogICAgZmFTcXVhcmVFbnZlbG9wZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtZW52ZWxvcGUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiZW52ZWxvcGUtc3F1YXJlIl0sICJmMTk5IiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyek0yMDkuMSAyNjcuOUwxMDguNCAyMDcuNGMtNy43LTQuNi0xMi40LTEyLjktMTIuNC0yMS45IDAtMTQuMSAxMS40LTI1LjUgMjUuNS0yNS41bDIwNC45IDBjMTQuMSAwIDI1LjUgMTEuNCAyNS41IDI1LjUgMCA5LTQuNyAxNy4zLTEyLjQgMjEuOUwyMzguOSAyNjcuOWMtNC41IDIuNy05LjYgNC4xLTE0LjkgNC4xcy0xMC40LTEuNC0xNC45LTQuMXpNMzUyIDIzNy4zbDAgODIuN2MwIDE3LjctMTQuMyAzMi0zMiAzMmwtMTkyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtODIuNyA5Ni43IDU4QzIwMi4xIDMwMSAyMTMgMzA0IDIyNCAzMDRzMjEuOS0zIDMxLjMtOC43bDk2LjctNTh6Il0KICAgIH07CiAgICBmYUVudmVsb3BlU3F1YXJlID0gZmFTcXVhcmVFbnZlbG9wZTsKICAgIGZhQmFuU21va2luZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYW4tc21va2luZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODY4NSwgInNtb2tpbmctYmFuIl0sICJmNTRkIiwgIk05OS41IDE0NC44bDc5LjIgNzkuMi01MC43IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTQ2LjcgMCA5Mi41IDkyLjVjLTMxLjQgMjIuNC02OS44IDM1LjUtMTExLjIgMzUuNS0xMDYgMC0xOTItODYtMTkyLTE5MiAwLTQxLjUgMTMuMS03OS45IDM1LjUtMTExLjJ6TTMzMy4zIDI4OGwtMzItMzIgODIuNyAwIDAgMzItNTAuNyAwem0zMiAzMmwxOC43IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0zMmMwLTE3LjctMTQuMy0zMi0zMi0zMkwyNjkuMyAyMjQgMTQ0LjggOTkuNWMzMS40LTIyLjQgNjkuOC0zNS41IDExMS4yLTM1LjUgMTA2IDAgMTkyIDg2IDE5MiAxOTIgMCA0MS41LTEzLjEgNzkuOS0zNS41IDExMS4yTDM2NS4zIDMyMHpNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTI3MiA5NmMtOC44IDAtMTYgNy4yLTE2IDE2IDAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2czcuMiAxNiAxNiAxNiAxNi03LjIgMTYtMTZjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNnMtNy4yLTE2LTE2LTE2eiJdCiAgICB9OwogICAgZmFTbW9raW5nQmFuID0gZmFCYW5TbW9raW5nOwogICAgZmFUcnVja0Zyb250ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRydWNrLWZyb250IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImUyYjciLCAiTTAgMTEyQzAgNjcuOCAzNS44IDMyIDgwIDMybDI4OCAwYzQ0LjIgMCA4MCAzNS44IDgwIDgwbDAgMjU2YzAgMjYuMi0xMi42IDQ5LjQtMzIgNjRsMCA0OGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMzIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0zMi0xOTIgMCAwIDMyYzAgMTcuNy0xNC4zIDMyLTMyIDMybC0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTQ4QzEyLjYgNDE3LjQgMCAzOTQuMiAwIDM2OEwwIDExMnptOTYgODBsMCA2NCAyNTYgMCAwLTY0YzAtMTcuNy0xNC4zLTMyLTMyLTMybC0xOTIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6bTMyIDE2MGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem0yMjQgMzJhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFCdWlsZGluZzIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnVpbGRpbmciLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjc5NzAsIDYxNjg3XSwgImYxYWQiLCAiTTY0IDBDMjguNyAwIDAgMjguNyAwIDY0TDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI1NiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzg0YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDB6TTE3NiAzNTJsMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDgwLTk2IDAgMC04MGMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNOTYgMTEyYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJ6TTI0MCA5NmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2ek05NiAyNDBjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMnptMTQ0LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZ6Il0KICAgIH07CiAgICBmYUJ1bGxzZXllID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJ1bGxzZXllIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxNDAiLCAiTTQ0OCAyNTZhMTkyIDE5MiAwIDEgMCAtMzg0IDAgMTkyIDE5MiAwIDEgMCAzODQgMHpNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMjU2IDgwYTgwIDgwIDAgMSAwIDAtMTYwIDgwIDgwIDAgMSAwIDAgMTYwem0wLTIyNGExNDQgMTQ0IDAgMSAxIDAgMjg4IDE0NCAxNDQgMCAxIDEgMC0yODh6TTIyNCAyNTZhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHoiXQogICAgfTsKICAgIGZhQXJyb3dMZWZ0TG9uZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy1sZWZ0LWxvbmciLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsibG9uZy1hcnJvdy1sZWZ0Il0sICJmMTc3IiwgIk05LjQgMjMzLjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zbDEyOCAxMjhjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBzMTIuNS0zMi44IDAtNDUuM0wxMDkuMyAyODggNTQ0IDI4OGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNDM0LjcgMCA3My40LTczLjRjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBsLTEyOCAxMjh6Il0KICAgIH07CiAgICBmYUxvbmdBcnJvd0xlZnQgPSBmYUFycm93TGVmdExvbmc7CiAgICBmYUNoZXNzUm9vazIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hlc3Mtcm9vayIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzk4MjBdLCAiZjQ0NyIsICJNMCAzMkwwIDEzMy41YzAgMTcgNi43IDMzLjMgMTguNyA0NS4zTDY0IDIyNCA2NCAzODQgNy44IDQ1NC4zQzIuNyA0NjAuNiAwIDQ2OC40IDAgNDc2LjUgMCA0OTYuMSAxNS45IDUxMiAzNS41IDUxMmwzMTIuOSAwYzE5LjYgMCAzNS41LTE1LjkgMzUuNS0zNS41IDAtOC4xLTIuNy0xNS45LTcuOC0yMi4ybC01Ni4yLTcwLjMgMC0xNjAgNDUuMy00NS4zYzEyLTEyIDE4LjctMjguMyAxOC43LTQ1LjNMMzg0IDMyYzAtMTcuNy0xNC4zLTMyLTMyLTMyTDMyMCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDMyLTQ4IDAgMC0zMmMwLTE3LjctMTQuMy0zMi0zMi0zMkwxNzYgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAzMi00OCAwIDAtMzJDOTYgMTQuMyA4MS43IDAgNjQgMEwzMiAwQzE0LjMgMCAwIDE0LjMgMCAzMnoiXQogICAgfTsKICAgIGZhQmxlbmRlclBob25lID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJsZW5kZXItcGhvbmUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjZiNiIsICJNMTUxLjQgMTMuMmMxMC4yIDUuOCAxNC41IDE4LjQgMTAgMjkuM0wxMzguMiA5OC44Yy0zLjkgOS42LTEzLjcgMTUuNC0yNCAxNC40bC0yMC4yLTJDNzguNyAxNTIuOSA3OCAxOTguOSA5MS45IDI0MS4xbDIyLjQtMi4yYzEwLjMtMSAyMCA0LjggMjQgMTQuNGwyMy4yIDU2LjNjNC41IDEwLjkgLjIgMjMuNC0xMCAyOS4zbC0yLjkgMS42Yy0zMy42IDE5LjItODEuNyAxNi4yLTEwNi4yLTIxLjYtNTYuMy04Ni42LTU2LjMtMTk5LjEgMC0yODUuNyAyNC42LTM3LjcgNzIuNy00MC43IDEwNi4yLTIxLjZsMi45IDEuNnpNMjI0IDMzNkwxOTMuNyAxNy41QzE5Mi44IDguMSAyMDAuMiAwIDIwOS42IDBsMzI0IDBjMjEuMyAwIDM2LjYgMjAuMyAzMC44IDQwLjhMNTUzLjEgODAgNDQwIDgwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDk5LjQgMC0xOC4zIDY0LTgxLjEgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw2Ny40IDAtMjcuNCA5Ni0yNTYgMHptOCA0OGwyNDAgMGMyMi4xIDAgNDAgMTcuOSA0MCA0MGwwIDQ4YzAgMjIuMS0xNy45IDQwLTQwIDQwbC0yNDAgMGMtMjIuMSAwLTQwLTE3LjktNDAtNDBsMC00OGMwLTIyLjEgMTcuOS00MCA0MC00MHptMTIwIDg4YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiXQogICAgfTsKICAgIGZhQXJyb3dUdXJuVXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctdHVybi11cCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJsZXZlbC11cCJdLCAiZjE0OCIsICJNMzIgNDQ4Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDk2IDBjNTMgMCA5Ni00MyA5Ni05NmwwLTMwNi43IDczLjQgNzMuNGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zbC0xMjgtMTI4Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMGwtMTI4IDEyOGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMEwxNjAgMTA5LjMgMTYwIDQxNmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtOTYgMHoiXQogICAgfTsKICAgIGZhTGV2ZWxVcCA9IGZhQXJyb3dUdXJuVXA7CiAgICBmYUJpY3ljbGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmljeWNsZSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzEyODY5MF0sICJmMjA2IiwgIk0zMzEuNyA0My4zQzMzNiAzNi4zIDM0My43IDMyIDM1MiAzMmwxMDQgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNjUuNiAwIDcyLjIgMTQ4LjRjMTAuNy0yLjkgMjEuOS00LjQgMzMuNC00LjQgNzAuNyAwIDEyOCA1Ny4zIDEyOCAxMjhzLTU3LjMgMTI4LTEyOCAxMjgtMTI4LTU3LjMtMTI4LTEyOGMwLTQyIDIwLjItNzkuMiA1MS40LTEwMi42bC0yMC40LTQxLjktNzMuNSAxNDdjLTIuMyA0LjgtNi4zIDguOC0xMS40IDExLjItLjYgLjMtMS4yIC41LTEuOCAuNy0yLjkgMS4xLTUuOSAxLjYtOC45IDEuNUwyNzEgMzY4Yy03LjkgNjMuMS02MS43IDExMi0xMjcgMTEyLTcwLjcgMC0xMjgtNTcuMy0xMjgtMTI4UzczLjMgMjI0IDE0NCAyMjRjMTAuOCAwIDIxLjIgMS4zIDMxLjIgMy44bDI4LjUtNTYuOS0xMS41LTI2LjktNDAuMiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDU2IDBjOS42IDAgMTguMyA1LjcgMjIuMSAxNC41bDE0LjMgMzMuNSAxMjMuNyAwLTM3LjctNzcuNWMtMy42LTcuNC0zLjItMTYuMiAxLjItMjMuMnpNMjI4LjUgMjI4LjdsLTQ1LjYgOTEuMyA4NC44IDAtMzkuMS05MS4zek0zMDUuNyAyODdsNDcuNS05NS04OC4yIDAgNDAuNyA5NXptMTY4LjcgNzUuNWwtMjkuNy02MWMtMTIuOCAxMy0yMC43IDMwLjgtMjAuNyA1MC41IDAgMzkuOCAzMi4yIDcyIDcyIDcyczcyLTMyLjIgNzItNzItMzIuMi03Mi03Mi03MmMtMi43IDAtNS41IC4yLTguMSAuNWwyOS43IDYxYzUuOCAxMS45IC44IDI2LjMtMTEuMSAzMi4xcy0yNi4zIC44LTMyLjEtMTEuMXpNMTQ5LjIgMzY4Yy0yMC4yIDAtMzMuNC0yMS4zLTI0LjMtMzkuNGwyNC4yLTQ4LjVjLTEuNy0uMS0zLjQtLjItNS4xLS4yLTM5LjggMC03MiAzMi4yLTcyIDcyczMyLjIgNzIgNzIgNzJjMzQuMyAwIDYyLjktMjMuOSA3MC4yLTU2bC02NSAweiJdCiAgICB9OwogICAgZmFDaXJjbGVBcnJvd0Rvd24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLWFycm93LWRvd24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiYXJyb3ctY2lyY2xlLWRvd24iXSwgImYwYWIiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0yMzkgMzc3bC04MC04MGMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDM5IDM5IDAtMTUwLjFjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDE1MC4xIDM5LTM5YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOWwtODAgODBjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAweiJdCiAgICB9OwogICAgZmFBcnJvd0NpcmNsZURvd24gPSBmYUNpcmNsZUFycm93RG93bjsKICAgIGZhR2VhciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnZWFyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTg4MSwgImNvZyJdLCAiZjAxMyIsICJNMTk1LjEgOS41QzE5OC4xLTUuMyAyMTEuMi0xNiAyMjYuNC0xNmw1OS44IDBjMTUuMiAwIDI4LjMgMTAuNyAzMS4zIDI1LjVMMzMyIDc5LjVjMTQuMSA2IDI3LjMgMTMuNyAzOS4zIDIyLjhsNjcuOC0yMi41YzE0LjQtNC44IDMwLjIgMS4yIDM3LjggMTQuNGwyOS45IDUxLjhjNy42IDEzLjIgNC45IDI5LjgtNi41IDM5LjlMNDQ3IDIzMy4zYy45IDcuNCAxLjMgMTUgMS4zIDIyLjdzLS41IDE1LjMtMS4zIDIyLjdsNTMuNCA0Ny41YzExLjQgMTAuMSAxNCAyNi44IDYuNSAzOS45bC0yOS45IDUxLjhjLTcuNiAxMy4xLTIzLjQgMTkuMi0zNy44IDE0LjRsLTY3LjgtMjIuNWMtMTIuMSA5LjEtMjUuMyAxNi43LTM5LjMgMjIuOGwtMTQuNCA2OS45Yy0zLjEgMTQuOS0xNi4yIDI1LjUtMzEuMyAyNS41bC01OS44IDBjLTE1LjIgMC0yOC4zLTEwLjctMzEuMy0yNS41bC0xNC40LTY5LjljLTE0LjEtNi0yNy4yLTEzLjctMzkuMy0yMi44TDczLjUgNDMyLjNjLTE0LjQgNC44LTMwLjItMS4yLTM3LjgtMTQuNEw1LjggMzY2LjFjLTcuNi0xMy4yLTQuOS0yOS44IDYuNS0zOS45bDUzLjQtNDcuNWMtLjktNy40LTEuMy0xNS0xLjMtMjIuN3MuNS0xNS4zIDEuMy0yMi43TDEyLjMgMTg1LjhjLTExLjQtMTAuMS0xNC0yNi44LTYuNS0zOS45TDM1LjcgOTQuMWM3LjYtMTMuMiAyMy40LTE5LjIgMzcuOC0xNC40bDY3LjggMjIuNWMxMi4xLTkuMSAyNS4zLTE2LjcgMzkuMy0yMi44TDE5NS4xIDkuNXpNMjU2LjMgMzM2YTgwIDgwIDAgMSAwIC0uNi0xNjAgODAgODAgMCAxIDAgLjYgMTYweiJdCiAgICB9OwogICAgZmFDb2cgPSBmYUdlYXI7CiAgICBmYU1hcnNBbmRWZW51c0J1cnN0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hcnMtYW5kLXZlbnVzLWJ1cnN0IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1MjMiLCAiTTQ2NC0zMmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzNC43IDAtNjMgNjNjLTI4LjQtMTkuNS02Mi43LTMxLTk5LjgtMzEtOTcuMiAwLTE3NiA3OC44LTE3NiAxNzYgMCA4Ni4zIDYyLjEgMTU4LjEgMTQ0IDE3My4xbDAgMzQuOS0zMiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDMyIDAgMCAzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzIgMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMzIgMCAwLTM0LjljODEuOS0xNSAxNDQtODYuOCAxNDQtMTczLjEgMC0zNy0xMS40LTcxLjQtMzEtOTkuOGw2My02MyAwIDM0LjdjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTExMmMwLTE3LjctMTQuMy0zMi0zMi0zMkw0OTYtNjRjLTE3LjcgMC0zMiAxNC4zLTMyIDMyek0zNjggOTZhMTEyIDExMiAwIDEgMSAwIDIyNCAxMTIgMTEyIDAgMSAxIDAtMjI0ek0xOTAuOS0yMS45QzE4OC40LTI4IDE4Mi42LTMyIDE3Ni0zMnMtMTIuNCA0LTE0LjkgMTAuMWwtMjkuNCA3NC03Ni4yLTIzLjFjLTYuMy0xLjktMTMuMSAuMi0xNy4yIDUuM1MzMy44IDQ2LjUgMzcgNTIuMmwzOS41IDY5LjEtNjUuNiA0NS4xYy01LjQgMy43LTggMTAuMy02LjUgMTYuN3M2LjcgMTEuMiAxMy4xIDEyLjJsNzguNyAxMi4yLTUuNiA3OS40Yy0uNSA2LjUgMy4xIDEyLjcgOSAxNS41czEyLjkgMS44IDE3LjgtMi42TDE1Mi4xIDI2OGMtNS4zLTE5LjEtOC4xLTM5LjItOC4xLTYwIDAtNjUuNCAyOC0xMjQuMiA3Mi42LTE2NS4xTDE5MC45LTIxLjl6Il0KICAgIH07CiAgICBmYU90dGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm90dGVyIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI5NDQ2XSwgImY3MDAiLCAiTTE4MS41IDE5Ny4xbDEyLjkgNi40YzUuOSAzIDEyLjQgNC41IDE5LjEgNC41IDIzLjUgMCA0Mi42LTE5LjEgNDIuNi00Mi42bDAtMjEuNGMwLTM1LjMtMjguNy02NC02NC02NGwtNjQgMGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCAyMS40YzAgMjMuNSAxOS4xIDQyLjYgNDIuNiA0Mi42IDYuNiAwIDEzLjEtMS41IDE5LjEtNC41IDkuMy00LjcgMTYuNC04LjIgMjEuMi0xMC42TDEzNS4xIDE4NWMtNC41LTMtNy4xLTgtNy4xLTEzLjNsMC0zLjdjMC0xMy4zIDEwLjctMjQgMjQtMjRsMTYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDMuN2MwIDUuMy0yLjcgMTAuMy03LjEgMTMuM2wtMTEuOCA3LjkgOC40IDQuMnptLTguNiA0OS40bC0xMi45LTYuNC0xMi45IDYuNGMtMTIuNiA2LjMtMjYuNSA5LjYtNDAuNSA5LjYtMy42IDAtNy4xLS4yLTEwLjYtLjZsMCAuNmMwIDM1LjMgMjguNyA2NCA2NCA2NGw2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybDE2MCAwIDAtNjRjMC0yMy43IDEyLjktNDQuNCAzMi01NS40IDkuNC01LjQgMjAuMy04LjYgMzItOC42bDAtMTZjMC0yNi41IDIxLjUtNDggNDgtNDggOC44IDAgMTYgNy4yIDE2IDE2bDAgOTZjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTk5LjdjMC00OC4yLTMwLjgtOTEtNzYuNi0xMDYuM2wtOC41LTIuOGMtOC0yLjctMTIuNi0xMS4xLTEwLjQtMTkuM3MxMC4zLTEzLjIgMTguNi0xMS42bDE5LjkgNEM1NzYgODYuMSA2NDAgMTY0LjIgNjQwIDI1NC45bDAgMS4xIDAgMGMwIDEyMy43LTEwMC4zIDIyNC0yMjQgMjI0bC0xNjAuNiAwQzEzMiA0ODAgMzIgMzgwIDMyIDI1Ni42bDAtMzkuOGMtMTAuMS0xNC42LTE2LTMyLjMtMTYtNTEuNGwwLTIxLjQgMC0xLjRDNi43IDEzOS4zIDAgMTMwLjUgMCAxMjAgMCAxMDYuNyAxMC43IDk2IDI0IDk2bDIuOCAwQzQ0LjggNTguMiA4My4zIDMyIDEyOCAzMmw2NCAwYzQ0LjcgMCA4My4yIDI2LjIgMTAxLjIgNjRsMi44IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjQgMCAxMC41LTYuNyAxOS4zLTE2IDIyLjZsMCAxLjQgMCAyMS40YzAgMS40IDAgMi44LS4xIDQuMyAxMi02LjIgMjUuNy05LjYgNDAuMS05LjZsOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC04IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgOCA1Ni40IDBjLTE1LjIgMTctMjQuNCAzOS40LTI0LjQgNjRsLTMyIDBjLTQyLjMgMC03OC4yLTI3LjQtOTEtNjUuMy01LjEgLjktMTAuMyAxLjMtMTUuNiAxLjMtMTQuMSAwLTI3LjktMy4zLTQwLjUtOS42ek05NiAxMjhhMTYgMTYgMCAxIDEgMCAzMiAxNiAxNiAwIDEgMSAwLTMyem0xMTIgMTZhMTYgMTYgMCAxIDEgMzIgMCAxNiAxNiAwIDEgMSAtMzIgMHoiXQogICAgfTsKICAgIGZhQ2lyY2xlQ2hldnJvbkxlZnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLWNoZXZyb24tbGVmdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJjaGV2cm9uLWNpcmNsZS1sZWZ0Il0sICJmMTM3IiwgIk01MTIgMjU2YTI1NiAyNTYgMCAxIDAgLTUxMiAwIDI1NiAyNTYgMCAxIDAgNTEyIDB6TTI3MSAxMzVjOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45bC04NyA4NyA4NyA4N2M5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwTDE2NyAyNzNjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45TDI3MSAxMzV6Il0KICAgIH07CiAgICBmYUNoZXZyb25DaXJjbGVMZWZ0ID0gZmFDaXJjbGVDaGV2cm9uTGVmdDsKICAgIGZhQ2lyY2xlUXVlc3Rpb24yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1xdWVzdGlvbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYyMTA4LCAicXVlc3Rpb24tY2lyY2xlIl0sICJmMDU5IiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnptMC0zMzZjLTE3LjcgMC0zMiAxNC4zLTMyIDMyIDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtNDQuMiAzNS44LTgwIDgwLTgwczgwIDM1LjggODAgODBjMCA0Ny4yLTM2IDY3LjItNTYgNzQuNWwwIDMuOGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTguMWMwLTIwLjUgMTQuOC0zNS4yIDMwLjEtNDAuMiA2LjQtMi4xIDEzLjItNS41IDE4LjItMTAuMyA0LjMtNC4yIDcuNy0xMCA3LjctMTkuNiAwLTE3LjctMTQuMy0zMi0zMi0zMnpNMjI0IDM2OGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAweiJdCiAgICB9OwogICAgZmFRdWVzdGlvbkNpcmNsZTIgPSBmYUNpcmNsZVF1ZXN0aW9uMjsKICAgIGZhV2Fsa2llVGFsa2llID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIndhbGtpZS10YWxraWUiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjhlZiIsICJNODgtMzJjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA3MiA0OCAwYzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMzIgMGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDE2IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAxNjAuOWMwIDkuOS0yLjMgMTkuNy02LjggMjguNmwtMjAuMiA0MC40Yy0zLjMgNi43LTUuMSAxNC01LjEgMjEuNWwwIDg0LjdjMCAzNS4zLTI4LjcgNjQtNjQgNjRMOTYgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTg0LjdjMC03LjUtMS43LTE0LjgtNS4xLTIxLjVMNi44IDMwMS41QzIuMyAyOTIuNiAwIDI4Mi44IDAgMjcyLjlMMCAxMTJDMCA4NS41IDIxLjUgNjQgNDggNjRsMTYgMCAwLTcyYzAtMTMuMyAxMC43LTI0IDI0LTI0em0zMiAxNzZjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTQ0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE0NCAwem0wIDk2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDE0NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xNDQgMHoiXQogICAgfTsKICAgIGZhVXNlckdyb3VwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXItZ3JvdXAiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgxMDEsICJ1c2VyLWZyaWVuZHMiXSwgImY1MDAiLCAiTTY0IDEyOGExMTIgMTEyIDAgMSAxIDIyNCAwIDExMiAxMTIgMCAxIDEgLTIyNCAwek0wIDQ2NGMwLTk3LjIgNzguOC0xNzYgMTc2LTE3NnMxNzYgNzguOCAxNzYgMTc2bDAgNmMwIDIzLjItMTguOCA0Mi00MiA0Mkw0MiA1MTJjLTIzLjIgMC00Mi0xOC44LTQyLTQybDAtNnpNNDMyIDY0YTk2IDk2IDAgMSAxIDAgMTkyIDk2IDk2IDAgMSAxIDAtMTkyem0wIDI0MGM3OS41IDAgMTQ0IDY0LjUgMTQ0IDE0NGwwIDIyLjRjMCAyMy0xOC42IDQxLjYtNDEuNiA0MS42bC0xNDQuOCAwYzYuNi0xMi41IDEwLjQtMjYuOCAxMC40LTQybDAtNmMwLTUxLjUtMTcuNC05OC45LTQ2LjUtMTM2LjcgMjIuNi0xNC43IDQ5LjYtMjMuMyA3OC41LTIzLjN6Il0KICAgIH07CiAgICBmYVVzZXJGcmllbmRzID0gZmFVc2VyR3JvdXA7CiAgICBmYUhvdXNlQ2hpbW5leSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VzZS1jaGltbmV5IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjM0OTksICJob21lLWxnIl0sICJlM2FmIiwgIk0yMzQuMiA4LjZjMTIuMy0xMS40IDMxLjMtMTEuNCA0My41IDBMMzY4IDkyLjMgMzY4IDgwYzAtMTcuNyAxNC4zLTMyIDMyLTMybDMyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxMDEuNSAzNy44IDM1LjFjOS42IDkgMTIuOCAyMi45IDggMzUuMVM0OTMuMiAyNzIgNDgwIDI3MmwtMTYgMCAwIDE3NmMwIDM1LjMtMjguNyA2NC02NCA2NGwtMjg4IDBjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMTc2LTE2IDBjLTEzLjIgMC0yNS04LjEtMjkuOC0yMC4zcy0xLjYtMjYuMiA4LTM1LjFsMjI0LTIwOHpNMjQwIDMyMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCA5NiAxMjggMCAwLTk2YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC0zMiAweiJdCiAgICB9OwogICAgZmFIb21lTGcgPSBmYUhvdXNlQ2hpbW5leTsKICAgIGZhUmlnaHRGcm9tQnJhY2tldCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyaWdodC1mcm9tLWJyYWNrZXQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsic2lnbi1vdXQtYWx0Il0sICJmMmY1IiwgIk01MDUgMjczYzkuNC05LjQgOS40LTI0LjYgMC0zMy45TDM2MSA5NWMtNi45LTYuOS0xNy4yLTguOS0yNi4yLTUuMlMzMjAgMTAyLjMgMzIwIDExMmwwIDgwLTExMiAwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDMyYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDExMiAwIDAgODBjMCA5LjcgNS44IDE4LjUgMTQuOCAyMi4yczE5LjMgMS43IDI2LjItNS4yTDUwNSAyNzN6TTE2MCA5NmMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkw5NiAzMkM0MyAzMiAwIDc1IDAgMTI4TDAgMzg0YzAgNTMgNDMgOTYgOTYgOTZsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNjQgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0yNTZjMC0xNy43IDE0LjMtMzIgMzItMzJsNjQgMHoiXQogICAgfTsKICAgIGZhU2lnbk91dEFsdCA9IGZhUmlnaHRGcm9tQnJhY2tldDsKICAgIGZhRmlsZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZSIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyODE5NiwgMTI4NDU5LCA2MTQ2Ml0sICJmMTViIiwgIk02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI3Ny41YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI1OC43IDE4LjdDMjQ2LjcgNi43IDIzMC41IDAgMjEzLjUgMEw2NCAwek0zMjUuNSAxNzZMMjMyIDE3NmMtMTMuMyAwLTI0LTEwLjctMjQtMjRMMjA4IDU4LjUgMzI1LjUgMTc2eiJdCiAgICB9OwogICAgZmFQbGFuZVNsYXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBsYW5lLXNsYXNoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImUwNjkiLCAiTTQxLTI0LjljLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwUy0yLjMtLjMgNyA5LjFsNTI4IDUyOGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTE4My40LTE4My40IDcuMS03LjcgMTI3LjMgMGMzMC45IDAgNTYtMjUuMSA1Ni01NnMtMjUuMS01Ni01Ni01NkwzOTIuNyAyMDAgMjMzLjUgMjYuNEMyMjcuNSAxOS44IDIxOC45IDE2IDIwOS45IDE2bC00My43IDBjLTEwLjkgMC0xOC42IDEwLjctMTUuMiAyMS4xTDE3NS4xIDEwOS4yIDQxLTI0Ljl6TTEzMC4yIDIwMGwtMjQuNiAwLTUyLjgtNjZjLTMtMy44LTcuNi02LTEyLjUtNmwtMTkuOCAwYy0xMC40IDAtMTggOS44LTE1LjUgMTkuOUwzMiAyNTYgNSAzNjQuMUMyLjQgMzc0LjIgMTAuMSAzODQgMjAuNSAzODRsMTkuOCAwYzQuOSAwIDkuNS0yLjIgMTIuNS02bDUyLjgtNjYgOTkuNyAwLTU0LjMgMTYyLjljLTMuNSAxMC40IDQuMyAyMS4xIDE1LjIgMjEuMWw0My43IDBjOSAwIDE3LjUtMy44IDIzLjYtMTAuNEwzMjAuNyAzOTAuNSAxMzAuMiAyMDB6Il0KICAgIH07CiAgICBmYUNsb3VkU2hvd2Vyc0hlYXZ5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNsb3VkLXNob3dlcnMtaGVhdnkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjc0MCIsICJNOTYgMzIwYy01MyAwLTk2LTQzLTk2LTk2IDAtNDIuNSAyNy42LTc4LjYgNjUuOS05MS4yLTEuMy02LjctMS45LTEzLjctMS45LTIwLjggMC02MS45IDUwLjEtMTEyIDExMi0xMTIgNDMuMSAwIDgwLjUgMjQuMyA5OS4yIDYwIDE0LjctMTcuMSAzNi41LTI4IDYwLjgtMjggNDQuMiAwIDgwIDM1LjggODAgODAgMCA1LjUtLjYgMTAuOC0xLjYgMTYgLjUgMCAxLjEgMCAxLjYgMCA1MyAwIDk2IDQzIDk2IDk2cy00MyA5Ni05NiA5Nkw5NiAzMjB6bTYuOCA3OS42bC0zMiA5NkM2Ni42IDUwOC4yIDUzIDUxNSA0MC40IDUxMC44UzIxIDQ5MyAyNS4yIDQ4MC40bDMyLTk2QzYxLjQgMzcxLjggNzUgMzY1IDg3LjYgMzY5LjJTMTA3IDM4NyAxMDIuOCAzOTkuNnptMTIwIDBsLTMyIDk2Yy00LjIgMTIuNi0xNy44IDE5LjQtMzAuNCAxNS4yUzE0MSA0OTMgMTQ1LjIgNDgwLjRsMzItOTZjNC4yLTEyLjYgMTcuOC0xOS40IDMwLjQtMTUuMlMyMjcgMzg3IDIyMi44IDM5OS42em0xMTIgMGwtMzIgOTZjLTQuMiAxMi42LTE3LjggMTkuNC0zMC40IDE1LjJTMjUzIDQ5MyAyNTcuMiA0ODAuNGwzMi05NmM0LjItMTIuNiAxNy44LTE5LjQgMzAuNC0xNS4yUzMzOSAzODcgMzM0LjggMzk5LjZ6bTEyMCAwbC0zMiA5NmMtNC4yIDEyLjYtMTcuOCAxOS40LTMwLjQgMTUuMlMzNzMgNDkzIDM3Ny4yIDQ4MC40bDMyLTk2YzQuMi0xMi42IDE3LjgtMTkuNCAzMC40LTE1LjJTNDU5IDM4NyA0NTQuOCAzOTkuNnoiXQogICAgfTsKICAgIGZhUGVyc29uRmFsbGluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tZmFsbGluZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTQ2IiwgIk0zMjAgMzJjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA1LjRjMCA0NS0yMy42IDg2LjYtNjIuMSAxMDkuOGwtNC42IDIuOEMxMzEuNCAxODQuNyA5NiAyNDcuMSA5NiAzMTQuNkw5NiAzODRjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTY5LjRjMC0xNi43IDMuMy0zMyA5LjQtNDhMMzU5LjIgNTAwLjJjMTEuMSAxMy43IDMxLjMgMTUuOCA0NSA0LjdzMTUuOC0zMS4zIDQuNy00NUwyOTUuMiAzMjAgNDAwIDMyMCA0MzguNCAzNzEuMmMxMC42IDE0LjEgMzAuNyAxNyA0NC44IDYuNHMxNy0zMC43IDYuNC00NC44bC00My4yLTU3LjZDNDM3LjMgMjYzLjEgNDIzLjEgMjU2IDQwOCAyNTZsLTg5IDAtNjIuOS03NS41YzQwLjMtMzYgNjMuOS04Ny45IDYzLjktMTQzLjFsMC01LjR6TTEwNCAxNDRhNTYgNTYgMCAxIDAgMC0xMTIgNTYgNTYgMCAxIDAgMCAxMTJ6Il0KICAgIH07CiAgICBmYVR1cm5Eb3duID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInR1cm4tZG93biIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEwNTQ5LCAibGV2ZWwtZG93bi1hbHQiXSwgImYzYmUiLCAiTTE2OS40IDUwMi42YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwbDEyOC0xMjhjOS4yLTkuMiAxMS45LTIyLjkgNi45LTM0LjlTMzMyLjkgMzIwIDMyMCAzMjBsLTY0IDAgMC0xNjBDMjU2IDcxLjYgMTg0LjQgMCA5NiAwTDMyIDBDMTQuMyAwIDAgMTQuMyAwIDMyTDAgOTZjMCAxNy43IDE0LjMgMzIgMzIgMzJsNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDE2MC02NCAwYy0xMi45IDAtMjQuNiA3LjgtMjkuNiAxOS44cy0yLjIgMjUuNyA2LjkgMzQuOWwxMjggMTI4eiJdCiAgICB9OwogICAgZmFMZXZlbERvd25BbHQgPSBmYVR1cm5Eb3duOwogICAgZmFVcFJpZ2h0QW5kRG93bkxlZnRGcm9tQ2VudGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVwLXJpZ2h0LWFuZC1kb3duLWxlZnQtZnJvbS1jZW50ZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiZXhwYW5kLWFsdCJdLCAiZjQyNCIsICJNMzQ0IDBMNDg4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCAxNDRjMCA5LjctNS44IDE4LjUtMTQuOCAyMi4ycy0xOS4zIDEuNy0yNi4yLTUuMmwtMzktMzktODcgODdjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwbC0zMi0zMmMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlsODctODctMzktMzljLTYuOS02LjktOC45LTE3LjItNS4yLTI2LjJTMzM0LjMgMCAzNDQgMHpNMTY4IDUxMkwyNCA1MTJjLTEzLjMgMC0yNC0xMC43LTI0LTI0TDAgMzQ0YzAtOS43IDUuOC0xOC41IDE0LjgtMjIuMlMzNC4xIDMyMC4yIDQxIDMyN2wzOSAzOSA4Ny04N2M5LjQtOS40IDI0LjYtOS40IDMzLjkgMGwzMiAzMmM5LjQgOS40IDkuNCAyNC42IDAgMzMuOWwtODcgODcgMzkgMzljNi45IDYuOSA4LjkgMTcuMiA1LjIgMjYuMlMxNzcuNyA1MTIgMTY4IDUxMnoiXQogICAgfTsKICAgIGZhRXhwYW5kQWx0ID0gZmFVcFJpZ2h0QW5kRG93bkxlZnRGcm9tQ2VudGVyOwogICAgZmFVc2VyVGFnID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXItdGFnIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY1MDciLCAiTTI1Ni4xIDhhMTIwIDEyMCAwIDEgMSAwIDI0MCAxMjAgMTIwIDAgMSAxIDAtMjQwek0yMjYuNCAzMDRsNTkuNCAwYzYuNyAwIDEzLjIgLjQgMTkuNyAxLjEtLjkgNC45LTEuNCA5LjktMS40IDE1bDAgOTIuMWMwIDI1LjUgMTAuMSA0OS45IDI4LjEgNjcuOWwzMS45IDMxLjktMjg2LjMgMGMtMTYuNCAwLTI5LjctMTMuMy0yOS43LTI5LjcgMC05OC41IDc5LjgtMTc4LjMgMTc4LjMtMTc4LjN6TTM1Mi4xIDQxMi4ybDAtOTIuMWMwLTE3LjcgMTQuMy0zMiAzMi0zMmw5Mi4xIDBjMTIuNyAwIDI0LjkgNS4xIDMzLjkgMTQuMWw5NiA5NmMxOC43IDE4LjcgMTguNyA0OS4xIDAgNjcuOWwtNzYuMSA3Ni4xYy0xOC43IDE4LjctNDkuMSAxOC43LTY3LjkgMGwtOTYtOTZjLTktOS0xNC4xLTIxLjItMTQuMS0zMy45em0xMDQtNDQuMmEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAweiJdCiAgICB9OwogICAgZmFIYW5kU3BhcmtsZXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1zcGFya2xlcyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlMDVkIiwgIk0zMjAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDIwOGMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtMTc2YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAxNzZjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTExMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMTc4LjJjLTE5LjIgNS40LTM0LjcgMjAuNC00MC40IDQwLjNsLTYuNSAyMi43LTIyLjcgNi41Yy0yNS4yIDcuMi00Mi41IDMwLjItNDIuNSA1Ni40IDAgMjIuMSAxMi40IDQyIDMxLjQgNTEuOS0yNy41IDE3LjgtNjAuMiAyOC4xLTk1LjQgMjguMWwtMTkuMiAwYy01OS42IDAtMTE2LjktMjIuOS0xNjAtNjRMNzYuNCAzNDFjLTE2LTE1LjItMTYuNi00MC42LTEuNC01Ni42czQwLjYtMTYuNiA1Ni42LTEuNGw2MC41IDU3LjZjMC0xLjUtLjEtMy4xLS4xLTQuNmwwLTI3MmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMTc2YzAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZsMC0yMDhjMC0xNy43IDE0LjMtMzIgMzItMzJ6bS03LjMgMzI2LjZjLTEuMS0zLjktNC43LTYuNi04LjctNi42cy03LjYgMi43LTguNyA2LjZsLTcuMyAyNS40LTI1LjQgNy4zYy0zLjkgMS4xLTYuNiA0LjctNi42IDguN3MyLjcgNy42IDYuNiA4LjdsMjUuNCA3LjMgNy4zIDI1LjRjMS4xIDMuOSA0LjcgNi42IDguNyA2LjZzNy42LTIuNyA4LjctNi42bDcuMy0yNS40IDI1LjQtNy4zYzMuOS0xLjEgNi42LTQuNyA2LjYtOC43cy0yLjctNy42LTYuNi04LjdsLTI1LjQtNy4zLTcuMy0yNS40ek0xMDQgMTIwbDQ4LjMgMTMuOGM0LjYgMS4zIDcuNyA1LjUgNy43IDEwLjJzLTMuMSA4LjktNy43IDEwLjJMMTA0IDE2OCA5MC4yIDIxNi4zYy0xLjMgNC42LTUuNSA3LjctMTAuMiA3LjdzLTguOS0zLjEtMTAuMi03LjdMNTYgMTY4IDcuNyAxNTQuMkMzLjEgMTUyLjkgMCAxNDguNyAwIDE0NHMzLjEtOC45IDcuNy0xMC4yTDU2IDEyMCA2OS44IDcxLjdDNzEuMSA2Ny4xIDc1LjMgNjQgODAgNjRzOC45IDMuMSAxMC4yIDcuN0wxMDQgMTIwek01ODQgNDA4bDQ4LjMgMTMuOGM0LjYgMS4zIDcuNyA1LjUgNy43IDEwLjJzLTMuMSA4LjktNy43IDEwLjJMNTg0IDQ1NiA1NzAuMiA1MDQuM2MtMS4zIDQuNi01LjUgNy43LTEwLjIgNy43cy04LjktMy4xLTEwLjItNy43TDUzNiA0NTYgNDg3LjcgNDQyLjJjLTQuNi0xLjMtNy43LTUuNS03LjctMTAuMnMzLjEtOC45IDcuNy0xMC4yTDUzNiA0MDggNTQ5LjggMzU5LjdjMS4zLTQuNiA1LjUtNy43IDEwLjItNy43czguOSAzLjEgMTAuMiA3LjdMNTg0IDQwOHoiXQogICAgfTsKICAgIGZhQXJyb3dzVG9Eb3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3dzLXRvLWRvdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNGJlIiwgIk0yNTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDMyIDMyIDBjMTIuOSAwIDI0LjYgNy44IDI5LjYgMTkuOHMyLjIgMjUuNy02LjkgMzQuOWwtNjQgNjRjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwbC02NC02NGMtOS4yLTkuMi0xMS45LTIyLjktNi45LTM0LjlTMTc5LjEgNjQgMTkyIDY0bDMyIDAgMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNMTY5LjQgMzkzLjRsNjQtNjRjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBsNjQgNjRjOS4yIDkuMiAxMS45IDIyLjkgNi45IDM0LjlTMzMyLjkgNDQ4IDMyMCA0NDhsLTMyIDAgMCAzMmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTMyLTMyIDBjLTEyLjkgMC0yNC42LTcuOC0yOS42LTE5LjhzLTIuMi0yNS43IDYuOS0zNC45ek0zMiAyMjRsMzIgMCAwLTMyYzAtMTIuOSA3LjgtMjQuNiAxOS44LTI5LjZzMjUuNy0yLjIgMzQuOSA2LjlsNjQgNjRjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNsLTY0IDY0Yy05LjIgOS4yLTIyLjkgMTEuOS0zNC45IDYuOVM2NCAzMzIuOSA2NCAzMjBsMC0zMi0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMyem0yOTcuNCA1NC42Yy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM2w2NC02NGM5LjItOS4yIDIyLjktMTEuOSAzNC45LTYuOVM0NDggMTc5LjEgNDQ4IDE5MmwwIDMyIDMyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTMyIDAgMCAzMmMwIDEyLjktNy44IDI0LjYtMTkuOCAyOS42cy0yNS43IDIuMi0zNC45LTYuOWwtNjQtNjR6TTI1NiAyMjRhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFGYWNlU2FkQ3J5MiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLXNhZC1jcnkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1NTcsICJzYWQtY3J5Il0sICJmNWIzIiwgIk0zNTIgNDkzLjRjLTI5LjYgMTItNjIuMSAxOC42LTk2IDE4LjZzLTY2LjQtNi42LTk2LTE4LjZMMTYwIDI5NmMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDE3MS43QzQ0LjQgNDIxLjYgMCAzNDQgMCAyNTYgMCAxMTQuNiAxMTQuNiAwIDI1NiAwUzUxMiAxMTQuNiA1MTIgMjU2YzAgODgtNDQuNCAxNjUuNi0xMTIgMjExLjdMNDAwIDI5NmMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDE5Ny40ek0xNTIgMTk2bDE2IDBjMTEgMCAyMCA5IDIwIDIwczkgMjAgMjAgMjAgMjAtOSAyMC0yMGMwLTMzLjEtMjYuOS02MC02MC02MGwtMTYgMGMtMzMuMSAwLTYwIDI2LjktNjAgNjAgMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjAgOS0yMCAyMC0yMHptMTcyIDIwYzAtMTEgOS0yMCAyMC0yMGwxNiAwYzExIDAgMjAgOSAyMCAyMHM5IDIwIDIwIDIwIDIwLTkgMjAtMjBjMC0zMy4xLTI2LjktNjAtNjAtNjBsLTE2IDBjLTMzLjEgMC02MCAyNi45LTYwIDYwIDAgMTEgOSAyMCAyMCAyMHMyMC05IDIwLTIwek0yMDggMzM2bDAgMzJjMCAyNi41IDIxLjUgNDggNDggNDhzNDgtMjEuNSA0OC00OGwwLTMyYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4cy00OCAyMS41LTQ4IDQ4eiJdCiAgICB9OwogICAgZmFTYWRDcnkyID0gZmFGYWNlU2FkQ3J5MjsKICAgIGZhRG9uZ1NpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZG9uZy1zaWduIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImUxNjkiLCAiTTI4OC0xNmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAzMi0xMDQgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxMDQgMCAwIDcyLjJjLTIyLjktMTUuMy01MC40LTI0LjItODAtMjQuMi03OS41IDAtMTQ0IDY0LjUtMTQ0IDE0NFM5Ni41IDQzMiAxNzYgNDMyYzMwIDAgNTcuOC05LjEgODAuOC0yNC44IDMuMyAxNC4yIDE2IDI0LjggMzEuMiAyNC44IDE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMzA0IDQwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTQwIDAgMC0zMmMwLTE3LjctMTQuMy0zMi0zMi0zMnpNOTYgMjg4YTgwIDgwIDAgMSAxIDE2MCAwIDgwIDgwIDAgMSAxIC0xNjAgMHpNMjQgNDY0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDMzNiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0TDI0IDQ2NHoiXQogICAgfTsKICAgIGZhUGVvcGxlTGluZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZW9wbGUtbGluZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTM0IiwgIk0yODggMGE2NCA2NCAwIDEgMSAwIDEyOCA2NCA2NCAwIDEgMSAwLTEyOHptOTYgMzEyYzAgMjUtMTIuNyA0Ny0zMiA1OS45bDAgNDQuMS0xMjggMCAwLTQ0LjFDMjA0LjcgMzU5IDE5MiAzMzcgMTkyIDMxMmwwLTQwYzAtNTMgNDMtOTYgOTYtOTZzOTYgNDMgOTYgOTZsMCA0MHptMTYgMTA0bDAtMjcuM2MxOS45LTIyLjUgMzItNTIuMiAzMi04NC43bDAtMzJjMC0yNi43LTcuMy01MS42LTE5LjktNzMuMSAxMS4xLTQuNSAyMy4yLTYuOSAzNS45LTYuOSA1MyAwIDk2IDQzIDk2IDk2bDAgMzJjMCAyMy43LTEyLjkgNDQuNC0zMiA1NS40bDAgNDAuNi0xMTIgMHpNNjQgMzc1LjRDNDQuOSAzNjQuNCAzMiAzNDMuNyAzMiAzMjBsMC0zMmMwLTUzIDQzLTk2IDk2LTk2IDEyLjcgMCAyNC44IDIuNSAzNS45IDYuOS0xMi42IDIxLjQtMTkuOSA0Ni40LTE5LjkgNzMuMWwwIDMyYzAgMzIuNSAxMi4xIDYyLjEgMzIgODQuN2wwIDI3LjMtMTEyIDAgMC00MC42ek0xMjggMzJhNTYgNTYgMCAxIDEgMCAxMTIgNTYgNTYgMCAxIDEgMC0xMTJ6bTMyMCAwYTU2IDU2IDAgMSAxIDAgMTEyIDU2IDU2IDAgMSAxIDAtMTEyek0yNCA0NjRsNTI4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRMMjQgNTEyYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFTcXVhcmVSc3MgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXJzcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJyc3Mtc3F1YXJlIl0sICJmMTQzIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyek05NiAxMzZjMC0xMy4zIDEwLjctMjQgMjQtMjQgMTM3IDAgMjQ4IDExMSAyNDggMjQ4IDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtMTEwLjUtODkuNS0yMDAtMjAwLTIwMC0xMy4zIDAtMjQtMTAuNy0yNC0yNHptMCA5NmMwLTEzLjMgMTAuNy0yNCAyNC0yNCA4My45IDAgMTUyIDY4LjEgMTUyIDE1MiAwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGMwLTU3LjQtNDYuNi0xMDQtMTA0LTEwNC0xMy4zIDAtMjQtMTAuNy0yNC0yNHptMCAxMjBhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHoiXQogICAgfTsKICAgIGZhUnNzU3F1YXJlID0gZmFTcXVhcmVSc3M7CiAgICBmYUNhbGVuZGFyTWludXMyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhbGVuZGFyLW1pbnVzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyNzIiLCAiTTEyOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzIgMTI4IDAgMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMzIgMzIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI4OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDMyIDAgMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnptMjQgMjY0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDE0NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xNDQgMHoiXQogICAgfTsKICAgIGZhQ2hhcnREaWFncmFtID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoYXJ0LWRpYWdyYW0iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTY5NSIsICJNODAgMzJDNTMuNSAzMiAzMiA1My41IDMyIDgwczIxLjUgNDggNDggNDhsMTUyIDAgMCA0MC00OCA0OC03MiAwYy0zOS44IDAtNzIgMzIuMi03MiA3MmwwIDY0LTggMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmw2NCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNjRjMC0xNy43LTE0LjMtMzItMzItMzJsLTggMCAwLTY0YzAtMTMuMyAxMC43LTI0IDI0LTI0bDcyIDAgNDggNDggMCA0MC04IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgNjRjMCAxNy43IDE0LjMgMzIgMzIgMzJsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTY0YzAtMTcuNy0xNC4zLTMyLTMyLTMybC04IDAgMC00MCA0OC00OCA3MiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgNjQtOCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDY0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDY0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtOCAwIDAtNjRjMC0zOS44LTMyLjItNzItNzItNzJsLTcyIDAtNDgtNDggMC00MCAxNTIgMGMyNi41IDAgNDgtMjEuNSA0OC00OHMtMjEuNS00OC00OC00OEw4MCAzMnoiXQogICAgfTsKICAgIGZhRmFjZVRpcmVkMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLXRpcmVkIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTU1LCAidGlyZWQiXSwgImY1YzgiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0xNjQuNyAzMjguN2MyMi0yMiA1My45LTQwLjcgOTEuMy00MC43czY5LjMgMTguNyA5MS4zIDQwLjdjMTEuMSAxMS4xIDIwLjEgMjMuNCAyNi40IDM1LjQgNi4yIDExLjcgMTAuMyAyNC40IDEwLjMgMzUuOSAwIDUuMi0yLjYgMTAuMi02LjkgMTMuMnMtOS44IDMuNy0xNC43IDEuOGwtMjAuNS03LjdjLTI2LjktMTAuMS01NS41LTE1LjMtODQuMy0xNS4zbC0zLjIgMGMtMjguOCAwLTU3LjMgNS4yLTg0LjMgMTUuM0wxNDkuNiA0MTVjLTQuOSAxLjgtMTAuNCAxLjItMTQuNy0xLjhTMTI4IDQwNS4yIDEyOCA0MDBjMC0xMS42IDQuMi0yNC4yIDEwLjMtMzUuOSA2LjMtMTIgMTUuMy0yNC4zIDI2LjQtMzUuNHpNMTIyLjYgMTU5LjJjNC41LTYuOCAxMy4zLTkuMiAyMC42LTUuNWw3OS42IDQwYzUuNCAyLjcgOC44IDguMiA4LjggMTQuM3MtMy40IDExLjYtOC44IDE0LjNsLTc5LjYgNDBjLTcuMyAzLjYtMTYuMSAxLjMtMjAuNi01LjVzLTMuMS0xNS45IDMuMS0yMS4xTDE1OSAyMDggMTI1LjggMTgwLjNjLTYuMi01LjItNy42LTE0LjMtMy4xLTIxLjF6bTI2My42IDIxLjFMMzUzIDIwOCAzODYuMiAyMzUuN2M2LjIgNS4yIDcuNiAxNC4zIDMuMSAyMS4xcy0xMy4zIDkuMi0yMC42IDUuNWwtNzkuNi00MGMtNS40LTIuNy04LjgtOC4yLTguOC0xNC4zczMuNC0xMS42IDguOC0xNC4zbDc5LjYtNDBjNy4zLTMuNiAxNi4xLTEuMyAyMC42IDUuNXMzLjEgMTUuOS0zLjEgMjEuMXoiXQogICAgfTsKICAgIGZhVGlyZWQyID0gZmFGYWNlVGlyZWQyOwogICAgZmFIYW5kUG9pbnRSaWdodDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1wb2ludC1yaWdodCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMGE0IiwgIk00ODAgOTZjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTIwOCAwIDAtNjQgMjA4IDB6TTMyMCAyODhjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsNjQgMHptNjQtNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTQ4IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsNDggMGMxNy43IDAgMzIgMTQuMyAzMiAzMnpNMjg4IDM4NGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtNjQgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw2NCAwem0tODgtOTZsLjYgMGMtNS40IDkuNC04LjYgMjAuMy04LjYgMzIgMCAxMy4yIDQgMjUuNCAxMC44IDM1LjYtMjQuOSA4LjctNDIuOCAzMi41LTQyLjggNjAuNCAwIDExLjcgMy4xIDIyLjYgOC42IDMybC04LjYgMEM3MS42IDQ0OCAwIDM3Ni40IDAgMjg4bDAtNjEuN2MwLTQyLjQgMTYuOS04My4xIDQ2LjktMTEzLjFsMTEuNi0xMS42QzgyLjUgNzcuNSAxMTUuMSA2NCAxNDkgNjRsMjcgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDg4YzAgMjIuMS0xNy45IDQwLTQwIDQwcy00MC0xNy45LTQwLTQwbDAtNTZjMC04LjgtNy4yLTE2LTE2LTE2cy0xNiA3LjItMTYgMTZsMCA1NmMwIDM5LjggMzIuMiA3MiA3MiA3MnoiXQogICAgfTsKICAgIGZhQXJyb3dVcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy11cCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzg1OTNdLCAiZjA2MiIsICJNMjE0LjYgMTcuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTE2MCAxNjBjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBMMTYwIDExNy4zIDE2MCA0ODhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTM3MC43IDEwNS40IDEwNS40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTE2MC0xNjB6Il0KICAgIH07CiAgICBmYUN1YmVzU3RhY2tlZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjdWJlcy1zdGFja2VkIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU0ZTYiLCAiTTE5MiAzMmMwLTE3LjcgMTQuMy0zMiAzMi0zMmw2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjR6bTMyIDM1Mmw2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJ6bTE5MiAwbDY0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtNjQgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC02NGMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNMzIwIDE5Mmw2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJ6bS0xODIuNi0zLjljMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBsNDUuMyA0NS4zYzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zbC00NS4zIDQ1LjNjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwTDkyLjEgMjc4LjZjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zbDQ1LjMtNDUuM3pNMzIgMzg0bDY0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtNjQgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC02NGMwLTE3LjcgMTQuMy0zMiAzMi0zMnoiXQogICAgfTsKICAgIGZhQ2hpbGRDb21iYXRhbnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hpbGQtY29tYmF0YW50IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImNoaWxkLXJpZmxlIl0sICJlNGUwIiwgIk0xNzYuNSAxMjhhNjQgNjQgMCAxIDAgMC0xMjggNjQgNjQgMCAxIDAgMCAxMjh6bS0xNiAzNTJsMC05NiAzMiAwIDAgOTZjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE5Mi4yIDIwLjkgMzMuMmM5LjQgMTUgMjkuMiAxOS40IDQ0LjEgMTBzMTkuNC0yOS4yIDEwLTQ0LjFsLTM5LjktNjMuM0MyNjYuOCAxODQgMjIzLjMgMTYwIDE3Ni41IDE2MFM4Ni4yIDE4NCA2MS4zIDIyMy42TDIxLjQgMjg3Yy05LjQgMTUtNC45IDM0LjcgMTAgNDQuMXMzNC43IDQuOSA0NC4xLTEwbDIwLjktMzMuMiAwIDE5Mi4yYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJ6TTQ0OC41IDBsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnM3LjIgMTYgMTYgMTZsMCAxMDAuM2MtOS42IDUuNS0xNiAxNS45LTE2IDI3LjdsMCAzMmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAxNDRjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTYgMCAwIDk2YzAgOC44IDcuMiAxNiAxNiAxNmw1OS41IDBjMTAuNCAwIDE4LTkuOCAxNS41LTE5LjlsLTIzLTkyLjEgNDQgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0xNmMwLTguOC03LjItMTYtMTYtMTZsLTQ4IDAgMC0yNi43IDUzLjEtMTcuN2M2LjUtMi4yIDEwLjktOC4zIDEwLjktMTUuMmwwLTg0LjVjMC04LjgtNy4yLTE2LTE2LTE2bC0xNiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCA1Ni0xNiA1LjMgMC0xMDkuM2MwLTExLjgtNi40LTIyLjItMTYtMjcuN2wwLTExNi4zYzAtOC44LTcuMi0xNi0xNi0xNnoiXQogICAgfTsKICAgIGZhQ2hpbGRSaWZsZSA9IGZhQ2hpbGRDb21iYXRhbnQ7CiAgICBmYVZlc3RQYXRjaGVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZlc3QtcGF0Y2hlcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlMDg2IiwgIk0yMDAgMjkzLjlMMjAwIDQ2NGMwIDI2LjUtMjEuNSA0OC00OCA0OEw0OCA1MTJjLTI2LjUgMC00OC0yMS41LTQ4LTQ4TDAgMjcwLjVjMC05LjUgMi44LTE4LjcgOC4xLTI2LjZsNDcuOS03MS44YzUuMy03LjkgOC4xLTE3LjEgOC4xLTI2LjZMNjQgNDhDNjQgMjEuNSA4NS41IDAgMTEyIDBsMy41IDBjLjMgMCAuNiAwIDEgMCAuNiAwIDEuMiAwIDEuOCAwIDE4LjggMCAzNC4xIDkuNyA0NC4xIDE4LjggOS4zIDguNCAyOC41IDIxLjIgNjEuNyAyMS4yczUyLjQtMTIuOCA2MS43LTIxLjJjMTAtOS4xIDI1LjMtMTguOCA0NC4xLTE4LjggLjYgMCAxLjIgMCAxLjggMCAuMyAwIC42IDAgMSAwTDMzNiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgOTcuNWMwIDkuNSAyLjggMTguNyA4LjEgMjYuNmw0Ny45IDcxLjhjNS4zIDcuOSA4LjEgMTcuMSA4LjEgMjYuNkw0NDggNDY0YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xMDQgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC0xNzAuMWMwLTMuOSAuNS03LjggMS40LTExLjZMMzAzLjYgNjUuNEMyODUuOSA3Ny4yIDI1OS44IDg4IDIyNCA4OHMtNjEuOS0xMC44LTc5LjYtMjIuNmw1NC4yIDIxNi44YzEgMy44IDEuNCA3LjcgMS40IDExLjZ6TTk2IDQ1NmE0MCA0MCAwIDEgMCAwLTgwIDQwIDQwIDAgMSAwIDAgODB6TTYzLjUgMjU1LjVjLTQuNyA0LjctNC43IDEyLjMgMCAxN0w3OSAyODggNjMuNSAzMDMuNWMtNC43IDQuNy00LjcgMTIuMyAwIDE3czEyLjMgNC43IDE3IDBMOTYgMzA1IDExMS41IDMyMC41YzQuNyA0LjcgMTIuMyA0LjcgMTcgMHM0LjctMTIuMyAwLTE3TDExMyAyODggMTI4LjUgMjcyLjVjNC43LTQuNyA0LjctMTIuMyAwLTE3cy0xMi4zLTQuNy0xNyAwTDk2IDI3MSA4MC41IDI1NS41Yy00LjctNC43LTEyLjMtNC43LTE3IDB6TTMwNCAyODBsMCA0MGMwIDguOCA3LjIgMTYgMTYgMTZsNDAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtOCAwIDAtOGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNHoiXQogICAgfTsKICAgIGZhTWFydGluaUdsYXNzRW1wdHkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFydGluaS1nbGFzcy1lbXB0eSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJnbGFzcy1tYXJ0aW5pIl0sICJmMDAwIiwgIk0zMiAzMkMxOS4xIDMyIDcuNCAzOS44IDIuNCA1MS44Uy4yIDc3LjUgOS40IDg2LjZsMjE0LjYgMjE0LjYgMCAxNDYuNy02NCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDE5MiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC02NCAwIDAtMTQ2LjcgMjE0LjYtMjE0LjZjOS4yLTkuMiAxMS45LTIyLjkgNi45LTM0LjlTNDkyLjkgMzIgNDgwIDMyTDMyIDMyek0yNTYgMjQyLjdMMTA5LjMgOTYgNDAyLjcgOTYgMjU2IDI0Mi43eiJdCiAgICB9OwogICAgZmFHbGFzc01hcnRpbmkgPSBmYU1hcnRpbmlHbGFzc0VtcHR5OwogICAgZmFNYWduZXQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFnbmV0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI5NTIyXSwgImYwNzYiLCAiTTAgMTc2TDAgMjg4QzAgNDExLjcgMTAwLjMgNTEyIDIyNCA1MTJTNDQ4IDQxMS43IDQ0OCAyODhsMC0xMTItMTI4IDAgMCAxMTJjMCA1My00MyA5Ni05NiA5NnMtOTYtNDMtOTYtOTZsMC0xMTItMTI4IDB6bTAtNDhsMTI4IDAgMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMkwzMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0bDAgNjR6bTMyMCAwbDEyOCAwIDAtNjRjMC0xNy43LTE0LjMtMzItMzItMzJsLTY0IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgNjR6Il0KICAgIH07CiAgICBmYVJvYWRCYXJyaWVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJvYWQtYmFycmllciIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTYyIiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0TDAgNDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJMNjQgMjY2LjMgMTQ5LjIgOTYgNjQgOTYgNjQgNjRjMC0xNy43LTE0LjMtMzItMzItMzJ6TTQwNS4yIDk2bC03NC4zIDAtNS40IDEwLjctOTAuNiAxODEuMyA3NC4zIDAgNS40LTEwLjcgOTAuNi0xODEuM3pNMzYyLjggMjg4bDc0LjMgMCA1LjQtMTAuNyA5MC42LTE4MS4zLTc0LjMgMC01LjQgMTAuNy05MC42IDE4MS4zek0yMDIuOCA5NmwtNS40IDEwLjctOTAuNiAxODEuMyA3NC4zIDAgNS40LTEwLjcgOTAuNi0xODEuMy03NC4zIDB6bTI4OCAxOTJsODUuMiAwIDAgMTYwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zODRjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA1My43LTg1LjIgMTcwLjN6Il0KICAgIH07CiAgICBmYUNvbXBhc3NEcmFmdGluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjb21wYXNzLWRyYWZ0aW5nIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImRyYWZ0aW5nLWNvbXBhc3MiXSwgImY1NjgiLCAiTTk5LjMgMjU2LjFsNjkuNC0xMTkuOWMtNS42LTEyLjItOC44LTI1LjgtOC44LTQwLjIgMC01MyA0My05NiA5Ni05NnM5NiA0MyA5NiA5NmMwIDE0LjMtMy4xIDI3LjktOC44IDQwLjJsNDQuNCA3Ni43Yy0yMy4xIDI2LTUzLjcgNDUuMS04OC40IDUzLjhMMjU2IDE5MS45IDE4Ny45IDMwOS41YzIxLjUgNi44IDQ0LjMgMTAuNSA2OC4xIDEwLjUgNzAuNyAwIDEzMy44LTMyLjcgMTc0LjktODQgMTEuMS0xMy44IDMxLjItMTYgNDUtNXMxNiAzMS4yIDUgNDVjLTUyLjcgNjUuOC0xMzMuOSAxMDgtMjI0LjggMTA4LTM1LjQgMC02OS40LTYuNC0xMDAuNy0xOC4xTDk4LjcgNDYzLjdDOTQgNDcxLjggODcgNDc4LjQgNzguNiA0ODIuNkwyMy4yIDUxMC4zYy01IDIuNS0xMC45IDIuMi0xNS42LS43UzAgNTAxLjUgMCA0OTZsMC01NS40YzAtOC40IDIuMi0xNi43IDYuNS0yNC4xbDYwLTEwMy43Yy0xMi44LTExLjItMjQuNi0yMy41LTM1LjMtMzYuOC0xMS4xLTEzLjgtOC44LTMzLjkgNS00NXMzMy45LTguOCA0NSA1YzUuNyA3LjEgMTEuOCAxMy44IDE4LjIgMjAuMXpNMzgxLjEgNDA3LjljMzIuNS0xMyA2Mi40LTMxIDg4LjktNTIuOWwzNS42IDYxLjVjNC4yIDcuMyA2LjUgMTUuNiA2LjUgMjQuMWwwIDU1LjRjMCA1LjUtMi45IDEwLjctNy42IDEzLjZzLTEwLjYgMy4yLTE1LjYgLjdsLTU1LjQtMjcuN2MtOC40LTQuMi0xNS40LTEwLjgtMjAuMS0xOC45bC0zMi4zLTU1Ljh6TTI1NiAxMjhhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFEcmFmdGluZ0NvbXBhc3MgPSBmYUNvbXBhc3NEcmFmdGluZzsKICAgIGZhU3F1YXJlUGVyc29uQ29uZmluZWQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXBlcnNvbi1jb25maW5lZCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNTc3IiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyem05NiAxMTJhNDggNDggMCAxIDEgOTYgMCA0OCA0OCAwIDEgMSAtOTYgMHptODAgMTA0YzAtMzAuOSAyNS4xLTU2IDU2LTU2czU2IDI1LjEgNTYgNTZsMCAxMDIuMWMwIDM2LjQtMjkuNSA2NS45LTY1LjkgNjUuOS0xNy41IDAtMzQuMy02LjktNDYuNi0xOS4zbC01NC43LTU0LjctMjguMSA1Ni4zYy03LjkgMTUuOC0yNy4xIDIyLjItNDIuOSAxNC4zcy0yMi4yLTI3LjEtMTQuMy00Mi45bDQ4LTk2YzQuNi05LjIgMTMuMy0xNS42IDIzLjUtMTcuM3MyMC41IDEuNyAyNy44IDlsNDEuNCA0MS40IDAtNTguN3oiXQogICAgfTsKICAgIGZhUGxhdGVXaGVhdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwbGF0ZS13aGVhdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTVhIiwgIk0xNzYgMzJjNDQuMiAwIDgwIDM1LjggODAgODBsMCAxNmMwIDguOC03LjIgMTYtMTYgMTYtNDQuMiAwLTgwLTM1LjgtODAtODBsMC0xNmMwLTguOCA3LjItMTYgMTYtMTZ6TTU2IDY0bDQ4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTQ4IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0UzQyLjcgNjQgNTYgNjR6TTI0IDEzNmwxMTIgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNEwyNCAxODRjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6bTggOTZjMC0xMy4zIDEwLjctMjQgMjQtMjRsNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNDggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjR6TTI3MiA0OGMwLTguOCA3LjItMTYgMTYtMTYgNDQuMiAwIDgwIDM1LjggODAgODBsMCAxNmMwIDguOC03LjIgMTYtMTYgMTYtNDQuMiAwLTgwLTM1LjgtODAtODBsMC0xNnpNNDAwIDMyYzQ0LjIgMCA4MCAzNS44IDgwIDgwbDAgMTZjMCA4LjgtNy4yIDE2LTE2IDE2LTQ0LjIgMC04MC0zNS44LTgwLTgwbDAtMTZjMC04LjggNy4yLTE2IDE2LTE2em04MCAxNjBsMCAxNmMwIDQ0LjItMzUuOCA4MC04MCA4MC04LjggMC0xNi03LjItMTYtMTZsMC0xNmMwLTQ0LjIgMzUuOC04MCA4MC04MCA4LjggMCAxNiA3LjIgMTYgMTZ6TTM1MiAxNzZjOC44IDAgMTYgNy4yIDE2IDE2bDAgMTZjMCA0NC4yLTM1LjggODAtODAgODAtOC44IDAtMTYtNy4yLTE2LTE2bDAtMTZjMC00NC4yIDM1LjgtODAgODAtODB6bS05NiAxNmwwIDE2YzAgNDQuMi0zNS44IDgwLTgwIDgwLTguOCAwLTE2LTcuMi0xNi0xNmwwLTE2YzAtNDQuMiAzNS44LTgwIDgwLTgwIDguOCAwIDE2IDcuMiAxNiAxNnpNMy41IDM0Ny42QzEuNiAzMzIuOSAxMyAzMjAgMjcuOCAzMjBsNDU2LjQgMGMxNC44IDAgMjYuMiAxMi45IDI0LjQgMjcuNi02LjMgNTAuMi00NC40IDg5LjQtOTIuNiA5OC40bDAgMmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMjU2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMmMtNDguMi05LTg2LjMtNDguMi05Mi41LTk4LjR6Il0KICAgIH07CiAgICBmYVNpZ25IYW5naW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNpZ24taGFuZ2luZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJzaWduIl0sICJmNGQ5IiwgIk05NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzIgMzUyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTM1MiAwIDAgMzUyYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMzUyLTMyIDBDMTQuMyAxMjggMCAxMTMuNyAwIDk2UzE0LjMgNjQgMzIgNjRsMzIgMCAwLTMyQzY0IDE0LjMgNzguMyAwIDk2IDB6TTIwOCAxNzZsMjQwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxNDRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTI0MCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTE0NGMwLTE3LjcgMTQuMy0zMiAzMi0zMnoiXQogICAgfTsKICAgIGZhU2lnbiA9IGZhU2lnbkhhbmdpbmc7CiAgICBmYUNhckJhdHRlcnkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FyLWJhdHRlcnkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiYmF0dGVyeS1jYXIiXSwgImY1ZGYiLCAiTTgwIDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMybDY0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsOTYgMGMwLTE3LjcgMTQuMy0zMiAzMi0zMmw2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDE2IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyNTZjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDQ4Yy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGwxNiAwek0zOTIgMTg0YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMzItMzIgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwzMiAwIDAgMzJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTMyIDMyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTMyIDAgMC0zMnpNNjQgMjQwYzAgMTMuMyAxMC43IDI0IDI0IDI0bDExMiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0TDg4IDIxNmMtMTMuMyAwLTI0IDEwLjctMjQgMjR6Il0KICAgIH07CiAgICBmYUJhdHRlcnlDYXIgPSBmYUNhckJhdHRlcnk7CiAgICBmYVNoaXJ0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNoaXJ0IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI4MDg1LCAidC1zaGlydCIsICJ0c2hpcnQiXSwgImY1NTMiLCAiTTMyMC4yIDExMmM0NC4yIDAgODAtMzUuOCA4MC04MGw1My41IDBjMTcgMCAzMy4zIDYuNyA0NS4zIDE4LjdMNjE3LjYgMTY5LjRjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNsLTUwLjcgNTAuN2MtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBsLTQxLjQtNDEuNCAwIDIyNGMwIDM1LjMtMjguNyA2NC02NCA2NGwtMTkyIDBjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMjI0LTQxLjQgNDEuNGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBMMjIuOSAyMTQuNmMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNMMTQxLjUgNTAuN2MxMi0xMiAyOC4zLTE4LjcgNDUuMy0xOC43bDUzLjUgMGMwIDQ0LjIgMzUuOCA4MCA4MCA4MHoiXQogICAgfTsKICAgIGZhVFNoaXJ0ID0gZmFTaGlydDsKICAgIGZhVHNoaXJ0ID0gZmFTaGlydDsKICAgIGZhUGFyYWdyYXBoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBhcmFncmFwaCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzE4Ml0sICJmMWRkIiwgIk0xNjAgMEw0MTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIgMCAwIDQxNmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTQxNi00OCAwIDAgNDE2YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTYwLTQ4IDBDNzEuNiAzMjAgMCAyNDguNCAwIDE2MFM3MS42IDAgMTYwIDB6Il0KICAgIH07CiAgICBmYUVudmVsb3Blc0J1bGsgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZW52ZWxvcGVzLWJ1bGsiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsibWFpbC1idWxrIl0sICJmNjc0IiwgIk0xMTIgMEM4NS41IDAgNjQgMjEuNSA2NCA0OGwwIDE2MCA4MCAwIDAtMzJjMC01MyA0My05NiA5Ni05NmwyMDggMCAwLTMyYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4TDExMiAwek0yNDAgMTI4Yy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDMyIDgwIDBjNTMgMCA5NiA0MyA5NiA5NmwwIDExMiAxNjAgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTE5MmMwLTI2LjUtMjEuNS00OC00OC00OGwtMjg4IDB6bTIwMCA2NGw0OCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgNDhjMCAxMy4zLTEwLjcgMjQtMjQgMjRsLTQ4IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtNDhjMC0xMy4zIDEwLjctMjQgMjQtMjR6TTQ4IDI1NmMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCAxMC40IDE1Ni42IDg2LjJjMS4xIC42IDIuMiAuOSAzLjQgLjlzMi40LS4zIDMuNC0uOUwzMjAgMzE0LjQgMzIwIDMwNGMwLTI2LjUtMjEuNS00OC00OC00OEw0OCAyNTZ6TTMyMCAzNjkuMkwxODYuNiA0NDIuNmMtOC4xIDQuNS0xNy4zIDYuOC0yNi42IDYuOHMtMTguNC0yLjQtMjYuNi02LjhMMCAzNjkuMiAwIDQ2NGMwIDI2LjUgMjEuNSA0OCA0OCA0OGwyMjQgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTk0Ljh6Il0KICAgIH07CiAgICBmYU1haWxCdWxrID0gZmFFbnZlbG9wZXNCdWxrOwogICAgZmFHdWl0YXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ3VpdGFyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY3YTYiLCAiTTQ2NSA3Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMEwzODMgNTVjLTIuNCAyLjQtNC4zIDUuMy01LjUgOC41bC0xNS40IDQxLTc3LjUgNzcuNmMtNDUuMS0yOS40LTk5LjMtMzAuMi0xMzEgMS42LTExIDExLTE4IDI0LjYtMjEuNCAzOS42LTMuNyAxNi42LTE5LjEgMzAuNy0zNi4xIDMxLjYtMjUuNiAxLjMtNDkuMyAxMC43LTY3LjMgMjguNi00NC44IDQ0LjgtMzYuNCAxMjUuOCAxOC43IDE4MC45UzE4My42IDUyOCAyMjguNCA0ODMuMmMxNy45LTE3LjkgMjcuNC00MS43IDI4LjYtNjcuMyAuOS0xNyAxNS0zMi4zIDMxLjYtMzYuMSAxNS0zLjQgMjguNi0xMC41IDM5LjYtMjEuNCAzMS44LTMxLjggMzEtODUuOSAxLjYtMTMxbDc3LjYtNzcuNiA0MS0xNS40YzMuMi0xLjIgNi4xLTMuMSA4LjUtNS41bDQ4LTQ4YzkuNC05LjQgOS40LTI0LjYgMC0zMy45TDQ2NSA3ek0yMDggMjU2YTQ4IDQ4IDAgMSAxIDAgOTYgNDggNDggMCAxIDEgMC05NnoiXQogICAgfTsKICAgIGZhU3VpdGNhc2UgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3VpdGNhc2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjk1MjNdLCAiZjBmMiIsICJNMjAwIDQ4bDExMiAwYzQuNCAwIDggMy42IDggOGwwIDQwLTEyOCAwIDAtNDBjMC00LjQgMy42LTggOC04em0tNTYgOGwwIDQyNCAyMjQgMCAwLTQyNGMwLTMwLjktMjUuMS01Ni01Ni01NkwyMDAgMGMtMzAuOSAwLTU2IDI1LjEtNTYgNTZ6TTQxNiA5NmwwIDM4NCAzMiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0bC0zMiAwek05NiA0ODBsMC0zODQtMzIgMEMyOC43IDk2IDAgMTI0LjcgMCAxNjBMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIgMHoiXQogICAgfTsKICAgIGZhQ2lyY2xlVXAyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS11cCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYxNDY3LCAiYXJyb3ctYWx0LWNpcmNsZS11cCJdLCAiZjM1YiIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6bTExLjMtMzg3LjNsMTA0IDEwNGM0LjYgNC42IDUuOSAxMS41IDMuNSAxNy40UzM2Ni41IDI1NiAzNjAgMjU2bC01NiAwIDAgOTZjMCAxNy43LTE0LjMgMzItMzIgMzJsLTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtOTYtNTYgMGMtNi41IDAtMTIuMy0zLjktMTQuOC05LjlzLTEuMS0xMi45IDMuNS0xNy40bDEwNC0xMDRjNi4yLTYuMiAxNi40LTYuMiAyMi42IDB6Il0KICAgIH07CiAgICBmYUFycm93QWx0Q2lyY2xlVXAyID0gZmFDaXJjbGVVcDI7CiAgICBmYUYgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZiIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWzEwMl0sICI0NiIsICJNMzIgMzJDMTQuMyAzMiAwIDQ2LjMgMCA2NEwwIDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTYwIDE2MCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0xNjAgMCAwLTEyOCAyMjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwzMiAzMnoiXQogICAgfTsKICAgIGZhWG1hcmtzTGluZXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAieG1hcmtzLWxpbmVzIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1OWEiLCAiTTMyIDMyQzE0LjMgMzIgMCA0Ni4zIDAgNjRTMTQuMyA5NiAzMiA5Nmw1NzYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwzMiAzMnptMCAzODRjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNTc2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgNDE2ek03IDE2N2MtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlsNTUgNTUtNTUgNTVjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMGw1NS01NSA1NSA1NWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTU1LTU1IDU1LTU1YzkuNC05LjQgOS40LTI0LjYgMC0zMy45cy0yNC42LTkuNC0zMy45IDBsLTU1IDU1LTU1LTU1Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHpNMjY1IDE2N2MtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWw1NSA1NS01NSA1NWMtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDU1LTU1IDU1IDU1YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNTUtNTUgNTUtNTVjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMGwtNTUgNTUtNTUtNTV6TTQ1NSAxNjdjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45bDU1IDU1LTU1IDU1Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBsNTUtNTUgNTUgNTVjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC01NS01NSA1NS01NWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwbC01NSA1NS01NS01NWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDB6Il0KICAgIH07CiAgICBmYUVhcnRoT2NlYW5pYSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJlYXJ0aC1vY2VhbmlhIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImdsb2JlLW9jZWFuaWEiXSwgImU0N2IiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0xOTIgMTUwLjZjMC0xMi41IDEwLjEtMjIuNiAyMi42LTIyLjZsNDEuNCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0xOC43IDBjLTguNSAwLTE2LjYtMy40LTIyLjYtOS40bC0xNi0xNmMtNC4yLTQuMi02LjYtMTAtNi42LTE2ek00MzIgMjU2YzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNnMtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2ek00MTEuMyAzNzkuM2wtMzIgMzJjLTYuMiA2LjItMTYuNCA2LjItMjIuNiAwcy02LjItMTYuNCAwLTIyLjZsMzItMzJjNi4yLTYuMiAxNi40LTYuMiAyMi42IDBzNi4yIDE2LjQgMCAyMi42ek0yMjQgNDMyYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNnMtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZ6bS05Ni04MGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0xOC43YzAtOC41IDMuNC0xNi42IDkuNC0yMi42bDQ4LTQ4YzQuMi00LjIgMTAtNi42IDE2LTYuNmw2LjYgMGM4LjggMCAxNiA3LjIgMTYgMTZzNy4yIDE2IDE2IDE2IDE2LTcuMiAxNi0xNiA3LjItMTYgMTYtMTZsNi42IDBjNiAwIDExLjggMi40IDE2IDYuNmw0OCA0OGM2IDYgOS40IDE0LjEgOS40IDIyLjZsMCA1MC43YzAgMTcuNy0xNC4zIDMyLTMyIDMybC01MC43IDBjLTguNSAwLTE2LjYtMy40LTIyLjYtOS40bC0xMy4zLTEzLjNjLTYtNi0xNC4xLTkuNC0yMi42LTkuNEwxMjggMzUyeiJdCiAgICB9OwogICAgZmFHbG9iZU9jZWFuaWEgPSBmYUVhcnRoT2NlYW5pYTsKICAgIGZhQ29tbWVudFNsYXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvbW1lbnQtc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjRiMyIsICJNNDEtMjVDMzEuNi0zNC4zIDE2LjQtMzQuMyA3LTI1Uy0yLjMtLjQgNyA5TDUzNSA1MzdjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC05Ni42LTk2LjZjNDQuNC00My4yIDcxLjYtMTAxLjggNzEuNi0xNjYuNSAwLTEzMi41LTExNC42LTI0MC0yNTYtMjQwLTYzIDAtMTIwLjggMjEuNC0xNjUuNCA1Ni44TDQxLTI1em0xOS40IDE1NUM0Mi4yIDE2MyAzMiAyMDAuMyAzMiAyMzkuOSAzMiAyOTQuMiA1MS4yIDM0NC4yIDgzLjYgMzg0LjRMMzQuOCA0NzYuN2MtNC44IDktMy4zIDIwIDMuNiAyNy41UzU2LjEgNTE0IDY1LjUgNTEwbDExOC40LTUwLjdjMzEuOCAxMy4zIDY3LjEgMjAuNyAxMDQuMSAyMC43IDM2LjQgMCA3MC45LTcuMSAxMDIuMy0xOS45TDYwLjMgMTMwLjF6Il0KICAgIH07CiAgICBmYVBsYXkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGxheSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzk2NTRdLCAiZjA0YiIsICJNOTEuMiAzNi45Yy0xMi40LTYuOC0yNy40LTYuNS0zOS42IC43UzMyIDU3LjkgMzIgNzJsMCAzNjhjMCAxNC4xIDcuNSAyNy4yIDE5LjYgMzQuNHMyNy4yIDcuNSAzOS42IC43bDMzNi0xODRjMTIuOC03IDIwLjgtMjAuNSAyMC44LTM1LjFzLTgtMjguMS0yMC44LTM1LjFsLTMzNi0xODR6Il0KICAgIH07CiAgICBmYVZpYWxDaXJjbGVDaGVjayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ2aWFsLWNpcmNsZS1jaGVjayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTk2IiwgIk0zMiAzMkMzMiAxNC4zIDQ2LjMgMCA2NCAwTDI4OCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybDAgMTYxLjRjLTY2LjEgMzAuMy0xMTIgOTcuMS0xMTIgMTc0LjYgMCAzOS43IDEyIDc2LjYgMzIuNyAxMDcuMi0xMC4zIDMuMS0yMS4zIDQuOC0zMi43IDQuOC02MS45IDAtMTEyLTUwLjEtMTEyLTExMkw2NCA2NEM0Ni4zIDY0IDMyIDQ5LjcgMzIgMzJ6bTk2IDMybDAgMTI4IDk2IDAgMC0xMjgtOTYgMHptOTYgMzM2YTE0NCAxNDQgMCAxIDEgMjg4IDAgMTQ0IDE0NCAwIDEgMSAtMjg4IDB6bTIwMS40LTYwLjljLTcuMS01LjItMTcuMi0zLjYtMjIuNCAzLjVsLTUzIDcyLjktMjYuOC0yNi44Yy02LjItNi4yLTE2LjQtNi4yLTIyLjYgMHMtNi4yIDE2LjQgMCAyMi42bDQwIDQwYzMuMyAzLjMgNy45IDUgMTIuNiA0LjZzOC45LTIuOCAxMS43LTYuNWw2NC04OGM1LjItNy4xIDMuNi0xNy4yLTMuNS0yMi4zeiJdCiAgICB9OwogICAgZmFCcmlkZ2VDaXJjbGVDaGVjayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJicmlkZ2UtY2lyY2xlLWNoZWNrIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU0YzkiLCAiTTMyIDMyQzE0LjMgMzIgMCA0Ni4zIDAgNjRTMTQuMyA5NiAzMiA5Nmw4IDAgMCA2NC00MCAwIDAgMTEyYzM3LjYgOS40IDY0IDQzLjIgNjQgODJsMCA5NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNjRjMC01MyA0My05NiA5Ni05NiA2LjQgMCAxMi43IC42IDE4LjcgMS44IDM0LjctNDkuNSA5Mi4yLTgxLjggMTU3LjMtODEuOCAyOC42IDAgNTUuNiA2LjIgODAgMTcuNGwwLTY1LjQtNDAgMCAwLTY0IDggMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwzMiAzMnpNNDI0IDk2bDAgNjQtODAgMCAwLTY0IDgwIDB6TTI5NiA5NmwwIDY0LTgwIDAgMC02NCA4MCAwek04OCA5Nmw4MCAwIDAgNjQtODAgMCAwLTY0ek01NzYgNDAwYTE0NCAxNDQgMCAxIDAgLTI4OCAwIDE0NCAxNDQgMCAxIDAgMjg4IDB6bS04Ni42LTYwLjljNy4xIDUuMiA4LjcgMTUuMiAzLjUgMjIuM2wtNjQgODhjLTIuOCAzLjgtNyA2LjItMTEuNyA2LjVzLTkuMy0xLjMtMTIuNi00LjZsLTQwLTQwYy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBsMjYuOCAyNi44IDUzLTcyLjljNS4yLTcuMSAxNS4yLTguNyAyMi40LTMuNXoiXQogICAgfTsKICAgIGZhQ2VkaVNpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2VkaS1zaWduIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImUwZGYiLCAiTTIzMiAzMmMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDI2LjVDODguOCA3My45IDE2IDE1Ni40IDE2IDI1NlM4OC44IDQzOC4xIDE4NCA0NTMuNWwwIDI2LjVjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTI0LjZjNDYuOC0zLjcgODkuMS0yMy42IDEyMS4zLTUzLjkgMTIuOS0xMi4xIDEzLjQtMzIuNCAxLjMtNDUuMnMtMzIuNC0xMy40LTQ1LjItMS4zYy0yMC43IDE5LjYtNDcuNiAzMi43LTc3LjMgMzYuMmwwLTI3MC4xYzI5LjggMy41IDU2LjYgMTYuNiA3Ny4zIDM2LjIgMTIuOSAxMi4xIDMzLjEgMTEuNSA0NS4yLTEuM3MxMS41LTMzLjEtMS4zLTQ1LjJDMzIxLjEgODAuMiAyNzguOCA2MC4zIDIzMiA1Ni42TDIzMiAzMnptLTQ4IDkxLjhsMCAyNjQuNEMxMjQuMyAzNzMuOCA4MCAzMjAuMSA4MCAyNTZzNDQuMy0xMTcuOCAxMDQtMTMyLjJ6Il0KICAgIH07CiAgICBmYVB1enpsZVBpZWNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInB1enpsZS1waWVjZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyOTUxM10sICJmMTJlIiwgIk0yMjQgMGMzNS4zIDAgNjQgMjEuNSA2NCA0OCAwIDEwLjQtNC40IDIwLTEyIDI3LjktNi42IDYuOS0xMiAxNS4zLTEyIDI0LjkgMCAxNSAxMi4yIDI3LjIgMjcuMiAyNy4ybDQ0LjggMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDQ0LjhjMCAxNSAxMi4yIDI3LjIgMjcuMiAyNy4yIDkuNSAwIDE4LTUuNCAyNC45LTEyIDcuOS03LjUgMTcuNS0xMiAyNy45LTEyIDI2LjUgMCA0OCAyOC43IDQ4IDY0cy0yMS41IDY0LTQ4IDY0Yy0xMC40IDAtMjAuMS00LjQtMjcuOS0xMi02LjktNi42LTE1LjMtMTItMjQuOS0xMi0xNSAwLTI3LjIgMTIuMi0yNy4yIDI3LjJMMzg0IDQ2NGMwIDI2LjUtMjEuNSA0OC00OCA0OGwtNTYuOCAwYy0xMi44IDAtMjMuMi0xMC40LTIzLjItMjMuMiAwLTkuMiA1LjgtMTcuMyAxMy4yLTIyLjggMTEuNi04LjcgMTguOC0yMC43IDE4LjgtMzQgMC0yNi41LTI4LjctNDgtNjQtNDhzLTY0IDIxLjUtNjQgNDhjMCAxMy4zIDcuMiAyNS4zIDE4LjggMzQgNy40IDUuNSAxMy4yIDEzLjUgMTMuMiAyMi44IDAgMTIuOC0xMC40IDIzLjItMjMuMiAyMy4yTDQ4IDUxMmMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCAzNDMuMmMwLTEyLjggMTAuNC0yMy4yIDIzLjItMjMuMiA5LjIgMCAxNy4zIDUuOCAyMi44IDEzLjIgOC43IDExLjYgMjAuNyAxOC44IDM0IDE4LjggMjYuNSAwIDQ4LTI4LjcgNDgtNjRzLTIxLjUtNjQtNDgtNjRjLTEzLjMgMC0yNS4zIDcuMi0zNCAxOC44LTUuNSA3LjQtMTMuNSAxMy4yLTIyLjggMTMuMi0xMi44IDAtMjMuMi0xMC40LTIzLjItMjMuMkwwIDE3NmMwLTI2LjUgMjEuNS00OCA0OC00OGwxMDguOCAwYzE1IDAgMjcuMi0xMi4yIDI3LjItMjcuMiAwLTkuNS01LjQtMTgtMTItMjQuOS03LjUtNy45LTEyLTE3LjUtMTItMjcuOSAwLTI2LjUgMjguNy00OCA2NC00OHoiXQogICAgfTsKICAgIGZhSGVsbWV0VW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGVsbWV0LXVuIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1MDMiLCAiTTQ3OS41IDIyNEM0NzEuMiA5OC45IDM2Ny4yIDAgMjQwIDAgMTA3LjUgMCAwIDEwNy41IDAgMjQwbDAgNTYuM0MwIDM0NC44IDM5LjIgMzg0IDg3LjcgMzg0bDEyNy4zIDAgMTI4LjYgMTIxLjRjNC41IDQuMiAxMC40IDYuNiAxNi41IDYuNmw5NiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC04Ni41IDAtMS41LTEuNSAwLTE3NC41IDExMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0uNSAwek0zMjAgNDE3LjJsLTc4LTczLjcgMzIuNC01NS41IDQ1LjYgMCAwIDEyOS4yek0yODUuMyAxMDMuMWwzNC43IDUyIDAtNDMuMmMwLTguOCA3LjItMTYgMTYtMTZzMTYgNy4yIDE2IDE2bDAgOTZjMCA3LjEtNC42IDEzLjMtMTEuNCAxNS4zcy0xNC0uNi0xNy45LTYuNGwtMzQuNy01MiAwIDQzLjJjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC05NmMwLTcuMSA0LjYtMTMuMyAxMS40LTE1LjNzMTQgLjYgMTcuOSA2LjR6TTE2MCAxMTJsMCA2NGMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtNjRjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDY0YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4cy00OC0yMS41LTQ4LTQ4bDAtNjRjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNnoiXQogICAgfTsKICAgIGZhR2xhc3NXYXRlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnbGFzcy13YXRlciIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlNGY0IiwgIk0zMiAwQzIzLjEgMCAxNC42IDMuNyA4LjYgMTAuMlMtLjYgMjUuNCAuMSAzNC4zTDI4LjkgNDM3LjdjMyA0MS45IDM3LjggNzQuMyA3OS44IDc0LjNsMTY2LjYgMGM0MiAwIDc2LjgtMzIuNCA3OS44LTc0LjNMMzgzLjkgMzQuM2MuNi04LjktMi40LTE3LjYtOC41LTI0LjFTMzYwLjkgMCAzNTIgMEwzMiAwek03MyAxNTYuNWwtNi42LTkyLjUgMjUxLjMgMC02LjYgOTIuNS0yNC4yIDEyLjFjLTE5LjQgOS43LTQyLjIgOS43LTYxLjYgMC0yMC45LTEwLjQtNDUuNS0xMC40LTY2LjQgMC0xOS40IDkuNy00Mi4yIDkuNy02MS42IDBMNzMgMTU2LjV6Il0KICAgIH07CiAgICBmYUhlYXJ0Q2lyY2xlQm9sdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoZWFydC1jaXJjbGUtYm9sdCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNGZjIiwgIk0yNDEgODcuMWwxNSAyMC43IDE1LTIwLjdDMjk2IDUyLjUgMzM2LjIgMzIgMzc4LjkgMzIgNDUyLjQgMzIgNTEyIDkxLjYgNTEyIDE2NS4xbDAgMi42YzAgMTcuNi0zLjQgMzUuNi05LjUgNTMuNy0yMS44LTguNi00NS42LTEzLjQtNzAuNS0xMy40LTEwNiAwLTE5MiA4Ni0xOTIgMTkyIDAgMjguNSA2LjIgNTUuNiAxNy40IDgwLS41IDAtLjkgMC0xLjQgMC0xNS41IDAtMzAuOC00LjYtNDMuMS0xNC4xLTczLTU1LjctMjEyLjktMTg2LTIxMi45LTI5OC4ybDAtMi42QzAgOTEuNiA1OS42IDMyIDEzMy4xIDMyIDE3NS44IDMyIDIxNiA1Mi41IDI0MSA4Ny4xek0yODggNDAwYTE0NCAxNDQgMCAxIDEgMjg4IDAgMTQ0IDE0NCAwIDEgMSAtMjg4IDB6bTE3Ny40LTc3Yy01LjgtNC4yLTEzLjgtNC0xOS40IC41bC04MCA2NGMtNS4zIDQuMi03LjQgMTEuNC01LjEgMTcuOFMzNjkuMiA0MTYgMzc2IDQxNmwzMi45IDAtMTUuOSA0Mi40Yy0yLjUgNi43LS4yIDE0LjMgNS42IDE4LjZzMTMuOCA0IDE5LjQtLjVsODAtNjRjNS4zLTQuMiA3LjQtMTEuNCA1LjEtMTcuOFM0OTQuOCAzODQgNDg4IDM4NGwtMzIuOSAwIDE1LjktNDIuNGMyLjUtNi43IC4yLTE0LjMtNS42LTE4LjZ6Il0KICAgIH07CiAgICBmYVB1bXBTb2FwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInB1bXAtc29hcCIsCiAgICAgIGljb246IFszMjAsIDUxMiwgW10sICJlMDZiIiwgIk05NiAwbDAgODAgMTI4IDAgMC0yNCA3MiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0UzMwOS4zIDggMjk2IDhsLTcyIDAgMC04YzAtMTcuNy0xNC4zLTMyLTMyLTMybC02NCAwQzExMC4zLTMyIDk2LTE3LjcgOTYgMHpNNjQgMTI4Yy0zNS4zIDAtNjQgMjguNy02NCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxOTIgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI1NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAxMjh6TTIyNCAzNDRjMCAzNS4zLTI4LjcgNTYtNjQgNTZzLTY0LTIwLjctNjQtNTZjMC0zMi41IDM3LTgwLjkgNTAuOS05Ny45IDMuMi0zLjkgOC4xLTYuMSAxMy4xLTYuMXM5LjkgMi4yIDEzLjEgNi4xQzE4NyAyNjMuMSAyMjQgMzExLjUgMjI0IDM0NHoiXQogICAgfTsKICAgIGZhSGFuZFNjaXNzb3JzMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kLXNjaXNzb3JzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyNTciLCAiTTQwIDIwOGMtMjIuMSAwLTQwIDE3LjktNDAgNDBzMTcuOSA0MCA0MCA0MGwxODAuMiAwYy03LjYgOC41LTEyLjIgMTkuNy0xMi4yIDMyIDAgMjUuMyAxOS41IDQ2IDQ0LjMgNDcuOS03LjcgOC41LTEyLjMgMTkuOC0xMi4zIDMyLjEgMCAyNi41IDIxLjUgNDggNDggNDhsOTYgMGM3MC43IDAgMTI4LTU3LjMgMTI4LTEyOGwwLTExMy4xYzAtNDAuMi0xNi03OC44LTQ0LjQtMTA3LjMtMjIuOC0yMi44LTUzLjYtMzUuNi04NS44LTM1LjZMMzM2IDY0Yy0yMS4zIDAtMzkuMyAxMy45LTQ1LjYgMzMuMWw3NC41IDIzLjdjOC40IDIuNyAxMy4xIDExLjcgMTAuNCAyMC4xcy0xMS43IDEzLjEtMjAuMSAxMC40bC02Ny4xLTIxLjQgMCAuMS0yMDQtNjQuMUM2Mi45IDU5LjIgNDAuNSA3MC45IDMzLjkgOTJzNS4xIDQzLjUgMjYuMiA1MC4yTDI2OS41IDIwOCA0MCAyMDh6Il0KICAgIH07CiAgICBmYURvbGx5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRvbGx5IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImRvbGx5LWJveCJdLCAiZjQ3MiIsICJNMzIgMEMxNC4zIDAgMCAxNC4zIDAgMzJTMTQuMyA2NCAzMiA2NGw3Mi45IDAgOTIuMSAyNzYuMmMtMjIuNSAxNy42LTM3IDQ1LTM3IDc1LjggMCA1MyA0MyA5NiA5NiA5NiA1Mi40IDAgOTUuMS00MiA5Ni05NC4zbDIwMi4xLTY3LjRjMTYuOC01LjYgMjUuOC0yMy43IDIwLjItNDAuNXMtMjMuNy0yNS44LTQwLjUtMjAuMkwzMzEuOCAzNTdjLTE3LjItMjIuMS00My45LTM2LjUtNzQtMzdMMTY1LjcgNDMuOEMxNTYuOSAxNy42IDEzMi41IDAgMTA0LjkgMEwzMiAwek0yMDggNDE2YTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6TTI4MC41IDg5LjNjLTI1LjIgOC4yLTM5IDM1LjMtMzAuOCA2MC41bDM5LjYgMTIxLjdjOC4yIDI1LjIgMzUuMyAzOSA2MC41IDMwLjhsMTIxLjctMzkuNmMyNS4yLTguMiAzOS0zNS4zIDMwLjgtNjAuNUw0NjIuOCA4MC41Yy04LjItMjUuMi0zNS4zLTM5LTYwLjUtMzAuOEwyODAuNSA4OS4zeiJdCiAgICB9OwogICAgZmFEb2xseUJveCA9IGZhRG9sbHk7CiAgICBmYVBhcGVyY2xpcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwYXBlcmNsaXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgyMDZdLCAiZjBjNiIsICJNMjI0LjYgMTIuOGM1Ni4yLTU2LjIgMTQ3LjQtNTYuMiAyMDMuNiAwczU2LjIgMTQ3LjQgMCAyMDMuNmwtMTY0IDE2NGMtMzQuNCAzNC40LTkwLjEgMzQuNC0xMjQuNSAwcy0zNC40LTkwLjEgMC0xMjQuNUwyOTIuNSAxMDMuM2MxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zTDE4NSAzMDEuM2MtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDE2NC0xNjRjMzEuMi0zMS4yIDMxLjItODEuOSAwLTExMy4xcy04MS45LTMxLjItMTEzLjEgMGwtMTY0IDE2NGMtNTMuMSA1My4xLTUzLjEgMTM5LjIgMCAxOTIuM3MxMzkuMiA1My4xIDE5Mi4zIDBMNDI4LjMgMjg0LjNjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM0wzNDMuNCA0NTkuNmMtNzguMSA3OC4xLTIwNC43IDc4LjEtMjgyLjggMHMtNzguMS0yMDQuNyAwLTI4Mi44bDE2NC0xNjR6Il0KICAgIH07CiAgICBmYURlbW9jcmF0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRlbW9jcmF0IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY3NDciLCAiTTY0IDMyYzAtOC45IDMuOC0yMC45IDYuMi0yNy4zIDEtMi44IDMuOC00LjcgNi44LTQuNyAxLjkgMCAzLjggLjcgNS4yIDIuMUwxMjggNDUuNyAxNzMuOCAyLjFjMS40LTEuMyAzLjItMi4xIDUuMi0yLjEgMyAwIDUuOCAxLjggNi44IDQuNyAyLjQgNi41IDYuMiAxOC40IDYuMiAyNy4zIDAgMjYuNS0yMS45IDQyLTI5LjUgNDYuNmw3Ni4yIDcyLjZjNiA1LjcgMTMuOSA4LjggMjIuMSA4LjhsMjE5LjIgMCAzMiAwYzQwLjMgMCA3OC4yIDE5IDEwMi40IDUxLjJsMTkuMiAyNS42YzEwLjYgMTQuMSA3LjcgMzQuMi02LjQgNDQuOHMtMzQuMiA3LjctNDQuOC02LjRsLTE5LjItMjUuNmMtNS4zLTctMTEuOC0xMi44LTE5LjItMTdsMCA4Ny40LTM1MiAwLTQwLjQtOTQuM2MtMy45LTkuMi0xNS4zLTEyLjYtMjMuNi03bC00Mi4xIDI4Yy05LjEgNi4xLTE5LjcgOS4zLTMwLjcgOS4zbC0yIDBDMjMuOSAyNTYgMCAyMzIuMSAwIDIwMi43IDAgMTkwLjYgNC4xIDE3OC45IDExLjcgMTY5LjRMODcuNiA3NC42Qzc4LjEgNjcuNCA2NCA1My4yIDY0IDMyek01NDQgMzUybDAgMTI4YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTY0LTE2MCAwIDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTI4IDM1MiAwek0yNTYgMjgwYTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHptMjQ4LTI0YTI0IDI0IDAgMSAwIC00OCAwIDI0IDI0IDAgMSAwIDQ4IDB6TTM2OCAyODBhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiJdCiAgICB9OwogICAgZmFTcXVhcmVBcnJvd1VwUmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLWFycm93LXVwLXJpZ2h0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImV4dGVybmFsLWxpbmstc3F1YXJlIl0sICJmMTRjIiwgIk0zODQgMzJjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDMyMCAwek0yNzIgMjk2YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xMTJjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTExMiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDU0LjEgMC0xMDMgMTAzYy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBsMTAzLTEwMyAwIDU0LjF6Il0KICAgIH07CiAgICBmYUV4dGVybmFsTGlua1NxdWFyZSA9IGZhU3F1YXJlQXJyb3dVcFJpZ2h0OwogICAgZmFGZXJyeSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmZXJyeSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNGVhIiwgIk0yMjQgMzJjMC0xNy43IDE0LjMtMzIgMzItMzJMMzg0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAzMiA0OCAwYzQ0LjIgMCA4MCAzNS44IDgwIDgwbDAgMTI4LS4xIDBjLjEgLjcgLjEgMS4zIC4xIDIgMCAzMC4yLTcuNiA1OS44LTIyIDg2LjNsLTEyLjcgMjMuMy0uNiAxYy0yMi4zLTExLjMtNDYuNS0xNi44LTcwLjgtMTYuNy0zMi41IC4yLTY0LjkgMTAuNy05Mi40IDMxLjQtMjIuMSAxNi42LTI5LjEgMTYuNi01MS4yIDAtMjguMS0yMS4xLTYxLjMtMzEuNi05NC40LTMxLjQtMjMuNiAuMi00Ny4xIDUuNy02OC43IDE2LjdsLS42LTEtMTIuNy0yMy4zYy0xNC40LTI2LjUtMjItNTYuMi0yMi04Ni4zIDAtLjcgMC0xLjQgLjEtMmwtLjEgMCAwLTEyOGMwLTQ0LjIgMzUuOC04MCA4MC04MGw0OCAwIDAtMzJ6TTE2MCAyNTZsMzIwIDAgMC0xMTJjMC04LjgtNy4yLTE2LTE2LTE2bC0yODggMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMTEyek00MDMuNCA0NzYuMUMzNzkuMSA0OTQuMyAzNTEuMSA1MTIgMzIwIDUxMnMtNTkuMS0xNy43LTgzLjQtMzUuOWMtMjEuMy0xNi4xLTQ5LjktMTYuMS03MS4yIDAtMjMuOCAxNy45LTU0LjEgMzUuNS04OC4xIDM1LjMtMjAuNC0uMS00MC43LTYuNy01OS44LTIxLjEtMTAuNi04LTEyLjctMjMtNC43LTMzLjZzMjMtMTIuNyAzMy42LTQuN2MxMS4zIDguNSAyMS42IDExLjQgMzEuMiAxMS41IDE3LjYgLjEgMzcuMy05LjQgNTguOS0yNS43IDM4LjQtMjkgOTAuNS0yOSAxMjkgMCAyNCAxOC4xIDQwLjcgMjYuMyA1NC41IDI2LjNzMzAuNS04LjIgNTQuNS0yNi4zYzM4LjQtMjkgOTAuNS0yOSAxMjkgMCAxNi45IDEyLjcgMzIuOSAyMS41IDQ3LjggMjQuNiAxMy43IDIuOCAyNy40IC45IDQyLjMtMTAuMyAxMC42LTggMjUuNi01LjkgMzMuNiA0LjdzNS45IDI1LjYtNC43IDMzLjZjLTI2LjQgMTkuOS01NC4yIDI0LjQtODAuNyAxOS4xLTI1LjMtNS4xLTQ4LjEtMTguOS02Ny4yLTMzLjMtMjEuMy0xNi4xLTQ5LjktMTYuMS03MS4yIDB6Il0KICAgIH07CiAgICBmYU1vc3F1aXRvID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vc3F1aXRvIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1MmIiLCAiTTE3OC41IDQ5NS4yYy03LjUgOS42LTIxIDEyLjEtMzEuMyA1LjNTMTMzLjUgNDgwIDEzOC45IDQ2OWwxLjItMi4yIDM2LjItNTggMC00MSAuMy00Yy42LTMuOSAyLjItNy43IDQuNi0xMC45bDM5LjMtNTIuMi02Ni4yIDU5LjVjLTE3IDE1LjMtMzkgMjMuNy02MS45IDIzLjhsLTguMSAwYy00Ni42IDAtODQuNC0zNy44LTg0LjQtODQuNCAwLTQzIDMyLjQtNzkuMiA3NS4xLTgzLjlsMTMwLjUtMTQuNS00NC44LTM4LjMtMi40LTIuNGMtNS4zLTYtNy4zLTE0LjQtNS4zLTIyLjNsMTMuMy01My40LTI1LjktMzguOS0xLjMtMi4xYy01LjgtMTAuOC0yLjctMjQuNiA3LjQtMzEuNyAxMC4xLTcuMSAyMy43LTUuMSAzMS40IDQuM2wxLjUgMiAzMiA0OCAxLjQgMi4yYzIuOCA1LjMgMy41IDExLjYgMi4xIDE3LjZsLTEyLjMgNDkuMiA1My4zIDQ1LjcgMC0yOC44YzAtMTEuOCA2LjUtMjIuMSAxNi0yNy43bDAtNjAuNSAuMy0zLjNjMS41LTcuMyA4LTEyLjcgMTUuNy0xMi43czE0LjIgNS41IDE1LjcgMTIuN2wuMyAzLjIgMCA2MC41YzkuNiA1LjUgMTYgMTUuOCAxNiAyNy43bDAgMjguOSA1My40LTQ1LjgtMTIuMy00OS4yYy0xLjUtNS45LS43LTEyLjIgMi4xLTE3LjZsMS40LTIuMiAzMi00OCAxLjUtMmM3LjctOS40IDIxLjMtMTEuNSAzMS40LTQuMyAxMC4xIDcuMSAxMy4xIDIwLjkgNy40IDMxLjdsLTEuMyAyLjEtMjUuOSAzOC45IDEzLjMgNTMuNGMyIDgtLjEgMTYuMy01LjMgMjIuM2wtMi40IDIuNC00NC43IDM4LjMgMTMwLjUgMTQuNWM0Mi44IDQuOCA3NS4xIDQwLjkgNzUuMSA4My45IDAgNDYuNi0zNy44IDg0LjQtODQuNCA4NC40bC04LjEgMGMtMjIuOCAwLTQ0LjktOC41LTYxLjktMjMuOGwtNjYuMS01OS41IDM5LjIgNTIuMmMyLjQgMy4yIDQgNyA0LjYgMTAuOWwuMyA0IDAgNDEgMzYuMiA1OCAxLjIgMi4xYzUuNCAxMSAyIDI0LjctOC4zIDMxLjVzLTIzLjggNC40LTMxLjMtNS4zbC0xLjQtMi00MC02NC0xLjYtMy4xYy0xLjQtMy4xLTIuMS02LjYtMi4xLTEwLjFsMC0zOS44LTMyLjQtNDMuMSAwIDc0LjdjMCAxNy43LTE0LjMgMzItMzIgMzItMTcuNyAwLTMyLTE0LjMtMzItMzJsMC03NC42LTMyLjMgNDMgMCAzOS44YzAgMy41LS43IDYuOS0yLjEgMTAuMWwtMS42IDMuMS00MCA2NC0xLjQgMnoiXQogICAgfTsKICAgIGZhQnVpbGRpbmdDaXJjbGVBcnJvd1JpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJ1aWxkaW5nLWNpcmNsZS1hcnJvdy1yaWdodCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNGQxIiwgIk0zMiA2NEMzMiAyOC43IDYwLjcgMCA5NiAwTDM1MiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMTQ0LjdjLTM1LjcgMi45LTY4LjUgMTUuNi05NiAzNS40bDAtNGMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmw0IDBjLTEzLjggMTkuMi0yNC4xIDQxLTMwLjEgNjQuNS0xLjktLjQtMy45LS41LTUuOS0uNWwtMzIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA4MCA3NC45IDBjNi4xIDE3LjMgMTQuNiAzMy40IDI1LjEgNDhMOTYgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwzMiA2NHpNMTQ0IDk2Yy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDB6bTExMiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2ek0xNDQgMjI0Yy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDB6TTI4OCA0MDBhMTQ0IDE0NCAwIDEgMSAyODggMCAxNDQgMTQ0IDAgMSAxIC0yODggMHptMTQwLjctNjcuM2MtNi4yIDYuMi02LjIgMTYuNCAwIDIyLjZsMjguNyAyOC43LTg5LjQgMGMtOC44IDAtMTYgNy4yLTE2IDE2czcuMiAxNiAxNiAxNmw4OS40IDAtMjguNyAyOC43Yy02LjIgNi4yLTYuMiAxNi40IDAgMjIuNnMxNi40IDYuMiAyMi42IDBsNTYtNTZjNi4yLTYuMiA2LjItMTYuNCAwLTIyLjZsLTU2LTU2Yy02LjItNi4yLTE2LjQtNi4yLTIyLjYgMHoiXQogICAgfTsKICAgIGZhTGVmdFJpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxlZnQtcmlnaHQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs4NTk2LCAiYXJyb3dzLWFsdC1oIl0sICJmMzM3IiwgIk01MDIuNiA0MDYuNmwtOTYgOTZjLTkuMiA5LjItMjIuOSAxMS45LTM0LjkgNi45UzM1MiA0OTIuOSAzNTIgNDgwbDAtNjQtMzIwIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMzIwIDAgMC02NGMwLTEyLjkgNy44LTI0LjYgMTkuOC0yOS42czI1LjctMi4yIDM0LjkgNi45bDk2IDk2YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zek05LjQgMTUwLjZjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zbDk2LTk2YzkuMi05LjIgMjIuOS0xMS45IDM0LjktNi45UzE2MCAxOS4xIDE2MCAzMmwwIDY0IDMyMCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0zMjAgMCAwIDY0YzAgMTIuOS03LjggMjQuNi0xOS44IDI5LjZzLTI1LjcgMi4yLTM0LjktNi45bC05Ni05NnoiXQogICAgfTsKICAgIGZhQXJyb3dzQWx0SCA9IGZhTGVmdFJpZ2h0OwogICAgZmFWaXJ1cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ2aXJ1cyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMDc0IiwgIk0yOTYgNDBjMC0yMi4xLTE3LjktNDAtNDAtNDBzLTQwIDE3LjktNDAgNDBjMCA0NC4xLTUzLjMgNjYuMS04NC41IDM1LTE1LjYtMTUuNi00MC45LTE1LjYtNTYuNiAwcy0xNS42IDQwLjkgMCA1Ni42YzMxLjIgMzEuMiA5LjEgODQuNS0zNSA4NC41LTIyLjEgMC00MCAxNy45LTQwIDQwczE3LjkgNDAgNDAgNDBjNDQuMSAwIDY2LjEgNTMuMyAzNSA4NC41LTE1LjYgMTUuNi0xNS42IDQwLjkgMCA1Ni42czQwLjkgMTUuNiA1Ni42IDBjMzEuMi0zMS4yIDg0LjUtOS4xIDg0LjUgMzUgMCAyMi4xIDE3LjkgNDAgNDAgNDBzNDAtMTcuOSA0MC00MGMwLTQ0LjEgNTMuMy02Ni4xIDg0LjUtMzUgMTUuNiAxNS42IDQwLjkgMTUuNiA1Ni42IDBzMTUuNi00MC45IDAtNTYuNmMtMzEuMi0zMS4yLTkuMS04NC41IDM1LTg0LjUgMjIuMSAwIDQwLTE3LjkgNDAtNDBzLTE3LjktNDAtNDAtNDBjLTQ0LjEgMC02Ni4xLTUzLjMtMzUtODQuNSAxNS42LTE1LjYgMTUuNi00MC45IDAtNTYuNnMtNDAuOS0xNS42LTU2LjYgMEMzNDkuMyAxMDYuMSAyOTYgODQuMSAyOTYgNDB6TTE2MCAyMjRhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptMTYwIDMyYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhR2VtMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnZW0iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgxNDJdLCAiZjNhNSIsICJNMTE2LjcgMzMuOGM0LjUtNi4xIDExLjctOS44IDE5LjMtOS44bDI0MCAwYzcuNiAwIDE0LjggMy42IDE5LjMgOS44bDExMiAxNTJjNi44IDkuMiA2LjEgMjEuOS0xLjUgMzAuNGwtMjMyIDI1NmMtNC41IDUtMTEgNy45LTE3LjggNy45cy0xMy4yLTIuOS0xNy44LTcuOWwtMjMyLTI1NmMtNy43LTguNS04LjMtMjEuMi0xLjUtMzAuNGwxMTItMTUyem0zOC41IDM5LjhjLTMuMyAyLjUtNC4yIDctMi4xIDEwLjVMMjEwLjUgMTc5LjggNjMuMyAxOTJjLTQuMSAuMy03LjMgMy44LTcuMyA4czMuMiA3LjYgNy4zIDhsMTkyIDE2Yy40IDAgLjkgMCAxLjMgMGwxOTItMTZjNC4xLS4zIDcuMy0zLjggNy4zLThzLTMuMi03LjYtNy4zLThsLTE0Ny4yLTEyLjMgNTcuNC05NS42YzIuMS0zLjUgMS4yLTguMS0yLjEtMTAuNXMtNy45LTItMTAuNyAxTDI1NiAxNzIuMiAxNjUuOSA3NC42Yy0yLjgtMy03LjQtMy40LTEwLjctMXoiXQogICAgfTsKICAgIGZhVG9pbGV0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRvaWxldCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyODcwMV0sICJmN2Q4IiwgIk0yNCAwQzEwLjcgMCAwIDEwLjcgMCAyNFMxMC43IDQ4IDI0IDQ4bDggMCAwIDE0OC45Yy0xLjkgMS40LTMuOCAyLjktNS42IDQuNC0xNS41IDEzLjItMjYuNCAzMS42LTI2LjQgNTQuNiAwIDQ2LjkgMTQuMyA4NC4xIDM3IDExMi41IDE0LjIgMTcuNyAzMS4xIDMxLjMgNDguNSA0MS44TDY1LjYgNDY5LjljLTMuMyA5LjgtMS42IDIwLjUgNC40IDI4LjhTODUuNyA1MTIgOTYgNTEybDI1NiAwYzEwLjMgMCAxOS45LTQuOSAyNi0xMy4zczcuNy0xOS4xIDQuNC0yOC44bC0xOS44LTU5LjVjMTcuNC0xMC41IDM0LjMtMjQuMSA0OC41LTQxLjggMjIuNy0yOC40IDM3LTY1LjUgMzctMTEyLjUgMC0yMy4xLTEwLjktNDEuNS0yNi40LTU0LjYtMS44LTEuNS0zLjctMy01LjYtNC40bDAtMTQ4LjkgOCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0UzQzNy4zIDAgNDI0IDBMMjQgMHpNOTYgODBjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2cy03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNnpNMjI0IDI4OGMtODguNCAwLTE2MC0xNC4zLTE2MC0zMnM3MS42LTMyIDE2MC0zMiAxNjAgMTQuMyAxNjAgMzItNzEuNiAzMi0xNjAgMzJ6Il0KICAgIH07CiAgICBmYVNpbmdsZVF1b3RlTGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaW5nbGUtcXVvdGUtbGVmdCIsCiAgICAgIGljb246IFsxOTIsIDUxMiwgW10sICJlODFiIiwgIk0xMjggOTZjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTggMGMtMzAuOSAwLTU2IDI1LjEtNTYgNTZsMCA4IDY0IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCA2NGMwIDM1LjMtMjguNyA2NC02NCA2NGwtNjQgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAyMTZDMCAxNDkuNyA1My43IDk2IDEyMCA5Nmw4IDB6Il0KICAgIH07CiAgICBmYU1vbmV5QmlsbHMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibW9uZXktYmlsbHMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTFmMyIsICJNMTYwIDMyYy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDIyNGMwIDM1LjMgMjguNyA2NCA2NCA2NGwzNTIgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTIyNGMwLTM1LjMtMjguNy02NC02NC02NEwxNjAgMzJ6bTE3NiA5NmE4MCA4MCAwIDEgMSAwIDE2MCA4MCA4MCAwIDEgMSAwLTE2MHpNMTYwIDE1MmwwLTQ4YzAtNC40IDMuNi04IDgtOGw0OCAwYzQuNCAwIDguMSAzLjYgNy41IDgtMy42IDI5LTI2LjYgNTEuOS01NS41IDU1LjUtNC40IC41LTgtMy4xLTgtNy41em0wIDExMmMwLTQuNCAzLjYtOC4xIDgtNy41IDI5IDMuNiA1MS45IDI2LjYgNTUuNSA1NS41IC41IDQuNC0zLjEgOC03LjUgOGwtNDggMGMtNC40IDAtOC0zLjYtOC04bDAtNDh6TTUwNCAxNTkuNWMtMjktMy42LTUxLjktMjYuNi01NS41LTU1LjUtLjUtNC40IDMuMS04IDcuNS04bDQ4IDBjNC40IDAgOCAzLjYgOCA4bDAgNDhjMCA0LjQtMy42IDguMS04IDcuNXpNNTEyIDI2NGwwIDQ4YzAgNC40LTMuNiA4LTggOGwtNDggMGMtNC40IDAtOC4xLTMuNi03LjUtOCAzLjYtMjkgMjYuNi01MS45IDU1LjUtNTUuNSA0LjQtLjUgOCAzLjEgOCA3LjV6TTQ4IDE1MmMwLTEzLjMtMTAuNy0yNC0yNC0yNFMwIDEzOC43IDAgMTUyTDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM5MiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0TDY0IDQzMmMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMjY0eiJdCiAgICB9OwogICAgZmFUYWJsZXRCdXR0b24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGFibGV0LWJ1dHRvbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMTBhIiwgIk02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTM4NGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAwek0yMjQgNDAwYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhUmVjdGFuZ2xlWG1hcmsyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJlY3RhbmdsZS14bWFyayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYyMTY0LCAicmVjdGFuZ2xlLXRpbWVzIiwgInRpbWVzLXJlY3RhbmdsZSIsICJ3aW5kb3ctY2xvc2UiXSwgImY0MTAiLCAiTTY0IDY0QzI4LjcgNjQgMCA5Mi43IDAgMTI4TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDY0ek0xNjcgMTY3YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwbDU1IDU1IDU1LTU1YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOWwtNTUgNTUgNTUgNTVjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtNTUtNTUtNTUgNTVjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsNTUtNTUtNTUtNTVjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45eiJdCiAgICB9OwogICAgZmFSZWN0YW5nbGVUaW1lczIgPSBmYVJlY3RhbmdsZVhtYXJrMjsKICAgIGZhVGltZXNSZWN0YW5nbGUyID0gZmFSZWN0YW5nbGVYbWFyazI7CiAgICBmYVdpbmRvd0Nsb3NlMiA9IGZhUmVjdGFuZ2xlWG1hcmsyOwogICAgZmFXcmVuY2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid3JlbmNoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4Mjk1XSwgImYwYWQiLCAiTTUwOS40IDk4LjZjNy42LTcuNiAyMC4zLTUuNyAyNC4xIDQuMyA2LjggMTcuNyAxMC41IDM3IDEwLjUgNTcuMSAwIDg4LjQtNzEuNiAxNjAtMTYwIDE2MC0xNy41IDAtMzQuNC0yLjgtNTAuMi04TDE0Ni45IDQ5OC45Yy0yOC4xIDI4LjEtNzMuNyAyOC4xLTEwMS44IDBzLTI4LjEtNzMuNyAwLTEwMS44TDIzMiAyMTAuMmMtNS4yLTE1LjgtOC0zMi42LTgtNTAuMiAwLTg4LjQgNzEuNi0xNjAgMTYwLTE2MCAyMC4xIDAgMzkuNCAzLjcgNTcuMSAxMC41IDEwIDMuOCAxMS44IDE2LjUgNC4zIDI0LjFsLTg4LjcgODguN2MtMyAzLTQuNyA3LjEtNC43IDExLjNsMCA0MS40YzAgOC44IDcuMiAxNiAxNiAxNmw0MS40IDBjNC4yIDAgOC4zLTEuNyAxMS4zLTQuN2w4OC43LTg4Ljd6Il0KICAgIH07CiAgICBmYVRyYXNoQ2FuMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cmFzaC1jYW4iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs2MTQ2MCwgInRyYXNoLWFsdCJdLCAiZjJlZCIsICJNMTM2LjcgNS45QzE0MS4xLTcuMiAxNTMuMy0xNiAxNjcuMS0xNmwxMTMuOSAwYzEzLjggMCAyNiA4LjggMzAuNCAyMS45TDMyMCAzMiA0MTYgMzJjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgOTZDMTQuMyA5NiAwIDgxLjcgMCA2NFMxNC4zIDMyIDMyIDMybDk2IDAgOC43LTI2LjF6TTMyIDE0NGwzODQgMCAwIDMwNGMwIDM1LjMtMjguNyA2NC02NCA2NEw5NiA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMzA0em04OCA2NGMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAxOTJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTE5MmMwLTEzLjMtMTAuNy0yNC0yNC0yNHptMTA0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMTkyYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xOTJjMC0xMy4zLTEwLjctMjQtMjQtMjR6bTEwNCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDE5MmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTkyYzAtMTMuMy0xMC43LTI0LTI0LTI0eiJdCiAgICB9OwogICAgZmFUcmFzaEFsdDIgPSBmYVRyYXNoQ2FuMjsKICAgIGZhVGFibGVDZWxscyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWJsZS1jZWxscyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJ0aCJdLCAiZjAwYSIsICJNMzg0IDk2bDAgNjQtNjQgMCAwLTY0IDY0IDB6bTAgMTI4bDAgNjQtNjQgMCAwLTY0IDY0IDB6bTAgMTI4bDAgNjQtNjQgMCAwLTY0IDY0IDB6TTI1NiAyODhsLTY0IDAgMC02NCA2NCAwIDAgNjR6bS02NCA2NGw2NCAwIDAgNjQtNjQgMCAwLTY0em0tNjQtNjRsLTY0IDAgMC02NCA2NCAwIDAgNjR6TTY0IDM1Mmw2NCAwIDAgNjQtNjQgMCAwLTY0em0wLTE5MmwwLTY0IDY0IDAgMCA2NC02NCAwem0xMjggMGwwLTY0IDY0IDAgMCA2NC02NCAwek02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyeiJdCiAgICB9OwogICAgZmFUaCA9IGZhVGFibGVDZWxsczsKICAgIGZhUmliYm9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJpYmJvbiIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyNzg5NV0sICJmNGQ2IiwgIk0yMzUuMSAwYzMzLjQgMCA2NC41IDE3LjQgODEuOSA0NS45IDEuMiAyIDEzIDIxLjMgMzUuMyA1Ny44IDIxLjEgMzQuNSAxOC4zIDc4LjUtNyAxMTBMMjc4LjMgMjk3LjcgMzY0LjUgNDA2YzUuNSA2LjkgNC40IDE2LjktMi41IDIyLjVsLTgwIDY0Yy02LjkgNS41LTE3IDQuNC0yMi41LTIuNUwzOC42IDIxMy44QzEzLjMgMTgyLjMgMTAuNSAxMzguMyAzMS42IDEwMy44IDU0IDY3LjIgNjUuNyA0Ny45IDY3IDQ1LjkgODQuNCAxNy40IDExNS40IDAgMTQ4LjkgMGw4Ni4zIDB6TTE5MiAxODkuMmw0OC42LTYxLjItOTcuMyAwIDQ4LjYgNjEuMnpNNzUgMzM2LjJsODYuMiAxMDcuOC0zNi44IDQ2Yy01LjUgNi45LTE1LjYgOC0yMi41IDIuNWwtODAtNjRjLTYuOS01LjUtOC0xNS42LTIuNS0yMi41TDc1IDMzNi4yeiJdCiAgICB9OwogICAgZmFMYW5kbWFya0ZsYWcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGFuZG1hcmstZmxhZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTFjIiwgIk0zNTItMzJMMjQwLTMyYy04LjggMC0xNiA3LjItMTYgMTZsMCAxNDQtMTc2IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMTYgMCAwIDIyNC01MS4yIDM4LjRDNC43IDQ2MC40IDAgNDY5LjkgMCA0ODAgMCA0OTcuNyAxNC4zIDUxMiAzMiA1MTJsNDQ4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzIgMC0xMC4xLTQuNy0xOS42LTEyLjgtMjUuNmwtNTEuMi0zOC40IDAtMjI0IDE2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTE5MiAwIDAtNjQgODAgMGM4LjggMCAxNi03LjIgMTYtMTZsMC02NGMwLTguOC03LjItMTYtMTYtMTZ6bTQ4IDIyNGwwIDIyNC02NCAwIDAtMjI0IDY0IDB6bS0xMTIgMGwwIDIyNC02NCAwIDAtMjI0IDY0IDB6bS0xMTIgMGwwIDIyNC02NCAwIDAtMjI0IDY0IDB6Il0KICAgIH07CiAgICBmYVVwRG93bkxlZnRSaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1cC1kb3duLWxlZnQtcmlnaHQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiYXJyb3dzLWFsdCJdLCAiZjBiMiIsICJNMjc4LjYgOS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMGwtNjQgNjRjLTkuMiA5LjItMTEuOSAyMi45LTYuOSAzNC45UzE3OS4xIDEyOCAxOTIgMTI4bDMyIDAgMCA5Ni05NiAwIDAtMzJjMC0xMi45LTcuOC0yNC42LTE5LjgtMjkuNnMtMjUuNy0yLjItMzQuOSA2LjlsLTY0IDY0Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM2w2NCA2NGM5LjIgOS4yIDIyLjkgMTEuOSAzNC45IDYuOVMxMjggMzMyLjkgMTI4IDMyMGwwLTMyIDk2IDAgMCA5Ni0zMiAwYy0xMi45IDAtMjQuNiA3LjgtMjkuNiAxOS44cy0yLjIgMjUuNyA2LjkgMzQuOWw2NCA2NGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGw2NC02NGM5LjItOS4yIDExLjktMjIuOSA2LjktMzQuOVMzMzIuOSAzODQgMzIwIDM4NGwtMzIgMCAwLTk2IDk2IDAgMCAzMmMwIDEyLjkgNy44IDI0LjYgMTkuOCAyOS42czI1LjcgMi4yIDM0LjktNi45bDY0LTY0YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zbC02NC02NGMtOS4yLTkuMi0yMi45LTExLjktMzQuOS02LjlTMzg0IDE3OS4xIDM4NCAxOTJsMCAzMi05NiAwIDAtOTYgMzIgMGMxMi45IDAgMjQuNi03LjggMjkuNi0xOS44czIuMi0yNS43LTYuOS0zNC45bC02NC02NHoiXQogICAgfTsKICAgIGZhQXJyb3dzQWx0ID0gZmFVcERvd25MZWZ0UmlnaHQ7CiAgICBmYUNhclNpZGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FyLXNpZGUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjg2NjNdLCAiZjVlNCIsICJNMTQ3IDEwNi43bC0yOS44IDg1LjMgMTIyLjkgMCAwLTk2LTc3LjkgMGMtNi44IDAtMTIuOSA0LjMtMTUuMSAxMC43ek00OC42IDE5My45TDg2LjUgODUuNkM5Ny44IDUzLjUgMTI4LjEgMzIgMTYyLjEgMzJMMzYwIDMyYzI1LjIgMCA0OC45IDExLjkgNjQgMzJsOTYuMiAxMjguM0M1ODcuMSAxOTYuNSA2NDAgMjUyLjEgNjQwIDMyMGwwIDE2YzAgMzUuMy0yOC43IDY0LTY0IDY0bC0xNi40IDBjLTQgNDQuOS00MS43IDgwLTg3LjYgODBzLTgzLjYtMzUuMS04Ny42LTgwbC0xNDQuNyAwYy00IDQ0LjktNDEuNyA4MC04Ny42IDgwcy04My42LTM1LjEtODcuNi04MGwtLjQgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC04MGMwLTMwLjEgMjAuNy01NS4zIDQ4LjYtNjIuMXpNNDQwIDE5MmwtNjcuMi04OS42Yy0zLTQtNy44LTYuNC0xMi44LTYuNGwtNzIgMCAwIDk2IDE1MiAwek0xNTIgNDMyYTQwIDQwIDAgMSAwIDAtODAgNDAgNDAgMCAxIDAgMCA4MHptMzYwLTQwYTQwIDQwIDAgMSAwIC04MCAwIDQwIDQwIDAgMSAwIDgwIDB6Il0KICAgIH07CiAgICBmYVRyYXNoQXJyb3dVcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cmFzaC1hcnJvdy11cCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJ0cmFzaC1yZXN0b3JlIl0sICJmODI5IiwgIk0xNjcuMS0xNmwxMTMuOSAwYzEzLjggMCAyNiA4LjggMzAuNCAyMS45TDMyMCAzMiA0MTYgMzJjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgOTZDMTQuMyA5NiAwIDgxLjcgMCA2NFMxNC4zIDMyIDMyIDMybDk2IDAgOC43LTI2LjFDMTQxLjEtNy4yIDE1My4zLTE2IDE2Ny4xLTE2ek0zMiAxNDRsMzg0IDAtMjEuMSAzMjMuMUMzOTMuMyA0OTIuNCAzNzIuMyA1MTIgMzQ3IDUxMkwxMDEgNTEyYy0yNS4zIDAtNDYuMy0xOS42LTQ3LjktNDQuOUwzMiAxNDR6bTIwOSA3OWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBsLTcyIDcyYy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBsMzEtMzEgMCAxMDIuMWMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTAyLjEgMzEgMzFjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC03Mi03MnoiXQogICAgfTsKICAgIGZhVHJhc2hSZXN0b3JlID0gZmFUcmFzaEFycm93VXA7CiAgICBmYUxpZmVSaW5nMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsaWZlLXJpbmciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjFjZCIsICJNMzY3LjIgNDEyLjVDMzM1LjkgNDM0LjkgMjk3LjUgNDQ4IDI1NiA0NDhzLTc5LjktMTMuMS0xMTEuMi0zNS41bDU4LTU4YzE1LjggOC42IDM0IDEzLjUgNTMuMyAxMy41czM3LjQtNC45IDUzLjMtMTMuNWw1OCA1OHptOTAuNyAuOGMzMy44LTQzLjQgNTQtOTggNTQtMTU3LjNTNDkxLjggMTQyLjEgNDU4IDk4LjdjOS0xMi41IDcuOS0zMC4xLTMuNC00MS4zUzQyNS44IDQ1IDQxMy4zIDU0QzM2OS45IDIwLjIgMzE1LjMgMCAyNTYgMFMxNDIuMSAyMC4yIDk4LjcgNTRjLTEyLjUtOS0zMC4xLTcuOS00MS4zIDMuNFM0NSA4Ni4yIDU0IDk4LjdDMjAuMiAxNDIuMSAwIDE5Ni43IDAgMjU2UzIwLjIgMzY5LjkgNTQgNDEzLjNjLTkgMTIuNS03LjkgMzAuMSAzLjQgNDEuM1M4Ni4yIDQ2NyA5OC43IDQ1OGM0My40IDMzLjggOTggNTQgMTU3LjMgNTRzMTEzLjktMjAuMiAxNTcuMy01NGMxMi41IDkgMzAuMSA3LjkgNDEuMy0zLjRzMTIuNC0yOC44IDMuNC00MS4zem0tNDUuNS00Ni4xbC01OC01OGM4LjYtMTUuOCAxMy41LTM0IDEzLjUtNTMuM3MtNC45LTM3LjQtMTMuNS01My4zbDU4LTU4QzQzNC45IDE3Ni4xIDQ0OCAyMTQuNSA0NDggMjU2cy0xMy4xIDc5LjktMzUuNSAxMTEuMnpNMzY3LjIgOTkuNWwtNTggNThjLTE1LjgtOC42LTM0LTEzLjUtNTMuMy0xMy41cy0zNy40IDQuOS01My4zIDEzLjVsLTU4LTU4QzE3Ni4xIDc3LjEgMjE0LjUgNjQgMjU2IDY0czc5LjkgMTMuMSAxMTEuMiAzNS41ek0xNTcuNSAzMDkuM2wtNTggNThDNzcuMSAzMzUuOSA2NCAyOTcuNSA2NCAyNTZzMTMuMS03OS45IDM1LjUtMTExLjJsNTggNThjLTguNiAxNS44LTEzLjUgMzQtMTMuNSA1My4zczQuOSAzNy40IDEzLjUgNTMuM3pNMjA4IDI1NmE0OCA0OCAwIDEgMSA5NiAwIDQ4IDQ4IDAgMSAxIC05NiAweiJdCiAgICB9OwogICAgZmFDb3B5cmlnaHQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvcHlyaWdodCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzE2OV0sICJmMWY5IiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMjA1LjEgMzA2LjljMjguMSAyOC4xIDczLjcgMjguMSAxMDEuOCAwIDkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOWMtNDYuOSA0Ni45LTEyMi44IDQ2LjktMTY5LjcgMHMtNDYuOS0xMjIuOCAwLTE2OS43IDEyMi44LTQ2LjkgMTY5LjcgMGM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwYy0yOC4xLTI4LjEtNzMuNy0yOC4xLTEwMS44IDBzLTI4LjEgNzMuNyAwIDEwMS44eiJdCiAgICB9OwogICAgZmFGaWxlUHJlc2NyaXB0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbGUtcHJlc2NyaXB0aW9uIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY1NzIiLCAiTTAgNjRDMCAyOC43IDI4LjcgMCA2NCAwTDIxMy41IDBjMTcgMCAzMy4zIDYuNyA0NS4zIDE4LjdMMzY1LjMgMTI1LjNjMTIgMTIgMTguNyAyOC4zIDE4LjcgNDUuM0wzODQgNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA2NHptMjA4LTUuNWwwIDkzLjVjMCAxMy4zIDEwLjcgMjQgMjQgMjRMMzI1LjUgMTc2IDIwOCA1OC41ek04OCAxOTJjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMTQ0YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC00MCAyMi41IDAgNTguNCA1NS0zMy40IDMxLjZjLTkuNiA5LjEtMTAuMSAyNC4zLS45IDMzLjlzMjQuMyAxMC4xIDMzLjkgLjlsMzUuNC0zMy41IDM1LjYgMzMuNWM5LjcgOS4xIDI0LjggOC42IDMzLjktMXM4LjYtMjQuOC0xLTMzLjlsLTMzLjYtMzEuNiAzMy42LTMxLjhjOS42LTkuMSAxMC4xLTI0LjMgLjktMzMuOXMtMjQuMy0xMC4xLTMzLjktLjlsLTM1LjcgMzMuNy00MC45LTM4LjVjMTIuOS0xMS43IDIxLjEtMjguNiAyMS4xLTQ3LjUgMC0zNS4zLTI4LjctNjQtNjQtNjRsLTU2IDB6bTMyIDgwbC04IDAgMC0zMiAzMiAwYzguOCAwIDE2IDcuMiAxNiAxNnMtNy4yIDE2LTE2IDE2bC0yNCAweiJdCiAgICB9OwogICAgZmFFcmFzZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZXJhc2VyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYxMmQiLCAiTTE3OC41IDQxNmwxMjMgMCA2NS4zLTY1LjMtMTczLjUtMTczLjUtMTI2LjcgMTI2LjcgMTEyIDExMnpNMjI0IDQ4MGwtNDUuNSAwYy0xNyAwLTMzLjMtNi43LTQ1LjMtMTguN0wxNyAzNDVDNi4xIDMzNC4xIDAgMzE5LjQgMCAzMDRzNi4xLTMwLjEgMTctNDFMMjYzIDE3QzI3My45IDYuMSAyODguNiAwIDMwNCAwczMwLjEgNi4xIDQxIDE3TDUyNyAxOTljMTAuOSAxMC45IDE3IDI1LjYgMTcgNDFzLTYuMSAzMC4xLTE3IDQxbC0xMzUgMTM1IDEyMCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0yODggMHoiXQogICAgfTsKICAgIGZhSG91cmdsYXNzU3RhcnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG91cmdsYXNzLXN0YXJ0IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbImhvdXJnbGFzcy0xIl0sICJmMjUxIiwgIk0zMiAwQzE0LjMgMCAwIDE0LjMgMCAzMlMxNC4zIDY0IDMyIDY0bDAgMTFjMCA0Mi40IDE2LjkgODMuMSA0Ni45IDExMy4xbDY3LjkgNjcuOS02Ny45IDY3LjlDNDguOSAzNTMuOSAzMiAzOTQuNiAzMiA0MzdsMCAxMWMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzMjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwwLTExYzAtNDIuNC0xNi45LTgzLjEtNDYuOS0xMTMuMWwtNjcuOS02Ny45IDY3LjktNjcuOWMzMC0zMCA0Ni45LTcwLjcgNDYuOS0xMTMuMWwwLTExYzE3LjcgMCAzMi0xNC4zIDMyLTMyUzM2OS43IDAgMzUyIDBMMzIgMHpNMjg4IDQzN2wwIDExLTE5MiAwIDAtMTFjMC0yNS41IDEwLjEtNDkuOSAyOC4xLTY3LjlsNjcuOS02Ny45IDY3LjkgNjcuOWMxOCAxOCAyOC4xIDQyLjQgMjguMSA2Ny45eiJdCiAgICB9OwogICAgZmFIb3VyZ2xhc3MxID0gZmFIb3VyZ2xhc3NTdGFydDsKICAgIGZhQ2lyY2xlTGVmdDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLWxlZnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MTg0MCwgImFycm93LWFsdC1jaXJjbGUtbGVmdCJdLCAiZjM1OSIsICJNNTEyIDI1NmEyNTYgMjU2IDAgMSAwIC01MTIgMCAyNTYgMjU2IDAgMSAwIDUxMiAwek0xMjQuNyAyNDQuN2wxMDQtMTA0YzQuNi00LjYgMTEuNS01LjkgMTcuNC0zLjVzOS45IDguMyA5LjkgMTQuOGwwIDU2IDk2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAzMmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtOTYgMCAwIDU2YzAgNi41LTMuOSAxMi4zLTkuOSAxNC44cy0xMi45IDEuMS0xNy40LTMuNWwtMTA0LTEwNGMtNi4yLTYuMi02LjItMTYuNCAwLTIyLjZ6Il0KICAgIH07CiAgICBmYUFycm93QWx0Q2lyY2xlTGVmdDIgPSBmYUNpcmNsZUxlZnQyOwogICAgZmFDcnV6ZWlyb1NpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY3J1emVpcm8tc2lnbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlMTUyIiwgIk0yNDAgOTZjLTg4LjQgMC0xNjAgNzEuNi0xNjAgMTYwIDAgNzEuNiA0Ny4xIDEzMi4zIDExMiAxNTIuN0wxOTIgMjU2YzAtMTMuMyAxMC43LTI0IDI0LTI0IDEyLjggMCAyMy4zIDEwLjEgMjQgMjIuNyAxNS41LTkuNSAzMy41LTE0LjcgNTIuMy0xNC43bDExLjggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTEuOCAwYy0xOC44IDAtMzYuMSAxMC00NS40IDI2LjMtNC41IDcuOS02LjkgMTYuOC02LjkgMjUuOWwwIDc1LjhjNDIuNSAwIDgxLjEtMTYuNiAxMDkuOC00My42IDEyLjktMTIuMSAzMy4xLTExLjUgNDUuMiAxLjNzMTEuNSAzMy4xLTEuMyA0NS4yQzM1My43IDQ1Ni44IDI5OS41IDQ4MCAyNDAgNDgwIDExNi4zIDQ4MCAxNiAzNzkuNyAxNiAyNTZTMTE2LjMgMzIgMjQwIDMyYzU5LjUgMCAxMTMuNyAyMy4yIDE1My43IDYxLjEgMTIuOSAxMi4xIDEzLjQgMzIuNCAxLjMgNDUuMnMtMzIuNCAxMy40LTQ1LjIgMS4zQzMyMS4xIDExMi42IDI4Mi41IDk2IDI0MCA5NnoiXQogICAgfTsKICAgIGZhU21va2luZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzbW9raW5nIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4Njg0XSwgImY0OGQiLCAiTTM2MCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgMTljMCA0MC4zIDE2IDc5IDQ0LjUgMTA3LjVsMjEgMjFDNDY5IDE5MSA0ODAgMjE3LjQgNDgwIDI0NWwwIDE5YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMTljMC0xNC45LTUuOS0yOS4xLTE2LjQtMzkuNmwtMjEtMjFDMzU3LjEgMTQ2LjkgMzM2IDk2IDMzNiA0M2wwLTE5YzAtMTMuMyAxMC43LTI0IDI0LTI0ek01NTIgMjg4Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTE5YzAtNDAuMy0xNi03OS00NC41LTEwNy41bC0yMS0yMUM0NDMgOTcgNDMyIDcwLjYgNDMyIDQzbDAtMTljMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDE5YzAgMTQuOSA1LjkgMjkuMSAxNi40IDM5LjZsMjEgMjFDNTU0LjkgMTQxLjEgNTc2IDE5MiA1NzYgMjQ1bDAgMTljMCAxMy4zLTEwLjcgMjQtMjQgMjR6TTMyMCA0NDhsOTYgMCAwLTMyLTk2IDAgMCAzMnpNMCA0MTZjMC0zNS4zIDI4LjctNjQgNjQtNjRsMzg0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA5NmMwIDE3LjctMTQuMyAzMi0zMiAzMkw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMzJ6bTU3Ni00MGwwIDExMmMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTExMmMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0eiJdCiAgICB9OwogICAgZmFTcXVhcmVQb2xsVmVydGljYWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXBvbGwtdmVydGljYWwiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsicG9sbCJdLCAiZjY4MSIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnptNTYgMTkyYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgMTEyYzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMTEyYzAtMTMuMyAxMC43LTI0IDI0LTI0em0xODQgODhjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNDh6TTIyNCAxMjhjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCAyMDhjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0yMDhjMC0xMy4zIDEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYVBvbGwgPSBmYVNxdWFyZVBvbGxWZXJ0aWNhbDsKICAgIGZhUGVyc29uQ2lyY2xlTWludXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLWNpcmNsZS1taW51cyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTQwIiwgIk0yODAgMjRhNTYgNTYgMCAxIDAgLTExMiAwIDU2IDU2IDAgMSAwIDExMiAwem0yNCAyMTIuN0wzNDEgMjg2LjZjMTIuOC0xNy41IDI4LjUtMzIuNyA0Ni4zLTQ1bC01Ni4yLTc1LjdDMzA2IDEzMiAyNjYuMyAxMTIgMjI0IDExMnMtODIgMjAtMTA3LjIgNTMuOWwtNzAuNSA5NWMtMTAuNSAxNC4yLTcuNiAzNC4yIDYuNiA0NC44czM0LjIgNy42IDQ0LjgtNi42TDE0NCAyMzYuNyAxNDQgNTEyYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xNjBjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDE2MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjc1LjN6TTY0MCA0MDBhMTQ0IDE0NCAwIDEgMCAtMjg4IDAgMTQ0IDE0NCAwIDEgMCAyODggMHptLTY0IDBjMCA4LjgtNy4yIDE2LTE2IDE2bC0xMjggMGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNmwxMjggMGM4LjggMCAxNiA3LjIgMTYgMTZ6Il0KICAgIH07CiAgICBmYUJpb2hhemFyZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiaW9oYXphcmQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFs5NzYzXSwgImY3ODAiLCAiTTI2MCAxMi42YzAtOC4zLTcuNi0xNC41LTE1LjUtMTIuMS02MC45IDE4LjgtMTA1LjEgNzUuOC0xMDUuMSAxNDMuMSAwIDI1LjEgNi4xIDQ4LjcgMTcgNjkuNS0yMSAxLjgtNDIgOC4yLTYxLjUgMTkuNS01Ny45IDMzLjYtODQuOCAxMDAuMi03MC45IDE2Mi41IDEuOSA4LjQgMTEuNCAxMiAxOC45IDcuNiA1LTIuOSA3LjYtOC42IDcuMS0xNC40LS4zLTMuMy0uNC02LjYtLjQtMTAuMSAwLTEyMy41IDE4NC40LTEyMy41IDE4NC40IDAgMCA4OC40LTk0LjUgMTEzLjYtMTQ4LjIgNzUuNC00LjUtMy4yLTEwLjUtMy45LTE1LjMtMS4xLTcgNC4xLTguNiAxMy42LTIuNyAxOS4xIDQ2LjYgNDMuOCAxMTggNTMuOSAxNzYuMSAyMC4yIDE3LjktMTAuNCAzMi44LTIzLjkgNDQuNS0zOS40IDExLjcgMTUuNiAyNi42IDI5LjEgNDQuNSAzOS40IDU4LjEgMzMuNyAxMjkuNSAyMy42IDE3Ni4xLTIwLjIgNS45LTUuNSA0LjMtMTUuMS0yLjctMTkuMS00LjgtMi44LTEwLjgtMi4xLTE1LjMgMS4xLTUzLjcgMzguMi0xNDguMiAxMy0xNDguMi03NS40IDAtMTIzLjUgMTg0LjQtMTIzLjUgMTg0LjQgMCAwIDMuNC0uMSA2LjgtLjQgMTAuMS0uNSA1LjggMi4xIDExLjUgNy4xIDE0LjQgNy40IDQuMyAxNyAuOCAxOC45LTcuNiAxMy45LTYyLjItMTMtMTI4LjktNzAuOS0xNjIuNS0xOS41LTExLjMtNDAuNC0xNy43LTYxLjUtMTkuNSAxMC45LTIwLjggMTctNDQuNCAxNy02OS41IDAtNjcuMy00NC4yLTEyNC4zLTEwNS4xLTE0My4xLTcuOS0yLjQtMTUuNSAzLjgtMTUuNSAxMi4xIDAgNS45IDQgMTEgOS41IDEzLjIgODMuNCAzMy42IDcwLjggMTc4LjQtMzcuOCAxNzguNFMxNjcuMSA1OS40IDI1MC41IDI1LjhjNS41LTIuMiA5LjUtNy4zIDkuNS0xMy4yek0yNDguNCAyODhhNDAgNDAgMCAxIDEgODAgMCA0MCA0MCAwIDEgMSAtODAgMHpNNDM1IDMxNy43Yy0xNi4yIDAtMzEuNCA1LjUtNDIuMSAxNS0xMC4xIDkuMS0xOC4xIDIzLjQtMTguMSA0NS42IDAgMjEuMSA3LjIgMzUgMTYuNSA0NC4xIDMyLjItMjQuNiA1NS41LTYwLjUgNjMuOS0xMDEuOC02LjMtMS45LTEzLjItMy0yMC4yLTN6TTIwMiAzNzguM2MwLTIyLjMtOC0zNi42LTE4LjEtNDUuNi0xMC43LTkuNi0yNS45LTE1LTQyLjEtMTUtNyAwLTEzLjkgMS0yMC4yIDMgOC40IDQxLjMgMzEuNiA3Ny4yIDYzLjkgMTAxLjggOS40LTkuMSAxNi41LTIzLjEgMTYuNS00NC4yem00MS4yLTIyNC4zYzkgMTAuMiAyMy4yIDE4LjIgNDUuMiAxOC4yczM2LjItOCA0NS4yLTE4LjJjNi43LTcuNiAxMS41LTE3LjUgMTMuNi0yOC40LTE4LjMtNi44LTM4LjItMTAuNS01OC44LTEwLjVzLTQwLjUgMy43LTU4LjggMTAuNWMyLjIgMTAuOSA2LjkgMjAuOCAxMy42IDI4LjV6Il0KICAgIH07CiAgICBmYUJlbGxDb25jaWVyZ2UgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmVsbC1jb25jaWVyZ2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg3MTgsICJjb25jaWVyZ2UtYmVsbCJdLCAiZjU2MiIsICJNMjE2IDY0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDE2IDAgMCAzMy4zQzEyNC44IDE1Ni43IDQwLjIgMjQzLjcgMzIuNiAzNTJsNDQ2LjkgMEM0NzEuOCAyNDMuNyAzODcuMiAxNTYuNyAyODAgMTQ1LjNsMC0zMy4zIDE2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTgwIDB6TTI0IDQwMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw0NjQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNEwyNCA0MDB6Il0KICAgIH07CiAgICBmYUNvbmNpZXJnZUJlbGwgPSBmYUJlbGxDb25jaWVyZ2U7CiAgICBmYVJ1bGVySG9yaXpvbnRhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJydWxlci1ob3Jpem9udGFsIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY1NDciLCAiTTQ4IDM4NGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCAxNzZjMC0yNi41IDIxLjUtNDggNDgtNDhsMjQgMCAwIDEwNGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTA0IDQ4IDAgMCA3MmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNzIgNDggMCAwIDEwNGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTA0IDQ4IDAgMCA3MmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNzIgNDggMCAwIDEwNGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTA0IDI0IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAxNjBjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggMzg0eiJdCiAgICB9OwogICAgZmFIb3JzZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3JzZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyODAxNF0sICJmNmYwIiwgIk00NDggMjM4LjFsMC03OC4xIDE2IDAgOS44IDE5LjZjMTIuNSAyNS4xIDQyLjIgMzYuNCA2OC4zIDI2IDIwLjUtOC4yIDMzLjktMjggMzMuOS01MC4xTDU3NiA4MGMwLTE5LjEtOC40LTM2LjMtMjEuNy00OGw1LjcgMGM4LjggMCAxNi03LjIgMTYtMTZTNTY4LjggMCA1NjAgMEw0NDggMEMzNzcuMyAwIDMyMCA1Ny4zIDMyMCAxMjhsLTE3MS4yIDBDMTE4LjEgMTI4IDkxLjIgMTQ0LjMgNzYuMyAxNjguOCAzMy4yIDE3NC41IDAgMjExLjQgMCAyNTZsMCA1NmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNTZjMC0xMy40IDYuNi0yNS4yIDE2LjctMzIuNSAxLjYgMTMgNi4zIDI1LjQgMTMuNiAzNi40bDI4LjIgNDIuNGM4LjMgMTIuNCA2LjQgMjguNy0xLjIgNDEuNi0xNi41IDI4LTIwLjYgNjIuMi0xMCA5My45bDE3LjUgNTIuNGM0LjQgMTMuMSAxNi42IDIxLjkgMzAuNCAyMS45bDMzLjcgMGMyMS44IDAgMzcuMy0yMS40IDMwLjQtNDIuMWwtMjAuOC02Mi41Yy0yLjEtNi40LS41LTEzLjQgNC4zLTE4LjJsMTIuNy0xMi43YzEzLjItMTMuMiAyMC42LTMxLjEgMjAuNi00OS43IDAtMi4zLS4xLTQuNi0uMy02LjlsODQgMjRjNC4xIDEuMiA4LjIgMi4xIDEyLjMgMi44TDMyMCA0ODBjMCAxNy43IDE0LjMgMzIgMzIgMzJsMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTE2NC4zYzE5LjItMTkuMiAzMS41LTQ1LjcgMzItNzUuN2wwIDAgMC0xLjl6TTQ5NiA2NGExNiAxNiAwIDEgMSAwIDMyIDE2IDE2IDAgMSAxIDAtMzJ6Il0KICAgIH07CiAgICBmYUNhbGVuZGFyMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYWxlbmRhciIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyODE5NywgMTI4MTk4XSwgImYxMzMiLCAiTTEyOCAwQzExMC4zIDAgOTYgMTQuMyA5NiAzMmwwIDMyLTMyIDBDMjguNyA2NCAwIDkyLjcgMCAxMjhsMCA0OCA0NDggMCAwLTQ4YzAtMzUuMy0yOC43LTY0LTY0LTY0bC0zMiAwIDAtMzJjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAzMi0xMjggMCAwLTMyYzAtMTcuNy0xNC4zLTMyLTMyLTMyek0wIDIyNEwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTE5Mi00NDggMHoiXQogICAgfTsKICAgIGZhSGFuZHNIb2xkaW5nQ2hpbGQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZHMtaG9sZGluZy1jaGlsZCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNGZhIiwgIk0zMjAtMzJhNDAgNDAgMCAxIDEgMCA4MCA0MCA0MCAwIDEgMSAwLTgwek00MCA2NGMyMi4xIDAgNDAgMTcuOSA0MCA0MGwwIDE2MC4yYzAgMTcgNi43IDMzLjMgMTguNyA0NS4zbDUxLjEgNTEuMWM4LjMgOC4zIDIxLjMgOS42IDMxIDMuMSAxMi45LTguNiAxNC43LTI2LjkgMy43LTM3LjgtNy4zLTcuMy0yMy4xLTIzLjEtNDcuMi00Ny4yLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zczMyLjgtMTIuNSA0NS4zIDBjMjQuMSAyNC4xIDM5LjkgMzkuOSA0Ny4yIDQ3LjJsMCAwIDI1LjMgMjUuM2MyMSAyMSAzMi44IDQ5LjUgMzIuOCA3OS4ybDAgNzguOWMwIDI2LjUtMjEuNSA0OC00OCA0OGwtNjYuNyAwYy0xNyAwLTMzLjMtNi43LTQ1LjMtMTguN0wyOC4xIDM5My40QzEwLjEgMzc1LjQgMCAzNTEgMCAzMjUuNUwwIDEwNEMwIDgxLjkgMTcuOSA2NCA0MCA2NHptNTYwIDBjMjIuMSAwIDQwIDE3LjkgNDAgNDBsMCAyMjEuNWMwIDI1LjUtMTAuMSA0OS45LTI4LjEgNjcuOUw1MTIgNDkzLjNjLTEyIDEyLTI4LjMgMTguNy00NS4zIDE4LjdMNDAwIDUxMmMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC03OC45YzAtMjkuNyAxMS44LTU4LjIgMzIuOC03OS4ybDI1LjMtMjUuMyAwIDBjNy4zLTcuMyAyMy4xLTIzLjEgNDcuMi00Ny4yIDEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwczEyLjUgMzIuOCAwIDQ1LjNjLTI0LjEgMjQuMS0zOS45IDM5LjktNDcuMiA0Ny4yLTExIDExLTkuMiAyOS4yIDMuNyAzNy44IDkuNyA2LjUgMjIuNyA1LjIgMzEtMy4xbDUxLjEtNTEuMWMxMi0xMiAxOC43LTI4LjMgMTguNy00NS4zTDU2MCAxMDRjMC0yMi4xIDE3LjktNDAgNDAtNDB6TTM4NC41IDE0OWwtMTkuOC0xNi43IDExLjEgODguOGMxLjYgMTMuMi03LjcgMjUuMS0yMC44IDI2LjhzLTI1LjEtNy43LTI2LjgtMjAuOGwtNC40LTM1LTcuNiAwLTQuNCAzNWMtMS42IDEzLjItMTMuNiAyMi41LTI2LjggMjAuOHMtMjIuNS0xMy42LTIwLjgtMjYuOGwxMS4xLTg4LjgtMTkuOCAxNi43Yy0xMC4xIDguNi0yNS4zIDcuMy0zMy44LTIuOHMtNy4zLTI1LjMgMi44LTMzLjhsMjcuOS0yMy42QzI3MS4zIDcyLjggMjk1LjMgNjQgMzIwIDY0czQ4LjcgOC44IDY3LjYgMjQuN2wyNy45IDIzLjZjMTAuMSA4LjYgMTEuNCAyMy43IDIuOCAzMy44cy0yMy43IDExLjQtMzMuOCAyLjh6Il0KICAgIH07CiAgICBmYUl0YWxpYyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJpdGFsaWMiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjAzMyIsICJNMTI4IDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMybDE5MiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC01OC43IDAtMTMzLjMgMzIwIDY0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgNDgwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDU4LjcgMCAxMzMuMy0zMjAtNjQgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6Il0KICAgIH07CiAgICBmYUtoYW5kYSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJraGFuZGEiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5NzcyXSwgImY2NmQiLCAiTTI0MC43IDhjOC45LTcuNCAyMS44LTcuNCAzMC43IDBsMzcuOCAzMS41YzguNyA3LjMgMTEuMSAxOS42IDYgMjkuNi0xLjIgMi40LTIuOCA1LjUtNC42IDkuMiAzNC4yIDE5LjIgNTcuMyA1NS44IDU3LjMgOTcuOHMtMjMuMSA3OC42LTU3LjMgOTcuOGMxLjggMy43IDMuMyA2LjggNC42IDkuMiA1LjEgMTAgMi43IDIyLjMtNiAyOS42bC0zNy4yIDMxIDAgMTkuOGMyMi45LTE1LjcgNDguNC0zMy4zIDc2LjctNTIuNyA0Mi44LTI5LjQgNjguNC03OCA2OC40LTEzMGwwLTExLjFjMC0yMy45LTcuMS00Ny4zLTIwLjQtNjcuMi01LjEtNy43LTQuNi0xNy44IDEuNy0yNC42IDYuNi03LjEgMTcuMi04LjEgMjUuMi0yLjggMjcuNSAxOC4xIDg5LjQgNjcuNSA4OS40IDE0OS4xIDAgNDYuNS0yMC4yIDg4LjYtNDEuOCAxMjAuNC0yMS42IDMyLTQ1LjYgNTUtNTUuMyA2My44LTcuOCA3LjEtMTkgNy45LTI3LjYgM2wtNzAuOC00MC4zLTMyLjcgMjIuNSA0NS41IDMxLjNjMS44LS40IDMuNy0uNyA1LjctLjcgMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRjLTEyLjIgMC0yMi4zLTkuMS0yMy44LTIxbC00MC4yLTI3LjYgMCAyOC45YzkuNiA1LjUgMTYgMTUuOSAxNiAyNy43IDAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMyYzAtMTEuOCA2LjQtMjIuMiAxNi0yNy43bDAtMjguMS00MC4zIDI3LjdjLTEuOCAxMS40LTExLjggMjAuMS0yMy43IDIwLjEtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGMyLjIgMCA0LjQgLjMgNi41IC45bDQ1LjgtMzEuNS0zMi43LTIyLjUtNzAuOCA0MC4zYy04LjcgNC45LTE5LjggNC4xLTI3LjYtMy05LjctOC44LTMzLjctMzEuOS01NS4zLTYzLjgtMjEuNS0zMS44LTQxLjgtNzMuOS00MS44LTEyMC40IDAtODEuNyA2MS45LTEzMS4xIDg5LjQtMTQ5LjEgOC4xLTUuMyAxOC42LTQuMyAyNS4yIDIuOCA2LjQgNi45IDYuOCAxNyAxLjcgMjQuNi0xMy4zIDE5LjktMjAuNCA0My4zLTIwLjQgNjcuMmwwIDExLjFjMCA1MS45IDI1LjYgMTAwLjYgNjguNCAxMzAgMjguNCAxOS42IDUzLjcgMzYuOSA3NS42IDUybDAtMTkuMS0zNy4yLTMxYy04LjctNy4zLTExLjEtMTkuNi02LTI5LjYgMS4yLTIuNCAyLjgtNS41IDQuNi05LjItMzQuMi0xOS4yLTU3LjMtNTUuOC01Ny4zLTk3LjhzMjMuMS03OC42IDU3LjMtOTcuOGMtMS44LTMuNy0zLjMtNi44LTQuNi05LjItNS4xLTEwLTIuNy0yMi4zIDYtMjkuNkwyNDAuNyA4ek0yMjAuMyAxMjIuOWMtMTcgMTEuNS0yOC4yIDMxLTI4LjIgNTMuMXMxMS4yIDQxLjYgMjguMiA1My4xYzYuOC0xOS4yIDExLjgtMzguNCAxMS44LTUzLjFzLTQuOS0zMy45LTExLjgtNTMuMXptNzEuNSAxMDYuMmMxNy0xMS41IDI4LjItMzEgMjguMi01My4xcy0xMS4yLTQxLjYtMjguMi01My4xYy02LjggMTkuMi0xMS44IDM4LjQtMTEuOCA1My4xczQuOSAzMy45IDExLjggNTMuMXoiXQogICAgfTsKICAgIGZhRmFjZUZyb3duT3BlbjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1mcm93bi1vcGVuIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTUwLCAiZnJvd24tb3BlbiJdLCAiZjU3YSIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTE3NiAxNzZhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em0xMjggMzJhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHpNMTgyLjQgMzgyLjVjLTEyLjQgNS4yLTI2LjUtNC4xLTIxLjEtMTYuNCAxNi0zNi42IDUyLjQtNjIuMSA5NC44LTYyLjFzNzguOCAyNS42IDk0LjggNjIuMWM1LjQgMTIuMy04LjcgMjEuNi0yMS4xIDE2LjQtMjIuNC05LjUtNDcuNC0xNC44LTczLjctMTQuOHMtNTEuMyA1LjMtNzMuNyAxNC44eiJdCiAgICB9OwogICAgZmFGcm93bk9wZW4yID0gZmFGYWNlRnJvd25PcGVuMjsKICAgIGZhQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hlY2siLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMDAwMywgMTAwMDRdLCAiZjAwYyIsICJNNDM0LjggNzAuMWMxNC4zIDEwLjQgMTcuNSAzMC40IDcuMSA0NC43bC0yNTYgMzUyYy01LjUgNy42LTE0IDEyLjMtMjMuNCAxMy4xcy0xOC41LTIuNy0yNS4xLTkuM2wtMTI4LTEyOGMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMGwxMDEuNSAxMDEuNSAyMzQtMzIxLjdjMTAuNC0xNC4zIDMwLjQtMTcuNSA0NC43LTcuMXoiXQogICAgfTsKICAgIGZhRmluZ2VycHJpbnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmluZ2VycHJpbnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjU3NyIsICJNNDggMjU2YzAtMTE0LjkgOTMuMS0yMDggMjA4LTIwOCA2My4xIDAgMTE5LjYgMjguMSAxNTcuOCA3Mi41IDguNiAxMC4xIDIzLjggMTEuMiAzMy44IDIuNnMxMS4yLTIzLjggMi42LTMzLjhDNDAzLjMgMzQuNiAzMzMuNyAwIDI1NiAwIDExNC42IDAgMCAxMTQuNiAwIDI1NmwwIDQwYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC00MHptNDU4LjUtNTIuOWMtMi43LTEzLTE1LjUtMjEuMy0yOC40LTE4LjVzLTIxLjMgMTUuNS0xOC41IDI4LjRjMi45IDEzLjkgNC41IDI4LjMgNC41IDQzLjFsMCA0MGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNDBjMC0xOC4xLTEuOS0zNS44LTUuNS01Mi45ek0yNTYgODBjLTE5IDAtMzcuNCAzLTU0LjUgOC42LTE1LjIgNS0xOC43IDIzLjctOC4zIDM1LjkgNy4xIDguMyAxOC44IDEwLjggMjkuNCA3LjkgMTAuNi0yLjkgMjEuOC00LjQgMzMuNC00LjQgNzAuNyAwIDEyOCA1Ny4zIDEyOCAxMjhsMCAyNC45YzAgMjUuMi0xLjUgNTAuMy00LjQgNzUuMy0xLjcgMTQuNiA5LjQgMjcuOCAyNC4yIDI3LjggMTEuOCAwIDIxLjktOC42IDIzLjMtMjAuMyAzLjMtMjcuNCA1LTU1IDUtODIuN2wwLTI0LjljMC05Ny4yLTc4LjgtMTc2LTE3Ni0xNzZ6TTE1MC43IDE0OC43Yy05LjEtMTAuNi0yNS4zLTExLjQtMzMuOS0uNC0yMy4xIDI5LjgtMzYuOCA2Ny4xLTM2LjggMTA3LjdsMCAyNC45YzAgMjQuMi0yLjYgNDguNC03LjggNzEuOS0zLjQgMTUuNiA3LjkgMzEuMSAyMy45IDMxLjEgMTAuNSAwIDE5LjktNyAyMi4yLTE3LjMgNi40LTI4LjEgOS43LTU2LjggOS43LTg1LjhsMC0yNC45YzAtMjcuMiA4LjUtNTIuNCAyMi45LTczLjEgNy4yLTEwLjQgOC0yNC42LS4yLTM0LjJ6TTI1NiAxNjBjLTUzIDAtOTYgNDMtOTYgOTZsMCAyNC45YzAgMzUuOS00LjYgNzEuNS0xMy44IDEwNi4xLTMuOCAxNC4zIDYuNyAyOSAyMS41IDI5IDkuNSAwIDE3LjktNi4yIDIwLjQtMTUuNCAxMC41LTM5IDE1LjktNzkuMiAxNS45LTExOS43bDAtMjQuOWMwLTI4LjcgMjMuMy01MiA1Mi01MnM1MiAyMy4zIDUyIDUybDAgMjQuOWMwIDM2LjMtMy41IDcyLjQtMTAuNCAxMDcuOS0yLjcgMTMuOSA3LjcgMjcuMiAyMS44IDI3LjIgMTAuMiAwIDE5LTcgMjEtMTcgNy43LTM4LjggMTEuNi03OC4zIDExLjYtMTE4LjFsMC0yNC45YzAtNTMtNDMtOTYtOTYtOTZ6bTI0IDk2YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMjQuOWMwIDU5LjktMTEgMTE5LjMtMzIuNSAxNzUuMmwtNS45IDE1LjNjLTQuOCAxMi40IDEuNCAyNi4zIDEzLjggMzFzMjYuMy0xLjQgMzEtMTMuOGw1LjktMTUuM0MyNjcuOSA0MTEuOSAyODAgMzQ2LjcgMjgwIDI4MC45bDAtMjQuOXoiXQogICAgfTsKICAgIGZhQ2hhcmdpbmdTdGF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoYXJnaW5nLXN0YXRpb24iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjVlNyIsICJNNjQgNjRDNjQgMjguNyA5Mi43IDAgMTI4IDBMMjg4IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyMjRjNDQuMiAwIDgwIDM1LjggODAgODBsMCAxMmMwIDExIDkgMjAgMjAgMjBzMjAtOSAyMC0yMGwwLTEyNy43Yy0zMi41LTEwLjItNTYtNDAuNS01Ni03Ni4zbDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDE2IDAgMC00OGMwLTguOCA3LjItMTYgMTYtMTZzMTYgNy4yIDE2IDE2bDAgNDggMzIgMCAwLTQ4YzAtOC44IDcuMi0xNiAxNi0xNnMxNiA3LjIgMTYgMTZsMCA0OCAxNiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgMzUuOC0yMy41IDY2LjEtNTYgNzYuM0w1MjAgMzgwYzAgMzcuNi0zMC40IDY4LTY4IDY4cy02OC0zMC40LTY4LTY4bDAtMTJjMC0xNy43LTE0LjMtMzItMzItMzJsMCAxMjkuNGM5LjMgMy4zIDE2IDEyLjIgMTYgMjIuNiAwIDEzLjMtMTAuNyAyNC0yNCAyNEw3MiA1MTJjLTEzLjMgMC0yNC0xMC43LTI0LTI0IDAtMTAuNSA2LjctMTkuMyAxNi0yMi42TDY0IDY0em04Mi43IDEyNS43bDM5IDAtMjAuOSA2Ni45Yy0yLjQgNy42IDMuMyAxNS40IDExLjMgMTUuNCAyLjkgMCA1LjYtMSA3LjgtMi45bDk0LjYtODJjMy4xLTIuNyA0LjktNi42IDQuOS0xMC43IDAtNy44LTYuMy0xNC4xLTE0LjEtMTQuMWwtMzkgMCAyMC45LTY2LjljMi40LTcuNi0zLjMtMTUuNC0xMS4zLTE1LjQtMi45IDAtNS42IDEtNy44IDIuOWwtOTQuNiA4MmMtMy4xIDIuNy00LjkgNi42LTQuOSAxMC43IDAgNy44IDYuMyAxNC4xIDE0LjEgMTQuMXoiXQogICAgfTsKICAgIGZhVXNlckxvY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlci1sb2NrIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY1MDIiLCAiTTIyNCA4YTEyMCAxMjAgMCAxIDEgMCAyNDAgMTIwIDEyMCAwIDEgMSAwLTI0MHpNMTk0LjMgMzA0bDU5LjQgMGMyOS43IDAgNTcuNyA3LjMgODIuMyAyMC4xbDAgNC4zYy0xOS42IDE3LjYtMzIgNDMuMS0zMiA3MS41bDAgOTZjMCA1LjUgLjUgMTAuOSAxLjMgMTYuMUw0NS43IDUxMkMyOS4zIDUxMiAxNiA0OTguNyAxNiA0ODIuMyAxNiAzODMuOCA5NS44IDMwNCAxOTQuMyAzMDR6bTMwMS43IC4xYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgNDcuOSA2NCAwIDAtNDcuOXpNMzUyIDQwMGMwLTIwLjkgMTMuNC0zOC43IDMyLTQ1LjNsMC01MC42YzAtNDQuMiAzNS44LTgwIDgwLTgwczgwIDM1LjggODAgODBsMCA1MC42YzE4LjYgNi42IDMyIDI0LjQgMzIgNDUuM2wwIDk2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xMjggMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC05NnoiXQogICAgfTsKICAgIGZhTW9iaWxlU2NyZWVuQnV0dG9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vYmlsZS1zY3JlZW4tYnV0dG9uIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbIm1vYmlsZS1hbHQiXSwgImYzY2QiLCAiTTE2IDY0QzE2IDI4LjcgNDQuNyAwIDgwIDBMMzA0IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzODRjMCAzNS4zLTI4LjcgNjQtNjQgNjRMODAgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwxNiA2NHptNjQgMGwwIDMwNCAyMjQgMCAwLTMwNC0yMjQgMHpNMTkyIDQ3MmMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMi0zMiAxNC4zLTMyIDMyIDE0LjMgMzIgMzIgMzJ6Il0KICAgIH07CiAgICBmYU1vYmlsZUFsdCA9IGZhTW9iaWxlU2NyZWVuQnV0dG9uOwogICAgZmFBbmNob3JDaXJjbGVDaGVjayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhbmNob3ItY2lyY2xlLWNoZWNrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU0YWEiLCAiTTMyMCA5NmEzMiAzMiAwIDEgMSAtNjQgMCAzMiAzMiAwIDEgMSA2NCAwek0yODggMGMtNTMgMC05NiA0My05NiA5NiAwIDQxLjggMjYuNyA3Ny40IDY0IDkwLjVsMCAyNTcuOWMtNjIuOS0xNC4zLTExMC4yLTY5LjctMTExLjktMTM2LjVsMTYuMSAxNC4xYzEwIDguNyAyNS4xIDcuNyAzMy45LTIuM3M3LjctMjUuMS0yLjMtMzMuOWwtNjQtNTZjLTktNy45LTIyLjYtNy45LTMxLjYgMGwtNjQgNTZjLTEwIDguNy0xMSAyMy45LTIuMyAzMy45czIzLjkgMTEgMzMuOSAyLjNMODAgMzA3LjljMi4xIDExMy4xIDk0LjQgMjA0LjEgMjA4IDIwNC4xIDE2LjYgMCAzMi43LTEuOSA0OC4yLTUuNi0yMC4zLTMwLjUtMzIuMi02Ny0zMi4yLTEwNi40IDAtMjcuMyA1LjctNTMuMyAxNi03Ni45bDAtMTM2LjZjMzcuMy0xMy4yIDY0LTQ4LjcgNjQtOTAuNSAwLTUzLTQzLTk2LTk2LTk2ek02NDAgNDAwYTE0NCAxNDQgMCAxIDAgLTI4OCAwIDE0NCAxNDQgMCAxIDAgMjg4IDB6bS04Ni42LTYwLjljNy4xIDUuMiA4LjcgMTUuMiAzLjUgMjIuM2wtNjQgODhjLTIuOCAzLjgtNyA2LjItMTEuNyA2LjVzLTkuMy0xLjMtMTIuNi00LjZsLTQwLTQwYy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBsMjYuOCAyNi44IDUzLTcyLjljNS4yLTcuMSAxNS4yLTguNyAyMi40LTMuNXoiXQogICAgfTsKICAgIGZhUGVyc29uV2Fsa2luZ1dpdGhDYW5lID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi13YWxraW5nLXdpdGgtY2FuZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJibGluZCJdLCAiZjI5ZCIsICJNMjI0LTMyYTU2IDU2IDAgMSAxIDAgMTEyIDU2IDU2IDAgMSAxIDAtMTEyek0xNjAgMjA1LjNsLTIyLjYgMjIuNmMtNiA2LTkuNCAxNC4xLTkuNCAyMi42bDAgMzcuNWMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTM3LjVjMC0yNS41IDEwLjEtNDkuOSAyOC4xLTY3LjlsMzQuNC0zNC40YzIzLjItMjMuMiA1NC42LTM2LjIgODcuMy0zNi4yIDM2LjEgMCA3MC4zIDE1LjggOTMuOCA0My4xbDY4LjYgODBjMTEuNSAxMy40IDkuOSAzMy42LTMuNSA0NS4xcy0zMy42IDkuOS00NS4xLTMuNWwtNTUuNy02NSAwIDExOC42IDM0LjUgMjkuNmMxNy43IDE1LjIgMjkuMyAzNi4yIDMyLjYgNTkuM2wxMi42IDg4LjFjMi41IDE3LjUtOS43IDMzLjctMjcuMiAzNi4ycy0zMy43LTkuNy0zNi4yLTI3LjJsLTEyLjYtODguMWMtMS4xLTcuNy01LTE0LjctMTAuOS0xOS44bC03MS40LTYxLjJjLTIxLjMtMTguMi0zMy41LTQ0LjktMzMuNS03Mi45bDAtNjkuM3ptLjEgMTY1LjhjMi40IDIuMyA0LjggNC42IDcuNCA2LjhsNDYgMzkuNC0yLjIgNy42Yy00LjUgMTUuNy0xMi45IDMwLTI0LjQgNDEuNWwtNjguMyA2OC4zYy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM2w2OC4zLTY4LjNjMy44LTMuOCA2LjYtOC42IDguMS0xMy44TDE2MC4xIDM3MXptMjMzLjUtNjIuMmMxMC42LTggMjUuNi01LjggMzMuNiA0LjhsMTQ0IDE5MmM4IDEwLjYgNS44IDI1LjYtNC44IDMzLjZzLTI1LjYgNS44LTMzLjYtNC44bC0xNDQtMTkyYy04LTEwLjYtNS44LTI1LjYgNC44LTMzLjZ6Il0KICAgIH07CiAgICBmYUJsaW5kID0gZmFQZXJzb25XYWxraW5nV2l0aENhbmU7CiAgICBmYUZpbGVXYXZlZm9ybSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLXdhdmVmb3JtIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbImZpbGUtbWVkaWNhbC1hbHQiXSwgImY0NzgiLCAiTTAgNjRDMCAyOC43IDI4LjcgMCA2NCAwTDIxMy41IDBjMTcgMCAzMy4zIDYuNyA0NS4zIDE4LjdMMzY1LjMgMTI1LjNjMTIgMTIgMTguNyAyOC4zIDE4LjcgNDUuM0wzODQgNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC05NiA2MC4zIDAgNDguOCA2Mi43YzUuMSA2LjYgMTMuMyAxMCAyMS42IDkuMXMxNS41LTYuMSAxOS4xLTEzLjZsNDIuOS05MS4yIDkuOSAxOS44YzQuMSA4LjEgMTIuNCAxMy4zIDIxLjUgMTMuM2w3MiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC01Ny4yIDAtMjUuNC01MC43Yy00LjEtOC4yLTEyLjYtMTMuNC0yMS44LTEzLjNzLTE3LjUgNS41LTIxLjQgMTMuOGwtNDcuMyAxMDAuNi0zMi00MS4xQzg2LjQgMzA3LjQgNzkuNCAzMDQgNzIgMzA0TDAgMzA0IDAgNjR6bTIwOC01LjVsMCA5My41YzAgMTMuMyAxMC43IDI0IDI0IDI0TDMyNS41IDE3NiAyMDggNTguNXoiXQogICAgfTsKICAgIGZhRmlsZU1lZGljYWxBbHQgPSBmYUZpbGVXYXZlZm9ybTsKICAgIGZhSG91c2VDcmFjayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VzZS1jcmFjayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlM2IxIiwgIk0yNzcuOCA4LjZjLTEyLjMtMTEuNC0zMS4zLTExLjQtNDMuNSAwbC0yMjQgMjA4Yy05LjYgOS0xMi44IDIyLjktOCAzNS4xUzE4LjggMjcyIDMyIDI3MmwxNiAwIDAgMTc2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDg2LjQgMC0zMS4zLTUyLjJjLTQuMS02LjgtMi42LTE1LjUgMy41LTIwLjVMMjU2IDM2OCAxOTUuOCAyODUuMmMtMTAuOS0xNSA4LjItMzMuNSAyMi44LTIybDExNy45IDkyLjZjOCA2LjMgOC4yIDE4LjQgLjQgMjQuOUwyNTYgNDQ4IDI5NC40IDUxMiA0MDAgNTEyYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTc2IDE2IDBjMTMuMiAwIDI1LTguMSAyOS44LTIwLjNzMS42LTI2LjItOC0zNS4xbC0yMjQtMjA4eiJdCiAgICB9OwogICAgZmFIYXRXaXphcmQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGF0LXdpemFyZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNmU4IiwgIk02NCA0MDBsODUuNy0yMDguMmMxNy00MS4zIDQ3LjgtNzUuMyA4Ny4yLTk2LjNMMzgzLjggMTcuMmMxMi4zLTYuNiAyNi41IDQuNyAyMyAxOC4yTDM2OS42IDE3Ny44Yy0xLjEgNC4xLTEuNiA4LjMtMS42IDEyLjYgMCA2LjMgMS4yIDEyLjYgMy42IDE4LjVsNzYuNCAxOTEuMS0yMDcuMSAwIDExLjgtMzUuNCA0MC40LTEzLjVjNi41LTIuMiAxMC45LTguMyAxMC45LTE1LjJzLTQuNC0xMy0xMC45LTE1LjJsLTQwLjQtMTMuNS0xMy41LTQwLjRDMjM3IDI2MC40IDIzMC45IDI1NiAyMjQgMjU2cy0xMyA0LjQtMTUuMiAxMC45bC0xMy41IDQwLjQtNDAuNCAxMy41QzE0OC40IDMyMyAxNDQgMzI5LjEgMTQ0IDMzNnM0LjQgMTMgMTAuOSAxNS4ybDQwLjQgMTMuNSAxMS44IDM1LjQtMTQzLjEgMHpNMjc5LjYgMTQxLjVjLTEuMS0zLjMtNC4xLTUuNS03LjYtNS41cy02LjUgMi4yLTcuNiA1LjVsLTYuNyAyMC4yLTIwLjIgNi43Yy0zLjMgMS4xLTUuNSA0LjEtNS41IDcuNnMyLjIgNi41IDUuNSA3LjZsMjAuMiA2LjcgNi43IDIwLjJjMS4xIDMuMyA0LjEgNS41IDcuNiA1LjVzNi41LTIuMiA3LjYtNS41bDYuNy0yMC4yIDIwLjItNi43YzMuMy0xLjEgNS41LTQuMSA1LjUtNy42cy0yLjItNi41LTUuNS03LjZsLTIwLjItNi43LTYuNy0yMC4yek0zMiA0NDhsNDQ4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgNTEyYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMyeiJdCiAgICB9OwogICAgZmFVc2VyRG9jdG9yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXItZG9jdG9yIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInVzZXItbWQiXSwgImYwZjAiLCAiTTIyNCA4YTEyMCAxMjAgMCAxIDAgMCAyNDAgMTIwIDEyMCAwIDEgMCAwLTI0MHptNjAgMzEyLjhjLTUuNC0uNS0xMS0uOC0xNi42LS44bC04Ni45IDBjLTUuNiAwLTExLjEgLjMtMTYuNiAuOGwwIDY3LjVjMTYuNSA3LjYgMjggMjQuMyAyOCA0My42IDAgMjYuNS0yMS41IDQ4LTQ4IDQ4cy00OC0yMS41LTQ4LTQ4YzAtMTkuNCAxMS41LTM2LjEgMjgtNDMuNmwwLTU4LjRDNjEgMzUzIDE2IDQxMy42IDE2IDQ4NC42IDE2IDQ5OS43IDI4LjMgNTEyIDQzLjQgNTEybDM2MS4xIDBjMTUuMSAwIDI3LjQtMTIuMyAyNy40LTI3LjQgMC03MS00NS0xMzEuNS0xMDgtMTU0LjZsMCAzNy40YzIzLjMgOC4yIDQwIDMwLjUgNDAgNTYuNmwwIDMyYzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLTMyYzAtMTEtOS0yMC0yMC0yMHMtMjAgOS0yMCAyMGwwIDMyYzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLTMyYzAtMjYuMSAxNi43LTQ4LjMgNDAtNTYuNmwwLTQ2LjZ6Il0KICAgIH07CiAgICBmYVVzZXJNZCA9IGZhVXNlckRvY3RvcjsKICAgIGZhQ2hhcnRCYXIyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoYXJ0LWJhciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJiYXItY2hhcnQiXSwgImYwODAiLCAiTTMyIDMyYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzM2YzAgOC44IDcuMiAxNiAxNiAxNmw0MDAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkw4MCA0ODBjLTQ0LjIgMC04MC0zNS44LTgwLTgwTDAgNjRDMCA0Ni4zIDE0LjMgMzIgMzIgMzJ6bTk2IDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMybDE5MiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0xOTIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6bTMyIDgwbDEyOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0xMjggMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMnptMCAxMTJsMjU2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTI1NiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMyeiJdCiAgICB9OwogICAgZmFCYXJDaGFydDIgPSBmYUNoYXJ0QmFyMjsKICAgIGZhU3ByYXlDYW5TcGFya2xlcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcHJheS1jYW4tc3BhcmtsZXMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsiYWlyLWZyZXNoZW5lciJdLCAiZjVkMCIsICJNMTYwIDMybDAgODAgMTI4IDAgMC04MGMwLTE3LjctMTQuMy0zMi0zMi0zMkwxOTIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6bTAgMTI4Yy01MyAwLTk2IDQzLTk2IDk2bDAgMjA4YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDIyNCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMjA4YzAtNTMtNDMtOTYtOTYtOTZsLTEyOCAwem02NCA5NmE4MCA4MCAwIDEgMSAwIDE2MCA4MCA4MCAwIDEgMSAwLTE2MHpNNDQ4IDQ4YzAtMS40LTEtMy0yLjItMy42TDQxNiAzMiA0MDMuNiAyLjJDNDAzIDEgNDAxLjQgMCA0MDAgMHMtMyAxLTMuNiAyLjJMMzg0IDMyIDM1NC4yIDQ0LjRjLTEuMiAuNi0yLjIgMi4yLTIuMiAzLjYgMCAxLjQgMSAzIDIuMiAzLjZMMzg0IDY0IDM5Ni40IDkzLjhDMzk3IDk1IDM5OC42IDk2IDQwMCA5NnMzLTEgMy42LTIuMkw0MTYgNjQgNDQ1LjggNTEuNkM0NDcgNTEgNDQ4IDQ5LjQgNDQ4IDQ4em03Ni40IDQ1LjhDNTI1IDk1IDUyNi42IDk2IDUyOCA5NnMzLTEgMy42LTIuMkw1NDQgNjQgNTczLjggNTEuNmMxLjItLjYgMi4yLTIuMiAyLjItMy42IDAtMS40LTEtMy0yLjItMy42TDU0NCAzMiA1MzEuNiAyLjJDNTMxIDEgNTI5LjQgMCA1MjggMHMtMyAxLTMuNiAyLjJMNTEyIDMyIDQ4Mi4yIDQ0LjRjLTEuMiAuNi0yLjIgMi4yLTIuMiAzLjYgMCAxLjQgMSAzIDIuMiAzLjZMNTEyIDY0IDUyNC40IDkzLjh6bTcuMiAxMDAuNGMtLjYtMS4yLTIuMi0yLjItMy42LTIuMnMtMyAxLTMuNiAyLjJMNTEyIDIyNCA0ODIuMiAyMzYuNGMtMS4yIC42LTIuMiAyLjItMi4yIDMuNiAwIDEuNCAxIDMgMi4yIDMuNkw1MTIgMjU2IDUyNC40IDI4NS44Yy42IDEuMiAyLjIgMi4yIDMuNiAyLjJzMy0xIDMuNi0yLjJMNTQ0IDI1NiA1NzMuOCAyNDMuNmMxLjItLjYgMi4yLTIuMiAyLjItMy42IDAtMS40LTEtMy0yLjItMy42TDU0NCAyMjQgNTMxLjYgMTk0LjJ6TTUxMiAxNDRjMC0xLjQtMS0zLTIuMi0zLjZMNDgwIDEyOCA0NjcuNiA5OC4yQzQ2NyA5NyA0NjUuNCA5NiA0NjQgOTZzLTMgMS0zLjYgMi4yTDQ0OCAxMjggNDE4LjIgMTQwLjRjLTEuMiAuNi0yLjIgMi4yLTIuMiAzLjYgMCAxLjQgMSAzIDIuMiAzLjZMNDQ4IDE2MCA0NjAuNCAxODkuOGMuNiAxLjIgMi4yIDIuMiAzLjYgMi4yczMtMSAzLjYtMi4yTDQ4MCAxNjAgNTA5LjggMTQ3LjZjMS4yLS42IDIuMi0yLjIgMi4yLTMuNnoiXQogICAgfTsKICAgIGZhQWlyRnJlc2hlbmVyID0gZmFTcHJheUNhblNwYXJrbGVzOwogICAgZmFCYWh0U2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYWh0LXNpZ24iLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZTBhYyIsICJNMTM2IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgNDAtNzQuNCAwQzE2LjggNjQgMCA4MC44IDAgMTAxLjZMMCA0MDYuM2MwIDIzIDE4LjcgNDEuNyA0MS43IDQxLjdsNzAuMyAwIDAgNDBjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTQwIDQ4IDBjNjEuOSAwIDExMi01MC4xIDExMi0xMTIgMC00MC4xLTIxLjEtNzUuMy01Mi43LTk1LjEgMTMuMS0xOC4zIDIwLjctNDAuNyAyMC43LTY0LjkgMC02MS45LTUwLjEtMTEyLTExMi0xMTJsLTE2IDAgMC00MGMwLTEzLjMtMTAuNy0yNC0yNC0yNHpNMTEyIDEyOGwwIDk2LTQ4IDAgMC05NiA0OCAwem00OCA5NmwwLTk2IDE2IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhzLTIxLjUgNDgtNDggNDhsLTE2IDB6bS00OCA2NGwwIDk2LTQ4IDAgMC05NiA0OCAwem00OCA5NmwwLTk2IDQ4IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhzLTIxLjUgNDgtNDggNDhsLTQ4IDB6Il0KICAgIH07CiAgICBmYVRlbXBlcmF0dXJlQXJyb3dVcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0ZW1wZXJhdHVyZS1hcnJvdy11cCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJ0ZW1wZXJhdHVyZS11cCJdLCAiZTA0MCIsICJNNjQuNSA5NmMwLTUzIDQzLTk2IDk2LTk2czk2IDQzIDk2IDk2bDAgMTY0LjdjMjkuNSAyNi40IDQ4IDY0LjcgNDggMTA3LjMgMCA3OS41LTY0LjUgMTQ0LTE0NCAxNDRzLTE0NC02NC41LTE0NC0xNDRjMC00Mi42IDE4LjUtODEgNDgtMTA3LjNMNjQuNSA5NnptOTYgMzM2YzM1LjMgMCA2NC0yOC43IDY0LTY0IDAtMjYuOS0xNi41LTQ5LjktNDAtNTkuM2wwLTIxMi43YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMjEyLjdjLTIzLjUgOS41LTQwIDMyLjUtNDAgNTkuMyAwIDM1LjMgMjguNyA2NCA2NCA2NHpNNDM5LjEgOS40bDY0IDY0YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zcy0zMi44IDEyLjUtNDUuMyAwbC05LjQtOS40IDAgMTc4LjdjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xNzguNy05LjQgOS40Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM2w2NC02NGM2LTYgMTQuMS05LjQgMjIuNi05LjRzMTYuNiAzLjQgMjIuNiA5LjR6Il0KICAgIH07CiAgICBmYVRlbXBlcmF0dXJlVXAgPSBmYVRlbXBlcmF0dXJlQXJyb3dVcDsKICAgIGZhV2ViQXdlc29tZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid2ViLWF3ZXNvbWUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTY4MiIsICJNMzcyLjIgNTJjMCAyMC45LTEyLjQgMzktMzAuMiA0Ny4yTDQ0OCAxOTIgNTUyLjQgMTcxLjFjLTUuMy03LjctOC40LTE3LjEtOC40LTI3LjEgMC0yNi41IDIxLjUtNDggNDgtNDhzNDggMjEuNSA0OCA0OGMwIDI2LTIwLjYgNDcuMS00Ni40IDQ4TDQ4MSA0NDIuM2MtMTAuMyAyMy0zMy4yIDM3LjctNTguNCAzNy43bC0yMDUuMiAwYy0yNS4yIDAtNDgtMTQuOC01OC40LTM3LjdMNDYuNCAxOTJDMjAuNiAxOTEuMSAwIDE3MCAwIDE0NCAwIDExNy41IDIxLjUgOTYgNDggOTZzNDggMjEuNSA0OCA0OGMwIDEwLjEtMy4xIDE5LjQtOC40IDI3LjFMMTkyIDE5MiAyOTguMSA5OS4xYy0xNy43LTguMy0zMC0yNi4zLTMwLTQ3LjEgMC0yOC43IDIzLjMtNTIgNTItNTJzNTIgMjMuMyA1MiA1MnoiXQogICAgfTsKICAgIGZhTm9uQmluYXJ5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm5vbi1iaW5hcnkiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZTgwNyIsICJNMTkyIDU0NGMtOTcuMiAwLTE3Ni03OC44LTE3Ni0xNzYgMC04Ni4zIDYyLjEtMTU4IDE0NC0xNzNsMC00Ny4yLTQ5LjcgMjQuOC0zIDEuM2MtMTUuMiA1LjctMzIuNS0uOC0zOS45LTE1LjctNy40LTE0LjgtMi4yLTMyLjYgMTEuNS00MS4zbDIuOC0xLjYgMzguOC0xOS40LTM4LjgtMTkuNGMtMTUuOC03LjktMjIuMi0yNy4xLTE0LjMtNDIuOSA3LjQtMTQuOCAyNC44LTIxLjQgNDAtMTUuNmwzIDEuMyA0OS43IDI0LjggMC00NC4yYzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCA0NC4yIDQ5LjctMjQuOCAzLTEuM2MxNS4yLTUuOCAzMi41IC44IDM5LjkgMTUuNnMyLjIgMzIuNy0xMS41IDQxLjNsLTIuOCAxLjYtMzguNyAxOS40IDM4LjcgMTkuM2MxNS44IDcuOSAyMi4yIDI3LjEgMTQuMyA0Mi45LTcuNCAxNC44LTI0LjcgMjEuNC0zOS45IDE1LjZsLTMtMS4zLTQ5LjctMjQuOCAwIDQ3LjJjODEuOSAxNS4xIDE0NCA4Ni44IDE0NCAxNzMgMCA5Ny4yLTc4LjggMTc2LTE3NiAxNzZ6bTAtNjRhMTEyIDExMiAwIDEgMCAwLTIyNCAxMTIgMTEyIDAgMSAwIDAgMjI0eiJdCiAgICB9OwogICAgZmFOID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm4iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMTBdLCAiNGUiLCAiTTIxLjEgMzMuOWMxMi43LTQuNiAyNi45LS43IDM1LjUgOS42TDMyMCAzNTkuNiAzMjAgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDM4NGMwIDEzLjUtOC40IDI1LjUtMjEuMSAzMC4xcy0yNi45IC43LTM1LjUtOS42TDY0IDE1Mi40IDY0IDQ0OGMwIDE3LjctMTQuMyAzMi0zMiAzMlMwIDQ2NS43IDAgNDQ4TDAgNjRDMCA1MC41IDguNCAzOC41IDIxLjEgMzMuOXoiXQogICAgfTsKICAgIGZhQXJyb3dzVXBEb3duTGVmdFJpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93cy11cC1kb3duLWxlZnQtcmlnaHQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiYXJyb3dzIl0sICJmMDQ3IiwgIk0yNzguNiA5LjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwbC02NCA2NGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMGw5LjQtOS40IDAgMTE0LjctMTE0LjcgMCA5LjQtOS40YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwbC02NCA2NGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNsNjQgNjRjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBzMTIuNS0zMi44IDAtNDUuM2wtOS40LTkuNCAxMTQuNyAwIDAgMTE0LjctOS40LTkuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNsNjQgNjRjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsNjQtNjRjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBsLTkuNCA5LjQgMC0xMTQuNyAxMTQuNyAwLTkuNCA5LjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBsNjQtNjRjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNsLTY0LTY0Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2w5LjQgOS40LTExNC43IDAgMC0xMTQuNyA5LjQgOS40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTY0LTY0eiJdCiAgICB9OwogICAgZmFBcnJvd3MgPSBmYUFycm93c1VwRG93bkxlZnRSaWdodDsKICAgIGZhSG91c2UyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3OTY4LCA2MzQ5OCwgNjM1MDAsICJob21lIiwgImhvbWUtYWx0IiwgImhvbWUtbGctYWx0Il0sICJmMDE1IiwgIk0yNzcuOCA4LjZjLTEyLjMtMTEuNC0zMS4zLTExLjQtNDMuNSAwbC0yMjQgMjA4Yy05LjYgOS0xMi44IDIyLjktOCAzNS4xUzE4LjggMjcyIDMyIDI3MmwxNiAwIDAgMTc2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI4OCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTc2IDE2IDBjMTMuMiAwIDI1LTguMSAyOS44LTIwLjNzMS42LTI2LjItOC0zNS4xbC0yMjQtMjA4ek0yNDAgMzIwbDMyIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA5Ni0xMjggMCAwLTk2YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4eiJdCiAgICB9OwogICAgZmFIb21lMiA9IGZhSG91c2UyOwogICAgZmFIb21lQWx0MiA9IGZhSG91c2UyOwogICAgZmFIb21lTGdBbHQyID0gZmFIb3VzZTI7CiAgICBmYVNwaW5uZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3Bpbm5lciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMTEwIiwgIk0yMDggNDhhNDggNDggMCAxIDEgOTYgMCA0OCA0OCAwIDEgMSAtOTYgMHptMCA0MTZhNDggNDggMCAxIDEgOTYgMCA0OCA0OCAwIDEgMSAtOTYgMHpNNDggMjA4YTQ4IDQ4IDAgMSAxIDAgOTYgNDggNDggMCAxIDEgMC05NnptMzY4IDQ4YTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6TTc1IDM2OS4xQTQ4IDQ4IDAgMSAxIDE0Mi45IDQzNyA0OCA0OCAwIDEgMSA3NSAzNjkuMXpNNzUgNzVBNDggNDggMCAxIDEgMTQyLjkgMTQyLjkgNDggNDggMCAxIDEgNzUgNzV6TTQzNyAzNjkuMUE0OCA0OCAwIDEgMSAzNjkuMSA0MzcgNDggNDggMCAxIDEgNDM3IDM2OS4xeiJdCiAgICB9OwogICAgZmFHYXZlbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnYXZlbCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJsZWdhbCJdLCAiZjBlMyIsICJNMTY5LjYgMTUzLjRsLTE4LjctMTguN2MtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNMMjY1LjYtMjUuNGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMEwzMjkuNi02LjZjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNMMjE0LjkgMTUzLjRjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwek0yNzYgMjExLjdsLTMxLjQtMzEuNCAxMTItMTEyIDExOS40IDExOS40LTExMiAxMTItMzEuNC0zMS40LTIzMiAyMzJjLTE1LjYgMTUuNi00MC45IDE1LjYtNTYuNiAwcy0xNS42LTQwLjkgMC01Ni42bDIzMi0yMzJ6TTM5MC45IDM3NC42Yy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM0w1MDUuNiAyMTQuNmMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMGwxOC43IDE4LjdjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNMNDU0LjkgMzkzLjRjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwbC0xOC43LTE4Ljd6Il0KICAgIH07CiAgICBmYUxlZ2FsID0gZmFHYXZlbDsKICAgIGZhVGlja2V0U2ltcGxlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRpY2tldC1zaW1wbGUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsidGlja2V0LWFsdCJdLCAiZjNmZiIsICJNMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsNDQ4IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCA2NGMwIDguOC03LjQgMTUuNy0xNS43IDE4LjYtMTguOCA2LjUtMzIuMyAyNC40LTMyLjMgNDUuNHMxMy41IDM4LjkgMzIuMyA0NS40YzguMyAyLjkgMTUuNyA5LjggMTUuNyAxOC42bDAgNjRjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDQ4Yy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTY0QzAgMzExLjIgNy40IDMwNC4zIDE1LjcgMzAxLjQgMzQuNSAyOTQuOSA0OCAyNzcgNDggMjU2cy0xMy41LTM4LjktMzIuMy00NS40QzcuNCAyMDcuNyAwIDIwMC44IDAgMTkybDAtNjR6Il0KICAgIH07CiAgICBmYVRpY2tldEFsdCA9IGZhVGlja2V0U2ltcGxlOwogICAgZmFEb3ZlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRvdmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgzMzBdLCAiZjRiYSIsICJNNDk2IDY0YzEzLjIgMCAyMC43IDE1LjEgMTIuOCAyNS42TDQ4MCAxMjggNDgwIDMwNGMwIDc5LjUtNjQuNSAxNDQtMTQ0IDE0NGwtMTEyIDAtNDYuMyA0Ni4zYy0xMC40IDEwLjQtMjYuNSAxMi40LTM5LjEgNC44TDQxLjUgNDQwLjljLTE3LTEwLjItMTUtMzUuNSAzLjQtNDIuOUwxNjAgMzUyQzIzLjggMzExLjEgNy41IDE2OS44IDIyIDk1LjcgMjUuNiA3Ny45IDQ1LjMgNzEuNCA2MS4zIDgwLjJMMzIwIDIyNCAzMjAgMTQ0YzAtNDQuMiAzNS44LTgwIDgwLTgwbDk2IDB6bS05NiA1NmEyNCAyNCAwIDEgMCAwIDQ4IDI0IDI0IDAgMSAwIDAtNDh6TTE4Mi41LTkuNmMxMi40LTEzLjcgMzMuMy04LjkgNDIuNSA3LjFsNTYuNCA5OC4zYy01LjggMTQuNC05LjIgMzAuMS05LjQgNDYuNUwxMzguMSA2OGMxMC4xLTMxLjYgMjctNTguNCA0NC40LTc3LjZ6Il0KICAgIH07CiAgICBmYVRhcnBEcm9wbGV0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRhcnAtZHJvcGxldCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTdjIiwgIk0yNTYgMTYwYzM1LjMgMCA2NC0yNi45IDY0LTYwIDAtMjQtMzMuNy03MC4xLTUyLjItOTMuNS02LjEtNy43LTE3LjUtNy43LTIzLjYgMC0xOC41IDIzLjQtNTIuMiA2OS41LTUyLjIgOTMuNSAwIDMzLjEgMjguNyA2MCA2NCA2MHpNMzY4IDk2YzAgNjEuOS01MC4xIDExMi0xMTIgMTEyUzE0NCAxNTcuOSAxNDQgOTZjMC0xMS4xIDEuNi0yMS45IDQuNi0zMkw2NCA2NEMyOC43IDY0IDAgOTIuNyAwIDEyOEwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNzcuNSAwYzE3IDAgMzMuMy02LjcgNDUuMy0xOC43TDQ5My4zIDMyMi43YzEyLTEyIDE4LjctMjguMyAxOC43LTQ1LjNMNTEyIDEyOGMwLTM1LjMtMjguNy02NC02NC02NGwtODQuNiAwYzMgMTAuMSA0LjYgMjAuOSA0LjYgMzJ6bTg1LjUgMTc2TDMzNiAzODkuNSAzMzYgMjk2YzAtMTMuMyAxMC43LTI0IDI0LTI0bDkzLjUgMHpNOTYgMTI4YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhVHJlZUNpdHkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHJlZS1jaXR5IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1ODciLCAiTTI4OCA0OGMwLTI2LjUgMjEuNS00OCA0OC00OGw5NiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgNDggNDggMCAwLTcyYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA3MiAxNiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMzIwYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0yNTYgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC00MTZ6bTY0IDY0bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6bTE2IDgwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDB6TTM1MiAzMDRsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnpNNTI4IDE5MmMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwek01MTIgMzA0bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6TTk2IDQ4MGwwLTE2MC0xNiAwYy00NC4yIDAtODAtMzUuOC04MC04MCAwLTI2LjcgMTMuMS01MC4zIDMzLjItNjQuOS0uOC00LjktMS4yLTEwLTEuMi0xNS4xIDAtNTMgNDMtOTYgOTYtOTZzOTYgNDMgOTYgOTZsMCA5NmMwIDM1LjMtMjguNyA2NC02NCA2NGwwIDE2MGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMnoiXQogICAgfTsKICAgIGZhVHVyblVwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInR1cm4tdXAiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMDU0OCwgImxldmVsLXVwLWFsdCJdLCAiZjNiZiIsICJNMTY5LjQgOS40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDEyOCAxMjhjOS4yIDkuMiAxMS45IDIyLjkgNi45IDM0LjlTMzMyLjkgMTkyIDMyMCAxOTJsLTY0IDAgMCAxNjBjMCA4OC40LTcxLjYgMTYwLTE2MCAxNjBsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTE2MC02NCAwYy0xMi45IDAtMjQuNi03LjgtMjkuNi0xOS44cy0yLjItMjUuNyA2LjktMzQuOWwxMjgtMTI4eiJdCiAgICB9OwogICAgZmFMZXZlbFVwQWx0ID0gZmFUdXJuVXA7CiAgICBmYVRlbXBlcmF0dXJlUXVhcnRlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0ZW1wZXJhdHVyZS1xdWFydGVyIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbInRlbXBlcmF0dXJlLTEiLCAidGhlcm1vbWV0ZXItMSIsICJ0aGVybW9tZXRlci1xdWFydGVyIl0sICJmMmNhIiwgIk0xNjAgMEMxMDcgMCA2NCA0MyA2NCA5NmwwIDE2NC43QzM0LjUgMjg3IDE2IDMyNS40IDE2IDM2OCAxNiA0NDcuNSA4MC41IDUxMiAxNjAgNTEyczE0NC02NC41IDE0NC0xNDRjMC00Mi42LTE4LjUtODEtNDgtMTA3LjNMMjU2IDk2YzAtNTMtNDMtOTYtOTYtOTZ6bTY0IDM2OGMwIDM1LjMtMjguNyA2NC02NCA2NHMtNjQtMjguNy02NC02NGMwLTI2LjkgMTYuNS00OS45IDQwLTU5LjNsMC0yOC43YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCAyOC43YzIzLjUgOS41IDQwIDMyLjUgNDAgNTkuM3oiXQogICAgfTsKICAgIGZhVGVtcGVyYXR1cmUxID0gZmFUZW1wZXJhdHVyZVF1YXJ0ZXI7CiAgICBmYVRoZXJtb21ldGVyMSA9IGZhVGVtcGVyYXR1cmVRdWFydGVyOwogICAgZmFUaGVybW9tZXRlclF1YXJ0ZXIgPSBmYVRlbXBlcmF0dXJlUXVhcnRlcjsKICAgIGZhU2xpZGVycyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzbGlkZXJzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNsaWRlcnMtaCJdLCAiZjFkZSIsICJNMzIgNjRDMTQuMyA2NCAwIDc4LjMgMCA5NnMxNC4zIDMyIDMyIDMybDg2LjcgMGMxMi4zIDI4LjMgNDAuNSA0OCA3My4zIDQ4czYxLTE5LjcgNzMuMy00OEw0ODAgMTI4YzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDI2NS4zIDY0QzI1MyAzNS43IDIyNC44IDE2IDE5MiAxNnMtNjEgMTkuNy03My4zIDQ4TDMyIDY0em0wIDE2MGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwyNDYuNyAwYzEyLjMgMjguMyA0MC41IDQ4IDczLjMgNDhzNjEtMTkuNyA3My4zLTQ4bDU0LjcgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNTQuNyAwYy0xMi4zLTI4LjMtNDAuNS00OC03My4zLTQ4cy02MSAxOS43LTczLjMgNDhMMzIgMjI0em0wIDE2MGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmw1NC43IDBjMTIuMyAyOC4zIDQwLjUgNDggNzMuMyA0OHM2MS0xOS43IDczLjMtNDhMNDgwIDQ0OGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMjQ2LjcgMGMtMTIuMy0yOC4zLTQwLjUtNDgtNzMuMy00OHMtNjEgMTkuNy03My4zIDQ4TDMyIDM4NHoiXQogICAgfTsKICAgIGZhU2xpZGVyc0ggPSBmYVNsaWRlcnM7CiAgICBmYU1vc3F1ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb3NxdWUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgzMzJdLCAiZjY3OCIsICJNMTc0LjggMjI0bDIyNi40IDBjNDMuNSAwIDc4LjgtMzUuMyA3OC44LTc4LjggMC0yNS41LTEyLjMtNDkuNC0zMy4xLTY0LjJMMjk3LjMtMjUuNGMtNS42LTMuOS0xMy0zLjktMTguNSAwTDEyOS4xIDgxQzEwOC4zIDk1LjggOTYgMTE5LjcgOTYgMTQ1LjIgOTYgMTg4LjcgMTMxLjMgMjI0IDE3NC44IDIyNHpNNTEyIDUxMmMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTIyNGMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDQ4LTQ0OCAwIDAtNDhjMC0xNy43LTE0LjMtMzItMzItMzJTMCAyMDYuMyAwIDIyNEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGw0NDggMHpNMjQwIDM4NGMwLTI2LjUgMjEuNS00OCA0OC00OHM0OCAyMS41IDQ4IDQ4bDAgODAtOTYgMCAwLTgweiJdCiAgICB9OwogICAgZmFIID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImgiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMDRdLCAiNDgiLCAiTTMyMCAyODhsMCAxNjBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTM4NGMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDE2MC0yNTYgMCAwLTE2MGMwLTE3LjctMTQuMy0zMi0zMi0zMlMwIDQ2LjMgMCA2NEwwIDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTYwIDI1NiAweiJdCiAgICB9OwogICAgZmFJbmZvID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImluZm8iLAogICAgICBpY29uOiBbMTkyLCA1MTIsIFtdLCAiZjEyOSIsICJNNDggNDhhNDggNDggMCAxIDEgOTYgMCA0OCA0OCAwIDEgMSAtOTYgMHpNMCAxOTJjMC0xNy43IDE0LjMtMzIgMzItMzJsNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDI1NiAzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDUxMmMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwzMiAwIDAtMjI0LTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyeiJdCiAgICB9OwogICAgZmFQZXJzb25XYWxraW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi13YWxraW5nIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4Njk0LCAid2Fsa2luZyJdLCAiZjU1NCIsICJNMTkyIDgwYTU2IDU2IDAgMSAwIDAtMTEyIDU2IDU2IDAgMSAwIDAgMTEyek0xMDUuNCAyMjcuOWwyMi42LTIyLjYgMCA2OS4zYzAgMjggMTIuMiA1NC43IDMzLjUgNzIuOWw3MS40IDYxLjJjNS45IDUuMSA5LjggMTIuMSAxMC45IDE5LjhsMTIuNiA4OC4xYzIuNSAxNy41IDE4LjcgMjkuNyAzNi4yIDI3LjJzMjkuNy0xOC43IDI3LjItMzYuMmwtMTIuNi04OC4xYy0zLjMtMjMuMS0xNC45LTQ0LjEtMzIuNi01OS4zbC0zNC41LTI5LjYgMC0xMTUuMiAzLjggNC43YzE4LjIgMjIuOCA0NS44IDM2IDc1IDM2bDMzLjIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMzMuMiAwYy05LjcgMC0xOC45LTQuNC0yNS0xMmwtMTcuOS0yMi40Yy0yMy0yOC44LTU3LjktNDUuNi05NC44LTQ1LjYtMzIuMiAwLTYzLjEgMTIuOC04NS44IDM1LjZMNjAuMSAxODIuNkM0Mi4xIDIwMC42IDMyIDIyNSAzMiAyNTAuNUwzMiAyODhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTM3LjVjMC04LjUgMy40LTE2LjYgOS40LTIyLjZ6bTEyLjQgMTc5LjRjLTEuNSA1LjItNC4zIDEwLTguMSAxMy44TDQxLjQgNDg5LjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBsNjguMy02OC4zYzExLjUtMTEuNSAxOS45LTI1LjggMjQuNC00MS41bDIuMi03LjYtNDYtMzkuNGMtMi41LTIuMi01LTQuNC03LjQtNi44bC0xMC40IDM2LjJ6Il0KICAgIH07CiAgICBmYVdhbGtpbmcgPSBmYVBlcnNvbldhbGtpbmc7CiAgICBmYUFycm93VHVybkRvd24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctdHVybi1kb3duIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbImxldmVsLWRvd24iXSwgImYxNDkiLCAiTTMyIDY0QzE0LjMgNjQgMCA0OS43IDAgMzJTMTQuMyAwIDMyIDBsOTYgMGM1MyAwIDk2IDQzIDk2IDk2bDAgMzA2LjcgNzMuNC03My40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwczEyLjUgMzIuOCAwIDQ1LjNsLTEyOCAxMjhjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwbC0xMjgtMTI4Yy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM3MzMi44LTEyLjUgNDUuMyAwTDE2MCA0MDIuNyAxNjAgOTZjMC0xNy43LTE0LjMtMzItMzItMzJMMzIgNjR6Il0KICAgIH07CiAgICBmYUxldmVsRG93biA9IGZhQXJyb3dUdXJuRG93bjsKICAgIGZhUm9hZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyb2FkIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NzM5XSwgImYwMTgiLCAiTTIyMy45IDMybC03Ni4yIDBjLTI5LjQgMC01NS4xIDIwLjEtNjIuMSA0OC42TDEuNCA0MjAuNUMtNi4xIDQ1MC43IDE2LjggNDgwIDQ4IDQ4MGwxNzUuOSAwIDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDY0IDE3Ni4xIDBjMzEuMiAwIDU0LjEtMjkuMyA0Ni42LTU5LjVMNDI2LjUgODAuNkM0MTkuNCA1Mi4xIDM5My44IDMyIDM2NC4zIDMybC03Ni40IDAgMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY0em02NCAxOTJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJ6Il0KICAgIH07CiAgICBmYVNwaXJhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcGlyYWwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTgwYSIsICJNMTE1LjUgNy40YzEzLjYtMTEuMyAzMy44LTkuNSA0NS4xIDQuMXM5LjUgMzMuOC00LjEgNDUuMUMxMDAuMiAxMDMuNSA2NCAxNzUuMiA2NCAyNTYgNjQgMzYyIDE1MCA0NDggMjU2IDQ0OHMxOTItODYgMTkyLTE5MmMwLTc1LjEtNjAuOS0xMzYtMTM2LTEzNlMxNzYgMTgwLjkgMTc2IDI1NmMwIDQ0LjIgMzUuOCA4MCA4MCA4MHM4MC0zNS44IDgwLTgwYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMyYzAtNDguNiAzOS40LTg4IDg4LTg4czg4IDM5LjQgODggODhjMCA3OS41LTY0LjUgMTQ0LTE0NCAxNDRTMTEyIDMzNS41IDExMiAyNTZjMC0xMTAuNSA4OS41LTIwMCAyMDAtMjAwczIwMCA4OS41IDIwMCAyMDBjMCAxNDEuNC0xMTQuNiAyNTYtMjU2IDI1NlMwIDM5Ny40IDAgMjU2QzAgMTU1LjggNDUgNjYuMSAxMTUuNSA3LjR6Il0KICAgIH07CiAgICBmYUZhY2VGcm93bjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1mcm93biIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzk3ODUsICJmcm93biJdLCAiZjExOSIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6bTkwLjYtMTEzLjljLTIwLjQtMjgtNTMuNC00Ni4xLTkwLjYtNDYuMXMtNzAuMiAxOC4xLTkwLjYgNDYuMWMtNy44IDEwLjctMjIuOCAxMy4xLTMzLjUgNS4zcy0xMy4xLTIyLjgtNS4zLTMzLjVDMTU1LjcgMzMwIDIwMi44IDMwNCAyNTYgMzA0czEwMC4zIDI2IDEyOS40IDY1LjljNy44IDEwLjcgNS40IDI1LjctNS4zIDMzLjVzLTI1LjcgNS40LTMzLjUtNS4zek0xNDQgMjA4YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTE5Mi0zMmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYUZyb3duMiA9IGZhRmFjZUZyb3duMjsKICAgIGZhV2luZUdsYXNzRW1wdHkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid2luZS1nbGFzcy1lbXB0eSIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWyJ3aW5lLWdsYXNzLWFsdCJdLCAiZjVjZSIsICJNNjQgMEM0OC43IDAgMzUuNiAxMC44IDMyLjYgMjUuN0wzLjIgMTczQzEuMSAxODMuNSAwIDE5NC4yIDAgMjA1bDAgM2MwIDc3LjQgNTUgMTQyIDEyOCAxNTYuOGwwIDExNS4yLTY0IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMTkyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTY0IDAgMC0xMTUuMkMyNjUgMzUwIDMyMCAyODUuNCAzMjAgMjA4bDAtM2MwLTEwLjctMS4xLTIxLjQtMy4yLTMyTDI4Ny40IDI1LjdDMjg0LjQgMTAuOCAyNzEuMyAwIDI1NiAwTDY0IDB6bTEuOSAxODUuNkw5MC4yIDY0IDIyOS44IDY0IDI1NC4xIDE4NS42YzEuMyA2LjQgMS45IDEyLjkgMS45IDE5LjRsMCAzYzAgNTMtNDMgOTYtOTYgOTZzLTk2LTQzLTk2LTk2bDAtM2MwLTYuNSAuNi0xMyAxLjktMTkuNHoiXQogICAgfTsKICAgIGZhV2luZUdsYXNzQWx0ID0gZmFXaW5lR2xhc3NFbXB0eTsKICAgIGZhQ2xhcHBlcmJvYXJkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNsYXBwZXJib2FyZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMTMxIiwgIk00NDggNjRjMiAwIDMuOSAuMSA1LjggLjNsLTk1LjcgOTUuNyA2Ny45IDAgNzItNzJjOC44IDExIDE0IDI0LjkgMTQgNDBsMCAyNTZjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDQ4Yy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGw3MC4xIDAtOTYgOTYgNjcuOSAwIDk1LTk1IDEtMSA5Mi4xIDAtOTYgOTYgNjcuOSAwIDk1LTk1IDEtMSA4Ni4xIDB6Il0KICAgIH07CiAgICBmYUZvcndhcmRTdGVwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZvcndhcmQtc3RlcCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJzdGVwLWZvcndhcmQiXSwgImYwNTEiLCAiTTIxIDM2LjhjMTIuOS03IDI4LjctNi4zIDQxIDEuOEwzMjAgMjA4LjEgMzIwIDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAzODRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xNDQuMS0yNTggMTY5LjZjLTEyLjMgOC4xLTI4IDguOC00MSAxLjhTMCA0NTQuNyAwIDQ0MEwwIDcyQzAgNTcuMyA4LjEgNDMuOCAyMSAzNi44eiJdCiAgICB9OwogICAgZmFTdGVwRm9yd2FyZCA9IGZhRm9yd2FyZFN0ZXA7CiAgICBmYVNxdWFyZVVwUmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXVwLXJpZ2h0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbODU5OSwgImV4dGVybmFsLWxpbmstc3F1YXJlLWFsdCJdLCAiZjM2MCIsICJNMzg0IDMyYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMHpNMTY4IDE2MGMtOS43IDAtMTguNSA1LjgtMjIuMiAxNC44cy0xLjcgMTkuMyA1LjIgMjYuMmwzNSAzNS02NyA2N2MtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlsMjQgMjRjOS40IDkuNCAyNC42IDkuNCAzMy45IDBsNjctNjcgMzUgMzVjNi45IDYuOSAxNy4yIDguOSAyNi4yIDUuMlMzMjAgMzIxLjcgMzIwIDMxMmwwLTEyOGMwLTEzLjMtMTAuNy0yNC0yNC0yNGwtMTI4IDB6Il0KICAgIH07CiAgICBmYUV4dGVybmFsTGlua1NxdWFyZUFsdCA9IGZhU3F1YXJlVXBSaWdodDsKICAgIGZhQm9va0pvdXJuYWxXaGlsbHMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm9vay1qb3VybmFsLXdoaWxscyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJqb3VybmFsLXdoaWxscyJdLCAiZjY2YSIsICJNOTYgNTEybDMyMCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybDAtNjYuN2MxOC42LTYuNiAzMi0yNC40IDMyLTQ1LjNsMC0yODhjMC0yNi41LTIxLjUtNDgtNDgtNDhMOTYgMEM0MyAwIDAgNDMgMCA5NkwwIDQxNmMwIDUzIDQzIDk2IDk2IDk2ek02NCA0MTZjMC0xNy43IDE0LjMtMzIgMzItMzJsMjU2IDAgMCA2NC0yNTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6TTI3NC4xIDk5LjJjMi42LTIuNiA2LjctMy4xIDkuOS0xLjEgMzIuMSAyMCA1My40IDU1LjYgNTMuNCA5Ni4yIDAgNjIuNi01MC43IDExMy4zLTExMy4zIDExMy4zUzExMC43IDI1Ni45IDExMC43IDE5NC4zYzAtNDAuNiAyMS40LTc2LjIgNTMuNC05Ni4yIDMuMS0yIDcuMi0xLjUgOS45IDEuMXMzLjEgNi43IDEuMiA5LjhjLTUuMiA4LjYtOC4yIDE4LjctOC4yIDI5LjUgMCAxNS4xIDUuOSAyOC44IDE1LjUgMzkuMSAyLjUgMi43IDIuOSA2LjcgLjkgOS43LTQuNyA3LjQtNy40IDE2LjEtNy40IDI1LjUgMCAyMS42IDE0LjMgMzkuOSAzNCA0NS45bDEtMjQuOGMtNy4xLTQuNC0xMS44LTEyLjItMTEuOC0yMS4xIDAtOS42IDUuNS0xOCAxMy41LTIyLjFsMy4zLTgxLjhjLjItNC4zIDMuNy03LjcgOC03LjdzNy44IDMuNCA4IDcuN2wzLjMgODEuOGM4IDQuMSAxMy41IDEyLjQgMTMuNSAyMi4xIDAgOC45LTQuNyAxNi43LTExLjggMjEuMWwxIDI0LjhjMTkuNi02IDMzLjktMjQuMSAzNC00NS42bDAtLjZjLS4xLTkuMy0yLjctMTcuOS03LjQtMjUuMi0xLjktMy4xLTEuNi03LjEgLjktOS43IDkuNi0xMC4yIDE1LjUtMjMuOSAxNS41LTM5LjEgMC0xMC44LTMtMjAuOS04LjItMjkuNS0xLjktMy4yLTEuNC03LjIgMS4yLTkuOHoiXQogICAgfTsKICAgIGZhSm91cm5hbFdoaWxscyA9IGZhQm9va0pvdXJuYWxXaGlsbHM7CiAgICBmYUNoYW1wYWduZUdsYXNzZXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hhbXBhZ25lLWdsYXNzZXMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjkzNDYsICJnbGFzcy1jaGVlcnMiXSwgImY3OWYiLCAiTTE1NS42IDE3LjNDMTYzIDMgMTc5LjktMy42IDE5NSAxLjlsMTI1IDQ1LjYgMTI1LTQ1LjZjMTUuMS01LjUgMzIgMS4xIDM5LjQgMTUuNGw3OC44IDE1Mi45YzI4LjggNTUuOCAxMC4zIDEyMi4zLTM4LjUgMTU2LjZsMzEuMyA4Ni4yIDQxLTE1YzE2LjYtNiAzNSAyLjUgNDEgMTkuMXMtMi41IDM1LTE5LjEgNDFjLTQ3LjQgMTcuMy05NC44IDM0LjUtMTQyLjIgNTEuOC0xNi42IDYuMS0zNS0yLjUtNDEtMTkuMXMyLjUtMzUgMTkuMS00MWw0MS0xNS0zMS4zLTg2LjJjLTU5LjQgNS4yLTExNi4yLTMzLjktMTMwLTk1LjJsLTE0LjYtNjQuNy0xNC42IDY0LjdjLTEzLjggNjEuMy03MC42IDEwMC40LTEzMCA5NS4ybC0zMS4zIDg2LjIgNDEgMTVjMTYuNiA2LjEgMjUuMiAyNC40IDE5LjEgNDFzLTI0LjQgMjUuMi00MSAxOS4xYy00Ny40LTE3LjMtOTQuOC0zNC42LTE0Mi4yLTUxLjgtMTYuNi02LjEtMjUuMi0yNC40LTE5LjEtNDFTMjYuMyAzOTIgNDIuOSAzOThsNDEgMTUgMzEuMy04Ni4yQzY2LjUgMjkyLjUgNDguMSAyMjYgNzYuOSAxNzAuMkwxNTUuNiAxNy4zem00NCA1NC40bC0yNy4yIDUyLjggODkuMiAzMi41IDEzLjEtNTcuOS03NS4xLTI3LjR6bTI0MC45IDBsLTc1LjEgMjcuNCAxMy4xIDU3LjkgODkuMi0zMi41LTI3LjItNTIuOHoiXQogICAgfTsKICAgIGZhR2xhc3NDaGVlcnMgPSBmYUNoYW1wYWduZUdsYXNzZXM7CiAgICBmYUR1bXBzdGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImR1bXBzdGVyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY3OTMiLCAiTTEzMi4zIDY0TDEwNi43IDE5MiAyNCAxOTJjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtNC4xYzAtMi42IC40LTUuMSAxLjItNy42TDI2LjUgODAuNEMyOS44IDcwLjYgMzkgNjQgNDkuMyA2NGw4MyAwem0yMy40IDEyOGwyNS42LTEyOCA4Mi43IDAgMCAxMjgtMTA4LjMgMHpNMzEyIDY0bDgyLjcgMCAyNS42IDEyOC0xMDguMyAwIDAtMTI4em0xMzEuNyAwbDgzIDBjMTAuMyAwIDE5LjUgNi42IDIyLjggMTYuNGwyNS4zIDc1LjljLjggMi40IDEuMiA1IDEuMiA3LjZsMCA0LjFjMCAxMy4zLTEwLjcgMjQtMjQgMjRsLTgyLjcgMC0yNS42LTEyOHpNMjUuNyAyNDBsNTI0LjcgMGMtLjQgMi4xLTEzLjMgNzMuNC0zOC45IDIxMy43LTMgMTYuMy0xNy45IDI3LjYtMzQuNCAyNi4xUzQ0OCA0NjQuNiA0NDggNDQ4bDAtMTYtMzIwIDAgMCAxNmMwIDE2LjYtMTIuNiAzMC40LTI5LjEgMzEuOVM2Ny41IDQ3MCA2NC41IDQ1My43QzM5IDMxMy4zIDI2IDI0Mi4xIDI1LjcgMjQweiJdCiAgICB9OwogICAgZmFIZWFydENpcmNsZVhtYXJrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhlYXJ0LWNpcmNsZS14bWFyayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTAxIiwgIk0yNDEgODcuMWwxNSAyMC43IDE1LTIwLjdDMjk2IDUyLjUgMzM2LjIgMzIgMzc4LjkgMzIgNDUyLjQgMzIgNTEyIDkxLjYgNTEyIDE2NS4xbDAgMi42YzAgMTcuNi0zLjQgMzUuNi05LjUgNTMuNy0yMS44LTguNi00NS42LTEzLjQtNzAuNS0xMy40LTEwNiAwLTE5MiA4Ni0xOTIgMTkyIDAgMjguNSA2LjIgNTUuNiAxNy40IDgwLS41IDAtLjkgMC0xLjQgMC0xNS41IDAtMzAuOC00LjYtNDMuMS0xNC4xLTczLTU1LjctMjEyLjktMTg2LTIxMi45LTI5OC4ybDAtMi42QzAgOTEuNiA1OS42IDMyIDEzMy4xIDMyIDE3NS44IDMyIDIxNiA1Mi41IDI0MSA4Ny4xek00MzIgMjU2YTE0NCAxNDQgMCAxIDEgMCAyODggMTQ0IDE0NCAwIDEgMSAwLTI4OHptNTkuMyAxMDcuM2M2LjItNi4yIDYuMi0xNi40IDAtMjIuNnMtMTYuNC02LjItMjIuNiAwbC0zNi43IDM2LjctMzYuNy0zNi43Yy02LjItNi4yLTE2LjQtNi4yLTIyLjYgMHMtNi4yIDE2LjQgMCAyMi42bDM2LjcgMzYuNy0zNi43IDM2LjdjLTYuMiA2LjItNi4yIDE2LjQgMCAyMi42czE2LjQgNi4yIDIyLjYgMGwzNi43LTM2LjcgMzYuNyAzNi43YzYuMiA2LjIgMTYuNCA2LjIgMjIuNiAwczYuMi0xNi40IDAtMjIuNmwtMzYuNy0zNi43IDM2LjctMzYuN3oiXQogICAgfTsKICAgIGZhQ29tcHV0ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY29tcHV0ZXIiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRlNSIsICJNMzQ4LjggMzJDMzQwLjcgNDYuMSAzMzYgNjIuNSAzMzYgODBsMCAxNi0yNzIgMCAwIDIyNCAyNzIgMCAwIDY0LTI3MiAwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDI4NC44IDB6TTMzNiA0MzJjMCAxNy41IDQuNyAzMy45IDEyLjggNDhMMTIwIDQ4MGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwyMTYgMHpNNDMyIDMybDk2IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAzNTJjMCAyNi41LTIxLjUgNDgtNDggNDhsLTk2IDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMzUyYzAtMjYuNSAyMS41LTQ4IDQ4LTQ4em0yNCA2NGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw0OCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC00OCAwem0wIDk2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTQ4IDB6bTU2IDE0NGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAweiJdCiAgICB9OwogICAgZmFXYW5kTWFnaWMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid2FuZC1tYWdpYyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJtYWdpYyJdLCAiZjBkMCIsICJNMzk4LjUgMTIuMmwtODguMiA4OC4yIDEwMS4zIDEwMS4zIDg4LjItODguMkM1MDcuNiAxMDUuNiA1MTIgOTUgNTEyIDg0cy00LjQtMjEuNi0xMi4yLTI5LjVMNDU3LjUgMTIuMkM0NDkuNiA0LjQgNDM5IDAgNDI4IDBzLTIxLjYgNC40LTI5LjUgMTIuMnpNMjc2LjQgMTM0LjNMMTIuMiAzOTguNUM0LjQgNDA2LjQgMCA0MTcgMCA0MjhzNC40IDIxLjYgMTIuMiAyOS41bDQyLjMgNDIuM0M2Mi40IDUwNy42IDczIDUxMiA4NCA1MTJzMjEuNi00LjQgMjkuNS0xMi4yTDM3Ny43IDIzNS42IDI3Ni40IDEzNC4zeiJdCiAgICB9OwogICAgZmFNYWdpYyA9IGZhV2FuZE1hZ2ljOwogICAgZmFCcmFpbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJicmFpbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyOTUwNF0sICJmNWRjIiwgIk0xMjAgNTZjMC0zMC45IDI1LjEtNTYgNTYtNTZsMjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDQ0OGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMzIgMGMtMjkuOCAwLTU0LjktMjAuNC02Mi00OC0uNyAwLTEuMyAwLTIgMC00NC4yIDAtODAtMzUuOC04MC04MCAwLTE4IDYtMzQuNiAxNi00OC0xOS40LTE0LjYtMzItMzcuOC0zMi02NCAwLTMwLjkgMTcuNi01Ny44IDQzLjItNzEuMS03LjEtMTItMTEuMi0yNi0xMS4yLTQwLjkgMC00NC4yIDM1LjgtODAgODAtODBsMC0yNHptMjcyIDBsMCAyNGM0NC4yIDAgODAgMzUuOCA4MCA4MCAwIDE1LTQuMSAyOS0xMS4yIDQwLjkgMjUuNyAxMy4zIDQzLjIgNDAuMSA0My4yIDcxLjEgMCAyNi4yLTEyLjYgNDkuNC0zMiA2NCAxMCAxMy40IDE2IDMwIDE2IDQ4IDAgNDQuMi0zNS44IDgwLTgwIDgwLS43IDAtMS4zIDAtMiAwLTcuMSAyNy42LTMyLjIgNDgtNjIgNDhsLTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNDQ4YzAtMTcuNyAxNC4zLTMyIDMyLTMybDI0IDBjMzAuOSAwIDU2IDI1LjEgNTYgNTZ6Il0KICAgIH07CiAgICBmYUJyaWVmY2FzZU1lZGljYWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnJpZWZjYXNlLW1lZGljYWwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjQ2OSIsICJNMjAwIDQ4bDExMiAwYzQuNCAwIDggMy42IDggOGwwIDQwLTEyOCAwIDAtNDBjMC00LjQgMy42LTggOC04em0tNTYgOGwwIDQwLTgwIDBDMjguNyA5NiAwIDEyNC43IDAgMTYwTDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0bC04MCAwIDAtNDBjMC0zMC45LTI1LjEtNTYtNTYtNTZMMjAwIDBjLTMwLjkgMC01NiAyNS4xLTU2IDU2em04MCAxNjBjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgNDAgNDAgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTQwIDAgMCA0MGMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTQwLTQwIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmw0MCAwIDAtNDB6Il0KICAgIH07CiAgICBmYUhvdXNlTWVkaWNhbENpcmNsZUV4Y2xhbWF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLW1lZGljYWwtY2lyY2xlLWV4Y2xhbWF0aW9uIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1MTIiLCAiTTMwOS44IDguNmMtMTIuMy0xMS40LTMxLjMtMTEuNC00My41IDBsLTIyNCAyMDhjLTkuNiA5LTEyLjggMjIuOS04IDM1LjFTNTAuOCAyNzIgNjQgMjcybDE2IDAgMCAxNzZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTk2IDBjLTIxLjItMjkuNS0zNC4zLTY1LjMtMzUuOS0xMDRMMjcyIDQwOGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtNDAtNDAgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDQwIDAgMC00MGMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCA0MCAyMCAwYzM0LjktNDguNSA5MS43LTgwIDE1Ni04MCAxMC43IDAgMjEuMSAuOSAzMS4zIDIuNUwzMDkuOCA4LjZ6TTQ5NiA1NDRhMTQ0IDE0NCAwIDEgMCAwLTI4OCAxNDQgMTQ0IDAgMSAwIDAgMjg4em0wLTEwMGEyMCAyMCAwIDEgMSAwIDQwIDIwIDIwIDAgMSAxIDAtNDB6bTAtMTQwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDgwYzAgOC44LTcuMiAxNi0xNiAxNnMtMTYtNy4yLTE2LTE2bDAtODBjMC04LjggNy4yLTE2IDE2LTE2eiJdCiAgICB9OwogICAgZmFDb2RlQ29tbWl0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvZGUtY29tbWl0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYzODYiLCAiTTI4OCAzMzZhODAgODAgMCAxIDAgMC0xNjAgODAgODAgMCAxIDAgMCAxNjB6bTE1Ni44LTQ4QzQzMCAzNjEgMzY1LjQgNDE2IDI4OCA0MTZTMTQ2IDM2MSAxMzEuMiAyODhMMzIgMjg4Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDk5LjIgMEMxNDYgMTUxIDIxMC42IDk2IDI4OCA5NnMxNDIgNTUgMTU2LjggMTI4bDk5LjIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtOTkuMiAweiJdCiAgICB9OwogICAgZmFQZXJzb25CcmVhc3RmZWVkaW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1icmVhc3RmZWVkaW5nIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU1M2EiLCAiTTIyNCAwYTgwIDgwIDAgMSAxIDAgMTYwIDgwIDgwIDAgMSAxIDAtMTYwek00MzYuOCAzODIuOEwzNzMuNSA0NjJjLTE2LjYgMjAuNy00Ni44IDI0LjEtNjcuNSA3LjUtMTcuNi0xNC4xLTIyLjctMzguMS0xMy41LTU3LjdsLS43LS4xYy0zOC45LTUuNi03NC4zLTI1LjEtOTkuNy01NC44bDAtMzYuOGMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDQ4YzAgLjggMCAxLjYgLjEgMi40bDEwMS40IDUwLjdjMjMuNyAxMS45IDMzLjMgNDAuNyAyMS41IDY0LjRzLTQwLjcgMzMuMy02NC40IDIxLjVMMjcuMiA0MjcuM2MtMS4xLS41LTIuMi0xLjEtMy4zLTEuNy00LjktMi44LTkuMi02LjQtMTIuNi0xMC42LTQuNi01LjQtNy44LTExLjctOS42LTE4LjQtMy4zLTEyLTEuOS0yNS4yIDQuOC0zNi42IC42LTEuMSAxLjMtMi4yIDItMy4yTDc1LjYgMjU2LjFjMjYuNy00MC4xIDcxLjctNjQuMSAxMTkuOC02NC4xbDc1LjIgMGM0Ni41IDAgOTAuMSAyMi41IDExNy4yIDYwLjNsNTAuNyA3MC45YzIuMiAzIDQgNi4xIDUuNSA5LjQgMi45IDYuNyA0LjMgMTMuOCA0IDIwLjgtLjMgMTAuNi00LjIgMjEtMTEuMiAyOS40ek0zMjAgMzMyYTQ0IDQ0IDAgMSAwIC04OCAwIDQ0IDQ0IDAgMSAwIDg4IDB6Il0KICAgIH07CiAgICBmYVBlcnNvblJheXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLXJheXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTU0ZCIsICJNMzEyLjUgMjRhNTYgNTYgMCAxIDAgLTExMiAwIDU2IDU2IDAgMSAwIDExMiAwem0yNCAyMTIuN2w0Ni4zIDYyLjRjMTAuNSAxNC4yIDMwLjYgMTcuMiA0NC44IDYuNnMxNy4yLTMwLjYgNi42LTQ0LjhsLTcwLjUtOTVDMzM4LjUgMTMyIDI5OC44IDExMiAyNTYuNSAxMTJzLTgyIDIwLTEwNy4yIDUzLjlsLTcwLjUgOTVjLTEwLjUgMTQuMi03LjYgMzQuMiA2LjYgNDQuOHMzNC4yIDcuNiA0NC44LTYuNmw0Ni4zLTYyLjQgMCAyNzUuM2MwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTYwYzAtOC44IDcuMi0xNiAxNi0xNnMxNiA3LjIgMTYgMTZsMCAxNjBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTI3NS4zek03LjUgN2MtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlsODAgODBjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45TDQxLjUgN0MzMi4xLTIuMyAxNi45LTIuMyA3LjUgN3ptNDY0IDBsLTgwIDgwYy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBsODAtODBjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMHpNNy41IDUwNWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMGw4MC04MGM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwbC04MCA4MGMtOS40IDkuNC05LjQgMjQuNiAwIDMzLjl6bTQ2NCAwYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtODAtODBjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwcy05LjQgMjQuNiAwIDMzLjlsODAgODB6Il0KICAgIH07CiAgICBmYU1hbmF0U2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtYW5hdC1zaWduIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImUxZDUiLCAiTTE5MiAzMmMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCA0MS41QzczLjMgMTA5LjMgMCAxOTAuMSAwIDI4OEwwIDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTYwYzAtNjIuNSA0NC44LTExNC41IDEwNC0xMjUuOEwxNjggNDU2YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0yOTMuOGM1OS4yIDExLjIgMTA0IDYzLjMgMTA0IDEyNS44bDAgMTYwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xNjBjMC05Ny45LTczLjMtMTc4LjctMTY4LTE5MC41TDIxNiA1NmMwLTEzLjMtMTAuNy0yNC0yNC0yNHoiXQogICAgfTsKICAgIGZhU29ydCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzb3J0IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbInVuc29ydGVkIl0sICJmMGRjIiwgIk0yLjQgMjA0LjJjNSAxMiAxNi42IDE5LjggMjkuNiAxOS44bDMyMCAwYzEyLjkgMCAyNC42LTcuOCAyOS42LTE5LjhzMi4yLTI1LjctNi45LTM0LjlsLTE2MC0xNjBjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwbC0xNjAgMTYwYy05LjIgOS4yLTExLjkgMjIuOS02LjkgMzQuOXptMCAxMDMuNWMtNSAxMi0yLjIgMjUuNyA2LjkgMzQuOWwxNjAgMTYwYzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwbDE2MC0xNjBjOS4yLTkuMiAxMS45LTIyLjkgNi45LTM0LjlTMzY0LjkgMjg4IDM1MiAyODhMMzIgMjg4Yy0xMi45IDAtMjQuNiA3LjgtMjkuNiAxOS44eiJdCiAgICB9OwogICAgZmFVbnNvcnRlZCA9IGZhU29ydDsKICAgIGZhQ2lyY2xlUmFkaWF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1yYWRpYXRpb24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5NzYyLCAicmFkaWF0aW9uLWFsdCJdLCAiZjdiYSIsICJNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptODAgMGw2NC4zIDBjOC43IDAgMTUuNy03LjEgMTcuMy0xNS42IDQuNC0yNC40IDE4LjEtNDUuNSAzNy4yLTU5LjcgNy40LTUuNSAxMC42LTE1LjYgNi0yMy42bC0zMi41LTU2LjNjLTQuMy03LjUtMTMuOS0xMC4zLTIxLjItNS41LTQ4LjIgMzEuNS04MS4zIDg0LjItODYuMyAxNDQuOC0uNyA4LjggNi41IDE2IDE1LjMgMTZ6bTEzNy45IDg5LjhjLTguNS0zLjctMTguOC0xLjQtMjMuNSA2LjZsLTMxIDUzLjhjLTQuMyA3LjUtMS45IDE3LjIgNS44IDIxLjEgMjYuMSAxMy4yIDU1LjUgMjAuNyA4Ni44IDIwLjdzNjAuNy03LjUgODYuOC0yMC43YzcuNy0zLjkgMTAuMS0xMy42IDUuOC0yMS4xbC0zMS01My44Yy00LjYtOC0xNS0xMC4zLTIzLjUtNi42LTExLjcgNS0yNC41IDcuOC0zOC4xIDcuOHMtMjYuNC0yLjgtMzguMS03Ljh6TTM1MC40IDI0MC40YzEuNiA4LjYgOC41IDE1LjYgMTcuMyAxNS42bDY0LjMgMGM4LjggMCAxNi4xLTcuMiAxNS4zLTE2LTUtNjAuNi0zOC4xLTExMy4yLTg2LjMtMTQ0LjgtNy4zLTQuOC0xNi44LTItMjEuMiA1LjVMMzA3LjMgMTU3Yy00LjYgOC0xLjQgMTguMSA2IDIzLjYgMTkuMSAxNC4yIDMyLjcgMzUuNCAzNy4yIDU5Ljd6TTI1NiAzMDUuN2E0OCA0OCAwIDEgMCAwLTk2IDQ4IDQ4IDAgMSAwIDAgOTZ6Il0KICAgIH07CiAgICBmYVJhZGlhdGlvbkFsdCA9IGZhQ2lyY2xlUmFkaWF0aW9uOwogICAgZmFMYXB0b3BDb2RlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxhcHRvcC1jb2RlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY1ZmMiLCAiTTY0IDk2YzAtMzUuMyAyOC43LTY0IDY0LTY0bDM4NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjQwLTY0IDAgMC0yNDAtMzg0IDAgMCAyNDAtNjQgMCAwLTI0MHpNMCA0MDMuMkMwIDM5Mi42IDguNiAzODQgMTkuMiAzODRsNjAxLjYgMGMxMC42IDAgMTkuMiA4LjYgMTkuMiAxOS4yIDAgNDIuNC0zNC40IDc2LjgtNzYuOCA3Ni44TDc2LjggNDgwQzM0LjQgNDgwIDAgNDQ1LjYgMCA0MDMuMnpNMjgxIDIwOWwtMzEgMzEgMzEgMzFjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtNDgtNDhjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45bDQ4LTQ4YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOXpNMzkzIDE3NWw0OCA0OGM5LjQgOS40IDkuNCAyNC42IDAgMzMuOWwtNDggNDhjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsMzEtMzEtMzEtMzFjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMHoiXQogICAgfTsKICAgIGZhU2luayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaW5rIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUwNmQiLCAiTTI4OCA5NmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMyIDE0LjMgMzIgMzIgMzIgMzItMTQuMyAzMi0zMmMwLTUzLTQzLTk2LTk2LTk2cy05NiA0My05NiA5NmwwIDE5Mi02NCAwIDAtNDBjMC0zMC45LTI1LjEtNTYtNTYtNTZsLTQ4IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDggMGM0LjQgMCA4IDMuNiA4IDhsMCA0MC04MCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDAgNjRjMCA1MyA0MyA5NiA5NiA5NmwyNTYgMGM1MyAwIDk2LTQzIDk2LTk2bDAtNjRjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTgwIDAgMC00MGMwLTQuNCAzLjYtOCA4LThsNTYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNTYgMGMtMzAuOSAwLTU2IDI1LjEtNTYgNTZsMCA0MC02NCAwIDAtMTkyeiJdCiAgICB9OwogICAgZmFBcnJvd1VwRnJvbVdhdGVyUHVtcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy11cC1mcm9tLXdhdGVyLXB1bXAiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTRiNiIsICJNMTQ0IDMyYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDE3Ni0xNiAwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDc5LjZjMTcuNi0yIDM2IDIuNSA1MS4zIDE0IDMuNCAyLjYgNi4xIDEuNCA5LjgtLjNsLjgtLjRjNS43LTIuNiAxMi45LTYuOSAyMS43LTEzLjUgMjcuNS0yMC43IDU5LjktMzEuMiA5Mi4zLTMxLjQgMzMuMS0uMiA2Ni4zIDEwLjIgOTQuNCAzMS40IDIyLjEgMTYuNiAyOS4xIDE2LjYgNTEuMiAwIDI3LjUtMjAuNyA1OS45LTMxLjIgOTIuNC0zMS40IDMzLjEtLjIgNjYuMyAxMC4yIDk0LjQgMzEuNCA2LjkgNS4yIDEyLjggOSAxOCAxMS43IC42IC4zIDEuMiAuNiAxLjggMSA0LjIgMi4zIDguNSA0LjYgMTIuNiAxLjUgMTAuNy04LjEgMjIuOS0xMi43IDM1LjMtMTQuMWwwLTc5LjVjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTU2IDAgMC0xNDIuMSA0NyA0N2M5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlMNDk3IDM5Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMGwtODggODhjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMGw0Ny00NyAwIDE0Mi4xLTEzNiAwIDAtMTc2YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4TDE0NCAzMnpNNDc0LjYgNDc2LjFjMTkgMTQuNCA0MS45IDI4LjIgNjcuMiAzMy4zIDI2LjUgNS40IDU0LjMgLjggODAuNy0xOS4xIDEwLjYtOCAxMi43LTIzIDQuNy0zMy42cy0yMy0xMi43LTMzLjYtNC43Yy0xNC45IDExLjItMjguNiAxMy4xLTQyLjMgMTAuMy0xNC45LTMtMzAuOS0xMS45LTQ3LjgtMjQuNi0zOC40LTI5LTkwLjUtMjktMTI5IDAtMjQgMTguMS00MC43IDI2LjMtNTQuNSAyNi4zcy0zMC41LTguMi01NC41LTI2LjNjLTM4LjQtMjktOTAuNS0yOS0xMjkgMC0yMS42IDE2LjMtNDEuMyAyNS44LTU4LjkgMjUuNy05LjYtLjEtMTkuOS0zLTMxLjItMTEuNS0xMC42LTgtMjUuNi01LjktMzMuNiA0LjdTNyA0ODIuMyAxNy42IDQ5MC4zYzE5LjEgMTQuNCAzOS40IDIxIDU5LjggMjEuMSAzMy45IC4yIDY0LjMtMTcuNCA4OC4xLTM1LjMgMjEuMy0xNi4xIDQ5LjktMTYuMSA3MS4yIDAgMjQuMiAxOC4zIDUyLjMgMzUuOSA4My40IDM1LjlzNTkuMS0xNy43IDgzLjQtMzUuOWMyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMHoiXQogICAgfTsKICAgIGZhTWljcm9waG9uZUxpbmVzU2xhc2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWljcm9waG9uZS1saW5lcy1zbGFzaCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJtaWNyb3Bob25lLWFsdC1zbGFzaCJdLCAiZjUzOSIsICJNNy0yNC45YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwbDE1MSAxNTEgMC0zMC4yYzAtNTMgNDMtOTYgOTYtOTYgNTAuMyAwIDkxLjYgMzguNyA5NS43IDg4TDMyOCA4OGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw1NiAwIDAgNDgtNTYgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw1NS43IDBjLTEuOSAyMi45LTExLjggNDMuNC0yNi45IDU5bDMzLjkgMzMuOWMyNS41LTI2IDQxLjMtNjEuNiA0MS4zLTEwMC45bDAtNDBjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDQwYzAgNTIuNi0yMS4xIDEwMC4yLTU1LjMgMTM0LjhMNTY5IDUwMy4xYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBMNyA5LjFDLTIuMy0uMy0yLjMtMTUuNSA3LTI0Ljl6TTI5Ny44IDM2Ny43bDQxLjQgNDEuNGMtOC44IDIuNC0xNy45IDQuMy0yNy4zIDUuNGwwIDQ5LjUgNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTQ0IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsNDggMCAwLTQ5LjVDMTY5LjMgNDAyLjcgOTYgMzIxLjkgOTYgMjI0bDAtNDBjMC01LjEgMS42LTkuOSA0LjQtMTMuOGw0My42IDQzLjYgMCAxMC4yYzAgNzkuNSA2NC41IDE0NCAxNDQgMTQ0IDMuMyAwIDYuNi0uMSA5LjgtLjN6Il0KICAgIH07CiAgICBmYU1pY3JvcGhvbmVBbHRTbGFzaCA9IGZhTWljcm9waG9uZUxpbmVzU2xhc2g7CiAgICBmYVNlcnZlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzZXJ2ZXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjIzMyIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NmwwIDY0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtNjRjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6bTIxNiA3MmEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6bTU2IDI0YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6TTY0IDI4OGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCA2NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTY0YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDI4OHptMjE2IDcyYTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHptNTYgMjRhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHoiXQogICAgfTsKICAgIGZhVXNlcjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlciIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyODEwMCwgNjIxNDQsIDYyNDcwLCAidXNlci1hbHQiLCAidXNlci1sYXJnZSJdLCAiZjAwNyIsICJNMjI0IDI0OGExMjAgMTIwIDAgMSAwIDAtMjQwIDEyMCAxMjAgMCAxIDAgMCAyNDB6bS0yOS43IDU2Qzk1LjggMzA0IDE2IDM4My44IDE2IDQ4Mi4zIDE2IDQ5OC43IDI5LjMgNTEyIDQ1LjcgNTEybDM1Ni42IDBjMTYuNCAwIDI5LjctMTMuMyAyOS43LTI5LjcgMC05OC41LTc5LjgtMTc4LjMtMTc4LjMtMTc4LjNsLTU5LjQgMHoiXQogICAgfTsKICAgIGZhVXNlckFsdDIgPSBmYVVzZXIyOwogICAgZmFVc2VyTGFyZ2UyID0gZmFVc2VyMjsKICAgIGZhU25vd2ZsYWtlMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzbm93Zmxha2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMDA1MiwgMTAwNTRdLCAiZjJkYyIsICJNMjg4LjIgMGMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDYyLjEtMTUtMTVjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwcy05LjQgMjQuNiAwIDMzLjlsNDkgNDkgMCA3MC42LTYxLjItMzUuMy0xNy45LTY2LjljLTMuNC0xMi44LTE2LjYtMjAuNC0yOS40LTE3Uzk1LjMgOTggOTguNyAxMTAuOGw1LjUgMjAuNS01My43LTMxQzM1LjIgOTEuNSAxNS42IDk2LjcgNi44IDExMnMtMy42IDM0LjkgMTEuNyA0My43bDUzLjcgMzEtMjAuNSA1LjVjLTEyLjggMy40LTIwLjQgMTYuNi0xNyAyOS40czE2LjYgMjAuNCAyOS40IDE3bDY2LjktMTcuOSA2MS4yIDM1LjMtNjEuMiAzNS4zLTY2LjktMTcuOWMtMTIuOC0zLjQtMjYgNC4yLTI5LjQgMTdzNC4yIDI2IDE3IDI5LjRsMjAuNSA1LjUtNTMuNyAzMUMzLjIgMzY1LjEtMiAzODQuNyA2LjggNDAwczI4LjQgMjAuNiA0My43IDExLjdsNTMuNy0zMS01LjUgMjAuNWMtMy40IDEyLjggNC4yIDI2IDE3IDI5LjRzMjYtNC4yIDI5LjQtMTdsMTcuOS02Ni45IDYxLjItMzUuMyAwIDcwLjYtNDkgNDljLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMGwxNS0xNSAwIDYyLjFjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTYyLjEgMTUgMTVjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC00OS00OSAwLTcwLjYgNjEuMiAzNS4zIDE3LjkgNjYuOWMzLjQgMTIuOCAxNi42IDIwLjQgMjkuNCAxN3MyMC40LTE2LjYgMTctMjkuNGwtNS41LTIwLjUgNTMuNyAzMWMxNS4zIDguOCAzNC45IDMuNiA0My43LTExLjdzMy42LTM0LjktMTEuNy00My43bC01My43LTMxIDIwLjUtNS41YzEyLjgtMy40IDIwLjQtMTYuNiAxNy0yOS40cy0xNi42LTIwLjQtMjkuNC0xN2wtNjYuOSAxNy45LTYxLjItMzUuMyA2MS4yLTM1LjMgNjYuOSAxNy45YzEyLjggMy40IDI2LTQuMiAyOS40LTE3cy00LjItMjYtMTctMjkuNGwtMjAuNS01LjUgNTMuNy0zMWMxNS4zLTguOCAyMC42LTI4LjQgMTEuNy00My43cy0yOC40LTIwLjUtNDMuNy0xMS43bC01My43IDMxIDUuNS0yMC41YzMuNC0xMi44LTQuMi0yNi0xNy0yOS40cy0yNiA0LjItMjkuNCAxN2wtMTcuOSA2Ni45LTYxLjIgMzUuMyAwLTcwLjYgNDktNDljOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMGwtMTUgMTUgMC02Mi4xeiJdCiAgICB9OwogICAgZmFTa3VsbENyb3NzYm9uZXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2t1bGwtY3Jvc3Nib25lcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyODM2OSwgOTc2MF0sICJmNzE0IiwgIk0zODQgMTQ0QzM4NCA2NC41IDMxMi40IDAgMjI0IDBTNjQgNjQuNSA2NCAxNDRjMCA0Ny4xIDI1LjEgODguOSA2NCAxMTUuMmwwIDI4LjhjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTI4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0yOC44YzM4LjktMjYuMyA2NC02OC4xIDY0LTExNS4yek0xNjAgMTI4YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHptOTYgMzJhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHpNNDQ1LjUgMzM5LjdjLTYuOC0xNi4zLTI1LjUtMjQtNDEuOC0xNy4yTDIyNCAzOTcuMyA0NC4zIDMyMi41Yy0xNi4zLTYuOC0zNSAuOS00MS44IDE3LjJzLjkgMzUgMTcuMiA0MS44TDE0MC44IDQzMiAxOS43IDQ4Mi41QzMuNCA0ODkuMy00LjMgNTA4IDIuNSA1MjQuM3MyNS41IDI0IDQxLjggMTcuMkwyMjQgNDY2LjcgNDAzLjcgNTQxLjVjMTYuMyA2LjggMzUtLjkgNDEuOC0xNy4ycy0uOS0zNS0xNy4yLTQxLjhMMzA3LjIgNDMyIDQyOC4zIDM4MS41YzE2LjMtNi44IDI0LTI1LjUgMTcuMi00MS44eiJdCiAgICB9OwogICAgZmFQZXNvU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXNvLXNpZ24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTIyMiIsICJNMTEyIDMyQzk0LjMgMzIgODAgNDYuMyA4MCA2NGwwIDY0LTI0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMjQgMCAwIDMyLTI0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMjQgMCAwIDE5MmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtOTYgOTYgMGM2NS42IDAgMTIyLTM5LjUgMTQ2LjctOTZsMzcuMyAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0yNC44IDBjLjUtNS4zIC44LTEwLjYgLjgtMTZzLS4zLTEwLjctLjgtMTZsMjQuOCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0zNy4zIDBDMzYyIDcxLjUgMzA1LjYgMzIgMjQwIDMyTDExMiAzMnptMTk5LjYgOTZsLTE2Ny42IDAgMC0zMiA5NiAwYzI4LjQgMCA1NCAxMi40IDcxLjYgMzJ6TTE0NCAxNzZsMTkwLjcgMGMuOSA1LjIgMS4zIDEwLjUgMS4zIDE2cy0uNSAxMC44LTEuMyAxNmwtMTkwLjcgMCAwLTMyem0xNjcuNiA4MGMtMTcuNiAxOS42LTQzLjEgMzItNzEuNiAzMmwtOTYgMCAwLTMyIDE2Ny42IDB6Il0KICAgIH07CiAgICBmYVdpbmVHbGFzcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3aW5lLWdsYXNzIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbMTI3ODYzXSwgImY0ZTMiLCAiTTMyLjYgMjUuN0MzNS42IDEwLjggNDguNyAwIDY0IDBMMjU2IDBjMTUuMyAwIDI4LjQgMTAuOCAzMS40IDI1LjdMMzE2LjggMTczYzIuMSAxMC41IDMuMiAyMS4yIDMuMiAzMmwwIDNjMCA3Ny40LTU1IDE0Mi0xMjggMTU2LjhsMCAxMTUuMiA2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDY0IDU0NGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw2NCAwIDAtMTE1LjJDNTUgMzUwIDAgMjg1LjQgMCAyMDhsMC0zYzAtMTAuNyAxLjEtMjEuNCAzLjItMzJMMzIuNiAyNS43ek03Ny40IDEyOGwxNjUuMSAwLTEyLjgtNjQtMTM5LjUgMC0xMi44IDY0eiJdCiAgICB9OwogICAgZmFUZW1wZXJhdHVyZUhhbGYgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGVtcGVyYXR1cmUtaGFsZiIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWzEyNzc3NywgInRlbXBlcmF0dXJlLTIiLCAidGhlcm1vbWV0ZXItMiIsICJ0aGVybW9tZXRlci1oYWxmIl0sICJmMmM5IiwgIk0xNjAgMEMxMDcgMCA2NCA0MyA2NCA5NmwwIDE2NC43QzM0LjUgMjg3IDE2IDMyNS40IDE2IDM2OCAxNiA0NDcuNSA4MC41IDUxMiAxNjAgNTEyczE0NC02NC41IDE0NC0xNDRjMC00Mi42LTE4LjUtODEtNDgtMTA3LjNMMjU2IDk2YzAtNTMtNDMtOTYtOTYtOTZ6bTY0IDM2OGMwIDM1LjMtMjguNyA2NC02NCA2NHMtNjQtMjguNy02NC02NGMwLTI2LjkgMTYuNS00OS45IDQwLTU5LjNsMC05Mi43YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA5Mi43YzIzLjUgOS41IDQwIDMyLjUgNDAgNTkuM3oiXQogICAgfTsKICAgIGZhVGVtcGVyYXR1cmUyID0gZmFUZW1wZXJhdHVyZUhhbGY7CiAgICBmYVRoZXJtb21ldGVyMiA9IGZhVGVtcGVyYXR1cmVIYWxmOwogICAgZmFUaGVybW9tZXRlckhhbGYgPSBmYVRlbXBlcmF0dXJlSGFsZjsKICAgIGZhVGlja2V0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRpY2tldCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyNzkwM10sICJmMTQ1IiwgIk02NCA2NEMyOC43IDY0IDAgOTIuNyAwIDEyOGwwIDY0QzAgMjAwLjggNy40IDIwNy43IDE1LjcgMjEwLjYgMzQuNSAyMTcuMSA0OCAyMzUgNDggMjU2cy0xMy41IDM4LjktMzIuMyA0NS40QzcuNCAzMDQuMyAwIDMxMS4yIDAgMzIwbDAgNjRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsNDQ4IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC02NGMwLTguOC03LjQtMTUuNy0xNS43LTE4LjYtMTguOC02LjUtMzIuMy0yNC40LTMyLjMtNDUuNHMxMy41LTM4LjkgMzIuMy00NS40YzguMy0yLjkgMTUuNy05LjggMTUuNy0xOC42bDAtNjRjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgNjR6TTQxNiAzMzZsMC0xNjAtMjU2IDAgMCAxNjAgMjU2IDB6TTExMiAxNjBjMC0xNy43IDE0LjMtMzIgMzItMzJsMjg4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxOTJjMCAxNy43LTE0LjMgMzItMzIgMzJsLTI4OCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTE5MnoiXQogICAgfTsKICAgIGZhV2hlYXRBd25DaXJjbGVFeGNsYW1hdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3aGVhdC1hd24tY2lyY2xlLWV4Y2xhbWF0aW9uIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1OTgiLCAiTTQ5NiA1NzZhMTQ0IDE0NCAwIDEgMSAwLTI4OCAxNDQgMTQ0IDAgMSAxIDAgMjg4ek04MSA1MjljLTkuNCA5LjMtMjQuNSA5LjMtMzMuOSAwLTkuNC05LjQtOS40LTI0LjYgMC0zMy45TDgxIDUyOXptMzAuMi0yOTQuNGM2LjItNC4xIDE0LjctMy40IDIwLjEgMi4xbDQ2LjEgNDYuMSA2LjEgNi43YzE5LjcgMjMuOCAyNi4zIDU1IDE5LjMgODMuOSAzMS43LTcuNyA2Ni4yIDEgOTAuNiAyNS4zbDEyIDEyYy0uOCA3LTEuMiAxNC4yLTEuMiAyMS40IDAgMjAgMyAzOS4zIDguNyA1Ny40LTM2LjggMjEuOC04NSAxNy0xMTYuNi0xNC43TDE2NS42IDQ0NC4zIDgxIDUyOUM2OS43IDUxNy43IDU4LjQgNTA2LjMgNDcgNDk1bDg0LjctODQuNy0zMC41LTMwLjVjLTM3LjUtMzcuNS0zNy41LTk4LjMgMC0xMzUuN2w3LjQtNy40IDIuNS0yLjF6TTQ5NiA0NzZhMjAgMjAgMCAxIDAgMCA0MCAyMCAyMCAwIDEgMCAwLTQwem0wLTE0MGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgODBjMCA4LjggNy4yIDE2IDE2IDE2IDguOCAwIDE2LTcuMiAxNi0xNmwwLTgwYzAtOC44LTcuMi0xNi0xNi0xNnpNMjE1LjIgMTMwLjZjNi4yLTQuMSAxNC43LTMuNCAyMC4xIDIuMWw0Ni4xIDQ2LjEgNi4xIDYuN2MxOS43IDIzLjggMjYuMyA1NSAxOS4zIDgzLjkgMjQuMi01LjkgNTAuMS0yLjEgNzEuOSAxMC44LTMyLjIgMjQuOS01Ni4yIDU5LjgtNjcuNCAxMDAuMS0zLjgtMi44LTcuNS02LTExLTkuNWwtOTQuOS05NC45Yy0zNy41LTM3LjUtMzcuNS05OC4zIDAtMTM1LjdsNy40LTcuNCAyLjUtMi4xek01MjYuNyAxNWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMCA4LjggOC44IDkuMyAyMi43IDEuNyAzMi4xTDU2MC42IDQ5IDQ0Ni4yIDE2My40YzcuNyAxIDE1LjMgMyAyMi41IDUuOUw1MjcgMTExYzkuNC05LjQgMjQuNi05LjQgMzQgMCA4LjggOC44IDkuMyAyMi43IDEuNiAzMi4xbC0xLjcgMS44LTUyLjcgNTIuNyAzOSAzOWMzLjIgMy4yIDQuNyA3LjQgNC43IDExLjYtMTcuNy01LjQtMzYuNS04LjMtNTUuOS04LjMtMzQuMiAwLTY2LjMgOC45LTk0LjEgMjQuNmwtOTIuNy05Mi43Yy0zNy41LTM3LjUtMzcuNS05OC4zIDAtMTM1LjhsNy40LTcuNCAyLjUtMi4xYzYuMi00LjEgMTQuNy0zLjQgMjAuMSAyLjFsMzkgMzkgNTIuNy01Mi43YzkuNC05LjQgMjQuNi05LjQgMzQgMCA4LjggOC44IDkuMyAyMi43IDEuNiAzMi4xTDQ2NSA0OSA0MDYuNyAxMDcuM2MyLjggNy4xIDQuNyAxNC41IDUuOCAyMi4xTDUyNi43IDE1eiJdCiAgICB9OwogICAgZmFBcnJvd3NUdXJuUmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3dzLXR1cm4tcmlnaHQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTRjMCIsICJNMzEzLjQtNi42YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDgwIDgwYzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zbC04MCA4MGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNMMzM4LjcgMTI4IDEyOCAxMjhjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJTMCAyNDEuNyAwIDIyNGwwLTMyQzAgMTIxLjMgNTcuMyA2NCAxMjggNjRsMjEwLjcgMC0yNS40LTI1LjRjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zem0tOTYgMjU2YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDgwIDgwYzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zbC04MCA4MGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNMMjQyLjcgMzg0IDk2IDM4NGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAzMmMwIDE3LjctMTQuMyAzMi0zMiAzMlMwIDQ2NS43IDAgNDQ4bDAtMzJjMC01MyA0My05NiA5Ni05NmwxNDYuNyAwLTI1LjQtMjUuNGMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjN6Il0KICAgIH07CiAgICBmYUNhbmR5Q2FuZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYW5keS1jYW5lIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY3ODYiLCAiTTQyMS44IDM5LjZDNDUyIDg1LjIgNDU2LjUgMTQyLjkgNDM1LjEgMTkybC0xNjUuNCAwIDQxLjQtNDEuNGMuOC0uOCAxLjUtMS42IDIuMi0yLjRMNDIxLjggMzkuNnpNMjY4IDEwMi45Yy0uOCAuNy0xLjYgMS40LTIuNCAyLjJsLTI4LjEgMjguMWMtMjUgMjUtNjUuNSAyNS05MC41IDBzLTI1LTY1LjUgMC05MC41TDE3NSAxNC42QzIyOS45LTQwLjIgMzE0LjUtNDYuNyAzNzYuNS01LjZMMjY4IDEwMi45ek0xMjUuNyAzMzZsODAtODAgMTgxIDAtODIuNSA4Mi41IDAtMi41LTE3OC41IDB6bTExNyA2NEwxNDEuNCA1MDEuM2MtMjUgMjUtNjUuNSAyNS05MC41IDBzLTI1LTY1LjUgMC05MC41bDEwLjctMTAuNyAxODEgMHoiXQogICAgfTsKICAgIGZhV2hlZWxjaGFpciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3aGVlbGNoYWlyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxOTMiLCAiTTEzNiA0MGE1NiA1NiAwIDEgMSAxMTIgMCA1NiA1NiAwIDEgMSAtMTEyIDB6TTExNy45IDE5Ny42bDEyLjYgNjNjLTM4LjYgMTIuNC02Ni41IDQ4LjctNjYuNSA5MS40IDAgNTMgNDMgOTYgOTYgOTYgMzUuNiAwIDY2LjctMTkuNCA4My4zLTQ4LjIgMi4zIC4xIDQuNiAuMiA3IC4ybDQuMSAwYzEgMCAyLjEgMCAzLjEgMGw1NS4yIDBjLTIwLjQgNjQuOS04MSAxMTItMTUyLjcgMTEyLTg4LjQgMC0xNjAtNzEuNi0xNjAtMTYwIDAtNzMuOCA1MC0xMzUuOSAxMTcuOS0xNTQuNHptMTQ4LjYtMjguMWwyMy43IDExOC41IDYwLjUgMGMzMy4zIDAgNjMuMiAyMC43IDc0LjkgNTEuOWwyNS41IDY4IDE4LjctNi4yYzE2LjgtNS42IDM0LjkgMy41IDQwLjUgMjAuMnMtMy41IDM0LjktMjAuMiA0MC41bC00OCAxNmMtMTYuMyA1LjQtMzQtMy00MC4xLTE5LjFsLTM2LjMtOTYuOWMtMi4zLTYuMi04LjMtMTAuNC0xNS0xMC40bC04Ni4xIDBjLS40IDAtLjggMC0xLjMgMGwtMTMuMSAwYy0zMC41IDAtNTYuOC0yMS41LTYyLjgtNTEuNEwxNjUuMyAxODkuN2MtNi40LTMxLjkgMTgtNjEuNyA1MC42LTYxLjcgMjQuNiAwIDQ1LjggMTcuNCA1MC42IDQxLjV6Il0KICAgIH07CiAgICBmYVNwZWxsQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3BlbGwtY2hlY2siLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjg5MSIsICJNMTIwIDMyYy00OC42IDAtODggMzkuNC04OCA4OGwwIDE2OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtNjQgNjQgMCAwIDY0YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xNjhjMC00OC42LTM5LjQtODgtODgtODhsLTE2IDB6bTQwIDEyOGwtNjQgMCAwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0bDE2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA0MHpNMzA0IDMyYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDIyNGMwIDE3LjcgMTQuMyAzMiAzMiAzMmw3MiAwYzQ4LjYgMCA4OC0zOS40IDg4LTg4IDAtMjMuNi05LjMtNDUtMjQuNC02MC44IDEwLjMtMTQuNCAxNi40LTMyLjEgMTYuNC01MS4yIDAtNDguNi0zOS40LTg4LTg4LTg4bC02NCAwem02NCAxMTJsLTMyIDAgMC00OCAzMiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0ek0zMzYgMjU2bDAtNDggNDAgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNDAgMHptMjMzIDg0YzExLTEzLjggOC44LTMzLjktNS00NXMtMzMuOS04LjgtNDUgNWwtMTA1LjcgMTMyLjEtMzguNy0zOC43Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2w2NCA2NGM2LjQgNi40IDE1LjMgOS44IDI0LjQgOS4zczE3LjUtNC45IDIzLjItMTJMNTY5IDM0MHoiXQogICAgfTsKICAgIGZhVm9sdW1lT2ZmID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZvbHVtZS1vZmYiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZjAyNiIsICJNOTYgMzUybC00OCAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTk2YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDQ4IDAgMTM0LjEtMTE5LjJjNi40LTUuNyAxNC42LTguOCAyMy4xLTguOCAxOS4yIDAgMzQuOCAxNS42IDM0LjggMzQuOGwwIDM3OC40YzAgMTkuMi0xNS42IDM0LjgtMzQuOCAzNC44LTguNSAwLTE2LjctMy4xLTIzLjEtOC44TDk2IDM1MnoiXQogICAgfTsKICAgIGZhTHVuZ3MgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibHVuZ3MiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjk3MjldLCAiZjYwNCIsICJNMzIwIDMyYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMTQxLjktMzIgMTkuMiAwLTExNi43YzAtMjQuNS0xOS45LTQ0LjQtNDQuNC00NC40LTEyLjUgMC0yNC40IDUuMy0zMi44IDE0LjVsLTI2LjQgMjlDNDIuOSAxNjAuOCAwIDI3MS44IDAgMzg3bDAgMzAuNWMwIDUyLjIgNDIuMyA5NC41IDk0LjUgOTQuNSAyMiAwIDQzLjctNS4xIDYzLjQtMTVsNS0yLjVjMzcuNC0xOC43IDYxLTU2LjkgNjEtOTguOGwwLTEyOCA2NC0zOC40IDY0IDM4LjQgMCAxMjhjMCA0MS44IDIzLjYgODAuMSA2MSA5OC44bDUgMi41YzE5LjcgOS44IDQxLjQgMTUgNjMuNCAxNSA1Mi4yIDAgOTQuNS00Mi4zIDk0LjUtOTQuNWwwLTYuMmMwLTExMS4xLTM2LjctMjE5LTEwNC40LTMwN0w0MjguOSA0OC43Yy04LjEtMTAuNi0yMC43LTE2LjctMzQtMTYuNy0yMy43IDAtNDIuOSAxOS4yLTQyLjkgNDIuOWwwIDExOC4yLTMyLTE5LjIgMC0xNDEuOXoiXQogICAgfTsKICAgIGZhQm9va21hcmsyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvb2ttYXJrIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4Mjc4LCA2MTU5MV0sICJmMDJlIiwgIk02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NEwwIDQ4MGMwIDExLjUgNi4yIDIyLjIgMTYuMiAyNy44czIyLjMgNS41IDMyLjItLjRMMTkyIDQyMS4zIDMzNS41IDUwNy40YzkuOSA1LjkgMjIuMiA2LjEgMzIuMiAuNFMzODQgNDkxLjUgMzg0IDQ4MGwwLTQxNmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAweiJdCiAgICB9OwogICAgZmFCYXJjb2RlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhcmNvZGUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjAyYSIsICJNMzIgMzJDMTQuMyAzMiAwIDQ2LjMgMCA2NEwwIDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMyTDY0IDY0YzAtMTcuNy0xNC4zLTMyLTMyLTMyem04OCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDQwMGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNDAwYzAtMTMuMy0xMC43LTI0LTI0LTI0em03MiAzMmwwIDM4NGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzg0YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMyem0yMDgtOGwwIDQwMGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNDAwYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0em0tOTYgMGwwIDQwMGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNDAwYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0eiJdCiAgICB9OwogICAgZmFMaXN0T2wgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGlzdC1vbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJsaXN0LTEtMiIsICJsaXN0LW51bWVyaWMiXSwgImYwY2IiLCAiTTAgNzJDMCA1OC44IDEwLjcgNDggMjQgNDhsNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDEwNCAyNCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC05NiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDI0IDAgMC04MC0yNCAwQzEwLjcgOTYgMCA4NS4zIDAgNzJ6TTMwLjQgMzAxLjJDNDEuOCAyOTIuNiA1NS43IDI4OCA3MCAyODhsNC45IDBjMzMuNyAwIDYxLjEgMjcuNCA2MS4xIDYxLjEgMCAxOS42LTkuNCAzNy45LTI1LjIgNDkuNGwtMjQgMTcuNSAzMy4yIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTkwLjcgMEMxMy4xIDQ2NCAwIDQ1MC45IDAgNDM0LjcgMCA0MjUuMyA0LjUgNDE2LjUgMTIuMSA0MTFsNzAuNS01MS4zYzMuNC0yLjUgNS40LTYuNCA1LjQtMTAuNiAwLTcuMi01LjktMTMuMS0xMy4xLTEzLjFMNzAgMzM2Yy0zLjkgMC03LjcgMS4zLTEwLjggMy42TDM4LjQgMzU1LjJjLTEwLjYgOC0yNS42IDUuOC0zMy42LTQuOFMtMSAzMjQuOCA5LjYgMzE2LjhsMjAuOC0xNS42ek0yMjQgNjRsMjU2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTI1NiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMyem0wIDE2MGwyNTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMjU2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJ6bTAgMTYwbDI1NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0yNTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMnoiXQogICAgfTsKICAgIGZhTGlzdDEyID0gZmFMaXN0T2w7CiAgICBmYUxpc3ROdW1lcmljID0gZmFMaXN0T2w7CiAgICBmYUZpbGVDaXJjbGVYbWFyayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLWNpcmNsZS14bWFyayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNWExIiwgIk05NiAwQzYwLjcgMCAzMiAyOC43IDMyIDY0bDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE4MCAwYy0yMi43LTMxLjUtMzYtNzAuMi0zNi0xMTIgMC0xMDAuNiA3Ny40LTE4My4yIDE3Ni0xOTEuM2wwLTM4LjFjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNMMjkwLjcgMTguN0MyNzguNyA2LjcgMjYyLjUgMCAyNDUuNSAwTDk2IDB6TTM1Ny41IDE3NkwyNjQgMTc2Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNEwyNDAgNTguNSAzNTcuNSAxNzZ6TTQzMiA1NDRhMTQ0IDE0NCAwIDEgMCAwLTI4OCAxNDQgMTQ0IDAgMSAwIDAgMjg4em01OS4zLTE4MC43bC0zNi43IDM2LjcgMzYuNyAzNi43YzYuMiA2LjIgNi4yIDE2LjQgMCAyMi42cy0xNi40IDYuMi0yMi42IDBsLTM2LjctMzYuNy0zNi43IDM2LjdjLTYuMiA2LjItMTYuNCA2LjItMjIuNiAwcy02LjItMTYuNCAwLTIyLjZsMzYuNy0zNi43LTM2LjctMzYuN2MtNi4yLTYuMi02LjItMTYuNCAwLTIyLjZzMTYuNC02LjIgMjIuNiAwbDM2LjcgMzYuNyAzNi43LTM2LjdjNi4yLTYuMiAxNi40LTYuMiAyMi42IDBzNi4yIDE2LjQgMCAyMi42eiJdCiAgICB9OwogICAgZmFDdWJlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImN1YmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjFiMiIsICJNMjI0LjMtMi41YzE5LjgtMTEuNCA0NC4yLTExLjQgNjQgMEw0NjQuMiA5OWMxOS44IDExLjQgMzIgMzIuNiAzMiA1NS40bDAgMjAzYzAgMjIuOS0xMi4yIDQ0LTMyIDU1LjRMMjg4LjMgNTE0LjVjLTE5LjggMTEuNC00NC4yIDExLjQtNjQgMEw0OC41IDQxM2MtMTkuOC0xMS40LTMyLTMyLjYtMzItNTUuNGwwLTIwM2MwLTIyLjkgMTIuMi00NCAzMi01NS40TDIyNC4zLTIuNXptMjA3LjggMzYwbDAtMTY2LjEtMTQzLjggODMgMCAxNjYuMSAxNDMuOC04M3oiXQogICAgfTsKICAgIGZhVGFwZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YXBlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY0ZGIiLCAiTTQxMi44IDQxNmM0MS41LTQwLjcgNjcuMi05Ny4zIDY3LjItMTYwIDAtMTIzLjctMTAwLjMtMjI0LTIyNC0yMjRTMzIgMTMyLjMgMzIgMjU2IDEzMi4zIDQ4MCAyNTYgNDgwbDI4OCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0xMzEuMiAwek0yNTYgMTYwYTk2IDk2IDAgMSAxIDAgMTkyIDk2IDk2IDAgMSAxIDAtMTkyem00OCA5NmE0OCA0OCAwIDEgMCAtOTYgMCA0OCA0OCAwIDEgMCA5NiAweiJdCiAgICB9OwogICAgZmFCb21iID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvbWIiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgxNjNdLCAiZjFlMiIsICJNNDgwLTE2YzYuOSAwIDEzIDQuNCAxNS4yIDEwLjlsMTMuNSA0MC40IDQwLjQgMTMuNUM1NTUuNiA1MSA1NjAgNTcuMSA1NjAgNjRzLTQuNCAxMy0xMC45IDE1LjJsLTQwLjQgMTMuNS0xMy41IDQwLjRDNDkzIDEzOS42IDQ4Ni45IDE0NCA0ODAgMTQ0cy0xMy00LjQtMTUuMi0xMC45bC0xMy41LTQwLjQtNDAuNC0xMy41QzQwNC40IDc3IDQwMCA3MC45IDQwMCA2NHM0LjQtMTMgMTAuOS0xNS4ybDQwLjQtMTMuNSAxMy41LTQwLjRDNDY3LTExLjYgNDczLjEtMTYgNDgwLTE2ek0zMjEuNCA5Ny40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDgwIDgwYzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zbC0xMC45IDEwLjljNy45IDIyIDEyLjIgNDUuNyAxMi4yIDcwLjUgMCAxMTQuOS05My4xIDIwOC0yMDggMjA4UzMyIDQxOC45IDMyIDMwNCAxMjUuMSA5NiAyNDAgOTZjMjQuNyAwIDQ4LjUgNC4zIDcwLjUgMTIuM2wxMC45LTEwLjl6TTE0NCAzMDRjMC01MyA0My05NiA5Ni05NiAxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGMtNzkuNSAwLTE0NCA2NC41LTE0NCAxNDQgMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNHoiXQogICAgfTsKICAgIGZhU2NhbGVVbmJhbGFuY2VkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNjYWxlLXVuYmFsYW5jZWQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsiYmFsYW5jZS1zY2FsZS1sZWZ0Il0sICJmNTE1IiwgIk01MTkuOCA2Mi40YzE2LjgtNS42IDI1LjgtMjMuNyAyMC4yLTQwLjVTNTE2LjMtMy45IDQ5OS42IDEuNmwtMTEzIDM3LjdjLTEzLjktMjMuNS0zOS42LTM5LjMtNjguOS0zOS4zLTQ0LjIgMC04MCAzNS44LTgwIDgwIDAgMyAuMiA1LjkgLjUgOC44TDExNS42IDEyOS42Yy0xNi44IDUuNi0yNS44IDIzLjctMjAuMiA0MC41czIzLjcgMjUuOCA0MC41IDIwLjJsMTM1LjUtNDUuMmM0LjUgMy4yIDkuMyA1LjkgMTQuNCA4LjJsMCAzMjYuN2MwIDE3LjcgMTQuMyAzMiAzMiAzMmwxOTIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTYwIDAgMC0yOTQuN2MyMS05LjIgMzcuMi0yNyA0NC4yLTQ5bDEyNS45LTQyek00MzcuMyAyODhsNzIuNC0xMjQuMiA3Mi40IDEyNC4yLTE0NC45IDB6bTcyLjQgOTZjNjIuOSAwIDExNS4yLTM0IDEyNi03OC45IDIuNi0xMS0xLTIyLjMtNi43LTMyLjFMNTMzLjggMTA5LjhjLTUtOC42LTE0LjItMTMuOC0yNC4xLTEzLjhzLTE5LjEgNS4zLTI0LjEgMTMuOEwzOTAuNCAyNzMuMWMtNS43IDkuOC05LjMgMjEuMS02LjcgMzIuMSAxMC44IDQ0LjggNjMuMSA3OC45IDEyNiA3OC45ek0xMjYuOCAyOTEuOGw3Mi40IDEyNC4yLTE0NC45IDAgNzIuNC0xMjQuMnpNLjkgNDMzLjFDMTEuNyA0NzggNjQgNTEyIDEyNi44IDUxMnMxMTUuMi0zNCAxMjYtNzguOWMyLjYtMTEtMS0yMi4zLTYuNy0zMi4xTDE1MC45IDIzNy44Yy01LTguNi0xNC4yLTEzLjgtMjQuMS0xMy44cy0xOS4xIDUuMy0yNC4xIDEzLjhMNy42IDQwMS4xYy01LjcgOS44LTkuMyAyMS4xLTYuNyAzMi4xeiJdCiAgICB9OwogICAgZmFCYWxhbmNlU2NhbGVMZWZ0ID0gZmFTY2FsZVVuYmFsYW5jZWQ7CiAgICBmYVNxdWFyZUNhcmV0TGVmdDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLWNhcmV0LWxlZnQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiY2FyZXQtc3F1YXJlLWxlZnQiXSwgImYxOTEiLCAiTTAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZ6TTEyOCAyNTZjMC02LjcgMi44LTEzIDcuNy0xNy42bDExMi0xMDRjNy02LjUgMTcuMi04LjIgMjUuOS00LjRTMjg4IDE0Mi41IDI4OCAxNTJsMCAyMDhjMCA5LjUtNS43IDE4LjItMTQuNCAyMnMtMTguOSAyLjEtMjUuOS00LjRsLTExMi0xMDRjLTQuOS00LjUtNy43LTEwLjktNy43LTE3LjZ6Il0KICAgIH07CiAgICBmYUNhcmV0U3F1YXJlTGVmdDIgPSBmYVNxdWFyZUNhcmV0TGVmdDI7CiAgICBmYVJ1bGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJ1bGVyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4MjA3XSwgImY1NDUiLCAiTTIwOS4xIDUxNi4yYy0xOC43IDE4LjctNDkuMSAxOC43LTY3LjkgMEwyOC4xIDQwMy4xYy0xOC43LTE4LjctMTguNy00OS4xIDAtNjcuOWwxNy0xNyA3My41IDczLjVjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC03My41LTczLjUgMzMuOS0zMy45IDUwLjkgNTAuOWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTUwLjktNTAuOSAzMy45LTMzLjkgNzMuNSA3My41YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNzMuNS03My41IDMzLjktMzMuOSA1MC45IDUwLjljOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC01MC45LTUwLjkgMzMuOS0zMy45IDczLjUgNzMuNWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTczLjUtNzMuNSAxNy0xN2MxOC43LTE4LjcgNDkuMS0xOC43IDY3LjkgMEw1NDguNSAxMDguOWMxOC43IDE4LjcgMTguNyA0OS4xIDAgNjcuOUwyMDkuMSA1MTYuMnoiXQogICAgfTsKICAgIGZhSSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJpIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbMTA1XSwgIjQ5IiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0UzE0LjMgOTYgMzIgOTZsOTYgMCAwIDMyMC05NiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDI1NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC05NiAwIDAtMzIwIDk2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgMzJ6Il0KICAgIH07CiAgICBmYVZvbHVtZVhtYXJrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZvbHVtZS14bWFyayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJ2b2x1bWUtbXV0ZSIsICJ2b2x1bWUtdGltZXMiXSwgImY2YTkiLCAiTTQ4IDM1Mmw0OCAwIDEzNC4xIDExOS4yYzYuNCA1LjcgMTQuNiA4LjggMjMuMSA4LjggMTkuMiAwIDM0LjgtMTUuNiAzNC44LTM0LjhsMC0zNzguNGMwLTE5LjItMTUuNi0zNC44LTM0LjgtMzQuOC04LjUgMC0xNi43IDMuMS0yMy4xIDguOEw5NiAxNjAgNDggMTYwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDk2YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4ek0zNjcgMTc1Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOWw0NyA0Ny00NyA0N2MtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDQ3LTQ3IDQ3IDQ3YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNDctNDcgNDctNDdjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMGwtNDcgNDctNDctNDdjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAweiJdCiAgICB9OwogICAgZmFWb2x1bWVNdXRlID0gZmFWb2x1bWVYbWFyazsKICAgIGZhVm9sdW1lVGltZXMgPSBmYVZvbHVtZVhtYXJrOwogICAgZmFBcmNod2F5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFyY2h3YXkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjU1NyIsICJNMzIgMzJDMTQuMyAzMiAwIDQ2LjMgMCA2NFMxNC4zIDk2IDMyIDk2bDQ0OCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDMyIDMyem0wIDM4NGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwxMjggMCAwLTEyOGMwLTUzIDQzLTk2IDk2LTk2czk2IDQzIDk2IDk2bDAgMTI4IDEyOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybDAtMjcyLTQ0OCAwIDAgMjcyeiJdCiAgICB9OwogICAgZmFQZXJzb25EaWdnaW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1kaWdnaW5nIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImRpZ2dpbmciXSwgImY4NWUiLCAiTTIwOCA0MGE1NiA1NiAwIDEgMSAxMTIgMCA1NiA1NiAwIDEgMSAtMTEyIDB6TTEwLjUgMTgxLjNjNS45LTExLjkgMjAuMy0xNi43IDMyLjItMTAuN2wyNC42IDEyLjMgMTIuMi0yMC40YzE4LjktMzEuNSA1My4yLTUwLjUgODkuNi01MC41IDQ2LjIgMCA4Ny43IDMwLjUgMTAwLjUgNzUuNGwzMi4yIDExMi43IDkyLjkgNDYuNCAyNS44LTQzYzUuOC05LjYgMTYuMi0xNS41IDI3LjQtMTUuNXMyMS43IDUuOSAyNy40IDE1LjVsOTYgMTYwYzUuOSA5LjkgNi4xIDIyLjIgLjQgMzIuMlM1NTUuNSA1MTIgNTQ0IDUxMmwtMTkyIDBjLTExLjUgMC0yMi4yLTYuMi0yNy44LTE2LjJzLTUuNS0yMi4zIC40LTMyLjJMMzcwIDM4Ny44IDIxLjMgMjEzLjVjLTExLjktNS45LTE2LjctMjAuMy0xMC43LTMyLjJ6TTk0LjMgMzA3LjRsMTEyIDU2YzEwLjggNS40IDE3LjcgMTYuNSAxNy43IDI4LjZsMCA4OGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY4LjItNjEuMy0zMC43LTM2LjMgMTA5Yy01LjYgMTYuOC0yMy43IDI1LjgtNDAuNSAyMC4yUy0zLjkgNDg2LjYgMS43IDQ2OS45bDQ4LTE0NGMyLjktOC44IDkuNS0xNS45IDE4LjEtMTkuNHMxOC4zLTMuMiAyNi42IC45eiJdCiAgICB9OwogICAgZmFEaWdnaW5nID0gZmFQZXJzb25EaWdnaW5nOwogICAgZmFHYXVnZUhpZ2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ2F1Z2UtaGlnaCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYyNDYxLCAidGFjaG9tZXRlci1hbHQiLCAidGFjaG9tZXRlci1hbHQtZmFzdCJdLCAiZjYyNSIsICJNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHpNMjg4IDk2YTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6TTI1NiA0MTZjMzUuMyAwIDY0LTI4LjcgNjQtNjQgMC0xNi4yLTYtMzEuMS0xNi00Mi4zbDY5LjUtMTM4LjljNS45LTExLjkgMS4xLTI2LjMtMTAuNy0zMi4ycy0yNi4zLTEuMS0zMi4yIDEwLjdMMjYxLjEgMjg4LjJjLTEuNy0uMS0zLjQtLjItNS4xLS4yLTM1LjMgMC02NCAyOC43LTY0IDY0czI4LjcgNjQgNjQgNjR6TTE3NiAxNDRhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHpNOTYgMjg4YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHptMzUyLTMyYTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6Il0KICAgIH07CiAgICBmYVRhY2hvbWV0ZXJBbHQgPSBmYUdhdWdlSGlnaDsKICAgIGZhVGFjaG9tZXRlckFsdEZhc3QgPSBmYUdhdWdlSGlnaDsKICAgIGZhR2VuZGVybGVzcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnZW5kZXJsZXNzIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYyMmQiLCAiTTE5MiAxMjhhMTI4IDEyOCAwIDEgMSAwIDI1NiAxMjggMTI4IDAgMSAxIDAtMjU2em0wIDMyMGExOTIgMTkyIDAgMSAwIDAtMzg0IDE5MiAxOTIgMCAxIDAgMCAzODR6Il0KICAgIH07CiAgICBmYUNsb3VkU3VuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNsb3VkLXN1biIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzk5MjVdLCAiZjZjNCIsICJNNDUzLjYtMTQuOGM0LjkgMiA4LjUgNi40IDkuNSAxMS42TDQ4MCA4MCA1NjMuMiA5Ni44YzUuMiAxLjEgOS41IDQuNiAxMS42IDkuNXMxLjUgMTAuNS0xLjQgMTQuOWwtNDYuOSA3MC43IDQ2LjkgNzAuN2MyLjkgNC40IDMuNSAxMCAxLjQgMTQuOXMtNi40IDguNS0xMS42IDkuNUw1MDEgMjk5LjdjLTExLjktOC43LTI1LjEtMTUuNi0zOS40LTIwLjQtMi41LTEyLjctNi44LTI0LjctMTIuNy0zNS43IDkuNS0xNC45IDE1LjEtMzIuNiAxNS4xLTUxLjcgMC01My00My05Ni05Ni05Ni00Ny45IDAtODcuNiAzNS4xLTk0LjggODAuOS0yNi41LTIwLjMtNTkuNS0zMi41LTk1LjQtMzIuOWwtMTUuMS0yMi43Yy0yLjktNC40LTMuNS0xMC0xLjQtMTQuOXM2LjQtOC41IDExLjYtOS41TDI1NiA4MCAyNzIuOC0zLjJjMS4xLTUuMiA0LjYtOS41IDkuNS0xMS42czEwLjUtMS41IDE0LjkgMS40TDM2OCAzMy42IDQzOC43LTEzLjNjNC40LTIuOSAxMC0zLjUgMTQuOS0xLjR6TTQxNiAxOTJjMCAzLjgtLjQgNy41LTEuMyAxMS4xLTIxLjctMTctNDktMjcuMS03OC43LTI3LjEtNC42IDAtOS4xIC4yLTEzLjUgLjcgNi40LTE5IDI0LjQtMzIuNyA0NS41LTMyLjcgMjYuNSAwIDQ4IDIxLjUgNDggNDh6TTk2IDUxMmMtNTMgMC05Ni00My05Ni05NiAwLTQyLjUgMjcuNi03OC42IDY1LjktOTEuMi0xLjMtNi43LTEuOS0xMy43LTEuOS0yMC44IDAtNjEuOSA1MC4xLTExMiAxMTItMTEyIDQzLjEgMCA4MC41IDI0LjMgOTkuMiA2MCAxNC43LTE3LjEgMzYuNS0yOCA2MC44LTI4IDQ0LjIgMCA4MCAzNS44IDgwIDgwIDAgNS41LS42IDEwLjgtMS42IDE2IC41IDAgMS4xIDAgMS42IDAgNTMgMCA5NiA0MyA5NiA5NnMtNDMgOTYtOTYgOTZMOTYgNTEyeiJdCiAgICB9OwogICAgZmFBcnJvd1JpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXJpZ2h0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbODU5NF0sICJmMDYxIiwgIk01MDIuNiAyNzguNmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM2wtMTYwLTE2MGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNMNDAyLjcgMjI0IDMyIDIyNGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzNzAuNyAwLTEwNS40IDEwNS40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwbDE2MC0xNjB6Il0KICAgIH07CiAgICBmYUhhbmRzaGFrZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZHNoYWtlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI5MzA5LCA2MjY2MiwgImhhbmRzaGFrZS1hbHQiLCAiaGFuZHNoYWtlLXNpbXBsZSJdLCAiZjJiNSIsICJNMjY4LjkgODUuMkwxNTIuMyAyMTQuOGMtNC42IDUuMS00LjQgMTMgLjUgMTcuOSAzMC41IDMwLjUgODAgMzAuNSAxMTAuNSAwbDMxLjgtMzEuOGM0LjItNC4yIDkuNS02LjUgMTQuOS02LjkgNi44LS42IDEzLjggMS43IDE5IDYuOUw1MDUuNiAzNzYgNTc2IDMyMCA1NzYgMzIgNDY0IDk2IDQ0MC4yIDgwLjFDNDI0LjQgNjkuNiA0MDUuOSA2NCAzODYuOSA2NGwtNzAuNCAwYy0xLjEgMC0yLjMgMC0zLjQgLjEtMTYuOSAuOS0zMi44IDguNS00NC4yIDIxLjF6TTExNi42IDE4Mi43TDIyMy40IDY0IDE4My44IDY0Yy0yNS41IDAtNDkuOSAxMC4xLTY3LjkgMjguMUwxMTIgOTYgMCAzMiAwIDMyMCAxNTYuNCA0NTAuM2MyMyAxOS4yIDUyIDI5LjcgODEuOSAyOS43bDE1LjcgMC03LTdjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGw0MSA0MSA5IDBjMTkuMSAwIDM3LjgtNC4zIDU0LjgtMTIuM0wzNTkgNDQxYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBsMzIgMzIgMTcuNS0xNy41YzguOS04LjkgMTEuNS0yMS44IDcuNi0zMy4xbC0xMzcuOS0xMzYuOC0xNC45IDE0LjljLTQ5LjMgNDkuMy0xMjkuMSA0OS4zLTE3OC40IDAtMjMtMjMtMjMuOS01OS45LTIuMi04NHoiXQogICAgfTsKICAgIGZhSGFuZHNoYWtlQWx0MiA9IGZhSGFuZHNoYWtlMjsKICAgIGZhSGFuZHNoYWtlU2ltcGxlMiA9IGZhSGFuZHNoYWtlMjsKICAgIGZhUGVyc29uU2tpaW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1za2lpbmciLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFs5OTc1LCAic2tpaW5nIl0sICJmN2M5IiwgIk00MTYgNTZhNTYgNTYgMCAxIDEgMTEyIDAgNTYgNTYgMCAxIDEgLTExMiAwek0yLjcgMzAwLjljNi4xLTExLjggMjAuNi0xNi4zIDMyLjQtMTAuMmwxOTcuOCAxMDIuNyA2Mi4zLTg3LjItODItOTIuMmMtMTEtMTIuNC0xNi4yLTI3LjUtMTYuMi00Mi40bDExMS42IDUzLjQgNDIuOSA0OC4yYzE0LjkgMTYuNyAxNi4yIDQxLjYgMy4yIDU5LjhsLTY0LjQgOTAuMiAxMjguMyA2Ni42YzEzLjYgNy4xIDI5LjggNy4yIDQzLjYgLjNsMTUuMi03LjZjMTEuOS01LjkgMjYuMy0xLjEgMzIuMiAxMC43czEuMSAyNi4zLTEwLjcgMzIuMmwtMTUuMiA3LjZjLTI3LjUgMTMuNy01OS45IDEzLjUtODcuMi0uN0wxMi45IDMzMy4zQzEuMiAzMjcuMi0zLjQgMzEyLjcgMi43IDMwMC45ek0xMDMgNDkuNmwxOCA4LjcgOC43LTE3LjRjNC03LjkgMTMuNi0xMS4xIDIxLjUtNy4yczExLjEgMTMuNiA3LjIgMjEuNWwtOC41IDE3IDg0LjggNDEgLjQtLjIgNzYuMS0zMy44YzMxLjMtMTMuOSA2Ny45LS43IDgzLjIgMjkuOWwyOC45IDU3LjggNjguNyAyNy41YzE2LjQgNi42IDI0LjQgMjUuMiAxNy44IDQxLjZzLTI1LjIgMjQuNC00MS42IDE3LjhMMzkzLjggMjI0Yy0xMC45LTQuNC0xOS44LTEyLjYtMjUuMS0yMy4xbC0xMS41LTIzLjFjLTE2LjQgOS40LTI1LjkgMTQuOC0yOC41IDE2LjNsLTcuNi0zLjctMTg1LjYtODkuNi05LjIgMTguM2MtNCA3LjktMTMuNiAxMS4xLTIxLjUgNy4ycy0xMS4xLTEzLjYtNy4yLTIxLjVsOS0xNy45LTE3LjYtOC41QzgxLjEgNzQuNiA3Ny44IDY1IDgxLjYgNTdTOTUgNDUuNyAxMDMgNDkuNnoiXQogICAgfTsKICAgIGZhU2tpaW5nID0gZmFQZXJzb25Ta2lpbmc7CiAgICBmYUJyaWRnZVdhdGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJyaWRnZS13YXRlciIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNGNlIiwgIk02NCA2NGw1MTIgMCAwIDExMmMtMzcuNiA5LjQtNjQgNDMuMi02NCA4MmwwIDc2LjRjLTIxLTkuNy00My41LTE0LjUtNjYtMTQuNC0xMCAuMS0yMC4xIDEuMS0zMCAzLjFsMC0zNS4xYzAtNTMtNDMtOTYtOTYtOTZzLTk2IDQzLTk2IDk2bDAgMzIuN2MtNS4zLS41LTEwLjctLjgtMTYtLjctMjcuNyAuMi01NS40IDcuOC04MCAyM2wwLTg1YzAtMzguOC0yNi40LTcyLjYtNjQtODJMNjQgNjR6TTQwMy40IDQ0NC4xQzM3OS4xIDQ2Mi4zIDM1MS4xIDQ4MCAzMjAgNDgwcy01OS4xLTE3LjctODMuNC0zNS45Yy0yMS4zLTE2LjEtNDkuOS0xNi4xLTcxLjIgMC0yMy44IDE3LjktNTQuMSAzNS41LTg4LjEgMzUuMy0yMC40LS4xLTQwLjctNi43LTU5LjgtMjEuMS0xMC42LTgtMTIuNy0yMy00LjctMzMuNnMyMy0xMi43IDMzLjYtNC43YzExLjMgOC41IDIxLjYgMTEuNCAzMS4yIDExLjUgMTcuNiAuMSAzNy4zLTkuNCA1OC45LTI1LjcgMzguNC0yOSA5MC41LTI5IDEyOSAwIDI0IDE4LjEgNDAuNyAyNi4zIDU0LjUgMjYuM3MzMC41LTguMiA1NC41LTI2LjNjMzguNC0yOSA5MC41LTI5IDEyOSAwIDE2LjkgMTIuNyAzMi45IDIxLjUgNDcuOCAyNC42IDEzLjcgMi44IDI3LjQgLjkgNDIuMy0xMC4zIDEwLjYtOCAyNS42LTUuOSAzMy42IDQuN3M1LjkgMjUuNi00LjcgMzMuNmMtMjYuNCAxOS45LTU0LjIgMjQuNC04MC43IDE5LjEtMjUuMy01LjEtNDguMS0xOC45LTY3LjItMzMuMy0yMS4zLTE2LjEtNDkuOS0xNi4xLTcxLjIgMHoiXQogICAgfTsKICAgIGZhQnVpbGRpbmdOZ28gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnVpbGRpbmctbmdvIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU0ZDciLCAiTTEyOCAwQzkyLjcgMCA2NCAyOC43IDY0IDY0bDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDQ4IDAgMC0xMTJjMC0zNS4zIDI4LjctNjQgNjQtNjRsMjA4IDAgMC0yNzJjMC0zNS4zLTI4LjctNjQtNjQtNjRMMTI4IDB6bTMyIDExMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyek0zMDQgOTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNnpNMTYwIDI0MGMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyem0xNDQtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNnpNNTIwIDM4MGMtMjQuMyAwLTQ0IDE5LjctNDQgNDRsMCA4MGMwIDI0LjMgMTkuNyA0NCA0NCA0NGwxNiAwYzI0LjMgMCA0NC0xOS43IDQ0LTQ0bDAtODBjMC0yNC4zLTE5LjctNDQtNDQtNDRsLTE2IDB6bS00IDQ0YzAtMi4yIDEuOC00IDQtNGwxNiAwYzIuMiAwIDQgMS44IDQgNGwwIDgwYzAgMi4yLTEuOCA0LTQgNGwtMTYgMGMtMi4yIDAtNC0xLjgtNC00bDAtODB6bS0xNjggMGwwIDgwYzAgMjQuMyAxOS43IDQ0IDQ0IDQ0bDE2IDBjMjQuMyAwIDQ0LTE5LjcgNDQtNDRsMC0yNGMwLTExLTktMjAtMjAtMjBsLTggMGMtMTEgMC0yMCA5LTIwIDIwIDAgNi41IDMuMSAxMi40IDggMTZsMCA4YzAgMi4yLTEuOCA0LTQgNGwtMTYgMGMtMi4yIDAtNC0xLjgtNC00bDAtODBjMC0yLjIgMS44LTQgNC00bDIwLjQgMGMxLjkgOS4xIDkuOSAxNiAxOS42IDE2IDExIDAgMjAtOSAyMC0yMCAwLTE5LjktMTYuMS0zNi0zNi0zNmwtMjQgMGMtMjQuMyAwLTQ0IDE5LjctNDQgNDR6bS05MC4xLTMyLjljLTQuMS04LjMtMTMuNS0xMi43LTIyLjUtMTAuNVMyMjAgMzkwLjcgMjIwIDQwMGwwIDEyOGMwIDExIDkgMjAgMjAgMjBzMjAtOSAyMC0yMGwwLTQzLjMgMjYuMSA1Mi4yYzQuMSA4LjMgMTMuNSAxMi43IDIyLjUgMTAuNVMzMjQgNTM3LjMgMzI0IDUyOGwwLTEyOGMwLTExLTktMjAtMjAtMjBzLTIwIDktMjAgMjBsMCA0My4zLTI2LjEtNTIuMnoiXQogICAgfTsKICAgIGZhSWdsb28gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaWdsb28iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjdhZSIsICJNMzIwIDMzLjhsMCAxMjYuMi0yNzEuNSAwYzUxLjctNzcuMiAxMzkuNi0xMjggMjM5LjUtMTI4IDEwLjggMCAyMS41IC42IDMyIDEuOHpNMzY4IDE2MGwwLTExNi43YzY2IDE5IDEyMi4yIDYxIDE1OS41IDExNi43TDM2OCAxNjB6TTIyLjYgMjA4bDczLjQgMCAwIDExMi05NiAwYzAtMzkuNyA4LTc3LjYgMjIuNi0xMTJ6TTE3NiAzMjBsLTMyIDAgMC0xMTIgMjg4IDAgMCAxMTItMzIgMCAwIDQ4IDE3NiAwIDAgNjRjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNDgwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTY0IDE3NiAwIDAtNDh6bTMwNCAwbDAtMTEyIDczLjQgMEM1NjggMjQyLjQgNTc2IDI4MC4zIDU3NiAzMjBsLTk2IDB6TTI4OCAyODhjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgODAgMTI4IDAgMC04MGMwLTM1LjMtMjguNy02NC02NC02NHoiXQogICAgfTsKICAgIGZhQ2lyY2xlRG9sbGFyVG9TbG90ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1kb2xsYXItdG8tc2xvdCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJkb25hdGUiXSwgImY0YjkiLCAiTTk2IDIyNGExOTIgMTkyIDAgMSAxIDM4NCAwIDE5MiAxOTIgMCAxIDEgLTM4NCAwem0xNzYtOTJsMCA0Yy0yOC44IC4zLTUyIDIzLjctNTIgNTIuNSAwIDI1LjcgMTguNSA0Ny42IDQzLjkgNTEuOGw0MS43IDdjNiAxIDEwLjQgNi4yIDEwLjQgMTIuMyAwIDYuOS01LjYgMTIuNS0xMi41IDEyLjVMMjQ4IDI3MmMtMTEgMC0yMCA5LTIwIDIwczkgMjAgMjAgMjBsMjQgMCAwIDRjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC00LjdjMjUtNC4xIDQ0LTI1LjcgNDQtNTEuOCAwLTI1LjctMTguNS00Ny42LTQzLjktNTEuOGwtNDEuNy03Yy02LTEtMTAuNC02LjItMTAuNC0xMi4zIDAtNi45IDUuNi0xMi41IDEyLjUtMTIuNWw0Ny41IDBjMTEgMCAyMC05IDIwLTIwcy05LTIwLTIwLTIwbC04IDAgMC00YzAtMTEtOS0yMC0yMC0yMHMtMjAgOS0yMCAyMHpNNDggMzQ0bDAgMTA0YzAgOC44IDcuMiAxNiAxNiAxNmw0NDggMGM4LjggMCAxNi03LjIgMTYtMTZsMC0xMDRjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDEwNGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMzQ0YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjR6Il0KICAgIH07CiAgICBmYURvbmF0ZSA9IGZhQ2lyY2xlRG9sbGFyVG9TbG90OwogICAgZmFZID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInkiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjFdLCAiNTkiLCAiTTU4IDQ1LjRDNDcuOCAzMSAyNy44IDI3LjcgMTMuNCAzOFMtNC4zIDY4LjIgNiA4Mi42TDE2MCAyOTguMyAxNjAgNDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xNDkuNyAxNTQtMjE1LjdjMTAuMy0xNC40IDYuOS0zNC40LTcuNC00NC42UzMzNi4yIDMxIDMyNiA0NS40TDE5MiAyMzIuOSA1OCA0NS40eiJdCiAgICB9OwogICAgZmFGYWNlU21pbGVXaW5rMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLXNtaWxlLXdpbmsiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MjEsICJzbWlsZS13aW5rIl0sICJmNGRhIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMTY1LjQgMzIxLjljMjAuNCAyOCA1My40IDQ2LjEgOTAuNiA0Ni4xczcwLjItMTguMSA5MC42LTQ2LjFjNy44LTEwLjcgMjIuOC0xMy4xIDMzLjUtNS4zczEzLjEgMjIuOCA1LjMgMzMuNUMzNTYuMyAzOTAgMzA5LjIgNDE2IDI1NiA0MTZzLTEwMC4zLTI2LTEyOS40LTY1LjljLTcuOC0xMC43LTUuNC0yNS43IDUuMy0zMy41czI1LjctNS40IDMzLjUgNS4zek0xNDQgMjA4YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTE2NCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGMwLTMzLjEgMjYuOS02MCA2MC02MGwxNiAwYzMzLjEgMCA2MCAyNi45IDYwIDYwIDAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMC05LTIwLTIwLTIwbC0xNiAwYy0xMSAwLTIwIDktMjAgMjB6Il0KICAgIH07CiAgICBmYVNtaWxlV2luazIgPSBmYUZhY2VTbWlsZVdpbmsyOwogICAgZmFEaWNlRm91ciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkaWNlLWZvdXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs5ODU5XSwgImY1MjQiLCAiTTAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMzIwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2em0xNjAgNjRhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHpNMTI4IDM4NGEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6TTM1MiAxNjBhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHpNMzIwIDM4NGEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6Il0KICAgIH07CiAgICBmYUZhY2VHcmluU3F1aW50VGVhcnMyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi1zcXVpbnQtdGVhcnMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjkzMTUsICJncmluLXNxdWludC10ZWFycyJdLCAiZjU4NiIsICJNNTYwIDM1LjRjMCAyNS42LTE4LjggNDcuMy00NC4xIDUwLjlMNDY5LjEgOTNjLTEwLjYgMS41LTE5LjYtNy41LTE4LjEtMTguMWw2LjctNDYuN0M0NjEuMyAyLjggNDgzLTE2IDUwOC42LTE2IDUzNy0xNiA1NjAgNyA1NjAgMzUuNHpNNDAzLjUgNjguMWMtNiA0Mi4yIDMwLjIgNzguNCA3Mi40IDcyLjRsMzcuOC01LjRDNTY1LjcgMjMyIDU1MC44IDM1NS4zIDQ2OSA0MzdzLTIwNSA5Ni42LTMwMS45IDQ0LjdsNS40LTM3LjhjNi00Mi4yLTMwLjItNzguNC03Mi40LTcyLjRsLTM3LjggNS40QzEwLjMgMjgwIDI1LjIgMTU2LjcgMTA3IDc1UzMxMi0yMS43IDQwOC45IDMwLjNsLTUuNCAzNy44ek00MTcuOCAyMDFjLTE5LjEgMzYuNC00NS42IDcyLjctNzguOSAxMDZzLTY5LjYgNTkuOC0xMDYgNzguOWMtMTEuMSA1LjgtMTIuNCAyMS40LTEuMSAyNi42IDU5LjIgMjcuNSAxMzEuOCAxNi44IDE4MC42LTMyczU5LjUtMTIxLjQgMzItMTgwLjZjLTUuMy0xMS4zLTIwLjgtMTAtMjYuNiAxLjF6TTExMy45IDI3MC42YzEuNyA4IDkgMTMuNCAxNy4xIDEyLjdsNDMuMS0zLjktMy45IDQzLjFjLS43IDguMSA0LjcgMTUuNSAxMi43IDE3LjFzMTUuOS0yLjkgMTguNC0xMC42bDI4LTg0LjZjMS45LTUuNyAuNC0xMi4xLTMuOS0xNi4zcy0xMC42LTUuOC0xNi4zLTMuOWwtODQuNiAyOGMtNy43IDIuNi0xMi4zIDEwLjUtMTAuNiAxOC41ek0zMTUuMiA5OS4xYy43LTguMS00LjctMTUuNS0xMi43LTE3LjFzLTE1LjkgMi45LTE4LjUgMTAuNmwtMjggODQuNmMtMS45IDUuNy0uNCAxMi4xIDMuOSAxNi4zczEwLjYgNS44IDE2LjMgMy45bDg0LjYtMjhjNy43LTIuNiAxMi4zLTEwLjUgMTAuNi0xOC40cy05LTEzLjQtMTcuMS0xMi43bC00My4xIDMuOSAzLjktNDMuMXpNNjAuMSA0MjUuN2w0Ni43LTYuN2MxMC42LTEuNSAxOS42IDcuNSAxOC4xIDE4LjFsLTYuNyA0Ni43QzExNC43IDUwOS4yIDkzIDUyOCA2Ny40IDUyOCAzOSA1MjggMTYgNTA1IDE2IDQ3Ni42IDE2IDQ1MSAzNC44IDQyOS4zIDYwLjEgNDI1Ljd6Il0KICAgIH07CiAgICBmYUdyaW5TcXVpbnRUZWFyczIgPSBmYUZhY2VHcmluU3F1aW50VGVhcnMyOwogICAgZmFGaWxlQXVkaW8yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbGUtYXVkaW8iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjFjNyIsICJNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMMjEzLjUgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN0wzNjUuMyAxMjUuM2MxMiAxMiAxOC43IDI4LjMgMTguNyA0NS4zTDM4NCA0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDY0em0yMDgtNS41bDAgOTMuNWMwIDEzLjMgMTAuNyAyNCAyNCAyNEwzMjUuNSAxNzYgMjA4IDU4LjV6bTUzLjggMTg1LjJjLTkuMS02LjMtMjEuNS00LjEtMjcuOCA1cy00LjEgMjEuNSA1IDI3LjhjMjMuOSAxNi43IDM5LjQgNDQuMyAzOS40IDc1LjVzLTE1LjYgNTguOS0zOS40IDc1LjVjLTkuMSA2LjMtMTEuMyAxOC44LTUgMjcuOHMxOC44IDExLjMgMjcuOCA1YzM0LjEtMjMuOCA1Ni42LTYzLjUgNTYuNi0xMDguM1MyOTYgMjY3LjUgMjYxLjggMjQzLjd6TTgwIDMxMmMtOC44IDAtMTYgNy4yLTE2IDE2bDAgNDhjMCA4LjggNy4yIDE2IDE2IDE2bDI0IDAgMjcuMiAzNGMzIDMuOCA3LjYgNiAxMi41IDZsLjMgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0xMjhjMC04LjgtNy4yLTE2LTE2LTE2bC0uMyAwYy00LjkgMC05LjUgMi4yLTEyLjUgNmwtMjcuMiAzNC0yNCAwem0xMjggNzIuMmMwIDEwLjcgMTAuNSAxOC4yIDE4LjkgMTEuNiAxMi45LTEwLjMgMjEuMS0yNi4xIDIxLjEtNDMuOHMtOC4yLTMzLjUtMjEuMS00My44Yy04LjQtNi43LTE4LjkgLjktMTguOSAxMS42bDAgNjQuNXoiXQogICAgfTsKICAgIGZhQXJyb3dzRG93blRvTGluZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvd3MtZG93bi10by1saW5lIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU0YjgiLCAiTTIxNC42IDMxMC42bC02NCA2NGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBsLTY0LTY0Yy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM3MzMi44LTEyLjUgNDUuMyAwTDk2IDI3NC43IDk2IDMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAyNDIuNyA5LjQtOS40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwczEyLjUgMzIuOCAwIDQ1LjN6bTI1NiAwbC02NCA2NGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBsLTY0LTY0Yy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM3MzMi44LTEyLjUgNDUuMyAwbDkuNCA5LjQgMC0yNDIuN2MwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMjQyLjcgOS40LTkuNGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zek0zMiA1MTJjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsNDQ4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgNTEyeiJdCiAgICB9OwogICAgZmFHID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImciLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMDNdLCAiNDciLCAiTTIyNCA5NkMxMzUuNiA5NiA2NCAxNjcuNiA2NCAyNTZzNzEuNiAxNjAgMTYwIDE2MGM3Ny40IDAgMTQyLTU1IDE1Ni44LTEyOEwyNTYgMjg4Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDE0NCAwYzI1LjggMCA0OS42IDIxLjQgNDcuMiA1MC42LTkuNSAxMTUtMTA1LjggMjA1LjQtMjIzLjIgMjA1LjQtMTIzLjcgMC0yMjQtMTAwLjMtMjI0LTIyNFMxMDAuMyAzMiAyMjQgMzJjNTcuNCAwIDEwOS43IDIxLjYgMTQ5LjMgNTcgMTMuMiAxMS44IDE0LjMgMzIgMi41IDQ1LjJzLTMyIDE0LjMtNDUuMiAyLjVDMzAyLjMgMTExLjQgMjY1IDk2IDIyNCA5NnoiXQogICAgfTsKICAgIGZhVmloYXJhID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZpaGFyYSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNmE3IiwgIk0yNzMuNi0zLjJjOC41LTYuNCAyMC4zLTYuNCAyOC44IDBMNDQzLjIgMTAyLjRjOC4zIDYuMiAxOC40IDkuNiAyOC44IDkuNiAxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMjQgMCAwIDQ4IDU4LjcgNjQgMTMuMyAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC04IDAgMCA0OCAyNC40IDMyIDE1LjYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNDAgMCAwIDMyYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMzItMTI4IDAgMCAzMmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTMyLTEyOCAwIDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0zMi00MCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDIyLjEgMCAxNy45LTMyIDAtNDgtOCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDEzLjMgMCA1OC43LTY0IDAtNDgtMjQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGMxMC40IDAgMjAuNS0zLjQgMjguOC05LjZMMjczLjYtMy4yek0xMjggMzY4bDMyMCAwIDAtNDgtMzIwIDAgMCA0OHpNMzg0IDE2MGwtMTkyIDAgMCA0OCAxOTIgMCAwLTQ4eiJdCiAgICB9OwogICAgZmFGbGFnQ2hlY2tlcmVkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZsYWctY2hlY2tlcmVkIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI3OTM3XSwgImYxMWUiLCAiTTMyIDBDNDkuNyAwIDY0IDE0LjMgNjQgMzJsMCAxNiA2OS0xNy4yYzM4LjEtOS41IDc4LjMtNS4xIDExMy41IDEyLjUgNDYuMyAyMy4yIDEwMC44IDIzLjIgMTQ3LjEgMGw5LjYtNC44QzQyMy44IDI4LjEgNDQ4IDQzLjEgNDQ4IDY2LjFsMCAyNzkuN2MwIDEzLjMtOC4zIDI1LjMtMjAuOCAzMGwtMzQuNyAxM2MtNDYuMiAxNy4zLTk3LjYgMTQuNi0xNDEuNy03LjQtMzcuOS0xOS04MS40LTIzLjctMTIyLjUtMTMuNEw2NCAzODQgNjQgNDgwYzAgMTcuNy0xNC4zIDMyLTMyIDMyUzAgNDk3LjcgMCA0ODBMMCAzMkMwIDE0LjMgMTQuMyAwIDMyIDB6TTY0IDE4Ny4xbDY0LTEzLjkgMCA2NS41LTY0IDEzLjkgMCA2NS41IDQ4LjgtMTIuMmM1LjEtMS4zIDEwLjEtMi40IDE1LjItMy4zbDAtNjMuOSAzOC45LTguNGM4LjMtMS44IDE2LjctMi41IDI1LjEtMi4xbDAtNjRjMTMuNiAuNCAyNy4yIDIuNiA0MC40IDYuNGwyMy42IDYuOSAwIDY2LjctNDEuNy0xMi4zYy03LjMtMi4xLTE0LjgtMy40LTIyLjMtMy44bDAgNzEuNGMyMS44IDEuOSA0My4zIDYuNyA2NCAxNC40bDAtNjkuOCAyMi43IDYuN2MxMy41IDQgMjcuMyA2LjQgNDEuMyA3LjRsMC02NC4yYy03LjgtLjgtMTUuNi0yLjMtMjMuMi00LjVsLTQwLjgtMTIgMC02MmMtMTMtMy44LTI1LjgtOC44LTM4LjItMTUtOC4yLTQuMS0xNi45LTctMjUuOC04LjhsMCA3Mi40Yy0xMy0uNC0yNiAuOC0zOC43IDMuNmwtMjUuMyA1LjUgMC03NS4yLTY0IDE2IDAgNzMuMXpNMzIwIDMzNS43YzE2LjggMS41IDMzLjktLjcgNTAtNi44bDE0LTUuMiAwLTcxLjctNy45IDEuOGMtMTguNCA0LjMtMzcuMyA1LjctNTYuMSA0LjVsMCA3Ny40em02NC0xNDkuNGwwLTcwLjhjLTIwLjkgNi4xLTQyLjQgOS4xLTY0IDkuMWwwIDY5LjRjMTMuOSAxLjQgMjggLjUgNDEuNy0yLjZsMjIuMy01LjJ6Il0KICAgIH07CiAgICBmYUdhdWdlU2ltcGxlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImdhdWdlLXNpbXBsZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJnYXVnZS1zaW1wbGUtbWVkIiwgInRhY2hvbWV0ZXItYXZlcmFnZSJdLCAiZjYyOSIsICJNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMzIwIDk2YzAtMjYuOS0xNi41LTQ5LjktNDAtNTkuM0wyODAgMTIwYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTcyLjdjLTIzLjUgOS41LTQwIDMyLjUtNDAgNTkuMyAwIDM1LjMgMjguNyA2NCA2NCA2NHM2NC0yOC43IDY0LTY0eiJdCiAgICB9OwogICAgZmFHYXVnZVNpbXBsZU1lZCA9IGZhR2F1Z2VTaW1wbGU7CiAgICBmYVRhY2hvbWV0ZXJBdmVyYWdlID0gZmFHYXVnZVNpbXBsZTsKICAgIGZhUmlnaHRMZWZ0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJpZ2h0LWxlZnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiZXhjaGFuZ2UtYWx0Il0sICJmMzYyIiwgIk01MDIuNiAxNTAuNmwtOTYgOTZjLTkuMiA5LjItMjIuOSAxMS45LTM0LjkgNi45UzM1MiAyMzYuOSAzNTIgMjI0bDAtNjQtMzIwIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyUzE0LjMgOTYgMzIgOTZsMzIwIDAgMC02NGMwLTEyLjkgNy44LTI0LjYgMTkuOC0yOS42czI1LjctMi4yIDM0LjkgNi45bDk2IDk2YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zem0tMzk3LjMgMzUybC05Ni05NmMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNsOTYtOTZjOS4yLTkuMiAyMi45LTExLjkgMzQuOS02LjlTMTYwIDI3NS4xIDE2MCAyODhsMCA2NCAzMjAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIwIDAgMCA2NGMwIDEyLjktNy44IDI0LjYtMTkuOCAyOS42cy0yNS43IDIuMi0zNC45LTYuOXoiXQogICAgfTsKICAgIGZhRXhjaGFuZ2VBbHQgPSBmYVJpZ2h0TGVmdDsKICAgIGZhUGlsbHMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGlsbHMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjQ4NCIsICJNNjQgMTEyYzAtMjYuNSAyMS41LTQ4IDQ4LTQ4czQ4IDIxLjUgNDggNDhsMCAxMTItOTYgMCAwLTExMnpNMTc2IDM2OGMwLTQ4LjcgMTguMS05My4yIDQ4LTEyN2wwLTEyOUMyMjQgNTAuMSAxNzMuOSAwIDExMiAwUzAgNTAuMSAwIDExMkwwIDQwMGMwIDYxLjkgNTAuMSAxMTIgMTEyIDExMiAzNy4zIDAgNzAuMy0xOC4yIDkwLjctNDYuMy0xNy0yOC42LTI2LjctNjItMjYuNy05Ny43em02NC43IDY3LjRjNC42IDguNyAxNi4zIDkuNyAyMy4zIDIuN0w0MzguMSAyNjRjNy03IDYtMTguNy0yLjctMjMuMy0yMC4xLTEwLjctNDMtMTYuNy02Ny40LTE2LjctNzkuNSAwLTE0NCA2NC41LTE0NCAxNDQgMCAyNC4zIDYgNDcuMyAxNi43IDY3LjR6TTI5Ny45IDQ3MmMtNyA3LTYgMTguNyAyLjcgMjMuMyAyMC4xIDEwLjcgNDMgMTYuNyA2Ny40IDE2LjcgNzkuNSAwIDE0NC02NC41IDE0NC0xNDQgMC0yNC4zLTYtNDcuMy0xNi43LTY3LjQtNC42LTguNy0xNi4zLTkuNy0yMy4zLTIuN0wyOTcuOSA0NzJ6Il0KICAgIH07CiAgICBmYUV4cGxvc2lvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJleHBsb3Npb24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTRlOSIsICJNMjU2LTMyYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgNDhjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC00OGMwLTEzLjMgMTAuNy0yNCAyNC0yNHptMCAxNjBjMTIuNCAwIDIyLjcgOS40IDIzLjkgMjEuN0wyOTMuNCAyOTEuNiA0NjcuNiAxMS4zYzYuNy0xMC43IDIwLjUtMTQuNSAzMS43LTguNXMxNS44IDE5LjUgMTAuNiAzMUwzNzIuOCAzMzguNmMyLjIgMi4zIDQuMyA0LjcgNi4zIDcuMWw5Ny4yLTU0LjdjMTAuNS01LjkgMjMuNi0zLjEgMzAuOSA2LjRzNi4zIDIzLTIuMiAzMS41bC04NyA4Ny03MS40IDBjLTEzLjItMzcuMy00OC43LTY0LTkwLjUtNjRzLTc3LjQgMjYuNy05MC41IDY0bC03OS42IDAtNzUuNS01Mi4zQy42IDM1Ny0yLjggMzQ0LjEgMi40IDMzMy41czE3LjQtMTUuOSAyOC43LTEyLjRsOTcuMiAzMC40YzMtMy45IDYuMS03LjYgOS40LTExLjNMNzUuNCAyMzYuM2MtNi4xLTEwLjEtMy45LTIzLjEgNS4xLTMwLjdzMjIuMi03LjUgMzEuMSAuMUwyMTQgMjkzLjZjMS41LS40IDMtLjggNC41LTEuMWwxMy42LTE0Mi43YzEuMi0xMi4zIDExLjUtMjEuNyAyMy45LTIxLjd6TTMyIDQ2NGw0NTYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNEwyNCA1MTJjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsOCAweiJdCiAgICB9OwogICAgZmFBcnJvd3NEb3duVG9QZW9wbGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3dzLWRvd24tdG8tcGVvcGxlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU0YjkiLCAiTTExMyAxNTNjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwTDE1IDg5QzUuNyA3OS42IDUuNyA2NC40IDE1IDU1UzM5LjYgNDUuNyA0OSA1NUw3MiA3OC4xIDcyLThjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDg2LjEgMjMtMjNjOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45bC02NCA2NHptMzIwIDBjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwTDMzNSA4OWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDIzIDIzIDAtODYuMWMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgODYuMSAyMy0yM2M5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjlsLTY0IDY0ek0yNTYgMTkyYTU2IDU2IDAgMSAxIDAgMTEyIDU2IDU2IDAgMSAxIDAtMTEyem0wIDE2MGM1MyAwIDk2IDQzIDk2IDk2bDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJsLTEyOCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTMyYzAtNTMgNDMtOTYgOTYtOTZ6TTMyIDI4OGE0OCA0OCAwIDEgMSA5NiAwIDQ4IDQ4IDAgMSAxIC05NiAwem0zNTIgMGE0OCA0OCAwIDEgMSA5NiAwIDQ4IDQ4IDAgMSAxIC05NiAwek04MCAzNjhjMTUuMyAwIDI5LjYgNC4zIDQxLjggMTEuOC02LjMgMTYuMi05LjggMzMuOC05LjggNTIuMmwwIDQ4YzAgMTEuNCAyLjQgMjIuMiA2LjcgMzJsLTg3LjggMEMxMy44IDUxMiAwIDQ5OC4yIDAgNDgxLjFMMCA0NDhjMC00NC4yIDM1LjgtODAgODAtODB6TTM5My4zIDUxMmM0LjMtOS44IDYuNy0yMC42IDYuNy0zMmwwLTQ4YzAtMTguNC0zLjUtMzYtOS44LTUyLjIgMTIuMi03LjUgMjYuNS0xMS44IDQxLjgtMTEuOCA0NC4yIDAgODAgMzUuOCA4MCA4MGwwIDMzLjFjMCAxNy0xMy44IDMwLjktMzAuOSAzMC45bC04Ny44IDB6Il0KICAgIH07CiAgICBmYVVzZXJzVmlld2ZpbmRlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1c2Vycy12aWV3ZmluZGVyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1OTUiLCAiTTY0IDBDMjguNyAwIDAgMjguNyAwIDY0bDAgNzJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTcyYzAtOC44IDcuMi0xNiAxNi0xNmw3MiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0UzE0OS4zIDAgMTM2IDBMNjQgMHpNNDQwIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCA3MmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNzJjMC0zNS4zLTI4LjctNjQtNjQtNjRMNDQwIDB6TTQ4IDM3NmMwLTEzLjMtMTAuNy0yNC0yNC0yNFMwIDM2Mi43IDAgMzc2bDAgNzJjMCAzNS4zIDI4LjcgNjQgNjQgNjRsNzIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtNzJ6bTUyOCAwYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgNzJjMCA4LjgtNy4yIDE2LTE2IDE2bC03MiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDcyIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC03MnpNMjg4IDIxNmE1NiA1NiAwIDEgMCAwLTExMiA1NiA1NiAwIDEgMCAwIDExMnptMCA0MGMtNTMgMC05NiA0My05NiA5NmwwIDI0YzAgMTMuMyAxMC43IDI0IDI0IDI0bDE0NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtMjRjMC01My00My05Ni05Ni05NnptMTkyLTY0YTQ4IDQ4IDAgMSAwIC05NiAwIDQ4IDQ4IDAgMSAwIDk2IDB6TTE2OCAyNzIuM2MtNDkuMyA0LjEtODggNDUuMy04OCA5NS43bDAgMTAuN2MwIDExLjggOS42IDIxLjMgMjEuMyAyMS4zbDQ2LjggMGMtMi43LTcuNS00LjEtMTUuNi00LjEtMjRsMC0yNGMwLTI5LjUgOC44LTU2LjkgMjQtNzkuN3pNNDI3LjkgNDAwbDQ2LjggMGMxMS44IDAgMjEuMy05LjYgMjEuMy0yMS4zbDAtMTAuN2MwLTUwLjMtMzguNy05MS42LTg4LTk1LjcgMTUuMiAyMi44IDI0IDUwLjIgMjQgNzkuN2wwIDI0YzAgOC40LTEuNCAxNi41LTQuMSAyNHpNMTkyIDE5MmE0OCA0OCAwIDEgMCAtOTYgMCA0OCA0OCAwIDEgMCA5NiAweiJdCiAgICB9OwogICAgZmFDYXJPbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYXItb24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTRkZCIsICJNMjQ4LThjMC0xMy4zLTEwLjctMjQtMjQtMjRTMjAwLTIxLjMgMjAwLThsMCA2NGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNjR6TTE0NS4zIDIwOGwxNTcuNSAwYzYuNyAwIDEyLjYgNC4xIDE1IDEwLjRsMjYuMSA2OS42LTIzOS42IDAgMjYuMS02OS42YzIuMy02LjIgOC4zLTEwLjQgMTUtMTAuNHpNMzQgMjkyLjhsLTEuMyAzLjRDMTMuMiAzMDcuMSAwIDMyOCAwIDM1MkwwIDQ4MGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxNiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMzIgMjg4IDAgMCAzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxNiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMTI4YzAtMjQtMTMuMi00NC45LTMyLjgtNTUuOWwtMS4zLTMuNC0zNi4zLTk2LjljLTExLjctMzEuMi00MS42LTUxLjktNzQuOS01MS45bC0xNTcuNSAwYy0zMy4zIDAtNjMuMiAyMC43LTc0LjkgNTEuOUwzNCAyOTIuOHpNOTYgMzM2YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHptMjI0IDMyYTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6TTcgN0MtMi4zIDE2LjQtMi4zIDMxLjYgNyA0MUw1NSA4OWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMFM5OC4zIDY0LjQgODkgNTVMNDEgN0MzMS42LTIuMyAxNi40LTIuMyA3IDd6TTQwNyA3TDM1OSA1NWMtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDQ4LTQ4YzkuNC05LjQgOS40LTI0LjYgMC0zMy45UzQxNi40LTIuMyA0MDcgN3oiXQogICAgfTsKICAgIGZhU2xlaWdoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNsZWlnaCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmN2NjIiwgIk02NCAzMkM0Ni4zIDMyIDMyIDQ2LjMgMzIgNjRTNDYuMyA5NiA2NCA5NmwwIDE2MGMwIDQxLjggMjYuNyA3Ny40IDY0IDkwLjVsMCA2OS41LTcyIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNTA0IDBjNDQuMiAwIDgwLTM1LjggODAtODBsMC04YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgOGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtODAgMCAwLTY0YzUzIDAgOTYtNDMgOTYtOTZsMC05NmMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMzIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAzMmMwIDM1LjMtMjguNyA2NC02NCA2NGwtNDguOSAwYy00OC41IDAtOTIuOC0yNy40LTExNC41LTcwLjhsLTI1LjItNTAuNUMyMzcuNyA1OS40IDE5My40IDMyIDE0NC45IDMyTDY0IDMyek00MzIgNDE2bC0yNTYgMCAwLTY0IDI1NiAwIDAgNjR6Il0KICAgIH07CiAgICBmYUR1bWJiZWxsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImR1bWJiZWxsIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY0NGIiLCAiTTk2IDExMmMwLTI2LjUgMjEuNS00OCA0OC00OHM0OCAyMS41IDQ4IDQ4bDAgMTEyIDI1NiAwIDAtMTEyYzAtMjYuNSAyMS41LTQ4IDQ4LTQ4czQ4IDIxLjUgNDggNDhsMCAxNiAxNiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgNDhjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsMCA0OGMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTYgMCAwIDE2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4cy00OC0yMS41LTQ4LTQ4bDAtMTEyLTI1NiAwIDAgMTEyYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4cy00OC0yMS41LTQ4LTQ4bDAtMTYtMTYgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC00OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwwLTQ4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDE2IDAgMC0xNnoiXQogICAgfTsKICAgIGZhQmFieUNhcnJpYWdlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhYnktY2FycmlhZ2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiY2FycmlhZ2UtYmFieSJdLCAiZjc3ZCIsICJNNjQgMjA4bDAgODBjMCA1MyA0MyA5NiA5NiA5NmwxOTIgMGM1MyAwIDk2LTQzIDk2LTk2bDAtMTEyIDQwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTY0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgNTYtMzM2IDB6bS4yLTQ4bDIyMy44IDAgMC0xMjhjMC0xNy43LTE0LjMtMzItMzItMzJMMjMyIDBDMTQxLjkgMCA2OC40IDcwLjkgNjQuMiAxNjB6TTE2MCA0NjRhNDggNDggMCAxIDAgLTk2IDAgNDggNDggMCAxIDAgOTYgMHptMjg4IDBhNDggNDggMCAxIDAgLTk2IDAgNDggNDggMCAxIDAgOTYgMHoiXQogICAgfTsKICAgIGZhQ2FycmlhZ2VCYWJ5ID0gZmFCYWJ5Q2FycmlhZ2U7CiAgICBmYUtpd2lCaXJkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImtpd2ktYmlyZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNTM1IiwgIk0yOTEuMiAzODguNGMzMS4yLTE4LjggNjQuNy0zNi40IDEwMS4xLTM2LjRsNTUuNyAwYzQuNiAwIDkuMS0uMiAxMy42LS43bDg1LjMgMTIxLjljNCA1LjcgMTEuMyA4LjIgMTcuOSA2LjFTNTc2IDQ3MSA1NzYgNDY0bDAtMjQwYzAtNzAuNy01Ny4zLTEyOC0xMjgtMTI4bC01NS43IDBDMzU1LjkgOTYgMzIyLjQgNzguNCAyOTEuMiA1OS42IDI2Mi4zIDQyLjEgMjI4LjMgMzIgMTkyIDMyIDg2IDMyIDAgMTE4IDAgMjI0IDAgMjk1LjEgMzguNiAzNTcuMSA5NiAzOTAuM0w5NiA0NTZjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTQ2YzE1LjMgMy45IDMxLjQgNiA0OCA2IDUuNCAwIDEwLjctLjIgMTYtLjdsMCA0MC43YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC01MC45YzEyLjQtNC40IDI0LjItMTAgMzUuMi0xNi43ek00NDggMjAwYTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHoiXQogICAgfTsKICAgIGZhQ2FsZW5kYXJYbWFyazIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FsZW5kYXIteG1hcmsiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiY2FsZW5kYXItdGltZXMiXSwgImYyNzMiLCAiTTEyOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzIgMTI4IDAgMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMzIgMzIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI4OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDMyIDAgMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNMjkxLjkgMjIwLjFjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwbC0zMy45IDMzLjktMzMuOS0zMy45Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDMzLjkgMzMuOS0zMy45IDMzLjljLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMGwzMy45LTMzLjkgMzMuOSAzMy45YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtMzMuOS0zMy45IDMzLjktMzMuOWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXoiXQogICAgfTsKICAgIGZhQ2FsZW5kYXJUaW1lczIgPSBmYUNhbGVuZGFyWG1hcmsyOwogICAgZmFDaXJjbGVEb3duMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtZG93biIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYxNDY2LCAiYXJyb3ctYWx0LWNpcmNsZS1kb3duIl0sICJmMzU4IiwgIk0yNTYgMGEyNTYgMjU2IDAgMSAwIDAgNTEyIDI1NiAyNTYgMCAxIDAgMC01MTJ6TTI0NC43IDM4Ny4zbC0xMDQtMTA0Yy00LjYtNC42LTUuOS0xMS41LTMuNS0xNy40czguMy05LjkgMTQuOC05LjlsNTYgMCAwLTk2YzAtMTcuNyAxNC4zLTMyIDMyLTMybDMyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA5NiA1NiAwYzYuNSAwIDEyLjMgMy45IDE0LjggOS45czEuMSAxMi45LTMuNSAxNy40bC0xMDQgMTA0Yy02LjIgNi4yLTE2LjQgNi4yLTIyLjYgMHoiXQogICAgfTsKICAgIGZhQXJyb3dBbHRDaXJjbGVEb3duMiA9IGZhQ2lyY2xlRG93bjI7CiAgICBmYUZpbGVNZWRpY2FsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbGUtbWVkaWNhbCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmNDc3IiwgIk0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwyMTMuNSAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDM2NS4zIDEyNS4zYzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNMMzg0IDQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6bTIwOC01LjVsMCA5My41YzAgMTMuMyAxMC43IDI0IDI0IDI0TDMyNS41IDE3NiAyMDggNTguNXpNMTYwIDI4MGwwIDQwLTQwIDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmw0MCAwIDAgNDBjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtNDAgNDAgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTQwIDAgMC00MGMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnoiXQogICAgfTsKICAgIGZhWG1hcmsgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAieG1hcmsiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjg0NzMsIDEwMDA1LCAxMDAwNiwgMTAwNjAsIDIxNSwgImNsb3NlIiwgIm11bHRpcGx5IiwgInJlbW92ZSIsICJ0aW1lcyJdLCAiZjAwZCIsICJNNTUuMSA3My40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM0wxNDcuMiAyNTYgOS45IDM5My40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwTDE5Mi41IDMwMS4zIDMyOS45IDQzOC42YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNMMjM3LjggMjU2IDM3NS4xIDExOC42YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwTDE5Mi41IDIxMC43IDU1LjEgNzMuNHoiXQogICAgfTsKICAgIGZhQ2xvc2UgPSBmYVhtYXJrOwogICAgZmFNdWx0aXBseSA9IGZhWG1hcms7CiAgICBmYVJlbW92ZSA9IGZhWG1hcms7CiAgICBmYVRpbWVzID0gZmFYbWFyazsKICAgIGZhU2hhcGVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNoYXBlcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJ0cmlhbmdsZS1jaXJjbGUtc3F1YXJlIl0sICJmNjFmIiwgIk0yNTYgMGMxMS4yIDAgMjEuNyA1LjkgMjcuNCAxNS41bDk2IDE2MGM1LjkgOS45IDYuMSAyMi4yIC40IDMyLjJTMzYzLjUgMjI0IDM1MiAyMjRsLTE5MiAwYy0xMS41IDAtMjIuMi02LjItMjcuOC0xNi4ycy01LjUtMjIuMyAuNC0zMi4ybDk2LTE2MEMyMzQuMyA1LjkgMjQ0LjggMCAyNTYgMHpNMTI4IDI3MmExMTIgMTEyIDAgMSAxIDAgMjI0IDExMiAxMTIgMCAxIDEgMC0yMjR6bTIwMCAxNmwxMTIgMGMyMi4xIDAgNDAgMTcuOSA0MCA0MGwwIDExMmMwIDIyLjEtMTcuOSA0MC00MCA0MGwtMTEyIDBjLTIyLjEgMC00MC0xNy45LTQwLTQwbDAtMTEyYzAtMjIuMSAxNy45LTQwIDQwLTQweiJdCiAgICB9OwogICAgZmFUcmlhbmdsZUNpcmNsZVNxdWFyZSA9IGZhU2hhcGVzOwogICAgZmFEaWNlT25lID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRpY2Utb25lIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbOTg1Nl0sICJmNTI1IiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyek0yMjQgMjI0YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhTG9ja09wZW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibG9jay1vcGVuIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYzYzEiLCAiTTM4NCA5NmMwLTM1LjMgMjguNy02NCA2NC02NHM2NCAyOC43IDY0IDY0bDAgMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTMyYzAtNzAuNy01Ny4zLTEyOC0xMjgtMTI4UzMyMCAyNS4zIDMyMCA5NmwwIDY0LTE2MCAwYy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDIyNGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTIyNGMwLTM1LjMtMjguNy02NC02NC02NGwtMzIgMCAwLTY0eiJdCiAgICB9OwogICAgZmFQZXBwZXJIb3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVwcGVyLWhvdCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyNzc5OF0sICJmODE2IiwgIk01NDUgNjVjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMEw0NzguOSA2My4yQzQ1Mi4zIDQzLjYgNDE5LjUgMzIgMzg0IDMyIDM0OC45IDMyIDMxNi41IDQzLjMgMjkwLjEgNjIuNCAyNzQuMSA3NC4xIDI4NC4yIDk2IDMwNCA5NmwyNCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgODBjMCAxMy4zIDEwLjcgMjQgMjQgMjRsODAgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDI0YzAgMTkuOCAyMS45IDI5LjkgMzMuNiAxMy45IDE5LjEtMjYuNCAzMC40LTU4LjggMzAuNC05My45IDAtMzUuNS0xMS42LTY4LjMtMzEuMi05NC45TDU0NSA2NXpNMjcwIDEzNS41bC0xNTkuNiAyMjhDMTAxLjMgMzc2LjQgODYuNyAzODQgNzEgMzg0bC03IDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4czIxLjUgNDggNDggNDhsMjcuMSAwYzY1LjcgMCAxMjkuNy0yMC4yIDE4My41LTU3LjhMNDQwLjUgMzA2LjFDNDM1IDI5NS45IDQzMiAyODQuMiA0MzIgMjcybC01NiAwYy0zOS44IDAtNzItMzIuMi03Mi03MmwwLTU2Yy0xMi4yIDAtMjMuOS0zLTM0LTguNXoiXQogICAgfTsKICAgIGZhRHJvcGxldFNsYXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRyb3BsZXQtc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsidGludC1zbGFzaCJdLCAiZjVjNyIsICJNNDEtMjQuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTLTIuMy0uMyA3IDkuMWw1MjggNTI4YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOUw0NjMuNiAzOTcuOGMxMC41LTIzLjggMTYuNC01MC4xIDE2LjQtNzcuOCAwLTkxLjItMTMwLjItMjc0LjEtMTY2LjYtMzIzLjUtNS45LTgtMTUuMi0xMi41LTI1LjItMTIuNWwtLjQgMGMtMTAgMC0xOS4zIDQuNS0yNS4yIDEyLjUtMTUuNiAyMS4yLTQ4LjUgNjYuOS04MC45IDExOS40TDQxLTI0Ljl6bTkyIDIyNy43Yy0yMS42IDQzLjgtMzcgODUuOS0zNyAxMTcuMiAwIDEwNiA4NiAxOTIgMTkyIDE5MiA0My40IDAgODMuNC0xNC40IDExNS41LTM4LjZMMTMzIDIwMi44eiJdCiAgICB9OwogICAgZmFUaW50U2xhc2ggPSBmYURyb3BsZXRTbGFzaDsKICAgIGZhRHJvcGxldCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkcm9wbGV0IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4MTY3LCAidGludCJdLCAiZjA0MyIsICJNMTkyIDUxMkM4NiA1MTIgMCA0MjYgMCAzMjAgMCAyMjguOCAxMzAuMiA0NS45IDE2Ni42LTMuNSAxNzIuNS0xMS41IDE4MS44LTE2IDE5MS44LTE2bC40IDBjMTAgMCAxOS4zIDQuNSAyNS4yIDEyLjUgMzYuNCA0OS40IDE2Ni42IDIzMi4zIDE2Ni42IDMyMy41IDAgMTA2LTg2IDE5Mi0xOTIgMTkyek0xMTIgMzEyYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0YzAgNzUuMSA2MC45IDEzNiAxMzYgMTM2IDEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0Yy00OC42IDAtODgtMzkuNC04OC04OHoiXQogICAgfTsKICAgIGZhVGludCA9IGZhRHJvcGxldDsKICAgIGZhRmlsZUxpbmVzMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLWxpbmVzIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4NDQxLCAxMjg0NjIsIDYxNjg2LCAiZmlsZS1hbHQiLCAiZmlsZS10ZXh0Il0sICJmMTVjIiwgIk0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwyMTMuNSAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDM2NS4zIDEyNS4zYzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNMMzg0IDQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6bTIwOC01LjVsMCA5My41YzAgMTMuMyAxMC43IDI0IDI0IDI0TDMyNS41IDE3NiAyMDggNTguNXpNMTIwIDI1NmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNDQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTQ0IDB6bTAgOTZjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTQ0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE0NCAweiJdCiAgICB9OwogICAgZmFGaWxlQWx0MiA9IGZhRmlsZUxpbmVzMjsKICAgIGZhRmlsZVRleHQyID0gZmFGaWxlTGluZXMyOwogICAgZmFDb21tZW50c0RvbGxhciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjb21tZW50cy1kb2xsYXIiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjY1MyIsICJNMTkyIDMyMGMxMDYgMCAxOTItNzguOCAxOTItMTc2UzI5OC0zMiAxOTItMzIgMCA0Ni44IDAgMTQ0YzAgMzkuNiAxNC4zIDc2LjIgMzguNCAxMDUuNkwyLjggMzE2LjhDLTIuMSAzMjYuMS0uNCAzMzcuNSA3IDM0NXMxOC45IDkuMiAyOC4yIDQuMkwxMTYuOCAzMDZjMjMuMSA5IDQ4LjUgMTQgNzUuMiAxNHptMy4yIDQ4YzE2LjQgODEuOSA5NC43IDE0NCAxODguOCAxNDQgMjYuNyAwIDUyLjEtNSA3NS4yLTE0bDgxLjYgNDMuMmM5LjMgNC45IDIwLjcgMy4yIDI4LjItNC4yczkuMi0xOC45IDQuMi0yOC4ybC0zNS42LTY3LjJjMjQuMS0yOS40IDM4LjQtNjYgMzguNC0xMDUuNiAwLTgyLjQtNjEuNy0xNTEuNS0xNDUtMTcwLjctMTEuNSAxMTUuOC0xMTUuOCAyMDEuMi0yMzUuOCAyMDIuN3pNMTk2IDMyYzExIDAgMjAgOSAyMCAyMGwwIDQgOCAwYzExIDAgMjAgOSAyMCAyMHMtOSAyMC0yMCAyMGwtNDcuNSAwYy02LjkgMC0xMi41IDUuNi0xMi41IDEyLjUgMCA2LjEgNC40IDExLjMgMTAuNCAxMi4zbDQxLjcgN2MyNS4zIDQuMiA0My45IDI2LjEgNDMuOSA1MS44IDAgMjYuMS0xOSA0Ny43LTQ0IDUxLjhsMCA0LjdjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtNC0yNCAwYy0xMSAwLTIwLTktMjAtMjBzOS0yMCAyMC0yMGw1NS41IDBjNi45IDAgMTIuNS01LjYgMTIuNS0xMi41IDAtNi4xLTQuNC0xMS4zLTEwLjQtMTIuM2wtNDEuNy03Yy0yNS4zLTQuMi00My45LTI2LjEtNDMuOS01MS44IDAtMjguOCAyMy4yLTUyLjIgNTItNTIuNWwwLTRjMC0xMSA5LTIwIDIwLTIweiJdCiAgICB9OwogICAgZmFNYWduaWZ5aW5nR2xhc3NMb2NhdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtYWduaWZ5aW5nLWdsYXNzLWxvY2F0aW9uIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNlYXJjaC1sb2NhdGlvbiJdLCAiZjY4OSIsICJNNDE2IDIwOGMwIDQ1LjktMTQuOSA4OC4zLTQwIDEyMi43TDUwMi42IDQ1Ny40YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zcy0zMi44IDEyLjUtNDUuMyAwTDMzMC43IDM3NkMyOTYuMyA0MDEuMSAyNTMuOSA0MTYgMjA4IDQxNiA5My4xIDQxNiAwIDMyMi45IDAgMjA4UzkzLjEgMCAyMDggMCA0MTYgOTMuMSA0MTYgMjA4ek0yODggMTc2YzAtNDQuMi0zNS44LTgwLTgwLTgwcy04MCAzNS44LTgwIDgwYzAgNDguOCA0Ni41IDExMS42IDY4LjYgMTM4LjYgNiA3LjMgMTYuOCA3LjMgMjIuNyAwIDIyLjEtMjcgNjguNi04OS44IDY4LjYtMTM4LjZ6bS0xMTIgMGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAweiJdCiAgICB9OwogICAgZmFTZWFyY2hMb2NhdGlvbiA9IGZhTWFnbmlmeWluZ0dsYXNzTG9jYXRpb247CiAgICBmYUZpbGVJbnZvaWNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbGUtaW52b2ljZSIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmNTcwIiwgIk02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI3Ny41YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI1OC43IDE4LjdDMjQ2LjcgNi43IDIzMC41IDAgMjEzLjUgMEw2NCAwek0zMjUuNSAxNzZMMjMyIDE3NmMtMTMuMyAwLTI0LTEwLjctMjQtMjRMMjA4IDU4LjUgMzI1LjUgMTc2ek02NCAzODRsMC02NGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwxOTIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMyTDk2IDQxNmMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6TTg4IDY0bDQ4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTQ4IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0Uzc0LjcgNjQgODggNjR6bTAgOTZsNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNDggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhUGVudGFnb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVudGFnb24iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTc5MCIsICJNMzE2LjQtMy4xYy0xNi44LTEyLjItMzkuNi0xMi4yLTU2LjQgMEwzNS4zIDE2MC4yYy0xNi44IDEyLjItMjMuOSAzMy45LTE3LjQgNTMuN2w4NS44IDI2NC4xYzYuNCAxOS44IDI0LjkgMzMuMiA0NS43IDMzLjJsMjc3LjcgMGMyMC44IDAgMzkuMi0xMy40IDQ1LjctMzMuMmw4NS44LTI2NC4xYzYuNC0xOS44LS42LTQxLjQtMTcuNC01My43TDMxNi40LTMuMXoiXQogICAgfTsKICAgIGZhUmVwdWJsaWNhbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyZXB1YmxpY2FuIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY3NWUiLCAiTTAgMTkyQzAgMTAzLjYgNzEuNiAzMiAxNjAgMzJsMjI0IDBjODguNCAwIDE2MCA3MS42IDE2MCAxNjBsMCA2NC01NDQgMCAwLTY0em0xNTItMzJhMjQgMjQgMCAxIDAgLTQ4IDAgMjQgMjQgMCAxIDAgNDggMHptMjMyIDI0YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHpNMjgwIDE2MGEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAwek0xMjggMjg4bDQxNiAwIDAgMTEyYzAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZsMC00OGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgNDhjMCA0NC4yLTM1LjggODAtODAgODBzLTgwLTM1LjgtODAtODBsMC00OC0zMiAwIDAgOTZjMCAxNy43LTE0LjMgMzItMzIgMzJsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjQtMTkyIDAgMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtNjQgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0xNjAgMTI4IDB6Il0KICAgIH07CiAgICBmYVNob3AgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2hvcCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJzdG9yZS1hbHQiXSwgImY1NGYiLCAiTTIxLjUgMTgxLjFMNzguMyA2Ny40Qzg5LjIgNDUuNyAxMTEuMyAzMiAxMzUuNiAzMmwzMDQuOSAwYzI0LjIgMCA0Ni40IDEzLjcgNTcuMiAzNS40bDU2LjggMTEzLjdjMy42IDcuMiA1LjUgMTUuMSA1LjUgMjMuMiAwIDI3LjMtMjEuMiA0OS43LTQ4IDUxLjZMNTEyIDQ0OGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTE5Mi05NiAwIDAgMTc2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xOTIgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC0xNzYuMWMtMjYuOC0xLjktNDgtMjQuMy00OC01MS42IDAtOCAxLjktMTYgNS41LTIzLjJ6TTEyOCAyNTZsMCAxMTJjMCA4LjggNy4yIDE2IDE2IDE2bDEyOCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTExMi0xNjAgMHoiXQogICAgfTsKICAgIGZhU3RvcmVBbHQgPSBmYVNob3A7CiAgICBmYUZpbG0gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsbSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyNzkwMiwgNjIzNjgsICJmaWxtLWFsdCIsICJmaWxtLXNpbXBsZSJdLCAiZjAwOCIsICJNMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZ6TTQ4IDM2OGwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2em0zMDQtMTZjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHpNNDggMjQwbDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6bTMwNC0xNmMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwek00OCAxMTJsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZMNjQgOTZjLTguOCAwLTE2IDcuMi0xNiAxNnpNMzUyIDk2Yy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDB6Il0KICAgIH07CiAgICBmYUZpbG1BbHQgPSBmYUZpbG07CiAgICBmYUZpbG1TaW1wbGUgPSBmYUZpbG07CiAgICBmYUJ1aWxkaW5nQ2lyY2xlWG1hcmsgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnVpbGRpbmctY2lyY2xlLXhtYXJrIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU0ZDQiLCAiTTk2IDBDNjAuNyAwIDMyIDI4LjcgMzIgNjRsMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTgwIDBjLTEwLjUtMTQuNi0xOS0zMC43LTI1LjEtNDhsLTc0LjkgMCAwLTgwYzAtMTcuNyAxNC4zLTMyIDMyLTMybDMyIDBjMiAwIDQgLjIgNS45IC41IDYtMjMuNiAxNi4zLTQ1LjQgMzAuMS02NC41bC00IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDRjMjcuNS0xOS44IDYwLjMtMzIuNCA5Ni0zNS40TDQxNiA2NGMwLTM1LjMtMjguNy02NC02NC02NEw5NiAwem0zMiAxMTJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMnpNMjcyIDk2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZ6TTEyOCAyNDBjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMnpNNDMyIDU0NGExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6bTIyLjYtMTQ0bDM2LjcgMzYuN2M2LjIgNi4yIDYuMiAxNi40IDAgMjIuNnMtMTYuNCA2LjItMjIuNiAwbC0zNi43LTM2LjctMzYuNyAzNi43Yy02LjIgNi4yLTE2LjQgNi4yLTIyLjYgMHMtNi4yLTE2LjQgMC0yMi42bDM2LjctMzYuNy0zNi43LTM2LjdjLTYuMi02LjItNi4yLTE2LjQgMC0yMi42czE2LjQtNi4yIDIyLjYgMGwzNi43IDM2LjcgMzYuNy0zNi43YzYuMi02LjIgMTYuNC02LjIgMjIuNiAwczYuMiAxNi40IDAgMjIuNkw0NTQuNiA0MDB6Il0KICAgIH07CiAgICBmYUNvbW1lbnRzMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjb21tZW50cyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyODQ5MCwgNjE2NzBdLCAiZjA4NiIsICJNMzg0IDE0NGMwIDk3LjItODYgMTc2LTE5MiAxNzYtMjYuNyAwLTUyLjEtNS03NS4yLTE0TDM1LjIgMzQ5LjJjLTkuMyA0LjktMjAuNyAzLjItMjguMi00LjJzLTkuMi0xOC45LTQuMi0yOC4ybDM1LjYtNjcuMkMxNC4zIDIyMC4yIDAgMTgzLjYgMCAxNDQgMCA0Ni44IDg2LTMyIDE5Mi0zMlMzODQgNDYuOCAzODQgMTQ0em0wIDM2OGMtOTQuMSAwLTE3Mi40LTYyLjEtMTg4LjgtMTQ0IDEyMC0xLjUgMjI0LjMtODYuOSAyMzUuOC0yMDIuNyA4My4zIDE5LjIgMTQ1IDg4LjMgMTQ1IDE3MC43IDAgMzkuNi0xNC4zIDc2LjItMzguNCAxMDUuNmwzNS42IDY3LjJjNC45IDkuMyAzLjIgMjAuNy00LjIgMjguMnMtMTguOSA5LjItMjguMiA0LjJMNDU5LjIgNDk4Yy0yMy4xIDktNDguNSAxNC03NS4yIDE0eiJdCiAgICB9OwogICAgZmFUYWdzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRhZ3MiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjAyYyIsICJNNDAxLjIgMzkuMUw1NDkuNCAxODkuNGMyNy43IDI4LjEgMjcuNyA3My4xIDAgMTAxLjJMMzkzIDQ0OC45Yy05LjMgOS40LTI0LjUgOS41LTMzLjkgLjJzLTkuNS0yNC41LS4yLTMzLjlMNTE1LjMgMjU2LjhjOS4yLTkuMyA5LjItMjQuNCAwLTMzLjdMMzY3IDcyLjljLTkuMy05LjQtOS4yLTI0LjYgLjItMzMuOXMyNC42LTkuMiAzMy45IC4yek0zMi4xIDIyOS41TDMyLjEgOTZjMC0zNS4zIDI4LjctNjQgNjQtNjRsMTMzLjUgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN2wxNDQgMTQ0YzI1IDI1IDI1IDY1LjUgMCA5MC41TDI4NS40IDQxOC43Yy0yNSAyNS02NS41IDI1LTkwLjUgMGwtMTQ0LTE0NGMtMTItMTItMTguNy0yOC4zLTE4LjctNDUuM3ptMTQ0LTg1LjVhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHoiXQogICAgfTsKICAgIGZhR3VuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImd1biIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlMTliIiwgIk01MjggNTZjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCA4LTQ0OCAwQzE0LjMgNjQgMCA3OC4zIDAgOTZMMCAyMDhjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTAgMGMyMC44IDAgMzYuMSAxOS42IDMxIDM5LjhMMzMgNDQwLjJjLTIuNCA5LjYtLjIgMTkuNyA1LjggMjcuNVM1NC4xIDQ4MCA2NCA0ODBsOTYgMGMxNC43IDAgMjcuNS0xMCAzMS0yNC4yTDIxNyAzNTIgMzIxLjQgMzUyYzIzLjcgMCA0NC44LTE0LjkgNTIuNy0zNy4ybDI2LjctNzQuOCAzMS4xIDBjOC41IDAgMTYuNi0zLjQgMjIuNi05LjRsMjIuNi0yMi42IDY2LjcgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTgwYzAtMTcuNy0xNC4zLTMyLTMyLTMybC0xNiAwIDAtOHpNMzIxLjQgMzA0bC05Mi41IDAgMTYtNjQgMTA1IDAtMjEgNTguN2MtMS4xIDMuMi00LjIgNS4zLTcuNSA1LjN6TTgwIDEyOGwzODQgMGM4LjggMCAxNiA3LjIgMTYgMTZzLTcuMiAxNi0xNiAxNkw4MCAxNjBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZ6Il0KICAgIH07CiAgICBmYUNpcmNsZUNoZWNrMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtY2hlY2siLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MTUzMywgImNoZWNrLWNpcmNsZSJdLCAiZjA1OCIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAxIDAtNTEyIDI1NiAyNTYgMCAxIDEgMCA1MTJ6TTM3NCAxNDUuN2MtMTAuNy03LjgtMjUuNy01LjQtMzMuNSA1LjNMMjIxLjEgMzE1LjIgMTY5IDI2My4xYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDcyIDcyYzUgNSAxMS44IDcuNSAxOC44IDdzMTMuNC00LjEgMTcuNS05LjhMMzc5LjMgMTc5LjJjNy44LTEwLjcgNS40LTI1LjctNS4zLTMzLjV6Il0KICAgIH07CiAgICBmYUNoZWNrQ2lyY2xlMiA9IGZhQ2lyY2xlQ2hlY2syOwogICAgZmFJZENhcmRDbGlwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImlkLWNhcmQtY2xpcCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJpZC1jYXJkLWFsdCJdLCAiZjQ3ZiIsICJNMjU2LTMybDY0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA2NC0xMjggMCAwLTY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyek02NCAzMmwxMTIgMCAwIDMyYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDEyOCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMzIgMTEyIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMyek0xNzYgNDAwYzAgOC44IDcuMiAxNiAxNiAxNmwxOTIgMGM4LjggMCAxNi03LjIgMTYtMTYgMC00NC4yLTM1LjgtODAtODAtODBsLTY0IDBjLTQ0LjIgMC04MCAzNS44LTgwIDgwek0yODggMjgwYTU2IDU2IDAgMSAwIDAtMTEyIDU2IDU2IDAgMSAwIDAgMTEyeiJdCiAgICB9OwogICAgZmFJZENhcmRBbHQgPSBmYUlkQ2FyZENsaXA7CiAgICBmYU1vb24yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vb24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjc3NjksIDkyMTRdLCAiZjE4NiIsICJNMjU2IDBDMTE0LjYgMCAwIDExNC42IDAgMjU2UzExNC42IDUxMiAyNTYgNTEyYzY4LjggMCAxMzEuMy0yNy4yIDE3Ny4zLTcxLjQgNy4zLTcgOS40LTE3LjkgNS4zLTI3LjFzLTEzLjctMTQuOS0yMy44LTE0LjFjLTQuOSAuNC05LjggLjYtMTQuOCAuNi0xMDEuNiAwLTE4NC04Mi40LTE4NC0xODQgMC03Mi4xIDQxLjUtMTM0LjYgMTAyLjEtMTY0LjggOS4xLTQuNSAxNC4zLTE0LjMgMTMuMS0yNC40UzMyMi42IDguNSAzMTIuNyA2LjNDMjk0LjQgMi4yIDI3NS40IDAgMjU2IDB6Il0KICAgIH07CiAgICBmYU9pbFdlbGwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAib2lsLXdlbGwiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUzMiIsICJNNTI4LjMgNjEuM2MtMTEuNC00Mi43LTU1LjMtNjgtOTgtNTYuNkw0MTQuOSA4LjhDMzk3LjggMTMuNCAzODcuNyAzMSAzOTIuMyA0OGwyNC41IDkxLjQtMTA4LjIgMjguMS02LjMtMTguMUMyOTcuNyAxMzYuNiAyODUuNiAxMjggMjcyIDEyOHMtMjUuNyA4LjYtMzAuMiAyMS40bC0xMy42IDM5LTEzMi4yIDM0LjMgMC0zOC42YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMjY0LTE2IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNTEyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTEzNy4zIDAtNjEuNC0xNzUuNC02Mi4yIDE2LjEgMjIuMSA2My4yLTY2LjYgMCAxOS45LTU2LjktNzQuNiAxOS4zLTQ2LjcgMTMzLjUtNDEuMyAwIDAtMTU5LjIgMzM3LjQtODcuNSAyNS4yIDk0YzQuNiAxNy4xIDIyLjEgMjcuMiAzOS4yIDIyLjZsMTUuNS00LjFjNDIuNy0xMS40IDY4LTU1LjMgNTYuNi05OEw1MjguMyA2MS4zek0yMDUuMSA0NDhsMTYuOC00OCAxMDAuMiAwIDE2LjggNDgtMTMzLjggMHoiXQogICAgfTsKICAgIGZhVGFjaG9ncmFwaERpZ2l0YWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGFjaG9ncmFwaC1kaWdpdGFsIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImRpZ2l0YWwtdGFjaG9ncmFwaCJdLCAiZjU2NiIsICJNMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsNDQ4IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyNTZjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDQ4Yy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDEyOHptNjQgMzJsMCAzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxNjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTMyYzAtMTcuNy0xNC4zLTMyLTMyLTMyTDk2IDEyOGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6TTg4IDM1MmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxMzYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNEw4OCAzNTJ6bTI1NiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDE0NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xNDQgMHpNNDk2IDE5MmE2NCA2NCAwIDEgMCAtMTI4IDAgNjQgNjQgMCAxIDAgMTI4IDB6TTg4IDMxMmEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6bTEwNC0yNGEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAwem01NiAyNGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6Il0KICAgIH07CiAgICBmYURpZ2l0YWxUYWNob2dyYXBoID0gZmFUYWNob2dyYXBoRGlnaXRhbDsKICAgIGZhVGFibGV0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRhYmxldCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJ0YWJsZXQtYW5kcm9pZCJdLCAiZjNmYiIsICJNNjQgMEMyOC43IDAgMCAyOC43IDAgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zODRjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMHpNMTg0IDQwMGw4MCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC04MCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFUYWJsZXRBbmRyb2lkID0gZmFUYWJsZXQ7CiAgICBmYVJ1YmxlU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJydWJsZS1zaWduIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbODM4MSwgInJvdWJsZSIsICJydWIiLCAicnVibGUiXSwgImYxNTgiLCAiTTExMiAzMkM5NC4zIDMyIDgwIDQ2LjMgODAgNjRsMCAyMDgtNDAgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw0MCAwIDAgNDgtNDAgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw0MCAwIDAgMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTMyIDE1MiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xNTIgMCAwLTQ4IDExMiAwYzc5LjUgMCAxNDQtNjQuNSAxNDQtMTQ0UzMzNS41IDMyIDI1NiAzMkwxMTIgMzJ6TTI1NiAyNTZsLTExMiAwIDAtMTYwIDExMiAwYzQ0LjIgMCA4MCAzNS44IDgwIDgwcy0zNS44IDgwLTgwIDgweiJdCiAgICB9OwogICAgZmFSb3VibGUgPSBmYVJ1YmxlU2lnbjsKICAgIGZhUnViID0gZmFSdWJsZVNpZ247CiAgICBmYVJ1YmxlID0gZmFSdWJsZVNpZ247CiAgICBmYUNsb3NlZENhcHRpb25pbmcyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNsb3NlZC1jYXB0aW9uaW5nIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyMGEiLCAiTTAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjU2YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjh6bTE1MiA4MGwzMiAwYzQuNCAwIDggMy42IDggOCAwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0YzAtMzAuOS0yNS4xLTU2LTU2LTU2bC0zMiAwYy0zMC45IDAtNTYgMjUuMS01NiA1NmwwIDgwYzAgMzAuOSAyNS4xIDU2IDU2IDU2bDMyIDBjMzAuOSAwIDU2LTI1LjEgNTYtNTYgMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRjMCA0LjQtMy42IDgtOCA4bC0zMiAwYy00LjQgMC04LTMuNi04LThsMC04MGMwLTQuNCAzLjYtOCA4LTh6bTE2OCA4YzAtNC40IDMuNi04IDgtOGwzMiAwYzQuNCAwIDggMy42IDggOCAwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0YzAtMzAuOS0yNS4xLTU2LTU2LTU2bC0zMiAwYy0zMC45IDAtNTYgMjUuMS01NiA1NmwwIDgwYzAgMzAuOSAyNS4xIDU2IDU2IDU2bDMyIDBjMzAuOSAwIDU2LTI1LjEgNTYtNTYgMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRjMCA0LjQtMy42IDgtOCA4bC0zMiAwYy00LjQgMC04LTMuNi04LThsMC04MHoiXQogICAgfTsKICAgIGZhUGVuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODM5NF0sICJmMzA0IiwgIk0zNTIuOSAyMS4yTDMwOCA2Ni4xIDQ0NS45IDIwNCA0OTAuOCAxNTkuMUM1MDQuNCAxNDUuNiA1MTIgMTI3LjIgNTEyIDEwOHMtNy42LTM3LjYtMjEuMi01MS4xTDQ1NS4xIDIxLjJDNDQxLjYgNy42IDQyMy4yIDAgNDA0IDBzLTM3LjYgNy42LTUxLjEgMjEuMnpNMjc0LjEgMTAwTDU4LjkgMzE1LjFjLTEwLjcgMTAuNy0xOC41IDI0LjEtMjIuNiAzOC43TC45IDQ4MS42Yy0yLjMgOC4zIDAgMTcuMyA2LjIgMjMuNHMxNS4xIDguNSAyMy40IDYuMmwxMjcuOC0zNS41YzE0LjYtNC4xIDI3LjktMTEuOCAzOC43LTIyLjZMNDEyIDIzNy45IDI3NC4xIDEwMHoiXQogICAgfTsKICAgIGZhUGxhbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGxhbmUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjA3MiIsICJNNTIwIDIwMGMzMC45IDAgNTYgMjUuMSA1NiA1NnMtMjUuMSA1Ni01NiA1NmwtMTI3LjMgMC0xNTkuMiAxNzMuNmMtNi4xIDYuNi0xNC42IDEwLjQtMjMuNiAxMC40bC00My43IDBjLTEwLjkgMC0xOC42LTEwLjctMTUuMi0yMS4xbDU0LjMtMTYyLjktOTkuNyAwLTUyLjggNjZjLTMgMy44LTcuNiA2LTEyLjUgNmwtMTkuOCAwYy0xMC40IDAtMTgtOS44LTE1LjUtMTkuOUwzMiAyNTYgNSAxNDcuOUMyLjQgMTM3LjggMTAuMSAxMjggMjAuNSAxMjhsMTkuOCAwYzQuOSAwIDkuNSAyLjIgMTIuNSA2bDUyLjggNjYgOTkuNyAwLTU0LjMtMTYyLjlDMTQ3LjYgMjYuNyAxNTUuMyAxNiAxNjYuMiAxNmw0My43IDBjOSAwIDE3LjUgMy44IDIzLjYgMTAuNEwzOTIuNyAyMDAgNTIwIDIwMHoiXQogICAgfTsKICAgIGZhSW1hZ2VzMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJpbWFnZXMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjMwMiIsICJNOTYgOTZjMC0zNS4zIDI4LjctNjQgNjQtNjRsMzIwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyNTZjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTMyMCAwYy0zNS4zIDAtNjQtMjguNy02NC02NEw5NiA5NnpNMjQgMTI4YzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgMjk2YzAgOC44IDcuMiAxNiAxNiAxNmwzNjAgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTUyYzAtMTMuMyAxMC43LTI0IDI0LTI0em0xNjggMzJhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0em0xOTYuNSAxMS41Yy00LjQtNy4xLTEyLjEtMTEuNS0yMC41LTExLjVzLTE2LjEgNC40LTIwLjUgMTEuNWwtNTYuMyA5Mi4xLTI0LjUtMzAuNmMtNC42LTUuNy0xMS40LTktMTguNy05cy0xNC4yIDMuMy0xOC43IDlsLTY0IDgwYy01LjggNy4yLTYuOSAxNy4xLTIuOSAyNS40UzE3NC44IDM1MiAxODQgMzUybDI3MiAwYzguNyAwIDE2LjctNC43IDIwLjktMTIuM3M0LjEtMTYuOC0uNS0yNC4zbC04OC0xNDR6Il0KICAgIH07CiAgICBmYU1vYmlsZVNjcmVlbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb2JpbGUtc2NyZWVuIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbIm1vYmlsZS1hbmRyb2lkLWFsdCJdLCAiZjNjZiIsICJNMTYgNjRDMTYgMjguNyA0NC43IDAgODAgMEwzMDQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDM4NGMwIDM1LjMtMjguNyA2NC02NCA2NEw4MCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDE2IDY0ek0xMjggNDQwYzAgMTMuMyAxMC43IDI0IDI0IDI0bDgwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTgwIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0ek0zMDQgNjRsLTIyNCAwIDAgMzA0IDIyNCAwIDAtMzA0eiJdCiAgICB9OwogICAgZmFNb2JpbGVBbmRyb2lkQWx0ID0gZmFNb2JpbGVTY3JlZW47CiAgICBmYUd1YXJhbmlTaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImd1YXJhbmktc2lnbiIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlMTlhIiwgIk0xOTIgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCA0MS41QzczLjMgNzcuMyAwIDE1OC4xIDAgMjU2UzczLjMgNDM0LjcgMTY4IDQ0Ni41bDAgNDEuNWMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNDEuNWM5NC43LTExLjggMTY4LTkyLjYgMTY4LTE5MC41IDAtMTcuNy0xNC4zLTMyLTMyLTMybC0xMzYgMCAwLTkzLjhjMjUuMyA0LjggNDcuOSAxNyA2NS42IDM0LjMgMTIuNiAxMi40IDMyLjkgMTIuMiA0NS4zLS40czEyLjItMzIuOS0uNS00NS4zQzI5Ny4yIDkwLjIgMjU4LjggNzAuOCAyMTYgNjUuNUwyMTYgMjRjMC0xMy4zLTEwLjctMjQtMjQtMjR6TTE2OCAxMzAuMmwwIDI1MS41QzEwOC44IDM3MC41IDY0IDMxOC41IDY0IDI1NnM0NC44LTExNC41IDEwNC0xMjUuOHptNDggMjUxLjVsMC05My44IDEwMCAwYy0xMi4zIDQ3LjYtNTEuMiA4NC41LTEwMCA5My44eiJdCiAgICB9OwogICAgZmFCYWdTaG9wcGluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYWctc2hvcHBpbmciLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsic2hvcHBpbmctYmFnIl0sICJmMjkwIiwgIk0xNjAgODBjMC0zNS4zIDI4LjctNjQgNjQtNjRzNjQgMjguNyA2NCA2NGwwIDQ4LTEyOCAwIDAtNDh6bS00OCA0OGwtNjQgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhMMCAzODRjMCA1MyA0MyA5NiA5NiA5NmwyNTYgMGM1MyAwIDk2LTQzIDk2LTk2bDAtMjA4YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC02NCAwIDAtNDhjMC02MS45LTUwLjEtMTEyLTExMi0xMTJTMTEyIDE4LjEgMTEyIDgwbDAgNDh6bTI0IDQ4YTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHptMTUyIDI0YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6Il0KICAgIH07CiAgICBmYVNob3BwaW5nQmFnID0gZmFCYWdTaG9wcGluZzsKICAgIGZhQ2lyY2xlUmlnaHQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1yaWdodCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYxODM4LCAiYXJyb3ctYWx0LWNpcmNsZS1yaWdodCJdLCAiZjM1YSIsICJNMCAyNTZhMjU2IDI1NiAwIDEgMCA1MTIgMCAyNTYgMjU2IDAgMSAwIC01MTIgMHptMzg3LjMgMTEuM2wtMTA0IDEwNGMtNC42IDQuNi0xMS41IDUuOS0xNy40IDMuNVMyNTYgMzY2LjUgMjU2IDM2MGwwLTU2LTk2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMzJjMC0xNy43IDE0LjMtMzIgMzItMzJsOTYgMCAwLTU2YzAtNi41IDMuOS0xMi4zIDkuOS0xNC44czEyLjktMS4xIDE3LjQgMy41bDEwNCAxMDRjNi4yIDYuMiA2LjIgMTYuNCAwIDIyLjZ6Il0KICAgIH07CiAgICBmYUFycm93QWx0Q2lyY2xlUmlnaHQyID0gZmFDaXJjbGVSaWdodDI7CiAgICBmYVBob25lVm9sdW1lID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBob25lLXZvbHVtZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJ2b2x1bWUtY29udHJvbC1waG9uZSJdLCAiZjJhMCIsICJNMzQ0LTMyYzEyOC4xIDAgMjMyIDEwMy45IDIzMiAyMzIgMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRjMC0xMDEuNi04Mi40LTE4NC0xODQtMTg0LTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6bTggMTkyYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHpNMzIwIDg4YzAtMTMuMyAxMC43LTI0IDI0LTI0IDc1LjEgMCAxMzYgNjAuOSAxMzYgMTM2IDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtNDguNi0zOS40LTg4LTg4LTg4LTEzLjMgMC0yNC0xMC43LTI0LTI0ek0xNDQuMSAxLjRjMTkuNy01LjQgNDAuMyA0LjcgNDguMSAyMy41bDQwLjUgOTcuM2M2LjkgMTYuNSAyLjEgMzUuNi0xMS44IDQ3bC00NC4xIDM2LjFjMzIuNSA3MS42IDg5IDEzMCAxNTkuMyAxNjQuOUwzNzQuNyAzMjNjMTEuMy0xMy45IDMwLjQtMTguNiA0Ny0xMS44TDUxOSAzNTEuOGMxOC44IDcuOCAyOC45IDI4LjQgMjMuNSA0OC4xbC0xLjUgNS41QzUyMy40IDQ3MC4xIDQ2MC45IDUyNS4zIDM4NC42IDUwOS4yIDIwOS42IDQ3Mi4xIDcxLjkgMzM0LjQgMzQuOCAxNTkuNCAxOC43IDgzLjEgNzMuOSAyMC42IDEzOC41IDIuOWw1LjUtMS41eiJdCiAgICB9OwogICAgZmFWb2x1bWVDb250cm9sUGhvbmUgPSBmYVBob25lVm9sdW1lOwogICAgZmFDdWJlcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjdWJlcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMWIzIiwgIk0yODQtMS4zYy0xNy4zLTEwLTM4LjctMTAtNTYgMEwxNDMuOCA0Ny4zYy0xNy4zIDEwLTI4IDI4LjUtMjggNDguNWwwIDEwMS45LTg4LjMgNTFjLTE3LjMgMTAtMjggMjguNS0yOCA0OC41bDAgOTcuM2MwIDIwIDEwLjcgMzguNSAyOCA0OC41bDg0LjMgNDguNmMxNy4zIDEwIDM4LjcgMTAgNTYgMGw4OC4zLTUxIDg4LjMgNTFjMTcuMyAxMCAzOC43IDEwIDU2IDBMNDg0LjUgNDQzYzE3LjMtMTAgMjgtMjguNSAyOC00OC41bDAtOTcuM2MwLTIwLTEwLjctMzguNS0yOC00OC41bC04OC4zLTUxIDAtMTAxLjljMC0yMC0xMC43LTM4LjUtMjgtNDguNUwyODQtMS4zek0yMzIgMjkyLjZsMCAxMDYuNS04OC4zIDUxYy0xLjIgLjctMi42IDEuMS00IDEuMWwwLTEwNS4zIDkyLjMtNTMuM3ptMjMxLjQgLjZjLjcgMS4yIDEuMSAyLjYgMS4xIDRsMCA5Ny4zYzAgMi45LTEuNSA1LjUtNCA2LjlsLTg0LjMgNDguNmMtMS4yIC43LTIuNiAxLjEtNCAxLjFsMC0xMDUuMyA5MS4yLTUyLjZ6TTM0OC4zIDk1LjhsMCAxMDEuOS05Mi4zIDUzLjMgMC0xMDYuNSA5MS4yLTUyLjZjLjcgMS4yIDEuMSAyLjYgMS4xIDR6Il0KICAgIH07CiAgICBmYVBob25lID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBob25lIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MjIyLCAxMjgzNzldLCAiZjA5NSIsICJNMTYwLjIgMjVDMTUyLjMgNi4xIDEzMS43LTMuOSAxMTIuMSAxLjRsLTUuNSAxLjVjLTY0LjYgMTcuNi0xMTkuOCA4MC4yLTEwMy43IDE1Ni40IDM3LjEgMTc1IDE3NC44IDMxMi43IDM0OS44IDM0OS44IDc2LjMgMTYuMiAxMzguOC0zOS4xIDE1Ni40LTEwMy43bDEuNS01LjVjNS40LTE5LjctNC43LTQwLjMtMjMuNS00OC4xbC05Ny4zLTQwLjVjLTE2LjUtNi45LTM1LjYtMi4xLTQ3IDExLjhsLTM4LjYgNDcuMkMyMzMuOSAzMzUuNCAxNzcuMyAyNzcgMTQ0LjggMjA1LjNMMTg5IDE2OS4zYzEzLjktMTEuMyAxOC42LTMwLjQgMTEuOC00N0wxNjAuMiAyNXoiXQogICAgfTsKICAgIGZhVG9yaWlHYXRlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRvcmlpLWdhdGUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs5OTYxXSwgImY2YTEiLCAiTTAgOTZMMCAyOC41QzAgMjEuNiA1LjYgMTYgMTIuNSAxNiAxNC44IDE2IDE3IDE2LjYgMTkgMTcuOEw1OCA0MS4yQzgyLjkgNTYuMSAxMTEuMyA2NCAxNDAuMyA2NGwxNjcuNCAwYzI5IDAgNTcuNS03LjkgODIuMy0yMi44bDM5LTIzLjRjMS45LTEuMiA0LjItMS44IDYuNC0xLjggNi45IDAgMTIuNSA1LjYgMTIuNSAxMi41TDQ0OCA5NmMwIDM1LjMtMjguNyA2NC02NCA2NGwwIDY0IDE2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTE2IDAgMCAxOTJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xOTItMTkyIDAgMCAxOTJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xOTItMTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxNiAwIDAtNjRDMjguNyAxNjAgMCAxMzEuMyAwIDk2ek0xMjggMjI0bDY0IDAgMC02NC02NCAwIDAgNjR6bTEyOCAwbDY0IDAgMC02NC02NCAwIDAgNjR6Il0KICAgIH07CiAgICBmYUJhY29uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhY29uIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI5MzYzXSwgImY3ZTUiLCAiTTU1NyA5Ni43YzE0LjQgMTQuNCAxMi40IDM4LjQtNC4zIDUwLjJsLTY0LjYgNDUuN2MtNDMuNyAzMC45LTc5LjIgNzEuOS0xMDMuNCAxMTkuNmwtMjUuMyA0OS44Yy0yNS4xIDQ5LjMtNjIuMSA5MS41LTEwNy44IDEyMi42bC03NC4xIDUwLjZjLTEzLjEgOC45LTMwLjcgNy4zLTQxLjgtMy45bC00NC45LTQ0LjkgODYuNS02Ni41YzQyLjMtMzIuNSA3Ni43LTc0LjMgMTAwLjYtMTIybDI0LjUtNDkuMWMyNC41LTQ5IDYxLjgtOTAuNiAxMDcuOS0xMjAuMmwxMDguNy02OS45IDM4IDM4ek00ODQuMiAyMy45TDM4NC4zIDg4LjJjLTUzLjQgMzQuMy05Ni41IDgyLjQtMTI0LjkgMTM5LjFsLTI0LjUgNDkuMWMtMjAuNiA0MS4zLTUwLjMgNzcuMy04Ni45IDEwNS40bC05MS40IDcwLjMtMzYuOS0zNi45Yy0xNC40LTE0LjQtMTIuNC0zOC40IDQuMy01MC4ybDY0LjYtNDUuN2M0My43LTMwLjkgNzkuMi03MS45IDEwMy40LTExOS42bDI1LjMtNDkuOEMyNDIuMyAxMDAuOCAyNzkuMyA1OC42IDMyNSAyNy40bDc0LjEtNTAuNmMxMy4xLTguOSAzMC42LTcuMyA0MS44IDMuOWw0My4zIDQzLjN6Il0KICAgIH07CiAgICBmYVBlcnNvbkZhbGxpbmdCdXJzdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tZmFsbGluZy1idXJzdCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTQ3IiwgIk0yNTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDUuNGMwIDU1LjItMjMuNyAxMDctNjMuOSAxNDMuMWw2Mi45IDc1LjUgODkgMGMxNS4xIDAgMjkuMyA3LjEgMzguNCAxOS4ybDQzLjIgNTcuNmMxMC42IDE0LjEgNy43IDM0LjItNi40IDQ0LjhzLTM0LjIgNy43LTQ0LjgtNi40TDM2OCAzMjAgMjYzLjIgMzIwIDM3Ni44IDQ1OS44YzExLjEgMTMuNyA5LjEgMzMuOS00LjcgNDVzLTMzLjkgOS4xLTQ1LTQuN0wxMzcuNCAyNjYuNmMtNi4xIDE1LTkuNCAzMS4zLTkuNCA0OGwwIDY5LjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02OS40YzAtNjcuNCAzNS40LTEyOS45IDkzLjItMTY0LjZsNC42LTIuOEMyMDAuNCAxMjQgMjI0IDgyLjQgMjI0IDM3LjRsMC01LjRjMC0xNy43IDE0LjMtMzIgMzItMzJ6TTE2IDg4QTU2IDU2IDAgMSAxIDEyOCA4OCA1NiA1NiAwIDEgMSAxNiA4OHptMzc2LTcuOWMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTQ4YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA0OHptMTA0IDE1MmMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGw0OCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC00OCAwem0tNTQuNS05Ny41Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOWwzMy45LTMzLjljOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45bC0zMy45IDMzLjljLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAweiJdCiAgICB9OwogICAgZmFRdW90ZVJpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInF1b3RlLXJpZ2h0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbODIyMSwgInF1b3RlLXJpZ2h0LWFsdCJdLCAiZjEwZSIsICJNNDQ4IDI5NmMwIDY2LjMtNTMuNyAxMjAtMTIwIDEyMGwtOCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDggMGMzMC45IDAgNTYtMjUuMSA1Ni01NmwwLTgtNjQgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC02NGMwLTM1LjMgMjguNy02NCA2NC02NGw2NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMTM2em0tMjU2IDBjMCA2Ni4zLTUzLjcgMTIwLTEyMCAxMjBsLTggMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw4IDBjMzAuOSAwIDU2LTI1LjEgNTYtNTZsMC04LTY0IDBjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtNjRjMC0zNS4zIDI4LjctNjQgNjQtNjRsNjQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDEzNnoiXQogICAgfTsKICAgIGZhUXVvdGVSaWdodEFsdCA9IGZhUXVvdGVSaWdodDsKICAgIGZhSG91c2VNZWRpY2FsRmxhZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VzZS1tZWRpY2FsLWZsYWciLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTUxNCIsICJNNDgwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsOTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDk2YzAgMTcuNy0xNC4zIDMyLTMyIDMybC05NiAwIDAgMjg4YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNDQ4YzAtMTcuNyAxNC4zLTMyIDMyLTMyek0yNjcuNSA1OS4xTDQwMCAxODYuOSA0MDAgNTAzLjRjLTkuNCA1LjQtMjAuMyA4LjYtMzIgOC42bC0yNTYgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0xNDQtMTkuOSAwQzEyLjYgMzA0IDAgMjkxLjQgMCAyNzUuOSAwIDI2OC4zIDMuMSAyNjEgOC42IDI1NS43TDIxMi41IDU5LjFDMjE5LjkgNTIgMjI5LjcgNDggMjQwIDQ4czIwLjEgNCAyNy41IDExLjF6TTIwNC44IDI1Ni44bDAgNDQtNDQgMGMtOS43IDAtMTcuNiA3LjktMTcuNiAxNy42bDAgMzUuMmMwIDkuNyA3LjkgMTcuNiAxNy42IDE3LjZsNDQgMCAwIDQ0YzAgOS43IDcuOSAxNy42IDE3LjYgMTcuNmwzNS4yIDBjOS43IDAgMTcuNi03LjkgMTcuNi0xNy42bDAtNDQgNDQgMGM5LjcgMCAxNy42LTcuOSAxNy42LTE3LjZsMC0zNS4yYzAtOS43LTcuOS0xNy42LTE3LjYtMTcuNmwtNDQgMCAwLTQ0YzAtOS43LTcuOS0xNy42LTE3LjYtMTcuNmwtMzUuMiAwYy05LjcgMC0xNy42IDcuOS0xNy42IDE3LjZ6Il0KICAgIH07CiAgICBmYVByZXNjcmlwdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwcmVzY3JpcHRpb24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjViMSIsICJNMzIgMEMxNC4zIDAgMCAxNC4zIDAgMzJMMCAyODhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTY0IDUwLjcgMCAxMjggMTI4LTEwNS40IDEwNS40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwTDI4OCAzOTcuMyAzOTMuNCA1MDIuNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zTDMzMy4zIDM1MiA0MzguNiAyNDYuNmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMEwyODggMzA2LjcgMjAyLjIgMjIwLjlDMjUxLjQgMjA5LjEgMjg4IDE2NC44IDI4OCAxMTIgMjg4IDUwLjEgMjM3LjkgMCAxNzYgMEwzMiAwek0xNzYgMTYwbC0xMTIgMCAwLTk2IDExMiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4cy0yMS41IDQ4LTQ4IDQ4eiJdCiAgICB9OwogICAgZmFEaWNlVGhyZWUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZGljZS10aHJlZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzk4NThdLCAiZjUyNyIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnptNjQgOTZhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em02NCAxMjhhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptMTI4IDY0YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhQnVpbGRpbmdMb2NrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJ1aWxkaW5nLWxvY2siLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRkNiIsICJNMzIgNjRDMzIgMjguNyA2MC43IDAgOTYgMEwzNTIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDEyMS4zYy00Ni45IDE5LTgwIDY1LTgwIDExOC43bDAgMjQuNGMtMTkuNiAxNy42LTMyIDQzLjEtMzIgNzEuNWwwIDk2YzAgNS41IC41IDEwLjkgMS4zIDE2LjFMOTYgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwzMiA2NHpNMTc2IDM4NGwwIDgwIDgwIDAgMC02NC4xYzAtMTMuNyAxLjktMjcgNS41LTM5LjYtNS43LTUuMi0xMy4yLTguMy0yMS41LTguM2wtMzIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6TTMwNyAyMjQuM2MtMS0uMi0yLS4zLTMtLjNsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwxNi43IDBjMi4xLTIyLjggOC40LTQ0LjMgMTguMy02My43ek0xNDQgOTZjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHptMTEyIDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6TTE0NCAyMjRjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHptMzUyIDgwLjFjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA0Ny45IDY0IDAgMC00Ny45ek0zNTIgNDAwYzAtMjAuOSAxMy40LTM4LjcgMzItNDUuM2wwLTUwLjZjMC00NC4yIDM1LjgtODAgODAtODBzODAgMzUuOCA4MCA4MGwwIDUwLjZjMTguNiA2LjYgMzIgMjQuNCAzMiA0NS4zbDAgOTZjMCAyNi41LTIxLjUgNDgtNDggNDhsLTEyOCAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTk2eiJdCiAgICB9OwogICAgZmFJZENhcmQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImlkLWNhcmQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFs2MjE0NywgImRyaXZlcnMtbGljZW5zZSJdLCAiZjJjMiIsICJNMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmw0NDggMGMzNS4zIDAgNjQgMjguNyA2NCA2NEwwIDk2em0wIDQ4bDU3NiAwIDAgMjcyYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxNDR6TTI0Ny4zIDQxNmMyMC4yIDAgMzUuMy0xOS40IDIyLjQtMzUtMTQuNy0xNy43LTM2LjktMjktNjEuNy0yOWwtNjQgMGMtMjQuOCAwLTQ3IDExLjMtNjEuNyAyOS0xMi45IDE1LjYgMi4yIDM1IDIyLjQgMzVsMTQyLjUgMHpNMTc2IDMxMmE1NiA1NiAwIDEgMCAwLTExMiA1NiA1NiAwIDEgMCAwIDExMnpNMzYwIDIwOGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxMTIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTEyIDB6bTAgOTZjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTEyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTExMiAweiJdCiAgICB9OwogICAgZmFEcml2ZXJzTGljZW5zZTIgPSBmYUlkQ2FyZDI7CiAgICBmYUNpcmNsZVBsYXkyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1wbGF5IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjE0NjksICJwbGF5LWNpcmNsZSJdLCAiZjE0NCIsICJNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHpNMTg4LjMgMTQ3LjFjLTcuNiA0LjItMTIuMyAxMi4zLTEyLjMgMjAuOWwwIDE3NmMwIDguNyA0LjcgMTYuNyAxMi4zIDIwLjlzMTYuOCA0LjEgMjQuMy0uNWwxNDQtODhjNy4xLTQuNCAxMS41LTEyLjEgMTEuNS0yMC41cy00LjQtMTYuMS0xMS41LTIwLjVsLTE0NC04OGMtNy40LTQuNS0xNi43LTQuNy0yNC4zLS41eiJdCiAgICB9OwogICAgZmFQbGF5Q2lyY2xlMiA9IGZhQ2lyY2xlUGxheTI7CiAgICBmYUZhY2VMYXVnaEJlYW0yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtbGF1Z2gtYmVhbSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODUxMywgImxhdWdoLWJlYW0iXSwgImY1OWEiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0xMDEuNiAzMTRjLTMuNy0xMy43IDcuNS0yNiAyMS43LTI2bDI2NS40IDBjMTQuMiAwIDI1LjQgMTIuMyAyMS43IDI2LTE4LjUgNjgtODAuNiAxMTgtMTU0LjQgMTE4UzEyMCAzODIgMTAxLjYgMzE0ek0xNzYgMTY0Yy0xNS41IDAtMjggMTIuNS0yOCAyOGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTM3LjYgMzAuNC02OCA2OC02OHM2OCAzMC40IDY4IDY4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMTUuNS0xMi41LTI4LTI4LTI4em0xMzIgMjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0zNy42IDMwLjQtNjggNjgtNjhzNjggMzAuNCA2OCA2OGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTE1LjUtMTIuNS0yOC0yOC0yOHMtMjggMTIuNS0yOCAyOHoiXQogICAgfTsKICAgIGZhTGF1Z2hCZWFtMiA9IGZhRmFjZUxhdWdoQmVhbTI7CiAgICBmYUxlYWYgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGVhZiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMDZjIiwgIk00NzEuMyA2LjdDNDc3LjcgLjYgNDg3LTEuNiA0OTUuNiAxLjIgNTA1LjQgNC41IDUxMiAxMy43IDUxMiAyNGwwIDE4Ni45YzAgMTMxLjItMTA4LjEgMjM3LjEtMjM4LjggMjM3LjEtNzcgMC0xNDMuNC00OS41LTE2Ny41LTExOC43LTM1LjQgMzAuOC01Ny43IDc2LjEtNTcuNyAxMjYuNyAwIDEzLjMtMTAuNyAyNC0yNCAyNFMwIDQ2OS4zIDAgNDU2QzAgMzgxLjEgMzguMiAzMTUuMSA5Ni4xIDI3Ni4zIDEzMS40IDI1Mi43IDE3My41IDI0MCAyMTYgMjQwbDgwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTgwIDBjLTM5LjcgMC03Ny4zIDguOC0xMTEgMjQuNSAyMy4zLTcwIDg5LjItMTIwLjUgMTY3LTEyMC41IDY2LjQgMCAxMTUuOC0yMi4xIDE0OC43LTQ0IDE5LjItMTIuOCAzNS41LTI4LjEgNTAuNy00NS4zeiJdCiAgICB9OwogICAgZmFIb3VzZUNoaW1uZXlVc2VyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLWNoaW1uZXktdXNlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMDY1IiwgIk0yMzQuMiA4LjZjMTIuMy0xMS40IDMxLjMtMTEuNCA0My41IDBMMzY4IDkyLjMgMzY4IDgwYzAtMTcuNyAxNC4zLTMyIDMyLTMybDMyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxMDEuNSAzNy44IDM1LjFjOS42IDkgMTIuOCAyMi45IDggMzUuMVM0OTMuMiAyNzIgNDgwIDI3MmwtMTYgMCAwIDE3NmMwIDM1LjMtMjguNyA2NC02NCA2NGwtMjg4IDBjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMTc2LTE2IDBjLTEzLjIgMC0yNS04LjEtMjkuOC0yMC4zcy0xLjYtMjYuMiA4LTM1LjFsMjI0LTIwOHpNMzEyIDI1NmE1NiA1NiAwIDEgMCAtMTEyIDAgNTYgNTYgMCAxIDAgMTEyIDB6TTE0NCA0MzJjMCA4LjggNy4yIDE2IDE2IDE2bDE5MiAwYzguOCAwIDE2LTcuMiAxNi0xNiAwLTQ0LjItMzUuOC04MC04MC04MGwtNjQgMGMtNDQuMiAwLTgwIDM1LjgtODAgODB6Il0KICAgIH07CiAgICBmYVJvdGF0ZVJpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJvdGF0ZS1yaWdodCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJyZWRvLWFsdCIsICJyb3RhdGUtZm9yd2FyZCJdLCAiZjJmOSIsICJNNDg4IDE5MmwtMTQ0IDBjLTkuNyAwLTE4LjUtNS44LTIyLjItMTQuOHMtMS43LTE5LjMgNS4yLTI2LjJsNDYuNy00Ni43Yy03NS4zLTU4LjYtMTg0LjMtNTMuMy0yNTMuNSAxNS45LTc1IDc1LTc1IDE5Ni41IDAgMjcxLjVzMTk2LjUgNzUgMjcxLjUgMGM4LjItOC4yIDE1LjUtMTYuOSAyMS45LTI2LjEgMTAuMS0xNC41IDMwLjEtMTggNDQuNi03LjlzMTggMzAuMSA3LjkgNDQuNmMtOC41IDEyLjItMTguMiAyMy44LTI5LjEgMzQuNy0xMDAgMTAwLTI2Mi4xIDEwMC0zNjIgMFMtMjUgMTc1IDc1IDc1Yzk0LjMtOTQuMyAyNDMuNy05OS42IDM0NC4zLTE2LjJMNDcxIDdjNi45LTYuOSAxNy4yLTguOSAyNi4yLTUuMlM1MTIgMTQuMyA1MTIgMjRsMCAxNDRjMCAxMy4zLTEwLjcgMjQtMjQgMjR6Il0KICAgIH07CiAgICBmYVJlZG9BbHQgPSBmYVJvdGF0ZVJpZ2h0OwogICAgZmFSb3RhdGVGb3J3YXJkID0gZmFSb3RhdGVSaWdodDsKICAgIGZhVG9vdGggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidG9vdGgiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjk0NjNdLCAiZjVjOSIsICJNMTQ1IDUuN0wyMjQgMzIgMzAzIDUuN0MzMTQuMyAxLjkgMzI2IDAgMzM3LjkgMCAzOTguNyAwIDQ0OCA0OS4zIDQ0OCAxMTAuMWwwIDY4LjVjMCAyOS40LTkuNSA1OC4xLTI3LjIgODEuNmwtMS4xIDEuNWMtMTIuOSAxNy4yLTIxLjMgMzcuNC0yNC4zIDU4LjdMMzczLjcgNDcxLjljLTMuMyAyMy0yMyA0MC4xLTQ2LjIgNDAuMS0yMi44IDAtNDIuMy0xNi41LTQ2LTM5TDI2MS4zIDM1MS42Yy0zLTE4LjItMTguOC0zMS42LTM3LjMtMzEuNnMtMzQuMiAxMy40LTM3LjMgMzEuNkwxNjYuNSA0NzNjLTMuOCAyMi41LTIzLjIgMzktNDYgMzktMjMuMiAwLTQyLjktMTcuMS00Ni4yLTQwLjFMNTIuNiAzMjAuNWMtMy0yMS4zLTExLjQtNDEuNS0yNC4zLTU4LjdsLTEuMS0xLjVDOS41IDIzNi43IDAgMjA4LjEgMCAxNzguN2wwLTY4LjVDMCA0OS4zIDQ5LjMgMCAxMTAuMSAwIDEyMiAwIDEzMy43IDEuOSAxNDUgNS43eiJdCiAgICB9OwogICAgZmFIb3VzZUNoaW1uZXlXaW5kb3cgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG91c2UtY2hpbW5leS13aW5kb3ciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTAwZCIsICJNMjM0LjIgOC42YzEyLjMtMTEuNCAzMS4zLTExLjQgNDMuNSAwTDM2OCA5Mi4zIDM2OCA4MGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTAxLjUgMzcuOCAzNS4xYzkuNiA5IDEyLjggMjIuOSA4IDM1LjFTNDkzLjIgMjcyIDQ4MCAyNzJsLTE2IDAgMCAxNzZjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTI4OCAwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTE3Ni0xNiAwYy0xMy4yIDAtMjUtOC4xLTI5LjgtMjAuM3MtMS42LTI2LjIgOC0zNS4xbDIyNC0yMDh6TTIxNiAyMjRjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgODBjMCAxMy4zIDEwLjcgMjQgMjQgMjRsODAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTgwYzAtMTMuMy0xMC43LTI0LTI0LTI0bC04MCAweiJdCiAgICB9OwogICAgZmFNb3RvcmN5Y2xlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vdG9yY3ljbGUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjc5NDldLCAiZjIxYyIsICJNMjgwIDE2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDU2LjYgMCAyMi41IDQ4LjctOTUuMSA3MS4zYy0zMy40LTI1LjEtNzUtNDAtMTIwLTQwbC01NiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDU2IDBjNzguNSAwIDE0My4yIDU5LjYgMTUxLjIgMTM2bC0yNS40IDBjLTExLjItNTkuMi02My4zLTEwNC0xMjUuOC0xMDQtNzAuNyAwLTEyOCA1Ny4zLTEyOCAxMjhTNzMuMyA0ODAgMTQ0IDQ4MGM2Mi41IDAgMTE0LjUtNDQuOCAxMjUuOC0xMDRsNTAuMiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtMjIuNWMwLTQ1LjEgMjUuNy04NS40IDY1LjUtMTA3LjdsMTIuMSAyNi4xYy0zMi40IDIzLjItNTMuNSA2MS4yLTUzLjUgMTA0LjEgMCA3MC43IDU3LjMgMTI4IDEyOCAxMjhzMTI4LTU3LjMgMTI4LTEyOC01Ny4zLTEyOC0xMjgtMTI4Yy0xMC43IDAtMjEgMS4zLTMwLjkgMy44TDQzMy44IDE2MCA0ODggMTYwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtNDhjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTUzLjMgMGMtNi45IDAtMTMuNyAyLjItMTkuMiA2LjRsLTE3LjEgMTIuOC0yNC42LTUzLjNDMzY5LjkgMjEuNCAzNjEuNCAxNiAzNTIgMTZsLTcyIDB6TTQ0NS44IDMwMC40bDI4LjQgNjEuNmM1LjYgMTIgMTkuOCAxNy4zIDMxLjggMTEuN3MxNy4zLTE5LjggMTEuNy0zMS44bC0yOC41LTYxLjZjMi4yLS4yIDQuNC0uMyA2LjctLjMgMzkuOCAwIDcyIDMyLjIgNzIgNzJzLTMyLjIgNzItNzIgNzItNzItMzIuMi03Mi03MmMwLTIwLjIgOC4zLTM4LjUgMjEuOC01MS42ek0xNDQgNDI0Yy0zOS44IDAtNzItMzIuMi03Mi03MnMzMi4yLTcyIDcyLTcyYzMxLjMgMCA1OCAyMCA2Ny45IDQ4TDE0NCAzMjhjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNjcuOSAwYy05LjkgMjgtMzYuNiA0OC02Ny45IDQ4eiJdCiAgICB9OwogICAgZmFCYWNrd2FyZEZhc3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmFja3dhcmQtZmFzdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzkxOTgsICJmYXN0LWJhY2t3YXJkIl0sICJmMDQ5IiwgIk00OTIuMiA0NzcuNmMtMTIgNS0yNS43IDIuMi0zNC45LTYuOUwyODggMzAxLjMgMjg4IDQ0OGMwIDEyLjktNy44IDI0LjYtMTkuOCAyOS42cy0yNS43IDIuMi0zNC45LTYuOUw2NCAzMDEuMyA2NCA0NDhjMCAxNy43LTE0LjMgMzItMzIgMzJTMCA0NjUuNyAwIDQ0OEwwIDY0QzAgNDYuMyAxNC4zIDMyIDMyIDMyUzY0IDQ2LjMgNjQgNjRMNjQgMjEwLjcgMjMzLjQgNDEuNGM5LjItOS4yIDIyLjktMTEuOSAzNC45LTYuOVMyODggNTEuMSAyODggNjRsMCAxNDYuNyAxNjkuNC0xNjkuNGM5LjItOS4yIDIyLjktMTEuOSAzNC45LTYuOVM1MTIgNTEuMSA1MTIgNjRsMCAzODRjMCAxMi45LTcuOCAyNC42LTE5LjggMjkuNnoiXQogICAgfTsKICAgIGZhRmFzdEJhY2t3YXJkID0gZmFCYWNrd2FyZEZhc3Q7CiAgICBmYUFkZHJlc3NCb29rMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhZGRyZXNzLWJvb2siLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MjEzOCwgImNvbnRhY3QtYm9vayJdLCAiZjJiOSIsICJNOTYgMEM2MC43IDAgMzIgMjguNyAzMiA2NGwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyODggMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTM4NGMwLTM1LjMtMjguNy02NC02NC02NEw5NiAwek0yMDggMjg4bDY0IDBjNDQuMiAwIDgwIDM1LjggODAgODAgMCA4LjgtNy4yIDE2LTE2IDE2bC0xOTIgMGMtOC44IDAtMTYtNy4yLTE2LTE2IDAtNDQuMiAzNS44LTgwIDgwLTgwem0tMjQtOTZhNTYgNTYgMCAxIDEgMTEyIDAgNTYgNTYgMCAxIDEgLTExMiAwek01MTIgODBjMC04LjgtNy4yLTE2LTE2LTE2cy0xNiA3LjItMTYgMTZsMCA2NGMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtNjR6bTAgMTI4YzAtOC44LTcuMi0xNi0xNi0xNnMtMTYgNy4yLTE2IDE2bDAgNjRjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTY0ek00OTYgMzIwYy04LjggMC0xNiA3LjItMTYgMTZsMCA2NGMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtNjRjMC04LjgtNy4yLTE2LTE2LTE2eiJdCiAgICB9OwogICAgZmFDb250YWN0Qm9vazIgPSBmYUFkZHJlc3NCb29rMjsKICAgIGZhU2FpbGJvYXQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2FpbGJvYXQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTQ0NSIsICJNMjQwIDM1LjlsMCAzNDguMS0yMjQgMGMtOC44IDAtMTYgNy4yLTE2IDE2IDAgNjEuOSA1MC4xIDExMiAxMTIgMTEybDI4OCAwYzYxLjkgMCAxMTItNTAuMSAxMTItMTEyIDAtOC44LTcuMi0xNi0xNi0xNmwtMjA4IDAgMC00OCAxNjEuNyAwYzEyLjkgMCAyMC41LTE0LjQgMTMuMi0yNUwyNjkuMiAyNi45Yy04LjktMTMtMjkuMi02LjctMjkuMiA5ek0xOTIgMzIwbDAtMTg0LjJjMC0xNi4xLTIxLTIyLjEtMjkuNi04LjVMNDcuMyAzMTEuNWMtNi43IDEwLjcgMSAyNC41IDEzLjYgMjQuNUwxNzYgMzM2YzguOCAwIDE2LTcuMiAxNi0xNnoiXQogICAgfTsKICAgIGZhQm9va0Jvb2ttYXJrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvb2stYm9va21hcmsiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTBiYiIsICJNOTYgNTEybDMyMCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybDAtNjYuN2MxOC42LTYuNiAzMi0yNC40IDMyLTQ1LjNsMC0yODhjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTQ4IDAgMCAxNjkuNGMwIDEyLjUtMTAuMSAyMi42LTIyLjYgMjIuNi02IDAtMTEuOC0yLjQtMTYtNi42TDI3MiAxNDQgMjMwLjYgMTg1LjRjLTQuMiA0LjItMTAgNi42LTE2IDYuNi0xMi41IDAtMjIuNi0xMC4xLTIyLjYtMjIuNkwxOTIgMCA5NiAwQzQzIDAgMCA0MyAwIDk2TDAgNDE2YzAgNTMgNDMgOTYgOTYgOTZ6TTY0IDQxNmMwLTE3LjcgMTQuMy0zMiAzMi0zMmwyNTYgMCAwIDY0LTI1NiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnoiXQogICAgfTsKICAgIGZhTWFnbmlmeWluZ0dsYXNzQXJyb3dSaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtYWduaWZ5aW5nLWdsYXNzLWFycm93LXJpZ2h0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1MjEiLCAiTTQxNiAyMDhjMCA0NS45LTE0LjkgODguMy00MCAxMjIuN0w1MDIuNiA0NTcuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMEwzMzAuNyAzNzZDMjk2LjMgNDAxLjEgMjUzLjkgNDE2IDIwOCA0MTYgOTMuMSA0MTYgMCAzMjIuOSAwIDIwOFM5My4xIDAgMjA4IDAgNDE2IDkzLjEgNDE2IDIwOHpNMzA1IDIyNWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOWwtNzItNzJjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwcy05LjQgMjQuNiAwIDMzLjlsMzEgMzEtMTAyLjEgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxMDIuMSAwLTMxIDMxYy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBsNzItNzJ6Il0KICAgIH07CiAgICBmYU1pY3JvcGhvbmVMaW5lcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtaWNyb3Bob25lLWxpbmVzIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI3ODk3LCAibWljcm9waG9uZS1hbHQiXSwgImYzYzkiLCAiTTk2IDk2YzAtNTMgNDMtOTYgOTYtOTYgNTAuMyAwIDkxLjYgMzguNyA5NS43IDg4TDIzMiA4OGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw1NiAwIDAgNDgtNTYgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw1NS43IDBjLTQuMSA0OS4zLTQ1LjMgODgtOTUuNyA4OC01MyAwLTk2LTQzLTk2LTk2TDk2IDk2ek0yNCAxNjBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA0MGMwIDc5LjUgNjQuNSAxNDQgMTQ0IDE0NHMxNDQtNjQuNSAxNDQtMTQ0bDAtNDBjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDQwYzAgOTcuOS03My4zIDE3OC43LTE2OCAxOTAuNWwwIDQ5LjUgNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTQ0IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsNDggMCAwLTQ5LjVDNzMuMyA0MDIuNyAwIDMyMS45IDAgMjI0bDAtNDBjMC0xMy4zIDEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYU1pY3JvcGhvbmVBbHQgPSBmYU1pY3JvcGhvbmVMaW5lczsKICAgIGZhUmVwbHlBbGwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicmVwbHktYWxsIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbIm1haWwtcmVwbHktYWxsIl0sICJmMTIyIiwgIk0zMzIuMiAxOC40YzEyIDUgMTkuOCAxNi42IDE5LjggMjkuNmwwIDgwIDQ4IDBjOTcuMiAwIDE3NiA3OC44IDE3NiAxNzYgMCAxMTMuMy04MS41IDE2My45LTEwMC4yIDE3NC4xLTIuNSAxLjQtNS4zIDEuOS04LjEgMS45LTEwLjkgMC0xOS43LTguOS0xOS43LTE5LjcgMC03LjUgNC4zLTE0LjQgOS44LTE5LjUgOS40LTguOCAyMi4yLTI2LjQgMjIuMi01Ni43IDAtNTMtNDMtOTYtOTYtOTZsLTMyIDAgMCA4MGMwIDEyLjktNy44IDI0LjYtMTkuOCAyOS42cy0yNS43IDIuMi0zNC45LTYuOWwtMTYwLTE2MGMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNsMTYwLTE2MGM5LjItOS4yIDIyLjktMTEuOSAzNC45LTYuOXpNMjA1LjYgMjMuMWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOUw1NC42IDIwOCAyMDUuNiAzNTguOWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwTDEwIDIzMS4yYy02LjQtNi0xMC0xNC40LTEwLTIzLjJzMy42LTE3LjIgMTAtMjMuMkwxNzEuNiAyMy4xYzkuNC05LjQgMjQuNi05LjQgMzMuOSAweiJdCiAgICB9OwogICAgZmFNYWlsUmVwbHlBbGwgPSBmYVJlcGx5QWxsOwogICAgZmFVbml2ZXJzYWxBY2Nlc3MgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidW5pdmVyc2FsLWFjY2VzcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjlhIiwgIk0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0xNjEuNS04Ni4xYy0xMi4yLTUuMi0yNi4zIC40LTMxLjUgMTIuNnMuNCAyNi4zIDEyLjYgMzEuNWwxMS45IDUuMWMxNy4zIDcuNCAzNS4yIDEyLjkgNTMuNiAxNi4zbDAgNTAuMWMwIDQuMy0uNyA4LjYtMi4xIDEyLjZsLTI4LjcgODYuMWMtNC4yIDEyLjYgMi42IDI2LjIgMTUuMiAzMC40czI2LjItMi42IDMwLjQtMTUuMmwyNC40LTczLjJjMS4zLTMuOCA0LjgtNi40IDguOC02LjRzNy42IDIuNiA4LjggNi40bDI0LjQgNzMuMmM0LjIgMTIuNiAxNy44IDE5LjQgMzAuNCAxNS4yUzMzOSAzOTcgMzM0LjggMzg0LjRsLTI4LjctODYuMWMtMS40LTQuMS0yLjEtOC4zLTIuMS0xMi42bDAtNTAuMWMxOC40LTMuNSAzNi4zLTguOSA1My42LTE2LjNsMTEuOS01LjFjMTIuMi01LjIgMTcuOC0xOS4zIDEyLjYtMzEuNXMtMTkuMy0xNy44LTMxLjUtMTIuNkwzMzguNyAxNzVjLTI2LjEgMTEuMi01NC4yIDE3LTgyLjcgMTdzLTU2LjUtNS44LTgyLjctMTdsLTExLjktNS4xek0yNTYgMTYwYTQwIDQwIDAgMSAwIDAtODAgNDAgNDAgMCAxIDAgMCA4MHoiXQogICAgfTsKICAgIGZhVG9pbGV0UGFwZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidG9pbGV0LXBhcGVyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI5NTMxLCA2MzI2MywgInRvaWxldC1wYXBlci1hbHQiLCAidG9pbGV0LXBhcGVyLWJsYW5rIl0sICJmNzFlIiwgIk0zMjcuMSAzMmMtOC44IDExLjEtMTYgMjMuMS0yMS45IDM0LjgtMjEuNCA0Mi43LTMzLjIgOTguNC0zMy4yIDE1Ny4ybDAgMjY0YzAgMzAuOS0yNS4xIDU2LTU2IDU2TDU2IDU0NGMtMzAuOSAwLTU2LTI1LjEtNTYtNTZMMCAyMjRDMCAxMTggNDMgMzIgOTYgMzJsMjMxLjEgMHpNNDE2IDQxNmMtNTMgMC05Ni04Ni05Ni0xOTJzNDMtMTkyIDk2LTE5MiA5NiA4NiA5NiAxOTItNDMgMTkyLTk2IDE5MnptMC0xMjhjMTcuNyAwIDMyLTI4LjcgMzItNjRzLTE0LjMtNjQtMzItNjQtMzIgMjguNy0zMiA2NCAxNC4zIDY0IDMyIDY0eiJdCiAgICB9OwogICAgZmFUb2lsZXRQYXBlckFsdCA9IGZhVG9pbGV0UGFwZXI7CiAgICBmYVRvaWxldFBhcGVyQmxhbmsgPSBmYVRvaWxldFBhcGVyOwogICAgZmFWckNhcmRib2FyZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ2ci1jYXJkYm9hcmQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjcyOSIsICJNNTEyIDk2TDY0IDk2QzI4LjcgOTYgMCAxMjQuNyAwIDE2MEwwIDM1MmMwIDM1LjMgMjguNyA2NCA2NCA2NGwxMTcuNSAwYzE3IDAgMzMuMy02LjcgNDUuMy0xOC43bDMzLjktMzMuOWM3LjItNy4yIDE3LjEtMTEuMyAyNy4zLTExLjNzMjAuMSA0LjEgMjcuMyAxMS4zbDMzLjkgMzMuOWMxMiAxMiAyOC4zIDE4LjcgNDUuMyAxOC43TDUxMiA0MTZjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xOTJjMC0zNS4zLTI4LjctNjQtNjQtNjR6TTgwIDI0MGE2NCA2NCAwIDEgMSAxMjggMCA2NCA2NCAwIDEgMSAtMTI4IDB6bTM1Mi02NGE2NCA2NCAwIDEgMSAwIDEyOCA2NCA2NCAwIDEgMSAwLTEyOHoiXQogICAgfTsKICAgIGZhUGl6emFTbGljZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwaXp6YS1zbGljZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmODE4IiwgIk0xNjkuNyAuOWMtMjIuOC0xLjYtNDEuOSAxNC00Ny41IDM0LjdMMTEyLjUgNzJDMjkzLjMgNzIuMyA0MzkuNyAyMTguNyA0NDAgMzk5LjVsMzYuNC05LjdjMjAuOC01LjUgMzYuMy0yNC43IDM0LjctNDcuNS0xMi42LTE4Mi44LTE1OC42LTMyOC44LTM0MS40LTM0MS40em0yMjIgNDExLjVjLjItNC4xIC4zLTguMiAuMy0xMi40IDAtMTU0LjYtMTI1LjQtMjgwLTI4MC0yODAtNC4xIDAtOC4zIC4xLTEyLjQgLjNMLjUgNDkxLjljLTEuNSA1LjUgLjEgMTEuNCA0LjEgMTUuNHM5LjkgNS42IDE1LjQgNC4xbDM3MS42LTk5LjF6TTE3NiAyMDhhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em02NCAxMjhhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHpNOTYgMzg0YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6Il0KICAgIH07CiAgICBmYVNwcmF5Q2FuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNwcmF5LWNhbiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNWJkIiwgIk0xOTIgMGw2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgODAtMTI4IDAgMC04MGMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNNjQgMjU2YzAtNTMgNDMtOTYgOTYtOTZsMTI4IDBjNTMgMCA5NiA0MyA5NiA5NmwwIDIwOGMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMjI0IDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMjA4em0yNDAgODBhODAgODAgMCAxIDAgLTE2MCAwIDgwIDgwIDAgMSAwIDE2MCAwek0zMjAgNjRhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHpNNDQ4IDMyYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHptNjQgMzJhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptMzIgNjRhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0ek01MTIgMjU2YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6TTQ0OCAxMjhhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFWb2x1bWVMb3cgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidm9sdW1lLWxvdyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyODI2NCwgInZvbHVtZS1kb3duIl0sICJmMDI3IiwgIk00OCAzNTJsNDggMCAxMzQuMSAxMTkuMmM2LjQgNS43IDE0LjYgOC44IDIzLjEgOC44IDE5LjIgMCAzNC44LTE1LjYgMzQuOC0zNC44bDAtMzc4LjRjMC0xOS4yLTE1LjYtMzQuOC0zNC44LTM0LjgtOC41IDAtMTYuNyAzLjEtMjMuMSA4LjhMOTYgMTYwIDQ4IDE2MGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCA5NmMwIDI2LjUgMjEuNSA0OCA0OCA0OHpNMzgwLjYgMTgxLjVjLTEwLjMtOC40LTI1LjQtNi44LTMzLjggMy41cy02LjggMjUuNCAzLjUgMzMuOEMzNjEuMSAyMjcuNiAzNjggMjQxIDM2OCAyNTZzLTYuOSAyOC40LTE3LjcgMzcuM2MtMTAuMyA4LjQtMTEuOCAyMy41LTMuNSAzMy44czIzLjUgMTEuOCAzMy44IDMuNUM0MDIuMSAzMTIuOSA0MTYgMjg2LjEgNDE2IDI1NnMtMTMuOS01Ni45LTM1LjUtNzQuNXoiXQogICAgfTsKICAgIGZhVm9sdW1lRG93biA9IGZhVm9sdW1lTG93OwogICAgZmFDcm9zcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjcm9zcyIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyODMyNywgMTAwMTNdLCAiZjY1NCIsICJNMTc2IDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgODAtODAgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCAzMmMwIDI2LjUgMjEuNSA0OCA0OCA0OGw4MCAwIDAgMjA4YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDMyIDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0yMDggODAgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTMyYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC04MCAwIDAtODBjMC0yNi41LTIxLjUtNDgtNDgtNDhMMTc2IDB6Il0KICAgIH07CiAgICBmYVBlcnNvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjk0ODUsICJtYWxlIl0sICJmMTgzIiwgIk0yNDggMjRhNTYgNTYgMCAxIDAgLTExMiAwIDU2IDU2IDAgMSAwIDExMiAwem0yNCAyMTIuN2w0Ni4zIDYyLjRjMTAuNSAxNC4yIDMwLjYgMTcuMiA0NC44IDYuNnMxNy4yLTMwLjYgNi42LTQ0LjhsLTcwLjUtOTVDMjc0IDEzMiAyMzQuMyAxMTIgMTkyIDExMnMtODIgMjAtMTA3LjIgNTMuOWwtNzAuNSA5NWMtMTAuNSAxNC4yLTcuNiAzNC4yIDYuNiA0NC44czM0LjIgNy42IDQ0LjgtNi42TDExMiAyMzYuNyAxMTIgNTEyYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xNjBjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDE2MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjc1LjN6Il0KICAgIH07CiAgICBmYU1hbGUgPSBmYVBlcnNvbjsKICAgIGZhSG91cmdsYXNzMyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VyZ2xhc3MiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFs5MjAzLCA2MjAzMiwgImhvdXJnbGFzcy1lbXB0eSJdLCAiZjI1NCIsICJNMCAzMkMwIDE0LjMgMTQuMyAwIDMyIDBMMzUyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsMCAxMWMwIDQyLjQtMTYuOSA4My4xLTQ2LjkgMTEzLjFsLTY3LjkgNjcuOSA2Ny45IDY3LjljMzAgMzAgNDYuOSA3MC43IDQ2LjkgMTEzLjFsMCAxMWMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA1MTJjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMC0xMWMwLTQyLjQgMTYuOS04My4xIDQ2LjktMTEzLjFsNjcuOS02Ny45LTY3LjktNjcuOUM0OC45IDE1OC4xIDMyIDExNy40IDMyIDc1bDAtMTFDMTQuMyA2NCAwIDQ5LjcgMCAzMnpNOTYgNjRsMCAxMWMwIDI1LjUgMTAuMSA0OS45IDI4LjEgNjcuOWw2Ny45IDY3LjkgNjcuOS02Ny45YzE4LTE4IDI4LjEtNDIuNCAyOC4xLTY3LjlsMC0xMS0xOTIgMHptMCAzODRsMTkyIDAgMC0xMWMwLTI1LjUtMTAuMS00OS45LTI4LjEtNjcuOWwtNjcuOS02Ny45LTY3LjkgNjcuOWMtMTggMTgtMjguMSA0Mi40LTI4LjEgNjcuOWwwIDExeiJdCiAgICB9OwogICAgZmFIb3VyZ2xhc3NFbXB0eTIgPSBmYUhvdXJnbGFzczM7CiAgICBmYUZpc2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlzaCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyODAzMV0sICJmNTc4IiwgIk0xODAuNSAxNDEuNUMyMTkuNyAxMDguNSAyNzIuNiA4MCAzMzYgODBzMTE2LjMgMjguNSAxNTUuNSA2MS41YzM5LjEgMzMgNjYuOSA3Mi40IDgxIDk5LjggNC43IDkuMiA0LjcgMjAuMSAwIDI5LjMtMTQuMSAyNy40LTQxLjkgNjYuOC04MSA5OS44LTM5LjIgMzMuMS05MiA2MS41LTE1NS41IDYxLjVzLTExNi4zLTI4LjUtMTU1LjUtNjEuNWMtMTYuMi0xMy43LTMwLjUtMjguNS00Mi43LTQzLjFMNDguMSAzNzkuNmMtMTIuNSA3LjMtMjguNCA1LjMtMzguNy00LjlzLTEyLjQtMjYtNS4zLTM4LjZMNTAgMjU2IDQuMiAxNzUuOWMtNy4yLTEyLjYtNS0yOC40IDUuMy0zOC42czI2LjEtMTIuMiAzOC43LTQuOWw4OS43IDUyLjNjMTIuMi0xNC42IDI2LjUtMjkuNCA0Mi43LTQzLjF6TTQ0OCAyNTZhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHoiXQogICAgfTsKICAgIGZhRHJ1bXN0aWNrQml0ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkcnVtc3RpY2stYml0ZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNmQ3IiwgIk0xNjAgMjY1LjJjMCA4LjUtMy40IDE2LjYtOS40IDIyLjZsLTI2LjggMjYuOGMtMTIuMyAxMi4zLTMyLjUgMTEuNC00OS40IDcuMi00LjYtMS4xLTkuNS0xLjgtMTQuNS0xLjgtMzMuMSAwLTYwIDI2LjktNjAgNjBzMjYuOSA2MCA2MCA2MGM2LjMgMCAxMiA1LjcgMTIgMTIgMCAzMy4xIDI2LjkgNjAgNjAgNjBzNjAtMjYuOSA2MC02MGMwLTUtLjYtOS44LTEuOC0xNC41LTQuMi0xNi45LTUuMi0zNy4xIDcuMi00OS40bDI2LjgtMjYuOGM2LTYgMTQuMS05LjQgMjIuNi05LjRsODkuMiAwYzYuMyAwIDEyLjQtLjMgMTguNS0xIDExLjktMS4yIDE2LjQtMTUuNSAxMC44LTI2LTguNS0xNS44LTEzLjMtMzMuOC0xMy4zLTUzIDAtNjEuOSA1MC4xLTExMiAxMTItMTEyIDggMCAxNS43IC44IDIzLjIgMi40IDExLjcgMi41IDI0LjEtNS45IDIyLTE3LjYtMTQuNy04Mi4zLTg2LjctMTQ0LjgtMTczLjItMTQ0LjgtOTcuMiAwLTE3NiA3OC44LTE3NiAxNzZsMCA4OS4yeiJdCiAgICB9OwogICAgZmFDaGFydFNpbXBsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGFydC1zaW1wbGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTQ3MyIsICJNMTkyIDgwYzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDMyIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAzNTJjMCAyNi41LTIxLjUgNDgtNDggNDhsLTMyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMzUyek0wIDI3MmMwLTI2LjUgMjEuNS00OCA0OC00OGwzMiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMTYwYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0zMiAwYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDI3MnpNNDMyIDk2bDMyIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAyODhjMCAyNi41LTIxLjUgNDgtNDggNDhsLTMyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMjg4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4eiJdCiAgICB9OwogICAgZmFBdG9tID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImF0b20iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs5ODgzXSwgImY1ZDIiLCAiTTIyNCAzOTguOGMtMTEuOCA1LjEtMjMuNCA5LjctMzQuOSAxMy41IDE2LjcgMzMuOCAzMSAzNS43IDM0LjkgMzUuN3MxOC4xLTEuOSAzNC45LTM1LjdjLTExLjQtMy45LTIzLjEtOC40LTM0LjktMTMuNXpNNDE0IDI1NmMzMyA0NS4yIDQ0LjMgOTAuOSAyMy42IDEyOC0yMC4yIDM2LjMtNjIuNSA0OS4zLTExNS4yIDQzLjItMjIgNTIuMS01NS43IDg0LjgtOTguNCA4NC44cy03Ni40LTMyLjctOTguNC04NC44QzcyLjkgNDMzLjMgMzAuNiA0MjAuMyAxMC40IDM4NC0xMC4zIDM0Ni45IDEgMzAxLjIgMzQgMjU2IDEgMjEwLjgtMTAuMyAxNjUuMSAxMC40IDEyOCAzMC42IDkxLjcgNzIuOSA3OC43IDEyNS42IDg0LjggMTQ3LjYgMzIuNyAxODEuMiAwIDIyNCAwczc2LjQgMzIuNyA5OC40IDg0LjhjNTIuNy02LjEgOTUgNi44IDExNS4yIDQzLjIgMjAuNyAzNy4xIDkuNCA4Mi44LTIzLjYgMTI4em0tNjUuOCA2Ny40Yy0xLjcgMTQuMi0zLjkgMjgtNi43IDQxLjIgMzEuOCAxLjQgMzguNi04LjcgNDAuMi0xMS43IDIuMy00LjIgNy0xNy45LTExLjktNDguMS02LjggNi4zLTE0IDEyLjUtMjEuNiAxOC42em0tNi43LTE3NS45YzIuOCAxMy4xIDUgMjYuOSA2LjcgNDEuMiA3LjYgNi4xIDE0LjggMTIuMyAyMS42IDE4LjYgMTguOS0zMC4yIDE0LjItNDQgMTEuOS00OC4xLTEuNi0yLjktOC40LTEzLTQwLjItMTEuN3pNMjU4LjkgOTkuN0MyNDIuMSA2NS45IDIyNy45IDY0IDIyNCA2NHMtMTguMSAxLjktMzQuOSAzNS43YzExLjQgMy45IDIzLjEgOC40IDM0LjkgMTMuNSAxMS44LTUuMSAyMy40LTkuNyAzNC45LTEzLjV6bS0xNTkgODguOWMxLjctMTQuMyAzLjktMjggNi43LTQxLjItMzEuOC0xLjQtMzguNiA4LjctNDAuMiAxMS43LTIuMyA0LjItNyAxNy45IDExLjkgNDguMSA2LjgtNi4zIDE0LTEyLjUgMjEuNi0xOC42ek03OC4yIDMwNC44Yy0xOC45IDMwLjItMTQuMiA0NC0xMS45IDQ4LjEgMS42IDIuOSA4LjQgMTMgNDAuMiAxMS43LTIuOC0xMy4xLTUtMjYuOS02LjctNDEuMi03LjYtNi4xLTE0LjgtMTIuMy0yMS42LTE4LjZ6TTMwNCAyNTZhODAgODAgMCAxIDAgLTE2MCAwIDgwIDgwIDAgMSAwIDE2MCAwem0tODAtMzJhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFQID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInAiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFsxMTJdLCAiNTAiLCAiTTAgNjRDMCA0Ni4zIDE0LjMgMzIgMzIgMzJsMTI4IDBjODguNCAwIDE2MCA3MS42IDE2MCAxNjBTMjQ4LjQgMzUyIDE2MCAzNTJsLTk2IDAgMCA5NmMwIDE3LjctMTQuMyAzMi0zMiAzMlMwIDQ2NS43IDAgNDQ4TDAgNjR6TTY0IDI4OGw5NiAwYzUzIDAgOTYtNDMgOTYtOTZzLTQzLTk2LTk2LTk2bC05NiAwIDAgMTkyeiJdCiAgICB9OwogICAgZmFKZXRGaWdodGVyVXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiamV0LWZpZ2h0ZXItdXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTUxOCIsICJNMjA2LjggNDcuOEMyMDIuMyA1OC41IDIwMCA3MCAyMDAgODEuNmwwIDEwMC40LTE1MiAxMTQgMC00OGMwLTEzLjMtMTAuNy0yNC0yNC0yNFMwIDIzNC43IDAgMjQ4TDAgMzkyYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC04IDE1MiAwIDAgNTQuNC02NiA1Mi44Yy0zLjggMy02IDcuNi02IDEyLjVsMCAyNC4zYzAgOC44IDcuMiAxNiAxNiAxNmw4OCAwIDAtNDBjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDQwIDg4IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMjQuM2MwLTQuOS0yLjItOS41LTYtMTIuNWwtNjYtNTIuOCAwLTU0LjQgMTUyIDAgMCA4YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xNDRjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCA0OC0xNTItMTE0IDAtMTAwLjRjMC0xMS42LTIuMy0yMy4xLTYuOC0zMy44bC0yNy4xLTY1QzI3NC40LTI2LjIgMjY1LjctMzIgMjU2LTMycy0xOC40IDUuOC0yMi4yIDE0LjhsLTI3LjEgNjV6Il0KICAgIH07CiAgICBmYVBsdWdDaXJjbGVYbWFyayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwbHVnLWNpcmNsZS14bWFyayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTYwIiwgIk0xOTItMzJjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA5NiAxMjggMCAwLTk2YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCA5NiA2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybDAgNDguN2MtOTguNiA4LjEtMTc2IDkwLjctMTc2IDE5MS4zIDAgMjcuMyA1LjcgNTMuMyAxNiA3Ni45bDAgMy4xYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNjYuN0MxNjUuMiAzOTguMSA5NiAzMTkuMSA5NiAyMjRsMC02NGMtMTcuNyAwLTMyLTE0LjMtMzItMzJTNzguMyA5NiA5NiA5Nmw2NCAwIDAtOTZjMC0xNy43IDE0LjMtMzIgMzItMzJ6TTQ5NiAyNTZhMTQ0IDE0NCAwIDEgMSAwIDI4OCAxNDQgMTQ0IDAgMSAxIDAtMjg4em01OS4zIDEwNy4zYzYuMi02LjIgNi4yLTE2LjQgMC0yMi42cy0xNi40LTYuMi0yMi42IDBsLTM2LjcgMzYuNy0zNi43LTM2LjdjLTYuMi02LjItMTYuNC02LjItMjIuNiAwcy02LjIgMTYuNCAwIDIyLjZsMzYuNyAzNi43LTM2LjcgMzYuN2MtNi4yIDYuMi02LjIgMTYuNCAwIDIyLjZzMTYuNCA2LjIgMjIuNiAwbDM2LjctMzYuNyAzNi43IDM2LjdjNi4yIDYuMiAxNi40IDYuMiAyMi42IDBzNi4yLTE2LjQgMC0yMi42bC0zNi43LTM2LjcgMzYuNy0zNi43eiJdCiAgICB9OwogICAgZmFTaGVldFBsYXN0aWMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2hlZXQtcGxhc3RpYyIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlNTcxIiwgIk0wIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxNDkuNSAwYzE3IDAgMzMuMy02LjcgNDUuMy0xOC43TDM2NS4zIDM4Ni43YzEyLTEyIDE4LjctMjguMyAxOC43LTQ1LjNMMzg0IDY0YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDBDMjguNyAwIDAgMjguNyAwIDY0TDAgNDQ4em0yMDggNS41bDAtOTMuNWMwLTEzLjMgMTAuNy0yNCAyNC0yNGw5My41IDAtMTE3LjUgMTE3LjV6TTE1MyAxMDVsLTQ4IDQ4Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45bDQ4LTQ4YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOXptOTYgMzJMMTM3IDI0OWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOUwyMTUgMTAzYzkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOXoiXQogICAgfTsKICAgIGZhViA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ2IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTE4XSwgIjU2IiwgIk0xOS43IDM0LjVjMTYuMy02LjggMzUgLjkgNDEuOCAxNy4yTDE5MiAzNjQuOCAzMjIuNSA1MS43YzYuOC0xNi4zIDI1LjUtMjQgNDEuOC0xNy4yczI0IDI1LjUgMTcuMiA0MS44bC0xNjAgMzg0Yy01IDExLjktMTYuNiAxOS43LTI5LjUgMTkuN3MtMjQuNi03LjgtMjkuNS0xOS43TDIuNSA3Ni4zYy02LjgtMTYuMyAuOS0zNSAxNy4yLTQxLjh6Il0KICAgIH07CiAgICBmYUxpc3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGlzdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJsaXN0LXNxdWFyZXMiXSwgImYwM2EiLCAiTTQwIDQ4QzI2LjcgNDggMTYgNTguNyAxNiA3MmwwIDQ4YzAgMTMuMyAxMC43IDI0IDI0IDI0bDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC00OGMwLTEzLjMtMTAuNy0yNC0yNC0yNEw0MCA0OHpNMTkyIDY0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDI4OCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDE5MiA2NHptMCAxNjBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMjg4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTI4OCAwem0wIDE2MGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwyODggMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMjg4IDB6TTE2IDIzMmwwIDQ4YzAgMTMuMyAxMC43IDI0IDI0IDI0bDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC00OGMwLTEzLjMtMTAuNy0yNC0yNC0yNGwtNDggMGMtMTMuMyAwLTI0IDEwLjctMjQgMjR6TTQwIDM2OGMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCA0OGMwIDEzLjMgMTAuNyAyNCAyNCAyNGw0OCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtNDhjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTQ4IDB6Il0KICAgIH07CiAgICBmYUxpc3RTcXVhcmVzID0gZmFMaXN0OwogICAgZmFTb2xhclBhbmVsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNvbGFyLXBhbmVsIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY1YmEiLCAiTTEyMS44IDMyYy0zMCAwLTU2IDIwLjgtNjIuNSA1MC4xTDkuNiAzMDYuMUMuNyAzNDYuMSAzMS4xIDM4NCA3MiAzODRsMTg0LjEgMCAwIDY0LTY0IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMTkyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTY0IDAgMC02NCAxODQuMSAwYzQwLjkgMCA3MS40LTM3LjkgNjIuNS03Ny45bC00OS44LTIyNEM1MTAuNCA1Mi44IDQ4NC41IDMyIDQ1NC41IDMyTDEyMS44IDMyek0yNDUuNiA5Nmw4NS4yIDAgNy4zIDg4LTk5LjggMCA3LjMtODh6bS01NS41IDg4bC04Ny44IDAgMTkuNi04OCA3NS42IDAtNy4zIDg4ek05MS42IDIzMmw5NC41IDAtNy4zIDg4LTEwNi43IDAgMTkuNi04OHptMTQyLjYgMGwxMDcuOCAwIDcuMyA4OC0xMjIuNSAwIDcuMy04OHptMTU2IDBsOTQuNSAwIDE5LjYgODgtMTA2LjcgMC03LjMtODh6TTQ3NCAxODRsLTg3LjggMC03LjMtODggNzUuNiAwIDE5LjYgODh6Il0KICAgIH07CiAgICBmYUxhbmRNaW5lT24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGFuZC1taW5lLW9uIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1MWIiLCAiTTMxMiAwbDAgMTI4YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0TDI2NCAwYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjR6TTE2MCAyODhjMC0xNy43IDE0LjMtMzIgMzItMzJsMTkyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAzMiA4MCAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgOTZjMCAyNi41LTIxLjUgNDgtNDggNDhMODAgNTEyYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTk2YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDgwIDAgMC0zMnpNMTIgMTE0LjdjNy40LTExIDIyLjMtMTQgMzMuMy02LjdsOTYgNjRjMTEgNy40IDE0IDIyLjMgNi43IDMzLjNzLTIyLjMgMTQtMzMuMyA2LjdsLTk2LTY0Yy0xMS03LjQtMTQtMjIuMy02LjctMzMuM3pNNTMwLjcgMTA4YzExLTcuNCAyNS45LTQuNCAzMy4zIDYuN3M0LjQgMjUuOS02LjcgMzMuM2wtOTYgNjRjLTExIDcuNC0yNS45IDQuNC0zMy4zLTYuN3MtNC40LTI1LjkgNi43LTMzLjNsOTYtNjR6Il0KICAgIH07CiAgICBmYUhlYWRwaG9uZXMyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhlYWRwaG9uZXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjc5MTEsIDYyODYzLCAiaGVhZHBob25lcy1hbHQiLCAiaGVhZHBob25lcy1zaW1wbGUiXSwgImYwMjUiLCAiTTY0IDIyNGMwLTg4LjQgNzEuNi0xNjAgMTYwLTE2MHMxNjAgNzEuNiAxNjAgMTYwbDAgMzcuNWMtMTAtMy41LTIwLjgtNS41LTMyLTUuNWwtMTYgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCAxMjhjMCAyNi41IDIxLjUgNDggNDggNDhsMTYgMGM1MyAwIDk2LTQzIDk2LTk2bDAtMTYwQzQ0OCAxMDAuMyAzNDcuNyAwIDIyNCAwUzAgMTAwLjMgMCAyMjRMMCAzODRjMCA1MyA0MyA5NiA5NiA5NmwxNiAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMTI4YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC0xNiAwYy0xMS4yIDAtMjIgMS45LTMyIDUuNUw2NCAyMjR6Il0KICAgIH07CiAgICBmYUhlYWRwaG9uZXNBbHQyID0gZmFIZWFkcGhvbmVzMjsKICAgIGZhSGVhZHBob25lc1NpbXBsZTIgPSBmYUhlYWRwaG9uZXMyOwogICAgZmFCdXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnVzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI4NjUzXSwgImYyMDciLCAiTTk2IDBDNDMgMCAwIDQzIDAgOTZMMCAzODRjMCAyOS44IDIwLjQgNTQuOSA0OCA2MmwwIDM0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDE2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0zMiAxOTIgMCAwIDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMybDE2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0zNGMyNy42LTcuMSA0OC0zMi4yIDQ4LTYybDAtMjg4YzAtNTMtNDMtOTYtOTYtOTZMOTYgMHpNNjQgMTc2YzAtMTcuNyAxNC4zLTMyIDMyLTMybDEwNCAwIDAgMTEyLTEwNCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTQ4em0xODQgODBsMC0xMTIgMTA0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA0OGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMTA0IDB6TTk2IDMyMGEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6bTI1NiAwYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHpNMTUyIDcyYzAtMTMuMyAxMC43LTI0IDI0LTI0bDk2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTk2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0eiJdCiAgICB9OwogICAgZmFGaWxlUG93ZXJwb2ludDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1wb3dlcnBvaW50IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYxYzQiLCAiTTAgNjRDMCAyOC43IDI4LjcgMCA2NCAwTDIxMy41IDBjMTcgMCAzMy4zIDYuNyA0NS4zIDE4LjdMMzY1LjMgMTI1LjNjMTIgMTIgMTguNyAyOC4zIDE4LjcgNDUuM0wzODQgNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA2NHptMjA4LTUuNWwwIDkzLjVjMCAxMy4zIDEwLjcgMjQgMjQgMjRMMzI1LjUgMTc2IDIwOCA1OC41ek0xNTIgMjU2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDE0NGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMjQgMjQgMGMzOS44IDAgNzItMzIuMiA3Mi03MnMtMzIuMi03Mi03Mi03MmwtNDggMHptNDggOTZsLTI0IDAgMC00OCAyNCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0eiJdCiAgICB9OwogICAgZmFRdW90ZUxlZnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicXVvdGUtbGVmdCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzgyMjAsICJxdW90ZS1sZWZ0LWFsdCJdLCAiZjEwZCIsICJNMCAyMTZDMCAxNDkuNyA1My43IDk2IDEyMCA5Nmw4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTggMGMtMzAuOSAwLTU2IDI1LjEtNTYgNTZsMCA4IDY0IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCA2NGMwIDM1LjMtMjguNyA2NC02NCA2NGwtNjQgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAyMTZ6bTI1NiAwYzAtNjYuMyA1My43LTEyMCAxMjAtMTIwbDggMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtOCAwYy0zMC45IDAtNTYgMjUuMS01NiA1NmwwIDggNjQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDY0YzAgMzUuMy0yOC43IDY0LTY0IDY0bC02NCAwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTEzNnoiXQogICAgfTsKICAgIGZhUXVvdGVMZWZ0QWx0ID0gZmFRdW90ZUxlZnQ7CiAgICBmYUNoZXZyb25Eb3duID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoZXZyb24tZG93biIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMDc4IiwgIk0yMDEuNCA0MDYuNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGwxOTItMTkyYzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwTDIyNCAzMzguNyA1NC42IDE2OS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2wxOTIgMTkyeiJdCiAgICB9OwogICAgZmFFYXJ0aEFzaWEgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZWFydGgtYXNpYSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyNzc1OSwgImdsb2JlLWFzaWEiXSwgImY1N2UiLCAiTTUwIDI4NC44YzQuMiAyLjEgOSAzLjIgMTQgMy4ybDUwLjcgMGM4LjUgMCAxNi42IDMuNCAyMi42IDkuNGwxMy4zIDEzLjNjNiA2IDE0LjEgOS40IDIyLjYgOS40bDE4LjcgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0LTEwLjcgMjQtMjRsMC00Mi43YzAtOC41IDMuNC0xNi42IDkuNC0yMi42bDEzLjMtMTMuM2M2LTYgOS40LTE0LjEgOS40LTIyLjZMMzA0IDU3YzAtMS4yLS4xLTIuMy0uMi0zLjUtMTUuNC0zLjYtMzEuNC01LjUtNDcuOC01LjUtMTE0LjkgMC0yMDggOTMuMS0yMDggMjA4IDAgOS44IC43IDE5LjQgMiAyOC44em00MDMuMyAzNy4zYy0zLjItMS40LTYuNy0yLjEtMTAuNS0yLjFMNDMyIDMyMGMtOC44IDAtMTYtNy4yLTE2LTE2cy03LjItMTYtMTYtMTZsLTM0LjcgMGMtOC41IDAtMTYuNiAzLjQtMjIuNiA5LjRsLTQ1LjMgNDUuM2MtNiA2LTkuNCAxNC4xLTkuNCAyMi42bDAgMTguN2MwIDE3LjcgMTQuMyAzMiAzMiAzMmwxOC43IDBjOC41IDAgMTYuNiAzLjQgMjIuNiA5LjQgMi4yIDIuMiA0LjcgNC4xIDcuMyA1LjUgMzkuMy0yNS40IDY5LjUtNjMuNiA4NC42LTEwOC44ek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwek0xMjggMzY4YzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNnMtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6TTI3MiAyNTZjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZ6bTQ4LTExMmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZzLTE2IDcuMi0xNiAxNnoiXQogICAgfTsKICAgIGZhR2xvYmVBc2lhID0gZmFFYXJ0aEFzaWE7CiAgICBmYUNlbnRTaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNlbnQtc2lnbiIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlM2Y1IiwgIk0yMDggMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDI1LjRjNDMuNiA1LjIgODMgMjQuNSAxMTMuMyA1My4xIDEyLjkgMTIuMSAxMy40IDMyLjQgMS4zIDQ1LjJzLTMyLjQgMTMuNC00NS4yIDEuM2MtMjQuNC0yMy01Ny4yLTM3LjEtOTMuMy0zNy4xLTc1LjEgMC0xMzYgNjAuOS0xMzYgMTM2czYwLjkgMTM2IDEzNiAxMzZjMzYuMiAwIDY5LTE0LjEgOTMuMy0zNy4xIDEyLjktMTIuMSAzMy4xLTExLjUgNDUuMiAxLjNzMTEuNSAzMy4xLTEuMyA0NS4yQzMyMyA0MzAuMSAyODMuNiA0NDkuNCAyNDAgNDU0LjZsMCAyNS40YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMjhDODQuNyA0MzMuNSAxNiAzNTIuOCAxNiAyNTZTODQuNyA3OC41IDE3NiA2MGwwLTI4YzAtMTcuNyAxNC4zLTMyIDMyLTMyeiJdCiAgICB9OwogICAgZmFTaGllbGRDYXQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2hpZWxkLWNhdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTcyIiwgIk0yNjkuNCAyLjlDMjY1LjIgMSAyNjAuNyAwIDI1NiAwcy05LjIgMS0xMy40IDIuOUw1NC4zIDgyLjhjLTIyIDkuMy0zOC40IDMxLTM4LjMgNTcuMiAuNSA5OS4yIDQxLjMgMjgwLjcgMjEzLjYgMzYzLjIgMTYuNyA4IDM2LjEgOCA1Mi44IDAgMTcyLjQtODIuNSAyMTMuMi0yNjQgMjEzLjYtMzYzLjIgLjEtMjYuMi0xNi4zLTQ3LjktMzguMy01Ny4yTDI2OS40IDIuOXpNMTYwIDE1NC40YzAtNS44IDQuNy0xMC40IDEwLjQtMTAuNGwuMiAwYzMuNCAwIDYuNSAxLjYgOC41IDQuM2w0MCA1My4zYzMgNCA3LjggNi40IDEyLjggNi40bDQ4IDBjNSAwIDkuOC0yLjQgMTIuOC02LjRsNDAtNTMuM2MyLTIuNyA1LjItNC4zIDguNS00LjNsLjIgMGM1LjggMCAxMC40IDQuNyAxMC40IDEwLjRMMzUyIDI3MmMwIDUzLTQzIDk2LTk2IDk2cy05Ni00My05Ni05NmwwLTExNy42ek0yMTYgMjg4YTE2IDE2IDAgMSAwIDAtMzIgMTYgMTYgMCAxIDAgMCAzMnptOTYtMTZhMTYgMTYgMCAxIDAgLTMyIDAgMTYgMTYgMCAxIDAgMzIgMHoiXQogICAgfTsKICAgIGZhU2Nob29sQ2lyY2xlQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2Nob29sLWNpcmNsZS1jaGVjayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTZiIiwgIk02NCAxMjhjLTM1LjMgMC02NCAyOC43LTY0IDY0TDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI3NiAwYy0xMC41LTE0LjYtMTktMzAuNy0yNS4xLTQ4bC05MC45IDAgMC04OGMwLTIyLjEgMTcuOS00MCA0MC00MGw0OCAwYzEgMCAxLjkgMCAyLjkgLjEgMjYuMy03NC42IDk3LjUtMTI4LjEgMTgxLjEtMTI4LjEgMjguNiAwIDU1LjYgNi4yIDgwIDE3LjRsMC0zMy40YzAtMzUuMy0yOC43LTY0LTY0LTY0bC02NCAwLTEyNy45LTExNS4xYy0xOC4zLTE2LjQtNDYtMTYuNC02NC4yIDBMMTI4IDEyOCA2NCAxMjh6bTY0IDI0MGMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyek0xMTIgMjU2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZ6TTI4OCAxMjhhNjQgNjQgMCAxIDEgMCAxMjggNjQgNjQgMCAxIDEgMC0xMjh6TTY0MCA0MDBhMTQ0IDE0NCAwIDEgMCAtMjg4IDAgMTQ0IDE0NCAwIDEgMCAyODggMHptLTg2LjYtNjAuOWM3LjEgNS4yIDguNyAxNS4yIDMuNSAyMi4zbC02NCA4OGMtMi44IDMuOC03IDYuMi0xMS43IDYuNXMtOS4zLTEuMy0xMi42LTQuNmwtNDAtNDBjLTYuMi02LjItNi4yLTE2LjQgMC0yMi42czE2LjQtNi4yIDIyLjYgMGwyNi44IDI2LjggNTMtNzIuOWM1LjItNy4xIDE1LjItOC43IDIyLjQtMy41eiJdCiAgICB9OwogICAgZmFNYXJ0aW5pR2xhc3MgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFydGluaS1nbGFzcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyNzg2NCwgImdsYXNzLW1hcnRpbmktYWx0Il0sICJmNTdiIiwgIk0yLjQgNTEuOEM3LjQgMzkuOCAxOS4xIDMyIDMyIDMybDQ0OCAwYzEyLjkgMCAyNC42IDcuOCAyOS42IDE5LjhzMi4yIDI1LjctNi45IDM0LjlMMjg4IDMwMS4zIDI4OCA0NDggMzUyIDQ0OGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTkyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsNjQgMCAwLTE0Ni43LTIxNC42LTIxNC42Qy4yIDc3LjUtMi41IDYzLjcgMi40IDUxLjh6TTM1NC43IDE0NGw0OC00OC0yOTMuNSAwIDQ4IDQ4IDE5Ny41IDB6Il0KICAgIH07CiAgICBmYUdsYXNzTWFydGluaUFsdCA9IGZhTWFydGluaUdsYXNzOwogICAgZmFQbHVnID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBsdWciLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjgyNjhdLCAiZjFlNiIsICJNMTI4LTMyYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgOTYgMTI4IDAgMC05NmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgOTYgNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwwIDY0YzAgOTUuMS02OS4yIDE3NC4xLTE2MCAxODkuM2wwIDY2LjdjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02Ni43QzEwMS4yIDM5OC4xIDMyIDMxOS4xIDMyIDIyNGwwLTY0Yy0xNy43IDAtMzItMTQuMy0zMi0zMlMxNC4zIDk2IDMyIDk2bDY0IDAgMC05NmMwLTE3LjcgMTQuMy0zMiAzMi0zMnoiXQogICAgfTsKICAgIGZhUGFub3JhbWEgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGFub3JhbWEiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTIwOSIsICJNNDMuOSA0OEMxOS43IDQ4IDAgNjcuNyAwIDkxLjlMMCA0MjAuMWMwIDI0LjMgMTkuNyA0My45IDQzLjkgNDMuOSA1LjUgMCAxMC43LTEgMTUuNy0yLjkgMTIuOS00LjkgMTAzLjQtMzcuMSAyMjguNC0zNy4xczIxNS41IDMyLjMgMjI4LjQgMzcuMWM1IDEuOSAxMC4yIDIuOSAxNS43IDIuOSAyNC4zIDAgNDMuOS0xOS43IDQzLjktNDMuOWwwLTMyOC4yYzAtMjQuMy0xOS43LTQzLjktNDMuOS00My45LTUuNSAwLTEwLjcgMS0xNS43IDIuOS0xMi45IDQuOS0xMDMuNCAzNy4xLTIyOC40IDM3LjFTNzIuNSA1NS43IDU5LjYgNTAuOUM1NC42IDQ5IDQ5LjQgNDggNDMuOSA0OHpNNzIgMTc2YTQwIDQwIDAgMSAxIDgwIDAgNDAgNDAgMCAxIDEgLTgwIDB6bTI2NC4xLTE2YzcuNSAwIDE0LjYgMy42IDE5LjEgOS42TDQ3OS43IDMzNi4yYzUuOSA3LjkgNi40IDE4LjUgMS4zIDI2LjlzLTE0LjggMTIuOC0yNC41IDExLjFjLTQ1LjgtNy44LTEwMy4zLTE0LjItMTY4LjQtMTQuMi02NS42IDAtMTIzLjQgNi41LTE2OS4zIDE0LjQtOS44IDEuNy0xOS43LTIuOS0yNC43LTExLjVzLTQuMy0xOS40IDEuOS0yNy4yTDE2NS4zIDI0OWM0LjYtNS43IDExLjUtOSAxOC43LTlzMTQuMiAzLjMgMTguNyA5bDI3LjUgMzQuNCA4Ni43LTExMy45YzQuNi02IDExLjctOS41IDE5LjItOS41eiJdCiAgICB9OwogICAgZmFDbG9ja1JvdGF0ZUxlZnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2xvY2stcm90YXRlLWxlZnQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsiaGlzdG9yeSJdLCAiZjFkYSIsICJNMjg4IDY0YzEwNiAwIDE5MiA4NiAxOTIgMTkyUzM5NCA0NDggMjg4IDQ0OGMtNjUuMiAwLTEyMi45LTMyLjUtMTU3LjYtODIuMy0xMC4xLTE0LjUtMzAuMS0xOC00NC42LTcuOXMtMTggMzAuMS03LjkgNDQuNkMxMjQuMSA0NjguNiAyMDEgNTEyIDI4OCA1MTIgNDI5LjQgNTEyIDU0NCAzOTcuNCA1NDQgMjU2UzQyOS40IDAgMjg4IDBDMjAyLjMgMCAxMjYuNSA0Mi4xIDgwIDEwNi43TDgwIDgwYzAtMTcuNy0xNC4zLTMyLTMyLTMyUzE2IDYyLjMgMTYgODBsMCAxMTJjMCAxNy43IDE0LjMgMzIgMzIgMzJsMjQuNiAwYy41IDAgMSAwIDEuNSAwbDg2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTM4LjMgMEMxNTQuOSAxMDIuNiAyMTcgNjQgMjg4IDY0em0yNCA4OGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDEwNGMwIDYuNCAyLjUgMTIuNSA3IDE3bDcyIDcyYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNjUtNjUgMC05NC4xeiJdCiAgICB9OwogICAgZmFIaXN0b3J5ID0gZmFDbG9ja1JvdGF0ZUxlZnQ7CiAgICBmYUphcldoZWF0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImphci13aGVhdCIsCiAgICAgIGljb246IFszMjAsIDUxMiwgW10sICJlNTE3IiwgIk0zMi04YzAtMTMuMyAxMC43LTI0IDI0LTI0bDIwOCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0TDU2IDE2QzQyLjcgMTYgMzIgNS4zIDMyLTh6TTAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDE5MiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjh6bTExMiAzMmwtNDIuMiAwYy0zLjIgMC01LjggMi42LTUuOCA1LjggMCAzMi4xIDI2IDU4LjIgNTguMiA1OC4ybDc1LjYgMGMzMi4xIDAgNTguMi0yNiA1OC4yLTU4LjIgMC0zLjItMi42LTUuOC01LjgtNS44TDIwOCAxNjBjLTE5LjEgMC0zNi4zIDguNC00OCAyMS43LTExLjctMTMuMy0yOC45LTIxLjctNDgtMjEuN3ptNDggMTE3LjdjLTExLjctMTMuMy0yOC45LTIxLjctNDgtMjEuN2wtNDIuMiAwYy0zLjIgMC01LjggMi42LTUuOCA1LjggMCAzMi4xIDI2IDU4LjIgNTguMiA1OC4ybDc1LjYgMGMzMi4xIDAgNTguMi0yNiA1OC4yLTU4LjIgMC0zLjItMi42LTUuOC01LjgtNS44TDIwOCAyNTZjLTE5LjEgMC0zNi4zIDguNC00OCAyMS43ek0xMTIgMzUybC00Mi4yIDBjLTMuMiAwLTUuOCAyLjYtNS44IDUuOCAwIDMyLjEgMjYgNTguMiA1OC4yIDU4LjJsMjEuOCAwIDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTMyIDIxLjggMGMzMi4xIDAgNTguMi0yNiA1OC4yLTU4LjIgMC0zLjItMi42LTUuOC01LjgtNS44TDIwOCAzNTJjLTE5LjEgMC0zNi4zIDguNC00OCAyMS43LTExLjctMTMuMy0yOC45LTIxLjctNDgtMjEuN3oiXQogICAgfTsKICAgIGZhQ2xvdWRBcnJvd0Rvd24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2xvdWQtYXJyb3ctZG93biIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzYyMzM3LCAiY2xvdWQtZG93bmxvYWQiLCAiY2xvdWQtZG93bmxvYWQtYWx0Il0sICJmMGVkIiwgIk0xNDQgNDgwYy03OS41IDAtMTQ0LTY0LjUtMTQ0LTE0NCAwLTYzLjQgNDEtMTE3LjIgOTcuOS0xMzYuNS0xLjMtNy43LTEuOS0xNS41LTEuOS0yMy41IDAtNzkuNSA2NC41LTE0NCAxNDQtMTQ0IDU1LjQgMCAxMDMuNSAzMS4zIDEyNy42IDc3LjEgMTQuMi04LjMgMzAuOC0xMy4xIDQ4LjQtMTMuMSA1MyAwIDk2IDQzIDk2IDk2IDAgMTUuNy0zLjggMzAuNi0xMC41IDQzLjcgNDQgMjAuMyA3NC41IDY0LjcgNzQuNSAxMTYuMyAwIDcwLjctNTcuMyAxMjgtMTI4IDEyOGwtMzA0IDB6TTM3NyAzMTNjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMGwtMzEgMzEgMC0xMDIuMWMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDEwMi4xLTMxLTMxYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDcyIDcyYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwbDcyLTcyeiJdCiAgICB9OwogICAgZmFDbG91ZERvd25sb2FkID0gZmFDbG91ZEFycm93RG93bjsKICAgIGZhQ2xvdWREb3dubG9hZEFsdCA9IGZhQ2xvdWRBcnJvd0Rvd247CiAgICBmYVRydWNrUmFtcEJveCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cnVjay1yYW1wLWJveCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJ0cnVjay1sb2FkaW5nIl0sICJmNGRlIiwgIk00MDAgMzJjLTQ0LjIgMC04MCAzNS44LTgwIDgwbDAgMjQ4LjItMjk3LjIgODkuMkM1LjkgNDU0LjQtMy43IDQ3Mi4zIDEuNCA0ODkuMnMyMi45IDI2LjUgMzkuOCAyMS41bDMxNS41LTk0LjYgNDMuNyAwYy0uMiAyLjYtLjQgNS4zLS40IDggMCA0OC42IDM5LjQgODggODggODhzODgtMzkuNCA4OC04OGwwLTM5Mi0xNzYgMHpNNTI4IDQyNGMwIDIyLjEtMTcuOSA0MC00MCA0MHMtNDAtMTcuOS00MC00MCAxNy45LTQwIDQwLTQwYzIyLjEgMCAzOS45IDE3LjkgNDAgMzkuOWwwIC4xek01MS45IDE0OS41QzE4LjEgMTU5LjgtLjkgMTk1LjYgOS40IDIyOS40bDI4LjEgOTEuOEM0Ny44IDM1NSA4My42IDM3NCAxMTcuNCAzNjMuN2w5MS44LTI4LjFjMzMuOC0xMC4zIDUyLjgtNDYuMSA0Mi41LTc5LjlsLTI4LjEtOTEuOGMtMTAuMy0zMy44LTQ2LjEtNTIuOC03OS45LTQyLjVMNTEuOSAxNDkuNXoiXQogICAgfTsKICAgIGZhVHJ1Y2tMb2FkaW5nID0gZmFUcnVja1JhbXBCb3g7CiAgICBmYUFuZ2xlRG93biA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhbmdsZS1kb3duIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbODk2NF0sICJmMTA3IiwgIk0xNjkuNCAzNzQuNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGwxNjAtMTYwYzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwTDE5MiAzMDYuNyA1NC42IDE2OS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2wxNjAgMTYweiJdCiAgICB9OwogICAgZmFQbHVnQ2lyY2xlQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGx1Zy1jaXJjbGUtY2hlY2siLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU1YyIsICJNMTkyLTMyYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgOTYgMTI4IDAgMC05NmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgOTYgNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwwIDQ4LjdjLTk4LjYgOC4xLTE3NiA5MC43LTE3NiAxOTEuMyAwIDI3LjMgNS43IDUzLjMgMTYgNzYuOWwwIDMuMWMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY2LjdDMTY1LjIgMzk4LjEgOTYgMzE5LjEgOTYgMjI0bDAtNjRjLTE3LjcgMC0zMi0xNC4zLTMyLTMyUzc4LjMgOTYgOTYgOTZsNjQgMCAwLTk2YzAtMTcuNyAxNC4zLTMyIDMyLTMyek0zNTIgNDAwYTE0NCAxNDQgMCAxIDEgMjg4IDAgMTQ0IDE0NCAwIDEgMSAtMjg4IDB6bTIwMS40LTYwLjljLTcuMS01LjItMTcuMi0zLjYtMjIuNCAzLjVsLTUzIDcyLjktMjYuOC0yNi44Yy02LjItNi4yLTE2LjQtNi4yLTIyLjYgMHMtNi4yIDE2LjQgMCAyMi42bDQwIDQwYzMuMyAzLjMgNy45IDUgMTIuNiA0LjZzOC45LTIuOCAxMS43LTYuNWw2NC04OGM1LjItNy4xIDMuNi0xNy4yLTMuNS0yMi4zeiJdCiAgICB9OwogICAgZmFXaW5kb3dNYXhpbWl6ZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid2luZG93LW1heGltaXplIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NDcwXSwgImYyZDAiLCAiTTY0IDY0QzI4LjcgNjQgMCA5Mi43IDAgMTI4TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDY0em0yNCA2NGwzMzYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNEw4OCAxNzZjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYUhhbmRzSG9sZGluZ0NpcmNsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kcy1ob2xkaW5nLWNpcmNsZSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNGZiIiwgIk0zMjAgMGExMjggMTI4IDAgMSAxIDAgMjU2IDEyOCAxMjggMCAxIDEgMC0yNTZ6TTQwIDY0YzIyLjEgMCA0MCAxNy45IDQwIDQwbDAgMTYwLjJjMCAxNyA2LjcgMzMuMyAxOC43IDQ1LjNsNTEuMSA1MS4xYzguMyA4LjMgMjEuMyA5LjYgMzEgMy4xIDEyLjktOC42IDE0LjctMjYuOSAzLjctMzcuOC03LjMtNy4zLTIzLjEtMjMuMS00Ny4yLTQ3LjItMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMGMyNC4xIDI0LjEgMzkuOSAzOS45IDQ3LjIgNDcuMmwwIDAgMjUuMyAyNS4zYzIxIDIxIDMyLjggNDkuNSAzMi44IDc5LjJsMCA3OC45YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC02Ni43IDBjLTE3IDAtMzMuMy02LjctNDUuMy0xOC43TDI4LjEgMzkzLjRDMTAuMSAzNzUuNCAwIDM1MSAwIDMyNS41TDAgMTA0QzAgODEuOSAxNy45IDY0IDQwIDY0em01NjAgMGMyMi4xIDAgNDAgMTcuOSA0MCA0MGwwIDIyMS41YzAgMjUuNS0xMC4xIDQ5LjktMjguMSA2Ny45TDUxMiA0OTMuM2MtMTIgMTItMjguMyAxOC43LTQ1LjMgMTguN0w0MDAgNTEyYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTc4LjljMC0yOS43IDExLjgtNTguMiAzMi44LTc5LjJsMjUuMy0yNS4zIDAgMGM3LjMtNy4zIDIzLjEtMjMuMSA0Ny4yLTQ3LjIgMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM2MtMjQuMSAyNC4xLTM5LjkgMzkuOS00Ny4yIDQ3LjItMTEgMTEtOS4yIDI5LjIgMy43IDM3LjggOS43IDYuNSAyMi43IDUuMiAzMS0zLjFsNTEuMS01MS4xYzEyLTEyIDE4LjctMjguMyAxOC43LTQ1LjNMNTYwIDEwNGMwLTIyLjEgMTcuOS00MCA0MC00MHoiXQogICAgfTsKICAgIGZhTG9jYXRpb25QaW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibG9jYXRpb24tcGluIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbIm1hcC1tYXJrZXIiXSwgImYwNDEiLCAiTTE5MiAwQzg2IDAgMCA4NC40IDAgMTg4LjYgMCAzMDcuOSAxMjAuMiA0NTAuOSAxNzAuNCA1MDUuNCAxODIuMiA1MTguMiAyMDEuOCA1MTguMiAyMTMuNiA1MDUuNCAyNjMuOCA0NTAuOSAzODQgMzA3LjkgMzg0IDE4OC42IDM4NCA4NC40IDI5OCAwIDE5MiAweiJdCiAgICB9OwogICAgZmFNYXBNYXJrZXIgPSBmYUxvY2F0aW9uUGluOwogICAgZmFCb3dsaW5nQmFsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib3dsaW5nLWJhbGwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjQzNiIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTI0MCA4MGEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6TTIwOCAyMDhhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptLTY0LTY0YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhQ2FydEZsYXRiZWQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FydC1mbGF0YmVkIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImRvbGx5LWZsYXRiZWQiXSwgImY0NzQiLCAiTTMyIDBDMTQuMyAwIDAgMTQuMyAwIDMyUzE0LjMgNjQgMzIgNjRsMTYgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAyODhjMCAzOS44IDI5LjEgNzIuOCA2Ny4xIDc5LTIgNS4zLTMuMSAxMS0zLjEgMTcgMCAyNi41IDIxLjUgNDggNDggNDhzNDgtMjEuNSA0OC00OGMwLTUuNi0xLTExLTIuNy0xNmwxOTcuNSAwYy0xLjggNS0yLjcgMTAuNC0yLjcgMTYgMCAyNi41IDIxLjUgNDggNDggNDhzNDgtMjEuNSA0OC00OGMwLTUuNi0xLTExLTIuNy0xNmwzNC43IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTQwMCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0yODhDMTI4IDM1LjggOTIuMiAwIDQ4IDBMMzIgMHpNMjI0IDY0Yy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDE3NmMwIDI2LjUgMjEuNSA0OCA0OCA0OGwyNDAgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTE3NmMwLTI2LjUtMjEuNS00OC00OC00OEwyMjQgNjR6Il0KICAgIH07CiAgICBmYURvbGx5RmxhdGJlZCA9IGZhQ2FydEZsYXRiZWQ7CiAgICBmYUhvdXNlVXNlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VzZS11c2VyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImhvbWUtdXNlciJdLCAiZTFiMCIsICJNMjc3LjggOC42Yy0xMi4zLTExLjQtMzEuMy0xMS40LTQzLjUgMGwtMjI0IDIwOGMtOS42IDktMTIuOCAyMi45LTggMzUuMVMxOC44IDI3MiAzMiAyNzJsMTYgMCAwIDE3NmMwIDM1LjMgMjguNyA2NCA2NCA2NGwyODggMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTE3NiAxNiAwYzEzLjIgMCAyNS04LjEgMjkuOC0yMC4zczEuNi0yNi4yLTgtMzUuMWwtMjI0LTIwOHpNMjAwIDI1NmE1NiA1NiAwIDEgMSAxMTIgMCA1NiA1NiAwIDEgMSAtMTEyIDB6TTE0NCA0MzJjMC00NC4yIDM1LjgtODAgODAtODBsNjQgMGM0NC4yIDAgODAgMzUuOCA4MCA4MCAwIDguOC03LjIgMTYtMTYgMTZsLTE5MiAwYy04LjggMC0xNi03LjItMTYtMTZ6Il0KICAgIH07CiAgICBmYUhvbWVVc2VyID0gZmFIb3VzZVVzZXI7CiAgICBmYUdob3N0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImdob3N0IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4MTIzXSwgImY2ZTIiLCAiTTQwLjEgNDY3LjFsLTExLjIgOUMyNS43IDQ3OC42IDIxLjggNDgwIDE3LjggNDgwIDggNDgwIDAgNDcyIDAgNDYyLjJMMCAxOTJDMCA4NiA4NiAwIDE5MiAwUzM4NCA4NiAzODQgMTkybDAgMjcwLjJjMCA5LjgtOCAxNy44LTE3LjggMTcuOC00IDAtNy45LTEuNC0xMS4xLTMuOWwtMTEuMi05Yy0xMy40LTEwLjctMzIuOC05LTQ0LjEgMy45TDI2OS4zIDUwNmMtMy4zIDMuOC04LjIgNi0xMy4zIDZzLTkuOS0yLjItMTMuMy02bC0yNi42LTMwLjVjLTEyLjctMTQuNi0zNS40LTE0LjYtNDguMiAwTDE0MS4zIDUwNmMtMy4zIDMuOC04LjIgNi0xMy4zIDZzLTkuOS0yLjItMTMuMy02TDg0LjIgNDcxYy0xMS4zLTEyLjktMzAuNy0xNC42LTQ0LjEtMy45ek0xNjAgMTkyYTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6bTk2IDMyYTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHoiXQogICAgfTsKICAgIGZhQ29tbWVudE5vZGVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvbW1lbnQtbm9kZXMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTY5NiIsICJNNDgwIDIwOEM1MDMuNyAyMDggNTI1LjYgMjE1LjMgNTQzLjcgMjI3LjkgNTM2LjkgMTAwLjkgNDI1IDAgMjg4IDAgMTQ2LjYgMCAzMiAxMDcuNSAzMiAyNDAgMzIgMjk0LjMgNTEuMiAzNDQuMyA4My42IDM4NC41TDM0LjggNDc2LjhjLTQuOCA5LTMuMyAyMCAzLjYgMjcuNXMxNy44IDkuOCAyNy4xIDUuOGwxMTguNC01MC43YzI3LjIgMTEuNCA1Ni45IDE4LjQgODguMSAyMC4yIC4xLTE4LjkgNC45LTM4IDE1LTU1LjUgMTcuMS0yOS43IDQ1LjgtNDguNSA3Ny01NC4ybDkuMi0xNmMtMy40LTEwLjctNS4yLTIyLTUuMi0zMy44IDAtNjEuOSA1MC4xLTExMiAxMTItMTEyek0zMjguNiA0NDhjLTE3LjcgMzAuNi03LjIgNjkuNyAyMy40IDg3LjRzNjkuNyA3LjIgODcuNC0yMy40YzEuNS0yLjYgMi44LTUuMyAzLjktOGw3My4zIDBjMS4xIDIuNyAyLjQgNS40IDMuOSA4IDE3LjcgMzAuNiA1Ni44IDQxLjEgODcuNCAyMy40czQxLjEtNTYuOCAyMy40LTg3LjRjLTEzLjQtMjMuMi0zOS4xLTM0LjgtNjQtMzEuNGwtMTcuNi0zMC43Yy0xMSAxMS43LTI1IDIwLjYtNDAuNiAyNS42bDE2LjUgMjguOWMtMy44IDQuOC02LjggMTAtOSAxNS42bC03My40IDBjLTIuMi01LjYtNS4zLTEwLjgtOS0xNS42bDMzLTU3LjdjNC4xIC44IDguNCAxLjMgMTIuOCAxLjMgMzUuMyAwIDY0LTI4LjcgNjQtNjRzLTI4LjctNjQtNjQtNjQtNjQgMjguNy02NCA2NGMwIDEzLjQgNC4xIDI1LjggMTEuMiAzNi4xbC0zNC42IDYwLjVjLTI1LTMuNC01MC42IDguMy02NCAzMS40eiJdCiAgICB9OwogICAgZmFQZXJzb25BcnJvd0Rvd25Ub0xpbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLWFycm93LWRvd24tdG8tbGluZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTM4IiwgIk0xOTItMzJhNTYgNTYgMCAxIDEgMCAxMTIgNTYgNTYgMCAxIDEgMC0xMTJ6TTMxOC4zIDI5OS4xbC00Ni4zLTYyLjQgMCAyNDMuMyAyNzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA1NDRjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsODAgMCAwLTI0My4zLTQ2LjMgNjIuNGMtMTAuNSAxNC4yLTMwLjYgMTcuMi00NC44IDYuNnMtMTcuMi0zMC42LTYuNi00NC44bDcwLjUtOTVDMTEwIDEzMiAxNDkuNyAxMTIgMTkyIDExMnM4MiAyMCAxMDcuMiA1My45bDcwLjUgOTVjMTAuNSAxNC4yIDcuNiAzNC4yLTYuNiA0NC44cy0zNC4yIDcuNi00NC44LTYuNnpNMTc2IDQ4MGwzMiAwIDAtMTI4YzAtOC44LTcuMi0xNi0xNi0xNnMtMTYgNy4yLTE2IDE2bDAgMTI4ek01NjYuNiAxNjYuNmwtODAgODBjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwbC04MC04MGMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMEw0MzIgMTQ2LjcgNDMyIDBjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDE0Ni43IDI1LjQtMjUuNGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zeiJdCiAgICB9OwogICAgZmFQbHVnQ2lyY2xlUGx1cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwbHVnLWNpcmNsZS1wbHVzIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NWYiLCAiTTE5Mi0zMmMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDk2IDEyOCAwIDAtOTZjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDk2IDY0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsMCA0OC43Yy05OC42IDguMS0xNzYgOTAuNy0xNzYgMTkxLjMgMCAyNy4zIDUuNyA1My4zIDE2IDc2LjlsMCAzLjFjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02Ni43QzE2NS4yIDM5OC4xIDk2IDMxOS4xIDk2IDIyNGwwLTY0Yy0xNy43IDAtMzItMTQuMy0zMi0zMlM3OC4zIDk2IDk2IDk2bDY0IDAgMC05NmMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNNDk2IDI1NmExNDQgMTQ0IDAgMSAxIDAgMjg4IDE0NCAxNDQgMCAxIDEgMC0yODh6bTE2IDgwYzAtOC44LTcuMi0xNi0xNi0xNnMtMTYgNy4yLTE2IDE2bDAgNDgtNDggMGMtOC44IDAtMTYgNy4yLTE2IDE2czcuMiAxNiAxNiAxNmw0OCAwIDAgNDhjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTQ4IDQ4IDBjOC44IDAgMTYtNy4yIDE2LTE2cy03LjItMTYtMTYtMTZsLTQ4IDAgMC00OHoiXQogICAgfTsKICAgIGZhUGVyc29uU3dpbW1pbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLXN3aW1taW5nIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI3OTQ2LCAic3dpbW1lciJdLCAiZjVjNCIsICJNNTUyIDE1MmE1NiA1NiAwIDEgMCAtMTEyIDAgNTYgNTYgMCAxIDAgMTEyIDB6TTI5My40IDE5OC4ybC04OC42IDczLjljMS4xIDAgMi4yLS4xIDMuMy0uMSAzMy4xLS4yIDY2LjMgMTAuMiA5NC40IDMxLjQgMjIuMSAxNi42IDI5LjEgMTYuNiA1MS4yIDAgMjcuNS0yMC43IDU5LjktMzEuMiA5Mi40LTMxLjQgNC44IDAgOS43IC4yIDE0LjUgLjYtOC4zLTMwLTI0LjMtNTcuNy00Ni44LTgwLjItMTguNC0xOC40LTQwLjYtMzIuNy02NS00MS44bC02OC42LTI1LjdjLTI3LjQtMTAuMy01OC03LjUtODMuMSA3LjZsLTUzLjUgMzIuMWMtMTUuMiA5LjEtMjAuMSAyOC43LTExIDQzLjlzMjguNyAyMC4xIDQzLjkgMTFMMjMwIDE4Ny4zYzguNC01IDE4LjYtNS45IDI3LjctMi41bDM1LjcgMTMuNHptMTEwIDE4MS45YzIxLjMtMTYuMSA0OS45LTE2LjEgNzEuMiAwIDE5IDE0LjQgNDEuOSAyOC4yIDY3LjIgMzMuMyAyNi41IDUuNCA1NC4zIC44IDgwLjctMTkuMSAxMC42LTggMTIuNy0yMyA0LjctMzMuNnMtMjMtMTIuNy0zMy42LTQuN2MtMTQuOSAxMS4yLTI4LjYgMTMuMS00Mi4zIDEwLjMtMTQuOS0zLTMwLjktMTEuOS00Ny44LTI0LjYtMzguNC0yOS05MC41LTI5LTEyOSAwLTI0IDE4LjEtNDAuNyAyNi4zLTU0LjUgMjYuM3MtMzAuNS04LjItNTQuNS0yNi4zYy0zOC40LTI5LTkwLjUtMjktMTI5IDAtMjEuNiAxNi4zLTQxLjMgMjUuOC01OC45IDI1LjctOS42LS4xLTE5LjktMy0zMS4yLTExLjUtMTAuNi04LTI1LjYtNS45LTMzLjYgNC43UzcgMzg2LjMgMTcuNiAzOTQuM2MxOS4xIDE0LjQgMzkuNCAyMSA1OS44IDIxLjEgMzMuOSAuMiA2NC4zLTE3LjQgODguMS0zNS4zIDIxLjMtMTYuMSA0OS45LTE2LjEgNzEuMiAwIDI0LjIgMTguMyA1Mi4zIDM1LjkgODMuNCAzNS45czU5LjEtMTcuNyA4My40LTM1Ljl6Il0KICAgIH07CiAgICBmYVN3aW1tZXIgPSBmYVBlcnNvblN3aW1taW5nOwogICAgZmFDb21tZW50RG90czIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY29tbWVudC1kb3RzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MTcyLCA2MjA3NSwgImNvbW1lbnRpbmciXSwgImY0YWQiLCAiTTI1NiA0ODBjMTQxLjQgMCAyNTYtMTA3LjUgMjU2LTI0MFMzOTcuNCAwIDI1NiAwIDAgMTA3LjUgMCAyNDBjMCA1NC4zIDE5LjIgMTA0LjMgNTEuNiAxNDQuNUwyLjggNDc2LjhjLTQuOCA5LTMuMyAyMCAzLjYgMjcuNXMxNy44IDkuOCAyNy4xIDUuOGwxMTguNC01MC43QzE4My43IDQ3Mi42IDIxOC45IDQ4MCAyNTYgNDgwek0xMjggMjA4YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHptMTI4IDBhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em05NiAzMmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAweiJdCiAgICB9OwogICAgZmFDb21tZW50aW5nMiA9IGZhQ29tbWVudERvdHMyOwogICAgZmFDaGFydFBpZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGFydC1waWUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsicGllLWNoYXJ0Il0sICJmMjAwIiwgIk01MTIuNCAyNDBsLTE3NiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTE3NmMwLTE3LjcgMTQuNC0zMi4yIDMxLjktMjkuOSAxMDcgMTQuMiAxOTEuOCA5OSAyMDYgMjA2IDIuMyAxNy41LTEyLjIgMzEuOS0yOS45IDMxLjl6TTIyMi42IDM3LjJjMTguMS0zLjggMzMuOCAxMSAzMy44IDI5LjVsMCAxOTcuM2MwIDUuNiAyIDExIDUuNSAxNS4zTDM5NCA0MzguN2MxMS43IDE0LjEgOS4yIDM1LjQtNi45IDQ0LjEtMzQuMSAxOC42LTczLjIgMjkuMi0xMTQuNyAyOS4yLTEzMi41IDAtMjQwLTEwNy41LTI0MC0yNDAgMC0xMTUuNSA4MS41LTIxMS45IDE5MC4yLTIzNC44ek00NzcuOCAyODhsNjQgMGMxOC41IDAgMzMuMyAxNS43IDI5LjUgMzMuOC0xMC4yIDQ4LjQtMzUgOTEuNC02OS42IDEyNC4yLTEyLjMgMTEuNy0zMS42IDkuMi00Mi40LTMuOUwzNzQuOSAzNDAuNGMtMTcuMy0yMC45LTIuNC01Mi40IDI0LjYtNTIuNGw3OC4yIDB6Il0KICAgIH07CiAgICBmYVBpZUNoYXJ0ID0gZmFDaGFydFBpZTsKICAgIGZhRnJvZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmcm9nIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY1MmUiLCAiTTM2OCAzMmM0MS43IDAgNzUuOSAzMS44IDc5LjcgNzIuNWw4NS42IDI2LjNjMjUuNCA3LjggNDIuOCAzMS4zIDQyLjggNTcuOSAwIDIxLjgtMTEuNyA0MS45LTMwLjcgNTIuN2wtMTQ0LjUgODIuMSA5Mi41IDkyLjUgNTAuNyAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC02NCAwYy04LjUgMC0xNi42LTMuNC0yMi42LTkuNEwzNDYuOSAzNjAuMmMxMS43LTM2IDMuMi03Ny4xLTI1LjQtMTA1LjctNDAuNi00MC42LTEwNi4zLTQwLjYtMTQ2LjktLjFMMTAxIDMyNC40Yy02LjQgNi4xLTYuNyAxNi4yLS42IDIyLjZzMTYuMiA2LjYgMjIuNiAuNmw3My44LTcwLjIgLjEtLjEgLjEtLjFjMy41LTMuNSA3LjMtNi42IDExLjMtOS4yIDI3LjktMTguNSA2NS45LTE1LjQgOTAuNSA5LjIgMjQuNyAyNC43IDI3LjcgNjIuOSA5IDkwLjktMi42IDMuOC01LjYgNy41LTkgMTAuOUwyNjEuOCA0MTYgMzUyIDQxNmMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkw2NCA0ODBDMjguNyA0ODAgMCA0NTEuMyAwIDQxNiAwIDI0OS42IDEyNyAxMTIuOSAyODkuMyA5Ny41IDI5Ni4yIDYwLjIgMzI4LjggMzIgMzY4IDMyem0wIDEwNGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6Il0KICAgIH07CiAgICBmYVdpbmVCb3R0bGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid2luZS1ib3R0bGUiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZjcyZiIsICJNODAtMzJjMC0xNy43IDE0LjMtMzIgMzItMzJsOTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMiAwIDExLjgtNi40IDIyLjItMTYgMjcuN2wwIDE0NS42YzU2LjUgMjQuNyA5NiA4MS4xIDk2IDE0Ni43bDAgMjI0YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDU3NmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAyODhjMC02NS42IDM5LjUtMTIyIDk2LTE0Ni43TDk2LTQuM0M4Ni40LTkuOCA4MC0yMC4yIDgwLTMyek05NiAyODhjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgMTI4YzAgMTcuNyAxNC4zIDMyIDMyIDMybDEyOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMTI4YzAtMTcuNy0xNC4zLTMyLTMyLTMyTDk2IDI4OHoiXQogICAgfTsKICAgIGZhSW5ib3ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaW5ib3giLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjAxYyIsICJNOTEuOCAzMkM1OS45IDMyIDMyLjkgNTUuNCAyOC40IDg2LjlMLjYgMjgxLjJjLS40IDMtLjYgNi0uNiA5LjFMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xMjUuN2MwLTMtLjItNi4xLS42LTkuMUw0ODMuNiA4Ni45QzQ3OS4xIDU1LjQgNDUyLjEgMzIgNDIwLjIgMzJMOTEuOCAzMnptMCA2NGwzMjguNSAwIDI3LjQgMTkyLTU5LjkgMGMtMTIuMSAwLTIzLjIgNi44LTI4LjYgMTcuN2wtMTQuMyAyOC42Yy01LjQgMTAuOC0xNi41IDE3LjctMjguNiAxNy43bC0xMjAuNCAwYy0xMi4xIDAtMjMuMi02LjgtMjguNi0xNy43bC0xNC4zLTI4LjZjLTUuNC0xMC44LTE2LjUtMTcuNy0yOC42LTE3LjdMNjQuMyAyODggOTEuOCA5NnoiXQogICAgfTsKICAgIGZhU3F1YXJlSCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtaCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJoLXNxdWFyZSJdLCAiZjBmZCIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnpNMzIwIDE2OGwwIDE3NmMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTY0LTk2IDAgMCA2NGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTE3NmMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgNjQgOTYgMCAwLTY0YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjR6Il0KICAgIH07CiAgICBmYUhTcXVhcmUgPSBmYVNxdWFyZUg7CiAgICBmYUhvdXNlTWVkaWNhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VzZS1tZWRpY2FsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUzYjIiLCAiTTI3Ny44IDguNmMtMTIuMy0xMS40LTMxLjMtMTEuNC00My41IDBsLTIyNCAyMDhjLTkuNiA5LTEyLjggMjIuOS04IDM1LjFTMTguOCAyNzIgMzIgMjcybDE2IDAgMCAxNzZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjg4IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xNzYgMTYgMGMxMy4yIDAgMjUtOC4xIDI5LjgtMjAuM3MxLjYtMjYuMi04LTM1LjFsLTIyNC0yMDh6TTIyNCAyNDhjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgNDAgNDAgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTQwIDAgMCA0MGMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTQwLTQwIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmw0MCAwIDAtNDB6Il0KICAgIH07CiAgICBmYUNpcmNsZUNoZXZyb25SaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtY2hldnJvbi1yaWdodCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJjaGV2cm9uLWNpcmNsZS1yaWdodCJdLCAiZjEzOCIsICJNMCAyNTZhMjU2IDI1NiAwIDEgMCA1MTIgMCAyNTYgMjU2IDAgMSAwIC01MTIgMHpNMjQxIDM3N2MtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWw4Ny04Ny04Ny04N2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwTDM0NSAyMzljOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlMMjQxIDM3N3oiXQogICAgfTsKICAgIGZhQ2hldnJvbkNpcmNsZVJpZ2h0ID0gZmFDaXJjbGVDaGV2cm9uUmlnaHQ7CiAgICBmYUZpbGVDc3YgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1jc3YiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjZkZCIsICJNOTYgMEM2MC43IDAgMzIgMjguNyAzMiA2NGwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGw4MCAwIDAtMTEyYzAtMzUuMyAyOC43LTY0IDY0LTY0bDE3NiAwIDAtMTY1LjVjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNMMjkwLjcgMTguN0MyNzguNyA2LjcgMjYyLjUgMCAyNDUuNSAwTDk2IDB6TTM1Ny41IDE3NkwyNjQgMTc2Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNEwyNDAgNTguNSAzNTcuNSAxNzZ6TTI2NCAzODBjLTI0LjMgMC00NCAxOS43LTQ0IDQ0bDAgODBjMCAyNC4zIDE5LjcgNDQgNDQgNDRsMTYgMGMyNC4zIDAgNDQtMTkuNyA0NC00NGwwLThjMC0xMS05LTIwLTIwLTIwcy0yMCA5LTIwIDIwbDAgOGMwIDIuMi0xLjggNC00IDRsLTE2IDBjLTIuMiAwLTQtMS44LTQtNGwwLTgwYzAtMi4yIDEuOC00IDQtNGwxNiAwYzIuMiAwIDQgMS44IDQgNGwwIDhjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC04YzAtMjQuMy0xOS43LTQ0LTQ0LTQ0bC0xNiAwem0xMzYgMGMtMjguNyAwLTUyIDIzLjMtNTIgNTJzMjMuMyA1MiA1MiA1MmM2LjYgMCAxMiA1LjQgMTIgMTJzLTUuNCAxMi0xMiAxMmwtMzIgMGMtMTEgMC0yMCA5LTIwIDIwczkgMjAgMjAgMjBsMzIgMGMyOC43IDAgNTItMjMuMyA1Mi01MnMtMjMuMy01Mi01Mi01MmMtNi42IDAtMTItNS40LTEyLTEyczUuNC0xMiAxMi0xMmwyNCAwYzExIDAgMjAtOSAyMC0yMHMtOS0yMC0yMC0yMGwtMjQgMHptOTYgMGMtMTEgMC0yMCA5LTIwIDIwbDAgMzEuNmMwIDM1LjUgMTAuNSA3MC4zIDMwLjIgOTkuOGw1LjEgNy43YzMuNyA1LjYgMTAgOC45IDE2LjYgOC45czEyLjktMy4zIDE2LjYtOC45bDUuMS03LjdjMTkuNy0yOS42IDMwLjItNjQuMyAzMC4yLTk5LjhsMC0zMS42YzAtMTEtOS0yMC0yMC0yMHMtMjAgOS0yMCAyMGwwIDMxLjZjMCAxOS42LTQuMSAzOC45LTEyIDU2LjctNy45LTE3LjgtMTItMzcuMS0xMi01Ni43bDAtMzEuNmMwLTExLTktMjAtMjAtMjB6Il0KICAgIH07CiAgICBmYUhhdENvd2JveSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYXQtY293Ym95IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY4YzAiLCAiTTE4Mi4yIDc2LjFMMTMwLjggMzA3LjVDMTQ1LjUgMzI0LjkgMTY3LjQgMzM2IDE5MiAzMzZsMjU2IDBjMjQuNiAwIDQ2LjUtMTEuMSA2MS4yLTI4LjVMNDU3LjggNzYuMWMtNS43LTI1LjgtMjguNi00NC4xLTU1LTQ0LjEtMTIuMiAwLTI0LjEgNC0zMy44IDExLjNsLTQuNyAzLjVjLTI2LjMgMTkuNy02Mi40IDE5LjctODguNiAwTDI3MSA0My4zYy05LjgtNy4zLTIxLjYtMTEuMy0zMy44LTExLjMtMjYuNCAwLTQ5LjMgMTguMy01NSA0NC4xek02NCAyNTZjMC0xNy43LTE0LjMtMzItMzItMzJTMCAyMzguMyAwIDI1NkMwIDM2MiA4NiA0NDggMTkyIDQ0OGwyNTYgMGMxMDYgMCAxOTItODYgMTkyLTE5MiAwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmMwIDcwLjctNTcuMyAxMjgtMTI4IDEyOGwtMjU2IDBjLTcwLjcgMC0xMjgtNTcuMy0xMjgtMTI4eiJdCiAgICB9OwogICAgZmFGYWNlR3JpblRvbmd1ZVdpbmsyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi10b25ndWUtd2luayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU0MCwgImdyaW4tdG9uZ3VlLXdpbmsiXSwgImY1OGIiLCAiTTE1Mi4yIDQ5MC4xQzYyLjUgNDUwLjIgMCAzNjAuNCAwIDI1NiAwIDExNC42IDExNC42IDAgMjU2IDBTNTEyIDExNC42IDUxMiAyNTZjMCAxMDQuNC02Mi41IDE5NC4yLTE1Mi4yIDIzNC4xIDUuMy0xMyA4LjItMjcuMiA4LjItNDIuMWwwLTYxLjdjMTYuOS0xNi41IDMwLjEtMzYuNyAzOC4zLTU5LjMgNC4zLTExLjgtNy43LTIxLjgtMTkuNi0xOC4xLTM5LjIgMTIuMi04My43IDE5LjEtMTMwLjcgMTkuMXMtOTEuNS02LjktMTMwLjctMTkuMWMtMTEuOS0zLjctMjMuOSA2LjMtMTkuNiAxOC4xIDguMyAyMi42IDIxLjUgNDIuOCAzOC4zIDU5LjNsMCA2MS43YzAgMTQuOSAyLjkgMjkuMSA4LjIgNDIuMXpNMTUyIDIxMmwxNiAwYzExIDAgMjAgOSAyMCAyMHM5IDIwIDIwIDIwIDIwLTkgMjAtMjBjMC0zMy4xLTI2LjktNjAtNjAtNjBsLTE2IDBjLTMzLjEgMC02MCAyNi45LTYwIDYwIDAgMTEgOSAyMCAyMCAyMHMyMC05IDIwLTIwIDktMjAgMjAtMjB6bTE4NCA2MGE2NCA2NCAwIDEgMCAwLTEyOCA2NCA2NCAwIDEgMCAwIDEyOHpNMzIwIDQwMi42bDAgNDUuNGMwIDM1LjMtMjguNyA2NC02NCA2NHMtNjQtMjguNy02NC02NGwwLTQ1LjRjMC0xNC43IDExLjktMjYuNiAyNi42LTI2LjZsMiAwYzExLjMgMCAyMS4xIDcuOSAyMy42IDE4LjkgMi44IDEyLjYgMjAuOCAxMi42IDIzLjYgMCAyLjUtMTEuMSAxMi4zLTE4LjkgMjMuNi0xOC45bDIgMGMxNC43IDAgMjYuNiAxMS45IDI2LjYgMjYuNnpNMzM2IDE4NGEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6Il0KICAgIH07CiAgICBmYUdyaW5Ub25ndWVXaW5rMiA9IGZhRmFjZUdyaW5Ub25ndWVXaW5rMjsKICAgIGZhTCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbMTA4XSwgIjRjIiwgIk02NCAzMmMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDM1MiAxOTIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkw2NCA0ODBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyTDMyIDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyeiJdCiAgICB9OwogICAgZmFBcnJvd0Rvd25TaG9ydFdpZGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctZG93bi1zaG9ydC13aWRlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInNvcnQtYW1vdW50LWRlc2MiLCAic29ydC1hbW91bnQtZG93bi1hbHQiXSwgImY4ODQiLCAiTTI0Ni42IDM3NC42bC05NiA5NmMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBsLTk2LTk2Yy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM3MzMi44LTEyLjUgNDUuMyAwTDk2IDM3MC43IDk2IDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAzMDYuNyA0MS40LTQxLjRjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM3pNMzIwIDMybDMyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJ6bTAgMTI4bDk2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTk2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJ6bTAgMTI4bDE2MCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0xNjAgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMnptMCAxMjhsMjI0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTIyNCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMyeiJdCiAgICB9OwogICAgZmFTb3J0QW1vdW50RGVzYyA9IGZhQXJyb3dEb3duU2hvcnRXaWRlOwogICAgZmFTb3J0QW1vdW50RG93bkFsdCA9IGZhQXJyb3dEb3duU2hvcnRXaWRlOwogICAgZmFIb3VyZ2xhc3NIYWxmMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VyZ2xhc3MtaGFsZiIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJob3VyZ2xhc3MtMiJdLCAiZjI1MiIsICJNMzIgMEMxNC4zIDAgMCAxNC4zIDAgMzJTMTQuMyA2NCAzMiA2NGwwIDExYzAgNDIuNCAxNi45IDgzLjEgNDYuOSAxMTMuMWw2Ny45IDY3LjktNjcuOSA2Ny45QzQ4LjkgMzUzLjkgMzIgMzk0LjYgMzIgNDM3bDAgMTFjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzIwIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsMC0xMWMwLTQyLjQtMTYuOS04My4xLTQ2LjktMTEzLjFsLTY3LjktNjcuOSA2Ny45LTY3LjljMzAtMzAgNDYuOS03MC43IDQ2LjktMTEzLjFsMC0xMWMxNy43IDAgMzItMTQuMyAzMi0zMlMzNjkuNyAwIDM1MiAwTDMyIDB6TTk2IDc1bDAtMTEgMTkyIDAgMCAxMWMwIDE5LTUuNiAzNy40LTE2IDUzTDExMiAxMjhjLTEwLjMtMTUuNi0xNi0zNC0xNi01M3ptMTYgMzA5YzMuNS01LjMgNy42LTEwLjMgMTIuMS0xNC45bDY3LjktNjcuOSA2Ny45IDY3LjljNC42IDQuNiA4LjYgOS42IDEyLjIgMTQuOUwxMTIgMzg0eiJdCiAgICB9OwogICAgZmFIb3VyZ2xhc3MyMiA9IGZhSG91cmdsYXNzSGFsZjI7CiAgICBmYVNwb29uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNwb29uIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI5MzQ4LCA2MTg3MywgInV0ZW5zaWwtc3Bvb24iXSwgImYyZTUiLCAiTTI0NS44IDIyMC45Yy0xNC41LTE3LjYtMjEuOC0zOS4yLTIxLjgtNjAuOCAwLTgwLjIgOTYtMTYwLjIgMTkyLTE2MC4yIDUzIDAgOTYgNDMgOTYgOTYgMCA5Ni04MCAxOTItMTYwLjIgMTkyLTIxLjYgMC00My4yLTcuMy02MC44LTIxLjhMNTQuNiA1MDIuNmMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNMMjQ1LjggMjIwLjl6Il0KICAgIH07CiAgICBmYVV0ZW5zaWxTcG9vbiA9IGZhU3Bvb247CiAgICBmYUNyZWRpdENhcmQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNyZWRpdC1jYXJkIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MTc5LCA2MjA4MywgImNyZWRpdC1jYXJkLWFsdCJdLCAiZjA5ZCIsICJNMCAxMjhsMCAzMiA1MTIgMCAwLTMyYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDY0QzI4LjcgNjQgMCA5Mi43IDAgMTI4em0wIDgwTDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTc2LTUxMiAwek02NCAzNjBjMC0xMy4zIDEwLjctMjQgMjQtMjRsNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNDggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjR6bTE0NCAwYzAtMTMuMyAxMC43LTI0IDI0LTI0bDY0IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTY0IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0eiJdCiAgICB9OwogICAgZmFDcmVkaXRDYXJkQWx0MiA9IGZhQ3JlZGl0Q2FyZDI7CiAgICBmYUZpbGVJbnZvaWNlRG9sbGFyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbGUtaW52b2ljZS1kb2xsYXIiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjU3MSIsICJNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMMjEzLjUgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN0wzNjUuMyAxMjUuM2MxMiAxMiAxOC43IDI4LjMgMTguNyA0NS4zTDM4NCA0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDY0em0yMDgtNS41bDAgOTMuNWMwIDEzLjMgMTAuNyAyNCAyNCAyNEwzMjUuNSAxNzYgMjA4IDU4LjV6TTY0IDg4YzAgMTMuMyAxMC43IDI0IDI0IDI0bDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRMODggNjRDNzQuNyA2NCA2NCA3NC43IDY0IDg4em0wIDk2YzAgMTMuMyAxMC43IDI0IDI0IDI0bDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTQ4IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0em0xMTIgNzZsMCA0Yy0yOC44IC4zLTUyIDIzLjctNTIgNTIuNSAwIDI1LjcgMTguNSA0Ny42IDQzLjkgNTEuOGw0MS43IDdjNiAxIDEwLjQgNi4yIDEwLjQgMTIuMyAwIDYuOS01LjYgMTIuNS0xMi41IDEyLjVMMTUyIDQwMGMtMTEgMC0yMCA5LTIwIDIwczkgMjAgMjAgMjBsMjQgMCAwIDRjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC00LjdjMjUtNC4xIDQ0LTI1LjcgNDQtNTEuOCAwLTI1LjctMTguNS00Ny42LTQzLjktNTEuOGwtNDEuNy03Yy02LTEtMTAuNC02LjItMTAuNC0xMi4zIDAtNi45IDUuNi0xMi41IDEyLjUtMTIuNWw0Ny41IDBjMTEgMCAyMC05IDIwLTIwcy05LTIwLTIwLTIwbC04IDAgMC00YzAtMTEtOS0yMC0yMC0yMHMtMjAgOS0yMCAyMHoiXQogICAgfTsKICAgIGZhU3BhZ2hldHRpTW9uc3RlckZseWluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcGFnaGV0dGktbW9uc3Rlci1mbHlpbmciLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsicGFzdGFmYXJpYW5pc20iXSwgImY2N2IiLCAiTTIwOCA2NGExNiAxNiAwIDEgMCAtMzIgMCAxNiAxNiAwIDEgMCAzMiAwem00OCAwYzAgMTYuMi02IDMxLjEtMTYgNDIuM2wxNS42IDMxLjJjMTguNy02IDM5LjktOS41IDY0LjQtOS41czQ1LjggMy41IDY0LjQgOS41TDQwMCAxMDYuM2MtMTAtMTEuMy0xNi0yNi4xLTE2LTQyLjMgMC0zNS4zIDI4LjctNjQgNjQtNjRzNjQgMjguNyA2NCA2NC0yOC43IDY0LTY0IDY0Yy0xLjcgMC0zLjQtLjEtNS4xLS4yTDQyNy44IDE1OGMyMS4xIDEzLjYgMzcuNyAzMC4yIDUxLjQgNDYuNCA3LjEgOC4zIDEzLjUgMTYuNiAxOS4zIDI0bDEuNCAxLjhjNi4zIDguMSAxMS42IDE0LjggMTYuNyAyMC40IDEwLjcgMTEuNyAxNi4xIDEzLjQgMTkuNCAxMy40IDIuNSAwIDQuMy0uNiA3LjEtMy4zIDMuNy0zLjUgNy4xLTguOCAxMi41LTE3LjRsLjYtLjljNC42LTcuNCAxMS0xNy42IDE5LjQtMjUuNyA5LjctOS4zIDIyLjktMTYuNyA0MC40LTE2LjcgMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRjLTIuNSAwLTQuMyAuNi03LjEgMy4zLTMuNyAzLjUtNy4xIDguOC0xMi41IDE3LjRsLS42IC45Yy00LjYgNy40LTExIDE3LjYtMTkuNCAyNS43LTkuNyA5LjMtMjIuOSAxNi43LTQwLjQgMTYuNy0xOC41IDAtMzIuOS04LjUtNDQuMy0xOC42LTMuMSA0LTYuNiA4LjMtMTAuNSAxMi43IDEuNCA0LjMgMi44IDguNSA0IDEyLjUgLjkgMyAxLjggNS44IDIuNiA4LjYgMyA5LjggNS41IDE4LjIgOC42IDI1LjkgMy45IDkuOCA3LjQgMTUuNCAxMC44IDE4LjUgMi42IDIuNCA1LjkgNC4zIDEyLjggNC4zIDguNyAwIDE2LjktNC4yIDMzLjctMTMuMiAxNS04IDM1LjctMTguOCA2Mi4zLTE4LjggMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRjLTEzLjQgMC0yNC43IDUuMi0zOS43IDEzLjItMSAuNi0yLjEgMS4xLTMuMiAxLjctMTMuMSA3LjEtMzEuNiAxNy4xLTUzLjEgMTcuMS0xOC40IDAtMzMuNi02LjEtNDUuNS0xNy4yLTExLjEtMTAuMy0xNy45LTIzLjctMjIuNy0zNi0zLjYtOS02LjctMTkuMS05LjUtMjguNS0xNi40IDEyLjMtMzYuMSAyMy42LTU4LjkgMzEuMyAzLjYgMTAuOCA4LjQgMjMuNSAxNC40IDM2LjIgNy41IDE1LjkgMTYuMiAzMC40IDI1LjggNDAuNSA5LjYgMTAuMiAxNy43IDEzLjcgMjQuNSAxMy43IDEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0Yy0yNS4yIDAtNDUtMTMuNS01OS41LTI4LjgtMTQuNS0xNS40LTI1LjctMzQuOS0zNC4yLTUzLTgtMTctMTQuMS0zMy44LTE4LjMtNDYuOS01LjIgLjQtMTAuNiAuNi0xNiAuNnMtMTAuOC0uMi0xNi0uNmMtNC4yIDEzLTEwLjMgMjkuOS0xOC4zIDQ2LjktOC41IDE4LjEtMTkuOCAzNy42LTM0LjIgNTMtMTQuNCAxNS4zLTM0LjMgMjguOC01OS41IDI4LjgtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGM2LjggMCAxNS0zLjUgMjQuNS0xMy43IDkuNS0xMC4xIDE4LjMtMjQuNiAyNS44LTQwLjUgNS45LTEyLjYgMTAuNy0yNS40IDE0LjQtMzYuMi0yMi44LTcuNy00Mi41LTE5LTU4LjktMzEuMy0yLjkgOS40LTYgMTkuNS05LjUgMjguNS00LjggMTIuMi0xMS42IDI1LjYtMjIuNyAzNi0xMS45IDExLjEtMjcuMSAxNy4yLTQ1LjUgMTcuMi0xMy4xIDAtMjQuNS00LjEtMzMuOC04LjktNy45LTQtMTUuNy05LjItMjIuMS0xMy41bDAgMC0yLjQtMS42Yy0xNS4zLTEwLjItMjUuOC0xNi0zNy43LTE2LTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRjMjguMSAwIDQ5LjYgMTQuMiA2NC4zIDI0bDIuNCAxLjZjNi45IDQuNiAxMi4xIDguMSAxNy4yIDEwLjcgNS41IDIuOCA5LjEgMy42IDEyIDMuNiA2LjggMCAxMC4yLTEuOSAxMi44LTQuMyAzLjQtMy4yIDctOC44IDEwLjgtMTguNSAzLTcuNyA1LjYtMTYuMSA4LjYtMjUuOSAuOC0yLjcgMS43LTUuNiAyLjYtOC42IDEuMi00IDIuNi04LjIgNC0xMi41LTMuOS00LjUtNy40LTguOC0xMC41LTEyLjctMTEuNCAxMC4xLTI1LjkgMTguNi00NC4zIDE4LjYtMTcuNSAwLTMwLjctNy40LTQwLjQtMTYuNy04LjQtOC4xLTE0LjgtMTguMy0xOS40LTI1LjdsLS42LS45Yy01LjQtOC42LTguOC0xMy45LTEyLjUtMTcuNC0yLjgtMi43LTQuNi0zLjMtNy4xLTMuMy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0YzE3LjUgMCAzMC43IDcuNCA0MC40IDE2LjcgOC40IDguMSAxNC44IDE4LjMgMTkuNCAyNS43bC42IC45YzUuNCA4LjYgOC44IDEzLjkgMTIuNSAxNy40IDIuOCAyLjcgNC42IDMuMyA3LjEgMy4zIDMuMyAwIDguNy0xLjcgMTkuNC0xMy40IDUuMS01LjYgMTAuNC0xMi4zIDE2LjctMjAuNGwxLjQtMS44YzUuOC03LjQgMTIuMi0xNS43IDE5LjMtMjQgMTMuOC0xNi4yIDMwLjMtMzIuOCA1MS40LTQ2LjRsLTE1LjEtMzAuMmMtMS43IC4xLTMuNCAuMi01LjEgLjItMzUuMyAwLTY0LTI4LjctNjQtNjRzMjguNy02NCA2NC02NCA2NCAyOC43IDY0IDY0em0yMDggMGExNiAxNiAwIDEgMCAtMzIgMCAxNiAxNiAwIDEgMCAzMiAweiJdCiAgICB9OwogICAgZmFQYXN0YWZhcmlhbmlzbSA9IGZhU3BhZ2hldHRpTW9uc3RlckZseWluZzsKICAgIGZhTWFydGluaUdsYXNzQ2l0cnVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hcnRpbmktZ2xhc3MtY2l0cnVzIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbImNvY2t0YWlsIl0sICJmNTYxIiwgIk01NzYgODBjMC00NC4yLTM1LjgtODAtODAtODAtMTggMC0zNC42IDYtNDggMTZsLTgxIDBjMjMuNi00Ny40IDcyLjUtODAgMTI5LTgwIDc5LjUgMCAxNDQgNjQuNSAxNDQgMTQ0UzU3NS41IDIyNCA0OTYgMjI0Yy02LjUgMC0xMy0uNC0xOS4zLTEuM2w2NC03NC43YzEuMS0xLjMgMi4yLTIuNyAzLjMtNC4xIDE5LjQtMTQuNiAzMi0zNy44IDMyLTY0ek02Ni45IDgyLjZDNzIuMiA3MS4zIDgzLjUgNjQgOTYgNjRsMzg0IDBjMTIuNSAwIDIzLjggNy4zIDI5LjEgMTguNnMzLjQgMjQuNy00LjggMzQuMmwtMTg0LjMgMjE1IDAgMTE2LjIgNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTkyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsNjQgMCAwLTExNi4yLTE4NC4zLTIxNWMtOC4xLTkuNS0xMC0yMi44LTQuOC0zNC4yek0xNjUuNiAxMjhMMjg4IDI3MC44IDQxMC40IDEyOCAxNjUuNiAxMjh6Il0KICAgIH07CiAgICBmYUNvY2t0YWlsID0gZmFNYXJ0aW5pR2xhc3NDaXRydXM7CiAgICBmYUJ1bGxob3JuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJ1bGxob3JuIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MjI2LCAxMjgzNjNdLCAiZjBhMSIsICJNNDYxLjIgMTguOUM0NzIuNyAyNCA0ODAgMzUuNCA0ODAgNDhsMCA0MTZjMCAxMi42LTcuMyAyNC0xOC44IDI5LjFzLTI0LjggMy4yLTM0LjMtNS4xbC00Ni42LTQwLjdjLTQzLjYtMzguMS05OC43LTYwLjMtMTU2LjQtNjNsMCA5NS43YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTk2QzU3LjMgMzg0IDAgMzI2LjcgMCAyNTZTNTcuMyAxMjggMTI4IDEyOGw4NC41IDBjNjEuOC0uMiAxMjEuNC0yMi43IDE2Ny45LTYzLjNsNDYuNi00MC43YzkuNC04LjMgMjIuOS0xMC4yIDM0LjMtNS4xek0yMjQgMzIwbDAgLjJjNzAuMyAyLjcgMTM3LjggMjguNSAxOTIgNzMuNGwwLTI3NS4zYy01NC4yIDQ0LjktMTIxLjcgNzAuNy0xOTIgNzMuNEwyMjQgMzIweiJdCiAgICB9OwogICAgZmFCb3hUaXNzdWUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm94LXRpc3N1ZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMDViIiwgIk0xMDMuOSAzMmwxNjEgMGMxMy44IDAgMjYgOC44IDMwLjQgMjEuOWwxNy40IDUyLjJjNC40IDEzLjEgMTYuNiAyMS45IDMwLjQgMjEuOWw2MC41IDBjMjEuOCAwIDM3LjMgMjEuNCAzMC40IDQyLjFMMzg0IDMyMCAxMjggMzIwIDcyLjcgNzAuOUM2OC4yIDUxIDgzLjQgMzIgMTAzLjkgMzJ6TTQ4IDI1NmwxNi42IDAgMTYuNSA3NC40Qzg2IDM1Mi40IDEwNS41IDM2OCAxMjggMzY4bDI1NiAwYzIwLjcgMCAzOS0xMy4yIDQ1LjUtMzIuOGwyNi40LTc5LjIgOC4xIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAxMjhjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNDgwYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDMwNGMwLTI2LjUgMjEuNS00OCA0OC00OHoiXQogICAgfTsKICAgIGZhTWF0dHJlc3NQaWxsb3cgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWF0dHJlc3MtcGlsbG93IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1MjUiLCAiTTI1NiA2NEw2NCA2NEMyOC43IDY0IDAgOTIuNyAwIDEyOEwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxOTIgMCAwLTM4NHptNDggMzg0bDIwOCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0bC0yMDggMCAwIDM4NHpNNjQgMTYwYzAtMTcuNyAxNC4zLTMyIDMyLTMybDY0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxOTJjMCAxNy43LTE0LjMgMzItMzIgMzJsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTkyeiJdCiAgICB9OwogICAgZmFDaGV2cm9uTGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGV2cm9uLWxlZnQiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFs5MDAxXSwgImYwNTMiLCAiTTkuNCAyMzMuNGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNsMTkyIDE5MmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zTDc3LjMgMjU2IDI0Ni42IDg2LjZjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBsLTE5MiAxOTJ6Il0KICAgIH07CiAgICBmYUNsb3VkTW9vblJhaW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2xvdWQtbW9vbi1yYWluIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY3M2MiLCAiTTQ0OCAwYy02OC42IDAtMTI3LjEgNDMuMS0xNDkuOCAxMDMuOCAxNy4xIDE0LjEgMjkuNiAzMy41IDM0LjkgNTUuOCAzOS45IDIxLjcgNjYuOSA2My45IDY2LjkgMTEyLjUgMCAxMy41LTIuMSAyNi41LTUuOSAzOC43IDE2LjkgNiAzNSA5LjMgNTMuOSA5LjMgNDMgMCA4Mi4xLTE3IDExMC44LTQ0LjYgNC42LTQuNCA1LjktMTEuMiAzLjMtMTdzLTguNi05LjMtMTQuOS04LjhjLTMgLjItNi4xIC40LTkuMiAuNC02My41IDAtMTE1LTUxLjUtMTE1LTExNSAwLTQ1LjEgMjYtODQuMiA2My44LTEwMyA1LjctMi44IDktOC45IDguMi0xNS4yUzQ4OS42IDUuMyA0ODMuNCAzLjlDNDcyIDEuNCA0NjAuMiAwIDQ0OCAwek0yNzIgMzUyYzQ0LjIgMCA4MC0zNS44IDgwLTgwIDAtMzktMjcuOS03MS41LTY0LjgtNzguNiAuNS0zLjEgLjgtNi4yIC44LTkuNCAwLTMwLjktMjUuMS01Ni01Ni01Ni0xMi40IDAtMjMuOSA0LTMzLjEgMTAuOC0xMy40LTI1LjUtNDAuMS00Mi44LTcwLjktNDIuOC00NC4yIDAtODAgMzUuOC04MCA4MCAwIDcuNCAxIDE0LjYgMi45IDIxLjUtMjkuOCAxMS42LTUwLjkgNDAuNi01MC45IDc0LjUgMCA0NC4yIDM1LjggODAgODAgODBsMTkyIDB6TTY5IDQwMS4xYy0xMi42LTQuMi0yNi4yIDIuNi0zMC40IDE1LjJMMTcuMiA0ODAuNEMxMyA0OTMgMTkuOCA1MDYuNiAzMi40IDUxMC44czI2LjItMi42IDMwLjQtMTUuMmwyMS40LTY0LjFjNC4yLTEyLjYtMi42LTI2LjItMTUuMi0zMC40em0xMjAgMGMtMTIuNi00LjItMjYuMiAyLjYtMzAuNCAxNS4ybC0yMS40IDY0LjFjLTQuMiAxMi42IDIuNiAyNi4yIDE1LjIgMzAuNHMyNi4yLTIuNiAzMC40LTE1LjJsMjEuNC02NC4xYzQuMi0xMi42LTIuNi0yNi4yLTE1LjItMzAuNHptMTIwIDBjLTEyLjYtNC4yLTI2LjIgMi42LTMwLjQgMTUuMmwtMjEuNCA2NC4xYy00LjIgMTIuNiAyLjYgMjYuMiAxNS4yIDMwLjRzMjYuMi0yLjYgMzAuNC0xNS4ybDIxLjQtNjQuMWM0LjItMTIuNi0yLjYtMjYuMi0xNS4yLTMwLjR6Il0KICAgIH07CiAgICBmYUFycm93RG93bjE5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LWRvd24tMS05IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNvcnQtbnVtZXJpYy1hc2MiLCAic29ydC1udW1lcmljLWRvd24iXSwgImYxNjIiLCAiTTQxOC43IDM4YzguMyA2IDEzLjMgMTUuNyAxMy4zIDI2bDAgOTYgMTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtOTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxNiAwIDAtNTEuNi01LjkgMmMtMTYuOCA1LjYtMzQuOS0zLjUtNDAuNS0yMC4yczMuNS0zNC45IDIwLjItNDAuNWw0OC0xNmM5LjgtMy4zIDIwLjUtMS42IDI4LjggNC40ek0zNjUuMSA0MzAuNmwxMS43LTE4Yy0zMi45LTkuOS01Ni44LTQwLjUtNTYuOC03Ni42IDAtNDQuMiAzNS44LTgwIDgwLTgwczgwIDM1LjggODAgODBjMCAyMi45LTYuNiA0NS4zLTE5LjEgNjQuNWwtNDIuMSA2NC45Yy05LjYgMTQuOC0yOS40IDE5LjEtNDQuMyA5LjRzLTE5LjEtMjkuNC05LjQtNDQuM3pNNDI0IDMzNmEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAwek0xNTAuNiA0NzAuNmMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBsLTk2LTk2Yy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM3MzMi44LTEyLjUgNDUuMyAwTDk2IDM3MC43IDk2IDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAzMDYuNyA0MS40LTQxLjRjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM2wtOTYgOTZ6Il0KICAgIH07CiAgICBmYVNvcnROdW1lcmljQXNjID0gZmFBcnJvd0Rvd24xOTsKICAgIGZhU29ydE51bWVyaWNEb3duID0gZmFBcnJvd0Rvd24xOTsKICAgIGZhSGFuZFNwb2NrMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kLXNwb2NrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NDA2XSwgImYyNTkiLCAiTTIxNC45IDIzLjdDMjEwLjMgNi42IDE5Mi44LTMuNSAxNzUuNyAxLjFzLTI3LjIgMjIuMS0yMi42IDM5LjJMMjA2IDIzNy44YzIuNSA5LjItNC41IDE4LjItMTQgMTguMi02LjQgMC0xMi00LjItMTMuOS0xMC4zTDEzNC42IDEwMi43Yy01LjEtMTYuOS0yMy0yNi40LTM5LjktMjEuM3MtMjYuNCAyMy0yMS4zIDM5LjlsNjIuOCAyMDYuNGMyLjQgNy45LTcuMiAxMy44LTEzLjIgOC4xTDY3LjYgMjgzYy0xNi0xNS4yLTQxLjMtMTQuNi01Ni42IDEuNFMtMy42IDMyNS43IDEyLjQgMzQxTDEyNC44IDQ0OGM0My4xIDQxLjEgMTAwLjQgNjQgMTYwIDY0bDE5LjEgMGMuMSAwIC4xLS4xIC4xLS4xcy4xLS4xIC4xLS4xYzU4LjMtMy41IDEwOC42LTQzLjIgMTI1LjMtOTkuN2w4MS4yLTI3NWM1LTE2LjktNC43LTM0LjctMjEuNi0zOS44cy0zNC43IDQuNy0zOS44IDIxLjZMNDExLjUgMjQ3LjFjLTEuNiA1LjMtNi40IDguOS0xMiA4LjktNy45IDAtMTMuOC03LjMtMTIuMi0xNS4xbDM2LTE3MC4zYzMuNy0xNy4zLTcuNC0zNC4zLTI0LjctMzcuOXMtMzQuMyA3LjQtMzcuOSAyNC43TDMyMy4xIDIzNS4xYy0yLjYgMTIuMi0xMy4zIDIwLjktMjUuOCAyMC45LTExLjkgMC0yMi40LTgtMjUuNC0xOS41bC01Ny0yMTIuOHoiXQogICAgfTsKICAgIGZhV2FuZE1hZ2ljU3BhcmtsZXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid2FuZC1tYWdpYy1zcGFya2xlcyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJtYWdpYy13YW5kLXNwYXJrbGVzIl0sICJlMmNhIiwgIk0yNjMuNC0yN0wyNzguMiA5LjggMzE1IDI0LjZjMyAxLjIgNSA0LjIgNSA3LjRzLTIgNi4yLTUgNy40TDI3OC4yIDU0LjIgMjYzLjQgOTFjLTEuMiAzLTQuMiA1LTcuNCA1cy02LjItMi03LjQtNUwyMzMuOCA1NC4yIDE5NyAzOS40Yy0zLTEuMi01LTQuMi01LTcuNHMyLTYuMiA1LTcuNEwyMzMuOCA5LjggMjQ4LjYtMjdjMS4yLTMgNC4yLTUgNy40LTVzNi4yIDIgNy40IDV6TTExMC43IDQxLjdsMjEuNSA1MC4xIDUwLjEgMjEuNWM1LjkgMi41IDkuNyA4LjMgOS43IDE0LjdzLTMuOCAxMi4yLTkuNyAxNC43bC01MC4xIDIxLjUtMjEuNSA1MC4xYy0yLjUgNS45LTguMyA5LjctMTQuNyA5LjdzLTEyLjItMy44LTE0LjctOS43TDU5LjggMTY0LjIgOS43IDE0Mi43QzMuOCAxNDAuMiAwIDEzNC40IDAgMTI4czMuOC0xMi4yIDkuNy0xNC43TDU5LjggOTEuOCA4MS4zIDQxLjdDODMuOCAzNS44IDg5LjYgMzIgOTYgMzJzMTIuMiAzLjggMTQuNyA5Ljd6TTQ2NCAzMDRjNi40IDAgMTIuMiAzLjggMTQuNyA5LjdsMjEuNSA1MC4xIDUwLjEgMjEuNWM1LjkgMi41IDkuNyA4LjMgOS43IDE0LjdzLTMuOCAxMi4yLTkuNyAxNC43bC01MC4xIDIxLjUtMjEuNSA1MC4xYy0yLjUgNS45LTguMyA5LjctMTQuNyA5LjdzLTEyLjItMy44LTE0LjctOS43bC0yMS41LTUwLjEtNTAuMS0yMS41Yy01LjktMi41LTkuNy04LjMtOS43LTE0LjdzMy44LTEyLjIgOS43LTE0LjdsNTAuMS0yMS41IDIxLjUtNTAuMWMyLjUtNS45IDguMy05LjcgMTQuNy05Ljd6TTQ2MCAwYzExIDAgMjEuNiA0LjQgMjkuNSAxMi4ybDQyLjMgNDIuM0M1MzkuNiA2Mi40IDU0NCA3MyA1NDQgODRzLTQuNCAyMS42LTEyLjIgMjkuNWwtODguMiA4OC4yLTEwMS4zLTEwMS4zIDg4LjItODguMkM0MzguNCA0LjQgNDQ5IDAgNDYwIDB6TTQ0LjIgMzk4LjVMMzA4LjQgMTM0LjMgNDA5LjcgMjM1LjYgMTQ1LjUgNDk5LjhDMTM3LjYgNTA3LjYgMTI3IDUxMiAxMTYgNTEycy0yMS42LTQuNC0yOS41LTEyLjJMNDQuMiA0NTcuNUMzNi40IDQ0OS42IDMyIDQzOSAzMiA0MjhzNC40LTIxLjYgMTIuMi0yOS41eiJdCiAgICB9OwogICAgZmFNYWdpY1dhbmRTcGFya2xlcyA9IGZhV2FuZE1hZ2ljU3BhcmtsZXM7CiAgICBmYUNvbW1lbnRNZWRpY2FsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvbW1lbnQtbWVkaWNhbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmN2Y1IiwgIk0yNTYgNDgwYzE0MS40IDAgMjU2LTEwNy41IDI1Ni0yNDBTMzk3LjQgMCAyNTYgMCAwIDEwNy41IDAgMjQwYzAgNTQuMyAxOS4yIDEwNC4zIDUxLjYgMTQ0LjVMMi44IDQ3Ni44Yy00LjggOS0zLjMgMjAgMy42IDI3LjVzMTcuOCA5LjggMjcuMSA1LjhsMTE4LjQtNTAuN0MxODMuNyA0NzIuNiAyMTguOSA0ODAgMjU2IDQ4MHpNMjE3LjYgMTUzLjZjMC0xMC42IDguNi0xOS4yIDE5LjItMTkuMmwzOC40IDBjMTAuNiAwIDE5LjIgOC42IDE5LjIgMTkuMmwwIDQ4IDQ4IDBjMTAuNiAwIDE5LjIgOC42IDE5LjIgMTkuMmwwIDM4LjRjMCAxMC42LTguNiAxOS4yLTE5LjIgMTkuMmwtNDggMCAwIDQ4YzAgMTAuNi04LjYgMTkuMi0xOS4yIDE5LjJsLTM4LjQgMGMtMTAuNiAwLTE5LjItOC42LTE5LjItMTkuMmwwLTQ4LTQ4IDBjLTEwLjYgMC0xOS4yLTguNi0xOS4yLTE5LjJsMC0zOC40YzAtMTAuNiA4LjYtMTkuMiAxOS4yLTE5LjJsNDggMCAwLTQ4eiJdCiAgICB9OwogICAgZmFCZWxsU2xhc2gyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJlbGwtc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgyNzcsIDYxOTQzXSwgImYxZjYiLCAiTTQxLTI0LjljLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwUy0yLjMtLjMgNyA5LjFsNTI4IDUyOGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTg3LjUtODcuNWMxNy4yLTIuNCAzMC41LTE3LjMgMzAuNS0zNS4yIDAtOC4xLTIuNy0xNS45LTcuOC0yMi4ybC05LjgtMTIuMkM0NjQuNCAzMDguNSA0NDggMjYxLjggNDQ4IDIxMy43bDAtMjEuN2MwLTc3LjQtNTUtMTQyLTEyOC0xNTYuOGwwLTMuMmMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDMuMmMtMzguNiA3LjgtNzIuMiAyOS42LTk1LjIgNTkuN0w0MS0yNC45em04NyAyMzguNWMwIDQ4LjEtMTYuNCA5NC44LTQ2LjQgMTMyLjRsLTkuOCAxMi4yYy01IDYuMy03LjggMTQuMS03LjggMjIuMiAwIDE5LjYgMTUuOSAzNS41IDM1LjUgMzUuNWwyMzUuMyAwLTIwNi45LTIwNi45IDAgNC41ek0yODggNTEyYzI5LjggMCA1NC45LTIwLjQgNjItNDhsLTEyNCAwYzcuMSAyNy42IDMyLjIgNDggNjIgNDh6Il0KICAgIH07CiAgICBmYUhhbmRzaGFrZVNsYXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbmRzaGFrZS1zbGFzaCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzU3NDM5LCAiaGFuZHNoYWtlLWFsdC1zbGFzaCIsICJoYW5kc2hha2Utc2ltcGxlLXNsYXNoIl0sICJlMDYwIiwgIk00MS0yNC45Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMFMtMi4zLS4zIDcgOS4xbDUyOCA1MjhjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC0yODgtMjg4IDE0LjItMTQuMmM0LjItNC4yIDkuNS02LjUgMTQuOS02LjkgNi44LS42IDEzLjggMS43IDE5IDYuOUw1MDUuNiAzNzYgNTc2IDMyMCA1NzYgMzIgNDY0IDk2IDQ0MC4yIDgwLjFDNDI0LjQgNjkuNiA0MDUuOSA2NCAzODYuOSA2NGwtNzAuNCAwYy0xLjEgMC0yLjMgMC0zLjQgLjEtMTYuOSAuOS0zMi44IDguNS00NC4yIDIxLjFsLTU1LjggNjIuMS0zNC0zNCA0NC4zLTQ5LjItMzkuNyAwYy0xNS4zIDAtMzAuMSAzLjYtNDMuNSAxMC40TDQxLTI0Ljl6TTAgNjkuOEwwIDMyMCAxNTYuNCA0NTAuM2MyMyAxOS4yIDUyIDI5LjcgODEuOSAyOS43bDE1LjcgMC03LTdjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGw0MSA0MSA5IDBjMjIuMiAwIDQzLjgtNS44IDYyLjgtMTYuNEwwIDY5Ljh6Il0KICAgIH07CiAgICBmYUhhbmRzaGFrZUFsdFNsYXNoID0gZmFIYW5kc2hha2VTbGFzaDsKICAgIGZhSGFuZHNoYWtlU2ltcGxlU2xhc2ggPSBmYUhhbmRzaGFrZVNsYXNoOwogICAgZmFCb3R0bGVXYXRlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib3R0bGUtd2F0ZXIiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZTRjNSIsICJNMTEyLTMybDk2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTk2IDBDOTQuMyAzMiA4MCAxNy43IDgwIDBzMTQuMy0zMiAzMi0zMnpNMTYgMTQ0YzAtMzUuMyAyOC43LTY0IDY0LTY0bDE2MCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0IDAgMjQuMS0xMy4zIDQ1LjEtMzMgNTYgMTkuNyAxMC45IDMzIDMxLjkgMzMgNTZzLTEzLjMgNDUuMS0zMyA1NmMxOS43IDEwLjkgMzMgMzEuOSAzMyA1NnMtMTMuMyA0NS4xLTMzIDU2YzE5LjcgMTAuOSAzMyAzMS45IDMzIDU2IDAgMzUuMy0yOC43IDY0LTY0IDY0TDgwIDU0NGMtMzUuMyAwLTY0LTI4LjctNjQtNjQgMC0yNC4xIDEzLjMtNDUuMSAzMy01Ni0xOS43LTEwLjktMzMtMzEuOS0zMy01NnMxMy4zLTQ1LjEgMzMtNTZjLTE5LjctMTAuOS0zMy0zMS45LTMzLTU2czEzLjMtNDUuMSAzMy01NmMtMTkuNy0xMC45LTMzLTMxLjktMzMtNTZ6Il0KICAgIH07CiAgICBmYURpY2VEMjAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZGljZS1kMjAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjZjZiIsICJNMjI0LjQtOC4yYzE5LjYtMTEuMSA0My42LTExLjEgNjMuMSAwbDE5MiAxMDguOGMyMCAxMS40IDMyLjQgMzIuNiAzMi40IDU1LjdsMCAyMTUuNmMwIDIzLTEyLjQgNDQuMy0zMi40IDU1LjdsLTE5MiAxMDguOGMtMTkuNiAxMS4xLTQzLjYgMTEuMS02My4xIDBMMzIuNCA0MjcuNUMxMi40IDQxNi4xIDAgMzk0LjggMCAzNzEuOEwwIDE1Ni4yYzAtMjMgMTIuNC00NC4zIDMyLjQtNTUuN0wyMjQuNC04LjJ6bTUyIDczLjJDMjY3IDQ5LjggMjQ1IDQ5LjggMjM1LjYgNjVsLTc2LjYgMTIzLjctODUuNC00Ni4zLTMuOC0xLjZjLTguOS0yLjctMTguOCAxLjEtMjMuNCA5LjZzLTIuNCAxOC45IDQuNyAyNC44bDMuMyAyLjMgODMuNCA0NS4yLTc0LjYgMTIwLjZDNTUuMyAzNTYuMiA2MSAzNzMgNzUgMzc4LjRsMTYxIDYxLjkgMCAzOS43YzAgMTEgOSAyMCAyMCAyMHMyMC05IDIwLTIwbDAtMzkuNyAxNjEtNjEuOWMxNC01LjQgMTkuNy0yMi4yIDExLjgtMzVsLTc0LjctMTIwLjYgODMuNC00NS4yYzkuNy01LjMgMTMuMy0xNy40IDguMS0yNy4xcy0xNy40LTEzLjMtMjcuMS04LjFMMzUzIDE4OC43IDI3Ni40IDY1em0tNDcgMzI5LjlsLTEyMi00Ni45IDU0LjUtODguMSA2Ny41IDEzNXpNNDA0LjYgMzQ4bC0xMjIgNDYuOSA2Ny41LTEzNSA1NC41IDg4LjF6TTMxOS4zIDIzMkwyNTYgMzU4LjYgMTkyLjcgMjMyIDMxOS4zIDIzMnpNMzA4IDE5MmwtMTA0LjEgMCA1Mi04NCA1MiA4NHoiXQogICAgfTsKICAgIGZhQXJyb3dEb3duWkEgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctZG93bi16LWEiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsic29ydC1hbHBoYS1kZXNjIiwgInNvcnQtYWxwaGEtZG93bi1hbHQiXSwgImY4ODEiLCAiTTIzMC42IDM5MC42bC04MCA4MGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBsLTgwLTgwYy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM3MzMi44LTEyLjUgNDUuMyAwTDk2IDM3MC43IDk2IDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAzMDYuNyAyNS40LTI1LjRjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM3pNMjg4IDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMybDEyOCAwYzEyLjkgMCAyNC42IDcuOCAyOS42IDE5LjhzMi4yIDI1LjctNi45IDM0LjlMMzk3LjMgMTYwIDQ0OCAxNjBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTEyOCAwYy0xMi45IDAtMjQuNi03LjgtMjkuNi0xOS44cy0yLjItMjUuNyA2LjktMzQuOUwzNzAuOCA5NiAzMjAgOTZjLTE3LjcgMC0zMi0xNC4zLTMyLTMyek00MTIuNiAyNzMuN2w4MCAxNjBjNy45IDE1LjggMS41IDM1LTE0LjMgNDIuOXMtMzUgMS41LTQyLjktMTQuM2wtNy4yLTE0LjMtODguNCAwLTcuMiAxNC4zYy03LjkgMTUuOC0yNy4xIDIyLjItNDIuOSAxNC4zcy0yMi4yLTI3LjEtMTQuMy00Mi45bDgwLTE2MGM1LjQtMTAuOCAxNi41LTE3LjcgMjguNi0xNy43czIzLjIgNi44IDI4LjYgMTcuN3pNMzg0IDM1OS42bC0yMC4yIDQwLjQgNDAuNCAwLTIwLjItNDAuNHoiXQogICAgfTsKICAgIGZhU29ydEFscGhhRGVzYyA9IGZhQXJyb3dEb3duWkE7CiAgICBmYVNvcnRBbHBoYURvd25BbHQgPSBmYUFycm93RG93blpBOwogICAgZmFCcnVzaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJicnVzaCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmNTVkIiwgIk0xNjIuNCA2Yy0xLjUtMy42LTUtNi04LjktNmwtMTkgMGMtMy45IDAtNy41IDIuNC04LjkgNkwxMDQuOSA1Ny43Yy0zLjIgOC0xNC42IDgtMTcuOCAwTDY2LjQgNmMtMS41LTMuNi01LTYtOC45LTZMNDggMEMyMS41IDAgMCAyMS41IDAgNDhsMCAyMDggMzg0IDAgMC0yMDhjMC0yNi41LTIxLjUtNDgtNDgtNDhMMjMwLjUgMGMtMy45IDAtNy41IDIuNC04LjkgNkwyMDAuOSA1Ny43Yy0zLjIgOC0xNC42IDgtMTcuOCAwTDE2Mi40IDZ6TTAgMzA0bDAgMTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsNjQgMCAwIDY0YzAgMzUuMyAyOC43IDY0IDY0IDY0czY0LTI4LjcgNjQtNjRsMC02NCA2NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTYtMzg0IDB6TTE5MiA0NjRjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTYgMTYgNy4yIDE2IDE2LTcuMiAxNi0xNiAxNnoiXQogICAgfTsKICAgIGZhUGVyc29uV2Fsa2luZ0Rhc2hlZExpbmVBcnJvd1JpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi13YWxraW5nLWRhc2hlZC1saW5lLWFycm93LXJpZ2h0IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NTMiLCAiTTE2MCA4MGE1NiA1NiAwIDEgMCAwLTExMiA1NiA1NiAwIDEgMCAwIDExMnpNNzMuNCAyMjcuOWwyMi42LTIyLjYgMCA2OS4zYzAgMjggMTIuMiA1NC43IDMzLjUgNzIuOWw3MS40IDYxLjJjNS45IDUuMSA5LjggMTIuMSAxMC45IDE5LjhsMTIuNiA4OC4xYzIuNSAxNy41IDE4LjcgMjkuNyAzNi4yIDI3LjJzMjkuNy0xOC43IDI3LjItMzYuMmwtMTIuNi04OC4xYy0zLjMtMjMuMS0xNC45LTQ0LjEtMzIuNi01OS4zbC0zNC41LTI5LjYgMC0xMTUuMiAzLjggNC43YzE4LjIgMjIuOCA0NS44IDM2IDc1IDM2bDMzLjIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMzMuMiAwYy05LjcgMC0xOC45LTQuNC0yNS0xMmwtMTcuOS0yMi40Yy0yMy0yOC44LTU3LjktNDUuNi05NC44LTQ1LjYtMzIuMiAwLTYzLjEgMTIuOC04NS44IDM1LjZMMjguMSAxODIuNkMxMC4xIDIwMC42IDAgMjI1IDAgMjUwLjVMMCAyODhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTM3LjVjMC04LjUgMy40LTE2LjYgOS40LTIyLjZ6TTg1LjggNDA3LjNjLTEuNSA1LjItNC4zIDEwLTguMSAxMy44TDkuNCA0ODkuNGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMGw2OC4zLTY4LjNjMTEuNS0xMS41IDE5LjktMjUuOCAyNC40LTQxLjVsMi4yLTcuNi00Ni0zOS40Yy0yLjUtMi4yLTUtNC40LTcuNC02LjhMODUuOCA0MDcuM3pNNDMyIDhjMC0xMy4zLTEwLjctMjQtMjQtMjRTMzg0LTUuMyAzODQgOGwwIDMyYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0zMnptMCAxMjhjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAzMmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMzJ6TTQwOCAzMjBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMzJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTMyYzAtMTMuMy0xMC43LTI0LTI0LTI0em0yNCAxNTJjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAzMmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMzJ6TTYwOSAyNzNjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlsLTcyLTcyYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDMxIDMxLTEwMi4xIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTAyLjEgMC0zMSAzMWMtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDcyLTcyeiJdCiAgICB9OwogICAgZmFBcnJvd1VwU2hvcnRXaWRlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXVwLXNob3J0LXdpZGUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsic29ydC1hbW91bnQtdXAtYWx0Il0sICJmODg1IiwgIk0zMjAgMzJjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMzIgMHptMCAxMjhjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsOTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtOTYgMHptMCAxMjhjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMTYwIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTE2MCAwem0wIDEyOGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwyMjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMjI0IDB6TTE1MC42IDQxLjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwbC05NiA5NmMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMEw5NiAxNDEuMyA5NiA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTMwNi43IDQxLjQgNDEuNGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zbC05Ni05NnoiXQogICAgfTsKICAgIGZhU29ydEFtb3VudFVwQWx0ID0gZmFBcnJvd1VwU2hvcnRXaWRlOwogICAgZmFHcmlwVmVydGljYWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ3JpcC12ZXJ0aWNhbCIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWyJncmlkLXZlcnRpY2FsIl0sICJmNThlIiwgIk0xMjggNDBjMC0yMi4xLTE3LjktNDAtNDAtNDBMNDAgMEMxNy45IDAgMCAxNy45IDAgNDBMMCA4OGMwIDIyLjEgMTcuOSA0MCA0MCA0MGw0OCAwYzIyLjEgMCA0MC0xNy45IDQwLTQwbDAtNDh6bTAgMTkyYzAtMjIuMS0xNy45LTQwLTQwLTQwbC00OCAwYy0yMi4xIDAtNDAgMTcuOS00MCA0MGwwIDQ4YzAgMjIuMSAxNy45IDQwIDQwIDQwbDQ4IDBjMjIuMSAwIDQwLTE3LjkgNDAtNDBsMC00OHpNMCA0MjRsMCA0OGMwIDIyLjEgMTcuOSA0MCA0MCA0MGw0OCAwYzIyLjEgMCA0MC0xNy45IDQwLTQwbDAtNDhjMC0yMi4xLTE3LjktNDAtNDAtNDBsLTQ4IDBjLTIyLjEgMC00MCAxNy45LTQwIDQwek0zMjAgNDBjMC0yMi4xLTE3LjktNDAtNDAtNDBMMjMyIDBjLTIyLjEgMC00MCAxNy45LTQwIDQwbDAgNDhjMCAyMi4xIDE3LjkgNDAgNDAgNDBsNDggMGMyMi4xIDAgNDAtMTcuOSA0MC00MGwwLTQ4ek0xOTIgMjMybDAgNDhjMCAyMi4xIDE3LjkgNDAgNDAgNDBsNDggMGMyMi4xIDAgNDAtMTcuOSA0MC00MGwwLTQ4YzAtMjIuMS0xNy45LTQwLTQwLTQwbC00OCAwYy0yMi4xIDAtNDAgMTcuOS00MCA0MHpNMzIwIDQyNGMwLTIyLjEtMTcuOS00MC00MC00MGwtNDggMGMtMjIuMSAwLTQwIDE3LjktNDAgNDBsMCA0OGMwIDIyLjEgMTcuOSA0MCA0MCA0MGw0OCAwYzIyLjEgMCA0MC0xNy45IDQwLTQwbDAtNDh6Il0KICAgIH07CiAgICBmYUdyaWRWZXJ0aWNhbCA9IGZhR3JpcFZlcnRpY2FsOwogICAgZmFDYXJUdW5uZWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FyLXR1bm5lbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNGRlIiwgIk0yNTYgMEMxMTQuNiAwIDAgMTE0LjYgMCAyNTZMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsNDIuOCAwYy02LjYtNS45LTEwLjgtMTQuNC0xMC44LTI0bDAtMTEzLjFjMC0xMy41IDMuMS0yNi44IDktMzguOWwzOS43LTgwLjhjOS40LTE5LjEgMjguOS0zMS4zIDUwLjItMzEuM0wzMTcgMjI0YzIxLjMgMCA0MC44IDEyLjEgNTAuMiAzMS4zTDQwNyAzMzZjNS45IDEyLjEgOSAyNS40IDkgMzguOUw0MTYgNDg4YzAgOS42LTQuMiAxOC4xLTEwLjggMjRsNDIuOCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTkyQzUxMiAxMTQuNiAzOTcuNCAwIDI1NiAwek0zNjIuOCA1MTJjLTYuNi01LjktMTAuOC0xNC40LTEwLjgtMjRsMC0yNC0xOTIgMCAwIDI0YzAgOS42LTQuMiAxOC4xLTEwLjggMjRsMjEzLjcgMHptLTE3NS0yMzUuNWwtMjkuMyA1OS41IDE5NC45IDAtMjkuMy01OS41Yy0xLjMtMi43LTQuMS00LjUtNy4yLTQuNUwxOTUgMjcyYy0zIDAtNS44IDEuNy03LjIgNC41ek0xNzYgNDI0YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHptMTg0LTI0YTI0IDI0IDAgMSAwIC00OCAwIDI0IDI0IDAgMSAwIDQ4IDB6Il0KICAgIH07CiAgICBmYUNoYXJ0Q29sdW1uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoYXJ0LWNvbHVtbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMGUzIiwgIk0zMiAzMmMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDMzNmMwIDguOCA3LjIgMTYgMTYgMTZsNDAwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMODAgNDgwYy00NC4yIDAtODAtMzUuOC04MC04MEwwIDY0QzAgNDYuMyAxNC4zIDMyIDMyIDMyek0xNDQgMjI0YzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02NGMwLTE3LjcgMTQuMy0zMiAzMi0zMnptMTQ0LTY0bDAgMTYwYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTYwYzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJ6bTgwIDMyYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgOTZjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC05NmMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNNTEyIDk2bDAgMjI0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMjI0YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJ6Il0KICAgIH07CiAgICBmYVRydWNrQXJyb3dSaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cnVjay1hcnJvdy1yaWdodCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNThiIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMuMyAwYzEwLjQgMzYuOSA0NC40IDY0IDg0LjcgNjRzNzQuMi0yNy4xIDg0LjctNjRsMTAyLjYgMGMxMC40IDM2LjkgNDQuNCA2NCA4NC43IDY0czc0LjItMjcuMSA4NC43LTY0bDMuMyAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTQ2LjdjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNMNTEyIDE0Ni43Yy0xMi0xMi0yOC4zLTE4LjctNDUuMy0xOC43bC01MC43IDAgMC0zMmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnpNNTEyIDIzNy4zbDAgNTAuNy05NiAwIDAtOTYgNTAuNyAwIDQ1LjMgNDUuM3pNMTUyIDM4NGE0MCA0MCAwIDEgMSAwIDgwIDQwIDQwIDAgMSAxIDAtODB6bTIzMiA0MGE0MCA0MCAwIDEgMSA4MCAwIDQwIDQwIDAgMSAxIC04MCAwek0zMDUgMjI1bC03MiA3MmMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWwzMS0zMS0xMDIuMSAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDEwMi4xIDAtMzEtMzFjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGw3MiA3MmM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXoiXQogICAgfTsKICAgIGZhVHYgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHYiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFs2MzcxNywgInRlbGV2aXNpb24iLCAidHYtYWx0Il0sICJmMjZjIiwgIk02NCA5NmwwIDI0MCA0NDggMCAwLTI0MC00NDggMHpNMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmw0NDggMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI0MGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0MDBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZ6TTE2MCA0NDhsMjU2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTI1NiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMyeiJdCiAgICB9OwogICAgZmFUZWxldmlzaW9uID0gZmFUdjsKICAgIGZhVHZBbHQgPSBmYVR2OwogICAgZmFTZWN0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNlY3Rpb24iLAogICAgICBpY29uOiBbMjU2LCA1MTIsIFtdLCAiZTQ0NyIsICJNMTEwIDBDNDkuMiAwIDAgNDkuMiAwIDExMCAwIDEzMy43IDcuNiAxNTUuOCAyMC41IDE3NCA3LjYgMTkyIDAgMjE0LjEgMCAyMzggMCAyOTEuNyAzOC45IDMzNy42IDkxLjkgMzQ2LjRsNjEuNyAxMC4zYzIyLjIgMy43IDM4LjQgMjIuOSAzOC40IDQ1LjMgMCAyNS40LTIwLjYgNDYtNDYgNDZsLTk4IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsOTggMGM2MC43IDAgMTEwLTQ5LjIgMTEwLTExMCAwLTIzLjctNy42LTQ1LjktMjAuNS02NCAxMi45LTE4IDIwLjUtNDAuMSAyMC41LTY0IDAtNTMuOC0zOC45LTk5LjYtOTEuOS0xMDguNWwtNjEuNy0xMC4zQzgwLjIgMTUxLjYgNjQgMTMyLjQgNjQgMTEwIDY0IDg0LjYgODQuNiA2NCAxMTAgNjRsOTggMGMxNy43IDAgMzItMTQuMyAzMi0zMlMyMjUuNyAwIDIwOCAwTDExMCAwem03NC43IDI5OS4xYy02LjUtMi40LTEzLjQtNC4zLTIwLjUtNS41bC02MS43LTEwLjNjLTIyLjItMy43LTM4LjQtMjIuOS0zOC40LTQ1LjMgMC05LjIgMi43LTE3LjggNy40LTI1IDYuNSAyLjQgMTMuNCA0LjMgMjAuNSA1LjVsNjEuNyAxMC4zYzIyLjIgMy43IDM4LjQgMjIuOSAzOC40IDQ1LjMgMCA5LjItMi43IDE3LjgtNy40IDI1eiJdCiAgICB9OwogICAgZmFQZWFjZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZWFjZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzk3NzRdLCAiZjY3YyIsICJNMjI0IDQ0NS4zbDAtMTIxLjgtOTQuMyA3Ny4xYzI2LjEgMjIuOCA1OC41IDM4LjcgOTQuMyA0NC43ek04OS4yIDM1MS4xTDIyNCAyNDAuOCAyMjQgNjYuN2MtOTAuOCAxNS4yLTE2MCA5NC4yLTE2MCAxODkuMyAwIDM0LjYgOS4yIDY3LjEgMjUuMiA5NS4xem0yOTMuMSA0OS41bC05NC4zLTc3LjEgMCAxMjEuOGMzNS43LTYgNjguMS0yMS45IDk0LjMtNDQuN3ptNDAuNi00OS41YzE2LTI4IDI1LjItNjAuNSAyNS4yLTk1LjEgMC05NS4xLTY5LjItMTc0LjEtMTYwLTE4OS4zbDAgMTc0LjIgMTM0LjggMTEwLjN6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6Il0KICAgIH07CiAgICBmYVN0YXIyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN0YXIiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMTA4OCwgNjE0NDZdLCAiZjAwNSIsICJNMzA5LjUtMTguOWMtNC4xLTgtMTIuNC0xMy4xLTIxLjQtMTMuMXMtMTcuMyA1LjEtMjEuNCAxMy4xTDE5My4xIDEyNS4zIDMzLjIgMTUwLjdjLTguOSAxLjQtMTYuMyA3LjctMTkuMSAxNi4zcy0uNSAxOCA1LjggMjQuNGwxMTQuNCAxMTQuNS0yNS4yIDE1OS45Yy0xLjQgOC45IDIuMyAxNy45IDkuNiAyMy4yczE2LjkgNi4xIDI1IDJMMjg4LjEgNDE3LjYgNDMyLjQgNDkxYzggNC4xIDE3LjcgMy4zIDI1LTJzMTEtMTQuMiA5LjYtMjMuMkw0NDEuNyAzMDUuOSA1NTYuMSAxOTEuNGM2LjQtNi40IDguNi0xNS44IDUuOC0yNC40cy0xMC4xLTE0LjktMTkuMS0xNi4zTDM4MyAxMjUuMyAzMDkuNS0xOC45eiJdCiAgICB9OwogICAgZmFGbGFnMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmbGFnIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI3OTg4LCA2MTcyNV0sICJmMDI0IiwgIk02NCAzMkM2NCAxNC4zIDQ5LjcgMCAzMiAwUzAgMTQuMyAwIDMyTDAgNDgwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xMjEuNiA2Mi43LTE4LjhjNDEuOS0xMi42IDg3LjEtOC43IDEyNi4yIDEwLjkgNDIuNyAyMS40IDkyLjUgMjQgMTM3LjIgNy4ybDM3LjEtMTMuOWMxMi41LTQuNyAyMC44LTE2LjYgMjAuOC0zMGwwLTI0Ny43YzAtMjMtMjQuMi0zOC00NC44LTI3LjdsLTExLjggNS45Yy00NC45IDIyLjUtOTcuOCAyMi41LTE0Mi44IDAtMzYuNC0xOC4yLTc4LjMtMjEuOC0xMTcuMi0xMC4xTDY0IDU0LjQgNjQgMzJ6Il0KICAgIH07CiAgICBmYVRyaWFuZ2xlRXhjbGFtYXRpb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHJpYW5nbGUtZXhjbGFtYXRpb24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5ODg4LCAiZXhjbGFtYXRpb24tdHJpYW5nbGUiLCAid2FybmluZyJdLCAiZjA3MSIsICJNMjU2IDBjMTQuNyAwIDI4LjIgOC4xIDM1LjIgMjFsMjE2IDQwMGM2LjcgMTIuNCA2LjQgMjcuNC0uOCAzOS41UzQ4Ni4xIDQ4MCA0NzIgNDgwTDQwIDQ4MGMtMTQuMSAwLTI3LjItNy40LTM0LjQtMTkuNXMtNy41LTI3LjEtLjgtMzkuNWwyMTYtNDAwYzctMTIuOSAyMC41LTIxIDM1LjItMjF6bTAgMzUyYTMyIDMyIDAgMSAwIDAgNjQgMzIgMzIgMCAxIDAgMC02NHptMC0xOTJjLTE4LjIgMC0zMi43IDE1LjUtMzEuNCAzMy43bDcuNCAxMDRjLjkgMTIuNSAxMS40IDIyLjMgMjMuOSAyMi4zIDEyLjYgMCAyMy05LjcgMjMuOS0yMi4zbDcuNC0xMDRjMS4zLTE4LjItMTMuMS0zMy43LTMxLjQtMzMuN3oiXQogICAgfTsKICAgIGZhRXhjbGFtYXRpb25UcmlhbmdsZSA9IGZhVHJpYW5nbGVFeGNsYW1hdGlvbjsKICAgIGZhV2FybmluZyA9IGZhVHJpYW5nbGVFeGNsYW1hdGlvbjsKICAgIGZhU2Nob29sQ2lyY2xlRXhjbGFtYXRpb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2Nob29sLWNpcmNsZS1leGNsYW1hdGlvbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTZjIiwgIk02NCAxMjhjLTM1LjMgMC02NCAyOC43LTY0IDY0TDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI3NiAwYy0xMC41LTE0LjYtMTktMzAuNy0yNS4xLTQ4bC05MC45IDAgMC04OGMwLTIyLjEgMTcuOS00MCA0MC00MGw0OCAwYzEgMCAxLjkgMCAyLjkgLjEgMjYuMy03NC42IDk3LjUtMTI4LjEgMTgxLjEtMTI4LjEgMjguNiAwIDU1LjYgNi4yIDgwIDE3LjRsMC0zMy40YzAtMzUuMy0yOC43LTY0LTY0LTY0bC02NCAwLTEyNy45LTExNS4xYy0xOC4zLTE2LjQtNDYtMTYuNC02NC4yIDBMMTI4IDEyOCA2NCAxMjh6bTY0IDI0MGMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyek0xMTIgMjU2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZ6TTI4OCAxMjhhNjQgNjQgMCAxIDEgMCAxMjggNjQgNjQgMCAxIDEgMC0xMjh6TTQ5NiA1NDRhMTQ0IDE0NCAwIDEgMCAwLTI4OCAxNDQgMTQ0IDAgMSAwIDAgMjg4em0wLTEwMGEyMCAyMCAwIDEgMSAwIDQwIDIwIDIwIDAgMSAxIDAtNDB6bTAtMTQwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDgwYzAgOC44LTcuMiAxNi0xNiAxNnMtMTYtNy4yLTE2LTE2bDAtODBjMC04LjggNy4yLTE2IDE2LTE2eiJdCiAgICB9OwogICAgZmFHcmFkdWF0aW9uQ2FwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImdyYWR1YXRpb24tY2FwIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI3ODkxLCAibW9ydGFyLWJvYXJkIl0sICJmMTlkIiwgIk00OCAxOTUuOGwyMDkuMiA4Ni4xYzkuOCA0IDIwLjIgNi4xIDMwLjggNi4xczIxLTIuMSAzMC44LTYuMWwyNDIuNC05OS44YzktMy43IDE0LjgtMTIuNCAxNC44LTIyLjFzLTUuOC0xOC40LTE0LjgtMjIuMUwzMTguOCAzOC4xQzMwOSAzNC4xIDI5OC42IDMyIDI4OCAzMnMtMjEgMi4xLTMwLjggNi4xTDE0LjggMTM3LjlDNS44IDE0MS42IDAgMTUwLjMgMCAxNjBMMCA0NTZjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTI2MC4yem00OCA3MS43TDk2IDM4NGMwIDUzIDg2IDk2IDE5MiA5NnMxOTItNDMgMTkyLTk2bDAtMTE2LjYtMTQyLjkgNTguOWMtMTUuNiA2LjQtMzIuMiA5LjctNDkuMSA5LjdzLTMzLjUtMy4zLTQ5LjEtOS43TDk2IDI2Ny40eiJdCiAgICB9OwogICAgZmFNb3J0YXJCb2FyZCA9IGZhR3JhZHVhdGlvbkNhcDsKICAgIGZhU3RvcmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3RvcmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjU0ZSIsICJNMzAuNyA3Mi4zQzM3LjYgNDguNCA1OS41IDMyIDg0LjQgMzJsMzQ0IDBjMjQuOSAwIDQ2LjggMTYuNCA1My44IDQwLjNsMjMuNCA4MC4yYzEyLjggNDMuNy0yMC4xIDg3LjUtNjUuNiA4Ny41LTI2LjMgMC00OS40LTE0LjktNjAuOC0zNy4xLTExLjYgMjEuOS0zNC42IDM3LjEtNjEuNCAzNy4xLTI2LjYgMC00OS43LTE1LTYxLjMtMzctMTEuNiAyMi0zNC43IDM3LTYxLjMgMzctMjYuOCAwLTQ5LjgtMTUuMS02MS40LTM3LjEtMTEuNCAyMi4xLTM0LjUgMzcuMS02MC44IDM3LjEtNDUuNiAwLTc4LjQtNDMuNy02NS42LTg3LjVMMzAuNyA3Mi4zek05Ni40IDM1MmwzMjAgMCAwLTY2LjRjNy42IDEuNiAxNS41IDIuNCAyMy41IDIuNCAxNC4zIDAgMjgtMi42IDQwLjUtNy4ybDAgMTUxLjJjMCAyNi41LTIxLjUgNDgtNDggNDhsLTM1MiAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTE1MS4yYzEyLjUgNC42IDI2LjEgNy4yIDQwLjUgNy4yIDguMSAwIDE1LjktLjggMjMuNS0yLjRsMCA2Ni40eiJdCiAgICB9OwogICAgZmFVc2VyQXN0cm9uYXV0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXItYXN0cm9uYXV0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY0ZmIiLCAiTTIyNCAzMzZjNzQuNiAwIDEzOC40LTQ2LjQgMTY0LTExMmw0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC04MGMwLTEzLjMtMTAuNy0yNC0yNC0yNGwtNCAwQzM2Mi40IDMwLjQgMjk4LjYtMTYgMjI0LTE2Uzg1LjYgMzAuNCA2MCA5NmwtNCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDgwYzAgMTMuMyAxMC43IDI0IDI0IDI0bDQgMGMyNS42IDY1LjYgODkuNCAxMTIgMTY0IDExMnpNMjA4IDgwbDMyIDBjNTMgMCA5NiA0MyA5NiA5NnMtNDMgOTYtOTYgOTZsLTMyIDBjLTUzIDAtOTYtNDMtOTYtOTZzNDMtOTYgOTYtOTZ6TTE2IDQ4NC42QzE2IDQ5OS43IDI4LjMgNTEyIDQzLjQgNTEybDUyLjYgMCAwLTQ4YzAtMTcuNyAxNC4zLTMyIDMyLTMybDE5MiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNDggNTIuNiAwYzE1LjEgMCAyNy40LTEyLjMgMjcuNC0yNy40IDAtNTkuOC0zMS45LTExMi4yLTc5LjYtMTQxLTM2LjQgMjUuNS04MC42IDQwLjQtMTI4LjQgNDAuNHMtOTItMTQuOS0xMjguNC00MC40QzQ3LjkgMzcyLjQgMTYgNDI0LjggMTYgNDg0LjZ6TTE4My4zIDE0MS41Yy0uOS0zLjMtMy45LTUuNS03LjMtNS41cy02LjQgMi4yLTcuMyA1LjVsLTYgMjEuMi0yMS4yIDZjLTMuMyAuOS01LjUgMy45LTUuNSA3LjNzMi4yIDYuNCA1LjUgNy4zbDIxLjIgNiA2IDIxLjJjLjkgMy4zIDMuOSA1LjUgNy4zIDUuNXM2LjQtMi4yIDcuMy01LjVsNi0yMS4yIDIxLjItNmMzLjMtLjkgNS41LTMuOSA1LjUtNy4zcy0yLjItNi40LTUuNS03LjNsLTIxLjItNi02LTIxLjJ6TTE1MiA0ODhsMCAyNCA0OCAwIDAtMjRjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjR6bTEyMC0yNGMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAyNCA0OCAwIDAtMjRjMC0xMy4zLTEwLjctMjQtMjQtMjR6Il0KICAgIH07CiAgICBmYUJ1aWxkaW5nRmxhZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJidWlsZGluZy1mbGFnIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU0ZDUiLCAiTTY0IDBDMjguNyAwIDAgMjguNyAwIDY0TDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI1NiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzg0YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDB6TTE3NiAzNTJsMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDgwLTk2IDAgMC04MGMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNOTYgMTEyYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJ6TTI0MCA5NmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2ek05NiAyNDBjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMnptMTQ0LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZ6TTQ2NCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjg4IDExMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtOTZjMC0xNy43LTE0LjMtMzItMzItMzJMNDk2IDMyYzAtMTcuNy0xNC4zLTMyLTMyLTMyeiJdCiAgICB9OwogICAgZmFNdWdTYXVjZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibXVnLXNhdWNlciIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJjb2ZmZWUiXSwgImYwZjQiLCAiTTY0IDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMybDM1MiAwYzcwLjcgMCAxMjggNTcuMyAxMjggMTI4UzUxOC43IDI4OCA0NDggMjg4YzAgNTMtNDMgOTYtOTYgOTZsLTE5MiAwYy01MyAwLTk2LTQzLTk2LTk2TDY0IDY0em00NDggOTZjMC0zNS4zLTI4LjctNjQtNjQtNjRsMCAxMjhjMzUuMyAwIDY0LTI4LjcgNjQtNjR6TTY0IDQ0OGwzODQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkw2NCA1MTJjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJ6Il0KICAgIH07CiAgICBmYUNvZmZlZSA9IGZhTXVnU2F1Y2VyOwogICAgZmFMZW1vbjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGVtb24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjc4MTldLCAiZjA5NCIsICJNNDQ4IDk2YzAtMzUuMy0yOC43LTY0LTY0LTY0LTYuNiAwLTEzIDEtMTkgMi45LTIyLjUgNy00OC4xIDE0LjktNzEgOS03NS4yLTE5LjEtMTU2LjQgMTEtMjEzLjcgNjguM1MtNy4yIDI1MC44IDExLjkgMzI2YzUuOCAyMi45LTIgNDguNC05IDcxLTEuOSA2LTIuOSAxMi40LTIuOSAxOSAwIDM1LjMgMjguNyA2NCA2NCA2NCA2LjYgMCAxMy0xIDE5LjEtMi45IDIyLjUtNyA0OC4xLTE0LjkgNzEtOSA3NS4yIDE5LjEgMTU2LjQtMTEgMjEzLjctNjguM1M0NTUuMiAyNjEuMiA0MzYuMSAxODZjLTUuOC0yMi45IDItNDguNCA5LTcxIDEuOS02IDIuOS0xMi40IDIuOS0xOS4xek0yMjIuNyAxNDNjLTUyIDE1LjItOTYuNSA1OS43LTExMS43IDExMS43LTMuNyAxMi43LTE3LjEgMjAtMjkuOCAxNi4zUzYxLjIgMjU0IDY1IDI0MS4zYzE5LjgtNjcuNyA3Ni42LTEyNC41IDE0NC4zLTE0NC4zIDEyLjctMy43IDI2LjEgMy42IDI5LjggMTYuM3MtMy42IDI2LjEtMTYuMyAyOS44eiJdCiAgICB9OwogICAgZmFDYXJhdmFuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhcmF2YW4iLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjhmZiIsICJNMzIgOTZjMC0zNS4zIDI4LjctNjQgNjQtNjRsMzIwIDBjNzAuNyAwIDEyOCA1Ny4zIDEyOCAxMjhsMCAxOTIgNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMjk2LjQgMGMuMiAyLjYgLjQgNS4zIC40IDggMCA0OC42LTM5LjQgODgtODggODhzLTg4LTM5LjQtODgtODhjMC0yLjcgLjEtNS40IC40LThMOTYgNDE2Yy0zNS4zIDAtNjQtMjguNy02NC02NEwzMiA5NnpNMzUyIDM1Mmw2NCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNDgtMjQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwyNCAwIDAtNjRjMC0xNy43LTE0LjMtMzItMzItMzJsLTY0IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgMTYwYzAgMTcuNyAxNC4zIDMyIDMyIDMyek0xNjAgMTI4Yy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDY0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDY0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtNjQgMHptNjQgMzM2YTQwIDQwIDAgMSAwIDAtODAgNDAgNDAgMCAxIDAgMCA4MHoiXQogICAgfTsKICAgIGZhUSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJxIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTEzXSwgIjUxIiwgIk02NCAyNTZjMCA4OC40IDcxLjYgMTYwIDE2MCAxNjAgMjguOSAwIDU2LTcuNyA3OS40LTIxLjFsLTcyLTg2LjRjLTExLjMtMTMuNi05LjUtMzMuOCA0LjEtNDUuMXMzMy44LTkuNSA0NS4xIDQuMWw3MC45IDg1LjFjMjAuNC0yNi44IDMyLjUtNjAuMyAzMi41LTk2LjYgMC04OC40LTcxLjYtMTYwLTE2MC0xNjBTNjQgMTY3LjYgNjQgMjU2ek0zNDQuOSA0NDQuNkMzMTAgNDY3IDI2OC41IDQ4MCAyMjQgNDgwIDEwMC4zIDQ4MCAwIDM3OS43IDAgMjU2UzEwMC4zIDMyIDIyNCAzMiA0NDggMTMyLjMgNDQ4IDI1NmMwIDU2LjEtMjAuNiAxMDcuNC01NC43IDE0Ni43bDQ3LjMgNTYuOGMxMS4zIDEzLjYgOS41IDMzLjgtNC4xIDQ1LjFzLTMzLjggOS41LTQ1LjEtNC4xbC00Ni42LTU1Ljl6Il0KICAgIH07CiAgICBmYUxvY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibG9jayIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyODI3NF0sICJmMDIzIiwgIk0xMjggOTZsMCA2NCAxMjggMCAwLTY0YzAtMzUuMy0yOC43LTY0LTY0LTY0cy02NCAyOC43LTY0IDY0ek02NCAxNjBsMC02NEM2NCAyNS4zIDEyMS4zLTMyIDE5Mi0zMlMzMjAgMjUuMyAzMjAgOTZsMCA2NGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDIyNGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMjI0YzAtMzUuMyAyOC43LTY0IDY0LTY0eiJdCiAgICB9OwogICAgZmFQYWludFJvbGxlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwYWludC1yb2xsZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjVhYSIsICJNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMMzUyIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMTYgMGM0NC4yIDAgODAgMzUuOCA4MCA4MGwwIDk2YzAgNDQuMi0zNS44IDgwLTgwIDgwbC0xNjAgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMTguN2MxOC42IDYuNiAzMiAyNC40IDMyIDQ1LjNsMCA5NmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMzIgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC05NmMwLTIwLjkgMTMuNC0zOC43IDMyLTQ1LjNsMC0xOC43YzAtNDQuMiAzNS44LTgwIDgwLTgwbDE2MCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTk2YzAtOC44LTcuMi0xNi0xNi0xNmwtMTYgMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCAxOTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6Il0KICAgIH07CiAgICBmYVZvbHVtZUhpZ2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidm9sdW1lLWhpZ2giLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjgyNjYsICJ2b2x1bWUtdXAiXSwgImYwMjgiLCAiTTUzMy42IDMyLjVjLTEwLjMtOC40LTI1LjQtNi44LTMzLjggMy41cy02LjggMjUuNCAzLjUgMzMuOEM1NTcuNSAxMTMuOCA1OTIgMTgwLjggNTkyIDI1NnMtMzQuNSAxNDIuMi04OC43IDE4Ni4zYy0xMC4zIDguNC0xMS44IDIzLjUtMy41IDMzLjhzMjMuNSAxMS44IDMzLjggMy41QzU5OC41IDQyNi43IDY0MCAzNDYuMiA2NDAgMjU2UzU5OC41IDg1LjIgNTMzLjYgMzIuNXpNNDczLjEgMTA3Yy0xMC4zLTguNC0yNS40LTYuOC0zMy44IDMuNXMtNi44IDI1LjQgMy41IDMzLjhDNDc1LjMgMTcwLjcgNDk2IDIxMC45IDQ5NiAyNTZzLTIwLjcgODUuMy01My4yIDExMS44Yy0xMC4zIDguNC0xMS44IDIzLjUtMy41IDMzLjhzMjMuNSAxMS44IDMzLjggMy41YzQzLjItMzUuMiA3MC45LTg4LjkgNzAuOS0xNDlzLTI3LjctMTEzLjgtNzAuOS0xNDl6bS02MC41IDc0LjVjLTEwLjMtOC40LTI1LjQtNi44LTMzLjggMy41cy02LjggMjUuNCAzLjUgMzMuOEMzOTMuMSAyMjcuNiA0MDAgMjQxIDQwMCAyNTZzLTYuOSAyOC40LTE3LjcgMzcuM2MtMTAuMyA4LjQtMTEuOCAyMy41LTMuNSAzMy44czIzLjUgMTEuOCAzMy44IDMuNUM0MzQuMSAzMTIuOSA0NDggMjg2LjEgNDQ4IDI1NnMtMTMuOS01Ni45LTM1LjQtNzQuNXpNODAgMzUybDQ4IDAgMTM0LjEgMTE5LjJjNi40IDUuNyAxNC42IDguOCAyMy4xIDguOCAxOS4yIDAgMzQuOC0xNS42IDM0LjgtMzQuOGwwLTM3OC40YzAtMTkuMi0xNS42LTM0LjgtMzQuOC0zNC44LTguNSAwLTE2LjcgMy4xLTIzLjEgOC44TDEyOCAxNjAgODAgMTYwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDk2YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4eiJdCiAgICB9OwogICAgZmFWb2x1bWVVcCA9IGZhVm9sdW1lSGlnaDsKICAgIGZhRm9sZGVyUGx1cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmb2xkZXItcGx1cyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNjVlIiwgIk01MTIgMzg0YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwxMzguNyAwYzEzLjggMCAyNy4zIDQuNSAzOC40IDEyLjhsMzguNCAyOC44YzUuNSA0LjIgMTIuMyA2LjQgMTkuMiA2LjRMNDQ4IDgwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjQwek0yNTYgMTYwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDQ4LTQ4IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDggMCAwIDQ4YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC00OCA0OCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC00OCAwIDAtNDhjMC0xMy4zLTEwLjctMjQtMjQtMjR6Il0KICAgIH07CiAgICBmYU1lcmN1cnkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWVyY3VyeSIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzk3OTFdLCAiZjIyMyIsICJNMTE3LTRDMTA2LTE3LjggODUuOC0yMCA3Mi4xLTlzLTE2IDMxLjItNSA0NUM3NC45IDQ1LjcgODMuNyA1NC41IDkzLjUgNjIuMSA0Ni43IDkzLjcgMTYgMTQ3LjMgMTYgMjA4IDE2IDI5NC4zIDc4LjEgMzY2LjEgMTYwIDM4MS4xbDAgMzQuOS0zMiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDMyIDAgMCAzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzIgMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMzIgMCAwLTM0LjljODEuOS0xNSAxNDQtODYuOCAxNDQtMTczLjEgMC02MC43LTMwLjctMTE0LjMtNzcuNS0xNDUuOSA5LjgtNy43IDE4LjctMTYuNCAyNi40LTI2LjEgMTEuMS0xMy44IDguOC0zMy45LTUtNDVTMjc4LTE3LjggMjY3LTRjLTE3LjYgMjItNDQuNyAzNi03NSAzNlMxMzQuNyAxOCAxMTctNHptNzUgMzI0Yy02MS45IDAtMTEyLTUwLjEtMTEyLTExMlMxMzAuMSA5NiAxOTIgOTYgMzA0IDE0Ni4xIDMwNCAyMDhjMCA2MS44LTUwLjEgMTEyLTExMS45IDExMmwtLjEgMHoiXQogICAgfTsKICAgIGZhQW5jaG9yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFuY2hvciIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzk4NzVdLCAiZjEzZCIsICJNMjg4IDY0YTMyIDMyIDAgMSAwIDAgNjQgMzIgMzIgMCAxIDAgMC02NHpNMTkyIDk2YzAtNTMgNDMtOTYgOTYtOTZzOTYgNDMgOTYgOTZjMCA0MS44LTI2LjcgNzcuNC02NCA5MC41bDAgMjU3LjljNjIuOS0xNC4zIDExMC4yLTY5LjcgMTExLjktMTM2LjVsLTE2LjEgMTQuMWMtMTAgOC43LTI1LjEgNy43LTMzLjktMi4zcy03LjctMjUuMSAyLjMtMzMuOWw2NC01NmM5LTcuOSAyMi42LTcuOSAzMS42IDBsNjQgNTZjMTAgOC43IDExIDIzLjkgMi4zIDMzLjlzLTIzLjkgMTEtMzMuOSAyLjNMNDk2IDMwNy45QzQ5My45IDQyMSA0MDEuNiA1MTIgMjg4IDUxMlM4Mi4xIDQyMSA4MCAzMDcuOUw2My44IDMyMi4xYy0xMCA4LjctMjUuMSA3LjctMzMuOS0yLjNzLTcuNy0yNS4xIDIuMy0zMy45bDY0LTU2YzktNy45IDIyLjYtNy45IDMxLjYgMGw2NCA1NmMxMCA4LjcgMTEgMjMuOSAyLjMgMzMuOXMtMjMuOSAxMS0zMy45IDIuM2wtMTYuMS0xNC4xYzEuOCA2Ni44IDQ5LjEgMTIyLjIgMTExLjkgMTM2LjVsMC0yNTcuOWMtMzcuMy0xMy4yLTY0LTQ4LjctNjQtOTAuNXoiXQogICAgfTsKICAgIGZhU3F1YXJlUGFya2luZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtcGFya2luZyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyNzM1OSwgInBhcmtpbmciXSwgImY1NDAiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6TTE5MiAyNTZsNDggMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNDggMCAwIDY0em00OCA2NGwtNDggMCAwIDMyYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTg0YzAtMjIuMSAxNy45LTQwIDQwLTQwbDcyIDBjNTMgMCA5NiA0MyA5NiA5NnMtNDMgOTYtOTYgOTZ6Il0KICAgIH07CiAgICBmYVBhcmtpbmcgPSBmYVNxdWFyZVBhcmtpbmc7CiAgICBmYUhhbnVraWFoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbnVraWFoIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI4MzM0XSwgImY2ZTYiLCAiTTMxNC4yIDMuM2MtNS4xIDguOC0xOC4yIDMzLjMtMTguMiA1Mi43IDAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRjMC0xOS40LTEzLjEtNDMuOS0xOC4yLTUyLjctMS4yLTIuMS0zLjQtMy4zLTUuOC0zLjNzLTQuNiAxLjItNS44IDMuM3ptLTI4OCA0OEMyMS4xIDYwLjEgOCA4NC42IDggMTA0IDggMTE3LjMgMTguNyAxMjggMzIgMTI4czI0LTEwLjcgMjQtMjRjMC0xOS40LTEzLjEtNDMuOS0xOC4yLTUyLjctMS4yLTIuMS0zLjQtMy4zLTUuOC0zLjNzLTQuNiAxLjItNS44IDMuM3pNODggMTA0YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRjMC0xOS40LTEzLjEtNDMuOS0xOC4yLTUyLjctMS4yLTIuMS0zLjQtMy4zLTUuOC0zLjNzLTQuNiAxLjItNS44IDMuM0MxMDEuMSA2MC4xIDg4IDg0LjYgODggMTA0em04Mi4yLTUyLjdjLTUuMSA4LjgtMTguMiAzMy4zLTE4LjIgNTIuNyAwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0YzAtMTkuNC0xMy4xLTQzLjktMTguMi01Mi43LTEuMi0yLjEtMy40LTMuMy01LjgtMy4zcy00LjYgMS4yLTUuOCAzLjN6TTIxNiAxMDRjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGMwLTE5LjQtMTMuMS00My45LTE4LjItNTIuNy0xLjItMi4xLTMuNC0zLjMtNS44LTMuM3MtNC42IDEuMi01LjggMy4zQzIyOS4xIDYwLjEgMjE2IDg0LjYgMjE2IDEwNHpNMzk0LjIgNTEuM2MtNS4xIDguOC0xOC4yIDMzLjMtMTguMiA1Mi43IDAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRjMC0xOS40LTEzLjEtNDMuOS0xOC4yLTUyLjctMS4yLTIuMS0zLjQtMy4zLTUuOC0zLjNzLTQuNiAxLjItNS44IDMuM3pNNDQwIDEwNGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0YzAtMTkuNC0xMy4xLTQzLjktMTguMi01Mi43LTEuMi0yLjEtMy40LTMuMy01LjgtMy4zcy00LjYgMS4yLTUuOCAzLjNDNDUzLjEgNjAuMSA0NDAgODQuNiA0NDAgMTA0em04Mi4yLTUyLjdjLTUuMSA4LjgtMTguMiAzMy4zLTE4LjIgNTIuNyAwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0YzAtMTkuNC0xMy4xLTQzLjktMTguMi01Mi43LTEuMi0yLjEtMy40LTMuMy01LjgtMy4zcy00LjYgMS4yLTUuOCAzLjN6TTU4NCAxMDRjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGMwLTE5LjQtMTMuMS00My45LTE4LjItNTIuNy0xLjItMi4xLTMuNC0zLjMtNS44LTMuM3MtNC42IDEuMi01LjggMy4zQzU5Ny4xIDYwLjEgNTg0IDg0LjYgNTg0IDEwNHpNMTEyIDE2MGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMTEyIDMyIDAgMC0xMTJjMC04LjgtNy4yLTE2LTE2LTE2em02NCAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAxMTIgMzIgMCAwLTExMmMwLTguOC03LjItMTYtMTYtMTZ6bTY0IDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDExMiAzMiAwIDAtMTEyYzAtOC44LTcuMi0xNi0xNi0xNnptMTYwIDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDExMiAzMiAwIDAtMTEyYzAtOC44LTcuMi0xNi0xNi0xNnptNjQgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMTEyIDMyIDAgMC0xMTJjMC04LjgtNy4yLTE2LTE2LTE2em02NCAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAxMTIgMzIgMCAwLTExMmMwLTguOC03LjItMTYtMTYtMTZ6TTM1MiAxNDRjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAxNzYtMTkyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtOTZjMC0xNy43LTE0LjMtMzItMzItMzJTMCAxNzQuMyAwIDE5MmwwIDk2YzAgNTMgNDMgOTYgOTYgOTZsMTkyIDAgMCA2NC0xMjggMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzMjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTI4IDAgMC02NCAxOTIgMGM1MyAwIDk2LTQzIDk2LTk2bDAtOTZjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA5NmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMTkyIDAgMC0xNzZ6Il0KICAgIH07CiAgICBmYVJvdGF0ZUxlZnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicm90YXRlLWxlZnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsicm90YXRlLWJhY2siLCAicm90YXRlLWJhY2t3YXJkIiwgInVuZG8tYWx0Il0sICJmMmVhIiwgIk0yNCAxOTJsMTQ0IDBjOS43IDAgMTguNS01LjggMjIuMi0xNC44czEuNy0xOS4zLTUuMi0yNi4ybC00Ni43LTQ2LjdjNzUuMy01OC42IDE4NC4zLTUzLjMgMjUzLjUgMTUuOSA3NSA3NSA3NSAxOTYuNSAwIDI3MS41cy0xOTYuNSA3NS0yNzEuNSAwYy0xMC4yLTEwLjItMTktMjEuMy0yNi40LTMzLTkuNS0xNC45LTI5LjMtMTkuMy00NC4yLTkuOHMtMTkuMyAyOS4zLTkuOCA0NC4yQzQ5LjcgNDA4LjcgNjEuNCA0MjMuNSA3NSA0MzcgMTc1IDUzNyAzMzcgNTM3IDQzNyA0MzdTNTM3IDE3NSA0MzcgNzVDMzQyLjgtMTkuMyAxOTMuMy0yNC43IDkyLjcgNTguOEw0MSA3QzM0LjEgLjIgMjMuOC0xLjkgMTQuOCAxLjhTMCAxNC4zIDAgMjRMMCAxNjhjMCAxMy4zIDEwLjcgMjQgMjQgMjR6Il0KICAgIH07CiAgICBmYVJvdGF0ZUJhY2sgPSBmYVJvdGF0ZUxlZnQ7CiAgICBmYVJvdGF0ZUJhY2t3YXJkID0gZmFSb3RhdGVMZWZ0OwogICAgZmFVbmRvQWx0ID0gZmFSb3RhdGVMZWZ0OwogICAgZmFIZWFkaW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhlYWRpbmciLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiaGVhZGVyIl0sICJmMWRjIiwgIk0wIDY0QzAgNDYuMyAxNC4zIDMyIDMyIDMybDk2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTE2IDAgMCAxMTIgMjI0IDAgMC0xMTItMTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw5NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0xNiAwIDAgMzIwIDE2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTk2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMTYgMCAwLTE0NC0yMjQgMCAwIDE0NCAxNiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC05NiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDE2IDAgMC0zMjAtMTYgMEMxNC4zIDk2IDAgODEuNyAwIDY0eiJdCiAgICB9OwogICAgZmFIZWFkZXIgPSBmYUhlYWRpbmc7CiAgICBmYUNyb3NzaGFpcnMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY3Jvc3NoYWlycyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMDViIiwgIk0yODgtMTZjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxOC4zYzk4LjEgMTQgMTc1LjcgOTEuNiAxODkuNyAxODkuN2wxOC4zIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTE4LjMgMGMtMTQgOTguMS05MS42IDE3NS43LTE4OS43IDE4OS43bDAgMTguM2MwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTE4LjNDMTU3LjkgNDYzLjcgODAuMyAzODYuMSA2Ni4zIDI4OEw0OCAyODhjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMTguMyAwQzgwLjMgMTI1LjkgMTU3LjkgNDguMyAyNTYgMzQuM0wyNTYgMTZjMC0xNy43IDE0LjMtMzIgMzItMzJ6TTEzMS4yIDI4OGMxMi43IDYyLjcgNjIuMSAxMTIuMSAxMjQuOCAxMjQuOGwwLTEyLjhjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDEyLjhjNjIuNy0xMi43IDExMi4xLTYyLjEgMTI0LjgtMTI0LjhMNDMyIDI4OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxMi44IDBDNDMyLjEgMTYxLjMgMzgyLjcgMTExLjkgMzIwIDk5LjJsMCAxMi44YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTIuOEMxOTMuMyAxMTEuOSAxNDMuOSAxNjEuMyAxMzEuMiAyMjRsMTIuOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0xMi44IDB6TTI4OCAyMDhhNDggNDggMCAxIDEgMCA5NiA0OCA0OCAwIDEgMSAwLTk2eiJdCiAgICB9OwogICAgZmFDaXJjbGVOb2RlcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtbm9kZXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTRlMiIsICJNNDE4LjQgMTU3LjljMzUuMy04LjMgNjEuNi00MCA2MS42LTc3LjkgMC00NC4yLTM1LjgtODAtODAtODAtNDMuNCAwLTc4LjcgMzQuNS04MCA3Ny41TDEzNi4yIDE1MS4xQzEyMS43IDEzNi44IDEwMS45IDEyOCA4MCAxMjggMzUuOCAxMjggMCAxNjMuOCAwIDIwOHMzNS44IDgwIDgwIDgwYzEyLjIgMCAyMy44LTIuNyAzNC4xLTcuNkwyNTkuNyA0MDcuOGMtMi40IDcuNi0zLjcgMTUuOC0zLjcgMjQuMiAwIDQ0LjIgMzUuOCA4MCA4MCA4MHM4MC0zNS44IDgwLTgwYzAtMjcuNy0xNC01Mi4xLTM1LjQtNjYuNGwzNy44LTIwNy43ek0xNTYuMyAyMzIuMmMyLjItNi45IDMuNS0xNC4yIDMuNy0yMS43bDE4My44LTczLjVjMy42IDMuNSA3LjQgNi43IDExLjYgOS41TDMxNy42IDM1NC4xYy01LjUgMS4zLTEwLjggMy4xLTE1LjggNS41TDE1Ni4zIDIzMi4yeiJdCiAgICB9OwogICAgZmFXaW5kb3dSZXN0b3JlMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3aW5kb3ctcmVzdG9yZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMmQyIiwgIk01MTIgOTZMMTYwIDk2YzAtMzUuMyAyOC43LTY0IDY0LTY0bDI4OCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMTkyYzAgMzUuMy0yOC43IDY0LTY0IDY0bC00OCAwIDAtNjQgNDggMCAwLTE5MnpNMCAyMjRjMC0zNS4zIDI4LjctNjQgNjQtNjRsMjg4IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAxOTJjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDIyNHptNjQgNDBjMCAxMy4zIDEwLjcgMjQgMjQgMjRsMjQwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRMODggMjQwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHoiXQogICAgfTsKICAgIGZhUiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbMTE0XSwgIjUyIiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0TDAgNDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xMjggOTUuMyAwIDEwMi40IDE0Ni40YzEwLjEgMTQuNSAzMC4xIDE4IDQ0LjYgNy45czE4LTMwLjEgNy45LTQ0LjZMMjMwLjEgMzA5LjVDMjgyLjggMjg4LjEgMzIwIDIzNi40IDMyMCAxNzYgMzIwIDk2LjUgMjU1LjUgMzIgMTc2IDMyTDMyIDMyek0xNzYgMjU2bC0xMTIgMCAwLTE2MCAxMTIgMGM0NC4yIDAgODAgMzUuOCA4MCA4MHMtMzUuOCA4MC04MCA4MHoiXQogICAgfTsKICAgIGZhRmlsdGVyQ2lyY2xlWG1hcmsgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsdGVyLWNpcmNsZS14bWFyayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlMTdiIiwgIk0zMiA2NEMxOS4xIDY0IDcuNCA3MS44IDIuNCA4My44Uy4yIDEwOS41IDkuNCAxMTguNkwxOTIgMzAxLjMgMTkyIDQxNmMwIDguNSAzLjQgMTYuNiA5LjQgMjIuNmw2NCA2NGMyLjUgMi41IDUuMyA0LjUgOC4zIDYtMjEuMi0zMC45LTMzLjYtNjguMy0zMy42LTEwOC42IDAtOTkuNCA3NS41LTE4MS4xIDE3Mi4zLTE5MWw5MC40LTkwLjRjOS4yLTkuMiAxMS45LTIyLjkgNi45LTM0LjlTNDkyLjkgNjQgNDgwIDY0TDMyIDY0ek00MzIgNTQ0YTE0NCAxNDQgMCAxIDAgMC0yODggMTQ0IDE0NCAwIDEgMCAwIDI4OHptNTkuMy0xODAuN2wtMzYuNyAzNi43IDM2LjcgMzYuN2M2LjIgNi4yIDYuMiAxNi40IDAgMjIuNnMtMTYuNCA2LjItMjIuNiAwbC0zNi43LTM2LjctMzYuNyAzNi43Yy02LjIgNi4yLTE2LjQgNi4yLTIyLjYgMHMtNi4yLTE2LjQgMC0yMi42bDM2LjctMzYuNy0zNi43LTM2LjdjLTYuMi02LjItNi4yLTE2LjQgMC0yMi42czE2LjQtNi4yIDIyLjYgMGwzNi43IDM2LjcgMzYuNy0zNi43YzYuMi02LjIgMTYuNC02LjIgMjIuNiAwczYuMiAxNi40IDAgMjIuNnoiXQogICAgfTsKICAgIGZhR29wdXJhbSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnb3B1cmFtIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY2NjQiLCAiTTEyMCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgOCA0MCAwIDAtOGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgOCA0OCAwIDAtOGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgOCA0MCAwIDAtOGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgMTM2YzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgODBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAxMjhjMCAyNi41LTIxLjUgNDgtNDggNDhsLTQ4IDAgMC0yMjQtMzIgMCAwLTEyOC00OCAwIDAgMTI4IDMyIDAgMCAyMjQtMjI0IDAgMC0yMjQgMzIgMCAwLTEyOC00OCAwIDAgMTI4LTMyIDAgMCAyMjQtNDggMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCAzMzZjMC0yNi41IDIxLjUtNDggNDgtNDhsMC04MGMwLTI2LjUgMjEuNS00OCA0OC00OEw5NiAyNGMwLTEzLjMgMTAuNy0yNCAyNC0yNHpNMjU2IDIwOGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA0OCA2NCAwIDAtNDhjMC0xNy43LTE0LjMtMzItMzItMzJ6TTIwOCA0MDBsMCA2NCA5NiAwIDAtNjRjMC0yNi41LTIxLjUtNDgtNDgtNDhzLTQ4IDIxLjUtNDggNDh6TTI1NiA5NmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAzMiA2NCAwIDAtMzJjMC0xNy43LTE0LjMtMzItMzItMzJ6Il0KICAgIH07CiAgICBmYUhlYXJ0Q2lyY2xlTWludXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGVhcnQtY2lyY2xlLW1pbnVzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU0ZmYiLCAiTTI0MSA4Ny4xbDE1IDIwLjcgMTUtMjAuN0MyOTYgNTIuNSAzMzYuMiAzMiAzNzguOSAzMiA0NTIuNCAzMiA1MTIgOTEuNiA1MTIgMTY1LjFsMCAyLjZjMCAxNy42LTMuNCAzNS42LTkuNSA1My43LTIxLjgtOC42LTQ1LjYtMTMuNC03MC41LTEzLjQtMTA2IDAtMTkyIDg2LTE5MiAxOTIgMCAyOC41IDYuMiA1NS42IDE3LjQgODAtLjUgMC0uOSAwLTEuNCAwLTE1LjUgMC0zMC44LTQuNi00My4xLTE0LjEtNzMtNTUuNy0yMTIuOS0xODYtMjEyLjktMjk4LjJsMC0yLjZDMCA5MS42IDU5LjYgMzIgMTMzLjEgMzIgMTc1LjggMzIgMjE2IDUyLjUgMjQxIDg3LjF6TTI4OCA0MDBhMTQ0IDE0NCAwIDEgMSAyODggMCAxNDQgMTQ0IDAgMSAxIC0yODggMHptMjI0IDBjMC04LjgtNy4yLTE2LTE2LTE2bC0xMjggMGMtOC44IDAtMTYgNy4yLTE2IDE2czcuMiAxNiAxNiAxNmwxMjggMGM4LjggMCAxNi03LjIgMTYtMTZ6Il0KICAgIH07CiAgICBmYVN0YXJPZkxpZmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3Rhci1vZi1saWZlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY2MjEiLCAiTTIwOC41IDMyYzAtMTcuNyAxNC4zLTMyIDMyLTMybDMyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxNDAuOSAxMjItNzAuNGMxNS4zLTguOCAzNC45LTMuNiA0My43IDExLjdsMTYgMjcuN2M4LjggMTUuMyAzLjYgMzQuOS0xMS43IDQzLjdsLTEyMiA3MC40IDEyMiA3MC40YzE1LjMgOC44IDIwLjYgMjguNCAxMS43IDQzLjdsLTE2IDI3LjdjLTguOCAxNS4zLTI4LjQgMjAuNi00My43IDExLjdsLTEyMi03MC40IDAgMTQwLjljMCAxNy43LTE0LjMgMzItMzIgMzJsLTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTQwLjktMTIyIDcwLjRjLTE1LjMgOC44LTM0LjkgMy42LTQzLjctMTEuN2wtMTYtMjcuN2MtOC44LTE1LjMtMy42LTM0LjkgMTEuNy00My43bDEyMi03MC40LTEyMi03MC40Yy0xNS4zLTguOC0yMC41LTI4LjQtMTEuNy00My43bDE2LTI3LjdjOC44LTE1LjMgMjguNC0yMC41IDQzLjctMTEuN2wxMjIgNzAuNCAwLTE0MC45eiJdCiAgICB9OwogICAgZmFCdXNpbmVzc1RpbWUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnVzaW5lc3MtdGltZSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWyJicmllZmNhc2UtY2xvY2siXSwgImY2NGEiLCAiTTI2NCA0OGwxMTIgMGM0LjQgMCA4IDMuNiA4IDhsMCA0MC0xMjggMCAwLTQwYzAtNC40IDMuNi04IDgtOHptLTU2IDhsMCA0MC04MCAwYy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDk2IDMwNSAwYzMzLjgtMjkuOSA3OC4zLTQ4IDEyNy00OCAyOC42IDAgNTUuNiA2LjIgODAgMTcuNGwwLTY1LjRjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTgwIDAgMC00MGMwLTMwLjktMjUuMS01Ni01Ni01NkwyNjQgMGMtMzAuOSAwLTU2IDI1LjEtNTYgNTZ6bTgwIDI5NmMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0xNi0xOTIgMCAwIDExMmMwIDM1LjMgMjguNyA2NCA2NCA2NGwxOTMuNCAwYy0xMS4yLTI0LjQtMTcuNC01MS40LTE3LjQtODAgMC0xNi42IDIuMS0zMi43IDYtNDhsLTIyIDB6bTM1MiA0OGExNDQgMTQ0IDAgMSAwIC0yODggMCAxNDQgMTQ0IDAgMSAwIDI4OCAwek00OTYgMzIwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDQ4IDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2cy03LjIgMTYtMTYgMTZsLTQ4IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTY0YzAtOC44IDcuMi0xNiAxNi0xNnoiXQogICAgfTsKICAgIGZhQnJpZWZjYXNlQ2xvY2sgPSBmYUJ1c2luZXNzVGltZTsKICAgIGZhRmlyZUV4dGluZ3Vpc2hlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaXJlLWV4dGluZ3Vpc2hlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyOTUxOV0sICJmMTM0IiwgIk01MTIgMzJjMC05LjYtNC4zLTE4LjctMTEuNy0yNC43UzQ4My4xLTEuMyA0NzMuNyAuNmwtMTYwIDMyQzMwMS41IDM1LjEgMjkyIDQ0LjMgMjg5IDU2bC02NSAwIDAtMjRjMC0xNy43LTE0LjMtMzItMzItMzJMMTYwIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgMjguNGMtNTUuMyAxMi4zLTEwMS4zIDQ5LjUtMTI1LjUgOTkuMS01LjggMTEuOS0uOSAyNi4zIDExLjEgMzIuMXMyNi4zIC45IDMyLjEtMTEuMUM2MiAxNDYuOSA5MS44IDEyMS4xIDEyOCAxMTBsMCAyOC44Yy0zNy44IDE4LTY0IDU2LjUtNjQgMTAxLjJsMCAxMjggMjI0IDAgMC0xMjhjMC00NC43LTI2LjItODMuMi02NC0xMDEuMmwwLTM0LjggNjUgMGMzIDExLjcgMTIuNSAyMC45IDI0LjcgMjMuNGwxNjAgMzJjOS40IDEuOSAxOS4xLS42IDI2LjYtNi42UzUxMiAxMzcuNiA1MTIgMTI4bDAtOTZ6TTI4OCA0NDhsMC0zMi0yMjQgMCAwIDMyYzAgMzUuMyAyOC43IDY0IDY0IDY0bDk2IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjR6Il0KICAgIH07CiAgICBmYUFycm93RG93bkxvbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctZG93bi1sb25nIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbImxvbmctYXJyb3ctZG93biJdLCAiZjE3NSIsICJNMTM3LjQgNTM0LjZjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsMTI4LTEyOGMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMEwxOTIgNDM0LjcgMTkyIDBjMC0xNy43LTE0LjMtMzItMzItMzJTMTI4LTE3LjcgMTI4IDBsMCA0MzQuNy03My40LTczLjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zbDEyOCAxMjh6Il0KICAgIH07CiAgICBmYUxvbmdBcnJvd0Rvd24gPSBmYUFycm93RG93bkxvbmc7CiAgICBmYVVzZXJNaW51cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1c2VyLW1pbnVzIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY1MDMiLCAiTTEzNiAxMjhhMTIwIDEyMCAwIDEgMSAyNDAgMCAxMjAgMTIwIDAgMSAxIC0yNDAgMHpNNDggNDgyLjNDNDggMzgzLjggMTI3LjggMzA0IDIyNi4zIDMwNGw1OS40IDBjOTguNSAwIDE3OC4zIDc5LjggMTc4LjMgMTc4LjMgMCAxNi40LTEzLjMgMjkuNy0yOS43IDI5LjdMNzcuNyA1MTJDNjEuMyA1MTIgNDggNDk4LjcgNDggNDgyLjN6TTQ3MiAxNjhsMTQ0IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE0NCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFNb25leUNoZWNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vbmV5LWNoZWNrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1M2MiLCAiTTAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjU2YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjh6TTk2IDMxMmMwIDEzLjMgMTAuNyAyNCAyNCAyNGwxNDQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTQ0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0em0yNC0xMzZjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMjcyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTI3MiAweiJdCiAgICB9OwogICAgZmFIb3VzZUxhcHRvcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VzZS1sYXB0b3AiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsibGFwdG9wLWhvdXNlIl0sICJlMDY2IiwgIk00NDggMjQwbDE5LjkgMGMxNS41IDAgMjguMS0xMi42IDI4LjEtMjguMSAwLTcuNi0zLjEtMTQuOS04LjYtMjAuMkwyODMuNS00LjlDMjc2LjEtMTIgMjY2LjMtMTYgMjU2LTE2cy0yMC4xIDQtMjcuNSAxMS4xTDI0LjYgMTkxLjdDMTkuMSAxOTcgMTYgMjA0LjMgMTYgMjExLjkgMTYgMjI3LjQgMjguNiAyNDAgNDQuMSAyNDBsMTkuOSAwIDAgMTQ0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDg1LjcgMGM3LjQtNi42IDE2LjQtMTEuNCAyNi4zLTE0bDAtMTMwYzAtNS41IC43LTEwLjkgMi0xNmwtMTAgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC00OGMwLTEzLjMgMTAuNy0yNCAyNC0yNGw0OCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgMjQgMTQ0IDB6TTM1MiAzNTJsMTYwIDAgMCAxMjgtMTYwIDAgMC0xMjh6bS02NC0zMmwwIDE2MC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTYgMCAyNi41IDIxLjUgNDggNDggNDhsMjg4IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDggMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwIDAtMTYwYzAtMTcuNy0xNC4zLTMyLTMyLTMybC0yMjQgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6Il0KICAgIH07CiAgICBmYUxhcHRvcEhvdXNlID0gZmFIb3VzZUxhcHRvcDsKICAgIGZhRG93bmxvYWQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZG93bmxvYWQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjAxOSIsICJNMjU2IDMyYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMjEwLjctNDEuNC00MS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2w5NiA5NmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGw5Ni05NmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMEwyNTYgMjQyLjcgMjU2IDMyek02NCAzMjBjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgMzJjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMmMwLTM1LjMtMjguNy02NC02NC02NGwtNDYuOSAwLTU2LjYgNTYuNmMtMzEuMiAzMS4yLTgxLjkgMzEuMi0xMTMuMSAwTDExMC45IDMyMCA2NCAzMjB6bTMwNCA1NmEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6Il0KICAgIH07CiAgICBmYUNvdWNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvdWNoIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY0YjgiLCAiTTE0NCAyNzJDMTQ0IDIyNC43IDEwOS44IDE4NS40IDY0LjggMTc3LjUgNzIgMTEzLjYgMTI2LjIgNjQgMTkyIDY0bDI1NiAwYzY1LjggMCAxMjAgNDkuNiAxMjcuMiAxMTMuNS00NSA4LTc5LjIgNDcuMi03OS4yIDk0LjVsMCAzMi0zNTIgMCAwLTMyek0wIDM4NEwwIDI3MmMwLTI2LjUgMjEuNS00OCA0OC00OHM0OCAyMS41IDQ4IDQ4bDAgODAgNDQ4IDAgMC04MGMwLTI2LjUgMjEuNS00OCA0OC00OHM0OCAyMS41IDQ4IDQ4bDAgMTEyYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjR6Il0KICAgIH07CiAgICBmYVJvYWRMb2NrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJvYWQtbG9jayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTY3IiwgIk0yNTYgMzJsLTc2LjMgMGMtMjkuNCAwLTU1LjEgMjAuMS02Mi4xIDQ4LjZMMzMuNCA0MjAuNUMyNS45IDQ1MC43IDQ4LjggNDgwIDgwIDQ4MGwxNzUuOSAwIDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzIgNi4xIDAgMTEuOCAxLjcgMTYuNyA0LjcgMi44LTIzLjkgMTQuMy00NS4xIDMxLjQtNjAuM2wwLTI0LjRjMC03MC43IDU3LjMtMTI4IDEyOC0xMjggNi4yIDAgMTIuNCAuNCAxOC40IDEuM0w0NTguNSA4MC42QzQ1MS40IDUyLjEgNDI1LjggMzIgMzk2LjMgMzJsLTc2LjQgMCAwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNjR6bTY0IDE5MmwwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMnptMTc2IDgwLjFsMCA0Ny45LTY0IDAgMC00Ny45YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJ6TTM1MiA0MDBsMCA5NmMwIDI2LjUgMjEuNSA0OCA0OCA0OGwxMjggMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTk2YzAtMjAuOS0xMy40LTM4LjctMzItNDUuM2wwLTUwLjZjMC00NC4yLTM1LjgtODAtODAtODBzLTgwIDM1LjgtODAgODBsMCA1MC42Yy0xOC42IDYuNi0zMiAyNC40LTMyIDQ1LjN6Il0KICAgIH07CiAgICBmYVNjaXNzb3JzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNjaXNzb3JzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTk4NCwgOTk4NiwgOTk4OCwgImN1dCJdLCAiZjBjNCIsICJNMTkyIDI1NmwtMzkuNSAzOS41Yy0xMi42LTQuOS0yNi4yLTcuNS00MC41LTcuNS02MS45IDAtMTEyIDUwLjEtMTEyIDExMnM1MC4xIDExMiAxMTIgMTEyIDExMi01MC4xIDExMi0xMTJjMC0xNC4zLTIuNy0yNy45LTcuNS00MC41TDQ5OS4yIDc2LjhjNy4xLTcuMSA3LjEtMTguNSAwLTI1LjYtMjguMy0yOC4zLTc0LjEtMjguMy0xMDIuNCAwTDI1NiAxOTIgMjE2LjUgMTUyLjVjNC45LTEyLjYgNy41LTI2LjIgNy41LTQwLjUgMC02MS45LTUwLjEtMTEyLTExMi0xMTJTMCA1MC4xIDAgMTEyIDUwLjEgMjI0IDExMiAyMjRjMTQuMyAwIDI3LjktMi43IDQwLjUtNy41TDE5MiAyNTZ6bTk3LjkgOTcuOUwzOTYuOCA0NjAuOGMyOC4zIDI4LjMgNzQuMSAyOC4zIDEwMi40IDAgNy4xLTcuMSA3LjEtMTguNSAwLTI1LjZsLTE0NS4zLTE0NS4zLTY0IDY0ek02NCAxMTJhNDggNDggMCAxIDEgOTYgMCA0OCA0OCAwIDEgMSAtOTYgMHptNDggMjQwYTQ4IDQ4IDAgMSAxIDAgOTYgNDggNDggMCAxIDEgMC05NnoiXQogICAgfTsKICAgIGZhQ3V0ID0gZmFTY2lzc29yczsKICAgIGZhQnVnID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJ1ZyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMTg4IiwgIk0xOTIgOTZjMC01MyA0My05NiA5Ni05NnM5NiA0MyA5NiA5NmwwIDMuNmMwIDE1LjctMTIuNyAyOC40LTI4LjQgMjguNGwtMTM1LjEgMGMtMTUuNyAwLTI4LjQtMTIuNy0yOC40LTI4LjRsMC0zLjZ6bTM0NS42IDEyLjhjMTAuNiAxNC4xIDcuNyAzNC4yLTYuNCA0NC44bC05Ny44IDczLjNjNS4zIDguOSA5LjMgMTguNyAxMS44IDI5LjFsOTguOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC05NiAwIDAgMzJjMCAyLjYtLjEgNS4zLS4yIDcuOWw4My40IDYyLjVjMTQuMSAxMC42IDE3IDMwLjcgNi40IDQ0LjhzLTMwLjcgMTctNDQuOCA2LjRsLTYzLjEtNDcuM2MtMjMuMiA0NC4yLTY2LjUgNzYuMi0xMTcuNyA4My45TDMxMiAyODBjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAyMzAuMmMtNTEuMi03LjctOTQuNS0zOS43LTExNy43LTgzLjlMODMuMiA0NzMuNmMtMTQuMSAxMC42LTM0LjIgNy43LTQ0LjgtNi40cy03LjctMzQuMiA2LjQtNDQuOGw4My40LTYyLjVjLS4xLTIuNi0uMi01LjItLjItNy45bDAtMzItOTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw5OC44IDBjMi41LTEwLjQgNi41LTIwLjIgMTEuOC0yOS4xTDQ0LjggMTUzLjZjLTE0LjEtMTAuNi0xNy0zMC43LTYuNC00NC44czMwLjctMTcgNDQuOC02LjRMMTkyIDE4NGMxMi4zLTUuMSAyNS44LTggNDAtOGwxMTIgMGMxNC4yIDAgMjcuNyAyLjggNDAgOGwxMDguOC04MS42YzE0LjEtMTAuNiAzNC4yLTcuNyA0NC44IDYuNHoiXQogICAgfTsKICAgIGZhQXJyb3dSaWdodEZyb21CcmFja2V0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXJpZ2h0LWZyb20tYnJhY2tldCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJzaWduLW91dCJdLCAiZjA4YiIsICJNMTYwIDk2YzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDk2IDMyQzQzIDMyIDAgNzUgMCAxMjhMMCAzODRjMCA1MyA0MyA5NiA5NiA5Nmw2NCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC02NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTI1NmMwLTE3LjcgMTQuMy0zMiAzMi0zMmw2NCAwek01MDIuNiAyNzguNmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM2wtMTI4LTEyOGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNMNDAyLjcgMjI0IDE5MiAyMjRjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMjEwLjcgMC03My40IDczLjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBsMTI4LTEyOHoiXQogICAgfTsKICAgIGZhU2lnbk91dCA9IGZhQXJyb3dSaWdodEZyb21CcmFja2V0OwogICAgZmFIYW5kSG9sZGluZ0hhbmQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1ob2xkaW5nLWhhbmQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRmNyIsICJNNDY2LjggMTg2LjVsNDIuNS00Mi41IDM0LjcgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTY0YzAtMTcuNy0xNC4zLTMyLTMyLTMyTDIyMy42IDE2Yy0yOSAwLTU3LjMgOS4zLTgwLjcgMjYuNUwxNi4zIDEzNS44Yy0xNy44IDEzLjEtMjEuNiAzOC4xLTguNSA1NS45czM4LjEgMjEuNiA1NS45IDguNUwxODMuNCAxMTIgMjk2IDExMmMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNzIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwxNTIuMiAwYzMzLjkgMCA2Ni41LTEzLjUgOTAuNS0zNy41em0tMzU3LjUgMTM5TDY2LjcgMzY4IDMyIDM2OGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMjAuNSAwYzI5IDAgNTcuMy05LjMgODAuNy0yNi41bDEyNi42LTkzLjNjMTcuOC0xMy4xIDIxLjYtMzguMSA4LjUtNTUuOXMtMzguMS0yMS42LTU1LjktOC41TDM5Mi42IDQwMCAyODAgNDAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDcyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTE1Mi4yIDBjLTMzLjkgMC02Ni41IDEzLjUtOTAuNSAzNy41eiJdCiAgICB9OwogICAgZmFTdHJvb3B3YWZlbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzdHJvb3B3YWZlbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNTUxIiwgIk0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwek0zMTIuNiA2My43Yy02LjItNi4yLTE2LjQtNi4yLTIyLjYgMEwyNTYgOTcuNiAyMjIuMSA2My43Yy02LjItNi4yLTE2LjQtNi4yLTIyLjYgMHMtNi4yIDE2LjQgMCAyMi42bDMzLjkgMzMuOS00NS4zIDQ1LjMtNTYuNi01Ni42Yy02LjItNi4yLTE2LjQtNi4yLTIyLjYgMHMtNi4yIDE2LjQgMCAyMi42bDU2LjYgNTYuNi00NS4zIDQ1LjMtMzMuOS0zMy45Yy02LjItNi4yLTE2LjQtNi4yLTIyLjYgMHMtNi4yIDE2LjQgMCAyMi42TDk3LjYgMjU2IDYzLjcgMjg5LjljLTYuMiA2LjItNi4yIDE2LjQgMCAyMi42czE2LjQgNi4yIDIyLjYgMGwzMy45LTMzLjkgNDUuMyA0NS4zLTU2LjYgNTYuNmMtNi4yIDYuMi02LjIgMTYuNCAwIDIyLjZzMTYuNCA2LjIgMjIuNiAwbDU2LjYtNTYuNiA0NS4zIDQ1LjMtMzMuOSAzMy45Yy02LjIgNi4yLTYuMiAxNi40IDAgMjIuNnMxNi40IDYuMiAyMi42IDBsMzMuOS0zMy45IDMzLjkgMzMuOWM2LjIgNi4yIDE2LjQgNi4yIDIyLjYgMHM2LjItMTYuNCAwLTIyLjZsLTMzLjktMzMuOSA0NS4zLTQ1LjMgNTYuNiA1Ni42YzYuMiA2LjIgMTYuNCA2LjIgMjIuNiAwczYuMi0xNi40IDAtMjIuNmwtNTYuNi01Ni42IDQ1LjMtNDUuMyAzMy45IDMzLjljNi4yIDYuMiAxNi40IDYuMiAyMi42IDBzNi4yLTE2LjQgMC0yMi42bC0zMy45LTMzLjkgMzMuOS0zMy45YzYuMi02LjIgNi4yLTE2LjQgMC0yMi42cy0xNi40LTYuMi0yMi42IDBsLTMzLjkgMzMuOS00NS4zLTQ1LjMgNTYuNi01Ni42YzYuMi02LjIgNi4yLTE2LjQgMC0yMi42cy0xNi40LTYuMi0yMi42IDBsLTU2LjYgNTYuNi00NS4zLTQ1LjMgMzMuOS0zMy45YzYuMi02LjIgNi4yLTE2LjQgMC0yMi42ek0xNDIuOSAyNTZsNDUuMy00NS4zIDQ1LjMgNDUuMy00NS4zIDQ1LjMtNDUuMy00NS4zem02Ny45IDY3LjlsNDUuMy00NS4zIDQ1LjMgNDUuMy00NS4zIDQ1LjMtNDUuMy00NS4zek0yNzguNiAyNTZsNDUuMy00NS4zIDQ1LjMgNDUuMy00NS4zIDQ1LjMtNDUuMy00NS4zem0yMi42LTY3LjlsLTQ1LjMgNDUuMy00NS4zLTQ1LjMgNDUuMy00NS4zIDQ1LjMgNDUuM3oiXQogICAgfTsKICAgIGZhQ2hpbGQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hpbGQiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZjFhZSIsICJNOTYgNjRBNjQgNjQgMCAxIDEgMjI0IDY0IDY0IDY0IDAgMSAxIDk2IDY0em00OCAzMjBsMCA5NmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMkw4MCAyODcuOCA1OS4xIDMyMWMtOS40IDE1LTI5LjIgMTkuNC00NC4xIDEwUy00LjUgMzAxLjkgNC45IDI4N2wzOS45LTYzLjNDNjkuNyAxODQgMTEzLjIgMTYwIDE2MCAxNjBzOTAuMyAyNCAxMTUuMiA2My42TDMxNS4xIDI4N2M5LjQgMTUgNC45IDM0LjctMTAgNDQuMXMtMzQuNyA0LjktNDQuMS0xMEwyNDAgMjg3LjggMjQwIDQ4MGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTk2LTMyIDB6Il0KICAgIH07CiAgICBmYUljZUNyZWFtID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImljZS1jcmVhbSIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyNzg0OF0sICJmODEwIiwgIk0zMzUuMSAxNjBjLjYtNS4zIC45LTEwLjYgLjktMTYgMC03OS41LTY0LjUtMTQ0LTE0NC0xNDRTNDggNjQuNSA0OCAxNDRjMCA1LjQgLjMgMTAuNyAuOSAxNmwtLjkgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhzMjEuNSA0OCA0OCA0OGwyODggMGMyNi41IDAgNDgtMjEuNSA0OC00OHMtMjEuNS00OC00OC00OGwtLjkgMHpNNjQgMzA0TDE2OS4yIDUyOS41YzQuMSA4LjggMTMgMTQuNSAyMi44IDE0LjVzMTguNi01LjcgMjIuOC0xNC41TDMyMCAzMDQgNjQgMzA0eiJdCiAgICB9OwogICAgZmFDb21wdXRlck1vdXNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvbXB1dGVyLW1vdXNlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4NDMzLCAibW91c2UiXSwgImY4Y2MiLCAiTTAgMTkybDE2OCAwIDAtMTkyLTggMEM3MS42IDAgMCA3MS42IDAgMTYwbDAgMzJ6bTAgNDhMMCAzNTJjMCA4OC40IDcxLjYgMTYwIDE2MCAxNjBsNjQgMGM4OC40IDAgMTYwLTcxLjYgMTYwLTE2MGwwLTExMi0zODQgMHptMzg0LTQ4bDAtMzJDMzg0IDcxLjYgMzEyLjQgMCAyMjQgMGwtOCAwIDAgMTkyIDE2OCAweiJdCiAgICB9OwogICAgZmFNb3VzZSA9IGZhQ29tcHV0ZXJNb3VzZTsKICAgIGZhRmF1Y2V0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhdWNldCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMDA1IiwgIk0xOTIgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmw5NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC05NiAwIDAgNjQgMTguNyAwYzguNSAwIDE2LjYgMy40IDIyLjYgOS40bDIyLjYgMjIuNiAzMiAwYzg4LjQgMCAxNjAgNzEuNiAxNjAgMTYwIDAgMTcuNy0xNC4zIDMyLTMyIDMybC02NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMtMTQuMy0zMi0zMi0zMmwtMzYuMSAwYy0yMC4yIDI5LTUzLjkgNDgtOTEuOSA0OHMtNzEuNy0xOS05MS45LTQ4TDMyIDM1MmMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC02NGMwLTE3LjcgMTQuMy0zMiAzMi0zMmw5NiAwIDIyLjYtMjIuNmM2LTYgMTQuMS05LjQgMjIuNi05LjRsMTguNyAwIDAtNjQtOTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJTNzguMyA2NCA5NiA2NGw5NiAweiJdCiAgICB9OwogICAgZmFBd2FyZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhd2FyZCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNTU5IiwgIk0yNDUuOS0yNS45Yy0xMy40LTguMi0zMC4zLTguMi00My43IDAtMjQuNCAxNC45LTM5LjUgMTguOS02OC4xIDE4LjMtMTUuNy0uNC0zMC4zIDguMS0zNy45IDIxLjktMTMuNyAyNS4xLTI0LjggMzYuMi00OS45IDQ5LjktMTMuOCA3LjUtMjIuMiAyMi4yLTIxLjkgMzcuOSAuNyAyOC42LTMuNCA0My43LTE4LjMgNjguMS04LjIgMTMuNC04LjIgMzAuMyAwIDQzLjcgMTQuOSAyNC40IDE4LjkgMzkuNSAxOC4zIDY4LjEtLjQgMTUuNyA4LjEgMzAuMyAyMS45IDM3LjkgMjIuMSAxMi4xIDMzLjMgMjIuMSA0NS4xIDQxLjVMNDIuNyA0NTguNWMtNS45IDExLjktMS4xIDI2LjMgMTAuNyAzMi4ybDg2IDQzYzExLjUgNS43IDI1LjUgMS40IDMxLjctOS44bDUyLjgtOTUuMSA1Mi44IDk1LjFjNi4yIDExLjIgMjAuMiAxNS42IDMxLjcgOS44bDg2LTQzYzExLjktNS45IDE2LjctMjAuMyAxMC43LTMyLjJsLTQ4LjYtOTcuMmMxMS43LTE5LjQgMjMtMjkuNCA0NS4xLTQxLjUgMTMuOC03LjUgMjIuMi0yMi4yIDIxLjktMzcuOS0uNy0yOC42IDMuNC00My43IDE4LjMtNjguMSA4LjItMTMuNCA4LjItMzAuMyAwLTQzLjctMTQuOS0yNC40LTE4LjktMzkuNS0xOC4zLTY4LjEgLjQtMTUuNy04LjEtMzAuMy0yMS45LTM3LjktMjUuMS0xMy43LTM2LjItMjQuOC00OS45LTQ5LjktNy41LTEzLjgtMjIuMi0yMi4yLTM3LjktMjEuOS0yOC42IC43LTQzLjctMy40LTY4LjEtMTguM3pNMjI0IDk2YTk2IDk2IDAgMSAxIDAgMTkyIDk2IDk2IDAgMSAxIDAtMTkyeiJdCiAgICB9OwogICAgZmFQZXJzb25Ecm93bmluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tZHJvd25pbmciLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU0NSIsICJNMjY0IDg4YTU2IDU2IDAgMSAxIDExMiAwIDU2IDU2IDAgMSAxIC0xMTIgMHpNMTMzLjkgNjUuNmMxNi44LTUuNiAzNC45IDMuNSA0MC41IDIwLjJsMTAuOSAzMi44YzkuNCAyOC4zIDMzLjIgNDkuNSA2Mi41IDU1LjYgNS42IDEuMiAxMS4zIDEuOCAxNy4xIDEuOGw4OCAwYzE3LjIgMCAzNC4zLTIuOCA1MC42LTguMmwxMTQuNC0zOC4xYzE2LjgtNS42IDM0LjkgMy41IDQwLjUgMjAuMnMtMy41IDM0LjktMjAuMiA0MC41TDQyMy43IDIyOC41Yy04LjQgMi44LTE3IDUuMS0yNS43IDYuOWwtMjYuNSA4OC4zYy02LjEgMy40LTEyLjEgNy4zLTE3LjkgMTEuNy0yMi4xIDE2LjYtMjkuMSAxNi42LTUxLjIgMC0yNi4yLTE5LjctNTYuOS0zMC4yLTg3LjgtMzEuM2wyMC4yLTY3LjJjLTUxLjUtMTAuNy05My41LTQ4LjEtMTEwLjItOThsLTEwLjktMzIuOGMtNS42LTE2LjggMy41LTM0LjkgMjAuMi00MC41ek00MDMuNCA0MTIuMUMzNzkuMSA0MzAuMyAzNTEuMSA0NDggMzIwIDQ0OHMtNTkuMS0xNy43LTgzLjQtMzUuOWMtMjEuMy0xNi4xLTQ5LjktMTYuMS03MS4yIDAtMjMuOCAxNy45LTU0LjEgMzUuNS04OC4xIDM1LjMtMjAuNC0uMS00MC43LTYuNy01OS44LTIxLjEtMTAuNi04LTEyLjctMjMtNC43LTMzLjZzMjMtMTIuNyAzMy42LTQuN2MxMS4zIDguNSAyMS42IDExLjQgMzEuMiAxMS41IDE3LjYgLjEgMzcuMy05LjQgNTguOS0yNS43IDM4LjQtMjkgOTAuNS0yOSAxMjkgMCAyNCAxOC4xIDQwLjcgMjYuMyA1NC41IDI2LjNzMzAuNS04LjIgNTQuNS0yNi4zYzM4LjQtMjkgOTAuNS0yOSAxMjkgMCAxNi45IDEyLjcgMzIuOSAyMS41IDQ3LjggMjQuNiAxMy43IDIuOCAyNy40IC45IDQyLjMtMTAuMyAxMC42LTggMjUuNi01LjkgMzMuNiA0LjdzNS45IDI1LjYtNC43IDMzLjZjLTI2LjQgMTkuOS01NC4yIDI0LjQtODAuNyAxOS4xLTI1LjMtNS4xLTQ4LjEtMTguOS02Ny4yLTMzLjMtMjEuMy0xNi4xLTQ5LjktMTYuMS03MS4yIDB6Il0KICAgIH07CiAgICBmYUNhbWVyYVJvdGF0ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYW1lcmEtcm90YXRlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUwZDgiLCAiTTEzOC43IDk2bDEwLjQtMzEuMkMxNTUuNiA0NS4yIDE3My45IDMyIDE5NC42IDMybDEyMi44IDBjMjAuNyAwIDM5IDEzLjIgNDUuNSAzMi44TDM3My4zIDk2IDQ0OCA5NmMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI1NmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTYwYzAtMzUuMyAyOC43LTY0IDY0LTY0bDc0LjcgMHpNOTYgMzA1LjljMCAzLjkgMS40IDcuNyA0IDEwLjZsNDggNTRjNi40IDcuMiAxNy42IDcuMiAyMy45IDBsNDgtNTRjMi42LTIuOSA0LTYuNyA0LTEwLjZsMC0xLjljMC04LjgtNy4yLTE2LTE2LTE2bC0yNCAwYzAtMzkuOCAzMi4yLTcyIDcyLTcyIDQuNCAwIDguNyAuNCAxMi45IDEuMmwzNC45LTM5LjNjLTE0LjYtNi40LTMwLjgtOS45LTQ3LjgtOS45LTY2LjMgMC0xMjAgNTMuNy0xMjAgMTIwbC0yNCAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAxLjl6bTE5Ni00Ni41Yy0yLjYgMi45LTQgNi43LTQgMTAuNmwwIDEuOWMwIDguOCA3LjIgMTYgMTYgMTZsMjQgMGMwIDM5LjgtMzIuMiA3Mi03MiA3Mi00LjQgMC04LjctLjQtMTIuOS0xLjJsLTM0LjkgMzkuM2MxNC43IDYuNCAzMC44IDkuOSA0Ny44IDkuOSA2Ni4zIDAgMTIwLTUzLjcgMTIwLTEyMGwyNCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTEuOWMwLTMuOS0xLjQtNy43LTQtMTAuNmwtNDgtNTRjLTYuNC03LjItMTcuNi03LjItMjMuOSAwbC00OCA1NHoiXQogICAgfTsKICAgIGZhRmFjZUdyaW5IZWFydHMyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi1oZWFydHMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MjUsICJncmluLWhlYXJ0cyJdLCAiZjU4NCIsICJNMjU2IDUxMmMxNDEuNCAwIDI1Ni0xMTQuNiAyNTYtMjU2IDAtMjMuMy0zLjEtNDUuOS04LjktNjcuMyA1LjUtMTMuNSA4LjktMjguNCA4LjktNDQuNyAwLTUzLTQzLTk2LTk2LTk2bC0yLjkgMGMtMi41IDAtNSAuMS03LjQgLjMtNDIuMS0zMC40LTkzLjgtNDguMy0xNDkuNy00OC4zUzE0OC40IDE3LjkgMTA2LjMgNDguM2MtMi41LS4yLTQuOS0uMy03LjQtLjNMOTYgNDhjLTUzIDAtOTYgNDMtOTYgOTYgMCAxNi4zIDMuNSAzMS4yIDguOSA0NC43LTUuOCAyMS40LTguOSA0NC04LjkgNjcuMyAwIDE0MS40IDExNC42IDI1NiAyNTYgMjU2ek0zODYuNyAzMjQuOWMxMS45LTMuNyAyMy45IDYuMyAxOS42IDE4LjEtMjIuNCA2MS4zLTgxLjMgMTA1LjEtMTUwLjMgMTA1LjFTMTI4LjEgNDA0LjIgMTA1LjcgMzQyLjljLTQuMy0xMS44IDcuNy0yMS44IDE5LjYtMTguMSAzOS4yIDEyLjIgODMuNyAxOS4xIDEzMC43IDE5LjFzOTEuNS02LjkgMTMwLjctMTkuMXpNMzIyLjkgOTZjMTMuNSAwIDI2LjUgNS40IDM2IDE0LjlsOS4xIDkuMSA5LjEtOS4xYzkuNS05LjUgMjIuNS0xNC45IDM2LTE0LjlsMi45IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDggMCA1My40LTY2LjkgOTUuNy04OSAxMDguMi00LjQgMi41LTkuNiAyLjUtMTQgMC0yMi4xLTEyLjUtODktNTQuOC04OS0xMDguMiAwLTI2LjUgMjEuNS00OCA0OC00OGwyLjkgMHptLTE4OCAxNC45bDkuMSA5LjEgOS4xLTkuMWM5LjUtOS41IDIyLjUtMTQuOSAzNi0xNC45bDIuOSAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4IDAgNTMuNC02Ni45IDk1LjctODkgMTA4LjItNC40IDIuNS05LjYgMi41LTE0IDAtMjIuMS0xMi41LTg5LTU0LjgtODktMTA4LjIgMC0yNi41IDIxLjUtNDggNDgtNDhsMi45IDBjMTMuNSAwIDI2LjUgNS40IDM2IDE0Ljl6Il0KICAgIH07CiAgICBmYUdyaW5IZWFydHMyID0gZmFGYWNlR3JpbkhlYXJ0czI7CiAgICBmYUZpbGVGcmFnbWVudCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLWZyYWdtZW50IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImU2OTciLCAiTTY0IDBDMjguNyAwIDAgMjguNyAwIDY0bDAgMjQwIDEyOCAwYzQ0LjIgMCA4MCAzNS44IDgwIDgwbDAgMTI4IDExMiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjc3LjVjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNMMjU4LjcgMTguN0MyNDYuNyA2LjcgMjMwLjUgMCAyMTMuNSAwTDY0IDB6TTMyNS41IDE3NkwyMzIgMTc2Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNEwyMDggNTguNSAzMjUuNSAxNzZ6TTMyIDM1MmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA5NmMwIDE3LjcgMTQuMyAzMiAzMiAzMmw5NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtOTZjMC0xNy43LTE0LjMtMzItMzItMzJsLTk2IDB6Il0KICAgIH07CiAgICBmYVBlcnNvbk1pbGl0YXJ5UmlmbGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLW1pbGl0YXJ5LXJpZmxlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU1NGIiLCAiTTEyOCAzOWMwLTEzIDEwLTIzLjggMjIuOS0yNC45TDMwMi43IDEuNEMzMTIgLjcgMzIwIDggMzIwIDE3LjRMMzIwIDQ4YzAgOC44LTcuMiAxNi0xNiAxNkwxNTMgNjRjLTEzLjggMC0yNS0xMS4yLTI1LTI1em0xNy42IDU3bDE1Ni44IDBjMSA1LjIgMS42IDEwLjUgMS42IDE2IDAgNDQuMi0zNS44IDgwLTgwIDgwcy04MC0zNS44LTgwLTgwYzAtNS41IC42LTEwLjggMS42LTE2em0yMjggMzY0LjNMMzIwIDM2OS43IDMyMCA0ODBjMCAxLjMtLjEgMi41LS4yIDMuOEwxNDUuNSAyMzQuOWMxNi42LTcuMSAzNC42LTEwLjkgNTMuMy0xMC45bDUwLjQgMGMxNS45IDAgMzEuMyAyLjggNDUuOCA3LjlMMzg5LjkgNjcuN2MtNy43LTQuNC0xMC4zLTE0LjItNS45LTIxLjlzMTQuMi0xMC4zIDIxLjktNS45bDI3LjcgMTZjNy43IDQuNCAxMC4zIDE0LjIgNS45IDIxLjlsLTU1LjUgOTYuMSAxLjYgLjljMTUuMyA4LjggMjAuNiAyOC40IDExLjcgNDMuN0wzNjAuNyAyODJjMiAyLjggMy45IDUuOCA1LjcgOC44bDc2LjEgMTI4LjhjMTEuMiAxOSA0LjkgNDMuNS0xNC4xIDU0LjhzLTQzLjUgNC45LTU0LjgtMTQuMXpNMjg4IDUxMmwtMTI4IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTEwLjMtNTMuNiA5MC42Yy0xMS4yIDE5LTM1LjggMjUuMy01NC44IDE0LjFTLTUuNyA0MzguNyA1LjYgNDE5LjdMODEuNyAyOTAuOGM5LjQtMTUuOCAyMS43LTI5LjMgMzYtNDBMMjk5LjEgNTEwYy0zLjUgMS4zLTcuMiAyLTExLjEgMnpNMjY0IDMyMGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6Il0KICAgIH07CiAgICBmYVRvZ2dsZU9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRvZ2dsZS1vbiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMjA1IiwgIk0xOTIgNjRDODYgNjQgMCAxNTAgMCAyNTZTODYgNDQ4IDE5MiA0NDhsMTkyIDBjMTA2IDAgMTkyLTg2IDE5Mi0xOTJTNDkwIDY0IDM4NCA2NEwxOTIgNjR6bTE5MiA5NmE5NiA5NiAwIDEgMSAwIDE5MiA5NiA5NiAwIDEgMSAwLTE5MnoiXQogICAgfTsKICAgIGZhTHVuZ3NWaXJ1cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsdW5ncy12aXJ1cyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlMDY3IiwgIk0yODggMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAxNTEuM2M5LjYtNC44IDIwLjUtNy41IDMyLTcuNXMyMi40IDIuNyAzMiA3LjVMMzIwIDMyYzAtMTcuNy0xNC4zLTMyLTMyLTMyek00NTAuMSA0NTFjOCAxOC4zIDguMSAzOS4yIC4yIDU3LjUgMTAuMiAyLjMgMjAuNiAzLjUgMzEuMiAzLjUgNTIuMiAwIDk0LjUtNDIuMyA5NC41LTk0LjVsMC02LjJjMC0xMTEuMS0zNi43LTIxOS0xMDQuNC0zMDdMNDI4LjkgNDguN2MtOC4xLTEwLjYtMjAuNy0xNi43LTM0LTE2LjctMjMuNyAwLTQyLjkgMTkuMi00Mi45IDQyLjlsMCAxMzkuOWMxLjIgMi4yIDIuMiA0LjYgMy4xIDYuOSAyNi40LTExLjYgNTguMy02LjYgNzkuOSAxNXMyNi42IDUzLjYgMTUgNzkuOUM0NzcgMzI3LjIgNDk2IDM1My4zIDQ5NiAzODMuOHMtMTkgNTYuNy00NS45IDY3LjF6TTIyMC45IDIyMS44Yy45LTIuNCAyLTQuNyAzLjEtNi45bDAtMTM4LjVjMC0yNC41LTE5LjktNDQuNC00NC40LTQ0LjQtMTIuNSAwLTI0LjQgNS4zLTMyLjggMTQuNWwtMjYuNCAyOUM0Mi45IDE2MC44IDAgMjcxLjggMCAzODdsMCAzMC41YzAgNTIuMiA0Mi4zIDk0LjUgOTQuNSA5NC41IDEwLjUgMCAyMS0xLjIgMzEuMi0zLjUtNy45LTE4LjMtNy44LTM5LjMgLjItNTcuNS0yNi45LTEwLjQtNDUuOS0zNi42LTQ1LjktNjcuMXMxOS01Ni43IDQ1LjktNjcuMWMtMTEuNi0yNi40LTYuNi01OC4zIDE1LTc5LjlzNTMuNi0yNi42IDc5LjktMTV6TTE1MiA0MDhjMjguOCAwIDQzLjIgMzQuOCAyMi45IDU1LjItOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwYzIwLjQtMjAuNCA1NS4yLTUuOSA1NS4yIDIyLjkgMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGMwLTI4LjggMzQuOC00My4yIDU1LjItMjIuOSA5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjljLTIwLjQtMjAuNC01LjktNTUuMiAyMi45LTU1LjIgMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRjLTI4LjggMC00My4yLTM0LjgtMjIuOS01NS4yIDkuNC05LjQgOS40LTI0LjYgMC0zMy45cy0yNC42LTkuNC0zMy45IDBjLTIwLjQgMjAuNC01NS4yIDUuOS01NS4yLTIyLjkgMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRjMCAyOC44LTM0LjggNDMuMi01NS4yIDIyLjktOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWMyMC40IDIwLjQgNS45IDU1LjItMjIuOSA1NS4yLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjR6bTEwNC04MGEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6bTQwIDg4YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6Il0KICAgIH07CiAgICBmYVRhYmxlVGVubmlzUGFkZGxlQmFsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWJsZS10ZW5uaXMtcGFkZGxlLWJhbGwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjc5NTUsICJwaW5nLXBvbmctcGFkZGxlLWJhbGwiLCAidGFibGUtdGVubmlzIl0sICJmNDVkIiwgIk05NyAxMjdsNjcuNC02Ny40YzM4LjItMzguMiA5MC01OS42IDE0NC01OS42IDExMi41IDAgMjAzLjcgOTEuMiAyMDMuNyAyMDMuNiAwIDQ2LjQtMTUuOCA5MS4xLTQ0LjUgMTI3LTIzLjYtMTYuOC01Mi40LTI2LjctODMuNS0yNi43LTMxLjEgMC01OS45IDkuOS04My40IDI2LjZMOTcgMTI3ek0yNDAgNDQ4YzAgOS43IDEgMTkuMSAyLjggMjguMi0xOS44LTUuMi0zOC0xNS41LTUyLjctMzAuMi0xMi4yLTEyLjItMzEuOS0xMi4yLTQ0LjEgMEw5Ni42IDQ5NS40Yy0xMC42IDEwLjYtMjUgMTYuNi00MCAxNi42LTMxLjIgMC01Ni42LTI1LjMtNTYuNi01Ni42IDAtMTUgNi0yOS40IDE2LjYtNDBsNDkuNC00OS40YzEyLjItMTIuMiAxMi4yLTMxLjkgMC00NC4xLTIxLjctMjEuNy0zMy45LTUxLjItMzMuOS04MS45IDAtMjkuNCAxMS4xLTU3LjYgMzEuMS03OUwyNjYuNiAzNjQuNkMyNDkuOSAzODguMSAyNDAgNDE2LjkgMjQwIDQ0OHptMTQ0LTk2YTk2IDk2IDAgMSAxIDAgMTkyIDk2IDk2IDAgMSAxIDAtMTkyeiJdCiAgICB9OwogICAgZmFQaW5nUG9uZ1BhZGRsZUJhbGwgPSBmYVRhYmxlVGVubmlzUGFkZGxlQmFsbDsKICAgIGZhVGFibGVUZW5uaXMgPSBmYVRhYmxlVGVubmlzUGFkZGxlQmFsbDsKICAgIGZhQm94ZXNQYWNraW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJveGVzLXBhY2tpbmciLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRjNyIsICJNMjA4IDBsODAgMCAwIDU2YzAgMTMuMyAxMC43IDI0IDI0IDI0bDgwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC01NiA4MCAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgNDE2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xMDguOCAwYzguMi0xNC4xIDEyLjgtMzAuNSAxMi44LTQ4bDAtMTYwYzEwLTEzLjQgMTYtMzAgMTYtNDhsMC0zMmMwLTQ0LjItMzUuOC04MC04MC04MGwtMTc2IDAgMC05NmMwLTI2LjUgMjEuNS00OCA0OC00OHpNMzIgMzM2bDMyMCAwIDAgMTI4YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDgwIDUxMmMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC0xMjh6TTQ4IDE5MmwyODggMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDMyYzAgMTcuNy0xNC4zIDMyLTMyIDMyTDQ4IDI4OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnoiXQogICAgfTsKICAgIGZhUGVyc29uQ2hhbGtib2FyZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tY2hhbGtib2FyZCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTNkIiwgIk0xOTIgODBhNTYgNTYgMCAxIDAgMC0xMTIgNTYgNTYgMCAxIDAgMCAxMTJ6TTE3NiA1MTJsMC0xNjBjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDE2MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzM2IDEyOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0xNiAwIDAtNDggMTkyIDAgMCAxOTItMTkyIDAgMC0zMi02NCAwIDAgNDhjMCAyNi41IDIxLjUgNDggNDggNDhsMjI0IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0yMjRjMC0yNi41LTIxLjUtNDgtNDgtNDhMMzY4IDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgNjQtMTIyLjcgMGMtNDUuNiAwLTg4LjUgMjEuNi0xMTUuNiA1OC4yTDE0LjMgMjYwLjljLTEwLjUgMTQuMi03LjYgMzQuMiA2LjYgNDQuOHMzNC4yIDcuNiA0NC44LTYuNkwxMTIgMjM2LjcgMTEyIDUxMmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMyeiJdCiAgICB9OwogICAgZmFEaWNlVHdvID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRpY2UtdHdvIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbOTg1N10sICJmNTI4IiwgIk0wIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NnpNMzUyIDM1MmEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwek0xMjggMTkyYTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHoiXQogICAgfTsKICAgIGZhQXJyb3dSaWdodEFycm93TGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy1yaWdodC1hcnJvdy1sZWZ0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbODY0NCwgImV4Y2hhbmdlIl0sICJmMGVjIiwgIk01MDIuNiAxNTAuNmwtOTYgOTZjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwcy0xMi41LTMyLjggMC00NS4zTDQwMi43IDE2MCAzMiAxNjBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyUzE0LjMgOTYgMzIgOTZsMzcwLjcgMC00MS40LTQxLjRjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zczMyLjgtMTIuNSA0NS4zIDBsOTYgOTZjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjN6bS0zOTcuMyAzNTJsLTk2LTk2Yy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM2w5Ni05NmMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zTDEwOS4zIDM1MiA0ODAgMzUyYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0zNzAuNyAwIDQxLjQgNDEuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMHoiXQogICAgfTsKICAgIGZhRXhjaGFuZ2UgPSBmYUFycm93UmlnaHRBcnJvd0xlZnQ7CiAgICBmYUZvb3RiYWxsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZvb3RiYWxsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3OTQ0LCAiZm9vdGJhbGwtYmFsbCJdLCAiZjQ0ZSIsICJNMjYxLjEgMjIuNmMtODkgMTgtMTUwLjUgNjMuNC0xOTAgMTIzLjktMjMuMyAzNS42LTM4LjEgNzUuMy00Ni43IDExNS41TDI1MS45IDQ4OS40Yzg5LTE4IDE1MC41LTYzLjQgMTkwLjEtMTIzLjkgMjMuMy0zNS42IDM4LjEtNzUuMyA0Ni43LTExNS41TDI2MS4xIDIyLjZ6bTIzNiAxNjguMWMzLjItNDIuMyAuNy04My4zLTQuOC0xMTguNy00LjQtMjcuOC0yNi44LTQ4LTUzLjEtNTEuNi00My01LjktODIuMi03LjUtMTE3LjgtNS40TDQ5Ny4xIDE5MC42ek0xOTEuNyA0OTcuMUwxNS45IDMyMS40Yy0zLjIgNDIuMy0uNyA4My4zIDQuOCAxMTguNyA0LjQgMjcuOCAyNi44IDQ4IDUzLjEgNTEuNiA0MyA1LjkgODIuMiA3LjUgMTE3LjggNS40ek0yNzEuNSAxNDNjOS40LTkuNCAyNC42LTkuNCAzMy45IDBsNjQgNjRjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtNjQtNjRjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45em0tNjQgNjRjOS40LTkuNCAyNC42LTkuNCAzMy45IDBsNjQgNjRjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtNjQtNjRjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45em0tNjQgNjRjOS40LTkuNCAyNC42LTkuNCAzMy45IDBsNjQgNjRjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtNjQtNjRjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45eiJdCiAgICB9OwogICAgZmFGb290YmFsbEJhbGwgPSBmYUZvb3RiYWxsOwogICAgZmFUcnVja01vbnN0ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHJ1Y2stbW9uc3RlciIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNjNiIiwgIk0zMzYgOTZsNDggNjQtMTI4IDAgMC02NCA4MCAwem0xMjggNjRMMzg3LjIgNTcuNkMzNzUuMSA0MS41IDM1Ni4xIDMyIDMzNiAzMkwyMjQgMzJjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgOTYtMTQ0IDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgNjRjMCAxOC4xIDEwLjEgMzMuOSAyNC45IDQyLjEtLjUgNS43IDEuMSAxMS42IDQuNyAxNi40LTMuNyA2LjktNi44IDE0LjEtOSAyMS44LTExLjYgMS43LTIwLjYgMTEuNy0yMC42IDIzLjhsMCAxNmMwIDEyLjEgOC45IDIyLjEgMjAuNiAyMy44IDIuMiA3LjYgNS4zIDE0LjkgOSAyMS44LTcgOS40LTYuMyAyMi44IDIuMyAzMS4zbDExLjMgMTEuM2M4LjYgOC42IDIxLjkgOS4zIDMxLjMgMi4yIDYuOCAzLjcgMTQuMSA2LjggMjEuNyA5IDEuNyAxMS42IDExLjcgMjAuNiAyMy44IDIwLjZsMTYgMGMxMi4xIDAgMjIuMS04LjkgMjMuOC0yMC42IDcuNi0yLjIgMTQuOS01LjMgMjEuNy05IDkuNCA3IDIyLjggNi4zIDMxLjMtMi4ybDExLjMtMTEuM2M4LjYtOC42IDkuMy0yMS45IDIuMy0zMS4zIDMuNy02LjggNi44LTE0LjEgOS0yMS43IDExLjYtMS43IDIwLjYtMTEuNyAyMC42LTIzLjhsMC0xNmMwLTEyLjEtOC45LTIyLjEtMjAuNi0yMy44LTIuMi03LjYtNS4zLTE0LjktOS0yMS43IDIuNC0zLjIgMy45LTYuOCA0LjUtMTAuNWwxMTQuMiAwYy42IDMuNyAyLjEgNy4zIDQuNSAxMC41LTMuNyA2LjktNi44IDE0LjEtOSAyMS44LTExLjYgMS43LTIwLjYgMTEuNy0yMC42IDIzLjhsMCAxNmMwIDEyLjEgOC45IDIyLjEgMjAuNiAyMy44IDIuMiA3LjYgNS4zIDE0LjkgOSAyMS44LTcgOS40LTYuMyAyMi44IDIuMiAzMS4zbDExLjMgMTEuM2M4LjUgOC42IDIxLjkgOS4zIDMxLjMgMi4yIDYuOCAzLjcgMTQuMSA2LjggMjEuNyA5IDEuNyAxMS42IDExLjcgMjAuNiAyMy44IDIwLjZsMTYgMGMxMi4xIDAgMjIuMS04LjkgMjMuOC0yMC42IDcuNi0yLjIgMTQuOS01LjMgMjEuOC05IDkuNCA3IDIyLjggNi4zIDMxLjMtMi4ybDExLjMtMTEuM2M4LjYtOC42IDkuMy0yMS45IDIuMi0zMS4zIDMuNy02LjggNi44LTE0LjEgOS0yMS43IDExLjYtMS43IDIwLjYtMTEuNyAyMC42LTIzLjhsMC0xNmMwLTEyLjEtOC45LTIyLjEtMjAuNi0yMy44LTIuMi03LjYtNS4zLTE0LjktOS0yMS43IDMuNi00LjggNS4yLTEwLjcgNC43LTE2LjQgMTQuOC04LjIgMjQuOS0yMy45IDI0LjktNDIuMWwwLTY0YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC02NCAwek0xMjggMzM2YTQ4IDQ4IDAgMSAxIDAgOTYgNDggNDggMCAxIDEgMC05NnptMjcyIDQ4YTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6Il0KICAgIH07CiAgICBmYUFzdGVyaXNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFzdGVyaXNrIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTAwMzMsIDYxNTQ1XSwgIjJhIiwgIk0yMjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDE2OC42IDE0NC04My4xYzE1LjMtOC44IDM0LjktMy42IDQzLjcgMTEuN3MzLjYgMzQuOS0xMS43IDQzLjdMMjg4IDI1NiA0MzIgMzM5LjFjMTUuMyA4LjggMjAuNiAyOC40IDExLjcgNDMuN3MtMjguNCAyMC42LTQzLjcgMTEuN0wyNTYgMzExLjQgMjU2IDQ4MGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTE2OC42LTE0NCA4My4xYy0xNS4zIDguOC0zNC45IDMuNi00My43LTExLjdTLjcgMzQ4IDE2IDMzOS4xTDE2MCAyNTYgMTYgMTcyLjlDLjcgMTY0LTQuNSAxNDQuNSA0LjMgMTI5LjFTMzIuNyAxMDguNiA0OCAxMTcuNEwxOTIgMjAwLjYgMTkyIDMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyeiJdCiAgICB9OwogICAgZmFCYXR0ZXJ5RnVsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYXR0ZXJ5LWZ1bGwiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjgyNjcsICJiYXR0ZXJ5IiwgImJhdHRlcnktNSJdLCAiZjI0MCIsICJNNTI4IDEyOGM4LjggMCAxNiA3LjIgMTYgMTZsMCAyMjRjMCA4LjgtNy4yIDE2LTE2IDE2bC00MTYgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMjI0YzAtOC44IDcuMi0xNiAxNi0xNmw0MTYgMHpNMTEyIDY0Yy00NC4yIDAtODAgMzUuOC04MCA4MGwwIDIyNGMwIDQ0LjIgMzUuOCA4MCA4MCA4MGw0MTYgMGM0NC4yIDAgODAtMzUuOCA4MC04MGwwLTQ4YzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNjRjMC0xNy43LTE0LjMtMzItMzItMzJsMC00OGMwLTQ0LjItMzUuOC04MC04MC04MEwxMTIgNjR6bTU2IDExMmMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAxMTJjMCAxMy4zIDEwLjcgMjQgMjQgMjRsMzA0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC0xMTJjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTMwNCAweiJdCiAgICB9OwogICAgZmFCYXR0ZXJ5ID0gZmFCYXR0ZXJ5RnVsbDsKICAgIGZhQmF0dGVyeTUgPSBmYUJhdHRlcnlGdWxsOwogICAgZmFDaGlsZERyZXNzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoaWxkLWRyZXNzIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbXSwgImU1OWMiLCAiTTIyNCA2NEE2NCA2NCAwIDEgMCA5NiA2NCA2NCA2NCAwIDEgMCAyMjQgNjR6TTg4IDQwMGwwIDgwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC04MCAxNiAwIDAgODBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTgwIDE3LjggMGMxMC45IDAgMTguNi0xMC43IDE1LjItMjEuMWwtMzEuMS05My40IDI4LjcgMzcuOGMxMC43IDE0LjEgMzAuOCAxNi44IDQ0LjggNi4yczE2LjgtMzAuNyA2LjItNDQuOEwyNTQuNiAyMDdjLTIyLjQtMjkuNi01Ny41LTQ3LTk0LjYtNDdzLTcyLjIgMTcuNC05NC42IDQ3TDYuNSAyODQuN2MtMTAuNyAxNC4xLTcuOSAzNC4yIDYuMiA0NC44czM0LjIgNy45IDQ0LjgtNi4yTDg2LjIgMjg1LjUgNTUgMzc4LjlDNTEuNiAzODkuMyA1OS4zIDQwMCA3MC4yIDQwMEw4OCA0MDB6Il0KICAgIH07CiAgICBmYUZhY2VLaXNzQmVhbTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1raXNzLWJlYW0iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MzcsICJraXNzLWJlYW0iXSwgImY1OTciLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0yNDAgMjg4bDMyIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDggMCAxMi4zLTQuNiAyMy41LTEyLjIgMzIgNy42IDguNSAxMi4yIDE5LjcgMTIuMiAzMiAwIDI2LjUtMjEuNSA0OC00OCA0OGwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNmwxNiAwYzguOCAwIDE2LTcuMiAxNi0xNnMtNy4yLTE2LTE2LTE2bC0xNiAwYy04LjggMC0xNi03LjItMTYtMTZzNy4yLTE2IDE2LTE2bDE2IDBjOC44IDAgMTYtNy4yIDE2LTE2cy03LjItMTYtMTYtMTZsLTE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZ6TTE3NiAxODBjLTE1LjUgMC0yOCAxMi41LTI4IDI4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMzcuNiAzMC40LTY4IDY4LTY4czY4IDMwLjQgNjggNjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0xNS41LTEyLjUtMjgtMjgtMjh6bTEzMiAyOGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTM3LjYgMzAuNC02OCA2OC02OHM2OCAzMC40IDY4IDY4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMTUuNS0xMi41LTI4LTI4LTI4cy0yOCAxMi41LTI4IDI4eiJdCiAgICB9OwogICAgZmFLaXNzQmVhbTIgPSBmYUZhY2VLaXNzQmVhbTI7CiAgICBmYVRyYXNoQ2FuQXJyb3dVcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cmFzaC1jYW4tYXJyb3ctdXAiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsidHJhc2gtcmVzdG9yZS1hbHQiXSwgImY4MmEiLCAiTTE2Ny4xLTE2bDExMy45IDBjMTMuOCAwIDI2IDguOCAzMC40IDIxLjlMMzIwIDMyIDQxNiAzMmMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA5NkMxNC4zIDk2IDAgODEuNyAwIDY0UzE0LjMgMzIgMzIgMzJsOTYgMCA4LjctMjYuMUMxNDEuMS03LjIgMTUzLjMtMTYgMTY3LjEtMTZ6TTMyIDE0NGwzODQgMCAwIDMwNGMwIDM1LjMtMjguNyA2NC02NCA2NEw5NiA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMzA0em0yMDkgNzljLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwbC03MiA3MmMtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDMxLTMxIDAgMTAyLjFjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTEwMi4xIDMxIDMxYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNzItNzJ6Il0KICAgIH07CiAgICBmYVRyYXNoUmVzdG9yZUFsdCA9IGZhVHJhc2hDYW5BcnJvd1VwOwogICAgZmFGb250ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZvbnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjAzMSIsICJNMjg1LjEgNTAuN0MyNzkuOSAzOS4zIDI2OC41IDMyIDI1NiAzMnMtMjMuOSA3LjMtMjkuMSAxOC43TDU5LjUgNDE2IDQ4IDQxNmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmw4OCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC02LjEgMCAyMi00OCAyMDguMyAwIDIyIDQ4LTYuMSAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDg4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTExLjUgMC0xNjcuNC0zNjUuM3pNMzMwLjggMzA0TDE4MS4yIDMwNCAyNTYgMTQwLjggMzMwLjggMzA0eiJdCiAgICB9OwogICAgZmFCb3JlSG9sZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib3JlLWhvbGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTRjMyIsICJNMjU2IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgMjMyLjZjLTE5LjEgMTEuMS0zMiAzMS43LTMyIDU1LjQgMCAzNS4zIDI4LjcgNjQgNjQgNjRzNjQtMjguNyA2NC02NGMwLTIzLjctMTIuOS00NC40LTMyLTU1LjRMMjg4IDMyYzAtMTcuNy0xNC4zLTMyLTMyLTMyek0wIDM4NGwwIDY0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjcyYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC00OCAwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDE0NGMwIDYxLjktNTAuMSAxMTItMTEyIDExMlMxNDQgMzgxLjkgMTQ0IDMyMGwwLTE0NGMwLTI2LjUtMjEuNS00OC00OC00OGwtNDggMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhMMCAzODR6Il0KICAgIH07CiAgICBmYVZpcnVzQ292aWQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidmlydXMtY292aWQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTRhOCIsICJNMTkyIDI0YzAtMTMuMyAxMC43LTI0IDI0LTI0bDgwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE2IDAgMCAzMy42YzMwLjcgNC4yIDU4LjggMTYuMyA4Mi4zIDM0LjFMMzg2LjEgOTIgMzc0LjggODAuNmMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDU2LjYgNTYuNmM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwbC0xMS4zLTExLjMtMjMuOCAyMy44YzE3LjkgMjMuNSAyOS45IDUxLjcgMzQuMSA4Mi4zbDMzLjYgMCAwLTE2YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA4MGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTE2LTMzLjYgMGMtNC4yIDMwLjctMTYuMyA1OC44LTM0LjEgODIuM2wyMy44IDIzLjggMTEuMy0xMS4zYzkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOWwtNTYuNiA1Ni42Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45bDExLjMtMTEuMy0yMy44LTIzLjhjLTIzLjUgMTcuOS01MS43IDI5LjktODIuMyAzNC4xbDAgMzMuNiAxNiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC04MCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDE2IDAgMC0zMy42Yy0zMC43LTQuMi01OC44LTE2LjMtODIuMy0zNC4xbC0yMy44IDIzLjggMTEuMyAxMS4zYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBMNDYuNyA0MDguN2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDExLjMgMTEuMyAyMy44LTIzLjhDOTcuOSAzMzguOCA4NS44IDMxMC43IDgxLjYgMjgwbC0zMy42IDAgMCAxNmMwIDEzLjMtMTAuNyAyNC0yNCAyNFMwIDMwOS4zIDAgMjk2bDAtODBjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDE2IDMzLjYgMGM0LjItMzAuNyAxNi4zLTU4LjggMzQuMS04Mi4zTDkyIDEyNS45IDgwLjYgMTM3LjJjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsNTYuNi01Ni42YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOUwxMjUuOSA5MiAxNDkuNyAxMTUuN2MyMy41LTE3LjkgNTEuNy0yOS45IDgyLjMtMzQuMWwwLTMzLjYtMTYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjR6bTMyIDIwMGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem05NiA5NmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6Il0KICAgIH07CiAgICBmYUZpbGVQZGYyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbGUtcGRmIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYxYzEiLCAiTTk2IDBDNjAuNyAwIDMyIDI4LjcgMzIgNjRsMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsODAgMCAwLTExMmMwLTM1LjMgMjguNy02NCA2NC02NGwxNzYgMCAwLTE2NS41YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI5MC43IDE4LjdDMjc4LjcgNi43IDI2Mi41IDAgMjQ1LjUgMEw5NiAwek0zNTcuNSAxNzZMMjY0IDE3NmMtMTMuMyAwLTI0LTEwLjctMjQtMjRMMjQwIDU4LjUgMzU3LjUgMTc2ek0yNDAgMzgwYy0xMSAwLTIwIDktMjAgMjBsMCAxMjhjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC0yOCAxMiAwYzMzLjEgMCA2MC0yNi45IDYwLTYwcy0yNi45LTYwLTYwLTYwbC0zMiAwem0zMiA4MGwtMTIgMCAwLTQwIDEyIDBjMTEgMCAyMCA5IDIwIDIwcy05IDIwLTIwIDIwem05Ni04MGMtMTEgMC0yMCA5LTIwIDIwbDAgMTI4YzAgMTEgOSAyMCAyMCAyMGwzMiAwYzI4LjcgMCA1Mi0yMy4zIDUyLTUybDAtNjRjMC0yOC43LTIzLjMtNTItNTItNTJsLTMyIDB6bTIwIDEyOGwwLTg4IDEyIDBjNi42IDAgMTIgNS40IDEyIDEybDAgNjRjMCA2LjYtNS40IDEyLTEyIDEybC0xMiAwem04OC0xMDhsMCAxMjhjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC00NCAyOCAwYzExIDAgMjAtOSAyMC0yMHMtOS0yMC0yMC0yMGwtMjggMCAwLTI0IDI4IDBjMTEgMCAyMC05IDIwLTIwcy05LTIwLTIwLTIwbC00OCAwYy0xMSAwLTIwIDktMjAgMjB6Il0KICAgIH07CiAgICBmYUxhbmd1YWdlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxhbmd1YWdlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYxYWIiLCAiTTE2MCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzIgMTI4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTkuNiAwLTguNCAyMy4xYy0xNi40IDQ1LjItNDEuMSA4Ni41LTcyLjIgMTIyIDE0LjIgOC44IDI5IDE2LjYgNDQuNCAyMy41bDUwLjQgMjIuNCA2Mi4yLTE0MGM1LjEtMTEuNiAxNi42LTE5IDI5LjItMTlzMjQuMSA3LjQgMjkuMiAxOWwxMjggMjg4YzcuMiAxNi4yLS4xIDM1LjEtMTYuMiA0Mi4ycy0zNS4xLS4xLTQyLjItMTYuMmwtMjAtNDUtMTU3LjUgMC0yMCA0NWMtNy4yIDE2LjItMjYuMSAyMy40LTQyLjIgMTYuMnMtMjMuNC0yNi4xLTE2LjItNDIuMmwzOS44LTg5LjUtNTAuNC0yMi40Yy0yMy0xMC4yLTQ1LTIyLjQtNjUuOC0zNi40LTIxLjMgMTcuMi00NC42IDMyLjItNjkuNSA0NC43TDc4LjMgMzgwLjZjLTE1LjggNy45LTM1IDEuNS00Mi45LTE0LjNzLTEuNS0zNSAxNC4zLTQyLjlsMzQuNS0xNy4zYzE2LjMtOC4yIDMxLjgtMTcuNyA0Ni40LTI4LjMtMTMuOC0xMi43LTI2LjgtMjYuNC0zOC45LTQwLjlMODEuNiAyMjQuN2MtMTEuMy0xMy42LTkuNS0zMy44IDQuMS00NS4xczMzLjgtOS41IDQ1LjEgNC4xbDEwLjIgMTIuMmMxMS41IDEzLjkgMjQuMSAyNi44IDM3LjQgMzguNyAyNy41LTMwLjQgNDkuMi02Ni4xIDYzLjUtMTA1LjRsLjUtMS4yLTIxMC4zIDBDMTQuMyAxMjggMCAxMTMuNyAwIDk2UzE0LjMgNjQgMzIgNjRsOTYgMCAwLTMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyek00MTYgMjcwLjhMMzY1LjcgMzg0IDQ2Ni4zIDM4NCA0MTYgMjcwLjh6Il0KICAgIH07CiAgICBmYVNoaWVsZEhhbHZlZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaGllbGQtaGFsdmVkIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNoaWVsZC1hbHQiXSwgImYzZWQiLCAiTTI1NiAwYzQuNiAwIDkuMiAxIDEzLjQgMi45TDQ1Ny44IDgyLjhjMjIgOS4zIDM4LjQgMzEgMzguMyA1Ny4yLS41IDk5LjItNDEuMyAyODAuNy0yMTMuNiAzNjMuMi0xNi43IDgtMzYuMSA4LTUyLjggMC0xNzIuNC04Mi41LTIxMy4xLTI2NC0yMTMuNi0zNjMuMi0uMS0yNi4yIDE2LjMtNDcuOSAzOC4zLTU3LjJMMjQyLjcgMi45QzI0Ni45IDEgMjUxLjQgMCAyNTYgMHptMCA2Ni44bDAgMzc4LjFjMTM4LTY2LjggMTc1LjEtMjE0LjggMTc2LTMwMy40bC0xNzYtNzQuNiAwIDB6Il0KICAgIH07CiAgICBmYVNoaWVsZEFsdCA9IGZhU2hpZWxkSGFsdmVkOwogICAgZmFDYXJldFVwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhcmV0LXVwIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbXSwgImYwZDgiLCAiTTE0MC4zIDEzNS4yYzEyLjYtMTAuMyAzMS4xLTkuNSA0Mi44IDIuMmwxMjggMTI4YzkuMiA5LjIgMTEuOSAyMi45IDYuOSAzNC45UzMwMS40IDMyMCAyODguNSAzMjBsLTI1NiAwYy0xMi45IDAtMjQuNi03LjgtMjkuNi0xOS44Uy43IDI3NC41IDkuOSAyNjUuNGwxMjgtMTI4IDIuNC0yLjJ6Il0KICAgIH07CiAgICBmYUZpbGVQZW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1wZW4iLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjgyMjEsICJmaWxlLWVkaXQiXSwgImYzMWMiLCAiTTEyOC4xIDBjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE0Ni4yIDAgMTAuOS01NC41YzQuMy0yMS43IDE1LTQxLjYgMzAuNi01Ny4ybDEzMi4yLTEzMi4yIDAtOTcuNWMwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0wzMjIuOCAxOC43QzMxMC44IDYuNyAyOTQuNSAwIDI3Ny42IDBMMTI4LjEgMHpNMzg5LjYgMTc2bC05My41IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtOTMuNSAxMTcuNSAxMTcuNXpNMzMyLjMgNDY2LjlsLTExLjkgNTkuNmMtLjIgLjktLjMgMS45LS4zIDIuOSAwIDggNi41IDE0LjYgMTQuNiAxNC42IDEgMCAxLjktLjEgMi45LS4zbDU5LjYtMTEuOWMxMi40LTIuNSAyMy44LTguNiAzMi43LTE3LjVsMTE4LjktMTE4LjktODAtODAtMTE4LjkgMTE4LjljLTguOSA4LjktMTUgMjAuMy0xNy41IDMyLjd6bTI2Ny44LTEyM2MyMi4xLTIyLjEgMjIuMS01Ny45IDAtODBzLTU3LjktMjIuMS04MCAwbC0yOC44IDI4LjggODAgODAgMjguOC0yOC44eiJdCiAgICB9OwogICAgZmFGaWxlRWRpdCA9IGZhRmlsZVBlbjsKICAgIGZhUGVyc29uQmlraW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1iaWtpbmciLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjg2OTIsICJiaWtpbmciXSwgImY4NGEiLCAiTTM2OCA5NmE0OCA0OCAwIDEgMCAwLTk2IDQ4IDQ4IDAgMSAwIDAgOTZ6bTI3LjIgNjRsLTYxLjgtNDguOGMtMTcuMy0xMy42LTQxLjctMTMuOC01OS4xLS4zbC04My4xIDY0LjJjLTMwLjcgMjMuOC0yOC41IDcwLjggNC4zIDkxLjZMMjU2IDMwNS4xIDI1NiA0MTZjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTEyOGMwLTEwLjctNS4zLTIwLjctMTQuMi0yNi42TDI2MyAyMzIuOSAzMjMuMyAxODQuNCAzNjQgMjE3YzUuNyA0LjUgMTIuNyA3IDIwIDdsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNTIuOCAwek0xMTIgNTEyYTExMiAxMTIgMCAxIDAgMC0yMjQgMTEyIDExMiAwIDEgMCAwIDIyNHptMzUyIDBhMTEyIDExMiAwIDEgMCAwLTIyNCAxMTIgMTEyIDAgMSAwIDAgMjI0eiJdCiAgICB9OwogICAgZmFCaWtpbmcgPSBmYVBlcnNvbkJpa2luZzsKICAgIGZhQm9va09wZW5SZWFkZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm9vay1vcGVuLXJlYWRlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJib29rLXJlYWRlciJdLCAiZjVkYSIsICJNMjU2IDE1MmE4OCA4OCAwIDEgMCAwLTE3NiA4OCA4OCAwIDEgMCAwIDE3NnptMCAyOTguN2wwLTE0OS4zYzE2LjMtNi44IDMyLjktMTMuNyA0OS43LTIwLjcgMzktMTYuMiA4MC44LTI0LjYgMTIzLjEtMjQuNmwxOS4yIDAgMCAxNjAtMTkuMiAwYy01OS4xIDAtMTE3LjcgMTEuNy0xNzIuMyAzNC41bC0uNSAuMnpNMjU2IDIzMmwtMjUuMS0xMC41QzE4NC4xIDIwMiAxMzMuOSAxOTIgODMuMiAxOTJMNDggMTkyYy0yNi41IDAtNDggMjEuNS00OCA0OEwwIDQzMmMwIDI2LjUgMjEuNSA0OCA0OCA0OGwzNS4yIDBjNTAuNyAwIDEwMC45IDEwIDE0Ny43IDI5LjVsMTIuOCA1LjNjNy45IDMuMyAxNi43IDMuMyAyNC42IDBsMTIuOC01LjNjNDYuOC0xOS41IDk3LTI5LjUgMTQ3LjctMjkuNWwzNS4yIDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0xOTJjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTM1LjIgMGMtNTAuNyAwLTEwMC45IDEwLTE0Ny43IDI5LjVMMjU2IDIzMnoiXQogICAgfTsKICAgIGZhQm9va1JlYWRlciA9IGZhQm9va09wZW5SZWFkZXI7CiAgICBmYUdsYXNzV2F0ZXJEcm9wbGV0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImdsYXNzLXdhdGVyLWRyb3BsZXQiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZTRmNSIsICJNMzIgMEMyMy4xIDAgMTQuNiAzLjcgOC42IDEwLjJTLS42IDI1LjQgLjEgMzQuM0wyOC45IDQzNy43YzMgNDEuOSAzNy44IDc0LjMgNzkuOCA3NC4zbDE2Ni42IDBjNDIgMCA3Ni44LTMyLjQgNzkuOC03NC4zTDM4My45IDM0LjNjLjYtOC45LTIuNC0xNy42LTguNS0yNC4xUzM2MC45IDAgMzUyIDBMMzIgMHpNODMgMjk3LjVMNjYuNCA2NCAzMTcuNiA2NCAzMDEgMjk3LjUgMjg4IDMwNGMtMjAuMSAxMC4xLTQzLjkgMTAuMS02NCAwcy00My45LTEwLjEtNjQgMC00My45IDEwLjEtNjQgMGwtMTMtNi41ek0yNTYgMTk2YzAtMjQtMzMuNy03MC4xLTUyLjItOTMuNS02LjEtNy43LTE3LjUtNy43LTIzLjYgMC0xOC41IDIzLjQtNTIuMiA2OS41LTUyLjIgOTMuNSAwIDMzLjEgMjguNyA2MCA2NCA2MHM2NC0yNi45IDY0LTYweiJdCiAgICB9OwogICAgZmFUb3dlckJyb2FkY2FzdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0b3dlci1icm9hZGNhc3QiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsiYnJvYWRjYXN0LXRvd2VyIl0sICJmNTE5IiwgIk04Ny45IDExLjVjLTExLjMtNi45LTI2LjEtMy4yLTMzIDguMS0yNC44IDQxLTM5IDg5LjEtMzkgMTQwLjRzMTQuMiA5OS40IDM5IDE0MC40YzYuOSAxMS4zIDIxLjYgMTUgMzMgOC4xczE1LTIxLjYgOC4xLTMzQzc1LjcgMjQxLjkgNjQgMjAyLjMgNjQgMTYwUzc1LjcgNzguMSA5Ni4xIDQ0LjRjNi45LTExLjMgMy4yLTI2LjEtOC4xLTMzem00MDAuMSAwYy0xMS4zIDYuOS0xNSAyMS42LTguMSAzMyAyMC40IDMzLjcgMzIuMSA3My4zIDMyLjEgMTE1LjZzLTExLjcgODEuOS0zMi4xIDExNS42Yy02LjkgMTEuMy0zLjIgMjYuMSA4LjEgMzNzMjYuMSAzLjIgMzMtOC4xYzI0LjgtNDEgMzktODkuMSAzOS0xNDAuNFM1NDUuOCA2MC42IDUyMSAxOS42Yy02LjktMTEuMy0yMS42LTE1LTMzLTguMXpNMzIwIDIxNS40YzE5LjEtMTEuMSAzMi0zMS43IDMyLTU1LjQgMC0zNS4zLTI4LjctNjQtNjQtNjRzLTY0IDI4LjctNjQgNjRjMCAyMy43IDEyLjkgNDQuNCAzMiA1NS40TDI1NiA0ODBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTI2NC42ek0xODAuMiA5MWM3LjItMTEuMiAzLjktMjYtNy4yLTMzLjJzLTI2LTMuOS0zMy4yIDcuMmMtMTcuNiAyNy40LTI3LjggNjAtMjcuOCA5NXMxMC4yIDY3LjYgMjcuOCA5NWM3LjIgMTEuMiAyMiAxNC40IDMzLjIgNy4yczE0LjQtMjIgNy4yLTMzLjJjLTEyLjgtMTkuOS0yMC4yLTQzLjYtMjAuMi02OXM3LjQtNDkuMSAyMC4yLTY5ek00MzYuMiA2NWMtNy4yLTExLjItMjItMTQuNC0zMy4yLTcuMnMtMTQuNCAyMi03LjIgMzMuMmMxMi44IDE5LjkgMjAuMiA0My42IDIwLjIgNjlzLTcuNCA0OS4xLTIwLjIgNjljLTcuMiAxMS4yLTMuOSAyNiA3LjIgMzMuMnMyNiAzLjkgMzMuMi03LjJjMTcuNi0yNy40IDI3LjgtNjAgMjcuOC05NXMtMTAuMi02Ny42LTI3LjgtOTV6Il0KICAgIH07CiAgICBmYUJyb2FkY2FzdFRvd2VyID0gZmFUb3dlckJyb2FkY2FzdDsKICAgIGZhTWluaW1pemUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWluaW1pemUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiY29tcHJlc3MtYXJyb3dzLWFsdCJdLCAiZjc4YyIsICJNNDU2IDIyNGwtMTQ0IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtMTQ0YzAtOS43IDUuOC0xOC41IDE0LjgtMjIuMlMzMjIuMSAzMi4yIDMyOSAzOWw0MCA0MCA3My40LTczLjRDNDQ2IDIgNDUwLjkgMCA0NTYgMHMxMCAyIDEzLjcgNS43bDM2LjcgMzYuN0M1MTAgNDYgNTEyIDUwLjkgNTEyIDU2cy0yIDEwLTUuNyAxMy43TDQzMyAxNDMgNDczIDE4M2M2LjkgNi45IDguOSAxNy4yIDUuMiAyNi4yUzQ2NS43IDIyNCA0NTYgMjI0em0wIDY0YzkuNyAwIDE4LjUgNS44IDIyLjIgMTQuOHMxLjcgMTkuMy01LjIgMjYuMmwtNDAgNDAgNzMuNCA3My40YzMuNiAzLjYgNS43IDguNSA1LjcgMTMuN3MtMiAxMC01LjcgMTMuN2wtMzYuNyAzNi43QzQ2NiA1MTAgNDYxLjEgNTEyIDQ1NiA1MTJzLTEwLTItMTMuNy01LjdMMzY5IDQzMyAzMjkgNDczYy02LjkgNi45LTE3LjIgOC45LTI2LjIgNS4yUzI4OCA0NjUuNyAyODggNDU2bDAtMTQ0YzAtMTMuMyAxMC43LTI0IDI0LTI0bDE0NCAwem0tMjU2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCAxNDRjMCA5LjctNS44IDE4LjUtMTQuOCAyMi4ycy0xOS4zIDEuNy0yNi4yLTUuMmwtNDAtNDAtNzMuNCA3My40QzY2IDUxMCA2MS4xIDUxMiA1NiA1MTJzLTEwLTItMTMuNy01LjdMNS43IDQ2OS43QzIgNDY2IDAgNDYxLjEgMCA0NTZzMi0xMCA1LjctMTMuN0w3OSAzNjkgMzkgMzI5Yy02LjktNi45LTguOS0xNy4yLTUuMi0yNi4yUzQ2LjMgMjg4IDU2IDI4OGwxNDQgMHpNNTYgMjI0Yy05LjcgMC0xOC41LTUuOC0yMi4yLTE0LjhTMzIuMiAxODkuOSAzOSAxODNMNzkgMTQzIDUuNyA2OS43QzIgNjYgMCA2MS4xIDAgNTZTMiA0NiA1LjcgNDIuM0w0Mi4zIDUuN0M0NiAyIDUwLjkgMCA1NiAwUzY2IDIgNjkuNyA1LjdMMTQzIDc5IDE4MyAzOWM2LjktNi45IDE3LjItOC45IDI2LjItNS4yUzIyNCA0Ni4zIDIyNCA1NmwwIDE0NGMwIDEzLjMtMTAuNyAyNC0yNCAyNEw1NiAyMjR6Il0KICAgIH07CiAgICBmYUNvbXByZXNzQXJyb3dzQWx0ID0gZmFNaW5pbWl6ZTsKICAgIGZhQXJyb3dSaWdodFRvQ2l0eSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy1yaWdodC10by1jaXR5IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU0YjMiLCAiTTI4OCA0OGMwLTI2LjUgMjEuNS00OCA0OC00OGw5NiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgODAgNDggMCAwLTcyYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA3MiAxNiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMjg4YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0yNTYgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC00MTZ6bTY0IDY0bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6bTE2IDgwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDB6TTM1MiAzMDRsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnptMTc2LTgwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDB6TTUxMiAzMzZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnpNMTUzIDE2N2w3MiA3MmM5LjQgOS40IDkuNCAyNC42IDAgMzMuOWwtNzIgNzJjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsMzEtMzEtMTAyLjEgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxMDIuMSAwLTMxLTMxYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDB6Il0KICAgIH07CiAgICBmYUxhcHRvcE1lZGljYWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGFwdG9wLW1lZGljYWwiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjgxMiIsICJNNjQgOTZjMC0zNS4zIDI4LjctNjQgNjQtNjRsMzg0IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyNDAtNjQgMCAwLTI0MC0zODQgMCAwIDI0MC02NCAwIDAtMjQwek0wIDQwMy4yQzAgMzkyLjYgOC42IDM4NCAxOS4yIDM4NGw2MDEuNiAwYzEwLjYgMCAxOS4yIDguNiAxOS4yIDE5LjIgMCA0Mi40LTM0LjQgNzYuOC03Ni44IDc2LjhMNzYuOCA0ODBDMzQuNCA0ODAgMCA0NDUuNiAwIDQwMy4yek0yODggMTYwYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDQwIDQwIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC00MCAwIDAgNDBjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC00MC00MCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsNDAgMCAwLTQweiJdCiAgICB9OwogICAgZmFCcmVhZFNsaWNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJyZWFkLXNsaWNlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY3ZWMiLCAiTTY0IDQzMmwwLTE3NmMtMzUuMyAwLTY0LTI4LjctNjQtNjQgMC0yMTYuNSA1MTItMjE2LjUgNTEyIDAgMCAzNS4zLTI4LjcgNjQtNjQgNjRsMCAxNzZjMCAyNi41LTIxLjUgNDgtNDggNDhsLTI4OCAwYy0yNi41IDAtNDgtMjEuNS00OC00OHoiXQogICAgfTsKICAgIGZhR2xvYmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ2xvYmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjc3NjBdLCAiZjBhYyIsICJNMzUxLjkgMjgwbC0xOTAuOSAwYzIuOSA2NC41IDE3LjIgMTIzLjkgMzcuNSAxNjcuNCAxMS40IDI0LjUgMjMuNyA0MS44IDM1LjEgNTIuNCAxMS4yIDEwLjUgMTguOSAxMi4yIDIyLjkgMTIuMnMxMS43LTEuNyAyMi45LTEyLjJjMTEuNC0xMC42IDIzLjctMjggMzUuMS01Mi40IDIwLjMtNDMuNSAzNC42LTEwMi45IDM3LjUtMTY3LjR6TTE2MC45IDIzMmwxOTAuOSAwQzM0OSAxNjcuNSAzMzQuNyAxMDguMSAzMTQuNCA2NC42IDMwMyA0MC4yIDI5MC43IDIyLjggMjc5LjMgMTIuMiAyNjguMSAxLjcgMjYwLjQgMCAyNTYuNCAwcy0xMS43IDEuNy0yMi45IDEyLjJjLTExLjQgMTAuNi0yMy43IDI4LTM1LjEgNTIuNC0yMC4zIDQzLjUtMzQuNiAxMDIuOS0zNy41IDE2Ny40em0tNDggMEMxMTYuNCAxNDYuNCAxMzguNSA2Ni45IDE3MC44IDE0LjcgNzguNyA0Ny4zIDEwLjkgMTMxLjIgMS41IDIzMmwxMTEuNCAwek0xLjUgMjgwYzkuNCAxMDAuOCA3Ny4yIDE4NC43IDE2OS4zIDIxNy4zLTMyLjMtNTIuMi01NC40LTEzMS43LTU3LjktMjE3LjNMMS41IDI4MHptMzk4LjQgMGMtMy41IDg1LjYtMjUuNiAxNjUuMS01Ny45IDIxNy4zIDkyLjEtMzIuNyAxNTkuOS0xMTYuNSAxNjkuMy0yMTcuM2wtMTExLjQgMHptMTExLjQtNDhDNTAxLjkgMTMxLjIgNDM0LjEgNDcuMyAzNDIgMTQuNyAzNzQuMyA2Ni45IDM5Ni40IDE0Ni40IDM5OS45IDIzMmwxMTEuNCAweiJdCiAgICB9OwogICAgZmFGb2xkZXJNaW51cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmb2xkZXItbWludXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjY1ZCIsICJNNDQ4IDQ0OEw2NCA0NDhjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMTM4LjcgMGMxMy44IDAgMjcuMyA0LjUgMzguNCAxMi44bDM4LjQgMjguOGM1LjUgNC4yIDEyLjMgNi40IDE5LjIgNi40TDQ0OCA4MGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI0MGMwIDM1LjMtMjguNyA2NC02NCA2NHpNMTg0IDI0MGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNDQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTQ0IDB6Il0KICAgIH07CiAgICBmYU1hc2tGYWNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hc2stZmFjZSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlMWQ3IiwgIk0zMjAgNjRjLTI3LjIgMC01My44IDgtNzYuNCAyMy4xbC0zNy4xIDI0LjhjLTE1LjggMTAuNS0zNC4zIDE2LjEtNTMuMyAxNi4xTDY0IDEyOGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCA3OC43YzAgNjIuNiA0NS4yIDExNiAxMDcgMTI2LjNsOTcuOSAxNi4zYzMzIDIyIDcyLjYgMzQuNyAxMTUuMSAzNC43czgyLjItMTIuOCAxMTUuMS0zNC43TDUzMyAzOTYuOWM2MS43LTEwLjMgMTA3LTYzLjcgMTA3LTEyNi4zbDAtNzguN2MwLTM1LjMtMjguNy02NC02NC02NGwtODkuMiAwYy0xOSAwLTM3LjUtNS42LTUzLjMtMTYuMUwzOTYuNCA4Ny4xQzM3My44IDcyIDM0Ny4yIDY0IDMyMCA2NHpNMTM1LjkgMzM2LjlsLTE4LjQtMy4xQzg2LjYgMzI4LjcgNjQgMzAyIDY0IDI3MC43bDAtNzguNyA0OCAwIDAgNDhjMCAzNSA4LjYgNjcuOSAyMy45IDk2Ljl6bTM4Ni42LTMuMWwtMTguNCAzLjFDNTE5LjQgMzA3LjkgNTI4IDI3NSA1MjggMjQwbDAtNDggNDggMCAwIDc4LjdjMCAzMS4zLTIyLjYgNTgtNTMuNSA2My4xek0xOTIgMjMyYzAtMTMuMyAxMC43LTI0IDI0LTI0bDIwOCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0yMDggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjR6bTU2IDU2bDE0NCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNDQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhQm9uZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib25nIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1NWMiLCAiTTQ0OC41IDM4NGMwIDQxLjUtMTMuMSA3OS45LTM1LjUgMTExLjMtNy45IDExLjEtMjEuMiAxNi43LTM0LjggMTYuN2wtMjQzLjMgMGMtMTMuNyAwLTI2LjktNS42LTM0LjgtMTYuNy0yMi40LTMxLjQtMzUuNS02OS44LTM1LjUtMTExLjMgMC03MS4xIDM4LjYtMTMzLjEgOTYtMTY2LjNsMC0xNTMuN2MtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxOTIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwwIDE1My43YzE0LjIgOC4yIDI3LjIgMTguMiAzOC44IDI5LjZsMzkuMy0zOS4zLTctN2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwYzE2IDE2IDMyIDMyIDQ4IDQ4IDkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTctNy00My4zIDQzLjNjMTcuMyAyOC45IDI3LjMgNjIuNiAyNy4zIDk4Ljh6TTI4OC41IDY0bC02NCAwIDAgMTkwLjYtMzIgMTguNWMtMTkuNSAxMS4zLTM1LjcgMjcuNS00Ni45IDQ2LjlsMjIxLjggMGMtMTEuMi0xOS40LTI3LjQtMzUuNi00Ni45LTQ2LjlsLTMyLTE4LjUgMC0xOTAuNnoiXQogICAgfTsKICAgIGZhUm9hZEJyaWRnZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyb2FkLWJyaWRnZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTYzIiwgIk0zMiAzMmwyMDggMCAwIDY0LTI0IDAgMCA2NCAyNCAwIDAgMTI5LjNjLTQ1LjQgNy42LTgwIDQ3LjEtODAgOTQuN2wwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTk0YzAtMzguOC0yNi40LTcyLjYtNjQtODJsMC0xMTIgNDAgMCAwLTY0LTggMEMxNC4zIDk2IDAgODEuNyAwIDY0UzE0LjMgMzIgMzIgMzJ6TTg4IDk2bDAgNjQgODAgMCAwLTY0LTgwIDB6TTMzNiAzMmw3MiAwIDAgNzJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTcyIDcyIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAzNTJjMCAyNi41LTIxLjUgNDgtNDggNDhsLTcyIDAgMC03MmMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDcyLTcyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMzUyYzAtMjYuNSAyMS41LTQ4IDQ4LTQ4em05NiAxNjBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgODBjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTgwYzAtMTMuMy0xMC43LTI0LTI0LTI0eiJdCiAgICB9OwogICAgZmFBcnJvd1VwOTEgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctdXAtOS0xIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNvcnQtbnVtZXJpYy11cC1hbHQiXSwgImY4ODciLCAiTTE1MC42IDQxLjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwbC05NiA5NmMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMEw5NiAxNDEuMyA5NiA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTMwNi43IDQxLjQgNDEuNGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zbC05Ni05NnpNMzY1LjEgMjA2LjZjLTkuNiAxNC44LTUuNCAzNC42IDkuNCA0NC4zczM0LjYgNS40IDQ0LjMtOS40bDQyLjEtNjQuOWMxMi40LTE5LjIgMTkuMS00MS42IDE5LjEtNjQuNSAwLTQ0LjItMzUuOC04MC04MC04MHMtODAgMzUuOC04MCA4MGMwIDM2LjEgMjMuOSA2Ni43IDU2LjggNzYuNmwtMTEuNyAxOHpNMzc2IDExMmEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwem00Mi43IDE4MmMtOC4zLTYtMTkuMS03LjctMjguOC00LjRsLTQ4IDE2Yy0xNi44IDUuNi0yNS44IDIzLjctMjAuMiA0MC41czIzLjcgMjUuOCA0MC41IDIwLjJsNS45LTIgMCA1MS42LTE2IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsOTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTYgMCAwLTk2YzAtMTAuMy00LjktMTkuOS0xMy4zLTI2eiJdCiAgICB9OwogICAgZmFTb3J0TnVtZXJpY1VwQWx0ID0gZmFBcnJvd1VwOTE7CiAgICBmYU1vdW50YWluQ2l0eSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb3VudGFpbi1jaXR5IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1MmUiLCAiTTI1Ni4zIDQ4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDk2IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA0OCA0OCAwIDAtNzJjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDcyIDE2IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAzMjBjMCAyNi41LTIxLjUgNDgtNDggNDhsLTc3LjggMGM0LTE1LjQgMi40LTMyLjYtNi43LTQ4LjJMMzU0LjYgMjU2IDM2OC4zIDI1NmM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTYuMSAwLTExLjQgMy40LTE0LjEgOC41bC00Mi42LTczYy02LTEwLjItMTQuMS0xOC0yMy4zLTIzLjNsMC01Ni4yem02NCA2NGwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2em0xNjAgOTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnptMTYgODBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHptLTI3Mi02NC43bC02NS4xIDExMS42IDMzLjEgMzMuMSA0OC00OCA0MC40IDAtNTYuNC05Ni43em0tMjcuNi00Ny45YzEyLjMtMjEuMiA0Mi45LTIxLjIgNTUuMyAwTDQyMC4zIDQ2My45YzEyLjQgMjEuMy0yLjkgNDguMS0yNy42IDQ4LjFMNTYgNTEyYy0yNC43IDAtNDAuMS0yNi44LTI3LjYtNDguMUwxOTYuNyAxNzUuNHoiXQogICAgfTsKICAgIGZhQXJyb3dEb3duOTEgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctZG93bi05LTEiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsic29ydC1udW1lcmljLWRlc2MiLCAic29ydC1udW1lcmljLWRvd24tYWx0Il0sICJmODg2IiwgIk0yMzAuNiAzOTAuNmwtODAgODBjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwbC04MC04MGMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMEw5NiAzNzAuNyA5NiA2NGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMzA2LjcgMjUuNC0yNS40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwczEyLjUgMzIuOCAwIDQ1LjN6bTEzNC41LTE4NGwxMS43LTE4Yy0zMi45LTkuOS01Ni44LTQwLjUtNTYuOC03Ni42IDAtNDQuMiAzNS44LTgwIDgwLTgwczgwIDM1LjggODAgODBjMCAyMi45LTYuNiA0NS4zLTE5LjEgNjQuNWwtNDIuMSA2NC45Yy05LjYgMTQuOC0yOS40IDE5LjEtNDQuMyA5LjRzLTE5LjEtMjkuNC05LjQtNDQuM3pNNDI0IDExMmEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAwem0tNS4zIDE4MmM4LjMgNiAxMy4zIDE1LjcgMTMuMyAyNmwwIDk2IDE2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTk2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMTYgMCAwLTUxLjYtNS45IDJjLTE2LjggNS42LTM0LjktMy41LTQwLjUtMjAuMnMzLjUtMzQuOSAyMC4yLTQwLjVsNDgtMTZjOS44LTMuMyAyMC41LTEuNiAyOC44IDQuNHoiXQogICAgfTsKICAgIGZhU29ydE51bWVyaWNEZXNjID0gZmFBcnJvd0Rvd245MTsKICAgIGZhU29ydE51bWVyaWNEb3duQWx0ID0gZmFBcnJvd0Rvd245MTsKICAgIGZhRmFjZUdyaW5XaWRlMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWdyaW4td2lkZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODUxNSwgImdyaW4tYWx0Il0sICJmNTgxIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMzg2LjcgMzA4LjljMTEuOS0zLjcgMjMuOSA2LjMgMTkuNiAxOC4xLTIyLjQgNjEuMy04MS4zIDEwNS4xLTE1MC4zIDEwNS4xUzEyOC4xIDM4OC4yIDEwNS43IDMyNi45Yy00LjMtMTEuOCA3LjctMjEuOCAxOS42LTE4LjEgMzkuMiAxMi4yIDgzLjcgMTkuMSAxMzAuNyAxOS4xczkxLjUtNi45IDEzMC43LTE5LjF6TTIwOCAxOTJjMCAzNS4zLTE0LjMgNjQtMzIgNjRzLTMyLTI4LjctMzItNjQgMTQuMy02NCAzMi02NCAzMiAyOC43IDMyIDY0em0xMjggNjRjLTE3LjcgMC0zMi0yOC43LTMyLTY0czE0LjMtNjQgMzItNjQgMzIgMjguNyAzMiA2NC0xNC4zIDY0LTMyIDY0eiJdCiAgICB9OwogICAgZmFHcmluQWx0MiA9IGZhRmFjZUdyaW5XaWRlMjsKICAgIGZhUG9vcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwb29wIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY2MTkiLCAiTTI1NC40IDYuNmMzLjUtNC4zIDktNi41IDE0LjUtNS43IDQ2LjkgNi4zIDgzLjEgNDYuNSA4My4xIDk1LjEgMCAxMS4yLTEuOSAyMi01LjUgMzJsNS41IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjQgMCAxOS4xLTguNCAzNi4zLTIxLjcgNDhsMTMuNyAwYzM5LjggMCA3MiAzMi4yIDcyIDcyIDAgMjMuMi0xMSA0My44LTI4IDU3IDM0LjEgNS43IDYwIDM1LjMgNjAgNzEgMCAzOS44LTMyLjIgNzItNzIgNzJMNzIgNTEyYy0zOS44IDAtNzItMzIuMi03Mi03MiAwLTM1LjcgMjUuOS02NS4zIDYwLTcxLTE3LTEzLjItMjgtMzMuOC0yOC01NyAwLTM5LjggMzIuMi03MiA3Mi03MmwxMy43IDBjLTEzLjMtMTEuNy0yMS43LTI4LjktMjEuNy00OCAwLTM1LjMgMjguNy02NCA2NC02NGwxNi4yIDBjNDQuMS0uMSA3OS44LTM1LjkgNzkuOC04MCAwLTkuMi0xLjUtMTcuOS00LjMtMjYuMS0xLjgtNS4yLS44LTExLjEgMi44LTE1LjR6Il0KICAgIH07CiAgICBmYURoYXJtYWNoYWtyYSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkaGFybWFjaGFrcmEiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5Nzg0XSwgImY2NTUiLCAiTTMzNy44IDIwNS43bDQ4LjYtNDIuNWMxMy44IDE5LjMgMjMuNCA0MS45IDI3LjQgNjYuMmwtNjQuNCA0LjNjLTIuNC0xMC4xLTYuNC0xOS41LTExLjYtMjh6bTE0MC4xIDE5LjVjLTUuMy0zOC44LTIwLjYtNzQuNS00My4yLTEwNC4zbC44LS43QzQ0OSAxMDguNCA0NDkuNyA4Ny42IDQzNyA3NXMtMzMuNC0xMi00NS4yIDEuNWwtLjcgLjhjLTI5LjgtMjIuNi02NS41LTM3LjktMTA0LjMtNDMuMmwuMS0xLjFjMS4yLTE3LjktMTMtMzMtMzAuOS0zM3MtMzIuMSAxNS4yLTMwLjkgMzNsLjEgMS4xYy0zOC44IDUuMy03NC41IDIwLjYtMTA0LjMgNDMuMmwtLjctLjhDMTA4LjQgNjMgODcuNiA2Mi4zIDc1IDc1cy0xMiAzMy40IDEuNSA0NS4ybC44IC43Yy0yMi42IDI5LjgtMzcuOSA2NS41LTQzLjIgMTA0LjNsLTEuMS0uMWMtMTcuOS0xLjItMzMgMTMtMzMgMzAuOXMxNS4yIDMyLjEgMzMgMzAuOWwxLjEtLjFjNS4zIDM4LjggMjAuNiA3NC41IDQzLjIgMTA0LjNsLS44IC43QzYzIDQwMy42IDYyLjMgNDI0LjQgNzUgNDM3czMzLjQgMTIgNDUuMi0xLjVsLjctLjhjMjkuOCAyMi42IDY1LjUgMzcuOSAxMDQuMyA0My4ybC0uMSAxLjFjLTEuMiAxNy45IDEzIDMzIDMwLjkgMzNzMzIuMS0xNS4yIDMwLjktMzNsLS4xLTEuMWMzOC44LTUuMyA3NC41LTIwLjYgMTA0LjMtNDMuMmwuNyAuOGMxMS44IDEzLjUgMzIuNSAxNC4yIDQ1LjIgMS41czEyLTMzLjQtMS41LTQ1LjJsLS44LS43YzIyLjYtMjkuOCAzNy45LTY1LjUgNDMuMi0xMDQuM2wxLjEgLjFjMTcuOSAxLjIgMzMtMTMgMzMtMzAuOXMtMTUuMi0zMi4xLTMzLTMwLjlsLTEuMSAuMXpNMTYzLjIgMTI1LjZjMTkuMy0xMy44IDQxLjktMjMuNCA2Ni4yLTI3LjVsNC4zIDY0LjRjLTEwIDIuNC0xOS41IDYuNC0yOCAxMS42bC00Mi41LTQ4LjZ6bS02NSAxMDMuOGM0LjEtMjQuNCAxMy43LTQ2LjkgMjcuNS02Ni4ybDQ4LjYgNDIuNWMtNS4zIDguNS05LjIgMTgtMTEuNiAyOGwtNjQuNC00LjN6bTI3LjUgMTE5LjRjLTEzLjgtMTkuMy0yMy40LTQxLjktMjcuNS02Ni4ybDY0LjQtNC4zYzIuNCAxMC4xIDYuNCAxOS41IDExLjYgMjhsLTQ4LjYgNDIuNXptMTAzLjggNjVjLTI0LjQtNC4xLTQ2LjktMTMuNy02Ni4yLTI3LjRsNDIuNS00OC42YzguNSA1LjMgMTggOS4yIDI4IDExLjZsLTQuMyA2NC40em0xMTkuNC0yNy40Yy0xOS4zIDEzLjgtNDEuOSAyMy40LTY2LjIgMjcuNGwtNC4zLTY0LjRjMTAtMi40IDE5LjUtNi40IDI4LTExLjZsNDIuNSA0OC42em02NS0xMDMuOGMtNC4xIDI0LjQtMTMuNyA0Ni45LTI3LjQgNjYuMmwtNDguNi00Mi41YzUuMy04LjYgOS4yLTE4IDExLjYtMjhsNjQuNCA0LjN6bS02NS0xNTYuOWwtNDIuNSA0OC42Yy04LjYtNS4zLTE4LTkuMi0yOC0xMS42bDQuMy02NC40YzI0LjQgNC4xIDQ2LjkgMTMuNyA2Ni4yIDI3LjV6TTI1NiAyMjRhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFCYXR0ZXJ5UXVhcnRlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYXR0ZXJ5LXF1YXJ0ZXIiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsiYmF0dGVyeS0yIl0sICJmMjQzIiwgIk01MjggMTI4YzguOCAwIDE2IDcuMiAxNiAxNmwwIDIyNGMwIDguOC03LjIgMTYtMTYgMTZsLTQxNiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0yMjRjMC04LjggNy4yLTE2IDE2LTE2bDQxNiAwek0xMTIgNjRjLTQ0LjIgMC04MCAzNS44LTgwIDgwbDAgMjI0YzAgNDQuMiAzNS44IDgwIDgwIDgwbDQxNiAwYzQ0LjIgMCA4MC0zNS44IDgwLTgwbDAtNDhjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMmwwLTQ4YzAtNDQuMi0zNS44LTgwLTgwLTgwTDExMiA2NHptNTYgMTEyYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDExMmMwIDEzLjMgMTAuNyAyNCAyNCAyNGw2NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtMTEyYzAtMTMuMy0xMC43LTI0LTI0LTI0bC02NCAweiJdCiAgICB9OwogICAgZmFCYXR0ZXJ5MiA9IGZhQmF0dGVyeVF1YXJ0ZXI7CiAgICBmYUFua2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYW5raCIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWzk3NjVdLCAiZjY0NCIsICJNOTYgMTI4YzAtMzUuMyAyOC43LTY0IDY0LTY0czY0IDI4LjcgNjQgNjRjMCA0MS42LTIwLjcgNzYuNi00Ni42IDEwNC4xLTUuOSA2LjItMTEuOCAxMS44LTE3LjQgMTYuNy01LjYtNC45LTExLjUtMTAuNS0xNy40LTE2LjctMjUuOS0yNy41LTQ2LjYtNjIuNi00Ni42LTEwNC4xek0xNjAgMEM4OS4zIDAgMzIgNTcuMyAzMiAxMjggMzIgMTgwLjQgNTMuNSAyMjMuNSA3OC44IDI1NkwzMiAyNTZjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsOTYgMCAwIDE2MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTYwIDk2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTQ2LjggMEMyNjYuNSAyMjMuNSAyODggMTgwLjQgMjg4IDEyOCAyODggNTcuMyAyMzAuNyAwIDE2MCAweiJdCiAgICB9OwogICAgZmFEaWFtb25kID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRpYW1vbmQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5ODMwXSwgImYyMTkiLCAiTTE3IDIxNUwyMTUgMTdDMjI1LjkgNi4xIDI0MC42IDAgMjU2IDBzMzAuMSA2LjEgNDEgMTdMNDk1IDIxNWMxMC45IDEwLjkgMTcgMjUuNiAxNyA0MXMtNi4xIDMwLjEtMTcgNDFMMjk3IDQ5NWMtMTAuOSAxMC45LTI1LjYgMTctNDEgMTdzLTMwLjEtNi4xLTQxLTE3TDE3IDI5N0M2LjEgMjg2LjEgMCAyNzEuNCAwIDI1NnM2LjEtMzAuMSAxNy00MXoiXQogICAgfTsKICAgIGZhU3Vic2NyaXB0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN1YnNjcmlwdCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMTJjIiwgIk05NiA2NEM3OC4zIDY0IDY0IDc4LjMgNjQgOTZzMTQuMyAzMiAzMiAzMmwxNS4zIDAgODkuNiAxMjgtODkuNiAxMjgtMTUuMyAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDMyIDBjMTAuNCAwIDIwLjItNS4xIDI2LjItMTMuNkwyNDAgMzExLjggMzI1LjggNDM0LjRjNiA4LjYgMTUuOCAxMy42IDI2LjIgMTMuNmwzMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0xNS4zIDAtODkuNi0xMjggODkuNi0xMjggMTUuMyAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0zMiAwYy0xMC40IDAtMjAuMiA1LjEtMjYuMiAxMy42TDI0MCAyMDAuMiAxNTQuMiA3Ny42QzE0OC4yIDY5LjEgMTM4LjQgNjQgMTI4IDY0TDk2IDY0ek01NDQgMzIwYzAtMTEuMS01LjctMjEuNC0xNS4yLTI3LjJzLTIxLjItNi40LTMxLjEtMS40bC0zMiAxNmMtMTUuOCA3LjktMjIuMiAyNy4xLTE0LjMgNDIuOSA1LjYgMTEuMiAxNi45IDE3LjcgMjguNiAxNy43bDAgODBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwwLTEyOHoiXQogICAgfTsKICAgIGZhUnVwZWVTaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJ1cGVlLXNpZ24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs4MzYwLCAicnVwZWUiXSwgImYxNTYiLCAiTTAgNjRDMCA0Ni4zIDE0LjMgMzIgMzIgMzJsODAgMGM3OS41IDAgMTQ0IDY0LjUgMTQ0IDE0NCAwIDU0LjMtMzAgMTAxLjUtNzQuNCAxMjYuMWw0MSAxMzYuN2M1LjEgMTYuOS00LjUgMzQuOC0yMS41IDM5LjhzLTM0LjgtNC41LTM5LjgtMjEuNUwxMjAuMSAzMTkuOGMtMi43IC4xLTUuNCAuMi04LjEgLjJsLTQ4IDAgMCAxMjhjMCAxNy43LTE0LjMgMzItMzIgMzJTMCA0NjUuNyAwIDQ0OEwwIDY0ek02NCAyNTZsNDggMGM0NC4yIDAgODAtMzUuOCA4MC04MHMtMzUuOC04MC04MC04MGwtNDggMCAwIDE2MHptMjg1LjEtMzJsMzQuOSAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0zNC45IDBjLTcuMiAwLTEzLjEgNS45LTEzLjEgMTMuMSAwIDUuNyAzLjcgMTAuNyA5LjEgMTIuNWw0OS40IDE1LjljMzEuOSAxMC4zIDUzLjUgMzkuOSA1My41IDczLjQgMCA0Mi42LTM0LjUgNzcuMS03Ny4xIDc3LjFMMzIwIDQ4MGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw1MC45IDBjNy4yIDAgMTMuMS01LjkgMTMuMS0xMy4xIDAtNS43LTMuNy0xMC43LTkuMS0xMi41bC00OS40LTE1LjljLTMxLjktMTAuMy01My41LTM5LjktNTMuNS03My40IDAtNDIuNiAzNC41LTc3LjEgNzcuMS03Ny4xeiJdCiAgICB9OwogICAgZmFSdXBlZSA9IGZhUnVwZWVTaWduOwogICAgZmFQZXJzb25SaWZsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tcmlmbGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTU0ZSIsICJNNDE2IDBMMzg0IDBjLTguOCAwLTE2IDcuMi0xNiAxNnM3LjIgMTYgMTYgMTZsMCAxMDAuM2MtOS42IDUuNS0xNiAxNS45LTE2IDI3LjdsMCAzMmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAxNDRjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTYgMCAwIDk2YzAgOC44IDcuMiAxNiAxNiAxNmw1OS41IDBjMTAuNCAwIDE4LTkuOCAxNS41LTE5LjlsLTIzLTkyLjEgNDQgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0xNmMwLTguOC03LjItMTYtMTYtMTZsLTQ4IDAgMC0yNi43IDUzLjEtMTcuN2M2LjUtMi4yIDEwLjktOC4zIDEwLjktMTUuMmwwLTg0LjVjMC04LjgtNy4yLTE2LTE2LTE2bC0xNiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCA1Ni0xNiA1LjMgMC0xMDkuM2MwLTExLjgtNi40LTIyLjItMTYtMjcuN0w0MzIgMTZjMC04LjgtNy4yLTE2LTE2LTE2ek0yMjQgMjA4QzExOCAyMDggMzIgMjk0IDMyIDQwMGwwIDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC00OGMwLTMyLjUgMTIuMS02Mi4xIDMyLTg0LjdsMCAxOTYuNyAxNjAgMCAwLTI5My4xYy0yMC03LjEtNDEuNi0xMC45LTY0LTEwLjl6TTI4MCA4OGE3MiA3MiAwIDEgMCAtMTQ0IDAgNzIgNzIgMCAxIDAgMTQ0IDB6Il0KICAgIH07CiAgICBmYUQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEwMF0sICI0NCIsICJNMCA2NEMwIDQ2LjMgMTQuMyAzMiAzMiAzMmwxMjggMGMxMjMuNyAwIDIyNCAxMDAuMyAyMjQgMjI0UzI4My43IDQ4MCAxNjAgNDgwTDMyIDQ4MGMtMTcuNyAwLTMyLTE0LjMtMzItMzJMMCA2NHpNNjQgOTZsMCAzMjAgOTYgMGM4OC40IDAgMTYwLTcxLjYgMTYwLTE2MFMyNDguNCA5NiAxNjAgOTZMNjQgOTZ6Il0KICAgIH07CiAgICBmYVNxdWFyZU5maSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtbmZpIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU1NzYiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6TTkzIDE3Mi4zbDM1IDYzIDAtNTEuNGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgMTQ0YzAgMTAuOS03LjQgMjAuNS0xOCAyMy4ycy0yMS43LTItMjctMTEuNmwtMzUtNjMgMCA1MS40YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMTQ0YzAtMTAuOSA3LjQtMjAuNSAxOC0yMy4yczIxLjcgMiAyNyAxMS42ek0yMDggMTg0YzAtMTMuMyAxMC43LTI0IDI0LTI0bDgwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTU2IDAgMCAzMiA0MCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC00MCAwIDAgNDBjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0xNDR6bTE5MiAwbDAgMTQ0YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMTQ0YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjR6Il0KICAgIH07CiAgICBmYVRlZXRoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRlZXRoIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY2MmUiLCAiTTAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMzg0IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2ek0xNDQgMjA4bDAgMjRjMCAxMy4zIDEwLjcgMjQgMjQgMjRsNDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTI0YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4cy00OCAyMS41LTQ4IDQ4em0xMjggMGwwIDI0YzAgMTMuMyAxMC43IDI0IDI0IDI0bDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC0yNGMwLTI2LjUtMjEuNS00OC00OC00OHMtNDggMjEuNS00OCA0OHpNODAgMTc2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDI0YzAgMTMuMyAxMC43IDI0IDI0IDI0bDE2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC0yNGMwLTE3LjctMTQuMy0zMi0zMi0zMnptMzIwIDMybDAgMjRjMCAxMy4zIDEwLjcgMjQgMjQgMjRsMTYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTI0YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMyek00OCAzMzZjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE2YzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMTZ6bTE0NCA0OGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTE2YzAtOC44LTcuMi0xNi0xNi0xNmwtNjQgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMTZjMCAyNi41IDIxLjUgNDggNDggNDh6bTEyOCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMTZjMC04LjgtNy4yLTE2LTE2LTE2bC02NCAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAxNmMwIDI2LjUgMjEuNSA0OCA0OCA0OHptMTEyLTE2YzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMTZjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAxNmMwIDE3LjcgMTQuMyAzMiAzMiAzMnoiXQogICAgfTsKICAgIGZhTWFnbmlmeWluZ0dsYXNzRG9sbGFyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hZ25pZnlpbmctZ2xhc3MtZG9sbGFyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNlYXJjaC1kb2xsYXIiXSwgImY2ODgiLCAiTTQxNiAyMDhjMCA0NS45LTE0LjkgODguMy00MCAxMjIuN0w1MDIuNiA0NTcuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMEwzMzAuNyAzNzZDMjk2LjMgNDAxLjEgMjUzLjkgNDE2IDIwOCA0MTYgOTMuMSA0MTYgMCAzMjIuOSAwIDIwOFM5My4xIDAgMjA4IDAgNDE2IDkzLjEgNDE2IDIwOHpNMjEyIDk2Yy0xMSAwLTIwIDktMjAgMjBsMCA0Yy0yOC44IC4zLTUyIDIzLjctNTIgNTIuNSAwIDI1LjcgMTguNSA0Ny42IDQzLjkgNTEuOGw0MS43IDdjNiAxIDEwLjQgNi4yIDEwLjQgMTIuMyAwIDYuOS01LjYgMTIuNS0xMi41IDEyLjVMMTY4IDI1NmMtMTEgMC0yMCA5LTIwIDIwczkgMjAgMjAgMjBsMjQgMCAwIDRjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC00LjdjMjUtNC4xIDQ0LTI1LjcgNDQtNTEuOCAwLTI1LjctMTguNS00Ny42LTQzLjktNTEuOGwtNDEuNy03Yy02LTEtMTAuNC02LjItMTAuNC0xMi4zIDAtNi45IDUuNi0xMi41IDEyLjUtMTIuNWw0Ny41IDBjMTEgMCAyMC05IDIwLTIwcy05LTIwLTIwLTIwbC04IDAgMC00YzAtMTEtOS0yMC0yMC0yMHoiXQogICAgfTsKICAgIGZhU2VhcmNoRG9sbGFyID0gZmFNYWduaWZ5aW5nR2xhc3NEb2xsYXI7CiAgICBmYUR1bXBzdGVyRmlyZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkdW1wc3Rlci1maXJlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY3OTQiLCAiTTE2NC4zIDY0TDEzOC43IDE5MiA1NiAxOTJjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtNC4xYzAtMi42IC40LTUuMSAxLjItNy42TDU4LjUgODAuNEM2MS44IDcwLjYgNzEgNjQgODEuMyA2NGw4MyAwem0yMy40IDEyOGwyNS42LTEyOCA4Mi43IDAgMCAxMjgtMTA4LjMgMHpNMzQ0IDY0bDgyLjcgMCAxNiA4MGMtMTQuNyAuMi0yOS4zIDUuNS00MC45IDE1LjktMTEuNSAxMC4zLTIyLjUgMjEtMzIuOCAzMi4xbC0yNC45IDAgMC0xMjh6TTk2IDI0MGwyMzMuMiAwYy02LjQgOC44LTEyLjMgMTcuNi0xNy43IDI2LjMtMjEuNCAzNC43LTM5LjUgNzYuMS0zOS41IDExNS44IDAgMTcuMSAyLjEgMzMuOCA2IDQ5LjlsLTEyMC40IDAgMS45IDEwLjNjMy4yIDE3LjQtOC40IDM0LTI1LjggMzcuMnMtMzQtOC40LTM3LjItMjUuOEM3MSAzMTMuMyA1OCAyNDIuMSA1Ny43IDI0MEw5NiAyNDB6bTUxMi03MmMwIDExLTcuNCAyMC4zLTE3LjUgMjMuMS0uOS0uOC0xLjctMS42LTIuNi0yLjQtMjEuOC0yMC01NC4zLTIxLjgtNzgtNS41LTQuMi00LjMtOC41LTguNS0xMi45LTEyLjZsLTIxLjMtMTA2LjYgODMgMGMxMC4zIDAgMTkuNSA2LjYgMjIuOCAxNi40bDI1LjMgNzUuOWMuOCAyLjQgMS4yIDUgMS4yIDcuNmwwIDQuMXpNNTA1LjcgMjQwLjNMNTE4IDIyNi41YzUuNC02LjEgMTMuMy04LjggMjAuOS04LjkgNy4yIDAgMTQuMyAyLjYgMTkuOSA3LjggMTkuNyAxOC4zIDM5LjggNDMuMiA1NSA3MC42IDE1LjEgMjcuMiAyNi4yIDU4LjEgMjYuMiA4OC4xIDAgODguNy03MS4zIDE1OS44LTE2MCAxNTkuOC04OS42IDAtMTYwLTcxLjMtMTYwLTE1OS44IDAtMzcuMyAxNi03My40IDM2LjgtMTA0LjUgMjAuOS0zMS4zIDQ3LjUtNTkgNzAuOS04MC4yIDUuNy01LjIgMTMuMS03LjcgMjAuMy03LjVzMTMuNCAzLjIgMTguOCA3LjVjMTQuNCAxMS40IDM4LjkgNDAuNyAzOC45IDQwLjd6TTU0NCA0MzIuMmMwLTM2LjUtMzctNzMtNTQuOC04OC40LTUuNC00LjctMTMuMS00LjctMTguNSAwLTE3LjcgMTUuNC01NC44IDUxLjktNTQuOCA4OC40IDAgMzUuMyAyOC43IDY0IDY0IDY0czY0LTI4LjcgNjQtNjR6Il0KICAgIH07CiAgICBmYVVwbG9hZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1cGxvYWQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjA5MyIsICJNMjU2IDEwOS4zTDI1NiAzMjBjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0yMTAuNy00MS40IDQxLjRjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwcy0xMi41LTMyLjggMC00NS4zbDk2LTk2YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDk2IDk2YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zcy0zMi44IDEyLjUtNDUuMyAwTDI1NiAxMDkuM3pNMjI0IDQwMGM0NC4yIDAgODAtMzUuOCA4MC04MGw4MCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzJjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTMyYzAtMzUuMyAyOC43LTY0IDY0LTY0bDgwIDBjMCA0NC4yIDM1LjggODAgODAgODB6bTE0NCAyNGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6Il0KICAgIH07CiAgICBmYVVzZXJTbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1c2VyLXNsYXNoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbNjI3MTQsICJ1c2VyLWFsdC1zbGFzaCIsICJ1c2VyLWxhcmdlLXNsYXNoIl0sICJmNTA2IiwgIk00MS0yNC45Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMFMtMi4zLS4zIDcgOS4xbDUyOCA1MjhjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45TDMxMS41IDI0NS43YzU1LTEwLjkgOTYuNS01OS41IDk2LjUtMTE3LjcgMC02Ni4zLTUzLjctMTIwLTEyMC0xMjAtNTguMiAwLTEwNi44IDQxLjUtMTE3LjcgOTYuNUw0MS0yNC45ek0yMzUuNiAzMDUuNEMxNDcuOSAzMTYuNiA4MCAzOTEuNSA4MCA0ODIuMyA4MCA0OTguNyA5My4zIDUxMiAxMDkuNyA1MTJsMzMyLjUgMC0yMDYuNi0yMDYuNnoiXQogICAgfTsKICAgIGZhVXNlckFsdFNsYXNoID0gZmFVc2VyU2xhc2g7CiAgICBmYVVzZXJMYXJnZVNsYXNoID0gZmFVc2VyU2xhc2g7CiAgICBmYUFycm93TGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy1sZWZ0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbODU5Ml0sICJmMDYwIiwgIk05LjQgMjMzLjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zbDE2MCAxNjBjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBzMTIuNS0zMi44IDAtNDUuM0wxMDkuMyAyODggNDgwIDI4OGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMzcwLjcgMCAxMDUuNC0xMDUuNGMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMGwtMTYwIDE2MHoiXQogICAgfTsKICAgIGZhVmlhbFZpcnVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZpYWwtdmlydXMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTU5NyIsICJNNjQgMzJDNjQgMTQuMyA3OC4zIDAgOTYgMEwzMjAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwwIDE1MS43Yy0xOC41IDAtMzcgNy01MS4xIDIxLjEtMjEuNiAyMS42LTI2LjYgNTMuNi0xNSA3OS45LTI2LjkgMTAuNC00NS45IDM2LjYtNDUuOSA2Ny4xczE5IDU2LjcgNDUuOSA2Ny4xYy03LjMgMTYuNS04IDM1LjItMi4zIDUyLjItMTMuNCA1LjctMjguMiA4LjgtNDMuNiA4LjgtNjEuOSAwLTExMi01MC4xLTExMi0xMTJMOTYgNjRDNzguMyA2NCA2NCA0OS43IDY0IDMyem05NiAzMmwwIDEyOCA5NiAwIDAtMTI4LTk2IDB6TTI4MCA0MDhjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRjMjguOCAwIDQzLjItMzQuOCAyMi45LTU1LjItOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwYzIwLjQgMjAuNCA1NS4yIDUuOSA1NS4yLTIyLjkgMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGMwIDI4LjggMzQuOCA0My4yIDU1LjIgMjIuOSA5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjljLTIwLjQgMjAuNC01LjkgNTUuMiAyMi45IDU1LjIgMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRjLTI4LjggMC00My4yIDM0LjgtMjIuOSA1NS4yIDkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBjLTIwLjQtMjAuNC01NS4yLTUuOS01NS4yIDIyLjkgMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRjMC0yOC44LTM0LjgtNDMuMi01NS4yLTIyLjktOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWMyMC40LTIwLjQgNS45LTU1LjItMjIuOS01NS4yem0xMDQtMzJhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4em04OCA0MGEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAweiJdCiAgICB9OwogICAgZmFDaGVja0RvdWJsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGVjay1kb3VibGUiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjU2MCIsICJNMjQ5LjkgNjYuOGMxMC40LTE0LjMgNy4yLTM0LjMtNy4xLTQ0LjdzLTM0LjMtNy4yLTQ0LjcgNy4xbC0xMDYgMTQ1LjctMzcuNS0zNy41Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2w2NCA2NGM2LjYgNi42IDE1LjggMTAgMjUuMSA5LjNzMTcuOS01LjUgMjMuNC0xMy4xbDEyOC0xNzZ6bTEyOCAxMzZjMTAuNC0xNC4zIDcuMi0zNC4zLTcuMS00NC43cy0zNC4zLTcuMi00NC43IDcuMWwtMTcwIDIzMy43LTY5LjUtNjkuNWMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNsOTYgOTZjNi42IDYuNiAxNS44IDEwIDI1LjEgOS4zczE3LjktNS41IDIzLjQtMTMuMWwxOTItMjY0eiJdCiAgICB9OwogICAgZmFQYXcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGF3IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxYjAiLCAiTTIzNC41IDkyLjljMTQuMyA0Mi45LS4zIDg2LjItMzIuNiA5Ni44cy03MC4xLTE1LjYtODQuNC01OC41IC4zLTg2LjIgMzIuNi05Ni44IDcwLjEgMTUuNiA4NC40IDU4LjV6TTEwMC40IDE5OC42YzE4LjkgMzIuNCAxNC4zIDcwLjEtMTAuMiA4NC4xcy01OS43LS45LTc4LjUtMzMuMy0xNC4zLTcwLjEgMTAuMi04NC4xIDU5LjcgLjkgNzguNSAzMy4zek02OS4yIDQwMS4yQzEyMS42IDI1OS45IDIxNC43IDIyNCAyNTYgMjI0czEzNC40IDM1LjkgMTg2LjggMTc3LjJjMy42IDkuNyA1LjIgMjAuMSA1LjIgMzAuNWwwIDEuNmMwIDI1LjgtMjAuOSA0Ni43LTQ2LjcgNDYuNy0xMS41IDAtMjIuOS0xLjQtMzQtNC4ybC04OC0yMmMtMTUuMy0zLjgtMzEuMy0zLjgtNDYuNiAwbC04OCAyMmMtMTEuMSAyLjgtMjIuNSA0LjItMzQgNC4yLTI1LjggMC00Ni43LTIwLjktNDYuNy00Ni43bDAtMS42YzAtMTAuNCAxLjYtMjAuOCA1LjItMzAuNXpNNDIxLjggMjgyLjdjLTI0LjUtMTQtMjkuMS01MS43LTEwLjItODQuMXM1NC00Ny4zIDc4LjUtMzMuMyAyOS4xIDUxLjcgMTAuMiA4NC4xLTU0IDQ3LjMtNzguNSAzMy4zek0zMTAuMSAxODkuN2MtMzIuMy0xMC42LTQ2LjktNTMuOS0zMi42LTk2LjhzNTIuMS02OS4xIDg0LjQtNTguNSA0Ni45IDUzLjkgMzIuNiA5Ni44LTUyLjEgNjkuMS04NC40IDU4LjV6Il0KICAgIH07CiAgICBmYUhlbG1ldFNhZmV0eSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoZWxtZXQtc2FmZXR5IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImhhcmQtaGF0IiwgImhhdC1oYXJkIl0sICJmODA3IiwgIk0zNTIgMjY0bDAtMjAwYzAtMTcuNy0xNC4zLTMyLTMyLTMybC02NCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDIwMGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTE4NS45QzkwIDEwOS44IDMyIDE5MS44IDMyIDI4OGwwIDY0IDUxMiAwIDAtNjRjLTEtOTUuMi01OC40LTE3Ny43LTE0NC0yMDkuOEw0MDAgMjY0YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0ek00MCA0MDBjLTIyLjEgMC00MCAxNy45LTQwIDQwczE3LjkgNDAgNDAgNDBsNDk2IDBjMjIuMSAwIDQwLTE3LjkgNDAtNDBzLTE3LjktNDAtNDAtNDBMNDAgNDAweiJdCiAgICB9OwogICAgZmFIYXJkSGF0ID0gZmFIZWxtZXRTYWZldHk7CiAgICBmYUhhdEhhcmQgPSBmYUhlbG1ldFNhZmV0eTsKICAgIGZhRSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJlIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbMTAxXSwgIjQ1IiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0TDAgNDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMybDI1NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0yMjQgMCAwLTEyOCAxNjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTYwIDAgMC0xMjggMjI0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgMzJ6Il0KICAgIH07CiAgICBmYUZhY2VMYXVnaFNxdWludDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1sYXVnaC1zcXVpbnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsibGF1Z2gtc3F1aW50Il0sICJmNTliIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMTA3LjcgMzMyLjFDMTAyIDMxOCAxMTMuNCAzMDQgMTI4LjYgMzA0bDI1NC45IDBjMTUuMiAwIDI2LjYgMTQgMjAuOSAyOC4xLTIzLjggNTguNi04MS4yIDk5LjktMTQ4LjMgOTkuOXMtMTI0LjYtNDEuMy0xNDguMy05OS45em0xNS0xODguOGM0LjUtNi44IDEzLjMtOS4yIDIwLjYtNS41bDc5LjYgNDBjNS40IDIuNyA4LjggOC4yIDguOCAxNC4zcy0zLjQgMTEuNi04LjggMTQuM2wtNzkuNiA0MGMtNy4zIDMuNi0xNi4xIDEuMy0yMC42LTUuNXMtMy4xLTE1LjkgMy4xLTIxLjFMMTU5IDE5MiAxMjUuOCAxNjQuM2MtNi4yLTUuMi03LjYtMTQuMy0zLjEtMjEuMXptMjYzLjYgMjEuMUwzNTMgMTkyIDM4Ni4yIDIxOS43YzYuMiA1LjIgNy42IDE0LjMgMy4xIDIxLjFzLTEzLjMgOS4yLTIwLjYgNS41bC03OS42LTQwYy01LjQtMi43LTguOC04LjItOC44LTE0LjNzMy40LTExLjYgOC44LTE0LjNsNzkuNi00MGM3LjMtMy42IDE2LjEtMS4zIDIwLjYgNS41czMuMSAxNS45LTMuMSAyMS4xeiJdCiAgICB9OwogICAgZmFMYXVnaFNxdWludDIgPSBmYUZhY2VMYXVnaFNxdWludDI7CiAgICBmYURvd25MZWZ0QW5kVXBSaWdodFRvQ2VudGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRvd24tbGVmdC1hbmQtdXAtcmlnaHQtdG8tY2VudGVyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImNvbXByZXNzLWFsdCJdLCAiZjQyMiIsICJNNDM5LjUgN2M5LjQtOS40IDI0LjYtOS40IDMzLjkgMGwzMiAzMmM5LjQgOS40IDkuNCAyNC42IDAgMzMuOWwtODcgODcgMzkgMzljNi45IDYuOSA4LjkgMTcuMiA1LjIgMjYuMlM0NTAuMiAyNDAgNDQwLjUgMjQwbC0xNDQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC0xNDRjMC05LjcgNS44LTE4LjUgMTQuOC0yMi4yczE5LjMtMS43IDI2LjIgNS4ybDM5IDM5IDg3LTg3ek03Mi41IDI3MmwxNDQgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDE0NGMwIDkuNy01LjggMTguNS0xNC44IDIyLjJzLTE5LjMgMS43LTI2LjItNS4ybC0zOS0zOS04NyA4N2MtOS40IDkuNC0yNC42IDkuNC0zMy45IDBsLTMyLTMyYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOWw4Ny04Ny0zOS0zOWMtNi45LTYuOS04LjktMTcuMi01LjItMjYuMlM2Mi44IDI3MiA3Mi41IDI3MnoiXQogICAgfTsKICAgIGZhQ29tcHJlc3NBbHQgPSBmYURvd25MZWZ0QW5kVXBSaWdodFRvQ2VudGVyOwogICAgZmFHaWZ0cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnaWZ0cyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNzljIiwgIk0yMDItMzAuNmMxMi41IDQuNCAxOSAxOC4xIDE0LjYgMzAuNmwtOC4yIDIzLjEgMjUuNC0xOC41YzEwLjctNy44IDI1LjctNS40IDMzLjUgNS4zczUuNCAyNS43LTUuMyAzMy41TDIzMy44IDY0IDI3MiA2NGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDIuMWMtNTQuNyAxMC40LTk2IDU4LjQtOTYgMTE2bDAgMS45YzAgOC45IDEgMTcuNSAyLjggMjUuOS0xMS45IDE3LjgtMTguOCAzOS4xLTE4LjggNjIuMWwwIDEyOGMwIDIzLjggNy40IDQ1LjkgMjAuMSA2NEw0OCA1MTJjLTI2LjUgMC00OC0yMS41LTQ4LTQ4TDAgMTEyQzAgODUuNSAyMS41IDY0IDQ4IDY0bDM4LjIgMC0yOC4zLTIwLjZDNDcuMiAzNS42IDQ0LjggMjAuNiA1Mi42IDkuOVM3NS40LTMuMiA4Ni4xIDQuNmwyNy40IDIwLTguMy0yNUMxMDEtMTMgMTA3LjgtMjYuNiAxMjAuNC0zMC44czI2LjIgMi42IDMwLjQgMTUuMmw5LjkgMjkuOCAxMC43LTMwLjJjNC40LTEyLjUgMTguMS0xOSAzMC42LTE0LjZ6TTQ4OS45IDIwOGMtNy41IDAtMTQuNSAzLjgtMTguNiAxMC4xTDQ0Ni45IDI1NiA0ODggMjU2YzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtMS45YzAtMTIuMi05LjktMjIuMS0yMi4xLTIyLjF6TTM4NS4xIDI1NmwtMjQuNC0zNy45Yy00LjEtNi4zLTExLjEtMTAuMS0xOC42LTEwLjEtMTIuMiAwLTIyLjEgOS45LTIyLjEgMjIuMWwwIDEuOWMwIDEzLjMgMTAuNyAyNCAyNCAyNGw0MS4xIDB6TTI4MS45IDI2OC41Yy02LjMtMTAuNy05LjktMjMuMi05LjktMzYuNWwwLTEuOWMwLTM4LjcgMzEuNC03MC4xIDcwLjEtNzAuMSAyMy44IDAgNDYgMTIuMSA1OC45IDMyLjFsMTUgMjMuMiAxNS0yMy4yYzEyLjktMjAgMzUuMS0zMi4xIDU4LjktMzIuMSAzOC43IDAgNzAuMSAzMS40IDcwLjEgNzAuMWwwIDEuOWMwIDEzLjMtMy42IDI1LjgtOS45IDM2LjUgMTUuNyAxMS43IDI1LjkgMzAuNCAyNS45IDUxLjVsMCAxMjhjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTcyIDAgMC0yMDgtNDggMCAwIDIwOC03MiAwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTEyOGMwLTIxLjEgMTAuMi0zOS44IDI1LjktNTEuNXoiXQogICAgfTsKICAgIGZhQmVkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJlZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyODcxNl0sICJmMjM2IiwgIk0zMiAzMmMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDIyNCAyMjQgMCAwLTEyOGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwxNjAgMGM1MyAwIDk2IDQzIDk2IDk2bDAgMjI0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNjQtNDQ4IDAgMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMlMwIDQ2NS43IDAgNDQ4TDAgNjRDMCA0Ni4zIDE0LjMgMzIgMzIgMzJ6bTgwIDE2MGE2NCA2NCAwIDEgMSAxMjggMCA2NCA2NCAwIDEgMSAtMTI4IDB6Il0KICAgIH07CiAgICBmYU1vbmV5QmlsbFRyYW5zZmVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vbmV5LWJpbGwtdHJhbnNmZXIiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTUyOCIsICJNMzEgMTA1Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOUwxMDMtMWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjlsLTMxIDMxIDY3LjcgMCAwIDAgMzM4LjMgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDE3OC4yLTUuMS01LjFjLTI4LjEtMjguMS03My43LTI4LjEtMTAxLjggMC0yNy4yIDI3LjItMjguMSA3MC42LTIuOCA5OC45bDY3LjcgMC0zMS0zMWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDcyIDcyYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45bC03MiA3MmMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWwzMS0zMS00MDYuMSAwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTE3OC4yIDUuMSA1LjFjMjguMSAyOC4xIDczLjcgMjguMSAxMDEuOCAwIDI3LjItMjcuMiAyOC4xLTcwLjYgMi44LTk4LjlsLTY3LjcgMCAzMSAzMWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwTDMxIDEwNXpNNDE2IDI1NmE5NiA5NiAwIDEgMCAtMTkyIDAgOTYgOTYgMCAxIDAgMTkyIDB6bTg4LTY0LjVjNC40IC41IDgtMy4xIDgtNy41bDAtNDhjMC00LjQtMy42LTgtOC04bC00OCAwYy00LjQgMC04LjEgMy42LTcuNSA4IDMuNiAyOSAyNi42IDUxLjkgNTUuNSA1NS41em0tMzY4IDEyOWMtNC40LS41LTggMy4xLTggNy41bDAgNDhjMCA0LjQgMy42IDggOCA4bDQ4IDBjNC40IDAgOC4xLTMuNiA3LjUtOC0zLjYtMjktMjYuNi01MS45LTU1LjUtNTUuNXoiXQogICAgfTsKICAgIGZhUGVyc29uUnVubmluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tcnVubmluZyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyNzkzOSwgInJ1bm5pbmciXSwgImY3MGMiLCAiTTI1Ni41LTMyYTU2IDU2IDAgMSAxIDAgMTEyIDU2IDU2IDAgMSAxIDAtMTEyek0xMjMuNiAxNzZjLTMuMyAwLTYuMiAyLTcuNCA1TDk0LjIgMjM1LjljLTYuNiAxNi40LTI1LjIgMjQuNC00MS42IDE3LjhzLTI0LjQtMjUuMi0xNy44LTQxLjZsMjEuOS01NC45QzY3LjcgMTI5LjkgOTQuMSAxMTIgMTIzLjYgMTEybDk3LjMgMGMyOC41IDAgNTQuOCAxNS4xIDY5LjEgMzkuN2wzMi44IDU2LjMgNjEuNiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC02MS42IDBjLTIyLjggMC00My44LTEyLjEtNTUuMy0zMS44bC0xMC0xNy4xLTIwLjcgNzAuNCA3NS40IDIyLjZjMjcuNyA4LjMgNDEuOCAzOSAzMC4xIDY1LjVMMjg1LjcgNTA5Yy03LjIgMTYuMi0yNi4xIDIzLjQtNDIuMiAxNi4ycy0yMy40LTI2LjEtMTYuMi00Mi4ybDQ5LjItMTEwLjgtOTUuOS0yOC44Yy0zMi43LTkuOC01Mi00My43LTQzLjctNzYuOGwyMi43LTkwLjYtMzUuOSAwem0tOCAxODFjMTMuMyAxNC45IDMwLjcgMjYuMyA1MS4yIDMyLjRsNC43IDEuNC02LjkgMTkuM2MtNS44IDE2LjMtMTYgMzAuOC0yOS4zIDQxLjhMNTIuOSA1MTkuOGMtMTMuNiAxMS4yLTMzLjggOS4zLTQ1LTQuM3MtOS4zLTMzLjggNC4zLTQ1bDgyLjQtNjcuOWM0LjUtMy43IDcuOC04LjUgOS44LTEzLjlMMTE1LjYgMzU3eiJdCiAgICB9OwogICAgZmFSdW5uaW5nID0gZmFQZXJzb25SdW5uaW5nOwogICAgZmFDaXJjbGVDaGV2cm9uRG93biA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtY2hldnJvbi1kb3duIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImNoZXZyb24tY2lyY2xlLWRvd24iXSwgImYxM2EiLCAiTTI1NiAwYTI1NiAyNTYgMCAxIDAgMCA1MTIgMjU2IDI1NiAwIDEgMCAwLTUxMnpNMTM1IDI0MWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDg3IDg3IDg3LTg3YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOUwyNzMgMzQ1Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMEwxMzUgMjQxeiJdCiAgICB9OwogICAgZmFDaGV2cm9uQ2lyY2xlRG93biA9IGZhQ2lyY2xlQ2hldnJvbkRvd247CiAgICBmYVVzZXJOdXJzZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1c2VyLW51cnNlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY4MmYiLCAiTTk2IDQ0LjljMC0xMi43IDcuNS0yNC4yIDE5LjItMjkuM2w5Ni00MmM4LjItMy42IDE3LjUtMy42IDI1LjcgMGw5NiA0MkMzNDQuNSAyMC43IDM1MiAzMi4yIDM1MiA0NC45bDAgOTkuMWMwIDcwLjctNTcuMyAxMjgtMTI4IDEyOFM5NiAyMTQuNyA5NiAxNDRsMC05OS4xek0zMDQgMTI4bC0xMTEuNiAwLS40IDAtNDggMCAwIDE2YzAgNDQuMiAzNS44IDgwIDgwIDgwczgwLTM1LjggODAtODBsMC0xNnpNMjA4IDE2bDAgMTYtMTYgMGMtNC40IDAtOCAzLjYtOCA4bDAgMTZjMCA0LjQgMy42IDggOCA4bDE2IDAgMCAxNmMwIDQuNCAzLjYgOCA4IDhsMTYgMGM0LjQgMCA4LTMuNiA4LThsMC0xNiAxNiAwYzQuNCAwIDgtMy42IDgtOGwwLTE2YzAtNC40LTMuNi04LTgtOGwtMTYgMCAwLTE2YzAtNC40LTMuNi04LTgtOEwyMTYgOGMtNC40IDAtOCAzLjYtOCA4ek0xNDIuNiAzMjNjLTYuNS00LjktMTUuMi02LjItMjIuNi0yLjgtNjEuNCAyOC4yLTEwNC4xIDkwLjItMTA0LjEgMTYyLjEgMCAxNi40IDEzLjMgMjkuNyAyOS43IDI5LjdsMzU2LjYgMGMxNi40IDAgMjkuNy0xMy4zIDI5LjctMjkuNyAwLTcyLTQyLjctMTM0LTEwNC4xLTE2Mi4xLTcuNC0zLjQtMTYuMS0yLjEtMjIuNiAyLjhsLTY3IDUwLjJjLTguNSA2LjQtMjAuMyA2LjQtMjguOCAwbC02Ny01MC4yeiJdCiAgICB9OwogICAgZmFGYWNlS2lzc1dpbmtIZWFydDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1raXNzLXdpbmstaGVhcnQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjg1MzYsICJraXNzLXdpbmstaGVhcnQiXSwgImY1OTgiLCAiTTU0My43IDI2OC4zYy4yLTQuMSAuMy04LjIgLjMtMTIuMyAwLTE0MS40LTExNC42LTI1Ni0yNTYtMjU2UzMyIDExNC42IDMyIDI1NiAxNDYuNiA1MTIgMjg4IDUxMmM0MS40IDAgODAuNS05LjggMTE1LjEtMjcuMy03LjYtMTcuMS0xNi4xLTM4LjgtMjEuOC02MS43LTcuNy0zMC41LTE0LjEtNzYuMiA4LjItMTE0LjdsMi43LTQuNmMyOS41LTUxIDk0LjctNjguNSAxNDUuNy0zOSAyIDEuMiA0IDIuNCA1LjkgMy43ek0yNDAgMzA0YzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4IDAgMTIuMy00LjYgMjMuNS0xMi4yIDMyIDcuNiA4LjUgMTIuMiAxOS43IDEyLjIgMzIgMCAyNi41LTIxLjUgNDgtNDggNDhsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsMTYgMGM4LjggMCAxNi03LjIgMTYtMTZzLTcuMi0xNi0xNi0xNmwtMTYgMGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNmwxNiAwYzguOCAwIDE2LTcuMiAxNi0xNnMtNy4yLTE2LTE2LTE2bC0xNiAwYy04LjggMC0xNi03LjItMTYtMTZ6TTIwOCAxNzZhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em0xNTIgMjBjLTExIDAtMjAgOS0yMCAyMHMtOSAyMC0yMCAyMC0yMC05LTIwLTIwYzAtMzMuMSAyNi45LTYwIDYwLTYwbDE2IDBjMzMuMSAwIDYwIDI2LjkgNjAgNjAgMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwLTktMjAtMjAtMjBsLTE2IDB6TTU0Mi44IDM1MGMtMi4yLTE4LjMtMTIuOS0zNC42LTI4LjktNDMuOC0yOC4xLTE2LjItNjMuOS02LjYtODAuMSAyMS41bC0yLjcgNC42Yy0yNC41IDQyLjUgNy45IDExNy45IDI0LjQgMTUwLjggNS4xIDEwLjEgMTUuNSAxNi4xIDI2LjggMTUuNSAzNi43LTIuMiAxMTguMi0xMS43IDE0Mi44LTU0LjJsMi43LTQuNmMxNi4yLTI4LjEgNi42LTYzLjktMjEuNS04MC4xLTE2LTkuMi0zNS40LTEwLjQtNTIuNC0zLjFsLTkuOCA0LjItMS4zLTEwLjZ6Il0KICAgIH07CiAgICBmYUtpc3NXaW5rSGVhcnQyID0gZmFGYWNlS2lzc1dpbmtIZWFydDI7CiAgICBmYUZpbGwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNTc1IiwgIk0yOTYgNjRjNi45IDAgMTMuNSAyLjcgMTguMyA3LjZMNDQwLjQgMTk3LjdjNC45IDQuOSA3LjYgMTEuNSA3LjYgMTguM3MtMi43IDEzLjUtNy42IDE4LjNMMzg2LjcgMjg4IDY1LjMgMjg4YzEuMy0zLjkgMy40LTcuNCA2LjMtMTAuM2w5Ni40LTk2LjQgMzMuNCAzMy40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNMMjEzLjMgMTM2IDI3Ny43IDcxLjZjNC45LTQuOSAxMS41LTcuNiAxOC4zLTcuNnpNMTIyLjcgMTM2TDI2LjMgMjMyLjRDOS41IDI0OS4zIDAgMjcyLjEgMCAyOTZzOS41IDQ2LjcgMjYuMyA2My42TDE1Mi40IDQ4NS43QzE2OS4zIDUwMi41IDE5Mi4xIDUxMiAyMTYgNTEyczQ2LjctOS41IDYzLjYtMjYuM0w0ODUuNyAyNzkuNkM1MDIuNSAyNjIuNyA1MTIgMjM5LjkgNTEyIDIxNnMtOS41LTQ2LjctMjYuMy02My42TDM1OS42IDI2LjNDMzQyLjcgOS41IDMxOS45IDAgMjk2IDBzLTQ2LjcgOS41LTYzLjYgMjYuM0wxNjggOTAuNyAxMTguNiA0MS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM0wxMjIuNyAxMzZ6Il0KICAgIH07CiAgICBmYU1vbmV5QmlsbDFXYXZlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vbmV5LWJpbGwtMS13YXZlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbIm1vbmV5LWJpbGwtd2F2ZS1hbHQiXSwgImY1M2IiLCAiTTAgMTA5LjVMMCA0MTkuNmMwIDE5LjQgMTEuOCAzNy4zIDMwLjMgNDMuMyA5NCAzMCAxNTguOCA4LjQgMjIzLjMtMTMuMSA2Mi40LTIwLjggMTI0LjQtNDEuNSAyMTIuMS0xNS4zIDIyLjIgNi42IDQ2LjItOC44IDQ2LjItMzJsMC0zMTAuMWMwLTE5LjQtMTEuOC0zNy4zLTMwLjMtNDMuMy05NC0zMC0xNTguOC04LjQtMjIzLjMgMTMuMS02Mi40IDIwLjgtMTI0LjQgNDEuNS0yMTIuMSAxNS4zLTIyLjItNi42LTQ2LjMgOC44LTQ2LjMgMzJ6TTI1NiAzNjhjLTUzIDAtOTYtNTAuMS05Ni0xMTJzNDMtMTEyIDk2LTExMiA5NiA1MC4xIDk2IDExMi00MyAxMTItOTYgMTEyek0xMjcuMSA0MDUuNWMuNyA0LjQtMi44IDguMS03LjIgOC4xLTE1LjcgMC0zMi4xLTEuOC01MC02LjEtMy41LS44LTYtNC02LTcuN0w2NCAzNjBjMC00LjQgMy42LTguMSA4LTcuNSAyOC4xIDMuNSA1MC42IDI1LjIgNTUuMiA1M3pNNDQ4IDM1NC42YzAgNS00LjYgOC44LTkuNSA4LTE1LjQtMi41LTMwLjItMy45LTQ0LjQtNC4zLTQuOS0uMS04LjctNC41LTcuMi05LjIgNy4zLTIzLjcgMjgtNDEuNCA1My4yLTQ0LjYgNC40LS41IDggMy4xIDggNy41bDAgNDIuNnptLTgtMTk1LjFjLTI4LjEtMy41LTUwLjYtMjUuMi01NS4yLTUzLS43LTQuNCAyLjgtOC4xIDcuMi04LjEgMTUuNyAwIDMyLjEgMS44IDUwIDYuMSAzLjUgLjggNiA0IDYgNy43bDAgMzkuOWMwIDQuNC0zLjYgOC4xLTggNy41em0tMzIyLjEtNS44YzQuOSAuMSA4LjcgNC41IDcuMiA5LjItNy4zIDIzLjctMjggNDEuNC01My4yIDQ0LjYtNC40IC41LTgtMy4xLTgtNy41bDAtNDIuNmMwLTUgNC42LTguOCA5LjUtOCAxNS40IDIuNSAzMC4yIDMuOSA0NC40IDQuM3pNMjQwIDE4OGMtMTEgMC0yMCA5LTIwIDIwIDAgOS43IDYuOSAxNy43IDE2IDE5LjZsMCA0OC40LTQgMGMtMTEgMC0yMCA5LTIwIDIwczkgMjAgMjAgMjBsNDggMGMxMSAwIDIwLTkgMjAtMjBzLTktMjAtMjAtMjBsLTQgMCAwLTY4YzAtMTEtOS0yMC0yMC0yMGwtMTYgMHoiXQogICAgfTsKICAgIGZhTW9uZXlCaWxsV2F2ZUFsdCA9IGZhTW9uZXlCaWxsMVdhdmU7CiAgICBmYUxhbmRtYXJrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxhbmRtYXJrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3OTYzXSwgImY2NmYiLCAiTTIzOC43IDUuMWMxMC41LTYuOCAyNC4xLTYuOCAzNC42IDBsMjI0IDE0NGMxMS45IDcuNyAxNy40IDIyLjMgMTMuNCAzNS45cy0xNi41IDIzLTMwLjcgMjNsLTMyIDAgMCAyMDggNTEuMiAzOC40YzguMSA2IDEyLjggMTUuNSAxMi44IDI1LjYgMCAxNy43LTE0LjMgMzItMzIgMzJMMzIgNTEyYy0xNy43IDAtMzItMTQuMy0zMi0zMiAwLTEwLjEgNC43LTE5LjYgMTIuOC0yNS42bDUxLjItMzguNCAwIDAgMC0yMDgtMzIgMGMtMTQuMiAwLTI2LjctOS40LTMwLjctMjNzMS41LTI4LjMgMTMuNC0zNS45bDIyNC0xNDR6TTMzNiAyMDhsMCAyMDggNjQgMCAwLTIwOC02NCAwek0yMjQgNDE2bDY0IDAgMC0yMDgtNjQgMCAwIDIwOHpNMTEyIDIwOGwwIDIwOCA2NCAwIDAtMjA4LTY0IDB6Il0KICAgIH07CiAgICBmYU11c2ljID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm11c2ljIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3OTI1XSwgImYwMDEiLCAiTTQ2OCA3YzcuNiA2LjEgMTIgMTUuMyAxMiAyNWwwIDMwNGMwIDQ0LjItNDMgODAtOTYgODBzLTk2LTM1LjgtOTYtODAgNDMtODAgOTYtODBjMTEuMiAwIDIyIDEuNiAzMiA0LjZsMC0xMTYuNy0yMjQgNDkuOCAwIDIwNi4zYzAgNDQuMi00MyA4MC05NiA4MHMtOTYtMzUuOC05Ni04MCA0My04MCA5Ni04MGMxMS4yIDAgMjIgMS42IDMyIDQuNkwxMjggOTZjMC0xNSAxMC40LTI4IDI1LjEtMzEuMmwyODgtNjRjOS41LTIuMSAxOS40IC4yIDI3IDYuM3oiXQogICAgfTsKICAgIGZhQm9va01lZGljYWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm9vay1tZWRpY2FsIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY3ZTYiLCAiTTk2IDUxMmwzMjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwwLTY2LjdjMTguNi02LjYgMzItMjQuNCAzMi00NS4zbDAtMjg4YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4TDk2IDBDNDMgMCAwIDQzIDAgOTZMMCA0MTZjMCA1MyA0MyA5NiA5NiA5NnpNNjQgNDE2YzAtMTcuNyAxNC4zLTMyIDMyLTMybDI1NiAwIDAgNjQtMjU2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyek0xOTIgMTIwYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDQwIDQwIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC00MCAwIDAgNDBjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC00MC00MCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsNDAgMCAwLTQweiJdCiAgICB9OwogICAgZmFTaHVmZmxlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNodWZmbGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgyNTYsICJyYW5kb20iXSwgImYwNzQiLCAiTTQwMy44IDM0LjRjMTItNSAyNS43LTIuMiAzNC45IDYuOWw2NCA2NGM2IDYgOS40IDE0LjEgOS40IDIyLjZzLTMuNCAxNi42LTkuNCAyMi42bC02NCA2NGMtOS4yIDkuMi0yMi45IDExLjktMzQuOSA2LjlTMzg0IDIwNC45IDM4NCAxOTJsMC0zMi0zMiAwYy0xMC4xIDAtMTkuNiA0LjctMjUuNiAxMi44bC0zMi40IDQzLjItNDAtNTMuMyAyMS4yLTI4LjNDMjkzLjMgMTEwLjIgMzIxLjggOTYgMzUyIDk2bDMyIDAgMC0zMmMwLTEyLjkgNy44LTI0LjYgMTkuOC0yOS42ek0xNTQgMjk2bDQwIDUzLjMtMjEuMiAyOC4zQzE1NC43IDQwMS44IDEyNi4yIDQxNiA5NiA0MTZsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsNjQgMGMxMC4xIDAgMTkuNi00LjcgMjUuNi0xMi44TDE1NCAyOTZ6TTQzOC42IDQ3MC42Yy05LjIgOS4yLTIyLjkgMTEuOS0zNC45IDYuOVMzODQgNDYwLjkgMzg0IDQ0OGwwLTMyLTMyIDBjLTMwLjIgMC01OC43LTE0LjItNzYuOC0zOC40TDEyMS42IDE3Mi44Yy02LTguMS0xNS41LTEyLjgtMjUuNi0xMi44bC02NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMlMxNC4zIDk2IDMyIDk2bDY0IDBjMzAuMiAwIDU4LjcgMTQuMiA3Ni44IDM4LjRMMzI2LjQgMzM5LjJjNiA4LjEgMTUuNSAxMi44IDI1LjYgMTIuOGwzMiAwIDAtMzJjMC0xMi45IDcuOC0yNC42IDE5LjgtMjkuNnMyNS43LTIuMiAzNC45IDYuOWw2NCA2NGM2IDYgOS40IDE0LjEgOS40IDIyLjZzLTMuNCAxNi42LTkuNCAyMi42bC02NCA2NHoiXQogICAgfTsKICAgIGZhUmFuZG9tID0gZmFTaHVmZmxlOwogICAgZmFVbmRlcmxpbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidW5kZXJsaW5lIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYwY2QiLCAiTTAgMzJDMCAxNC4zIDE0LjMgMCAzMiAwTDk2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJTMTEzLjcgNjQgOTYgNjRsMCAxNjBjMCA1MyA0MyA5NiA5NiA5NnM5Ni00MyA5Ni05NmwwLTE2MGMtMTcuNyAwLTMyLTE0LjMtMzItMzJTMjcwLjMgMCAyODggMGw2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybDAgMTYwYzAgODguNC03MS42IDE2MC0xNjAgMTYwUzMyIDMxMi40IDMyIDIyNEwzMiA2NEMxNC4zIDY0IDAgNDkuNyAwIDMyek0wIDQ4MGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzMjAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA1MTJjLTE3LjcgMC0zMi0xNC4zLTMyLTMyeiJdCiAgICB9OwogICAgZmFCdWlsZGluZ1VzZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnVpbGRpbmctdXNlciIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNGRhIiwgIk02NCA2NEM2NCAyOC43IDkyLjcgMCAxMjggMEwzODQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDEyMS4zYy00Ni45IDE5LTgwIDY1LTgwIDExOC43IDAgMjcuNyA4LjggNTMuNCAyMy44IDc0LjQtNTEuNSAyMS04Ny44IDcxLjYtODcuOCAxMzAuNyAwIDEgMCAxLjkgMCAyLjlsLTE3NiAwYy0zNS4zIDAtNjQtMjguNy02NC02NEw2NCA2NHpNMjA4IDQwMGwwIDY0IDUzLjQgMGM3LjItMjkuNCAyMS4zLTU2LjEgNDAuNC03OC4zLTYuMS0xOS41LTI0LjMtMzMuNy00NS44LTMzLjctMjYuNSAwLTQ4IDIxLjUtNDggNDh6TTMzOSAyMjQuM2MtMS0uMi0yLS4zLTMtLjNsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwxNi43IDBjMi4xLTIyLjggOC40LTQ0LjMgMTguMy02My43ek0xNzYgOTZjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHptMTEyIDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6TTE3NiAyMjRjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHptMjQwIDgwYTgwIDgwIDAgMSAxIDE2MCAwIDgwIDgwIDAgMSAxIC0xNjAgMHpNMzUyIDUxMmMwLTUzIDQzLTk2IDk2LTk2bDk2IDBjNTMgMCA5NiA0MyA5NiA5NiAwIDE3LjctMTQuMyAzMi0zMiAzMmwtMjI0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyeiJdCiAgICB9OwogICAgZmFSb2JvdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyb2JvdCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzEyOTMwMl0sICJmNTQ0IiwgIk0zNTIgMGMwLTE3LjctMTQuMy0zMi0zMi0zMlMyODgtMTcuNyAyODggMGwwIDY0LTk2IDBjLTUzIDAtOTYgNDMtOTYgOTZsMCAyMjRjMCA1MyA0MyA5NiA5NiA5NmwyNTYgMGM1MyAwIDk2LTQzIDk2LTk2bDAtMjI0YzAtNTMtNDMtOTYtOTYtOTZsLTk2IDAgMC02NHpNMTYwIDM2OGMwLTEzLjMgMTAuNy0yNCAyNC0yNGwzMiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0zMiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHptMTIwIDBjMC0xMy4zIDEwLjctMjQgMjQtMjRsMzIgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMzIgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjR6bTEyMCAwYzAtMTMuMyAxMC43LTI0IDI0LTI0bDMyIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTMyIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0ek0yMjQgMTc2YTQ4IDQ4IDAgMSAxIDAgOTYgNDggNDggMCAxIDEgMC05NnptMTQ0IDQ4YTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6TTY0IDIyNGMwLTE3LjctMTQuMy0zMi0zMi0zMlMwIDIwNi4zIDAgMjI0bDAgOTZjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTk2em01NDQtMzJjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgOTZjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTk2YzAtMTcuNy0xNC4zLTMyLTMyLTMyeiJdCiAgICB9OwogICAgZmFQbHVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBsdXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMDEzMywgNjE1NDMsICJhZGQiXSwgIjJiIiwgIk0yNTYgNjRjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAxNjAtMTYwIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMTYwIDAgMCAxNjBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE2MCAxNjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTYwIDAgMC0xNjB6Il0KICAgIH07CiAgICBmYUFkZCA9IGZhUGx1czsKICAgIGZhQ29weTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY29weSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMGM1IiwgIk0xOTIgMGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCAyNTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTkyIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yMDAuNmMwLTE3LjQtNy4xLTM0LjEtMTkuNy00Ni4yTDM3MC42IDE3LjhDMzU4LjcgNi40IDM0Mi44IDAgMzI2LjMgMEwxOTIgMHpNNjQgMTI4Yy0zNS4zIDAtNjQgMjguNy02NCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxOTIgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTE2LTY0IDAgMCAxNi0xOTIgMCAwLTI1NiAxNiAwIDAtNjQtMTYgMHoiXQogICAgfTsKICAgIGZhQ2hlc3NLaW5nMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGVzcy1raW5nIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbOTgxOF0sICJmNDNmIiwgIk0yMjQtMzJjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAzMiAzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0zMiAwIDAgNjQgMTUzLjggMGMyMS4xIDAgMzguMiAxNy4xIDM4LjIgMzguMiAwIDYuNC0xLjYgMTIuNy00LjcgMTguM0wzNTIgMzg0IDQwOC4yIDQ1NC4zYzUgNi4zIDcuOCAxNC4xIDcuOCAyMi4yIDAgMTkuNi0xNS45IDM1LjUtMzUuNSAzNS41TDY3LjUgNTEyYy0xOS42IDAtMzUuNS0xNS45LTM1LjUtMzUuNSAwLTguMSAyLjctMTUuOSA3LjgtMjIuMkw5NiAzODQgNC43IDIxNi42QzEuNiAyMTAuOSAwIDIwNC42IDAgMTk4LjIgMCAxNzcuMSAxNy4xIDE2MCAzOC4yIDE2MGwxNTMuOCAwIDAtNjQtMzIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwzMiAwIDAtMzJjMC0xNy43IDE0LjMtMzIgMzItMzJ6Il0KICAgIH07CiAgICBmYUhvdXNlRmxvb2RXYXRlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VzZS1mbG9vZC13YXRlciIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTBlIiwgIk00OTYgMjA4bDQuNSAwYzE1LjIgMCAyNy41LTEyLjMgMjcuNS0yNy41IDAtNy45LTMuNC0xNS41LTkuNC0yMC43TDM0OCAxMC41QzM0MC4zIDMuNyAzMzAuMyAwIDMyMCAwcy0yMC4zIDMuNy0yOCAxMC41TDEyMS40IDE1OS44Yy02IDUuMi05LjQgMTIuOC05LjQgMjAuNyAwIDE1LjIgMTIuMyAyNy41IDI3LjUgMjcuNWw0LjUgMCAwIDk0LjRjMjAuMy05LjQgNDIuMS0xNC4yIDY0LTE0LjQgMzMuMS0uMiA2Ni4zIDEwLjIgOTQuNCAzMS40IDIyLjEgMTYuNiAyOS4xIDE2LjYgNTEuMiAwIDI3LjUtMjAuNyA1OS45LTMxLjIgOTIuNC0zMS40IDE2LjktLjEgMzMuOCAyLjYgNTAgOGwwLTg4em0tMjI0LThjMC0xMy4zIDEwLjctMjQgMjQtMjRsNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0bC00OCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTQ4ek00NzQuNiA0MTIuMWMxOSAxNC40IDQxLjkgMjguMiA2Ny4yIDMzLjMgMjYuNSA1LjQgNTQuMyAuOCA4MC43LTE5LjEgMTAuNi04IDEyLjctMjMgNC43LTMzLjZzLTIzLTEyLjctMzMuNi00LjdjLTE0LjkgMTEuMi0yOC42IDEzLjEtNDIuMyAxMC4zLTE0LjktMy0zMC45LTExLjktNDcuOC0yNC42LTM4LjQtMjktOTAuNS0yOS0xMjkgMC0yNCAxOC4xLTQwLjcgMjYuMy01NC41IDI2LjNzLTMwLjUtOC4yLTU0LjUtMjYuM2MtMzguNC0yOS05MC41LTI5LTEyOSAwLTIxLjYgMTYuMy00MS4zIDI1LjgtNTguOSAyNS43LTkuNi0uMS0xOS45LTMtMzEuMi0xMS41LTEwLjYtOC0yNS42LTUuOS0zMy42IDQuN1M3IDQxOC4zIDE3LjYgNDI2LjNjMTkuMSAxNC40IDM5LjQgMjEgNTkuOCAyMS4xIDMzLjkgLjIgNjQuMy0xNy40IDg4LjEtMzUuMyAyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAyNC4yIDE4LjMgNTIuMyAzNS45IDgzLjQgMzUuOXM1OS4xLTE3LjcgODMuNC0zNS45YzIxLjMtMTYuMSA0OS45LTE2LjEgNzEuMiAwem0tNzEuMiA5NmMyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAxOSAxNC40IDQxLjkgMjguMiA2Ny4yIDMzLjMgMjYuNSA1LjQgNTQuMyAuOCA4MC43LTE5LjEgMTAuNi04IDEyLjctMjMgNC43LTMzLjZzLTIzLTEyLjctMzMuNi00LjdjLTE0LjkgMTEuMi0yOC42IDEzLjEtNDIuMyAxMC4zLTE0LjktMy0zMC45LTExLjktNDcuOC0yNC42LTM4LjQtMjktOTAuNS0yOS0xMjkgMC0yNCAxOC4xLTQwLjcgMjYuMy01NC41IDI2LjNzLTMwLjUtOC4yLTU0LjUtMjYuM2MtMzguNC0yOS05MC41LTI5LTEyOSAwLTIxLjYgMTYuMy00MS4zIDI1LjgtNTguOSAyNS43LTkuNi0uMS0xOS45LTMtMzEuMi0xMS41LTEwLjYtOC0yNS42LTUuOS0zMy42IDQuN1M3IDUxNC4zIDE3LjYgNTIyLjNjMTkuMSAxNC40IDM5LjQgMjEgNTkuOCAyMS4xIDMzLjkgLjIgNjQuMy0xNy40IDg4LjEtMzUuMyAyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAyNC4yIDE4LjMgNTIuMyAzNS45IDgzLjQgMzUuOXM1OS4xLTE3LjcgODMuNC0zNS45eiJdCiAgICB9OwogICAgZmFCaXRjb2luU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiaXRjb2luLXNpZ24iLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZTBiNCIsICJNNjQgMjRDNjQgMTAuNyA3NC43IDAgODggMHMyNCAxMC43IDI0IDI0bDAgNDAgMzIgMCAwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA0MS4xYzU0LjMgNy44IDk2IDU0LjQgOTYgMTEwLjkgMCAyNC4yLTcuNyA0Ni42LTIwLjcgNjQuOSAzMS43IDE5LjggNTIuNyA1NSA1Mi43IDk1LjEgMCA2MS45LTUwLjEgMTEyLTExMiAxMTJsLTE2IDAgMCA0MGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTQwLTMyIDAgMCA0MGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTQwLTIyLjMgMEMxOC43IDQ0OCAwIDQyOS4zIDAgNDA2LjNMMCAxMDEuNkMwIDgwLjggMTYuOCA2NCAzNy42IDY0TDY0IDY0IDY0IDI0em0wIDIwMGwxMTIgMGMyNi41IDAgNDgtMjEuNSA0OC00OHMtMjEuNS00OC00OC00OGwtMTEyIDAgMCA5NnptMTEyIDY0bC0xMTIgMCAwIDk2IDE0NCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4cy0yMS41LTQ4LTQ4LTQ4bC0zMiAweiJdCiAgICB9OwogICAgZmFCb3ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm94IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI4MjMwXSwgImY0NjYiLCAiTTM2OS40IDEyOGwtMzQuMy00OC0yMjIuMSAwLTM0LjMgNDggMjkwLjcgMHpNMCAxNDguNWMwLTEzLjMgNC4yLTI2LjMgMTEuOS0zNy4yTDYwLjkgNDIuOEM3Mi45IDI2IDkyLjMgMTYgMTEyLjkgMTZsMjIyLjEgMGMyMC43IDAgNDAuMSAxMCA1Mi4xIDI2LjhsNDguOSA2OC41YzcuOCAxMC45IDExLjkgMjMuOSAxMS45IDM3LjJMNDQ4IDQxNmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTQ4LjV6Il0KICAgIH07CiAgICBmYVNxdWFyZVBsdXMyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1wbHVzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbNjE4NDYsICJwbHVzLXNxdWFyZSJdLCAiZjBmZSIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnpNMjAwIDM0NGwwLTY0LTY0IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsNjQgMCAwLTY0YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA2NCA2NCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC02NCAwIDAgNjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjR6Il0KICAgIH07CiAgICBmYVBsdXNTcXVhcmUyID0gZmFTcXVhcmVQbHVzMjsKICAgIGZhQXJyb3dzTGVmdFJpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93cy1sZWZ0LXJpZ2h0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImFycm93cy1oIl0sICJmMDdlIiwgIk00NzAuNiAzNzQuNmw5Ni05NmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM2wtOTYtOTZjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zbDQxLjQgNDEuNC0zNTcuNSAwIDQxLjQtNDEuNGMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMGwtOTYgOTZjLTYgNi05LjQgMTQuMS05LjQgMjIuNnMzLjQgMTYuNiA5LjQgMjIuNmw5NiA5NmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zbC00MS40LTQxLjQgMzU3LjUgMC00MS40IDQxLjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDB6Il0KICAgIH07CiAgICBmYUFycm93c0ggPSBmYUFycm93c0xlZnRSaWdodDsKICAgIGZhRmFuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmODYzIiwgIk0xNjAgMTQ0YzAtNzkuNSA2NC41LTE0NCAxNDQtMTQ0IDguOCAwIDE2IDcuMiAxNiAxNmwwIDE1Mi4yYzE1LTUuMyAzMS4yLTguMiA0OC04LjIgNzkuNSAwIDE0NCA2NC41IDE0NCAxNDQgMCA4LjgtNy4yIDE2LTE2IDE2bC0xNTIuMiAwYzUuMyAxNSA4LjIgMzEuMiA4LjIgNDggMCA3OS41LTY0LjUgMTQ0LTE0NCAxNDQtOC44IDAtMTYtNy4yLTE2LTE2bDAtMTUyLjJjLTE1IDUuMy0zMS4yIDguMi00OCA4LjItNzkuNSAwLTE0NC02NC41LTE0NC0xNDQgMC04LjggNy4yLTE2IDE2LTE2bDE1Mi4yIDBjLTUuMy0xNS04LjItMzEuMi04LjItNDh6bTk2IDE0NGEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6Il0KICAgIH07CiAgICBmYUNyb3cgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY3JvdyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNTIwIiwgIk00NTYuNSAwYy00OC42IDAtODggMzkuNC04OCA4OGwwIDM2LTM1NS4yIDI2Ni40Qy0uOCA0MDEtMy43IDQyMSA2LjkgNDM1LjJzMzAuNiAxNyA0NC44IDYuNGw3Ni44LTU3LjYgMTMxLjMgMCA0Ni42IDExMy4xIDEgMi4yYzUuNyAxMC43IDE4LjggMTUuNSAzMC4zIDEwLjhzMTcuMy0xNy4zIDEzLjktMjlsLS44LTIuMy0zOS4xLTk0LjkgNDAuOSAwYzEuMSAwIDIuMiAwIDMuMiAwbDQ2LjYgMTEzLjIgMSAyLjJjNS43IDEwLjcgMTguOCAxNS41IDMwLjMgMTAuOHMxNy4zLTE3LjMgMTMuOS0yOWwtLjgtMi4zLTQyLTEwMkM0ODUuMyAzNTQuMSA1NDQuNSAyODAgNTQ0LjUgMTkybDAtNzIgODAuNS0yMC4xYzguNi0yLjEgMTMuOC0xMC44IDExLjYtMTkuNC03LjEtMjguNS0zMi43LTQ4LjUtNjIuMS00OC41bC01MC4xIDBDNTA4LjIgMTIuNSA0ODMuOCAwIDQ1Ni41IDB6bTAgNjRhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4eiJdCiAgICB9OwogICAgZmFGaWxlQ2lyY2xlQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1jaXJjbGUtY2hlY2siLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTVhMCIsICJNOTYgMEM2MC43IDAgMzIgMjguNyAzMiA2NGwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxODAgMGMtMjIuNy0zMS41LTM2LTcwLjItMzYtMTEyIDAtMTAwLjYgNzcuNC0xODMuMiAxNzYtMTkxLjNsMC0zOC4xYzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI5MC43IDE4LjdDMjc4LjcgNi43IDI2Mi41IDAgMjQ1LjUgMEw5NiAwek0zNTcuNSAxNzZMMjY0IDE3NmMtMTMuMyAwLTI0LTEwLjctMjQtMjRMMjQwIDU4LjUgMzU3LjUgMTc2ek01NzYgNDAwYTE0NCAxNDQgMCAxIDAgLTI4OCAwIDE0NCAxNDQgMCAxIDAgMjg4IDB6bS04Ni42LTYwLjljNy4xIDUuMiA4LjcgMTUuMiAzLjUgMjIuM2wtNjQgODhjLTIuOCAzLjgtNyA2LjItMTEuNyA2LjVzLTkuMy0xLjMtMTIuNi00LjZsLTQwLTQwYy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBsMjYuOCAyNi44IDUzLTcyLjljNS4yLTcuMSAxNS4yLTguNyAyMi40LTMuNXoiXQogICAgfTsKICAgIGZhTGlua1NsYXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxpbmstc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsiY2hhaW4tYnJva2VuIiwgImNoYWluLXNsYXNoIiwgInVubGluayJdLCAiZjEyNyIsICJNNDEtMjQuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTLTIuMy0uMyA3IDkuMWw1MjggNTI4YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtMTIyLTEyMmM0LjItMy40IDguMy03LjEgMTIuMS0xMC45bDcxLjEtNzEuMWMyOS4zLTI5LjMgNDUuOC02OS4xIDQ1LjgtMTEwLjYgMC04Ni40LTcwLTE1Ni41LTE1Ni41LTE1Ni41LTM3LjMgMC03My4xIDEzLjMtMTAxLjMgMzcuMiAyMC4zIDEwLjEgMzguNyAyMy41IDU0LjUgMzkuNSAxNC4xLTguMyAzMC4yLTEyLjcgNDYuOC0xMi43IDUxLjEgMCA5Mi41IDQxLjQgOTIuNSA5Mi41IDAgMjQuNS05LjcgNDgtMjcuMSA2NS40bC03MS4xIDcxLjFjLTMuOSAzLjktOC4xIDcuNC0xMi42IDEwLjVsLTQ3LjUtNDcuNWMxNi41LS45IDI5LjctMTQuNCAzMC4yLTMxLjEgMC0xLjMgMC0yLjYgMC0zLjkgMC04Ni4zLTY5LjktMTU2LjktMTU2LjUtMTU2LjktMTkuMiAwLTM3LjkgMy41LTU1LjUgMTAuMkw0MS0yNC45ek0yMjUuOSAxNjBjLjYgMCAxLjEgMCAxLjcgMCAxNS4xIDAgMjkuNSAzLjcgNDIuMSAxMC4yIDEuOCAxLjIgMy42IDIuMyA1LjUgMy4xIDI2LjggMTYuMyA0NC44IDQ1LjkgNDQuOCA3OS42IDAgLjQgMCAuOCAwIDEuMkwyMjUuOSAxNjB6TTM0Ni4yIDQxNkwxOTIgMjYxLjhjMS4yIDg0LjYgNjkuNiAxNTIuOSAxNTQuMSAxNTQuMXpNMTM5LjcgMjA5LjVsLTQ1LjMtNDUuMy00OC42IDQ4LjZjLTI5LjMgMjkuMy00NS44IDY5LjEtNDUuOCAxMTAuNiAwIDg2LjQgNzAgMTU2LjUgMTU2LjUgMTU2LjUgMzcuMiAwIDczLjEtMTMuMyAxMDEuMy0zNy4yLTIwLjMtMTAuMS0zOC44LTIzLjUtNTQuNi0zOS41LTE0IDguMi0zMC4xIDEyLjYtNDYuNyAxMi42LTUxLjEgMC05Mi41LTQxLjQtOTIuNS05Mi41IDAtMjQuNSA5LjctNDggMjcuMS02NS40bDQ4LjYtNDguNnoiXQogICAgfTsKICAgIGZhQ2hhaW5Ccm9rZW4gPSBmYUxpbmtTbGFzaDsKICAgIGZhQ2hhaW5TbGFzaCA9IGZhTGlua1NsYXNoOwogICAgZmFVbmxpbmsgPSBmYUxpbmtTbGFzaDsKICAgIGZhQXJyb3dSb3RhdGVSaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy1yb3RhdGUtcmlnaHQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs4NjM1LCAiYXJyb3ctcmlnaHQtcm90YXRlIiwgImFycm93LXJvdGF0ZS1mb3J3YXJkIiwgInJlZG8iXSwgImYwMWUiLCAiTTQzNi43IDc0LjdMNDQ4IDg1LjQgNDQ4IDMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAxMjhjMCAxNy43LTE0LjMgMzItMzIgMzJsLTEyOCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDQ3LjkgMC03LjYtNy4yYy0uMi0uMi0uNC0uNC0uNi0uNi03NS03NS0xOTYuNS03NS0yNzEuNSAwcy03NSAxOTYuNSAwIDI3MS41IDE5Ni41IDc1IDI3MS41IDBjOC4yLTguMiAxNS41LTE2LjkgMjEuOS0yNi4xIDEwLjEtMTQuNSAzMC4xLTE4IDQ0LjYtNy45czE4IDMwLjEgNy45IDQ0LjZjLTguNSAxMi4yLTE4LjIgMjMuOC0yOS4xIDM0LjctMTAwIDEwMC0yNjIuMSAxMDAtMzYyIDBTLTI1IDE3NSA3NSA3NWM5OS45LTk5LjkgMjYxLjctMTAwIDM2MS43LS4zeiJdCiAgICB9OwogICAgZmFBcnJvd1JpZ2h0Um90YXRlID0gZmFBcnJvd1JvdGF0ZVJpZ2h0OwogICAgZmFBcnJvd1JvdGF0ZUZvcndhcmQgPSBmYUFycm93Um90YXRlUmlnaHQ7CiAgICBmYVJlZG8gPSBmYUFycm93Um90YXRlUmlnaHQ7CiAgICBmYVBlbkNsaXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVuLWNsaXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsicGVuLWFsdCJdLCAiZjMwNSIsICJNNDA0IDBjMTkuMiAwIDM3LjYgNy42IDUxLjEgMjEuMmwzNS43IDM1LjdDNTA0LjQgNzAuNCA1MTIgODguOCA1MTIgMTA4cy03LjYgMzcuNi0yMS4yIDUxLjFMNDQ1LjkgMjA0IDMwOCA2Ni4xIDM1Mi45IDIxLjJDMzY2LjQgNy42IDM4NC44IDAgNDA0IDB6TTI3NC4xIDEwMGwwIDAgMTM3LjkgMTM3LjktMjE1LjEgMjE1LjFjLTEwLjcgMTAuNy0yNC4xIDE4LjUtMzguNyAyMi42TDMwLjQgNTExLjFjLTguMyAyLjMtMTcuMyAwLTIzLjQtNi4ycy04LjUtMTUuMS02LjItMjMuNEwzNi40IDM1My44YzQuMS0xNC42IDExLjgtMjcuOSAyMi42LTM4LjdMMjQwLjEgMTMzLjkgMjIzIDExNi45Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMEw4OSAyMTdjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlMMTU1LjEgODIuOWMyOC4xLTI4LjEgNzMuNy0yOC4xIDEwMS44IDBMMjc0LjEgMTAweiJdCiAgICB9OwogICAgZmFQZW5BbHQgPSBmYVBlbkNsaXA7CiAgICBmYURvb3JDbG9zZWQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZG9vci1jbG9zZWQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjg2ODJdLCAiZjUyYSIsICJNMzIgNjRDMzIgMjguNyA2MC43IDAgOTYgMEwzNTIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDM4NGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA1MTJjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJMMzIgNjR6TTMyMCAyODhhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFBcnJvd0Rvd25XaWRlU2hvcnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctZG93bi13aWRlLXNob3J0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInNvcnQtYW1vdW50LWFzYyIsICJzb3J0LWFtb3VudC1kb3duIl0sICJmMTYwIiwgIk0yNDYuNiAzNzQuNmwtOTYgOTZjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwbC05Ni05NmMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMEw5NiAzNzAuNyA5NiA2NGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMzA2LjcgNDEuNC00MS40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwczEyLjUgMzIuOCAwIDQ1LjN6TTMyMCA0ODBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIgMHptMC0xMjhjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsOTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtOTYgMHptMC0xMjhjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMTYwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTE2MCAwem0wLTEyOGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwyMjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMjAgOTZ6Il0KICAgIH07CiAgICBmYVNvcnRBbW91bnRBc2MgPSBmYUFycm93RG93bldpZGVTaG9ydDsKICAgIGZhU29ydEFtb3VudERvd24gPSBmYUFycm93RG93bldpZGVTaG9ydDsKICAgIGZhQ2FyZXREb3duID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhcmV0LWRvd24iLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZjBkNyIsICJNMTQwLjMgMzc2LjhjMTIuNiAxMC4yIDMxLjEgOS41IDQyLjgtMi4ybDEyOC0xMjhjOS4yLTkuMiAxMS45LTIyLjkgNi45LTM0LjlTMzAxLjQgMTkyIDI4OC41IDE5MmwtMjU2IDBjLTEyLjkgMC0yNC42IDcuOC0yOS42IDE5LjhTLjcgMjM3LjUgOS45IDI0Ni42bDEyOCAxMjggMi40IDIuMnoiXQogICAgfTsKICAgIGZhSyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJrIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbMTA3XSwgIjRiIiwgIk0zMTEgODYuM2MxMi4zLTEyLjcgMTItMzIuOS0uNy00NS4ycy0zMi45LTEyLTQ1LjIgLjdDMTQzLjQgMTY3LjIgNzYuNCAyMzYuMyA2NCAyNDlMNjQgNjRjMC0xNy43LTE0LjMtMzItMzItMzJTMCA0Ni4zIDAgNjRMMCA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTEwNyA2NC43LTY2LjcgMTMzIDE5MmMxMC4xIDE0LjUgMzAgMTguMSA0NC41IDguMXMxOC4xLTMwIDguMS00NC41TDE3NC4xIDIyNy40IDMxMSA4Ni4zeiJdCiAgICB9OwogICAgZmFDaGVja1RvU2xvdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGVjay10by1zbG90IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInZvdGUteWVhIl0sICJmNzcyIiwgIk01NTIgMjg4YzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgMTA0YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAzMTJjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDEwNGMwIDguOCA3LjIgMTYgMTYgMTZsNDQ4IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMTA0YzAtMTMuMyAxMC43LTI0IDI0LTI0ek00MTYgMzJjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyMjRjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTI1NiAwYy0zNS4zIDAtNjQtMjguNy02NC02NEw5NiA5NmMwLTM1LjMgMjguNy02NCA2NC02NGwyNTYgMHptLTM3LjEgODQuNmMtMTAuNy03LjgtMjUuNy01LjQtMzMuNSA1LjNsLTg1LjYgMTE3LjctMjYuNS0yNy40Yy05LjItOS41LTI0LjQtOS44LTMzLjktLjYtOS41IDkuMi05LjggMjQuNC0uNiAzMy45bDQ2LjQgNDhjNC45IDUuMSAxMS44IDcuOCAxOC45IDcuM3MxMy42LTQuMSAxNy44LTkuOEwzODQuMiAxNTAuMWM3LjgtMTAuNyA1LjQtMjUuNy01LjMtMzMuNXoiXQogICAgfTsKICAgIGZhVm90ZVllYSA9IGZhQ2hlY2tUb1Nsb3Q7CiAgICBmYUZpc2hGaW5zID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpc2gtZmlucyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNGYyIiwgIk0yNzUuMiAzOC40Yy0xMC42LTgtMjUtOC41LTM2LjMtMS41UzIyMiA1Ny4zIDIyNC42IDcwLjNsOS43IDQ4LjZjLTE5LjQgOS0zNi45IDE5LjktNTIuNCAzMS41LTE1LjMgMTEuNS0yOSAyMy45LTQwLjcgMzYuM0w0OC4xIDEzMi40Yy0xMi41LTcuMy0yOC40LTUuMy0zOC43IDQuOXMtMTIuNCAyNi01LjMgMzguNkw1MCAyNTYgNC4yIDMzNi4xYy03LjIgMTIuNi01IDI4LjQgNS4zIDM4LjZzMjYuMSAxMi4yIDM4LjcgNC45bDkzLjEtNTQuM2MxMS44IDEyLjMgMjUuNCAyNC44IDQwLjcgMzYuMyAxNS41IDExLjYgMzMgMjIuNSA1Mi40IDMxLjVsLTkuNyA0OC42Yy0yLjYgMTMgMy4xIDI2LjMgMTQuMyAzMy4zczI1LjYgNi41IDM2LjMtMS41bDc3LjYtNTguMmM1NC45LTQgMTAxLjUtMjcgMTM3LjItNTMuOCAzOS4yLTI5LjQgNjcuMi02NC43IDgxLjYtODkuNSA1LjgtOS45IDUuOC0yMi4yIDAtMzIuMS0xNC40LTI0LjgtNDIuNS02MC4xLTgxLjYtODkuNS0zNS44LTI2LjgtODIuMy00OS44LTEzNy4yLTUzLjhMMjc1LjIgMzguNHpNMzg0IDI1NmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAweiJdCiAgICB9OwogICAgZmFDb21wcmVzcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjb21wcmVzcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMDY2IiwgIk0xNjAgNjRjMC0xNy43LTE0LjMtMzItMzItMzJTOTYgNDYuMyA5NiA2NGwwIDY0LTY0IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsOTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTk2ek0zMiAzMjBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNjQgMCAwIDY0YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC05NmMwLTE3LjctMTQuMy0zMi0zMi0zMmwtOTYgMHpNMzUyIDY0YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgOTZjMCAxNy43IDE0LjMgMzIgMzIgMzJsOTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNjQgMCAwLTY0ek0zMjAgMzIwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDk2YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC02NCA2NCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC05NiAweiJdCiAgICB9OwogICAgZmFBcnJvd1VwQVogPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctdXAtYS16IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNvcnQtYWxwaGEtdXAiXSwgImYxNWUiLCAiTTQxMi42IDQ5LjdDNDA3LjIgMzguOCAzOTYuMSAzMiAzODQgMzJzLTIzLjIgNi44LTI4LjYgMTcuN2MtNTAuNyAxMDEuMy03Ny4zIDE1NC43LTgwIDE2MC03LjkgMTUuOC0xLjUgMzUgMTQuMyA0Mi45czM1IDEuNSA0Mi45LTE0LjNsNy4yLTE0LjMgODguNCAwIDcuMiAxNC4zYzcuOSAxNS44IDI3LjEgMjIuMiA0Mi45IDE0LjNzMjIuMi0yNy4xIDE0LjMtNDIuOWMtMi43LTUuMy0yOS4zLTU4LjctODAtMTYwek0zODQgMTM1LjZsMjAuMiA0MC40LTQwLjQgMCAyMC4yLTQwLjR6TTI4OCAzMjBjMCAxNy43IDE0LjMgMzIgMzIgMzJsNTAuNyAwLTczLjQgNzMuNGMtOS4yIDkuMi0xMS45IDIyLjktNi45IDM0LjlTMzA3LjEgNDgwIDMyMCA0ODBsMTI4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTUwLjcgMCA3My40LTczLjRjOS4yLTkuMiAxMS45LTIyLjkgNi45LTM0LjlTNDYwLjkgMjg4IDQ0OCAyODhsLTEyOCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnpNMTUwLjYgNDEuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTgwIDgwYy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwTDk2IDE0MS4zIDk2IDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzA2LjcgMjUuNCAyNS40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTgwLTgweiJdCiAgICB9OwogICAgZmFTb3J0QWxwaGFVcCA9IGZhQXJyb3dVcEFaOwogICAgZmFVc2VyR3JhZHVhdGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlci1ncmFkdWF0ZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNTAxIiwgIk0yNDEuMy0xM2MtMTEuNC0yLjMtMjMuMS0yLjMtMzQuNSAwTDE5LjMgMjQuNUM4LjEgMjYuNyAwIDM2LjYgMCA0OCAwIDU4LjMgNi41IDY3LjMgMTYgNzAuNkwxNiAxNDQgLjMgMjIyLjZjLS4yIC45LS4zIDEuOS0uMyAyLjkgMCA4IDYuNSAxNC42IDE0LjYgMTQuNmwzNC45IDBjOCAwIDE0LjYtNi41IDE0LjYtMTQuNiAwLTEtLjEtMS45LS4zLTIuOUw0OCAxNDQgNDggNzcuMyA5NiA4Ni45IDk2IDE0NGMwIDcwLjcgNTcuMyAxMjggMTI4IDEyOHMxMjgtNTcuMyAxMjgtMTI4bDAtNTcuMSA3Ni43LTE1LjNDNDM5LjkgNjkuMyA0NDggNTkuNCA0NDggNDhzLTguMS0yMS4zLTE5LjMtMjMuNUwyNDEuMy0xM3pNMjI0IDIyNGMtNDQuMiAwLTgwLTM1LjgtODAtODBsMTYwIDBjMCA0NC4yLTM1LjggODAtODAgODB6TTEyMC4xIDMyMC4xQzU4LjcgMzQ4LjMgMTYgNDEwLjMgMTYgNDgyLjMgMTYgNDk4LjcgMjkuMyA1MTIgNDUuNyA1MTJsMTU0LjMgMCAwLTE0Ni01Ny40LTQzYy02LjUtNC45LTE1LjItNi4yLTIyLjYtMi44ek0yNDggNTEybDE1NC4zIDBjMTYuNCAwIDI5LjctMTMuMyAyOS43LTI5LjcgMC03Mi00Mi43LTEzNC0xMDQuMS0xNjIuMS03LjQtMy40LTE2LjEtMi4xLTIyLjYgMi44bC01Ny40IDQzIDAgMTQ2eiJdCiAgICB9OwogICAgZmFGaWxlQ29kZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1jb2RlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYxYzkiLCAiTTAgNjRDMCAyOC43IDI4LjcgMCA2NCAwTDIxMy41IDBjMTcgMCAzMy4zIDYuNyA0NS4zIDE4LjdMMzY1LjMgMTI1LjNjMTIgMTIgMTguNyAyOC4zIDE4LjcgNDUuM0wzODQgNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA2NHptMjA4LTUuNWwwIDkzLjVjMCAxMy4zIDEwLjcgMjQgMjQgMjRMMzI1LjUgMTc2IDIwOCA1OC41ek0xNTQuMiAyOTUuNmM4LjYtMTAuMSA3LjUtMjUuMi0yLjYtMzMuOHMtMjUuMi03LjUtMzMuOCAyLjZsLTQ4IDU2Yy03LjcgOS03LjcgMjIuMiAwIDMxLjJsNDggNTZjOC42IDEwLjEgMjMuOCAxMS4yIDMzLjggMi42czExLjItMjMuOCAyLjYtMzMuOGwtMzQuNi00MC40IDM0LjYtNDAuNHptMTEyLTMxLjJjLTguNi0xMC4xLTIzLjgtMTEuMi0zMy44LTIuNnMtMTEuMiAyMy44LTIuNiAzMy44bDM0LjYgNDAuNC0zNC42IDQwLjRjLTguNiAxMC4xLTcuNSAyNS4yIDIuNiAzMy44czI1LjIgNy41IDMzLjgtMi42bDQ4LTU2YzcuNy05IDcuNy0yMi4yIDAtMzEuMmwtNDgtNTZ6Il0KICAgIH07CiAgICBmYVNvYXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic29hcCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyOTUzMl0sICJlMDZlIiwgIk0yMDgtMzJhNDggNDggMCAxIDEgMCA5NiA0OCA0OCAwIDEgMSAwLTk2ek0zMjAgOTZhNjQgNjQgMCAxIDEgMCAxMjggNjQgNjQgMCAxIDEgMC0xMjh6TTM1MiAwYTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6TTk2IDE2MGwxMTIgMGMwIDIzLjggNy40IDQ1LjkgMjAuMSA2NEwxNjAgMjI0Yy01MyAwLTk2IDQzLTk2IDk2czQzIDk2IDk2IDk2bDE5MiAwYzUzIDAgOTYtNDMgOTYtOTYgMC0zNS4xLTE4LjktNjUuOS00Ny04Mi42IDE5LTE5LjggMzAuNy00Ni42IDMxLTc2LjEgNDUuNCA3LjYgODAgNDcuMSA4MCA5NC43bDAgMTI4YzAgNTMtNDMgOTYtOTYgOTZMOTYgNDgwYy01MyAwLTk2LTQzLTk2LTk2TDAgMjU2YzAtNTMgNDMtOTYgOTYtOTZ6bTY0IDExMmwxOTIgMGMyNi41IDAgNDggMjEuNSA0OCA0OHMtMjEuNSA0OC00OCA0OGwtMTkyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4czIxLjUtNDggNDgtNDh6Il0KICAgIH07CiAgICBmYVJlY3ljbGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicmVjeWNsZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzk4NDIsIDk4NTAsIDk4NTFdLCAiZjFiOCIsICJNMTUyLjMgNjBDMTk4LjUtMjAgMzE0LTIwIDM2MC4yIDYwbDM3LjMgNjQuNiAyNy43LTE2YzguNC00LjkgMTguOS00LjIgMjYuNiAxLjdzMTEuMSAxNS45IDguNiAyNS4zTDQzNi45IDIyM2MtMy40IDEyLjgtMTYuNiAyMC40LTI5LjQgMTdsLTg3LjQtMjMuNGMtOS40LTIuNS0xNi4zLTEwLjQtMTcuNi0yMHMzLjQtMTkuMSAxMS44LTIzLjlsMjcuNy0xNi0zNy4zLTY0LjZjLTIxLjYtMzcuMy03NS40LTM3LjMtOTcgMGwtNS4zIDkuMWMtOC44IDE1LjMtMjguNCAyMC41LTQzLjcgMTEuN1MxMzguMiA4NC41IDE0NyA2OS4xbDUuMy05LjF6TTQ0OS43IDI3OS4xYzE1LjMtOC44IDM0LjktMy42IDQzLjcgMTEuN2w1LjMgOS4xYzQ2LjIgODAtMTEuNSAxODAtMTAzLjkgMTgwbC03NC42IDAgMCAzMmMwIDkuNy01LjggMTguNS0xNC44IDIyLjJzLTE5LjMgMS43LTI2LjItNS4ybC02NC02NGMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlsNjQtNjRjNi45LTYuOSAxNy4yLTguOSAyNi4yLTUuMnMxNC44IDEyLjUgMTQuOCAyMi4ybDAgMzIgNzQuNiAwYzQzLjEgMCA3MC4xLTQ2LjcgNDguNS04NGwtNS4zLTkuMWMtOC44LTE1LjMtMy42LTM0LjkgMTEuNy00My43ek01MSAyMzUuNGwtMjcuNy0xNmMtOC40LTQuOS0xMy4xLTE0LjMtMTEuOC0yMy45czguMi0xNy41IDE3LjYtMjBMMTE2LjUgMTUyYzEyLjgtMy40IDI2IDQuMiAyOS40IDE3bDIzLjQgODcuNGMyLjUgOS40LS45IDE5LjMtOC42IDI1LjNzLTE4LjIgNi42LTI2LjYgMS43bC0yNy43LTE2LTM3LjMgNjQuNmMtMjEuNiAzNy4zIDUuNCA4NCA0OC41IDg0bDEwLjYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTAuNiAwQzI1LjMgNDgwLTMyLjQgMzgwIDEzLjggMzAwTDUxIDIzNS40eiJdCiAgICB9OwogICAgZmFGYWNlR3JpbldpbmsyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi13aW5rIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImdyaW4td2luayJdLCAiZjU4YyIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTM4Ni43IDMwOC45YzExLjktMy43IDIzLjkgNi4zIDE5LjYgMTguMS0yMi40IDYxLjMtODEuMyAxMDUuMS0xNTAuMyAxMDUuMVMxMjguMSAzODguMiAxMDUuNyAzMjYuOWMtNC4zLTExLjggNy43LTIxLjggMTkuNi0xOC4xIDM5LjIgMTIuMiA4My43IDE5LjEgMTMwLjcgMTkuMXM5MS41LTYuOSAxMzAuNy0xOS4xek0zMjggMTk2Yy0xMSAwLTIwIDktMjAgMjBzLTkgMjAtMjAgMjAtMjAtOS0yMC0yMGMwLTMzLjEgMjYuOS02MCA2MC02MGwxNiAwYzMzLjEgMCA2MCAyNi45IDYwIDYwIDAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMC05LTIwLTIwLTIwbC0xNiAwek0xNzYgMTc2YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhR3JpbldpbmsyID0gZmFGYWNlR3JpbldpbmsyOwogICAgZmFXYXRlckxhZGRlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3YXRlci1sYWRkZXIiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsibGFkZGVyLXdhdGVyIiwgInN3aW1taW5nLXBvb2wiXSwgImY1YzUiLCAiTTM3NC41IDQwNS43YzM4LjQtMjkgOTAuNS0yOSAxMjkgMCAxNi45IDEyLjcgMzIuOSAyMS41IDQ3LjggMjQuNiAxMy43IDIuOCAyNy40IC45IDQyLjMtMTAuMyAxMC42LTggMjUuNi01LjkgMzMuNiA0LjdzNS44IDI1LjctNC44IDMzLjZjLTI2LjQgMTkuOS01NC4yIDI0LjQtODAuNyAxOS4xLTI1LjMtNS4xLTQ4LjEtMTguOS02Ny4yLTMzLjMtMjEuMy0xNi4xLTQ5LjktMTYuMS03MS4yIDAtMjQuMiAxOC4zLTUyLjMgMzUuOS04My40IDM1LjlzLTU5LjEtMTcuNy04My4zLTM1LjljLTIxLjMtMTYuMS00OS45LTE2LjEtNzEuMiAwLTIzLjggMTcuOS01NC4xIDM1LjUtODguMSAzNS4zLTIwLjQtLjEtNDAuNy02LjctNTkuOC0yMS4xLTEwLjYtOC0xMi43LTIzLTQuNy0zMy42czIzLTEyLjcgMzMuNi00LjdjMTEuMyA4LjUgMjEuNiAxMS40IDMxLjIgMTEuNSAxNy42IC4xIDM3LjMtOS40IDU4LjktMjUuNyAzOC40LTI5IDkwLjYtMjkgMTI5IDAgMjQgMTguMSA0MC43IDI2LjMgNTQuNSAyNi4zczMwLjUtOC4yIDU0LjUtMjYuM3pNNTExLjggMzJjNDguMyAwIDg5IDM2IDk1IDgzLjlsMSA4LjJjMi4yIDE3LjUtMTAuMiAzMy41LTI3LjggMzUuN3MtMzMuNS0xMC4yLTM1LjctMjcuOGwtMS04LjJjLTItMTUuOS0xNS41LTI3LjgtMzEuNS0yNy44LTE3LjUgMC0zMS44IDE0LjItMzEuOCAzMS44bDAgMjExLjhjLTIzLjEtNS4xLTQ0LjktNC40LTY0LS40bDAtNTEuMi0xOTIgMCAwIDQ4LjdjLTUuMy0uNS0xMC43LS44LTE2LS43LTE2LjIgLjEtMzIuNCAyLjctNDggOGwwLTIxNi4yYzAtNTIuOSA0Mi45LTk1LjggOTUuNy05NS44IDQ4LjMgMCA4OSAzNiA5NSA4My45bDEgOC4yYzIuMiAxNy41LTEwLjIgMzMuNS0yNy44IDM1LjdzLTMzLjUtMTAuMi0zNS43LTI3LjhsLTEtOC4yYy0yLTE1LjktMTUuNS0yNy44LTMxLjUtMjcuOC0xNy41IDAtMzEuNyAxNC4yLTMxLjcgMzEuOGwwIDk2LjIgMTkyIDAgMC05Ni4yQzQxNiA3NC45IDQ1OC45IDMyIDUxMS44IDMyeiJdCiAgICB9OwogICAgZmFMYWRkZXJXYXRlciA9IGZhV2F0ZXJMYWRkZXI7CiAgICBmYVN3aW1taW5nUG9vbCA9IGZhV2F0ZXJMYWRkZXI7CiAgICBmYVRvd2VyQ2VsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0b3dlci1jZWxsIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1ODUiLCAiTTU5LjYgOS44QzQ3LjMgNC44IDMzLjMgMTAuNyAyOC40IDIzIDE1LjIgNTUuNSA4IDkwLjkgOCAxMjhzNy4yIDcyLjUgMjAuNCAxMDVjNSAxMi4zIDE5IDE4LjIgMzEuMyAxMy4yczE4LjItMTkgMTMuMi0zMS4zQzYyIDE4OC4yIDU2IDE1OC44IDU2IDEyOHM2LTYwLjIgMTYuOS04N2M1LTEyLjMtMS0yNi4zLTEzLjItMzEuM3ptNDU2LjggMGMtMTIuMyA1LTE4LjIgMTktMTMuMiAzMS4zIDEwLjkgMjYuOCAxNi45IDU2LjIgMTYuOSA4N3MtNiA2MC4yLTE2LjkgODdjLTUgMTIuMyAxIDI2LjMgMTMuMiAzMS4zczI2LjMtMSAzMS4zLTEzLjJjMTMuMS0zMi41IDIwLjQtNjcuOSAyMC40LTEwNXMtNy4yLTcyLjUtMjAuNC0xMDVjLTUtMTIuMy0xOS0xOC4yLTMxLjMtMTMuMnpNMzQwLjEgMTY1LjJjNy41LTEwLjUgMTEuOS0yMy4zIDExLjktMzcuMiAwLTM1LjMtMjguNy02NC02NC02NHMtNjQgMjguNy02NCA2NGMwIDEzLjkgNC40IDI2LjcgMTEuOSAzNy4yTDk4LjkgNDY2LjhjLTcuMyAxNi4xLS4yIDM1LjEgMTUuOSA0Mi40czM1LjEgLjIgNDIuNC0xNS45bDIwLjYtNDUuMiAyMjAuNiAwIDIwLjYgNDUuMmM3LjMgMTYuMSAyNi4zIDIzLjIgNDIuNCAxNS45czIzLjItMjYuMyAxNS45LTQyLjRMMzQwLjEgMTY1LjJ6TTM3Ni41IDQwMGwtMTc3IDAgMjEuOC00OCAxMzMuMyAwIDIxLjggNDh6TTI4OCAyMDUuM2w0NC44IDk4LjctODkuNyAwIDQ0LjgtOTguN3pNMTYzLjMgNzMuNmM1LjMtMTIuMS0uMi0yNi4zLTEyLjQtMzEuNnMtMjYuMyAuMi0zMS42IDEyLjRDMTA5LjUgNzcgMTA0IDEwMS45IDEwNCAxMjhzNS41IDUxIDE1LjMgNzMuNmM1LjMgMTIuMSAxOS41IDE3LjcgMzEuNiAxMi40czE3LjctMTkuNSAxMi40LTMxLjZDMTU2IDE2NS44IDE1MiAxNDcuNCAxNTIgMTI4czQtMzcuOCAxMS4zLTU0LjR6TTQ1Ni43IDU0LjRjLTUuMy0xMi4xLTE5LjUtMTcuNy0zMS42LTEyLjRzLTE3LjcgMTkuNS0xMi40IDMxLjZDNDIwIDkwLjIgNDI0IDEwOC42IDQyNCAxMjhzLTQgMzcuOC0xMS4zIDU0LjRjLTUuMyAxMi4xIC4yIDI2LjMgMTIuNCAzMS42czI2LjMtLjIgMzEuNi0xMi40QzQ2Ni41IDE3OSA0NzIgMTU0LjEgNDcyIDEyOHMtNS41LTUxLTE1LjMtNzMuNnoiXQogICAgfTsKICAgIGZhQ29sb25TaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvbG9uLXNpZ24iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZTE0MCIsICJNMjEzLjggOC43YzEyLjkgMy4yIDIwLjcgMTYuMiAxNy41IDI5LjFsLTQuNiAxOC41YzE1LjQgLjggMzAuNCAzLjQgNDQuNyA3LjVsOS40LTM3LjZDMjgzLjkgMTMuMyAyOTcgNS41IDMwOS44IDguN1MzMzAuNSAyNSAzMjcuMyAzNy44TDMxNiA4Mi44YzEzLjUgNy44IDI2IDE3LjEgMzcuMiAyNy44IDEyLjkgMTIuMSAxMy40IDMyLjQgMS4zIDQ1LjJzLTMyLjQgMTMuNC00NS4yIDEuM2MtMy4xLTIuOS02LjQtNS44LTkuOC04LjRMMjM5LjIgMzkwYzI2LjktNC42IDUxLjEtMTcuMSA3MC4xLTM1LjEgMTIuOS0xMi4xIDMzLjEtMTEuNSA0NS4yIDEuM3MxMS41IDMzLjEtMS4zIDQ1LjJjLTM0LjMgMzIuMy04MCA1Mi44LTEzMC41IDU0LjRsLTcuNSAyOS45Yy0zLjIgMTIuOS0xNi4yIDIwLjctMjkuMSAxNy41cy0yMC43LTE2LjItMTcuNS0yOS4xbDUuNi0yMi41Yy0xNS0zLjItMjkuNC04LTQyLjktMTQuNGwtMTIuMSA0OC41Yy0zLjIgMTIuOS0xNi4yIDIwLjctMjkuMSAxNy41UzY5LjUgNDg3IDcyLjcgNDc0LjJsMTYtNjMuOUM0NC4zIDM3My42IDE2IDMxOC4xIDE2IDI1NiAxNiAxNTkuMiA4NC44IDc4LjQgMTc2LjMgNjBsOC40LTMzLjhDMTg3LjkgMTMuMyAyMDEgNS41IDIxMy44IDguN3pNMTU4IDEzMi45Yy00Ni4xIDIxLjgtNzggNjguNy03OCAxMjMuMSAwIDMwLjUgMTAgNTguNiAyNi45IDgxLjNMMTU4IDEzMi45ek0xNDcuNCAzNzMuNGMxMyA3LjYgMjcuMyAxMy4xIDQyLjUgMTYuMWw2NS45LTI2My42Yy0xMi42LTMuOC0yNS45LTUuOS0zOS44LTUuOS0xLjggMC0zLjUgMC01LjMgLjFMMTQ3LjQgMzczLjR6Il0KICAgIH07CiAgICBmYUxhcHRvcEZpbGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGFwdG9wLWZpbGUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUxZCIsICJNNjQgNjRDNjQgMjguNyA5Mi43IDAgMTI4IDBMNDE2IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCA0OC02NCAwIDAtNDgtMjg4IDAgMCAxOTIgMTEyIDAgMCA5Ni0xNjMuMiAwQzM0LjQgMzUyIDAgMzE3LjYgMCAyNzUuMiAwIDI2NC42IDguNiAyNTYgMTkuMiAyNTZMNjQgMjU2IDY0IDY0ek01MjkuOSAyNTcuOWM5IDkgMTQuMSAyMS4yIDE0LjEgMzMuOUw1NDQgNDY0YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xNjAgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC0yNTZjMC0yNi41IDIxLjUtNDggNDgtNDhsNzYuMSAwYzEyLjcgMCAyNC45IDUuMSAzMy45IDE0LjEgMjAgMjAgNDcuOSA0Ny45IDgzLjkgODMuOXpNNDE2IDI3MmMwIDguOCA3LjIgMTYgMTYgMTZsNjAuMSAwLTc2LjEtNzYuMSAwIDYwLjF6Il0KICAgIH07CiAgICBmYUJhaGFpID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhaGFpIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImhheWthbCJdLCAiZjY2NiIsICJNMjg4LjQtOGMxMy4yIDAgMjUgOC4xIDI5LjggMjAuNGwzMS45IDgyIDc3LjItNDIuM2MxMS42LTYuMyAyNS44LTQuOSAzNS45IDMuNXMxNCAyMi4zIDkuNyAzNC44bC0yOC4yIDgzLjMgODYuMyAxNy4yYzEyLjkgMi42IDIzIDEyLjggMjUuMyAyNS44cy0zLjYgMjYuMS0xNC45IDMyLjlsLTc1LjIgNDUuNyA1NSA2OC42YzguMyAxMC4zIDkuMyAyNC42IDIuNyAzNnMtMTkuNSAxNy42LTMyLjYgMTUuNmwtODctMTMuMy0yIDg4Yy0uMyAxMy4yLTguNiAyNC44LTIxIDI5LjRzLTI2LjMgMS0zNS05bC01OC02Ni4xLTU4IDY2LjFjLTguNyA5LjktMjIuNiAxMy41LTM1IDlzLTIwLjgtMTYuMi0yMS0yOS40bC0yLTg4LTg3IDEzLjNjLTEzIDItMjYtNC4yLTMyLjYtMTUuNnMtNS41LTI1LjcgMi43LTM2bDU1LTY4LjYtNzUuMi00NS43Yy0xMS4zLTYuOC0xNy4yLTE5LjktMTQuOS0zMi45czEyLjMtMjMuMiAyNS4zLTI1LjhsODYuMy0xNy4yLTI4LjItODMuM2MtNC4yLTEyLjUtLjQtMjYuMyA5LjctMzQuOHMyNC40LTkuOSAzNS45LTMuNWw3Ny4xIDQyLjMgMzEuOS04MkMyNjMuMyAuMSAyNzUuMi04IDI4OC40LTh6bTAgMTIwLjJMMjczIDE1MS42Yy0zLjMgOC42LTEwLjIgMTUuMy0xOC45IDE4LjVzLTE4LjIgMi40LTI2LjMtMmwtMzctMjAuMyAxMy42IDQwYzMgOC43IDIgMTguMy0yLjYgMjYuM3MtMTIuNCAxMy42LTIxLjUgMTUuNGwtNDEuNCA4LjMgMzYuMSAyMS45YzcuOSA0LjggMTMuMyAxMi43IDE0LjkgMjEuOHMtLjggMTguNC02LjUgMjUuNmwtMjYuNCAzMyA0MS44LTYuNGM5LjEtMS40IDE4LjQgMS4yIDI1LjQgNy4xczExLjIgMTQuNiAxMS40IDIzLjhsLjkgNDIuMiAyNy45LTMxLjhjNi4xLTYuOSAxNC44LTEwLjkgMjQuMS0xMC45czE4IDQgMjQuMSAxMC45bDI3LjkgMzEuOCAuOS00Mi4yYy4yLTkuMiA0LjQtMTcuOSAxMS40LTIzLjhzMTYuMy04LjUgMjUuNC03LjFsNDEuOCA2LjQtMjYuNC0zM2MtNS44LTcuMi04LjItMTYuNS02LjYtMjUuNnM3LTE3IDE0LjktMjEuOGwzNi4xLTIxLjktNDEuNC04LjNjLTktMS44LTE2LjktNy40LTIxLjUtMTUuNHMtNS41LTE3LjYtMi42LTI2LjNsMTMuNi00MC0zNyAyMC4zYy04LjEgNC40LTE3LjcgNS4yLTI2LjMgMnMtMTUuNS05LjktMTguOS0xOC41bC0xNS4zLTM5LjR6Il0KICAgIH07CiAgICBmYUhheWthbCA9IGZhQmFoYWk7CiAgICBmYU1vbmV5QmlsbDEyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vbmV5LWJpbGwtMSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJtb25leS1iaWxsLWFsdCJdLCAiZjNkMSIsICJNNjQgNjRDMjguNyA2NCAwIDkyLjcgMCAxMjhMMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgNjR6bTE5MiA4MGExMTIgMTEyIDAgMSAxIDAgMjI0IDExMiAxMTIgMCAxIDEgMC0yMjR6TTY0IDE4NGwwLTQ4YzAtNC40IDMuNi04IDgtOGw0OCAwYzQuNCAwIDguMSAzLjYgNy41IDgtMy42IDI5LTI2LjYgNTEuOS01NS41IDU1LjUtNC40IC41LTgtMy4xLTgtNy41em0wIDE0NGMwLTQuNCAzLjYtOC4xIDgtNy41IDI5IDMuNiA1MS45IDI2LjYgNTUuNSA1NS41IC41IDQuNC0zLjEgOC03LjUgOGwtNDggMGMtNC40IDAtOC0zLjYtOC04bDAtNDh6TTQ0MCAxOTEuNWMtMjktMy42LTUxLjktMjYuNi01NS41LTU1LjUtLjUtNC40IDMuMS04IDcuNS04bDQ4IDBjNC40IDAgOCAzLjYgOCA4bDAgNDhjMCA0LjQtMy42IDguMS04IDcuNXpNNDQ4IDMyOGwwIDQ4YzAgNC40LTMuNiA4LTggOGwtNDggMGMtNC40IDAtOC4xLTMuNi03LjUtOCAzLjYtMjkgMjYuNi01MS45IDU1LjUtNTUuNSA0LjQtLjUgOCAzLjEgOCA3LjV6TTI0MCAxODhjLTExIDAtMjAgOS0yMCAyMCAwIDkuNyA2LjkgMTcuNyAxNiAxOS42bDAgNDguNC00IDBjLTExIDAtMjAgOS0yMCAyMHM5IDIwIDIwIDIwbDQ4IDBjMTEgMCAyMC05IDIwLTIwcy05LTIwLTIwLTIwbC00IDAgMC02OGMwLTExLTktMjAtMjAtMjBsLTE2IDB6Il0KICAgIH07CiAgICBmYU1vbmV5QmlsbEFsdDIgPSBmYU1vbmV5QmlsbDEyOwogICAgZmFDbG91ZEJvbHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2xvdWQtYm9sdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyNzc4NSwgInRodW5kZXJzdG9ybSJdLCAiZjc2YyIsICJNMCAyMjRjMCA1MyA0MyA5NiA5NiA5NmwzOC42IDAgMTI0LjEtMTExYzEyLjItMTAuOSAyOC0xNyA0NC40LTE3IDQ0LjYgMCA3Ni41IDQzIDYzLjcgODUuN0wzNTQuMSAzMjAgNDE2IDMyMGM1MyAwIDk2LTQzIDk2LTk2cy00My05Ni05Ni05NmMtLjUgMC0xLjEgMC0xLjYgMCAxLjEtNS4yIDEuNi0xMC41IDEuNi0xNiAwLTQ0LjItMzUuOC04MC04MC04MC0yNC4zIDAtNDYuMSAxMC45LTYwLjggMjgtMTguNy0zNS43LTU2LjEtNjAtOTkuMi02MC02MS45IDAtMTEyIDUwLjEtMTEyIDExMiAwIDcuMSAuNyAxNC4xIDEuOSAyMC44LTM4LjMgMTIuNi02NS45IDQ4LjctNjUuOSA5MS4yek0xNjAuNiA0MDBsNjEuOCAwLTMxLjIgMTA0LjFjLTMuNiAxMS45IDUuMyAyMy45IDE3LjggMjMuOSA0LjYgMCA5LTEuNyAxMi40LTQuN0wzNjIuNSAzOTYuOWMzLjUtMy4xIDUuNS03LjYgNS41LTEyLjQgMC05LjItNy40LTE2LjYtMTYuNi0xNi42bC02MS44IDAgMzEuMi0xMDQuMWMzLjYtMTEuOS01LjMtMjMuOS0xNy44LTIzLjktNC42IDAtOSAxLjctMTIuNCA0LjdMMTQ5LjUgMzcxLjFjLTMuNSAzLjEtNS41IDcuNi01LjUgMTIuNCAwIDkuMiA3LjQgMTYuNiAxNi42IDE2LjZ6Il0KICAgIH07CiAgICBmYVRodW5kZXJzdG9ybSA9IGZhQ2xvdWRCb2x0OwogICAgZmFFdGhlcm5ldCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJldGhlcm5ldCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNzk2IiwgIk0wIDIyNEwwIDQxNmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMiAwIDAtMTA0YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCAxMDQgNjQgMCAwLTEwNGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgMTA0IDY0IDAgMC0xMDRjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDEwNCA2NCAwIDAtMTA0YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCAxMDQgMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTE5MmMwLTE3LjctMTQuMy0zMi0zMi0zMmwtMzIgMCAwLTMyYzAtMTcuNy0xNC4zLTMyLTMyLTMybC0zMiAwIDAtMzJjMC0xNy43LTE0LjMtMzItMzItMzJMMTYwIDY0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDMyLTMyIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgMzItMzIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6Il0KICAgIH07CiAgICBmYUhyeXZuaWFTaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhyeXZuaWEtc2lnbiIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzgzNzIsICJocnl2bmlhIl0sICJmNmYyIiwgIk0zMzYgMTQ5LjRDMzM2IDc3IDI2OC41IDIzLjUgMTk4IDQwLjFMOTMuMiA2NC45Qzc2IDY4LjkgNjUuNCA4Ni4yIDY5LjQgMTAzLjRzMjEuMyAyNy45IDM4LjUgMjMuOGwxMDQuOC0yNC43YzMwLjMtNy4xIDU5LjMgMTUuOCA1OS4zIDQ2LjkgMCAxNy42LTkuNiAzMy44LTI1IDQyLjNsLS43IC40LTIyMi4zIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMzM2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTMyLjQgMGM1LjUtMTMuMyA4LjQtMjcuOCA4LjQtNDIuNnpNMzYwIDI3MkwyNCAyNzJjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMzMuMyAwYy02LjEgMTMuNC05LjMgMjguMS05LjMgNDMuMyAwIDY0LjEgNTYuOSAxMTMuNCAxMjAuNCAxMDQuMmwxMzcuOS0xOS45YzE3LjUtMi41IDI5LjYtMTguNyAyNy4xLTM2LjJzLTE4LjgtMjkuNi0zNi4yLTI3LjFMMTU5LjIgNDA0LjJjLTI0LjkgMy42LTQ3LjItMTUuNy00Ny4yLTQwLjkgMC0xNS4xIDguMi0yOC45IDIxLjQtMzYuMmwxMy03LjEgMjEzLjYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNHoiXQogICAgfTsKICAgIGZhSHJ5dm5pYSA9IGZhSHJ5dm5pYVNpZ247CiAgICBmYUV5ZVNsYXNoMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJleWUtc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjA3MCIsICJNNDEtMjQuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTLTIuMy0uMyA3IDkuMWw1MjggNTI4YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtOTYuNC05Ni40YzIuNy0yLjQgNS40LTQuOCA4LTcuMiA0Ni44LTQzLjUgNzguMS05NS40IDkzLTEzMS4xIDMuMy03LjkgMy4zLTE2LjcgMC0yNC42LTE0LjktMzUuNy00Ni4yLTg3LjctOTMtMTMxLjEtNDcuMS00My43LTExMS44LTgwLjYtMTkyLjYtODAuNi01Ni44IDAtMTA1LjYgMTguMi0xNDYgNDQuMkw0MS0yNC45ek0yMDQuNSAxMzguN2MyMy41LTE2LjggNTIuNC0yNi43IDgzLjUtMjYuNyA3OS41IDAgMTQ0IDY0LjUgMTQ0IDE0NCAwIDMxLjEtOS45IDU5LjktMjYuNyA4My41bC0zNC43LTM0LjdjMTIuNy0yMS40IDE3LTQ3LjcgMTAuMS03My43LTEzLjctNTEuMi02Ni40LTgxLjYtMTE3LjYtNjcuOS04LjYgMi4zLTE2LjcgNS43LTI0IDEwbC0zNC43LTM0Ljd6TTMyNS4zIDM5NS4xYy0xMS45IDMuMi0yNC40IDQuOS0zNy4zIDQuOS03OS41IDAtMTQ0LTY0LjUtMTQ0LTE0NCAwLTEyLjkgMS43LTI1LjQgNC45LTM3LjNMNjkuNCAxMzkuMmMtMzIuNiAzNi44LTU1IDc1LjgtNjYuOSAxMDQuNS0zLjMgNy45LTMuMyAxNi43IDAgMjQuNiAxNC45IDM1LjcgNDYuMiA4Ny43IDkzIDEzMS4xIDQ3LjEgNDMuNyAxMTEuOCA4MC42IDE5Mi42IDgwLjYgMzcuMyAwIDcxLjItNy45IDEwMS41LTIwLjZsLTY0LjItNjQuMnoiXQogICAgfTsKICAgIGZhQ2FydEZsYXRiZWRTdWl0Y2FzZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYXJ0LWZsYXRiZWQtc3VpdGNhc2UiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsibHVnZ2FnZS1jYXJ0Il0sICJmNTlkIiwgIk0wIDMyQzAgMTQuMyAxNC4zIDAgMzIgMEw0OCAwYzQ0LjIgMCA4MCAzNS44IDgwIDgwbDAgMjg4YzAgOC44IDcuMiAxNiAxNiAxNmw0MDAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzQuNyAwYzEuOCA1IDIuNyAxMC40IDIuNyAxNiAwIDI2LjUtMjEuNSA0OC00OCA0OHMtNDgtMjEuNS00OC00OGMwLTUuNiAxLTExIDIuNy0xNmwtMTk3LjUgMGMxLjggNSAyLjcgMTAuNCAyLjcgMTYgMCAyNi41LTIxLjUgNDgtNDggNDhzLTQ4LTIxLjUtNDgtNDhjMC02IDEuMS0xMS43IDMuMS0xNy0zOC4xLTYuMi02Ny4xLTM5LjItNjcuMS03OUw2NCA4MGMwLTguOC03LjItMTYtMTYtMTZMMzIgNjRDMTQuMyA2NCAwIDQ5LjcgMCAzMnpNMTc2IDE0NGMwLTI2LjUgMjEuNS00OCA0OC00OGwzMiAwIDAtMjRjMC0zMC45IDI1LjEtNTYgNTYtNTZsNjQgMGMzMC45IDAgNTYgMjUuMSA1NiA1NmwwIDI0IDMyIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAxNDRjMCAyNi41LTIxLjUgNDgtNDggNDhsLTI0MCAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTE0NHpNMzg0IDk2bDAtMjRjMC00LjQtMy42LTgtOC04bC02NCAwYy00LjQgMC04IDMuNi04IDhsMCAyNCA4MCAweiJdCiAgICB9OwogICAgZmFMdWdnYWdlQ2FydCA9IGZhQ2FydEZsYXRiZWRTdWl0Y2FzZTsKICAgIGZhUmFkaWF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJhZGlhdGlvbiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmN2I5IiwgIk00NDYuMiAzNC41Yy0xNC4yLTEwLjEtMzMuNS00LjYtNDIuMiAxMC41TDMzMS42IDE3MC4zYzMxLjMgMTUuOCA1Mi44IDQ4LjMgNTIuOCA4NS43bDE0NCAwYzE3LjcgMCAzMi4yLTE0LjQgMzAuMS0zMS45LTkuMS03OC4xLTUxLjQtMTQ2LjEtMTEyLjMtMTg5LjZ6TTE3Mi43IDQ0LjlDMTY0IDI5LjggMTQ0LjcgMjQuMyAxMzAuNSAzNC41IDY5LjYgNzcuOSAyNy4zIDE0NS45IDE4LjIgMjI0LjEgMTYuMSAyNDEuNiAzMC43IDI1NiA0OC4zIDI1NmwxNDQgMGMwLTM3LjUgMjEuNS02OS45IDUyLjgtODUuN0wxNzIuNyA0NC45em0tOS40IDQxNi44Yy04LjcgMTUuMS0zLjggMzQuNSAxMiA0MS44IDM0LjQgMTUuNyA3Mi43IDI0LjUgMTEzIDI0LjVzNzguNi04LjggMTEzLTI0LjVjMTUuOC03LjIgMjAuNy0yNi43IDEyLTQxLjhMMzQxIDMzNi4zYy0xNS4xIDkuOS0zMy4yIDE1LjctNTIuNiAxNS43cy0zNy41LTUuOC01Mi42LTE1LjdMMTYzLjMgNDYxLjd6TTI4OC4zIDMwNGE0OCA0OCAwIDEgMCAtLjctOTYgNDggNDggMCAxIDAgLjcgOTZ6Il0KICAgIH07CiAgICBmYUZpbGVXb3JkMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLXdvcmQiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjFjMiIsICJNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMMjEzLjUgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN0wzNjUuMyAxMjUuM2MxMiAxMiAxOC43IDI4LjMgMTguNyA0NS4zTDM4NCA0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDY0em0yMDgtNS41bDAgOTMuNWMwIDEzLjMgMTAuNyAyNCAyNCAyNEwzMjUuNSAxNzYgMjA4IDU4LjV6TTEzNS40IDI3NC44Yy0yLjktMTIuOS0xNS43LTIxLjEtMjguNi0xOC4ycy0yMS4xIDE1LjctMTguMiAyOC42bDMyIDE0NGMyLjMgMTAuNSAxMS40IDE4LjIgMjIuMiAxOC44czIwLjYtNi4xIDI0LTE2LjRsMjUuMi03NS43IDI1LjIgNzUuN2MzLjQgMTAuMiAxMy4yIDE2LjkgMjQgMTYuNHMxOS45LTguMiAyMi4yLTE4LjhsMzItMTQ0YzIuOS0xMi45LTUuMy0yNS44LTE4LjItMjguNnMtMjUuOCA1LjMtMjguNiAxOC4ybC0xMy4yIDU5LjQtMjAuNi02MS44Yy0zLjMtOS44LTEyLjQtMTYuNC0yMi44LTE2LjRzLTE5LjUgNi42LTIyLjggMTYuNGwtMjAuNiA2MS44LTEzLjItNTkuNHoiXQogICAgfTsKICAgIGZhQmVkUHVsc2UgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmVkLXB1bHNlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbInByb2NlZHVyZXMiXSwgImY0ODciLCAiTTUzMS4yLTIyLjRMNTcyIDMyIDYxNiAzMmMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNTYgMGMtNy42IDAtMTQuNy0zLjYtMTkuMi05LjZsLTI0LjEtMzIuMS00NyA5OS45Yy0zLjcgNy44LTExLjMgMTMuMS0xOS45IDEzLjdzLTE2LjktMy40LTIxLjctMTAuNkwzODcuMiA4MCAzNDQgODBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsNTYgMGM4IDAgMTUuNSA0IDIwIDEwLjdsMjQuNCAzNi42IDQ1LjktOTcuNWMzLjYtNy42IDEwLjktMTIuOCAxOS4zLTEzLjdzMTYuNiAyLjcgMjEuNiA5LjV6TTMyMCAxNjBjMC0xNy43IDE0LjMtMzIgMzItMzJsOS41IDAgMjYuNiAzOS45YzE0LjQgMjEuNiAzOS4zIDMzLjggNjUuMiAzMS45czQ4LjgtMTcuNiA1OS44LTQxLjFMNTI3IDEyOS4yYzQ1LjkgNy4yIDgxIDQ2LjkgODEgOTQuOGwwIDIyNGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY0LTQ0OCAwIDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJMMzIgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJTOTYgNDYuMyA5NiA2NGwwIDIyNCAyMjQgMCAwLTEyOHpNMTQ0IDE5MmE2NCA2NCAwIDEgMSAxMjggMCA2NCA2NCAwIDEgMSAtMTI4IDB6Il0KICAgIH07CiAgICBmYVByb2NlZHVyZXMgPSBmYUJlZFB1bHNlOwogICAgZmFUZW50cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0ZW50cyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTgyIiwgIk01MzkuOSAzNTJsLTk1LjYgMC04LjQtNjYuMWMtMi45LTIzLjItMTUuOS00My45LTM1LjQtNTYuOEwyNTIuMiAxMzEuNWMtMTgtMTEuOS0zOS43LTE1LjctNjAuMS0xMS41IDIuNS00LjMgNS45LTcuOSAxMC4xLTEwLjdMMzUwLjYgMTEuNmMxMC43LTcgMjQuNS03IDM1LjIgMGwxNDguNCA5Ny43YzcuOCA1LjEgMTMgMTMuNCAxNC4yIDIyLjdsMjMuMyAxODRjMi40IDE5LjEtMTIuNSAzNi0zMS43IDM2ek00LjggNDc2bDIzLjMtMTg0YzEuMi05LjMgNi4zLTE3LjYgMTQuMi0yMi43bDE0OC40LTk3LjdjMTAuNy03IDI0LjUtNyAzNS4yIDBsMTQ4LjQgOTcuN2M3LjggNS4xIDEzIDEzLjQgMTQuMiAyMi43bDIzLjMgMTg0YzIuNCAxOS4xLTEyLjUgMzYtMzEuNyAzNmwtNDkuNyAwYy0xMS4yIDAtMjEuNS01LjgtMjcuMy0xNS40bC03Ny0xMjYuN2MtMS43LTIuOC00LjgtNC42LTguMS00LjYtNS4zIDAtOS41IDQuMy05LjUgOS41bDAgMTA1LjJjMCAxNy43LTE0LjMgMzItMzIgMzJMMzYuNSA1MTJjLTE5LjMgMC0zNC4yLTE2LjktMzEuNy0zNnoiXQogICAgfTsKICAgIGZhTXVnSG90ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm11Zy1ob3QiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFs5NzQ5XSwgImY3YjYiLCAiTTE1Mi0xNmMtMTMuMyAwLTI0IDEwLjctMjQgMjQgMCAzOC45IDIzLjQgNTkuNCAzOS4xIDczLjFsMS4xIDFjMTYuMyAxNC4zIDIzLjggMjEuOCAyMy44IDM3LjkgMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGMwLTM4LjktMjMuNC01OS40LTM5LjEtNzMuMWwtMS4xLTFDMTgzLjUgMzEuNyAxNzYgMjQuMSAxNzYgOCAxNzYtNS4zIDE2NS4zLTE2IDE1Mi0xNnpNOTYgMTkyYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDE5MmMwIDUzIDQzIDk2IDk2IDk2bDE5MiAwYzQxLjggMCA3Ny40LTI2LjcgOTAuNS02NGw1LjUgMGM3MC43IDAgMTI4LTU3LjMgMTI4LTEyOFM1MTguNyAxOTIgNDQ4IDE5Mkw5NiAxOTJ6TTQ0OCAzODRsMC0xMjhjMzUuMyAwIDY0IDI4LjcgNjQgNjRzLTI4LjcgNjQtNjQgNjR6TTI4OCA4YzAtMTMuMy0xMC43LTI0LTI0LTI0UzI0MC01LjMgMjQwIDhjMCAzOC45IDIzLjQgNTkuNCAzOS4xIDczLjFsMS4xIDFjMTYuMyAxNC4zIDIzLjggMjEuOCAyMy44IDM3LjkgMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGMwLTM4LjktMjMuNC01OS40LTM5LjEtNzMuMWwtMS4xLTFDMjk1LjUgMzEuNyAyODggMjQuMSAyODggOHoiXQogICAgfTsKICAgIGZhQm9sdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib2x0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbOTg4OSwgInphcCJdLCAiZjBlNyIsICJNMzM4LjgtOS45YzExLjkgOC42IDE2LjMgMjQuMiAxMC45IDM3LjhMMjcxLjMgMjI0IDQxNiAyMjRjMTMuNSAwIDI1LjUgOC40IDMwLjEgMjEuMXMuNyAyNi45LTkuNiAzNS41bC0yODggMjQwYy0xMS4zIDkuNC0yNy40IDkuOS0zOS4zIDEuM3MtMTYuMy0yNC4yLTEwLjktMzcuOEwxNzYuNyAyODggMzIgMjg4Yy0xMy41IDAtMjUuNS04LjQtMzAuMS0yMS4xcy0uNy0yNi45IDkuNi0zNS41bDI4OC0yNDBjMTEuMy05LjQgMjcuNC05LjkgMzkuMy0xLjN6Il0KICAgIH07CiAgICBmYVphcCA9IGZhQm9sdDsKICAgIGZhSmFyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImphciIsCiAgICAgIGljb246IFszMjAsIDUxMiwgW10sICJlNTE2IiwgIk0zMi04YzAtMTMuMyAxMC43LTI0IDI0LTI0bDIwOCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0TDU2IDE2QzQyLjcgMTYgMzIgNS4zIDMyLTh6TTAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDE5MiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjh6bTk2IDY0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDEyOGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxMjggMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTEyOGMwLTE3LjctMTQuMy0zMi0zMi0zMkw5NiAxOTJ6Il0KICAgIH07CiAgICBmYVRydWNrUGxhbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHJ1Y2stcGxhbmUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU4ZiIsICJNMTQ0IDQ4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4czQ4IDIxLjUgNDggNDhsMCAzMjBjMCAzMi41IDEyLjEgNjIuMSAzMiA4NC43bDAgMjcuM2MwIDcuMSAuOSAxNC4xIDIuNyAyMC43TDE5MiA0ODAgODMuOSA1MDdDNzMuOCA1MDkuNiA2NCA1MDEuOSA2NCA0OTEuNWwwLTE5LjhjMC00LjkgMi4yLTkuNSA2LTEyLjVsNzQtNTkuMiAwLTU3LjYtMTIyLjEgNDguOEMxMS40IDM5NS40IDAgMzg3LjcgMCAzNzYuNGwwLTQ0YzAtOCAzLTE1LjYgOC4zLTIxLjVMMTQ0IDE2MS42IDE0NCA0OHptMjI0IDgwbDE5MiAwYzQ0LjIgMCA4MCAzNS44IDgwIDgwbDAgMTYwYzAgMjYuMi0xMi42IDQ5LjQtMzIgNjRsMCA0OGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTMyLTE2MCAwIDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC00OGMtMTkuNC0xNC42LTMyLTM3LjgtMzItNjRsMC0xNjBjMC00NC4yIDM1LjgtODAgODAtODB6bTAgMTc2bDE5MiAwIDAtMzJjMC0xNy43LTE0LjMtMzItMzItMzJsLTEyOCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDMyem0wIDg4YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHptMjE2LTI0YTI0IDI0IDAgMSAwIC00OCAwIDI0IDI0IDAgMSAwIDQ4IDB6Il0KICAgIH07CiAgICBmYUhhbmRIb2xkaW5nSGVhcnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1ob2xkaW5nLWhlYXJ0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY0YmUiLCAiTTI3OS42IDMxQzI2NS41IDExLjUgMjQyLjkgMCAyMTguOSAwIDE3Ny41IDAgMTQ0IDMzLjUgMTQ0IDc0LjlsMCAyLjRjMCA2NC40IDgyIDEzMy40IDEyMi4yIDE2My4zIDEzIDkuNyAzMC41IDkuNyA0My41IDAgNDAuMi0zMCAxMjIuMi05OC45IDEyMi4yLTE2My4zbDAtMi40YzAtNDEuNC0zMy41LTc0LjktNzQuOS03NC45LTI0IDAtNDYuNiAxMS41LTYwLjcgMzFMMjg4IDQyLjcgMjc5LjYgMzF6TTEwOS4zIDM0MS41TDY2LjcgMzg0IDMyIDM4NGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMjAuNSAwYzI5IDAgNTcuMy05LjMgODAuNy0yNi41bDEyNi42LTkzLjNjMTcuOC0xMy4xIDIxLjYtMzguMSA4LjUtNTUuOXMtMzguMS0yMS42LTU1LjktOC41TDM5Mi42IDQxNiAyODAgNDE2Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDcyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTE1Mi4yIDBjLTMzLjkgMC02Ni41IDEzLjUtOTAuNSAzNy41eiJdCiAgICB9OwogICAgZmFBcnJvd1JvdGF0ZUxlZnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctcm90YXRlLWxlZnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs4NjM0LCAiYXJyb3ctbGVmdC1yb3RhdGUiLCAiYXJyb3ctcm90YXRlLWJhY2siLCAiYXJyb3ctcm90YXRlLWJhY2t3YXJkIiwgInVuZG8iXSwgImYwZTIiLCAiTTI1NiA2NGMtNTYuOCAwLTEwNy45IDI0LjctMTQzLjEgNjRsNDcuMSAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDE5MmMtMTcuNyAwLTMyLTE0LjMtMzItMzJMMCAzMkMwIDE0LjMgMTQuMyAwIDMyIDBTNjQgMTQuMyA2NCAzMmwwIDU0LjdDMTEwLjkgMzMuNiAxNzkuNSAwIDI1NiAwIDM5Ny40IDAgNTEyIDExNC42IDUxMiAyNTZTMzk3LjQgNTEyIDI1NiA1MTJjLTg3IDAtMTYzLjktNDMuNC0yMTAuMS0xMDkuNy0xMC4xLTE0LjUtNi42LTM0LjQgNy45LTQ0LjZzMzQuNC02LjYgNDQuNiA3LjljMzQuOCA0OS44IDkyLjQgODIuMyAxNTcuNiA4Mi4zIDEwNiAwIDE5Mi04NiAxOTItMTkyUzM2MiA2NCAyNTYgNjR6Il0KICAgIH07CiAgICBmYUFycm93TGVmdFJvdGF0ZSA9IGZhQXJyb3dSb3RhdGVMZWZ0OwogICAgZmFBcnJvd1JvdGF0ZUJhY2sgPSBmYUFycm93Um90YXRlTGVmdDsKICAgIGZhQXJyb3dSb3RhdGVCYWNrd2FyZCA9IGZhQXJyb3dSb3RhdGVMZWZ0OwogICAgZmFVbmRvID0gZmFBcnJvd1JvdGF0ZUxlZnQ7CiAgICBmYUZhY2VBbmdyeTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1hbmdyeSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU0NCwgImFuZ3J5Il0sICJmNTU2IiwgIk0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwek0yNTYgMzY4YzI0LjEgMCA0NS40IDExLjggNTguNSAzMCA3LjcgMTAuOCAyMi43IDEzLjIgMzMuNSA1LjVzMTMuMi0yMi43IDUuNS0zMy41Yy0yMS43LTMwLjItNTcuMy01MC05Ny41LTUwcy03NS43IDE5LjgtOTcuNSA1MGMtNy43IDEwLjgtNS4zIDI1LjggNS41IDMzLjVzMjUuOCA1LjMgMzMuNS01LjVjMTMuMS0xOC4yIDM0LjQtMzAgNTguNS0zMHptLTgwLTk2YzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtLjMgOS43IDMuMmMxMC41IDMuNSAyMS44LTIuMiAyNS4zLTEyLjZzLTIuMi0yMS44LTEyLjYtMjUuM2wtOTYtMzJjLTEwLjUtMy41LTIxLjggMi4yLTI1LjMgMTIuNnMyLjIgMjEuOCAxMi42IDI1LjNsMjguOSA5LjZjLTQuMSA1LjQtNi42IDEyLjEtNi42IDE5LjQgMCAxNy43IDE0LjMgMzIgMzIgMzJ6bTE5Mi0zMmMwLTcuMy0yLjQtMTQtNi42LTE5LjRsMjguOS05LjZjMTAuNS0zLjUgMTYuMS0xNC44IDEyLjYtMjUuM3MtMTQuOC0xNi4xLTI1LjMtMTIuNmwtOTYgMzJjLTEwLjUgMy41LTE2LjEgMTQuOC0xMi42IDI1LjNzMTQuOCAxNi4xIDI1LjMgMTIuNmw5LjctMy4yIDAgLjNjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMnoiXQogICAgfTsKICAgIGZhQW5ncnkyID0gZmFGYWNlQW5ncnkyOwogICAgZmFCdXJzdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJidXJzdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNGRjIiwgIk0zNy42IDQuMkMyOC0yLjMgMTUuMi0xLjEgNyA3Uy0yLjMgMjggNC4yIDM3LjZsMTEyIDE2My4zLTk5LjYgMzIuM0M2LjcgMjM2LjQgMCAyNDUuNiAwIDI1NnM2LjcgMTkuNiAxNi42IDIyLjhsMTAzLjEgMzMuNC01Mi45IDEwMC42Yy00LjkgOS4zLTMuMiAyMC43IDQuMyAyOC4xczE4LjggOS4yIDI4LjEgNC4zbDEwMC42LTUyLjkgMzMuNCAxMDMuMWMzLjIgOS45IDEyLjQgMTYuNiAyMi44IDE2LjZzMTkuNi02LjcgMjIuOC0xNi42bDMzLjQtMTAzLjEgMTAwLjYgNTIuOWM5LjMgNC45IDIwLjcgMy4yIDI4LjEtNC4zczkuMi0xOC44IDQuMy0yOC4xbC01Mi45LTEwMC42IDEwMy4xLTMzLjRjOS45LTMuMiAxNi42LTEyLjQgMTYuNi0yMi44cy02LjctMTkuNi0xNi42LTIyLjhsLTEwNi41LTM0LjUgMjUuNy03MC40YzMuMi04LjggMS0xOC42LTUuNi0yNS4ycy0xNi40LTguOC0yNS4yLTUuNmwtNzAuNCAyNS43LTM0LjUtMTA2LjVDMjc1LjYgNi43IDI2Ni40IDAgMjU2IDBzLTE5LjYgNi43LTIyLjggMTYuNkwyMDAuOSAxMTYuMiAzNy42IDQuMnoiXQogICAgfTsKICAgIGZhWiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ6IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTIyXSwgIjVhIiwgIk0wIDY0QzAgNDYuMyAxNC4zIDMyIDMyIDMybDMyMCAwYzEyLjQgMCAyMy43IDcuMiAyOSAxOC40czMuNiAyNC41LTQuNCAzNC4xTDEwMC4zIDQxNiAzNTIgNDE2YzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDQ4MGMtMTIuNCAwLTIzLjctNy4yLTI5LTE4LjRzLTMuNi0yNC41IDQuNC0zNC4xTDI4My43IDk2IDMyIDk2QzE0LjMgOTYgMCA4MS43IDAgNjR6Il0KICAgIH07CiAgICBmYUJhbmRhZ2UgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmFuZGFnZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyOTY1NywgImJhbmQtYWlkIl0sICJmNDYyIiwgIk00NjQgNDE2bDQ4IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xOTJjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTQ4IDAgMCAzMjB6TTQxNiA5NmwtMjU2IDAgMCAzMjAgMjU2IDAgMC0zMjB6TTY0IDk2QzI4LjcgOTYgMCAxMjQuNyAwIDE2MEwwIDM1MmMwIDM1LjMgMjguNyA2NCA2NCA2NGw0OCAwIDAtMzIwLTQ4IDB6TTIxNiAyMDhhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHptMTIwLTI0YTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHpNMjE2IDMwNGEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwem0xMjAtMjRhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4eiJdCiAgICB9OwogICAgZmFCYW5kQWlkID0gZmFCYW5kYWdlOwogICAgZmFQbGFuZUNpcmNsZUV4Y2xhbWF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBsYW5lLWNpcmNsZS1leGNsYW1hdGlvbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTU2IiwgIk0yMzIgMjRjMC0zMC45IDI1LjEtNTYgNTYtNTZzNTYgMjUuMSA1NiA1NmwwIDEyNy4zIDc4IDcxLjVjLTY5LjMgMjktMTE4IDk3LjQtMTE4IDE3Ny4yIDAgNDkuMyAxOC42IDk0LjMgNDkuMSAxMjguM0wyODggNTEyIDE3OS45IDUzOWMtMTAuMSAyLjUtMTkuOS01LjEtMTkuOS0xNS41bDAtMTkuOGMwLTQuOSAyLjItOS41IDYtMTIuNWw2Ni01Mi44IDAtOTkuNy0xNjIuOSA1NC4zQzU4LjcgMzk2LjQgNDggMzg4LjcgNDggMzc3LjhsMC00My43YzAtOSAzLjgtMTcuNSAxMC40LTIzLjZMMjMyIDE1MS4zIDIzMiAyNHpNNDk2IDI1NmExNDQgMTQ0IDAgMSAxIDAgMjg4IDE0NCAxNDQgMCAxIDEgMC0yODh6bTAgMjI4YTIwIDIwIDAgMSAwIDAtNDAgMjAgMjAgMCAxIDAgMCA0MHptMC0xODBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDgwYzAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZsMC04MGMwLTguOC03LjItMTYtMTYtMTZ6Il0KICAgIH07CiAgICBmYUJ1c1NpZGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnVzLXNpZGUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTgxZCIsICJNNDgwIDBjODguNCAwIDE2MCA3MS42IDE2MCAxNjBsMCAyMjRjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTUuNiAwYy0xMy4yIDM3LjMtNDguNiA2NC05MC40IDY0cy03Ny4zLTI2LjctOTAuNC02NGwtMTM5LjEgMGMtMTMuMiAzNy4zLTQ4LjcgNjQtOTAuNCA2NHMtNzcuMi0yNi43LTkwLjQtNjRMNjQgNDQ4Yy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2QzAgNDMgNDMgMCA5NiAwTDQ4MCAwek0xNjAgMzY4YTQ4IDQ4IDAgMSAwIDAgOTYgNDggNDggMCAxIDAgMC05NnptMzIwIDBhNDggNDggMCAxIDAgMCA5NiA0OCA0OCAwIDEgMCAwLTk2em0wLTMwNGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAxOTJjMCAxNy43IDE0LjMgMzIgMzIgMzJsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTEyOGMwLTUzLTQzLTk2LTk2LTk2ek0yNDggMjI0bDEwNCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtOTZjMC0xNy43LTE0LjMtMzItMzItMzJsLTEwNCAwIDAgMTYwek05NiA2NEM3OC4zIDY0IDY0IDc4LjMgNjQgOTZsMCA5NmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxMDQgMCAwLTE2MC0xMDQgMHoiXQogICAgfTsKICAgIGZhQnVncyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJidWdzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU0ZDAiLCAiTTQ0Ny41IDE3NC42YzguOC04LjQgMjIuNy04LjkgMzIuMi0uOHMxMSAyMS45IDQuMSAzMS45bC0xLjUgMS45LTIzIDI2LjdjMjYuNyAxMy41IDQ2LjMgMzkuMSA1MS40IDY5LjZsMjUuMyAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0yNCAwIDAgMzIgMjQgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMjUuMyAwYy03LjYgNDUuNC00Ny4xIDgwLTk0LjcgODBzLTg3LTM0LjYtOTQuNy04MEwyOTYgNDMyYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDI0IDAgMC0zMi0yNCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDI1LjMgMGM1LjEtMzAuNSAyNC43LTU2LjEgNTEuNC02OS42bC0yMi45LTI2LjdjLTguNi0xMC4xLTcuNS0yNS4yIDIuNi0zMy44czI1LjItNy41IDMzLjggMi42bDI5LjggMzQuOCAyOS44LTM0LjggMS43LTEuOHptLTI1Ni0xOTJjOC44LTguNCAyMi43LTguOSAzMi4yLS44czExIDIxLjkgNC4xIDMxLjlsLTEuNSAxLjktMjMgMjYuN0MyMzAgNTUuOSAyNDkuNSA4MS41IDI1NC43IDExMmwyNS4zIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTI0IDAgMCAzMiAyNCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0yNS4zIDBjLTcuNiA0NS40LTQ3LjEgODAtOTQuNyA4MHMtODctMzQuNi05NC43LTgwTDQwIDI0MGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwyNCAwIDAtMzItMjQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwyNS4zIDBDNzAuNSA4MS41IDkwIDU1LjkgMTE2LjcgNDIuNEw5My44IDE1LjZDODUuMiA1LjYgODYuMy05LjYgOTYuNC0xOC4yczI1LjItNy41IDMzLjggMi42bDI5LjggMzQuOCAyOS44LTM0LjggMS43LTEuOHoiXQogICAgfTsKICAgIGZhQmVlck11Z0VtcHR5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJlZXItbXVnLWVtcHR5IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImJlZXIiXSwgImYwZmMiLCAiTTY0IDgwYzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDI4OCAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMTYgNjQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDEwOC4yYzAgMjQuMi0xMy43IDQ2LjQtMzUuNCA1Ny4yTDQ0OCAzNzEuOCA0NDggMzg0YzAgNTMtNDMgOTYtOTYgOTZsLTE5MiAwYy01MyAwLTk2LTQzLTk2LTk2TDY0IDgwek00NDggMzAwLjJsNjQtMzIgMC0xMDguMi02NCAwIDAgMTQwLjJ6TTE5MiAxNTJjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAyMDhjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTIwOHptODggMGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDIwOGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMjA4em04OCAwYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMjA4YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0yMDh6Il0KICAgIH07CiAgICBmYUJlZXIgPSBmYUJlZXJNdWdFbXB0eTsKICAgIGZhUGVyc29uQ2lyY2xlQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLWNpcmNsZS1jaGVjayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTNlIiwgIk0yODAgMjRhNTYgNTYgMCAxIDAgLTExMiAwIDU2IDU2IDAgMSAwIDExMiAwem0yNCAyMTIuN0wzNDEgMjg2LjZjMTIuOC0xNy41IDI4LjUtMzIuNyA0Ni4zLTQ1bC01Ni4yLTc1LjdDMzA2IDEzMiAyNjYuMyAxMTIgMjI0IDExMnMtODIgMjAtMTA3LjIgNTMuOWwtNzAuNSA5NWMtMTAuNSAxNC4yLTcuNiAzNC4yIDYuNiA0NC44czM0LjIgNy42IDQ0LjgtNi42TDE0NCAyMzYuNyAxNDQgNTEyYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xNjBjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDE2MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjc1LjN6TTY0MCA0MDBhMTQ0IDE0NCAwIDEgMCAtMjg4IDAgMTQ0IDE0NCAwIDEgMCAyODggMHptLTg2LjYtNjAuOWM3LjEgNS4yIDguNyAxNS4yIDMuNSAyMi4zbC02NCA4OGMtMi44IDMuOC03IDYuMi0xMS43IDYuNXMtOS4zLTEuMy0xMi42LTQuNmwtNDAtNDBjLTYuMi02LjItNi4yLTE2LjQgMC0yMi42czE2LjQtNi4yIDIyLjYgMGwyNi44IDI2LjggNTMtNzIuOWM1LjItNy4xIDE1LjItOC43IDIyLjQtMy41eiJdCiAgICB9OwogICAgZmFTdGFwbGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN0YXBsZXIiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTVhZiIsICJNNjQwIDI5OS4zTDY0MCA0MzJjMCAyNi41LTIxLjUgNDgtNDggNDhMNjQgNDgwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDM4NCAwIDAtNDgtMzUyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTE2LjYtMzAuMi01LjRjLTE5LjYtMy41LTMzLjgtMjAuNS0zMy44LTQwLjQgMC04LjkgMi45LTE3LjUgOC4yLTI0LjZsMzUuNi00Ny41YzMyLjgtNDMuOCA4NC40LTY5LjYgMTM5LjEtNjkuNiAyNyAwIDUzLjYgNi4zIDc3LjggMTguNEw1ODYuOSAyMTMuNUM2MTkuNSAyMjkuNyA2NDAgMjYzIDY0MCAyOTkuM3pNNDQ4IDMwNGwwLTE2LTMyMC01Ny4xIDAgNzMuMSAzMjAgMHoiXQogICAgfTsKICAgIGZhSG91c2VNZWRpY2FsQ2lyY2xlQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG91c2UtbWVkaWNhbC1jaXJjbGUtY2hlY2siLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTUxMSIsICJNMzA5LjggOC42Yy0xMi4zLTExLjQtMzEuMy0xMS40LTQzLjUgMGwtMjI0IDIwOGMtOS42IDktMTIuOCAyMi45LTggMzUuMVM1MC44IDI3MiA2NCAyNzJsMTYgMCAwIDE3NmMwIDM1LjMgMjguNyA2NCA2NCA2NGwxOTYgMGMtMjEuMi0yOS41LTM0LjMtNjUuMy0zNS45LTEwNEwyNzIgNDA4Yy04LjggMC0xNi03LjItMTYtMTZsMC00MC00MCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsNDAgMCAwLTQwYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDQwIDIwIDBjMzQuOS00OC41IDkxLjctODAgMTU2LTgwIDEwLjcgMCAyMS4xIC45IDMxLjMgMi41TDMwOS44IDguNnpNNjQwIDQwMGExNDQgMTQ0IDAgMSAwIC0yODggMCAxNDQgMTQ0IDAgMSAwIDI4OCAwem0tODYuNi02MC45YzcuMSA1LjIgOC43IDE1LjIgMy41IDIyLjNsLTY0IDg4Yy0yLjggMy44LTcgNi4yLTExLjcgNi41cy05LjMtMS4zLTEyLjYtNC42bC00MC00MGMtNi4yLTYuMi02LjItMTYuNCAwLTIyLjZzMTYuNC02LjIgMjIuNiAwbDI2LjggMjYuOCA1My03Mi45YzUuMi03LjEgMTUuMi04LjcgMjIuNC0zLjV6Il0KICAgIH07CiAgICBmYU5haXJhU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJuYWlyYS1zaWduIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImUxZjYiLCAiTTEyMi42IDQ2LjNjLTcuOC0xMS43LTIyLjQtMTctMzUuOS0xMi45UzY0IDQ5LjkgNjQgNjRsMCAxOTItMzIgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwzMiAwIDAgMTQ0YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xNDQgODkuNSAwIDEwNy44IDE2MS44YzcuOCAxMS43IDIyLjQgMTcgMzUuOSAxMi45UzM4NCA0NjIuMSAzODQgNDQ4bDAtMTQ0IDMyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTMyIDAgMC0xOTJjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAxOTItNTcuNSAwLTEzOS44LTIwOS43ek0yOTQuNSAzMDRsMjUuNSAwIDAgMzguMy0yNS41LTM4LjN6TTE4NS41IDI1NmwtNTcuNSAwIDAtODYuMyA1Ny41IDg2LjN6Il0KICAgIH07CiAgICBmYVdpZmkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid2lmaSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJ3aWZpLTMiLCAid2lmaS1zdHJvbmciXSwgImYxZWIiLCAiTTI4OCA5NmMtOTAuOSAwLTE3My4yIDM2LTIzMy43IDk0LjYtMTIuNyAxMi4zLTMzIDEyLTQ1LjItLjdzLTEyLTMzIC43LTQ1LjJDODEuNyA3NC45IDE3OS45IDMyIDI4OCAzMlM0OTQuMyA3NC45IDU2Ni4zIDE0NC43YzEyLjcgMTIuMyAxMyAzMi42IC43IDQ1LjJzLTMyLjYgMTMtNDUuMiAuN0M0NjEuMiAxMzIgMzc4LjkgOTYgMjg4IDk2ek0yNDAgNDMyYTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6TTE2OCAzMjYuMmMtMTEuNyAxMy4zLTMxLjkgMTQuNS00NS4yIDIuOHMtMTQuNS0zMS45LTIuOC00NS4yQzE2MSAyMzcuNCAyMjEuMSAyMDggMjg4IDIwOHMxMjcgMjkuNCAxNjggNzUuOGMxMS43IDEzLjMgMTAuNCAzMy41LTIuOCA0NS4ycy0zMy41IDEwLjQtNDUuMi0yLjhDMzc4LjYgMjkyLjkgMzM1LjggMjcyIDI4OCAyNzJzLTkwLjYgMjAuOS0xMjAgNTQuMnoiXQogICAgfTsKICAgIGZhV2lmaTMgPSBmYVdpZmk7CiAgICBmYVdpZmlTdHJvbmcgPSBmYVdpZmk7CiAgICBmYU1vbmV5Q2hlY2tEb2xsYXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibW9uZXktY2hlY2stZG9sbGFyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbIm1vbmV5LWNoZWNrLWFsdCJdLCAiZjUzZCIsICJNNjQgNjRDMjguNyA2NCAwIDkyLjcgMCAxMjhMMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgNjR6TTI5NiAyODhsMTI4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTEyOCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0em0tMjQtODhjMC0xMy4zIDEwLjctMjQgMjQtMjRsMTI4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTEyOCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHpNMTQ4IDE0NGMxMSAwIDIwIDkgMjAgMjBsMCA0IDggMGMxMSAwIDIwIDkgMjAgMjBzLTkgMjAtMjAgMjBsLTQ3LjUgMGMtNi45IDAtMTIuNSA1LjYtMTIuNSAxMi41IDAgNi4xIDQuNCAxMS4zIDEwLjQgMTIuM2w0MS43IDdjMjUuMyA0LjIgNDMuOSAyNi4xIDQzLjkgNTEuOCAwIDI2LjEtMTkgNDcuNy00NCA1MS44bDAgNC43YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLTQtMjQgMGMtMTEgMC0yMC05LTIwLTIwczktMjAgMjAtMjBsNTUuNSAwYzYuOSAwIDEyLjUtNS42IDEyLjUtMTIuNSAwLTYuMS00LjQtMTEuMy0xMC40LTEyLjNsLTQxLjctN0M5NC41IDI2OCA3NiAyNDYuMSA3NiAyMjAuNSA3NiAxOTEuNyA5OS4yIDE2OC4zIDEyOCAxNjhsMC00YzAtMTEgOS0yMCAyMC0yMHoiXQogICAgfTsKICAgIGZhTW9uZXlDaGVja0FsdCA9IGZhTW9uZXlDaGVja0RvbGxhcjsKICAgIGZhRXllTG93VmlzaW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImV5ZS1sb3ctdmlzaW9uIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImxvdy12aXNpb24iXSwgImYyYTgiLCAiTTQxLTI0LjljLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwUy0yLjMtLjMgNyA5LjFsNTI4IDUyOGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTk2LjQtOTYuNGMyLjctMi40IDUuNC00LjggOC03LjIgNDYuOC00My41IDc4LjEtOTUuNCA5My0xMzEuMSAzLjMtNy45IDMuMy0xNi43IDAtMjQuNi0xNC45LTM1LjctNDYuMi04Ny43LTkzLTEzMS4xLTQ3LjEtNDMuNy0xMTEuOC04MC42LTE5Mi42LTgwLjYtNTYuOCAwLTEwNS42IDE4LjItMTQ2IDQ0LjJMNDEtMjQuOXpNMjA0LjUgMTM4LjdjMjMuNS0xNi44IDUyLjQtMjYuNyA4My41LTI2LjcgNzkuNSAwIDE0NCA2NC41IDE0NCAxNDQgMCAzMS4xLTkuOSA1OS45LTI2LjcgODMuNWwtMzQuNy0zNC43YzEyLjctMjEuNCAxNy00Ny43IDEwLjEtNzMuNy0xMy43LTUxLjItNjYuNC04MS42LTExNy42LTY3LjktOC42IDIuMy0xNi43IDUuNy0yNCAxMGwtMzQuNy0zNC43ek04OCAxNTcuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOUwzMjguMiA0NjZjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45TDg4IDE1Ny45ek00NS43IDI1MS4zYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45TDE4MS45IDQ1NS41YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOUw0NS43IDI1MS4zeiJdCiAgICB9OwogICAgZmFMb3dWaXNpb24gPSBmYUV5ZUxvd1Zpc2lvbjsKICAgIGZhQ2lyY2xlQXJyb3dVcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtYXJyb3ctdXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiYXJyb3ctY2lyY2xlLXVwIl0sICJmMGFhIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnptMTctMzc3bDgwIDgwYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTM5LTM5IDAgMTUwLjFjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0xNTAuMS0zOSAzOWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWw4MC04MGM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHoiXQogICAgfTsKICAgIGZhQXJyb3dDaXJjbGVVcCA9IGZhQ2lyY2xlQXJyb3dVcDsKICAgIGZhQ2FtZXJhUmV0cm8gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FtZXJhLXJldHJvIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MjQ3XSwgImYwODMiLCAiTTAgNDE2bDAtMjA4IDEzNi4yIDBjMTMuNS0yMC4yIDMyLTM2LjggNTMuNy00OEwwIDE2MCAwIDEyNS43YzAtMzUuMyAyOC43LTY0IDY0LTY0bC4xIDBDNjUuMyA0NS4xIDc5LjEgMzIgOTYgMzJsMzIgMGMxNi45IDAgMzAuNyAxMy4xIDMxLjkgMjkuN2wzMi4xIDAgNTEuMi0yMy44YzguNC0zLjkgMTcuNi02IDI2LjktNkw0NDggMzJjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCA2NC0xOTAgMGMyMS43IDExLjIgNDAuMiAyNy44IDUzLjcgNDhsMTM2LjIgMCAwIDIwOGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0ek0yNTYgMTkyYTk2LjEgOTYuMSAwIDEgMCAwIDE5Mi4xIDk2LjEgOTYuMSAwIDEgMCAwLTE5Mi4xeiJdCiAgICB9OwogICAgZmFDYXBzdWxlcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYXBzdWxlcyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNDZiIiwgIk05NiAxMTJjMC0yNi41IDIxLjUtNDggNDgtNDhzNDggMjEuNSA0OCA0OGwwIDExMi05NiAwIDAtMTEyem0tNjQgMGwwIDI4OGMwIDYxLjkgNTAuMSAxMTIgMTEyIDExMnMxMTItNTAuMSAxMTItMTEybDAtMTA1LjggMTE2LjMgMTY5LjVjMzUuNSA1MS43IDEwNS4zIDY0LjMgMTU2IDI4LjFzNjMtMTA3LjUgMjcuNS0xNTkuMkw0MjcuMyAxNDUuM2MtMzUuNS01MS43LTEwNS4zLTY0LjMtMTU2LTI4LjEtNS42IDQtMTAuNyA4LjQtMTUuMyAxMy4xbDAtMTguM0MyNTYgNTAuMSAyMDUuOSAwIDE0NCAwUzMyIDUwLjEgMzIgMTEyek0yOTYuNiAyNDAuMmMtMTYtMjMuMy0xMC01NS4zIDExLjktNzEgMjEuMi0xNS4xIDUwLjUtMTAuMyA2NiAxMi4ybDY3IDk3LjYtNzkuOSA1NS45LTY1LTk0Ljh6Il0KICAgIH07CiAgICBmYVBvbyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwb28iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgxNjldLCAiZjJmZSIsICJNMjY4LjkgLjljLTUuNS0uNy0xMSAxLjQtMTQuNSA1LjdzLTQuNiAxMC4xLTIuOCAxNS40YzIuOCA4LjIgNC4zIDE2LjkgNC4zIDI2LjEgMCA0NC4xLTM1LjcgNzkuOS03OS44IDgwTDE2MCAxMjhjLTM1LjMgMC02NCAyOC43LTY0IDY0IDAgMTkuMSA4LjQgMzYuMyAyMS43IDQ4TDEwNCAyNDBjLTM5LjggMC03MiAzMi4yLTcyIDcyIDAgMjMuMiAxMSA0My44IDI4IDU3LTM0LjEgNS43LTYwIDM1LjMtNjAgNzEgMCAzOS44IDMyLjIgNzIgNzIgNzJsMzY4IDBjMzkuOCAwIDcyLTMyLjIgNzItNzIgMC0zNS43LTI1LjktNjUuMy02MC03MSAxNy0xMy4yIDI4LTMzLjggMjgtNTcgMC0zOS44LTMyLjItNzItNzItNzJsLTEzLjcgMGMxMy4zLTExLjcgMjEuNy0yOC45IDIxLjctNDggMC0zNS4zLTI4LjctNjQtNjQtNjRsLTUuNSAwYzMuNS0xMCA1LjUtMjAuOCA1LjUtMzIgMC00OC42LTM2LjItODguOC04My4xLTk1LjF6TTE5MiAyNTZhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em05NiAzMmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem02NCAxMDguM2MwIDIuNC0uNyA0LjgtMi4yIDYuNy04LjIgMTAuNS0zOS41IDQ1LTkzLjggNDVzLTg1LjYtMzQuNi05My44LTQ1Yy0xLjUtMS45LTIuMi00LjMtMi4yLTYuNyAwLTYuOCA1LjUtMTIuMyAxMi4zLTEyLjNsMTY3LjQgMGM2LjggMCAxMi4zIDUuNSAxMi4zIDEyLjN6Il0KICAgIH07CiAgICBmYUVsZXZhdG9yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImVsZXZhdG9yIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUxNmQiLCAiTTI5Mi43LTQuN2w2NCA2NGM2LjIgNi4yIDE2LjQgNi4yIDIyLjYgMGw2NC02NGM0LjYtNC42IDUuOS0xMS41IDMuNS0xNy40UzQzOC41LTMyIDQzMi0zMkwzMDQtMzJjLTYuNSAwLTEyLjMgMy45LTE0LjggOS45cy0xLjEgMTIuOSAzLjUgMTcuNHptLTE2MC0yMi42bC02NCA2NGMtNC42IDQuNi01LjkgMTEuNS0zLjUgMTcuNFM3My41IDY0IDgwIDY0bDEyOCAwYzYuNSAwIDEyLjMtMy45IDE0LjgtOS45czEuMS0xMi45LTMuNS0xNy40bC02NC02NGMtNi4yLTYuMi0xNi40LTYuMi0yMi42IDB6TTY0IDEyOGMtMzUuMyAwLTY0IDI4LjctNjQgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMTI4em05NiA5NmE0OCA0OCAwIDEgMSAwIDk2IDQ4IDQ4IDAgMSAxIDAtOTZ6TTgwIDQwMGMwLTI2LjUgMjEuNS00OCA0OC00OGw2NCAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMTZjMCAxNy43LTE0LjMgMzItMzIgMzJsLTk2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTZ6bTE5MiAwYzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDY0IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAxNmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtOTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0xNnptMzItMTI4YTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6Il0KICAgIH07CiAgICBmYVRhZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjc5OTFdLCAiZjAyYiIsICJNMzIuNSA5NmwwIDE0OS41YzAgMTcgNi43IDMzLjMgMTguNyA0NS4zbDE5MiAxOTJjMjUgMjUgNjUuNSAyNSA5MC41IDBMNDgzLjIgMzMzLjNjMjUtMjUgMjUtNjUuNSAwLTkwLjVsLTE5Mi0xOTJDMjc5LjIgMzguNyAyNjMgMzIgMjQ2IDMyTDk2LjUgMzJjLTM1LjMgMC02NCAyOC43LTY0IDY0em0xMTIgMTZhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFGaWxlQ2lyY2xlTWludXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1jaXJjbGUtbWludXMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRlZCIsICJNOTYgMEM2MC43IDAgMzIgMjguNyAzMiA2NGwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxODAgMGMtMjIuNy0zMS41LTM2LTcwLjItMzYtMTEyIDAtMTAwLjYgNzcuNC0xODMuMiAxNzYtMTkxLjNsMC0zOC4xYzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI5MC43IDE4LjdDMjc4LjcgNi43IDI2Mi41IDAgMjQ1LjUgMEw5NiAwek0zNTcuNSAxNzZMMjY0IDE3NmMtMTMuMyAwLTI0LTEwLjctMjQtMjRMMjQwIDU4LjUgMzU3LjUgMTc2ek01NzYgNDAwYTE0NCAxNDQgMCAxIDAgLTI4OCAwIDE0NCAxNDQgMCAxIDAgMjg4IDB6bS02NCAwYzAgOC44LTcuMiAxNi0xNiAxNmwtMTI4IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsMTI4IDBjOC44IDAgMTYgNy4yIDE2IDE2eiJdCiAgICB9OwogICAgZmFEb3duTG9uZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkb3duLWxvbmciLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFsibG9uZy1hcnJvdy1hbHQtZG93biJdLCAiZjMwOSIsICJNMTM3LjQgNTM0LjZjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsMTI4LTEyOGM5LjItOS4yIDExLjktMjIuOSA2LjktMzQuOVMzMDAuOSAzNTIgMjg4IDM1MmwtNjQgMCAwLTMzNmMwLTI2LjUtMjEuNS00OC00OC00OGwtMzIgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCAzMzYtNjQgMGMtMTIuOSAwLTI0LjYgNy44LTI5LjYgMTkuOFMuMiAzOTcuNSA5LjQgNDA2LjZsMTI4IDEyOHoiXQogICAgfTsKICAgIGZhTG9uZ0Fycm93QWx0RG93biA9IGZhRG93bkxvbmc7CiAgICBmYUNvbXBhY3REaXNjID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvbXBhY3QtZGlzYyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODE5MSwgMTI4MTkyLCAxMjg0NDBdLCAiZjUxZiIsICJNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMjU2IDMyYTMyIDMyIDAgMSAxIDAtNjQgMzIgMzIgMCAxIDEgMCA2NHptLTk2LTMyYTk2IDk2IDAgMSAwIDE5MiAwIDk2IDk2IDAgMSAwIC0xOTIgMHptLTU2LTE2YzAtMzIuNCAxNi4zLTY2LjYgNDIuOC05My4yUzIwNy42IDEwNCAyNDAgMTA0YzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0Yy00Ny45IDAtOTMuNyAyMy41LTEyNy4xIDU2LjlTNTYgMTkyLjEgNTYgMjQwYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjR6Il0KICAgIH07CiAgICBmYVN1aXRjYXNlUm9sbGluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzdWl0Y2FzZS1yb2xsaW5nIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY1YzEiLCAiTTE0NCAyNGMwLTQuNCAzLjYtOCA4LThsODAgMGM0LjQgMCA4IDMuNiA4IDhsMCA3Mi05NiAwIDAtNzJ6TTMyMCA5NmwtMzIgMCAwLTcyYzAtMzAuOS0yNS4xLTU2LTU2LTU2bC04MCAwQzEyMS4xLTMyIDk2LTYuOSA5NiAyNGwwIDcyLTMyIDBDMjguNyA5NiAwIDEyNC43IDAgMTYwTDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0IDAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMTI4IDBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI4OGMwLTM1LjMtMjguNy02NC02NC02NHpNMTIwIDIwOGwxNDQgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTQ0IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6bTAgMTI4bDE0NCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNDQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhQm9va1F1cmFuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvb2stcXVyYW4iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsicXVyYW4iXSwgImY2ODciLCAiTTY0IDUxMmwyODggMGM1MyAwIDk2LTQzIDk2LTk2bDAtMzIwYzAtNTMtNDMtOTYtOTYtOTZMNDggMEMyMS41IDAgMCAyMS41IDAgNDhMMCAzMzZjMCAyMC45IDEzLjQgMzguNyAzMiA0NS4zTDMyIDQ0OGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzMiAwek0zNTIgMzg0YzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0yNTYgMCAwLTY0IDI1NiAwek0yNzMuMSAxNDQuNGMyLjUtNi4xIDExLjItNi4xIDEzLjcgMGwxMC4zIDI0LjggMjYuOCAyLjFjNi42IC41IDkuMiA4LjcgNC4yIDEzTDMwNy44IDIwMS45IDMxNCAyMjhjMS41IDYuNC01LjUgMTEuNS0xMS4xIDguMWwtMjIuOS0xNC0yMi45IDE0Yy01LjYgMy40LTEyLjYtMS42LTExLjEtOC4xbDYuMi0yNi4xLTIwLjQtMTcuNWMtNS00LjMtMi4zLTEyLjUgNC4yLTEzbDI2LjgtMi4xIDEwLjMtMjQuOHpNMTAwIDE5MmMwLTY4LjUgNTUuNS0xMjQgMTI0LTEyNCAyMy44IDAgNDYuMSA2LjcgNjUgMTguNCA0LjggMi45IDYuOSA4LjggNSAxNC4xcy03LjEgOC42LTEyLjcgOGMtMy4xLS4zLTYuMi0uNS05LjQtLjUtNDYuNCAwLTg0IDM3LjYtODQgODRzMzcuNiA4NCA4NCA4NGMzLjIgMCA2LjMtLjIgOS40LS41IDUuNi0uNiAxMC44IDIuNyAxMi43IDhzLS4zIDExLjItNSAxNC4xYy0xOC45IDExLjctNDEuMiAxOC40LTY1IDE4LjQtNjguNSAwLTEyNC01NS41LTEyNC0xMjR6Il0KICAgIH07CiAgICBmYVF1cmFuID0gZmFCb29rUXVyYW47CiAgICBmYVBob25lU2xhc2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGhvbmUtc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjNkZCIsICJNNTM1LTI0LjljOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45TDQxIDUzNy4xYy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45TDE0MS41IDM2OC42Qzg5LjIgMzEwLjUgNTEuNiAyMzguOCAzNC44IDE1OS40IDE4LjcgODMuMSA3My45IDIwLjYgMTM4LjUgMi45bDUuNS0xLjVjMTkuNy01LjQgNDAuMyA0LjcgNDguMSAyMy41bDQwLjUgOTcuM2M2LjkgMTYuNSAyLjEgMzUuNi0xMS44IDQ3bC00NC4xIDM2LjFjMTIuOSAyOC41IDI5LjYgNTQuOCA0OS41IDc4LjVMNTM1LTI0Ljl6bS0xNTAuNCA1MzRjLTYzLTEzLjQtMTIxLjMtMzkuOC0xNzEuNy03Ni4zTDI5Ny44IDM0OGMxMi4yIDguMiAyNSAxNS42IDM4LjMgMjIuMkwzNzQuNyAzMjNjMTEuMy0xMy45IDMwLjQtMTguNiA0Ny0xMS44TDUxOSAzNTEuOGMxOC44IDcuOCAyOC45IDI4LjQgMjMuNSA0OC4xbC0xLjUgNS41Yy0xNy42IDY0LjYtODAuMiAxMTkuOC0xNTYuNCAxMDMuN3oiXQogICAgfTsKICAgIGZhUm9hZENpcmNsZUNoZWNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJvYWQtY2lyY2xlLWNoZWNrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NjQiLCAiTTI4OCAzMmwtNzYuMyAwYy0yOS40IDAtNTUuMSAyMC4xLTYyLjEgNDguNkw2NS40IDQyMC41QzU3LjkgNDUwLjcgODAuOCA0ODAgMTEyIDQ4MGwyMDkuNCAwYy0xMS4yLTI0LjQtMTcuNC01MS40LTE3LjQtODAgMC0yOC42IDYuMi01NS43IDE3LjQtODAtLjUgMC0xIDAtMS41IDAtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC02NGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgNDljMzUuMi0zOS45IDg2LjctNjUgMTQ0LTY1IDkgMCAxNy44IC42IDI2LjUgMS44bC0zMi0xMjkuMkM0ODMuNCA1Mi4xIDQ1Ny44IDMyIDQyOC4zIDMybC03Ni40IDAgMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY0ek02NDAgNDAwYTE0NCAxNDQgMCAxIDAgLTI4OCAwIDE0NCAxNDQgMCAxIDAgMjg4IDB6bS04Ni42LTYwLjljNy4xIDUuMiA4LjcgMTUuMiAzLjUgMjIuM2wtNjQgODhjLTIuOCAzLjgtNyA2LjItMTEuNyA2LjVzLTkuMy0xLjMtMTIuNi00LjZsLTQwLTQwYy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBsMjYuOCAyNi44IDUzLTcyLjljNS4yLTcuMSAxNS4yLTguNyAyMi40LTMuNXoiXQogICAgfTsKICAgIGZhU2hvcExvY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2hvcC1sb2NrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU0YTUiLCAiTTIxLjUgMTgxLjFMNzguMyA2Ny40Qzg5LjIgNDUuNyAxMTEuMyAzMiAxMzUuNiAzMmwzMDQuOSAwYzI0LjIgMCA0Ni40IDEzLjcgNTcuMiAzNS40bDU1LjYgMTExLjFjLTguMi0xLjYtMTYuNi0yLjUtMjUuMi0yLjUtNTMuNyAwLTk5LjcgMzMuMS0xMTguNyA4MGwtNTcuMyAwIDAgMTc2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xOTIgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC0xNzYuMWMtMjYuOC0xLjktNDgtMjQuMy00OC01MS42IDAtOCAxLjktMTYgNS41LTIzLjJ6TTEyOCAyNTZsMCAxMTJjMCA4LjggNy4yIDE2IDE2IDE2bDEyOCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTExMi0xNjAgMHptNDMyIDQ4LjFjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA0Ny45IDY0IDAgMC00Ny45ek00MTYgNDAwYzAtMjAuOSAxMy40LTM4LjcgMzItNDUuM2wwLTUwLjZjMC00NC4yIDM1LjgtODAgODAtODBzODAgMzUuOCA4MCA4MGwwIDUwLjZjMTguNiA2LjYgMzIgMjQuNCAzMiA0NS4zbDAgOTZjMCAyNi41LTIxLjUgNDgtNDggNDhsLTEyOCAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTk2eiJdCiAgICB9OwogICAgZmFJbWFnZVBvcnRyYWl0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImltYWdlLXBvcnRyYWl0IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbInBvcnRyYWl0Il0sICJmM2UwIiwgIk0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDM4NGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6TTgwIDM2OGMwIDguOCA3LjIgMTYgMTYgMTZsMTkyIDBjOC44IDAgMTYtNy4yIDE2LTE2IDAtNDQuMi0zNS44LTgwLTgwLTgwbC02NCAwYy00NC4yIDAtODAgMzUuOC04MCA4MHpNMTkyIDI0OGE1NiA1NiAwIDEgMCAwLTExMiA1NiA1NiAwIDEgMCAwIDExMnoiXQogICAgfTsKICAgIGZhUG9ydHJhaXQgPSBmYUltYWdlUG9ydHJhaXQ7CiAgICBmYUJyaWRnZUxvY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnJpZGdlLWxvY2siLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRjYyIsICJNMCA2NEMwIDQ2LjMgMTQuMyAzMiAzMiAzMmw0NDggMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtOCAwIDAgMzIuMmMxMy44IC42IDI3LjIgMi44IDQwIDYuNGwwIDUwLjdjLTE0LjgtNi0zMS05LjMtNDgtOS4zLTcwLjcgMC0xMjggNTcuMy0xMjggMTI4bDAgMjQuNGMtLjQgLjMtLjcgLjYtMS4xIDEtMTcuMy0yNS00Ni4yLTQxLjMtNzguOS00MS4zLTUzIDAtOTYgNDMtOTYgOTZsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMzIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC05NGMwLTM4LjgtMjYuNC03Mi42LTY0LTgybDAtMTEyIDQwIDAgMC02NC04IDBDMTQuMyA5NiAwIDgxLjcgMCA2NHptNDI0IDY4LjZsMC0zNi42LTgwIDAgMCA2NCAxOC44IDBjMTguMi0xMi44IDM4LjktMjIuMiA2MS4yLTI3LjR6TTIxNiA5NmwwIDY0IDgwIDAgMC02NC04MCAwem0tNDggMGwtODAgMCAwIDY0IDgwIDAgMC02NHpNNDk2IDMwNC4xYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgNDcuOSA2NCAwIDAtNDcuOXpNMzUyIDQwMGMwLTIwLjkgMTMuNC0zOC43IDMyLTQ1LjNsMC01MC42YzAtNDQuMiAzNS44LTgwIDgwLTgwczgwIDM1LjggODAgODBsMCA1MC42YzE4LjYgNi42IDMyIDI0LjQgMzIgNDUuM2wwIDk2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xMjggMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC05NnoiXQogICAgfTsKICAgIGZhSGFtbWVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbW1lciIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzEyODI5Nl0sICJmNmUzIiwgIk0yNDYuOSAxOC4zTDI3MSAzLjhjMjEuNi0xMyA0Ni4zLTE5LjggNzEuNS0xOS44IDM2LjggMCA3Mi4yIDE0LjYgOTguMiA0MC43bDYzLjkgNjMuOWMxNSAxNSAyMy40IDM1LjQgMjMuNCA1Ni42bDAgMzAuOSAxOS43IDE5LjcgMCAwYzE1LjYtMTUuNiA0MC45LTE1LjYgNTYuNiAwczE1LjYgNDAuOSAwIDU2LjZsLTY0IDY0Yy0xNS42IDE1LjYtNDAuOSAxNS42LTU2LjYgMHMtMTUuNi00MC45IDAtNTYuNkw0NjQgMjQwIDQzMy4xIDI0MGMtMjEuMiAwLTQxLjYtOC40LTU2LjYtMjMuNGwtNDkuMS00OS4xYy0xNS0xNS0yMy40LTM1LjQtMjMuNC01Ni42bDAtMTIuN2MwLTExLjItNS45LTIxLjctMTUuNS0yNy40bC00MS42LTI1Yy0xMC40LTYuMi0xMC40LTIxLjIgMC0yNy40ek01MC43IDQwMi43bDIyMi4xLTIyMi4xIDkwLjUgOTAuNS0yMjIuMSAyMjIuMWMtMjUgMjUtNjUuNSAyNS05MC41IDBzLTI1LTY1LjUgMC05MC41eiJdCiAgICB9OwogICAgZmFBcnJvd1VwMTkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctdXAtMS05IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNvcnQtbnVtZXJpYy11cCJdLCAiZjE2MyIsICJNMTUwLjYgNDEuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTk2IDk2Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwTDk2IDE0MS4zIDk2IDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzA2LjcgNDEuNCA0MS40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTk2LTk2ek00MTguNyAzOGMtOC4zLTYtMTkuMS03LjctMjguOC00LjRsLTQ4IDE2Yy0xNi44IDUuNi0yNS44IDIzLjctMjAuMiA0MC41czIzLjcgMjUuOCA0MC41IDIwLjJsNS45LTIgMCA1MS42LTE2IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsOTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTYgMCAwLTk2YzAtMTAuMy00LjktMTkuOS0xMy4zLTI2ek0zNjUuMSA0MzAuNmMtOS42IDE0LjgtNS40IDM0LjYgOS40IDQ0LjNzMzQuNiA1LjQgNDQuMy05LjRsNDIuMS02NC45YzEyLjQtMTkuMiAxOS4xLTQxLjYgMTkuMS02NC41IDAtNDQuMi0zNS44LTgwLTgwLTgwcy04MCAzNS44LTgwIDgwYzAgMzYuMSAyMy45IDY2LjcgNTYuOCA3Ni42bC0xMS43IDE4ek0zNzYgMzM2YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6Il0KICAgIH07CiAgICBmYVNvcnROdW1lcmljVXAgPSBmYUFycm93VXAxOTsKICAgIGZhQ2hlc3NLbmlnaHQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoZXNzLWtuaWdodCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzk4MjJdLCAiZjQ0MSIsICJNMTkyLTMyYzEwNiAwIDE5MiA4NiAxOTIgMTkybDAgMTMzLjVjMCAxNy02LjggMzMuMi0xOC43IDQ1LjJMMzIwIDM4NCAzNzAuOCA0MzQuN2M4LjUgOC41IDEzLjIgMjAgMTMuMiAzMiAwIDI1LTIwLjMgNDUuMi00NS4yIDQ1LjNMNDUuMyA1MTJjLTI1IDAtNDUuMi0yMC4zLTQ1LjItNDUuMyAwLTEyIDQuOC0yMy41IDEzLjItMzJMNjQgMzg0IDY0IDM0OS40YzAtMTguNyA4LjItMzYuNCAyMi4zLTQ4LjZsODkuNy03Ni44LTQ4IDAtMTIuMSAxMi4xYy0xMi43IDEyLjctMzAgMTkuOS00OCAxOS45LTM3LjUgMC02Ny45LTMwLjQtNjcuOS02Ny45bDAtOC43YzAtMjIuOCA4LjItNDQuOSAyMy4xLTYyLjNMOTYgMzIgOTYgMGMwLTE3LjcgMTQuMy0zMiAzMi0zMmw2NCAwek0xNjAgNzJhMjQgMjQgMCAxIDAgMCA0OCAyNCAyNCAwIDEgMCAwLTQ4eiJdCiAgICB9OwogICAgZmFIb3VzZUZsb29kV2F0ZXJDaXJjbGVBcnJvd1JpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLWZsb29kLXdhdGVyLWNpcmNsZS1hcnJvdy1yaWdodCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTBmIiwgIk0yODguNSAxMTJhMTQ0IDE0NCAwIDEgMCAtMjg4IDAgMTQ0IDE0NCAwIDEgMCAyODggMHpNMTQxLjIgNDQuN2M2LjItNi4yIDE2LjQtNi4yIDIyLjYgMGw1NiA1NmM2LjIgNi4yIDYuMiAxNi40IDAgMjIuNmwtNTYgNTZjLTYuMiA2LjItMTYuNCA2LjItMjIuNiAwcy02LjItMTYuNCAwLTIyLjZsMjguNy0yOC43LTg5LjQgMGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNmw4OS40IDAtMjguNy0yOC43Yy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnpNMzM2LjUgMTEyYzAgNzEuMS0zOC42IDEzMy4xLTk2IDE2Ni4zbDAgMTIuOGMyMi4xIDQuNSA0My40IDEzLjkgNjIuNCAyOC4yIDIyLjEgMTYuNiAyOS4xIDE2LjYgNTEuMiAwIDI3LjUtMjAuNyA1OS45LTMxLjIgOTIuNC0zMS40IDMzLjEtLjIgNjYuMyAxMC4yIDk0LjQgMzEuNCA2LjkgNS4yIDEyLjggOSAxOCAxMS43IC42IC4zIDEuMiAuNiAxLjggMSA0LjIgMi4zIDguNSA0LjYgMTIuNiAxLjUgNi00LjUgMTIuNi04IDE5LjMtMTAuNGwwLTExNS4yIDQuNSAwYzE1LjIgMCAyNy41LTEyLjMgMjcuNS0yNy41IDAtNy45LTMuNC0xNS41LTkuNC0yMC43TDQ0NC41IDEwLjVDNDM2LjggMy43IDQyNi44IDAgNDE2LjUgMHMtMjAuMyAzLjctMjggMTAuNUwzMjkuOSA2MS44YzQuMyAxNiA2LjYgMzIuOCA2LjYgNTAuMnptMzIgODhjMC0xMy4zIDEwLjctMjQgMjQtMjRsNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0bC00OCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTQ4ek00NzUuMSA0MTIuMWMxOSAxNC40IDQxLjkgMjguMiA2Ny4yIDMzLjMgMjYuNSA1LjQgNTQuMyAuOCA4MC43LTE5LjEgMTAuNi04IDEyLjctMjMgNC43LTMzLjZzLTIzLTEyLjctMzMuNi00LjdjLTE0LjkgMTEuMi0yOC42IDEzLjEtNDIuMyAxMC4zLTE0LjktMy0zMC45LTExLjktNDcuOC0yNC42LTM4LjQtMjktOTAuNS0yOS0xMjkgMC0yNCAxOC4xLTQwLjcgMjYuMy01NC41IDI2LjNTMjkwIDM5MS44IDI2NiAzNzMuN2MtMzguNC0yOS05MC41LTI5LTEyOSAwLTIxLjYgMTYuMy00MS4zIDI1LjgtNTguOSAyNS43LTkuNi0uMS0xOS45LTMtMzEuMi0xMS41LTEwLjYtOC0yNS42LTUuOS0zMy42IDQuN3MtNS45IDI1LjYgNC43IDMzLjZjMTkuMSAxNC40IDM5LjQgMjEgNTkuOCAyMS4xIDMzLjkgLjIgNjQuMy0xNy40IDg4LjEtMzUuMyAyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAyNC4yIDE4LjMgNTIuMyAzNS45IDgzLjQgMzUuOXM1OS4xLTE3LjcgODMuNC0zNS45YzIxLjMtMTYuMSA0OS45LTE2LjEgNzEuMiAwem0tNzEuMiA5NmMyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAxOSAxNC40IDQxLjkgMjguMiA2Ny4yIDMzLjMgMjYuNSA1LjQgNTQuMyAuOCA4MC43LTE5LjEgMTAuNi04IDEyLjctMjMgNC43LTMzLjZzLTIzLTEyLjctMzMuNi00LjdjLTE0LjkgMTEuMi0yOC42IDEzLjEtNDIuMyAxMC4zLTE0LjktMy0zMC45LTExLjktNDcuOC0yNC42LTM4LjQtMjktOTAuNS0yOS0xMjkgMC0yNCAxOC4xLTQwLjcgMjYuMy01NC41IDI2LjNTMjkwIDQ4Ny44IDI2NiA0NjkuN2MtMzguNC0yOS05MC41LTI5LTEyOSAwLTIxLjYgMTYuMy00MS4zIDI1LjgtNTguOSAyNS43LTkuNi0uMS0xOS45LTMtMzEuMi0xMS41LTEwLjYtOC0yNS42LTUuOS0zMy42IDQuN3MtNS45IDI1LjYgNC43IDMzLjZjMTkuMSAxNC40IDM5LjQgMjEgNTkuOCAyMS4xIDMzLjkgLjIgNjQuMy0xNy40IDg4LjEtMzUuMyAyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAyNC4yIDE4LjMgNTIuMyAzNS45IDgzLjQgMzUuOXM1OS4xLTE3LjcgODMuNC0zNS45eiJdCiAgICB9OwogICAgZmFBcnJvd1VwUmlnaHRGcm9tU3F1YXJlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXVwLXJpZ2h0LWZyb20tc3F1YXJlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImV4dGVybmFsLWxpbmsiXSwgImYwOGUiLCAiTTMyMCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDgyLjcgMC0yMDEuNCAyMDEuNGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMEw0NDggMTA5LjMgNDQ4IDE5MmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTYwYzAtMTcuNy0xNC4zLTMyLTMyLTMyTDMyMCAwek04MCA5NkMzNS44IDk2IDAgMTMxLjggMCAxNzZMMCA0MzJjMCA0NC4yIDM1LjggODAgODAgODBsMjU2IDBjNDQuMiAwIDgwLTM1LjggODAtODBsMC04MGMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDgwYzAgOC44LTcuMiAxNi0xNiAxNkw4MCA0NDhjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTI1NmMwLTguOCA3LjItMTYgMTYtMTZsODAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkw4MCA5NnoiXQogICAgfTsKICAgIGZhRXh0ZXJuYWxMaW5rID0gZmFBcnJvd1VwUmlnaHRGcm9tU3F1YXJlOwogICAgZmFBcnJvd0Rvd25VcEFjcm9zc0xpbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctZG93bi11cC1hY3Jvc3MtbGluZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNGFmIiwgIk0yNjUuNCAxMDUuNGw5Ni05NmMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMGw5NiA5NmMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMGwtNDEuNC00MS40IDAgMTE0LjcgNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIwIDAgMCAxMTQuNyA0MS40LTQxLjRjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM2wtOTYgOTZjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwbC05Ni05NmMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMEw5NiA0MDIuNyA5NiAyODggMzIgMjg4Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDMyMCAwIDAtMTE0LjctNDEuNCA0MS40Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM3pNNDE2IDMzNmwwIDE0NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTE0NCA2NCAwek05NiAxNzZMOTYgMzJjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDE0NC02NCAweiJdCiAgICB9OwogICAgZmFGYWNlR3JpbkJlYW0yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi1iZWFtIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTE2LCAiZ3Jpbi1iZWFtIl0sICJmNTgyIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMzg2LjcgMzA4LjljMTEuOS0zLjcgMjMuOSA2LjMgMTkuNiAxOC4xLTIyLjQgNjEuMy04MS4zIDEwNS4xLTE1MC4zIDEwNS4xUzEyOC4xIDM4OC4yIDEwNS43IDMyNi45Yy00LjMtMTEuOCA3LjctMjEuOCAxOS42LTE4LjEgMzkuMiAxMi4yIDgzLjcgMTkuMSAxMzAuNyAxOS4xczkxLjUtNi45IDEzMC43LTE5LjF6TTE3NiAxODBjLTE1LjUgMC0yOCAxMi41LTI4IDI4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMzcuNiAzMC40LTY4IDY4LTY4czY4IDMwLjQgNjggNjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0xNS41LTEyLjUtMjgtMjgtMjh6bTEzMiAyOGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTM3LjYgMzAuNC02OCA2OC02OHM2OCAzMC40IDY4IDY4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMTUuNS0xMi41LTI4LTI4LTI4cy0yOCAxMi41LTI4IDI4eiJdCiAgICB9OwogICAgZmFHcmluQmVhbTIgPSBmYUZhY2VHcmluQmVhbTI7CiAgICBmYVJlY3RhbmdsZUFkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJlY3RhbmdsZS1hZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJhZCJdLCAiZjY0MSIsICJNNjQgNjRDMjguNyA2NCAwIDkyLjcgMCAxMjhMMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgNjR6TTQxNiAxODRsMCAxNDRjMCAxMy4zLTEwLjcgMjQtMjQgMjQtNy4xIDAtMTMuNS0zLjEtMTcuOS04LTEwLjIgNS4xLTIxLjggOC0zNC4xIDgtNDIgMC03Ni0zNC03Ni03NnMzNC03NiA3Ni03NmM5LjkgMCAxOS4zIDEuOSAyOCA1LjNsMC0yMS4zYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjR6bS00OCA5MmEyOCAyOCAwIDEgMCAtNTYgMCAyOCAyOCAwIDEgMCA1NiAwek0xNjAgMjA4Yy04LjggMC0xNiA3LjItMTYgMTZsMCAzMiA0OCAwIDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0xNiAwem0zMiA5NmwtNDggMCAwIDI0YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMTA0YzAtMzUuMyAyOC43LTY0IDY0LTY0bDE2IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAxMDRjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0yNHoiXQogICAgfTsKICAgIGZhQWQgPSBmYVJlY3RhbmdsZUFkOwogICAgZmFCb29rVGFuYWtoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvb2stdGFuYWtoIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInRhbmFraCJdLCAiZjgyNyIsICJNMzUyIDUxMkwzMiA1MTJjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMC02Ni43QzEzLjQgMzc0LjcgMCAzNTYuOSAwIDMzNkwwIDQ4QzAgMjEuNSAyMS41IDAgNDggMEwzNTIgMGM1MyAwIDk2IDQzIDk2IDk2bDAgMzIwYzAgNTMtNDMgOTYtOTYgOTZ6bTMyLTk2YzAtMTcuNy0xNC4zLTMyLTMyLTMybC0yNTYgMCAwIDY0IDI1NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMyek0xMTMuOSAyMjljLTEuMiAyLTEuOSA0LjItMS45IDYuNiAwIDYuOSA1LjYgMTIuNSAxMi41IDEyLjVsNTYuOSAwIDMwLjUgNDkuMmMyLjYgNC4yIDcuMiA2LjggMTIuMiA2LjhzOS42LTIuNiAxMi4yLTYuOGwzMC41LTQ5LjIgNTYuOSAwYzYuOSAwIDEyLjUtNS42IDEyLjUtMTIuNSAwLTIuMy0uNi00LjYtMS45LTYuNmwtMjcuOC00NSAyNy44LTQ1YzEuMi0yIDEuOS00LjIgMS45LTYuNiAwLTYuOS01LjYtMTIuNS0xMi41LTEyLjVsLTU2LjkgMC0zMC41LTQ5LjJDMjMzLjYgNjYuNiAyMjkgNjQgMjI0IDY0cy05LjYgMi42LTEyLjIgNi44bC0zMC41IDQ5LjItNTYuOSAwYy02LjkgMC0xMi41IDUuNi0xMi41IDEyLjUgMCAyLjMgLjYgNC42IDEuOSA2LjZsMjcuOCA0NS0yNy44IDQ1eiJdCiAgICB9OwogICAgZmFUYW5ha2ggPSBmYUJvb2tUYW5ha2g7CiAgICBmYUhvdFR1YlBlcnNvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3QtdHViLXBlcnNvbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJob3QtdHViIl0sICJmNTkzIiwgIk0yNDAgNDBjMCAxMy42IDUuOCAyNi41IDE1LjggMzUuNmwyNi41IDIzLjhjMjQgMjEuNiAzNy43IDUyLjMgMzcuNyA4NC42IDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtMTguNy03LjktMzYuNC0yMS44LTQ4LjlsLTI2LjUtMjMuOEMyMDMuNSA5My4xIDE5MiA2Ny4yIDE5MiA0MCAxOTIgMjYuNyAyMDIuNyAxNiAyMTYgMTZzMjQgMTAuNyAyNCAyNHpNMCAzMzZsMC04MGMwLTM1LjMgMjguNy02NCA2NC02NGwxOS43IDBjOC4xIDAgMTYuMiAxLjYgMjMuOCA0LjZsMTM3LjEgNTQuOGM3LjYgMyAxNS42IDQuNiAyMy44IDQuNkwzODQgMjU2YzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMTI4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAzMzZ6bTk2LTE2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDgwYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC04MGMwLTEzLjMtMTAuNy0yNC0yNC0yNHptMTUyIDI0YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgODBjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTgwem0xMDQtMjRjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgODBjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTgwYzAtMTMuMy0xMC43LTI0LTI0LTI0ek0zMjggMTZjMTMuMyAwIDI0IDEwLjcgMjQgMjQgMCAxMy42IDUuOCAyNi41IDE1LjggMzUuNmwyNi41IDIzLjhjMjQgMjEuNiAzNy43IDUyLjMgMzcuNyA4NC42IDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtMTguNy03LjktMzYuNC0yMS44LTQ4LjlsLTI2LjUtMjMuOEMzMTUuNSA5My4xIDMwNCA2Ny4yIDMwNCA0MCAzMDQgMjYuNyAzMTQuNyAxNiAzMjggMTZ6TTY0IDQwYTU2IDU2IDAgMSAxIDAgMTEyIDU2IDU2IDAgMSAxIDAtMTEyeiJdCiAgICB9OwogICAgZmFIb3RUdWIgPSBmYUhvdFR1YlBlcnNvbjsKICAgIGZhRmlsZUhhbGZEYXNoZWQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1oYWxmLWRhc2hlZCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlNjk4IiwgIk02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NGwwIDI1NiAzODQgMCAwLTE0OS41YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI1OC43IDE4LjdDMjQ2LjcgNi43IDIzMC41IDAgMjEzLjUgMEw2NCAwek0zMjUuNSAxNzZMMjMyIDE3NmMtMTMuMyAwLTI0LTEwLjctMjQtMjRMMjA4IDU4LjUgMzI1LjUgMTc2ek0wIDM1MmwwIDY0IDY0IDAgMC02NC02NCAwek02NCA1MTJsMC02NC02NCAwYzAgMzUuMyAyOC43IDY0IDY0IDY0em0zMiAwbDgwIDAgMC02NC04MCAwIDAgNjR6bTExMiAwbDgwIDAgMC02NC04MCAwIDAgNjR6bTExMiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bC02NCAwIDAgNjR6bTY0LTE2MGwtNjQgMCAwIDY0IDY0IDAgMC02NHoiXQogICAgfTsKICAgIGZhT3V0ZGVudCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJvdXRkZW50IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImRlZGVudCJdLCAiZjAzYiIsICJNLjQgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJsMzg0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTM4NCAwQzE0LjggOTYgLjQgODEuNyAuNCA2NHptMTkyIDEyOGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwxOTIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTkyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyem0zMiA5NmwxOTIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTkyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJ6TS40IDQ0OGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzODQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzg0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyek0uNyAyNjguNmMtOC4yLTYuNC04LjItMTguOSAwLTI1LjNsMTAxLjktNzkuM2MxMC41LTguMiAyNS44LS43IDI1LjggMTIuNmwwIDE1OC42YzAgMTMuMy0xNS4zIDIwLjgtMjUuOCAxMi42TC43IDI2OC42eiJdCiAgICB9OwogICAgZmFEZWRlbnQgPSBmYU91dGRlbnQ7CiAgICBmYUhhbmRQZWFjZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1wZWFjZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzk5OTZdLCAiZjI1YiIsICJNMTkyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAyMDgtNjQgMCAwLTIwOGMwLTE3LjcgMTQuMy0zMiAzMi0zMnptOTYgMTYwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02NGMwLTE3LjcgMTQuMy0zMiAzMi0zMnptNjQgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNjR6TTYxLjMgNTEuMkwxNDMuOSAyNDAgNzQuMSAyNDAgMi43IDc2LjhDLTQuNCA2MC42IDMgNDEuOCAxOS4yIDM0LjdTNTQuMiAzNSA2MS4zIDUxLjJ6bTI3IDIyMS4zbC0uMi0uNSA5NS45IDBjMjIuMSAwIDQwIDE3LjkgNDAgNDBzLTE3LjkgNDAtNDAgNDBsLTU2IDBjLTguOCAwLTE2IDcuMi0xNiAxNnM3LjIgMTYgMTYgMTZsNTYgMGMzOS44IDAgNzItMzIuMiA3Mi03MmwwLS42YzkuNCA1LjQgMjAuMyA4LjYgMzIgOC42IDEzLjIgMCAyNS40LTQgMzUuNi0xMC44IDguNyAyNC45IDMyLjUgNDIuOCA2MC40IDQyLjggMTEuNyAwIDIyLjYtMy4xIDMyLTguNmwwIDguNmMwIDg4LjQtNzEuNiAxNjAtMTYwIDE2MGwtNjEuNyAwYy00Mi40IDAtODMuMS0xNi45LTExMy4xLTQ2LjlMNjkuNSA0NTMuNUM0NS41IDQyOS41IDMyIDM5Ni45IDMyIDM2M2wwLTI3YzAtMzIuNyAyNC42LTU5LjcgNTYuMy02My41eiJdCiAgICB9OwogICAgZmFIZWFkU2lkZVZpcnVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhlYWQtc2lkZS12aXJ1cyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMDY0IiwgIk0zMjkuNyA0NDhjLTUuMSAwLTkuNyAzLjctOS43IDguOGwwIDcuMmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTYwIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtNjMuNmMwLTEyLjYtNS4xLTI0LjUtMTMuMS0zNC4yLTMxLjgtMzguNy01MC45LTg4LjItNTAuOS0xNDIuMiAwLTEyMy43IDEwMC4zLTIyNCAyMjQtMjI0IDExMi43IDAgMjA2IDgzLjMgMjIxLjcgMTkxLjcgLjQgMyAxLjcgNS45IDMuNiA4LjNsMzUuOCA0Mi45YzcgOC40IDEwLjkgMTkuMSAxMC45IDMwLjEgMCAyNS45LTIxIDQ3LTQ3IDQ3bC0xIDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0bC0zOC4zIDB6TTIyNCA2NGMtMTMuMyAwLTI0IDEwLjctMjQgMjQgMCAyMi45LTI3LjcgMzQuNC00My45IDE4LjItOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWMxNi4yIDE2LjIgNC43IDQzLjktMTguMiA0My45LTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRjMjIuOSAwIDM0LjQgMjcuNyAxOC4yIDQzLjktOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwYzE2LjItMTYuMiA0My45LTQuNyA0My45IDE4LjIgMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGMwLTIyLjkgMjcuNy0zNC40IDQzLjktMTguMiA5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjljLTE2LjItMTYuMi00LjctNDMuOSAxOC4yLTQzLjkgMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRjLTIyLjkgMC0zNC40LTI3LjctMTguMi00My45IDkuNC05LjQgOS40LTI0LjYgMC0zMy45cy0yNC42LTkuNC0zMy45IDBjLTE2LjIgMTYuMi00My45IDQuNy00My45LTE4LjIgMC0xMy4zLTEwLjctMjQtMjQtMjR6bS0zMiA4OGEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6bTQwIDg4YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6Il0KICAgIH07CiAgICBmYUNvbXBhc3MyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvbXBhc3MiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjk1MTddLCAiZjE0ZSIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6bTUwLjctMTg2LjlMMTYyLjQgMzgwLjZjLTE5LjQgNy41LTM4LjUtMTEuNi0zMS0zMWw1NS41LTE0NC4zYzMuMy04LjUgOS45LTE1LjEgMTguNC0xOC40bDE0NC4zLTU1LjVjMTkuNC03LjUgMzguNSAxMS42IDMxIDMxTDMyNS4xIDMwNi43Yy0zLjIgOC41LTkuOSAxNS4xLTE4LjQgMTguNHpNMjg4IDI1NmEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAweiJdCiAgICB9OwogICAgZmFQZW5OaWIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVuLW5pYiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEwMDAxXSwgImY1YWQiLCAiTTM2OC41IDE4LjNsLTUwLjEgNTAuMSAxMjUuMyAxMjUuMyA1MC4xLTUwLjFjMjEuOS0yMS45IDIxLjktNTcuMyAwLTc5LjJMNDQ3LjcgMTguM2MtMjEuOS0yMS45LTU3LjMtMjEuOS03OS4yIDB6TTI3OS4zIDk3LjJsLS41IC4xLTE0NC4xIDQzLjJjLTE5LjkgNi0zNS43IDIxLjItNDIuMyA0MUwzLjggNDQ1LjhjLTIuOSA4LjctMS45IDE4LjIgMi41IDI2TDE2MS43IDMxNi40Yy0xLjEtNC0xLjYtOC4xLTEuNi0xMi40IDAtMjYuNSAyMS41LTQ4IDQ4LTQ4czQ4IDIxLjUgNDggNDgtMjEuNSA0OC00OCA0OGMtNC4zIDAtOC41LS42LTEyLjQtMS42TDQwLjMgNTA1LjdjNy44IDQuNCAxNy4yIDUuNCAyNiAyLjVsMjY0LjMtODguNmMxOS43LTYuNiAzNS0yMi40IDQxLTQyLjNsNDMuMi0xNDQuMSAuMS0uNS0xMzUuNS0xMzUuNXoiXQogICAgfTsKICAgIGZhVGVudEFycm93c0Rvd24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGVudC1hcnJvd3MtZG93biIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTgxIiwgIk0xODUuNSAxMjFjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMGwtMzEgMzEgMC0xMDIuMWMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDEwMi4xLTMxLTMxYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDcyIDcyYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwbDcyLTcyem0yNDggNzJsNzItNzJjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMGwtMzEgMzEgMC0xMDIuMWMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDEwMi4xLTMxLTMxYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDcyIDcyYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwek02MC4zIDI5Mi42TDM3LjEgNDc2Yy0yLjQgMTkuMSAxMi41IDM2IDMxLjcgMzZsMTU0LjUgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTExNy40YzAtNS45IDQuNy0xMC42IDEwLjYtMTAuNiA0IDAgNy43IDIuMyA5LjUgNS45bDY4LjIgMTM2LjVjNS40IDEwLjggMTYuNSAxNy43IDI4LjYgMTcuN2w3MS45IDBjMTkuMyAwIDM0LjItMTYuOSAzMS43LTM2TDQ1Mi43IDI5Mi43Yy0xLjItOS43LTYuOS0xOC40LTE1LjMtMjMuNEwyNzEuOSAxNjkuOWMtMTAuMi02LjEtMjIuOS02LjEtMzMuMSAuMUw3NS40IDI2OS4zYy04LjMgNS4xLTEzLjkgMTMuNy0xNS4xIDIzLjN6Il0KICAgIH07CiAgICBmYUZvcndhcmRGYXN0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZvcndhcmQtZmFzdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzkxOTcsICJmYXN0LWZvcndhcmQiXSwgImYwNTAiLCAiTTE5LjggNDc3LjZjMTIgNSAyNS43IDIuMiAzNC45LTYuOUwyMjQgMzAxLjMgMjI0IDQ0OGMwIDEyLjkgNy44IDI0LjYgMTkuOCAyOS42czI1LjcgMi4yIDM0LjktNi45TDQ0OCAzMDEuMyA0NDggNDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zODRjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAxNDYuNy0xNjkuNC0xNjkuNGMtOS4yLTkuMi0yMi45LTExLjktMzQuOS02LjlTMjI0IDUxLjEgMjI0IDY0TDIyNCAyMTAuNyA1NC42IDQxLjRjLTkuMi05LjItMjIuOS0xMS45LTM0LjktNi45UzAgNTEuMSAwIDY0TDAgNDQ4YzAgMTIuOSA3LjggMjQuNiAxOS44IDI5LjZ6Il0KICAgIH07CiAgICBmYUZhc3RGb3J3YXJkID0gZmFGb3J3YXJkRmFzdDsKICAgIGZhQ3JvcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjcm9wIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxMjUiLCAiTTQ0OCAxMDkuM2w1NC42LTU0LjZjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBMNDAyLjcgNjQgMTc2IDY0IDE3NiAxMjggMzM4LjcgMTI4IDEyOCAzMzguNyAxMjggMzJjMC0xNy43LTE0LjMtMzItMzItMzJTNjQgMTQuMyA2NCAzMmwwIDMyLTMyIDBDMTQuMyA2NCAwIDc4LjMgMCA5NnMxNC4zIDMyIDMyIDMybDMyIDAgMCAyNTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjA4IDAgMC02NC0xNjIuNyAwIDIxMC43LTIxMC43IDAgMzA2LjdjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTMyIDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTMyIDAgMC0yNzQuN3oiXQogICAgfTsKICAgIGZhV2hpc2tleUdsYXNzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIndoaXNrZXktZ2xhc3MiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjkzNDcsICJnbGFzcy13aGlza2V5Il0sICJmN2EwIiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0TDAgMzUyYzAgNzAuNyA1Ny4zIDEyOCAxMjggMTI4bDE5MiAwYzcwLjcgMCAxMjgtNTcuMyAxMjgtMTI4bDAtMjg4YzAtMTcuNy0xNC4zLTMyLTMyLTMyTDMyIDMyek02NCAyNTZsMC0xNjAgMzIwIDAgMCAxNjAtMzIwIDB6Il0KICAgIH07CiAgICBmYUdsYXNzV2hpc2tleSA9IGZhV2hpc2tleUdsYXNzOwogICAgZmFTcXVhcmUyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzk2MzIsIDk3MjMsIDk3MjQsIDYxNTkwXSwgImYwYzgiLCAiTTY0IDMybDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMnoiXQogICAgfTsKICAgIGZhRmFjZUdyaW4yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3JpbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODUxMiwgImdyaW4iXSwgImY1ODAiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0zODYuNyAzMDguOWMxMS45LTMuNyAyMy45IDYuMyAxOS42IDE4LjEtMjIuNCA2MS4zLTgxLjMgMTA1LjEtMTUwLjMgMTA1LjFTMTI4LjEgMzg4LjIgMTA1LjcgMzI2LjljLTQuMy0xMS44IDcuNy0yMS44IDE5LjYtMTguMSAzOS4yIDEyLjIgODMuNyAxOS4xIDEzMC43IDE5LjFzOTEuNS02LjkgMTMwLjctMTkuMXpNMTQ0IDIwOGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0xOTItMzJhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFHcmluMiA9IGZhRmFjZUdyaW4yOwogICAgZmFGaWxlQ29udHJhY3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1jb250cmFjdCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmNTZjIiwgIk0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwyMTMuNSAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDM2NS4zIDEyNS4zYzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNMMzg0IDQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6bTIwOC01LjVsMCA5My41YzAgMTMuMyAxMC43IDI0IDI0IDI0TDMyNS41IDE3NiAyMDggNTguNXpNODggNjRDNzQuNyA2NCA2NCA3NC43IDY0IDg4czEwLjcgMjQgMjQgMjRsNDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNEw4OCA2NHptMCA5NmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw0OCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC00OCAwem03MC4zIDE2MGMtMTEuMyAwLTIxLjkgNS4xLTI4LjkgMTMuOUw2OS4zIDQwOWMtOC4zIDEwLjMtNi42IDI1LjUgMy43IDMzLjdzMjUuNSA2LjYgMzMuNy0zLjhsNDcuMS01OC44IDE1LjIgNTAuN2MzIDEwLjIgMTIuNCAxNy4xIDIzIDE3LjFsMTA0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTg2LjEgMC0xNi4xLTUzLjZjLTQuNy0xNS43LTE5LjEtMjYuNC0zNS41LTI2LjR6Il0KICAgIH07CiAgICBmYUFuZ2xlVXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYW5nbGUtdXAiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFs4OTYzXSwgImYxMDYiLCAiTTE2OS40IDEzNy40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDE2MCAxNjBjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNzLTMyLjggMTIuNS00NS4zIDBMMTkyIDIwNS4zIDU0LjYgMzQyLjZjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwcy0xMi41LTMyLjggMC00NS4zbDE2MC0xNjB6Il0KICAgIH07CiAgICBmYUZhY2VTbWlsZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1zbWlsZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU3OCwgInNtaWxlIl0sICJmMTE4IiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMTY1LjQgMzIxLjljMjAuNCAyOCA1My40IDQ2LjEgOTAuNiA0Ni4xczcwLjItMTguMSA5MC42LTQ2LjFjNy44LTEwLjcgMjIuOC0xMy4xIDMzLjUtNS4zczEzLjEgMjIuOCA1LjMgMzMuNUMzNTYuMyAzOTAgMzA5LjIgNDE2IDI1NiA0MTZzLTEwMC4zLTI2LTEyOS40LTY1LjljLTcuOC0xMC43LTUuNC0yNS43IDUuMy0zMy41czI1LjctNS40IDMzLjUgNS4zek0xNDQgMjA4YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTE5Mi0zMmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYVNtaWxlMiA9IGZhRmFjZVNtaWxlMjsKICAgIGZhUGVyc29uRHJlc3NCdXJzdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tZHJlc3MtYnVyc3QiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU0NCIsICJNMjA4IDQwLjFjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC00OGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDQ4YzAgMTMuMyAxMC43IDI0IDI0IDI0ek04IDE0NC4xYzAgMTMuMyAxMC43IDI0IDI0IDI0bDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTQ4IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0em05Mi41IDE0MS40bDMzLjktMzMuOWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwTDY2LjYgMjUxLjZjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMHpNNjYuNiAyLjdjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45bDMzLjkgMzMuOWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlMMTAwLjUgMi43QzkxLjEtNi43IDc2LTYuNyA2Ni42IDIuN3pNMzUyIDgwYTU2IDU2IDAgMSAwIDAtMTEyIDU2IDU2IDAgMSAwIDAgMTEyek0yNDYuMiAzODRsMjUuOCAwIDAgMTI4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xMjggMzIgMCAwIDEyOGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTI4IDI1LjggMGMxMC45IDAgMTguNi0xMC43IDE1LjItMjEuMWwtNDMtMTI5IDQ4LjMgNjUuMWMxMC41IDE0LjIgMzAuNiAxNy4yIDQ0LjggNi42czE3LjItMzAuNiA2LjYtNDQuOGwtNzAuNS05NUM0MzQgMTMyIDM5NC4zIDExMiAzNTIgMTEycy04MiAyMC0xMDcuMiA1My45bC03MC41IDk1Yy0xMC41IDE0LjItNy42IDM0LjIgNi42IDQ0LjhzMzQuMiA3LjYgNDQuOC02LjZsNDguMy02NS4xLTQzIDEyOWMtMy41IDEwLjQgNC4zIDIxLjEgMTUuMiAyMS4xeiJdCiAgICB9OwogICAgZmFEaXZpZGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZGl2aWRlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTAxMzUsIDI0N10sICJmNTI5IiwgIk0yMjQgNDhhNTYgNTYgMCAxIDEgMCAxMTIgNTYgNTYgMCAxIDEgMC0xMTJ6TTAgMjU2YzAtMTcuNyAxNC4zLTMyIDMyLTMybDM4NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDI4OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6TTE2OCA0MDhhNTYgNTYgMCAxIDEgMTEyIDAgNTYgNTYgMCAxIDEgLTExMiAweiJdCiAgICB9OwogICAgZmFDb2RlRm9yayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjb2RlLWZvcmsiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTEzYiIsICJNODAgMTA0YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHptODAtMjRjMCAzMi44LTE5LjcgNjEtNDggNzMuM2wwIDIyLjdjMCAyNi41IDIxLjUgNDggNDggNDhsMTI4IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0yMi43Yy0yOC4zLTEyLjMtNDgtNDAuNS00OC03My4zIDAtNDQuMiAzNS44LTgwIDgwLTgwczgwIDM1LjggODAgODBjMCAzMi44LTE5LjcgNjEtNDggNzMuM2wwIDIyLjdjMCA2MS45LTUwLjEgMTEyLTExMiAxMTJsLTMyIDAgMCA3MC43YzI4LjMgMTIuMyA0OCA0MC41IDQ4IDczLjMgMCA0NC4yLTM1LjggODAtODAgODBzLTgwLTM1LjgtODAtODBjMC0zMi44IDE5LjctNjEgNDgtNzMuM2wwLTcwLjctMzIgMEM5OC4xIDI4OCA0OCAyMzcuOSA0OCAxNzZsMC0yMi43QzE5LjcgMTQxIDAgMTEyLjggMCA4MCAwIDM1LjggMzUuOCAwIDgwIDBzODAgMzUuOCA4MCA4MHptMjA4IDI0YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHpNMjQ4IDQzMmEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAweiJdCiAgICB9OwogICAgZmFIb3VzZUZsYWcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG91c2UtZmxhZyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTBkIiwgIk00NzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmw5NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgOTZjMCAxNy43LTE0LjMgMzItMzIgMzJsLTk2IDAgMCAyODhjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC00NDhjMC0xNy43IDE0LjMtMzIgMzItMzJ6TTI4My41IDU5LjFsMTAwLjUgOTYuOSAwIDM1Ni0yNTYgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0xNDQtMTkuOSAwYy0xNS41IDAtMjguMS0xMi42LTI4LjEtMjguMSAwLTcuNiAzLjEtMTQuOSA4LjYtMjAuMkwyMjguNSA1OS4xQzIzNS45IDUyIDI0NS43IDQ4IDI1NiA0OHMyMC4xIDQgMjcuNSAxMS4xek0yMzIgMjU2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDQ4YzAgMTMuMyAxMC43IDI0IDI0IDI0bDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC00OGMwLTEzLjMtMTAuNy0yNC0yNC0yNGwtNDggMHoiXQogICAgfTsKICAgIGZhQnVpbGRpbmdDb2x1bW5zID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJ1aWxkaW5nLWNvbHVtbnMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiYmFuayIsICJpbnN0aXR1dGlvbiIsICJtdXNldW0iLCAidW5pdmVyc2l0eSJdLCAiZjE5YyIsICJNMjcxLjkgMjAuMmMtOS44LTUuNi0yMS45LTUuNi0zMS44IDBsLTIyNCAxMjhjLTEyLjYgNy4yLTE4LjggMjItMTUuMSAzNlMxNy41IDIwOCAzMiAyMDhsMzIgMCAwIDIwOCAwIDAtNTEuMiAzOC40QzQuNyA0NjAuNCAwIDQ2OS45IDAgNDgwIDAgNDk3LjcgMTQuMyA1MTIgMzIgNTEybDQ0OCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMyIDAtMTAuMS00LjctMTkuNi0xMi44LTI1LjZsLTUxLjItMzguNCAwLTIwOCAzMiAwYzE0LjUgMCAyNy4yLTkuOCAzMC45LTIzLjhzLTIuNS0yOC44LTE1LjEtMzZsLTIyNC0xMjh6TTQwMCAyMDhsMCAyMDgtNjQgMCAwLTIwOCA2NCAwem0tMTEyIDBsMCAyMDgtNjQgMCAwLTIwOCA2NCAwem0tMTEyIDBsMCAyMDgtNjQgMCAwLTIwOCA2NCAwek0yNTYgOTZhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFCYW5rID0gZmFCdWlsZGluZ0NvbHVtbnM7CiAgICBmYUluc3RpdHV0aW9uID0gZmFCdWlsZGluZ0NvbHVtbnM7CiAgICBmYU11c2V1bSA9IGZhQnVpbGRpbmdDb2x1bW5zOwogICAgZmFVbml2ZXJzaXR5ID0gZmFCdWlsZGluZ0NvbHVtbnM7CiAgICBmYVJ1ZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJydWciLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTU2OSIsICJNMjQgNjRsNTYgMCAwIDM4NC01NiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDggMCAwLTQwLTggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGw4IDAgMC0zMi04IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsOCAwIDAtMzItOCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDggMCAwLTQwLTggMEMxMC43IDExMiAwIDEwMS4zIDAgODhTMTAuNyA2NCAyNCA2NHptMTA0IDBsMzIwIDAgMCAzODQtMzIwIDAgMC0zODR6TTU3NiA4OGMwIDEzLjMtMTAuNyAyNC0yNCAyNGwtOCAwIDAgNDAgOCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC04IDAgMCAzMiA4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTggMCAwIDMyIDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtOCAwIDAgNDAgOCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC01NiAwIDAtMzg0IDU2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjR6Il0KICAgIH07CiAgICBmYUNvZGVNZXJnZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjb2RlLW1lcmdlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzODciLCAiTTgwIDU2YTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHptMzIuNCA5Ny4yYzI4LTEyLjQgNDcuNi00MC41IDQ3LjYtNzMuMiAwLTQ0LjItMzUuOC04MC04MC04MFMwIDM1LjggMCA4MGMwIDMyLjggMTkuNyA2MSA0OCA3My4zbDAgMjA1LjNDMTkuNyAzNzEgMCAzOTkuMiAwIDQzMiAwIDQ3Ni4yIDM1LjggNTEyIDgwIDUxMnM4MC0zNS44IDgwLTgwYzAtMzIuOC0xOS43LTYxLTQ4LTczLjNsMC04Ni42YzI2LjcgMjAuMSA2MCAzMiA5NiAzMmw4Ni43IDBjMTIuMyAyOC4zIDQwLjUgNDggNzMuMyA0OCA0NC4yIDAgODAtMzUuOCA4MC04MHMtMzUuOC04MC04MC04MGMtMzIuOCAwLTYxIDE5LjctNzMuMyA0OEwyMDggMjQwYy00OS45IDAtOTEtMzguMS05NS42LTg2Ljh6TTgwIDQwOGEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6TTM0NCAyNzJhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHoiXQogICAgfTsKICAgIGZhSG91c2VUc3VuYW1pID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLXRzdW5hbWkiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTUxNSIsICJNMjg4IDE2QzE1NS41IDE2IDQ4IDEyMy41IDQ4IDI1NlMxNTUuNSA0OTYgMjg4IDQ5NmM3LjQgMCAxOS43LTIuMyAzMy43LTcuMyAxMy44LTQuOSAyNy4xLTExLjcgMzYuNy0xOC45IDM4LjQtMjkgOTAuNS0yOSAxMjkgMCAxNS40IDExLjYgMzUuMyAyMS4xIDU1IDI0LjQgMTkuNSAzLjMgMzcgLjQgNTEuMS0xMC4yIDEwLjYtOCAyNS42LTUuOSAzMy42IDQuN3M1LjkgMjUuNi00LjcgMzMuNmMtMjcuMyAyMC41LTU5LjIgMjQtODcuOSAxOS4yLTI4LjUtNC44LTU1LjQtMTgtNzUuOS0zMy40LTIxLjMtMTYuMS00OS45LTE2LjEtNzEuMiAwLTE0LjUgMTAuOS0zMi40IDE5LjctNDkuNSAyNS44LTE2LjggNi0zNC45IDEwLjEtNDkuOSAxMC4xbC0uMSAwQzEyOC45IDU0My45IDAgNDE1IDAgMjU2IDAgOTYuOSAxMjguOS0zMiAyODgtMzIgMzAxLjMtMzIgMzEyLTIxLjMgMzEyLThzLTEwLjcgMjQtMjQgMjR6bTQ0LjggMTY2LjRsOTYtNzJjMTEuNC04LjUgMjcuMS04LjUgMzguNSAwbDk1LjUgNzJjOCA2IDEyLjcgMTUuNSAxMi43IDI1LjVsLjMgMTIxLjVjLTIuMiAxLjMtNC4zIDIuNi02LjQgNC4yLTQuMyAzLjEtOC43IC44LTEzLjItMS41bC0xLjItLjYtLjctLjNjLTUuNC0yLjctMTEuNy02LjYtMTguOS0xMS43LTI5LjUtMjEuMS02NC4zLTMxLjYtOTkuMS0zMS40LTM0LjEgLjItNjguMSAxMC43LTk3IDMxLjQtNy44IDUuNi0xMy44IDkuMy0xOS4zIDExLjJMMzIwIDIwOGMwLTEwLjEgNC43LTE5LjYgMTIuOC0yNS42em01NC42IDIyOS43Yy0xNC41IDEwLjktMzIuNCAxOS43LTQ5LjUgMjUuOC0xNi44IDYtMzQuOSAxMC4xLTQ5LjkgMTAuMS0xMDYgMC0xOTItODYtMTkyLTE5MlMxODIgNjQgMjg4IDY0YzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0Yy03OS41IDAtMTQ0IDY0LjUtMTQ0IDE0NHM2NC41IDE0NCAxNDQgMTQ0YzcuNCAwIDE5LjctMi4zIDMzLjctNy4zIDEzLjgtNC45IDI3LjEtMTEuNyAzNi43LTE4LjkgMzguNC0yOSA5MC41LTI5IDEyOSAwIDE1LjQgMTEuNiAzNS4zIDIxLjEgNTUgMjQuNCAxOS41IDMuMyAzNyAuNCA1MS4xLTEwLjIgMTAuNi04IDI1LjYtNS45IDMzLjYgNC43czUuOSAyNS42LTQuNyAzMy42Yy0yNy4zIDIwLjUtNTkuMiAyNC04Ny45IDE5LjItMjguNS00LjgtNTUuNC0xOC03NS45LTMzLjQtMjEuMy0xNi4xLTQ5LjktMTYuMS03MS4yIDB6Il0KICAgIH07CiAgICBmYU1hZ25pZnlpbmdHbGFzc0NoYXJ0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hZ25pZnlpbmctZ2xhc3MtY2hhcnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTUyMiIsICJNNDE2IDIwOGMwIDQ1LjktMTQuOSA4OC4zLTQwIDEyMi43TDUwMi42IDQ1Ny40YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zcy0zMi44IDEyLjUtNDUuMyAwTDMzMC43IDM3NkMyOTYuMyA0MDEuMSAyNTMuOSA0MTYgMjA4IDQxNiA5My4xIDQxNiAwIDMyMi45IDAgMjA4UzkzLjEgMCAyMDggMCA0MTYgOTMuMSA0MTYgMjA4em0tMzEyIDhsMCA2NGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNjRjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjR6bTgwLTk2bDAgMTYwYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xNjBjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjR6bTgwIDY0bDAgOTZjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTk2YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0eiJdCiAgICB9OwogICAgZmFVbWJyZWxsYSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1bWJyZWxsYSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMGU5IiwgIk0yNTYtMzJjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAyYzEyNi4zIDE1LjcgMjI0IDEyMy41IDIyNCAyNTQgMCAzLjgtLjEgNy41LS4yIDExLjMtLjMgNi45LTUgMTIuOC0xMS43IDE0LjdzLTEzLjgtLjctMTcuNi02LjVjLTE0LjQtMjEuNC0zOC44LTM1LjUtNjYuNS0zNS41LTI5LjMgMC01NC45IDE1LjctNjguOSAzOS4zLTIuNyA0LjYtNy42IDcuNi0xMyA3LjhzLTEwLjUtMi4yLTEzLjctNi41Yy0xNC42LTE5LjgtMzgtMzIuNi02NC41LTMyLjZzLTQ5LjkgMTIuOC02NC41IDMyLjZjLTMuMiA0LjMtOC4zIDYuOC0xMy43IDYuNXMtMTAuMi0zLjItMTMtNy44Yy0xNC0yMy42LTM5LjYtMzkuMy02OC45LTM5LjMtMjcuNyAwLTUyLjEgMTQuMS02Ni41IDM1LjUtMy45IDUuNy0xMSA4LjQtMTcuNiA2LjVTLjUgMjc0LjIgLjIgMjY3LjNDLjEgMjYzLjUgMCAyNTkuOCAwIDI1NiAwIDEyNS41IDk3LjcgMTcuNyAyMjQgMmwwLTJjMC0xNy43IDE0LjMtMzIgMzItMzJ6bTMyIDM2MGwwIDEwMi42YzAgNDUtMzYuNSA4MS40LTgxLjQgODEuNC0zMC44IDAtNTktMTcuNC03Mi44LTQ1bC0yLjMtNC43Yy03LjktMTUuOC0xLjUtMzUgMTQuMy00Mi45czM1LTEuNSA0Mi45IDE0LjNsMi4zIDQuN2MzIDUuOSA5IDkuNiAxNS42IDkuNiA5LjYgMCAxNy40LTcuOCAxNy40LTE3LjRMMjI0IDMyOGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMyeiJdCiAgICB9OwogICAgZmFIaWxsUm9ja3NsaWRlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhpbGwtcm9ja3NsaWRlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1MDgiLCAiTTI1Mi40IDEwMy44bDI3IDQ4YzIuOCA1IDguMiA4LjIgMTMuOSA4LjJsNTMuMyAwYzUuOCAwIDExLjEtMy4xIDEzLjktOC4ybDI3LTQ4YzIuNy00LjkgMi43LTEwLjggMC0xNS43bC0yNy00OGMtMi44LTUtOC4yLTguMi0xMy45LTguMmwtNTMuMyAwYy01LjggMC0xMS4xIDMuMS0xMy45IDguMmwtMjcgNDhjLTIuNyA0LjktMi43IDEwLjggMCAxNS43ek02OC4zIDg3QzQzLjEgNjEuOCAwIDc5LjcgMCAxMTUuM0wwIDQzMmMwIDQ0LjIgMzUuOCA4MCA4MCA4MGwzMTYuNyAwYzM1LjYgMCA1My41LTQzLjEgMjguMy02OC4zTDY4LjMgODd6TTUwNC4yIDQwMy42YzQuOSAyLjcgMTAuOCAyLjcgMTUuNyAwbDQ4LTI3YzUtMi44IDguMi04LjIgOC4yLTEzLjlsMC01My4zYzAtNS44LTMuMS0xMS4xLTguMi0xMy45bC00OC0yN2MtNC45LTIuNy0xMC44LTIuNy0xNS43IDBsLTQ4IDI3Yy01IDIuOC04LjIgOC4yLTguMiAxMy45bDAgNTMuM2MwIDUuOCAzLjEgMTEuMSA4LjIgMTMuOWw0OCAyN3pNMTkyIDY0YTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6TTM4NCAyODhhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFVc2VyU2VjcmV0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXItc2VjcmV0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI4MzczXSwgImYyMWIiLCAiTTE3MS0xNmMtMzYuNCAwLTU3LjggNTguMy02OC4zIDExMkw3MiA5NmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwyNCAwIDAgMzJjMCAxNyAzLjMgMzMuMiA5LjMgNDhsLTkuMyAwIDAgMC0yMC41IDBjLTE1LjIgMC0yNy41IDEyLjMtMjcuNSAyNy41IDAgMyAuNSA1LjkgMS40IDguN2wyOC45IDg2LjZDNDAuMiAzNzkuNiAxNiA0MjguMSAxNiA0ODIuMyAxNiA0OTguNyAyOS4zIDUxMiA0NS43IDUxMmwzNTYuNiAwYzE2LjQgMCAyOS43LTEzLjMgMjkuNy0yOS43IDAtNTQuMi0yNC4yLTEwMi43LTYyLjMtMTM1LjRsMjguOS04Ni42Yy45LTIuOCAxLjQtNS43IDEuNC04LjcgMC0xNS4yLTEyLjMtMjcuNS0yNy41LTI3LjVsLTIwLjUgMCAwIDAtOS4zIDBjNi0xNC44IDkuMy0zMSA5LjMtNDhsMC0zMiAyNCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0zMC43IDBjLTEwLjQtNTMuNy0zMS45LTExMi02OC4zLTExMi05LjYgMC0xOSAzLjktMjcuNSA4LjItOC4yIDQuMS0xOC40IDcuOC0yNS41IDcuOHMtMTcuMy0zLjctMjUuNS03LjhDMTkwLTEyLjEgMTgwLjYtMTYgMTcxLTE2em05My43IDQ4NC40bC0yNC44LTcwLjkgMjcuOS0zMi41YzIuNy0zLjIgNC4yLTcuMiA0LjItMTEuNCAwLTkuNy03LjgtMTcuNS0xNy41LTE3LjVsLTYxIDBjLTkuNyAwLTE3LjUgNy44LTE3LjUgMTcuNSAwIDQuMiAxLjUgOC4yIDQuMiAxMS40bDI3LjkgMzIuNS0yNC44IDcwLjktNTctMTgwLjQgMzUuNyAwYzE4LjQgMTAuMiAzOS41IDE2IDYyIDE2czQzLjYtNS44IDYyLTE2bDM1LjcgMC01NyAxODAuNHpNMjI0IDI1NmMtMzQuNyAwLTY0LjItMjIuMS03NS4zLTUzIDUuNyAzLjIgMTIuMyA1IDE5LjMgNWwxMi40IDBjMTYuNSAwIDMxLjEtMTAuNiAzNi4zLTI2LjIgMi4zLTcgMTIuMi03IDE0LjUgMCA1LjIgMTUuNiAxOS45IDI2LjIgMzYuMyAyNi4ybDEyLjQgMGM3IDAgMTMuNi0xLjggMTkuMy01LTExLjEgMzAuOS00MC42IDUzLTc1LjMgNTN6Il0KICAgIH07CiAgICBmYVBhZ2VyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBhZ2VyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MjIzXSwgImY4MTUiLCAiTTAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjU2YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjh6bTY0IDMybDAgNjRjMCAxNy43IDE0LjMgMzIgMzIgMzJsMzIwIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMkw5NiAxMjhjLTE3LjcgMC0zMiAxNC4zLTMyIDMyek04OCAzMjBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNDggMHptMTI4IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNDggMHoiXQogICAgfTsKICAgIGZhQnJpZWZjYXNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJyaWVmY2FzZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODE4OF0sICJmMGIxIiwgIk0yMDAgNDhsMTEyIDBjNC40IDAgOCAzLjYgOCA4bDAgNDAtMTI4IDAgMC00MGMwLTQuNCAzLjYtOCA4LTh6bS01NiA4bDAgNDAtODAgMEMyOC43IDk2IDAgMTI0LjcgMCAxNjBsMCA5NiA1MTIgMCAwLTk2YzAtMzUuMy0yOC43LTY0LTY0LTY0bC04MCAwIDAtNDBjMC0zMC45LTI1LjEtNTYtNTYtNTZMMjAwIDBjLTMwLjkgMC01NiAyNS4xLTU2IDU2ek01MTIgMzA0bC0xOTIgMCAwIDE2YzAgMTcuNy0xNC4zIDMyLTMyIDMybC02NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTE2LTE5MiAwIDAgMTEyYzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTEyeiJdCiAgICB9OwogICAgZmFUcm93ZWxCcmlja3MgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHJvd2VsLWJyaWNrcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNThhIiwgIk0yMjQgMzJjMC0xMS41LTYuMi0yMi4yLTE2LjItMjcuOHMtMjIuMy01LjUtMzIuMiAuNGwtMTYwIDk2QzUuOSAxMDYuMyAwIDExNi44IDAgMTI4czUuOSAyMS43IDE1LjUgMjcuNGwxNjAgOTZjOS45IDUuOSAyMi4yIDYuMSAzMi4yIC40UzIyNCAyMzUuNSAyMjQgMjI0bDAtNjQgMjU2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTI1NiAwIDAtNjR6bTk2IDE5MmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxNjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTY0YzAtMTcuNy0xNC4zLTMyLTMyLTMybC0xNjAgMHpNMCA0MTZsMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmw5NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNjRjMC0xNy43LTE0LjMtMzItMzItMzJsLTk2IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyem0yMjQtMzJjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgNjRjMCAxNy43IDE0LjMgMzIgMzIgMzJsMjU2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtMjU2IDB6Il0KICAgIH07CiAgICBmYVNvY2tzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNvY2tzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI5NTEwXSwgImY2OTYiLCAiTTI1Mi44IDBMMTc2IDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgMTYgMTEyIDAgMC0xNmMwLTE3LjUgNC43LTMzLjkgMTIuOC00OHpNMTI4IDExMmwwIDEyOGMwIDIwLjEtOS41IDM5LjEtMjUuNiA1MS4ybC02NCA0OGMtMjQuMiAxOC4xLTM4LjQgNDYuNi0zOC40IDc2LjggMCA1MyA0MyA5NiA5NiA5NiAxNS40IDAgMzAuNS0zLjcgNDQtMTAuNy0xNy42LTIzLjktMjgtNTMuNC0yOC04NS4zIDAtNDUuMyAyMS4zLTg4IDU3LjYtMTE1LjJsNjQtNDhjNC0zIDYuNC03LjggNi40LTEyLjhsMC0xMjgtMTEyIDB6bTE2MCAwbDAgMTI4YzAgMjAuMS05LjUgMzkuMS0yNS42IDUxLjJsLTY0IDQ4Yy0yNC4yIDE4LjEtMzguNCA0Ni42LTM4LjQgNzYuOCAwIDUzIDQzIDk2IDk2IDk2IDIwLjggMCA0MS02LjcgNTcuNi0xOS4ybDExNS4yLTg2LjRDNDYxIDM4Mi4yIDQ4MCAzNDQuMyA0ODAgMzA0bDAtMTkyLTE5MiAwek00ODAgNjRsMC0xNmMwLTI2LjUtMjEuNS00OC00OC00OEwzMzYgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCAxNiAxOTIgMHoiXQogICAgfTsKICAgIGZhVCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTE2XSwgIjU0IiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0UzE0LjMgOTYgMzIgOTZsMTI4IDAgMCAzNTJjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTM1MiAxMjggMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwzMiAzMnoiXQogICAgfTsKICAgIGZhTWljcm9jaGlwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1pY3JvY2hpcCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMmRiIiwgIk0xNzYgMjRjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCA0MGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsLTQwIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDAgMCAwIDU2LTQwIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDAgMCAwIDU2LTQwIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDAgMGMwIDM1LjMgMjguNyA2NCA2NCA2NGwwIDQwYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC00MCA1NiAwIDAgNDBjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTQwIDU2IDAgMCA0MGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsNDAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNDAgMCAwLTU2IDQwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTQwIDAgMC01NiA0MCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC00MCAwYzAtMzUuMy0yOC43LTY0LTY0LTY0bDAtNDBjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCA0MC01NiAwIDAtNDBjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCA0MC01NiAwIDAtNDB6TTE2MCAxMjhsMTkyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxOTJjMCAxNy43LTE0LjMgMzItMzIgMzJsLTE5MiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTE5MmMwLTE3LjcgMTQuMy0zMiAzMi0zMnptMTYgNDhsMCAxNjAgMTYwIDAgMC0xNjAtMTYwIDB6Il0KICAgIH07CiAgICBmYVRydWNrTWVkaWNhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cnVjay1tZWRpY2FsIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4NjU3LCAiYW1idWxhbmNlIl0sICJmMGY5IiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMuMyAwYzEwLjQgMzYuOSA0NC40IDY0IDg0LjcgNjRzNzQuMi0yNy4xIDg0LjctNjRsMTAyLjYgMGMxMC40IDM2LjkgNDQuNCA2NCA4NC43IDY0czc0LjItMjcuMSA4NC43LTY0bDMuMyAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTQ2LjdjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNMNTEyIDE0Ni43Yy0xMi0xMi0yOC4zLTE4LjctNDUuMy0xOC43bC01MC43IDAgMC0zMmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnpNNTEyIDIzNy4zbDAgNTAuNy05NiAwIDAtOTYgNTAuNyAwIDQ1LjMgNDUuM3pNMTUyIDM4NGE0MCA0MCAwIDEgMSAwIDgwIDQwIDQwIDAgMSAxIDAtODB6bTIzMiA0MGE0MCA0MCAwIDEgMSA4MCAwIDQwIDQwIDAgMSAxIC04MCAwek0xNzYgMTM2YzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDQwIDQwIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC00MCAwIDAgNDBjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC00MC00MCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsNDAgMCAwLTQweiJdCiAgICB9OwogICAgZmFBbWJ1bGFuY2UgPSBmYVRydWNrTWVkaWNhbDsKICAgIGZhT20gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAib20iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgzMjldLCAiZjY3OSIsICJNMzg4LjcgNC43YzYuMi02LjIgMTYuNC02LjIgMjIuNiAwbDE2IDE2YzYuMiA2LjIgNi4yIDE2LjQgMCAyMi42bC0xNiAxNmMtNi4yIDYuMi0xNi40IDYuMi0yMi42IDBsLTE2LTE2Yy02LjItNi4yLTYuMi0xNi40IDAtMjIuNmwxNi0xNnpNMTc2IDE2MGMtMTAuOCAwLTIwLjggMy42LTI4LjggOS42LTE0LjEgMTAuNi0zNC4yIDcuOC00NC44LTYuNHMtNy44LTM0LjIgNi40LTQ0LjhjMTguNy0xNC4xIDQyLTIyLjQgNjcuMi0yMi40IDYxLjkgMCAxMTIgNTAuMSAxMTIgMTEyIDAgMTcuMi0zLjkgMzMuNS0xMC44IDQ4bDQ5LjcgMGMxMi43IDAgMjQuOS01IDMzLjktMTQuMWwyMC43LTIwLjdjMTguNy0xOC43IDQ0LjEtMjkuMyA3MC42LTI5LjMgNTUuMiAwIDk5LjkgNDQuNyA5OS45IDk5LjlsMCA5Ni4xYzAgNTUuMi00NC44IDEwMC0xMDAgMTAwUzM1MiA0NDMuMiAzNTIgMzg4bDAtNGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgNGMwIDE5LjkgMTYuMSAzNiAzNiAzNnMzNi0xNi4xIDM2LTM2bDAtOTYuMWMwLTE5LjgtMTYuMS0zNS45LTM1LjktMzUuOS05LjUgMC0xOC42IDMuOC0yNS40IDEwLjVsLTIwLjcgMjAuN2MtMjEgMjEtNDkuNCAzMi44LTc5LjEgMzIuOGwtMjYuOCAwYzEyLjYgMTkuNiAxOS45IDQyLjggMTkuOSA2OCAwIDc1LjItNjUgMTMyLTE0MCAxMzJTNDAgNDYzLjIgNDAgMzg4YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJjMCAzNS4zIDMxLjcgNjggNzYgNjhzNzYtMzIuNyA3Ni02OC0zMS43LTY4LTc2LTY4bC0yMCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDE2IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhzLTIxLjUtNDgtNDgtNDh6TTMzNy4xIDYwLjFjLTExLTEzLjgtMzEuMS0xNi4yLTQ1LTUuMnMtMTYuMiAzMS4xLTUuMiA0NUMzMTIuNiAxMzIuMiAzNTQuNCAxNTIgNDAwIDE1MnM4Ny40LTE5LjggMTEzLjEtNTIuMWMxMS0xMy44IDguNy0zNC01LjItNDVzLTM0LTguNy00NSA1LjJDNDUwLjMgNzYgNDI3LjUgODggNDAwIDg4cy01MC4zLTEyLTYyLjktMjcuOXoiXQogICAgfTsKICAgIGZhTW9zcXVpdG9OZXQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibW9zcXVpdG8tbmV0IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1MmMiLCAiTTU3NiAzNTJjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCAxNiAxNiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNiAwIDAgNDggMTYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTYgMCAwIDE2LS4xIDIuNUM1OTguNiA1NjYuNiA1ODguNCA1NzYgNTc2IDU3NnMtMjIuNi05LjQtMjMuOS0yMS41bC0uMS0yLjUgMC0xNi00OCAwIDAgMTYtLjEgMi41QzUwMi42IDU2Ni42IDQ5Mi40IDU3NiA0ODAgNTc2cy0yMi42LTkuNC0yMy45LTIxLjVsLS4xLTIuNSAwLTE2LTE2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMTYgMCAwLTQ4LTE2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMTYgMCAwLTE2YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCAxNiA0OCAwIDAtMTZjMC0xMy4zIDEwLjctMjQgMjQtMjR6TTQyOS45IDE2LjNjNy43LTkuNCAyMS4zLTExLjUgMzEuNC00LjMgMTAuMSA3LjEgMTMuMSAyMC45IDcuNCAzMS43bC0xLjMgMi4xLTI1LjkgMzguOSAxMy4zIDUzLjRjMiA4LS4xIDE2LjMtNS4zIDIyLjNsLTIuNCAyLjQtNDQuNyAzOC4zIDEzMC41IDE0LjVjNDIuOCA0LjggNzUuMSA0MC45IDc1LjEgODMuOSAwIDMuOS0uNCA3LjctLjkgMTEuNS03LjMtMy41LTE1LjMtNS44LTIzLjgtNi43TDU3NiAzMDRjLTE4LjUgMC0zNS4zIDctNDggMTguNC0xMS05LjktMjUuMS0xNi41LTQwLjYtMTguMUw0ODAgMzA0Yy0zMC4zIDAtNTYuMSAxOC43LTY2LjggNDUuMi0xMi41IDUtMjMuMiAxMy40LTMxLjEgMjRsLTMwLjItNDAuMSAwIDc0LjdjMCAxNy43LTE0LjMgMzItMzIgMzItMTYuNiAwLTMwLjItMTIuNi0zMS44LTI4LjdsLS4yLTMuMyAwLTc0LjYtMzIuMyA0MyAwIDM5LjhjMCAzLjUtLjcgNi45LTIuMSAxMC4xbC0xLjYgMy4xLTQwIDY0LTEuNCAyYy03LjUgOS42LTIxIDEyLjEtMzEuMyA1LjMtMTAuMy02LjgtMTMuNy0yMC41LTguMy0zMS41bDEuMi0yLjIgMzYuMi01OCAwLTQxIC4zLTRjLjYtMy45IDIuMi03LjcgNC42LTEwLjlsMzkuMy01Mi4yLTY2LjIgNTkuNWMtMTcgMTUuMy0zOSAyMy43LTYxLjkgMjMuOGwtOC4xIDBjLTQ2LjYgMC04NC40LTM3LjgtODQuNC04NC40IDAtNDMgMzIuNC03OS4yIDc1LjEtODMuOWwxMzAuNS0xNC41LTQ0LjctMzguMy0yLjQtMi40Yy01LjItNi03LjMtMTQuNC01LjMtMjIuM2wxMy4zLTUzLjQtMjUuOS0zOC45LTEuMi0yLjFjLTUuNy0xMC44LTIuNy0yNC42IDcuNC0zMS43IDEwLjEtNy4xIDIzLjctNS4xIDMxLjQgNC4zbDEuNSAyIDMyIDQ4IDEuNCAyLjJjMi44IDUuMyAzLjUgMTEuNiAyLjEgMTcuNmwtMTIuMyA0OS4yIDUzLjMgNDUuNyAwLTI4LjggLjItMy4yYzEuMS0xMC40IDcuMi0xOS40IDE1LjgtMjQuNGwwLTYwLjUgLjMtMy4yYzEuNS03LjMgOC0xMi43IDE1LjctMTIuOCA3LjcgMCAxNC4yIDUuNSAxNS43IDEyLjhsLjMgMy4yIDAgNjAuNWM4LjcgNSAxNC44IDE0IDE1LjggMjQuNGwuMiAzLjIgMCAyOC45IDUzLjQtNDUuNy0xMi4zLTQ5LjJjLTEuNS01LjktLjctMTIuMiAyLjEtMTcuNmwxLjQtMi4yIDMyLTQ4IDEuNS0yek01MDQgNDg4bDQ4IDAgMC00OC00OCAwIDAgNDh6Il0KICAgIH07CiAgICBmYVByZXNjcmlwdGlvbkJvdHRsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwcmVzY3JpcHRpb24tYm90dGxlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY0ODUiLCAiTTAgMzJDMCAxNC4zIDE0LjMgMCAzMiAwTDM1MiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJMMzIgOTZDMTQuMyA5NiAwIDgxLjcgMCA2NEwwIDMyek0zMiAxNDRsMzIwIDAgMCAzMDRjMCAzNS4zLTI4LjcgNjQtNjQgNjRMOTYgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NGw3MiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC03MiAwIDAtNDggNzIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNzIgMCAwLTQ4IDcyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTcyIDAgMC02NHoiXQogICAgfTsKICAgIGZhVXNlcnNHZWFyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXJzLWdlYXIiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsidXNlcnMtY29nIl0sICJmNTA5IiwgIk0zMjAgMjI0YTEwNCAxMDQgMCAxIDAgMC0yMDggMTA0IDEwNCAwIDEgMCAwIDIwOHpNOTYgMjMyYTcyIDcyIDAgMSAwIDAtMTQ0IDcyIDcyIDAgMSAwIDAgMTQ0ek0wIDQxNmwwIDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMybDg2LjcgMGMtNC4zLTkuOC02LjctMjAuNi02LjctMzJsMC0xNmMwLTUzLjIgMjAtMTAxLjggNTIuOS0xMzguNi0xMS43LTMuNS0yNC4xLTUuNC0zNi45LTUuNC03MC43IDAtMTI4IDU3LjMtMTI4IDEyOHpNNjE2IDE2MGE3MiA3MiAwIDEgMCAtMTQ0IDAgNzIgNzIgMCAxIDAgMTQ0IDB6TTE2MCA0MzJsMCAxNmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxNTYuOCAwYy03LjEtMjEuNi02LjMtNDQuNCAxMC43LTY0LTE0LTE2LjItMjAuNS0zOS43LTExLjQtNjMuMyA2LjYtMTcuMSAxNS45LTMzLjEgMjcuNC00Ny4zIDUuNC02LjYgMTEuNi0xMS43IDE4LjMtMTUuNC0yMi4xLTExLjUtNDcuMi0xOC03My44LTE4LTg4LjQgMC0xNjAgNzEuNi0xNjAgMTYwem00NjQuNi00NC4xYzYuMy0zLjYgOS41LTExLjEgNi44LTE4LTQuOC0xMi40LTExLjUtMjQuMS0xOS45LTM0LjQtNC42LTUuNy0xMi43LTYuNy0xOS0zLTIxLjggMTIuNi00OC42LTIuOC00OC42LTI4LjEgMC03LjMtNC45LTEzLjgtMTIuMS0xNC45LTEyLjktMi0yNi44LTItMzkuNyAwLTcuMiAxLjEtMTIuMSA3LjYtMTIuMSAxNC45IDAgMjUuMi0yNi44IDQwLjctNDguNiAyOC4xLTYuMy0zLjYtMTQuNC0yLjYtMTkgMy04LjQgMTAuMy0xNS4xIDIyLTE5LjkgMzQuNC0yLjYgNi44IC41IDE0LjMgNi44IDE3LjkgMjEuOSAxMi42IDIxLjkgNDMuNSAwIDU2LjItNi4zIDMuNi05LjUgMTEuMS02LjggMTcuOSA0LjggMTIuNCAxMS41IDI0LjEgMTkuOSAzNC40IDQuNiA1LjcgMTIuNyA2LjcgMTkgMyAyMS44LTEyLjYgNDguNiAyLjkgNDguNiAyOC4xIDAgNy4zIDQuOSAxMy44IDEyLjEgMTQuOSAxMi45IDIgMjYuOCAyIDM5LjcgMCA3LjItMS4xIDEyLjEtNy42IDEyLjEtMTQuOSAwLTI1LjIgMjYuOC00MC43IDQ4LjYtMjguMSA2LjMgMy42IDE0LjQgMi42IDE5LTMgOC40LTEwLjMgMTUuMS0yMiAxOS45LTM0LjQgMi42LTYuOC0uNS0xNC4zLTYuOC0xNy45LTIxLjktMTIuNi0yMS45LTQzLjUgMC01Ni4yek00NzIgNDE2YTQwIDQwIDAgMSAxIDgwIDAgNDAgNDAgMCAxIDEgLTgwIDB6Il0KICAgIH07CiAgICBmYVVzZXJzQ29nID0gZmFVc2Vyc0dlYXI7CiAgICBmYVJvYWRDaXJjbGVFeGNsYW1hdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyb2FkLWNpcmNsZS1leGNsYW1hdGlvbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTY1IiwgIk0yODggMzJsLTc2LjMgMGMtMjkuNCAwLTU1LjEgMjAuMS02Mi4xIDQ4LjZMNjUuNCA0MjAuNUM1Ny45IDQ1MC43IDgwLjggNDgwIDExMiA0ODBsMjA5LjQgMGMtMTEuMi0yNC40LTE3LjQtNTEuNC0xNy40LTgwIDAtMjguNiA2LjItNTUuNyAxNy40LTgwLS41IDAtMSAwLTEuNSAwLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDQ5YzM1LjItMzkuOSA4Ni43LTY1IDE0NC02NSA5IDAgMTcuOCAuNiAyNi41IDEuOGwtMzItMTI5LjJDNDgzLjQgNTIuMSA0NTcuOCAzMiA0MjguMyAzMmwtNzYuNCAwIDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02NHpNNDk2IDU0NGExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6bTAtMTAwYTIwIDIwIDAgMSAxIDAgNDAgMjAgMjAgMCAxIDEgMC00MHptMC0xNDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgODBjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC04MGMwLTguOCA3LjItMTYgMTYtMTZ6Il0KICAgIH07CiAgICBmYVBhdXNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBhdXNlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbOTIwOF0sICJmMDRjIiwgIk00OCAzMkMyMS41IDMyIDAgNTMuNSAwIDgwTDAgNDMyYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDY0IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0zNTJjMC0yNi41LTIxLjUtNDgtNDgtNDhMNDggMzJ6bTIyNCAwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDM1MmMwIDI2LjUgMjEuNSA0OCA0OCA0OGw2NCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMzUyYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC02NCAweiJdCiAgICB9OwogICAgZmFTdGFmZlNuYWtlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN0YWZmLXNuYWtlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInJvZC1hc2NsZXBpdXMiLCAicm9kLXNuYWtlIiwgInN0YWZmLWFlc2N1bGFwaXVzIl0sICJlNTc5IiwgIk0xOTIgMzJsMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMzIgNjQgMGM1MyAwIDk2IDQzIDk2IDk2cy00MyA5Ni05NiA5NmwtMTYgMCAwLTY0IDE2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTY0IDAgMCAxOTIgMzIgMGM1MyAwIDk2IDQzIDk2IDk2IDAgNDcuNi0zNC42IDg3LjEtODAgOTQuN2wwLTY3YzkuNi01LjUgMTYtMTUuOSAxNi0yNy43IDAtMTcuNy0xNC4zLTMyLTMyLTMybC0zMiAwIDAgMTYwYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMzItMzIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwzMiAwIDAtNjQtMzIgMGMtNTMgMC05Ni00My05Ni05NiAwLTQ3LjYgMzQuNi04Ny4xIDgwLTk0LjdsMCA2N2MtOS42IDUuNS0xNiAxNS45LTE2IDI3LjcgMCAxNy43IDE0LjMgMzIgMzIgMzJsMzIgMCAwLTE5Mi03Mi42IDBjLTExLjEgMTkuMS0zMS43IDMyLTU1LjQgMzJsLTE2IDBDMjEuNSAxMjggMCAxMDYuNSAwIDgwUzIxLjUgMzIgNDggMzJsMTQ0IDB6Il0KICAgIH07CiAgICBmYVJvZEFzY2xlcGl1cyA9IGZhU3RhZmZTbmFrZTsKICAgIGZhUm9kU25ha2UgPSBmYVN0YWZmU25ha2U7CiAgICBmYVN0YWZmQWVzY3VsYXBpdXMgPSBmYVN0YWZmU25ha2U7CiAgICBmYVBpZ2d5QmFuayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwaWdneS1iYW5rIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY0ZDMiLCAiTTI4OC0zMmE5NiA5NiAwIDEgMSAwIDE5MiA5NiA5NiAwIDEgMSAwLTE5MnpNNDggMzA0YzAtNzAuMSA0Ny0xMzEuNCAxMTcuMS0xNjQuOSAyNS4zIDQxLjMgNzAuOSA2OC45IDEyMi45IDY4LjkgNTUuNyAwIDEwNC4xLTMxLjcgMTI4LTc4IDE1LjgtMTEuMyAzNS4xLTE4IDU2LTE4bDE5LjUgMGMxMC40IDAgMTggOS44IDE1LjUgMTkuOWwtMTcuMSA2OC4zYzkuOSAxMi40IDE4LjIgMjUuNyAyNC40IDM5LjhsMjEuNyAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgMTEyYzAgMTMuMy0xMC43IDI0LTI0IDI0bC00MCAwYy0xNi41IDIyLTM4LjUgMzkuNi02NCA1MC43bDAgMjkuM2MwIDE3LjctMTQuMyAzMi0zMiAzMmwtMzMgMGMtMTQuMyAwLTI2LjgtOS41LTMwLjgtMjMuMmwtNy4xLTI0LjgtODIuMyAwLTcuMSAyNC44QzIzNS44IDUwMi41IDIyMy4zIDUxMiAyMDkgNTEybC0zMyAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTI5LjNDODcuNSA0MjYgNDggMzY5LjYgNDggMzA0em0zNzYgMTZhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiJdCiAgICB9OwogICAgZmFNb251bWVudCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb251bWVudCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmNWE2IiwgIk0yMDktMzNjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwTDk1IDQ3Yy00LjEgNC4xLTYuNSA5LjQtNyAxNS4xTDU4LjQgNDQ4IDQ4IDQ0OGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwyODggMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTAuNCAwLTI5LjctMzg1LjhjLS40LTUuNy0yLjktMTEuMS03LTE1LjFMMjA5LTMzek0xMjggMjk2YzAtMTMuMyAxMC43LTI0IDI0LTI0bDgwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTgwIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0eiJdCiAgICB9OwogICAgZmFBbmdsZXNSaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhbmdsZXMtcmlnaHQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxODcsICJhbmdsZS1kb3VibGUtcmlnaHQiXSwgImYxMDEiLCAiTTQzOS4xIDI3OC42YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zbC0xNjAtMTYwYy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM0wzNzEuMiAyNTYgMjMzLjkgMzkzLjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBsMTYwLTE2MHptLTM1MiAxNjBsMTYwLTE2MGMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM2wtMTYwLTE2MGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNMMTc5LjIgMjU2IDQxLjkgMzkzLjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDB6Il0KICAgIH07CiAgICBmYUFuZ2xlRG91YmxlUmlnaHQgPSBmYUFuZ2xlc1JpZ2h0OwogICAgZmFEZXNrdG9wID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRlc2t0b3AiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg0MjEsIDYxNzA0LCAiZGVza3RvcC1hbHQiXSwgImYzOTAiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCAzNTJjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTQ0IDAtMTYgNDgtNzIgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwyNzIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNzIgMC0xNi00OCAxNDQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI1NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnpNOTYgOTZsMzIwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxNjBjMCAxNy43LTE0LjMgMzItMzIgMzJMOTYgMzIwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTE2MGMwLTE3LjcgMTQuMy0zMiAzMi0zMnoiXQogICAgfTsKICAgIGZhRGVza3RvcEFsdCA9IGZhRGVza3RvcDsKICAgIGZhUGxhbmVDaXJjbGVYbWFyayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwbGFuZS1jaXJjbGUteG1hcmsiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU1NyIsICJNMjMyIDI0YzAtMzAuOSAyNS4xLTU2IDU2LTU2czU2IDI1LjEgNTYgNTZsMCAxMjcuMyA3OCA3MS41Yy02OS4zIDI5LTExOCA5Ny40LTExOCAxNzcuMiAwIDQ5LjMgMTguNiA5NC4zIDQ5LjEgMTI4LjNMMjg4IDUxMiAxNzkuOSA1MzljLTEwLjEgMi41LTE5LjktNS4xLTE5LjktMTUuNWwwLTE5LjhjMC00LjkgMi4yLTkuNSA2LTEyLjVsNjYtNTIuOCAwLTk5LjctMTYyLjkgNTQuM0M1OC43IDM5Ni40IDQ4IDM4OC43IDQ4IDM3Ny44bDAtNDMuN2MwLTkgMy44LTE3LjUgMTAuNC0yMy42TDIzMiAxNTEuMyAyMzIgMjR6TTQ5NiAyNTZhMTQ0IDE0NCAwIDEgMSAwIDI4OCAxNDQgMTQ0IDAgMSAxIDAtMjg4em01OS4zIDEwNy4zYzYuMi02LjIgNi4yLTE2LjQgMC0yMi42cy0xNi40LTYuMi0yMi42IDBsLTM2LjcgMzYuNy0zNi43LTM2LjdjLTYuMi02LjItMTYuNC02LjItMjIuNiAwcy02LjIgMTYuNCAwIDIyLjZsMzYuNyAzNi43LTM2LjcgMzYuN2MtNi4yIDYuMi02LjIgMTYuNCAwIDIyLjZzMTYuNCA2LjIgMjIuNiAwbDM2LjctMzYuNyAzNi43IDM2LjdjNi4yIDYuMiAxNi40IDYuMiAyMi42IDBzNi4yLTE2LjQgMC0yMi42bC0zNi43LTM2LjcgMzYuNy0zNi43eiJdCiAgICB9OwogICAgZmFSZXR3ZWV0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJldHdlZXQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjA3OSIsICJNMTE4LjYgNDEuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTY0IDY0Yy05LjIgOS4yLTExLjkgMjIuOS02LjkgMzQuOVMxOS4xIDE2MCAzMiAxNjBsMzIgMCAwIDIyNGMwIDUzIDQzIDk2IDk2IDk2bDEyOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0xMjggMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0yMjQgMzIgMGMxMi45IDAgMjQuNi03LjggMjkuNi0xOS44czIuMi0yNS43LTYuOS0zNC45bC02NC02NHpNNDU3LjQgNDcwLjZjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsNjQtNjRjOS4yLTkuMiAxMS45LTIyLjkgNi45LTM0LjlTNTU2LjkgMzUyIDU0NCAzNTJsLTMyIDAgMC0yMjRjMC01My00My05Ni05Ni05NkwyODggMzJjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMTI4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAyMjQtMzIgMGMtMTIuOSAwLTI0LjYgNy44LTI5LjYgMTkuOHMtMi4yIDI1LjcgNi45IDM0LjlsNjQgNjR6Il0KICAgIH07CiAgICBmYVVzZXJHZWFyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXItZ2VhciIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWyJ1c2VyLWNvZyJdLCAiZjRmZSIsICJNMjU2LjUgOGExMjAgMTIwIDAgMSAxIDAgMjQwIDEyMCAxMjAgMCAxIDEgMC0yNDB6TTIyNi43IDMwNGw1OS40IDAgMS41IDBjLTEyLjkgMjYuOC03LjggNTguMiAxMS41IDc5LjUtMjAuMiAyMi4zLTI0LjggNTUuOC05LjQgODMuNGwyMi41IDQwLjRjLjkgMS42IDEuOSAzLjIgMi45IDQuN2wtMjM3IDBjLTE2LjQgMC0yOS43LTEzLjMtMjkuNy0yOS43IDAtOTguNSA3OS44LTE3OC4zIDE3OC4zLTE3OC4zem0yMDUuOS01Ni40YzAtMTMuMyAxMC43LTI0IDI0LTI0bDQ4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA2LjFjMCAxOC45IDI0LjEgMzIuOCA0MC41IDIzLjRsNS0yLjljMTEuNi02LjcgMjYuNS0yLjYgMzMgOS4xbDIyLjQgNDAuMmM2LjIgMTEuMiAyLjYgMjUuMi04LjIgMzJsLTQuNyAyLjljLTE2LjIgMTAuMS0xNi4yIDM5LjkgMCA1MC4xbDQuNiAyLjljMTAuOCA2LjggMTQuNSAyMC44IDguMyAzMkw2MDcgNDgzLjhjLTYuNSAxMS43LTIxLjQgMTUuOS0zMyA5LjFsLTQuOS0yLjljLTE2LjQtOS41LTQwLjUgNC41LTQwLjUgMjMuNGwwIDYuMWMwIDEzLjMtMTAuNyAyNC0yNCAyNGwtNDggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC01LjljMC0xOS0yNC4yLTMzLTQwLjctMjMuNWwtNC44IDIuOGMtMTEuNiA2LjctMjYuNCAyLjYtMzMtOS4xbC0yMi42LTQwLjRjLTYuMi0xMS4yLTIuNi0yNS4zIDguMy0zMi4xbDQuNC0yLjdjMTYuMy0xMC4xIDE2LjMtNDAuMSAwLTUwLjJsLTQuNS0yLjhjLTEwLjktNi44LTE0LjUtMjAuOS04LjMtMzIuMWwyMi41LTQwLjNjNi41LTExLjcgMjEuNC0xNS44IDMyLjktOS4xbDQuOCAyLjhjMTYuNSA5LjUgNDAuNy00LjUgNDAuNy0yMy41bDAtNS45em05OS45IDEzNi4yYTUyIDUyIDAgMSAwIC0xMDQgMCA1MiA1MiAwIDEgMCAxMDQgMHoiXQogICAgfTsKICAgIGZhVXNlckNvZyA9IGZhVXNlckdlYXI7CiAgICBmYUJvcmRlckFsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib3JkZXItYWxsIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY4NGMiLCAiTTM4NCA5NmwwIDEyOC0xMjggMCAwLTEyOCAxMjggMHptMCAxOTJsMCAxMjgtMTI4IDAgMC0xMjggMTI4IDB6TTE5MiAyMjRsLTEyOCAwIDAtMTI4IDEyOCAwIDAgMTI4ek02NCAyODhsMTI4IDAgMCAxMjgtMTI4IDAgMC0xMjh6TTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6Il0KICAgIH07CiAgICBmYUNvaW5zID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvaW5zIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1MWUiLCAiTTEyOCA5NmwwLTE2YzAtNDQuMiA4Ni04MCAxOTItODBTNTEyIDM1LjggNTEyIDgwbDAgMTZjMCAzMC42LTQxLjMgNTcuMi0xMDIgNzAuNy0yLjQtMi44LTQuOS01LjUtNy40LTgtMTUuNS0xNS4zLTM1LjUtMjYuOS01Ni40LTM1LjUtNDEuOS0xNy41LTk2LjUtMjcuMS0xNTQuMi0yNy4xLTIxLjkgMC00My4zIDEuNC02My44IDQuMS0uMi0xLjMtLjItMi43LS4yLTQuMXpNNDMyIDM1M2wwLTQ2LjJjMTUuMS0zLjkgMjkuMy04LjUgNDIuMi0xMy45IDEzLjItNS41IDI2LjEtMTIuMiAzNy44LTIwLjNsMCAxNS40YzAgMjYuOC0zMS41IDUwLjUtODAgNjV6bTAtOTZsMC0zM2MwLTQuNS0uNC04LjgtMS0xMyAxNS41LTMuOSAzMC04LjYgNDMuMi0xNC4yczI2LjEtMTIuMiAzNy44LTIwLjNsMCAxNS40YzAgMjYuOC0zMS41IDUwLjUtODAgNjV6TTAgMjQwbDAtMTZjMC00NC4yIDg2LTgwIDE5Mi04MHMxOTIgMzUuOCAxOTIgODBsMCAxNmMwIDQ0LjItODYgODAtMTkyIDgwUzAgMjg0LjIgMCAyNDB6bTM4NCA5NmMwIDQ0LjItODYgODAtMTkyIDgwUzAgMzgwLjIgMCAzMzZsMC0xNS40YzExLjYgOC4xIDI0LjUgMTQuNyAzNy44IDIwLjMgNDEuOSAxNy41IDk2LjUgMjcuMSAxNTQuMiAyNy4xczExMi4zLTkuNyAxNTQuMi0yNy4xYzEzLjItNS41IDI2LjEtMTIuMiAzNy44LTIwLjNsMCAxNS40em0wIDgwLjZsMCAxNS40YzAgNDQuMi04NiA4MC0xOTIgODBTMCA0NzYuMiAwIDQzMmwwLTE1LjRjMTEuNiA4LjEgMjQuNSAxNC43IDM3LjggMjAuMyA0MS45IDE3LjUgOTYuNSAyNy4xIDE1NC4yIDI3LjFzMTEyLjMtOS43IDE1NC4yLTI3LjFjMTMuMi01LjUgMjYuMS0xMi4yIDM3LjgtMjAuM3oiXQogICAgfTsKICAgIGZhTWFyc1N0cm9rZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtYXJzLXN0cm9rZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzk4OTRdLCAiZjIyOSIsICJNNDE2LTMyYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDUwLjcgMC01OC43IDU4LjctMTcuNC0xNy40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2wxNy40IDE3LjQtMjMgMjNjLTI4LjQtMTkuNS02Mi43LTMxLTk5LjgtMzEtOTcuMiAwLTE3NiA3OC44LTE3NiAxNzZzNzguOCAxNzYgMTc2IDE3NiAxNzYtNzguOCAxNzYtMTc2YzAtMzctMTEuNC03MS40LTMxLTk5LjhsMjMtMjMgMTcuNCAxNy40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNMNDUzLjMgMTM2IDUxMiA3Ny4zIDUxMiAxMjhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMkw1NzYgMGMwLTE3LjctMTQuMy0zMi0zMi0zMkw0MTYtMzJ6TTEyOCAzMDRhMTEyIDExMiAwIDEgMSAyMjQgMCAxMTIgMTEyIDAgMSAxIC0yMjQgMHoiXQogICAgfTsKICAgIGZhSGFuZHNoYWtlQW5nbGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZHNoYWtlLWFuZ2xlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImhhbmRzLWhlbHBpbmciXSwgImY0YzQiLCAiTTI2OC45IDUzLjJMMTUyLjMgMTgyLjhjLTQuNiA1LjEtNC40IDEzIC41IDE3LjkgMzAuNSAzMC41IDgwIDMwLjUgMTEwLjUgMGwzMS44LTMxLjhjNC4yLTQuMiA5LjUtNi41IDE0LjktNi45IDYuOC0uNiAxMy44IDEuNyAxOSA2LjlMNTA1LjYgMzQ0IDU3NiAyODggNTc2IDAgNDY0IDY0IDQ0MC4yIDQ4LjFDNDI0LjQgMzcuNiA0MDUuOSAzMiAzODYuOSAzMmwtNzAuNCAwYy0xLjEgMC0yLjMgMC0zLjQgLjEtMTYuOSAuOS0zMi44IDguNS00NC4yIDIxLjF6TTExNi42IDE1MC43TDIyMy40IDMyIDE4My44IDMyYy0yNS41IDAtNDkuOSAxMC4xLTY3LjkgMjguMUwwIDE5MiAwIDU0NCAxNDQgNDA4IDE1Ni40IDQxOC4zYzIzIDE5LjIgNTIgMjkuNyA4MS45IDI5LjdsMTUuNyAwLTctN2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDQxIDQxIDkgMGMxOS4xIDAgMzcuOC00LjMgNTQuOC0xMi4zTDM1OSA0MDljLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGwzMiAzMiAxNy41LTE3LjVjOC45LTguOSAxMS41LTIxLjggNy42LTMzLjFsLTEzNy45LTEzNi44LTE0LjkgMTQuOWMtNDkuMyA0OS4zLTEyOS4xIDQ5LjMtMTc4LjQgMC0yMy0yMy0yMy45LTU5LjktMi4yLTg0eiJdCiAgICB9OwogICAgZmFIYW5kc0hlbHBpbmcgPSBmYUhhbmRzaGFrZUFuZ2xlOwogICAgZmFBcnJvd0Rvd24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctZG93biIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzg1OTVdLCAiZjA2MyIsICJNMTY5LjQgNTAyLjZjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsMTYwLTE2MGMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMEwyMjQgNDAyLjcgMjI0IDMyYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMzcwLjctMTA1LjQtMTA1LjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zbDE2MCAxNjB6Il0KICAgIH07CiAgICBmYUxvY2F0aW9uRG90ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxvY2F0aW9uLWRvdCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJtYXAtbWFya2VyLWFsdCJdLCAiZjNjNSIsICJNMCAxODguNkMwIDg0LjQgODYgMCAxOTIgMFMzODQgODQuNCAzODQgMTg4LjZjMCAxMTkuMy0xMjAuMiAyNjIuMy0xNzAuNCAzMTYuOC0xMS44IDEyLjgtMzEuNSAxMi44LTQzLjMgMC01MC4yLTU0LjUtMTcwLjQtMTk3LjUtMTcwLjQtMzE2Ljh6TTE5MiAyNTZhNjQgNjQgMCAxIDAgMC0xMjggNjQgNjQgMCAxIDAgMCAxMjh6Il0KICAgIH07CiAgICBmYU1hcE1hcmtlckFsdCA9IGZhTG9jYXRpb25Eb3Q7CiAgICBmYVBsdWdDaXJjbGVFeGNsYW1hdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwbHVnLWNpcmNsZS1leGNsYW1hdGlvbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTVkIiwgIk0xOTItMzJjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA5NiAxMjggMCAwLTk2YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCA5NiA2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybDAgNDguN2MtOTguNiA4LjEtMTc2IDkwLjctMTc2IDE5MS4zIDAgMjcuMyA1LjcgNTMuMyAxNiA3Ni45bDAgMy4xYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNjYuN0MxNjUuMiAzOTguMSA5NiAzMTkuMSA5NiAyMjRsMC02NGMtMTcuNyAwLTMyLTE0LjMtMzItMzJTNzguMyA5NiA5NiA5Nmw2NCAwIDAtOTZjMC0xNy43IDE0LjMtMzIgMzItMzJ6TTQ5NiAyNTZhMTQ0IDE0NCAwIDEgMSAwIDI4OCAxNDQgMTQ0IDAgMSAxIDAtMjg4em0wIDIyOGEyMCAyMCAwIDEgMCAwLTQwIDIwIDIwIDAgMSAwIDAgNDB6bTAtMTgwYy04LjggMC0xNiA3LjItMTYgMTZsMCA4MGMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtODBjMC04LjgtNy4yLTE2LTE2LTE2eiJdCiAgICB9OwogICAgZmFDb29raWVCaXRlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvb2tpZS1iaXRlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1NjQiLCAiTTI1Ny41IDI3LjZjLS44LTUuNC00LjktOS44LTEwLjMtMTAuNi0yMi4xLTMuMS00NC42IC45LTY0LjQgMTEuNGwtNzQgMzkuNUM4OS4xIDc4LjQgNzMuMiA5NC45IDYzLjQgMTE1TDI2LjcgMTkwLjZjLTkuOCAyMC4xLTEzIDQyLjktOS4xIDY0LjlsMTQuNSA4Mi44YzMuOSAyMi4xIDE0LjYgNDIuMyAzMC43IDU3LjlsNjAuMyA1OC40YzE2LjEgMTUuNiAzNi42IDI1LjYgNTguNyAyOC43bDgzIDExLjdjMjIuMSAzLjEgNDQuNi0uOSA2NC40LTExLjRsNzQtMzkuNWMxOS43LTEwLjUgMzUuNi0yNyA0NS40LTQ3LjJsMzYuNy03NS41YzkuOC0yMC4xIDEzLTQyLjkgOS4xLTY0LjktLjktNS4zLTUuMy05LjMtMTAuNi0xMC4xLTUxLjUtOC4yLTkyLjgtNDcuMS0xMDQuNS05Ny40LTEuOC03LjYtOC0xMy40LTE1LjctMTQuNi01NC42LTguNy05Ny43LTUyLTEwNi4yLTEwNi44ek0yMDggMTQ0YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHpNMTQ0IDMzNmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0yMjQtNjRhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFTY3Jld2RyaXZlcldyZW5jaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzY3Jld2RyaXZlci13cmVuY2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsidG9vbHMiXSwgImY3ZDkiLCAiTTcwLjgtNi43YzUuNC01LjQgMTMuOC02LjIgMjAuMi0yTDIwOS45IDcwLjVjOC45IDUuOSAxNC4yIDE1LjkgMTQuMiAyNi42bDAgNDkuNiA5MC44IDkwLjhjMzMuMy0xNSA3My45LTguOSAxMDEuMiAxOC41TDU0Mi4yIDM4Mi4xYzE4LjcgMTguNyAxOC43IDQ5LjEgMCA2Ny45bC02MC4xIDYwLjFjLTE4LjcgMTguNy00OS4xIDE4LjctNjcuOSAwTDI4OC4xIDM4NGMtMjcuNC0yNy40LTMzLjUtNjcuOS0xOC41LTEwMS4ybC05MC44LTkwLjgtNDkuNiAwYy0xMC43IDAtMjAuNy01LjMtMjYuNi0xNC4yTDIzLjQgNTguOWMtNC4yLTYuMy0zLjQtMTQuOCAyLTIwLjJMNzAuOC02Ljd6bTE0NSAzMDMuNWMtNi4zIDM2LjkgMi4zIDc1LjkgMjYuMiAxMDcuMmwtOTQuOSA5NWMtMjguMSAyOC4xLTczLjcgMjguMS0xMDEuOCAwcy0yOC4xLTczLjcgMC0xMDEuOGwxMzUuNC0xMzUuNSAzNS4yIDM1LjF6TTM4NC4xIDBjMjAuMSAwIDM5LjQgMy43IDU3LjEgMTAuNSAxMCAzLjggMTEuOCAxNi41IDQuMyAyNC4xTDM4OC44IDkxLjNjLTMgMy00LjcgNy4xLTQuNyAxMS4zbDAgNDEuNGMwIDguOCA3LjIgMTYgMTYgMTZsNDEuNCAwYzQuMiAwIDguMy0xLjcgMTEuMy00LjdsNTYuNy01Ni43YzcuNi03LjUgMjAuMy01LjcgMjQuMSA0LjMgNi44IDE3LjcgMTAuNSAzNyAxMC41IDU3LjEgMCA0My4yLTE3LjIgODIuMy00NSAxMTEuMWwtNDkuMS00OS4xYy0zMy4xLTMzLTc4LjUtNDUuNy0xMjEuMS0zOC40bC01Ni44LTU2LjggMC0yOS43LS4yLTVjLS44LTEyLjQtNC40LTI0LjMtMTAuNS0zNC45IDI5LjQtMzUgNzMuNC01Ny4yIDEyMi43LTU3LjN6Il0KICAgIH07CiAgICBmYVRvb2xzID0gZmFTY3Jld2RyaXZlcldyZW5jaDsKICAgIGZhSW5kZW50ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImluZGVudCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMDNjIiwgIk0wIDY0QzAgNDYuMyAxNC4zIDMyIDMyIDMybDM4NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDk2QzE0LjMgOTYgMCA4MS43IDAgNjR6TTE5MiAxOTJjMC0xNy43IDE0LjMtMzIgMzItMzJsMTkyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTE5MiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnptMzIgOTZsMTkyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTE5MiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMyek0wIDQ0OGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzODQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA0ODBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyek0xMjcuOCAyNjguNkwyNS44IDM0Ny45QzE1LjMgMzU2LjEgMCAzNDguNiAwIDMzNS4zTDAgMTc2LjdjMC0xMy4zIDE1LjMtMjAuOCAyNS44LTEyLjZsMTAxLjkgNzkuM2M4LjIgNi40IDguMiAxOC45IDAgMjUuM3oiXQogICAgfTsKICAgIGZhQmFycyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYXJzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbIm5hdmljb24iXSwgImYwYzkiLCAiTTAgOTZDMCA3OC4zIDE0LjMgNjQgMzIgNjRsMzg0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgMTI4QzE0LjMgMTI4IDAgMTEzLjcgMCA5NnpNMCAyNTZjMC0xNy43IDE0LjMtMzIgMzItMzJsMzg0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgMjg4Yy0xNy43IDAtMzItMTQuMy0zMi0zMnpNNDQ4IDQxNmMwIDE3LjctMTQuMyAzMi0zMiAzMkwzMiA0NDhjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMzg0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJ6Il0KICAgIH07CiAgICBmYU5hdmljb24gPSBmYUJhcnM7CiAgICBmYUhhbmRzUHJheWluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kcy1wcmF5aW5nIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbInByYXlpbmctaGFuZHMiXSwgImY2ODQiLCAiTTIyNCAyOTZjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0xMTIuNiA4OC4yLTExOS43YzEzLjEtMTcuOCA5LjMtNDIuOC04LjUtNTUuOXMtNDIuOC05LjMtNTUuOSA4LjVMMTA2LjUgMTQyLjlDODkuMyAxNjYuMiA4MCAxOTQuNSA4MCAyMjMuNmwwIDExMC43LTU4LjEgMTkuNEM4LjggMzU4IDAgMzcwLjIgMCAzODRsMCA5NmMwIDEwIDQuNyAxOS41IDEyLjcgMjUuNXMxOC40IDggMjguMSA1LjJsMTU0LjQtNDQuMWM1NS0xNS43IDkyLjgtNjUuOSA5Mi44LTEyMy4xTDI4OCAyMjRjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA3MnptMTkyIDBsMC03MmMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDExOS42YzAgNTcuMiAzNy45IDEwNy40IDkyLjggMTIzLjFsMTU0LjQgNDQuMWM5LjcgMi44IDIwIC44IDI4LjEtNS4yUzY0MCA0OTAgNjQwIDQ4MGwwLTk2YzAtMTMuOC04LjgtMjYtMjEuOS0zMC40bC01OC4xLTE5LjQgMC0xMTAuN2MwLTI5LTkuMy01Ny4zLTI2LjUtODAuN0w0NDAuMiAxNi4zQzQyNy4xLTEuNSA0MDIuMS01LjMgMzg0LjMgNy44cy0yMS42IDM4LjEtOC41IDU1LjlMNDY0IDE4My40IDQ2NCAyOTZjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjR6Il0KICAgIH07CiAgICBmYVByYXlpbmdIYW5kcyA9IGZhSGFuZHNQcmF5aW5nOwogICAgZmFWaXJ1c2VzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZpcnVzZXMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTA3NiIsICJNMTkyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzIgMCAzMC41IDM2LjkgNDUuOCA1OC41IDI0LjIgMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM2MtMjEuNiAyMS42LTYuMyA1OC41IDI0LjIgNTguNSAxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmMtMzAuNSAwLTQ1LjggMzYuOS0yNC4yIDU4LjUgMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNzLTMyLjggMTIuNS00NS4zIDBjLTIxLjYtMjEuNi01OC41LTYuMy01OC41IDI0LjIgMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJjMC0zMC41LTM2LjktNDUuOC01OC41LTI0LjItMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNDNzcuOCAyNjAuOSA2Mi41IDIyNCAzMiAyMjQgMTQuMyAyMjQgMCAyMDkuNyAwIDE5MnMxNC4zLTMyIDMyLTMyYzMwLjUgMCA0NS44LTM2LjkgMjQuMi01OC41LTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zczMyLjgtMTIuNSA0NS4zIDBDMTIzLjEgNzcuOCAxNjAgNjIuNSAxNjAgMzIgMTYwIDE0LjMgMTc0LjMgMCAxOTIgMHpNMTQ0IDE3NmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6bTEyOCA2NGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem0yNDggNDBjMCAyMi45IDI3LjcgMzQuNCA0My45IDE4LjIgOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45Yy0xNi4yIDE2LjItNC43IDQzLjkgMTguMiA0My45IDEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0Yy0yMi45IDAtMzQuNCAyNy43LTE4LjIgNDMuOSA5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwYy0xNi4yLTE2LjItNDMuOS00LjctNDMuOSAxOC4yIDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtMjIuOS0yNy43LTM0LjQtNDMuOS0xOC4yLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjljMTYuMi0xNi4yIDQuNy00My45LTE4LjItNDMuOS0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0YzIyLjkgMCAzNC40LTI3LjcgMTguMi00My45LTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGMxNi4yIDE2LjIgNDMuOSA0LjcgNDMuOS0xOC4yIDAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjR6TTUwNCAzODRhMjQgMjQgMCAxIDAgLTQ4IDAgMjQgMjQgMCAxIDAgNDggMHoiXQogICAgfTsKICAgIGZhU2Nob29sRmxhZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzY2hvb2wtZmxhZyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTZlIiwgIk0yNTYtOGMwLTEzLjMgMTAuNy0yNCAyNC0yNGwxMTIgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0bC03MiAwIDAgMTkuMiAxMjggNzYuOCA2NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjI0YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAyMjRjMC0zNS4zIDI4LjctNjQgNjQtNjRsNjQgMCAxMjgtNzYuOCAwLTkxLjJ6TTI0MCAzODRsMCA4MCA5NiAwIDAtODBjMC0yNi41LTIxLjUtNDgtNDgtNDhzLTQ4IDIxLjUtNDggNDh6TTExMiA0MTZjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMHptMTYtMTQ0bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZ6TTQ5NiA0MTZjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMHptMTYtMTQ0bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZ6bS0yMjQgMGE0OCA0OCAwIDEgMCAwLTk2IDQ4IDQ4IDAgMSAwIDAgOTZ6Il0KICAgIH07CiAgICBmYVRyYWRlbWFyayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cmFkZW1hcmsiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFs4NDgyXSwgImYyNWMiLCAiTTM0Ni42IDExMC4yYy03LjgtMTEuNy0yMi40LTE3LTM1LjktMTIuOVMyODggMTEzLjkgMjg4IDEyOGwwIDI1NmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTUwLjMgNjkuNCAxMDQuMWM1LjkgOC45IDE1LjkgMTQuMiAyNi42IDE0LjJzMjAuNy01LjMgMjYuNi0xNC4yTDU0NCAyMzMuNyA1NDQgMzg0YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yNTZjMC0xNC4xLTkuMi0yNi41LTIyLjctMzAuNnMtMjguMSAxLjEtMzUuOSAxMi45TDQ0OCAyNjIuMyAzNDYuNiAxMTAuMnpNMzIgOTZDMTQuMyA5NiAwIDExMC4zIDAgMTI4czE0LjMgMzIgMzIgMzJsNjQgMCAwIDIyNGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjI0IDY0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgOTZ6Il0KICAgIH07CiAgICBmYUZpcmVCdXJuZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlyZS1idXJuZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTRmMSIsICJNMjgxLjcgNDguM0wyOTQgMzQuNWM1LjQtNi4xIDEzLjMtOC44IDIwLjktOC45IDcuMiAwIDE0LjMgMi42IDE5LjkgNy44IDE5LjcgMTguMyAzOS44IDQzLjIgNTUgNzAuNiAxNS4xIDI3LjIgMjYuMiA1OC4xIDI2LjIgODguMSAwIDg4LjctNzEuMyAxNTkuOC0xNjAgMTU5LjgtODkuNiAwLTE2MC03MS4zLTE2MC0xNTkuOCAwLTM3LjMgMTYtNzMuNCAzNi44LTEwNC41IDIwLjktMzEuMyA0Ny41LTU5IDcwLjktODAuMiA1LjctNS4yIDEzLjEtNy43IDIwLjMtNy41czEzLjQgMy4yIDE4LjggNy41YzE0LjQgMTEuNCAzOC45IDQwLjcgMzguOSA0MC43ek0zMjAgMjQwLjJjMC0zNi41LTM3LTczLTU0LjgtODguNC01LjQtNC43LTEzLjEtNC43LTE4LjUgMC0xNy43IDE1LjQtNTQuOCA1MS45LTU0LjggODguNCAwIDM1LjMgMjguNyA2NCA2NCA2NHM2NC0yOC43IDY0LTY0ek05Mi44IDMyMGMzNy43IDQ4LjMgOTYuMSA4MCAxNjMuMiA4MCA2Ni41IDAgMTI1LjEtMzEuNyAxNjMtODBsNDUgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDY0YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDQ4IDQ4MGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC02NGMwLTI2LjUgMjEuNS00OCA0OC00OGw0NC44IDB6TTQ1NiA0MDBhMjQgMjQgMCAxIDAgLTQ4IDAgMjQgMjQgMCAxIDAgNDggMHoiXQogICAgfTsKICAgIGZhRmFjZVNtaWxlQmVhbTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1zbWlsZS1iZWFtIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTIyLCAic21pbGUtYmVhbSJdLCAiZjViOCIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTE2NS40IDMyMS45YzIwLjQgMjggNTMuNCA0Ni4xIDkwLjYgNDYuMXM3MC4yLTE4LjEgOTAuNi00Ni4xYzcuOC0xMC43IDIyLjgtMTMuMSAzMy41LTUuM3MxMy4xIDIyLjggNS4zIDMzLjVDMzU2LjMgMzkwIDMwOS4yIDQxNiAyNTYgNDE2cy0xMDAuMy0yNi0xMjkuNC02NS45Yy03LjgtMTAuNy01LjQtMjUuNyA1LjMtMzMuNXMyNS43LTUuNCAzMy41IDUuM3pNMTc2IDE4MGMtMTUuNSAwLTI4IDEyLjUtMjggMjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0zNy42IDMwLjQtNjggNjgtNjhzNjggMzAuNCA2OCA2OGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTE1LjUtMTIuNS0yOC0yOC0yOHptMTMyIDI4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMzcuNiAzMC40LTY4IDY4LTY4czY4IDMwLjQgNjggNjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0xNS41LTEyLjUtMjgtMjgtMjhzLTI4IDEyLjUtMjggMjh6Il0KICAgIH07CiAgICBmYVNtaWxlQmVhbTIgPSBmYUZhY2VTbWlsZUJlYW0yOwogICAgZmFUZW50QXJyb3dMZWZ0UmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGVudC1hcnJvdy1sZWZ0LXJpZ2h0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1N2YiLCAiTS0uNSAxMTNjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45bDcyLTcyYzkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOWwtMzEgMzEgMzEwLjEgMCA1NC4xIDAtMzEtMzFjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGw3MiA3MmM5LjQgOS40IDkuNCAyNC42IDAgMzMuOWwtNzIgNzJjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsMzEtMzEtMTAyLjEgMC0uMSAwLTI2MiAwIDMxIDMxYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTcyLTcyek0zNy4xIDQ3Nkw2MC4zIDI5Mi42YzEuMi05LjcgNi44LTE4LjMgMTUuMS0yMy4zTDIzOC44IDE3MGMxMC4yLTYuMiAyMi45LTYuMiAzMy4xLS4xbDE2NS41IDk5LjRjOC40IDUgMTQgMTMuNyAxNS4zIDIzLjRMNDc1LjkgNDc2YzIuNCAxOS4xLTEyLjUgMzYtMzEuNyAzNmwtNzEuOSAwYy0xMi4xIDAtMjMuMi02LjgtMjguNi0xNy43TDI3NS40IDM1Ny45Yy0xLjgtMy42LTUuNS01LjktOS41LTUuOS01LjkgMC0xMC42IDQuNy0xMC42IDEwLjZsMCAxMTcuNGMwIDE3LjctMTQuMyAzMi0zMiAzMkw2OC44IDUxMmMtMTkuMyAwLTM0LjItMTYuOS0zMS43LTM2eiJdCiAgICB9OwogICAgZmFSb3V0ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyb3V0ZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNGQ3IiwgIk01MTIgOTZjMCA1MC4yLTU5LjEgMTI1LjEtODQuNiAxNTUtMy44IDQuNC05LjQgNi4xLTE0LjUgNUwzMjAgMjU2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDk2IDBjNTMgMCA5NiA0MyA5NiA5NnMtNDMgOTYtOTYgOTZsLTI3Ni40IDBjOC43LTkuOSAxOS4zLTIyLjYgMzAtMzYuOCA2LjMtOC40IDEyLjgtMTcuNiAxOS0yNy4yTDQxNiA0NDhjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTk2IDBjLTUzIDAtOTYtNDMtOTYtOTZzNDMtOTYgOTYtOTZsMzkuOCAwYy0yMS0zMS41LTM5LjgtNjcuNy0zOS44LTk2IDAtNTMgNDMtOTYgOTYtOTZzOTYgNDMgOTYgOTZ6TTExNy4xIDQ4OS4xYy0zLjggNC4zLTcuMiA4LjEtMTAuMSAxMS4zbC0xLjggMi0uMi0uMmMtNiA0LjYtMTQuNiA0LTIwLTEuOC0yNS4yLTI3LjQtODUtOTcuOS04NS0xNDguNCAwLTUzIDQzLTk2IDk2LTk2czk2IDQzIDk2IDk2YzAgMzAtMjEuMSA2Ny00My41IDk3LjktMTAuNyAxNC43LTIxLjcgMjgtMzAuOCAzOC41bC0uNiAuN3pNMTI4IDM1MmEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwek00MTYgMTI4YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHoiXQogICAgfTsKICAgIGZhQW5nbGVzVXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYW5nbGVzLXVwIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbImFuZ2xlLWRvdWJsZS11cCJdLCAiZjEwMiIsICJNMjE0LjYgNDEuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTE2MCAxNjBjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBMMTkyIDEwOS4zIDMyOS40IDI0Ni42YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTE2MC0xNjB6bTE2MCAzNTJsLTE2MC0xNjBjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwbC0xNjAgMTYwYy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwTDE5MiAzMDEuMyAzMjkuNCA0MzguNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zeiJdCiAgICB9OwogICAgZmFBbmdsZURvdWJsZVVwID0gZmFBbmdsZXNVcDsKICAgIGZhQnVja2V0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJ1Y2tldCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNGNmIiwgIk00NDMuNyAyMDhjMi43IDQuNyA0LjMgMTAuMiA0LjMgMTYgMCAxNy43LTE0LjMgMzItMzIgMzJsLTUuMSAwLTIyLjQgMjEzYy0yLjYgMjQuNC0yMy4yIDQzLTQ3LjggNDNsLTIzMy42IDBjLTI0LjYgMC00NS4yLTE4LjUtNDcuOC00M0wzNy4xIDI1NiAzMiAyNTZjLTE3LjcgMC0zMi0xNC4zLTMyLTMyIDAtNS44IDEuNi0xMS4zIDQuMy0xNmw0MzkuNCAwek0yMjQtMTZjNzkuNSAwIDE0NCA2NC41IDE0NCAxNDRsMCAzMi00OCAwIDAtMzJjMC01My00My05Ni05Ni05NnMtOTYgNDMtOTYgOTZsMCAzMi00OCAwIDAtMzJDODAgNDguNSAxNDQuNS0xNiAyMjQtMTZ6Il0KICAgIH07CiAgICBmYUxlc3NUaGFuRXF1YWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGVzcy10aGFuLWVxdWFsIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY1MzciLCAiTTQyNi4xIDk0LjRjMTYuOC01LjYgMjUuOC0yMy43IDIwLjItNDAuNXMtMjMuNy0yNS44LTQwLjUtMjAuMmwtMzg0IDEyOEM4LjggMTY2IDAgMTc4LjIgMCAxOTJzOC44IDI2IDIxLjkgMzAuNGwzODQgMTI4YzE2LjggNS42IDM0LjktMy41IDQwLjUtMjAuMnMtMy41LTM0LjktMjAuMi00MC41TDEzMy4yIDE5MiA0MjYuMSA5NC40ek0zMiA0MTZjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzg0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgNDE2eiJdCiAgICB9OwogICAgZmFGb2xkZXJDbG9zZWQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZvbGRlci1jbG9zZWQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTE4NSIsICJNNDQ4IDQ0OEw2NCA0NDhjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMTc2IDUxMiAwIDAgMTc2YzAgMzUuMy0yOC43IDY0LTY0IDY0em02NC0yODhMMCAxNjAgMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwxMzguNyAwYzEzLjggMCAyNy4zIDQuNSAzOC40IDEyLjhsMzguNCAyOC44YzUuNSA0LjIgMTIuMyA2LjQgMTkuMiA2LjRMNDQ4IDgwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMTZ6Il0KICAgIH07CiAgICBmYVBlcnNvblRocm91Z2hXaW5kb3cgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLXRocm91Z2gtd2luZG93IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1YTkiLCAiTTY0IDY0bDIyNCAwIDAgOS44YzAgMzktMjMuNyA3NC01OS45IDg4LjQtNjAuNSAyNC4yLTEwMC4xIDgyLjctMTAwLjEgMTQ3LjlsMCA3My44LTY0IDAgMC0zMjB6bTI4OCAwbDIyNCAwIDAgMzIwLTY3LjcgMC0zLjctNC41LTc1LjItOTAuMmMtOS4xLTEwLjktMjIuNi0xNy4zLTM2LjktMTcuM2wtNzEuMSAwLTQxLTYzLjFjLS4zLS41LS42LTEtMS0xLjQgNDQuNy0yOSA3Mi41LTc5IDcyLjUtMTMzLjZsMC05Ljh6bTczIDMyMGwtMjYuNiAwIDQyLjcgNjQgMTUwLjkgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTM1MmMwLTI2LjUtMjEuNS00OC00OC00OEw0OCAwQzIxLjUgMCAwIDIxLjUgMCA0OEwwIDQwMGMwIDI2LjUgMjEuNSA0OCA0OCA0OGwyNjAuMiAwIDMzLjIgNDkuOGM5LjggMTQuNyAyOS43IDE4LjcgNDQuNCA4LjlzMTguNy0yOS43IDguOS00NC40bC04NC4yLTEyNi4yIDc0LjYgMCA0MCA0OHptLTE1OS41IDBsLTczLjUgMCAwLTczLjhjMC0xMC4yIDEuNi0yMC4xIDQuNy0yOS41TDI2NS41IDM4NHpNMTkyIDEyOGE0OCA0OCAwIDEgMCAtOTYgMCA0OCA0OCAwIDEgMCA5NiAweiJdCiAgICB9OwogICAgZmFTY2hvb2xMb2NrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNjaG9vbC1sb2NrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NmYiLCAiTTAgMTkyYzAtMzUuMyAyOC43LTY0IDY0LTY0bDY0IDAgMTI3LjktMTE1LjFjMTguMy0xNi40IDQ2LTE2LjQgNjQuMiAwTDQ0OCAxMjggNTEyIDEyOGMzMyAwIDYwLjIgMjUgNjMuNiA1Ny4yLTE0LjctNS45LTMwLjgtOS4yLTQ3LjYtOS4yLTcwLjcgMC0xMjggNTcuMy0xMjggMTI4bDAgMjQuNGMtMTkuNiAxNy42LTMyIDQzLjEtMzIgNzEuNWwwIDk2YzAgNS41IC41IDEwLjkgMS4zIDE2LjFMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDE5MnpNMzMyLjMgMzQxLjVjLTYtMy41LTEyLjktNS41LTIwLjMtNS41bC00OCAwYy0yMi4xIDAtNDAgMTcuOS00MCA0MGwwIDg4IDk2IDAgMC02NC4xYzAtMjAuOCA0LjQtNDAuNSAxMi4zLTU4LjR6TTExMiAzODRjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMHptMTYtMTQ0bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZ6bTIyNC00OGE2NCA2NCAwIDEgMCAtMTI4IDAgNjQgNjQgMCAxIDAgMTI4IDB6TTU2MCAzNTJsMC00Ny45YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgNDcuOSA2NCAwem0tMTEyIDIuN2wwLTUwLjZjMC00NC4yIDM1LjgtODAgODAtODBzODAgMzUuOCA4MCA4MGwwIDUwLjZjMTguNiA2LjYgMzIgMjQuNCAzMiA0NS4zbDAgOTZjMCAyNi41LTIxLjUgNDgtNDggNDhsLTEyOCAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTk2YzAtMjAuOSAxMy40LTM4LjcgMzItNDUuM3oiXQogICAgfTsKICAgIGZhUGVyc29uQnVyc3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLWJ1cnN0IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1M2IiLCAiTTIwNCA0MC4xYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTQ4YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA0OGMwIDEzLjMtMTAuNyAyNC0yNCAyNHpNNCAxNDQuMWMwLTEzLjMgMTAuNy0yNCAyNC0yNGw0OCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC00OCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHpNOTYuNSAyODUuNWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWwzMy45LTMzLjljOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45TDk2LjUgMjg1LjV6TTYyLjYgMi43YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwbDMzLjkgMzMuOWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwTDYyLjYgMzYuNmMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjl6TTM1Mi40LTMyYTU2IDU2IDAgMSAxIDAgMTEyIDU2IDU2IDAgMSAxIDAtMTEyek00NzguNyAyOTkuMWwtNDYuMy02Mi40IDAgMjc1LjNjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xNjBjMC04LjgtNy4yLTE2LTE2LTE2cy0xNiA3LjItMTYgMTZsMCAxNjBjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0yNzUuMy00Ni4zIDYyLjRjLTEwLjUgMTQuMi0zMC42IDE3LjItNDQuOCA2LjZzLTE3LjItMzAuNi02LjYtNDQuOGw3MC41LTk1YzI1LjItMzMuOSA2NS01My45IDEwNy4yLTUzLjlzODIgMjAgMTA3LjIgNTMuOWw3MC41IDk1YzEwLjUgMTQuMiA3LjYgMzQuMi02LjYgNDQuOHMtMzQuMiA3LjYtNDQuOC02LjZ6Il0KICAgIH07CiAgICBmYUxlZnRMb25nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxlZnQtbG9uZyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJsb25nLWFycm93LWFsdC1sZWZ0Il0sICJmMzBhIiwgIk05LjQgMjc4LjZjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zbDEyOC0xMjhjOS4yLTkuMiAyMi45LTExLjkgMzQuOS02LjlTMTkyIDExNS4xIDE5MiAxMjhsMCA2NCAzMzYgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDMyYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0zMzYgMCAwIDY0YzAgMTIuOS03LjggMjQuNi0xOS44IDI5LjZzLTI1LjcgMi4yLTM0LjktNi45bC0xMjgtMTI4eiJdCiAgICB9OwogICAgZmFMb25nQXJyb3dBbHRMZWZ0ID0gZmFMZWZ0TG9uZzsKICAgIGZhTG9jYXRpb25Dcm9zc2hhaXJzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxvY2F0aW9uLWNyb3NzaGFpcnMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsibG9jYXRpb24iXSwgImY2MDEiLCAiTTI4OC0xNmMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDE4LjNjOTguMSAxNCAxNzUuNyA5MS42IDE4OS43IDE4OS43bDE4LjMgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTguMyAwYy0xNCA5OC4xLTkxLjYgMTc1LjctMTg5LjcgMTg5LjdsMCAxOC4zYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTguM0MxNTcuOSA0NjMuNyA4MC4zIDM4Ni4xIDY2LjMgMjg4TDQ4IDI4OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxOC4zIDBDODAuMyAxMjUuOSAxNTcuOSA0OC4zIDI1NiAzNC4zTDI1NiAxNmMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNMTI4IDI1NmExNjAgMTYwIDAgMSAwIDMyMCAwIDE2MCAxNjAgMCAxIDAgLTMyMCAwem0xNjAtOTZhOTYgOTYgMCAxIDEgMCAxOTIgOTYgOTYgMCAxIDEgMC0xOTJ6Il0KICAgIH07CiAgICBmYUxvY2F0aW9uID0gZmFMb2NhdGlvbkNyb3NzaGFpcnM7CiAgICBmYVBlcnNvbkRvdHNGcm9tTGluZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tZG90cy1mcm9tLWxpbmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiZGlhZ25vc2VzIl0sICJmNDcwIiwgIk0xODQgNzJhNzIgNzIgMCAxIDEgMTQ0IDAgNzIgNzIgMCAxIDEgLTE0NCAwek0xNjAgMjk5LjNjLTE5LjkgMjIuNi0zMiA1Mi4yLTMyIDg0LjdsMCAzMi02NCAwIDAtMzJjMC0xMDYgODYtMTkyIDE5Mi0xOTJzMTkyIDg2IDE5MiAxOTJsMCAzMi02NCAwIDAtMzJjMC0zMi41LTEyLjEtNjIuMS0zMi04NC43bDAgMTE2LjctMTkyIDAgMC0xMTYuN3pNMjMyIDM4NGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6bTg4LTEwNGEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAwek0yNCA0NjRsNDY0IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRMMjQgNTEyYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0ek02NCAxODRhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHptNDI0IDcyYTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHoiXQogICAgfTsKICAgIGZhRGlhZ25vc2VzID0gZmFQZXJzb25Eb3RzRnJvbUxpbmU7CiAgICBmYUdhdWdlU2ltcGxlSGlnaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnYXVnZS1zaW1wbGUtaGlnaCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYxNjY4LCAidGFjaG9tZXRlciIsICJ0YWNob21ldGVyLWZhc3QiXSwgImY2MmEiLCAiTTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTMyMCA5NmMwLTE2LjItNi0zMS4xLTE2LTQyLjNsNjkuNS0xMzguOWM1LjktMTEuOSAxLjEtMjYuMy0xMC43LTMyLjJzLTI2LjMtMS4xLTMyLjIgMTAuN0wyNjEuMSAyODguMmMtMS43LS4xLTMuNC0uMi01LjEtLjItMzUuMyAwLTY0IDI4LjctNjQgNjRzMjguNyA2NCA2NCA2NCA2NC0yOC43IDY0LTY0eiJdCiAgICB9OwogICAgZmFUYWNob21ldGVyID0gZmFHYXVnZVNpbXBsZUhpZ2g7CiAgICBmYVRhY2hvbWV0ZXJGYXN0ID0gZmFHYXVnZVNpbXBsZUhpZ2g7CiAgICBmYUFuZ2xlc0xlZnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYW5nbGVzLWxlZnQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxNzEsICJhbmdsZS1kb3VibGUtbGVmdCJdLCAiZjEwMCIsICJNOS40IDIzMy40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM2wxNjAgMTYwYzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNMNzcuMyAyNTYgMjE0LjYgMTE4LjZjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBsLTE2MCAxNjB6bTM1Mi0xNjBsLTE2MCAxNjBjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zbDE2MCAxNjBjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBzMTIuNS0zMi44IDAtNDUuM0wyNjkuMyAyNTYgNDA2LjYgMTE4LjZjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDB6Il0KICAgIH07CiAgICBmYUFuZ2xlRG91YmxlTGVmdCA9IGZhQW5nbGVzTGVmdDsKICAgIGZhVXBEb3duID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVwLWRvd24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs4NTk3LCAxMTAyMSwgImFycm93cy1hbHQtdiJdLCAiZjMzOCIsICJNNDA2LjYgNTAyLjZsOTYtOTZjOS4yLTkuMiAxMS45LTIyLjkgNi45LTM0LjlTNDkyLjkgMzUyIDQ4MCAzNTJsLTY0IDAgMC0zMjBjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAzMjAtNjQgMGMtMTIuOSAwLTI0LjYgNy44LTI5LjYgMTkuOHMtMi4yIDI1LjcgNi45IDM0LjlsOTYgOTZjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDB6TTE1MC42IDkuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTk2IDk2Yy05LjIgOS4yLTExLjkgMjIuOS02LjkgMzQuOVMxOS4xIDE2MCAzMiAxNjBsNjQgMCAwIDMyMGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzIwIDY0IDBjMTIuOSAwIDI0LjYtNy44IDI5LjYtMTkuOHMyLjItMjUuNy02LjktMzQuOWwtOTYtOTZ6Il0KICAgIH07CiAgICBmYUFycm93c0FsdFYgPSBmYVVwRG93bjsKICAgIGZhQmF0dGVyeUVtcHR5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhdHRlcnktZW1wdHkiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsiYmF0dGVyeS0wIl0sICJmMjQ0IiwgIk0xMTIgMTYwYy04LjggMC0xNiA3LjItMTYgMTZsMCAyMjRjMCA4LjggNy4yIDE2IDE2IDE2bDQxNiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTIyNGMwLTguOC03LjItMTYtMTYtMTZsLTQxNiAwek0zMiAxNzZjMC00NC4yIDM1LjgtODAgODAtODBsNDE2IDBjNDQuMiAwIDgwIDM1LjggODAgODBsMCA0OGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMybDAgNDhjMCA0NC4yLTM1LjggODAtODAgODBsLTQxNiAwYy00NC4yIDAtODAtMzUuOC04MC04MGwwLTIyNHoiXQogICAgfTsKICAgIGZhQmF0dGVyeTAgPSBmYUJhdHRlcnlFbXB0eTsKICAgIGZhS2V5Ym9hcmQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImtleWJvYXJkIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbOWUzXSwgImYxMWMiLCAiTTY0IDY0QzI4LjcgNjQgMCA5Mi43IDAgMTI4TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDQ0OCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDY0em0xNiA2NGwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2ek02NCAyNDBjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMnpNMTc2IDEyOGwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2ek0xNjAgMjQwYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJ6bTE2IDgwbDIyNCAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMjI0IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNnptODAtMTc2YzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJ6bTE2IDgwbDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZ6bTgwLTgwYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJ6bTE2IDgwbDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZ6bTgwLTgwYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJ6bTE2IDgwbDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZ6Il0KICAgIH07CiAgICBmYUNvb2tpZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjb29raWUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjc4NTBdLCAiZjU2MyIsICJNMjQ3LjIgMTdjLTIyLjEtMy4xLTQ0LjYgLjktNjQuNCAxMS40bC03NCAzOS41Qzg5LjEgNzguNCA3My4yIDk0LjkgNjMuNCAxMTVMMjYuNyAxOTAuNmMtOS44IDIwLjEtMTMgNDIuOS05LjEgNjQuOWwxNC41IDgyLjhjMy45IDIyLjEgMTQuNiA0Mi4zIDMwLjcgNTcuOWw2MC4zIDU4LjRjMTYuMSAxNS42IDM2LjYgMjUuNiA1OC43IDI4LjdsODMgMTEuN2MyMi4xIDMuMSA0NC42LS45IDY0LjQtMTEuNGw3NC0zOS41YzE5LjctMTAuNSAzNS42LTI3IDQ1LjQtNDcuMmwzNi43LTc1LjVjOS44LTIwLjEgMTMtNDIuOSA5LjEtNjQuOWwtMTQuNi04Mi44Yy0zLjktMjIuMS0xNC42LTQyLjMtMzAuNy01Ny45TDM4OC45IDU3LjVjLTE2LjEtMTUuNi0zNi42LTI1LjYtNTguNy0yOC43TDI0Ny4yIDE3ek0yMDggMTQ0YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHpNMTQ0IDMzNmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0yMjQtNjRhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFTdG9wd2F0Y2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3RvcHdhdGNoIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbOTIwMV0sICJmMmYyIiwgIk0xNjguNSAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDMyIDAgMCAyNS4zYy0xMDggMTEuOS0xOTIgMTAzLjUtMTkyIDIxNC43IDAgMTE5LjMgOTYuNyAyMTYgMjE2IDIxNnMyMTYtOTYuNyAyMTYtMjE2YzAtMzkuOC0xMC44LTc3LjEtMjkuNi0xMDkuMmwyOC4yLTI4LjJjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBsLTIzLjQgMjMuNGMtMzIuOS0zMC4yLTc1LjItNTAuMy0xMjItNTUuNWwwLTI1LjMgMzIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTEyIDB6bTgwIDE4NGwwIDEwNGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTEwNGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0eiJdCiAgICB9OwogICAgZmFFamVjdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJlamVjdCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzkxNjddLCAiZjA1MiIsICJNMjI0IDMyYzEzLjUgMCAyNi4zIDUuNiAzNS40IDE1LjZsMTc2IDE5MmMxMi45IDE0IDE2LjIgMzQuMyA4LjYgNTEuOFM0MTkgMzIwIDQwMCAzMjBMNDggMzIwYy0xOSAwLTM2LjMtMTEuMi00My45LTI4LjdzLTQuMy0zNy43IDguNi01MS44bDE3Ni0xOTJDMTk3LjcgMzcuNiAyMTAuNSAzMiAyMjQgMzJ6TTAgNDMyYzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDM1MiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4cy0yMS41IDQ4LTQ4IDQ4TDQ4IDQ4MGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDh6Il0KICAgIH07CiAgICBmYVNhdGVsbGl0ZURpc2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2F0ZWxsaXRlLWRpc2giLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgyMjVdLCAiZjdjMCIsICJNMjMyIDBjMTU0LjYgMCAyODAgMTI1LjQgMjgwIDI4MCAwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGMwLTEyOC4xLTEwMy45LTIzMi0yMzItMjMyLTEzLjMgMC0yNC0xMC43LTI0LTI0UzIxOC43IDAgMjMyIDB6TTIwOCAxMjBjMC0xMy4zIDEwLjctMjQgMjQtMjQgMTAxLjYgMCAxODQgODIuNCAxODQgMTg0IDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtNzUuMS02MC45LTEzNi0xMzYtMTM2LTEzLjMgMC0yNC0xMC43LTI0LTI0ek0yNi40IDE0Mi43YzguOC0xNy45IDMyLjQtMTkuOSA0Ni41LTUuOGwxMjguNSAxMjguNSAzMi0zMmMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zbC0zMiAzMiAxMjguNSAxMjguNWMxNC4xIDE0LjEgMTIgMzcuNi01LjggNDYuNS0zNC4yIDE2LjktNzIuNiAyNi40LTExMy4zIDI2LjQtMTQxLjQgMC0yNTYtMTE0LjYtMjU2LTI1NiAwLTQwLjcgOS41LTc5LjIgMjYuNC0xMTMuM3oiXQogICAgfTsKICAgIGZhRmFjZVJvbGxpbmdFeWVzMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLXJvbGxpbmctZXllcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU4MCwgIm1laC1yb2xsaW5nLWV5ZXMiXSwgImY1YTUiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0xOTIgMzUybDEyOCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xMjggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHptMzItMTI4YzAgMzUuMy0yOC43IDY0LTY0IDY0cy02NC0yOC43LTY0LTY0YzAtMjYgMTUuNS00OC40IDM3LjgtNTguNC0zLjcgNS4yLTUuOCAxMS42LTUuOCAxOC40IDAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJjMC02LjktMi4yLTEzLjItNS44LTE4LjQgMjIuMyAxMCAzNy44IDMyLjQgMzcuOCA1OC40em0xMjggNjRjLTM1LjMgMC02NC0yOC43LTY0LTY0IDAtMjYgMTUuNS00OC40IDM3LjgtNTguNC0zLjcgNS4yLTUuOCAxMS42LTUuOCAxOC40IDAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJjMC02LjktMi4yLTEzLjItNS44LTE4LjQgMjIuMyAxMCAzNy44IDMyLjQgMzcuOCA1OC40IDAgMzUuMy0yOC43IDY0LTY0IDY0eiJdCiAgICB9OwogICAgZmFNZWhSb2xsaW5nRXllczIgPSBmYUZhY2VSb2xsaW5nRXllczI7CiAgICBmYUxpc3RDaGVjayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsaXN0LWNoZWNrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInRhc2tzIl0sICJmMGFlIiwgIk0xMzMuOCAzNi4zYzEwLjkgNy42IDEzLjUgMjIuNiA1LjkgMzMuNGwtNTYgODBjLTQuMSA1LjgtMTAuNSA5LjUtMTcuNiAxMC4xUzUyIDE1OCA0NyAxNTNMNyAxMTNDLTIuMyAxMDMuNi0yLjMgODguNCA3IDc5UzMxLjYgNjkuNyA0MSA3OWwxOS44IDE5LjggMzkuNi01Ni42YzcuNi0xMC45IDIyLjYtMTMuNSAzMy40LTUuOXptMCAxNjBjMTAuOSA3LjYgMTMuNSAyMi42IDUuOSAzMy40bC01NiA4MGMtNC4xIDUuOC0xMC41IDkuNS0xNy42IDEwLjFTNTIgMzE4IDQ3IDMxM0w3IDI3M2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDE5LjggMTkuOCAzOS42LTU2LjZjNy42LTEwLjkgMjIuNi0xMy41IDMzLjQtNS45ek0yMjQgOTZjMC0xNy43IDE0LjMtMzIgMzItMzJsMjI0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTIyNCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnptMCAxNjBjMC0xNy43IDE0LjMtMzIgMzItMzJsMjI0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTIyNCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnpNMTYwIDQxNmMwLTE3LjcgMTQuMy0zMiAzMi0zMmwyODggMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMjg4IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyek02NCAzNzZhNDAgNDAgMCAxIDEgMCA4MCA0MCA0MCAwIDEgMSAwLTgweiJdCiAgICB9OwogICAgZmFUYXNrcyA9IGZhTGlzdENoZWNrOwogICAgZmFTYWNrWG1hcmsgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2Fjay14bWFyayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTZhIiwgIk0zMjggMTEybC0xNDQgMC0zNy4zLTc0LjVjLTEuOC0zLjYtMi43LTcuNi0yLjctMTEuNiAwLTE0LjMgMTEuNi0yNS45IDI1LjktMjUuOUwzNDIuMSAwYzE0LjMgMCAyNS45IDExLjYgMjUuOSAyNS45IDAgNC0uOSA4LTIuNyAxMS42TDMyOCAxMTJ6TTE2OS42IDE2MGwxNzIuOCAwIDQ4LjcgNDAuNkM0NTcuNiAyNTYgNDk2IDMzOCA0OTYgNDI0LjUgNDk2IDQ3Mi44IDQ1Ni44IDUxMiA0MDguNSA1MTJsLTMwNS4xIDBDNTUuMiA1MTIgMTYgNDcyLjggMTYgNDI0LjUgMTYgMzM4IDU0LjQgMjU2IDEyMC45IDIwMC42TDE2OS42IDE2MHpNMzIzLjkgMjg0LjFjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwbC0zMy45IDMzLjktMzMuOS0zMy45Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDMzLjkgMzMuOS0zMy45IDMzLjljLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMGwzMy45LTMzLjkgMzMuOSAzMy45YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtMzMuOS0zMy45IDMzLjktMzMuOWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXoiXQogICAgfTsKICAgIGZhSGFzaHRhZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYXNodGFnIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjIwOThdLCAiMjMiLCAiTTIxNC43IC43YzE3LjMgMy43IDI4LjMgMjAuNyAyNC42IDM4bC0xOS4xIDg5LjMgMTI2LjUgMCAyMi0xMDIuN0MzNzIuNCA4IDM4OS40LTMgNDA2LjcgLjdzMjguMyAyMC43IDI0LjYgMzhMNDEyLjIgMTI4IDQ4MCAxMjhjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTgxLjYgMC0yNy40IDEyOCA2Ny44IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTgxLjYgMC0yMiAxMDIuN2MtMy43IDE3LjMtMjAuNyAyOC4zLTM4IDI0LjZzLTI4LjMtMjAuNy0yNC42LTM4bDE5LjEtODkuMy0xMjYuNSAwLTIyIDEwMi43Yy0zLjcgMTcuMy0yMC43IDI4LjMtMzggMjQuNnMtMjguMy0yMC43LTI0LjYtMzhMOTkuOCAzODQgMzIgMzg0Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDgxLjYgMCAyNy40LTEyOC02Ny44IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsODEuNiAwIDIyLTEwMi43QzE4MC40IDggMTk3LjQtMyAyMTQuNyAuN3pNMjA2LjQgMTkybC0yNy40IDEyOCAxMjYuNSAwIDI3LjQtMTI4LTEyNi41IDB6Il0KICAgIH07CiAgICBmYVRyYWluID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRyYWluIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4NjQ2XSwgImYyMzgiLCAiTTAgOTZDMCA0MyA0MyAwIDk2IDBMMjg4IDBjNTMgMCA5NiA0MyA5NiA5NmwwIDI1NmMwIDQwLjEtMjQuNiA3NC41LTU5LjUgODguOGw1My45IDYzLjdjOC42IDEwLjEgNy4zIDI1LjMtMi44IDMzLjhzLTI1LjMgNy4zLTMzLjgtMi44bC03NC04Ny41LTE1MS4zIDAtNzQgODcuNWMtOC42IDEwLjEtMjMuNyAxMS40LTMzLjggMi44cy0xMS40LTIzLjctMi44LTMzLjhsNTMuOS02My43QzI0LjYgNDI2LjUgMCAzOTIuMSAwIDM1MkwwIDk2em02NCAzMmwwIDk2YzAgMTcuNyAxNC4zIDMyIDMyIDMybDE5MiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtOTZjMC0xNy43LTE0LjMtMzItMzItMzJMOTYgOTZjLTE3LjcgMC0zMiAxNC4zLTMyIDMyek0xOTIgMzg0YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHoiXQogICAgfTsKICAgIGZhR2FtZXBhZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnYW1lcGFkIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYxMWIiLCAiTTQ0OCA2NGMxMDYgMCAxOTIgODYgMTkyIDE5MlM1NTQgNDQ4IDQ0OCA0NDhsLTI1NiAwQzg2IDQ0OCAwIDM2MiAwIDI1NlM4NiA2NCAxOTIgNjRsMjU2IDB6TTE5MiAxNzZjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMzItMzIgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwzMiAwIDAgMzJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTMyIDMyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTMyIDAgMC0zMmMwLTEzLjMtMTAuNy0yNC0yNC0yNHptMjQwIDk2YTMyIDMyIDAgMSAwIDAgNjQgMzIgMzIgMCAxIDAgMC02NHptNjQtOTZhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDEgMCAwLTY0eiJdCiAgICB9OwogICAgZmFGaWxlRXhwb3J0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbGUtZXhwb3J0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImFycm93LXJpZ2h0LWZyb20tZmlsZSJdLCAiZjU2ZSIsICJNOTYuNSAwYy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTk2IDc4LjEgMC0zMSAzMWMtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDcyLTcyYzkuNC05LjQgOS40LTI0LjYgMC0zMy45bC03Mi03MmMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWwzMSAzMS03OC4xIDAgMC0xMzMuNWMwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0wyOTEuMiAxOC43QzI3OS4yIDYuNyAyNjMgMCAyNDYgMEw5Ni41IDB6TTM1OCAxNzZsLTkzLjUgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRMMjQwLjUgNTguNSAzNTggMTc2ek0yMjQuNSAzMjhjMC0xMy4zIDEwLjctMjQgMjQtMjRsMTA0IDAgMCA0OC0xMDQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjR6Il0KICAgIH07CiAgICBmYUFycm93UmlnaHRGcm9tRmlsZSA9IGZhRmlsZUV4cG9ydDsKICAgIGZhRmFjZUdyaW1hY2UyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3JpbWFjZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU1NiwgImdyaW1hY2UiXSwgImY1N2YiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek00MDAgMzUyYzAgMjUuMi0xOS40IDQ1LjgtNDQgNDcuOGwwLTk1LjdjMjQuNiAyIDQ0IDIyLjcgNDQgNDcuOHpNMjc2IDMwNGw0MCAwIDAgOTYtNDAgMCAwLTk2em0tODAgOTZsMC05NiA0MCAwIDAgOTYtNDAgMHptLTQwLTk1LjhsMCA5NS43Yy0yNC42LTItNDQtMjIuNy00NC00Ny44czE5LjQtNDUuOCA0NC00Ny44ek0xNDQgMjA4YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTE5Mi0zMmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYUdyaW1hY2UyID0gZmFGYWNlR3JpbWFjZTI7CiAgICBmYVRyYWluU3Vid2F5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRyYWluLXN1YndheSIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJzdWJ3YXkiXSwgImYyMzkiLCAiTTAgOTZDMCA0MyA0MyAwIDk2IDBMMjg4IDBjNTMgMCA5NiA0MyA5NiA5NmwwIDI1NmMwIDQwLjEtMjQuNiA3NC41LTU5LjUgODguOGw1My45IDYzLjdjOC42IDEwLjEgNy4zIDI1LjMtMi44IDMzLjhzLTI1LjMgNy4zLTMzLjgtMi44bC03NC04Ny41LTE1MS4zIDAtNzQgODcuNWMtOC42IDEwLjEtMjMuNyAxMS40LTMzLjggMi44cy0xMS40LTIzLjctMi44LTMzLjhsNTMuOS02My43QzI0LjYgNDI2LjUgMCAzOTIuMSAwIDM1MkwwIDk2em02NCAzMmwwIDk2YzAgMTcuNyAxNC4zIDMyIDMyIDMybDcyIDAgMC0xNjAtNzIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6TTIxNiAyNTZsNzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTk2YzAtMTcuNy0xNC4zLTMyLTMyLTMybC03MiAwIDAgMTYwek05NiAzODRhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0em0yMjQtMzJhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHoiXQogICAgfTsKICAgIGZhU3Vid2F5ID0gZmFUcmFpblN1YndheTsKICAgIGZhQ2lyY2xlRG90MiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtZG90IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MjgwLCAiZG90LWNpcmNsZSJdLCAiZjE5MiIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6bTAtMzUyYTk2IDk2IDAgMSAxIDAgMTkyIDk2IDk2IDAgMSAxIDAtMTkyeiJdCiAgICB9OwogICAgZmFEb3RDaXJjbGUyID0gZmFDaXJjbGVEb3QyOwogICAgZmFPYmplY3RHcm91cDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAib2JqZWN0LWdyb3VwIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYyNDciLCAiTTMyIDExOS40QzEyLjkgMTA4LjQgMCA4Ny43IDAgNjQgMCAyOC43IDI4LjcgMCA2NCAwIDg3LjcgMCAxMDguNCAxMi45IDExOS40IDMybDMzNy4xIDBjMTEuMS0xOS4xIDMxLjctMzIgNTUuNC0zMiAzNS4zIDAgNjQgMjguNyA2NCA2NCAwIDIzLjctMTIuOSA0NC40LTMyIDU1LjRsMCAyNzMuMWMxOS4xIDExLjEgMzIgMzEuNyAzMiA1NS40IDAgMzUuMy0yOC43IDY0LTY0IDY0LTIzLjcgMC00NC40LTEyLjktNTUuNC0zMmwtMzM3LjEgMGMtMTEuMSAxOS4xLTMxLjcgMzItNTUuNCAzMi0zNS4zIDAtNjQtMjguNy02NC02NCAwLTIzLjcgMTIuOS00NC40IDMyLTU1LjRsMC0yNzMuMXptNDQ4IDBjLTkuNy01LjYtMTcuOC0xMy43LTIzLjQtMjMuNEwxMTkuNCA5NmMtNS42IDkuNy0xMy43IDE3LjgtMjMuNCAyMy40bDAgMjczLjFjOS43IDUuNiAxNy44IDEzLjcgMjMuNCAyMy40bDMzNy4xIDBjNS42LTkuNyAxMy43LTE3LjggMjMuNC0yMy40bDAtMjczLjF6TTE0NCAxNzZjMC0xNy43IDE0LjMtMzIgMzItMzJsMTEyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMTEyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjR6TTI1NiAzMjBsMzIgMGM0NC4yIDAgODAtMzUuOCA4MC04MGwzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTExMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTE2eiJdCiAgICB9OwogICAgZmFTaGlwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNoaXAiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjg2NzRdLCAiZjIxYSIsICJNMjcyIDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgMTYtMTYgMGMtNDQuMiAwLTgwIDM1LjgtODAgODBsMCAxMDguOC0yMS42IDguNmMtMTQuOCA1LjktMjIuNSAyMi40LTE3LjQgMzcuNSAxMC40IDMxLjMgMjYuOCA1OS4zIDQ3LjcgODMuMSAyMC4xLTkuMiA0MS43LTEzLjkgNjMuMy0xNCAzMy4xLS4yIDY2LjMgMTAuMiA5NC40IDMxLjRsMS42IDEuMiAwLTIxNS0xMDQgNDEuNiAwLTgzLjJjMC04LjggNy4yLTE2IDE2LTE2bDIyNCAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDgzLjItMTA0LTQxLjYgMCAyMTUgMS42LTEuMmMyNy41LTIwLjcgNTkuOS0zMS4yIDkyLjQtMzEuNCAyMi4zLS4xIDQ0LjYgNC41IDY1LjMgMTQgMjAuOS0yMy43IDM3LjMtNTEuOCA0Ny43LTgzLjEgNS0xNS4yLTIuNi0zMS42LTE3LjQtMzcuNUw1MTIgMjUyLjggNTEyIDE0NGMwLTQ0LjItMzUuOC04MC04MC04MGwtMTYgMCAwLTE2YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4TDI3MiAwek00MDMuNCA0NzYuMWMyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAxOSAxNC40IDQxLjkgMjguMiA2Ny4yIDMzLjMgMjYuNSA1LjQgNTQuMyAuOCA4MC43LTE5LjEgMTAuNi04IDEyLjctMjMgNC43LTMzLjZzLTIzLTEyLjctMzMuNi00LjdjLTE0LjkgMTEuMi0yOC42IDEzLjEtNDIuMyAxMC4zLTE0LjktMy0zMC45LTExLjktNDcuOC0yNC42LTM4LjQtMjktOTAuNS0yOS0xMjkgMC0yNCAxOC4xLTQwLjcgMjYuMy01NC41IDI2LjNzLTMwLjUtOC4yLTU0LjUtMjYuM2MtMzguNC0yOS05MC41LTI5LTEyOSAwLTIxLjYgMTYuMy00MS4zIDI1LjgtNTguOSAyNS43LTkuNi0uMS0xOS45LTMtMzEuMi0xMS41LTEwLjYtOC0yNS42LTUuOS0zMy42IDQuN1M3IDQ4Mi4zIDE3LjYgNDkwLjNjMTkuMSAxNC40IDM5LjQgMjEgNTkuOCAyMS4xIDMzLjkgLjIgNjQuMy0xNy40IDg4LjEtMzUuMyAyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAyNC4yIDE4LjMgNTIuMyAzNS45IDgzLjQgMzUuOXM1OS4xLTE3LjcgODMuNC0zNS45eiJdCiAgICB9OwogICAgZmFDID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImMiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFs5OV0sICI0MyIsICJNMzI5LjEgMTQyLjljLTYyLjUtNjIuNS0xNTUuOC02Mi41LTIxOC4zIDBzLTYyLjUgMTYzLjggMCAyMjYuMyAxNTUuOCA2Mi41IDIxOC4zIDBjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM2MtODcuNSA4Ny41LTIyMS4zIDg3LjUtMzA4LjggMHMtODcuNS0yMjkuMyAwLTMxNi44IDIyMS4zLTg3LjUgMzA4LjggMGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMHoiXQogICAgfTsKICAgIGZhU3F1YXJlUGhvbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXBob25lIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInBob25lLXNxdWFyZSJdLCAiZjA5OCIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnptODggOTYuN2M5LjgtMi43IDIwLjEgMi40IDI0IDExLjhsMjAuMyA0OC43YzMuNCA4LjMgMS4xIDE3LjgtNS45IDIzLjVsLTIyLjEgMThjMTYuMiAzNS44IDQ0LjUgNjUgNzkuNiA4Mi40bDE5LjMtMjMuNmM1LjctNi45IDE1LjItOS4zIDIzLjUtNS45bDQ4LjcgMjAuM2M5LjQgMy45IDE0LjQgMTQuMiAxMS44IDI0bC0uOCAyLjhjLTguOCAzMi4zLTQwLjEgNTkuOS03OC4yIDUxLjgtODcuNS0xOC41LTE1Ni4zLTg3LjQtMTc0LjktMTc0LjktOC4xLTM4LjEgMTkuNS02OS40IDUxLjgtNzguMmwyLjgtLjh6Il0KICAgIH07CiAgICBmYVBob25lU3F1YXJlID0gZmFTcXVhcmVQaG9uZTsKICAgIGZhUnVsZXJDb21iaW5lZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJydWxlci1jb21iaW5lZCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNTQ2IiwgIk0xIDQ0MS43QzUuNSA0NjMuNSAyNC44IDQ4MCA0OCA0ODBsMzUyIDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC05NmMwLTI2LjUtMjEuNS00OC00OC00OGwtNDggMCAwIDcyYzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNzItNjQgMCAwIDcyYzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNzItNzIgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGw3MiAwIDAtNjQtNzIgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGw3MiAwIDAtNDhjMC0yNi41LTIxLjUtNDgtNDgtNDhMNDggMzJDMjEuNSAzMiAwIDUzLjUgMCA4MEwwIDQzMmMwIDMuMyAuMyA2LjYgMSA5Ljd6Il0KICAgIH07CiAgICBmYUFycm93c1JvdGF0ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvd3Mtcm90YXRlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NDcyLCAicmVmcmVzaCIsICJzeW5jIl0sICJmMDIxIiwgIk02NS45IDIyOC41YzEzLjMtOTMgOTMuNC0xNjQuNSAxOTAuMS0xNjQuNSA1MyAwIDEwMSAyMS41IDEzNS44IDU2LjIgLjIgLjIgLjQgLjQgLjYgLjZsNy42IDcuMi00Ny45IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMTI4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0xMjhjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA1My40LTExLjMtMTAuN0MzOTAuNSAyOC42IDMyNi41IDAgMjU2IDAgMTI3IDAgMjAuMyA5NS40IDIuNiAyMTkuNSAuMSAyMzcgMTIuMiAyNTMuMiAyOS43IDI1NS43czMzLjctOS43IDM2LjItMjcuMXptNDQzLjUgNjRjMi41LTE3LjUtOS43LTMzLjctMjcuMS0zNi4ycy0zMy43IDkuNy0zNi4yIDI3LjFjLTEzLjMgOTMtOTMuNCAxNjQuNS0xOTAuMSAxNjQuNS01MyAwLTEwMS0yMS41LTEzNS44LTU2LjItLjItLjItLjQtLjQtLjYtLjZsLTcuNi03LjIgNDcuOSAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDMyIDMyMGMtOC41IDAtMTYuNyAzLjQtMjIuNyA5LjVTLS4xIDM0My43IDAgMzUyLjNsMSAxMjdjLjEgMTcuNyAxNC42IDMxLjkgMzIuMyAzMS43UzY1LjIgNDk2LjQgNjUgNDc4LjdsLS40LTUxLjUgMTAuNyAxMC4xYzQ2LjMgNDYuMSAxMTAuMiA3NC43IDE4MC43IDc0LjcgMTI5IDAgMjM1LjctOTUuNCAyNTMuNC0yMTkuNXoiXQogICAgfTsKICAgIGZhUmVmcmVzaCA9IGZhQXJyb3dzUm90YXRlOwogICAgZmFTeW5jID0gZmFBcnJvd3NSb3RhdGU7CiAgICBmYVBlcnNvbkRyZXNzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1kcmVzcyIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJmZW1hbGUiXSwgImYxODIiLCAiTTEzNiAyNGE1NiA1NiAwIDEgMSAxMTIgMCA1NiA1NiAwIDEgMSAtMTEyIDB6TTExMiAzODRsLTI1LjggMGMtMTAuOSAwLTE4LjYtMTAuNy0xNS4yLTIxLjFsNDMtMTI5LTQ4LjMgNjUuMWMtMTAuNSAxNC4yLTMwLjYgMTcuMi00NC44IDYuNnMtMTcuMi0zMC42LTYuNi00NC44bDcwLjUtOTVDMTEwIDEzMiAxNDkuNyAxMTIgMTkyIDExMnM4MiAyMCAxMDcuMiA1My45bDcwLjUgOTVjMTAuNSAxNC4yIDcuNiAzNC4yLTYuNiA0NC44cy0zNC4yIDcuNi00NC44LTYuNkwyNzAgMjM0IDMxMyAzNjIuOWMzLjUgMTAuNC00LjMgMjEuMS0xNS4yIDIxLjFsLTI1LjggMCAwIDEyOGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTEyOC0zMiAwIDAgMTI4YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTI4eiJdCiAgICB9OwogICAgZmFGZW1hbGUgPSBmYVBlcnNvbkRyZXNzOwogICAgZmFCb29rT3BlbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib29rLW9wZW4iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgyMTQsIDEyODM2Nl0sICJmNTE4IiwgIk0yNTYgMTQxLjNsMCAzMDkuMyAuNS0uMkMzMTEuMSA0MjcuNyAzNjkuNyA0MTYgNDI4LjggNDE2bDE5LjIgMCAwLTMyMC0xOS4yIDBjLTQyLjIgMC04NC4xIDguNC0xMjMuMSAyNC42LTE2LjggNy0zMy40IDEzLjktNDkuNyAyMC43ek0yMzAuOSA2MS41TDI1NiA3MiAyODEuMSA2MS41QzMyNy45IDQyIDM3OC4xIDMyIDQyOC44IDMyTDQ2NCAzMmMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDM1MmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMzUuMiAwYy01MC43IDAtMTAwLjkgMTAtMTQ3LjcgMjkuNWwtMTIuOCA1LjNjLTcuOSAzLjMtMTYuNyAzLjMtMjQuNiAwbC0xMi44LTUuM0MxODQuMSA0OTAgMTMzLjkgNDgwIDgzLjIgNDgwTDQ4IDQ4MGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCA4MEMwIDUzLjUgMjEuNSAzMiA0OCAzMmwzNS4yIDBjNTAuNyAwIDEwMC45IDEwIDE0Ny43IDI5LjV6Il0KICAgIH07CiAgICBmYUZvbGRlclRyZWUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZm9sZGVyLXRyZWUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjgwMiIsICJNNDggMjRDNDggMTAuNyAzNy4zIDAgMjQgMFMwIDEwLjcgMCAyNEwwIDM5MmMwIDMwLjkgMjUuMSA1NiA1NiA1NmwxODQgMCAwLTQ4LTE4NCAwYy00LjQgMC04LTMuNi04LThsMC0yMzIgMTkyIDAgMC00OC0xOTIgMCAwLTg4ek0zMzYgMjI0bDE5MiAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtOTZjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTgyLjcgMGMtOC41IDAtMTYuNi0zLjQtMjIuNi05LjRsLTguNi04LjZjLTktOS0yMS4yLTE0LjEtMzMuOS0xNC4xTDMzNiAwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDEyOGMwIDI2LjUgMjEuNSA0OCA0OCA0OHptMCAyODhsMTkyIDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC05NmMwLTI2LjUtMjEuNS00OC00OC00OGwtODIuNyAwYy04LjUgMC0xNi42LTMuNC0yMi42LTkuNGwtOC42LTguNmMtOS05LTIxLjItMTQuMS0zMy45LTE0LjFMMzM2IDI4OGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCAxMjhjMCAyNi41IDIxLjUgNDggNDggNDh6Il0KICAgIH07CiAgICBmYUJveEFyY2hpdmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm94LWFyY2hpdmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiYXJjaGl2ZSJdLCAiZjE4NyIsICJNMCA2NEMwIDQ2LjMgMTQuMyAzMiAzMiAzMmw0NDggMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDMyYzAgMTcuNy0xNC4zIDMyLTMyIDMyTDMyIDEyOEMxNC4zIDEyOCAwIDExMy43IDAgOTZMMCA2NHpNMzIgMTc2bDQ0OCAwIDAgMjQwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDk2IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0yNDB6bTE1MiA2NGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNDQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTQ0IDB6Il0KICAgIH07CiAgICBmYUFyY2hpdmUgPSBmYUJveEFyY2hpdmU7CiAgICBmYVRlbnRBcnJvd0Rvd25Ub0xpbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGVudC1hcnJvdy1kb3duLXRvLWxpbmUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTU3ZSIsICJNMTg1IDEyMWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwbC0zMSAzMSAwLTEwMi4xQzEyMCAyLjcgMTA5LjMtOCA5Ni04UzcyIDIuNyA3MiAxNmwwIDEwMi4xLTMxLTMxQzMxLjYgNzcuNyAxNi40IDc3LjcgNyA4N1MtMi4zIDExMS42IDcgMTIxbDcyIDcyYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwbDcyLTcyek0xNTUuOCAyNjAuNkwxMzIuMSA0NDggMzIgNDQ4Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDUxMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMyIDAtMi44LS40LTUuNS0xLThMNTQ4LjIgMjYwLjdjLTEuMi05LjctNi45LTE4LjQtMTUuMy0yMy40TDM2Ny40IDEzNy45Yy0xMC4yLTYuMS0yMi45LTYuMS0zMy4xIC4xTDE3MC45IDIzNy4zYy04LjMgNS4xLTEzLjkgMTMuNy0xNS4xIDIzLjN6TTQ0OCA0NDhsLTk3LjEgMCAwLTE0OS40YzAtNS45IDQuNy0xMC42IDEwLjYtMTAuNiA0IDAgNy43IDIuMyA5LjUgNS45TDQ0OCA0NDh6Il0KICAgIH07CiAgICBmYVFyY29kZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJxcmNvZGUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjAyOSIsICJNNjQgMTYwbDY0IDAgMC02NC02NCAwIDAgNjR6TTAgODBDMCA1My41IDIxLjUgMzIgNDggMzJsOTYgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDk2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC05NiAwYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDgwek02NCA0MTZsNjQgMCAwLTY0LTY0IDAgMCA2NHpNMCAzMzZjMC0yNi41IDIxLjUtNDggNDgtNDhsOTYgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDk2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC05NiAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTk2ek0zMjAgOTZsMCA2NCA2NCAwIDAtNjQtNjQgMHpNMzA0IDMybDk2IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA5NmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtOTYgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC05NmMwLTI2LjUgMjEuNS00OCA0OC00OHpNMjg4IDM1MmEzMiAzMiAwIDEgMSAwLTY0IDMyIDMyIDAgMSAxIDAgNjR6bTAgNjRjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzItMzItMTQuMy0zMi0zMiAxNC4zLTMyIDMyLTMyem05NiAzMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMyLTE0LjMgMzItMzIgMzItMzItMTQuMy0zMi0zMnptMzItOTZhMzIgMzIgMCAxIDEgMC02NCAzMiAzMiAwIDEgMSAwIDY0em0tMzIgMzJhMzIgMzIgMCAxIDEgLTY0IDAgMzIgMzIgMCAxIDEgNjQgMHoiXQogICAgfTsKICAgIGZhRHJhZ29uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRyYWdvbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzEyODAwOV0sICJmNmQ1IiwgIk0zNTIgMTI0LjVsLTUxLjktMTNjLTYuNS0xLjYtMTEuMy03LjEtMTItMTMuOHMyLjgtMTMuMSA4LjctMTYuMWw0MC44LTIwLjQtNDMuMy0zMi41Yy01LjUtNC4xLTcuOC0xMS4zLTUuNi0xNy45UzI5Ny4xIDAgMzA0IDBMNDY0IDBjMzAuMiAwIDU4LjcgMTQuMiA3Ni44IDM4LjRsNTcuNiA3Ni44YzYuMiA4LjMgOS42IDE4LjQgOS42IDI4LjggMCAyNi41LTIxLjUgNDgtNDggNDhsLTIxLjUgMGMtMTcgMC0zMy4zLTYuNy00NS4zLTE4LjdsLTEzLjMtMTMuMy0zMiAwIDAgMjEuNWMwIDI0LjggMTIuOCA0Ny45IDMzLjggNjEuMWwxMDYuNiA2Ni42YzMyLjEgMjAuMSA1MS42IDU1LjIgNTEuNiA5My4xIDAgNjAuNi00OS4xIDEwOS44LTEwOS44IDEwOS44TDMyLjMgNTEyYy0zLjMgMC02LjYtLjQtOS42LTEuNC05LjItMi44LTE2LjctOS42LTIwLjQtMTguNi0xLjMtMy4zLTIuMi02LjktMi4zLTEwLjctLjItMy43IC4zLTcuMyAxLjMtMTAuNyAyLjgtOS4yIDkuNi0xNi43IDE4LjYtMjAuNCAzLTEuMiA2LjItMiA5LjUtMi4yTDQzMy4zIDQxMmM4LjMtLjcgMTQuNy03LjcgMTQuNy0xNi4xIDAtNC4zLTEuNy04LjQtNC43LTExLjRsLTQ0LjQtNDQuNGMtMzAtMzAtNDYuOS03MC43LTQ2LjktMTEzLjFsMC0xMDIuNXpNNTEyIDcyLjNjMC0uMSAwLS4yIDAtLjNzMC0uMiAwLS4zbDAgLjZ6bS0xLjMgNy40TDQ2NC4zIDY4LjFjLS4yIDEuMy0uMyAyLjYtLjMgMy45IDAgMTMuMyAxMC43IDI0IDI0IDI0IDEwLjYgMCAxOS41LTYuOCAyMi43LTE2LjN6TTEzMC45IDExNi41YzE2LjMtMTQuNSA0MC40LTE2LjIgNTguNS00LjFsMTMwLjYgODcgMCAyNy41YzAgMzIuOCA4LjQgNjQuOCAyNCA5M2wtMjMyIDBjLTYuNyAwLTEyLjctNC4yLTE1LTEwLjRzLS41LTEzLjMgNC42LTE3LjdMMTcxIDIzMi4zIDE4LjQgMjU1LjhjLTcgMS4xLTEzLjktMi42LTE2LjktOVMuMSAyMzIuOCA1LjQgMjI4TDEzMC45IDExNi41eiJdCiAgICB9OwogICAgZmFIb3VyZ2xhc3NFbmQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG91cmdsYXNzLWVuZCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzg5ODcsICJob3VyZ2xhc3MtMyJdLCAiZjI1MyIsICJNMzIgMEMxNC4zIDAgMCAxNC4zIDAgMzJTMTQuMyA2NCAzMiA2NGwwIDExYzAgNDIuNCAxNi45IDgzLjEgNDYuOSAxMTMuMWw2Ny45IDY3LjktNjcuOSA2Ny45QzQ4LjkgMzUzLjkgMzIgMzk0LjYgMzIgNDM3bDAgMTFjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzIwIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsMC0xMWMwLTQyLjQtMTYuOS04My4xLTQ2LjktMTEzLjFsLTY3LjktNjcuOSA2Ny45LTY3LjljMzAtMzAgNDYuOS03MC43IDQ2LjktMTEzLjFsMC0xMWMxNy43IDAgMzItMTQuMyAzMi0zMlMzNjkuNyAwIDM1MiAwTDMyIDB6TTk2IDc1bDAtMTEgMTkyIDAgMCAxMWMwIDI1LjUtMTAuMSA0OS45LTI4LjEgNjcuOWwtNjcuOSA2Ny45LTY3LjktNjcuOUMxMDYuMSAxMjQuOSA5NiAxMDAuNCA5NiA3NXoiXQogICAgfTsKICAgIGZhSG91cmdsYXNzMzIgPSBmYUhvdXJnbGFzc0VuZDsKICAgIGZhR3JpcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJncmlwIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNTgxMTksICJncmlkLWhvcml6b250YWwiLCAiZ3JpcC1ob3Jpem9udGFsIl0sICJmNThkIiwgIk04OCA5NmMyMi4xIDAgNDAgMTcuOSA0MCA0MGwwIDQ4YzAgMjIuMS0xNy45IDQwLTQwIDQwbC00OCAwYy0yMi4xIDAtNDAtMTcuOS00MC00MGwwLTQ4YzAtMjIuMSAxNy45LTQwIDQwLTQwbDQ4IDB6TTI4MCAyMjRsLTQ4IDBjLTIyLjEgMC00MC0xNy45LTQwLTQwbDAtNDhjMC0yMi4xIDE3LjktNDAgNDAtNDBsNDggMGMyMi4xIDAgNDAgMTcuOSA0MCA0MGwwIDQ4YzAgMjIuMS0xNy45IDQwLTQwIDQwem0xOTIgMGwtNDggMGMtMjIuMSAwLTQwLTE3LjktNDAtNDBsMC00OGMwLTIyLjEgMTcuOS00MCA0MC00MGw0OCAwYzIyLjEgMCA0MCAxNy45IDQwIDQwbDAgNDhjMCAyMi4xLTE3LjkgNDAtNDAgNDB6bTAgMTkybC00OCAwYy0yMi4xIDAtNDAtMTcuOS00MC00MGwwLTQ4YzAtMjIuMSAxNy45LTQwIDQwLTQwbDQ4IDBjMjIuMSAwIDQwIDE3LjkgNDAgNDBsMCA0OGMwIDIyLjEtMTcuOSA0MC00MCA0MHpNMjgwIDI4OGMyMi4xIDAgNDAgMTcuOSA0MCA0MGwwIDQ4YzAgMjIuMS0xNy45IDQwLTQwIDQwbC00OCAwYy0yMi4xIDAtNDAtMTcuOS00MC00MGwwLTQ4YzAtMjIuMSAxNy45LTQwIDQwLTQwbDQ4IDB6TTg4IDQxNmwtNDggMGMtMjIuMSAwLTQwLTE3LjktNDAtNDBsMC00OGMwLTIyLjEgMTcuOS00MCA0MC00MGw0OCAwYzIyLjEgMCA0MCAxNy45IDQwIDQwbDAgNDhjMCAyMi4xLTE3LjkgNDAtNDAgNDB6Il0KICAgIH07CiAgICBmYUdyaWRIb3Jpem9udGFsID0gZmFHcmlwOwogICAgZmFHcmlwSG9yaXpvbnRhbCA9IGZhR3JpcDsKICAgIGZhQm9yZGVyVG9wTGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib3JkZXItdG9wLWxlZnQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiYm9yZGVyLXN0eWxlIl0sICJmODUzIiwgIk0wIDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzUyIDM1MiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0NDh6bTEyOCAwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzItMTQuMy0zMi0zMi0zMi0zMiAxNC4zLTMyIDMyem0xMjggMGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMyLTE0LjMtMzItMzItMzItMzIgMTQuMy0zMiAzMnptMTYwIDMyYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyLTMyIDE0LjMtMzIgMzIgMTQuMyAzMiAzMiAzMnpNMzg0IDE5MmEzMiAzMiAwIDEgMCA2NCAwIDMyIDMyIDAgMSAwIC02NCAwem0zMiAxNjBhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFCb3JkZXJTdHlsZSA9IGZhQm9yZGVyVG9wTGVmdDsKICAgIGZhTGlzdFVsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxpc3QtdWwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsibGlzdC1kb3RzIl0sICJmMGNhIiwgIk00OCAxNDRhNDggNDggMCAxIDAgMC05NiA0OCA0OCAwIDEgMCAwIDk2ek0xOTIgNjRjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMjg4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMTkyIDY0em0wIDE2MGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwyODggMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMjg4IDB6bTAgMTYwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDI4OCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0yODggMHpNNDggNDY0YTQ4IDQ4IDAgMSAwIDAtOTYgNDggNDggMCAxIDAgMCA5NnpNOTYgMjU2YTQ4IDQ4IDAgMSAwIC05NiAwIDQ4IDQ4IDAgMSAwIDk2IDB6Il0KICAgIH07CiAgICBmYUxpc3REb3RzID0gZmFMaXN0VWw7CiAgICBmYVBlb3BsZVJvYmJlcnkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVvcGxlLXJvYmJlcnkiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUzNiIsICJNNDg4LjIgNTkuMUM0NzguMSA5OS42IDQ0MS43IDEyOCA0MDAgMTI4cy03OC4xLTI4LjQtODguMi02OC45TDMwMyAyNC4yQzI5OC44IDcuMSAyODEuNC0zLjMgMjY0LjIgMVMyMzYuNyAyMi42IDI0MSAzOS44bDguNyAzNC45YzExIDQ0IDQwLjIgNzkuNiA3OC4zIDk5LjZMMzI4IDQ4MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTI4IDE2IDAgMCAxMjhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTMwNS43YzM4LjEtMjAgNjcuMy01NS42IDc4LjMtOTkuNkw1NTkgMzkuOGM0LjMtMTcuMS02LjEtMzQuNS0yMy4zLTM4LjhTNTAxLjIgNy4xIDQ5NyAyNC4ybC04LjcgMzQuOXpNNDAwIDk2YTQ4IDQ4IDAgMSAwIDAtOTYgNDggNDggMCAxIDAgMCA5NnpNODAgOTZhNDggNDggMCAxIDAgMC05NiA0OCA0OCAwIDEgMCAwIDk2em0tOCAzMmMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCA5NiAwIC42IDAgMTkxLjRjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTEyOCAxNiAwIDAgMTI4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yMjcuMyAxMyAyMC41YzUuOSA5LjIgMTYuMSAxNC45IDI3IDE0LjlsNDggMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMzAuNCAwLTM3LjQtNTguOUMxNTcuNiAxNDIgMTMyLjEgMTI4IDEwNC43IDEyOEw3MiAxMjh6Il0KICAgIH07CiAgICBmYU1vYmlsZUJ1dHRvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb2JpbGUtYnV0dG9uIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYxMGIiLCAiTTgwIDBDNDQuNyAwIDE2IDI4LjcgMTYgNjRsMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjI0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zODRjMC0zNS4zLTI4LjctNjQtNjQtNjRMODAgMHpNMTkyIDQ2NGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMiAzMiAxNC4zIDMyIDMyLTE0LjMgMzItMzIgMzJ6Il0KICAgIH07CiAgICBmYUFycm93RG93bkFaID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LWRvd24tYS16IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNvcnQtYWxwaGEtYXNjIiwgInNvcnQtYWxwaGEtZG93biJdLCAiZjE1ZCIsICJNMjMwLjYgMzkwLjZsLTgwIDgwYy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMGwtODAtODBjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zczMyLjgtMTIuNSA0NS4zIDBMOTYgMzcwLjcgOTYgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDMwNi43IDI1LjQtMjUuNGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zem0xODItMzQwLjljNTAuNyAxMDEuMyA3Ny4zIDE1NC43IDgwIDE2MCA3LjkgMTUuOCAxLjUgMzUtMTQuMyA0Mi45cy0zNSAxLjUtNDIuOS0xNC4zbC03LjItMTQuMy04OC40IDAtNy4yIDE0LjNjLTcuOSAxNS44LTI3LjEgMjIuMi00Mi45IDE0LjNzLTIyLjItMjcuMS0xNC4zLTQyLjljMi43LTUuMyAyOS4zLTU4LjcgODAtMTYwIDUuNC0xMC44IDE2LjUtMTcuNyAyOC42LTE3LjdzMjMuMiA2LjggMjguNiAxNy43ek0zODQgMTM1LjZsLTIwLjIgNDAuNCA0MC40IDAtMjAuMi00MC40ek0yODggMzIwYzAtMTcuNyAxNC4zLTMyIDMyLTMybDEyOCAwYzEyLjkgMCAyNC42IDcuOCAyOS42IDE5LjhzMi4yIDI1LjctNi45IDM0LjlMMzk3LjMgNDE2IDQ0OCA0MTZjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTEyOCAwYy0xMi45IDAtMjQuNi03LjgtMjkuNi0xOS44cy0yLjItMjUuNyA2LjktMzQuOWw3My40LTczLjQtNTAuNyAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnoiXQogICAgfTsKICAgIGZhU29ydEFscGhhQXNjID0gZmFBcnJvd0Rvd25BWjsKICAgIGZhU29ydEFscGhhRG93biA9IGZhQXJyb3dEb3duQVo7CiAgICBmYU1vbmV5QmlsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb25leS1iaWxsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYwZDYiLCAiTTY0IDY0QzI4LjcgNjQgMCA5Mi43IDAgMTI4TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDY0em0xOTIgOTZhOTYgOTYgMCAxIDEgMCAxOTIgOTYgOTYgMCAxIDEgMC0xOTJ6bTE5MiAyNGMwIDQuNC0zLjYgOC4xLTggNy41LTI5LTMuNi01MS45LTI2LjYtNTUuNS01NS41LS41LTQuNCAzLjEtOCA3LjUtOGw0OCAwYzQuNCAwIDggMy42IDggOGwwIDQ4ek02NCAzMjhjMC00LjQgMy42LTguMSA4LTcuNSAyOSAzLjYgNTEuOSAyNi42IDU1LjUgNTUuNSAuNSA0LjQtMy4xIDgtNy41IDhsLTQ4IDBjLTQuNCAwLTgtMy42LTgtOGwwLTQ4em04LTEzNi41Yy00LjQgLjUtOC0zLjEtOC03LjVsMC00OGMwLTQuNCAzLjYtOCA4LThsNDggMGM0LjQgMCA4LjEgMy42IDcuNSA4LTMuNiAyOS0yNi42IDUxLjktNTUuNSA1NS41em0zNjggMTI5YzQuNC0uNSA4IDMuMSA4IDcuNWwwIDQ4YzAgNC40LTMuNiA4LTggOGwtNDggMGMtNC40IDAtOC4xLTMuNi03LjUtOCAzLjYtMjkgMjYuNi01MS45IDU1LjUtNTUuNXoiXQogICAgfTsKICAgIGZhQ2lyY2xlTWludXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLW1pbnVzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbIm1pbnVzLWNpcmNsZSJdLCAiZjA1NiIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTE2OCAyMzJsMTc2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE3NiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFNaW51c0NpcmNsZSA9IGZhQ2lyY2xlTWludXM7CiAgICBmYUFycm93UG9pbnRlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy1wb2ludGVyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbIm1vdXNlLXBvaW50ZXIiXSwgImYyNDUiLCAiTTc3LjMgMi41YzguMS00LjEgMTcuOS0zLjIgMjUuMSAyLjNsMzIwIDIzOS45YzguMyA2LjIgMTEuNiAxNyA4LjQgMjYuOHMtMTIuNCAxNi40LTIyLjggMTYuNGwtMTUyLjMgMCA4OC45IDE3Ny43YzcuOSAxNS44IDEuNSAzNS0xNC4zIDQyLjlzLTM1IDEuNS00Mi45LTE0LjNsLTg4LjktMTc3LjctOTEuMyAxMjEuOGMtNi4yIDguMy0xNyAxMS42LTI2LjggOC40UzY0IDQzNC4zIDY0IDQyNEw2NCAyNGMwLTkuMSA1LjEtMTcuNCAxMy4zLTIxLjV6Il0KICAgIH07CiAgICBmYU1vdXNlUG9pbnRlciA9IGZhQXJyb3dQb2ludGVyOwogICAgZmFTcXVhcmVTaGFyZU5vZGVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1zaGFyZS1ub2RlcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJzaGFyZS1hbHQtc3F1YXJlIl0sICJmMWUxIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyek0zNjggMTYwYzAgMzUuMy0yOC43IDY0LTY0IDY0LTE1LjQgMC0yOS41LTUuNC00MC42LTE0LjVsLTg1LjMgNDYuNSA4NS4zIDQ2LjVjMTEtOS4xIDI1LjItMTQuNSA0MC42LTE0LjUgMzUuMyAwIDY0IDI4LjcgNjQgNjRzLTI4LjcgNjQtNjQgNjQtNjQtMjguNy02NC02NGMwLTIuNSAuMS00LjkgLjQtNy4zTDE1OC41IDMwMGMtMTEuNyAxMi4zLTI4LjIgMjAtNDYuNSAyMC0zNS4zIDAtNjQtMjguNy02NC02NHMyOC43LTY0IDY0LTY0YzE4LjMgMCAzNC44IDcuNyA0Ni41IDIwbDgxLjktNDQuN2MtLjMtMi40LS40LTQuOS0uNC03LjMgMC0zNS4zIDI4LjctNjQgNjQtNjRzNjQgMjguNyA2NCA2NHoiXQogICAgfTsKICAgIGZhU2hhcmVBbHRTcXVhcmUgPSBmYVNxdWFyZVNoYXJlTm9kZXM7CiAgICBmYVRhYmxlQ2VsbHNMYXJnZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWJsZS1jZWxscy1sYXJnZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJ0aC1sYXJnZSJdLCAiZjAwOSIsICJNMzg0IDk2bC0xMjggMCAwIDEyOCAxMjggMCAwLTEyOHptNjQgMTI4bDAgMTkyYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDEyOHpNNjQgMjg4bDAgMTI4IDEyOCAwIDAtMTI4LTEyOCAwem0xMjgtNjRsMC0xMjgtMTI4IDAgMCAxMjggMTI4IDB6bTY0IDY0bDAgMTI4IDEyOCAwIDAtMTI4LTEyOCAweiJdCiAgICB9OwogICAgZmFUaExhcmdlID0gZmFUYWJsZUNlbGxzTGFyZ2U7CiAgICBmYUNhdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYXQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgwMDhdLCAiZjZiZSIsICJNNjQgOTZjNTMgMCA5NiA0MyA5NiA5NmwwIDg1LjhjMjkuNy00NC43IDc3LjgtNzYuMiAxMzMuNC04NCAyNS42IDYwIDg1LjIgMTAyLjEgMTU0LjYgMTAyLjEgMTAuOSAwIDIxLjYtMS4xIDMyLTMuMUw0ODAgNDgwYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTQwLjgtMTM2IDEwOC44IDU2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTE0NCAwYy01MyAwLTk2LTQzLTk2LTk2bDAtMjI0YzAtMTYuNi0xMi42LTMwLjItMjguNy0zMS44bC02LjYtLjNDNDQuNiAxNTguMiAzMiAxNDQuNiAzMiAxMjggMzIgMTEwLjMgNDYuMyA5NiA2NCA5NnpNNTMzLjggMy4yQzU0NC4yLTUuNSA1NjAgMS45IDU2MCAxNS41TDU2MCAxMjhjMCA2MS45LTUwLjEgMTEyLTExMiAxMTJTMzM2IDE4OS45IDMzNiAxMjhsMC0xMTIuNWMwLTEzLjYgMTUuOC0yMSAyNi4yLTEyLjNMNDE2IDQ4IDQ4MCA0OCA1MzMuOCAzLjJ6TTQwMCAxMDhhMjAgMjAgMCAxIDAgMCA0MCAyMCAyMCAwIDEgMCAwLTQwem05NiAwYTIwIDIwIDAgMSAwIDAgNDAgMjAgMjAgMCAxIDAgMC00MHoiXQogICAgfTsKICAgIGZhQ2FsZW5kYXJXZWVrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhbGVuZGFyLXdlZWsiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjc4NCIsICJNMTI4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAzMiAxMjggMCAwLTMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAzMiAzMiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjg4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsMzIgMCAwLTMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyem0wIDI1NmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxOTIgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTY0YzAtMTcuNy0xNC4zLTMyLTMyLTMybC0xOTIgMHoiXQogICAgfTsKICAgIGZhQ29kZUNvbXBhcmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY29kZS1jb21wYXJlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUxM2EiLCAiTTE5OC44IDEuOGM5LTMuNyAxOS4zLTEuNyAyNi4yIDUuMmw1NiA1NmM5LjQgOS40IDkuNCAyNC42IDAgMzMuOWwtNTYgNTZjLTYuOSA2LjktMTcuMiA4LjktMjYuMiA1LjJTMTg0IDE0NS43IDE4NCAxMzZsMC0yNC0yNCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDIxNC43YzI4LjMgMTIuMyA0OCA0MC41IDQ4IDczLjMgMCA0NC4yLTM1LjggODAtODAgODBzLTgwLTM1LjgtODAtODBjMC0zMi44IDE5LjctNjEgNDgtNzMuM0w2NCAxNDRjMC01MyA0My05NiA5Ni05NmwyNCAwIDAtMjRjMC05LjcgNS44LTE4LjUgMTQuOC0yMi4yek0zOTIgODBhMjQgMjQgMCAxIDAgNDggMCAyNCAyNCAwIDEgMCAtNDggMHptLTggNzMuM2MtMjguMy0xMi4zLTQ4LTQwLjUtNDgtNzMuMyAwLTQ0LjIgMzUuOC04MCA4MC04MHM4MCAzNS44IDgwIDgwYzAgMzIuOC0xOS43IDYxLTQ4IDczLjNMNDQ4IDM2OGMwIDUzLTQzIDk2LTk2IDk2bC0yNCAwIDAgMjRjMCA5LjctNS44IDE4LjUtMTQuOCAyMi4ycy0xOS4zIDEuNy0yNi4yLTUuMmwtNTYtNTZjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45bDU2LTU2YzYuOS02LjkgMTcuMi04LjkgMjYuMi01LjJTMzI4IDM2Ni4zIDMyOCAzNzZsMCAyNCAyNCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMjE0Ljd6TTcyIDQzMmEyNCAyNCAwIDEgMCA0OCAwIDI0IDI0IDAgMSAwIC00OCAweiJdCiAgICB9OwogICAgZmFSb2FkQ2lyY2xlWG1hcmsgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicm9hZC1jaXJjbGUteG1hcmsiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU2NiIsICJNMjg3LjkgMzJsLTc2LjIgMGMtMjkuNCAwLTU1LjEgMjAuMS02Mi4xIDQ4LjZMNjUuNCA0MjAuNUM1Ny45IDQ1MC43IDgwLjggNDgwIDExMiA0ODBsMjA5LjQgMGMtMTEuMi0yNC40LTE3LjQtNTEuNC0xNy40LTgwIDAtMjguNiA2LjItNTUuNyAxNy40LTgwLS41IDAtMSAwLTEuNiAwLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDQ5LjJjMzUuMi00MCA4Ni43LTY1LjIgMTQ0LjItNjUuMiA5IDAgMTcuOCAuNiAyNi40IDEuOGwtMzItMTI5LjJDNDgzLjQgNTIuMSA0NTcuOCAzMiA0MjguMyAzMmwtNzYuNSAwIDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02NHpNNDk2IDU0NGExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6bTU5LjMtMTgwLjdsLTM2LjcgMzYuNyAzNi43IDM2LjdjNi4yIDYuMiA2LjIgMTYuNCAwIDIyLjZzLTE2LjQgNi4yLTIyLjYgMGwtMzYuNy0zNi43LTM2LjcgMzYuN2MtNi4yIDYuMi0xNi40IDYuMi0yMi42IDBzLTYuMi0xNi40IDAtMjIuNmwzNi43LTM2LjctMzYuNy0zNi43Yy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBsMzYuNyAzNi43IDM2LjctMzYuN2M2LjItNi4yIDE2LjQtNi4yIDIyLjYgMHM2LjIgMTYuNCAwIDIyLjZ6Il0KICAgIH07CiAgICBmYVBhbGxldCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwYWxsZXQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjQ4MiIsICJNMzIgMzIwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDMyIDAgMCA2NC0zMiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDUxMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0zMiAwIDAtNjQgMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwzMiAzMjB6bTk2IDY0bDEyOCAwIDAgNjQtMTI4IDAgMC02NHptMTkyIDBsMTI4IDAgMCA2NC0xMjggMCAwLTY0eiJdCiAgICB9OwogICAgZmFDYWtlQ2FuZGxlcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYWtlLWNhbmRsZXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjc4NzQsICJiaXJ0aGRheS1jYWtlIiwgImNha2UiXSwgImYxZmQiLCAiTTg2LjQtMTAuNUw2MS44IDMxLjZDNTggMzguMSA1NiA0NS42IDU2IDUzLjJMNTYgNTZjMCAyMi4xIDE3LjkgNDAgNDAgNDBzNDAtMTcuOSA0MC00MGwwLTIuOGMwLTcuNi0yLTE1LTUuOC0yMS42TDEwNS42LTEwLjVjLTItMy40LTUuNy01LjUtOS42LTUuNXMtNy42IDIuMS05LjYgNS41em0xMjggMEwxODkuOCAzMS42Yy0zLjggNi41LTUuOCAxNC01LjggMjEuNmwwIDIuOGMwIDIyLjEgMTcuOSA0MCA0MCA0MHM0MC0xNy45IDQwLTQwbDAtMi44YzAtNy42LTItMTUtNS44LTIxLjZMMjMzLjYtMTAuNWMtMi0zLjQtNS43LTUuNS05LjYtNS41cy03LjYgMi4xLTkuNiA1LjV6TTMxNy44IDMxLjZjLTMuOCA2LjUtNS44IDE0LTUuOCAyMS42bDAgMi44YzAgMjIuMSAxNy45IDQwIDQwIDQwczQwLTE3LjkgNDAtNDBsMC0yLjhjMC03LjYtMi0xNS01LjgtMjEuNkwzNjEuNi0xMC41Yy0yLTMuNC01LjctNS41LTkuNi01LjVzLTcuNiAyLjEtOS42IDUuNUwzMTcuOCAzMS42ek0xMjggMTYwYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgNTMuNUMyNi43IDIyNi42IDAgMjYyLjIgMCAzMDRsMCAyMC44YzIwLjkgMS4zIDQxLjYgNy4zIDYwLjMgMThsNy4xIDQuMWMyNi4zIDE1IDU4LjkgMTMuNCA4My42LTQuMiA0My43LTMxLjIgMTAyLjMtMzEuMiAxNDYgMCAyNC42IDE3LjYgNTcuMyAxOS4zIDgzLjYgNC4ybDcuMS00LjFjMTguNy0xMC43IDM5LjMtMTYuNyA2MC4zLTE4bDAtMjAuOGMwLTQxLjgtMjYuNy03Ny40LTY0LTkwLjVsMC01My41YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgNDgtNjQgMCAwLTQ4YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgNDgtNjQgMCAwLTQ4ek00NDggMzczYy0xMi43IDEuMi0yNS4xIDUtMzYuNSAxMS41bC03LjEgNC4xYy00Mi42IDI0LjMtOTUuNCAyMS43LTEzNS4zLTYuOC0yNy0xOS4zLTYzLjItMTkuMy05MC4yIDAtMzkuOSAyOC41LTkyLjcgMzEuMi0xMzUuMyA2LjhsLTcuMS00LjFDMjUuMSAzNzggMTIuNyAzNzQuMSAwIDM3M2wwIDc1YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtNzV6Il0KICAgIH07CiAgICBmYUJpcnRoZGF5Q2FrZSA9IGZhQ2FrZUNhbmRsZXM7CiAgICBmYUNha2UgPSBmYUNha2VDYW5kbGVzOwogICAgZmFCdWdTbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJidWctc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTQ5MCIsICJNNy0yNC45YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwTDI0MS44IDE3NiAzNDQgMTc2YzE0LjIgMCAyNy43IDIuOCA0MCA4bDEwOC44LTgxLjZjMTQuMS0xMC42IDM0LjItNy43IDQ0LjggNi40czcuNyAzNC4yLTYuNCA0NC44bC05Ny44IDczLjNjNS4zIDguOSA5LjMgMTguNyAxMS44IDI5LjFsOTguOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC05NiAwIDAgMzJjMCA5LjUtLjggMTguNy0yLjQgMjcuOEw1NjkgNTAzLjFjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMEw3IDkuMUMtMi4zLS4zLTIuMy0xNS41IDctMjQuOXpNMzk4LjIgNDY4Yy0yMy4yIDIyLjEtNTMgMzcuMi04Ni4yIDQyLjJsMC0xMjguNCA4Ni4yIDg2LjJ6TTI2NCAzMzMuOGwwIDE3Ni40Yy01MS4yLTcuNy05NC41LTM5LjctMTE3LjctODMuOUw4My4yIDQ3My42Yy0xNC4xIDEwLjYtMzQuMiA3LjctNDQuOC02LjRzLTcuNy0zNC4yIDYuNC00NC44bDgzLjQtNjIuNWMtLjEtMi42LS4yLTUuMi0uMi03LjlsMC0zMi05NiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDk4LjggMGMzLjMtMTMuOSA5LjMtMjYuNyAxNy42LTM3LjhMMjY0IDMzMy44ek0zNTUuNiAxMjhsLTgyLjQgMC03Mi4zLTcyLjNDMjE2LjEgMjIuOCAyNDkuNCAwIDI4OCAwIDM0MSAwIDM4NCA0MyAzODQgOTZsMCAzLjZjMCAxNS43LTEyLjcgMjguNC0yOC40IDI4LjR6Il0KICAgIH07CiAgICBmYVRhcnAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGFycCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTdiIiwgIk00NDggNjRjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAxNDkuNWMwIDE3LTYuNyAzMy4zLTE4LjcgNDUuM0wzODYuNyA0MjkuM2MtMTIgMTItMjguMyAxOC43LTQ1LjMgMTguN0w2NCA0NDhjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDM4NCAwem01LjUgMjA4TDM2MCAyNzJjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgOTMuNSAxMTcuNS0xMTcuNXpNOTYgMTkyYTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHoiXQogICAgfTsKICAgIGZhRGlhZ3JhbVByZWRlY2Vzc29yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRpYWdyYW0tcHJlZGVjZXNzb3IiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTQ3NyIsICJNMjg5LjIgMTM3LjljMi41LTYgOC4zLTkuOSAxNC44LTkuOWw0MCAwIDAtMjRjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTk4IDBjMS4zIDUuMSAyIDEwLjUgMiAxNmwwIDY0YzAgMzUuMy0yOC43IDY0LTY0IDY0bC05NiAwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDI1NiAwYzM5LjggMCA3MiAzMi4yIDcyIDcybDAgMjQgNDAgMGM2LjUgMCAxMi4zIDMuOSAxNC44IDkuOXMxLjEgMTIuOS0zLjUgMTcuNGwtNjQgNjRjLTYuMiA2LjItMTYuNCA2LjItMjIuNiAwbC02NC02NGMtNC42LTQuNi01LjktMTEuNS0zLjUtMTcuNHpNMzg0IDM1MmwtMzIwIDAgMCA2NCAzMjAgMCAwLTY0em02NCA2NGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtNjRjMC0zNS4zIDI4LjctNjQgNjQtNjRsMzIwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCA2NHoiXQogICAgfTsKICAgIGZhRmFjZUZsdXNoZWQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZmx1c2hlZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU2MywgImZsdXNoZWQiXSwgImY1NzkiLCAiTTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6TTE2OCAzOTJjMCAxMy4zIDEwLjcgMjQgMjQgMjRsMTI4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTEyOCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHptLTgtOTZhNzIgNzIgMCAxIDAgMC0xNDQgNzIgNzIgMCAxIDAgMCAxNDR6bTI2NC03MmE3MiA3MiAwIDEgMCAtMTQ0IDAgNzIgNzIgMCAxIDAgMTQ0IDB6bS0yODggMGEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwem0xOTIgMGEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAweiJdCiAgICB9OwogICAgZmFGbHVzaGVkMiA9IGZhRmFjZUZsdXNoZWQyOwogICAgZmFEaWFncmFtTmV4dCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkaWFncmFtLW5leHQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTQ3NiIsICJNMzg0IDIyNGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTY0YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZsMCA2NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxMjggMCAwIDY0LTMyIDBjLTYuNSAwLTEyLjMgMy45LTE0LjggOS45cy0xLjEgMTIuOSAzLjUgMTcuNGw2NCA2NGM2LjIgNi4yIDE2LjQgNi4yIDIyLjYgMGw2NC02NGM0LjYtNC42IDUuOS0xMS41IDMuNS0xNy40UzI5NC41IDI4OCAyODggMjg4bC0zMiAwIDAtNjQgMTI4IDB6TTY0IDI4OGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCA2NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTY0YzAtMzUuMy0yOC43LTY0LTY0LTY0bC0zNCAwYzUuNiAyMS43LS41IDQ1LjEtMTYuNyA2MS4zbC02NCA2NGMtMjUgMjUtNjUuNSAyNS05MC41IDBsLTY0LTY0Qzk4LjYgMzMzLjEgOTIuNCAzMDkuNyA5OCAyODhsLTM0IDB6Il0KICAgIH07CiAgICBmYUFuY2hvckNpcmNsZVhtYXJrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFuY2hvci1jaXJjbGUteG1hcmsiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTRhYyIsICJNMzIwLjUgOTZhMzIgMzIgMCAxIDEgLTY0IDAgMzIgMzIgMCAxIDEgNjQgMHptLTMyLTk2Yy01MyAwLTk2IDQzLTk2IDk2IDAgNDEuOCAyNi43IDc3LjQgNjQgOTAuNWwwIDI1Ny45Yy02Mi45LTE0LjMtMTEwLjItNjkuNy0xMTEuOS0xMzYuNWwxNi4xIDE0LjFjMTAgOC43IDI1LjEgNy43IDMzLjktMi4zczcuNy0yNS4xLTIuMy0zMy45bC02NC01NmMtOS03LjktMjIuNi03LjktMzEuNiAwbC02NCA1NmMtMTAgOC43LTExIDIzLjktMi4zIDMzLjlzMjMuOSAxMSAzMy45IDIuM2wxNi4yLTE0LjJjMi4xIDExMy4xIDk0LjQgMjA0LjEgMjA4IDIwNC4xIDE2LjYgMCAzMi43LTEuOSA0OC4yLTUuNi0yMC4zLTMwLjUtMzIuMi02Ny0zMi4yLTEwNi40IDAtMjcuMyA1LjctNTMuMyAxNi03Ni45bDAtMTM2LjZjMzcuMy0xMy4yIDY0LTQ4LjcgNjQtOTAuNSAwLTUzLTQzLTk2LTk2LTk2em0yMDggNTQ0YTE0NCAxNDQgMCAxIDAgMC0yODggMTQ0IDE0NCAwIDEgMCAwIDI4OHptNTkuMy0xODAuN2wtMzYuNyAzNi43IDM2LjcgMzYuN2M2LjIgNi4yIDYuMiAxNi40IDAgMjIuNnMtMTYuNCA2LjItMjIuNiAwbC0zNi43LTM2LjctMzYuNyAzNi43Yy02LjIgNi4yLTE2LjQgNi4yLTIyLjYgMHMtNi4yLTE2LjQgMC0yMi42bDM2LjctMzYuNy0zNi43LTM2LjdjLTYuMi02LjItNi4yLTE2LjQgMC0yMi42czE2LjQtNi4yIDIyLjYgMGwzNi43IDM2LjcgMzYuNy0zNi43YzYuMi02LjIgMTYuNC02LjIgMjIuNiAwczYuMiAxNi40IDAgMjIuNnoiXQogICAgfTsKICAgIGZhUGVyc29uQ2lyY2xlWG1hcmsgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLWNpcmNsZS14bWFyayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTQzIiwgIk0yODAgMjRhNTYgNTYgMCAxIDAgLTExMiAwIDU2IDU2IDAgMSAwIDExMiAwem0yNCAyMTIuN0wzNDEgMjg2LjZjMTIuOC0xNy41IDI4LjUtMzIuNyA0Ni4zLTQ1bC01Ni4yLTc1LjdDMzA2IDEzMiAyNjYuMyAxMTIgMjI0IDExMnMtODIgMjAtMTA3LjIgNTMuOWwtNzAuNSA5NWMtMTAuNSAxNC4yLTcuNiAzNC4yIDYuNiA0NC44czM0LjIgNy42IDQ0LjgtNi42TDE0NCAyMzYuNyAxNDQgNTEyYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xNjBjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDE2MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjc1LjN6TTQ5NiA1NDRhMTQ0IDE0NCAwIDEgMCAwLTI4OCAxNDQgMTQ0IDAgMSAwIDAgMjg4em0yMi42LTE0NGwzNi43IDM2LjdjNi4yIDYuMiA2LjIgMTYuNCAwIDIyLjZzLTE2LjQgNi4yLTIyLjYgMGwtMzYuNy0zNi43LTM2LjcgMzYuN2MtNi4yIDYuMi0xNi40IDYuMi0yMi42IDBzLTYuMi0xNi40IDAtMjIuNmwzNi43LTM2LjctMzYuNy0zNi43Yy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBsMzYuNyAzNi43IDM2LjctMzYuN2M2LjItNi4yIDE2LjQtNi4yIDIyLjYgMHM2LjIgMTYuNCAwIDIyLjZMNTE4LjYgNDAweiJdCiAgICB9OwogICAgZmFTcGEgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3BhIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY1YmIiLCAiTTE2OS43IDIyNy41YzM0LjMgMTguNyA2NC41IDQ0LjEgODguOCA3NC41IDExLjEgMTMuOSAyMSAyOC45IDI5LjQgNDQuOCA4LjUtMTUuOSAxOC4zLTMwLjggMjkuNC00NC44IDI0LjMtMzAuNSA1NC41LTU1LjkgODguOC03NC41IDQxLjctMjIuNyA4OS40LTM1LjUgMTM5LjctMzUuNWw5LjkgMGMxMS4xIDAgMjAuMSA5IDIwLjEgMjAuMSAwIDE0OC0xMTkuOSAyNjcuOS0yNjcuOSAyNjcuOWwtNDAuMiAwQzExOS45IDQ4MCAwIDM2MC4xIDAgMjEyLjEgMCAyMDEgOSAxOTIgMjAuMSAxOTJsOS45IDBjNTAuNCAwIDk4LjEgMTIuOCAxMzkuNyAzNS41ek0zMDMuOSAzOGMxNi45IDE1LjkgNjEuNCA2My40IDg5IDE0Mi4zLTQwLjEgMjAuMi03NS44IDQ4LjItMTA0LjkgODIuMS0yOS4yLTMzLjktNjQuOC02MS44LTEwNC45LTgyLjEgMjcuNi03OC45IDcyLjItMTI2LjQgODktMTQyLjMgNC4zLTQuMSAxMC02IDE1LjktNnMxMS42IDIgMTUuOSA2eiJdCiAgICB9OwogICAgZmFCYXJzUHJvZ3Jlc3MgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmFycy1wcm9ncmVzcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJ0YXNrcy1hbHQiXSwgImY4MjgiLCAiTTI4OCAxNjBsOTYgMCAwLTY0LTk2IDAgMCA2NHpNMCAxNjBMMCA4MEMwIDUzLjUgMjEuNSAzMiA0OCAzMmwzNTIgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDk2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDQ4IDIyNGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC0xNnpNMTYwIDQxNmwyMjQgMCAwLTY0LTIyNCAwIDAgNjR6TTAgNDE2bDAtODBjMC0yNi41IDIxLjUtNDggNDgtNDhsMzUyIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA5NmMwIDI2LjUtMjEuNSA0OC00OCA0OEw0OCA0ODBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMTZ6Il0KICAgIH07CiAgICBmYVRhc2tzQWx0ID0gZmFCYXJzUHJvZ3Jlc3M7CiAgICBmYUhlYXJ0Q2lyY2xlQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGVhcnQtY2lyY2xlLWNoZWNrIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU0ZmQiLCAiTTI0MSA4Ny4xbDE1IDIwLjcgMTUtMjAuN0MyOTYgNTIuNSAzMzYuMiAzMiAzNzguOSAzMiA0NTIuNCAzMiA1MTIgOTEuNiA1MTIgMTY1LjFsMCAyLjZjMCAxNy42LTMuNCAzNS42LTkuNSA1My43LTIxLjgtOC42LTQ1LjYtMTMuNC03MC41LTEzLjQtMTA2IDAtMTkyIDg2LTE5MiAxOTIgMCAyOC41IDYuMiA1NS42IDE3LjQgODAtLjUgMC0uOSAwLTEuNCAwLTE1LjUgMC0zMC44LTQuNi00My4xLTE0LjEtNzMtNTUuNy0yMTIuOS0xODYtMjEyLjktMjk4LjJsMC0yLjZDMCA5MS42IDU5LjYgMzIgMTMzLjEgMzIgMTc1LjggMzIgMjE2IDUyLjUgMjQxIDg3LjF6TTI4OCA0MDBhMTQ0IDE0NCAwIDEgMSAyODggMCAxNDQgMTQ0IDAgMSAxIC0yODggMHptMjAxLjQtNjAuOWMtNy4xLTUuMi0xNy4yLTMuNi0yMi40IDMuNWwtNTMgNzIuOS0yNi44LTI2LjhjLTYuMi02LjItMTYuNC02LjItMjIuNiAwcy02LjIgMTYuNCAwIDIyLjZsNDAgNDBjMy4zIDMuMyA3LjkgNSAxMi42IDQuNnM4LjktMi44IDExLjctNi41bDY0LTg4YzUuMi03LjEgMy42LTE3LjItMy41LTIyLjN6Il0KICAgIH07CiAgICBmYU1hcnNTdHJva2VSaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtYXJzLXN0cm9rZS1yaWdodCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzk4OTcsICJtYXJzLXN0cm9rZS1oIl0sICJmMjJiIiwgIk0zMjAuNSAyNTZhMTEyIDExMiAwIDEgMCAtMjI0IDAgMTEyIDExMiAwIDEgMCAyMjQgMHpNMjA4LjUgODBjODYuMyAwIDE1OC4xIDYyLjEgMTczLjEgMTQ0LjEgMS0uMSAxLjktLjEgMi45LS4xbDE2IDAgMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMzIgNjEuNCAwLTIyLjQtMjhjLTExLTEzLjgtOC44LTMzLjkgNS00NXMzMy45LTguOCA0NSA1bDY0IDgwYzkuMyAxMS43IDkuMyAyOC4zIDAgNDBsLTY0IDgwYy0xMSAxMy44LTMxLjIgMTYtNDUgNXMtMTYtMzEuMi01LTQ1bDIyLjQtMjgtNjEuNCAwIDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0zMi0xNiAwYy0xIDAtMS45IDAtMi45LS4xLTE1IDgyLTg2LjggMTQ0LjEtMTczLjEgMTQ0LjEtOTcuMiAwLTE3Ni03OC44LTE3Ni0xNzZzNzguOC0xNzYgMTc2LTE3NnoiXQogICAgfTsKICAgIGZhTWFyc1N0cm9rZUggPSBmYU1hcnNTdHJva2VSaWdodDsKICAgIGZhVG93ZXJPYnNlcnZhdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0b3dlci1vYnNlcnZhdGlvbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNTg2IiwgIk0yMDkuNyAzLjRjOS00LjUgMTkuNi00LjUgMjguNiAwbDE2MCA4MGMxNS44IDcuOSAyMi4yIDI3LjEgMTQuMyA0Mi45LTUuNiAxMS4yLTE2LjkgMTcuNy0yOC42IDE3LjdsMCA4MGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMTMgMCAzMiAxOTIgNDUgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA1MTJjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsNDUgMCAzMi0xOTItMTMgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC04MGMtMTEuNyAwLTIzLTYuNS0yOC42LTE3LjctNy45LTE1LjgtMS41LTM1IDE0LjMtNDIuOWwxNjAtODB6TTMxMC43IDQ0OGwtODYuNy02MS45LTg2LjcgNjEuOSAxNzMuNCAwem0tMTUzLTE5MmwtMy41IDIxLjIgNjkuOSA0OS45IDY5LjktNDkuOS0zLjUtMjEuMi0xMzIuNyAwem0tMTIuMyA3My45bC0xMC4xIDYwLjYgNDcuNS0zMy45LTM3LjQtMjYuN3ptMTE5LjkgMjYuN2w0Ny41IDMzLjktMTAuMS02MC42LTM3LjQgMjYuN3pNMTUyIDEyOGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNDQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTQ0IDB6Il0KICAgIH07CiAgICBmYVN0ZXJsaW5nU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzdGVybGluZy1zaWduIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTYzLCAiZ2JwIiwgInBvdW5kLXNpZ24iXSwgImYxNTQiLCAiTTkxLjMgMjg4bC0zNC44IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMjEuNCAwQzM3LjMgMTQ3LjMgMTA1LjEgNDIgMjA3LjYgNDJsOC4yIDBjMzMuNiAwIDY2LjIgMTEuMyA5Mi41IDMyLjJsMTYuMSAxMi43YzEzLjkgMTEgMTYuMiAzMS4xIDUuMiA0NXMtMzEuMSAxNi4yLTQ1IDUuMmwtMTYuMS0xMi43Yy0xNS0xMS45LTMzLjYtMTguNC01Mi44LTE4LjRsLTguMiAwYy01Ny4zIDAtOTQuNyA1OS45LTY5LjcgMTExLjQgMy42IDcuNCA2LjYgMTQuOSA5LjEgMjIuNmwxNDkuNSAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNDEuMiAwYzEgMzUuMy04LjcgNzAuNi0yOC45IDEwMC45bC0xOC4xIDI3LjEgMjEyLjIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMjcyIDBjLTExLjggMC0yMi42LTYuNS0yOC4yLTE2LjlzLTUtMjMgMS42LTMyLjlsNTEuMi03Ni44YzEzLjEtMTkuNiAxOS4yLTQyLjYgMTguMi02NS40eiJdCiAgICB9OwogICAgZmFHYnAgPSBmYVN0ZXJsaW5nU2lnbjsKICAgIGZhUG91bmRTaWduID0gZmFTdGVybGluZ1NpZ247CiAgICBmYUZhdWNldERyaXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmF1Y2V0LWRyaXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg2ODhdLCAiZTAwNiIsICJNMjI0IDMyYy0xNy43IDAtMzIgMTQuMy0zMiAzMkw5NiA2NEM3OC4zIDY0IDY0IDc4LjMgNjQgOTZzMTQuMyAzMiAzMiAzMmw5NiAwIDAgNjQtMTguNyAwYy04LjUgMC0xNi42IDMuNC0yMi42IDkuNEwxMjggMjI0IDMyIDIyNGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxMDAuMSAwYzIwLjIgMjkgNTMuOSA0OCA5MS45IDQ4czcxLjctMTkgOTEuOS00OGwzNi4xIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzMTQuMyAzMiAzMiAzMmw2NCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMyIDAtODguNC03MS42LTE2MC0xNjAtMTYwbC0zMiAwLTIyLjYtMjIuNmMtNi02LTE0LjEtOS40LTIyLjYtOS40bC0xOC43IDAgMC02NCA5NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC05NiAwYzAtMTcuNy0xNC4zLTMyLTMyLTMyek00MzYuOCA0NTUuNGwtMTguMiA0Mi40Yy0xLjggNC4xLTIuNyA4LjYtMi43IDEzLjFsMCAxLjJjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTEuMmMwLTQuNS0uOS04LjktMi43LTEzLjFsLTE4LjItNDIuNGMtMS45LTQuNS02LjMtNy40LTExLjItNy40cy05LjIgMi45LTExLjIgNy40eiJdCiAgICB9OwogICAgZmFDaXJjbGVJbmZvID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1pbmZvIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImluZm8tY2lyY2xlIl0sICJmMDVhIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMjI0IDE2MGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0tOCA2NGw0OCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgODggOCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC04MCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDI0IDAgMC02NC0yNCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFJbmZvQ2lyY2xlID0gZmFDaXJjbGVJbmZvOwogICAgZmFGZWF0aGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZlYXRoZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjk3MThdLCAiZjUyZCIsICJNMzUyIDBjNDEgMCA4MC4zIDE2LjMgMTA5LjIgNDUuMmw1LjUgNS41YzI5IDI5IDQ1LjMgNjguMyA0NS4zIDEwOS4yIDAgMjQuMS01LjcgNDcuNi0xNi4yIDY4LjgtMS45IDMuNy01LjMgNi41LTkuMyA3LjdMMzc0LjUgMjcwYy0zLjkgMS4yLTYuNSA0LjctNi41IDguOCAwIDUuMSA0LjEgOS4yIDkuMiA5LjJsMzIuMiAwYzE0LjMgMCAyMS40IDE3LjIgMTEuMyAyNy4zbC0yMi40IDIyLjRjLTEuOSAxLjktNC4yIDMuMi02LjcgNGwtODEgMjQuM2MtMy45IDEuMi02LjUgNC43LTYuNSA4LjggMCA1LjEgNC4xIDkuMiA5LjIgOS4yIDEzLjIgMCAxOC45IDE1LjcgNy44IDIyLjktNDEuMSAyNi42LTg5LjMgNDEuMS0xMzkgNDEuMWwtODYgMC00OCA0OGMtOC44IDguOC0yMy4yIDguOC0zMiAwcy04LjgtMjMuMiAwLTMyTDI1NiAyMjRjOC44LTguOCA4LjgtMjMuMiAwLTMycy0yMy4yLTguOC0zMiAwTDc5LjUgMzM2LjVjLTUuNyA1LjctMTUuNSAxLjctMTUuNS02LjQgMC02Ny45IDI3LTEzMyA3NS0xODFMMjQyLjggNDUuMkMyNzEuNyAxNi4zIDMxMSAwIDM1MiAweiJdCiAgICB9OwogICAgZmFCb3dsUmljZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib3dsLXJpY2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTJlYiIsICJNMTc2IDQwYzAtMTMuMyAxMC43LTI0IDI0LTI0bDE2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0em0yNCA0OGwxNiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0ek01NiAxNjBsMTYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHpNMCAyODMuNEMwIDI2OC4zIDEyLjMgMjU2IDI3LjQgMjU2bDQ1Ny4xIDBjMTUuMSAwIDI3LjQgMTIuMyAyNy40IDI3LjQgMCA3MC41LTQ0LjQgMTMwLjctMTA2LjcgMTU0LjFMNDAzLjUgNDUyYy0yIDE2LTE1LjYgMjgtMzEuOCAyOGwtMjMxLjUgMGMtMTYuMSAwLTI5LjgtMTItMzEuOC0yOGwtMS44LTE0LjRDNDQuNCA0MTQuMSAwIDM1My45IDAgMjgzLjR6TTIyNCAxODRjMC0xMy4zIDEwLjctMjQgMjQtMjRsMTYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjR6bS05NiAwYzAtMTMuMyAxMC43LTI0IDI0LTI0bDE2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0ek0xMDQgODhsMTYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHptMjE2IDk2YzAtMTMuMyAxMC43LTI0IDI0LTI0bDE2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0ek0yOTYgODhsMTYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHptMTIwIDk2YzAtMTMuMyAxMC43LTI0IDI0LTI0bDE2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0ek0zOTIgODhsMTYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHpNMjk2IDE2bDE2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYVN0YXJIYWxmU3Ryb2tlMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzdGFyLWhhbGYtc3Ryb2tlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInN0YXItaGFsZi1hbHQiXSwgImY1YzAiLCAiTTI4OC4xIDM1My42YzEwIDAgMTkuOSAyLjMgMjkgN2w3NC40IDM3LjktMTMtODIuNWMtMy4yLTIwLjIgMy41LTQwLjcgMTcuOS01NS4ybDU5LTU5LjEtODIuNS0xMy4xYy0yMC4yLTMuMi0zNy43LTE1LjktNDctMzQuMWwtMzgtNzQuNCAwIDI3My42ek00NTcuNCA0ODljLTcuMyA1LjMtMTcgNi4xLTI1IDJMMjg4LjEgNDE3LjYgMTQzLjggNDkxYy04IDQuMS0xNy43IDMuMy0yNS0ycy0xMS0xNC4yLTkuNi0yMy4yTDEzNC40IDMwNS45IDIwIDE5MS40Yy02LjQtNi40LTguNi0xNS44LTUuOC0yNC40czEwLjEtMTQuOSAxOS4xLTE2LjNsMTU5LjktMjUuNCA3My42LTE0NC4yYzQuMS04IDEyLjQtMTMuMSAyMS40LTEzLjFzMTcuMyA1LjEgMjEuNCAxMy4xTDM4MyAxMjUuMyA1NDIuOSAxNTAuN2M4LjkgMS40IDE2LjMgNy43IDE5LjEgMTYuM3MuNSAxOC01LjggMjQuNEw0NDEuNyAzMDUuOSA0NjcgNDY1LjhjMS40IDguOS0yLjMgMTcuOS05LjYgMjMuMnoiXQogICAgfTsKICAgIGZhU3RhckhhbGZBbHQyID0gZmFTdGFySGFsZlN0cm9rZTI7CiAgICBmYVRlbXBlcmF0dXJlQXJyb3dEb3duID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRlbXBlcmF0dXJlLWFycm93LWRvd24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsidGVtcGVyYXR1cmUtZG93biJdLCAiZTAzZiIsICJNNjQuNSA5NmMwLTUzIDQzLTk2IDk2LTk2czk2IDQzIDk2IDk2bDAgMTY0LjdjMjkuNSAyNi40IDQ4IDY0LjcgNDggMTA3LjMgMCA3OS41LTY0LjUgMTQ0LTE0NCAxNDRzLTE0NC02NC41LTE0NC0xNDRjMC00Mi42IDE4LjUtODEgNDgtMTA3LjNMNjQuNSA5NnptOTYgMzM2YzM1LjMgMCA2NC0yOC43IDY0LTY0IDAtMjYuOS0xNi41LTQ5LjktNDAtNTkuM2wwLTI4LjdjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAyOC43Yy0yMy41IDkuNS00MCAzMi41LTQwIDU5LjMgMCAzNS4zIDI4LjcgNjQgNjQgNjR6TTQzOS4xIDMxMC42Yy02IDYtMTQuMSA5LjQtMjIuNiA5LjRzLTE2LjYtMy40LTIyLjYtOS40bC02NC02NGMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMGw5LjQgOS40IDAtMTc4LjdjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDE3OC43IDkuNC05LjRjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM2wtNjQgNjR6Il0KICAgIH07CiAgICBmYVRlbXBlcmF0dXJlRG93biA9IGZhVGVtcGVyYXR1cmVBcnJvd0Rvd247CiAgICBmYU1hc2tWZW50aWxhdG9yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hc2stdmVudGlsYXRvciIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTI0IiwgIk0xNTIuMiAxOTJjLTE1LjQgMzguMy0yNC4yIDc3LjItMjQuMiAxMDguOCAwIDEzLjMgMS41IDI2LjIgNC40IDM4LjdsLTE3LTMuNGMtMjkuOS02LTUxLjQtMzIuMi01MS40LTYyLjhsMC04MS4zIDg4LjIgMHptMzIuOS02NEw2NCAxMjhjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgODEuM2MwIDYxIDQzLjEgMTEzLjUgMTAyLjkgMTI1LjVsNjYuMyAxMy4zYzE4LjcgMjIuMSA0Mi45IDQwIDcwLjggNTEuOGwwLTg3LjhjLTEwLjEtMTQuMi0xNi0zMS4zLTE2LTQ5LjcgMC00OS41IDQzLTEzNC40IDk2LTEzNC40IDUyLjUgMCA5NiA4NC45IDk2IDEzNC40IDAgMTguNC01LjkgMzUuNC0xNiA0OS42bDAgODcuN2MyNy42LTExLjggNTEuNy0yOS42IDcwLjQtNTEuNmw2Ni43LTEzLjNjNTkuOC0xMiAxMDIuOS02NC41IDEwMi45LTEyNS41bDAtODEuM2MwLTM1LjMtMjguNy02NC02NC02NGwtMTIxLjUgMGMtMzQuOC01NC4yLTgyLjUtOTYtMTM0LjUtOTYtNTIuNiAwLTEwMC4yIDQxLjgtMTM0LjkgOTZ6bTMwMi41IDY0bDg4LjQgMCAwIDgxLjNjMCAzMC41LTIxLjUgNTYuOC01MS40IDYyLjhsLTE3IDMuNGMyLjktMTIuNCA0LjUtMjUuNCA0LjUtMzguNyAwLTMxLjYtOC45LTcwLjUtMjQuNC0xMDguOHpNMjg4IDMyMGwwIDE5MiA2NCAwIDAtMTkyYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMyeiJdCiAgICB9OwogICAgZmFGaWxlVmlkZW8yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbGUtdmlkZW8iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjFjOCIsICJNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMMjEzLjUgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN0wzNjUuMyAxMjUuM2MxMiAxMiAxOC43IDI4LjMgMTguNyA0NS4zTDM4NCA0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDY0em0yMDgtNS41bDAgOTMuNWMwIDEzLjMgMTAuNyAyNCAyNCAyNEwzMjUuNSAxNzYgMjA4IDU4LjV6TTgwIDMwNGwwIDk2YzAgMTcuNyAxNC4zIDMyIDMyIDMybDk2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0yNCAzNSAzNWMzLjIgMy4yIDcuNSA1IDEyIDUgOS40IDAgMTctNy42IDE3LTE3bDAtOTQuMWMwLTkuNC03LjYtMTctMTctMTctNC41IDAtOC44IDEuOC0xMiA1bC0zNSAzNSAwLTI0YzAtMTcuNy0xNC4zLTMyLTMyLTMybC05NiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnoiXQogICAgfTsKICAgIGZhQXJyb3dUcmVuZERvd24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctdHJlbmQtZG93biIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlMDk3IiwgIk0zODQgMzUyYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDE2MCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMTYwYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgODIuNy0xNjkuNC0xNjkuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBMMTkyIDI0Mi43IDU0LjYgMTA1LjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zbDE2MCAxNjBjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBMMzIwIDIwNS4zIDQ2Ni43IDM1MiAzODQgMzUyeiJdCiAgICB9OwogICAgZmFPaWxDYW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAib2lsLWNhbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNjEzIiwgIk0zMjAgMTI4YzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDE5MiA2NGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzMiAwIDAgMzItMTc2IDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgNjQuOGMwIDE5IDExLjIgMzYuMiAyOC41IDQzLjlsNjcuNSAzMCAwIDIxLjNjMCAyNi41IDIxLjUgNDggNDggNDhsMjU5LjEgMGMxOC40IDAgMzUuOC03LjkgNDgtMjEuN0w2MzMuNSAxODcuN2MxMi4zLTEzLjktLjMtMzUuNC0xOC40LTMxLjVMNDQ4IDE5MiAzOTcuNSAxNjYuOGMtOC45LTQuNC0xOC43LTYuOC0yOC42LTYuOGwtODAuOSAwIDAtMzIgMzIgMHpNOTYgMjA4bDAgODYuMS00OC0yMS4zIDAtNjQuOCA0OCAweiJdCiAgICB9OwogICAgZmFQZW9wbGVDYXJyeUJveCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZW9wbGUtY2FycnktYm94IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInBlb3BsZS1jYXJyeSJdLCAiZjRjZSIsICJNNjQtMzJBNTYgNTYgMCAxIDEgNjQgODAgNTYgNTYgMCAxIDEgNjQtMzJ6TTAgMTcxLjFjMC0zMi42IDI2LjUtNTkuMSA1OS4xLTU5LjEgMjMuNSAwIDQ1LjUgMTEuMyA1OS4xIDMwLjRsNDguNyA2OC4yYzUuOCA4LjIgMTUuMSAxMy4xIDI1LjEgMTMuNGwwLTk2YzAtMTcuNyAxNC4zLTMyIDMyLTMybDEyOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgOTZjMTAtLjMgMTkuMy01LjIgMjUuMS0xMy40bDQ4LjctNjguMmMxMy42LTE5LjEgMzUuNi0zMC40IDU5LjEtMzAuNCAzMi42IDAgNTkuMSAyNi41IDU5LjEgNTkuMUw1NzYgMjcyYzAgMzAuMi0xNC4yIDU4LjctMzguNCA3Ni44bC03Ni44IDU3LjZjLTguMSA2LTEyLjggMTUuNS0xMi44IDI1LjZsMCA4MGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTgwYzAtMzAuMiAxNC4yLTU4LjcgMzguNC03Ni44bDQxLjYtMzEuMiAwLTgwLjEtMi44IDMuOWMtMTggMjUuMi00Ny4xIDQwLjItNzguMSA0MC4yTDM1MiAyODhjLS42IDAtMS4zIDAtMS45LS4xLS42IDAtMS4zIC4xLTEuOSAuMWwtMTIwLjQgMGMtLjYgMC0xLjMgMC0xLjktLjEtLjYgMC0xLjMgLjEtMS45IC4xbC0zMS4xIDBjLTMxIDAtNjAuMS0xNS03OC4xLTQwLjJsLTIuOC0zLjkgMCA4MC4xIDQxLjYgMzEuMkMxNzcuOCAzNzMuMyAxOTIgNDAxLjggMTkyIDQzMmwwIDgwYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtODBjMC0xMC4xLTQuNy0xOS42LTEyLjgtMjUuNkwzOC40IDM0OC44QzE0LjIgMzMwLjcgMCAzMDIuMiAwIDI3MkwwIDE3MS4xek0wIDM3OS4zYzMuMSAyLjcgNi4zIDUuNCA5LjYgNy45TDY0IDQyOCA2NCA1MTJjMCAxNy43LTE0LjMgMzItMzIgMzJTMCA1MjkuNyAwIDUxMkwwIDM3OS4zek01NjggMjRhNTYgNTYgMCAxIDEgLTExMiAwIDU2IDU2IDAgMSAxIDExMiAwem04IDQ4OGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTg0IDU0LjQtNDAuOGMzLjMtMi41IDYuNS01LjEgOS42LTcuOUw1NzYgNTEyeiJdCiAgICB9OwogICAgZmFQZW9wbGVDYXJyeSA9IGZhUGVvcGxlQ2FycnlCb3g7CiAgICBmYUNoYWlyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoYWlyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI5NjgxXSwgImY2YzAiLCAiTTE1MiAyNTZsMC0xODEuOGMtMjQuNSAyMC41LTQwIDUxLjQtNDAgODUuOGwwIDk2IDQwIDB6bTQ4IDBsNDggMCAwLTIwNS40Yy03LjctMS43LTE1LjgtMi42LTI0LTIuNnMtMTYuMyAuOS0yNCAyLjZMMjAwIDI1NnpNMjk2IDc0LjJsMCAxODEuOCA0MCAwIDAtOTZjMC0zNC40LTE1LjUtNjUuMi00MC04NS44ek0zMiAyNTZsMzIgMCAwLTk2QzY0IDcxLjYgMTM1LjYgMCAyMjQgMFMzODQgNzEuNiAzODQgMTYwbDAgOTYgMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMybDAgOTZjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC05Ni0yNTYgMCAwIDk2YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtOTZjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJ6Il0KICAgIH07CiAgICBmYVdpbmQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid2luZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNzJlIiwgIk0yODggMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJsNDAgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNEwzMiAxMTJjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzI4IDBjNDguNiAwIDg4LTM5LjQgODgtODhTNDA4LjYgMCAzNjAgMEwzMjAgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6bTY0IDM1MmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMiAwYzUzIDAgOTYtNDMgOTYtOTZzLTQzLTk2LTk2LTk2TDMyIDIyNGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzODQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6TTEyOCA1MTJsNDAgMGM0OC42IDAgODgtMzkuNCA4OC04OHMtMzkuNC04OC04OC04OEwzMiAzMzZjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMTM2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTQwIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJ6Il0KICAgIH07CiAgICBmYUxheWVyR3JvdXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGF5ZXItZ3JvdXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjVmZCIsICJNMjMyLjUgNS4yYzE0LjktNi45IDMyLjEtNi45IDQ3IDBsMjE4LjYgMTAxYzguNSAzLjkgMTMuOSAxMi40IDEzLjkgMjEuOHMtNS40IDE3LjktMTMuOSAyMS44bC0yMTguNiAxMDFjLTE0LjkgNi45LTMyLjEgNi45LTQ3IDBMMTMuOSAxNDkuOEM1LjQgMTQ1LjggMCAxMzcuMyAwIDEyOHM1LjQtMTcuOSAxMy45LTIxLjhMMjMyLjUgNS4yek00OC4xIDIxOC40bDE2NC4zIDc1LjljMjcuNyAxMi44IDU5LjYgMTIuOCA4Ny4zIDBsMTY0LjMtNzUuOSAzNC4xIDE1LjhjOC41IDMuOSAxMy45IDEyLjQgMTMuOSAyMS44cy01LjQgMTcuOS0xMy45IDIxLjhsLTIxOC42IDEwMWMtMTQuOSA2LjktMzIuMSA2LjktNDcgMEwxMy45IDI3Ny44QzUuNCAyNzMuOCAwIDI2NS4zIDAgMjU2czUuNC0xNy45IDEzLjktMjEuOGwzNC4xLTE1Ljh6TTEzLjkgMzYyLjJsMzQuMS0xNS44IDE2NC4zIDc1LjljMjcuNyAxMi44IDU5LjYgMTIuOCA4Ny4zIDBsMTY0LjMtNzUuOSAzNC4xIDE1LjhjOC41IDMuOSAxMy45IDEyLjQgMTMuOSAyMS44cy01LjQgMTcuOS0xMy45IDIxLjhsLTIxOC42IDEwMWMtMTQuOSA2LjktMzIuMSA2LjktNDcgMEwxMy45IDQwNS44QzUuNCA0MDEuOCAwIDM5My4zIDAgMzg0czUuNC0xNy45IDEzLjktMjEuOHoiXQogICAgfTsKICAgIGZhSGVhZFNpZGVNYXNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhlYWQtc2lkZS1tYXNrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUwNjMiLCAiTTQ0NS45IDE5M2MtLjEtLjQtLjItLjktLjItMS4zLTE1LjctMTA4LjQtMTA4LjktMTkxLjctMjIxLjctMTkxLjctODUgMC0xNTkgNDcuNC0xOTYuOSAxMTcuMkwyODMuMyAyODggNDU2IDI4OCA0NDIuOSAzMzYgMzM2IDMzNmMtOC44IDAtMTYgNy4yLTE2IDE2czcuMiAxNiAxNiAxNmw5OC4yIDAtOC43IDMyLTg5LjUgMGMtOC44IDAtMTYgNy4yLTE2IDE2czcuMiAxNiAxNiAxNmw4MC42IDBjLTYuNyAxOS4xLTI0LjggMzItNDUuMyAzMkwyODggNDY0Yy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTEwNC41LTI0Ny41LTE2NUMzIDE4Mi4xIDAgMjAyLjcgMCAyMjQgMCAyNzggMTkuMSAzMjcuNSA1MC45IDM2Ni4yIDU4LjkgMzc1LjkgNjQgMzg3LjggNjQgNDAwLjRMNjQgNDY0YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDEyNy4zIDAgLjcgMCAxMzEuMyAwYzQ0LjkgMCA4My44LTMxLjEgOTMuNi03NC45bDMzLjktMTUwLjNjMy4zLTE0LjQtLjMtMjkuNS05LjctNDFMNDQ1LjkgMTkzek0yODggMTkyYTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6Il0KICAgIH07CiAgICBmYUhhbmRzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbmRzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNpZ24tbGFuZ3VhZ2UiLCAic2lnbmluZyJdLCAiZjJhNyIsICJNNTEyIDE2MGwtLjEgNzIuNmMwIDQ0LjgtMTcuNiA4Ny4xLTQ3LjkgMTE4LjQtLjMtNzctNDAuMS0xNDguNC0xMDUuNC0xODkuM2wtMS45LTEuMmMyLjUtMy43IDIuOC04LjYgLjQtMTIuN2wtNjItMTA3LjRjLTYuNi0xMS41LTIuNy0yNi4yIDguOC0zMi44UzMzMCA1IDMzNi42IDE2LjVsNjggMTE3LjggMCAwIDAgMCA0My4zIDc1IC4xLTQ5LjNjMC0xNy43IDE0LjQtMzIgMzItMzJzMzIgMTQuNCAzMiAzMnpNMjk4LjQgMTI0LjJjLTE0LjEtOC44LTI5LjgtMTIuNy00NS4yLTEyLjFMMjE2LjcgNDguOGMtNi42LTExLjUtMi43LTI2LjIgOC44LTMyLjhzMjYuMi0yLjcgMzIuOCA4LjhsNjcuMSAxMTYuMi0yNy0xNi45ek0yMTEuOSA4OC41bDE2LjQgMjguNGMtMTUuMSA1LjUtMjguNiAxNS42LTM4LjMgMjkuN2wtMTkuNy0zNC4yYy02LjYtMTEuNS0yLjctMjYuMiA4LjgtMzIuOHMyNi4yLTIuNyAzMi44IDguOHptLTQ2LjQgNjMuN2wxMi41IDIxLjdjLTIgOC42LTIuNSAxNy41LTEuNyAyNi4xbC00LjMgMCAwIDAtMzQuNCAwLTEzLjctMjMuOGMtNi42LTExLjUtMi43LTI2LjIgOC44LTMyLjhzMjYuMi0yLjcgMzIuOCA4Ljh6TTIyOC45IDE3NWM5LjQtMTUgMjkuMS0xOS41IDQ0LjEtMTAuMmw2MC4yIDM3LjZDMzg0LjcgMjM0LjcgNDE2IDI5MS4yIDQxNiAzNTJsMCA4YzAgODMuOS02OC4xIDE1Mi0xNTIgMTUyTDg4IDUxMmMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGw5MiAwYzYuNiAwIDEyLTUuNCAxMi0xMnMtNS40LTEyLTEyLTEyTDU2IDQ0MGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxMjQgMGM2LjYgMCAxMi01LjQgMTItMTJzLTUuNC0xMi0xMi0xMkwyNCAzNjhjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMTU2IDBjNi42IDAgMTItNS40IDEyLTEycy01LjQtMTItMTItMTJMNTYgMjk2Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDEzNiAwIDAgMCAwIDAgOTMuMiAwLTQ2LjItMjguOWMtMTUtOS40LTE5LjUtMjkuMS0xMC4yLTQ0LjF6Il0KICAgIH07CiAgICBmYVNpZ25MYW5ndWFnZSA9IGZhSGFuZHM7CiAgICBmYVNpZ25pbmcgPSBmYUhhbmRzOwogICAgZmFUYWJsZXRzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRhYmxldHMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjQ5MCIsICJNNDk1LjMgNzYuNmMtNC42LTguNy0xNi4zLTkuNy0yMy4zLTIuN0wyOTcuOSAyNDhjLTcgNy02IDE4LjcgMi43IDIzLjMgMjAuMSAxMC43IDQzIDE2LjcgNjcuNCAxNi43IDc5LjUgMCAxNDQtNjQuNSAxNDQtMTQ0IDAtMjQuMy02LTQ3LjMtMTYuNy02Ny40ek0yNDAuNyAyMTEuNGM0LjYgOC43IDE2LjMgOS43IDIzLjMgMi43TDQzOC4xIDQwYzctNyA2LTE4LjctMi43LTIzLjMtMjAuMS0xMC43LTQzLTE2LjctNjcuNC0xNi43LTc5LjUgMC0xNDQgNjQuNS0xNDQgMTQ0IDAgMjQuMyA2IDQ3LjMgMTYuNyA2Ny40ek0xNDQgMjI0Qzc5LjIgMjI0IDI0LjQgMjY2LjggNi4zIDMyNS42IDMuNCAzMzUuMSAxMSAzNDQgMjAuOSAzNDRsMjQ2LjIgMGM5LjkgMCAxNy41LTguOSAxNC42LTE4LjQtLjktMy0xLjktNS45LTMtOC43LTM3LjQtMTguMS02OC00OC04Ny04NC44LTE0LjktNS4yLTMwLjktOC4xLTQ3LjYtOC4xek0yODEuNyA0MTAuNGMyLjktOS41LTQuNy0xOC40LTE0LjYtMTguNEwyMC45IDM5MkMxMSAzOTIgMy40IDQwMC45IDYuMyA0MTAuNCAyNC40IDQ2OS4yIDc5LjIgNTEyIDE0NCA1MTJzMTE5LjYtNDIuOCAxMzcuNy0xMDEuNnoiXQogICAgfTsKICAgIGZhV2VpZ2h0SGFuZ2luZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3ZWlnaHQtaGFuZ2luZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNWNkIiwgIk0yMjQgOTZhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptMTIyLjUgMzJjMy41LTEwIDUuNS0yMC44IDUuNS0zMiAwLTUzLTQzLTk2LTk2LTk2cy05NiA0My05NiA5NmMwIDExLjIgMS45IDIyIDUuNSAzMmwtMjEuOCAwYy0yOC4zIDAtNTMuMiAxOC41LTYxLjMgNDUuNkwyLjQgNDQwLjJDLjggNDQ1LjQgMCA0NTAuOCAwIDQ1Ni4yIDAgNDg3IDI1IDUxMiA1NS44IDUxMmw0MDAuNCAwYzMwLjggMCA1NS44LTI1IDU1LjgtNTUuOCAwLTUuNC0uOC0xMC44LTIuNC0xNmwtODAtMjY2LjVjLTguMS0yNy4xLTMzLTQ1LjYtNjEuMy00NS42bC0yMS44IDB6Il0KICAgIH07CiAgICBmYURpY2UgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZGljZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyNzkyMl0sICJmNTIyIiwgIk0xNDEuNCAyLjNDMTAzLTggNjMuNSAxNC44IDUzLjMgNTMuMkwyLjUgMjQyLjdDLTcuOCAyODEuMSAxNSAzMjAuNiA1My40IDMzMC45bDE4OS41IDUwLjhjMzguNCAxMC4zIDc3LjktMTIuNSA4OC4yLTUwLjlsNTAuOC0xODkuNWMxMC4zLTM4LjQtMTIuNS03Ny45LTUwLjktODguMkwxNDEuNCAyLjN6bTIzIDIwNS43YTMyIDMyIDAgMSAxIDU1LjQtMzIgMzIgMzIgMCAxIDEgLTU1LjQgMzJ6TTc5LjIgMjIwLjNhMzIgMzIgMCAxIDEgMzIgNTUuNCAzMiAzMiAwIDEgMSAtMzItNTUuNHptMTg1IDk2LjRhMzIgMzIgMCAxIDEgLTMyLTU1LjQgMzIgMzIgMCAxIDEgMzIgNTUuNHptOS0yMDguNGEzMiAzMiAwIDEgMSAzMiA1NS40IDMyIDMyIDAgMSAxIC0zMi01NS40em0tMTIxIDE0LjRhMzIgMzIgMCAxIDEgLTMyLTU1LjQgMzIgMzIgMCAxIDEgMzIgNTUuNHpNNDE4IDE5MkwzNzcuNCAzNDMuMmMtMTcuMiA2NC04MyAxMDItMTQ3IDg0LjlsLTM4LjMtMTAuMyAwIDMwLjJjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTkyIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xOTJjMC0zNS4zLTI4LjctNjQtNjQtNjRMNDE4IDE5MnoiXQogICAgfTsKICAgIGZhU2hvcFNsYXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNob3Atc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsic3RvcmUtYWx0LXNsYXNoIl0sICJlMDcwIiwgIk00MS0yNC45Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMFMtMi4zLS4zIDcgOS4xbDUyOCA1MjhjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC01Ny01NyAwLTE5MC4zYzI2LjgtMS45IDQ4LTI0LjMgNDgtNTEuNiAwLTgtMS45LTE2LTUuNS0yMy4yTDQ5Ny43IDY3LjRDNDg2LjggNDUuNyA0NjQuNyAzMiA0NDAuNCAzMkwxMzUuNiAzMmMtMTAuNyAwLTIxIDIuNy0zMC4yIDcuNkw0MS0yNC45ek0zMjEuOCAyNTZMNDQ4IDI1NiA0NDggMzgyLjIgMzIxLjggMjU2ek0zNTIgNDIxLjhsLTY0LTY0IDAgMTAuMmMwIDguOC03LjIgMTYtMTYgMTZsLTEyOCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0xMTIgNTguMiAwLTEzNC44LTEzNC44LTI5LjkgNTkuOWMtMy42IDcuMi01LjUgMTUuMS01LjUgMjMuMiAwIDI3LjMgMjEuMiA0OS43IDQ4IDUxLjZMNjQgNDMyYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDE5MiAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMTAuMnoiXQogICAgfTsKICAgIGZhU3RvcmVBbHRTbGFzaCA9IGZhU2hvcFNsYXNoOwogICAgZmFTb3J0RG93biA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzb3J0LWRvd24iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsic29ydC1kZXNjIl0sICJmMGRkIiwgIk0zMiAyODhjLTEyLjkgMC0yNC42IDcuOC0yOS42IDE5LjhTLjIgMzMzLjUgOS40IDM0Mi42bDE2MCAxNjBjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsMTYwLTE2MGM5LjItOS4yIDExLjktMjIuOSA2LjktMzQuOVMzNjQuOSAyODggMzUyIDI4OEwzMiAyODh6Il0KICAgIH07CiAgICBmYVNvcnREZXNjID0gZmFTb3J0RG93bjsKICAgIGZhUGVzZXRhU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXNldGEtc2lnbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlMjIxIiwgIk0xMTIgMzJDOTQuMyAzMiA4MCA0Ni4zIDgwIDY0bDAgMTA0LTI0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMjQgMCAwIDIzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtOTYgOTYgMGM4MC4yIDAgMTQ2LjYtNTkgMTU4LjItMTM2bDI1LjggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMjUuOCAwQzM4Ni42IDkxIDMyMC4yIDMyIDI0MCAzMkwxMTIgMzJ6TTMzMyAxNjhsLTE4OSAwIDAtNzIgOTYgMGM0NC43IDAgODIuMyAzMC42IDkzIDcyek0xNDQgMjE2bDE4OSAwYy0xMC43IDQxLjQtNDguMiA3Mi05MyA3MmwtOTYgMCAwLTcyeiJdCiAgICB9OwogICAgZmFUYWJsZXRTY3JlZW5CdXR0b24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGFibGV0LXNjcmVlbi1idXR0b24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsidGFibGV0LWFsdCJdLCAiZjNmYSIsICJNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMMzg0IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzODRjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDY0ek0yNTYgNDMyYTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6TTM4NCA2NGwtMzIwIDAgMCAyODggMzIwIDAgMC0yODh6Il0KICAgIH07CiAgICBmYVRhYmxldEFsdCA9IGZhVGFibGV0U2NyZWVuQnV0dG9uOwogICAgZmFIYW5kSG9sZGluZ0RvbGxhciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kLWhvbGRpbmctZG9sbGFyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImhhbmQtaG9sZGluZy11c2QiXSwgImY0YzAiLCAiTTI4OC0xNmMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAxMi0xLjggMGMtMzYuNiAwLTY2LjIgMjkuNy02Ni4yIDY2LjIgMCAzMy40IDI0LjkgNjEuNiA1OCA2NS43bDYxIDcuNmM1LjEgLjYgOSA1IDkgMTAuMiAwIDUuNy00LjYgMTAuMi0xMC4yIDEwLjJMMjQwIDE4MGMtMTUuNSAwLTI4IDEyLjUtMjggMjhzMTIuNSAyOCAyOCAyOGwyNCAwIDAgMTJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTEyIDEuOCAwYzM2LjYgMCA2Ni4yLTI5LjcgNjYuMi02Ni4yIDAtMzMuNC0yNC45LTYxLjYtNTgtNjUuN2wtNjEtNy42Yy01LjEtLjYtOS01LTktMTAuMiAwLTUuNyA0LjYtMTAuMiAxMC4yLTEwLjJMMzI4IDc2YzE1LjUgMCAyOC0xMi41IDI4LTI4cy0xMi41LTI4LTI4LTI4bC0xNiAwIDAtMTJjMC0xMy4zLTEwLjctMjQtMjQtMjR6TTEwOS4zIDM0MS41TDY2LjcgMzg0IDMyIDM4NGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMjAuNSAwYzI5IDAgNTcuMy05LjMgODAuNy0yNi41bDEyNi42LTkzLjNjMTcuOC0xMy4xIDIxLjYtMzguMSA4LjUtNTUuOXMtMzguMS0yMS42LTU1LjktOC41TDM5Mi42IDQxNiAyODAgNDE2Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDcyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTE1Mi4yIDBjLTMzLjkgMC02Ni41IDEzLjUtOTAuNSAzNy41eiJdCiAgICB9OwogICAgZmFIYW5kSG9sZGluZ1VzZCA9IGZhSGFuZEhvbGRpbmdEb2xsYXI7CiAgICBmYVNoaWVsZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaGllbGQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg3MzcsICJzaGllbGQtYmxhbmsiXSwgImYxMzIiLCAiTTI1NiAwYzQuNiAwIDkuMiAxIDEzLjQgMi45TDQ1Ny44IDgyLjhjMjIgOS4zIDM4LjQgMzEgMzguMyA1Ny4yLS41IDk5LjItNDEuMyAyODAuNy0yMTMuNiAzNjMuMi0xNi43IDgtMzYuMSA4LTUyLjggMC0xNzIuNC04Mi41LTIxMy4xLTI2NC0yMTMuNi0zNjMuMi0uMS0yNi4yIDE2LjMtNDcuOSAzOC4zLTU3LjJMMjQyLjcgMi45QzI0Ni45IDEgMjUxLjQgMCAyNTYgMHoiXQogICAgfTsKICAgIGZhU2hpZWxkQmxhbmsgPSBmYVNoaWVsZDsKICAgIGZhRmFjZUxhdWdoMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWxhdWdoIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImxhdWdoIl0sICJmNTk5IiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMTAxLjYgMzE0Yy0zLjctMTMuNyA3LjUtMjYgMjEuNy0yNmwyNjUuNCAwYzE0LjIgMCAyNS40IDEyLjMgMjEuNyAyNi0xOC41IDY4LTgwLjYgMTE4LTE1NC40IDExOFMxMjAgMzgyIDEwMS42IDMxNHpNMTQ0IDE5MmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0xOTItMzJhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFMYXVnaDIgPSBmYUZhY2VMYXVnaDI7CiAgICBmYUhhbmRzSG9sZGluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kcy1ob2xkaW5nIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY0YzIiLCAiTTgwIDEwNGMwLTIyLjEtMTcuOS00MC00MC00MFMwIDgxLjkgMCAxMDRMMCAzMjUuNWMwIDI1LjUgMTAuMSA0OS45IDI4LjEgNjcuOUwxMjggNDkzLjNjMTIgMTIgMjguMyAxOC43IDQ1LjMgMTguN2w2Ni43IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC03OC45YzAtMjkuNy0xMS44LTU4LjItMzIuOC03OS4ybC0yNS4zLTI1LjMgMCAwYy03LjMtNy4zLTIzLjEtMjMuMS00Ny4yLTQ3LjItMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNjMjQuMSAyNC4xIDM5LjkgMzkuOSA0Ny4yIDQ3LjIgMTEgMTEgOS4yIDI5LjItMy43IDM3LjgtOS43IDYuNS0yMi43IDUuMi0zMS0zLjFMOTguNyAzMDkuNWMtMTItMTItMTguNy0yOC4zLTE4LjctNDUuM0w4MCAxMDR6bTQ4MCAwbDAgMTYwLjJjMCAxNy02LjcgMzMuMy0xOC43IDQ1LjNsLTUxLjEgNTEuMWMtOC4zIDguMy0yMS4zIDkuNi0zMSAzLjEtMTIuOS04LjYtMTQuNy0yNi45LTMuNy0zNy44IDcuMy03LjMgMjMuMS0yMy4xIDQ3LjItNDcuMiAxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMGMtMjQuMSAyNC4xLTM5LjkgMzkuOS00Ny4yIDQ3LjJsMCAwLTI1LjMgMjUuM2MtMjEgMjEtMzIuOCA0OS41LTMyLjggNzkuMmwwIDc4LjljMCAyNi41IDIxLjUgNDggNDggNDhsNjYuNyAwYzE3IDAgMzMuMy02LjcgNDUuMy0xOC43bDk5LjktOTkuOWMxOC0xOCAyOC4xLTQyLjQgMjguMS02Ny45TDY0MCAxMDRjMC0yMi4xLTE3LjktNDAtNDAtNDBzLTQwIDE3LjktNDAgNDB6Il0KICAgIH07CiAgICBmYUNhcnRTaG9wcGluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYXJ0LXNob3BwaW5nIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI4NzIyLCAic2hvcHBpbmctY2FydCJdLCAiZjA3YSIsICJNMjQtMTZDMTAuNy0xNiAwLTUuMyAwIDhTMTAuNyAzMiAyNCAzMmw0NS4zIDBjMy45IDAgNy4yIDIuOCA3LjkgNi42bDUyLjEgMjg2LjNjNi4yIDM0LjIgMzYgNTkuMSA3MC44IDU5LjFMNDU2IDM4NGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMjU1LjkgMGMtMTEuNiAwLTIxLjUtOC4zLTIzLjYtMTkuN2wtNS4xLTI4LjMgMzAzLjYgMGMzMC44IDAgNTcuMi0yMS45IDYyLjktNTIuMkw1NjguOSA2OS45QzU3Mi42IDUwLjIgNTU3LjUgMzIgNTM3LjQgMzJsLTQxMi43IDAtLjQtMmMtNC44LTI2LjYtMjgtNDYtNTUuMS00NkwyNC0xNnpNMjA4IDUxMmE0OCA0OCAwIDEgMCAwLTk2IDQ4IDQ4IDAgMSAwIDAgOTZ6bTIyNCAwYTQ4IDQ4IDAgMSAwIDAtOTYgNDggNDggMCAxIDAgMCA5NnoiXQogICAgfTsKICAgIGZhU2hvcHBpbmdDYXJ0ID0gZmFDYXJ0U2hvcHBpbmc7CiAgICBmYU9jdGFnb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAib2N0YWdvbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODcyMV0sICJmMzA2IiwgIk0xODguNiAuMWMtMTcgMC0zMy4zIDYuNy00NS4zIDE4LjdMMTkuMiAxNDNDNy4yIDE1NSAuNSAxNzEuMiAuNSAxODguMmwwIDEzNS42YzAgMTcgNi43IDMzLjMgMTguNyA0NS4zTDE0My40IDQ5My4yYzEyIDEyIDI4LjMgMTguNyA0NS4zIDE4LjdsMTM1LjYgMGMxNyAwIDMzLjMtNi43IDQ1LjMtMTguN0w0OTMuNiAzNjljMTItMTIgMTguNy0yOC4zIDE4LjctNDUuM2wwLTEzNS42YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDM2OS41IDE4LjhjLTEyLTEyLTI4LjMtMTguNy00NS4zLTE4LjdMMTg4LjYgLjF6Il0KICAgIH07CiAgICBmYUhhbmRQb2ludGVyMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kLXBvaW50ZXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjI1YSIsICJNMTI4IDQwYzAtMjIuMSAxNy45LTQwIDQwLTQwczQwIDE3LjkgNDAgNDBsMCAxNDguMmM4LjUtNy42IDE5LjctMTIuMiAzMi0xMi4yIDIwLjYgMCAzOC4yIDEzIDQ1IDMxLjIgOC44LTkuMyAyMS4yLTE1LjIgMzUtMTUuMiAyNS4zIDAgNDYgMTkuNSA0Ny45IDQ0LjMgOC41LTcuNyAxOS44LTEyLjMgMzIuMS0xMi4zIDI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMTEyYzAgNzAuNy01Ny4zIDEyOC0xMjggMTI4bC04NS4zIDBjLTUgMC05LjktLjMtMTQuNy0xLTU1LjMtNS42LTEwNi4yLTM0LTE0MC03OUw4IDMzNmMtMTMuMy0xNy43LTkuNy00Mi43IDgtNTZzNDIuNy05LjcgNTYgOGw1NiA3NC43IDAtMzIyLjd6TTI0MCAzMDRjMC04LjgtNy4yLTE2LTE2LTE2cy0xNiA3LjItMTYgMTZsMCA5NmMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtOTZ6bTQ4LTE2Yy04LjggMC0xNiA3LjItMTYgMTZsMCA5NmMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtOTZjMC04LjgtNy4yLTE2LTE2LTE2em04MCAxNmMwLTguOC03LjItMTYtMTYtMTZzLTE2IDcuMi0xNiAxNmwwIDk2YzAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZsMC05NnoiXQogICAgfTsKICAgIGZhUmVnaXN0ZXJlZDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicmVnaXN0ZXJlZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzE3NF0sICJmMjVkIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMjAwIDE0NGw4MCAwYzM5LjggMCA3MiAzMi4yIDcyIDcyIDAgMjguOS0xNyA1My44LTQxLjYgNjUuM2wzMC4yIDUwLjNjNi44IDExLjQgMy4xIDI2LjEtOC4yIDMyLjlzLTI2LjEgMy4xLTMyLjktOC4ybC00MS02OC4zLTM0LjQgMCAwIDU2YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMTc2YzAtMTMuMyAxMC43LTI0IDI0LTI0em03MiA5Nmw4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTU2IDAgMCA0OCA0OCAweiJdCiAgICB9OwogICAgZmFIb3VzZVNpZ25hbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VzZS1zaWduYWwiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTAxMiIsICJNNTE1LjkgMjQwbC0xOS45IDAgMCAxNDRjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTEzNyAwYy0yNC05MS43LTkzLjUtMTY1LTE4My0xOTQuM2wwLTEzLjctMTkuOSAwYy0xNS41IDAtMjguMS0xMi42LTI4LjEtMjguMSAwLTcuNiAzLjEtMTQuOSA4LjYtMjAuMkwyNzYuNS00LjlDMjgzLjktMTIgMjkzLjctMTYgMzA0LTE2czIwLjEgNCAyNy41IDExLjFMNTM1LjQgMTkxLjdjNS41IDUuMyA4LjYgMTIuNiA4LjYgMjAuMiAwIDE1LjUtMTIuNiAyOC4xLTI4LjEgMjguMXpNMjgwIDE5MmMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCA0OGMwIDEzLjMgMTAuNyAyNCAyNCAyNGw0OCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtNDhjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTQ4IDB6TTI0IDI4OGMxMjguMSAwIDIzMiAxMDMuOSAyMzIgMjMyIDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtMTAxLjYtODIuNC0xODQtMTg0LTE4NC0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0em04IDE5MmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6TTAgNDA4YzAtMTMuMyAxMC43LTI0IDI0LTI0IDc1LjEgMCAxMzYgNjAuOSAxMzYgMTM2IDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtNDguNi0zOS40LTg4LTg4LTg4LTEzLjMgMC0yNC0xMC43LTI0LTI0eiJdCiAgICB9OwogICAgZmFCYW5nbGFkZXNoaVRha2FTaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhbmdsYWRlc2hpLXRha2Etc2lnbiIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlMmU2IiwgIk0zNiAzMi4zQzE4LjQgMzAuMSAyLjQgNDIuNSAuMyA2MFMxMC41IDkzLjYgMjggOTUuOGw3LjkgMWMxNiAyIDI4IDE1LjYgMjggMzEuOGwwIDMxLjUtNDAgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw0MCAwIDAgMTc2YzAgNTMgNDMgOTYgOTYgOTZsMzIgMGMxMDYgMCAxOTItODYgMTkyLTE5MmwwLTMyYzAtNTMtNDMtOTYtOTYtOTZsLTE2IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDMyYzAgNzAuNy01Ny4zIDEyOC0xMjggMTI4bC0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTE3NiA0MCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC00MCAwIDAtMzEuNUMxMjggODAuMSA5MiAzOS4yIDQzLjkgMzMuMmwtNy45LTF6Il0KICAgIH07CiAgICBpY29uczMgPSB7CiAgICAgIGZhMCwKICAgICAgZmExLAogICAgICBmYTIsCiAgICAgIGZhMywKICAgICAgZmE0LAogICAgICBmYTUsCiAgICAgIGZhNiwKICAgICAgZmE3LAogICAgICBmYTgsCiAgICAgIGZhOSwKICAgICAgZmFEb2xsYXJTaWduLAogICAgICBmYURvbGxhciwKICAgICAgZmFVc2QsCiAgICAgIGZhRG9nLAogICAgICBmYVRydWNrTW92aW5nLAogICAgICBmYVJvdGF0ZSwKICAgICAgZmFTeW5jQWx0LAogICAgICBmYVNxdWFyZU1pbnVzOiBmYVNxdWFyZU1pbnVzMiwKICAgICAgZmFNaW51c1NxdWFyZTogZmFNaW51c1NxdWFyZTIsCiAgICAgIGZhQWxpZ25KdXN0aWZ5LAogICAgICBmYUNhbGVuZGFyQ2hlY2s6IGZhQ2FsZW5kYXJDaGVjazIsCiAgICAgIGZhRmFjZUtpc3M6IGZhRmFjZUtpc3MyLAogICAgICBmYUtpc3M6IGZhS2lzczIsCiAgICAgIGZhS2l0Y2hlblNldCwKICAgICAgZmFEbmEsCiAgICAgIGZhQ2hpbGRSZWFjaGluZywKICAgICAgZmFQYXN0ZTogZmFQYXN0ZTIsCiAgICAgIGZhRmlsZUNsaXBib2FyZDogZmFGaWxlQ2xpcGJvYXJkMiwKICAgICAgZmFNZXRlb3IsCiAgICAgIGZhR2VhcnMsCiAgICAgIGZhQ29ncywKICAgICAgZmFGaWxlQ2lyY2xlUGx1cywKICAgICAgZmFJY2ljbGVzLAogICAgICBmYUFycm93VHJlbmRVcCwKICAgICAgZmFIZXhhZ29uTm9kZXNCb2x0LAogICAgICBmYVF1ZXN0aW9uLAogICAgICBmYUhhbmRzQm91bmQsCiAgICAgIGZhUGVyc29uV2Fsa2luZ0x1Z2dhZ2UsCiAgICAgIGZhRmlsZUFycm93RG93biwKICAgICAgZmFGaWxlRG93bmxvYWQsCiAgICAgIGZhUGVyc29uQm9vdGgsCiAgICAgIGZhTG9jdXN0LAogICAgICBmYVJpZ2h0TG9uZywKICAgICAgZmFMb25nQXJyb3dBbHRSaWdodCwKICAgICAgZmFUcnVja0Ryb3BsZXQsCiAgICAgIGZhSGFuZEhvbGRpbmdNZWRpY2FsLAogICAgICBmYUhhbmRQb2ludExlZnQ6IGZhSGFuZFBvaW50TGVmdDIsCiAgICAgIGZhQ2FsY3VsYXRvciwKICAgICAgZmFNaW51cywKICAgICAgZmFTdWJ0cmFjdCwKICAgICAgZmFBcnJvd1VwWkEsCiAgICAgIGZhU29ydEFscGhhVXBBbHQsCiAgICAgIGZhTWljcm9waG9uZVNsYXNoLAogICAgICBmYVNxdWFyZVBlbiwKICAgICAgZmFQZW5TcXVhcmUsCiAgICAgIGZhUGVuY2lsU3F1YXJlLAogICAgICBmYUhhbmRGaXN0LAogICAgICBmYUZpc3RSYWlzZWQsCiAgICAgIGZhQ29tbWVudFNtcywKICAgICAgZmFTbXMsCiAgICAgIGZhU2ltQ2FyZCwKICAgICAgZmFTY2FsZUJhbGFuY2VkLAogICAgICBmYUJhbGFuY2VTY2FsZSwKICAgICAgZmFDYXIsCiAgICAgIGZhQXV0b21vYmlsZSwKICAgICAgZmFDcm9wU2ltcGxlLAogICAgICBmYUNyb3BBbHQsCiAgICAgIGZhTWVkYWwsCiAgICAgIGZhU2Nyb2xsLAogICAgICBmYUZpbGVFeGNlbDogZmFGaWxlRXhjZWwyLAogICAgICBmYUZpbHRlciwKICAgICAgZmFEcnVtLAogICAgICBmYU1hcFBpbiwKICAgICAgZmFTY2FsZVVuYmFsYW5jZWRGbGlwLAogICAgICBmYUJhbGFuY2VTY2FsZVJpZ2h0LAogICAgICBmYUFycm93c1RvQ2lyY2xlLAogICAgICBmYUVudmVsb3BlOiBmYUVudmVsb3BlMiwKICAgICAgZmFCYWJ5LAogICAgICBmYVNxdWFyZUNhcmV0RG93bjogZmFTcXVhcmVDYXJldERvd24yLAogICAgICBmYUNhcmV0U3F1YXJlRG93bjogZmFDYXJldFNxdWFyZURvd24yLAogICAgICBmYVRlbnQsCiAgICAgIGZhQSwKICAgICAgZmFQYXJhY2h1dGVCb3gsCiAgICAgIGZhQ2FydEFycm93RG93biwKICAgICAgZmFCcmlkZ2VDaXJjbGVFeGNsYW1hdGlvbiwKICAgICAgZmFDbG91ZEFycm93VXAsCiAgICAgIGZhQ2xvdWRVcGxvYWQsCiAgICAgIGZhQ2xvdWRVcGxvYWRBbHQsCiAgICAgIGZhQXQsCiAgICAgIGZhSW5kaWFuUnVwZWVTaWduLAogICAgICBmYUluZGlhblJ1cGVlLAogICAgICBmYUluciwKICAgICAgZmFUcnVjazogZmFUcnVjazIsCiAgICAgIGZhQ2hhbGtib2FyZFVzZXIsCiAgICAgIGZhQ2hhbGtib2FyZFRlYWNoZXIsCiAgICAgIGZhVXNlckNoZWNrLAogICAgICBmYVVzZXJOaW5qYSwKICAgICAgZmFQbGFudFdpbHQsCiAgICAgIGZhV2VpZ2h0U2NhbGUsCiAgICAgIGZhV2VpZ2h0LAogICAgICBmYUNhcmV0UmlnaHQsCiAgICAgIGZhRmxvcmluU2lnbiwKICAgICAgZmFCZWxsOiBmYUJlbGwyLAogICAgICBmYUxhcmlTaWduLAogICAgICBmYU1pbGxTaWduLAogICAgICBmYVBlcnNvblNub3dib2FyZGluZywKICAgICAgZmFTbm93Ym9hcmRpbmcsCiAgICAgIGZhVHR5LAogICAgICBmYVRlbGV0eXBlLAogICAgICBmYVVzZXJzUmVjdGFuZ2xlLAogICAgICBmYU1vYmlsZSwKICAgICAgZmFNb2JpbGVBbmRyb2lkLAogICAgICBmYU1vYmlsZVBob25lLAogICAgICBmYUFycm93c1R1cm5Ub0RvdHMsCiAgICAgIGZhRXhjbGFtYXRpb24sCiAgICAgIGZhQ2h1cmNoLAogICAgICBmYVRvZ2dsZU9mZiwKICAgICAgZmFTaG9lUHJpbnRzLAogICAgICBmYUZpbGVDaXJjbGVFeGNsYW1hdGlvbiwKICAgICAgZmFXYWxsZXQsCiAgICAgIGZhTWVzc2FnZTogZmFNZXNzYWdlMiwKICAgICAgZmFDb21tZW50QWx0OiBmYUNvbW1lbnRBbHQyLAogICAgICBmYVRyb3BoeSwKICAgICAgZmFGYWNlRGl6enk6IGZhRmFjZURpenp5MiwKICAgICAgZmFEaXp6eTogZmFEaXp6eTIsCiAgICAgIGZhQmFjdGVyaWEsCiAgICAgIGZhRWFyRGVhZiwKICAgICAgZmFEZWFmLAogICAgICBmYURlYWZuZXNzLAogICAgICBmYUhhcmRPZkhlYXJpbmcsCiAgICAgIGZhUGVvcGxlQXJyb3dzLAogICAgICBmYVBlb3BsZUFycm93c0xlZnRSaWdodCwKICAgICAgZmFIYW5kc0NsYXBwaW5nLAogICAgICBmYVZpcnVzQ292aWRTbGFzaCwKICAgICAgZmFDYWxlbmRhckRheXM6IGZhQ2FsZW5kYXJEYXlzMiwKICAgICAgZmFDYWxlbmRhckFsdDogZmFDYWxlbmRhckFsdDIsCiAgICAgIGZhRGlhbW9uZFR1cm5SaWdodCwKICAgICAgZmFEaXJlY3Rpb25zLAogICAgICBmYUhhbmRQb2ludFVwOiBmYUhhbmRQb2ludFVwMiwKICAgICAgZmFCZXppZXJDdXJ2ZSwKICAgICAgZmFQZXJzb25IYWxmRHJlc3MsCiAgICAgIGZhU3F1YXJlUG9sbEhvcml6b250YWwsCiAgICAgIGZhUG9sbEgsCiAgICAgIGZhU2Nob29sQ2lyY2xlWG1hcmssCiAgICAgIGZhSGFuZExpemFyZDogZmFIYW5kTGl6YXJkMiwKICAgICAgZmFDaGFsa2JvYXJkLAogICAgICBmYUJsYWNrYm9hcmQsCiAgICAgIGZhVXBSaWdodEZyb21TcXVhcmUsCiAgICAgIGZhRXh0ZXJuYWxMaW5rQWx0LAogICAgICBmYVNxdWFyZUZ1bGw6IGZhU3F1YXJlRnVsbDIsCiAgICAgIGZhQ2xvdmVyLAogICAgICBmYVRlZXRoT3BlbiwKICAgICAgZmFCYXJzU3RhZ2dlcmVkLAogICAgICBmYVJlb3JkZXIsCiAgICAgIGZhU3RyZWFtLAogICAgICBmYVdhcmVob3VzZSwKICAgICAgZmFTd2F0Y2hib29rLAogICAgICBmYUNhbXBncm91bmQsCiAgICAgIGZhUGVyc29uV2Fsa2luZ0Fycm93UmlnaHQsCiAgICAgIGZhR2xhc3NlcywKICAgICAgZmFDaXJjbGVQYXVzZTogZmFDaXJjbGVQYXVzZTIsCiAgICAgIGZhUGF1c2VDaXJjbGU6IGZhUGF1c2VDaXJjbGUyLAogICAgICBmYU1lbW9yeSwKICAgICAgZmFHaWZ0LAogICAgICBmYU1vbmV5QmlsbFdoZWF0LAogICAgICBmYUR1bmdlb24sCiAgICAgIGZhU3VpdGNhc2VNZWRpY2FsLAogICAgICBmYU1lZGtpdCwKICAgICAgZmFQZXJzb25DYW5lLAogICAgICBmYUdhdWdlLAogICAgICBmYURhc2hib2FyZCwKICAgICAgZmFHYXVnZU1lZCwKICAgICAgZmFUYWNob21ldGVyQWx0QXZlcmFnZSwKICAgICAgZmFFbnZlbG9wZU9wZW5UZXh0LAogICAgICBmYVRvb2xib3gsCiAgICAgIGZhUG93ZXJPZmYsCiAgICAgIGZhU2lnbmFsLAogICAgICBmYVNpZ25hbDUsCiAgICAgIGZhU2lnbmFsUGVyZmVjdCwKICAgICAgZmFBcnJvd3NTcGluLAogICAgICBmYUpvaW50LAogICAgICBmYUJyYWlsbGUsCiAgICAgIGZhQmFza2V0U2hvcHBpbmcsCiAgICAgIGZhU2hvcHBpbmdCYXNrZXQsCiAgICAgIGZhQnJpZGdlLAogICAgICBmYVBsYW5lQXJyaXZhbCwKICAgICAgZmFDYXNoUmVnaXN0ZXIsCiAgICAgIGZhUmluZywKICAgICAgZmFTaGFyZU5vZGVzLAogICAgICBmYVNoYXJlQWx0LAogICAgICBmYVBlcnNvbkNpcmNsZUV4Y2xhbWF0aW9uLAogICAgICBmYUJpbm9jdWxhcnMsCiAgICAgIGZhS2lwU2lnbiwKICAgICAgZmFIYXJkRHJpdmU6IGZhSGFyZERyaXZlMiwKICAgICAgZmFIZGQ6IGZhSGRkMiwKICAgICAgZmFSYW5raW5nU3RhciwKICAgICAgZmFVc2VyVGllLAogICAgICBmYUVsbGlwc2lzLAogICAgICBmYUVsbGlwc2lzSCwKICAgICAgZmFTdG9yZVNsYXNoLAogICAgICBmYVBlcmNlbnQsCiAgICAgIGZhUGVyY2VudGFnZSwKICAgICAgZmFGaWxlWmlwcGVyOiBmYUZpbGVaaXBwZXIyLAogICAgICBmYUZpbGVBcmNoaXZlOiBmYUZpbGVBcmNoaXZlMiwKICAgICAgZmFEaXNwbGF5LAogICAgICBmYUljb25zLAogICAgICBmYUhlYXJ0TXVzaWNDYW1lcmFCb2x0LAogICAgICBmYVJ1bGVyVmVydGljYWwsCiAgICAgIGZhTWFwTG9jYXRpb25Eb3QsCiAgICAgIGZhTWFwTWFya2VkQWx0LAogICAgICBmYUhlYXJ0Q3JhY2ssCiAgICAgIGZhSGVhcnRCcm9rZW4sCiAgICAgIGZhQ293LAogICAgICBmYVJzcywKICAgICAgZmFGZWVkLAogICAgICBmYU1hZ25pZnlpbmdHbGFzcywKICAgICAgZmFTZWFyY2gsCiAgICAgIGZhQ2xvdWRNb29uLAogICAgICBmYUJveGVzU3RhY2tlZCwKICAgICAgZmFCb3hlcywKICAgICAgZmFCb3hlc0FsdCwKICAgICAgZmFDb2RlQnJhbmNoLAogICAgICBmYUJhbiwKICAgICAgZmFDYW5jZWwsCiAgICAgIGZhSnVnRGV0ZXJnZW50LAogICAgICBmYVJlcGx5LAogICAgICBmYU1haWxSZXBseSwKICAgICAgZmFTdW5QbGFudFdpbHQsCiAgICAgIGZhQmFjdGVyaXVtLAogICAgICBmYVJlY29yZFZpbnlsLAogICAgICBmYUZsb3BweURpc2s6IGZhRmxvcHB5RGlzazIsCiAgICAgIGZhU2F2ZTogZmFTYXZlMiwKICAgICAgZmFUb2lsZXRzUG9ydGFibGUsCiAgICAgIGZhTywKICAgICAgZmFQYWxldHRlLAogICAgICBmYVVubG9jaywKICAgICAgZmFFYXJMaXN0ZW4sCiAgICAgIGZhQXNzaXN0aXZlTGlzdGVuaW5nU3lzdGVtcywKICAgICAgZmFDb2RlUHVsbFJlcXVlc3QsCiAgICAgIGZhS2V5LAogICAgICBmYVNrdWxsLAogICAgICBmYU1hcnNTdHJva2VVcCwKICAgICAgZmFNYXJzU3Ryb2tlViwKICAgICAgZmFGaXJlRmxhbWVTaW1wbGUsCiAgICAgIGZhQnVybiwKICAgICAgZmFUcmVlLAogICAgICBmYVNtb2csCiAgICAgIGZhUywKICAgICAgZmFKZWRpLAogICAgICBmYVBlcnNvbkhpa2luZywKICAgICAgZmFIaWtpbmcsCiAgICAgIGZhQXJyb3dzVXBUb0xpbmUsCiAgICAgIGZhTWFyc0RvdWJsZSwKICAgICAgZmFUaGVybW9tZXRlciwKICAgICAgZmFQYWludGJydXNoLAogICAgICBmYVBhaW50QnJ1c2gsCiAgICAgIGZhTmV1dGVyLAogICAgICBmYVNxdWFyZVBob25lRmxpcCwKICAgICAgZmFQaG9uZVNxdWFyZUFsdCwKICAgICAgZmFGYWNlR3JpblRvbmd1ZVNxdWludDogZmFGYWNlR3JpblRvbmd1ZVNxdWludDIsCiAgICAgIGZhR3JpblRvbmd1ZVNxdWludDogZmFHcmluVG9uZ3VlU3F1aW50MiwKICAgICAgZmFDb21tZW50RG9sbGFyLAogICAgICBmYUhpcHBvLAogICAgICBmYUJvd2xGb29kLAogICAgICBmYVNxdWFyZVZpcnVzLAogICAgICBmYUNsb3VkU3VuUmFpbiwKICAgICAgZmFBcnJvd1JpZ2h0TG9uZywKICAgICAgZmFMb25nQXJyb3dSaWdodCwKICAgICAgZmFCdWlsZGluZ1VuLAogICAgICBmYVRlbXBlcmF0dXJlTG93LAogICAgICBmYURvb3JPcGVuLAogICAgICBmYUFsaWduTGVmdCwKICAgICAgZmFDYW1lcmE6IGZhQ2FtZXJhMiwKICAgICAgZmFDYW1lcmFBbHQ6IGZhQ2FtZXJhQWx0MiwKICAgICAgZmFVc2Vyc1JheXMsCiAgICAgIGZhUmFpbmJvdywKICAgICAgZmFTaXRlbWFwLAogICAgICBmYUZhY2VHcmluU3RhcnM6IGZhRmFjZUdyaW5TdGFyczIsCiAgICAgIGZhR3JpblN0YXJzOiBmYUdyaW5TdGFyczIsCiAgICAgIGZhU29ydFVwLAogICAgICBmYVNvcnRBc2MsCiAgICAgIGZhRXllOiBmYUV5ZTIsCiAgICAgIGZhQ2FyZXRMZWZ0LAogICAgICBmYUFwcGxlV2hvbGUsCiAgICAgIGZhQXBwbGVBbHQsCiAgICAgIGZhU2Nyb2xsVG9yYWgsCiAgICAgIGZhVG9yYWgsCiAgICAgIGZhSG91c2VMb2NrLAogICAgICBmYUFycm93c0xlZnRSaWdodFRvTGluZSwKICAgICAgZmFUcmFzaCwKICAgICAgZmFGYWNlU2FkVGVhcjogZmFGYWNlU2FkVGVhcjIsCiAgICAgIGZhU2FkVGVhcjogZmFTYWRUZWFyMiwKICAgICAgZmFGYXgsCiAgICAgIGZhUGVyc29uQ2lyY2xlUGx1cywKICAgICAgZmFIYW1zYSwKICAgICAgZmFQZXJzb25DaXJjbGVRdWVzdGlvbiwKICAgICAgZmFDbGlwYm9hcmRDaGVjaywKICAgICAgZmFTaGFyZUZyb21TcXVhcmU6IGZhU2hhcmVGcm9tU3F1YXJlMiwKICAgICAgZmFTaGFyZVNxdWFyZTogZmFTaGFyZVNxdWFyZTIsCiAgICAgIGZhUmVjZWlwdCwKICAgICAgZmFFcXVhbHMsCiAgICAgIGZhQ2hldnJvblVwLAogICAgICBmYVZpcnVzU2xhc2gsCiAgICAgIGZhU2xhc2gsCiAgICAgIGZhRXhwYW5kLAogICAgICBmYU5vdGVTdGlja3k6IGZhTm90ZVN0aWNreTIsCiAgICAgIGZhU3RpY2t5Tm90ZTogZmFTdGlja3lOb3RlMiwKICAgICAgZmFUYWJsZUNvbHVtbnMsCiAgICAgIGZhQ29sdW1ucywKICAgICAgZmFQZXJzb25TaGVsdGVyLAogICAgICBmYUNpcmNsZU5vdGNoLAogICAgICBmYVdhdGVyLAogICAgICBmYURlbGV0ZUxlZnQsCiAgICAgIGZhQmFja3NwYWNlLAogICAgICBmYUJyb29tQmFsbCwKICAgICAgZmFRdWlkZGl0Y2gsCiAgICAgIGZhUXVpZGRpdGNoQnJvb21CYWxsLAogICAgICBmYUosCiAgICAgIGZhU2h1dHRsZVNwYWNlLAogICAgICBmYVNwYWNlU2h1dHRsZSwKICAgICAgZmFZaW5ZYW5nLAogICAgICBmYVN0b3AsCiAgICAgIGZhVHJvd2VsLAogICAgICBmYUhhbmRCYWNrRmlzdDogZmFIYW5kQmFja0Zpc3QyLAogICAgICBmYUhhbmRSb2NrOiBmYUhhbmRSb2NrMiwKICAgICAgZmFUZW1wZXJhdHVyZUhpZ2gsCiAgICAgIGZhR3JlYXRlclRoYW4sCiAgICAgIGZhQ3J1dGNoLAogICAgICBmYVNlcHRhZ29uLAogICAgICBmYUhlcHRhZ29uLAogICAgICBmYVN0cmVldFZpZXcsCiAgICAgIGZhV2F2ZVNxdWFyZSwKICAgICAgZmFBbmdsZUxlZnQsCiAgICAgIGZhU2NyZXdkcml2ZXIsCiAgICAgIGZhVHJhY3RvciwKICAgICAgZmFCcmlkZ2VDaXJjbGVYbWFyaywKICAgICAgZmFWaWFscywKICAgICAgZmFTdGV0aG9zY29wZSwKICAgICAgZmFQb2RjYXN0LAogICAgICBmYUFycm93VXBSaWdodERvdHMsCiAgICAgIGZhQ2hlc3NRdWVlbjogZmFDaGVzc1F1ZWVuMiwKICAgICAgZmFBbmNob3JDaXJjbGVFeGNsYW1hdGlvbiwKICAgICAgZmFFbGxpcHNpc1ZlcnRpY2FsLAogICAgICBmYUVsbGlwc2lzViwKICAgICAgZmFIZWFydENpcmNsZUV4Y2xhbWF0aW9uLAogICAgICBmYUJ1aWxkaW5nQ2lyY2xlRXhjbGFtYXRpb24sCiAgICAgIGZhUGVyc29uQXJyb3dVcEZyb21MaW5lLAogICAgICBmYU5vdEVxdWFsLAogICAgICBmYVRyYWluVHJhbSwKICAgICAgZmFQbGFuZURlcGFydHVyZSwKICAgICAgZmFSaWdodFRvQnJhY2tldCwKICAgICAgZmFTaWduSW5BbHQsCiAgICAgIGZhU2RDYXJkLAogICAgICBmYUhvdXNlQ2lyY2xlRXhjbGFtYXRpb24sCiAgICAgIGZhU2hla2VsU2lnbiwKICAgICAgZmFJbHMsCiAgICAgIGZhU2hla2VsLAogICAgICBmYVNoZXFlbCwKICAgICAgZmFTaGVxZWxTaWduLAogICAgICBmYVJhZGlvLAogICAgICBmYUhhbmREb3RzLAogICAgICBmYUFsbGVyZ2llcywKICAgICAgZmFCb29rU2t1bGwsCiAgICAgIGZhQm9va0RlYWQsCiAgICAgIGZhVW5sb2NrS2V5aG9sZSwKICAgICAgZmFVbmxvY2tBbHQsCiAgICAgIGZhRmlsZUFycm93VXAsCiAgICAgIGZhRmlsZVVwbG9hZCwKICAgICAgZmFGYWNlR3JpblRlYXJzOiBmYUZhY2VHcmluVGVhcnMyLAogICAgICBmYUdyaW5UZWFyczogZmFHcmluVGVhcnMyLAogICAgICBmYVBlblRvU3F1YXJlOiBmYVBlblRvU3F1YXJlMiwKICAgICAgZmFFZGl0OiBmYUVkaXQyLAogICAgICBmYUVhcnRoRXVyb3BlLAogICAgICBmYUdsb2JlRXVyb3BlLAogICAgICBmYUZhY2VHcmluQmVhbVN3ZWF0OiBmYUZhY2VHcmluQmVhbVN3ZWF0MiwKICAgICAgZmFHcmluQmVhbVN3ZWF0OiBmYUdyaW5CZWFtU3dlYXQyLAogICAgICBmYUNpcmNsZUhhbGZTdHJva2UsCiAgICAgIGZhQWRqdXN0LAogICAgICBmYVBlcnNvbk1pbGl0YXJ5VG9QZXJzb24sCiAgICAgIGZhVGFibGVDZWxsc0NvbHVtbkxvY2ssCiAgICAgIGZhVHJ1Y2tGaWVsZFVuLAogICAgICBmYUNsb2NrOiBmYUNsb2NrMiwKICAgICAgZmFDbG9ja0ZvdXI6IGZhQ2xvY2tGb3VyMiwKICAgICAgZmFCb29rLAogICAgICBmYUZhY2VMYXVnaFdpbms6IGZhRmFjZUxhdWdoV2luazIsCiAgICAgIGZhTGF1Z2hXaW5rOiBmYUxhdWdoV2luazIsCiAgICAgIGZhQ2xvdWRNZWF0YmFsbCwKICAgICAgZmFDaGFydEFyZWEsCiAgICAgIGZhQXJlYUNoYXJ0LAogICAgICBmYVJ1cGlhaFNpZ24sCiAgICAgIGZhVGV4dFdpZHRoLAogICAgICBmYVNhdGVsbGl0ZSwKICAgICAgZmFNYWduaWZ5aW5nR2xhc3NNaW51cywKICAgICAgZmFTZWFyY2hNaW51cywKICAgICAgZmFQZW9wbGVHcm91cCwKICAgICAgZmFTcXVhcmVCaW5hcnksCiAgICAgIGZhTWFza3NUaGVhdGVyLAogICAgICBmYVRoZWF0ZXJNYXNrcywKICAgICAgZmFDYXJ0UGx1cywKICAgICAgZmFIYW5kc0FzbEludGVycHJldGluZywKICAgICAgZmFBbWVyaWNhblNpZ25MYW5ndWFnZUludGVycHJldGluZywKICAgICAgZmFBc2xJbnRlcnByZXRpbmcsCiAgICAgIGZhSGFuZHNBbWVyaWNhblNpZ25MYW5ndWFnZUludGVycHJldGluZywKICAgICAgZmFUYWJsZUNlbGxzUm93VW5sb2NrLAogICAgICBmYVJvY2tldCwKICAgICAgZmFTaHJpbXAsCiAgICAgIGZhVGVuZ2VTaWduLAogICAgICBmYVRlbmdlLAogICAgICBmYUhvdXNlQ2hpbW5leU1lZGljYWwsCiAgICAgIGZhQ2xpbmljTWVkaWNhbCwKICAgICAgZmFVc2Vyc1NsYXNoLAogICAgICBmYVBhcGVyUGxhbmU6IGZhUGFwZXJQbGFuZTIsCiAgICAgIGZhQm9va0F0bGFzLAogICAgICBmYUF0bGFzLAogICAgICBmYVRhYmxlLAogICAgICBmYUhlYXJ0OiBmYUhlYXJ0MiwKICAgICAgZmFDaXJjbGVDaGV2cm9uVXAsCiAgICAgIGZhQ2hldnJvbkNpcmNsZVVwLAogICAgICBmYUJhdHRlcnlIYWxmLAogICAgICBmYUJhdHRlcnkzLAogICAgICBmYUZvbnRBd2Vzb21lOiBmYUZvbnRBd2Vzb21lMywKICAgICAgZmFGb250QXdlc29tZUZsYWc6IGZhRm9udEF3ZXNvbWVGbGFnMywKICAgICAgZmFGb250QXdlc29tZUxvZ29GdWxsOiBmYUZvbnRBd2Vzb21lTG9nb0Z1bGwzLAogICAgICBmYUhhbmRjdWZmcywKICAgICAgZmFIYXRDb3dib3lTaWRlLAogICAgICBmYUluZHVzdHJ5LAogICAgICBmYUxpbmVzTGVhbmluZywKICAgICAgZmFQYXNzcG9ydCwKICAgICAgZmFJbmZpbml0eSwKICAgICAgZmFDbG9uZTogZmFDbG9uZTIsCiAgICAgIGZhRm9yd2FyZCwKICAgICAgZmFNLAogICAgICBmYVJvYWRTcGlrZXMsCiAgICAgIGZhTW91bnRhaW4sCiAgICAgIGZhQ2hlc3MsCiAgICAgIGZhVGVtcGVyYXR1cmVUaHJlZVF1YXJ0ZXJzLAogICAgICBmYVRlbXBlcmF0dXJlMywKICAgICAgZmFUaGVybW9tZXRlcjMsCiAgICAgIGZhVGhlcm1vbWV0ZXJUaHJlZVF1YXJ0ZXJzLAogICAgICBmYUIsCiAgICAgIGZhU2hpZWxkVmlydXMsCiAgICAgIGZhTGl0ZWNvaW5TaWduLAogICAgICBmYURpY2VENiwKICAgICAgZmFHcmlwTGluZXNWZXJ0aWNhbCwKICAgICAgZmFHb2xmQmFsbFRlZSwKICAgICAgZmFHb2xmQmFsbCwKICAgICAgZmFIZXhhZ29uLAogICAgICBmYUZvbGRlck9wZW46IGZhRm9sZGVyT3BlbjIsCiAgICAgIGZhS2FhYmEsCiAgICAgIGZhSGFuZEhvbGRpbmcsCiAgICAgIGZhU2luZ2xlUXVvdGVSaWdodCwKICAgICAgZmFCb3R0bGVEcm9wbGV0LAogICAgICBmYVdpbmRvd01pbmltaXplOiBmYVdpbmRvd01pbmltaXplMiwKICAgICAgZmFDaGV2cm9uUmlnaHQsCiAgICAgIGZhRWdnLAogICAgICBmYUxhbmRtYXJrRG9tZSwKICAgICAgZmFMYW5kbWFya0FsdCwKICAgICAgZmFXb3JtLAogICAgICBmYVVzZXJJbmp1cmVkLAogICAgICBmYVN0cmlrZXRocm91Z2gsCiAgICAgIGZhQmxvZywKICAgICAgZmFTdG9wd2F0Y2gyMCwKICAgICAgZmFUcnVja1BpY2t1cCwKICAgICAgZmFTZWVkbGluZywKICAgICAgZmFTcHJvdXQsCiAgICAgIGZhVHJhbnNnZW5kZXIsCiAgICAgIGZhVHJhbnNnZW5kZXJBbHQsCiAgICAgIGZhU3RhckhhbGY6IGZhU3RhckhhbGYyLAogICAgICBmYVBob3RvRmlsbSwKICAgICAgZmFQaG90b1ZpZGVvLAogICAgICBmYVB1bXBNZWRpY2FsLAogICAgICBmYUZpcmUsCiAgICAgIGZhTWFnbmlmeWluZ0dsYXNzUGx1cywKICAgICAgZmFTZWFyY2hQbHVzLAogICAgICBmYUZsYXNrLAogICAgICBmYUFsaWduUmlnaHQsCiAgICAgIGZhQ2FibGVDYXIsCiAgICAgIGZhVHJhbSwKICAgICAgZmFLaXRNZWRpY2FsLAogICAgICBmYUZpcnN0QWlkLAogICAgICBmYUdyaXBMaW5lcywKICAgICAgZmFCdXJnZXIsCiAgICAgIGZhSGFtYnVyZ2VyLAogICAgICBmYVNub3dtYW4sCiAgICAgIGZhSG90ZWwsCiAgICAgIGZhUHJpbnQsCiAgICAgIGZhVm9sbGV5YmFsbCwKICAgICAgZmFWb2xsZXliYWxsQmFsbCwKICAgICAgZmFUcmFmZmljTGlnaHQsCiAgICAgIGZhUGxhbmVDaXJjbGVDaGVjaywKICAgICAgZmFVc2VycywKICAgICAgZmFDZXJ0aWZpY2F0ZSwKICAgICAgZmFBbGFybUNsb2NrOiBmYUFsYXJtQ2xvY2syLAogICAgICBmYUhlbGljb3B0ZXJTeW1ib2wsCiAgICAgIGZhSG91c2VDaGltbmV5Q3JhY2ssCiAgICAgIGZhSG91c2VEYW1hZ2UsCiAgICAgIGZhUGVyc29uTWlsaXRhcnlQb2ludGluZywKICAgICAgZmFEYXRhYmFzZSwKICAgICAgZmFOZXdzcGFwZXI6IGZhTmV3c3BhcGVyMiwKICAgICAgZmFDbG91ZFJhaW4sCiAgICAgIGZhTWF4aW1pemUsCiAgICAgIGZhRXhwYW5kQXJyb3dzQWx0LAogICAgICBmYUxvY2F0aW9uQXJyb3csCiAgICAgIGZhQ2l0eSwKICAgICAgZmFYUmF5LAogICAgICBmYVVtYnJlbGxhQmVhY2gsCiAgICAgIGZhQXJyb3dSaWdodFRvQnJhY2tldCwKICAgICAgZmFTaWduSW4sCiAgICAgIGZhSGVhZHNldCwKICAgICAgZmFTcGxvdGNoLAogICAgICBmYVVwTG9uZywKICAgICAgZmFMb25nQXJyb3dBbHRVcCwKICAgICAgZmFIZXhhZ29uTm9kZXMsCiAgICAgIGZhSG9zcGl0YWw6IGZhSG9zcGl0YWwyLAogICAgICBmYUhvc3BpdGFsQWx0OiBmYUhvc3BpdGFsQWx0MiwKICAgICAgZmFIb3NwaXRhbFdpZGU6IGZhSG9zcGl0YWxXaWRlMiwKICAgICAgZmFQZXJzb25IYXJhc3NpbmcsCiAgICAgIGZhTW9uZXlCaWxsVHJlbmRVcCwKICAgICAgZmFQZW5SdWxlciwKICAgICAgZmFQZW5jaWxSdWxlciwKICAgICAgZmFSZXBlYXQsCiAgICAgIGZhQm9uZSwKICAgICAgZmFGaXJlRmxhbWVDdXJ2ZWQsCiAgICAgIGZhRmlyZUFsdCwKICAgICAgZmFCdXNTaW1wbGUsCiAgICAgIGZhQnVzQWx0LAogICAgICBmYVZlbnVzTWFycywKICAgICAgZmFCbGVuZGVyLAogICAgICBmYVUsCiAgICAgIGZhU2hhcmUsCiAgICAgIGZhTWFpbEZvcndhcmQsCiAgICAgIGZhUGhvbmVGbGlwLAogICAgICBmYVBob25lQWx0LAogICAgICBmYVRvaWxldFBvcnRhYmxlLAogICAgICBmYVBlcnNvblByZWduYW50LAogICAgICBmYUxlc3NUaGFuLAogICAgICBmYVN1cGVyc2NyaXB0LAogICAgICBmYUNpcmNsZVN0b3A6IGZhQ2lyY2xlU3RvcDIsCiAgICAgIGZhU3RvcENpcmNsZTogZmFTdG9wQ2lyY2xlMiwKICAgICAgZmFBcnJvd3NVcERvd24sCiAgICAgIGZhQXJyb3dzViwKICAgICAgZmFQb29TdG9ybSwKICAgICAgZmFQb29Cb2x0LAogICAgICBmYVZpZGVvU2xhc2gsCiAgICAgIGZhU3F1YXJlWG1hcmssCiAgICAgIGZhVGltZXNTcXVhcmUsCiAgICAgIGZhWG1hcmtTcXVhcmUsCiAgICAgIGZhSGFuZEhvbGRpbmdEcm9wbGV0LAogICAgICBmYUhhbmRIb2xkaW5nV2F0ZXIsCiAgICAgIGZhV29uU2lnbiwKICAgICAgZmFLcncsCiAgICAgIGZhV29uLAogICAgICBmYU9iamVjdFVuZ3JvdXA6IGZhT2JqZWN0VW5ncm91cDIsCiAgICAgIGZhQ29tbWVudDogZmFDb21tZW50MiwKICAgICAgZmFIaWxsQXZhbGFuY2hlLAogICAgICBmYUFycm93c1RvRXllLAogICAgICBmYVNub3dwbG93LAogICAgICBmYUNoYXJ0R2FudHQsCiAgICAgIGZhVmlkZW8sCiAgICAgIGZhVmlkZW9DYW1lcmEsCiAgICAgIGZhQ2hlc3NQYXduOiBmYUNoZXNzUGF3bjIsCiAgICAgIGZhU3luYWdvZ3VlLAogICAgICBmYUJ1aWxkaW5nQ2lyY2xlQ2hlY2ssCiAgICAgIGZhQ2FsZW5kYXJQbHVzOiBmYUNhbGVuZGFyUGx1czIsCiAgICAgIGZhV2hlZWxjaGFpck1vdmUsCiAgICAgIGZhV2hlZWxjaGFpckFsdCwKICAgICAgZmFVc2VyU2hpZWxkLAogICAgICBmYUJvbGQsCiAgICAgIGZhSGVhcnRQdWxzZSwKICAgICAgZmFIZWFydGJlYXQsCiAgICAgIGZhU3F1YXJlUm9vdFZhcmlhYmxlLAogICAgICBmYVNxdWFyZVJvb3RBbHQsCiAgICAgIGZhSGFuZHNCdWJibGVzLAogICAgICBmYUhhbmRzV2FzaCwKICAgICAgZmFNYXJrZXIsCiAgICAgIGZhQ2xpcGJvYXJkOiBmYUNsaXBib2FyZDIsCiAgICAgIGZhUGxhY2VPZldvcnNoaXAsCiAgICAgIGZhQ2FubmFiaXMsCiAgICAgIGZhUGVvcGxlUm9vZiwKICAgICAgZmFEaXNlYXNlLAogICAgICBmYUJvb2tCaWJsZSwKICAgICAgZmFCaWJsZSwKICAgICAgZmFDaGVzc0JvYXJkLAogICAgICBmYU1hcnMsCiAgICAgIGZhTGFwdG9wLAogICAgICBmYVVzZXJYbWFyaywKICAgICAgZmFVc2VyVGltZXMsCiAgICAgIGZhRmxhZ1VzYSwKICAgICAgZmFIYW5kTWlkZGxlRmluZ2VyLAogICAgICBmYU1vcnRhclBlc3RsZSwKICAgICAgZmFIZWFkU2lkZUNvdWdoLAogICAgICBmYVBsYW5lTG9jaywKICAgICAgZmFCYXR0ZXJ5VGhyZWVRdWFydGVycywKICAgICAgZmFCYXR0ZXJ5NCwKICAgICAgZmFGcmFuY1NpZ24sCiAgICAgIGZhRmlsdGVyQ2lyY2xlRG9sbGFyLAogICAgICBmYUZ1bm5lbERvbGxhciwKICAgICAgZmFDaGVlc2UsCiAgICAgIGZhQ2lyY2xlSCwKICAgICAgZmFIb3NwaXRhbFN5bWJvbCwKICAgICAgZmFTY2hvb2wsCiAgICAgIGZhRGljZUZpdmUsCiAgICAgIGZhVG9ybmFkbywKICAgICAgZmFKZXRGaWdodGVyLAogICAgICBmYUZpZ2h0ZXJKZXQsCiAgICAgIGZhVGh1bWJzRG93bjogZmFUaHVtYnNEb3duMiwKICAgICAgZmFCcm9vbSwKICAgICAgZmFGaWxlSW1wb3J0LAogICAgICBmYUFycm93UmlnaHRUb0ZpbGUsCiAgICAgIGZhVXRlbnNpbHMsCiAgICAgIGZhQ3V0bGVyeSwKICAgICAgZmFJZEJhZGdlOiBmYUlkQmFkZ2UyLAogICAgICBmYVNwaWRlciwKICAgICAgZmFNb2JpbGVSZXRybywKICAgICAgZmFTaWduc1Bvc3QsCiAgICAgIGZhTWFwU2lnbnMsCiAgICAgIGZhR3JvdXBBcnJvd3NSb3RhdGUsCiAgICAgIGZhQXJyb3dzU3BsaXRVcEFuZExlZnQsCiAgICAgIGZhRmlsbERyaXAsCiAgICAgIGZhU2hpZWxkSGVhcnQsCiAgICAgIGZhUGVyc29uU2tpaW5nTm9yZGljLAogICAgICBmYVNraWluZ05vcmRpYywKICAgICAgZmFTcXVhcmVDaGVjazogZmFTcXVhcmVDaGVjazIsCiAgICAgIGZhQ2hlY2tTcXVhcmU6IGZhQ2hlY2tTcXVhcmUyLAogICAgICBmYUJhdGgsCiAgICAgIGZhQmF0aHR1YiwKICAgICAgZmFDaGVzc0Jpc2hvcDogZmFDaGVzc0Jpc2hvcDIsCiAgICAgIGZhUHJlc2NyaXB0aW9uQm90dGxlTWVkaWNhbCwKICAgICAgZmFQcmVzY3JpcHRpb25Cb3R0bGVBbHQsCiAgICAgIGZhRHJhd1BvbHlnb24sCiAgICAgIGZhVmVjdG9yUG9seWdvbiwKICAgICAgZmFJQ3Vyc29yLAogICAgICBmYUhlYXJ0Q2lyY2xlUGx1cywKICAgICAgZmFTaGllbGREb2csCiAgICAgIGZhR3JlYXRlclRoYW5FcXVhbCwKICAgICAgZmFFbnZlbG9wZU9wZW46IGZhRW52ZWxvcGVPcGVuMiwKICAgICAgZmFNb3VuZCwKICAgICAgZmFWb2ljZW1haWwsCiAgICAgIGZhVmVzdCwKICAgICAgZmFBdWRpb0Rlc2NyaXB0aW9uLAogICAgICBmYVcsCiAgICAgIGZhRXllRHJvcHBlciwKICAgICAgZmFFeWVEcm9wcGVyRW1wdHksCiAgICAgIGZhRXllZHJvcHBlciwKICAgICAgZmFDaXJjbGVYbWFyazogZmFDaXJjbGVYbWFyazIsCiAgICAgIGZhVGltZXNDaXJjbGU6IGZhVGltZXNDaXJjbGUyLAogICAgICBmYVhtYXJrQ2lyY2xlOiBmYVhtYXJrQ2lyY2xlMiwKICAgICAgZmFUcmFpbGVyLAogICAgICBmYVR1cmtpc2hMaXJhU2lnbiwKICAgICAgZmFUcnksCiAgICAgIGZhVHVya2lzaExpcmEsCiAgICAgIGZhVm9sY2FubywKICAgICAgZmFXYW5kU3BhcmtsZXMsCiAgICAgIGZhTWljcm9waG9uZSwKICAgICAgZmFDcm93biwKICAgICAgZmFUZW50QXJyb3dUdXJuTGVmdCwKICAgICAgZmFUcnVja0Zhc3QsCiAgICAgIGZhU2hpcHBpbmdGYXN0LAogICAgICBmYVVzZXJQZW4sCiAgICAgIGZhVXNlckVkaXQsCiAgICAgIGZhVXNlckNsb2NrLAogICAgICBmYVNob3dlciwKICAgICAgZmFTcXVhcmVDYXJldFVwOiBmYVNxdWFyZUNhcmV0VXAyLAogICAgICBmYUNhcmV0U3F1YXJlVXA6IGZhQ2FyZXRTcXVhcmVVcDIsCiAgICAgIGZhTWFwTG9jYXRpb24sCiAgICAgIGZhTWFwTWFya2VkLAogICAgICBmYVBlbkZhbmN5LAogICAgICBmYUV1cm9TaWduLAogICAgICBmYUV1ciwKICAgICAgZmFFdXJvLAogICAgICBmYUhvdXNlQ2lyY2xlWG1hcmssCiAgICAgIGZhTGlyYVNpZ24sCiAgICAgIGZhWWVuU2lnbiwKICAgICAgZmFDbnksCiAgICAgIGZhSnB5LAogICAgICBmYVJtYiwKICAgICAgZmFZZW4sCiAgICAgIGZhQm94T3BlbiwKICAgICAgZmFUcnVja0ZpZWxkLAogICAgICBmYUxvY2F0aW9uUGluTG9jaywKICAgICAgZmFQZXJzb25QcmF5aW5nLAogICAgICBmYVByYXksCiAgICAgIGZhQ2xpcGJvYXJkTGlzdCwKICAgICAgZmFTYWNrRG9sbGFyLAogICAgICBmYU1vdW50YWluU3VuLAogICAgICBmYUFycm93VXBXaWRlU2hvcnQsCiAgICAgIGZhU29ydEFtb3VudFVwLAogICAgICBmYVVzZXJzTGluZSwKICAgICAgZmFTdGFyT2ZEYXZpZCwKICAgICAgZmFOb3Rlc01lZGljYWwsCiAgICAgIGZhQXVzdHJhbFNpZ24sCiAgICAgIGZhQ2xpcGJvYXJkVXNlciwKICAgICAgZmFGaWxlSW1hZ2U6IGZhRmlsZUltYWdlMiwKICAgICAgZmFTcXVhcmVDYXJldFJpZ2h0OiBmYVNxdWFyZUNhcmV0UmlnaHQyLAogICAgICBmYUNhcmV0U3F1YXJlUmlnaHQ6IGZhQ2FyZXRTcXVhcmVSaWdodDIsCiAgICAgIGZhVmlhbCwKICAgICAgZmFIZWxpY29wdGVyLAogICAgICBmYU1pdHRlbiwKICAgICAgZmFHYXNQdW1wLAogICAgICBmYUVudmVsb3BlQ2lyY2xlQ2hlY2ssCiAgICAgIGZhUGVyc29uU2thdGluZywKICAgICAgZmFTa2F0aW5nLAogICAgICBmYVN1bjogZmFTdW4yLAogICAgICBmYUJhc2ViYWxsLAogICAgICBmYUJhc2ViYWxsQmFsbCwKICAgICAgZmFJbWFnZTogZmFJbWFnZTIsCiAgICAgIGZhTm90ZGVmLAogICAgICBmYUJhc2tldGJhbGwsCiAgICAgIGZhQmFza2V0YmFsbEJhbGwsCiAgICAgIGZhUGVuY2lsLAogICAgICBmYVBlbmNpbEFsdCwKICAgICAgZmFQZXJzb25XYWxraW5nQXJyb3dMb29wTGVmdCwKICAgICAgZmFEaWNlU2l4LAogICAgICBmYUFuZ2xlc0Rvd24sCiAgICAgIGZhQW5nbGVEb3VibGVEb3duLAogICAgICBmYVN5cmluZ2UsCiAgICAgIGZhV2hlYXRBd24sCiAgICAgIGZhV2hlYXRBbHQsCiAgICAgIGZhUGxhbmVVcCwKICAgICAgZmFBbGlnbkNlbnRlciwKICAgICAgZmFIb2NrZXlQdWNrLAogICAgICBmYUNpcmNsZUFycm93TGVmdCwKICAgICAgZmFBcnJvd0NpcmNsZUxlZnQsCiAgICAgIGZhUGx1Z0NpcmNsZUJvbHQsCiAgICAgIGZhUmVzdHJvb20sCiAgICAgIGZhQW5jaG9yTG9jaywKICAgICAgZmFUaW1lbGluZSwKICAgICAgZmFMaWdodGJ1bGI6IGZhTGlnaHRidWxiMiwKICAgICAgZmFDaXJjbGVBcnJvd1JpZ2h0LAogICAgICBmYUFycm93Q2lyY2xlUmlnaHQsCiAgICAgIGZhTWFyc0FuZFZlbnVzLAogICAgICBmYU5ldHdvcmtXaXJlZCwKICAgICAgZmFCdWlsZGluZ1NoaWVsZCwKICAgICAgZmFDb2RlLAogICAgICBmYUZlYXRoZXJQb2ludGVkLAogICAgICBmYUZlYXRoZXJBbHQsCiAgICAgIGZhRmlsZUNpcmNsZVF1ZXN0aW9uLAogICAgICBmYVNpZ25hdHVyZSwKICAgICAgZmFFYXJ0aEFtZXJpY2FzLAogICAgICBmYUVhcnRoLAogICAgICBmYUVhcnRoQW1lcmljYSwKICAgICAgZmFHbG9iZUFtZXJpY2FzLAogICAgICBmYUNhcnJvdCwKICAgICAgZmFUZW1wZXJhdHVyZUZ1bGwsCiAgICAgIGZhVGVtcGVyYXR1cmU0LAogICAgICBmYVRoZXJtb21ldGVyNCwKICAgICAgZmFUaGVybW9tZXRlckZ1bGwsCiAgICAgIGZhVGFibGVDZWxsc1Jvd0xvY2ssCiAgICAgIGZhQm9sdExpZ2h0bmluZywKICAgICAgZmFDbG91ZFNob3dlcnNXYXRlciwKICAgICAgZmFBcnJvd1VwTG9uZywKICAgICAgZmFMb25nQXJyb3dVcCwKICAgICAgZmFBZGRyZXNzQ2FyZDogZmFBZGRyZXNzQ2FyZDIsCiAgICAgIGZhQ29udGFjdENhcmQ6IGZhQ29udGFjdENhcmQyLAogICAgICBmYVZjYXJkOiBmYVZjYXJkMiwKICAgICAgZmFBbmdsZVJpZ2h0LAogICAgICBmYUZhY2VNZWg6IGZhRmFjZU1laDIsCiAgICAgIGZhTWVoOiBmYU1laDIsCiAgICAgIGZhQXJyb3dVcEZyb21Hcm91bmRXYXRlciwKICAgICAgZmFNYXA6IGZhTWFwMiwKICAgICAgZmFVc2VyUGx1cywKICAgICAgZmFWZW51cywKICAgICAgZmFEaWFncmFtU3VjY2Vzc29yLAogICAgICBmYUhlYWRTaWRlQ291Z2hTbGFzaCwKICAgICAgZmFEaWFncmFtUHJvamVjdCwKICAgICAgZmFQcm9qZWN0RGlhZ3JhbSwKICAgICAgZmFUZXJtaW5hbCwKICAgICAgZmFIb3VzZUZpcmUsCiAgICAgIGZhTWFzaywKICAgICAgZmFIdXJyaWNhbmUsCiAgICAgIGZhRWFydGhBZnJpY2EsCiAgICAgIGZhR2xvYmVBZnJpY2EsCiAgICAgIGZhVGh1bWJ0YWNrLAogICAgICBmYVRodW1iVGFjaywKICAgICAgZmFIYW5kUG9pbnREb3duOiBmYUhhbmRQb2ludERvd24yLAogICAgICBmYUZhY2VNZWhCbGFuazogZmFGYWNlTWVoQmxhbmsyLAogICAgICBmYU1laEJsYW5rOiBmYU1laEJsYW5rMiwKICAgICAgZmFUZW1wZXJhdHVyZUVtcHR5LAogICAgICBmYVRlbXBlcmF0dXJlMCwKICAgICAgZmFUaGVybW9tZXRlcjAsCiAgICAgIGZhVGhlcm1vbWV0ZXJFbXB0eSwKICAgICAgZmFCb3JkZXJOb25lLAogICAgICBmYUhpZ2hsaWdodGVyLAogICAgICBmYU1vbmV5QmlsbFdhdmUsCiAgICAgIGZhVG9pbGV0UGFwZXJTbGFzaCwKICAgICAgZmFGaWxlU2hpZWxkLAogICAgICBmYVRleHRIZWlnaHQsCiAgICAgIGZhRmFjZUdyaW5Ub25ndWU6IGZhRmFjZUdyaW5Ub25ndWUyLAogICAgICBmYUdyaW5Ub25ndWU6IGZhR3JpblRvbmd1ZTIsCiAgICAgIGZhRmlsZVNpZ25hdHVyZSwKICAgICAgZmFCdWlsZGluZ1doZWF0LAogICAgICBmYVBsdWdDaXJjbGVNaW51cywKICAgICAgZmFGdXRib2w6IGZhRnV0Ym9sMiwKICAgICAgZmFGdXRib2xCYWxsOiBmYUZ1dGJvbEJhbGwyLAogICAgICBmYVNvY2NlckJhbGw6IGZhU29jY2VyQmFsbDIsCiAgICAgIGZhQ2lyY2xlUGx1cywKICAgICAgZmFQbHVzQ2lyY2xlLAogICAgICBmYUJyYXppbGlhblJlYWxTaWduLAogICAgICBmYVN0YXJBbmRDcmVzY2VudCwKICAgICAgZmFGYWNlU3VycHJpc2U6IGZhRmFjZVN1cnByaXNlMiwKICAgICAgZmFTdXJwcmlzZTogZmFTdXJwcmlzZTIsCiAgICAgIGZhSG9zcGl0YWxVc2VyLAogICAgICBmYUFycm93RG93blVwTG9jaywKICAgICAgZmFGb2xkZXI6IGZhRm9sZGVyMiwKICAgICAgZmFGb2xkZXJCbGFuazogZmFGb2xkZXJCbGFuazIsCiAgICAgIGZhSG9sbHlCZXJyeSwKICAgICAgZmFWZW51c0RvdWJsZSwKICAgICAgZmFDbGlwYm9hcmRRdWVzdGlvbiwKICAgICAgZmFIb3Rkb2csCiAgICAgIGZhQXJyb3dVcEZyb21CcmFja2V0LAogICAgICBmYU1pY3Jvc2NvcGUsCiAgICAgIGZhQ2xvdWQ6IGZhQ2xvdWQyLAogICAgICBmYUJhc2ViYWxsQmF0QmFsbCwKICAgICAgZmFDYXJSZWFyLAogICAgICBmYUNhckFsdCwKICAgICAgZmFUaHVtYnRhY2tTbGFzaCwKICAgICAgZmFUaHVtYlRhY2tTbGFzaCwKICAgICAgZmFQbHVzTWludXMsCiAgICAgIGZhSG91c2VDaXJjbGVDaGVjaywKICAgICAgZmFDYWxlbmRhckRheSwKICAgICAgZmFDaXJjbGU6IGZhQ2lyY2xlMiwKICAgICAgZmFNb2JpbGVWaWJyYXRlLAogICAgICBmYUZhY2VHcmluU3F1aW50OiBmYUZhY2VHcmluU3F1aW50MiwKICAgICAgZmFHcmluU3F1aW50OiBmYUdyaW5TcXVpbnQyLAogICAgICBmYVVzZXJzQmV0d2VlbkxpbmVzLAogICAgICBmYUhvdXNlTWVkaWNhbENpcmNsZVhtYXJrLAogICAgICBmYVRhYmxlTGlzdCwKICAgICAgZmFUaExpc3QsCiAgICAgIGZhRmxhc2tWaWFsLAogICAgICBmYUNpcmNsZUV4Y2xhbWF0aW9uLAogICAgICBmYUV4Y2xhbWF0aW9uQ2lyY2xlLAogICAgICBmYVRheGksCiAgICAgIGZhQ2FiLAogICAgICBmYVRleHRTbGFzaCwKICAgICAgZmFSZW1vdmVGb3JtYXQsCiAgICAgIGZhUGVvcGxlUHVsbGluZywKICAgICAgZmFCYWNrd2FyZCwKICAgICAgZmFDYXJCdXJzdCwKICAgICAgZmFDYXJDcmFzaCwKICAgICAgZmFMaW5rLAogICAgICBmYUNoYWluLAogICAgICBmYUJhY2t3YXJkU3RlcCwKICAgICAgZmFTdGVwQmFja3dhcmQsCiAgICAgIGZhWCwKICAgICAgZmFDaXJjbGVVc2VyOiBmYUNpcmNsZVVzZXIyLAogICAgICBmYVVzZXJDaXJjbGU6IGZhVXNlckNpcmNsZTIsCiAgICAgIGZhUmVjdGFuZ2xlTGlzdDogZmFSZWN0YW5nbGVMaXN0MiwKICAgICAgZmFMaXN0QWx0OiBmYUxpc3RBbHQyLAogICAgICBmYUhhbmQ6IGZhSGFuZDIsCiAgICAgIGZhSGFuZFBhcGVyOiBmYUhhbmRQYXBlcjIsCiAgICAgIGZhVmFuU2h1dHRsZSwKICAgICAgZmFTaHV0dGxlVmFuLAogICAgICBmYVN0YWlycywKICAgICAgZmFIb3JzZUhlYWQsCiAgICAgIGZhVmF1bHQsCiAgICAgIGZhRHJ1bVN0ZWVscGFuLAogICAgICBmYVRodW1ic1VwOiBmYVRodW1ic1VwMiwKICAgICAgZmFTdGFtcCwKICAgICAgZmFNZW5vcmFoLAogICAgICBmYUNoaWxkcmVuLAogICAgICBmYUNoYXJ0TGluZSwKICAgICAgZmFMaW5lQ2hhcnQsCiAgICAgIGZhU3F1YXJlRW52ZWxvcGUsCiAgICAgIGZhRW52ZWxvcGVTcXVhcmUsCiAgICAgIGZhQmFuU21va2luZywKICAgICAgZmFTbW9raW5nQmFuLAogICAgICBmYVRydWNrRnJvbnQsCiAgICAgIGZhQnVpbGRpbmc6IGZhQnVpbGRpbmcyLAogICAgICBmYUJ1bGxzZXllLAogICAgICBmYUFycm93TGVmdExvbmcsCiAgICAgIGZhTG9uZ0Fycm93TGVmdCwKICAgICAgZmFDaGVzc1Jvb2s6IGZhQ2hlc3NSb29rMiwKICAgICAgZmFCbGVuZGVyUGhvbmUsCiAgICAgIGZhQXJyb3dUdXJuVXAsCiAgICAgIGZhTGV2ZWxVcCwKICAgICAgZmFCaWN5Y2xlLAogICAgICBmYUNpcmNsZUFycm93RG93biwKICAgICAgZmFBcnJvd0NpcmNsZURvd24sCiAgICAgIGZhR2VhciwKICAgICAgZmFDb2csCiAgICAgIGZhTWFyc0FuZFZlbnVzQnVyc3QsCiAgICAgIGZhT3R0ZXIsCiAgICAgIGZhQ2lyY2xlQ2hldnJvbkxlZnQsCiAgICAgIGZhQ2hldnJvbkNpcmNsZUxlZnQsCiAgICAgIGZhQ2lyY2xlUXVlc3Rpb246IGZhQ2lyY2xlUXVlc3Rpb24yLAogICAgICBmYVF1ZXN0aW9uQ2lyY2xlOiBmYVF1ZXN0aW9uQ2lyY2xlMiwKICAgICAgZmFXYWxraWVUYWxraWUsCiAgICAgIGZhVXNlckdyb3VwLAogICAgICBmYVVzZXJGcmllbmRzLAogICAgICBmYUhvdXNlQ2hpbW5leSwKICAgICAgZmFIb21lTGcsCiAgICAgIGZhUmlnaHRGcm9tQnJhY2tldCwKICAgICAgZmFTaWduT3V0QWx0LAogICAgICBmYUZpbGU6IGZhRmlsZTIsCiAgICAgIGZhUGxhbmVTbGFzaCwKICAgICAgZmFDbG91ZFNob3dlcnNIZWF2eSwKICAgICAgZmFQZXJzb25GYWxsaW5nLAogICAgICBmYVR1cm5Eb3duLAogICAgICBmYUxldmVsRG93bkFsdCwKICAgICAgZmFVcFJpZ2h0QW5kRG93bkxlZnRGcm9tQ2VudGVyLAogICAgICBmYUV4cGFuZEFsdCwKICAgICAgZmFVc2VyVGFnLAogICAgICBmYUhhbmRTcGFya2xlcywKICAgICAgZmFBcnJvd3NUb0RvdCwKICAgICAgZmFGYWNlU2FkQ3J5OiBmYUZhY2VTYWRDcnkyLAogICAgICBmYVNhZENyeTogZmFTYWRDcnkyLAogICAgICBmYURvbmdTaWduLAogICAgICBmYVBlb3BsZUxpbmUsCiAgICAgIGZhU3F1YXJlUnNzLAogICAgICBmYVJzc1NxdWFyZSwKICAgICAgZmFDYWxlbmRhck1pbnVzOiBmYUNhbGVuZGFyTWludXMyLAogICAgICBmYUNoYXJ0RGlhZ3JhbSwKICAgICAgZmFGYWNlVGlyZWQ6IGZhRmFjZVRpcmVkMiwKICAgICAgZmFUaXJlZDogZmFUaXJlZDIsCiAgICAgIGZhSGFuZFBvaW50UmlnaHQ6IGZhSGFuZFBvaW50UmlnaHQyLAogICAgICBmYUFycm93VXAsCiAgICAgIGZhQ3ViZXNTdGFja2VkLAogICAgICBmYUNoaWxkQ29tYmF0YW50LAogICAgICBmYUNoaWxkUmlmbGUsCiAgICAgIGZhVmVzdFBhdGNoZXMsCiAgICAgIGZhTWFydGluaUdsYXNzRW1wdHksCiAgICAgIGZhR2xhc3NNYXJ0aW5pLAogICAgICBmYU1hZ25ldCwKICAgICAgZmFSb2FkQmFycmllciwKICAgICAgZmFDb21wYXNzRHJhZnRpbmcsCiAgICAgIGZhRHJhZnRpbmdDb21wYXNzLAogICAgICBmYVNxdWFyZVBlcnNvbkNvbmZpbmVkLAogICAgICBmYVBsYXRlV2hlYXQsCiAgICAgIGZhU2lnbkhhbmdpbmcsCiAgICAgIGZhU2lnbiwKICAgICAgZmFDYXJCYXR0ZXJ5LAogICAgICBmYUJhdHRlcnlDYXIsCiAgICAgIGZhU2hpcnQsCiAgICAgIGZhVFNoaXJ0LAogICAgICBmYVRzaGlydCwKICAgICAgZmFQYXJhZ3JhcGgsCiAgICAgIGZhRW52ZWxvcGVzQnVsaywKICAgICAgZmFNYWlsQnVsaywKICAgICAgZmFHdWl0YXIsCiAgICAgIGZhU3VpdGNhc2UsCiAgICAgIGZhQ2lyY2xlVXA6IGZhQ2lyY2xlVXAyLAogICAgICBmYUFycm93QWx0Q2lyY2xlVXA6IGZhQXJyb3dBbHRDaXJjbGVVcDIsCiAgICAgIGZhRiwKICAgICAgZmFYbWFya3NMaW5lcywKICAgICAgZmFFYXJ0aE9jZWFuaWEsCiAgICAgIGZhR2xvYmVPY2VhbmlhLAogICAgICBmYUNvbW1lbnRTbGFzaCwKICAgICAgZmFQbGF5LAogICAgICBmYVZpYWxDaXJjbGVDaGVjaywKICAgICAgZmFCcmlkZ2VDaXJjbGVDaGVjaywKICAgICAgZmFDZWRpU2lnbiwKICAgICAgZmFQdXp6bGVQaWVjZSwKICAgICAgZmFIZWxtZXRVbiwKICAgICAgZmFHbGFzc1dhdGVyLAogICAgICBmYUhlYXJ0Q2lyY2xlQm9sdCwKICAgICAgZmFQdW1wU29hcCwKICAgICAgZmFIYW5kU2Npc3NvcnM6IGZhSGFuZFNjaXNzb3JzMiwKICAgICAgZmFEb2xseSwKICAgICAgZmFEb2xseUJveCwKICAgICAgZmFQYXBlcmNsaXAsCiAgICAgIGZhRGVtb2NyYXQsCiAgICAgIGZhU3F1YXJlQXJyb3dVcFJpZ2h0LAogICAgICBmYUV4dGVybmFsTGlua1NxdWFyZSwKICAgICAgZmFGZXJyeSwKICAgICAgZmFNb3NxdWl0bywKICAgICAgZmFCdWlsZGluZ0NpcmNsZUFycm93UmlnaHQsCiAgICAgIGZhTGVmdFJpZ2h0LAogICAgICBmYUFycm93c0FsdEgsCiAgICAgIGZhVmlydXMsCiAgICAgIGZhR2VtOiBmYUdlbTIsCiAgICAgIGZhVG9pbGV0LAogICAgICBmYVNpbmdsZVF1b3RlTGVmdCwKICAgICAgZmFNb25leUJpbGxzLAogICAgICBmYVRhYmxldEJ1dHRvbiwKICAgICAgZmFSZWN0YW5nbGVYbWFyazogZmFSZWN0YW5nbGVYbWFyazIsCiAgICAgIGZhUmVjdGFuZ2xlVGltZXM6IGZhUmVjdGFuZ2xlVGltZXMyLAogICAgICBmYVRpbWVzUmVjdGFuZ2xlOiBmYVRpbWVzUmVjdGFuZ2xlMiwKICAgICAgZmFXaW5kb3dDbG9zZTogZmFXaW5kb3dDbG9zZTIsCiAgICAgIGZhV3JlbmNoLAogICAgICBmYVRyYXNoQ2FuOiBmYVRyYXNoQ2FuMiwKICAgICAgZmFUcmFzaEFsdDogZmFUcmFzaEFsdDIsCiAgICAgIGZhVGFibGVDZWxscywKICAgICAgZmFUaCwKICAgICAgZmFSaWJib24sCiAgICAgIGZhTGFuZG1hcmtGbGFnLAogICAgICBmYVVwRG93bkxlZnRSaWdodCwKICAgICAgZmFBcnJvd3NBbHQsCiAgICAgIGZhQ2FyU2lkZSwKICAgICAgZmFUcmFzaEFycm93VXAsCiAgICAgIGZhVHJhc2hSZXN0b3JlLAogICAgICBmYUxpZmVSaW5nOiBmYUxpZmVSaW5nMiwKICAgICAgZmFDb3B5cmlnaHQ6IGZhQ29weXJpZ2h0MiwKICAgICAgZmFGaWxlUHJlc2NyaXB0aW9uLAogICAgICBmYUVyYXNlciwKICAgICAgZmFIb3VyZ2xhc3NTdGFydCwKICAgICAgZmFIb3VyZ2xhc3MxLAogICAgICBmYUNpcmNsZUxlZnQ6IGZhQ2lyY2xlTGVmdDIsCiAgICAgIGZhQXJyb3dBbHRDaXJjbGVMZWZ0OiBmYUFycm93QWx0Q2lyY2xlTGVmdDIsCiAgICAgIGZhQ3J1emVpcm9TaWduLAogICAgICBmYVNtb2tpbmcsCiAgICAgIGZhU3F1YXJlUG9sbFZlcnRpY2FsLAogICAgICBmYVBvbGwsCiAgICAgIGZhUGVyc29uQ2lyY2xlTWludXMsCiAgICAgIGZhQmlvaGF6YXJkLAogICAgICBmYUJlbGxDb25jaWVyZ2UsCiAgICAgIGZhQ29uY2llcmdlQmVsbCwKICAgICAgZmFSdWxlckhvcml6b250YWwsCiAgICAgIGZhSG9yc2UsCiAgICAgIGZhQ2FsZW5kYXI6IGZhQ2FsZW5kYXIyLAogICAgICBmYUhhbmRzSG9sZGluZ0NoaWxkLAogICAgICBmYUl0YWxpYywKICAgICAgZmFLaGFuZGEsCiAgICAgIGZhRmFjZUZyb3duT3BlbjogZmFGYWNlRnJvd25PcGVuMiwKICAgICAgZmFGcm93bk9wZW46IGZhRnJvd25PcGVuMiwKICAgICAgZmFDaGVjaywKICAgICAgZmFGaW5nZXJwcmludCwKICAgICAgZmFDaGFyZ2luZ1N0YXRpb24sCiAgICAgIGZhVXNlckxvY2ssCiAgICAgIGZhTW9iaWxlU2NyZWVuQnV0dG9uLAogICAgICBmYU1vYmlsZUFsdCwKICAgICAgZmFBbmNob3JDaXJjbGVDaGVjaywKICAgICAgZmFQZXJzb25XYWxraW5nV2l0aENhbmUsCiAgICAgIGZhQmxpbmQsCiAgICAgIGZhRmlsZVdhdmVmb3JtLAogICAgICBmYUZpbGVNZWRpY2FsQWx0LAogICAgICBmYUhvdXNlQ3JhY2ssCiAgICAgIGZhSGF0V2l6YXJkLAogICAgICBmYVVzZXJEb2N0b3IsCiAgICAgIGZhVXNlck1kLAogICAgICBmYUNoYXJ0QmFyOiBmYUNoYXJ0QmFyMiwKICAgICAgZmFCYXJDaGFydDogZmFCYXJDaGFydDIsCiAgICAgIGZhU3ByYXlDYW5TcGFya2xlcywKICAgICAgZmFBaXJGcmVzaGVuZXIsCiAgICAgIGZhQmFodFNpZ24sCiAgICAgIGZhVGVtcGVyYXR1cmVBcnJvd1VwLAogICAgICBmYVRlbXBlcmF0dXJlVXAsCiAgICAgIGZhV2ViQXdlc29tZTogZmFXZWJBd2Vzb21lMiwKICAgICAgZmFOb25CaW5hcnksCiAgICAgIGZhTiwKICAgICAgZmFBcnJvd3NVcERvd25MZWZ0UmlnaHQsCiAgICAgIGZhQXJyb3dzLAogICAgICBmYUhvdXNlOiBmYUhvdXNlMiwKICAgICAgZmFIb21lOiBmYUhvbWUyLAogICAgICBmYUhvbWVBbHQ6IGZhSG9tZUFsdDIsCiAgICAgIGZhSG9tZUxnQWx0OiBmYUhvbWVMZ0FsdDIsCiAgICAgIGZhU3Bpbm5lciwKICAgICAgZmFHYXZlbCwKICAgICAgZmFMZWdhbCwKICAgICAgZmFUaWNrZXRTaW1wbGUsCiAgICAgIGZhVGlja2V0QWx0LAogICAgICBmYURvdmUsCiAgICAgIGZhVGFycERyb3BsZXQsCiAgICAgIGZhVHJlZUNpdHksCiAgICAgIGZhVHVyblVwLAogICAgICBmYUxldmVsVXBBbHQsCiAgICAgIGZhVGVtcGVyYXR1cmVRdWFydGVyLAogICAgICBmYVRlbXBlcmF0dXJlMSwKICAgICAgZmFUaGVybW9tZXRlcjEsCiAgICAgIGZhVGhlcm1vbWV0ZXJRdWFydGVyLAogICAgICBmYVNsaWRlcnMsCiAgICAgIGZhU2xpZGVyc0gsCiAgICAgIGZhTW9zcXVlLAogICAgICBmYUgsCiAgICAgIGZhSW5mbywKICAgICAgZmFQZXJzb25XYWxraW5nLAogICAgICBmYVdhbGtpbmcsCiAgICAgIGZhQXJyb3dUdXJuRG93biwKICAgICAgZmFMZXZlbERvd24sCiAgICAgIGZhUm9hZCwKICAgICAgZmFTcGlyYWwsCiAgICAgIGZhRmFjZUZyb3duOiBmYUZhY2VGcm93bjIsCiAgICAgIGZhRnJvd246IGZhRnJvd24yLAogICAgICBmYVdpbmVHbGFzc0VtcHR5LAogICAgICBmYVdpbmVHbGFzc0FsdCwKICAgICAgZmFDbGFwcGVyYm9hcmQsCiAgICAgIGZhRm9yd2FyZFN0ZXAsCiAgICAgIGZhU3RlcEZvcndhcmQsCiAgICAgIGZhU3F1YXJlVXBSaWdodCwKICAgICAgZmFFeHRlcm5hbExpbmtTcXVhcmVBbHQsCiAgICAgIGZhQm9va0pvdXJuYWxXaGlsbHMsCiAgICAgIGZhSm91cm5hbFdoaWxscywKICAgICAgZmFDaGFtcGFnbmVHbGFzc2VzLAogICAgICBmYUdsYXNzQ2hlZXJzLAogICAgICBmYUR1bXBzdGVyLAogICAgICBmYUhlYXJ0Q2lyY2xlWG1hcmssCiAgICAgIGZhQ29tcHV0ZXIsCiAgICAgIGZhV2FuZE1hZ2ljLAogICAgICBmYU1hZ2ljLAogICAgICBmYUJyYWluLAogICAgICBmYUJyaWVmY2FzZU1lZGljYWwsCiAgICAgIGZhSG91c2VNZWRpY2FsQ2lyY2xlRXhjbGFtYXRpb24sCiAgICAgIGZhQ29kZUNvbW1pdCwKICAgICAgZmFQZXJzb25CcmVhc3RmZWVkaW5nLAogICAgICBmYVBlcnNvblJheXMsCiAgICAgIGZhTWFuYXRTaWduLAogICAgICBmYVNvcnQsCiAgICAgIGZhVW5zb3J0ZWQsCiAgICAgIGZhQ2lyY2xlUmFkaWF0aW9uLAogICAgICBmYVJhZGlhdGlvbkFsdCwKICAgICAgZmFMYXB0b3BDb2RlLAogICAgICBmYVNpbmssCiAgICAgIGZhQXJyb3dVcEZyb21XYXRlclB1bXAsCiAgICAgIGZhTWljcm9waG9uZUxpbmVzU2xhc2gsCiAgICAgIGZhTWljcm9waG9uZUFsdFNsYXNoLAogICAgICBmYVNlcnZlciwKICAgICAgZmFVc2VyOiBmYVVzZXIyLAogICAgICBmYVVzZXJBbHQ6IGZhVXNlckFsdDIsCiAgICAgIGZhVXNlckxhcmdlOiBmYVVzZXJMYXJnZTIsCiAgICAgIGZhU25vd2ZsYWtlOiBmYVNub3dmbGFrZTIsCiAgICAgIGZhU2t1bGxDcm9zc2JvbmVzLAogICAgICBmYVBlc29TaWduLAogICAgICBmYVdpbmVHbGFzcywKICAgICAgZmFUZW1wZXJhdHVyZUhhbGYsCiAgICAgIGZhVGVtcGVyYXR1cmUyLAogICAgICBmYVRoZXJtb21ldGVyMiwKICAgICAgZmFUaGVybW9tZXRlckhhbGYsCiAgICAgIGZhVGlja2V0LAogICAgICBmYVdoZWF0QXduQ2lyY2xlRXhjbGFtYXRpb24sCiAgICAgIGZhQXJyb3dzVHVyblJpZ2h0LAogICAgICBmYUNhbmR5Q2FuZSwKICAgICAgZmFXaGVlbGNoYWlyLAogICAgICBmYVNwZWxsQ2hlY2ssCiAgICAgIGZhVm9sdW1lT2ZmLAogICAgICBmYUx1bmdzLAogICAgICBmYUJvb2ttYXJrOiBmYUJvb2ttYXJrMiwKICAgICAgZmFCYXJjb2RlLAogICAgICBmYUxpc3RPbCwKICAgICAgZmFMaXN0MTIsCiAgICAgIGZhTGlzdE51bWVyaWMsCiAgICAgIGZhRmlsZUNpcmNsZVhtYXJrLAogICAgICBmYUN1YmUsCiAgICAgIGZhVGFwZSwKICAgICAgZmFCb21iLAogICAgICBmYVNjYWxlVW5iYWxhbmNlZCwKICAgICAgZmFCYWxhbmNlU2NhbGVMZWZ0LAogICAgICBmYVNxdWFyZUNhcmV0TGVmdDogZmFTcXVhcmVDYXJldExlZnQyLAogICAgICBmYUNhcmV0U3F1YXJlTGVmdDogZmFDYXJldFNxdWFyZUxlZnQyLAogICAgICBmYVJ1bGVyLAogICAgICBmYUksCiAgICAgIGZhVm9sdW1lWG1hcmssCiAgICAgIGZhVm9sdW1lTXV0ZSwKICAgICAgZmFWb2x1bWVUaW1lcywKICAgICAgZmFBcmNod2F5LAogICAgICBmYVBlcnNvbkRpZ2dpbmcsCiAgICAgIGZhRGlnZ2luZywKICAgICAgZmFHYXVnZUhpZ2gsCiAgICAgIGZhVGFjaG9tZXRlckFsdCwKICAgICAgZmFUYWNob21ldGVyQWx0RmFzdCwKICAgICAgZmFHZW5kZXJsZXNzLAogICAgICBmYUNsb3VkU3VuLAogICAgICBmYUFycm93UmlnaHQsCiAgICAgIGZhSGFuZHNoYWtlOiBmYUhhbmRzaGFrZTIsCiAgICAgIGZhSGFuZHNoYWtlQWx0OiBmYUhhbmRzaGFrZUFsdDIsCiAgICAgIGZhSGFuZHNoYWtlU2ltcGxlOiBmYUhhbmRzaGFrZVNpbXBsZTIsCiAgICAgIGZhUGVyc29uU2tpaW5nLAogICAgICBmYVNraWluZywKICAgICAgZmFCcmlkZ2VXYXRlciwKICAgICAgZmFCdWlsZGluZ05nbywKICAgICAgZmFJZ2xvbywKICAgICAgZmFDaXJjbGVEb2xsYXJUb1Nsb3QsCiAgICAgIGZhRG9uYXRlLAogICAgICBmYVksCiAgICAgIGZhRmFjZVNtaWxlV2luazogZmFGYWNlU21pbGVXaW5rMiwKICAgICAgZmFTbWlsZVdpbms6IGZhU21pbGVXaW5rMiwKICAgICAgZmFEaWNlRm91ciwKICAgICAgZmFGYWNlR3JpblNxdWludFRlYXJzOiBmYUZhY2VHcmluU3F1aW50VGVhcnMyLAogICAgICBmYUdyaW5TcXVpbnRUZWFyczogZmFHcmluU3F1aW50VGVhcnMyLAogICAgICBmYUZpbGVBdWRpbzogZmFGaWxlQXVkaW8yLAogICAgICBmYUFycm93c0Rvd25Ub0xpbmUsCiAgICAgIGZhRywKICAgICAgZmFWaWhhcmEsCiAgICAgIGZhRmxhZ0NoZWNrZXJlZCwKICAgICAgZmFHYXVnZVNpbXBsZSwKICAgICAgZmFHYXVnZVNpbXBsZU1lZCwKICAgICAgZmFUYWNob21ldGVyQXZlcmFnZSwKICAgICAgZmFSaWdodExlZnQsCiAgICAgIGZhRXhjaGFuZ2VBbHQsCiAgICAgIGZhUGlsbHMsCiAgICAgIGZhRXhwbG9zaW9uLAogICAgICBmYUFycm93c0Rvd25Ub1Blb3BsZSwKICAgICAgZmFVc2Vyc1ZpZXdmaW5kZXIsCiAgICAgIGZhQ2FyT24sCiAgICAgIGZhU2xlaWdoLAogICAgICBmYUR1bWJiZWxsLAogICAgICBmYUJhYnlDYXJyaWFnZSwKICAgICAgZmFDYXJyaWFnZUJhYnksCiAgICAgIGZhS2l3aUJpcmQsCiAgICAgIGZhQ2FsZW5kYXJYbWFyazogZmFDYWxlbmRhclhtYXJrMiwKICAgICAgZmFDYWxlbmRhclRpbWVzOiBmYUNhbGVuZGFyVGltZXMyLAogICAgICBmYUNpcmNsZURvd246IGZhQ2lyY2xlRG93bjIsCiAgICAgIGZhQXJyb3dBbHRDaXJjbGVEb3duOiBmYUFycm93QWx0Q2lyY2xlRG93bjIsCiAgICAgIGZhRmlsZU1lZGljYWwsCiAgICAgIGZhWG1hcmssCiAgICAgIGZhQ2xvc2UsCiAgICAgIGZhTXVsdGlwbHksCiAgICAgIGZhUmVtb3ZlLAogICAgICBmYVRpbWVzLAogICAgICBmYVNoYXBlcywKICAgICAgZmFUcmlhbmdsZUNpcmNsZVNxdWFyZSwKICAgICAgZmFEaWNlT25lLAogICAgICBmYUxvY2tPcGVuLAogICAgICBmYVBlcHBlckhvdCwKICAgICAgZmFEcm9wbGV0U2xhc2gsCiAgICAgIGZhVGludFNsYXNoLAogICAgICBmYURyb3BsZXQsCiAgICAgIGZhVGludCwKICAgICAgZmFGaWxlTGluZXM6IGZhRmlsZUxpbmVzMiwKICAgICAgZmFGaWxlQWx0OiBmYUZpbGVBbHQyLAogICAgICBmYUZpbGVUZXh0OiBmYUZpbGVUZXh0MiwKICAgICAgZmFDb21tZW50c0RvbGxhciwKICAgICAgZmFNYWduaWZ5aW5nR2xhc3NMb2NhdGlvbiwKICAgICAgZmFTZWFyY2hMb2NhdGlvbiwKICAgICAgZmFGaWxlSW52b2ljZSwKICAgICAgZmFQZW50YWdvbiwKICAgICAgZmFSZXB1YmxpY2FuLAogICAgICBmYVNob3AsCiAgICAgIGZhU3RvcmVBbHQsCiAgICAgIGZhRmlsbSwKICAgICAgZmFGaWxtQWx0LAogICAgICBmYUZpbG1TaW1wbGUsCiAgICAgIGZhQnVpbGRpbmdDaXJjbGVYbWFyaywKICAgICAgZmFDb21tZW50czogZmFDb21tZW50czIsCiAgICAgIGZhVGFncywKICAgICAgZmFHdW4sCiAgICAgIGZhQ2lyY2xlQ2hlY2s6IGZhQ2lyY2xlQ2hlY2syLAogICAgICBmYUNoZWNrQ2lyY2xlOiBmYUNoZWNrQ2lyY2xlMiwKICAgICAgZmFJZENhcmRDbGlwLAogICAgICBmYUlkQ2FyZEFsdCwKICAgICAgZmFNb29uOiBmYU1vb24yLAogICAgICBmYU9pbFdlbGwsCiAgICAgIGZhVGFjaG9ncmFwaERpZ2l0YWwsCiAgICAgIGZhRGlnaXRhbFRhY2hvZ3JhcGgsCiAgICAgIGZhVGFibGV0LAogICAgICBmYVRhYmxldEFuZHJvaWQsCiAgICAgIGZhUnVibGVTaWduLAogICAgICBmYVJvdWJsZSwKICAgICAgZmFSdWIsCiAgICAgIGZhUnVibGUsCiAgICAgIGZhQ2xvc2VkQ2FwdGlvbmluZzogZmFDbG9zZWRDYXB0aW9uaW5nMiwKICAgICAgZmFQZW4sCiAgICAgIGZhUGxhbmUsCiAgICAgIGZhSW1hZ2VzOiBmYUltYWdlczIsCiAgICAgIGZhTW9iaWxlU2NyZWVuLAogICAgICBmYU1vYmlsZUFuZHJvaWRBbHQsCiAgICAgIGZhR3VhcmFuaVNpZ24sCiAgICAgIGZhQmFnU2hvcHBpbmcsCiAgICAgIGZhU2hvcHBpbmdCYWcsCiAgICAgIGZhQ2lyY2xlUmlnaHQ6IGZhQ2lyY2xlUmlnaHQyLAogICAgICBmYUFycm93QWx0Q2lyY2xlUmlnaHQ6IGZhQXJyb3dBbHRDaXJjbGVSaWdodDIsCiAgICAgIGZhUGhvbmVWb2x1bWUsCiAgICAgIGZhVm9sdW1lQ29udHJvbFBob25lLAogICAgICBmYUN1YmVzLAogICAgICBmYVBob25lLAogICAgICBmYVRvcmlpR2F0ZSwKICAgICAgZmFCYWNvbiwKICAgICAgZmFQZXJzb25GYWxsaW5nQnVyc3QsCiAgICAgIGZhUXVvdGVSaWdodCwKICAgICAgZmFRdW90ZVJpZ2h0QWx0LAogICAgICBmYUhvdXNlTWVkaWNhbEZsYWcsCiAgICAgIGZhUHJlc2NyaXB0aW9uLAogICAgICBmYURpY2VUaHJlZSwKICAgICAgZmFCdWlsZGluZ0xvY2ssCiAgICAgIGZhSWRDYXJkOiBmYUlkQ2FyZDIsCiAgICAgIGZhRHJpdmVyc0xpY2Vuc2U6IGZhRHJpdmVyc0xpY2Vuc2UyLAogICAgICBmYUNpcmNsZVBsYXk6IGZhQ2lyY2xlUGxheTIsCiAgICAgIGZhUGxheUNpcmNsZTogZmFQbGF5Q2lyY2xlMiwKICAgICAgZmFGYWNlTGF1Z2hCZWFtOiBmYUZhY2VMYXVnaEJlYW0yLAogICAgICBmYUxhdWdoQmVhbTogZmFMYXVnaEJlYW0yLAogICAgICBmYUxlYWYsCiAgICAgIGZhSG91c2VDaGltbmV5VXNlciwKICAgICAgZmFSb3RhdGVSaWdodCwKICAgICAgZmFSZWRvQWx0LAogICAgICBmYVJvdGF0ZUZvcndhcmQsCiAgICAgIGZhVG9vdGgsCiAgICAgIGZhSG91c2VDaGltbmV5V2luZG93LAogICAgICBmYU1vdG9yY3ljbGUsCiAgICAgIGZhQmFja3dhcmRGYXN0LAogICAgICBmYUZhc3RCYWNrd2FyZCwKICAgICAgZmFBZGRyZXNzQm9vazogZmFBZGRyZXNzQm9vazIsCiAgICAgIGZhQ29udGFjdEJvb2s6IGZhQ29udGFjdEJvb2syLAogICAgICBmYVNhaWxib2F0LAogICAgICBmYUJvb2tCb29rbWFyaywKICAgICAgZmFNYWduaWZ5aW5nR2xhc3NBcnJvd1JpZ2h0LAogICAgICBmYU1pY3JvcGhvbmVMaW5lcywKICAgICAgZmFNaWNyb3Bob25lQWx0LAogICAgICBmYVJlcGx5QWxsLAogICAgICBmYU1haWxSZXBseUFsbCwKICAgICAgZmFVbml2ZXJzYWxBY2Nlc3MsCiAgICAgIGZhVG9pbGV0UGFwZXIsCiAgICAgIGZhVG9pbGV0UGFwZXJBbHQsCiAgICAgIGZhVG9pbGV0UGFwZXJCbGFuaywKICAgICAgZmFWckNhcmRib2FyZCwKICAgICAgZmFQaXp6YVNsaWNlLAogICAgICBmYVNwcmF5Q2FuLAogICAgICBmYVZvbHVtZUxvdywKICAgICAgZmFWb2x1bWVEb3duLAogICAgICBmYUNyb3NzLAogICAgICBmYVBlcnNvbiwKICAgICAgZmFNYWxlLAogICAgICBmYUhvdXJnbGFzczogZmFIb3VyZ2xhc3MzLAogICAgICBmYUhvdXJnbGFzc0VtcHR5OiBmYUhvdXJnbGFzc0VtcHR5MiwKICAgICAgZmFGaXNoLAogICAgICBmYURydW1zdGlja0JpdGUsCiAgICAgIGZhQ2hhcnRTaW1wbGUsCiAgICAgIGZhQXRvbSwKICAgICAgZmFQLAogICAgICBmYUpldEZpZ2h0ZXJVcCwKICAgICAgZmFQbHVnQ2lyY2xlWG1hcmssCiAgICAgIGZhU2hlZXRQbGFzdGljLAogICAgICBmYVYsCiAgICAgIGZhTGlzdCwKICAgICAgZmFMaXN0U3F1YXJlcywKICAgICAgZmFTb2xhclBhbmVsLAogICAgICBmYUxhbmRNaW5lT24sCiAgICAgIGZhSGVhZHBob25lczogZmFIZWFkcGhvbmVzMiwKICAgICAgZmFIZWFkcGhvbmVzQWx0OiBmYUhlYWRwaG9uZXNBbHQyLAogICAgICBmYUhlYWRwaG9uZXNTaW1wbGU6IGZhSGVhZHBob25lc1NpbXBsZTIsCiAgICAgIGZhQnVzLAogICAgICBmYUZpbGVQb3dlcnBvaW50OiBmYUZpbGVQb3dlcnBvaW50MiwKICAgICAgZmFRdW90ZUxlZnQsCiAgICAgIGZhUXVvdGVMZWZ0QWx0LAogICAgICBmYUNoZXZyb25Eb3duLAogICAgICBmYUVhcnRoQXNpYSwKICAgICAgZmFHbG9iZUFzaWEsCiAgICAgIGZhQ2VudFNpZ24sCiAgICAgIGZhU2hpZWxkQ2F0LAogICAgICBmYVNjaG9vbENpcmNsZUNoZWNrLAogICAgICBmYU1hcnRpbmlHbGFzcywKICAgICAgZmFHbGFzc01hcnRpbmlBbHQsCiAgICAgIGZhUGx1ZywKICAgICAgZmFQYW5vcmFtYSwKICAgICAgZmFDbG9ja1JvdGF0ZUxlZnQsCiAgICAgIGZhSGlzdG9yeSwKICAgICAgZmFKYXJXaGVhdCwKICAgICAgZmFDbG91ZEFycm93RG93biwKICAgICAgZmFDbG91ZERvd25sb2FkLAogICAgICBmYUNsb3VkRG93bmxvYWRBbHQsCiAgICAgIGZhVHJ1Y2tSYW1wQm94LAogICAgICBmYVRydWNrTG9hZGluZywKICAgICAgZmFBbmdsZURvd24sCiAgICAgIGZhUGx1Z0NpcmNsZUNoZWNrLAogICAgICBmYVdpbmRvd01heGltaXplOiBmYVdpbmRvd01heGltaXplMiwKICAgICAgZmFIYW5kc0hvbGRpbmdDaXJjbGUsCiAgICAgIGZhTG9jYXRpb25QaW4sCiAgICAgIGZhTWFwTWFya2VyLAogICAgICBmYUJvd2xpbmdCYWxsLAogICAgICBmYUNhcnRGbGF0YmVkLAogICAgICBmYURvbGx5RmxhdGJlZCwKICAgICAgZmFIb3VzZVVzZXIsCiAgICAgIGZhSG9tZVVzZXIsCiAgICAgIGZhR2hvc3QsCiAgICAgIGZhQ29tbWVudE5vZGVzLAogICAgICBmYVBlcnNvbkFycm93RG93blRvTGluZSwKICAgICAgZmFQbHVnQ2lyY2xlUGx1cywKICAgICAgZmFQZXJzb25Td2ltbWluZywKICAgICAgZmFTd2ltbWVyLAogICAgICBmYUNvbW1lbnREb3RzOiBmYUNvbW1lbnREb3RzMiwKICAgICAgZmFDb21tZW50aW5nOiBmYUNvbW1lbnRpbmcyLAogICAgICBmYUNoYXJ0UGllLAogICAgICBmYVBpZUNoYXJ0LAogICAgICBmYUZyb2csCiAgICAgIGZhV2luZUJvdHRsZSwKICAgICAgZmFJbmJveCwKICAgICAgZmFTcXVhcmVILAogICAgICBmYUhTcXVhcmUsCiAgICAgIGZhSG91c2VNZWRpY2FsLAogICAgICBmYUNpcmNsZUNoZXZyb25SaWdodCwKICAgICAgZmFDaGV2cm9uQ2lyY2xlUmlnaHQsCiAgICAgIGZhRmlsZUNzdiwKICAgICAgZmFIYXRDb3dib3ksCiAgICAgIGZhRmFjZUdyaW5Ub25ndWVXaW5rOiBmYUZhY2VHcmluVG9uZ3VlV2luazIsCiAgICAgIGZhR3JpblRvbmd1ZVdpbms6IGZhR3JpblRvbmd1ZVdpbmsyLAogICAgICBmYUwsCiAgICAgIGZhQXJyb3dEb3duU2hvcnRXaWRlLAogICAgICBmYVNvcnRBbW91bnREZXNjLAogICAgICBmYVNvcnRBbW91bnREb3duQWx0LAogICAgICBmYUhvdXJnbGFzc0hhbGY6IGZhSG91cmdsYXNzSGFsZjIsCiAgICAgIGZhSG91cmdsYXNzMjogZmFIb3VyZ2xhc3MyMiwKICAgICAgZmFTcG9vbiwKICAgICAgZmFVdGVuc2lsU3Bvb24sCiAgICAgIGZhQ3JlZGl0Q2FyZDogZmFDcmVkaXRDYXJkMiwKICAgICAgZmFDcmVkaXRDYXJkQWx0OiBmYUNyZWRpdENhcmRBbHQyLAogICAgICBmYUZpbGVJbnZvaWNlRG9sbGFyLAogICAgICBmYVNwYWdoZXR0aU1vbnN0ZXJGbHlpbmcsCiAgICAgIGZhUGFzdGFmYXJpYW5pc20sCiAgICAgIGZhTWFydGluaUdsYXNzQ2l0cnVzLAogICAgICBmYUNvY2t0YWlsLAogICAgICBmYUJ1bGxob3JuLAogICAgICBmYUJveFRpc3N1ZSwKICAgICAgZmFNYXR0cmVzc1BpbGxvdywKICAgICAgZmFDaGV2cm9uTGVmdCwKICAgICAgZmFDbG91ZE1vb25SYWluLAogICAgICBmYUFycm93RG93bjE5LAogICAgICBmYVNvcnROdW1lcmljQXNjLAogICAgICBmYVNvcnROdW1lcmljRG93biwKICAgICAgZmFIYW5kU3BvY2s6IGZhSGFuZFNwb2NrMiwKICAgICAgZmFXYW5kTWFnaWNTcGFya2xlcywKICAgICAgZmFNYWdpY1dhbmRTcGFya2xlcywKICAgICAgZmFDb21tZW50TWVkaWNhbCwKICAgICAgZmFCZWxsU2xhc2g6IGZhQmVsbFNsYXNoMiwKICAgICAgZmFIYW5kc2hha2VTbGFzaCwKICAgICAgZmFIYW5kc2hha2VBbHRTbGFzaCwKICAgICAgZmFIYW5kc2hha2VTaW1wbGVTbGFzaCwKICAgICAgZmFCb3R0bGVXYXRlciwKICAgICAgZmFEaWNlRDIwLAogICAgICBmYUFycm93RG93blpBLAogICAgICBmYVNvcnRBbHBoYURlc2MsCiAgICAgIGZhU29ydEFscGhhRG93bkFsdCwKICAgICAgZmFCcnVzaCwKICAgICAgZmFQZXJzb25XYWxraW5nRGFzaGVkTGluZUFycm93UmlnaHQsCiAgICAgIGZhQXJyb3dVcFNob3J0V2lkZSwKICAgICAgZmFTb3J0QW1vdW50VXBBbHQsCiAgICAgIGZhR3JpcFZlcnRpY2FsLAogICAgICBmYUdyaWRWZXJ0aWNhbCwKICAgICAgZmFDYXJUdW5uZWwsCiAgICAgIGZhQ2hhcnRDb2x1bW4sCiAgICAgIGZhVHJ1Y2tBcnJvd1JpZ2h0LAogICAgICBmYVR2LAogICAgICBmYVRlbGV2aXNpb24sCiAgICAgIGZhVHZBbHQsCiAgICAgIGZhU2VjdGlvbiwKICAgICAgZmFQZWFjZSwKICAgICAgZmFTdGFyOiBmYVN0YXIyLAogICAgICBmYUZsYWc6IGZhRmxhZzIsCiAgICAgIGZhVHJpYW5nbGVFeGNsYW1hdGlvbiwKICAgICAgZmFFeGNsYW1hdGlvblRyaWFuZ2xlLAogICAgICBmYVdhcm5pbmcsCiAgICAgIGZhU2Nob29sQ2lyY2xlRXhjbGFtYXRpb24sCiAgICAgIGZhR3JhZHVhdGlvbkNhcCwKICAgICAgZmFNb3J0YXJCb2FyZCwKICAgICAgZmFTdG9yZSwKICAgICAgZmFVc2VyQXN0cm9uYXV0LAogICAgICBmYUJ1aWxkaW5nRmxhZywKICAgICAgZmFNdWdTYXVjZXIsCiAgICAgIGZhQ29mZmVlLAogICAgICBmYUxlbW9uOiBmYUxlbW9uMiwKICAgICAgZmFDYXJhdmFuLAogICAgICBmYVEsCiAgICAgIGZhTG9jaywKICAgICAgZmFQYWludFJvbGxlciwKICAgICAgZmFWb2x1bWVIaWdoLAogICAgICBmYVZvbHVtZVVwLAogICAgICBmYUZvbGRlclBsdXMsCiAgICAgIGZhTWVyY3VyeSwKICAgICAgZmFBbmNob3IsCiAgICAgIGZhU3F1YXJlUGFya2luZywKICAgICAgZmFQYXJraW5nLAogICAgICBmYUhhbnVraWFoLAogICAgICBmYVJvdGF0ZUxlZnQsCiAgICAgIGZhUm90YXRlQmFjaywKICAgICAgZmFSb3RhdGVCYWNrd2FyZCwKICAgICAgZmFVbmRvQWx0LAogICAgICBmYUhlYWRpbmcsCiAgICAgIGZhSGVhZGVyLAogICAgICBmYUNyb3NzaGFpcnMsCiAgICAgIGZhQ2lyY2xlTm9kZXMsCiAgICAgIGZhV2luZG93UmVzdG9yZTogZmFXaW5kb3dSZXN0b3JlMiwKICAgICAgZmFSLAogICAgICBmYUZpbHRlckNpcmNsZVhtYXJrLAogICAgICBmYUdvcHVyYW0sCiAgICAgIGZhSGVhcnRDaXJjbGVNaW51cywKICAgICAgZmFTdGFyT2ZMaWZlLAogICAgICBmYUJ1c2luZXNzVGltZSwKICAgICAgZmFCcmllZmNhc2VDbG9jaywKICAgICAgZmFGaXJlRXh0aW5ndWlzaGVyLAogICAgICBmYUFycm93RG93bkxvbmcsCiAgICAgIGZhTG9uZ0Fycm93RG93biwKICAgICAgZmFVc2VyTWludXMsCiAgICAgIGZhTW9uZXlDaGVjaywKICAgICAgZmFIb3VzZUxhcHRvcCwKICAgICAgZmFMYXB0b3BIb3VzZSwKICAgICAgZmFEb3dubG9hZCwKICAgICAgZmFDb3VjaCwKICAgICAgZmFSb2FkTG9jaywKICAgICAgZmFTY2lzc29ycywKICAgICAgZmFDdXQsCiAgICAgIGZhQnVnLAogICAgICBmYUFycm93UmlnaHRGcm9tQnJhY2tldCwKICAgICAgZmFTaWduT3V0LAogICAgICBmYUhhbmRIb2xkaW5nSGFuZCwKICAgICAgZmFTdHJvb3B3YWZlbCwKICAgICAgZmFDaGlsZCwKICAgICAgZmFJY2VDcmVhbSwKICAgICAgZmFDb21wdXRlck1vdXNlLAogICAgICBmYU1vdXNlLAogICAgICBmYUZhdWNldCwKICAgICAgZmFBd2FyZCwKICAgICAgZmFQZXJzb25Ecm93bmluZywKICAgICAgZmFDYW1lcmFSb3RhdGUsCiAgICAgIGZhRmFjZUdyaW5IZWFydHM6IGZhRmFjZUdyaW5IZWFydHMyLAogICAgICBmYUdyaW5IZWFydHM6IGZhR3JpbkhlYXJ0czIsCiAgICAgIGZhRmlsZUZyYWdtZW50LAogICAgICBmYVBlcnNvbk1pbGl0YXJ5UmlmbGUsCiAgICAgIGZhVG9nZ2xlT24sCiAgICAgIGZhTHVuZ3NWaXJ1cywKICAgICAgZmFUYWJsZVRlbm5pc1BhZGRsZUJhbGwsCiAgICAgIGZhUGluZ1BvbmdQYWRkbGVCYWxsLAogICAgICBmYVRhYmxlVGVubmlzLAogICAgICBmYUJveGVzUGFja2luZywKICAgICAgZmFQZXJzb25DaGFsa2JvYXJkLAogICAgICBmYURpY2VUd28sCiAgICAgIGZhQXJyb3dSaWdodEFycm93TGVmdCwKICAgICAgZmFFeGNoYW5nZSwKICAgICAgZmFGb290YmFsbCwKICAgICAgZmFGb290YmFsbEJhbGwsCiAgICAgIGZhVHJ1Y2tNb25zdGVyLAogICAgICBmYUFzdGVyaXNrLAogICAgICBmYUJhdHRlcnlGdWxsLAogICAgICBmYUJhdHRlcnksCiAgICAgIGZhQmF0dGVyeTUsCiAgICAgIGZhQ2hpbGREcmVzcywKICAgICAgZmFGYWNlS2lzc0JlYW06IGZhRmFjZUtpc3NCZWFtMiwKICAgICAgZmFLaXNzQmVhbTogZmFLaXNzQmVhbTIsCiAgICAgIGZhVHJhc2hDYW5BcnJvd1VwLAogICAgICBmYVRyYXNoUmVzdG9yZUFsdCwKICAgICAgZmFGb250LAogICAgICBmYUJvcmVIb2xlLAogICAgICBmYVZpcnVzQ292aWQsCiAgICAgIGZhRmlsZVBkZjogZmFGaWxlUGRmMiwKICAgICAgZmFMYW5ndWFnZSwKICAgICAgZmFTaGllbGRIYWx2ZWQsCiAgICAgIGZhU2hpZWxkQWx0LAogICAgICBmYUNhcmV0VXAsCiAgICAgIGZhRmlsZVBlbiwKICAgICAgZmFGaWxlRWRpdCwKICAgICAgZmFQZXJzb25CaWtpbmcsCiAgICAgIGZhQmlraW5nLAogICAgICBmYUJvb2tPcGVuUmVhZGVyLAogICAgICBmYUJvb2tSZWFkZXIsCiAgICAgIGZhR2xhc3NXYXRlckRyb3BsZXQsCiAgICAgIGZhVG93ZXJCcm9hZGNhc3QsCiAgICAgIGZhQnJvYWRjYXN0VG93ZXIsCiAgICAgIGZhTWluaW1pemUsCiAgICAgIGZhQ29tcHJlc3NBcnJvd3NBbHQsCiAgICAgIGZhQXJyb3dSaWdodFRvQ2l0eSwKICAgICAgZmFMYXB0b3BNZWRpY2FsLAogICAgICBmYUJyZWFkU2xpY2UsCiAgICAgIGZhR2xvYmUsCiAgICAgIGZhRm9sZGVyTWludXMsCiAgICAgIGZhTWFza0ZhY2UsCiAgICAgIGZhQm9uZywKICAgICAgZmFSb2FkQnJpZGdlLAogICAgICBmYUFycm93VXA5MSwKICAgICAgZmFTb3J0TnVtZXJpY1VwQWx0LAogICAgICBmYU1vdW50YWluQ2l0eSwKICAgICAgZmFBcnJvd0Rvd245MSwKICAgICAgZmFTb3J0TnVtZXJpY0Rlc2MsCiAgICAgIGZhU29ydE51bWVyaWNEb3duQWx0LAogICAgICBmYUZhY2VHcmluV2lkZTogZmFGYWNlR3JpbldpZGUyLAogICAgICBmYUdyaW5BbHQ6IGZhR3JpbkFsdDIsCiAgICAgIGZhUG9vcCwKICAgICAgZmFEaGFybWFjaGFrcmEsCiAgICAgIGZhQmF0dGVyeVF1YXJ0ZXIsCiAgICAgIGZhQmF0dGVyeTIsCiAgICAgIGZhQW5raCwKICAgICAgZmFEaWFtb25kLAogICAgICBmYVN1YnNjcmlwdCwKICAgICAgZmFSdXBlZVNpZ24sCiAgICAgIGZhUnVwZWUsCiAgICAgIGZhUGVyc29uUmlmbGUsCiAgICAgIGZhRCwKICAgICAgZmFTcXVhcmVOZmksCiAgICAgIGZhVGVldGgsCiAgICAgIGZhTWFnbmlmeWluZ0dsYXNzRG9sbGFyLAogICAgICBmYVNlYXJjaERvbGxhciwKICAgICAgZmFEdW1wc3RlckZpcmUsCiAgICAgIGZhVXBsb2FkLAogICAgICBmYVVzZXJTbGFzaCwKICAgICAgZmFVc2VyQWx0U2xhc2gsCiAgICAgIGZhVXNlckxhcmdlU2xhc2gsCiAgICAgIGZhQXJyb3dMZWZ0LAogICAgICBmYVZpYWxWaXJ1cywKICAgICAgZmFDaGVja0RvdWJsZSwKICAgICAgZmFQYXcsCiAgICAgIGZhSGVsbWV0U2FmZXR5LAogICAgICBmYUhhcmRIYXQsCiAgICAgIGZhSGF0SGFyZCwKICAgICAgZmFFLAogICAgICBmYUZhY2VMYXVnaFNxdWludDogZmFGYWNlTGF1Z2hTcXVpbnQyLAogICAgICBmYUxhdWdoU3F1aW50OiBmYUxhdWdoU3F1aW50MiwKICAgICAgZmFEb3duTGVmdEFuZFVwUmlnaHRUb0NlbnRlciwKICAgICAgZmFDb21wcmVzc0FsdCwKICAgICAgZmFHaWZ0cywKICAgICAgZmFCZWQsCiAgICAgIGZhTW9uZXlCaWxsVHJhbnNmZXIsCiAgICAgIGZhUGVyc29uUnVubmluZywKICAgICAgZmFSdW5uaW5nLAogICAgICBmYUNpcmNsZUNoZXZyb25Eb3duLAogICAgICBmYUNoZXZyb25DaXJjbGVEb3duLAogICAgICBmYVVzZXJOdXJzZSwKICAgICAgZmFGYWNlS2lzc1dpbmtIZWFydDogZmFGYWNlS2lzc1dpbmtIZWFydDIsCiAgICAgIGZhS2lzc1dpbmtIZWFydDogZmFLaXNzV2lua0hlYXJ0MiwKICAgICAgZmFGaWxsLAogICAgICBmYU1vbmV5QmlsbDFXYXZlLAogICAgICBmYU1vbmV5QmlsbFdhdmVBbHQsCiAgICAgIGZhTGFuZG1hcmssCiAgICAgIGZhTXVzaWMsCiAgICAgIGZhQm9va01lZGljYWwsCiAgICAgIGZhU2h1ZmZsZSwKICAgICAgZmFSYW5kb20sCiAgICAgIGZhVW5kZXJsaW5lLAogICAgICBmYUJ1aWxkaW5nVXNlciwKICAgICAgZmFSb2JvdCwKICAgICAgZmFQbHVzLAogICAgICBmYUFkZCwKICAgICAgZmFDb3B5OiBmYUNvcHkyLAogICAgICBmYUNoZXNzS2luZzogZmFDaGVzc0tpbmcyLAogICAgICBmYUhvdXNlRmxvb2RXYXRlciwKICAgICAgZmFCaXRjb2luU2lnbiwKICAgICAgZmFCb3gsCiAgICAgIGZhU3F1YXJlUGx1czogZmFTcXVhcmVQbHVzMiwKICAgICAgZmFQbHVzU3F1YXJlOiBmYVBsdXNTcXVhcmUyLAogICAgICBmYUFycm93c0xlZnRSaWdodCwKICAgICAgZmFBcnJvd3NILAogICAgICBmYUZhbiwKICAgICAgZmFDcm93LAogICAgICBmYUZpbGVDaXJjbGVDaGVjaywKICAgICAgZmFMaW5rU2xhc2gsCiAgICAgIGZhQ2hhaW5Ccm9rZW4sCiAgICAgIGZhQ2hhaW5TbGFzaCwKICAgICAgZmFVbmxpbmssCiAgICAgIGZhQXJyb3dSb3RhdGVSaWdodCwKICAgICAgZmFBcnJvd1JpZ2h0Um90YXRlLAogICAgICBmYUFycm93Um90YXRlRm9yd2FyZCwKICAgICAgZmFSZWRvLAogICAgICBmYVBlbkNsaXAsCiAgICAgIGZhUGVuQWx0LAogICAgICBmYURvb3JDbG9zZWQsCiAgICAgIGZhQXJyb3dEb3duV2lkZVNob3J0LAogICAgICBmYVNvcnRBbW91bnRBc2MsCiAgICAgIGZhU29ydEFtb3VudERvd24sCiAgICAgIGZhQ2FyZXREb3duLAogICAgICBmYUssCiAgICAgIGZhQ2hlY2tUb1Nsb3QsCiAgICAgIGZhVm90ZVllYSwKICAgICAgZmFGaXNoRmlucywKICAgICAgZmFDb21wcmVzcywKICAgICAgZmFBcnJvd1VwQVosCiAgICAgIGZhU29ydEFscGhhVXAsCiAgICAgIGZhVXNlckdyYWR1YXRlLAogICAgICBmYUZpbGVDb2RlOiBmYUZpbGVDb2RlMiwKICAgICAgZmFTb2FwLAogICAgICBmYVJlY3ljbGUsCiAgICAgIGZhRmFjZUdyaW5XaW5rOiBmYUZhY2VHcmluV2luazIsCiAgICAgIGZhR3Jpbldpbms6IGZhR3JpbldpbmsyLAogICAgICBmYVdhdGVyTGFkZGVyLAogICAgICBmYUxhZGRlcldhdGVyLAogICAgICBmYVN3aW1taW5nUG9vbCwKICAgICAgZmFUb3dlckNlbGwsCiAgICAgIGZhQ29sb25TaWduLAogICAgICBmYUxhcHRvcEZpbGUsCiAgICAgIGZhQmFoYWksCiAgICAgIGZhSGF5a2FsLAogICAgICBmYU1vbmV5QmlsbDE6IGZhTW9uZXlCaWxsMTIsCiAgICAgIGZhTW9uZXlCaWxsQWx0OiBmYU1vbmV5QmlsbEFsdDIsCiAgICAgIGZhQ2xvdWRCb2x0LAogICAgICBmYVRodW5kZXJzdG9ybSwKICAgICAgZmFFdGhlcm5ldCwKICAgICAgZmFIcnl2bmlhU2lnbiwKICAgICAgZmFIcnl2bmlhLAogICAgICBmYUV5ZVNsYXNoOiBmYUV5ZVNsYXNoMiwKICAgICAgZmFDYXJ0RmxhdGJlZFN1aXRjYXNlLAogICAgICBmYUx1Z2dhZ2VDYXJ0LAogICAgICBmYVJhZGlhdGlvbiwKICAgICAgZmFGaWxlV29yZDogZmFGaWxlV29yZDIsCiAgICAgIGZhQmVkUHVsc2UsCiAgICAgIGZhUHJvY2VkdXJlcywKICAgICAgZmFUZW50cywKICAgICAgZmFNdWdIb3QsCiAgICAgIGZhQm9sdCwKICAgICAgZmFaYXAsCiAgICAgIGZhSmFyLAogICAgICBmYVRydWNrUGxhbmUsCiAgICAgIGZhSGFuZEhvbGRpbmdIZWFydCwKICAgICAgZmFBcnJvd1JvdGF0ZUxlZnQsCiAgICAgIGZhQXJyb3dMZWZ0Um90YXRlLAogICAgICBmYUFycm93Um90YXRlQmFjaywKICAgICAgZmFBcnJvd1JvdGF0ZUJhY2t3YXJkLAogICAgICBmYVVuZG8sCiAgICAgIGZhRmFjZUFuZ3J5OiBmYUZhY2VBbmdyeTIsCiAgICAgIGZhQW5ncnk6IGZhQW5ncnkyLAogICAgICBmYUJ1cnN0LAogICAgICBmYVosCiAgICAgIGZhQmFuZGFnZSwKICAgICAgZmFCYW5kQWlkLAogICAgICBmYVBsYW5lQ2lyY2xlRXhjbGFtYXRpb24sCiAgICAgIGZhQnVzU2lkZSwKICAgICAgZmFCdWdzLAogICAgICBmYUJlZXJNdWdFbXB0eSwKICAgICAgZmFCZWVyLAogICAgICBmYVBlcnNvbkNpcmNsZUNoZWNrLAogICAgICBmYVN0YXBsZXIsCiAgICAgIGZhSG91c2VNZWRpY2FsQ2lyY2xlQ2hlY2ssCiAgICAgIGZhTmFpcmFTaWduLAogICAgICBmYVdpZmksCiAgICAgIGZhV2lmaTMsCiAgICAgIGZhV2lmaVN0cm9uZywKICAgICAgZmFNb25leUNoZWNrRG9sbGFyLAogICAgICBmYU1vbmV5Q2hlY2tBbHQsCiAgICAgIGZhRXllTG93VmlzaW9uLAogICAgICBmYUxvd1Zpc2lvbiwKICAgICAgZmFDaXJjbGVBcnJvd1VwLAogICAgICBmYUFycm93Q2lyY2xlVXAsCiAgICAgIGZhQ2FtZXJhUmV0cm8sCiAgICAgIGZhQ2Fwc3VsZXMsCiAgICAgIGZhUG9vLAogICAgICBmYUVsZXZhdG9yLAogICAgICBmYVRhZywKICAgICAgZmFGaWxlQ2lyY2xlTWludXMsCiAgICAgIGZhRG93bkxvbmcsCiAgICAgIGZhTG9uZ0Fycm93QWx0RG93biwKICAgICAgZmFDb21wYWN0RGlzYywKICAgICAgZmFTdWl0Y2FzZVJvbGxpbmcsCiAgICAgIGZhQm9va1F1cmFuLAogICAgICBmYVF1cmFuLAogICAgICBmYVBob25lU2xhc2gsCiAgICAgIGZhUm9hZENpcmNsZUNoZWNrLAogICAgICBmYVNob3BMb2NrLAogICAgICBmYUltYWdlUG9ydHJhaXQsCiAgICAgIGZhUG9ydHJhaXQsCiAgICAgIGZhQnJpZGdlTG9jaywKICAgICAgZmFIYW1tZXIsCiAgICAgIGZhQXJyb3dVcDE5LAogICAgICBmYVNvcnROdW1lcmljVXAsCiAgICAgIGZhQ2hlc3NLbmlnaHQ6IGZhQ2hlc3NLbmlnaHQyLAogICAgICBmYUhvdXNlRmxvb2RXYXRlckNpcmNsZUFycm93UmlnaHQsCiAgICAgIGZhQXJyb3dVcFJpZ2h0RnJvbVNxdWFyZSwKICAgICAgZmFFeHRlcm5hbExpbmssCiAgICAgIGZhQXJyb3dEb3duVXBBY3Jvc3NMaW5lLAogICAgICBmYUZhY2VHcmluQmVhbTogZmFGYWNlR3JpbkJlYW0yLAogICAgICBmYUdyaW5CZWFtOiBmYUdyaW5CZWFtMiwKICAgICAgZmFSZWN0YW5nbGVBZCwKICAgICAgZmFBZCwKICAgICAgZmFCb29rVGFuYWtoLAogICAgICBmYVRhbmFraCwKICAgICAgZmFIb3RUdWJQZXJzb24sCiAgICAgIGZhSG90VHViLAogICAgICBmYUZpbGVIYWxmRGFzaGVkLAogICAgICBmYU91dGRlbnQsCiAgICAgIGZhRGVkZW50LAogICAgICBmYUhhbmRQZWFjZTogZmFIYW5kUGVhY2UyLAogICAgICBmYUhlYWRTaWRlVmlydXMsCiAgICAgIGZhQ29tcGFzczogZmFDb21wYXNzMiwKICAgICAgZmFQZW5OaWIsCiAgICAgIGZhVGVudEFycm93c0Rvd24sCiAgICAgIGZhRm9yd2FyZEZhc3QsCiAgICAgIGZhRmFzdEZvcndhcmQsCiAgICAgIGZhQ3JvcCwKICAgICAgZmFXaGlza2V5R2xhc3MsCiAgICAgIGZhR2xhc3NXaGlza2V5LAogICAgICBmYVNxdWFyZTogZmFTcXVhcmUyLAogICAgICBmYUZhY2VHcmluOiBmYUZhY2VHcmluMiwKICAgICAgZmFHcmluOiBmYUdyaW4yLAogICAgICBmYUZpbGVDb250cmFjdCwKICAgICAgZmFBbmdsZVVwLAogICAgICBmYUZhY2VTbWlsZTogZmFGYWNlU21pbGUyLAogICAgICBmYVNtaWxlOiBmYVNtaWxlMiwKICAgICAgZmFQZXJzb25EcmVzc0J1cnN0LAogICAgICBmYURpdmlkZSwKICAgICAgZmFDb2RlRm9yaywKICAgICAgZmFIb3VzZUZsYWcsCiAgICAgIGZhQnVpbGRpbmdDb2x1bW5zLAogICAgICBmYUJhbmssCiAgICAgIGZhSW5zdGl0dXRpb24sCiAgICAgIGZhTXVzZXVtLAogICAgICBmYVVuaXZlcnNpdHksCiAgICAgIGZhUnVnLAogICAgICBmYUNvZGVNZXJnZSwKICAgICAgZmFIb3VzZVRzdW5hbWksCiAgICAgIGZhTWFnbmlmeWluZ0dsYXNzQ2hhcnQsCiAgICAgIGZhVW1icmVsbGEsCiAgICAgIGZhSGlsbFJvY2tzbGlkZSwKICAgICAgZmFVc2VyU2VjcmV0LAogICAgICBmYVBhZ2VyLAogICAgICBmYUJyaWVmY2FzZSwKICAgICAgZmFUcm93ZWxCcmlja3MsCiAgICAgIGZhU29ja3MsCiAgICAgIGZhVCwKICAgICAgZmFNaWNyb2NoaXAsCiAgICAgIGZhVHJ1Y2tNZWRpY2FsLAogICAgICBmYUFtYnVsYW5jZSwKICAgICAgZmFPbSwKICAgICAgZmFNb3NxdWl0b05ldCwKICAgICAgZmFQcmVzY3JpcHRpb25Cb3R0bGUsCiAgICAgIGZhVXNlcnNHZWFyLAogICAgICBmYVVzZXJzQ29nLAogICAgICBmYVJvYWRDaXJjbGVFeGNsYW1hdGlvbiwKICAgICAgZmFQYXVzZSwKICAgICAgZmFTdGFmZlNuYWtlLAogICAgICBmYVJvZEFzY2xlcGl1cywKICAgICAgZmFSb2RTbmFrZSwKICAgICAgZmFTdGFmZkFlc2N1bGFwaXVzLAogICAgICBmYVBpZ2d5QmFuaywKICAgICAgZmFNb251bWVudCwKICAgICAgZmFBbmdsZXNSaWdodCwKICAgICAgZmFBbmdsZURvdWJsZVJpZ2h0LAogICAgICBmYURlc2t0b3AsCiAgICAgIGZhRGVza3RvcEFsdCwKICAgICAgZmFQbGFuZUNpcmNsZVhtYXJrLAogICAgICBmYVJldHdlZXQsCiAgICAgIGZhVXNlckdlYXIsCiAgICAgIGZhVXNlckNvZywKICAgICAgZmFCb3JkZXJBbGwsCiAgICAgIGZhQ29pbnMsCiAgICAgIGZhTWFyc1N0cm9rZSwKICAgICAgZmFIYW5kc2hha2VBbmdsZSwKICAgICAgZmFIYW5kc0hlbHBpbmcsCiAgICAgIGZhQXJyb3dEb3duLAogICAgICBmYUxvY2F0aW9uRG90LAogICAgICBmYU1hcE1hcmtlckFsdCwKICAgICAgZmFQbHVnQ2lyY2xlRXhjbGFtYXRpb24sCiAgICAgIGZhQ29va2llQml0ZSwKICAgICAgZmFTY3Jld2RyaXZlcldyZW5jaCwKICAgICAgZmFUb29scywKICAgICAgZmFJbmRlbnQsCiAgICAgIGZhQmFycywKICAgICAgZmFOYXZpY29uLAogICAgICBmYUhhbmRzUHJheWluZywKICAgICAgZmFQcmF5aW5nSGFuZHMsCiAgICAgIGZhVmlydXNlcywKICAgICAgZmFTY2hvb2xGbGFnLAogICAgICBmYVRyYWRlbWFyaywKICAgICAgZmFGaXJlQnVybmVyLAogICAgICBmYUZhY2VTbWlsZUJlYW06IGZhRmFjZVNtaWxlQmVhbTIsCiAgICAgIGZhU21pbGVCZWFtOiBmYVNtaWxlQmVhbTIsCiAgICAgIGZhVGVudEFycm93TGVmdFJpZ2h0LAogICAgICBmYVJvdXRlLAogICAgICBmYUFuZ2xlc1VwLAogICAgICBmYUFuZ2xlRG91YmxlVXAsCiAgICAgIGZhQnVja2V0LAogICAgICBmYUxlc3NUaGFuRXF1YWwsCiAgICAgIGZhRm9sZGVyQ2xvc2VkOiBmYUZvbGRlckNsb3NlZDIsCiAgICAgIGZhUGVyc29uVGhyb3VnaFdpbmRvdywKICAgICAgZmFTY2hvb2xMb2NrLAogICAgICBmYVBlcnNvbkJ1cnN0LAogICAgICBmYUxlZnRMb25nLAogICAgICBmYUxvbmdBcnJvd0FsdExlZnQsCiAgICAgIGZhTG9jYXRpb25Dcm9zc2hhaXJzLAogICAgICBmYUxvY2F0aW9uLAogICAgICBmYVBlcnNvbkRvdHNGcm9tTGluZSwKICAgICAgZmFEaWFnbm9zZXMsCiAgICAgIGZhR2F1Z2VTaW1wbGVIaWdoLAogICAgICBmYVRhY2hvbWV0ZXIsCiAgICAgIGZhVGFjaG9tZXRlckZhc3QsCiAgICAgIGZhQW5nbGVzTGVmdCwKICAgICAgZmFBbmdsZURvdWJsZUxlZnQsCiAgICAgIGZhVXBEb3duLAogICAgICBmYUFycm93c0FsdFYsCiAgICAgIGZhQmF0dGVyeUVtcHR5LAogICAgICBmYUJhdHRlcnkwLAogICAgICBmYUtleWJvYXJkOiBmYUtleWJvYXJkMiwKICAgICAgZmFDb29raWUsCiAgICAgIGZhU3RvcHdhdGNoLAogICAgICBmYUVqZWN0LAogICAgICBmYVNhdGVsbGl0ZURpc2gsCiAgICAgIGZhRmFjZVJvbGxpbmdFeWVzOiBmYUZhY2VSb2xsaW5nRXllczIsCiAgICAgIGZhTWVoUm9sbGluZ0V5ZXM6IGZhTWVoUm9sbGluZ0V5ZXMyLAogICAgICBmYUxpc3RDaGVjaywKICAgICAgZmFUYXNrcywKICAgICAgZmFTYWNrWG1hcmssCiAgICAgIGZhSGFzaHRhZywKICAgICAgZmFUcmFpbiwKICAgICAgZmFHYW1lcGFkLAogICAgICBmYUZpbGVFeHBvcnQsCiAgICAgIGZhQXJyb3dSaWdodEZyb21GaWxlLAogICAgICBmYUZhY2VHcmltYWNlOiBmYUZhY2VHcmltYWNlMiwKICAgICAgZmFHcmltYWNlOiBmYUdyaW1hY2UyLAogICAgICBmYVRyYWluU3Vid2F5LAogICAgICBmYVN1YndheSwKICAgICAgZmFDaXJjbGVEb3Q6IGZhQ2lyY2xlRG90MiwKICAgICAgZmFEb3RDaXJjbGU6IGZhRG90Q2lyY2xlMiwKICAgICAgZmFPYmplY3RHcm91cDogZmFPYmplY3RHcm91cDIsCiAgICAgIGZhU2hpcCwKICAgICAgZmFDLAogICAgICBmYVNxdWFyZVBob25lLAogICAgICBmYVBob25lU3F1YXJlLAogICAgICBmYVJ1bGVyQ29tYmluZWQsCiAgICAgIGZhQXJyb3dzUm90YXRlLAogICAgICBmYVJlZnJlc2gsCiAgICAgIGZhU3luYywKICAgICAgZmFQZXJzb25EcmVzcywKICAgICAgZmFGZW1hbGUsCiAgICAgIGZhQm9va09wZW4sCiAgICAgIGZhRm9sZGVyVHJlZSwKICAgICAgZmFCb3hBcmNoaXZlLAogICAgICBmYUFyY2hpdmUsCiAgICAgIGZhVGVudEFycm93RG93blRvTGluZSwKICAgICAgZmFRcmNvZGUsCiAgICAgIGZhRHJhZ29uLAogICAgICBmYUhvdXJnbGFzc0VuZCwKICAgICAgZmFIb3VyZ2xhc3MzOiBmYUhvdXJnbGFzczMyLAogICAgICBmYUdyaXAsCiAgICAgIGZhR3JpZEhvcml6b250YWwsCiAgICAgIGZhR3JpcEhvcml6b250YWwsCiAgICAgIGZhQm9yZGVyVG9wTGVmdCwKICAgICAgZmFCb3JkZXJTdHlsZSwKICAgICAgZmFMaXN0VWwsCiAgICAgIGZhTGlzdERvdHMsCiAgICAgIGZhUGVvcGxlUm9iYmVyeSwKICAgICAgZmFNb2JpbGVCdXR0b24sCiAgICAgIGZhQXJyb3dEb3duQVosCiAgICAgIGZhU29ydEFscGhhQXNjLAogICAgICBmYVNvcnRBbHBoYURvd24sCiAgICAgIGZhTW9uZXlCaWxsLAogICAgICBmYUNpcmNsZU1pbnVzLAogICAgICBmYU1pbnVzQ2lyY2xlLAogICAgICBmYUFycm93UG9pbnRlciwKICAgICAgZmFNb3VzZVBvaW50ZXIsCiAgICAgIGZhU3F1YXJlU2hhcmVOb2RlcywKICAgICAgZmFTaGFyZUFsdFNxdWFyZSwKICAgICAgZmFUYWJsZUNlbGxzTGFyZ2UsCiAgICAgIGZhVGhMYXJnZSwKICAgICAgZmFDYXQsCiAgICAgIGZhQ2FsZW5kYXJXZWVrLAogICAgICBmYUNvZGVDb21wYXJlLAogICAgICBmYVJvYWRDaXJjbGVYbWFyaywKICAgICAgZmFQYWxsZXQsCiAgICAgIGZhQ2FrZUNhbmRsZXMsCiAgICAgIGZhQmlydGhkYXlDYWtlLAogICAgICBmYUNha2UsCiAgICAgIGZhQnVnU2xhc2gsCiAgICAgIGZhVGFycCwKICAgICAgZmFEaWFncmFtUHJlZGVjZXNzb3IsCiAgICAgIGZhRmFjZUZsdXNoZWQ6IGZhRmFjZUZsdXNoZWQyLAogICAgICBmYUZsdXNoZWQ6IGZhRmx1c2hlZDIsCiAgICAgIGZhRGlhZ3JhbU5leHQsCiAgICAgIGZhQW5jaG9yQ2lyY2xlWG1hcmssCiAgICAgIGZhUGVyc29uQ2lyY2xlWG1hcmssCiAgICAgIGZhU3BhLAogICAgICBmYUJhcnNQcm9ncmVzcywKICAgICAgZmFUYXNrc0FsdCwKICAgICAgZmFIZWFydENpcmNsZUNoZWNrLAogICAgICBmYU1hcnNTdHJva2VSaWdodCwKICAgICAgZmFNYXJzU3Ryb2tlSCwKICAgICAgZmFUb3dlck9ic2VydmF0aW9uLAogICAgICBmYVN0ZXJsaW5nU2lnbiwKICAgICAgZmFHYnAsCiAgICAgIGZhUG91bmRTaWduLAogICAgICBmYUZhdWNldERyaXAsCiAgICAgIGZhQ2lyY2xlSW5mbywKICAgICAgZmFJbmZvQ2lyY2xlLAogICAgICBmYUZlYXRoZXIsCiAgICAgIGZhQm93bFJpY2UsCiAgICAgIGZhU3RhckhhbGZTdHJva2U6IGZhU3RhckhhbGZTdHJva2UyLAogICAgICBmYVN0YXJIYWxmQWx0OiBmYVN0YXJIYWxmQWx0MiwKICAgICAgZmFUZW1wZXJhdHVyZUFycm93RG93biwKICAgICAgZmFUZW1wZXJhdHVyZURvd24sCiAgICAgIGZhTWFza1ZlbnRpbGF0b3IsCiAgICAgIGZhRmlsZVZpZGVvOiBmYUZpbGVWaWRlbzIsCiAgICAgIGZhQXJyb3dUcmVuZERvd24sCiAgICAgIGZhT2lsQ2FuLAogICAgICBmYVBlb3BsZUNhcnJ5Qm94LAogICAgICBmYVBlb3BsZUNhcnJ5LAogICAgICBmYUNoYWlyLAogICAgICBmYVdpbmQsCiAgICAgIGZhTGF5ZXJHcm91cCwKICAgICAgZmFIZWFkU2lkZU1hc2ssCiAgICAgIGZhSGFuZHMsCiAgICAgIGZhU2lnbkxhbmd1YWdlLAogICAgICBmYVNpZ25pbmcsCiAgICAgIGZhVGFibGV0cywKICAgICAgZmFXZWlnaHRIYW5naW5nLAogICAgICBmYURpY2UsCiAgICAgIGZhU2hvcFNsYXNoLAogICAgICBmYVN0b3JlQWx0U2xhc2gsCiAgICAgIGZhU29ydERvd24sCiAgICAgIGZhU29ydERlc2MsCiAgICAgIGZhUGVzZXRhU2lnbiwKICAgICAgZmFUYWJsZXRTY3JlZW5CdXR0b24sCiAgICAgIGZhVGFibGV0QWx0LAogICAgICBmYUhhbmRIb2xkaW5nRG9sbGFyLAogICAgICBmYUhhbmRIb2xkaW5nVXNkLAogICAgICBmYVNoaWVsZCwKICAgICAgZmFTaGllbGRCbGFuaywKICAgICAgZmFGYWNlTGF1Z2g6IGZhRmFjZUxhdWdoMiwKICAgICAgZmFMYXVnaDogZmFMYXVnaDIsCiAgICAgIGZhSGFuZHNIb2xkaW5nLAogICAgICBmYUNhcnRTaG9wcGluZywKICAgICAgZmFTaG9wcGluZ0NhcnQsCiAgICAgIGZhT2N0YWdvbiwKICAgICAgZmFIYW5kUG9pbnRlcjogZmFIYW5kUG9pbnRlcjIsCiAgICAgIGZhUmVnaXN0ZXJlZDogZmFSZWdpc3RlcmVkMiwKICAgICAgZmFIb3VzZVNpZ25hbCwKICAgICAgZmFCYW5nbGFkZXNoaVRha2FTaWduCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTYzLjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2Nqcy9sdWNpZGUuanMKdmFyIHJlcXVpcmVfbHVjaWRlID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NjMuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvY2pzL2x1Y2lkZS5qcyIoZXhwb3J0cykgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGRlZmF1bHRBdHRyaWJ1dGVzID0gewogICAgICB4bWxuczogImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwKICAgICAgd2lkdGg6IDI0LAogICAgICBoZWlnaHQ6IDI0LAogICAgICB2aWV3Qm94OiAiMCAwIDI0IDI0IiwKICAgICAgZmlsbDogIm5vbmUiLAogICAgICBzdHJva2U6ICJjdXJyZW50Q29sb3IiLAogICAgICAic3Ryb2tlLXdpZHRoIjogMiwKICAgICAgInN0cm9rZS1saW5lY2FwIjogInJvdW5kIiwKICAgICAgInN0cm9rZS1saW5lam9pbiI6ICJyb3VuZCIKICAgIH07CiAgICB2YXIgY3JlYXRlU1ZHRWxlbWVudCA9IChbdGFnLCBhdHRycywgY2hpbGRyZW4yXSkgPT4gewogICAgICBjb25zdCBlbGVtZW50NCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCB0YWcpOwogICAgICBPYmplY3Qua2V5cyhhdHRycykuZm9yRWFjaCgobmFtZSkgPT4gewogICAgICAgIGVsZW1lbnQ0LnNldEF0dHJpYnV0ZShuYW1lLCBTdHJpbmcoYXR0cnNbbmFtZV0pKTsKICAgICAgfSk7CiAgICAgIGlmIChjaGlsZHJlbjI/Lmxlbmd0aCkgewogICAgICAgIGNoaWxkcmVuMi5mb3JFYWNoKChjaGlsZCkgPT4gewogICAgICAgICAgY29uc3QgY2hpbGRFbGVtZW50ID0gY3JlYXRlU1ZHRWxlbWVudChjaGlsZCk7CiAgICAgICAgICBlbGVtZW50NC5hcHBlbmRDaGlsZChjaGlsZEVsZW1lbnQpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBlbGVtZW50NDsKICAgIH07CiAgICB2YXIgY3JlYXRlRWxlbWVudDMgPSAoaWNvbk5vZGUsIGN1c3RvbUF0dHJzID0ge30pID0+IHsKICAgICAgY29uc3QgdGFnID0gInN2ZyI7CiAgICAgIGNvbnN0IGF0dHJzID0gewogICAgICAgIC4uLmRlZmF1bHRBdHRyaWJ1dGVzLAogICAgICAgIC4uLmN1c3RvbUF0dHJzCiAgICAgIH07CiAgICAgIHJldHVybiBjcmVhdGVTVkdFbGVtZW50KFt0YWcsIGF0dHJzLCBpY29uTm9kZV0pOwogICAgfTsKICAgIHZhciBoYXNBMTF5UHJvcCA9IChwcm9wcykgPT4gewogICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICBpZiAocHJvcC5zdGFydHNXaXRoKCJhcmlhLSIpIHx8IHByb3AgPT09ICJyb2xlIiB8fCBwcm9wID09PSAidGl0bGUiKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKICAgIHZhciBtZXJnZUNsYXNzZXMgPSAoLi4uY2xhc3NlcykgPT4gY2xhc3Nlcy5maWx0ZXIoKGNsYXNzTmFtZSwgaW5kZXgyLCBhcnJheSkgPT4gewogICAgICByZXR1cm4gQm9vbGVhbihjbGFzc05hbWUpICYmIGNsYXNzTmFtZS50cmltKCkgIT09ICIiICYmIGFycmF5LmluZGV4T2YoY2xhc3NOYW1lKSA9PT0gaW5kZXgyOwogICAgfSkuam9pbigiICIpLnRyaW0oKTsKICAgIHZhciB0b0NhbWVsQ2FzZSA9IChzdHJpbmczKSA9PiBzdHJpbmczLnJlcGxhY2UoCiAgICAgIC9eKFtBLVpdKXxbXHMtX10rKFx3KS9nLAogICAgICAobWF0Y2gyLCBwMSwgcDIyKSA9PiBwMjIgPyBwMjIudG9VcHBlckNhc2UoKSA6IHAxLnRvTG93ZXJDYXNlKCkKICAgICk7CiAgICB2YXIgdG9QYXNjYWxDYXNlID0gKHN0cmluZzMpID0+IHsKICAgICAgY29uc3QgY2FtZWxDYXNlID0gdG9DYW1lbENhc2Uoc3RyaW5nMyk7CiAgICAgIHJldHVybiBjYW1lbENhc2UuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBjYW1lbENhc2Uuc2xpY2UoMSk7CiAgICB9OwogICAgdmFyIGdldEF0dHJzID0gKGVsZW1lbnQ0KSA9PiBBcnJheS5mcm9tKGVsZW1lbnQ0LmF0dHJpYnV0ZXMpLnJlZHVjZSgoYXR0cnMsIGF0dHIpID0+IHsKICAgICAgYXR0cnNbYXR0ci5uYW1lXSA9IGF0dHIudmFsdWU7CiAgICAgIHJldHVybiBhdHRyczsKICAgIH0sIHt9KTsKICAgIHZhciBnZXRDbGFzc05hbWVzID0gKGF0dHJzKSA9PiB7CiAgICAgIGlmICh0eXBlb2YgYXR0cnMgPT09ICJzdHJpbmciKSByZXR1cm4gYXR0cnM7CiAgICAgIGlmICghYXR0cnMgfHwgIWF0dHJzLmNsYXNzKSByZXR1cm4gIiI7CiAgICAgIGlmIChhdHRycy5jbGFzcyAmJiB0eXBlb2YgYXR0cnMuY2xhc3MgPT09ICJzdHJpbmciKSB7CiAgICAgICAgcmV0dXJuIGF0dHJzLmNsYXNzLnNwbGl0KCIgIik7CiAgICAgIH0KICAgICAgaWYgKGF0dHJzLmNsYXNzICYmIEFycmF5LmlzQXJyYXkoYXR0cnMuY2xhc3MpKSB7CiAgICAgICAgcmV0dXJuIGF0dHJzLmNsYXNzOwogICAgICB9CiAgICAgIHJldHVybiAiIjsKICAgIH07CiAgICB2YXIgcmVwbGFjZUVsZW1lbnQgPSAoZWxlbWVudDQsIHsgbmFtZUF0dHIsIGljb25zOiBpY29uczYsIGF0dHJzIH0pID0+IHsKICAgICAgY29uc3QgaWNvbk5hbWUgPSBlbGVtZW50NC5nZXRBdHRyaWJ1dGUobmFtZUF0dHIpOwogICAgICBpZiAoaWNvbk5hbWUgPT0gbnVsbCkgcmV0dXJuOwogICAgICBjb25zdCBDb21wb25lbnROYW1lID0gdG9QYXNjYWxDYXNlKGljb25OYW1lKTsKICAgICAgY29uc3QgaWNvbk5vZGUgPSBpY29uczZbQ29tcG9uZW50TmFtZV07CiAgICAgIGlmICghaWNvbk5vZGUpIHsKICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKAogICAgICAgICAgYCR7ZWxlbWVudDQub3V0ZXJIVE1MfSBpY29uIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgcHJvdmlkZWQgaWNvbnMgb2JqZWN0LmAKICAgICAgICApOwogICAgICB9CiAgICAgIGNvbnN0IGVsZW1lbnRBdHRycyA9IGdldEF0dHJzKGVsZW1lbnQ0KTsKICAgICAgY29uc3QgYXJpYVByb3BzID0gaGFzQTExeVByb3AoZWxlbWVudEF0dHJzKSA/IHt9IDogeyAiYXJpYS1oaWRkZW4iOiAidHJ1ZSIgfTsKICAgICAgY29uc3QgaWNvbkF0dHJzID0gewogICAgICAgIC4uLmRlZmF1bHRBdHRyaWJ1dGVzLAogICAgICAgICJkYXRhLWx1Y2lkZSI6IGljb25OYW1lLAogICAgICAgIC4uLmFyaWFQcm9wcywKICAgICAgICAuLi5hdHRycywKICAgICAgICAuLi5lbGVtZW50QXR0cnMKICAgICAgfTsKICAgICAgY29uc3QgZWxlbWVudENsYXNzTmFtZXMgPSBnZXRDbGFzc05hbWVzKGVsZW1lbnRBdHRycyk7CiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGdldENsYXNzTmFtZXMoYXR0cnMpOwogICAgICBjb25zdCBjbGFzc05hbWVzID0gbWVyZ2VDbGFzc2VzKAogICAgICAgICJsdWNpZGUiLAogICAgICAgIGBsdWNpZGUtJHtpY29uTmFtZX1gLAogICAgICAgIC4uLmVsZW1lbnRDbGFzc05hbWVzLAogICAgICAgIC4uLmNsYXNzTmFtZQogICAgICApOwogICAgICBpZiAoY2xhc3NOYW1lcykgewogICAgICAgIE9iamVjdC5hc3NpZ24oaWNvbkF0dHJzLCB7CiAgICAgICAgICBjbGFzczogY2xhc3NOYW1lcwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGNvbnN0IHN2Z0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50MyhpY29uTm9kZSwgaWNvbkF0dHJzKTsKICAgICAgcmV0dXJuIGVsZW1lbnQ0LnBhcmVudE5vZGU/LnJlcGxhY2VDaGlsZChzdmdFbGVtZW50LCBlbGVtZW50NCk7CiAgICB9OwogICAgdmFyIEFBcnJvd0Rvd24gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAxMiA0IDQgNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE2VjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAxNiA0LjAzOS05LjY5YS41LjUgMCAwIDEgLjkyMyAwTDExIDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuMzA0IDEzaDYuMzkyIiB9XQogICAgXTsKICAgIHZhciBBQXJyb3dVcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDExIDQtNCA0IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTZWNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDE2IDQuMDM5LTkuNjlhLjUuNSAwIDAgMSAuOTIzIDBMMTEgMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy4zMDQgMTNoNi4zOTIiIH1dCiAgICBdOwogICAgdmFyIEFMYXJnZVNtYWxsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgMTYgMi41MzYtNy4zMjhhMS4wMiAxLjAyIDEgMCAxIDEuOTI4IDBMMjIgMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUuNjk3IDE0aDUuNjA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMTYgNC4wMzktOS42OWEuNS41IDAgMCAxIC45MjMgMEwxMSAxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zLjMwNCAxM2g2LjM5MiIgfV0KICAgIF07CiAgICB2YXIgQWN0aXZpdHkgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMiAxMmgtMi40OGEyIDIgMCAwIDAtMS45MyAxLjQ2bC0yLjM1IDguMzZhLjI1LjI1IDAgMCAxLS40OCAwTDkuMjQgMi4xOGEuMjUuMjUgMCAwIDAtLjQ4IDBsLTIuMzUgOC4zNkEyIDIgMCAwIDEgNC40OSAxMkgyIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBBY2Nlc3NpYmlsaXR5ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNiIsIGN5OiAiNCIsIHI6ICIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE4IDE5IDEtNy02IDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNSA4IDMtMyA1LjUgMy0yLjM2IDMuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00LjI0IDE0LjVhNSA1IDAgMCAwIDYuODggNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMy43NiAxNy41YTUgNSAwIDAgMC02Ljg4LTYiIH1dCiAgICBdOwogICAgdmFyIEFpclZlbnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxNy41YTIuNSAyLjUgMCAxIDEtNCAyLjAzVjEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTJINGEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmgxNmEyIDIgMCAwIDEgMiAydjVhMiAyIDAgMCAxLTIgMmgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDhoMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi42IDE1LjU3MkEyIDIgMCAxIDAgMTAgMTd2LTUiIH1dCiAgICBdOwogICAgdmFyIEFsYXJtQ2xvY2tDaGVjayA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEzIiwgcjogIjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAzIDIgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiA2LTMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjM4IDE4LjcgNCAyMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy42NCAxOC42NyAyMCAyMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDEzIDIgMiA0LTQiIH1dCiAgICBdOwogICAgdmFyIEFpcnBsYXkgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE3SDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnYxMGEyIDIgMCAwIDEtMiAyaC0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDE1IDUgNkg3WiIgfV0KICAgIF07CiAgICB2YXIgQWxhcm1DbG9ja01pbnVzID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTMiLCByOiAiOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDMgMiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDYtMy0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMzggMTguNyA0IDIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjY0IDE4LjY3IDIwIDIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTNoNiIgfV0KICAgIF07CiAgICB2YXIgQWxhcm1DbG9ja09mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuODcgNi44N2E4IDggMCAxIDAgMTEuMjYgMTEuMjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkuOSAxNC4yNWE4IDggMCAwIDAtOS4xNS05LjE1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDYtMy0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMjYgMTguNjcgNCAyMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA0IDIgNiIgfV0KICAgIF07CiAgICB2YXIgQWxhcm1DbG9ja1BsdXMgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMyIsIHI6ICI4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMyAyIDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgNi0zLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi4zOCAxOC43IDQgMjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuNjQgMTguNjcgMjAgMjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTB2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDEzaDYiIH1dCiAgICBdOwogICAgdmFyIEFsYXJtQ2xvY2sgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMyIsIHI6ICI4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDl2NGwyIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAzIDIgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiA2LTMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjM4IDE4LjcgNCAyMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy42NCAxOC42NyAyMCAyMSIgfV0KICAgIF07CiAgICB2YXIgQWxhcm1TbW9rZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDIxYzAtMi41IDItMi41IDItNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAyMWMwLTIuNSAyLTIuNSAyLTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkgOC0uOCAzYTEuMjUgMS4yNSAwIDAgMS0xLjIgMUg3YTEuMjUgMS4yNSAwIDAgMS0xLjItMUw1IDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgM2ExIDEgMCAwIDEgMSAxdjJhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJWNGExIDEgMCAwIDEgMS0xeiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDIxYzAtMi41IDItMi41IDItNSIgfV0KICAgIF07CiAgICB2YXIgQWxidW0gPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicG9seWxpbmUiLCB7IHBvaW50czogIjExIDMgMTEgMTEgMTQgOCAxNyAxMSAxNyAzIiB9XQogICAgXTsKICAgIHZhciBBbGlnbkNlbnRlckhvcml6b250YWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEyaDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE2djRhMiAyIDAgMCAxLTIgMkg2YTIgMiAwIDAgMS0yLTJ2LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOFY0YTIgMiAwIDAgMC0yLTJINmEyIDIgMCAwIDAtMiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTZ2MWEyIDIgMCAwIDEtMiAyaC0yYTIgMiAwIDAgMS0yLTJ2LTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgOFY3YzAtMS4xLjktMiAyLTJoMmEyIDIgMCAwIDEgMiAydjEiIH1dCiAgICBdOwogICAgdmFyIEFsaWduRW5kSG9yaXpvbnRhbCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjYiLCBoZWlnaHQ6ICIxNiIsIHg6ICI0IiwgeTogIjIiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNiIsIGhlaWdodDogIjkiLCB4OiAiMTQiLCB5OiAiOSIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAyMkgyIiB9XQogICAgXTsKICAgIHZhciBBbGlnbkNlbnRlclZlcnRpY2FsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnYyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEwSDRhMiAyIDAgMCAxLTItMlY2YzAtMS4xLjktMiAyLTJoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMGg0YTIgMiAwIDAgMCAyLTJWNmEyIDIgMCAwIDAtMi0yaC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjBIN2EyIDIgMCAwIDEtMi0ydi0yYzAtMS4xLjktMiAyLTJoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNGgxYTIgMiAwIDAgMSAyIDJ2MmEyIDIgMCAwIDEtMiAyaC0xIiB9XQogICAgXTsKICAgIHZhciBBbGlnbkVuZFZlcnRpY2FsID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTYiLCBoZWlnaHQ6ICI2IiwgeDogIjIiLCB5OiAiNCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI5IiwgaGVpZ2h0OiAiNiIsIHg6ICI5IiwgeTogIjE0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDIyVjIiIH1dCiAgICBdOwogICAgdmFyIEFsaWduSG9yaXpvbnRhbERpc3RyaWJ1dGVDZW50ZXIgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI2IiwgaGVpZ2h0OiAiMTQiLCB4OiAiNCIsIHk6ICI1Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjYiLCBoZWlnaHQ6ICIxMCIsIHg6ICIxNCIsIHk6ICI3Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDIydi01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDdWMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIydi0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNVYyIiB9XQogICAgXTsKICAgIHZhciBBbGlnbkhvcml6b250YWxEaXN0cmlidXRlRW5kID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNiIsIGhlaWdodDogIjE0IiwgeDogIjQiLCB5OiAiNSIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI2IiwgaGVpZ2h0OiAiMTAiLCB4OiAiMTQiLCB5OiAiNyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAydjIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDJ2MjAiIH1dCiAgICBdOwogICAgdmFyIEFsaWduSG9yaXpvbnRhbERpc3RyaWJ1dGVTdGFydCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjYiLCBoZWlnaHQ6ICIxNCIsIHg6ICI0IiwgeTogIjUiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNiIsIGhlaWdodDogIjEwIiwgeDogIjE0IiwgeTogIjciLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAydjIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2MjAiIH1dCiAgICBdOwogICAgdmFyIEFsaWduSG9yaXpvbnRhbEp1c3RpZnlDZW50ZXIgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI2IiwgaGVpZ2h0OiAiMTQiLCB4OiAiMiIsIHk6ICI1Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjYiLCBoZWlnaHQ6ICIxMCIsIHg6ICIxNiIsIHk6ICI3Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MjAiIH1dCiAgICBdOwogICAgdmFyIEFsaWduSG9yaXpvbnRhbEp1c3RpZnlFbmQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI2IiwgaGVpZ2h0OiAiMTQiLCB4OiAiMiIsIHk6ICI1Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjYiLCBoZWlnaHQ6ICIxMCIsIHg6ICIxMiIsIHk6ICI3Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDJ2MjAiIH1dCiAgICBdOwogICAgdmFyIEFsaWduSG9yaXpvbnRhbEp1c3RpZnlTdGFydCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjYiLCBoZWlnaHQ6ICIxNCIsIHg6ICI2IiwgeTogIjUiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNiIsIGhlaWdodDogIjEwIiwgeDogIjE2IiwgeTogIjciLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAydjIwIiB9XQogICAgXTsKICAgIHZhciBBbGlnbkhvcml6b250YWxTcGFjZUFyb3VuZCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjYiLCBoZWlnaHQ6ICIxMCIsIHg6ICI5IiwgeTogIjciLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAyMlYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDIyVjIiIH1dCiAgICBdOwogICAgdmFyIEFsaWduSG9yaXpvbnRhbFNwYWNlQmV0d2VlbiA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjYiLCBoZWlnaHQ6ICIxNCIsIHg6ICIzIiwgeTogIjUiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNiIsIGhlaWdodDogIjEwIiwgeDogIjE1IiwgeTogIjciLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAydjIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDJ2MjAiIH1dCiAgICBdOwogICAgdmFyIEFsaWduU3RhcnRIb3Jpem9udGFsID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNiIsIGhlaWdodDogIjE2IiwgeDogIjQiLCB5OiAiNiIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI2IiwgaGVpZ2h0OiAiOSIsIHg6ICIxNCIsIHk6ICI2Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDJIMiIgfV0KICAgIF07CiAgICB2YXIgQWxpZ25TdGFydFZlcnRpY2FsID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiOSIsIGhlaWdodDogIjYiLCB4OiAiNiIsIHk6ICIxNCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNiIsIGhlaWdodDogIjYiLCB4OiAiNiIsIHk6ICI0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMnYyMCIgfV0KICAgIF07CiAgICB2YXIgQWxpZ25WZXJ0aWNhbERpc3RyaWJ1dGVDZW50ZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxN2gtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiA3aC01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTdIMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDdIMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjUiLCB5OiAiMTQiLCB3aWR0aDogIjE0IiwgaGVpZ2h0OiAiNiIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjciLCB5OiAiNCIsIHdpZHRoOiAiMTAiLCBoZWlnaHQ6ICI2Iiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBBbGlnblZlcnRpY2FsRGlzdHJpYnV0ZUVuZCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE0IiwgaGVpZ2h0OiAiNiIsIHg6ICI1IiwgeTogIjE0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjEwIiwgaGVpZ2h0OiAiNiIsIHg6ICI3IiwgeTogIjQiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMGgyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEwaDIwIiB9XQogICAgXTsKICAgIHZhciBBbGlnblZlcnRpY2FsRGlzdHJpYnV0ZVN0YXJ0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTQiLCBoZWlnaHQ6ICI2IiwgeDogIjUiLCB5OiAiMTQiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTAiLCBoZWlnaHQ6ICI2IiwgeDogIjciLCB5OiAiNCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE0aDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgNGgyMCIgfV0KICAgIF07CiAgICB2YXIgQWxpZ25WZXJ0aWNhbEp1c3RpZnlDZW50ZXIgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNCIsIGhlaWdodDogIjYiLCB4OiAiNSIsIHk6ICIxNiIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxMCIsIGhlaWdodDogIjYiLCB4OiAiNyIsIHk6ICIyIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJoMjAiIH1dCiAgICBdOwogICAgdmFyIEFsaWduVmVydGljYWxKdXN0aWZ5RW5kID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTQiLCBoZWlnaHQ6ICI2IiwgeDogIjUiLCB5OiAiMTIiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTAiLCBoZWlnaHQ6ICI2IiwgeDogIjciLCB5OiAiMiIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIyaDIwIiB9XQogICAgXTsKICAgIHZhciBBbGlnblZlcnRpY2FsSnVzdGlmeVN0YXJ0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTQiLCBoZWlnaHQ6ICI2IiwgeDogIjUiLCB5OiAiMTYiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTAiLCBoZWlnaHQ6ICI2IiwgeDogIjciLCB5OiAiNiIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDJoMjAiIH1dCiAgICBdOwogICAgdmFyIEFsaWduVmVydGljYWxTcGFjZUFyb3VuZCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjEwIiwgaGVpZ2h0OiAiNiIsIHg6ICI3IiwgeTogIjkiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMjBIMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiA0SDIiIH1dCiAgICBdOwogICAgdmFyIEFsaWduVmVydGljYWxTcGFjZUJldHdlZW4gPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNCIsIGhlaWdodDogIjYiLCB4OiAiNSIsIHk6ICIxNSIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxMCIsIGhlaWdodDogIjYiLCB4OiAiNyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjFoMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAzaDIwIiB9XQogICAgXTsKICAgIHZhciBBbXBlcnNhbmQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMmgzIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE3LjUgMTJhOCA4IDAgMCAxLTggOEE0LjUgNC41IDAgMCAxIDUgMTUuNWMwLTYgOC00IDgtOC41YTMgMyAwIDEgMC02IDBjMCAzIDIuNSA4LjUgMTIgMTMiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEFtYnVsYW5jZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEwSDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMThWNmEyIDIgMCAwIDAtMi0ySDRhMiAyIDAgMCAwLTIgMnYxMWExIDEgMCAwIDAgMSAxaDIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTkgMThoMmExIDEgMCAwIDAgMS0xdi0zLjI4YTEgMSAwIDAgMC0uNjg0LS45NDhsLTEuOTIzLS42NDFhMSAxIDAgMCAxLS41NzgtLjUwMmwtMS41MzktMy4wNzZBMSAxIDAgMCAwIDE2LjM4MiA4SDE0IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggOHY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMThoNiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE3IiwgY3k6ICIxOCIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNyIsIGN5OiAiMTgiLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgQW1wZXJzYW5kcyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTAgMTdjLTUtMy03LTctNy05YTIgMiAwIDAgMSA0IDBjMCAyLjUtNSAyLjUtNSA2IDAgMS43IDEuMyAzIDMgMyAyLjggMCA1LTIuMiA1LTUiIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMjIgMTdjLTUtMy03LTctNy05YTIgMiAwIDAgMSA0IDBjMCAyLjUtNSAyLjUtNSA2IDAgMS43IDEuMyAzIDMgMyAyLjggMCA1LTIuMiA1LTUiIH0KICAgICAgXQogICAgXTsKICAgIHZhciBBbXBob3JhID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMnY1LjYzMmMwIC40MjQtLjI3Mi43OTUtLjY1My45ODJBNiA2IDAgMCAwIDYgMTRjLjAwNiA0IDMgNyA1IDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgNUg4YTIgMiAwIDAgMCAwIDRoLjY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NS42MzJjMCAuNDI0LjI3Mi43OTUuNjUyLjk4MkE2IDYgMCAwIDEgMTggMTRjMCA0LTMgNy01IDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgNWgyYTIgMiAwIDAgMSAwIDRoLS42OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAyMkg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMmg2IiB9XQogICAgXTsKICAgIHZhciBBbmNob3IgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2djE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5IDEzIDItMWE5IDkgMCAwIDEtMTggMGwyIDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMWg2IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjQiLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgQW5ncnkgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNnMtMS41LTItNC0yLTQgMi00IDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNy41IDggMTAgOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCA5IDIuNS0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTBoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEwaC4wMSIgfV0KICAgIF07CiAgICB2YXIgQW5ub3llZCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTVoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDloMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA5aDIiIH1dCiAgICBdOwogICAgdmFyIEFudGVubmEgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEyIDcgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03IDEyIDUtMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIgMTIgNS0xMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAxMiA1LTEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQuNSA3aDE1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE2djYiIH1dCiAgICBdOwogICAgdmFyIEFudmlsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMEg2YTQgNCAwIDAgMS00LTQgMSAxIDAgMCAxIDEtMWg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNWExIDEgMCAwIDEgMS0xaDEzYTEgMSAwIDAgMSAxIDEgNyA3IDAgMCAxLTcgN0g4YTEgMSAwIDAgMS0xLTF6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTJ2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxMnY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMjBhMyAzIDAgMCAxIDMtM2g4YTMgMyAwIDAgMSAzIDMgMSAxIDAgMCAxLTEgMUg2YTEgMSAwIDAgMS0xLTEiIH1dCiAgICBdOwogICAgdmFyIEFwZXJ0dXJlID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuMzEgOCA1Ljc0IDkuOTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS42OSA4aDExLjQ4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcuMzggMTIgNS43NC05Ljk0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuNjkgMTYgMy45NSA2LjA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0LjMxIDE2SDIuODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYuNjIgMTItNS43NCA5Ljk0IiB9XQogICAgXTsKICAgIHZhciBBcHBXaW5kb3dNYWMgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE2IiwgeDogIjIiLCB5OiAiNCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDhoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDhoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDhoLjAxIiB9XQogICAgXTsKICAgIHZhciBBcHBXaW5kb3cgPSBbCiAgICAgIFsicmVjdCIsIHsgeDogIjIiLCB5OiAiNCIsIHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxNiIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA0djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA4aDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgNHY0IiB9XQogICAgXTsKICAgIHZhciBBcHBsZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDYuNTI4VjNhMSAxIDAgMCAxIDEtMWgwIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE4LjIzNyAyMUExNSAxNSAwIDAgMCAyMiAxMWE2IDYgMCAwIDAtMTAtNC40NzJBNiA2IDAgMCAwIDIgMTFhMTUuMSAxNS4xIDAgMCAwIDMuNzYzIDEwIDMgMyAwIDAgMCAzLjY0OC42NDggNS41IDUuNSAwIDAgMSA1LjE3OCAwQTMgMyAwIDAgMCAxOC4yMzcgMjEiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEFyY2hpdmVSZXN0b3JlID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICI1IiwgeDogIjIiLCB5OiAiMyIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDh2MTFhMiAyIDAgMCAwIDIgMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDh2MTFhMiAyIDAgMCAxLTIgMmgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDE1IDMtMyAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJ2OSIgfV0KICAgIF07CiAgICB2YXIgQXJjaGl2ZVggPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjUiLCB4OiAiMiIsIHk6ICIzIiwgcng6ICIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgOHYxMWEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAyLTJWOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05LjUgMTcgNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkuNSAxMiA1IDUiIH1dCiAgICBdOwogICAgdmFyIEFyY2hpdmUgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjUiLCB4OiAiMiIsIHk6ICIzIiwgcng6ICIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgOHYxMWEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAyLTJWOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMmg0IiB9XQogICAgXTsKICAgIHZhciBBcm1jaGFpciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDlWNmEyIDIgMCAwIDAtMi0ySDdhMiAyIDAgMCAwLTIgMnYzIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMgMTZhMiAyIDAgMCAwIDIgMmgxNGEyIDIgMCAwIDAgMi0ydi01YTIgMiAwIDAgMC00IDB2MS41YS41LjUgMCAwIDEtLjUuNWgtOWEuNS41IDAgMCAxLS41LS41VjExYTIgMiAwIDAgMC00IDB6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTh2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxOHYyIiB9XQogICAgXTsKICAgIHZhciBBcnJvd0JpZ0Rvd25EYXNoID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTUgMTFhMSAxIDAgMCAwIDEgMWgyLjkzOWExIDEgMCAwIDEgLjc1IDEuODExbC02LjgzNSA2LjgzNmExLjIwNyAxLjIwNyAwIDAgMS0xLjcwNyAwTDQuMzEgMTMuODFhMSAxIDAgMCAxIC43NS0xLjgxMUg4YTEgMSAwIDAgMCAxLTFWOWExIDEgMCAwIDEgMS0xaDRhMSAxIDAgMCAxIDEgMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA0aDYiIH1dCiAgICBdOwogICAgdmFyIEFycm93QmlnRG93biA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE1IDExYTEgMSAwIDAgMCAxIDFoMi45MzlhMSAxIDAgMCAxIC43NSAxLjgxMWwtNi44MzUgNi44MzZhMS4yMDcgMS4yMDcgMCAwIDEtMS43MDcgMEw0LjMxIDEzLjgxYTEgMSAwIDAgMSAuNzUtMS44MTFIOGExIDEgMCAwIDAgMS0xVjVhMSAxIDAgMCAxIDEtMWg0YTEgMSAwIDAgMSAxIDF6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBBcnJvd0JpZ0xlZnREYXNoID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTMgOWExIDEgMCAwIDEtMS0xVjUuMDYxYTEgMSAwIDAgMC0xLjgxMS0uNzVsLTYuODM1IDYuODM2YTEuMjA3IDEuMjA3IDAgMCAwIDAgMS43MDdsNi44MzUgNi44MzVhMSAxIDAgMCAwIDEuODExLS43NVYxNmExIDEgMCAwIDEgMS0xaDJhMSAxIDAgMCAwIDEtMXYtNGExIDEgMCAwIDAtMS0xeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCA5djYiIH1dCiAgICBdOwogICAgdmFyIEFycm93QmlnTGVmdCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEzIDlhMSAxIDAgMCAxLTEtMVY1LjA2MWExIDEgMCAwIDAtMS44MTEtLjc1bC02LjgzNSA2LjgzNmExLjIwNyAxLjIwNyAwIDAgMCAwIDEuNzA3bDYuODM1IDYuODM1YTEgMSAwIDAgMCAxLjgxMS0uNzVWMTZhMSAxIDAgMCAxIDEtMWg2YTEgMSAwIDAgMCAxLTF2LTRhMSAxIDAgMCAwLTEtMXoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEFycm93QmlnUmlnaHREYXNoID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEgOWExIDEgMCAwIDAgMS0xVjUuMDYxYTEgMSAwIDAgMSAxLjgxMS0uNzVsNi44MzYgNi44MzZhMS4yMDcgMS4yMDcgMCAwIDEgMCAxLjcwN2wtNi44MzYgNi44MzVhMSAxIDAgMCAxLTEuODExLS43NVYxNmExIDEgMCAwIDAtMS0xSDlhMSAxIDAgMCAxLTEtMXYtNGExIDEgMCAwIDEgMS0xeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDl2NiIgfV0KICAgIF07CiAgICB2YXIgQXJyb3dCaWdSaWdodCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTExIDlhMSAxIDAgMCAwIDEtMVY1LjA2MWExIDEgMCAwIDEgMS44MTEtLjc1bDYuODM2IDYuODM2YTEuMjA3IDEuMjA3IDAgMCAxIDAgMS43MDdsLTYuODM2IDYuODM1YTEgMSAwIDAgMS0xLjgxMS0uNzVWMTZhMSAxIDAgMCAwLTEtMUg1YTEgMSAwIDAgMS0xLTF2LTRhMSAxIDAgMCAxIDEtMXoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEFycm93QmlnVXAgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk05IDEzYTEgMSAwIDAgMC0xLTFINS4wNjFhMSAxIDAgMCAxLS43NS0xLjgxMWw2LjgzNi02LjgzNWExLjIwNyAxLjIwNyAwIDAgMSAxLjcwNyAwbDYuODM1IDYuODM1YTEgMSAwIDAgMS0uNzUgMS44MTFIMTZhMSAxIDAgMCAwLTEgMXY2YTEgMSAwIDAgMS0xIDFoLTRhMSAxIDAgMCAxLTEtMXoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEFycm93QmlnVXBEYXNoID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOSAxM2ExIDEgMCAwIDAtMS0xSDUuMDYxYTEgMSAwIDAgMS0uNzUtMS44MTFsNi44MzYtNi44MzVhMS4yMDcgMS4yMDcgMCAwIDEgMS43MDcgMGw2LjgzNSA2LjgzNWExIDEgMCAwIDEtLjc1IDEuODExSDE2YTEgMSAwIDAgMC0xIDF2MmExIDEgMCAwIDEtMSAxaC00YTEgMSAwIDAgMS0xLTF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMjBoNiIgfV0KICAgIF07CiAgICB2YXIgQXJyb3dEb3duMDEgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDE2IDQgNCA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMFY0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMTUiLCB5OiAiNCIsIHdpZHRoOiAiNCIsIGhlaWdodDogIjYiLCByeTogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMjB2LTZoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMjBoNCIgfV0KICAgIF07CiAgICB2YXIgQXJyb3dEb3duMTAgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDE2IDQgNCA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMFY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDEwVjRoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTBoNCIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjE1IiwgeTogIjE0Iiwgd2lkdGg6ICI0IiwgaGVpZ2h0OiAiNiIsIHJ5OiAiMiIgfV0KICAgIF07CiAgICB2YXIgQXJyb3dEb3duQVogPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDE2IDQgNCA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMFY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDhoLTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTBWNi41YTIuNSAyLjUgMCAwIDEgNSAwVjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDE0aDVsLTUgNmg1IiB9XQogICAgXTsKICAgIHZhciBBcnJvd0Rvd25Gcm9tTGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDNINSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMVY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYgMTUgNiA2IDYtNiIgfV0KICAgIF07CiAgICB2YXIgQXJyb3dEb3duTGVmdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDcgNyAxNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxN0g3VjciIH1dCiAgICBdOwogICAgdmFyIEFycm93RG93bk5hcnJvd1dpZGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDE2IDQgNCA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMFY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDRoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSA4aDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTJoMTAiIH1dCiAgICBdOwogICAgdmFyIEFycm93RG93blJpZ2h0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtNyA3IDEwIDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDd2MTBINyIgfV0KICAgIF07CiAgICB2YXIgQXJyb3dEb3duVG9Eb3QgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5IDktNyA3LTctNyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIyMSIsIHI6ICIxIiB9XQogICAgXTsKICAgIHZhciBBcnJvd0Rvd25VcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgMTYgNCA0IDQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIwVjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgOC00LTQtNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDR2MTYiIH1dCiAgICBdOwogICAgdmFyIEFycm93RG93blRvTGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3VjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNiAxMSA2IDYgNi02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDIxSDUiIH1dCiAgICBdOwogICAgdmFyIEFycm93RG93bldpZGVOYXJyb3cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDE2IDQgNCA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMFY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDRoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgOGg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDEyaDQiIH1dCiAgICBdOwogICAgdmFyIEFycm93RG93blpBID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMyAxNiA0IDQgNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA0aDVsLTUgNmg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDIwdi0zLjVhMi41IDIuNSAwIDAgMSA1IDBWMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMThoLTUiIH1dCiAgICBdOwogICAgdmFyIEFycm93RG93biA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDV2MTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkgMTItNyA3LTctNyIgfV0KICAgIF07CiAgICB2YXIgQXJyb3dMZWZ0RnJvbUxpbmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDYtNiA2IDYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyaDE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE5VjUiIH1dCiAgICBdOwogICAgdmFyIEFycm93TGVmdFJpZ2h0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAzIDQgN2w0IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA3aDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDIxIDQtNC00LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTdINCIgfV0KICAgIF07CiAgICB2YXIgQXJyb3dMZWZ0VG9MaW5lID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxOVY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEzIDYtNiA2IDYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEyaDE0IiB9XQogICAgXTsKICAgIHZhciBBcnJvd0xlZnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMiAxOS03LTcgNy03IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDEySDUiIH1dCiAgICBdOwogICAgdmFyIEFycm93UmlnaHRGcm9tTGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgNXYxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMkg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDE4IDYtNi02LTYiIH1dCiAgICBdOwogICAgdmFyIEFycm93UmlnaHRMZWZ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMyA0IDQtNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDdINCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDIxLTQtNCA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxN2gxNiIgfV0KICAgIF07CiAgICB2YXIgQXJyb3dSaWdodFRvTGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDEySDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTEgMTggNi02LTYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA1djE0IiB9XQogICAgXTsKICAgIHZhciBBcnJvd1JpZ2h0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxMmgxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMiA1IDcgNy03IDciIH1dCiAgICBdOwogICAgdmFyIEFycm93VXAwMSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgOCA0LTQgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNHYxNiIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjE1IiwgeTogIjQiLCB3aWR0aDogIjQiLCBoZWlnaHQ6ICI2Iiwgcnk6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDIwdi02aC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDIwaDQiIH1dCiAgICBdOwogICAgdmFyIEFycm93VXAxMCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgOCA0LTQgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxMFY0aC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEwaDQiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIxNSIsIHk6ICIxNCIsIHdpZHRoOiAiNCIsIGhlaWdodDogIjYiLCByeTogIjIiIH1dCiAgICBdOwogICAgdmFyIEFycm93VXBBWiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgOCA0LTQgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCA4aC01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEwVjYuNWEyLjUgMi41IDAgMCAxIDUgMFYxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxNGg1bC01IDZoNSIgfV0KICAgIF07CiAgICB2YXIgQXJyb3dVcERvd24gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAxNi00IDQtNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDIwVjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMyA4IDQtNCA0IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyA0djE2IiB9XQogICAgXTsKICAgIHZhciBBcnJvd1VwRnJvbURvdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTUgOSA3LTcgNyA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE2VjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMjEiLCByOiAiMSIgfV0KICAgIF07CiAgICB2YXIgQXJyb3dVcEZyb21MaW5lID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggOS02LTYtNiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDN2MTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMWgxNCIgfV0KICAgIF07CiAgICB2YXIgQXJyb3dVcExlZnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE3VjdoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTcgNyA3IiB9XQogICAgXTsKICAgIHZhciBBcnJvd1VwTmFycm93V2lkZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgOCA0LTQgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxMmg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDE2aDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMjBoMTAiIH1dCiAgICBdOwogICAgdmFyIEFycm93VXBSaWdodCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgN2gxMHYxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE3IDE3IDciIH1dCiAgICBdOwogICAgdmFyIEFycm93VXBUb0xpbmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDNoMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMTMtNi02LTYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA3djE0IiB9XQogICAgXTsKICAgIHZhciBBcnJvd1VwV2lkZU5hcnJvdyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgOCA0LTQgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxMmgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxNmg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDIwaDQiIH1dCiAgICBdOwogICAgdmFyIEFycm93VXBaQSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgOCA0LTQgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA0aDVsLTUgNmg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDIwdi0zLjVhMi41IDIuNSAwIDAgMSA1IDBWMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMThoLTUiIH1dCiAgICBdOwogICAgdmFyIEFycm93VXAgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm01IDEyIDctNyA3IDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTlWNSIgfV0KICAgIF07CiAgICB2YXIgQXJyb3dzVXBGcm9tTGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTQgNiAzLTMgMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTdWMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCA2IDMtMyAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTdWMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDIxaDE2IiB9XQogICAgXTsKICAgIHZhciBBc3RlcmlzayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZ2MTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuMTk2IDkgNi44MDQgMTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNi44MDQgOSAxMC4zOTIgNiIgfV0KICAgIF07CiAgICB2YXIgQXRTaWduID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA4djVhMyAzIDAgMCAwIDYgMHYtMWExMCAxMCAwIDEgMC00IDgiIH1dCiAgICBdOwogICAgdmFyIEF0b20gPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwLjIgMjAuMmMyLjA0LTIuMDMuMDItNy4zNi00LjUtMTEuOS00LjU0LTQuNTItOS44Ny02LjU0LTExLjktNC41LTIuMDQgMi4wMy0uMDIgNy4zNiA0LjUgMTEuOSA0LjU0IDQuNTIgOS44NyA2LjU0IDExLjkgNC41WiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNS43IDE1LjdjNC41Mi00LjU0IDYuNTQtOS44NyA0LjUtMTEuOS0yLjAzLTIuMDQtNy4zNi0uMDItMTEuOSA0LjUtNC41MiA0LjU0LTYuNTQgOS44Ny00LjUgMTEuOSAyLjAzIDIuMDQgNy4zNi4wMiAxMS45LTQuNVoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEF1ZGlvTGluZXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEwdjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA2djExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDN2MTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgOHY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDV2MTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTB2MyIgfV0KICAgIF07CiAgICB2YXIgQXdhcmQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xNS40NzcgMTIuODkgMS41MTUgOC41MjZhLjUuNSAwIDAgMS0uODEuNDdsLTMuNTgtMi42ODdhMSAxIDAgMCAwLTEuMTk3IDBsLTMuNTg2IDIuNjg2YS41LjUgMCAwIDEtLjgxLS40NjlsMS41MTQtOC41MjYiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiOCIsIHI6ICI2IiB9XQogICAgXTsKICAgIHZhciBBdWRpb1dhdmVmb3JtID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMiAxM2EyIDIgMCAwIDAgMi0yVjdhMiAyIDAgMCAxIDQgMHYxM2EyIDIgMCAwIDAgNCAwVjRhMiAyIDAgMCAxIDQgMHYxM2EyIDIgMCAwIDAgNCAwdi00YTIgMiAwIDAgMSAyLTIiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEF4ZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDEyLTguMzgxIDguMzhhMSAxIDAgMCAxLTMuMDAxLTNMMTEgOSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNSAxNS41YS41LjUgMCAwIDAgLjUuNUE2LjUgNi41IDAgMCAwIDIyIDkuNWEuNS41IDAgMCAwLS41LS41aC0xLjY3MmEyIDIgMCAwIDEtMS40MTQtLjU4NmwtNS4wNjItNS4wNjJhMS4yMDUgMS4yMDUgMCAwIDAtMS43MDQgMEw5LjM1MiA1LjY0OGExLjIwNSAxLjIwNSAwIDAgMCAwIDEuNzA0bDUuMDYyIDUuMDYyQTIgMiAwIDAgMSAxNSAxMy44Mjh6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBBeGlzM2QgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMy41IDEwLjUgMTUgOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDR2MTVhMSAxIDAgMCAwIDEgMWgxNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00LjI5MyAxOS43MDcgNiAxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDE1IDEuNS0xLjUiIH1dCiAgICBdOwogICAgdmFyIEJhYnkgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxNmMuNS4zIDEuMi41IDIgLjVzMS41LS4yIDItLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTJoLjAxIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE5LjM4IDYuODEzQTkgOSAwIDAgMSAyMC44IDEwLjJhMiAyIDAgMCAxIDAgMy42IDkgOSAwIDAgMS0xNy42IDAgMiAyIDAgMCAxIDAtMy42QTkgOSAwIDAgMSAxMiAzYzIgMCAzLjUgMS4xIDMuNSAyLjVzLS45IDIuNS0yIDIuNWMtLjggMC0xLjUtLjQtMS41LTEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMmguMDEiIH1dCiAgICBdOwogICAgdmFyIEJhY2twYWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMGE0IDQgMCAwIDEgNC00aDhhNCA0IDAgMCAxIDQgNHYxMGEyIDIgMCAwIDEtMiAySDZhMiAyIDAgMCAxLTItMnoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMGg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMThoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIydi02YTIgMiAwIDAgMSAyLTJoNGEyIDIgMCAwIDEgMiAydjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA2VjRhMiAyIDAgMCAxIDItMmgyYTIgMiAwIDAgMSAyIDJ2MiIgfV0KICAgIF07CiAgICB2YXIgQmFkZ2VBbGVydCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMuODUgOC42MmE0IDQgMCAwIDEgNC43OC00Ljc3IDQgNCAwIDAgMSA2Ljc0IDAgNCA0IDAgMCAxIDQuNzggNC43OCA0IDQgMCAwIDEgMCA2Ljc0IDQgNCAwIDAgMS00Ljc3IDQuNzggNCA0IDAgMCAxLTYuNzUgMCA0IDQgMCAwIDEtNC43OC00Ljc3IDQgNCAwIDAgMSAwLTYuNzZaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEyIiwgeDI6ICIxMiIsIHkxOiAiOCIsIHkyOiAiMTIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyLjAxIiwgeTE6ICIxNiIsIHkyOiAiMTYiIH1dCiAgICBdOwogICAgdmFyIEJhZGdlQ2VudCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMuODUgOC42MmE0IDQgMCAwIDEgNC43OC00Ljc3IDQgNCAwIDAgMSA2Ljc0IDAgNCA0IDAgMCAxIDQuNzggNC43OCA0IDQgMCAwIDEgMCA2Ljc0IDQgNCAwIDAgMS00Ljc3IDQuNzggNCA0IDAgMCAxLTYuNzUgMCA0IDQgMCAwIDEtNC43OC00Ljc3IDQgNCAwIDAgMSAwLTYuNzZaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2MTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUuNCAxMGE0IDQgMCAxIDAgMCA0IiB9XQogICAgXTsKICAgIHZhciBCYWRnZUNoZWNrID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy44NSA4LjYyYTQgNCAwIDAgMSA0Ljc4LTQuNzcgNCA0IDAgMCAxIDYuNzQgMCA0IDQgMCAwIDEgNC43OCA0Ljc4IDQgNCAwIDAgMSAwIDYuNzQgNCA0IDAgMCAxLTQuNzcgNC43OCA0IDQgMCAwIDEtNi43NSAwIDQgNCAwIDAgMS00Ljc4LTQuNzcgNCA0IDAgMCAxIDAtNi43NloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxMiAyIDIgNC00IiB9XQogICAgXTsKICAgIHZhciBCYWRnZURvbGxhclNpZ24gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0zLjg1IDguNjJhNCA0IDAgMCAxIDQuNzgtNC43NyA0IDQgMCAwIDEgNi43NCAwIDQgNCAwIDAgMSA0Ljc4IDQuNzggNCA0IDAgMCAxIDAgNi43NCA0IDQgMCAwIDEtNC43NyA0Ljc4IDQgNCAwIDAgMS02Ljc1IDAgNCA0IDAgMCAxLTQuNzgtNC43NyA0IDQgMCAwIDEgMC02Ljc2WiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA4aC02YTIgMiAwIDEgMCAwIDRoNGEyIDIgMCAxIDEgMCA0SDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMThWNiIgfV0KICAgIF07CiAgICB2YXIgQmFkZ2VFdXJvID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy44NSA4LjYyYTQgNCAwIDAgMSA0Ljc4LTQuNzcgNCA0IDAgMCAxIDYuNzQgMCA0IDQgMCAwIDEgNC43OCA0Ljc4IDQgNCAwIDAgMSAwIDYuNzQgNCA0IDAgMCAxLTQuNzcgNC43OCA0IDQgMCAwIDEtNi43NSAwIDQgNCAwIDAgMS00Ljc4LTQuNzcgNCA0IDAgMCAxIDAtNi43NloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMmg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDkuNGE0IDQgMCAxIDAgMCA1LjIiIH1dCiAgICBdOwogICAgdmFyIEJhZGdlSW5kaWFuUnVwZWUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0zLjg1IDguNjJhNCA0IDAgMCAxIDQuNzgtNC43NyA0IDQgMCAwIDEgNi43NCAwIDQgNCAwIDAgMSA0Ljc4IDQuNzggNCA0IDAgMCAxIDAgNi43NCA0IDQgMCAwIDEtNC43NyA0Ljc4IDQgNCAwIDAgMS02Ljc1IDAgNCA0IDAgMCAxLTQuNzgtNC43NyA0IDQgMCAwIDEgMC02Ljc2WiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDhoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEyaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMgMTctNS0xaDFhNCA0IDAgMCAwIDAtOCIgfV0KICAgIF07CiAgICB2YXIgQmFkZ2VJbmZvID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy44NSA4LjYyYTQgNCAwIDAgMSA0Ljc4LTQuNzcgNCA0IDAgMCAxIDYuNzQgMCA0IDQgMCAwIDEgNC43OCA0Ljc4IDQgNCAwIDAgMSAwIDYuNzQgNCA0IDAgMCAxLTQuNzcgNC43OCA0IDQgMCAwIDEtNi43NSAwIDQgNCAwIDAgMS00Ljc4LTQuNzcgNCA0IDAgMCAxIDAtNi43NloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICIxNiIsIHkyOiAiMTIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyLjAxIiwgeTE6ICI4IiwgeTI6ICI4IiB9XQogICAgXTsKICAgIHZhciBCYWRnZUphcGFuZXNlWWVuID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy44NSA4LjYyYTQgNCAwIDAgMSA0Ljc4LTQuNzcgNCA0IDAgMCAxIDYuNzQgMCA0IDQgMCAwIDEgNC43OCA0Ljc4IDQgNCAwIDAgMSAwIDYuNzQgNCA0IDAgMCAxLTQuNzcgNC43OCA0IDQgMCAwIDEtNi43NSAwIDQgNCAwIDAgMS00Ljc4LTQuNzcgNCA0IDAgMCAxIDAtNi43NloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSA4IDMgM3Y3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDExIDMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDEyaDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNmg2IiB9XQogICAgXTsKICAgIHZhciBCYWRnZU1pbnVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy44NSA4LjYyYTQgNCAwIDAgMSA0Ljc4LTQuNzcgNCA0IDAgMCAxIDYuNzQgMCA0IDQgMCAwIDEgNC43OCA0Ljc4IDQgNCAwIDAgMSAwIDYuNzQgNCA0IDAgMCAxLTQuNzcgNC43OCA0IDQgMCAwIDEtNi43NSAwIDQgNCAwIDAgMS00Ljc4LTQuNzcgNCA0IDAgMCAxIDAtNi43NloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImxpbmUiLCB7IHgxOiAiOCIsIHgyOiAiMTYiLCB5MTogIjEyIiwgeTI6ICIxMiIgfV0KICAgIF07CiAgICB2YXIgQmFkZ2VQZXJjZW50ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy44NSA4LjYyYTQgNCAwIDAgMSA0Ljc4LTQuNzcgNCA0IDAgMCAxIDYuNzQgMCA0IDQgMCAwIDEgNC43OCA0Ljc4IDQgNCAwIDAgMSAwIDYuNzQgNCA0IDAgMCAxLTQuNzcgNC43OCA0IDQgMCAwIDEtNi43NSAwIDQgNCAwIDAgMS00Ljc4LTQuNzcgNCA0IDAgMCAxIDAtNi43NloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgOS02IDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA5aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxNWguMDEiIH1dCiAgICBdOwogICAgdmFyIEJhZGdlUGx1cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMuODUgOC42MmE0IDQgMCAwIDEgNC43OC00Ljc3IDQgNCAwIDAgMSA2Ljc0IDAgNCA0IDAgMCAxIDQuNzggNC43OCA0IDQgMCAwIDEgMCA2Ljc0IDQgNCAwIDAgMS00Ljc3IDQuNzggNCA0IDAgMCAxLTYuNzUgMCA0IDQgMCAwIDEtNC43OC00Ljc3IDQgNCAwIDAgMSAwLTYuNzZaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEyIiwgeDI6ICIxMiIsIHkxOiAiOCIsIHkyOiAiMTYiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiOCIsIHgyOiAiMTYiLCB5MTogIjEyIiwgeTI6ICIxMiIgfV0KICAgIF07CiAgICB2YXIgQmFkZ2VQb3VuZFN0ZXJsaW5nID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy44NSA4LjYyYTQgNCAwIDAgMSA0Ljc4LTQuNzcgNCA0IDAgMCAxIDYuNzQgMCA0IDQgMCAwIDEgNC43OCA0Ljc4IDQgNCAwIDAgMSAwIDYuNzQgNCA0IDAgMCAxLTQuNzcgNC43OCA0IDQgMCAwIDEtNi43NSAwIDQgNCAwIDAgMS00Ljc4LTQuNzcgNCA0IDAgMCAxIDAtNi43NloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE2VjkuNWEyLjUgMi41IDAgMCAxIDUgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE2aDciIH1dCiAgICBdOwogICAgdmFyIEJhZGdlUXVlc3Rpb25NYXJrID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy44NSA4LjYyYTQgNCAwIDAgMSA0Ljc4LTQuNzcgNCA0IDAgMCAxIDYuNzQgMCA0IDQgMCAwIDEgNC43OCA0Ljc4IDQgNCAwIDAgMSAwIDYuNzQgNCA0IDAgMCAxLTQuNzcgNC43OCA0IDQgMCAwIDEtNi43NSAwIDQgNCAwIDAgMS00Ljc4LTQuNzcgNCA0IDAgMCAxIDAtNi43NloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS4wOSA5YTMgMyAwIDAgMSA1LjgzIDFjMCAyLTMgMy0zIDMiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyLjAxIiwgeTE6ICIxNyIsIHkyOiAiMTciIH1dCiAgICBdOwogICAgdmFyIEJhZGdlUnVzc2lhblJ1YmxlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy44NSA4LjYyYTQgNCAwIDAgMSA0Ljc4LTQuNzcgNCA0IDAgMCAxIDYuNzQgMCA0IDQgMCAwIDEgNC43OCA0Ljc4IDQgNCAwIDAgMSAwIDYuNzQgNCA0IDAgMCAxLTQuNzcgNC43OCA0IDQgMCAwIDEtNi43NSAwIDQgNCAwIDAgMS00Ljc4LTQuNzcgNCA0IDAgMCAxIDAtNi43NloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNmg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTJoNWEyIDIgMCAxIDAgMC00aC0zdjkiIH1dCiAgICBdOwogICAgdmFyIEJhZGdlU3dpc3NGcmFuYyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMuODUgOC42MmE0IDQgMCAwIDEgNC43OC00Ljc3IDQgNCAwIDAgMSA2Ljc0IDAgNCA0IDAgMCAxIDQuNzggNC43OCA0IDQgMCAwIDEgMCA2Ljc0IDQgNCAwIDAgMS00Ljc3IDQuNzggNCA0IDAgMCAxLTYuNzUgMCA0IDQgMCAwIDEtNC43OC00Ljc3IDQgNCAwIDAgMSAwLTYuNzZaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDE3VjhoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxMmgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTZoNCIgfV0KICAgIF07CiAgICB2YXIgQmFkZ2VUdXJraXNoTGlyYSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDd2MTBhNSA1IDAgMCAwIDUtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA4LTYgMyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0zLjg1IDguNjJhNCA0IDAgMCAxIDQuNzgtNC43NyA0IDQgMCAwIDEgNi43NCAwIDQgNCAwIDAgMSA0Ljc4IDQuNzggNCA0IDAgMCAxIDAgNi43NCA0IDQgMCAwIDEtNC43NyA0Ljc4IDQgNCAwIDAgMS02Ljc1IDAgNCA0IDAgMCAxLTQuNzgtNC43NyA0IDQgMCAwIDEgMC02Ljc2IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBCYWRnZVggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0zLjg1IDguNjJhNCA0IDAgMCAxIDQuNzgtNC43NyA0IDQgMCAwIDEgNi43NCAwIDQgNCAwIDAgMSA0Ljc4IDQuNzggNCA0IDAgMCAxIDAgNi43NCA0IDQgMCAwIDEtNC43NyA0Ljc4IDQgNCAwIDAgMS02Ljc1IDAgNCA0IDAgMCAxLTQuNzgtNC43NyA0IDQgMCAwIDEgMC02Ljc2WiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNSIsIHgyOiAiOSIsIHkxOiAiOSIsIHkyOiAiMTUiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiOSIsIHgyOiAiMTUiLCB5MTogIjkiLCB5MjogIjE1IiB9XQogICAgXTsKICAgIHZhciBCYWRnZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMuODUgOC42MmE0IDQgMCAwIDEgNC43OC00Ljc3IDQgNCAwIDAgMSA2Ljc0IDAgNCA0IDAgMCAxIDQuNzggNC43OCA0IDQgMCAwIDEgMCA2Ljc0IDQgNCAwIDAgMS00Ljc3IDQuNzggNCA0IDAgMCAxLTYuNzUgMCA0IDQgMCAwIDEtNC43OC00Ljc3IDQgNCAwIDAgMSAwLTYuNzZaIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBCYWdnYWdlQ2xhaW0gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxOEg2YTIgMiAwIDAgMS0yLTJWN2EyIDIgMCAwIDAtMi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDE0VjRhMiAyIDAgMCAwLTItMmgtMWEyIDIgMCAwIDAtMiAydjEwIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjEzIiwgaGVpZ2h0OiAiOCIsIHg6ICI4IiwgeTogIjYiLCByeDogIjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiMjAiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjIwIiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIEJhbGxvb24gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNnYxYTIgMiAwIDAgMCAyIDJoMWEyIDIgMCAwIDEgMiAydjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNmEyIDIgMCAwIDEgMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDhjMCA0LTMuNSA4LTYgOHMtNi00LTYtOGE2IDYgMCAwIDEgMTIgMCIgfV0KICAgIF07CiAgICB2YXIgQmFuID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNC45MjkgNC45MjkgMTkuMDcgMTkuMDcxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XQogICAgXTsKICAgIHZhciBCYW5hbmEgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEzYzMuNS0yIDgtMiAxMCAyYTUuNSA1LjUgMCAwIDEgOCA1IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTUuMTUgMTcuODljNS41Mi0xLjUyIDguNjUtNi44OSA3LTEyQzExLjU1IDQgMTEuNSAyIDEzIDJjMy4yMiAwIDUgNS41IDUgOCAwIDYuNS00LjIgMTItMTAuNDkgMTJDNS4xMSAyMiAyIDIyIDIgMjBjMC0xLjUgMS4xNC0xLjU1IDMuMTUtMi4xMVoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEJhbmtub3RlQXJyb3dEb3duID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMThINGEyIDIgMCAwIDEtMi0yVjhhMiAyIDAgMCAxIDItMmgxNmEyIDIgMCAwIDEgMiAydjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTkgMyAzIDMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMTZ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEyaC4wMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIyIiB9XQogICAgXTsKICAgIHZhciBCYW5kYWdlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTAuMDFoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE0LjAxaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxMC4wMWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTQuMDFoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDZ2MTEuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDZ2MTIiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjYiLCB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTIiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIEJhbmtub3RlQXJyb3dVcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4SDRhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDEyaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAyMnYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiAxOS0zLTMtMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTJoLjAxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIEJhbmtub3RlWCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDE4SDRhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDE3IDUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgMTctNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTJoLjAxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIEJhbmtub3RlID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxMiIsIHg6ICIyIiwgeTogIjYiLCByeDogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEyaC4wMU0xOCAxMmguMDEiIH1dCiAgICBdOwogICAgdmFyIEJhcnJlbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDNhNDEgNDEgMCAwIDAgMCAxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAzYTQxIDQxIDAgMCAxIDAgMTgiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTcgM2EyIDIgMCAwIDEgMS42OC45MiAxNS4yNSAxNS4yNSAwIDAgMSAwIDE2LjE2QTIgMiAwIDAgMSAxNyAyMUg3YTIgMiAwIDAgMS0xLjY4LS45MiAxNS4yNSAxNS4yNSAwIDAgMSAwLTE2LjE2QTIgMiAwIDAgMSA3IDN6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuODQgMTdoMTYuMzIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy44NCA3aDE2LjMyIiB9XQogICAgXTsKICAgIHZhciBCYXJjb2RlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA1djE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggNXYxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA1djE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDV2MTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgNXYxNCIgfV0KICAgIF07CiAgICB2YXIgQmFzZWxpbmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDIwaDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYgMTYgNi0xMiA2IDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJoOCIgfV0KICAgIF07CiAgICB2YXIgQmF0aCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDQgOCA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDE5djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmgyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE5djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA1IDcuNjIxIDMuNjIxQTIuMTIxIDIuMTIxIDAgMCAwIDQgNXYxMmEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAyLTJ2LTUiIH1dCiAgICBdOwogICAgdmFyIEJhdHRlcnlGdWxsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTB2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxMHY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE0di00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTB2NCIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjIiLCB5OiAiNiIsIHdpZHRoOiAiMTYiLCBoZWlnaHQ6ICIxMiIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgQmF0dGVyeUxvdyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE0di00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTR2LTQiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjYiLCB3aWR0aDogIjE2IiwgaGVpZ2h0OiAiMTIiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIEJhdHRlcnlDaGFyZ2luZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTExIDctMyA1aDRsLTMgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNC44NTYgNkgxNmEyIDIgMCAwIDEgMiAydjhhMiAyIDAgMCAxLTIgMmgtMi45MzUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTR2LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNS4xNCAxOEg0YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDIuOTM2IiB9XQogICAgXTsKICAgIHZhciBCYXR0ZXJ5TWVkaXVtID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTR2LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTR2LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxNHYtNCIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjIiLCB5OiAiNiIsIHdpZHRoOiAiMTYiLCBoZWlnaHQ6ICIxMiIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgQmF0dGVyeVBsdXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA5djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIuNTQzIDZIMTZhMiAyIDAgMCAxIDIgMnY4YTIgMiAwIDAgMS0yIDJoLTMuNjA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE0di00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTJoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03LjYwNiAxOEg0YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDMuNjA2IiB9XQogICAgXTsKICAgIHZhciBCYXR0ZXJ5V2FybmluZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE3aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA3djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgNmgyYTIgMiAwIDAgMSAyIDJ2OGEyIDIgMCAwIDEtMiAyaC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE0di00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMThINGEyIDIgMCAwIDEtMi0yVjhhMiAyIDAgMCAxIDItMmgyIiB9XQogICAgXTsKICAgIHZhciBCYXR0ZXJ5ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNIDIyIDE0IEwgMjIgMTAiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjYiLCB3aWR0aDogIjE2IiwgaGVpZ2h0OiAiMTIiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIEJlYWtlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQuNSAzaDE1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgM3YxNmEyIDIgMCAwIDAgMiAyaDhhMiAyIDAgMCAwIDItMlYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTRoMTIiIH1dCiAgICBdOwogICAgdmFyIEJlYW5PZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDljLS42NC42NC0xLjUyMS45NTQtMi40MDIgMS4xNjVBNiA2IDAgMCAwIDggMjJhMTMuOTYgMTMuOTYgMCAwIDAgOS45LTQuMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC43NSA1LjA5M0E2IDYgMCAwIDEgMjIgOGMwIDIuNDExLS42MSA0LjY4LTEuNjgzIDYuNjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNS4zNDEgMTAuNjJhNCA0IDAgMCAwIDYuNDg3IDEuMjA4TTEwLjYyIDUuMzQxYTQuMDE1IDQuMDE1IDAgMCAxIDIuMDM5IDIuMDQiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMiIsIHgyOiAiMjIiLCB5MTogIjIiLCB5MjogIjIyIiB9XQogICAgXTsKICAgIHZhciBCZWFuID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTAuMTY1IDYuNTk4QzkuOTU0IDcuNDc4IDkuNjQgOC4zNiA5IDljLS42NC42NC0xLjUyMS45NTQtMi40MDIgMS4xNjVBNiA2IDAgMCAwIDggMjJjNy43MzIgMCAxNC02LjI2OCAxNC0xNGE2IDYgMCAwIDAtMTEuODM1LTEuNDAyWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01LjM0MSAxMC42MmE0IDQgMCAxIDAgNS4yNzktNS4yOCIgfV0KICAgIF07CiAgICB2YXIgQmVkRG91YmxlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMHYtOGEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ2OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEwVjZhMiAyIDAgMCAxIDItMmgxMmEyIDIgMCAwIDEgMiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNHY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMThoMjAiIH1dCiAgICBdOwogICAgdmFyIEJlZFNpbmdsZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMjB2LThhMiAyIDAgMCAxIDItMmgxNGEyIDIgMCAwIDEgMiAydjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxMFY2YTIgMiAwIDAgMSAyLTJoMTBhMiAyIDAgMCAxIDIgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMThoMTgiIH1dCiAgICBdOwogICAgdmFyIEJlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDhoMThhMiAyIDAgMCAxIDIgMnYxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE3aDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgOHY5IiB9XQogICAgXTsKICAgIHZhciBCZWVmID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTYuNCAxMy43QTYuNSA2LjUgMCAxIDAgNi4yOCA2LjZjLTEuMSAzLjEzLS43OCAzLjktMy4xOCA2LjA4QTMgMyAwIDAgMCA1IDE4YzQgMCA4LjQtMS44IDExLjQtNC4zIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTE4LjUgNiAyLjE5IDQuNWE2LjQ4IDYuNDggMCAwIDEtMi4yOSA3LjJDMTUuNCAyMC4yIDExIDIyIDcgMjJhMyAzIDAgMCAxLTIuNjgtMS42NkwyLjQgMTYuNSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyLjUiLCBjeTogIjguNSIsIHI6ICIyLjUiIH1dCiAgICBdOwogICAgdmFyIEJlZXJPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxM3Y1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDExLjQ3VjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTFoMWEzIDMgMCAwIDEgMi43NDUgNC4yMTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgOHYxMmEyIDIgMCAwIDAgMiAyaDhhMiAyIDAgMCAwIDItMnYtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03LjUzNiA3LjUzNUM2Ljc2NiA3LjY0OSA2LjE1NCA4IDUuNSA4YTIuNSAyLjUgMCAwIDEtMS43NjgtNC4yNjgiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOC43MjcgMy4yMDRDOS4zMDYgMi43NjcgOS44ODUgMiAxMSAyYzEuNTYgMCAyIDEuNSAzIDEuNXMxLjcyLS41IDIuNS0uNWExIDEgMCAxIDEgMCA1Yy0uNzggMC0xLjUtLjUtMi41LS41YTMuMTQ5IDMuMTQ5IDAgMCAwLS44NDIuMTIiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNC42VjE4IiB9XQogICAgXTsKICAgIHZhciBCZWVyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTFoMWEzIDMgMCAwIDEgMCA2aC0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTJ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxMnY2IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE0IDcuNWMtMSAwLTEuNDQuNS0zIC41cy0yLS41LTMtLjUtMS43Mi41LTIuNS41YTIuNSAyLjUgMCAwIDEgMC01Yy43OCAwIDEuNTcuNSAyLjUuNVM5LjQ0IDIgMTEgMnMyIDEuNSAzIDEuNSAxLjcyLS41IDIuNS0uNWEyLjUgMi41IDAgMCAxIDAgNWMtLjc4IDAtMS41LS41LTIuNS0uNVoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSA4djEyYTIgMiAwIDAgMCAyIDJoOGEyIDIgMCAwIDAgMi0yVjgiIH1dCiAgICBdOwogICAgdmFyIEJlbGxEb3QgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC4yNjggMjFhMiAyIDAgMCAwIDMuNDY0IDAiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTMuOTE2IDIuMzE0QTYgNiAwIDAgMCA2IDhjMCA0LjQ5OS0xLjQxMSA1Ljk1Ni0yLjc0IDcuMzI3QTEgMSAwIDAgMCA0IDE3aDE2YTEgMSAwIDAgMCAuNzQtMS42NzMgOSA5IDAgMCAxLS41ODUtLjY2NSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICI4IiwgcjogIjMiIH1dCiAgICBdOwogICAgdmFyIEJlbGxFbGVjdHJpYyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4LjUxOCAxNy4zNDdBNyA3IDAgMCAxIDE0IDE5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4LjggNEExMSAxMSAwIDAgMSAyMCA5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgOWguMDEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIyMCIsIGN5OiAiMTYiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjkiLCByOiAiNyIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjQiLCB5OiAiMTYiLCB3aWR0aDogIjEwIiwgaGVpZ2h0OiAiNiIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgQmVsbE1pbnVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAuMjY4IDIxYTIgMiAwIDAgMCAzLjQ2NCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDhoNiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNi4yNDMgMy43NTdBNiA2IDAgMCAwIDYgOGMwIDQuNDk5LTEuNDExIDUuOTU2LTIuNzM4IDcuMzI2QTEgMSAwIDAgMCA0IDE3aDE2YTEgMSAwIDAgMCAuNzQtMS42NzNBOS40IDkuNCAwIDAgMSAxOC42NjcgMTIiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEJlbGxQbHVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAuMjY4IDIxYTIgMiAwIDAgMCAzLjQ2NCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDhoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA1djYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAuMDAyIDE0LjQ2NGE5IDkgMCAwIDAgLjczOC44NjNBMSAxIDAgMCAxIDIwIDE3SDRhMSAxIDAgMCAxLS43NC0xLjY3M0M0LjU5IDEzLjk1NiA2IDEyLjQ5OSA2IDhhNiA2IDAgMCAxIDguNzUtNS4zMzIiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEJlbGxPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC4yNjggMjFhMiAyIDAgMCAwIDMuNDY0IDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTdINGExIDEgMCAwIDEtLjc0LTEuNjczQzQuNTkgMTMuOTU2IDYgMTIuNDk5IDYgOGE2IDYgMCAwIDEgLjI1OC0xLjc0MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC42NjggMy4wMUE2IDYgMCAwIDEgMTggOGMwIDIuNjg3Ljc3IDQuNjUzIDEuNzA3IDYuMDUiIH1dCiAgICBdOwogICAgdmFyIEJlbGxSaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAuMjY4IDIxYTIgMiAwIDAgMCAzLjQ2NCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDhjMC0yLjMtLjgtNC4zLTItNiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0zLjI2MiAxNS4zMjZBMSAxIDAgMCAwIDQgMTdoMTZhMSAxIDAgMCAwIC43NC0xLjY3M0MxOS40MSAxMy45NTYgMTggMTIuNDk5IDE4IDhBNiA2IDAgMCAwIDYgOGMwIDQuNDk5LTEuNDExIDUuOTU2LTIuNzM4IDcuMzI2IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMkMyLjggMy43IDIgNS43IDIgOCIgfV0KICAgIF07CiAgICB2YXIgQmVsbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjI2OCAyMWEyIDIgMCAwIDAgMy40NjQgMCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0zLjI2MiAxNS4zMjZBMSAxIDAgMCAwIDQgMTdoMTZhMSAxIDAgMCAwIC43NC0xLjY3M0MxOS40MSAxMy45NTYgMTggMTIuNDk5IDE4IDhBNiA2IDAgMCAwIDYgOGMwIDQuNDk5LTEuNDExIDUuOTU2LTIuNzM4IDcuMzI2IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBCZXR3ZWVuSG9yaXpvbnRhbEVuZCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjEzIiwgaGVpZ2h0OiAiNyIsIHg6ICIzIiwgeTogIjMiLCByeDogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgMTUtMy0zIDMtMyIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxMyIsIGhlaWdodDogIjciLCB4OiAiMyIsIHk6ICIxNCIsIHJ4OiAiMSIgfV0KICAgIF07CiAgICB2YXIgQmV0d2Vlbkhvcml6b250YWxTdGFydCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjEzIiwgaGVpZ2h0OiAiNyIsIHg6ICI4IiwgeTogIjMiLCByeDogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiA5IDMgMy0zIDMiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTMiLCBoZWlnaHQ6ICI3IiwgeDogIjgiLCB5OiAiMTQiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIEJldHdlZW5WZXJ0aWNhbFN0YXJ0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNyIsIGhlaWdodDogIjEzIiwgeDogIjMiLCB5OiAiOCIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAyLTMgMy0zLTMiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNyIsIGhlaWdodDogIjEzIiwgeDogIjE0IiwgeTogIjgiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIEJldHdlZW5WZXJ0aWNhbEVuZCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjciLCBoZWlnaHQ6ICIxMyIsIHg6ICIzIiwgeTogIjMiLCByeDogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAyMiAzLTMgMyAzIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjciLCBoZWlnaHQ6ICIxMyIsIHg6ICIxNCIsIHk6ICIzIiwgcng6ICIxIiB9XQogICAgXTsKICAgIHZhciBCaWNlcHNGbGV4ZWQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMi40MDkgMTMuMDE3QTUgNSAwIDAgMSAyMiAxNWMwIDMuODY2LTQgNy05IDctNC4wNzcgMC04LjE1My0uODItMTAuMzcxLTIuNDYyLS40MjYtLjMxNi0uNjMxLS44MzItLjYyLTEuMzYyQzIuMTE4IDEyLjcyMyAyLjYyNyAyIDEwIDJhMyAzIDAgMCAxIDMgMyAyIDIgMCAwIDEtMiAyYy0xLjEwNSAwLTEuNjQtLjQ0NC0yLTEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTRhNSA1IDAgMCAwLTcuNTg0IDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS45NjQgNi44MjVDOC4wMTkgNy45NzcgOS41IDEzIDggMTUiIH1dCiAgICBdOwogICAgdmFyIEJpa2UgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4LjUiLCBjeTogIjE3LjUiLCByOiAiMy41IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNS41IiwgY3k6ICIxNy41IiwgcjogIjMuNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE1IiwgY3k6ICI1IiwgcjogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTcuNVYxNGwtMy0zIDQtMyAyIDNoMiIgfV0KICAgIF07CiAgICB2YXIgQmluYXJ5ID0gWwogICAgICBbInJlY3QiLCB7IHg6ICIxNCIsIHk6ICIxNCIsIHdpZHRoOiAiNCIsIGhlaWdodDogIjYiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI2IiwgeTogIjQiLCB3aWR0aDogIjQiLCBoZWlnaHQ6ICI2Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMjBoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxMGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTRoMnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDRoMnY2IiB9XQogICAgXTsKICAgIHZhciBCaW9oYXphcmQgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMS45IiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi43IDMuNGMtLjkgMi41IDAgNS4yIDIuMiA2LjdDNi41IDkgMy43IDkuNiAyIDExLjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOC45IDEwLjEgMS40LjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuMyAzLjRjLjkgMi41IDAgNS4yLTIuMiA2LjcgMi40LTEuMiA1LjItLjYgNi45IDEuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNS4xIDEwLjEtMS40LjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYuNyAyMC44Yy0yLjYtLjQtNC42LTIuNi00LjctNS4zLS4yIDIuNi0yLjEgNC44LTQuNyA1LjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTMuOXYxLjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMuNSA1LjRjLTEtLjItMi0uMi0zIDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTYuNGMuNy0uNyAxLjItMS42IDEuNS0yLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNS41IDEzLjljLjMuOS44IDEuOCAxLjUgMi41IiB9XQogICAgXTsKICAgIHZhciBCaXJkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgN2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy40IDE4SDEyYTggOCAwIDAgMCA4LThWN2E0IDQgMCAwIDAtNy4yOC0yLjNMMiAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMCA3IDIgLjUtMiAuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxOHYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE3Ljc1VjIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMThhNiA2IDAgMCAwIDMuODQtMTAuNjEiIH1dCiAgICBdOwogICAgdmFyIEJpbm9jdWxhcnMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDdWNGExIDEgMCAwIDAtMS0xaC0yYTEgMSAwIDAgMC0xIDF2MyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAyMWEyIDIgMCAwIDAgMi0ydi0zLjg1MWMwLTEuMzktMi0yLjk2Mi0yLTQuODI5VjhhMSAxIDAgMCAwLTEtMWgtNGExIDEgMCAwIDAtMSAxdjExYTIgMiAwIDAgMCAyIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTSAyMiAxNiBMIDIgMTYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNCAyMWEyIDIgMCAwIDEtMi0ydi0zLjg1MWMwLTEuMzkgMi0yLjk2MiAyLTQuODI5VjhhMSAxIDAgMCAxIDEtMWg0YTEgMSAwIDAgMSAxIDF2MTFhMiAyIDAgMCAxLTIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA3VjRhMSAxIDAgMCAwLTEtMUg2YTEgMSAwIDAgMC0xIDF2MyIgfV0KICAgIF07CiAgICB2YXIgQmlyZGhvdXNlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTh2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAxOCAxLjk1Ni0xMS40NjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMyA4IDcuODItNS42MTVhMiAyIDAgMCAxIDIuMzYgMEwyMSA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMThoMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxOCA1LjA0NCA2LjUzMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMCIsIHI6ICIyIiB9XQogICAgXTsKICAgIHZhciBCaXRjb2luID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEuNzY3IDE5LjA4OWM0LjkyNC44NjggNi4xNC02LjAyNSAxLjIxNi02Ljg5NG0tMS4yMTYgNi44OTRMNS44NiAxOC4wNDdtNS45MDggMS4wNDItLjM0NyAxLjk3bTEuNTYzLTguODY0YzQuOTI0Ljg2OSA2LjE0LTYuMDI1IDEuMjE1LTYuODkzbS0xLjIxNSA2Ljg5My0zLjk0LS42OTRtNS4xNTUtNi4yTDguMjkgNC4yNm01LjkwOCAxLjA0Mi4zNDgtMS45N003LjQ4IDIwLjM2NGwzLjEyNi0xNy43MjciCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEJsZW5kID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICI5IiwgcjogIjciIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNSIsIGN5OiAiMTUiLCByOiAiNyIgfV0KICAgIF07CiAgICB2YXIgQmxpbmRzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzaDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDdIOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxMUg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE5aDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTVoMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAzdjE0IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNCIsIGN5OiAiMTkiLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgQmxvY2tzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTAgMjJWN2ExIDEgMCAwIDAtMS0xSDRhMiAyIDAgMCAwLTIgMnYxMmEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAyLTJ2LTVhMSAxIDAgMCAwLTEtMUgyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMTQiLCB5OiAiMiIsIHdpZHRoOiAiOCIsIGhlaWdodDogIjgiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIEJsdWV0b290aENvbm5lY3RlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgNyAxMCAxMC01IDVWMmw1IDVMNyAxNyIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxOCIsIHgyOiAiMjEiLCB5MTogIjEyIiwgeTI6ICIxMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIzIiwgeDI6ICI2IiwgeTE6ICIxMiIsIHkyOiAiMTIiIH1dCiAgICBdOwogICAgdmFyIEJsdWV0b290aE9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDE3LTUgNVYxMmwtNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNC41IDkuNSAxNyA3bC01LTV2NC41IiB9XQogICAgXTsKICAgIHZhciBCbHVldG9vdGhTZWFyY2hpbmcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm03IDcgMTAgMTAtNSA1VjJsNSA1TDcgMTciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAuODMgMTQuODNhNCA0IDAgMCAwIDAtNS42NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMmguMDEiIH1dCiAgICBdOwogICAgdmFyIEJsdWV0b290aCA9IFtbInBhdGgiLCB7IGQ6ICJtNyA3IDEwIDEwLTUgNVYybDUgNUw3IDE3IiB9XV07CiAgICB2YXIgQm9sZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTJoOWE0IDQgMCAwIDEgMCA4SDdhMSAxIDAgMCAxLTEtMVY1YTEgMSAwIDAgMSAxLTFoN2E0IDQgMCAwIDEgMCA4IiB9XQogICAgXTsKICAgIHZhciBCb2x0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEgMTZWOGEyIDIgMCAwIDAtMS0xLjczbC03LTRhMiAyIDAgMCAwLTIgMGwtNyA0QTIgMiAwIDAgMCAzIDh2OGEyIDIgMCAwIDAgMSAxLjczbDcgNGEyIDIgMCAwIDAgMiAwbDctNEEyIDIgMCAwIDAgMjEgMTZ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjQiIH1dCiAgICBdOwogICAgdmFyIEJvbWIgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjExIiwgY3k6ICIxMyIsIHI6ICI5IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTQuMzUgNC42NSAxNi4zIDIuN2EyLjQxIDIuNDEgMCAwIDEgMy40IDBsMS42IDEuNmEyLjQgMi40IDAgMCAxIDAgMy40bC0xLjk1IDEuOTUiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDItMS41IDEuNSIgfV0KICAgIF07CiAgICB2YXIgQm9uZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE3IDEwYy43LS43IDEuNjkgMCAyLjUgMGEyLjUgMi41IDAgMSAwIDAtNSAuNS41IDAgMCAxLS41LS41IDIuNSAyLjUgMCAxIDAtNSAwYzAgLjgxLjcgMS44IDAgMi41bC03IDdjLS43LjctMS42OSAwLTIuNSAwYTIuNSAyLjUgMCAwIDAgMCA1Yy4yOCAwIC41LjIyLjUuNWEyLjUgMi41IDAgMSAwIDUgMGMwLS44MS0uNy0xLjggMC0yLjVaIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBCb29rQSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNNCAxOS41di0xNUEyLjUgMi41IDAgMCAxIDYuNSAySDE5YTEgMSAwIDAgMSAxIDF2MThhMSAxIDAgMCAxLTEgMUg2LjVhMSAxIDAgMCAxIDAtNUgyMCIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAxMyA0LTcgNCA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuMSAxMWg1LjciIH1dCiAgICBdOwogICAgdmFyIEJvb2tBbGVydCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEzaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2djMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk00IDE5LjV2LTE1QTIuNSAyLjUgMCAwIDEgNi41IDJIMTlhMSAxIDAgMCAxIDEgMXYxOGExIDEgMCAwIDEtMSAxSDYuNWExIDEgMCAwIDEgMC01SDIwIiB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgQm9va0F1ZGlvID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDh2MyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTQgMTkuNXYtMTVBMi41IDIuNSAwIDAgMSA2LjUgMkgxOWExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDFINi41YTEgMSAwIDAgMSAwLTVIMjAiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggOHYzIiB9XQogICAgXTsKICAgIHZhciBCb29rQ2hlY2sgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTQgMTkuNXYtMTVBMi41IDIuNSAwIDAgMSA2LjUgMkgxOWExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDFINi41YTEgMSAwIDAgMSAwLTVIMjAiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgOS41IDIgMiA0LTQiIH1dCiAgICBdOwogICAgdmFyIEJvb2tDb3B5ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSA3YTIgMiAwIDAgMC0yIDJ2MTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNS44MDMgMThINWEyIDIgMCAwIDAgMCA0aDkuNWEuNS41IDAgMCAwIC41LS41VjIxIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNOSAxNVY0YTIgMiAwIDAgMSAyLTJoOS41YS41LjUgMCAwIDEgLjUuNXYxNGEuNS41IDAgMCAxLS41LjVIMTFhMiAyIDAgMCAxIDAtNGgxMCIgfQogICAgICBdCiAgICBdOwogICAgdmFyIEJvb2tEYXNoZWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN2gxLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjJoMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJoMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjUgMjJIMTlhMSAxIDAgMCAwIDEtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy41IDJIMTlhMSAxIDAgMCAxIDEgMXYxLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTR2M2gtMi41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDguNVYxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEwVjguNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE5LjVWMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA0LjVBMi41IDIuNSAwIDAgMSA2LjUgMkg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjJINi41YTEgMSAwIDAgMSAwLTVIOCIgfV0KICAgIF07CiAgICB2YXIgQm9va0Rvd24gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxM1Y3IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNNCAxOS41di0xNUEyLjUgMi41IDAgMCAxIDYuNSAySDE5YTEgMSAwIDAgMSAxIDF2MThhMSAxIDAgMCAxLTEgMUg2LjVhMSAxIDAgMCAxIDAtNUgyMCIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxMCAzIDMgMy0zIiB9XQogICAgXTsKICAgIHZhciBCb29rSGVhZHBob25lcyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNNCAxOS41di0xNUEyLjUgMi41IDAgMCAxIDYuNSAySDE5YTEgMSAwIDAgMSAxIDF2MThhMSAxIDAgMCAxLTEgMUg2LjVhMSAxIDAgMCAxIDAtNUgyMCIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMnYtMmE0IDQgMCAwIDEgOCAwdjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNSIsIGN5OiAiMTIiLCByOiAiMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjEyIiwgcjogIjEiIH1dCiAgICBdOwogICAgdmFyIEJvb2tIZWFydCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNNCAxOS41di0xNUEyLjUgMi41IDAgMCAxIDYuNSAySDE5YTEgMSAwIDAgMSAxIDF2MThhMSAxIDAgMCAxLTEgMUg2LjVhMSAxIDAgMCAxIDAtNUgyMCIgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOC42MiA5LjhBMi4yNSAyLjI1IDAgMSAxIDEyIDYuODM2YTIuMjUgMi4yNSAwIDEgMSAzLjM4IDIuOTY2bC0yLjYyNiAyLjg1NmEuOTk4Ljk5OCAwIDAgMS0xLjUwNyAweiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgQm9va0ltYWdlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAgMTMuNy0yLjEtMi4xYTIgMiAwIDAgMC0yLjggMEw5LjcgMTciIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk00IDE5LjV2LTE1QTIuNSAyLjUgMCAwIDEgNi41IDJIMTlhMSAxIDAgMCAxIDEgMXYxOGExIDEgMCAwIDEtMSAxSDYuNWExIDEgMCAwIDEgMC01SDIwIiB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEwIiwgY3k6ICI4IiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIEJvb2tLZXkgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOSAzIDEgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMCAyLTQuNSA0LjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgNy44OThWMjFhMSAxIDAgMCAxLTEgMUg2LjVhMSAxIDAgMCAxIDAtNUgyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE5LjV2LTE1QTIuNSAyLjUgMCAwIDEgNi41IDJoNy44NDQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNCIsIGN5OiAiOCIsIHI6ICIyIiB9XQogICAgXTsKICAgIHZhciBCb29rTG9jayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDZWNGEyIDIgMCAxIDAtNCAwdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTV2NmExIDEgMCAwIDEtMSAxSDYuNWExIDEgMCAwIDEgMC01SDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTkuNXYtMTVBMi41IDIuNSAwIDAgMSA2LjUgMkgxMCIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjEyIiwgeTogIjYiLCB3aWR0aDogIjgiLCBoZWlnaHQ6ICI1Iiwgcng6ICIxIiB9XQogICAgXTsKICAgIHZhciBCb29rTWFya2VkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMnY4bDMtMyAzIDNWMiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTQgMTkuNXYtMTVBMi41IDIuNSAwIDAgMSA2LjUgMkgxOWExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDFINi41YTEgMSAwIDAgMSAwLTVIMjAiIH0KICAgICAgXQogICAgXTsKICAgIHZhciBCb29rTWludXMgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTQgMTkuNXYtMTVBMi41IDIuNSAwIDAgMSA2LjUgMkgxOWExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDFINi41YTEgMSAwIDAgMSAwLTVIMjAiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTBoNiIgfV0KICAgIF07CiAgICB2YXIgQm9va09wZW5DaGVjayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIxVjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTIgMiAyIDQtNCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMiA2VjRhMSAxIDAgMCAwLTEtMWgtNWE0IDQgMCAwIDAtNCA0IDQgNCAwIDAgMC00LTRIM2ExIDEgMCAwIDAtMSAxdjEzYTEgMSAwIDAgMCAxIDFoNmEzIDMgMCAwIDEgMyAzIDMgMyAwIDAgMSAzLTNoNmExIDEgMCAwIDAgMS0xdi0xLjMiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEJvb2tPcGVuVGV4dCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2MTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA4aDIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMyAxOGExIDEgMCAwIDEtMS0xVjRhMSAxIDAgMCAxIDEtMWg1YTQgNCAwIDAgMSA0IDQgNCA0IDAgMCAxIDQtNGg1YTEgMSAwIDAgMSAxIDF2MTNhMSAxIDAgMCAxLTEgMWgtNmEzIDMgMCAwIDAtMyAzIDMgMyAwIDAgMC0zLTN6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDhoMiIgfV0KICAgIF07CiAgICB2YXIgQm9va09wZW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA3djE0IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMgMThhMSAxIDAgMCAxLTEtMVY0YTEgMSAwIDAgMSAxLTFoNWE0IDQgMCAwIDEgNCA0IDQgNCAwIDAgMSA0LTRoNWExIDEgMCAwIDEgMSAxdjEzYTEgMSAwIDAgMS0xIDFoLTZhMyAzIDAgMCAwLTMgMyAzIDMgMCAwIDAtMy0zeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgQm9va1BsdXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA3djYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk00IDE5LjV2LTE1QTIuNSAyLjUgMCAwIDEgNi41IDJIMTlhMSAxIDAgMCAxIDEgMXYxOGExIDEgMCAwIDEtMSAxSDYuNWExIDEgMCAwIDEgMC01SDIwIiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDEwaDYiIH1dCiAgICBdOwogICAgdmFyIEJvb2tTZWFyY2ggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAyMkg1LjVhMSAxIDAgMCAxIDAtNWg0LjUwMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAyMi0xLjg3OS0xLjg3OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE5LjV2LTE1QTIuNSAyLjUgMCAwIDEgNS41IDJIMThhMSAxIDAgMCAxIDEgMXY4IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTciLCBjeTogIjE4IiwgcjogIjMiIH1dCiAgICBdOwogICAgdmFyIEJvb2tUZXh0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk00IDE5LjV2LTE1QTIuNSAyLjUgMCAwIDEgNi41IDJIMTlhMSAxIDAgMCAxIDEgMXYxOGExIDEgMCAwIDEtMSAxSDYuNWExIDEgMCAwIDEgMC01SDIwIiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDExaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA3aDYiIH1dCiAgICBdOwogICAgdmFyIEJvb2tUeXBlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTNoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2djciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgOFY2SDh2MiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTQgMTkuNXYtMTVBMi41IDIuNSAwIDAgMSA2LjUgMkgxOWExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDFINi41YTEgMSAwIDAgMSAwLTVIMjAiIH0KICAgICAgXQogICAgXTsKICAgIHZhciBCb29rVXAyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTNWNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAyaDFhMSAxIDAgMCAxIDEgMXYxOGExIDEgMCAwIDEtMSAxSDYuNWExIDEgMCAwIDEgMC01SDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTkuNXYtMTVBMi41IDIuNSAwIDAgMSA2LjUgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDEwIDMtMyAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSA1IDMtMyAzIDMiIH1dCiAgICBdOwogICAgdmFyIEJvb2tVcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEzVjciIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk00IDE5LjV2LTE1QTIuNSAyLjUgMCAwIDEgNi41IDJIMTlhMSAxIDAgMCAxIDEgMXYxOGExIDEgMCAwIDEtMSAxSDYuNWExIDEgMCAwIDEgMC01SDIwIiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDEwIDMtMyAzIDMiIH1dCiAgICBdOwogICAgdmFyIEJvb2tVc2VyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTNhMyAzIDAgMSAwLTYgMCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTQgMTkuNXYtMTVBMi41IDIuNSAwIDAgMSA2LjUgMkgxOWExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDFINi41YTEgMSAwIDAgMSAwLTVIMjAiIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjgiLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgQm9va1ggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC41IDctNSA1IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNNCAxOS41di0xNUEyLjUgMi41IDAgMCAxIDYuNSAySDE5YTEgMSAwIDAgMSAxIDF2MThhMSAxIDAgMCAxLTEgMUg2LjVhMSAxIDAgMCAxIDAtNUgyMCIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOS41IDcgNSA1IiB9XQogICAgXTsKICAgIHZhciBCb29rID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk00IDE5LjV2LTE1QTIuNSAyLjUgMCAwIDEgNi41IDJIMTlhMSAxIDAgMCAxIDEgMXYxOGExIDEgMCAwIDEtMSAxSDYuNWExIDEgMCAwIDEgMC01SDIwIiB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgQm9va21hcmtDaGVjayA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE3IDNhMiAyIDAgMCAxIDIgMnYxNWExIDEgMCAwIDEtMS40OTYuODY4bC00LjUxMi0yLjU3OGEyIDIgMCAwIDAtMS45ODQgMGwtNC41MTIgMi41NzhBMSAxIDAgMCAxIDUgMjBWNWEyIDIgMCAwIDEgMi0yeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDEwIDIgMiA0LTQiIH1dCiAgICBdOwogICAgdmFyIEJvb2ttYXJrTWludXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxMEg5IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE3IDNhMiAyIDAgMCAxIDIgMnYxNWExIDEgMCAwIDEtMS40OTYuODY4bC00LjUxMi0yLjU3OGEyIDIgMCAwIDAtMS45ODQgMGwtNC41MTIgMi41NzhBMSAxIDAgMCAxIDUgMjBWNWEyIDIgMCAwIDEgMi0yeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgQm9va21hcmtYID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuNSA3LjUtNSA1IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE3IDNhMiAyIDAgMCAxIDIgMnYxNWExIDEgMCAwIDEtMS40OTYuODY4bC00LjUxMi0yLjU3OGEyIDIgMCAwIDAtMS45ODQgMGwtNC41MTIgMi41NzhBMSAxIDAgMCAxIDUgMjBWNWEyIDIgMCAwIDEgMi0yeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05LjUgNy41IDUgNSIgfV0KICAgIF07CiAgICB2YXIgQm9va21hcmtQbHVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgN3Y2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEwSDkiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTcgM2EyIDIgMCAwIDEgMiAydjE1YTEgMSAwIDAgMS0xLjQ5Ni44NjhsLTQuNTEyLTIuNTc4YTIgMiAwIDAgMC0xLjk4NCAwbC00LjUxMiAyLjU3OEExIDEgMCAwIDEgNSAyMFY1YTIgMiAwIDAgMSAyLTJ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBCb29rbWFyayA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE3IDNhMiAyIDAgMCAxIDIgMnYxNWExIDEgMCAwIDEtMS40OTYuODY4bC00LjUxMi0yLjU3OGEyIDIgMCAwIDAtMS45ODQgMGwtNC41MTIgMi41NzhBMSAxIDAgMCAxIDUgMjBWNWEyIDIgMCAwIDEgMi0yeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgQm9vbUJveCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgOVY1YTIgMiAwIDAgMSAyLTJoMTJhMiAyIDAgMCAxIDIgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggOHYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDh2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA4djEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxMiIsIHg6ICIyIiwgeTogIjkiLCByeDogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI4IiwgY3k6ICIxNSIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYiLCBjeTogIjE1IiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIEJvdE1lc3NhZ2VTcXVhcmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2VjJIOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxMXYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxMmgyIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDE2YTIgMiAwIDAgMS0yIDJIOC44MjhhMiAyIDAgMCAwLTEuNDE0LjU4NmwtMi4yMDIgMi4yMDJBLjcxLjcxIDAgMCAxIDQgMjAuMjg2VjhhMiAyIDAgMCAxIDItMmgxMmEyIDIgMCAwIDEgMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDExdjIiIH1dCiAgICBdOwogICAgdmFyIEJvdE9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjY3IDhIMThhMiAyIDAgMCAxIDIgMnY0LjMzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTRoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxNGgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDIyIDIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDhINmEyIDIgMCAwIDAtMiAydjhhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMS40MTQtLjU4NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDEzdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS42NyA0SDEydjIuMzMiIH1dCiAgICBdOwogICAgdmFyIEJvdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDhWNEg4IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE2IiwgaGVpZ2h0OiAiMTIiLCB4OiAiNCIsIHk6ICI4Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTRoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxNGgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEzdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxM3YyIiB9XQogICAgXTsKICAgIHZhciBCb3R0bGVXaW5lID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTAgM2ExIDEgMCAwIDEgMS0xaDJhMSAxIDAgMCAxIDEgMXYyYTYgNiAwIDAgMCAxLjIgMy42bC42LjhBNiA2IDAgMCAxIDE3IDEzdjhhMSAxIDAgMCAxLTEgMUg4YTEgMSAwIDAgMS0xLTF2LThhNiA2IDAgMCAxIDEuMi0zLjZsLjYtLjhBNiA2IDAgMCAwIDEwIDV6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDEzaC00YTEgMSAwIDAgMC0xIDF2M2ExIDEgMCAwIDAgMSAxaDQiIH1dCiAgICBdOwogICAgdmFyIEJvd0Fycm93ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgM2g0djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTguNTc1IDExLjA4MmExMyAxMyAwIDAgMSAxLjA0OCA5LjAyNyAxLjE3IDEuMTcgMCAwIDEtMS45MTQuNTk3TDE0IDE3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTAgMy4yOSA2LjI5YTEuMTcgMS4xNyAwIDAgMSAuNi0xLjkxIDEzIDEzIDAgMCAxIDkuMDMgMS4wNSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk03IDE0YTEuNyAxLjcgMCAwIDAtMS4yMDcuNWwtMi42NDYgMi42NDZBLjUuNSAwIDAgMCAzLjUgMThINWExIDEgMCAwIDEgMSAxdjEuNWEuNS41IDAgMCAwIC44NTQuMzU0TDkuNSAxOC4yMDdBMS43IDEuNyAwIDAgMCAxMCAxN3YtMmExIDEgMCAwIDAtMS0xeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjcwNyAxNC4yOTMgMjEgMyIgfV0KICAgIF07CiAgICB2YXIgQm94ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEgOGEyIDIgMCAwIDAtMS0xLjczbC03LTRhMiAyIDAgMCAwLTIgMGwtNyA0QTIgMiAwIDAgMCAzIDh2OGEyIDIgMCAwIDAgMSAxLjczbDcgNGEyIDIgMCAwIDAgMiAwbDctNEEyIDIgMCAwIDAgMjEgMTZaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMuMyA3IDguNyA1IDguNy01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIyVjEyIiB9XQogICAgXTsKICAgIHZhciBCb3hlcyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuOTcgMTIuOTJBMiAyIDAgMCAwIDIgMTQuNjN2My4yNGEyIDIgMCAwIDAgLjk3IDEuNzFsMyAxLjhhMiAyIDAgMCAwIDIuMDYgMEwxMiAxOXYtNS41bC01LTMtNC4wMyAyLjQyWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03IDE2LjUtNC43NC0yLjg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMTYuNSA1LTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxNi41djUuMTciIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTIgMTMuNVYxOWwzLjk3IDIuMzhhMiAyIDAgMCAwIDIuMDYgMGwzLTEuOGEyIDIgMCAwIDAgLjk3LTEuNzF2LTMuMjRhMiAyIDAgMCAwLS45Ny0xLjcxTDE3IDEwLjVsLTUgM1oiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMTYuNS01LTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMTYuNSA0Ljc0LTIuODUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTYuNXY1LjE3IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTcuOTcgNC40MkEyIDIgMCAwIDAgNyA2LjEzdjQuMzdsNSAzIDUtM1Y2LjEzYTIgMiAwIDAgMC0uOTctMS43MWwtMy0xLjhhMiAyIDAgMCAwLTIuMDYgMGwtMyAxLjhaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDggNy4yNiA1LjE1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDggNC43NC0yLjg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEzLjVWOCIgfV0KICAgIF07CiAgICB2YXIgQnJhY2VzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAzSDdhMiAyIDAgMCAwLTIgMnY1YTIgMiAwIDAgMS0yIDIgMiAyIDAgMCAxIDIgMnY1YzAgMS4xLjkgMiAyIDJoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAyMWgxYTIgMiAwIDAgMCAyLTJ2LTVjMC0xLjEuOS0yIDItMmEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAwLTItMmgtMSIgfV0KICAgIF07CiAgICB2YXIgQnJhY2tldHMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAzaDNhMSAxIDAgMCAxIDEgMXYxNmExIDEgMCAwIDEtMSAxaC0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjFINWExIDEgMCAwIDEtMS0xVjRhMSAxIDAgMCAxIDEtMWgzIiB9XQogICAgXTsKICAgIHZhciBCcmFpbkNpcmN1aXQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTEyIDVhMyAzIDAgMSAwLTUuOTk3LjEyNSA0IDQgMCAwIDAtMi41MjYgNS43NyA0IDQgMCAwIDAgLjU1NiA2LjU4OEE0IDQgMCAxIDAgMTIgMThaIiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDEzYTQuNSA0LjUgMCAwIDAgMy00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMDAzIDUuMTI1QTMgMyAwIDAgMCA2LjQwMSA2LjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy40NzcgMTAuODk2YTQgNCAwIDAgMSAuNTg1LS4zOTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOGE0IDQgMCAwIDEtMS45NjctLjUxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxM2g0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4aDZhMiAyIDAgMCAxIDIgMnYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDhoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA4VjVhMiAyIDAgMCAxIDItMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE2IiwgY3k6ICIxMyIsIHI6ICIuNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICIzIiwgcjogIi41IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMjAiLCBjeTogIjIxIiwgcjogIi41IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMjAiLCBjeTogIjgiLCByOiAiLjUiIH1dCiAgICBdOwogICAgdmFyIEJyYWluID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMThWNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxM2E0LjE3IDQuMTcgMCAwIDEtMy00IDQuMTcgNC4xNyAwIDAgMS0zIDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuNTk4IDYuNUEzIDMgMCAxIDAgMTIgNWEzIDMgMCAxIDAtNS41OTggMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3Ljk5NyA1LjEyNWE0IDQgMCAwIDEgMi41MjYgNS43NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxOGE0IDQgMCAwIDAgMi03LjQ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOS45NjcgMTcuNDgzQTQgNCAwIDEgMSAxMiAxOGE0IDQgMCAxIDEtNy45NjctLjUxNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE4YTQgNCAwIDAgMS0yLTcuNDY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMDAzIDUuMTI1YTQgNCAwIDAgMC0yLjUyNiA1Ljc3IiB9XQogICAgXTsKICAgIHZhciBCcmlja1dhbGxGaXJlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgM3YyLjEwNyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNyA5YzEgMyAyLjUgMy41IDMuNSA0LjVBNSA1IDAgMCAxIDIyIDE3YTUgNSAwIDAgMS0xMCAwYzAtLjMgMC0uNi4xLS45YTIgMiAwIDEgMCAzLjMtMkMxMyAxMS41IDE2IDkgMTcgOSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA4LjI3NFY1YTIgMiAwIDAgMC0yLTJINWEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoMy45MzgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxNWg1LjI1MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDloOC4yMjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNXY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggM3Y2IiB9XQogICAgXTsKICAgIHZhciBCcmFpbkNvZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEwLjg1MiAxNC43NzItLjM4My45MjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAuODUyIDkuMjI4LS4zODMtLjkyMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMy4xNDggMTQuNzcyLjM4Mi45MjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMuNTMxIDguMzA1LS4zODMuOTIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0Ljc3MiAxMC44NTIuOTIzLS4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuNzcyIDEzLjE0OC45MjMuMzgzIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE3LjU5OCA2LjVBMyAzIDAgMSAwIDEyIDVhMyAzIDAgMCAwLTUuNjMtMS40NDYgMyAzIDAgMCAwLS4zNjggMS41NzEgNCA0IDAgMCAwLTIuNTI1IDUuNzcxIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3Ljk5OCA1LjEyNWE0IDQgMCAwIDEgMi41MjUgNS43NzEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkuNTA1IDEwLjI5NGE0IDQgMCAwIDEtMS41IDcuNzA2IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNNC4wMzIgMTcuNDgzQTQgNCAwIDAgMCAxMS40NjQgMjBjLjE4LS4zMTEuODkyLS4zMTEgMS4wNzIgMGE0IDQgMCAwIDAgNy40MzItMi41MTYiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQuNSAxMC4yOTFBNCA0IDAgMCAwIDYgMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi4wMDIgNS4xMjVhMyAzIDAgMCAwIC40IDEuMzc1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkuMjI4IDEwLjg1Mi0uOTIzLS4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOS4yMjggMTMuMTQ4LS45MjMuMzgzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjMiIH1dCiAgICBdOwogICAgdmFyIEJyaWNrV2FsbFNoaWVsZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDl2MS4yNTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgM3Y1LjQ2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDkuMTE4VjVhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg1Ljc1IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIyIDE3LjVjMCAyLjQ5OS0xLjc1IDMuNzQ5LTMuODMgNC40NzRhLjUuNSAwIDAgMS0uMzM1LS4wMDVjLTIuMDg1LS43Mi0zLjgzNS0xLjk3LTMuODM1LTQuNDdWMTRhLjUuNSAwIDAgMSAuNS0uNDk5YzEgMCAyLjI1LS42IDMuMTItMS4zNmEuNi42IDAgMCAxIC43Ni0uMDAxYy44NzUuNzY1IDIuMTIgMS4zNiAzLjEyIDEuMzZhLjUuNSAwIDAgMSAuNS41eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE1aDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA5aDEyLjE0MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE1djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAzdjYiIH1dCiAgICBdOwogICAgdmFyIEJyaWNrV2FsbCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDl2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNXY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDN2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE1aDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOWgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE1djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAzdjYiIH1dCiAgICBdOwogICAgdmFyIEJyaWVmY2FzZUJ1c2luZXNzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDZWNGEyIDIgMCAwIDAtMi0yaC00YTIgMiAwIDAgMC0yIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxM2ExOC4xNSAxOC4xNSAwIDAgMS0yMCAwIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTQiLCB4OiAiMiIsIHk6ICI2Iiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBCcmllZmNhc2VDb252ZXlvckJlbHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAyMHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDIwdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMjB2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAyMEgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMjB2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE2VjRhMiAyIDAgMCAxIDItMmg0YTIgMiAwIDAgMSAyIDJ2MTIiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI0IiwgeTogIjYiLCB3aWR0aDogIjE2IiwgaGVpZ2h0OiAiMTAiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIEJyaWVmY2FzZU1lZGljYWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMXY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDEzaC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDZWNGEyIDIgMCAwIDAtMi0yaC00YTIgMiAwIDAgMC0yIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA2djE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgNnYxNCIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE0IiwgeDogIjIiLCB5OiAiNiIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgQnJpZWZjYXNlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMjBWNGEyIDIgMCAwIDAtMi0yaC00YTIgMiAwIDAgMC0yIDJ2MTYiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxNCIsIHg6ICIyIiwgeTogIjYiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIEJydXNoQ2xlYW5pbmcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAyMi0xLTQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTkgMTRhMSAxIDAgMCAwIDEtMXYtMWEyIDIgMCAwIDAtMi0yaC0zYTEgMSAwIDAgMS0xLTFWNGEyIDIgMCAwIDAtNCAwdjVhMSAxIDAgMCAxLTEgMUg2YTIgMiAwIDAgMC0yIDJ2MWExIDEgMCAwIDAgMSAxIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE0SDVsLTEuOTczIDYuNzY3QTEgMSAwIDAgMCA0IDIyaDE2YTEgMSAwIDAgMCAuOTczLTEuMjMzeiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDIyIDEtNCIgfV0KICAgIF07CiAgICB2YXIgQnJpbmdUb0Zyb250ID0gWwogICAgICBbInJlY3QiLCB7IHg6ICI4IiwgeTogIjgiLCB3aWR0aDogIjgiLCBoZWlnaHQ6ICI4Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTBhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoNGEyIDIgMCAwIDEgMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDIwYTIgMiAwIDAgMCAyIDJoNGEyIDIgMCAwIDAgMi0ydi00YTIgMiAwIDAgMC0yLTIiIH1dCiAgICBdOwogICAgdmFyIEJydXNoID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTEgMTAgMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuNSAyMUEzLjUgMy41IDAgMSAwIDMgMTcuNWEyLjYyIDIuNjIgMCAwIDEtLjcwOCAxLjc5MkExIDEgMCAwIDAgMyAyMXoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS45NjkgMTcuMDMxIDIxLjM3OCA1LjYyNGExIDEgMCAwIDAtMy4wMDItMy4wMDJMNi45NjcgMTQuMDMxIiB9XQogICAgXTsKICAgIHZhciBCdWJibGVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNy4wMDEgMTUuMDg1QTEuNSAxLjUgMCAwIDEgOSAxNi41IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTguNSIsIGN5OiAiOC41IiwgcjogIjMuNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjcuNSIsIGN5OiAiMTYuNSIsIHI6ICI1LjUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI3LjUiLCBjeTogIjQuNSIsIHI6ICIyLjUiIH1dCiAgICBdOwogICAgdmFyIEJ1Z09mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIwdi04IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0LjEyIDMuODggMTYgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA3LjEzVjZhMyAzIDAgMCAwLTUuMTQtMi4xTDggMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMi4zNFYxMWE0IDQgMCAwIDAtNC00aC0xLjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDVhNCA0IDAgMCAxLTMuNTUgMy45NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxM2gtMy4zNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDIxYTQgNCAwIDAgMSAzLjgxLTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxM0gyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcuNyA3LjdBNCA0IDAgMCAwIDYgMTF2M2E2IDYgMCAwIDAgMTEuMTMgMy4xMyIgfV0KICAgIF07CiAgICB2YXIgQnVnUGxheSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE5LjY1NUE2IDYgMCAwIDEgNiAxNHYtM2E0IDQgMCAwIDEgNC00aDRhNCA0IDAgMCAxIDQgMy45NyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNCAxNS4wMDNhMSAxIDAgMCAxIDEuNTE3LS44NTlsNC45OTcgMi45OTdhMSAxIDAgMCAxIDAgMS43MThsLTQuOTk3IDIuOTk3YTEgMSAwIDAgMS0xLjUxNy0uODZ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0LjEyIDMuODggMTYgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA1YTQgNCAwIDAgMS0zLjU1IDMuOTciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAyMWE0IDQgMCAwIDEgMy44MS00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgNWE0IDQgMCAwIDAgMy41NSAzLjk3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTNIMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDIgMS44OCAxLjg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgNy4xM1Y2YTMgMyAwIDEgMSA2IDB2MS4xMyIgfV0KICAgIF07CiAgICB2YXIgQnVnID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjB2LTkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgN2E0IDQgMCAwIDEgNCA0djNhNiA2IDAgMCAxLTEyIDB2LTNhNCA0IDAgMCAxIDQtNHoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQuMTIgMy44OCAxNiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDIxYTQgNCAwIDAgMC0zLjgxLTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgNWE0IDQgMCAwIDEtMy41NSAzLjk3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDEzaC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMjFhNCA0IDAgMCAxIDMuODEtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDVhNCA0IDAgMCAwIDMuNTUgMy45NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEzSDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAyIDEuODggMS44OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDcuMTNWNmEzIDMgMCAxIDEgNiAwdjEuMTMiIH1dCiAgICBdOwogICAgdmFyIEJ1aWxkaW5nMiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEyaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDIxdi0zYTIgMiAwIDAgMC00IDB2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEwSDRhMiAyIDAgMCAwLTIgMnY3YTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMlY5YTIgMiAwIDAgMC0yLTJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAyMVY1YTIgMiAwIDAgMSAyLTJoOGEyIDIgMCAwIDEgMiAydjE2IiB9XQogICAgXTsKICAgIHZhciBCdWlsZGluZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEwaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTBoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE0aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA2aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEwaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE0aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDZoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMjJ2LTNhMSAxIDAgMCAxIDEtMWg0YTEgMSAwIDAgMSAxIDF2MyIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjQiLCB5OiAiMiIsIHdpZHRoOiAiMTYiLCBoZWlnaHQ6ICIyMCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgQnVzRnJvbnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDYgMiA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDZoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiA3LTItMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNiIsIGhlaWdodDogIjE2IiwgeDogIjQiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDExaDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTVoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE1aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE5djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMjF2LTIiIH1dCiAgICBdOwogICAgdmFyIEJ1cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggNnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDZ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEyaDE5LjYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTggMThoM3MuNS0xLjcuOC0yLjhjLjEtLjQuMi0uOC4yLTEuMiAwLS40LS4xLS44LS4yLTEuMmwtMS40LTVDMjAuMSA2LjggMTkuMSA2IDE4IDZINGEyIDIgMCAwIDAtMiAydjEwaDMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI3IiwgY3k6ICIxOCIsIHI6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMThoNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE2IiwgY3k6ICIxOCIsIHI6ICIyIiB9XQogICAgXTsKICAgIHZhciBDYWJsZUNhciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDNoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgOSAyMC01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEyVjYuNSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNiIsIGhlaWdodDogIjEwIiwgeDogIjQiLCB5OiAiMTIiLCByeDogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMnY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEydjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxN2gxNiIgfV0KICAgIF07CiAgICB2YXIgQ2FibGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxOWExIDEgMCAwIDEtMS0xdi0yYTIgMiAwIDAgMSAyLTJoMmEyIDIgMCAwIDEgMiAydjJhMSAxIDAgMCAxLTEgMXoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMjF2LTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMTRWNi41YTEgMSAwIDAgMC03IDB2MTFhMSAxIDAgMCAxLTcgMFYxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAyMXYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDVWMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEwYTIgMiAwIDAgMS0yLTJWNmExIDEgMCAwIDEgMS0xaDRhMSAxIDAgMCAxIDEgMXYyYTIgMiAwIDAgMS0yIDJ6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNVYzIiB9XQogICAgXTsKICAgIHZhciBDYWtlU2xpY2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxM0gzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE3SDMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtNy4yIDcuOS0zLjM4OCAyLjVBMiAyIDAgMCAwIDMgMTIuMDFWMjBhMSAxIDAgMCAwIDEgMWgxNmExIDEgMCAwIDAgMS0xdi04LjY1NGMwLTItMi40NC02LjAyNi02LjQ0LTguMDI2YTEgMSAwIDAgMC0xLjA4Mi4wNTdMMTAuNCA1LjYiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICI3IiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIENha2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAyMXYtOGEyIDIgMCAwIDAtMi0ySDZhMiAyIDAgMCAwLTIgMnY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTZzLjUtMSAyLTEgMi41IDIgNCAyIDIuNS0yIDQtMiAyLjUgMiA0IDIgMi0xIDItMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIxaDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgOHYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDh2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyA4djMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyA0aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA0aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyA0aC4wMSIgfV0KICAgIF07CiAgICB2YXIgQ2FsY3VsYXRvciA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE2IiwgaGVpZ2h0OiAiMjAiLCB4OiAiNCIsIHk6ICIyIiwgcng6ICIyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjgiLCB4MjogIjE2IiwgeTE6ICI2IiwgeTI6ICI2IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE2IiwgeDI6ICIxNiIsIHkxOiAiMTQiLCB5MjogIjE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEwaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTRoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTRoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE4aC4wMSIgfV0KICAgIF07CiAgICB2YXIgQ2FsZW5kYXIxID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTRoMXY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEwaDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMnY0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICI0Iiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4Iiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBDYWxlbmRhckFycm93RG93biA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDE4IDQgNCA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE0djgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTEuMzU0VjZhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg3LjM0MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEwaDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMnY0IiB9XQogICAgXTsKICAgIHZhciBDYWxlbmRhckFycm93VXAgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAxOCA0LTQgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAyMnYtOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMS4zNDNWNmEyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2NCIgfV0KICAgIF07CiAgICB2YXIgQ2FsZW5kYXJDaGVjazIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTRWNmEyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAyMCAyIDIgNC00IiB9XQogICAgXTsKICAgIHZhciBDYWxlbmRhckNoZWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICI0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTBoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxNiAyIDIgNC00IiB9XQogICAgXTsKICAgIHZhciBDYWxlbmRhckNsb2NrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTR2Mi4ybDEuNiAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA3LjVWNmEyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDMuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEwaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAydjQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNiIsIGN5OiAiMTYiLCByOiAiNiIgfV0KICAgIF07CiAgICB2YXIgQ2FsZW5kYXJDb2cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNS4yMjggMTYuODUyLS45MjMtLjM4MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNS4yMjggMTkuMTQ4LS45MjMuMzgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNi40NyAxNC4zMDUuMzgyLjkyMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNi44NTIgMjAuNzcyLS4zODMuOTI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5LjE0OCAxNS4yMjguMzgzLS45MjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkuNTMgMjEuNjk2LS4zODItLjkyNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMC43NzIgMTYuODUyLjkyNC0uMzgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwLjc3MiAxOS4xNDguOTI0LjM4MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMC41OTJWNmEyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2NCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICIxOCIsIHI6ICIzIiB9XQogICAgXTsKICAgIHZhciBDYWxlbmRhckRheXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjQiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjQiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE0aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTRoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMThoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxOGguMDEiIH1dCiAgICBdOwogICAgdmFyIENhbGVuZGFyRm9sZCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMgMjBhMiAyIDAgMCAwIDIgMmgxMGEyLjQgMi40IDAgMCAwIDEuNzA2LS43MDZsMy41ODgtMy41ODhBMi40IDIuNCAwIDAgMCAyMSAxNlY2YTIgMiAwIDAgMC0yLTJINWEyIDIgMCAwIDAtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAyMnYtNWExIDEgMCAwIDEgMS0xaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTBoMTgiIH1dCiAgICBdOwogICAgdmFyIENhbGVuZGFySGVhcnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMi4xMjcgMjJINWEyIDIgMCAwIDEtMi0yVjZhMiAyIDAgMCAxIDItMmgxNGEyIDIgMCAwIDEgMiAydjUuMTI1IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE0LjYyIDE4LjhBMi4yNSAyLjI1IDAgMSAxIDE4IDE1LjgzNmEyLjI1IDIuMjUgMCAxIDEgMy4zOCAyLjk2NmwtMi42MjYgMi44NTZhLjk5OC45OTggMCAwIDEtMS41MDcgMHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTBoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAydjQiIH1dCiAgICBdOwogICAgdmFyIENhbGVuZGFyTWludXMyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICI0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTBoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTZoNCIgfV0KICAgIF07CiAgICB2YXIgQ2FsZW5kYXJNaW51cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE5aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE1VjZhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg4LjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2NCIgfV0KICAgIF07CiAgICB2YXIgQ2FsZW5kYXJPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00LjIgNC4yQTIgMiAwIDAgMCAzIDZ2MTRhMiAyIDAgMCAwIDIgMmgxNGEyIDIgMCAwIDAgMS44Mi0xLjE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE1LjVWNmEyIDIgMCAwIDAtMi0ySDkuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEwaC01LjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XQogICAgXTsKICAgIHZhciBDYWxlbmRhclBsdXMyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICI0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTBoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTZoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNHY0IiB9XQogICAgXTsKICAgIHZhciBDYWxlbmRhclBsdXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxOWg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxNnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEyLjU5OFY2YTIgMiAwIDAgMC0yLTJINWEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoOC41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTBoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAydjQiIH1dCiAgICBdOwogICAgdmFyIENhbGVuZGFyUmFuZ2UgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiNCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxNGgtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxOEg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTRoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDE4aC4wMSIgfV0KICAgIF07CiAgICB2YXIgQ2FsZW5kYXJTZWFyY2ggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTEuNzVWNmEyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDcuMjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgMjItMS44NzUtMS44NzUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2NCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICIxOCIsIHI6ICIzIiB9XQogICAgXTsKICAgIHZhciBDYWxlbmRhclN5bmMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxMHY0aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTEgMTQgMS41MzUtMS42MDVhNSA1IDAgMCAxIDggMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAxOC0xLjUzNSAxLjYwNWE1IDUgMCAwIDEtOC0xLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMjJ2LTRoLTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgOC41VjZhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg0LjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMnY0IiB9XQogICAgXTsKICAgIHZhciBDYWxlbmRhclgyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEzVjZhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTBoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMjIgNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDE3IDUgNSIgfV0KICAgIF07CiAgICB2YXIgQ2FsZW5kYXJYID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICI0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTBoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgMTQtNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEwIDE0IDQgNCIgfV0KICAgIF07CiAgICB2YXIgQ2FsZW5kYXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjQiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjQiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGgxOCIgfV0KICAgIF07CiAgICB2YXIgQ2FsZW5kYXJzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1LjcyNiAyMS4wMUEyIDIgMCAwIDEgMTQgMjJINGEyIDIgMCAwIDEtMi0yVjEwYTIgMiAwIDAgMSAyLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTNoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDhoMTQiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI4IiwgeTogIjMiLCB3aWR0aDogIjE0IiwgaGVpZ2h0OiAiMTQiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIENhbWVyYU9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0LjU2NCAxNC41NThhMyAzIDAgMSAxLTQuMTIyLTQuMTIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAyMEg0YTIgMiAwIDAgMS0yLTJWOWEyIDIgMCAwIDEgMi0yaDEuOTk3YTIgMiAwIDAgMCAuODE5LS4xNzUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOS42OTUgNC4wMjRBMiAyIDAgMCAxIDEwLjAwNCA0aDMuOTkzYTIgMiAwIDAgMSAxLjc2IDEuMDVsLjQ4Ni45QTIgMiAwIDAgMCAxOC4wMDMgN0gyMGEyIDIgMCAwIDEgMiAydjcuMzQ0IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBDYW1lcmEgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMy45OTcgNGEyIDIgMCAwIDEgMS43NiAxLjA1bC40ODYuOUEyIDIgMCAwIDAgMTguMDAzIDdIMjBhMiAyIDAgMCAxIDIgMnY5YTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjlhMiAyIDAgMCAxIDItMmgxLjk5N2EyIDIgMCAwIDAgMS43NTktMS4wNDhsLjQ4OS0uOTA0QTIgMiAwIDAgMSAxMC4wMDQgNHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTMiLCByOiAiMyIgfV0KICAgIF07CiAgICB2YXIgQ2FuZHlDYW5lID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk01LjcgMjFhMiAyIDAgMCAxLTMuNS0ybDguNi0xNGE2IDYgMCAwIDEgMTAuNCA2IDIgMiAwIDEgMS0zLjQ2NC0yIDIgMiAwIDEgMC0zLjQ2NC0yWiIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuNzUgNyAxNSAyLjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAuOSA0LjggMTMgOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03LjkgOS43IDIgNC40IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQuOSAxNC43IDcgMTguOSIgfV0KICAgIF07CiAgICB2YXIgQ2FuZHlPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMHY3LjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEuODAyIDYuMTQ1YTUgNSAwIDAgMSA2LjA1MyA2LjA1MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA2LjF2Mi4yNDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUuNSAxNS41NzEtLjk2NC45NjRhNSA1IDAgMCAxLTcuMDcxIDAgNSA1IDAgMCAxIDAtNy4wN2wuOTY0LS45NjUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTYgN1YzYTEgMSAwIDAgMSAxLjcwNy0uNzA3IDIuNSAyLjUgMCAwIDAgMi4xNTIuNzE3IDEgMSAwIDAgMSAxLjEzMSAxLjEzMSAyLjUgMi41IDAgMCAwIC43MTcgMi4xNTJBMSAxIDAgMCAxIDIxIDhoLTQiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTggMTd2NGExIDEgMCAwIDEtMS43MDcuNzA3IDIuNSAyLjUgMCAwIDAtMi4xNTItLjcxNyAxIDEgMCAwIDEtMS4xMzEtMS4xMzEgMi41IDIuNSAwIDAgMC0uNzE3LTIuMTUyQTEgMSAwIDAgMSAzIDE2aDQiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIENhbmR5ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgN3YxMC45IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDYuMVYxNyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNiA3VjNhMSAxIDAgMCAxIDEuNzA3LS43MDcgMi41IDIuNSAwIDAgMCAyLjE1Mi43MTcgMSAxIDAgMCAxIDEuMTMxIDEuMTMxIDIuNSAyLjUgMCAwIDAgLjcxNyAyLjE1MkExIDEgMCAwIDEgMjEgOGgtNCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNi41MzYgNy40NjVhNSA1IDAgMCAwLTcuMDcyIDBsLTIgMmE1IDUgMCAwIDAgMCA3LjA3IDUgNSAwIDAgMCA3LjA3MiAwbDItMmE1IDUgMCAwIDAgMC03LjA3IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTggMTd2NGExIDEgMCAwIDEtMS43MDcuNzA3IDIuNSAyLjUgMCAwIDAtMi4xNTItLjcxNyAxIDEgMCAwIDEtMS4xMzEtMS4xMzEgMi41IDIuNSAwIDAgMC0uNzE3LTIuMTUyQTEgMSAwIDAgMSAzIDE2aDQiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIENhbm5hYmlzT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjJ2LTRjMS41IDEuNSAzLjUgMyA2IDMgMC0xLjUtLjUtMy41LTItNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMy45ODggOC4zMjdDMTMuOTAyIDYuMDU0IDEzLjM2NSAzLjgyIDEyIDJhOS4zIDkuMyAwIDAgMC0xLjQ0NSAyLjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuMzc1IDExLjcyNUMxOC44ODIgMTAuNTMgMjEgNy44NDEgMjEgNmMtMi4zMjQgMC01LjA4IDEuMjk2LTYuNjYyIDIuNjg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMS4wMjQgMTUuMzc4QTE1IDE1IDAgMCAwIDIyIDE1Yy0uNDI2LTEuMjc5LTIuNjctMi41NTctNC4yNS0yLjkwNyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02Ljk5NSA2Ljk5MkM1LjcxNCA2LjQgNC4yOSA2IDMgNmMwIDIgMi41IDUgNCA2LTEuNSAwLTQuNSAxLjUtNSAzIDMuNSAxLjUgNiAxIDYgMS0xLjUgMS41LTIgMy41LTIgNSAyLjUgMCA0LjUtMS41IDYtMyIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgQ2FubmFiaXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMnYtNCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk03IDEyYy0xLjUgMC00LjUgMS41LTUgMyAzLjUgMS41IDYgMSA2IDEtMS41IDEuNS0yIDMuNS0yIDUgMi41IDAgNC41LTEuNSA2LTMgMS41IDEuNSAzLjUgMyA2IDMgMC0xLjUtLjUtMy41LTItNSAwIDAgMi41LjUgNi0xLS41LTEuNS0zLjUtMy01LTMgMS41LTEgNC00IDQtNi0yLjUgMC01LjUgMS41LTcgMyAwLTIuNS0uNS01LTItNy0xLjUgMi0yIDQuNS0yIDctMS41LTEuNS00LjUtMy03LTMgMCAyIDIuNSA1IDQgNiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgQ2FwdGlvbnNPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC41IDVIMTlhMiAyIDAgMCAxIDIgMnY4LjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTFoLS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE5SDVhMiAyIDAgMCAxLTItMlY3YTIgMiAwIDAgMSAyLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTFoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE1aDIuNSIgfV0KICAgIF07CiAgICB2YXIgQ2FwdGlvbnMgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE0IiwgeDogIjMiLCB5OiAiNSIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE1aDRNMTUgMTVoMk03IDExaDJNMTMgMTFoNCIgfV0KICAgIF07CiAgICB2YXIgQ2FyRnJvbnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSA4LTIgMi0xLjUtMy43QTIgMiAwIDAgMCAxNS42NDYgNUg4LjRhMiAyIDAgMCAwLTEuOTAzIDEuMjU3TDUgMTAgMyA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTRoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDE0aC4wMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjgiLCB4OiAiMyIsIHk6ICIxMCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE4djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMTh2MiIgfV0KICAgIF07CiAgICB2YXIgQ2FyVGF4aUZyb250ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMmg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDgtMiAyLTEuNS0zLjdBMiAyIDAgMCAwIDE1LjY0NiA1SDguNGEyIDIgMCAwIDAtMS45MDMgMS4yNTdMNSAxMCAzIDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxNGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTRoLjAxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiOCIsIHg6ICIzIiwgeTogIjEwIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTh2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxOHYyIiB9XQogICAgXTsKICAgIHZhciBDYXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOSAxN2gyYy42IDAgMS0uNCAxLTF2LTNjMC0uOS0uNy0xLjctMS41LTEuOUMxOC43IDEwLjYgMTYgMTAgMTYgMTBzLTEuMy0xLjQtMi4yLTIuM2MtLjUtLjQtMS4xLS43LTEuOC0uN0g1Yy0uNiAwLTEuMS40LTEuNC45bC0xLjQgMi45QTMuNyAzLjcgMCAwIDAgMiAxMnY0YzAgLjYuNCAxIDEgMWgyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNyIsIGN5OiAiMTciLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE3aDYiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNyIsIGN5OiAiMTciLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgQ2FyYXZhbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE5VjlhNCA0IDAgMCAwLTQtNEg2YTQgNCAwIDAgMC00IDR2OGEyIDIgMCAwIDAgMiAyaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA5aDNhMSAxIDAgMCAxIDEgMXYyYTEgMSAwIDAgMS0xIDFIMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxN3YxYTEgMSAwIDAgMS0xIDFIMTB2LTlhMSAxIDAgMCAxIDEtMWgyYTEgMSAwIDAgMSAxIDF2OSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjgiLCBjeTogIjE5IiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIENhcmRTaW0gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNHY0IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE0LjE3MiAyYTIgMiAwIDAgMSAxLjQxNC41ODZsMy44MjggMy44MjhBMiAyIDAgMCAxIDIwIDcuODI4VjIwYTIgMiAwIDAgMS0yIDJINmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNGg4IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiOCIsIHk6ICIxMCIsIHdpZHRoOiAiOCIsIGhlaWdodDogIjgiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIENhcnJvdCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuMjcgMjEuN3M5Ljg3LTMuNSAxMi43My02LjM2YTQuNSA0LjUgMCAwIDAtNi4zNi02LjM3QzUuNzcgMTEuODQgMi4yNyAyMS43IDIuMjcgMjEuN3pNOC42NCAxNGwtMi4wNS0yLjA0TTE1LjM0IDE1bC0yLjQ2LTIuNDYiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgOXMtMS4zMy0yLTMuNS0yQzE2Ljg2IDcgMTUgOSAxNSA5czEuMzMgMiAzLjUgMlMyMiA5IDIyIDl6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDJzLTIgMS4zMy0yIDMuNVMxNSA5IDE1IDlzMi0xLjg0IDItMy41QzE3IDMuMzMgMTUgMiAxNSAyeiIgfV0KICAgIF07CiAgICB2YXIgQ2FzZUxvd2VyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOXY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDZ2MTAiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNy41IiwgY3k6ICIxMi41IiwgcjogIjMuNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYuNSIsIGN5OiAiMTIuNSIsIHI6ICIzLjUiIH1dCiAgICBdOwogICAgdmFyIENhc2VTZW5zaXRpdmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDE2IDQuMDM5LTkuNjlhLjUuNSAwIDAgMSAuOTIzIDBMMTEgMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgOXY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuMzA0IDEzaDYuMzkyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTguNSIsIGN5OiAiMTIuNSIsIHI6ICIzLjUiIH1dCiAgICBdOwogICAgdmFyIENhc2VVcHBlciA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTUgMTFoNC41YTEgMSAwIDAgMSAwIDVoLTRhLjUuNSAwIDAgMS0uNS0uNXYtOWEuNS41IDAgMCAxIC41LS41aDNhMSAxIDAgMCAxIDAgNSIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAxNiA0LjAzOS05LjY5YS41LjUgMCAwIDEgLjkyMyAwTDExIDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuMzA0IDEzaDYuMzkyIiB9XQogICAgXTsKICAgIHZhciBDYXN0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA4VjZhMiAyIDAgMCAxIDItMmgxNmEyIDIgMCAwIDEgMiAydjEyYTIgMiAwIDAgMS0yIDJoLTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmE5IDkgMCAwIDEgOCA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTZhNSA1IDAgMCAxIDQgNCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIyIiwgeDI6ICIyLjAxIiwgeTE6ICIyMCIsIHkyOiAiMjAiIH1dCiAgICBdOwogICAgdmFyIENhc3NldHRlVGFwZSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTYiLCB4OiAiMiIsIHk6ICI0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOCIsIGN5OiAiMTAiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEyaDgiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNiIsIGN5OiAiMTAiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02IDIwIC43LTIuOUExLjQgMS40IDAgMCAxIDguMSAxNmg3LjhhMS40IDEuNCAwIDAgMSAxLjQgMWwuNyAzIiB9XQogICAgXTsKICAgIHZhciBDYXQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMiA1Yy42NyAwIDEuMzUuMDkgMiAuMjYgMS43OC0yIDUuMDMtMi44NCA2LjQyLTIuMjYgMS40LjU4LS40MiA3LS40MiA3IC41NyAxLjA3IDEgMi4yNCAxIDMuNDRDMjEgMTcuOSAxNi45NyAyMSAxMiAyMXMtOS0zLTktNy41NmMwLTEuMjUuNS0yLjQgMS0zLjQ0IDAgMC0xLjg5LTYuNDItLjUtNyAxLjM5LS41OCA0LjcyLjIzIDYuNSAyLjIzQTkuMDQgOS4wNCAwIDAgMSAxMiA1WiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE0di41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE0di41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExLjI1IDE2LjI1aDEuNUwxMiAxN2wtLjc1LS43NVoiIH1dCiAgICBdOwogICAgdmFyIENhc3RsZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDVWMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA1VjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMjF2LTNhMyAzIDAgMCAwLTYgMHYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDN2OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA1SDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTFIMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiA5djEwYTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAzdjgiIH1dCiAgICBdOwogICAgdmFyIENjdHYgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTE2Ljc1IDEyaDMuNjMyYTEgMSAwIDAgMSAuODk0IDEuNDQ3bC0yLjAzNCA0LjA2OWExIDEgMCAwIDEtMS43MDguMTM0bC0yLjEyNC0yLjk3IiB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNy4xMDYgOS4wNTNhMSAxIDAgMCAxIC40NDcgMS4zNDFsLTMuMTA2IDYuMjExYTEgMSAwIDAgMS0xLjM0Mi40NDdMMy42MSAxMi4zYTIuOTIgMi45MiAwIDAgMS0xLjMtMy45MUwzLjY5IDUuNmEyLjkyIDIuOTIgMCAwIDEgMy45Mi0xLjN6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTloMy43NmEyIDIgMCAwIDAgMS44LTEuMUw5IDE1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjF2LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyA5aC4wMSIgfV0KICAgIF07CiAgICB2YXIgQ2hhcnRBcmVhID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjE2YTIgMiAwIDAgMCAyIDJoMTYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNyAxMS4yMDdhLjUuNSAwIDAgMSAuMTQ2LS4zNTNsMi0yYS41LjUgMCAwIDEgLjcwOCAwbDMuMjkyIDMuMjkyYS41LjUgMCAwIDAgLjcwOCAwbDQuMjkyLTQuMjkyYS41LjUgMCAwIDEgLjg1NC4zNTNWMTZhMSAxIDAgMCAxLTEgMUg4YTEgMSAwIDAgMS0xLTF6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBDaGFydEJhckJpZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgM3YxNmEyIDIgMCAwIDAgMiAyaDE2IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiNyIsIHk6ICIxMyIsIHdpZHRoOiAiOSIsIGhlaWdodDogIjQiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI3IiwgeTogIjUiLCB3aWR0aDogIjEyIiwgaGVpZ2h0OiAiNCIsIHJ4OiAiMSIgfV0KICAgIF07CiAgICB2YXIgQ2hhcnRCYXJEZWNyZWFzaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjE2YTIgMiAwIDAgMCAyIDJoMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMWg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTZoMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDZoMTIiIH1dCiAgICBdOwogICAgdmFyIENoYXJ0QmFySW5jcmVhc2luZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgM3YxNmEyIDIgMCAwIDAgMiAyaDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTFoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE2aDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNmgzIiB9XQogICAgXTsKICAgIHZhciBDaGFydEJhclN0YWNrZWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxM3Y0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDV2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDN2MTZhMiAyIDAgMCAwIDIgMmgxNiIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjciLCB5OiAiMTMiLCB3aWR0aDogIjkiLCBoZWlnaHQ6ICI0Iiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiNyIsIHk6ICI1Iiwgd2lkdGg6ICIxMiIsIGhlaWdodDogIjQiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIENoYXJ0Q2FuZGxlc3RpY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDV2NCIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI0IiwgaGVpZ2h0OiAiNiIsIHg6ICI3IiwgeTogIjkiLCByeDogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNXYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDN2MiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI0IiwgaGVpZ2h0OiAiOCIsIHg6ICIxNSIsIHk6ICI1Iiwgcng6ICIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDEzdjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjE2YTIgMiAwIDAgMCAyIDJoMTYiIH1dCiAgICBdOwogICAgdmFyIENoYXJ0Q29sdW1uQmlnID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjE2YTIgMiAwIDAgMCAyIDJoMTYiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIxNSIsIHk6ICI1Iiwgd2lkdGg6ICI0IiwgaGVpZ2h0OiAiMTIiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI3IiwgeTogIjgiLCB3aWR0aDogIjQiLCBoZWlnaHQ6ICI5Iiwgcng6ICIxIiB9XQogICAgXTsKICAgIHZhciBDaGFydEJhciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgM3YxNmEyIDIgMCAwIDAgMiAyaDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTZoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDExaDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNmgzIiB9XQogICAgXTsKICAgIHZhciBDaGFydENvbHVtbkRlY3JlYXNpbmcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxN1Y5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE3di0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgM3YxNmEyIDIgMCAwIDAgMiAyaDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTdWNSIgfV0KICAgIF07CiAgICB2YXIgQ2hhcnRDb2x1bW5JbmNyZWFzaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMTdWOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxN1Y1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgM3YxNmEyIDIgMCAwIDAgMiAyaDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTd2LTMiIH1dCiAgICBdOwogICAgdmFyIENoYXJ0Q29sdW1uU3RhY2tlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDEzSDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgOWgtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDN2MTZhMiAyIDAgMCAwIDIgMmgxNiIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjE1IiwgeTogIjUiLCB3aWR0aDogIjQiLCBoZWlnaHQ6ICIxMiIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjciLCB5OiAiOCIsIHdpZHRoOiAiNCIsIGhlaWdodDogIjkiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIENoYXJ0Q29sdW1uID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjE2YTIgMiAwIDAgMCAyIDJoMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTdWOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxN1Y1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTd2LTMiIH1dCiAgICBdOwogICAgdmFyIENoYXJ0TGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgM3YxNmEyIDIgMCAwIDAgMiAyaDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5IDktNSA1LTQtNC0zIDMiIH1dCiAgICBdOwogICAgdmFyIENoYXJ0R2FudHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA2aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTZoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDN2MTZhMiAyIDAgMCAwIDIgMmgxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDExaDciIH1dCiAgICBdOwogICAgdmFyIENoYXJ0TmV0d29yayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEzLjExIDcuNjY0IDEuNzggMi42NzIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuMTYyIDEyLjc4OC0zLjMyNCAxLjQyNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMCA0LTYuMDYgMS41MTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjE2YTIgMiAwIDAgMCAyIDJoMTYiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiNiIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYiLCBjeTogIjEyIiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICIxNSIsIHI6ICIyIiB9XQogICAgXTsKICAgIHZhciBDaGFydE5vQXhlc0NvbHVtbkRlY3JlYXNpbmcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDIxVjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjFWOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAyMXYtNiIgfV0KICAgIF07CiAgICB2YXIgQ2hhcnROb0F4ZXNDb2x1bW5JbmNyZWFzaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMXYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMVY5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDIxVjMiIH1dCiAgICBdOwogICAgdmFyIENoYXJ0Tm9BeGVzQ29sdW1uID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMXYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMVYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDIxVjkiIH1dCiAgICBdOwogICAgdmFyIENoYXJ0Tm9BeGVzR2FudHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDVoMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMmgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOWg4IiB9XQogICAgXTsKICAgIHZhciBDaGFydE5vQXhlc0NvbWJpbmVkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTZ2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNHY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDEwdjExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDMtOC42NDYgOC42NDZhLjUuNSAwIDAgMS0uNzA4IDBMOS4zNTQgOC4zNTRhLjUuNSAwIDAgMC0uNzA3IDBMMiAxNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE4djMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNHY3IiB9XQogICAgXTsKICAgIHZhciBDaGFydFBpZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxIDEyYy41NTIgMCAxLjAwNS0uNDQ5Ljk1LS45OThhMTAgMTAgMCAwIDAtOC45NTMtOC45NTFjLS41NS0uMDU1LS45OTguMzk4LS45OTguOTV2OGExIDEgMCAwIDAgMSAxeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMS4yMSAxNS44OUExMCAxMCAwIDEgMSA4IDIuODMiIH1dCiAgICBdOwogICAgdmFyIENoYXJ0U2NhdHRlciA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNy41IiwgY3k6ICI3LjUiLCByOiAiLjUiLCBmaWxsOiAiY3VycmVudENvbG9yIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTguNSIsIGN5OiAiNS41IiwgcjogIi41IiwgZmlsbDogImN1cnJlbnRDb2xvciIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjExLjUiLCBjeTogIjExLjUiLCByOiAiLjUiLCBmaWxsOiAiY3VycmVudENvbG9yIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNy41IiwgY3k6ICIxNi41IiwgcjogIi41IiwgZmlsbDogImN1cnJlbnRDb2xvciIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE3LjUiLCBjeTogIjE0LjUiLCByOiAiLjUiLCBmaWxsOiAiY3VycmVudENvbG9yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgM3YxNmEyIDIgMCAwIDAgMiAyaDE2IiB9XQogICAgXTsKICAgIHZhciBDaGFydFNwbGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgM3YxNmEyIDIgMCAwIDAgMiAyaDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTZjLjUtMiAxLjUtNyA0LTcgMiAwIDIgMyA0IDMgMi41IDAgNC41LTUgNS03IiB9XQogICAgXTsKICAgIHZhciBDaGVja0NoZWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggNiA3IDE3bC01LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgMTAtNy41IDcuNUwxMyAxNiIgfV0KICAgIF07CiAgICB2YXIgQ2hlY2sgPSBbWyJwYXRoIiwgeyBkOiAiTTIwIDYgOSAxN2wtNS01IiB9XV07CiAgICB2YXIgQ2hlY2tMaW5lID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgNEw5IDE1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE5TDMgMTkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNUw0IDEwIiB9XQogICAgXTsKICAgIHZhciBDaGVmSGF0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTcgMjFhMSAxIDAgMCAwIDEtMXYtNS4zNWMwLS40NTcuMzE2LS44NDQuNzI3LTEuMDQxYTQgNCAwIDAgMC0yLjEzNC03LjU4OSA1IDUgMCAwIDAtOS4xODYgMCA0IDQgMCAwIDAtMi4xMzQgNy41ODhjLjQxMS4xOTguNzI3LjU4NS43MjcgMS4wNDFWMjBhMSAxIDAgMCAwIDEgMVoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxN2gxMiIgfV0KICAgIF07CiAgICB2YXIgQ2hlcnJ5ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxN2E1IDUgMCAwIDAgMTAgMGMwLTIuNzYtMi41LTUtNS0zLTIuNS0yLTUgLjI0LTUgM1oiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTdhNSA1IDAgMCAwIDEwIDBjMC0yLjc2LTIuNS01LTUtMy0yLjUtMi01IC4yNC01IDNaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTRjMy4yMi0yLjkxIDQuMjktOC43NSA1LTEyIDEuNjYgMi4zOCA0Ljk0IDkgNSAxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiA5Yy00LjI5IDAtNy4xNC0yLjMzLTEwLTcgNS43MSAwIDEwIDQuNjcgMTAgN1oiIH1dCiAgICBdOwogICAgdmFyIENoZXNzQmlzaG9wID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMGEyIDIgMCAwIDEgMi0yaDEwYTIgMiAwIDAgMSAyIDJ2MWExIDEgMCAwIDEtMSAxSDZhMSAxIDAgMCAxLTEtMXoiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTUgMThjMS41LS42MTUgMy0yLjQ2MSAzLTQuOTIzQzE4IDguNzY5IDE0LjUgNC40NjIgMTIgMiA5LjUgNC40NjIgNiA4Ljc3IDYgMTMuMDc3IDYgMTUuNTM5IDcuNSAxNy4zODUgOSAxOCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiA3LTIuNSAyLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAyaDYiIH1dCiAgICBdOwogICAgdmFyIENoZXNzS2luZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMjBhMiAyIDAgMCAxIDItMmgxMmEyIDIgMCAwIDEgMiAydjFhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMS0xLTF6IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTYuNyAxOC0xLTFDNC4zNSAxNS42ODIgMyAxNC4wOSAzIDEyYTUgNSAwIDAgMSA0Ljk1LTVjMS41ODQgMCAyLjcuNDU1IDQuMDUgMS44MThDMTMuMzUgNy40NTUgMTQuNDY2IDcgMTYuMDUgN0E1IDUgMCAwIDEgMjEgMTJjMCAyLjA4Mi0xLjM1OSAzLjY3My0yLjcgNWwtMSAxIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDRoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjYuODE4IiB9XQogICAgXTsKICAgIHZhciBDaGVzc0tuaWdodCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMjBhMiAyIDAgMCAxIDItMmgxMGEyIDIgMCAwIDEgMiAydjFhMSAxIDAgMCAxLTEgMUg2YTEgMSAwIDAgMS0xLTF6IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE2LjUgMThjMS0yIDIuNS01IDIuNS05YTcgNyAwIDAgMC03LTdINi42MzVhMSAxIDAgMCAwLS43NjggMS42NEw3IDVsLTIuMzIgNS44MDJhMiAyIDAgMCAwIC45NSAyLjUyNmwyLjg3IDEuNDU2IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDUgMS40MjUtMS40MjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgOCAxLjUzLTEuNTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS43MTMgMTIuMTg1IDcgMTgiIH1dCiAgICBdOwogICAgdmFyIENoZXNzUGF3biA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMjBhMiAyIDAgMCAxIDItMmgxMGEyIDIgMCAwIDEgMiAydjFhMSAxIDAgMCAxLTEgMUg2YTEgMSAwIDAgMS0xLTF6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0LjUgMTAgMS41IDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMGgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDE4IDEuNS04IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjYiLCByOiAiNCIgfV0KICAgIF07CiAgICB2YXIgQ2hlc3NRdWVlbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMjBhMiAyIDAgMCAxIDItMmgxMmEyIDIgMCAwIDEgMiAydjFhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMS0xLTF6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyLjQ3NCA1Ljk0MyAxLjU2NyA1LjM0YTEgMSAwIDAgMCAxLjc1LjMyOGwyLjYxNi0zLjQwMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMCA5LTMgOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01LjU5NCA4LjIwOSAyLjYxNSAzLjQwM2ExIDEgMCAwIDAgMS43NS0uMzI5bDEuNTY3LTUuMzQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxOCA0IDkiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiNCIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMjAiLCBjeTogIjciLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjQiLCBjeTogIjciLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgQ2hlc3NSb29rID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMGEyIDIgMCAwIDEgMi0yaDEwYTIgMiAwIDAgMSAyIDJ2MWExIDEgMCAwIDEtMSAxSDZhMSAxIDAgMCAxLTEtMXoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAxOC0xLTkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAydjVhMiAyIDAgMCAwIDIgMmg4YTIgMiAwIDAgMCAyLTJWMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDRoMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNyAxOCAxLTkiIH1dCiAgICBdOwogICAgdmFyIENoZXZyb25Eb3duID0gW1sicGF0aCIsIHsgZDogIm02IDkgNiA2IDYtNiIgfV1dOwogICAgdmFyIENoZXZyb25GaXJzdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDE4LTYtNiA2LTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyA2djEyIiB9XQogICAgXTsKICAgIHZhciBDaGV2cm9uTGFzdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMTggNi02LTYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyA2djEyIiB9XQogICAgXTsKICAgIHZhciBDaGV2cm9uTGVmdCA9IFtbInBhdGgiLCB7IGQ6ICJtMTUgMTgtNi02IDYtNiIgfV1dOwogICAgdmFyIENoZXZyb25SaWdodCA9IFtbInBhdGgiLCB7IGQ6ICJtOSAxOCA2LTYtNi02IiB9XV07CiAgICB2YXIgQ2hldnJvbnNEb3duVXAgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm03IDIwIDUtNSA1IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNyA0IDUgNSA1LTUiIH1dCiAgICBdOwogICAgdmFyIENoZXZyb25VcCA9IFtbInBhdGgiLCB7IGQ6ICJtMTggMTUtNi02LTYgNiIgfV1dOwogICAgdmFyIENoZXZyb25zRG93biA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgNiA1IDUgNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMTMgNSA1IDUtNSIgfV0KICAgIF07CiAgICB2YXIgQ2hldnJvbnNMZWZ0UmlnaHRFbGxpcHNpcyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEyaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgNyA1IDUtNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgNy01IDUgNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJoLjAxIiB9XQogICAgXTsKICAgIHZhciBDaGV2cm9uc0xlZnRSaWdodCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgNy01IDUgNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDcgNSA1LTUgNSIgfV0KICAgIF07CiAgICB2YXIgQ2hldnJvbnNMZWZ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTEgMTctNS01IDUtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOCAxNy01LTUgNS01IiB9XQogICAgXTsKICAgIHZhciBDaGV2cm9uc1JpZ2h0TGVmdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwIDE3LTUtNSA1LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNCAxNyA1LTUtNS01IiB9XQogICAgXTsKICAgIHZhciBDaGV2cm9uc1JpZ2h0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtNiAxNyA1LTUtNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEzIDE3IDUtNS01LTUiIH1dCiAgICBdOwogICAgdmFyIENoZXZyb25zVXBEb3duID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtNyAxNSA1IDUgNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgOSA1LTUgNSA1IiB9XQogICAgXTsKICAgIHZhciBDaGV2cm9uc1VwID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMTEtNS01LTUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAxOC01LTUtNSA1IiB9XQogICAgXTsKICAgIHZhciBDaHJvbWl1bSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjg4IDIxLjk0IDE1LjQ2IDE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxLjE3IDhIMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy45NSA2LjA2IDguNTQgMTQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiNCIgfV0KICAgIF07CiAgICB2YXIgQ2h1cmNoID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOWg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAyMXYtM2EyIDIgMCAwIDAtNCAwdjMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTggOSAzLjUyIDIuMTQ3YTEgMSAwIDAgMSAuNDguODU0VjE5YTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0ydi02Ljk5OWExIDEgMCAwIDEgLjQ4LS44NTRMNiA5IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMjFWN2ExIDEgMCAwIDEgLjM3Ni0uNzgybDUtMy45OTlhMSAxIDAgMCAxIDEuMjQ5LjAwMWw1IDRBMSAxIDAgMCAxIDE4IDd2MTQiIH1dCiAgICBdOwogICAgdmFyIENpZ2FyZXR0ZU9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEySDNhMSAxIDAgMCAwLTEgMXYyYTEgMSAwIDAgMCAxIDFoMTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggOGMwLTIuNS0yLTIuNS0yLTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEyYTEgMSAwIDAgMSAxIDF2MmExIDEgMCAwIDEtLjUuODY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDhjMC0yLjUtMi0yLjUtMi01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTJ2NCIgfV0KICAgIF07CiAgICB2YXIgQ2lnYXJldHRlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTJIM2ExIDEgMCAwIDAtMSAxdjJhMSAxIDAgMCAwIDEgMWgxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA4YzAtMi41LTItMi41LTItNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNmExIDEgMCAwIDAgMS0xdi0yYTEgMSAwIDAgMC0xLTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgOGMwLTIuNS0yLTIuNS0yLTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMnY0IiB9XQogICAgXTsKICAgIHZhciBDaXJjbGVBbGVydCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEyIiwgeDI6ICIxMiIsIHkxOiAiOCIsIHkyOiAiMTIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyLjAxIiwgeTE6ICIxNiIsIHkyOiAiMTYiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZUFycm93RG93biA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDh2OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDEyIDQgNCA0LTQiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZUFycm93TGVmdCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDgtNCA0IDQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMkg4IiB9XQogICAgXTsKICAgIHZhciBDaXJjbGVBcnJvd091dERvd25MZWZ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmExMCAxMCAwIDEgMSAxMCAxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIyIDEwLTEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjJIMnYtNiIgfV0KICAgIF07CiAgICB2YXIgQ2lyY2xlQXJyb3dPdXREb3duUmlnaHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMmExMCAxMCAwIDEgMSAxMC0xMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAyMiAxMiAxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxNnY2aC02IiB9XQogICAgXTsKICAgIHZhciBDaXJjbGVBcnJvd091dFVwTGVmdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgOFYyaDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDEwIDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJBMTAgMTAgMCAxIDEgMiAxMiIgfV0KICAgIF07CiAgICB2YXIgQ2lyY2xlQXJyb3dPdXRVcFJpZ2h0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTJBMTAgMTAgMCAxIDEgMTIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAyIDEyIDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDJoNnY2IiB9XQogICAgXTsKICAgIHZhciBDaXJjbGVBcnJvd1JpZ2h0ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIgMTYgNC00LTQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEyaDgiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZUFycm93VXAgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAxMi00LTQtNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE2VjgiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZUNoZWNrQmlnID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEuODAxIDEwQTEwIDEwIDAgMSAxIDE3IDMuMzM1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTEgMyAzTDIyIDQiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZUNoZWNrID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxMiAyIDIgNC00IiB9XQogICAgXTsKICAgIHZhciBDaXJjbGVDaGV2cm9uTGVmdCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDE2LTQtNCA0LTQiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZUNoZXZyb25Eb3duID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTAtNCA0LTQtNCIgfV0KICAgIF07CiAgICB2YXIgQ2lyY2xlQ2hldnJvblJpZ2h0ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgOCA0IDQtNCA0IiB9XQogICAgXTsKICAgIHZhciBDaXJjbGVDaGV2cm9uVXAgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDE0IDQtNCA0IDQiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZURhc2hlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjEgMi4xODJhMTAgMTAgMCAwIDEgMy44IDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMuOSAyMS44MThhMTAgMTAgMCAwIDEtMy44IDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuNjA5IDMuNzIxYTEwIDEwIDAgMCAxIDIuNjkgMi43IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIuMTgyIDEzLjlhMTAgMTAgMCAwIDEgMC0zLjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAuMjc5IDE3LjYwOWExMCAxMCAwIDAgMS0yLjcgMi42OSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMS44MTggMTAuMWExMCAxMCAwIDAgMSAwIDMuOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zLjcyMSA2LjM5MWExMCAxMCAwIDAgMSAyLjctMi42OSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjM5MSAyMC4yNzlhMTAgMTAgMCAwIDEtMi42OS0yLjciIH1dCiAgICBdOwogICAgdmFyIENpcmNsZURpdmlkZSA9IFsKICAgICAgWyJsaW5lIiwgeyB4MTogIjgiLCB4MjogIjE2IiwgeTE6ICIxMiIsIHkyOiAiMTIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICIxNiIsIHkyOiAiMTYiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICI4IiwgeTI6ICI4IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XQogICAgXTsKICAgIHZhciBDaXJjbGVEb2xsYXJTaWduID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgOGgtNmEyIDIgMCAxIDAgMCA0aDRhMiAyIDAgMSAxIDAgNEg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4VjYiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZURvdERhc2hlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjEgMi4xOGE5LjkzIDkuOTMgMCAwIDEgMy44IDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuNiAzLjcxYTkuOTUgOS45NSAwIDAgMSAyLjY5IDIuNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMS44MiAxMC4xYTkuOTMgOS45MyAwIDAgMSAwIDMuOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC4yOSAxNy42YTkuOTUgOS45NSAwIDAgMS0yLjcgMi42OSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMy45IDIxLjgyYTkuOTQgOS45NCAwIDAgMS0zLjggMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjQgMjAuMjlhOS45NSA5Ljk1IDAgMCAxLTIuNjktMi43IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIuMTggMTMuOWE5LjkzIDkuOTMgMCAwIDEgMC0zLjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy43MSA2LjRhOS45NSA5Ljk1IDAgMCAxIDIuNy0yLjY5IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZURvdCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZUVsbGlwc2lzID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEyaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEyaC4wMSIgfV0KICAgIF07CiAgICB2YXIgQ2lyY2xlRXF1YWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEwaDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTRoMTAiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZUZhZGluZ0Fycm93VXAgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyYTEwIDEwIDAgMCAxIDcuMzggMTYuNzUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTItNC00LTQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNlY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIuNSA4Ljg3NWExMCAxMCAwIDAgMC0uNSAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIuODMgMTZhMTAgMTAgMCAwIDAgMi40MyAzLjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC42MzYgNS4yMzVhMTAgMTAgMCAwIDEgLjg5MS0uODU3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguNjQ0IDIxLjQyYTEwIDEwIDAgMCAwIDcuNjMxLS4zOCIgfV0KICAgIF07CiAgICB2YXIgQ2lyY2xlRmFkaW5nUGx1cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJhMTAgMTAgMCAwIDEgNy4zOCAxNi43NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA4djgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTJIOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yLjUgOC44NzVhMTAgMTAgMCAwIDAtLjUgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yLjgzIDE2YTEwIDEwIDAgMCAwIDIuNDMgMy40IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQuNjM2IDUuMjM1YTEwIDEwIDAgMCAxIC44OTEtLjg1NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjY0NCAyMS40MmExMCAxMCAwIDAgMCA3LjYzMS0uMzgiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZUdhdWdlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUuNiAyLjdhMTAgMTAgMCAxIDAgNS43IDUuNyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjQgMTAuNiAxOSA1IiB9XQogICAgXTsKICAgIHZhciBDaXJjbGVNaW51cyA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJoOCIgfV0KICAgIF07CiAgICB2YXIgQ2lyY2xlT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguMzUgMi42OUExMCAxMCAwIDAgMSAyMS4zIDE1LjY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5LjA4IDE5LjA4QTEwIDEwIDAgMSAxIDQuOTIgNC45MiIgfV0KICAgIF07CiAgICB2YXIgQ2lyY2xlUGFya2luZ09mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyLjY1NiA3SDEzYTMgMyAwIDAgMSAyLjk4NCAzLjMwNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxM0g5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5LjA3MSAxOS4wNzFBMSAxIDAgMCAxIDQuOTMgNC45MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC4zNTcgMi42ODdhMTAgMTAgMCAwIDEgMTIuOTU2IDEyLjk1NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE3VjkiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZVBhcmtpbmcgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE3VjdoNGEzIDMgMCAwIDEgMCA2SDkiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZVBhdXNlID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTAiLCB4MjogIjEwIiwgeTE6ICIxNSIsIHkyOiAiOSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNCIsIHgyOiAiMTQiLCB5MTogIjE1IiwgeTI6ICI5IiB9XQogICAgXTsKICAgIHZhciBDaXJjbGVQZXJjZW50ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgOS02IDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA5aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxNWguMDEiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZVBpbGUgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxOSIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjUiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE2IiwgY3k6ICIxMiIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMjAiLCBjeTogIjE5IiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI0IiwgY3k6ICIxOSIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOCIsIGN5OiAiMTIiLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgQ2lyY2xlUGxheSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTkgOS4wMDNhMSAxIDAgMCAxIDEuNTE3LS44NTlsNC45OTcgMi45OTdhMSAxIDAgMCAxIDAgMS43MThsLTQuOTk3IDIuOTk3QTEgMSAwIDAgMSA5IDE0Ljk5NnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZVBsdXMgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEyaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOHY4IiB9XQogICAgXTsKICAgIHZhciBDaXJjbGVQb3dlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03Ljk5OCA5LjAwM2E1IDUgMCAxIDAgOC0uMDA1IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XQogICAgXTsKICAgIHZhciBDaXJjbGVQb3VuZFN0ZXJsaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTZWOS41YTEgMSAwIDAgMSA1IDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTZoNyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0KICAgIF07CiAgICB2YXIgQ2lyY2xlUXVlc3Rpb25NYXJrID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS4wOSA5YTMgMyAwIDAgMSA1LjgzIDFjMCAyLTMgMy0zIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTdoLjAxIiB9XQogICAgXTsKICAgIHZhciBDaXJjbGVTbGFzaDIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAyIDIgMjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZVNsYXNoID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiOSIsIHgyOiAiMTUiLCB5MTogIjE1IiwgeTI6ICI5IiB9XQogICAgXTsKICAgIHZhciBDaXJjbGVTbWFsbCA9IFtbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiNiIgfV1dOwogICAgdmFyIENpcmNsZVN0YXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMS4wNTEgNy42MTZhMSAxIDAgMCAxIDEuOTA5LjAyNGwuNzM3IDEuNDUyYTEgMSAwIDAgMCAuNzM3LjUzNWwxLjYzNC4yNTZhMSAxIDAgMCAxIC41ODggMS44MDZsLTEuMTcyIDEuMTY4YTEgMSAwIDAgMC0uMjgyLjg2NmwuMjU5IDEuNjEzYTEgMSAwIDAgMS0xLjU0MSAxLjEzNGwtMS40NjUtLjc1YTEgMSAwIDAgMC0uOTEyIDBsLTEuNDY1Ljc1YTEgMSAwIDAgMS0xLjUzOS0xLjEzM2wuMjU4LTEuNjEzYTEgMSAwIDAgMC0uMjgyLS44NjdsLTEuMTU2LTEuMTUyYTEgMSAwIDAgMSAuNTcyLTEuODIybDEuNjMzLS4yNTZhMSAxIDAgMCAwIC43MzctLjUzNXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZVN0b3AgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjkiLCB5OiAiOSIsIHdpZHRoOiAiNiIsIGhlaWdodDogIjYiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZVVzZXJSb3VuZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDIwYTYgNiAwIDAgMC0xMiAwIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEwIiwgcjogIjQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dCiAgICBdOwogICAgdmFyIENpcmNsZVVzZXIgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMCIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjAuNjYyVjE5YTIgMiAwIDAgMSAyLTJoNmEyIDIgMCAwIDEgMiAydjEuNjYyIiB9XQogICAgXTsKICAgIHZhciBDaXJjbGVYID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgOS02IDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSA5IDYgNiIgfV0KICAgIF07CiAgICB2YXIgQ2lyY2xlID0gW1siY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV1dOwogICAgdmFyIENpcmN1aXRCb2FyZCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDloNGEyIDIgMCAwIDAgMi0yVjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICI5IiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMXYtNGEyIDIgMCAwIDEgMi0yaDQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNSIsIGN5OiAiMTUiLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgQ2l0cnVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk0yMS42NiAxNy42N2ExLjA4IDEuMDggMCAwIDEtLjA0IDEuNkExMiAxMiAwIDAgMSA0LjczIDIuMzhhMS4xIDEuMSAwIDAgMSAxLjYxLS4wNHoiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5LjY1IDE1LjY2QTggOCAwIDAgMSA4LjM1IDQuMzQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgMTAtNS41IDUuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxNy44NVYxMEg2LjE1IiB9XQogICAgXTsKICAgIHZhciBDbGFwcGVyYm9hcmQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC4yIDYgMyAxMWwtLjktMi40Yy0uMy0xLjEuMy0yLjIgMS4zLTIuNWwxMy41LTRjMS4xLS4zIDIuMi4zIDIuNSAxLjNaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYuMiA1LjMgMy4xIDMuOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMi40IDMuNCAzLjEgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDExaDE4djhhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJaIiB9XQogICAgXTsKICAgIHZhciBDbGlwYm9hcmRDbG9jayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE0djIuMmwxLjYgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA0aDJhMiAyIDAgMCAxIDIgMnYuODMyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggNEg2YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYiLCBjeTogIjE2IiwgcjogIjYiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI4IiwgeTogIjIiLCB3aWR0aDogIjgiLCBoZWlnaHQ6ICI0Iiwgcng6ICIxIiB9XQogICAgXTsKICAgIHZhciBDbGlwYm9hcmRDaGVjayA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICI0IiwgeDogIjgiLCB5OiAiMiIsIHJ4OiAiMSIsIHJ5OiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA0aDJhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEtMiAySDZhMiAyIDAgMCAxLTItMlY2YTIgMiAwIDAgMSAyLTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDE0IDIgMiA0LTQiIH1dCiAgICBdOwogICAgdmFyIENsaXBib2FyZENvcHkgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiNCIsIHg6ICI4IiwgeTogIjIiLCByeDogIjEiLCByeTogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA0SDZhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAyLTJ2LTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNGgyYTIgMiAwIDAgMSAyIDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNEgxMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxMC00IDQgNCA0IiB9XQogICAgXTsKICAgIHZhciBDbGlwYm9hcmRMaXN0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiOCIsIGhlaWdodDogIjQiLCB4OiAiOCIsIHk6ICIyIiwgcng6ICIxIiwgcnk6ICIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDRoMmEyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDJINmEyIDIgMCAwIDEtMi0yVjZhMiAyIDAgMCAxIDItMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDExaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTZoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDExaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE2aC4wMSIgfV0KICAgIF07CiAgICB2YXIgQ2xpcGJvYXJkTWludXMgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiNCIsIHg6ICI4IiwgeTogIjIiLCByeDogIjEiLCByeTogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNGgyYTIgMiAwIDAgMSAyIDJ2MTRhMiAyIDAgMCAxLTIgMkg2YTIgMiAwIDAgMS0yLTJWNmEyIDIgMCAwIDEgMi0yaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNGg2IiB9XQogICAgXTsKICAgIHZhciBDbGlwYm9hcmRQYXN0ZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDE0aDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDRoMmEyIDIgMCAwIDEgMiAydjEuMzQ0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDE4IDQtNC00LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA0SDZhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAxLjc5My0xLjExMyIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjgiLCB5OiAiMiIsIHdpZHRoOiAiOCIsIGhlaWdodDogIjQiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIENsaXBib2FyZFBlbkxpbmUgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiNCIsIHg6ICI4IiwgeTogIjIiLCByeDogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA0SDZhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAyLTJ2LS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDRoMmEyIDIgMCAwIDEgMS43MyAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMThoMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMS4zNzggMTIuNjI2YTEgMSAwIDAgMC0zLjAwNC0zLjAwNGwtNC4wMSA0LjAxMmEyIDIgMCAwIDAtLjUwNi44NTRsLS44MzcgMi44N2EuNS41IDAgMCAwIC42Mi42MmwyLjg3LS44MzdhMiAyIDAgMCAwIC44NTQtLjUwNnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIENsaXBib2FyZFBlbiA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICI0IiwgeDogIjgiLCB5OiAiMiIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA0aDJhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEtMiAyaC01LjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMy41VjZhMiAyIDAgMCAxIDItMmgyIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEzLjM3OCAxNS42MjZhMSAxIDAgMSAwLTMuMDA0LTMuMDA0bC01LjAxIDUuMDEyYTIgMiAwIDAgMC0uNTA2Ljg1NGwtLjgzNyAyLjg3YS41LjUgMCAwIDAgLjYyLjYybDIuODctLjgzN2EyIDIgMCAwIDAgLjg1NC0uNTA2eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgQ2xpcGJvYXJkUGx1cyA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICI0IiwgeDogIjgiLCB5OiAiMiIsIHJ4OiAiMSIsIHJ5OiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA0aDJhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEtMiAySDZhMiAyIDAgMCAxLTItMlY2YTIgMiAwIDAgMSAyLTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE0aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTd2LTYiIH1dCiAgICBdOwogICAgdmFyIENsaXBib2FyZFR5cGUgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiNCIsIHg6ICI4IiwgeTogIjIiLCByeDogIjEiLCByeTogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNGgyYTIgMiAwIDAgMSAyIDJ2MTRhMiAyIDAgMCAxLTIgMkg2YTIgMiAwIDAgMS0yLTJWNmEyIDIgMCAwIDEgMi0yaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMnYtMWg2djEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTdoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMXY2IiB9XQogICAgXTsKICAgIHZhciBDbGlwYm9hcmRYID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiOCIsIGhlaWdodDogIjQiLCB4OiAiOCIsIHk6ICIyIiwgcng6ICIxIiwgcnk6ICIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDRoMmEyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDJINmEyIDIgMCAwIDEtMi0yVjZhMiAyIDAgMCAxIDItMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDExLTYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDExIDYgNiIgfV0KICAgIF07CiAgICB2YXIgQ2xpcGJvYXJkID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiOCIsIGhlaWdodDogIjQiLCB4OiAiOCIsIHk6ICIyIiwgcng6ICIxIiwgcnk6ICIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDRoMmEyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDJINmEyIDIgMCAwIDEtMi0yVjZhMiAyIDAgMCAxIDItMmgyIiB9XQogICAgXTsKICAgIHZhciBDbG9jazEgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2djZsMi00IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XQogICAgXTsKICAgIHZhciBDbG9jazEwID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnY2bC00LTIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dCiAgICBdOwogICAgdmFyIENsb2NrMTEgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2djZsLTItNCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0KICAgIF07CiAgICB2YXIgQ2xvY2sxMiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZ2NiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0KICAgIF07CiAgICB2YXIgQ2xvY2syID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnY2bDQtMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0KICAgIF07CiAgICB2YXIgQ2xvY2s0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnY2bDQgMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0KICAgIF07CiAgICB2YXIgQ2xvY2szID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnY2aDQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dCiAgICBdOwogICAgdmFyIENsb2NrNSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZ2NmwyIDQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dCiAgICBdOwogICAgdmFyIENsb2NrNiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZ2MTAiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dCiAgICBdOwogICAgdmFyIENsb2NrNyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZ2NmwtMiA0IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XQogICAgXTsKICAgIHZhciBDbG9jazggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2djZsLTQgMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0KICAgIF07CiAgICB2YXIgQ2xvY2s5ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnY2SDgiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dCiAgICBdOwogICAgdmFyIENsb2NrQXJyb3dEb3duID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnY2bDIgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMi4zMzcgMjEuOTk0YTEwIDEwIDAgMSAxIDkuNTg4LTguNzY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDE4IDQgNCA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTR2OCIgfV0KICAgIF07CiAgICB2YXIgQ2xvY2tBbGVydCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZ2Nmw0IDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTJ2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAyMWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEuMjUgOC4yQTEwIDEwIDAgMSAwIDE2IDIxLjE2IiB9XQogICAgXTsKICAgIHZhciBDbG9ja0NoZWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnY2bDQgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxMmExMCAxMCAwIDEgMC0xMSA5Ljk1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDE2LTUuNSA1LjVMMTQgMTkiIH1dCiAgICBdOwogICAgdmFyIENsb2NrQXJyb3dVcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZ2NmwxLjU2Ljc4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjIyNyAyMS45MjVhMTAgMTAgMCAxIDEgOC43NjctOS41ODgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgMTggNC00IDQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAyMnYtOCIgfV0KICAgIF07CiAgICB2YXIgQ2xvY2tGYWRpbmcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyYTEwIDEwIDAgMCAxIDcuMzggMTYuNzUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnY2bDQgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yLjUgOC44NzVhMTAgMTAgMCAwIDAtLjUgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yLjgzIDE2YTEwIDEwIDAgMCAwIDIuNDMgMy40IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQuNjM2IDUuMjM1YTEwIDEwIDAgMCAxIC44OTEtLjg1NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjY0NCAyMS40MmExMCAxMCAwIDAgMCA3LjYzMS0uMzgiIH1dCiAgICBdOwogICAgdmFyIENsb2NrUGx1cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZ2NmwzLjY0NCAxLjgyMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxOWg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE2djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEuOTIgMTMuMjY3YTEwIDEwIDAgMSAwLTguNjUzIDguNjUzIiB9XQogICAgXTsKICAgIHZhciBDbG9jayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZ2Nmw0IDIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dCiAgICBdOwogICAgdmFyIENsb3NlZENhcHRpb24gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA5LjE3YTMgMyAwIDEgMCAwIDUuNjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgOS4xN2EzIDMgMCAxIDAgMCA1LjY2IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMiIsIHk6ICI1Iiwgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE0Iiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBDbG91ZEFsZXJ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMThoLjVhMSAxIDAgMCAwIDAtOWgtMS43OUE3IDcgMCAxIDAgNyAxNy43MDgiIH1dCiAgICBdOwogICAgdmFyIENsb3VkQmFja3VwID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTUuMjUxQTQuNSA0LjUgMCAwIDAgMTcuNSA4aC0xLjc5QTcgNyAwIDEgMCAzIDEzLjYwNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDExdjRoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE5YTUgNSAwIDAgMCA5LTMgNC41IDQuNSAwIDAgMC00LjUtNC41IDQuODIgNC44MiAwIDAgMC0zLjQxIDEuNDFMNyAxNSIgfV0KICAgIF07CiAgICB2YXIgQ2xvdWRDaGVjayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDE1LTUuNSA1LjVMOSAxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE3Ljc0M0E3IDcgMCAxIDEgMTUuNzEgMTBoMS43OWE0LjUgNC41IDAgMCAxIDEuNSA4Ljc0MiIgfV0KICAgIF07CiAgICB2YXIgQ2xvdWRDb2cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMC44NTIgMTkuNzcyLS4zODMuOTI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEzLjE0OCAxNC4yMjguMzgzLS45MjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMuMTQ4IDE5Ljc3MmEzIDMgMCAxIDAtMi4yOTYtNS41NDRsLS4zODMtLjkyMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMy41MyAyMC42OTYtLjM4Mi0uOTI0YTMgMyAwIDEgMS0yLjI5Ni01LjU0NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC43NzIgMTUuODUyLjkyMy0uMzgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0Ljc3MiAxOC4xNDguOTIzLjM4MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00LjIgMTUuMWE3IDcgMCAxIDEgOS45My05Ljg1OEE3IDcgMCAwIDEgMTUuNzEgOGgxLjc5YTQuNSA0LjUgMCAwIDEgMi41IDguMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05LjIyOCAxNS44NTItLjkyMy0uMzgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkuMjI4IDE4LjE0OC0uOTIzLjM4MyIgfV0KICAgIF07CiAgICB2YXIgQ2xvdWREb3dubG9hZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEzdjhsLTQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMiAyMSA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC4zOTMgMTUuMjY5QTcgNyAwIDEgMSAxNS43MSA4aDEuNzlhNC41IDQuNSAwIDAgMSAyLjQzNiA4LjI4NCIgfV0KICAgIF07CiAgICB2YXIgQ2xvdWREcml6emxlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxNC44OTlBNyA3IDAgMSAxIDE1LjcxIDhoMS43OWE0LjUgNC41IDAgMCAxIDIuNSA4LjI0MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE5djEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNHYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE5djEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTR2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMXYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE2djEiIH1dCiAgICBdOwogICAgdmFyIENsb3VkRm9nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxNC44OTlBNyA3IDAgMSAxIDE1LjcxIDhoMS43OWE0LjUgNC41IDAgMCAxIDIuNSA4LjI0MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxN0g3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDIxSDkiIH1dCiAgICBdOwogICAgdmFyIENsb3VkSGFpbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTQuODk5QTcgNyAwIDEgMSAxNS43MSA4aDEuNzlhNC41IDQuNSAwIDAgMSAyLjUgOC4yNDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTR2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE0djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMjBoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjBoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE2djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjJoLjAxIiB9XQogICAgXTsKICAgIHZhciBDbG91ZExpZ2h0bmluZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTYuMzI2QTcgNyAwIDEgMSAxNS43MSA4aDEuNzlhNC41IDQuNSAwIDAgMSAuNSA4Ljk3MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMyAxMi0zIDVoNGwtMyA1IiB9XQogICAgXTsKICAgIHZhciBDbG91ZE1vb25SYWluID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMjB2MiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOC4zNzYgMTQuNTEyYTYgNiAwIDAgMCAzLjQ2MS00LjEyN2MuMTQ4LS42MjUtLjY1OS0uOTctMS4yNDgtLjcxNGE0IDQgMCAwIDEtNS4yNTktNS4yNmMuMjU1LS41ODktLjA5LTEuMzk1LS43MTYtMS4yNDhhNiA2IDAgMCAwLTQuNTk0IDUuMzYiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAyMGE1IDUgMCAxIDEgOC45LTRIMTNhMyAzIDAgMCAxIDIgNS4yNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE5djIiIH1dCiAgICBdOwogICAgdmFyIENsb3VkTW9vbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDE2YTMgMyAwIDAgMSAwIDZIN2E1IDUgMCAxIDEgNC45LTZ6IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE4LjM3NiAxNC41MTJhNiA2IDAgMCAwIDMuNDYxLTQuMTI3Yy4xNDgtLjYyNS0uNjU5LS45Ny0xLjI0OC0uNzE0YTQgNCAwIDAgMS01LjI1OS01LjI2Yy4yNTUtLjU4OS0uMDktMS4zOTUtLjcxNi0xLjI0OGE2IDYgMCAwIDAtNC41OTQgNS4zNiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgQ2xvdWRPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC45NCA1LjI3NEE3IDcgMCAwIDEgMTUuNzEgMTBoMS43OWE0LjUgNC41IDAgMCAxIDQuMjIyIDYuMDU3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4Ljc5NiAxOC44MUE0LjUgNC41IDAgMCAxIDE3LjUgMTlIOUE3IDcgMCAwIDEgNS43OSA1Ljc4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0KICAgIF07CiAgICB2YXIgQ2xvdWRSYWluV2luZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTQuODk5QTcgNyAwIDEgMSAxNS43MSA4aDEuNzlhNC41IDQuNSAwIDAgMSAyLjUgOC4yNDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOS4yIDIyIDMtNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDEzLTMgNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAxMy0zIDciIH1dCiAgICBdOwogICAgdmFyIENsb3VkUmFpbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTQuODk5QTcgNyAwIDEgMSAxNS43MSA4aDEuNzlhNC41IDQuNSAwIDAgMSAyLjUgOC4yNDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTR2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE0djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTZ2NiIgfV0KICAgIF07CiAgICB2YXIgQ2xvdWRTbm93ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxNC44OTlBNyA3IDAgMSAxIDE1LjcxIDhoMS43OWE0LjUgNC41IDAgMCAxIDIuNSA4LjI0MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE1aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE5aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjFoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE1aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxOWguMDEiIH1dCiAgICBdOwogICAgdmFyIENsb3VkU3VuUmFpbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm00LjkzIDQuOTMgMS40MSAxLjQxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDEyaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkuMDcgNC45My0xLjQxIDEuNDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUuOTQ3IDEyLjY1YTQgNCAwIDAgMC01LjkyNS00LjEyOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDIwYTUgNSAwIDEgMSA4LjktNEgxM2EzIDMgMCAwIDEgMiA1LjI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDIwdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxOXYyIiB9XQogICAgXTsKICAgIHZhciBDbG91ZFN1biA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm00LjkzIDQuOTMgMS40MSAxLjQxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDEyaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkuMDcgNC45My0xLjQxIDEuNDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUuOTQ3IDEyLjY1YTQgNCAwIDAgMC01LjkyNS00LjEyOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAyMkg3YTUgNSAwIDEgMSA0LjktNkgxM2EzIDMgMCAwIDEgMCA2WiIgfV0KICAgIF07CiAgICB2YXIgQ2xvdWRTeW5jID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMTgtMS41MzUgMS42MDVhNSA1IDAgMCAxLTgtMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDIydi00aC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwLjk5NiAxNS4yNTFBNC41IDQuNSAwIDAgMCAxNy40OTUgOGgtMS43OWE3IDcgMCAxIDAtMTIuNzA5IDUuNjA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTB2NGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMTQgMS41MzUtMS42MDVhNSA1IDAgMCAxIDggMS41IiB9XQogICAgXTsKICAgIHZhciBDbG91ZFVwbG9hZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEzdjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxNC44OTlBNyA3IDAgMSAxIDE1LjcxIDhoMS43OWE0LjUgNC41IDAgMCAxIDIuNSA4LjI0MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDE3IDQtNCA0IDQiIH1dCiAgICBdOwogICAgdmFyIENsb3VkID0gW1sicGF0aCIsIHsgZDogIk0xNy41IDE5SDlhNyA3IDAgMSAxIDYuNzEtOWgxLjc5YTQuNSA0LjUgMCAxIDEgMCA5WiIgfV1dOwogICAgdmFyIENsb3VkeSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjUgMTJhMSAxIDAgMSAxIDAgOUg5LjAwNmE3IDcgMCAxIDEgNi43MDItOXoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEuODMyIDlBMyAzIDAgMCAwIDE5IDdoLTIuMjA3YTUuNSA1LjUgMCAwIDAtMTAuNzIuNjEiIH1dCiAgICBdOwogICAgdmFyIENsdWIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTE3LjI4IDkuMDVhNS41IDUuNSAwIDEgMC0xMC41NiAwQTUuNSA1LjUgMCAxIDAgMTIgMTcuNjZhNS41IDUuNSAwIDEgMCA1LjI4LTguNloiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3LjY2TDEyIDIyIiB9XQogICAgXTsKICAgIHZhciBDbG92ZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNi4xNyA3LjgzIDIgMjIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNC4wMiAxMmEyLjgyNyAyLjgyNyAwIDEgMSAzLjgxLTQuMTdBMi44MjcgMi44MjcgMCAxIDEgMTIgNC4wMmEyLjgyNyAyLjgyNyAwIDEgMSA0LjE3IDMuODFBMi44MjcgMi44MjcgMCAxIDEgMTkuOTggMTJhMi44MjcgMi44MjcgMCAxIDEtMy44MSA0LjE3QTIuODI3IDIuODI3IDAgMSAxIDEyIDE5Ljk4YTIuODI3IDIuODI3IDAgMSAxLTQuMTctMy44MUExIDEgMCAxIDEgNCAxMiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03LjgzIDcuODMgOC4zNCA4LjM0IiB9XQogICAgXTsKICAgIHZhciBDb2RlWG1sID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMTYgNC00LTQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02IDgtNCA0IDQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC41IDQtNSAxNiIgfV0KICAgIF07CiAgICB2YXIgQ29kZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDE4IDYtNi02LTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCA2LTYgNiA2IDYiIH1dCiAgICBdOwogICAgdmFyIENvZGVwZW4gPSBbCiAgICAgIFsicG9seWdvbiIsIHsgcG9pbnRzOiAiMTIgMiAyMiA4LjUgMjIgMTUuNSAxMiAyMiAyIDE1LjUgMiA4LjUgMTIgMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTIiLCB5MTogIjIyIiwgeTI6ICIxNS41IiB9XSwKICAgICAgWyJwb2x5bGluZSIsIHsgcG9pbnRzOiAiMjIgOC41IDEyIDE1LjUgMiA4LjUiIH1dLAogICAgICBbInBvbHlsaW5lIiwgeyBwb2ludHM6ICIyIDE1LjUgMTIgOC41IDIyIDE1LjUiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICIyIiwgeTI6ICI4LjUiIH1dCiAgICBdOwogICAgdmFyIENvZGVzYW5kYm94ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEgMTZWOGEyIDIgMCAwIDAtMS0xLjczbC03LTRhMiAyIDAgMCAwLTIgMGwtNyA0QTIgMiAwIDAgMCAzIDh2OGEyIDIgMCAwIDAgMSAxLjczbDcgNGEyIDIgMCAwIDAgMiAwbDctNEEyIDIgMCAwIDAgMjEgMTZ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwb2x5bGluZSIsIHsgcG9pbnRzOiAiNy41IDQuMjEgMTIgNi44MSAxNi41IDQuMjEiIH1dLAogICAgICBbInBvbHlsaW5lIiwgeyBwb2ludHM6ICI3LjUgMTkuNzkgNy41IDE0LjYgMyAxMiIgfV0sCiAgICAgIFsicG9seWxpbmUiLCB7IHBvaW50czogIjIxIDEyIDE2LjUgMTQuNiAxNi41IDE5Ljc5IiB9XSwKICAgICAgWyJwb2x5bGluZSIsIHsgcG9pbnRzOiAiMy4yNyA2Ljk2IDEyIDEyLjAxIDIwLjczIDYuOTYiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICIyMi4wOCIsIHkyOiAiMTIiIH1dCiAgICBdOwogICAgdmFyIENvZmZlZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTYgOGExIDEgMCAwIDEgMSAxdjhhNCA0IDAgMCAxLTQgNEg3YTQgNCAwIDAgMS00LTRWOWExIDEgMCAwIDEgMS0xaDE0YTQgNCAwIDEgMSAwIDhoLTEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAydjIiIH1dCiAgICBdOwogICAgdmFyIENvZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDEwLjI3IDcgMy4zNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMSAxMy43My00IDYuOTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjJ2LTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDEyaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMjAuNjYtMS0xLjczIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDMuMzQtMSAxLjczIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMC42NiAxNy0xLjczLTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAuNjYgNy0xLjczIDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMy4zNCAxNyAxLjczLTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMy4zNCA3IDEuNzMgMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjgiIH1dCiAgICBdOwogICAgdmFyIENvaW5zID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICI4IiwgY3k6ICI4IiwgcjogIjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTguMDkgMTAuMzdBNiA2IDAgMSAxIDEwLjM0IDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNmgxdjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYuNzEgMTMuODguNy43MS0yLjgyIDIuODIiIH1dCiAgICBdOwogICAgdmFyIENvbHVtbnMyID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgM3YxOCIgfV0KICAgIF07CiAgICB2YXIgQ29sdW1uczNDb2cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC41IDIxSDVhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMTRhMiAyIDAgMCAxIDIgMnY1LjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuMyAxOS42IDEtLjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgM3Y3LjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUuMiAxNi45LS45LS4zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2LjYgMjEuNy4zLS45IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2LjggMTUuMy0uNC0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5LjEgMTUuMi4zLS45IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5LjYgMjEuNy0uNC0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwLjcgMTYuOCAxLS40IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxLjcgMTkuNC0uOS0uMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDN2MTgiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiMTgiLCByOiAiMyIgfV0KICAgIF07CiAgICB2YXIgQ29sdW1uczQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03LjUgM3YxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAzdjE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2LjUgM3YxOCIgfV0KICAgIF07CiAgICB2YXIgQ29sdW1uczMgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDN2MTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgM3YxOCIgfV0KICAgIF07CiAgICB2YXIgQ29tYmluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDNhMSAxIDAgMCAxIDEgMXY1YTEgMSAwIDAgMS0xIDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgM2ExIDEgMCAwIDEgMSAxdjVhMSAxIDAgMCAxLTEgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03IDE1IDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03IDIxIDMtM0g1YTIgMiAwIDAgMS0yLTJ2LTIiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIxNCIsIHk6ICIxNCIsIHdpZHRoOiAiNyIsIGhlaWdodDogIjciLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIzIiwgeTogIjMiLCB3aWR0aDogIjciLCBoZWlnaHQ6ICI3Iiwgcng6ICIxIiB9XQogICAgXTsKICAgIHZhciBDb21tYW5kID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgNnYxMmEzIDMgMCAxIDAgMy0zSDZhMyAzIDAgMSAwIDMgM1Y2YTMgMyAwIDEgMC0zIDNoMTJhMyAzIDAgMSAwLTMtMyIgfV0KICAgIF07CiAgICB2YXIgQ29tcGFzcyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTE2LjI0IDcuNzYtMS44MDQgNS40MTFhMiAyIDAgMCAxLTEuMjY1IDEuMjY1TDcuNzYgMTYuMjRsMS44MDQtNS40MTFhMiAyIDAgMCAxIDEuMjY1LTEuMjY1eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0KICAgIF07CiAgICB2YXIgQ29tcG9uZW50ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTUuNTM2IDExLjI5M2ExIDEgMCAwIDAgMCAxLjQxNGwyLjM3NiAyLjM3N2ExIDEgMCAwIDAgMS40MTQgMGwyLjM3Ny0yLjM3N2ExIDEgMCAwIDAgMC0xLjQxNGwtMi4zNzctMi4zNzdhMSAxIDAgMCAwLTEuNDE0IDB6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuMjk3IDExLjI5M2ExIDEgMCAwIDAgMCAxLjQxNGwyLjM3NyAyLjM3N2ExIDEgMCAwIDAgMS40MTQgMGwyLjM3Ny0yLjM3N2ExIDEgMCAwIDAgMC0xLjQxNEw2LjA4OCA4LjkxNmExIDEgMCAwIDAtMS40MTQgMHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOC45MTYgMTcuOTEyYTEgMSAwIDAgMCAwIDEuNDE1bDIuMzc3IDIuMzc2YTEgMSAwIDAgMCAxLjQxNCAwbDIuMzc3LTIuMzc2YTEgMSAwIDAgMCAwLTEuNDE1bC0yLjM3Ny0yLjM3NmExIDEgMCAwIDAtMS40MTQgMHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOC45MTYgNC42NzRhMSAxIDAgMCAwIDAgMS40MTRsMi4zNzcgMi4zNzZhMSAxIDAgMCAwIDEuNDE0IDBsMi4zNzctMi4zNzZhMSAxIDAgMCAwIDAtMS40MTRsLTIuMzc3LTIuMzc3YTEgMSAwIDAgMC0xLjQxNCAweiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgQ29tcHV0ZXIgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNCIsIGhlaWdodDogIjgiLCB4OiAiNSIsIHk6ICIyIiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiOCIsIHg6ICIyIiwgeTogIjE0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMThoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOGg2IiB9XQogICAgXTsKICAgIHZhciBDb25lID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAuOSAxOC41NS04LTE1Ljk4YTEgMSAwIDAgMC0xLjggMGwtOCAxNS45OCIgfV0sCiAgICAgIFsiZWxsaXBzZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTkiLCByeDogIjkiLCByeTogIjMiIH1dCiAgICBdOwogICAgdmFyIENvbmNpZXJnZUJlbGwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDIwYTEgMSAwIDAgMS0xLTF2LTFhMiAyIDAgMCAxIDItMmgxNmEyIDIgMCAwIDEgMiAydjFhMSAxIDAgMCAxLTEgMVoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTZhOCA4IDAgMSAwLTE2IDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNHY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDRoNCIgfV0KICAgIF07CiAgICB2YXIgQ29uc3RydWN0aW9uID0gWwogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjYiLCB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiOCIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxNHY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTR2NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAzdjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAzdjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTQgMi4zIDYuMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCA2IDcuNyA3LjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCA2IDggOCIgfV0KICAgIF07CiAgICB2YXIgQ29udGFjdFJvdW5kID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjkxNSAyMmE2IDYgMCAwIDAtMTIgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2MiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICI0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICI0Iiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4Iiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBDb250YWN0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjJ2LTJhMiAyIDAgMCAxIDItMmg2YTIgMiAwIDAgMSAyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2MiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMSIsIHI6ICIzIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICI0Iiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4Iiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBDb250YWluZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMiA3LjdjMC0uNi0uNC0xLjItLjgtMS41bC02LjMtMy45YTEuNzIgMS43MiAwIDAgMC0xLjcgMGwtMTAuMyA2Yy0uNS4yLS45LjgtLjkgMS40djYuNmMwIC41LjQgMS4yLjggMS41bDYuMyAzLjlhMS43MiAxLjcyIDAgMCAwIDEuNyAwbDEwLjMtNmMuNS0uMy45LTEgLjktMS41WiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAyMS45VjE0TDIuMSA5LjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgMTQgMTEuOS02LjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTkuOHYtOC4xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE3LjVWOS40IiB9XQogICAgXTsKICAgIHZhciBDb250cmFzdCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4YTYgNiAwIDAgMCAwLTEydjEyeiIgfV0KICAgIF07CiAgICB2YXIgQ29va2llID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMmExMCAxMCAwIDEgMCAxMCAxMCA0IDQgMCAwIDEtNS01IDQgNCAwIDAgMS01LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC41IDguNXYuMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTUuNXYuMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJ2LjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDE3di4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE0di4wMSIgfV0KICAgIF07CiAgICB2YXIgQ29va2luZ1BvdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJoMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTJ2OGEyIDIgMCAwIDEtMiAySDZhMiAyIDAgMCAxLTItMnYtOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm00IDggMTYtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04Ljg2IDYuNzgtLjQ1LTEuODFhMiAyIDAgMCAxIDEuNDUtMi40M2wxLjk0LS40OGEyIDIgMCAwIDEgMi40MyAxLjQ2bC40NSAxLjgiIH1dCiAgICBdOwogICAgdmFyIENvcHlDaGVjayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDE1IDIgMiA0LTQiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTQiLCBoZWlnaHQ6ICIxNCIsIHg6ICI4IiwgeTogIjgiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiB9XQogICAgXTsKICAgIHZhciBDb3B5U2xhc2ggPSBbCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTgiLCB5MTogIjE4IiwgeTI6ICIxMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNCIsIGhlaWdodDogIjE0IiwgeDogIjgiLCB5OiAiOCIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE2Yy0xLjEgMC0yLS45LTItMlY0YzAtMS4xLjktMiAyLTJoMTBjMS4xIDAgMiAuOSAyIDIiIH1dCiAgICBdOwogICAgdmFyIENvcHlNaW51cyA9IFsKICAgICAgWyJsaW5lIiwgeyB4MTogIjEyIiwgeDI6ICIxOCIsIHkxOiAiMTUiLCB5MjogIjE1IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE0IiwgaGVpZ2h0OiAiMTQiLCB4OiAiOCIsIHk6ICI4Iiwgcng6ICIyIiwgcnk6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTZjLTEuMSAwLTItLjktMi0yVjRjMC0xLjEuOS0yIDItMmgxMGMxLjEgMCAyIC45IDIgMiIgfV0KICAgIF07CiAgICB2YXIgQ29weVBsdXMgPSBbCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNSIsIHgyOiAiMTUiLCB5MTogIjEyIiwgeTI6ICIxOCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTgiLCB5MTogIjE1IiwgeTI6ICIxNSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNCIsIGhlaWdodDogIjE0IiwgeDogIjgiLCB5OiAiOCIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE2Yy0xLjEgMC0yLS45LTItMlY0YzAtMS4xLjktMiAyLTJoMTBjMS4xIDAgMiAuOSAyIDIiIH1dCiAgICBdOwogICAgdmFyIENvcHlYID0gWwogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjE4IiwgeTE6ICIxMiIsIHkyOiAiMTgiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjE4IiwgeTE6ICIxOCIsIHkyOiAiMTIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTQiLCBoZWlnaHQ6ICIxNCIsIHg6ICI4IiwgeTogIjgiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiB9XQogICAgXTsKICAgIHZhciBDb3B5ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTQiLCBoZWlnaHQ6ICIxNCIsIHg6ICI4IiwgeTogIjgiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiB9XQogICAgXTsKICAgIHZhciBDb3B5bGVmdCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuMTcgMTQuODNhNCA0IDAgMSAwIDAtNS42NiIgfV0KICAgIF07CiAgICB2YXIgQ29weXJpZ2h0ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQuODMgMTQuODNhNCA0IDAgMSAxIDAtNS42NiIgfV0KICAgIF07CiAgICB2YXIgQ29ybmVyRG93blJpZ2h0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgMTAgNSA1LTUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDR2N2E0IDQgMCAwIDAgNCA0aDEyIiB9XQogICAgXTsKICAgIHZhciBDb3JuZXJEb3duTGVmdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDR2N2E0IDQgMCAwIDEtNCA0SDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxMC01IDUgNSA1IiB9XQogICAgXTsKICAgIHZhciBDb3JuZXJMZWZ0RG93biA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDE1LTUgNS01LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgNGgtN2E0IDQgMCAwIDAtNCA0djEyIiB9XQogICAgXTsKICAgIHZhciBDb3JuZXJMZWZ0VXAgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA5IDkgNCA0IDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMjBoLTdhNCA0IDAgMCAxLTQtNFY0IiB9XQogICAgXTsKICAgIHZhciBDb3JuZXJSaWdodERvd24gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCAxNSA1IDUgNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgNGg3YTQgNCAwIDAgMSA0IDR2MTIiIH1dCiAgICBdOwogICAgdmFyIENvcm5lclJpZ2h0VXAgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCA5IDUtNSA1IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAyMGg3YTQgNCAwIDAgMCA0LTRWNCIgfV0KICAgIF07CiAgICB2YXIgQ29ybmVyVXBMZWZ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMjB2LTdhNCA0IDAgMCAwLTQtNEg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTQgNCA5bDUtNSIgfV0KICAgIF07CiAgICB2YXIgQ29ybmVyVXBSaWdodCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDE0IDUtNS01LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAyMHYtN2E0IDQgMCAwIDEgNC00aDEyIiB9XQogICAgXTsKICAgIHZhciBDcHUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAyMHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEyaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxN2gyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgN2gyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDEyaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTdoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCA3aDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMnYyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiNCIsIHk6ICI0Iiwgd2lkdGg6ICIxNiIsIGhlaWdodDogIjE2Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiOCIsIHk6ICI4Iiwgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiOCIsIHJ4OiAiMSIgfV0KICAgIF07CiAgICB2YXIgQ3JlYXRpdmVDb21tb25zID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOS4zYTIuOCAyLjggMCAwIDAtMy41IDEgMy4xIDMuMSAwIDAgMCAwIDMuNCAyLjcgMi43IDAgMCAwIDMuNSAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDkuM2EyLjggMi44IDAgMCAwLTMuNSAxIDMuMSAzLjEgMCAwIDAgMCAzLjQgMi43IDIuNyAwIDAgMCAzLjUgMSIgfV0KICAgIF07CiAgICB2YXIgQ3JlZGl0Q2FyZCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTQiLCB4OiAiMiIsIHk6ICI1Iiwgcng6ICIyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjIiLCB4MjogIjIyIiwgeTE6ICIxMCIsIHkyOiAiMTAiIH1dCiAgICBdOwogICAgdmFyIENyb2lzc2FudCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjIgMThINC43NzRhMS41IDEuNSAwIDAgMS0xLjM1Mi0uOTcgMTEgMTEgMCAwIDEgLjEzMi02LjQ4NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMC4yVjQuNzc0YTEuNSAxLjUgMCAwIDAtLjk3LTEuMzUyIDExIDExIDAgMCAwLTYuNDg2LjEzMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA1YTQgMyAwIDAgMSA0IDMgMiAyIDAgMCAxLTIgMiAxMCAxMCAwIDAgMC01LjEzOSAxLjQyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMThhMyA0IDAgMCAwIDMgNCAyIDIgMCAwIDAgMi0yIDEwIDEwIDAgMCAxIDEuNDItNS4xNCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk04LjcwOSAyLjU1NGExMCAxMCAwIDAgMC02LjE1NSA2LjE1NSAxLjUgMS41IDAgMCAwIC42NzYgMS42MjZsOS44MDcgNS40MmEyIDIgMCAwIDAgMi43MTgtMi43MThsLTUuNDItOS44MDdhMS41IDEuNSAwIDAgMC0xLjYyNi0uNjc2IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBDcm9wID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAydjE0YTIgMiAwIDAgMCAyIDJoMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMjJWOGEyIDIgMCAwIDAtMi0ySDIiIH1dCiAgICBdOwogICAgdmFyIENyb3NzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNCA5YTIgMiAwIDAgMC0yIDJ2MmEyIDIgMCAwIDAgMiAyaDRhMSAxIDAgMCAxIDEgMXY0YTIgMiAwIDAgMCAyIDJoMmEyIDIgMCAwIDAgMi0ydi00YTEgMSAwIDAgMSAxLTFoNGEyIDIgMCAwIDAgMi0ydi0yYTIgMiAwIDAgMC0yLTJoLTRhMSAxIDAgMCAxLTEtMVY0YTIgMiAwIDAgMC0yLTJoLTJhMiAyIDAgMCAwLTIgMnY0YTEgMSAwIDAgMS0xIDF6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBDcm9zc2hhaXIgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIyMiIsIHgyOiAiMTgiLCB5MTogIjEyIiwgeTI6ICIxMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI2IiwgeDI6ICIyIiwgeTE6ICIxMiIsIHkyOiAiMTIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICI2IiwgeTI6ICIyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEyIiwgeDI6ICIxMiIsIHkxOiAiMjIiLCB5MjogIjE4IiB9XQogICAgXTsKICAgIHZhciBDcm93biA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTExLjU2MiAzLjI2NmEuNS41IDAgMCAxIC44NzYgMEwxNS4zOSA4Ljg3YTEgMSAwIDAgMCAxLjUxNi4yOTRMMjEuMTgzIDUuNWEuNS41IDAgMCAxIC43OTguNTE5bC0yLjgzNCAxMC4yNDZhMSAxIDAgMCAxLS45NTYuNzM0SDUuODFhMSAxIDAgMCAxLS45NTctLjczNEwyLjAyIDYuMDJhLjUuNSAwIDAgMSAuNzk4LS41MTlsNC4yNzYgMy42NjRhMSAxIDAgMCAwIDEuNTE2LS4yOTR6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMjFoMTQiIH1dCiAgICBdOwogICAgdmFyIEN1Ym9pZCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTIxLjEyIDYuNC02LjA1LTQuMDZhMiAyIDAgMCAwLTIuMTctLjA1TDIuOTUgOC40MWEyIDIgMCAwIDAtLjk1IDEuN3Y1LjgyYTIgMiAwIDAgMCAuODggMS42Nmw2LjA1IDQuMDdhMiAyIDAgMCAwIDIuMTcuMDVsOS45NS02LjEyYTIgMiAwIDAgMCAuOTUtMS43VjguMDZhMiAyIDAgMCAwLS44OC0xLjY2WiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAyMnYtOEwyLjI1IDkuMTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgMTQgMTEuNzctNi44NyIgfV0KICAgIF07CiAgICB2YXIgQ3VwU29kYSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTYgOCAxLjc1IDEyLjI4YTIgMiAwIDAgMCAyIDEuNzJoNC41NGEyIDIgMCAwIDAgMi0xLjcyTDE4IDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSA4aDE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTVhNi40NyA2LjQ3IDAgMCAxIDUgMCA2LjQ3IDYuNDcgMCAwIDAgNSAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDggMS02aDIiIH1dCiAgICBdOwogICAgdmFyIEN1cnJlbmN5ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiOCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIzIiwgeDI6ICI2IiwgeTE6ICIzIiwgeTI6ICI2IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjIxIiwgeDI6ICIxOCIsIHkxOiAiMyIsIHkyOiAiNiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIzIiwgeDI6ICI2IiwgeTE6ICIyMSIsIHkyOiAiMTgiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMjEiLCB4MjogIjE4IiwgeTE6ICIyMSIsIHkyOiAiMTgiIH1dCiAgICBdOwogICAgdmFyIEN5bGluZGVyID0gWwogICAgICBbImVsbGlwc2UiLCB7IGN4OiAiMTIiLCBjeTogIjUiLCByeDogIjkiLCByeTogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA1djE0YTkgMyAwIDAgMCAxOCAwVjUiIH1dCiAgICBdOwogICAgdmFyIERhbSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDExLjMxYzEuMTcuNTYgMS41NCAxLjY5IDMuNSAxLjY5IDIuNSAwIDIuNS0yIDUtMiAxLjMgMCAxLjkuNSAyLjUgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMS43NSAxOGMuMzUuNSAxLjQ1IDEgMi43NSAxIDIuNSAwIDIuNS0yIDUtMiAxLjMgMCAxLjkuNSAyLjUgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEwaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxNGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMThoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDZoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDNhMSAxIDAgMCAwLTEgMXYxNmExIDEgMCAwIDAgMSAxaDRhMSAxIDAgMCAwIDEtMUwxMCA0YTEgMSAwIDAgMC0xLTF6IiB9XQogICAgXTsKICAgIHZhciBEYXRhYmFzZUJhY2t1cCA9IFsKICAgICAgWyJlbGxpcHNlIiwgeyBjeDogIjEyIiwgY3k6ICI1Iiwgcng6ICI5Iiwgcnk6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTJhOSAzIDAgMCAwIDUgMi42OSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA5LjNWNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDV2MTRhOSAzIDAgMCAwIDYuNDcgMi44OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMnY0aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMjBhNSA1IDAgMCAwIDktMyA0LjUgNC41IDAgMCAwLTQuNS00LjVjLTEuMzMgMC0yLjU0LjU0LTMuNDEgMS40MUwxMiAxNiIgfV0KICAgIF07CiAgICB2YXIgRGF0YWJhc2VaYXAgPSBbCiAgICAgIFsiZWxsaXBzZSIsIHsgY3g6ICIxMiIsIGN5OiAiNSIsIHJ4OiAiOSIsIHJ5OiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDVWMTlBOSAzIDAgMCAwIDE1IDIxLjg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDVWOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMkwxOCAxN0gyMkwxOSAyMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyQTkgMyAwIDAgMCAxNC41OSAxNC44NyIgfV0KICAgIF07CiAgICB2YXIgRGF0YWJhc2UgPSBbCiAgICAgIFsiZWxsaXBzZSIsIHsgY3g6ICIxMiIsIGN5OiAiNSIsIHJ4OiAiOSIsIHJ5OiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDVWMTlBOSAzIDAgMCAwIDIxIDE5VjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMkE5IDMgMCAwIDAgMjEgMTIiIH1dCiAgICBdOwogICAgdmFyIERlY2ltYWxzQXJyb3dMZWZ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMgMjEtMy0zIDMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxOEgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDExaC4wMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjYiLCB5OiAiMyIsIHdpZHRoOiAiNSIsIGhlaWdodDogIjgiLCByeDogIjIuNSIgfV0KICAgIF07CiAgICB2YXIgRGVjaW1hbHNBcnJvd1JpZ2h0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMThoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMjEgMy0zLTMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDExaC4wMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjE1IiwgeTogIjMiLCB3aWR0aDogIjUiLCBoZWlnaHQ6ICI4Iiwgcng6ICIyLjUiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI2IiwgeTogIjMiLCB3aWR0aDogIjUiLCBoZWlnaHQ6ICI4Iiwgcng6ICIyLjUiIH1dCiAgICBdOwogICAgdmFyIERlbGV0ZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwIDVhMiAyIDAgMCAwLTEuMzQ0LjUxOWwtNi4zMjggNS43NGExIDEgMCAwIDAgMCAxLjQ4MWw2LjMyOCA1Ljc0MUEyIDIgMCAwIDAgMTAgMTloMTBhMiAyIDAgMCAwIDItMlY3YTIgMiAwIDAgMC0yLTJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDkgNiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE4IDktNiA2IiB9XQogICAgXTsKICAgIHZhciBEZXNzZXJ0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTAuMTYyIDMuMTY3QTEwIDEwIDAgMCAwIDIgMTNhMiAyIDAgMCAwIDQgMHYtMWEyIDIgMCAwIDEgNCAwdjRhMiAyIDAgMCAwIDQgMHYtNGEyIDIgMCAwIDEgNCAwdjFhMiAyIDAgMCAwIDQtLjAwNiAxMCAxMCAwIDAgMC04LjE2MS05LjgyNiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC44MDQgMTQuODY5YTkgOSAwIDAgMS0xNy42MDggMCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICI0IiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIERpYW1ldGVyID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiMTkiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjUiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjQ4IDMuNjZhMTAgMTAgMCAwIDEgMTMuODYgMTMuODYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNi40MSA2LjQxIDExLjE4IDExLjE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuNjYgNi40OGExMCAxMCAwIDAgMCAxMy44NiAxMy44NiIgfV0KICAgIF07CiAgICB2YXIgRGlhbW9uZE1pbnVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMi43IDEwLjNhMi40MSAyLjQxIDAgMCAwIDAgMy40MWw3LjU5IDcuNTlhMi40MSAyLjQxIDAgMCAwIDMuNDEgMGw3LjU5LTcuNTlhMi40MSAyLjQxIDAgMCAwIDAtMy40MUwxMy43IDIuNzFhMi40MSAyLjQxIDAgMCAwLTMuNDEgMHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmg4IiB9XQogICAgXTsKICAgIHZhciBEaWFtb25kUGVyY2VudCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuNyAxMC4zYTIuNDEgMi40MSAwIDAgMCAwIDMuNDFsNy41OSA3LjU5YTIuNDEgMi40MSAwIDAgMCAzLjQxIDBsNy41OS03LjU5YTIuNDEgMi40MSAwIDAgMCAwLTMuNDFMMTMuNyAyLjcxYTIuNDEgMi40MSAwIDAgMC0zLjQxIDBaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuMiA5LjJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0LjUgOS41LTUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNC43IDE0LjhoLjAxIiB9XQogICAgXTsKICAgIHZhciBEaWFtb25kUGx1cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDh2OCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yLjcgMTAuM2EyLjQxIDIuNDEgMCAwIDAgMCAzLjQxbDcuNTkgNy41OWEyLjQxIDIuNDEgMCAwIDAgMy40MSAwbDcuNTktNy41OWEyLjQxIDIuNDEgMCAwIDAgMC0zLjQxTDEzLjcgMi43MWEyLjQxIDIuNDEgMCAwIDAtMy40MSAweiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEyaDgiIH1dCiAgICBdOwogICAgdmFyIERpYW1vbmQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yLjcgMTAuM2EyLjQxIDIuNDEgMCAwIDAgMCAzLjQxbDcuNTkgNy41OWEyLjQxIDIuNDEgMCAwIDAgMy40MSAwbDcuNTktNy41OWEyLjQxIDIuNDEgMCAwIDAgMC0zLjQxbC03LjU5LTcuNTlhMi40MSAyLjQxIDAgMCAwLTMuNDEgMFoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIERpY2UxID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJoLjAxIiB9XQogICAgXTsKICAgIHZhciBEaWNlMiA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiwgcnk6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDloLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTVoLjAxIiB9XQogICAgXTsKICAgIHZhciBEaWNlMyA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiwgcnk6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDhoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEyaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE2aC4wMSIgfV0KICAgIF07CiAgICB2YXIgRGljZTQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA4aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDhoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTZoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE2aC4wMSIgfV0KICAgIF07CiAgICB2YXIgRGljZTUgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA4aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDhoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTZoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE2aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMmguMDEiIH1dCiAgICBdOwogICAgdmFyIERpY2U2ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgOGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE2aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDhoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTZoLjAxIiB9XQogICAgXTsKICAgIHZhciBEaWNlcyA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjEyIiwgaGVpZ2h0OiAiMTIiLCB4OiAiMiIsIHk6ICIxMCIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNy45MiAxNCAzLjUtMy41YTIuMjQgMi4yNCAwIDAgMCAwLTNsLTUtNC45MmEyLjI0IDIuMjQgMCAwIDAtMyAwTDEwIDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTRoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDZoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDloLjAxIiB9XQogICAgXTsKICAgIHZhciBEaWZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgM3YxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDEwaDE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMjFoMTQiIH1dCiAgICBdOwogICAgdmFyIERpc2MyID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMmguMDEiIH1dCiAgICBdOwogICAgdmFyIERpc2MzID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxMmMwLTEuNy43LTMuMiAxLjgtNC4yIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTJjMCAxLjctLjcgMy4yLTEuOCA0LjIiIH1dCiAgICBdOwogICAgdmFyIERpc2MgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIyIiB9XQogICAgXTsKICAgIHZhciBEaXNjQWxidW0gPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICI1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEyaC4wMSIgfV0KICAgIF07CiAgICB2YXIgRGl2aWRlID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiNiIsIHI6ICIxIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjUiLCB4MjogIjE5IiwgeTE6ICIxMiIsIHkyOiAiMTIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTgiLCByOiAiMSIgfV0KICAgIF07CiAgICB2YXIgRG5hT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMmMtMS4zNSAxLjUtMi4wOTIgMy0yLjUgNC41TDE0IDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgNi0yLjg5MS0yLjg5MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE1YzMuMzMzLTMgNi42NjctMyAxMC0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMCA5IC44OTEuODkxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDljLTEuNSAxLjM1LTMgMi4wOTItNC41IDIuNWwtMS0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuMTA5IDE0LjEwOSA0IDE1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYuNSAxMi41IDEgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03IDE4IDIuODkxIDIuODkxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMjJjMS4zNS0xLjUgMi4wOTItMyAyLjUtNC41TDEwIDE2IiB9XQogICAgXTsKICAgIHZhciBEbmEgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCAxNiAxLjUgMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDgtMS41LTEuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAyYy0xLjc5OCAxLjk5OC0yLjUxOCAzLjk5NS0yLjgwNyA1Ljk5MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNi41IDEwLjUgMSAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDYtMi44OTEtMi44OTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxNWM2LjY2Ny02IDEzLjMzMyAwIDIwLTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAgOSAuODkxLjg5MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zLjEwOSAxNC4xMDkgNCAxNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02LjUgMTIuNSAxIDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNyAxOCAyLjg5MSAyLjg5MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDIyYzEuNzk4LTEuOTk4IDIuNTE4LTMuOTk1IDIuODA3LTUuOTkzIiB9XQogICAgXTsKICAgIHZhciBEb2NrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA4aDIwIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTYiLCB4OiAiMiIsIHk6ICI0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTZoMTIiIH1dCiAgICBdOwogICAgdmFyIERvZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExLjI1IDE2LjI1aDEuNUwxMiAxN3oiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTR2LjUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNC40MiAxMS4yNDdBMTMuMTUyIDEzLjE1MiAwIDAgMCA0IDE0LjU1NkM0IDE4LjcyOCA3LjU4MiAyMSAxMiAyMXM4LTIuMjcyIDgtNi40NDRhMTEuNzAyIDExLjcwMiAwIDAgMC0uNDkzLTMuMzA5IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTR2LjUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOC41IDguNWMtLjM4NCAxLjA1LTEuMDgzIDIuMDI4LTIuMzQ0IDIuNS0xLjkzMS43MjItMy41NzYtLjI5Ny0zLjY1Ni0xLS4xMTMtLjk5NCAxLjE3Ny02LjUzIDQtNyAxLjkyMy0uMzIxIDMuNjUxLjg0NSAzLjY1MSAyLjIzNUE3LjQ5NyA3LjQ5NyAwIDAgMSAxNCA1LjI3N2MwLTEuMzkgMS44NDQtMi41OTggMy43NjctMi4yNzcgMi44MjMuNDcgNC4xMTMgNi4wMDYgNCA3LS4wOC43MDMtMS43MjUgMS43MjItMy42NTYgMS0xLjI2MS0uNDcyLTEuODU1LTEuNDUtMi4yMzktMi41IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBEb2xsYXJTaWduID0gWwogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICIyIiwgeTI6ICIyMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyA1SDkuNWEzLjUgMy41IDAgMCAwIDAgN2g1YTMuNSAzLjUgMCAwIDEgMCA3SDYiIH1dCiAgICBdOwogICAgdmFyIERvbnV0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAuNSAxMGEyLjUgMi41IDAgMCAxLTIuNC0zSDE4YTIuOTUgMi45NSAwIDAgMS0yLjYtNC40IDEwIDEwIDAgMSAwIDYuMyA3LjFjLS4zLjItLjguMy0xLjIuMyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIzIiB9XQogICAgXTsKICAgIHZhciBEb29yQ2xvc2VkTG9ja2VkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDlWNmEyIDIgMCAwIDAtMi0ySDhhMiAyIDAgMCAwLTIgMnYxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIwaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTd2LTJhMiAyIDAgMSAwLTQgMHYyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMTQiLCB5OiAiMTciLCB3aWR0aDogIjgiLCBoZWlnaHQ6ICI1Iiwgcng6ICIxIiB9XQogICAgXTsKICAgIHZhciBEb29yQ2xvc2VkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDIwVjZhMiAyIDAgMCAwLTItMkg4YTIgMiAwIDAgMC0yIDJ2MTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMGgyMCIgfV0KICAgIF07CiAgICB2YXIgRG9vck9wZW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAyMEgyIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTExIDQuNTYydjE2LjE1N2ExIDEgMCAwIDAgMS4yNDIuOTdMMTkgMjBWNS41NjJhMiAyIDAgMCAwLTEuNTE1LTEuOTRsLTQtMUEyIDIgMCAwIDAgMTEgNC41NjF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDRIOGEyIDIgMCAwIDAtMiAydjE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDEyaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAyMGgtMyIgfV0KICAgIF07CiAgICB2YXIgRG90ID0gW1siY2lyY2xlIiwgeyBjeDogIjEyLjEiLCBjeTogIjEyLjEiLCByOiAiMSIgfV1dOwogICAgdmFyIERvd25sb2FkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTVWMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMTAgNSA1IDUtNSIgfV0KICAgIF07CiAgICB2YXIgRHJhZnRpbmdDb21wYXNzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIuOTkgNi43NCAxLjkzIDMuNDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkuMTM2IDEyYTEwIDEwIDAgMCAxLTE0LjI3MSAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDIxLTIuMTYtMy44NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDIxIDguMDItMTQuMjYiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiNSIsIHI6ICIyIiB9XQogICAgXTsKICAgIHZhciBEcmFtYSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDExaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA2aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA2aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjUgMTMuMWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgNWMwIDktNCAxMi02IDEycy02LTMtNi0xMmMwLTIgMi0zIDYtM3M2IDEgNiAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjQgOS45Yy0uOC44LTIgLjgtMi44IDAiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTAuMSA3LjFDOSA3LjIgNy43IDcuNyA2IDguNmMtMy41IDItNC43IDMuOS0zLjcgNS42IDQuNSA3LjggOS41IDguNCAxMS4yIDcuNC45LS41IDEuOS0yLjEgMS45LTQuNyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjEgMTYuNWMuMy0xLjEgMS40LTEuNyAyLjQtMS40IiB9XQogICAgXTsKICAgIHZhciBEcmliYmJsZSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5LjEzIDUuMDlDMTUuMjIgOS4xNCAxMCAxMC40NCAyLjI1IDEwLjk0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxLjc1IDEyLjg0Yy02LjYyLTEuNDEtMTIuMTQgMS0xNi4zOCA2LjMyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguNTYgMi43NWM0LjM3IDYgNiA5LjQyIDggMTcuNzIiIH1dCiAgICBdOwogICAgdmFyIERyaWxsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMThhMSAxIDAgMCAxIDEgMXYyYTEgMSAwIDAgMS0xIDFINWEzIDMgMCAwIDEtMy0zIDEgMSAwIDAgMSAxLTF6IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEzIDEwSDRhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOWExIDEgMCAwIDEgMSAxdjZhMSAxIDAgMCAxLTEgMWwtLjgxIDMuMjQyYTEgMSAwIDAgMS0uOTcuNzU4SDgiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgNGgzYTEgMSAwIDAgMSAxIDF2MmExIDEgMCAwIDEtMSAxaC0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDZoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01IDEwLTIgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03IDE4IDItOCIgfV0KICAgIF07CiAgICB2YXIgRHJvbmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMCA3IDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgMTQtMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDEwIDMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAxNCAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQuMjA1IDQuMTM5YTQgNCAwIDEgMSA1LjQzOSA1Ljg2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOS42MzcgMTRhNCA0IDAgMSAxLTUuNDMyIDUuODY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQuMzY3IDEwYTQgNCAwIDEgMSA1LjQzOC01Ljg2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05Ljc5NSAxOS44NjJhNCA0IDAgMSAxLTUuNDI5LTUuODczIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMTAiLCB5OiAiOCIsIHdpZHRoOiAiNCIsIGhlaWdodDogIjgiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIERyb3BsZXRPZmYgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOC43MTUgMTMuMTg2QzE4LjI5IDExLjg1OCAxNy4zODQgMTAuNjA3IDE2IDkuNWMtMi0xLjYtMy41LTQtNC02LjVhMTAuNyAxMC43IDAgMCAxLS44ODQgMi41ODYiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguNzk1IDguNzk3QTExIDExIDAgMCAxIDggOS41QzYgMTEuMSA1IDEzIDUgMTVhNyA3IDAgMCAwIDEzLjIyMiAzLjIwOCIgfV0KICAgIF07CiAgICB2YXIgRHJvcGxldCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyIDIyYTcgNyAwIDAgMCA3LTdjMC0yLTEtMy45LTMtNS41cy0zLjUtNC00LTYuNWMtLjUgMi41LTIgNC45LTQgNi41QzYgMTEuMSA1IDEzIDUgMTVhNyA3IDAgMCAwIDcgN3oiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIERyb3BsZXRzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNyAxNi4zYzIuMiAwIDQtMS44MyA0LTQuMDUgMC0xLjE2LS41Ny0yLjI2LTEuNzEtMy4xOVM3LjI5IDYuNzUgNyA1LjNjLS4yOSAxLjQ1LTEuMTQgMi44NC0yLjI5IDMuNzZTMyAxMS4xIDMgMTIuMjVjMCAyLjIyIDEuOCA0LjA1IDQgNC4wNXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTIuNTYgNi42QTEwLjk3IDEwLjk3IDAgMCAwIDE0IDMuMDJjLjUgMi41IDIgNC45IDQgNi41czMgMy41IDMgNS41YTYuOTggNi45OCAwIDAgMS0xMS45MSA0Ljk3IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBEcnVtID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDggOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiAyLTggOCIgfV0sCiAgICAgIFsiZWxsaXBzZSIsIHsgY3g6ICIxMiIsIGN5OiAiOSIsIHJ4OiAiMTAiLCByeTogIjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMy40djcuOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNHY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDEzLjR2Ny45IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgOXY4YTEwIDUgMCAwIDAgMjAgMFY5IiB9XQogICAgXTsKICAgIHZhciBEcnVtc3RpY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNS40IDE1LjYzYTcuODc1IDYgMTM1IDEgMSA2LjIzLTYuMjMgNC41IDMuNDMgMTM1IDAgMC02LjIzIDYuMjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOC4yOSAxMi43MS0yLjYgMi42YTIuNSAyLjUgMCAxIDAtMS42NSA0LjY1QTIuNSAyLjUgMCAxIDAgOC43IDE4LjNsMi41OS0yLjU5IiB9XQogICAgXTsKICAgIHZhciBEdW1iYmVsbCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE3LjU5NiAxMi43NjhhMiAyIDAgMSAwIDIuODI5LTIuODI5bC0xLjc2OC0xLjc2N2EyIDIgMCAwIDAgMi44MjgtMi44MjlsLTIuODI4LTIuODI4YTIgMiAwIDAgMC0yLjgyOSAyLjgyOGwtMS43NjctMS43NjhhMiAyIDAgMSAwLTIuODI5IDIuODI5eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yLjUgMjEuNSAxLjQtMS40IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwLjEgMy45IDEuNC0xLjQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNS4zNDMgMjEuNDg1YTIgMiAwIDEgMCAyLjgyOS0yLjgyOGwxLjc2NyAxLjc2OGEyIDIgMCAxIDAgMi44MjktMi44MjlsLTYuMzY0LTYuMzY0YTIgMiAwIDEgMC0yLjgyOSAyLjgyOWwxLjc2OCAxLjc2N2EyIDIgMCAwIDAtMi44MjggMi44Mjl6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkuNiAxNC40IDQuOC00LjgiIH1dCiAgICBdOwogICAgdmFyIEVhck9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTguNWEzLjUgMy41IDAgMSAwIDcgMGMwLTEuNTcuOTItMi41MiAyLjA0LTMuNDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA4LjVjMC0uNzUuMTMtMS40Ny4zNi0yLjE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguOCAzLjE1QTYuNSA2LjUgMCAwIDEgMTkgOC41YzAgMS42My0uNDQgMi44MS0xLjA5IDMuNzYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIuNSA2QTIuNSAyLjUgMCAwIDEgMTUgOC41TTEwIDEzYTIgMiAwIDAgMCAxLjgyLTEuMTgiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMiIsIHgyOiAiMjIiLCB5MTogIjIiLCB5MjogIjIyIiB9XQogICAgXTsKICAgIHZhciBFYXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDguNWE2LjUgNi41IDAgMSAxIDEzIDBjMCA2LTYgNi02IDEwYTMuNSAzLjUgMCAxIDEtNyAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDguNWEyLjUgMi41IDAgMCAwLTUgMHYxYTIgMiAwIDEgMSAwIDQiIH1dCiAgICBdOwogICAgdmFyIEVhcnRoID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEuNTQgMTVIMTdhMiAyIDAgMCAwLTIgMnY0LjU0IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNNyAzLjM0VjVhMyAzIDAgMCAwIDMgM2EyIDIgMCAwIDEgMiAyYzAgMS4xLjkgMiAyIDJhMiAyIDAgMCAwIDItMmMwLTEuMS45LTIgMi0yaDMuMTciIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDIxLjk1VjE4YTIgMiAwIDAgMC0yLTJhMiAyIDAgMCAxLTItMnYtMWEyIDIgMCAwIDAtMi0ySDIuMDUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dCiAgICBdOwogICAgdmFyIEVhcnRoTG9jayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMy4zNFY1YTMgMyAwIDAgMCAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMjEuOTVWMThhMiAyIDAgMCAwLTItMiAyIDIgMCAwIDEtMi0ydi0xYTIgMiAwIDAgMC0yLTJIMi4wNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMS41NCAxNUgxN2EyIDIgMCAwIDAtMiAydjQuNTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMmExMCAxMCAwIDEgMCA5LjU0IDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDZWNGEyIDIgMCAxIDAtNCAwdjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiOCIsIGhlaWdodDogIjUiLCB4OiAiMTQiLCB5OiAiNiIsIHJ4OiAiMSIgfV0KICAgIF07CiAgICB2YXIgRWNsaXBzZSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJhNyA3IDAgMSAwIDEwIDEwIiB9XQogICAgXTsKICAgIHZhciBFZ2dGcmllZCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTEuNSIsIGN5OiAiMTIuNSIsIHI6ICIzLjUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMyA4YzAtMy41IDIuNS02IDYuNS02IDUgMCA0LjgzIDMgNy41IDVzNSAyIDUgNmMwIDQuNS0yLjUgNi41LTcgNi41LTIuNSAwLTIuNSAyLjUtNiAyLjVzLTctMi03LTUuNWMwLTMgMS41LTMgMS41LTVDMy41IDEwIDMgOSAzIDhaIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBFZ2dPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTQuMzQ3VjE0YzAtNi00LTEyLTgtMTItMS4wNzggMC0yLjE1Ny40MzYtMy4xNTcgMS4xOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjIwNiA2LjIxQzQuODcxIDguNCA0IDExLjIgNCAxNGE4IDggMCAwIDAgMTQuNTY4IDQuNTY4IiB9XQogICAgXTsKICAgIHZhciBFZ2cgPSBbWyJwYXRoIiwgeyBkOiAiTTEyIDJDOCAyIDQgOCA0IDE0YTggOCAwIDAgMCAxNiAwYzAtNi00LTEyLTgtMTIiIH1dXTsKICAgIHZhciBFbGxpcHNpc1ZlcnRpY2FsID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICI1IiwgcjogIjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTkiLCByOiAiMSIgfV0KICAgIF07CiAgICB2YXIgRWxsaXBzaXMgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTkiLCBjeTogIjEyIiwgcjogIjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI1IiwgY3k6ICIxMiIsIHI6ICIxIiB9XQogICAgXTsKICAgIHZhciBFcXVhbEFwcHJveGltYXRlbHkgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE1YTYuNSA2LjUgMCAwIDEgNyAwIDYuNSA2LjUgMCAwIDAgNyAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgOWE2LjUgNi41IDAgMCAxIDcgMCA2LjUgNi41IDAgMCAwIDcgMCIgfV0KICAgIF07CiAgICB2YXIgRXF1YWxOb3QgPSBbCiAgICAgIFsibGluZSIsIHsgeDE6ICI1IiwgeDI6ICIxOSIsIHkxOiAiOSIsIHkyOiAiOSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI1IiwgeDI6ICIxOSIsIHkxOiAiMTUiLCB5MjogIjE1IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE5IiwgeDI6ICI1IiwgeTE6ICI1IiwgeTI6ICIxOSIgfV0KICAgIF07CiAgICB2YXIgRXF1YWwgPSBbCiAgICAgIFsibGluZSIsIHsgeDE6ICI1IiwgeDI6ICIxOSIsIHkxOiAiOSIsIHkyOiAiOSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI1IiwgeDI6ICIxOSIsIHkxOiAiMTUiLCB5MjogIjE1IiB9XQogICAgXTsKICAgIHZhciBFcmFzZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMSAyMUg4YTIgMiAwIDAgMS0xLjQyLS41ODdsLTMuOTk0LTMuOTk5YTIgMiAwIDAgMSAwLTIuODI4bDEwLTEwYTIgMiAwIDAgMSAyLjgyOSAwbDUuOTk5IDZhMiAyIDAgMCAxIDAgMi44MjhMMTIuODM0IDIxIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTUuMDgyIDExLjA5IDguODI4IDguODI4IiB9XQogICAgXTsKICAgIHZhciBFdGhlcm5ldFBvcnQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAibTE1IDIwIDMtM2gyYTIgMiAwIDAgMCAyLTJWNmEyIDIgMCAwIDAtMi0ySDRhMiAyIDAgMCAwLTIgMnY5YTIgMiAwIDAgMCAyIDJoMmwzIDN6IiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDh2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA4djEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgOHYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDh2MSIgfV0KICAgIF07CiAgICB2YXIgRXVybyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTBoMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxNGg5IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTkgNmE3LjcgNy43IDAgMCAwLTUuMi0yQTcuOSA3LjkgMCAwIDAgNiAxMmMwIDQuNCAzLjUgOCA3LjggOCAyIDAgMy44LS44IDUuMi0yIiB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgRXZDaGFyZ2VyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTNoMmEyIDIgMCAwIDEgMiAydjJhMiAyIDAgMCAwIDQgMHYtNi45OThhMiAyIDAgMCAwLS41OS0xLjQyTDE4IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjFWNWEyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIxaDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgN2gxMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDExLTIgM2gzbC0yIDMiIH1dCiAgICBdOwogICAgdmFyIEV4cGFuZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDE1IDYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA5IDYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNnY1aC01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDhWM2gtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE2djVoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDIxIDYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDhWM2g1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgOSAzIDMiIH1dCiAgICBdOwogICAgdmFyIEV4dGVybmFsTGluayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDNoNnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE0IDIxIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTN2NmEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoNiIgfV0KICAgIF07CiAgICB2YXIgRXllQ2xvc2VkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgMTgtLjcyMi0zLjI1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgOGExMC42NDUgMTAuNjQ1IDAgMCAwIDIwIDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAgMTUtMS43MjYtMi4wNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm00IDE1IDEuNzI2LTIuMDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxOCAuNzIyLTMuMjUiIH1dCiAgICBdOwogICAgdmFyIEV5ZU9mZiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwLjczMyA1LjA3NmExMC43NDQgMTAuNzQ0IDAgMCAxIDExLjIwNSA2LjU3NSAxIDEgMCAwIDEgMCAuNjk2IDEwLjc0NyAxMC43NDcgMCAwIDEtMS40NDQgMi40OSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNC4wODQgMTQuMTU4YTMgMyAwIDAgMS00LjI0Mi00LjI0MiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNy40NzkgMTcuNDk5YTEwLjc1IDEwLjc1IDAgMCAxLTE1LjQxNy01LjE1MSAxIDEgMCAwIDEgMC0uNjk2IDEwLjc1IDEwLjc1IDAgMCAxIDQuNDQ2LTUuMTQzIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0KICAgIF07CiAgICB2YXIgRXllID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMi4wNjIgMTIuMzQ4YTEgMSAwIDAgMSAwLS42OTYgMTAuNzUgMTAuNzUgMCAwIDEgMTkuODc2IDAgMSAxIDAgMCAxIDAgLjY5NiAxMC43NSAxMC43NSAwIDAgMS0xOS44NzYgMCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIzIiB9XQogICAgXTsKICAgIHZhciBGYWNlYm9vayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDJoLTNhNSA1IDAgMCAwLTUgNXYzSDd2NGgzdjhoNHYtOGgzbDEtNGgtNFY3YTEgMSAwIDAgMSAxLTFoM3oiIH1dCiAgICBdOwogICAgdmFyIEZhY3RvcnkgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTZoLjAxIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMgMTlhMiAyIDAgMCAwIDIgMmgxNGEyIDIgMCAwIDAgMi0yVjguNWEuNS41IDAgMCAwLS43NjktLjQyMmwtNC40NjIgMi44NDRBLjUuNSAwIDAgMSAxNSAxMC41di0yYS41LjUgMCAwIDAtLjc2OS0uNDIyTDkuNzcgMTAuOTIyQS41LjUgMCAwIDEgOSAxMC41VjVhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTZoLjAxIiB9XQogICAgXTsKICAgIHZhciBGYW4gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMC44MjcgMTYuMzc5YTYuMDgyIDYuMDgyIDAgMCAxLTguNjE4LTcuMDAybDUuNDEyIDEuNDVhNi4wODIgNi4wODIgMCAwIDEgNy4wMDItOC42MThsLTEuNDUgNS40MTJhNi4wODIgNi4wODIgMCAwIDEgOC42MTggNy4wMDJsLTUuNDEyLTEuNDVhNi4wODIgNi4wODIgMCAwIDEtNy4wMDIgOC42MThsMS40NS01LjQxMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJ2LjAxIiB9XQogICAgXTsKICAgIHZhciBGYXN0Rm9yd2FyZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZhMiAyIDAgMCAxIDMuNDE0LTEuNDE0bDYgNmEyIDIgMCAwIDEgMCAyLjgyOGwtNiA2QTIgMiAwIDAgMSAxMiAxOHoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA2YTIgMiAwIDAgMSAzLjQxNC0xLjQxNGw2IDZhMiAyIDAgMCAxIDAgMi44MjhsLTYgNkEyIDIgMCAwIDEgMiAxOHoiIH1dCiAgICBdOwogICAgdmFyIEZlbmNlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAzIDIgNXYxNWMwIC42LjQgMSAxIDFoMmMuNiAwIDEtLjQgMS0xVjVaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgOGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMThoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMiAzLTIgMnYxNWMwIC42LjQgMSAxIDFoMmMuNiAwIDEtLjQgMS0xVjVaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDhoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxOGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwIDMtMiAydjE1YzAgLjYuNCAxIDEgMWgyYy42IDAgMS0uNCAxLTFWNVoiIH1dCiAgICBdOwogICAgdmFyIEZlYXRoZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMi42NyAxOWEyIDIgMCAwIDAgMS40MTYtLjU4OGw2LjE1NC02LjE3MmE2IDYgMCAwIDAtOC40OS04LjQ5TDUuNTg2IDkuOTE0QTIgMiAwIDAgMCA1IDExLjMyOFYxOGExIDEgMCAwIDAgMSAxeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA4IDIgMjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuNSAxNUg5IiB9XQogICAgXTsKICAgIHZhciBGZXJyaXNXaGVlbCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYuOCAxNS0zLjUgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMC43IDctMy41IDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi44IDkgMy4zIDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAuNyAxNy0zLjUtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDIyIDMtOCAzIDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAyMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE4LjdhOSA5IDAgMSAwLTEyIDAiIH1dCiAgICBdOwogICAgdmFyIEZpZ21hID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSA1LjVBMy41IDMuNSAwIDAgMSA4LjUgMkgxMnY3SDguNUEzLjUgMy41IDAgMCAxIDUgNS41eiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyaDMuNWEzLjUgMy41IDAgMSAxIDAgN0gxMlYyeiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMi41YTMuNSAzLjUgMCAxIDEgNyAwIDMuNSAzLjUgMCAxIDEtNyAweiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE5LjVBMy41IDMuNSAwIDAgMSA4LjUgMTZIMTJ2My41YTMuNSAzLjUgMCAxIDEtNyAweiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDEyLjVBMy41IDMuNSAwIDAgMSA4LjUgOUgxMnY3SDguNUEzLjUgMy41IDAgMCAxIDUgMTIuNXoiIH1dCiAgICBdOwogICAgdmFyIEZpbGVBcmNoaXZlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTMuNjU5IDIySDE4YTIgMiAwIDAgMCAyLTJWOGEyLjQgMi40IDAgMCAwLS43MDYtMS43MDZsLTMuNTg4LTMuNTg4QTIuNCAyLjQgMCAwIDAgMTQgMkg2YTIgMiAwIDAgMC0yIDJ2MTEuNSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJ2LTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxOHYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDdWNiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjgiLCBjeTogIjIwIiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIEZpbGVBeGlzM2QgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02IDIyYTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNC43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAxOCA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMHY4aDgiIH1dCiAgICBdOwogICAgdmFyIEZpbGVCYWRnZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEzIDIyaDVhMiAyIDAgMCAwIDItMlY4YTIuNCAyLjQgMCAwIDAtLjcwNi0xLjcwNmwtMy41ODgtMy41ODhBMi40IDIuNCAwIDAgMCAxNCAySDZhMiAyIDAgMCAwLTIgMnYzLjMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm03LjY5IDE2LjQ3OSAxLjI5IDQuODhhLjUuNSAwIDAgMS0uNjk4LjU5MWwtMS44NDMtLjg0OWExIDEgMCAwIDAtLjg3OS4wMDFsLTEuODQ2Ljg1YS41LjUgMCAwIDEtLjY5Mi0uNTkzbDEuMjktNC44OCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYiLCBjeTogIjE0IiwgcjogIjMiIH1dCiAgICBdOwogICAgdmFyIEZpbGVCb3ggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNC41IDIySDE4YTIgMiAwIDAgMCAyLTJWOGEyLjQgMi40IDAgMCAwLS43MDYtMS43MDZsLTMuNTg4LTMuNTg4QTIuNCAyLjQgMCAwIDAgMTQgMkg2YTIgMiAwIDAgMC0yIDJ2My44IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEuNyAxNC4yIDcgMTdsLTQuNy0yLjgiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMyAxMy4xYTIgMiAwIDAgMC0uOTk5IDEuNzZ2My4yNGEyIDIgMCAwIDAgLjk2OSAxLjc4TDYgMjEuN2EyIDIgMCAwIDAgMi4wMy4wMUwxMSAxOS45YTIgMiAwIDAgMCAxLTEuNzZWMTQuOWEyIDIgMCAwIDAtLjk3LTEuNzhMOCAxMS4zYTIgMiAwIDAgMC0yLjAzLS4wMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxN3Y1IiB9XQogICAgXTsKICAgIHZhciBGaWxlQnJhY2VzQ29ybmVyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTQgMjJoNGEyIDIgMCAwIDAgMi0yVjhhMi40IDIuNCAwIDAgMC0uNzA2LTEuNzA2bC0zLjU4OC0zLjU4OEEyLjQgMi40IDAgMCAwIDE0IDJINmEyIDIgMCAwIDAtMiAydjYiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE0YTEgMSAwIDAgMC0xIDF2MmExIDEgMCAwIDEtMSAxIDEgMSAwIDAgMSAxIDF2MmExIDEgMCAwIDAgMSAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMjJhMSAxIDAgMCAwIDEtMXYtMmExIDEgMCAwIDEgMS0xIDEgMSAwIDAgMS0xLTF2LTJhMSAxIDAgMCAwLTEtMSIgfV0KICAgIF07CiAgICB2YXIgRmlsZUNoYXJ0Q29sdW1uSW5jcmVhc2luZyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYgMjJhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA0LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE4di0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4di00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE4di02IiB9XQogICAgXTsKICAgIHZhciBGaWxlQ2hhcnRDb2x1bW4gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02IDIyYTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNC43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxOHYtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOHYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxOHYtMyIgfV0KICAgIF07CiAgICB2YXIgRmlsZUJyYWNlcyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYgMjJhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA0LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMmExIDEgMCAwIDAtMSAxdjFhMSAxIDAgMCAxLTEgMSAxIDEgMCAwIDEgMSAxdjFhMSAxIDAgMCAwIDEgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxOGExIDEgMCAwIDAgMS0xdi0xYTEgMSAwIDAgMSAxLTEgMSAxIDAgMCAxLTEtMXYtMWExIDEgMCAwIDAtMS0xIiB9XQogICAgXTsKICAgIHZhciBGaWxlQ2hhcnRMaW5lID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDEzLTMuNSAzLjUtMi0yTDggMTciIH1dCiAgICBdOwogICAgdmFyIEZpbGVDaGFydFBpZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE1Ljk0MSAyMkgxOGEyIDIgMCAwIDAgMi0yVjhhMi40IDIuNCAwIDAgMC0uNzA2LTEuNzA0bC0zLjU4OC0zLjU4OEEyLjQgMi40IDAgMCAwIDE0IDJINmEyIDIgMCAwIDAtMiAydjMuNTEyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC4wMTcgMTEuNTEyYTYgNiAwIDEgMCA4LjQ2NiA4LjQ3NSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk05IDE2YTEgMSAwIDAgMS0xLTF2LTRjMC0uNTUyLjQ1LTEuMDA4Ljk5NS0uOTE3YTYgNiAwIDAgMSA0LjkyMiA0LjkyMmMuMDkxLjU0NC0uMzY1Ljk5NS0uOTE3Ljk5NXoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEZpbGVDaGVja0Nvcm5lciA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwLjUgMjJINmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDYuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHY2IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgMjAgMiAyIDQtNCIgfV0KICAgIF07CiAgICB2YXIgRmlsZUNoZWNrID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTUgMiAyIDQtNCIgfV0KICAgIF07CiAgICB2YXIgRmlsZUNsb2NrID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTYgMjJoMmEyIDIgMCAwIDAgMi0yVjhhMi40IDIuNCAwIDAgMC0uNzA2LTEuNzA2bC0zLjU4OC0zLjU4OEEyLjQgMi40IDAgMCAwIDE0IDJINmEyIDIgMCAwIDAtMiAydjIuODUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE0djIuMmwxLjYgMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjgiLCBjeTogIjE2IiwgcjogIjYiIH1dCiAgICBdOwogICAgdmFyIEZpbGVDb2RlQ29ybmVyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNCAxMi4xNVY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA2LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMmgtMy4zNSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTUgMTYtMyAzIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDIyIDMtMy0zLTMiIH1dCiAgICBdOwogICAgdmFyIEZpbGVDb2RlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEyLjUgOCAxNWwyIDIuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAxMi41IDIgMi41LTIgMi41IiB9XQogICAgXTsKICAgIHZhciBGaWxlQ29nID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTMuODUgMjJIMThhMiAyIDAgMCAwIDItMlY4YTIgMiAwIDAgMC0uNTg2LTEuNDE0bC00LTRBMiAyIDAgMCAwIDE0IDJINmEyIDIgMCAwIDAtMiAydjYuNiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMuMzA1IDE5LjUzLjkyMy0uMzgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTQuMjI4IDE2Ljg1Mi0uOTI0LS4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNS44NTIgMTUuMjI4LS4zODMtLjkyMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01Ljg1MiAyMC43NzItLjM4My45MjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOC4xNDggMTUuMjI4LjM4My0uOTIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTguNTMgMjEuNjk2LS4zODItLjkyNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05Ljc3MyAxNi44NTIuOTIyLS4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOS43NzMgMTkuMTQ4LjkyMi4zODMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI3IiwgY3k6ICIxOCIsIHI6ICIzIiB9XQogICAgXTsKICAgIHZhciBGaWxlRGlmZiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYgMjJhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA0LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMGg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEzVjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxN2g2IiB9XQogICAgXTsKICAgIHZhciBGaWxlRGlnaXQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDEyVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDYuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTZoMnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDIyaDQiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjE2Iiwgd2lkdGg6ICI0IiwgaGVpZ2h0OiAiNiIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgRmlsZURvd24gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02IDIyYTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNC43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTh2LTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxNSAzIDMgMy0zIiB9XQogICAgXTsKICAgIHZhciBGaWxlRXhjbGFtYXRpb25Qb2ludCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYgMjJhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA0LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOXY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3aC4wMSIgfV0KICAgIF07CiAgICB2YXIgRmlsZUhlYWRwaG9uZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQgNi44MzVWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNi43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJoLS4zNDMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTIgMTlhMiAyIDAgMCAxIDQgMHYxYTIgMiAwIDAgMS00IDB2LTRhNiA2IDAgMCAxIDEyIDB2NGEyIDIgMCAwIDEtNCAwdi0xYTIgMiAwIDAgMSA0IDAiIH0KICAgICAgXQogICAgXTsKICAgIHZhciBGaWxlSGVhcnQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMyAyMmg1YTIgMiAwIDAgMCAyLTJWOGEyLjQgMi40IDAgMCAwLS43MDYtMS43MDZsLTMuNTg4LTMuNTg4QTIuNCAyLjQgMCAwIDAgMTQgMkg2YTIgMiAwIDAgMC0yIDJ2NyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMuNjIgMTguOEEyLjI1IDIuMjUgMCAxIDEgNyAxNS44MzZhMi4yNSAyLjI1IDAgMSAxIDMuMzggMi45NjZsLTIuNjI2IDIuODU2YTEgMSAwIDAgMS0xLjUwNyAweiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgRmlsZUltYWdlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTAiLCBjeTogIjEyIiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAgMTctMS4yOTYtMS4yOTZhMi40MSAyLjQxIDAgMCAwLTMuNDA4IDBMOSAyMiIgfV0KICAgIF07CiAgICB2YXIgRmlsZUlucHV0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNCAxMVY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA2LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMkg2YTIgMiAwIDAgMS0yLTJ2LTEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE1aDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTggMy0zLTMtMyIgfV0KICAgIF07CiAgICB2YXIgRmlsZUtleSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwLjY1IDIySDE4YTIgMiAwIDAgMCAyLTJWOGEyLjQgMi40IDAgMCAwLS43MDYtMS43MDZsLTMuNTg4LTMuNTg4QTIuNCAyLjQgMCAwIDAgMTQgMkg2YTIgMiAwIDAgMC0yIDJ2MTAuMSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEwIDE1IDEgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMSAxNC00LjU4NiA0LjU4NiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjIwIiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIEZpbGVMb2NrID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNCA5LjhWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNi43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJoLTMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE3di0yYTIgMiAwIDAgMC00IDB2MiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiNSIsIHg6ICIzIiwgeTogIjE3Iiwgcng6ICIxIiB9XQogICAgXTsKICAgIHZhciBGaWxlTWludXNDb3JuZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAxNFY4YTIuNCAyLjQgMCAwIDAtLjcwNi0xLjcwNmwtMy41ODgtMy41ODhBMi40IDIuNCAwIDAgMCAxNCAySDZhMiAyIDAgMCAwLTIgMnYxNmEyIDIgMCAwIDAgMiAyaDEyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMThoNiIgfV0KICAgIF07CiAgICB2YXIgRmlsZU11c2ljID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEuNjUgMjJIMThhMiAyIDAgMCAwIDItMlY4YTIuNCAyLjQgMCAwIDAtLjcwNi0xLjcwNmwtMy41ODgtMy41ODhBMi40IDIuNCAwIDAgMCAxNCAySDZhMiAyIDAgMCAwLTIgMnYxMC4zNSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjB2LTdsMyAxLjQ3NCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYiLCBjeTogIjIwIiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIEZpbGVNaW51cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYgMjJhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA0LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE1aDYiIH1dCiAgICBdOwogICAgdmFyIEZpbGVPdXRwdXQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00LjIyNiAyMC45MjVBMiAyIDAgMCAwIDYgMjJoMTJhMiAyIDAgMCAwIDItMlY4YTIuNCAyLjQgMCAwIDAtLjcwNi0xLjcwNmwtMy41ODgtMy41ODhBMi40IDIuNCAwIDAgMCAxNCAySDZhMiAyIDAgMCAwLTIgMnYzLjEyNyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTUgMTEtMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTUgMTctMy0zaDEwIiB9XQogICAgXTsKICAgIHZhciBGaWxlUGVuTGluZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTE4LjIyNiA1LjIyNi0yLjUyLTIuNTJBMi40IDIuNCAwIDAgMCAxNCAySDZhMiAyIDAgMCAwLTIgMnYxNmEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAyLTJ2LS4zNTEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEuMzc4IDEyLjYyNmExIDEgMCAwIDAtMy4wMDQtMy4wMDRsLTQuMDEgNC4wMTJhMiAyIDAgMCAwLS41MDYuODU0bC0uODM3IDIuODdhLjUuNSAwIDAgMCAuNjIuNjJsMi44Ny0uODM3YTIgMiAwIDAgMCAuODU0LS41MDZ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMThoMSIgfV0KICAgIF07CiAgICB2YXIgRmlsZVBlbiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyLjY1OSAyMkgxOGEyIDIgMCAwIDAgMi0yVjhhMi40IDIuNCAwIDAgMC0uNzA2LTEuNzA2bC0zLjU4OC0zLjU4OEEyLjQgMi40IDAgMCAwIDE0IDJINmEyIDIgMCAwIDAtMiAydjkuMzQiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMC4zNzggMTIuNjIyYTEgMSAwIDAgMSAzIDMuMDAzTDguMzYgMjAuNjM3YTIgMiAwIDAgMS0uODU0LjUwNmwtMi44NjcuODM3YS41LjUgMCAwIDEtLjYyLS42MmwuODM2LTIuODY5YTIgMiAwIDAgMSAuNTA2LS44NTN6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBGaWxlUGxheSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYgMjJhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA0LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNS4wMzMgMTMuNDRhLjY0Ny42NDcgMCAwIDEgMCAxLjEybC00LjA2NSAyLjM1MmEuNjQ1LjY0NSAwIDAgMS0uOTY4LS41NnYtNC43MDRhLjY0NS42NDUgMCAwIDEgLjk2Ny0uNTZ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBGaWxlUGx1c0Nvcm5lciA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTExLjM1IDIySDZhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA2LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2NS4zNSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE5aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTZ2NiIgfV0KICAgIF07CiAgICB2YXIgRmlsZVBsdXMgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02IDIyYTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNC43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNWg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4di02IiB9XQogICAgXTsKICAgIHZhciBGaWxlUXVlc3Rpb25NYXJrID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS4xIDlhMyAzIDAgMCAxIDUuODIgMWMwIDItMyAzLTMgMyIgfV0KICAgIF07CiAgICB2YXIgRmlsZVNjYW4gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAxMFY4YTIuNCAyLjQgMCAwIDAtLjcwNi0xLjcwNGwtMy41ODgtMy41ODhBMi40IDIuNCAwIDAgMCAxNCAySDZhMiAyIDAgMCAwLTIgMnYxNmEyIDIgMCAwIDAgMiAyaDQuMzUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNGEyIDIgMCAwIDAtMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDIyYTIgMiAwIDAgMS0yLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTRhMiAyIDAgMCAxIDIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAyMmEyIDIgMCAwIDAgMi0yIiB9XQogICAgXTsKICAgIHZhciBGaWxlU2VhcmNoQ29ybmVyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEuMSAyMkg2YTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNi43MDZsMy41ODkgMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djMuMjUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAyMi0yLjg4LTIuODgiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNiIsIGN5OiAiMTciLCByOiAiMyIgfV0KICAgIF07CiAgICB2YXIgRmlsZVNlYXJjaCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYgMjJhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA0LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjExLjUiLCBjeTogIjE0LjUiLCByOiAiMi41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjMgMTYuMyAxNSAxOCIgfV0KICAgIF07CiAgICB2YXIgRmlsZVNpZ25hbCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYgMjJhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA0LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE1aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMS41IDEzLjVhMi41IDIuNSAwIDAgMSAwIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTJhNSA1IDAgMCAxIDAgNiIgfV0KICAgIF07CiAgICB2YXIgRmlsZVNsaWRlcnMgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02IDIyYTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNC43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDExdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxN2g4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE2djIiIH1dCiAgICBdOwogICAgdmFyIEZpbGVTcHJlYWRzaGVldCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYgMjJhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA0LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEzaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTNoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE3aDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTdoMiIgfV0KICAgIF07CiAgICB2YXIgRmlsZVN0YWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMjFhMSAxIDAgMCAxLTEgMUg0YTEgMSAwIDAgMS0xLTF2LThhMSAxIDAgMCAxIDEtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNmExIDEgMCAwIDEtMSAxSDlhMSAxIDAgMCAxLTEtMVY4YTEgMSAwIDAgMSAxLTEiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEgNmEyIDIgMCAwIDAtLjU4Ni0xLjQxNGwtMi0yQTIgMiAwIDAgMCAxNyAyaC0zYTEgMSAwIDAgMC0xIDF2OGExIDEgMCAwIDAgMSAxaDZhMSAxIDAgMCAwIDEtMXoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEZpbGVTeW1saW5rID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNCAxMVY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA2LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMkg2YTIgMiAwIDAgMS0yLTJ2LTNhMiAyIDAgMCAxIDItMmg3IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgMTggMy0zLTMtMyIgfV0KICAgIF07CiAgICB2YXIgRmlsZVRlcm1pbmFsID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggMTYgMi0yLTItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOGg0IiB9XQogICAgXTsKICAgIHZhciBGaWxlVGV4dCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYgMjJhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA0LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA5SDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTNIOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxN0g4IiB9XQogICAgXTsKICAgIHZhciBGaWxlVHlwZUNvcm5lciA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyIDIyaDZhMiAyIDAgMCAwIDItMlY4YTIuNCAyLjQgMCAwIDAtLjcwNi0xLjcwNmwtMy41ODgtMy41ODhBMi40IDIuNCAwIDAgMCAxNCAySDZhMiAyIDAgMCAwLTIgMnY2IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxNnYtMS41YS41LjUgMCAwIDEgLjUtLjVoN2EuNS41IDAgMCAxIC41LjVWMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAyMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTR2OCIgfV0KICAgIF07CiAgICB2YXIgRmlsZVR5cGUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02IDIyYTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNC43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMThoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTN2LS41YS41LjUgMCAwIDEgLjUtLjVoNWEuNS41IDAgMCAxIC41LjV2LjUiIH1dCiAgICBdOwogICAgdmFyIEZpbGVVcCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYgMjJhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA0LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDE1LTMtMy0zIDMiIH1dCiAgICBdOwogICAgdmFyIEZpbGVVc2VyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDIyYTQgNCAwIDAgMC04IDAiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTUiLCByOiAiMyIgfV0KICAgIF07CiAgICB2YXIgRmlsZVZpZGVvQ2FtZXJhID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNCAxMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA2LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJtMTAgMTcuODQzIDMuMDMzLTEuNzU1YS42NC42NCAwIDAgMSAuOTY3LjU2djQuNzA0YS42NS42NSAwIDAgMS0uOTY3LjU2TDEwIDIwLjE1NyIgfQogICAgICBdLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNyIsIGhlaWdodDogIjYiLCB4OiAiMyIsIHk6ICIxNiIsIHJ4OiAiMSIgfV0KICAgIF07CiAgICB2YXIgRmlsZVZvbHVtZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQgMTEuNTVWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNi43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJoLTEuOTUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNWE1IDUgMCAwIDEgMCA2IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTggMTQuNTAyYS41LjUgMCAwIDAtLjgyNi0uMzgxbC0xLjg5MyAxLjYzMWExIDEgMCAwIDEtLjY1MS4yNDNIMy41YS41LjUgMCAwIDAtLjUuNTAxdjMuMDA2YS41LjUgMCAwIDAgLjUuNTAxaDEuMTI5YTEgMSAwIDAgMSAuNjUyLjI0M2wxLjg5MyAxLjYzM2EuNS41IDAgMCAwIC44MjYtLjM4eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgRmlsZVhDb3JuZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMSAyMkg2YTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNi43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxNyA1IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAgMTctNSA1IiB9XQogICAgXTsKICAgIHZhciBGaWxlWCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYgMjJhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA0LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC41IDEyLjUtNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkuNSAxMi41IDUgNSIgfV0KICAgIF07CiAgICB2YXIgRmlsZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYgMjJhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA0LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0KICAgIF07CiAgICB2YXIgRmlsZXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAyaC00YTIgMiAwIDAgMC0yIDJ2MTFhMiAyIDAgMCAwIDIgMmg4YTIgMiAwIDAgMCAyLTJWOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNi43MDYgMi43MDZBMi40IDIuNCAwIDAgMCAxNSAydjVhMSAxIDAgMCAwIDEgMWg1YTIuNCAyLjQgMCAwIDAtLjcwNi0xLjcwNnoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSA3YTIgMiAwIDAgMC0yIDJ2MTFhMiAyIDAgMCAwIDIgMmg4YTIgMiAwIDAgMCAxLjczMi0xIiB9XQogICAgXTsKICAgIHZhciBGaWxtID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAzdjE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgNy41aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE2LjVoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAzdjE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDcuNWg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDE2LjVoNCIgfV0KICAgIF07CiAgICB2YXIgRmluZ2VycHJpbnRQYXR0ZXJuID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTBhMiAyIDAgMCAwLTIgMmMwIDEuMDItLjEgMi41MS0uMjYgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxMy4xMmMwIDIuMzggMCA2LjM4LTEgOC44OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy4yOSAyMS4wMmMuMTItLjYuNDMtMi4zLjUtMy4wMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEyYTEwIDEwIDAgMCAxIDE4LTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxNmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEuOCAxNmMuMi0yIC4xMzEtNS4zNTQgMC02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTkuNUM1LjUgMTggNiAxNSA2IDEyYTYgNiAwIDAgMSAuMzQtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjY1IDIyYy4yMS0uNjYuNDUtMS4zMi41Ny0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgNi44YTYgNiAwIDAgMSA5IDUuMnYyIiB9XQogICAgXTsKICAgIHZhciBGaXJlRXh0aW5ndWlzaGVyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgNi41VjNhMSAxIDAgMCAwLTEtMWgtMmExIDEgMCAwIDAtMSAxdjMuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE4aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggM2gtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAzYTYgNiAwIDAgMC02IDZ2MTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxM2g0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDEwYTQgNCAwIDAgMC04IDB2MTBhMiAyIDAgMCAwIDIgMmg0YTIgMiAwIDAgMCAyLTJaIiB9XQogICAgXTsKICAgIHZhciBGaXNoT2ZmID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTggMTIuNDd2LjAzbTAtLjV2LjQ3bS0uNDc1IDUuMDU2QTYuNzQ0IDYuNzQ0IDAgMCAxIDE1IDE4Yy0zLjU2IDAtNy41Ni0yLjUzLTguNS02IC4zNDgtMS4yOCAxLjExNC0yLjQzMyAyLjEyMS0zLjM4bTMuNDQ0LTIuMDg4QTguODAyIDguODAyIDAgMCAxIDE1IDZjMy41NiAwIDYuMDYgMi41NCA3IDYtLjMwOSAxLjE0LS43ODYgMi4xNzctMS40MTMgMy4wNTgiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNyAxMC42N0M3IDggNS41OCA1Ljk3IDIuNzMgNS41Yy0xIDEuNS0xIDUgLjIzIDYuNS0xLjI0IDEuNS0xLjI0IDUtLjIzIDYuNUM1LjU4IDE4LjAzIDcgMTYgNyAxMy4zM203LjQ4LTQuMzcyQTkuNzcgOS43NyAwIDAgMSAxNiA2LjA3bTAgMTEuODZhOS43NyA5Ljc3IDAgMCAxLTEuNzI4LTMuNjE4IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTE2LjAxIDE3LjkzLS4yMyAxLjRBMiAyIDAgMCAxIDEzLjggMjFIOS41YTUuOTYgNS45NiAwIDAgMCAxLjQ5LTMuOThNOC41MyAzaDUuMjdhMiAyIDAgMCAxIDEuOTggMS42N2wuMjMgMS40TTIgMmwyMCAyMCIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgRmlzaFN5bWJvbCA9IFtbInBhdGgiLCB7IGQ6ICJNMiAxNnM5LTE1IDIwLTRDMTEgMjMgMiA4IDIgOCIgfV1dOwogICAgdmFyIEZpc2ggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02LjUgMTJjLjk0LTMuNDYgNC45NC02IDguNS02IDMuNTYgMCA2LjA2IDIuNTQgNyA2LS45NCAzLjQ3LTMuNDQgNi03IDZzLTcuNTYtMi41My04LjUtNloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTJ2LjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTcuOTNhOS43NyA5Ljc3IDAgMCAxIDAtMTEuODYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNyAxMC42N0M3IDggNS41OCA1Ljk3IDIuNzMgNS41Yy0xIDEuNS0xIDUgLjIzIDYuNS0xLjI0IDEuNS0xLjI0IDUtLjIzIDYuNUM1LjU4IDE4LjAzIDcgMTYgNyAxMy4zMyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC40NiA3LjI2QzEwLjIgNS44OCA5LjE3IDQuMjQgOCAzaDUuOGEyIDIgMCAwIDEgMS45OCAxLjY3bC4yMyAxLjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYuMDEgMTcuOTMtLjIzIDEuNEEyIDIgMCAwIDEgMTMuOCAyMUg5LjVhNS45NiA1Ljk2IDAgMCAwIDEuNDktMy45OCIgfV0KICAgIF07CiAgICB2YXIgRmlzaGluZ0hvb2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNy41ODYgMTEuNDE0LTUuOTMgNS45M2ExIDEgMCAwIDEtOC04bDMuMTM3LTMuMTM3YS43MDcuNzA3IDAgMCAxIDEuMjA3LjVWMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAuNDE0IDguNTg2IDIyIDciIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiMTAiLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgRmxhZ09mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE2Yy0zIDAtNS0yLTgtMmE2IDYgMCAwIDAtNCAxLjUyOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAyMlY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcuNjU2IDJIOGMzIDAgNSAyIDcuMzMzIDJxMiAwIDMuMDY3LS44QTEgMSAwIDAgMSAyMCA0djEwLjM0NyIgfV0KICAgIF07CiAgICB2YXIgRmxhZ1RyaWFuZ2xlTGVmdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDIyVjIuOGEuOC44IDAgMCAwLTEuMTctLjcxTDUuNDUgNy43OGEuOC44IDAgMCAwIDAgMS40NEwxOCAxNS41IiB9XQogICAgXTsKICAgIHZhciBGbGFnVHJpYW5nbGVSaWdodCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMjJWMi44YS44LjggMCAwIDEgMS4xNy0uNzFsMTEuMzggNS42OWEuOC44IDAgMCAxIDAgMS40NEw2IDE1LjUiIH1dCiAgICBdOwogICAgdmFyIEZsYWcgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDIyVjRhMSAxIDAgMCAxIC40LS44QTYgNiAwIDAgMSA4IDJjMyAwIDUgMiA3LjMzMyAycTIgMCAzLjA2Ny0uOEExIDEgMCAwIDEgMjAgNHYxMGExIDEgMCAwIDEtLjQuOEE2IDYgMCAwIDEgMTYgMTZjLTMgMC01LTItOC0yYTYgNiAwIDAgMC00IDEuNTI4IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBGbGFtZUtpbmRsaW5nID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTIgMmMxIDMgMi41IDMuNSAzLjUgNC41QTUgNSAwIDAgMSAxNyAxMGE1IDUgMCAxIDEtMTAgMGMwLS4zIDAtLjYuMS0uOWEyIDIgMCAxIDAgMy4zLTJDOCA0LjUgMTEgMiAxMiAyWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01IDIyIDE0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNSAxOCAxNCA0IiB9XQogICAgXTsKICAgIHZhciBGbGFtZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyIDNxMSA0IDQgNi41dDMgNS41YTEgMSAwIDAgMS0xNCAwIDUgNSAwIDAgMSAxLTMgMSAxIDAgMCAwIDUgMGMwLTItMS41LTMtMS41LTVxMC0yIDIuNS00IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBGbGFzaGxpZ2h0T2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEuNjUyIDZIMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTN2MSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTE2IDE2djRhMiAyIDAgMCAxLTIgMmgtNGEyIDIgMCAwIDEtMi0ydi04YTQgNCAwIDAgMC0uOC0yLjRsLS42LS44QTMgMyAwIDAgMSA2IDdWNiIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcuNjQ5IDJIMTdhMSAxIDAgMCAxIDEgMXY0YTMgMyAwIDAgMS0uNiAxLjhsLS42LjhhNCA0IDAgMCAwLS41NSAxLjAwNyIgfV0KICAgIF07CiAgICB2YXIgRmxhc2hsaWdodCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEzdjEiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTcgMmExIDEgMCAwIDEgMSAxdjRhMyAzIDAgMCAxLS42IDEuOGwtLjYuOEE0IDQgMCAwIDAgMTYgMTJ2OGEyIDIgMCAwIDEtMiAySDEwYTIgMiAwIDAgMS0yLTJ2LThhNCA0IDAgMCAwLS44LTIuNGwtLjYtLjhBMyAzIDAgMCAxIDYgN1YzYTEgMSAwIDAgMSAxLTF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgNmgxMiIgfV0KICAgIF07CiAgICB2YXIgRmxhc2tDb25pY2FsT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMnYyLjM0MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjYuMzQzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAyMGEyIDIgMCAwIDEtMiAySDZhMiAyIDAgMCAxLTEuNzU1LTIuOTZsNS4yMjctOS41NjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi40NTMgMTVIMTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC41IDJoNyIgfV0KICAgIF07CiAgICB2YXIgRmxhc2tDb25pY2FsID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTQgMnY2YTIgMiAwIDAgMCAuMjQ1Ljk2bDUuNTEgMTAuMDhBMiAyIDAgMCAxIDE4IDIySDZhMiAyIDAgMCAxLTEuNzU1LTIuOTZsNS41MS0xMC4wOEEyIDIgMCAwIDAgMTAgOFYyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuNDUzIDE1aDExLjA5NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjUgMmg3IiB9XQogICAgXTsKICAgIHZhciBGbGFza1JvdW5kID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMnY2LjI5MmE3IDcgMCAxIDAgNCAwVjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxNWgxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjUgMmg3IiB9XQogICAgXTsKICAgIHZhciBGbGlwSG9yaXpvbnRhbDIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDcgNSA1LTUgNVY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDctNSA1IDUgNVY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIwdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTR2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA4djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnYyIiB9XQogICAgXTsKICAgIHZhciBGbGlwSG9yaXpvbnRhbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggM0g1YTIgMiAwIDAgMC0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDNoM2EyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDJoLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjB2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDh2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjIiIH1dCiAgICBdOwogICAgdmFyIEZsaXBWZXJ0aWNhbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDhWNWEyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE2djNhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ2LTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMkgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEySDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTJoLTIiIH1dCiAgICBdOwogICAgdmFyIEZsb3dlcjIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMiA1YTMgMyAwIDEgMSAzIDNtLTMtM2EzIDMgMCAxIDAtMyAzbTMtM3YxTTkgOGEzIDMgMCAxIDAgMyAzTTkgOGgxbTUgMGEzIDMgMCAxIDEtMyAzbTMtM2gtMW0tMiAzdi0xIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjgiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMHYxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMmM0LjIgMCA3LTEuNjY3IDctNS00LjIgMC03IDEuNjY3LTcgNVoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjJjLTQuMiAwLTctMS42NjctNy01IDQuMiAwIDcgMS42NjcgNyA1WiIgfV0KICAgIF07CiAgICB2YXIgRmxpcFZlcnRpY2FsMiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDMtNSA1LTUtNWgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAyMS01LTUtNSA1aDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTJIMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMkg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEyaC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDEyaC0yIiB9XQogICAgXTsKICAgIHZhciBGbG93ZXIgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIzIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyIDE2LjVBNC41IDQuNSAwIDEgMSA3LjUgMTIgNC41IDQuNSAwIDEgMSAxMiA3LjVhNC41IDQuNSAwIDEgMSA0LjUgNC41IDQuNSA0LjUgMCAxIDEtNC41IDQuNSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA3LjVWOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03LjUgMTJIOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNi41IDEySDE1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE2LjVWMTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCA4IDEuODggMS44OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNC4xMiA5Ljg4IDE2IDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAxNiAxLjg4LTEuODgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQuMTIgMTQuMTIgMTYgMTYiIH1dCiAgICBdOwogICAgdmFyIEZvY3VzID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDdWNWEyIDIgMCAwIDEgMi0yaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgM2gyYTIgMiAwIDAgMSAyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxN3YyYTIgMiAwIDAgMS0yIDJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMUg1YTIgMiAwIDAgMS0yLTJ2LTIiIH1dCiAgICBdOwogICAgdmFyIEZvbGRWZXJ0aWNhbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIydi02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDhWMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEySDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTJIOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMmgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxMmgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxOS0zLTMtMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDUtMyAzLTMtMyIgfV0KICAgIF07CiAgICB2YXIgRm9sZEhvcml6b250YWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEyaDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTJoLTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDh2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIwdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkgOS0zIDMgMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTUgMTUgMy0zLTMtMyIgfV0KICAgIF07CiAgICB2YXIgRm9sZGVyQXJjaGl2ZSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTUiLCBjeTogIjE5IiwgcjogIjIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAuOSAxOS44QTIgMiAwIDAgMCAyMiAxOFY4YTIgMiAwIDAgMC0yLTJoLTcuOWEyIDIgMCAwIDEtMS42OS0uOUw5LjYgMy45QTIgMiAwIDAgMCA3LjkzIDNINGEyIDIgMCAwIDAtMiAydjEzYTIgMiAwIDAgMCAyIDJoNS4xIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDExdi0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDE3di0yIiB9XQogICAgXTsKICAgIHZhciBGb2xkZXJDbG9jayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE0djIuMmwxLjYgMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk03IDIwSDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMy45YTIgMiAwIDAgMSAxLjY5LjlsLjgxIDEuMmEyIDIgMCAwIDAgMS42Ny45SDIwYTIgMiAwIDAgMSAyIDIiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNiIsIGN5OiAiMTYiLCByOiAiNiIgfV0KICAgIF07CiAgICB2YXIgRm9sZGVyQ2hlY2sgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAyMGEyIDIgMCAwIDAgMi0yVjhhMiAyIDAgMCAwLTItMmgtNy45YTIgMiAwIDAgMS0xLjY5LS45TDkuNiAzLjlBMiAyIDAgMCAwIDcuOTMgM0g0YTIgMiAwIDAgMC0yIDJ2MTNhMiAyIDAgMCAwIDIgMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxMyAyIDIgNC00IiB9XQogICAgXTsKICAgIHZhciBGb2xkZXJDbG9zZWQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAyMGEyIDIgMCAwIDAgMi0yVjhhMiAyIDAgMCAwLTItMmgtNy45YTIgMiAwIDAgMS0xLjY5LS45TDkuNiAzLjlBMiAyIDAgMCAwIDcuOTMgM0g0YTIgMiAwIDAgMC0yIDJ2MTNhMiAyIDAgMCAwIDIgMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMGgyMCIgfV0KICAgIF07CiAgICB2YXIgRm9sZGVyQ29kZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEwLjUgOCAxM2wyIDIuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAxMC41IDIgMi41LTIgMi41IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDIwYTIgMiAwIDAgMCAyLTJWOGEyIDIgMCAwIDAtMi0yaC03LjlhMiAyIDAgMCAxLTEuNjktLjlMOS42IDMuOUEyIDIgMCAwIDAgNy45MyAzSDRhMiAyIDAgMCAwLTIgMnYxM2EyIDIgMCAwIDAgMiAyeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgRm9sZGVyQ29nID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTAuMyAyMEg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDMuOThhMiAyIDAgMCAxIDEuNjkuOWwuNjYgMS4yQTIgMiAwIDAgMCAxMiA2aDhhMiAyIDAgMCAxIDIgMnYzLjMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuMzA1IDE5LjUzLjkyMy0uMzgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1LjIyOCAxNi44NTItLjkyMy0uMzgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2Ljg1MiAxNS4yMjgtLjM4My0uOTIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2Ljg1MiAyMC43NzItLjM4My45MjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkuMTQ4IDE1LjIyOC4zODMtLjkyMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOS41MyAyMS42OTYtLjM4Mi0uOTI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwLjc3MiAxNi44NTIuOTI0LS4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAuNzcyIDE5LjE0OC45MjQuMzgzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjE4IiwgcjogIjMiIH1dCiAgICBdOwogICAgdmFyIEZvbGRlckRvdCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQgMjBoMTZhMiAyIDAgMCAwIDItMlY4YTIgMiAwIDAgMC0yLTJoLTcuOTNhMiAyIDAgMCAxLTEuNjYtLjlsLS44Mi0xLjJBMiAyIDAgMCAwIDcuOTMgM0g0YTIgMiAwIDAgMC0yIDJ2MTNjMCAxLjEuOSAyIDIgMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTMiLCByOiAiMSIgfV0KICAgIF07CiAgICB2YXIgRm9sZGVyRG93biA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDIwYTIgMiAwIDAgMCAyLTJWOGEyIDIgMCAwIDAtMi0yaC03LjlhMiAyIDAgMCAxLTEuNjktLjlMOS42IDMuOUEyIDIgMCAwIDAgNy45MyAzSDRhMiAyIDAgMCAwLTIgMnYxM2EyIDIgMCAwIDAgMiAyWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMHY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDEzLTMgMy0zLTMiIH1dCiAgICBdOwogICAgdmFyIEZvbGRlckdpdDIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxOWE1IDUgMCAwIDEtNS01djgiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOSAyMEg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDMuOWEyIDIgMCAwIDEgMS42OS45bC44MSAxLjJhMiAyIDAgMCAwIDEuNjcuOUgyMGEyIDIgMCAwIDEgMiAydjUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMyIsIGN5OiAiMTIiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjIwIiwgY3k6ICIxOSIsIHI6ICIyIiB9XQogICAgXTsKICAgIHZhciBGb2xkZXJIZWFydCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwLjYzOCAyMEg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDMuOWEyIDIgMCAwIDEgMS42OS45bC44MSAxLjJhMiAyIDAgMCAwIDEuNjcuOUgyMGEyIDIgMCAwIDEgMiAydjMuNDE3IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE0LjYyIDE4LjhBMi4yNSAyLjI1IDAgMSAxIDE4IDE1LjgzNmEyLjI1IDIuMjUgMCAxIDEgMy4zOCAyLjk2NmwtMi42MjYgMi44NTZhLjk5OC45OTggMCAwIDEtMS41MDcgMHoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEZvbGRlckdpdCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEzIiwgcjogIjIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMjBhMiAyIDAgMCAwIDItMlY4YTIgMiAwIDAgMC0yLTJoLTcuOWEyIDIgMCAwIDEtMS42OS0uOUw5LjYgMy45QTIgMiAwIDAgMCA3LjkzIDNINGEyIDIgMCAwIDAtMiAydjEzYTIgMiAwIDAgMCAyIDJaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDEzaDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxM2gzIiB9XQogICAgXTsKICAgIHZhciBGb2xkZXJJbnB1dCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIgOVY1YTIgMiAwIDAgMSAyLTJoMy45YTIgMiAwIDAgMSAxLjY5LjlsLjgxIDEuMmEyIDIgMCAwIDAgMS42Ny45SDIwYTIgMiAwIDAgMSAyIDJ2MTBhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJ2LTEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxM2gxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDE2IDMtMy0zLTMiIH1dCiAgICBdOwogICAgdmFyIEZvbGRlckthbmJhbiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQgMjBoMTZhMiAyIDAgMCAwIDItMlY4YTIgMiAwIDAgMC0yLTJoLTcuOTNhMiAyIDAgMCAxLTEuNjYtLjlsLS44Mi0xLjJBMiAyIDAgMCAwIDcuOTMgM0g0YTIgMiAwIDAgMC0yIDJ2MTNjMCAxLjEuOSAyIDIgMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMHY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEwdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTB2NiIgfV0KICAgIF07CiAgICB2YXIgRm9sZGVyTG9jayA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICI1IiwgeDogIjE0IiwgeTogIjE3Iiwgcng6ICIxIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwIDIwSDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMy45YTIgMiAwIDAgMSAxLjY5LjlsLjgxIDEuMmEyIDIgMCAwIDAgMS42Ny45SDIwYTIgMiAwIDAgMSAyIDJ2Mi41IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE3di0yYTIgMiAwIDEgMC00IDB2MiIgfV0KICAgIF07CiAgICB2YXIgRm9sZGVyS2V5ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNiIsIGN5OiAiMjAiLCByOiAiMiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMCAyMEg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDMuOWEyIDIgMCAwIDEgMS42OS45bC44MSAxLjJhMiAyIDAgMCAwIDEuNjcuOUgyMGEyIDIgMCAwIDEgMiAydjIiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgMTQtNC41IDQuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAxNSAxIDEiIH1dCiAgICBdOwogICAgdmFyIEZvbGRlck1pbnVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxM2g2IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDIwYTIgMiAwIDAgMCAyLTJWOGEyIDIgMCAwIDAtMi0yaC03LjlhMiAyIDAgMCAxLTEuNjktLjlMOS42IDMuOUEyIDIgMCAwIDAgNy45MyAzSDRhMiAyIDAgMCAwLTIgMnYxM2EyIDIgMCAwIDAgMiAyWiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgRm9sZGVyT3BlbkRvdCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTYgMTQgMS40NS0yLjlBMiAyIDAgMCAxIDkuMjQgMTBIMjBhMiAyIDAgMCAxIDEuOTQgMi41bC0xLjU1IDZhMiAyIDAgMCAxLTEuOTQgMS41SDRhMiAyIDAgMCAxLTItMlY1YzAtMS4xLjktMiAyLTJoMy45M2EyIDIgMCAwIDEgMS42Ni45bC44MiAxLjJhMiAyIDAgMCAwIDEuNjYuOUgxOGEyIDIgMCAwIDEgMiAydjIiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNCIsIGN5OiAiMTUiLCByOiAiMSIgfV0KICAgIF07CiAgICB2YXIgRm9sZGVyT3BlbiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTYgMTQgMS41LTIuOUEyIDIgMCAwIDEgOS4yNCAxMEgyMGEyIDIgMCAwIDEgMS45NCAyLjVsLTEuNTQgNmEyIDIgMCAwIDEtMS45NSAxLjVINGEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmgzLjlhMiAyIDAgMCAxIDEuNjkuOWwuODEgMS4yYTIgMiAwIDAgMCAxLjY3LjlIMThhMiAyIDAgMCAxIDIgMnYyIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBGb2xkZXJPdXRwdXQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yIDcuNVY1YTIgMiAwIDAgMSAyLTJoMy45YTIgMiAwIDAgMSAxLjY5LjlsLjgxIDEuMmEyIDIgMCAwIDAgMS42Ny45SDIwYTIgMiAwIDAgMSAyIDJ2MTBhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTEuNSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEzaDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTUgMTAtMyAzIDMgMyIgfV0KICAgIF07CiAgICB2YXIgRm9sZGVyUGVuID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMiAxMS41VjVhMiAyIDAgMCAxIDItMmgzLjljLjcgMCAxLjMuMyAxLjcuOWwuOCAxLjJjLjQuNiAxIC45IDEuNy45SDIwYTIgMiAwIDAgMSAyIDJ2MTBhMiAyIDAgMCAxLTIgMmgtOS41IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTExLjM3OCAxMy42MjZhMSAxIDAgMSAwLTMuMDA0LTMuMDA0bC01LjAxIDUuMDEyYTIgMiAwIDAgMC0uNTA2Ljg1NGwtLjgzNyAyLjg3YS41LjUgMCAwIDAgLjYyLjYybDIuODctLjgzN2EyIDIgMCAwIDAgLjg1NC0uNTA2eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgRm9sZGVyUGx1cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEwdjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxM2g2IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDIwYTIgMiAwIDAgMCAyLTJWOGEyIDIgMCAwIDAtMi0yaC03LjlhMiAyIDAgMCAxLTEuNjktLjlMOS42IDMuOUEyIDIgMCAwIDAgNy45MyAzSDRhMiAyIDAgMCAwLTIgMnYxM2EyIDIgMCAwIDAgMiAyWiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgRm9sZGVyUm9vdCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQgMjBoMTZhMiAyIDAgMCAwIDItMlY4YTIgMiAwIDAgMC0yLTJoLTcuOTNhMiAyIDAgMCAxLTEuNjYtLjlsLS44Mi0xLjJBMiAyIDAgMCAwIDcuOTMgM0g0YTIgMiAwIDAgMC0yIDJ2MTNjMCAxLjEuOSAyIDIgMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTMiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNXY1IiB9XQogICAgXTsKICAgIHZhciBGb2xkZXJTZWFyY2gyID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMS41IiwgY3k6ICIxMi41IiwgcjogIjIuNSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAyMGEyIDIgMCAwIDAgMi0yVjhhMiAyIDAgMCAwLTItMmgtNy45YTIgMiAwIDAgMS0xLjY5LS45TDkuNiAzLjlBMiAyIDAgMCAwIDcuOTMgM0g0YTIgMiAwIDAgMC0yIDJ2MTNhMiAyIDAgMCAwIDIgMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMuMyAxNC4zIDE1IDE2IiB9XQogICAgXTsKICAgIHZhciBGb2xkZXJTZWFyY2ggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMC43IDIwSDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMy45YTIgMiAwIDAgMSAxLjY5LjlsLjgxIDEuMmEyIDIgMCAwIDAgMS42Ny45SDIwYTIgMiAwIDAgMSAyIDJ2NC4xIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDIxLTEuOS0xLjkiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNyIsIGN5OiAiMTciLCByOiAiMyIgfV0KICAgIF07CiAgICB2YXIgRm9sZGVyU3ltbGluayA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIgOS4zNVY1YTIgMiAwIDAgMSAyLTJoMy45YTIgMiAwIDAgMSAxLjY5LjlsLjgxIDEuMmEyIDIgMCAwIDAgMS42Ny45SDIwYTIgMiAwIDAgMSAyIDJ2MTBhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJ2LTNhMiAyIDAgMCAxIDItMmg3IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggMTYgMy0zLTMtMyIgfV0KICAgIF07CiAgICB2YXIgRm9sZGVyU3luYyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTkgMjBINGEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmgzLjlhMiAyIDAgMCAxIDEuNjkuOWwuODEgMS4yYTIgMiAwIDAgMCAxLjY3LjlIMjBhMiAyIDAgMCAxIDIgMnYuNSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMHY0aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIgMTQgMS41MzUtMS42MDVhNSA1IDAgMCAxIDggMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDIydi00aC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDE4LTEuNTM1IDEuNjA1YTUgNSAwIDAgMS04LTEuNSIgfV0KICAgIF07CiAgICB2YXIgRm9sZGVyVHJlZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDEwYTEgMSAwIDAgMCAxLTFWNmExIDEgMCAwIDAtMS0xaC0yLjVhMSAxIDAgMCAxLS44LS40bC0uOS0xLjJBMSAxIDAgMCAwIDE1IDNoLTJhMSAxIDAgMCAwLTEgMXY1YTEgMSAwIDAgMCAxIDFaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDIxYTEgMSAwIDAgMCAxLTF2LTNhMSAxIDAgMCAwLTEtMWgtMi45YTEgMSAwIDAgMS0uODgtLjU1bC0uNDItLjg1YTEgMSAwIDAgMC0uOTItLjZIMTNhMSAxIDAgMCAwLTEgMXY1YTEgMSAwIDAgMCAxIDFaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgNWEyIDIgMCAwIDAgMiAyaDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjEzYTIgMiAwIDAgMCAyIDJoMyIgfV0KICAgIF07CiAgICB2YXIgRm9sZGVyVXAgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAyMGEyIDIgMCAwIDAgMi0yVjhhMiAyIDAgMCAwLTItMmgtNy45YTIgMiAwIDAgMS0xLjY5LS45TDkuNiAzLjlBMiAyIDAgMCAwIDcuOTMgM0g0YTIgMiAwIDAgMC0yIDJ2MTNhMiAyIDAgMCAwIDIgMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTB2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDEzIDMtMyAzIDMiIH1dCiAgICBdOwogICAgdmFyIEZvbGRlclggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAyMGEyIDIgMCAwIDAgMi0yVjhhMiAyIDAgMCAwLTItMmgtNy45YTIgMiAwIDAgMS0xLjY5LS45TDkuNiAzLjlBMiAyIDAgMCAwIDcuOTMgM0g0YTIgMiAwIDAgMC0yIDJ2MTNhMiAyIDAgMCAwIDIgMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOS41IDEwLjUgNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0LjUgMTAuNS01IDUiIH1dCiAgICBdOwogICAgdmFyIEZvbGRlciA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDIwYTIgMiAwIDAgMCAyLTJWOGEyIDIgMCAwIDAtMi0yaC03LjlhMiAyIDAgMCAxLTEuNjktLjlMOS42IDMuOUEyIDIgMCAwIDAgNy45MyAzSDRhMiAyIDAgMCAwLTIgMnYxM2EyIDIgMCAwIDAgMiAyWiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgRm9sZGVycyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDVhMiAyIDAgMCAxIDIgMnY3YTIgMiAwIDAgMS0yIDJIOWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmgyLjVhMS41IDEuNSAwIDAgMSAxLjIuNmwuNi44YTEuNSAxLjUgMCAwIDAgMS4yLjZ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOC4yNjhhMiAyIDAgMCAwLTEgMS43MzhWMTlhMiAyIDAgMCAwIDIgMmgxMWEyIDIgMCAwIDAgMS43MzItMSIgfV0KICAgIF07CiAgICB2YXIgRm9vdHByaW50cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQgMTZ2LTIuMzhDNCAxMS41IDIuOTcgMTAuNSAzIDhjLjAzLTIuNzIgMS40OS02IDQuNS02QzkuMzcgMiAxMCAzLjggMTAgNS41YzAgMy4xMS0yIDUuNjYtMiA4LjY4VjE2YTIgMiAwIDEgMS00IDBaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDIwdi0yLjM4YzAtMi4xMiAxLjAzLTMuMTIgMS01LjYyLS4wMy0yLjcyLTEuNDktNi00LjUtNkMxNC42MyA2IDE0IDcuOCAxNCA5LjVjMCAzLjExIDIgNS42NiAyIDguNjhWMjBhMiAyIDAgMSAwIDQgMFoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTdoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEzaDQiIH1dCiAgICBdOwogICAgdmFyIEZvcmtsaWZ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJINWEyIDIgMCAwIDAtMiAydjUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMyIsIGN5OiAiMTkiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjE5IiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxOWgzbTUtMTd2MTdoNk02IDEyVjdjMC0xLjEuOS0yIDItMmgzbDUgNSIgfV0KICAgIF07CiAgICB2YXIgRm9ybSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTRoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDJoMTAiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI0IiwgeTogIjE4Iiwgd2lkdGg6ICIxNiIsIGhlaWdodDogIjQiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI0IiwgeTogIjYiLCB3aWR0aDogIjE2IiwgaGVpZ2h0OiAiNCIsIHJ4OiAiMSIgfV0KICAgIF07CiAgICB2YXIgRm9yd2FyZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDE3IDUtNS01LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxOHYtMmE0IDQgMCAwIDEgNC00aDEyIiB9XQogICAgXTsKICAgIHZhciBGcmFtZSA9IFsKICAgICAgWyJsaW5lIiwgeyB4MTogIjIyIiwgeDI6ICIyIiwgeTE6ICI2IiwgeTI6ICI2IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjIyIiwgeDI6ICIyIiwgeTE6ICIxOCIsIHkyOiAiMTgiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiNiIsIHgyOiAiNiIsIHkxOiAiMiIsIHkyOiAiMjIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTgiLCB4MjogIjE4IiwgeTE6ICIyIiwgeTI6ICIyMiIgfV0KICAgIF07CiAgICB2YXIgRnJhbWVyID0gW1sicGF0aCIsIHsgZDogIk01IDE2VjloMTRWMkg1bDE0IDE0aC03bS03IDAgNyA3di03bS03IDBoNyIgfV1dOwogICAgdmFyIEZyb3duID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTZzLTEuNS0yLTQtMi00IDItNCAyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjkiLCB4MjogIjkuMDEiLCB5MTogIjkiLCB5MjogIjkiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTUiLCB4MjogIjE1LjAxIiwgeTE6ICI5IiwgeTI6ICI5IiB9XQogICAgXTsKICAgIHZhciBGdWVsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTNoMmEyIDIgMCAwIDEgMiAydjJhMiAyIDAgMCAwIDQgMHYtNi45OThhMiAyIDAgMCAwLS41OS0xLjQyTDE4IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjFWNWEyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIxaDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOWgxMSIgfV0KICAgIF07CiAgICB2YXIgRnVsbHNjcmVlbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgN1Y1YTIgMiAwIDAgMSAyLTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAzaDJhMiAyIDAgMCAxIDIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE3djJhMiAyIDAgMCAxLTIgMmgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIxSDVhMiAyIDAgMCAxLTItMnYtMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxMCIsIGhlaWdodDogIjgiLCB4OiAiNyIsIHk6ICI4Iiwgcng6ICIxIiB9XQogICAgXTsKICAgIHZhciBGdW5uZWxQbHVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTMuMzU0IDNIM2ExIDEgMCAwIDAtLjc0MiAxLjY3bDcuMjI1IDcuOTg5QTIgMiAwIDAgMSAxMCAxNHY2YTEgMSAwIDAgMCAuNTUzLjg5NWwyIDFBMSAxIDAgMCAwIDE0IDIxdi03YTIgMiAwIDAgMSAuNTE3LTEuMzQxbDEuMjE4LTEuMzQ4IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDZoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAzdjYiIH1dCiAgICBdOwogICAgdmFyIEZ1bm5lbCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwIDIwYTEgMSAwIDAgMCAuNTUzLjg5NWwyIDFBMSAxIDAgMCAwIDE0IDIxdi03YTIgMiAwIDAgMSAuNTE3LTEuMzQxTDIxLjc0IDQuNjdBMSAxIDAgMCAwIDIxIDNIM2ExIDEgMCAwIDAtLjc0MiAxLjY3bDcuMjI1IDcuOTg5QTIgMiAwIDAgMSAxMCAxNHoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEZ1bm5lbFggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMi41MzEgM0gzYTEgMSAwIDAgMC0uNzQyIDEuNjdsNy4yMjUgNy45ODlBMiAyIDAgMCAxIDEwIDE0djZhMSAxIDAgMCAwIC41NTMuODk1bDIgMUExIDEgMCAwIDAgMTQgMjF2LTdhMiAyIDAgMCAxIC41MTctMS4zNDFsLjQyNy0uNDczIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2LjUgMy41IDUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMS41IDMuNS01IDUiIH1dCiAgICBdOwogICAgdmFyIEdhbGxlcnlIb3Jpem9udGFsRW5kID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA3djEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgNXYxNCIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxMiIsIGhlaWdodDogIjE4IiwgeDogIjEwIiwgeTogIjMiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIEdhbGxlcnlIb3Jpem9udGFsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAzdjE4IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjEyIiwgaGVpZ2h0OiAiMTgiLCB4OiAiNiIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDN2MTgiIH1dCiAgICBdOwogICAgdmFyIEdhbGxlcnlUaHVtYm5haWxzID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxNCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAyMWgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMjFoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAyMWgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDIxaDEiIH1dCiAgICBdOwogICAgdmFyIEdhbGxlcnlWZXJ0aWNhbEVuZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMmgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDZoMTQiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxMiIsIHg6ICIzIiwgeTogIjEwIiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBHYWxsZXJ5VmVydGljYWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDJoMTgiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxMiIsIHg6ICIzIiwgeTogIjYiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAyMmgxOCIgfV0KICAgIF07CiAgICB2YXIgR2FtZXBhZDIgPSBbCiAgICAgIFsibGluZSIsIHsgeDE6ICI2IiwgeDI6ICIxMCIsIHkxOiAiMTEiLCB5MjogIjExIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjgiLCB4MjogIjgiLCB5MTogIjkiLCB5MjogIjEzIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE1IiwgeDI6ICIxNS4wMSIsIHkxOiAiMTIiLCB5MjogIjEyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE4IiwgeDI6ICIxOC4wMSIsIHkxOiAiMTAiLCB5MjogIjEwIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE3LjMyIDVINi42OGE0IDQgMCAwIDAtMy45NzggMy41OWMtLjAwNi4wNTItLjAxLjEwMS0uMDE3LjE1MkMyLjYwNCA5LjQxNiAyIDE0LjQ1NiAyIDE2YTMgMyAwIDAgMCAzIDNjMSAwIDEuNS0uNSAyLTFsMS40MTQtMS40MTRBMiAyIDAgMCAxIDkuODI4IDE2aDQuMzQ0YTIgMiAwIDAgMSAxLjQxNC41ODZMMTcgMThjLjUuNSAxIDEgMiAxYTMgMyAwIDAgMCAzLTNjMC0xLjU0NS0uNjA0LTYuNTg0LS42ODUtNy4yNTgtLjAwNy0uMDUtLjAxMS0uMS0uMDE3LS4xNTFBNCA0IDAgMCAwIDE3LjMyIDV6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBHYW1lcGFkRGlyZWN0aW9uYWwgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMS4xNDYgMTUuODU0YTEuMjA3IDEuMjA3IDAgMCAxIDEuNzA4IDBsMS41NiAxLjU2QTIgMiAwIDAgMSAxNSAxOC44MjhWMjFhMSAxIDAgMCAxLTEgMWgtNGExIDEgMCAwIDEtMS0xdi0yLjE3MmEyIDIgMCAwIDEgLjU4Ni0xLjQxNHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTguODI4IDE1YTIgMiAwIDAgMS0xLjQxNC0uNTg2bC0xLjU2LTEuNTZhMS4yMDcgMS4yMDcgMCAwIDEgMC0xLjcwOGwxLjU2LTEuNTZBMiAyIDAgMCAxIDE4LjgyOCA5SDIxYTEgMSAwIDAgMSAxIDF2NGExIDEgMCAwIDEtMSAxeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02LjU4NiAxNC40MTRBMiAyIDAgMCAxIDUuMTcyIDE1SDNhMSAxIDAgMCAxLTEtMXYtNGExIDEgMCAwIDEgMS0xaDIuMTcyYTIgMiAwIDAgMSAxLjQxNC41ODZsMS41NiAxLjU2YTEuMjA3IDEuMjA3IDAgMCAxIDAgMS43MDh6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTkgM2ExIDEgMCAwIDEgMS0xaDRhMSAxIDAgMCAxIDEgMXYyLjE3MmEyIDIgMCAwIDEtLjU4NiAxLjQxNGwtMS41NiAxLjU2YTEuMjA3IDEuMjA3IDAgMCAxLTEuNzA4IDBsLTEuNTYtMS41NkEyIDIgMCAwIDEgOSA1LjE3MnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEdhbWVwYWQgPSBbCiAgICAgIFsibGluZSIsIHsgeDE6ICI2IiwgeDI6ICIxMCIsIHkxOiAiMTIiLCB5MjogIjEyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjgiLCB4MjogIjgiLCB5MTogIjEwIiwgeTI6ICIxNCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNSIsIHgyOiAiMTUuMDEiLCB5MTogIjEzIiwgeTI6ICIxMyIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxOCIsIHgyOiAiMTguMDEiLCB5MTogIjExIiwgeTI6ICIxMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjEyIiwgeDogIjIiLCB5OiAiNiIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgR2F1Z2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMiAxNCA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy4zNCAxOWExMCAxMCAwIDEgMSAxNy4zMiAwIiB9XQogICAgXTsKICAgIHZhciBHYXZlbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDEzLTguMzgxIDguMzhhMSAxIDAgMCAxLTMuMDAxLTNsOC4zODQtOC4zODEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTYgNi02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxLjUgMTAuNS04LTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCA4IDYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04LjUgNy41IDggOCIgfV0KICAgIF07CiAgICB2YXIgR2VtID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAuNSAzIDggOWw0IDEzIDQtMTMtMi41LTYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTcgM2EyIDIgMCAwIDEgMS42LjhsMyA0YTIgMiAwIDAgMSAuMDEzIDIuMzgybC03Ljk5IDEwLjk4NmEyIDIgMCAwIDEtMy4yNDcgMGwtNy45OS0xMC45ODZBMiAyIDAgMCAxIDIuNCA3LjhsMi45OTgtMy45OTdBMiAyIDAgMCAxIDcgM3oiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA5aDIwIiB9XQogICAgXTsKICAgIHZhciBHZW9yZ2lhbkxhcmkgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMS41IDIxYTcuNSA3LjUgMCAxIDEgNy4zNS05IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDEyVjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAyMWgxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDEyVjMiIH1dCiAgICBdOwogICAgdmFyIEdob3N0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTBoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJhOCA4IDAgMCAwLTggOHYxMmwzLTMgMi41IDIuNUwxMiAxOWwyLjUgMi41TDE3IDE5bDMgM1YxMGE4IDggMCAwIDAtOC04eiIgfV0KICAgIF07CiAgICB2YXIgR2lmdCA9IFsKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICI4Iiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjQiLCByeDogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOHYxMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxMnY3YTIgMiAwIDAgMS0yIDJIN2EyIDIgMCAwIDEtMi0ydi03IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcuNSA4YTIuNSAyLjUgMCAwIDEgMC01QTQuOCA4IDAgMCAxIDEyIDhhNC44IDggMCAwIDEgNC41LTUgMi41IDIuNSAwIDAgMSAwIDUiIH1dCiAgICBdOwogICAgdmFyIEdpdEJyYW5jaE1pbnVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgNmE5IDkgMCAwIDAtOSA5VjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMThoLTYiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiNiIsIHI6ICIzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNiIsIGN5OiAiMTgiLCByOiAiMyIgfV0KICAgIF07CiAgICB2YXIgR2l0QnJhbmNoUGx1cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgM3YxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA5YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAyMWEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDZhOSA5IDAgMCAwLTkgOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxNXY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE4aC02IiB9XQogICAgXTsKICAgIHZhciBHaXRCcmFuY2ggPSBbCiAgICAgIFsibGluZSIsIHsgeDE6ICI2IiwgeDI6ICI2IiwgeTE6ICIzIiwgeTI6ICIxNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICI2IiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI2IiwgY3k6ICIxOCIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDlhOSA5IDAgMCAxLTkgOSIgfV0KICAgIF07CiAgICB2YXIgR2l0Q29tbWl0SG9yaXpvbnRhbCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjMiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMyIsIHgyOiAiOSIsIHkxOiAiMTIiLCB5MjogIjEyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE1IiwgeDI6ICIyMSIsIHkxOiAiMTIiLCB5MjogIjEyIiB9XQogICAgXTsKICAgIHZhciBHaXRDb21taXRWZXJ0aWNhbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDN2NiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE1djYiIH1dCiAgICBdOwogICAgdmFyIEdpdENvbXBhcmVBcnJvd3MgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjYiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2aDVhMiAyIDAgMCAxIDIgMnY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDktMy0zIDMtMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE5IiwgY3k6ICIxOCIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4SDdhMiAyIDAgMCAxLTItMlY5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTUgMyAzLTMgMyIgfV0KICAgIF07CiAgICB2YXIgR2l0Q29tcGFyZSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjE4IiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI2IiwgY3k6ICI2IiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgNmgzYTIgMiAwIDAgMSAyIDJ2NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxOEg4YTIgMiAwIDAgMS0yLTJWOSIgfV0KICAgIF07CiAgICB2YXIgR2l0Rm9yayA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjE4IiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI2IiwgY3k6ICI2IiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiNiIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDl2MmMwIC42LS40IDEtMSAxSDdjLS42IDAtMS0uNC0xLTFWOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMnYzIiB9XQogICAgXTsKICAgIHZhciBHaXRHcmFwaCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNSIsIGN5OiAiNiIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgOXY2IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNSIsIGN5OiAiMTgiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAzdjE4IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTkiLCBjeTogIjYiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNS43QTkgOSAwIDAgMCAxOSA5IiB9XQogICAgXTsKICAgIHZhciBHaXRNZXJnZSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjE4IiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI2IiwgY3k6ICI2IiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAyMVY5YTkgOSAwIDAgMCA5IDkiIH1dCiAgICBdOwogICAgdmFyIEdpdFB1bGxSZXF1ZXN0QXJyb3cgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjYiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDl2MTIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiMTgiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA5LTMtMyAzLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNmg1YTIgMiAwIDAgMSAyIDJ2NyIgfV0KICAgIF07CiAgICB2YXIgR2l0UHVsbFJlcXVlc3RDbG9zZWQgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYiLCBjeTogIjYiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDl2MTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMy02IDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgOS02LTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTEuNVYxNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICIxOCIsIHI6ICIzIiB9XQogICAgXTsKICAgIHZhciBHaXRQdWxsUmVxdWVzdENyZWF0ZUFycm93ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICI1IiwgY3k6ICI2IiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSA5djEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDktMy0zIDMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2aDVhMiAyIDAgMCAxIDIgMnYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE1djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMThoLTYiIH1dCiAgICBdOwogICAgdmFyIEdpdFB1bGxSZXF1ZXN0Q3JlYXRlID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICI2IiwgY3k6ICI2IiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA5djEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDZoM2EyIDIgMCAwIDEgMiAydjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTV2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxOGgtNiIgfV0KICAgIF07CiAgICB2YXIgR2l0UHVsbFJlcXVlc3REcmFmdCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjE4IiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI2IiwgY3k6ICI2IiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggNlY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDExdi0xIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjYiLCB4MjogIjYiLCB5MTogIjkiLCB5MjogIjIxIiB9XQogICAgXTsKICAgIHZhciBHaXRQdWxsUmVxdWVzdCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjE4IiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI2IiwgY3k6ICI2IiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgNmgzYTIgMiAwIDAgMSAyIDJ2NyIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI2IiwgeDI6ICI2IiwgeTE6ICI5IiwgeTI6ICIyMSIgfV0KICAgIF07CiAgICB2YXIgR2l0aHViID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTUgMjJ2LTRhNC44IDQuOCAwIDAgMC0xLTMuNWMzIDAgNi0yIDYtNS41LjA4LTEuMjUtLjI3LTIuNDgtMS0zLjUuMjgtMS4xNS4yOC0yLjM1IDAtMy41IDAgMC0xIDAtMyAxLjUtMi42NC0uNS01LjM2LS41LTggMEM2IDIgNSAyIDUgMmMtLjMgMS4xNS0uMyAyLjM1IDAgMy41QTUuNDAzIDUuNDAzIDAgMCAwIDQgOWMwIDMuNSAzIDUuNSA2IDUuNS0uMzkuNDktLjY4IDEuMDUtLjg1IDEuNjUtLjE3LjYtLjIyIDEuMjMtLjE1IDEuODV2NCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE4Yy00LjUxIDItNS0yLTctMiIgfV0KICAgIF07CiAgICB2YXIgR2l0bGFiID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMjIgMTMuMjktMy4zMy0xMGEuNDIuNDIgMCAwIDAtLjE0LS4xOC4zOC4zOCAwIDAgMC0uMjItLjExLjM5LjM5IDAgMCAwLS4yMy4wNy40Mi40MiAwIDAgMC0uMTQuMThsLTIuMjYgNi42N0g4LjMyTDYuMSAzLjI2YS40Mi40MiAwIDAgMC0uMS0uMTguMzguMzggMCAwIDAtLjI2LS4wOC4zOS4zOSAwIDAgMC0uMjMuMDcuNDIuNDIgMCAwIDAtLjE0LjE4TDIgMTMuMjlhLjc0Ljc0IDAgMCAwIC4yNy44M0wxMiAyMWw5LjY5LTYuODhhLjcxLjcxIDAgMCAwIC4zMS0uODNaIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBHbGFzc1dhdGVyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNS4xMTYgNC4xMDRBMSAxIDAgMCAxIDYuMTEgM2gxMS43OGExIDEgMCAwIDEgLjk5NCAxLjEwNUwxNy4xOSAyMC4yMUEyIDIgMCAwIDEgMTUuMiAyMkg4LjhhMiAyIDAgMCAxLTItMS43OXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxMmE1IDUgMCAwIDEgNiAwIDUgNSAwIDAgMCA2IDAiIH1dCiAgICBdOwogICAgdmFyIEdsYXNzZXMgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYiLCBjeTogIjE1IiwgcjogIjQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiMTUiLCByOiAiNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxNWEyIDIgMCAwIDAtMi0yIDIgMiAwIDAgMC0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMi41IDEzIDUgN2MuNy0xLjMgMS40LTIgMy0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxLjUgMTMgMTkgN2MtLjctMS4zLTEuNS0yLTMtMiIgfV0KICAgIF07CiAgICB2YXIgR2xvYmVYID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMyA1IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmgyMEExMCAxMCAwIDEgMSAxMiAyYTE0LjUgMTQuNSAwIDAgMCAwIDIwIDE0LjUgMTQuNSAwIDAgMCA0LTEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDMtNSA1IiB9XQogICAgXTsKICAgIHZhciBHbG9iZUxvY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNS42ODYgMTVBMTQuNSAxNC41IDAgMCAxIDEyIDIyYTE0LjUgMTQuNSAwIDAgMSAwLTIwIDEwIDEwIDAgMSAwIDkuNTQyIDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJoOC41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDZWNGEyIDIgMCAxIDAtNCAwdjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiOCIsIGhlaWdodDogIjUiLCB4OiAiMTQiLCB5OiAiNiIsIHJ4OiAiMSIgfV0KICAgIF07CiAgICB2YXIgR2xvYmUgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyYTE0LjUgMTQuNSAwIDAgMCAwIDIwIDE0LjUgMTQuNSAwIDAgMCAwLTIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJoMjAiIH1dCiAgICBdOwogICAgdmFyIEdvYWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxM1YybDggNC04IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAuNTYxIDEwLjIyMmE5IDkgMCAxIDEtMTIuNTUtNS4yOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjAwMiA5Ljk5N2E1IDUgMCAxIDAgOC45IDIuMDIiIH1dCiAgICBdOwogICAgdmFyIEdwdSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjFWMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDVoMThhMiAyIDAgMCAxIDIgMnY4YTIgMiAwIDAgMS0yIDJIMi4yNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE3djNhMSAxIDAgMCAwIDEgMWg1YTEgMSAwIDAgMCAxLTF2LTMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNiIsIGN5OiAiMTEiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjgiLCBjeTogIjExIiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIEdyYWR1YXRpb25DYXAgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMS40MiAxMC45MjJhMSAxIDAgMCAwLS4wMTktMS44MzhMMTIuODMgNS4xOGEyIDIgMCAwIDAtMS42NiAwTDIuNiA5LjA4YTEgMSAwIDAgMCAwIDEuODMybDguNTcgMy45MDhhMiAyIDAgMCAwIDEuNjYgMHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTB2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEyLjVWMTZhNiAzIDAgMCAwIDEyIDB2LTMuNSIgfV0KICAgIF07CiAgICB2YXIgR3JhcGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiA1VjJsLTUuODkgNS44OSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE2LjYiLCBjeTogIjE1Ljg5IiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI4LjExIiwgY3k6ICI3LjQiLCByOiAiMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyLjM1IiwgY3k6ICIxMS42NSIsIHI6ICIzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTMuOTEiLCBjeTogIjUuODUiLCByOiAiMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4LjE1IiwgY3k6ICIxMC4wOSIsIHI6ICIzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNi41NiIsIGN5OiAiMTMuMiIsIHI6ICIzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTAuOCIsIGN5OiAiMTcuNDQiLCByOiAiMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjE5IiwgcjogIjMiIH1dCiAgICBdOwogICAgdmFyIEdyaWQyeDJDaGVjayA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyIDN2MTdhMSAxIDAgMCAxLTEgMUg1YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDE0YTIgMiAwIDAgMSAyIDJ2NmExIDEgMCAwIDEtMSAxSDMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTkgMiAyIDQtNCIgfV0KICAgIF07CiAgICB2YXIgR3JpZDJ4MlBsdXMgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMiAzdjE3YTEgMSAwIDAgMS0xIDFINWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmgxNGEyIDIgMCAwIDEgMiAydjZhMSAxIDAgMCAxLTEgMUgzIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE5aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMjJ2LTYiIH1dCiAgICBdOwogICAgdmFyIEdyaWQzeDIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAzdjE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTJoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAzdjE4IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICIzIiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4Iiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBHcmlkMngyWCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyIDN2MTdhMSAxIDAgMCAxLTEgMUg1YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDE0YTIgMiAwIDAgMSAyIDJ2NmExIDEgMCAwIDEtMSAxSDMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTYgNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDIxIDUtNSIgfV0KICAgIF07CiAgICB2YXIgR3JpZDJ4MiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDN2MTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmgxOCIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjMiLCB5OiAiMyIsIHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgR3JpZDN4MyA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOWgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE1aDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgM3YxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAzdjE4IiB9XQogICAgXTsKICAgIHZhciBHcmlwSG9yaXpvbnRhbCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjkiLCByOiAiMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE5IiwgY3k6ICI5IiwgcjogIjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI1IiwgY3k6ICI5IiwgcjogIjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTUiLCByOiAiMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE5IiwgY3k6ICIxNSIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNSIsIGN5OiAiMTUiLCByOiAiMSIgfV0KICAgIF07CiAgICB2YXIgR3JpcFZlcnRpY2FsID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICIxMiIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOSIsIGN5OiAiNSIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOSIsIGN5OiAiMTkiLCByOiAiMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE1IiwgY3k6ICIxMiIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTUiLCBjeTogIjUiLCByOiAiMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE1IiwgY3k6ICIxOSIsIHI6ICIxIiB9XQogICAgXTsKICAgIHZhciBHcmlwID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiNSIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTkiLCBjeTogIjUiLCByOiAiMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjUiLCByOiAiMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTkiLCBjeTogIjEyIiwgcjogIjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI1IiwgY3k6ICIxMiIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjE5IiwgcjogIjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiMTkiLCByOiAiMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjE5IiwgcjogIjEiIH1dCiAgICBdOwogICAgdmFyIEdyb3VwID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA3VjVjMC0xLjEuOS0yIDItMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDNoMmMxLjEgMCAyIC45IDIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE3djJjMCAxLjEtLjkgMi0yIDJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMUg1Yy0xLjEgMC0yLS45LTItMnYtMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiNSIsIHg6ICI3IiwgeTogIjciLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNyIsIGhlaWdodDogIjUiLCB4OiAiMTAiLCB5OiAiMTIiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIEd1aXRhciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTExLjkgMTIuMSA0LjUxNC00LjUxNCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMC4xIDIuM2ExIDEgMCAwIDAtMS40IDBsLTEuMTE0IDEuMTE0QTIgMiAwIDAgMCAxNyA0LjgyOHYxLjM0NGEyIDIgMCAwIDEtLjU4NiAxLjQxNEEyIDIgMCAwIDEgMTcuODI4IDdoMS4zNDRhMiAyIDAgMCAwIDEuNDE0LS41ODZMMjEuNyA1LjNhMSAxIDAgMCAwIDAtMS40eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02IDE2IDIgMiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk04LjIzIDkuODVBMyAzIDAgMCAxIDExIDhhNSA1IDAgMCAxIDUgNSAzIDMgMCAwIDEtMS44NSAyLjc3bC0uOTIuMzhBMiAyIDAgMCAwIDEyIDE4YTQgNCAwIDAgMS00IDQgNiA2IDAgMCAxLTYtNiA0IDQgMCAwIDEgNC00IDIgMiAwIDAgMCAxLjg1LTEuMjN6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBIYW0gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMy4xNDQgMjEuMTQ0QTcuMjc0IDEwLjQ0NSA0NSAxIDAgMi44NTYgMTAuODU2IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTMuMTQ0IDIxLjE0NEE3LjI3NCA0LjM2NSA0NSAwIDAgMi44NTYgMTAuODU2YTcuMjc0IDQuMzY1IDQ1IDAgMCAxMC4yODggMTAuMjg4IiB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNi41NjUgMTAuNDM1IDE4LjYgOC40YTIuNTAxIDIuNTAxIDAgMSAwIDEuNjUtNC42NSAyLjUgMi41IDAgMSAwLTQuNjYgMS42NmwtMi4wMjQgMi4wMjUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOC41IDE2LjUtMS0xIiB9XQogICAgXTsKICAgIHZhciBIYW1idXJnZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNkg0YTIgMiAwIDEgMSAwLTRoMTZhMiAyIDAgMSAxIDAgNGgtNC4yNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDEyYTIgMiAwIDAgMS0yLTIgOSA3IDAgMCAxIDE4IDAgMiAyIDAgMCAxLTIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE2YTIgMiAwIDAgMC0yIDIgMyAzIDAgMCAwIDMgM2gxMmEzIDMgMCAwIDAgMy0zIDIgMiAwIDAgMC0yLTJxMCAwIDAgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02LjY3IDEyIDYuMTMgNC42YTIgMiAwIDAgMCAyLjgtLjRsMy4xNS00LjIiIH1dCiAgICBdOwogICAgdmFyIEhhbW1lciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDEyLTkuMzczIDkuMzczYTEgMSAwIDAgMS0zLjAwMS0zTDEyIDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMTUgNC00IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTIxLjUgMTEuNS0xLjkxNC0xLjkxNEEyIDIgMCAwIDEgMTkgOC4xNzJ2LS4zNDRhMiAyIDAgMCAwLS41ODYtMS40MTRsLTEuNjU3LTEuNjU3QTYgNiAwIDAgMCAxMi41MTYgM0g5bDEuMjQzIDEuMjQzQTYgNiAwIDAgMSAxMiA4LjQ4NVYxMGwyIDJoMS4xNzJhMiAyIDAgMCAxIDEuNDE0LjU4NkwxOC41IDE0LjUiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEhhbmRDb2lucyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDE1aDJhMiAyIDAgMSAwIDAtNGgtM2MtLjYgMC0xLjEuMi0xLjQuNkwzIDE3IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTcgMjEgMS42LTEuNGMuMy0uNC44LS42IDEuNC0uNmg0YzEuMSAwIDIuMS0uNCAyLjgtMS4ybDQuNi00LjRhMiAyIDAgMCAwLTIuNzUtMi45MWwtNC4yIDMuOSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDE2IDYgNiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE2IiwgY3k6ICI5IiwgcjogIjIuOSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYiLCBjeTogIjUiLCByOiAiMyIgfV0KICAgIF07CiAgICB2YXIgSGFuZEZpc3QgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMi4wMzUgMTcuMDEyYTMgMyAwIDAgMC0zLTNsLS4zMTEtLjAwMmEuNzIuNzIgMCAwIDEtLjUwNS0xLjIyOWwxLjE5NS0xLjE5NUEyIDIgMCAwIDEgMTAuODI4IDExSDEyYTIgMiAwIDAgMCAwLTRIOS4yNDNhMyAzIDAgMCAwLTIuMTIyLjg3OWwtMi43MDcgMi43MDdBNC44MyA0LjgzIDAgMCAwIDMgMTRhOCA4IDAgMCAwIDggOGgyYTggOCAwIDAgMCA4LThWN2EyIDIgMCAxIDAtNCAwdjJhMiAyIDAgMSAwIDQgMCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMy44ODggOS42NjJBMiAyIDAgMCAwIDE3IDhWNUEyIDIgMCAxIDAgMTMgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDVBMiAyIDAgMSAwIDUgNVYxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDdWNEEyIDIgMCAxIDEgMTMgNFY3LjI2OCIgfV0KICAgIF07CiAgICB2YXIgSGFuZEdyYWIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMS41VjlhMiAyIDAgMCAwLTItMmEyIDIgMCAwIDAtMiAydjEuNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxMFY4YTIgMiAwIDAgMC0yLTJhMiAyIDAgMCAwLTIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDkuOVY5YTIgMiAwIDAgMC0yLTJhMiAyIDAgMCAwLTIgMnY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTRhMiAyIDAgMCAwLTItMmEyIDIgMCAwIDAtMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDExYTIgMiAwIDEgMSA0IDB2M2E4IDggMCAwIDEtOCA4aC00YTggOCAwIDAgMS04LTggMiAyIDAgMSAxIDQgMCIgfV0KICAgIF07CiAgICB2YXIgSGFuZEhlYXJ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTRoMmEyIDIgMCAwIDAgMC00aC0zYy0uNiAwLTEuMS4yLTEuNC42TDMgMTYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTQuNDUgMTMuMzkgNS4wNS00LjY5NEMyMC4xOTYgOCAyMSA2Ljg1IDIxIDUuNzVhMi43NSAyLjc1IDAgMCAwLTQuNzk3LTEuODM3LjI3Ni4yNzYgMCAwIDEtLjQwNiAwQTIuNzUgMi43NSAwIDAgMCAxMSA1Ljc1YzAgMS4yLjgwMiAyLjI0OCAxLjUgMi45NDZMMTYgMTEuOTUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAxNSA2IDYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIm03IDIwIDEuNi0xLjRjLjMtLjQuOC0uNiAxLjQtLjZoNGMxLjEgMCAyLjEtLjQgMi44LTEuMmw0LjYtNC40YTEgMSAwIDAgMC0yLjc1LTIuOTEiIH0KICAgICAgXQogICAgXTsKICAgIHZhciBIYW5kSGVscGluZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDEyaDJhMiAyIDAgMSAwIDAtNGgtM2MtLjYgMC0xLjEuMi0xLjQuNkwzIDE0IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTcgMTggMS42LTEuNGMuMy0uNC44LS42IDEuNC0uNmg0YzEuMSAwIDIuMS0uNCAyLjgtMS4ybDQuNi00LjRhMiAyIDAgMCAwLTIuNzUtMi45MWwtNC4yIDMuOSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDEzIDYgNiIgfV0KICAgIF07CiAgICB2YXIgSGFuZE1ldGFsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTIuNVYxMGEyIDIgMCAwIDAtMi0yYTIgMiAwIDAgMC0yIDJ2MS40IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDExVjlhMiAyIDAgMSAwLTQgMHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEwLjVWNWEyIDIgMCAxIDAtNCAwdjkiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtNyAxNS0xLjc2LTEuNzZhMiAyIDAgMCAwLTIuODMgMi44MmwzLjYgMy42QzcuNSAyMS4xNCA5LjIgMjIgMTIgMjJoMmE4IDggMCAwIDAgOC04VjdhMiAyIDAgMSAwLTQgMHY1IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBIYW5kUGxhdHRlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDNWMiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xNS40IDE3LjQgMy4yLTIuOGEyIDIgMCAxIDEgMi44IDIuOWwtMy42IDMuM2MtLjcuOC0xLjcgMS4yLTIuOCAxLjJoLTRjLTEuMSAwLTIuMS0uNC0yLjgtMS4ybC0xLjMwMi0xLjQ2NEExIDEgMCAwIDAgNi4xNTEgMTlINSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE0aDEyYTIgMiAwIDAgMSAwIDRoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMGgxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDEwYTcgNyAwIDAgMSAxNCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTR2NmExIDEgMCAwIDEtMSAxSDIiIH1dCiAgICBdOwogICAgdmFyIEhhbmQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMVY2YTIgMiAwIDAgMC0yLTJhMiAyIDAgMCAwLTIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxMFY0YTIgMiAwIDAgMC0yLTJhMiAyIDAgMCAwLTIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEwLjVWNmEyIDIgMCAwIDAtMi0yYTIgMiAwIDAgMC0yIDJ2OCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOCA4YTIgMiAwIDEgMSA0IDB2NmE4IDggMCAwIDEtOCA4aC0yYy0yLjggMC00LjUtLjg2LTUuOTktMi4zNGwtMy42LTMuNmEyIDIgMCAwIDEgMi44My0yLjgyTDcgMTUiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEhhbmRiYWcgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yLjA0OCAxOC41NjZBMiAyIDAgMCAwIDQgMjFoMTZhMiAyIDAgMCAwIDEuOTUyLTIuNDM0bC0yLTlBMiAyIDAgMCAwIDE4IDhINmEyIDIgMCAwIDAtMS45NTIgMS41NjZ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTFWNmE0IDQgMCAwIDEgOCAwdjUiIH1dCiAgICBdOwogICAgdmFyIEhhbmRzaGFrZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTExIDE3IDIgMmExIDEgMCAxIDAgMy0zIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTE0IDE0IDIuNSAyLjVhMSAxIDAgMSAwIDMtM2wtMy44OC0zLjg4YTMgMyAwIDAgMC00LjI0IDBsLS44OC44OGExIDEgMCAxIDEtMy0zbDIuODEtMi44MWE1Ljc5IDUuNzkgMCAwIDEgNy4wNi0uODdsLjQ3LjI4YTIgMiAwIDAgMCAxLjQyLjI1TDIxIDQiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMyAxIDExaC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMyAyIDE0bDYuNSA2LjVhMSAxIDAgMSAwIDMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDRoOCIgfV0KICAgIF07CiAgICB2YXIgSGFyZERyaXZlRG93bmxvYWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgNi00IDQtNC00IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiOCIsIHg6ICIyIiwgeTogIjE0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMThoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE4aC4wMSIgfV0KICAgIF07CiAgICB2YXIgSGFyZERyaXZlVXBsb2FkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgNi00LTQtNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2OCIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjgiLCB4OiAiMiIsIHk6ICIxNCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE4aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxOGguMDEiIH1dCiAgICBdOwogICAgdmFyIEhhcmREcml2ZSA9IFsKICAgICAgWyJsaW5lIiwgeyB4MTogIjIyIiwgeDI6ICIyIiwgeTE6ICIxMiIsIHkyOiAiMTIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNS40NSA1LjExIDIgMTJ2NmEyIDIgMCAwIDAgMiAyaDE2YTIgMiAwIDAgMCAyLTJ2LTZsLTMuNDUtNi44OUEyIDIgMCAwIDAgMTYuNzYgNEg3LjI0YTIgMiAwIDAgMC0xLjc5IDEuMTF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjYiLCB4MjogIjYuMDEiLCB5MTogIjE2IiwgeTI6ICIxNiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMCIsIHgyOiAiMTAuMDEiLCB5MTogIjE2IiwgeTI6ICIxNiIgfV0KICAgIF07CiAgICB2YXIgSGFyZEhhdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEwVjVhMSAxIDAgMCAxIDEtMWgyYTEgMSAwIDAgMSAxIDF2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA2YTYgNiAwIDAgMSA2IDZ2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE1di0zYTYgNiAwIDAgMSA2LTYiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjE1Iiwgd2lkdGg6ICIyMCIsIGhlaWdodDogIjQiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIEhhc2ggPSBbCiAgICAgIFsibGluZSIsIHsgeDE6ICI0IiwgeDI6ICIyMCIsIHkxOiAiOSIsIHkyOiAiOSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI0IiwgeDI6ICIyMCIsIHkxOiAiMTUiLCB5MjogIjE1IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEwIiwgeDI6ICI4IiwgeTE6ICIzIiwgeTI6ICIyMSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNiIsIHgyOiAiMTQiLCB5MTogIjMiLCB5MjogIjIxIiB9XQogICAgXTsKICAgIHZhciBIYXRHbGFzc2VzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMThhMiAyIDAgMCAwLTQgMCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xOSAxMS0yLjExLTYuNjU3YTIgMiAwIDAgMC0yLjc1Mi0xLjE0OGwtMS4yNzYuNjFBMiAyIDAgMCAxIDEyIDRIOC41YTIgMiAwIDAgMC0xLjkyNSAxLjQ1Nkw1IDExIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTFoMjAiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNyIsIGN5OiAiMTgiLCByOiAiMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjciLCBjeTogIjE4IiwgcjogIjMiIH1dCiAgICBdOwogICAgdmFyIEhhemUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm01LjIgNi4yIDEuNCAxLjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxM2gyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDEzaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcuNCA3LjYgMS40LTEuNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxN0gyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDIxSDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTNhNCA0IDAgMCAwLTggMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA1VjIuNSIgfV0KICAgIF07CiAgICB2YXIgSGQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMkg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE1VjkiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTQgMTQuNWEuNS41IDAgMCAwIC41LjVoMWEyLjUgMi41IDAgMCAwIDIuNS0yLjV2LTFBMi41IDIuNSAwIDAgMCAxNS41IDloLTFhLjUuNSAwIDAgMC0uNS41eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE1VjkiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjUiLCB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTQiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIEhkbWlQb3J0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk0yMiA5YTEgMSAwIDAgMC0xLTFIM2ExIDEgMCAwIDAtMSAxdjRhMSAxIDAgMCAwIDEgMWgxbDIgMmgxMmwyLTJoMWExIDEgMCAwIDAgMS0xWiIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNy41IDEyaDkiIH1dCiAgICBdOwogICAgdmFyIEhlYWRpbmcxID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMThWNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOFY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDEyIDMtMnY4IiB9XQogICAgXTsKICAgIHZhciBIZWFkaW5nMiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTJoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE4VjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMThWNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxOGgtNGMwLTQgNC0zIDQtNiAwLTEuNS0yLTIuNS00LTEiIH1dCiAgICBdOwogICAgdmFyIEhlYWRpbmczID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMThWNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOFY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjUgMTAuNWMxLjctMSAzLjUgMCAzLjUgMS41YTIgMiAwIDAgMS0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTcuNWMyIDEuNSA0IC4zIDQtMS41YTIgMiAwIDAgMC0yLTIiIH1dCiAgICBdOwogICAgdmFyIEhlYWRpbmc0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMThWNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxMHYzYTEgMSAwIDAgMCAxIDFoMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMHY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTJoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE4VjYiIH1dCiAgICBdOwogICAgdmFyIEhlYWRpbmc2ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMThWNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOFY2IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTkiLCBjeTogIjE2IiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTBjLTIgMi0zIDMuNS0zIDYiIH1dCiAgICBdOwogICAgdmFyIEhlYWRpbmc1ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMThWNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOFY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDEzdi0zaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTcuN2MuNC4yLjguMyAxLjMuMyAxLjUgMCAyLjctMS4xIDIuNy0yLjVTMTkuOCAxMyAxOC4zIDEzSDE3IiB9XQogICAgXTsKICAgIHZhciBIZWFkaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxMmgxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDIwVjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMjBWNCIgfV0KICAgIF07CiAgICB2YXIgSGVhZHBob25lT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTRoLTEuMzQzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuMTI4IDMuNDdBOSA5IDAgMCAxIDIxIDEydjMuMzQzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC40MTQgMjAuNDE0QTIgMiAwIDAgMSAxOSAyMWgtMWEyIDIgMCAwIDEtMi0ydi0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTRoM2EyIDIgMCAwIDEgMiAydjNhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ2LTdhOSA5IDAgMCAxIDIuNjM2LTYuMzY0IiB9XQogICAgXTsKICAgIHZhciBIZWFkcGhvbmVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMyAxNGgzYTIgMiAwIDAgMSAyIDJ2M2EyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtN2E5IDkgMCAwIDEgMTggMHY3YTIgMiAwIDAgMS0yIDJoLTFhMiAyIDAgMCAxLTItMnYtM2EyIDIgMCAwIDEgMi0yaDMiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEhlYWRzZXQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0zIDExaDNhMiAyIDAgMCAxIDIgMnYzYTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi01Wm0wIDBhOSA5IDAgMSAxIDE4IDBtMCAwdjVhMiAyIDAgMCAxLTIgMmgtMWEyIDIgMCAwIDEtMi0ydi0zYTIgMiAwIDAgMSAyLTJoM1oiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTZ2MmE0IDQgMCAwIDEtNCA0aC01IiB9XQogICAgXTsKICAgIHZhciBIZWFydENyYWNrID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTIuNDA5IDUuODI0Yy0uNzAyLjc5Mi0xLjE1IDEuNDk2LTEuNDE1IDIuMTY2bDIuMTUzIDIuMTU2YS41LjUgMCAwIDEgMCAuNzA3bC0yLjI5MyAyLjI5M2EuNS41IDAgMCAwIDAgLjcwN0wxMiAxNSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMy41MDggMjAuMzEzYTIgMiAwIDAgMS0zIC4wMTlMNSAxNWMtMS41LTEuNS0zLTMuMi0zLTUuNWE1LjUgNS41IDAgMCAxIDkuNTkxLTMuNjc3LjYuNiAwIDAgMCAuODE4LjAwMUE1LjUgNS41IDAgMCAxIDIyIDkuNWMwIDIuMjktMS41IDQtMyA1LjV6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBIZWFydEhhbmRzaGFrZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE5LjQxNCAxNC40MTRDMjEgMTIuODI4IDIyIDExLjUgMjIgOS41YTUuNSA1LjUgMCAwIDAtOS41OTEtMy42NzYuNi42IDAgMCAxLS44MTguMDAxQTUuNSA1LjUgMCAwIDAgMiA5LjVjMCAyLjMgMS41IDQgMyA1LjVsNS41MzUgNS4zNjJhMiAyIDAgMCAwIDIuODc5LjA1MiAyLjEyIDIuMTIgMCAwIDAtLjAwNC0zIDIuMTI0IDIuMTI0IDAgMSAwIDMtMyAyLjEyNCAyLjEyNCAwIDAgMCAzLjAwNCAwIDIgMiAwIDAgMCAwLTIuODI4bC0xLjg4MS0xLjg4MmEyLjQxIDIuNDEgMCAwIDAtMy40MDkgMGwtMS43MSAxLjcxYTIgMiAwIDAgMS0yLjgyOCAwIDIgMiAwIDAgMSAwLTIuODI4bDIuODIzLTIuNzYyIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBIZWFydE1pbnVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTQuODc2IDE4Ljk5LTEuMzY4IDEuMzIzYTIgMiAwIDAgMS0zIC4wMTlMNSAxNWMtMS41LTEuNS0zLTMuMi0zLTUuNWE1LjUgNS41IDAgMCAxIDkuNTkxLTMuNjc2LjU2LjU2IDAgMCAwIC44MTggMEE1LjQ5IDUuNDkgMCAwIDEgMjIgOS41YTUuMiA1LjIgMCAwIDEtLjI0NCAxLjU3MiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxNWg2IiB9XQogICAgXTsKICAgIHZhciBIZWFydE9mZiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwLjUgNC44OTNhNS41IDUuNSAwIDAgMSAxLjA5MS45MzEuNTYuNTYgMCAwIDAgLjgxOCAwQTUuNDkgNS40OSAwIDAgMSAyMiA5LjVjMCAxLjg3Mi0xLjAwMiAzLjM1Ni0yLjE4NyA0LjY1NSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xNi45NjcgMTYuOTY3LTMuNDU5IDMuMzQ2YTIgMiAwIDAgMS0zIC4wMTlMNSAxNWMtMS41LTEuNS0zLTMuMi0zLTUuNWE1LjUgNS41IDAgMCAxIDIuNzQ3LTQuNzYxIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0KICAgIF07CiAgICB2YXIgSGVhcnRQbHVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTQuNDc5IDE5LjM3NC0uOTcxLjkzOWEyIDIgMCAwIDEtMyAuMDE5TDUgMTVjLTEuNS0xLjUtMy0zLjItMy01LjVhNS41IDUuNSAwIDAgMSA5LjU5MS0zLjY3Ni41Ni41NiAwIDAgMCAuODE4IDBBNS40OSA1LjQ5IDAgMCAxIDIyIDkuNWE1LjIgNS4yIDAgMCAxLS4yMTkgMS40OSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxNWg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDEydjYiIH1dCiAgICBdOwogICAgdmFyIEhlYXJ0UHVsc2UgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yIDkuNWE1LjUgNS41IDAgMCAxIDkuNTkxLTMuNjc2LjU2LjU2IDAgMCAwIC44MTggMEE1LjQ5IDUuNDkgMCAwIDEgMjIgOS41YzAgMi4yOS0xLjUgNC0zIDUuNWwtNS40OTIgNS4zMTNhMiAyIDAgMCAxLTMgLjAxOUw1IDE1Yy0xLjUtMS41LTMtMy4yLTMtNS41IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuMjIgMTNIOS41bC41LTEgMiA0LjUgMi03IDEuNSAzLjVoNS4yNyIgfV0KICAgIF07CiAgICB2YXIgSGVhcnQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yIDkuNWE1LjUgNS41IDAgMCAxIDkuNTkxLTMuNjc2LjU2LjU2IDAgMCAwIC44MTggMEE1LjQ5IDUuNDkgMCAwIDEgMjIgOS41YzAgMi4yOS0xLjUgNC0zIDUuNWwtNS40OTIgNS4zMTNhMiAyIDAgMCAxLTMgLjAxOUw1IDE1Yy0xLjUtMS41LTMtMy4yLTMtNS41IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBIZWF0ZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSA4YzItMy0yLTMgMC02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1LjUgOGMyLTMtMi0zIDAtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEwaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE0aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxNnYtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxNnYtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxNnYtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCA2YTIgMiAwIDAgMSAyIDJ2MTBhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDIwdjIiIH1dCiAgICBdOwogICAgdmFyIEhleGFnb24gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMSAxNlY4YTIgMiAwIDAgMC0xLTEuNzNsLTctNGEyIDIgMCAwIDAtMiAwbC03IDRBMiAyIDAgMCAwIDMgOHY4YTIgMiAwIDAgMCAxIDEuNzNsNyA0YTIgMiAwIDAgMCAyIDBsNy00QTIgMiAwIDAgMCAyMSAxNnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEhlbGljb3B0ZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxN3Y0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDN2OGEyIDIgMCAwIDAgMiAyaDUuODY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDE3djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTdhNCA0IDAgMCAwIDQtNCA4IDYgMCAwIDAtOC02IDYgNSAwIDAgMC02IDV2M2EyIDIgMCAwIDAgMiAyeiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEwdjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAzaDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjFoMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxM0gyIiB9XQogICAgXTsKICAgIHZhciBIaWdobGlnaHRlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTEtNiA2djNoOWwzLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgMTItNC42IDQuNmEyIDIgMCAwIDEtMi44IDBsLTUuMi01LjJhMiAyIDAgMCAxIDAtMi44TDE0IDQiIH1dCiAgICBdOwogICAgdmFyIEhpc3RvcnkgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyYTkgOSAwIDEgMCA5LTkgOS43NSA5Ljc1IDAgMCAwLTYuNzQgMi43NEwzIDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjVoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA3djVsNCAyIiB9XQogICAgXTsKICAgIHZhciBIb3BPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC44MiAxNi4xMmMxLjY5LjYgMy45MS43OSA1LjE4Ljg1LjI4LjAxLjUzLS4wOS43LS4yNyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTExLjE0IDIwLjU3Yy41Mi4yNCAyLjQ0IDEuMTIgNC4wOCAxLjM3LjQ2LjA2Ljg2LS4yNS45LS43MS4xMi0xLjUyLS4zLTMuNDMtLjUtNC4yOCIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYuMTMgMjEuMDVjMS42NS42MyAzLjY4Ljg0IDQuODcuOTFhLjkuOSAwIDAgMCAuNy0uMjYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk0xNy45OSA1LjUyYTIwLjgzIDIwLjgzIDAgMCAxIDMuMTUgNC41LjguOCAwIDAgMS0uNjggMS4xM2MtMS4xNy4xLTIuNS4wMi0zLjktLjI1IiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC41NyAxMS4xNGMuMjQuNTIgMS4xMiAyLjQ0IDEuMzcgNC4wOC4wNC4zLS4wOC41OS0uMzEuNzUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNC45MyA0LjkzYTEwIDEwIDAgMCAwLS42NyAxMy40Yy4zNS40My45Ni40IDEuMTctLjEyLjY5LTEuNzEgMS4wNy01LjA3IDEuMDctNi43MSAxLjM0LjQ1IDMuMS45IDQuODguNjJhLjg1Ljg1IDAgMCAwIC40OC0uMjQiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk01LjUyIDE3Ljk5YzEuMDUuOTUgMi45MSAyLjQyIDQuNSAzLjE1YS44LjggMCAwIDAgMS4xMy0uNjhjLjItMi4zNC0uMzMtNS4zLTEuNTctOC4yOCIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC4zNSAyLjY4YTEwIDEwIDAgMCAxIDkuOTggMS41OGMuNDMuMzUuNC45Ni0uMTIgMS4xNy0xLjUuNi00LjMuOTgtNi4wNyAxLjA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0KICAgIF07CiAgICB2YXIgSG9wID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk0xMC44MiAxNi4xMmMxLjY5LjYgMy45MS43OSA1LjE4Ljg1LjU1LjAzIDEtLjQyLjk3LS45Ny0uMDYtMS4yNy0uMjYtMy41LS44NS01LjE4IiB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMS41IDYuNWMxLjY0IDAgNS0uMzggNi43MS0xLjA3LjUyLS4yLjU1LS44Mi4xMi0xLjE3QTEwIDEwIDAgMCAwIDQuMjYgMTguMzNjLjM1LjQzLjk2LjQgMS4xNy0uMTIuNjktMS43MSAxLjA3LTUuMDcgMS4wNy02LjcxIDEuMzQuNDUgMy4xLjkgNC44OC42MmEuODguODggMCAwIDAgLjczLS43NGMuMy0yLjE0LS4xNS0zLjUtLjYxLTQuODgiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk0xNS42MiAxNi45NWMuMi44NS42MiAyLjc2LjUgNC4yOGEuNzcuNzcgMCAwIDEtLjkuNyAxNi42NCAxNi42NCAwIDAgMS00LjA4LTEuMzYiIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTYuMTMgMjEuMDVjMS42NS42MyAzLjY4Ljg0IDQuODcuOTFhLjkuOSAwIDAgMCAuOTYtLjk2IDE3LjY4IDE3LjY4IDAgMCAwLS45LTQuODciIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTYuOTQgMTUuNjJjLjg2LjIgMi43Ny42MiA0LjI5LjVhLjc3Ljc3IDAgMCAwIC43LS45IDE2LjY0IDE2LjY0IDAgMCAwLTEuMzYtNC4wOCIgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk0xNy45OSA1LjUyYTIwLjgyIDIwLjgyIDAgMCAxIDMuMTUgNC41LjguOCAwIDAgMS0uNjggMS4xM2MtMi4zMy4yLTUuMy0uMzItOC4yNy0xLjU3IiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00LjkzIDQuOTMgMyAzYS43LjcgMCAwIDEgMC0xIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTkuNTggMTIuMThjMS4yNCAyLjk4IDEuNzcgNS45NSAxLjU3IDguMjhhLjguOCAwIDAgMS0xLjEzLjY4IDIwLjgyIDIwLjgyIDAgMCAxLTQuNS0zLjE1IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBIb3NwaXRhbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAyMXYtM2EyIDIgMCAwIDAtNCAwdjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgOWgtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMWgyYTIgMiAwIDAgMSAyIDJ2NmEyIDIgMCAwIDEtMiAySDRhMiAyIDAgMCAxLTItMnYtOWEyIDIgMCAwIDEgMi0yaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMjFWNWEyIDIgMCAwIDAtMi0ySDhhMiAyIDAgMCAwLTIgMnYxNiIgfV0KICAgIF07CiAgICB2YXIgSG90ZWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAyMnYtNi41NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgN2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTUuNDNWMjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTZhNSA1IDAgMCAwLTYgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgN2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA3aC4wMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjQiLCB5OiAiMiIsIHdpZHRoOiAiMTYiLCBoZWlnaHQ6ICIyMCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgSG91cmdsYXNzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMmgxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDJoMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMjJ2LTQuMTcyYTIgMiAwIDAgMC0uNTg2LTEuNDE0TDEyIDEybC00LjQxNCA0LjQxNEEyIDIgMCAwIDAgNyAxNy44MjhWMjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAydjQuMTcyYTIgMiAwIDAgMCAuNTg2IDEuNDE0TDEyIDEybDQuNDE0LTQuNDE0QTIgMiAwIDAgMCAxNyA2LjE3MlYyIiB9XQogICAgXTsKICAgIHZhciBIb3VzZUhlYXJ0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOC42MiAxMy44QTIuMjUgMi4yNSAwIDEgMSAxMiAxMC44MzZhMi4yNSAyLjI1IDAgMSAxIDMuMzggMi45NjZsLTIuNjI2IDIuODU2YS45OTguOTk4IDAgMCAxLTEuNTA3IDB6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMgMTBhMiAyIDAgMCAxIC43MDktMS41MjhsNy02YTIgMiAwIDAgMSAyLjU4MiAwbDcgNkEyIDIgMCAwIDEgMjEgMTB2OWEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEhvdXNlUGx1ZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEyVjguOTY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDEyVjguOTY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEyYTEgMSAwIDAgMSAxIDF2MmEyIDIgMCAwIDEtMiAyaC00YTIgMiAwIDAgMS0yLTJ2LTJhMSAxIDAgMCAxIDEtMXoiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOC41IDIxSDVhMiAyIDAgMCAxLTItMnYtOWEyIDIgMCAwIDEgLjcwOS0xLjUyOGw3LTZhMiAyIDAgMCAxIDIuNTgyIDBsNyA2QTIgMiAwIDAgMSAyMSAxMHY5YTIgMiAwIDAgMS0yIDJoLTVhMiAyIDAgMCAxLTItMnYtMiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgSG91c2VXaWZpID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOS41IDEzLjg2NmE0IDQgMCAwIDEgNSAuMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTdoLjAxIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMgMTBhMiAyIDAgMCAxIC43MDktMS41MjhsNy02YTIgMiAwIDAgMSAyLjU4MiAwbDcgNkEyIDIgMCAwIDEgMjEgMTB2OWEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMC43NTRhOCA4IDAgMCAxIDEwIDAiIH1dCiAgICBdOwogICAgdmFyIEhvdXNlUGx1cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyLjM1IDIxSDVhMiAyIDAgMCAxLTItMnYtOWEyIDIgMCAwIDEgLjcxLTEuNTNsNy02YTIgMiAwIDAgMSAyLjU4IDBsNyA2QTIgMiAwIDAgMSAyMSAxMHYyLjM1IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0LjggMTIuNEExIDEgMCAwIDAgMTQgMTJoLTRhMSAxIDAgMCAwLTEgMXY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDE4aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTV2NiIgfV0KICAgIF07CiAgICB2YXIgSWNlQ3JlYW1Cb3dsID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk0xMiAxN2M1IDAgOC0yLjY5IDgtNkg0YzAgMy4zMSAzIDYgOCA2bS00IDRoOG0tNC0zdjNNNS4xNCAxMWEzLjUgMy41IDAgMSAxIDYuNzEgMCIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIuMTQgMTFhMy41IDMuNSAwIDEgMSA2LjcxIDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUuNSA2LjVhMy41IDMuNSAwIDEgMC03IDAiIH1dCiAgICBdOwogICAgdmFyIEhvdXNlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMjF2LThhMSAxIDAgMCAwLTEtMWgtNGExIDEgMCAwIDAtMSAxdjgiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMyAxMGEyIDIgMCAwIDEgLjcwOS0xLjUyOGw3LTZhMiAyIDAgMCAxIDIuNTgyIDBsNyA2QTIgMiAwIDAgMSAyMSAxMHY5YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgSWNlQ3JlYW1Db25lID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtNyAxMSA0LjA4IDEwLjM1YTEgMSAwIDAgMCAxLjg0IDBMMTcgMTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgN0E1IDUgMCAwIDAgNyA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDdhMiAyIDAgMCAxIDAgNEg3YTIgMiAwIDAgMSAwLTQiIH1dCiAgICBdOwogICAgdmFyIElkQ2FyZExhbnlhcmQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMy41IDhoLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgMi0xIDJoM2EyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDJIN2EyIDIgMCAwIDEtMi0yVjZhMiAyIDAgMCAxIDItMmgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2Ljg5OSAyMkE1IDUgMCAwIDAgNy4xIDIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMiAzIDYiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTUiLCByOiAiMyIgfV0KICAgIF07CiAgICB2YXIgSWRDYXJkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTBoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNGgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMTcgMTVhMyAzIDAgMCAxIDUuNjYgMCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjExIiwgcjogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjUiLCB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTQiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIEltYWdlRG93biA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwLjMgMjFINWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmgxNGEyIDIgMCAwIDEgMiAydjEwbC0zLjEtMy4xYTIgMiAwIDAgMC0yLjgxNC4wMTRMNiAyMSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAxOSAzIDN2LTUuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAyMiAzLTMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICI5IiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIEltYWdlTWludXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA5djEwYTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmg3IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE2IiwgeDI6ICIyMiIsIHkxOiAiNSIsIHkyOiAiNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjkiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAxNS0zLjA4Ni0zLjA4NmEyIDIgMCAwIDAtMi44MjggMEw2IDIxIiB9XQogICAgXTsKICAgIHZhciBJbWFnZU9mZiA9IFsKICAgICAgWyJsaW5lIiwgeyB4MTogIjIiLCB4MjogIjIyIiwgeTE6ICIyIiwgeTI6ICIyMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC40MSAxMC40MWEyIDIgMCAxIDEtMi44My0yLjgzIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEzLjUiLCB4MjogIjYiLCB5MTogIjEzLjUiLCB5MjogIjIxIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE4IiwgeDI6ICIyMSIsIHkxOiAiMTIiLCB5MjogIjE1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuNTkgMy41OUExLjk5IDEuOTkgMCAwIDAgMyA1djE0YTIgMiAwIDAgMCAyIDJoMTRjLjU1IDAgMS4wNTItLjIyIDEuNDEtLjU5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE1VjVhMiAyIDAgMCAwLTItMkg5IiB9XQogICAgXTsKICAgIHZhciBJbWFnZVBsYXkgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNSAxNS4wMDNhMSAxIDAgMCAxIDEuNTE3LS44NTlsNC45OTcgMi45OTdhMSAxIDAgMCAxIDAgMS43MThsLTQuOTk3IDIuOTk3YTEgMSAwIDAgMS0xLjUxNy0uODZ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEyLjE3VjVhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYgMjEgNS01IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOSIsIGN5OiAiOSIsIHI6ICIyIiB9XQogICAgXTsKICAgIHZhciBJbWFnZVBsdXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA1aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDExLjVWMTlhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDcuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAxNS0zLjA4Ni0zLjA4NmEyIDIgMCAwIDAtMi44MjggMEw2IDIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOSIsIGN5OiAiOSIsIHI6ICIyIiB9XQogICAgXTsKICAgIHZhciBJbWFnZVVwID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTAuMyAyMUg1YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDE0YTIgMiAwIDAgMSAyIDJ2MTBsLTMuMS0zLjFhMiAyIDAgMCAwLTIuODE0LjAxNEw2IDIxIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDE5LjUgMy0zIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAyMnYtNS41IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOSIsIGN5OiAiOSIsIHI6ICIyIiB9XQogICAgXTsKICAgIHZhciBJbWFnZVVwc2NhbGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAzaDV2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAyMWgyYTIgMiAwIDAgMCAyLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTJ2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAzLTUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDdWNWEyIDIgMCAwIDEgMi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTUgMjEgNC4xNDQtNC4xNDRhMS4yMSAxLjIxIDAgMCAxIDEuNzEyIDBMMTMgMTkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAzaDMiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIzIiwgeTogIjExIiwgd2lkdGg6ICIxMCIsIGhlaWdodDogIjEwIiwgcng6ICIxIiB9XQogICAgXTsKICAgIHZhciBJbWFnZTIgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjkiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAxNS0zLjA4Ni0zLjA4NmEyIDIgMCAwIDAtMi44MjggMEw2IDIxIiB9XQogICAgXTsKICAgIHZhciBJbWFnZXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiAxMS0xLjI5Ni0xLjI5NmEyLjQgMi40IDAgMCAwLTMuNDA4IDBMMTEgMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA4YTIgMiAwIDAgMC0yIDJ2MTBhMiAyIDAgMCAwIDIgMmgxMGEyIDIgMCAwIDAgMi0yIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTMiLCBjeTogIjciLCByOiAiMSIsIGZpbGw6ICJjdXJyZW50Q29sb3IiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI4IiwgeTogIjIiLCB3aWR0aDogIjE0IiwgaGVpZ2h0OiAiMTQiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIEltcG9ydCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDN2MTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAxMSA0IDQgNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggNUg0YTIgMiAwIDAgMC0yIDJ2MTBhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0yVjdhMiAyIDAgMCAwLTItMmgtNCIgfV0KICAgIF07CiAgICB2YXIgSW5kaWFuUnVwZWUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDNoMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA4aDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYgMTMgOC41IDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxM2gzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTNjNi42NjcgMCA2LjY2Ny0xMCAwLTEwIiB9XQogICAgXTsKICAgIHZhciBJbmZpbml0eTIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE2YzUgMCA3LTggMTItOGE0IDQgMCAwIDEgMCA4Yy01IDAtNy04LTEyLThhNCA0IDAgMSAwIDAgOCIgfV0KICAgIF07CiAgICB2YXIgSW5mbzIgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNnYtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA4aC4wMSIgfV0KICAgIF07CiAgICB2YXIgSW5ib3ggPSBbCiAgICAgIFsicG9seWxpbmUiLCB7IHBvaW50czogIjIyIDEyIDE2IDEyIDE0IDE1IDEwIDE1IDggMTIgMiAxMiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk01LjQ1IDUuMTEgMiAxMnY2YTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMnYtNmwtMy40NS02Ljg5QTIgMiAwIDAgMCAxNi43NiA0SDcuMjRhMiAyIDAgMCAwLTEuNzkgMS4xMXoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIEluc3BlY3Rpb25QYW5lbCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgN2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgN2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxN2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTdoLjAxIiB9XQogICAgXTsKICAgIHZhciBJdGFsaWMgPSBbCiAgICAgIFsibGluZSIsIHsgeDE6ICIxOSIsIHgyOiAiMTAiLCB5MTogIjQiLCB5MjogIjQiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTQiLCB4MjogIjUiLCB5MTogIjIwIiwgeTI6ICIyMCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNSIsIHgyOiAiOSIsIHkxOiAiNCIsIHkyOiAiMjAiIH1dCiAgICBdOwogICAgdmFyIEluc3RhZ3JhbSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMjAiLCB4OiAiMiIsIHk6ICIyIiwgcng6ICI1Iiwgcnk6ICI1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDExLjM3QTQgNCAwIDEgMSAxMi42MyA4IDQgNCAwIDAgMSAxNiAxMS4zN3oiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTcuNSIsIHgyOiAiMTcuNTEiLCB5MTogIjYuNSIsIHkyOiAiNi41IiB9XQogICAgXTsKICAgIHZhciBJdGVyYXRpb25DY3cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAxNCA0IDQtNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDEwYTggOCAwIDEgMC04IDhoOCIgfV0KICAgIF07CiAgICB2YXIgSXRlcmF0aW9uQ3cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEwYTggOCAwIDEgMSA4IDhINCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDIyLTQtNCA0LTQiIH1dCiAgICBdOwogICAgdmFyIEphcGFuZXNlWWVuID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOS41VjIxbTAtMTEuNUw2IDNtNiA2LjVMMTggMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE1aDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTFoMTIiIH1dCiAgICBdOwogICAgdmFyIEthbmJhbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgM3YxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAzdjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgM3YxOCIgfV0KICAgIF07CiAgICB2YXIgS2F5YWsgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxN2ExIDEgMCAwIDAtMSAxdjFhMiAyIDAgMSAwIDItMnoiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAuOTcgMy42MWEuNDUuNDUgMCAwIDAtLjU4LS41OEMxMC4yIDYuNiA2LjYgMTAuMiAzLjAzIDIwLjM5YS40NS40NSAwIDAgMCAuNTguNThDMTMuOCAxNy40IDE3LjQgMTMuOCAyMC45NyAzLjYxIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYuNzA3IDYuNzA3IDEwLjU4NiAxMC41ODYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyA1YTIgMiAwIDEgMC0yIDJoMWExIDEgMCAwIDAgMS0xeiIgfV0KICAgIF07CiAgICB2YXIgSm95c3RpY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxN2EyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYyYTIgMiAwIDAgMCAyIDJoMTRhMiAyIDAgMCAwIDItMnYtMloiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxNXYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNVY5IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjYiLCByOiAiMyIgfV0KICAgIF07CiAgICB2YXIgS2V5Um91bmQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yLjU4NiAxNy40MTRBMiAyIDAgMCAwIDIgMTguODI4VjIxYTEgMSAwIDAgMCAxIDFoM2ExIDEgMCAwIDAgMS0xdi0xYTEgMSAwIDAgMSAxLTFoMWExIDEgMCAwIDAgMS0xdi0xYTEgMSAwIDAgMSAxLTFoLjE3MmEyIDIgMCAwIDAgMS40MTQtLjU4NmwuODE0LS44MTRhNi41IDYuNSAwIDEgMC00LTR6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYuNSIsIGN5OiAiNy41IiwgcjogIi41IiwgZmlsbDogImN1cnJlbnRDb2xvciIgfV0KICAgIF07CiAgICB2YXIgS2V5U3F1YXJlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTIuNCAyLjdhMi41IDIuNSAwIDAgMSAzLjQgMGw1LjUgNS41YTIuNSAyLjUgMCAwIDEgMCAzLjRsLTMuNyAzLjdhMi41IDIuNSAwIDAgMS0zLjQgMEw4LjcgOS44YTIuNSAyLjUgMCAwIDEgMC0zLjR6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDcgMyAzIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTkuNCAxMC42LTYuODE0IDYuODE0QTIgMiAwIDAgMCAyIDE4LjgyOFYyMWExIDEgMCAwIDAgMSAxaDNhMSAxIDAgMCAwIDEtMXYtMWExIDEgMCAwIDEgMS0xaDFhMSAxIDAgMCAwIDEtMXYtMWExIDEgMCAwIDEgMS0xaC4xNzJhMiAyIDAgMCAwIDEuNDE0LS41ODZsLjgxNC0uODE0IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBLZXkyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUuNSA3LjUgMi4zIDIuM2ExIDEgMCAwIDAgMS40IDBsMi4xLTIuMWExIDEgMCAwIDAgMC0xLjRMMTkgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAyLTkuNiA5LjYiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI3LjUiLCBjeTogIjE1LjUiLCByOiAiNS41IiB9XQogICAgXTsKICAgIHZhciBLZXlib2FyZE11c2ljID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxNiIsIHg6ICIyIiwgeTogIjQiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA4aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgOGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggOGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmgyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDEydjQiIH1dCiAgICBdOwogICAgdmFyIEtleWJvYXJkT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNIDIwIDQgQTIgMiAwIDAgMSAyMiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTSAyMiA2IEwgMjIgMTYuNDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNIDcgMTYgTCAxNiAxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0gOS42OSA0IEwgMjAgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA4aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA4aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMjBINGEyIDIgMCAwIDEtMi0yVjZhMiAyIDAgMCAxIDItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDhoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJoLjAxIiB9XQogICAgXTsKICAgIHZhciBLZXlib2FyZDIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA4aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgOGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDhoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgOGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxNmgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEyaC4wMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE2IiwgeDogIjIiLCB5OiAiNCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgTGFtcENlaWxpbmcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQuODI5IDE1Ljk5OGEzIDMgMCAxIDEtNS42NTggMCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMC45MiAxNC42MDZBMSAxIDAgMCAxIDIwIDE2SDRhMSAxIDAgMCAxLS45Mi0xLjM5NGwzLTdBMSAxIDAgMCAxIDcgN2gxMGExIDEgMCAwIDEgLjkyLjYwNnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIExhbXBEZXNrID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTAuMjkzIDIuMjkzYTEgMSAwIDAgMSAxLjQxNCAwbDIuNSAyLjUgNS45OTQgMS4yMjdhMSAxIDAgMCAxIC41MDYgMS42ODdsLTcgN2ExIDEgMCAwIDEtMS42ODctLjUwNmwtMS4yMjctNS45OTQtMi41LTIuNWExIDEgMCAwIDEgMC0xLjQxNHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuMjA3IDQuNzkzLTMuNDE0IDMuNDE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMjBhMiAyIDAgMCAxIDItMmg0YTIgMiAwIDAgMSAyIDJ2MWExIDEgMCAwIDEtMSAxSDRhMSAxIDAgMCAxLTEtMXoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOS4wODYgNi41LTQuNzkzIDQuNzkzYTEgMSAwIDAgMC0uMTggMS4xN0w3IDE4IiB9XQogICAgXTsKICAgIHZhciBMYW1wRmxvb3IgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMHYxMiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNy45MjkgNy42MjlBMSAxIDAgMCAxIDE3IDlIN2ExIDEgMCAwIDEtLjkyOC0xLjM3MWwyLTVBMSAxIDAgMCAxIDkgMmg2YTEgMSAwIDAgMSAuOTI4LjYyOXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAyMmg2IiB9XQogICAgXTsKICAgIHZhciBMYW1wV2FsbFVwID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTkuOTI5IDkuNjI5QTEgMSAwIDAgMSAxOSAxMUg5YTEgMSAwIDAgMS0uOTI4LTEuMzcxbDItNUExIDEgMCAwIDEgMTEgNGg2YTEgMSAwIDAgMSAuOTI4LjYyOXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxNWEyIDIgMCAwIDEgMiAydjJhMiAyIDAgMCAxLTIgMkg1YTEgMSAwIDAgMS0xLTF2LTRhMSAxIDAgMCAxIDEtMXoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxOGg0YTIgMiAwIDAgMCAyLTJ2LTUiIH1dCiAgICBdOwogICAgdmFyIExhbXBXYWxsRG93biA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE5LjkyOSAxOC42MjlBMSAxIDAgMCAxIDE5IDIwSDlhMSAxIDAgMCAxLS45MjgtMS4zNzFsMi01QTEgMSAwIDAgMSAxMSAxM2g2YTEgMSAwIDAgMSAuOTI4LjYyOXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAzYTIgMiAwIDAgMSAyIDJ2MmEyIDIgMCAwIDEtMiAySDVhMSAxIDAgMCAxLTEtMVY0YTEgMSAwIDAgMSAxLTF6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggNmg0YTIgMiAwIDAgMSAyIDJ2NSIgfV0KICAgIF07CiAgICB2YXIgTGFtcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEydjYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNC4wNzcgMTAuNjE1QTEgMSAwIDAgMCA1IDEyaDE0YTEgMSAwIDAgMCAuOTIzLTEuMzg1bC0zLjA3Ny03LjM4NEEyIDIgMCAwIDAgMTUgMkg5YTIgMiAwIDAgMC0xLjg0NiAxLjIzWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIwYTIgMiAwIDAgMSAyLTJoNGEyIDIgMCAwIDEgMiAydjFhMSAxIDAgMCAxLTEgMUg5YTEgMSAwIDAgMS0xLTF6IiB9XQogICAgXTsKICAgIHZhciBMYW5kUGxvdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDggNi0zLTYtM3YxMCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm04IDExLjk5LTUuNSAzLjE0YTEgMSAwIDAgMCAwIDEuNzRsOC41IDQuODZhMiAyIDAgMCAwIDIgMGw4LjUtNC44NmExIDEgMCAwIDAgMC0xLjc0TDE2IDEyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYuNDkgMTIuODUgMTEuMDIgNi4zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjUxIDEyLjg1IDYuNSAxOS4xNSIgfV0KICAgIF07CiAgICB2YXIgTGFuZG1hcmsgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxOHYtNyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMS4xMiAyLjE5OGEyIDIgMCAwIDEgMS43Ni4wMDZsNy44NjYgMy44NDdjLjQ3Ni4yMzMuMzEuOTQ5LS4yMi45NDlIMy40NzRjLS41MyAwLS42OTUtLjcxNi0uMjItLjk0OXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTh2LTciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTh2LTciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAyMmgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE4di03IiB9XQogICAgXTsKICAgIHZhciBMYW5ndWFnZXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm01IDggNiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTQgMTQgNi02IDItMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDVoMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgMjItNS0xMC01IDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE4aDYiIH1dCiAgICBdOwogICAgdmFyIExhcHRvcE1pbmltYWxDaGVjayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjBoMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxMCAyIDIgNC00IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICI0Iiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjEyIiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBMYXB0b3BNaW5pbWFsID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxMiIsIHg6ICIzIiwgeTogIjQiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMiIsIHgyOiAiMjIiLCB5MTogIjIwIiwgeTI6ICIyMCIgfV0KICAgIF07CiAgICB2YXIgTGFwdG9wID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTggNWEyIDIgMCAwIDEgMiAydjguNTI2YTIgMiAwIDAgMCAuMjEyLjg5N2wxLjA2OCAyLjEyN2ExIDEgMCAwIDEtLjkgMS40NUgzLjYyYTEgMSAwIDAgMS0uOS0xLjQ1bDEuMDY4LTIuMTI3QTIgMiAwIDAgMCA0IDE1LjUyNlY3YTIgMiAwIDAgMSAyLTJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwLjA1NCAxNS45ODdIMy45NDYiIH1dCiAgICBdOwogICAgdmFyIExhc3NvU2VsZWN0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMmE1IDUgMCAwIDEtMi00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTYuOTNjLjk2LjQzIDEuOTYuNzQgMi45OS45MSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTMuMzQgMTRBNi44IDYuOCAwIDAgMSAyIDEwYzAtNC40MiA0LjQ4LTggMTAtOHMxMCAzLjU4IDEwIDhhNy4xOSA3LjE5IDAgMCAxLS4zMyAyIiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE4YTIgMiAwIDEgMCAwLTQgMiAyIDAgMCAwIDAgNHoiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTQuMzMgMjJoLS4wOWEuMzUuMzUgMCAwIDEtLjI0LS4zMnYtMTBhLjM0LjM0IDAgMCAxIC4zMy0uMzRjLjA4IDAgLjE1LjAzLjIxLjA4bDcuMzQgNmEuMzMuMzMgMCAwIDEtLjIxLjU5aC00LjQ5bC0yLjU3IDMuODVhLjM1LjM1IDAgMCAxLS4yOC4xNHoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIExhc3NvID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMy43MDQgMTQuNDY3YTEwIDggMCAxIDEgMy4xMTUgMi4zNzUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMmE1IDUgMCAwIDEtMi0zLjk5NCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjE2IiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIExhdWdoID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTNhNiA2IDAgMCAxLTYgNSA2IDYgMCAwIDEtNi01aDEyWiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI5IiwgeDI6ICI5LjAxIiwgeTE6ICI5IiwgeTI6ICI5IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE1IiwgeDI6ICIxNS4wMSIsIHkxOiAiOSIsIHkyOiAiOSIgfV0KICAgIF07CiAgICB2YXIgTGF5ZXJzMiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEzIDEzLjc0YTIgMiAwIDAgMS0yIDBMMi41IDguODdhMSAxIDAgMCAxIDAtMS43NEwxMSAyLjI2YTIgMiAwIDAgMSAyIDBsOC41IDQuODdhMSAxIDAgMCAxIDAgMS43NHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMjAgMTQuMjg1IDEuNS44NDVhMSAxIDAgMCAxIDAgMS43NEwxMyAyMS43NGEyIDIgMCAwIDEtMiAwbC04LjUtNC44N2ExIDEgMCAwIDEgMC0xLjc0bDEuNS0uODQ1IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBMYXllcnMzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTIuODMgMi4xOGEyIDIgMCAwIDAtMS42NiAwTDIuNiA2LjA4YTEgMSAwIDAgMCAwIDEuODNsOC41OCAzLjkxYTIgMiAwIDAgMCAxLjY2IDBsOC41OC0zLjlhMSAxIDAgMCAwIDAtMS44M3oiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmExIDEgMCAwIDAgLjU4LjkxbDguNiAzLjkxYTIgMiAwIDAgMCAxLjY1IDBsOC41OC0zLjlBMSAxIDAgMCAwIDIyIDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTdhMSAxIDAgMCAwIC41OC45MWw4LjYgMy45MWEyIDIgMCAwIDAgMS42NSAwbDguNTgtMy45QTEgMSAwIDAgMCAyMiAxNyIgfV0KICAgIF07CiAgICB2YXIgTGF5ZXJzUGx1cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyLjgzIDIuMThhMiAyIDAgMCAwLTEuNjYgMEwyLjYgNi4wOGExIDEgMCAwIDAgMCAxLjgzbDguNTggMy45MWEyIDIgMCAwIDAgLjgzLjE4IDIgMiAwIDAgMCAuODMtLjE4bDguNTgtMy45YTEgMSAwIDAgMCAwLTEuODMxeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxN2g2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE0djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmExIDEgMCAwIDAgLjU4LjkxbDguNiAzLjkxYTIgMiAwIDAgMCAuODI1LjE3OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE3YTEgMSAwIDAgMCAuNTguOTFsOC42IDMuOTFhMiAyIDAgMCAwIDEuNjUgMGwyLjExNi0uOTYyIiB9XQogICAgXTsKICAgIHZhciBMYXlvdXREYXNoYm9hcmQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiOSIsIHg6ICIzIiwgeTogIjMiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNyIsIGhlaWdodDogIjUiLCB4OiAiMTQiLCB5OiAiMyIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiOSIsIHg6ICIxNCIsIHk6ICIxMiIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiNSIsIHg6ICIzIiwgeTogIjE2Iiwgcng6ICIxIiB9XQogICAgXTsKICAgIHZhciBMYXlvdXRHcmlkID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNyIsIGhlaWdodDogIjciLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjciLCBoZWlnaHQ6ICI3IiwgeDogIjE0IiwgeTogIjMiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNyIsIGhlaWdodDogIjciLCB4OiAiMTQiLCB5OiAiMTQiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNyIsIGhlaWdodDogIjciLCB4OiAiMyIsIHk6ICIxNCIsIHJ4OiAiMSIgfV0KICAgIF07CiAgICB2YXIgTGF5b3V0TGlzdCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjciLCBoZWlnaHQ6ICI3IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiNyIsIHg6ICIzIiwgeTogIjE0Iiwgcng6ICIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDRoNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA5aDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTVoNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAyMGg3IiB9XQogICAgXTsKICAgIHZhciBMYXlvdXRQYW5lbExlZnQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjciLCBoZWlnaHQ6ICI3IiwgeDogIjE0IiwgeTogIjMiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNyIsIGhlaWdodDogIjciLCB4OiAiMTQiLCB5OiAiMTQiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIExheW91dFBhbmVsVG9wID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICI3IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiNyIsIHg6ICIzIiwgeTogIjE0Iiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjciLCBoZWlnaHQ6ICI3IiwgeDogIjE0IiwgeTogIjE0Iiwgcng6ICIxIiB9XQogICAgXTsKICAgIHZhciBMYXlvdXRUZW1wbGF0ZSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiNyIsIHg6ICIzIiwgeTogIjMiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiOSIsIGhlaWdodDogIjciLCB4OiAiMyIsIHk6ICIxNCIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI1IiwgaGVpZ2h0OiAiNyIsIHg6ICIxNiIsIHk6ICIxNCIsIHJ4OiAiMSIgfV0KICAgIF07CiAgICB2YXIgTGVhZiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTEgMjBBNyA3IDAgMCAxIDkuOCA2LjFDMTUuNSA1IDE3IDQuNDggMTkgMmMxIDIgMiA0LjE4IDIgOCAwIDUuNS00Ljc4IDEwLTEwIDEwWiIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMWMwLTMgMS44NS01LjM2IDUuMDgtNkM5LjUgMTQuNTIgMTIgMTMgMTMgMTIiIH1dCiAgICBdOwogICAgdmFyIExlYWZ5R3JlZW4gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yIDIyYzEuMjUtLjk4NyAyLjI3LTEuOTc1IDMuOS0yLjJhNS41NiA1LjU2IDAgMCAxIDMuOCAxLjUgNCA0IDAgMCAwIDYuMTg3LTIuMzUzIDMuNSAzLjUgMCAwIDAgMy42OS01LjExNkEzLjUgMy41IDAgMCAwIDIwLjk1IDggMy41IDMuNSAwIDEgMCAxNiAzLjA1YTMuNSAzLjUgMCAwIDAtNS44MzEgMS4zNzMgMy41IDMuNSAwIDAgMC01LjExNiAzLjY5IDQgNCAwIDAgMC0yLjM0OCA2LjE1NUMzLjQ5OSAxNS40MiA0LjQwOSAxNi43MTIgNC4yIDE4LjEgMy45MjYgMTkuNzQzIDMuMDE0IDIwLjczMiAyIDIyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjIgMTcgNyIgfV0KICAgIF07CiAgICB2YXIgTGVjdGVybiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE2IDEyaDNhMiAyIDAgMCAwIDEuOTAyLTEuMzhsMS4wNTYtMy4zMzNBMSAxIDAgMCAwIDIxIDZIM2ExIDEgMCAwIDAtLjk1OCAxLjI4N2wxLjA1NiAzLjMzNEEyIDIgMCAwIDAgNSAxMmgzIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDZWM2ExIDEgMCAwIDAtMS0xaC0zIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICIxMiIsIHg6ICI4IiwgeTogIjEwIiwgcng6ICIxIiB9XQogICAgXTsKICAgIHZhciBMaWJyYXJ5QmlnID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDN2MTgiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAuNCAxOC45Yy4yLjUtLjEgMS4xLS42IDEuM2wtMS45LjdjLS41LjItMS4xLS4xLTEuMy0uNkwxMS4xIDUuMWMtLjItLjUuMS0xLjEuNi0xLjNsMS45LS43Yy41LS4yIDEuMS4xIDEuMy42WiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgTGlicmFyeTIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiA2IDQgMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnYxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDh2MTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA0djE2IiB9XQogICAgXTsKICAgIHZhciBMaWZlQnVveSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTQuOTMgNC45MyA0LjI0IDQuMjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuODMgOS4xNyA0LjI0LTQuMjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuODMgMTQuODMgNC4yNCA0LjI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkuMTcgMTQuODMtNC4yNCA0LjI0IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjQiIH1dCiAgICBdOwogICAgdmFyIExpZ2F0dXJlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTJoMnY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDIwaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxMmg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMjBoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIwVjhhNCA0IDAgMCAxIDcuNDY0LTIiIH1dCiAgICBdOwogICAgdmFyIExpZ2h0YnVsYk9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2LjggMTEuMmMuOC0uOSAxLjItMiAxLjItMy4yYTYgNiAwIDAgMC05LjMtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi4zIDYuM2E0LjY3IDQuNjcgMCAwIDAgMS4yIDUuMmMuNy43IDEuMyAxLjUgMS41IDIuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE4aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMjJoNCIgfV0KICAgIF07CiAgICB2YXIgTGlnaHRidWxiID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTUgMTRjLjItMSAuNy0xLjcgMS41LTIuNSAxLS45IDEuNS0yLjIgMS41LTMuNUE2IDYgMCAwIDAgNiA4YzAgMSAuMiAyLjIgMS41IDMuNS43LjcgMS4zIDEuNSAxLjUgMi41IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMThoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAyMmg0IiB9XQogICAgXTsKICAgIHZhciBMaW5lU3F1aWdnbGUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTcgMy41YzUtMiA3IDIuNSAzIDRDMS41IDEwIDIgMTUgNSAxNmM1IDIgOS0xMCAxNC03cy41IDEzLjUtNCAxMmMtNS0yLjUuNS0xMSA2LTIiIH0KICAgICAgXQogICAgXTsKICAgIHZhciBMaW5rMk9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTdIN0E1IDUgMCAwIDEgNyA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDdoMmE1IDUgMCAwIDEgNCA4IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjgiLCB4MjogIjEyIiwgeTE6ICIxMiIsIHkyOiAiMTIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMiIsIHgyOiAiMjIiLCB5MTogIjIiLCB5MjogIjIyIiB9XQogICAgXTsKICAgIHZhciBMaW5rID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTNhNSA1IDAgMCAwIDcuNTQuNTRsMy0zYTUgNSAwIDAgMC03LjA3LTcuMDdsLTEuNzIgMS43MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxMWE1IDUgMCAwIDAtNy41NC0uNTRsLTMgM2E1IDUgMCAwIDAgNy4wNyA3LjA3bDEuNzEtMS43MSIgfV0KICAgIF07CiAgICB2YXIgTGluazIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE3SDdBNSA1IDAgMCAxIDcgN2gyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDdoMmE1IDUgMCAxIDEgMCAxMGgtMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI4IiwgeDI6ICIxNiIsIHkxOiAiMTIiLCB5MjogIjEyIiB9XQogICAgXTsKICAgIHZhciBMaXN0Q2hlY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA1SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTJIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxOUgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDE4IDIgMiA0LTQiIH1dCiAgICBdOwogICAgdmFyIExpbmtlZGluID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgOGE2IDYgMCAwIDEgNiA2djdoLTR2LTdhMiAyIDAgMCAwLTItMiAyIDIgMCAwIDAtMiAydjdoLTR2LTdhNiA2IDAgMCAxIDYtNnoiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNCIsIGhlaWdodDogIjEyIiwgeDogIjIiLCB5OiAiOSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjQiLCBjeTogIjQiLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgTGlzdENoZWNrcyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDVoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDE5aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMyAxNyAyIDIgNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgNyAyIDIgNC00IiB9XQogICAgXTsKICAgIHZhciBMaXN0Q2hldnJvbnNEb3duVXAgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDVoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxOWg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDUgMyAzIDMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxOSAzLTMgMyAzIiB9XQogICAgXTsKICAgIHZhciBMaXN0Q2hldnJvbnNVcERvd24gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDVoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxOWg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDggMy0zIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxNiAzIDMgMy0zIiB9XQogICAgXTsKICAgIHZhciBMaXN0Q29sbGFwc2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA1aDExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEyaDExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE5aDExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgMTAgMy0zLTMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDIwIDMtMy0zLTMiIH1dCiAgICBdOwogICAgdmFyIExpc3RFbmQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA1SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTJIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE5SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTYtMyAzIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA1djEyYTIgMiAwIDAgMS0yIDJoLTYiIH1dCiAgICBdOwogICAgdmFyIExpc3RGaWx0ZXJQbHVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNUgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTJoMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxOWg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDVoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSA4VjIiIH1dCiAgICBdOwogICAgdmFyIExpc3RGaWx0ZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDVoMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxMmgxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE5aDYiIH1dCiAgICBdOwogICAgdmFyIExpc3RJbmRlbnREZWNyZWFzZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDVIMTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTJIMTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTlIMTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNyA4LTQgNCA0IDQiIH1dCiAgICBdOwogICAgdmFyIExpc3RJbmRlbnRJbmNyZWFzZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDVIMTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTJIMTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTlIMTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMyA4IDQgNC00IDQiIH1dCiAgICBdOwogICAgdmFyIExpc3RNaW51cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDVIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxMkgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE5SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTJoLTYiIH1dCiAgICBdOwogICAgdmFyIExpc3RNdXNpYyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDVIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxMkgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDE5SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTZWNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICIxNiIsIHI6ICIzIiB9XQogICAgXTsKICAgIHZhciBMaXN0UGx1cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDVIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxMkgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE5SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggOXY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEyaC02IiB9XQogICAgXTsKICAgIHZhciBMaXN0UmVzdGFydCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDVIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEySDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxOUgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4YTUgNSAwIDAgMCA5LTMgNC41IDQuNSAwIDAgMC00LjUtNC41Yy0xLjMzIDAtMi41NC41NC0zLjQxIDEuNDFMMTEgMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTB2NGg0IiB9XQogICAgXTsKICAgIHZhciBMaXN0T3JkZXJlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDVoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTJoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTloMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA0aDF2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDloMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjUgMjBIMy40YzAtMSAyLjYtMS45MjUgMi42LTMuNWExLjUgMS41IDAgMCAwLTIuNi0xLjAyIiB9XQogICAgXTsKICAgIHZhciBMaXN0U3RhcnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDVoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyaDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTloMTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgOC0zLTMgMy0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE5VjdhMiAyIDAgMCAwLTItMmgtNiIgfV0KICAgIF07CiAgICB2YXIgTGlzdFRvZG8gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyA1aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMTJoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxOWg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgMTcgMiAyIDQtNCIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjMiLCB5OiAiNCIsIHdpZHRoOiAiNiIsIGhlaWdodDogIjYiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIExpc3RUcmVlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA1aDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDEyaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMTloOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEwYTIgMiAwIDAgMCAyIDJoMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDV2MTJhMiAyIDAgMCAwIDIgMmgzIiB9XQogICAgXTsKICAgIHZhciBMaXN0VmlkZW8gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA1SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTJIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxOUgzIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE1IDEyLjAwM2ExIDEgMCAwIDEgMS41MTctLjg1OWw0Ljk5NyAyLjk5N2ExIDEgMCAwIDEgMCAxLjcxOGwtNC45OTcgMi45OTdhMSAxIDAgMCAxLTEuNTE3LS44NnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIExpc3RYID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNUgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDEySDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTlIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNS41IDkuNSA1IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAuNSA5LjUtNSA1IiB9XQogICAgXTsKICAgIHZhciBMaXN0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA1aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE5aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDVoMTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmgxMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE5aDEzIiB9XQogICAgXTsKICAgIHZhciBMb2FkZXJDaXJjbGUgPSBbWyJwYXRoIiwgeyBkOiAiTTIxIDEyYTkgOSAwIDEgMS02LjIxOS04LjU2IiB9XV07CiAgICB2YXIgTG9hZGVyUGlud2hlZWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxMmExIDEgMCAwIDEtMTAgMCAxIDEgMCAwIDAtMTAgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIwLjdhMSAxIDAgMSAxIDUtOC43IDEgMSAwIDEgMCA1LTguNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDMuM2ExIDEgMCAxIDEgNSA4LjYgMSAxIDAgMSAwIDUgOC42IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XQogICAgXTsKICAgIHZhciBMb2FkZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYuMiA3LjggMi45LTIuOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMmg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2LjIgMTYuMiAyLjkgMi45IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNC45IDE5LjEgMi45LTIuOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEyaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNC45IDQuOSAyLjkgMi45IiB9XQogICAgXTsKICAgIHZhciBMb2NhdGVGaXhlZCA9IFsKICAgICAgWyJsaW5lIiwgeyB4MTogIjIiLCB4MjogIjUiLCB5MTogIjEyIiwgeTI6ICIxMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxOSIsIHgyOiAiMjIiLCB5MTogIjEyIiwgeTI6ICIxMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTIiLCB5MTogIjIiLCB5MjogIjUiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICIxOSIsIHkyOiAiMjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiNyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIzIiB9XQogICAgXTsKICAgIHZhciBMb2NhdGVPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOXYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOC44OSAxMy4yNGE3IDcgMCAwIDAtOC4xMy04LjEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDEyaDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03LjA1IDcuMDVhNyA3IDAgMCAwIDkuOSA5LjkiIH1dCiAgICBdOwogICAgdmFyIExvY2tLZXlob2xlT3BlbiA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjE2IiwgcjogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxMiIsIHg6ICIzIiwgeTogIjEwIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTBWN2E1IDUgMCAwIDEgOS4zMy0yLjUiIH1dCiAgICBdOwogICAgdmFyIExvY2F0ZSA9IFsKICAgICAgWyJsaW5lIiwgeyB4MTogIjIiLCB4MjogIjUiLCB5MTogIjEyIiwgeTI6ICIxMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxOSIsIHgyOiAiMjIiLCB5MTogIjEyIiwgeTI6ICIxMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTIiLCB5MTogIjIiLCB5MjogIjUiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICIxOSIsIHkyOiAiMjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiNyIgfV0KICAgIF07CiAgICB2YXIgTG9ja0tleWhvbGUgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxNiIsIHI6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICIxMCIsIHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxMiIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEwVjdhNSA1IDAgMCAxIDEwIDB2MyIgfV0KICAgIF07CiAgICB2YXIgTG9ja09wZW4gPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjExIiwgeDogIjMiLCB5OiAiMTEiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMVY3YTUgNSAwIDAgMSA5LjktMSIgfV0KICAgIF07CiAgICB2YXIgTG9jayA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTEiLCB4OiAiMyIsIHk6ICIxMSIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDExVjdhNSA1IDAgMCAxIDEwIDB2NCIgfV0KICAgIF07CiAgICB2YXIgTG9nSW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCAxNyA1LTUtNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEySDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgM2g0YTIgMiAwIDAgMSAyIDJ2MTRhMiAyIDAgMCAxLTIgMmgtNCIgfV0KICAgIF07CiAgICB2YXIgTG9nT3V0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTcgNS01LTUtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMkg5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMjFINWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmg0IiB9XQogICAgXTsKICAgIHZhciBMb2dzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA1aDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTloMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDVoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEyaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxOWgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDVoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDE5aDgiIH1dCiAgICBdOwogICAgdmFyIExvbGxpcG9wID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMSIsIGN5OiAiMTEiLCByOiAiOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAyMS00LjMtNC4zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDExYTIgMiAwIDAgMCA0IDAgNCA0IDAgMCAwLTggMCA2IDYgMCAwIDAgMTIgMCIgfV0KICAgIF07CiAgICB2YXIgTHVnZ2FnZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMjBhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoMTJhMiAyIDAgMCAxIDIgMnYxMGEyIDIgMCAwIDEtMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMThWNGEyIDIgMCAwIDEgMi0yaDRhMiAyIDAgMCAxIDIgMnYxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAyMGg0IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYiLCBjeTogIjIwIiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI4IiwgY3k6ICIyMCIsIHI6ICIyIiB9XQogICAgXTsKICAgIHZhciBNYWlsQ2hlY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxM1Y2YTIgMiAwIDAgMC0yLTJINGEyIDIgMCAwIDAtMiAydjEyYzAgMS4xLjkgMiAyIDJoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiA3LTguOTcgNS43YTEuOTQgMS45NCAwIDAgMS0yLjA2IDBMMiA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDE5IDIgMiA0LTQiIH1dCiAgICBdOwogICAgdmFyIE1hZ25ldCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDE1IDQgNCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yLjM1MiAxMC42NDhhMS4yMDUgMS4yMDUgMCAwIDAgMCAxLjcwNGwyLjI5NiAyLjI5NmExLjIwNSAxLjIwNSAwIDAgMCAxLjcwNCAwbDYuMDI5LTYuMDI5YTEgMSAwIDEgMSAzIDNsLTYuMDI5IDYuMDI5YTEuMjA1IDEuMjA1IDAgMCAwIDAgMS43MDRsMi4yOTYgMi4yOTZhMS4yMDUgMS4yMDUgMCAwIDAgMS43MDQgMGw2LjM2NS02LjM2N0ExIDEgMCAwIDAgOC43MTYgNC4yODJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTUgOCA0IDQiIH1dCiAgICBdOwogICAgdmFyIE1haWxNaW51cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE1VjZhMiAyIDAgMCAwLTItMkg0YTIgMiAwIDAgMC0yIDJ2MTJjMCAxLjEuOSAyIDIgMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDctOC45NyA1LjdhMS45NCAxLjk0IDAgMCAxLTIuMDYgMEwyIDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTloNiIgfV0KICAgIF07CiAgICB2YXIgTWFpbE9wZW4gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMS4yIDguNGMuNS4zOC44Ljk3LjggMS42djEwYTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjEwYTIgMiAwIDAgMSAuOC0xLjZsOC02YTIgMiAwIDAgMSAyLjQgMGw4IDZaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDEwLTguOTcgNS43YTEuOTQgMS45NCAwIDAgMS0yLjA2IDBMMiAxMCIgfV0KICAgIF07CiAgICB2YXIgTWFpbFBsdXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxM1Y2YTIgMiAwIDAgMC0yLTJINGEyIDIgMCAwIDAtMiAydjEyYzAgMS4xLjkgMiAyIDJoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiA3LTguOTcgNS43YTEuOTQgMS45NCAwIDAgMS0yLjA2IDBMMiA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE2djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTloNiIgfV0KICAgIF07CiAgICB2YXIgTWFpbFF1ZXN0aW9uTWFyayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDEwLjVWNmEyIDIgMCAwIDAtMi0ySDRhMiAyIDAgMCAwLTIgMnYxMmMwIDEuMS45IDIgMiAyaDEyLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgNy04Ljk3IDUuN2ExLjk0IDEuOTQgMCAwIDEtMi4wNiAwTDIgNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxNS4yOGMuMi0uNC41LS44LjktMWEyLjEgMi4xIDAgMCAxIDIuNi40Yy4zLjQuNS44LjUgMS4zIDAgMS4zLTIgMi0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMjJ2LjAxIiB9XQogICAgXTsKICAgIHZhciBNYWlsU2VhcmNoID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTIuNVY2YTIgMiAwIDAgMC0yLTJINGEyIDIgMCAwIDAtMiAydjEyYzAgMS4xLjkgMiAyIDJoNy41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDctOC45NyA1LjdhMS45NCAxLjk0IDAgMCAxLTIuMDYgMEwyIDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMjFhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2WiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICIxOCIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDIyLTEuNS0xLjUiIH1dCiAgICBdOwogICAgdmFyIE1haWxXYXJuaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTAuNVY2YTIgMiAwIDAgMC0yLTJINGEyIDIgMCAwIDAtMiAydjEyYzAgMS4xLjkgMiAyIDJoMTIuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiA3LTguOTcgNS43YTEuOTQgMS45NCAwIDAgMS0yLjA2IDBMMiA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE0djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMjJ2LjAxIiB9XQogICAgXTsKICAgIHZhciBNYWlsWCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDEzVjZhMiAyIDAgMCAwLTItMkg0YTIgMiAwIDAgMC0yIDJ2MTJjMCAxLjEuOSAyIDIgMmg5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDctOC45NyA1LjdhMS45NCAxLjk0IDAgMCAxLTIuMDYgMEwyIDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMTcgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDE3LTQgNCIgfV0KICAgIF07CiAgICB2YXIgTWFpbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDctOC45OTEgNS43MjdhMiAyIDAgMCAxLTIuMDA5IDBMMiA3IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMiIsIHk6ICI0Iiwgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE2Iiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBNYWlscyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDE5YTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0ydi04YTIgMiAwIDAgMSAxLTEuNzMyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDUuNS02LjQxOSA0LjE3OWEyIDIgMCAwIDEtMi4xNjIgMEw3IDUuNSIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjciLCB5OiAiMyIsIHdpZHRoOiAiMTUiLCBoZWlnaHQ6ICIxMiIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgTWFpbGJveCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE3YTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjkuNUMyIDcgNCA1IDYuNSA1SDE4YzIuMiAwIDQgMS44IDQgNHY4WiIgfV0sCiAgICAgIFsicG9seWxpbmUiLCB7IHBvaW50czogIjE1LDkgMTgsOSAxOCwxMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjUgNUM5IDUgMTEgNyAxMSA5LjVWMTdhMiAyIDAgMCAxLTIgMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI2IiwgeDI6ICI3IiwgeTE6ICIxMCIsIHkyOiAiMTAiIH1dCiAgICBdOwogICAgdmFyIE1hcE1pbnVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTEgMTktMS4xMDYtLjU1MmEyIDIgMCAwIDAtMS43ODggMGwtMy42NTkgMS44M0ExIDEgMCAwIDEgMyAxOS4zODFWNi42MThhMSAxIDAgMCAxIC41NTMtLjg5NGw0LjU1My0yLjI3N2EyIDIgMCAwIDEgMS43ODggMGw0LjIxMiAyLjEwNmEyIDIgMCAwIDAgMS43ODggMGwzLjY1OS0xLjgzQTEgMSAwIDAgMSAyMSA0LjYxOVYxNCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA1Ljc2NFYxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxOGgtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDMuMjM2djE1IiB9XQogICAgXTsKICAgIHZhciBNYXBQaW5DaGVja0luc2lkZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDEwYzAgNC45OTMtNS41MzkgMTAuMTkzLTcuMzk5IDExLjc5OWExIDEgMCAwIDEtMS4yMDIgMEM5LjUzOSAyMC4xOTMgNCAxNC45OTMgNCAxMGE4IDggMCAwIDEgMTYgMCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDEwIDIgMiA0LTQiIH1dCiAgICBdOwogICAgdmFyIE1hcFBpbkNoZWNrID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTkuNDMgMTIuOTM1Yy4zNTctLjk2Ny41Ny0xLjk1NS41Ny0yLjkzNWE4IDggMCAwIDAtMTYgMGMwIDQuOTkzIDUuNTM5IDEwLjE5MyA3LjM5OSAxMS43OTlhMSAxIDAgMCAwIDEuMjAyIDAgMzIuMTk3IDMyLjE5NyAwIDAgMCAuODEzLS43MjgiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTAiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAxOCAyIDIgNC00IiB9XQogICAgXTsKICAgIHZhciBNYXBQaW5Ib3VzZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE1IDIyYTEgMSAwIDAgMS0xLTF2LTRhMSAxIDAgMCAxIC40NDUtLjgzMmwzLTJhMSAxIDAgMCAxIDEuMTEgMGwzIDJBMSAxIDAgMCAxIDIyIDE3djRhMSAxIDAgMCAxLTEgMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTBhOCA4IDAgMCAwLTE2IDBjMCA0Ljk5MyA1LjUzOSAxMC4xOTMgNy4zOTkgMTEuNzk5YTEgMSAwIDAgMCAuNjAxLjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMjJ2LTMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMCIsIGN5OiAiMTAiLCByOiAiMyIgfV0KICAgIF07CiAgICB2YXIgTWFwUGluTWludXNJbnNpZGUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAxMGMwIDQuOTkzLTUuNTM5IDEwLjE5My03LjM5OSAxMS43OTlhMSAxIDAgMCAxLTEuMjAyIDBDOS41MzkgMjAuMTkzIDQgMTQuOTkzIDQgMTBhOCA4IDAgMCAxIDE2IDAiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMGg2IiB9XQogICAgXTsKICAgIHZhciBNYXBQaW5NaW51cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE4Ljk3NyAxNEMxOS42IDEyLjcwMSAyMCAxMS4zNDMgMjAgMTBhOCA4IDAgMCAwLTE2IDBjMCA0Ljk5MyA1LjUzOSAxMC4xOTMgNy4zOTkgMTEuNzk5YTEgMSAwIDAgMCAxLjIwMiAwIDMyIDMyIDAgMCAwIC44MjQtLjczOCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMCIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE4aDYiIH1dCiAgICBdOwogICAgdmFyIE1hcFBpbk9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyLjc1IDcuMDlhMyAzIDAgMCAxIDIuMTYgMi4xNiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNy4wNzIgMTcuMDcyYy0xLjYzNCAyLjE3LTMuNTI3IDMuOTEyLTQuNDcxIDQuNzI3YTEgMSAwIDAgMS0xLjIwMiAwQzkuNTM5IDIwLjE5MyA0IDE0Ljk5MyA0IDEwYTggOCAwIDAgMSAxLjQzMi00LjU2OCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC40NzUgMi44MThBOCA4IDAgMCAxIDIwIDEwYzAgMS4xODMtLjMxIDIuMzc3LS44MSAzLjUzMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjEzIDkuMTNhMyAzIDAgMCAwIDMuNzQgMy43NCIgfV0KICAgIF07CiAgICB2YXIgTWFwUGluUGVuID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuOTcgOS4zMDRBOCA4IDAgMCAwIDIgMTBjMCA0LjY5IDQuODg3IDkuNTYyIDcuMDIyIDExLjQ2OCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMS4zNzggMTYuNjI2YTEgMSAwIDAgMC0zLjAwNC0zLjAwNGwtNC4wMSA0LjAxMmEyIDIgMCAwIDAtLjUwNi44NTRsLS44MzcgMi44N2EuNS41IDAgMCAwIC42Mi42MmwyLjg3LS44MzdhMiAyIDAgMCAwIC44NTQtLjUwNnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMCIsIGN5OiAiMTAiLCByOiAiMyIgfV0KICAgIF07CiAgICB2YXIgTWFwUGluUGx1c0luc2lkZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDEwYzAgNC45OTMtNS41MzkgMTAuMTkzLTcuMzk5IDExLjc5OWExIDEgMCAwIDEtMS4yMDIgMEM5LjUzOSAyMC4xOTMgNCAxNC45OTMgNCAxMGE4IDggMCAwIDEgMTYgMCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA3djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMGg2IiB9XQogICAgXTsKICAgIHZhciBNYXBQaW5QbHVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTkuOTE0IDExLjEwNUE3LjI5OCA3LjI5OCAwIDAgMCAyMCAxMGE4IDggMCAwIDAtMTYgMGMwIDQuOTkzIDUuNTM5IDEwLjE5MyA3LjM5OSAxMS43OTlhMSAxIDAgMCAwIDEuMjAyIDAgMzIgMzIgMCAwIDAgLjgyNC0uNzM4IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEwIiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMThoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxNXY2IiB9XQogICAgXTsKICAgIHZhciBNYXBQaW5YSW5zaWRlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMTBjMCA0Ljk5My01LjUzOSAxMC4xOTMtNy4zOTkgMTEuNzk5YTEgMSAwIDAgMS0xLjIwMiAwQzkuNTM5IDIwLjE5MyA0IDE0Ljk5MyA0IDEwYTggOCAwIDAgMSAxNiAwIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0LjUgNy41LTUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05LjUgNy41IDUgNSIgfV0KICAgIF07CiAgICB2YXIgTWFwUGluWCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE5Ljc1MiAxMS45MDFBNy43OCA3Ljc4IDAgMCAwIDIwIDEwYTggOCAwIDAgMC0xNiAwYzAgNC45OTMgNS41MzkgMTAuMTkzIDcuMzk5IDExLjc5OWExIDEgMCAwIDAgMS4yMDIgMCAxOSAxOSAwIDAgMCAuMDktLjA3NyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMCIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxLjUgMTUuNS01IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEuNSAyMC41LTUtNSIgfV0KICAgIF07CiAgICB2YXIgTWFwUGluID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMTBjMCA0Ljk5My01LjUzOSAxMC4xOTMtNy4zOTkgMTEuNzk5YTEgMSAwIDAgMS0xLjIwMiAwQzkuNTM5IDIwLjE5MyA0IDE0Ljk5MyA0IDEwYTggOCAwIDAgMSAxNiAwIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEwIiwgcjogIjMiIH1dCiAgICBdOwogICAgdmFyIE1hcFBpbm5lZCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE4IDhjMCAzLjYxMy0zLjg2OSA3LjQyOS01LjM5MyA4Ljc5NWExIDEgMCAwIDEtMS4yMTQgMEM5Ljg3IDE1LjQyOSA2IDExLjYxMyA2IDhhNiA2IDAgMCAxIDEyIDAiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiOCIsIHI6ICIyIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTguNzE0IDE0aC0zLjcxYTEgMSAwIDAgMC0uOTQ4LjY4M2wtMi4wMDQgNkExIDEgMCAwIDAgMyAyMmgxOGExIDEgMCAwIDAgLjk0OC0xLjMxNmwtMi02YTEgMSAwIDAgMC0uOTQ5LS42ODRoLTMuNzEyIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBNYXBQbHVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTEgMTktMS4xMDYtLjU1MmEyIDIgMCAwIDAtMS43ODggMGwtMy42NTkgMS44M0ExIDEgMCAwIDEgMyAxOS4zODFWNi42MThhMSAxIDAgMCAxIC41NTMtLjg5NGw0LjU1My0yLjI3N2EyIDIgMCAwIDEgMS43ODggMGw0LjIxMiAyLjEwNmEyIDIgMCAwIDAgMS43ODggMGwzLjY1OS0xLjgzQTEgMSAwIDAgMSAyMSA0LjYxOVYxMiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA1Ljc2NFYxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxNXY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE4aC02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMy4yMzZ2MTUiIH1dCiAgICBdOwogICAgdmFyIE1hcDIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNC4xMDYgNS41NTNhMiAyIDAgMCAwIDEuNzg4IDBsMy42NTktMS44M0ExIDEgMCAwIDEgMjEgNC42MTl2MTIuNzY0YTEgMSAwIDAgMS0uNTUzLjg5NGwtNC41NTMgMi4yNzdhMiAyIDAgMCAxLTEuNzg4IDBsLTQuMjEyLTIuMTA2YTIgMiAwIDAgMC0xLjc4OCAwbC0zLjY1OSAxLjgzQTEgMSAwIDAgMSAzIDE5LjM4MVY2LjYxOGExIDEgMCAwIDEgLjU1My0uODk0bDQuNTUzLTIuMjc3YTIgMiAwIDAgMSAxLjc4OCAweiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA1Ljc2NHYxNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDMuMjM2djE1IiB9XQogICAgXTsKICAgIHZhciBNYXJzU3Ryb2tlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgNiA0IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgM2g0djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMy03Ljc1IDcuNzUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICIxNSIsIHI6ICI2IiB9XQogICAgXTsKICAgIHZhciBNYXJzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgM2g1djUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMy02Ljc1IDYuNzUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMCIsIGN5OiAiMTQiLCByOiAiNiIgfV0KICAgIF07CiAgICB2YXIgTWFydGluaSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjJoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMXYxMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOSAzLTcgOC03LThaIiB9XQogICAgXTsKICAgIHZhciBNYXhpbWl6ZTIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAzaDZ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAzLTcgNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDIxIDctNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDIxSDN2LTYiIH1dCiAgICBdOwogICAgdmFyIE1heGltaXplID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAzSDVhMiAyIDAgMCAwLTIgMnYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDhWNWEyIDIgMCAwIDAtMi0yaC0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTZ2M2EyIDIgMCAwIDAgMiAyaDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMjFoM2EyIDIgMCAwIDAgMi0ydi0zIiB9XQogICAgXTsKICAgIHZhciBNZWRhbCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTcuMjEgMTUgMi42NiA3LjE0YTIgMiAwIDAgMSAuMTMtMi4yTDQuNCAyLjhBMiAyIDAgMCAxIDYgMmgxMmEyIDIgMCAwIDEgMS42LjhsMS42IDIuMTRhMiAyIDAgMCAxIC4xNCAyLjJMMTYuNzkgMTUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTIgNS4xMiAyLjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMgMTIgNS44OC05LjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA3aDgiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTciLCByOiAiNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOHYtMmgtLjUiIH1dCiAgICBdOwogICAgdmFyIE1lZ2FwaG9uZU9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExLjYzNiA2QTEzIDEzIDAgMCAwIDE5LjQgMy4yIDEgMSAwIDAgMSAyMSA0djExLjM0NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNC4zNzggMTQuMzU3QTEzIDEzIDAgMCAwIDExIDE0SDVhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxNGExMiAxMiAwIDAgMCAyLjQgNy4yIDIgMiAwIDAgMCAzLjItMi40QTggOCAwIDAgMSAxMCAxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDh2NiIgfV0KICAgIF07CiAgICB2YXIgTWVnYXBob25lID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEgNmExMyAxMyAwIDAgMCA4LjQtMi44QTEgMSAwIDAgMSAyMSA0djEyYTEgMSAwIDAgMS0xLjYuOEExMyAxMyAwIDAgMCAxMSAxNEg1YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE0YTEyIDEyIDAgMCAwIDIuNCA3LjIgMiAyIDAgMCAwIDMuMi0yLjRBOCA4IDAgMCAxIDEwIDE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggNnY4IiB9XQogICAgXTsKICAgIHZhciBNZWggPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI4IiwgeDI6ICIxNiIsIHkxOiAiMTUiLCB5MjogIjE1IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjkiLCB4MjogIjkuMDEiLCB5MTogIjkiLCB5MjogIjkiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTUiLCB4MjogIjE1LjAxIiwgeTE6ICI5IiwgeTI6ICI5IiB9XQogICAgXTsKICAgIHZhciBNZW1vcnlTdGljayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEydi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4di0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEydi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE4di0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTFoMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE4di0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwLjUgMTFIMjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxOHYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEydi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTh2LTIiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjYiLCB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTAiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIE1lbnUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDVoMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMmgxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE5aDE2IiB9XQogICAgXTsKICAgIHZhciBNZXJnZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTggNiA0LTQgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MTAuM2E0IDQgMCAwIDEtMS4xNzIgMi44NzJMNCAyMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMCAyMi01LTUiIH1dCiAgICBdOwogICAgdmFyIE1lc3NhZ2VDaXJjbGVDb2RlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgOS0zIDMgMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDE1IDMtMy0zLTMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMi45OTIgMTYuMzQyYTIgMiAwIDAgMSAuMDk0IDEuMTY3bC0xLjA2NSAzLjI5YTEgMSAwIDAgMCAxLjIzNiAxLjE2OGwzLjQxMy0uOTk4YTIgMiAwIDAgMSAxLjA5OS4wOTIgMTAgMTAgMCAxIDAtNC43NzctNC43MTkiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIE1lc3NhZ2VDaXJjbGVEYXNoZWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC4xIDIuMTgyYTEwIDEwIDAgMCAxIDMuOCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjkgMjEuODE4YTEwIDEwIDAgMCAxLTMuOCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjYwOSAzLjcyYTEwIDEwIDAgMCAxIDIuNjkgMi43IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIuMTgyIDEzLjlhMTAgMTAgMCAwIDEgMC0zLjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAuMjggMTcuNjFhMTAgMTAgMCAwIDEtMi43IDIuNjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEuODE4IDEwLjFhMTAgMTAgMCAwIDEgMCAzLjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy43MjEgNi4zOTFhMTAgMTAgMCAwIDEgMi43LTIuNjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNi4xNjMgMjEuMTE3LTIuOTA2Ljg1YTEgMSAwIDAgMS0xLjIzNi0xLjE2OWwuOTY1LTIuOTgiIH1dCiAgICBdOwogICAgdmFyIE1lc3NhZ2VDaXJjbGVIZWFydCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuOTkyIDE2LjM0MmEyIDIgMCAwIDEgLjA5NCAxLjE2N2wtMS4wNjUgMy4yOWExIDEgMCAwIDAgMS4yMzYgMS4xNjhsMy40MTMtLjk5OGEyIDIgMCAwIDEgMS4wOTkuMDkyIDEwIDEwIDAgMSAwLTQuNzc3LTQuNzE5IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTcuODI4IDEzLjA3QTMgMyAwIDAgMSAxMiA4Ljc2NGEzIDMgMCAwIDEgNS4wMDQgMi4yMjQgMyAzIDAgMCAxLS44MzIgMi4wODNsLTMuNDQ3IDMuNjJhMSAxIDAgMCAxLTEuNDUtLjAwMXoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIE1lc3NhZ2VDaXJjbGVPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNC45MyA0LjkyOWExMCAxMCAwIDAgMC0xLjkzOCAxMS40MTIgMiAyIDAgMCAxIC4wOTQgMS4xNjdsLTEuMDY1IDMuMjlhMSAxIDAgMCAwIDEuMjM2IDEuMTY4bDMuNDEzLS45OThhMiAyIDAgMCAxIDEuMDk5LjA5MiAxMCAxMCAwIDAgMCAxMS4zMDItMS45ODkiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC4zNSAyLjY5QTEwIDEwIDAgMCAxIDIxLjMgMTUuNjUiIH1dCiAgICBdOwogICAgdmFyIE1lc3NhZ2VDaXJjbGVNb3JlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMi45OTIgMTYuMzQyYTIgMiAwIDAgMSAuMDk0IDEuMTY3bC0xLjA2NSAzLjI5YTEgMSAwIDAgMCAxLjIzNiAxLjE2OGwzLjQxMy0uOTk4YTIgMiAwIDAgMSAxLjA5OS4wOTIgMTAgMTAgMCAxIDAtNC43NzctNC43MTkiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEyaC4wMSIgfV0KICAgIF07CiAgICB2YXIgTWVzc2FnZUNpcmNsZVBsdXMgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yLjk5MiAxNi4zNDJhMiAyIDAgMCAxIC4wOTQgMS4xNjdsLTEuMDY1IDMuMjlhMSAxIDAgMCAwIDEuMjM2IDEuMTY4bDMuNDEzLS45OThhMiAyIDAgMCAxIDEuMDk5LjA5MiAxMCAxMCAwIDEgMC00Ljc3Ny00LjcxOSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEyaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOHY4IiB9XQogICAgXTsKICAgIHZhciBNZXNzYWdlQ2lyY2xlUXVlc3Rpb25NYXJrID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMi45OTIgMTYuMzQyYTIgMiAwIDAgMSAuMDk0IDEuMTY3bC0xLjA2NSAzLjI5YTEgMSAwIDAgMCAxLjIzNiAxLjE2OGwzLjQxMy0uOTk4YTIgMiAwIDAgMSAxLjA5OS4wOTIgMTAgMTAgMCAxIDAtNC43NzctNC43MTkiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS4wOSA5YTMgMyAwIDAgMSA1LjgzIDFjMCAyLTMgMy0zIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTdoLjAxIiB9XQogICAgXTsKICAgIHZhciBNZXNzYWdlQ2lyY2xlUmVwbHkgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yLjk5MiAxNi4zNDJhMiAyIDAgMCAxIC4wOTQgMS4xNjdsLTEuMDY1IDMuMjlhMSAxIDAgMCAwIDEuMjM2IDEuMTY4bDMuNDEzLS45OThhMiAyIDAgMCAxIDEuMDk5LjA5MiAxMCAxMCAwIDEgMC00Ljc3Ny00LjcxOSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCAxNS0zLTMgMy0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTJoOGEyIDIgMCAwIDEgMiAydjEiIH1dCiAgICBdOwogICAgdmFyIE1lc3NhZ2VDaXJjbGVXYXJuaW5nID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMi45OTIgMTYuMzQyYTIgMiAwIDAgMSAuMDk0IDEuMTY3bC0xLjA2NSAzLjI5YTEgMSAwIDAgMCAxLjIzNiAxLjE2OGwzLjQxMy0uOTk4YTIgMiAwIDAgMSAxLjA5OS4wOTIgMTAgMTAgMCAxIDAtNC43NzctNC43MTkiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOHY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE2aC4wMSIgfV0KICAgIF07CiAgICB2YXIgTWVzc2FnZUNpcmNsZVggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yLjk5MiAxNi4zNDJhMiAyIDAgMCAxIC4wOTQgMS4xNjdsLTEuMDY1IDMuMjlhMSAxIDAgMCAwIDEuMjM2IDEuMTY4bDMuNDEzLS45OThhMiAyIDAgMCAxIDEuMDk5LjA5MiAxMCAxMCAwIDEgMC00Ljc3Ny00LjcxOSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA5LTYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDkgNiA2IiB9XQogICAgXTsKICAgIHZhciBNZXNzYWdlQ2lyY2xlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMi45OTIgMTYuMzQyYTIgMiAwIDAgMSAuMDk0IDEuMTY3bC0xLjA2NSAzLjI5YTEgMSAwIDAgMCAxLjIzNiAxLjE2OGwzLjQxMy0uOTk4YTIgMiAwIDAgMSAxLjA5OS4wOTIgMTAgMTAgMCAxIDAtNC43NzctNC43MTkiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIE1lc3NhZ2VTcXVhcmVDb2RlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjIgMTdhMiAyIDAgMCAxLTIgMkg2LjgyOGEyIDIgMCAwIDAtMS40MTQuNTg2bC0yLjIwMiAyLjIwMkEuNzEuNzEgMCAwIDEgMiAyMS4yODZWNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEwIDgtMyAzIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAxNCAzLTMtMy0zIiB9XQogICAgXTsKICAgIHZhciBNZXNzYWdlU3F1YXJlRGFzaGVkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgM2gyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE5aC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJ2LTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxNnY1LjI4NmEuNzEuNzEgMCAwIDAgMS4yMTIuNTAybDEuMTQ5LTEuMTQ5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE5YTIgMiAwIDAgMCAyLTJ2LTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTB2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiA2VjVhMiAyIDAgMCAwLTItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDNhMiAyIDAgMCAwLTIgMnYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTloMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDNoMiIgfV0KICAgIF07CiAgICB2YXIgTWVzc2FnZVNxdWFyZURpZmYgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMiAxN2EyIDIgMCAwIDEtMiAySDYuODI4YTIgMiAwIDAgMC0xLjQxNC41ODZsLTIuMjAyIDIuMjAyQS43MS43MSAwIDAgMSAyIDIxLjI4NlY1YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTVoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA5aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgN3Y0IiB9XQogICAgXTsKICAgIHZhciBNZXNzYWdlU3F1YXJlRG90ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTIuNyAzSDRhMiAyIDAgMCAwLTIgMnYxNi4yODZhLjcxLjcxIDAgMCAwIDEuMjEyLjUwMmwyLjIwMi0yLjIwMkEyIDIgMCAwIDEgNi44MjggMTlIMjBhMiAyIDAgMCAwIDItMnYtNC43IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTkiLCBjeTogIjYiLCByOiAiMyIgfV0KICAgIF07CiAgICB2YXIgTWVzc2FnZVNxdWFyZUhlYXJ0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjIgMTdhMiAyIDAgMCAxLTIgMkg2LjgyOGEyIDIgMCAwIDAtMS40MTQuNTg2bC0yLjIwMiAyLjIwMkEuNzEuNzEgMCAwIDEgMiAyMS4yODZWNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTcuNSA5LjVjMCAuNjg3LjI2NSAxLjM4My42OTcgMS44NDRsMy4wMDkgMy4yNjRhMS4xNCAxLjE0IDAgMCAwIC40MDcuMzE0IDEgMSAwIDAgMCAuNzgzLS4wMDQgMS4xNCAxLjE0IDAgMCAwIC4zOTgtLjMxbDMuMDA4LTMuMjY0QTIuNzcgMi43NyAwIDAgMCAxNi41IDkuNSAyLjUgMi41IDAgMCAwIDEyIDhhMi41IDIuNSAwIDAgMC00LjUgMS41IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBNZXNzYWdlU3F1YXJlTG9jayA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIyIDguNVY1YTIgMiAwIDAgMC0yLTJINGEyIDIgMCAwIDAtMiAydjE2LjI4NmEuNzEuNzEgMCAwIDAgMS4yMTIuNTAybDIuMjAyLTIuMjAyQTIgMiAwIDAgMSA2LjgyOCAxOUgxMCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxNXYtMmEyIDIgMCAwIDAtNCAwdjIiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIxNCIsIHk6ICIxNSIsIHdpZHRoOiAiOCIsIGhlaWdodDogIjUiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIE1lc3NhZ2VTcXVhcmVNb3JlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjIgMTdhMiAyIDAgMCAxLTIgMkg2LjgyOGEyIDIgMCAwIDAtMS40MTQuNTg2bC0yLjIwMiAyLjIwMkEuNzEuNzEgMCAwIDEgMiAyMS4yODZWNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDExaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMWguMDEiIH1dCiAgICBdOwogICAgdmFyIE1lc3NhZ2VTcXVhcmVPZmYgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOSAxOUg2LjgyOGEyIDIgMCAwIDAtMS40MTQuNTg2bC0yLjIwMiAyLjIwMkEuNy43IDAgMCAxIDIgMjEuMjg2VjVhMiAyIDAgMCAxIDEuMTg0LTEuODI2IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjY1NiAzSDIwYTIgMiAwIDAgMSAyIDJ2MTEuMzQ0IiB9XQogICAgXTsKICAgIHZhciBNZXNzYWdlU3F1YXJlUGx1cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIyIDE3YTIgMiAwIDAgMS0yIDJINi44MjhhMiAyIDAgMCAwLTEuNDE0LjU4NmwtMi4yMDIgMi4yMDJBLjcxLjcxIDAgMCAxIDIgMjEuMjg2VjVhMiAyIDAgMCAxIDItMmgxNmEyIDIgMCAwIDEgMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA4djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMWg2IiB9XQogICAgXTsKICAgIHZhciBNZXNzYWdlU3F1YXJlUXVvdGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxNGEyIDIgMCAwIDAgMi0yVjhoLTIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjIgMTdhMiAyIDAgMCAxLTIgMkg2LjgyOGEyIDIgMCAwIDAtMS40MTQuNTg2bC0yLjIwMiAyLjIwMkEuNzEuNzEgMCAwIDEgMiAyMS4yODZWNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTRhMiAyIDAgMCAwIDItMlY4SDgiIH1dCiAgICBdOwogICAgdmFyIE1lc3NhZ2VTcXVhcmVSZXBseSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIyIDE3YTIgMiAwIDAgMS0yIDJINi44MjhhMiAyIDAgMCAwLTEuNDE0LjU4NmwtMi4yMDIgMi4yMDJBLjcxLjcxIDAgMCAxIDIgMjEuMjg2VjVhMiAyIDAgMCAxIDItMmgxNmEyIDIgMCAwIDEgMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCA4LTMgMyAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTR2LTFhMiAyIDAgMCAwLTItMkg3IiB9XQogICAgXTsKICAgIHZhciBNZXNzYWdlU3F1YXJlU2hhcmUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMiAzSDRhMiAyIDAgMCAwLTIgMnYxNi4yODZhLjcxLjcxIDAgMCAwIDEuMjEyLjUwMmwyLjIwMi0yLjIwMkEyIDIgMCAwIDEgNi44MjggMTlIMjBhMiAyIDAgMCAwIDItMnYtNCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAzaDZ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiA5IDYtNiIgfV0KICAgIF07CiAgICB2YXIgTWVzc2FnZVNxdWFyZVRleHQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMiAxN2EyIDIgMCAwIDEtMiAySDYuODI4YTIgMiAwIDAgMC0xLjQxNC41ODZsLTIuMjAyIDIuMjAyQS43MS43MSAwIDAgMSAyIDIxLjI4NlY1YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMWgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE1aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyA3aDgiIH1dCiAgICBdOwogICAgdmFyIE1lc3NhZ2VTcXVhcmVXYXJuaW5nID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjIgMTdhMiAyIDAgMCAxLTIgMkg2LjgyOGEyIDIgMCAwIDAtMS40MTQuNTg2bC0yLjIwMiAyLjIwMkEuNzEuNzEgMCAwIDEgMiAyMS4yODZWNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE1aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA3djQiIH1dCiAgICBdOwogICAgdmFyIE1lc3NhZ2VTcXVhcmVYID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjIgMTdhMiAyIDAgMCAxLTIgMkg2LjgyOGEyIDIgMCAwIDAtMS40MTQuNTg2bC0yLjIwMiAyLjIwMkEuNzEuNzEgMCAwIDEgMiAyMS4yODZWNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0LjUgOC41LTUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05LjUgOC41IDUgNSIgfV0KICAgIF07CiAgICB2YXIgTWVzc2FnZVNxdWFyZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIyIDE3YTIgMiAwIDAgMS0yIDJINi44MjhhMiAyIDAgMCAwLTEuNDE0LjU4NmwtMi4yMDIgMi4yMDJBLjcxLjcxIDAgMCAxIDIgMjEuMjg2VjVhMiAyIDAgMCAxIDItMmgxNmEyIDIgMCAwIDEgMiAyeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgTWVzc2FnZXNTcXVhcmUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNiAxMGEyIDIgMCAwIDEtMiAySDYuODI4YTIgMiAwIDAgMC0xLjQxNC41ODZsLTIuMjAyIDIuMjAyQS43MS43MSAwIDAgMSAyIDE0LjI4NlY0YTIgMiAwIDAgMSAyLTJoMTBhMiAyIDAgMCAxIDIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgOWEyIDIgMCAwIDEgMiAydjEwLjI4NmEuNzEuNzEgMCAwIDEtMS4yMTIuNTAybC0yLjIwMi0yLjIwMkEyIDIgMCAwIDAgMTcuMTcyIDE5SDEwYTIgMiAwIDAgMS0yLTJ2LTEiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIE1pY09mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE5djMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgOS4zNFY1YTMgMyAwIDAgMC01LjY4LTEuMzMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYuOTUgMTYuOTVBNyA3IDAgMCAxIDUgMTJ2LTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTguODkgMTMuMjNBNyA3IDAgMCAwIDE5IDEydi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDl2M2EzIDMgMCAwIDAgNS4xMiAyLjEyIiB9XQogICAgXTsKICAgIHZhciBNaWNWb2NhbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTExIDcuNjAxLTUuOTk0IDguMTlhMSAxIDAgMCAwIC4xIDEuMjk4bC44MTcuODE4YTEgMSAwIDAgMCAxLjMxNC4wODdMMTUuMDkgMTIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTYuNSAyMS4xNzRDMTUuNSAyMC41IDE0LjM3MiAyMCAxMyAyMGMtMi4wNTggMC0zLjkyOCAyLjM1Ni02IDItMi4wNzItLjM1Ni0yLjc3NS0zLjM2OS0xLjUtNC41IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYiLCBjeTogIjciLCByOiAiNSIgfV0KICAgIF07CiAgICB2YXIgTWljID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTl2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxMHYyYTcgNyAwIDAgMS0xNCAwdi0yIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiOSIsIHk6ICIyIiwgd2lkdGg6ICI2IiwgaGVpZ2h0OiAiMTMiLCByeDogIjMiIH1dCiAgICBdOwogICAgdmFyIE1pY3JvY2hpcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEyaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTdoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA3aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxOGgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDZoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEyaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxOGgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgNmgyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiNiIsIHk6ICIyIiwgd2lkdGg6ICIxMiIsIGhlaWdodDogIjIwIiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBNaWNyb3Njb3BlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOGg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMjJoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjJhNyA3IDAgMSAwIDAtMTRoLTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNGgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTJhMiAyIDAgMCAxLTItMlY2aDZ2NGEyIDIgMCAwIDEtMiAyWiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2VjNhMSAxIDAgMCAwLTEtMUg5YTEgMSAwIDAgMC0xIDF2MyIgfV0KICAgIF07CiAgICB2YXIgTWljcm93YXZlID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxNSIsIHg6ICIyIiwgeTogIjQiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiOCIsIGhlaWdodDogIjciLCB4OiAiNiIsIHk6ICI4Iiwgcng6ICIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDh2NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE5djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTl2MiIgfV0KICAgIF07CiAgICB2YXIgTWlsZXN0b25lID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTN2OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAzdjMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNCA2YTEgMSAwIDAgMC0xIDF2NWExIDEgMCAwIDAgMSAxaDEzYTIgMiAwIDAgMCAxLjE1Mi0uMzY1bDMuNDI0LTIuMzE3YTEgMSAwIDAgMCAwLTEuNjM1bC0zLjQyNC0yLjMxOEEyIDIgMCAwIDAgMTcgNnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIE1pbGtPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJoOCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk05IDJ2MS4zNDNNMTUgMnYyLjc4OWE0IDQgMCAwIDAgLjY3MiAyLjIxOWwuNjU2Ljk4NGE0IDQgMCAwIDEgLjY3MiAyLjIydjEuMTMxTTcuOCA3LjhsLS4xMjguMTkyQTQgNCAwIDAgMCA3IDEwLjIxMlYyMGEyIDIgMCAwIDAgMiAyaDZhMiAyIDAgMCAwIDItMnYtMyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE1YTYuNDcgNi40NyAwIDAgMSA1IDAgNi40NzIgNi40NzIgMCAwIDAgMy40MzUuNDM1IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjIiLCB4MjogIjIyIiwgeTE6ICIyIiwgeTI6ICIyMiIgfV0KICAgIF07CiAgICB2YXIgTWlsayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMmg4IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTkgMnYyLjc4OWE0IDQgMCAwIDEtLjY3MiAyLjIxOWwtLjY1Ni45ODRBNCA0IDAgMCAwIDcgMTAuMjEyVjIwYTIgMiAwIDAgMCAyIDJoNmEyIDIgMCAwIDAgMi0ydi05Ljc4OWE0IDQgMCAwIDAtLjY3Mi0yLjIxOWwtLjY1Ni0uOTg0QTQgNCAwIDAgMSAxNSA0Ljc4OFYyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTVhNi40NzIgNi40NzIgMCAwIDEgNSAwIDYuNDcgNi40NyAwIDAgMCA1IDAiIH1dCiAgICBdOwogICAgdmFyIE1pbmltaXplMiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDEwIDctNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxMGgtNlY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgMjEgNy03IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTRoNnY2IiB9XQogICAgXTsKICAgIHZhciBNaW5pbWl6ZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggM3YzYTIgMiAwIDAgMS0yIDJIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA4aC0zYTIgMiAwIDAgMS0yLTJWMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE2aDNhMiAyIDAgMCAxIDIgMnYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDIxdi0zYTIgMiAwIDAgMSAyLTJoMyIgfV0KICAgIF07CiAgICB2YXIgTWludXMgPSBbWyJwYXRoIiwgeyBkOiAiTTUgMTJoMTQiIH1dXTsKICAgIHZhciBNb25pdG9yQ2hlY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDEwIDIgMiA0LTQiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxNCIsIHg6ICIyIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTd2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIxaDgiIH1dCiAgICBdOwogICAgdmFyIE1vbml0b3JDbG91ZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDEzYTMgMyAwIDEgMSAyLjgzLTRIMTRhMiAyIDAgMCAxIDAgNHoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTd2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIxaDgiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjMiLCB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTQiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIE1vbml0b3JDb2cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN3Y0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0LjMwNSA3LjUzLjkyMy0uMzgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1LjIyOCA0Ljg1Mi0uOTIzLS4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYuODUyIDMuMjI4LS4zODMtLjkyNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNi44NTIgOC43NzItLjM4My45MjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkuMTQ4IDMuMjI4LjM4My0uOTI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5LjUzIDkuNjk2LS4zODItLjkyNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMC43NzIgNC44NTIuOTI0LS4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAuNzcyIDcuMTQ4LjkyNC4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTN2MmEyIDIgMCAwIDEtMiAySDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIxaDgiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiNiIsIHI6ICIzIiB9XQogICAgXTsKICAgIHZhciBNb25pdG9yRG93biA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEzVjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgMTAtMyAzLTMtMyIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE0IiwgeDogIjIiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN3Y0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjFoOCIgfV0KICAgIF07CiAgICB2YXIgTW9uaXRvck9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTdINGEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDEuMTg0LTEuODI2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIxaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC42NTYgM0gyMGEyIDIgMCAwIDEgMiAydjEwYTIgMiAwIDAgMS0uMjkzIDEuMDQyIiB9XQogICAgXTsKICAgIHZhciBNb25pdG9yRG90ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTd2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxMi4zMDdWMTVhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDguNjkzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjFoOCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE5IiwgY3k6ICI2IiwgcjogIjMiIH1dCiAgICBdOwogICAgdmFyIE1vbml0b3JQYXVzZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEzVjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTNWNyIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE0IiwgeDogIjIiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN3Y0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjFoOCIgfV0KICAgIF07CiAgICB2YXIgTW9uaXRvclBsYXkgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNS4wMzMgOS40NGEuNjQ3LjY0NyAwIDAgMSAwIDEuMTJsLTQuMDY1IDIuMzUyYS42NDUuNjQ1IDAgMCAxLS45NjgtLjU2VjcuNjQ4YS42NDUuNjQ1IDAgMCAxIC45NjctLjU2eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN3Y0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjFoOCIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjIiLCB5OiAiMyIsIHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxNCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgTW9uaXRvclNwZWFrZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk01LjUgMjBIOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyA5aC4wMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxMCIsIGhlaWdodDogIjE2IiwgeDogIjEyIiwgeTogIjQiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA2SDRhMiAyIDAgMCAwLTIgMnY2YTIgMiAwIDAgMCAyIDJoNCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE3IiwgY3k6ICIxNSIsIHI6ICIxIiB9XQogICAgXTsKICAgIHZhciBNb25pdG9yU3RvcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAyMWg4IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMiIsIHk6ICIzIiwgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiOSIsIHk6ICI3Iiwgd2lkdGg6ICI2IiwgaGVpZ2h0OiAiNiIsIHJ4OiAiMSIgfV0KICAgIF07CiAgICB2YXIgTW9uaXRvclNtYXJ0cGhvbmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA4VjZhMiAyIDAgMCAwLTItMkg0YTIgMiAwIDAgMC0yIDJ2N2EyIDIgMCAwIDAgMiAyaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTl2LTMuOTYgMy4xNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE5aDUiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNiIsIGhlaWdodDogIjEwIiwgeDogIjE2IiwgeTogIjEyIiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBNb25pdG9yVXAgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDEwIDMtMyAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTNWNyIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE0IiwgeDogIjIiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN3Y0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjFoOCIgfV0KICAgIF07CiAgICB2YXIgTW9uaXRvclggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC41IDEyLjUtNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkuNSAxMi41IDUtNSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE0IiwgeDogIjIiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN3Y0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjFoOCIgfV0KICAgIF07CiAgICB2YXIgTW9uaXRvciA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTQiLCB4OiAiMiIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjgiLCB4MjogIjE2IiwgeTE6ICIyMSIsIHkyOiAiMjEiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICIxNyIsIHkyOiAiMjEiIH1dCiAgICBdOwogICAgdmFyIE1vb24gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMC45ODUgMTIuNDg2YTkgOSAwIDEgMS05LjQ3My05LjQ3MmMuNDA1LS4wMjIuNjE3LjQ2LjQwMi44MDNhNiA2IDAgMCAwIDguMjY4IDguMjY4Yy4zNDQtLjIxNS44MjUtLjAwNC44MDMuNDAxIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBNb29uU3RhciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDVoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAzdjQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAuOTg1IDEyLjQ4NmE5IDkgMCAxIDEtOS40NzMtOS40NzJjLjQwNS0uMDIyLjYxNy40Ni40MDIuODAzYTYgNiAwIDAgMCA4LjI2OCA4LjI2OGMuMzQ0LS4yMTUuODI1LS4wMDQuODAzLjQwMSIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgTW90b3JiaWtlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMTQtMS0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgOSA2IDJhMiAyIDAgMCAxIDItMmgyYTIgMiAwIDAgMSAxLjk5IDEuODEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxN2gzYTEgMSAwIDAgMCAxLTEgNiA2IDAgMCAxIDYtNiAxIDEgMCAwIDAgMS0xdi0uNzVBNSA1IDAgMCAwIDE3IDUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiMTciLCByOiAiMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjE3IiwgcjogIjMiIH1dCiAgICBdOwogICAgdmFyIE1vdW50YWluU25vdyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTggMyA0IDggNS01IDUgMTVIMkw4IDN6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQuMTQgMTUuMDhjMi42Mi0xLjU3IDUuMjQtMS40MyA3Ljg2LjQyIDIuNzQgMS45NCA1LjQ5IDIgOC4yMy4xOSIgfV0KICAgIF07CiAgICB2YXIgTW91bnRhaW4gPSBbWyJwYXRoIiwgeyBkOiAibTggMyA0IDggNS01IDUgMTVIMkw4IDN6IiB9XV07CiAgICB2YXIgTW91c2VPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2di4zNDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTguMjE4IDE4LjIxOEE3IDcgMCAwIDEgNSAxNVY5YTcgNyAwIDAgMSAuNzgyLTMuMjE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDEzLjM0M1Y5QTcgNyAwIDAgMCA4LjU2IDIuOTAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDIyIDIgMiIgfV0KICAgIF07CiAgICB2YXIgTW91c2VQb2ludGVyMk9mZiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTE1LjU1IDguNDUgNS4xMzggMi4wODdhLjUuNSAwIDAgMS0uMDYzLjk0N2wtNi4xMjQgMS41OGEyIDIgMCAwIDAtMS40MzggMS40MzVsLTEuNTc5IDYuMTI2YS41LjUgMCAwIDEtLjk0Ny4wNjNMOC40NSAxNS41NTEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMiAyIDIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYuODE2IDExLjUyOC0yLjc3OS02Ljg0YS40OTUuNDk1IDAgMCAxIC42NTEtLjY1MWw2Ljg0IDIuNzc5IiB9XQogICAgXTsKICAgIHZhciBNb3VzZVBvaW50ZXIyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNC4wMzcgNC42ODhhLjQ5NS40OTUgMCAwIDEgLjY1MS0uNjUxbDE2IDYuNWEuNS41IDAgMCAxLS4wNjMuOTQ3bC02LjEyNCAxLjU4YTIgMiAwIDAgMC0xLjQzOCAxLjQzNWwtMS41NzkgNi4xMjZhLjUuNSAwIDAgMS0uOTQ3LjA2M3oiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIE1vdXNlUG9pbnRlckJhbiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuMDM0IDIuNjgxYS40OTguNDk4IDAgMCAxIC42NDctLjY0N2w5IDMuNWEuNS41IDAgMCAxLS4wMzMuOTQ0TDguMjA0IDcuNTQ1YTEgMSAwIDAgMC0uNjYuNjZsLTEuMDY2IDMuNDQzYS41LjUgMCAwIDEtLjk0NC4wMzN6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYiLCBjeTogIjE2IiwgcjogIjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTEuOCAxMS44IDguNCA4LjQiIH1dCiAgICBdOwogICAgdmFyIE1vdXNlUG9pbnRlckNsaWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgNC4xIDEyIDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNS4xIDgtMi45LS44IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYgMTItMS45IDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNy4yIDIuMiA4IDUuMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk05LjAzNyA5LjY5YS40OTguNDk4IDAgMCAxIC42NTMtLjY1M2wxMSA0LjVhLjUuNSAwIDAgMS0uMDc0Ljk0OWwtNC4zNDkgMS4wNDFhMSAxIDAgMCAwLS43NC43MzlsLTEuMDQgNC4zNWEuNS41IDAgMCAxLS45NS4wNzR6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBNb3VzZVBvaW50ZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMi41ODYgMTIuNTg2IDE5IDE5IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMuNjg4IDMuMDM3YS40OTcuNDk3IDAgMCAwLS42NTEuNjUxbDYuNSAxNS45OTlhLjUwMS41MDEgMCAwIDAgLjk0Ny0uMDYybDEuNTY5LTYuMDgzYTIgMiAwIDAgMSAxLjQ0OC0xLjQ3OWw2LjEyNC0xLjU3OWEuNS41IDAgMCAwIC4wNjMtLjk0N3oiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIE1vdXNlID0gWwogICAgICBbInJlY3QiLCB7IHg6ICI1IiwgeTogIjIiLCB3aWR0aDogIjE0IiwgaGVpZ2h0OiAiMjAiLCByeDogIjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnY0IiB9XQogICAgXTsKICAgIHZhciBNb3ZlM2QgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDN2MTZoMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNSAxOSA2LTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiA2IDMtMyAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMTYgMyAzLTMgMyIgfV0KICAgIF07CiAgICB2YXIgTW92ZURpYWdvbmFsMiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDEzdjZoLTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxMVY1aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNSA1IDE0IDE0IiB9XQogICAgXTsKICAgIHZhciBNb3ZlRGlhZ29uYWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxOUg1di02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDVoNnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDUgNSAxOSIgfV0KICAgIF07CiAgICB2YXIgTW92ZURvd25SaWdodCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDEzVjE5SDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgNUwxOSAxOSIgfV0KICAgIF07CiAgICB2YXIgTW92ZURvd25MZWZ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTlINVYxMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSA1TDUgMTkiIH1dCiAgICBdOwogICAgdmFyIE1vdmVEb3duID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxOEwxMiAyMkwxNiAxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyVjIyIiB9XQogICAgXTsKICAgIHZhciBNb3ZlSG9yaXpvbnRhbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE4IDggNCA0LTQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEyaDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYgOC00IDQgNCA0IiB9XQogICAgXTsKICAgIHZhciBNb3ZlUmlnaHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA4TDIyIDEyTDE4IDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJIMjIiIH1dCiAgICBdOwogICAgdmFyIE1vdmVMZWZ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA4TDIgMTJMNiAxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEySDIyIiB9XQogICAgXTsKICAgIHZhciBNb3ZlVXBMZWZ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxMVY1SDExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgNUwxOSAxOSIgfV0KICAgIF07CiAgICB2YXIgTW92ZVVwUmlnaHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyA1SDE5VjExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDVMNSAxOSIgfV0KICAgIF07CiAgICB2YXIgTW92ZVVwID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA2TDEyIDJMMTYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyVjIyIiB9XQogICAgXTsKICAgIHZhciBNb3ZlVmVydGljYWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggMTggNCA0IDQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDYgNC00IDQgNCIgfV0KICAgIF07CiAgICB2YXIgTW92ZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgMTktMyAzLTMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOSA5IDMgMy0zIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmgyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01IDktMyAzIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDUgMy0zIDMgMyIgfV0KICAgIF07CiAgICB2YXIgTXVzaWMyID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICI4IiwgY3k6ICIxOCIsIHI6ICI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4VjJsNyA0IiB9XQogICAgXTsKICAgIHZhciBNdXNpYzMgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxOCIsIHI6ICI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE4VjIiIH1dCiAgICBdOwogICAgdmFyIE11c2ljNCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMThWNWwxMi0ydjEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgOSAxMi0yIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNiIsIGN5OiAiMTgiLCByOiAiMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICIxNiIsIHI6ICIzIiB9XQogICAgXTsKICAgIHZhciBOYXZpZ2F0aW9uMk9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuMzEgOS4zMSA1IDIxbDctNCA3IDQtMS4xNy0zLjE3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0LjUzIDguODggMTIgMmwtMS4xNyAzLjE3IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjIiLCB4MjogIjIyIiwgeTE6ICIyIiwgeTI6ICIyMiIgfV0KICAgIF07CiAgICB2YXIgTXVzaWMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE4VjVsMTItMnYxMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYiLCBjeTogIjE4IiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiMTYiLCByOiAiMyIgfV0KICAgIF07CiAgICB2YXIgTmF2aWdhdGlvbjIgPSBbWyJwb2x5Z29uIiwgeyBwb2ludHM6ICIxMiAyIDE5IDIxIDEyIDE3IDUgMjEgMTIgMiIgfV1dOwogICAgdmFyIE5hdmlnYXRpb25PZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjQzIDguNDMgMyAxMWw4IDIgMiA4IDIuNTctNS40MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy4zOSAxMS43MyAyMiAybC05LjczIDQuNjEiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMiIsIHgyOiAiMjIiLCB5MTogIjIiLCB5MjogIjIyIiB9XQogICAgXTsKICAgIHZhciBOYXZpZ2F0aW9uID0gW1sicG9seWdvbiIsIHsgcG9pbnRzOiAiMyAxMSAyMiAyIDEzIDIxIDExIDEzIDMgMTEiIH1dXTsKICAgIHZhciBOZXR3b3JrID0gWwogICAgICBbInJlY3QiLCB7IHg6ICIxNiIsIHk6ICIxNiIsIHdpZHRoOiAiNiIsIGhlaWdodDogIjYiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjE2Iiwgd2lkdGg6ICI2IiwgaGVpZ2h0OiAiNiIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjkiLCB5OiAiMiIsIHdpZHRoOiAiNiIsIGhlaWdodDogIjYiLCByeDogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxNnYtM2ExIDEgMCAwIDEgMS0xaDEyYTEgMSAwIDAgMSAxIDF2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMlY4IiB9XQogICAgXTsKICAgIHZhciBOZXdzcGFwZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxOGgtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxNGgtOCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDIyaDE2YTIgMiAwIDAgMCAyLTJWNGEyIDIgMCAwIDAtMi0ySDhhMiAyIDAgMCAwLTIgMnYxNmEyIDIgMCAwIDEtNCAwdi05YTIgMiAwIDAgMSAyLTJoMiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiNCIsIHg6ICIxMCIsIHk6ICI2Iiwgcng6ICIxIiB9XQogICAgXTsKICAgIHZhciBOZmMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDguMzJhNy40MyA3LjQzIDAgMCAxIDAgNy4zNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjQ2IDYuMjFhMTEuNzYgMTEuNzYgMCAwIDEgMCAxMS41OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMi45MSA0LjFhMTUuOTEgMTUuOTEgMCAwIDEgLjAxIDE1LjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYuMzcgMmEyMC4xNiAyMC4xNiAwIDAgMSAwIDIwIiB9XQogICAgXTsKICAgIHZhciBOb25CaW5hcnkgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTguNSA0IDcgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04LjUgOCA3LTQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTciLCByOiAiNSIgfV0KICAgIF07CiAgICB2YXIgTm90ZWJvb2tUYWJzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA2aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTRoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE4aDQiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTYiLCBoZWlnaHQ6ICIyMCIsIHg6ICI0IiwgeTogIjIiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMnYyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA3aDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTJoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxN2g1IiB9XQogICAgXTsKICAgIHZhciBOb3RlYm9va1BlbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjQgMkg2YTIgMiAwIDAgMC0yIDJ2MTZhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0ydi03LjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA2aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTRoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE4aDQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEuMzc4IDUuNjI2YTEgMSAwIDEgMC0zLjAwNC0zLjAwNGwtNS4wMSA1LjAxMmEyIDIgMCAwIDAtLjUwNi44NTRsLS44MzcgMi44N2EuNS41IDAgMCAwIC42Mi42MmwyLjg3LS44MzdhMiAyIDAgMCAwIC44NTQtLjUwNnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIE5vdGVib29rVGV4dCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgNmg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTBoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE0aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxOGg0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE2IiwgaGVpZ2h0OiAiMjAiLCB4OiAiNCIsIHk6ICIyIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuNSA4aDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS41IDEySDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuNSAxNkgxNCIgfV0KICAgIF07CiAgICB2YXIgTm90ZWJvb2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDZoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEwaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxNGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMThoNCIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNiIsIGhlaWdodDogIjIwIiwgeDogIjQiLCB5OiAiMiIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjIwIiB9XQogICAgXTsKICAgIHZhciBOb3RlcGFkVGV4dERhc2hlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNGgyYTIgMiAwIDAgMSAyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE4djJhMiAyIDAgMCAxLTIgMmgtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAyMmgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIySDZhMiAyIDAgMCAxLTItMnYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE0di0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgOFY2YTIgMiAwIDAgMSAyLTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEwaDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNGg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMThoNSIgfV0KICAgIF07CiAgICB2YXIgTm90ZXBhZFRleHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE2IiwgaGVpZ2h0OiAiMTgiLCB4OiAiNCIsIHk6ICI0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTBoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE0aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxOGg1IiB9XQogICAgXTsKICAgIHZhciBOdXRPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA0VjIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNSAxMHY0YTcuMDA0IDcuMDA0IDAgMCAwIDUuMjc3IDYuNzg3Yy40MTIuMTA0LjgwMi4yOTIgMS4xMDIuNTkyTDEyIDIybC42MjEtLjYyMWMuMy0uMy42OS0uNDg4IDEuMTAyLS41OTJhNy4wMSA3LjAxIDAgMCAwIDQuMTI1LTIuOTM5IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDEwdjMuMzQzIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyIDEyYy0xLjM0OS0uNTczLTEuOTA1LTEuMDA1LTIuNS0yLS41NDYuOTAyLTEuMDQ4IDEuMzUzLTIuNSAyLTEuMDE4LS42NDQtMS40Ni0xLjA4LTItMi0xLjAyOC43MS0xLjY5LjkxOC0zIDEgMS4wODEtMS4wNDggMS43NTctMi4wMyAyLTMgLjE5NC0uNzc2Ljg0LTEuNTUxIDEuNzktMi4yMW0xMS42NTQgNS45OTdjLjg4Ny0uNDU3IDEuMjgtLjg5MSAxLjU1Ni0xLjc4NyAxLjAzMi45MTYgMS42ODMgMS4xNTcgMyAxLTEuMjk3LTEuMDM2LTEuNzU4LTIuMDMtMi0zLS41LTItNC00LTgtNC0uNzQgMC0xLjQ2MS4wNjgtMi4xNS4xOTIiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImxpbmUiLCB7IHgxOiAiMiIsIHgyOiAiMjIiLCB5MTogIjIiLCB5MjogIjIyIiB9XQogICAgXTsKICAgIHZhciBOdXQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA0VjIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNSAxMHY0YTcuMDA0IDcuMDA0IDAgMCAwIDUuMjc3IDYuNzg3Yy40MTIuMTA0LjgwMi4yOTIgMS4xMDIuNTkyTDEyIDIybC42MjEtLjYyMWMuMy0uMy42OS0uNDg4IDEuMTAyLS41OTJBNy4wMDMgNy4wMDMgMCAwIDAgMTkgMTR2LTQiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTIgNEM4IDQgNC41IDYgNCA4Yy0uMjQzLjk3LS45MTkgMS45NTItMiAzIDEuMzEtLjA4MiAxLjk3Mi0uMjkgMy0xIC41NC45Mi45ODIgMS4zNTYgMiAyIDEuNDUyLS42NDcgMS45NTQtMS4wOTggMi41LTIgLjU5NS45OTUgMS4xNTEgMS40MjcgMi41IDIgMS4zMS0uNjIxIDEuODYyLTEuMDU4IDIuNS0yIC42MjkuOTc3IDEuMTYyIDEuNDIzIDIuNSAyIDEuMjA5LS41NDggMS42OC0uOTY3IDItMiAxLjAzMi45MTYgMS42ODMgMS4xNTcgMyAxLTEuMjk3LTEuMDM2LTEuNzU4LTIuMDMtMi0zLS41LTItNC00LTgtNFoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIE9jdGFnb25BbGVydCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE2aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA4djQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTUuMzEyIDJhMiAyIDAgMCAxIDEuNDE0LjU4Nmw0LjY4OCA0LjY4OEEyIDIgMCAwIDEgMjIgOC42ODh2Ni42MjRhMiAyIDAgMCAxLS41ODYgMS40MTRsLTQuNjg4IDQuNjg4YTIgMiAwIDAgMS0xLjQxNC41ODZIOC42ODhhMiAyIDAgMCAxLTEuNDE0LS41ODZsLTQuNjg4LTQuNjg4QTIgMiAwIDAgMSAyIDE1LjMxMlY4LjY4OGEyIDIgMCAwIDEgLjU4Ni0xLjQxNGw0LjY4OC00LjY4OEEyIDIgMCAwIDEgOC42ODggMnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIE9jdGFnb25NaW51cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuNTg2IDE2LjcyNkEyIDIgMCAwIDEgMiAxNS4zMTJWOC42ODhhMiAyIDAgMCAxIC41ODYtMS40MTRsNC42ODgtNC42ODhBMiAyIDAgMCAxIDguNjg4IDJoNi42MjRhMiAyIDAgMCAxIDEuNDE0LjU4Nmw0LjY4OCA0LjY4OEEyIDIgMCAwIDEgMjIgOC42ODh2Ni42MjRhMiAyIDAgMCAxLS41ODYgMS40MTRsLTQuNjg4IDQuNjg4YTIgMiAwIDAgMS0xLjQxNC41ODZIOC42ODhhMiAyIDAgMCAxLTEuNDE0LS41ODZ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJoOCIgfV0KICAgIF07CiAgICB2YXIgT2N0YWdvblBhdXNlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTVWOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxNVY5IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuNTg2IDE2LjcyNkEyIDIgMCAwIDEgMiAxNS4zMTJWOC42ODhhMiAyIDAgMCAxIC41ODYtMS40MTRsNC42ODgtNC42ODhBMiAyIDAgMCAxIDguNjg4IDJoNi42MjRhMiAyIDAgMCAxIDEuNDE0LjU4Nmw0LjY4OCA0LjY4OEEyIDIgMCAwIDEgMjIgOC42ODh2Ni42MjRhMiAyIDAgMCAxLS41ODYgMS40MTRsLTQuNjg4IDQuNjg4YTIgMiAwIDAgMS0xLjQxNC41ODZIOC42ODhhMiAyIDAgMCAxLTEuNDE0LS41ODZ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBPY3RhZ29uWCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDktNiA2IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuNTg2IDE2LjcyNkEyIDIgMCAwIDEgMiAxNS4zMTJWOC42ODhhMiAyIDAgMCAxIC41ODYtMS40MTRsNC42ODgtNC42ODhBMiAyIDAgMCAxIDguNjg4IDJoNi42MjRhMiAyIDAgMCAxIDEuNDE0LjU4Nmw0LjY4OCA0LjY4OEEyIDIgMCAwIDEgMjIgOC42ODh2Ni42MjRhMiAyIDAgMCAxLS41ODYgMS40MTRsLTQuNjg4IDQuNjg4YTIgMiAwIDAgMS0xLjQxNC41ODZIOC42ODhhMiAyIDAgMCAxLTEuNDE0LS41ODZ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgOSA2IDYiIH1dCiAgICBdOwogICAgdmFyIE9jdGFnb24gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yLjU4NiAxNi43MjZBMiAyIDAgMCAxIDIgMTUuMzEyVjguNjg4YTIgMiAwIDAgMSAuNTg2LTEuNDE0bDQuNjg4LTQuNjg4QTIgMiAwIDAgMSA4LjY4OCAyaDYuNjI0YTIgMiAwIDAgMSAxLjQxNC41ODZsNC42ODggNC42ODhBMiAyIDAgMCAxIDIyIDguNjg4djYuNjI0YTIgMiAwIDAgMS0uNTg2IDEuNDE0bC00LjY4OCA0LjY4OGEyIDIgMCAwIDEtMS40MTQuNTg2SDguNjg4YTIgMiAwIDAgMS0xLjQxNC0uNTg2eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgT21lZ2EgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0zIDIwaDQuNWEuNS41IDAgMCAwIC41LS41di0uMjgyYS41Mi41MiAwIDAgMC0uMjQ3LS40MzcgOCA4IDAgMSAxIDguNDk0LS4wMDEuNTIuNTIgMCAwIDAtLjI0Ny40Mzh2LjI4MmEuNS41IDAgMCAwIC41LjVIMjEiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIE9wdGlvbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgM2g2bDYgMThoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAzaDciIH1dCiAgICBdOwogICAgdmFyIE9yYml0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAuMzQxIDYuNDg0QTEwIDEwIDAgMCAxIDEwLjI2NiAyMS44NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zLjY1OSAxNy41MTZBMTAgMTAgMCAwIDEgMTMuNzQgMi4xNTIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE5IiwgY3k6ICI1IiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI1IiwgY3k6ICIxOSIsIHI6ICIyIiB9XQogICAgXTsKICAgIHZhciBPcmlnYW1pID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJWNGExIDEgMCAwIDEgMS0xaDYuMjk3YTEgMSAwIDAgMSAuNjUxIDEuNzU5bC00LjY5NiA0LjAyNSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAibTEyIDIxLTcuNDE0LTcuNDE0QTIgMiAwIDAgMSA0IDEyLjE3MlY2LjQxNWExLjAwMiAxLjAwMiAwIDAgMSAxLjcwNy0uNzA3TDIwIDIwLjAwOSIgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTIuMjE0IDMuMzgxIDguNDE0IDE0Ljk2NmExIDEgMCAwIDEtLjE2NyAxLjE5OWwtMS4xNjggMS4xNjNhMSAxIDAgMCAxLS43MDYuMjkxSDYuMzUxYTEgMSAwIDAgMS0uNjI1LS4yMTlMMy4yNSAxOC44YTEgMSAwIDAgMSAuNjMxLTEuNzgxbDQuMTY1LjAyNyIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgUGFja2FnZTIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAzdjYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTYuNzYgM2EyIDIgMCAwIDEgMS44IDEuMWwyLjIzIDQuNDc5YTIgMiAwIDAgMSAuMjEuODkxVjE5YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yVjkuNDcyYTIgMiAwIDAgMSAuMjExLS44OTRMNS40NSA0LjFBMiAyIDAgMCAxIDcuMjQgM3oiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy4wNTQgOS4wMTNoMTcuODkzIiB9XQogICAgXTsKICAgIHZhciBQYWNrYWdlQ2hlY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAxNiAyIDIgNC00IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxIDEwVjhhMiAyIDAgMCAwLTEtMS43M2wtNy00YTIgMiAwIDAgMC0yIDBsLTcgNEEyIDIgMCAwIDAgMyA4djhhMiAyIDAgMCAwIDEgMS43M2w3IDRhMiAyIDAgMCAwIDIgMGwyLTEuMTQiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNy41IDQuMjcgOSA1LjE1IiB9XSwKICAgICAgWyJwb2x5bGluZSIsIHsgcG9pbnRzOiAiMy4yOSA3IDEyIDEyIDIwLjcxIDciIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICIyMiIsIHkyOiAiMTIiIH1dCiAgICBdOwogICAgdmFyIFBhY2thZ2VNaW51cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE2aDYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEgMTBWOGEyIDIgMCAwIDAtMS0xLjczbC03LTRhMiAyIDAgMCAwLTIgMGwtNyA0QTIgMiAwIDAgMCAzIDh2OGEyIDIgMCAwIDAgMSAxLjczbDcgNGEyIDIgMCAwIDAgMiAwbDItMS4xNCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03LjUgNC4yNyA5IDUuMTUiIH1dLAogICAgICBbInBvbHlsaW5lIiwgeyBwb2ludHM6ICIzLjI5IDcgMTIgMTIgMjAuNzEgNyIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTIiLCB5MTogIjIyIiwgeTI6ICIxMiIgfV0KICAgIF07CiAgICB2YXIgUGFja2FnZU9wZW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMnYtOSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNS4xNyAyLjIxYTEuNjcgMS42NyAwIDAgMSAxLjYzIDBMMjEgNC41N2ExLjkzIDEuOTMgMCAwIDEgMCAzLjM2TDguODIgMTQuNzlhMS42NTUgMS42NTUgMCAwIDEtMS42NCAwTDMgMTIuNDNhMS45MyAxLjkzIDAgMCAxIDAtMy4zNnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMTN2My44N2EyLjA2IDIuMDYgMCAwIDEtMS4xMSAxLjgzbC02IDMuMDhhMS45MyAxLjkzIDAgMCAxLTEuNzggMGwtNi0zLjA4QTIuMDYgMi4wNiAwIDAgMSA0IDE2Ljg3VjEzIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxIDEyLjQzYTEuOTMgMS45MyAwIDAgMCAwLTMuMzZMOC44MyAyLjJhMS42NCAxLjY0IDAgMCAwLTEuNjMgMEwzIDQuNTdhMS45MyAxLjkzIDAgMCAwIDAgMy4zNmwxMi4xOCA2Ljg2YTEuNjM2IDEuNjM2IDAgMCAwIDEuNjMgMHoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFBhY2thZ2VQbHVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTZoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxM3Y2IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxIDEwVjhhMiAyIDAgMCAwLTEtMS43M2wtNy00YTIgMiAwIDAgMC0yIDBsLTcgNEEyIDIgMCAwIDAgMyA4djhhMiAyIDAgMCAwIDEgMS43M2w3IDRhMiAyIDAgMCAwIDIgMGwyLTEuMTQiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNy41IDQuMjcgOSA1LjE1IiB9XSwKICAgICAgWyJwb2x5bGluZSIsIHsgcG9pbnRzOiAiMy4yOSA3IDEyIDEyIDIwLjcxIDciIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICIyMiIsIHkyOiAiMTIiIH1dCiAgICBdOwogICAgdmFyIFBhY2thZ2VTZWFyY2ggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMSAxMFY4YTIgMiAwIDAgMC0xLTEuNzNsLTctNGEyIDIgMCAwIDAtMiAwbC03IDRBMiAyIDAgMCAwIDMgOHY4YTIgMiAwIDAgMCAxIDEuNzNsNyA0YTIgMiAwIDAgMCAyIDBsMi0xLjE0IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcuNSA0LjI3IDkgNS4xNSIgfV0sCiAgICAgIFsicG9seWxpbmUiLCB7IHBvaW50czogIjMuMjkgNyAxMiAxMiAyMC43MSA3IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEyIiwgeDI6ICIxMiIsIHkxOiAiMjIiLCB5MjogIjEyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTguNSIsIGN5OiAiMTUuNSIsIHI6ICIyLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAuMjcgMTcuMjcgMjIgMTkiIH1dCiAgICBdOwogICAgdmFyIFBhY2thZ2VYID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEgMTBWOGEyIDIgMCAwIDAtMS0xLjczbC03LTRhMiAyIDAgMCAwLTIgMGwtNyA0QTIgMiAwIDAgMCAzIDh2OGEyIDIgMCAwIDAgMSAxLjczbDcgNGEyIDIgMCAwIDAgMiAwbDItMS4xNCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03LjUgNC4yNyA5IDUuMTUiIH1dLAogICAgICBbInBvbHlsaW5lIiwgeyBwb2ludHM6ICIzLjI5IDcgMTIgMTIgMjAuNzEgNyIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTIiLCB5MTogIjIyIiwgeTI6ICIxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAxMyA1IDVtLTUgMCA1LTUiIH1dCiAgICBdOwogICAgdmFyIFBhY2thZ2UgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMSAyMS43M2EyIDIgMCAwIDAgMiAwbDctNEEyIDIgMCAwIDAgMjEgMTZWOGEyIDIgMCAwIDAtMS0xLjczbC03LTRhMiAyIDAgMCAwLTIgMGwtNyA0QTIgMiAwIDAgMCAzIDh2OGEyIDIgMCAwIDAgMSAxLjczeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMlYxMiIgfV0sCiAgICAgIFsicG9seWxpbmUiLCB7IHBvaW50czogIjMuMjkgNyAxMiAxMiAyMC43MSA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcuNSA0LjI3IDkgNS4xNSIgfV0KICAgIF07CiAgICB2YXIgUGFpbnRCdWNrZXQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSA3IDYgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOC45OTIgMTJIMi4wNDEiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEuMTQ1IDE4LjM4QTMuMzQgMy4zNCAwIDAgMSAyMCAxNi41YTMuMyAzLjMgMCAwIDEtMS4xNDUgMS44OGMtLjU3NS40Ni0uODU1IDEuMDItLjg1NSAxLjU5NUEyIDIgMCAwIDAgMjAgMjJhMiAyIDAgMCAwIDItMi4wMjVjMC0uNTgtLjI4NS0xLjEzLS44NTUtMS41OTUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtOC41IDQuNSAyLjE0OC0yLjE0OGExLjIwNSAxLjIwNSAwIDAgMSAxLjcwNCAwbDcuMjk2IDcuMjk2YTEuMjA1IDEuMjA1IDAgMCAxIDAgMS43MDRsLTcuNTkyIDcuNTkyYTMuNjE1IDMuNjE1IDAgMCAxLTUuMTEyIDBsLTMuODg4LTMuODg4YTMuNjE1IDMuNjE1IDAgMCAxIDAtNS4xMTJMNS42NyA3LjMzIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBQYWludFJvbGxlciA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE2IiwgaGVpZ2h0OiAiNiIsIHg6ICIyIiwgeTogIjIiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTZ2LTJhMiAyIDAgMCAxIDItMmg4YTIgMiAwIDAgMCAyLTJWN2EyIDIgMCAwIDAtMi0yaC0yIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjQiLCBoZWlnaHQ6ICI2IiwgeDogIjgiLCB5OiAiMTYiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIFBhaW50YnJ1c2hWZXJ0aWNhbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMmExIDEgMCAwIDEgMSAxdjlINlYzYTEgMSAwIDAgMSAxLTF6IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYgMTJhMSAxIDAgMCAwLTEgMXYxYTIgMiAwIDAgMCAyIDJoMmExIDEgMCAwIDEgMSAxdjIuOWEyIDIgMCAxIDAgNCAwVjE3YTEgMSAwIDAgMSAxLTFoMmEyIDIgMCAwIDAgMi0ydi0xYTEgMSAwIDAgMC0xLTEiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFBhaW50YnJ1c2ggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC42MjIgMTcuODk3LTEwLjY4LTIuOTEzIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE4LjM3NiAyLjYyMmExIDEgMCAxIDEgMy4wMDIgMy4wMDJMMTcuMzYgOS42NDNhLjUuNSAwIDAgMCAwIC43MDdsLjk0NC45NDRhMi40MSAyLjQxIDAgMCAxIDAgMy40MDhsLS45NDQuOTQ0YS41LjUgMCAwIDEtLjcwNyAwTDguMzU0IDcuMzQ4YS41LjUgMCAwIDEgMC0uNzA3bC45NDQtLjk0NGEyLjQxIDIuNDEgMCAwIDEgMy40MDggMGwuOTQ0Ljk0NGEuNS41IDAgMCAwIC43MDcgMHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOSA4Yy0xLjgwNCAyLjcxLTMuOTcgMy40Ni02LjU4MyAzLjk0OGEuNTA3LjUwNyAwIDAgMC0uMzAyLjgxOWw3LjMyIDguODgzYTEgMSAwIDAgMCAxLjE4NS4yMDRDMTIuNzM1IDIwLjQwNSAxNiAxNi43OTIgMTYgMTUiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFBhbGV0dGUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMiAyMmExIDEgMCAwIDEgMC0yMCAxMCA5IDAgMCAxIDEwIDkgNSA1IDAgMCAxLTUgNWgtMi4yNWExLjc1IDEuNzUgMCAwIDAtMS40IDIuOGwuMy40YTEuNzUgMS43NSAwIDAgMS0xLjQgMi44eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEzLjUiLCBjeTogIjYuNSIsIHI6ICIuNSIsIGZpbGw6ICJjdXJyZW50Q29sb3IiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNy41IiwgY3k6ICIxMC41IiwgcjogIi41IiwgZmlsbDogImN1cnJlbnRDb2xvciIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYuNSIsIGN5OiAiMTIuNSIsIHI6ICIuNSIsIGZpbGw6ICJjdXJyZW50Q29sb3IiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI4LjUiLCBjeTogIjcuNSIsIHI6ICIuNSIsIGZpbGw6ICJjdXJyZW50Q29sb3IiIH1dCiAgICBdOwogICAgdmFyIFBhbmRhID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEuMjUgMTcuMjVoMS41TDEyIDE4eiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxMiAyIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggNi41YS41LjUgMCAwIDAtLjUtLjUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAuNjkgOS42N2E0LjUgNC41IDAgMSAwLTcuMDQtNS41IDguMzUgOC4zNSAwIDAgMC0zLjMgMCA0LjUgNC41IDAgMSAwLTcuMDQgNS41QzIuNDkgMTEuMiAyIDEyLjg4IDIgMTQuNSAyIDE5LjQ3IDYuNDggMjIgMTIgMjJzMTAtMi41MyAxMC03LjVjMC0xLjYyLS40OC0zLjMtMS4zLTQuODMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA2LjVhLjQ5NS40OTUgMCAwIDEgLjUtLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxMi0yIDIiIH1dCiAgICBdOwogICAgdmFyIFBhbmVsQm90dG9tQ2xvc2UgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE1aDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDgtMyAzLTMtMyIgfV0KICAgIF07CiAgICB2YXIgUGFuZWxCb3R0b21EYXNoZWQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxNWgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE1aDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxNWgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTVoMSIgfV0KICAgIF07CiAgICB2YXIgUGFuZWxCb3R0b21PcGVuID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxNWgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDEwIDMtMyAzIDMiIH1dCiAgICBdOwogICAgdmFyIFBhbmVsTGVmdENsb3NlID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAzdjE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDE1LTMtMyAzLTMiIH1dCiAgICBdOwogICAgdmFyIFBhbmVsQm90dG9tID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxNWgxOCIgfV0KICAgIF07CiAgICB2YXIgUGFuZWxMZWZ0RGFzaGVkID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNHYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTl2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDN2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDl2MSIgfV0KICAgIF07CiAgICB2YXIgUGFuZWxMZWZ0T3BlbiA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgM3YxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCA5IDMgMy0zIDMiIH1dCiAgICBdOwogICAgdmFyIFBhbmVsTGVmdFJpZ2h0RGFzaGVkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTBWOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxNXYtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAyMXYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA1VjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMFY5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTV2LTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAyMXYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDVWMyIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjMiLCB5OiAiMyIsIHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgUGFuZWxMZWZ0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAzdjE4IiB9XQogICAgXTsKICAgIHZhciBQYW5lbFJpZ2h0Q2xvc2UgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAzdjE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggOSAzIDMtMyAzIiB9XQogICAgXTsKICAgIHZhciBQYW5lbFJpZ2h0RGFzaGVkID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTR2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxOXYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDN2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA5djEiIH1dCiAgICBdOwogICAgdmFyIFBhbmVsUmlnaHQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAzdjE4IiB9XQogICAgXTsKICAgIHZhciBQYW5lbFJpZ2h0T3BlbiA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDN2MTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgMTUtMy0zIDMtMyIgfV0KICAgIF07CiAgICB2YXIgUGFuZWxUb3BCb3R0b21EYXNoZWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxNWgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDloMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxNWgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDloMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE1aDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA5aDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNWgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgOWgxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICIzIiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4Iiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBQYW5lbFRvcENsb3NlID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA5aDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTYgMy0zIDMgMyIgfV0KICAgIF07CiAgICB2YXIgUGFuZWxUb3BEYXNoZWQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA5aDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgOWgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOWgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgOWgxIiB9XQogICAgXTsKICAgIHZhciBQYW5lbFRvcE9wZW4gPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDloMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgMTQtMyAzLTMtMyIgfV0KICAgIF07CiAgICB2YXIgUGFuZWxUb3AgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDloMTgiIH1dCiAgICBdOwogICAgdmFyIFBhbmVsc0xlZnRCb3R0b20gPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDN2MTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNWgxMiIgfV0KICAgIF07CiAgICB2YXIgUGFuZWxzUmlnaHRCb3R0b20gPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE1aDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDN2MTgiIH1dCiAgICBdOwogICAgdmFyIFBhbmVsc1RvcExlZnQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDloMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAyMVY5IiB9XQogICAgXTsKICAgIHZhciBQYXBlcmNsaXAgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xNiA2LTguNDE0IDguNTg2YTIgMiAwIDAgMCAyLjgyOSAyLjgyOWw4LjQxNC04LjU4NmE0IDQgMCAxIDAtNS42NTctNS42NTdsLTguMzc5IDguNTUxYTYgNiAwIDEgMCA4LjQ4NSA4LjQ4NWw4LjM3OS04LjU1MSIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgUGFyZW50aGVzZXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIxcy00LTMtNC05IDQtOSA0LTkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgM3M0IDMgNCA5LTQgOS00IDkiIH1dCiAgICBdOwogICAgdmFyIFBhcmtpbmdNZXRlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDE1aDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJ2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOXYzIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE1LjI4MiAxOWExIDEgMCAwIDAgLjk0OC0uNjhsMi4zNy02Ljk4OGE3IDcgMCAxIDAtMTMuMiAwbDIuMzcgNi45ODhhMSAxIDAgMCAwIC45NDguNjh6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgOWEzIDMgMCAxIDEgNiAwIiB9XQogICAgXTsKICAgIHZhciBQYXJ0eVBvcHBlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUuOCAxMS4zIDIgMjJsMTAuNy0zLjc5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgM2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgOGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMjBoLjAxIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTIyIDItMi4yNC43NWEyLjkgMi45IDAgMCAwLTEuOTYgMy4xMmMuMS44Ni0uNTcgMS42My0xLjQ1IDEuNjNoLS4zOGMtLjg2IDAtMS42LjYtMS43NiAxLjQ0TDE0IDEwIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDEzLS44Mi0uMzNjLS44Ni0uMzQtMS44Mi4yLTEuOTggMS4xMWMtLjExLjctLjcyIDEuMjItMS40MyAxLjIySDE3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTExIDIgLjMzLjgyYy4zNC44Ni0uMiAxLjgyLTEuMTEgMS45OEM5LjUyIDQuOSA5IDUuNTIgOSA2LjIzVjciIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEgMTNjMS45MyAxLjkzIDIuODMgNC4xNyAyIDUtLjgzLjgzLTMuMDctLjA3LTUtMi0xLjkzLTEuOTMtMi44My00LjE3LTItNSAuODMtLjgzIDMuMDcuMDcgNSAyWiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgUGF1c2UgPSBbCiAgICAgIFsicmVjdCIsIHsgeDogIjE0IiwgeTogIjMiLCB3aWR0aDogIjUiLCBoZWlnaHQ6ICIxOCIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjUiLCB5OiAiMyIsIHdpZHRoOiAiNSIsIGhlaWdodDogIjE4Iiwgcng6ICIxIiB9XQogICAgXTsKICAgIHZhciBQYXdQcmludCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTEiLCBjeTogIjQiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICI4IiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIyMCIsIGN5OiAiMTYiLCByOiAiMiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk05IDEwYTUgNSAwIDAgMSA1IDV2My41YTMuNSAzLjUgMCAwIDEtNi44NCAxLjA0NVE2LjUyIDE3LjQ4IDQuNDYgMTYuODRBMy41IDMuNSAwIDAgMSA1LjUgMTBaIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBQY0Nhc2UgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNCIsIGhlaWdodDogIjIwIiwgeDogIjUiLCB5OiAiMiIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxNGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA2aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMGg2IiB9XQogICAgXTsKICAgIHZhciBQZW5MaW5lID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMjFoOCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMS4xNzQgNi44MTJhMSAxIDAgMCAwLTMuOTg2LTMuOTg3TDMuODQyIDE2LjE3NGEyIDIgMCAwIDAtLjUuODNsLTEuMzIxIDQuMzUyYS41LjUgMCAwIDAgLjYyMy42MjJsNC4zNTMtMS4zMmEyIDIgMCAwIDAgLjgzLS40OTd6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBQZW5PZmYgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xMCAxMC02LjE1NyA2LjE2MmEyIDIgMCAwIDAtLjUuODMzbC0xLjMyMiA0LjM2YS41LjUgMCAwIDAgLjYyMi42MjRsNC4zNTgtMS4zMjNhMiAyIDAgMCAwIC44My0uNUwxNCAxMy45ODIiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIuODI5IDcuMTcyIDQuMzU5LTQuMzQ2YTEgMSAwIDEgMSAzLjk4NiAzLjk4NmwtNC4zNTMgNC4zNTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XQogICAgXTsKICAgIHZhciBQZW5Ub29sID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTUuNzA3IDIxLjI5M2ExIDEgMCAwIDEtMS40MTQgMGwtMS41ODYtMS41ODZhMSAxIDAgMCAxIDAtMS40MTRsNS41ODYtNS41ODZhMSAxIDAgMCAxIDEuNDE0IDBsMS41ODYgMS41ODZhMSAxIDAgMCAxIDAgMS40MTR6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTE4IDEzLTEuMzc1LTYuODc0YTEgMSAwIDAgMC0uNzQ2LS43NzZMMy4yMzUgMi4wMjhhMSAxIDAgMCAwLTEuMjA3IDEuMjA3TDUuMzUgMTUuODc5YTEgMSAwIDAgMCAuNzc2Ljc0NkwxMyAxOCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yLjMgMi4zIDcuMjg2IDcuMjg2IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTEiLCBjeTogIjExIiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIFBlbiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxLjE3NCA2LjgxMmExIDEgMCAwIDAtMy45ODYtMy45ODdMMy44NDIgMTYuMTc0YTIgMiAwIDAgMC0uNS44M2wtMS4zMjEgNC4zNTJhLjUuNSAwIDAgMCAuNjIzLjYyMmw0LjM1My0xLjMyYTIgMiAwIDAgMCAuODMtLjQ5N3oiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFBlbmNpbExpbmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAyMWg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDUgNCA0IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxLjE3NCA2LjgxMmExIDEgMCAwIDAtMy45ODYtMy45ODdMMy44NDIgMTYuMTc0YTIgMiAwIDAgMC0uNS44M2wtMS4zMjEgNC4zNTJhLjUuNSAwIDAgMCAuNjIzLjYyMmw0LjM1My0xLjMyYTIgMiAwIDAgMCAuODMtLjQ5N3oiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFBlbmNpbE9mZiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTEwIDEwLTYuMTU3IDYuMTYyYTIgMiAwIDAgMC0uNS44MzNsLTEuMzIyIDQuMzZhLjUuNSAwIDAgMCAuNjIyLjYyNGw0LjM1OC0xLjMyM2EyIDIgMCAwIDAgLjgzLS41TDE0IDEzLjk4MiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMi44MjkgNy4xNzIgNC4zNTktNC4zNDZhMSAxIDAgMSAxIDMuOTg2IDMuOTg2bC00LjM1MyA0LjM1MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA1IDQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dCiAgICBdOwogICAgdmFyIFBlbmNpbFJ1bGVyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgNyA4LjcgMi43YTIuNDEgMi40MSAwIDAgMC0zLjQgMEwyLjcgNS4zYTIuNDEgMi40MSAwIDAgMCAwIDMuNEw3IDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggNiAyLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMTYgMi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDExIDQuMyA0LjNjLjk0Ljk0Ljk0IDIuNDYgMCAzLjRsLTIuNiAyLjZjLS45NC45NC0yLjQ2Ljk0LTMuNCAwTDExIDE3IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxLjE3NCA2LjgxMmExIDEgMCAwIDAtMy45ODYtMy45ODdMMy44NDIgMTYuMTc0YTIgMiAwIDAgMC0uNS44M2wtMS4zMjEgNC4zNTJhLjUuNSAwIDAgMCAuNjIzLjYyMmw0LjM1My0xLjMyYTIgMiAwIDAgMCAuODMtLjQ5N3oiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgNSA0IDQiIH1dCiAgICBdOwogICAgdmFyIFBlbmNpbCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxLjE3NCA2LjgxMmExIDEgMCAwIDAtMy45ODYtMy45ODdMMy44NDIgMTYuMTc0YTIgMiAwIDAgMC0uNS44M2wtMS4zMjEgNC4zNTJhLjUuNSAwIDAgMCAuNjIzLjYyMmw0LjM1My0xLjMyYTIgMiAwIDAgMCAuODMtLjQ5N3oiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgNSA0IDQiIH1dCiAgICBdOwogICAgdmFyIFBlbnRhZ29uID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTAuODMgMi4zOGEyIDIgMCAwIDEgMi4zNCAwbDggNS43NGEyIDIgMCAwIDEgLjczIDIuMjVsLTMuMDQgOS4yNmEyIDIgMCAwIDEtMS45IDEuMzdINy4wNGEyIDIgMCAwIDEtMS45LTEuMzdMMi4xIDEwLjM3YTIgMiAwIDAgMSAuNzMtMi4yNXoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFBlcmNlbnQgPSBbCiAgICAgIFsibGluZSIsIHsgeDE6ICIxOSIsIHgyOiAiNSIsIHkxOiAiNSIsIHkyOiAiMTkiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI2LjUiLCBjeTogIjYuNSIsIHI6ICIyLjUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNy41IiwgY3k6ICIxNy41IiwgcjogIjIuNSIgfV0KICAgIF07CiAgICB2YXIgUGVyc29uU3RhbmRpbmcgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICI1IiwgcjogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAyMCAzLTYgMyA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYgOCA2IDIgNi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEwdjQiIH1dCiAgICBdOwogICAgdmFyIFBoaWxpcHBpbmVQZXNvID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTFINCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCA3SDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMVY0YTEgMSAwIDAgMSAxLTFoNGExIDEgMCAwIDEgMCAxMkg3IiB9XQogICAgXTsKICAgIHZhciBQaG9uZUNhbGwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAyYTkgOSAwIDAgMSA5IDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgNmE1IDUgMCAwIDEgNSA1IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEzLjgzMiAxNi41NjhhMSAxIDAgMCAwIDEuMjEzLS4zMDNsLjM1NS0uNDY1QTIgMiAwIDAgMSAxNyAxNWgzYTIgMiAwIDAgMSAyIDJ2M2EyIDIgMCAwIDEtMiAyQTE4IDE4IDAgMCAxIDIgNGEyIDIgMCAwIDEgMi0yaDNhMiAyIDAgMCAxIDIgMnYzYTIgMiAwIDAgMS0uOCAxLjZsLS40NjguMzUxYTEgMSAwIDAgMC0uMjkyIDEuMjMzIDE0IDE0IDAgMCAwIDYuMzkyIDYuMzg0IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBQaG9uZUZvcndhcmRlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDZoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOCAyIDQgNC00IDQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTMuODMyIDE2LjU2OGExIDEgMCAwIDAgMS4yMTMtLjMwM2wuMzU1LS40NjVBMiAyIDAgMCAxIDE3IDE1aDNhMiAyIDAgMCAxIDIgMnYzYTIgMiAwIDAgMS0yIDJBMTggMTggMCAwIDEgMiA0YTIgMiAwIDAgMSAyLTJoM2EyIDIgMCAwIDEgMiAydjNhMiAyIDAgMCAxLS44IDEuNmwtLjQ2OC4zNTFhMSAxIDAgMCAwLS4yOTIgMS4yMzMgMTQgMTQgMCAwIDAgNi4zOTIgNi4zODQiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFBob25lSW5jb21pbmcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjZoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiAyLTYgNiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMy44MzIgMTYuNTY4YTEgMSAwIDAgMCAxLjIxMy0uMzAzbC4zNTUtLjQ2NUEyIDIgMCAwIDEgMTcgMTVoM2EyIDIgMCAwIDEgMiAydjNhMiAyIDAgMCAxLTIgMkExOCAxOCAwIDAgMSAyIDRhMiAyIDAgMCAxIDItMmgzYTIgMiAwIDAgMSAyIDJ2M2EyIDIgMCAwIDEtLjggMS42bC0uNDY4LjM1MWExIDEgMCAwIDAtLjI5MiAxLjIzMyAxNCAxNCAwIDAgMCA2LjM5MiA2LjM4NCIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgUGhvbmVNaXNzZWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAyIDYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiAyLTYgNiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMy44MzIgMTYuNTY4YTEgMSAwIDAgMCAxLjIxMy0uMzAzbC4zNTUtLjQ2NUEyIDIgMCAwIDEgMTcgMTVoM2EyIDIgMCAwIDEgMiAydjNhMiAyIDAgMCAxLTIgMkExOCAxOCAwIDAgMSAyIDRhMiAyIDAgMCAxIDItMmgzYTIgMiAwIDAgMSAyIDJ2M2EyIDIgMCAwIDEtLjggMS42bC0uNDY4LjM1MWExIDEgMCAwIDAtLjI5MiAxLjIzMyAxNCAxNCAwIDAgMCA2LjM5MiA2LjM4NCIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgUGhvbmVPZmYgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMC4xIDEzLjlhMTQgMTQgMCAwIDAgMy43MzIgMi42NjggMSAxIDAgMCAwIDEuMjEzLS4zMDNsLjM1NS0uNDY1QTIgMiAwIDAgMSAxNyAxNWgzYTIgMiAwIDAgMSAyIDJ2M2EyIDIgMCAwIDEtMiAyIDE4IDE4IDAgMCAxLTEyLjcyOC01LjI3MiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAyIDIgMjIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNC43NiAxMy41ODJBMTggMTggMCAwIDEgMiA0YTIgMiAwIDAgMSAyLTJoM2EyIDIgMCAwIDEgMiAydjNhMiAyIDAgMCAxLS44IDEuNmwtLjQ2OC4zNTFhMSAxIDAgMCAwLS4yOTIgMS4yMzMgMTQgMTQgMCAwIDAgLjI0NC40NzMiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFBob25lT3V0Z29pbmcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiA4IDYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiA4VjJoLTYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTMuODMyIDE2LjU2OGExIDEgMCAwIDAgMS4yMTMtLjMwM2wuMzU1LS40NjVBMiAyIDAgMCAxIDE3IDE1aDNhMiAyIDAgMCAxIDIgMnYzYTIgMiAwIDAgMS0yIDJBMTggMTggMCAwIDEgMiA0YTIgMiAwIDAgMSAyLTJoM2EyIDIgMCAwIDEgMiAydjNhMiAyIDAgMCAxLS44IDEuNmwtLjQ2OC4zNTFhMSAxIDAgMCAwLS4yOTIgMS4yMzMgMTQgMTQgMCAwIDAgNi4zOTIgNi4zODQiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFBob25lID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTMuODMyIDE2LjU2OGExIDEgMCAwIDAgMS4yMTMtLjMwM2wuMzU1LS40NjVBMiAyIDAgMCAxIDE3IDE1aDNhMiAyIDAgMCAxIDIgMnYzYTIgMiAwIDAgMS0yIDJBMTggMTggMCAwIDEgMiA0YTIgMiAwIDAgMSAyLTJoM2EyIDIgMCAwIDEgMiAydjNhMiAyIDAgMCAxLS44IDEuNmwtLjQ2OC4zNTFhMSAxIDAgMCAwLS4yOTIgMS4yMzMgMTQgMTQgMCAwIDAgNi4zOTIgNi4zODQiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFBpID0gWwogICAgICBbImxpbmUiLCB7IHgxOiAiOSIsIHgyOiAiOSIsIHkxOiAiNCIsIHkyOiAiMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA3YzAtMS43IDEuMy0zIDMtM2gxMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAyMGMtMS43IDAtMy0xLjMtMy0zVjQiIH1dCiAgICBdOwogICAgdmFyIFBpYW5vID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTguNSA4Yy0xLjQgMC0yLjYtLjgtMy4yLTJBNi44NyA2Ljg3IDAgMCAwIDIgOXYxMWEyIDIgMCAwIDAgMiAyaDE2YTIgMiAwIDAgMCAyLTJ2LTguNUMyMiA5LjYgMjAuNCA4IDE4LjUgOCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE0aDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTR2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxNHY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE0djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTR2NCIgfV0KICAgIF07CiAgICB2YXIgUGlja2F4ZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDEzLTguMzgxIDguMzhhMSAxIDAgMCAxLTMuMDAxLTNMMTEgOS45OTkiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTUuOTczIDQuMDI3QTEzIDEzIDAgMCAwIDUuOTAyIDIuMzczYy0xLjM5OC4zNDItMS4wOTIgMi4xNTguMjc3IDIuNjAxYTE5LjkgMTkuOSAwIDAgMSA1LjgyMiAzLjAyNCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNi4wMDEgMTEuOTk5YTE5LjkgMTkuOSAwIDAgMSAzLjAyNCA1LjgyNGMuNDQ0IDEuMzY5IDIuMjYgMS42NzYgMi42MDMuMjc4QTEzIDEzIDAgMCAwIDIwIDguMDY5IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE4LjM1MiAzLjM1MmExLjIwNSAxLjIwNSAwIDAgMC0xLjcwNCAwbC01LjI5NiA1LjI5NmExLjIwNSAxLjIwNSAwIDAgMCAwIDEuNzA0bDIuMjk2IDIuMjk2YTEuMjA1IDEuMjA1IDAgMCAwIDEuNzA0IDBsNS4yOTYtNS4yOTZhMS4yMDUgMS4yMDUgMCAwIDAgMC0xLjcwNHoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFBpY3R1cmVJblBpY3R1cmUyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgOVY2YTIgMiAwIDAgMC0yLTJINGEyIDIgMCAwIDAtMiAydjEwYzAgMS4xLjkgMiAyIDJoNCIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxMCIsIGhlaWdodDogIjciLCB4OiAiMTIiLCB5OiAiMTMiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIFBpY3R1cmVJblBpY3R1cmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEwaDZWNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDQgNiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEwVjdhMiAyIDAgMCAwLTItMmgtNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE0djJhMiAyIDAgMCAwIDIgMmgzIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMTIiLCB5OiAiMTQiLCB3aWR0aDogIjEwIiwgaGVpZ2h0OiAiNyIsIHJ4OiAiMSIgfV0KICAgIF07CiAgICB2YXIgUGlnZ3lCYW5rID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEgMTdoM3YyYTEgMSAwIDAgMCAxIDFoMmExIDEgMCAwIDAgMS0xdi0zYTMuMTYgMy4xNiAwIDAgMCAyLTJoMWExIDEgMCAwIDAgMS0xdi0yYTEgMSAwIDAgMC0xLTFoLTFhNSA1IDAgMCAwLTItNFYzYTQgNCAwIDAgMC0zLjIgMS42bC0uMy40SDExYTYgNiAwIDAgMC02IDZ2MWE1IDUgMCAwIDAgMiA0djNhMSAxIDAgMCAwIDEgMWgyYTEgMSAwIDAgMCAxLTF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEwaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDh2MWEyIDIgMCAwIDAgMiAyaDEiIH1dCiAgICBdOwogICAgdmFyIFBpbGNyb3dMZWZ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgM3YxMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA5aC0zYTMgMyAwIDAgMSAwLTZoOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAzdjExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE4SDJsNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYgMjItNC00IiB9XQogICAgXTsKICAgIHZhciBQaWxjcm93ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyA0djE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDRIOS41YTQuNSA0LjUgMCAwIDAgMCA5SDEzIiB9XQogICAgXTsKICAgIHZhciBQaWxjcm93UmlnaHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAzdjExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDlIN2ExIDEgMCAwIDEgMC02aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgM3YxMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOCAxNCA0IDRIMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiAxOC00IDQiIH1dCiAgICBdOwogICAgdmFyIFBpbGxCb3R0bGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMWgtNGExIDEgMCAwIDAtMSAxdjVhMSAxIDAgMCAwIDEgMWg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgN3YxM2EyIDIgMCAwIDAgMiAyaDhhMiAyIDAgMCAwIDItMlY3IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE2IiwgaGVpZ2h0OiAiNSIsIHg6ICI0IiwgeTogIjIiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIFBpbGwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMC41IDIwLjUgMTAtMTBhNC45NSA0Ljk1IDAgMSAwLTctN2wtMTAgMTBhNC45NSA0Ljk1IDAgMSAwIDcgN1oiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOC41IDguNSA3IDciIH1dCiAgICBdOwogICAgdmFyIFBpbk9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3djUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgOS4zNFY3YTEgMSAwIDAgMSAxLTEgMiAyIDAgMCAwIDAtNEg3Ljg5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDl2MS43NmEyIDIgMCAwIDEtMS4xMSAxLjc5bC0xLjc4LjlBMiAyIDAgMCAwIDUgMTUuMjRWMTZhMSAxIDAgMCAwIDEgMWgxMSIgfV0KICAgIF07CiAgICB2YXIgUGluID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTd2NSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk05IDEwLjc2YTIgMiAwIDAgMS0xLjExIDEuNzlsLTEuNzguOUEyIDIgMCAwIDAgNSAxNS4yNFYxNmExIDEgMCAwIDAgMSAxaDEyYTEgMSAwIDAgMCAxLTF2LS43NmEyIDIgMCAwIDAtMS4xMS0xLjc5bC0xLjc4LS45QTIgMiAwIDAgMSAxNSAxMC43NlY3YTEgMSAwIDAgMSAxLTEgMiAyIDAgMCAwIDAtNEg4YTIgMiAwIDAgMCAwIDQgMSAxIDAgMCAxIDEgMXoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFBpcGV0dGUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xMiA5LTguNDE0IDguNDE0QTIgMiAwIDAgMCAzIDE4LjgyOHYxLjM0NGEyIDIgMCAwIDEtLjU4NiAxLjQxNEEyIDIgMCAwIDEgMy44MjggMjFoMS4zNDRhMiAyIDAgMCAwIDEuNDE0LS41ODZMMTUgMTIiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggOSAuNC40YTEgMSAwIDEgMS0zIDNsLTMuOC0zLjhhMSAxIDAgMSAxIDMtM2wuNC40IDMuNC0zLjRhMSAxIDAgMSAxIDMgM3oiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyMiAuNDE0LS40MTQiIH1dCiAgICBdOwogICAgdmFyIFBpenphID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIgMTQtMSAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEzLjc1IDE4LjI1LTEuMjUgMS40MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy43NzUgNS42NTRhMTUuNjggMTUuNjggMCAwIDAtMTIuMTIxIDEyLjEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4LjggOS4zYTEgMSAwIDAgMCAyLjEgNy43IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxLjk2NCAyMC43MzJhMSAxIDAgMCAxLTEuMjMyIDEuMjMybC0xOC01YTEgMSAwIDAgMS0uNjk1LTEuMjMyQTE5LjY4IDE5LjY4IDAgMCAxIDE1LjczMiAyLjAzN2ExIDEgMCAwIDEgMS4yMzIuNjk1eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgUGxhbmVMYW5kaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMmgyMCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0zLjc3IDEwLjc3IDIgOWwyLTQuNSAxLjEuNTVjLjU1LjI4LjkuODQuOSAxLjQ1cy4zNSAxLjE3LjkgMS40NUw4IDguNWwzLTYgMS4wNS41M2EyIDIgMCAwIDEgMS4wOSAxLjUybC43MiA1LjRhMiAyIDAgMCAwIDEuMDkgMS41Mmw0LjQgMi4yYy40Mi4yMi43OC41NSAxLjAxLjk2bC42IDEuMDNjLjQ5Ljg4LS4wNiAxLjk4LTEuMDYgMi4xbC0xLjE4LjE1Yy0uNDcuMDYtLjk1LS4wMi0xLjM3LS4yNEw0LjI5IDExLjE1YTIgMiAwIDAgMS0uNTItLjM4WiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgUGxhbmVUYWtlb2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMmgyMCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02LjM2IDE3LjQgNCAxN2wtMi00IDEuMS0uNTVhMiAyIDAgMCAxIDEuOCAwbC4xNy4xYTIgMiAwIDAgMCAxLjggMEw4IDEyIDUgNmwuOS0uNDVhMiAyIDAgMCAxIDIuMDkuMmw0LjAyIDNhMiAyIDAgMCAwIDIuMS4ybDQuMTktMi4wNmEyLjQxIDIuNDEgMCAwIDEgMS43My0uMTdMMjEgN2ExLjQgMS40IDAgMCAxIC44NyAxLjk5bC0uMzguNzZjLS4yMy40Ni0uNi44NC0xLjA3IDEuMDhMNy41OCAxNy4yYTIgMiAwIDAgMS0xLjIyLjE4WiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgUGxheSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNNSA1YTIgMiAwIDAgMSAzLjAwOC0xLjcyOGwxMS45OTcgNi45OThhMiAyIDAgMCAxIC4wMDMgMy40NThsLTEyIDdBMiAyIDAgMCAxIDUgMTl6IiB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgUGxhbmUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNy44IDE5LjIgMTYgMTFsMy41LTMuNUMyMSA2IDIxLjUgNCAyMSAzYy0xLS41LTMgMC00LjUgMS41TDEzIDggNC44IDYuMmMtLjUtLjEtLjkuMS0xLjEuNWwtLjMuNWMtLjIuNS0uMSAxIC4zIDEuM0w5IDEybC0yIDNINGwtMSAxIDMgMiAyIDMgMS0xdi0zbDMtMiAzLjUgNS4zYy4zLjQuOC41IDEuMy4zbC41LS4yYy40LS4zLjYtLjcuNS0xLjJ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBQbHVnMiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDJ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN3Y1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgOGgxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDExVjhoMTJ2M2E2IDYgMCAxIDEtMTIgMFoiIH1dCiAgICBdOwogICAgdmFyIFBsdWcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMnYtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA4VjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgOGExIDEgMCAwIDEgMSAxdjRhNCA0IDAgMCAxLTQgNGgtNGE0IDQgMCAwIDEtNC00VjlhMSAxIDAgMCAxIDEtMXoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA4VjIiIH1dCiAgICBdOwogICAgdmFyIFBsdWdaYXAgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjMgMjAuM2EyLjQgMi40IDAgMCAwIDMuNCAwTDEyIDE4bC02LTYtMi4zIDIuM2EyLjQgMi40IDAgMCAwIDAgMy40WiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIyIDMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03LjUgMTMuNSAxMCAxMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC41IDE2LjUgMTMgMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMy00IDRoNmwtNCA0IiB9XQogICAgXTsKICAgIHZhciBQbHVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxMmgxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA1djE0IiB9XQogICAgXTsKICAgIHZhciBQb2NrZXRLbmlmZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMnYxYzAgMSAyIDEgMiAyUzMgNiAzIDdzMiAxIDIgMi0yIDEtMiAyIDIgMSAyIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggNmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAuODMgOC44M2E0IDQgMCAwIDAtNS42Ni01LjY2bC0xMiAxMmE0IDQgMCAxIDAgNS42NiA1LjY2WiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMS42NlYyMmE0IDQgMCAwIDAgNC00VjYiIH1dCiAgICBdOwogICAgdmFyIFBvZGNhc3QgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxN2ExIDEgMCAxIDAtMiAwbC41IDQuNWEwLjUgMC41IDAgMCAwIDEgMHoiLCBmaWxsOiAiY3VycmVudENvbG9yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2Ljg1IDE4LjU4YTkgOSAwIDEgMC05LjcgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE0YTUgNSAwIDEgMSA4IDAiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTEiLCByOiAiMSIsIGZpbGw6ICJjdXJyZW50Q29sb3IiIH1dCiAgICBdOwogICAgdmFyIFBvaW50ZXJPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA0LjVWNGEyIDIgMCAwIDAtMi40MS0xLjk1NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMy45IDguNGEyIDIgMCAwIDAtMS4yNi0xLjI5NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMS43IDE2LjJBOCA4IDAgMCAwIDIyIDE0di0zYTIgMiAwIDEgMC00IDB2LTFhMiAyIDAgMCAwLTMuNjMtMS4xNTgiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIm03IDE1LTEuOC0xLjhhMiAyIDAgMCAwLTIuNzkgMi44Nkw2IDE5LjdhNy43NCA3Ljc0IDAgMCAwIDYgMi4zaDJhOCA4IDAgMCAwIDUuNjU3LTIuMzQzIiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDZ2OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dCiAgICBdOwogICAgdmFyIFBvY2tldCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDNhMiAyIDAgMCAxIDIgMnY2YTEgMSAwIDAgMS0yMCAwVjVhMiAyIDAgMCAxIDItMnoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAxMCA0IDQgNC00IiB9XQogICAgXTsKICAgIHZhciBQb2ludGVyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTRhOCA4IDAgMCAxLTggOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMXYtMWEyIDIgMCAwIDAtMi0yYTIgMiAwIDAgMC0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTBWOWEyIDIgMCAwIDAtMi0yYTIgMiAwIDAgMC0yIDJ2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA5LjVWNGEyIDIgMCAwIDAtMi0yYTIgMiAwIDAgMC0yIDJ2MTAiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTggMTFhMiAyIDAgMSAxIDQgMHYzYTggOCAwIDAgMS04IDhoLTJjLTIuOCAwLTQuNS0uODYtNS45OS0yLjM0bC0zLjYtMy42YTIgMiAwIDAgMSAyLjgzLTIuODJMNyAxNSIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgUG9wY29ybiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDhhMiAyIDAgMCAwIDAtNCAyIDIgMCAwIDAtNCAwIDIgMiAwIDAgMC00IDAgMiAyIDAgMCAwLTQgMCAyIDIgMCAwIDAgMCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDIyIDkgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAyMiAxLTE0IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDhjLjUgMCAuOS40LjggMWwtMi42IDEyYy0uMS41LS43IDEtMS4yIDFIN2MtLjYgMC0xLjEtLjQtMS4yLTFMMy4yIDljLS4xLS42LjMtMSAuOC0xWiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgUG9wc2ljbGUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTE4LjYgMTQuNGMuOC0uOC44LTIgMC0yLjhsLTguMS04LjFhNC45NSA0Ljk1IDAgMSAwLTcuMSA3LjFsOC4xIDguMWMuOS43IDIuMS43IDIuOS0uMVoiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDIyLTUuNS01LjUiIH1dCiAgICBdOwogICAgdmFyIFBvdW5kU3RlcmxpbmcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA3YzAtNS4zMzMtOC01LjMzMy04IDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgN3YxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDIxaDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTNoMTAiIH1dCiAgICBdOwogICAgdmFyIFBvd2VyT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTguMzYgNi42NEE5IDkgMCAwIDEgMjAuNzcgMTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi4xNiA2LjE2YTkgOSAwIDEgMCAxMi42OCAxMi42OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XQogICAgXTsKICAgIHZhciBQb3dlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTguNCA2LjZhOSA5IDAgMSAxLTEyLjc3LjA0IiB9XQogICAgXTsKICAgIHZhciBQcmVzZW50YXRpb24gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDNoMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgM3YxMWEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMlYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMjEgNS01IDUgNSIgfV0KICAgIF07CiAgICB2YXIgUHJpbnRlckNoZWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMuNSAyMkg3YTEgMSAwIDAgMS0xLTF2LTZhMSAxIDAgMCAxIDEtMWgxMGExIDEgMCAwIDEgMSAxdi41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDE5IDIgMiA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOEg0YTIgMiAwIDAgMS0yLTJ2LTVhMiAyIDAgMCAxIDItMmgxNmEyIDIgMCAwIDEgMiAydjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA5VjNhMSAxIDAgMCAxIDEtMWgxMGExIDEgMCAwIDEgMSAxdjYiIH1dCiAgICBdOwogICAgdmFyIFByaW50ZXJYID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIuNTMxIDIySDdhMSAxIDAgMCAxLTEtMXYtNmExIDEgMCAwIDEgMS0xaDYuMzc3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2LjUgMTYuNSA1IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYuNSAyMS41IDUtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE4SDRhMiAyIDAgMCAxLTItMnYtNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ2MS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgOVYzYTEgMSAwIDAgMSAxLTFoMTBhMSAxIDAgMCAxIDEgMXY2IiB9XQogICAgXTsKICAgIHZhciBQcmludGVyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOEg0YTIgMiAwIDAgMS0yLTJ2LTVhMiAyIDAgMCAxIDItMmgxNmEyIDIgMCAwIDEgMiAydjVhMiAyIDAgMCAxLTIgMmgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDlWM2ExIDEgMCAwIDEgMS0xaDEwYTEgMSAwIDAgMSAxIDF2NiIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjYiLCB5OiAiMTQiLCB3aWR0aDogIjEyIiwgaGVpZ2h0OiAiOCIsIHJ4OiAiMSIgfV0KICAgIF07CiAgICB2YXIgUHJvamVjdG9yID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSA3IDMgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDZWMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMyA3IDItMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjEzIiwgcjogIjMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk0xMS44MyAxMkgyMGEyIDIgMCAwIDEgMiAydjRhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJ2LTRhMiAyIDAgMCAxIDItMmgyLjE3IiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNmgyIiB9XQogICAgXTsKICAgIHZhciBQcm9wb3J0aW9ucyA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTYiLCB4OiAiMiIsIHk6ICI0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDl2MTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA5aDEzYTIgMiAwIDAgMSAyIDJ2OSIgfV0KICAgIF07CiAgICB2YXIgUHV6emxlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTUuMzkgNC4zOWExIDEgMCAwIDAgMS42OC0uNDc0IDIuNSAyLjUgMCAxIDEgMy4wMTQgMy4wMTUgMSAxIDAgMCAwLS40NzQgMS42OGwxLjY4MyAxLjY4MmEyLjQxNCAyLjQxNCAwIDAgMSAwIDMuNDE0TDE5LjYxIDE1LjM5YTEgMSAwIDAgMS0xLjY4LS40NzQgMi41IDIuNSAwIDEgMC0zLjAxNCAzLjAxNSAxIDEgMCAwIDEgLjQ3NCAxLjY4bC0xLjY4MyAxLjY4MmEyLjQxNCAyLjQxNCAwIDAgMS0zLjQxNCAwTDguNjEgMTkuNjFhMSAxIDAgMCAwLTEuNjguNDc0IDIuNSAyLjUgMCAxIDEtMy4wMTQtMy4wMTUgMSAxIDAgMCAwIC40NzQtMS42OGwtMS42ODMtMS42ODJhMi40MTQgMi40MTQgMCAwIDEgMC0zLjQxNEw0LjM5IDguNjFhMSAxIDAgMCAxIDEuNjguNDc0IDIuNSAyLjUgMCAxIDAgMy4wMTQtMy4wMTUgMSAxIDAgMCAxLS40NzQtMS42OGwxLjY4My0xLjY4MmEyLjQxNCAyLjQxNCAwIDAgMSAzLjQxNCAweiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgUHlyYW1pZCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuNSAxNi44OGExIDEgMCAwIDEtLjMyLTEuNDNsOS0xMy4wMmExIDEgMCAwIDEgMS42NCAwbDkgMTMuMDFhMSAxIDAgMCAxLS4zMiAxLjQ0bC04LjUxIDQuODZhMiAyIDAgMCAxLTEuOTggMFoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnYyMCIgfV0KICAgIF07CiAgICB2YXIgUXJDb2RlID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNSIsIGhlaWdodDogIjUiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjUiLCBoZWlnaHQ6ICI1IiwgeDogIjE2IiwgeTogIjMiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNSIsIGhlaWdodDogIjUiLCB4OiAiMyIsIHk6ICIxNiIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNmgtM2EyIDIgMCAwIDAtMiAydjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMjF2LjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2M2EyIDIgMCAwIDEtMiAySDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgM2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTZ2LjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEyaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTJ2LjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIxdi0xIiB9XQogICAgXTsKICAgIHZhciBRdW90ZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE2IDNhMiAyIDAgMCAwLTIgMnY2YTIgMiAwIDAgMCAyIDIgMSAxIDAgMCAxIDEgMXYxYTIgMiAwIDAgMS0yIDIgMSAxIDAgMCAwLTEgMXYyYTEgMSAwIDAgMCAxIDEgNiA2IDAgMCAwIDYtNlY1YTIgMiAwIDAgMC0yLTJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTUgM2EyIDIgMCAwIDAtMiAydjZhMiAyIDAgMCAwIDIgMiAxIDEgMCAwIDEgMSAxdjFhMiAyIDAgMCAxLTIgMiAxIDEgMCAwIDAtMSAxdjJhMSAxIDAgMCAwIDEgMSA2IDYgMCAwIDAgNi02VjVhMiAyIDAgMCAwLTItMnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFJhYmJpdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDE2YTMgMyAwIDAgMSAyLjI0IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTJoLjAxIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE4IDIxaC04YTQgNCAwIDAgMS00LTQgNyA3IDAgMCAxIDctN2guMkw5LjYgNi40YTEgMSAwIDEgMSAyLjgtMi44TDE1LjggN2guMmMzLjMgMCA2IDIuNyA2IDZ2MWEyIDIgMCAwIDEtMiAyaC0xYTMgMyAwIDAgMC0zIDMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgOC41NFY0YTIgMiAwIDEgMC00IDB2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03LjYxMiAxMi41MjRhMyAzIDAgMSAwLTEuNiA0LjMiIH1dCiAgICBdOwogICAgdmFyIFJhZGFyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkuMDcgNC45M0ExMCAxMCAwIDAgMCA2Ljk5IDMuMzQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA2aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yLjI5IDkuNjJBMTAgMTAgMCAxIDAgMjEuMzEgOC4zNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNi4yNCA3Ljc2QTYgNiAwIDEgMCA4LjIzIDE2LjY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy45OSAxMS42NkE2IDYgMCAwIDEgMTUuNzcgMTYuNjciIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMy40MSAxMC41OSA1LjY2LTUuNjYiIH1dCiAgICBdOwogICAgdmFyIFJhZGlhdGlvbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEyaC4wMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNCAxNS40NjQxYTQgNCAwIDAgMS00IDBMNy41Mjc4NiAxOS43NDU5NyBBIDEgMSAwIDAgMCA3Ljk5MzAzIDIxLjE2MjExIDEwIDEwIDAgMCAwIDE2LjAwNjk3IDIxLjE2MjExIDEgMSAwIDAgMCAxNi40NzIxNCAxOS43NDU5N3oiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTYgMTJhNCA0IDAgMCAwLTItMy40NjRsMi40NzItNC4yODJhMSAxIDAgMCAxIDEuNDYtLjMwNSAxMCAxMCAwIDAgMSA0LjAwNiA2Ljk0QTEgMSAwIDAgMSAyMSAxMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOCAxMmE0IDQgMCAwIDEgMi0zLjQ2NEw3LjUyOCA0LjI1NGExIDEgMCAwIDAtMS40Ni0uMzA1IDEwIDEwIDAgMCAwLTQuMDA2IDYuOTRBMSAxIDAgMCAwIDMgMTJ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBSYWRpY2FsID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMyAxMmgzLjI4YTEgMSAwIDAgMSAuOTQ4LjY4NGwyLjI5OCA3LjkzNGEuNS41IDAgMCAwIC45Ni0uMDQ0TDEzLjgyIDQuNzcxQTEgMSAwIDAgMSAxNC43OTIgNEgyMSIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgUmFkaW9SZWNlaXZlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTZ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxNnYyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiOCIsIHg6ICIyIiwgeTogIjgiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTJoLjAxIiB9XQogICAgXTsKICAgIHZhciBSYWRpb1Rvd2VyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNC45IDE2LjFDMSAxMi4yIDEgNS44IDQuOSAxLjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNy44IDQuN2E2LjE0IDYuMTQgMCAwIDAtLjggNy41IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjkiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNi4yIDQuOGMyIDIgMi4yNiA1LjExLjggNy40NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOS4xIDEuOWE5Ljk2IDkuOTYgMCAwIDEgMCAxNC4xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuNSAxOGg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggMjIgNC0xMSA0IDExIiB9XQogICAgXTsKICAgIHZhciBSYWRpbyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2LjI0NyA3Ljc2MWE2IDYgMCAwIDEgMCA4LjQ3OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOS4wNzUgNC45MzNhMTAgMTAgMCAwIDEgMCAxNC4xMzQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC45MjUgMTkuMDY3YTEwIDEwIDAgMCAxIDAtMTQuMTM0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcuNzUzIDE2LjIzOWE2IDYgMCAwIDEgMC04LjQ3OCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIyIiB9XQogICAgXTsKICAgIHZhciBSYWRpdXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC4zNCAxNy41MmExMCAxMCAwIDEgMC0yLjgyIDIuODIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiMTkiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMy40MSAxMy40MSA0LjE4IDQuMTgiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgUmFpbFN5bWJvbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTVoMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSA5aDE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDIwLTUtNSA2LTYtNS01IiB9XQogICAgXTsKICAgIHZhciBSYWluYm93ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTdhMTAgMTAgMCAwIDAtMjAgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE3YTYgNiAwIDAgMSAxMiAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE3YTIgMiAwIDAgMSA0IDAiIH1dCiAgICBdOwogICAgdmFyIFJhdGlvID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTIiLCBoZWlnaHQ6ICIyMCIsIHg6ICI2IiwgeTogIjIiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxMiIsIHg6ICIyIiwgeTogIjYiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIFJhdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDIySDRhMiAyIDAgMCAxIDAtNGgxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMy4yMzYgMThhMyAzIDAgMCAwLTIuMi01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDloLjAxIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE2LjgyIDMuOTRhMyAzIDAgMSAxIDMuMjM3IDQuODY4bDEuODE1IDIuNTg3YTEuNSAxLjUgMCAwIDEtMS41IDIuMWwtMi44NzItLjQ1M2EzIDMgMCAwIDAtMy41IDMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgNC45ODhhMyAzIDAgMSAwLTUuMiAyLjA1MkE3IDcgMCAwIDAgNCAxNC4wMTUgNCA0IDAgMCAwIDggMTgiIH1dCiAgICBdOwogICAgdmFyIFJlY2VpcHRDZW50ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAydjIwbDItMSAyIDEgMi0xIDIgMSAyLTEgMiAxIDItMSAyIDFWMmwtMiAxLTItMS0yIDEtMi0xLTIgMS0yLTEtMiAxWiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2LjV2MTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgOS40YTQgNCAwIDEgMCAwIDUuMiIgfV0KICAgIF07CiAgICB2YXIgUmVjZWlwdEV1cm8gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDJ2MjBsMi0xIDIgMSAyLTEgMiAxIDItMSAyIDEgMi0xIDIgMVYybC0yIDEtMi0xLTIgMS0yLTEtMiAxLTItMS0yIDFaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA5LjVhNCA0IDAgMSAwIDAgNS4yIiB9XQogICAgXTsKICAgIHZhciBSZWNlaXB0SW5kaWFuUnVwZWUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDJ2MjBsMi0xIDIgMSAyLTEgMiAxIDItMSAyIDEgMi0xIDIgMVYybC0yIDEtMi0xLTIgMS0yLTEtMiAxLTItMS0yIDFaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggN2g4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3LjUgOCAxNWgxYTQgNCAwIDAgMCAwLTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMWg4IiB9XQogICAgXTsKICAgIHZhciBSZWNlaXB0SmFwYW5lc2VZZW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDJ2MjBsMi0xIDIgMSAyLTEgMiAxIDItMSAyIDEgMi0xIDIgMVYybC0yIDEtMi0xLTIgMS0yLTEtMiAxLTItMS0yIDFaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDEwIDMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDcgMyAzdjcuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDExaDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNWg2IiB9XQogICAgXTsKICAgIHZhciBSZWNlaXB0UG91bmRTdGVybGluZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMnYyMGwyLTEgMiAxIDItMSAyIDEgMi0xIDIgMSAyLTEgMiAxVjJsLTIgMS0yLTEtMiAxLTItMS0yIDEtMi0xLTIgMVoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxM2g1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE3VjkuNWEyLjUgMi41IDAgMCAxIDUgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE3aDciIH1dCiAgICBdOwogICAgdmFyIFJlY2VpcHRSdXNzaWFuUnVibGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDJ2MjBsMi0xIDIgMSAyLTEgMiAxIDItMSAyIDEgMi0xIDIgMVYybC0yIDEtMi0xLTIgMS0yLTEtMiAxLTItMS0yIDFaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTVoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDExaDVhMiAyIDAgMSAwIDAtNGgtM3YxMCIgfV0KICAgIF07CiAgICB2YXIgUmVjZWlwdFRleHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxNkg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDhIOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMkg4IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQgM2ExIDEgMCAwIDEgMS0xIDEuMyAxLjMgMCAwIDEgLjcuMmwuOTMzLjZhMS4zIDEuMyAwIDAgMCAxLjQgMGwuOTM0LS42YTEuMyAxLjMgMCAwIDEgMS40IDBsLjkzMy42YTEuMyAxLjMgMCAwIDAgMS40IDBsLjkzMy0uNmExLjMgMS4zIDAgMCAxIDEuNCAwbC45MzQuNmExLjMgMS4zIDAgMCAwIDEuNCAwbC45MzMtLjZBMS4zIDEuMyAwIDAgMSAxOSAyYTEgMSAwIDAgMSAxIDF2MThhMSAxIDAgMCAxLTEgMSAxLjMgMS4zIDAgMCAxLS43LS4ybC0uOTMzLS42YTEuMyAxLjMgMCAwIDAtMS40IDBsLS45MzQuNmExLjMgMS4zIDAgMCAxLTEuNCAwbC0uOTMzLS42YTEuMyAxLjMgMCAwIDAtMS40IDBsLS45MzMuNmExLjMgMS4zIDAgMCAxLTEuNCAwbC0uOTM0LS42YTEuMyAxLjMgMCAwIDAtMS40IDBsLS45MzMuNmExLjMgMS4zIDAgMCAxLS43LjIgMSAxIDAgMCAxLTEtMXoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFJlY2VpcHRTd2lzc0ZyYW5jID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAydjIwbDItMSAyIDEgMi0xIDIgMSAyLTEgMiAxIDItMSAyIDFWMmwtMiAxLTItMS0yIDEtMi0xLTIgMS0yLTEtMiAxWiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxN1Y3aDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTFoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE1aDUiIH1dCiAgICBdOwogICAgdmFyIFJlY2VpcHRUdXJraXNoTGlyYSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDYuNXYxMWE1LjUgNS41IDAgMCAwIDUuNS01LjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgOC02IDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAydjIwbDItMSAyIDEgMi0xIDIgMSAyLTEgMiAxIDItMSAyIDFWMmwtMiAxLTItMS0yIDEtMi0xLTIgMS0yLTEtMiAxeiIgfV0KICAgIF07CiAgICB2YXIgUmVjZWlwdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMnYyMGwyLTEgMiAxIDItMSAyIDEgMi0xIDIgMSAyLTEgMiAxVjJsLTIgMS0yLTEtMiAxLTItMS0yIDEtMi0xLTIgMVoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgOGgtNmEyIDIgMCAxIDAgMCA0aDRhMiAyIDAgMSAxIDAgNEg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3LjV2LTExIiB9XQogICAgXTsKICAgIHZhciBSZWN0YW5nbGVDaXJjbGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA0djE2SDNhMSAxIDAgMCAxLTEtMVY1YTEgMSAwIDAgMSAxLTF6IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTQiLCBjeTogIjEyIiwgcjogIjgiIH1dCiAgICBdOwogICAgdmFyIFJlY3RhbmdsZUVsbGlwc2lzID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxMiIsIHg6ICIyIiwgeTogIjYiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDEyaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEyaC4wMSIgfV0KICAgIF07CiAgICB2YXIgUmVjdGFuZ2xlR29nZ2xlcyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDZhMiAyIDAgMCAxIDIgMnY4YTIgMiAwIDAgMS0yIDJoLTRhMiAyIDAgMCAxLTEuNi0uOGwtMS42LTIuMTNhMSAxIDAgMCAwLTEuNiAwTDkuNiAxNy4yQTIgMiAwIDAgMSA4IDE4SDRhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBSZWN0YW5nbGVIb3Jpem9udGFsID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxMiIsIHg6ICIyIiwgeTogIjYiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIFJlY3RhbmdsZVZlcnRpY2FsID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTIiLCBoZWlnaHQ6ICIyMCIsIHg6ICI2IiwgeTogIjIiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIFJlY3ljbGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE5SDQuODE1YTEuODMgMS44MyAwIDAgMS0xLjU3LS44ODEgMS43ODUgMS43ODUgMCAwIDEtLjAwNC0xLjc4NEw3LjE5NiA5LjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTloOC4yMDNhMS44MyAxLjgzIDAgMCAwIDEuNTU2LS44OSAxLjc4NCAxLjc4NCAwIDAgMCAwLTEuNzc1bC0xLjIyNi0yLjEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDE2LTMgMyAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC4yOTMgMTMuNTk2IDcuMTk2IDkuNSAzLjEgMTAuNTk4IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTkuMzQ0IDUuODExIDEuMDkzLTEuODkyQTEuODMgMS44MyAwIDAgMSAxMS45ODUgM2ExLjc4NCAxLjc4NCAwIDAgMSAxLjU0Ni44ODhsMy45NDMgNi44NDMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMuMzc4IDkuNjMzIDQuMDk2IDEuMDk4IDEuMDk3LTQuMDk2IiB9XQogICAgXTsKICAgIHZhciBSZWRvMiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDE0IDUtNS01LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgOUg5LjVBNS41IDUuNSAwIDAgMCA0IDE0LjVBNS41IDUuNSAwIDAgMCA5LjUgMjBIMTMiIH1dCiAgICBdOwogICAgdmFyIFJlZG9Eb3QgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxNyIsIHI6ICIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDd2NmgtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE3YTkgOSAwIDAgMSA5LTkgOSA5IDAgMCAxIDYgMi4zbDMgMi43IiB9XQogICAgXTsKICAgIHZhciBSZWRvID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgN3Y2aC02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTdhOSA5IDAgMCAxIDktOSA5IDkgMCAwIDEgNiAyLjNsMyAyLjciIH1dCiAgICBdOwogICAgdmFyIFJlZnJlc2hDY3dEb3QgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMmE5IDkgMCAwIDAtOS05IDkuNzUgOS43NSAwIDAgMC02Ljc0IDIuNzRMMyA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgM3Y1aDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmE5IDkgMCAwIDAgOSA5IDkuNzUgOS43NSAwIDAgMCA2Ljc0LTIuNzRMMjEgMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTZoNXY1IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEiIH1dCiAgICBdOwogICAgdmFyIFJlZnJlc2hDY3cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMmE5IDkgMCAwIDAtOS05IDkuNzUgOS43NSAwIDAgMC02Ljc0IDIuNzRMMyA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgM3Y1aDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmE5IDkgMCAwIDAgOSA5IDkuNzUgOS43NSAwIDAgMCA2Ljc0LTIuNzRMMjEgMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTZoNXY1IiB9XQogICAgXTsKICAgIHZhciBSZWZyZXNoQ3dPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA4TDE4Ljc0IDUuNzRBOS43NSA5Ljc1IDAgMCAwIDEyIDNDMTEgMyAxMC4wMyAzLjE2IDkuMTMgMy40NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE2SDN2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyQzMgOS41MSA0IDcuMjYgNS42NCA1LjY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgMTYgMi4yNiAyLjI2QTkuNzUgOS43NSAwIDAgMCAxMiAyMWMyLjQ5IDAgNC43NC0xIDYuMzYtMi42NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMmMwIDEtLjE2IDEuOTctLjQ3IDIuODciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgM3Y1aC01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDIyIDIgMiIgfV0KICAgIF07CiAgICB2YXIgUmVmcmVzaEN3ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmE5IDkgMCAwIDEgOS05IDkuNzUgOS43NSAwIDAgMSA2Ljc0IDIuNzRMMjEgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAzdjVoLTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTJhOSA5IDAgMCAxLTkgOSA5Ljc1IDkuNzUgMCAwIDEtNi43NC0yLjc0TDMgMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNkgzdjUiIH1dCiAgICBdOwogICAgdmFyIFJlZnJpZ2VyYXRvciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgNmE0IDQgMCAwIDEgNC00aDZhNCA0IDAgMCAxIDQgNHYxNGEyIDIgMCAwIDEtMiAySDdhMiAyIDAgMCAxLTItMlY2WiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDEwaDE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDd2NiIgfV0KICAgIF07CiAgICB2YXIgUmVnZXggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAzdjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyLjY3IDUuNSA4LjY2IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIuNjcgMTAuNSA4LjY2LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxN2EyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYyYTIgMiAwIDAgMCAyIDJoMmEyIDIgMCAwIDAgMi0ydi0yeiIgfV0KICAgIF07CiAgICB2YXIgUmVtb3ZlRm9ybWF0dGluZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgN1Y0aDE2djMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMGg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDQgOCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxNSA1IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAgMTUtNSA1IiB9XQogICAgXTsKICAgIHZhciBSZXBlYXQxID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMiA0IDQtNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTF2LTFhNCA0IDAgMCAxIDQtNGgxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03IDIyLTQtNCA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTN2MWE0IDQgMCAwIDEtNCA0SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTBoMXY0IiB9XQogICAgXTsKICAgIHZhciBSZXBlYXQyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMiA5IDMtMyAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMThIN2EyIDIgMCAwIDEtMi0yVjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgMTUtMyAzLTMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSA2aDZhMiAyIDAgMCAxIDIgMnYxMCIgfV0KICAgIF07CiAgICB2YXIgUmVwZWF0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMiA0IDQtNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTF2LTFhNCA0IDAgMCAxIDQtNGgxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03IDIyLTQtNCA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTN2MWE0IDQgMCAwIDEtNCA0SDMiIH1dCiAgICBdOwogICAgdmFyIFJlcGxhY2VBbGwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxNGExIDEgMCAwIDEgMSAxdjVhMSAxIDAgMCAxLTEgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA0YTEgMSAwIDAgMSAxLTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTBhMSAxIDAgMCAxLTEtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxNGExIDEgMCAwIDEgMSAxdjVhMSAxIDAgMCAxLTEgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA0YTEgMSAwIDAgMC0xLTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgOWExIDEgMCAwIDEtMSAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgNyAzIDMgMy0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTBWNWEyIDIgMCAwIDEgMi0yaDIiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIzIiwgeTogIjE0Iiwgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiNyIsIHJ4OiAiMSIgfV0KICAgIF07CiAgICB2YXIgUmVwbGFjZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDRhMSAxIDAgMCAxIDEtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxMGExIDEgMCAwIDEtMS0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDRhMSAxIDAgMCAwLTEtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA5YTEgMSAwIDAgMS0xIDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMyA3IDMgMyAzLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxMFY1YTIgMiAwIDAgMSAyLTJoMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjMiLCB5OiAiMTQiLCB3aWR0aDogIjciLCBoZWlnaHQ6ICI3Iiwgcng6ICIxIiB9XQogICAgXTsKICAgIHZhciBSZXBseUFsbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDE3LTUtNSA1LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTh2LTJhNCA0IDAgMCAwLTQtNEg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMTctNS01IDUtNSIgfV0KICAgIF07CiAgICB2YXIgUmVwbHkgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxOHYtMmE0IDQgMCAwIDAtNC00SDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxNy01LTUgNS01IiB9XQogICAgXTsKICAgIHZhciBSZXdpbmQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2YTIgMiAwIDAgMC0zLjQxNC0xLjQxNGwtNiA2YTIgMiAwIDAgMCAwIDIuODI4bDYgNkEyIDIgMCAwIDAgMTIgMTh6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDZhMiAyIDAgMCAwLTMuNDE0LTEuNDE0bC02IDZhMiAyIDAgMCAwIDAgMi44MjhsNiA2QTIgMiAwIDAgMCAyMiAxOHoiIH1dCiAgICBdOwogICAgdmFyIFJvY2tldCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQuNSAxNi41Yy0xLjUgMS4yNi0yIDUtMiA1czMuNzQtLjUgNS0yYy43MS0uODQuNy0yLjEzLS4wOS0yLjkxYTIuMTggMi4xOCAwIDAgMC0yLjkxLS4wOXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTIgMTUtMy0zYTIyIDIyIDAgMCAxIDItMy45NUExMi44OCAxMi44OCAwIDAgMSAyMiAyYzAgMi43Mi0uNzggNy41LTYgMTFhMjIuMzUgMjIuMzUgMCAwIDEtNCAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDEySDRzLjU1LTMuMDMgMi00YzEuNjItMS4wOCA1IDAgNSAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE1djVzMy4wMy0uNTUgNC0yYzEuMDgtMS42MiAwLTUgMC01IiB9XQogICAgXTsKICAgIHZhciBSb2NraW5nQ2hhaXIgPSBbCiAgICAgIFsicG9seWxpbmUiLCB7IHBvaW50czogIjMuNSAyIDYuNSAxMi41IDE4IDEyLjUiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiOS41IiwgeDI6ICI1LjUiLCB5MTogIjEyLjUiLCB5MjogIjIwIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE1IiwgeDI6ICIxOC41IiwgeTE6ICIxMi41IiwgeTI6ICIyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yLjc1IDE4YTEzIDEzIDAgMCAwIDE4LjUgMCIgfV0KICAgIF07CiAgICB2YXIgUmliYm9uID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTEuMjJDMTEgOS45OTcgMTAgOSAxMCA4YTIgMiAwIDAgMSA0IDBjMCAxLS45OTggMi4wMDItMi4wMSAzLjIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDE4IDIuNTctMy41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMjQzIDkuMDE2YTcgNyAwIDAgMSAxMS41MDctLjAwOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjM1IDE0LjUzIDEyIDExLjIyIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTkuMzUgMTQuNTNDNy43MjggMTIuMjQ2IDYgMTAuMjIxIDYgN2E2IDUgMCAwIDEgMTIgMGMtLjAwNSAzLjIyLTEuNzc4IDUuMjM1LTMuNDMgNy41bDMuNTU3IDQuNTI3YTEgMSAwIDAgMS0uMjAzIDEuNDNsLTEuODk0IDEuMzZhMSAxIDAgMCAxLTEuMzg0LS4yMTVMMTIgMThsLTIuNjc5IDMuNTkzYTEgMSAwIDAgMS0xLjM5LjIxM2wtMS44NjUtMS4zNTNhMSAxIDAgMCAxLS4yMDMtMS40MjJ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBSb2xsZXJDb2FzdGVyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOVY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE5VjYuOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxOXYtNy44IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDV2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxOXYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxOVY5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTlWOWE0IDQgMCAwIDEgNC00YzIgMCA0IDEuMzMgNiA0czQgNCA2IDRhNCA0IDAgMSAwLTMtNi42NSIgfV0KICAgIF07CiAgICB2YXIgUm90YXRlM2QgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNi40NjYgNy41QzE1LjY0MyA0LjIzNyAxMy45NTIgMiAxMiAyIDkuMjM5IDIgNyA2LjQ3NyA3IDEyczIuMjM5IDEwIDUgMTBjLjM0MiAwIC42NzctLjA2OSAxLS4yIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1LjE5NCAxMy43MDcgMy44MTQgMS44Ni0xLjg2IDMuODE0IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE5IDE1LjU3Yy0xLjgwNC44ODUtNC4yNzQgMS40My03IDEuNDMtNS41MjMgMC0xMC0yLjIzOS0xMC01czQuNDc3LTUgMTAtNWM0LjgzOCAwIDguODczIDEuNzE4IDkuOCA0IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBSb3NlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTBoLTFhNCA0IDAgMSAxIDQtNHYuNTM0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDZoMWE0IDQgMCAwIDEgMS40MiA3Ljc0bC0yLjI5Ljg3YTYgNiAwIDAgMS01LjMzOS0xMC42OGwyLjA2OS0xLjMxIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNNC41IDE3YzIuOC0uNSA0LjQgMCA1LjUuOHMxLjggMi4yIDIuMyAzLjdjLTIgLjQtMy41LjQtNC44LS4zLTEuMi0uNi0yLjMtMS45LTMtNC4yIiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05Ljc3IDEyQzQgMTUgMiAyMiAyIDIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTciLCBjeTogIjgiLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgUm90YXRlQ2N3S2V5ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuNSA5LjUgMSAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1LjUgOC41LTQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyYTkgOSAwIDEgMCA5LTkgOS43NCA5Ljc0IDAgMCAwLTYuNzQgMi43NEwzIDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjVoNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEwIiwgY3k6ICIxNCIsIHI6ICIyIiB9XQogICAgXTsKICAgIHZhciBSb3RhdGVDY3dTcXVhcmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCA5VjdhMiAyIDAgMCAwLTItMmgtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAyLTMgMyAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTN2NWEyIDIgMCAwIDEtMiAySDZhMiAyIDAgMCAxLTItMlY3YTIgMiAwIDAgMSAyLTJoMiIgfV0KICAgIF07CiAgICB2YXIgUm90YXRlQ2N3ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmE5IDkgMCAxIDAgOS05IDkuNzUgOS43NSAwIDAgMC02Ljc0IDIuNzRMMyA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgM3Y1aDUiIH1dCiAgICBdOwogICAgdmFyIFJvdGF0ZUN3U3F1YXJlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNUg2YTIgMiAwIDAgMC0yIDJ2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDggMy0zLTMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE0djRhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0yVjdhMiAyIDAgMCAwLTItMmgtMiIgfV0KICAgIF07CiAgICB2YXIgUm90YXRlQ3cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMmE5IDkgMCAxIDEtOS05YzIuNTIgMCA0LjkzIDEgNi43NCAyLjc0TDIxIDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgM3Y1aC01IiB9XQogICAgXTsKICAgIHZhciBSb3V0ZU9mZiA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNiIsIGN5OiAiMTkiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE5aDguNWMuNCAwIC45LS4xIDEuMy0uMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01LjIgNS4yQTMuNSAzLjUzIDAgMCAwIDYuNSAxMkgxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTUuM2EzLjUgMy41IDAgMCAwLTMuMy0zLjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgNWgtNC4zIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjUiLCByOiAiMyIgfV0KICAgIF07CiAgICB2YXIgUm91dGUgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYiLCBjeTogIjE5IiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxOWg4LjVhMy41IDMuNSAwIDAgMCAwLTdoLTExYTMuNSAzLjUgMCAwIDEgMC03SDE1IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjUiLCByOiAiMyIgfV0KICAgIF07CiAgICB2YXIgUm91dGVyID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICI4IiwgeDogIjIiLCB5OiAiMTQiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi4wMSAxOEg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjAxIDE4SDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEwdjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuODQgNy4xN2E0IDQgMCAwIDAtNS42NiAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwLjY2IDQuMzRhOCA4IDAgMCAwLTExLjMxIDAiIH1dCiAgICBdOwogICAgdmFyIFJvd3MyID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmgxOCIgfV0KICAgIF07CiAgICB2YXIgUm93czMgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA5SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTVIMyIgfV0KICAgIF07CiAgICB2YXIgUnNzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMWE5IDkgMCAwIDEgOSA5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgNGExNiAxNiAwIDAgMSAxNiAxNiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjE5IiwgcjogIjEiIH1dCiAgICBdOwogICAgdmFyIFJvd3M0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgNy41SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTJIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNi41SDMiIH1dCiAgICBdOwogICAgdmFyIFJ1bGVyRGltZW5zaW9uTGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE1di0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE1di0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE1di0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgOFY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDZIMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiA4VjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxNXYtMyIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjIiLCB5OiAiMTIiLCB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiOCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgUnVsZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMS4zIDE1LjNhMi40IDIuNCAwIDAgMSAwIDMuNGwtMi42IDIuNmEyLjQgMi40IDAgMCAxLTMuNCAwTDIuNyA4LjdhMi40MSAyLjQxIDAgMCAxIDAtMy40bDIuNi0yLjZhMi40MSAyLjQxIDAgMCAxIDMuNCAwWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC41IDEyLjUgMi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTExLjUgOS41IDItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04LjUgNi41IDItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNy41IDE1LjUgMi0yIiB9XQogICAgXTsKICAgIHZhciBTYWlsYm9hdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDJ2MTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMmE0IDQgMCAwIDEtNC00IDEgMSAwIDAgMSAxLTFoMTZhMSAxIDAgMCAxIDEgMSA0IDQgMCAwIDEtNCA0eiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTkuMTU5IDIuNDZhMSAxIDAgMCAxIDEuNTIxLS4xOTNsOS45NzcgOC45OEExIDEgMCAwIDEgMjAgMTNINGExIDEgMCAwIDEtLjgyNC0xLjU2N3oiIH0KICAgICAgXQogICAgXTsKICAgIHZhciBSdXNzaWFuUnVibGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDExaDhhNCA0IDAgMCAwIDAtOEg5djE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTVoOCIgfV0KICAgIF07CiAgICB2YXIgU2FsYWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIxaDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIxYTkgOSAwIDAgMCA5LTlIM2E5IDkgMCAwIDAgOSA5WiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMS4zOCAxMmEyLjQgMi40IDAgMCAxLS40LTQuNzcgMi40IDIuNCAwIDAgMSAzLjItMi43NyAyLjQgMi40IDAgMCAxIDMuNDctLjYzIDIuNCAyLjQgMCAwIDEgMy4zNyAzLjM3IDIuNCAyLjQgMCAwIDEtMS4xIDMuNyAyLjUxIDIuNTEgMCAwIDEgLjAzIDEuMSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMyAxMiA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAuOSA3LjI1QTMuOTkgMy45OSAwIDAgMCA0IDEwYzAgLjczLjIgMS40MS41NCAyIiB9XQogICAgXTsKICAgIHZhciBTYW5kd2ljaCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTIuMzcgMTEuMjIzIDguMzcyLTYuNzc3YTIgMiAwIDAgMSAyLjUxNiAwbDguMzcxIDYuNzc3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE1YTEgMSAwIDAgMSAxIDF2MmExIDEgMCAwIDEtMSAxaC01LjI1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTVhMSAxIDAgMCAwLTEgMXYyYTEgMSAwIDAgMCAxIDFoOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02LjY3IDE1IDYuMTMgNC42YTIgMiAwIDAgMCAyLjgtLjRsMy4xNS00LjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICI0IiwgeDogIjIiLCB5OiAiMTEiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIFNhdGVsbGl0ZURpc2ggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEwYTcuMzEgNy4zMSAwIDAgMCAxMCAxMFoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxNSAzLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTNhNiA2IDAgMCAwLTYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxM0ExMCAxMCAwIDAgMCAxMSAzIiB9XQogICAgXTsKICAgIHZhciBTYXRlbGxpdGUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xMy41IDYuNS0zLjE0OC0zLjE0OGExLjIwNSAxLjIwNSAwIDAgMC0xLjcwNCAwTDYuMzUyIDUuNjQ4YTEuMjA1IDEuMjA1IDAgMCAwIDAgMS43MDRMOS41IDEwLjUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYuNSA3LjUgMTkgNSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xNy41IDEwLjUgMy4xNDggMy4xNDhhMS4yMDUgMS4yMDUgMCAwIDEgMCAxLjcwNGwtMi4yOTYgMi4yOTZhMS4yMDUgMS4yMDUgMCAwIDEtMS43MDQgMEwxMy41IDE0LjUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAyMWE2IDYgMCAwIDAtNi02IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTkuMzUyIDEwLjY0OGExLjIwNSAxLjIwNSAwIDAgMCAwIDEuNzA0bDIuMjk2IDIuMjk2YTEuMjA1IDEuMjA1IDAgMCAwIDEuNzA0IDBsNC4yOTYtNC4yOTZhMS4yMDUgMS4yMDUgMCAwIDAgMC0xLjcwNGwtMi4yOTYtMi4yOTZhMS4yMDUgMS4yMDUgMCAwIDAtMS43MDQgMHoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFNhdWRpUml5YWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMCAxOS41LTUuNSAxLjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQuNSA0djExLjIyYTEgMSAwIDAgMCAxLjI0Mi45N0wyMCAxNS4yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIuOTc4IDE5LjM1MSA1LjU0OS0xLjM2M0EyIDIgMCAwIDAgMTAgMTZWMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxMCA0IDEzLjUiIH1dCiAgICBdOwogICAgdmFyIFNhdmVPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxM0g4YTEgMSAwIDAgMC0xIDF2NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA4aDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMjF2LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwLjQxIDIwLjQxQTIgMiAwIDAgMSAxOSAyMUg1YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgLjU5LTEuNDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjkuNSAxMS41czUgNSA0IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAzaDYuMmEyIDIgMCAwIDEgMS40LjZsMy44IDMuOGEyIDIgMCAwIDEgLjYgMS40VjE1IiB9XQogICAgXTsKICAgIHZhciBTYXZlQWxsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMnYzYTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxOHYtNmExIDEgMCAwIDAtMS0xaC02YTEgMSAwIDAgMC0xIDF2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAyMkg0YTIgMiAwIDAgMS0yLTJWNiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk04IDE4YTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDkuMTcyYTIgMiAwIDAgMSAxLjQxNC41ODZsMi44MjggMi44MjhBMiAyIDAgMCAxIDIyIDYuODI4VjE2YTIgMiAwIDAgMS0yLjAxIDJ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBTYXZlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTUuMiAzYTIgMiAwIDAgMSAxLjQuNmwzLjggMy44YTIgMiAwIDAgMSAuNiAxLjRWMTlhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAyMXYtN2ExIDEgMCAwIDAtMS0xSDhhMSAxIDAgMCAwLTEgMXY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgM3Y0YTEgMSAwIDAgMCAxIDFoNyIgfV0KICAgIF07CiAgICB2YXIgU2NhbGUzZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgN3YxMWExIDEgMCAwIDAgMSAxaDExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUuMjkzIDE4LjcwNyAxMSAxMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE5IiwgY3k6ICIxOSIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNSIsIGN5OiAiNSIsIHI6ICIyIiB9XQogICAgXTsKICAgIHZhciBTY2FsZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDN2MTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkgOCAzIDhhNSA1IDAgMCAxLTYgMHpWNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDdoMWExNyAxNyAwIDAgMCA4LTIgMTcgMTcgMCAwIDAgOCAyaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNSA4IDMgOGE1IDUgMCAwIDEtNiAwelY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjFoMTAiIH1dCiAgICBdOwogICAgdmFyIFNjYWxpbmcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAzSDVhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDE0YTIgMiAwIDAgMCAyLTJ2LTciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTVIOXYtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAzaDV2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAzIDkgMTUiIH1dCiAgICBdOwogICAgdmFyIFNjYW5CYXJjb2RlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA3VjVhMiAyIDAgMCAxIDItMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDNoMmEyIDIgMCAwIDEgMiAydjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTd2MmEyIDIgMCAwIDEtMiAyaC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjFINWEyIDIgMCAwIDEtMi0ydi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggN3YxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA3djEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDd2MTAiIH1dCiAgICBdOwogICAgdmFyIFNjYW5FeWUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDdWNWEyIDIgMCAwIDEgMi0yaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgM2gyYTIgMiAwIDAgMSAyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxN3YyYTIgMiAwIDAgMS0yIDJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMUg1YTIgMiAwIDAgMS0yLTJ2LTIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOC45NDQgMTIuMzNhMSAxIDAgMCAwIDAtLjY2IDcuNSA3LjUgMCAwIDAtMTMuODg4IDAgMSAxIDAgMCAwIDAgLjY2IDcuNSA3LjUgMCAwIDAgMTMuODg4IDAiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFNjYW5GYWNlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA3VjVhMiAyIDAgMCAxIDItMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDNoMmEyIDIgMCAwIDEgMiAydjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTd2MmEyIDIgMCAwIDEtMiAyaC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjFINWEyIDIgMCAwIDEtMi0ydi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTRzMS41IDIgNCAyIDQtMiA0LTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA5aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA5aC4wMSIgfV0KICAgIF07CiAgICB2YXIgU2NhbkhlYXJ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgM2gyYTIgMiAwIDAgMSAyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxN3YyYTIgMiAwIDAgMS0yIDJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA3VjVhMiAyIDAgMCAxIDItMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjFINWEyIDIgMCAwIDEtMi0ydi0yIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNNy44MjggMTMuMDdBMyAzIDAgMCAxIDEyIDguNzY0YTMgMyAwIDAgMSA0LjE3MiA0LjMwNmwtMy40NDcgMy42MmExIDEgMCAwIDEtMS40NDkgMHoiIH0KICAgICAgXQogICAgXTsKICAgIHZhciBTY2FuTGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgN1Y1YTIgMiAwIDAgMSAyLTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAzaDJhMiAyIDAgMCAxIDIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE3djJhMiAyIDAgMCAxLTIgMmgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIxSDVhMiAyIDAgMCAxLTItMnYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEyaDEwIiB9XQogICAgXTsKICAgIHZhciBTY2FuUXJDb2RlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTJ2NGExIDEgMCAwIDEtMSAxaC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDNoMmEyIDIgMCAwIDEgMiAydjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgOFY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE3djJhMiAyIDAgMCAxLTIgMmgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDdWNWEyIDIgMCAwIDEgMi0yaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxN2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMUg1YTIgMiAwIDAgMS0yLTJ2LTIiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI3IiwgeTogIjciLCB3aWR0aDogIjUiLCBoZWlnaHQ6ICI1Iiwgcng6ICIxIiB9XQogICAgXTsKICAgIHZhciBTY2FuU2VhcmNoID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA3VjVhMiAyIDAgMCAxIDItMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDNoMmEyIDIgMCAwIDEgMiAydjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTd2MmEyIDIgMCAwIDEtMiAyaC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjFINWEyIDIgMCAwIDEtMi0ydi0yIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTYtMS45LTEuOSIgfV0KICAgIF07CiAgICB2YXIgU2NhbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgN1Y1YTIgMiAwIDAgMSAyLTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAzaDJhMiAyIDAgMCAxIDIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE3djJhMiAyIDAgMCAxLTIgMmgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIxSDVhMiAyIDAgMCAxLTItMnYtMiIgfV0KICAgIF07CiAgICB2YXIgU2NhblRleHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDdWNWEyIDIgMCAwIDEgMi0yaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgM2gyYTIgMiAwIDAgMSAyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxN3YyYTIgMiAwIDAgMS0yIDJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMUg1YTIgMiAwIDAgMS0yLTJ2LTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyA4aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMmgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE2aDYiIH1dCiAgICBdOwogICAgdmFyIFNjaG9vbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDIxdi0zYTIgMiAwIDAgMC00IDB2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA1djE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTQgNiA3LjEwNi0zLjc5YTIgMiAwIDAgMSAxLjc4OCAwTDIwIDYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtNiAxMS0zLjUyIDIuMTQ3YTEgMSAwIDAgMC0uNDguODU0VjE5YTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMnYtNWExIDEgMCAwIDAtLjQ4LS44NTNMMTggMTEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA1djE2IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjkiLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgU2Npc3NvcnMgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYiLCBjeTogIjYiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjEyIDguMTIgMTIgMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgNCA4LjEyIDE1Ljg4IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNiIsIGN5OiAiMTgiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNC44IDE0LjggMjAgMjAiIH1dCiAgICBdOwogICAgdmFyIFNjaXNzb3JzTGluZURhc2hlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUuNDIgOS40MiA4IDEyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNCIsIGN5OiAiOCIsIHI6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDYtOC41OCA4LjU4IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNCIsIGN5OiAiMTYiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC44IDE0LjggMTQgMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTJoLTIiIH1dCiAgICBdOwogICAgdmFyIFNjb290ZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA0aC0zLjVsMiAxMS4wNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02Ljk1IDE3aDUuMTQyYy41MjMgMCAuOTUtLjQwNiAxLjA2My0uOTE2YTYuNSA2LjUgMCAwIDEgNS4zNDUtNS4wMDkiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOS41IiwgY3k6ICIxNy41IiwgcjogIjIuNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjQuNSIsIGN5OiAiMTcuNSIsIHI6ICIyLjUiIH1dCiAgICBdOwogICAgdmFyIFNjcmVlblNoYXJlT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgM0g0YTIgMiAwIDAgMC0yIDJ2MTBhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0ydi0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjFoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN3Y0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDMtNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDMgNSA1IiB9XQogICAgXTsKICAgIHZhciBTY3JlZW5TaGFyZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDNINGEyIDIgMCAwIDAtMiAydjEwYTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMnYtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIxaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTd2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyA4IDUtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAzaDV2NSIgfV0KICAgIF07CiAgICB2YXIgU2Nyb2xsVGV4dCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEyaC01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDhoLTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMTdWNWEyIDIgMCAwIDAtMi0ySDQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOCAyMWgxMmEyIDIgMCAwIDAgMi0ydi0xYTEgMSAwIDAgMC0xLTFIMTFhMSAxIDAgMCAwLTEgMXYxYTIgMiAwIDEgMS00IDBWNWEyIDIgMCAxIDAtNCAwdjJhMSAxIDAgMCAwIDEgMWgzIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBTY3JvbGwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxN1Y1YTIgMiAwIDAgMC0yLTJINCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk04IDIxaDEyYTIgMiAwIDAgMCAyLTJ2LTFhMSAxIDAgMCAwLTEtMUgxMWExIDEgMCAwIDAtMSAxdjFhMiAyIDAgMSAxLTQgMFY1YTIgMiAwIDEgMC00IDB2MmExIDEgMCAwIDAgMSAxaDMiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFNlYXJjaEFsZXJ0ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMSIsIGN5OiAiMTEiLCByOiAiOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAyMS00LjMtNC4zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDd2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxNWguMDEiIH1dCiAgICBdOwogICAgdmFyIFNlYXJjaENoZWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAxMSAyIDIgNC00IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTEiLCBjeTogIjExIiwgcjogIjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMjEtNC4zLTQuMyIgfV0KICAgIF07CiAgICB2YXIgU2VhcmNoQ29kZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEzIDEzLjUgMi0yLjUtMi0yLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMjEtNC4zLTQuMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDguNSA3IDExbDIgMi41IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTEiLCBjeTogIjExIiwgcjogIjgiIH1dCiAgICBdOwogICAgdmFyIFNlYXJjaFNsYXNoID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMuNSA4LjUtNSA1IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTEiLCBjeTogIjExIiwgcjogIjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMjEtNC4zLTQuMyIgfV0KICAgIF07CiAgICB2YXIgU2VhcmNoWCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEzLjUgOC41LTUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04LjUgOC41IDUgNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjExIiwgY3k6ICIxMSIsIHI6ICI4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDIxLTQuMy00LjMiIH1dCiAgICBdOwogICAgdmFyIFNlYXJjaCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDIxLTQuMzQtNC4zNCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjExIiwgY3k6ICIxMSIsIHI6ICI4IiB9XQogICAgXTsKICAgIHZhciBTZWN0aW9uID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNWE0IDMgMCAwIDAtOCAwYzAgNCA4IDMgOCA3YTQgMyAwIDAgMS04IDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxOWE0IDMgMCAwIDAgOCAwYzAtNC04LTMtOC03YTQgMyAwIDAgMSA4IDAiIH1dCiAgICBdOwogICAgdmFyIFNlbmRIb3Jpem9udGFsID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy43MTQgMy4wNDhhLjQ5OC40OTggMCAwIDAtLjY4My42MjdsMi44NDMgNy42MjdhMiAyIDAgMCAxIDAgMS4zOTZsLTIuODQyIDcuNjI3YS40OTguNDk4IDAgMCAwIC42ODIuNjI3bDE4LTguNWEuNS41IDAgMCAwIDAtLjkwNHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxMmgxNiIgfV0KICAgIF07CiAgICB2YXIgU2VuZFRvQmFjayA9IFsKICAgICAgWyJyZWN0IiwgeyB4OiAiMTQiLCB5OiAiMTQiLCB3aWR0aDogIjgiLCBoZWlnaHQ6ICI4Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMiIsIHk6ICIyIiwgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiOCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE0djFhMiAyIDAgMCAwIDIgMmgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDdoMWEyIDIgMCAwIDEgMiAydjEiIH1dCiAgICBdOwogICAgdmFyIFNlbmQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNC41MzYgMjEuNjg2YS41LjUgMCAwIDAgLjkzNy0uMDI0bDYuNS0xOWEuNDk2LjQ5NiAwIDAgMC0uNjM1LS42MzVsLTE5IDYuNWEuNS41IDAgMCAwLS4wMjQuOTM3bDcuOTMgMy4xOGEyIDIgMCAwIDEgMS4xMTIgMS4xMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEuODU0IDIuMTQ3LTEwLjk0IDEwLjkzOSIgfV0KICAgIF07CiAgICB2YXIgU2VwYXJhdG9ySG9yaXpvbnRhbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDE2LTQgNC00LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDggNC00IDQgNCIgfV0KICAgIF07CiAgICB2YXIgU2VwYXJhdG9yVmVydGljYWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAzdjE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDE2IDQtNC00LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCA4LTQgNCA0IDQiIH1dCiAgICBdOwogICAgdmFyIFNlcnZlckNvZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEwLjg1MiAxNC43NzItLjM4My45MjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMuMTQ4IDE0Ljc3MmEzIDMgMCAxIDAtMi4yOTYtNS41NDRsLS4zODMtLjkyMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMy4xNDggOS4yMjguMzgzLS45MjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMuNTMgMTUuNjk2LS4zODItLjkyNGEzIDMgMCAxIDEtMi4yOTYtNS41NDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuNzcyIDEwLjg1Mi45MjMtLjM4MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC43NzIgMTMuMTQ4LjkyMy4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC41IDEwSDRhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnY0YTIgMiAwIDAgMS0yIDJoLS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQuNSAxNEg0YTIgMiAwIDAgMC0yIDJ2NGEyIDIgMCAwIDAgMiAyaDE2YTIgMiAwIDAgMCAyLTJ2LTRhMiAyIDAgMCAwLTItMmgtLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA2aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05LjIyOCAxMC44NTItLjkyMy0uMzgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkuMjI4IDEzLjE0OC0uOTIzLjM4MyIgfV0KICAgIF07CiAgICB2YXIgU2VydmVyQ3Jhc2ggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEwSDRhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnY0YTIgMiAwIDAgMS0yIDJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxNEg0YTIgMiAwIDAgMC0yIDJ2NGEyIDIgMCAwIDAgMiAyaDE2YTIgMiAwIDAgMCAyLTJ2LTRhMiAyIDAgMCAwLTItMmgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDZoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMThoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEzIDYtNCA2aDZsLTQgNiIgfV0KICAgIF07CiAgICB2YXIgU2VydmVyT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyaDEzYTIgMiAwIDAgMSAyIDJ2NGEyIDIgMCAwIDEtMiAyaC01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEwIDIuNSAyLjVDMiAyIDIgMi41IDIgNXYzYTIgMiAwIDAgMCAyIDJoNnoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTd2LTFhMiAyIDAgMCAwLTItMmgtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE0YTIgMiAwIDAgMC0yIDJ2NGEyIDIgMCAwIDAgMiAyaDE2LjVsMS0uNS41LjUtOC04SDR6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMThoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0KICAgIF07CiAgICB2YXIgU2VydmVyID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICI4IiwgeDogIjIiLCB5OiAiMiIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjgiLCB4OiAiMiIsIHk6ICIxNCIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI2IiwgeDI6ICI2LjAxIiwgeTE6ICI2IiwgeTI6ICI2IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjYiLCB4MjogIjYuMDEiLCB5MTogIjE4IiwgeTI6ICIxOCIgfV0KICAgIF07CiAgICB2YXIgU2V0dGluZ3MyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTdINSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSA3aC05IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTciLCBjeTogIjE3IiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI3IiwgY3k6ICI3IiwgcjogIjMiIH1dCiAgICBdOwogICAgdmFyIFNldHRpbmdzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOS42NzEgNC4xMzZhMi4zNCAyLjM0IDAgMCAxIDQuNjU5IDAgMi4zNCAyLjM0IDAgMCAwIDMuMzE5IDEuOTE1IDIuMzQgMi4zNCAwIDAgMSAyLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMCAwIDMuODMxIDIuMzQgMi4zNCAwIDAgMS0yLjMzIDQuMDMzIDIuMzQgMi4zNCAwIDAgMC0zLjMxOSAxLjkxNSAyLjM0IDIuMzQgMCAwIDEtNC42NTkgMCAyLjM0IDIuMzQgMCAwIDAtMy4zMi0xLjkxNSAyLjM0IDIuMzQgMCAwIDEtMi4zMy00LjAzMyAyLjM0IDIuMzQgMCAwIDAgMC0zLjgzMUEyLjM0IDIuMzQgMCAwIDEgNi4zNSA2LjA1MWEyLjM0IDIuMzQgMCAwIDAgMy4zMTktMS45MTUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMyIgfV0KICAgIF07CiAgICB2YXIgU2hhcGVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOC4zIDEwYS43LjcgMCAwIDEtLjYyNi0xLjA3OUwxMS40IDNhLjcuNyAwIDAgMSAxLjE5OC0uMDQzTDE2LjMgOC45YS43LjcgMCAwIDEtLjU3MiAxLjFaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICIxNCIsIHdpZHRoOiAiNyIsIGhlaWdodDogIjciLCByeDogIjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNy41IiwgY3k6ICIxNy41IiwgcjogIjMuNSIgfV0KICAgIF07CiAgICB2YXIgU2hhcmUyID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiNSIsIHI6ICIzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNiIsIGN5OiAiMTIiLCByOiAiMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICIxOSIsIHI6ICIzIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjguNTkiLCB4MjogIjE1LjQyIiwgeTE6ICIxMy41MSIsIHkyOiAiMTcuNDkiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTUuNDEiLCB4MjogIjguNTkiLCB5MTogIjYuNTEiLCB5MjogIjEwLjQ5IiB9XQogICAgXTsKICAgIHZhciBTaGFyZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgNi00LTQtNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTJ2OGEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAyLTJ2LTgiIH1dCiAgICBdOwogICAgdmFyIFNoZWV0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMyIsIHgyOiAiMjEiLCB5MTogIjkiLCB5MjogIjkiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMyIsIHgyOiAiMjEiLCB5MTogIjE1IiwgeTI6ICIxNSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI5IiwgeDI6ICI5IiwgeTE6ICI5IiwgeTI6ICIyMSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNSIsIHgyOiAiMTUiLCB5MTogIjkiLCB5MjogIjIxIiB9XQogICAgXTsKICAgIHZhciBTaGVsbCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE0IDExYTIgMiAwIDEgMS00IDAgNCA0IDAgMCAxIDggMCA2IDYgMCAwIDEtMTIgMCA4IDggMCAwIDEgMTYgMCAxMCAxMCAwIDEgMS0yMCAwIDExLjkzIDExLjkzIDAgMCAxIDIuNDItNy4yMiAyIDIgMCAxIDEgMy4xNiAyLjQ0IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBTaGllbGRBbGVydCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDEzYzAgNS0zLjUgNy41LTcuNjYgOC45NWExIDEgMCAwIDEtLjY3LS4wMUM3LjUgMjAuNSA0IDE4IDQgMTNWNmExIDEgMCAwIDEgMS0xYzIgMCA0LjUtMS4yIDYuMjQtMi43MmExLjE3IDEuMTcgMCAwIDEgMS41MiAwQzE0LjUxIDMuODEgMTcgNSAxOSA1YTEgMSAwIDAgMSAxIDF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDh2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNmguMDEiIH1dCiAgICBdOwogICAgdmFyIFNoaWVsZEJhbiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDEzYzAgNS0zLjUgNy41LTcuNjYgOC45NWExIDEgMCAwIDEtLjY3LS4wMUM3LjUgMjAuNSA0IDE4IDQgMTNWNmExIDEgMCAwIDEgMS0xYzIgMCA0LjUtMS4yIDYuMjQtMi43MmExLjE3IDEuMTcgMCAwIDEgMS41MiAwQzE0LjUxIDMuODEgMTcgNSAxOSA1YTEgMSAwIDAgMSAxIDF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTQuMjQzIDUuMjEgMTQuMzkgMTIuNDcyIiB9XQogICAgXTsKICAgIHZhciBTaGllbGRDaGVjayA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDEzYzAgNS0zLjUgNy41LTcuNjYgOC45NWExIDEgMCAwIDEtLjY3LS4wMUM3LjUgMjAuNSA0IDE4IDQgMTNWNmExIDEgMCAwIDEgMS0xYzIgMCA0LjUtMS4yIDYuMjQtMi43MmExLjE3IDEuMTcgMCAwIDEgMS41MiAwQzE0LjUxIDMuODEgMTcgNSAxOSA1YTEgMSAwIDAgMSAxIDF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTIgMiAyIDQtNCIgfV0KICAgIF07CiAgICB2YXIgU2hpZWxkRWxsaXBzaXMgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAxM2MwIDUtMy41IDcuNS03LjY2IDguOTVhMSAxIDAgMCAxLS42Ny0uMDFDNy41IDIwLjUgNCAxOCA0IDEzVjZhMSAxIDAgMCAxIDEtMWMyIDAgNC41LTEuMiA2LjI0LTIuNzJhMS4xNyAxLjE3IDAgMCAxIDEuNTIgMEMxNC41MSAzLjgxIDE3IDUgMTkgNWExIDEgMCAwIDEgMSAxeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEyaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTJoLjAxIiB9XQogICAgXTsKICAgIHZhciBTaGllbGRNaW51cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDEzYzAgNS0zLjUgNy41LTcuNjYgOC45NWExIDEgMCAwIDEtLjY3LS4wMUM3LjUgMjAuNSA0IDE4IDQgMTNWNmExIDEgMCAwIDEgMS0xYzIgMCA0LjUtMS4yIDYuMjQtMi43MmExLjE3IDEuMTcgMCAwIDEgMS41MiAwQzE0LjUxIDMuODEgMTcgNSAxOSA1YTEgMSAwIDAgMSAxIDF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTJoNiIgfV0KICAgIF07CiAgICB2YXIgU2hpZWxkT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTUgNWExIDEgMCAwIDAtMSAxdjdjMCA1IDMuNSA3LjUgNy42NyA4Ljk0YTEgMSAwIDAgMCAuNjcuMDFjMi4zNS0uODIgNC40OC0xLjk3IDUuOS0zLjcxIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTkuMzA5IDMuNjUyQTEyLjI1MiAxMi4yNTIgMCAwIDAgMTEuMjQgMi4yOGExLjE3IDEuMTcgMCAwIDEgMS41MiAwQzE0LjUxIDMuODEgMTcgNSAxOSA1YTEgMSAwIDAgMSAxIDF2N2E5Ljc4NCA5Ljc4NCAwIDAgMS0uMDggMS4yNjQiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFNoaWVsZEhhbGYgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAxM2MwIDUtMy41IDcuNS03LjY2IDguOTVhMSAxIDAgMCAxLS42Ny0uMDFDNy41IDIwLjUgNCAxOCA0IDEzVjZhMSAxIDAgMCAxIDEtMWMyIDAgNC41LTEuMiA2LjI0LTIuNzJhMS4xNyAxLjE3IDAgMCAxIDEuNTIgMEMxNC41MSAzLjgxIDE3IDUgMTkgNWExIDEgMCAwIDEgMSAxeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMlYyIiB9XQogICAgXTsKICAgIHZhciBTaGllbGRQbHVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMTNjMCA1LTMuNSA3LjUtNy42NiA4Ljk1YTEgMSAwIDAgMS0uNjctLjAxQzcuNSAyMC41IDQgMTggNCAxM1Y2YTEgMSAwIDAgMSAxLTFjMiAwIDQuNS0xLjIgNi4yNC0yLjcyYTEuMTcgMS4xNyAwIDAgMSAxLjUyIDBDMTQuNTEgMy44MSAxNyA1IDE5IDVhMSAxIDAgMCAxIDEgMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMmg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDl2NiIgfV0KICAgIF07CiAgICB2YXIgU2hpZWxkUXVlc3Rpb25NYXJrID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMTNjMCA1LTMuNSA3LjUtNy42NiA4Ljk1YTEgMSAwIDAgMS0uNjctLjAxQzcuNSAyMC41IDQgMTggNCAxM1Y2YTEgMSAwIDAgMSAxLTFjMiAwIDQuNS0xLjIgNi4yNC0yLjcyYTEuMTcgMS4xNyAwIDAgMSAxLjUyIDBDMTQuNTEgMy44MSAxNyA1IDE5IDVhMSAxIDAgMCAxIDEgMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS4xIDlhMyAzIDAgMCAxIDUuODIgMWMwIDItMyAzLTMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN2guMDEiIH1dCiAgICBdOwogICAgdmFyIFNoaWVsZFggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAxM2MwIDUtMy41IDcuNS03LjY2IDguOTVhMSAxIDAgMCAxLS42Ny0uMDFDNy41IDIwLjUgNCAxOCA0IDEzVjZhMSAxIDAgMCAxIDEtMWMyIDAgNC41LTEuMiA2LjI0LTIuNzJhMS4xNyAxLjE3IDAgMCAxIDEuNTIgMEMxNC41MSAzLjgxIDE3IDUgMTkgNWExIDEgMCAwIDEgMSAxeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC41IDkuNS01IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOS41IDkuNSA1IDUiIH1dCiAgICBdOwogICAgdmFyIFNoaWVsZFVzZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAxM2MwIDUtMy41IDcuNS03LjY2IDguOTVhMSAxIDAgMCAxLS42Ny0uMDFDNy41IDIwLjUgNCAxOCA0IDEzVjZhMSAxIDAgMCAxIDEtMWMyIDAgNC41LTEuMiA2LjI0LTIuNzJhMS4xNyAxLjE3IDAgMCAxIDEuNTIgMEMxNC41MSAzLjgxIDE3IDUgMTkgNWExIDEgMCAwIDEgMSAxeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjM3NiAxOC45MWE2IDYgMCAwIDEgMTEuMjQ5LjAwMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMSIsIHI6ICI0IiB9XQogICAgXTsKICAgIHZhciBTaGllbGQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAxM2MwIDUtMy41IDcuNS03LjY2IDguOTVhMSAxIDAgMCAxLS42Ny0uMDFDNy41IDIwLjUgNCAxOCA0IDEzVjZhMSAxIDAgMCAxIDEtMWMyIDAgNC41LTEuMiA2LjI0LTIuNzJhMS4xNyAxLjE3IDAgMCAxIDEuNTIgMEMxNC41MSAzLjgxIDE3IDUgMTkgNWExIDEgMCAwIDEgMSAxeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgU2hpcFdoZWVsID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjcuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOSA1LTUuMjMgNS4yMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxMmgtNy41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5IDE5LTUuMjMtNS4yMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNC41VjIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjIzIDEzLjc3IDUgMTkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS41IDEySDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAuMjMgMTAuMjMgNSA1IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjIuNSIgfV0KICAgIF07CiAgICB2YXIgU2hpcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEwLjE4OVYxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMTNWN2EyIDIgMCAwIDAtMi0ySDdhMiAyIDAgMCAwLTIgMnY2IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE5LjM4IDIwQTExLjYgMTEuNiAwIDAgMCAyMSAxNGwtOC4xODgtMy42MzlhMiAyIDAgMCAwLTEuNjI0IDBMMyAxNGExMS42IDExLjYgMCAwIDAgMi44MSA3Ljc2IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIgMjFjLjYuNSAxLjIgMSAyLjUgMSAyLjUgMCAyLjUtMiA1LTIgMS4zIDAgMS45LjUgMi41IDFzMS4yIDEgMi41IDFjMi41IDAgMi41LTIgNS0yIDEuMyAwIDEuOS41IDIuNSAxIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBTaGlydCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwLjM4IDMuNDYgMTYgMmE0IDQgMCAwIDEtOCAwTDMuNjIgMy40NmEyIDIgMCAwIDAtMS4zNCAyLjIzbC41OCAzLjQ3YTEgMSAwIDAgMCAuOTkuODRINnYxMGMwIDEuMS45IDIgMiAyaDhhMiAyIDAgMCAwIDItMlYxMGgyLjE1YTEgMSAwIDAgMCAuOTktLjg0bC41OC0zLjQ3YTIgMiAwIDAgMC0xLjM0LTIuMjN6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBTaG9wcGluZ0JhZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEwYTQgNCAwIDAgMS04IDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy4xMDMgNi4wMzRoMTcuNzk0IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMuNCA1LjQ2N2EyIDIgMCAwIDAtLjQgMS4yVjIwYTIgMiAwIDAgMCAyIDJoMTRhMiAyIDAgMCAwIDItMlY2LjY2N2EyIDIgMCAwIDAtLjQtMS4ybC0yLTIuNjY3QTIgMiAwIDAgMCAxNyAySDdhMiAyIDAgMCAwLTEuNi44eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgU2hvcHBpbmdCYXNrZXQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxMS0xIDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkgMTEtNC03IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTFoMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMy41IDExIDEuNiA3LjRhMiAyIDAgMCAwIDIgMS42aDkuOGEyIDIgMCAwIDAgMi0xLjZsMS43LTcuNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00LjUgMTUuNWgxNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01IDExIDQtNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDExIDEgOSIgfV0KICAgIF07CiAgICB2YXIgU2hvcHBpbmdDYXJ0ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICI4IiwgY3k6ICIyMSIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTkiLCBjeTogIjIxIiwgcjogIjEiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk0yLjA1IDIuMDVoMmwyLjY2IDEyLjQyYTIgMiAwIDAgMCAyIDEuNThoOS43OGEyIDIgMCAwIDAgMS45NS0xLjU3bDEuNjUtNy40M0g1LjEyIiB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgU2hvd2VySGVhZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTQgNCAyLjUgMi41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjUgNi41YTQuOTUgNC45NSAwIDAgMC03IDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgNSA1IDE1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE3di4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxNnYuMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMTN2LjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEwdi4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAyMHYuMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTR2LjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDExdi4wMSIgfV0KICAgIF07CiAgICB2YXIgU2hyZWRkZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTQgMTNWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNi43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djUiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMjJ2LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTl2LTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMjB2LTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxM2gyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDIwdi0zIiB9XQogICAgXTsKICAgIHZhciBTaG92ZWwgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMS41NiA0LjU2YTEuNSAxLjUgMCAwIDEgMCAyLjEyMmwtLjQ3LjQ3YTMgMyAwIDAgMS00LjIxMi0uMDMgMyAzIDAgMCAxIDAtNC4yNDNsLjQ0LS40NGExLjUgMS41IDAgMCAxIDIuMTIxIDB6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMgMjJhMSAxIDAgMCAxLTEtMXYtMy41ODZhMSAxIDAgMCAxIC4yOTMtLjcwN2wzLjM1NS0zLjM1NWExLjIwNSAxLjIwNSAwIDAgMSAxLjcwNCAwbDMuMjk2IDMuMjk2YTEuMjA1IDEuMjA1IDAgMCAxIDAgMS43MDRsLTMuMzU1IDMuMzU1YTEgMSAwIDAgMS0uNzA3LjI5M3oiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxNSA3Ljg3OS03Ljg3OCIgfV0KICAgIF07CiAgICB2YXIgU2hyaW1wID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDIyYy41LS41IDEuMTItMSAyLjUtMS0xLjM4IDAtMi0uNS0yLjUtMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNCAyYTMuMjggMy4yOCAwIDAgMS0zLjIyNyAxLjc5OGwtNi4xNy0uNTYxQTIuMzg3IDIuMzg3IDAgMSAwIDQuMzg3IDhIMTUuNWExIDEgMCAwIDEgMCAxMyAxIDEgMCAwIDAgMC01SDEyYTcgNyAwIDAgMS03LTdWOCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA4YTguNSA4LjUgMCAwIDEgMCA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE2YzIgMCA0LjUtNCA0LTYiIH1dCiAgICBdOwogICAgdmFyIFNocmluayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDE1IDYgNm0tNi02djQuOG0wLTQuOGg0LjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxOS44VjE1bTAgMEg0LjJNOSAxNWwtNiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDQuMlY5bTAgMGg0LjhNMTUgOWw2LTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA0LjJWOW0wIDBINC4yTTkgOSAzIDMiIH1dCiAgICBdOwogICAgdmFyIFNocnViID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjJ2LTUuMTcyYTIgMiAwIDAgMC0uNTg2LTEuNDE0TDkuNSAxMy41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0LjUgMTQuNSAxMiAxNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyA4LjhBNiA2IDAgMCAxIDEzLjggMjBIMTBBNi41IDYuNSAwIDAgMSA3IDhhNSA1IDAgMCAxIDEwIDB6IiB9XQogICAgXTsKICAgIHZhciBTaHVmZmxlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMTQgNCA0LTQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOCAyIDQgNC00IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxOGgxLjk3M2E0IDQgMCAwIDAgMy4zLTEuN2w1LjQ1NC04LjZhNCA0IDAgMCAxIDMuMy0xLjdIMjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA2aDEuOTcyYTQgNCAwIDAgMSAzLjYgMi4yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE4aC02LjA0MWE0IDQgMCAwIDEtMy4zLTEuOGwtLjM1OS0uNDUiIH1dCiAgICBdOwogICAgdmFyIFNpZ21hID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTggN1Y1YTEgMSAwIDAgMC0xLTFINi41YS41LjUgMCAwIDAtLjQuOGw0LjUgNmEyIDIgMCAwIDEgMCAyLjRsLTQuNSA2YS41LjUgMCAwIDAgLjQuOEgxN2ExIDEgMCAwIDAgMS0xdi0yIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBTaWduYWxIaWdoID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMHYtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMHYtOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAyMFY4IiB9XQogICAgXTsKICAgIHZhciBTaWduYWxMb3cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIwaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIwdi00IiB9XQogICAgXTsKICAgIHZhciBTaWduYWxNZWRpdW0gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIwaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIwdi00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIwdi04IiB9XQogICAgXTsKICAgIHZhciBTaWduYWxaZXJvID0gW1sicGF0aCIsIHsgZDogIk0yIDIwaC4wMSIgfV1dOwogICAgdmFyIFNpZ25hbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjBoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjB2LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjB2LTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMjBWOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiA0djE2IiB9XQogICAgXTsKICAgIHZhciBTaWduYXR1cmUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0yMSAxNy0yLjE1Ni0xLjg2OEEuNS41IDAgMCAwIDE4IDE1LjV2LjVhMSAxIDAgMCAxLTEgMWgtMmExIDEgMCAwIDEtMS0xYzAtMi41NDUtMy45OTEtMy45Ny04LjUtNGExIDEgMCAwIDAgMCA1YzQuMTUzIDAgNC43NDUtMTEuMjk1IDUuNzA4LTEzLjVhMi41IDIuNSAwIDEgMSAzLjMxIDMuMjg0IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMjFoMTgiIH1dCiAgICBdOwogICAgdmFyIFNpZ25wb3N0QmlnID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOUg0TDIgN2wyLTJoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA1aDZsMiAyLTIgMmgtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAyMlY0YTIgMiAwIDEgMSA0IDB2MTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAyMmg4IiB9XQogICAgXTsKICAgIHZhciBTaWducG9zdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEzdjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgM3YzIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE4IDZhMiAyIDAgMCAxIDEuMzg3LjU2bDIuMzA3IDIuMjJhMSAxIDAgMCAxIDAgMS40NGwtMi4zMDcgMi4yMkEyIDIgMCAwIDEgMTggMTNINmEyIDIgMCAwIDEtMS4zODctLjU2bC0yLjMwNi0yLjIyYTEgMSAwIDAgMSAwLTEuNDRsMi4zMDYtMi4yMkEyIDIgMCAwIDEgNiA2eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgU2lyZW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE4di02YTUgNSAwIDEgMSAxMCAwdjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMWExIDEgMCAwIDAgMSAxaDEyYTEgMSAwIDAgMCAxLTF2LTFhMiAyIDAgMCAwLTItMkg3YTIgMiAwIDAgMC0yIDJ6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEyaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTguNSA0LjUgMTggNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEyaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTQuOTI5IDQuOTI5LjcwNy43MDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJ2NiIgfV0KICAgIF07CiAgICB2YXIgU2tpcEJhY2sgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNy45NzEgNC4yODVBMiAyIDAgMCAxIDIxIDZ2MTJhMiAyIDAgMCAxLTMuMDI5IDEuNzE1bC05Ljk5Ny01Ljk5OGEyIDIgMCAwIDEtLjAwMy0zLjQzMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAyMFY0IiB9XQogICAgXTsKICAgIHZhciBTa2lwRm9yd2FyZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDR2MTYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk02LjAyOSA0LjI4NUEyIDIgMCAwIDAgMyA2djEyYTIgMiAwIDAgMCAzLjAyOSAxLjcxNWw5Ljk5Ny01Ljk5OGEyIDIgMCAwIDAgLjAwMy0zLjQzMnoiIH0KICAgICAgXQogICAgXTsKICAgIHZhciBTa3VsbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyLjUgMTctLjUtMS0uNSAxaDF6IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE1IDIyYTEgMSAwIDAgMCAxLTF2LTFhMiAyIDAgMCAwIDEuNTYtMy4yNSA4IDggMCAxIDAtMTEuMTIgMEEyIDIgMCAwIDAgOCAyMHYxYTEgMSAwIDAgMCAxIDF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTUiLCBjeTogIjEyIiwgcjogIjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICIxMiIsIHI6ICIxIiB9XQogICAgXTsKICAgIHZhciBTbGFjayA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjMiLCBoZWlnaHQ6ICI4IiwgeDogIjEzIiwgeTogIjIiLCByeDogIjEuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSA4LjVWMTBoMS41QTEuNSAxLjUgMCAxIDAgMTkgOC41IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjMiLCBoZWlnaHQ6ICI4IiwgeDogIjgiLCB5OiAiMTQiLCByeDogIjEuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE1LjVWMTRIMy41QTEuNSAxLjUgMCAxIDAgNSAxNS41IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICIzIiwgeDogIjE0IiwgeTogIjEzIiwgcng6ICIxLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUuNSAxOUgxNHYxLjVhMS41IDEuNSAwIDEgMCAxLjUtMS41IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICIzIiwgeDogIjIiLCB5OiAiOCIsIHJ4OiAiMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguNSA1SDEwVjMuNUExLjUgMS41IDAgMSAwIDguNSA1IiB9XQogICAgXTsKICAgIHZhciBTbGFzaCA9IFtbInBhdGgiLCB7IGQ6ICJNMjIgMiAyIDIyIiB9XV07CiAgICB2YXIgU2xpZGVyc1ZlcnRpY2FsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIxdi05IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDhWMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxNmg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDEyVjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMjF2LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxNGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTBWMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDIxdi03IiB9XQogICAgXTsKICAgIHZhciBTbGljZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTExIDE2LjU4NlYxOWExIDEgMCAwIDEtMSAxSDJMMTguMzcgMy42M2ExIDEgMCAxIDEgMyAzbC05LjY2MyA5LjY2M2ExIDEgMCAwIDEtMS40MTQgMEw4IDE0IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBTbGlkZXJzSG9yaXpvbnRhbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDVIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOUgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDN2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxN3Y0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEyaC05IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE5aC01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDVoLTciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMHY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJIMyIgfV0KICAgIF07CiAgICB2YXIgU21hcnRwaG9uZUNoYXJnaW5nID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTQiLCBoZWlnaHQ6ICIyMCIsIHg6ICI1IiwgeTogIjIiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIuNjY3IDggMTAgMTJoNGwtMi42NjcgNCIgfV0KICAgIF07CiAgICB2YXIgU21hcnRwaG9uZSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE0IiwgaGVpZ2h0OiAiMjAiLCB4OiAiNSIsIHk6ICIyIiwgcng6ICIyIiwgcnk6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4aC4wMSIgfV0KICAgIF07CiAgICB2YXIgU21hcnRwaG9uZU5mYyA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjciLCBoZWlnaHQ6ICIxMiIsIHg6ICIyIiwgeTogIjYiLCByeDogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgOC4zMmE3LjQzIDcuNDMgMCAwIDEgMCA3LjM2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2LjQ2IDYuMjFhMTEuNzYgMTEuNzYgMCAwIDEgMCAxMS41OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOS45MSA0LjFhMTUuOTEgMTUuOTEgMCAwIDEgLjAxIDE1LjgiIH1dCiAgICBdOwogICAgdmFyIFNtaWxlUGx1cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDExdjFhMTAgMTAgMCAxIDEtOS0xMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE0czEuNSAyIDQgMiA0LTIgNC0yIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjkiLCB4MjogIjkuMDEiLCB5MTogIjkiLCB5MjogIjkiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTUiLCB4MjogIjE1LjAxIiwgeTE6ICI5IiwgeTI6ICI5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDVoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAydjYiIH1dCiAgICBdOwogICAgdmFyIFNtaWxlID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNHMxLjUgMiA0IDIgNC0yIDQtMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI5IiwgeDI6ICI5LjAxIiwgeTE6ICI5IiwgeTI6ICI5IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE1IiwgeDI6ICIxNS4wMSIsIHkxOiAiOSIsIHkyOiAiOSIgfV0KICAgIF07CiAgICB2YXIgU25haWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEzYTYgNiAwIDEgMCAxMiAwIDQgNCAwIDEgMC04IDAgMiAyIDAgMCAwIDQgMCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEwIiwgY3k6ICIxMyIsIHI6ICI4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjFoMTJjNC40IDAgOC0zLjYgOC04VjdhMiAyIDAgMSAwLTQgMHY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDMgMTkuMSA1LjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMyAyMC45IDUuMiIgfV0KICAgIF07CiAgICB2YXIgU25vd2ZsYWtlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgMjAtMS4yNS0yLjVMNiAxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA0IDguNzUgNi41IDYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAyMCAxLjI1LTIuNUwxOCAxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCA0IDEuMjUgMi41TDE4IDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMjEtMy02aC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDMtMyA2IDEuNSAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJoNi41TDEwIDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAgMTAtMS41IDIgMS41IDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTJoLTYuNUwxNCAxNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm00IDEwIDEuNSAyTDQgMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNyAyMSAzLTYtMS41LTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNyAzIDMgNmg0IiB9XQogICAgXTsKICAgIHZhciBTb2FwRGlzcGVuc2VyRHJvcGxldCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjUgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJIN2EyIDIgMCAwIDAtMiAyIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE5LjI5IDE0Ljc2QTYuNjcgNi42NyAwIDAgMSAxNyAxMWE2LjYgNi42IDAgMCAxLTIuMjkgMy43NmMtMS4xNS45Mi0xLjcxIDIuMDQtMS43MSAzLjE5IDAgMi4yMiAxLjggNC4wNSA0IDQuMDVzNC0xLjgzIDQtNC4wNWMwLTEuMTYtLjU3LTIuMjYtMS43MS0zLjE5IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuNjA3IDIxSDZhMiAyIDAgMCAxLTItMnYtN2EyIDIgMCAwIDEgMi0yaDdWN2ExIDEgMCAwIDAtMS0xSDlhMSAxIDAgMCAwLTEgMXYzIiB9XQogICAgXTsKICAgIHZhciBTb2ZhID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgOVY2YTIgMiAwIDAgMC0yLTJINmEyIDIgMCAwIDAtMiAydjMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMiAxNmEyIDIgMCAwIDAgMiAyaDE2YTIgMiAwIDAgMCAyLTJ2LTVhMiAyIDAgMCAwLTQgMHYxLjVhLjUuNSAwIDAgMS0uNS41aC0xMWEuNS41IDAgMCAxLS41LS41VjExYTIgMiAwIDAgMC00IDB6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTh2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxOHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDR2OSIgfV0KICAgIF07CiAgICB2YXIgU29sYXJQYW5lbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC4yOCAxNC00LjU2IDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMjItMS41NTgtNEg0LjU1OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEwdjIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNi4yNDUgMTUuMDRBMiAyIDAgMCAxIDggMTRoMTJhMSAxIDAgMCAxIC44NjQgMS41MDVsLTMuMTEgNS40NTdBMiAyIDAgMCAxIDE2IDIySDRhMSAxIDAgMCAxLS44NjMtMS41MDZ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMmE0IDQgMCAwIDEtNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTguNjYgNy42NiAxLjQxIDEuNDEiIH1dCiAgICBdOwogICAgdmFyIFNvdXAgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMWE5IDkgMCAwIDAgOS05SDNhOSA5IDAgMCAwIDkgOVoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMWgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOS41IDEyIDIyIDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYuMjUgM2MuMjcuMS44LjUzLjc1IDEuMzYtLjA2LjgzLS45MyAxLjItMSAyLjAyLS4wNS43OC4zNCAxLjI0LjczIDEuNjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEuMjUgM2MuMjcuMS44LjUzLjc0IDEuMzYtLjA1LjgzLS45MyAxLjItLjk4IDIuMDItLjA2Ljc4LjMzIDEuMjQuNzIgMS42MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjI1IDNjLjI3LjEuOC41My43NSAxLjM2LS4wNi44My0uOTMgMS4yLTEgMi4wMi0uMDUuNzguMzQgMS4yNC43NCAxLjYyIiB9XQogICAgXTsKICAgIHZhciBTcGFjZSA9IFtbInBhdGgiLCB7IGQ6ICJNMjIgMTd2MWMwIC41LS41IDEtMSAxSDNjLS41IDAtMS0uNS0xLTF2LTEiIH1dXTsKICAgIHZhciBTcGFkZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4djQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMiAxNC40OTlhNS41IDUuNSAwIDAgMCA5LjU5MSAzLjY3NS42LjYgMCAwIDEgLjgxOC4wMDFBNS41IDUuNSAwIDAgMCAyMiAxNC41YzAtMi4yOS0xLjUtNC0zLTUuNWwtNS40OTItNS4zMTJhMiAyIDAgMCAwLTMtLjAyTDUgOC45OTljLTEuNSAxLjUtMyAzLjItMyA1LjUiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFNwYXJrbGVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEuMDE3IDIuODE0YTEgMSAwIDAgMSAxLjk2NiAwbDEuMDUxIDUuNTU4YTIgMiAwIDAgMCAxLjU5NCAxLjU5NGw1LjU1OCAxLjA1MWExIDEgMCAwIDEgMCAxLjk2NmwtNS41NTggMS4wNTFhMiAyIDAgMCAwLTEuNTk0IDEuNTk0bC0xLjA1MSA1LjU1OGExIDEgMCAwIDEtMS45NjYgMGwtMS4wNTEtNS41NThhMiAyIDAgMCAwLTEuNTk0LTEuNTk0bC01LjU1OC0xLjA1MWExIDEgMCAwIDEgMC0xLjk2Nmw1LjU1OC0xLjA1MWEyIDIgMCAwIDAgMS41OTQtMS41OTR6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiA0aC00IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNCIsIGN5OiAiMjAiLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgU3BhcmtsZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTExLjAxNyAyLjgxNGExIDEgMCAwIDEgMS45NjYgMGwxLjA1MSA1LjU1OGEyIDIgMCAwIDAgMS41OTQgMS41OTRsNS41NTggMS4wNTFhMSAxIDAgMCAxIDAgMS45NjZsLTUuNTU4IDEuMDUxYTIgMiAwIDAgMC0xLjU5NCAxLjU5NGwtMS4wNTEgNS41NThhMSAxIDAgMCAxLTEuOTY2IDBsLTEuMDUxLTUuNTU4YTIgMiAwIDAgMC0xLjU5NC0xLjU5NGwtNS41NTgtMS4wNTFhMSAxIDAgMCAxIDAtMS45NjZsNS41NTgtMS4wNTFhMiAyIDAgMCAwIDEuNTk0LTEuNTk0eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgU3BlYWtlciA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE2IiwgaGVpZ2h0OiAiMjAiLCB4OiAiNCIsIHk6ICIyIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZoLjAxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjE0IiwgcjogIjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTRoLjAxIiB9XQogICAgXTsKICAgIHZhciBTcGVlY2ggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk04LjggMjB2LTQuMWwxLjkuMmEyLjMgMi4zIDAgMCAwIDIuMTY0LTIuMVY4LjNBNS4zNyA1LjM3IDAgMCAwIDIgOC4yNWMwIDIuOC42NTYgMy4wNTQgMSA0LjU1YTUuNzcgNS43NyAwIDAgMSAuMDI5IDIuNzU4TDIgMjAiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkuOCAxNy44YTcuNSA3LjUgMCAwIDAgLjAwMy0xMC42MDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTVhMy41IDMuNSAwIDAgMC0uMDI1LTQuOTc1IiB9XQogICAgXTsKICAgIHZhciBTcGVsbENoZWNrMiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTYgMTYgNi0xMiA2IDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJoOCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDIxYzEuMSAwIDEuMS0xIDIuMy0xczEuMSAxIDIuMyAxYzEuMSAwIDEuMS0xIDIuMy0xIDEuMSAwIDEuMSAxIDIuMyAxIDEuMSAwIDEuMS0xIDIuMy0xIDEuMSAwIDEuMSAxIDIuMyAxIDEuMSAwIDEuMS0xIDIuMy0xIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBTcGVsbENoZWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtNiAxNiA2LTEyIDYgMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDIwIDIgMiA0LTQiIH1dCiAgICBdOwogICAgdmFyIFNwbGluZVBvaW50ZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMi4wMzQgMTIuNjgxYS40OTguNDk4IDAgMCAxIC42NDctLjY0N2w5IDMuNWEuNS41IDAgMCAxLS4wMzMuOTQzbC0zLjQ0NCAxLjA2OGExIDEgMCAwIDAtLjY2LjY2bC0xLjA2NyAzLjQ0M2EuNS41IDAgMCAxLS45NDMuMDMzeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE3QTEyIDEyIDAgMCAxIDE3IDUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiNSIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNSIsIGN5OiAiMTkiLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgU3BsaW5lID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiNSIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNSIsIGN5OiAiMTkiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE3QTEyIDEyIDAgMCAxIDE3IDUiIH1dCiAgICBdOwogICAgdmFyIFNwbGl0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgM2g1djUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAzSDN2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMnYtOC4zYTQgNCAwIDAgMC0xLjE3Mi0yLjg3MkwzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgOSA2LTYiIH1dCiAgICBdOwogICAgdmFyIFNwb29sID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTcgMTMuNDQgNC40NDIgMTcuMDgyQTIgMiAwIDAgMCA0Ljk4MiAyMUgxOWEyIDIgMCAwIDAgLjU1OC0zLjkyMWwtMS4xMTUtLjMyQTIgMiAwIDAgMSAxNyAxNC44MzdWNy42NiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm03IDEwLjU2IDEyLjU1OC0zLjY0MkEyIDIgMCAwIDAgMTkuMDE4IDNINWEyIDIgMCAwIDAtLjU1OCAzLjkyMWwxLjExNS4zMkEyIDIgMCAwIDEgNyA5LjE2M3Y3LjE3OCIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgU3BvdGxpZ2h0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUuMjk1IDE5LjU2MiAxNiAyMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAxNiAzLjc1OCAyLjA5OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOSAxMi41IDMuMDI2LS41OTgiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNy42MSA2LjNhMyAzIDAgMCAwLTMuOTIgMS4zbC0xLjM4IDIuNzlhMyAzIDAgMCAwIDEuMyAzLjkxbDYuODkgMy41OTdhMSAxIDAgMCAwIDEuMzQyLS40NDdsMy4xMDYtNi4yMTFhMSAxIDAgMCAwLS40NDctMS4zNDF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggOVYyIiB9XQogICAgXTsKICAgIHZhciBTcHJheUNhbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgM2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyA1aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSA3aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDdoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgOWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMWguMDEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNCIsIGhlaWdodDogIjQiLCB4OiAiMTUiLCB5OiAiNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOSA5IDIgMnYxMGMwIC42LS40IDEtMSAxaC02Yy0uNiAwLTEtLjQtMS0xVjExbDItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMyAxNCA4LTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMgMTkgOC0yIiB9XQogICAgXTsKICAgIHZhciBTcHJvdXQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNCA5LjUzNlY3YTQgNCAwIDAgMSA0LTRoMS41YS41LjUgMCAwIDEgLjUuNVY1YTQgNCAwIDAgMS00IDQgNCA0IDAgMCAwLTQgNGMwIDIgMSAzIDEgNWE1IDUgMCAwIDEtMSAzIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgOWE1IDUgMCAwIDEgOCA0IDUgNSAwIDAgMS04LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMWgxNCIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlQXJyb3dEb3duTGVmdCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDgtOCA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE2SDhWOCIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlQWN0aXZpdHkgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxMmgtMmwtMiA1LTItMTAtMiA1SDciIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZUFycm93RG93blJpZ2h0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCA4IDggOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA4djhIOCIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlQXJyb3dEb3duID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOHY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggMTIgNCA0IDQtNCIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlQXJyb3dMZWZ0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIgOC00IDQgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEySDgiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZUFycm93T3V0RG93bkxlZnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAyMWg2YTIgMiAwIDAgMCAyLTJWNWEyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgMjEgOS05IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMjFIM3YtNiIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlQXJyb3dPdXREb3duUmlnaHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMVY1YTIgMiAwIDAgMC0yLTJINWEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAyMS05LTkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTV2NmgtNiIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlQXJyb3dPdXRVcExlZnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAzaDZhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDMgOSA5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOVYzaDYiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZUFycm93T3V0VXBSaWdodCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEzdjZhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMy05IDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgM2g2djYiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZUFycm93VXBMZWZ0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNlY4aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTYgOCA4IiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVBcnJvd1JpZ2h0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDE2IDQtNC00LTQiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZUFycm93VXBSaWdodCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggOGg4djgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAxNiA4LTgiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZUFycm93VXAgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAxMi00LTQtNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE2VjgiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZUFzdGVyaXNrID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOHY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTguNSAxNCA3LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOC41IDEwIDcgNCIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlQm90dG9tRGFzaGVkU2Npc3NvcnMgPSBbCiAgICAgIFsibGluZSIsIHsgeDE6ICI1IiwgeTE6ICIzIiwgeDI6ICIxOSIsIHkyOiAiMyIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIzIiwgeTE6ICI1IiwgeDI6ICIzIiwgeTI6ICIxOSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIyMSIsIHkxOiAiNSIsIHgyOiAiMjEiLCB5MjogIjE5IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjkiLCB5MTogIjIxIiwgeDI6ICIxMCIsIHkyOiAiMjEiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTQiLCB5MTogIjIxIiwgeDI6ICIxNSIsIHkyOiAiMjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNIDMgNSBBMiAyIDAgMCAxIDUgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0gMTkgMyBBMiAyIDAgMCAxIDIxIDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNIDUgMjEgQTIgMiAwIDAgMSAzIDE5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTSAyMSAxOSBBMiAyIDAgMCAxIDE5IDIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOC41IiwgY3k6ICI4LjUiLCByOiAiMS41IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjkuNTYwNjYiLCB5MTogIjkuNTYwNjYiLCB4MjogIjEyIiwgeTI6ICIxMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNyIsIHkxOiAiMTciLCB4MjogIjE0LjgyIiwgeTI6ICIxNC44MiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjguNSIsIGN5OiAiMTUuNSIsIHI6ICIxLjUiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiOS41NjA2NiIsIHkxOiAiMTQuNDM5MzQiLCB4MjogIjE3IiwgeTI6ICI3IiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVDaGFydEdhbnR0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA4aDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDE2aDUiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZUNoZWNrQmlnID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTAuNjU2VjE5YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmgxMi4zNDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxMSAzIDNMMjIgNCIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlQ2hlY2sgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDEyIDIgMiA0LTQiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZUNoZXZyb25Eb3duID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTAtNCA0LTQtNCIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlQ2hldnJvbkxlZnQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAxNi00LTQgNC00IiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVDaGV2cm9uUmlnaHQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCA4IDQgNC00IDQiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZUNoZXZyb25VcCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggMTQgNC00IDQgNCIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlQ29kZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEwIDktMyAzIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAxNSAzLTMtMy0zIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICIzIiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4Iiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVEYXNoZWRCb3R0b21Db2RlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOS41IDggMTJsMiAyLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjFoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCA5LjUgMiAyLjUtMiAyLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmgxNGEyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAyMWgxIiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVEYXNoZWRCb3R0b20gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDIxYTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDE0YTIgMiAwIDAgMSAyIDJ2MTRhMiAyIDAgMCAxLTIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDIxaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjFoMSIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlRGFzaGVkTW91c2VQb2ludGVyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTIuMDM0IDEyLjY4MWEuNDk4LjQ5OCAwIDAgMSAuNjQ3LS42NDdsOSAzLjVhLjUuNSAwIDAgMS0uMDMzLjk0M2wtMy40NDQgMS4wNjhhMSAxIDAgMCAwLS42Ni42NmwtMS4wNjcgMy40NDNhLjUuNSAwIDAgMS0uOTQzLjAzM3oiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAzYTIgMiAwIDAgMC0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgM2EyIDIgMCAwIDEgMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMjFhMiAyIDAgMCAxLTItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDNoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDIxaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgM2gxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOXYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDl2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE0djEiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZURhc2hlZEthbmJhbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggN3Y3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA3djkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAzYTIgMiAwIDAgMC0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAzaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgM2gxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDNhMiAyIDAgMCAxIDIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA5djEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTR2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxOWEyIDIgMCAwIDEtMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDIxaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAyMWgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMjFhMiAyIDAgMCAxLTItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE0djEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA5djEiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZURhc2hlZFRvcFNvbGlkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjFoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNHYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE5YTIgMiAwIDAgMS0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgOXYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTR2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDVhMiAyIDAgMCAxIDItMmgxNGEyIDIgMCAwIDEgMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOXYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMjFhMiAyIDAgMCAxLTItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDIxaDEiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZURhc2hlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgM2EyIDIgMCAwIDAtMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDNhMiAyIDAgMCAxIDIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxOWEyIDIgMCAwIDEtMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMjFhMiAyIDAgMCAxLTItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDNoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDIxaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgM2gxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDIxaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA5djEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgOXYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTR2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNHYxIiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVEaXZpZGUgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI4IiwgeDI6ICIxNiIsIHkxOiAiMTIiLCB5MjogIjEyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEyIiwgeDI6ICIxMiIsIHkxOiAiMTYiLCB5MjogIjE2IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEyIiwgeDI6ICIxMiIsIHkxOiAiOCIsIHkyOiAiOCIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlRG90ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMSIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlRXF1YWwgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEwaDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTRoMTAiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZUZ1bmN0aW9uID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxN2MyIDAgMi44LTEgMi44LTIuOFYxMGMwLTIgMS0zLjMgMy4yLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMS4yaDUuNyIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlS2FuYmFuID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA3djciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgN3Y0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDd2OSIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlTGlicmFyeSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgN3YxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSA3djEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDcgMiAxMCIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlTSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNOCAxNlY4LjVhLjUuNSAwIDAgMSAuOS0uM2wyLjcgMy41OTlhLjUuNSAwIDAgMCAuOCAwbDIuNy0zLjZhLjUuNSAwIDAgMSAuOS4zVjE2IiB9CiAgICAgIF0sCiAgICAgIFsicmVjdCIsIHsgeDogIjMiLCB5OiAiMyIsIHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlTWVudSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgOGgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEyaDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTZoMTAiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZU1pbnVzID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmg4IiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVNb3VzZVBvaW50ZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMi4wMzQgMTIuNjgxYS40OTguNDk4IDAgMCAxIC42NDctLjY0N2w5IDMuNWEuNS41IDAgMCAxLS4wMzMuOTQzbC0zLjQ0NCAxLjA2OGExIDEgMCAwIDAtLjY2LjY2bC0xLjA2NyAzLjQ0M2EuNS41IDAgMCAxLS45NDMuMDMzeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMVY1YTIgMiAwIDAgMC0yLTJINWEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoNiIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlUGFya2luZ09mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuNiAzLjZBMiAyIDAgMCAxIDUgM2gxNGEyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0uNTkgMS40MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDguN1YxOWEyIDIgMCAwIDAgMiAyaDEwLjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDEzYTMgMyAwIDEgMCAwLTZIOXYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTd2LTIuMyIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlUGFya2luZyA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTdWN2g0YTMgMyAwIDAgMSAwIDZIOSIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlUGF1c2UgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMCIsIHgyOiAiMTAiLCB5MTogIjE1IiwgeTI6ICI5IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE0IiwgeDI6ICIxNCIsIHkxOiAiMTUiLCB5MjogIjkiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZVBlbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDNINWEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoMTRhMiAyIDAgMCAwIDItMnYtNyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOC4zNzUgMi42MjVhMSAxIDAgMCAxIDMgM2wtOS4wMTMgOS4wMTRhMiAyIDAgMCAxLS44NTMuNTA1bC0yLjg3My44NGEuNS41IDAgMCAxLS42Mi0uNjJsLjg0LTIuODczYTIgMiAwIDAgMSAuNTA2LS44NTJ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBTcXVhcmVQZXJjZW50ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgOS02IDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA5aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxNWguMDEiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZVBpID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyA3aDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDd2MTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTdhMiAyIDAgMCAxLTItMlY3IiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVQaWxjcm93ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJIOS41YTIuNSAyLjUgMCAwIDEgMC01SDE3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2MTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgN3YxMCIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlUGxheSA9IFsKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICIzIiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4Iiwgcng6ICIyIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTkgOS4wMDNhMSAxIDAgMCAxIDEuNTE3LS44NTlsNC45OTcgMi45OTdhMSAxIDAgMCAxIDAgMS43MThsLTQuOTk3IDIuOTk3QTEgMSAwIDAgMSA5IDE0Ljk5NnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFNxdWFyZVBsdXMgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEyaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOHY4IiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVQb3dlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03Ljk5OCA5LjAwM2E1IDUgMCAxIDAgOC0uMDA1IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICIzIiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4Iiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVSYWRpY2FsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMmgybDIgNSAyLTEwaDQiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIzIiwgeTogIjMiLCB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZVJvdW5kQ29ybmVyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTFhOCA4IDAgMCAwLTgtOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmg0IiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVTY2lzc29ycyA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOC41IiwgY3k6ICI4LjUiLCByOiAiMS41IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjkuNTYwNjYiLCB5MTogIjkuNTYwNjYiLCB4MjogIjEyIiwgeTI6ICIxMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNyIsIHkxOiAiMTciLCB4MjogIjE0LjgyIiwgeTI6ICIxNC44MiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjguNSIsIGN5OiAiMTUuNSIsIHI6ICIxLjUiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiOS41NjA2NiIsIHkxOiAiMTQuNDM5MzQiLCB4MjogIjE3IiwgeTI6ICI3IiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVTaWdtYSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDguOVY3SDhsNCA1LTQgNWg4di0xLjkiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZVNsYXNoID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiOSIsIHgyOiAiMTUiLCB5MTogIjE1IiwgeTI6ICI5IiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVTcGxpdEhvcml6b250YWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE5SDVjLTEgMC0yLTEtMi0yVjdjMC0xIDEtMiAyLTJoMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA1aDNjMSAwIDIgMSAyIDJ2MTBjMCAxLTEgMi0yIDJoLTMiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICI0IiwgeTI6ICIyMCIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlU3BsaXRWZXJ0aWNhbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgOFY1YzAtMSAxLTIgMi0yaDEwYzEgMCAyIDEgMiAydjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMTZ2M2MwIDEtMSAyLTIgMkg3Yy0xIDAtMi0xLTItMnYtMyIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI0IiwgeDI6ICIyMCIsIHkxOiAiMTIiLCB5MjogIjEyIiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVTcXVhcmUgPSBbCiAgICAgIFsicmVjdCIsIHsgeDogIjMiLCB5OiAiMyIsIHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjgiLCB5OiAiOCIsIHdpZHRoOiAiOCIsIGhlaWdodDogIjgiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZVN0YWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMGMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDRjMS4xIDAgMiAuOSAyIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTZjLTEuMSAwLTItLjktMi0ydi00YzAtMS4xLjktMiAyLTJoNGMxLjEgMCAyIC45IDIgMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiOCIsIHg6ICIxNCIsIHk6ICIxNCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgU3F1YXJlU3RhciA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTExLjAzNSA3LjY5YTEgMSAwIDAgMSAxLjkwOS4wMjRsLjczNyAxLjQ1MmExIDEgMCAwIDAgLjczNy41MzVsMS42MzQuMjU2YTEgMSAwIDAgMSAuNTg4IDEuODA2bC0xLjE3MiAxLjE2OGExIDEgMCAwIDAtLjI4Mi44NjZsLjI1OSAxLjYxM2ExIDEgMCAwIDEtMS41NDEgMS4xMzRsLTEuNDY1LS43NWExIDEgMCAwIDAtLjkxMiAwbC0xLjQ2NS43NWExIDEgMCAwIDEtMS41MzktMS4xMzNsLjI1OC0xLjYxM2ExIDEgMCAwIDAtLjI4Mi0uODY2bC0xLjE1Ni0xLjE1M2ExIDEgMCAwIDEgLjU3Mi0xLjgyMmwxLjYzMy0uMjU2YTEgMSAwIDAgMCAuNzM3LS41MzV6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICIzIiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4Iiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVTdG9wID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI5IiwgeTogIjkiLCB3aWR0aDogIjYiLCBoZWlnaHQ6ICI2Iiwgcng6ICIxIiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVUZXJtaW5hbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMTEgMi0yLTItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxM2g0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiwgcnk6ICIyIiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVVc2VyUm91bmQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAyMWE2IDYgMCAwIDAtMTIgMCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMSIsIHI6ICI0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVVc2VyID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTAiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIxdi0yYTIgMiAwIDAgMSAyLTJoNmEyIDIgMCAwIDEgMiAydjIiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZVggPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA5LTYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDkgNiA2IiB9XQogICAgXTsKICAgIHZhciBTcXVhcmUgPSBbWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XV07CiAgICB2YXIgU3F1YXJlc0V4Y2x1ZGUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNiAxMnYyYTIgMiAwIDAgMS0yIDJIOWExIDEgMCAwIDAtMSAxdjNhMiAyIDAgMCAwIDIgMmgxMGEyIDIgMCAwIDAgMi0yVjEwYTIgMiAwIDAgMC0yLTJoMCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDE2YTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDEwYTIgMiAwIDAgMSAyIDJ2M2ExIDEgMCAwIDEtMSAxaC01YTIgMiAwIDAgMC0yIDJ2MiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgU3F1YXJlc0ludGVyc2VjdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDIyYTIgMiAwIDAgMS0yLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMmEyIDIgMCAwIDEgMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDIyaC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTBWOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDRhMiAyIDAgMCAxIDItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCA4YTIgMiAwIDAgMSAyIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTR2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAyMGEyIDIgMCAwIDEtMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTZhMiAyIDAgMCAxLTItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEwYTIgMiAwIDAgMSAyLTJoNWExIDEgMCAwIDEgMSAxdjVhMiAyIDAgMCAxLTIgMkg5YTEgMSAwIDAgMS0xLTF6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMmgyIiB9XQogICAgXTsKICAgIHZhciBTcXVhcmVzU3VidHJhY3QgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAyMmEyIDIgMCAwIDEtMi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDIyaC0yIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE2IDRhMiAyIDAgMCAwLTItMkg0YTIgMiAwIDAgMC0yIDJ2MTBhMiAyIDAgMCAwIDIgMmgzYTEgMSAwIDAgMCAxLTF2LTVhMiAyIDAgMCAxIDItMmg1YTEgMSAwIDAgMCAxLTF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDhhMiAyIDAgMCAxIDIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxNHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDIwYTIgMiAwIDAgMS0yIDIiIH1dCiAgICBdOwogICAgdmFyIFNxdWFyZXNVbml0ZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQgMTZhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoMTBhMiAyIDAgMCAxIDIgMnYzYTEgMSAwIDAgMCAxIDFoM2EyIDIgMCAwIDEgMiAydjEwYTIgMiAwIDAgMS0yIDJIMTBhMiAyIDAgMCAxLTItMnYtM2ExIDEgMCAwIDAtMS0xeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgU3F1aXJjbGVEYXNoZWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMy43NyAzLjA0M2EzNCAzNCAwIDAgMC0zLjU0IDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMuNzcxIDIwLjk1NmEzMyAzMyAwIDAgMS0zLjU0MS4wMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAuMTggMTcuNzRjLS41MSAxLjE1LTEuMjkgMS45My0yLjQzOSAyLjQ0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwLjE4IDYuMjU5Yy0uNTEtMS4xNDgtMS4yOTEtMS45MjktMi40NC0yLjQzOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC45NTcgMTAuMjNhMzMgMzMgMCAwIDEgMCAzLjU0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuMDQzIDEwLjIzYTM0IDM0IDAgMCAwIC4wMDEgMy41NDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi4yNiAyMC4xNzljLTEuMTUtLjUwOC0xLjkzLTEuMjktMi40NC0yLjQzOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjI2IDMuODJjLTEuMTQ5LjUxLTEuOTMgMS4yOTEtMi40NCAyLjQ0IiB9XQogICAgXTsKICAgIHZhciBTcXVpcmNsZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDNjNy4yIDAgOSAxLjggOSA5cy0xLjggOS05IDktOS0xLjgtOS05IDEuOC05IDktOSIgfV0KICAgIF07CiAgICB2YXIgU3F1aXJyZWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNS4yMzYgMjJhMyAzIDAgMCAwLTIuMi01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDIwYTMgMyAwIDAgMSAzLTNoMWEyIDIgMCAwIDAgMi0ydi0yYTQgNCAwIDAgMC00LTRWNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxM2guMDEiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTggNmE0IDQgMCAwIDAtNCA0IDcgNyAwIDAgMC03IDdjMC01IDQtNSA0LTEwLjVhNC41IDQuNSAwIDEgMC05IDAgMi41IDIuNSAwIDAgMCA1IDBDNyAxMCAzIDExIDMgMTdjMCAyLjggMi4yIDUgNSA1aDEwIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBTdGFtcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDEzVjguNUMxNCA3IDE1IDcgMTUgNWEzIDMgMCAwIDAtNiAwYzAgMiAxIDIgMSAzLjVWMTMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMTUuNWEyLjUgMi41IDAgMCAwLTIuNS0yLjVoLTExQTIuNSAyLjUgMCAwIDAgNCAxNS41VjE3YTEgMSAwIDAgMCAxIDFoMTRhMSAxIDAgMCAwIDEtMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMmgxNCIgfV0KICAgIF07CiAgICB2YXIgU3RhckhhbGYgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMiAxOC4zMzhhMi4xIDIuMSAwIDAgMC0uOTg3LjI0NEw2LjM5NiAyMS4wMWEuNTMuNTMgMCAwIDEtLjc3LS41NmwuODgxLTUuMTM5YTIuMTIgMi4xMiAwIDAgMC0uNjExLTEuODc5TDIuMTYgOS43OTVhLjUzLjUzIDAgMCAxIC4yOTQtLjkwNmw1LjE2NS0uNzU1YTIuMTIgMi4xMiAwIDAgMCAxLjU5Ny0xLjE2bDIuMzA5LTQuNjc5QS41My41MyAwIDAgMSAxMiAyIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBTdGFyT2ZmID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTAuMzQ0IDQuNjg4IDEuMTgxLTIuMzkzYS41My41MyAwIDAgMSAuOTUgMGwyLjMxIDQuNjc5YTIuMTIgMi4xMiAwIDAgMCAxLjU5NSAxLjE2bDUuMTY2Ljc1NmEuNTMuNTMgMCAwIDEgLjI5NC45MDRsLTMuMjM3IDMuMTUyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTE3Ljk0NSAxNy45NDUuNDMgMi41MDVhLjUzLjUzIDAgMCAxLS43NzEuNTZsLTQuNjE4LTIuNDI4YTIuMTIgMi4xMiAwIDAgMC0xLjk3MyAwTDYuMzk2IDIxLjAxYS41My41MyAwIDAgMS0uNzctLjU2bC44ODEtNS4xMzlhMi4xMiAyLjEyIDAgMCAwLS42MTEtMS44NzlMMi4xNiA5Ljc5NWEuNTMuNTMgMCAwIDEgLjI5NC0uOTA2bDUuMTY1LS43NTVhOCA4IDAgMCAwIC40LS4wOTkiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XQogICAgXTsKICAgIHZhciBTdGFyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEuNTI1IDIuMjk1YS41My41MyAwIDAgMSAuOTUgMGwyLjMxIDQuNjc5YTIuMTIzIDIuMTIzIDAgMCAwIDEuNTk1IDEuMTZsNS4xNjYuNzU2YS41My41MyAwIDAgMSAuMjk0LjkwNGwtMy43MzYgMy42MzhhMi4xMjMgMi4xMjMgMCAwIDAtLjYxMSAxLjg3OGwuODgyIDUuMTRhLjUzLjUzIDAgMCAxLS43NzEuNTZsLTQuNjE4LTIuNDI4YTIuMTIyIDIuMTIyIDAgMCAwLTEuOTczIDBMNi4zOTYgMjEuMDFhLjUzLjUzIDAgMCAxLS43Ny0uNTZsLjg4MS01LjEzOWEyLjEyMiAyLjEyMiAwIDAgMC0uNjExLTEuODc5TDIuMTYgOS43OTVhLjUzLjUzIDAgMCAxIC4yOTQtLjkwNmw1LjE2NS0uNzU1YTIuMTIyIDIuMTIyIDAgMCAwIDEuNTk3LTEuMTZ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBTdGV0aG9zY29wZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDNINGEyIDIgMCAwIDAtMiAydjRhNiA2IDAgMCAwIDEyIDBWNWEyIDIgMCAwIDAtMi0yaC0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTVhNiA2IDAgMCAwIDEyIDB2LTMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIyMCIsIGN5OiAiMTAiLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgU3RlcEJhY2sgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMy45NzEgNC4yODVBMiAyIDAgMCAxIDE3IDZ2MTJhMiAyIDAgMCAxLTMuMDI5IDEuNzE1bC05Ljk5Ny01Ljk5OGEyIDIgMCAwIDEtLjAwMy0zLjQzMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMjBWNCIgfV0KICAgIF07CiAgICB2YXIgU3RlcEZvcndhcmQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTEwLjAyOSA0LjI4NUEyIDIgMCAwIDAgNyA2djEyYTIgMiAwIDAgMCAzLjAyOSAxLjcxNWw5Ljk5Ny01Ljk5OGEyIDIgMCAwIDAgLjAwMy0zLjQzMnoiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgNHYxNiIgfV0KICAgIF07CiAgICB2YXIgU3RpY2tlciA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxIDlhMi40IDIuNCAwIDAgMC0uNzA2LTEuNzA2bC0zLjU4OC0zLjU4OEEyLjQgMi40IDAgMCAwIDE1IDNINWEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoMTRhMiAyIDAgMCAwIDItMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgM3Y1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEzaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxM2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTZzLjggMSAyIDFjMS4zIDAgMi0xIDItMSIgfV0KICAgIF07CiAgICB2YXIgU3RpY2t5Tm90ZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxIDlhMi40IDIuNCAwIDAgMC0uNzA2LTEuNzA2bC0zLjU4OC0zLjU4OEEyLjQgMi40IDAgMCAwIDE1IDNINWEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoMTRhMiAyIDAgMCAwIDItMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgM3Y1YTEgMSAwIDAgMCAxIDFoNSIgfV0KICAgIF07CiAgICB2YXIgU3RvbmUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMS4yNjQgMi4yMDVBNCA0IDAgMCAwIDYuNDIgNC4yMTFsLTQgOGE0IDQgMCAwIDAgMS4zNTkgNS4xMTdsNiA0YTQgNCAwIDAgMCA0LjQzOCAwbDYtNGE0IDQgMCAwIDAgMS41NzYtNC41OTJsLTItNmE0IDQgMCAwIDAtMi41My0yLjUzeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMS45OSAyMiAxNCAxMmw3LjgyMiAzLjE4NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxMiA4LjQ3IDIuMzAyIiB9XQogICAgXTsKICAgIHZhciBTdHJldGNoSG9yaXpvbnRhbCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiNiIsIHg6ICIyIiwgeTogIjQiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICI2IiwgeDogIjIiLCB5OiAiMTQiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIFN0b3JlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMjF2LTVhMSAxIDAgMCAwLTEtMWgtNGExIDEgMCAwIDAtMSAxdjUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTcuNzc0IDEwLjMxYTEuMTIgMS4xMiAwIDAgMC0xLjU0OSAwIDIuNSAyLjUgMCAwIDEtMy40NTEgMCAxLjEyIDEuMTIgMCAwIDAtMS41NDggMCAyLjUgMi41IDAgMCAxLTMuNDUyIDAgMS4xMiAxLjEyIDAgMCAwLTEuNTQ5IDAgMi41IDIuNSAwIDAgMS0zLjc3LTMuMjQ4bDIuODg5LTQuMTg0QTIgMiAwIDAgMSA3IDJoMTBhMiAyIDAgMCAxIDEuNjUzLjg3M2wyLjg5NSA0LjE5MmEyLjUgMi41IDAgMCAxLTMuNzc0IDMuMjQ0IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTAuOTVWMTlhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0ydi04LjA1IiB9XQogICAgXTsKICAgIHZhciBTdHJldGNoVmVydGljYWwgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI2IiwgaGVpZ2h0OiAiMjAiLCB4OiAiNCIsIHk6ICIyIiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjYiLCBoZWlnaHQ6ICIyMCIsIHg6ICIxNCIsIHk6ICIyIiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBTdHJpa2V0aHJvdWdoID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNEg5YTMgMyAwIDAgMC0yLjgzIDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTJhNCA0IDAgMCAxIDAgOEg2IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjQiLCB4MjogIjIwIiwgeTE6ICIxMiIsIHkyOiAiMTIiIH1dCiAgICBdOwogICAgdmFyIFN1YnNjcmlwdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTQgNSA4IDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIgNS04IDgiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMTloLTRjMC0xLjUuNDQtMiAxLjUtMi41UzIwIDE1LjMzIDIwIDE0YzAtLjQ3LS4xNy0uOTMtLjQ4LTEuMjlhMi4xMSAyLjExIDAgMCAwLTIuNjItLjQ0Yy0uNDIuMjQtLjc0LjYyLS45IDEuMDciCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFN1bkRpbSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIwaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEyaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy42NTcgNi4zNDNoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjY1NyAxNy42NTdoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMzQzIDE3LjY1N2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi4zNDMgNi4zNDNoLjAxIiB9XQogICAgXTsKICAgIHZhciBTdW5NZWRpdW0gPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDN2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMHYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTJoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxMmgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE4LjM2NCA1LjYzNi0uNzA3LjcwNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02LjM0MyAxNy42NTctLjcwNy43MDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNS42MzYgNS42MzYuNzA3LjcwNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNy42NTcgMTcuNjU3LjcwNy43MDciIH1dCiAgICBdOwogICAgdmFyIFN1bk1vb24gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTQuODM3IDE2LjM4NWE2IDYgMCAxIDEtNy4yMjMtNy4yMjJjLjYyNC0uMTQ3Ljk3LjY2LjcxNSAxLjI0OGE0IDQgMCAwIDAgNS4yNiA1LjI1OWMuNTg5LS4yNTUgMS4zOTYuMDkgMS4yNDguNzE1IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEyYTQgNCAwIDAgMC00LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkgNS0xLjI1NiAxLjI1NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxMmgyIiB9XQogICAgXTsKICAgIHZhciBTdW5Tbm93ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMjF2LTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgNFYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDlhMyAzIDAgMCAwIDAgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAyMCAxLjI1LTIuNUwxOCAxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCA0IDEuMjUgMi41TDE4IDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMjEtMy02IDEuNS0zSDIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDMtMyA2IDEuNSAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMCAxMC0xLjUgMiAxLjUgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0zLjY0IDE4LjM2LjctLjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNC4zNCA2LjM0LS43LS43IiB9XQogICAgXTsKICAgIHZhciBTdW5yaXNlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTQuOTMgMTAuOTMgMS40MSAxLjQxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMThoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxOGgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5LjA3IDEwLjkzLTEuNDEgMS40MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAyMkgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggNiA0LTQgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE4YTQgNCAwIDAgMC04IDAiIH1dCiAgICBdOwogICAgdmFyIFN1biA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIwdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNC45MyA0LjkzIDEuNDEgMS40MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNy42NiAxNy42NiAxLjQxIDEuNDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDEyaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNi4zNCAxNy42Ni0xLjQxIDEuNDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkuMDcgNC45My0xLjQxIDEuNDEiIH1dCiAgICBdOwogICAgdmFyIFN1bnNldCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEwVjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNC45MyAxMC45MyAxLjQxIDEuNDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxOGgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE4aDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkuMDcgMTAuOTMtMS40MSAxLjQxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDIySDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgNi00IDQtNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE4YTQgNCAwIDAgMC04IDAiIH1dCiAgICBdOwogICAgdmFyIFN1cGVyc2NyaXB0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtNCAxOSA4LTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIgMTktOC04IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDEyaC00YzAtMS41LjQ0Mi0yIDEuNS0yLjVTMjAgOC4zMzQgMjAgNy4wMDJjMC0uNDcyLS4xNy0uOTMtLjQ4NC0xLjI5YTIuMTA1IDIuMTA1IDAgMCAwLTIuNjE3LS40MzZjLS40Mi4yMzktLjczOC42MTQtLjg5OSAxLjA2IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBTd2F0Y2hCb29rID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTdhNCA0IDAgMCAxLTggMFY1YTIgMiAwIDAgMSAyLTJoNGEyIDIgMCAwIDEgMiAyWiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNi43IDEzSDE5YTIgMiAwIDAgMSAyIDJ2NGEyIDIgMCAwIDEtMiAySDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNIDcgMTdoLjAxIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJtMTEgOCAyLjMtMi4zYTIuNCAyLjQgMCAwIDEgMy40MDQuMDA0TDE4LjYgNy42YTIuNCAyLjQgMCAwIDEgLjAyNiAzLjQzNEw5LjkgMTkuOCIgfQogICAgICBdCiAgICBdOwogICAgdmFyIFN3aXNzRnJhbmMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAyMVYzaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxNmg5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDkuNWg3IiB9XQogICAgXTsKICAgIHZhciBTd2l0Y2hDYW1lcmEgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxOUg0YTIgMiAwIDAgMS0yLTJWN2EyIDIgMCAwIDEgMi0yaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgNWg3YTIgMiAwIDAgMSAyIDJ2MTBhMiAyIDAgMCAxLTIgMmgtNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE4IDIyLTMtMyAzLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNiAyIDMgMy0zIDMiIH1dCiAgICBdOwogICAgdmFyIFN3b3JkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTEgMTktNi02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTUgMjEtMi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggMTYtNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuNSAxNy41IDIxIDZWM2gtM0w2LjUgMTQuNSIgfV0KICAgIF07CiAgICB2YXIgU3dvcmRzID0gWwogICAgICBbInBvbHlsaW5lIiwgeyBwb2ludHM6ICIxNC41IDE3LjUgMyA2IDMgMyA2IDMgMTcuNSAxNC41IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEzIiwgeDI6ICIxOSIsIHkxOiAiMTkiLCB5MjogIjEzIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE2IiwgeDI6ICIyMCIsIHkxOiAiMTYiLCB5MjogIjIwIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE5IiwgeDI6ICIyMSIsIHkxOiAiMjEiLCB5MjogIjE5IiB9XSwKICAgICAgWyJwb2x5bGluZSIsIHsgcG9pbnRzOiAiMTQuNSA2LjUgMTggMyAyMSAzIDIxIDYgMTcuNSA5LjUiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiNSIsIHgyOiAiOSIsIHkxOiAiMTQiLCB5MjogIjE4IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjciLCB4MjogIjQiLCB5MTogIjE3IiwgeTI6ICIyMCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIzIiwgeDI6ICI1IiwgeTE6ICIxOSIsIHkyOiAiMjEiIH1dCiAgICBdOwogICAgdmFyIFN5cmluZ2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOCAyIDQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyA3IDMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSA5IDguNyAxOS4zYy0xIDEtMi41IDEtMy40IDBsLS42LS42Yy0xLTEtMS0yLjUgMC0zLjRMMTUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDExIDQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01IDE5LTMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCA0IDYgNiIgfV0KICAgIF07CiAgICB2YXIgVGFibGUyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOSAzSDVhMiAyIDAgMCAwLTIgMnY0bTYtNmgxMGEyIDIgMCAwIDEgMiAydjRNOSAzdjE4bTAgMGgxMGEyIDIgMCAwIDAgMi0yVjlNOSAyMUg1YTIgMiAwIDAgMS0yLTJWOW0wIDBoMTgiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFRhYmxlQ2VsbHNNZXJnZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIxdi02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDlWMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE1aDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOWgxOCIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgVGFibGVDZWxsc1NwbGl0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTVWOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE1aDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOWgxOCIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgVGFibGVDb2x1bW5zU3BsaXQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxNHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDIwdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDh2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE1aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAzaDZhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEtMiAySDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA5aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTVoLTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgM2gtMmEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiA5aC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgM3YxOCIgfV0KICAgIF07CiAgICB2YXIgVGFibGVPZkNvbnRlbnRzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNUgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEySDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTlIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA1aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTloLjAxIiB9XQogICAgXTsKICAgIHZhciBUYWJsZVByb3BlcnRpZXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAzdjE4IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDlIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNUgzIiB9XQogICAgXTsKICAgIHZhciBUYWJsZVJvd3NTcGxpdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDEwaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMjJ2LTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTBoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxMGgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTloMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAyMnYtNmEyIDIgMTM1IDAgMSAyLTJoMTRhMiAyIDQ1IDAgMSAyIDJ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDJ2MmEyIDIgNDUgMCAwIDIgMmgxNGEyIDIgMTM1IDAgMCAyLTJWMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEwaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAyMnYtOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDJ2NCIgfV0KICAgIF07CiAgICB2YXIgVGFibGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAzdjE4IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOWgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE1aDE4IiB9XQogICAgXTsKICAgIHZhciBUYWJsZXRTbWFydHBob25lID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTAiLCBoZWlnaHQ6ICIxNCIsIHg6ICIzIiwgeTogIjgiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSA0YTIgMiAwIDAgMSAyLTJoMTJhMiAyIDAgMCAxIDIgMnYxNmEyIDIgMCAwIDEtMiAyaC0yLjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxOGguMDEiIH1dCiAgICBdOwogICAgdmFyIFRhYmxldCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE2IiwgaGVpZ2h0OiAiMjAiLCB4OiAiNCIsIHk6ICIyIiwgcng6ICIyIiwgcnk6ICIyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEyIiwgeDI6ICIxMi4wMSIsIHkxOiAiMTgiLCB5MjogIjE4IiB9XQogICAgXTsKICAgIHZhciBUYWJsZXRzID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICI3IiwgY3k6ICI3IiwgcjogIjUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNyIsIGN5OiAiMTciLCByOiAiNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN2gxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0zLjQ2IDEwLjU0IDcuMDgtNy4wOCIgfV0KICAgIF07CiAgICB2YXIgVGFnMiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyLjU4NiAyLjU4NkEyIDIgMCAwIDAgMTEuMTcyIDJINGEyIDIgMCAwIDAtMiAydjcuMTcyYTIgMiAwIDAgMCAuNTg2IDEuNDE0bDguNzA0IDguNzA0YTIuNDI2IDIuNDI2IDAgMCAwIDMuNDIgMGw2LjU4LTYuNThhMi40MjYgMi40MjYgMCAwIDAgMC0zLjQyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjcuNSIsIGN5OiAiNy41IiwgcjogIi41IiwgZmlsbDogImN1cnJlbnRDb2xvciIgfV0KICAgIF07CiAgICB2YXIgVGFncyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEzLjE3MiAyYTIgMiAwIDAgMSAxLjQxNC41ODZsNi43MSA2LjcxYTIuNCAyLjQgMCAwIDEgMCAzLjQwOGwtNC41OTIgNC41OTJhMi40IDIuNCAwIDAgMS0zLjQwOCAwbC02LjcxLTYuNzFBMiAyIDAgMCAxIDYgOS4xNzJWM2ExIDEgMCAwIDEgMS0xeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDd2Ni4xNzJhMiAyIDAgMCAwIC41ODYgMS40MTRsNi43MSA2LjcxYTIuNCAyLjQgMCAwIDAgMy4xOTEuMTkzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTAuNSIsIGN5OiAiNi41IiwgcjogIi41IiwgZmlsbDogImN1cnJlbnRDb2xvciIgfV0KICAgIF07CiAgICB2YXIgVGFsbHkxID0gW1sicGF0aCIsIHsgZDogIk00IDR2MTYiIH1dXTsKICAgIHZhciBUYWxseTIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDR2MTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA0djE2IiB9XQogICAgXTsKICAgIHZhciBUYWxseTMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDR2MTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA0djE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDR2MTYiIH1dCiAgICBdOwogICAgdmFyIFRhbGx5NCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDR2MTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSA0djE2IiB9XQogICAgXTsKICAgIHZhciBUYWxseTUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDR2MTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA0djE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDR2MTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiA2IDIgMTgiIH1dCiAgICBdOwogICAgdmFyIFRhbmdlbnQgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE3IiwgY3k6ICI0IiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUuNTkgNS40MSA1LjQxIDE1LjU5IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNCIsIGN5OiAiMTciLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMnMtNC05LTEuNS0xMS41UzIyIDEyIDIyIDEyIiB9XQogICAgXTsKICAgIHZhciBUYXJnZXQgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICI2IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIFRlbGVzY29wZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTEwLjA2NSAxMi40OTMtNi4xOCAxLjMxOGEuOTM0LjkzNCAwIDAgMS0xLjEwOC0uNzAybC0uNTM3LTIuMTVhMS4wNyAxLjA3IDAgMCAxIC42OTEtMS4yNjVsMTMuNTA0LTQuNDQiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMuNTYgMTEuNzQ3IDQuMzMyLS45MjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMjEtMy4xMDUtNi4yMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNi40ODUgNS45NGEyIDIgMCAwIDEgMS40NTUtMi40MjVsMS4wOS0uMjcyYTEgMSAwIDAgMSAxLjIxMi43MjdsMS41MTUgNi4wNmExIDEgMCAwIDEtLjcyNyAxLjIxM2wtMS4wOS4yNzJhMiAyIDAgMCAxLTIuNDI1LTEuNDU1eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02LjE1OCA4LjYzMyAxLjExNCA0LjQ1NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDIxIDMuMTA1LTYuMjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTMiLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgVGVudFRyZWUgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjQiLCBjeTogIjQiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCA1IDMtMyAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgMTAgMy0zIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxNFYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDE0SDdsLTUgOGgyMFoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNHY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTQgNSA4IiB9XQogICAgXTsKICAgIHZhciBUZW50ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMy41IDIxIDE0IDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAuNSAyMSAxMCAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1LjUgMjEgMTIgMTVsLTMuNSA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjFoMjAiIH1dCiAgICBdOwogICAgdmFyIFRlcm1pbmFsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTloOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm00IDE3IDYtNi02LTYiIH1dCiAgICBdOwogICAgdmFyIFRlc3RUdWJlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQuNSAydjE3LjVjMCAxLjQtMS4xIDIuNS0yLjUgMi41Yy0xLjQgMC0yLjUtMS4xLTIuNS0yLjVWMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjUgMmg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0LjUgMTZoLTUiIH1dCiAgICBdOwogICAgdmFyIFRlc3RUdWJlRGlhZ29uYWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA3IDYuODIgMjEuMThhMi44MyAyLjgzIDAgMCAxLTMuOTktLjAxYTIuODMgMi44MyAwIDAgMSAwLTRMMTcgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAyIDYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNkg0IiB9XQogICAgXTsKICAgIHZhciBUZXN0VHViZXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDJ2MTcuNUEyLjUgMi41IDAgMCAxIDYuNSAyMkEyLjUgMi41IDAgMCAxIDQgMTkuNVYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDJ2MTcuNWEyLjUgMi41IDAgMCAxLTIuNSAyLjVhMi41IDIuNSAwIDAgMS0yLjUtMi41VjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAyaDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMmg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTZINCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxNmgtNSIgfV0KICAgIF07CiAgICB2YXIgVGV4dEFsaWduQ2VudGVyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgNUgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDEySDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMTlINSIgfV0KICAgIF07CiAgICB2YXIgVGV4dEFsaWduRW5kID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgNUgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEySDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTlINyIgfV0KICAgIF07CiAgICB2YXIgVGV4dEFsaWduSnVzdGlmeSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgNWgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyaDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTloMTgiIH1dCiAgICBdOwogICAgdmFyIFRleHRBbGlnblN0YXJ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgNUgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEySDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTlIMyIgfV0KICAgIF07CiAgICB2YXIgVGV4dEN1cnNvcklucHV0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjBoLTFhMiAyIDAgMCAxLTItMiAyIDIgMCAwIDEtMiAySDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgOGg3YTIgMiAwIDAgMSAyIDJ2NGEyIDIgMCAwIDEtMiAyaC03IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTZINGEyIDIgMCAwIDEtMi0ydi00YTIgMiAwIDAgMSAyLTJoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDRoMWEyIDIgMCAwIDEgMiAyIDIgMiAwIDAgMSAyLTJoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDZ2MTIiIH1dCiAgICBdOwogICAgdmFyIFRleHRDdXJzb3IgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAyMmgtMWE0IDQgMCAwIDEtNC00VjZhNCA0IDAgMCAxIDQtNGgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjJoMWE0IDQgMCAwIDAgNC00di0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMmgxYTQgNCAwIDAgMSA0IDR2MSIgfV0KICAgIF07CiAgICB2YXIgVGV4dEluaXRpYWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA1aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTJoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE5aDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgMTIgMy41NTMtNy43MjRhLjUuNSAwIDAgMSAuODk0IDBMMTEgMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy45MiAxMGg2LjE2IiB9XQogICAgXTsKICAgIHZhciBUZXh0UXVvdGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyA1SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTJIOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxOUg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTJ2NyIgfV0KICAgIF07CiAgICB2YXIgVGV4dFNlYXJjaCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDVIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMkgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE5SDMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNyIsIGN5OiAiMTUiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAxOS0xLjktMS45IiB9XQogICAgXTsKICAgIHZhciBUZXh0U2VsZWN0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjFoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAzaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgM2EyIDIgMCAwIDEgMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE0djEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTlhMiAyIDAgMCAxLTIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA5djEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxNHYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOXYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMjFhMiAyIDAgMCAxLTItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDNhMiAyIDAgMCAwLTIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEyaDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTZoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDhoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDIxaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAzaDEiIH1dCiAgICBdOwogICAgdmFyIFRleHRXcmFwID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTYtMyAzIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyaDE0LjVhMSAxIDAgMCAxIDAgN0gxMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE5aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA1aDE4IiB9XQogICAgXTsKICAgIHZhciBUaGVhdGVyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMHMzLTMgMy04IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDEwcy0zLTMtMy04IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDJjMCA0LjQtMy42IDgtOCA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJjMCA0LjQgMy42IDggOCA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTBzMiAyIDIgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxMHMtMiAyLTIgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE1aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMnYtMWEyIDIgMCAwIDEgMi0yaDRhMiAyIDAgMCAxIDIgMnYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDIydi0xYTIgMiAwIDAgMSAyLTJoNGEyIDIgMCAwIDEgMiAydjEiIH1dCiAgICBdOwogICAgdmFyIFRoZXJtb21ldGVyU25vd2ZsYWtlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgMjAtMS4yNS0yLjVMNiAxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA0IDguNzUgNi41IDYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC41ODUgMTVIMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmg2LjVMMTAgOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxNC41NGE0IDQgMCAxIDEtNCAwVjRhMiAyIDAgMCAxIDQgMHoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNCAxMCAxLjUgMkw0IDE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMjEgMy02LTEuNS0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMyAzIDZoMiIgfV0KICAgIF07CiAgICB2YXIgVGhlcm1vbWV0ZXJTdW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOGE0IDQgMCAwIDAtMS42NDUgNy42NDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE0LjU0YTQgNCAwIDEgMS00IDBWNGEyIDIgMCAwIDEgNCAweiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm00LjkzIDQuOTMgMS40MSAxLjQxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYuMzQgMTcuNjYtMS40MSAxLjQxIiB9XQogICAgXTsKICAgIHZhciBUaGVybW9tZXRlciA9IFtbInBhdGgiLCB7IGQ6ICJNMTQgNHYxMC41NGE0IDQgMCAxIDEtNCAwVjRhMiAyIDAgMCAxIDQgMFoiIH1dXTsKICAgIHZhciBUaHVtYnNEb3duID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOSAxOC4xMiAxMCAxNEg0LjE3YTIgMiAwIDAgMS0xLjkyLTIuNTZsMi4zMy04QTIgMiAwIDAgMSA2LjUgMkgyMGEyIDIgMCAwIDEgMiAydjhhMiAyIDAgMCAxLTIgMmgtMi43NmEyIDIgMCAwIDAtMS43OSAxLjExTDEyIDIyYTMuMTMgMy4xMyAwIDAgMS0zLTMuODhaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDE0VjIiIH1dCiAgICBdOwogICAgdmFyIFRodW1ic1VwID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTUgNS44OCAxNCAxMGg1LjgzYTIgMiAwIDAgMSAxLjkyIDIuNTZsLTIuMzMgOEEyIDIgMCAwIDEgMTcuNSAyMkg0YTIgMiAwIDAgMS0yLTJ2LThhMiAyIDAgMCAxIDItMmgyLjc2YTIgMiAwIDAgMCAxLjc5LTEuMTFMMTIgMmEzLjEzIDMuMTMgMCAwIDEgMyAzLjg4WiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEwdjEyIiB9XQogICAgXTsKICAgIHZhciBUaWNrZXRDaGVjayA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIgOWEzIDMgMCAwIDEgMCA2djJhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0ydi0yYTMgMyAwIDAgMSAwLTZWN2EyIDIgMCAwIDAtMi0ySDRhMiAyIDAgMCAwLTIgMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxMiAyIDIgNC00IiB9XQogICAgXTsKICAgIHZhciBUaWNrZXRNaW51cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIgOWEzIDMgMCAwIDEgMCA2djJhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0ydi0yYTMgMyAwIDAgMSAwLTZWN2EyIDIgMCAwIDAtMi0ySDRhMiAyIDAgMCAwLTIgMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMmg2IiB9XQogICAgXTsKICAgIHZhciBUaWNrZXRQZXJjZW50ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMiA5YTMgMyAwIDEgMSAwIDZ2MmEyIDIgMCAwIDAgMiAyaDE2YTIgMiAwIDAgMCAyLTJ2LTJhMyAzIDAgMSAxIDAtNlY3YTIgMiAwIDAgMC0yLTJINGEyIDIgMCAwIDAtMiAyWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDloLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDktNiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDE1aC4wMSIgfV0KICAgIF07CiAgICB2YXIgVGlja2V0UGx1cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIgOWEzIDMgMCAwIDEgMCA2djJhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0ydi0yYTMgMyAwIDAgMSAwLTZWN2EyIDIgMCAwIDAtMi0ySDRhMiAyIDAgMCAwLTIgMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMmg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDl2NiIgfV0KICAgIF07CiAgICB2YXIgVGlja2V0U2xhc2ggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yIDlhMyAzIDAgMCAxIDAgNnYyYTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMnYtMmEzIDMgMCAwIDEgMC02VjdhMiAyIDAgMCAwLTItMkg0YTIgMiAwIDAgMC0yIDJaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkuNSAxNC41IDUtNSIgfV0KICAgIF07CiAgICB2YXIgVGlja2V0WCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIgOWEzIDMgMCAwIDEgMCA2djJhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0ydi0yYTMgMyAwIDAgMSAwLTZWN2EyIDIgMCAwIDAtMi0ySDRhMiAyIDAgMCAwLTIgMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOS41IDE0LjUgNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkuNSA5LjUgNSA1IiB9XQogICAgXTsKICAgIHZhciBUaWNrZXQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yIDlhMyAzIDAgMCAxIDAgNnYyYTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMnYtMmEzIDMgMCAwIDEgMC02VjdhMiAyIDAgMCAwLTItMkg0YTIgMiAwIDAgMC0yIDJaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDV2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxN3YyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDExdjIiIH1dCiAgICBdOwogICAgdmFyIFRpY2tldHNQbGFuZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjUgMTdoMS4yMjdhMiAyIDAgMCAwIDEuMzQ1LS41MkwxOCAxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMiAxMy41IDMuNzk0LjUwNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0zLjE3MyA4LjE4IDExLTVhMiAyIDAgMCAxIDIuNjQ3Ljk5M0wxOC41NiA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTBWOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE0djEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOXYyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMiIsIHk6ICI4Iiwgd2lkdGg6ICIyMCIsIGhlaWdodDogIjEzIiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBUaW1lck9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDJoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00LjYgMTFhOCA4IDAgMCAwIDEuNyA4LjcgOCA4IDAgMCAwIDguNyAxLjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNy40IDcuNGE4IDggMCAwIDEgMTAuMyAxIDggOCAwIDAgMSAuOSAxMC4yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMnYtMiIgfV0KICAgIF07CiAgICB2YXIgVGltZXJSZXNldCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDJoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNHYtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEzYTggOCAwIDAgMSA4LTcgOCA4IDAgMSAxLTUuMyAxNEw0IDE3LjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxN0g0djUiIH1dCiAgICBdOwogICAgdmFyIFRpbWVyMiA9IFsKICAgICAgWyJsaW5lIiwgeyB4MTogIjEwIiwgeDI6ICIxNCIsIHkxOiAiMiIsIHkyOiAiMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTUiLCB5MTogIjE0IiwgeTI6ICIxMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxNCIsIHI6ICI4IiB9XQogICAgXTsKICAgIHZhciBUaWNrZXRzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMy4xNzMgOC4xOCAxMS01YTIgMiAwIDAgMSAyLjY0Ny45OTNMMTguNTYgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEwVjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxNHYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTl2MiIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjIiLCB5OiAiOCIsIHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxMyIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgVG9nZ2xlTGVmdCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOSIsIGN5OiAiMTIiLCByOiAiMyIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE0IiwgeDogIjIiLCB5OiAiNSIsIHJ4OiAiNyIgfV0KICAgIF07CiAgICB2YXIgVG9nZ2xlUmlnaHQgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE1IiwgY3k6ICIxMiIsIHI6ICIzIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTQiLCB4OiAiMiIsIHk6ICI1Iiwgcng6ICI3IiB9XQogICAgXTsKICAgIHZhciBUb2lsZXQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk03IDEyaDEzYTEgMSAwIDAgMSAxIDEgNSA1IDAgMCAxLTUgNWgtLjU5OGEuNS41IDAgMCAwLS40MjQuNzY1bDEuNTQ0IDIuNDdhLjUuNSAwIDAgMS0uNDI0Ljc2NUg1LjQwMmEuNS41IDAgMCAxLS40MjQtLjc2NUw3IDE4IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMThhNSA1IDAgMCAxLTUtNVY0YTIgMiAwIDAgMSAyLTJoOGEyIDIgMCAwIDEgMiAydjgiIH1dCiAgICBdOwogICAgdmFyIFRvb2xDYXNlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTVoNCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xNC44MTcgMTAuOTk1LS45NzEtMS40NSAxLjAzNC0xLjIzMmEyIDIgMCAwIDAtMi4wMjUtMy4yMzhsLTEuODIuMzY0TDkuOTEgMy44ODVhMiAyIDAgMCAwLTMuNjI1Ljc0OEw2LjE0MSA2LjU1bC0xLjcyNS40MjZhMiAyIDAgMCAwLS4xOSAzLjc1NmwuNjU3LjI3IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTE4LjgyMiAxMC45OTUgMi4yNi01LjM4YTEgMSAwIDAgMC0uNTU3LTEuMzE4TDE2Ljk1NCAyLjlhMSAxIDAgMCAwLTEuMjgxLjUzM2wtLjkyNCAyLjEyMiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEyLjAwNkExIDEgMCAwIDEgNC45OTQgMTFIMTlhMSAxIDAgMCAxIDEgMXY3YTIgMiAwIDAgMS0yIDJINmEyIDIgMCAwIDEtMi0yeiIgfV0KICAgIF07CiAgICB2YXIgVG9vbGJveCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEydjQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTYgNmEyIDIgMCAwIDEgMS40MTQuNTg2bDQgNEEyIDIgMCAwIDEgMjIgMTJ2N2EyIDIgMCAwIDEtMiAySDRhMiAyIDAgMCAxLTItMnYtN2EyIDIgMCAwIDEgLjU4Ni0xLjQxNGw0LTRBMiAyIDAgMCAxIDggNnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNlY0YTIgMiAwIDAgMC0yLTJoLTRhMiAyIDAgMCAwLTIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTRoMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMnY0IiB9XQogICAgXTsKICAgIHZhciBUb3JuYWRvID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgNEgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDhINiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxMkg5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE2aC02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDIwSDkiIH1dCiAgICBdOwogICAgdmFyIFRvcnVzID0gWwogICAgICBbImVsbGlwc2UiLCB7IGN4OiAiMTIiLCBjeTogIjExIiwgcng6ICIzIiwgcnk6ICIyIiB9XSwKICAgICAgWyJlbGxpcHNlIiwgeyBjeDogIjEyIiwgY3k6ICIxMi41Iiwgcng6ICIxMCIsIHJ5OiAiOC41IiB9XQogICAgXTsKICAgIHZhciBUb3VjaHBhZE9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIwdi02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5LjY1NiAxNEgyMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE0aDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAyMEg0YTIgMiAwIDAgMS0yLTJWNmEyIDIgMCAwIDEgMi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuNjU2IDRIMjBhMiAyIDAgMCAxIDIgMnYxMC4zNDQiIH1dCiAgICBdOwogICAgdmFyIFRvdWNocGFkID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxNiIsIHg6ICIyIiwgeTogIjQiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxNGgyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMHYtNiIgfV0KICAgIF07CiAgICB2YXIgVG93ZXJDb250cm9sID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTguMiAxMi4yNyAyMCA2SDRsMS44IDYuMjdhMSAxIDAgMCAwIC45NS43M2gxMC41YTEgMSAwIDAgMCAuOTYtLjczWiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEzdjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMjJ2LTkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSA2IDEgNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA2LTEgNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2VjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMmgtMiIgfV0KICAgIF07CiAgICB2YXIgVG95QnJpY2sgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjEyIiwgeDogIjMiLCB5OiAiOCIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA4VjVjMC0uNi0uNC0xLTEtMUg2YTEgMSAwIDAgMC0xIDF2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSA4VjVjMC0uNi0uNC0xLTEtMWgtM2ExIDEgMCAwIDAtMSAxdjMiIH1dCiAgICBdOwogICAgdmFyIFRyYWN0b3IgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCAxMSAxMSAuOWExIDEgMCAwIDEgLjggMS4xbC0uNjY1IDQuMTU4YTEgMSAwIDAgMS0uOTg4Ljg0MkgyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxOGgtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA1YTEgMSAwIDAgMC0xIDF2NS41NzMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA0aDguMTI5YTEgMSAwIDAgMSAuOTkuODYzTDEzIDExLjI0NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDExVjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxNWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMC4xVjQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiMTgiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjciLCBjeTogIjE1IiwgcjogIjUiIH1dCiAgICBdOwogICAgdmFyIFRyYWZmaWNDb25lID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYuMDUgMTAuOTY2YTUgMi41IDAgMCAxLTguMSAwIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTE2LjkyMyAxNC4wNDkgNC40OCAyLjA0YTEgMSAwIDAgMSAuMDAxIDEuODMxbC04LjU3NCAzLjlhMiAyIDAgMCAxLTEuNjYgMGwtOC41NzQtMy45MWExIDEgMCAwIDEgMC0xLjgzbDQuNDg0LTIuMDQiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYuOTQ5IDE0LjE0YTUgMi41IDAgMSAxLTkuOSAwTDEwLjA2MyAzLjVhMiAyIDAgMCAxIDMuODc0IDB6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuMTk0IDYuNTdhNSAyLjUgMCAwIDAgNS42MSAwIiB9XQogICAgXTsKICAgIHZhciBUcmFpbkZyb250VHVubmVsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMlYxMmExMCAxMCAwIDEgMSAyMCAwdjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDYuOHYxLjRhMyAyLjggMCAxIDEtNiAwVjYuOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxNWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTVoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE5YTQgNCAwIDAgMS00LTR2LTNhNiA2IDAgMSAxIDEyIDB2M2E0IDQgMCAwIDEtNCA0WiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDE5LTIgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxOSAyIDMiIH1dCiAgICBdOwogICAgdmFyIFRyYWluRnJvbnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDMuMVY3YTQgNCAwIDAgMCA4IDBWMy4xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTUtMS0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDE1IDEtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE5Yy0yLjggMC01LTIuMi01LTV2LTRhOCA4IDAgMCAxIDE2IDB2NGMwIDIuOC0yLjIgNS01IDVaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggMTktMiAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDE5IDIgMyIgfV0KICAgIF07CiAgICB2YXIgVHJhaW5UcmFjayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTcgMTcgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDE0IDggOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01IDExIDggOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDggOCA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTExIDUgOCA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDIgOCA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjIgMjIgNyIgfV0KICAgIF07CiAgICB2YXIgVHJhbnNnZW5kZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDIwaC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDJoNHY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiA3LjE3IDcuMTciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA1LjM1NVYyaDMuMzU3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDItNy4xNyA3LjE3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggNSA1IDgiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiNCIgfV0KICAgIF07CiAgICB2YXIgVHJhbUZyb250ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTYiLCBoZWlnaHQ6ICIxNiIsIHg6ICI0IiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMWgxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAzdjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAxOS0yIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMjItMi0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTVoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE1aC4wMSIgfV0KICAgIF07CiAgICB2YXIgVHJhc2gyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTF2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxMXY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDZ2MTRhMiAyIDAgMCAxLTIgMkg3YTIgMiAwIDAgMS0yLTJWNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDZoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA2VjRhMiAyIDAgMCAxIDItMmg0YTIgMiAwIDAgMSAyIDJ2MiIgfV0KICAgIF07CiAgICB2YXIgVHJhc2ggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSA2djE0YTIgMiAwIDAgMS0yIDJIN2EyIDIgMCAwIDEtMi0yVjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA2aDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggNlY0YTIgMiAwIDAgMSAyLTJoNGEyIDIgMCAwIDEgMiAydjIiIH1dCiAgICBdOwogICAgdmFyIFRyZWVEZWNpZHVvdXMgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk04IDE5YTQgNCAwIDAgMS0yLjI0LTcuMzJBMy41IDMuNSAwIDAgMSA5IDYuMDNWNmEzIDMgMCAxIDEgNiAwdi4wNGEzLjUgMy41IDAgMCAxIDMuMjQgNS42NUE0IDQgMCAwIDEgMTYgMTlaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE5djMiIH1dCiAgICBdOwogICAgdmFyIFRyZWVQYWxtID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgOGMwLTIuNzYtMi40Ni01LTUuNS01UzIgNS4yNCAyIDhoMmwxLTEgMSAxaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgNy4xNEE1LjgyIDUuODIgMCAwIDEgMTYuNSA2YzMuMDQgMCA1LjUgMi4yNCA1LjUgNWgtM2wtMS0xLTEgMWgtMyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk01Ljg5IDkuNzFjLTIuMTUgMi4xNS0yLjMgNS40Ny0uMzUgNy40M2w0LjI0LTQuMjUuNy0uNy43MS0uNzEgMi4xMi0yLjEyYy0xLjk1LTEuOTYtNS4yNy0xLjgtNy40Mi4zNSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxNS41Yy41IDIuNS0uMTcgNC41LTEgNi41aDRjMi01LjUtLjUtMTItMS0xNCIgfV0KICAgIF07CiAgICB2YXIgVHJlZVBpbmUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xNyAxNCAzIDMuM2ExIDEgMCAwIDEtLjcgMS43SDQuN2ExIDEgMCAwIDEtLjctMS43TDcgMTRoLS4zYTEgMSAwIDAgMS0uNy0xLjdMOSA5aC0uMkExIDEgMCAwIDEgOCA3LjNMMTIgM2w0IDQuM2ExIDEgMCAwIDEtLjggMS43SDE1bDMgMy4zYTEgMSAwIDAgMS0uNyAxLjdIMTdaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIydi0zIiB9XQogICAgXTsKICAgIHZhciBUcmVuZGluZ0Rvd24gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxN2g2di02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDE3LTguNS04LjUtNSA1TDIgNyIgfV0KICAgIF07CiAgICB2YXIgVHJlbGxvID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMyIsIGhlaWdodDogIjkiLCB4OiAiNyIsIHk6ICI3IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjMiLCBoZWlnaHQ6ICI1IiwgeDogIjE0IiwgeTogIjciIH1dCiAgICBdOwogICAgdmFyIFRyZWVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTB2LjJBMyAzIDAgMCAxIDguOSAxNkg1YTMgMyAwIDAgMS0xLTUuOFYxMGEzIDMgMCAwIDEgNiAwWiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE2djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMTl2MyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMiAxOWg4LjNhMSAxIDAgMCAwIC43LTEuN0wxOCAxNGguM2ExIDEgMCAwIDAgLjctMS43TDE2IDloLjJhMSAxIDAgMCAwIC44LTEuN0wxMyAzbC0xLjQgMS41IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBUcmVuZGluZ1VwRG93biA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0LjgyOCAxNC44MjggMjEgMjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTZ2NWgtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAzLTkgOS00LTQtNiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDhWM2gtNSIgfV0KICAgIF07CiAgICB2YXIgVHJlbmRpbmdVcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDdoNnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDctOC41IDguNS01LTVMMiAxNyIgfV0KICAgIF07CiAgICB2YXIgVHJpYW5nbGVBbGVydCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxLjczIDE4LTgtMTRhMiAyIDAgMCAwLTMuNDggMGwtOCAxNEEyIDIgMCAwIDAgNCAyMWgxNmEyIDIgMCAwIDAgMS43My0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDl2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN2guMDEiIH1dCiAgICBdOwogICAgdmFyIFRyaWFuZ2xlRGFzaGVkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAuMTcgNC4xOTNhMiAyIDAgMCAxIDMuNjY2LjAxMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAyMWgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1Ljg3NCA3Ljc0MyAxIDEuNzMyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE4Ljg0OSAxMi45NTIgMSAxLjczMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMS44MjQgMTguMThhMiAyIDAgMCAxLTEuODM1IDIuODI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQuMDI0IDIxYTIgMiAwIDAgMS0xLjgzOS0yLjgzOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01LjEzNiAxMi45NTItMSAxLjczMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIxaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOC4xMDIgNy43NDMtMSAxLjczMiIgfV0KICAgIF07CiAgICB2YXIgVHJpYW5nbGVSaWdodCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE4YTIgMiAwIDAgMS0yIDJIM2MtMS4xIDAtMS4zLS42LS40LTEuM0wyMC40IDQuM2MuOS0uNyAxLjYtLjQgMS42LjdaIiB9XQogICAgXTsKICAgIHZhciBUcmlhbmdsZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjczIDRhMiAyIDAgMCAwLTMuNDYgMGwtOCAxNEEyIDIgMCAwIDAgNCAyMWgxNmEyIDIgMCAwIDAgMS43My0zWiIgfV0KICAgIF07CiAgICB2YXIgVHJvcGh5ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTQuNjZ2MS42MjZhMiAyIDAgMCAxLS45NzYgMS42OTZBNSA1IDAgMCAwIDcgMjEuOTc4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE0LjY2djEuNjI2YTIgMiAwIDAgMCAuOTc2IDEuNjk2QTUgNSAwIDAgMSAxNyAyMS45NzgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggOWgxLjVhMSAxIDAgMCAwIDAtNUgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDIyaDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgOWE2IDYgMCAwIDAgMTIgMFYzYTEgMSAwIDAgMC0xLTFIN2ExIDEgMCAwIDAtMSAxeiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDlINC41YTEgMSAwIDAgMSAwLTVINiIgfV0KICAgIF07CiAgICB2YXIgVHJ1Y2tFbGVjdHJpYyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE5VjdhMiAyIDAgMCAwLTItMkg5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDE5SDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMTloMmExIDEgMCAwIDAgMS0xdi0zLjY1YTEgMSAwIDAgMC0uMjItLjYyTDE4LjMgOS4zOGExIDEgMCAwIDAtLjc4LS4zOEgxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEzdjVhMSAxIDAgMCAwIDEgMWgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMyAyLjE1IDUuMTVhLjQ5NS40OTUgMCAwIDAgLjM1Ljg2aDIuMTVhLjQ3LjQ3IDAgMCAxIC4zNS44NkwzIDkuMDIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNyIsIGN5OiAiMTkiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjciLCBjeTogIjE5IiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIFRydWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMThWNmEyIDIgMCAwIDAtMi0ySDRhMiAyIDAgMCAwLTIgMnYxMWExIDEgMCAwIDAgMSAxaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMThIOSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTE5IDE4aDJhMSAxIDAgMCAwIDEtMXYtMy42NWExIDEgMCAwIDAtLjIyLS42MjRsLTMuNDgtNC4zNUExIDEgMCAwIDAgMTcuNTIgOEgxNCIgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNyIsIGN5OiAiMTgiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjciLCBjeTogIjE4IiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIFR1cmtpc2hMaXJhID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgNCA1IDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgOC41LTEwIDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTJhOSA5IDAgMCAxLTkgOVYzIiB9XQogICAgXTsKICAgIHZhciBUdXJudGFibGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMi4wMWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggOHY0YTggOCAwIDAgMS0xLjA3IDQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMCIsIGN5OiAiMTIiLCByOiAiNCIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjIiLCB5OiAiNCIsIHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxNiIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgVHVydGxlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTIgMTAgMiA0djNhMSAxIDAgMCAwIDEgMWgyYTEgMSAwIDAgMCAxLTF2LTNhOCA4IDAgMSAwLTE2IDB2M2ExIDEgMCAwIDAgMSAxaDJhMSAxIDAgMCAwIDEtMXYtM2wyLTRoNFoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC44MiA3LjkgOCAxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNS4xOCA3LjkgMTIgMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYuOTMgMTBIMjBhMiAyIDAgMCAxIDAgNEgyIiB9XQogICAgXTsKICAgIHZhciBUdk1pbmltYWxQbGF5ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTUuMDMzIDkuNDRhLjY0Ny42NDcgMCAwIDEgMCAxLjEybC00LjA2NSAyLjM1MmEuNjQ1LjY0NSAwIDAgMS0uOTY4LS41NlY3LjY0OGEuNjQ1LjY0NSAwIDAgMSAuOTY3LS41NnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMWgxMCIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE0IiwgeDogIjIiLCB5OiAiMyIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgVHZNaW5pbWFsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMWgxMCIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE0IiwgeDogIjIiLCB5OiAiMyIsIHJ4OiAiMiIgfV0KICAgIF07CiAgICB2YXIgVHYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAyLTUgNS01LTUiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxNSIsIHg6ICIyIiwgeTogIjciLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIFR3aXRjaCA9IFtbInBhdGgiLCB7IGQ6ICJNMjEgMkgzdjE2aDV2NGw0LTRoNWw0LTRWMnptLTEwIDlWN201IDRWNyIgfV1dOwogICAgdmFyIFR3aXR0ZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMiA0cy0uNyAyLjEtMiAzLjRjMS42IDEwLTkuNCAxNy4zLTE4IDExLjYgMi4yLjEgNC40LS42IDYtMkMzIDE1LjUuNSA5LjYgMyA1YzIuMiAyLjYgNS42IDQuMSA5IDQtLjktNC4yIDQtNi42IDctMy44IDEuMSAwIDMtMS4yIDMtMS4yeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgVHlwZU91dGxpbmUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNCAxNi41YS41LjUgMCAwIDAgLjUuNWguNWEyIDIgMCAwIDEgMCA0SDlhMiAyIDAgMCAxIDAtNGguNWEuNS41IDAgMCAwIC41LS41di05YS41LjUgMCAwIDAtLjUtLjVoLTNhLjUuNSAwIDAgMC0uNS41VjhhMiAyIDAgMCAxLTQgMFY1YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnYzYTIgMiAwIDAgMS00IDB2LS41YS41LjUgMCAwIDAtLjUtLjVoLTNhLjUuNSAwIDAgMC0uNS41WiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgVW1icmVsbGFPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxM3Y3YTIgMiAwIDAgMCA0IDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4LjY1NiAxM2gyLjMzNmExIDEgMCAwIDAgLjk3LTEuMjc0IDEwLjI4NCAxMC4yODQgMCAwIDAtMTIuMDctNy41MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNS45NjEgNS45NTdhMTAuMjggMTAuMjggMCAwIDAtMy45MjIgNS43NjlBMSAxIDAgMCAwIDMgMTNoMTAiIH1dCiAgICBdOwogICAgdmFyIFVtYnJlbGxhID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTN2N2EyIDIgMCAwIDAgNCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC45OTIgMTNhMSAxIDAgMCAwIC45Ny0xLjI3NCAxMC4yODQgMTAuMjg0IDAgMCAwLTE5LjkyMyAwQTEgMSAwIDAgMCAzIDEzeiIgfV0KICAgIF07CiAgICB2YXIgVHlwZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDR2MTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA3VjVhMSAxIDAgMCAxIDEtMWgxNGExIDEgMCAwIDEgMSAxdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAyMGg2IiB9XQogICAgXTsKICAgIHZhciBVbmRlcmxpbmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDR2NmE2IDYgMCAwIDAgMTIgMFY0IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjQiLCB4MjogIjIwIiwgeTE6ICIyMCIsIHkyOiAiMjAiIH1dCiAgICBdOwogICAgdmFyIFVuZG8yID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNCA0IDlsNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgOWgxMC41YTUuNSA1LjUgMCAwIDEgNS41IDUuNWE1LjUgNS41IDAgMCAxLTUuNSA1LjVIMTEiIH1dCiAgICBdOwogICAgdmFyIFVuZG9Eb3QgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxN2E5IDkgMCAwIDAtMTUtNi43TDMgMTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA3djZoNiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxNyIsIHI6ICIxIiB9XQogICAgXTsKICAgIHZhciBVbmRvID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA3djZoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxN2E5IDkgMCAwIDAtOS05IDkgOSAwIDAgMC02IDIuM0wzIDEzIiB9XQogICAgXTsKICAgIHZhciBVbmZvbGRIb3Jpem9udGFsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTJoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEySDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDh2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIwdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkgMTUgMy0zLTMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01IDktMyAzIDMgMyIgfV0KICAgIF07CiAgICB2YXIgVW5ncm91cCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICI2IiwgeDogIjUiLCB5OiAiNCIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiNiIsIHg6ICIxMSIsIHk6ICIxNCIsIHJ4OiAiMSIgfV0KICAgIF07CiAgICB2YXIgVW5mb2xkVmVydGljYWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMnYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA4VjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMkgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEySDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgMTktMyAzLTMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA1LTMtMy0zIDMiIH1dCiAgICBdOwogICAgdmFyIFVuaXZlcnNpdHkgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAyMXYtM2EyIDIgMCAwIDAtNCAwdjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE2aC4wMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMiA3YTEgMSAwIDAgMC0xLTFoLTJhMiAyIDAgMCAxLTEuMTQzLS4zNTlMMTMuMTQzIDIuMzZhMiAyIDAgMCAwLTIuMjg2LS4wMDFMNi4xNDMgNS42NEEyIDIgMCAwIDEgNSA2SDNhMSAxIDAgMCAwLTEgMXYxMmEyIDIgMCAwIDAgMiAyaDE2YTIgMiAwIDAgMCAyLTJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTZoLjAxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEwIiwgcjogIjIiIH1dCiAgICBdOwogICAgdmFyIFVubGluazIgPSBbWyJwYXRoIiwgeyBkOiAiTTE1IDdoMmE1IDUgMCAwIDEgMCAxMGgtMm0tNiAwSDdBNSA1IDAgMCAxIDcgN2gyIiB9XV07CiAgICB2YXIgVW5saW5rID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTguODQgMTIuMjUgMS43Mi0xLjcxaC0uMDJhNS4wMDQgNS4wMDQgMCAwIDAtLjEyLTcuMDcgNS4wMDYgNS4wMDYgMCAwIDAtNi45NSAwbC0xLjcyIDEuNzEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIm01LjE3IDExLjc1LTEuNzEgMS43MWE1LjAwNCA1LjAwNCAwIDAgMCAuMTIgNy4wNyA1LjAwNiA1LjAwNiAwIDAgMCA2Ljk1IDBsMS43MS0xLjcxIiB9CiAgICAgIF0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI4IiwgeDI6ICI4IiwgeTE6ICIyIiwgeTI6ICI1IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjIiLCB4MjogIjUiLCB5MTogIjgiLCB5MjogIjgiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTYiLCB4MjogIjE2IiwgeTE6ICIxOSIsIHkyOiAiMjIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTkiLCB4MjogIjIyIiwgeTE6ICIxNiIsIHkyOiAiMTYiIH1dCiAgICBdOwogICAgdmFyIFVucGx1ZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5IDUgMy0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMjIgMy0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMyAyMC4zYTIuNCAyLjQgMCAwIDAgMy40IDBMMTIgMThsLTYtNi0yLjMgMi4zYTIuNCAyLjQgMCAwIDAgMCAzLjRaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcuNSAxMy41IDEwIDExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjUgMTYuNSAxMyAxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMiA2IDYgNiAyLjMtMi4zYTIuNCAyLjQgMCAwIDAgMC0zLjRsLTIuNi0yLjZhMi40IDIuNCAwIDAgMC0zLjQgMFoiIH1dCiAgICBdOwogICAgdmFyIFVwbG9hZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDN2MTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgOC01LTUtNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE1djRhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ2LTQiIH1dCiAgICBdOwogICAgdmFyIFVzYiA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTAiLCBjeTogIjciLCByOiAiMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjQiLCBjeTogIjIwIiwgcjogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC43IDE5LjMgMTkgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAzLTMgMSAyIDJaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuMjYgNy42OCA1IDEybDIgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCAxNCA1IDIgMy41LTMuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOCAxMiAxLTEgMSAxLTEgMVoiIH1dCiAgICBdOwogICAgdmFyIFVzZXJDaGVjayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDExIDIgMiA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMjF2LTJhNCA0IDAgMCAwLTQtNEg2YTQgNCAwIDAgMC00IDR2MiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjciLCByOiAiNCIgfV0KICAgIF07CiAgICB2YXIgVXNlckNvZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE1SDZhNCA0IDAgMCAwLTQgNHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0LjMwNSAxNi41My45MjMtLjM4MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNS4yMjggMTMuODUyLS45MjMtLjM4MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNi44NTIgMTIuMjI4LS4zODMtLjkyMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNi44NTIgMTcuNzcyLS4zODMuOTI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5LjE0OCAxMi4yMjguMzgzLS45MjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkuNTMgMTguNjk2LS4zODItLjkyNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMC43NzIgMTMuODUyLjkyNC0uMzgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwLjc3MiAxNi4xNDguOTI0LjM4MyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICIxNSIsIHI6ICIzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOSIsIGN5OiAiNyIsIHI6ICI0IiB9XQogICAgXTsKICAgIHZhciBVc2VyTG9jayA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTAiLCBjeTogIjciLCByOiAiNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC4zIDE1SDdhNCA0IDAgMCAwLTQgNHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDE1LjVWMTRhMiAyIDAgMCAxIDQgMHYxLjUiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiOCIsIGhlaWdodDogIjUiLCB4OiAiMTMiLCB5OiAiMTYiLCByeDogIi44OTkiIH1dCiAgICBdOwogICAgdmFyIFVzZXJNaW51cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDIxdi0yYTQgNCAwIDAgMC00LTRINmE0IDQgMCAwIDAtNCA0djIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICI3IiwgcjogIjQiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMjIiLCB4MjogIjE2IiwgeTE6ICIxMSIsIHkyOiAiMTEiIH1dCiAgICBdOwogICAgdmFyIFVzZXJQZW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMS41IDE1SDdhNCA0IDAgMCAwLTQgNHYyIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxLjM3OCAxNi42MjZhMSAxIDAgMCAwLTMuMDA0LTMuMDA0bC00LjAxIDQuMDEyYTIgMiAwIDAgMC0uNTA2Ljg1NGwtLjgzNyAyLjg3YS41LjUgMCAwIDAgLjYyLjYybDIuODctLjgzN2EyIDIgMCAwIDAgLjg1NC0uNTA2eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEwIiwgY3k6ICI3IiwgcjogIjQiIH1dCiAgICBdOwogICAgdmFyIFVzZXJQbHVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMjF2LTJhNCA0IDAgMCAwLTQtNEg2YTQgNCAwIDAgMC00IDR2MiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjciLCByOiAiNCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxOSIsIHgyOiAiMTkiLCB5MTogIjgiLCB5MjogIjE0IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjIyIiwgeDI6ICIxNiIsIHkxOiAiMTEiLCB5MjogIjExIiB9XQogICAgXTsKICAgIHZhciBVc2VyUm91bmRDaGVjayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjFhOCA4IDAgMCAxIDEzLjI5Mi02IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTAiLCBjeTogIjgiLCByOiAiNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAxOSAyIDIgNC00IiB9XQogICAgXTsKICAgIHZhciBVc2VyUm91bmRDb2cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC4zMDUgMTkuNTMuOTIzLS4zODIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUuMjI4IDE2Ljg1Mi0uOTIzLS4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYuODUyIDE1LjIyOC0uMzgzLS45MjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYuODUyIDIwLjc3Mi0uMzgzLjkyNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOS4xNDggMTUuMjI4LjM4My0uOTIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5LjUzIDIxLjY5Ni0uMzgyLS45MjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMWE4IDggMCAwIDEgMTAuNDM0LTcuNjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAuNzcyIDE2Ljg1Mi45MjQtLjM4MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMC43NzIgMTkuMTQ4LjkyNC4zODMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMCIsIGN5OiAiOCIsIHI6ICI1IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjE4IiwgcjogIjMiIH1dCiAgICBdOwogICAgdmFyIFVzZXJSb3VuZE1pbnVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMWE4IDggMCAwIDEgMTMuMjkyLTYiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMCIsIGN5OiAiOCIsIHI6ICI1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE5aC02IiB9XQogICAgXTsKICAgIHZhciBVc2VyUm91bmRQZW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIxYTggOCAwIDAgMSAxMC44MjEtNy40ODciIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEuMzc4IDE2LjYyNmExIDEgMCAwIDAtMy4wMDQtMy4wMDRsLTQuMDEgNC4wMTJhMiAyIDAgMCAwLS41MDYuODU0bC0uODM3IDIuODdhLjUuNSAwIDAgMCAuNjIuNjJsMi44Ny0uODM3YTIgMiAwIDAgMCAuODU0LS41MDZ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTAiLCBjeTogIjgiLCByOiAiNSIgfV0KICAgIF07CiAgICB2YXIgVXNlclJvdW5kUGx1cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjFhOCA4IDAgMCAxIDEzLjI5Mi02IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTAiLCBjeTogIjgiLCByOiAiNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxNnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE5aC02IiB9XQogICAgXTsKICAgIHZhciBVc2VyUm91bmRTZWFyY2ggPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEwIiwgY3k6ICI4IiwgcjogIjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMWE4IDggMCAwIDEgMTAuNDM0LTcuNjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiMTgiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiAyMi0xLjktMS45IiB9XQogICAgXTsKICAgIHZhciBVc2VyUm91bmRYID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMWE4IDggMCAwIDEgMTEuODczLTciIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMCIsIGN5OiAiOCIsIHI6ICI1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDE3IDUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiAxNy01IDUiIH1dCiAgICBdOwogICAgdmFyIFVzZXJSb3VuZCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjgiLCByOiAiNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAyMWE4IDggMCAwIDAtMTYgMCIgfV0KICAgIF07CiAgICB2YXIgVXNlclNlYXJjaCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTAiLCBjeTogIjciLCByOiAiNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC4zIDE1SDdhNCA0IDAgMCAwLTQgNHYyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTciLCBjeTogIjE3IiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMjEtMS45LTEuOSIgfV0KICAgIF07CiAgICB2YXIgVXNlclN0YXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNi4wNTEgMTIuNjE2YTEgMSAwIDAgMSAxLjkwOS4wMjRsLjczNyAxLjQ1MmExIDEgMCAwIDAgLjczNy41MzVsMS42MzQuMjU2YTEgMSAwIDAgMSAuNTg4IDEuODA2bC0xLjE3MiAxLjE2OGExIDEgMCAwIDAtLjI4Mi44NjZsLjI1OSAxLjYxM2ExIDEgMCAwIDEtMS41NDEgMS4xMzRsLTEuNDY1LS43NWExIDEgMCAwIDAtLjkxMiAwbC0xLjQ2NS43NWExIDEgMCAwIDEtMS41MzktMS4xMzNsLjI1OC0xLjYxM2ExIDEgMCAwIDAtLjI4Mi0uODY2bC0xLjE1Ni0xLjE1M2ExIDEgMCAwIDEgLjU3Mi0xLjgyMmwxLjYzMy0uMjU2YTEgMSAwIDAgMCAuNzM3LS41MzV6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTVIN2E0IDQgMCAwIDAtNCA0djIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMCIsIGN5OiAiNyIsIHI6ICI0IiB9XQogICAgXTsKICAgIHZhciBVc2VyWCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDIxdi0yYTQgNCAwIDAgMC00LTRINmE0IDQgMCAwIDAtNCA0djIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICI3IiwgcjogIjQiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTciLCB4MjogIjIyIiwgeTE6ICI4IiwgeTI6ICIxMyIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIyMiIsIHgyOiAiMTciLCB5MTogIjgiLCB5MjogIjEzIiB9XQogICAgXTsKICAgIHZhciBVc2VyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMjF2LTJhNCA0IDAgMCAwLTQtNEg5YTQgNCAwIDAgMC00IDR2MiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICI3IiwgcjogIjQiIH1dCiAgICBdOwogICAgdmFyIFVzZXJzUm91bmQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAyMWE4IDggMCAwIDAtMTYgMCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEwIiwgY3k6ICI4IiwgcjogIjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMjBjMC0zLjM3LTItNi41LTQtOGE1IDUgMCAwIDAtLjQ1LTguMyIgfV0KICAgIF07CiAgICB2YXIgVXNlcnMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAyMXYtMmE0IDQgMCAwIDAtNC00SDZhNCA0IDAgMCAwLTQgNHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDMuMTI4YTQgNCAwIDAgMSAwIDcuNzQ0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDIxdi0yYTQgNCAwIDAgMC0zLTMuODciIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICI3IiwgcjogIjQiIH1dCiAgICBdOwogICAgdmFyIFV0ZW5zaWxzQ3Jvc3NlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDItMi4zIDIuM2EzIDMgMCAwIDAgMCA0LjJsMS44IDEuOGEzIDMgMCAwIDAgNC4yIDBMMjIgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxNSAzLjMgMy4zYTQuMiA0LjIgMCAwIDAgMCA2bDcuMyA3LjNjLjcuNyAyIC43IDIuOCAwTDE1IDE1Wm0wIDAgNyA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIuMSAyMS44IDYuNC02LjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkgNS03IDciIH1dCiAgICBdOwogICAgdmFyIFV0ZW5zaWxzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAydjdjMCAxLjEuOSAyIDIgMmg0YTIgMiAwIDAgMCAyLTJWMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDJ2MjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTVWMmE1IDUgMCAwIDAtNSA1djZjMCAxLjEuOSAyIDIgMmgzWm0wIDB2NyIgfV0KICAgIF07CiAgICB2YXIgVXRpbGl0eVBvbGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgNWgyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDN2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDN2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAzdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgM3YyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5IDUtNyA3LTctNyIgfV0KICAgIF07CiAgICB2YXIgVmFuID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTMgNnY1YTEgMSAwIDAgMCAxIDFoNi4xMDJhMSAxIDAgMCAxIC43MTIuMjk4bC44OTguOTFhMSAxIDAgMCAxIC4yODguNzAyVjE3YTEgMSAwIDAgMS0xIDFoLTMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxOEgzYTEgMSAwIDAgMS0xLTFWOGEyIDIgMCAwIDEgMi0yaDEyYzEuMSAwIDIuMS44IDIuNCAxLjhsMS4xNzYgNC4yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMThoNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE2IiwgY3k6ICIxOCIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNyIsIGN5OiAiMTgiLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgVmFyaWFibGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIxcy00LTMtNC05IDQtOSA0LTkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgM3M0IDMgNCA5LTQgOS00IDkiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTUiLCB4MjogIjkiLCB5MTogIjkiLCB5MjogIjE1IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjkiLCB4MjogIjE1IiwgeTE6ICI5IiwgeTI6ICIxNSIgfV0KICAgIF07CiAgICB2YXIgVmF1bHQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjcuNSIsIGN5OiAiNy41IiwgcjogIi41IiwgZmlsbDogImN1cnJlbnRDb2xvciIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03LjkgNy45IDIuNyAyLjciIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNi41IiwgY3k6ICI3LjUiLCByOiAiLjUiLCBmaWxsOiAiY3VycmVudENvbG9yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEzLjQgMTAuNiAyLjctMi43IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNy41IiwgY3k6ICIxNi41IiwgcjogIi41IiwgZmlsbDogImN1cnJlbnRDb2xvciIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03LjkgMTYuMSAyLjctMi43IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYuNSIsIGN5OiAiMTYuNSIsIHI6ICIuNSIsIGZpbGw6ICJjdXJyZW50Q29sb3IiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMuNCAxMy40IDIuNyAyLjciIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMiIgfV0KICAgIF07CiAgICB2YXIgVmVjdG9yU3F1YXJlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkuNSA3YTI0IDI0IDAgMCAxIDAgMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC41IDdhMjQgMjQgMCAwIDAgMCAxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE5LjVhMjQgMjQgMCAwIDAgMTAgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDQuNWEyNCAyNCAwIDAgMSAxMCAwIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMTciLCB5OiAiMTciLCB3aWR0aDogIjUiLCBoZWlnaHQ6ICI1Iiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMTciLCB5OiAiMiIsIHdpZHRoOiAiNSIsIGhlaWdodDogIjUiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjE3Iiwgd2lkdGg6ICI1IiwgaGVpZ2h0OiAiNSIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjIiLCB5OiAiMiIsIHdpZHRoOiAiNSIsIGhlaWdodDogIjUiLCByeDogIjEiIH1dCiAgICBdOwogICAgdmFyIFZlZ2FuID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgOHE2IDAgNi02LTYgMC02IDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuNDEgMy41OWExMCAxMCAwIDEgMCAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyYTI2LjYgMjYuNiAwIDAgMSAxMCAyMGMuOS02LjgyIDEuNS05LjUgNC0xNCIgfV0KICAgIF07CiAgICB2YXIgVmVuZXRpYW5NYXNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTFjLTEuNSAwLTIuNS41LTMgMiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDZhMiAyIDAgMCAwLTIgMnY0YTUgNSAwIDAgMCA1IDUgOCA4IDAgMCAxIDUgMiA4IDggMCAwIDEgNS0yIDUgNSAwIDAgMCA1LTVWOGEyIDIgMCAwIDAtMi0yaC0zYTggOCAwIDAgMC01IDIgOCA4IDAgMCAwLTUtMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxMWMxLjUgMCAyLjUuNSAzIDIiIH1dCiAgICBdOwogICAgdmFyIFZlbnVzQW5kTWFycyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDIwaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTZ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAyaDR2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAyLTUuNDYgNS40NiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMSIsIHI6ICI1IiB9XQogICAgXTsKICAgIHZhciBWZW51cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE1djciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxOWg2IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjkiLCByOiAiNiIgfV0KICAgIF07CiAgICB2YXIgVmlicmF0ZU9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgOCAyIDItMiAyIDIgMi0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgOC0yIDIgMiAyLTIgMiAyIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA4djEwYzAgLjU1LjQ1IDEgMSAxaDZjLjU1IDAgMS0uNDUgMS0xdi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEwLjM0VjZjMC0uNTUtLjQ1LTEtMS0xaC00LjM0IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjIiLCB4MjogIjIyIiwgeTE6ICIyIiwgeTI6ICIyMiIgfV0KICAgIF07CiAgICB2YXIgVmlicmF0ZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgOCAyIDItMiAyIDIgMi0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgOC0yIDIgMiAyLTIgMiAyIDIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiOCIsIGhlaWdodDogIjE0IiwgeDogIjgiLCB5OiAiNSIsIHJ4OiAiMSIgfV0KICAgIF07CiAgICB2YXIgVmlkZW9PZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC42NiA2SDE0YTIgMiAwIDAgMSAyIDJ2Mi41bDUuMjQ4LTMuMDYyQS41LjUgMCAwIDEgMjIgNy44N3Y4LjE5NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNmEyIDIgMCAwIDEtMiAySDRhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dCiAgICBdOwogICAgdmFyIFZpZGVvID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTMgNS4yMjMgMy40ODJhLjUuNSAwIDAgMCAuNzc3LS40MTZWNy44N2EuNS41IDAgMCAwLS43NTItLjQzMkwxNiAxMC41IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMiIsIHk6ICI2Iiwgd2lkdGg6ICIxNCIsIGhlaWdodDogIjEyIiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBWaWRlb3RhcGUgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE2IiwgeDogIjIiLCB5OiAiNCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDhoMjAiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI4IiwgY3k6ICIxNCIsIHI6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJoOCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE2IiwgY3k6ICIxNCIsIHI6ICIyIiB9XQogICAgXTsKICAgIHZhciBWaWV3ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTd2MmEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA3VjVhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE4Ljk0NCAxMi4zM2ExIDEgMCAwIDAgMC0uNjYgNy41IDcuNSAwIDAgMC0xMy44ODggMCAxIDEgMCAwIDAgMCAuNjYgNy41IDcuNSAwIDAgMCAxMy44ODggMCIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgVm9pY2VtYWlsID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICI2IiwgY3k6ICIxMiIsIHI6ICI0IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjEyIiwgcjogIjQiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiNiIsIHgyOiAiMTgiLCB5MTogIjE2IiwgeTI6ICIxNiIgfV0KICAgIF07CiAgICB2YXIgVm9sbGV5YmFsbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExLjEgNy4xYTE2LjU1IDE2LjU1IDAgMCAxIDEwLjkgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMmExMi42IDEyLjYgMCAwIDEtOC43IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYuOCAxMy42YTE2LjU1IDE2LjU1IDAgMCAxLTkgNy41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwLjcgMTdhMTIuOCAxMi44IDAgMCAwLTguNy01IDEzLjMgMTMuMyAwIDAgMSAwLTEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMyAzLjhhMTYuNTUgMTYuNTUgMCAwIDAgMS45IDExLjUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dCiAgICBdOwogICAgdmFyIFZvbHVtZTEgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMSA0LjcwMmEuNzA1LjcwNSAwIDAgMC0xLjIwMy0uNDk4TDYuNDEzIDcuNTg3QTEuNCAxLjQgMCAwIDEgNS40MTYgOEgzYTEgMSAwIDAgMC0xIDF2NmExIDEgMCAwIDAgMSAxaDIuNDE2YTEuNCAxLjQgMCAwIDEgLjk5Ny40MTNsMy4zODMgMy4zODRBLjcwNS43MDUgMCAwIDAgMTEgMTkuMjk4eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA5YTUgNSAwIDAgMSAwIDYiIH1dCiAgICBdOwogICAgdmFyIFZvbHVtZTIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMSA0LjcwMmEuNzA1LjcwNSAwIDAgMC0xLjIwMy0uNDk4TDYuNDEzIDcuNTg3QTEuNCAxLjQgMCAwIDEgNS40MTYgOEgzYTEgMSAwIDAgMC0xIDF2NmExIDEgMCAwIDAgMSAxaDIuNDE2YTEuNCAxLjQgMCAwIDEgLjk5Ny40MTNsMy4zODMgMy4zODRBLjcwNS43MDUgMCAwIDAgMTEgMTkuMjk4eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA5YTUgNSAwIDAgMSAwIDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkuMzY0IDE4LjM2NGE5IDkgMCAwIDAgMC0xMi43MjgiIH1dCiAgICBdOwogICAgdmFyIFZvbHVtZU9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDlhNSA1IDAgMCAxIC45NSAyLjI5MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOS4zNjQgNS42MzZhOSA5IDAgMCAxIDEuODg5IDkuOTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTcgNy0uNTg3LjU4N0ExLjQgMS40IDAgMCAxIDUuNDE2IDhIM2ExIDEgMCAwIDAtMSAxdjZhMSAxIDAgMCAwIDEgMWgyLjQxNmExLjQgMS40IDAgMCAxIC45OTcuNDEzbDMuMzgzIDMuMzg0QS43MDUuNzA1IDAgMCAwIDExIDE5LjI5OFYxMSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjgyOCA0LjE3MkEuNjg2LjY4NiAwIDAgMSAxMSA0LjY1N3YuNjg2IiB9XQogICAgXTsKICAgIHZhciBWb2x1bWVYID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEgNC43MDJhLjcwNS43MDUgMCAwIDAtMS4yMDMtLjQ5OEw2LjQxMyA3LjU4N0ExLjQgMS40IDAgMCAxIDUuNDE2IDhIM2ExIDEgMCAwIDAtMSAxdjZhMSAxIDAgMCAwIDEgMWgyLjQxNmExLjQgMS40IDAgMCAxIC45OTcuNDEzbDMuMzgzIDMuMzg0QS43MDUuNzA1IDAgMCAwIDExIDE5LjI5OHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImxpbmUiLCB7IHgxOiAiMjIiLCB4MjogIjE2IiwgeTE6ICI5IiwgeTI6ICIxNSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNiIsIHgyOiAiMjIiLCB5MTogIjkiLCB5MjogIjE1IiB9XQogICAgXTsKICAgIHZhciBWb2x1bWUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMSA0LjcwMmEuNzA1LjcwNSAwIDAgMC0xLjIwMy0uNDk4TDYuNDEzIDcuNTg3QTEuNCAxLjQgMCAwIDEgNS40MTYgOEgzYTEgMSAwIDAgMC0xIDF2NmExIDEgMCAwIDAgMSAxaDIuNDE2YTEuNCAxLjQgMCAwIDEgLjk5Ny40MTNsMy4zODMgMy4zODRBLjcwNS43MDUgMCAwIDAgMTEgMTkuMjk4eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgVm90ZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTIgMiAyIDQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDdjMC0xLjEuOS0yIDItMmgxMGEyIDIgMCAwIDEgMiAydjEySDVWN1oiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTlIMiIgfV0KICAgIF07CiAgICB2YXIgV2FsbGV0Q2FyZHMgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDlhMiAyIDAgMCAxIDItMmgxNGEyIDIgMCAwIDEgMiAyIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMyAxMWgzYy44IDAgMS42LjMgMi4xLjlsMS4xLjljMS42IDEuNiA0LjEgMS42IDUuNyAwbDEuMS0uOWMuNS0uNSAxLjMtLjkgMi4xLS45SDIxIiB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgV2FsbGV0TWluaW1hbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDE0aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDdoMTJhMiAyIDAgMCAxIDIgMnYxMGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMTQiIH1dCiAgICBdOwogICAgdmFyIFdhbGxldCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE5IDdWNGExIDEgMCAwIDAtMS0xSDVhMiAyIDAgMCAwIDAgNGgxNWExIDEgMCAwIDEgMSAxdjRoLTNhMiAyIDAgMCAwIDAgNGgzYTEgMSAwIDAgMCAxLTF2LTJhMSAxIDAgMCAwLTEtMSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDV2MTRhMiAyIDAgMCAwIDIgMmgxNWExIDEgMCAwIDAgMS0xdi00IiB9XQogICAgXTsKICAgIHZhciBXYWxscGFwZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN3Y0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjFoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDE3IDYuMS02LjFhMiAyIDAgMCAxIDIuODEuMDFMMjIgMTUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI4IiwgY3k6ICI5IiwgcjogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjMiLCB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTQiLCByeDogIjIiIH1dCiAgICBdOwogICAgdmFyIFdhbmRTcGFya2xlcyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTIxLjY0IDMuNjQtMS4yOC0xLjI4YTEuMjEgMS4yMSAwIDAgMC0xLjcyIDBMMi4zNiAxOC42NGExLjIxIDEuMjEgMCAwIDAgMCAxLjcybDEuMjggMS4yOGExLjIgMS4yIDAgMCAwIDEuNzIgMEwyMS42NCA1LjM2YTEuMiAxLjIgMCAwIDAgMC0xLjcyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDcgMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgNnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE0djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgOEgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE2aC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDNIOSIgfV0KICAgIF07CiAgICB2YXIgV2FuZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDRWMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxNnYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDloMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCA5aDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuOCAxMS44IDE5IDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDloLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjggNi4yIDE5IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMyAyMSA5LTkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIuMiA2LjIgMTEgNSIgfV0KICAgIF07CiAgICB2YXIgV2FyZWhvdXNlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMjFWMTBhMSAxIDAgMCAwLTEtMUg3YTEgMSAwIDAgMC0xIDF2MTEiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjIgMTlhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMS4xMzItMS44MDNsNy45NS0zLjk3NGEyIDIgMCAwIDEgMS44MzcgMGw3Ljk0OCAzLjk3NEEyIDIgMCAwIDEgMjIgOHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxM2gxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE3aDEyIiB9XQogICAgXTsKICAgIHZhciBXYXNoaW5nTWFjaGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgNmgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDZoLjAxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMjAiLCB4OiAiMyIsIHk6ICIyIiwgcng6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEzIiwgcjogIjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMThhMi41IDIuNSAwIDAgMCAwLTUgMi41IDIuNSAwIDAgMSAwLTUiIH1dCiAgICBdOwogICAgdmFyIFdhdGNoID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTB2Mi4ybDEuNiAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2LjEzIDcuNjYtLjgxLTQuMDVhMiAyIDAgMCAwLTItMS42MWgtMi42OGEyIDIgMCAwIDAtMiAxLjYxbC0uNzggNC4wNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03Ljg4IDE2LjM2LjggNGEyIDIgMCAwIDAgMiAxLjYxaDIuNzJhMiAyIDAgMCAwIDItMS42MWwuODEtNC4wNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICI2IiB9XQogICAgXTsKICAgIHZhciBXYXZlc0Fycm93RG93biA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEwTDEyIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNkwxMiAxMEw4IDYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMiAxNUMyLjYgMTUuNSAzLjIgMTYgNC41IDE2QzcgMTYgNyAxNCA5LjUgMTRDMTIuMSAxNCAxMS45IDE2IDE0LjUgMTZDMTcgMTYgMTcgMTQgMTkuNSAxNEMyMC44IDE0IDIxLjQgMTQuNSAyMiAxNSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yIDIxQzIuNiAyMS41IDMuMiAyMiA0LjUgMjJDNyAyMiA3IDIwIDkuNSAyMEMxMi4xIDIwIDExLjkgMjIgMTQuNSAyMkMxNyAyMiAxNyAyMCAxOS41IDIwQzIwLjggMjAgMjEuNCAyMC41IDIyIDIxIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBXYXZlc0xhZGRlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDVhMiAyIDAgMCAwLTIgMnYxMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yIDE4Yy42LjUgMS4yIDEgMi41IDEgMi41IDAgMi41LTIgNS0yIDIuNiAwIDIuNCAyIDUgMiAyLjUgMCAyLjUtMiA1LTIgMS4zIDAgMS45LjUgMi41IDEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxM2gxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDloMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA1YTIgMiAwIDAgMC0yIDJ2MTEiIH1dCiAgICBdOwogICAgdmFyIFdhdmVzQXJyb3dVcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2OCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yIDE1Yy42LjUgMS4yIDEgMi41IDEgMi41IDAgMi41LTIgNS0yIDIuNiAwIDIuNCAyIDUgMiAyLjUgMCAyLjUtMiA1LTIgMS4zIDAgMS45LjUgMi41IDEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMiAyMWMuNi41IDEuMiAxIDIuNSAxIDIuNSAwIDIuNS0yIDUtMiAyLjYgMCAyLjQgMiA1IDIgMi41IDAgMi41LTIgNS0yIDEuMyAwIDEuOS41IDIuNSAxIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggNiA0LTQgNCA0IiB9XQogICAgXTsKICAgIHZhciBXYXZlcyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMiA2Yy42LjUgMS4yIDEgMi41IDFDNyA3IDcgNSA5LjUgNWMyLjYgMCAyLjQgMiA1IDIgMi41IDAgMi41LTIgNS0yIDEuMyAwIDEuOS41IDIuNSAxIiB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yIDEyYy42LjUgMS4yIDEgMi41IDEgMi41IDAgMi41LTIgNS0yIDIuNiAwIDIuNCAyIDUgMiAyLjUgMCAyLjUtMiA1LTIgMS4zIDAgMS45LjUgMi41IDEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMiAxOGMuNi41IDEuMiAxIDIuNSAxIDIuNSAwIDIuNS0yIDUtMiAyLjYgMCAyLjQgMiA1IDIgMi41IDAgMi41LTIgNS0yIDEuMyAwIDEuOS41IDIuNSAxIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBXYXlwb2ludHMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMC41ODYgNS40MTQtNS4xNzIgNS4xNzIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTguNTg2IDEzLjQxNC01LjE3MiA1LjE3MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEyaDEyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjIwIiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiNCIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMjAiLCBjeTogIjEyIiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI0IiwgY3k6ICIxMiIsIHI6ICIyIiB9XQogICAgXTsKICAgIHZhciBXZWJjYW0gPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMCIsIHI6ICI4IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEwIiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMmgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMnYtNCIgfV0KICAgIF07CiAgICB2YXIgV2ViaG9va09mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDE3aC01Yy0xLjA5LS4wMi0xLjk0LjkyLTIuNSAxLjlBMyAzIDAgMSAxIDIuNTcgMTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAzLjRhNCA0IDAgMCAxIDYuNTIuNjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNiAxNyAzLjEtNS44YTIuNSAyLjUgMCAwIDAgLjA1Ny0yLjA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwLjMgMjAuM2E0IDQgMCAwIDEtMi4zLjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTguNiAxM2E0IDQgMCAwIDEgMy4zNTcgMy40MTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIgNiAuNiAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0KICAgIF07CiAgICB2YXIgV2ViaG9vayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE2Ljk4aC01Ljk5Yy0xLjEgMC0xLjk1Ljk0LTIuNDggMS45QTQgNCAwIDAgMSAyIDE3Yy4wMS0uNy4yLTEuNC41Ny0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYgMTcgMy4xMy01Ljc4Yy41My0uOTcuMS0yLjE4LS41LTMuMWE0IDQgMCAxIDEgNi44OS00LjA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDYgMy4xMyA1LjczQzE1LjY2IDEyLjcgMTYuOSAxMyAxOCAxM2E0IDQgMCAwIDEgMCA4IiB9XQogICAgXTsKICAgIHZhciBXZWlnaHRUaWxkZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYuNSA4YTIgMiAwIDAgMC0xLjkwNiAxLjQ2TDIuMSAxOC41QTIgMiAwIDAgMCA0IDIxaDE2YTIgMiAwIDAgMCAxLjkyNS0yLjU0TDE5LjQgOS41QTIgMiAwIDAgMCAxNy40OCA4eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03Ljk5OSAxNWEyLjUgMi41IDAgMCAxIDQgMCAyLjUgMi41IDAgMCAwIDQgMCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICI1IiwgcjogIjMiIH1dCiAgICBdOwogICAgdmFyIFdlaWdodCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjUiLCByOiAiMyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02LjUgOGEyIDIgMCAwIDAtMS45MDUgMS40NkwyLjEgMTguNUEyIDIgMCAwIDAgNCAyMWgxNmEyIDIgMCAwIDAgMS45MjUtMi41NEwxOS40IDkuNUEyIDIgMCAwIDAgMTcuNDggOFoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFdoZWF0T2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyMiAxMC0xMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiA4LTEuMTcgMS4xNyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTMuNDcgMTIuNTMgNSAxMWwxLjUzIDEuNTNhMy41IDMuNSAwIDAgMSAwIDQuOTRMNSAxOWwtMS41My0xLjUzYTMuNSAzLjUgMCAwIDEgMC00Ljk0WiIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCA4LS41My41M2EzLjUgMy41IDAgMCAwIDAgNC45NEw5IDE1bDEuNTMtMS41M2MuNTUtLjU1Ljg4LTEuMjUuOTgtMS45NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC45MSA1LjI2Yy4xNS0uMjYuMzQtLjUxLjU2LS43M0wxMyAzbDEuNTMgMS41M2EzLjUgMy41IDAgMCAxIC4yOCA0LjYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDJoMnYyYTQgNCAwIDAgMS00IDRoLTJWNmE0IDQgMCAwIDEgNC00WiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMS40NyAxNy40NyAxMyAxOWwtMS41MyAxLjUzYTMuNSAzLjUgMCAwIDEtNC45NCAwTDUgMTlsMS41My0xLjUzYTMuNSAzLjUgMCAwIDEgNC45NCAwWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAxNi0uNTMuNTNhMy41IDMuNSAwIDAgMS00Ljk0IDBMOSAxNWwxLjUzLTEuNTNhMy40OSAzLjQ5IDAgMCAxIDEuOTctLjk4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4Ljc0IDEzLjA5Yy4yNi0uMTUuNTEtLjM0LjczLS41NkwyMSAxMWwtMS41My0xLjUzYTMuNSAzLjUgMCAwIDAtNC42Mi0uMjgiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMiIsIHgyOiAiMjIiLCB5MTogIjIiLCB5MjogIjIyIiB9XQogICAgXTsKICAgIHZhciBXaG9sZVdvcmQgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjciLCBjeTogIjEyIiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOXY2IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTciLCBjeTogIjEyIiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgN3Y4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE3djFjMCAuNS0uNSAxLTEgMUgzYy0uNSAwLTEtLjUtMS0xdi0xIiB9XQogICAgXTsKICAgIHZhciBXaGVhdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjIgMTYgOCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTMuNDcgMTIuNTMgNSAxMWwxLjUzIDEuNTNhMy41IDMuNSAwIDAgMSAwIDQuOTRMNSAxOWwtMS41My0xLjUzYTMuNSAzLjUgMCAwIDEgMC00Ljk0WiIgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk03LjQ3IDguNTMgOSA3bDEuNTMgMS41M2EzLjUgMy41IDAgMCAxIDAgNC45NEw5IDE1bC0xLjUzLTEuNTNhMy41IDMuNSAwIDAgMSAwLTQuOTRaIiB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTExLjQ3IDQuNTMgMTMgM2wxLjUzIDEuNTNhMy41IDMuNSAwIDAgMSAwIDQuOTRMMTMgMTFsLTEuNTMtMS41M2EzLjUgMy41IDAgMCAxIDAtNC45NFoiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDJoMnYyYTQgNCAwIDAgMS00IDRoLTJWNmE0IDQgMCAwIDEgNC00WiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMS40NyAxNy40NyAxMyAxOWwtMS41MyAxLjUzYTMuNSAzLjUgMCAwIDEtNC45NCAwTDUgMTlsMS41My0xLjUzYTMuNSAzLjUgMCAwIDEgNC45NCAwWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNS40NyAxMy40NyAxNyAxNWwtMS41MyAxLjUzYTMuNSAzLjUgMCAwIDEtNC45NCAwTDkgMTVsMS41My0xLjUzYTMuNSAzLjUgMCAwIDEgNC45NCAwWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOS40NyA5LjQ3IDIxIDExbC0xLjUzIDEuNTNhMy41IDMuNSAwIDAgMS00Ljk0IDBMMTMgMTFsMS41My0xLjUzYTMuNSAzLjUgMCAwIDEgNC45NCAwWiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgICB2YXIgV2lmaUNvZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0LjMwNSAxOS41My45MjMtLjM4MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNS4yMjggMTYuODUyLS45MjMtLjM4MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNi44NTIgMTUuMjI4LS4zODMtLjkyMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNi44NTIgMjAuNzcyLS4zODMuOTI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5LjE0OCAxNS4yMjguMzgzLS45MjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkuNTMgMjEuNjk2LS4zODItLjkyNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDcuODJhMTUgMTUgMCAwIDEgMjAgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMC43NzIgMTYuODUyLjkyNC0uMzgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwLjc3MiAxOS4xNDguOTI0LjM4MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDExLjg1OGExMCAxMCAwIDAgMSAxMS41LTEuNzg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguNSAxNS40MjlhNSA1IDAgMCAxIDIuNDEzLTEuMzEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiMTgiLCByOiAiMyIgfV0KICAgIF07CiAgICB2YXIgV2lmaUhpZ2ggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxMi44NTlhMTAgMTAgMCAwIDEgMTQgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjUgMTYuNDI5YTUgNSAwIDAgMSA3IDAiIH1dCiAgICBdOwogICAgdmFyIFdpZmlMb3cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC41IDE2LjQyOWE1IDUgMCAwIDEgNyAwIiB9XQogICAgXTsKICAgIHZhciBXaWZpT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjBoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguNSAxNi40MjlhNSA1IDAgMCAxIDcgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDEyLjg1OWExMCAxMCAwIDAgMSA1LjE3LTIuNjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMTIuODU5YTEwIDEwIDAgMCAwLTIuMDA3LTEuNTIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgOC44MmExNSAxNSAwIDAgMSA0LjE3Ny0yLjY0MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiA4LjgyYTE1IDE1IDAgMCAwLTExLjI4OC0zLjc2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dCiAgICBdOwogICAgdmFyIFdpZmlTeW5jID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEuOTY1IDEwLjEwNXY0TDEzLjUgMTIuNWE1IDUgMCAwIDEgOCAxLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEuOTY1IDE0LjEwNWg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3Ljk2NSAxOC4xMDVoNEwyMC40MyAxOS43MWE1IDUgMCAwIDEtOC0xLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA4LjgyYTE1IDE1IDAgMCAxIDIwIDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEuOTY1IDIyLjEwNXYtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDEyLjg2YTEwIDEwIDAgMCAxIDMtMi4wMzIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC41IDE2LjQyOWguMDEiIH1dCiAgICBdOwogICAgdmFyIFdpZmlaZXJvID0gW1sicGF0aCIsIHsgZDogIk0xMiAyMGguMDEiIH1dXTsKICAgIHZhciBXaWZpUGVuID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA4LjgyYTE1IDE1IDAgMCAxIDIwIDAiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEuMzc4IDE2LjYyNmExIDEgMCAwIDAtMy4wMDQtMy4wMDRsLTQuMDEgNC4wMTJhMiAyIDAgMCAwLS41MDYuODU0bC0uODM3IDIuODdhLjUuNSAwIDAgMCAuNjIuNjJsMi44Ny0uODM3YTIgMiAwIDAgMCAuODU0LS41MDZ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTIuODU5YTEwIDEwIDAgMCAxIDEwLjUtMi4yMjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC41IDE2LjQyOWE1IDUgMCAwIDEgMy0xLjQwNiIgfV0KICAgIF07CiAgICB2YXIgV2lmaSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIwaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDguODJhMTUgMTUgMCAwIDEgMjAgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDEyLjg1OWExMCAxMCAwIDAgMSAxNCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguNSAxNi40MjlhNSA1IDAgMCAxIDcgMCIgfV0KICAgIF07CiAgICB2YXIgV2luZEFycm93RG93biA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDJ2OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMi44IDIxLjZBMiAyIDAgMSAwIDE0IDE4SDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuNSAxMGEyLjUgMi41IDAgMSAxIDIgNEgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYgNiA0IDQgNC00IiB9XQogICAgXTsKICAgIHZhciBXaW5kID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIuOCAxOS42QTIgMiAwIDEgMCAxNCAxNkgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjUgOGEyLjUgMi41IDAgMSAxIDIgNEgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuOCA0LjRBMiAyIDAgMSAxIDExIDhIMiIgfV0KICAgIF07CiAgICB2YXIgV2luZU9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjJoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEwaDNtNyAwaC0xLjM0MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNXY3IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTcuMzA3IDcuMzA3QTEyLjMzIDEyLjMzIDAgMCAwIDcgMTBhNSA1IDAgMCAwIDcuMzkxIDQuMzkxTTguNjM4IDIuOTgxQzguNzUgMi42NjggOC44NzIgMi4zNCA5IDJoNmMxLjUgNCAyIDYgMiA4IDAgLjQwNy0uMDUuODA5LS4xNDUgMS4xOTgiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImxpbmUiLCB7IHgxOiAiMiIsIHgyOiAiMjIiLCB5MTogIjIiLCB5MjogIjIyIiB9XQogICAgXTsKICAgIHZhciBXaW5lID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAyMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTBoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTV2NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNWE1IDUgMCAwIDAgNS01YzAtMi0uNS00LTItOEg5Yy0xLjUgNC0yIDYtMiA4YTUgNSAwIDAgMCA1IDVaIiB9XQogICAgXTsKICAgIHZhciBXb3JtID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkgMTItMS41IDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkuNjMgMTguODEgMjIgMjAiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNi40NyA4LjIzYTEuNjggMS42OCAwIDAgMSAyLjQ0IDEuOTNsLS42NCAyLjA4YTYuNzYgNi43NiAwIDAgMCAxMC4xNiA3LjY3bC40Mi0uMjdhMSAxIDAgMSAwLTIuNzMtNC4yMWwtLjQyLjI3YTEuNzYgMS43NiAwIDAgMS0yLjYzLTEuOTlsLjY0LTIuMDhBNi42NiA2LjY2IDAgMCAwIDMuOTQgMy45bC0uNy40YTEgMSAwIDEgMCAyLjU1IDQuMzR6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICAgIHZhciBXb3JrZmxvdyA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICI4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDExdjRhMiAyIDAgMCAwIDIgMmg0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICI4IiwgeDogIjEzIiwgeTogIjEzIiwgcng6ICIyIiB9XQogICAgXTsKICAgIHZhciBXcmVuY2ggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNC43IDYuM2ExIDEgMCAwIDAgMCAxLjRsMS42IDEuNmExIDEgMCAwIDAgMS40IDBsMy4xMDYtMy4xMDVjLjMyLS4zMjIuODYzLS4yMi45ODMuMjE4YTYgNiAwIDAgMS04LjI1OSA3LjA1N2wtNy45MSA3LjkxYTEgMSAwIDAgMS0yLjk5OS0zbDcuOTEtNy45MWE2IDYgMCAwIDEgNy4wNTctOC4yNTljLjQzOC4xMi41NC42NjIuMjE5Ljk4NHoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA2IDYgMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNiA2IDEyIDEyIiB9XQogICAgXTsKICAgIHZhciBZb3V0dWJlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMi41IDE3YTI0LjEyIDI0LjEyIDAgMCAxIDAtMTAgMiAyIDAgMCAxIDEuNC0xLjQgNDkuNTYgNDkuNTYgMCAwIDEgMTYuMiAwQTIgMiAwIDAgMSAyMS41IDdhMjQuMTIgMjQuMTIgMCAwIDEgMCAxMCAyIDIgMCAwIDEtMS40IDEuNCA0OS41NSA0OS41NSAwIDAgMS0xNi4yIDBBMiAyIDAgMCAxIDIuNSAxNyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCAxNSA1LTMtNS0zeiIgfV0KICAgIF07CiAgICB2YXIgWmFwT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAuNTEzIDQuODU2IDEzLjEyIDIuMTdhLjUuNSAwIDAgMSAuODYuNDZsLTEuMzc3IDQuMzE3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1LjY1NiAxMEgyMGExIDEgMCAwIDEgLjc4IDEuNjNsLTEuNzIgMS43NzMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTYuMjczIDE2LjI3MyAxMC44OCAyMS44M2EuNS41IDAgMCAxLS44Ni0uNDZsMS45Mi02LjAyQTEgMSAwIDAgMCAxMSAxNEg0YTEgMSAwIDAgMS0uNzgtMS42M2w0LjUwNy00LjY0MyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dCiAgICBdOwogICAgdmFyIFphcCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQgMTRhMSAxIDAgMCAxLS43OC0xLjYzbDkuOS0xMC4yYS41LjUgMCAwIDEgLjg2LjQ2bC0xLjkyIDYuMDJBMSAxIDAgMCAwIDEzIDEwaDdhMSAxIDAgMCAxIC43OCAxLjYzbC05LjkgMTAuMmEuNS41IDAgMCAxLS44Ni0uNDZsMS45Mi02LjAyQTEgMSAwIDAgMCAxMSAxNHoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogICAgdmFyIFpvb21JbiA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTEiLCBjeTogIjExIiwgcjogIjgiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMjEiLCB4MjogIjE2LjY1IiwgeTE6ICIyMSIsIHkyOiAiMTYuNjUiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTEiLCB4MjogIjExIiwgeTE6ICI4IiwgeTI6ICIxNCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI4IiwgeDI6ICIxNCIsIHkxOiAiMTEiLCB5MjogIjExIiB9XQogICAgXTsKICAgIHZhciBab29tT3V0ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMSIsIGN5OiAiMTEiLCByOiAiOCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIyMSIsIHgyOiAiMTYuNjUiLCB5MTogIjIxIiwgeTI6ICIxNi42NSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI4IiwgeDI6ICIxNCIsIHkxOiAiMTEiLCB5MjogIjExIiB9XQogICAgXTsKICAgIHZhciBpY29uc0FuZEFsaWFzZXMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmZyZWV6ZSh7CiAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgQUFycm93RG93biwKICAgICAgQUFycm93VXAsCiAgICAgIEFMYXJnZVNtYWxsLAogICAgICBBY2Nlc3NpYmlsaXR5LAogICAgICBBY3Rpdml0eSwKICAgICAgQWN0aXZpdHlTcXVhcmU6IFNxdWFyZUFjdGl2aXR5LAogICAgICBBaXJWZW50LAogICAgICBBaXJwbGF5LAogICAgICBBbGFybUNoZWNrOiBBbGFybUNsb2NrQ2hlY2ssCiAgICAgIEFsYXJtQ2xvY2ssCiAgICAgIEFsYXJtQ2xvY2tDaGVjaywKICAgICAgQWxhcm1DbG9ja01pbnVzLAogICAgICBBbGFybUNsb2NrT2ZmLAogICAgICBBbGFybUNsb2NrUGx1cywKICAgICAgQWxhcm1NaW51czogQWxhcm1DbG9ja01pbnVzLAogICAgICBBbGFybVBsdXM6IEFsYXJtQ2xvY2tQbHVzLAogICAgICBBbGFybVNtb2tlLAogICAgICBBbGJ1bSwKICAgICAgQWxlcnRDaXJjbGU6IENpcmNsZUFsZXJ0LAogICAgICBBbGVydE9jdGFnb246IE9jdGFnb25BbGVydCwKICAgICAgQWxlcnRUcmlhbmdsZTogVHJpYW5nbGVBbGVydCwKICAgICAgQWxpZ25DZW50ZXI6IFRleHRBbGlnbkNlbnRlciwKICAgICAgQWxpZ25DZW50ZXJIb3Jpem9udGFsLAogICAgICBBbGlnbkNlbnRlclZlcnRpY2FsLAogICAgICBBbGlnbkVuZEhvcml6b250YWwsCiAgICAgIEFsaWduRW5kVmVydGljYWwsCiAgICAgIEFsaWduSG9yaXpvbnRhbERpc3RyaWJ1dGVDZW50ZXIsCiAgICAgIEFsaWduSG9yaXpvbnRhbERpc3RyaWJ1dGVFbmQsCiAgICAgIEFsaWduSG9yaXpvbnRhbERpc3RyaWJ1dGVTdGFydCwKICAgICAgQWxpZ25Ib3Jpem9udGFsSnVzdGlmeUNlbnRlciwKICAgICAgQWxpZ25Ib3Jpem9udGFsSnVzdGlmeUVuZCwKICAgICAgQWxpZ25Ib3Jpem9udGFsSnVzdGlmeVN0YXJ0LAogICAgICBBbGlnbkhvcml6b250YWxTcGFjZUFyb3VuZCwKICAgICAgQWxpZ25Ib3Jpem9udGFsU3BhY2VCZXR3ZWVuLAogICAgICBBbGlnbkp1c3RpZnk6IFRleHRBbGlnbkp1c3RpZnksCiAgICAgIEFsaWduTGVmdDogVGV4dEFsaWduU3RhcnQsCiAgICAgIEFsaWduUmlnaHQ6IFRleHRBbGlnbkVuZCwKICAgICAgQWxpZ25TdGFydEhvcml6b250YWwsCiAgICAgIEFsaWduU3RhcnRWZXJ0aWNhbCwKICAgICAgQWxpZ25WZXJ0aWNhbERpc3RyaWJ1dGVDZW50ZXIsCiAgICAgIEFsaWduVmVydGljYWxEaXN0cmlidXRlRW5kLAogICAgICBBbGlnblZlcnRpY2FsRGlzdHJpYnV0ZVN0YXJ0LAogICAgICBBbGlnblZlcnRpY2FsSnVzdGlmeUNlbnRlciwKICAgICAgQWxpZ25WZXJ0aWNhbEp1c3RpZnlFbmQsCiAgICAgIEFsaWduVmVydGljYWxKdXN0aWZ5U3RhcnQsCiAgICAgIEFsaWduVmVydGljYWxTcGFjZUFyb3VuZCwKICAgICAgQWxpZ25WZXJ0aWNhbFNwYWNlQmV0d2VlbiwKICAgICAgQW1idWxhbmNlLAogICAgICBBbXBlcnNhbmQsCiAgICAgIEFtcGVyc2FuZHMsCiAgICAgIEFtcGhvcmEsCiAgICAgIEFuY2hvciwKICAgICAgQW5ncnksCiAgICAgIEFubm95ZWQsCiAgICAgIEFudGVubmEsCiAgICAgIEFudmlsLAogICAgICBBcGVydHVyZSwKICAgICAgQXBwV2luZG93LAogICAgICBBcHBXaW5kb3dNYWMsCiAgICAgIEFwcGxlLAogICAgICBBcmNoaXZlLAogICAgICBBcmNoaXZlUmVzdG9yZSwKICAgICAgQXJjaGl2ZVgsCiAgICAgIEFyZWFDaGFydDogQ2hhcnRBcmVhLAogICAgICBBcm1jaGFpciwKICAgICAgQXJyb3dCaWdEb3duLAogICAgICBBcnJvd0JpZ0Rvd25EYXNoLAogICAgICBBcnJvd0JpZ0xlZnQsCiAgICAgIEFycm93QmlnTGVmdERhc2gsCiAgICAgIEFycm93QmlnUmlnaHQsCiAgICAgIEFycm93QmlnUmlnaHREYXNoLAogICAgICBBcnJvd0JpZ1VwLAogICAgICBBcnJvd0JpZ1VwRGFzaCwKICAgICAgQXJyb3dEb3duLAogICAgICBBcnJvd0Rvd24wMSwKICAgICAgQXJyb3dEb3duMTAsCiAgICAgIEFycm93RG93bkFaLAogICAgICBBcnJvd0Rvd25BejogQXJyb3dEb3duQVosCiAgICAgIEFycm93RG93bkNpcmNsZTogQ2lyY2xlQXJyb3dEb3duLAogICAgICBBcnJvd0Rvd25Gcm9tTGluZSwKICAgICAgQXJyb3dEb3duTGVmdCwKICAgICAgQXJyb3dEb3duTGVmdEZyb21DaXJjbGU6IENpcmNsZUFycm93T3V0RG93bkxlZnQsCiAgICAgIEFycm93RG93bkxlZnRGcm9tU3F1YXJlOiBTcXVhcmVBcnJvd091dERvd25MZWZ0LAogICAgICBBcnJvd0Rvd25MZWZ0U3F1YXJlOiBTcXVhcmVBcnJvd0Rvd25MZWZ0LAogICAgICBBcnJvd0Rvd25OYXJyb3dXaWRlLAogICAgICBBcnJvd0Rvd25SaWdodCwKICAgICAgQXJyb3dEb3duUmlnaHRGcm9tQ2lyY2xlOiBDaXJjbGVBcnJvd091dERvd25SaWdodCwKICAgICAgQXJyb3dEb3duUmlnaHRGcm9tU3F1YXJlOiBTcXVhcmVBcnJvd091dERvd25SaWdodCwKICAgICAgQXJyb3dEb3duUmlnaHRTcXVhcmU6IFNxdWFyZUFycm93RG93blJpZ2h0LAogICAgICBBcnJvd0Rvd25TcXVhcmU6IFNxdWFyZUFycm93RG93biwKICAgICAgQXJyb3dEb3duVG9Eb3QsCiAgICAgIEFycm93RG93blRvTGluZSwKICAgICAgQXJyb3dEb3duVXAsCiAgICAgIEFycm93RG93bldpZGVOYXJyb3csCiAgICAgIEFycm93RG93blpBLAogICAgICBBcnJvd0Rvd25aYTogQXJyb3dEb3duWkEsCiAgICAgIEFycm93TGVmdCwKICAgICAgQXJyb3dMZWZ0Q2lyY2xlOiBDaXJjbGVBcnJvd0xlZnQsCiAgICAgIEFycm93TGVmdEZyb21MaW5lLAogICAgICBBcnJvd0xlZnRSaWdodCwKICAgICAgQXJyb3dMZWZ0U3F1YXJlOiBTcXVhcmVBcnJvd0xlZnQsCiAgICAgIEFycm93TGVmdFRvTGluZSwKICAgICAgQXJyb3dSaWdodCwKICAgICAgQXJyb3dSaWdodENpcmNsZTogQ2lyY2xlQXJyb3dSaWdodCwKICAgICAgQXJyb3dSaWdodEZyb21MaW5lLAogICAgICBBcnJvd1JpZ2h0TGVmdCwKICAgICAgQXJyb3dSaWdodFNxdWFyZTogU3F1YXJlQXJyb3dSaWdodCwKICAgICAgQXJyb3dSaWdodFRvTGluZSwKICAgICAgQXJyb3dVcCwKICAgICAgQXJyb3dVcDAxLAogICAgICBBcnJvd1VwMTAsCiAgICAgIEFycm93VXBBWiwKICAgICAgQXJyb3dVcEF6OiBBcnJvd1VwQVosCiAgICAgIEFycm93VXBDaXJjbGU6IENpcmNsZUFycm93VXAsCiAgICAgIEFycm93VXBEb3duLAogICAgICBBcnJvd1VwRnJvbURvdCwKICAgICAgQXJyb3dVcEZyb21MaW5lLAogICAgICBBcnJvd1VwTGVmdCwKICAgICAgQXJyb3dVcExlZnRGcm9tQ2lyY2xlOiBDaXJjbGVBcnJvd091dFVwTGVmdCwKICAgICAgQXJyb3dVcExlZnRGcm9tU3F1YXJlOiBTcXVhcmVBcnJvd091dFVwTGVmdCwKICAgICAgQXJyb3dVcExlZnRTcXVhcmU6IFNxdWFyZUFycm93VXBMZWZ0LAogICAgICBBcnJvd1VwTmFycm93V2lkZSwKICAgICAgQXJyb3dVcFJpZ2h0LAogICAgICBBcnJvd1VwUmlnaHRGcm9tQ2lyY2xlOiBDaXJjbGVBcnJvd091dFVwUmlnaHQsCiAgICAgIEFycm93VXBSaWdodEZyb21TcXVhcmU6IFNxdWFyZUFycm93T3V0VXBSaWdodCwKICAgICAgQXJyb3dVcFJpZ2h0U3F1YXJlOiBTcXVhcmVBcnJvd1VwUmlnaHQsCiAgICAgIEFycm93VXBTcXVhcmU6IFNxdWFyZUFycm93VXAsCiAgICAgIEFycm93VXBUb0xpbmUsCiAgICAgIEFycm93VXBXaWRlTmFycm93LAogICAgICBBcnJvd1VwWkEsCiAgICAgIEFycm93VXBaYTogQXJyb3dVcFpBLAogICAgICBBcnJvd3NVcEZyb21MaW5lLAogICAgICBBc3RlcmlzaywKICAgICAgQXN0ZXJpc2tTcXVhcmU6IFNxdWFyZUFzdGVyaXNrLAogICAgICBBdFNpZ24sCiAgICAgIEF0b20sCiAgICAgIEF1ZGlvTGluZXMsCiAgICAgIEF1ZGlvV2F2ZWZvcm0sCiAgICAgIEF3YXJkLAogICAgICBBeGUsCiAgICAgIEF4aXMzRDogQXhpczNkLAogICAgICBBeGlzM2QsCiAgICAgIEJhYnksCiAgICAgIEJhY2twYWNrLAogICAgICBCYWRnZSwKICAgICAgQmFkZ2VBbGVydCwKICAgICAgQmFkZ2VDZW50LAogICAgICBCYWRnZUNoZWNrLAogICAgICBCYWRnZURvbGxhclNpZ24sCiAgICAgIEJhZGdlRXVybywKICAgICAgQmFkZ2VIZWxwOiBCYWRnZVF1ZXN0aW9uTWFyaywKICAgICAgQmFkZ2VJbmRpYW5SdXBlZSwKICAgICAgQmFkZ2VJbmZvLAogICAgICBCYWRnZUphcGFuZXNlWWVuLAogICAgICBCYWRnZU1pbnVzLAogICAgICBCYWRnZVBlcmNlbnQsCiAgICAgIEJhZGdlUGx1cywKICAgICAgQmFkZ2VQb3VuZFN0ZXJsaW5nLAogICAgICBCYWRnZVF1ZXN0aW9uTWFyaywKICAgICAgQmFkZ2VSdXNzaWFuUnVibGUsCiAgICAgIEJhZGdlU3dpc3NGcmFuYywKICAgICAgQmFkZ2VUdXJraXNoTGlyYSwKICAgICAgQmFkZ2VYLAogICAgICBCYWdnYWdlQ2xhaW0sCiAgICAgIEJhbGxvb24sCiAgICAgIEJhbiwKICAgICAgQmFuYW5hLAogICAgICBCYW5kYWdlLAogICAgICBCYW5rbm90ZSwKICAgICAgQmFua25vdGVBcnJvd0Rvd24sCiAgICAgIEJhbmtub3RlQXJyb3dVcCwKICAgICAgQmFua25vdGVYLAogICAgICBCYXJDaGFydDogQ2hhcnROb0F4ZXNDb2x1bW5JbmNyZWFzaW5nLAogICAgICBCYXJDaGFydDI6IENoYXJ0Tm9BeGVzQ29sdW1uLAogICAgICBCYXJDaGFydDM6IENoYXJ0Q29sdW1uLAogICAgICBCYXJDaGFydDQ6IENoYXJ0Q29sdW1uSW5jcmVhc2luZywKICAgICAgQmFyQ2hhcnRCaWc6IENoYXJ0Q29sdW1uQmlnLAogICAgICBCYXJDaGFydEhvcml6b250YWw6IENoYXJ0QmFyLAogICAgICBCYXJDaGFydEhvcml6b250YWxCaWc6IENoYXJ0QmFyQmlnLAogICAgICBCYXJjb2RlLAogICAgICBCYXJyZWwsCiAgICAgIEJhc2VsaW5lLAogICAgICBCYXRoLAogICAgICBCYXR0ZXJ5LAogICAgICBCYXR0ZXJ5Q2hhcmdpbmcsCiAgICAgIEJhdHRlcnlGdWxsLAogICAgICBCYXR0ZXJ5TG93LAogICAgICBCYXR0ZXJ5TWVkaXVtLAogICAgICBCYXR0ZXJ5UGx1cywKICAgICAgQmF0dGVyeVdhcm5pbmcsCiAgICAgIEJlYWtlciwKICAgICAgQmVhbiwKICAgICAgQmVhbk9mZiwKICAgICAgQmVkLAogICAgICBCZWREb3VibGUsCiAgICAgIEJlZFNpbmdsZSwKICAgICAgQmVlZiwKICAgICAgQmVlciwKICAgICAgQmVlck9mZiwKICAgICAgQmVsbCwKICAgICAgQmVsbERvdCwKICAgICAgQmVsbEVsZWN0cmljLAogICAgICBCZWxsTWludXMsCiAgICAgIEJlbGxPZmYsCiAgICAgIEJlbGxQbHVzLAogICAgICBCZWxsUmluZywKICAgICAgQmV0d2Vlbkhvcml6b25hbEVuZDogQmV0d2Vlbkhvcml6b250YWxFbmQsCiAgICAgIEJldHdlZW5Ib3Jpem9uYWxTdGFydDogQmV0d2Vlbkhvcml6b250YWxTdGFydCwKICAgICAgQmV0d2Vlbkhvcml6b250YWxFbmQsCiAgICAgIEJldHdlZW5Ib3Jpem9udGFsU3RhcnQsCiAgICAgIEJldHdlZW5WZXJ0aWNhbEVuZCwKICAgICAgQmV0d2VlblZlcnRpY2FsU3RhcnQsCiAgICAgIEJpY2Vwc0ZsZXhlZCwKICAgICAgQmlrZSwKICAgICAgQmluYXJ5LAogICAgICBCaW5vY3VsYXJzLAogICAgICBCaW9oYXphcmQsCiAgICAgIEJpcmQsCiAgICAgIEJpcmRob3VzZSwKICAgICAgQml0Y29pbiwKICAgICAgQmxlbmQsCiAgICAgIEJsaW5kcywKICAgICAgQmxvY2tzLAogICAgICBCbHVldG9vdGgsCiAgICAgIEJsdWV0b290aENvbm5lY3RlZCwKICAgICAgQmx1ZXRvb3RoT2ZmLAogICAgICBCbHVldG9vdGhTZWFyY2hpbmcsCiAgICAgIEJvbGQsCiAgICAgIEJvbHQsCiAgICAgIEJvbWIsCiAgICAgIEJvbmUsCiAgICAgIEJvb2ssCiAgICAgIEJvb2tBLAogICAgICBCb29rQWxlcnQsCiAgICAgIEJvb2tBdWRpbywKICAgICAgQm9va0NoZWNrLAogICAgICBCb29rQ29weSwKICAgICAgQm9va0Rhc2hlZCwKICAgICAgQm9va0Rvd24sCiAgICAgIEJvb2tIZWFkcGhvbmVzLAogICAgICBCb29rSGVhcnQsCiAgICAgIEJvb2tJbWFnZSwKICAgICAgQm9va0tleSwKICAgICAgQm9va0xvY2ssCiAgICAgIEJvb2tNYXJrZWQsCiAgICAgIEJvb2tNaW51cywKICAgICAgQm9va09wZW4sCiAgICAgIEJvb2tPcGVuQ2hlY2ssCiAgICAgIEJvb2tPcGVuVGV4dCwKICAgICAgQm9va1BsdXMsCiAgICAgIEJvb2tTZWFyY2gsCiAgICAgIEJvb2tUZW1wbGF0ZTogQm9va0Rhc2hlZCwKICAgICAgQm9va1RleHQsCiAgICAgIEJvb2tUeXBlLAogICAgICBCb29rVXAsCiAgICAgIEJvb2tVcDIsCiAgICAgIEJvb2tVc2VyLAogICAgICBCb29rWCwKICAgICAgQm9va21hcmssCiAgICAgIEJvb2ttYXJrQ2hlY2ssCiAgICAgIEJvb2ttYXJrTWludXMsCiAgICAgIEJvb2ttYXJrUGx1cywKICAgICAgQm9va21hcmtYLAogICAgICBCb29tQm94LAogICAgICBCb3QsCiAgICAgIEJvdE1lc3NhZ2VTcXVhcmUsCiAgICAgIEJvdE9mZiwKICAgICAgQm90dGxlV2luZSwKICAgICAgQm93QXJyb3csCiAgICAgIEJveCwKICAgICAgQm94U2VsZWN0OiBTcXVhcmVEYXNoZWQsCiAgICAgIEJveGVzLAogICAgICBCcmFjZXMsCiAgICAgIEJyYWNrZXRzLAogICAgICBCcmFpbiwKICAgICAgQnJhaW5DaXJjdWl0LAogICAgICBCcmFpbkNvZywKICAgICAgQnJpY2tXYWxsLAogICAgICBCcmlja1dhbGxGaXJlLAogICAgICBCcmlja1dhbGxTaGllbGQsCiAgICAgIEJyaWVmY2FzZSwKICAgICAgQnJpZWZjYXNlQnVzaW5lc3MsCiAgICAgIEJyaWVmY2FzZUNvbnZleW9yQmVsdCwKICAgICAgQnJpZWZjYXNlTWVkaWNhbCwKICAgICAgQnJpbmdUb0Zyb250LAogICAgICBCcnVzaCwKICAgICAgQnJ1c2hDbGVhbmluZywKICAgICAgQnViYmxlcywKICAgICAgQnVnLAogICAgICBCdWdPZmYsCiAgICAgIEJ1Z1BsYXksCiAgICAgIEJ1aWxkaW5nLAogICAgICBCdWlsZGluZzIsCiAgICAgIEJ1cywKICAgICAgQnVzRnJvbnQsCiAgICAgIENhYmxlLAogICAgICBDYWJsZUNhciwKICAgICAgQ2FrZSwKICAgICAgQ2FrZVNsaWNlLAogICAgICBDYWxjdWxhdG9yLAogICAgICBDYWxlbmRhciwKICAgICAgQ2FsZW5kYXIxLAogICAgICBDYWxlbmRhckFycm93RG93biwKICAgICAgQ2FsZW5kYXJBcnJvd1VwLAogICAgICBDYWxlbmRhckNoZWNrLAogICAgICBDYWxlbmRhckNoZWNrMiwKICAgICAgQ2FsZW5kYXJDbG9jaywKICAgICAgQ2FsZW5kYXJDb2csCiAgICAgIENhbGVuZGFyRGF5cywKICAgICAgQ2FsZW5kYXJGb2xkLAogICAgICBDYWxlbmRhckhlYXJ0LAogICAgICBDYWxlbmRhck1pbnVzLAogICAgICBDYWxlbmRhck1pbnVzMiwKICAgICAgQ2FsZW5kYXJPZmYsCiAgICAgIENhbGVuZGFyUGx1cywKICAgICAgQ2FsZW5kYXJQbHVzMiwKICAgICAgQ2FsZW5kYXJSYW5nZSwKICAgICAgQ2FsZW5kYXJTZWFyY2gsCiAgICAgIENhbGVuZGFyU3luYywKICAgICAgQ2FsZW5kYXJYLAogICAgICBDYWxlbmRhclgyLAogICAgICBDYWxlbmRhcnMsCiAgICAgIENhbWVyYSwKICAgICAgQ2FtZXJhT2ZmLAogICAgICBDYW5kbGVzdGlja0NoYXJ0OiBDaGFydENhbmRsZXN0aWNrLAogICAgICBDYW5keSwKICAgICAgQ2FuZHlDYW5lLAogICAgICBDYW5keU9mZiwKICAgICAgQ2FubmFiaXMsCiAgICAgIENhbm5hYmlzT2ZmLAogICAgICBDYXB0aW9ucywKICAgICAgQ2FwdGlvbnNPZmYsCiAgICAgIENhciwKICAgICAgQ2FyRnJvbnQsCiAgICAgIENhclRheGlGcm9udCwKICAgICAgQ2FyYXZhbiwKICAgICAgQ2FyZFNpbSwKICAgICAgQ2Fycm90LAogICAgICBDYXNlTG93ZXIsCiAgICAgIENhc2VTZW5zaXRpdmUsCiAgICAgIENhc2VVcHBlciwKICAgICAgQ2Fzc2V0dGVUYXBlLAogICAgICBDYXN0LAogICAgICBDYXN0bGUsCiAgICAgIENhdCwKICAgICAgQ2N0diwKICAgICAgQ2hhcnRBcmVhLAogICAgICBDaGFydEJhciwKICAgICAgQ2hhcnRCYXJCaWcsCiAgICAgIENoYXJ0QmFyRGVjcmVhc2luZywKICAgICAgQ2hhcnRCYXJJbmNyZWFzaW5nLAogICAgICBDaGFydEJhclN0YWNrZWQsCiAgICAgIENoYXJ0Q2FuZGxlc3RpY2ssCiAgICAgIENoYXJ0Q29sdW1uLAogICAgICBDaGFydENvbHVtbkJpZywKICAgICAgQ2hhcnRDb2x1bW5EZWNyZWFzaW5nLAogICAgICBDaGFydENvbHVtbkluY3JlYXNpbmcsCiAgICAgIENoYXJ0Q29sdW1uU3RhY2tlZCwKICAgICAgQ2hhcnRHYW50dCwKICAgICAgQ2hhcnRMaW5lLAogICAgICBDaGFydE5ldHdvcmssCiAgICAgIENoYXJ0Tm9BeGVzQ29sdW1uLAogICAgICBDaGFydE5vQXhlc0NvbHVtbkRlY3JlYXNpbmcsCiAgICAgIENoYXJ0Tm9BeGVzQ29sdW1uSW5jcmVhc2luZywKICAgICAgQ2hhcnROb0F4ZXNDb21iaW5lZCwKICAgICAgQ2hhcnROb0F4ZXNHYW50dCwKICAgICAgQ2hhcnRQaWUsCiAgICAgIENoYXJ0U2NhdHRlciwKICAgICAgQ2hhcnRTcGxpbmUsCiAgICAgIENoZWNrLAogICAgICBDaGVja0NoZWNrLAogICAgICBDaGVja0NpcmNsZTogQ2lyY2xlQ2hlY2tCaWcsCiAgICAgIENoZWNrQ2lyY2xlMjogQ2lyY2xlQ2hlY2ssCiAgICAgIENoZWNrTGluZSwKICAgICAgQ2hlY2tTcXVhcmU6IFNxdWFyZUNoZWNrQmlnLAogICAgICBDaGVja1NxdWFyZTI6IFNxdWFyZUNoZWNrLAogICAgICBDaGVmSGF0LAogICAgICBDaGVycnksCiAgICAgIENoZXNzQmlzaG9wLAogICAgICBDaGVzc0tpbmcsCiAgICAgIENoZXNzS25pZ2h0LAogICAgICBDaGVzc1Bhd24sCiAgICAgIENoZXNzUXVlZW4sCiAgICAgIENoZXNzUm9vaywKICAgICAgQ2hldnJvbkRvd24sCiAgICAgIENoZXZyb25Eb3duQ2lyY2xlOiBDaXJjbGVDaGV2cm9uRG93biwKICAgICAgQ2hldnJvbkRvd25TcXVhcmU6IFNxdWFyZUNoZXZyb25Eb3duLAogICAgICBDaGV2cm9uRmlyc3QsCiAgICAgIENoZXZyb25MYXN0LAogICAgICBDaGV2cm9uTGVmdCwKICAgICAgQ2hldnJvbkxlZnRDaXJjbGU6IENpcmNsZUNoZXZyb25MZWZ0LAogICAgICBDaGV2cm9uTGVmdFNxdWFyZTogU3F1YXJlQ2hldnJvbkxlZnQsCiAgICAgIENoZXZyb25SaWdodCwKICAgICAgQ2hldnJvblJpZ2h0Q2lyY2xlOiBDaXJjbGVDaGV2cm9uUmlnaHQsCiAgICAgIENoZXZyb25SaWdodFNxdWFyZTogU3F1YXJlQ2hldnJvblJpZ2h0LAogICAgICBDaGV2cm9uVXAsCiAgICAgIENoZXZyb25VcENpcmNsZTogQ2lyY2xlQ2hldnJvblVwLAogICAgICBDaGV2cm9uVXBTcXVhcmU6IFNxdWFyZUNoZXZyb25VcCwKICAgICAgQ2hldnJvbnNEb3duLAogICAgICBDaGV2cm9uc0Rvd25VcCwKICAgICAgQ2hldnJvbnNMZWZ0LAogICAgICBDaGV2cm9uc0xlZnRSaWdodCwKICAgICAgQ2hldnJvbnNMZWZ0UmlnaHRFbGxpcHNpcywKICAgICAgQ2hldnJvbnNSaWdodCwKICAgICAgQ2hldnJvbnNSaWdodExlZnQsCiAgICAgIENoZXZyb25zVXAsCiAgICAgIENoZXZyb25zVXBEb3duLAogICAgICBDaHJvbWU6IENocm9taXVtLAogICAgICBDaHJvbWl1bSwKICAgICAgQ2h1cmNoLAogICAgICBDaWdhcmV0dGUsCiAgICAgIENpZ2FyZXR0ZU9mZiwKICAgICAgQ2lyY2xlLAogICAgICBDaXJjbGVBbGVydCwKICAgICAgQ2lyY2xlQXJyb3dEb3duLAogICAgICBDaXJjbGVBcnJvd0xlZnQsCiAgICAgIENpcmNsZUFycm93T3V0RG93bkxlZnQsCiAgICAgIENpcmNsZUFycm93T3V0RG93blJpZ2h0LAogICAgICBDaXJjbGVBcnJvd091dFVwTGVmdCwKICAgICAgQ2lyY2xlQXJyb3dPdXRVcFJpZ2h0LAogICAgICBDaXJjbGVBcnJvd1JpZ2h0LAogICAgICBDaXJjbGVBcnJvd1VwLAogICAgICBDaXJjbGVDaGVjaywKICAgICAgQ2lyY2xlQ2hlY2tCaWcsCiAgICAgIENpcmNsZUNoZXZyb25Eb3duLAogICAgICBDaXJjbGVDaGV2cm9uTGVmdCwKICAgICAgQ2lyY2xlQ2hldnJvblJpZ2h0LAogICAgICBDaXJjbGVDaGV2cm9uVXAsCiAgICAgIENpcmNsZURhc2hlZCwKICAgICAgQ2lyY2xlRGl2aWRlLAogICAgICBDaXJjbGVEb2xsYXJTaWduLAogICAgICBDaXJjbGVEb3QsCiAgICAgIENpcmNsZURvdERhc2hlZCwKICAgICAgQ2lyY2xlRWxsaXBzaXMsCiAgICAgIENpcmNsZUVxdWFsLAogICAgICBDaXJjbGVGYWRpbmdBcnJvd1VwLAogICAgICBDaXJjbGVGYWRpbmdQbHVzLAogICAgICBDaXJjbGVHYXVnZSwKICAgICAgQ2lyY2xlSGVscDogQ2lyY2xlUXVlc3Rpb25NYXJrLAogICAgICBDaXJjbGVNaW51cywKICAgICAgQ2lyY2xlT2ZmLAogICAgICBDaXJjbGVQYXJraW5nLAogICAgICBDaXJjbGVQYXJraW5nT2ZmLAogICAgICBDaXJjbGVQYXVzZSwKICAgICAgQ2lyY2xlUGVyY2VudCwKICAgICAgQ2lyY2xlUGlsZSwKICAgICAgQ2lyY2xlUGxheSwKICAgICAgQ2lyY2xlUGx1cywKICAgICAgQ2lyY2xlUG91bmRTdGVybGluZywKICAgICAgQ2lyY2xlUG93ZXIsCiAgICAgIENpcmNsZVF1ZXN0aW9uTWFyaywKICAgICAgQ2lyY2xlU2xhc2gsCiAgICAgIENpcmNsZVNsYXNoMiwKICAgICAgQ2lyY2xlU2xhc2hlZDogQ2lyY2xlU2xhc2gyLAogICAgICBDaXJjbGVTbWFsbCwKICAgICAgQ2lyY2xlU3RhciwKICAgICAgQ2lyY2xlU3RvcCwKICAgICAgQ2lyY2xlVXNlciwKICAgICAgQ2lyY2xlVXNlclJvdW5kLAogICAgICBDaXJjbGVYLAogICAgICBDaXJjdWl0Qm9hcmQsCiAgICAgIENpdHJ1cywKICAgICAgQ2xhcHBlcmJvYXJkLAogICAgICBDbGlwYm9hcmQsCiAgICAgIENsaXBib2FyZENoZWNrLAogICAgICBDbGlwYm9hcmRDbG9jaywKICAgICAgQ2xpcGJvYXJkQ29weSwKICAgICAgQ2xpcGJvYXJkRWRpdDogQ2xpcGJvYXJkUGVuLAogICAgICBDbGlwYm9hcmRMaXN0LAogICAgICBDbGlwYm9hcmRNaW51cywKICAgICAgQ2xpcGJvYXJkUGFzdGUsCiAgICAgIENsaXBib2FyZFBlbiwKICAgICAgQ2xpcGJvYXJkUGVuTGluZSwKICAgICAgQ2xpcGJvYXJkUGx1cywKICAgICAgQ2xpcGJvYXJkU2lnbmF0dXJlOiBDbGlwYm9hcmRQZW5MaW5lLAogICAgICBDbGlwYm9hcmRUeXBlLAogICAgICBDbGlwYm9hcmRYLAogICAgICBDbG9jaywKICAgICAgQ2xvY2sxLAogICAgICBDbG9jazEwLAogICAgICBDbG9jazExLAogICAgICBDbG9jazEyLAogICAgICBDbG9jazIsCiAgICAgIENsb2NrMywKICAgICAgQ2xvY2s0LAogICAgICBDbG9jazUsCiAgICAgIENsb2NrNiwKICAgICAgQ2xvY2s3LAogICAgICBDbG9jazgsCiAgICAgIENsb2NrOSwKICAgICAgQ2xvY2tBbGVydCwKICAgICAgQ2xvY2tBcnJvd0Rvd24sCiAgICAgIENsb2NrQXJyb3dVcCwKICAgICAgQ2xvY2tDaGVjaywKICAgICAgQ2xvY2tGYWRpbmcsCiAgICAgIENsb2NrUGx1cywKICAgICAgQ2xvc2VkQ2FwdGlvbiwKICAgICAgQ2xvdWQsCiAgICAgIENsb3VkQWxlcnQsCiAgICAgIENsb3VkQmFja3VwLAogICAgICBDbG91ZENoZWNrLAogICAgICBDbG91ZENvZywKICAgICAgQ2xvdWREb3dubG9hZCwKICAgICAgQ2xvdWREcml6emxlLAogICAgICBDbG91ZEZvZywKICAgICAgQ2xvdWRIYWlsLAogICAgICBDbG91ZExpZ2h0bmluZywKICAgICAgQ2xvdWRNb29uLAogICAgICBDbG91ZE1vb25SYWluLAogICAgICBDbG91ZE9mZiwKICAgICAgQ2xvdWRSYWluLAogICAgICBDbG91ZFJhaW5XaW5kLAogICAgICBDbG91ZFNub3csCiAgICAgIENsb3VkU3VuLAogICAgICBDbG91ZFN1blJhaW4sCiAgICAgIENsb3VkU3luYywKICAgICAgQ2xvdWRVcGxvYWQsCiAgICAgIENsb3VkeSwKICAgICAgQ2xvdmVyLAogICAgICBDbHViLAogICAgICBDb2RlLAogICAgICBDb2RlMjogQ29kZVhtbCwKICAgICAgQ29kZVNxdWFyZTogU3F1YXJlQ29kZSwKICAgICAgQ29kZVhtbCwKICAgICAgQ29kZXBlbiwKICAgICAgQ29kZXNhbmRib3gsCiAgICAgIENvZmZlZSwKICAgICAgQ29nLAogICAgICBDb2lucywKICAgICAgQ29sdW1uczogQ29sdW1uczIsCiAgICAgIENvbHVtbnMyLAogICAgICBDb2x1bW5zMywKICAgICAgQ29sdW1uczNDb2csCiAgICAgIENvbHVtbnM0LAogICAgICBDb2x1bW5zU2V0dGluZ3M6IENvbHVtbnMzQ29nLAogICAgICBDb21iaW5lLAogICAgICBDb21tYW5kLAogICAgICBDb21wYXNzLAogICAgICBDb21wb25lbnQsCiAgICAgIENvbXB1dGVyLAogICAgICBDb25jaWVyZ2VCZWxsLAogICAgICBDb25lLAogICAgICBDb25zdHJ1Y3Rpb24sCiAgICAgIENvbnRhY3QsCiAgICAgIENvbnRhY3QyOiBDb250YWN0Um91bmQsCiAgICAgIENvbnRhY3RSb3VuZCwKICAgICAgQ29udGFpbmVyLAogICAgICBDb250cmFzdCwKICAgICAgQ29va2llLAogICAgICBDb29raW5nUG90LAogICAgICBDb3B5LAogICAgICBDb3B5Q2hlY2ssCiAgICAgIENvcHlNaW51cywKICAgICAgQ29weVBsdXMsCiAgICAgIENvcHlTbGFzaCwKICAgICAgQ29weVgsCiAgICAgIENvcHlsZWZ0LAogICAgICBDb3B5cmlnaHQsCiAgICAgIENvcm5lckRvd25MZWZ0LAogICAgICBDb3JuZXJEb3duUmlnaHQsCiAgICAgIENvcm5lckxlZnREb3duLAogICAgICBDb3JuZXJMZWZ0VXAsCiAgICAgIENvcm5lclJpZ2h0RG93biwKICAgICAgQ29ybmVyUmlnaHRVcCwKICAgICAgQ29ybmVyVXBMZWZ0LAogICAgICBDb3JuZXJVcFJpZ2h0LAogICAgICBDcHUsCiAgICAgIENyZWF0aXZlQ29tbW9ucywKICAgICAgQ3JlZGl0Q2FyZCwKICAgICAgQ3JvaXNzYW50LAogICAgICBDcm9wLAogICAgICBDcm9zcywKICAgICAgQ3Jvc3NoYWlyLAogICAgICBDcm93biwKICAgICAgQ3Vib2lkLAogICAgICBDdXBTb2RhLAogICAgICBDdXJseUJyYWNlczogQnJhY2VzLAogICAgICBDdXJyZW5jeSwKICAgICAgQ3lsaW5kZXIsCiAgICAgIERhbSwKICAgICAgRGF0YWJhc2UsCiAgICAgIERhdGFiYXNlQmFja3VwLAogICAgICBEYXRhYmFzZVphcCwKICAgICAgRGVjaW1hbHNBcnJvd0xlZnQsCiAgICAgIERlY2ltYWxzQXJyb3dSaWdodCwKICAgICAgRGVsZXRlLAogICAgICBEZXNzZXJ0LAogICAgICBEaWFtZXRlciwKICAgICAgRGlhbW9uZCwKICAgICAgRGlhbW9uZE1pbnVzLAogICAgICBEaWFtb25kUGVyY2VudCwKICAgICAgRGlhbW9uZFBsdXMsCiAgICAgIERpY2UxLAogICAgICBEaWNlMiwKICAgICAgRGljZTMsCiAgICAgIERpY2U0LAogICAgICBEaWNlNSwKICAgICAgRGljZTYsCiAgICAgIERpY2VzLAogICAgICBEaWZmLAogICAgICBEaXNjLAogICAgICBEaXNjMiwKICAgICAgRGlzYzMsCiAgICAgIERpc2NBbGJ1bSwKICAgICAgRGl2aWRlLAogICAgICBEaXZpZGVDaXJjbGU6IENpcmNsZURpdmlkZSwKICAgICAgRGl2aWRlU3F1YXJlOiBTcXVhcmVEaXZpZGUsCiAgICAgIERuYSwKICAgICAgRG5hT2ZmLAogICAgICBEb2NrLAogICAgICBEb2csCiAgICAgIERvbGxhclNpZ24sCiAgICAgIERvbnV0LAogICAgICBEb29yQ2xvc2VkLAogICAgICBEb29yQ2xvc2VkTG9ja2VkLAogICAgICBEb29yT3BlbiwKICAgICAgRG90LAogICAgICBEb3RTcXVhcmU6IFNxdWFyZURvdCwKICAgICAgRG93bmxvYWQsCiAgICAgIERvd25sb2FkQ2xvdWQ6IENsb3VkRG93bmxvYWQsCiAgICAgIERyYWZ0aW5nQ29tcGFzcywKICAgICAgRHJhbWEsCiAgICAgIERyaWJiYmxlLAogICAgICBEcmlsbCwKICAgICAgRHJvbmUsCiAgICAgIERyb3BsZXQsCiAgICAgIERyb3BsZXRPZmYsCiAgICAgIERyb3BsZXRzLAogICAgICBEcnVtLAogICAgICBEcnVtc3RpY2ssCiAgICAgIER1bWJiZWxsLAogICAgICBFYXIsCiAgICAgIEVhck9mZiwKICAgICAgRWFydGgsCiAgICAgIEVhcnRoTG9jaywKICAgICAgRWNsaXBzZSwKICAgICAgRWRpdDogU3F1YXJlUGVuLAogICAgICBFZGl0MjogUGVuLAogICAgICBFZGl0MzogUGVuTGluZSwKICAgICAgRWdnLAogICAgICBFZ2dGcmllZCwKICAgICAgRWdnT2ZmLAogICAgICBFbGxpcHNpcywKICAgICAgRWxsaXBzaXNWZXJ0aWNhbCwKICAgICAgRXF1YWwsCiAgICAgIEVxdWFsQXBwcm94aW1hdGVseSwKICAgICAgRXF1YWxOb3QsCiAgICAgIEVxdWFsU3F1YXJlOiBTcXVhcmVFcXVhbCwKICAgICAgRXJhc2VyLAogICAgICBFdGhlcm5ldFBvcnQsCiAgICAgIEV1cm8sCiAgICAgIEV2Q2hhcmdlciwKICAgICAgRXhwYW5kLAogICAgICBFeHRlcm5hbExpbmssCiAgICAgIEV5ZSwKICAgICAgRXllQ2xvc2VkLAogICAgICBFeWVPZmYsCiAgICAgIEZhY2Vib29rLAogICAgICBGYWN0b3J5LAogICAgICBGYW4sCiAgICAgIEZhc3RGb3J3YXJkLAogICAgICBGZWF0aGVyLAogICAgICBGZW5jZSwKICAgICAgRmVycmlzV2hlZWwsCiAgICAgIEZpZ21hLAogICAgICBGaWxlLAogICAgICBGaWxlQXJjaGl2ZSwKICAgICAgRmlsZUF1ZGlvOiBGaWxlSGVhZHBob25lLAogICAgICBGaWxlQXVkaW8yOiBGaWxlSGVhZHBob25lLAogICAgICBGaWxlQXhpczNEOiBGaWxlQXhpczNkLAogICAgICBGaWxlQXhpczNkLAogICAgICBGaWxlQmFkZ2UsCiAgICAgIEZpbGVCYWRnZTI6IEZpbGVCYWRnZSwKICAgICAgRmlsZUJhckNoYXJ0OiBGaWxlQ2hhcnRDb2x1bW5JbmNyZWFzaW5nLAogICAgICBGaWxlQmFyQ2hhcnQyOiBGaWxlQ2hhcnRDb2x1bW4sCiAgICAgIEZpbGVCb3gsCiAgICAgIEZpbGVCcmFjZXMsCiAgICAgIEZpbGVCcmFjZXNDb3JuZXIsCiAgICAgIEZpbGVDaGFydENvbHVtbiwKICAgICAgRmlsZUNoYXJ0Q29sdW1uSW5jcmVhc2luZywKICAgICAgRmlsZUNoYXJ0TGluZSwKICAgICAgRmlsZUNoYXJ0UGllLAogICAgICBGaWxlQ2hlY2ssCiAgICAgIEZpbGVDaGVjazI6IEZpbGVDaGVja0Nvcm5lciwKICAgICAgRmlsZUNoZWNrQ29ybmVyLAogICAgICBGaWxlQ2xvY2ssCiAgICAgIEZpbGVDb2RlLAogICAgICBGaWxlQ29kZTI6IEZpbGVDb2RlQ29ybmVyLAogICAgICBGaWxlQ29kZUNvcm5lciwKICAgICAgRmlsZUNvZywKICAgICAgRmlsZUNvZzI6IEZpbGVDb2csCiAgICAgIEZpbGVEaWZmLAogICAgICBGaWxlRGlnaXQsCiAgICAgIEZpbGVEb3duLAogICAgICBGaWxlRWRpdDogRmlsZVBlbiwKICAgICAgRmlsZUV4Y2xhbWF0aW9uUG9pbnQsCiAgICAgIEZpbGVIZWFkcGhvbmUsCiAgICAgIEZpbGVIZWFydCwKICAgICAgRmlsZUltYWdlLAogICAgICBGaWxlSW5wdXQsCiAgICAgIEZpbGVKc29uOiBGaWxlQnJhY2VzLAogICAgICBGaWxlSnNvbjI6IEZpbGVCcmFjZXNDb3JuZXIsCiAgICAgIEZpbGVLZXksCiAgICAgIEZpbGVLZXkyOiBGaWxlS2V5LAogICAgICBGaWxlTGluZUNoYXJ0OiBGaWxlQ2hhcnRMaW5lLAogICAgICBGaWxlTG9jaywKICAgICAgRmlsZUxvY2syOiBGaWxlTG9jaywKICAgICAgRmlsZU1pbnVzLAogICAgICBGaWxlTWludXMyOiBGaWxlTWludXNDb3JuZXIsCiAgICAgIEZpbGVNaW51c0Nvcm5lciwKICAgICAgRmlsZU11c2ljLAogICAgICBGaWxlT3V0cHV0LAogICAgICBGaWxlUGVuLAogICAgICBGaWxlUGVuTGluZSwKICAgICAgRmlsZVBpZUNoYXJ0OiBGaWxlQ2hhcnRQaWUsCiAgICAgIEZpbGVQbGF5LAogICAgICBGaWxlUGx1cywKICAgICAgRmlsZVBsdXMyOiBGaWxlUGx1c0Nvcm5lciwKICAgICAgRmlsZVBsdXNDb3JuZXIsCiAgICAgIEZpbGVRdWVzdGlvbjogRmlsZVF1ZXN0aW9uTWFyaywKICAgICAgRmlsZVF1ZXN0aW9uTWFyaywKICAgICAgRmlsZVNjYW4sCiAgICAgIEZpbGVTZWFyY2gsCiAgICAgIEZpbGVTZWFyY2gyOiBGaWxlU2VhcmNoQ29ybmVyLAogICAgICBGaWxlU2VhcmNoQ29ybmVyLAogICAgICBGaWxlU2lnbmFsLAogICAgICBGaWxlU2lnbmF0dXJlOiBGaWxlUGVuTGluZSwKICAgICAgRmlsZVNsaWRlcnMsCiAgICAgIEZpbGVTcHJlYWRzaGVldCwKICAgICAgRmlsZVN0YWNrLAogICAgICBGaWxlU3ltbGluaywKICAgICAgRmlsZVRlcm1pbmFsLAogICAgICBGaWxlVGV4dCwKICAgICAgRmlsZVR5cGUsCiAgICAgIEZpbGVUeXBlMjogRmlsZVR5cGVDb3JuZXIsCiAgICAgIEZpbGVUeXBlQ29ybmVyLAogICAgICBGaWxlVXAsCiAgICAgIEZpbGVVc2VyLAogICAgICBGaWxlVmlkZW86IEZpbGVQbGF5LAogICAgICBGaWxlVmlkZW8yOiBGaWxlVmlkZW9DYW1lcmEsCiAgICAgIEZpbGVWaWRlb0NhbWVyYSwKICAgICAgRmlsZVZvbHVtZSwKICAgICAgRmlsZVZvbHVtZTI6IEZpbGVTaWduYWwsCiAgICAgIEZpbGVXYXJuaW5nOiBGaWxlRXhjbGFtYXRpb25Qb2ludCwKICAgICAgRmlsZVgsCiAgICAgIEZpbGVYMjogRmlsZVhDb3JuZXIsCiAgICAgIEZpbGVYQ29ybmVyLAogICAgICBGaWxlcywKICAgICAgRmlsbSwKICAgICAgRmlsdGVyOiBGdW5uZWwsCiAgICAgIEZpbHRlclg6IEZ1bm5lbFgsCiAgICAgIEZpbmdlcnByaW50OiBGaW5nZXJwcmludFBhdHRlcm4sCiAgICAgIEZpbmdlcnByaW50UGF0dGVybiwKICAgICAgRmlyZUV4dGluZ3Vpc2hlciwKICAgICAgRmlzaCwKICAgICAgRmlzaE9mZiwKICAgICAgRmlzaFN5bWJvbCwKICAgICAgRmlzaGluZ0hvb2ssCiAgICAgIEZsYWcsCiAgICAgIEZsYWdPZmYsCiAgICAgIEZsYWdUcmlhbmdsZUxlZnQsCiAgICAgIEZsYWdUcmlhbmdsZVJpZ2h0LAogICAgICBGbGFtZSwKICAgICAgRmxhbWVLaW5kbGluZywKICAgICAgRmxhc2hsaWdodCwKICAgICAgRmxhc2hsaWdodE9mZiwKICAgICAgRmxhc2tDb25pY2FsLAogICAgICBGbGFza0NvbmljYWxPZmYsCiAgICAgIEZsYXNrUm91bmQsCiAgICAgIEZsaXBIb3Jpem9udGFsLAogICAgICBGbGlwSG9yaXpvbnRhbDIsCiAgICAgIEZsaXBWZXJ0aWNhbCwKICAgICAgRmxpcFZlcnRpY2FsMiwKICAgICAgRmxvd2VyLAogICAgICBGbG93ZXIyLAogICAgICBGb2N1cywKICAgICAgRm9sZEhvcml6b250YWwsCiAgICAgIEZvbGRWZXJ0aWNhbCwKICAgICAgRm9sZGVyLAogICAgICBGb2xkZXJBcmNoaXZlLAogICAgICBGb2xkZXJDaGVjaywKICAgICAgRm9sZGVyQ2xvY2ssCiAgICAgIEZvbGRlckNsb3NlZCwKICAgICAgRm9sZGVyQ29kZSwKICAgICAgRm9sZGVyQ29nLAogICAgICBGb2xkZXJDb2cyOiBGb2xkZXJDb2csCiAgICAgIEZvbGRlckRvdCwKICAgICAgRm9sZGVyRG93biwKICAgICAgRm9sZGVyRWRpdDogRm9sZGVyUGVuLAogICAgICBGb2xkZXJHaXQsCiAgICAgIEZvbGRlckdpdDIsCiAgICAgIEZvbGRlckhlYXJ0LAogICAgICBGb2xkZXJJbnB1dCwKICAgICAgRm9sZGVyS2FuYmFuLAogICAgICBGb2xkZXJLZXksCiAgICAgIEZvbGRlckxvY2ssCiAgICAgIEZvbGRlck1pbnVzLAogICAgICBGb2xkZXJPcGVuLAogICAgICBGb2xkZXJPcGVuRG90LAogICAgICBGb2xkZXJPdXRwdXQsCiAgICAgIEZvbGRlclBlbiwKICAgICAgRm9sZGVyUGx1cywKICAgICAgRm9sZGVyUm9vdCwKICAgICAgRm9sZGVyU2VhcmNoLAogICAgICBGb2xkZXJTZWFyY2gyLAogICAgICBGb2xkZXJTeW1saW5rLAogICAgICBGb2xkZXJTeW5jLAogICAgICBGb2xkZXJUcmVlLAogICAgICBGb2xkZXJVcCwKICAgICAgRm9sZGVyWCwKICAgICAgRm9sZGVycywKICAgICAgRm9vdHByaW50cywKICAgICAgRm9ya0tuaWZlOiBVdGVuc2lscywKICAgICAgRm9ya0tuaWZlQ3Jvc3NlZDogVXRlbnNpbHNDcm9zc2VkLAogICAgICBGb3JrbGlmdCwKICAgICAgRm9ybSwKICAgICAgRm9ybUlucHV0OiBSZWN0YW5nbGVFbGxpcHNpcywKICAgICAgRm9yd2FyZCwKICAgICAgRnJhbWUsCiAgICAgIEZyYW1lciwKICAgICAgRnJvd24sCiAgICAgIEZ1ZWwsCiAgICAgIEZ1bGxzY3JlZW4sCiAgICAgIEZ1bmN0aW9uU3F1YXJlOiBTcXVhcmVGdW5jdGlvbiwKICAgICAgRnVubmVsLAogICAgICBGdW5uZWxQbHVzLAogICAgICBGdW5uZWxYLAogICAgICBHYWxsZXJ5SG9yaXpvbnRhbCwKICAgICAgR2FsbGVyeUhvcml6b250YWxFbmQsCiAgICAgIEdhbGxlcnlUaHVtYm5haWxzLAogICAgICBHYWxsZXJ5VmVydGljYWwsCiAgICAgIEdhbGxlcnlWZXJ0aWNhbEVuZCwKICAgICAgR2FtZXBhZCwKICAgICAgR2FtZXBhZDIsCiAgICAgIEdhbWVwYWREaXJlY3Rpb25hbCwKICAgICAgR2FudHRDaGFydDogQ2hhcnROb0F4ZXNHYW50dCwKICAgICAgR2FudHRDaGFydFNxdWFyZTogU3F1YXJlQ2hhcnRHYW50dCwKICAgICAgR2F1Z2UsCiAgICAgIEdhdWdlQ2lyY2xlOiBDaXJjbGVHYXVnZSwKICAgICAgR2F2ZWwsCiAgICAgIEdlbSwKICAgICAgR2VvcmdpYW5MYXJpLAogICAgICBHaG9zdCwKICAgICAgR2lmdCwKICAgICAgR2l0QnJhbmNoLAogICAgICBHaXRCcmFuY2hNaW51cywKICAgICAgR2l0QnJhbmNoUGx1cywKICAgICAgR2l0Q29tbWl0OiBHaXRDb21taXRIb3Jpem9udGFsLAogICAgICBHaXRDb21taXRIb3Jpem9udGFsLAogICAgICBHaXRDb21taXRWZXJ0aWNhbCwKICAgICAgR2l0Q29tcGFyZSwKICAgICAgR2l0Q29tcGFyZUFycm93cywKICAgICAgR2l0Rm9yaywKICAgICAgR2l0R3JhcGgsCiAgICAgIEdpdE1lcmdlLAogICAgICBHaXRQdWxsUmVxdWVzdCwKICAgICAgR2l0UHVsbFJlcXVlc3RBcnJvdywKICAgICAgR2l0UHVsbFJlcXVlc3RDbG9zZWQsCiAgICAgIEdpdFB1bGxSZXF1ZXN0Q3JlYXRlLAogICAgICBHaXRQdWxsUmVxdWVzdENyZWF0ZUFycm93LAogICAgICBHaXRQdWxsUmVxdWVzdERyYWZ0LAogICAgICBHaXRodWIsCiAgICAgIEdpdGxhYiwKICAgICAgR2xhc3NXYXRlciwKICAgICAgR2xhc3NlcywKICAgICAgR2xvYmUsCiAgICAgIEdsb2JlMjogRWFydGgsCiAgICAgIEdsb2JlTG9jaywKICAgICAgR2xvYmVYLAogICAgICBHb2FsLAogICAgICBHcHUsCiAgICAgIEdyYWI6IEhhbmRHcmFiLAogICAgICBHcmFkdWF0aW9uQ2FwLAogICAgICBHcmFwZSwKICAgICAgR3JpZDogR3JpZDN4MywKICAgICAgR3JpZDJYMjogR3JpZDJ4MiwKICAgICAgR3JpZDJYMkNoZWNrOiBHcmlkMngyQ2hlY2ssCiAgICAgIEdyaWQyWDJQbHVzOiBHcmlkMngyUGx1cywKICAgICAgR3JpZDJYMlg6IEdyaWQyeDJYLAogICAgICBHcmlkMngyLAogICAgICBHcmlkMngyQ2hlY2ssCiAgICAgIEdyaWQyeDJQbHVzLAogICAgICBHcmlkMngyWCwKICAgICAgR3JpZDNYMzogR3JpZDN4MywKICAgICAgR3JpZDN4MiwKICAgICAgR3JpZDN4MywKICAgICAgR3JpcCwKICAgICAgR3JpcEhvcml6b250YWwsCiAgICAgIEdyaXBWZXJ0aWNhbCwKICAgICAgR3JvdXAsCiAgICAgIEd1aXRhciwKICAgICAgSGFtLAogICAgICBIYW1idXJnZXIsCiAgICAgIEhhbW1lciwKICAgICAgSGFuZCwKICAgICAgSGFuZENvaW5zLAogICAgICBIYW5kRmlzdCwKICAgICAgSGFuZEdyYWIsCiAgICAgIEhhbmRIZWFydCwKICAgICAgSGFuZEhlbHBpbmcsCiAgICAgIEhhbmRNZXRhbCwKICAgICAgSGFuZFBsYXR0ZXIsCiAgICAgIEhhbmRiYWcsCiAgICAgIEhhbmRzaGFrZSwKICAgICAgSGFyZERyaXZlLAogICAgICBIYXJkRHJpdmVEb3dubG9hZCwKICAgICAgSGFyZERyaXZlVXBsb2FkLAogICAgICBIYXJkSGF0LAogICAgICBIYXNoLAogICAgICBIYXRHbGFzc2VzLAogICAgICBIYXplLAogICAgICBIZCwKICAgICAgSGRtaVBvcnQsCiAgICAgIEhlYWRpbmcsCiAgICAgIEhlYWRpbmcxLAogICAgICBIZWFkaW5nMiwKICAgICAgSGVhZGluZzMsCiAgICAgIEhlYWRpbmc0LAogICAgICBIZWFkaW5nNSwKICAgICAgSGVhZGluZzYsCiAgICAgIEhlYWRwaG9uZU9mZiwKICAgICAgSGVhZHBob25lcywKICAgICAgSGVhZHNldCwKICAgICAgSGVhcnQsCiAgICAgIEhlYXJ0Q3JhY2ssCiAgICAgIEhlYXJ0SGFuZHNoYWtlLAogICAgICBIZWFydE1pbnVzLAogICAgICBIZWFydE9mZiwKICAgICAgSGVhcnRQbHVzLAogICAgICBIZWFydFB1bHNlLAogICAgICBIZWF0ZXIsCiAgICAgIEhlbGljb3B0ZXIsCiAgICAgIEhlbHBDaXJjbGU6IENpcmNsZVF1ZXN0aW9uTWFyaywKICAgICAgSGVscGluZ0hhbmQ6IEhhbmRIZWxwaW5nLAogICAgICBIZXhhZ29uLAogICAgICBIaWdobGlnaHRlciwKICAgICAgSGlzdG9yeSwKICAgICAgSG9tZTogSG91c2UsCiAgICAgIEhvcCwKICAgICAgSG9wT2ZmLAogICAgICBIb3NwaXRhbCwKICAgICAgSG90ZWwsCiAgICAgIEhvdXJnbGFzcywKICAgICAgSG91c2UsCiAgICAgIEhvdXNlSGVhcnQsCiAgICAgIEhvdXNlUGx1ZywKICAgICAgSG91c2VQbHVzLAogICAgICBIb3VzZVdpZmksCiAgICAgIEljZUNyZWFtOiBJY2VDcmVhbUNvbmUsCiAgICAgIEljZUNyZWFtMjogSWNlQ3JlYW1Cb3dsLAogICAgICBJY2VDcmVhbUJvd2wsCiAgICAgIEljZUNyZWFtQ29uZSwKICAgICAgSWRDYXJkLAogICAgICBJZENhcmRMYW55YXJkLAogICAgICBJbWFnZTogSW1hZ2UyLAogICAgICBJbWFnZURvd24sCiAgICAgIEltYWdlTWludXMsCiAgICAgIEltYWdlT2ZmLAogICAgICBJbWFnZVBsYXksCiAgICAgIEltYWdlUGx1cywKICAgICAgSW1hZ2VVcCwKICAgICAgSW1hZ2VVcHNjYWxlLAogICAgICBJbWFnZXMsCiAgICAgIEltcG9ydCwKICAgICAgSW5ib3gsCiAgICAgIEluZGVudDogTGlzdEluZGVudEluY3JlYXNlLAogICAgICBJbmRlbnREZWNyZWFzZTogTGlzdEluZGVudERlY3JlYXNlLAogICAgICBJbmRlbnRJbmNyZWFzZTogTGlzdEluZGVudEluY3JlYXNlLAogICAgICBJbmRpYW5SdXBlZSwKICAgICAgSW5maW5pdHk6IEluZmluaXR5MiwKICAgICAgSW5mbzogSW5mbzIsCiAgICAgIEluc3BlY3Q6IFNxdWFyZU1vdXNlUG9pbnRlciwKICAgICAgSW5zcGVjdGlvblBhbmVsLAogICAgICBJbnN0YWdyYW0sCiAgICAgIEl0YWxpYywKICAgICAgSXRlcmF0aW9uQ2N3LAogICAgICBJdGVyYXRpb25DdywKICAgICAgSmFwYW5lc2VZZW4sCiAgICAgIEpveXN0aWNrLAogICAgICBLYW5iYW4sCiAgICAgIEthbmJhblNxdWFyZTogU3F1YXJlS2FuYmFuLAogICAgICBLYW5iYW5TcXVhcmVEYXNoZWQ6IFNxdWFyZURhc2hlZEthbmJhbiwKICAgICAgS2F5YWssCiAgICAgIEtleTogS2V5MiwKICAgICAgS2V5Um91bmQsCiAgICAgIEtleVNxdWFyZSwKICAgICAgS2V5Ym9hcmQ6IEtleWJvYXJkMiwKICAgICAgS2V5Ym9hcmRNdXNpYywKICAgICAgS2V5Ym9hcmRPZmYsCiAgICAgIExhbXAsCiAgICAgIExhbXBDZWlsaW5nLAogICAgICBMYW1wRGVzaywKICAgICAgTGFtcEZsb29yLAogICAgICBMYW1wV2FsbERvd24sCiAgICAgIExhbXBXYWxsVXAsCiAgICAgIExhbmRQbG90LAogICAgICBMYW5kbWFyaywKICAgICAgTGFuZ3VhZ2VzLAogICAgICBMYXB0b3AsCiAgICAgIExhcHRvcDI6IExhcHRvcE1pbmltYWwsCiAgICAgIExhcHRvcE1pbmltYWwsCiAgICAgIExhcHRvcE1pbmltYWxDaGVjaywKICAgICAgTGFzc28sCiAgICAgIExhc3NvU2VsZWN0LAogICAgICBMYXVnaCwKICAgICAgTGF5ZXJzOiBMYXllcnMzLAogICAgICBMYXllcnMyLAogICAgICBMYXllcnMzLAogICAgICBMYXllcnNQbHVzLAogICAgICBMYXlvdXQ6IFBhbmVsc1RvcExlZnQsCiAgICAgIExheW91dERhc2hib2FyZCwKICAgICAgTGF5b3V0R3JpZCwKICAgICAgTGF5b3V0TGlzdCwKICAgICAgTGF5b3V0UGFuZWxMZWZ0LAogICAgICBMYXlvdXRQYW5lbFRvcCwKICAgICAgTGF5b3V0VGVtcGxhdGUsCiAgICAgIExlYWYsCiAgICAgIExlYWZ5R3JlZW4sCiAgICAgIExlY3Rlcm4sCiAgICAgIExldHRlclRleHQ6IFRleHRJbml0aWFsLAogICAgICBMaWJyYXJ5OiBMaWJyYXJ5MiwKICAgICAgTGlicmFyeUJpZywKICAgICAgTGlicmFyeVNxdWFyZTogU3F1YXJlTGlicmFyeSwKICAgICAgTGlmZUJ1b3ksCiAgICAgIExpZ2F0dXJlLAogICAgICBMaWdodGJ1bGIsCiAgICAgIExpZ2h0YnVsYk9mZiwKICAgICAgTGluZUNoYXJ0OiBDaGFydExpbmUsCiAgICAgIExpbmVTcXVpZ2dsZSwKICAgICAgTGluaywKICAgICAgTGluazIsCiAgICAgIExpbmsyT2ZmLAogICAgICBMaW5rZWRpbiwKICAgICAgTGlzdCwKICAgICAgTGlzdENoZWNrLAogICAgICBMaXN0Q2hlY2tzLAogICAgICBMaXN0Q2hldnJvbnNEb3duVXAsCiAgICAgIExpc3RDaGV2cm9uc1VwRG93biwKICAgICAgTGlzdENvbGxhcHNlLAogICAgICBMaXN0RW5kLAogICAgICBMaXN0RmlsdGVyLAogICAgICBMaXN0RmlsdGVyUGx1cywKICAgICAgTGlzdEluZGVudERlY3JlYXNlLAogICAgICBMaXN0SW5kZW50SW5jcmVhc2UsCiAgICAgIExpc3RNaW51cywKICAgICAgTGlzdE11c2ljLAogICAgICBMaXN0T3JkZXJlZCwKICAgICAgTGlzdFBsdXMsCiAgICAgIExpc3RSZXN0YXJ0LAogICAgICBMaXN0U3RhcnQsCiAgICAgIExpc3RUb2RvLAogICAgICBMaXN0VHJlZSwKICAgICAgTGlzdFZpZGVvLAogICAgICBMaXN0WCwKICAgICAgTG9hZGVyLAogICAgICBMb2FkZXIyOiBMb2FkZXJDaXJjbGUsCiAgICAgIExvYWRlckNpcmNsZSwKICAgICAgTG9hZGVyUGlud2hlZWwsCiAgICAgIExvY2F0ZSwKICAgICAgTG9jYXRlRml4ZWQsCiAgICAgIExvY2F0ZU9mZiwKICAgICAgTG9jYXRpb25FZGl0OiBNYXBQaW5QZW4sCiAgICAgIExvY2ssCiAgICAgIExvY2tLZXlob2xlLAogICAgICBMb2NrS2V5aG9sZU9wZW4sCiAgICAgIExvY2tPcGVuLAogICAgICBMb2dJbiwKICAgICAgTG9nT3V0LAogICAgICBMb2dzLAogICAgICBMb2xsaXBvcCwKICAgICAgTHVnZ2FnZSwKICAgICAgTVNxdWFyZTogU3F1YXJlTSwKICAgICAgTWFnbmV0LAogICAgICBNYWlsLAogICAgICBNYWlsQ2hlY2ssCiAgICAgIE1haWxNaW51cywKICAgICAgTWFpbE9wZW4sCiAgICAgIE1haWxQbHVzLAogICAgICBNYWlsUXVlc3Rpb246IE1haWxRdWVzdGlvbk1hcmssCiAgICAgIE1haWxRdWVzdGlvbk1hcmssCiAgICAgIE1haWxTZWFyY2gsCiAgICAgIE1haWxXYXJuaW5nLAogICAgICBNYWlsWCwKICAgICAgTWFpbGJveCwKICAgICAgTWFpbHMsCiAgICAgIE1hcDogTWFwMiwKICAgICAgTWFwTWludXMsCiAgICAgIE1hcFBpbiwKICAgICAgTWFwUGluQ2hlY2ssCiAgICAgIE1hcFBpbkNoZWNrSW5zaWRlLAogICAgICBNYXBQaW5Ib3VzZSwKICAgICAgTWFwUGluTWludXMsCiAgICAgIE1hcFBpbk1pbnVzSW5zaWRlLAogICAgICBNYXBQaW5PZmYsCiAgICAgIE1hcFBpblBlbiwKICAgICAgTWFwUGluUGx1cywKICAgICAgTWFwUGluUGx1c0luc2lkZSwKICAgICAgTWFwUGluWCwKICAgICAgTWFwUGluWEluc2lkZSwKICAgICAgTWFwUGlubmVkLAogICAgICBNYXBQbHVzLAogICAgICBNYXJzLAogICAgICBNYXJzU3Ryb2tlLAogICAgICBNYXJ0aW5pLAogICAgICBNYXhpbWl6ZSwKICAgICAgTWF4aW1pemUyLAogICAgICBNZWRhbCwKICAgICAgTWVnYXBob25lLAogICAgICBNZWdhcGhvbmVPZmYsCiAgICAgIE1laCwKICAgICAgTWVtb3J5U3RpY2ssCiAgICAgIE1lbnUsCiAgICAgIE1lbnVTcXVhcmU6IFNxdWFyZU1lbnUsCiAgICAgIE1lcmdlLAogICAgICBNZXNzYWdlQ2lyY2xlLAogICAgICBNZXNzYWdlQ2lyY2xlQ29kZSwKICAgICAgTWVzc2FnZUNpcmNsZURhc2hlZCwKICAgICAgTWVzc2FnZUNpcmNsZUhlYXJ0LAogICAgICBNZXNzYWdlQ2lyY2xlTW9yZSwKICAgICAgTWVzc2FnZUNpcmNsZU9mZiwKICAgICAgTWVzc2FnZUNpcmNsZVBsdXMsCiAgICAgIE1lc3NhZ2VDaXJjbGVRdWVzdGlvbjogTWVzc2FnZUNpcmNsZVF1ZXN0aW9uTWFyaywKICAgICAgTWVzc2FnZUNpcmNsZVF1ZXN0aW9uTWFyaywKICAgICAgTWVzc2FnZUNpcmNsZVJlcGx5LAogICAgICBNZXNzYWdlQ2lyY2xlV2FybmluZywKICAgICAgTWVzc2FnZUNpcmNsZVgsCiAgICAgIE1lc3NhZ2VTcXVhcmUsCiAgICAgIE1lc3NhZ2VTcXVhcmVDb2RlLAogICAgICBNZXNzYWdlU3F1YXJlRGFzaGVkLAogICAgICBNZXNzYWdlU3F1YXJlRGlmZiwKICAgICAgTWVzc2FnZVNxdWFyZURvdCwKICAgICAgTWVzc2FnZVNxdWFyZUhlYXJ0LAogICAgICBNZXNzYWdlU3F1YXJlTG9jaywKICAgICAgTWVzc2FnZVNxdWFyZU1vcmUsCiAgICAgIE1lc3NhZ2VTcXVhcmVPZmYsCiAgICAgIE1lc3NhZ2VTcXVhcmVQbHVzLAogICAgICBNZXNzYWdlU3F1YXJlUXVvdGUsCiAgICAgIE1lc3NhZ2VTcXVhcmVSZXBseSwKICAgICAgTWVzc2FnZVNxdWFyZVNoYXJlLAogICAgICBNZXNzYWdlU3F1YXJlVGV4dCwKICAgICAgTWVzc2FnZVNxdWFyZVdhcm5pbmcsCiAgICAgIE1lc3NhZ2VTcXVhcmVYLAogICAgICBNZXNzYWdlc1NxdWFyZSwKICAgICAgTWljLAogICAgICBNaWMyOiBNaWNWb2NhbCwKICAgICAgTWljT2ZmLAogICAgICBNaWNWb2NhbCwKICAgICAgTWljcm9jaGlwLAogICAgICBNaWNyb3Njb3BlLAogICAgICBNaWNyb3dhdmUsCiAgICAgIE1pbGVzdG9uZSwKICAgICAgTWlsaywKICAgICAgTWlsa09mZiwKICAgICAgTWluaW1pemUsCiAgICAgIE1pbmltaXplMiwKICAgICAgTWludXMsCiAgICAgIE1pbnVzQ2lyY2xlOiBDaXJjbGVNaW51cywKICAgICAgTWludXNTcXVhcmU6IFNxdWFyZU1pbnVzLAogICAgICBNb25pdG9yLAogICAgICBNb25pdG9yQ2hlY2ssCiAgICAgIE1vbml0b3JDbG91ZCwKICAgICAgTW9uaXRvckNvZywKICAgICAgTW9uaXRvckRvdCwKICAgICAgTW9uaXRvckRvd24sCiAgICAgIE1vbml0b3JPZmYsCiAgICAgIE1vbml0b3JQYXVzZSwKICAgICAgTW9uaXRvclBsYXksCiAgICAgIE1vbml0b3JTbWFydHBob25lLAogICAgICBNb25pdG9yU3BlYWtlciwKICAgICAgTW9uaXRvclN0b3AsCiAgICAgIE1vbml0b3JVcCwKICAgICAgTW9uaXRvclgsCiAgICAgIE1vb24sCiAgICAgIE1vb25TdGFyLAogICAgICBNb3JlSG9yaXpvbnRhbDogRWxsaXBzaXMsCiAgICAgIE1vcmVWZXJ0aWNhbDogRWxsaXBzaXNWZXJ0aWNhbCwKICAgICAgTW90b3JiaWtlLAogICAgICBNb3VudGFpbiwKICAgICAgTW91bnRhaW5Tbm93LAogICAgICBNb3VzZSwKICAgICAgTW91c2VPZmYsCiAgICAgIE1vdXNlUG9pbnRlciwKICAgICAgTW91c2VQb2ludGVyMiwKICAgICAgTW91c2VQb2ludGVyMk9mZiwKICAgICAgTW91c2VQb2ludGVyQmFuLAogICAgICBNb3VzZVBvaW50ZXJDbGljaywKICAgICAgTW91c2VQb2ludGVyU3F1YXJlRGFzaGVkOiBTcXVhcmVEYXNoZWRNb3VzZVBvaW50ZXIsCiAgICAgIE1vdmUsCiAgICAgIE1vdmUzRDogTW92ZTNkLAogICAgICBNb3ZlM2QsCiAgICAgIE1vdmVEaWFnb25hbCwKICAgICAgTW92ZURpYWdvbmFsMiwKICAgICAgTW92ZURvd24sCiAgICAgIE1vdmVEb3duTGVmdCwKICAgICAgTW92ZURvd25SaWdodCwKICAgICAgTW92ZUhvcml6b250YWwsCiAgICAgIE1vdmVMZWZ0LAogICAgICBNb3ZlUmlnaHQsCiAgICAgIE1vdmVVcCwKICAgICAgTW92ZVVwTGVmdCwKICAgICAgTW92ZVVwUmlnaHQsCiAgICAgIE1vdmVWZXJ0aWNhbCwKICAgICAgTXVzaWMsCiAgICAgIE11c2ljMiwKICAgICAgTXVzaWMzLAogICAgICBNdXNpYzQsCiAgICAgIE5hdmlnYXRpb24sCiAgICAgIE5hdmlnYXRpb24yLAogICAgICBOYXZpZ2F0aW9uMk9mZiwKICAgICAgTmF2aWdhdGlvbk9mZiwKICAgICAgTmV0d29yaywKICAgICAgTmV3c3BhcGVyLAogICAgICBOZmMsCiAgICAgIE5vbkJpbmFyeSwKICAgICAgTm90ZWJvb2ssCiAgICAgIE5vdGVib29rUGVuLAogICAgICBOb3RlYm9va1RhYnMsCiAgICAgIE5vdGVib29rVGV4dCwKICAgICAgTm90ZXBhZFRleHQsCiAgICAgIE5vdGVwYWRUZXh0RGFzaGVkLAogICAgICBOdXQsCiAgICAgIE51dE9mZiwKICAgICAgT2N0YWdvbiwKICAgICAgT2N0YWdvbkFsZXJ0LAogICAgICBPY3RhZ29uTWludXMsCiAgICAgIE9jdGFnb25QYXVzZSwKICAgICAgT2N0YWdvblgsCiAgICAgIE9tZWdhLAogICAgICBPcHRpb24sCiAgICAgIE9yYml0LAogICAgICBPcmlnYW1pLAogICAgICBPdXRkZW50OiBMaXN0SW5kZW50RGVjcmVhc2UsCiAgICAgIFBhY2thZ2UsCiAgICAgIFBhY2thZ2UyLAogICAgICBQYWNrYWdlQ2hlY2ssCiAgICAgIFBhY2thZ2VNaW51cywKICAgICAgUGFja2FnZU9wZW4sCiAgICAgIFBhY2thZ2VQbHVzLAogICAgICBQYWNrYWdlU2VhcmNoLAogICAgICBQYWNrYWdlWCwKICAgICAgUGFpbnRCdWNrZXQsCiAgICAgIFBhaW50Um9sbGVyLAogICAgICBQYWludGJydXNoLAogICAgICBQYWludGJydXNoMjogUGFpbnRicnVzaFZlcnRpY2FsLAogICAgICBQYWludGJydXNoVmVydGljYWwsCiAgICAgIFBhbGV0dGUsCiAgICAgIFBhbG10cmVlOiBUcmVlUGFsbSwKICAgICAgUGFuZGEsCiAgICAgIFBhbmVsQm90dG9tLAogICAgICBQYW5lbEJvdHRvbUNsb3NlLAogICAgICBQYW5lbEJvdHRvbURhc2hlZCwKICAgICAgUGFuZWxCb3R0b21JbmFjdGl2ZTogUGFuZWxCb3R0b21EYXNoZWQsCiAgICAgIFBhbmVsQm90dG9tT3BlbiwKICAgICAgUGFuZWxMZWZ0LAogICAgICBQYW5lbExlZnRDbG9zZSwKICAgICAgUGFuZWxMZWZ0RGFzaGVkLAogICAgICBQYW5lbExlZnRJbmFjdGl2ZTogUGFuZWxMZWZ0RGFzaGVkLAogICAgICBQYW5lbExlZnRPcGVuLAogICAgICBQYW5lbExlZnRSaWdodERhc2hlZCwKICAgICAgUGFuZWxSaWdodCwKICAgICAgUGFuZWxSaWdodENsb3NlLAogICAgICBQYW5lbFJpZ2h0RGFzaGVkLAogICAgICBQYW5lbFJpZ2h0SW5hY3RpdmU6IFBhbmVsUmlnaHREYXNoZWQsCiAgICAgIFBhbmVsUmlnaHRPcGVuLAogICAgICBQYW5lbFRvcCwKICAgICAgUGFuZWxUb3BCb3R0b21EYXNoZWQsCiAgICAgIFBhbmVsVG9wQ2xvc2UsCiAgICAgIFBhbmVsVG9wRGFzaGVkLAogICAgICBQYW5lbFRvcEluYWN0aXZlOiBQYW5lbFRvcERhc2hlZCwKICAgICAgUGFuZWxUb3BPcGVuLAogICAgICBQYW5lbHNMZWZ0Qm90dG9tLAogICAgICBQYW5lbHNMZWZ0UmlnaHQ6IENvbHVtbnMzLAogICAgICBQYW5lbHNSaWdodEJvdHRvbSwKICAgICAgUGFuZWxzVG9wQm90dG9tOiBSb3dzMywKICAgICAgUGFuZWxzVG9wTGVmdCwKICAgICAgUGFwZXJjbGlwLAogICAgICBQYXJlbnRoZXNlcywKICAgICAgUGFya2luZ0NpcmNsZTogQ2lyY2xlUGFya2luZywKICAgICAgUGFya2luZ0NpcmNsZU9mZjogQ2lyY2xlUGFya2luZ09mZiwKICAgICAgUGFya2luZ01ldGVyLAogICAgICBQYXJraW5nU3F1YXJlOiBTcXVhcmVQYXJraW5nLAogICAgICBQYXJraW5nU3F1YXJlT2ZmOiBTcXVhcmVQYXJraW5nT2ZmLAogICAgICBQYXJ0eVBvcHBlciwKICAgICAgUGF1c2UsCiAgICAgIFBhdXNlQ2lyY2xlOiBDaXJjbGVQYXVzZSwKICAgICAgUGF1c2VPY3RhZ29uOiBPY3RhZ29uUGF1c2UsCiAgICAgIFBhd1ByaW50LAogICAgICBQY0Nhc2UsCiAgICAgIFBlbiwKICAgICAgUGVuQm94OiBTcXVhcmVQZW4sCiAgICAgIFBlbkxpbmUsCiAgICAgIFBlbk9mZiwKICAgICAgUGVuU3F1YXJlOiBTcXVhcmVQZW4sCiAgICAgIFBlblRvb2wsCiAgICAgIFBlbmNpbCwKICAgICAgUGVuY2lsTGluZSwKICAgICAgUGVuY2lsT2ZmLAogICAgICBQZW5jaWxSdWxlciwKICAgICAgUGVudGFnb24sCiAgICAgIFBlcmNlbnQsCiAgICAgIFBlcmNlbnRDaXJjbGU6IENpcmNsZVBlcmNlbnQsCiAgICAgIFBlcmNlbnREaWFtb25kOiBEaWFtb25kUGVyY2VudCwKICAgICAgUGVyY2VudFNxdWFyZTogU3F1YXJlUGVyY2VudCwKICAgICAgUGVyc29uU3RhbmRpbmcsCiAgICAgIFBoaWxpcHBpbmVQZXNvLAogICAgICBQaG9uZSwKICAgICAgUGhvbmVDYWxsLAogICAgICBQaG9uZUZvcndhcmRlZCwKICAgICAgUGhvbmVJbmNvbWluZywKICAgICAgUGhvbmVNaXNzZWQsCiAgICAgIFBob25lT2ZmLAogICAgICBQaG9uZU91dGdvaW5nLAogICAgICBQaSwKICAgICAgUGlTcXVhcmU6IFNxdWFyZVBpLAogICAgICBQaWFubywKICAgICAgUGlja2F4ZSwKICAgICAgUGljdHVyZUluUGljdHVyZSwKICAgICAgUGljdHVyZUluUGljdHVyZTIsCiAgICAgIFBpZUNoYXJ0OiBDaGFydFBpZSwKICAgICAgUGlnZ3lCYW5rLAogICAgICBQaWxjcm93LAogICAgICBQaWxjcm93TGVmdCwKICAgICAgUGlsY3Jvd1JpZ2h0LAogICAgICBQaWxjcm93U3F1YXJlOiBTcXVhcmVQaWxjcm93LAogICAgICBQaWxsLAogICAgICBQaWxsQm90dGxlLAogICAgICBQaW4sCiAgICAgIFBpbk9mZiwKICAgICAgUGlwZXR0ZSwKICAgICAgUGl6emEsCiAgICAgIFBsYW5lLAogICAgICBQbGFuZUxhbmRpbmcsCiAgICAgIFBsYW5lVGFrZW9mZiwKICAgICAgUGxheSwKICAgICAgUGxheUNpcmNsZTogQ2lyY2xlUGxheSwKICAgICAgUGxheVNxdWFyZTogU3F1YXJlUGxheSwKICAgICAgUGx1ZywKICAgICAgUGx1ZzIsCiAgICAgIFBsdWdaYXAsCiAgICAgIFBsdWdaYXAyOiBQbHVnWmFwLAogICAgICBQbHVzLAogICAgICBQbHVzQ2lyY2xlOiBDaXJjbGVQbHVzLAogICAgICBQbHVzU3F1YXJlOiBTcXVhcmVQbHVzLAogICAgICBQb2NrZXQsCiAgICAgIFBvY2tldEtuaWZlLAogICAgICBQb2RjYXN0LAogICAgICBQb2ludGVyLAogICAgICBQb2ludGVyT2ZmLAogICAgICBQb3Bjb3JuLAogICAgICBQb3BzaWNsZSwKICAgICAgUG91bmRTdGVybGluZywKICAgICAgUG93ZXIsCiAgICAgIFBvd2VyQ2lyY2xlOiBDaXJjbGVQb3dlciwKICAgICAgUG93ZXJPZmYsCiAgICAgIFBvd2VyU3F1YXJlOiBTcXVhcmVQb3dlciwKICAgICAgUHJlc2VudGF0aW9uLAogICAgICBQcmludGVyLAogICAgICBQcmludGVyQ2hlY2ssCiAgICAgIFByaW50ZXJYLAogICAgICBQcm9qZWN0b3IsCiAgICAgIFByb3BvcnRpb25zLAogICAgICBQdXp6bGUsCiAgICAgIFB5cmFtaWQsCiAgICAgIFFyQ29kZSwKICAgICAgUXVvdGUsCiAgICAgIFJhYmJpdCwKICAgICAgUmFkYXIsCiAgICAgIFJhZGlhdGlvbiwKICAgICAgUmFkaWNhbCwKICAgICAgUmFkaW8sCiAgICAgIFJhZGlvUmVjZWl2ZXIsCiAgICAgIFJhZGlvVG93ZXIsCiAgICAgIFJhZGl1cywKICAgICAgUmFpbFN5bWJvbCwKICAgICAgUmFpbmJvdywKICAgICAgUmF0LAogICAgICBSYXRpbywKICAgICAgUmVjZWlwdCwKICAgICAgUmVjZWlwdENlbnQsCiAgICAgIFJlY2VpcHRFdXJvLAogICAgICBSZWNlaXB0SW5kaWFuUnVwZWUsCiAgICAgIFJlY2VpcHRKYXBhbmVzZVllbiwKICAgICAgUmVjZWlwdFBvdW5kU3RlcmxpbmcsCiAgICAgIFJlY2VpcHRSdXNzaWFuUnVibGUsCiAgICAgIFJlY2VpcHRTd2lzc0ZyYW5jLAogICAgICBSZWNlaXB0VGV4dCwKICAgICAgUmVjZWlwdFR1cmtpc2hMaXJhLAogICAgICBSZWN0YW5nbGVDaXJjbGUsCiAgICAgIFJlY3RhbmdsZUVsbGlwc2lzLAogICAgICBSZWN0YW5nbGVHb2dnbGVzLAogICAgICBSZWN0YW5nbGVIb3Jpem9udGFsLAogICAgICBSZWN0YW5nbGVWZXJ0aWNhbCwKICAgICAgUmVjeWNsZSwKICAgICAgUmVkbywKICAgICAgUmVkbzIsCiAgICAgIFJlZG9Eb3QsCiAgICAgIFJlZnJlc2hDY3csCiAgICAgIFJlZnJlc2hDY3dEb3QsCiAgICAgIFJlZnJlc2hDdywKICAgICAgUmVmcmVzaEN3T2ZmLAogICAgICBSZWZyaWdlcmF0b3IsCiAgICAgIFJlZ2V4LAogICAgICBSZW1vdmVGb3JtYXR0aW5nLAogICAgICBSZXBlYXQsCiAgICAgIFJlcGVhdDEsCiAgICAgIFJlcGVhdDIsCiAgICAgIFJlcGxhY2UsCiAgICAgIFJlcGxhY2VBbGwsCiAgICAgIFJlcGx5LAogICAgICBSZXBseUFsbCwKICAgICAgUmV3aW5kLAogICAgICBSaWJib24sCiAgICAgIFJvY2tldCwKICAgICAgUm9ja2luZ0NoYWlyLAogICAgICBSb2xsZXJDb2FzdGVyLAogICAgICBSb3NlLAogICAgICBSb3RhdGUzRDogUm90YXRlM2QsCiAgICAgIFJvdGF0ZTNkLAogICAgICBSb3RhdGVDY3csCiAgICAgIFJvdGF0ZUNjd0tleSwKICAgICAgUm90YXRlQ2N3U3F1YXJlLAogICAgICBSb3RhdGVDdywKICAgICAgUm90YXRlQ3dTcXVhcmUsCiAgICAgIFJvdXRlLAogICAgICBSb3V0ZU9mZiwKICAgICAgUm91dGVyLAogICAgICBSb3dzOiBSb3dzMiwKICAgICAgUm93czIsCiAgICAgIFJvd3MzLAogICAgICBSb3dzNCwKICAgICAgUnNzLAogICAgICBSdWxlciwKICAgICAgUnVsZXJEaW1lbnNpb25MaW5lLAogICAgICBSdXNzaWFuUnVibGUsCiAgICAgIFNhaWxib2F0LAogICAgICBTYWxhZCwKICAgICAgU2FuZHdpY2gsCiAgICAgIFNhdGVsbGl0ZSwKICAgICAgU2F0ZWxsaXRlRGlzaCwKICAgICAgU2F1ZGlSaXlhbCwKICAgICAgU2F2ZSwKICAgICAgU2F2ZUFsbCwKICAgICAgU2F2ZU9mZiwKICAgICAgU2NhbGUsCiAgICAgIFNjYWxlM0Q6IFNjYWxlM2QsCiAgICAgIFNjYWxlM2QsCiAgICAgIFNjYWxpbmcsCiAgICAgIFNjYW4sCiAgICAgIFNjYW5CYXJjb2RlLAogICAgICBTY2FuRXllLAogICAgICBTY2FuRmFjZSwKICAgICAgU2NhbkhlYXJ0LAogICAgICBTY2FuTGluZSwKICAgICAgU2NhblFyQ29kZSwKICAgICAgU2NhblNlYXJjaCwKICAgICAgU2NhblRleHQsCiAgICAgIFNjYXR0ZXJDaGFydDogQ2hhcnRTY2F0dGVyLAogICAgICBTY2hvb2wsCiAgICAgIFNjaG9vbDI6IFVuaXZlcnNpdHksCiAgICAgIFNjaXNzb3JzLAogICAgICBTY2lzc29yc0xpbmVEYXNoZWQsCiAgICAgIFNjaXNzb3JzU3F1YXJlOiBTcXVhcmVTY2lzc29ycywKICAgICAgU2Npc3NvcnNTcXVhcmVEYXNoZWRCb3R0b206IFNxdWFyZUJvdHRvbURhc2hlZFNjaXNzb3JzLAogICAgICBTY29vdGVyLAogICAgICBTY3JlZW5TaGFyZSwKICAgICAgU2NyZWVuU2hhcmVPZmYsCiAgICAgIFNjcm9sbCwKICAgICAgU2Nyb2xsVGV4dCwKICAgICAgU2VhcmNoLAogICAgICBTZWFyY2hBbGVydCwKICAgICAgU2VhcmNoQ2hlY2ssCiAgICAgIFNlYXJjaENvZGUsCiAgICAgIFNlYXJjaFNsYXNoLAogICAgICBTZWFyY2hYLAogICAgICBTZWN0aW9uLAogICAgICBTZW5kLAogICAgICBTZW5kSG9yaXpvbmFsOiBTZW5kSG9yaXpvbnRhbCwKICAgICAgU2VuZEhvcml6b250YWwsCiAgICAgIFNlbmRUb0JhY2ssCiAgICAgIFNlcGFyYXRvckhvcml6b250YWwsCiAgICAgIFNlcGFyYXRvclZlcnRpY2FsLAogICAgICBTZXJ2ZXIsCiAgICAgIFNlcnZlckNvZywKICAgICAgU2VydmVyQ3Jhc2gsCiAgICAgIFNlcnZlck9mZiwKICAgICAgU2V0dGluZ3MsCiAgICAgIFNldHRpbmdzMiwKICAgICAgU2hhcGVzLAogICAgICBTaGFyZSwKICAgICAgU2hhcmUyLAogICAgICBTaGVldCwKICAgICAgU2hlbGwsCiAgICAgIFNoaWVsZCwKICAgICAgU2hpZWxkQWxlcnQsCiAgICAgIFNoaWVsZEJhbiwKICAgICAgU2hpZWxkQ2hlY2ssCiAgICAgIFNoaWVsZENsb3NlOiBTaGllbGRYLAogICAgICBTaGllbGRFbGxpcHNpcywKICAgICAgU2hpZWxkSGFsZiwKICAgICAgU2hpZWxkTWludXMsCiAgICAgIFNoaWVsZE9mZiwKICAgICAgU2hpZWxkUGx1cywKICAgICAgU2hpZWxkUXVlc3Rpb246IFNoaWVsZFF1ZXN0aW9uTWFyaywKICAgICAgU2hpZWxkUXVlc3Rpb25NYXJrLAogICAgICBTaGllbGRVc2VyLAogICAgICBTaGllbGRYLAogICAgICBTaGlwLAogICAgICBTaGlwV2hlZWwsCiAgICAgIFNoaXJ0LAogICAgICBTaG9wcGluZ0JhZywKICAgICAgU2hvcHBpbmdCYXNrZXQsCiAgICAgIFNob3BwaW5nQ2FydCwKICAgICAgU2hvdmVsLAogICAgICBTaG93ZXJIZWFkLAogICAgICBTaHJlZGRlciwKICAgICAgU2hyaW1wLAogICAgICBTaHJpbmssCiAgICAgIFNocnViLAogICAgICBTaHVmZmxlLAogICAgICBTaWRlYmFyOiBQYW5lbExlZnQsCiAgICAgIFNpZGViYXJDbG9zZTogUGFuZWxMZWZ0Q2xvc2UsCiAgICAgIFNpZGViYXJPcGVuOiBQYW5lbExlZnRPcGVuLAogICAgICBTaWdtYSwKICAgICAgU2lnbWFTcXVhcmU6IFNxdWFyZVNpZ21hLAogICAgICBTaWduYWwsCiAgICAgIFNpZ25hbEhpZ2gsCiAgICAgIFNpZ25hbExvdywKICAgICAgU2lnbmFsTWVkaXVtLAogICAgICBTaWduYWxaZXJvLAogICAgICBTaWduYXR1cmUsCiAgICAgIFNpZ25wb3N0LAogICAgICBTaWducG9zdEJpZywKICAgICAgU2lyZW4sCiAgICAgIFNraXBCYWNrLAogICAgICBTa2lwRm9yd2FyZCwKICAgICAgU2t1bGwsCiAgICAgIFNsYWNrLAogICAgICBTbGFzaCwKICAgICAgU2xhc2hTcXVhcmU6IFNxdWFyZVNsYXNoLAogICAgICBTbGljZSwKICAgICAgU2xpZGVyczogU2xpZGVyc1ZlcnRpY2FsLAogICAgICBTbGlkZXJzSG9yaXpvbnRhbCwKICAgICAgU2xpZGVyc1ZlcnRpY2FsLAogICAgICBTbWFydHBob25lLAogICAgICBTbWFydHBob25lQ2hhcmdpbmcsCiAgICAgIFNtYXJ0cGhvbmVOZmMsCiAgICAgIFNtaWxlLAogICAgICBTbWlsZVBsdXMsCiAgICAgIFNuYWlsLAogICAgICBTbm93Zmxha2UsCiAgICAgIFNvYXBEaXNwZW5zZXJEcm9wbGV0LAogICAgICBTb2ZhLAogICAgICBTb2xhclBhbmVsLAogICAgICBTb3J0QXNjOiBBcnJvd1VwTmFycm93V2lkZSwKICAgICAgU29ydERlc2M6IEFycm93RG93bldpZGVOYXJyb3csCiAgICAgIFNvdXAsCiAgICAgIFNwYWNlLAogICAgICBTcGFkZSwKICAgICAgU3BhcmtsZSwKICAgICAgU3BhcmtsZXMsCiAgICAgIFNwZWFrZXIsCiAgICAgIFNwZWVjaCwKICAgICAgU3BlbGxDaGVjaywKICAgICAgU3BlbGxDaGVjazIsCiAgICAgIFNwbGluZSwKICAgICAgU3BsaW5lUG9pbnRlciwKICAgICAgU3BsaXQsCiAgICAgIFNwbGl0U3F1YXJlSG9yaXpvbnRhbDogU3F1YXJlU3BsaXRIb3Jpem9udGFsLAogICAgICBTcGxpdFNxdWFyZVZlcnRpY2FsOiBTcXVhcmVTcGxpdFZlcnRpY2FsLAogICAgICBTcG9vbCwKICAgICAgU3BvdGxpZ2h0LAogICAgICBTcHJheUNhbiwKICAgICAgU3Byb3V0LAogICAgICBTcXVhcmUsCiAgICAgIFNxdWFyZUFjdGl2aXR5LAogICAgICBTcXVhcmVBcnJvd0Rvd24sCiAgICAgIFNxdWFyZUFycm93RG93bkxlZnQsCiAgICAgIFNxdWFyZUFycm93RG93blJpZ2h0LAogICAgICBTcXVhcmVBcnJvd0xlZnQsCiAgICAgIFNxdWFyZUFycm93T3V0RG93bkxlZnQsCiAgICAgIFNxdWFyZUFycm93T3V0RG93blJpZ2h0LAogICAgICBTcXVhcmVBcnJvd091dFVwTGVmdCwKICAgICAgU3F1YXJlQXJyb3dPdXRVcFJpZ2h0LAogICAgICBTcXVhcmVBcnJvd1JpZ2h0LAogICAgICBTcXVhcmVBcnJvd1VwLAogICAgICBTcXVhcmVBcnJvd1VwTGVmdCwKICAgICAgU3F1YXJlQXJyb3dVcFJpZ2h0LAogICAgICBTcXVhcmVBc3RlcmlzaywKICAgICAgU3F1YXJlQm90dG9tRGFzaGVkU2Npc3NvcnMsCiAgICAgIFNxdWFyZUNoYXJ0R2FudHQsCiAgICAgIFNxdWFyZUNoZWNrLAogICAgICBTcXVhcmVDaGVja0JpZywKICAgICAgU3F1YXJlQ2hldnJvbkRvd24sCiAgICAgIFNxdWFyZUNoZXZyb25MZWZ0LAogICAgICBTcXVhcmVDaGV2cm9uUmlnaHQsCiAgICAgIFNxdWFyZUNoZXZyb25VcCwKICAgICAgU3F1YXJlQ29kZSwKICAgICAgU3F1YXJlRGFzaGVkLAogICAgICBTcXVhcmVEYXNoZWRCb3R0b20sCiAgICAgIFNxdWFyZURhc2hlZEJvdHRvbUNvZGUsCiAgICAgIFNxdWFyZURhc2hlZEthbmJhbiwKICAgICAgU3F1YXJlRGFzaGVkTW91c2VQb2ludGVyLAogICAgICBTcXVhcmVEYXNoZWRUb3BTb2xpZCwKICAgICAgU3F1YXJlRGl2aWRlLAogICAgICBTcXVhcmVEb3QsCiAgICAgIFNxdWFyZUVxdWFsLAogICAgICBTcXVhcmVGdW5jdGlvbiwKICAgICAgU3F1YXJlR2FudHRDaGFydDogU3F1YXJlQ2hhcnRHYW50dCwKICAgICAgU3F1YXJlS2FuYmFuLAogICAgICBTcXVhcmVMaWJyYXJ5LAogICAgICBTcXVhcmVNLAogICAgICBTcXVhcmVNZW51LAogICAgICBTcXVhcmVNaW51cywKICAgICAgU3F1YXJlTW91c2VQb2ludGVyLAogICAgICBTcXVhcmVQYXJraW5nLAogICAgICBTcXVhcmVQYXJraW5nT2ZmLAogICAgICBTcXVhcmVQYXVzZSwKICAgICAgU3F1YXJlUGVuLAogICAgICBTcXVhcmVQZXJjZW50LAogICAgICBTcXVhcmVQaSwKICAgICAgU3F1YXJlUGlsY3JvdywKICAgICAgU3F1YXJlUGxheSwKICAgICAgU3F1YXJlUGx1cywKICAgICAgU3F1YXJlUG93ZXIsCiAgICAgIFNxdWFyZVJhZGljYWwsCiAgICAgIFNxdWFyZVJvdW5kQ29ybmVyLAogICAgICBTcXVhcmVTY2lzc29ycywKICAgICAgU3F1YXJlU2lnbWEsCiAgICAgIFNxdWFyZVNsYXNoLAogICAgICBTcXVhcmVTcGxpdEhvcml6b250YWwsCiAgICAgIFNxdWFyZVNwbGl0VmVydGljYWwsCiAgICAgIFNxdWFyZVNxdWFyZSwKICAgICAgU3F1YXJlU3RhY2ssCiAgICAgIFNxdWFyZVN0YXIsCiAgICAgIFNxdWFyZVN0b3AsCiAgICAgIFNxdWFyZVRlcm1pbmFsLAogICAgICBTcXVhcmVVc2VyLAogICAgICBTcXVhcmVVc2VyUm91bmQsCiAgICAgIFNxdWFyZVgsCiAgICAgIFNxdWFyZXNFeGNsdWRlLAogICAgICBTcXVhcmVzSW50ZXJzZWN0LAogICAgICBTcXVhcmVzU3VidHJhY3QsCiAgICAgIFNxdWFyZXNVbml0ZSwKICAgICAgU3F1aXJjbGUsCiAgICAgIFNxdWlyY2xlRGFzaGVkLAogICAgICBTcXVpcnJlbCwKICAgICAgU3RhbXAsCiAgICAgIFN0YXIsCiAgICAgIFN0YXJIYWxmLAogICAgICBTdGFyT2ZmLAogICAgICBTdGFyczogU3BhcmtsZXMsCiAgICAgIFN0ZXBCYWNrLAogICAgICBTdGVwRm9yd2FyZCwKICAgICAgU3RldGhvc2NvcGUsCiAgICAgIFN0aWNrZXIsCiAgICAgIFN0aWNreU5vdGUsCiAgICAgIFN0b25lLAogICAgICBTdG9wQ2lyY2xlOiBDaXJjbGVTdG9wLAogICAgICBTdG9yZSwKICAgICAgU3RyZXRjaEhvcml6b250YWwsCiAgICAgIFN0cmV0Y2hWZXJ0aWNhbCwKICAgICAgU3RyaWtldGhyb3VnaCwKICAgICAgU3Vic2NyaXB0LAogICAgICBTdWJ0aXRsZXM6IENhcHRpb25zLAogICAgICBTdW4sCiAgICAgIFN1bkRpbSwKICAgICAgU3VuTWVkaXVtLAogICAgICBTdW5Nb29uLAogICAgICBTdW5Tbm93LAogICAgICBTdW5yaXNlLAogICAgICBTdW5zZXQsCiAgICAgIFN1cGVyc2NyaXB0LAogICAgICBTd2F0Y2hCb29rLAogICAgICBTd2lzc0ZyYW5jLAogICAgICBTd2l0Y2hDYW1lcmEsCiAgICAgIFN3b3JkLAogICAgICBTd29yZHMsCiAgICAgIFN5cmluZ2UsCiAgICAgIFRhYmxlLAogICAgICBUYWJsZTIsCiAgICAgIFRhYmxlQ2VsbHNNZXJnZSwKICAgICAgVGFibGVDZWxsc1NwbGl0LAogICAgICBUYWJsZUNvbHVtbnNTcGxpdCwKICAgICAgVGFibGVDb25maWc6IENvbHVtbnMzQ29nLAogICAgICBUYWJsZU9mQ29udGVudHMsCiAgICAgIFRhYmxlUHJvcGVydGllcywKICAgICAgVGFibGVSb3dzU3BsaXQsCiAgICAgIFRhYmxldCwKICAgICAgVGFibGV0U21hcnRwaG9uZSwKICAgICAgVGFibGV0cywKICAgICAgVGFnOiBUYWcyLAogICAgICBUYWdzLAogICAgICBUYWxseTEsCiAgICAgIFRhbGx5MiwKICAgICAgVGFsbHkzLAogICAgICBUYWxseTQsCiAgICAgIFRhbGx5NSwKICAgICAgVGFuZ2VudCwKICAgICAgVGFyZ2V0LAogICAgICBUZWxlc2NvcGUsCiAgICAgIFRlbnQsCiAgICAgIFRlbnRUcmVlLAogICAgICBUZXJtaW5hbCwKICAgICAgVGVybWluYWxTcXVhcmU6IFNxdWFyZVRlcm1pbmFsLAogICAgICBUZXN0VHViZSwKICAgICAgVGVzdFR1YmUyOiBUZXN0VHViZURpYWdvbmFsLAogICAgICBUZXN0VHViZURpYWdvbmFsLAogICAgICBUZXN0VHViZXMsCiAgICAgIFRleHQ6IFRleHRBbGlnblN0YXJ0LAogICAgICBUZXh0QWxpZ25DZW50ZXIsCiAgICAgIFRleHRBbGlnbkVuZCwKICAgICAgVGV4dEFsaWduSnVzdGlmeSwKICAgICAgVGV4dEFsaWduU3RhcnQsCiAgICAgIFRleHRDdXJzb3IsCiAgICAgIFRleHRDdXJzb3JJbnB1dCwKICAgICAgVGV4dEluaXRpYWwsCiAgICAgIFRleHRRdW90ZSwKICAgICAgVGV4dFNlYXJjaCwKICAgICAgVGV4dFNlbGVjdCwKICAgICAgVGV4dFNlbGVjdGlvbjogVGV4dFNlbGVjdCwKICAgICAgVGV4dFdyYXAsCiAgICAgIFRoZWF0ZXIsCiAgICAgIFRoZXJtb21ldGVyLAogICAgICBUaGVybW9tZXRlclNub3dmbGFrZSwKICAgICAgVGhlcm1vbWV0ZXJTdW4sCiAgICAgIFRodW1ic0Rvd24sCiAgICAgIFRodW1ic1VwLAogICAgICBUaWNrZXQsCiAgICAgIFRpY2tldENoZWNrLAogICAgICBUaWNrZXRNaW51cywKICAgICAgVGlja2V0UGVyY2VudCwKICAgICAgVGlja2V0UGx1cywKICAgICAgVGlja2V0U2xhc2gsCiAgICAgIFRpY2tldFgsCiAgICAgIFRpY2tldHMsCiAgICAgIFRpY2tldHNQbGFuZSwKICAgICAgVGltZXI6IFRpbWVyMiwKICAgICAgVGltZXJPZmYsCiAgICAgIFRpbWVyUmVzZXQsCiAgICAgIFRvZ2dsZUxlZnQsCiAgICAgIFRvZ2dsZVJpZ2h0LAogICAgICBUb2lsZXQsCiAgICAgIFRvb2xDYXNlLAogICAgICBUb29sYm94LAogICAgICBUb3JuYWRvLAogICAgICBUb3J1cywKICAgICAgVG91Y2hwYWQsCiAgICAgIFRvdWNocGFkT2ZmLAogICAgICBUb3dlckNvbnRyb2wsCiAgICAgIFRveUJyaWNrLAogICAgICBUcmFjdG9yLAogICAgICBUcmFmZmljQ29uZSwKICAgICAgVHJhaW46IFRyYW1Gcm9udCwKICAgICAgVHJhaW5Gcm9udCwKICAgICAgVHJhaW5Gcm9udFR1bm5lbCwKICAgICAgVHJhaW5UcmFjaywKICAgICAgVHJhbUZyb250LAogICAgICBUcmFuc2dlbmRlciwKICAgICAgVHJhc2gsCiAgICAgIFRyYXNoMiwKICAgICAgVHJlZURlY2lkdW91cywKICAgICAgVHJlZVBhbG0sCiAgICAgIFRyZWVQaW5lLAogICAgICBUcmVlcywKICAgICAgVHJlbGxvLAogICAgICBUcmVuZGluZ0Rvd24sCiAgICAgIFRyZW5kaW5nVXAsCiAgICAgIFRyZW5kaW5nVXBEb3duLAogICAgICBUcmlhbmdsZSwKICAgICAgVHJpYW5nbGVBbGVydCwKICAgICAgVHJpYW5nbGVEYXNoZWQsCiAgICAgIFRyaWFuZ2xlUmlnaHQsCiAgICAgIFRyb3BoeSwKICAgICAgVHJ1Y2ssCiAgICAgIFRydWNrRWxlY3RyaWMsCiAgICAgIFR1cmtpc2hMaXJhLAogICAgICBUdXJudGFibGUsCiAgICAgIFR1cnRsZSwKICAgICAgVHYsCiAgICAgIFR2MjogVHZNaW5pbWFsLAogICAgICBUdk1pbmltYWwsCiAgICAgIFR2TWluaW1hbFBsYXksCiAgICAgIFR3aXRjaCwKICAgICAgVHdpdHRlciwKICAgICAgVHlwZSwKICAgICAgVHlwZU91dGxpbmUsCiAgICAgIFVtYnJlbGxhLAogICAgICBVbWJyZWxsYU9mZiwKICAgICAgVW5kZXJsaW5lLAogICAgICBVbmRvLAogICAgICBVbmRvMiwKICAgICAgVW5kb0RvdCwKICAgICAgVW5mb2xkSG9yaXpvbnRhbCwKICAgICAgVW5mb2xkVmVydGljYWwsCiAgICAgIFVuZ3JvdXAsCiAgICAgIFVuaXZlcnNpdHksCiAgICAgIFVubGluaywKICAgICAgVW5saW5rMiwKICAgICAgVW5sb2NrOiBMb2NrT3BlbiwKICAgICAgVW5sb2NrS2V5aG9sZTogTG9ja0tleWhvbGVPcGVuLAogICAgICBVbnBsdWcsCiAgICAgIFVwbG9hZCwKICAgICAgVXBsb2FkQ2xvdWQ6IENsb3VkVXBsb2FkLAogICAgICBVc2IsCiAgICAgIFVzZXIsCiAgICAgIFVzZXIyOiBVc2VyUm91bmQsCiAgICAgIFVzZXJDaGVjaywKICAgICAgVXNlckNoZWNrMjogVXNlclJvdW5kQ2hlY2ssCiAgICAgIFVzZXJDaXJjbGU6IENpcmNsZVVzZXIsCiAgICAgIFVzZXJDaXJjbGUyOiBDaXJjbGVVc2VyUm91bmQsCiAgICAgIFVzZXJDb2csCiAgICAgIFVzZXJDb2cyOiBVc2VyUm91bmRDb2csCiAgICAgIFVzZXJMb2NrLAogICAgICBVc2VyTWludXMsCiAgICAgIFVzZXJNaW51czI6IFVzZXJSb3VuZE1pbnVzLAogICAgICBVc2VyUGVuLAogICAgICBVc2VyUGx1cywKICAgICAgVXNlclBsdXMyOiBVc2VyUm91bmRQbHVzLAogICAgICBVc2VyUm91bmQsCiAgICAgIFVzZXJSb3VuZENoZWNrLAogICAgICBVc2VyUm91bmRDb2csCiAgICAgIFVzZXJSb3VuZE1pbnVzLAogICAgICBVc2VyUm91bmRQZW4sCiAgICAgIFVzZXJSb3VuZFBsdXMsCiAgICAgIFVzZXJSb3VuZFNlYXJjaCwKICAgICAgVXNlclJvdW5kWCwKICAgICAgVXNlclNlYXJjaCwKICAgICAgVXNlclNxdWFyZTogU3F1YXJlVXNlciwKICAgICAgVXNlclNxdWFyZTI6IFNxdWFyZVVzZXJSb3VuZCwKICAgICAgVXNlclN0YXIsCiAgICAgIFVzZXJYLAogICAgICBVc2VyWDI6IFVzZXJSb3VuZFgsCiAgICAgIFVzZXJzLAogICAgICBVc2VyczI6IFVzZXJzUm91bmQsCiAgICAgIFVzZXJzUm91bmQsCiAgICAgIFV0ZW5zaWxzLAogICAgICBVdGVuc2lsc0Nyb3NzZWQsCiAgICAgIFV0aWxpdHlQb2xlLAogICAgICBWYW4sCiAgICAgIFZhcmlhYmxlLAogICAgICBWYXVsdCwKICAgICAgVmVjdG9yU3F1YXJlLAogICAgICBWZWdhbiwKICAgICAgVmVuZXRpYW5NYXNrLAogICAgICBWZW51cywKICAgICAgVmVudXNBbmRNYXJzLAogICAgICBWZXJpZmllZDogQmFkZ2VDaGVjaywKICAgICAgVmlicmF0ZSwKICAgICAgVmlicmF0ZU9mZiwKICAgICAgVmlkZW8sCiAgICAgIFZpZGVvT2ZmLAogICAgICBWaWRlb3RhcGUsCiAgICAgIFZpZXcsCiAgICAgIFZvaWNlbWFpbCwKICAgICAgVm9sbGV5YmFsbCwKICAgICAgVm9sdW1lLAogICAgICBWb2x1bWUxLAogICAgICBWb2x1bWUyLAogICAgICBWb2x1bWVPZmYsCiAgICAgIFZvbHVtZVgsCiAgICAgIFZvdGUsCiAgICAgIFdhbGxldCwKICAgICAgV2FsbGV0MjogV2FsbGV0TWluaW1hbCwKICAgICAgV2FsbGV0Q2FyZHMsCiAgICAgIFdhbGxldE1pbmltYWwsCiAgICAgIFdhbGxwYXBlciwKICAgICAgV2FuZCwKICAgICAgV2FuZDI6IFdhbmRTcGFya2xlcywKICAgICAgV2FuZFNwYXJrbGVzLAogICAgICBXYXJlaG91c2UsCiAgICAgIFdhc2hpbmdNYWNoaW5lLAogICAgICBXYXRjaCwKICAgICAgV2F2ZXMsCiAgICAgIFdhdmVzQXJyb3dEb3duLAogICAgICBXYXZlc0Fycm93VXAsCiAgICAgIFdhdmVzTGFkZGVyLAogICAgICBXYXlwb2ludHMsCiAgICAgIFdlYmNhbSwKICAgICAgV2ViaG9vaywKICAgICAgV2ViaG9va09mZiwKICAgICAgV2VpZ2h0LAogICAgICBXZWlnaHRUaWxkZSwKICAgICAgV2hlYXQsCiAgICAgIFdoZWF0T2ZmLAogICAgICBXaG9sZVdvcmQsCiAgICAgIFdpZmksCiAgICAgIFdpZmlDb2csCiAgICAgIFdpZmlIaWdoLAogICAgICBXaWZpTG93LAogICAgICBXaWZpT2ZmLAogICAgICBXaWZpUGVuLAogICAgICBXaWZpU3luYywKICAgICAgV2lmaVplcm8sCiAgICAgIFdpbmQsCiAgICAgIFdpbmRBcnJvd0Rvd24sCiAgICAgIFdpbmUsCiAgICAgIFdpbmVPZmYsCiAgICAgIFdvcmtmbG93LAogICAgICBXb3JtLAogICAgICBXcmFwVGV4dDogVGV4dFdyYXAsCiAgICAgIFdyZW5jaCwKICAgICAgWCwKICAgICAgWENpcmNsZTogQ2lyY2xlWCwKICAgICAgWE9jdGFnb246IE9jdGFnb25YLAogICAgICBYU3F1YXJlOiBTcXVhcmVYLAogICAgICBZb3V0dWJlLAogICAgICBaYXAsCiAgICAgIFphcE9mZiwKICAgICAgWm9vbUluLAogICAgICBab29tT3V0CiAgICB9KTsKICAgIHZhciBjcmVhdGVJY29ucyA9ICh7CiAgICAgIGljb25zOiBpY29uczYgPSB7fSwKICAgICAgbmFtZUF0dHIgPSAiZGF0YS1sdWNpZGUiLAogICAgICBhdHRycyA9IHt9LAogICAgICByb290OiByb290NiA9IGRvY3VtZW50LAogICAgICBpblRlbXBsYXRlcwogICAgfSA9IHt9KSA9PiB7CiAgICAgIGlmICghT2JqZWN0LnZhbHVlcyhpY29uczYpLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICJQbGVhc2UgcHJvdmlkZSBhbiBpY29ucyBvYmplY3QuXG5JZiB5b3Ugd2FudCB0byB1c2UgYWxsIHRoZSBpY29ucyB5b3UgY2FuIGltcG9ydCBpdCBsaWtlOlxuIGBpbXBvcnQgeyBjcmVhdGVJY29ucywgaWNvbnMgfSBmcm9tICdsdWNpZGUnO1xubHVjaWRlLmNyZWF0ZUljb25zKHtpY29uc30pO2AiCiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAodHlwZW9mIHJvb3Q2ID09PSAidW5kZWZpbmVkIikgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiYGNyZWF0ZUljb25zKClgIG9ubHkgd29ya3MgaW4gYSBicm93c2VyIGVudmlyb25tZW50LiIpOwogICAgICB9CiAgICAgIGNvbnN0IGVsZW1lbnRzVG9SZXBsYWNlID0gQXJyYXkuZnJvbShyb290Ni5xdWVyeVNlbGVjdG9yQWxsKGBbJHtuYW1lQXR0cn1dYCkpOwogICAgICBlbGVtZW50c1RvUmVwbGFjZS5mb3JFYWNoKChlbGVtZW50NCkgPT4gcmVwbGFjZUVsZW1lbnQoZWxlbWVudDQsIHsgbmFtZUF0dHIsIGljb25zOiBpY29uczYsIGF0dHJzIH0pKTsKICAgICAgaWYgKGluVGVtcGxhdGVzKSB7CiAgICAgICAgY29uc3QgdGVtcGxhdGVzID0gQXJyYXkuZnJvbShyb290Ni5xdWVyeVNlbGVjdG9yQWxsKCJ0ZW1wbGF0ZSIpKTsKICAgICAgICB0ZW1wbGF0ZXMuZm9yRWFjaCgKICAgICAgICAgICh0ZW1wbGF0ZSkgPT4gY3JlYXRlSWNvbnMoewogICAgICAgICAgICBpY29uczogaWNvbnM2LAogICAgICAgICAgICBuYW1lQXR0ciwKICAgICAgICAgICAgYXR0cnMsCiAgICAgICAgICAgIHJvb3Q6IHRlbXBsYXRlLmNvbnRlbnQsCiAgICAgICAgICAgIGluVGVtcGxhdGVzCiAgICAgICAgICB9KQogICAgICAgICk7CiAgICAgIH0KICAgICAgaWYgKG5hbWVBdHRyID09PSAiZGF0YS1sdWNpZGUiKSB7CiAgICAgICAgY29uc3QgZGVwcmVjYXRlZEVsZW1lbnRzID0gcm9vdDYucXVlcnlTZWxlY3RvckFsbCgiW2ljb24tbmFtZV0iKTsKICAgICAgICBpZiAoZGVwcmVjYXRlZEVsZW1lbnRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGNvbnNvbGUud2FybigKICAgICAgICAgICAgIltMdWNpZGVdIFNvbWUgaWNvbnMgd2VyZSBmb3VuZCB3aXRoIHRoZSBub3cgZGVwcmVjYXRlZCBpY29uLW5hbWUgYXR0cmlidXRlLiBUaGVzZSB3aWxsIHN0aWxsIGJlIHJlcGxhY2VkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCBpbiB2MS4wIGFuZCB5b3Ugc2hvdWxkIHN3aXRjaCB0byBkYXRhLWx1Y2lkZSIKICAgICAgICAgICk7CiAgICAgICAgICBBcnJheS5mcm9tKGRlcHJlY2F0ZWRFbGVtZW50cykuZm9yRWFjaCgKICAgICAgICAgICAgKGVsZW1lbnQ0KSA9PiByZXBsYWNlRWxlbWVudChlbGVtZW50NCwgeyBuYW1lQXR0cjogImljb24tbmFtZSIsIGljb25zOiBpY29uczYsIGF0dHJzIH0pCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMuQUFycm93RG93biA9IEFBcnJvd0Rvd247CiAgICBleHBvcnRzLkFBcnJvd1VwID0gQUFycm93VXA7CiAgICBleHBvcnRzLkFMYXJnZVNtYWxsID0gQUxhcmdlU21hbGw7CiAgICBleHBvcnRzLkFjY2Vzc2liaWxpdHkgPSBBY2Nlc3NpYmlsaXR5OwogICAgZXhwb3J0cy5BY3Rpdml0eSA9IEFjdGl2aXR5OwogICAgZXhwb3J0cy5BY3Rpdml0eVNxdWFyZSA9IFNxdWFyZUFjdGl2aXR5OwogICAgZXhwb3J0cy5BaXJWZW50ID0gQWlyVmVudDsKICAgIGV4cG9ydHMuQWlycGxheSA9IEFpcnBsYXk7CiAgICBleHBvcnRzLkFsYXJtQ2hlY2sgPSBBbGFybUNsb2NrQ2hlY2s7CiAgICBleHBvcnRzLkFsYXJtQ2xvY2sgPSBBbGFybUNsb2NrOwogICAgZXhwb3J0cy5BbGFybUNsb2NrQ2hlY2sgPSBBbGFybUNsb2NrQ2hlY2s7CiAgICBleHBvcnRzLkFsYXJtQ2xvY2tNaW51cyA9IEFsYXJtQ2xvY2tNaW51czsKICAgIGV4cG9ydHMuQWxhcm1DbG9ja09mZiA9IEFsYXJtQ2xvY2tPZmY7CiAgICBleHBvcnRzLkFsYXJtQ2xvY2tQbHVzID0gQWxhcm1DbG9ja1BsdXM7CiAgICBleHBvcnRzLkFsYXJtTWludXMgPSBBbGFybUNsb2NrTWludXM7CiAgICBleHBvcnRzLkFsYXJtUGx1cyA9IEFsYXJtQ2xvY2tQbHVzOwogICAgZXhwb3J0cy5BbGFybVNtb2tlID0gQWxhcm1TbW9rZTsKICAgIGV4cG9ydHMuQWxidW0gPSBBbGJ1bTsKICAgIGV4cG9ydHMuQWxlcnRDaXJjbGUgPSBDaXJjbGVBbGVydDsKICAgIGV4cG9ydHMuQWxlcnRPY3RhZ29uID0gT2N0YWdvbkFsZXJ0OwogICAgZXhwb3J0cy5BbGVydFRyaWFuZ2xlID0gVHJpYW5nbGVBbGVydDsKICAgIGV4cG9ydHMuQWxpZ25DZW50ZXIgPSBUZXh0QWxpZ25DZW50ZXI7CiAgICBleHBvcnRzLkFsaWduQ2VudGVySG9yaXpvbnRhbCA9IEFsaWduQ2VudGVySG9yaXpvbnRhbDsKICAgIGV4cG9ydHMuQWxpZ25DZW50ZXJWZXJ0aWNhbCA9IEFsaWduQ2VudGVyVmVydGljYWw7CiAgICBleHBvcnRzLkFsaWduRW5kSG9yaXpvbnRhbCA9IEFsaWduRW5kSG9yaXpvbnRhbDsKICAgIGV4cG9ydHMuQWxpZ25FbmRWZXJ0aWNhbCA9IEFsaWduRW5kVmVydGljYWw7CiAgICBleHBvcnRzLkFsaWduSG9yaXpvbnRhbERpc3RyaWJ1dGVDZW50ZXIgPSBBbGlnbkhvcml6b250YWxEaXN0cmlidXRlQ2VudGVyOwogICAgZXhwb3J0cy5BbGlnbkhvcml6b250YWxEaXN0cmlidXRlRW5kID0gQWxpZ25Ib3Jpem9udGFsRGlzdHJpYnV0ZUVuZDsKICAgIGV4cG9ydHMuQWxpZ25Ib3Jpem9udGFsRGlzdHJpYnV0ZVN0YXJ0ID0gQWxpZ25Ib3Jpem9udGFsRGlzdHJpYnV0ZVN0YXJ0OwogICAgZXhwb3J0cy5BbGlnbkhvcml6b250YWxKdXN0aWZ5Q2VudGVyID0gQWxpZ25Ib3Jpem9udGFsSnVzdGlmeUNlbnRlcjsKICAgIGV4cG9ydHMuQWxpZ25Ib3Jpem9udGFsSnVzdGlmeUVuZCA9IEFsaWduSG9yaXpvbnRhbEp1c3RpZnlFbmQ7CiAgICBleHBvcnRzLkFsaWduSG9yaXpvbnRhbEp1c3RpZnlTdGFydCA9IEFsaWduSG9yaXpvbnRhbEp1c3RpZnlTdGFydDsKICAgIGV4cG9ydHMuQWxpZ25Ib3Jpem9udGFsU3BhY2VBcm91bmQgPSBBbGlnbkhvcml6b250YWxTcGFjZUFyb3VuZDsKICAgIGV4cG9ydHMuQWxpZ25Ib3Jpem9udGFsU3BhY2VCZXR3ZWVuID0gQWxpZ25Ib3Jpem9udGFsU3BhY2VCZXR3ZWVuOwogICAgZXhwb3J0cy5BbGlnbkp1c3RpZnkgPSBUZXh0QWxpZ25KdXN0aWZ5OwogICAgZXhwb3J0cy5BbGlnbkxlZnQgPSBUZXh0QWxpZ25TdGFydDsKICAgIGV4cG9ydHMuQWxpZ25SaWdodCA9IFRleHRBbGlnbkVuZDsKICAgIGV4cG9ydHMuQWxpZ25TdGFydEhvcml6b250YWwgPSBBbGlnblN0YXJ0SG9yaXpvbnRhbDsKICAgIGV4cG9ydHMuQWxpZ25TdGFydFZlcnRpY2FsID0gQWxpZ25TdGFydFZlcnRpY2FsOwogICAgZXhwb3J0cy5BbGlnblZlcnRpY2FsRGlzdHJpYnV0ZUNlbnRlciA9IEFsaWduVmVydGljYWxEaXN0cmlidXRlQ2VudGVyOwogICAgZXhwb3J0cy5BbGlnblZlcnRpY2FsRGlzdHJpYnV0ZUVuZCA9IEFsaWduVmVydGljYWxEaXN0cmlidXRlRW5kOwogICAgZXhwb3J0cy5BbGlnblZlcnRpY2FsRGlzdHJpYnV0ZVN0YXJ0ID0gQWxpZ25WZXJ0aWNhbERpc3RyaWJ1dGVTdGFydDsKICAgIGV4cG9ydHMuQWxpZ25WZXJ0aWNhbEp1c3RpZnlDZW50ZXIgPSBBbGlnblZlcnRpY2FsSnVzdGlmeUNlbnRlcjsKICAgIGV4cG9ydHMuQWxpZ25WZXJ0aWNhbEp1c3RpZnlFbmQgPSBBbGlnblZlcnRpY2FsSnVzdGlmeUVuZDsKICAgIGV4cG9ydHMuQWxpZ25WZXJ0aWNhbEp1c3RpZnlTdGFydCA9IEFsaWduVmVydGljYWxKdXN0aWZ5U3RhcnQ7CiAgICBleHBvcnRzLkFsaWduVmVydGljYWxTcGFjZUFyb3VuZCA9IEFsaWduVmVydGljYWxTcGFjZUFyb3VuZDsKICAgIGV4cG9ydHMuQWxpZ25WZXJ0aWNhbFNwYWNlQmV0d2VlbiA9IEFsaWduVmVydGljYWxTcGFjZUJldHdlZW47CiAgICBleHBvcnRzLkFtYnVsYW5jZSA9IEFtYnVsYW5jZTsKICAgIGV4cG9ydHMuQW1wZXJzYW5kID0gQW1wZXJzYW5kOwogICAgZXhwb3J0cy5BbXBlcnNhbmRzID0gQW1wZXJzYW5kczsKICAgIGV4cG9ydHMuQW1waG9yYSA9IEFtcGhvcmE7CiAgICBleHBvcnRzLkFuY2hvciA9IEFuY2hvcjsKICAgIGV4cG9ydHMuQW5ncnkgPSBBbmdyeTsKICAgIGV4cG9ydHMuQW5ub3llZCA9IEFubm95ZWQ7CiAgICBleHBvcnRzLkFudGVubmEgPSBBbnRlbm5hOwogICAgZXhwb3J0cy5BbnZpbCA9IEFudmlsOwogICAgZXhwb3J0cy5BcGVydHVyZSA9IEFwZXJ0dXJlOwogICAgZXhwb3J0cy5BcHBXaW5kb3cgPSBBcHBXaW5kb3c7CiAgICBleHBvcnRzLkFwcFdpbmRvd01hYyA9IEFwcFdpbmRvd01hYzsKICAgIGV4cG9ydHMuQXBwbGUgPSBBcHBsZTsKICAgIGV4cG9ydHMuQXJjaGl2ZSA9IEFyY2hpdmU7CiAgICBleHBvcnRzLkFyY2hpdmVSZXN0b3JlID0gQXJjaGl2ZVJlc3RvcmU7CiAgICBleHBvcnRzLkFyY2hpdmVYID0gQXJjaGl2ZVg7CiAgICBleHBvcnRzLkFyZWFDaGFydCA9IENoYXJ0QXJlYTsKICAgIGV4cG9ydHMuQXJtY2hhaXIgPSBBcm1jaGFpcjsKICAgIGV4cG9ydHMuQXJyb3dCaWdEb3duID0gQXJyb3dCaWdEb3duOwogICAgZXhwb3J0cy5BcnJvd0JpZ0Rvd25EYXNoID0gQXJyb3dCaWdEb3duRGFzaDsKICAgIGV4cG9ydHMuQXJyb3dCaWdMZWZ0ID0gQXJyb3dCaWdMZWZ0OwogICAgZXhwb3J0cy5BcnJvd0JpZ0xlZnREYXNoID0gQXJyb3dCaWdMZWZ0RGFzaDsKICAgIGV4cG9ydHMuQXJyb3dCaWdSaWdodCA9IEFycm93QmlnUmlnaHQ7CiAgICBleHBvcnRzLkFycm93QmlnUmlnaHREYXNoID0gQXJyb3dCaWdSaWdodERhc2g7CiAgICBleHBvcnRzLkFycm93QmlnVXAgPSBBcnJvd0JpZ1VwOwogICAgZXhwb3J0cy5BcnJvd0JpZ1VwRGFzaCA9IEFycm93QmlnVXBEYXNoOwogICAgZXhwb3J0cy5BcnJvd0Rvd24gPSBBcnJvd0Rvd247CiAgICBleHBvcnRzLkFycm93RG93bjAxID0gQXJyb3dEb3duMDE7CiAgICBleHBvcnRzLkFycm93RG93bjEwID0gQXJyb3dEb3duMTA7CiAgICBleHBvcnRzLkFycm93RG93bkFaID0gQXJyb3dEb3duQVo7CiAgICBleHBvcnRzLkFycm93RG93bkF6ID0gQXJyb3dEb3duQVo7CiAgICBleHBvcnRzLkFycm93RG93bkNpcmNsZSA9IENpcmNsZUFycm93RG93bjsKICAgIGV4cG9ydHMuQXJyb3dEb3duRnJvbUxpbmUgPSBBcnJvd0Rvd25Gcm9tTGluZTsKICAgIGV4cG9ydHMuQXJyb3dEb3duTGVmdCA9IEFycm93RG93bkxlZnQ7CiAgICBleHBvcnRzLkFycm93RG93bkxlZnRGcm9tQ2lyY2xlID0gQ2lyY2xlQXJyb3dPdXREb3duTGVmdDsKICAgIGV4cG9ydHMuQXJyb3dEb3duTGVmdEZyb21TcXVhcmUgPSBTcXVhcmVBcnJvd091dERvd25MZWZ0OwogICAgZXhwb3J0cy5BcnJvd0Rvd25MZWZ0U3F1YXJlID0gU3F1YXJlQXJyb3dEb3duTGVmdDsKICAgIGV4cG9ydHMuQXJyb3dEb3duTmFycm93V2lkZSA9IEFycm93RG93bk5hcnJvd1dpZGU7CiAgICBleHBvcnRzLkFycm93RG93blJpZ2h0ID0gQXJyb3dEb3duUmlnaHQ7CiAgICBleHBvcnRzLkFycm93RG93blJpZ2h0RnJvbUNpcmNsZSA9IENpcmNsZUFycm93T3V0RG93blJpZ2h0OwogICAgZXhwb3J0cy5BcnJvd0Rvd25SaWdodEZyb21TcXVhcmUgPSBTcXVhcmVBcnJvd091dERvd25SaWdodDsKICAgIGV4cG9ydHMuQXJyb3dEb3duUmlnaHRTcXVhcmUgPSBTcXVhcmVBcnJvd0Rvd25SaWdodDsKICAgIGV4cG9ydHMuQXJyb3dEb3duU3F1YXJlID0gU3F1YXJlQXJyb3dEb3duOwogICAgZXhwb3J0cy5BcnJvd0Rvd25Ub0RvdCA9IEFycm93RG93blRvRG90OwogICAgZXhwb3J0cy5BcnJvd0Rvd25Ub0xpbmUgPSBBcnJvd0Rvd25Ub0xpbmU7CiAgICBleHBvcnRzLkFycm93RG93blVwID0gQXJyb3dEb3duVXA7CiAgICBleHBvcnRzLkFycm93RG93bldpZGVOYXJyb3cgPSBBcnJvd0Rvd25XaWRlTmFycm93OwogICAgZXhwb3J0cy5BcnJvd0Rvd25aQSA9IEFycm93RG93blpBOwogICAgZXhwb3J0cy5BcnJvd0Rvd25aYSA9IEFycm93RG93blpBOwogICAgZXhwb3J0cy5BcnJvd0xlZnQgPSBBcnJvd0xlZnQ7CiAgICBleHBvcnRzLkFycm93TGVmdENpcmNsZSA9IENpcmNsZUFycm93TGVmdDsKICAgIGV4cG9ydHMuQXJyb3dMZWZ0RnJvbUxpbmUgPSBBcnJvd0xlZnRGcm9tTGluZTsKICAgIGV4cG9ydHMuQXJyb3dMZWZ0UmlnaHQgPSBBcnJvd0xlZnRSaWdodDsKICAgIGV4cG9ydHMuQXJyb3dMZWZ0U3F1YXJlID0gU3F1YXJlQXJyb3dMZWZ0OwogICAgZXhwb3J0cy5BcnJvd0xlZnRUb0xpbmUgPSBBcnJvd0xlZnRUb0xpbmU7CiAgICBleHBvcnRzLkFycm93UmlnaHQgPSBBcnJvd1JpZ2h0OwogICAgZXhwb3J0cy5BcnJvd1JpZ2h0Q2lyY2xlID0gQ2lyY2xlQXJyb3dSaWdodDsKICAgIGV4cG9ydHMuQXJyb3dSaWdodEZyb21MaW5lID0gQXJyb3dSaWdodEZyb21MaW5lOwogICAgZXhwb3J0cy5BcnJvd1JpZ2h0TGVmdCA9IEFycm93UmlnaHRMZWZ0OwogICAgZXhwb3J0cy5BcnJvd1JpZ2h0U3F1YXJlID0gU3F1YXJlQXJyb3dSaWdodDsKICAgIGV4cG9ydHMuQXJyb3dSaWdodFRvTGluZSA9IEFycm93UmlnaHRUb0xpbmU7CiAgICBleHBvcnRzLkFycm93VXAgPSBBcnJvd1VwOwogICAgZXhwb3J0cy5BcnJvd1VwMDEgPSBBcnJvd1VwMDE7CiAgICBleHBvcnRzLkFycm93VXAxMCA9IEFycm93VXAxMDsKICAgIGV4cG9ydHMuQXJyb3dVcEFaID0gQXJyb3dVcEFaOwogICAgZXhwb3J0cy5BcnJvd1VwQXogPSBBcnJvd1VwQVo7CiAgICBleHBvcnRzLkFycm93VXBDaXJjbGUgPSBDaXJjbGVBcnJvd1VwOwogICAgZXhwb3J0cy5BcnJvd1VwRG93biA9IEFycm93VXBEb3duOwogICAgZXhwb3J0cy5BcnJvd1VwRnJvbURvdCA9IEFycm93VXBGcm9tRG90OwogICAgZXhwb3J0cy5BcnJvd1VwRnJvbUxpbmUgPSBBcnJvd1VwRnJvbUxpbmU7CiAgICBleHBvcnRzLkFycm93VXBMZWZ0ID0gQXJyb3dVcExlZnQ7CiAgICBleHBvcnRzLkFycm93VXBMZWZ0RnJvbUNpcmNsZSA9IENpcmNsZUFycm93T3V0VXBMZWZ0OwogICAgZXhwb3J0cy5BcnJvd1VwTGVmdEZyb21TcXVhcmUgPSBTcXVhcmVBcnJvd091dFVwTGVmdDsKICAgIGV4cG9ydHMuQXJyb3dVcExlZnRTcXVhcmUgPSBTcXVhcmVBcnJvd1VwTGVmdDsKICAgIGV4cG9ydHMuQXJyb3dVcE5hcnJvd1dpZGUgPSBBcnJvd1VwTmFycm93V2lkZTsKICAgIGV4cG9ydHMuQXJyb3dVcFJpZ2h0ID0gQXJyb3dVcFJpZ2h0OwogICAgZXhwb3J0cy5BcnJvd1VwUmlnaHRGcm9tQ2lyY2xlID0gQ2lyY2xlQXJyb3dPdXRVcFJpZ2h0OwogICAgZXhwb3J0cy5BcnJvd1VwUmlnaHRGcm9tU3F1YXJlID0gU3F1YXJlQXJyb3dPdXRVcFJpZ2h0OwogICAgZXhwb3J0cy5BcnJvd1VwUmlnaHRTcXVhcmUgPSBTcXVhcmVBcnJvd1VwUmlnaHQ7CiAgICBleHBvcnRzLkFycm93VXBTcXVhcmUgPSBTcXVhcmVBcnJvd1VwOwogICAgZXhwb3J0cy5BcnJvd1VwVG9MaW5lID0gQXJyb3dVcFRvTGluZTsKICAgIGV4cG9ydHMuQXJyb3dVcFdpZGVOYXJyb3cgPSBBcnJvd1VwV2lkZU5hcnJvdzsKICAgIGV4cG9ydHMuQXJyb3dVcFpBID0gQXJyb3dVcFpBOwogICAgZXhwb3J0cy5BcnJvd1VwWmEgPSBBcnJvd1VwWkE7CiAgICBleHBvcnRzLkFycm93c1VwRnJvbUxpbmUgPSBBcnJvd3NVcEZyb21MaW5lOwogICAgZXhwb3J0cy5Bc3RlcmlzayA9IEFzdGVyaXNrOwogICAgZXhwb3J0cy5Bc3Rlcmlza1NxdWFyZSA9IFNxdWFyZUFzdGVyaXNrOwogICAgZXhwb3J0cy5BdFNpZ24gPSBBdFNpZ247CiAgICBleHBvcnRzLkF0b20gPSBBdG9tOwogICAgZXhwb3J0cy5BdWRpb0xpbmVzID0gQXVkaW9MaW5lczsKICAgIGV4cG9ydHMuQXVkaW9XYXZlZm9ybSA9IEF1ZGlvV2F2ZWZvcm07CiAgICBleHBvcnRzLkF3YXJkID0gQXdhcmQ7CiAgICBleHBvcnRzLkF4ZSA9IEF4ZTsKICAgIGV4cG9ydHMuQXhpczNEID0gQXhpczNkOwogICAgZXhwb3J0cy5BeGlzM2QgPSBBeGlzM2Q7CiAgICBleHBvcnRzLkJhYnkgPSBCYWJ5OwogICAgZXhwb3J0cy5CYWNrcGFjayA9IEJhY2twYWNrOwogICAgZXhwb3J0cy5CYWRnZSA9IEJhZGdlOwogICAgZXhwb3J0cy5CYWRnZUFsZXJ0ID0gQmFkZ2VBbGVydDsKICAgIGV4cG9ydHMuQmFkZ2VDZW50ID0gQmFkZ2VDZW50OwogICAgZXhwb3J0cy5CYWRnZUNoZWNrID0gQmFkZ2VDaGVjazsKICAgIGV4cG9ydHMuQmFkZ2VEb2xsYXJTaWduID0gQmFkZ2VEb2xsYXJTaWduOwogICAgZXhwb3J0cy5CYWRnZUV1cm8gPSBCYWRnZUV1cm87CiAgICBleHBvcnRzLkJhZGdlSGVscCA9IEJhZGdlUXVlc3Rpb25NYXJrOwogICAgZXhwb3J0cy5CYWRnZUluZGlhblJ1cGVlID0gQmFkZ2VJbmRpYW5SdXBlZTsKICAgIGV4cG9ydHMuQmFkZ2VJbmZvID0gQmFkZ2VJbmZvOwogICAgZXhwb3J0cy5CYWRnZUphcGFuZXNlWWVuID0gQmFkZ2VKYXBhbmVzZVllbjsKICAgIGV4cG9ydHMuQmFkZ2VNaW51cyA9IEJhZGdlTWludXM7CiAgICBleHBvcnRzLkJhZGdlUGVyY2VudCA9IEJhZGdlUGVyY2VudDsKICAgIGV4cG9ydHMuQmFkZ2VQbHVzID0gQmFkZ2VQbHVzOwogICAgZXhwb3J0cy5CYWRnZVBvdW5kU3RlcmxpbmcgPSBCYWRnZVBvdW5kU3Rlcmxpbmc7CiAgICBleHBvcnRzLkJhZGdlUXVlc3Rpb25NYXJrID0gQmFkZ2VRdWVzdGlvbk1hcms7CiAgICBleHBvcnRzLkJhZGdlUnVzc2lhblJ1YmxlID0gQmFkZ2VSdXNzaWFuUnVibGU7CiAgICBleHBvcnRzLkJhZGdlU3dpc3NGcmFuYyA9IEJhZGdlU3dpc3NGcmFuYzsKICAgIGV4cG9ydHMuQmFkZ2VUdXJraXNoTGlyYSA9IEJhZGdlVHVya2lzaExpcmE7CiAgICBleHBvcnRzLkJhZGdlWCA9IEJhZGdlWDsKICAgIGV4cG9ydHMuQmFnZ2FnZUNsYWltID0gQmFnZ2FnZUNsYWltOwogICAgZXhwb3J0cy5CYWxsb29uID0gQmFsbG9vbjsKICAgIGV4cG9ydHMuQmFuID0gQmFuOwogICAgZXhwb3J0cy5CYW5hbmEgPSBCYW5hbmE7CiAgICBleHBvcnRzLkJhbmRhZ2UgPSBCYW5kYWdlOwogICAgZXhwb3J0cy5CYW5rbm90ZSA9IEJhbmtub3RlOwogICAgZXhwb3J0cy5CYW5rbm90ZUFycm93RG93biA9IEJhbmtub3RlQXJyb3dEb3duOwogICAgZXhwb3J0cy5CYW5rbm90ZUFycm93VXAgPSBCYW5rbm90ZUFycm93VXA7CiAgICBleHBvcnRzLkJhbmtub3RlWCA9IEJhbmtub3RlWDsKICAgIGV4cG9ydHMuQmFyQ2hhcnQgPSBDaGFydE5vQXhlc0NvbHVtbkluY3JlYXNpbmc7CiAgICBleHBvcnRzLkJhckNoYXJ0MiA9IENoYXJ0Tm9BeGVzQ29sdW1uOwogICAgZXhwb3J0cy5CYXJDaGFydDMgPSBDaGFydENvbHVtbjsKICAgIGV4cG9ydHMuQmFyQ2hhcnQ0ID0gQ2hhcnRDb2x1bW5JbmNyZWFzaW5nOwogICAgZXhwb3J0cy5CYXJDaGFydEJpZyA9IENoYXJ0Q29sdW1uQmlnOwogICAgZXhwb3J0cy5CYXJDaGFydEhvcml6b250YWwgPSBDaGFydEJhcjsKICAgIGV4cG9ydHMuQmFyQ2hhcnRIb3Jpem9udGFsQmlnID0gQ2hhcnRCYXJCaWc7CiAgICBleHBvcnRzLkJhcmNvZGUgPSBCYXJjb2RlOwogICAgZXhwb3J0cy5CYXJyZWwgPSBCYXJyZWw7CiAgICBleHBvcnRzLkJhc2VsaW5lID0gQmFzZWxpbmU7CiAgICBleHBvcnRzLkJhdGggPSBCYXRoOwogICAgZXhwb3J0cy5CYXR0ZXJ5ID0gQmF0dGVyeTsKICAgIGV4cG9ydHMuQmF0dGVyeUNoYXJnaW5nID0gQmF0dGVyeUNoYXJnaW5nOwogICAgZXhwb3J0cy5CYXR0ZXJ5RnVsbCA9IEJhdHRlcnlGdWxsOwogICAgZXhwb3J0cy5CYXR0ZXJ5TG93ID0gQmF0dGVyeUxvdzsKICAgIGV4cG9ydHMuQmF0dGVyeU1lZGl1bSA9IEJhdHRlcnlNZWRpdW07CiAgICBleHBvcnRzLkJhdHRlcnlQbHVzID0gQmF0dGVyeVBsdXM7CiAgICBleHBvcnRzLkJhdHRlcnlXYXJuaW5nID0gQmF0dGVyeVdhcm5pbmc7CiAgICBleHBvcnRzLkJlYWtlciA9IEJlYWtlcjsKICAgIGV4cG9ydHMuQmVhbiA9IEJlYW47CiAgICBleHBvcnRzLkJlYW5PZmYgPSBCZWFuT2ZmOwogICAgZXhwb3J0cy5CZWQgPSBCZWQ7CiAgICBleHBvcnRzLkJlZERvdWJsZSA9IEJlZERvdWJsZTsKICAgIGV4cG9ydHMuQmVkU2luZ2xlID0gQmVkU2luZ2xlOwogICAgZXhwb3J0cy5CZWVmID0gQmVlZjsKICAgIGV4cG9ydHMuQmVlciA9IEJlZXI7CiAgICBleHBvcnRzLkJlZXJPZmYgPSBCZWVyT2ZmOwogICAgZXhwb3J0cy5CZWxsID0gQmVsbDsKICAgIGV4cG9ydHMuQmVsbERvdCA9IEJlbGxEb3Q7CiAgICBleHBvcnRzLkJlbGxFbGVjdHJpYyA9IEJlbGxFbGVjdHJpYzsKICAgIGV4cG9ydHMuQmVsbE1pbnVzID0gQmVsbE1pbnVzOwogICAgZXhwb3J0cy5CZWxsT2ZmID0gQmVsbE9mZjsKICAgIGV4cG9ydHMuQmVsbFBsdXMgPSBCZWxsUGx1czsKICAgIGV4cG9ydHMuQmVsbFJpbmcgPSBCZWxsUmluZzsKICAgIGV4cG9ydHMuQmV0d2Vlbkhvcml6b25hbEVuZCA9IEJldHdlZW5Ib3Jpem9udGFsRW5kOwogICAgZXhwb3J0cy5CZXR3ZWVuSG9yaXpvbmFsU3RhcnQgPSBCZXR3ZWVuSG9yaXpvbnRhbFN0YXJ0OwogICAgZXhwb3J0cy5CZXR3ZWVuSG9yaXpvbnRhbEVuZCA9IEJldHdlZW5Ib3Jpem9udGFsRW5kOwogICAgZXhwb3J0cy5CZXR3ZWVuSG9yaXpvbnRhbFN0YXJ0ID0gQmV0d2Vlbkhvcml6b250YWxTdGFydDsKICAgIGV4cG9ydHMuQmV0d2VlblZlcnRpY2FsRW5kID0gQmV0d2VlblZlcnRpY2FsRW5kOwogICAgZXhwb3J0cy5CZXR3ZWVuVmVydGljYWxTdGFydCA9IEJldHdlZW5WZXJ0aWNhbFN0YXJ0OwogICAgZXhwb3J0cy5CaWNlcHNGbGV4ZWQgPSBCaWNlcHNGbGV4ZWQ7CiAgICBleHBvcnRzLkJpa2UgPSBCaWtlOwogICAgZXhwb3J0cy5CaW5hcnkgPSBCaW5hcnk7CiAgICBleHBvcnRzLkJpbm9jdWxhcnMgPSBCaW5vY3VsYXJzOwogICAgZXhwb3J0cy5CaW9oYXphcmQgPSBCaW9oYXphcmQ7CiAgICBleHBvcnRzLkJpcmQgPSBCaXJkOwogICAgZXhwb3J0cy5CaXJkaG91c2UgPSBCaXJkaG91c2U7CiAgICBleHBvcnRzLkJpdGNvaW4gPSBCaXRjb2luOwogICAgZXhwb3J0cy5CbGVuZCA9IEJsZW5kOwogICAgZXhwb3J0cy5CbGluZHMgPSBCbGluZHM7CiAgICBleHBvcnRzLkJsb2NrcyA9IEJsb2NrczsKICAgIGV4cG9ydHMuQmx1ZXRvb3RoID0gQmx1ZXRvb3RoOwogICAgZXhwb3J0cy5CbHVldG9vdGhDb25uZWN0ZWQgPSBCbHVldG9vdGhDb25uZWN0ZWQ7CiAgICBleHBvcnRzLkJsdWV0b290aE9mZiA9IEJsdWV0b290aE9mZjsKICAgIGV4cG9ydHMuQmx1ZXRvb3RoU2VhcmNoaW5nID0gQmx1ZXRvb3RoU2VhcmNoaW5nOwogICAgZXhwb3J0cy5Cb2xkID0gQm9sZDsKICAgIGV4cG9ydHMuQm9sdCA9IEJvbHQ7CiAgICBleHBvcnRzLkJvbWIgPSBCb21iOwogICAgZXhwb3J0cy5Cb25lID0gQm9uZTsKICAgIGV4cG9ydHMuQm9vayA9IEJvb2s7CiAgICBleHBvcnRzLkJvb2tBID0gQm9va0E7CiAgICBleHBvcnRzLkJvb2tBbGVydCA9IEJvb2tBbGVydDsKICAgIGV4cG9ydHMuQm9va0F1ZGlvID0gQm9va0F1ZGlvOwogICAgZXhwb3J0cy5Cb29rQ2hlY2sgPSBCb29rQ2hlY2s7CiAgICBleHBvcnRzLkJvb2tDb3B5ID0gQm9va0NvcHk7CiAgICBleHBvcnRzLkJvb2tEYXNoZWQgPSBCb29rRGFzaGVkOwogICAgZXhwb3J0cy5Cb29rRG93biA9IEJvb2tEb3duOwogICAgZXhwb3J0cy5Cb29rSGVhZHBob25lcyA9IEJvb2tIZWFkcGhvbmVzOwogICAgZXhwb3J0cy5Cb29rSGVhcnQgPSBCb29rSGVhcnQ7CiAgICBleHBvcnRzLkJvb2tJbWFnZSA9IEJvb2tJbWFnZTsKICAgIGV4cG9ydHMuQm9va0tleSA9IEJvb2tLZXk7CiAgICBleHBvcnRzLkJvb2tMb2NrID0gQm9va0xvY2s7CiAgICBleHBvcnRzLkJvb2tNYXJrZWQgPSBCb29rTWFya2VkOwogICAgZXhwb3J0cy5Cb29rTWludXMgPSBCb29rTWludXM7CiAgICBleHBvcnRzLkJvb2tPcGVuID0gQm9va09wZW47CiAgICBleHBvcnRzLkJvb2tPcGVuQ2hlY2sgPSBCb29rT3BlbkNoZWNrOwogICAgZXhwb3J0cy5Cb29rT3BlblRleHQgPSBCb29rT3BlblRleHQ7CiAgICBleHBvcnRzLkJvb2tQbHVzID0gQm9va1BsdXM7CiAgICBleHBvcnRzLkJvb2tTZWFyY2ggPSBCb29rU2VhcmNoOwogICAgZXhwb3J0cy5Cb29rVGVtcGxhdGUgPSBCb29rRGFzaGVkOwogICAgZXhwb3J0cy5Cb29rVGV4dCA9IEJvb2tUZXh0OwogICAgZXhwb3J0cy5Cb29rVHlwZSA9IEJvb2tUeXBlOwogICAgZXhwb3J0cy5Cb29rVXAgPSBCb29rVXA7CiAgICBleHBvcnRzLkJvb2tVcDIgPSBCb29rVXAyOwogICAgZXhwb3J0cy5Cb29rVXNlciA9IEJvb2tVc2VyOwogICAgZXhwb3J0cy5Cb29rWCA9IEJvb2tYOwogICAgZXhwb3J0cy5Cb29rbWFyayA9IEJvb2ttYXJrOwogICAgZXhwb3J0cy5Cb29rbWFya0NoZWNrID0gQm9va21hcmtDaGVjazsKICAgIGV4cG9ydHMuQm9va21hcmtNaW51cyA9IEJvb2ttYXJrTWludXM7CiAgICBleHBvcnRzLkJvb2ttYXJrUGx1cyA9IEJvb2ttYXJrUGx1czsKICAgIGV4cG9ydHMuQm9va21hcmtYID0gQm9va21hcmtYOwogICAgZXhwb3J0cy5Cb29tQm94ID0gQm9vbUJveDsKICAgIGV4cG9ydHMuQm90ID0gQm90OwogICAgZXhwb3J0cy5Cb3RNZXNzYWdlU3F1YXJlID0gQm90TWVzc2FnZVNxdWFyZTsKICAgIGV4cG9ydHMuQm90T2ZmID0gQm90T2ZmOwogICAgZXhwb3J0cy5Cb3R0bGVXaW5lID0gQm90dGxlV2luZTsKICAgIGV4cG9ydHMuQm93QXJyb3cgPSBCb3dBcnJvdzsKICAgIGV4cG9ydHMuQm94ID0gQm94OwogICAgZXhwb3J0cy5Cb3hTZWxlY3QgPSBTcXVhcmVEYXNoZWQ7CiAgICBleHBvcnRzLkJveGVzID0gQm94ZXM7CiAgICBleHBvcnRzLkJyYWNlcyA9IEJyYWNlczsKICAgIGV4cG9ydHMuQnJhY2tldHMgPSBCcmFja2V0czsKICAgIGV4cG9ydHMuQnJhaW4gPSBCcmFpbjsKICAgIGV4cG9ydHMuQnJhaW5DaXJjdWl0ID0gQnJhaW5DaXJjdWl0OwogICAgZXhwb3J0cy5CcmFpbkNvZyA9IEJyYWluQ29nOwogICAgZXhwb3J0cy5Ccmlja1dhbGwgPSBCcmlja1dhbGw7CiAgICBleHBvcnRzLkJyaWNrV2FsbEZpcmUgPSBCcmlja1dhbGxGaXJlOwogICAgZXhwb3J0cy5Ccmlja1dhbGxTaGllbGQgPSBCcmlja1dhbGxTaGllbGQ7CiAgICBleHBvcnRzLkJyaWVmY2FzZSA9IEJyaWVmY2FzZTsKICAgIGV4cG9ydHMuQnJpZWZjYXNlQnVzaW5lc3MgPSBCcmllZmNhc2VCdXNpbmVzczsKICAgIGV4cG9ydHMuQnJpZWZjYXNlQ29udmV5b3JCZWx0ID0gQnJpZWZjYXNlQ29udmV5b3JCZWx0OwogICAgZXhwb3J0cy5CcmllZmNhc2VNZWRpY2FsID0gQnJpZWZjYXNlTWVkaWNhbDsKICAgIGV4cG9ydHMuQnJpbmdUb0Zyb250ID0gQnJpbmdUb0Zyb250OwogICAgZXhwb3J0cy5CcnVzaCA9IEJydXNoOwogICAgZXhwb3J0cy5CcnVzaENsZWFuaW5nID0gQnJ1c2hDbGVhbmluZzsKICAgIGV4cG9ydHMuQnViYmxlcyA9IEJ1YmJsZXM7CiAgICBleHBvcnRzLkJ1ZyA9IEJ1ZzsKICAgIGV4cG9ydHMuQnVnT2ZmID0gQnVnT2ZmOwogICAgZXhwb3J0cy5CdWdQbGF5ID0gQnVnUGxheTsKICAgIGV4cG9ydHMuQnVpbGRpbmcgPSBCdWlsZGluZzsKICAgIGV4cG9ydHMuQnVpbGRpbmcyID0gQnVpbGRpbmcyOwogICAgZXhwb3J0cy5CdXMgPSBCdXM7CiAgICBleHBvcnRzLkJ1c0Zyb250ID0gQnVzRnJvbnQ7CiAgICBleHBvcnRzLkNhYmxlID0gQ2FibGU7CiAgICBleHBvcnRzLkNhYmxlQ2FyID0gQ2FibGVDYXI7CiAgICBleHBvcnRzLkNha2UgPSBDYWtlOwogICAgZXhwb3J0cy5DYWtlU2xpY2UgPSBDYWtlU2xpY2U7CiAgICBleHBvcnRzLkNhbGN1bGF0b3IgPSBDYWxjdWxhdG9yOwogICAgZXhwb3J0cy5DYWxlbmRhciA9IENhbGVuZGFyOwogICAgZXhwb3J0cy5DYWxlbmRhcjEgPSBDYWxlbmRhcjE7CiAgICBleHBvcnRzLkNhbGVuZGFyQXJyb3dEb3duID0gQ2FsZW5kYXJBcnJvd0Rvd247CiAgICBleHBvcnRzLkNhbGVuZGFyQXJyb3dVcCA9IENhbGVuZGFyQXJyb3dVcDsKICAgIGV4cG9ydHMuQ2FsZW5kYXJDaGVjayA9IENhbGVuZGFyQ2hlY2s7CiAgICBleHBvcnRzLkNhbGVuZGFyQ2hlY2syID0gQ2FsZW5kYXJDaGVjazI7CiAgICBleHBvcnRzLkNhbGVuZGFyQ2xvY2sgPSBDYWxlbmRhckNsb2NrOwogICAgZXhwb3J0cy5DYWxlbmRhckNvZyA9IENhbGVuZGFyQ29nOwogICAgZXhwb3J0cy5DYWxlbmRhckRheXMgPSBDYWxlbmRhckRheXM7CiAgICBleHBvcnRzLkNhbGVuZGFyRm9sZCA9IENhbGVuZGFyRm9sZDsKICAgIGV4cG9ydHMuQ2FsZW5kYXJIZWFydCA9IENhbGVuZGFySGVhcnQ7CiAgICBleHBvcnRzLkNhbGVuZGFyTWludXMgPSBDYWxlbmRhck1pbnVzOwogICAgZXhwb3J0cy5DYWxlbmRhck1pbnVzMiA9IENhbGVuZGFyTWludXMyOwogICAgZXhwb3J0cy5DYWxlbmRhck9mZiA9IENhbGVuZGFyT2ZmOwogICAgZXhwb3J0cy5DYWxlbmRhclBsdXMgPSBDYWxlbmRhclBsdXM7CiAgICBleHBvcnRzLkNhbGVuZGFyUGx1czIgPSBDYWxlbmRhclBsdXMyOwogICAgZXhwb3J0cy5DYWxlbmRhclJhbmdlID0gQ2FsZW5kYXJSYW5nZTsKICAgIGV4cG9ydHMuQ2FsZW5kYXJTZWFyY2ggPSBDYWxlbmRhclNlYXJjaDsKICAgIGV4cG9ydHMuQ2FsZW5kYXJTeW5jID0gQ2FsZW5kYXJTeW5jOwogICAgZXhwb3J0cy5DYWxlbmRhclggPSBDYWxlbmRhclg7CiAgICBleHBvcnRzLkNhbGVuZGFyWDIgPSBDYWxlbmRhclgyOwogICAgZXhwb3J0cy5DYWxlbmRhcnMgPSBDYWxlbmRhcnM7CiAgICBleHBvcnRzLkNhbWVyYSA9IENhbWVyYTsKICAgIGV4cG9ydHMuQ2FtZXJhT2ZmID0gQ2FtZXJhT2ZmOwogICAgZXhwb3J0cy5DYW5kbGVzdGlja0NoYXJ0ID0gQ2hhcnRDYW5kbGVzdGljazsKICAgIGV4cG9ydHMuQ2FuZHkgPSBDYW5keTsKICAgIGV4cG9ydHMuQ2FuZHlDYW5lID0gQ2FuZHlDYW5lOwogICAgZXhwb3J0cy5DYW5keU9mZiA9IENhbmR5T2ZmOwogICAgZXhwb3J0cy5DYW5uYWJpcyA9IENhbm5hYmlzOwogICAgZXhwb3J0cy5DYW5uYWJpc09mZiA9IENhbm5hYmlzT2ZmOwogICAgZXhwb3J0cy5DYXB0aW9ucyA9IENhcHRpb25zOwogICAgZXhwb3J0cy5DYXB0aW9uc09mZiA9IENhcHRpb25zT2ZmOwogICAgZXhwb3J0cy5DYXIgPSBDYXI7CiAgICBleHBvcnRzLkNhckZyb250ID0gQ2FyRnJvbnQ7CiAgICBleHBvcnRzLkNhclRheGlGcm9udCA9IENhclRheGlGcm9udDsKICAgIGV4cG9ydHMuQ2FyYXZhbiA9IENhcmF2YW47CiAgICBleHBvcnRzLkNhcmRTaW0gPSBDYXJkU2ltOwogICAgZXhwb3J0cy5DYXJyb3QgPSBDYXJyb3Q7CiAgICBleHBvcnRzLkNhc2VMb3dlciA9IENhc2VMb3dlcjsKICAgIGV4cG9ydHMuQ2FzZVNlbnNpdGl2ZSA9IENhc2VTZW5zaXRpdmU7CiAgICBleHBvcnRzLkNhc2VVcHBlciA9IENhc2VVcHBlcjsKICAgIGV4cG9ydHMuQ2Fzc2V0dGVUYXBlID0gQ2Fzc2V0dGVUYXBlOwogICAgZXhwb3J0cy5DYXN0ID0gQ2FzdDsKICAgIGV4cG9ydHMuQ2FzdGxlID0gQ2FzdGxlOwogICAgZXhwb3J0cy5DYXQgPSBDYXQ7CiAgICBleHBvcnRzLkNjdHYgPSBDY3R2OwogICAgZXhwb3J0cy5DaGFydEFyZWEgPSBDaGFydEFyZWE7CiAgICBleHBvcnRzLkNoYXJ0QmFyID0gQ2hhcnRCYXI7CiAgICBleHBvcnRzLkNoYXJ0QmFyQmlnID0gQ2hhcnRCYXJCaWc7CiAgICBleHBvcnRzLkNoYXJ0QmFyRGVjcmVhc2luZyA9IENoYXJ0QmFyRGVjcmVhc2luZzsKICAgIGV4cG9ydHMuQ2hhcnRCYXJJbmNyZWFzaW5nID0gQ2hhcnRCYXJJbmNyZWFzaW5nOwogICAgZXhwb3J0cy5DaGFydEJhclN0YWNrZWQgPSBDaGFydEJhclN0YWNrZWQ7CiAgICBleHBvcnRzLkNoYXJ0Q2FuZGxlc3RpY2sgPSBDaGFydENhbmRsZXN0aWNrOwogICAgZXhwb3J0cy5DaGFydENvbHVtbiA9IENoYXJ0Q29sdW1uOwogICAgZXhwb3J0cy5DaGFydENvbHVtbkJpZyA9IENoYXJ0Q29sdW1uQmlnOwogICAgZXhwb3J0cy5DaGFydENvbHVtbkRlY3JlYXNpbmcgPSBDaGFydENvbHVtbkRlY3JlYXNpbmc7CiAgICBleHBvcnRzLkNoYXJ0Q29sdW1uSW5jcmVhc2luZyA9IENoYXJ0Q29sdW1uSW5jcmVhc2luZzsKICAgIGV4cG9ydHMuQ2hhcnRDb2x1bW5TdGFja2VkID0gQ2hhcnRDb2x1bW5TdGFja2VkOwogICAgZXhwb3J0cy5DaGFydEdhbnR0ID0gQ2hhcnRHYW50dDsKICAgIGV4cG9ydHMuQ2hhcnRMaW5lID0gQ2hhcnRMaW5lOwogICAgZXhwb3J0cy5DaGFydE5ldHdvcmsgPSBDaGFydE5ldHdvcms7CiAgICBleHBvcnRzLkNoYXJ0Tm9BeGVzQ29sdW1uID0gQ2hhcnROb0F4ZXNDb2x1bW47CiAgICBleHBvcnRzLkNoYXJ0Tm9BeGVzQ29sdW1uRGVjcmVhc2luZyA9IENoYXJ0Tm9BeGVzQ29sdW1uRGVjcmVhc2luZzsKICAgIGV4cG9ydHMuQ2hhcnROb0F4ZXNDb2x1bW5JbmNyZWFzaW5nID0gQ2hhcnROb0F4ZXNDb2x1bW5JbmNyZWFzaW5nOwogICAgZXhwb3J0cy5DaGFydE5vQXhlc0NvbWJpbmVkID0gQ2hhcnROb0F4ZXNDb21iaW5lZDsKICAgIGV4cG9ydHMuQ2hhcnROb0F4ZXNHYW50dCA9IENoYXJ0Tm9BeGVzR2FudHQ7CiAgICBleHBvcnRzLkNoYXJ0UGllID0gQ2hhcnRQaWU7CiAgICBleHBvcnRzLkNoYXJ0U2NhdHRlciA9IENoYXJ0U2NhdHRlcjsKICAgIGV4cG9ydHMuQ2hhcnRTcGxpbmUgPSBDaGFydFNwbGluZTsKICAgIGV4cG9ydHMuQ2hlY2sgPSBDaGVjazsKICAgIGV4cG9ydHMuQ2hlY2tDaGVjayA9IENoZWNrQ2hlY2s7CiAgICBleHBvcnRzLkNoZWNrQ2lyY2xlID0gQ2lyY2xlQ2hlY2tCaWc7CiAgICBleHBvcnRzLkNoZWNrQ2lyY2xlMiA9IENpcmNsZUNoZWNrOwogICAgZXhwb3J0cy5DaGVja0xpbmUgPSBDaGVja0xpbmU7CiAgICBleHBvcnRzLkNoZWNrU3F1YXJlID0gU3F1YXJlQ2hlY2tCaWc7CiAgICBleHBvcnRzLkNoZWNrU3F1YXJlMiA9IFNxdWFyZUNoZWNrOwogICAgZXhwb3J0cy5DaGVmSGF0ID0gQ2hlZkhhdDsKICAgIGV4cG9ydHMuQ2hlcnJ5ID0gQ2hlcnJ5OwogICAgZXhwb3J0cy5DaGVzc0Jpc2hvcCA9IENoZXNzQmlzaG9wOwogICAgZXhwb3J0cy5DaGVzc0tpbmcgPSBDaGVzc0tpbmc7CiAgICBleHBvcnRzLkNoZXNzS25pZ2h0ID0gQ2hlc3NLbmlnaHQ7CiAgICBleHBvcnRzLkNoZXNzUGF3biA9IENoZXNzUGF3bjsKICAgIGV4cG9ydHMuQ2hlc3NRdWVlbiA9IENoZXNzUXVlZW47CiAgICBleHBvcnRzLkNoZXNzUm9vayA9IENoZXNzUm9vazsKICAgIGV4cG9ydHMuQ2hldnJvbkRvd24gPSBDaGV2cm9uRG93bjsKICAgIGV4cG9ydHMuQ2hldnJvbkRvd25DaXJjbGUgPSBDaXJjbGVDaGV2cm9uRG93bjsKICAgIGV4cG9ydHMuQ2hldnJvbkRvd25TcXVhcmUgPSBTcXVhcmVDaGV2cm9uRG93bjsKICAgIGV4cG9ydHMuQ2hldnJvbkZpcnN0ID0gQ2hldnJvbkZpcnN0OwogICAgZXhwb3J0cy5DaGV2cm9uTGFzdCA9IENoZXZyb25MYXN0OwogICAgZXhwb3J0cy5DaGV2cm9uTGVmdCA9IENoZXZyb25MZWZ0OwogICAgZXhwb3J0cy5DaGV2cm9uTGVmdENpcmNsZSA9IENpcmNsZUNoZXZyb25MZWZ0OwogICAgZXhwb3J0cy5DaGV2cm9uTGVmdFNxdWFyZSA9IFNxdWFyZUNoZXZyb25MZWZ0OwogICAgZXhwb3J0cy5DaGV2cm9uUmlnaHQgPSBDaGV2cm9uUmlnaHQ7CiAgICBleHBvcnRzLkNoZXZyb25SaWdodENpcmNsZSA9IENpcmNsZUNoZXZyb25SaWdodDsKICAgIGV4cG9ydHMuQ2hldnJvblJpZ2h0U3F1YXJlID0gU3F1YXJlQ2hldnJvblJpZ2h0OwogICAgZXhwb3J0cy5DaGV2cm9uVXAgPSBDaGV2cm9uVXA7CiAgICBleHBvcnRzLkNoZXZyb25VcENpcmNsZSA9IENpcmNsZUNoZXZyb25VcDsKICAgIGV4cG9ydHMuQ2hldnJvblVwU3F1YXJlID0gU3F1YXJlQ2hldnJvblVwOwogICAgZXhwb3J0cy5DaGV2cm9uc0Rvd24gPSBDaGV2cm9uc0Rvd247CiAgICBleHBvcnRzLkNoZXZyb25zRG93blVwID0gQ2hldnJvbnNEb3duVXA7CiAgICBleHBvcnRzLkNoZXZyb25zTGVmdCA9IENoZXZyb25zTGVmdDsKICAgIGV4cG9ydHMuQ2hldnJvbnNMZWZ0UmlnaHQgPSBDaGV2cm9uc0xlZnRSaWdodDsKICAgIGV4cG9ydHMuQ2hldnJvbnNMZWZ0UmlnaHRFbGxpcHNpcyA9IENoZXZyb25zTGVmdFJpZ2h0RWxsaXBzaXM7CiAgICBleHBvcnRzLkNoZXZyb25zUmlnaHQgPSBDaGV2cm9uc1JpZ2h0OwogICAgZXhwb3J0cy5DaGV2cm9uc1JpZ2h0TGVmdCA9IENoZXZyb25zUmlnaHRMZWZ0OwogICAgZXhwb3J0cy5DaGV2cm9uc1VwID0gQ2hldnJvbnNVcDsKICAgIGV4cG9ydHMuQ2hldnJvbnNVcERvd24gPSBDaGV2cm9uc1VwRG93bjsKICAgIGV4cG9ydHMuQ2hyb21lID0gQ2hyb21pdW07CiAgICBleHBvcnRzLkNocm9taXVtID0gQ2hyb21pdW07CiAgICBleHBvcnRzLkNodXJjaCA9IENodXJjaDsKICAgIGV4cG9ydHMuQ2lnYXJldHRlID0gQ2lnYXJldHRlOwogICAgZXhwb3J0cy5DaWdhcmV0dGVPZmYgPSBDaWdhcmV0dGVPZmY7CiAgICBleHBvcnRzLkNpcmNsZSA9IENpcmNsZTsKICAgIGV4cG9ydHMuQ2lyY2xlQWxlcnQgPSBDaXJjbGVBbGVydDsKICAgIGV4cG9ydHMuQ2lyY2xlQXJyb3dEb3duID0gQ2lyY2xlQXJyb3dEb3duOwogICAgZXhwb3J0cy5DaXJjbGVBcnJvd0xlZnQgPSBDaXJjbGVBcnJvd0xlZnQ7CiAgICBleHBvcnRzLkNpcmNsZUFycm93T3V0RG93bkxlZnQgPSBDaXJjbGVBcnJvd091dERvd25MZWZ0OwogICAgZXhwb3J0cy5DaXJjbGVBcnJvd091dERvd25SaWdodCA9IENpcmNsZUFycm93T3V0RG93blJpZ2h0OwogICAgZXhwb3J0cy5DaXJjbGVBcnJvd091dFVwTGVmdCA9IENpcmNsZUFycm93T3V0VXBMZWZ0OwogICAgZXhwb3J0cy5DaXJjbGVBcnJvd091dFVwUmlnaHQgPSBDaXJjbGVBcnJvd091dFVwUmlnaHQ7CiAgICBleHBvcnRzLkNpcmNsZUFycm93UmlnaHQgPSBDaXJjbGVBcnJvd1JpZ2h0OwogICAgZXhwb3J0cy5DaXJjbGVBcnJvd1VwID0gQ2lyY2xlQXJyb3dVcDsKICAgIGV4cG9ydHMuQ2lyY2xlQ2hlY2sgPSBDaXJjbGVDaGVjazsKICAgIGV4cG9ydHMuQ2lyY2xlQ2hlY2tCaWcgPSBDaXJjbGVDaGVja0JpZzsKICAgIGV4cG9ydHMuQ2lyY2xlQ2hldnJvbkRvd24gPSBDaXJjbGVDaGV2cm9uRG93bjsKICAgIGV4cG9ydHMuQ2lyY2xlQ2hldnJvbkxlZnQgPSBDaXJjbGVDaGV2cm9uTGVmdDsKICAgIGV4cG9ydHMuQ2lyY2xlQ2hldnJvblJpZ2h0ID0gQ2lyY2xlQ2hldnJvblJpZ2h0OwogICAgZXhwb3J0cy5DaXJjbGVDaGV2cm9uVXAgPSBDaXJjbGVDaGV2cm9uVXA7CiAgICBleHBvcnRzLkNpcmNsZURhc2hlZCA9IENpcmNsZURhc2hlZDsKICAgIGV4cG9ydHMuQ2lyY2xlRGl2aWRlID0gQ2lyY2xlRGl2aWRlOwogICAgZXhwb3J0cy5DaXJjbGVEb2xsYXJTaWduID0gQ2lyY2xlRG9sbGFyU2lnbjsKICAgIGV4cG9ydHMuQ2lyY2xlRG90ID0gQ2lyY2xlRG90OwogICAgZXhwb3J0cy5DaXJjbGVEb3REYXNoZWQgPSBDaXJjbGVEb3REYXNoZWQ7CiAgICBleHBvcnRzLkNpcmNsZUVsbGlwc2lzID0gQ2lyY2xlRWxsaXBzaXM7CiAgICBleHBvcnRzLkNpcmNsZUVxdWFsID0gQ2lyY2xlRXF1YWw7CiAgICBleHBvcnRzLkNpcmNsZUZhZGluZ0Fycm93VXAgPSBDaXJjbGVGYWRpbmdBcnJvd1VwOwogICAgZXhwb3J0cy5DaXJjbGVGYWRpbmdQbHVzID0gQ2lyY2xlRmFkaW5nUGx1czsKICAgIGV4cG9ydHMuQ2lyY2xlR2F1Z2UgPSBDaXJjbGVHYXVnZTsKICAgIGV4cG9ydHMuQ2lyY2xlSGVscCA9IENpcmNsZVF1ZXN0aW9uTWFyazsKICAgIGV4cG9ydHMuQ2lyY2xlTWludXMgPSBDaXJjbGVNaW51czsKICAgIGV4cG9ydHMuQ2lyY2xlT2ZmID0gQ2lyY2xlT2ZmOwogICAgZXhwb3J0cy5DaXJjbGVQYXJraW5nID0gQ2lyY2xlUGFya2luZzsKICAgIGV4cG9ydHMuQ2lyY2xlUGFya2luZ09mZiA9IENpcmNsZVBhcmtpbmdPZmY7CiAgICBleHBvcnRzLkNpcmNsZVBhdXNlID0gQ2lyY2xlUGF1c2U7CiAgICBleHBvcnRzLkNpcmNsZVBlcmNlbnQgPSBDaXJjbGVQZXJjZW50OwogICAgZXhwb3J0cy5DaXJjbGVQaWxlID0gQ2lyY2xlUGlsZTsKICAgIGV4cG9ydHMuQ2lyY2xlUGxheSA9IENpcmNsZVBsYXk7CiAgICBleHBvcnRzLkNpcmNsZVBsdXMgPSBDaXJjbGVQbHVzOwogICAgZXhwb3J0cy5DaXJjbGVQb3VuZFN0ZXJsaW5nID0gQ2lyY2xlUG91bmRTdGVybGluZzsKICAgIGV4cG9ydHMuQ2lyY2xlUG93ZXIgPSBDaXJjbGVQb3dlcjsKICAgIGV4cG9ydHMuQ2lyY2xlUXVlc3Rpb25NYXJrID0gQ2lyY2xlUXVlc3Rpb25NYXJrOwogICAgZXhwb3J0cy5DaXJjbGVTbGFzaCA9IENpcmNsZVNsYXNoOwogICAgZXhwb3J0cy5DaXJjbGVTbGFzaDIgPSBDaXJjbGVTbGFzaDI7CiAgICBleHBvcnRzLkNpcmNsZVNsYXNoZWQgPSBDaXJjbGVTbGFzaDI7CiAgICBleHBvcnRzLkNpcmNsZVNtYWxsID0gQ2lyY2xlU21hbGw7CiAgICBleHBvcnRzLkNpcmNsZVN0YXIgPSBDaXJjbGVTdGFyOwogICAgZXhwb3J0cy5DaXJjbGVTdG9wID0gQ2lyY2xlU3RvcDsKICAgIGV4cG9ydHMuQ2lyY2xlVXNlciA9IENpcmNsZVVzZXI7CiAgICBleHBvcnRzLkNpcmNsZVVzZXJSb3VuZCA9IENpcmNsZVVzZXJSb3VuZDsKICAgIGV4cG9ydHMuQ2lyY2xlWCA9IENpcmNsZVg7CiAgICBleHBvcnRzLkNpcmN1aXRCb2FyZCA9IENpcmN1aXRCb2FyZDsKICAgIGV4cG9ydHMuQ2l0cnVzID0gQ2l0cnVzOwogICAgZXhwb3J0cy5DbGFwcGVyYm9hcmQgPSBDbGFwcGVyYm9hcmQ7CiAgICBleHBvcnRzLkNsaXBib2FyZCA9IENsaXBib2FyZDsKICAgIGV4cG9ydHMuQ2xpcGJvYXJkQ2hlY2sgPSBDbGlwYm9hcmRDaGVjazsKICAgIGV4cG9ydHMuQ2xpcGJvYXJkQ2xvY2sgPSBDbGlwYm9hcmRDbG9jazsKICAgIGV4cG9ydHMuQ2xpcGJvYXJkQ29weSA9IENsaXBib2FyZENvcHk7CiAgICBleHBvcnRzLkNsaXBib2FyZEVkaXQgPSBDbGlwYm9hcmRQZW47CiAgICBleHBvcnRzLkNsaXBib2FyZExpc3QgPSBDbGlwYm9hcmRMaXN0OwogICAgZXhwb3J0cy5DbGlwYm9hcmRNaW51cyA9IENsaXBib2FyZE1pbnVzOwogICAgZXhwb3J0cy5DbGlwYm9hcmRQYXN0ZSA9IENsaXBib2FyZFBhc3RlOwogICAgZXhwb3J0cy5DbGlwYm9hcmRQZW4gPSBDbGlwYm9hcmRQZW47CiAgICBleHBvcnRzLkNsaXBib2FyZFBlbkxpbmUgPSBDbGlwYm9hcmRQZW5MaW5lOwogICAgZXhwb3J0cy5DbGlwYm9hcmRQbHVzID0gQ2xpcGJvYXJkUGx1czsKICAgIGV4cG9ydHMuQ2xpcGJvYXJkU2lnbmF0dXJlID0gQ2xpcGJvYXJkUGVuTGluZTsKICAgIGV4cG9ydHMuQ2xpcGJvYXJkVHlwZSA9IENsaXBib2FyZFR5cGU7CiAgICBleHBvcnRzLkNsaXBib2FyZFggPSBDbGlwYm9hcmRYOwogICAgZXhwb3J0cy5DbG9jayA9IENsb2NrOwogICAgZXhwb3J0cy5DbG9jazEgPSBDbG9jazE7CiAgICBleHBvcnRzLkNsb2NrMTAgPSBDbG9jazEwOwogICAgZXhwb3J0cy5DbG9jazExID0gQ2xvY2sxMTsKICAgIGV4cG9ydHMuQ2xvY2sxMiA9IENsb2NrMTI7CiAgICBleHBvcnRzLkNsb2NrMiA9IENsb2NrMjsKICAgIGV4cG9ydHMuQ2xvY2szID0gQ2xvY2szOwogICAgZXhwb3J0cy5DbG9jazQgPSBDbG9jazQ7CiAgICBleHBvcnRzLkNsb2NrNSA9IENsb2NrNTsKICAgIGV4cG9ydHMuQ2xvY2s2ID0gQ2xvY2s2OwogICAgZXhwb3J0cy5DbG9jazcgPSBDbG9jazc7CiAgICBleHBvcnRzLkNsb2NrOCA9IENsb2NrODsKICAgIGV4cG9ydHMuQ2xvY2s5ID0gQ2xvY2s5OwogICAgZXhwb3J0cy5DbG9ja0FsZXJ0ID0gQ2xvY2tBbGVydDsKICAgIGV4cG9ydHMuQ2xvY2tBcnJvd0Rvd24gPSBDbG9ja0Fycm93RG93bjsKICAgIGV4cG9ydHMuQ2xvY2tBcnJvd1VwID0gQ2xvY2tBcnJvd1VwOwogICAgZXhwb3J0cy5DbG9ja0NoZWNrID0gQ2xvY2tDaGVjazsKICAgIGV4cG9ydHMuQ2xvY2tGYWRpbmcgPSBDbG9ja0ZhZGluZzsKICAgIGV4cG9ydHMuQ2xvY2tQbHVzID0gQ2xvY2tQbHVzOwogICAgZXhwb3J0cy5DbG9zZWRDYXB0aW9uID0gQ2xvc2VkQ2FwdGlvbjsKICAgIGV4cG9ydHMuQ2xvdWQgPSBDbG91ZDsKICAgIGV4cG9ydHMuQ2xvdWRBbGVydCA9IENsb3VkQWxlcnQ7CiAgICBleHBvcnRzLkNsb3VkQmFja3VwID0gQ2xvdWRCYWNrdXA7CiAgICBleHBvcnRzLkNsb3VkQ2hlY2sgPSBDbG91ZENoZWNrOwogICAgZXhwb3J0cy5DbG91ZENvZyA9IENsb3VkQ29nOwogICAgZXhwb3J0cy5DbG91ZERvd25sb2FkID0gQ2xvdWREb3dubG9hZDsKICAgIGV4cG9ydHMuQ2xvdWREcml6emxlID0gQ2xvdWREcml6emxlOwogICAgZXhwb3J0cy5DbG91ZEZvZyA9IENsb3VkRm9nOwogICAgZXhwb3J0cy5DbG91ZEhhaWwgPSBDbG91ZEhhaWw7CiAgICBleHBvcnRzLkNsb3VkTGlnaHRuaW5nID0gQ2xvdWRMaWdodG5pbmc7CiAgICBleHBvcnRzLkNsb3VkTW9vbiA9IENsb3VkTW9vbjsKICAgIGV4cG9ydHMuQ2xvdWRNb29uUmFpbiA9IENsb3VkTW9vblJhaW47CiAgICBleHBvcnRzLkNsb3VkT2ZmID0gQ2xvdWRPZmY7CiAgICBleHBvcnRzLkNsb3VkUmFpbiA9IENsb3VkUmFpbjsKICAgIGV4cG9ydHMuQ2xvdWRSYWluV2luZCA9IENsb3VkUmFpbldpbmQ7CiAgICBleHBvcnRzLkNsb3VkU25vdyA9IENsb3VkU25vdzsKICAgIGV4cG9ydHMuQ2xvdWRTdW4gPSBDbG91ZFN1bjsKICAgIGV4cG9ydHMuQ2xvdWRTdW5SYWluID0gQ2xvdWRTdW5SYWluOwogICAgZXhwb3J0cy5DbG91ZFN5bmMgPSBDbG91ZFN5bmM7CiAgICBleHBvcnRzLkNsb3VkVXBsb2FkID0gQ2xvdWRVcGxvYWQ7CiAgICBleHBvcnRzLkNsb3VkeSA9IENsb3VkeTsKICAgIGV4cG9ydHMuQ2xvdmVyID0gQ2xvdmVyOwogICAgZXhwb3J0cy5DbHViID0gQ2x1YjsKICAgIGV4cG9ydHMuQ29kZSA9IENvZGU7CiAgICBleHBvcnRzLkNvZGUyID0gQ29kZVhtbDsKICAgIGV4cG9ydHMuQ29kZVNxdWFyZSA9IFNxdWFyZUNvZGU7CiAgICBleHBvcnRzLkNvZGVYbWwgPSBDb2RlWG1sOwogICAgZXhwb3J0cy5Db2RlcGVuID0gQ29kZXBlbjsKICAgIGV4cG9ydHMuQ29kZXNhbmRib3ggPSBDb2Rlc2FuZGJveDsKICAgIGV4cG9ydHMuQ29mZmVlID0gQ29mZmVlOwogICAgZXhwb3J0cy5Db2cgPSBDb2c7CiAgICBleHBvcnRzLkNvaW5zID0gQ29pbnM7CiAgICBleHBvcnRzLkNvbHVtbnMgPSBDb2x1bW5zMjsKICAgIGV4cG9ydHMuQ29sdW1uczIgPSBDb2x1bW5zMjsKICAgIGV4cG9ydHMuQ29sdW1uczMgPSBDb2x1bW5zMzsKICAgIGV4cG9ydHMuQ29sdW1uczNDb2cgPSBDb2x1bW5zM0NvZzsKICAgIGV4cG9ydHMuQ29sdW1uczQgPSBDb2x1bW5zNDsKICAgIGV4cG9ydHMuQ29sdW1uc1NldHRpbmdzID0gQ29sdW1uczNDb2c7CiAgICBleHBvcnRzLkNvbWJpbmUgPSBDb21iaW5lOwogICAgZXhwb3J0cy5Db21tYW5kID0gQ29tbWFuZDsKICAgIGV4cG9ydHMuQ29tcGFzcyA9IENvbXBhc3M7CiAgICBleHBvcnRzLkNvbXBvbmVudCA9IENvbXBvbmVudDsKICAgIGV4cG9ydHMuQ29tcHV0ZXIgPSBDb21wdXRlcjsKICAgIGV4cG9ydHMuQ29uY2llcmdlQmVsbCA9IENvbmNpZXJnZUJlbGw7CiAgICBleHBvcnRzLkNvbmUgPSBDb25lOwogICAgZXhwb3J0cy5Db25zdHJ1Y3Rpb24gPSBDb25zdHJ1Y3Rpb247CiAgICBleHBvcnRzLkNvbnRhY3QgPSBDb250YWN0OwogICAgZXhwb3J0cy5Db250YWN0MiA9IENvbnRhY3RSb3VuZDsKICAgIGV4cG9ydHMuQ29udGFjdFJvdW5kID0gQ29udGFjdFJvdW5kOwogICAgZXhwb3J0cy5Db250YWluZXIgPSBDb250YWluZXI7CiAgICBleHBvcnRzLkNvbnRyYXN0ID0gQ29udHJhc3Q7CiAgICBleHBvcnRzLkNvb2tpZSA9IENvb2tpZTsKICAgIGV4cG9ydHMuQ29va2luZ1BvdCA9IENvb2tpbmdQb3Q7CiAgICBleHBvcnRzLkNvcHkgPSBDb3B5OwogICAgZXhwb3J0cy5Db3B5Q2hlY2sgPSBDb3B5Q2hlY2s7CiAgICBleHBvcnRzLkNvcHlNaW51cyA9IENvcHlNaW51czsKICAgIGV4cG9ydHMuQ29weVBsdXMgPSBDb3B5UGx1czsKICAgIGV4cG9ydHMuQ29weVNsYXNoID0gQ29weVNsYXNoOwogICAgZXhwb3J0cy5Db3B5WCA9IENvcHlYOwogICAgZXhwb3J0cy5Db3B5bGVmdCA9IENvcHlsZWZ0OwogICAgZXhwb3J0cy5Db3B5cmlnaHQgPSBDb3B5cmlnaHQ7CiAgICBleHBvcnRzLkNvcm5lckRvd25MZWZ0ID0gQ29ybmVyRG93bkxlZnQ7CiAgICBleHBvcnRzLkNvcm5lckRvd25SaWdodCA9IENvcm5lckRvd25SaWdodDsKICAgIGV4cG9ydHMuQ29ybmVyTGVmdERvd24gPSBDb3JuZXJMZWZ0RG93bjsKICAgIGV4cG9ydHMuQ29ybmVyTGVmdFVwID0gQ29ybmVyTGVmdFVwOwogICAgZXhwb3J0cy5Db3JuZXJSaWdodERvd24gPSBDb3JuZXJSaWdodERvd247CiAgICBleHBvcnRzLkNvcm5lclJpZ2h0VXAgPSBDb3JuZXJSaWdodFVwOwogICAgZXhwb3J0cy5Db3JuZXJVcExlZnQgPSBDb3JuZXJVcExlZnQ7CiAgICBleHBvcnRzLkNvcm5lclVwUmlnaHQgPSBDb3JuZXJVcFJpZ2h0OwogICAgZXhwb3J0cy5DcHUgPSBDcHU7CiAgICBleHBvcnRzLkNyZWF0aXZlQ29tbW9ucyA9IENyZWF0aXZlQ29tbW9uczsKICAgIGV4cG9ydHMuQ3JlZGl0Q2FyZCA9IENyZWRpdENhcmQ7CiAgICBleHBvcnRzLkNyb2lzc2FudCA9IENyb2lzc2FudDsKICAgIGV4cG9ydHMuQ3JvcCA9IENyb3A7CiAgICBleHBvcnRzLkNyb3NzID0gQ3Jvc3M7CiAgICBleHBvcnRzLkNyb3NzaGFpciA9IENyb3NzaGFpcjsKICAgIGV4cG9ydHMuQ3Jvd24gPSBDcm93bjsKICAgIGV4cG9ydHMuQ3Vib2lkID0gQ3Vib2lkOwogICAgZXhwb3J0cy5DdXBTb2RhID0gQ3VwU29kYTsKICAgIGV4cG9ydHMuQ3VybHlCcmFjZXMgPSBCcmFjZXM7CiAgICBleHBvcnRzLkN1cnJlbmN5ID0gQ3VycmVuY3k7CiAgICBleHBvcnRzLkN5bGluZGVyID0gQ3lsaW5kZXI7CiAgICBleHBvcnRzLkRhbSA9IERhbTsKICAgIGV4cG9ydHMuRGF0YWJhc2UgPSBEYXRhYmFzZTsKICAgIGV4cG9ydHMuRGF0YWJhc2VCYWNrdXAgPSBEYXRhYmFzZUJhY2t1cDsKICAgIGV4cG9ydHMuRGF0YWJhc2VaYXAgPSBEYXRhYmFzZVphcDsKICAgIGV4cG9ydHMuRGVjaW1hbHNBcnJvd0xlZnQgPSBEZWNpbWFsc0Fycm93TGVmdDsKICAgIGV4cG9ydHMuRGVjaW1hbHNBcnJvd1JpZ2h0ID0gRGVjaW1hbHNBcnJvd1JpZ2h0OwogICAgZXhwb3J0cy5EZWxldGUgPSBEZWxldGU7CiAgICBleHBvcnRzLkRlc3NlcnQgPSBEZXNzZXJ0OwogICAgZXhwb3J0cy5EaWFtZXRlciA9IERpYW1ldGVyOwogICAgZXhwb3J0cy5EaWFtb25kID0gRGlhbW9uZDsKICAgIGV4cG9ydHMuRGlhbW9uZE1pbnVzID0gRGlhbW9uZE1pbnVzOwogICAgZXhwb3J0cy5EaWFtb25kUGVyY2VudCA9IERpYW1vbmRQZXJjZW50OwogICAgZXhwb3J0cy5EaWFtb25kUGx1cyA9IERpYW1vbmRQbHVzOwogICAgZXhwb3J0cy5EaWNlMSA9IERpY2UxOwogICAgZXhwb3J0cy5EaWNlMiA9IERpY2UyOwogICAgZXhwb3J0cy5EaWNlMyA9IERpY2UzOwogICAgZXhwb3J0cy5EaWNlNCA9IERpY2U0OwogICAgZXhwb3J0cy5EaWNlNSA9IERpY2U1OwogICAgZXhwb3J0cy5EaWNlNiA9IERpY2U2OwogICAgZXhwb3J0cy5EaWNlcyA9IERpY2VzOwogICAgZXhwb3J0cy5EaWZmID0gRGlmZjsKICAgIGV4cG9ydHMuRGlzYyA9IERpc2M7CiAgICBleHBvcnRzLkRpc2MyID0gRGlzYzI7CiAgICBleHBvcnRzLkRpc2MzID0gRGlzYzM7CiAgICBleHBvcnRzLkRpc2NBbGJ1bSA9IERpc2NBbGJ1bTsKICAgIGV4cG9ydHMuRGl2aWRlID0gRGl2aWRlOwogICAgZXhwb3J0cy5EaXZpZGVDaXJjbGUgPSBDaXJjbGVEaXZpZGU7CiAgICBleHBvcnRzLkRpdmlkZVNxdWFyZSA9IFNxdWFyZURpdmlkZTsKICAgIGV4cG9ydHMuRG5hID0gRG5hOwogICAgZXhwb3J0cy5EbmFPZmYgPSBEbmFPZmY7CiAgICBleHBvcnRzLkRvY2sgPSBEb2NrOwogICAgZXhwb3J0cy5Eb2cgPSBEb2c7CiAgICBleHBvcnRzLkRvbGxhclNpZ24gPSBEb2xsYXJTaWduOwogICAgZXhwb3J0cy5Eb251dCA9IERvbnV0OwogICAgZXhwb3J0cy5Eb29yQ2xvc2VkID0gRG9vckNsb3NlZDsKICAgIGV4cG9ydHMuRG9vckNsb3NlZExvY2tlZCA9IERvb3JDbG9zZWRMb2NrZWQ7CiAgICBleHBvcnRzLkRvb3JPcGVuID0gRG9vck9wZW47CiAgICBleHBvcnRzLkRvdCA9IERvdDsKICAgIGV4cG9ydHMuRG90U3F1YXJlID0gU3F1YXJlRG90OwogICAgZXhwb3J0cy5Eb3dubG9hZCA9IERvd25sb2FkOwogICAgZXhwb3J0cy5Eb3dubG9hZENsb3VkID0gQ2xvdWREb3dubG9hZDsKICAgIGV4cG9ydHMuRHJhZnRpbmdDb21wYXNzID0gRHJhZnRpbmdDb21wYXNzOwogICAgZXhwb3J0cy5EcmFtYSA9IERyYW1hOwogICAgZXhwb3J0cy5EcmliYmJsZSA9IERyaWJiYmxlOwogICAgZXhwb3J0cy5EcmlsbCA9IERyaWxsOwogICAgZXhwb3J0cy5Ecm9uZSA9IERyb25lOwogICAgZXhwb3J0cy5Ecm9wbGV0ID0gRHJvcGxldDsKICAgIGV4cG9ydHMuRHJvcGxldE9mZiA9IERyb3BsZXRPZmY7CiAgICBleHBvcnRzLkRyb3BsZXRzID0gRHJvcGxldHM7CiAgICBleHBvcnRzLkRydW0gPSBEcnVtOwogICAgZXhwb3J0cy5EcnVtc3RpY2sgPSBEcnVtc3RpY2s7CiAgICBleHBvcnRzLkR1bWJiZWxsID0gRHVtYmJlbGw7CiAgICBleHBvcnRzLkVhciA9IEVhcjsKICAgIGV4cG9ydHMuRWFyT2ZmID0gRWFyT2ZmOwogICAgZXhwb3J0cy5FYXJ0aCA9IEVhcnRoOwogICAgZXhwb3J0cy5FYXJ0aExvY2sgPSBFYXJ0aExvY2s7CiAgICBleHBvcnRzLkVjbGlwc2UgPSBFY2xpcHNlOwogICAgZXhwb3J0cy5FZGl0ID0gU3F1YXJlUGVuOwogICAgZXhwb3J0cy5FZGl0MiA9IFBlbjsKICAgIGV4cG9ydHMuRWRpdDMgPSBQZW5MaW5lOwogICAgZXhwb3J0cy5FZ2cgPSBFZ2c7CiAgICBleHBvcnRzLkVnZ0ZyaWVkID0gRWdnRnJpZWQ7CiAgICBleHBvcnRzLkVnZ09mZiA9IEVnZ09mZjsKICAgIGV4cG9ydHMuRWxsaXBzaXMgPSBFbGxpcHNpczsKICAgIGV4cG9ydHMuRWxsaXBzaXNWZXJ0aWNhbCA9IEVsbGlwc2lzVmVydGljYWw7CiAgICBleHBvcnRzLkVxdWFsID0gRXF1YWw7CiAgICBleHBvcnRzLkVxdWFsQXBwcm94aW1hdGVseSA9IEVxdWFsQXBwcm94aW1hdGVseTsKICAgIGV4cG9ydHMuRXF1YWxOb3QgPSBFcXVhbE5vdDsKICAgIGV4cG9ydHMuRXF1YWxTcXVhcmUgPSBTcXVhcmVFcXVhbDsKICAgIGV4cG9ydHMuRXJhc2VyID0gRXJhc2VyOwogICAgZXhwb3J0cy5FdGhlcm5ldFBvcnQgPSBFdGhlcm5ldFBvcnQ7CiAgICBleHBvcnRzLkV1cm8gPSBFdXJvOwogICAgZXhwb3J0cy5FdkNoYXJnZXIgPSBFdkNoYXJnZXI7CiAgICBleHBvcnRzLkV4cGFuZCA9IEV4cGFuZDsKICAgIGV4cG9ydHMuRXh0ZXJuYWxMaW5rID0gRXh0ZXJuYWxMaW5rOwogICAgZXhwb3J0cy5FeWUgPSBFeWU7CiAgICBleHBvcnRzLkV5ZUNsb3NlZCA9IEV5ZUNsb3NlZDsKICAgIGV4cG9ydHMuRXllT2ZmID0gRXllT2ZmOwogICAgZXhwb3J0cy5GYWNlYm9vayA9IEZhY2Vib29rOwogICAgZXhwb3J0cy5GYWN0b3J5ID0gRmFjdG9yeTsKICAgIGV4cG9ydHMuRmFuID0gRmFuOwogICAgZXhwb3J0cy5GYXN0Rm9yd2FyZCA9IEZhc3RGb3J3YXJkOwogICAgZXhwb3J0cy5GZWF0aGVyID0gRmVhdGhlcjsKICAgIGV4cG9ydHMuRmVuY2UgPSBGZW5jZTsKICAgIGV4cG9ydHMuRmVycmlzV2hlZWwgPSBGZXJyaXNXaGVlbDsKICAgIGV4cG9ydHMuRmlnbWEgPSBGaWdtYTsKICAgIGV4cG9ydHMuRmlsZSA9IEZpbGU7CiAgICBleHBvcnRzLkZpbGVBcmNoaXZlID0gRmlsZUFyY2hpdmU7CiAgICBleHBvcnRzLkZpbGVBdWRpbyA9IEZpbGVIZWFkcGhvbmU7CiAgICBleHBvcnRzLkZpbGVBdWRpbzIgPSBGaWxlSGVhZHBob25lOwogICAgZXhwb3J0cy5GaWxlQXhpczNEID0gRmlsZUF4aXMzZDsKICAgIGV4cG9ydHMuRmlsZUF4aXMzZCA9IEZpbGVBeGlzM2Q7CiAgICBleHBvcnRzLkZpbGVCYWRnZSA9IEZpbGVCYWRnZTsKICAgIGV4cG9ydHMuRmlsZUJhZGdlMiA9IEZpbGVCYWRnZTsKICAgIGV4cG9ydHMuRmlsZUJhckNoYXJ0ID0gRmlsZUNoYXJ0Q29sdW1uSW5jcmVhc2luZzsKICAgIGV4cG9ydHMuRmlsZUJhckNoYXJ0MiA9IEZpbGVDaGFydENvbHVtbjsKICAgIGV4cG9ydHMuRmlsZUJveCA9IEZpbGVCb3g7CiAgICBleHBvcnRzLkZpbGVCcmFjZXMgPSBGaWxlQnJhY2VzOwogICAgZXhwb3J0cy5GaWxlQnJhY2VzQ29ybmVyID0gRmlsZUJyYWNlc0Nvcm5lcjsKICAgIGV4cG9ydHMuRmlsZUNoYXJ0Q29sdW1uID0gRmlsZUNoYXJ0Q29sdW1uOwogICAgZXhwb3J0cy5GaWxlQ2hhcnRDb2x1bW5JbmNyZWFzaW5nID0gRmlsZUNoYXJ0Q29sdW1uSW5jcmVhc2luZzsKICAgIGV4cG9ydHMuRmlsZUNoYXJ0TGluZSA9IEZpbGVDaGFydExpbmU7CiAgICBleHBvcnRzLkZpbGVDaGFydFBpZSA9IEZpbGVDaGFydFBpZTsKICAgIGV4cG9ydHMuRmlsZUNoZWNrID0gRmlsZUNoZWNrOwogICAgZXhwb3J0cy5GaWxlQ2hlY2syID0gRmlsZUNoZWNrQ29ybmVyOwogICAgZXhwb3J0cy5GaWxlQ2hlY2tDb3JuZXIgPSBGaWxlQ2hlY2tDb3JuZXI7CiAgICBleHBvcnRzLkZpbGVDbG9jayA9IEZpbGVDbG9jazsKICAgIGV4cG9ydHMuRmlsZUNvZGUgPSBGaWxlQ29kZTsKICAgIGV4cG9ydHMuRmlsZUNvZGUyID0gRmlsZUNvZGVDb3JuZXI7CiAgICBleHBvcnRzLkZpbGVDb2RlQ29ybmVyID0gRmlsZUNvZGVDb3JuZXI7CiAgICBleHBvcnRzLkZpbGVDb2cgPSBGaWxlQ29nOwogICAgZXhwb3J0cy5GaWxlQ29nMiA9IEZpbGVDb2c7CiAgICBleHBvcnRzLkZpbGVEaWZmID0gRmlsZURpZmY7CiAgICBleHBvcnRzLkZpbGVEaWdpdCA9IEZpbGVEaWdpdDsKICAgIGV4cG9ydHMuRmlsZURvd24gPSBGaWxlRG93bjsKICAgIGV4cG9ydHMuRmlsZUVkaXQgPSBGaWxlUGVuOwogICAgZXhwb3J0cy5GaWxlRXhjbGFtYXRpb25Qb2ludCA9IEZpbGVFeGNsYW1hdGlvblBvaW50OwogICAgZXhwb3J0cy5GaWxlSGVhZHBob25lID0gRmlsZUhlYWRwaG9uZTsKICAgIGV4cG9ydHMuRmlsZUhlYXJ0ID0gRmlsZUhlYXJ0OwogICAgZXhwb3J0cy5GaWxlSW1hZ2UgPSBGaWxlSW1hZ2U7CiAgICBleHBvcnRzLkZpbGVJbnB1dCA9IEZpbGVJbnB1dDsKICAgIGV4cG9ydHMuRmlsZUpzb24gPSBGaWxlQnJhY2VzOwogICAgZXhwb3J0cy5GaWxlSnNvbjIgPSBGaWxlQnJhY2VzQ29ybmVyOwogICAgZXhwb3J0cy5GaWxlS2V5ID0gRmlsZUtleTsKICAgIGV4cG9ydHMuRmlsZUtleTIgPSBGaWxlS2V5OwogICAgZXhwb3J0cy5GaWxlTGluZUNoYXJ0ID0gRmlsZUNoYXJ0TGluZTsKICAgIGV4cG9ydHMuRmlsZUxvY2sgPSBGaWxlTG9jazsKICAgIGV4cG9ydHMuRmlsZUxvY2syID0gRmlsZUxvY2s7CiAgICBleHBvcnRzLkZpbGVNaW51cyA9IEZpbGVNaW51czsKICAgIGV4cG9ydHMuRmlsZU1pbnVzMiA9IEZpbGVNaW51c0Nvcm5lcjsKICAgIGV4cG9ydHMuRmlsZU1pbnVzQ29ybmVyID0gRmlsZU1pbnVzQ29ybmVyOwogICAgZXhwb3J0cy5GaWxlTXVzaWMgPSBGaWxlTXVzaWM7CiAgICBleHBvcnRzLkZpbGVPdXRwdXQgPSBGaWxlT3V0cHV0OwogICAgZXhwb3J0cy5GaWxlUGVuID0gRmlsZVBlbjsKICAgIGV4cG9ydHMuRmlsZVBlbkxpbmUgPSBGaWxlUGVuTGluZTsKICAgIGV4cG9ydHMuRmlsZVBpZUNoYXJ0ID0gRmlsZUNoYXJ0UGllOwogICAgZXhwb3J0cy5GaWxlUGxheSA9IEZpbGVQbGF5OwogICAgZXhwb3J0cy5GaWxlUGx1cyA9IEZpbGVQbHVzOwogICAgZXhwb3J0cy5GaWxlUGx1czIgPSBGaWxlUGx1c0Nvcm5lcjsKICAgIGV4cG9ydHMuRmlsZVBsdXNDb3JuZXIgPSBGaWxlUGx1c0Nvcm5lcjsKICAgIGV4cG9ydHMuRmlsZVF1ZXN0aW9uID0gRmlsZVF1ZXN0aW9uTWFyazsKICAgIGV4cG9ydHMuRmlsZVF1ZXN0aW9uTWFyayA9IEZpbGVRdWVzdGlvbk1hcms7CiAgICBleHBvcnRzLkZpbGVTY2FuID0gRmlsZVNjYW47CiAgICBleHBvcnRzLkZpbGVTZWFyY2ggPSBGaWxlU2VhcmNoOwogICAgZXhwb3J0cy5GaWxlU2VhcmNoMiA9IEZpbGVTZWFyY2hDb3JuZXI7CiAgICBleHBvcnRzLkZpbGVTZWFyY2hDb3JuZXIgPSBGaWxlU2VhcmNoQ29ybmVyOwogICAgZXhwb3J0cy5GaWxlU2lnbmFsID0gRmlsZVNpZ25hbDsKICAgIGV4cG9ydHMuRmlsZVNpZ25hdHVyZSA9IEZpbGVQZW5MaW5lOwogICAgZXhwb3J0cy5GaWxlU2xpZGVycyA9IEZpbGVTbGlkZXJzOwogICAgZXhwb3J0cy5GaWxlU3ByZWFkc2hlZXQgPSBGaWxlU3ByZWFkc2hlZXQ7CiAgICBleHBvcnRzLkZpbGVTdGFjayA9IEZpbGVTdGFjazsKICAgIGV4cG9ydHMuRmlsZVN5bWxpbmsgPSBGaWxlU3ltbGluazsKICAgIGV4cG9ydHMuRmlsZVRlcm1pbmFsID0gRmlsZVRlcm1pbmFsOwogICAgZXhwb3J0cy5GaWxlVGV4dCA9IEZpbGVUZXh0OwogICAgZXhwb3J0cy5GaWxlVHlwZSA9IEZpbGVUeXBlOwogICAgZXhwb3J0cy5GaWxlVHlwZTIgPSBGaWxlVHlwZUNvcm5lcjsKICAgIGV4cG9ydHMuRmlsZVR5cGVDb3JuZXIgPSBGaWxlVHlwZUNvcm5lcjsKICAgIGV4cG9ydHMuRmlsZVVwID0gRmlsZVVwOwogICAgZXhwb3J0cy5GaWxlVXNlciA9IEZpbGVVc2VyOwogICAgZXhwb3J0cy5GaWxlVmlkZW8gPSBGaWxlUGxheTsKICAgIGV4cG9ydHMuRmlsZVZpZGVvMiA9IEZpbGVWaWRlb0NhbWVyYTsKICAgIGV4cG9ydHMuRmlsZVZpZGVvQ2FtZXJhID0gRmlsZVZpZGVvQ2FtZXJhOwogICAgZXhwb3J0cy5GaWxlVm9sdW1lID0gRmlsZVZvbHVtZTsKICAgIGV4cG9ydHMuRmlsZVZvbHVtZTIgPSBGaWxlU2lnbmFsOwogICAgZXhwb3J0cy5GaWxlV2FybmluZyA9IEZpbGVFeGNsYW1hdGlvblBvaW50OwogICAgZXhwb3J0cy5GaWxlWCA9IEZpbGVYOwogICAgZXhwb3J0cy5GaWxlWDIgPSBGaWxlWENvcm5lcjsKICAgIGV4cG9ydHMuRmlsZVhDb3JuZXIgPSBGaWxlWENvcm5lcjsKICAgIGV4cG9ydHMuRmlsZXMgPSBGaWxlczsKICAgIGV4cG9ydHMuRmlsbSA9IEZpbG07CiAgICBleHBvcnRzLkZpbHRlciA9IEZ1bm5lbDsKICAgIGV4cG9ydHMuRmlsdGVyWCA9IEZ1bm5lbFg7CiAgICBleHBvcnRzLkZpbmdlcnByaW50ID0gRmluZ2VycHJpbnRQYXR0ZXJuOwogICAgZXhwb3J0cy5GaW5nZXJwcmludFBhdHRlcm4gPSBGaW5nZXJwcmludFBhdHRlcm47CiAgICBleHBvcnRzLkZpcmVFeHRpbmd1aXNoZXIgPSBGaXJlRXh0aW5ndWlzaGVyOwogICAgZXhwb3J0cy5GaXNoID0gRmlzaDsKICAgIGV4cG9ydHMuRmlzaE9mZiA9IEZpc2hPZmY7CiAgICBleHBvcnRzLkZpc2hTeW1ib2wgPSBGaXNoU3ltYm9sOwogICAgZXhwb3J0cy5GaXNoaW5nSG9vayA9IEZpc2hpbmdIb29rOwogICAgZXhwb3J0cy5GbGFnID0gRmxhZzsKICAgIGV4cG9ydHMuRmxhZ09mZiA9IEZsYWdPZmY7CiAgICBleHBvcnRzLkZsYWdUcmlhbmdsZUxlZnQgPSBGbGFnVHJpYW5nbGVMZWZ0OwogICAgZXhwb3J0cy5GbGFnVHJpYW5nbGVSaWdodCA9IEZsYWdUcmlhbmdsZVJpZ2h0OwogICAgZXhwb3J0cy5GbGFtZSA9IEZsYW1lOwogICAgZXhwb3J0cy5GbGFtZUtpbmRsaW5nID0gRmxhbWVLaW5kbGluZzsKICAgIGV4cG9ydHMuRmxhc2hsaWdodCA9IEZsYXNobGlnaHQ7CiAgICBleHBvcnRzLkZsYXNobGlnaHRPZmYgPSBGbGFzaGxpZ2h0T2ZmOwogICAgZXhwb3J0cy5GbGFza0NvbmljYWwgPSBGbGFza0NvbmljYWw7CiAgICBleHBvcnRzLkZsYXNrQ29uaWNhbE9mZiA9IEZsYXNrQ29uaWNhbE9mZjsKICAgIGV4cG9ydHMuRmxhc2tSb3VuZCA9IEZsYXNrUm91bmQ7CiAgICBleHBvcnRzLkZsaXBIb3Jpem9udGFsID0gRmxpcEhvcml6b250YWw7CiAgICBleHBvcnRzLkZsaXBIb3Jpem9udGFsMiA9IEZsaXBIb3Jpem9udGFsMjsKICAgIGV4cG9ydHMuRmxpcFZlcnRpY2FsID0gRmxpcFZlcnRpY2FsOwogICAgZXhwb3J0cy5GbGlwVmVydGljYWwyID0gRmxpcFZlcnRpY2FsMjsKICAgIGV4cG9ydHMuRmxvd2VyID0gRmxvd2VyOwogICAgZXhwb3J0cy5GbG93ZXIyID0gRmxvd2VyMjsKICAgIGV4cG9ydHMuRm9jdXMgPSBGb2N1czsKICAgIGV4cG9ydHMuRm9sZEhvcml6b250YWwgPSBGb2xkSG9yaXpvbnRhbDsKICAgIGV4cG9ydHMuRm9sZFZlcnRpY2FsID0gRm9sZFZlcnRpY2FsOwogICAgZXhwb3J0cy5Gb2xkZXIgPSBGb2xkZXI7CiAgICBleHBvcnRzLkZvbGRlckFyY2hpdmUgPSBGb2xkZXJBcmNoaXZlOwogICAgZXhwb3J0cy5Gb2xkZXJDaGVjayA9IEZvbGRlckNoZWNrOwogICAgZXhwb3J0cy5Gb2xkZXJDbG9jayA9IEZvbGRlckNsb2NrOwogICAgZXhwb3J0cy5Gb2xkZXJDbG9zZWQgPSBGb2xkZXJDbG9zZWQ7CiAgICBleHBvcnRzLkZvbGRlckNvZGUgPSBGb2xkZXJDb2RlOwogICAgZXhwb3J0cy5Gb2xkZXJDb2cgPSBGb2xkZXJDb2c7CiAgICBleHBvcnRzLkZvbGRlckNvZzIgPSBGb2xkZXJDb2c7CiAgICBleHBvcnRzLkZvbGRlckRvdCA9IEZvbGRlckRvdDsKICAgIGV4cG9ydHMuRm9sZGVyRG93biA9IEZvbGRlckRvd247CiAgICBleHBvcnRzLkZvbGRlckVkaXQgPSBGb2xkZXJQZW47CiAgICBleHBvcnRzLkZvbGRlckdpdCA9IEZvbGRlckdpdDsKICAgIGV4cG9ydHMuRm9sZGVyR2l0MiA9IEZvbGRlckdpdDI7CiAgICBleHBvcnRzLkZvbGRlckhlYXJ0ID0gRm9sZGVySGVhcnQ7CiAgICBleHBvcnRzLkZvbGRlcklucHV0ID0gRm9sZGVySW5wdXQ7CiAgICBleHBvcnRzLkZvbGRlckthbmJhbiA9IEZvbGRlckthbmJhbjsKICAgIGV4cG9ydHMuRm9sZGVyS2V5ID0gRm9sZGVyS2V5OwogICAgZXhwb3J0cy5Gb2xkZXJMb2NrID0gRm9sZGVyTG9jazsKICAgIGV4cG9ydHMuRm9sZGVyTWludXMgPSBGb2xkZXJNaW51czsKICAgIGV4cG9ydHMuRm9sZGVyT3BlbiA9IEZvbGRlck9wZW47CiAgICBleHBvcnRzLkZvbGRlck9wZW5Eb3QgPSBGb2xkZXJPcGVuRG90OwogICAgZXhwb3J0cy5Gb2xkZXJPdXRwdXQgPSBGb2xkZXJPdXRwdXQ7CiAgICBleHBvcnRzLkZvbGRlclBlbiA9IEZvbGRlclBlbjsKICAgIGV4cG9ydHMuRm9sZGVyUGx1cyA9IEZvbGRlclBsdXM7CiAgICBleHBvcnRzLkZvbGRlclJvb3QgPSBGb2xkZXJSb290OwogICAgZXhwb3J0cy5Gb2xkZXJTZWFyY2ggPSBGb2xkZXJTZWFyY2g7CiAgICBleHBvcnRzLkZvbGRlclNlYXJjaDIgPSBGb2xkZXJTZWFyY2gyOwogICAgZXhwb3J0cy5Gb2xkZXJTeW1saW5rID0gRm9sZGVyU3ltbGluazsKICAgIGV4cG9ydHMuRm9sZGVyU3luYyA9IEZvbGRlclN5bmM7CiAgICBleHBvcnRzLkZvbGRlclRyZWUgPSBGb2xkZXJUcmVlOwogICAgZXhwb3J0cy5Gb2xkZXJVcCA9IEZvbGRlclVwOwogICAgZXhwb3J0cy5Gb2xkZXJYID0gRm9sZGVyWDsKICAgIGV4cG9ydHMuRm9sZGVycyA9IEZvbGRlcnM7CiAgICBleHBvcnRzLkZvb3RwcmludHMgPSBGb290cHJpbnRzOwogICAgZXhwb3J0cy5Gb3JrS25pZmUgPSBVdGVuc2lsczsKICAgIGV4cG9ydHMuRm9ya0tuaWZlQ3Jvc3NlZCA9IFV0ZW5zaWxzQ3Jvc3NlZDsKICAgIGV4cG9ydHMuRm9ya2xpZnQgPSBGb3JrbGlmdDsKICAgIGV4cG9ydHMuRm9ybSA9IEZvcm07CiAgICBleHBvcnRzLkZvcm1JbnB1dCA9IFJlY3RhbmdsZUVsbGlwc2lzOwogICAgZXhwb3J0cy5Gb3J3YXJkID0gRm9yd2FyZDsKICAgIGV4cG9ydHMuRnJhbWUgPSBGcmFtZTsKICAgIGV4cG9ydHMuRnJhbWVyID0gRnJhbWVyOwogICAgZXhwb3J0cy5Gcm93biA9IEZyb3duOwogICAgZXhwb3J0cy5GdWVsID0gRnVlbDsKICAgIGV4cG9ydHMuRnVsbHNjcmVlbiA9IEZ1bGxzY3JlZW47CiAgICBleHBvcnRzLkZ1bmN0aW9uU3F1YXJlID0gU3F1YXJlRnVuY3Rpb247CiAgICBleHBvcnRzLkZ1bm5lbCA9IEZ1bm5lbDsKICAgIGV4cG9ydHMuRnVubmVsUGx1cyA9IEZ1bm5lbFBsdXM7CiAgICBleHBvcnRzLkZ1bm5lbFggPSBGdW5uZWxYOwogICAgZXhwb3J0cy5HYWxsZXJ5SG9yaXpvbnRhbCA9IEdhbGxlcnlIb3Jpem9udGFsOwogICAgZXhwb3J0cy5HYWxsZXJ5SG9yaXpvbnRhbEVuZCA9IEdhbGxlcnlIb3Jpem9udGFsRW5kOwogICAgZXhwb3J0cy5HYWxsZXJ5VGh1bWJuYWlscyA9IEdhbGxlcnlUaHVtYm5haWxzOwogICAgZXhwb3J0cy5HYWxsZXJ5VmVydGljYWwgPSBHYWxsZXJ5VmVydGljYWw7CiAgICBleHBvcnRzLkdhbGxlcnlWZXJ0aWNhbEVuZCA9IEdhbGxlcnlWZXJ0aWNhbEVuZDsKICAgIGV4cG9ydHMuR2FtZXBhZCA9IEdhbWVwYWQ7CiAgICBleHBvcnRzLkdhbWVwYWQyID0gR2FtZXBhZDI7CiAgICBleHBvcnRzLkdhbWVwYWREaXJlY3Rpb25hbCA9IEdhbWVwYWREaXJlY3Rpb25hbDsKICAgIGV4cG9ydHMuR2FudHRDaGFydCA9IENoYXJ0Tm9BeGVzR2FudHQ7CiAgICBleHBvcnRzLkdhbnR0Q2hhcnRTcXVhcmUgPSBTcXVhcmVDaGFydEdhbnR0OwogICAgZXhwb3J0cy5HYXVnZSA9IEdhdWdlOwogICAgZXhwb3J0cy5HYXVnZUNpcmNsZSA9IENpcmNsZUdhdWdlOwogICAgZXhwb3J0cy5HYXZlbCA9IEdhdmVsOwogICAgZXhwb3J0cy5HZW0gPSBHZW07CiAgICBleHBvcnRzLkdlb3JnaWFuTGFyaSA9IEdlb3JnaWFuTGFyaTsKICAgIGV4cG9ydHMuR2hvc3QgPSBHaG9zdDsKICAgIGV4cG9ydHMuR2lmdCA9IEdpZnQ7CiAgICBleHBvcnRzLkdpdEJyYW5jaCA9IEdpdEJyYW5jaDsKICAgIGV4cG9ydHMuR2l0QnJhbmNoTWludXMgPSBHaXRCcmFuY2hNaW51czsKICAgIGV4cG9ydHMuR2l0QnJhbmNoUGx1cyA9IEdpdEJyYW5jaFBsdXM7CiAgICBleHBvcnRzLkdpdENvbW1pdCA9IEdpdENvbW1pdEhvcml6b250YWw7CiAgICBleHBvcnRzLkdpdENvbW1pdEhvcml6b250YWwgPSBHaXRDb21taXRIb3Jpem9udGFsOwogICAgZXhwb3J0cy5HaXRDb21taXRWZXJ0aWNhbCA9IEdpdENvbW1pdFZlcnRpY2FsOwogICAgZXhwb3J0cy5HaXRDb21wYXJlID0gR2l0Q29tcGFyZTsKICAgIGV4cG9ydHMuR2l0Q29tcGFyZUFycm93cyA9IEdpdENvbXBhcmVBcnJvd3M7CiAgICBleHBvcnRzLkdpdEZvcmsgPSBHaXRGb3JrOwogICAgZXhwb3J0cy5HaXRHcmFwaCA9IEdpdEdyYXBoOwogICAgZXhwb3J0cy5HaXRNZXJnZSA9IEdpdE1lcmdlOwogICAgZXhwb3J0cy5HaXRQdWxsUmVxdWVzdCA9IEdpdFB1bGxSZXF1ZXN0OwogICAgZXhwb3J0cy5HaXRQdWxsUmVxdWVzdEFycm93ID0gR2l0UHVsbFJlcXVlc3RBcnJvdzsKICAgIGV4cG9ydHMuR2l0UHVsbFJlcXVlc3RDbG9zZWQgPSBHaXRQdWxsUmVxdWVzdENsb3NlZDsKICAgIGV4cG9ydHMuR2l0UHVsbFJlcXVlc3RDcmVhdGUgPSBHaXRQdWxsUmVxdWVzdENyZWF0ZTsKICAgIGV4cG9ydHMuR2l0UHVsbFJlcXVlc3RDcmVhdGVBcnJvdyA9IEdpdFB1bGxSZXF1ZXN0Q3JlYXRlQXJyb3c7CiAgICBleHBvcnRzLkdpdFB1bGxSZXF1ZXN0RHJhZnQgPSBHaXRQdWxsUmVxdWVzdERyYWZ0OwogICAgZXhwb3J0cy5HaXRodWIgPSBHaXRodWI7CiAgICBleHBvcnRzLkdpdGxhYiA9IEdpdGxhYjsKICAgIGV4cG9ydHMuR2xhc3NXYXRlciA9IEdsYXNzV2F0ZXI7CiAgICBleHBvcnRzLkdsYXNzZXMgPSBHbGFzc2VzOwogICAgZXhwb3J0cy5HbG9iZSA9IEdsb2JlOwogICAgZXhwb3J0cy5HbG9iZTIgPSBFYXJ0aDsKICAgIGV4cG9ydHMuR2xvYmVMb2NrID0gR2xvYmVMb2NrOwogICAgZXhwb3J0cy5HbG9iZVggPSBHbG9iZVg7CiAgICBleHBvcnRzLkdvYWwgPSBHb2FsOwogICAgZXhwb3J0cy5HcHUgPSBHcHU7CiAgICBleHBvcnRzLkdyYWIgPSBIYW5kR3JhYjsKICAgIGV4cG9ydHMuR3JhZHVhdGlvbkNhcCA9IEdyYWR1YXRpb25DYXA7CiAgICBleHBvcnRzLkdyYXBlID0gR3JhcGU7CiAgICBleHBvcnRzLkdyaWQgPSBHcmlkM3gzOwogICAgZXhwb3J0cy5HcmlkMlgyID0gR3JpZDJ4MjsKICAgIGV4cG9ydHMuR3JpZDJYMkNoZWNrID0gR3JpZDJ4MkNoZWNrOwogICAgZXhwb3J0cy5HcmlkMlgyUGx1cyA9IEdyaWQyeDJQbHVzOwogICAgZXhwb3J0cy5HcmlkMlgyWCA9IEdyaWQyeDJYOwogICAgZXhwb3J0cy5HcmlkMngyID0gR3JpZDJ4MjsKICAgIGV4cG9ydHMuR3JpZDJ4MkNoZWNrID0gR3JpZDJ4MkNoZWNrOwogICAgZXhwb3J0cy5HcmlkMngyUGx1cyA9IEdyaWQyeDJQbHVzOwogICAgZXhwb3J0cy5HcmlkMngyWCA9IEdyaWQyeDJYOwogICAgZXhwb3J0cy5HcmlkM1gzID0gR3JpZDN4MzsKICAgIGV4cG9ydHMuR3JpZDN4MiA9IEdyaWQzeDI7CiAgICBleHBvcnRzLkdyaWQzeDMgPSBHcmlkM3gzOwogICAgZXhwb3J0cy5HcmlwID0gR3JpcDsKICAgIGV4cG9ydHMuR3JpcEhvcml6b250YWwgPSBHcmlwSG9yaXpvbnRhbDsKICAgIGV4cG9ydHMuR3JpcFZlcnRpY2FsID0gR3JpcFZlcnRpY2FsOwogICAgZXhwb3J0cy5Hcm91cCA9IEdyb3VwOwogICAgZXhwb3J0cy5HdWl0YXIgPSBHdWl0YXI7CiAgICBleHBvcnRzLkhhbSA9IEhhbTsKICAgIGV4cG9ydHMuSGFtYnVyZ2VyID0gSGFtYnVyZ2VyOwogICAgZXhwb3J0cy5IYW1tZXIgPSBIYW1tZXI7CiAgICBleHBvcnRzLkhhbmQgPSBIYW5kOwogICAgZXhwb3J0cy5IYW5kQ29pbnMgPSBIYW5kQ29pbnM7CiAgICBleHBvcnRzLkhhbmRGaXN0ID0gSGFuZEZpc3Q7CiAgICBleHBvcnRzLkhhbmRHcmFiID0gSGFuZEdyYWI7CiAgICBleHBvcnRzLkhhbmRIZWFydCA9IEhhbmRIZWFydDsKICAgIGV4cG9ydHMuSGFuZEhlbHBpbmcgPSBIYW5kSGVscGluZzsKICAgIGV4cG9ydHMuSGFuZE1ldGFsID0gSGFuZE1ldGFsOwogICAgZXhwb3J0cy5IYW5kUGxhdHRlciA9IEhhbmRQbGF0dGVyOwogICAgZXhwb3J0cy5IYW5kYmFnID0gSGFuZGJhZzsKICAgIGV4cG9ydHMuSGFuZHNoYWtlID0gSGFuZHNoYWtlOwogICAgZXhwb3J0cy5IYXJkRHJpdmUgPSBIYXJkRHJpdmU7CiAgICBleHBvcnRzLkhhcmREcml2ZURvd25sb2FkID0gSGFyZERyaXZlRG93bmxvYWQ7CiAgICBleHBvcnRzLkhhcmREcml2ZVVwbG9hZCA9IEhhcmREcml2ZVVwbG9hZDsKICAgIGV4cG9ydHMuSGFyZEhhdCA9IEhhcmRIYXQ7CiAgICBleHBvcnRzLkhhc2ggPSBIYXNoOwogICAgZXhwb3J0cy5IYXRHbGFzc2VzID0gSGF0R2xhc3NlczsKICAgIGV4cG9ydHMuSGF6ZSA9IEhhemU7CiAgICBleHBvcnRzLkhkID0gSGQ7CiAgICBleHBvcnRzLkhkbWlQb3J0ID0gSGRtaVBvcnQ7CiAgICBleHBvcnRzLkhlYWRpbmcgPSBIZWFkaW5nOwogICAgZXhwb3J0cy5IZWFkaW5nMSA9IEhlYWRpbmcxOwogICAgZXhwb3J0cy5IZWFkaW5nMiA9IEhlYWRpbmcyOwogICAgZXhwb3J0cy5IZWFkaW5nMyA9IEhlYWRpbmczOwogICAgZXhwb3J0cy5IZWFkaW5nNCA9IEhlYWRpbmc0OwogICAgZXhwb3J0cy5IZWFkaW5nNSA9IEhlYWRpbmc1OwogICAgZXhwb3J0cy5IZWFkaW5nNiA9IEhlYWRpbmc2OwogICAgZXhwb3J0cy5IZWFkcGhvbmVPZmYgPSBIZWFkcGhvbmVPZmY7CiAgICBleHBvcnRzLkhlYWRwaG9uZXMgPSBIZWFkcGhvbmVzOwogICAgZXhwb3J0cy5IZWFkc2V0ID0gSGVhZHNldDsKICAgIGV4cG9ydHMuSGVhcnQgPSBIZWFydDsKICAgIGV4cG9ydHMuSGVhcnRDcmFjayA9IEhlYXJ0Q3JhY2s7CiAgICBleHBvcnRzLkhlYXJ0SGFuZHNoYWtlID0gSGVhcnRIYW5kc2hha2U7CiAgICBleHBvcnRzLkhlYXJ0TWludXMgPSBIZWFydE1pbnVzOwogICAgZXhwb3J0cy5IZWFydE9mZiA9IEhlYXJ0T2ZmOwogICAgZXhwb3J0cy5IZWFydFBsdXMgPSBIZWFydFBsdXM7CiAgICBleHBvcnRzLkhlYXJ0UHVsc2UgPSBIZWFydFB1bHNlOwogICAgZXhwb3J0cy5IZWF0ZXIgPSBIZWF0ZXI7CiAgICBleHBvcnRzLkhlbGljb3B0ZXIgPSBIZWxpY29wdGVyOwogICAgZXhwb3J0cy5IZWxwQ2lyY2xlID0gQ2lyY2xlUXVlc3Rpb25NYXJrOwogICAgZXhwb3J0cy5IZWxwaW5nSGFuZCA9IEhhbmRIZWxwaW5nOwogICAgZXhwb3J0cy5IZXhhZ29uID0gSGV4YWdvbjsKICAgIGV4cG9ydHMuSGlnaGxpZ2h0ZXIgPSBIaWdobGlnaHRlcjsKICAgIGV4cG9ydHMuSGlzdG9yeSA9IEhpc3Rvcnk7CiAgICBleHBvcnRzLkhvbWUgPSBIb3VzZTsKICAgIGV4cG9ydHMuSG9wID0gSG9wOwogICAgZXhwb3J0cy5Ib3BPZmYgPSBIb3BPZmY7CiAgICBleHBvcnRzLkhvc3BpdGFsID0gSG9zcGl0YWw7CiAgICBleHBvcnRzLkhvdGVsID0gSG90ZWw7CiAgICBleHBvcnRzLkhvdXJnbGFzcyA9IEhvdXJnbGFzczsKICAgIGV4cG9ydHMuSG91c2UgPSBIb3VzZTsKICAgIGV4cG9ydHMuSG91c2VIZWFydCA9IEhvdXNlSGVhcnQ7CiAgICBleHBvcnRzLkhvdXNlUGx1ZyA9IEhvdXNlUGx1ZzsKICAgIGV4cG9ydHMuSG91c2VQbHVzID0gSG91c2VQbHVzOwogICAgZXhwb3J0cy5Ib3VzZVdpZmkgPSBIb3VzZVdpZmk7CiAgICBleHBvcnRzLkljZUNyZWFtID0gSWNlQ3JlYW1Db25lOwogICAgZXhwb3J0cy5JY2VDcmVhbTIgPSBJY2VDcmVhbUJvd2w7CiAgICBleHBvcnRzLkljZUNyZWFtQm93bCA9IEljZUNyZWFtQm93bDsKICAgIGV4cG9ydHMuSWNlQ3JlYW1Db25lID0gSWNlQ3JlYW1Db25lOwogICAgZXhwb3J0cy5JZENhcmQgPSBJZENhcmQ7CiAgICBleHBvcnRzLklkQ2FyZExhbnlhcmQgPSBJZENhcmRMYW55YXJkOwogICAgZXhwb3J0cy5JbWFnZSA9IEltYWdlMjsKICAgIGV4cG9ydHMuSW1hZ2VEb3duID0gSW1hZ2VEb3duOwogICAgZXhwb3J0cy5JbWFnZU1pbnVzID0gSW1hZ2VNaW51czsKICAgIGV4cG9ydHMuSW1hZ2VPZmYgPSBJbWFnZU9mZjsKICAgIGV4cG9ydHMuSW1hZ2VQbGF5ID0gSW1hZ2VQbGF5OwogICAgZXhwb3J0cy5JbWFnZVBsdXMgPSBJbWFnZVBsdXM7CiAgICBleHBvcnRzLkltYWdlVXAgPSBJbWFnZVVwOwogICAgZXhwb3J0cy5JbWFnZVVwc2NhbGUgPSBJbWFnZVVwc2NhbGU7CiAgICBleHBvcnRzLkltYWdlcyA9IEltYWdlczsKICAgIGV4cG9ydHMuSW1wb3J0ID0gSW1wb3J0OwogICAgZXhwb3J0cy5JbmJveCA9IEluYm94OwogICAgZXhwb3J0cy5JbmRlbnQgPSBMaXN0SW5kZW50SW5jcmVhc2U7CiAgICBleHBvcnRzLkluZGVudERlY3JlYXNlID0gTGlzdEluZGVudERlY3JlYXNlOwogICAgZXhwb3J0cy5JbmRlbnRJbmNyZWFzZSA9IExpc3RJbmRlbnRJbmNyZWFzZTsKICAgIGV4cG9ydHMuSW5kaWFuUnVwZWUgPSBJbmRpYW5SdXBlZTsKICAgIGV4cG9ydHMuSW5maW5pdHkgPSBJbmZpbml0eTI7CiAgICBleHBvcnRzLkluZm8gPSBJbmZvMjsKICAgIGV4cG9ydHMuSW5zcGVjdCA9IFNxdWFyZU1vdXNlUG9pbnRlcjsKICAgIGV4cG9ydHMuSW5zcGVjdGlvblBhbmVsID0gSW5zcGVjdGlvblBhbmVsOwogICAgZXhwb3J0cy5JbnN0YWdyYW0gPSBJbnN0YWdyYW07CiAgICBleHBvcnRzLkl0YWxpYyA9IEl0YWxpYzsKICAgIGV4cG9ydHMuSXRlcmF0aW9uQ2N3ID0gSXRlcmF0aW9uQ2N3OwogICAgZXhwb3J0cy5JdGVyYXRpb25DdyA9IEl0ZXJhdGlvbkN3OwogICAgZXhwb3J0cy5KYXBhbmVzZVllbiA9IEphcGFuZXNlWWVuOwogICAgZXhwb3J0cy5Kb3lzdGljayA9IEpveXN0aWNrOwogICAgZXhwb3J0cy5LYW5iYW4gPSBLYW5iYW47CiAgICBleHBvcnRzLkthbmJhblNxdWFyZSA9IFNxdWFyZUthbmJhbjsKICAgIGV4cG9ydHMuS2FuYmFuU3F1YXJlRGFzaGVkID0gU3F1YXJlRGFzaGVkS2FuYmFuOwogICAgZXhwb3J0cy5LYXlhayA9IEtheWFrOwogICAgZXhwb3J0cy5LZXkgPSBLZXkyOwogICAgZXhwb3J0cy5LZXlSb3VuZCA9IEtleVJvdW5kOwogICAgZXhwb3J0cy5LZXlTcXVhcmUgPSBLZXlTcXVhcmU7CiAgICBleHBvcnRzLktleWJvYXJkID0gS2V5Ym9hcmQyOwogICAgZXhwb3J0cy5LZXlib2FyZE11c2ljID0gS2V5Ym9hcmRNdXNpYzsKICAgIGV4cG9ydHMuS2V5Ym9hcmRPZmYgPSBLZXlib2FyZE9mZjsKICAgIGV4cG9ydHMuTGFtcCA9IExhbXA7CiAgICBleHBvcnRzLkxhbXBDZWlsaW5nID0gTGFtcENlaWxpbmc7CiAgICBleHBvcnRzLkxhbXBEZXNrID0gTGFtcERlc2s7CiAgICBleHBvcnRzLkxhbXBGbG9vciA9IExhbXBGbG9vcjsKICAgIGV4cG9ydHMuTGFtcFdhbGxEb3duID0gTGFtcFdhbGxEb3duOwogICAgZXhwb3J0cy5MYW1wV2FsbFVwID0gTGFtcFdhbGxVcDsKICAgIGV4cG9ydHMuTGFuZFBsb3QgPSBMYW5kUGxvdDsKICAgIGV4cG9ydHMuTGFuZG1hcmsgPSBMYW5kbWFyazsKICAgIGV4cG9ydHMuTGFuZ3VhZ2VzID0gTGFuZ3VhZ2VzOwogICAgZXhwb3J0cy5MYXB0b3AgPSBMYXB0b3A7CiAgICBleHBvcnRzLkxhcHRvcDIgPSBMYXB0b3BNaW5pbWFsOwogICAgZXhwb3J0cy5MYXB0b3BNaW5pbWFsID0gTGFwdG9wTWluaW1hbDsKICAgIGV4cG9ydHMuTGFwdG9wTWluaW1hbENoZWNrID0gTGFwdG9wTWluaW1hbENoZWNrOwogICAgZXhwb3J0cy5MYXNzbyA9IExhc3NvOwogICAgZXhwb3J0cy5MYXNzb1NlbGVjdCA9IExhc3NvU2VsZWN0OwogICAgZXhwb3J0cy5MYXVnaCA9IExhdWdoOwogICAgZXhwb3J0cy5MYXllcnMgPSBMYXllcnMzOwogICAgZXhwb3J0cy5MYXllcnMyID0gTGF5ZXJzMjsKICAgIGV4cG9ydHMuTGF5ZXJzMyA9IExheWVyczM7CiAgICBleHBvcnRzLkxheWVyc1BsdXMgPSBMYXllcnNQbHVzOwogICAgZXhwb3J0cy5MYXlvdXQgPSBQYW5lbHNUb3BMZWZ0OwogICAgZXhwb3J0cy5MYXlvdXREYXNoYm9hcmQgPSBMYXlvdXREYXNoYm9hcmQ7CiAgICBleHBvcnRzLkxheW91dEdyaWQgPSBMYXlvdXRHcmlkOwogICAgZXhwb3J0cy5MYXlvdXRMaXN0ID0gTGF5b3V0TGlzdDsKICAgIGV4cG9ydHMuTGF5b3V0UGFuZWxMZWZ0ID0gTGF5b3V0UGFuZWxMZWZ0OwogICAgZXhwb3J0cy5MYXlvdXRQYW5lbFRvcCA9IExheW91dFBhbmVsVG9wOwogICAgZXhwb3J0cy5MYXlvdXRUZW1wbGF0ZSA9IExheW91dFRlbXBsYXRlOwogICAgZXhwb3J0cy5MZWFmID0gTGVhZjsKICAgIGV4cG9ydHMuTGVhZnlHcmVlbiA9IExlYWZ5R3JlZW47CiAgICBleHBvcnRzLkxlY3Rlcm4gPSBMZWN0ZXJuOwogICAgZXhwb3J0cy5MZXR0ZXJUZXh0ID0gVGV4dEluaXRpYWw7CiAgICBleHBvcnRzLkxpYnJhcnkgPSBMaWJyYXJ5MjsKICAgIGV4cG9ydHMuTGlicmFyeUJpZyA9IExpYnJhcnlCaWc7CiAgICBleHBvcnRzLkxpYnJhcnlTcXVhcmUgPSBTcXVhcmVMaWJyYXJ5OwogICAgZXhwb3J0cy5MaWZlQnVveSA9IExpZmVCdW95OwogICAgZXhwb3J0cy5MaWdhdHVyZSA9IExpZ2F0dXJlOwogICAgZXhwb3J0cy5MaWdodGJ1bGIgPSBMaWdodGJ1bGI7CiAgICBleHBvcnRzLkxpZ2h0YnVsYk9mZiA9IExpZ2h0YnVsYk9mZjsKICAgIGV4cG9ydHMuTGluZUNoYXJ0ID0gQ2hhcnRMaW5lOwogICAgZXhwb3J0cy5MaW5lU3F1aWdnbGUgPSBMaW5lU3F1aWdnbGU7CiAgICBleHBvcnRzLkxpbmsgPSBMaW5rOwogICAgZXhwb3J0cy5MaW5rMiA9IExpbmsyOwogICAgZXhwb3J0cy5MaW5rMk9mZiA9IExpbmsyT2ZmOwogICAgZXhwb3J0cy5MaW5rZWRpbiA9IExpbmtlZGluOwogICAgZXhwb3J0cy5MaXN0ID0gTGlzdDsKICAgIGV4cG9ydHMuTGlzdENoZWNrID0gTGlzdENoZWNrOwogICAgZXhwb3J0cy5MaXN0Q2hlY2tzID0gTGlzdENoZWNrczsKICAgIGV4cG9ydHMuTGlzdENoZXZyb25zRG93blVwID0gTGlzdENoZXZyb25zRG93blVwOwogICAgZXhwb3J0cy5MaXN0Q2hldnJvbnNVcERvd24gPSBMaXN0Q2hldnJvbnNVcERvd247CiAgICBleHBvcnRzLkxpc3RDb2xsYXBzZSA9IExpc3RDb2xsYXBzZTsKICAgIGV4cG9ydHMuTGlzdEVuZCA9IExpc3RFbmQ7CiAgICBleHBvcnRzLkxpc3RGaWx0ZXIgPSBMaXN0RmlsdGVyOwogICAgZXhwb3J0cy5MaXN0RmlsdGVyUGx1cyA9IExpc3RGaWx0ZXJQbHVzOwogICAgZXhwb3J0cy5MaXN0SW5kZW50RGVjcmVhc2UgPSBMaXN0SW5kZW50RGVjcmVhc2U7CiAgICBleHBvcnRzLkxpc3RJbmRlbnRJbmNyZWFzZSA9IExpc3RJbmRlbnRJbmNyZWFzZTsKICAgIGV4cG9ydHMuTGlzdE1pbnVzID0gTGlzdE1pbnVzOwogICAgZXhwb3J0cy5MaXN0TXVzaWMgPSBMaXN0TXVzaWM7CiAgICBleHBvcnRzLkxpc3RPcmRlcmVkID0gTGlzdE9yZGVyZWQ7CiAgICBleHBvcnRzLkxpc3RQbHVzID0gTGlzdFBsdXM7CiAgICBleHBvcnRzLkxpc3RSZXN0YXJ0ID0gTGlzdFJlc3RhcnQ7CiAgICBleHBvcnRzLkxpc3RTdGFydCA9IExpc3RTdGFydDsKICAgIGV4cG9ydHMuTGlzdFRvZG8gPSBMaXN0VG9kbzsKICAgIGV4cG9ydHMuTGlzdFRyZWUgPSBMaXN0VHJlZTsKICAgIGV4cG9ydHMuTGlzdFZpZGVvID0gTGlzdFZpZGVvOwogICAgZXhwb3J0cy5MaXN0WCA9IExpc3RYOwogICAgZXhwb3J0cy5Mb2FkZXIgPSBMb2FkZXI7CiAgICBleHBvcnRzLkxvYWRlcjIgPSBMb2FkZXJDaXJjbGU7CiAgICBleHBvcnRzLkxvYWRlckNpcmNsZSA9IExvYWRlckNpcmNsZTsKICAgIGV4cG9ydHMuTG9hZGVyUGlud2hlZWwgPSBMb2FkZXJQaW53aGVlbDsKICAgIGV4cG9ydHMuTG9jYXRlID0gTG9jYXRlOwogICAgZXhwb3J0cy5Mb2NhdGVGaXhlZCA9IExvY2F0ZUZpeGVkOwogICAgZXhwb3J0cy5Mb2NhdGVPZmYgPSBMb2NhdGVPZmY7CiAgICBleHBvcnRzLkxvY2F0aW9uRWRpdCA9IE1hcFBpblBlbjsKICAgIGV4cG9ydHMuTG9jayA9IExvY2s7CiAgICBleHBvcnRzLkxvY2tLZXlob2xlID0gTG9ja0tleWhvbGU7CiAgICBleHBvcnRzLkxvY2tLZXlob2xlT3BlbiA9IExvY2tLZXlob2xlT3BlbjsKICAgIGV4cG9ydHMuTG9ja09wZW4gPSBMb2NrT3BlbjsKICAgIGV4cG9ydHMuTG9nSW4gPSBMb2dJbjsKICAgIGV4cG9ydHMuTG9nT3V0ID0gTG9nT3V0OwogICAgZXhwb3J0cy5Mb2dzID0gTG9nczsKICAgIGV4cG9ydHMuTG9sbGlwb3AgPSBMb2xsaXBvcDsKICAgIGV4cG9ydHMuTHVnZ2FnZSA9IEx1Z2dhZ2U7CiAgICBleHBvcnRzLk1TcXVhcmUgPSBTcXVhcmVNOwogICAgZXhwb3J0cy5NYWduZXQgPSBNYWduZXQ7CiAgICBleHBvcnRzLk1haWwgPSBNYWlsOwogICAgZXhwb3J0cy5NYWlsQ2hlY2sgPSBNYWlsQ2hlY2s7CiAgICBleHBvcnRzLk1haWxNaW51cyA9IE1haWxNaW51czsKICAgIGV4cG9ydHMuTWFpbE9wZW4gPSBNYWlsT3BlbjsKICAgIGV4cG9ydHMuTWFpbFBsdXMgPSBNYWlsUGx1czsKICAgIGV4cG9ydHMuTWFpbFF1ZXN0aW9uID0gTWFpbFF1ZXN0aW9uTWFyazsKICAgIGV4cG9ydHMuTWFpbFF1ZXN0aW9uTWFyayA9IE1haWxRdWVzdGlvbk1hcms7CiAgICBleHBvcnRzLk1haWxTZWFyY2ggPSBNYWlsU2VhcmNoOwogICAgZXhwb3J0cy5NYWlsV2FybmluZyA9IE1haWxXYXJuaW5nOwogICAgZXhwb3J0cy5NYWlsWCA9IE1haWxYOwogICAgZXhwb3J0cy5NYWlsYm94ID0gTWFpbGJveDsKICAgIGV4cG9ydHMuTWFpbHMgPSBNYWlsczsKICAgIGV4cG9ydHMuTWFwID0gTWFwMjsKICAgIGV4cG9ydHMuTWFwTWludXMgPSBNYXBNaW51czsKICAgIGV4cG9ydHMuTWFwUGluID0gTWFwUGluOwogICAgZXhwb3J0cy5NYXBQaW5DaGVjayA9IE1hcFBpbkNoZWNrOwogICAgZXhwb3J0cy5NYXBQaW5DaGVja0luc2lkZSA9IE1hcFBpbkNoZWNrSW5zaWRlOwogICAgZXhwb3J0cy5NYXBQaW5Ib3VzZSA9IE1hcFBpbkhvdXNlOwogICAgZXhwb3J0cy5NYXBQaW5NaW51cyA9IE1hcFBpbk1pbnVzOwogICAgZXhwb3J0cy5NYXBQaW5NaW51c0luc2lkZSA9IE1hcFBpbk1pbnVzSW5zaWRlOwogICAgZXhwb3J0cy5NYXBQaW5PZmYgPSBNYXBQaW5PZmY7CiAgICBleHBvcnRzLk1hcFBpblBlbiA9IE1hcFBpblBlbjsKICAgIGV4cG9ydHMuTWFwUGluUGx1cyA9IE1hcFBpblBsdXM7CiAgICBleHBvcnRzLk1hcFBpblBsdXNJbnNpZGUgPSBNYXBQaW5QbHVzSW5zaWRlOwogICAgZXhwb3J0cy5NYXBQaW5YID0gTWFwUGluWDsKICAgIGV4cG9ydHMuTWFwUGluWEluc2lkZSA9IE1hcFBpblhJbnNpZGU7CiAgICBleHBvcnRzLk1hcFBpbm5lZCA9IE1hcFBpbm5lZDsKICAgIGV4cG9ydHMuTWFwUGx1cyA9IE1hcFBsdXM7CiAgICBleHBvcnRzLk1hcnMgPSBNYXJzOwogICAgZXhwb3J0cy5NYXJzU3Ryb2tlID0gTWFyc1N0cm9rZTsKICAgIGV4cG9ydHMuTWFydGluaSA9IE1hcnRpbmk7CiAgICBleHBvcnRzLk1heGltaXplID0gTWF4aW1pemU7CiAgICBleHBvcnRzLk1heGltaXplMiA9IE1heGltaXplMjsKICAgIGV4cG9ydHMuTWVkYWwgPSBNZWRhbDsKICAgIGV4cG9ydHMuTWVnYXBob25lID0gTWVnYXBob25lOwogICAgZXhwb3J0cy5NZWdhcGhvbmVPZmYgPSBNZWdhcGhvbmVPZmY7CiAgICBleHBvcnRzLk1laCA9IE1laDsKICAgIGV4cG9ydHMuTWVtb3J5U3RpY2sgPSBNZW1vcnlTdGljazsKICAgIGV4cG9ydHMuTWVudSA9IE1lbnU7CiAgICBleHBvcnRzLk1lbnVTcXVhcmUgPSBTcXVhcmVNZW51OwogICAgZXhwb3J0cy5NZXJnZSA9IE1lcmdlOwogICAgZXhwb3J0cy5NZXNzYWdlQ2lyY2xlID0gTWVzc2FnZUNpcmNsZTsKICAgIGV4cG9ydHMuTWVzc2FnZUNpcmNsZUNvZGUgPSBNZXNzYWdlQ2lyY2xlQ29kZTsKICAgIGV4cG9ydHMuTWVzc2FnZUNpcmNsZURhc2hlZCA9IE1lc3NhZ2VDaXJjbGVEYXNoZWQ7CiAgICBleHBvcnRzLk1lc3NhZ2VDaXJjbGVIZWFydCA9IE1lc3NhZ2VDaXJjbGVIZWFydDsKICAgIGV4cG9ydHMuTWVzc2FnZUNpcmNsZU1vcmUgPSBNZXNzYWdlQ2lyY2xlTW9yZTsKICAgIGV4cG9ydHMuTWVzc2FnZUNpcmNsZU9mZiA9IE1lc3NhZ2VDaXJjbGVPZmY7CiAgICBleHBvcnRzLk1lc3NhZ2VDaXJjbGVQbHVzID0gTWVzc2FnZUNpcmNsZVBsdXM7CiAgICBleHBvcnRzLk1lc3NhZ2VDaXJjbGVRdWVzdGlvbiA9IE1lc3NhZ2VDaXJjbGVRdWVzdGlvbk1hcms7CiAgICBleHBvcnRzLk1lc3NhZ2VDaXJjbGVRdWVzdGlvbk1hcmsgPSBNZXNzYWdlQ2lyY2xlUXVlc3Rpb25NYXJrOwogICAgZXhwb3J0cy5NZXNzYWdlQ2lyY2xlUmVwbHkgPSBNZXNzYWdlQ2lyY2xlUmVwbHk7CiAgICBleHBvcnRzLk1lc3NhZ2VDaXJjbGVXYXJuaW5nID0gTWVzc2FnZUNpcmNsZVdhcm5pbmc7CiAgICBleHBvcnRzLk1lc3NhZ2VDaXJjbGVYID0gTWVzc2FnZUNpcmNsZVg7CiAgICBleHBvcnRzLk1lc3NhZ2VTcXVhcmUgPSBNZXNzYWdlU3F1YXJlOwogICAgZXhwb3J0cy5NZXNzYWdlU3F1YXJlQ29kZSA9IE1lc3NhZ2VTcXVhcmVDb2RlOwogICAgZXhwb3J0cy5NZXNzYWdlU3F1YXJlRGFzaGVkID0gTWVzc2FnZVNxdWFyZURhc2hlZDsKICAgIGV4cG9ydHMuTWVzc2FnZVNxdWFyZURpZmYgPSBNZXNzYWdlU3F1YXJlRGlmZjsKICAgIGV4cG9ydHMuTWVzc2FnZVNxdWFyZURvdCA9IE1lc3NhZ2VTcXVhcmVEb3Q7CiAgICBleHBvcnRzLk1lc3NhZ2VTcXVhcmVIZWFydCA9IE1lc3NhZ2VTcXVhcmVIZWFydDsKICAgIGV4cG9ydHMuTWVzc2FnZVNxdWFyZUxvY2sgPSBNZXNzYWdlU3F1YXJlTG9jazsKICAgIGV4cG9ydHMuTWVzc2FnZVNxdWFyZU1vcmUgPSBNZXNzYWdlU3F1YXJlTW9yZTsKICAgIGV4cG9ydHMuTWVzc2FnZVNxdWFyZU9mZiA9IE1lc3NhZ2VTcXVhcmVPZmY7CiAgICBleHBvcnRzLk1lc3NhZ2VTcXVhcmVQbHVzID0gTWVzc2FnZVNxdWFyZVBsdXM7CiAgICBleHBvcnRzLk1lc3NhZ2VTcXVhcmVRdW90ZSA9IE1lc3NhZ2VTcXVhcmVRdW90ZTsKICAgIGV4cG9ydHMuTWVzc2FnZVNxdWFyZVJlcGx5ID0gTWVzc2FnZVNxdWFyZVJlcGx5OwogICAgZXhwb3J0cy5NZXNzYWdlU3F1YXJlU2hhcmUgPSBNZXNzYWdlU3F1YXJlU2hhcmU7CiAgICBleHBvcnRzLk1lc3NhZ2VTcXVhcmVUZXh0ID0gTWVzc2FnZVNxdWFyZVRleHQ7CiAgICBleHBvcnRzLk1lc3NhZ2VTcXVhcmVXYXJuaW5nID0gTWVzc2FnZVNxdWFyZVdhcm5pbmc7CiAgICBleHBvcnRzLk1lc3NhZ2VTcXVhcmVYID0gTWVzc2FnZVNxdWFyZVg7CiAgICBleHBvcnRzLk1lc3NhZ2VzU3F1YXJlID0gTWVzc2FnZXNTcXVhcmU7CiAgICBleHBvcnRzLk1pYyA9IE1pYzsKICAgIGV4cG9ydHMuTWljMiA9IE1pY1ZvY2FsOwogICAgZXhwb3J0cy5NaWNPZmYgPSBNaWNPZmY7CiAgICBleHBvcnRzLk1pY1ZvY2FsID0gTWljVm9jYWw7CiAgICBleHBvcnRzLk1pY3JvY2hpcCA9IE1pY3JvY2hpcDsKICAgIGV4cG9ydHMuTWljcm9zY29wZSA9IE1pY3Jvc2NvcGU7CiAgICBleHBvcnRzLk1pY3Jvd2F2ZSA9IE1pY3Jvd2F2ZTsKICAgIGV4cG9ydHMuTWlsZXN0b25lID0gTWlsZXN0b25lOwogICAgZXhwb3J0cy5NaWxrID0gTWlsazsKICAgIGV4cG9ydHMuTWlsa09mZiA9IE1pbGtPZmY7CiAgICBleHBvcnRzLk1pbmltaXplID0gTWluaW1pemU7CiAgICBleHBvcnRzLk1pbmltaXplMiA9IE1pbmltaXplMjsKICAgIGV4cG9ydHMuTWludXMgPSBNaW51czsKICAgIGV4cG9ydHMuTWludXNDaXJjbGUgPSBDaXJjbGVNaW51czsKICAgIGV4cG9ydHMuTWludXNTcXVhcmUgPSBTcXVhcmVNaW51czsKICAgIGV4cG9ydHMuTW9uaXRvciA9IE1vbml0b3I7CiAgICBleHBvcnRzLk1vbml0b3JDaGVjayA9IE1vbml0b3JDaGVjazsKICAgIGV4cG9ydHMuTW9uaXRvckNsb3VkID0gTW9uaXRvckNsb3VkOwogICAgZXhwb3J0cy5Nb25pdG9yQ29nID0gTW9uaXRvckNvZzsKICAgIGV4cG9ydHMuTW9uaXRvckRvdCA9IE1vbml0b3JEb3Q7CiAgICBleHBvcnRzLk1vbml0b3JEb3duID0gTW9uaXRvckRvd247CiAgICBleHBvcnRzLk1vbml0b3JPZmYgPSBNb25pdG9yT2ZmOwogICAgZXhwb3J0cy5Nb25pdG9yUGF1c2UgPSBNb25pdG9yUGF1c2U7CiAgICBleHBvcnRzLk1vbml0b3JQbGF5ID0gTW9uaXRvclBsYXk7CiAgICBleHBvcnRzLk1vbml0b3JTbWFydHBob25lID0gTW9uaXRvclNtYXJ0cGhvbmU7CiAgICBleHBvcnRzLk1vbml0b3JTcGVha2VyID0gTW9uaXRvclNwZWFrZXI7CiAgICBleHBvcnRzLk1vbml0b3JTdG9wID0gTW9uaXRvclN0b3A7CiAgICBleHBvcnRzLk1vbml0b3JVcCA9IE1vbml0b3JVcDsKICAgIGV4cG9ydHMuTW9uaXRvclggPSBNb25pdG9yWDsKICAgIGV4cG9ydHMuTW9vbiA9IE1vb247CiAgICBleHBvcnRzLk1vb25TdGFyID0gTW9vblN0YXI7CiAgICBleHBvcnRzLk1vcmVIb3Jpem9udGFsID0gRWxsaXBzaXM7CiAgICBleHBvcnRzLk1vcmVWZXJ0aWNhbCA9IEVsbGlwc2lzVmVydGljYWw7CiAgICBleHBvcnRzLk1vdG9yYmlrZSA9IE1vdG9yYmlrZTsKICAgIGV4cG9ydHMuTW91bnRhaW4gPSBNb3VudGFpbjsKICAgIGV4cG9ydHMuTW91bnRhaW5Tbm93ID0gTW91bnRhaW5Tbm93OwogICAgZXhwb3J0cy5Nb3VzZSA9IE1vdXNlOwogICAgZXhwb3J0cy5Nb3VzZU9mZiA9IE1vdXNlT2ZmOwogICAgZXhwb3J0cy5Nb3VzZVBvaW50ZXIgPSBNb3VzZVBvaW50ZXI7CiAgICBleHBvcnRzLk1vdXNlUG9pbnRlcjIgPSBNb3VzZVBvaW50ZXIyOwogICAgZXhwb3J0cy5Nb3VzZVBvaW50ZXIyT2ZmID0gTW91c2VQb2ludGVyMk9mZjsKICAgIGV4cG9ydHMuTW91c2VQb2ludGVyQmFuID0gTW91c2VQb2ludGVyQmFuOwogICAgZXhwb3J0cy5Nb3VzZVBvaW50ZXJDbGljayA9IE1vdXNlUG9pbnRlckNsaWNrOwogICAgZXhwb3J0cy5Nb3VzZVBvaW50ZXJTcXVhcmVEYXNoZWQgPSBTcXVhcmVEYXNoZWRNb3VzZVBvaW50ZXI7CiAgICBleHBvcnRzLk1vdmUgPSBNb3ZlOwogICAgZXhwb3J0cy5Nb3ZlM0QgPSBNb3ZlM2Q7CiAgICBleHBvcnRzLk1vdmUzZCA9IE1vdmUzZDsKICAgIGV4cG9ydHMuTW92ZURpYWdvbmFsID0gTW92ZURpYWdvbmFsOwogICAgZXhwb3J0cy5Nb3ZlRGlhZ29uYWwyID0gTW92ZURpYWdvbmFsMjsKICAgIGV4cG9ydHMuTW92ZURvd24gPSBNb3ZlRG93bjsKICAgIGV4cG9ydHMuTW92ZURvd25MZWZ0ID0gTW92ZURvd25MZWZ0OwogICAgZXhwb3J0cy5Nb3ZlRG93blJpZ2h0ID0gTW92ZURvd25SaWdodDsKICAgIGV4cG9ydHMuTW92ZUhvcml6b250YWwgPSBNb3ZlSG9yaXpvbnRhbDsKICAgIGV4cG9ydHMuTW92ZUxlZnQgPSBNb3ZlTGVmdDsKICAgIGV4cG9ydHMuTW92ZVJpZ2h0ID0gTW92ZVJpZ2h0OwogICAgZXhwb3J0cy5Nb3ZlVXAgPSBNb3ZlVXA7CiAgICBleHBvcnRzLk1vdmVVcExlZnQgPSBNb3ZlVXBMZWZ0OwogICAgZXhwb3J0cy5Nb3ZlVXBSaWdodCA9IE1vdmVVcFJpZ2h0OwogICAgZXhwb3J0cy5Nb3ZlVmVydGljYWwgPSBNb3ZlVmVydGljYWw7CiAgICBleHBvcnRzLk11c2ljID0gTXVzaWM7CiAgICBleHBvcnRzLk11c2ljMiA9IE11c2ljMjsKICAgIGV4cG9ydHMuTXVzaWMzID0gTXVzaWMzOwogICAgZXhwb3J0cy5NdXNpYzQgPSBNdXNpYzQ7CiAgICBleHBvcnRzLk5hdmlnYXRpb24gPSBOYXZpZ2F0aW9uOwogICAgZXhwb3J0cy5OYXZpZ2F0aW9uMiA9IE5hdmlnYXRpb24yOwogICAgZXhwb3J0cy5OYXZpZ2F0aW9uMk9mZiA9IE5hdmlnYXRpb24yT2ZmOwogICAgZXhwb3J0cy5OYXZpZ2F0aW9uT2ZmID0gTmF2aWdhdGlvbk9mZjsKICAgIGV4cG9ydHMuTmV0d29yayA9IE5ldHdvcms7CiAgICBleHBvcnRzLk5ld3NwYXBlciA9IE5ld3NwYXBlcjsKICAgIGV4cG9ydHMuTmZjID0gTmZjOwogICAgZXhwb3J0cy5Ob25CaW5hcnkgPSBOb25CaW5hcnk7CiAgICBleHBvcnRzLk5vdGVib29rID0gTm90ZWJvb2s7CiAgICBleHBvcnRzLk5vdGVib29rUGVuID0gTm90ZWJvb2tQZW47CiAgICBleHBvcnRzLk5vdGVib29rVGFicyA9IE5vdGVib29rVGFiczsKICAgIGV4cG9ydHMuTm90ZWJvb2tUZXh0ID0gTm90ZWJvb2tUZXh0OwogICAgZXhwb3J0cy5Ob3RlcGFkVGV4dCA9IE5vdGVwYWRUZXh0OwogICAgZXhwb3J0cy5Ob3RlcGFkVGV4dERhc2hlZCA9IE5vdGVwYWRUZXh0RGFzaGVkOwogICAgZXhwb3J0cy5OdXQgPSBOdXQ7CiAgICBleHBvcnRzLk51dE9mZiA9IE51dE9mZjsKICAgIGV4cG9ydHMuT2N0YWdvbiA9IE9jdGFnb247CiAgICBleHBvcnRzLk9jdGFnb25BbGVydCA9IE9jdGFnb25BbGVydDsKICAgIGV4cG9ydHMuT2N0YWdvbk1pbnVzID0gT2N0YWdvbk1pbnVzOwogICAgZXhwb3J0cy5PY3RhZ29uUGF1c2UgPSBPY3RhZ29uUGF1c2U7CiAgICBleHBvcnRzLk9jdGFnb25YID0gT2N0YWdvblg7CiAgICBleHBvcnRzLk9tZWdhID0gT21lZ2E7CiAgICBleHBvcnRzLk9wdGlvbiA9IE9wdGlvbjsKICAgIGV4cG9ydHMuT3JiaXQgPSBPcmJpdDsKICAgIGV4cG9ydHMuT3JpZ2FtaSA9IE9yaWdhbWk7CiAgICBleHBvcnRzLk91dGRlbnQgPSBMaXN0SW5kZW50RGVjcmVhc2U7CiAgICBleHBvcnRzLlBhY2thZ2UgPSBQYWNrYWdlOwogICAgZXhwb3J0cy5QYWNrYWdlMiA9IFBhY2thZ2UyOwogICAgZXhwb3J0cy5QYWNrYWdlQ2hlY2sgPSBQYWNrYWdlQ2hlY2s7CiAgICBleHBvcnRzLlBhY2thZ2VNaW51cyA9IFBhY2thZ2VNaW51czsKICAgIGV4cG9ydHMuUGFja2FnZU9wZW4gPSBQYWNrYWdlT3BlbjsKICAgIGV4cG9ydHMuUGFja2FnZVBsdXMgPSBQYWNrYWdlUGx1czsKICAgIGV4cG9ydHMuUGFja2FnZVNlYXJjaCA9IFBhY2thZ2VTZWFyY2g7CiAgICBleHBvcnRzLlBhY2thZ2VYID0gUGFja2FnZVg7CiAgICBleHBvcnRzLlBhaW50QnVja2V0ID0gUGFpbnRCdWNrZXQ7CiAgICBleHBvcnRzLlBhaW50Um9sbGVyID0gUGFpbnRSb2xsZXI7CiAgICBleHBvcnRzLlBhaW50YnJ1c2ggPSBQYWludGJydXNoOwogICAgZXhwb3J0cy5QYWludGJydXNoMiA9IFBhaW50YnJ1c2hWZXJ0aWNhbDsKICAgIGV4cG9ydHMuUGFpbnRicnVzaFZlcnRpY2FsID0gUGFpbnRicnVzaFZlcnRpY2FsOwogICAgZXhwb3J0cy5QYWxldHRlID0gUGFsZXR0ZTsKICAgIGV4cG9ydHMuUGFsbXRyZWUgPSBUcmVlUGFsbTsKICAgIGV4cG9ydHMuUGFuZGEgPSBQYW5kYTsKICAgIGV4cG9ydHMuUGFuZWxCb3R0b20gPSBQYW5lbEJvdHRvbTsKICAgIGV4cG9ydHMuUGFuZWxCb3R0b21DbG9zZSA9IFBhbmVsQm90dG9tQ2xvc2U7CiAgICBleHBvcnRzLlBhbmVsQm90dG9tRGFzaGVkID0gUGFuZWxCb3R0b21EYXNoZWQ7CiAgICBleHBvcnRzLlBhbmVsQm90dG9tSW5hY3RpdmUgPSBQYW5lbEJvdHRvbURhc2hlZDsKICAgIGV4cG9ydHMuUGFuZWxCb3R0b21PcGVuID0gUGFuZWxCb3R0b21PcGVuOwogICAgZXhwb3J0cy5QYW5lbExlZnQgPSBQYW5lbExlZnQ7CiAgICBleHBvcnRzLlBhbmVsTGVmdENsb3NlID0gUGFuZWxMZWZ0Q2xvc2U7CiAgICBleHBvcnRzLlBhbmVsTGVmdERhc2hlZCA9IFBhbmVsTGVmdERhc2hlZDsKICAgIGV4cG9ydHMuUGFuZWxMZWZ0SW5hY3RpdmUgPSBQYW5lbExlZnREYXNoZWQ7CiAgICBleHBvcnRzLlBhbmVsTGVmdE9wZW4gPSBQYW5lbExlZnRPcGVuOwogICAgZXhwb3J0cy5QYW5lbExlZnRSaWdodERhc2hlZCA9IFBhbmVsTGVmdFJpZ2h0RGFzaGVkOwogICAgZXhwb3J0cy5QYW5lbFJpZ2h0ID0gUGFuZWxSaWdodDsKICAgIGV4cG9ydHMuUGFuZWxSaWdodENsb3NlID0gUGFuZWxSaWdodENsb3NlOwogICAgZXhwb3J0cy5QYW5lbFJpZ2h0RGFzaGVkID0gUGFuZWxSaWdodERhc2hlZDsKICAgIGV4cG9ydHMuUGFuZWxSaWdodEluYWN0aXZlID0gUGFuZWxSaWdodERhc2hlZDsKICAgIGV4cG9ydHMuUGFuZWxSaWdodE9wZW4gPSBQYW5lbFJpZ2h0T3BlbjsKICAgIGV4cG9ydHMuUGFuZWxUb3AgPSBQYW5lbFRvcDsKICAgIGV4cG9ydHMuUGFuZWxUb3BCb3R0b21EYXNoZWQgPSBQYW5lbFRvcEJvdHRvbURhc2hlZDsKICAgIGV4cG9ydHMuUGFuZWxUb3BDbG9zZSA9IFBhbmVsVG9wQ2xvc2U7CiAgICBleHBvcnRzLlBhbmVsVG9wRGFzaGVkID0gUGFuZWxUb3BEYXNoZWQ7CiAgICBleHBvcnRzLlBhbmVsVG9wSW5hY3RpdmUgPSBQYW5lbFRvcERhc2hlZDsKICAgIGV4cG9ydHMuUGFuZWxUb3BPcGVuID0gUGFuZWxUb3BPcGVuOwogICAgZXhwb3J0cy5QYW5lbHNMZWZ0Qm90dG9tID0gUGFuZWxzTGVmdEJvdHRvbTsKICAgIGV4cG9ydHMuUGFuZWxzTGVmdFJpZ2h0ID0gQ29sdW1uczM7CiAgICBleHBvcnRzLlBhbmVsc1JpZ2h0Qm90dG9tID0gUGFuZWxzUmlnaHRCb3R0b207CiAgICBleHBvcnRzLlBhbmVsc1RvcEJvdHRvbSA9IFJvd3MzOwogICAgZXhwb3J0cy5QYW5lbHNUb3BMZWZ0ID0gUGFuZWxzVG9wTGVmdDsKICAgIGV4cG9ydHMuUGFwZXJjbGlwID0gUGFwZXJjbGlwOwogICAgZXhwb3J0cy5QYXJlbnRoZXNlcyA9IFBhcmVudGhlc2VzOwogICAgZXhwb3J0cy5QYXJraW5nQ2lyY2xlID0gQ2lyY2xlUGFya2luZzsKICAgIGV4cG9ydHMuUGFya2luZ0NpcmNsZU9mZiA9IENpcmNsZVBhcmtpbmdPZmY7CiAgICBleHBvcnRzLlBhcmtpbmdNZXRlciA9IFBhcmtpbmdNZXRlcjsKICAgIGV4cG9ydHMuUGFya2luZ1NxdWFyZSA9IFNxdWFyZVBhcmtpbmc7CiAgICBleHBvcnRzLlBhcmtpbmdTcXVhcmVPZmYgPSBTcXVhcmVQYXJraW5nT2ZmOwogICAgZXhwb3J0cy5QYXJ0eVBvcHBlciA9IFBhcnR5UG9wcGVyOwogICAgZXhwb3J0cy5QYXVzZSA9IFBhdXNlOwogICAgZXhwb3J0cy5QYXVzZUNpcmNsZSA9IENpcmNsZVBhdXNlOwogICAgZXhwb3J0cy5QYXVzZU9jdGFnb24gPSBPY3RhZ29uUGF1c2U7CiAgICBleHBvcnRzLlBhd1ByaW50ID0gUGF3UHJpbnQ7CiAgICBleHBvcnRzLlBjQ2FzZSA9IFBjQ2FzZTsKICAgIGV4cG9ydHMuUGVuID0gUGVuOwogICAgZXhwb3J0cy5QZW5Cb3ggPSBTcXVhcmVQZW47CiAgICBleHBvcnRzLlBlbkxpbmUgPSBQZW5MaW5lOwogICAgZXhwb3J0cy5QZW5PZmYgPSBQZW5PZmY7CiAgICBleHBvcnRzLlBlblNxdWFyZSA9IFNxdWFyZVBlbjsKICAgIGV4cG9ydHMuUGVuVG9vbCA9IFBlblRvb2w7CiAgICBleHBvcnRzLlBlbmNpbCA9IFBlbmNpbDsKICAgIGV4cG9ydHMuUGVuY2lsTGluZSA9IFBlbmNpbExpbmU7CiAgICBleHBvcnRzLlBlbmNpbE9mZiA9IFBlbmNpbE9mZjsKICAgIGV4cG9ydHMuUGVuY2lsUnVsZXIgPSBQZW5jaWxSdWxlcjsKICAgIGV4cG9ydHMuUGVudGFnb24gPSBQZW50YWdvbjsKICAgIGV4cG9ydHMuUGVyY2VudCA9IFBlcmNlbnQ7CiAgICBleHBvcnRzLlBlcmNlbnRDaXJjbGUgPSBDaXJjbGVQZXJjZW50OwogICAgZXhwb3J0cy5QZXJjZW50RGlhbW9uZCA9IERpYW1vbmRQZXJjZW50OwogICAgZXhwb3J0cy5QZXJjZW50U3F1YXJlID0gU3F1YXJlUGVyY2VudDsKICAgIGV4cG9ydHMuUGVyc29uU3RhbmRpbmcgPSBQZXJzb25TdGFuZGluZzsKICAgIGV4cG9ydHMuUGhpbGlwcGluZVBlc28gPSBQaGlsaXBwaW5lUGVzbzsKICAgIGV4cG9ydHMuUGhvbmUgPSBQaG9uZTsKICAgIGV4cG9ydHMuUGhvbmVDYWxsID0gUGhvbmVDYWxsOwogICAgZXhwb3J0cy5QaG9uZUZvcndhcmRlZCA9IFBob25lRm9yd2FyZGVkOwogICAgZXhwb3J0cy5QaG9uZUluY29taW5nID0gUGhvbmVJbmNvbWluZzsKICAgIGV4cG9ydHMuUGhvbmVNaXNzZWQgPSBQaG9uZU1pc3NlZDsKICAgIGV4cG9ydHMuUGhvbmVPZmYgPSBQaG9uZU9mZjsKICAgIGV4cG9ydHMuUGhvbmVPdXRnb2luZyA9IFBob25lT3V0Z29pbmc7CiAgICBleHBvcnRzLlBpID0gUGk7CiAgICBleHBvcnRzLlBpU3F1YXJlID0gU3F1YXJlUGk7CiAgICBleHBvcnRzLlBpYW5vID0gUGlhbm87CiAgICBleHBvcnRzLlBpY2theGUgPSBQaWNrYXhlOwogICAgZXhwb3J0cy5QaWN0dXJlSW5QaWN0dXJlID0gUGljdHVyZUluUGljdHVyZTsKICAgIGV4cG9ydHMuUGljdHVyZUluUGljdHVyZTIgPSBQaWN0dXJlSW5QaWN0dXJlMjsKICAgIGV4cG9ydHMuUGllQ2hhcnQgPSBDaGFydFBpZTsKICAgIGV4cG9ydHMuUGlnZ3lCYW5rID0gUGlnZ3lCYW5rOwogICAgZXhwb3J0cy5QaWxjcm93ID0gUGlsY3JvdzsKICAgIGV4cG9ydHMuUGlsY3Jvd0xlZnQgPSBQaWxjcm93TGVmdDsKICAgIGV4cG9ydHMuUGlsY3Jvd1JpZ2h0ID0gUGlsY3Jvd1JpZ2h0OwogICAgZXhwb3J0cy5QaWxjcm93U3F1YXJlID0gU3F1YXJlUGlsY3JvdzsKICAgIGV4cG9ydHMuUGlsbCA9IFBpbGw7CiAgICBleHBvcnRzLlBpbGxCb3R0bGUgPSBQaWxsQm90dGxlOwogICAgZXhwb3J0cy5QaW4gPSBQaW47CiAgICBleHBvcnRzLlBpbk9mZiA9IFBpbk9mZjsKICAgIGV4cG9ydHMuUGlwZXR0ZSA9IFBpcGV0dGU7CiAgICBleHBvcnRzLlBpenphID0gUGl6emE7CiAgICBleHBvcnRzLlBsYW5lID0gUGxhbmU7CiAgICBleHBvcnRzLlBsYW5lTGFuZGluZyA9IFBsYW5lTGFuZGluZzsKICAgIGV4cG9ydHMuUGxhbmVUYWtlb2ZmID0gUGxhbmVUYWtlb2ZmOwogICAgZXhwb3J0cy5QbGF5ID0gUGxheTsKICAgIGV4cG9ydHMuUGxheUNpcmNsZSA9IENpcmNsZVBsYXk7CiAgICBleHBvcnRzLlBsYXlTcXVhcmUgPSBTcXVhcmVQbGF5OwogICAgZXhwb3J0cy5QbHVnID0gUGx1ZzsKICAgIGV4cG9ydHMuUGx1ZzIgPSBQbHVnMjsKICAgIGV4cG9ydHMuUGx1Z1phcCA9IFBsdWdaYXA7CiAgICBleHBvcnRzLlBsdWdaYXAyID0gUGx1Z1phcDsKICAgIGV4cG9ydHMuUGx1cyA9IFBsdXM7CiAgICBleHBvcnRzLlBsdXNDaXJjbGUgPSBDaXJjbGVQbHVzOwogICAgZXhwb3J0cy5QbHVzU3F1YXJlID0gU3F1YXJlUGx1czsKICAgIGV4cG9ydHMuUG9ja2V0ID0gUG9ja2V0OwogICAgZXhwb3J0cy5Qb2NrZXRLbmlmZSA9IFBvY2tldEtuaWZlOwogICAgZXhwb3J0cy5Qb2RjYXN0ID0gUG9kY2FzdDsKICAgIGV4cG9ydHMuUG9pbnRlciA9IFBvaW50ZXI7CiAgICBleHBvcnRzLlBvaW50ZXJPZmYgPSBQb2ludGVyT2ZmOwogICAgZXhwb3J0cy5Qb3Bjb3JuID0gUG9wY29ybjsKICAgIGV4cG9ydHMuUG9wc2ljbGUgPSBQb3BzaWNsZTsKICAgIGV4cG9ydHMuUG91bmRTdGVybGluZyA9IFBvdW5kU3Rlcmxpbmc7CiAgICBleHBvcnRzLlBvd2VyID0gUG93ZXI7CiAgICBleHBvcnRzLlBvd2VyQ2lyY2xlID0gQ2lyY2xlUG93ZXI7CiAgICBleHBvcnRzLlBvd2VyT2ZmID0gUG93ZXJPZmY7CiAgICBleHBvcnRzLlBvd2VyU3F1YXJlID0gU3F1YXJlUG93ZXI7CiAgICBleHBvcnRzLlByZXNlbnRhdGlvbiA9IFByZXNlbnRhdGlvbjsKICAgIGV4cG9ydHMuUHJpbnRlciA9IFByaW50ZXI7CiAgICBleHBvcnRzLlByaW50ZXJDaGVjayA9IFByaW50ZXJDaGVjazsKICAgIGV4cG9ydHMuUHJpbnRlclggPSBQcmludGVyWDsKICAgIGV4cG9ydHMuUHJvamVjdG9yID0gUHJvamVjdG9yOwogICAgZXhwb3J0cy5Qcm9wb3J0aW9ucyA9IFByb3BvcnRpb25zOwogICAgZXhwb3J0cy5QdXp6bGUgPSBQdXp6bGU7CiAgICBleHBvcnRzLlB5cmFtaWQgPSBQeXJhbWlkOwogICAgZXhwb3J0cy5RckNvZGUgPSBRckNvZGU7CiAgICBleHBvcnRzLlF1b3RlID0gUXVvdGU7CiAgICBleHBvcnRzLlJhYmJpdCA9IFJhYmJpdDsKICAgIGV4cG9ydHMuUmFkYXIgPSBSYWRhcjsKICAgIGV4cG9ydHMuUmFkaWF0aW9uID0gUmFkaWF0aW9uOwogICAgZXhwb3J0cy5SYWRpY2FsID0gUmFkaWNhbDsKICAgIGV4cG9ydHMuUmFkaW8gPSBSYWRpbzsKICAgIGV4cG9ydHMuUmFkaW9SZWNlaXZlciA9IFJhZGlvUmVjZWl2ZXI7CiAgICBleHBvcnRzLlJhZGlvVG93ZXIgPSBSYWRpb1Rvd2VyOwogICAgZXhwb3J0cy5SYWRpdXMgPSBSYWRpdXM7CiAgICBleHBvcnRzLlJhaWxTeW1ib2wgPSBSYWlsU3ltYm9sOwogICAgZXhwb3J0cy5SYWluYm93ID0gUmFpbmJvdzsKICAgIGV4cG9ydHMuUmF0ID0gUmF0OwogICAgZXhwb3J0cy5SYXRpbyA9IFJhdGlvOwogICAgZXhwb3J0cy5SZWNlaXB0ID0gUmVjZWlwdDsKICAgIGV4cG9ydHMuUmVjZWlwdENlbnQgPSBSZWNlaXB0Q2VudDsKICAgIGV4cG9ydHMuUmVjZWlwdEV1cm8gPSBSZWNlaXB0RXVybzsKICAgIGV4cG9ydHMuUmVjZWlwdEluZGlhblJ1cGVlID0gUmVjZWlwdEluZGlhblJ1cGVlOwogICAgZXhwb3J0cy5SZWNlaXB0SmFwYW5lc2VZZW4gPSBSZWNlaXB0SmFwYW5lc2VZZW47CiAgICBleHBvcnRzLlJlY2VpcHRQb3VuZFN0ZXJsaW5nID0gUmVjZWlwdFBvdW5kU3Rlcmxpbmc7CiAgICBleHBvcnRzLlJlY2VpcHRSdXNzaWFuUnVibGUgPSBSZWNlaXB0UnVzc2lhblJ1YmxlOwogICAgZXhwb3J0cy5SZWNlaXB0U3dpc3NGcmFuYyA9IFJlY2VpcHRTd2lzc0ZyYW5jOwogICAgZXhwb3J0cy5SZWNlaXB0VGV4dCA9IFJlY2VpcHRUZXh0OwogICAgZXhwb3J0cy5SZWNlaXB0VHVya2lzaExpcmEgPSBSZWNlaXB0VHVya2lzaExpcmE7CiAgICBleHBvcnRzLlJlY3RhbmdsZUNpcmNsZSA9IFJlY3RhbmdsZUNpcmNsZTsKICAgIGV4cG9ydHMuUmVjdGFuZ2xlRWxsaXBzaXMgPSBSZWN0YW5nbGVFbGxpcHNpczsKICAgIGV4cG9ydHMuUmVjdGFuZ2xlR29nZ2xlcyA9IFJlY3RhbmdsZUdvZ2dsZXM7CiAgICBleHBvcnRzLlJlY3RhbmdsZUhvcml6b250YWwgPSBSZWN0YW5nbGVIb3Jpem9udGFsOwogICAgZXhwb3J0cy5SZWN0YW5nbGVWZXJ0aWNhbCA9IFJlY3RhbmdsZVZlcnRpY2FsOwogICAgZXhwb3J0cy5SZWN5Y2xlID0gUmVjeWNsZTsKICAgIGV4cG9ydHMuUmVkbyA9IFJlZG87CiAgICBleHBvcnRzLlJlZG8yID0gUmVkbzI7CiAgICBleHBvcnRzLlJlZG9Eb3QgPSBSZWRvRG90OwogICAgZXhwb3J0cy5SZWZyZXNoQ2N3ID0gUmVmcmVzaENjdzsKICAgIGV4cG9ydHMuUmVmcmVzaENjd0RvdCA9IFJlZnJlc2hDY3dEb3Q7CiAgICBleHBvcnRzLlJlZnJlc2hDdyA9IFJlZnJlc2hDdzsKICAgIGV4cG9ydHMuUmVmcmVzaEN3T2ZmID0gUmVmcmVzaEN3T2ZmOwogICAgZXhwb3J0cy5SZWZyaWdlcmF0b3IgPSBSZWZyaWdlcmF0b3I7CiAgICBleHBvcnRzLlJlZ2V4ID0gUmVnZXg7CiAgICBleHBvcnRzLlJlbW92ZUZvcm1hdHRpbmcgPSBSZW1vdmVGb3JtYXR0aW5nOwogICAgZXhwb3J0cy5SZXBlYXQgPSBSZXBlYXQ7CiAgICBleHBvcnRzLlJlcGVhdDEgPSBSZXBlYXQxOwogICAgZXhwb3J0cy5SZXBlYXQyID0gUmVwZWF0MjsKICAgIGV4cG9ydHMuUmVwbGFjZSA9IFJlcGxhY2U7CiAgICBleHBvcnRzLlJlcGxhY2VBbGwgPSBSZXBsYWNlQWxsOwogICAgZXhwb3J0cy5SZXBseSA9IFJlcGx5OwogICAgZXhwb3J0cy5SZXBseUFsbCA9IFJlcGx5QWxsOwogICAgZXhwb3J0cy5SZXdpbmQgPSBSZXdpbmQ7CiAgICBleHBvcnRzLlJpYmJvbiA9IFJpYmJvbjsKICAgIGV4cG9ydHMuUm9ja2V0ID0gUm9ja2V0OwogICAgZXhwb3J0cy5Sb2NraW5nQ2hhaXIgPSBSb2NraW5nQ2hhaXI7CiAgICBleHBvcnRzLlJvbGxlckNvYXN0ZXIgPSBSb2xsZXJDb2FzdGVyOwogICAgZXhwb3J0cy5Sb3NlID0gUm9zZTsKICAgIGV4cG9ydHMuUm90YXRlM0QgPSBSb3RhdGUzZDsKICAgIGV4cG9ydHMuUm90YXRlM2QgPSBSb3RhdGUzZDsKICAgIGV4cG9ydHMuUm90YXRlQ2N3ID0gUm90YXRlQ2N3OwogICAgZXhwb3J0cy5Sb3RhdGVDY3dLZXkgPSBSb3RhdGVDY3dLZXk7CiAgICBleHBvcnRzLlJvdGF0ZUNjd1NxdWFyZSA9IFJvdGF0ZUNjd1NxdWFyZTsKICAgIGV4cG9ydHMuUm90YXRlQ3cgPSBSb3RhdGVDdzsKICAgIGV4cG9ydHMuUm90YXRlQ3dTcXVhcmUgPSBSb3RhdGVDd1NxdWFyZTsKICAgIGV4cG9ydHMuUm91dGUgPSBSb3V0ZTsKICAgIGV4cG9ydHMuUm91dGVPZmYgPSBSb3V0ZU9mZjsKICAgIGV4cG9ydHMuUm91dGVyID0gUm91dGVyOwogICAgZXhwb3J0cy5Sb3dzID0gUm93czI7CiAgICBleHBvcnRzLlJvd3MyID0gUm93czI7CiAgICBleHBvcnRzLlJvd3MzID0gUm93czM7CiAgICBleHBvcnRzLlJvd3M0ID0gUm93czQ7CiAgICBleHBvcnRzLlJzcyA9IFJzczsKICAgIGV4cG9ydHMuUnVsZXIgPSBSdWxlcjsKICAgIGV4cG9ydHMuUnVsZXJEaW1lbnNpb25MaW5lID0gUnVsZXJEaW1lbnNpb25MaW5lOwogICAgZXhwb3J0cy5SdXNzaWFuUnVibGUgPSBSdXNzaWFuUnVibGU7CiAgICBleHBvcnRzLlNhaWxib2F0ID0gU2FpbGJvYXQ7CiAgICBleHBvcnRzLlNhbGFkID0gU2FsYWQ7CiAgICBleHBvcnRzLlNhbmR3aWNoID0gU2FuZHdpY2g7CiAgICBleHBvcnRzLlNhdGVsbGl0ZSA9IFNhdGVsbGl0ZTsKICAgIGV4cG9ydHMuU2F0ZWxsaXRlRGlzaCA9IFNhdGVsbGl0ZURpc2g7CiAgICBleHBvcnRzLlNhdWRpUml5YWwgPSBTYXVkaVJpeWFsOwogICAgZXhwb3J0cy5TYXZlID0gU2F2ZTsKICAgIGV4cG9ydHMuU2F2ZUFsbCA9IFNhdmVBbGw7CiAgICBleHBvcnRzLlNhdmVPZmYgPSBTYXZlT2ZmOwogICAgZXhwb3J0cy5TY2FsZSA9IFNjYWxlOwogICAgZXhwb3J0cy5TY2FsZTNEID0gU2NhbGUzZDsKICAgIGV4cG9ydHMuU2NhbGUzZCA9IFNjYWxlM2Q7CiAgICBleHBvcnRzLlNjYWxpbmcgPSBTY2FsaW5nOwogICAgZXhwb3J0cy5TY2FuID0gU2NhbjsKICAgIGV4cG9ydHMuU2NhbkJhcmNvZGUgPSBTY2FuQmFyY29kZTsKICAgIGV4cG9ydHMuU2NhbkV5ZSA9IFNjYW5FeWU7CiAgICBleHBvcnRzLlNjYW5GYWNlID0gU2NhbkZhY2U7CiAgICBleHBvcnRzLlNjYW5IZWFydCA9IFNjYW5IZWFydDsKICAgIGV4cG9ydHMuU2NhbkxpbmUgPSBTY2FuTGluZTsKICAgIGV4cG9ydHMuU2NhblFyQ29kZSA9IFNjYW5RckNvZGU7CiAgICBleHBvcnRzLlNjYW5TZWFyY2ggPSBTY2FuU2VhcmNoOwogICAgZXhwb3J0cy5TY2FuVGV4dCA9IFNjYW5UZXh0OwogICAgZXhwb3J0cy5TY2F0dGVyQ2hhcnQgPSBDaGFydFNjYXR0ZXI7CiAgICBleHBvcnRzLlNjaG9vbCA9IFNjaG9vbDsKICAgIGV4cG9ydHMuU2Nob29sMiA9IFVuaXZlcnNpdHk7CiAgICBleHBvcnRzLlNjaXNzb3JzID0gU2Npc3NvcnM7CiAgICBleHBvcnRzLlNjaXNzb3JzTGluZURhc2hlZCA9IFNjaXNzb3JzTGluZURhc2hlZDsKICAgIGV4cG9ydHMuU2Npc3NvcnNTcXVhcmUgPSBTcXVhcmVTY2lzc29yczsKICAgIGV4cG9ydHMuU2Npc3NvcnNTcXVhcmVEYXNoZWRCb3R0b20gPSBTcXVhcmVCb3R0b21EYXNoZWRTY2lzc29yczsKICAgIGV4cG9ydHMuU2Nvb3RlciA9IFNjb290ZXI7CiAgICBleHBvcnRzLlNjcmVlblNoYXJlID0gU2NyZWVuU2hhcmU7CiAgICBleHBvcnRzLlNjcmVlblNoYXJlT2ZmID0gU2NyZWVuU2hhcmVPZmY7CiAgICBleHBvcnRzLlNjcm9sbCA9IFNjcm9sbDsKICAgIGV4cG9ydHMuU2Nyb2xsVGV4dCA9IFNjcm9sbFRleHQ7CiAgICBleHBvcnRzLlNlYXJjaCA9IFNlYXJjaDsKICAgIGV4cG9ydHMuU2VhcmNoQWxlcnQgPSBTZWFyY2hBbGVydDsKICAgIGV4cG9ydHMuU2VhcmNoQ2hlY2sgPSBTZWFyY2hDaGVjazsKICAgIGV4cG9ydHMuU2VhcmNoQ29kZSA9IFNlYXJjaENvZGU7CiAgICBleHBvcnRzLlNlYXJjaFNsYXNoID0gU2VhcmNoU2xhc2g7CiAgICBleHBvcnRzLlNlYXJjaFggPSBTZWFyY2hYOwogICAgZXhwb3J0cy5TZWN0aW9uID0gU2VjdGlvbjsKICAgIGV4cG9ydHMuU2VuZCA9IFNlbmQ7CiAgICBleHBvcnRzLlNlbmRIb3Jpem9uYWwgPSBTZW5kSG9yaXpvbnRhbDsKICAgIGV4cG9ydHMuU2VuZEhvcml6b250YWwgPSBTZW5kSG9yaXpvbnRhbDsKICAgIGV4cG9ydHMuU2VuZFRvQmFjayA9IFNlbmRUb0JhY2s7CiAgICBleHBvcnRzLlNlcGFyYXRvckhvcml6b250YWwgPSBTZXBhcmF0b3JIb3Jpem9udGFsOwogICAgZXhwb3J0cy5TZXBhcmF0b3JWZXJ0aWNhbCA9IFNlcGFyYXRvclZlcnRpY2FsOwogICAgZXhwb3J0cy5TZXJ2ZXIgPSBTZXJ2ZXI7CiAgICBleHBvcnRzLlNlcnZlckNvZyA9IFNlcnZlckNvZzsKICAgIGV4cG9ydHMuU2VydmVyQ3Jhc2ggPSBTZXJ2ZXJDcmFzaDsKICAgIGV4cG9ydHMuU2VydmVyT2ZmID0gU2VydmVyT2ZmOwogICAgZXhwb3J0cy5TZXR0aW5ncyA9IFNldHRpbmdzOwogICAgZXhwb3J0cy5TZXR0aW5nczIgPSBTZXR0aW5nczI7CiAgICBleHBvcnRzLlNoYXBlcyA9IFNoYXBlczsKICAgIGV4cG9ydHMuU2hhcmUgPSBTaGFyZTsKICAgIGV4cG9ydHMuU2hhcmUyID0gU2hhcmUyOwogICAgZXhwb3J0cy5TaGVldCA9IFNoZWV0OwogICAgZXhwb3J0cy5TaGVsbCA9IFNoZWxsOwogICAgZXhwb3J0cy5TaGllbGQgPSBTaGllbGQ7CiAgICBleHBvcnRzLlNoaWVsZEFsZXJ0ID0gU2hpZWxkQWxlcnQ7CiAgICBleHBvcnRzLlNoaWVsZEJhbiA9IFNoaWVsZEJhbjsKICAgIGV4cG9ydHMuU2hpZWxkQ2hlY2sgPSBTaGllbGRDaGVjazsKICAgIGV4cG9ydHMuU2hpZWxkQ2xvc2UgPSBTaGllbGRYOwogICAgZXhwb3J0cy5TaGllbGRFbGxpcHNpcyA9IFNoaWVsZEVsbGlwc2lzOwogICAgZXhwb3J0cy5TaGllbGRIYWxmID0gU2hpZWxkSGFsZjsKICAgIGV4cG9ydHMuU2hpZWxkTWludXMgPSBTaGllbGRNaW51czsKICAgIGV4cG9ydHMuU2hpZWxkT2ZmID0gU2hpZWxkT2ZmOwogICAgZXhwb3J0cy5TaGllbGRQbHVzID0gU2hpZWxkUGx1czsKICAgIGV4cG9ydHMuU2hpZWxkUXVlc3Rpb24gPSBTaGllbGRRdWVzdGlvbk1hcms7CiAgICBleHBvcnRzLlNoaWVsZFF1ZXN0aW9uTWFyayA9IFNoaWVsZFF1ZXN0aW9uTWFyazsKICAgIGV4cG9ydHMuU2hpZWxkVXNlciA9IFNoaWVsZFVzZXI7CiAgICBleHBvcnRzLlNoaWVsZFggPSBTaGllbGRYOwogICAgZXhwb3J0cy5TaGlwID0gU2hpcDsKICAgIGV4cG9ydHMuU2hpcFdoZWVsID0gU2hpcFdoZWVsOwogICAgZXhwb3J0cy5TaGlydCA9IFNoaXJ0OwogICAgZXhwb3J0cy5TaG9wcGluZ0JhZyA9IFNob3BwaW5nQmFnOwogICAgZXhwb3J0cy5TaG9wcGluZ0Jhc2tldCA9IFNob3BwaW5nQmFza2V0OwogICAgZXhwb3J0cy5TaG9wcGluZ0NhcnQgPSBTaG9wcGluZ0NhcnQ7CiAgICBleHBvcnRzLlNob3ZlbCA9IFNob3ZlbDsKICAgIGV4cG9ydHMuU2hvd2VySGVhZCA9IFNob3dlckhlYWQ7CiAgICBleHBvcnRzLlNocmVkZGVyID0gU2hyZWRkZXI7CiAgICBleHBvcnRzLlNocmltcCA9IFNocmltcDsKICAgIGV4cG9ydHMuU2hyaW5rID0gU2hyaW5rOwogICAgZXhwb3J0cy5TaHJ1YiA9IFNocnViOwogICAgZXhwb3J0cy5TaHVmZmxlID0gU2h1ZmZsZTsKICAgIGV4cG9ydHMuU2lkZWJhciA9IFBhbmVsTGVmdDsKICAgIGV4cG9ydHMuU2lkZWJhckNsb3NlID0gUGFuZWxMZWZ0Q2xvc2U7CiAgICBleHBvcnRzLlNpZGViYXJPcGVuID0gUGFuZWxMZWZ0T3BlbjsKICAgIGV4cG9ydHMuU2lnbWEgPSBTaWdtYTsKICAgIGV4cG9ydHMuU2lnbWFTcXVhcmUgPSBTcXVhcmVTaWdtYTsKICAgIGV4cG9ydHMuU2lnbmFsID0gU2lnbmFsOwogICAgZXhwb3J0cy5TaWduYWxIaWdoID0gU2lnbmFsSGlnaDsKICAgIGV4cG9ydHMuU2lnbmFsTG93ID0gU2lnbmFsTG93OwogICAgZXhwb3J0cy5TaWduYWxNZWRpdW0gPSBTaWduYWxNZWRpdW07CiAgICBleHBvcnRzLlNpZ25hbFplcm8gPSBTaWduYWxaZXJvOwogICAgZXhwb3J0cy5TaWduYXR1cmUgPSBTaWduYXR1cmU7CiAgICBleHBvcnRzLlNpZ25wb3N0ID0gU2lnbnBvc3Q7CiAgICBleHBvcnRzLlNpZ25wb3N0QmlnID0gU2lnbnBvc3RCaWc7CiAgICBleHBvcnRzLlNpcmVuID0gU2lyZW47CiAgICBleHBvcnRzLlNraXBCYWNrID0gU2tpcEJhY2s7CiAgICBleHBvcnRzLlNraXBGb3J3YXJkID0gU2tpcEZvcndhcmQ7CiAgICBleHBvcnRzLlNrdWxsID0gU2t1bGw7CiAgICBleHBvcnRzLlNsYWNrID0gU2xhY2s7CiAgICBleHBvcnRzLlNsYXNoID0gU2xhc2g7CiAgICBleHBvcnRzLlNsYXNoU3F1YXJlID0gU3F1YXJlU2xhc2g7CiAgICBleHBvcnRzLlNsaWNlID0gU2xpY2U7CiAgICBleHBvcnRzLlNsaWRlcnMgPSBTbGlkZXJzVmVydGljYWw7CiAgICBleHBvcnRzLlNsaWRlcnNIb3Jpem9udGFsID0gU2xpZGVyc0hvcml6b250YWw7CiAgICBleHBvcnRzLlNsaWRlcnNWZXJ0aWNhbCA9IFNsaWRlcnNWZXJ0aWNhbDsKICAgIGV4cG9ydHMuU21hcnRwaG9uZSA9IFNtYXJ0cGhvbmU7CiAgICBleHBvcnRzLlNtYXJ0cGhvbmVDaGFyZ2luZyA9IFNtYXJ0cGhvbmVDaGFyZ2luZzsKICAgIGV4cG9ydHMuU21hcnRwaG9uZU5mYyA9IFNtYXJ0cGhvbmVOZmM7CiAgICBleHBvcnRzLlNtaWxlID0gU21pbGU7CiAgICBleHBvcnRzLlNtaWxlUGx1cyA9IFNtaWxlUGx1czsKICAgIGV4cG9ydHMuU25haWwgPSBTbmFpbDsKICAgIGV4cG9ydHMuU25vd2ZsYWtlID0gU25vd2ZsYWtlOwogICAgZXhwb3J0cy5Tb2FwRGlzcGVuc2VyRHJvcGxldCA9IFNvYXBEaXNwZW5zZXJEcm9wbGV0OwogICAgZXhwb3J0cy5Tb2ZhID0gU29mYTsKICAgIGV4cG9ydHMuU29sYXJQYW5lbCA9IFNvbGFyUGFuZWw7CiAgICBleHBvcnRzLlNvcnRBc2MgPSBBcnJvd1VwTmFycm93V2lkZTsKICAgIGV4cG9ydHMuU29ydERlc2MgPSBBcnJvd0Rvd25XaWRlTmFycm93OwogICAgZXhwb3J0cy5Tb3VwID0gU291cDsKICAgIGV4cG9ydHMuU3BhY2UgPSBTcGFjZTsKICAgIGV4cG9ydHMuU3BhZGUgPSBTcGFkZTsKICAgIGV4cG9ydHMuU3BhcmtsZSA9IFNwYXJrbGU7CiAgICBleHBvcnRzLlNwYXJrbGVzID0gU3BhcmtsZXM7CiAgICBleHBvcnRzLlNwZWFrZXIgPSBTcGVha2VyOwogICAgZXhwb3J0cy5TcGVlY2ggPSBTcGVlY2g7CiAgICBleHBvcnRzLlNwZWxsQ2hlY2sgPSBTcGVsbENoZWNrOwogICAgZXhwb3J0cy5TcGVsbENoZWNrMiA9IFNwZWxsQ2hlY2syOwogICAgZXhwb3J0cy5TcGxpbmUgPSBTcGxpbmU7CiAgICBleHBvcnRzLlNwbGluZVBvaW50ZXIgPSBTcGxpbmVQb2ludGVyOwogICAgZXhwb3J0cy5TcGxpdCA9IFNwbGl0OwogICAgZXhwb3J0cy5TcGxpdFNxdWFyZUhvcml6b250YWwgPSBTcXVhcmVTcGxpdEhvcml6b250YWw7CiAgICBleHBvcnRzLlNwbGl0U3F1YXJlVmVydGljYWwgPSBTcXVhcmVTcGxpdFZlcnRpY2FsOwogICAgZXhwb3J0cy5TcG9vbCA9IFNwb29sOwogICAgZXhwb3J0cy5TcG90bGlnaHQgPSBTcG90bGlnaHQ7CiAgICBleHBvcnRzLlNwcmF5Q2FuID0gU3ByYXlDYW47CiAgICBleHBvcnRzLlNwcm91dCA9IFNwcm91dDsKICAgIGV4cG9ydHMuU3F1YXJlID0gU3F1YXJlOwogICAgZXhwb3J0cy5TcXVhcmVBY3Rpdml0eSA9IFNxdWFyZUFjdGl2aXR5OwogICAgZXhwb3J0cy5TcXVhcmVBcnJvd0Rvd24gPSBTcXVhcmVBcnJvd0Rvd247CiAgICBleHBvcnRzLlNxdWFyZUFycm93RG93bkxlZnQgPSBTcXVhcmVBcnJvd0Rvd25MZWZ0OwogICAgZXhwb3J0cy5TcXVhcmVBcnJvd0Rvd25SaWdodCA9IFNxdWFyZUFycm93RG93blJpZ2h0OwogICAgZXhwb3J0cy5TcXVhcmVBcnJvd0xlZnQgPSBTcXVhcmVBcnJvd0xlZnQ7CiAgICBleHBvcnRzLlNxdWFyZUFycm93T3V0RG93bkxlZnQgPSBTcXVhcmVBcnJvd091dERvd25MZWZ0OwogICAgZXhwb3J0cy5TcXVhcmVBcnJvd091dERvd25SaWdodCA9IFNxdWFyZUFycm93T3V0RG93blJpZ2h0OwogICAgZXhwb3J0cy5TcXVhcmVBcnJvd091dFVwTGVmdCA9IFNxdWFyZUFycm93T3V0VXBMZWZ0OwogICAgZXhwb3J0cy5TcXVhcmVBcnJvd091dFVwUmlnaHQgPSBTcXVhcmVBcnJvd091dFVwUmlnaHQ7CiAgICBleHBvcnRzLlNxdWFyZUFycm93UmlnaHQgPSBTcXVhcmVBcnJvd1JpZ2h0OwogICAgZXhwb3J0cy5TcXVhcmVBcnJvd1VwID0gU3F1YXJlQXJyb3dVcDsKICAgIGV4cG9ydHMuU3F1YXJlQXJyb3dVcExlZnQgPSBTcXVhcmVBcnJvd1VwTGVmdDsKICAgIGV4cG9ydHMuU3F1YXJlQXJyb3dVcFJpZ2h0ID0gU3F1YXJlQXJyb3dVcFJpZ2h0OwogICAgZXhwb3J0cy5TcXVhcmVBc3RlcmlzayA9IFNxdWFyZUFzdGVyaXNrOwogICAgZXhwb3J0cy5TcXVhcmVCb3R0b21EYXNoZWRTY2lzc29ycyA9IFNxdWFyZUJvdHRvbURhc2hlZFNjaXNzb3JzOwogICAgZXhwb3J0cy5TcXVhcmVDaGFydEdhbnR0ID0gU3F1YXJlQ2hhcnRHYW50dDsKICAgIGV4cG9ydHMuU3F1YXJlQ2hlY2sgPSBTcXVhcmVDaGVjazsKICAgIGV4cG9ydHMuU3F1YXJlQ2hlY2tCaWcgPSBTcXVhcmVDaGVja0JpZzsKICAgIGV4cG9ydHMuU3F1YXJlQ2hldnJvbkRvd24gPSBTcXVhcmVDaGV2cm9uRG93bjsKICAgIGV4cG9ydHMuU3F1YXJlQ2hldnJvbkxlZnQgPSBTcXVhcmVDaGV2cm9uTGVmdDsKICAgIGV4cG9ydHMuU3F1YXJlQ2hldnJvblJpZ2h0ID0gU3F1YXJlQ2hldnJvblJpZ2h0OwogICAgZXhwb3J0cy5TcXVhcmVDaGV2cm9uVXAgPSBTcXVhcmVDaGV2cm9uVXA7CiAgICBleHBvcnRzLlNxdWFyZUNvZGUgPSBTcXVhcmVDb2RlOwogICAgZXhwb3J0cy5TcXVhcmVEYXNoZWQgPSBTcXVhcmVEYXNoZWQ7CiAgICBleHBvcnRzLlNxdWFyZURhc2hlZEJvdHRvbSA9IFNxdWFyZURhc2hlZEJvdHRvbTsKICAgIGV4cG9ydHMuU3F1YXJlRGFzaGVkQm90dG9tQ29kZSA9IFNxdWFyZURhc2hlZEJvdHRvbUNvZGU7CiAgICBleHBvcnRzLlNxdWFyZURhc2hlZEthbmJhbiA9IFNxdWFyZURhc2hlZEthbmJhbjsKICAgIGV4cG9ydHMuU3F1YXJlRGFzaGVkTW91c2VQb2ludGVyID0gU3F1YXJlRGFzaGVkTW91c2VQb2ludGVyOwogICAgZXhwb3J0cy5TcXVhcmVEYXNoZWRUb3BTb2xpZCA9IFNxdWFyZURhc2hlZFRvcFNvbGlkOwogICAgZXhwb3J0cy5TcXVhcmVEaXZpZGUgPSBTcXVhcmVEaXZpZGU7CiAgICBleHBvcnRzLlNxdWFyZURvdCA9IFNxdWFyZURvdDsKICAgIGV4cG9ydHMuU3F1YXJlRXF1YWwgPSBTcXVhcmVFcXVhbDsKICAgIGV4cG9ydHMuU3F1YXJlRnVuY3Rpb24gPSBTcXVhcmVGdW5jdGlvbjsKICAgIGV4cG9ydHMuU3F1YXJlR2FudHRDaGFydCA9IFNxdWFyZUNoYXJ0R2FudHQ7CiAgICBleHBvcnRzLlNxdWFyZUthbmJhbiA9IFNxdWFyZUthbmJhbjsKICAgIGV4cG9ydHMuU3F1YXJlTGlicmFyeSA9IFNxdWFyZUxpYnJhcnk7CiAgICBleHBvcnRzLlNxdWFyZU0gPSBTcXVhcmVNOwogICAgZXhwb3J0cy5TcXVhcmVNZW51ID0gU3F1YXJlTWVudTsKICAgIGV4cG9ydHMuU3F1YXJlTWludXMgPSBTcXVhcmVNaW51czsKICAgIGV4cG9ydHMuU3F1YXJlTW91c2VQb2ludGVyID0gU3F1YXJlTW91c2VQb2ludGVyOwogICAgZXhwb3J0cy5TcXVhcmVQYXJraW5nID0gU3F1YXJlUGFya2luZzsKICAgIGV4cG9ydHMuU3F1YXJlUGFya2luZ09mZiA9IFNxdWFyZVBhcmtpbmdPZmY7CiAgICBleHBvcnRzLlNxdWFyZVBhdXNlID0gU3F1YXJlUGF1c2U7CiAgICBleHBvcnRzLlNxdWFyZVBlbiA9IFNxdWFyZVBlbjsKICAgIGV4cG9ydHMuU3F1YXJlUGVyY2VudCA9IFNxdWFyZVBlcmNlbnQ7CiAgICBleHBvcnRzLlNxdWFyZVBpID0gU3F1YXJlUGk7CiAgICBleHBvcnRzLlNxdWFyZVBpbGNyb3cgPSBTcXVhcmVQaWxjcm93OwogICAgZXhwb3J0cy5TcXVhcmVQbGF5ID0gU3F1YXJlUGxheTsKICAgIGV4cG9ydHMuU3F1YXJlUGx1cyA9IFNxdWFyZVBsdXM7CiAgICBleHBvcnRzLlNxdWFyZVBvd2VyID0gU3F1YXJlUG93ZXI7CiAgICBleHBvcnRzLlNxdWFyZVJhZGljYWwgPSBTcXVhcmVSYWRpY2FsOwogICAgZXhwb3J0cy5TcXVhcmVSb3VuZENvcm5lciA9IFNxdWFyZVJvdW5kQ29ybmVyOwogICAgZXhwb3J0cy5TcXVhcmVTY2lzc29ycyA9IFNxdWFyZVNjaXNzb3JzOwogICAgZXhwb3J0cy5TcXVhcmVTaWdtYSA9IFNxdWFyZVNpZ21hOwogICAgZXhwb3J0cy5TcXVhcmVTbGFzaCA9IFNxdWFyZVNsYXNoOwogICAgZXhwb3J0cy5TcXVhcmVTcGxpdEhvcml6b250YWwgPSBTcXVhcmVTcGxpdEhvcml6b250YWw7CiAgICBleHBvcnRzLlNxdWFyZVNwbGl0VmVydGljYWwgPSBTcXVhcmVTcGxpdFZlcnRpY2FsOwogICAgZXhwb3J0cy5TcXVhcmVTcXVhcmUgPSBTcXVhcmVTcXVhcmU7CiAgICBleHBvcnRzLlNxdWFyZVN0YWNrID0gU3F1YXJlU3RhY2s7CiAgICBleHBvcnRzLlNxdWFyZVN0YXIgPSBTcXVhcmVTdGFyOwogICAgZXhwb3J0cy5TcXVhcmVTdG9wID0gU3F1YXJlU3RvcDsKICAgIGV4cG9ydHMuU3F1YXJlVGVybWluYWwgPSBTcXVhcmVUZXJtaW5hbDsKICAgIGV4cG9ydHMuU3F1YXJlVXNlciA9IFNxdWFyZVVzZXI7CiAgICBleHBvcnRzLlNxdWFyZVVzZXJSb3VuZCA9IFNxdWFyZVVzZXJSb3VuZDsKICAgIGV4cG9ydHMuU3F1YXJlWCA9IFNxdWFyZVg7CiAgICBleHBvcnRzLlNxdWFyZXNFeGNsdWRlID0gU3F1YXJlc0V4Y2x1ZGU7CiAgICBleHBvcnRzLlNxdWFyZXNJbnRlcnNlY3QgPSBTcXVhcmVzSW50ZXJzZWN0OwogICAgZXhwb3J0cy5TcXVhcmVzU3VidHJhY3QgPSBTcXVhcmVzU3VidHJhY3Q7CiAgICBleHBvcnRzLlNxdWFyZXNVbml0ZSA9IFNxdWFyZXNVbml0ZTsKICAgIGV4cG9ydHMuU3F1aXJjbGUgPSBTcXVpcmNsZTsKICAgIGV4cG9ydHMuU3F1aXJjbGVEYXNoZWQgPSBTcXVpcmNsZURhc2hlZDsKICAgIGV4cG9ydHMuU3F1aXJyZWwgPSBTcXVpcnJlbDsKICAgIGV4cG9ydHMuU3RhbXAgPSBTdGFtcDsKICAgIGV4cG9ydHMuU3RhciA9IFN0YXI7CiAgICBleHBvcnRzLlN0YXJIYWxmID0gU3RhckhhbGY7CiAgICBleHBvcnRzLlN0YXJPZmYgPSBTdGFyT2ZmOwogICAgZXhwb3J0cy5TdGFycyA9IFNwYXJrbGVzOwogICAgZXhwb3J0cy5TdGVwQmFjayA9IFN0ZXBCYWNrOwogICAgZXhwb3J0cy5TdGVwRm9yd2FyZCA9IFN0ZXBGb3J3YXJkOwogICAgZXhwb3J0cy5TdGV0aG9zY29wZSA9IFN0ZXRob3Njb3BlOwogICAgZXhwb3J0cy5TdGlja2VyID0gU3RpY2tlcjsKICAgIGV4cG9ydHMuU3RpY2t5Tm90ZSA9IFN0aWNreU5vdGU7CiAgICBleHBvcnRzLlN0b25lID0gU3RvbmU7CiAgICBleHBvcnRzLlN0b3BDaXJjbGUgPSBDaXJjbGVTdG9wOwogICAgZXhwb3J0cy5TdG9yZSA9IFN0b3JlOwogICAgZXhwb3J0cy5TdHJldGNoSG9yaXpvbnRhbCA9IFN0cmV0Y2hIb3Jpem9udGFsOwogICAgZXhwb3J0cy5TdHJldGNoVmVydGljYWwgPSBTdHJldGNoVmVydGljYWw7CiAgICBleHBvcnRzLlN0cmlrZXRocm91Z2ggPSBTdHJpa2V0aHJvdWdoOwogICAgZXhwb3J0cy5TdWJzY3JpcHQgPSBTdWJzY3JpcHQ7CiAgICBleHBvcnRzLlN1YnRpdGxlcyA9IENhcHRpb25zOwogICAgZXhwb3J0cy5TdW4gPSBTdW47CiAgICBleHBvcnRzLlN1bkRpbSA9IFN1bkRpbTsKICAgIGV4cG9ydHMuU3VuTWVkaXVtID0gU3VuTWVkaXVtOwogICAgZXhwb3J0cy5TdW5Nb29uID0gU3VuTW9vbjsKICAgIGV4cG9ydHMuU3VuU25vdyA9IFN1blNub3c7CiAgICBleHBvcnRzLlN1bnJpc2UgPSBTdW5yaXNlOwogICAgZXhwb3J0cy5TdW5zZXQgPSBTdW5zZXQ7CiAgICBleHBvcnRzLlN1cGVyc2NyaXB0ID0gU3VwZXJzY3JpcHQ7CiAgICBleHBvcnRzLlN3YXRjaEJvb2sgPSBTd2F0Y2hCb29rOwogICAgZXhwb3J0cy5Td2lzc0ZyYW5jID0gU3dpc3NGcmFuYzsKICAgIGV4cG9ydHMuU3dpdGNoQ2FtZXJhID0gU3dpdGNoQ2FtZXJhOwogICAgZXhwb3J0cy5Td29yZCA9IFN3b3JkOwogICAgZXhwb3J0cy5Td29yZHMgPSBTd29yZHM7CiAgICBleHBvcnRzLlN5cmluZ2UgPSBTeXJpbmdlOwogICAgZXhwb3J0cy5UYWJsZSA9IFRhYmxlOwogICAgZXhwb3J0cy5UYWJsZTIgPSBUYWJsZTI7CiAgICBleHBvcnRzLlRhYmxlQ2VsbHNNZXJnZSA9IFRhYmxlQ2VsbHNNZXJnZTsKICAgIGV4cG9ydHMuVGFibGVDZWxsc1NwbGl0ID0gVGFibGVDZWxsc1NwbGl0OwogICAgZXhwb3J0cy5UYWJsZUNvbHVtbnNTcGxpdCA9IFRhYmxlQ29sdW1uc1NwbGl0OwogICAgZXhwb3J0cy5UYWJsZUNvbmZpZyA9IENvbHVtbnMzQ29nOwogICAgZXhwb3J0cy5UYWJsZU9mQ29udGVudHMgPSBUYWJsZU9mQ29udGVudHM7CiAgICBleHBvcnRzLlRhYmxlUHJvcGVydGllcyA9IFRhYmxlUHJvcGVydGllczsKICAgIGV4cG9ydHMuVGFibGVSb3dzU3BsaXQgPSBUYWJsZVJvd3NTcGxpdDsKICAgIGV4cG9ydHMuVGFibGV0ID0gVGFibGV0OwogICAgZXhwb3J0cy5UYWJsZXRTbWFydHBob25lID0gVGFibGV0U21hcnRwaG9uZTsKICAgIGV4cG9ydHMuVGFibGV0cyA9IFRhYmxldHM7CiAgICBleHBvcnRzLlRhZyA9IFRhZzI7CiAgICBleHBvcnRzLlRhZ3MgPSBUYWdzOwogICAgZXhwb3J0cy5UYWxseTEgPSBUYWxseTE7CiAgICBleHBvcnRzLlRhbGx5MiA9IFRhbGx5MjsKICAgIGV4cG9ydHMuVGFsbHkzID0gVGFsbHkzOwogICAgZXhwb3J0cy5UYWxseTQgPSBUYWxseTQ7CiAgICBleHBvcnRzLlRhbGx5NSA9IFRhbGx5NTsKICAgIGV4cG9ydHMuVGFuZ2VudCA9IFRhbmdlbnQ7CiAgICBleHBvcnRzLlRhcmdldCA9IFRhcmdldDsKICAgIGV4cG9ydHMuVGVsZXNjb3BlID0gVGVsZXNjb3BlOwogICAgZXhwb3J0cy5UZW50ID0gVGVudDsKICAgIGV4cG9ydHMuVGVudFRyZWUgPSBUZW50VHJlZTsKICAgIGV4cG9ydHMuVGVybWluYWwgPSBUZXJtaW5hbDsKICAgIGV4cG9ydHMuVGVybWluYWxTcXVhcmUgPSBTcXVhcmVUZXJtaW5hbDsKICAgIGV4cG9ydHMuVGVzdFR1YmUgPSBUZXN0VHViZTsKICAgIGV4cG9ydHMuVGVzdFR1YmUyID0gVGVzdFR1YmVEaWFnb25hbDsKICAgIGV4cG9ydHMuVGVzdFR1YmVEaWFnb25hbCA9IFRlc3RUdWJlRGlhZ29uYWw7CiAgICBleHBvcnRzLlRlc3RUdWJlcyA9IFRlc3RUdWJlczsKICAgIGV4cG9ydHMuVGV4dCA9IFRleHRBbGlnblN0YXJ0OwogICAgZXhwb3J0cy5UZXh0QWxpZ25DZW50ZXIgPSBUZXh0QWxpZ25DZW50ZXI7CiAgICBleHBvcnRzLlRleHRBbGlnbkVuZCA9IFRleHRBbGlnbkVuZDsKICAgIGV4cG9ydHMuVGV4dEFsaWduSnVzdGlmeSA9IFRleHRBbGlnbkp1c3RpZnk7CiAgICBleHBvcnRzLlRleHRBbGlnblN0YXJ0ID0gVGV4dEFsaWduU3RhcnQ7CiAgICBleHBvcnRzLlRleHRDdXJzb3IgPSBUZXh0Q3Vyc29yOwogICAgZXhwb3J0cy5UZXh0Q3Vyc29ySW5wdXQgPSBUZXh0Q3Vyc29ySW5wdXQ7CiAgICBleHBvcnRzLlRleHRJbml0aWFsID0gVGV4dEluaXRpYWw7CiAgICBleHBvcnRzLlRleHRRdW90ZSA9IFRleHRRdW90ZTsKICAgIGV4cG9ydHMuVGV4dFNlYXJjaCA9IFRleHRTZWFyY2g7CiAgICBleHBvcnRzLlRleHRTZWxlY3QgPSBUZXh0U2VsZWN0OwogICAgZXhwb3J0cy5UZXh0U2VsZWN0aW9uID0gVGV4dFNlbGVjdDsKICAgIGV4cG9ydHMuVGV4dFdyYXAgPSBUZXh0V3JhcDsKICAgIGV4cG9ydHMuVGhlYXRlciA9IFRoZWF0ZXI7CiAgICBleHBvcnRzLlRoZXJtb21ldGVyID0gVGhlcm1vbWV0ZXI7CiAgICBleHBvcnRzLlRoZXJtb21ldGVyU25vd2ZsYWtlID0gVGhlcm1vbWV0ZXJTbm93Zmxha2U7CiAgICBleHBvcnRzLlRoZXJtb21ldGVyU3VuID0gVGhlcm1vbWV0ZXJTdW47CiAgICBleHBvcnRzLlRodW1ic0Rvd24gPSBUaHVtYnNEb3duOwogICAgZXhwb3J0cy5UaHVtYnNVcCA9IFRodW1ic1VwOwogICAgZXhwb3J0cy5UaWNrZXQgPSBUaWNrZXQ7CiAgICBleHBvcnRzLlRpY2tldENoZWNrID0gVGlja2V0Q2hlY2s7CiAgICBleHBvcnRzLlRpY2tldE1pbnVzID0gVGlja2V0TWludXM7CiAgICBleHBvcnRzLlRpY2tldFBlcmNlbnQgPSBUaWNrZXRQZXJjZW50OwogICAgZXhwb3J0cy5UaWNrZXRQbHVzID0gVGlja2V0UGx1czsKICAgIGV4cG9ydHMuVGlja2V0U2xhc2ggPSBUaWNrZXRTbGFzaDsKICAgIGV4cG9ydHMuVGlja2V0WCA9IFRpY2tldFg7CiAgICBleHBvcnRzLlRpY2tldHMgPSBUaWNrZXRzOwogICAgZXhwb3J0cy5UaWNrZXRzUGxhbmUgPSBUaWNrZXRzUGxhbmU7CiAgICBleHBvcnRzLlRpbWVyID0gVGltZXIyOwogICAgZXhwb3J0cy5UaW1lck9mZiA9IFRpbWVyT2ZmOwogICAgZXhwb3J0cy5UaW1lclJlc2V0ID0gVGltZXJSZXNldDsKICAgIGV4cG9ydHMuVG9nZ2xlTGVmdCA9IFRvZ2dsZUxlZnQ7CiAgICBleHBvcnRzLlRvZ2dsZVJpZ2h0ID0gVG9nZ2xlUmlnaHQ7CiAgICBleHBvcnRzLlRvaWxldCA9IFRvaWxldDsKICAgIGV4cG9ydHMuVG9vbENhc2UgPSBUb29sQ2FzZTsKICAgIGV4cG9ydHMuVG9vbGJveCA9IFRvb2xib3g7CiAgICBleHBvcnRzLlRvcm5hZG8gPSBUb3JuYWRvOwogICAgZXhwb3J0cy5Ub3J1cyA9IFRvcnVzOwogICAgZXhwb3J0cy5Ub3VjaHBhZCA9IFRvdWNocGFkOwogICAgZXhwb3J0cy5Ub3VjaHBhZE9mZiA9IFRvdWNocGFkT2ZmOwogICAgZXhwb3J0cy5Ub3dlckNvbnRyb2wgPSBUb3dlckNvbnRyb2w7CiAgICBleHBvcnRzLlRveUJyaWNrID0gVG95QnJpY2s7CiAgICBleHBvcnRzLlRyYWN0b3IgPSBUcmFjdG9yOwogICAgZXhwb3J0cy5UcmFmZmljQ29uZSA9IFRyYWZmaWNDb25lOwogICAgZXhwb3J0cy5UcmFpbiA9IFRyYW1Gcm9udDsKICAgIGV4cG9ydHMuVHJhaW5Gcm9udCA9IFRyYWluRnJvbnQ7CiAgICBleHBvcnRzLlRyYWluRnJvbnRUdW5uZWwgPSBUcmFpbkZyb250VHVubmVsOwogICAgZXhwb3J0cy5UcmFpblRyYWNrID0gVHJhaW5UcmFjazsKICAgIGV4cG9ydHMuVHJhbUZyb250ID0gVHJhbUZyb250OwogICAgZXhwb3J0cy5UcmFuc2dlbmRlciA9IFRyYW5zZ2VuZGVyOwogICAgZXhwb3J0cy5UcmFzaCA9IFRyYXNoOwogICAgZXhwb3J0cy5UcmFzaDIgPSBUcmFzaDI7CiAgICBleHBvcnRzLlRyZWVEZWNpZHVvdXMgPSBUcmVlRGVjaWR1b3VzOwogICAgZXhwb3J0cy5UcmVlUGFsbSA9IFRyZWVQYWxtOwogICAgZXhwb3J0cy5UcmVlUGluZSA9IFRyZWVQaW5lOwogICAgZXhwb3J0cy5UcmVlcyA9IFRyZWVzOwogICAgZXhwb3J0cy5UcmVsbG8gPSBUcmVsbG87CiAgICBleHBvcnRzLlRyZW5kaW5nRG93biA9IFRyZW5kaW5nRG93bjsKICAgIGV4cG9ydHMuVHJlbmRpbmdVcCA9IFRyZW5kaW5nVXA7CiAgICBleHBvcnRzLlRyZW5kaW5nVXBEb3duID0gVHJlbmRpbmdVcERvd247CiAgICBleHBvcnRzLlRyaWFuZ2xlID0gVHJpYW5nbGU7CiAgICBleHBvcnRzLlRyaWFuZ2xlQWxlcnQgPSBUcmlhbmdsZUFsZXJ0OwogICAgZXhwb3J0cy5UcmlhbmdsZURhc2hlZCA9IFRyaWFuZ2xlRGFzaGVkOwogICAgZXhwb3J0cy5UcmlhbmdsZVJpZ2h0ID0gVHJpYW5nbGVSaWdodDsKICAgIGV4cG9ydHMuVHJvcGh5ID0gVHJvcGh5OwogICAgZXhwb3J0cy5UcnVjayA9IFRydWNrOwogICAgZXhwb3J0cy5UcnVja0VsZWN0cmljID0gVHJ1Y2tFbGVjdHJpYzsKICAgIGV4cG9ydHMuVHVya2lzaExpcmEgPSBUdXJraXNoTGlyYTsKICAgIGV4cG9ydHMuVHVybnRhYmxlID0gVHVybnRhYmxlOwogICAgZXhwb3J0cy5UdXJ0bGUgPSBUdXJ0bGU7CiAgICBleHBvcnRzLlR2ID0gVHY7CiAgICBleHBvcnRzLlR2MiA9IFR2TWluaW1hbDsKICAgIGV4cG9ydHMuVHZNaW5pbWFsID0gVHZNaW5pbWFsOwogICAgZXhwb3J0cy5Udk1pbmltYWxQbGF5ID0gVHZNaW5pbWFsUGxheTsKICAgIGV4cG9ydHMuVHdpdGNoID0gVHdpdGNoOwogICAgZXhwb3J0cy5Ud2l0dGVyID0gVHdpdHRlcjsKICAgIGV4cG9ydHMuVHlwZSA9IFR5cGU7CiAgICBleHBvcnRzLlR5cGVPdXRsaW5lID0gVHlwZU91dGxpbmU7CiAgICBleHBvcnRzLlVtYnJlbGxhID0gVW1icmVsbGE7CiAgICBleHBvcnRzLlVtYnJlbGxhT2ZmID0gVW1icmVsbGFPZmY7CiAgICBleHBvcnRzLlVuZGVybGluZSA9IFVuZGVybGluZTsKICAgIGV4cG9ydHMuVW5kbyA9IFVuZG87CiAgICBleHBvcnRzLlVuZG8yID0gVW5kbzI7CiAgICBleHBvcnRzLlVuZG9Eb3QgPSBVbmRvRG90OwogICAgZXhwb3J0cy5VbmZvbGRIb3Jpem9udGFsID0gVW5mb2xkSG9yaXpvbnRhbDsKICAgIGV4cG9ydHMuVW5mb2xkVmVydGljYWwgPSBVbmZvbGRWZXJ0aWNhbDsKICAgIGV4cG9ydHMuVW5ncm91cCA9IFVuZ3JvdXA7CiAgICBleHBvcnRzLlVuaXZlcnNpdHkgPSBVbml2ZXJzaXR5OwogICAgZXhwb3J0cy5VbmxpbmsgPSBVbmxpbms7CiAgICBleHBvcnRzLlVubGluazIgPSBVbmxpbmsyOwogICAgZXhwb3J0cy5VbmxvY2sgPSBMb2NrT3BlbjsKICAgIGV4cG9ydHMuVW5sb2NrS2V5aG9sZSA9IExvY2tLZXlob2xlT3BlbjsKICAgIGV4cG9ydHMuVW5wbHVnID0gVW5wbHVnOwogICAgZXhwb3J0cy5VcGxvYWQgPSBVcGxvYWQ7CiAgICBleHBvcnRzLlVwbG9hZENsb3VkID0gQ2xvdWRVcGxvYWQ7CiAgICBleHBvcnRzLlVzYiA9IFVzYjsKICAgIGV4cG9ydHMuVXNlciA9IFVzZXI7CiAgICBleHBvcnRzLlVzZXIyID0gVXNlclJvdW5kOwogICAgZXhwb3J0cy5Vc2VyQ2hlY2sgPSBVc2VyQ2hlY2s7CiAgICBleHBvcnRzLlVzZXJDaGVjazIgPSBVc2VyUm91bmRDaGVjazsKICAgIGV4cG9ydHMuVXNlckNpcmNsZSA9IENpcmNsZVVzZXI7CiAgICBleHBvcnRzLlVzZXJDaXJjbGUyID0gQ2lyY2xlVXNlclJvdW5kOwogICAgZXhwb3J0cy5Vc2VyQ29nID0gVXNlckNvZzsKICAgIGV4cG9ydHMuVXNlckNvZzIgPSBVc2VyUm91bmRDb2c7CiAgICBleHBvcnRzLlVzZXJMb2NrID0gVXNlckxvY2s7CiAgICBleHBvcnRzLlVzZXJNaW51cyA9IFVzZXJNaW51czsKICAgIGV4cG9ydHMuVXNlck1pbnVzMiA9IFVzZXJSb3VuZE1pbnVzOwogICAgZXhwb3J0cy5Vc2VyUGVuID0gVXNlclBlbjsKICAgIGV4cG9ydHMuVXNlclBsdXMgPSBVc2VyUGx1czsKICAgIGV4cG9ydHMuVXNlclBsdXMyID0gVXNlclJvdW5kUGx1czsKICAgIGV4cG9ydHMuVXNlclJvdW5kID0gVXNlclJvdW5kOwogICAgZXhwb3J0cy5Vc2VyUm91bmRDaGVjayA9IFVzZXJSb3VuZENoZWNrOwogICAgZXhwb3J0cy5Vc2VyUm91bmRDb2cgPSBVc2VyUm91bmRDb2c7CiAgICBleHBvcnRzLlVzZXJSb3VuZE1pbnVzID0gVXNlclJvdW5kTWludXM7CiAgICBleHBvcnRzLlVzZXJSb3VuZFBlbiA9IFVzZXJSb3VuZFBlbjsKICAgIGV4cG9ydHMuVXNlclJvdW5kUGx1cyA9IFVzZXJSb3VuZFBsdXM7CiAgICBleHBvcnRzLlVzZXJSb3VuZFNlYXJjaCA9IFVzZXJSb3VuZFNlYXJjaDsKICAgIGV4cG9ydHMuVXNlclJvdW5kWCA9IFVzZXJSb3VuZFg7CiAgICBleHBvcnRzLlVzZXJTZWFyY2ggPSBVc2VyU2VhcmNoOwogICAgZXhwb3J0cy5Vc2VyU3F1YXJlID0gU3F1YXJlVXNlcjsKICAgIGV4cG9ydHMuVXNlclNxdWFyZTIgPSBTcXVhcmVVc2VyUm91bmQ7CiAgICBleHBvcnRzLlVzZXJTdGFyID0gVXNlclN0YXI7CiAgICBleHBvcnRzLlVzZXJYID0gVXNlclg7CiAgICBleHBvcnRzLlVzZXJYMiA9IFVzZXJSb3VuZFg7CiAgICBleHBvcnRzLlVzZXJzID0gVXNlcnM7CiAgICBleHBvcnRzLlVzZXJzMiA9IFVzZXJzUm91bmQ7CiAgICBleHBvcnRzLlVzZXJzUm91bmQgPSBVc2Vyc1JvdW5kOwogICAgZXhwb3J0cy5VdGVuc2lscyA9IFV0ZW5zaWxzOwogICAgZXhwb3J0cy5VdGVuc2lsc0Nyb3NzZWQgPSBVdGVuc2lsc0Nyb3NzZWQ7CiAgICBleHBvcnRzLlV0aWxpdHlQb2xlID0gVXRpbGl0eVBvbGU7CiAgICBleHBvcnRzLlZhbiA9IFZhbjsKICAgIGV4cG9ydHMuVmFyaWFibGUgPSBWYXJpYWJsZTsKICAgIGV4cG9ydHMuVmF1bHQgPSBWYXVsdDsKICAgIGV4cG9ydHMuVmVjdG9yU3F1YXJlID0gVmVjdG9yU3F1YXJlOwogICAgZXhwb3J0cy5WZWdhbiA9IFZlZ2FuOwogICAgZXhwb3J0cy5WZW5ldGlhbk1hc2sgPSBWZW5ldGlhbk1hc2s7CiAgICBleHBvcnRzLlZlbnVzID0gVmVudXM7CiAgICBleHBvcnRzLlZlbnVzQW5kTWFycyA9IFZlbnVzQW5kTWFyczsKICAgIGV4cG9ydHMuVmVyaWZpZWQgPSBCYWRnZUNoZWNrOwogICAgZXhwb3J0cy5WaWJyYXRlID0gVmlicmF0ZTsKICAgIGV4cG9ydHMuVmlicmF0ZU9mZiA9IFZpYnJhdGVPZmY7CiAgICBleHBvcnRzLlZpZGVvID0gVmlkZW87CiAgICBleHBvcnRzLlZpZGVvT2ZmID0gVmlkZW9PZmY7CiAgICBleHBvcnRzLlZpZGVvdGFwZSA9IFZpZGVvdGFwZTsKICAgIGV4cG9ydHMuVmlldyA9IFZpZXc7CiAgICBleHBvcnRzLlZvaWNlbWFpbCA9IFZvaWNlbWFpbDsKICAgIGV4cG9ydHMuVm9sbGV5YmFsbCA9IFZvbGxleWJhbGw7CiAgICBleHBvcnRzLlZvbHVtZSA9IFZvbHVtZTsKICAgIGV4cG9ydHMuVm9sdW1lMSA9IFZvbHVtZTE7CiAgICBleHBvcnRzLlZvbHVtZTIgPSBWb2x1bWUyOwogICAgZXhwb3J0cy5Wb2x1bWVPZmYgPSBWb2x1bWVPZmY7CiAgICBleHBvcnRzLlZvbHVtZVggPSBWb2x1bWVYOwogICAgZXhwb3J0cy5Wb3RlID0gVm90ZTsKICAgIGV4cG9ydHMuV2FsbGV0ID0gV2FsbGV0OwogICAgZXhwb3J0cy5XYWxsZXQyID0gV2FsbGV0TWluaW1hbDsKICAgIGV4cG9ydHMuV2FsbGV0Q2FyZHMgPSBXYWxsZXRDYXJkczsKICAgIGV4cG9ydHMuV2FsbGV0TWluaW1hbCA9IFdhbGxldE1pbmltYWw7CiAgICBleHBvcnRzLldhbGxwYXBlciA9IFdhbGxwYXBlcjsKICAgIGV4cG9ydHMuV2FuZCA9IFdhbmQ7CiAgICBleHBvcnRzLldhbmQyID0gV2FuZFNwYXJrbGVzOwogICAgZXhwb3J0cy5XYW5kU3BhcmtsZXMgPSBXYW5kU3BhcmtsZXM7CiAgICBleHBvcnRzLldhcmVob3VzZSA9IFdhcmVob3VzZTsKICAgIGV4cG9ydHMuV2FzaGluZ01hY2hpbmUgPSBXYXNoaW5nTWFjaGluZTsKICAgIGV4cG9ydHMuV2F0Y2ggPSBXYXRjaDsKICAgIGV4cG9ydHMuV2F2ZXMgPSBXYXZlczsKICAgIGV4cG9ydHMuV2F2ZXNBcnJvd0Rvd24gPSBXYXZlc0Fycm93RG93bjsKICAgIGV4cG9ydHMuV2F2ZXNBcnJvd1VwID0gV2F2ZXNBcnJvd1VwOwogICAgZXhwb3J0cy5XYXZlc0xhZGRlciA9IFdhdmVzTGFkZGVyOwogICAgZXhwb3J0cy5XYXlwb2ludHMgPSBXYXlwb2ludHM7CiAgICBleHBvcnRzLldlYmNhbSA9IFdlYmNhbTsKICAgIGV4cG9ydHMuV2ViaG9vayA9IFdlYmhvb2s7CiAgICBleHBvcnRzLldlYmhvb2tPZmYgPSBXZWJob29rT2ZmOwogICAgZXhwb3J0cy5XZWlnaHQgPSBXZWlnaHQ7CiAgICBleHBvcnRzLldlaWdodFRpbGRlID0gV2VpZ2h0VGlsZGU7CiAgICBleHBvcnRzLldoZWF0ID0gV2hlYXQ7CiAgICBleHBvcnRzLldoZWF0T2ZmID0gV2hlYXRPZmY7CiAgICBleHBvcnRzLldob2xlV29yZCA9IFdob2xlV29yZDsKICAgIGV4cG9ydHMuV2lmaSA9IFdpZmk7CiAgICBleHBvcnRzLldpZmlDb2cgPSBXaWZpQ29nOwogICAgZXhwb3J0cy5XaWZpSGlnaCA9IFdpZmlIaWdoOwogICAgZXhwb3J0cy5XaWZpTG93ID0gV2lmaUxvdzsKICAgIGV4cG9ydHMuV2lmaU9mZiA9IFdpZmlPZmY7CiAgICBleHBvcnRzLldpZmlQZW4gPSBXaWZpUGVuOwogICAgZXhwb3J0cy5XaWZpU3luYyA9IFdpZmlTeW5jOwogICAgZXhwb3J0cy5XaWZpWmVybyA9IFdpZmlaZXJvOwogICAgZXhwb3J0cy5XaW5kID0gV2luZDsKICAgIGV4cG9ydHMuV2luZEFycm93RG93biA9IFdpbmRBcnJvd0Rvd247CiAgICBleHBvcnRzLldpbmUgPSBXaW5lOwogICAgZXhwb3J0cy5XaW5lT2ZmID0gV2luZU9mZjsKICAgIGV4cG9ydHMuV29ya2Zsb3cgPSBXb3JrZmxvdzsKICAgIGV4cG9ydHMuV29ybSA9IFdvcm07CiAgICBleHBvcnRzLldyYXBUZXh0ID0gVGV4dFdyYXA7CiAgICBleHBvcnRzLldyZW5jaCA9IFdyZW5jaDsKICAgIGV4cG9ydHMuWCA9IFg7CiAgICBleHBvcnRzLlhDaXJjbGUgPSBDaXJjbGVYOwogICAgZXhwb3J0cy5YT2N0YWdvbiA9IE9jdGFnb25YOwogICAgZXhwb3J0cy5YU3F1YXJlID0gU3F1YXJlWDsKICAgIGV4cG9ydHMuWW91dHViZSA9IFlvdXR1YmU7CiAgICBleHBvcnRzLlphcCA9IFphcDsKICAgIGV4cG9ydHMuWmFwT2ZmID0gWmFwT2ZmOwogICAgZXhwb3J0cy5ab29tSW4gPSBab29tSW47CiAgICBleHBvcnRzLlpvb21PdXQgPSBab29tT3V0OwogICAgZXhwb3J0cy5jcmVhdGVFbGVtZW50ID0gY3JlYXRlRWxlbWVudDM7CiAgICBleHBvcnRzLmNyZWF0ZUljb25zID0gY3JlYXRlSWNvbnM7CiAgICBleHBvcnRzLmljb25zID0gaWNvbnNBbmRBbGlhc2VzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtdXRpbGl0eS9kZWVzLWljb24vZGVlcy1pY29uLmRlbW8uanMKdmFyIGx1Y2lkZUljb25zLCBkZW1vRnVuYzI7CnZhciBpbml0X2RlZXNfaWNvbl9kZW1vID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtdXRpbGl0eS9kZWVzLWljb24vZGVlcy1pY29uLmRlbW8uanMiKCkgewogICAgaW5pdF9kaXN0X3RzMjYoKTsKICAgIGluaXRfZGVlc19pY29uKCk7CiAgICBsdWNpZGVJY29ucyA9IF9fdG9FU00ocmVxdWlyZV9sdWNpZGUoKSwgMSk7CiAgICBkZW1vRnVuYzIgPSAoKSA9PiB7CiAgICAgIGNvbnN0IGZhSWNvbnMzID0gT2JqZWN0LmtleXMoaWNvbnM0LmZhKTsKICAgICAgY29uc29sZS5sb2coIkZpcnN0IGZldyBMdWNpZGUga2V5czoiLCBPYmplY3Qua2V5cyhsdWNpZGVJY29ucykuc2xpY2UoMCwgNSkpOwogICAgICBjb25zdCBsdWNpZGVJY29uc0xpc3QgPSBPYmplY3Qua2V5cyhsdWNpZGVJY29ucykuZmlsdGVyKChrZXkyKSA9PiB7CiAgICAgICAgY29uc3QgaXNVcHBlcmNhc2VGaXJzdCA9IGtleTJbMF0gPT09IGtleTJbMF0udG9VcHBlckNhc2UoKSAmJiBrZXkyWzBdICE9PSBrZXkyWzBdLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgY29uc3QgaXNGdW5jdGlvbjIgPSB0eXBlb2YgbHVjaWRlSWNvbnNba2V5Ml0gPT09ICJmdW5jdGlvbiI7CiAgICAgICAgY29uc3Qgbm90VXRpbGl0eSA9ICFbImNyZWF0ZUVsZW1lbnQiLCAiY3JlYXRlSWNvbnMiLCAiZGVmYXVsdCJdLmluY2x1ZGVzKGtleTIpOwogICAgICAgIHJldHVybiBpc0Z1bmN0aW9uMiAmJiBpc1VwcGVyY2FzZUZpcnN0ICYmIG5vdFV0aWxpdHk7CiAgICAgIH0pLm1hcCgocGFzY2FsTmFtZSkgPT4gewogICAgICAgIHJldHVybiBwYXNjYWxOYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgcGFzY2FsTmFtZS5zbGljZSgxKTsKICAgICAgfSk7CiAgICAgIGNvbnNvbGUubG9nKGBGb3VuZCAke2x1Y2lkZUljb25zTGlzdC5sZW5ndGh9IEx1Y2lkZSBpY29uc2ApOwogICAgICBpZiAobHVjaWRlSWNvbnNMaXN0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgIGNvbnNvbGUubG9nKCJUcnlpbmcgYWx0ZXJuYXRpdmUgYXBwcm9hY2ggdG8gZmluZCBMdWNpZGUgaWNvbnMiKTsKICAgICAgICBpZiAobHVjaWRlSWNvbnMuaWNvbnMpIHsKICAgICAgICAgIGNvbnN0IGljb25Tb3VyY2UgPSBsdWNpZGVJY29ucy5pY29ucyB8fCB7fTsKICAgICAgICAgIGx1Y2lkZUljb25zTGlzdC5wdXNoKC4uLk9iamVjdC5rZXlzKGljb25Tb3VyY2UpKTsKICAgICAgICAgIGNvbnNvbGUubG9nKGBGb3VuZCAke2x1Y2lkZUljb25zTGlzdC5sZW5ndGh9IGljb25zIHZpYSBhbHRlcm5hdGl2ZSBtZXRob2RgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgY29weUFsbEljb25OYW1lcyA9ICgpID0+IHsKICAgICAgICBjb25zdCBmYUljb25zTGlzdCA9IGZhSWNvbnMzLm1hcCgobmFtZSkgPT4gYGZhOiR7bmFtZX1gKTsKICAgICAgICBjb25zdCBsdWNpZGVJY29uc0xpc3RQcmVmaXhlZCA9IGx1Y2lkZUljb25zTGlzdC5tYXAoKG5hbWUpID0+IGBsdWNpZGU6JHtuYW1lfWApOwogICAgICAgIGNvbnN0IGFsbEljb25zID0gWy4uLmZhSWNvbnNMaXN0LCAuLi5sdWNpZGVJY29uc0xpc3RQcmVmaXhlZF07CiAgICAgICAgY29uc3QgdGV4dFRvQ29weSA9IGFsbEljb25zLmpvaW4oIlxuIik7CiAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dFRvQ29weSkudGhlbigoKSA9PiB7CiAgICAgICAgICBjb25zdCBjdXJyZW50RXZlbnQgPSB3aW5kb3cuZXZlbnQ7CiAgICAgICAgICBjb25zdCBidXR0b24gPSBjdXJyZW50RXZlbnQuY3VycmVudFRhcmdldDsKICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVGV4dCA9IGJ1dHRvbi50ZXh0Q29udGVudDsKICAgICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IGBcdTI3MTMgQ29waWVkICR7YWxsSWNvbnMubGVuZ3RofSBpY29uIG5hbWVzIWA7CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gb3JpZ2luYWxUZXh0OwogICAgICAgICAgfSwgMmUzKTsKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgY29uc3Qgc2VhcmNoSWNvbnMgPSAoZXZlbnQpID0+IHsKICAgICAgICBjb25zdCBzZWFyY2hUZXJtID0gZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpOwogICAgICAgIGNvbnN0IGRlbW9Db250YWluZXIgPSBldmVudC50YXJnZXQuY2xvc2VzdCgiLmRlbW9Db250YWluZXIiKTsKICAgICAgICBjb25zdCBjb250YWluZXJzID0gZGVtb0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCIuaWNvbkNvbnRhaW5lciIpOwogICAgICAgIGNvbnRhaW5lcnMuZm9yRWFjaCgoY29udGFpbmVyKSA9PiB7CiAgICAgICAgICBjb25zdCBpY29uTmFtZSA9IGNvbnRhaW5lci5nZXRBdHRyaWJ1dGUoImRhdGEtbmFtZSIpOwogICAgICAgICAgaWYgKHNlYXJjaFRlcm0gPT09ICIiKSB7CiAgICAgICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCJoaWRkZW4iKTsKICAgICAgICAgIH0gZWxzZSBpZiAoaWNvbk5hbWUgJiYgaWNvbk5hbWUuaW5jbHVkZXMoc2VhcmNoVGVybSkpIHsKICAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGRlbW9Db250YWluZXIucXVlcnlTZWxlY3RvckFsbCgiLnNlY3Rpb24tY29udGFpbmVyIikuZm9yRWFjaCgoc2VjdGlvbikgPT4gewogICAgICAgICAgY29uc3QgdmlzaWJsZUljb25zID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCIuaWNvbkNvbnRhaW5lcjpub3QoLmhpZGRlbikiKS5sZW5ndGg7CiAgICAgICAgICBjb25zdCBjb3VudEVsZW1lbnQgPSBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3IoIi5pY29uLWNvdW50Iik7CiAgICAgICAgICBpZiAoY291bnRFbGVtZW50KSB7CiAgICAgICAgICAgIGNvbnN0IHRvdGFsSWNvbnNDb3VudCA9IHNlY3Rpb24uY2xhc3NMaXN0LmNvbnRhaW5zKCJmYS1zZWN0aW9uIikgPyBmYUljb25zMy5sZW5ndGggOiBsdWNpZGVJY29uc0xpc3QubGVuZ3RoOwogICAgICAgICAgICBjb3VudEVsZW1lbnQudGV4dENvbnRlbnQgPSB2aXNpYmxlSWNvbnMgPT09IHRvdGFsSWNvbnNDb3VudCA/IGAke3RvdGFsSWNvbnNDb3VudH0gaWNvbnNgIDogYCR7dmlzaWJsZUljb25zfSBvZiAke3RvdGFsSWNvbnNDb3VudH0gaWNvbnNgOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9OwogICAgICBjb25zdCBjb3B5SWNvbk5hbWUgPSAoaWNvbk5hbWVUb0NvcHksIHR5cGU1KSA9PiB7CiAgICAgICAgY29uc3QgdGV4dFRvQ29weSA9IGAke3R5cGU1fToke2ljb25OYW1lVG9Db3B5fWA7CiAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dFRvQ29weSkudGhlbigoKSA9PiB7CiAgICAgICAgICBjb25zdCBjdXJyZW50RXZlbnQgPSB3aW5kb3cuZXZlbnQ7CiAgICAgICAgICBjb25zdCBjdXJyZW50VGFyZ2V0ID0gY3VycmVudEV2ZW50LmN1cnJlbnRUYXJnZXQ7CiAgICAgICAgICBjb25zdCB0b29sdGlwID0gY3VycmVudFRhcmdldC5xdWVyeVNlbGVjdG9yKCIuY29weS10b29sdGlwIik7CiAgICAgICAgICBpZiAodG9vbHRpcCkgewogICAgICAgICAgICB0b29sdGlwLnRleHRDb250ZW50ID0gIkNvcGllZCEiOwogICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICB0b29sdGlwLnRleHRDb250ZW50ID0gIkNsaWNrIHRvIGNvcHkiOwogICAgICAgICAgICB9LCAyZTMpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9OwogICAgICByZXR1cm4gYjJgCiAgPHN0eWxlPgogICAgLmRlbW9Db250YWluZXIgewogICAgICB3aWR0aDogMTAwJTsKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICBiYWNrZ3JvdW5kOiAjMTExMTExOwogICAgICBwYWRkaW5nOiAyMHB4OwogICAgICBmb250LXNpemU6IDMwcHg7CiAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICJTZWdvZSBVSSIsIFJvYm90bywgT3h5Z2VuLVNhbnMsIFVidW50dSwgQ2FudGFyZWxsLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwogICAgfQogICAgCiAgICAuc2VhcmNoLWNvbnRhaW5lciB7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBnYXA6IDEwcHg7CiAgICB9CiAgICAKICAgICNpY29uU2VhcmNoIHsKICAgICAgZmxleDogMTsKICAgICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICBiYWNrZ3JvdW5kOiAjMjIyOwogICAgICBjb2xvcjogI2ZmZjsKICAgICAgYm9yZGVyOiAxcHggc29saWQgIzMzMzsKICAgIH0KICAgIAogICAgI2ljb25TZWFyY2g6Zm9jdXMgewogICAgICBvdXRsaW5lOiBub25lOwogICAgICBib3JkZXItY29sb3I6ICNlNDAwMmI7CiAgICB9CiAgICAKICAgIC5jb3B5LWFsbC1idXR0b24gewogICAgICBwYWRkaW5nOiAxMnB4IDIwcHg7CiAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgYm9yZGVyOiBub25lOwogICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgIGJhY2tncm91bmQ6ICNlNDAwMmI7CiAgICAgIGNvbG9yOiAjZmZmOwogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzOwogICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgfQogICAgCiAgICAuY29weS1hbGwtYnV0dG9uOmhvdmVyIHsKICAgICAgYmFja2dyb3VuZDogI2M0MDAxYjsKICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwogICAgfQogICAgCiAgICAuY29weS1hbGwtYnV0dG9uOmFjdGl2ZSB7CiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgIH0KICAgIAogICAgZGVlcy1pY29uIHsKICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKICAgICAgY29sb3I6ICNmZmZmZmY7CiAgICB9CgogICAgLmljb25Db250YWluZXIgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBwYWRkaW5nOiAyMHB4IDE2cHggMHB4IDE2cHg7CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMzMzMzMzM7CiAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgfQogICAgCiAgICAuaWNvbkNvbnRhaW5lcjpob3ZlciB7CiAgICAgIGJhY2tncm91bmQtY29sb3I6ICMyMjI7CiAgICB9CgogICAgLmljb25OYW1lIHsKICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIGNvbG9yOiAjY2NjOwogICAgICBiYWNrZ3JvdW5kOiAjMzMzMzMzOwogICAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgICAgbWFyZ2luLWxlZnQ6IC0xNnB4OwogICAgICBtYXJnaW4tcmlnaHQ6IC0xNnB4OwogICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgbWF4LXdpZHRoOiAxMjBweDsKICAgICAgYm9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7CiAgICB9CgogICAgLnNlY3Rpb24tdGl0bGUgewogICAgICB3aWR0aDogMTAwJTsKICAgICAgY29sb3I6ICNmZmZmZmY7CiAgICAgIGZvbnQtc2l6ZTogMjRweDsKICAgICAgbWFyZ2luOiAyMHB4IDA7CiAgICAgIHBhZGRpbmctYm90dG9tOiAxMHB4OwogICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzMzMzMzMzsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgfQogICAgCiAgICAuYXBpLW5vdGUgewogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGNvbG9yOiAjZTQwMDJiOwogICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICBwYWRkaW5nOiAxMHB4OwogICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTQwMDJiOwogICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjI4LCAwLCA0MywgMC4xKTsKICAgIH0KICAgIAogICAgLmljb24tY291bnQgewogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGNvbG9yOiAjODg4OwogICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICBiYWNrZ3JvdW5kOiAjMjIyOwogICAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgICAgYm9yZGVyLXJhZGl1czogMjBweDsKICAgIH0KICAgIAogICAgLmljb25zLWdyaWQgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgfQogICAgCiAgICAuc2VjdGlvbi1jb250YWluZXIgewogICAgICB3aWR0aDogMTAwJTsKICAgICAgbWFyZ2luLWJvdHRvbTogMzBweDsKICAgIH0KICAgIAogICAgLmNvcHktdG9vbHRpcCB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgYmFja2dyb3VuZDogIzMzMzsKICAgICAgY29sb3I6IHdoaXRlOwogICAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICBmb250LXNpemU6IDEycHg7CiAgICAgIHRvcDogLTMwcHg7CiAgICAgIG9wYWNpdHk6IDA7CiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zczsKICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB9CiAgICAKICAgIC5pY29uQ29udGFpbmVyOmhvdmVyIC5jb3B5LXRvb2x0aXAgewogICAgICBvcGFjaXR5OiAxOwogICAgfQoKICAgIC5pY29uQ29udGFpbmVyOmhvdmVyIGRlZXMtaWNvbiB7CiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTsKICAgIH0KICAgIAogICAgLmhpZGRlbiB7CiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KICA8L3N0eWxlPgogIAogIDxkaXYgY2xhc3M9ImRlbW9Db250YWluZXIiPgogICAgPGRpdiBjbGFzcz0ic2VhcmNoLWNvbnRhaW5lciI+CiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaWNvblNlYXJjaCIgcGxhY2Vob2xkZXI9IlNlYXJjaCBpY29ucy4uLiIgQGlucHV0PSR7c2VhcmNoSWNvbnN9PgogICAgICA8YnV0dG9uIGNsYXNzPSJjb3B5LWFsbC1idXR0b24iIEBjbGljaz0ke2NvcHlBbGxJY29uTmFtZXN9PvCfk4sgQ29weSBBbGwgSWNvbiBOYW1lczwvYnV0dG9uPgogICAgPC9kaXY+CiAgICAKICAgIDxkaXYgY2xhc3M9ImFwaS1ub3RlIj4KICAgICAgTmV3IEFQSTogVXNlIDxjb2RlPmljb249ImZhOmljb25OYW1lIjwvY29kZT4gb3IgPGNvZGU+aWNvbj0ibHVjaWRlOmljb25OYW1lIjwvY29kZT4gaW5zdGVhZCBvZiA8Y29kZT5pY29uRkE8L2NvZGU+LiAKICAgICAgQ2xpY2sgYW55IGljb24gdG8gY29weSBpdHMgbmV3IGZvcm1hdCB0byBjbGlwYm9hcmQuCiAgICA8L2Rpdj4KICAgIAogICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1jb250YWluZXIgZmEtc2VjdGlvbiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPgogICAgICAgIEZvbnRBd2Vzb21lIEljb25zCiAgICAgICAgPHNwYW4gY2xhc3M9Imljb24tY291bnQiPiR7ZmFJY29uczMubGVuZ3RofSBpY29uczwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9Imljb25zLWdyaWQiPgogICAgICAgICR7ZmFJY29uczMubWFwKChpY29uTmFtZSkgPT4gewogICAgICAgIGNvbnN0IHByZWZpeGVkTmFtZSA9IGBmYToke2ljb25OYW1lfWA7CiAgICAgICAgcmV0dXJuIGIyYAogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imljb25Db250YWluZXIgZmEtaWNvbiIgZGF0YS1uYW1lPSR7aWNvbk5hbWUudG9Mb3dlckNhc2UoKX0gQGNsaWNrPSR7KCkgPT4gY29weUljb25OYW1lKGljb25OYW1lLCAiZmEiKX0+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7cHJlZml4ZWROYW1lfSBpY29uU2l6ZT0iMjQiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaWNvbk5hbWUiPmZhOiR7aWNvbk5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29weS10b29sdGlwIj5DbGljayB0byBjb3B5PC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgOwogICAgICB9KX0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWNvbnRhaW5lciBsdWNpZGUtc2VjdGlvbiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPgogICAgICAgIEx1Y2lkZSBJY29ucwogICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWNvdW50Ij4ke2x1Y2lkZUljb25zTGlzdC5sZW5ndGh9IGljb25zPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iaWNvbnMtZ3JpZCI+CiAgICAgICAgJHtsdWNpZGVJY29uc0xpc3QubWFwKChpY29uTmFtZSkgPT4gewogICAgICAgIGNvbnN0IHByZWZpeGVkTmFtZSA9IGBsdWNpZGU6JHtpY29uTmFtZX1gOwogICAgICAgIHJldHVybiBiMmAKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpY29uQ29udGFpbmVyIGx1Y2lkZS1pY29uIiBkYXRhLW5hbWU9JHtpY29uTmFtZS50b0xvd2VyQ2FzZSgpfSBAY2xpY2s9JHsoKSA9PiBjb3B5SWNvbk5hbWUoaWNvbk5hbWUsICJsdWNpZGUiKX0+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7cHJlZml4ZWROYW1lfSBpY29uU2l6ZT0iMjQiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaWNvbk5hbWUiPmx1Y2lkZToke2ljb25OYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvcHktdG9vbHRpcCI+Q2xpY2sgdG8gY29weTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYDsKICAgICAgfSl9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC9kaXY+CiAgYDsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC11dGlsaXR5L2RlZXMtaWNvbi9kZWVzLWljb24uanMKZnVuY3Rpb24gbGltaXRDYWNoZVNpemUoKSB7CiAgaWYgKGljb25DYWNoZS5zaXplID4gTUFYX0NBQ0hFX1NJWkUpIHsKICAgIGNvbnN0IGtleXNUb0RlbGV0ZSA9IEFycmF5LmZyb20oaWNvbkNhY2hlLmtleXMoKSkuc2xpY2UoMCwgTUFYX0NBQ0hFX1NJWkUgLyA1KTsKICAgIGtleXNUb0RlbGV0ZS5mb3JFYWNoKChrZXkyKSA9PiBpY29uQ2FjaGUuZGVsZXRlKGtleTIpKTsKICB9Cn0KdmFyIGx1Y2lkZUljb25zMiwgaW1wb3J0X2x1Y2lkZSwgX19lc0RlY29yYXRlNCwgX19ydW5Jbml0aWFsaXplcnM1LCBmYUljb25zMiwgaWNvbnM0LCBpY29uQ2FjaGUsIE1BWF9DQUNIRV9TSVpFLCBEZWVzSWNvbjsKdmFyIGluaXRfZGVlc19pY29uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtdXRpbGl0eS9kZWVzLWljb24vZGVlcy1pY29uLmpzIigpIHsKICAgIGluaXRfZGlzdF90czI2KCk7CiAgICBpbml0X2Rpc3RfdHMyNSgpOwogICAgaW5pdF90aGVtZSgpOwogICAgaW5pdF9mb250YXdlc29tZV9zdmdfY29yZSgpOwogICAgaW5pdF9mcmVlX2JyYW5kc19zdmdfaWNvbnMoKTsKICAgIGluaXRfZnJlZV9yZWd1bGFyX3N2Z19pY29ucygpOwogICAgaW5pdF9mcmVlX3NvbGlkX3N2Z19pY29ucygpOwogICAgaW5pdF9kZWVzX2ljb25fZGVtbygpOwogICAgbHVjaWRlSWNvbnMyID0gX190b0VTTShyZXF1aXJlX2x1Y2lkZSgpLCAxKTsKICAgIGltcG9ydF9sdWNpZGUgPSBfX3RvRVNNKHJlcXVpcmVfbHVjaWRlKCksIDEpOwogICAgX19lc0RlY29yYXRlNCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgICAgIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgICAgICByZXR1cm4gZjc7CiAgICAgIH0KICAgICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICAgICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogICAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICAgICAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgICAgIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICAgICAgdmFyIGNvbnRleHQyID0ge307CiAgICAgICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICAgICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICAgICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogICAgICBkb25lID0gdHJ1ZTsKICAgIH07CiAgICBfX3J1bkluaXRpYWxpemVyczUgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogICAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICAgICAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgICAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwogICAgfTsKICAgIGZhSWNvbnMyID0gewogICAgICAvLyBub3JtYWwKICAgICAgYXJyb3dSaWdodDogZmFBcnJvd1JpZ2h0LAogICAgICBhcnJvd1VwUmlnaHRGcm9tU3F1YXJlOiBmYUFycm93VXBSaWdodEZyb21TcXVhcmUsCiAgICAgIGJlbGw6IGZhQmVsbDIsCiAgICAgIGJ1ZzogZmFCdWcsCiAgICAgIGJ1aWxkaW5nOiBmYUJ1aWxkaW5nMiwKICAgICAgY2FyZXRMZWZ0OiBmYUNhcmV0TGVmdCwKICAgICAgY2FyZXRSaWdodDogZmFDYXJldFJpZ2h0LAogICAgICBjaGVjazogZmFDaGVjaywKICAgICAgY2lyY2xlSW5mbzogZmFDaXJjbGVJbmZvLAogICAgICBjaXJjbGVDaGVjazogZmFDaXJjbGVDaGVjaywKICAgICAgY2lyY2xlQ2hlY2tTb2xpZDogZmFDaXJjbGVDaGVjazIsCiAgICAgIGNpcmNsZVhtYXJrOiBmYUNpcmNsZVhtYXJrLAogICAgICBjaXJjbGVYbWFya1NvbGlkOiBmYUNpcmNsZVhtYXJrMiwKICAgICAgY2xvY2tSb3RhdGVMZWZ0OiBmYUNsb2NrUm90YXRlTGVmdCwKICAgICAgY29weTogZmFDb3B5LAogICAgICBjb3B5U29saWQ6IGZhQ29weTIsCiAgICAgIGRlc2t0b3A6IGZhRGVza3RvcCwKICAgICAgZXllOiBmYUV5ZTIsCiAgICAgIGV5ZVNsYXNoOiBmYUV5ZVNsYXNoMiwKICAgICAgZmlsZUludm9pY2U6IGZhRmlsZUludm9pY2UsCiAgICAgIGZpbGVJbnZvaWNlRG9sbGVyOiBmYUZpbGVJbnZvaWNlRG9sbGFyLAogICAgICBnZWFyOiBmYUdlYXIsCiAgICAgIGdyaXA6IGZhR3JpcCwKICAgICAgbWFnbmlmeWluZ0dsYXNzOiBmYU1hZ25pZnlpbmdHbGFzcywKICAgICAgbWVzc2FnZTogZmFNZXNzYWdlLAogICAgICBtZXNzYWdlU29saWQ6IGZhTWVzc2FnZTIsCiAgICAgIG1vbmV5Q2hlY2tEb2xsYXI6IGZhTW9uZXlDaGVja0RvbGxhciwKICAgICAgbXVnSG90OiBmYU11Z0hvdCwKICAgICAgbWludXM6IGZhTWludXMsCiAgICAgIG5ldHdvcmtXaXJlZDogZmFOZXR3b3JrV2lyZWQsCiAgICAgIHBhcGVyY2xpcDogZmFQYXBlcmNsaXAsCiAgICAgIHBhc3RlOiBmYVBhc3RlLAogICAgICBwYXN0ZVNvbGlkOiBmYVBhc3RlMiwKICAgICAgcGVuVG9TcXVhcmU6IGZhUGVuVG9TcXVhcmUyLAogICAgICBwbHVzOiBmYVBsdXMsCiAgICAgIHJlY2VpcHQ6IGZhUmVjZWlwdCwKICAgICAgcnNzOiBmYVJzcywKICAgICAgc2hhcmU6IGZhU2hhcmUsCiAgICAgIHN1bjogZmFTdW4sCiAgICAgIHN1blNvbGlkOiBmYVN1bjIsCiAgICAgIHRlcm1pbmFsOiBmYVRlcm1pbmFsLAogICAgICB0cmFzaDogZmFUcmFzaCwKICAgICAgdHJhc2hTb2xpZDogZmFUcmFzaCwKICAgICAgdHJhc2hDYW46IGZhVHJhc2hDYW4sCiAgICAgIHRyYXNoQ2FuU29saWQ6IGZhVHJhc2hDYW4yLAogICAgICB1c2VyczogZmFVc2VycywKICAgICAgd2FsbGV0OiBmYVdhbGxldCwKICAgICAgeG1hcms6IGZhWG1hcmssCiAgICAgIC8vIGJyYW5kcwogICAgICBmYWNlYm9vazogZmFGYWNlYm9vaywKICAgICAgZ29vZ2xlOiBmYUdvb2dsZSwKICAgICAgaW5zdGFncmFtOiBmYUluc3RhZ3JhbSwKICAgICAgbGlua2VkaW46IGZhTGlua2VkaW4sCiAgICAgIG1lZGl1bTogZmFNZWRpdW0sCiAgICAgIHNsYWNrOiBmYVNsYWNrSGFzaCwKICAgICAgdGlrdG9rOiBmYVRpa3RvaywKICAgICAgdHdpdHRlcjogZmFUd2l0dGVyCiAgICB9OwogICAgaWNvbnM0ID0gewogICAgICBmYTogZmFJY29uczIKICAgIH07CiAgICBpY29uQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgTUFYX0NBQ0hFX1NJWkUgPSA1MDA7CiAgICBEZWVzSWNvbiA9ICgoKSA9PiB7CiAgICAgIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLWljb24iKV07CiAgICAgIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogICAgICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9jbGFzc1RoaXM7CiAgICAgIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogICAgICBsZXQgX2ljb25GQV9kZWNvcmF0b3JzOwogICAgICBsZXQgX2ljb25GQV9pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9pY29uRkFfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9pY29uX2RlY29yYXRvcnM7CiAgICAgIGxldCBfaWNvbl9pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9pY29uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgICAgIGxldCBfaWNvblNpemVfZGVjb3JhdG9yczsKICAgICAgbGV0IF9pY29uU2l6ZV9pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9pY29uU2l6ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX2NvbG9yX2RlY29yYXRvcnM7CiAgICAgIGxldCBfY29sb3JfaW5pdGlhbGl6ZXJzID0gW107CiAgICAgIGxldCBfY29sb3JfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9zdHJva2VXaWR0aF9kZWNvcmF0b3JzOwogICAgICBsZXQgX3N0cm9rZVdpZHRoX2luaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX3N0cm9rZVdpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgICAgIHZhciBEZWVzSWNvbjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgICAgICBzdGF0aWMgewogICAgICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyB7CiAgICAgICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgICAgIF9pY29uRkFfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgICAgY29udmVydGVyOiB7CiAgICAgICAgICAgICAgLy8gQ29udmVydCBhdHRyaWJ1dGUgc3RyaW5nIHRvIHByb3BlcnR5IChmb3IgcmVmbGVjdGVkIGF0dHJpYnV0ZXMpCiAgICAgICAgICAgICAgZnJvbUF0dHJpYnV0ZTogKHZhbHVlMikgPT4gdmFsdWUyLAogICAgICAgICAgICAgIC8vIENvbnZlcnQgcHJvcGVydHkgdG8gYXR0cmlidXRlIChmb3IgcmVmbGVjdGlvbikKICAgICAgICAgICAgICB0b0F0dHJpYnV0ZTogKHZhbHVlMikgPT4gdmFsdWUyCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pXTsKICAgICAgICAgIF9pY29uX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICAgIGNvbnZlcnRlcjogewogICAgICAgICAgICAgIGZyb21BdHRyaWJ1dGU6ICh2YWx1ZTIpID0+IHZhbHVlMiwKICAgICAgICAgICAgICB0b0F0dHJpYnV0ZTogKHZhbHVlMikgPT4gdmFsdWUyCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pXTsKICAgICAgICAgIF9pY29uU2l6ZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgICAgIF9jb2xvcl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgICAgIF9zdHJva2VXaWR0aF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgICAgIF9fZXNEZWNvcmF0ZTQodGhpcywgbnVsbCwgX2ljb25GQV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpY29uRkEiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImljb25GQSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pY29uRkEsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgICAgIG9iai5pY29uRkEgPSB2YWx1ZTI7CiAgICAgICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2ljb25GQV9pbml0aWFsaXplcnMsIF9pY29uRkFfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgX19lc0RlY29yYXRlNCh0aGlzLCBudWxsLCBfaWNvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpY29uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpY29uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmljb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgICAgIG9iai5pY29uID0gdmFsdWUyOwogICAgICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pY29uX2luaXRpYWxpemVycywgX2ljb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgX19lc0RlY29yYXRlNCh0aGlzLCBudWxsLCBfaWNvblNpemVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaWNvblNpemUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImljb25TaXplIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmljb25TaXplLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgICAgICBvYmouaWNvblNpemUgPSB2YWx1ZTI7CiAgICAgICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2ljb25TaXplX2luaXRpYWxpemVycywgX2ljb25TaXplX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgICAgIF9fZXNEZWNvcmF0ZTQodGhpcywgbnVsbCwgX2NvbG9yX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNvbG9yIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb2xvciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jb2xvciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICAgICAgb2JqLmNvbG9yID0gdmFsdWUyOwogICAgICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jb2xvcl9pbml0aWFsaXplcnMsIF9jb2xvcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgICAgICBfX2VzRGVjb3JhdGU0KHRoaXMsIG51bGwsIF9zdHJva2VXaWR0aF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzdHJva2VXaWR0aCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic3Ryb2tlV2lkdGgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc3Ryb2tlV2lkdGgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgICAgIG9iai5zdHJva2VXaWR0aCA9IHZhbHVlMjsKICAgICAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc3Ryb2tlV2lkdGhfaW5pdGlhbGl6ZXJzLCBfc3Ryb2tlV2lkdGhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgX19lc0RlY29yYXRlNChudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgICAgICBEZWVzSWNvbjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzI7CiAgICAgICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIlV0aWxpdHkiXTsKICAgICAgICAjaWNvbkZBX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczUodGhpcywgX2ljb25GQV9pbml0aWFsaXplcnMsIHZvaWQgMCk7CiAgICAgICAgLyoqCiAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBgaWNvbmAgcHJvcGVydHkgaW5zdGVhZCB3aXRoIGZvcm1hdCAiZmE6aWNvbk5hbWUiIG9yICJsdWNpZGU6aWNvbk5hbWUiCiAgICAgICAgICovCiAgICAgICAgZ2V0IGljb25GQSgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiNpY29uRkFfYWNjZXNzb3Jfc3RvcmFnZTsKICAgICAgICB9CiAgICAgICAgc2V0IGljb25GQSh2YWx1ZTIpIHsKICAgICAgICAgIHRoaXMuI2ljb25GQV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgICAjaWNvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNSh0aGlzLCBfaWNvbkZBX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1KHRoaXMsIF9pY29uX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHByZWZlcnJlZCBpY29uIHByb3BlcnR5LiBVc2UgZm9ybWF0ICJmYTppY29uTmFtZSIgb3IgImx1Y2lkZTppY29uTmFtZSIKICAgICAgICAgKiBFeGFtcGxlczogImZhOmNoZWNrIiwgImx1Y2lkZTptZW51IgogICAgICAgICAqLwogICAgICAgIGdldCBpY29uKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuI2ljb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgICAgICB9CiAgICAgICAgc2V0IGljb24odmFsdWUyKSB7CiAgICAgICAgICB0aGlzLiNpY29uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgICNpY29uU2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNSh0aGlzLCBfaWNvbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNSh0aGlzLCBfaWNvblNpemVfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgICAgICBnZXQgaWNvblNpemUoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4jaWNvblNpemVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgICAgICB9CiAgICAgICAgc2V0IGljb25TaXplKHZhbHVlMikgewogICAgICAgICAgdGhpcy4jaWNvblNpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgICAgICB9CiAgICAgICAgI2NvbG9yX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1KHRoaXMsIF9pY29uU2l6ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNSh0aGlzLCBfY29sb3JfaW5pdGlhbGl6ZXJzLCAiY3VycmVudENvbG9yIikpOwogICAgICAgIGdldCBjb2xvcigpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiNjb2xvcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgICAgIH0KICAgICAgICBzZXQgY29sb3IodmFsdWUyKSB7CiAgICAgICAgICB0aGlzLiNjb2xvcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgICAjc3Ryb2tlV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczUodGhpcywgX2NvbG9yX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1KHRoaXMsIF9zdHJva2VXaWR0aF9pbml0aWFsaXplcnMsIDIpKTsKICAgICAgICBnZXQgc3Ryb2tlV2lkdGgoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4jc3Ryb2tlV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgICAgICB9CiAgICAgICAgc2V0IHN0cm9rZVdpZHRoKHZhbHVlMikgewogICAgICAgICAgdGhpcy4jc3Ryb2tlV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgICAgICB9CiAgICAgICAgLy8gRm9yIHRyYWNraW5nIHdoZW4gd2UgbmVlZCB0byByZS1yZW5kZXIKICAgICAgICBsYXN0SWNvbiA9IChfX3J1bkluaXRpYWxpemVyczUodGhpcywgX3N0cm9rZVdpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKSwgbnVsbCk7CiAgICAgICAgbGFzdEljb25TaXplID0gbnVsbDsKICAgICAgICBsYXN0Q29sb3IgPSBudWxsOwogICAgICAgIGxhc3RTdHJva2VXaWR0aCA9IG51bGw7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgZG9tdG9vbHNfZWxlbWVudGJhc2ljX2V4cG9ydHMuc2V0dXAoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZWZmZWN0aXZlIGljb24gdmFsdWUsIHN1cHBvcnRpbmcgYm90aCB0aGUgbmV3IGBpY29uYCBwcm9wZXJ0eQogICAgICAgICAqIGFuZCB0aGUgbGVnYWN5IGBpY29uRkFgIHByb3BlcnR5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogICAgICAgICAqIFByZWZlcnMgYGljb25gIGlmIGJvdGggYXJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBnZXRFZmZlY3RpdmVJY29uKCkgewogICAgICAgICAgaWYgKHRoaXMuaWNvbikgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pY29uOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuaWNvbkZBKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmljb25GQS5zdGFydHNXaXRoKCJsdWNpZGU6IikpIHsKICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pY29uRkE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGBmYToke3RoaXMuaWNvbkZBfWA7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUGFyc2VzIGFuIGljb24gc3RyaW5nIGludG8gaXRzIHR5cGUgYW5kIG5hbWUgcGFydHMKICAgICAgICAgKiBAcGFyYW0gaWNvblN0ciBUaGUgaWNvbiBzdHJpbmcgaW4gZm9ybWF0ICJ0eXBlOm5hbWUiCiAgICAgICAgICogQHJldHVybnMgT2JqZWN0IHdpdGggdHlwZSBhbmQgbmFtZSBwcm9wZXJ0aWVzCiAgICAgICAgICovCiAgICAgICAgcGFyc2VJY29uU3RyaW5nKGljb25TdHIpIHsKICAgICAgICAgIGNvbnN0IGxvd2VyU3RyID0gaWNvblN0ci50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgaWYgKGxvd2VyU3RyLnN0YXJ0c1dpdGgoImZhOiIpKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHlwZTogImZhIiwKICAgICAgICAgICAgICBuYW1lOiBpY29uU3RyLnN1YnN0cmluZygzKQogICAgICAgICAgICAgIC8vIFJlbW92ZSAnZmE6JyBwcmVmaXgKICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSBpZiAobG93ZXJTdHIuc3RhcnRzV2l0aCgibHVjaWRlOiIpKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHlwZTogImx1Y2lkZSIsCiAgICAgICAgICAgICAgbmFtZTogaWNvblN0ci5zdWJzdHJpbmcoNykKICAgICAgICAgICAgICAvLyBSZW1vdmUgJ2x1Y2lkZTonIHByZWZpeAogICAgICAgICAgICB9OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0eXBlOiAibHVjaWRlIiwKICAgICAgICAgICAgICBuYW1lOiBpY29uU3RyCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJlbmRlckx1Y2lkZUljb24oaWNvbk5hbWUpIHsKICAgICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYGx1Y2lkZToke2ljb25OYW1lfToke3RoaXMuaWNvblNpemV9OiR7dGhpcy5jb2xvcn06JHt0aGlzLnN0cm9rZVdpZHRofWA7CiAgICAgICAgICBpZiAoaWNvbkNhY2hlLmhhcyhjYWNoZUtleSkpIHsKICAgICAgICAgICAgcmV0dXJuIGljb25DYWNoZS5nZXQoY2FjaGVLZXkpIHx8ICIiOwogICAgICAgICAgfQogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcGFzY2FsQ2FzZU5hbWUgPSBpY29uTmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGljb25OYW1lLnNsaWNlKDEpOwogICAgICAgICAgICBpZiAoIWx1Y2lkZUljb25zMltwYXNjYWxDYXNlTmFtZV0pIHsKICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEx1Y2lkZSBpY29uICcke3Bhc2NhbENhc2VOYW1lfScgbm90IGZvdW5kIGluIGx1Y2lkZUljb25zIG9iamVjdGApOwogICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBzdmdFbGVtZW50ID0gKDAsIGltcG9ydF9sdWNpZGUuY3JlYXRlRWxlbWVudCkobHVjaWRlSWNvbnMyW3Bhc2NhbENhc2VOYW1lXSwgewogICAgICAgICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLAogICAgICAgICAgICAgIHNpemU6IHRoaXMuaWNvblNpemUsCiAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3Ryb2tlV2lkdGgKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmICghc3ZnRWxlbWVudCkgewogICAgICAgICAgICAgIGNvbnNvbGUud2FybihgY3JlYXRlRWxlbWVudCByZXR1cm5lZCBlbXB0eSByZXN1bHQgZm9yICR7cGFzY2FsQ2FzZU5hbWV9YCk7CiAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHN2Z0VsZW1lbnQub3V0ZXJIVE1MOwogICAgICAgICAgICBpY29uQ2FjaGUuc2V0KGNhY2hlS2V5LCByZXN1bHQpOwogICAgICAgICAgICBsaW1pdENhY2hlU2l6ZSgpOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgcmVuZGVyaW5nIEx1Y2lkZSBpY29uICR7aWNvbk5hbWV9OmAsIGVycm9yKTsKICAgICAgICAgICAgcmV0dXJuIGA8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IiR7dGhpcy5pY29uU2l6ZX0iIGhlaWdodD0iJHt0aGlzLmljb25TaXplfSIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiR7dGhpcy5jb2xvcn0iIHN0cm9rZS13aWR0aD0iJHt0aGlzLnN0cm9rZVdpZHRofSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4KICAgICAgICA8dGV4dCB4PSI1MCUiIHk9IjUwJSIgZm9udC1zaXplPSI2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBkb21pbmFudC1iYXNlbGluZT0ibWlkZGxlIiBmaWxsPSIke3RoaXMuY29sb3J9Ij4ke2ljb25OYW1lfTwvdGV4dD4KICAgICAgPC9zdmc+YDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIC8qIEltcHJvdmUgcmVuZGVyaW5nIHBlcmZvcm1hbmNlICovCiAgICAgICNpY29uQ29udGFpbmVyIHN2ZyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07IC8qIEhlbHBzIHdpdGggYW5pbWF0aW9ucyAqLwogICAgICAgIGNvbnRhaW46IHN0cmljdDsgLyogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uICovCiAgICAgIH0KICAgIGAKICAgICAgICBdOwogICAgICAgIHJlbmRlcigpIHsKICAgICAgICAgIHJldHVybiBiMmAKICAgICAgJHtkb210b29sc19lbGVtZW50YmFzaWNfZXhwb3J0cy5zdHlsZXN9CiAgICAgIDxzdHlsZT4KICAgICAgICAjaWNvbkNvbnRhaW5lciB7CiAgICAgICAgICB3aWR0aDogJHt0aGlzLmljb25TaXplfXB4OwogICAgICAgICAgaGVpZ2h0OiAke3RoaXMuaWNvblNpemV9cHg7CiAgICAgICAgfQogICAgICA8L3N0eWxlPgogICAgICA8ZGl2IGlkPSJpY29uQ29udGFpbmVyIj48L2Rpdj4KICAgIGA7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZWQoKSB7CiAgICAgICAgICBpZiAoIXRoaXMuaWNvblNpemUpIHsKICAgICAgICAgICAgdGhpcy5pY29uU2l6ZSA9IHBhcnNlSW50KGdsb2JhbFRoaXMuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5mb250U2l6ZS5yZXBsYWNlKC9cRC9nLCAiIikpOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgZWZmZWN0aXZlSWNvbiA9IHRoaXMuZ2V0RWZmZWN0aXZlSWNvbigpOwogICAgICAgICAgaWYgKHRoaXMubGFzdEljb24gPT09IGVmZmVjdGl2ZUljb24gJiYgdGhpcy5sYXN0SWNvblNpemUgPT09IHRoaXMuaWNvblNpemUgJiYgdGhpcy5sYXN0Q29sb3IgPT09IHRoaXMuY29sb3IgJiYgdGhpcy5sYXN0U3Ryb2tlV2lkdGggPT09IHRoaXMuc3Ryb2tlV2lkdGgpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5sYXN0SWNvbiA9IGVmZmVjdGl2ZUljb247CiAgICAgICAgICB0aGlzLmxhc3RJY29uU2l6ZSA9IHRoaXMuaWNvblNpemU7CiAgICAgICAgICB0aGlzLmxhc3RDb2xvciA9IHRoaXMuY29sb3I7CiAgICAgICAgICB0aGlzLmxhc3RTdHJva2VXaWR0aCA9IHRoaXMuc3Ryb2tlV2lkdGg7CiAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIiNpY29uQ29udGFpbmVyIik7CiAgICAgICAgICBpZiAoIWNvbnRhaW5lciB8fCAhZWZmZWN0aXZlSWNvbikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgeyB0eXBlOiB0eXBlNSwgbmFtZSB9ID0gdGhpcy5wYXJzZUljb25TdHJpbmcoZWZmZWN0aXZlSWNvbik7CiAgICAgICAgICAgIGlmICh0eXBlNSA9PT0gImx1Y2lkZSIpIHsKICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gIiI7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHBhc2NhbENhc2VOYW1lID0gbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7CiAgICAgICAgICAgICAgICBpZiAobHVjaWRlSWNvbnMyW3Bhc2NhbENhc2VOYW1lXSkgewogICAgICAgICAgICAgICAgICBjb25zdCBzdmdFbGVtZW50ID0gKDAsIGltcG9ydF9sdWNpZGUuY3JlYXRlRWxlbWVudCkobHVjaWRlSWNvbnMyW3Bhc2NhbENhc2VOYW1lXSwgewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLAogICAgICAgICAgICAgICAgICAgIHNpemU6IHRoaXMuaWNvblNpemUsCiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3Ryb2tlV2lkdGgKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIGlmIChzdmdFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHN2Z0VsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgY3JlYXRlIGVsZW1lbnQgZm9yICR7cGFzY2FsQ2FzZU5hbWV9YCk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHJlbmRlcmluZyBMdWNpZGUgaWNvbjpgLCBlcnJvcik7CiAgICAgICAgICAgICAgICBjb25zdCBpY29uSHRtbCA9IHRoaXMucmVuZGVyTHVjaWRlSWNvbihuYW1lKTsKICAgICAgICAgICAgICAgIGlmIChpY29uSHRtbCkgewogICAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaWNvbkh0bWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGNvbnN0IGZhSWNvbiA9IGljb25zNC5mYVtuYW1lXTsKICAgICAgICAgICAgICBpZiAoZmFJY29uKSB7CiAgICAgICAgICAgICAgICBjb25zdCBpY29uSHRtbCA9IGljb24yKGZhSWNvbikuaHRtbFswXTsKICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBpY29uSHRtbDsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBGb250QXdlc29tZSBpY29uIG5vdCBmb3VuZDogJHtuYW1lfWApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgdXBkYXRpbmcgaWNvbiAke2VmZmVjdGl2ZUljb259OmAsIGVycm9yKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gQ2xlYW4gdXAgcmVzb3VyY2VzIHdoZW4gZWxlbWVudCBpcyByZW1vdmVkCiAgICAgICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgdGhpcy5sYXN0SWNvbiA9IG51bGw7CiAgICAgICAgICB0aGlzLmxhc3RJY29uU2l6ZSA9IG51bGw7CiAgICAgICAgICB0aGlzLmxhc3RDb2xvciA9IG51bGw7CiAgICAgICAgICB0aGlzLmxhc3RTdHJva2VXaWR0aCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyB7CiAgICAgICAgICBfX3J1bkluaXRpYWxpemVyczUoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIERlZXNJY29uMiA9IF9jbGFzc1RoaXM7CiAgICB9KSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL3NlcnZpY2VzL3ZlcnNpb25zLmpzCnZhciBDRE5fVkVSU0lPTlMsIENETl9CQVNFOwp2YXIgaW5pdF92ZXJzaW9ucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9zZXJ2aWNlcy92ZXJzaW9ucy5qcyIoKSB7CiAgICBDRE5fVkVSU0lPTlMgPSB7CiAgICAgIHh0ZXJtOiAiNS4zLjAiLAogICAgICB4dGVybUFkZG9uRml0OiAiMC44LjAiLAogICAgICB4dGVybUFkZG9uU2VhcmNoOiAiMC4xMy4wIiwKICAgICAgaGlnaGxpZ2h0SnM6ICIxMS4xMS4xIiwKICAgICAgYXBleGNoYXJ0czogIjUuMy42IiwKICAgICAgdGlwdGFwOiAiMi4yMy4wIiwKICAgICAgZm9udGF3ZXNvbWU6ICI3LjEuMCIKICAgIH07CiAgICBDRE5fQkFTRSA9ICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtIjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9zZXJ2aWNlcy9EZWVzU2VydmljZUxpYkxvYWRlci5qcwp2YXIgRGVlc1NlcnZpY2VMaWJMb2FkZXI7CnZhciBpbml0X0RlZXNTZXJ2aWNlTGliTG9hZGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL3NlcnZpY2VzL0RlZXNTZXJ2aWNlTGliTG9hZGVyLmpzIigpIHsKICAgIGluaXRfdmVyc2lvbnMoKTsKICAgIERlZXNTZXJ2aWNlTGliTG9hZGVyID0gY2xhc3MgX0RlZXNTZXJ2aWNlTGliTG9hZGVyIHsKICAgICAgc3RhdGljIGluc3RhbmNlOwogICAgICAvLyBDYWNoZWQgbGlicmFyeSByZWZlcmVuY2VzCiAgICAgIHh0ZXJtTGliID0gbnVsbDsKICAgICAgeHRlcm1GaXRBZGRvbkxpYiA9IG51bGw7CiAgICAgIHh0ZXJtU2VhcmNoQWRkb25MaWIgPSBudWxsOwogICAgICBoaWdobGlnaHRKc0xpYiA9IG51bGw7CiAgICAgIGFwZXhDaGFydHNMaWIgPSBudWxsOwogICAgICB0aXB0YXBMaWIgPSBudWxsOwogICAgICAvLyBMb2FkaW5nIHByb21pc2VzIHRvIHByZXZlbnQgZHVwbGljYXRlIGNvbmN1cnJlbnQgbG9hZHMKICAgICAgeHRlcm1Mb2FkaW5nUHJvbWlzZSA9IG51bGw7CiAgICAgIHh0ZXJtRml0QWRkb25Mb2FkaW5nUHJvbWlzZSA9IG51bGw7CiAgICAgIHh0ZXJtU2VhcmNoQWRkb25Mb2FkaW5nUHJvbWlzZSA9IG51bGw7CiAgICAgIGhpZ2hsaWdodEpzTG9hZGluZ1Byb21pc2UgPSBudWxsOwogICAgICBhcGV4Q2hhcnRzTG9hZGluZ1Byb21pc2UgPSBudWxsOwogICAgICB0aXB0YXBMb2FkaW5nUHJvbWlzZSA9IG51bGw7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBEZWVzU2VydmljZUxpYkxvYWRlcgogICAgICAgKi8KICAgICAgc3RhdGljIGdldEluc3RhbmNlKCkgewogICAgICAgIGlmICghX0RlZXNTZXJ2aWNlTGliTG9hZGVyLmluc3RhbmNlKSB7CiAgICAgICAgICBfRGVlc1NlcnZpY2VMaWJMb2FkZXIuaW5zdGFuY2UgPSBuZXcgX0RlZXNTZXJ2aWNlTGliTG9hZGVyKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfRGVlc1NlcnZpY2VMaWJMb2FkZXIuaW5zdGFuY2U7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIExvYWQgeHRlcm0gdGVybWluYWwgZW11bGF0b3IgZnJvbSBDRE4KICAgICAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8geHRlcm0gbW9kdWxlIHdpdGggVGVybWluYWwgY2xhc3MKICAgICAgICovCiAgICAgIGFzeW5jIGxvYWRYdGVybSgpIHsKICAgICAgICBpZiAodGhpcy54dGVybUxpYikgewogICAgICAgICAgcmV0dXJuIHRoaXMueHRlcm1MaWI7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnh0ZXJtTG9hZGluZ1Byb21pc2UpIHsKICAgICAgICAgIHJldHVybiB0aGlzLnh0ZXJtTG9hZGluZ1Byb21pc2U7CiAgICAgICAgfQogICAgICAgIHRoaXMueHRlcm1Mb2FkaW5nUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7CiAgICAgICAgICBjb25zdCB1cmwgPSBgJHtDRE5fQkFTRX0veHRlcm1AJHtDRE5fVkVSU0lPTlMueHRlcm19Lytlc21gOwogICAgICAgICAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KAogICAgICAgICAgICAvKiBAdml0ZS1pZ25vcmUgKi8KICAgICAgICAgICAgdXJsCiAgICAgICAgICApOwogICAgICAgICAgYXdhaXQgdGhpcy5pbmplY3RYdGVybVN0eWxlcygpOwogICAgICAgICAgdGhpcy54dGVybUxpYiA9IHsKICAgICAgICAgICAgVGVybWluYWw6IG1vZHVsZS5UZXJtaW5hbAogICAgICAgICAgfTsKICAgICAgICAgIHJldHVybiB0aGlzLnh0ZXJtTGliOwogICAgICAgIH0pKCk7CiAgICAgICAgcmV0dXJuIHRoaXMueHRlcm1Mb2FkaW5nUHJvbWlzZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogTG9hZCB4dGVybS1hZGRvbi1maXQgZnJvbSBDRE4KICAgICAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gRml0QWRkb24gY2xhc3MKICAgICAgICovCiAgICAgIGFzeW5jIGxvYWRYdGVybUZpdEFkZG9uKCkgewogICAgICAgIGlmICh0aGlzLnh0ZXJtRml0QWRkb25MaWIpIHsKICAgICAgICAgIHJldHVybiB0aGlzLnh0ZXJtRml0QWRkb25MaWI7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnh0ZXJtRml0QWRkb25Mb2FkaW5nUHJvbWlzZSkgewogICAgICAgICAgcmV0dXJuIHRoaXMueHRlcm1GaXRBZGRvbkxvYWRpbmdQcm9taXNlOwogICAgICAgIH0KICAgICAgICB0aGlzLnh0ZXJtRml0QWRkb25Mb2FkaW5nUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7CiAgICAgICAgICBjb25zdCB1cmwgPSBgJHtDRE5fQkFTRX0veHRlcm0tYWRkb24tZml0QCR7Q0ROX1ZFUlNJT05TLnh0ZXJtQWRkb25GaXR9Lytlc21gOwogICAgICAgICAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KAogICAgICAgICAgICAvKiBAdml0ZS1pZ25vcmUgKi8KICAgICAgICAgICAgdXJsCiAgICAgICAgICApOwogICAgICAgICAgdGhpcy54dGVybUZpdEFkZG9uTGliID0gewogICAgICAgICAgICBGaXRBZGRvbjogbW9kdWxlLkZpdEFkZG9uCiAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIHRoaXMueHRlcm1GaXRBZGRvbkxpYjsKICAgICAgICB9KSgpOwogICAgICAgIHJldHVybiB0aGlzLnh0ZXJtRml0QWRkb25Mb2FkaW5nUHJvbWlzZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogTG9hZCB4dGVybS1hZGRvbi1zZWFyY2ggZnJvbSBDRE4KICAgICAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gU2VhcmNoQWRkb24gY2xhc3MKICAgICAgICovCiAgICAgIGFzeW5jIGxvYWRYdGVybVNlYXJjaEFkZG9uKCkgewogICAgICAgIGlmICh0aGlzLnh0ZXJtU2VhcmNoQWRkb25MaWIpIHsKICAgICAgICAgIHJldHVybiB0aGlzLnh0ZXJtU2VhcmNoQWRkb25MaWI7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnh0ZXJtU2VhcmNoQWRkb25Mb2FkaW5nUHJvbWlzZSkgewogICAgICAgICAgcmV0dXJuIHRoaXMueHRlcm1TZWFyY2hBZGRvbkxvYWRpbmdQcm9taXNlOwogICAgICAgIH0KICAgICAgICB0aGlzLnh0ZXJtU2VhcmNoQWRkb25Mb2FkaW5nUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7CiAgICAgICAgICBjb25zdCB1cmwgPSBgJHtDRE5fQkFTRX0veHRlcm0tYWRkb24tc2VhcmNoQCR7Q0ROX1ZFUlNJT05TLnh0ZXJtQWRkb25TZWFyY2h9Lytlc21gOwogICAgICAgICAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KAogICAgICAgICAgICAvKiBAdml0ZS1pZ25vcmUgKi8KICAgICAgICAgICAgdXJsCiAgICAgICAgICApOwogICAgICAgICAgdGhpcy54dGVybVNlYXJjaEFkZG9uTGliID0gewogICAgICAgICAgICBTZWFyY2hBZGRvbjogbW9kdWxlLlNlYXJjaEFkZG9uCiAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIHRoaXMueHRlcm1TZWFyY2hBZGRvbkxpYjsKICAgICAgICB9KSgpOwogICAgICAgIHJldHVybiB0aGlzLnh0ZXJtU2VhcmNoQWRkb25Mb2FkaW5nUHJvbWlzZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogSW5qZWN0IHh0ZXJtIENTUyBzdHlsZXMgaW50byB0aGUgZG9jdW1lbnQgaGVhZAogICAgICAgKi8KICAgICAgYXN5bmMgaW5qZWN0WHRlcm1TdHlsZXMoKSB7CiAgICAgICAgY29uc3Qgc3R5bGVJZCA9ICJ4dGVybS1jZG4tc3R5bGVzIjsKICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgY3NzVXJsID0gYCR7Q0ROX0JBU0V9L3h0ZXJtQCR7Q0ROX1ZFUlNJT05TLnh0ZXJtfS9jc3MveHRlcm0uY3NzYDsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGNzc1VybCk7CiAgICAgICAgY29uc3QgY3NzVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTsKICAgICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgICAgc3R5bGUuaWQgPSBzdHlsZUlkOwogICAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gY3NzVGV4dDsKICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogTG9hZCBoaWdobGlnaHQuanMgc3ludGF4IGhpZ2hsaWdodGVyIGZyb20gQ0ROCiAgICAgICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGhpZ2hsaWdodC5qcyBBUEkKICAgICAgICovCiAgICAgIGFzeW5jIGxvYWRIaWdobGlnaHRKcygpIHsKICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRKc0xpYikgewogICAgICAgICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0SnNMaWI7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodEpzTG9hZGluZ1Byb21pc2UpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodEpzTG9hZGluZ1Byb21pc2U7CiAgICAgICAgfQogICAgICAgIHRoaXMuaGlnaGxpZ2h0SnNMb2FkaW5nUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7CiAgICAgICAgICBjb25zdCB1cmwgPSBgJHtDRE5fQkFTRX0vaGlnaGxpZ2h0LmpzQCR7Q0ROX1ZFUlNJT05TLmhpZ2hsaWdodEpzfS8rZXNtYDsKICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IGltcG9ydCgKICAgICAgICAgICAgLyogQHZpdGUtaWdub3JlICovCiAgICAgICAgICAgIHVybAogICAgICAgICAgKTsKICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0SnNMaWIgPSBtb2R1bGUuZGVmYXVsdDsKICAgICAgICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodEpzTGliOwogICAgICAgIH0pKCk7CiAgICAgICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0SnNMb2FkaW5nUHJvbWlzZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogTG9hZCBBcGV4Q2hhcnRzIGNoYXJ0aW5nIGxpYnJhcnkgZnJvbSBDRE4KICAgICAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gQXBleENoYXJ0cyBjb25zdHJ1Y3RvcgogICAgICAgKi8KICAgICAgYXN5bmMgbG9hZEFwZXhDaGFydHMoKSB7CiAgICAgICAgaWYgKHRoaXMuYXBleENoYXJ0c0xpYikgewogICAgICAgICAgcmV0dXJuIHRoaXMuYXBleENoYXJ0c0xpYjsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuYXBleENoYXJ0c0xvYWRpbmdQcm9taXNlKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5hcGV4Q2hhcnRzTG9hZGluZ1Byb21pc2U7CiAgICAgICAgfQogICAgICAgIHRoaXMuYXBleENoYXJ0c0xvYWRpbmdQcm9taXNlID0gKGFzeW5jICgpID0+IHsKICAgICAgICAgIGNvbnN0IHVybCA9IGAke0NETl9CQVNFfS9hcGV4Y2hhcnRzQCR7Q0ROX1ZFUlNJT05TLmFwZXhjaGFydHN9Lytlc21gOwogICAgICAgICAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KAogICAgICAgICAgICAvKiBAdml0ZS1pZ25vcmUgKi8KICAgICAgICAgICAgdXJsCiAgICAgICAgICApOwogICAgICAgICAgdGhpcy5hcGV4Q2hhcnRzTGliID0gbW9kdWxlLmRlZmF1bHQ7CiAgICAgICAgICByZXR1cm4gdGhpcy5hcGV4Q2hhcnRzTGliOwogICAgICAgIH0pKCk7CiAgICAgICAgcmV0dXJuIHRoaXMuYXBleENoYXJ0c0xvYWRpbmdQcm9taXNlOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBMb2FkIFRpcHRhcCByaWNoIHRleHQgZWRpdG9yIGFuZCBleHRlbnNpb25zIGZyb20gQ0ROCiAgICAgICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIFRpcHRhcCBidW5kbGUgd2l0aCBFZGl0b3IgYW5kIGV4dGVuc2lvbnMKICAgICAgICovCiAgICAgIGFzeW5jIGxvYWRUaXB0YXAoKSB7CiAgICAgICAgaWYgKHRoaXMudGlwdGFwTGliKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy50aXB0YXBMaWI7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnRpcHRhcExvYWRpbmdQcm9taXNlKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy50aXB0YXBMb2FkaW5nUHJvbWlzZTsKICAgICAgICB9CiAgICAgICAgdGhpcy50aXB0YXBMb2FkaW5nUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7CiAgICAgICAgICBjb25zdCB2ZXJzaW9uMiA9IENETl9WRVJTSU9OUy50aXB0YXA7CiAgICAgICAgICBjb25zdCBbY29yZU1vZHVsZSwgc3RhcnRlcktpdE1vZHVsZSwgdW5kZXJsaW5lTW9kdWxlLCB0ZXh0QWxpZ25Nb2R1bGUsIGxpbmtNb2R1bGUsIHR5cG9ncmFwaHlNb2R1bGVdID0gYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgICAgICAgICBpbXBvcnQoCiAgICAgICAgICAgICAgLyogQHZpdGUtaWdub3JlICovCiAgICAgICAgICAgICAgYCR7Q0ROX0JBU0V9L0B0aXB0YXAvY29yZUAke3ZlcnNpb24yfS8rZXNtYAogICAgICAgICAgICApLAogICAgICAgICAgICBpbXBvcnQoCiAgICAgICAgICAgICAgLyogQHZpdGUtaWdub3JlICovCiAgICAgICAgICAgICAgYCR7Q0ROX0JBU0V9L0B0aXB0YXAvc3RhcnRlci1raXRAJHt2ZXJzaW9uMn0vK2VzbWAKICAgICAgICAgICAgKSwKICAgICAgICAgICAgaW1wb3J0KAogICAgICAgICAgICAgIC8qIEB2aXRlLWlnbm9yZSAqLwogICAgICAgICAgICAgIGAke0NETl9CQVNFfS9AdGlwdGFwL2V4dGVuc2lvbi11bmRlcmxpbmVAJHt2ZXJzaW9uMn0vK2VzbWAKICAgICAgICAgICAgKSwKICAgICAgICAgICAgaW1wb3J0KAogICAgICAgICAgICAgIC8qIEB2aXRlLWlnbm9yZSAqLwogICAgICAgICAgICAgIGAke0NETl9CQVNFfS9AdGlwdGFwL2V4dGVuc2lvbi10ZXh0LWFsaWduQCR7dmVyc2lvbjJ9Lytlc21gCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGltcG9ydCgKICAgICAgICAgICAgICAvKiBAdml0ZS1pZ25vcmUgKi8KICAgICAgICAgICAgICBgJHtDRE5fQkFTRX0vQHRpcHRhcC9leHRlbnNpb24tbGlua0Ake3ZlcnNpb24yfS8rZXNtYAogICAgICAgICAgICApLAogICAgICAgICAgICBpbXBvcnQoCiAgICAgICAgICAgICAgLyogQHZpdGUtaWdub3JlICovCiAgICAgICAgICAgICAgYCR7Q0ROX0JBU0V9L0B0aXB0YXAvZXh0ZW5zaW9uLXR5cG9ncmFwaHlAJHt2ZXJzaW9uMn0vK2VzbWAKICAgICAgICAgICAgKQogICAgICAgICAgXSk7CiAgICAgICAgICB0aGlzLnRpcHRhcExpYiA9IHsKICAgICAgICAgICAgRWRpdG9yOiBjb3JlTW9kdWxlLkVkaXRvciwKICAgICAgICAgICAgU3RhcnRlcktpdDogc3RhcnRlcktpdE1vZHVsZS5kZWZhdWx0IHx8IHN0YXJ0ZXJLaXRNb2R1bGUuU3RhcnRlcktpdCwKICAgICAgICAgICAgVW5kZXJsaW5lOiB1bmRlcmxpbmVNb2R1bGUuZGVmYXVsdCB8fCB1bmRlcmxpbmVNb2R1bGUuVW5kZXJsaW5lLAogICAgICAgICAgICBUZXh0QWxpZ246IHRleHRBbGlnbk1vZHVsZS5kZWZhdWx0IHx8IHRleHRBbGlnbk1vZHVsZS5UZXh0QWxpZ24sCiAgICAgICAgICAgIExpbms6IGxpbmtNb2R1bGUuZGVmYXVsdCB8fCBsaW5rTW9kdWxlLkxpbmssCiAgICAgICAgICAgIFR5cG9ncmFwaHk6IHR5cG9ncmFwaHlNb2R1bGUuZGVmYXVsdCB8fCB0eXBvZ3JhcGh5TW9kdWxlLlR5cG9ncmFwaHkKICAgICAgICAgIH07CiAgICAgICAgICByZXR1cm4gdGhpcy50aXB0YXBMaWI7CiAgICAgICAgfSkoKTsKICAgICAgICByZXR1cm4gdGhpcy50aXB0YXBMb2FkaW5nUHJvbWlzZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogUHJlbG9hZCBtdWx0aXBsZSBsaWJyYXJpZXMgaW4gcGFyYWxsZWwKICAgICAgICogVXNlZnVsIGZvciB3YXJtaW5nIHRoZSBjYWNoZSBiZWZvcmUgY29tcG9uZW50cyBhcmUgcmVuZGVyZWQKICAgICAgICovCiAgICAgIGFzeW5jIHByZWxvYWRBbGwoKSB7CiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgICAgICAgdGhpcy5sb2FkWHRlcm0oKSwKICAgICAgICAgIHRoaXMubG9hZFh0ZXJtRml0QWRkb24oKSwKICAgICAgICAgIHRoaXMubG9hZFh0ZXJtU2VhcmNoQWRkb24oKSwKICAgICAgICAgIHRoaXMubG9hZEhpZ2hsaWdodEpzKCksCiAgICAgICAgICB0aGlzLmxvYWRBcGV4Q2hhcnRzKCksCiAgICAgICAgICB0aGlzLmxvYWRUaXB0YXAoKQogICAgICAgIF0pOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDaGVjayBpZiBhIHNwZWNpZmljIGxpYnJhcnkgaXMgYWxyZWFkeSBsb2FkZWQKICAgICAgICovCiAgICAgIGlzTG9hZGVkKGxpYnJhcnkyKSB7CiAgICAgICAgc3dpdGNoIChsaWJyYXJ5MikgewogICAgICAgICAgY2FzZSAieHRlcm0iOgogICAgICAgICAgICByZXR1cm4gdGhpcy54dGVybUxpYiAhPT0gbnVsbDsKICAgICAgICAgIGNhc2UgInh0ZXJtRml0QWRkb24iOgogICAgICAgICAgICByZXR1cm4gdGhpcy54dGVybUZpdEFkZG9uTGliICE9PSBudWxsOwogICAgICAgICAgY2FzZSAieHRlcm1TZWFyY2hBZGRvbiI6CiAgICAgICAgICAgIHJldHVybiB0aGlzLnh0ZXJtU2VhcmNoQWRkb25MaWIgIT09IG51bGw7CiAgICAgICAgICBjYXNlICJoaWdobGlnaHRKcyI6CiAgICAgICAgICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodEpzTGliICE9PSBudWxsOwogICAgICAgICAgY2FzZSAiYXBleENoYXJ0cyI6CiAgICAgICAgICAgIHJldHVybiB0aGlzLmFwZXhDaGFydHNMaWIgIT09IG51bGw7CiAgICAgICAgICBjYXNlICJ0aXB0YXAiOgogICAgICAgICAgICByZXR1cm4gdGhpcy50aXB0YXBMaWIgIT09IG51bGw7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL3NlcnZpY2VzL2luZGV4LmpzCnZhciBpbml0X3NlcnZpY2VzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL3NlcnZpY2VzL2luZGV4LmpzIigpIHsKICAgIGluaXRfRGVlc1NlcnZpY2VMaWJMb2FkZXIoKTsKICAgIGluaXRfdmVyc2lvbnMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWZlZWRiYWNrL2RlZXMtYWN0aW9uYmFyL2RlZXMtYWN0aW9uYmFyLmpzCnZhciBfX2VzRGVjb3JhdGU1MCwgX19ydW5Jbml0aWFsaXplcnM1MSwgRGVlc0FjdGlvbmJhcjsKdmFyIGluaXRfZGVlc19hY3Rpb25iYXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1mZWVkYmFjay9kZWVzLWFjdGlvbmJhci9kZWVzLWFjdGlvbmJhci5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMyNigpOwogICAgaW5pdF90aGVtZSgpOwogICAgaW5pdF9kZWVzX2ljb24oKTsKICAgIF9fZXNEZWNvcmF0ZTUwID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICAgICAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICAgICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgICAgIHJldHVybiBmNzsKICAgICAgfQogICAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogICAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogICAgICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICAgICAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgICAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgICAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgICAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICAgICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgICAgIH07CiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgICAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgICAgIGRvbmUgPSB0cnVlOwogICAgfTsKICAgIF9fcnVuSW5pdGlhbGl6ZXJzNTEgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogICAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICAgICAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgICAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwogICAgfTsKICAgIERlZXNBY3Rpb25iYXIgPSAoKCkgPT4gewogICAgICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1hY3Rpb25iYXIiKV07CiAgICAgIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogICAgICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9jbGFzc1RoaXM7CiAgICAgIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogICAgICBsZXQgX2N1cnJlbnRCYXJfZGVjb3JhdG9yczsKICAgICAgbGV0IF9jdXJyZW50QmFyX2luaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX2N1cnJlbnRCYXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF90aW1lUmVtYWluaW5nX2RlY29yYXRvcnM7CiAgICAgIGxldCBfdGltZVJlbWFpbmluZ19pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF90aW1lUmVtYWluaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgICAgIGxldCBfcHJvZ3Jlc3NQZXJjZW50X2RlY29yYXRvcnM7CiAgICAgIGxldCBfcHJvZ3Jlc3NQZXJjZW50X2luaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX3Byb2dyZXNzUGVyY2VudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX2lzVmlzaWJsZV9kZWNvcmF0b3JzOwogICAgICBsZXQgX2lzVmlzaWJsZV9pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9pc1Zpc2libGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICAgICAgdmFyIERlZXNBY3Rpb25iYXIyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICAgICAgc3RhdGljIHsKICAgICAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgewogICAgICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgICAgICBfY3VycmVudEJhcl9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICAgICAgX3RpbWVSZW1haW5pbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgICAgIF9wcm9ncmVzc1BlcmNlbnRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgICAgIF9pc1Zpc2libGVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgICAgIF9fZXNEZWNvcmF0ZTUwKHRoaXMsIG51bGwsIF9jdXJyZW50QmFyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImN1cnJlbnRCYXIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImN1cnJlbnRCYXIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3VycmVudEJhciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICAgICAgb2JqLmN1cnJlbnRCYXIgPSB2YWx1ZTI7CiAgICAgICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2N1cnJlbnRCYXJfaW5pdGlhbGl6ZXJzLCBfY3VycmVudEJhcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgICAgICBfX2VzRGVjb3JhdGU1MCh0aGlzLCBudWxsLCBfdGltZVJlbWFpbmluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0aW1lUmVtYWluaW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0aW1lUmVtYWluaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRpbWVSZW1haW5pbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgICAgIG9iai50aW1lUmVtYWluaW5nID0gdmFsdWUyOwogICAgICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90aW1lUmVtYWluaW5nX2luaXRpYWxpemVycywgX3RpbWVSZW1haW5pbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgX19lc0RlY29yYXRlNTAodGhpcywgbnVsbCwgX3Byb2dyZXNzUGVyY2VudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwcm9ncmVzc1BlcmNlbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInByb2dyZXNzUGVyY2VudCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5wcm9ncmVzc1BlcmNlbnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgICAgIG9iai5wcm9ncmVzc1BlcmNlbnQgPSB2YWx1ZTI7CiAgICAgICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Byb2dyZXNzUGVyY2VudF9pbml0aWFsaXplcnMsIF9wcm9ncmVzc1BlcmNlbnRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgX19lc0RlY29yYXRlNTAodGhpcywgbnVsbCwgX2lzVmlzaWJsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc1Zpc2libGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImlzVmlzaWJsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc1Zpc2libGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgICAgIG9iai5pc1Zpc2libGUgPSB2YWx1ZTI7CiAgICAgICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzVmlzaWJsZV9pbml0aWFsaXplcnMsIF9pc1Zpc2libGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgX19lc0RlY29yYXRlNTAobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgRGVlc0FjdGlvbmJhcjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgICAgICB9CiAgICAgICAgLy8gU1RBVElDCiAgICAgICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkZlZWRiYWNrIiwgIk92ZXJsYXkiXTsKICAgICAgICBzdGF0aWMgZGVtbyA9ICgpID0+IHsKICAgICAgICAgIGNvbnN0IGdldEFjdGlvbmJhciA9IChlMTEpID0+IHsKICAgICAgICAgICAgY29uc3QgYnV0dG9uID0gZTExLmN1cnJlbnRUYXJnZXQ7CiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGJ1dHRvbi5jbG9zZXN0KCIuZGVtby1jb250YWluZXIiKTsKICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcj8ucXVlcnlTZWxlY3RvcigiZGVlcy1hY3Rpb25iYXIiKTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCBzaG93QWN0aW9uQmFyID0gYXN5bmMgKGUxMSkgPT4gewogICAgICAgICAgICBjb25zdCBhY3Rpb25iYXIgPSBnZXRBY3Rpb25iYXIoZTExKTsKICAgICAgICAgICAgaWYgKCFhY3Rpb25iYXIpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhY3Rpb25iYXIuc2hvdyh7CiAgICAgICAgICAgICAgbWVzc2FnZTogIkZpbGUgY2hhbmdlZCBleHRlcm5hbGx5LiBSZWxvYWQ/IiwKICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyIsCiAgICAgICAgICAgICAgaWNvbjogImx1Y2lkZTphbGVydFRyaWFuZ2xlIiwKICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICB7IGlkOiAicmVsb2FkIiwgbGFiZWw6ICJSZWxvYWQiLCBwcmltYXJ5OiB0cnVlIH0sCiAgICAgICAgICAgICAgICB7IGlkOiAiaWdub3JlIiwgbGFiZWw6ICJJZ25vcmUiIH0KICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgIHRpbWVvdXQ6IHsgZHVyYXRpb246IDVlMywgZGVmYXVsdEFjdGlvbklkOiAicmVsb2FkIiB9LAogICAgICAgICAgICAgIGRpc21pc3NpYmxlOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zb2xlLmxvZygiQWN0aW9uIGJhciByZXN1bHQ6IiwgcmVzdWx0KTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCBzaG93RXJyb3JCYXIgPSBhc3luYyAoZTExKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGFjdGlvbmJhciA9IGdldEFjdGlvbmJhcihlMTEpOwogICAgICAgICAgICBpZiAoIWFjdGlvbmJhcikKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFjdGlvbmJhci5zaG93KHsKICAgICAgICAgICAgICBtZXNzYWdlOiAiUHJvY2VzcyBmYWlsZWQgd2l0aCBleGl0IGNvZGUgMSIsCiAgICAgICAgICAgICAgdHlwZTogImVycm9yIiwKICAgICAgICAgICAgICBpY29uOiAibHVjaWRlOnhDaXJjbGUiLAogICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgIHsgaWQ6ICJyZXRyeSIsIGxhYmVsOiAiUmV0cnkiLCBwcmltYXJ5OiB0cnVlIH0sCiAgICAgICAgICAgICAgICB7IGlkOiAiZGlzbWlzcyIsIGxhYmVsOiAiRGlzbWlzcyIgfQogICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgdGltZW91dDogeyBkdXJhdGlvbjogMWU0LCBkZWZhdWx0QWN0aW9uSWQ6ICJkaXNtaXNzIiB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zb2xlLmxvZygiRXJyb3IgYmFyIHJlc3VsdDoiLCByZXN1bHQpOwogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHNob3dRdWVzdGlvbkJhciA9IGFzeW5jIChlMTEpID0+IHsKICAgICAgICAgICAgY29uc3QgYWN0aW9uYmFyID0gZ2V0QWN0aW9uYmFyKGUxMSk7CiAgICAgICAgICAgIGlmICghYWN0aW9uYmFyKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYWN0aW9uYmFyLnNob3coewogICAgICAgICAgICAgIG1lc3NhZ2U6ICJTYXZlIGNoYW5nZXMgYmVmb3JlIGNsb3Npbmc/IiwKICAgICAgICAgICAgICB0eXBlOiAicXVlc3Rpb24iLAogICAgICAgICAgICAgIGljb246ICJsdWNpZGU6aGVscENpcmNsZSIsCiAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgeyBpZDogInNhdmUiLCBsYWJlbDogIlNhdmUiLCBwcmltYXJ5OiB0cnVlIH0sCiAgICAgICAgICAgICAgICB7IGlkOiAiZGlzY2FyZCIsIGxhYmVsOiAiRGlzY2FyZCIgfSwKICAgICAgICAgICAgICAgIHsgaWQ6ICJjYW5jZWwiLCBsYWJlbDogIkNhbmNlbCIgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJRdWVzdGlvbiBiYXIgcmVzdWx0OiIsIHJlc3VsdCk7CiAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIGIyYAogICAgICA8c3R5bGU+CiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMzMzM7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIH0KICAgICAgICAuZGVtby1jb250ZW50IHsKICAgICAgICAgIGZsZXg6IDE7CiAgICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGdhcDogOHB4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgICAgfQogICAgICA8L3N0eWxlPgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICAgICAgPGRpdiBjbGFzcz0iZGVtby1jb250ZW50Ij4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2s9JHtzaG93QWN0aW9uQmFyfT5XYXJuaW5nPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2s9JHtzaG93RXJyb3JCYXJ9PkVycm9yPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2s9JHtzaG93UXVlc3Rpb25CYXJ9PlF1ZXN0aW9uPC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGVlcy1hY3Rpb25iYXI+PC9kZWVzLWFjdGlvbmJhcj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgICAgIH07CiAgICAgICAgLy8gUXVldWUgb2YgcGVuZGluZyBhY3Rpb24gYmFycwogICAgICAgIHF1ZXVlID0gW107CiAgICAgICAgI2N1cnJlbnRCYXJfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNTEodGhpcywgX2N1cnJlbnRCYXJfaW5pdGlhbGl6ZXJzLCBudWxsKTsKICAgICAgICAvLyBDdXJyZW50IGFjdGl2ZSBiYXIgc3RhdGUKICAgICAgICBnZXQgY3VycmVudEJhcigpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiNjdXJyZW50QmFyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICAgICAgfQogICAgICAgIHNldCBjdXJyZW50QmFyKHZhbHVlMikgewogICAgICAgICAgdGhpcy4jY3VycmVudEJhcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgICAjdGltZVJlbWFpbmluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTEodGhpcywgX2N1cnJlbnRCYXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUxKHRoaXMsIF90aW1lUmVtYWluaW5nX2luaXRpYWxpemVycywgMCkpOwogICAgICAgIGdldCB0aW1lUmVtYWluaW5nKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuI3RpbWVSZW1haW5pbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgICAgICB9CiAgICAgICAgc2V0IHRpbWVSZW1haW5pbmcodmFsdWUyKSB7CiAgICAgICAgICB0aGlzLiN0aW1lUmVtYWluaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgICNwcm9ncmVzc1BlcmNlbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczUxKHRoaXMsIF90aW1lUmVtYWluaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1MSh0aGlzLCBfcHJvZ3Jlc3NQZXJjZW50X2luaXRpYWxpemVycywgMTAwKSk7CiAgICAgICAgZ2V0IHByb2dyZXNzUGVyY2VudCgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiNwcm9ncmVzc1BlcmNlbnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgICAgICB9CiAgICAgICAgc2V0IHByb2dyZXNzUGVyY2VudCh2YWx1ZTIpIHsKICAgICAgICAgIHRoaXMuI3Byb2dyZXNzUGVyY2VudF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgICAjaXNWaXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1MSh0aGlzLCBfcHJvZ3Jlc3NQZXJjZW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1MSh0aGlzLCBfaXNWaXNpYmxlX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgICAgICBnZXQgaXNWaXNpYmxlKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuI2lzVmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgICAgIH0KICAgICAgICBzZXQgaXNWaXNpYmxlKHZhbHVlMikgewogICAgICAgICAgdGhpcy4jaXNWaXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgIC8vIFRpbWVvdXQgaGFuZGxpbmcKICAgICAgICB0aW1lb3V0SW50ZXJ2YWwgPSAoX19ydW5Jbml0aWFsaXplcnM1MSh0aGlzLCBfaXNWaXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgbnVsbCk7CiAgICAgICAgY3VycmVudFJlc29sdmUgPSBudWxsOwogICAgICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgICAgICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC5hY3Rpb25iYXItaXRlbSB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDBmcjsKICAgICAgICB0cmFuc2l0aW9uOiBncmlkLXRlbXBsYXRlLXJvd3MgMC4ycyBlYXNlLW91dDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTYlKSIsICJoc2woMCAwJSAxMiUpIil9OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODglKSIsICJoc2woMCAwJSAyMCUpIil9OwogICAgICB9CgogICAgICA6aG9zdCgudmlzaWJsZSkgLmFjdGlvbmJhci1pdGVtIHsKICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDFmcjsKICAgICAgfQoKICAgICAgLmFjdGlvbmJhci1jb250ZW50IHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZS1vdXQ7CiAgICAgIH0KCiAgICAgIDpob3N0KC52aXNpYmxlKSAuYWN0aW9uYmFyLWNvbnRlbnQgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5wcm9ncmVzcy1iYXIgewogICAgICAgIGhlaWdodDogM3B4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5MCUpIiwgImhzbCgwIDAlIDE4JSkiKX07CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnByb2dyZXNzLWJhci1maWxsIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgMTAwJSA1MCUpIiwgImhzbCgyMTAgMTAwJSA2MCUpIil9OwogICAgICAgIHRyYW5zaXRpb246IHdpZHRoIDAuMXMgbGluZWFyOwogICAgICB9CgogICAgICAucHJvZ3Jlc3MtYmFyLWZpbGwud2FybmluZyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgzOCA5MiUgNTAlKSIsICJoc2woMzggOTIlIDU1JSkiKX07CiAgICAgIH0KCiAgICAgIC5wcm9ncmVzcy1iYXItZmlsbC5lcnJvciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcwJSA1MCUpIiwgImhzbCgwIDcwJSA1NSUpIil9OwogICAgICB9CgogICAgICAucHJvZ3Jlc3MtYmFyLWZpbGwucXVlc3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjcwIDcwJSA1MCUpIiwgImhzbCgyNzAgNzAlIDYwJSkiKX07CiAgICAgIH0KCiAgICAgIC5jb250ZW50IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDMycHg7CiAgICAgIH0KCiAgICAgIC5tZXNzYWdlLXNlY3Rpb24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgfQoKICAgICAgLm1lc3NhZ2UtaWNvbiB7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0MCUpIiwgImhzbCgwIDAlIDYwJSkiKX07CiAgICAgIH0KCiAgICAgIC5tZXNzYWdlLWljb24uaW5mbyB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDEwMCUgNDUlKSIsICJoc2woMjEwIDEwMCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLm1lc3NhZ2UtaWNvbi53YXJuaW5nIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgzOCA5MiUgNDUlKSIsICJoc2woMzggOTIlIDU1JSkiKX07CiAgICAgIH0KCiAgICAgIC5tZXNzYWdlLWljb24uZXJyb3IgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzAlIDUwJSkiLCAiaHNsKDAgNzAlIDU1JSkiKX07CiAgICAgIH0KCiAgICAgIC5tZXNzYWdlLWljb24ucXVlc3Rpb24gewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDI3MCA3MCUgNTAlKSIsICJoc2woMjcwIDcwJSA2MCUpIil9OwogICAgICB9CgogICAgICAubWVzc2FnZS10ZXh0IHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAyMCUpIiwgImhzbCgwIDAlIDg1JSkiKX07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CgogICAgICAuYWN0aW9ucy1zZWN0aW9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgICAgcGFkZGluZzogNHB4IDEwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbi5zZWNvbmRhcnkgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMzAlKSIsICJoc2woMCAwJSA3MCUpIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDgwJSkiLCAiaHNsKDAgMCUgMzAlKSIpfTsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idXR0b24uc2Vjb25kYXJ5OmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTIlKSIsICJoc2woMCAwJSAxOCUpIil9OwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbi5wcmltYXJ5IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCAxMDAlIDUwJSkiLCAiaHNsKDIxMCAxMDAlIDU1JSkiKX07CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbi5wcmltYXJ5OmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCAxMDAlIDQ1JSkiLCAiaHNsKDIxMCAxMDAlIDUwJSkiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uLnByaW1hcnkud2FybmluZyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgzOCA5MiUgNDUlKSIsICJoc2woMzggOTIlIDUwJSkiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uLnByaW1hcnkud2FybmluZzpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgzOCA5MiUgNDAlKSIsICJoc2woMzggOTIlIDQ1JSkiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uLnByaW1hcnkuZXJyb3IgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA3MCUgNTAlKSIsICJoc2woMCA3MCUgNTUlKSIpfTsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idXR0b24ucHJpbWFyeS5lcnJvcjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcwJSA0NSUpIiwgImhzbCgwIDcwJSA1MCUpIil9OwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbi5wcmltYXJ5LnF1ZXN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDI3MCA3MCUgNTAlKSIsICJoc2woMjcwIDcwJSA1NSUpIil9OwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbi5wcmltYXJ5LnF1ZXN0aW9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDI3MCA3MCUgNDUlKSIsICJoc2woMjcwIDcwJSA1MCUpIil9OwogICAgICB9CgogICAgICAuY291bnRkb3duIHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICAgIG1hcmdpbi1sZWZ0OiAycHg7CiAgICAgIH0KCiAgICAgIC5kaXNtaXNzLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNTAlKSIsICJoc2woMCAwJSA1MCUpIil9OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICB9CgogICAgICAuZGlzbWlzcy1idXR0b246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OCUpIiwgImhzbCgwIDAlIDIyJSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAzMCUpIiwgImhzbCgwIDAlIDcwJSkiKX07CiAgICAgIH0KICAgIGAKICAgICAgICBdOwogICAgICAgIHJlbmRlcigpIHsKICAgICAgICAgIGNvbnN0IGJhciA9IHRoaXMuY3VycmVudEJhcjsKICAgICAgICAgIGNvbnN0IHR5cGU1ID0gYmFyPy50eXBlIHx8ICJpbmZvIjsKICAgICAgICAgIGNvbnN0IGhhc1RpbWVvdXQgPSBiYXI/LnRpbWVvdXQgJiYgdGhpcy50aW1lUmVtYWluaW5nID4gMDsKICAgICAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iYWN0aW9uYmFyLWl0ZW0iPgogICAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbmJhci1jb250ZW50Ij4KICAgICAgICAgICR7YmFyID8gYjJgCiAgICAgICAgICAgICR7aGFzVGltZW91dCA/IGIyYAogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzLWJhciI+CiAgICAgICAgICAgICAgICA8ZGl2CiAgICAgICAgICAgICAgICAgIGNsYXNzPSJwcm9ncmVzcy1iYXItZmlsbCAke3R5cGU1fSIKICAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAke3RoaXMucHJvZ3Jlc3NQZXJjZW50fSUiCiAgICAgICAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZS1zZWN0aW9uIj4KICAgICAgICAgICAgICAgICR7YmFyLmljb24gPyBiMmAKICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJtZXNzYWdlLWljb24gJHt0eXBlNX0iCiAgICAgICAgICAgICAgICAgICAgLmljb249JHtiYXIuaWNvbn0KICAgICAgICAgICAgICAgICAgICBpY29uU2l6ZT0iMTYiCiAgICAgICAgICAgICAgICAgID48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtZXNzYWdlLXRleHQiPiR7YmFyLm1lc3NhZ2V9PC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbnMtc2VjdGlvbiI+CiAgICAgICAgICAgICAgICAke2Jhci5hY3Rpb25zLm1hcCgoYWN0aW9uKSA9PiB0aGlzLnJlbmRlckFjdGlvbkJ1dHRvbihhY3Rpb24sIGJhciwgaGFzVGltZW91dCkpfQogICAgICAgICAgICAgICAgJHtiYXIuZGlzbWlzc2libGUgPyBiMmAKICAgICAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJkaXNtaXNzLWJ1dHRvbiIKICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmhhbmRsZURpc21pc3MoKX0KICAgICAgICAgICAgICAgICAgICB0aXRsZT0iRGlzbWlzcyIKICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOngifSBpY29uU2l6ZT0iMTQiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgIDogIiJ9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgICAgICB9CiAgICAgICAgcmVuZGVyQWN0aW9uQnV0dG9uKGFjdGlvbiwgYmFyLCBoYXNUaW1lb3V0KSB7CiAgICAgICAgICBjb25zdCBpc1ByaW1hcnkgPSBhY3Rpb24ucHJpbWFyeTsKICAgICAgICAgIGNvbnN0IHR5cGU1ID0gYmFyLnR5cGUgfHwgImluZm8iOwogICAgICAgICAgY29uc3QgaXNEZWZhdWx0QWN0aW9uID0gYmFyLnRpbWVvdXQ/LmRlZmF1bHRBY3Rpb25JZCA9PT0gYWN0aW9uLmlkOwogICAgICAgICAgY29uc3Qgc2hvd0NvdW50ZG93biA9IGhhc1RpbWVvdXQgJiYgaXNEZWZhdWx0QWN0aW9uOwogICAgICAgICAgY29uc3Qgc2Vjb25kcyA9IE1hdGguY2VpbCh0aGlzLnRpbWVSZW1haW5pbmcgLyAxZTMpOwogICAgICAgICAgcmV0dXJuIGIyYAogICAgICA8YnV0dG9uCiAgICAgICAgY2xhc3M9ImFjdGlvbi1idXR0b24gJHtpc1ByaW1hcnkgPyBgcHJpbWFyeSAke3R5cGU1fWAgOiAic2Vjb25kYXJ5In0iCiAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5oYW5kbGVBY3Rpb24oYWN0aW9uLmlkLCBmYWxzZSl9CiAgICAgID4KICAgICAgICAke2FjdGlvbi5pY29uID8gYjJgCiAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7YWN0aW9uLmljb259IGljb25TaXplPSIxMiI+PC9kZWVzLWljb24+CiAgICAgICAgYCA6ICIifQogICAgICAgIDxzcGFuPiR7YWN0aW9uLmxhYmVsfTwvc3Bhbj4KICAgICAgICAke3Nob3dDb3VudGRvd24gPyBiMmAKICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb3VudGRvd24iPigke3NlY29uZHN9cyk8L3NwYW4+CiAgICAgICAgYCA6ICIifQogICAgICA8L2J1dHRvbj4KICAgIGA7CiAgICAgICAgfQogICAgICAgIC8vID09PT09PT09PT0gUHVibGljIEFQSSA9PT09PT09PT09CiAgICAgICAgLyoqCiAgICAgICAgICogU2hvdyBhbiBhY3Rpb24gYmFyIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuCiAgICAgICAgICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFuIGFjdGlvbiBpcyB0YWtlbi4KICAgICAgICAgKi8KICAgICAgICBhc3luYyBzaG93KG9wdGlvbnMpIHsKICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHsKICAgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKHsgb3B0aW9ucywgcmVzb2x2ZTogcmVzb2x2ZTIgfSk7CiAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50QmFyKSB7CiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUXVldWUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERpc21pc3MgdGhlIGN1cnJlbnQgYWN0aW9uIGJhciB3aXRob3V0IHRyaWdnZXJpbmcgYW55IGFjdGlvbi4KICAgICAgICAgKi8KICAgICAgICBkaXNtaXNzKCkgewogICAgICAgICAgdGhpcy5oYW5kbGVEaXNtaXNzKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENsZWFyIGFsbCBwZW5kaW5nIGFjdGlvbiBiYXJzIGluIHRoZSBxdWV1ZS4KICAgICAgICAgKi8KICAgICAgICBjbGVhclF1ZXVlKCkgewogICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMucXVldWUpIHsKICAgICAgICAgICAgaXRlbS5yZXNvbHZlKHsgYWN0aW9uSWQ6ICJkaXNtaXNzZWQiLCB0aW1lZE91dDogZmFsc2UgfSk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLnF1ZXVlID0gW107CiAgICAgICAgfQogICAgICAgIC8vID09PT09PT09PT0gUHJpdmF0ZSBNZXRob2RzID09PT09PT09PT0KICAgICAgICAvKioKICAgICAgICAgKiBIaWRlIHRoZSBjdXJyZW50IGFjdGlvbmJhciB3aXRoIGFuaW1hdGlvbi4KICAgICAgICAgKiBSZW1vdmVzIHZpc2libGUgY2xhc3MgZmlyc3QgdG8gdHJpZ2dlciBDU1MgdHJhbnNpdGlvbiwgdGhlbiBjbGVhcnMgY29udGVudCBhZnRlciBhbmltYXRpb24uCiAgICAgICAgICovCiAgICAgICAgYXN5bmMgaGlkZUN1cnJlbnRCYXIoKSB7CiAgICAgICAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKTsKICAgICAgICAgIHRoaXMuaXNWaXNpYmxlID0gZmFsc2U7CiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHNldFRpbWVvdXQocmVzb2x2ZTIsIDIyMCkpOwogICAgICAgICAgdGhpcy5jdXJyZW50QmFyID0gbnVsbDsKICAgICAgICAgIHRoaXMuY3VycmVudFJlc29sdmUgPSBudWxsOwogICAgICAgIH0KICAgICAgICBhc3luYyBwcm9jZXNzUXVldWUoKSB7CiAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgdGhpcy5oaWRlQ3VycmVudEJhcigpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5xdWV1ZS5zaGlmdCgpOwogICAgICAgICAgdGhpcy5jdXJyZW50QmFyID0gaXRlbS5vcHRpb25zOwogICAgICAgICAgdGhpcy5jdXJyZW50UmVzb2x2ZSA9IGl0ZW0ucmVzb2x2ZTsKICAgICAgICAgIHRoaXMuaXNWaXNpYmxlID0gdHJ1ZTsKICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7CiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKTsKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKGl0ZW0ub3B0aW9ucy50aW1lb3V0KSB7CiAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lb3V0KGl0ZW0ub3B0aW9ucy50aW1lb3V0LmR1cmF0aW9uLCBpdGVtLm9wdGlvbnMudGltZW91dC5kZWZhdWx0QWN0aW9uSWQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdGFydFRpbWVvdXQoZHVyYXRpb24sIGRlZmF1bHRBY3Rpb25JZCkgewogICAgICAgICAgdGhpcy50aW1lUmVtYWluaW5nID0gZHVyYXRpb247CiAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudCA9IDEwMDsKICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7CiAgICAgICAgICBjb25zdCB1cGRhdGVJbnRlcnZhbCA9IDUwOwogICAgICAgICAgdGhpcy50aW1lb3V0SW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lOwogICAgICAgICAgICB0aGlzLnRpbWVSZW1haW5pbmcgPSBNYXRoLm1heCgwLCBkdXJhdGlvbiAtIGVsYXBzZWQpOwogICAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudCA9IHRoaXMudGltZVJlbWFpbmluZyAvIGR1cmF0aW9uICogMTAwOwogICAgICAgICAgICBpZiAodGhpcy50aW1lUmVtYWluaW5nIDw9IDApIHsKICAgICAgICAgICAgICB0aGlzLmNsZWFyVGltZW91dEludGVydmFsKCk7CiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBY3Rpb24oZGVmYXVsdEFjdGlvbklkLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgdXBkYXRlSW50ZXJ2YWwpOwogICAgICAgIH0KICAgICAgICBjbGVhclRpbWVvdXRJbnRlcnZhbCgpIHsKICAgICAgICAgIGlmICh0aGlzLnRpbWVvdXRJbnRlcnZhbCkgewogICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMudGltZW91dEludGVydmFsKTsKICAgICAgICAgICAgdGhpcy50aW1lb3V0SW50ZXJ2YWwgPSBudWxsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBoYW5kbGVBY3Rpb24oYWN0aW9uSWQsIHRpbWVkT3V0KSB7CiAgICAgICAgICB0aGlzLmNsZWFyVGltZW91dEludGVydmFsKCk7CiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50UmVzb2x2ZSkgewogICAgICAgICAgICB0aGlzLmN1cnJlbnRSZXNvbHZlKHsgYWN0aW9uSWQsIHRpbWVkT3V0IH0pOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5wcm9jZXNzUXVldWUoKTsKICAgICAgICB9CiAgICAgICAgaGFuZGxlRGlzbWlzcygpIHsKICAgICAgICAgIHRoaXMuaGFuZGxlQWN0aW9uKCJkaXNtaXNzZWQiLCBmYWxzZSk7CiAgICAgICAgfQogICAgICAgIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0SW50ZXJ2YWwoKTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIHsKICAgICAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNTEoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIERlZXNBY3Rpb25iYXIyID0gX2NsYXNzVGhpczsKICAgIH0pKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1ydW50aW1lL2ludGVyZmFjZXMvSUV4ZWN1dGlvbkVudmlyb25tZW50LmpzCnZhciBpbml0X0lFeGVjdXRpb25FbnZpcm9ubWVudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXJ1bnRpbWUvaW50ZXJmYWNlcy9JRXhlY3V0aW9uRW52aXJvbm1lbnQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtcnVudGltZS9pbnRlcmZhY2VzL2luZGV4LmpzCnZhciBpbml0X2ludGVyZmFjZXMzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtcnVudGltZS9pbnRlcmZhY2VzL2luZGV4LmpzIigpIHsKICAgIGluaXRfSUV4ZWN1dGlvbkVudmlyb25tZW50KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC9pbnRlcm5hbC9jb25zdGFudHMuanMKdmFyIERFRkFVTFRfRURJVE9SX09SSUdJTiwgU0VBUkNIX1BBUkFNX0FVVEhfQ09ERSwgU0VBUkNIX1BBUkFNX0VSUk9SLCBTRUFSQ0hfUEFSQU1fRVJST1JfREVTQ1JJUFRJT04sIEJST0FEQ0FTVF9DSEFOTkVMX05BTUUsIFNUT1JBR0VfVE9LRU5TX05BTUUsIFNUT1JBR0VfQ09ERV9WRVJJRklFUl9OQU1FLCBTVE9SQUdFX1BPUFVQX05BTUU7CnZhciBpbml0X2NvbnN0YW50czMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC9pbnRlcm5hbC9jb25zdGFudHMuanMiKCkgewogICAgREVGQVVMVF9FRElUT1JfT1JJR0lOID0gImh0dHBzOi8vc3RhY2tibGl0ei5jb20iOwogICAgU0VBUkNIX1BBUkFNX0FVVEhfQ09ERSA9ICJjb2RlIjsKICAgIFNFQVJDSF9QQVJBTV9FUlJPUiA9ICJlcnJvciI7CiAgICBTRUFSQ0hfUEFSQU1fRVJST1JfREVTQ1JJUFRJT04gPSAiZXJyb3JfZGVzY3JpcHRpb24iOwogICAgQlJPQURDQVNUX0NIQU5ORUxfTkFNRSA9ICJfX3djX2FwaV9iY19fIjsKICAgIFNUT1JBR0VfVE9LRU5TX05BTUUgPSAiX193Y19hcGlfdG9rZW5zX18iOwogICAgU1RPUkFHRV9DT0RFX1ZFUklGSUVSX05BTUUgPSAiX193Y19hcGlfdmVyaWZpZXJfXyI7CiAgICBTVE9SQUdFX1BPUFVQX05BTUUgPSAiX193Y19hcGlfcG9wdXBfXyI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC9pbnRlcm5hbC9UeXBlZEV2ZW50VGFyZ2V0LmpzCnZhciBUeXBlZEV2ZW50VGFyZ2V0Owp2YXIgaW5pdF9UeXBlZEV2ZW50VGFyZ2V0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvaW50ZXJuYWwvVHlwZWRFdmVudFRhcmdldC5qcyIoKSB7CiAgICBUeXBlZEV2ZW50VGFyZ2V0ID0gY2xhc3MgewogICAgICBfYnVzID0gbmV3IEV2ZW50VGFyZ2V0KCk7CiAgICAgIGxpc3RlbihsaXN0ZW5lcjIpIHsKICAgICAgICBmdW5jdGlvbiB3cmFwcGVkTGlzdGVuZXIoZXZlbnQpIHsKICAgICAgICAgIGxpc3RlbmVyMihldmVudC5kYXRhKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fYnVzLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCB3cmFwcGVkTGlzdGVuZXIpOwogICAgICAgIHJldHVybiAoKSA9PiB0aGlzLl9idXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIHdyYXBwZWRMaXN0ZW5lcik7CiAgICAgIH0KICAgICAgZmlyZUV2ZW50KGRhdGEpIHsKICAgICAgICB0aGlzLl9idXMuZGlzcGF0Y2hFdmVudChuZXcgTWVzc2FnZUV2ZW50KCJtZXNzYWdlIiwgeyBkYXRhIH0pKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wZml4K3dlYmNvbnRhaW5lcl9fYXBpQDEuNi4xL25vZGVfbW9kdWxlcy9AdGVtcGZpeC93ZWJjb250YWluZXJfX2FwaS9kaXN0L2ludGVybmFsL3Rva2Vucy5qcwpmdW5jdGlvbiBjbGVhclRva2Vuc0luU3RvcmFnZSgpIHsKICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX1RPS0VOU19OQU1FKTsKfQpmdW5jdGlvbiBhZGRBY2Nlc3NUb2tlbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcjIpIHsKICByZXR1cm4gYWNjZXNzVG9rZW5DaGFuZ2VkTGlzdGVuZXJzLmxpc3RlbihsaXN0ZW5lcjIpOwp9CmZ1bmN0aW9uIHJlYWRUb2tlbnNGcm9tU3RvcmFnZSgpIHsKICBjb25zdCBzZXJpYWxpemVkVG9rZW5zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9UT0tFTlNfTkFNRSk7CiAgaWYgKCFzZXJpYWxpemVkVG9rZW5zKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgdHJ5IHsKICAgIHJldHVybiBKU09OLnBhcnNlKHNlcmlhbGl6ZWRUb2tlbnMpOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIG51bGw7CiAgfQp9CmZ1bmN0aW9uIHBlcnNpc3RUb2tlbnNJblN0b3JhZ2UodG9rZW5zKSB7CiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9UT0tFTlNfTkFNRSwgSlNPTi5zdHJpbmdpZnkodG9rZW5zKSk7Cn0KZnVuY3Rpb24gZ2V0RXhwaXJlc0Zyb21Ub2tlblJlc3BvbnNlKHsgY3JlYXRlZF9hdCwgZXhwaXJlc19pbiB9KSB7CiAgcmV0dXJuIChjcmVhdGVkX2F0ICsgZXhwaXJlc19pbikgKiAxZTM7Cn0KZnVuY3Rpb24gYXNzZXJ0VG9rZW5SZXNwb25zZSh0b2tlbikgewogIGlmICh0eXBlb2YgdG9rZW4gIT09ICJvYmplY3QiIHx8ICF0b2tlbikgewogICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIFRva2VuIFJlc3BvbnNlIik7CiAgfQogIGlmICh0eXBlb2YgdG9rZW4uYWNjZXNzX3Rva2VuICE9PSAic3RyaW5nIiB8fCB0eXBlb2YgdG9rZW4ucmVmcmVzaF90b2tlbiAhPT0gInN0cmluZyIgfHwgdHlwZW9mIHRva2VuLmNyZWF0ZWRfYXQgIT09ICJudW1iZXIiIHx8IHR5cGVvZiB0b2tlbi5leHBpcmVzX2luICE9PSAibnVtYmVyIikgewogICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIFRva2VuIFJlc3BvbnNlIik7CiAgfQp9CmZ1bmN0aW9uIHdhaXQobXMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUyLCBtcykpOwp9CmZ1bmN0aW9uIGZpcmVBY2Nlc3NUb2tlbkNoYW5nZWQoYWNjZXNzVG9rZW4pIHsKICBhY2Nlc3NUb2tlbkNoYW5nZWRMaXN0ZW5lcnMuZmlyZUV2ZW50KGFjY2Vzc1Rva2VuKTsKfQp2YXIgSUdOT1JFRF9FUlJPUiwgYWNjZXNzVG9rZW5DaGFuZ2VkTGlzdGVuZXJzLCBUb2tlbnM7CnZhciBpbml0X3Rva2VucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wZml4K3dlYmNvbnRhaW5lcl9fYXBpQDEuNi4xL25vZGVfbW9kdWxlcy9AdGVtcGZpeC93ZWJjb250YWluZXJfX2FwaS9kaXN0L2ludGVybmFsL3Rva2Vucy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50czMoKTsKICAgIGluaXRfVHlwZWRFdmVudFRhcmdldCgpOwogICAgSUdOT1JFRF9FUlJPUiA9IG5ldyBFcnJvcigpOwogICAgSUdOT1JFRF9FUlJPUi5zdGFjayA9ICIiOwogICAgYWNjZXNzVG9rZW5DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IFR5cGVkRXZlbnRUYXJnZXQoKTsKICAgIFRva2VucyA9IGNsYXNzIF9Ub2tlbnMgewogICAgICBvcmlnaW47CiAgICAgIHJlZnJlc2g7CiAgICAgIGFjY2VzczsKICAgICAgZXhwaXJlczsKICAgICAgX3Jldm9rZWQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CiAgICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgcmVmcmVzaCwgYWNjZXNzLCBleHBpcmVzKSB7CiAgICAgICAgdGhpcy5vcmlnaW4gPSBvcmlnaW47CiAgICAgICAgdGhpcy5yZWZyZXNoID0gcmVmcmVzaDsKICAgICAgICB0aGlzLmFjY2VzcyA9IGFjY2VzczsKICAgICAgICB0aGlzLmV4cGlyZXMgPSBleHBpcmVzOwogICAgICB9CiAgICAgIGFzeW5jIGFjdGl2YXRlKG9uRmFpbGVkUmVmcmVzaCkgewogICAgICAgIGlmICh0aGlzLl9yZXZva2VkLnNpZ25hbC5hYm9ydGVkKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRva2VuIHJldm9rZWQiKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuZXhwaXJlcyA8IERhdGUubm93KCkpIHsKICAgICAgICAgIGlmICghYXdhaXQgdGhpcy5fZmV0Y2hOZXdBY2Nlc3NUb2tlbigpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5fc3luYygpOwogICAgICAgIHRoaXMuX3N0YXJ0UmVmcmVzaFRva2Vuc0xvb3Aob25GYWlsZWRSZWZyZXNoKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBhc3luYyByZXZva2UoY2xpZW50SWQsIGlnbm9yZVJldm9rZUVycm9yKSB7CiAgICAgICAgdGhpcy5fcmV2b2tlZC5hYm9ydCgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3RoaXMub3JpZ2lufS9vYXV0aC9yZXZva2VgLCB7CiAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyB0b2tlbjogdGhpcy5yZWZyZXNoLCB0b2tlbl90eXBlX2hpbnQ6ICJyZWZyZXNoX3Rva2VuIiwgY2xpZW50X2lkOiBjbGllbnRJZCB9KSwKICAgICAgICAgICAgbW9kZTogImNvcnMiCiAgICAgICAgICB9KTsKICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9nb3V0YCk7CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgIGlmICghaWdub3JlUmV2b2tlRXJyb3IpIHsKICAgICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNsZWFyVG9rZW5zSW5TdG9yYWdlKCk7CiAgICAgIH0KICAgICAgc3RhdGljIGZyb21TdG9yYWdlKCkgewogICAgICAgIGNvbnN0IHNhdmVkVG9rZW5zID0gcmVhZFRva2Vuc0Zyb21TdG9yYWdlKCk7CiAgICAgICAgaWYgKCFzYXZlZFRva2VucykgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgX1Rva2VucyhzYXZlZFRva2Vucy5vcmlnaW4sIHNhdmVkVG9rZW5zLnJlZnJlc2gsIHNhdmVkVG9rZW5zLmFjY2Vzcywgc2F2ZWRUb2tlbnMuZXhwaXJlcyk7CiAgICAgIH0KICAgICAgc3RhdGljIGFzeW5jIGZyb21BdXRoQ29kZSh7IGVkaXRvck9yaWdpbjogZWRpdG9yT3JpZ2luMiwgY2xpZW50SWQsIGNvZGVWZXJpZmllciwgYXV0aENvZGUsIHJlZGlyZWN0VXJpIH0pIHsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2VkaXRvck9yaWdpbjJ9L29hdXRoL3Rva2VuYCwgewogICAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgogICAgICAgICAgfSwKICAgICAgICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoewogICAgICAgICAgICBjbGllbnRfaWQ6IGNsaWVudElkLAogICAgICAgICAgICBjb2RlOiBhdXRoQ29kZSwKICAgICAgICAgICAgY29kZV92ZXJpZmllcjogY29kZVZlcmlmaWVyLAogICAgICAgICAgICBncmFudF90eXBlOiAiYXV0aG9yaXphdGlvbl9jb2RlIiwKICAgICAgICAgICAgcmVkaXJlY3RfdXJpOiByZWRpcmVjdFVyaQogICAgICAgICAgfSksCiAgICAgICAgICBtb2RlOiAiY29ycyIKICAgICAgICB9KTsKICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCB0b2tlbjogJHtyZXNwb25zZS5zdGF0dXN9YCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHRva2VuUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICAgICAgYXNzZXJ0VG9rZW5SZXNwb25zZSh0b2tlblJlc3BvbnNlKTsKICAgICAgICBjb25zdCB7IGFjY2Vzc190b2tlbjogYWNjZXNzLCByZWZyZXNoX3Rva2VuOiByZWZyZXNoIH0gPSB0b2tlblJlc3BvbnNlOwogICAgICAgIGNvbnN0IGV4cGlyZXMgPSBnZXRFeHBpcmVzRnJvbVRva2VuUmVzcG9uc2UodG9rZW5SZXNwb25zZSk7CiAgICAgICAgcmV0dXJuIG5ldyBfVG9rZW5zKGVkaXRvck9yaWdpbjIsIHJlZnJlc2gsIGFjY2VzcywgZXhwaXJlcyk7CiAgICAgIH0KICAgICAgYXN5bmMgX2ZldGNoTmV3QWNjZXNzVG9rZW4oKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5vcmlnaW59L29hdXRoL3Rva2VuYCwgewogICAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgogICAgICAgICAgICB9LAogICAgICAgICAgICBib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHsKICAgICAgICAgICAgICBncmFudF90eXBlOiAicmVmcmVzaF90b2tlbiIsCiAgICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogdGhpcy5yZWZyZXNoCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICBtb2RlOiAiY29ycyIsCiAgICAgICAgICAgIHNpZ25hbDogdGhpcy5fcmV2b2tlZC5zaWduYWwKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICAgICAgICB0aHJvdyBJR05PUkVEX0VSUk9SOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgdG9rZW5SZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsKICAgICAgICAgIGFzc2VydFRva2VuUmVzcG9uc2UodG9rZW5SZXNwb25zZSk7CiAgICAgICAgICBjb25zdCB7IGFjY2Vzc190b2tlbjogYWNjZXNzLCByZWZyZXNoX3Rva2VuOiByZWZyZXNoIH0gPSB0b2tlblJlc3BvbnNlOwogICAgICAgICAgY29uc3QgZXhwaXJlcyA9IGdldEV4cGlyZXNGcm9tVG9rZW5SZXNwb25zZSh0b2tlblJlc3BvbnNlKTsKICAgICAgICAgIHRoaXMuYWNjZXNzID0gYWNjZXNzOwogICAgICAgICAgdGhpcy5leHBpcmVzID0gZXhwaXJlczsKICAgICAgICAgIHRoaXMucmVmcmVzaCA9IHJlZnJlc2g7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIGNsZWFyVG9rZW5zSW5TdG9yYWdlKCk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIF9zeW5jKCkgewogICAgICAgIHBlcnNpc3RUb2tlbnNJblN0b3JhZ2UodGhpcyk7CiAgICAgICAgZmlyZUFjY2Vzc1Rva2VuQ2hhbmdlZCh0aGlzLmFjY2Vzcyk7CiAgICAgIH0KICAgICAgYXN5bmMgX3N0YXJ0UmVmcmVzaFRva2Vuc0xvb3Aob25GYWlsZWRSZWZyZXNoKSB7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgIGNvbnN0IGV4cGlyZXNJbiA9IHRoaXMuZXhwaXJlcyAtIERhdGUubm93KCkgLSAxZTM7CiAgICAgICAgICBhd2FpdCB3YWl0KE1hdGgubWF4KGV4cGlyZXNJbiwgMWUzKSk7CiAgICAgICAgICBpZiAodGhpcy5fcmV2b2tlZC5zaWduYWwuYWJvcnRlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIXRoaXMuX2ZldGNoTmV3QWNjZXNzVG9rZW4oKSkgewogICAgICAgICAgICBvbkZhaWxlZFJlZnJlc2goKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fc3luYygpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wZml4K3dlYmNvbnRhaW5lcl9fYXBpQDEuNi4xL25vZGVfbW9kdWxlcy9AdGVtcGZpeC93ZWJjb250YWluZXJfX2FwaS9kaXN0L2ludGVybmFsL2lmcmFtZS11cmwuanMKdmFyIHBhcmFtcywgZWRpdG9yT3JpZ2luLCBpZnJhbWVTZXR0aW5nczsKdmFyIGluaXRfaWZyYW1lX3VybCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wZml4K3dlYmNvbnRhaW5lcl9fYXBpQDEuNi4xL25vZGVfbW9kdWxlcy9AdGVtcGZpeC93ZWJjb250YWluZXJfX2FwaS9kaXN0L2ludGVybmFsL2lmcmFtZS11cmwuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMzKCk7CiAgICBwYXJhbXMgPSB7fTsKICAgIGVkaXRvck9yaWdpbiA9IG51bGw7CiAgICBpZnJhbWVTZXR0aW5ncyA9IHsKICAgICAgZ2V0IGVkaXRvck9yaWdpbigpIHsKICAgICAgICBpZiAoZWRpdG9yT3JpZ2luID09IG51bGwpIHsKICAgICAgICAgIGVkaXRvck9yaWdpbiA9IG5ldyBVUkwoZ2xvYmFsVGhpcy5XRUJDT05UQUlORVJfQVBJX0lGUkFNRV9VUkwgPz8gREVGQVVMVF9FRElUT1JfT1JJR0lOKS5vcmlnaW47CiAgICAgICAgfQogICAgICAgIHJldHVybiBlZGl0b3JPcmlnaW47CiAgICAgIH0sCiAgICAgIHNldCBlZGl0b3JPcmlnaW4obmV3T3JpZ2luKSB7CiAgICAgICAgZWRpdG9yT3JpZ2luID0gbmV3IFVSTChuZXdPcmlnaW4pLm9yaWdpbjsKICAgICAgfSwKICAgICAgc2V0UXVlcnlQYXJhbShrZXkyLCB2YWx1ZTIpIHsKICAgICAgICBwYXJhbXNba2V5Ml0gPSB2YWx1ZTI7CiAgICAgIH0sCiAgICAgIGdldCB1cmwoKSB7CiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh0aGlzLmVkaXRvck9yaWdpbik7CiAgICAgICAgdXJsLnBhdGhuYW1lID0gIi9oZWFkbGVzcyI7CiAgICAgICAgZm9yIChjb25zdCBwYXJhbSBpbiBwYXJhbXMpIHsKICAgICAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KHBhcmFtLCBwYXJhbXNbcGFyYW1dKTsKICAgICAgICB9CiAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoInZlcnNpb24iLCAiMS42LjEiKTsKICAgICAgICByZXR1cm4gdXJsOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvaW50ZXJuYWwvY29kZS5qcwphc3luYyBmdW5jdGlvbiBTMjU2KGlucHV0KSB7CiAgY29uc3QgYXNjaWkgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoaW5wdXQpOwogIGNvbnN0IHNoYTI1NiA9IG5ldyBVaW50OEFycmF5KGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCJTSEEtMjU2IiwgYXNjaWkpKTsKICByZXR1cm4gYnRvYShzaGEyNTYucmVkdWNlKChiaW5hcnksIGJ5dGUpID0+IGJpbmFyeSArIFN0cmluZy5mcm9tQ29kZVBvaW50KGJ5dGUpLCAiIikpLnJlcGxhY2UoL1wrL2csICItIikucmVwbGFjZSgvXC8vZywgIl8iKS5yZXBsYWNlKC89KyQvLCAiIik7Cn0KZnVuY3Rpb24gbmV3Q29kZVZlcmlmaWVyKCkgewogIGNvbnN0IHJhbmRvbSA9IG5ldyBVaW50OEFycmF5KDk2KTsKICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHJhbmRvbSk7CiAgbGV0IGNvZGVWZXJpZmllciA9ICIiOwogIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IDMyOyArK2kxMSkgewogICAgY29kZVZlcmlmaWVyICs9IG5leHRGb3VyQ2hhcnMocmFuZG9tWzMgKiBpMTEgKyAwXSwgcmFuZG9tWzMgKiBpMTEgKyAxXSwgcmFuZG9tWzMgKiBpMTEgKyAyXSk7CiAgfQogIHJldHVybiBjb2RlVmVyaWZpZXI7Cn0KZnVuY3Rpb24gbmV4dEZvdXJDaGFycyhieXRlMSwgYnl0ZTIsIGJ5dGUzKSB7CiAgY29uc3QgY2hhcjEgPSBieXRlMSA+PiAyOwogIGNvbnN0IGNoYXIyID0gKGJ5dGUxICYgMykgPDwgNCB8IGJ5dGUyID4+IDQ7CiAgY29uc3QgY2hhcjMgPSBieXRlMiAmIDE1IHwgKGJ5dGUzICYgMTkyKSA+PiAyOwogIGNvbnN0IGNoYXI0ID0gYnl0ZTMgJiA2MzsKICByZXR1cm4gW2NoYXIxLCBjaGFyMiwgY2hhcjMsIGNoYXI0XS5tYXAodW5yZXNlcnZlZENoYXJhY3RlcnMpLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIHVucmVzZXJ2ZWRDaGFyYWN0ZXJzKGNvZGU0KSB7CiAgbGV0IG9mZnNldDsKICBpZiAoY29kZTQgPCAyNikgewogICAgb2Zmc2V0ID0gY29kZTQgKyA2NTsKICB9IGVsc2UgaWYgKGNvZGU0IDwgNTIpIHsKICAgIG9mZnNldCA9IGNvZGU0IC0gMjYgKyA5NzsKICB9IGVsc2UgaWYgKGNvZGU0IDwgNjIpIHsKICAgIG9mZnNldCA9IGNvZGU0IC0gNTIgKyA0ODsKICB9IGVsc2UgewogICAgb2Zmc2V0ID0gY29kZTQgPT09IDYyID8gMzAgOiA0NTsKICB9CiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUob2Zmc2V0KTsKfQp2YXIgaW5pdF9jb2RlNCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wZml4K3dlYmNvbnRhaW5lcl9fYXBpQDEuNi4xL25vZGVfbW9kdWxlcy9AdGVtcGZpeC93ZWJjb250YWluZXJfX2FwaS9kaXN0L2ludGVybmFsL2NvZGUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvaW50ZXJuYWwvcmVzZXQtcHJvbWlzZS5qcwpmdW5jdGlvbiByZXNldHRhYmxlUHJvbWlzZSgpIHsKICBsZXQgcmVzb2x2ZTI7CiAgbGV0IHByb21pc2U7CiAgZnVuY3Rpb24gcmVzZXQoKSB7CiAgICBwcm9taXNlID0gbmV3IFByb21pc2UoKF9yZXNvbHZlKSA9PiByZXNvbHZlMiA9IF9yZXNvbHZlKTsKICB9CiAgcmVzZXQoKTsKICByZXR1cm4gewogICAgZ2V0IHByb21pc2UoKSB7CiAgICAgIHJldHVybiBwcm9taXNlOwogICAgfSwKICAgIHJlc29sdmUodmFsdWUyKSB7CiAgICAgIHJldHVybiByZXNvbHZlMih2YWx1ZTIpOwogICAgfSwKICAgIHJlc2V0CiAgfTsKfQp2YXIgaW5pdF9yZXNldF9wcm9taXNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvaW50ZXJuYWwvcmVzZXQtcHJvbWlzZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC9pbnRlcm5hbC9hdXRoLXN0YXRlLmpzCmZ1bmN0aW9uIGJyb2FkY2FzdE1lc3NhZ2UobWVzc2FnZTIpIHsKICBpZiAoIWF1dGhTdGF0ZS5icm9hZGNhc3RDaGFubmVsKSB7CiAgICByZXR1cm47CiAgfQogIGF1dGhTdGF0ZS5icm9hZGNhc3RDaGFubmVsLnBvc3RNZXNzYWdlKG1lc3NhZ2UyKTsKICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9QT1BVUF9OQU1FKSA9PT0gInRydWUiICYmIG1lc3NhZ2UyLnR5cGUgIT09ICJhdXRoLWxvZ291dCIpIHsKICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFNUT1JBR0VfUE9QVVBfTkFNRSk7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgd2luZG93LmNsb3NlKCk7CiAgICB9KTsKICB9Cn0KZnVuY3Rpb24gb25GYWlsZWRUb2tlblJlZnJlc2goKSB7CiAgbG9nZ2VkT3V0TGlzdGVuZXJzLmZpcmVFdmVudCgpOwogIGJyb2FkY2FzdE1lc3NhZ2UoeyB0eXBlOiAiYXV0aC1sb2dvdXQiIH0pOwp9CmZ1bmN0aW9uIGRlZmF1bHRSZWRpcmVjdFVyaSgpIHsKICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWY7Cn0KYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPQXV0aFJlcXVlc3QoKSB7CiAgY29uc3QgY29kZVZlcmlmaWVyID0gbmV3Q29kZVZlcmlmaWVyKCk7CiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9DT0RFX1ZFUklGSUVSX05BTUUsIGNvZGVWZXJpZmllcik7CiAgY29uc3QgY29kZUNoYWxsZW5nZSA9IGF3YWl0IFMyNTYoY29kZVZlcmlmaWVyKTsKICBjb25zdCB1cmwgPSBuZXcgVVJMKCIvb2F1dGgvYXV0aG9yaXplIiwgYXV0aFN0YXRlLmVkaXRvck9yaWdpbik7CiAgY29uc3QgeyBzZWFyY2hQYXJhbXMgfSA9IHVybDsKICBzZWFyY2hQYXJhbXMuYXBwZW5kKCJyZXNwb25zZV90eXBlIiwgImNvZGUiKTsKICBzZWFyY2hQYXJhbXMuYXBwZW5kKCJjbGllbnRfaWQiLCBhdXRoU3RhdGUuY2xpZW50SWQpOwogIHNlYXJjaFBhcmFtcy5hcHBlbmQoInJlZGlyZWN0X3VyaSIsIGRlZmF1bHRSZWRpcmVjdFVyaSgpKTsKICBzZWFyY2hQYXJhbXMuYXBwZW5kKCJzY29wZSIsIGF1dGhTdGF0ZS5vYXV0aFNjb3BlKTsKICBzZWFyY2hQYXJhbXMuYXBwZW5kKCJjb2RlX2NoYWxsZW5nZSIsIGNvZGVDaGFsbGVuZ2UpOwogIHNlYXJjaFBhcmFtcy5hcHBlbmQoImNvZGVfY2hhbGxlbmdlX21ldGhvZCIsICJTMjU2Iik7CiAgcmV0dXJuIHVybC50b1N0cmluZygpOwp9CmZ1bmN0aW9uIGFzc2VydEF1dGhUb2tlbnModG9rZW5zKSB7CiAgaWYgKCF0b2tlbnMpIHsKICAgIHRocm93IG5ldyBFcnJvcigiT29wcyEgVG9rZW5zIGlzIG5vdCBkZWZpbmVkIHdoZW4gaXQgYWx3YXlzIHNob3VsZCBiZS4iKTsKICB9Cn0KdmFyIGF1dGhTdGF0ZSwgYXV0aEZhaWxlZExpc3RlbmVycywgbG9nZ2VkT3V0TGlzdGVuZXJzLCBhdXRoOwp2YXIgaW5pdF9hdXRoX3N0YXRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvaW50ZXJuYWwvYXV0aC1zdGF0ZS5qcyIoKSB7CiAgICBpbml0X3Rva2VucygpOwogICAgaW5pdF9jb25zdGFudHMzKCk7CiAgICBpbml0X2lmcmFtZV91cmwoKTsKICAgIGluaXRfY29kZTQoKTsKICAgIGluaXRfcmVzZXRfcHJvbWlzZSgpOwogICAgaW5pdF9UeXBlZEV2ZW50VGFyZ2V0KCk7CiAgICBhdXRoU3RhdGUgPSB7CiAgICAgIGluaXRpYWxpemVkOiBmYWxzZSwKICAgICAgYm9vdENhbGxlZDogZmFsc2UsCiAgICAgIGF1dGhDb21wbGV0ZTogcmVzZXR0YWJsZVByb21pc2UoKSwKICAgICAgY2xpZW50SWQ6ICIiLAogICAgICBvYXV0aFNjb3BlOiAiIiwKICAgICAgYnJvYWRjYXN0Q2hhbm5lbDogbnVsbCwKICAgICAgZ2V0IGVkaXRvck9yaWdpbigpIHsKICAgICAgICByZXR1cm4gaWZyYW1lU2V0dGluZ3MuZWRpdG9yT3JpZ2luOwogICAgICB9LAogICAgICB0b2tlbnM6IG51bGwKICAgIH07CiAgICBhdXRoRmFpbGVkTGlzdGVuZXJzID0gbmV3IFR5cGVkRXZlbnRUYXJnZXQoKTsKICAgIGxvZ2dlZE91dExpc3RlbmVycyA9IG5ldyBUeXBlZEV2ZW50VGFyZ2V0KCk7CiAgICBhdXRoID0gewogICAgICBpbml0KHsgZWRpdG9yT3JpZ2luOiBlZGl0b3JPcmlnaW4yLCBjbGllbnRJZCwgc2NvcGUgfSkgewogICAgICAgIGlmIChhdXRoU3RhdGUuaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW5pdCBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSIpOwogICAgICAgIH0KICAgICAgICBsZXQgZW50ZXJwcmlzZSA9IHRydWU7CiAgICAgICAgaWYgKGVudGVycHJpc2UgJiYgYXV0aFN0YXRlLmJvb3RDYWxsZWQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiYGF1dGguaW5pdGAgc2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQgYmVmb3JlIGBXZWJDb250YWluZXIuYm9vdGAiKTsKICAgICAgICB9CiAgICAgICAgYXV0aFN0YXRlLmluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgICBhdXRoU3RhdGUudG9rZW5zID0gVG9rZW5zLmZyb21TdG9yYWdlKCk7CiAgICAgICAgYXV0aFN0YXRlLmNsaWVudElkID0gY2xpZW50SWQ7CiAgICAgICAgYXV0aFN0YXRlLm9hdXRoU2NvcGUgPSBzY29wZTsKICAgICAgICBhdXRoU3RhdGUuYnJvYWRjYXN0Q2hhbm5lbCA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKEJST0FEQ0FTVF9DSEFOTkVMX05BTUUpOwogICAgICAgIGlmcmFtZVNldHRpbmdzLnNldFF1ZXJ5UGFyYW0oImNsaWVudF9pZCIsIGNsaWVudElkKTsKICAgICAgICBpZiAoZWRpdG9yT3JpZ2luMikgewogICAgICAgICAgaWZyYW1lU2V0dGluZ3MuZWRpdG9yT3JpZ2luID0gbmV3IFVSTChlZGl0b3JPcmlnaW4yKS5vcmlnaW47CiAgICAgICAgfQogICAgICAgIGxvZ2dlZE91dExpc3RlbmVycy5saXN0ZW4oKCkgPT4gYXV0aFN0YXRlLmF1dGhDb21wbGV0ZS5yZXNldCgpKTsKICAgICAgICBhdXRoU3RhdGUuYnJvYWRjYXN0Q2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgb25DaGFubmVsTWVzc2FnZSk7CiAgICAgICAgYXN5bmMgZnVuY3Rpb24gb25DaGFubmVsTWVzc2FnZShldmVudCkgewogICAgICAgICAgY29uc3QgdHlwZWRFdmVudCA9IGV2ZW50LmRhdGE7CiAgICAgICAgICBpZiAodHlwZWRFdmVudC50eXBlID09PSAiYXV0aC1jb21wbGV0ZSIpIHsKICAgICAgICAgICAgYXV0aFN0YXRlLnRva2VucyA9IFRva2Vucy5mcm9tU3RvcmFnZSgpOwogICAgICAgICAgICBhd2FpdCBhdXRoU3RhdGUudG9rZW5zLmFjdGl2YXRlKG9uRmFpbGVkVG9rZW5SZWZyZXNoKTsKICAgICAgICAgICAgYXV0aFN0YXRlLmF1dGhDb21wbGV0ZS5yZXNvbHZlKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0eXBlZEV2ZW50LnR5cGUgPT09ICJhdXRoLWZhaWxlZCIpIHsKICAgICAgICAgICAgYXV0aEZhaWxlZExpc3RlbmVycy5maXJlRXZlbnQodHlwZWRFdmVudCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0eXBlZEV2ZW50LnR5cGUgPT09ICJhdXRoLWxvZ291dCIpIHsKICAgICAgICAgICAgbG9nZ2VkT3V0TGlzdGVuZXJzLmZpcmVFdmVudCgpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChhdXRoU3RhdGUudG9rZW5zKSB7CiAgICAgICAgICBjb25zdCB0b2tlbnMgPSBhdXRoU3RhdGUudG9rZW5zOwogICAgICAgICAgaWYgKHRva2Vucy5vcmlnaW4gPT09IGF1dGhTdGF0ZS5lZGl0b3JPcmlnaW4pIHsKICAgICAgICAgICAgKGFzeW5jICgpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdG9rZW5zLmFjdGl2YXRlKG9uRmFpbGVkVG9rZW5SZWZyZXNoKTsKICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgIGlmIChhdXRoU3RhdGUudG9rZW5zICE9PSB0b2tlbnMpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbG9nZ2VkT3V0TGlzdGVuZXJzLmZpcmVFdmVudCgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBhdXRoU3RhdGUuYXV0aENvbXBsZXRlLnJlc29sdmUoKTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiAiYXV0aG9yaXplZCIgfTsKICAgICAgICAgIH0KICAgICAgICAgIGNsZWFyVG9rZW5zSW5TdG9yYWdlKCk7CiAgICAgICAgICBhdXRoU3RhdGUudG9rZW5zID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgY29uc3QgbG9jYXRpb25VUkwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKICAgICAgICBjb25zdCB7IHNlYXJjaFBhcmFtcyB9ID0gbG9jYXRpb25VUkw7CiAgICAgICAgY29uc3QgdXBkYXRlVVJMID0gKCkgPT4gd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCBkb2N1bWVudC50aXRsZSwgbG9jYXRpb25VUkwpOwogICAgICAgIGlmIChzZWFyY2hQYXJhbXMuaGFzKFNFQVJDSF9QQVJBTV9FUlJPUikpIHsKICAgICAgICAgIGNvbnN0IGVycm9yID0gc2VhcmNoUGFyYW1zLmdldChTRUFSQ0hfUEFSQU1fRVJST1IpOwogICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBzZWFyY2hQYXJhbXMuZ2V0KFNFQVJDSF9QQVJBTV9FUlJPUl9ERVNDUklQVElPTik7CiAgICAgICAgICBzZWFyY2hQYXJhbXMuZGVsZXRlKFNFQVJDSF9QQVJBTV9FUlJPUik7CiAgICAgICAgICBzZWFyY2hQYXJhbXMuZGVsZXRlKFNFQVJDSF9QQVJBTV9FUlJPUl9ERVNDUklQVElPTik7CiAgICAgICAgICB1cGRhdGVVUkwoKTsKICAgICAgICAgIGJyb2FkY2FzdE1lc3NhZ2UoeyB0eXBlOiAiYXV0aC1mYWlsZWQiLCBlcnJvciwgZGVzY3JpcHRpb24gfSk7CiAgICAgICAgICByZXR1cm4geyBzdGF0dXM6ICJhdXRoLWZhaWxlZCIsIGVycm9yLCBkZXNjcmlwdGlvbiB9OwogICAgICAgIH0KICAgICAgICBpZiAoc2VhcmNoUGFyYW1zLmhhcyhTRUFSQ0hfUEFSQU1fQVVUSF9DT0RFKSkgewogICAgICAgICAgY29uc3QgYXV0aENvZGUgPSBzZWFyY2hQYXJhbXMuZ2V0KFNFQVJDSF9QQVJBTV9BVVRIX0NPREUpOwogICAgICAgICAgY29uc3QgZWRpdG9yT3JpZ2luMyA9IGF1dGhTdGF0ZS5lZGl0b3JPcmlnaW47CiAgICAgICAgICBzZWFyY2hQYXJhbXMuZGVsZXRlKFNFQVJDSF9QQVJBTV9BVVRIX0NPREUpOwogICAgICAgICAgdXBkYXRlVVJMKCk7CiAgICAgICAgICBjb25zdCBjb2RlVmVyaWZpZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0NPREVfVkVSSUZJRVJfTkFNRSk7CiAgICAgICAgICBpZiAoIWNvZGVWZXJpZmllcikgewogICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6ICJuZWVkLWF1dGgiIH07CiAgICAgICAgICB9CiAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX0NPREVfVkVSSUZJRVJfTkFNRSk7CiAgICAgICAgICBUb2tlbnMuZnJvbUF1dGhDb2RlKHsKICAgICAgICAgICAgZWRpdG9yT3JpZ2luOiBlZGl0b3JPcmlnaW4zLAogICAgICAgICAgICBjbGllbnRJZDogYXV0aFN0YXRlLmNsaWVudElkLAogICAgICAgICAgICBhdXRoQ29kZSwKICAgICAgICAgICAgY29kZVZlcmlmaWVyLAogICAgICAgICAgICByZWRpcmVjdFVyaTogZGVmYXVsdFJlZGlyZWN0VXJpKCkKICAgICAgICAgIH0pLnRoZW4oYXN5bmMgKHRva2VucykgPT4gewogICAgICAgICAgICBhdXRoU3RhdGUudG9rZW5zID0gdG9rZW5zOwogICAgICAgICAgICBhc3NlcnRBdXRoVG9rZW5zKGF1dGhTdGF0ZS50b2tlbnMpOwogICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgYXV0aFN0YXRlLnRva2Vucy5hY3RpdmF0ZShvbkZhaWxlZFRva2VuUmVmcmVzaCk7CiAgICAgICAgICAgIGlmICghc3VjY2VzcykgewogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF1dGhTdGF0ZS5hdXRoQ29tcGxldGUucmVzb2x2ZSgpOwogICAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlKHsgdHlwZTogImF1dGgtY29tcGxldGUiIH0pOwogICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAgICBsb2dnZWRPdXRMaXN0ZW5lcnMuZmlyZUV2ZW50KCk7CiAgICAgICAgICAgIGJyb2FkY2FzdE1lc3NhZ2UoeyB0eXBlOiAiYXV0aC1sb2dvdXQiIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4geyBzdGF0dXM6ICJhdXRob3JpemVkIiB9OwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBzdGF0dXM6ICJuZWVkLWF1dGgiIH07CiAgICAgIH0sCiAgICAgIGFzeW5jIHN0YXJ0QXV0aEZsb3coeyBwb3B1cCB9ID0ge30pIHsKICAgICAgICBpZiAoIWF1dGhTdGF0ZS5pbml0aWFsaXplZCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJhdXRoLmluaXQgbXVzdCBiZSBjYWxsZWQgZmlyc3QiKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBvcHVwKSB7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX1BPUFVQX05BTUUsICJ0cnVlIik7CiAgICAgICAgICBjb25zdCBoZWlnaHQgPSA1MDA7CiAgICAgICAgICBjb25zdCB3aWR0aCA9IDYyMDsKICAgICAgICAgIGNvbnN0IGxlZnQgPSB3aW5kb3cuc2NyZWVuTGVmdCArICh3aW5kb3cub3V0ZXJXaWR0aCAtIHdpZHRoKSAvIDI7CiAgICAgICAgICBjb25zdCB0b3AgPSB3aW5kb3cuc2NyZWVuVG9wICsgKHdpbmRvdy5vdXRlckhlaWdodCAtIGhlaWdodCkgLyAyOwogICAgICAgICAgd2luZG93Lm9wZW4oYXdhaXQgZ2VuZXJhdGVPQXV0aFJlcXVlc3QoKSwgIl9ibGFuayIsIGBwb3B1cCx3aWR0aD0ke3dpZHRofSxoZWlnaHQ9JHtoZWlnaHR9LGxlZnQ9JHtsZWZ0fSx0b3A9JHt0b3B9YCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYXdhaXQgZ2VuZXJhdGVPQXV0aFJlcXVlc3QoKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGFzeW5jIGxvZ291dCh7IGlnbm9yZVJldm9rZUVycm9yIH0gPSB7fSkgewogICAgICAgIGF3YWl0IGF1dGhTdGF0ZS50b2tlbnM/LnJldm9rZShhdXRoU3RhdGUuY2xpZW50SWQsIGlnbm9yZVJldm9rZUVycm9yID8/IGZhbHNlKTsKICAgICAgICBsb2dnZWRPdXRMaXN0ZW5lcnMuZmlyZUV2ZW50KCk7CiAgICAgICAgYnJvYWRjYXN0TWVzc2FnZSh7IHR5cGU6ICJhdXRoLWxvZ291dCIgfSk7CiAgICAgIH0sCiAgICAgIGxvZ2dlZEluKCkgewogICAgICAgIHJldHVybiBhdXRoU3RhdGUuYXV0aENvbXBsZXRlLnByb21pc2U7CiAgICAgIH0sCiAgICAgIG9uKGV2ZW50LCBsaXN0ZW5lcjIpIHsKICAgICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgICAgICBjYXNlICJhdXRoLWZhaWxlZCI6IHsKICAgICAgICAgICAgcmV0dXJuIGF1dGhGYWlsZWRMaXN0ZW5lcnMubGlzdGVuKGxpc3RlbmVyMik7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlICJsb2dnZWQtb3V0IjogewogICAgICAgICAgICByZXR1cm4gbG9nZ2VkT3V0TGlzdGVuZXJzLmxpc3RlbihsaXN0ZW5lcjIpOwogICAgICAgICAgfQogICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGV2ZW50IHR5cGUgJyR7ZXZlbnR9Jy5gKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC9wcmV2aWV3LW1lc3NhZ2UtdHlwZXMuanMKdmFyIFByZXZpZXdNZXNzYWdlVHlwZTsKdmFyIGluaXRfcHJldmlld19tZXNzYWdlX3R5cGVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvcHJldmlldy1tZXNzYWdlLXR5cGVzLmpzIigpIHsKICAgIChmdW5jdGlvbihQcmV2aWV3TWVzc2FnZVR5cGUyKSB7CiAgICAgIFByZXZpZXdNZXNzYWdlVHlwZTJbIlVuY2F1Z2h0RXhjZXB0aW9uIl0gPSAiUFJFVklFV19VTkNBVUdIVF9FWENFUFRJT04iOwogICAgICBQcmV2aWV3TWVzc2FnZVR5cGUyWyJVbmhhbmRsZWRSZWplY3Rpb24iXSA9ICJQUkVWSUVXX1VOSEFORExFRF9SRUpFQ1RJT04iOwogICAgICBQcmV2aWV3TWVzc2FnZVR5cGUyWyJDb25zb2xlRXJyb3IiXSA9ICJQUkVWSUVXX0NPTlNPTEVfRVJST1IiOwogICAgfSkoUHJldmlld01lc3NhZ2VUeXBlIHx8IChQcmV2aWV3TWVzc2FnZVR5cGUgPSB7fSkpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvdmVuZG9yL2luZGV4LmpzCmZ1bmN0aW9uIGV4cG9zZShvYmosIGVwID0gc2VsZikgewogIGVwLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCBmdW5jdGlvbiBjYWxsYmFjayhldikgewogICAgaWYgKCFldiB8fCAhZXYuZGF0YSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCB7IGlkLCB0eXBlOiB0eXBlNSwgcGF0aDogcGF0aDIgfSA9IE9iamVjdC5hc3NpZ24oeyBwYXRoOiBbXSB9LCBldi5kYXRhKTsKICAgIGNvbnN0IGFyZ3VtZW50TGlzdCA9IChldi5kYXRhLmFyZ3VtZW50TGlzdCB8fCBbXSkubWFwKGZyb21XaXJlVmFsdWUpOwogICAgbGV0IHJldHVyblZhbHVlOwogICAgdHJ5IHsKICAgICAgY29uc3QgcGFyZW50ID0gcGF0aDIuc2xpY2UoMCwgLTEpLnJlZHVjZSgob2JqMiwgcHJvcCkgPT4gb2JqMltwcm9wXSwgb2JqKTsKICAgICAgY29uc3QgcmF3VmFsdWUgPSBwYXRoMi5yZWR1Y2UoKG9iajIsIHByb3ApID0+IG9iajJbcHJvcF0sIG9iaik7CiAgICAgIHN3aXRjaCAodHlwZTUpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICB7CiAgICAgICAgICAgIHJldHVyblZhbHVlID0gcmF3VmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICB7CiAgICAgICAgICAgIHBhcmVudFtwYXRoMi5zbGljZSgtMSlbMF1dID0gZnJvbVdpcmVWYWx1ZShldi5kYXRhLnZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgewogICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHJhd1ZhbHVlLmFwcGx5KHBhcmVudCwgYXJndW1lbnRMaXN0KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgIHsKICAgICAgICAgICAgY29uc3QgdmFsdWUyID0gbmV3IHJhd1ZhbHVlKC4uLmFyZ3VtZW50TGlzdCk7CiAgICAgICAgICAgIHJldHVyblZhbHVlID0gcHJveHkodmFsdWUyKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgIHsKICAgICAgICAgICAgY29uc3QgeyBwb3J0MSwgcG9ydDIgfSA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpOwogICAgICAgICAgICBleHBvc2Uob2JqLCBwb3J0Mik7CiAgICAgICAgICAgIHJldHVyblZhbHVlID0gdHJhbnNmZXIocG9ydDEsIFtwb3J0MV0pOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA1OgogICAgICAgICAgewogICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9IGNhdGNoICh2YWx1ZTIpIHsKICAgICAgcmV0dXJuVmFsdWUgPSB7IHZhbHVlOiB2YWx1ZTIsIFt0aHJvd01hcmtlcl06IDAgfTsKICAgIH0KICAgIFByb21pc2UucmVzb2x2ZShyZXR1cm5WYWx1ZSkuY2F0Y2goKHZhbHVlMikgPT4gewogICAgICByZXR1cm4geyB2YWx1ZTogdmFsdWUyLCBbdGhyb3dNYXJrZXJdOiAwIH07CiAgICB9KS50aGVuKChyZXR1cm5WYWx1ZTIpID0+IHsKICAgICAgY29uc3QgW3dpcmVWYWx1ZSwgdHJhbnNmZXJhYmxlc10gPSB0b1dpcmVWYWx1ZShyZXR1cm5WYWx1ZTIpOwogICAgICBlcC5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHdpcmVWYWx1ZSksIHsgaWQgfSksIHRyYW5zZmVyYWJsZXMpOwogICAgICBpZiAodHlwZTUgPT09IDUpIHsKICAgICAgICBlcC5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgY2FsbGJhY2spOwogICAgICAgIGNsb3NlRW5kUG9pbnQoZXApOwogICAgICB9CiAgICB9KTsKICB9KTsKICBpZiAoZXAuc3RhcnQpIHsKICAgIGVwLnN0YXJ0KCk7CiAgfQp9CmZ1bmN0aW9uIGlzTWVzc2FnZVBvcnQoZW5kcG9pbnQpIHsKICByZXR1cm4gZW5kcG9pbnQuY29uc3RydWN0b3IubmFtZSA9PT0gIk1lc3NhZ2VQb3J0IjsKfQpmdW5jdGlvbiBjbG9zZUVuZFBvaW50KGVuZHBvaW50KSB7CiAgaWYgKGlzTWVzc2FnZVBvcnQoZW5kcG9pbnQpKQogICAgZW5kcG9pbnQuY2xvc2UoKTsKfQpmdW5jdGlvbiB3cmFwNChlcCwgdGFyZ2V0KSB7CiAgcmV0dXJuIGNyZWF0ZVByb3h5KGVwLCBbXSwgdGFyZ2V0KTsKfQpmdW5jdGlvbiB0aHJvd0lmUHJveHlSZWxlYXNlZChpc1JlbGVhc2VkKSB7CiAgaWYgKGlzUmVsZWFzZWQpIHsKICAgIHRocm93IG5ldyBFcnJvcigiUHJveHkgaGFzIGJlZW4gcmVsZWFzZWQgYW5kIGlzIG5vdCB1c2VhYmxlIik7CiAgfQp9CmZ1bmN0aW9uIGNyZWF0ZVByb3h5KGVwLCBwYXRoMiA9IFtdLCB0YXJnZXQgPSBmdW5jdGlvbigpIHsKfSkgewogIGxldCBpc1Byb3h5UmVsZWFzZWQgPSBmYWxzZTsKICBjb25zdCBwcm94eTIgPSBuZXcgUHJveHkodGFyZ2V0LCB7CiAgICBnZXQoX3RhcmdldCwgcHJvcCkgewogICAgICB0aHJvd0lmUHJveHlSZWxlYXNlZChpc1Byb3h5UmVsZWFzZWQpOwogICAgICBpZiAocHJvcCA9PT0gcmVsZWFzZVByb3h5KSB7CiAgICAgICAgcmV0dXJuICgpID0+IHsKICAgICAgICAgIHJldHVybiByZXF1ZXN0UmVzcG9uc2VNZXNzYWdlKGVwLCB7CiAgICAgICAgICAgIHR5cGU6IDUsCiAgICAgICAgICAgIHBhdGg6IHBhdGgyLm1hcCgocDcpID0+IHA3LnRvU3RyaW5nKCkpCiAgICAgICAgICB9KS50aGVuKCgpID0+IHsKICAgICAgICAgICAgY2xvc2VFbmRQb2ludChlcCk7CiAgICAgICAgICAgIGlzUHJveHlSZWxlYXNlZCA9IHRydWU7CiAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICB9CiAgICAgIGlmIChwcm9wID09PSAidGhlbiIpIHsKICAgICAgICBpZiAocGF0aDIubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4geyB0aGVuOiAoKSA9PiBwcm94eTIgfTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcjExID0gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCwgewogICAgICAgICAgdHlwZTogMCwKICAgICAgICAgIHBhdGg6IHBhdGgyLm1hcCgocDcpID0+IHA3LnRvU3RyaW5nKCkpCiAgICAgICAgfSkudGhlbihmcm9tV2lyZVZhbHVlKTsKICAgICAgICByZXR1cm4gcjExLnRoZW4uYmluZChyMTEpOwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVQcm94eShlcCwgWy4uLnBhdGgyLCBwcm9wXSk7CiAgICB9LAogICAgc2V0KF90YXJnZXQsIHByb3AsIHJhd1ZhbHVlKSB7CiAgICAgIHRocm93SWZQcm94eVJlbGVhc2VkKGlzUHJveHlSZWxlYXNlZCk7CiAgICAgIGNvbnN0IFt2YWx1ZTIsIHRyYW5zZmVyYWJsZXNdID0gdG9XaXJlVmFsdWUocmF3VmFsdWUpOwogICAgICByZXR1cm4gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCwgewogICAgICAgIHR5cGU6IDEsCiAgICAgICAgcGF0aDogWy4uLnBhdGgyLCBwcm9wXS5tYXAoKHA3KSA9PiBwNy50b1N0cmluZygpKSwKICAgICAgICB2YWx1ZTogdmFsdWUyCiAgICAgIH0sIHRyYW5zZmVyYWJsZXMpLnRoZW4oZnJvbVdpcmVWYWx1ZSk7CiAgICB9LAogICAgYXBwbHkoX3RhcmdldCwgX3RoaXNBcmcsIHJhd0FyZ3VtZW50TGlzdCkgewogICAgICB0aHJvd0lmUHJveHlSZWxlYXNlZChpc1Byb3h5UmVsZWFzZWQpOwogICAgICBjb25zdCBsYXN0MyA9IHBhdGgyW3BhdGgyLmxlbmd0aCAtIDFdOwogICAgICBpZiAobGFzdDMgPT09IGNyZWF0ZUVuZHBvaW50KSB7CiAgICAgICAgcmV0dXJuIHJlcXVlc3RSZXNwb25zZU1lc3NhZ2UoZXAsIHsKICAgICAgICAgIHR5cGU6IDQKICAgICAgICB9KS50aGVuKGZyb21XaXJlVmFsdWUpOwogICAgICB9CiAgICAgIGlmIChsYXN0MyA9PT0gImJpbmQiKSB7CiAgICAgICAgcmV0dXJuIGNyZWF0ZVByb3h5KGVwLCBwYXRoMi5zbGljZSgwLCAtMSkpOwogICAgICB9CiAgICAgIGNvbnN0IFthcmd1bWVudExpc3QsIHRyYW5zZmVyYWJsZXNdID0gcHJvY2Vzc0FyZ3VtZW50cyhyYXdBcmd1bWVudExpc3QpOwogICAgICByZXR1cm4gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCwgewogICAgICAgIHR5cGU6IDIsCiAgICAgICAgcGF0aDogcGF0aDIubWFwKChwNykgPT4gcDcudG9TdHJpbmcoKSksCiAgICAgICAgYXJndW1lbnRMaXN0CiAgICAgIH0sIHRyYW5zZmVyYWJsZXMpLnRoZW4oZnJvbVdpcmVWYWx1ZSk7CiAgICB9LAogICAgY29uc3RydWN0KF90YXJnZXQsIHJhd0FyZ3VtZW50TGlzdCkgewogICAgICB0aHJvd0lmUHJveHlSZWxlYXNlZChpc1Byb3h5UmVsZWFzZWQpOwogICAgICBjb25zdCBbYXJndW1lbnRMaXN0LCB0cmFuc2ZlcmFibGVzXSA9IHByb2Nlc3NBcmd1bWVudHMocmF3QXJndW1lbnRMaXN0KTsKICAgICAgcmV0dXJuIHJlcXVlc3RSZXNwb25zZU1lc3NhZ2UoZXAsIHsKICAgICAgICB0eXBlOiAzLAogICAgICAgIHBhdGg6IHBhdGgyLm1hcCgocDcpID0+IHA3LnRvU3RyaW5nKCkpLAogICAgICAgIGFyZ3VtZW50TGlzdAogICAgICB9LCB0cmFuc2ZlcmFibGVzKS50aGVuKGZyb21XaXJlVmFsdWUpOwogICAgfQogIH0pOwogIHJldHVybiBwcm94eTI7Cn0KZnVuY3Rpb24gbXlGbGF0KGFycikgewogIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBhcnIpOwp9CmZ1bmN0aW9uIHByb2Nlc3NBcmd1bWVudHMoYXJndW1lbnRMaXN0KSB7CiAgY29uc3QgcHJvY2Vzc2VkID0gYXJndW1lbnRMaXN0Lm1hcCh0b1dpcmVWYWx1ZSk7CiAgcmV0dXJuIFtwcm9jZXNzZWQubWFwKCh2NSkgPT4gdjVbMF0pLCBteUZsYXQocHJvY2Vzc2VkLm1hcCgodjUpID0+IHY1WzFdKSldOwp9CmZ1bmN0aW9uIHRyYW5zZmVyKG9iaiwgdHJhbnNmZXJzKSB7CiAgdHJhbnNmZXJDYWNoZS5zZXQob2JqLCB0cmFuc2ZlcnMpOwogIHJldHVybiBvYmo7Cn0KZnVuY3Rpb24gcHJveHkob2JqKSB7CiAgcmV0dXJuIE9iamVjdC5hc3NpZ24ob2JqLCB7IFtwcm94eU1hcmtlcl06IHRydWUgfSk7Cn0KZnVuY3Rpb24gd2luZG93RW5kcG9pbnQodzMsIGNvbnRleHQyID0gc2VsZiwgdGFyZ2V0T3JpZ2luID0gIioiKSB7CiAgcmV0dXJuIHsKICAgIHBvc3RNZXNzYWdlOiAobXNnLCB0cmFuc2ZlcmFibGVzKSA9PiB3My5wb3N0TWVzc2FnZShtc2csIHRhcmdldE9yaWdpbiwgdHJhbnNmZXJhYmxlcyksCiAgICBhZGRFdmVudExpc3RlbmVyOiBjb250ZXh0Mi5hZGRFdmVudExpc3RlbmVyLmJpbmQoY29udGV4dDIpLAogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogY29udGV4dDIucmVtb3ZlRXZlbnRMaXN0ZW5lci5iaW5kKGNvbnRleHQyKQogIH07Cn0KZnVuY3Rpb24gdG9XaXJlVmFsdWUodmFsdWUyKSB7CiAgZm9yIChjb25zdCBbbmFtZSwgaGFuZGxlcjJdIG9mIHRyYW5zZmVySGFuZGxlcnMpIHsKICAgIGlmIChoYW5kbGVyMi5jYW5IYW5kbGUodmFsdWUyKSkgewogICAgICBjb25zdCBbc2VyaWFsaXplZFZhbHVlLCB0cmFuc2ZlcmFibGVzXSA9IGhhbmRsZXIyLnNlcmlhbGl6ZSh2YWx1ZTIpOwogICAgICByZXR1cm4gWwogICAgICAgIHsKICAgICAgICAgIHR5cGU6IDMsCiAgICAgICAgICBuYW1lLAogICAgICAgICAgdmFsdWU6IHNlcmlhbGl6ZWRWYWx1ZQogICAgICAgIH0sCiAgICAgICAgdHJhbnNmZXJhYmxlcwogICAgICBdOwogICAgfQogIH0KICByZXR1cm4gWwogICAgewogICAgICB0eXBlOiAwLAogICAgICB2YWx1ZTogdmFsdWUyCiAgICB9LAogICAgdHJhbnNmZXJDYWNoZS5nZXQodmFsdWUyKSB8fCBbXQogIF07Cn0KZnVuY3Rpb24gZnJvbVdpcmVWYWx1ZSh2YWx1ZTIpIHsKICBzd2l0Y2ggKHZhbHVlMi50eXBlKSB7CiAgICBjYXNlIDM6CiAgICAgIHJldHVybiB0cmFuc2ZlckhhbmRsZXJzLmdldCh2YWx1ZTIubmFtZSkuZGVzZXJpYWxpemUodmFsdWUyLnZhbHVlKTsKICAgIGNhc2UgMDoKICAgICAgcmV0dXJuIHZhbHVlMi52YWx1ZTsKICB9Cn0KZnVuY3Rpb24gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCwgbXNnLCB0cmFuc2ZlcnMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiB7CiAgICBjb25zdCBpZCA9IGdlbmVyYXRlVVVJRCgpOwogICAgZXAuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIGZ1bmN0aW9uIGw2KGV2KSB7CiAgICAgIGlmICghZXYuZGF0YSB8fCAhZXYuZGF0YS5pZCB8fCBldi5kYXRhLmlkICE9PSBpZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlcC5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgbDYpOwogICAgICByZXNvbHZlMihldi5kYXRhKTsKICAgIH0pOwogICAgaWYgKGVwLnN0YXJ0KSB7CiAgICAgIGVwLnN0YXJ0KCk7CiAgICB9CiAgICBlcC5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKHsgaWQgfSwgbXNnKSwgdHJhbnNmZXJzKTsKICB9KTsKfQpmdW5jdGlvbiBnZW5lcmF0ZVVVSUQoKSB7CiAgcmV0dXJuIG5ldyBBcnJheSg0KS5maWxsKDApLm1hcCgoKSA9PiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikudG9TdHJpbmcoMTYpKS5qb2luKCItIik7Cn0KdmFyIF9fZGVmUHJvcDIsIF9fZXhwb3J0MiwgY29tbGlua19leHBvcnRzLCBwcm94eU1hcmtlciwgY3JlYXRlRW5kcG9pbnQsIHJlbGVhc2VQcm94eSwgdGhyb3dNYXJrZXIsIGlzT2JqZWN0MiwgcHJveHlUcmFuc2ZlckhhbmRsZXIsIHRocm93VHJhbnNmZXJIYW5kbGVyLCB0cmFuc2ZlckhhbmRsZXJzLCB0cmFuc2ZlckNhY2hlOwp2YXIgaW5pdF92ZW5kb3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC92ZW5kb3IvaW5kZXguanMiKCkgewogICAgX19kZWZQcm9wMiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKICAgIF9fZXhwb3J0MiA9ICh0YXJnZXQsIGFsbDMpID0+IHsKICAgICAgZm9yICh2YXIgbmFtZSBpbiBhbGwzKQogICAgICAgIF9fZGVmUHJvcDIodGFyZ2V0LCBuYW1lLCB7IGdldDogYWxsM1tuYW1lXSwgZW51bWVyYWJsZTogdHJ1ZSB9KTsKICAgIH07CiAgICBjb21saW5rX2V4cG9ydHMgPSB7fTsKICAgIF9fZXhwb3J0Mihjb21saW5rX2V4cG9ydHMsIHsKICAgICAgY3JlYXRlRW5kcG9pbnQ6ICgpID0+IGNyZWF0ZUVuZHBvaW50LAogICAgICBleHBvc2U6ICgpID0+IGV4cG9zZSwKICAgICAgcHJveHk6ICgpID0+IHByb3h5LAogICAgICBwcm94eU1hcmtlcjogKCkgPT4gcHJveHlNYXJrZXIsCiAgICAgIHJlbGVhc2VQcm94eTogKCkgPT4gcmVsZWFzZVByb3h5LAogICAgICB0cmFuc2ZlcjogKCkgPT4gdHJhbnNmZXIsCiAgICAgIHRyYW5zZmVySGFuZGxlcnM6ICgpID0+IHRyYW5zZmVySGFuZGxlcnMsCiAgICAgIHdpbmRvd0VuZHBvaW50OiAoKSA9PiB3aW5kb3dFbmRwb2ludCwKICAgICAgd3JhcDogKCkgPT4gd3JhcDQKICAgIH0pOwogICAgcHJveHlNYXJrZXIgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKCJDb21saW5rLnByb3h5Iik7CiAgICBjcmVhdGVFbmRwb2ludCA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woIkNvbWxpbmsuZW5kcG9pbnQiKTsKICAgIHJlbGVhc2VQcm94eSA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woIkNvbWxpbmsucmVsZWFzZVByb3h5Iik7CiAgICB0aHJvd01hcmtlciA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woIkNvbWxpbmsudGhyb3duIik7CiAgICBpc09iamVjdDIgPSAodmFsKSA9PiB0eXBlb2YgdmFsID09PSAib2JqZWN0IiAmJiB2YWwgIT09IG51bGwgfHwgdHlwZW9mIHZhbCA9PT0gImZ1bmN0aW9uIjsKICAgIHByb3h5VHJhbnNmZXJIYW5kbGVyID0gewogICAgICBjYW5IYW5kbGU6ICh2YWwpID0+IGlzT2JqZWN0Mih2YWwpICYmIHZhbFtwcm94eU1hcmtlcl0sCiAgICAgIHNlcmlhbGl6ZShvYmopIHsKICAgICAgICBjb25zdCB7IHBvcnQxLCBwb3J0MiB9ID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7CiAgICAgICAgZXhwb3NlKG9iaiwgcG9ydDEpOwogICAgICAgIHJldHVybiBbcG9ydDIsIFtwb3J0Ml1dOwogICAgICB9LAogICAgICBkZXNlcmlhbGl6ZShwb3J0KSB7CiAgICAgICAgcG9ydC5zdGFydCgpOwogICAgICAgIHJldHVybiB3cmFwNChwb3J0KTsKICAgICAgfQogICAgfTsKICAgIHRocm93VHJhbnNmZXJIYW5kbGVyID0gewogICAgICBjYW5IYW5kbGU6ICh2YWx1ZTIpID0+IGlzT2JqZWN0Mih2YWx1ZTIpICYmIHRocm93TWFya2VyIGluIHZhbHVlMiwKICAgICAgc2VyaWFsaXplKHsgdmFsdWU6IHZhbHVlMiB9KSB7CiAgICAgICAgbGV0IHNlcmlhbGl6ZWQ7CiAgICAgICAgaWYgKHZhbHVlMiBpbnN0YW5jZW9mIEVycm9yKSB7CiAgICAgICAgICBzZXJpYWxpemVkID0gewogICAgICAgICAgICBpc0Vycm9yOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogewogICAgICAgICAgICAgIG1lc3NhZ2U6IHZhbHVlMi5tZXNzYWdlLAogICAgICAgICAgICAgIG5hbWU6IHZhbHVlMi5uYW1lLAogICAgICAgICAgICAgIHN0YWNrOiB2YWx1ZTIuc3RhY2sKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2VyaWFsaXplZCA9IHsgaXNFcnJvcjogZmFsc2UsIHZhbHVlOiB2YWx1ZTIgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtzZXJpYWxpemVkLCBbXV07CiAgICAgIH0sCiAgICAgIGRlc2VyaWFsaXplKHNlcmlhbGl6ZWQpIHsKICAgICAgICBpZiAoc2VyaWFsaXplZC5pc0Vycm9yKSB7CiAgICAgICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihzZXJpYWxpemVkLnZhbHVlLm1lc3NhZ2UpLCBzZXJpYWxpemVkLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgc2VyaWFsaXplZC52YWx1ZTsKICAgICAgfQogICAgfTsKICAgIHRyYW5zZmVySGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcChbCiAgICAgIFsicHJveHkiLCBwcm94eVRyYW5zZmVySGFuZGxlcl0sCiAgICAgIFsidGhyb3ciLCB0aHJvd1RyYW5zZmVySGFuZGxlcl0KICAgIF0pOwogICAgdHJhbnNmZXJDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvdXRpbHMvcmVsb2FkLXByZXZpZXcuanMKdmFyIGluaXRfcmVsb2FkX3ByZXZpZXcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC91dGlscy9yZWxvYWQtcHJldmlldy5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC91dGlscy9pcy1wcmV2aWV3LW1lc3NhZ2UuanMKZnVuY3Rpb24gaXNQcmV2aWV3TWVzc2FnZShkYXRhKSB7CiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gIm9iamVjdCIpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgaWYgKCEoInR5cGUiIGluIGRhdGEpIHx8ICFQUkVWSUVXX01FU1NBR0VfVFlQRVMuaW5jbHVkZXMoZGF0YS50eXBlKSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gdHJ1ZTsKfQp2YXIgUFJFVklFV19NRVNTQUdFX1RZUEVTOwp2YXIgaW5pdF9pc19wcmV2aWV3X21lc3NhZ2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC91dGlscy9pcy1wcmV2aWV3LW1lc3NhZ2UuanMiKCkgewogICAgaW5pdF9wcmV2aWV3X21lc3NhZ2VfdHlwZXMoKTsKICAgIFBSRVZJRVdfTUVTU0FHRV9UWVBFUyA9IFsKICAgICAgUHJldmlld01lc3NhZ2VUeXBlLkNvbnNvbGVFcnJvciwKICAgICAgUHJldmlld01lc3NhZ2VUeXBlLlVuY2F1Z2h0RXhjZXB0aW9uLAogICAgICBQcmV2aWV3TWVzc2FnZVR5cGUuVW5oYW5kbGVkUmVqZWN0aW9uCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvdXRpbHMuanMKdmFyIGluaXRfdXRpbHMyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvdXRpbHMuanMiKCkgewogICAgaW5pdF9yZWxvYWRfcHJldmlldygpOwogICAgaW5pdF9wcmV2aWV3X21lc3NhZ2VfdHlwZXMoKTsKICAgIGluaXRfaXNfcHJldmlld19tZXNzYWdlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC91dGlscy9udWxsLXByb3RvdHlwZS5qcwpmdW5jdGlvbiBudWxsUHJvdG90eXBlKHNvdXJjZSkgewogIGNvbnN0IHByb3RvdHlwZSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpOwogIGlmICghc291cmNlKSB7CiAgICByZXR1cm4gcHJvdG90eXBlOwogIH0KICByZXR1cm4gT2JqZWN0LmFzc2lnbihwcm90b3R5cGUsIHNvdXJjZSk7Cn0KdmFyIGluaXRfbnVsbF9wcm90b3R5cGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC91dGlscy9udWxsLXByb3RvdHlwZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC91dGlscy9maWxlLXN5c3RlbS5qcwpmdW5jdGlvbiB0b0ludGVybmFsRmlsZVN5c3RlbVRyZWUodHJlZSkgewogIGNvbnN0IG5ld1RyZWUgPSB7IGQ6IHt9IH07CiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHRyZWUpKSB7CiAgICBjb25zdCBlbnRyeSA9IHRyZWVbbmFtZV07CiAgICBpZiAoImZpbGUiIGluIGVudHJ5KSB7CiAgICAgIGlmICgic3ltbGluayIgaW4gZW50cnkuZmlsZSkgewogICAgICAgIG5ld1RyZWUuZFtuYW1lXSA9IHsgZjogeyBsOiBlbnRyeS5maWxlLnN5bWxpbmsgfSB9OwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGNvbnRlbnRzID0gZW50cnkuZmlsZS5jb250ZW50czsKICAgICAgY29uc3Qgc3RyaW5nQ29udGVudHMgPSB0eXBlb2YgY29udGVudHMgPT09ICJzdHJpbmciID8gY29udGVudHMgOiBiaW5hcnlEZWNvZGVyLmRlY29kZShjb250ZW50cyk7CiAgICAgIGNvbnN0IGJpbmFyeSA9IHR5cGVvZiBjb250ZW50cyA9PT0gInN0cmluZyIgPyB7fSA6IHsgYjogdHJ1ZSB9OwogICAgICBuZXdUcmVlLmRbbmFtZV0gPSB7IGY6IHsgYzogc3RyaW5nQ29udGVudHMsIC4uLmJpbmFyeSB9IH07CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3QgbmV3RW50cnkgPSB0b0ludGVybmFsRmlsZVN5c3RlbVRyZWUoZW50cnkuZGlyZWN0b3J5KTsKICAgIG5ld1RyZWUuZFtuYW1lXSA9IG5ld0VudHJ5OwogIH0KICByZXR1cm4gbmV3VHJlZTsKfQpmdW5jdGlvbiB0b0V4dGVybmFsRmlsZVN5c3RlbVRyZWUodHJlZSkgewogIGNvbnN0IG5ld1RyZWUgPSBudWxsUHJvdG90eXBlKCk7CiAgaWYgKCJmIiBpbiB0cmVlKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkl0IGlzIG5vdCBwb3NzaWJsZSB0byBleHBvcnQgYSBzaW5nbGUgZmlsZSBpbiB0aGUgSlNPTiBmb3JtYXQuIik7CiAgfQogIGlmICgiZCIgaW4gdHJlZSkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHRyZWUuZCkpIHsKICAgICAgY29uc3QgZW50cnkgPSB0cmVlLmRbbmFtZV07CiAgICAgIGlmICgiZCIgaW4gZW50cnkpIHsKICAgICAgICBuZXdUcmVlW25hbWVdID0gbnVsbFByb3RvdHlwZSh7CiAgICAgICAgICBkaXJlY3Rvcnk6IHRvRXh0ZXJuYWxGaWxlU3lzdGVtVHJlZShlbnRyeSkKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmICgiZiIgaW4gZW50cnkpIHsKICAgICAgICBpZiAoImMiIGluIGVudHJ5LmYpIHsKICAgICAgICAgIG5ld1RyZWVbbmFtZV0gPSBudWxsUHJvdG90eXBlKHsKICAgICAgICAgICAgZmlsZTogbnVsbFByb3RvdHlwZSh7CiAgICAgICAgICAgICAgY29udGVudHM6IGVudHJ5LmYuYiA/IGZyb21CaW5hcnlTdHJpbmcoZW50cnkuZi5jKSA6IGVudHJ5LmYuYwogICAgICAgICAgICB9KQogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIGlmICgibCIgaW4gZW50cnkuZikgewogICAgICAgICAgbmV3VHJlZVtuYW1lXSA9IG51bGxQcm90b3R5cGUoewogICAgICAgICAgICBmaWxlOiBudWxsUHJvdG90eXBlKHsKICAgICAgICAgICAgICBzeW1saW5rOiBlbnRyeS5mLmwKICAgICAgICAgICAgfSkKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICByZXR1cm4gbmV3VHJlZTsKfQpmdW5jdGlvbiBmcm9tQmluYXJ5U3RyaW5nKHM5KSB7CiAgY29uc3QgZW5jb2RlZCA9IG5ldyBVaW50OEFycmF5KHM5Lmxlbmd0aCk7CiAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgczkubGVuZ3RoOyBpMTErKykgewogICAgZW5jb2RlZFtpMTFdID0gczlbaTExXS5jaGFyQ29kZUF0KDApOwogIH0KICByZXR1cm4gZW5jb2RlZDsKfQp2YXIgYmluYXJ5RGVjb2RlcjsKdmFyIGluaXRfZmlsZV9zeXN0ZW0gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC91dGlscy9maWxlLXN5c3RlbS5qcyIoKSB7CiAgICBpbml0X251bGxfcHJvdG90eXBlKCk7CiAgICBiaW5hcnlEZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCJsYXRpbjEiKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wZml4K3dlYmNvbnRhaW5lcl9fYXBpQDEuNi4xL25vZGVfbW9kdWxlcy9AdGVtcGZpeC93ZWJjb250YWluZXJfX2FwaS9kaXN0L2luZGV4LmpzCmZ1bmN0aW9uIGNvbmZpZ3VyZUFQSUtleShrZXkyKSB7CiAgaWYgKGF1dGhTdGF0ZS5ib290Q2FsbGVkKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoImBjb25maWd1cmVBUElLZXlgIHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIGJlZm9yZSBgV2ViQ29udGFpbmVyLmJvb3RgIik7CiAgfQogIGlmcmFtZVNldHRpbmdzLnNldFF1ZXJ5UGFyYW0oImNsaWVudF9pZCIsIGtleTIpOwp9CmFzeW5jIGZ1bmN0aW9uIHVuc3luY2hyb25pemVkQm9vdChvcHRpb25zKSB7CiAgY29uc3QgeyBzZXJ2ZXJQcm9taXNlIH0gPSBzZXJ2ZXJGYWN0b3J5KG9wdGlvbnMpOwogIGNvbnN0IHNlcnZlciA9IGF3YWl0IHNlcnZlclByb21pc2U7CiAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBzZXJ2ZXIuYnVpbGQoewogICAgaG9zdDogd2luZG93LmxvY2F0aW9uLmhvc3QsCiAgICB2ZXJzaW9uOiAiMS42LjEiLAogICAgd29ya2Rpck5hbWU6IG9wdGlvbnMud29ya2Rpck5hbWUsCiAgICBmb3J3YXJkUHJldmlld0Vycm9yczogb3B0aW9ucy5mb3J3YXJkUHJldmlld0Vycm9ycwogIH0pOwogIGNvbnN0IFtmcywgcHJldmlld1NjcmlwdCwgcnVudGltZUluZm9dID0gYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgaW5zdGFuY2UuZnMoKSwKICAgIGluc3RhbmNlLnByZXZpZXdTY3JpcHQoKSwKICAgIGluc3RhbmNlLnJ1bnRpbWVJbmZvKCkKICBdKTsKICByZXR1cm4gbmV3IFdlYkNvbnRhaW5lcihpbnN0YW5jZSwgZnMsIHByZXZpZXdTY3JpcHQsIHJ1bnRpbWVJbmZvKTsKfQpmdW5jdGlvbiBiaW5hcnlMaXN0ZW5lcihsaXN0ZW5lcjIpIHsKICBpZiAobGlzdGVuZXIyID09IG51bGwpIHsKICAgIHJldHVybiB2b2lkIDA7CiAgfQogIHJldHVybiAoZGF0YSkgPT4gewogICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7CiAgICAgIGxpc3RlbmVyMihkZWNvZGVyLmRlY29kZShkYXRhKSk7CiAgICB9IGVsc2UgaWYgKGRhdGEgPT0gbnVsbCkgewogICAgICBsaXN0ZW5lcjIobnVsbCk7CiAgICB9CiAgfTsKfQpmdW5jdGlvbiBwcm94eUxpc3RlbmVyKGxpc3RlbmVyMikgewogIGlmIChsaXN0ZW5lcjIgPT0gbnVsbCkgewogICAgcmV0dXJuIHZvaWQgMDsKICB9CiAgcmV0dXJuIGNvbWxpbmtfZXhwb3J0cy5wcm94eShsaXN0ZW5lcjIpOwp9CmZ1bmN0aW9uIHNlcnZlckZhY3Rvcnkob3B0aW9ucykgewogIGlmIChjYWNoZWRTZXJ2ZXJQcm9taXNlICE9IG51bGwpIHsKICAgIGlmIChvcHRpb25zLmNvZXAgIT09IGNhY2hlZEJvb3RPcHRpb25zLmNvZXApIHsKICAgICAgY29uc29sZS53YXJuKGBBdHRlbXB0aW5nIHRvIGJvb3QgV2ViQ29udGFpbmVyIHdpdGggJ2NvZXA6ICR7b3B0aW9ucy5jb2VwfSdgKTsKICAgICAgY29uc29sZS53YXJuKGBGaXJzdCBib290IGhhZCAnY29lcDogJHtjYWNoZWRCb290T3B0aW9ucy5jb2VwfScsIG5ldyBzZXR0aW5ncyB3aWxsIG5vdCB0YWtlIGVmZmVjdCFgKTsKICAgIH0KICAgIHJldHVybiB7IHNlcnZlclByb21pc2U6IGNhY2hlZFNlcnZlclByb21pc2UgfTsKICB9CiAgaWYgKG9wdGlvbnMuY29lcCkgewogICAgaWZyYW1lU2V0dGluZ3Muc2V0UXVlcnlQYXJhbSgiY29lcCIsIG9wdGlvbnMuY29lcCk7CiAgfQogIGlmIChvcHRpb25zLmV4cGVyaW1lbnRhbE5vZGUpIHsKICAgIGlmcmFtZVNldHRpbmdzLnNldFF1ZXJ5UGFyYW0oImV4cGVyaW1lbnRhbF9ub2RlIiwgIjEiKTsKICB9CiAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7CiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgaWZyYW1lLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCAiY3Jvc3Mtb3JpZ2luLWlzb2xhdGVkIik7CiAgY29uc3QgdXJsID0gaWZyYW1lU2V0dGluZ3MudXJsOwogIGlmcmFtZS5zcmMgPSB1cmwudG9TdHJpbmcoKTsKICBjb25zdCB7IG9yaWdpbiB9ID0gdXJsOwogIGNhY2hlZEJvb3RPcHRpb25zID0geyAuLi5vcHRpb25zIH07CiAgY2FjaGVkU2VydmVyUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlMikgPT4gewogICAgY29uc3Qgb25NZXNzYWdlNSA9IChldmVudCkgPT4gewogICAgICBpZiAoZXZlbnQub3JpZ2luICE9PSBvcmlnaW4pIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgeyBkYXRhIH0gPSBldmVudDsKICAgICAgaWYgKGRhdGEudHlwZSA9PT0gImluaXQiKSB7CiAgICAgICAgcmVzb2x2ZTIoY29tbGlua19leHBvcnRzLndyYXAoZXZlbnQucG9ydHNbMF0pKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGRhdGEudHlwZSA9PT0gIndhcm5pbmciKSB7CiAgICAgICAgY29uc29sZVtkYXRhLmxldmVsXS5jYWxsKGNvbnNvbGUsIGRhdGEubWVzc2FnZSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9OwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCBvbk1lc3NhZ2U1KTsKICB9KTsKICBkb2N1bWVudC5ib2R5Lmluc2VydEJlZm9yZShpZnJhbWUsIG51bGwpOwogIHJldHVybiB7IHNlcnZlclByb21pc2U6IGNhY2hlZFNlcnZlclByb21pc2UgfTsKfQpmdW5jdGlvbiBpc1N0cmluZ0FycmF5KGxpc3Q1KSB7CiAgcmV0dXJuIHR5cGVvZiBsaXN0NVswXSA9PT0gInN0cmluZyI7Cn0KZnVuY3Rpb24gaXNUeXBlZEFycmF5Q29sbGVjdGlvbihsaXN0NSkgewogIHJldHVybiBsaXN0NVswXSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk7Cn0KZnVuY3Rpb24gc3RyZWFtV2l0aFB1c2goKSB7CiAgbGV0IGNvbnRyb2xsZXIgPSBudWxsOwogIGNvbnN0IHN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7CiAgICBzdGFydChjb250cm9sbGVyXykgewogICAgICBjb250cm9sbGVyID0gY29udHJvbGxlcl87CiAgICB9CiAgfSk7CiAgY29uc3QgcHVzaDIgPSAoaXRlbSkgPT4gewogICAgaWYgKGl0ZW0gIT0gbnVsbCkgewogICAgICBjb250cm9sbGVyPy5lbnF1ZXVlKGl0ZW0pOwogICAgfSBlbHNlIHsKICAgICAgY29udHJvbGxlcj8uY2xvc2UoKTsKICAgICAgY29udHJvbGxlciA9IG51bGw7CiAgICB9CiAgfTsKICByZXR1cm4geyBzdHJlYW0sIHB1c2g6IHB1c2gyIH07Cn0KZnVuY3Rpb24gc3luY1N1YnNjcmlwdGlvbihsaXN0ZW5lcjIpIHsKICBsZXQgc3RvcHBlZCA9IGZhbHNlOwogIGxldCB1bnN1YnNjcmliZSA9ICgpID0+IHsKICB9OwogIGNvbnN0IHdyYXBwZWQgPSAoKC4uLmFyZ3MpID0+IHsKICAgIGlmIChzdG9wcGVkKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxpc3RlbmVyMiguLi5hcmdzKTsKICB9KTsKICByZXR1cm4gewogICAgc3Vic2NyaWJlKHByb21pc2UpIHsKICAgICAgcHJvbWlzZS50aGVuKCh1bnN1YnNjcmliZV8pID0+IHsKICAgICAgICB1bnN1YnNjcmliZSA9IHVuc3Vic2NyaWJlXzsKICAgICAgICBpZiAoc3RvcHBlZCkgewogICAgICAgICAgdW5zdWJzY3JpYmUoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gKCkgPT4gewogICAgICAgIHN0b3BwZWQgPSB0cnVlOwogICAgICAgIHVuc3Vic2NyaWJlKCk7CiAgICAgIH07CiAgICB9LAogICAgbGlzdGVuZXI6IHdyYXBwZWQKICB9Owp9CnZhciBhdXRoMiwgYm9vdFByb21pc2UsIGNhY2hlZFNlcnZlclByb21pc2UsIGNhY2hlZEJvb3RPcHRpb25zLCBkZWNvZGVyLCBlbmNvZGVyLCBXZWJDb250YWluZXIsIERJUl9FTlRSWV9UWVBFX0ZJTEUsIERJUl9FTlRSWV9UWVBFX0RJUiwgRGlyRW50SW1wbCwgRlNXYXRjaGVyLCBXZWJDb250YWluZXJQcm9jZXNzSW1wbCwgRmlsZVN5c3RlbUFQSUNsaWVudDsKdmFyIGluaXRfZGlzdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wZml4K3dlYmNvbnRhaW5lcl9fYXBpQDEuNi4xL25vZGVfbW9kdWxlcy9AdGVtcGZpeC93ZWJjb250YWluZXJfX2FwaS9kaXN0L2luZGV4LmpzIigpIHsKICAgIGluaXRfYXV0aF9zdGF0ZSgpOwogICAgaW5pdF9wcmV2aWV3X21lc3NhZ2VfdHlwZXMoKTsKICAgIGluaXRfdmVuZG9yKCk7CiAgICBpbml0X2F1dGhfc3RhdGUoKTsKICAgIGluaXRfdG9rZW5zKCk7CiAgICBpbml0X2lmcmFtZV91cmwoKTsKICAgIGluaXRfdXRpbHMyKCk7CiAgICBpbml0X2ZpbGVfc3lzdGVtKCk7CiAgICBpbml0X3V0aWxzMigpOwogICAgYXV0aDIgPSBhdXRoOwogICAgYm9vdFByb21pc2UgPSBudWxsOwogICAgY2FjaGVkU2VydmVyUHJvbWlzZSA9IG51bGw7CiAgICBjYWNoZWRCb290T3B0aW9ucyA9IHt9OwogICAgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpOwogICAgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpOwogICAgV2ViQ29udGFpbmVyID0gY2xhc3MgX1dlYkNvbnRhaW5lciB7CiAgICAgIF9pbnN0YW5jZTsKICAgICAgX3J1bnRpbWVJbmZvOwogICAgICAvKioKICAgICAgICogR2l2ZXMgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGZpbGUgc3lzdGVtLgogICAgICAgKi8KICAgICAgZnM7CiAgICAgIC8qKiBAaW50ZXJuYWwgKi8KICAgICAgc3RhdGljIF9pbnN0YW5jZSA9IG51bGw7CiAgICAgIC8qKiBAaW50ZXJuYWwgKi8KICAgICAgc3RhdGljIF90ZWFyZG93blByb21pc2UgPSBudWxsOwogICAgICBfdG9ybkRvd24gPSBmYWxzZTsKICAgICAgX3Vuc3Vic2NyaWJlRnJvbVRva2VuQ2hhbmdlZExpc3RlbmVyID0gKCkgPT4gewogICAgICB9OwogICAgICAvKiogQGludGVybmFsICovCiAgICAgIGNvbnN0cnVjdG9yKF9pbnN0YW5jZSwgZnMsIHByZXZpZXdTY3JpcHQsIF9ydW50aW1lSW5mbykgewogICAgICAgIHRoaXMuX2luc3RhbmNlID0gX2luc3RhbmNlOwogICAgICAgIHRoaXMuX3J1bnRpbWVJbmZvID0gX3J1bnRpbWVJbmZvOwogICAgICAgIHRoaXMuZnMgPSBuZXcgRmlsZVN5c3RlbUFQSUNsaWVudChmcyk7CiAgICAgICAgaWYgKGF1dGhTdGF0ZS5pbml0aWFsaXplZCkgewogICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVGcm9tVG9rZW5DaGFuZ2VkTGlzdGVuZXIgPSBhZGRBY2Nlc3NUb2tlbkNoYW5nZWRMaXN0ZW5lcigoYWNjZXNzVG9rZW4pID0+IHsKICAgICAgICAgICAgdGhpcy5faW5zdGFuY2Uuc2V0Q3JlZGVudGlhbHMoeyBhY2Nlc3NUb2tlbiwgZWRpdG9yT3JpZ2luOiBhdXRoU3RhdGUuZWRpdG9yT3JpZ2luIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgICAoYXN5bmMgKCkgPT4gewogICAgICAgICAgICBhd2FpdCBhdXRoU3RhdGUuYXV0aENvbXBsZXRlLnByb21pc2U7CiAgICAgICAgICAgIGlmICh0aGlzLl90b3JuRG93bikgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBhc3NlcnRBdXRoVG9rZW5zKGF1dGhTdGF0ZS50b2tlbnMpOwogICAgICAgICAgICBhd2FpdCB0aGlzLl9pbnN0YW5jZS5zZXRDcmVkZW50aWFscyh7CiAgICAgICAgICAgICAgYWNjZXNzVG9rZW46IGF1dGhTdGF0ZS50b2tlbnMuYWNjZXNzLAogICAgICAgICAgICAgIGVkaXRvck9yaWdpbjogYXV0aFN0YXRlLmVkaXRvck9yaWdpbgogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pKCkuY2F0Y2goKGVycm9yKSA9PiB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIHNwYXduKGNvbW1hbmQsIG9wdGlvbnNPckFyZ3MsIG9wdGlvbnMpIHsKICAgICAgICBsZXQgYXJncyA9IFtdOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnNPckFyZ3MpKSB7CiAgICAgICAgICBhcmdzID0gb3B0aW9uc09yQXJnczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFyZ3M7CiAgICAgICAgfQogICAgICAgIGxldCBvdXRwdXQgPSB2b2lkIDA7CiAgICAgICAgbGV0IG91dHB1dFN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSgpOwogICAgICAgIGlmIChvcHRpb25zPy5vdXRwdXQgIT09IGZhbHNlKSB7CiAgICAgICAgICBjb25zdCByZXN1bHQgPSBzdHJlYW1XaXRoUHVzaCgpOwogICAgICAgICAgb3V0cHV0ID0gcmVzdWx0LnB1c2g7CiAgICAgICAgICBvdXRwdXRTdHJlYW0gPSByZXN1bHQuc3RyZWFtOwogICAgICAgIH0KICAgICAgICBsZXQgc3Rkb3V0ID0gdm9pZCAwOwogICAgICAgIGxldCBzdGRvdXRTdHJlYW07CiAgICAgICAgbGV0IHN0ZGVyciA9IHZvaWQgMDsKICAgICAgICBsZXQgc3RkZXJyU3RyZWFtOwogICAgICAgIGNvbnN0IHdyYXBwZWRPdXRwdXQgPSBwcm94eUxpc3RlbmVyKGJpbmFyeUxpc3RlbmVyKG91dHB1dCkpOwogICAgICAgIGNvbnN0IHdyYXBwZWRTdGRvdXQgPSBwcm94eUxpc3RlbmVyKGJpbmFyeUxpc3RlbmVyKHN0ZG91dCkpOwogICAgICAgIGNvbnN0IHdyYXBwZWRTdGRlcnIgPSBwcm94eUxpc3RlbmVyKGJpbmFyeUxpc3RlbmVyKHN0ZGVycikpOwogICAgICAgIGNvbnN0IHByb2Nlc3M0ID0gYXdhaXQgdGhpcy5faW5zdGFuY2UucnVuKHsKICAgICAgICAgIGNvbW1hbmQsCiAgICAgICAgICBhcmdzLAogICAgICAgICAgY3dkOiBvcHRpb25zPy5jd2QsCiAgICAgICAgICBlbnY6IG9wdGlvbnM/LmVudiwKICAgICAgICAgIHRlcm1pbmFsOiBvcHRpb25zPy50ZXJtaW5hbAogICAgICAgIH0sIHdyYXBwZWRTdGRvdXQsIHdyYXBwZWRTdGRlcnIsIHdyYXBwZWRPdXRwdXQpOwogICAgICAgIHJldHVybiBuZXcgV2ViQ29udGFpbmVyUHJvY2Vzc0ltcGwocHJvY2VzczQsIG91dHB1dFN0cmVhbSwgc3Rkb3V0U3RyZWFtLCBzdGRlcnJTdHJlYW0pOwogICAgICB9CiAgICAgIGFzeW5jIGV4cG9ydChwYXRoMiwgb3B0aW9ucykgewogICAgICAgIGNvbnN0IHNlcmlhbGl6ZU9wdGlvbnMgPSB7CiAgICAgICAgICBmb3JtYXQ6IG9wdGlvbnM/LmZvcm1hdCA/PyAianNvbiIsCiAgICAgICAgICBpbmNsdWRlczogb3B0aW9ucz8uaW5jbHVkZXMsCiAgICAgICAgICBleGNsdWRlczogb3B0aW9ucz8uZXhjbHVkZXMsCiAgICAgICAgICBleHRlcm5hbDogdHJ1ZQogICAgICAgIH07CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5faW5zdGFuY2Uuc2VyaWFsaXplKHBhdGgyLCBzZXJpYWxpemVPcHRpb25zKTsKICAgICAgICBpZiAoc2VyaWFsaXplT3B0aW9ucy5mb3JtYXQgPT09ICJqc29uIikgewogICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZGVjb2Rlci5kZWNvZGUocmVzdWx0KSk7CiAgICAgICAgICByZXR1cm4gdG9FeHRlcm5hbEZpbGVTeXN0ZW1UcmVlKGRhdGEpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIG9uKGV2ZW50LCBsaXN0ZW5lcjIpIHsKICAgICAgICBpZiAoZXZlbnQgPT09ICJwcmV2aWV3LW1lc3NhZ2UiKSB7CiAgICAgICAgICBjb25zdCBvcmlnaW5hbExpc3RlbmVyID0gbGlzdGVuZXIyOwogICAgICAgICAgbGlzdGVuZXIyID0gKChtZXNzYWdlMikgPT4gewogICAgICAgICAgICBpZiAoaXNQcmV2aWV3TWVzc2FnZShtZXNzYWdlMikpIHsKICAgICAgICAgICAgICBvcmlnaW5hbExpc3RlbmVyKG1lc3NhZ2UyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHsgbGlzdGVuZXI6IHdyYXBwZWQsIHN1YnNjcmliZTogc3Vic2NyaWJlMiB9ID0gc3luY1N1YnNjcmlwdGlvbihsaXN0ZW5lcjIpOwogICAgICAgIHJldHVybiBzdWJzY3JpYmUyKHRoaXMuX2luc3RhbmNlLm9uKGV2ZW50LCBjb21saW5rX2V4cG9ydHMucHJveHkod3JhcHBlZCkpKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogTW91bnRzIGEgdHJlZSBvZiBmaWxlcyBpbnRvIHRoZSBmaWxlc3lzdGVtLiBUaGlzIGNhbiBiZSBzcGVjaWZpZWQgYXMgYSB0cmVlIG9iamVjdCAoe0BsaW5rIEZpbGVTeXN0ZW1UcmVlfSkKICAgICAgICogb3IgYXMgYSBiaW5hcnkgc25hcHNob3QgZ2VuZXJhdGVkIGJ5IFtgQHdlYmNvbnRhaW5lci9zbmFwc2hvdGBdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0B3ZWJjb250YWluZXIvc25hcHNob3QpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0gc25hcHNob3RPclRyZWUgLSBBIHRyZWUgb2YgZmlsZXMsIG9yIGEgYmluYXJ5IHNuYXBzaG90LiBOb3RlIHRoYXQgYmluYXJ5IHBheWxvYWRzIHdpbGwgYmUgdHJhbnNmZXJyZWQuCiAgICAgICAqIEBwYXJhbSBvcHRpb25zLm1vdW50UG9pbnQgLSBTcGVjaWZpZXMgYSBuZXN0ZWQgcGF0aCB3aGVyZSB0aGUgdHJlZSBzaG91bGQgYmUgbW91bnRlZC4KICAgICAgICovCiAgICAgIG1vdW50KHNuYXBzaG90T3JUcmVlLCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHNuYXBzaG90T3JUcmVlIGluc3RhbmNlb2YgVWludDhBcnJheSA/IHNuYXBzaG90T3JUcmVlIDogc25hcHNob3RPclRyZWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciA/IG5ldyBVaW50OEFycmF5KHNuYXBzaG90T3JUcmVlKSA6IGVuY29kZXIuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHRvSW50ZXJuYWxGaWxlU3lzdGVtVHJlZShzbmFwc2hvdE9yVHJlZSkpKTsKICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UubG9hZEZpbGVzKGNvbWxpbmtfZXhwb3J0cy50cmFuc2ZlcihwYXlsb2FkLCBbcGF5bG9hZC5idWZmZXJdKSwgewogICAgICAgICAgbW91bnRQb2ludHM6IG9wdGlvbnM/Lm1vdW50UG9pbnQKICAgICAgICB9KTsKICAgICAgfQogICAgICAvKioKICAgICAgICogU2V0IGEgY3VzdG9tIHNjcmlwdCB0byBiZSBpbmplY3RlZCBpbnRvIGFsbCBwcmV2aWV3cy4gV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgZXZlcnkKICAgICAgICogZnV0dXJlIHBhZ2UgcmVsb2FkIHdpbGwgY29udGFpbiB0aGUgcHJvdmlkZWQgc2NyaXB0IHRhZyBvbiBhbGwgSFRNTCByZXNwb25zZXMuCiAgICAgICAqCiAgICAgICAqIE5vdGU6CiAgICAgICAqCiAgICAgICAqIFdoZW4gdGhpcyBmdW5jdGlvbiByZXNvbHZlcywgZXZlcnkgcHJldmlldyByZWxvYWRlZCBfYWZ0ZXJfIHdpbGwgaGF2ZSB0aGUgbmV3IHNjcmlwdC4KICAgICAgICogRXhpc3RpbmcgcHJldmlldyBoYXZlIHRvIGJlIGV4cGxpY2l0ZWx5IHJlbG9hZGVkLgogICAgICAgKgogICAgICAgKiBUbyByZWxvYWQgYSBwcmV2aWV3IHlvdSBjYW4gdXNlIGByZWxvYWRQcmV2aWV3YC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHNjcmlwdFNyYyBTb3VyY2UgZm9yIHRoZSBzY3JpcHQgdGFnLgogICAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRvIGRlZmluZSB3aGljaCB0eXBlIG9mIHNjcmlwdCB0aGlzIGlzLgogICAgICAgKi8KICAgICAgc2V0UHJldmlld1NjcmlwdChzY3JpcHRTcmMsIG9wdGlvbnMpIHsKICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2Uuc2V0UHJldmlld1NjcmlwdChzY3JpcHRTcmMsIG9wdGlvbnMpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYFBBVEhgIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciBwcm9jZXNzZXMgc3RhcnRlZCB0aHJvdWdoIHtAbGluayBzcGF3bn0uCiAgICAgICAqLwogICAgICBnZXQgcGF0aCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcnVudGltZUluZm8ucGF0aDsKICAgICAgfQogICAgICAvKioKICAgICAgICogVGhlIGZ1bGwgcGF0aCB0byB0aGUgd29ya2luZyBkaXJlY3RvcnkgKHNlZSB7QGxpbmsgRmlsZVN5c3RlbUFQSX0pLgogICAgICAgKi8KICAgICAgZ2V0IHdvcmtkaXIoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bnRpbWVJbmZvLmN3ZDsKICAgICAgfQogICAgICAvKioKICAgICAgICogRGVzdHJveXMgdGhlIFdlYkNvbnRhaW5lciBpbnN0YW5jZSwgdHVybmluZyBpdCB1bnVzYWJsZSwgYW5kIHJlbGVhc2VzIGl0cyByZXNvdXJjZXMuIEFmdGVyIHRoaXMsCiAgICAgICAqIGEgbmV3IFdlYkNvbnRhaW5lciBpbnN0YW5jZSBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZyB7QGxpbmsgV2ViQ29udGFpbmVyLmJvb3QgfCBgYm9vdGB9LgogICAgICAgKgogICAgICAgKiBBbGwgZW50aXRpZXMgZGVyaXZlZCBmcm9tIHRoaXMgaW5zdGFuY2UgKGUuZy4gcHJvY2Vzc2VzLCB0aGUgZmlsZSBzeXN0ZW0sIGV0Yy4pIGFsc28gYmVjb21lIHVudXNhYmxlCiAgICAgICAqIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuCiAgICAgICAqLwogICAgICB0ZWFyZG93bigpIHsKICAgICAgICBpZiAodGhpcy5fdG9ybkRvd24pIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiV2ViQ29udGFpbmVyIGFscmVhZHkgdG9ybiBkb3duIik7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3Rvcm5Eb3duID0gdHJ1ZTsKICAgICAgICB0aGlzLl91bnN1YnNjcmliZUZyb21Ub2tlbkNoYW5nZWRMaXN0ZW5lcigpOwogICAgICAgIGNvbnN0IHRlYXJkb3duRm4gPSBhc3luYyAoKSA9PiB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBhd2FpdCB0aGlzLmZzLl90ZWFyZG93bigpOwogICAgICAgICAgICBhd2FpdCB0aGlzLl9pbnN0YW5jZS50ZWFyZG93bigpOwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgdGhpcy5faW5zdGFuY2VbY29tbGlua19leHBvcnRzLnJlbGVhc2VQcm94eV0oKTsKICAgICAgICAgICAgaWYgKF9XZWJDb250YWluZXIuX2luc3RhbmNlID09PSB0aGlzKSB7CiAgICAgICAgICAgICAgX1dlYkNvbnRhaW5lci5faW5zdGFuY2UgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBfV2ViQ29udGFpbmVyLl90ZWFyZG93blByb21pc2UgPSB0ZWFyZG93bkZuKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEJvb3RzIGEgV2ViQ29udGFpbmVyLiBPbmx5IGEgc2luZ2xlIGluc3RhbmNlIG9mIFdlYkNvbnRhaW5lciBjYW4gYmUgYm9vdGVkIGNvbmN1cnJlbnRseQogICAgICAgKiAoc2VlIHtAbGluayBXZWJDb250YWluZXIudGVhcmRvd24gfCBgdGVhcmRvd25gfSkuCiAgICAgICAqCiAgICAgICAqIEJvb3RpbmcgV2ViQ29udGFpbmVyIGlzIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24uCiAgICAgICAqLwogICAgICBzdGF0aWMgYXN5bmMgYm9vdChvcHRpb25zID0ge30pIHsKICAgICAgICBhd2FpdCB0aGlzLl90ZWFyZG93blByb21pc2U7CiAgICAgICAgX1dlYkNvbnRhaW5lci5fdGVhcmRvd25Qcm9taXNlID0gbnVsbDsKICAgICAgICBjb25zdCB7IHdvcmtkaXJOYW1lIH0gPSBvcHRpb25zOwogICAgICAgIGlmICh3aW5kb3cuY3Jvc3NPcmlnaW5Jc29sYXRlZCAmJiBvcHRpb25zLmNvZXAgPT09ICJub25lIikgewogICAgICAgICAgY29uc29sZS53YXJuKGBBIENyb3NzLU9yaWdpbi1FbWJlZGRlci1Qb2xpY3kgaGVhZGVyIGlzIHJlcXVpcmVkIGluIGNyb3NzIG9yaWdpbiBpc29sYXRlZCBlbnZpcm9ubWVudHMuClNldCB0aGUgJ2NvZXAnIG9wdGlvbiB0byAncmVxdWlyZS1jb3JwJy5gKTsKICAgICAgICB9CiAgICAgICAgaWYgKHdvcmtkaXJOYW1lPy5pbmNsdWRlcygiLyIpIHx8IHdvcmtkaXJOYW1lID09PSAiLi4iIHx8IHdvcmtkaXJOYW1lID09PSAiLiIpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigid29ya2Rpck5hbWUgc2hvdWxkIGJlIGEgdmFsaWQgZm9sZGVyIG5hbWUiKTsKICAgICAgICB9CiAgICAgICAgYXV0aFN0YXRlLmJvb3RDYWxsZWQgPSB0cnVlOwogICAgICAgIHdoaWxlIChib290UHJvbWlzZSkgewogICAgICAgICAgYXdhaXQgYm9vdFByb21pc2U7CiAgICAgICAgfQogICAgICAgIGlmIChfV2ViQ29udGFpbmVyLl9pbnN0YW5jZSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJPbmx5IGEgc2luZ2xlIFdlYkNvbnRhaW5lciBpbnN0YW5jZSBjYW4gYmUgYm9vdGVkIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGluc3RhbmNlUHJvbWlzZSA9IHVuc3luY2hyb25pemVkQm9vdChvcHRpb25zKTsKICAgICAgICBib290UHJvbWlzZSA9IGluc3RhbmNlUHJvbWlzZS5jYXRjaCgoKSA9PiB7CiAgICAgICAgfSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgaW5zdGFuY2VQcm9taXNlOwogICAgICAgICAgX1dlYkNvbnRhaW5lci5faW5zdGFuY2UgPSBpbnN0YW5jZTsKICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgYm9vdFByb21pc2UgPSBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIERJUl9FTlRSWV9UWVBFX0ZJTEUgPSAxOwogICAgRElSX0VOVFJZX1RZUEVfRElSID0gMjsKICAgIERpckVudEltcGwgPSBjbGFzcyB7CiAgICAgIG5hbWU7CiAgICAgIF90eXBlOwogICAgICBjb25zdHJ1Y3RvcihuYW1lLCBfdHlwZSkgewogICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgdGhpcy5fdHlwZSA9IF90eXBlOwogICAgICB9CiAgICAgIGlzRmlsZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fdHlwZSA9PT0gRElSX0VOVFJZX1RZUEVfRklMRTsKICAgICAgfQogICAgICBpc0RpcmVjdG9yeSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fdHlwZSA9PT0gRElSX0VOVFJZX1RZUEVfRElSOwogICAgICB9CiAgICB9OwogICAgRlNXYXRjaGVyID0gY2xhc3MgewogICAgICBfYXBpQ2xpZW50OwogICAgICBfcGF0aDsKICAgICAgX29wdGlvbnM7CiAgICAgIF9saXN0ZW5lcjsKICAgICAgX3dyYXBwZWRMaXN0ZW5lcjsKICAgICAgX3dhdGNoZXI7CiAgICAgIF9jbG9zZWQgPSBmYWxzZTsKICAgICAgY29uc3RydWN0b3IoX2FwaUNsaWVudCwgX3BhdGgsIF9vcHRpb25zLCBfbGlzdGVuZXIyKSB7CiAgICAgICAgdGhpcy5fYXBpQ2xpZW50ID0gX2FwaUNsaWVudDsKICAgICAgICB0aGlzLl9wYXRoID0gX3BhdGg7CiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zOwogICAgICAgIHRoaXMuX2xpc3RlbmVyID0gX2xpc3RlbmVyMjsKICAgICAgICB0aGlzLl9hcGlDbGllbnQuX3dhdGNoZXJzLmFkZCh0aGlzKTsKICAgICAgICB0aGlzLl93cmFwcGVkTGlzdGVuZXIgPSAoZXZlbnQsIGZpbGVuYW1lKSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXIgJiYgIXRoaXMuX2Nsb3NlZCkgewogICAgICAgICAgICB0aGlzLl9saXN0ZW5lcihldmVudCwgZmlsZW5hbWUpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdGhpcy5fYXBpQ2xpZW50Ll9mcy53YXRjaCh0aGlzLl9wYXRoLCB0aGlzLl9vcHRpb25zLCBwcm94eUxpc3RlbmVyKHRoaXMuX3dyYXBwZWRMaXN0ZW5lcikpLnRoZW4oKF93YXRjaGVyKSA9PiB7CiAgICAgICAgICB0aGlzLl93YXRjaGVyID0gX3dhdGNoZXI7CiAgICAgICAgICBpZiAodGhpcy5fY2xvc2VkKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl90ZWFyZG93bigpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9KS5jYXRjaChjb25zb2xlLmVycm9yKTsKICAgICAgfQogICAgICBhc3luYyBjbG9zZSgpIHsKICAgICAgICBpZiAoIXRoaXMuX2Nsb3NlZCkgewogICAgICAgICAgdGhpcy5fY2xvc2VkID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuX2FwaUNsaWVudC5fd2F0Y2hlcnMuZGVsZXRlKHRoaXMpOwogICAgICAgICAgYXdhaXQgdGhpcy5fdGVhcmRvd24oKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEBpbnRlcm5hbAogICAgICAgKi8KICAgICAgYXN5bmMgX3RlYXJkb3duKCkgewogICAgICAgIGF3YWl0IHRoaXMuX3dhdGNoZXI/LmNsb3NlKCkuZmluYWxseSgoKSA9PiB7CiAgICAgICAgICB0aGlzLl93YXRjaGVyPy5bY29tbGlua19leHBvcnRzLnJlbGVhc2VQcm94eV0oKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIFdlYkNvbnRhaW5lclByb2Nlc3NJbXBsID0gY2xhc3MgewogICAgICBvdXRwdXQ7CiAgICAgIGlucHV0OwogICAgICBleGl0OwogICAgICBfcHJvY2VzczsKICAgICAgc3Rkb3V0OwogICAgICBzdGRlcnI7CiAgICAgIGNvbnN0cnVjdG9yKHByb2Nlc3M0LCBvdXRwdXQsIHN0ZG91dCwgc3RkZXJyKSB7CiAgICAgICAgdGhpcy5vdXRwdXQgPSBvdXRwdXQ7CiAgICAgICAgdGhpcy5fcHJvY2VzcyA9IHByb2Nlc3M0OwogICAgICAgIHRoaXMuaW5wdXQgPSBuZXcgV3JpdGFibGVTdHJlYW0oewogICAgICAgICAgd3JpdGU6IChkYXRhKSA9PiB7CiAgICAgICAgICAgIHRoaXMuX2dldFByb2Nlc3MoKT8ud3JpdGUoZGF0YSkuY2F0Y2goKCkgPT4gewogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICB0aGlzLmV4aXQgPSB0aGlzLl9vbkV4aXQoKTsKICAgICAgICB0aGlzLnN0ZG91dCA9IHN0ZG91dDsKICAgICAgICB0aGlzLnN0ZGVyciA9IHN0ZGVycjsKICAgICAgfQogICAgICBraWxsKCkgewogICAgICAgIHRoaXMuX3Byb2Nlc3M/LmtpbGwoKTsKICAgICAgfQogICAgICByZXNpemUoZGltZW5zaW9ucykgewogICAgICAgIHRoaXMuX2dldFByb2Nlc3MoKT8ucmVzaXplKGRpbWVuc2lvbnMpOwogICAgICB9CiAgICAgIGFzeW5jIF9vbkV4aXQoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9wcm9jZXNzLm9uRXhpdDsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgdGhpcy5fcHJvY2Vzcz8uW2NvbWxpbmtfZXhwb3J0cy5yZWxlYXNlUHJveHldKCk7CiAgICAgICAgICB0aGlzLl9wcm9jZXNzID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgX2dldFByb2Nlc3MoKSB7CiAgICAgICAgaWYgKHRoaXMuX3Byb2Nlc3MgPT0gbnVsbCkgewogICAgICAgICAgY29uc29sZS53YXJuKCJUaGlzIHByb2Nlc3MgYWxyZWFkeSBleGl0ZWQiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3M7CiAgICAgIH0KICAgIH07CiAgICBGaWxlU3lzdGVtQVBJQ2xpZW50ID0gY2xhc3MgewogICAgICBfZnM7CiAgICAgIF93YXRjaGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFtdKTsKICAgICAgY29uc3RydWN0b3IoZnMpIHsKICAgICAgICB0aGlzLl9mcyA9IGZzOwogICAgICB9CiAgICAgIHJtKC4uLmFyZ3MpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZnMucm0oLi4uYXJncyk7CiAgICAgIH0KICAgICAgYXN5bmMgcmVhZEZpbGUocGF0aDIsIGVuY29kaW5nKSB7CiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2ZzLnJlYWRGaWxlKHBhdGgyLCBlbmNvZGluZyk7CiAgICAgIH0KICAgICAgYXN5bmMgcmVuYW1lKG9sZFBhdGgsIG5ld1BhdGgpIHsKICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZnMucmVuYW1lKG9sZFBhdGgsIG5ld1BhdGgpOwogICAgICB9CiAgICAgIGFzeW5jIHdyaXRlRmlsZShwYXRoMiwgZGF0YSwgb3B0aW9ucykgewogICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkgewogICAgICAgICAgY29uc3QgYnVmZmVyMiA9IGRhdGEuYnVmZmVyLnNsaWNlKGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5ieXRlT2Zmc2V0ICsgZGF0YS5ieXRlTGVuZ3RoKTsKICAgICAgICAgIGRhdGEgPSBjb21saW5rX2V4cG9ydHMudHJhbnNmZXIobmV3IFVpbnQ4QXJyYXkoYnVmZmVyMiksIFtidWZmZXIyXSk7CiAgICAgICAgfQogICAgICAgIGF3YWl0IHRoaXMuX2ZzLndyaXRlRmlsZShwYXRoMiwgZGF0YSwgb3B0aW9ucyk7CiAgICAgIH0KICAgICAgYXN5bmMgcmVhZGRpcihwYXRoMiwgb3B0aW9ucykgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX2ZzLnJlYWRkaXIocGF0aDIsIG9wdGlvbnMpOwogICAgICAgIGlmIChpc1N0cmluZ0FycmF5KHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGlmIChpc1R5cGVkQXJyYXlDb2xsZWN0aW9uKHJlc3VsdCkpIHsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGVudHJpZXMgPSByZXN1bHQubWFwKChlbnRyeSkgPT4gbmV3IERpckVudEltcGwoZW50cnkubmFtZSwgZW50cnlbIlN5bWJvbCh0eXBlKSJdKSk7CiAgICAgICAgcmV0dXJuIGVudHJpZXM7CiAgICAgIH0KICAgICAgYXN5bmMgbWtkaXIocGF0aDIsIG9wdGlvbnMpIHsKICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZnMubWtkaXIocGF0aDIsIG9wdGlvbnMpOwogICAgICB9CiAgICAgIHdhdGNoKHBhdGgyLCBvcHRpb25zLCBsaXN0ZW5lcjIpIHsKICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIGxpc3RlbmVyMiA9IG9wdGlvbnM7CiAgICAgICAgICBvcHRpb25zID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBGU1dhdGNoZXIodGhpcywgcGF0aDIsIG9wdGlvbnMsIGxpc3RlbmVyMik7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEBpbnRlcm5hbAogICAgICAgKi8KICAgICAgYXN5bmMgX3RlYXJkb3duKCkgewogICAgICAgIHRoaXMuX2ZzW2NvbWxpbmtfZXhwb3J0cy5yZWxlYXNlUHJveHldKCk7CiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoWy4uLnRoaXMuX3dhdGNoZXJzXS5tYXAoKHdhdGNoZXIpID0+IHdhdGNoZXIuY2xvc2UoKSkpOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtcnVudGltZS9lbnZpcm9ubWVudHMvV2ViQ29udGFpbmVyRW52aXJvbm1lbnQuanMKdmFyIFdlYkNvbnRhaW5lckVudmlyb25tZW50Owp2YXIgaW5pdF9XZWJDb250YWluZXJFbnZpcm9ubWVudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXJ1bnRpbWUvZW52aXJvbm1lbnRzL1dlYkNvbnRhaW5lckVudmlyb25tZW50LmpzIigpIHsKICAgIGluaXRfZGlzdCgpOwogICAgV2ViQ29udGFpbmVyRW52aXJvbm1lbnQgPSBjbGFzcyBfV2ViQ29udGFpbmVyRW52aXJvbm1lbnQgewogICAgICAvLyBTdGF0aWMgc2hhcmVkIHN0YXRlIC0gV2ViQ29udGFpbmVyIG9ubHkgYWxsb3dzIE9ORSBib290IHBlciBwYWdlCiAgICAgIHN0YXRpYyBzaGFyZWRDb250YWluZXIgPSBudWxsOwogICAgICBzdGF0aWMgYm9vdFByb21pc2UgPSBudWxsOwogICAgICBfcmVhZHkgPSBmYWxzZTsKICAgICAgdHlwZSA9ICJ3ZWJjb250YWluZXIiOwogICAgICBnZXQgcmVhZHkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWR5OwogICAgICB9CiAgICAgIGdldCBjb250YWluZXIoKSB7CiAgICAgICAgcmV0dXJuIF9XZWJDb250YWluZXJFbnZpcm9ubWVudC5zaGFyZWRDb250YWluZXI7CiAgICAgIH0KICAgICAgLy8gPT09PT09PT09PT09IExpZmVjeWNsZSA9PT09PT09PT09PT0KICAgICAgYXN5bmMgaW5pdCgpIHsKICAgICAgICBpZiAodGhpcy5fcmVhZHkgJiYgX1dlYkNvbnRhaW5lckVudmlyb25tZW50LnNoYXJlZENvbnRhaW5lcikgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoX1dlYkNvbnRhaW5lckVudmlyb25tZW50LmJvb3RQcm9taXNlKSB7CiAgICAgICAgICBhd2FpdCBfV2ViQ29udGFpbmVyRW52aXJvbm1lbnQuYm9vdFByb21pc2U7CiAgICAgICAgICB0aGlzLl9yZWFkeSA9IHRydWU7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChfV2ViQ29udGFpbmVyRW52aXJvbm1lbnQuc2hhcmVkQ29udGFpbmVyKSB7CiAgICAgICAgICB0aGlzLl9yZWFkeSA9IHRydWU7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldlYkNvbnRhaW5lciByZXF1aXJlcyBTaGFyZWRBcnJheUJ1ZmZlciB3aGljaCBpcyBub3QgYXZhaWxhYmxlLiBFbnN1cmUgeW91ciBzZXJ2ZXIgc2VuZHMgdGhlc2UgaGVhZGVyczpcbiAgQ3Jvc3MtT3JpZ2luLU9wZW5lci1Qb2xpY3k6IHNhbWUtb3JpZ2luXG4gIENyb3NzLU9yaWdpbi1FbWJlZGRlci1Qb2xpY3k6IHJlcXVpcmUtY29ycCIpOwogICAgICAgIH0KICAgICAgICBfV2ViQ29udGFpbmVyRW52aXJvbm1lbnQuYm9vdFByb21pc2UgPSBXZWJDb250YWluZXIuYm9vdCgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICBfV2ViQ29udGFpbmVyRW52aXJvbm1lbnQuc2hhcmVkQ29udGFpbmVyID0gYXdhaXQgX1dlYkNvbnRhaW5lckVudmlyb25tZW50LmJvb3RQcm9taXNlOwogICAgICAgICAgdGhpcy5fcmVhZHkgPSB0cnVlOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICBfV2ViQ29udGFpbmVyRW52aXJvbm1lbnQuYm9vdFByb21pc2UgPSBudWxsOwogICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIGRlc3Ryb3koKSB7CiAgICAgICAgaWYgKF9XZWJDb250YWluZXJFbnZpcm9ubWVudC5zaGFyZWRDb250YWluZXIpIHsKICAgICAgICAgIF9XZWJDb250YWluZXJFbnZpcm9ubWVudC5zaGFyZWRDb250YWluZXIudGVhcmRvd24oKTsKICAgICAgICAgIF9XZWJDb250YWluZXJFbnZpcm9ubWVudC5zaGFyZWRDb250YWluZXIgPSBudWxsOwogICAgICAgICAgX1dlYkNvbnRhaW5lckVudmlyb25tZW50LmJvb3RQcm9taXNlID0gbnVsbDsKICAgICAgICAgIHRoaXMuX3JlYWR5ID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vID09PT09PT09PT09PSBGaWxlc3lzdGVtIE9wZXJhdGlvbnMgPT09PT09PT09PT09CiAgICAgIGFzeW5jIHJlYWRGaWxlKHBhdGgyKSB7CiAgICAgICAgdGhpcy5lbnN1cmVSZWFkeSgpOwogICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbnRhaW5lci5mcy5yZWFkRmlsZShwYXRoMiwgInV0Zi04Iik7CiAgICAgIH0KICAgICAgYXN5bmMgd3JpdGVGaWxlKHBhdGgyLCBjb250ZW50cykgewogICAgICAgIHRoaXMuZW5zdXJlUmVhZHkoKTsKICAgICAgICBhd2FpdCB0aGlzLmNvbnRhaW5lci5mcy53cml0ZUZpbGUocGF0aDIsIGNvbnRlbnRzLCAidXRmLTgiKTsKICAgICAgfQogICAgICBhc3luYyByZWFkRGlyKHBhdGgyKSB7CiAgICAgICAgdGhpcy5lbnN1cmVSZWFkeSgpOwogICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmNvbnRhaW5lci5mcy5yZWFkZGlyKHBhdGgyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7CiAgICAgICAgcmV0dXJuIGVudHJpZXMubWFwKChlbnRyeSkgPT4gKHsKICAgICAgICAgIHR5cGU6IGVudHJ5LmlzRGlyZWN0b3J5KCkgPyAiZGlyZWN0b3J5IiA6ICJmaWxlIiwKICAgICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsCiAgICAgICAgICBwYXRoOiBwYXRoMiA9PT0gIi8iID8gYC8ke2VudHJ5Lm5hbWV9YCA6IGAke3BhdGgyfS8ke2VudHJ5Lm5hbWV9YAogICAgICAgIH0pKTsKICAgICAgfQogICAgICBhc3luYyBta2RpcihwYXRoMikgewogICAgICAgIHRoaXMuZW5zdXJlUmVhZHkoKTsKICAgICAgICBhd2FpdCB0aGlzLmNvbnRhaW5lci5mcy5ta2RpcihwYXRoMiwgeyByZWN1cnNpdmU6IHRydWUgfSk7CiAgICAgIH0KICAgICAgYXN5bmMgcm0ocGF0aDIsIG9wdGlvbnMpIHsKICAgICAgICB0aGlzLmVuc3VyZVJlYWR5KCk7CiAgICAgICAgYXdhaXQgdGhpcy5jb250YWluZXIuZnMucm0ocGF0aDIsIHsgcmVjdXJzaXZlOiBvcHRpb25zPy5yZWN1cnNpdmUgPz8gZmFsc2UgfSk7CiAgICAgIH0KICAgICAgYXN5bmMgZXhpc3RzKHBhdGgyKSB7CiAgICAgICAgdGhpcy5lbnN1cmVSZWFkeSgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICBhd2FpdCB0aGlzLmNvbnRhaW5lci5mcy5yZWFkRmlsZShwYXRoMik7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29udGFpbmVyLmZzLnJlYWRkaXIocGF0aDIpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHdhdGNoKHBhdGgyLCBjYWxsYmFjaywgb3B0aW9ucykgewogICAgICAgIHRoaXMuZW5zdXJlUmVhZHkoKTsKICAgICAgICBjb25zdCB3YXRjaGVyID0gdGhpcy5jb250YWluZXIuZnMud2F0Y2gocGF0aDIsIHsgcmVjdXJzaXZlOiBvcHRpb25zPy5yZWN1cnNpdmUgPz8gZmFsc2UgfSwgY2FsbGJhY2spOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBzdG9wOiAoKSA9PiB3YXRjaGVyLmNsb3NlKCkKICAgICAgICB9OwogICAgICB9CiAgICAgIC8vID09PT09PT09PT09PSBQcm9jZXNzIEV4ZWN1dGlvbiA9PT09PT09PT09PT0KICAgICAgYXN5bmMgc3Bhd24oY29tbWFuZCwgYXJncyA9IFtdKSB7CiAgICAgICAgdGhpcy5lbnN1cmVSZWFkeSgpOwogICAgICAgIGNvbnN0IHByb2Nlc3M0ID0gYXdhaXQgdGhpcy5jb250YWluZXIuc3Bhd24oY29tbWFuZCwgYXJncyk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIG91dHB1dDogcHJvY2VzczQub3V0cHV0LAogICAgICAgICAgaW5wdXQ6IHByb2Nlc3M0LmlucHV0LAogICAgICAgICAgZXhpdDogcHJvY2VzczQuZXhpdCwKICAgICAgICAgIGtpbGw6ICgpID0+IHByb2Nlc3M0LmtpbGwoKQogICAgICAgIH07CiAgICAgIH0KICAgICAgLy8gPT09PT09PT09PT09IFdlYkNvbnRhaW5lci1zcGVjaWZpYyBtZXRob2RzID09PT09PT09PT09PQogICAgICAvKioKICAgICAgICogTW91bnQgZmlsZXMgaW50byB0aGUgdmlydHVhbCBmaWxlc3lzdGVtLgogICAgICAgKiBUaGlzIGlzIGEgV2ViQ29udGFpbmVyLXNwZWNpZmljIG9wZXJhdGlvbi4KICAgICAgICogQHBhcmFtIGZpbGVzIC0gRmlsZSB0cmVlIHN0cnVjdHVyZSB0byBtb3VudAogICAgICAgKi8KICAgICAgYXN5bmMgbW91bnQoZmlsZXMpIHsKICAgICAgICB0aGlzLmVuc3VyZVJlYWR5KCk7CiAgICAgICAgYXdhaXQgdGhpcy5jb250YWluZXIubW91bnQoZmlsZXMpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgV2ViQ29udGFpbmVyIGluc3RhbmNlLgogICAgICAgKiBVc2Ugc3BhcmluZ2x5IC0gcHJlZmVyIHRoZSBpbnRlcmZhY2UgbWV0aG9kcy4KICAgICAgICovCiAgICAgIGdldENvbnRhaW5lcigpIHsKICAgICAgICB0aGlzLmVuc3VyZVJlYWR5KCk7CiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyOwogICAgICB9CiAgICAgIC8vID09PT09PT09PT09PSBQcml2YXRlIEhlbHBlcnMgPT09PT09PT09PT09CiAgICAgIGVuc3VyZVJlYWR5KCkgewogICAgICAgIGlmICghdGhpcy5fcmVhZHkgfHwgIXRoaXMuY29udGFpbmVyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldlYkNvbnRhaW5lckVudmlyb25tZW50IG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0KCkgZmlyc3QuIik7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtcnVudGltZS9lbnZpcm9ubWVudHMvaW5kZXguanMKdmFyIGluaXRfZW52aXJvbm1lbnRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtcnVudGltZS9lbnZpcm9ubWVudHMvaW5kZXguanMiKCkgewogICAgaW5pdF9XZWJDb250YWluZXJFbnZpcm9ubWVudCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtcnVudGltZS9pbmRleC5qcwp2YXIgaW5pdF9ncm91cF9ydW50aW1lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtcnVudGltZS9pbmRleC5qcyIoKSB7CiAgICBpbml0X2ludGVyZmFjZXMzKCk7CiAgICBpbml0X2Vudmlyb25tZW50cygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtd29ya3NwYWNlL2RlZXMtd29ya3NwYWNlLXRlcm1pbmFsL3Rlcm1pbmFsLXRhYi1tYW5hZ2VyLmpzCnZhciBUZXJtaW5hbFRhYk1hbmFnZXI7CnZhciBpbml0X3Rlcm1pbmFsX3RhYl9tYW5hZ2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtd29ya3NwYWNlL2RlZXMtd29ya3NwYWNlLXRlcm1pbmFsL3Rlcm1pbmFsLXRhYi1tYW5hZ2VyLmpzIigpIHsKICAgIFRlcm1pbmFsVGFiTWFuYWdlciA9IGNsYXNzIHsKICAgICAgdGFicyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgIHRhYkNvdW50ZXIgPSAwOwogICAgICB4dGVybUJ1bmRsZSA9IG51bGw7CiAgICAgIHh0ZXJtRml0QWRkb25CdW5kbGUgPSBudWxsOwogICAgICAvKioKICAgICAgICogSW5pdGlhbGl6ZSB0aGUgbWFuYWdlciB3aXRoIGxvYWRlZCB4dGVybSBtb2R1bGVzLgogICAgICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgY3JlYXRpbmcgdGFicy4KICAgICAgICovCiAgICAgIHNldFh0ZXJtTW9kdWxlcyh4dGVybUJ1bmRsZSwgZml0QWRkb25CdW5kbGUpIHsKICAgICAgICB0aGlzLnh0ZXJtQnVuZGxlID0geHRlcm1CdW5kbGU7CiAgICAgICAgdGhpcy54dGVybUZpdEFkZG9uQnVuZGxlID0gZml0QWRkb25CdW5kbGU7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEdlbmVyYXRlIHVuaXF1ZSB0YWIgSUQKICAgICAgICovCiAgICAgIGdlbmVyYXRlVGFiSWQoKSB7CiAgICAgICAgdGhpcy50YWJDb3VudGVyKys7CiAgICAgICAgcmV0dXJuIGB0ZXJtaW5hbC0ke3RoaXMudGFiQ291bnRlcn0tJHtEYXRlLm5vdygpfWA7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEdldCBkZWZhdWx0IGxhYmVsIGZvciB0YWIgdHlwZQogICAgICAgKi8KICAgICAgZ2V0RGVmYXVsdExhYmVsKHR5cGU1LCBtZXRhZGF0YSkgewogICAgICAgIHN3aXRjaCAodHlwZTUpIHsKICAgICAgICAgIGNhc2UgInNoZWxsIjoKICAgICAgICAgICAgcmV0dXJuICJiYXNoIjsKICAgICAgICAgIGNhc2UgInNjcmlwdCI6CiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YT8uc2NyaXB0TmFtZSB8fCAic2NyaXB0IjsKICAgICAgICAgIGNhc2UgInBhY2thZ2UtdXBkYXRlIjoKICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhPy5wYWNrYWdlTmFtZSA/IGB1cGRhdGUgJHttZXRhZGF0YS5wYWNrYWdlTmFtZX1gIDogInVwZGF0ZSI7CiAgICAgICAgICBjYXNlICJjdXN0b20iOgogICAgICAgICAgICByZXR1cm4gbWV0YWRhdGE/LmNvbW1hbmQgfHwgInByb2Nlc3MiOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuICJ0ZXJtaW5hbCI7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBHZXQgZGVmYXVsdCBpY29uIGZvciB0YWIgdHlwZQogICAgICAgKi8KICAgICAgZ2V0RGVmYXVsdEljb24odHlwZTUpIHsKICAgICAgICBzd2l0Y2ggKHR5cGU1KSB7CiAgICAgICAgICBjYXNlICJzaGVsbCI6CiAgICAgICAgICAgIHJldHVybiAibHVjaWRlOnRlcm1pbmFsIjsKICAgICAgICAgIGNhc2UgInNjcmlwdCI6CiAgICAgICAgICAgIHJldHVybiAibHVjaWRlOnBsYXkiOwogICAgICAgICAgY2FzZSAicGFja2FnZS11cGRhdGUiOgogICAgICAgICAgICByZXR1cm4gImx1Y2lkZTpwYWNrYWdlQ2hlY2siOwogICAgICAgICAgY2FzZSAiY3VzdG9tIjoKICAgICAgICAgICAgcmV0dXJuICJsdWNpZGU6Y29kZSI7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gImx1Y2lkZTp0ZXJtaW5hbCI7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBHZXQgdGVybWluYWwgdGhlbWUgY29uZmlndXJhdGlvbgogICAgICAgKi8KICAgICAgZ2V0VGVybWluYWxUaGVtZShpc0JyaWdodCkgewogICAgICAgIGlmIChpc0JyaWdodCkgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogIiNmZmZmZmYiLAogICAgICAgICAgICBmb3JlZ3JvdW5kOiAiIzMzMzMzMyIsCiAgICAgICAgICAgIGN1cnNvcjogIiMzMzMzMzMiLAogICAgICAgICAgICBjdXJzb3JBY2NlbnQ6ICIjZmZmZmZmIiwKICAgICAgICAgICAgc2VsZWN0aW9uOiAicmdiYSgwLCAwLCAwLCAwLjIpIiwKICAgICAgICAgICAgYmxhY2s6ICIjMDAwMDAwIiwKICAgICAgICAgICAgcmVkOiAiI2NkMzEzMSIsCiAgICAgICAgICAgIGdyZWVuOiAiIzAwYmMwMCIsCiAgICAgICAgICAgIHllbGxvdzogIiM5NDk4MDAiLAogICAgICAgICAgICBibHVlOiAiIzA0NTFhNSIsCiAgICAgICAgICAgIG1hZ2VudGE6ICIjYmMwNWJjIiwKICAgICAgICAgICAgY3lhbjogIiMwNTk4YmMiLAogICAgICAgICAgICB3aGl0ZTogIiM1NTU1NTUiLAogICAgICAgICAgICBicmlnaHRCbGFjazogIiM2NjY2NjYiLAogICAgICAgICAgICBicmlnaHRSZWQ6ICIjY2QzMTMxIiwKICAgICAgICAgICAgYnJpZ2h0R3JlZW46ICIjMTRjZTE0IiwKICAgICAgICAgICAgYnJpZ2h0WWVsbG93OiAiI2I1YmEwMCIsCiAgICAgICAgICAgIGJyaWdodEJsdWU6ICIjMDQ1MWE1IiwKICAgICAgICAgICAgYnJpZ2h0TWFnZW50YTogIiNiYzA1YmMiLAogICAgICAgICAgICBicmlnaHRDeWFuOiAiIzA1OThiYyIsCiAgICAgICAgICAgIGJyaWdodFdoaXRlOiAiI2E1YTVhNSIKICAgICAgICAgIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICIjMDAwMDAwIiwKICAgICAgICAgICAgZm9yZWdyb3VuZDogIiNmZmZmZmYiLAogICAgICAgICAgICBjdXJzb3I6ICIjZmZmZmZmIiwKICAgICAgICAgICAgY3Vyc29yQWNjZW50OiAiIzAwMDAwMCIsCiAgICAgICAgICAgIHNlbGVjdGlvbjogInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSIKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDcmVhdGUgYSBuZXcgdGFiIGluc3RhbmNlCiAgICAgICAqLwogICAgICBjcmVhdGVUYWIob3B0aW9ucywgaXNCcmlnaHQpIHsKICAgICAgICBpZiAoIXRoaXMueHRlcm1CdW5kbGUgfHwgIXRoaXMueHRlcm1GaXRBZGRvbkJ1bmRsZSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUZXJtaW5hbFRhYk1hbmFnZXI6IHh0ZXJtIG1vZHVsZXMgbm90IGluaXRpYWxpemVkLiBDYWxsIHNldFh0ZXJtTW9kdWxlcygpIGZpcnN0LiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ2VuZXJhdGVUYWJJZCgpOwogICAgICAgIGNvbnN0IHR5cGU1ID0gb3B0aW9ucy50eXBlOwogICAgICAgIGNvbnN0IHRlcm1pbmFsID0gbmV3IHRoaXMueHRlcm1CdW5kbGUuVGVybWluYWwoewogICAgICAgICAgY29udmVydEVvbDogdHJ1ZSwKICAgICAgICAgIGN1cnNvckJsaW5rOiB0cnVlLAogICAgICAgICAgdGhlbWU6IHRoaXMuZ2V0VGVybWluYWxUaGVtZShpc0JyaWdodCksCiAgICAgICAgICBmb250RmFtaWx5OiAnTWVubG8sIE1vbmFjbywgIkNvdXJpZXIgTmV3IiwgbW9ub3NwYWNlJywKICAgICAgICAgIGZvbnRTaXplOiAxMywKICAgICAgICAgIGxpbmVIZWlnaHQ6IDEuMgogICAgICAgIH0pOwogICAgICAgIGNvbnN0IGZpdEFkZG9uID0gbmV3IHRoaXMueHRlcm1GaXRBZGRvbkJ1bmRsZS5GaXRBZGRvbigpOwogICAgICAgIHRlcm1pbmFsLmxvYWRBZGRvbihmaXRBZGRvbik7CiAgICAgICAgY29uc3QgdGFiMiA9IHsKICAgICAgICAgIGlkLAogICAgICAgICAgbGFiZWw6IG9wdGlvbnMubGFiZWwgfHwgdGhpcy5nZXREZWZhdWx0TGFiZWwodHlwZTUsIG9wdGlvbnMubWV0YWRhdGEpLAogICAgICAgICAgaWNvbk5hbWU6IG9wdGlvbnMuaWNvbk5hbWUgfHwgdGhpcy5nZXREZWZhdWx0SWNvbih0eXBlNSksCiAgICAgICAgICB0eXBlOiB0eXBlNSwKICAgICAgICAgIGNsb3NlYWJsZTogb3B0aW9ucy5jbG9zZWFibGUgPz8gdHlwZTUgIT09ICJzaGVsbCIsCiAgICAgICAgICB0ZXJtaW5hbCwKICAgICAgICAgIGZpdEFkZG9uLAogICAgICAgICAgcHJvY2VzczogbnVsbCwKICAgICAgICAgIGlucHV0V3JpdGVyOiBudWxsLAogICAgICAgICAgZXhpdGVkOiBmYWxzZSwKICAgICAgICAgIGV4aXRDb2RlOiBudWxsLAogICAgICAgICAgY3JlYXRlZEF0OiBEYXRlLm5vdygpLAogICAgICAgICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEKICAgICAgICB9OwogICAgICAgIHRoaXMudGFicy5zZXQoaWQsIHRhYjIpOwogICAgICAgIHJldHVybiB0YWIyOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBHZXQgdGFiIGJ5IElECiAgICAgICAqLwogICAgICBnZXRUYWIoaWQpIHsKICAgICAgICByZXR1cm4gdGhpcy50YWJzLmdldChpZCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEdldCBhbGwgdGFicyBhcyBhcnJheSAob3JkZXJlZCBieSBjcmVhdGlvbiB0aW1lKQogICAgICAgKi8KICAgICAgZ2V0QWxsVGFicygpIHsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnRhYnMudmFsdWVzKCkpLnNvcnQoKGE1LCBiNSkgPT4gYTUuY3JlYXRlZEF0IC0gYjUuY3JlYXRlZEF0KTsKICAgICAgfQogICAgICAvKioKICAgICAgICogR2V0IHRoZSBudW1iZXIgb2YgdGFicwogICAgICAgKi8KICAgICAgZ2V0VGFiQ291bnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudGFicy5zaXplOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDaGVjayBpZiB0YWIgZXhpc3RzCiAgICAgICAqLwogICAgICBoYXNUYWIoaWQpIHsKICAgICAgICByZXR1cm4gdGhpcy50YWJzLmhhcyhpZCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENsb3NlIGFuZCBjbGVhbnVwIGEgdGFiCiAgICAgICAqLwogICAgICBjbG9zZVRhYihpZCkgewogICAgICAgIGNvbnN0IHRhYjIgPSB0aGlzLnRhYnMuZ2V0KGlkKTsKICAgICAgICBpZiAoIXRhYjIpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKHRhYjIucHJvY2VzcyAmJiAhdGFiMi5leGl0ZWQpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRhYjIucHJvY2Vzcy5raWxsKCk7CiAgICAgICAgICB9IGNhdGNoIChlMTEpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCJGYWlsZWQgdG8ga2lsbCBwcm9jZXNzOiIsIGUxMSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICB0YWIyLnRlcm1pbmFsLmRpc3Bvc2UoKTsKICAgICAgICB9IGNhdGNoIChlMTEpIHsKICAgICAgICAgIGNvbnNvbGUud2FybigiRmFpbGVkIHRvIGRpc3Bvc2UgdGVybWluYWw6IiwgZTExKTsKICAgICAgICB9CiAgICAgICAgdGhpcy50YWJzLmRlbGV0ZShpZCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJlbmFtZSBhIHRhYgogICAgICAgKi8KICAgICAgcmVuYW1lVGFiKGlkLCBuZXdMYWJlbCkgewogICAgICAgIGNvbnN0IHRhYjIgPSB0aGlzLnRhYnMuZ2V0KGlkKTsKICAgICAgICBpZiAoIXRhYjIpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgdGFiMi5sYWJlbCA9IG5ld0xhYmVsOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBVcGRhdGUgdGFiIHByb2Nlc3Mgc3RhdGUgdG8gZXhpdGVkCiAgICAgICAqLwogICAgICBtYXJrVGFiRXhpdGVkKGlkLCBleGl0Q29kZSkgewogICAgICAgIGNvbnN0IHRhYjIgPSB0aGlzLnRhYnMuZ2V0KGlkKTsKICAgICAgICBpZiAoIXRhYjIpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgdGFiMi5leGl0ZWQgPSB0cnVlOwogICAgICAgIHRhYjIuZXhpdENvZGUgPSBleGl0Q29kZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogU2V0IHByb2Nlc3MgZm9yIGEgdGFiCiAgICAgICAqLwogICAgICBzZXRUYWJQcm9jZXNzKGlkLCBwcm9jZXNzNCwgaW5wdXRXcml0ZXIpIHsKICAgICAgICBjb25zdCB0YWIyID0gdGhpcy50YWJzLmdldChpZCk7CiAgICAgICAgaWYgKCF0YWIyKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIHRhYjIucHJvY2VzcyA9IHByb2Nlc3M0OwogICAgICAgIHRhYjIuaW5wdXRXcml0ZXIgPSBpbnB1dFdyaXRlcjsKICAgICAgfQogICAgICAvKioKICAgICAgICogVXBkYXRlIHRoZW1lIGZvciBhbGwgdGVybWluYWxzCiAgICAgICAqLwogICAgICB1cGRhdGVBbGxUaGVtZXMoaXNCcmlnaHQpIHsKICAgICAgICBjb25zdCB0aGVtZSA9IHRoaXMuZ2V0VGVybWluYWxUaGVtZShpc0JyaWdodCk7CiAgICAgICAgZm9yIChjb25zdCB0YWIyIG9mIHRoaXMudGFicy52YWx1ZXMoKSkgewogICAgICAgICAgdGFiMi50ZXJtaW5hbC5vcHRpb25zLnRoZW1lID0gdGhlbWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBEaXNwb3NlIGFsbCB0YWJzIGFuZCBjbGVhbnVwCiAgICAgICAqLwogICAgICBkaXNwb3NlQWxsKCkgewogICAgICAgIGZvciAoY29uc3QgW2lkXSBvZiB0aGlzLnRhYnMpIHsKICAgICAgICAgIHRoaXMuY2xvc2VUYWIoaWQpOwogICAgICAgIH0KICAgICAgICB0aGlzLnRhYnMuY2xlYXIoKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXdvcmtzcGFjZS9kZWVzLXdvcmtzcGFjZS10ZXJtaW5hbC9kZWVzLXdvcmtzcGFjZS10ZXJtaW5hbC5qcwp2YXIgZGVlc193b3Jrc3BhY2VfdGVybWluYWxfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChkZWVzX3dvcmtzcGFjZV90ZXJtaW5hbF9leHBvcnRzLCB7CiAgRGVlc1dvcmtzcGFjZVRlcm1pbmFsOiAoKSA9PiBEZWVzV29ya3NwYWNlVGVybWluYWwKfSk7CnZhciBfX2VzRGVjb3JhdGU4NSwgX19ydW5Jbml0aWFsaXplcnM4NiwgRGVlc1dvcmtzcGFjZVRlcm1pbmFsOwp2YXIgaW5pdF9kZWVzX3dvcmtzcGFjZV90ZXJtaW5hbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXdvcmtzcGFjZS9kZWVzLXdvcmtzcGFjZS10ZXJtaW5hbC9kZWVzLXdvcmtzcGFjZS10ZXJtaW5hbC5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMyNigpOwogICAgaW5pdF9kaXN0X3RzMjUoKTsKICAgIGluaXRfdGhlbWUoKTsKICAgIGluaXRfZ3JvdXBfcnVudGltZSgpOwogICAgaW5pdF9kZWVzX2ljb24oKTsKICAgIGluaXRfZGVlc19hY3Rpb25iYXIoKTsKICAgIGluaXRfdGVybWluYWxfdGFiX21hbmFnZXIoKTsKICAgIGluaXRfc2VydmljZXMoKTsKICAgIF9fZXNEZWNvcmF0ZTg1ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICAgICAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICAgICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgICAgIHJldHVybiBmNzsKICAgICAgfQogICAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogICAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogICAgICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICAgICAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgICAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgICAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgICAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICAgICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgICAgIH07CiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgICAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgICAgIGRvbmUgPSB0cnVlOwogICAgfTsKICAgIF9fcnVuSW5pdGlhbGl6ZXJzODYgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogICAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICAgICAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgICAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwogICAgfTsKICAgIERlZXNXb3Jrc3BhY2VUZXJtaW5hbCA9ICgoKSA9PiB7CiAgICAgIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLXdvcmtzcGFjZS10ZXJtaW5hbCIpXTsKICAgICAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgICAgIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX2NsYXNzVGhpczsKICAgICAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgICAgIGxldCBfZXhlY3V0aW9uRW52aXJvbm1lbnRfZGVjb3JhdG9yczsKICAgICAgbGV0IF9leGVjdXRpb25FbnZpcm9ubWVudF9pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9leGVjdXRpb25FbnZpcm9ubWVudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX3NldHVwQ29tbWFuZF9kZWNvcmF0b3JzOwogICAgICBsZXQgX3NldHVwQ29tbWFuZF9pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9zZXR1cENvbW1hbmRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9lbnZpcm9ubWVudFZhcmlhYmxlc19kZWNvcmF0b3JzOwogICAgICBsZXQgX2Vudmlyb25tZW50VmFyaWFibGVzX2luaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX2Vudmlyb25tZW50VmFyaWFibGVzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgICAgIGxldCBfdGFiQmFyV2lkdGhfZGVjb3JhdG9yczsKICAgICAgbGV0IF90YWJCYXJXaWR0aF9pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF90YWJCYXJXaWR0aF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX3Nob3dUYWJCYXJfZGVjb3JhdG9yczsKICAgICAgbGV0IF9zaG93VGFiQmFyX2luaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX3Nob3dUYWJCYXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF90YWJzX2RlY29yYXRvcnM7CiAgICAgIGxldCBfdGFic19pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF90YWJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgICAgIGxldCBfYWN0aXZlVGFiSWRfZGVjb3JhdG9yczsKICAgICAgbGV0IF9hY3RpdmVUYWJJZF9pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9hY3RpdmVUYWJJZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogICAgICB2YXIgRGVlc1dvcmtzcGFjZVRlcm1pbmFsMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgICAgIHN0YXRpYyB7CiAgICAgICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgICAgICB9CiAgICAgICAgc3RhdGljIHsKICAgICAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICAgICAgX2V4ZWN1dGlvbkVudmlyb25tZW50X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBPYmplY3QgfSldOwogICAgICAgICAgX3NldHVwQ29tbWFuZF9kZWNvcmF0b3JzID0gW241KCldOwogICAgICAgICAgX2Vudmlyb25tZW50VmFyaWFibGVzX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgICAgICBfdGFiQmFyV2lkdGhfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgICAgICBfc2hvd1RhYkJhcl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgICAgICBfdGFic19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICAgICAgX2FjdGl2ZVRhYklkX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgICAgICBfX2VzRGVjb3JhdGU4NSh0aGlzLCBudWxsLCBfZXhlY3V0aW9uRW52aXJvbm1lbnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZXhlY3V0aW9uRW52aXJvbm1lbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImV4ZWN1dGlvbkVudmlyb25tZW50IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmV4ZWN1dGlvbkVudmlyb25tZW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgICAgICBvYmouZXhlY3V0aW9uRW52aXJvbm1lbnQgPSB2YWx1ZTI7CiAgICAgICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2V4ZWN1dGlvbkVudmlyb25tZW50X2luaXRpYWxpemVycywgX2V4ZWN1dGlvbkVudmlyb25tZW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgICAgIF9fZXNEZWNvcmF0ZTg1KHRoaXMsIG51bGwsIF9zZXR1cENvbW1hbmRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2V0dXBDb21tYW5kIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZXR1cENvbW1hbmQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2V0dXBDb21tYW5kLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgICAgICBvYmouc2V0dXBDb21tYW5kID0gdmFsdWUyOwogICAgICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZXR1cENvbW1hbmRfaW5pdGlhbGl6ZXJzLCBfc2V0dXBDb21tYW5kX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgICAgIF9fZXNEZWNvcmF0ZTg1KHRoaXMsIG51bGwsIF9lbnZpcm9ubWVudFZhcmlhYmxlc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJlbnZpcm9ubWVudFZhcmlhYmxlcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZW52aXJvbm1lbnRWYXJpYWJsZXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZW52aXJvbm1lbnRWYXJpYWJsZXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgICAgIG9iai5lbnZpcm9ubWVudFZhcmlhYmxlcyA9IHZhbHVlMjsKICAgICAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZW52aXJvbm1lbnRWYXJpYWJsZXNfaW5pdGlhbGl6ZXJzLCBfZW52aXJvbm1lbnRWYXJpYWJsZXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgX19lc0RlY29yYXRlODUodGhpcywgbnVsbCwgX3RhYkJhcldpZHRoX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRhYkJhcldpZHRoIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0YWJCYXJXaWR0aCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50YWJCYXJXaWR0aCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICAgICAgb2JqLnRhYkJhcldpZHRoID0gdmFsdWUyOwogICAgICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90YWJCYXJXaWR0aF9pbml0aWFsaXplcnMsIF90YWJCYXJXaWR0aF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgICAgICBfX2VzRGVjb3JhdGU4NSh0aGlzLCBudWxsLCBfc2hvd1RhYkJhcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93VGFiQmFyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93VGFiQmFyIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dUYWJCYXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgICAgIG9iai5zaG93VGFiQmFyID0gdmFsdWUyOwogICAgICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93VGFiQmFyX2luaXRpYWxpemVycywgX3Nob3dUYWJCYXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgX19lc0RlY29yYXRlODUodGhpcywgbnVsbCwgX3RhYnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGFicyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGFicyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50YWJzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgICAgICBvYmoudGFicyA9IHZhbHVlMjsKICAgICAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGFic19pbml0aWFsaXplcnMsIF90YWJzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgICAgIF9fZXNEZWNvcmF0ZTg1KHRoaXMsIG51bGwsIF9hY3RpdmVUYWJJZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhY3RpdmVUYWJJZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYWN0aXZlVGFiSWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWN0aXZlVGFiSWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgICAgIG9iai5hY3RpdmVUYWJJZCA9IHZhbHVlMjsKICAgICAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYWN0aXZlVGFiSWRfaW5pdGlhbGl6ZXJzLCBfYWN0aXZlVGFiSWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgX19lc0RlY29yYXRlODUobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgRGVlc1dvcmtzcGFjZVRlcm1pbmFsMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZGVtbyA9ICgpID0+IHsKICAgICAgICAgIGNvbnN0IGVudjIgPSBuZXcgV2ViQ29udGFpbmVyRW52aXJvbm1lbnQoKTsKICAgICAgICAgIHJldHVybiBiMmA8ZGVlcy13b3Jrc3BhY2UtdGVybWluYWwgLmV4ZWN1dGlvbkVudmlyb25tZW50PSR7ZW52Mn0+PC9kZWVzLXdvcmtzcGFjZS10ZXJtaW5hbD5gOwogICAgICAgIH07CiAgICAgICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIldvcmtzcGFjZSJdOwogICAgICAgIC8vIElOU1RBTkNFCiAgICAgICAgcmVzaXplT2JzZXJ2ZXI7CiAgICAgICAgdGFiTWFuYWdlcjsKICAgICAgICAjZXhlY3V0aW9uRW52aXJvbm1lbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzODYodGhpcywgX2V4ZWN1dGlvbkVudmlyb25tZW50X2luaXRpYWxpemVycywgbnVsbCk7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCAocmVxdWlyZWQpLgogICAgICAgICAqIFVzZSBXZWJDb250YWluZXJFbnZpcm9ubWVudCBmb3IgYnJvd3Nlci1iYXNlZCBleGVjdXRpb24uCiAgICAgICAgICovCiAgICAgICAgZ2V0IGV4ZWN1dGlvbkVudmlyb25tZW50KCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuI2V4ZWN1dGlvbkVudmlyb25tZW50X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICAgICAgfQogICAgICAgIHNldCBleGVjdXRpb25FbnZpcm9ubWVudCh2YWx1ZTIpIHsKICAgICAgICAgIHRoaXMuI2V4ZWN1dGlvbkVudmlyb25tZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgICNzZXR1cENvbW1hbmRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczg2KHRoaXMsIF9leGVjdXRpb25FbnZpcm9ubWVudF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODYodGhpcywgX3NldHVwQ29tbWFuZF9pbml0aWFsaXplcnMsICIiKSk7CiAgICAgICAgZ2V0IHNldHVwQ29tbWFuZCgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiNzZXR1cENvbW1hbmRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgICAgICB9CiAgICAgICAgc2V0IHNldHVwQ29tbWFuZCh2YWx1ZTIpIHsKICAgICAgICAgIHRoaXMuI3NldHVwQ29tbWFuZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgICAjZW52aXJvbm1lbnRWYXJpYWJsZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczg2KHRoaXMsIF9zZXR1cENvbW1hbmRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczg2KHRoaXMsIF9lbnZpcm9ubWVudFZhcmlhYmxlc19pbml0aWFsaXplcnMsIHt9KSk7CiAgICAgICAgLyoqCiAgICAgICAgICogRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNldCBpbiB0aGUgc2hlbGwKICAgICAgICAgKi8KICAgICAgICBnZXQgZW52aXJvbm1lbnRWYXJpYWJsZXMoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4jZW52aXJvbm1lbnRWYXJpYWJsZXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgICAgICB9CiAgICAgICAgc2V0IGVudmlyb25tZW50VmFyaWFibGVzKHZhbHVlMikgewogICAgICAgICAgdGhpcy4jZW52aXJvbm1lbnRWYXJpYWJsZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgICAgICB9CiAgICAgICAgI3RhYkJhcldpZHRoX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4Nih0aGlzLCBfZW52aXJvbm1lbnRWYXJpYWJsZXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczg2KHRoaXMsIF90YWJCYXJXaWR0aF9pbml0aWFsaXplcnMsIDE2MCkpOwogICAgICAgIC8qKgogICAgICAgICAqIFdpZHRoIG9mIHRoZSB0YWIgYmFyIGluIHBpeGVscwogICAgICAgICAqLwogICAgICAgIGdldCB0YWJCYXJXaWR0aCgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiN0YWJCYXJXaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgICAgIH0KICAgICAgICBzZXQgdGFiQmFyV2lkdGgodmFsdWUyKSB7CiAgICAgICAgICB0aGlzLiN0YWJCYXJXaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgICAjc2hvd1RhYkJhcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODYodGhpcywgX3RhYkJhcldpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4Nih0aGlzLCBfc2hvd1RhYkJhcl9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIHRhYiBiYXIKICAgICAgICAgKi8KICAgICAgICBnZXQgc2hvd1RhYkJhcigpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiNzaG93VGFiQmFyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICAgICAgfQogICAgICAgIHNldCBzaG93VGFiQmFyKHZhbHVlMikgewogICAgICAgICAgdGhpcy4jc2hvd1RhYkJhcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgICAjdGFic19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODYodGhpcywgX3Nob3dUYWJCYXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczg2KHRoaXMsIF90YWJzX2luaXRpYWxpemVycywgW10pKTsKICAgICAgICAvLyBUYWIgc3RhdGUKICAgICAgICBnZXQgdGFicygpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiN0YWJzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICAgICAgfQogICAgICAgIHNldCB0YWJzKHZhbHVlMikgewogICAgICAgICAgdGhpcy4jdGFic19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgICAjYWN0aXZlVGFiSWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczg2KHRoaXMsIF90YWJzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4Nih0aGlzLCBfYWN0aXZlVGFiSWRfaW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICAgICAgZ2V0IGFjdGl2ZVRhYklkKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuI2FjdGl2ZVRhYklkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICAgICAgfQogICAgICAgIHNldCBhY3RpdmVUYWJJZCh2YWx1ZTIpIHsKICAgICAgICAgIHRoaXMuI2FjdGl2ZVRhYklkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgIC8vIFRoZW1lIHN1YnNjcmlwdGlvbiBmb3IgZHluYW1pYyB0aGVtZSB1cGRhdGVzCiAgICAgICAgdGVybWluYWxUaGVtZVN1YnNjcmlwdGlvbiA9IChfX3J1bkluaXRpYWxpemVyczg2KHRoaXMsIF9hY3RpdmVUYWJJZF9leHRyYUluaXRpYWxpemVycyksIG51bGwpOwogICAgICAgIGlzQnJpZ2h0ID0gZmFsc2U7CiAgICAgICAgLy8gQWN0aW9uYmFyIHJlZmVyZW5jZSBmb3IgdGVybWluYWwtY29udGV4dCBub3RpZmljYXRpb25zCiAgICAgICAgdGVybWluYWxBY3Rpb25iYXIgPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBlbnZpcm9ubWVudCBpcyByZWFkeS4KICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZXhlY3V0aW9uRW52aXJvbm1lbnQgZGlyZWN0bHkKICAgICAgICAgKi8KICAgICAgICBlbnZpcm9ubWVudERlZmVycmVkID0gbmV3IGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cy5zbWFydHByb21pc2UuRGVmZXJyZWQoKTsKICAgICAgICBlbnZpcm9ubWVudFByb21pc2UgPSB0aGlzLmVudmlyb25tZW50RGVmZXJyZWQucHJvbWlzZTsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICB0aGlzLnRhYk1hbmFnZXIgPSBuZXcgVGVybWluYWxUYWJNYW5hZ2VyKCk7CiAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHsKICAgICAgICAgICAgdGhpcy5oYW5kbGVSZXNpemUoKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICAgICAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMwMDAwMDAiKX07CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KCiAgICAgICogewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgIC50ZXJtaW5hbC1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC50ZXJtaW5hbC1jb250ZW50IHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMwMDAwMDAiKX07CiAgICAgIH0KCiAgICAgICNhY3RpdmUtdGVybWluYWwtY29udGFpbmVyIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIG1hcmdpbjogMjBweDsKICAgICAgfQoKICAgICAgLnRlcm1pbmFsLWNvbnRlbnQgZGVlcy1hY3Rpb25iYXIgewogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAvKiBUYWIgYmFyIG9uIHRoZSByaWdodCBzaWRlICovCiAgICAgIC50YWItYmFyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk2JSkiLCAiaHNsKDAgMCUgNyUpIil9OwogICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg1JSkiLCAiaHNsKDAgMCUgMTUlKSIpfTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAudGFiLWJhci1oZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OCUpIiwgImhzbCgwIDAlIDEyJSkiKX07CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NSUpIiwgImhzbCgwIDAlIDU1JSkiKX07CiAgICAgIH0KCiAgICAgIC50YWItYmFyLXRpdGxlIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KCiAgICAgIC50YWItYmFyLWFjdGlvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiAycHg7CiAgICAgIH0KCiAgICAgIC50YWItYWN0aW9uIHsKICAgICAgICB3aWR0aDogMjJweDsKICAgICAgICBoZWlnaHQ6IDIycHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA1MCUpIiwgImhzbCgwIDAlIDYwJSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC50YWItYWN0aW9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODglKSIsICJoc2woMCAwJSAxNSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMzAlKSIsICJoc2woMCAwJSA4MCUpIil9OwogICAgICB9CgogICAgICAudGFiLWxpc3QgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KCiAgICAgIC50ZXJtaW5hbC10YWIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NSUpIiwgImhzbCgwIDAlIDYwJSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC50ZXJtaW5hbC10YWI6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5MCUpIiwgImhzbCgwIDAlIDEyJSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAyNSUpIiwgImhzbCgwIDAlIDgwJSkiKX07CiAgICAgIH0KCiAgICAgIC50ZXJtaW5hbC10YWIuYWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCAxMDAlIDk1JSkiLCAiaHNsKDIxMCAzMCUgMTUlKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgMTAwJSA0MCUpIiwgImhzbCgyMTAgMTAwJSA3MCUpIil9OwogICAgICB9CgogICAgICAudGVybWluYWwtdGFiLmV4aXRlZCB7CiAgICAgICAgb3BhY2l0eTogMC43OwogICAgICB9CgogICAgICAudGFiLWljb24gewogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAudGFiLWljb24ucnVubmluZyB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyIDcwJSA0MCUpIiwgImhzbCgxNDIgNzAlIDU1JSkiKX07CiAgICAgIH0KCiAgICAgIC50YWItbGFiZWwgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAuZXhpdC1iYWRnZSB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIHBhZGRpbmc6IDFweCA1cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5leGl0LWJhZGdlLnN1Y2Nlc3MgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyIDcwJSA5MCUpIiwgImhzbCgxNDIgMzAlIDIwJSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyIDcwJSAzNSUpIiwgImhzbCgxNDIgNzAlIDYwJSkiKX07CiAgICAgIH0KCiAgICAgIC5leGl0LWJhZGdlLmVycm9yIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzAlIDkzJSkiLCAiaHNsKDAgMzAlIDIwJSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA3MCUgNDUlKSIsICJoc2woMCA3MCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLnRhYi1jbG9zZSB7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLnRlcm1pbmFsLXRhYjpob3ZlciAudGFiLWNsb3NlIHsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgIH0KCiAgICAgIC50YWItY2xvc2U6aG92ZXIgewogICAgICAgIG9wYWNpdHk6IDEgIWltcG9ydGFudDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODUlKSIsICJoc2woMCAwJSAyNSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzAlIDUwJSkiLCAiaHNsKDAgNzAlIDYwJSkiKX07CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNTAlKSIsICJoc2woMCAwJSA1MCUpIil9OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBnYXA6IDhweDsKICAgICAgfQoKICAgICAgLyogeHRlcm0uanMgc3R5bGVzICovCiAgICAgIC54dGVybSB7CiAgICAgICAgZm9udC1mZWF0dXJlLXNldHRpbmdzOiAnbGlnYScgMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIC54dGVybS5mb2N1cywKICAgICAgLnh0ZXJtOmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICAueHRlcm0gLnh0ZXJtLWhlbHBlcnMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgfQoKICAgICAgLnh0ZXJtIC54dGVybS1oZWxwZXItdGV4dGFyZWEgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBsZWZ0OiAtOTk5OWVtOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWR0aDogMDsKICAgICAgICBoZWlnaHQ6IDA7CiAgICAgICAgei1pbmRleDogLTU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgfQoKICAgICAgLnh0ZXJtIC5jb21wb3NpdGlvbi12aWV3IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMDAwMDAwIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzMzMzMzMyIsICIjZmZmZmZmIil9OwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQoKICAgICAgLnh0ZXJtIC5jb21wb3NpdGlvbi12aWV3LmFjdGl2ZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC54dGVybSAueHRlcm0tdmlld3BvcnQgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMwMDAwMDAiKX07CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICB9CgogICAgICAueHRlcm0gLnh0ZXJtLXNjcmVlbiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAueHRlcm0gLnh0ZXJtLXNjcmVlbiBjYW52YXMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLnh0ZXJtIC54dGVybS1zY3JvbGwtYXJlYSB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAueHRlcm0tY2hhci1tZWFzdXJlLWVsZW1lbnQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAtOTk5OWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC54dGVybSB7CiAgICAgICAgY3Vyc29yOiB0ZXh0OwogICAgICB9CgogICAgICAueHRlcm0uZW5hYmxlLW1vdXNlLWV2ZW50cyB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICAueHRlcm0ueHRlcm0tY3Vyc29yLXBvaW50ZXIgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgLnh0ZXJtLmNvbHVtbi1zZWxlY3QuZm9jdXMgewogICAgICAgIGN1cnNvcjogY3Jvc3NoYWlyOwogICAgICB9CgogICAgICAueHRlcm0gLnh0ZXJtLWFjY2Vzc2liaWxpdHksCiAgICAgIC54dGVybSAueHRlcm0tbWVzc2FnZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgICBjb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC54dGVybSAubGl2ZS1yZWdpb24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAtOTk5OXB4OwogICAgICAgIHdpZHRoOiAxcHg7CiAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnh0ZXJtLWRpbSB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAueHRlcm0tdW5kZXJsaW5lIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQogICAgYAogICAgICAgIF07CiAgICAgICAgcmVuZGVyKCkgewogICAgICAgICAgY29uc3QgYWN0aXZlVGFiID0gdGhpcy5hY3RpdmVUYWJJZCA/IHRoaXMudGFiTWFuYWdlci5nZXRUYWIodGhpcy5hY3RpdmVUYWJJZCkgOiBudWxsOwogICAgICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJ0ZXJtaW5hbC1jb250YWluZXIiPgogICAgICAgIDwhLS0gTWFpbiB0ZXJtaW5hbCBhcmVhIC0tPgogICAgICAgIDxkaXYgY2xhc3M9InRlcm1pbmFsLWNvbnRlbnQiPgogICAgICAgICAgJHthY3RpdmVUYWIgPyBiMmAKICAgICAgICAgICAgPGRpdiBpZD0iYWN0aXZlLXRlcm1pbmFsLWNvbnRhaW5lciI+PC9kaXY+CiAgICAgICAgICBgIDogYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlIj4KICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTp0ZXJtaW5hbCJ9IGljb25TaXplPSIzMiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgPHNwYW4+Tm8gdGVybWluYWwgb3Blbjwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgfQogICAgICAgICAgPGRlZXMtYWN0aW9uYmFyPjwvZGVlcy1hY3Rpb25iYXI+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDwhLS0gVmVydGljYWwgdGFiIGJhciBvbiB0aGUgcmlnaHQgLS0+CiAgICAgICAgJHt0aGlzLnNob3dUYWJCYXIgPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9InRhYi1iYXIiIHN0eWxlPSJ3aWR0aDogJHt0aGlzLnRhYkJhcldpZHRofXB4Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiLWJhci1oZWFkZXIiPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWItYmFyLXRpdGxlIj5UZXJtaW5hbHM8L3NwYW4+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiLWJhci1hY3Rpb25zIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYi1hY3Rpb24iIEBjbGljaz0ke3RoaXMuaGFuZGxlQWRkVGFifSB0aXRsZT0iTmV3IFRlcm1pbmFsIj4KICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6cGx1cyJ9IGljb25TaXplPSIxNCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWItbGlzdCI+CiAgICAgICAgICAgICAgJHt0aGlzLnRhYnMubWFwKCh0YWIyKSA9PiBiMmAKICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgY2xhc3M9InRlcm1pbmFsLXRhYiAke3RhYjIuaWQgPT09IHRoaXMuYWN0aXZlVGFiSWQgPyAiYWN0aXZlIiA6ICIifSAke3RhYjIuZXhpdGVkID8gImV4aXRlZCIgOiAiIn0iCiAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuc3dpdGNoVG9UYWIodGFiMi5pZCl9CiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIDxkZWVzLWljb24KICAgICAgICAgICAgICAgICAgICAuaWNvbj0ke3RhYjIuaWNvbk5hbWV9CiAgICAgICAgICAgICAgICAgICAgaWNvblNpemU9IjE0IgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJ0YWItaWNvbiAke3RhYjIucHJvY2VzcyAmJiAhdGFiMi5leGl0ZWQgPyAicnVubmluZyIgOiAiIn0iCiAgICAgICAgICAgICAgICAgID48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhYi1sYWJlbCI+JHt0YWIyLmxhYmVsfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgJHt0YWIyLmV4aXRlZCA/IGIyYAogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJleGl0LWJhZGdlICR7dGFiMi5leGl0Q29kZSA9PT0gMCA/ICJzdWNjZXNzIiA6ICJlcnJvciJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICR7dGFiMi5leGl0Q29kZX0KICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICAgICAgJHt0YWIyLmNsb3NlYWJsZSA/IGIyYAogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWItY2xvc2UiIEBjbGljaz0keyhlMTEpID0+IHRoaXMuaGFuZGxlVGFiQ2xvc2UoZTExLCB0YWIyLmlkKX0+CiAgICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTp4In0gaWNvblNpemU9IjEyIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIGApfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGAgOiAiIn0KICAgICAgPC9kaXY+CiAgICBgOwogICAgICAgIH0KICAgICAgICBhc3luYyBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgICAgICBjb25zdCBkb210b29sc0luc3RhbmNlID0gYXdhaXQgdGhpcy5kb210b29sc1Byb21pc2U7CiAgICAgICAgICB0aGlzLmlzQnJpZ2h0ID0gZG9tdG9vbHNJbnN0YW5jZS50aGVtZU1hbmFnZXIuZ29CcmlnaHRCb29sZWFuOwogICAgICAgICAgdGhpcy50ZXJtaW5hbFRoZW1lU3Vic2NyaXB0aW9uID0gZG9tdG9vbHNJbnN0YW5jZS50aGVtZU1hbmFnZXIudGhlbWVPYnNlcnZhYmxlLnN1YnNjcmliZSgoZ29CcmlnaHQpID0+IHsKICAgICAgICAgICAgdGhpcy5pc0JyaWdodCA9IGdvQnJpZ2h0OwogICAgICAgICAgICB0aGlzLnRhYk1hbmFnZXIudXBkYXRlQWxsVGhlbWVzKGdvQnJpZ2h0KTsKICAgICAgICAgIH0pOwogICAgICAgICAgY29uc3QgbGliTG9hZGVyID0gRGVlc1NlcnZpY2VMaWJMb2FkZXIuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgIGNvbnN0IFt4dGVybUJ1bmRsZSwgZml0QWRkb25CdW5kbGVdID0gYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgICAgICAgICBsaWJMb2FkZXIubG9hZFh0ZXJtKCksCiAgICAgICAgICAgIGxpYkxvYWRlci5sb2FkWHRlcm1GaXRBZGRvbigpCiAgICAgICAgICBdKTsKICAgICAgICAgIHRoaXMudGFiTWFuYWdlci5zZXRYdGVybU1vZHVsZXMoeHRlcm1CdW5kbGUsIGZpdEFkZG9uQnVuZGxlKTsKICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlU2hlbGxUYWIoKTsKICAgICAgICB9CiAgICAgICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgICBhd2FpdCBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIH0KICAgICAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQoImFjdGl2ZS10ZXJtaW5hbC1jb250YWluZXIiKTsKICAgICAgICAgIGlmIChjb250YWluZXIpIHsKICAgICAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci51bm9ic2VydmUoY29udGFpbmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLnRlcm1pbmFsVGhlbWVTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgdGhpcy50ZXJtaW5hbFRoZW1lU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIHRoaXMudGVybWluYWxUaGVtZVN1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLnRhYk1hbmFnZXIuZGlzcG9zZUFsbCgpOwogICAgICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICB9CiAgICAgICAgLy8gPT09PT09PT09PSBUYWIgTWFuYWdlbWVudCA9PT09PT09PT09CiAgICAgICAgYXN5bmMgaGFuZGxlQWRkVGFiKCkgewogICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVTaGVsbFRhYigpOwogICAgICAgIH0KICAgICAgICBoYW5kbGVUYWJDbG9zZShlMTEsIHRhYklkKSB7CiAgICAgICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICB0aGlzLmNsb3NlVGFiKHRhYklkKTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoVG9UYWIodGFiSWQpIHsKICAgICAgICAgIGlmICh0YWJJZCA9PT0gdGhpcy5hY3RpdmVUYWJJZCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY29uc3QgdGFiMiA9IHRoaXMudGFiTWFuYWdlci5nZXRUYWIodGFiSWQpOwogICAgICAgICAgaWYgKCF0YWIyKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjb25zdCBwcmV2aW91c1RhYklkID0gdGhpcy5hY3RpdmVUYWJJZDsKICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVRhYklkKSB7CiAgICAgICAgICAgIHRoaXMuZGV0YWNoQWN0aXZlVGVybWluYWwoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuYWN0aXZlVGFiSWQgPSB0YWJJZDsKICAgICAgICAgIHRoaXMudGFicyA9IHRoaXMudGFiTWFuYWdlci5nZXRBbGxUYWJzKCk7CiAgICAgICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4gewogICAgICAgICAgICB0aGlzLmF0dGFjaFRlcm1pbmFsVG9Db250YWluZXIodGFiMik7CiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInRhYi1zd2l0Y2hlZCIsIHsKICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLAogICAgICAgICAgICAgIGRldGFpbDogeyB0YWJJZCwgcHJldmlvdXNUYWJJZCB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBkZXRhY2hBY3RpdmVUZXJtaW5hbCgpIHsKICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQoImFjdGl2ZS10ZXJtaW5hbC1jb250YWluZXIiKTsKICAgICAgICAgIGlmIChjb250YWluZXIpIHsKICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICIiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBhdHRhY2hUZXJtaW5hbFRvQ29udGFpbmVyKHRhYjIpIHsKICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQoImFjdGl2ZS10ZXJtaW5hbC1jb250YWluZXIiKTsKICAgICAgICAgIGlmICghY29udGFpbmVyKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyKTsKICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAiIjsKICAgICAgICAgIHRhYjIudGVybWluYWwub3Blbihjb250YWluZXIpOwogICAgICAgICAgdGFiMi5maXRBZGRvbi5maXQoKTsKICAgICAgICAgIHRhYjIudGVybWluYWwuZm9jdXMoKTsKICAgICAgICB9CiAgICAgICAgaGFuZGxlUmVzaXplKCkgewogICAgICAgICAgaWYgKHRoaXMuYWN0aXZlVGFiSWQpIHsKICAgICAgICAgICAgY29uc3QgdGFiMiA9IHRoaXMudGFiTWFuYWdlci5nZXRUYWIodGhpcy5hY3RpdmVUYWJJZCk7CiAgICAgICAgICAgIGlmICh0YWIyKSB7CiAgICAgICAgICAgICAgdGFiMi5maXRBZGRvbi5maXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyA9PT09PT09PT09IFByb2Nlc3MgTWFuYWdlbWVudCA9PT09PT09PT09CiAgICAgICAgYXN5bmMgc3Bhd25Qcm9jZXNzRm9yVGFiKHRhYjIsIGNvbW1hbmQsIGFyZ3MgPSBbXSkgewogICAgICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KSB7CiAgICAgICAgICAgIHRhYjIudGVybWluYWwud3JpdGUoIlx4MUJbMzFtIik7CiAgICAgICAgICAgIHRhYjIudGVybWluYWwud3JpdGUoIlx1Mjc0QyBObyBleGVjdXRpb24gZW52aXJvbm1lbnQgYXZhaWxhYmxlLlxyXG4iKTsKICAgICAgICAgICAgdGFiMi50ZXJtaW5hbC53cml0ZSgiXHgxQlswbSIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZHkpIHsKICAgICAgICAgICAgICB0YWIyLnRlcm1pbmFsLndyaXRlKCJJbml0aWFsaXppbmcgZW52aXJvbm1lbnQuLi5cclxuIik7CiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5pbml0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcHJvY2VzczQgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnNwYXduKGNvbW1hbmQsIGFyZ3MpOwogICAgICAgICAgICBwcm9jZXNzNC5vdXRwdXQucGlwZVRvKG5ldyBXcml0YWJsZVN0cmVhbSh7CiAgICAgICAgICAgICAgd3JpdGU6IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgICB0YWIyLnRlcm1pbmFsLndyaXRlKGRhdGEpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBjb25zdCBpbnB1dFdyaXRlciA9IHByb2Nlc3M0LmlucHV0LmdldFdyaXRlcigpOwogICAgICAgICAgICB0YWIyLnRlcm1pbmFsLm9uRGF0YSgoZGF0YSkgPT4gewogICAgICAgICAgICAgIGlucHV0V3JpdGVyLndyaXRlKGRhdGEpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy50YWJNYW5hZ2VyLnNldFRhYlByb2Nlc3ModGFiMi5pZCwgcHJvY2VzczQsIGlucHV0V3JpdGVyKTsKICAgICAgICAgICAgdGhpcy50YWJzID0gdGhpcy50YWJNYW5hZ2VyLmdldEFsbFRhYnMoKTsKICAgICAgICAgICAgcHJvY2VzczQuZXhpdC50aGVuKChleGl0Q29kZSkgPT4gewogICAgICAgICAgICAgIHRoaXMuaGFuZGxlUHJvY2Vzc0V4aXQodGFiMi5pZCwgZXhpdENvZGUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHRhYjIudGVybWluYWwud3JpdGUoIlx4MUJbMzFtIik7CiAgICAgICAgICAgIHRhYjIudGVybWluYWwud3JpdGUoYFx1Mjc0QyBGYWlsZWQgdG8gc3Bhd24gcHJvY2VzczogJHtlcnJvcn1ccgpgKTsKICAgICAgICAgICAgdGFiMi50ZXJtaW5hbC53cml0ZSgiXHgxQlswbSIpOwogICAgICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gc3Bhd24gcHJvY2VzczoiLCBlcnJvcik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGhhbmRsZVByb2Nlc3NFeGl0KHRhYklkLCBleGl0Q29kZSkgewogICAgICAgICAgY29uc3QgdGFiMiA9IHRoaXMudGFiTWFuYWdlci5nZXRUYWIodGFiSWQpOwogICAgICAgICAgaWYgKCF0YWIyKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB0aGlzLnRhYk1hbmFnZXIubWFya1RhYkV4aXRlZCh0YWJJZCwgZXhpdENvZGUpOwogICAgICAgICAgY29uc3QgbWVzc2FnZTIgPSBleGl0Q29kZSA9PT0gMCA/ICJcclxuXHgxQlszMm1bUHJvY2VzcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XVx4MUJbMG1cclxuIiA6IGBccgpceDFCWzMxbVtQcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJHtleGl0Q29kZX1dXHgxQlswbVxyCmA7CiAgICAgICAgICB0YWIyLnRlcm1pbmFsLndyaXRlKG1lc3NhZ2UyKTsKICAgICAgICAgIHRoaXMudGFicyA9IHRoaXMudGFiTWFuYWdlci5nZXRBbGxUYWJzKCk7CiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJwcm9jZXNzLWNvbXBsZXRlIiwgewogICAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgICBjb21wb3NlZDogdHJ1ZSwKICAgICAgICAgICAgZGV0YWlsOiB7IHRhYklkLCBleGl0Q29kZSB9CiAgICAgICAgICB9KSk7CiAgICAgICAgICBpZiAodGFiMi5jbG9zZWFibGUpIHsKICAgICAgICAgICAgdGhpcy5zaG93RXhpdGVkVGFiQWN0aW9uYmFyKHRhYklkLCB0YWIyLmxhYmVsLCBleGl0Q29kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNob3cgYWN0aW9uYmFyIG9mZmVyaW5nIHRvIGNsb3NlIGFuIGV4aXRlZCB0YWIKICAgICAgICAgKi8KICAgICAgICBhc3luYyBzaG93RXhpdGVkVGFiQWN0aW9uYmFyKHRhYklkLCB0YWJMYWJlbCwgZXhpdENvZGUpIHsKICAgICAgICAgIGNvbnN0IGlzU3VjY2VzcyA9IGV4aXRDb2RlID09PSAwOwogICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaG93QWN0aW9uYmFyKHsKICAgICAgICAgICAgbWVzc2FnZTogaXNTdWNjZXNzID8gYCIke3RhYkxhYmVsfSIgY29tcGxldGVkLiBDbG9zZSB0YWI/YCA6IGAiJHt0YWJMYWJlbH0iIGV4aXRlZCAoY29kZSAke2V4aXRDb2RlfSkuIENsb3NlIHRhYj9gLAogICAgICAgICAgICB0eXBlOiBpc1N1Y2Nlc3MgPyAiaW5mbyIgOiAid2FybmluZyIsCiAgICAgICAgICAgIGljb246IGlzU3VjY2VzcyA/ICJsdWNpZGU6Y2hlY2tDaXJjbGUiIDogImx1Y2lkZTphbGVydFRyaWFuZ2xlIiwKICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgIHsgaWQ6ICJjbG9zZSIsIGxhYmVsOiAiQ2xvc2UgVGFiIiwgcHJpbWFyeTogdHJ1ZSB9LAogICAgICAgICAgICAgIHsgaWQ6ICJrZWVwIiwgbGFiZWw6ICJLZWVwIE9wZW4iIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgdGltZW91dDogeyBkdXJhdGlvbjogMWU0LCBkZWZhdWx0QWN0aW9uSWQ6ICJjbG9zZSIgfSwKICAgICAgICAgICAgZGlzbWlzc2libGU6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKHJlc3VsdC5hY3Rpb25JZCA9PT0gImNsb3NlIikgewogICAgICAgICAgICB0aGlzLmNsb3NlVGFiKHRhYklkKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gPT09PT09PT09PSBQdWJsaWMgQVBJID09PT09PT09PT0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgYSBuZXcgc2hlbGwgdGFiCiAgICAgICAgICovCiAgICAgICAgYXN5bmMgY3JlYXRlU2hlbGxUYWIobGFiZWwpIHsKICAgICAgICAgIGNvbnN0IHRhYjIgPSB0aGlzLnRhYk1hbmFnZXIuY3JlYXRlVGFiKHsKICAgICAgICAgICAgdHlwZTogInNoZWxsIiwKICAgICAgICAgICAgbGFiZWw6IGxhYmVsIHx8IGBiYXNoICR7dGhpcy50YWJNYW5hZ2VyLmdldFRhYkNvdW50KCkgKyAxfWAsCiAgICAgICAgICAgIGNsb3NlYWJsZTogdGhpcy50YWJNYW5hZ2VyLmdldFRhYkNvdW50KCkgPiAwCiAgICAgICAgICAgIC8vIEZpcnN0IHRhYiBub3QgY2xvc2VhYmxlCiAgICAgICAgICB9LCB0aGlzLmlzQnJpZ2h0KTsKICAgICAgICAgIHRoaXMudGFicyA9IHRoaXMudGFiTWFuYWdlci5nZXRBbGxUYWJzKCk7CiAgICAgICAgICB0aGlzLnN3aXRjaFRvVGFiKHRhYjIuaWQpOwogICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgICAgIGF3YWl0IHRoaXMuc3Bhd25Qcm9jZXNzRm9yVGFiKHRhYjIsICJqc2giKTsKICAgICAgICAgIGlmICh0aGlzLnRhYk1hbmFnZXIuZ2V0VGFiQ291bnQoKSA9PT0gMSAmJiB0aGlzLnNldHVwQ29tbWFuZCkgewogICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JQcm9tcHQodGFiMi50ZXJtaW5hbCwgIn4vIik7CiAgICAgICAgICAgIGlmICh0YWIyLmlucHV0V3JpdGVyKSB7CiAgICAgICAgICAgICAgdGFiMi5pbnB1dFdyaXRlci53cml0ZSh0aGlzLnNldHVwQ29tbWFuZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInRhYi1jcmVhdGVkIiwgewogICAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgICBjb21wb3NlZDogdHJ1ZSwKICAgICAgICAgICAgZGV0YWlsOiB7IHRhYklkOiB0YWIyLmlkIH0KICAgICAgICAgIH0pKTsKICAgICAgICAgIHJldHVybiB0YWIyLmlkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgYSB0ZXJtaW5hbCB0YWIgZm9yIHJ1bm5pbmcgYSBwcm9jZXNzCiAgICAgICAgICovCiAgICAgICAgYXN5bmMgY3JlYXRlUHJvY2Vzc1RhYihvcHRpb25zKSB7CiAgICAgICAgICBjb25zdCB0YWIyID0gdGhpcy50YWJNYW5hZ2VyLmNyZWF0ZVRhYihvcHRpb25zLCB0aGlzLmlzQnJpZ2h0KTsKICAgICAgICAgIHRoaXMudGFicyA9IHRoaXMudGFiTWFuYWdlci5nZXRBbGxUYWJzKCk7CiAgICAgICAgICBpZiAob3B0aW9ucy5zd2l0Y2hUb1RhYiAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgdGhpcy5zd2l0Y2hUb1RhYih0YWIyLmlkKTsKICAgICAgICAgIH0KICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7CiAgICAgICAgICBpZiAob3B0aW9ucy5jb21tYW5kKSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3Bhd25Qcm9jZXNzRm9yVGFiKHRhYjIsIG9wdGlvbnMuY29tbWFuZCwgb3B0aW9ucy5hcmdzKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInRhYi1jcmVhdGVkIiwgewogICAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgICBjb21wb3NlZDogdHJ1ZSwKICAgICAgICAgICAgZGV0YWlsOiB7IHRhYklkOiB0YWIyLmlkIH0KICAgICAgICAgIH0pKTsKICAgICAgICAgIHJldHVybiB0YWIyLmlkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGFiCiAgICAgICAgICovCiAgICAgICAgZ2V0QWN0aXZlVGFiKCkgewogICAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZVRhYklkKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIHJldHVybiB0aGlzLnRhYk1hbmFnZXIuZ2V0VGFiKHRoaXMuYWN0aXZlVGFiSWQpIHx8IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldCBhbGwgdGFicwogICAgICAgICAqLwogICAgICAgIGdldFRhYnMoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy50YWJNYW5hZ2VyLmdldEFsbFRhYnMoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU3dpdGNoIHRvIGEgc3BlY2lmaWMgdGFiIGJ5IElECiAgICAgICAgICovCiAgICAgICAgc2VsZWN0VGFiKHRhYklkKSB7CiAgICAgICAgICBpZiAoIXRoaXMudGFiTWFuYWdlci5oYXNUYWIodGFiSWQpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB0aGlzLnN3aXRjaFRvVGFiKHRhYklkKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDbG9zZSBhIHRhYiBieSBJRAogICAgICAgICAqLwogICAgICAgIGNsb3NlVGFiKHRhYklkKSB7CiAgICAgICAgICBjb25zdCB0YWIyID0gdGhpcy50YWJNYW5hZ2VyLmdldFRhYih0YWJJZCk7CiAgICAgICAgICBpZiAoIXRhYjIgfHwgIXRhYjIuY2xvc2VhYmxlKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICBpZiAodGFiSWQgPT09IHRoaXMuYWN0aXZlVGFiSWQpIHsKICAgICAgICAgICAgY29uc3QgYWxsVGFicyA9IHRoaXMudGFiTWFuYWdlci5nZXRBbGxUYWJzKCk7CiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGFsbFRhYnMuZmluZEluZGV4KCh0OSkgPT4gdDkuaWQgPT09IHRhYklkKTsKICAgICAgICAgICAgY29uc3QgbmV4dFRhYiA9IGFsbFRhYnNbY3VycmVudEluZGV4ICsgMV0gfHwgYWxsVGFic1tjdXJyZW50SW5kZXggLSAxXTsKICAgICAgICAgICAgaWYgKG5leHRUYWIpIHsKICAgICAgICAgICAgICB0aGlzLnN3aXRjaFRvVGFiKG5leHRUYWIuaWQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuYWN0aXZlVGFiSWQgPSBudWxsOwogICAgICAgICAgICAgIHRoaXMuZGV0YWNoQWN0aXZlVGVybWluYWwoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdGhpcy50YWJNYW5hZ2VyLmNsb3NlVGFiKHRhYklkKTsKICAgICAgICAgIHRoaXMudGFicyA9IHRoaXMudGFiTWFuYWdlci5nZXRBbGxUYWJzKCk7CiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJ0YWItY2xvc2VkIiwgewogICAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgICBjb21wb3NlZDogdHJ1ZSwKICAgICAgICAgICAgZGV0YWlsOiB7IHRhYklkIH0KICAgICAgICAgIH0pKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXcml0ZSBkYXRhIHRvIGEgdGFiJ3MgdGVybWluYWwKICAgICAgICAgKi8KICAgICAgICB3cml0ZVRvVGFiKHRhYklkLCBkYXRhKSB7CiAgICAgICAgICBjb25zdCB0YWIyID0gdGhpcy50YWJNYW5hZ2VyLmdldFRhYih0YWJJZCk7CiAgICAgICAgICBpZiAoIXRhYjIpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIHRhYjIudGVybWluYWwud3JpdGUoZGF0YSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2VuZCBpbnB1dCB0byBhIHRhYidzIHByb2Nlc3MgKGlmIGludGVyYWN0aXZlKQogICAgICAgICAqLwogICAgICAgIHNlbmRJbnB1dFRvVGFiKHRhYklkLCBkYXRhKSB7CiAgICAgICAgICBjb25zdCB0YWIyID0gdGhpcy50YWJNYW5hZ2VyLmdldFRhYih0YWJJZCk7CiAgICAgICAgICBpZiAoIXRhYjIgfHwgIXRhYjIuaW5wdXRXcml0ZXIpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIHRhYjIuaW5wdXRXcml0ZXIud3JpdGUoZGF0YSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2hvdyBhbiBhY3Rpb25iYXIgbm90aWZpY2F0aW9uIGluIHRoZSB0ZXJtaW5hbCBwYW5lbCBjb250ZXh0LgogICAgICAgICAqIFVzZSB0aGlzIGZvciB0ZXJtaW5hbC1yZWxhdGVkIGRlY2lzaW9ucyAoZS5nLiwgcmV0cnkgZmFpbGVkIHByb2Nlc3MsIGtpbGwgcHJvY2VzcywgZXRjLikKICAgICAgICAgKi8KICAgICAgICBhc3luYyBzaG93QWN0aW9uYmFyKG9wdGlvbnMpIHsKICAgICAgICAgIGlmICghdGhpcy50ZXJtaW5hbEFjdGlvbmJhcikgewogICAgICAgICAgICB0aGlzLnRlcm1pbmFsQWN0aW9uYmFyID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCJkZWVzLWFjdGlvbmJhciIpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRoaXMudGVybWluYWxBY3Rpb25iYXI/LnNob3cob3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIC8vID09PT09PT09PT0gVXRpbGl0eSBNZXRob2RzID09PT09PT09PT0KICAgICAgICBhc3luYyB3YWl0Rm9yUHJvbXB0KHRlcm0sIHByb21wdCkgewogICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlMikgPT4gewogICAgICAgICAgICBjb25zdCBjaGVja1Byb21wdCA9ICgpID0+IHsKICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IHRlcm0uYnVmZmVyLmFjdGl2ZTsKICAgICAgICAgICAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBsaW5lcy5sZW5ndGg7IGkxMSsrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBsaW5lID0gbGluZXMuZ2V0TGluZShpMTEpOwogICAgICAgICAgICAgICAgaWYgKGxpbmUgJiYgbGluZS50cmFuc2xhdGVUb1N0cmluZygpLmluY2x1ZGVzKHByb21wdCkpIHsKICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZTIoKTsKICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzZXRUaW1lb3V0KGNoZWNrUHJvbXB0LCAxMDApOwogICAgICAgICAgICB9OwogICAgICAgICAgICBjaGVja1Byb21wdCgpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGFzeW5jIHNldEVudmlyb25tZW50VmFyaWFibGVzKGVudkFyZykgewogICAgICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTm8gZXhlY3V0aW9uIGVudmlyb25tZW50IGF2YWlsYWJsZSIpOwogICAgICAgICAgfQogICAgICAgICAgbGV0IGVudkZpbGUgPSAiIjsKICAgICAgICAgIGZvciAoY29uc3Qga2V5MiBpbiBlbnZBcmcpIHsKICAgICAgICAgICAgZW52RmlsZSArPSBgZXhwb3J0ICR7a2V5Mn09IiR7ZW52QXJnW2tleTJdfSIKYDsKICAgICAgICAgIH0KICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQud3JpdGVGaWxlKCIvc291cmNlLmVudiIsIGVudkZpbGUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgZXhlY3V0aW9uIGVudmlyb25tZW50LgogICAgICAgICAqLwogICAgICAgIGdldEV4ZWN1dGlvbkVudmlyb25tZW50KCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQ7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyB7CiAgICAgICAgICBfX3J1bkluaXRpYWxpemVyczg2KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJldHVybiBEZWVzV29ya3NwYWNlVGVybWluYWwyID0gX2NsYXNzVGhpczsKICAgIH0pKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaHJvY2tzK3NtYXJ0cHJvbWlzZUAzLjEuMTAvbm9kZV9tb2R1bGVzL0BwdXNocm9ja3Mvc21hcnRwcm9taXNlL2Rpc3RfdHMvaW5kZXguanMKdmFyIHJlcXVpcmVfZGlzdF90czMgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNocm9ja3Mrc21hcnRwcm9taXNlQDMuMS4xMC9ub2RlX21vZHVsZXMvQHB1c2hyb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9pbmRleC5qcyIoZXhwb3J0cykgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMuZ2V0Rmlyc3RUcnVlT3JGYWxzZSA9IGV4cG9ydHMudGltZW91dEFuZENvbnRpbnVlID0gZXhwb3J0cy50aW1lb3V0V3JhcCA9IGV4cG9ydHMubWFwID0gZXhwb3J0cy5yZWplY3RlZFByb21pc2UgPSBleHBvcnRzLnJlc29sdmVkUHJvbWlzZSA9IGV4cG9ydHMuZGVmZXIgPSBleHBvcnRzLkRlZmVycmVkID0gdm9pZCAwOwogICAgdmFyIERlZmVycmVkMyA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgICAgICAgIHRoaXMucmVzb2x2ZSA9ICh2YWx1ZUFyZykgPT4gewogICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICJmdWxmaWxsZWQiOwogICAgICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIHJlc29sdmUyKHZhbHVlQXJnKTsKICAgICAgICAgIH07CiAgICAgICAgICB0aGlzLnJlamVjdCA9IChyZWFzb24pID0+IHsKICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAicmVqZWN0ZWQiOwogICAgICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIHJlamVjdChyZWFzb24pOwogICAgICAgICAgfTsKICAgICAgICAgIHRoaXMuc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgIHRoaXMuc3RhdHVzID0gInBlbmRpbmciOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGdldCBkdXJhdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5zdG9wcGVkQXQpIHsKICAgICAgICAgIHJldHVybiB0aGlzLnN0b3BwZWRBdCAtIHRoaXMuc3RhcnRlZEF0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gRGF0ZS5ub3coKSAtIHRoaXMuc3RhcnRlZEF0OwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMuRGVmZXJyZWQgPSBEZWZlcnJlZDM7CiAgICBleHBvcnRzLmRlZmVyID0gKCkgPT4gewogICAgICByZXR1cm4gbmV3IERlZmVycmVkMygpOwogICAgfTsKICAgIGV4cG9ydHMucmVzb2x2ZWRQcm9taXNlID0gKHZhbHVlMikgPT4gewogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlMik7CiAgICB9OwogICAgZXhwb3J0cy5yZWplY3RlZFByb21pc2UgPSAoZXJyKSA9PiB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpOwogICAgfTsKICAgIGV4cG9ydHMubWFwID0gYXN5bmMgKGlucHV0QXJnLCBmdW5jdGlvbkFyZykgPT4gewogICAgICBjb25zdCBwcm9taXNlQXJyYXkgPSBbXTsKICAgICAgY29uc3QgcmVzdWx0QXJyYXkgPSBbXTsKICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGlucHV0QXJnKSB7CiAgICAgICAgY29uc3QgcHJvbWlzZSA9IGZ1bmN0aW9uQXJnKGl0ZW0pOwogICAgICAgIHByb21pc2VBcnJheS5wdXNoKHByb21pc2UpOwogICAgICAgIHByb21pc2UudGhlbigoeDMpID0+IHsKICAgICAgICAgIHJlc3VsdEFycmF5LnB1c2goeDMpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VBcnJheSk7CiAgICAgIHJldHVybiByZXN1bHRBcnJheTsKICAgIH07CiAgICBleHBvcnRzLnRpbWVvdXRXcmFwID0gYXN5bmMgKHByb21pc2VBcmcsIHRpbWVvdXRJbk1zQXJnLCByZWplY3RBcmcgPSB0cnVlKSA9PiB7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdCkgPT4gewogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgaWYgKHJlamVjdEFyZykgewogICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCJ0aW1lb3V0IikpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzb2x2ZTIobnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgdGltZW91dEluTXNBcmcpOwogICAgICAgIHByb21pc2VBcmcudGhlbihyZXNvbHZlMiwgcmVqZWN0KTsKICAgICAgfSk7CiAgICB9OwogICAgZXhwb3J0cy50aW1lb3V0QW5kQ29udGludWUgPSBhc3luYyAocHJvbWlzZUFyZywgdGltZW91dEluTXNBcmcgPSA2ZTQpID0+IHsKICAgICAgcmV0dXJuIGV4cG9ydHMudGltZW91dFdyYXAocHJvbWlzZUFyZywgdGltZW91dEluTXNBcmcsIGZhbHNlKTsKICAgIH07CiAgICBleHBvcnRzLmdldEZpcnN0VHJ1ZU9yRmFsc2UgPSBhc3luYyAocHJvbWlzZXNBcmcpID0+IHsKICAgICAgY29uc3QgZG9uZSA9IGV4cG9ydHMuZGVmZXIoKTsKICAgICAgZm9yIChjb25zdCBwcm9taXNlQXJnIG9mIHByb21pc2VzQXJnKSB7CiAgICAgICAgcHJvbWlzZUFyZy50aGVuKChyZXN1bHRBcmcpID0+IHsKICAgICAgICAgIGlmIChyZXN1bHRBcmcgPT09IHRydWUpIHsKICAgICAgICAgICAgZG9uZS5yZXNvbHZlKHRydWUpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIFByb21pc2UuYWxsKHByb21pc2VzQXJnKS50aGVuKCgpID0+IHsKICAgICAgICBkb25lLnJlc29sdmUoZmFsc2UpOwogICAgICB9KTsKICAgICAgcmV0dXJuIGRvbmUucHJvbWlzZTsKICAgIH07CiAgfQp9KTsKCi8vIHRzX3dlYi9wbHVnaW5zLnRzCnZhciBwbHVnaW5zX2V4cG9ydHM1ID0ge307Cl9fZXhwb3J0KHBsdWdpbnNfZXhwb3J0czUsIHsKICBEZWVzRWxlbWVudDogKCkgPT4gRGVlc0VsZW1lbnQyLAogIGNzczogKCkgPT4gY3NzMiwKICBjc3NNYW5hZ2VyOiAoKSA9PiBjc3NNYW5hZ2VyMiwKICBjdXN0b21FbGVtZW50OiAoKSA9PiBjdXN0b21FbGVtZW50LAogIGRlZXNDYXRhbG9nOiAoKSA9PiBkaXN0X3RzX3dlYl9leHBvcnRzMiwKICBkZWVzRWxlbWVudDogKCkgPT4gZGlzdF90c19leHBvcnRzMjYsCiAgaHRtbDogKCkgPT4gaHRtbDcsCiAgcHJvcGVydHk6ICgpID0+IHByb3BlcnR5LAogIHNtYXJ0cng6ICgpID0+IGRpc3RfdHNfZXhwb3J0czIsCiAgc3RhdGU6ICgpID0+IHN0YXRlLAogIHR5cGVkcmVxdWVzdDogKCkgPT4gZGlzdF90c19leHBvcnRzMTUsCiAgdHlwZWRzb2NrZXQ6ICgpID0+IGRpc3RfdHNfZXhwb3J0czMwCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9pbmRleC5qcwp2YXIgZGlzdF90c193ZWJfZXhwb3J0czIgPSB7fTsKX19leHBvcnQoZGlzdF90c193ZWJfZXhwb3J0czIsIHsKICBDYW52YXNQb29sOiAoKSA9PiBDYW52YXNQb29sLAogIERlZXNBY3Rpb25iYXI6ICgpID0+IERlZXNBY3Rpb25iYXIsCiAgRGVlc0FwcHVpOiAoKSA9PiBEZWVzQXBwdWksCiAgRGVlc0FwcHVpQWN0aXZpdHlsb2c6ICgpID0+IERlZXNBcHB1aUFjdGl2aXR5bG9nLAogIERlZXNBcHB1aUJhcjogKCkgPT4gRGVlc0FwcHVpQmFyLAogIERlZXNBcHB1aUJvdHRvbWJhcjogKCkgPT4gRGVlc0FwcHVpQm90dG9tYmFyLAogIERlZXNBcHB1aU1haW5jb250ZW50OiAoKSA9PiBEZWVzQXBwdWlNYWluY29udGVudCwKICBEZWVzQXBwdWlNYWlubWVudTogKCkgPT4gRGVlc0FwcHVpTWFpbm1lbnUsCiAgRGVlc0FwcHVpUHJvZmlsZURyb3Bkb3duOiAoKSA9PiBEZWVzQXBwdWlQcm9maWxlRHJvcGRvd24sCiAgRGVlc0FwcHVpU2Vjb25kYXJ5bWVudTogKCkgPT4gRGVlc0FwcHVpU2Vjb25kYXJ5bWVudSwKICBEZWVzQXBwdWlUYWJzOiAoKSA9PiBEZWVzQXBwdWlUYWJzLAogIERlZXNBdWRpb1ZpZXdlcjogKCkgPT4gRGVlc0F1ZGlvVmlld2VyLAogIERlZXNCYWRnZTogKCkgPT4gRGVlc0JhZGdlLAogIERlZXNCdXR0b246ICgpID0+IERlZXNCdXR0b24sCiAgRGVlc0J1dHRvbkV4aXQ6ICgpID0+IERlZXNCdXR0b25FeGl0LAogIERlZXNCdXR0b25Hcm91cDogKCkgPT4gRGVlc0J1dHRvbkdyb3VwLAogIERlZXNDaGFydEFyZWE6ICgpID0+IERlZXNDaGFydEFyZWEsCiAgRGVlc0NoYXJ0TG9nOiAoKSA9PiBEZWVzQ2hhcnRMb2csCiAgRGVlc0NoaXBzOiAoKSA9PiBEZWVzQ2hpcHMsCiAgRGVlc0NvbnRleHRtZW51OiAoKSA9PiBEZWVzQ29udGV4dG1lbnUsCiAgRGVlc0Rhc2hib2FyZGdyaWQ6ICgpID0+IERlZXNEYXNoYm9hcmRncmlkLAogIERlZXNEYXRhdmlld0NvZGVib3g6ICgpID0+IERlZXNEYXRhdmlld0NvZGVib3gsCiAgRGVlc0RhdGF2aWV3U3RhdHVzb2JqZWN0OiAoKSA9PiBEZWVzRGF0YXZpZXdTdGF0dXNvYmplY3QsCiAgRGVlc0Zvcm06ICgpID0+IERlZXNGb3JtLAogIERlZXNGb3JtU3VibWl0OiAoKSA9PiBEZWVzRm9ybVN1Ym1pdCwKICBEZWVzRm9ybWF0dGluZ01lbnU6ICgpID0+IERlZXNGb3JtYXR0aW5nTWVudSwKICBEZWVzSGVhZGluZzogKCkgPT4gRGVlc0hlYWRpbmcsCiAgRGVlc0hpbnQ6ICgpID0+IERlZXNIaW50LAogIERlZXNJY29uOiAoKSA9PiBEZWVzSWNvbiwKICBEZWVzSW1hZ2VWaWV3ZXI6ICgpID0+IERlZXNJbWFnZVZpZXdlciwKICBEZWVzSW5wdXRCYXNlOiAoKSA9PiBEZWVzSW5wdXRCYXNlLAogIERlZXNJbnB1dENoZWNrYm94OiAoKSA9PiBEZWVzSW5wdXRDaGVja2JveCwKICBEZWVzSW5wdXRDb2RlOiAoKSA9PiBEZWVzSW5wdXRDb2RlLAogIERlZXNJbnB1dERhdGVwaWNrZXI6ICgpID0+IERlZXNJbnB1dERhdGVwaWNrZXIsCiAgRGVlc0lucHV0RHJvcGRvd246ICgpID0+IERlZXNJbnB1dERyb3Bkb3duLAogIERlZXNJbnB1dEZpbGV1cGxvYWQ6ICgpID0+IERlZXNJbnB1dEZpbGV1cGxvYWQsCiAgRGVlc0lucHV0SWJhbjogKCkgPT4gRGVlc0lucHV0SWJhbiwKICBEZWVzSW5wdXRMaXN0OiAoKSA9PiBEZWVzSW5wdXRMaXN0LAogIERlZXNJbnB1dE11bHRpdG9nZ2xlOiAoKSA9PiBEZWVzSW5wdXRNdWx0aXRvZ2dsZSwKICBEZWVzSW5wdXRQaG9uZTogKCkgPT4gRGVlc0lucHV0UGhvbmUsCiAgRGVlc0lucHV0UHJvZmlsZVBpY3R1cmU6ICgpID0+IERlZXNJbnB1dFByb2ZpbGVQaWN0dXJlLAogIERlZXNJbnB1dFF1YW50aXR5U2VsZWN0b3I6ICgpID0+IERlZXNJbnB1dFF1YW50aXR5U2VsZWN0b3IsCiAgRGVlc0lucHV0UmFkaW9ncm91cDogKCkgPT4gRGVlc0lucHV0UmFkaW9ncm91cCwKICBEZWVzSW5wdXRSaWNodGV4dDogKCkgPT4gRGVlc0lucHV0UmljaHRleHQsCiAgRGVlc0lucHV0VGFnczogKCkgPT4gRGVlc0lucHV0VGFncywKICBEZWVzSW5wdXRUZXh0OiAoKSA9PiBEZWVzSW5wdXRUZXh0LAogIERlZXNJbnB1dFRvZ2dsZTogKCkgPT4gRGVlc0lucHV0VG9nZ2xlLAogIERlZXNJbnB1dFR5cGVsaXN0OiAoKSA9PiBEZWVzSW5wdXRUeXBlbGlzdCwKICBEZWVzSW5wdXRXeXNpd3lnOiAoKSA9PiBEZWVzSW5wdXRXeXNpd3lnLAogIERlZXNMYWJlbDogKCkgPT4gRGVlc0xhYmVsLAogIERlZXNNb2JpbGVuYXZpZ2F0aW9uOiAoKSA9PiBEZWVzTW9iaWxlbmF2aWdhdGlvbiwKICBEZWVzTW9kYWw6ICgpID0+IERlZXNNb2RhbCwKICBEZWVzUGFnaW5hdGlvbjogKCkgPT4gRGVlc1BhZ2luYXRpb24sCiAgRGVlc1BhbmVsOiAoKSA9PiBEZWVzUGFuZWwsCiAgRGVlc1BkZjogKCkgPT4gRGVlc1BkZiwKICBEZWVzUGRmUHJldmlldzogKCkgPT4gRGVlc1BkZlByZXZpZXcsCiAgRGVlc1BkZlZpZXdlcjogKCkgPT4gRGVlc1BkZlZpZXdlciwKICBEZWVzUHJldmlldzogKCkgPT4gRGVlc1ByZXZpZXcsCiAgRGVlc1Byb2dyZXNzYmFyOiAoKSA9PiBEZWVzUHJvZ3Jlc3NiYXIsCiAgRGVlc1NlYXJjaGJhcjogKCkgPT4gRGVlc1NlYXJjaGJhciwKICBEZWVzU2hvcHBpbmdQcm9kdWN0Y2FyZDogKCkgPT4gRGVlc1Nob3BwaW5nUHJvZHVjdGNhcmQsCiAgRGVlc1NpbXBsZUFwcERhc2g6ICgpID0+IERlZXNTaW1wbGVBcHBEYXNoLAogIERlZXNTaW1wbGVMb2dpbjogKCkgPT4gRGVlc1NpbXBsZUxvZ2luLAogIERlZXNTbGFzaE1lbnU6ICgpID0+IERlZXNTbGFzaE1lbnUsCiAgRGVlc1NwZWVjaGJ1YmJsZTogKCkgPT4gRGVlc1NwZWVjaGJ1YmJsZSwKICBEZWVzU3Bpbm5lcjogKCkgPT4gRGVlc1NwaW5uZXIsCiAgRGVlc1N0YXRzR3JpZDogKCkgPT4gRGVlc1N0YXRzR3JpZCwKICBEZWVzU3RlcHBlcjogKCkgPT4gRGVlc1N0ZXBwZXIsCiAgRGVlc1RhYmxlOiAoKSA9PiBEZWVzVGFibGUsCiAgRGVlc1RoZW1lOiAoKSA9PiBEZWVzVGhlbWUsCiAgRGVlc1RpbGVBdWRpbzogKCkgPT4gRGVlc1RpbGVBdWRpbywKICBEZWVzVGlsZUJhc2U6ICgpID0+IERlZXNUaWxlQmFzZSwKICBEZWVzVGlsZUZvbGRlcjogKCkgPT4gRGVlc1RpbGVGb2xkZXIsCiAgRGVlc1RpbGVJbWFnZTogKCkgPT4gRGVlc1RpbGVJbWFnZSwKICBEZWVzVGlsZU5vdGU6ICgpID0+IERlZXNUaWxlTm90ZSwKICBEZWVzVGlsZVBkZjogKCkgPT4gRGVlc1RpbGVQZGYsCiAgRGVlc1RpbGVWaWRlbzogKCkgPT4gRGVlc1RpbGVWaWRlbywKICBEZWVzVG9hc3Q6ICgpID0+IERlZXNUb2FzdCwKICBEZWVzVXBkYXRlcjogKCkgPT4gRGVlc1VwZGF0ZXIsCiAgRGVlc1ZpZGVvVmlld2VyOiAoKSA9PiBEZWVzVmlkZW9WaWV3ZXIsCiAgRGVlc1dpbmRvd0NvbnRyb2xzOiAoKSA9PiBEZWVzV2luZG93Q29udHJvbHMsCiAgRGVlc1dpbmRvd0xheWVyOiAoKSA9PiBEZWVzV2luZG93TGF5ZXIsCiAgRGVlc1dvcmtzcGFjZTogKCkgPT4gRGVlc1dvcmtzcGFjZSwKICBEZWVzV29ya3NwYWNlQm90dG9tYmFyOiAoKSA9PiBEZWVzV29ya3NwYWNlQm90dG9tYmFyLAogIERlZXNXb3Jrc3BhY2VEaWZmRWRpdG9yOiAoKSA9PiBEZWVzV29ya3NwYWNlRGlmZkVkaXRvciwKICBEZWVzV29ya3NwYWNlRmlsZXRyZWU6ICgpID0+IERlZXNXb3Jrc3BhY2VGaWxldHJlZSwKICBEZWVzV29ya3NwYWNlTWFya2Rvd246ICgpID0+IERlZXNXb3Jrc3BhY2VNYXJrZG93biwKICBEZWVzV29ya3NwYWNlTWFya2Rvd25vdXRsZXQ6ICgpID0+IERlZXNXb3Jrc3BhY2VNYXJrZG93bm91dGxldCwKICBEZWVzV29ya3NwYWNlTW9uYWNvOiAoKSA9PiBEZWVzV29ya3NwYWNlTW9uYWNvLAogIERlZXNXb3Jrc3BhY2VUZXJtaW5hbDogKCkgPT4gRGVlc1dvcmtzcGFjZVRlcm1pbmFsLAogIERlZXNXb3Jrc3BhY2VUZXJtaW5hbFByZXZpZXc6ICgpID0+IERlZXNXb3Jrc3BhY2VUZXJtaW5hbFByZXZpZXcsCiAgRGVlc1d5c2l3eWdCbG9jazogKCkgPT4gRGVlc1d5c2l3eWdCbG9jaywKICBQUk9HUkFNTUlOR19MQU5HVUFHRVM6ICgpID0+IFBST0dSQU1NSU5HX0xBTkdVQUdFUywKICBQZGZNYW5hZ2VyOiAoKSA9PiBQZGZNYW5hZ2VyLAogIFBlcmZvcm1hbmNlTW9uaXRvcjogKCkgPT4gUGVyZm9ybWFuY2VNb25pdG9yLAogIFRlcm1pbmFsVGFiTWFuYWdlcjogKCkgPT4gVGVybWluYWxUYWJNYW5hZ2VyLAogIFR5cGVTY3JpcHRJbnRlbGxpU2Vuc2VNYW5hZ2VyOiAoKSA9PiBUeXBlU2NyaXB0SW50ZWxsaVNlbnNlTWFuYWdlciwKICBWaWV3UmVnaXN0cnk6ICgpID0+IFZpZXdSZWdpc3RyeSwKICBXZWJDb250YWluZXJFbnZpcm9ubWVudDogKCkgPT4gV2ViQ29udGFpbmVyRW52aXJvbm1lbnQsCiAgV3lzaXd5Z0Jsb2NrT3BlcmF0aW9uczogKCkgPT4gV3lzaXd5Z0Jsb2NrT3BlcmF0aW9ucywKICBXeXNpd3lnQmxvY2tzOiAoKSA9PiBXeXNpd3lnQmxvY2tzLAogIFd5c2l3eWdDb252ZXJ0ZXJzOiAoKSA9PiBXeXNpd3lnQ29udmVydGVycywKICBXeXNpd3lnRHJhZ0Ryb3BIYW5kbGVyOiAoKSA9PiBXeXNpd3lnRHJhZ0Ryb3BIYW5kbGVyLAogIFd5c2l3eWdGb3JtYXR0aW5nOiAoKSA9PiBXeXNpd3lnRm9ybWF0dGluZywKICBXeXNpd3lnSGlzdG9yeTogKCkgPT4gV3lzaXd5Z0hpc3RvcnksCiAgV3lzaXd5Z0lucHV0SGFuZGxlcjogKCkgPT4gV3lzaXd5Z0lucHV0SGFuZGxlciwKICBXeXNpd3lnS2V5Ym9hcmRIYW5kbGVyOiAoKSA9PiBXeXNpd3lnS2V5Ym9hcmRIYW5kbGVyLAogIFd5c2l3eWdNb2RhbE1hbmFnZXI6ICgpID0+IFd5c2l3eWdNb2RhbE1hbmFnZXIsCiAgV3lzaXd5Z1NlbGVjdGlvbjogKCkgPT4gV3lzaXd5Z1NlbGVjdGlvbiwKICBXeXNpd3lnU2hvcnRjdXRzOiAoKSA9PiBXeXNpd3lnU2hvcnRjdXRzLAogIFpJbmRleFJlZ2lzdHJ5OiAoKSA9PiBaSW5kZXhSZWdpc3RyeSwKICBjb2xvcnM6ICgpID0+IGNvbG9yc19leHBvcnRzLAogIGNvbW1pdGluZm86ICgpID0+IGNvbW1pdGluZm8sCiAgY29tcG9uZW50WkluZGV4OiAoKSA9PiBjb21wb25lbnRaSW5kZXgsCiAgZGVib3VuY2U6ICgpID0+IGRlYm91bmNlMywKICBmb3JtYXRGaWxlU2l6ZTogKCkgPT4gZm9ybWF0RmlsZVNpemUsCiAgZ2V0WkluZGV4OiAoKSA9PiBnZXRaSW5kZXgsCiAgaWNvbnM6ICgpID0+IGljb25zNCwKICBpc0luVmlld3BvcnQ6ICgpID0+IGlzSW5WaWV3cG9ydCwKICByZWdpc3RlckFsbEJsb2NrSGFuZGxlcnM6ICgpID0+IHJlZ2lzdGVyQWxsQmxvY2tIYW5kbGVycywKICB0aGVtZURlZmF1bHRTdHlsZXM6ICgpID0+IHRoZW1lRGVmYXVsdFN0eWxlcywKICB0aGVtZURlZmF1bHRzOiAoKSA9PiB0aGVtZURlZmF1bHRzLAogIHRocm90dGxlOiAoKSA9PiB0aHJvdHRsZTIsCiAgdGlsZUJhc2VTdHlsZXM6ICgpID0+IHRpbGVCYXNlU3R5bGVzLAogIHd5c2l3eWdTdHlsZXM6ICgpID0+IHd5c2l3eWdTdHlsZXMsCiAgekluZGV4TGF5ZXJzOiAoKSA9PiB6SW5kZXhMYXllcnMsCiAgekluZGV4UmVnaXN0cnk6ICgpID0+IHpJbmRleFJlZ2lzdHJ5Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMHppbmRleC5qcwp2YXIgekluZGV4TGF5ZXJzID0gewogIC8vIEJhc2UgbGF5ZXI6IFJlZ3VsYXIgY29udGVudAogIGJhc2U6IHsKICAgIGNvbnRlbnQ6ICJhdXRvIiwKICAgIGlucHV0RWxlbWVudHM6IDEKICB9LAogIC8vIEZpeGVkIFVJIGVsZW1lbnRzCiAgZml4ZWQ6IHsKICAgIGFwcEJhcjogMTAsCiAgICBzaWRlTWVudTogMTAsCiAgICBtb2JpbGVOYXY6IDI1MAogIH0sCiAgLy8gT3ZlcmxheSBiYWNrZHJvcHMgKHNlbWktdHJhbnNwYXJlbnQgYmFja2dyb3VuZHMpCiAgYmFja2Ryb3A6IHsKICAgIGRyb3Bkb3duOiAxOTk5LAogICAgLy8gQmVsb3cgbW9kYWxzIGJ1dCBhYm92ZSBmaXhlZCBlbGVtZW50cwogICAgbW9kYWw6IDI5OTksCiAgICAvLyBCZWxvdyBkcm9wZG93bnMgb24gbW9kYWxzCiAgICBjb250ZXh0TWVudTogMzk5OQogICAgLy8gQmVsb3cgY3JpdGljYWwgb3ZlcmxheXMKICB9LAogIC8vIEludGVyYWN0aXZlIG92ZXJsYXlzCiAgb3ZlcmxheTogewogICAgZHJvcGRvd246IDJlMywKICAgIC8vIERyb3Bkb3ducyBhbmQgc2VsZWN0IG1lbnVzCiAgICBtb2RhbDogM2UzLAogICAgLy8gTW9kYWwgZGlhbG9ncwogICAgY29udGV4dE1lbnU6IDRlMywKICAgIC8vIENvbnRleHQgbWVudXMgYW5kIHRvb2x0aXBzCiAgICB0b2FzdDogNWUzCiAgICAvLyBUb2FzdCBub3RpZmljYXRpb25zIChoaWdoZXN0IHByaW9yaXR5KQogIH0sCiAgLy8gU3BlY2lhbCBjYXNlcyBmb3IgbmVzdGVkIGVsZW1lbnRzCiAgbW9kYWxEcm9wZG93bjogMzUwMCwKICAvLyBEcm9wZG93bnMgaW5zaWRlIG1vZGFscwogIHd5c2l3eWdNZW51czogNDUwMAogIC8vIEVkaXRvciBmb3JtYXR0aW5nIG1lbnVzCn07CmZ1bmN0aW9uIGdldFpJbmRleChjYXRlZ29yeSwgc3ViY2F0ZWdvcnkpIHsKICBjb25zdCBjYXRlZ29yeU9iaiA9IHpJbmRleExheWVyc1tjYXRlZ29yeV07CiAgaWYgKHR5cGVvZiBjYXRlZ29yeU9iaiA9PT0gIm9iamVjdCIgJiYgc3ViY2F0ZWdvcnkpIHsKICAgIHJldHVybiBjYXRlZ29yeU9ialtzdWJjYXRlZ29yeV0gfHwgImF1dG8iOwogIH0KICByZXR1cm4gdHlwZW9mIGNhdGVnb3J5T2JqID09PSAibnVtYmVyIiA/IGNhdGVnb3J5T2JqIDogImF1dG8iOwp9CnZhciBjb21wb25lbnRaSW5kZXggPSB7CiAgImRlZXMtbW9kYWwiOiB6SW5kZXhMYXllcnMub3ZlcmxheS5tb2RhbCwKICAiZGVlcy13aW5kb3dsYXllciI6IHpJbmRleExheWVycy5vdmVybGF5LmRyb3Bkb3duLAogICJkZWVzLWNvbnRleHRtZW51IjogekluZGV4TGF5ZXJzLm92ZXJsYXkuY29udGV4dE1lbnUsCiAgImRlZXMtdG9hc3QiOiB6SW5kZXhMYXllcnMub3ZlcmxheS50b2FzdCwKICAiZGVlcy1hcHB1aS1tYWlubWVudSI6IHpJbmRleExheWVycy5maXhlZC5hcHBCYXIsCiAgImRlZXMtbW9iaWxlbmF2aWdhdGlvbiI6IHpJbmRleExheWVycy5maXhlZC5tb2JpbGVOYXYsCiAgImRlZXMtc2xhc2gtbWVudSI6IHpJbmRleExheWVycy53eXNpd3lnTWVudXMsCiAgImRlZXMtZm9ybWF0dGluZy1tZW51IjogekluZGV4TGF5ZXJzLnd5c2l3eWdNZW51cwp9Owp2YXIgWkluZGV4UmVnaXN0cnkgPSBjbGFzcyBfWkluZGV4UmVnaXN0cnkgewogIHN0YXRpYyBpbnN0YW5jZTsKICBhY3RpdmVFbGVtZW50cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgZWxlbWVudFpJbmRleE1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogIGN1cnJlbnRaSW5kZXggPSAxZTM7CiAgLy8gU3RhcnRpbmcgei1pbmRleAogIGNvbnN0cnVjdG9yKCkgewogIH0KICBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7CiAgICBpZiAoIV9aSW5kZXhSZWdpc3RyeS5pbnN0YW5jZSkgewogICAgICBfWkluZGV4UmVnaXN0cnkuaW5zdGFuY2UgPSBuZXcgX1pJbmRleFJlZ2lzdHJ5KCk7CiAgICB9CiAgICByZXR1cm4gX1pJbmRleFJlZ2lzdHJ5Lmluc3RhbmNlOwogIH0KICAvKioKICAgKiBHZXQgdGhlIG5leHQgYXZhaWxhYmxlIHotaW5kZXgKICAgKiBAcmV0dXJucyBUaGUgbmV4dCBhdmFpbGFibGUgei1pbmRleAogICAqLwogIGdldE5leHRaSW5kZXgoKSB7CiAgICB0aGlzLmN1cnJlbnRaSW5kZXggKz0gMTA7CiAgICByZXR1cm4gdGhpcy5jdXJyZW50WkluZGV4OwogIH0KICAvKioKICAgKiBSZWdpc3RlciBhbiBlbGVtZW50IHdpdGggdGhlIHotaW5kZXggcmVnaXN0cnkKICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBIVE1MIGVsZW1lbnQgdG8gcmVnaXN0ZXIKICAgKiBAcGFyYW0gekluZGV4IC0gVGhlIHotaW5kZXggYXNzaWduZWQgdG8gdGhpcyBlbGVtZW50CiAgICovCiAgcmVnaXN0ZXIoZWxlbWVudDQsIHpJbmRleCkgewogICAgdGhpcy5hY3RpdmVFbGVtZW50cy5hZGQoZWxlbWVudDQpOwogICAgdGhpcy5lbGVtZW50WkluZGV4TWFwLnNldChlbGVtZW50NCwgekluZGV4KTsKICB9CiAgLyoqCiAgICogVW5yZWdpc3RlciBhbiBlbGVtZW50IGZyb20gdGhlIHotaW5kZXggcmVnaXN0cnkKICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBIVE1MIGVsZW1lbnQgdG8gdW5yZWdpc3RlcgogICAqLwogIHVucmVnaXN0ZXIoZWxlbWVudDQpIHsKICAgIHRoaXMuYWN0aXZlRWxlbWVudHMuZGVsZXRlKGVsZW1lbnQ0KTsKICAgIHRoaXMuZWxlbWVudFpJbmRleE1hcC5kZWxldGUoZWxlbWVudDQpOwogICAgaWYgKHRoaXMuYWN0aXZlRWxlbWVudHMuc2l6ZSA9PT0gMCkgewogICAgICB0aGlzLmN1cnJlbnRaSW5kZXggPSAxZTM7CiAgICB9CiAgfQogIC8qKgogICAqIEdldCB0aGUgei1pbmRleCBmb3IgYSBzcGVjaWZpYyBlbGVtZW50CiAgICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgSFRNTCBlbGVtZW50CiAgICogQHJldHVybnMgVGhlIHotaW5kZXggb3IgdW5kZWZpbmVkIGlmIG5vdCByZWdpc3RlcmVkCiAgICovCiAgZ2V0RWxlbWVudFpJbmRleChlbGVtZW50NCkgewogICAgcmV0dXJuIHRoaXMuZWxlbWVudFpJbmRleE1hcC5nZXQoZWxlbWVudDQpOwogIH0KICAvKioKICAgKiBHZXQgY291bnQgb2YgYWN0aXZlIGVsZW1lbnRzCiAgICogQHJldHVybnMgTnVtYmVyIG9mIGFjdGl2ZSBlbGVtZW50cwogICAqLwogIGdldEFjdGl2ZUNvdW50KCkgewogICAgcmV0dXJuIHRoaXMuYWN0aXZlRWxlbWVudHMuc2l6ZTsKICB9CiAgLyoqCiAgICogR2V0IHRoZSBjdXJyZW50IGhpZ2hlc3Qgei1pbmRleAogICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHotaW5kZXggdmFsdWUKICAgKi8KICBnZXRDdXJyZW50WkluZGV4KCkgewogICAgcmV0dXJuIHRoaXMuY3VycmVudFpJbmRleDsKICB9CiAgLyoqCiAgICogQ2xlYXIgYWxsIHJlZ2lzdHJhdGlvbnMgKHVzZWZ1bCBmb3IgdGVzdGluZykKICAgKi8KICBjbGVhcigpIHsKICAgIHRoaXMuYWN0aXZlRWxlbWVudHMuY2xlYXIoKTsKICAgIHRoaXMuZWxlbWVudFpJbmRleE1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogICAgdGhpcy5jdXJyZW50WkluZGV4ID0gMWUzOwogIH0KICAvKioKICAgKiBHZXQgYWxsIGFjdGl2ZSBlbGVtZW50cyBpbiB6LWluZGV4IG9yZGVyCiAgICogQHJldHVybnMgQXJyYXkgb2YgZWxlbWVudHMgc29ydGVkIGJ5IHotaW5kZXgKICAgKi8KICBnZXRBY3RpdmVFbGVtZW50c0luT3JkZXIoKSB7CiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmFjdGl2ZUVsZW1lbnRzKS5zb3J0KChhNSwgYjUpID0+IHsKICAgICAgY29uc3QgYVogPSB0aGlzLmVsZW1lbnRaSW5kZXhNYXAuZ2V0KGE1KSB8fCAwOwogICAgICBjb25zdCBiWiA9IHRoaXMuZWxlbWVudFpJbmRleE1hcC5nZXQoYjUpIHx8IDA7CiAgICAgIHJldHVybiBhWiAtIGJaOwogICAgfSk7CiAgfQp9Owp2YXIgekluZGV4UmVnaXN0cnkgPSBaSW5kZXhSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NAOS4zLjAvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMjcgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMjcsIHsKICBidXNpbmVzczogKCkgPT4gYnVzaW5lc3NfZXhwb3J0czIsCiAgY29kZTogKCkgPT4gY29kZV9leHBvcnRzMiwKICBjb250YWluZXI6ICgpID0+IGNvbnRhaW5lcl9leHBvcnRzMiwKICBjb250ZW50OiAoKSA9PiBjb250ZW50X2V4cG9ydHMyLAogIGRhdGFiYXNlOiAoKSA9PiBkYXRhYmFzZV9leHBvcnRzMiwKICBkZXNjcmlwdG9yczogKCkgPT4gZGVzY3JpcHRvcnNfZXhwb3J0cywKICBmaW5hbmNlOiAoKSA9PiBmaW5hbmNlX2V4cG9ydHMyLAogIGdlbmVyYWw6ICgpID0+IGdlbmVyYWxfZXhwb3J0czIsCiAgbmV0d29yazogKCkgPT4gbmV0d29ya19leHBvcnRzMiwKICBzYWFzOiAoKSA9PiBzYWFzX2V4cG9ydHMyLAogIHN0b3JhZ2U6ICgpID0+IHN0b3JhZ2VfZXhwb3J0czIsCiAgd2Vic2l0ZTogKCkgPT4gd2Vic2l0ZV9leHBvcnRzMgp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDkuMy4wL25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3MvaW5kZXguanMKdmFyIGJ1c2luZXNzX2V4cG9ydHMyID0ge307CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A5LjMuMC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2RhdGFiYXNlL2luZGV4LmpzCnZhciBkYXRhYmFzZV9leHBvcnRzMiA9IHt9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NAOS4zLjAvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9maW5hbmNlL2luZGV4LmpzCnZhciBmaW5hbmNlX2V4cG9ydHMyID0ge307CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A5LjMuMC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvZGUvaW5kZXguanMKdmFyIGNvZGVfZXhwb3J0czIgPSB7fTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDkuMy4wL25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvY29udGFpbmVyL2luZGV4LmpzCnZhciBjb250YWluZXJfZXhwb3J0czIgPSB7fTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDkuMy4wL25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZGVzY3JpcHRvcnMvaW5kZXguanMKdmFyIGRlc2NyaXB0b3JzX2V4cG9ydHMgPSB7fTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDkuMy4wL25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvY29udGVudC9pbmRleC5qcwp2YXIgY29udGVudF9leHBvcnRzMiA9IHt9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NAOS4zLjAvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9nZW5lcmFsL2luZGV4LmpzCnZhciBnZW5lcmFsX2V4cG9ydHMyID0ge307CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A5LjMuMC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvaW5kZXguanMKdmFyIG5ldHdvcmtfZXhwb3J0czIgPSB7fTsKX19leHBvcnQobmV0d29ya19leHBvcnRzMiwgewogIElDbmFtZURlc2NyaXB0b3I6ICgpID0+IElDbmFtZURlc2NyaXB0b3IyCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NAOS4zLjAvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9uZXR3b3JrL2NuYW1lLmpzCnZhciBJQ25hbWVEZXNjcmlwdG9yMiA9IGNsYXNzIHsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDkuMy4wL25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvc2Fhcy9pbmRleC5qcwp2YXIgc2Fhc19leHBvcnRzMiA9IHt9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NAOS4zLjAvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9zdG9yYWdlL2luZGV4LmpzCnZhciBzdG9yYWdlX2V4cG9ydHMyID0ge307CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A5LjMuMC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL3dlYnNpdGUvaW5kZXguanMKdmFyIHdlYnNpdGVfZXhwb3J0czIgPSB7fTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBwbHVnaW5zLmpzCmluaXRfZGlzdF90cygpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW92ZXJsYXkvZGVlcy1jb250ZXh0bWVudS9kZWVzLWNvbnRleHRtZW51LmRlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW9GdW5jID0gKCkgPT4gYjJgCjxzdHlsZT4KICAud2l0aE1hcmdpbiB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1hcmdpbjogMjBweDsKICB9CiAgLmRlbW8tY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAyMHB4OwogICAgcGFkZGluZzogMjBweDsKICAgIG1pbi1oZWlnaHQ6IDQwMHB4OwogIH0KICAuZGVtby1hcmVhIHsKICAgIHBhZGRpbmc6IDQwcHg7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjdXJzb3I6IGNvbnRleHQtbWVudTsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4yczsKICB9CiAgLmRlbW8tYXJlYTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDIpOwogIH0KPC9zdHlsZT4KPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogIDxkZWVzLXBhbmVsIGhlYWRpbmc9IkJhc2ljIENvbnRleHQgTWVudSB3aXRoIE5lc3RlZCBTdWJtZW51cyI+CiAgICA8ZGl2IGNsYXNzPSJkZW1vLWFyZWEiIEBjb250ZXh0bWVudT0keyhldmVudEFyZykgPT4gewogIERlZXNDb250ZXh0bWVudS5vcGVuQ29udGV4dE1lbnVXaXRoT3B0aW9ucyhldmVudEFyZywgWwogICAgewogICAgICBuYW1lOiAiRmlsZSIsCiAgICAgIGljb25OYW1lOiAiZmlsZVRleHQiLAogICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgfSwKICAgICAgLy8gUGFyZW50IGl0ZW1zIHdpdGggc3VibWVudXMgc3RpbGwgbmVlZCBhbiBhY3Rpb24KICAgICAgc3VibWVudTogWwogICAgICAgIHsgbmFtZTogIk5ldyIsIGljb25OYW1lOiAiZmlsZVBsdXMiLCBzaG9ydGN1dDogIkNtZCtOIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiTmV3IGZpbGUiKSB9LAogICAgICAgIHsgbmFtZTogIk9wZW4iLCBpY29uTmFtZTogImZvbGRlck9wZW4iLCBzaG9ydGN1dDogIkNtZCtPIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiT3BlbiBmaWxlIikgfSwKICAgICAgICB7IG5hbWU6ICJTYXZlIiwgaWNvbk5hbWU6ICJzYXZlIiwgc2hvcnRjdXQ6ICJDbWQrUyIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlNhdmUiKSB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsgbmFtZTogIkV4cG9ydCBhcyBQREYiLCBpY29uTmFtZTogImRvd25sb2FkIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiRXhwb3J0IFBERiIpIH0sCiAgICAgICAgeyBuYW1lOiAiRXhwb3J0IGFzIEhUTUwiLCBpY29uTmFtZTogImNvZGUiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJFeHBvcnQgSFRNTCIpIH0KICAgICAgXQogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkVkaXQiLAogICAgICBpY29uTmFtZTogImVkaXQzIiwKICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgIH0sCiAgICAgIC8vIFBhcmVudCBpdGVtcyB3aXRoIHN1Ym1lbnVzIHN0aWxsIG5lZWQgYW4gYWN0aW9uCiAgICAgIHN1Ym1lbnU6IFsKICAgICAgICB7IG5hbWU6ICJDdXQiLCBpY29uTmFtZTogInNjaXNzb3JzIiwgc2hvcnRjdXQ6ICJDbWQrWCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkN1dCIpIH0sCiAgICAgICAgeyBuYW1lOiAiQ29weSIsIGljb25OYW1lOiAiY29weSIsIHNob3J0Y3V0OiAiQ21kK0MiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJDb3B5IikgfSwKICAgICAgICB7IG5hbWU6ICJQYXN0ZSIsIGljb25OYW1lOiAiY2xpcGJvYXJkIiwgc2hvcnRjdXQ6ICJDbWQrViIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlBhc3RlIikgfSwKICAgICAgICB7IGRpdmlkZXI6IHRydWUgfSwKICAgICAgICB7IG5hbWU6ICJGaW5kIiwgaWNvbk5hbWU6ICJzZWFyY2giLCBzaG9ydGN1dDogIkNtZCtGIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiRmluZCIpIH0sCiAgICAgICAgeyBuYW1lOiAiUmVwbGFjZSIsIGljb25OYW1lOiAicmVwZWF0Iiwgc2hvcnRjdXQ6ICJDbWQrSCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlJlcGxhY2UiKSB9CiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJWaWV3IiwKICAgICAgaWNvbk5hbWU6ICJleWUiLAogICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgfSwKICAgICAgLy8gUGFyZW50IGl0ZW1zIHdpdGggc3VibWVudXMgc3RpbGwgbmVlZCBhbiBhY3Rpb24KICAgICAgc3VibWVudTogWwogICAgICAgIHsgbmFtZTogIlpvb20gSW4iLCBpY29uTmFtZTogInpvb21JbiIsIHNob3J0Y3V0OiAiQ21kKysiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJab29tIGluIikgfSwKICAgICAgICB7IG5hbWU6ICJab29tIE91dCIsIGljb25OYW1lOiAiem9vbU91dCIsIHNob3J0Y3V0OiAiQ21kKy0iLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJab29tIG91dCIpIH0sCiAgICAgICAgeyBuYW1lOiAiUmVzZXQgWm9vbSIsIGljb25OYW1lOiAibWF4aW1pemUyIiwgc2hvcnRjdXQ6ICJDbWQrMCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlJlc2V0IHpvb20iKSB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsgbmFtZTogIkZ1bGwgU2NyZWVuIiwgaWNvbk5hbWU6ICJtYXhpbWl6ZSIsIHNob3J0Y3V0OiAiRjExIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiRnVsbCBzY3JlZW4iKSB9CiAgICAgIF0KICAgIH0sCiAgICB7IGRpdmlkZXI6IHRydWUgfSwKICAgIHsKICAgICAgbmFtZTogIlNldHRpbmdzIiwKICAgICAgaWNvbk5hbWU6ICJzZXR0aW5ncyIsCiAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlNldHRpbmdzIikKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJIZWxwIiwKICAgICAgaWNvbk5hbWU6ICJoZWxwQ2lyY2xlIiwKICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgIH0sCiAgICAgIC8vIFBhcmVudCBpdGVtcyB3aXRoIHN1Ym1lbnVzIHN0aWxsIG5lZWQgYW4gYWN0aW9uCiAgICAgIHN1Ym1lbnU6IFsKICAgICAgICB7IG5hbWU6ICJEb2N1bWVudGF0aW9uIiwgaWNvbk5hbWU6ICJib29rIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiRG9jdW1lbnRhdGlvbiIpIH0sCiAgICAgICAgeyBuYW1lOiAiS2V5Ym9hcmQgU2hvcnRjdXRzIiwgaWNvbk5hbWU6ICJrZXlib2FyZCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlNob3J0Y3V0cyIpIH0sCiAgICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgeyBuYW1lOiAiQWJvdXQiLCBpY29uTmFtZTogImluZm8iLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJBYm91dCIpIH0KICAgICAgXQogICAgfQogIF0pOwp9fT4KICAgICAgPGgzPlJpZ2h0LWNsaWNrIGFueXdoZXJlIGluIHRoaXMgYXJlYTwvaDM+CiAgICAgIDxwPkEgY29udGV4dCBtZW51IHdpdGggbmVzdGVkIHN1Ym1lbnVzIHdpbGwgYXBwZWFyPC9wPgogICAgPC9kaXY+CiAgPC9kZWVzLXBhbmVsPgogIDxkZWVzLXBhbmVsIGhlYWRpbmc9IkNvbXBvbmVudC1TcGVjaWZpYyBDb250ZXh0IE1lbnUiPgogICAgPGRlZXMtYnV0dG9uIHN0eWxlPSJtYXJnaW46IDIwcHg7IiBAY29udGV4dG1lbnU9JHsoZXZlbnRBcmcpID0+IHsKICBEZWVzQ29udGV4dG1lbnUub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZXZlbnRBcmcsIFsKICAgIHsKICAgICAgbmFtZTogIkJ1dHRvbiBBY3Rpb25zIiwKICAgICAgaWNvbk5hbWU6ICJtb3VzZVBvaW50ZXIiLAogICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgfSwKICAgICAgLy8gUGFyZW50IGl0ZW1zIHdpdGggc3VibWVudXMgc3RpbGwgbmVlZCBhbiBhY3Rpb24KICAgICAgc3VibWVudTogWwogICAgICAgIHsgbmFtZTogIkNsaWNrIiwgaWNvbk5hbWU6ICJtb3VzZSIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkNsaWNrIGFjdGlvbiIpIH0sCiAgICAgICAgeyBuYW1lOiAiRG91YmxlIENsaWNrIiwgaWNvbk5hbWU6ICJ6YXAiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJEb3VibGUgY2xpY2siKSB9LAogICAgICAgIHsgbmFtZTogIkxvbmcgUHJlc3MiLCBpY29uTmFtZTogImNsb2NrIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiTG9uZyBwcmVzcyIpIH0KICAgICAgXQogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkJ1dHRvbiBTdGF0ZSIsCiAgICAgIGljb25OYW1lOiAidG9nZ2xlTGVmdCIsCiAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICB9LAogICAgICAvLyBQYXJlbnQgaXRlbXMgd2l0aCBzdWJtZW51cyBzdGlsbCBuZWVkIGFuIGFjdGlvbgogICAgICBzdWJtZW51OiBbCiAgICAgICAgeyBuYW1lOiAiRW5hYmxlIiwgaWNvbk5hbWU6ICJjaGVja0NpcmNsZSIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkVuYWJsZSIpIH0sCiAgICAgICAgeyBuYW1lOiAiRGlzYWJsZSIsIGljb25OYW1lOiAieENpcmNsZSIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkRpc2FibGUiKSB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsgbmFtZTogIlNob3ciLCBpY29uTmFtZTogImV5ZSIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlNob3ciKSB9LAogICAgICAgIHsgbmFtZTogIkhpZGUiLCBpY29uTmFtZTogImV5ZU9mZiIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkhpZGUiKSB9CiAgICAgIF0KICAgIH0sCiAgICB7IGRpdmlkZXI6IHRydWUgfSwKICAgIHsKICAgICAgbmFtZTogIkRpc2FibGVkIEFjdGlvbiIsCiAgICAgIGljb25OYW1lOiAiYmFuIiwKICAgICAgZGlzYWJsZWQ6IHRydWUsCiAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlRoaXMgc2hvdWxkIG5vdCBydW4iKQogICAgfSwKICAgIHsKICAgICAgbmFtZTogIlByb3BlcnRpZXMiLAogICAgICBpY29uTmFtZTogInNldHRpbmdzIiwKICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiQnV0dG9uIHByb3BlcnRpZXMiKQogICAgfQogIF0pOwp9fT5SaWdodC1jbGljayBvbiB0aGlzIGJ1dHRvbjwvZGVlcy1idXR0b24+CiAgPC9kZWVzLXBhbmVsPgoKICA8ZGVlcy1wYW5lbCBoZWFkaW5nPSJBZHZhbmNlZCBDb250ZXh0IE1lbnUgRXhhbXBsZSI+CiAgICA8ZGl2IGNsYXNzPSJkZW1vLWFyZWEiIEBjb250ZXh0bWVudT0keyhldmVudEFyZykgPT4gewogIERlZXNDb250ZXh0bWVudS5vcGVuQ29udGV4dE1lbnVXaXRoT3B0aW9ucyhldmVudEFyZywgWwogICAgewogICAgICBuYW1lOiAiRm9ybWF0IiwKICAgICAgaWNvbk5hbWU6ICJ0eXBlIiwKICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgIH0sCiAgICAgIC8vIFBhcmVudCBpdGVtcyB3aXRoIHN1Ym1lbnVzIHN0aWxsIG5lZWQgYW4gYWN0aW9uCiAgICAgIHN1Ym1lbnU6IFsKICAgICAgICB7IG5hbWU6ICJCb2xkIiwgaWNvbk5hbWU6ICJib2xkIiwgc2hvcnRjdXQ6ICJDbWQrQiIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkJvbGQiKSB9LAogICAgICAgIHsgbmFtZTogIkl0YWxpYyIsIGljb25OYW1lOiAiaXRhbGljIiwgc2hvcnRjdXQ6ICJDbWQrSSIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkl0YWxpYyIpIH0sCiAgICAgICAgeyBuYW1lOiAiVW5kZXJsaW5lIiwgaWNvbk5hbWU6ICJ1bmRlcmxpbmUiLCBzaG9ydGN1dDogIkNtZCtVIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiVW5kZXJsaW5lIikgfSwKICAgICAgICB7IGRpdmlkZXI6IHRydWUgfSwKICAgICAgICB7IG5hbWU6ICJGb250IFNpemUiLCBpY29uTmFtZTogInR5cGUiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJGb250IHNpemUgbWVudSIpIH0sCiAgICAgICAgeyBuYW1lOiAiRm9udCBDb2xvciIsIGljb25OYW1lOiAicGFsZXR0ZSIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkZvbnQgY29sb3IgbWVudSIpIH0KICAgICAgXQogICAgfSwKICAgIHsKICAgICAgbmFtZTogIlRyYW5zZm9ybSIsCiAgICAgIGljb25OYW1lOiAic2h1ZmZsZSIsCiAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICB9LAogICAgICAvLyBQYXJlbnQgaXRlbXMgd2l0aCBzdWJtZW51cyBzdGlsbCBuZWVkIGFuIGFjdGlvbgogICAgICBzdWJtZW51OiBbCiAgICAgICAgeyBuYW1lOiAiVG8gVXBwZXJjYXNlIiwgaWNvbk5hbWU6ICJhcnJvd1VwIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiVXBwZXJjYXNlIikgfSwKICAgICAgICB7IG5hbWU6ICJUbyBMb3dlcmNhc2UiLCBpY29uTmFtZTogImFycm93RG93biIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkxvd2VyY2FzZSIpIH0sCiAgICAgICAgeyBuYW1lOiAiQ2FwaXRhbGl6ZSIsIGljb25OYW1lOiAidHlwZSIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkNhcGl0YWxpemUiKSB9CiAgICAgIF0KICAgIH0sCiAgICB7IGRpdmlkZXI6IHRydWUgfSwKICAgIHsKICAgICAgbmFtZTogIkRlbGV0ZSIsCiAgICAgIGljb25OYW1lOiAidHJhc2gyIiwKICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiRGVsZXRlIikKICAgIH0KICBdKTsKfX0+CiAgICAgIDxoMz5BZHZhbmNlZCBOZXN0ZWQgTWVudSBFeGFtcGxlPC9oMz4KICAgICAgPHA+VGhpcyBzaG93cyBkZWVwbHkgbmVzdGVkIHN1Ym1lbnVzIGFuZCB2YXJpb3VzIGZvcm1hdHRpbmcgb3B0aW9uczwvcD4KICAgIDwvZGl2PgogIDwvZGVlcy1wYW5lbD4KICAKICA8ZGVlcy1wYW5lbCBoZWFkaW5nPSJTdGF0aWMgQ29udGV4dCBNZW51IChBbHdheXMgVmlzaWJsZSkiPgogICAgPGRlZXMtY29udGV4dG1lbnUKICAgICAgY2xhc3M9IndpdGhNYXJnaW4iCiAgICAgIC5tZW51SXRlbXM9JHtbCiAgewogICAgbmFtZTogIlByb2plY3QiLAogICAgaWNvbk5hbWU6ICJmb2xkZXIiLAogICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICB9LAogICAgLy8gUGFyZW50IGl0ZW1zIHdpdGggc3VibWVudXMgc3RpbGwgbmVlZCBhbiBhY3Rpb24KICAgIHN1Ym1lbnU6IFsKICAgICAgeyBuYW1lOiAiTmV3IFByb2plY3QiLCBpY29uTmFtZTogImZvbGRlclBsdXMiLCBzaG9ydGN1dDogIkNtZCtTaGlmdCtOIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiTmV3IHByb2plY3QiKSB9LAogICAgICB7IG5hbWU6ICJPcGVuIFByb2plY3QiLCBpY29uTmFtZTogImZvbGRlck9wZW4iLCBzaG9ydGN1dDogIkNtZCtTaGlmdCtPIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiT3BlbiBwcm9qZWN0IikgfSwKICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgIHsgbmFtZTogIlJlY2VudCBQcm9qZWN0cyIsIGljb25OYW1lOiAiY2xvY2siLCBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgfSwgc3VibWVudTogWwogICAgICAgIHsgbmFtZTogIlByb2plY3QgQWxwaGEiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJPcGVuIEFscGhhIikgfSwKICAgICAgICB7IG5hbWU6ICJQcm9qZWN0IEJldGEiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJPcGVuIEJldGEiKSB9LAogICAgICAgIHsgbmFtZTogIlByb2plY3QgR2FtbWEiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJPcGVuIEdhbW1hIikgfQogICAgICBdIH0KICAgIF0KICB9LAogIHsKICAgIG5hbWU6ICJUb29scyIsCiAgICBpY29uTmFtZTogInRvb2wiLAogICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICB9LAogICAgLy8gUGFyZW50IGl0ZW1zIHdpdGggc3VibWVudXMgc3RpbGwgbmVlZCBhbiBhY3Rpb24KICAgIHN1Ym1lbnU6IFsKICAgICAgeyBuYW1lOiAiVGVybWluYWwiLCBpY29uTmFtZTogInRlcm1pbmFsIiwgc2hvcnRjdXQ6ICJDbWQrVCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlRlcm1pbmFsIikgfSwKICAgICAgeyBuYW1lOiAiQ29uc29sZSIsIGljb25OYW1lOiAibW9uaXRvciIsIHNob3J0Y3V0OiAiQ21kK0siLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJDb25zb2xlIikgfSwKICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgIHsgbmFtZTogIkV4dGVuc2lvbnMiLCBpY29uTmFtZTogInBhY2thZ2UiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJFeHRlbnNpb25zIikgfQogICAgXQogIH0sCiAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgewogICAgbmFtZTogIlByZWZlcmVuY2VzIiwKICAgIGljb25OYW1lOiAic2xpZGVycyIsCiAgICBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJQcmVmZXJlbmNlcyIpCiAgfQpdfQogICAgPjwvZGVlcy1jb250ZXh0bWVudT4KICA8L2RlZXMtcGFuZWw+CjwvZGl2PgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW92ZXJsYXkvZGVlcy13aW5kb3dsYXllci9kZWVzLXdpbmRvd2xheWVyLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBfX2VzRGVjb3JhdGUzID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM0ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzV2luZG93TGF5ZXIgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLXdpbmRvd2xheWVyIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfb3B0aW9uc19kZWNvcmF0b3JzOwogIGxldCBfb3B0aW9uc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX29wdGlvbnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2JhY2tkcm9wWkluZGV4X2RlY29yYXRvcnM7CiAgbGV0IF9iYWNrZHJvcFpJbmRleF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2JhY2tkcm9wWkluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZW50WkluZGV4X2RlY29yYXRvcnM7CiAgbGV0IF9jb250ZW50WkluZGV4X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29udGVudFpJbmRleF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmlzaWJsZV9kZWNvcmF0b3JzOwogIGxldCBfdmlzaWJsZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Zpc2libGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1dpbmRvd0xheWVyMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX29wdGlvbnNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2JhY2tkcm9wWkluZGV4X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9jb250ZW50WkluZGV4X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF92aXNpYmxlX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEJvb2xlYW4KICAgICAgfSldOwogICAgICBfX2VzRGVjb3JhdGUzKHRoaXMsIG51bGwsIF9vcHRpb25zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm9wdGlvbnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm9wdGlvbnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoub3B0aW9ucywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoub3B0aW9ucyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9vcHRpb25zX2luaXRpYWxpemVycywgX29wdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzKHRoaXMsIG51bGwsIF9iYWNrZHJvcFpJbmRleF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJiYWNrZHJvcFpJbmRleCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYmFja2Ryb3BaSW5kZXgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYmFja2Ryb3BaSW5kZXgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmJhY2tkcm9wWkluZGV4ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2JhY2tkcm9wWkluZGV4X2luaXRpYWxpemVycywgX2JhY2tkcm9wWkluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMyh0aGlzLCBudWxsLCBfY29udGVudFpJbmRleF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb250ZW50WkluZGV4Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb250ZW50WkluZGV4IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNvbnRlbnRaSW5kZXgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvbnRlbnRaSW5kZXggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29udGVudFpJbmRleF9pbml0aWFsaXplcnMsIF9jb250ZW50WkluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMyh0aGlzLCBudWxsLCBfdmlzaWJsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2aXNpYmxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ2aXNpYmxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZpc2libGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZpc2libGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdmlzaWJsZV9pbml0aWFsaXplcnMsIF92aXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMyhudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNXaW5kb3dMYXllcjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgLy8gU1RBVElDCiAgICBzdGF0aWMgZGVtbyA9ICgpID0+IGIyYDxkZWVzLXdpbmRvd2xheWVyPjwvZGVlcy13aW5kb3dsYXllcj5gOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIk92ZXJsYXkiXTsKICAgIHN0YXRpYyBhc3luYyBjcmVhdGVBbmRTaG93KG9wdGlvbnNBcmcpIHsKICAgICAgY29uc3QgZG9tdG9vbHNJbnN0YW5jZSA9IGRpc3RfdHNfZXhwb3J0czI1LkRvbVRvb2xzLmdldEdsb2JhbERvbVRvb2xzU3luYygpOwogICAgICBjb25zdCB3aW5kb3dMYXllciA9IG5ldyBEZWVzV2luZG93TGF5ZXIyKCk7CiAgICAgIHdpbmRvd0xheWVyLm9wdGlvbnMgPSB7CiAgICAgICAgLi4ud2luZG93TGF5ZXIub3B0aW9ucywKICAgICAgICAuLi5vcHRpb25zQXJnCiAgICAgIH07CiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHdpbmRvd0xheWVyKTsKICAgICAgYXdhaXQgZG9tdG9vbHNJbnN0YW5jZS5jb252ZW5pZW5jZS5zbWFydGRlbGF5LmRlbGF5Rm9yKDApOwogICAgICB3aW5kb3dMYXllci5zaG93KCk7CiAgICAgIHJldHVybiB3aW5kb3dMYXllcjsKICAgIH0KICAgICNvcHRpb25zX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczQodGhpcywgX29wdGlvbnNfaW5pdGlhbGl6ZXJzLCB7CiAgICAgIGJsdXI6IGZhbHNlCiAgICB9KTsKICAgIGdldCBvcHRpb25zKCkgewogICAgICByZXR1cm4gdGhpcy4jb3B0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG9wdGlvbnModmFsdWUyKSB7CiAgICAgIHRoaXMuI29wdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNiYWNrZHJvcFpJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNCh0aGlzLCBfb3B0aW9uc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNCh0aGlzLCBfYmFja2Ryb3BaSW5kZXhfaW5pdGlhbGl6ZXJzLCAxZTMpKTsKICAgIGdldCBiYWNrZHJvcFpJbmRleCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2JhY2tkcm9wWkluZGV4X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYmFja2Ryb3BaSW5kZXgodmFsdWUyKSB7CiAgICAgIHRoaXMuI2JhY2tkcm9wWkluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29udGVudFpJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNCh0aGlzLCBfYmFja2Ryb3BaSW5kZXhfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQodGhpcywgX2NvbnRlbnRaSW5kZXhfaW5pdGlhbGl6ZXJzLCAxMDAxKSk7CiAgICBnZXQgY29udGVudFpJbmRleCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvbnRlbnRaSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjb250ZW50WkluZGV4KHZhbHVlMikgewogICAgICB0aGlzLiNjb250ZW50WkluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNCh0aGlzLCBfY29udGVudFpJbmRleF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNCh0aGlzLCBfdmlzaWJsZV9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IHZpc2libGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2aXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdmlzaWJsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNCh0aGlzLCBfdmlzaWJsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIGRpc3RfdHNfZXhwb3J0czI1LmVsZW1lbnRCYXNpYy5zZXR1cCgpOwogICAgfQogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgICR7ZGlzdF90c19leHBvcnRzMjUuZWxlbWVudEJhc2ljLnN0eWxlc30KICAgICAgPHN0eWxlPgogICAgICAgIC53aW5kb3dPdmVybGF5IHsKICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzOwogICAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICAgIHRvcDogMHB4OwogICAgICAgICAgbGVmdDogMHB4OwogICAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICAgIHdpZHRoOiAxMDB2dzsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMCk7CiAgICAgICAgICBiYWNrZHJvcC1maWx0ZXI6IGJyaWdodG5lc3MoMSkgJHt0aGlzLm9wdGlvbnMuYmx1ciA/ICJibHVyKDBweCkiIDogIiJ9OwogICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgICB6LWluZGV4OiAke3RoaXMuYmFja2Ryb3BaSW5kZXh9OwogICAgICAgIH0KICAgICAgICAuc2xvdENvbnRlbnQgewogICAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICAgIHdpZHRoOiAxMDB2dzsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICB6LWluZGV4OiAke3RoaXMuY29udGVudFpJbmRleH07CiAgICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnNsb3RDb250ZW50ID4gKiB7CiAgICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnZpc2libGUgewogICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgICAgICAgYmFja2Ryb3AtZmlsdGVyOiBicmlnaHRuZXNzKDAuOSkgJHt0aGlzLm9wdGlvbnMuYmx1ciA/ICJibHVyKDJweCkiIDogIiJ9OwogICAgICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDsKICAgICAgICB9CiAgICAgIDwvc3R5bGU+CiAgICAgIDxkaXYgQGNsaWNrPSR7dGhpcy5kaXNwYXRjaENsaWNrZWR9IGNsYXNzPSJ3aW5kb3dPdmVybGF5ICR7dGhpcy52aXNpYmxlID8gInZpc2libGUiIDogbnVsbH0iPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2xvdENvbnRlbnQiPgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgZmlyc3RVcGRhdGVkKCkgewogICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlOwogICAgICB9LCAxMDApOwogICAgfQogICAgZGlzcGF0Y2hDbGlja2VkKCkgewogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjbGlja2VkIikpOwogICAgfQogICAgdG9nZ2xlVmlzaWJpbGl0eSgpIHsKICAgICAgdGhpcy52aXNpYmxlID0gIXRoaXMudmlzaWJsZTsKICAgIH0KICAgIGdldENvbnRlbnRaSW5kZXgoKSB7CiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRaSW5kZXg7CiAgICB9CiAgICBhc3luYyBzaG93KCkgewogICAgICBjb25zdCBkb210b29scyA9IGF3YWl0IHRoaXMuZG9tdG9vbHNQcm9taXNlOwogICAgICB0aGlzLmJhY2tkcm9wWkluZGV4ID0gekluZGV4UmVnaXN0cnkuZ2V0TmV4dFpJbmRleCgpOwogICAgICB0aGlzLmNvbnRlbnRaSW5kZXggPSB6SW5kZXhSZWdpc3RyeS5nZXROZXh0WkluZGV4KCk7CiAgICAgIHpJbmRleFJlZ2lzdHJ5LnJlZ2lzdGVyKHRoaXMsIHRoaXMuYmFja2Ryb3BaSW5kZXgpOwogICAgICBhd2FpdCBkb210b29scy5jb252ZW5pZW5jZS5zbWFydGRlbGF5LmRlbGF5Rm9yKDApOwogICAgICB0aGlzLnZpc2libGUgPSB0cnVlOwogICAgfQogICAgYXN5bmMgaGlkZSgpIHsKICAgICAgY29uc3QgZG9tdG9vbHMgPSBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgYXdhaXQgZG9tdG9vbHMuY29udmVuaWVuY2Uuc21hcnRkZWxheS5kZWxheUZvcigwKTsKICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7CiAgICB9CiAgICBhc3luYyBkZXN0cm95KCkgewogICAgICBjb25zdCBkb210b29scyA9IGF3YWl0IHRoaXMuZG9tdG9vbHNQcm9taXNlOwogICAgICBhd2FpdCB0aGlzLmhpZGUoKTsKICAgICAgYXdhaXQgZG9tdG9vbHMuY29udmVuaWVuY2Uuc21hcnRkZWxheS5kZWxheUZvcigzMDApOwogICAgICB6SW5kZXhSZWdpc3RyeS51bnJlZ2lzdGVyKHRoaXMpOwogICAgICB0aGlzLnJlbW92ZSgpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM0KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzV2luZG93TGF5ZXIyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1vdmVybGF5L2RlZXMtY29udGV4dG1lbnUvZGVlcy1jb250ZXh0bWVudS5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2Rpc3RfdHMyNSgpOwppbml0X2RlZXNfaWNvbigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU1ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM2ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzQ29udGV4dG1lbnUgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLWNvbnRleHRtZW51IildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfbWVudUl0ZW1zX2RlY29yYXRvcnM7CiAgbGV0IF9tZW51SXRlbXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tZW51SXRlbXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0NvbnRleHRtZW51NSA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX21lbnVJdGVtc19kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBBcnJheQogICAgICB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTUodGhpcywgbnVsbCwgX21lbnVJdGVtc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtZW51SXRlbXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1lbnVJdGVtcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tZW51SXRlbXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1lbnVJdGVtcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tZW51SXRlbXNfaW5pdGlhbGl6ZXJzLCBfbWVudUl0ZW1zX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNDb250ZXh0bWVudTUgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgLy8gREVNTwogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJPdmVybGF5Il07CiAgICAvLyBTVEFUSUMKICAgIC8vIFRoaXMgd2lsbCBzdG9yZSBhbGwgdGhlIGFjY3VtdWxhdGVkIG1lbnUgaXRlbXMKICAgIHN0YXRpYyBjb250ZXh0TWVudURlYWN0aXZhdGVkID0gZmFsc2U7CiAgICBzdGF0aWMgYWNjdW11bGF0ZWRNZW51SXRlbXMgPSBbXTsKICAgIC8vIEFkZCBhIGdsb2JhbCBldmVudCBsaXN0ZW5lciBmb3IgdGhlIHJpZ2h0LWNsaWNrIGNvbnRleHQgbWVudQogICAgc3RhdGljIGluaXRpYWxpemVHbG9iYWxMaXN0ZW5lcigpIHsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCAoZXZlbnQpID0+IHsKICAgICAgICBpZiAodGhpcy5jb250ZXh0TWVudURlYWN0aXZhdGVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgRGVlc0NvbnRleHRtZW51NS5hY2N1bXVsYXRlZE1lbnVJdGVtcyA9IFtdOwogICAgICAgIGNvbnN0IHBhdGgyID0gZXZlbnQuY29tcG9zZWRQYXRoKCk7CiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50NCBvZiBwYXRoMikgewogICAgICAgICAgaWYgKGVsZW1lbnQ0LmdldENvbnRleHRNZW51SXRlbXMpIHsKICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBlbGVtZW50NC5nZXRDb250ZXh0TWVudUl0ZW1zKCk7CiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgaWYgKERlZXNDb250ZXh0bWVudTUuYWNjdW11bGF0ZWRNZW51SXRlbXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgRGVlc0NvbnRleHRtZW51NS5hY2N1bXVsYXRlZE1lbnVJdGVtcy5wdXNoKHsgZGl2aWRlcjogdHJ1ZSB9KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgRGVlc0NvbnRleHRtZW51NS5hY2N1bXVsYXRlZE1lbnVJdGVtcy5wdXNoKC4uLml0ZW1zKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBEZWVzQ29udGV4dG1lbnU1Lm9wZW5Db250ZXh0TWVudVdpdGhPcHRpb25zKGV2ZW50LCBEZWVzQ29udGV4dG1lbnU1LmFjY3VtdWxhdGVkTWVudUl0ZW1zKTsKICAgICAgfSk7CiAgICB9CiAgICAvLyBhbGxvd3Mgb3BlbmluZyBvZiBhIGNvbnRleHRtZW51IHdpdGggb3B0aW9ucwogICAgc3RhdGljIGFzeW5jIG9wZW5Db250ZXh0TWVudVdpdGhPcHRpb25zKGV2ZW50QXJnLCBtZW51SXRlbXNBcmcpIHsKICAgICAgaWYgKHRoaXMuY29udGV4dE1lbnVEZWFjdGl2YXRlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBldmVudEFyZy5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBldmVudEFyZy5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgY29uc3QgY29udGV4dE1lbnUgPSBuZXcgRGVlc0NvbnRleHRtZW51NSgpOwogICAgICBjb250ZXh0TWVudS5zdHlsZS5wb3NpdGlvbiA9ICJmaXhlZCI7CiAgICAgIGNvbnRleHRNZW51LnN0eWxlLnpJbmRleCA9IFN0cmluZyh6SW5kZXhMYXllcnMub3ZlcmxheS5jb250ZXh0TWVudSk7CiAgICAgIGNvbnRleHRNZW51LnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgIGNvbnRleHRNZW51LnN0eWxlLnRyYW5zZm9ybSA9ICJzY2FsZSgwLjk1KSB0cmFuc2xhdGVZKC0xMHB4KSI7CiAgICAgIGNvbnRleHRNZW51Lm1lbnVJdGVtcyA9IG1lbnVJdGVtc0FyZzsKICAgICAgY29udGV4dE1lbnUud2luZG93TGF5ZXIgPSBhd2FpdCBEZWVzV2luZG93TGF5ZXIuY3JlYXRlQW5kU2hvdygpOwogICAgICBjb250ZXh0TWVudS53aW5kb3dMYXllci5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jIChldmVudCkgPT4gewogICAgICAgIGNvbnN0IGNsaWNrZWRFbGVtZW50ID0gZXZlbnQudGFyZ2V0OwogICAgICAgIGNvbnN0IGlzQ29udGV4dE1lbnUgPSBjbGlja2VkRWxlbWVudC5jbG9zZXN0KCJkZWVzLWNvbnRleHRtZW51Iik7CiAgICAgICAgaWYgKCFpc0NvbnRleHRNZW51KSB7CiAgICAgICAgICBhd2FpdCBjb250ZXh0TWVudS5kZXN0cm95KCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoY29udGV4dE1lbnUpOwogICAgICBhd2FpdCBkb210b29sc19wbHVnaW5leHBvcnRzX2V4cG9ydHMuc21hcnRkZWxheS5kZWxheUZvcigwKTsKICAgICAgY29uc3QgcmVjdCA9IGNvbnRleHRNZW51LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBjb25zdCB3aW5kb3dXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoOwogICAgICBjb25zdCB3aW5kb3dIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7CiAgICAgIGxldCB0b3AgPSBldmVudEFyZy5jbGllbnRZOwogICAgICBsZXQgbGVmdCA9IGV2ZW50QXJnLmNsaWVudFg7CiAgICAgIGlmIChsZWZ0ICsgcmVjdC53aWR0aCA+IHdpbmRvd1dpZHRoKSB7CiAgICAgICAgbGVmdCA9IHdpbmRvd1dpZHRoIC0gcmVjdC53aWR0aCAtIDEwOwogICAgICB9CiAgICAgIGlmICh0b3AgKyByZWN0LmhlaWdodCA+IHdpbmRvd0hlaWdodCkgewogICAgICAgIHRvcCA9IHdpbmRvd0hlaWdodCAtIHJlY3QuaGVpZ2h0IC0gMTA7CiAgICAgIH0KICAgICAgaWYgKGxlZnQgPCAxMCkKICAgICAgICBsZWZ0ID0gMTA7CiAgICAgIGlmICh0b3AgPCAxMCkKICAgICAgICB0b3AgPSAxMDsKICAgICAgY29udGV4dE1lbnUuc3R5bGUudG9wID0gYCR7dG9wfXB4YDsKICAgICAgY29udGV4dE1lbnUuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgOwogICAgICBjb250ZXh0TWVudS5zdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSAidG9wIGxlZnQiOwogICAgICBhd2FpdCBkb210b29sc19wbHVnaW5leHBvcnRzX2V4cG9ydHMuc21hcnRkZWxheS5kZWxheUZvcigwKTsKICAgICAgY29udGV4dE1lbnUuc3R5bGUub3BhY2l0eSA9ICIxIjsKICAgICAgY29udGV4dE1lbnUuc3R5bGUudHJhbnNmb3JtID0gInNjYWxlKDEpIHRyYW5zbGF0ZVkoMCkiOwogICAgfQogICAgI21lbnVJdGVtc19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM2KHRoaXMsIF9tZW51SXRlbXNfaW5pdGlhbGl6ZXJzLCBbXSk7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IG1lbnVJdGVtcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI21lbnVJdGVtc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1lbnVJdGVtcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWVudUl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICB3aW5kb3dMYXllciA9IF9fcnVuSW5pdGlhbGl6ZXJzNih0aGlzLCBfbWVudUl0ZW1zX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIHN1Ym1lbnUgPSBudWxsOwogICAgc3VibWVudVRpbWVvdXQgPSBudWxsOwogICAgcGFyZW50TWVudSA9IG51bGw7CiAgICBpc0Rlc3Ryb3lpbmcgPSBmYWxzZTsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLnRhYkluZGV4ID0gMDsKICAgIH0KICAgIC8qKgogICAgICogU1RBVElDIFNUWUxFUwogICAgICovCiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycywgdHJhbnNmb3JtIDAuMnM7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgLm1haW5ib3ggewogICAgICAgIG1pbi13aWR0aDogMjAwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyODBweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMDAwMDAwIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTBlMGUwIiwgIiMyMDIwMjAiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGJveC1zaGFkb3c6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4xNSkiLCAiMCA0cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuMykiKX07CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgcGFkZGluZzogNHB4IDA7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzMzMyIsICIjY2NjIil9OwogICAgICB9CgogICAgICAubWVudWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLm1lbnVpdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjA0KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpIil9OwogICAgICB9CiAgICAgIAogICAgICAubWVudWl0ZW0uaGFzLXN1Ym1lbnU6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAn4oC6JzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDhweDsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAubWVudWl0ZW06YWN0aXZlOm5vdCguaGFzLXN1Ym1lbnUpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjA4KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpIil9OwogICAgICB9CiAgICAgIAogICAgICAubWVudWl0ZW0uZGlzYWJsZWQgewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAubWVudWl0ZW0gZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgb3BhY2l0eTogMC43OwogICAgICB9CgogICAgICAubWVudWl0ZW0tdGV4dCB7CiAgICAgICAgZmxleDogMTsKICAgICAgfQoKICAgICAgLm1lbnVpdGVtLXNob3J0Y3V0IHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOTk5IiwgIiM2NjYiKX07CiAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICAgICAgb3BhY2l0eTogMC43OwogICAgICB9CgogICAgICAubWVudS1kaXZpZGVyIHsKICAgICAgICBoZWlnaHQ6IDFweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2UwZTBlMCIsICIjMjAyMDIwIil9OwogICAgICAgIG1hcmdpbjogNHB4IDA7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0ibWFpbmJveCI+CiAgICAgICAgJHt0aGlzLm1lbnVJdGVtcy5tYXAoKG1lbnVJdGVtQXJnKSA9PiB7CiAgICAgICAgaWYgKCJkaXZpZGVyIiBpbiBtZW51SXRlbUFyZyAmJiBtZW51SXRlbUFyZy5kaXZpZGVyKSB7CiAgICAgICAgICByZXR1cm4gYjJgPGRpdiBjbGFzcz0ibWVudS1kaXZpZGVyIj48L2Rpdj5gOwogICAgICAgIH0KICAgICAgICBjb25zdCBtZW51SXRlbSA9IG1lbnVJdGVtQXJnOwogICAgICAgIGNvbnN0IGhhc1N1Ym1lbnUgPSBtZW51SXRlbS5zdWJtZW51ICYmIG1lbnVJdGVtLnN1Ym1lbnUubGVuZ3RoID4gMDsKICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgICAgIDxkaXYgCiAgICAgICAgICAgICAgY2xhc3M9Im1lbnVpdGVtICR7bWVudUl0ZW0uZGlzYWJsZWQgPyAiZGlzYWJsZWQiIDogIiJ9ICR7aGFzU3VibWVudSA/ICJoYXMtc3VibWVudSIgOiAiIn0iIAogICAgICAgICAgICAgIEBjbGljaz0keygpID0+ICFtZW51SXRlbS5kaXNhYmxlZCAmJiAhaGFzU3VibWVudSAmJiB0aGlzLmhhbmRsZUNsaWNrKG1lbnVJdGVtKX0KICAgICAgICAgICAgICBAbW91c2VlbnRlcj0keygpID0+IHRoaXMuaGFuZGxlTWVudUl0ZW1Ib3ZlcihtZW51SXRlbSwgaGFzU3VibWVudSl9CiAgICAgICAgICAgICAgQG1vdXNlbGVhdmU9JHsoKSA9PiB0aGlzLmhhbmRsZU1lbnVJdGVtTGVhdmUoKX0KICAgICAgICAgICAgPgogICAgICAgICAgICAgICR7bWVudUl0ZW0uaWNvbk5hbWUgPyBiMmAKICAgICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249IiR7bWVudUl0ZW0uaWNvbk5hbWV9Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1lbnVpdGVtLXRleHQiPiR7bWVudUl0ZW0ubmFtZX08L3NwYW4+CiAgICAgICAgICAgICAgJHttZW51SXRlbS5zaG9ydGN1dCAmJiAhaGFzU3VibWVudSA/IGIyYAogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1lbnVpdGVtLXNob3J0Y3V0Ij4ke21lbnVJdGVtLnNob3J0Y3V0fTwvc3Bhbj4KICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYDsKICAgICAgfSl9CiAgICAgICAgJHt0aGlzLm1lbnVJdGVtcy5sZW5ndGggPT09IDAgPyBiMmAKICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVudWl0ZW0iIEBjbGljaz0keygpID0+IHsKICAgICAgICBEZWVzQ29udGV4dG1lbnU1LmNvbnRleHRNZW51RGVhY3RpdmF0ZWQgPSB0cnVlOwogICAgICAgIHRoaXMuZGVzdHJveSgpOwogICAgICB9fT4KICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSJsdWNpZGU6eCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1lbnVpdGVtLXRleHQiPkFsbG93IG5hdGl2ZSBjb250ZXh0PC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICBgIDogYjJgYH0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKCkgewogICAgICB0aGlzLmZvY3VzKCk7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIHRoaXMuaGFuZGxlS2V5ZG93bik7CiAgICB9CiAgICBoYW5kbGVLZXlkb3duID0gKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IG1lbnVJdGVtcyA9IEFycmF5LmZyb20odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5tZW51aXRlbTpub3QoLmRpc2FibGVkKSIpKTsKICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gbWVudUl0ZW1zLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5tYXRjaGVzKCI6aG92ZXIiKSk7CiAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7CiAgICAgICAgY2FzZSAiQXJyb3dEb3duIjoKICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBjdXJyZW50SW5kZXggKyAxIDwgbWVudUl0ZW1zLmxlbmd0aCA/IGN1cnJlbnRJbmRleCArIDEgOiAwOwogICAgICAgICAgbWVudUl0ZW1zW25leHRJbmRleF0uZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgibW91c2VlbnRlciIpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkFycm93VXAiOgogICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGNvbnN0IHByZXZJbmRleCA9IGN1cnJlbnRJbmRleCAtIDEgPj0gMCA/IGN1cnJlbnRJbmRleCAtIDEgOiBtZW51SXRlbXMubGVuZ3RoIC0gMTsKICAgICAgICAgIG1lbnVJdGVtc1twcmV2SW5kZXhdLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoIm1vdXNlZW50ZXIiKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJFbnRlciI6CiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSAwKSB7CiAgICAgICAgICAgIG1lbnVJdGVtc1tjdXJyZW50SW5kZXhdLmNsaWNrKCk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJFc2NhcGUiOgogICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuZGVzdHJveSgpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH07CiAgICBhc3luYyBoYW5kbGVDbGljayhtZW51SXRlbSkgewogICAgICBtZW51SXRlbS5hY3Rpb24oKTsKICAgICAgYXdhaXQgdGhpcy5kZXN0cm95QWxsKCk7CiAgICB9CiAgICBhc3luYyBoYW5kbGVNZW51SXRlbUhvdmVyKG1lbnVJdGVtLCBoYXNTdWJtZW51KSB7CiAgICAgIGlmICh0aGlzLnN1Ym1lbnVUaW1lb3V0KSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc3VibWVudVRpbWVvdXQpOwogICAgICAgIHRoaXMuc3VibWVudVRpbWVvdXQgPSBudWxsOwogICAgICB9CiAgICAgIGlmICh0aGlzLnN1Ym1lbnUpIHsKICAgICAgICBhd2FpdCB0aGlzLmhpZGVTdWJtZW51KCk7CiAgICAgIH0KICAgICAgaWYgKGhhc1N1Ym1lbnUgJiYgbWVudUl0ZW0uc3VibWVudSkgewogICAgICAgIHRoaXMuc3VibWVudVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgIHRoaXMuc2hvd1N1Ym1lbnUobWVudUl0ZW0pOwogICAgICAgIH0sIDIwMCk7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZU1lbnVJdGVtTGVhdmUoKSB7CiAgICAgIGlmICh0aGlzLnN1Ym1lbnVUaW1lb3V0KSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc3VibWVudVRpbWVvdXQpOwogICAgICB9CiAgICAgIHRoaXMuc3VibWVudVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICBpZiAodGhpcy5zdWJtZW51ICYmICF0aGlzLnN1Ym1lbnUubWF0Y2hlcygiOmhvdmVyIikpIHsKICAgICAgICAgIHRoaXMuaGlkZVN1Ym1lbnUoKTsKICAgICAgICB9CiAgICAgIH0sIDMwMCk7CiAgICB9CiAgICBhc3luYyBzaG93U3VibWVudShtZW51SXRlbSkgewogICAgICBpZiAoIW1lbnVJdGVtLnN1Ym1lbnUgfHwgbWVudUl0ZW0uc3VibWVudS5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBtZW51SXRlbXMgPSBBcnJheS5mcm9tKHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCIubWVudWl0ZW0iKSk7CiAgICAgIGNvbnN0IG1lbnVJdGVtRWxlbWVudCA9IG1lbnVJdGVtcy5maW5kKChlbCkgPT4gZWwucXVlcnlTZWxlY3RvcigiLm1lbnVpdGVtLXRleHQiKT8udGV4dENvbnRlbnQgPT09IG1lbnVJdGVtLm5hbWUpOwogICAgICBpZiAoIW1lbnVJdGVtRWxlbWVudCkKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMuc3VibWVudSA9IG5ldyBEZWVzQ29udGV4dG1lbnU1KCk7CiAgICAgIHRoaXMuc3VibWVudS5tZW51SXRlbXMgPSBtZW51SXRlbS5zdWJtZW51OwogICAgICB0aGlzLnN1Ym1lbnUucGFyZW50TWVudSA9IHRoaXM7CiAgICAgIHRoaXMuc3VibWVudS5zdHlsZS5wb3NpdGlvbiA9ICJmaXhlZCI7CiAgICAgIHRoaXMuc3VibWVudS5zdHlsZS56SW5kZXggPSBTdHJpbmcocGFyc2VJbnQodGhpcy5zdHlsZS56SW5kZXgpICsgMSk7CiAgICAgIHRoaXMuc3VibWVudS5zdHlsZS5vcGFjaXR5ID0gIjAiOwogICAgICB0aGlzLnN1Ym1lbnUuc3R5bGUudHJhbnNmb3JtID0gInNjYWxlKDAuOTUpIjsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQodGhpcy5zdWJtZW51KTsKICAgICAgYXdhaXQgZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzLnNtYXJ0ZGVsYXkuZGVsYXlGb3IoMCk7CiAgICAgIGNvbnN0IGl0ZW1SZWN0ID0gbWVudUl0ZW1FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBjb25zdCBtZW51UmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IHN1Ym1lbnVSZWN0ID0gdGhpcy5zdWJtZW51LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBjb25zdCB3aW5kb3dXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoOwogICAgICBsZXQgbGVmdCA9IG1lbnVSZWN0LnJpZ2h0IC0gNDsKICAgICAgbGV0IHRvcCA9IGl0ZW1SZWN0LnRvcDsKICAgICAgaWYgKGxlZnQgKyBzdWJtZW51UmVjdC53aWR0aCA+IHdpbmRvd1dpZHRoIC0gMTApIHsKICAgICAgICBsZWZ0ID0gbWVudVJlY3QubGVmdCAtIHN1Ym1lbnVSZWN0LndpZHRoICsgNDsKICAgICAgfQogICAgICBpZiAodG9wICsgc3VibWVudVJlY3QuaGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0IC0gMTApIHsKICAgICAgICB0b3AgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSBzdWJtZW51UmVjdC5oZWlnaHQgLSAxMDsKICAgICAgfQogICAgICB0aGlzLnN1Ym1lbnUuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgOwogICAgICB0aGlzLnN1Ym1lbnUuc3R5bGUudG9wID0gYCR7dG9wfXB4YDsKICAgICAgYXdhaXQgZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzLnNtYXJ0ZGVsYXkuZGVsYXlGb3IoMCk7CiAgICAgIHRoaXMuc3VibWVudS5zdHlsZS5vcGFjaXR5ID0gIjEiOwogICAgICB0aGlzLnN1Ym1lbnUuc3R5bGUudHJhbnNmb3JtID0gInNjYWxlKDEpIjsKICAgICAgdGhpcy5zdWJtZW51LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCAoKSA9PiB7CiAgICAgICAgaWYgKHRoaXMuc3VibWVudVRpbWVvdXQpIHsKICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnN1Ym1lbnVUaW1lb3V0KTsKICAgICAgICAgIHRoaXMuc3VibWVudVRpbWVvdXQgPSBudWxsOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMuc3VibWVudS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwgKCkgPT4gewogICAgICAgIHRoaXMuaGFuZGxlTWVudUl0ZW1MZWF2ZSgpOwogICAgICB9KTsKICAgIH0KICAgIGFzeW5jIGhpZGVTdWJtZW51KCkgewogICAgICBpZiAoIXRoaXMuc3VibWVudSkKICAgICAgICByZXR1cm47CiAgICAgIGF3YWl0IHRoaXMuc3VibWVudS5kZXN0cm95KCk7CiAgICAgIHRoaXMuc3VibWVudSA9IG51bGw7CiAgICB9CiAgICBhc3luYyBkZXN0cm95KCkgewogICAgICBpZiAodGhpcy5pc0Rlc3Ryb3lpbmcpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5pc0Rlc3Ryb3lpbmcgPSB0cnVlOwogICAgICBpZiAodGhpcy5zdWJtZW51VGltZW91dCkgewogICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnN1Ym1lbnVUaW1lb3V0KTsKICAgICAgICB0aGlzLnN1Ym1lbnVUaW1lb3V0ID0gbnVsbDsKICAgICAgfQogICAgICBpZiAodGhpcy5zdWJtZW51KSB7CiAgICAgICAgYXdhaXQgdGhpcy5zdWJtZW51LmRlc3Ryb3koKTsKICAgICAgICB0aGlzLnN1Ym1lbnUgPSBudWxsOwogICAgICB9CiAgICAgIGlmICh0aGlzLndpbmRvd0xheWVyICYmICF0aGlzLnBhcmVudE1lbnUpIHsKICAgICAgICB0aGlzLndpbmRvd0xheWVyLmRlc3Ryb3koKTsKICAgICAgfQogICAgICB0aGlzLnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgIHRoaXMuc3R5bGUudHJhbnNmb3JtID0gInNjYWxlKDAuOTUpIHRyYW5zbGF0ZVkoLTEwcHgpIjsKICAgICAgYXdhaXQgZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzLnNtYXJ0ZGVsYXkuZGVsYXlGb3IoMTAwKTsKICAgICAgaWYgKHRoaXMucGFyZW50RWxlbWVudCkgewogICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBEZXN0cm95cyB0aGlzIG1lbnUgYW5kIGFsbCBwYXJlbnQgbWVudXMgaW4gdGhlIGNoYWluCiAgICAgKi8KICAgIGFzeW5jIGRlc3Ryb3lBbGwoKSB7CiAgICAgIGxldCByb290TWVudSA9IHRoaXM7CiAgICAgIHdoaWxlIChyb290TWVudS5wYXJlbnRNZW51KSB7CiAgICAgICAgcm9vdE1lbnUgPSByb290TWVudS5wYXJlbnRNZW51OwogICAgICB9CiAgICAgIGF3YWl0IHJvb3RNZW51LmRlc3Ryb3koKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNihfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0NvbnRleHRtZW51NSA9IF9jbGFzc1RoaXM7Cn0pKCk7CkRlZXNDb250ZXh0bWVudS5pbml0aWFsaXplR2xvYmFsTGlzdGVuZXIoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLXdjY3Rvb2xzQDMuOC4wL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLXdjY3Rvb2xzL2Rpc3RfdHNfZGVtb3Rvb2xzL2RlbW90b29scy5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgX19lc0RlY29yYXRlNiA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNyA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0RlbW9XcmFwcGVyID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1kZW1vd3JhcHBlciIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3J1bkFmdGVyUmVuZGVyX2RlY29yYXRvcnM7CiAgbGV0IF9ydW5BZnRlclJlbmRlcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3J1bkFmdGVyUmVuZGVyX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNEZW1vV3JhcHBlcjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9ydW5BZnRlclJlbmRlcl9kZWNvcmF0b3JzID0gW241KHsgYXR0cmlidXRlOiBmYWxzZSB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTYodGhpcywgbnVsbCwgX3J1bkFmdGVyUmVuZGVyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJ1bkFmdGVyUmVuZGVyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJydW5BZnRlclJlbmRlciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5ydW5BZnRlclJlbmRlciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucnVuQWZ0ZXJSZW5kZXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcnVuQWZ0ZXJSZW5kZXJfaW5pdGlhbGl6ZXJzLCBfcnVuQWZ0ZXJSZW5kZXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0RlbW9XcmFwcGVyMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAjcnVuQWZ0ZXJSZW5kZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNyh0aGlzLCBfcnVuQWZ0ZXJSZW5kZXJfaW5pdGlhbGl6ZXJzLCB2b2lkIDApOwogICAgZ2V0IHJ1bkFmdGVyUmVuZGVyKCkgewogICAgICByZXR1cm4gdGhpcy4jcnVuQWZ0ZXJSZW5kZXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBydW5BZnRlclJlbmRlcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jcnVuQWZ0ZXJSZW5kZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIGlgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBjb250ZW50czsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8c2xvdD48L3Nsb3Q+CiAgICBgOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKCkgewogICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlOwogICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHNldFRpbWVvdXQocmVzb2x2ZTIsIDUwKSk7CiAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgdGhpcy5ydW5BZnRlclJlbmRlcikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBhd2FpdCB0aGlzLnJ1bkFmdGVyUmVuZGVyKHRoaXMpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCJFcnJvciBpbiBydW5BZnRlclJlbmRlcjoiLCBlcnJvcik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnM3KHRoaXMsIF9ydW5BZnRlclJlbmRlcl9leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczcoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNEZW1vV3JhcHBlcjIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWFwcHVpL2RlZXMtYXBwdWktYWN0aXZpdHlsb2cvZGVlcy1hcHB1aS1hY3Rpdml0eWxvZy5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vRnVuYzMgPSAoKSA9PiB7CiAgY29uc3QgYWN0aXZpdHlMb2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkZWVzLWFwcHVpLWFjdGl2aXR5bG9nIik7CiAgc2V0VGltZW91dCgoKSA9PiB7CiAgICBhY3Rpdml0eUxvZy5hZGRNYW55KFsKICAgICAgeyB0eXBlOiAibG9naW4iLCB1c2VyOiAiSm9obiBEb2UiLCBtZXNzYWdlOiAibG9nZ2VkIGluIGZyb20gQ2hyb21lIG9uIG1hY09TIiB9LAogICAgICB7IHR5cGU6ICJjcmVhdGUiLCB1c2VyOiAiSm9obiBEb2UiLCBtZXNzYWdlOiAnY3JlYXRlZCBhIG5ldyBwcm9qZWN0ICJGcm9udGVuZCBBcHAiJyB9LAogICAgICB7IHR5cGU6ICJ1cGRhdGUiLCB1c2VyOiAiSmFuZSBTbWl0aCIsIG1lc3NhZ2U6ICJ1cGRhdGVkIEFQSSBkb2N1bWVudGF0aW9uIiB9LAogICAgICB7IHR5cGU6ICJ2aWV3IiwgdXNlcjogIkpvaG4gRG9lIiwgbWVzc2FnZTogInZpZXdlZCBkYXNoYm9hcmQgYW5hbHl0aWNzIiB9LAogICAgICB7IHR5cGU6ICJkZWxldGUiLCB1c2VyOiAiQWRtaW4iLCBtZXNzYWdlOiAicmVtb3ZlZCBkZXByZWNhdGVkIGVuZHBvaW50IiB9LAogICAgICB7IHR5cGU6ICJjdXN0b20iLCB1c2VyOiAiU3lzdGVtIiwgbWVzc2FnZTogInNjaGVkdWxlZCBiYWNrdXAgY29tcGxldGVkIiwgaWNvbk5hbWU6ICJsdWNpZGU6ZGF0YWJhc2UiIH0sCiAgICAgIHsgdHlwZTogImxvZ291dCIsIHVzZXI6ICJBbGljZSBCcm93biIsIG1lc3NhZ2U6ICJsb2dnZWQgb3V0IiB9LAogICAgICB7IHR5cGU6ICJjcmVhdGUiLCB1c2VyOiAiSmFuZSBTbWl0aCIsIG1lc3NhZ2U6ICJjcmVhdGVkIGludm9pY2UgIzEyMzQiIH0KICAgIF0pOwogICAgYWN0aXZpdHlMb2cuZW50cmllcyQuc3Vic2NyaWJlKChlbnRyaWVzKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJBY3Rpdml0eSBsb2cgdXBkYXRlZDoiLCBlbnRyaWVzLmxlbmd0aCwgImVudHJpZXMiKTsKICAgIH0pOwogIH0sIDEwMCk7CiAgcmV0dXJuIGIyYAogICAgPGRlZXMtZGVtb3dyYXBwZXI+CiAgICAgIDxzdHlsZT4KICAgICAgICAuZGVtby1jb250YWluZXIgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGhlaWdodDogNjAwcHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjMDkwOTBiIil9OwogICAgICAgICAgcGFkZGluZzogMzJweDsKICAgICAgICB9CiAgICAgIDwvc3R5bGU+CiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgICAgICAke2FjdGl2aXR5TG9nfQogICAgICA8L2Rpdj4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICBgOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWFwcHVpL2RlZXMtYXBwdWktYWN0aXZpdHlsb2cvZGVlcy1hcHB1aS1hY3Rpdml0eWxvZy5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2Rpc3RfdHMyNSgpOwppbml0X2RlZXNfaWNvbigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU3ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM4ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzQXBwdWlBY3Rpdml0eWxvZyA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtYXBwdWktYWN0aXZpdHlsb2ciKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9lbnRyaWVzX2RlY29yYXRvcnM7CiAgbGV0IF9lbnRyaWVzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZW50cmllc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VhcmNoUXVlcnlfZGVjb3JhdG9yczsKICBsZXQgX3NlYXJjaFF1ZXJ5X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VhcmNoUXVlcnlfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ZpbHRlckNyaXRlcmlhX2RlY29yYXRvcnM7CiAgbGV0IF9maWx0ZXJDcml0ZXJpYV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ZpbHRlckNyaXRlcmlhX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNBcHB1aUFjdGl2aXR5bG9nMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2VudHJpZXNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3NlYXJjaFF1ZXJ5X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9maWx0ZXJDcml0ZXJpYV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGU3KHRoaXMsIG51bGwsIF9lbnRyaWVzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImVudHJpZXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImVudHJpZXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZW50cmllcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZW50cmllcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9lbnRyaWVzX2luaXRpYWxpemVycywgX2VudHJpZXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3KHRoaXMsIG51bGwsIF9zZWFyY2hRdWVyeV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWFyY2hRdWVyeSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VhcmNoUXVlcnkiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VhcmNoUXVlcnksIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlYXJjaFF1ZXJ5ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlYXJjaFF1ZXJ5X2luaXRpYWxpemVycywgX3NlYXJjaFF1ZXJ5X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNyh0aGlzLCBudWxsLCBfZmlsdGVyQ3JpdGVyaWFfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZmlsdGVyQ3JpdGVyaWEiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZpbHRlckNyaXRlcmlhIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmZpbHRlckNyaXRlcmlhLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5maWx0ZXJDcml0ZXJpYSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9maWx0ZXJDcml0ZXJpYV9pbml0aWFsaXplcnMsIF9maWx0ZXJDcml0ZXJpYV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzQXBwdWlBY3Rpdml0eWxvZzIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgLy8gU1RBVElDCiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMzsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJBcHAgVUkiXTsKICAgICNlbnRyaWVzX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczgodGhpcywgX2VudHJpZXNfaW5pdGlhbGl6ZXJzLCBbXSk7CiAgICAvLyBJTlNUQU5DRSBQUk9QRVJUSUVTCiAgICBnZXQgZW50cmllcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2VudHJpZXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBlbnRyaWVzKHZhbHVlMikgewogICAgICB0aGlzLiNlbnRyaWVzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VhcmNoUXVlcnlfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgodGhpcywgX2VudHJpZXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczgodGhpcywgX3NlYXJjaFF1ZXJ5X2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBzZWFyY2hRdWVyeSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlYXJjaFF1ZXJ5X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VhcmNoUXVlcnkodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlYXJjaFF1ZXJ5X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZmlsdGVyQ3JpdGVyaWFfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgodGhpcywgX3NlYXJjaFF1ZXJ5X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4KHRoaXMsIF9maWx0ZXJDcml0ZXJpYV9pbml0aWFsaXplcnMsIHt9KSk7CiAgICBnZXQgZmlsdGVyQ3JpdGVyaWEoKSB7CiAgICAgIHJldHVybiB0aGlzLiNmaWx0ZXJDcml0ZXJpYV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGZpbHRlckNyaXRlcmlhKHZhbHVlMikgewogICAgICB0aGlzLiNmaWx0ZXJDcml0ZXJpYV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgLy8gUnhKUyBTdWJqZWN0IGZvciByZWFjdGl2ZSB1cGRhdGVzCiAgICBlbnRyaWVzJCA9IChfX3J1bkluaXRpYWxpemVyczgodGhpcywgX2ZpbHRlckNyaXRlcmlhX2V4dHJhSW5pdGlhbGl6ZXJzKSwgbmV3IGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cy5zbWFydHJ4LnJ4anMuU3ViamVjdCgpKTsKICAgIC8vIFNUWUxFUwogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIDpob3N0IHsKICAgICAgICAvKiBDU1MgVmFyaWFibGVzIGFsaWduZWQgd2l0aCBzZWNvbmRhcnkgbWVudSAqLwogICAgICAgIC0tYWN0aXZpdHlsb2ctYmc6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmFmYWZhIiwgIiMwYTBhMGEiKX07CiAgICAgICAgLS1hY3Rpdml0eWxvZy1mZzogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM1MjUyNTIiLCAiI2EzYTNhMyIpfTsKICAgICAgICAtLWFjdGl2aXR5bG9nLWZnLW11dGVkOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzczNzM3MyIsICIjNzM3MzczIil9OwogICAgICAgIC0tYWN0aXZpdHlsb2ctZmctYWN0aXZlOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzBhMGEwYSIsICIjZmFmYWZhIil9OwogICAgICAgIC0tYWN0aXZpdHlsb2ctYm9yZGVyOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTVlNSIsICIjMWExYTFhIil9OwogICAgICAgIC0tYWN0aXZpdHlsb2ctaG92ZXI6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDQpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNikiKX07CiAgICAgICAgLS1hY3Rpdml0eWxvZy1hY2NlbnQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzg3MTZjIiwgIiNiNWE5OWEiKX07CgogICAgICAgIGNvbG9yOiB2YXIoLS1hY3Rpdml0eWxvZy1mZyk7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY3Rpdml0eWxvZy1iZyk7CiAgICAgICAgZm9udC1mYW1pbHk6ICdHZWlzdCBTYW5zJywgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBzYW5zLXNlcmlmOwogICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tYWN0aXZpdHlsb2ctYm9yZGVyKTsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLm1haW5jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDBweDsKICAgICAgICBsZWZ0OiAwcHg7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAyODBweDsKICAgICAgfQoKICAgICAgLyogSGVhZGVyIHdpdGggc3RyZWFtaW5nIGluZGljYXRvciAqLwogICAgICAudG9wYmFyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBhZGRpbmc6IDBweCAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWFjdGl2aXR5bG9nLWJnKTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYWN0aXZpdHlsb2ctYm9yZGVyKTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgIC50b3BiYXIgLmhlYWRpbmcgewogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGNvbG9yOiB2YXIoLS1hY3Rpdml0eWxvZy1mZy1hY3RpdmUpOwogICAgICB9CgogICAgICAubGl2ZS1pbmRpY2F0b3IgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDZweDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07CiAgICAgICAgY29sb3I6IHZhcigtLWFjdGl2aXR5bG9nLWZnLW11dGVkKTsKICAgICAgfQoKICAgICAgLmxpdmUtaW5kaWNhdG9yIC5kb3QgewogICAgICAgIHdpZHRoOiA2cHg7CiAgICAgICAgaGVpZ2h0OiA2cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyMmM1NWUiLCAiIzIyYzU1ZSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYW5pbWF0aW9uOiBwdWxzZSAycyBlYXNlLWluLW91dCBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBwdWxzZSB7CiAgICAgICAgMCUsIDEwMCUgeyBvcGFjaXR5OiAwLjU7IHRyYW5zZm9ybTogc2NhbGUoMC45KTsgfQogICAgICAgIDUwJSB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogc2NhbGUoMS4xKTsgfQogICAgICB9CgogICAgICAvKiBBY3Rpdml0eSBjb250YWluZXIgKi8KICAgICAgLmFjdGl2aXR5Q29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA0OHB4OwogICAgICAgIGJvdHRvbTogNDhweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwYWRkaW5nOiA4cHggMDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICAgICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwogICAgICAgIHNjcm9sbGJhci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkNGQ0ZDQiLCAiIzMzMzMzMyIpfSB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgLmFjdGl2aXR5Q29udGFpbmVyOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICAgICAgd2lkdGg6IDZweDsKICAgICAgfQoKICAgICAgLmFjdGl2aXR5Q29udGFpbmVyOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC5hY3Rpdml0eUNvbnRhaW5lcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDRkNGQ0IiwgIiMzMzMzMzMiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICB9CgogICAgICAuYWN0aXZpdHlDb250YWluZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2EzYTNhMyIsICIjNTI1MjUyIil9OwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgcGFkZGluZzogNDBweCAxNnB4OwogICAgICAgIGNvbG9yOiB2YXIoLS1hY3Rpdml0eWxvZy1mZy1tdXRlZCk7CiAgICAgIH0KCiAgICAgIC8qIERhdGUgc2VwYXJhdG9yIC0gd2FybSB0YXVwZSBzdHlsaW5nICovCiAgICAgIC5kYXRlLXNlcGFyYXRvciB7CiAgICAgICAgcGFkZGluZzogMTJweCAxMnB4IDZweDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgICAgICBjb2xvcjogdmFyKC0tYWN0aXZpdHlsb2ctYWNjZW50KTsKICAgICAgICBwb3NpdGlvbjogc3RpY2t5OwogICAgICAgIHRvcDogMDsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWFjdGl2aXR5bG9nLWJnKTsKICAgICAgfQoKICAgICAgLyogQWN0aXZpdHkgZW50cnkgLSBtb2Rlcm4gc3RhY2tlZCBsYXlvdXQgKi8KICAgICAgLmFjdGl2aXR5ZW50cnkgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBtYXJnaW46IDJweCA0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMgZWFzZTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICAgIGdhcDogMTBweDsKICAgICAgICBsaW5lLWhlaWdodDogMS40OwogICAgICAgIGFuaW1hdGlvbjogZmFkZUluIDAuMnMgZWFzZS1vdXQ7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgZmFkZUluIHsKICAgICAgICBmcm9tIHsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7CiAgICAgICAgfQogICAgICAgIHRvIHsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAuYWN0aXZpdHllbnRyeTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYWN0aXZpdHlsb2ctaG92ZXIpOwogICAgICB9CgogICAgICAuYWN0aXZpdHktaWNvbiB7CiAgICAgICAgd2lkdGg6IDI4cHg7CiAgICAgICAgaGVpZ2h0OiAyOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjA0KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpIil9OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6IHZhcigtLWFjdGl2aXR5bG9nLWZnLW11dGVkKTsKICAgICAgICBtYXJnaW4tdG9wOiAxcHg7CiAgICAgIH0KCiAgICAgIC5hY3Rpdml0eS1pY29uLmxvZ2luIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgzNCwgMTk3LCA5NCwgMC4wOCkiLCAicmdiYSgzNCwgMTk3LCA5NCwgMC4xMikiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTZhMzRhIiwgIiM0YWRlODAiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpdml0eS1pY29uLmxvZ291dCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMjM5LCA2OCwgNjgsIDAuMDgpIiwgInJnYmEoMjM5LCA2OCwgNjgsIDAuMTIpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2RjMjYyNiIsICIjZjg3MTcxIil9OwogICAgICB9CgogICAgICAuYWN0aXZpdHktaWNvbi52aWV3IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSg1OSwgMTMwLCAyNDYsIDAuMDgpIiwgInJnYmEoNTksIDEzMCwgMjQ2LCAwLjEyKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyNTYzZWIiLCAiIzYwYTVmYSIpfTsKICAgICAgfQoKICAgICAgLmFjdGl2aXR5LWljb24uY3JlYXRlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgxNjgsIDg1LCAyNDcsIDAuMDgpIiwgInJnYmEoMTY4LCA4NSwgMjQ3LCAwLjEyKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5MzMzZWEiLCAiI2MwODRmYyIpfTsKICAgICAgfQoKICAgICAgLmFjdGl2aXR5LWljb24udXBkYXRlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgyNTEsIDE0NiwgNjAsIDAuMDgpIiwgInJnYmEoMjUxLCAxNDYsIDYwLCAwLjEyKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlYTU4MGMiLCAiI2ZiOTIzYyIpfTsKICAgICAgfQoKICAgICAgLmFjdGl2aXR5LWljb24uZGVsZXRlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgyMzksIDY4LCA2OCwgMC4wOCkiLCAicmdiYSgyMzksIDY4LCA2OCwgMC4xMikiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZGMyNjI2IiwgIiNmODcxNzEiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpdml0eS1pY29uLmN1c3RvbSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMTAwLCAxMTYsIDEzOSwgMC4wOCkiLCAicmdiYSgxMDAsIDExNiwgMTM5LCAwLjEyKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM0NzU1NjkiLCAiIzk0YTNiOCIpfTsKICAgICAgfQoKICAgICAgLmFjdGl2aXR5LWNvbnRlbnQgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDJweDsKICAgICAgfQoKICAgICAgLmFjdGl2aXR5LWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNnB4OwogICAgICB9CgogICAgICAuYWN0aXZpdHktdXNlciB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6IHZhcigtLWFjdGl2aXR5bG9nLWZnLWFjdGl2ZSk7CiAgICAgIH0KCiAgICAgIC5hY3Rpdml0eS1zZXBhcmF0b3IgewogICAgICAgIGNvbG9yOiB2YXIoLS1hY3Rpdml0eWxvZy1mZy1tdXRlZCk7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICB9CgogICAgICAudGltZXN0YW1wIHsKICAgICAgICBjb2xvcjogdmFyKC0tYWN0aXZpdHlsb2ctZmctbXV0ZWQpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICAgICAgZm9udC1mYW1pbHk6ICdHZWlzdCBNb25vJywgbW9ub3NwYWNlOwogICAgICB9CgogICAgICAuYWN0aXZpdHktbWVzc2FnZSB7CiAgICAgICAgY29sb3I6IHZhcigtLWFjdGl2aXR5bG9nLWZnKTsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgICB9CgogICAgICAvKiBTZWFyY2ggYm94IC0gcmVmaW5lZCBzdHlsaW5nICovCiAgICAgIC5zZWFyY2hib3ggewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYWN0aXZpdHlsb2ctYmcpOwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1hY3Rpdml0eWxvZy1ib3JkZXIpOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgIC5zZWFyY2gtd3JhcHBlciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgfQoKICAgICAgLnNlYXJjaC1pY29uIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogMTBweDsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICAgICAgY29sb3I6IHZhcigtLWFjdGl2aXR5bG9nLWZnLW11dGVkKTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgdHJhbnNpdGlvbjogY29sb3IgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnNlYXJjaGJveCBpbnB1dCB7CiAgICAgICAgY29sb3I6IHZhcigtLWFjdGl2aXR5bG9nLWZnLWFjdGl2ZSk7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wMykiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSIpfTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wOCkiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgcGFkZGluZzogMCAxMnB4IDAgMzRweDsKICAgICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCBzYW5zLXNlcmlmOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnNlYXJjaGJveCBpbnB1dDo6cGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1hY3Rpdml0eWxvZy1mZy1tdXRlZCk7CiAgICAgIH0KCiAgICAgIC5zZWFyY2hib3ggaW5wdXQ6Zm9jdXMgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjE1KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDIpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNikiKX07CiAgICAgIH0KCiAgICAgIC5zZWFyY2gtd3JhcHBlcjpoYXMoaW5wdXQ6Zm9jdXMpIC5zZWFyY2gtaWNvbiB7CiAgICAgICAgY29sb3I6IHZhcigtLWFjdGl2aXR5bG9nLWZnKTsKICAgICAgfQogICAgYAogICAgXTsKICAgIC8vIFJFTkRFUgogICAgcmVuZGVyKCkgewogICAgICBjb25zdCBmaWx0ZXJlZEVudHJpZXMgPSB0aGlzLmdldEZpbHRlcmVkRW50cmllcygpOwogICAgICBjb25zdCBncm91cGVkRW50cmllcyA9IHRoaXMuZ3JvdXBFbnRyaWVzQnlEYXRlKGZpbHRlcmVkRW50cmllcyk7CiAgICAgIHJldHVybiBiMmAKICAgICAgJHtkb210b29sc19lbGVtZW50YmFzaWNfZXhwb3J0cy5zdHlsZXN9CiAgICAgIDxzdHlsZT48L3N0eWxlPgogICAgICA8ZGl2IGNsYXNzPSJtYWluY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0b3BiYXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZyI+QWN0aXZpdHkgTG9nPC9kaXY+CiAgICAgICAgICAke2ZpbHRlcmVkRW50cmllcy5sZW5ndGggPiAwID8gYjJgPGRpdiBjbGFzcz0ibGl2ZS1pbmRpY2F0b3IiPjxzcGFuIGNsYXNzPSJkb3QiPjwvc3Bhbj5MaXZlPC9kaXY+YCA6ICIifQogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImFjdGl2aXR5Q29udGFpbmVyIj4KICAgICAgICAgICR7ZmlsdGVyZWRFbnRyaWVzLmxlbmd0aCA9PT0gMCA/IGIyYDxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlIj5ObyBhY3Rpdml0eSBlbnRyaWVzPC9kaXY+YCA6IGdyb3VwZWRFbnRyaWVzLm1hcCgoZ3JvdXApID0+IGIyYAogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRlLXNlcGFyYXRvciI+JHtncm91cC5sYWJlbH08L2Rpdj4KICAgICAgICAgICAgICAgICAgJHtncm91cC5lbnRyaWVzLm1hcCgoZW50cnkpID0+IHRoaXMucmVuZGVyQWN0aXZpdHlFbnRyeShlbnRyeSkpfQogICAgICAgICAgICAgICAgYCl9CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VhcmNoYm94Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9InNlYXJjaC13cmFwcGVyIj4KICAgICAgICAgICAgPGRlZXMtaWNvbiBjbGFzcz0ic2VhcmNoLWljb24iIC5pY29uPSR7Imx1Y2lkZTpzZWFyY2gifT48L2RlZXMtaWNvbj4KICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgdHlwZT0idGV4dCIKICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iU2VhcmNoIGFjdGl2aXRpZXMsIHVzZXJzLi4uIgogICAgICAgICAgICAgIC52YWx1ZT0ke3RoaXMuc2VhcmNoUXVlcnl9CiAgICAgICAgICAgICAgQGlucHV0PSR7dGhpcy5oYW5kbGVTZWFyY2hJbnB1dH0KICAgICAgICAgICAgLz4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJBY3Rpdml0eUVudHJ5KGVudHJ5KSB7CiAgICAgIGNvbnN0IHRpbWVzdGFtcDIgPSBlbnRyeS50aW1lc3RhbXAgfHwgLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7CiAgICAgIGNvbnN0IHRpbWVTdHIgPSB0aGlzLmZvcm1hdFRpbWUodGltZXN0YW1wMik7CiAgICAgIGNvbnN0IGljb25OYW1lID0gZW50cnkuaWNvbk5hbWUgfHwgdGhpcy5nZXRJY29uRm9yVHlwZShlbnRyeS50eXBlKTsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9ImFjdGl2aXR5ZW50cnkiCiAgICAgICAgQGNvbnRleHRtZW51PSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVDb250ZXh0TWVudShlMTEsIGVudHJ5KX0KICAgICAgPgogICAgICAgIDxkaXYgY2xhc3M9ImFjdGl2aXR5LWljb24gJHtlbnRyeS50eXBlfSI+CiAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7aWNvbk5hbWV9PjwvZGVlcy1pY29uPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImFjdGl2aXR5LWNvbnRlbnQiPgogICAgICAgICAgPGRpdiBjbGFzcz0iYWN0aXZpdHktaGVhZGVyIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImFjdGl2aXR5LXVzZXIiPiR7ZW50cnkudXNlcn08L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJhY3Rpdml0eS1zZXBhcmF0b3IiPsK3PC9zcGFuPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0idGltZXN0YW1wIj4ke3RpbWVTdHJ9PC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJhY3Rpdml0eS1tZXNzYWdlIj4ke2VudHJ5Lm1lc3NhZ2V9PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIC8vIEFQSSBNRVRIT0RTCiAgICBhZGQoZW50cnkpIHsKICAgICAgY29uc3QgbmV3RW50cnkgPSB7CiAgICAgICAgLi4uZW50cnksCiAgICAgICAgaWQ6IGVudHJ5LmlkIHx8IHRoaXMuZ2VuZXJhdGVJZCgpLAogICAgICAgIHRpbWVzdGFtcDogZW50cnkudGltZXN0YW1wIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpCiAgICAgIH07CiAgICAgIHRoaXMuZW50cmllcyA9IFtuZXdFbnRyeSwgLi4udGhpcy5lbnRyaWVzXTsKICAgICAgdGhpcy5lbnRyaWVzJC5uZXh0KHRoaXMuZW50cmllcyk7CiAgICB9CiAgICBhZGRNYW55KGVudHJpZXMpIHsKICAgICAgY29uc3QgbmV3RW50cmllcyA9IGVudHJpZXMubWFwKChlbnRyeSkgPT4gKHsKICAgICAgICAuLi5lbnRyeSwKICAgICAgICBpZDogZW50cnkuaWQgfHwgdGhpcy5nZW5lcmF0ZUlkKCksCiAgICAgICAgdGltZXN0YW1wOiBlbnRyeS50aW1lc3RhbXAgfHwgLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkKICAgICAgfSkpOwogICAgICB0aGlzLmVudHJpZXMgPSBbLi4ubmV3RW50cmllcy5yZXZlcnNlKCksIC4uLnRoaXMuZW50cmllc107CiAgICAgIHRoaXMuZW50cmllcyQubmV4dCh0aGlzLmVudHJpZXMpOwogICAgfQogICAgY2xlYXIoKSB7CiAgICAgIHRoaXMuZW50cmllcyA9IFtdOwogICAgICB0aGlzLmVudHJpZXMkLm5leHQodGhpcy5lbnRyaWVzKTsKICAgIH0KICAgIGdldEVudHJpZXMoKSB7CiAgICAgIHJldHVybiBbLi4udGhpcy5lbnRyaWVzXTsKICAgIH0KICAgIGZpbHRlcihjcml0ZXJpYSkgewogICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IHsKICAgICAgICBpZiAoY3JpdGVyaWEudXNlciAmJiBlbnRyeS51c2VyICE9PSBjcml0ZXJpYS51c2VyKQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChjcml0ZXJpYS50eXBlICYmIGVudHJ5LnR5cGUgIT09IGNyaXRlcmlhLnR5cGUpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0pOwogICAgfQogICAgc2VhcmNoKHF1ZXJ5KSB7CiAgICAgIGNvbnN0IGxvd2VyUXVlcnkgPSBxdWVyeS50b0xvd2VyQ2FzZSgpOwogICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5Lm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlclF1ZXJ5KSB8fCBlbnRyeS51c2VyLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJRdWVyeSkpOwogICAgfQogICAgLy8gUFJJVkFURSBIRUxQRVJTCiAgICBnZW5lcmF0ZUlkKCkgewogICAgICByZXR1cm4gYGFjdGl2aXR5LSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSl9YDsKICAgIH0KICAgIGdldEZpbHRlcmVkRW50cmllcygpIHsKICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuZW50cmllczsKICAgICAgaWYgKHRoaXMuc2VhcmNoUXVlcnkpIHsKICAgICAgICBjb25zdCBsb3dlclF1ZXJ5ID0gdGhpcy5zZWFyY2hRdWVyeS50b0xvd2VyQ2FzZSgpOwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJRdWVyeSkgfHwgZW50cnkudXNlci50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyUXVlcnkpKTsKICAgICAgfQogICAgICBpZiAodGhpcy5maWx0ZXJDcml0ZXJpYS51c2VyIHx8IHRoaXMuZmlsdGVyQ3JpdGVyaWEudHlwZSkgewogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoKGVudHJ5KSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5maWx0ZXJDcml0ZXJpYS51c2VyICYmIGVudHJ5LnVzZXIgIT09IHRoaXMuZmlsdGVyQ3JpdGVyaWEudXNlcikKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgaWYgKHRoaXMuZmlsdGVyQ3JpdGVyaWEudHlwZSAmJiBlbnRyeS50eXBlICE9PSB0aGlzLmZpbHRlckNyaXRlcmlhLnR5cGUpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBncm91cEVudHJpZXNCeURhdGUoZW50cmllcykgewogICAgICBjb25zdCBncm91cHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICBjb25zdCB0b2RheSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpOwogICAgICBjb25zdCB5ZXN0ZXJkYXkgPSBuZXcgRGF0ZSh0b2RheSk7CiAgICAgIHllc3RlcmRheS5zZXREYXRlKHllc3RlcmRheS5nZXREYXRlKCkgLSAxKTsKICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7CiAgICAgICAgY29uc3QgZGF0ZSA9IGVudHJ5LnRpbWVzdGFtcCB8fCAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTsKICAgICAgICBsZXQgbGFiZWw7CiAgICAgICAgaWYgKHRoaXMuaXNTYW1lRGF5KGRhdGUsIHRvZGF5KSkgewogICAgICAgICAgbGFiZWwgPSAiVG9kYXkiOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1NhbWVEYXkoZGF0ZSwgeWVzdGVyZGF5KSkgewogICAgICAgICAgbGFiZWwgPSAiWWVzdGVyZGF5IjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGFiZWwgPSBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygiZW4tVVMiLCB7CiAgICAgICAgICAgIG1vbnRoOiAic2hvcnQiLAogICAgICAgICAgICBkYXk6ICJudW1lcmljIiwKICAgICAgICAgICAgeWVhcjogZGF0ZS5nZXRGdWxsWWVhcigpICE9PSB0b2RheS5nZXRGdWxsWWVhcigpID8gIm51bWVyaWMiIDogdm9pZCAwCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCFncm91cHMuaGFzKGxhYmVsKSkgewogICAgICAgICAgZ3JvdXBzLnNldChsYWJlbCwgW10pOwogICAgICAgIH0KICAgICAgICBncm91cHMuZ2V0KGxhYmVsKS5wdXNoKGVudHJ5KTsKICAgICAgfQogICAgICByZXR1cm4gQXJyYXkuZnJvbShncm91cHMuZW50cmllcygpKS5tYXAoKFtsYWJlbCwgZW50cmllczJdKSA9PiAoewogICAgICAgIGxhYmVsLAogICAgICAgIGVudHJpZXM6IGVudHJpZXMyCiAgICAgIH0pKTsKICAgIH0KICAgIGlzU2FtZURheShkYXRlMSwgZGF0ZTIpIHsKICAgICAgcmV0dXJuIGRhdGUxLmdldEZ1bGxZZWFyKCkgPT09IGRhdGUyLmdldEZ1bGxZZWFyKCkgJiYgZGF0ZTEuZ2V0TW9udGgoKSA9PT0gZGF0ZTIuZ2V0TW9udGgoKSAmJiBkYXRlMS5nZXREYXRlKCkgPT09IGRhdGUyLmdldERhdGUoKTsKICAgIH0KICAgIGZvcm1hdFRpbWUoZGF0ZSkgewogICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVRpbWVTdHJpbmcoImVuLVVTIiwgewogICAgICAgIGhvdXI6ICIyLWRpZ2l0IiwKICAgICAgICBtaW51dGU6ICIyLWRpZ2l0IiwKICAgICAgICBob3VyMTI6IGZhbHNlCiAgICAgIH0pOwogICAgfQogICAgZ2V0SWNvbkZvclR5cGUodHlwZTUpIHsKICAgICAgY29uc3QgaWNvbnM2ID0gewogICAgICAgIGxvZ2luOiAibHVjaWRlOmxvZ0luIiwKICAgICAgICBsb2dvdXQ6ICJsdWNpZGU6bG9nT3V0IiwKICAgICAgICB2aWV3OiAibHVjaWRlOmV5ZSIsCiAgICAgICAgY3JlYXRlOiAibHVjaWRlOnBsdXMiLAogICAgICAgIHVwZGF0ZTogImx1Y2lkZTplZGl0IiwKICAgICAgICBkZWxldGU6ICJsdWNpZGU6dHJhc2gyIiwKICAgICAgICBjdXN0b206ICJsdWNpZGU6YWN0aXZpdHkiCiAgICAgIH07CiAgICAgIHJldHVybiBpY29uczZbdHlwZTVdIHx8IGljb25zNi5jdXN0b207CiAgICB9CiAgICBoYW5kbGVTZWFyY2hJbnB1dChlMTEpIHsKICAgICAgY29uc3QgdGFyZ2V0ID0gZTExLnRhcmdldDsKICAgICAgdGhpcy5zZWFyY2hRdWVyeSA9IHRhcmdldC52YWx1ZTsKICAgIH0KICAgIGhhbmRsZUNvbnRleHRNZW51KGUxMSwgZW50cnkpIHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIERlZXNDb250ZXh0bWVudS5vcGVuQ29udGV4dE1lbnVXaXRoT3B0aW9ucyhlMTEsIFsKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiQ29weSBhY3Rpdml0eSIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpjb3B5IiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChgJHtlbnRyeS51c2VyfSAke2VudHJ5Lm1lc3NhZ2V9YCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiRmlsdGVyIGJ5IHVzZXIiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6dXNlciIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgdGhpcy5maWx0ZXJDcml0ZXJpYSA9IHsgdXNlcjogZW50cnkudXNlciB9OwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIkZpbHRlciBieSB0eXBlIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmZpbHRlciIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgdGhpcy5maWx0ZXJDcml0ZXJpYSA9IHsgdHlwZTogZW50cnkudHlwZSB9OwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIkNsZWFyIGZpbHRlcnMiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6eCIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgdGhpcy5maWx0ZXJDcml0ZXJpYSA9IHt9OwogICAgICAgICAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gIiI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBdKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzOChfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0FwcHVpQWN0aXZpdHlsb2cyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1hcHB1aS9kZWVzLWFwcHVpLWFwcGJhci9kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vRnVuYzQgPSAoKSA9PiB7CiAgY29uc3QgbWVudUl0ZW1zID0gWwogICAgewogICAgICBuYW1lOiAiRmlsZSIsCiAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICB9LAogICAgICAvLyBOby1vcCBhY3Rpb24gZm9yIG1lbnUgd2l0aCBzdWJtZW51CiAgICAgIHN1Ym1lbnU6IFsKICAgICAgICB7IG5hbWU6ICJOZXcgRmlsZSIsIHNob3J0Y3V0OiAiQ21kK04iLCBpY29uTmFtZTogImZpbGUtcGx1cyIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIk5ldyBmaWxlIikgfSwKICAgICAgICB7IG5hbWU6ICJPcGVuLi4uIiwgc2hvcnRjdXQ6ICJDbWQrTyIsIGljb25OYW1lOiAiZm9sZGVyLW9wZW4iLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJPcGVuIikgfSwKICAgICAgICB7IG5hbWU6ICJPcGVuIFJlY2VudCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgIH0sIHN1Ym1lbnU6IFsKICAgICAgICAgIHsgbmFtZTogInByb2plY3QtYWxwaGEudHMiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJPcGVuIHJlY2VudCAxIikgfSwKICAgICAgICAgIHsgbmFtZTogImNvbmZpZy5qc29uIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiT3BlbiByZWNlbnQgMiIpIH0sCiAgICAgICAgICB7IG5hbWU6ICJyZWFkbWUubWQiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJPcGVuIHJlY2VudCAzIikgfQogICAgICAgIF0gfSwKICAgICAgICB7IGRpdmlkZXI6IHRydWUgfSwKICAgICAgICB7IG5hbWU6ICJTYXZlIiwgc2hvcnRjdXQ6ICJDbWQrUyIsIGljb25OYW1lOiAic2F2ZSIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlNhdmUiKSB9LAogICAgICAgIHsgbmFtZTogIlNhdmUgQXMuLi4iLCBzaG9ydGN1dDogIkNtZCtTaGlmdCtTIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiU2F2ZSBhcyIpLCBkaXNhYmxlZDogdHJ1ZSB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsgbmFtZTogIkV4aXQiLCBzaG9ydGN1dDogIkNtZCtRIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiRXhpdCIpIH0KICAgICAgXQogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkVkaXQiLAogICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgfSwKICAgICAgLy8gTm8tb3AgYWN0aW9uIGZvciBtZW51IHdpdGggc3VibWVudQogICAgICBzdWJtZW51OiBbCiAgICAgICAgeyBuYW1lOiAiVW5kbyIsIHNob3J0Y3V0OiAiQ21kK1oiLCBpY29uTmFtZTogInVuZG8iLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJVbmRvIikgfSwKICAgICAgICB7IG5hbWU6ICJSZWRvIiwgc2hvcnRjdXQ6ICJDbWQrU2hpZnQrWiIsIGljb25OYW1lOiAicmVkbyIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlJlZG8iKSB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsgbmFtZTogIkN1dCIsIHNob3J0Y3V0OiAiQ21kK1giLCBpY29uTmFtZTogInNjaXNzb3JzIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiQ3V0IikgfSwKICAgICAgICB7IG5hbWU6ICJDb3B5Iiwgc2hvcnRjdXQ6ICJDbWQrQyIsIGljb25OYW1lOiAiY29weSIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkNvcHkiKSB9LAogICAgICAgIHsgbmFtZTogIlBhc3RlIiwgc2hvcnRjdXQ6ICJDbWQrViIsIGljb25OYW1lOiAiY2xpcGJvYXJkIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiUGFzdGUiKSB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsgbmFtZTogIkZpbmQiLCBzaG9ydGN1dDogIkNtZCtGIiwgaWNvbk5hbWU6ICJzZWFyY2giLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJGaW5kIikgfSwKICAgICAgICB7IG5hbWU6ICJSZXBsYWNlIiwgc2hvcnRjdXQ6ICJDbWQrSCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlJlcGxhY2UiKSB9CiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJWaWV3IiwKICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgIH0sCiAgICAgIC8vIE5vLW9wIGFjdGlvbiBmb3IgbWVudSB3aXRoIHN1Ym1lbnUKICAgICAgc3VibWVudTogWwogICAgICAgIHsgbmFtZTogIlRvZ2dsZSBGdWxsc2NyZWVuIiwgc2hvcnRjdXQ6ICJGMTEiLCBpY29uTmFtZTogImV4cGFuZCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkZ1bGxzY3JlZW4iKSB9LAogICAgICAgIHsgbmFtZTogIlpvb20gSW4iLCBzaG9ydGN1dDogIkNtZCsrIiwgaWNvbk5hbWU6ICJ6b29tLWluIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiWm9vbSBpbiIpIH0sCiAgICAgICAgeyBuYW1lOiAiWm9vbSBPdXQiLCBzaG9ydGN1dDogIkNtZCstIiwgaWNvbk5hbWU6ICJ6b29tLW91dCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlpvb20gb3V0IikgfSwKICAgICAgICB7IG5hbWU6ICJSZXNldCBab29tIiwgc2hvcnRjdXQ6ICJDbWQrMCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlJlc2V0IHpvb20iKSB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsgbmFtZTogIlRvZ2dsZSBTaWRlYmFyIiwgc2hvcnRjdXQ6ICJDbWQrQiIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlRvZ2dsZSBzaWRlYmFyIikgfSwKICAgICAgICB7IG5hbWU6ICJUb2dnbGUgVGVybWluYWwiLCBzaG9ydGN1dDogIkNtZCtKIiwgaWNvbk5hbWU6ICJ0ZXJtaW5hbCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlRvZ2dsZSB0ZXJtaW5hbCIpIH0KICAgICAgXQogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkhlbHAiLAogICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgfSwKICAgICAgLy8gTm8tb3AgYWN0aW9uIGZvciBtZW51IHdpdGggc3VibWVudQogICAgICBzdWJtZW51OiBbCiAgICAgICAgeyBuYW1lOiAiRG9jdW1lbnRhdGlvbiIsIGljb25OYW1lOiAiYm9vayIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkRvY3VtZW50YXRpb24iKSB9LAogICAgICAgIHsgbmFtZTogIlJlbGVhc2UgTm90ZXMiLCBpY29uTmFtZTogImZpbGUtdGV4dCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlJlbGVhc2Ugbm90ZXMiKSB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsgbmFtZTogIlJlcG9ydCBJc3N1ZSIsIGljb25OYW1lOiAiYnVnIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiUmVwb3J0IGlzc3VlIikgfSwKICAgICAgICB7IG5hbWU6ICJBYm91dCIsIGljb25OYW1lOiAiaW5mbyIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkFib3V0IikgfQogICAgICBdCiAgICB9CiAgXTsKICByZXR1cm4gYjJgCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogICAgY29uc3QgYXBwYmFyID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjYXBwYmFyIik7CiAgICBjb25zdCBzdGF0dXNCdXR0b25zID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yQWxsKCIuc3RhdHVzLXRvZ2dsZSBkZWVzLWJ1dHRvbiIpOwogICAgc3RhdHVzQnV0dG9uc1swXS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgYXBwYmFyLnVzZXIgPSB7IC4uLmFwcGJhci51c2VyLCBzdGF0dXM6ICJvbmxpbmUiIH07CiAgICB9KTsKICAgIHN0YXR1c0J1dHRvbnNbMV0uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGFwcGJhci51c2VyID0geyAuLi5hcHBiYXIudXNlciwgc3RhdHVzOiAiYnVzeSIgfTsKICAgIH0pOwogICAgc3RhdHVzQnV0dG9uc1syXS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgYXBwYmFyLnVzZXIgPSB7IC4uLmFwcGJhci51c2VyLCBzdGF0dXM6ICJhd2F5IiB9OwogICAgfSk7CiAgICBzdGF0dXNCdXR0b25zWzNdLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgICBhcHBiYXIudXNlciA9IHsgLi4uYXBwYmFyLnVzZXIsIHN0YXR1czogIm9mZmxpbmUiIH07CiAgICB9KTsKICAgIGNvbnN0IHdpbmRvd0NvbnRyb2xzQnV0dG9uID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIud2luZG93LWNvbnRyb2xzLXRvZ2dsZSBkZWVzLWJ1dHRvbiIpOwogICAgd2luZG93Q29udHJvbHNCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGFwcGJhci5zaG93V2luZG93Q29udHJvbHMgPSAhYXBwYmFyLnNob3dXaW5kb3dDb250cm9sczsKICAgIH0pOwogICAgY29uc3QgYnJlYWRjcnVtYkJ1dHRvbnMgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3JBbGwoIi5icmVhZGNydW1iLXRvZ2dsZSBkZWVzLWJ1dHRvbiIpOwogICAgYnJlYWRjcnVtYkJ1dHRvbnNbMF0uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGFwcGJhci5icmVhZGNydW1icyA9ICJIb21lID4gRG9jdW1lbnRzID4gUHJvamVjdHMgPiBNeUFwcCA+IHNyYyA+IGluZGV4LnRzIjsKICAgIH0pOwogICAgYnJlYWRjcnVtYkJ1dHRvbnNbMV0uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGFwcGJhci5icmVhZGNydW1icyA9ICJEYXNoYm9hcmQiOwogICAgfSk7CiAgfX0+CiAgICAgIDxzdHlsZT4KICAgICAgICAke2lgCiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGhlaWdodDogNjAwcHg7CiAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgIGJhY2tncm91bmQ6ICMxYTFhMWE7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmNvbnRlbnQgewogICAgICAgICAgZmxleDogMTsKICAgICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgICBjb2xvcjogI2NjYzsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmNvbnRyb2xzIHsKICAgICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuY29udHJvbC1ncm91cCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogOHB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuY29udHJvbC1ncm91cCBsYWJlbCB7CiAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgICB9CiAgICAgIGB9CiAgICA8L3N0eWxlPgogICAgCiAgICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICAgIDxkZWVzLWFwcHVpLWFwcGJhcgogICAgICAgIGlkPSJhcHBiYXIiCiAgICAgICAgLm1lbnVJdGVtcz0ke21lbnVJdGVtc30KICAgICAgICAuYnJlYWRjcnVtYnM9JHsiUHJvamVjdCA+IHNyYyA+IGNvbXBvbmVudHMgPiBBcHBCYXIudHMifQogICAgICAgIC5icmVhZGNydW1iU2VwYXJhdG9yPSR7IiA+ICJ9CiAgICAgICAgLnNob3dXaW5kb3dDb250cm9scz0ke3RydWV9CiAgICAgICAgLnNob3dTZWFyY2g9JHt0cnVlfQogICAgICAgIC50aGVtZT0keyJkYXJrIn0KICAgICAgICAudXNlcj0ke3sKICAgIG5hbWU6ICJKb2huIERvZSIsCiAgICBzdGF0dXM6ICJvbmxpbmUiCiAgfX0KICAgICAgICBAbWVudS1zZWxlY3Q9JHsoZTExKSA9PiBjb25zb2xlLmxvZygiTWVudSBzZWxlY3RlZDoiLCBlMTEuZGV0YWlsLml0ZW0pfQogICAgICAgIEBicmVhZGNydW1iLW5hdmlnYXRlPSR7KGUxMSkgPT4gY29uc29sZS5sb2coIkJyZWFkY3J1bWIgY2xpY2tlZDoiLCBlMTEuZGV0YWlsKX0KICAgICAgICBAc2VhcmNoLWNsaWNrPSR7KCkgPT4gY29uc29sZS5sb2coIlNlYXJjaCBjbGlja2VkIil9CiAgICAgICAgQHVzZXItbWVudS1vcGVuPSR7KCkgPT4gY29uc29sZS5sb2coIlVzZXIgbWVudSBjbGlja2VkIil9CiAgICAgID48L2RlZXMtYXBwdWktYXBwYmFyPgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgPGgyPkFwcCBCYXIgRGVtbzwvaDI+CiAgICAgICAgPHA+VGhpcyBkZW1vIHNob3dzIHZhcmlvdXMgZmVhdHVyZXMgb2YgdGhlIGFwcCBiYXIgY29tcG9uZW50OjwvcD4KICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+RHluYW1pYyBtZW51IGl0ZW1zIHdpdGggaWNvbnMsIHNob3J0Y3V0cywgYW5kIHN1Ym1lbnVzPC9saT4KICAgICAgICAgIDxsaT5CcmVhZGNydW1iIG5hdmlnYXRpb248L2xpPgogICAgICAgICAgPGxpPlVzZXIgYWNjb3VudCBzZWN0aW9uIHdpdGggc3RhdHVzIGluZGljYXRvcjwvbGk+CiAgICAgICAgICA8bGk+U2VhcmNoIGljb248L2xpPgogICAgICAgICAgPGxpPldpbmRvdyBjb250cm9scyAocGxhdGZvcm0tc3BlY2lmaWMpPC9saT4KICAgICAgICAgIDxsaT5EYXJrL2xpZ2h0IHRoZW1lIHN1cHBvcnQ8L2xpPgogICAgICAgICAgPGxpPktleWJvYXJkIG5hdmlnYXRpb24gKFRhYiwgRW50ZXIsIEVzY2FwZSk8L2xpPgogICAgICAgICAgPGxpPkN1c3RvbSBldmVudHMgZm9yIGFsbCBpbnRlcmFjdGlvbnM8L2xpPgogICAgICAgIDwvdWw+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iY29udHJvbHMiPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtZ3JvdXAiPgogICAgICAgICAgPGxhYmVsPlRoZW1lPC9sYWJlbD4KICAgICAgICAgIDxkZWVzLWJ1dHRvbi1ncm91cCBjbGFzcz0idGhlbWUtdG9nZ2xlIj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPkRhcms8L2RlZXMtYnV0dG9uPgogICAgICAgICAgICA8ZGVlcy1idXR0b24+TGlnaHQ8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPC9kZWVzLWJ1dHRvbi1ncm91cD4KICAgICAgICA8L2Rpdj4KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWdyb3VwIj4KICAgICAgICAgIDxsYWJlbD5Vc2VyIFN0YXR1czwvbGFiZWw+CiAgICAgICAgICA8ZGVlcy1idXR0b24tZ3JvdXAgY2xhc3M9InN0YXR1cy10b2dnbGUiPgogICAgICAgICAgICA8ZGVlcy1idXR0b24+T25saW5lPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPkJ1c3k8L2RlZXMtYnV0dG9uPgogICAgICAgICAgICA8ZGVlcy1idXR0b24+QXdheTwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj5PZmZsaW5lPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDwvZGVlcy1idXR0b24tZ3JvdXA+CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ncm91cCI+CiAgICAgICAgICA8bGFiZWw+V2luZG93IENvbnRyb2xzPC9sYWJlbD4KICAgICAgICAgIDxkZWVzLWJ1dHRvbi1ncm91cCBjbGFzcz0id2luZG93LWNvbnRyb2xzLXRvZ2dsZSI+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj5Ub2dnbGU8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPC9kZWVzLWJ1dHRvbi1ncm91cD4KICAgICAgICA8L2Rpdj4KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWdyb3VwIj4KICAgICAgICAgIDxsYWJlbD5CcmVhZGNydW1iczwvbGFiZWw+CiAgICAgICAgICA8ZGVlcy1idXR0b24tZ3JvdXAgY2xhc3M9ImJyZWFkY3J1bWItdG9nZ2xlIj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPkxvbmcgUGF0aDwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj5TaG9ydCBQYXRoPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDwvZGVlcy1idXR0b24tZ3JvdXA+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgYDsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1hcHB1aS9kZWVzLWFwcHVpLWFwcGJhci9zdHlsZXMuanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGFwcHVpQXBwYmFyU3R5bGVzID0gWwogIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgLyogQ1NTIFZhcmlhYmxlcyBmb3IgdGhlbWluZyAqLwogICAgICAgIC0tYXBwYmFyLWhlaWdodDogNDBweDsKICAgICAgICAtLWFwcGJhci1mb250LXNpemU6IDEycHg7CiAgICAgICAgCiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogdmFyKC0tYXBwYmFyLWhlaWdodCk7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTBlMGUwIiwgIiMyMDIwMjAiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzAwMDAwMCIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAwMDA4MCIsICIjZmZmZmZmODAiKX07CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS1hcHBiYXItZm9udC1zaXplKTsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogYXV0byAxZnIgYXV0bzsKICAgICAgICAtd2Via2l0LWFwcC1yZWdpb246IGRyYWc7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5tZW51cyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNHB4OwogICAgICAgIHBhZGRpbmc6IDAgOHB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgICAgcGFkZGluZzogMHB4IDEycHg7CiAgICAgICAgbWFyZ2luOiA4cHggMHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAtd2Via2l0LWFwcC1yZWdpb246IG5vLWRyYWc7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgIH0KCiAgICAgIC8qIE9wdGlvbmFsOiBTdHlsZSBmb3IgbWVudSBpdGVtcyB3aXRoIGljb25zIChub3QgdHlwaWNhbGx5IHVzZWQgZm9yIHRvcC1sZXZlbCBpdGVtcykgKi8KICAgICAgLm1lbnVJdGVtIGRlZXMtaWNvbiB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMDAwMDEwIiwgIiNmZmZmZmYyMCIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAwMDAiLCAiI2ZmZmZmZiIpfTsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAwMDAyMCIsICIjZmZmZmZmMzAiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwIiwgIiNmZmZmZmYiKX07CiAgICAgIH0KCiAgICAgIC5tZW51SXRlbVtkaXNhYmxlZF0gewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAubWVudUl0ZW06Zm9jdXMtdmlzaWJsZSB7CiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwODAiLCAiI2ZmZmZmZjgwIil9OwogICAgICB9CgoKICAgICAgLyogRHJvcGRvd24gc3R5bGVzICovCiAgICAgIC5kcm9wZG93biB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMTAwJTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIG1pbi13aWR0aDogMjAwcHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzAwMDAwMCIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2UwZTBlMCIsICIjMjAyMDIwIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBib3gtc2hhZG93OiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiMCA0cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuMTUpIiwgIjAgNHB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjMpIil9OwogICAgICAgIG1hcmdpbi10b3A6IDRweDsKICAgICAgICB6LWluZGV4OiAxMDAwOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMHB4KTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMsIHRyYW5zZm9ybSAwLjJzOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAuZHJvcGRvd24ub3BlbiB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgIH0KCiAgICAgIC5kcm9wZG93bi1pdGVtIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTZweDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xczsKICAgICAgfQoKICAgICAgLmRyb3Bkb3duLWl0ZW06aG92ZXIsCiAgICAgIC5kcm9wZG93bi1pdGVtLmZvY3VzZWQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwMTAiLCAiI2ZmZmZmZjIwIil9OwogICAgICB9CgogICAgICAuZHJvcGRvd24tZGl2aWRlciB7CiAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlMGUwZTAiLCAiIzIwMjAyMCIpfTsKICAgICAgICBtYXJnaW46IDRweCAwOwogICAgICB9CgogICAgICAuZHJvcGRvd24taXRlbVtkaXNhYmxlZF0gewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAuZHJvcGRvd24taXRlbSAuc2hvcnRjdXQgewogICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgIH0KCiAgICAgIC8qIEJyZWFkY3J1bWJzICovCiAgICAgIC5icmVhZGNydW1icyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBwYWRkaW5nOiAwIDE2cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAuYnJlYWRjcnVtYi1pdGVtIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAwMDA4MCIsICIjZmZmZmZmODAiKX07CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMnM7CiAgICAgIH0KCiAgICAgIC5icmVhZGNydW1iLWl0ZW06aG92ZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMDAwMCIsICIjZmZmZmZmIil9OwogICAgICB9CgogICAgICAuYnJlYWRjcnVtYi1zZXBhcmF0b3IgewogICAgICAgIG1hcmdpbjogMCA4cHg7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAvKiBBY2NvdW50IHNlY3Rpb24gKi8KICAgICAgLmFjY291bnQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgICBnYXA6IDEycHg7CiAgICAgIH0KCiAgICAgIC5zZWFyY2gtaWNvbiB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIG9wYWNpdHk6IDAuNzsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7CiAgICAgIH0KCiAgICAgIC5zZWFyY2gtaWNvbjpob3ZlciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLnVzZXItaW5mbyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnM7CiAgICAgIH0KCiAgICAgIC51c2VyLWluZm86aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwMTAiLCAiI2ZmZmZmZjIwIil9OwogICAgICB9CgogICAgICAudXNlci1hdmF0YXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMjRweDsKICAgICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwMjAiLCAiI2ZmZmZmZjMwIil9OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC51c2VyLWF2YXRhciBpbWcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgb2JqZWN0LWZpdDogY292ZXI7CiAgICAgIH0KCiAgICAgIC51c2VyLXN0YXR1cyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogLTJweDsKICAgICAgICByaWdodDogLTJweDsKICAgICAgICB3aWR0aDogOHB4OwogICAgICAgIGhlaWdodDogOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMDAwMDAwIil9OwogICAgICB9CgogICAgICAudXNlci1zdGF0dXMub25saW5lIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjNGNhZjUwOwogICAgICB9CgogICAgICAudXNlci1zdGF0dXMub2ZmbGluZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzc1NzU3NTsKICAgICAgfQoKICAgICAgLnVzZXItc3RhdHVzLmJ1c3kgewogICAgICAgIGJhY2tncm91bmQ6ICNmNDQzMzY7CiAgICAgIH0KCiAgICAgIC51c2VyLXN0YXR1cy5hd2F5IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmY5ODAwOwogICAgICB9CgogICAgICAvKiBBY3Rpdml0eSBsb2cgdG9nZ2xlIGJ1dHRvbiAqLwogICAgICAuYWN0aXZpdHktdG9nZ2xlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiAycHg7CiAgICAgICAgaGVpZ2h0OiAyOHB4OwogICAgICAgIHBhZGRpbmc6IDAgOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgLXdlYmtpdC1hcHAtcmVnaW9uOiBuby1kcmFnOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMDAwMDYwIiwgIiNmZmZmZmY2MCIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjEpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLmFjdGl2aXR5LXRvZ2dsZTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAwMDAxMCIsICIjZmZmZmZmMTUiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwIiwgIiNmZmZmZmYiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgLmFjdGl2aXR5LXRvZ2dsZS5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwMTUiLCAiI2ZmZmZmZjIwIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMDAwMCIsICIjZmZmZmZmIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC5hY3Rpdml0eS10b2dnbGUgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIC5hY3Rpdml0eS1iYWRnZSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7CiAgICAgICAgbWluLXdpZHRoOiAxNnB4OwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBwYWRkaW5nOiAwIDRweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzUyNTI1MiIsICIjNTI1MjUyIil9OwogICAgICAgIGNvbG9yOiAjZmFmYWZhOwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgIH0KICAgIGAKXTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1hcHB1aS9kZWVzLWFwcHVpLWFwcGJhci90ZW1wbGF0ZS5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgcmVuZGVyQXBwdWlBcHBiYXIgPSAoY29tcG9uZW50KSA9PiB7CiAgcmV0dXJuIGIyYAogICAgICAgIDxkaXYgY2xhc3M9Im1lbnVzIj4KICAgICAgICAgICR7Y29tcG9uZW50LnNob3dXaW5kb3dDb250cm9scyA/IGIyYDxkZWVzLXdpbmRvd2NvbnRyb2xzPjwvZGVlcy13aW5kb3djb250cm9scz5gIDogIiJ9CiAgICAgICAgICAke2NvbXBvbmVudC5yZW5kZXJNZW51SXRlbXMoKX0KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJicmVhZGNydW1icyI+CiAgICAgICAgICAke2NvbXBvbmVudC5yZW5kZXJCcmVhZGNydW1icygpfQogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImFjY291bnQiPgogICAgICAgICAgJHtjb21wb25lbnQucmVuZGVyQWNjb3VudFNlY3Rpb24oKX0KICAgICAgICA8L2Rpdj4KICAgICAgYDsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC11dGlsaXR5L2RlZXMtd2luZG93Y29udHJvbHMvZGVlcy13aW5kb3djb250cm9scy5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU4ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM5ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzV2luZG93Q29udHJvbHMgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLXdpbmRvd2NvbnRyb2xzIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfdHlwZV9kZWNvcmF0b3JzOwogIGxldCBfdHlwZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3R5cGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Bvc2l0aW9uX2RlY29yYXRvcnM7CiAgbGV0IF9wb3NpdGlvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Bvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNXaW5kb3dDb250cm9sczIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF90eXBlX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHJlZmxlY3Q6IHRydWUKICAgICAgfSldOwogICAgICBfcG9zaXRpb25fZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgcmVmbGVjdDogdHJ1ZQogICAgICB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTgodGhpcywgbnVsbCwgX3R5cGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidHlwZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidHlwZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50eXBlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50eXBlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3R5cGVfaW5pdGlhbGl6ZXJzLCBfdHlwZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTgodGhpcywgbnVsbCwgX3Bvc2l0aW9uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInBvc2l0aW9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJwb3NpdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5wb3NpdGlvbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucG9zaXRpb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcG9zaXRpb25faW5pdGlhbGl6ZXJzLCBfcG9zaXRpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1dpbmRvd0NvbnRyb2xzMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAvLyBTVEFUSUMKICAgIHN0YXRpYyBkZW1vID0gKCkgPT4gYjJgPGRlZXMtd2luZG93Y29udHJvbHM+PC9kZWVzLXdpbmRvd2NvbnRyb2xzPmA7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiVXRpbGl0eSJdOwogICAgI3R5cGVfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzOSh0aGlzLCBfdHlwZV9pbml0aWFsaXplcnMsICJtYWMiKTsKICAgIC8vIEluc3RhbmNlCiAgICBnZXQgdHlwZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3R5cGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0eXBlKHZhbHVlMikgewogICAgICB0aGlzLiN0eXBlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczkodGhpcywgX3R5cGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczkodGhpcywgX3Bvc2l0aW9uX2luaXRpYWxpemVycywgImxlZnQiKSk7CiAgICBnZXQgcG9zaXRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNwb3NpdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHBvc2l0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNwb3NpdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogMTZweDsKICAgICAgfQoKICAgICAgLndpbmRvd0NvbnRyb2xzIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLndpbmRvd0NvbnRyb2xzIGRpdiB7CiAgICAgICAgd2lkdGg6IDEycHg7CiAgICAgICAgaGVpZ2h0OiAxMnB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgbWFyZ2luOiAwcHg7CiAgICAgICAgcGFkZGluZzogMHB4OwogICAgICAgIGJhY2tncm91bmQ6ICMyMjIyMjI7CiAgICAgIH0KCiAgICAgIC53aW5kb3dDb250cm9scyBkaXYuY2xvc2UgewogICAgICAgIGJhY2tncm91bmQ6ICNmZjVmNTc7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMnB4OwogICAgICB9CgogICAgICAud2luZG93Q29udHJvbHMgZGl2LnRvRG9jayB7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmYmQyZTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDEycHg7CiAgICAgIH0KCiAgICAgIC53aW5kb3dDb250cm9scyBkaXYubWluTWF4IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMjdjOTNmOwogICAgICB9CgogICAgICAud2luZG93Q29udHJvbHMgZGl2OmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMzMzMzMzOwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgICR7dGhpcy50eXBlID09PSAibWFjIiAmJiB0aGlzLnBvc2l0aW9uID09PSAibGVmdCIgfHwgKHRoaXMudHlwZSA9PT0gImxpbnV4IiB8fCB0aGlzLnR5cGUgPT09ICJ3aW5kb3dzIikgJiYgdGhpcy5wb3NpdGlvbiA9PT0gInJpZ2h0IiA/IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3aW5kb3dDb250cm9scyI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2xvc2UiPjwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvRG9jayI+PC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWluTWF4Ij48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgIDogYjJgYH0KICAgIGA7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnM5KHRoaXMsIF9wb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczkoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNXaW5kb3dDb250cm9sczIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWFwcHVpL2RlZXMtYXBwdWktcHJvZmlsZWRyb3Bkb3duL2RlZXMtYXBwdWktcHJvZmlsZWRyb3Bkb3duLmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTkgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczEwID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzQXBwdWlQcm9maWxlRHJvcGRvd24gPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLWFwcHVpLXByb2ZpbGVkcm9wZG93biIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3VzZXJfZGVjb3JhdG9yczsKICBsZXQgX3VzZXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF91c2VyX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tZW51SXRlbXNfZGVjb3JhdG9yczsKICBsZXQgX21lbnVJdGVtc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21lbnVJdGVtc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNPcGVuX2RlY29yYXRvcnM7CiAgbGV0IF9pc09wZW5faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc09wZW5fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Bvc2l0aW9uX2RlY29yYXRvcnM7CiAgbGV0IF9wb3NpdGlvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Bvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNBcHB1aVByb2ZpbGVEcm9wZG93bjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF91c2VyX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBPYmplY3QgfSldOwogICAgICBfbWVudUl0ZW1zX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF9pc09wZW5fZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSldOwogICAgICBfcG9zaXRpb25fZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTkodGhpcywgbnVsbCwgX3VzZXJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidXNlciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidXNlciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai51c2VyLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai51c2VyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3VzZXJfaW5pdGlhbGl6ZXJzLCBfdXNlcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTkodGhpcywgbnVsbCwgX21lbnVJdGVtc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtZW51SXRlbXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1lbnVJdGVtcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tZW51SXRlbXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1lbnVJdGVtcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tZW51SXRlbXNfaW5pdGlhbGl6ZXJzLCBfbWVudUl0ZW1zX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOSh0aGlzLCBudWxsLCBfaXNPcGVuX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzT3BlbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNPcGVuIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzT3Blbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNPcGVuID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzT3Blbl9pbml0aWFsaXplcnMsIF9pc09wZW5fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5KHRoaXMsIG51bGwsIF9wb3NpdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwb3NpdGlvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicG9zaXRpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucG9zaXRpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnBvc2l0aW9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Bvc2l0aW9uX2luaXRpYWxpemVycywgX3Bvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNBcHB1aVByb2ZpbGVEcm9wZG93bjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSAoKSA9PiBiMmAKICAgIDxkZWVzLWFwcHVpLXByb2ZpbGVkcm9wZG93bgogICAgICAudXNlcj0ke3sKICAgICAgbmFtZTogIkpvaG4gRG9lIiwKICAgICAgZW1haWw6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIsCiAgICAgIGF2YXRhcjogImh0dHBzOi8vcmFuZG9tdXNlci5tZS9hcGkvcG9ydHJhaXRzL21lbi8xLmpwZyIsCiAgICAgIHN0YXR1czogIm9ubGluZSIKICAgIH19CiAgICAgIC5tZW51SXRlbXM9JHtbCiAgICAgIHsgbmFtZTogIlByb2ZpbGUgU2V0dGluZ3MiLCBpY29uTmFtZTogInVzZXIiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJQcm9maWxlIikgfSwKICAgICAgeyBuYW1lOiAiQWNjb3VudCIsIGljb25OYW1lOiAic2V0dGluZ3MiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJBY2NvdW50IikgfSwKICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgIHsgbmFtZTogIkhlbHAgJiBTdXBwb3J0IiwgaWNvbk5hbWU6ICJoZWxwQ2lyY2xlIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiSGVscCIpIH0sCiAgICAgIHsgbmFtZTogIktleWJvYXJkIFNob3J0Y3V0cyIsIGljb25OYW1lOiAia2V5Ym9hcmQiLCBzaG9ydGN1dDogIkNtZCtLIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiU2hvcnRjdXRzIikgfSwKICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgIHsgbmFtZTogIlNpZ24gT3V0IiwgaWNvbk5hbWU6ICJsb2dPdXQiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJTaWduIG91dCIpIH0KICAgIF19CiAgICAgIC5pc09wZW49JHt0cnVlfQogICAgPjwvZGVlcy1hcHB1aS1wcm9maWxlZHJvcGRvd24+CiAgYDsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJBcHAgVUkiXTsKICAgICN1c2VyX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczEwKHRoaXMsIF91c2VyX2luaXRpYWxpemVycywgdm9pZCAwKTsKICAgIGdldCB1c2VyKCkgewogICAgICByZXR1cm4gdGhpcy4jdXNlcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHVzZXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3VzZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtZW51SXRlbXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczEwKHRoaXMsIF91c2VyX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxMCh0aGlzLCBfbWVudUl0ZW1zX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBtZW51SXRlbXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtZW51SXRlbXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtZW51SXRlbXModmFsdWUyKSB7CiAgICAgIHRoaXMuI21lbnVJdGVtc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzT3Blbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTAodGhpcywgX21lbnVJdGVtc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTAodGhpcywgX2lzT3Blbl9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaXNPcGVuKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNPcGVuX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaXNPcGVuKHZhbHVlMikgewogICAgICB0aGlzLiNpc09wZW5fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNwb3NpdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTAodGhpcywgX2lzT3Blbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTAodGhpcywgX3Bvc2l0aW9uX2luaXRpYWxpemVycywgInRvcC1yaWdodCIpKTsKICAgIGdldCBwb3NpdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Bvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcG9zaXRpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI3Bvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDEwMCU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmRyb3Bkb3duIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbWluLXdpZHRoOiAyMjBweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMDAwMDAwIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTBlMGUwIiwgIiMyMDIwMjAiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGJveC1zaGFkb3c6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4xNSkiLCAiMCA0cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuMykiKX07CiAgICAgICAgei1pbmRleDogJHt6SW5kZXhMYXllcnMub3ZlcmxheS5kcm9wZG93bn07CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTUpIHRyYW5zbGF0ZVkoLTEwcHgpOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycywgdHJhbnNmb3JtIDAuMnM7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpc29wZW5dKSAuZHJvcGRvd24gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGVZKDApOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICB9CiAgICAgIAogICAgICAuYmFja2Ryb3AgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIFBvc2l0aW9uIHZhcmlhbnRzICovCiAgICAgIC5kcm9wZG93bi50b3AtcmlnaHQgewogICAgICAgIHRvcDogMTAwJTsKICAgICAgICByaWdodDogMDsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgIH0KCiAgICAgIC5kcm9wZG93bi50b3AtbGVmdCB7CiAgICAgICAgdG9wOiAxMDAlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgbWFyZ2luLXRvcDogOHB4OwogICAgICB9CgogICAgICAuZHJvcGRvd24uYm90dG9tLXJpZ2h0IHsKICAgICAgICBib3R0b206IDEwMCU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICB9CgogICAgICAuZHJvcGRvd24uYm90dG9tLWxlZnQgewogICAgICAgIGJvdHRvbTogMTAwJTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgfQoKICAgICAgLyogVXNlciBzZWN0aW9uICovCiAgICAgIC51c2VyLXNlY3Rpb24gewogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTBlMGUwIiwgIiMyMDIwMjAiKX07CiAgICAgIH0KCiAgICAgIC51c2VyLWluZm8gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEwcHg7CiAgICAgIH0KCiAgICAgIC51c2VyLWF2YXRhciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAzNnB4OwogICAgICAgIGhlaWdodDogMzZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmMGYwZjAiLCAiIzFhMWExYSIpfTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNjY2IiwgIiM5OTkiKX07CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnVzZXItYXZhdGFyIGltZyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG9iamVjdC1maXQ6IGNvdmVyOwogICAgICB9CgogICAgICAudXNlci1zdGF0dXMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgd2lkdGg6IDEwcHg7CiAgICAgICAgaGVpZ2h0OiAxMHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMDAwMDAwIil9OwogICAgICB9CgogICAgICAudXNlci1zdGF0dXMub25saW5lIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjNGNhZjUwOwogICAgICB9CgogICAgICAudXNlci1zdGF0dXMub2ZmbGluZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzc1NzU3NTsKICAgICAgfQoKICAgICAgLnVzZXItc3RhdHVzLmJ1c3kgewogICAgICAgIGJhY2tncm91bmQ6ICNmNDQzMzY7CiAgICAgIH0KCiAgICAgIC51c2VyLXN0YXR1cy5hd2F5IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmY5ODAwOwogICAgICB9CgogICAgICAudXNlci1kZXRhaWxzIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgfQoKICAgICAgLnVzZXItbmFtZSB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwIiwgIiNmZmYiKX07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMjsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CgogICAgICAudXNlci1lbWFpbCB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzY2NiIsICIjOTk5Iil9OwogICAgICAgIG1hcmdpbi10b3A6IDJweDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KCiAgICAgIC8qIE1lbnUgc2VjdGlvbiAqLwogICAgICAubWVudS1zZWN0aW9uIHsKICAgICAgICBwYWRkaW5nOiA0cHggMDsKICAgICAgfQoKICAgICAgLm1lbnUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXM7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMzMzIiwgIiNjY2MiKX07CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICB9CgogICAgICAubWVudS1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjA0KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpIil9OwogICAgICB9CgogICAgICAubWVudS1pdGVtOmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wOCkiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSIpfTsKICAgICAgfQoKICAgICAgLm1lbnUtaXRlbSBkZWVzLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgIH0KCiAgICAgIC5tZW51LWl0ZW0tdGV4dCB7CiAgICAgICAgZmxleDogMTsKICAgICAgfQoKICAgICAgLm1lbnUtc2hvcnRjdXQgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5OTkiLCAiIzY2NiIpfTsKICAgICAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgIH0KCiAgICAgIC5tZW51LWRpdmlkZXIgewogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTBlMGUwIiwgIiMyMDIwMjAiKX07CiAgICAgICAgbWFyZ2luOiA0cHggMDsKICAgICAgfQoKICAgICAgLyogQmFja2Ryb3AgZm9yIG1vYmlsZSAqLwogICAgICBAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHsKICAgICAgICAuYmFja2Ryb3AgewogICAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgICAgdG9wOiAwOwogICAgICAgICAgbGVmdDogMDsKICAgICAgICAgIHJpZ2h0OiAwOwogICAgICAgICAgYm90dG9tOiAwOwogICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgICAgei1pbmRleDogJHt6SW5kZXhMYXllcnMuYmFja2Ryb3AuZHJvcGRvd259OwogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4yczsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQoKICAgICAgICA6aG9zdChbaXNvcGVuXSkgLmJhY2tkcm9wIHsKICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICAgIH0KCiAgICAgICAgLmRyb3Bkb3duIHsKICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICAgIHRvcDogNTAlOwogICAgICAgICAgbGVmdDogNTAlOwogICAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgICBib3R0b206IGF1dG87CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSBzY2FsZSgwLjk1KTsKICAgICAgICAgIG1hcmdpbjogMDsKICAgICAgICAgIG1heC13aWR0aDogY2FsYygxMDB2dyAtIDMycHgpOwogICAgICAgICAgbWF4LWhlaWdodDogY2FsYygxMDB2aCAtIDMycHgpOwogICAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICAgICAgfQoKICAgICAgICA6aG9zdChbaXNvcGVuXSkgLmRyb3Bkb3duIHsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpIHNjYWxlKDEpOwogICAgICAgIH0KICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJiYWNrZHJvcCIgQGNsaWNrPSR7KCkgPT4gdGhpcy5jbG9zZSgpfT48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZHJvcGRvd24gJHt0aGlzLnBvc2l0aW9ufSI+CiAgICAgICAgJHt0aGlzLnVzZXIgPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9InVzZXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InVzZXItaW5mbyI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idXNlci1hdmF0YXIiPgogICAgICAgICAgICAgICAgJHt0aGlzLnVzZXIuYXZhdGFyID8gYjJgPGltZyBzcmM9IiR7dGhpcy51c2VyLmF2YXRhcn0iIGFsdD0iJHt0aGlzLnVzZXIubmFtZX0iPmAgOiB0aGlzLmdldEluaXRpYWxzKHRoaXMudXNlci5uYW1lKX0KICAgICAgICAgICAgICAgICR7dGhpcy51c2VyLnN0YXR1cyA/IGIyYAogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1c2VyLXN0YXR1cyAke3RoaXMudXNlci5zdGF0dXN9Ij48L2Rpdj4KICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1c2VyLWRldGFpbHMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idXNlci1uYW1lIj4ke3RoaXMudXNlci5uYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgJHt0aGlzLnVzZXIuZW1haWwgPyBiMmAKICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idXNlci1lbWFpbCI+JHt0aGlzLnVzZXIuZW1haWx9PC9kaXY+CiAgICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgYCA6ICIifQogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9Im1lbnUtc2VjdGlvbiI+CiAgICAgICAgICAke3RoaXMubWVudUl0ZW1zLm1hcCgoaXRlbSkgPT4gdGhpcy5yZW5kZXJNZW51SXRlbShpdGVtKSl9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlck1lbnVJdGVtKGl0ZW0pIHsKICAgICAgaWYgKCJkaXZpZGVyIiBpbiBpdGVtICYmIGl0ZW0uZGl2aWRlcikgewogICAgICAgIHJldHVybiBiMmA8ZGl2IGNsYXNzPSJtZW51LWRpdmlkZXIiPjwvZGl2PmA7CiAgICAgIH0KICAgICAgY29uc3QgbWVudUl0ZW0gPSBpdGVtOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9Im1lbnUtaXRlbSIgQGNsaWNrPSR7KCkgPT4gdGhpcy5oYW5kbGVNZW51Q2xpY2sobWVudUl0ZW0pfT4KICAgICAgICAke21lbnVJdGVtLmljb25OYW1lID8gYjJgCiAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSIke2BsdWNpZGU6JHttZW51SXRlbS5pY29uTmFtZX1gfSI+PC9kZWVzLWljb24+CiAgICAgICAgYCA6ICIifQogICAgICAgIDxzcGFuIGNsYXNzPSJtZW51LWl0ZW0tdGV4dCI+JHttZW51SXRlbS5uYW1lfTwvc3Bhbj4KICAgICAgICAke21lbnVJdGVtLnNob3J0Y3V0ID8gYjJgCiAgICAgICAgICA8c3BhbiBjbGFzcz0ibWVudS1zaG9ydGN1dCI+JHttZW51SXRlbS5zaG9ydGN1dH08L3NwYW4+CiAgICAgICAgYCA6ICIifQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBnZXRJbml0aWFscyhuYW1lKSB7CiAgICAgIHJldHVybiBuYW1lLnNwbGl0KCIgIikubWFwKChwYXJ0KSA9PiBwYXJ0WzBdKS5qb2luKCIiKS50b1VwcGVyQ2FzZSgpLnNsaWNlKDAsIDIpOwogICAgfQogICAgYXN5bmMgaGFuZGxlTWVudUNsaWNrKGl0ZW0pIHsKICAgICAgYXdhaXQgaXRlbS5hY3Rpb24oKTsKICAgICAgdGhpcy5jbG9zZSgpOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJtZW51LXNlbGVjdCIsIHsKICAgICAgICBkZXRhaWw6IHsgaXRlbSB9LAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgb3BlbigpIHsKICAgICAgdGhpcy5pc09wZW4gPSB0cnVlOwogICAgfQogICAgY2xvc2UoKSB7CiAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7CiAgICB9CiAgICB0b2dnbGUoKSB7CiAgICAgIHRoaXMuaXNPcGVuID0gIXRoaXMuaXNPcGVuOwogICAgfQogICAgLy8gSGFuZGxlIGNsaWNrcyBvdXRzaWRlIHRoZSBkcm9wZG93bgogICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuaGFuZGxlT3V0c2lkZUNsaWNrID0gdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2suYmluZCh0aGlzKTsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLmhhbmRsZU91dHNpZGVDbGljayk7CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLmhhbmRsZU91dHNpZGVDbGljayk7CiAgICB9CiAgICBoYW5kbGVPdXRzaWRlQ2xpY2soZXZlbnQpIHsKICAgICAgaWYgKHRoaXMuaXNPcGVuICYmICF0aGlzLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHsKICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdGhpcy5wYXJlbnRFbGVtZW50OwogICAgICAgIGlmIChwYXJlbnRFbGVtZW50ICYmIHBhcmVudEVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLmNsb3NlKCk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczEwKHRoaXMsIF9wb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczEwKF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzQXBwdWlQcm9maWxlRHJvcGRvd24yID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1hcHB1aS9kZWVzLWFwcHVpLWFwcGJhci9jb21wb25lbnQuanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF9kaXN0X3RzMjUoKTsKaW5pdF9kZWVzX2ljb24oKTsKdmFyIF9fZXNEZWNvcmF0ZTEwID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMxMSA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0FwcHVpQmFyID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1hcHB1aS1hcHBiYXIiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9tZW51SXRlbXNfZGVjb3JhdG9yczsKICBsZXQgX21lbnVJdGVtc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21lbnVJdGVtc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYnJlYWRjcnVtYnNfZGVjb3JhdG9yczsKICBsZXQgX2JyZWFkY3J1bWJzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYnJlYWRjcnVtYnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2JyZWFkY3J1bWJTZXBhcmF0b3JfZGVjb3JhdG9yczsKICBsZXQgX2JyZWFkY3J1bWJTZXBhcmF0b3JfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9icmVhZGNydW1iU2VwYXJhdG9yX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93V2luZG93Q29udHJvbHNfZGVjb3JhdG9yczsKICBsZXQgX3Nob3dXaW5kb3dDb250cm9sc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dXaW5kb3dDb250cm9sc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdXNlcl9kZWNvcmF0b3JzOwogIGxldCBfdXNlcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3VzZXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Byb2ZpbGVNZW51SXRlbXNfZGVjb3JhdG9yczsKICBsZXQgX3Byb2ZpbGVNZW51SXRlbXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wcm9maWxlTWVudUl0ZW1zX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93U2VhcmNoX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93U2VhcmNoX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1NlYXJjaF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0FjdGl2aXR5TG9nVG9nZ2xlX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93QWN0aXZpdHlMb2dUb2dnbGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93QWN0aXZpdHlMb2dUb2dnbGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FjdGl2aXR5TG9nQ291bnRfZGVjb3JhdG9yczsKICBsZXQgX2FjdGl2aXR5TG9nQ291bnRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY3Rpdml0eUxvZ0NvdW50X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY3Rpdml0eUxvZ0FjdGl2ZV9kZWNvcmF0b3JzOwogIGxldCBfYWN0aXZpdHlMb2dBY3RpdmVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY3Rpdml0eUxvZ0FjdGl2ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWN0aXZlTWVudV9kZWNvcmF0b3JzOwogIGxldCBfYWN0aXZlTWVudV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FjdGl2ZU1lbnVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX29wZW5Ecm9wZG93bnNfZGVjb3JhdG9yczsKICBsZXQgX29wZW5Ecm9wZG93bnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vcGVuRHJvcGRvd25zX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9mb2N1c2VkSXRlbV9kZWNvcmF0b3JzOwogIGxldCBfZm9jdXNlZEl0ZW1faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9mb2N1c2VkSXRlbV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZm9jdXNlZERyb3Bkb3duSXRlbV9kZWNvcmF0b3JzOwogIGxldCBfZm9jdXNlZERyb3Bkb3duSXRlbV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ZvY3VzZWREcm9wZG93bkl0ZW1fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzUHJvZmlsZURyb3Bkb3duT3Blbl9kZWNvcmF0b3JzOwogIGxldCBfaXNQcm9maWxlRHJvcGRvd25PcGVuX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNQcm9maWxlRHJvcGRvd25PcGVuX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNBcHB1aUJhcjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9tZW51SXRlbXNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX2JyZWFkY3J1bWJzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfYnJlYWRjcnVtYlNlcGFyYXRvcl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3Nob3dXaW5kb3dDb250cm9sc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF91c2VyX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBPYmplY3QgfSldOwogICAgICBfcHJvZmlsZU1lbnVJdGVtc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfc2hvd1NlYXJjaF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9zaG93QWN0aXZpdHlMb2dUb2dnbGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfYWN0aXZpdHlMb2dDb3VudF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX2FjdGl2aXR5TG9nQWN0aXZlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2FjdGl2ZU1lbnVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX29wZW5Ecm9wZG93bnNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2ZvY3VzZWRJdGVtX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9mb2N1c2VkRHJvcGRvd25JdGVtX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pc1Byb2ZpbGVEcm9wZG93bk9wZW5fZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlMTAodGhpcywgbnVsbCwgX21lbnVJdGVtc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtZW51SXRlbXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1lbnVJdGVtcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tZW51SXRlbXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1lbnVJdGVtcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tZW51SXRlbXNfaW5pdGlhbGl6ZXJzLCBfbWVudUl0ZW1zX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTAodGhpcywgbnVsbCwgX2JyZWFkY3J1bWJzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImJyZWFkY3J1bWJzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJicmVhZGNydW1icyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5icmVhZGNydW1icywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYnJlYWRjcnVtYnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYnJlYWRjcnVtYnNfaW5pdGlhbGl6ZXJzLCBfYnJlYWRjcnVtYnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxMCh0aGlzLCBudWxsLCBfYnJlYWRjcnVtYlNlcGFyYXRvcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJicmVhZGNydW1iU2VwYXJhdG9yIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJicmVhZGNydW1iU2VwYXJhdG9yIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmJyZWFkY3J1bWJTZXBhcmF0b3IsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmJyZWFkY3J1bWJTZXBhcmF0b3IgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYnJlYWRjcnVtYlNlcGFyYXRvcl9pbml0aWFsaXplcnMsIF9icmVhZGNydW1iU2VwYXJhdG9yX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTAodGhpcywgbnVsbCwgX3Nob3dXaW5kb3dDb250cm9sc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93V2luZG93Q29udHJvbHMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNob3dXaW5kb3dDb250cm9scyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93V2luZG93Q29udHJvbHMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dXaW5kb3dDb250cm9scyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93V2luZG93Q29udHJvbHNfaW5pdGlhbGl6ZXJzLCBfc2hvd1dpbmRvd0NvbnRyb2xzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTAodGhpcywgbnVsbCwgX3VzZXJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidXNlciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidXNlciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai51c2VyLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai51c2VyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3VzZXJfaW5pdGlhbGl6ZXJzLCBfdXNlcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTEwKHRoaXMsIG51bGwsIF9wcm9maWxlTWVudUl0ZW1zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInByb2ZpbGVNZW51SXRlbXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInByb2ZpbGVNZW51SXRlbXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucHJvZmlsZU1lbnVJdGVtcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucHJvZmlsZU1lbnVJdGVtcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wcm9maWxlTWVudUl0ZW1zX2luaXRpYWxpemVycywgX3Byb2ZpbGVNZW51SXRlbXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxMCh0aGlzLCBudWxsLCBfc2hvd1NlYXJjaF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93U2VhcmNoIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93U2VhcmNoIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dTZWFyY2gsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dTZWFyY2ggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd1NlYXJjaF9pbml0aWFsaXplcnMsIF9zaG93U2VhcmNoX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTAodGhpcywgbnVsbCwgX3Nob3dBY3Rpdml0eUxvZ1RvZ2dsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93QWN0aXZpdHlMb2dUb2dnbGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNob3dBY3Rpdml0eUxvZ1RvZ2dsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93QWN0aXZpdHlMb2dUb2dnbGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dBY3Rpdml0eUxvZ1RvZ2dsZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93QWN0aXZpdHlMb2dUb2dnbGVfaW5pdGlhbGl6ZXJzLCBfc2hvd0FjdGl2aXR5TG9nVG9nZ2xlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTAodGhpcywgbnVsbCwgX2FjdGl2aXR5TG9nQ291bnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYWN0aXZpdHlMb2dDb3VudCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYWN0aXZpdHlMb2dDb3VudCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hY3Rpdml0eUxvZ0NvdW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hY3Rpdml0eUxvZ0NvdW50ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FjdGl2aXR5TG9nQ291bnRfaW5pdGlhbGl6ZXJzLCBfYWN0aXZpdHlMb2dDb3VudF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTEwKHRoaXMsIG51bGwsIF9hY3Rpdml0eUxvZ0FjdGl2ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhY3Rpdml0eUxvZ0FjdGl2ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYWN0aXZpdHlMb2dBY3RpdmUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWN0aXZpdHlMb2dBY3RpdmUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFjdGl2aXR5TG9nQWN0aXZlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FjdGl2aXR5TG9nQWN0aXZlX2luaXRpYWxpemVycywgX2FjdGl2aXR5TG9nQWN0aXZlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTAodGhpcywgbnVsbCwgX2FjdGl2ZU1lbnVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYWN0aXZlTWVudSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYWN0aXZlTWVudSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hY3RpdmVNZW51LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hY3RpdmVNZW51ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FjdGl2ZU1lbnVfaW5pdGlhbGl6ZXJzLCBfYWN0aXZlTWVudV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTEwKHRoaXMsIG51bGwsIF9vcGVuRHJvcGRvd25zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm9wZW5Ecm9wZG93bnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm9wZW5Ecm9wZG93bnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoub3BlbkRyb3Bkb3ducywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoub3BlbkRyb3Bkb3ducyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9vcGVuRHJvcGRvd25zX2luaXRpYWxpemVycywgX29wZW5Ecm9wZG93bnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxMCh0aGlzLCBudWxsLCBfZm9jdXNlZEl0ZW1fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZm9jdXNlZEl0ZW0iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZvY3VzZWRJdGVtIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmZvY3VzZWRJdGVtLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5mb2N1c2VkSXRlbSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9mb2N1c2VkSXRlbV9pbml0aWFsaXplcnMsIF9mb2N1c2VkSXRlbV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTEwKHRoaXMsIG51bGwsIF9mb2N1c2VkRHJvcGRvd25JdGVtX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImZvY3VzZWREcm9wZG93bkl0ZW0iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZvY3VzZWREcm9wZG93bkl0ZW0iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZm9jdXNlZERyb3Bkb3duSXRlbSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZm9jdXNlZERyb3Bkb3duSXRlbSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9mb2N1c2VkRHJvcGRvd25JdGVtX2luaXRpYWxpemVycywgX2ZvY3VzZWREcm9wZG93bkl0ZW1fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxMCh0aGlzLCBudWxsLCBfaXNQcm9maWxlRHJvcGRvd25PcGVuX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzUHJvZmlsZURyb3Bkb3duT3BlbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNQcm9maWxlRHJvcGRvd25PcGVuIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzUHJvZmlsZURyb3Bkb3duT3Blbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNQcm9maWxlRHJvcGRvd25PcGVuID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzUHJvZmlsZURyb3Bkb3duT3Blbl9pbml0aWFsaXplcnMsIF9pc1Byb2ZpbGVEcm9wZG93bk9wZW5fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxMChudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNBcHB1aUJhcjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzQ7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiQXBwIFVJIl07CiAgICAjbWVudUl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF9tZW51SXRlbXNfaW5pdGlhbGl6ZXJzLCBbXSk7CiAgICAvLyBJTlNUQU5DRSBQUk9QRVJUSUVTCiAgICBnZXQgbWVudUl0ZW1zKCkgewogICAgICByZXR1cm4gdGhpcy4jbWVudUl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWVudUl0ZW1zKHZhbHVlMikgewogICAgICB0aGlzLiNtZW51SXRlbXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNicmVhZGNydW1ic19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX21lbnVJdGVtc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX2JyZWFkY3J1bWJzX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBicmVhZGNydW1icygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2JyZWFkY3J1bWJzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYnJlYWRjcnVtYnModmFsdWUyKSB7CiAgICAgIHRoaXMuI2JyZWFkY3J1bWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYnJlYWRjcnVtYlNlcGFyYXRvcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX2JyZWFkY3J1bWJzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxMSh0aGlzLCBfYnJlYWRjcnVtYlNlcGFyYXRvcl9pbml0aWFsaXplcnMsICIgPiAiKSk7CiAgICBnZXQgYnJlYWRjcnVtYlNlcGFyYXRvcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2JyZWFkY3J1bWJTZXBhcmF0b3JfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBicmVhZGNydW1iU2VwYXJhdG9yKHZhbHVlMikgewogICAgICB0aGlzLiNicmVhZGNydW1iU2VwYXJhdG9yX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd1dpbmRvd0NvbnRyb2xzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxMSh0aGlzLCBfYnJlYWRjcnVtYlNlcGFyYXRvcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX3Nob3dXaW5kb3dDb250cm9sc19pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93V2luZG93Q29udHJvbHMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93V2luZG93Q29udHJvbHNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93V2luZG93Q29udHJvbHModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dXaW5kb3dDb250cm9sc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3VzZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF9zaG93V2luZG93Q29udHJvbHNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF91c2VyX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgdXNlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3VzZXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB1c2VyKHZhbHVlMikgewogICAgICB0aGlzLiN1c2VyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcHJvZmlsZU1lbnVJdGVtc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX3VzZXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF9wcm9maWxlTWVudUl0ZW1zX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBwcm9maWxlTWVudUl0ZW1zKCkgewogICAgICByZXR1cm4gdGhpcy4jcHJvZmlsZU1lbnVJdGVtc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHByb2ZpbGVNZW51SXRlbXModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Byb2ZpbGVNZW51SXRlbXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93U2VhcmNoX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxMSh0aGlzLCBfcHJvZmlsZU1lbnVJdGVtc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX3Nob3dTZWFyY2hfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHNob3dTZWFyY2goKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93U2VhcmNoX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd1NlYXJjaCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2hvd1NlYXJjaF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dBY3Rpdml0eUxvZ1RvZ2dsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX3Nob3dTZWFyY2hfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF9zaG93QWN0aXZpdHlMb2dUb2dnbGVfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgLy8gQWN0aXZpdHkgbG9nIHRvZ2dsZQogICAgZ2V0IHNob3dBY3Rpdml0eUxvZ1RvZ2dsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dBY3Rpdml0eUxvZ1RvZ2dsZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dBY3Rpdml0eUxvZ1RvZ2dsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2hvd0FjdGl2aXR5TG9nVG9nZ2xlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYWN0aXZpdHlMb2dDb3VudF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX3Nob3dBY3Rpdml0eUxvZ1RvZ2dsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX2FjdGl2aXR5TG9nQ291bnRfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgYWN0aXZpdHlMb2dDb3VudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FjdGl2aXR5TG9nQ291bnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhY3Rpdml0eUxvZ0NvdW50KHZhbHVlMikgewogICAgICB0aGlzLiNhY3Rpdml0eUxvZ0NvdW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYWN0aXZpdHlMb2dBY3RpdmVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF9hY3Rpdml0eUxvZ0NvdW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxMSh0aGlzLCBfYWN0aXZpdHlMb2dBY3RpdmVfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGFjdGl2aXR5TG9nQWN0aXZlKCkgewogICAgICByZXR1cm4gdGhpcy4jYWN0aXZpdHlMb2dBY3RpdmVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhY3Rpdml0eUxvZ0FjdGl2ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYWN0aXZpdHlMb2dBY3RpdmVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhY3RpdmVNZW51X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxMSh0aGlzLCBfYWN0aXZpdHlMb2dBY3RpdmVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF9hY3RpdmVNZW51X2luaXRpYWxpemVycywgbnVsbCkpOwogICAgLy8gU1RBVEUKICAgIGdldCBhY3RpdmVNZW51KCkgewogICAgICByZXR1cm4gdGhpcy4jYWN0aXZlTWVudV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFjdGl2ZU1lbnUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2FjdGl2ZU1lbnVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNvcGVuRHJvcGRvd25zX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxMSh0aGlzLCBfYWN0aXZlTWVudV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX29wZW5Ecm9wZG93bnNfaW5pdGlhbGl6ZXJzLCAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKSk7CiAgICBnZXQgb3BlbkRyb3Bkb3ducygpIHsKICAgICAgcmV0dXJuIHRoaXMuI29wZW5Ecm9wZG93bnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBvcGVuRHJvcGRvd25zKHZhbHVlMikgewogICAgICB0aGlzLiNvcGVuRHJvcGRvd25zX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZm9jdXNlZEl0ZW1fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF9vcGVuRHJvcGRvd25zX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxMSh0aGlzLCBfZm9jdXNlZEl0ZW1faW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICBnZXQgZm9jdXNlZEl0ZW0oKSB7CiAgICAgIHJldHVybiB0aGlzLiNmb2N1c2VkSXRlbV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGZvY3VzZWRJdGVtKHZhbHVlMikgewogICAgICB0aGlzLiNmb2N1c2VkSXRlbV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2ZvY3VzZWREcm9wZG93bkl0ZW1fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF9mb2N1c2VkSXRlbV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX2ZvY3VzZWREcm9wZG93bkl0ZW1faW5pdGlhbGl6ZXJzLCAtMSkpOwogICAgZ2V0IGZvY3VzZWREcm9wZG93bkl0ZW0oKSB7CiAgICAgIHJldHVybiB0aGlzLiNmb2N1c2VkRHJvcGRvd25JdGVtX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZm9jdXNlZERyb3Bkb3duSXRlbSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZm9jdXNlZERyb3Bkb3duSXRlbV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzUHJvZmlsZURyb3Bkb3duT3Blbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX2ZvY3VzZWREcm9wZG93bkl0ZW1fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF9pc1Byb2ZpbGVEcm9wZG93bk9wZW5faW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGlzUHJvZmlsZURyb3Bkb3duT3BlbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzUHJvZmlsZURyb3Bkb3duT3Blbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzUHJvZmlsZURyb3Bkb3duT3Blbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXNQcm9maWxlRHJvcGRvd25PcGVuX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gYXBwdWlBcHBiYXJTdHlsZXM7CiAgICAvLyBJTlNUQU5DRQogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gcmVuZGVyQXBwdWlBcHBiYXIodGhpcyk7CiAgICB9CiAgICByZW5kZXJNZW51SXRlbXMoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgJHt0aGlzLm1lbnVJdGVtcy5tYXAoKGl0ZW0sIGluZGV4MikgPT4gdGhpcy5yZW5kZXJNZW51SXRlbShpdGVtLCBgbWVudS0ke2luZGV4Mn1gKSl9CiAgICBgOwogICAgfQogICAgcmVuZGVyTWVudUl0ZW0oaXRlbSwgaXRlbUlkKSB7CiAgICAgIGlmICgiZGl2aWRlciIgaW4gaXRlbSAmJiBpdGVtLmRpdmlkZXIpIHsKICAgICAgICByZXR1cm4gYjJgPGRpdiBjbGFzcz0iZHJvcGRvd24tZGl2aWRlciI+PC9kaXY+YDsKICAgICAgfQogICAgICBjb25zdCBtZW51SXRlbSA9IGl0ZW07CiAgICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5hY3RpdmVNZW51ID09PSBpdGVtSWQ7CiAgICAgIGNvbnN0IGhhc1N1Ym1lbnUgPSBtZW51SXRlbS5zdWJtZW51ICYmIG1lbnVJdGVtLnN1Ym1lbnUubGVuZ3RoID4gMDsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9Im1lbnVJdGVtICR7aXNBY3RpdmUgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICA/ZGlzYWJsZWQ9JHttZW51SXRlbS5kaXNhYmxlZH0KICAgICAgICB0YWJpbmRleD0iJHttZW51SXRlbS5kaXNhYmxlZCA/IC0xIDogMH0iCiAgICAgICAgZGF0YS1pdGVtLWlkPSIke2l0ZW1JZH0iCiAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5oYW5kbGVNZW51Q2xpY2sobWVudUl0ZW0sIGl0ZW1JZCl9CiAgICAgICAgQGtleWRvd249JHsoZTExKSA9PiB0aGlzLmhhbmRsZU1lbnVLZXlkb3duKGUxMSwgbWVudUl0ZW0sIGl0ZW1JZCl9CiAgICAgICAgcm9sZT0ibWVudWl0ZW0iCiAgICAgICAgYXJpYS1oYXNwb3B1cD0iJHtoYXNTdWJtZW51fSIKICAgICAgICBhcmlhLWV4cGFuZGVkPSIke2lzQWN0aXZlfSIKICAgICAgPgogICAgICAgICR7bWVudUl0ZW0uaWNvbk5hbWUgPyBiMmA8ZGVlcy1pY29uIC5pY29uPSIke2BsdWNpZGU6JHttZW51SXRlbS5pY29uTmFtZX1gfSI+PC9kZWVzLWljb24+YCA6ICIifQogICAgICAgICR7bWVudUl0ZW0ubmFtZX0KICAgICAgICAke2hhc1N1Ym1lbnUgPyB0aGlzLnJlbmRlckRyb3Bkb3duKG1lbnVJdGVtLnN1Ym1lbnUsIGl0ZW1JZCwgaXNBY3RpdmUpIDogIiJ9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlckRyb3Bkb3duKGl0ZW1zLCBwYXJlbnRJZCwgaXNPcGVuKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiAKICAgICAgICBjbGFzcz0iZHJvcGRvd24gJHtpc09wZW4gPyAib3BlbiIgOiAiIn0iIAogICAgICAgIEBjbGljaz0keyhlMTEpID0+IGUxMS5zdG9wUHJvcGFnYXRpb24oKX0KICAgICAgICBAa2V5ZG93bj0keyhlMTEpID0+IHRoaXMuaGFuZGxlRHJvcGRvd25LZXlkb3duKGUxMSwgaXRlbXMsIHBhcmVudElkKX0KICAgICAgICB0YWJpbmRleD0iJHtpc09wZW4gPyAwIDogLTF9IgogICAgICAgIHJvbGU9Im1lbnUiCiAgICAgID4KICAgICAgICAke2l0ZW1zLm1hcCgoaXRlbSwgaW5kZXgyKSA9PiB0aGlzLnJlbmRlckRyb3Bkb3duSXRlbShpdGVtLCBgJHtwYXJlbnRJZH0tJHtpbmRleDJ9YCkpfQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJEcm9wZG93bkl0ZW0oaXRlbSwgaXRlbUlkKSB7CiAgICAgIGlmICgiZGl2aWRlciIgaW4gaXRlbSAmJiBpdGVtLmRpdmlkZXIpIHsKICAgICAgICByZXR1cm4gYjJgPGRpdiBjbGFzcz0iZHJvcGRvd24tZGl2aWRlciI+PC9kaXY+YDsKICAgICAgfQogICAgICBjb25zdCBtZW51SXRlbSA9IGl0ZW07CiAgICAgIGNvbnN0IGl0ZW1JbmRleCA9IHBhcnNlSW50KGl0ZW1JZC5zcGxpdCgiLSIpLnBvcCgpIHx8ICIwIik7CiAgICAgIGNvbnN0IGlzRm9jdXNlZCA9IHRoaXMuZm9jdXNlZERyb3Bkb3duSXRlbSA9PT0gaXRlbUluZGV4OwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYKICAgICAgICBjbGFzcz0iZHJvcGRvd24taXRlbSAke2lzRm9jdXNlZCA/ICJmb2N1c2VkIiA6ICIifSIKICAgICAgICA/ZGlzYWJsZWQ9JHttZW51SXRlbS5kaXNhYmxlZH0KICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmhhbmRsZURyb3Bkb3duSXRlbUNsaWNrKG1lbnVJdGVtKX0KICAgICAgICBAbW91c2VlbnRlcj0keygpID0+IHRoaXMuZm9jdXNlZERyb3Bkb3duSXRlbSA9IGl0ZW1JbmRleH0KICAgICAgICByb2xlPSJtZW51aXRlbSIKICAgICAgICB0YWJpbmRleD0iJHttZW51SXRlbS5kaXNhYmxlZCA/IC0xIDogMH0iCiAgICAgID4KICAgICAgICAke21lbnVJdGVtLmljb25OYW1lID8gYjJgPGRlZXMtaWNvbiAuaWNvbj0iJHtgbHVjaWRlOiR7bWVudUl0ZW0uaWNvbk5hbWV9YH0iPjwvZGVlcy1pY29uPmAgOiAiIn0KICAgICAgICA8c3Bhbj4ke21lbnVJdGVtLm5hbWV9PC9zcGFuPgogICAgICAgICR7bWVudUl0ZW0uc2hvcnRjdXQgPyBiMmA8c3BhbiBjbGFzcz0ic2hvcnRjdXQiPiR7bWVudUl0ZW0uc2hvcnRjdXR9PC9zcGFuPmAgOiAiIn0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgcmVuZGVyQnJlYWRjcnVtYnMoKSB7CiAgICAgIGlmICghdGhpcy5icmVhZGNydW1icykgewogICAgICAgIHJldHVybiBiMmBgOwogICAgICB9CiAgICAgIGNvbnN0IHBhcnRzID0gdGhpcy5icmVhZGNydW1icy5zcGxpdCh0aGlzLmJyZWFkY3J1bWJTZXBhcmF0b3IpOwogICAgICByZXR1cm4gYjJgCiAgICAgICR7cGFydHMubWFwKChwYXJ0LCBpbmRleDIpID0+IGIyYAogICAgICAgICR7aW5kZXgyID4gMCA/IGIyYDxzcGFuIGNsYXNzPSJicmVhZGNydW1iLXNlcGFyYXRvciI+JHt0aGlzLmJyZWFkY3J1bWJTZXBhcmF0b3J9PC9zcGFuPmAgOiAiIn0KICAgICAgICA8c3BhbiAKICAgICAgICAgIGNsYXNzPSJicmVhZGNydW1iLWl0ZW0iIAogICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5oYW5kbGVCcmVhZGNydW1iQ2xpY2socGFydCwgaW5kZXgyKX0KICAgICAgICA+CiAgICAgICAgICAke3BhcnR9CiAgICAgICAgPC9zcGFuPgogICAgICBgKX0KICAgIGA7CiAgICB9CiAgICByZW5kZXJBY2NvdW50U2VjdGlvbigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICAke3RoaXMuc2hvd1NlYXJjaCA/IGIyYAogICAgICAgIDxkZWVzLWljb24KICAgICAgICAgIGNsYXNzPSJzZWFyY2gtaWNvbiIKICAgICAgICAgIC5pY29uPSR7Imx1Y2lkZTpzZWFyY2gifQogICAgICAgICAgQGNsaWNrPSR7dGhpcy5oYW5kbGVTZWFyY2hDbGlja30KICAgICAgICA+PC9kZWVzLWljb24+CiAgICAgIGAgOiAiIn0KICAgICAgJHt0aGlzLnVzZXIgPyBiMmAKICAgICAgICA8ZGl2IHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9InVzZXItaW5mbyIgQGNsaWNrPSR7dGhpcy5oYW5kbGVVc2VyQ2xpY2t9PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1c2VyLWF2YXRhciI+CiAgICAgICAgICAgICAgJHt0aGlzLnVzZXIuYXZhdGFyID8gYjJgPGltZyBzcmM9IiR7dGhpcy51c2VyLmF2YXRhcn0iIGFsdD0iJHt0aGlzLnVzZXIubmFtZX0iPmAgOiBiMmAke3RoaXMudXNlci5uYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfWB9CiAgICAgICAgICAgICAgJHt0aGlzLnVzZXIuc3RhdHVzID8gYjJgCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1c2VyLXN0YXR1cyAke3RoaXMudXNlci5zdGF0dXN9Ij48L2Rpdj4KICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8c3Bhbj4ke3RoaXMudXNlci5uYW1lfTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRlZXMtYXBwdWktcHJvZmlsZWRyb3Bkb3duCiAgICAgICAgICAgIC51c2VyPSR7dGhpcy51c2VyfQogICAgICAgICAgICAubWVudUl0ZW1zPSR7dGhpcy5wcm9maWxlTWVudUl0ZW1zfQogICAgICAgICAgICAuaXNPcGVuPSR7dGhpcy5pc1Byb2ZpbGVEcm9wZG93bk9wZW59CiAgICAgICAgICAgIC5wb3NpdGlvbj0keyJ0b3AtcmlnaHQifQogICAgICAgICAgICBAbWVudS1zZWxlY3Q9JHsoZTExKSA9PiB0aGlzLmhhbmRsZVByb2ZpbGVNZW51U2VsZWN0KGUxMSl9CiAgICAgICAgICA+PC9kZWVzLWFwcHVpLXByb2ZpbGVkcm9wZG93bj4KICAgICAgICA8L2Rpdj4KICAgICAgYCA6ICIifQogICAgICAke3RoaXMuc2hvd0FjdGl2aXR5TG9nVG9nZ2xlID8gYjJgCiAgICAgICAgPGRpdgogICAgICAgICAgY2xhc3M9ImFjdGl2aXR5LXRvZ2dsZSAke3RoaXMuYWN0aXZpdHlMb2dBY3RpdmUgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgIEBjbGljaz0ke3RoaXMuaGFuZGxlQWN0aXZpdHlUb2dnbGV9CiAgICAgICAgICB0aXRsZT0iQWN0aXZpdHkgTG9nIgogICAgICAgID4KICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOmFjdGl2aXR5In0+PC9kZWVzLWljb24+CiAgICAgICAgICAke3RoaXMuYWN0aXZpdHlMb2dDb3VudCA+IDAgPyBiMmAKICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImFjdGl2aXR5LWJhZGdlIj4ke3RoaXMuYWN0aXZpdHlMb2dDb3VudCA+IDk5ID8gIjk5KyIgOiB0aGlzLmFjdGl2aXR5TG9nQ291bnR9PC9zcGFuPgogICAgICAgICAgYCA6ICIifQogICAgICAgIDwvZGl2PgogICAgICBgIDogIiJ9CiAgICBgOwogICAgfQogICAgLy8gRXZlbnQgaGFuZGxlcnMKICAgIGhhbmRsZU1lbnVDbGljayhpdGVtLCBpdGVtSWQpIHsKICAgICAgaWYgKGl0ZW0uZGlzYWJsZWQpCiAgICAgICAgcmV0dXJuOwogICAgICBpZiAoaXRlbS5zdWJtZW51ICYmIGl0ZW0uc3VibWVudS5sZW5ndGggPiAwKSB7CiAgICAgICAgaWYgKHRoaXMuYWN0aXZlTWVudSA9PT0gaXRlbUlkKSB7CiAgICAgICAgICB0aGlzLmFjdGl2ZU1lbnUgPSBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmFjdGl2ZU1lbnUgPSBpdGVtSWQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuYWN0aXZlTWVudSA9IG51bGw7CiAgICAgICAgaWYgKGl0ZW0uYWN0aW9uKSB7CiAgICAgICAgICBpdGVtLmFjdGlvbigpOwogICAgICAgIH0KICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJtZW51LXNlbGVjdCIsIHsKICAgICAgICAgIGRldGFpbDogeyBpdGVtIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZURyb3Bkb3duSXRlbUNsaWNrKGl0ZW0pIHsKICAgICAgaWYgKGl0ZW0uZGlzYWJsZWQpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLmFjdGl2ZU1lbnUgPSBudWxsOwogICAgICBpZiAoaXRlbS5hY3Rpb24pIHsKICAgICAgICBpdGVtLmFjdGlvbigpOwogICAgICB9CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm1lbnUtc2VsZWN0IiwgewogICAgICAgIGRldGFpbDogeyBpdGVtIH0sCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBoYW5kbGVNZW51S2V5ZG93bihlMTEsIGl0ZW0sIGl0ZW1JZCkgewogICAgICBzd2l0Y2ggKGUxMS5rZXkpIHsKICAgICAgICBjYXNlICJFbnRlciI6CiAgICAgICAgY2FzZSAiICI6CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuaGFuZGxlTWVudUNsaWNrKGl0ZW0sIGl0ZW1JZCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJBcnJvd0Rvd24iOgogICAgICAgICAgaWYgKGl0ZW0uc3VibWVudSAmJiB0aGlzLmFjdGl2ZU1lbnUgPT09IGl0ZW1JZCkgewogICAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdGhpcy5mb2N1c2VkRHJvcGRvd25JdGVtID0gMDsKICAgICAgICAgICAgY29uc3QgZmlyc3RWYWxpZEl0ZW0gPSB0aGlzLmZpbmROZXh0VmFsaWRJdGVtKGl0ZW0uc3VibWVudSwgLTEsIDEpOwogICAgICAgICAgICBpZiAoZmlyc3RWYWxpZEl0ZW0gIT09IC0xKSB7CiAgICAgICAgICAgICAgdGhpcy5mb2N1c2VkRHJvcGRvd25JdGVtID0gZmlyc3RWYWxpZEl0ZW07CiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBkcm9wZG93biA9IHRoaXMucmVuZGVyUm9vdC5xdWVyeVNlbGVjdG9yKCIuZHJvcGRvd24ub3BlbiIpOwogICAgICAgICAgICAgICAgaWYgKGRyb3Bkb3duKSB7CiAgICAgICAgICAgICAgICAgIGRyb3Bkb3duLmZvY3VzKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkVzY2FwZSI6CiAgICAgICAgICB0aGlzLmFjdGl2ZU1lbnUgPSBudWxsOwogICAgICAgICAgdGhpcy5mb2N1c2VkRHJvcGRvd25JdGVtID0gLTE7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJUYWIiOgogICAgICAgICAgaWYgKHRoaXMuYWN0aXZlTWVudSA9PT0gaXRlbUlkKSB7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlTWVudSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuZm9jdXNlZERyb3Bkb3duSXRlbSA9IC0xOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQXJyb3dSaWdodCI6CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuZm9jdXNOZXh0TWVudUl0ZW0oaXRlbUlkLCAxKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkFycm93TGVmdCI6CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuZm9jdXNOZXh0TWVudUl0ZW0oaXRlbUlkLCAtMSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaGFuZGxlQnJlYWRjcnVtYkNsaWNrKGJyZWFkY3J1bWIsIGluZGV4MikgewogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJicmVhZGNydW1iLW5hdmlnYXRlIiwgewogICAgICAgIGRldGFpbDogeyBicmVhZGNydW1iLCBpbmRleDogaW5kZXgyIH0sCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBoYW5kbGVTZWFyY2hDbGljaygpIHsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgic2VhcmNoLWNsaWNrIiwgewogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgaGFuZGxlQWN0aXZpdHlUb2dnbGUoKSB7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImFjdGl2aXR5LXRvZ2dsZSIsIHsKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGhhbmRsZVVzZXJDbGljaygpIHsKICAgICAgdGhpcy5pc1Byb2ZpbGVEcm9wZG93bk9wZW4gPSAhdGhpcy5pc1Byb2ZpbGVEcm9wZG93bk9wZW47CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInVzZXItbWVudS1vcGVuIiwgewogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgaGFuZGxlUHJvZmlsZU1lbnVTZWxlY3QoZTExKSB7CiAgICAgIHRoaXMuaXNQcm9maWxlRHJvcGRvd25PcGVuID0gZmFsc2U7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInByb2ZpbGUtbWVudS1zZWxlY3QiLCB7CiAgICAgICAgZGV0YWlsOiBlMTEuZGV0YWlsLAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgLy8gTGlmZWN5Y2xlCiAgICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuaGFuZGxlR2xvYmFsQ2xpY2spOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuaGFuZGxlRG9jdW1lbnRDbGljayk7CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLmhhbmRsZURvY3VtZW50Q2xpY2spOwogICAgfQogICAgaGFuZGxlR2xvYmFsQ2xpY2sgPSAoX19ydW5Jbml0aWFsaXplcnMxMSh0aGlzLCBfaXNQcm9maWxlRHJvcGRvd25PcGVuX2V4dHJhSW5pdGlhbGl6ZXJzKSwgKGUxMSkgPT4gewogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICB9KTsKICAgIGhhbmRsZURvY3VtZW50Q2xpY2sgPSAoKSA9PiB7CiAgICAgIHRoaXMuYWN0aXZlTWVudSA9IG51bGw7CiAgICAgIHRoaXMuZm9jdXNlZERyb3Bkb3duSXRlbSA9IC0xOwogICAgfTsKICAgIGhhbmRsZURyb3Bkb3duS2V5ZG93bihlMTEsIGl0ZW1zLCBfcGFyZW50SWQpIHsKICAgICAgY29uc3QgdmFsaWRJdGVtcyA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gISgiZGl2aWRlciIgaW4gaXRlbSAmJiBpdGVtLmRpdmlkZXIpKTsKICAgICAgc3dpdGNoIChlMTEua2V5KSB7CiAgICAgICAgY2FzZSAiQXJyb3dEb3duIjoKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5maW5kTmV4dFZhbGlkSXRlbShpdGVtcywgdGhpcy5mb2N1c2VkRHJvcGRvd25JdGVtLCAxKTsKICAgICAgICAgIGlmIChuZXh0SW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgIHRoaXMuZm9jdXNlZERyb3Bkb3duSXRlbSA9IG5leHRJbmRleDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkFycm93VXAiOgogICAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBjb25zdCBwcmV2SW5kZXggPSB0aGlzLmZpbmROZXh0VmFsaWRJdGVtKGl0ZW1zLCB0aGlzLmZvY3VzZWREcm9wZG93bkl0ZW0sIC0xKTsKICAgICAgICAgIGlmIChwcmV2SW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgIHRoaXMuZm9jdXNlZERyb3Bkb3duSXRlbSA9IHByZXZJbmRleDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkVudGVyIjoKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZERyb3Bkb3duSXRlbSAhPT0gLTEpIHsKICAgICAgICAgICAgY29uc3QgZm9jdXNlZEl0ZW0gPSB2YWxpZEl0ZW1zW3RoaXMuZm9jdXNlZERyb3Bkb3duSXRlbV07CiAgICAgICAgICAgIGlmIChmb2N1c2VkSXRlbSAmJiAiYWN0aW9uIiBpbiBmb2N1c2VkSXRlbSAmJiAhZm9jdXNlZEl0ZW0uZGlzYWJsZWQpIHsKICAgICAgICAgICAgICB0aGlzLmhhbmRsZURyb3Bkb3duSXRlbUNsaWNrKGZvY3VzZWRJdGVtKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiSG9tZSI6CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSB0aGlzLmZpbmROZXh0VmFsaWRJdGVtKGl0ZW1zLCAtMSwgMSk7CiAgICAgICAgICBpZiAoZmlyc3RJbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgdGhpcy5mb2N1c2VkRHJvcGRvd25JdGVtID0gZmlyc3RJbmRleDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkVuZCI6CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IHRoaXMuZmluZE5leHRWYWxpZEl0ZW0oaXRlbXMsIGl0ZW1zLmxlbmd0aCwgLTEpOwogICAgICAgICAgaWYgKGxhc3RJbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgdGhpcy5mb2N1c2VkRHJvcGRvd25JdGVtID0gbGFzdEluZGV4OwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiRXNjYXBlIjoKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgdGhpcy5hY3RpdmVNZW51ID0gbnVsbDsKICAgICAgICAgIHRoaXMuZm9jdXNlZERyb3Bkb3duSXRlbSA9IC0xOwogICAgICAgICAgY29uc3QgbWVudUl0ZW0gPSB0aGlzLnJlbmRlclJvb3QucXVlcnlTZWxlY3RvcihgLm1lbnVJdGVtLmFjdGl2ZWApOwogICAgICAgICAgaWYgKG1lbnVJdGVtKSB7CiAgICAgICAgICAgIG1lbnVJdGVtLmZvY3VzKCk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgZmluZE5leHRWYWxpZEl0ZW0oaXRlbXMsIGN1cnJlbnRJbmRleCwgZGlyZWN0aW9uKSB7CiAgICAgIGxldCBpbmRleDIgPSBjdXJyZW50SW5kZXggKyBkaXJlY3Rpb247CiAgICAgIHdoaWxlIChpbmRleDIgPj0gMCAmJiBpbmRleDIgPCBpdGVtcy5sZW5ndGgpIHsKICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaW5kZXgyXTsKICAgICAgICBpZiAoISgiZGl2aWRlciIgaW4gaXRlbSAmJiBpdGVtLmRpdmlkZXIpICYmICEoImRpc2FibGVkIiBpbiBpdGVtICYmIGl0ZW0uZGlzYWJsZWQpKSB7CiAgICAgICAgICByZXR1cm4gaW5kZXgyOwogICAgICAgIH0KICAgICAgICBpbmRleDIgKz0gZGlyZWN0aW9uOwogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGZvY3VzTmV4dE1lbnVJdGVtKGN1cnJlbnRJdGVtSWQsIGRpcmVjdGlvbikgewogICAgICBjb25zdCBtZW51SXRlbXMgPSBBcnJheS5mcm9tKHRoaXMucmVuZGVyUm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIubWVudUl0ZW0iKSk7CiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IG1lbnVJdGVtcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0uZ2V0QXR0cmlidXRlKCJkYXRhLWl0ZW0taWQiKSA9PT0gY3VycmVudEl0ZW1JZCk7CiAgICAgIGlmIChjdXJyZW50SW5kZXggPT09IC0xKQogICAgICAgIHJldHVybjsKICAgICAgbGV0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCArIGRpcmVjdGlvbjsKICAgICAgaWYgKG5leHRJbmRleCA8IDApIHsKICAgICAgICBuZXh0SW5kZXggPSBtZW51SXRlbXMubGVuZ3RoIC0gMTsKICAgICAgfSBlbHNlIGlmIChuZXh0SW5kZXggPj0gbWVudUl0ZW1zLmxlbmd0aCkgewogICAgICAgIG5leHRJbmRleCA9IDA7CiAgICAgIH0KICAgICAgbGV0IGF0dGVtcHRzID0gMDsKICAgICAgd2hpbGUgKGF0dGVtcHRzIDwgbWVudUl0ZW1zLmxlbmd0aCkgewogICAgICAgIGNvbnN0IG5leHRJdGVtID0gbWVudUl0ZW1zW25leHRJbmRleF07CiAgICAgICAgaWYgKCFuZXh0SXRlbS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpIHsKICAgICAgICAgIG5leHRJdGVtLmZvY3VzKCk7CiAgICAgICAgICBpZiAodGhpcy5hY3RpdmVNZW51KSB7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlTWVudSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuZm9jdXNlZERyb3Bkb3duSXRlbSA9IC0xOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIG5leHRJbmRleCA9IChuZXh0SW5kZXggKyBkaXJlY3Rpb24gKyBtZW51SXRlbXMubGVuZ3RoKSAlIG1lbnVJdGVtcy5sZW5ndGg7CiAgICAgICAgYXR0ZW1wdHMrKzsKICAgICAgfQogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnMxMShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0FwcHVpQmFyMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtYXBwdWkvZGVlcy1hcHB1aS1ib3R0b21iYXIvZGVlcy1hcHB1aS1ib3R0b21iYXIuZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgX2E7CnZhciBkZW1vRnVuYzUgPSAoKSA9PiB7CiAgcmV0dXJuIGIyKF9hIHx8IChfYSA9IF9fdGVtcGxhdGUoW2AKICAgIDxkZWVzLWRlbW93cmFwcGVyPgogICAgICA8c3R5bGU+CiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICAgIGJhY2tncm91bmQ6ICMxYTFhMWE7CiAgICAgICAgfQoKICAgICAgICAuZGVtby1zZWN0aW9uIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgfQoKICAgICAgICAuZGVtby1sYWJlbCB7CiAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICBjb2xvcjogIzczNzM3MzsKICAgICAgICAgIGZvbnQtZmFtaWx5OiAnR2Vpc3QgU2FucycsIHNhbnMtc2VyaWY7CiAgICAgICAgfQoKICAgICAgICAuZGVtby1ib3R0b21iYXItd3JhcHBlciB7CiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBoc2woMCAwJSAyMCUpOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB9CiAgICAgIDwvc3R5bGU+CiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVtby1sYWJlbCI+Qm90dG9tIGJhciB3aXRoIHN0YXR1cyB3aWRnZXRzIGFuZCBhY3Rpb25zPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkZW1vLWJvdHRvbWJhci13cmFwcGVyIj4KICAgICAgICAgICAgPGRlZXMtYXBwdWktYm90dG9tYmFyCiAgICAgICAgICAgICAgaWQ9ImRlbW8tYm90dG9tYmFyIgogICAgICAgICAgICA+PC9kZWVzLWFwcHVpLWJvdHRvbWJhcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVtby1sYWJlbCI+Q29udHJvbHM8L2Rpdj4KICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBmbGV4LXdyYXA6IHdyYXA7Ij4KICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPSJhZGRTdWNjZXNzV2lkZ2V0KCkiPkFkZCBTdWNjZXNzIFdpZGdldDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9ImFkZFdhcm5pbmdXaWRnZXQoKSI+QWRkIFdhcm5pbmcgV2lkZ2V0PC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gb25jbGljaz0iYWRkRXJyb3JXaWRnZXQoKSI+QWRkIEVycm9yIFdpZGdldDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9ImFkZExvYWRpbmdXaWRnZXQoKSI+QWRkIExvYWRpbmcgV2lkZ2V0PC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gb25jbGljaz0iYWRkUmlnaHRXaWRnZXQoKSI+QWRkIFJpZ2h0IFdpZGdldDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9ImFkZEFjdGlvbigpIj5BZGQgQWN0aW9uPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gb25jbGljaz0iY2xlYXJBbGwoKSI+Q2xlYXIgQWxsPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxzY3JpcHQgdHlwZT0ibW9kdWxlIj4KICAgICAgICBjb25zdCBib3R0b21iYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVtby1ib3R0b21iYXInKTsKCiAgICAgICAgLy8gV2FpdCBmb3IgY29tcG9uZW50IHRvIGluaXRpYWxpemUKICAgICAgICBhd2FpdCBib3R0b21iYXIudXBkYXRlQ29tcGxldGU7CgogICAgICAgIC8vIEFkZCBpbml0aWFsIHdpZGdldHMKICAgICAgICBib3R0b21iYXIuYWRkV2lkZ2V0KHsKICAgICAgICAgIGlkOiAnc3RhdHVzJywKICAgICAgICAgIGljb25OYW1lOiAnbHVjaWRlOmFjdGl2aXR5JywKICAgICAgICAgIGxhYmVsOiAnU3lzdGVtIE9ubGluZScsCiAgICAgICAgICBzdGF0dXM6ICdzdWNjZXNzJywKICAgICAgICAgIHRvb2x0aXA6ICdBbGwgc3lzdGVtcyBvcGVyYXRpb25hbCcsCiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiBjb25zb2xlLmxvZygnU3RhdHVzIGNsaWNrZWQnKSwKICAgICAgICAgIGNvbnRleHRNZW51SXRlbXM6IFsKICAgICAgICAgICAgeyBuYW1lOiAnVmlldyBEZXRhaWxzJywgaWNvbk5hbWU6ICdsdWNpZGU6aW5mbycsIGFjdGlvbjogKCkgPT4gYWxlcnQoJ1N5c3RlbSBkZXRhaWxzJykgfSwKICAgICAgICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgICAgIHsgbmFtZTogJ1JlZnJlc2ggU3RhdHVzJywgaWNvbk5hbWU6ICdsdWNpZGU6cmVmcmVzaEN3JywgYWN0aW9uOiAoKSA9PiBhbGVydCgnUmVmcmVzaGluZy4uLicpIH0sCiAgICAgICAgICBdLAogICAgICAgIH0pOwoKICAgICAgICBib3R0b21iYXIuYWRkV2lkZ2V0KHsKICAgICAgICAgIGlkOiAnbm90aWZpY2F0aW9ucycsCiAgICAgICAgICBpY29uTmFtZTogJ2x1Y2lkZTpiZWxsJywKICAgICAgICAgIGxhYmVsOiAnMyBub3RpZmljYXRpb25zJywKICAgICAgICAgIHN0YXR1czogJ3dhcm5pbmcnLAogICAgICAgICAgdG9vbHRpcDogJ1lvdSBoYXZlIHVucmVhZCBub3RpZmljYXRpb25zJywKICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IGNvbnNvbGUubG9nKCdOb3RpZmljYXRpb25zIGNsaWNrZWQnKSwKICAgICAgICB9KTsKCiAgICAgICAgYm90dG9tYmFyLmFkZFdpZGdldCh7CiAgICAgICAgICBpZDogJ3ZlcnNpb24nLAogICAgICAgICAgaWNvbk5hbWU6ICdsdWNpZGU6Z2l0QnJhbmNoJywKICAgICAgICAgIGxhYmVsOiAndjEuMi4zJywKICAgICAgICAgIHRvb2x0aXA6ICdDdXJyZW50IHZlcnNpb24nLAogICAgICAgICAgcG9zaXRpb246ICdyaWdodCcsCiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiBjb25zb2xlLmxvZygnVmVyc2lvbiBjbGlja2VkJyksCiAgICAgICAgfSk7CgogICAgICAgIC8vIEFkZCBpbml0aWFsIGFjdGlvbnMKICAgICAgICBib3R0b21iYXIuYWRkQWN0aW9uKHsKICAgICAgICAgIGlkOiAnc2V0dGluZ3MnLAogICAgICAgICAgaWNvbk5hbWU6ICdsdWNpZGU6c2V0dGluZ3MnLAogICAgICAgICAgdG9vbHRpcDogJ1NldHRpbmdzJywKICAgICAgICAgIHBvc2l0aW9uOiAncmlnaHQnLAogICAgICAgICAgb25DbGljazogKCkgPT4gYWxlcnQoJ1NldHRpbmdzIGNsaWNrZWQnKSwKICAgICAgICB9KTsKCiAgICAgICAgYm90dG9tYmFyLmFkZEFjdGlvbih7CiAgICAgICAgICBpZDogJ2hlbHAnLAogICAgICAgICAgaWNvbk5hbWU6ICdsdWNpZGU6aGVscENpcmNsZScsCiAgICAgICAgICB0b29sdGlwOiAnSGVscCcsCiAgICAgICAgICBwb3NpdGlvbjogJ3JpZ2h0JywKICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IGFsZXJ0KCdIZWxwIGNsaWNrZWQnKSwKICAgICAgICB9KTsKCiAgICAgICAgLy8gRGVtbyBjb250cm9sIGZ1bmN0aW9ucwogICAgICAgIGxldCB3aWRnZXRDb3VudGVyID0gMDsKICAgICAgICBsZXQgYWN0aW9uQ291bnRlciA9IDA7CgogICAgICAgIHdpbmRvdy5hZGRTdWNjZXNzV2lkZ2V0ID0gKCkgPT4gewogICAgICAgICAgd2lkZ2V0Q291bnRlcisrOwogICAgICAgICAgYm90dG9tYmFyLmFkZFdpZGdldCh7CiAgICAgICAgICAgIGlkOiAnc3VjY2Vzcy0nICsgd2lkZ2V0Q291bnRlciwKICAgICAgICAgICAgaWNvbk5hbWU6ICdsdWNpZGU6Y2hlY2tDaXJjbGUnLAogICAgICAgICAgICBsYWJlbDogJ1N1Y2Nlc3MgJyArIHdpZGdldENvdW50ZXIsCiAgICAgICAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLAogICAgICAgICAgICB0b29sdGlwOiAnU3VjY2VzcyB3aWRnZXQnLAogICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiBib3R0b21iYXIucmVtb3ZlV2lkZ2V0KCdzdWNjZXNzLScgKyB3aWRnZXRDb3VudGVyKSwKICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIHdpbmRvdy5hZGRXYXJuaW5nV2lkZ2V0ID0gKCkgPT4gewogICAgICAgICAgd2lkZ2V0Q291bnRlcisrOwogICAgICAgICAgYm90dG9tYmFyLmFkZFdpZGdldCh7CiAgICAgICAgICAgIGlkOiAnd2FybmluZy0nICsgd2lkZ2V0Q291bnRlciwKICAgICAgICAgICAgaWNvbk5hbWU6ICdsdWNpZGU6YWxlcnRUcmlhbmdsZScsCiAgICAgICAgICAgIGxhYmVsOiAnV2FybmluZyAnICsgd2lkZ2V0Q291bnRlciwKICAgICAgICAgICAgc3RhdHVzOiAnd2FybmluZycsCiAgICAgICAgICAgIHRvb2x0aXA6ICdXYXJuaW5nIHdpZGdldCcsCiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IGJvdHRvbWJhci5yZW1vdmVXaWRnZXQoJ3dhcm5pbmctJyArIHdpZGdldENvdW50ZXIpLAogICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgd2luZG93LmFkZEVycm9yV2lkZ2V0ID0gKCkgPT4gewogICAgICAgICAgd2lkZ2V0Q291bnRlcisrOwogICAgICAgICAgYm90dG9tYmFyLmFkZFdpZGdldCh7CiAgICAgICAgICAgIGlkOiAnZXJyb3ItJyArIHdpZGdldENvdW50ZXIsCiAgICAgICAgICAgIGljb25OYW1lOiAnbHVjaWRlOnhDaXJjbGUnLAogICAgICAgICAgICBsYWJlbDogJ0Vycm9yICcgKyB3aWRnZXRDb3VudGVyLAogICAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsCiAgICAgICAgICAgIHRvb2x0aXA6ICdFcnJvciB3aWRnZXQnLAogICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiBib3R0b21iYXIucmVtb3ZlV2lkZ2V0KCdlcnJvci0nICsgd2lkZ2V0Q291bnRlciksCiAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICB3aW5kb3cuYWRkTG9hZGluZ1dpZGdldCA9ICgpID0+IHsKICAgICAgICAgIHdpZGdldENvdW50ZXIrKzsKICAgICAgICAgIGNvbnN0IGlkID0gJ2xvYWRpbmctJyArIHdpZGdldENvdW50ZXI7CiAgICAgICAgICBib3R0b21iYXIuYWRkV2lkZ2V0KHsKICAgICAgICAgICAgaWQ6IGlkLAogICAgICAgICAgICBpY29uTmFtZTogJ2x1Y2lkZTpsb2FkZXIyJywKICAgICAgICAgICAgbGFiZWw6ICdMb2FkaW5nLi4uJywKICAgICAgICAgICAgc3RhdHVzOiAnYWN0aXZlJywKICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSwKICAgICAgICAgICAgdG9vbHRpcDogJ0xvYWRpbmcgaW4gcHJvZ3Jlc3MnLAogICAgICAgICAgfSk7CgogICAgICAgICAgLy8gU2ltdWxhdGUgY29tcGxldGlvbiBhZnRlciAzIHNlY29uZHMKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICBib3R0b21iYXIudXBkYXRlV2lkZ2V0KGlkLCB7CiAgICAgICAgICAgICAgaWNvbk5hbWU6ICdsdWNpZGU6Y2hlY2snLAogICAgICAgICAgICAgIGxhYmVsOiAnRG9uZSEnLAogICAgICAgICAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLAogICAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sIDMwMDApOwogICAgICAgIH07CgogICAgICAgIHdpbmRvdy5hZGRSaWdodFdpZGdldCA9ICgpID0+IHsKICAgICAgICAgIHdpZGdldENvdW50ZXIrKzsKICAgICAgICAgIGJvdHRvbWJhci5hZGRXaWRnZXQoewogICAgICAgICAgICBpZDogJ3JpZ2h0LScgKyB3aWRnZXRDb3VudGVyLAogICAgICAgICAgICBpY29uTmFtZTogJ2x1Y2lkZTppbmZvJywKICAgICAgICAgICAgbGFiZWw6ICdSaWdodCAnICsgd2lkZ2V0Q291bnRlciwKICAgICAgICAgICAgcG9zaXRpb246ICdyaWdodCcsCiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IGJvdHRvbWJhci5yZW1vdmVXaWRnZXQoJ3JpZ2h0LScgKyB3aWRnZXRDb3VudGVyKSwKICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIHdpbmRvdy5hZGRBY3Rpb24gPSAoKSA9PiB7CiAgICAgICAgICBhY3Rpb25Db3VudGVyKys7CiAgICAgICAgICBib3R0b21iYXIuYWRkQWN0aW9uKHsKICAgICAgICAgICAgaWQ6ICdhY3Rpb24tJyArIGFjdGlvbkNvdW50ZXIsCiAgICAgICAgICAgIGljb25OYW1lOiAnbHVjaWRlOnphcCcsCiAgICAgICAgICAgIHRvb2x0aXA6ICdBY3Rpb24gJyArIGFjdGlvbkNvdW50ZXIsCiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHsKICAgICAgICAgICAgICBhbGVydCgnQWN0aW9uICcgKyBhY3Rpb25Db3VudGVyICsgJyBjbGlja2VkJyk7CiAgICAgICAgICAgICAgYm90dG9tYmFyLnJlbW92ZUFjdGlvbignYWN0aW9uLScgKyBhY3Rpb25Db3VudGVyKTsKICAgICAgICAgICAgfSwKICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIHdpbmRvdy5jbGVhckFsbCA9ICgpID0+IHsKICAgICAgICAgIGJvdHRvbWJhci5jbGVhcldpZGdldHMoKTsKICAgICAgICAgIGJvdHRvbWJhci5jbGVhckFjdGlvbnMoKTsKICAgICAgICAgIHdpZGdldENvdW50ZXIgPSAwOwogICAgICAgICAgYWN0aW9uQ291bnRlciA9IDA7CiAgICAgICAgfTsKICAgICAgPFwvc2NyaXB0PgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgogIGBdKSkpOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWFwcHVpL2RlZXMtYXBwdWktYm90dG9tYmFyL2RlZXMtYXBwdWktYm90dG9tYmFyLmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfdGhlbWUoKTsKaW5pdF9kZWVzX2ljb24oKTsKdmFyIF9fZXNEZWNvcmF0ZTExID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMxMiA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0FwcHVpQm90dG9tYmFyID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1hcHB1aS1ib3R0b21iYXIiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF93aWRnZXRzX2RlY29yYXRvcnM7CiAgbGV0IF93aWRnZXRzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfd2lkZ2V0c19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWN0aW9uc19kZWNvcmF0b3JzOwogIGxldCBfYWN0aW9uc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FjdGlvbnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0FwcHVpQm90dG9tYmFyMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3dpZGdldHNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2FjdGlvbnNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlMTEodGhpcywgbnVsbCwgX3dpZGdldHNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAid2lkZ2V0cyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAid2lkZ2V0cyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai53aWRnZXRzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai53aWRnZXRzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3dpZGdldHNfaW5pdGlhbGl6ZXJzLCBfd2lkZ2V0c19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTExKHRoaXMsIG51bGwsIF9hY3Rpb25zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFjdGlvbnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFjdGlvbnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWN0aW9ucywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYWN0aW9ucyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hY3Rpb25zX2luaXRpYWxpemVycywgX2FjdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxMShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNBcHB1aUJvdHRvbWJhcjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzU7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiQXBwIFVJIl07CiAgICAjd2lkZ2V0c19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMxMih0aGlzLCBfd2lkZ2V0c19pbml0aWFsaXplcnMsIFtdKTsKICAgIC8vIElOU1RBTkNFIFBST1BFUlRJRVMKICAgIGdldCB3aWRnZXRzKCkgewogICAgICByZXR1cm4gdGhpcy4jd2lkZ2V0c19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHdpZGdldHModmFsdWUyKSB7CiAgICAgIHRoaXMuI3dpZGdldHNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhY3Rpb25zX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxMih0aGlzLCBfd2lkZ2V0c19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTIodGhpcywgX2FjdGlvbnNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IGFjdGlvbnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhY3Rpb25zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYWN0aW9ucyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYWN0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5ib3R0b20tYmFyIHsKICAgICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIHBhZGRpbmc6IDAgOHB4OwogICAgICAgIGdhcDogNHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NCUpIiwgImhzbCgwIDAlIDYlKSIpfTsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg1JSkiLCAiaHNsKDAgMCUgMTUlKSIpfTsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0MCUpIiwgImhzbCgwIDAlIDYwJSkiKX07CiAgICAgIH0KCiAgICAgIC53aWRnZXQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDRweDsKICAgICAgICBwYWRkaW5nOiAycHggNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cyBlYXNlLCBjb2xvciAwLjE1cyBlYXNlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgIC53aWRnZXQ6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OCUpIiwgImhzbCgwIDAlIDEyJSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAyMCUpIiwgImhzbCgwIDAlIDgwJSkiKX07CiAgICAgIH0KCiAgICAgIC53aWRnZXQgZGVlcy1pY29uIHsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLndpZGdldC1zZXBhcmF0b3IgewogICAgICAgIHdpZHRoOiAxcHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4MCUpIiwgImhzbCgwIDAlIDIwJSkiKX07CiAgICAgICAgbWFyZ2luOiAwIDRweDsKICAgICAgfQoKICAgICAgLyogU3RhdHVzIGNvbG9ycyBtYXRjaGluZyBkZWVzLXdvcmtzcGFjZS1ib3R0b21iYXIgKi8KICAgICAgLndpZGdldC5hY3RpdmUgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCAxMDAlIDQ1JSkiLCAiaHNsKDIxMCAxMDAlIDYwJSkiKX07CiAgICAgIH0KCiAgICAgIC53aWRnZXQuc3VjY2VzcyB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyIDcwJSAzNSUpIiwgImhzbCgxNDIgNzAlIDUwJSkiKX07CiAgICAgIH0KCiAgICAgIC53aWRnZXQud2FybmluZyB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMzggOTIlIDQ1JSkiLCAiaHNsKDM4IDkyJSA1NSUpIil9OwogICAgICB9CgogICAgICAud2lkZ2V0LmVycm9yIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcwJSA1MCUpIiwgImhzbCgwIDcwJSA2MCUpIil9OwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIHNwaW4gewogICAgICAgIGZyb20geyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfQogICAgICB9CgogICAgICAuc3Bpbm5pbmcgewogICAgICAgIGFuaW1hdGlvbjogc3BpbiAxcyBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIC5zcGFjZXIgewogICAgICAgIGZsZXg6IDE7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cyBlYXNlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDAlKSIsICJoc2woMCAwJSA2MCUpIil9OwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg4JSkiLCAiaHNsKDAgMCUgMTIlKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDIwJSkiLCAiaHNsKDAgMCUgODAlKSIpfTsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idXR0b24uZGlzYWJsZWQgewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbi5kaXNhYmxlZDpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0MCUpIiwgImhzbCgwIDAlIDYwJSkiKX07CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIGNvbnN0IGxlZnRXaWRnZXRzID0gdGhpcy53aWRnZXRzLmZpbHRlcigodzMpID0+IHczLnBvc2l0aW9uICE9PSAicmlnaHQiKS5zb3J0KChhNSwgYjUpID0+IChhNS5vcmRlciB8fCAwKSAtIChiNS5vcmRlciB8fCAwKSk7CiAgICAgIGNvbnN0IHJpZ2h0V2lkZ2V0cyA9IHRoaXMud2lkZ2V0cy5maWx0ZXIoKHczKSA9PiB3My5wb3NpdGlvbiA9PT0gInJpZ2h0Iikuc29ydCgoYTUsIGI1KSA9PiAoYTUub3JkZXIgfHwgMCkgLSAoYjUub3JkZXIgfHwgMCkpOwogICAgICBjb25zdCBsZWZ0QWN0aW9ucyA9IHRoaXMuYWN0aW9ucy5maWx0ZXIoKGE1KSA9PiBhNS5wb3NpdGlvbiA9PT0gImxlZnQiKTsKICAgICAgY29uc3QgcmlnaHRBY3Rpb25zID0gdGhpcy5hY3Rpb25zLmZpbHRlcigoYTUpID0+IGE1LnBvc2l0aW9uICE9PSAibGVmdCIpOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImJvdHRvbS1iYXIiPgogICAgICAgIDwhLS0gTGVmdCBhY3Rpb25zIC0tPgogICAgICAgICR7bGVmdEFjdGlvbnMubWFwKChhY3Rpb24pID0+IHRoaXMucmVuZGVyQWN0aW9uKGFjdGlvbikpfQoKICAgICAgICA8IS0tIExlZnQgd2lkZ2V0cyAtLT4KICAgICAgICAke2xlZnRXaWRnZXRzLm1hcCgod2lkZ2V0LCBpbmRleDIpID0+IGIyYAogICAgICAgICAgJHtpbmRleDIgPiAwIHx8IGxlZnRBY3Rpb25zLmxlbmd0aCA+IDAgPyBiMmA8ZGl2IGNsYXNzPSJ3aWRnZXQtc2VwYXJhdG9yIj48L2Rpdj5gIDogIiJ9CiAgICAgICAgICAke3RoaXMucmVuZGVyV2lkZ2V0KHdpZGdldCl9CiAgICAgICAgYCl9CgogICAgICAgIDxkaXYgY2xhc3M9InNwYWNlciI+PC9kaXY+CgogICAgICAgIDwhLS0gUmlnaHQgd2lkZ2V0cyAtLT4KICAgICAgICAke3JpZ2h0V2lkZ2V0cy5tYXAoKHdpZGdldCwgaW5kZXgyKSA9PiBiMmAKICAgICAgICAgICR7dGhpcy5yZW5kZXJXaWRnZXQod2lkZ2V0KX0KICAgICAgICAgICR7aW5kZXgyIDwgcmlnaHRXaWRnZXRzLmxlbmd0aCAtIDEgfHwgcmlnaHRBY3Rpb25zLmxlbmd0aCA+IDAgPyBiMmA8ZGl2IGNsYXNzPSJ3aWRnZXQtc2VwYXJhdG9yIj48L2Rpdj5gIDogIiJ9CiAgICAgICAgYCl9CgogICAgICAgIDwhLS0gUmlnaHQgYWN0aW9ucyAtLT4KICAgICAgICAke3JpZ2h0QWN0aW9ucy5tYXAoKGFjdGlvbikgPT4gdGhpcy5yZW5kZXJBY3Rpb24oYWN0aW9uKSl9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlcldpZGdldCh3aWRnZXQpIHsKICAgICAgY29uc3Qgc3RhdHVzQ2xhc3MgPSB3aWRnZXQuc3RhdHVzICYmIHdpZGdldC5zdGF0dXMgIT09ICJpZGxlIiA/IHdpZGdldC5zdGF0dXMgOiAiIjsKICAgICAgY29uc3QgaWNvbk5hbWUgPSB3aWRnZXQuaWNvbk5hbWUgPyB3aWRnZXQuaWNvbk5hbWUuc3RhcnRzV2l0aCgibHVjaWRlOiIpID8gd2lkZ2V0Lmljb25OYW1lIDogYGx1Y2lkZToke3dpZGdldC5pY29uTmFtZX1gIDogIiI7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdgogICAgICAgIGNsYXNzPSJ3aWRnZXQgJHtzdGF0dXNDbGFzc30iCiAgICAgICAgdGl0bGU9IiR7d2lkZ2V0LnRvb2x0aXAgfHwgIiJ9IgogICAgICAgIEBjbGljaz0keygpID0+IHdpZGdldC5vbkNsaWNrPy4oKX0KICAgICAgICBAY29udGV4dG1lbnU9JHsoZTExKSA9PiB0aGlzLmhhbmRsZVdpZGdldENvbnRleHRNZW51KGUxMSwgd2lkZ2V0KX0KICAgICAgPgogICAgICAgICR7aWNvbk5hbWUgPyBiMmAKICAgICAgICAgIDxkZWVzLWljb24KICAgICAgICAgICAgLmljb249JHtpY29uTmFtZX0KICAgICAgICAgICAgaWNvblNpemU9IjEyIgogICAgICAgICAgICBjbGFzcz0iJHt3aWRnZXQubG9hZGluZyA/ICJzcGlubmluZyIgOiAiIn0iCiAgICAgICAgICA+PC9kZWVzLWljb24+CiAgICAgICAgYCA6ICIifQogICAgICAgICR7d2lkZ2V0LmxhYmVsID8gYjJgPHNwYW4+JHt3aWRnZXQubGFiZWx9PC9zcGFuPmAgOiAiIn0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgcmVuZGVyQWN0aW9uKGFjdGlvbikgewogICAgICBjb25zdCBpY29uTmFtZSA9IGFjdGlvbi5pY29uTmFtZS5zdGFydHNXaXRoKCJsdWNpZGU6IikgPyBhY3Rpb24uaWNvbk5hbWUgOiBgbHVjaWRlOiR7YWN0aW9uLmljb25OYW1lfWA7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdgogICAgICAgIGNsYXNzPSJhY3Rpb24tYnV0dG9uICR7YWN0aW9uLmRpc2FibGVkID8gImRpc2FibGVkIiA6ICIifSIKICAgICAgICB0aXRsZT0iJHthY3Rpb24udG9vbHRpcCB8fCAiIn0iCiAgICAgICAgQGNsaWNrPSR7KCkgPT4gIWFjdGlvbi5kaXNhYmxlZCAmJiBhY3Rpb24ub25DbGljaz8uKCl9CiAgICAgID4KICAgICAgICA8ZGVlcy1pY29uCiAgICAgICAgICAuaWNvbj0ke2ljb25OYW1lfQogICAgICAgICAgaWNvblNpemU9IjEyIgogICAgICAgID48L2RlZXMtaWNvbj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgaGFuZGxlV2lkZ2V0Q29udGV4dE1lbnUoZTExLCB3aWRnZXQpIHsKICAgICAgaWYgKCF3aWRnZXQuY29udGV4dE1lbnVJdGVtcyB8fCB3aWRnZXQuY29udGV4dE1lbnVJdGVtcy5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuOwogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgY29uc3QgbWVudUl0ZW1zID0gW107CiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB3aWRnZXQuY29udGV4dE1lbnVJdGVtcykgewogICAgICAgIGlmIChpdGVtLmRpdmlkZXIpIHsKICAgICAgICAgIG1lbnVJdGVtcy5wdXNoKHsgZGl2aWRlcjogdHJ1ZSB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWVudUl0ZW1zLnB1c2goewogICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsCiAgICAgICAgICAgIGljb25OYW1lOiBpdGVtLmljb25OYW1lLAogICAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgICBhd2FpdCBpdGVtLmFjdGlvbigpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBkaXNhYmxlZDogaXRlbS5kaXNhYmxlZAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGF3YWl0IERlZXNDb250ZXh0bWVudS5vcGVuQ29udGV4dE1lbnVXaXRoT3B0aW9ucyhlMTEsIG1lbnVJdGVtcyk7CiAgICB9CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEFQSSBNRVRIT0RTIChpbXBsZW1lbnRzIElCb3R0b21CYXJBUEkpCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8qKgogICAgICogQWRkIGEgd2lkZ2V0IHRvIHRoZSBib3R0b20gYmFyCiAgICAgKi8KICAgIGFkZFdpZGdldCh3aWRnZXQpIHsKICAgICAgdGhpcy53aWRnZXRzID0gdGhpcy53aWRnZXRzLmZpbHRlcigodzMpID0+IHczLmlkICE9PSB3aWRnZXQuaWQpOwogICAgICB0aGlzLndpZGdldHMgPSBbLi4udGhpcy53aWRnZXRzLCB3aWRnZXRdOwogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGUgYW4gZXhpc3Rpbmcgd2lkZ2V0IGJ5IElECiAgICAgKi8KICAgIHVwZGF0ZVdpZGdldChpZCwgdXBkYXRlKSB7CiAgICAgIHRoaXMud2lkZ2V0cyA9IHRoaXMud2lkZ2V0cy5tYXAoKHczKSA9PiB3My5pZCA9PT0gaWQgPyB7IC4uLnczLCAuLi51cGRhdGUgfSA6IHczKTsKICAgIH0KICAgIC8qKgogICAgICogUmVtb3ZlIGEgd2lkZ2V0IGJ5IElECiAgICAgKi8KICAgIHJlbW92ZVdpZGdldChpZCkgewogICAgICB0aGlzLndpZGdldHMgPSB0aGlzLndpZGdldHMuZmlsdGVyKCh3MykgPT4gdzMuaWQgIT09IGlkKTsKICAgIH0KICAgIC8qKgogICAgICogR2V0IGEgd2lkZ2V0IGJ5IElECiAgICAgKi8KICAgIGdldFdpZGdldChpZCkgewogICAgICByZXR1cm4gdGhpcy53aWRnZXRzLmZpbmQoKHczKSA9PiB3My5pZCA9PT0gaWQpOwogICAgfQogICAgLyoqCiAgICAgKiBDbGVhciBhbGwgd2lkZ2V0cwogICAgICovCiAgICBjbGVhcldpZGdldHMoKSB7CiAgICAgIHRoaXMud2lkZ2V0cyA9IFtdOwogICAgfQogICAgLyoqCiAgICAgKiBBZGQgYW4gYWN0aW9uIGJ1dHRvbgogICAgICovCiAgICBhZGRBY3Rpb24oYWN0aW9uKSB7CiAgICAgIHRoaXMuYWN0aW9ucyA9IHRoaXMuYWN0aW9ucy5maWx0ZXIoKGE1KSA9PiBhNS5pZCAhPT0gYWN0aW9uLmlkKTsKICAgICAgdGhpcy5hY3Rpb25zID0gWy4uLnRoaXMuYWN0aW9ucywgYWN0aW9uXTsKICAgIH0KICAgIC8qKgogICAgICogUmVtb3ZlIGFuIGFjdGlvbiBieSBJRAogICAgICovCiAgICByZW1vdmVBY3Rpb24oaWQpIHsKICAgICAgdGhpcy5hY3Rpb25zID0gdGhpcy5hY3Rpb25zLmZpbHRlcigoYTUpID0+IGE1LmlkICE9PSBpZCk7CiAgICB9CiAgICAvKioKICAgICAqIENsZWFyIGFsbCBhY3Rpb25zCiAgICAgKi8KICAgIGNsZWFyQWN0aW9ucygpIHsKICAgICAgdGhpcy5hY3Rpb25zID0gW107CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnMxMih0aGlzLCBfYWN0aW9uc19leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczEyKF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzQXBwdWlCb3R0b21iYXIyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1wYW5lbC9kZWVzLXBhbmVsLmRlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW9GdW5jNiA9ICgpID0+IGIyYAogIDxzdHlsZT4KICAgICR7aWAKICAgICAgLmRlbW8tYmFja2dyb3VuZCB7CiAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUlKSIsICJoc2woMCAwJSA1JSkiKX07CiAgICAgICAgbWluLWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgCiAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LXdpZHRoOiAxMjAwcHg7CiAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogMjRweDsKICAgICAgfQogICAgICAKICAgICAgLnNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMjRweDsKICAgICAgICBmb250LXdlaWdodDogNzAwOwogICAgICAgIG1hcmdpbjogMzJweCAwIDE2cHggMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMjVlbTsKICAgICAgfQogICAgICAKICAgICAgLnNlY3Rpb24tdGl0bGU6Zmlyc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5ncmlkLWxheW91dCB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgICAgICAgZ2FwOiAyNHB4OwogICAgICB9CiAgICAgIAogICAgICAuZ3JpZC0zY29sIHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmciAxZnI7CiAgICAgICAgZ2FwOiAyNHB4OwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgKG1heC13aWR0aDogOTY4cHgpIHsKICAgICAgICAuZ3JpZC0zY29sIHsKICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgICAgICAgLmdyaWQtbGF5b3V0IHsKICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgY29kZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgcGFkZGluZzogMnB4IDZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICB9CiAgICBgfQogIDwvc3R5bGU+CiAgCiAgPGRpdiBjbGFzcz0iZGVtby1iYWNrZ3JvdW5kIj4KICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgICAgPGgyIGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5EZWZhdWx0IFBhbmVsczwvaDI+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiUGFuZWwgQ29tcG9uZW50In0gLnN1YnRpdGxlPSR7IlRoZSBkZWZhdWx0IHBhbmVsIHZhcmlhbnQgd2l0aCBzaGFkY24taW5zcGlyZWQgc3R5bGluZyJ9PgogICAgICAgIDxwPlRoZSBwYW5lbCBjb21wb25lbnQgYXV0b21hdGljYWxseSBmb2xsb3dzIHRoZSB0aGVtZSBhbmQgcHJvdmlkZXMgY29uc2lzdGVudCBzdHlsaW5nIGZvciBncm91cGVkIGNvbnRlbnQuPC9wPgogICAgICAgIDxwPkl0J3MgcGVyZmVjdCBmb3IgY3JlYXRpbmcgc2VjdGlvbnMgaW4geW91ciBhcHBsaWNhdGlvbiB3aXRoIHByb3BlciBzcGFjaW5nIGFuZCBib3JkZXJzLjwvcD4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iZ3JpZC1sYXlvdXQiPgogICAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJGZWF0dXJlIE92ZXJ2aWV3In0gLnN1YnRpdGxlPSR7IktleSBjYXBhYmlsaXRpZXMifT4KICAgICAgICAgIDxwPkdyaWQgbGF5b3V0cyB3b3JrIGdyZWF0IHdpdGggcGFuZWxzIGZvciBjcmVhdGluZyBkYXNoYm9hcmRzIGFuZCBmZWF0dXJlIHNlY3Rpb25zLjwvcD4KICAgICAgICAgIDxkZWVzLWJ1dHRvbj5MZWFybiBNb3JlPC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2RlZXMtcGFuZWw+CiAgICAgICAgCiAgICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IlF1aWNrIEFjdGlvbnMifSAuc3VidGl0bGU9JHsiQ29tbW9uIHRhc2tzIn0+CiAgICAgICAgICA8cD5FYWNoIHBhbmVsIG1haW50YWlucyBjb25zaXN0ZW50IHNwYWNpbmcgYW5kIHN0eWxpbmcgYWNyb3NzIHlvdXIgYXBwbGljYXRpb24uPC9wPgogICAgICAgICAgPGRlZXMtYnV0dG9uPkdldCBTdGFydGVkPC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGgyIGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5QYW5lbCBWYXJpYW50czwvaDI+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiRGVmYXVsdCBWYXJpYW50In0gLnZhcmlhbnQ9JHsiZGVmYXVsdCJ9PgogICAgICAgIDxwPlRoZSBkZWZhdWx0IHZhcmlhbnQgaGFzIGEgd2hpdGUgYmFja2dyb3VuZCwgc3VidGxlIGJvcmRlciwgYW5kIG1pbmltYWwgc2hhZG93LiBJdCdzIHRoZSBzdGFuZGFyZCBjaG9pY2UgZm9yIG1vc3QgY29udGVudC48L3A+CiAgICAgICAgPHA+VXNlIDxjb2RlPnZhcmlhbnQ9ImRlZmF1bHQiPC9jb2RlPiBvciBvbWl0IHRoZSB2YXJpYW50IHByb3BlcnR5LjwvcD4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7Ik91dGxpbmUgVmFyaWFudCJ9IC5zdWJ0aXRsZT0keyJUcmFuc3BhcmVudCBiYWNrZ3JvdW5kIHdpdGggYm9yZGVyIn0gLnZhcmlhbnQ9JHsib3V0bGluZSJ9PgogICAgICAgIDxwPlRoZSBvdXRsaW5lIHZhcmlhbnQgcmVtb3ZlcyB0aGUgYmFja2dyb3VuZCBjb2xvciBhbmQgc2hhZG93LCBrZWVwaW5nIG9ubHkgdGhlIGJvcmRlci48L3A+CiAgICAgICAgPHA+VXNlIDxjb2RlPnZhcmlhbnQ9Im91dGxpbmUiPC9jb2RlPiBmb3IgYSBsaWdodGVyIHZpc3VhbCB3ZWlnaHQuPC9wPgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiR2hvc3QgVmFyaWFudCJ9IC5zdWJ0aXRsZT0keyJNaW5pbWFsIHN0eWxpbmcgZm9yIHN1YnRsZSBzZWN0aW9ucyJ9IC52YXJpYW50PSR7Imdob3N0In0+CiAgICAgICAgPHA+VGhlIGdob3N0IHZhcmlhbnQgaGFzIG5vIGJvcmRlciBvciBiYWNrZ3JvdW5kIGJ5IGRlZmF1bHQsIG9ubHkgc2hvd2luZyBhIHN1YnRsZSBiYWNrZ3JvdW5kIG9uIGhvdmVyLjwvcD4KICAgICAgICA8cD5Vc2UgPGNvZGU+dmFyaWFudD0iZ2hvc3QiPC9jb2RlPiBmb3IgdGhlIG1vc3QgbWluaW1hbCBhcHBlYXJhbmNlLjwvcD4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGgyIGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5QYW5lbCBTaXplczwvaDI+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJncmlkLTNjb2wiPgogICAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJTbWFsbCBQYW5lbCJ9IC5zaXplPSR7InNtIn0+CiAgICAgICAgICA8cD5Db21wYWN0IHBhZGRpbmcgZm9yIGRlbnNlIGxheW91dHMuPC9wPgogICAgICAgICAgPHA+VXNlIDxjb2RlPnNpemU9InNtIjwvY29kZT48L3A+CiAgICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAgIAogICAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJNZWRpdW0gUGFuZWwifSAuc2l6ZT0keyJtZCJ9PgogICAgICAgICAgPHA+RGVmYXVsdCBzaXplIHdpdGggYmFsYW5jZWQgc3BhY2luZy48L3A+CiAgICAgICAgICA8cD5Vc2UgPGNvZGU+c2l6ZT0ibWQiPC9jb2RlPiBvciBvbWl0LjwvcD4KICAgICAgICA8L2RlZXMtcGFuZWw+CiAgICAgICAgCiAgICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkxhcmdlIFBhbmVsIn0gLnNpemU9JHsibGcifT4KICAgICAgICAgIDxwPkdlbmVyb3VzIHBhZGRpbmcgZm9yIHByb21pbmVudCBzZWN0aW9ucy48L3A+CiAgICAgICAgICA8cD5Vc2UgPGNvZGU+c2l6ZT0ibGciPC9jb2RlPjwvcD4KICAgICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGgyIGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5Db21wbGV4IEV4YW1wbGVzPC9oMj4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJGb3JtIEV4YW1wbGUifSAuc3VidGl0bGU9JHsiUGFuZWxzIHdvcmsgZ3JlYXQgZm9yIG9yZ2FuaXppbmcgZm9ybSBzZWN0aW9ucyJ9PgogICAgICAgIDxkZWVzLWZvcm0+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IC5sYWJlbD0keyJQcm9qZWN0IE5hbWUifSAucmVxdWlyZWQ9JHt0cnVlfT48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgLmxhYmVsPSR7IkRlc2NyaXB0aW9uIn0gLmlucHV0VHlwZT0keyJ0ZXh0YXJlYSJ9PjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgPGRlZXMtaW5wdXQtZHJvcGRvd24gCiAgICAgICAgICAgIC5sYWJlbD0keyJDYXRlZ29yeSJ9IAogICAgICAgICAgICAub3B0aW9ucz0ke1sKICB7IG9wdGlvbjogIldlYiBEZXZlbG9wbWVudCIsIGtleTogIndlYiIgfSwKICB7IG9wdGlvbjogIk1vYmlsZSBBcHAiLCBrZXk6ICJtb2JpbGUiIH0sCiAgeyBvcHRpb246ICJEZXNrdG9wIFNvZnR3YXJlIiwga2V5OiAiZGVza3RvcCIgfQpdfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1kcm9wZG93bj4KICAgICAgICAgIDxkZWVzLWZvcm0tc3VibWl0PkNyZWF0ZSBQcm9qZWN0PC9kZWVzLWZvcm0tc3VibWl0PgogICAgICAgIDwvZGVlcy1mb3JtPgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiTmVzdGVkIFBhbmVscyJ9IC5zdWJ0aXRsZT0keyJQYW5lbHMgY2FuIGJlIG5lc3RlZCBmb3IgaGllcmFyY2hpY2FsIG9yZ2FuaXphdGlvbiJ9PgogICAgICAgIDxwPllvdSBjYW4gbmVzdCBwYW5lbHMgdG8gY3JlYXRlIG1vcmUgY29tcGxleCBsYXlvdXRzOjwvcD4KICAgICAgICAKICAgICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiTmVzdGVkIFBhbmVsIDEifSAudmFyaWFudD0keyJvdXRsaW5lIn0gLnNpemU9JHsic20ifT4KICAgICAgICAgIDxwPlRoaXMgaXMgYSBuZXN0ZWQgcGFuZWwgd2l0aCBvdXRsaW5lIHZhcmlhbnQgYW5kIHNtYWxsIHNpemUuPC9wPgogICAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgICAKICAgICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiTmVzdGVkIFBhbmVsIDIifSAudmFyaWFudD0keyJnaG9zdCJ9IC5zaXplPSR7InNtIn0+CiAgICAgICAgICA8cD5UaGlzIGlzIGFub3RoZXIgbmVzdGVkIHBhbmVsIHdpdGggZ2hvc3QgdmFyaWFudC48L3A+CiAgICAgICAgPC9kZWVzLXBhbmVsPgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8aDIgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlVudGl0bGVkIFBhbmVsczwvaDI+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbD4KICAgICAgICA8cD5QYW5lbHMgd29yayBncmVhdCBldmVuIHdpdGhvdXQgYSB0aXRsZSBmb3Igc2ltcGxlIGNvbnRlbnQgZ3JvdXBpbmcuPC9wPgogICAgICAgIDxwPlRoZXkgcHJvdmlkZSB2aXN1YWwgc2VwYXJhdGlvbiBhbmQgY29uc2lzdGVudCBwYWRkaW5nIHRocm91Z2hvdXQgeW91ciBpbnRlcmZhY2UuPC9wPgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJncmlkLWxheW91dCI+CiAgICAgICAgPGRlZXMtcGFuZWwgLnZhcmlhbnQ9JHsib3V0bGluZSJ9PgogICAgICAgICAgPGg0IHN0eWxlPSJtYXJnaW4tdG9wOiAwOyI+Q3VzdG9tIENvbnRlbnQ8L2g0PgogICAgICAgICAgPHA+WW91IGNhbiBhZGQgeW91ciBvd24gaGVhZGluZ3MgYW5kIHN0cnVjdHVyZSB3aXRoaW4gdW50aXRsZWQgcGFuZWxzLjwvcD4KICAgICAgICA8L2RlZXMtcGFuZWw+CiAgICAgICAgCiAgICAgICAgPGRlZXMtcGFuZWwgLnZhcmlhbnQ9JHsiZ2hvc3QifT4KICAgICAgICAgIDxoNCBzdHlsZT0ibWFyZ2luLXRvcDogMDsiPk1pbmltYWwgU3R5bGU8L2g0PgogICAgICAgICAgPHA+R2hvc3QgcGFuZWxzIHdpdGhvdXQgdGl0bGVzIGNyZWF0ZSB2ZXJ5IHN1YnRsZSBjb250ZW50IHNlY3Rpb25zLjwvcD4KICAgICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC9kaXY+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZm9udHMuanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGdlaXN0U2Fuc0ZvbnQgPSAiR2Vpc3QgU2FucyI7CnZhciBpbnRlbE9uZU1vbm9Gb250ID0gIkludGVsIE9uZSBNb25vIjsKdmFyIGdlaXN0Rm9udEZhbWlseSA9IGAnJHtnZWlzdFNhbnNGb250fScsIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgJ1JvYm90bycsICdPeHlnZW4nLCAnVWJ1bnR1JywgJ0NhbnRhcmVsbCcsICdGaXJhIFNhbnMnLCAnRHJvaWQgU2FucycsICdIZWx2ZXRpY2EgTmV1ZScsIHNhbnMtc2VyaWZgOwp2YXIgbW9ub0ZvbnRGYW1pbHkgPSBgJyR7aW50ZWxPbmVNb25vRm9udH0nLCAnU0YgTW9ubycsICdNb25hY28nLCAnSW5jb25zb2xhdGEnLCAnRmlyYSBDb2RlJywgJ0ZpcmEgTW9ubycsICdEcm9pZCBTYW5zIE1vbm8nLCAnQ291cmllciBOZXcnLCBtb25vc3BhY2VgOwp2YXIgY3NzR2Vpc3RGb250RmFtaWx5ID0gcihnZWlzdEZvbnRGYW1pbHkpOwp2YXIgY3NzTW9ub0ZvbnRGYW1pbHkgPSByKG1vbm9Gb250RmFtaWx5KTsKdmFyIGNhbFNhbnNGb250ID0gIkNhbCBTYW5zIjsKdmFyIGNhbFNhbnNGb250RmFtaWx5ID0gYCcke2NhbFNhbnNGb250fScsICR7Z2Vpc3RGb250RmFtaWx5fWA7CnZhciBjc3NDYWxTYW5zRm9udEZhbWlseSA9IHIoY2FsU2Fuc0ZvbnRGYW1pbHkpOwp2YXIgcm9ib3RvU2xhYkZvbnQgPSAiUm9ib3RvIFNsYWIiOwp2YXIgcm9ib3RvU2xhYkZvbnRGYW1pbHkgPSBgJyR7cm9ib3RvU2xhYkZvbnR9JywgR2VvcmdpYSwgc2VyaWZgOwp2YXIgY3NzUm9ib3RvU2xhYkZvbnRGYW1pbHkgPSByKHJvYm90b1NsYWJGb250RmFtaWx5KTsKdmFyIGJhc2VGb250U3R5bGVzID0gcihgCiAgZm9udC1mYW1pbHk6ICR7Z2Vpc3RGb250RmFtaWx5fTsKICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlOwogIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogJ2N2MTEnLCAndG51bScsICdjdjA1JyAxOwpgKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1wYW5lbC9kZWVzLXBhbmVsLmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTEyID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMxMyA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1BhbmVsID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1wYW5lbCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3RpdGxlX2RlY29yYXRvcnM7CiAgbGV0IF90aXRsZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RpdGxlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zdWJ0aXRsZV9kZWNvcmF0b3JzOwogIGxldCBfc3VidGl0bGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zdWJ0aXRsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFyaWFudF9kZWNvcmF0b3JzOwogIGxldCBfdmFyaWFudF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhcmlhbnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NpemVfZGVjb3JhdG9yczsKICBsZXQgX3NpemVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaXplX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ydW5BZnRlclJlbmRlcl9kZWNvcmF0b3JzOwogIGxldCBfcnVuQWZ0ZXJSZW5kZXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ydW5BZnRlclJlbmRlcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzUGFuZWwyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfdGl0bGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9zdWJ0aXRsZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3ZhcmlhbnRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9zaXplX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfcnVuQWZ0ZXJSZW5kZXJfZGVjb3JhdG9ycyA9IFtuNSh7IGF0dHJpYnV0ZTogZmFsc2UgfSldOwogICAgICBfX2VzRGVjb3JhdGUxMih0aGlzLCBudWxsLCBfdGl0bGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGl0bGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRpdGxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRpdGxlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50aXRsZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90aXRsZV9pbml0aWFsaXplcnMsIF90aXRsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTEyKHRoaXMsIG51bGwsIF9zdWJ0aXRsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzdWJ0aXRsZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic3VidGl0bGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc3VidGl0bGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnN1YnRpdGxlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3N1YnRpdGxlX2luaXRpYWxpemVycywgX3N1YnRpdGxlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTIodGhpcywgbnVsbCwgX3ZhcmlhbnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmFyaWFudCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmFyaWFudCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai52YXJpYW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52YXJpYW50ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZhcmlhbnRfaW5pdGlhbGl6ZXJzLCBfdmFyaWFudF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTEyKHRoaXMsIG51bGwsIF9zaXplX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNpemUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNpemUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2l6ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2l6ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaXplX2luaXRpYWxpemVycywgX3NpemVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxMih0aGlzLCBudWxsLCBfcnVuQWZ0ZXJSZW5kZXJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicnVuQWZ0ZXJSZW5kZXIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInJ1bkFmdGVyUmVuZGVyIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJ1bkFmdGVyUmVuZGVyLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5ydW5BZnRlclJlbmRlciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9ydW5BZnRlclJlbmRlcl9pbml0aWFsaXplcnMsIF9ydW5BZnRlclJlbmRlcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTEyKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1BhbmVsMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jNjsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJMYXlvdXQiXTsKICAgICN0aXRsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMxMyh0aGlzLCBfdGl0bGVfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICBnZXQgdGl0bGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0aXRsZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRpdGxlKHZhbHVlMikgewogICAgICB0aGlzLiN0aXRsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3N1YnRpdGxlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxMyh0aGlzLCBfdGl0bGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczEzKHRoaXMsIF9zdWJ0aXRsZV9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgc3VidGl0bGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzdWJ0aXRsZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHN1YnRpdGxlKHZhbHVlMikgewogICAgICB0aGlzLiNzdWJ0aXRsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3ZhcmlhbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczEzKHRoaXMsIF9zdWJ0aXRsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTModGhpcywgX3ZhcmlhbnRfaW5pdGlhbGl6ZXJzLCAiZGVmYXVsdCIpKTsKICAgIGdldCB2YXJpYW50KCkgewogICAgICByZXR1cm4gdGhpcy4jdmFyaWFudF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhcmlhbnQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3ZhcmlhbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxMyh0aGlzLCBfdmFyaWFudF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTModGhpcywgX3NpemVfaW5pdGlhbGl6ZXJzLCAibWQiKSk7CiAgICBnZXQgc2l6ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NpemVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaXplKHZhbHVlMikgewogICAgICB0aGlzLiNzaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcnVuQWZ0ZXJSZW5kZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczEzKHRoaXMsIF9zaXplX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxMyh0aGlzLCBfcnVuQWZ0ZXJSZW5kZXJfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBydW5BZnRlclJlbmRlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3J1bkFmdGVyUmVuZGVyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcnVuQWZ0ZXJSZW5kZXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3J1bkFmdGVyUmVuZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtZmFtaWx5OiAke2Nzc0dlaXN0Rm9udEZhbWlseX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDMuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgIC8qIFZhcmlhbnQ6IGRlZmF1bHQgKi8KICAgICAgOmhvc3QoW3ZhcmlhbnQ9ImRlZmF1bHQiXSkgewogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCAwIGhzbCgwIDAlIDAlIC8gMC4wNSk7CiAgICAgIH0KCiAgICAgIC8qIFZhcmlhbnQ6IG91dGxpbmUgKi8KICAgICAgOmhvc3QoW3ZhcmlhbnQ9Im91dGxpbmUiXSkgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIFZhcmlhbnQ6IGdob3N0ICovCiAgICAgIDpob3N0KFt2YXJpYW50PSJnaG9zdCJdKSB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBib3gtc2hhZG93OiBub25lOwogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgIH0KCiAgICAgIC8qIFNpemUgdmFyaWF0aW9ucyAqLwogICAgICA6aG9zdChbc2l6ZT0ic20iXSkgewogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgIH0KCiAgICAgIDpob3N0KFtzaXplPSJsZyJdKSB7CiAgICAgICAgcGFkZGluZzogMzJweDsKICAgICAgfQoKICAgICAgLmhlYWRlciB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgfQoKICAgICAgLmhlYWRlcjplbXB0eSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLnRpdGxlIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTUlKSIpfTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDI1ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgfQoKICAgICAgLyogVGl0bGUgc2l6ZSB2YXJpYXRpb25zICovCiAgICAgIDpob3N0KFtzaXplPSJzbSJdKSAudGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgfQoKICAgICAgOmhvc3QoW3NpemU9ImxnIl0pIC50aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICB9CgogICAgICAuc3VidGl0bGUgewogICAgICAgIG1hcmdpbjogNHB4IDAgMCAwOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA1Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA1NS4xJSkiKX07CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAwNmVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICAgIH0KCiAgICAgIC8qIFN1YnRpdGxlIHNpemUgdmFyaWF0aW9ucyAqLwogICAgICA6aG9zdChbc2l6ZT0ic20iXSkgLnN1YnRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgIDpob3N0KFtzaXplPSJsZyJdKSAuc3VidGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBtYXJnaW4tdG9wOiA2cHg7CiAgICAgIH0KCiAgICAgIC5jb250ZW50IHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgMjYuNyUpIiwgImhzbCgyMTcuOSAxMC42JSA4NC45JSkiKX07CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7CiAgICAgIH0KCiAgICAgIC8qIENvbnRlbnQgc2l6ZSB2YXJpYXRpb25zICovCiAgICAgIDpob3N0KFtzaXplPSJzbSJdKSAuY29udGVudCB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICB9CgogICAgICA6aG9zdChbc2l6ZT0ibGciXSkgLmNvbnRlbnQgewogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgfQoKICAgICAgLyogUmVtb3ZlIG1hcmdpbnMgZnJvbSBmaXJzdCBhbmQgbGFzdCBjaGlsZHJlbiAqLwogICAgICAuY29udGVudCA6OnNsb3R0ZWQoKjpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgIH0KCiAgICAgIC5jb250ZW50IDo6c2xvdHRlZCgqOmxhc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICB9CgogICAgICAvKiBJbnRlcmFjdGl2ZSBzdGF0ZXMgZm9yIGRlZmF1bHQgdmFyaWFudCAqLwogICAgICA6aG9zdChbdmFyaWFudD0iZGVmYXVsdCJdOmhvdmVyKSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNzkuOCUpIiwgImhzbCgwIDAlIDIwLjklKSIpfTsKICAgICAgICBib3gtc2hhZG93OiAwIDRweCA2cHggLTFweCBoc2woMCAwJSAwJSAvIDAuMSksIDAgMnB4IDRweCAtMnB4IGhzbCgwIDAlIDAlIC8gMC4xKTsKICAgICAgfQoKICAgICAgLyogSW50ZXJhY3RpdmUgc3RhdGVzIGZvciBvdXRsaW5lIHZhcmlhbnQgKi8KICAgICAgOmhvc3QoW3ZhcmlhbnQ9Im91dGxpbmUiXTpob3ZlcikgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDc5LjglKSIsICJoc2woMCAwJSAyMC45JSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk4JSkiLCAiaHNsKDAgMCUgNy44JSkiKX07CiAgICAgIH0KCiAgICAgIC8qIEludGVyYWN0aXZlIHN0YXRlcyBmb3IgZ2hvc3QgdmFyaWFudCAqLwogICAgICA6aG9zdChbdmFyaWFudD0iZ2hvc3QiXTpob3ZlcikgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NS4xJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICB9CgogICAgICAvKiBGb2N1cyBzdGF0ZXMgKi8KICAgICAgOmhvc3QoOmZvY3VzLXdpdGhpbikgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlIC8gMC4xKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUgLyAwLjEpIil9OwogICAgICB9CgogICAgICAvKiBOZXN0ZWQgcGFuZWxzIHNwYWNpbmcgKi8KICAgICAgOjpzbG90dGVkKGRlZXMtcGFuZWwpIHsKICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICB9CgogICAgICA6OnNsb3R0ZWQoZGVlcy1wYW5lbDpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAke3RoaXMudGl0bGUgPyBiMmA8aDMgY2xhc3M9InRpdGxlIj4ke3RoaXMudGl0bGV9PC9oMz5gIDogIiJ9CiAgICAgICAgJHt0aGlzLnN1YnRpdGxlID8gYjJgPHAgY2xhc3M9InN1YnRpdGxlIj4ke3RoaXMuc3VidGl0bGV9PC9wPmAgOiAiIn0KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKCkgewogICAgICBpZiAodGhpcy5ydW5BZnRlclJlbmRlcikgewogICAgICAgIGF3YWl0IHRoaXMucnVuQWZ0ZXJSZW5kZXIodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczEzKHRoaXMsIF9ydW5BZnRlclJlbmRlcl9leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczEzKF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzUGFuZWwyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1kYXRhdmlldy9kZWVzLXN0YXRzZ3JpZC9kZWVzLXN0YXRzZ3JpZC5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBfYTI7CnZhciBnZW5lcmF0ZUNwdUNvcmVzID0gKGNvdW50MikgPT4gewogIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudDIgfSwgKF80LCBpMTEpID0+ICh7CiAgICBpZDogaTExLAogICAgdXNhZ2U6IE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDEwMCksCiAgICBsYWJlbDogYCR7aTExfWAKICB9KSk7Cn07CnZhciBkZW1vRnVuYzcgPSAoKSA9PiB7CiAgcmV0dXJuIGIyKF9hMiB8fCAoX2EyID0gX190ZW1wbGF0ZShbIlxuICA8ZGVlcy1kZW1vd3JhcHBlcj5cbiAgICA8c3R5bGU+XG4gICAgICAiLCAnXG4gICAgPC9zdHlsZT5cbiAgICBcbiAgICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+XG4gICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JywgIiAuc3VidGl0bGU9IiwgIj5cbiAgICAgICAgPGRlZXMtc3RhdHNncmlkXG4gICAgICAgICAgLnRpbGVzPSIsICJcbiAgICAgICAgICAuZ3JpZEFjdGlvbnM9IiwgIlxuICAgICAgICAgIC5taW5UaWxlV2lkdGg9IiwgIlxuICAgICAgICAgIC5nYXA9IiwgJ1xuICAgICAgICA+PC9kZWVzLXN0YXRzZ3JpZD5cbiAgICAgICAgXG4gICAgICAgIDxkaXYgaWQ9ImFjdGlvbi1vdXRwdXQiIHN0eWxlPSJtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiAnLCAiOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMTRweDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6ICIsICc7Ij5cbiAgICAgICAgICA8ZW0+Q2xpY2sgb24gdGlsZSBhY3Rpb25zIG9yIGdyaWQgYWN0aW9ucyB0byBzZWUgdGhlIHJlc3VsdC4uLjwvZW0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kZWVzLXBhbmVsPlxuICAgICAgXG4gICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JywgIiAuc3VidGl0bGU9IiwgIj5cbiAgICAgICAgPGRlZXMtc3RhdHNncmlkXG4gICAgICAgICAgLnRpbGVzPSIsICJcbiAgICAgICAgICAubWluVGlsZVdpZHRoPSIsICJcbiAgICAgICAgICAuZ2FwPSIsICdcbiAgICAgICAgPjwvZGVlcy1zdGF0c2dyaWQ+XG4gICAgICAgIFxuICAgICAgICA8ZGl2IGNsYXNzPSJ0aWxlLWNvbmZpZyI+XG4gICAgICAgICAgPGRpdiBjbGFzcz0iY29uZmlnLXNlY3Rpb24iPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29uZmlnLXRpdGxlIj5Db25maWd1cmF0aW9uIE9wdGlvbnM8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmZpZy1kZXNjcmlwdGlvbiI+XG4gICAgICAgICAgICAgIEVhY2ggdGlsZSB0eXBlIHN1cHBvcnRzIGRpZmZlcmVudCBwcm9wZXJ0aWVzOlxuICAgICAgICAgICAgICA8dWwgc3R5bGU9Im1hcmdpbjogOHB4IDA7IHBhZGRpbmctbGVmdDogMjBweDsiPlxuICAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPk51bWJlcjo8L3N0cm9uZz4gdmFsdWUsIHVuaXQsIGNvbG9yLCBkZXNjcmlwdGlvbjwvbGk+XG4gICAgICAgICAgICAgICAgPGxpPjxzdHJvbmc+R2F1Z2U6PC9zdHJvbmc+IHZhbHVlLCB1bml0LCBnYXVnZU9wdGlvbnMgKG1pbiwgbWF4LCB0aHJlc2hvbGRzKTwvbGk+XG4gICAgICAgICAgICAgICAgPGxpPjxzdHJvbmc+UGVyY2VudGFnZTo8L3N0cm9uZz4gdmFsdWUgKDAtMTAwKSwgY29sb3IsIGRlc2NyaXB0aW9uPC9saT5cbiAgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz5UcmVuZDo8L3N0cm9uZz4gdmFsdWUsIHVuaXQsIHRyZW5kRGF0YSBhcnJheSwgZGVzY3JpcHRpb248L2xpPlxuICAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPlRleHQ6PC9zdHJvbmc+IHZhbHVlIChzdHJpbmcpLCBjb2xvciwgZGVzY3JpcHRpb248L2xpPlxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kZWVzLXBhbmVsPlxuICAgICAgXG4gICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JywgIiAuc3VidGl0bGU9IiwgJz5cbiAgICAgICAgPGg0IHN0eWxlPSJtYXJnaW46IDAgMCAxNnB4IDA7IGZvbnQtc2l6ZTogMTZweDsgZm9udC13ZWlnaHQ6IDYwMDsiPkNvbXBhY3QgTGF5b3V0ICgxODBweCB0aWxlcyk8L2g0PlxuICAgICAgICA8ZGVlcy1zdGF0c2dyaWRcbiAgICAgICAgICAudGlsZXM9JywgIlxuICAgICAgICAgIC5taW5UaWxlV2lkdGg9IiwgIlxuICAgICAgICAgIC5nYXA9IiwgJ1xuICAgICAgICA+PC9kZWVzLXN0YXRzZ3JpZD5cbiAgICAgICAgXG4gICAgICAgIDxoNCBzdHlsZT0ibWFyZ2luOiAyNHB4IDAgMTZweCAwOyBmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA2MDA7Ij5TcGFjaW91cyBMYXlvdXQgKDMyMHB4IHRpbGVzKTwvaDQ+XG4gICAgICAgIDxkZWVzLXN0YXRzZ3JpZFxuICAgICAgICAgIC50aWxlcz0nLCAiXG4gICAgICAgICAgLm1pblRpbGVXaWR0aD0iLCAiXG4gICAgICAgICAgLmdhcD0iLCAiXG4gICAgICAgID48L2RlZXMtc3RhdHNncmlkPlxuICAgICAgPC9kZWVzLXBhbmVsPlxuICAgICAgXG4gICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9IiwgIiAuc3VidGl0bGU9IiwgJz5cbiAgICAgICAgPGRlZXMtc3RhdHNncmlkXG4gICAgICAgICAgaWQ9ImNwdS1jb3Jlcy1ncmlkIlxuICAgICAgICAgIC50aWxlcz0nLCAiXG4gICAgICAgICAgLmdyaWRBY3Rpb25zPSIsICJcbiAgICAgICAgICAubWluVGlsZVdpZHRoPSIsICJcbiAgICAgICAgICAuZ2FwPSIsICJcbiAgICAgICAgPjwvZGVlcy1zdGF0c2dyaWQ+XG4gICAgICA8L2RlZXMtcGFuZWw+XG5cbiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0iLCAiIC5zdWJ0aXRsZT0iLCAnPlxuICAgICAgICA8ZGVlcy1zdGF0c2dyaWRcbiAgICAgICAgICBpZD0iaW50ZXJhY3RpdmUtZ3JpZCJcbiAgICAgICAgICAudGlsZXM9JywgIlxuICAgICAgICAgIC5ncmlkQWN0aW9ucz0iLCAiXG4gICAgICAgICAgLm1pblRpbGVXaWR0aD0iLCAiXG4gICAgICAgICAgLmdhcD0iLCAiXG4gICAgICAgID48L2RlZXMtc3RhdHNncmlkPlxuICAgICAgPC9kZWVzLXBhbmVsPlxuICAgICAgXG4gICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9IiwgIiAuc3VidGl0bGU9IiwgJz5cbiAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1ibG9jayI+JywgIjwvZGl2PlxuICAgICAgPC9kZWVzLXBhbmVsPlxuXG4gICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9IiwgIiAuc3VidGl0bGU9IiwgIj5cbiAgICAgICAgPGRlZXMtc3RhdHNncmlkXG4gICAgICAgICAgLnRpbGVzPSIsICJcbiAgICAgICAgICAubWluVGlsZVdpZHRoPSIsICJcbiAgICAgICAgICAuZ2FwPSIsIGAKICAgICAgICA+PC9kZWVzLXN0YXRzZ3JpZD4KCiAgICAgICAgPGRpdiBjbGFzcz0idGlsZS1jb25maWciPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29uZmlnLXNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb25maWctdGl0bGUiPlBhcnRpdGlvbiBUaWxlIFByb3BlcnRpZXM8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29uZmlnLWRlc2NyaXB0aW9uIj4KICAgICAgICAgICAgICA8dWwgc3R5bGU9Im1hcmdpbjogOHB4IDA7IHBhZGRpbmctbGVmdDogMjBweDsiPgogICAgICAgICAgICAgICAgPGxpPjxzdHJvbmc+cGFydGl0aW9uRGF0YS51c2VkOjwvc3Ryb25nPiBVc2VkIHNwYWNlIGluIGJ5dGVzIChhdXRvLWZvcm1hdHRlZCk8L2xpPgogICAgICAgICAgICAgICAgPGxpPjxzdHJvbmc+cGFydGl0aW9uRGF0YS50b3RhbDo8L3N0cm9uZz4gVG90YWwgY2FwYWNpdHkgaW4gYnl0ZXM8L2xpPgogICAgICAgICAgICAgICAgPGxpPjxzdHJvbmc+cGFydGl0aW9uRGF0YS5maWxlc3lzdGVtOjwvc3Ryb25nPiBGaWxlc3lzdGVtIHR5cGUgKGV4dDQsIHhmcywgbnRmcyk8L2xpPgogICAgICAgICAgICAgICAgPGxpPjxzdHJvbmc+cGFydGl0aW9uRGF0YS5tb3VudFBvaW50Ojwvc3Ryb25nPiBNb3VudCBwb2ludCBwYXRoIChvcHRpb25hbCk8L2xpPgogICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgQ29sb3IgdGhyZXNob2xkczogTm9ybWFsICgmbHQ7NzUlKSwgV2FybmluZyAoNzUtOTAlKSwgQ3JpdGljYWwgKCZndDs5MCUpCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb25maWctc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmZpZy10aXRsZSI+RGlzayBUaWxlIFByb3BlcnRpZXM8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29uZmlnLWRlc2NyaXB0aW9uIj4KICAgICAgICAgICAgICA8dWwgc3R5bGU9Im1hcmdpbjogOHB4IDA7IHBhZGRpbmctbGVmdDogMjBweDsiPgogICAgICAgICAgICAgICAgPGxpPjxzdHJvbmc+ZGlza0RhdGEuY2FwYWNpdHk6PC9zdHJvbmc+IFRvdGFsIGNhcGFjaXR5IGluIGJ5dGVzPC9saT4KICAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPmRpc2tEYXRhLm1vZGVsOjwvc3Ryb25nPiBEaXNrIG1vZGVsIG5hbWUgKG9wdGlvbmFsKTwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz5kaXNrRGF0YS50eXBlOjwvc3Ryb25nPiBEaXNrIHR5cGU6ICdzc2QnLCAnaGRkJywgb3IgJ252bWUnPC9saT4KICAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPmRpc2tEYXRhLmlvcHM6PC9zdHJvbmc+IFJlYWQvd3JpdGUgSU9QUyAob3B0aW9uYWwpPC9saT4KICAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPmRpc2tEYXRhLmhlYWx0aDo8L3N0cm9uZz4gSGVhbHRoIHBlcmNlbnRhZ2UgMC0xMDAgKG9wdGlvbmFsKTwvbGk+CiAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICBIZWFsdGggdGhyZXNob2xkczogR29vZCAoNzAtMTAwJSksIFdhcm5pbmcgKDMwLTcwJSksIENyaXRpY2FsICgmbHQ7MzAlKQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICAvLyBDbGVhbnVwIGxpdmUgdXBkYXRlcyBvbiBwYWdlIHVubG9hZAogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgKCkgPT4gewogICAgICAgIGlmICgod2luZG93IGFzIGFueSkubGl2ZVVwZGF0ZUludGVydmFsKSB7CiAgICAgICAgICBjbGVhckludGVydmFsKCh3aW5kb3cgYXMgYW55KS5saXZlVXBkYXRlSW50ZXJ2YWwpOwogICAgICAgIH0KICAgICAgfSk7CiAgICA8XC9zY3JpcHQ+CiAgPC9kZWVzLWRlbW93cmFwcGVyPgogIGBdKSksIGlgCiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICAgIG1heC13aWR0aDogMTQwMHB4OwogICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGRlZXMtcGFuZWwgewogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZGVlcy1wYW5lbDpsYXN0LWNoaWxkIHsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC50aWxlLWNvbmZpZyB7CiAgICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgzMDBweCwgMWZyKSk7CiAgICAgICAgICBnYXA6IDE2cHg7CiAgICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuY29uZmlnLXNlY3Rpb24gewogICAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSAxNi44JSkiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5jb25maWctdGl0bGUgewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuY29uZmlnLWRlc2NyaXB0aW9uIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDU2LjklKSIsICJoc2woMjE1IDIwLjIlIDU1LjElKSIpfTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmNvZGUtYmxvY2sgewogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMjE1IDIwLjIlIDExLjglKSIpfTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgOTEuNCUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICAgICAgd2hpdGUtc3BhY2U6IHByZTsKICAgICAgICB9CiAgICAgIGAsICIxLiBDb21wcmVoZW5zaXZlIERhc2hib2FyZCIsICJGdWxsLWZlYXR1cmVkIHN0YXRzIGdyaWQgd2l0aCB2YXJpb3VzIHRpbGUgdHlwZXMsIGFjdGlvbnMsIGFuZCBMdWNpZGUgaWNvbnMiLCBbCiAgICB7CiAgICAgIGlkOiAicmV2ZW51ZSIsCiAgICAgIHRpdGxlOiAiVG90YWwgUmV2ZW51ZSIsCiAgICAgIHZhbHVlOiAxMjU0MjAsCiAgICAgIHVuaXQ6ICIkIiwKICAgICAgdHlwZTogIm51bWJlciIsCiAgICAgIGljb246ICJsdWNpZGU6ZG9sbGFyLXNpZ24iLAogICAgICBkZXNjcmlwdGlvbjogIisxMi41JSBmcm9tIGxhc3QgbW9udGgiLAogICAgICBhY3Rpb25zOiBbCiAgICAgICAgewogICAgICAgICAgbmFtZTogIlZpZXcgRGV0YWlscyIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTp0cmVuZGluZy11cCIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2FjdGlvbi1vdXRwdXQiKTsKICAgICAgICAgICAgaWYgKG91dHB1dCkgewogICAgICAgICAgICAgIG91dHB1dC50ZXh0Q29udGVudCA9ICJWaWV3aW5nIHJldmVudWUgZGV0YWlsczogJDEyNSw0MjAgKCsxMi41JSkiOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiRXhwb3J0IERhdGEiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6ZG93bmxvYWQiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNhY3Rpb24tb3V0cHV0Iik7CiAgICAgICAgICAgIGlmIChvdXRwdXQpIHsKICAgICAgICAgICAgICBvdXRwdXQudGV4dENvbnRlbnQgPSAiRXhwb3J0aW5nIHJldmVudWUgZGF0YSB0byBDU1YuLi4iOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBdCiAgICB9LAogICAgewogICAgICBpZDogInVzZXJzIiwKICAgICAgdGl0bGU6ICJBY3RpdmUgVXNlcnMiLAogICAgICB2YWx1ZTogMzg0NywKICAgICAgdHlwZTogIm51bWJlciIsCiAgICAgIGljb246ICJsdWNpZGU6dXNlcnMiLAogICAgICBkZXNjcmlwdGlvbjogIjMyNCBuZXcgdGhpcyB3ZWVrIiwKICAgICAgYWN0aW9uczogWwogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJWaWV3IFVzZXIgTGlzdCIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpsaXN0IiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYWN0aW9uLW91dHB1dCIpOwogICAgICAgICAgICBpZiAob3V0cHV0KSB7CiAgICAgICAgICAgICAgb3V0cHV0LnRleHRDb250ZW50ID0gIk9wZW5pbmcgdXNlciBsaXN0Li4uIjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgXQogICAgfSwKICAgIHsKICAgICAgaWQ6ICJjcHUiLAogICAgICB0aXRsZTogIkNQVSBVc2FnZSIsCiAgICAgIHZhbHVlOiA3MywKICAgICAgdW5pdDogIiUiLAogICAgICB0eXBlOiAiZ2F1Z2UiLAogICAgICBpY29uOiAibHVjaWRlOmNwdSIsCiAgICAgIGdhdWdlT3B0aW9uczogewogICAgICAgIG1pbjogMCwKICAgICAgICBtYXg6IDEwMCwKICAgICAgICB0aHJlc2hvbGRzOiBbCiAgICAgICAgICB7IHZhbHVlOiAwLCBjb2xvcjogImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSkiIH0sCiAgICAgICAgICB7IHZhbHVlOiA2MCwgY29sb3I6ICJoc2woNDUuNCA5My40JSA0Ny41JSkiIH0sCiAgICAgICAgICB7IHZhbHVlOiA4MCwgY29sb3I6ICJoc2woMCA4NC4yJSA2MC4yJSkiIH0KICAgICAgICBdCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgIGlkOiAic3RvcmFnZSIsCiAgICAgIHRpdGxlOiAiU3RvcmFnZSBVc2VkIiwKICAgICAgdmFsdWU6IDY1LAogICAgICB0eXBlOiAicGVyY2VudGFnZSIsCiAgICAgIGljb246ICJsdWNpZGU6aGFyZC1kcml2ZSIsCiAgICAgIGRlc2NyaXB0aW9uOiAiNjUwIEdCIG9mIDEgVEIiCiAgICB9LAogICAgewogICAgICBpZDogImxhdGVuY3kiLAogICAgICB0aXRsZTogIlJlc3BvbnNlIFRpbWUiLAogICAgICB2YWx1ZTogMTQyLAogICAgICB1bml0OiAibXMiLAogICAgICB0eXBlOiAidHJlbmQiLAogICAgICBpY29uOiAibHVjaWRlOmFjdGl2aXR5IiwKICAgICAgdHJlbmREYXRhOiBbMTUwLCAxNDUsIDE0OCwgMTQyLCAxMzgsIDE0MCwgMTM1LCAxNDUsIDE0Ml0sCiAgICAgIGRlc2NyaXB0aW9uOiAiUDk1IgogICAgfSwKICAgIHsKICAgICAgaWQ6ICJ1cHRpbWUiLAogICAgICB0aXRsZTogIlN5c3RlbSBVcHRpbWUiLAogICAgICB2YWx1ZTogIjk5Ljk1JSIsCiAgICAgIHR5cGU6ICJ0ZXh0IiwKICAgICAgaWNvbjogImx1Y2lkZTpjaGVjay1jaXJjbGUiLAogICAgICBjb2xvcjogImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSkiLAogICAgICBkZXNjcmlwdGlvbjogIkxhc3QgMzAgZGF5cyIKICAgIH0KICBdLCBbCiAgICB7CiAgICAgIG5hbWU6ICJSZWZyZXNoIiwKICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6cmVmcmVzaC1jdyIsCiAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgIGNvbnN0IGdyaWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJkZWVzLXN0YXRzZ3JpZCIpOwogICAgICAgIGlmIChncmlkKSB7CiAgICAgICAgICBncmlkLnN0eWxlLm9wYWNpdHkgPSAiMC41IjsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICBncmlkLnN0eWxlLm9wYWNpdHkgPSAiMSI7CiAgICAgICAgICB9LCAzMDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkV4cG9ydCIsCiAgICAgIGljb25OYW1lOiAibHVjaWRlOnNoYXJlIiwKICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgY29uc3Qgb3V0cHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2FjdGlvbi1vdXRwdXQiKTsKICAgICAgICBpZiAob3V0cHV0KSB7CiAgICAgICAgICBvdXRwdXQudGV4dENvbnRlbnQgPSAiRXhwb3J0aW5nIGRhc2hib2FyZCByZXBvcnQuLi4iOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIHsKICAgICAgbmFtZTogIlNldHRpbmdzIiwKICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6c2V0dGluZ3MiLAogICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICBjb25zdCBvdXRwdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYWN0aW9uLW91dHB1dCIpOwogICAgICAgIGlmIChvdXRwdXQpIHsKICAgICAgICAgIG91dHB1dC50ZXh0Q29udGVudCA9ICJPcGVuaW5nIGRhc2hib2FyZCBzZXR0aW5ncy4uLiI7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgXSwgMjUwLCAxNiwgY3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSAxNi44JSkiKSwgY3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDguOCUpIiwgImhzbCgyMTAgNDAlIDk4JSkiKSwgIjIuIFRpbGUgVHlwZXMiLCAiRGlmZmVyZW50IHZpc3VhbGl6YXRpb24gdHlwZXMgYXZhaWxhYmxlIGluIHRoZSBzdGF0cyBncmlkIiwgWwogICAgewogICAgICBpZDogIm51bWJlci1leGFtcGxlIiwKICAgICAgdGl0bGU6ICJOdW1iZXIgVGlsZSIsCiAgICAgIHZhbHVlOiA0MjE5NSwKICAgICAgdW5pdDogIiQiLAogICAgICB0eXBlOiAibnVtYmVyIiwKICAgICAgaWNvbjogImx1Y2lkZTpoYXNoIiwKICAgICAgZGVzY3JpcHRpb246ICJTaW1wbGUgbnVtZXJpYyBkaXNwbGF5IgogICAgfSwKICAgIHsKICAgICAgaWQ6ICJnYXVnZS1leGFtcGxlIiwKICAgICAgdGl0bGU6ICJHYXVnZSBUaWxlIiwKICAgICAgdmFsdWU6IDY4LAogICAgICB1bml0OiAiJSIsCiAgICAgIHR5cGU6ICJnYXVnZSIsCiAgICAgIGljb246ICJsdWNpZGU6Z2F1Z2UiLAogICAgICBnYXVnZU9wdGlvbnM6IHsKICAgICAgICBtaW46IDAsCiAgICAgICAgbWF4OiAxMDAsCiAgICAgICAgdGhyZXNob2xkczogWwogICAgICAgICAgeyB2YWx1ZTogMCwgY29sb3I6ICJoc2woMTQyLjEgNzYuMiUgMzYuMyUpIiB9LAogICAgICAgICAgeyB2YWx1ZTogNTAsIGNvbG9yOiAiaHNsKDQ1LjQgOTMuNCUgNDcuNSUpIiB9LAogICAgICAgICAgeyB2YWx1ZTogODAsIGNvbG9yOiAiaHNsKDAgODQuMiUgNjAuMiUpIiB9CiAgICAgICAgXQogICAgICB9CiAgICB9LAogICAgewogICAgICBpZDogInBlcmNlbnRhZ2UtZXhhbXBsZSIsCiAgICAgIHRpdGxlOiAiUGVyY2VudGFnZSBUaWxlIiwKICAgICAgdmFsdWU6IDc4LAogICAgICB0eXBlOiAicGVyY2VudGFnZSIsCiAgICAgIGljb246ICJsdWNpZGU6cGVyY2VudCIsCiAgICAgIGRlc2NyaXB0aW9uOiAiUHJvZ3Jlc3MgYmFyIHZpc3VhbGl6YXRpb24iCiAgICB9LAogICAgewogICAgICBpZDogInRyZW5kLWV4YW1wbGUiLAogICAgICB0aXRsZTogIlRyZW5kIFRpbGUiLAogICAgICB2YWx1ZTogODkyLAogICAgICB1bml0OiAib3BzL3MiLAogICAgICB0eXBlOiAidHJlbmQiLAogICAgICBpY29uOiAibHVjaWRlOnRyZW5kaW5nLXVwIiwKICAgICAgdHJlbmREYXRhOiBbNzIwLCA3NTAsIDc4MCwgNzk1LCA4MTAsIDgzNSwgODUwLCA4NjUsIDg4MCwgODkyXSwKICAgICAgZGVzY3JpcHRpb246ICJhdmciCiAgICB9LAogICAgewogICAgICBpZDogInRleHQtZXhhbXBsZSIsCiAgICAgIHRpdGxlOiAiVGV4dCBUaWxlIiwKICAgICAgdmFsdWU6ICJPcGVyYXRpb25hbCIsCiAgICAgIHR5cGU6ICJ0ZXh0IiwKICAgICAgaWNvbjogImx1Y2lkZTppbmZvIiwKICAgICAgY29sb3I6ICJoc2woMTQyLjEgNzYuMiUgMzYuMyUpIiwKICAgICAgZGVzY3JpcHRpb246ICJTdGF0dXMgZGlzcGxheSIKICAgIH0KICBdLCAyODAsIDE2LCAiMy4gR3JpZCBDb25maWd1cmF0aW9ucyIsICJEaWZmZXJlbnQgbGF5b3V0IG9wdGlvbnMgYW5kIHJlc3BvbnNpdmUgYmVoYXZpb3IiLCBbCiAgICB7IGlkOiAiMSIsIHRpdGxlOiAiT3JkZXJzIiwgdmFsdWU6IDE1NiwgdHlwZTogIm51bWJlciIsIGljb246ICJsdWNpZGU6c2hvcHBpbmctY2FydCIgfSwKICAgIHsgaWQ6ICIyIiwgdGl0bGU6ICJSZXZlbnVlIiwgdmFsdWU6IDg0MjAsIHVuaXQ6ICIkIiwgdHlwZTogIm51bWJlciIsIGljb246ICJsdWNpZGU6ZG9sbGFyLXNpZ24iIH0sCiAgICB7IGlkOiAiMyIsIHRpdGxlOiAiVXNlcnMiLCB2YWx1ZTogNDIzLCB0eXBlOiAibnVtYmVyIiwgaWNvbjogImx1Y2lkZTp1c2VycyIgfSwKICAgIHsgaWQ6ICI0IiwgdGl0bGU6ICJHcm93dGgiLCB2YWx1ZTogMTIuNSwgdW5pdDogIiUiLCB0eXBlOiAibnVtYmVyIiwgaWNvbjogImx1Y2lkZTp0cmVuZGluZy11cCIsIGNvbG9yOiAiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlKSIgfQogIF0sIDE4MCwgMTIsIFsKICAgIHsKICAgICAgaWQ6ICJzcGFjaW91czEiLAogICAgICB0aXRsZTogIk1vbnRobHkgUmV2ZW51ZSIsCiAgICAgIHZhbHVlOiAxODQ1MDAsCiAgICAgIHVuaXQ6ICIkIiwKICAgICAgdHlwZTogIm51bWJlciIsCiAgICAgIGljb246ICJsdWNpZGU6Y3JlZGl0LWNhcmQiLAogICAgICBkZXNjcmlwdGlvbjogIlRvdGFsIHJldmVudWUgdGhpcyBtb250aCIKICAgIH0sCiAgICB7CiAgICAgIGlkOiAic3BhY2lvdXMyIiwKICAgICAgdGl0bGU6ICJDdXN0b21lciBTYXRpc2ZhY3Rpb24iLAogICAgICB2YWx1ZTogOTQsCiAgICAgIHR5cGU6ICJwZXJjZW50YWdlIiwKICAgICAgaWNvbjogImx1Y2lkZTpzbWlsZSIsCiAgICAgIGRlc2NyaXB0aW9uOiAiQmFzZWQgb24gMSwyMzQgcmV2aWV3cyIKICAgIH0sCiAgICB7CiAgICAgIGlkOiAic3BhY2lvdXMzIiwKICAgICAgdGl0bGU6ICJTZXJ2ZXIgUmVzcG9uc2UiLAogICAgICB2YWx1ZTogOTgsCiAgICAgIHVuaXQ6ICJtcyIsCiAgICAgIHR5cGU6ICJ0cmVuZCIsCiAgICAgIGljb246ICJsdWNpZGU6c2VydmVyIiwKICAgICAgdHJlbmREYXRhOiBbMTA1LCAxMDIsIDEwMCwgOTksIDk4LCA5OCwgOTcsIDk4XSwKICAgICAgZGVzY3JpcHRpb246ICJhdmcgcmVzcG9uc2UgdGltZSIKICAgIH0KICBdLCAzMjAsIDIwLCAiNC4gQ1BVIENvcmVzIFZpc3VhbGl6YXRpb24iLCAiVmVydGljYWwgYmFyIHZpc3VhbGl6YXRpb24gZm9yIG11bHRpLWNvcmUgQ1BVIHVzYWdlIHdpdGggY29sdW1uIHNwYW5uaW5nIiwgWwogICAgewogICAgICBpZDogImNwdS1jb3Jlcy04IiwKICAgICAgdGl0bGU6ICJDUFUgQ29yZXMgKDgtY29yZSkiLAogICAgICB2YWx1ZTogMCwKICAgICAgdHlwZTogImNwdUNvcmVzIiwKICAgICAgaWNvbjogImx1Y2lkZTpjcHUiLAogICAgICBjb2x1bW5TcGFuOiAyLAogICAgICBjb3Jlc0RhdGE6IGdlbmVyYXRlQ3B1Q29yZXMoOCksCiAgICAgIGRlc2NyaXB0aW9uOiAiSW50ZWwgaTcgLSA4IGNvcmVzIgogICAgfSwKICAgIHsKICAgICAgaWQ6ICJtZW1vcnkiLAogICAgICB0aXRsZTogIk1lbW9yeSBVc2FnZSIsCiAgICAgIHZhbHVlOiA2OCwKICAgICAgdHlwZTogInBlcmNlbnRhZ2UiLAogICAgICBpY29uOiAibHVjaWRlOmRhdGFiYXNlIiwKICAgICAgZGVzY3JpcHRpb246ICIxMy42IEdCIG9mIDIwIEdCIgogICAgfSwKICAgIHsKICAgICAgaWQ6ICJjcHUtY29yZXMtMTYiLAogICAgICB0aXRsZTogIkNQVSBDb3JlcyAoMTYtY29yZSkiLAogICAgICB2YWx1ZTogMCwKICAgICAgdHlwZTogImNwdUNvcmVzIiwKICAgICAgaWNvbjogImx1Y2lkZTpjcHUiLAogICAgICBjb2x1bW5TcGFuOiAyLAogICAgICBjb3Jlc0RhdGE6IGdlbmVyYXRlQ3B1Q29yZXMoMTYpLAogICAgICBkZXNjcmlwdGlvbjogIkFNRCBSeXplbiA5IC0gMTYgY29yZXMiCiAgICB9LAogICAgewogICAgICBpZDogIm5ldHdvcmsiLAogICAgICB0aXRsZTogIk5ldHdvcmsgSS9PIiwKICAgICAgdmFsdWU6IDI0NSwKICAgICAgdW5pdDogIk1CL3MiLAogICAgICB0eXBlOiAidHJlbmQiLAogICAgICBpY29uOiAibHVjaWRlOm5ldHdvcmsiLAogICAgICB0cmVuZERhdGE6IFsyMDAsIDIyMCwgMjM1LCAyNDAsIDIzOCwgMjQ1XSwKICAgICAgZGVzY3JpcHRpb246ICJ0aHJvdWdocHV0IgogICAgfSwKICAgIHsKICAgICAgaWQ6ICJjcHUtY29yZXMtMzIiLAogICAgICB0aXRsZTogIlNlcnZlciBDUFUgKDMyLWNvcmUpIiwKICAgICAgdmFsdWU6IDAsCiAgICAgIHR5cGU6ICJjcHVDb3JlcyIsCiAgICAgIGljb246ICJsdWNpZGU6c2VydmVyIiwKICAgICAgY29sdW1uU3BhbjogMywKICAgICAgY29yZXNEYXRhOiBnZW5lcmF0ZUNwdUNvcmVzKDMyKSwKICAgICAgZGVzY3JpcHRpb246ICJBTUQgRVBZQyAtIDMyIGNvcmVzIgogICAgfSwKICAgIHsKICAgICAgaWQ6ICJkaXNrIiwKICAgICAgdGl0bGU6ICJEaXNrIFVzYWdlIiwKICAgICAgdmFsdWU6IDQyLAogICAgICB0eXBlOiAicGVyY2VudGFnZSIsCiAgICAgIGljb246ICJsdWNpZGU6aGFyZC1kcml2ZSIsCiAgICAgIGRlc2NyaXB0aW9uOiAiNDIwIEdCIG9mIDEgVEIiCiAgICB9CiAgXSwgWwogICAgewogICAgICBuYW1lOiAiUmFuZG9taXplIiwKICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6c2h1ZmZsZSIsCiAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgIGNvbnN0IGdyaWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjY3B1LWNvcmVzLWdyaWQiKTsKICAgICAgICBpZiAoIWdyaWQpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgY29uc3QgdGlsZXMgPSBncmlkLnRpbGVzLm1hcCgodGlsZSkgPT4gewogICAgICAgICAgaWYgKHRpbGUudHlwZSA9PT0gImNwdUNvcmVzIiAmJiB0aWxlLmNvcmVzRGF0YSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIC4uLnRpbGUsCiAgICAgICAgICAgICAgY29yZXNEYXRhOiB0aWxlLmNvcmVzRGF0YS5tYXAoKGNvcmUyKSA9PiAoewogICAgICAgICAgICAgICAgLi4uY29yZTIsCiAgICAgICAgICAgICAgICB1c2FnZTogTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogMTAwKQogICAgICAgICAgICAgIH0pKQogICAgICAgICAgICB9OwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRpbGU7CiAgICAgICAgfSk7CiAgICAgICAgZ3JpZC50aWxlcyA9IHRpbGVzOwogICAgICB9CiAgICB9CiAgXSwgMjUwLCAxNiwgIjUuIEludGVyYWN0aXZlIEZlYXR1cmVzIiwgIlRpbGVzIHdpdGggYWN0aW9ucyBhbmQgcmVhbC10aW1lIHVwZGF0ZXMiLCBbCiAgICB7CiAgICAgIGlkOiAibGl2ZS1jcHUiLAogICAgICB0aXRsZTogIkxpdmUgQ1BVIiwKICAgICAgdmFsdWU6IDQ1LAogICAgICB1bml0OiAiJSIsCiAgICAgIHR5cGU6ICJnYXVnZSIsCiAgICAgIGljb246ICJsdWNpZGU6Y3B1IiwKICAgICAgZ2F1Z2VPcHRpb25zOiB7CiAgICAgICAgbWluOiAwLAogICAgICAgIG1heDogMTAwLAogICAgICAgIHRocmVzaG9sZHM6IFsKICAgICAgICAgIHsgdmFsdWU6IDAsIGNvbG9yOiAiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlKSIgfSwKICAgICAgICAgIHsgdmFsdWU6IDYwLCBjb2xvcjogImhzbCg0NS40IDkzLjQlIDQ3LjUlKSIgfSwKICAgICAgICAgIHsgdmFsdWU6IDgwLCBjb2xvcjogImhzbCgwIDg0LjIlIDYwLjIlKSIgfQogICAgICAgIF0KICAgICAgfQogICAgfSwKICAgIHsKICAgICAgaWQ6ICJsaXZlLXJlcXVlc3RzIiwKICAgICAgdGl0bGU6ICJSZXF1ZXN0cy9zZWMiLAogICAgICB2YWx1ZTogODkyLAogICAgICB0eXBlOiAidHJlbmQiLAogICAgICBpY29uOiAibHVjaWRlOmFjdGl2aXR5IiwKICAgICAgdHJlbmREYXRhOiBbODUwLCA4NjAsIDg3MCwgODgwLCA4ODUsIDg5MCwgODkyXQogICAgfSwKICAgIHsKICAgICAgaWQ6ICJsaXZlLW1lbW9yeSIsCiAgICAgIHRpdGxlOiAiTWVtb3J5IFVzYWdlIiwKICAgICAgdmFsdWU6IDYyLAogICAgICB0eXBlOiAicGVyY2VudGFnZSIsCiAgICAgIGljb246ICJsdWNpZGU6ZGF0YWJhc2UiCiAgICB9LAogICAgewogICAgICBpZDogImNvdW50ZXIiLAogICAgICB0aXRsZTogIkV2ZW50IENvdW50ZXIiLAogICAgICB2YWx1ZTogMCwKICAgICAgdHlwZTogIm51bWJlciIsCiAgICAgIGljb246ICJsdWNpZGU6emFwIiwKICAgICAgYWN0aW9uczogWwogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJJbmNyZW1lbnQiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6cGx1cyIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgY29uc3QgZ3JpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNpbnRlcmFjdGl2ZS1ncmlkIik7CiAgICAgICAgICAgIGlmICghZ3JpZCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSBncmlkLnRpbGVzLmZpbmQoKHQ5KSA9PiB0OS5pZCA9PT0gImNvdW50ZXIiKTsKICAgICAgICAgICAgdGlsZS52YWx1ZSA9IHR5cGVvZiB0aWxlLnZhbHVlID09PSAibnVtYmVyIiA/IHRpbGUudmFsdWUgKyAxIDogMTsKICAgICAgICAgICAgZ3JpZC50aWxlcyA9IFsuLi5ncmlkLnRpbGVzXTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJSZXNldCIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpyb3RhdGUtY2N3IiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICBjb25zdCBncmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2ludGVyYWN0aXZlLWdyaWQiKTsKICAgICAgICAgICAgaWYgKCFncmlkKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgY29uc3QgdGlsZSA9IGdyaWQudGlsZXMuZmluZCgodDkpID0+IHQ5LmlkID09PSAiY291bnRlciIpOwogICAgICAgICAgICB0aWxlLnZhbHVlID0gMDsKICAgICAgICAgICAgZ3JpZC50aWxlcyA9IFsuLi5ncmlkLnRpbGVzXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIF0KICAgIH0KICBdLCBbCiAgICB7CiAgICAgIG5hbWU6ICJTdGFydCBMaXZlIFVwZGF0ZXMiLAogICAgICBpY29uTmFtZTogImx1Y2lkZTpwbGF5IiwKICAgICAgYWN0aW9uOiBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIXdpbmRvdy5saXZlVXBkYXRlSW50ZXJ2YWwpIHsKICAgICAgICAgIHdpbmRvdy5saXZlVXBkYXRlSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGdyaWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjaW50ZXJhY3RpdmUtZ3JpZCIpOwogICAgICAgICAgICBpZiAoZ3JpZCkgewogICAgICAgICAgICAgIGNvbnN0IHRpbGVzID0gWy4uLmdyaWQudGlsZXNdOwogICAgICAgICAgICAgIGNvbnN0IGNwdVRpbGUgPSB0aWxlcy5maW5kKCh0OSkgPT4gdDkuaWQgPT09ICJsaXZlLWNwdSIpOwogICAgICAgICAgICAgIGNwdVRpbGUudmFsdWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIGNwdVRpbGUudmFsdWUgKyAoTWF0aC5yYW5kb20oKSAqIDIwIC0gMTApKSk7CiAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdHNUaWxlID0gdGlsZXMuZmluZCgodDkpID0+IHQ5LmlkID09PSAibGl2ZS1yZXF1ZXN0cyIpOwogICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gcmVxdWVzdHNUaWxlLnZhbHVlICsgTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogNTAgLSAyNSk7CiAgICAgICAgICAgICAgcmVxdWVzdHNUaWxlLnZhbHVlID0gTWF0aC5tYXgoODAwLCBuZXdWYWx1ZSk7CiAgICAgICAgICAgICAgcmVxdWVzdHNUaWxlLnRyZW5kRGF0YSA9IFsuLi5yZXF1ZXN0c1RpbGUudHJlbmREYXRhLnNsaWNlKDEpLCByZXF1ZXN0c1RpbGUudmFsdWVdOwogICAgICAgICAgICAgIGNvbnN0IG1lbW9yeVRpbGUgPSB0aWxlcy5maW5kKCh0OSkgPT4gdDkuaWQgPT09ICJsaXZlLW1lbW9yeSIpOwogICAgICAgICAgICAgIG1lbW9yeVRpbGUudmFsdWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIG1lbW9yeVRpbGUudmFsdWUgKyAoTWF0aC5yYW5kb20oKSAqIDEwIC0gNSkpKTsKICAgICAgICAgICAgICBncmlkLnRpbGVzID0gdGlsZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIDFlMyk7CiAgICAgICAgICB0aGlzLm5hbWUgPSAiU3RvcCBMaXZlIFVwZGF0ZXMiOwogICAgICAgICAgdGhpcy5pY29uTmFtZSA9ICJsdWNpZGU6cGF1c2UiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjbGVhckludGVydmFsKHdpbmRvdy5saXZlVXBkYXRlSW50ZXJ2YWwpOwogICAgICAgICAgd2luZG93LmxpdmVVcGRhdGVJbnRlcnZhbCA9IG51bGw7CiAgICAgICAgICB0aGlzLm5hbWUgPSAiU3RhcnQgTGl2ZSBVcGRhdGVzIjsKICAgICAgICAgIHRoaXMuaWNvbk5hbWUgPSAibHVjaWRlOnBsYXkiOwogICAgICAgIH0KICAgICAgfQogICAgfQogIF0sIDI1MCwgMTYsICI2LiBDb2RlIEV4YW1wbGUiLCAiSG93IHRvIGltcGxlbWVudCBhIHN0YXRzIGdyaWQgd2l0aCBUeXBlU2NyaXB0IiwgYGNvbnN0IHRpbGVzOiBJU3RhdHNUaWxlW10gPSBbCiAgewogICAgaWQ6ICdyZXZlbnVlJywKICAgIHRpdGxlOiAnVG90YWwgUmV2ZW51ZScsCiAgICB2YWx1ZTogMTI1NDIwLAogICAgdW5pdDogJyQnLAogICAgdHlwZTogJ251bWJlcicsCiAgICBpY29uOiAnbHVjaWRlOmRvbGxhci1zaWduJywKICAgIGRlc2NyaXB0aW9uOiAnKzEyLjUlIGZyb20gbGFzdCBtb250aCcsCiAgICBhY3Rpb25zOiBbCiAgICAgIHsKICAgICAgICBuYW1lOiAnVmlldyBEZXRhaWxzJywKICAgICAgICBpY29uTmFtZTogJ2x1Y2lkZTp0cmVuZGluZy11cCcsCiAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICBjb25zb2xlLmxvZygnVmlldyByZXZlbnVlIGRldGFpbHMnKTsKICAgICAgICB9CiAgICAgIH0KICAgIF0KICB9LAogIHsKICAgIGlkOiAnY3B1JywKICAgIHRpdGxlOiAnQ1BVIFVzYWdlJywKICAgIHZhbHVlOiA3MywKICAgIHVuaXQ6ICclJywKICAgIHR5cGU6ICdnYXVnZScsCiAgICBpY29uOiAnbHVjaWRlOmNwdScsCiAgICBnYXVnZU9wdGlvbnM6IHsKICAgICAgbWluOiAwLAogICAgICBtYXg6IDEwMCwKICAgICAgdGhyZXNob2xkczogWwogICAgICAgIHsgdmFsdWU6IDAsIGNvbG9yOiAnaHNsKDE0Mi4xIDc2LjIlIDM2LjMlKScgfSwKICAgICAgICB7IHZhbHVlOiA2MCwgY29sb3I6ICdoc2woNDUuNCA5My40JSA0Ny41JSknIH0sCiAgICAgICAgeyB2YWx1ZTogODAsIGNvbG9yOiAnaHNsKDAgODQuMiUgNjAuMiUpJyB9CiAgICAgIF0KICAgIH0KICB9Cl07CgovLyBSZW5kZXIgdGhlIHN0YXRzIGdyaWQKaHRtbFxgCiAgPGRlZXMtc3RhdHNncmlkCiAgICAudGlsZXM9XCR7dGlsZXN9CiAgICAubWluVGlsZVdpZHRoPVwkezI1MH0KICAgIC5nYXA9XCR7MTZ9CiAgICAuZ3JpZEFjdGlvbnM9XCR7WwogICAgICB7CiAgICAgICAgbmFtZTogJ1JlZnJlc2gnLAogICAgICAgIGljb25OYW1lOiAnbHVjaWRlOnJlZnJlc2gtY3cnLAogICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coJ1JlZnJlc2gnKQogICAgICB9CiAgICBdfQogID48L2RlZXMtc3RhdHNncmlkPgpcYDtgLCAiNy4gRGlzayAmIFN0b3JhZ2UgVGlsZXMiLCAiUGFydGl0aW9uIGFuZCBwaHlzaWNhbCBkaXNrIHZpc3VhbGl6YXRpb24gdGlsZXMiLCBbCiAgICB7CiAgICAgIGlkOiAicm9vdC1wYXJ0aXRpb24iLAogICAgICB0aXRsZTogIlJvb3QgUGFydGl0aW9uIiwKICAgICAgdmFsdWU6IDAsCiAgICAgIHR5cGU6ICJwYXJ0aXRpb24iLAogICAgICBpY29uOiAibHVjaWRlOmZvbGRlci1yb290IiwKICAgICAgcGFydGl0aW9uRGF0YTogewogICAgICAgIHVzZWQ6IDY5ODM0MTQyNTE1MiwKICAgICAgICAvLyB+NjUwIEdCCiAgICAgICAgdG90YWw6IDEwNzM3NDE4MjRlMywKICAgICAgICAvLyB+MSBUQgogICAgICAgIGZpbGVzeXN0ZW06ICJleHQ0IiwKICAgICAgICBtb3VudFBvaW50OiAiLyIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgaWQ6ICJob21lLXBhcnRpdGlvbiIsCiAgICAgIHRpdGxlOiAiSG9tZSBQYXJ0aXRpb24iLAogICAgICB2YWx1ZTogMCwKICAgICAgdHlwZTogInBhcnRpdGlvbiIsCiAgICAgIGljb246ICJsdWNpZGU6aG9tZSIsCiAgICAgIHBhcnRpdGlvbkRhdGE6IHsKICAgICAgICB1c2VkOiAyMTQ3NDgzNjQ4MDAsCiAgICAgICAgLy8gfjIwMCBHQgogICAgICAgIHRvdGFsOiA1MzY4NzA5MTJlMywKICAgICAgICAvLyB+NTAwIEdCCiAgICAgICAgZmlsZXN5c3RlbTogImV4dDQiLAogICAgICAgIG1vdW50UG9pbnQ6ICIvaG9tZSIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgaWQ6ICJkYXRhLXBhcnRpdGlvbiIsCiAgICAgIHRpdGxlOiAiRGF0YSBQYXJ0aXRpb24iLAogICAgICB2YWx1ZTogMCwKICAgICAgdHlwZTogInBhcnRpdGlvbiIsCiAgICAgIGljb246ICJsdWNpZGU6ZGF0YWJhc2UiLAogICAgICBwYXJ0aXRpb25EYXRhOiB7CiAgICAgICAgdXNlZDogMTkzMjczNTI4MzIwMCwKICAgICAgICAvLyB+MS44IFRCICg5MCUgLSBjcml0aWNhbCkKICAgICAgICB0b3RhbDogMjE0NzQ4MzY0OGUzLAogICAgICAgIC8vIH4yIFRCCiAgICAgICAgZmlsZXN5c3RlbTogInhmcyIsCiAgICAgICAgbW91bnRQb2ludDogIi9kYXRhIgogICAgICB9CiAgICB9LAogICAgewogICAgICBpZDogIm52bWUtc3NkIiwKICAgICAgdGl0bGU6ICJQcmltYXJ5IE5WTWUiLAogICAgICB2YWx1ZTogMCwKICAgICAgdHlwZTogImRpc2siLAogICAgICBpY29uOiAibHVjaWRlOmhhcmQtZHJpdmUiLAogICAgICBjb2x1bW5TcGFuOiAyLAogICAgICBkaXNrRGF0YTogewogICAgICAgIGNhcGFjaXR5OiAyZTEyLAogICAgICAgIC8vIDIgVEIKICAgICAgICBtb2RlbDogIlNhbXN1bmcgOTkwIFBybyIsCiAgICAgICAgdHlwZTogIm52bWUiLAogICAgICAgIGlvcHM6IHsKICAgICAgICAgIHJlYWQ6IDc0NTAsCiAgICAgICAgICB3cml0ZTogNjkwMAogICAgICAgIH0sCiAgICAgICAgaGVhbHRoOiA5OAogICAgICB9CiAgICB9LAogICAgewogICAgICBpZDogInNhdGEtc3NkIiwKICAgICAgdGl0bGU6ICJTZWNvbmRhcnkgU1NEIiwKICAgICAgdmFsdWU6IDAsCiAgICAgIHR5cGU6ICJkaXNrIiwKICAgICAgaWNvbjogImx1Y2lkZTpoYXJkLWRyaXZlIiwKICAgICAgZGlza0RhdGE6IHsKICAgICAgICBjYXBhY2l0eTogMWUxMiwKICAgICAgICAvLyAxIFRCCiAgICAgICAgbW9kZWw6ICJDcnVjaWFsIE1YNTAwIiwKICAgICAgICB0eXBlOiAic3NkIiwKICAgICAgICBpb3BzOiB7CiAgICAgICAgICByZWFkOiA1NjAsCiAgICAgICAgICB3cml0ZTogNTEwCiAgICAgICAgfSwKICAgICAgICBoZWFsdGg6IDg1CiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgIGlkOiAiaGRkLXN0b3JhZ2UiLAogICAgICB0aXRsZTogIkJhY2t1cCBIREQiLAogICAgICB2YWx1ZTogMCwKICAgICAgdHlwZTogImRpc2siLAogICAgICBpY29uOiAibHVjaWRlOmFyY2hpdmUiLAogICAgICBkaXNrRGF0YTogewogICAgICAgIGNhcGFjaXR5OiA4ZTEyLAogICAgICAgIC8vIDggVEIKICAgICAgICBtb2RlbDogIlNlYWdhdGUgSXJvbldvbGYiLAogICAgICAgIHR5cGU6ICJoZGQiLAogICAgICAgIGlvcHM6IHsKICAgICAgICAgIHJlYWQ6IDIxMCwKICAgICAgICAgIHdyaXRlOiAxOTUKICAgICAgICB9LAogICAgICAgIGhlYWx0aDogNDIKICAgICAgfQogICAgfQogIF0sIDI4MCwgMTYpOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtYmFzZS9kZWVzLWlucHV0LWJhc2UuanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF9kaXN0X3RzMjUoKTsKdmFyIF9fZXNEZWNvcmF0ZTEzID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMxNCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0lucHV0QmFzZSA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9sYXlvdXRNb2RlX2RlY29yYXRvcnM7CiAgbGV0IF9sYXlvdXRNb2RlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGF5b3V0TW9kZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGFiZWxQb3NpdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfbGFiZWxQb3NpdGlvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xhYmVsUG9zaXRpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2tleV9kZWNvcmF0b3JzOwogIGxldCBfa2V5X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfa2V5X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sYWJlbF9kZWNvcmF0b3JzOwogIGxldCBfbGFiZWxfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sYWJlbF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVxdWlyZWRfZGVjb3JhdG9yczsKICBsZXQgX3JlcXVpcmVkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVxdWlyZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Rpc2FibGVkX2RlY29yYXRvcnM7CiAgbGV0IF9kaXNhYmxlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Rpc2FibGVkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kZXNjcmlwdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfZGVzY3JpcHRpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kZXNjcmlwdGlvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHJldHVybiBjbGFzcyBEZWVzSW5wdXRCYXNlIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9sYXlvdXRNb2RlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfbGFiZWxQb3NpdGlvbl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2tleV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2xhYmVsX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfcmVxdWlyZWRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfZGlzYWJsZWRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfZGVzY3JpcHRpb25fZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTEzKHRoaXMsIG51bGwsIF9sYXlvdXRNb2RlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxheW91dE1vZGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImxheW91dE1vZGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubGF5b3V0TW9kZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubGF5b3V0TW9kZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9sYXlvdXRNb2RlX2luaXRpYWxpemVycywgX2xheW91dE1vZGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxMyh0aGlzLCBudWxsLCBfbGFiZWxQb3NpdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsYWJlbFBvc2l0aW9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsYWJlbFBvc2l0aW9uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmxhYmVsUG9zaXRpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxhYmVsUG9zaXRpb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbGFiZWxQb3NpdGlvbl9pbml0aWFsaXplcnMsIF9sYWJlbFBvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTModGhpcywgbnVsbCwgX2tleV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJrZXkiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImtleSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5rZXksIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmtleSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9rZXlfaW5pdGlhbGl6ZXJzLCBfa2V5X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTModGhpcywgbnVsbCwgX2xhYmVsX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxhYmVsIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsYWJlbCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sYWJlbCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubGFiZWwgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbGFiZWxfaW5pdGlhbGl6ZXJzLCBfbGFiZWxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxMyh0aGlzLCBudWxsLCBfcmVxdWlyZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicmVxdWlyZWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInJlcXVpcmVkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJlcXVpcmVkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yZXF1aXJlZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9yZXF1aXJlZF9pbml0aWFsaXplcnMsIF9yZXF1aXJlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTEzKHRoaXMsIG51bGwsIF9kaXNhYmxlZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkaXNhYmxlZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZGlzYWJsZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZGlzYWJsZWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmRpc2FibGVkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Rpc2FibGVkX2luaXRpYWxpemVycywgX2Rpc2FibGVkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTModGhpcywgbnVsbCwgX2Rlc2NyaXB0aW9uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImRlc2NyaXB0aW9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkZXNjcmlwdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5kZXNjcmlwdGlvbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZGVzY3JpcHRpb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZGVzY3JpcHRpb25faW5pdGlhbGl6ZXJzLCBfZGVzY3JpcHRpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAjbGF5b3V0TW9kZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMxNCh0aGlzLCBfbGF5b3V0TW9kZV9pbml0aWFsaXplcnMsICJhdXRvIik7CiAgICAvKioKICAgICAqIExheW91dCBtb2RlIGZvciB0aGUgaW5wdXQgY29tcG9uZW50CiAgICAgKiAtIHZlcnRpY2FsOiBUcmFkaXRpb25hbCBmb3JtIGxheW91dCAobGFiZWwgb24gdG9wKQogICAgICogLSBob3Jpem9udGFsOiBJbmxpbmUgbGF5b3V0IChsYWJlbCBwb3NpdGlvbiBjb25maWd1cmFibGUpCiAgICAgKiAtIGF1dG86IERldGVjdCBmcm9tIHBhcmVudCBjb250ZXh0CiAgICAgKi8KICAgIGdldCBsYXlvdXRNb2RlKCkgewogICAgICByZXR1cm4gdGhpcy4jbGF5b3V0TW9kZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxheW91dE1vZGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2xheW91dE1vZGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsYWJlbFBvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxNCh0aGlzLCBfbGF5b3V0TW9kZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTQodGhpcywgX2xhYmVsUG9zaXRpb25faW5pdGlhbGl6ZXJzLCAidG9wIikpOwogICAgLyoqCiAgICAgKiBQb3NpdGlvbiBvZiB0aGUgbGFiZWwgcmVsYXRpdmUgdG8gdGhlIGlucHV0CiAgICAgKi8KICAgIGdldCBsYWJlbFBvc2l0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy4jbGFiZWxQb3NpdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxhYmVsUG9zaXRpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI2xhYmVsUG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNrZXlfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE0KHRoaXMsIF9sYWJlbFBvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNCh0aGlzLCBfa2V5X2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICAvKioKICAgICAqIENvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgaW5wdXRzCiAgICAgKi8KICAgIGdldCBrZXkoKSB7CiAgICAgIHJldHVybiB0aGlzLiNrZXlfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBrZXkodmFsdWUyKSB7CiAgICAgIHRoaXMuI2tleV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2xhYmVsX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxNCh0aGlzLCBfa2V5X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNCh0aGlzLCBfbGFiZWxfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBsYWJlbCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xhYmVsX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbGFiZWwodmFsdWUyKSB7CiAgICAgIHRoaXMuI2xhYmVsX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcmVxdWlyZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE0KHRoaXMsIF9sYWJlbF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTQodGhpcywgX3JlcXVpcmVkX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCByZXF1aXJlZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3JlcXVpcmVkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcmVxdWlyZWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3JlcXVpcmVkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZGlzYWJsZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE0KHRoaXMsIF9yZXF1aXJlZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTQodGhpcywgX2Rpc2FibGVkX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBkaXNhYmxlZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2Rpc2FibGVkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZGlzYWJsZWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2Rpc2FibGVkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZGVzY3JpcHRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE0KHRoaXMsIF9kaXNhYmxlZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTQodGhpcywgX2Rlc2NyaXB0aW9uX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgZGVzY3JpcHRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNkZXNjcmlwdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGRlc2NyaXB0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNkZXNjcmlwdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgLyoqCiAgICAgKiBDb21tb24gc3R5bGVzIGZvciBhbGwgaW5wdXQgY29tcG9uZW50cwogICAgICovCiAgICBzdGF0aWMgZ2V0IGJhc2VTdHlsZXMoKSB7CiAgICAgIHJldHVybiBbCiAgICAgICAgaWAKICAgICAgICAvKiBDU1MgVmFyaWFibGVzIGZvciBjb25zaXN0ZW50IHNwYWNpbmcgKi8KICAgICAgICA6aG9zdCB7CiAgICAgICAgICAtLWRlZXMtaW5wdXQtc3BhY2luZy11bml0OiA4cHg7CiAgICAgICAgICAtLWRlZXMtaW5wdXQtdmVydGljYWwtZ2FwOiBjYWxjKHZhcigtLWRlZXMtaW5wdXQtc3BhY2luZy11bml0KSAqIDIpOyAvKiAxNnB4ICovCiAgICAgICAgICAtLWRlZXMtaW5wdXQtaG9yaXpvbnRhbC1nYXA6IGNhbGModmFyKC0tZGVlcy1pbnB1dC1zcGFjaW5nLXVuaXQpICogMik7IC8qIDE2cHggKi8KICAgICAgICAgIC0tZGVlcy1pbnB1dC1sYWJlbC1nYXA6IHZhcigtLWRlZXMtaW5wdXQtc3BhY2luZy11bml0KTsgLyogOHB4ICovCiAgICAgICAgfQoKICAgICAgICAvKiBEZWZhdWx0IHZlcnRpY2FsIHN0YWNraW5nIG1vZGUgKGZvciBmb3JtcykgKi8KICAgICAgICA6aG9zdCB7CiAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgIG1hcmdpbjogMDsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IHZhcigtLWRlZXMtaW5wdXQtdmVydGljYWwtZ2FwKTsKICAgICAgICB9CgogICAgICAgIC8qIExhc3QgY2hpbGQgaW4gY29udGFpbmVyIHNob3VsZCBoYXZlIG5vIGJvdHRvbSBtYXJnaW4gKi8KICAgICAgICA6aG9zdCg6bGFzdC1jaGlsZCkgewogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgICB9CgogICAgICAgIC8qIEhvcml6b250YWwgbGF5b3V0IG1vZGUgLSBhY3RpdmF0ZWQgYnkgYXR0cmlidXRlICovCiAgICAgICAgOmhvc3QoW2xheW91dC1tb2RlPSJob3Jpem9udGFsIl0pIHsKICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgIG1hcmdpbjogMDsKICAgICAgICAgIG1hcmdpbi1yaWdodDogdmFyKC0tZGVlcy1pbnB1dC1ob3Jpem9udGFsLWdhcCk7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoW2xheW91dC1tb2RlPSJob3Jpem9udGFsIl06bGFzdC1jaGlsZCkgewogICAgICAgICAgbWFyZ2luLXJpZ2h0OiAwOwogICAgICAgIH0KCiAgICAgICAgLyogQXV0byBtb2RlIC0gaW5oZXJpdCBmcm9tIHBhcmVudCBkZWVzLWZvcm0gaWYgcHJlc2VudCAqLwoKICAgICAgICAvKiBMYWJlbCBwb3NpdGlvbiB2YXJpYXRpb25zICovCiAgICAgICAgOmhvc3QoW2xhYmVsLXBvc2l0aW9uPSJsZWZ0Il0pIC5pbnB1dC13cmFwcGVyIHsKICAgICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gMWZyOwogICAgICAgICAgZ2FwOiB2YXIoLS1kZWVzLWlucHV0LWxhYmVsLWdhcCk7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoW2xhYmVsLXBvc2l0aW9uPSJyaWdodCJdKSAuaW5wdXQtd3JhcHBlciB7CiAgICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgYXV0bzsKICAgICAgICAgIGdhcDogdmFyKC0tZGVlcy1pbnB1dC1sYWJlbC1nYXApOwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICB9CgogICAgICAgIDpob3N0KFtsYWJlbC1wb3NpdGlvbj0idG9wIl0pIC5pbnB1dC13cmFwcGVyIHsKICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoW2xhYmVsLXBvc2l0aW9uPSJub25lIl0pIGRlZXMtbGFiZWwgewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIGAKICAgICAgXTsKICAgIH0KICAgIC8qKgogICAgICogU3ViamVjdCBmb3IgdmFsdWUgY2hhbmdlcyB0aGF0IGFsbCBpbnB1dHMgc2hvdWxkIGltcGxlbWVudAogICAgICovCiAgICBjaGFuZ2VTdWJqZWN0ID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTQodGhpcywgX2Rlc2NyaXB0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgbmV3IGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cy5zbWFydHJ4LnJ4anMuU3ViamVjdCgpKTsKICAgIC8qKgogICAgICogQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHRvIHRoZSBET00KICAgICAqIFNldHMgdXAgbGF5b3V0IG1vZGUgZGV0ZWN0aW9uCiAgICAgKi8KICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLmRldGVjdExheW91dE1vZGUoKTsKICAgIH0KICAgIC8qKgogICAgICogRGV0ZWN0cyB0aGUgYXBwcm9wcmlhdGUgbGF5b3V0IG1vZGUgYmFzZWQgb24gcGFyZW50IGNvbnRleHQKICAgICAqLwogICAgZGV0ZWN0TGF5b3V0TW9kZSgpIHsKICAgICAgaWYgKHRoaXMubGF5b3V0TW9kZSAhPT0gImF1dG8iKSB7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoImxheW91dC1tb2RlIiwgdGhpcy5sYXlvdXRNb2RlKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgcGFyZW50Rm9ybSA9IHRoaXMuY2xvc2VzdCgiZGVlcy1mb3JtIik7CiAgICAgIGlmIChwYXJlbnRGb3JtICYmIHBhcmVudEZvcm0uaGFzQXR0cmlidXRlKCJob3Jpem9udGFsLWxheW91dCIpKSB7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoImxheW91dC1tb2RlIiwgImhvcml6b250YWwiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgibGF5b3V0LW1vZGUiLCAidmVydGljYWwiKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGVzIHRoZSBsYXlvdXQgbW9kZSBhdHRyaWJ1dGUgd2hlbiBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgKi8KICAgIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoImxheW91dE1vZGUiKSkgewogICAgICAgIHRoaXMuZGV0ZWN0TGF5b3V0TW9kZSgpOwogICAgICB9CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoImxhYmVsUG9zaXRpb24iKSkgewogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJsYWJlbC1wb3NpdGlvbiIsIHRoaXMubGFiZWxQb3NpdGlvbik7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU3RhbmRhcmQgbWV0aG9kIGZvciBmcmVlemluZyBpbnB1dCAoZGlzYWJsaW5nKQogICAgICovCiAgICBhc3luYyBmcmVlemUoKSB7CiAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBTdGFuZGFyZCBtZXRob2QgZm9yIHVuZnJlZXppbmcgaW5wdXQgKGVuYWJsaW5nKQogICAgICovCiAgICBhc3luYyB1bmZyZWV6ZSgpIHsKICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlOwogICAgfQogIH07Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1jaGVja2JveC9kZWVzLWlucHV0LWNoZWNrYm94LmRlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW9GdW5jOCA9ICgpID0+IGIyYAogIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgY2hlY2tib3hlcyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1pbnB1dC1jaGVja2JveCIpOwogIGNvbnN0IHNlbGVjdEFsbEJ0biA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiI3NlbGVjdC1hbGwtYnRuIik7CiAgY29uc3QgY2xlYXJBbGxCdG4gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoIiNjbGVhci1hbGwtYnRuIik7CiAgaWYgKHNlbGVjdEFsbEJ0biAmJiBjbGVhckFsbEJ0bikgewogICAgc2VsZWN0QWxsQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgICBjaGVja2JveGVzLmZvckVhY2goKGNoZWNrYm94KSA9PiB7CiAgICAgICAgaWYgKCFjaGVja2JveC5kaXNhYmxlZCAmJiBjaGVja2JveC5rZXk/LnN0YXJ0c1dpdGgoImZlYXR1cmUiKSkgewogICAgICAgICAgY2hlY2tib3gudmFsdWUgPSB0cnVlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICAgIGNsZWFyQWxsQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgICBjaGVja2JveGVzLmZvckVhY2goKGNoZWNrYm94KSA9PiB7CiAgICAgICAgaWYgKCFjaGVja2JveC5kaXNhYmxlZCAmJiBjaGVja2JveC5rZXk/LnN0YXJ0c1dpdGgoImZlYXR1cmUiKSkgewogICAgICAgICAgY2hlY2tib3gudmFsdWUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfQp9fT4KICAgIDxzdHlsZT4KICAgICAgJHtpYAogICAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMjRweDsKICAgICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgICBtYXgtd2lkdGg6IDEyMDBweDsKICAgICAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBkZWVzLXBhbmVsIHsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGRlZXMtcGFuZWw6bGFzdC1jaGlsZCB7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuY2hlY2tib3gtZ3JvdXAgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICBnYXA6IDEycHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5ob3Jpem9udGFsLWNoZWNrYm94ZXMgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGdhcDogMjRweDsKICAgICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmludGVyYWN0aXZlLXNlY3Rpb24gewogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMjE1IDIwLjIlIDE2LjglKSIpfTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAub3V0cHV0LXRleHQgewogICAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSAyNi43JSkiLCAiaHNsKDIxMCA0MCUgODAlKSIpfTsKICAgICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5OCUpIiwgImhzbCgyMTUgMjAuMiUgMTEuOCUpIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgbWluLWhlaWdodDogMjRweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmZvcm0tc2VjdGlvbiB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTclKSIsICJoc2woMCAwJSA3JSkiKX07CiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuYnV0dG9uLWdyb3VwIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBnYXA6IDhweDsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5mZWF0dXJlLWxpc3QgewogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMjE1IDIwLjIlIDExLjglKSIpfTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgOTEuNCUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnNlY3Rpb24tdGl0bGUgewogICAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgOC44JSkiLCAiaHNsKDIxMCA0MCUgOTglKSIpfTsKICAgICAgICB9CiAgICAgIGB9CiAgICA8L3N0eWxlPgogICAgCiAgICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJCYXNpYyBDaGVja2JveGVzIn0gLnN1YnRpdGxlPSR7IlNpbXBsZSBjaGVja2JveCBleGFtcGxlcyB3aXRoIHZhcmlvdXMgbGFiZWxzIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iY2hlY2tib3gtZ3JvdXAiPgogICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3ggCiAgICAgICAgICAgIC5sYWJlbD0keyJJIGFncmVlIHRvIHRoZSBUZXJtcyBhbmQgQ29uZGl0aW9ucyJ9IAogICAgICAgICAgICAudmFsdWU9JHt0cnVlfQogICAgICAgICAgICAua2V5PSR7InRlcm1zIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IAogICAgICAgICAgICAubGFiZWw9JHsiU3Vic2NyaWJlIHRvIG5ld3NsZXR0ZXIifSAKICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgIC5rZXk9JHsibmV3c2xldHRlciJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCAKICAgICAgICAgICAgLmxhYmVsPSR7IkVuYWJsZSBub3RpZmljYXRpb25zIn0gCiAgICAgICAgICAgIC52YWx1ZT0ke2ZhbHNlfQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiUmVjZWl2ZSBlbWFpbCB1cGRhdGVzIGFib3V0IHlvdXIgYWNjb3VudCJ9CiAgICAgICAgICAgIC5rZXk9JHsibm90aWZpY2F0aW9ucyJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiQ2hlY2tib3ggU3RhdGVzIn0gLnN1YnRpdGxlPSR7IkRpZmZlcmVudCBjaGVja2JveCBzdGF0ZXMgYW5kIGNvbmZpZ3VyYXRpb25zIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iY2hlY2tib3gtZ3JvdXAiPgogICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3ggCiAgICAgICAgICAgIC5sYWJlbD0keyJEZWZhdWx0IHN0YXRlIn0gCiAgICAgICAgICAgIC52YWx1ZT0ke2ZhbHNlfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3ggCiAgICAgICAgICAgIC5sYWJlbD0keyJDaGVja2VkIHN0YXRlIn0gCiAgICAgICAgICAgIC52YWx1ZT0ke3RydWV9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCAKICAgICAgICAgICAgLmxhYmVsPSR7IkRpc2FibGVkIHVuY2hlY2tlZCJ9IAogICAgICAgICAgICAudmFsdWU9JHtmYWxzZX0KICAgICAgICAgICAgLmRpc2FibGVkPSR7dHJ1ZX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IAogICAgICAgICAgICAubGFiZWw9JHsiRGlzYWJsZWQgY2hlY2tlZCJ9IAogICAgICAgICAgICAudmFsdWU9JHt0cnVlfQogICAgICAgICAgICAuZGlzYWJsZWQ9JHt0cnVlfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3ggCiAgICAgICAgICAgIC5sYWJlbD0keyJSZXF1aXJlZCBjaGVja2JveCJ9IAogICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAua2V5PSR7InJlcXVpcmVkIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJIb3Jpem9udGFsIExheW91dCJ9IC5zdWJ0aXRsZT0keyJDaGVja2JveGVzIGFycmFuZ2VkIGhvcml6b250YWxseSBmb3IgY29tcGFjdCBmb3JtcyJ9PgogICAgICAgIDxkaXYgY2xhc3M9Imhvcml6b250YWwtY2hlY2tib3hlcyI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCAKICAgICAgICAgICAgLmxhYmVsPSR7Ik9wdGlvbiBBIn0gCiAgICAgICAgICAgIC52YWx1ZT0ke2ZhbHNlfQogICAgICAgICAgICAubGF5b3V0TW9kZT0keyJob3Jpem9udGFsIn0KICAgICAgICAgICAgLmtleT0keyJvcHRpb25BIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IAogICAgICAgICAgICAubGFiZWw9JHsiT3B0aW9uIEIifSAKICAgICAgICAgICAgLnZhbHVlPSR7dHJ1ZX0KICAgICAgICAgICAgLmxheW91dE1vZGU9JHsiaG9yaXpvbnRhbCJ9CiAgICAgICAgICAgIC5rZXk9JHsib3B0aW9uQiJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCAKICAgICAgICAgICAgLmxhYmVsPSR7Ik9wdGlvbiBDIn0gCiAgICAgICAgICAgIC52YWx1ZT0ke2ZhbHNlfQogICAgICAgICAgICAubGF5b3V0TW9kZT0keyJob3Jpem9udGFsIn0KICAgICAgICAgICAgLmtleT0keyJvcHRpb25DIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IAogICAgICAgICAgICAubGFiZWw9JHsiT3B0aW9uIEQifSAKICAgICAgICAgICAgLnZhbHVlPSR7dHJ1ZX0KICAgICAgICAgICAgLmxheW91dE1vZGU9JHsiaG9yaXpvbnRhbCJ9CiAgICAgICAgICAgIC5rZXk9JHsib3B0aW9uRCJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiRmVhdHVyZSBTZWxlY3Rpb24gRXhhbXBsZSJ9IC5zdWJ0aXRsZT0keyJDb21tb24gdXNlIGNhc2UgZm9yIGZlYXR1cmUgdG9nZ2xlcyB3aXRoIGJhdGNoIG9wZXJhdGlvbnMifT4KICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JvdXAiPgogICAgICAgICAgPGRlZXMtYnV0dG9uIGlkPSJzZWxlY3QtYWxsLWJ0biIgdHlwZT0ic2Vjb25kYXJ5Ij5TZWxlY3QgQWxsPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBpZD0iY2xlYXItYWxsLWJ0biIgdHlwZT0ic2Vjb25kYXJ5Ij5DbGVhciBBbGw8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtbGlzdCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjaGVja2JveC1ncm91cCI+CiAgICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IAogICAgICAgICAgICAgIC5sYWJlbD0keyJEYXJrIE1vZGUgU3VwcG9ydCJ9IAogICAgICAgICAgICAgIC52YWx1ZT0ke3RydWV9CiAgICAgICAgICAgICAgLmtleT0keyJmZWF0dXJlMSJ9CiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICAgIAogICAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCAKICAgICAgICAgICAgICAubGFiZWw9JHsiRW1haWwgTm90aWZpY2F0aW9ucyJ9IAogICAgICAgICAgICAgIC52YWx1ZT0ke3RydWV9CiAgICAgICAgICAgICAgLmtleT0keyJmZWF0dXJlMiJ9CiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICAgIAogICAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCAKICAgICAgICAgICAgICAubGFiZWw9JHsiVHdvLUZhY3RvciBBdXRoZW50aWNhdGlvbiJ9IAogICAgICAgICAgICAgIC52YWx1ZT0ke2ZhbHNlfQogICAgICAgICAgICAgIC5rZXk9JHsiZmVhdHVyZTMifQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgICAgICAKICAgICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3ggCiAgICAgICAgICAgICAgLmxhYmVsPSR7IkFQSSBBY2Nlc3MifSAKICAgICAgICAgICAgICAudmFsdWU9JHt0cnVlfQogICAgICAgICAgICAgIC5rZXk9JHsiZmVhdHVyZTQifQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgICAgICAKICAgICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3ggCiAgICAgICAgICAgICAgLmxhYmVsPSR7IkFkdmFuY2VkIEFuYWx5dGljcyJ9IAogICAgICAgICAgICAgIC52YWx1ZT0ke2ZhbHNlfQogICAgICAgICAgICAgIC5rZXk9JHsiZmVhdHVyZTUifQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJQcml2YWN5IFNldHRpbmdzIEV4YW1wbGUifSAuc3VidGl0bGU9JHsiQ2hlY2tib3hlcyBpbiBhIHR5cGljYWwgZm9ybSBjb250ZXh0In0+CiAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1zZWN0aW9uIj4KICAgICAgICAgIDxoNCBjbGFzcz0ic2VjdGlvbi10aXRsZSI+UHJpdmFjeSBQcmVmZXJlbmNlczwvaDQ+CiAgICAgICAgICAKICAgICAgICAgIDxkaXYgY2xhc3M9ImNoZWNrYm94LWdyb3VwIj4KICAgICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3ggCiAgICAgICAgICAgICAgLmxhYmVsPSR7IlNoYXJlIGFuYWx5dGljcyBkYXRhIn0gCiAgICAgICAgICAgICAgLnZhbHVlPSR7dHJ1ZX0KICAgICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiSGVscCB1cyBpbXByb3ZlIGJ5IHNoYXJpbmcgYW5vbnltb3VzIHVzYWdlIGRhdGEifQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgICAgICAKICAgICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3ggCiAgICAgICAgICAgICAgLmxhYmVsPSR7IlBlcnNvbmFsaXplZCByZWNvbW1lbmRhdGlvbnMifSAKICAgICAgICAgICAgICAudmFsdWU9JHt0cnVlfQogICAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJHZXQgc3VnZ2VzdGlvbnMgYmFzZWQgb24geW91ciBhY3Rpdml0eSJ9CiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICAgIAogICAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCAKICAgICAgICAgICAgICAubGFiZWw9JHsiTWFya2V0aW5nIGNvbW11bmljYXRpb25zIn0gCiAgICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IlJlY2VpdmUgcHJvbW90aW9uYWwgZW1haWxzIGFuZCBzcGVjaWFsIG9mZmVycyJ9CiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICAgIAogICAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCAKICAgICAgICAgICAgICAubGFiZWw9JHsiVGhpcmQtcGFydHkgaW50ZWdyYXRpb25zIn0gCiAgICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IkFsbG93IGFwcHJvdmVkIHBhcnRuZXJzIHRvIGFjY2VzcyB5b3VyIGRhdGEifQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJJbnRlcmFjdGl2ZSBFeGFtcGxlIn0gLnN1YnRpdGxlPSR7IkNsaWNrIGNoZWNrYm94ZXMgdG8gc2VlIHZhbHVlIGNoYW5nZXMifT4KICAgICAgICA8ZGl2IGNsYXNzPSJjaGVja2JveC1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCAKICAgICAgICAgICAgLmxhYmVsPSR7IkZlYXR1cmUgdG9nZ2xlIn0gCiAgICAgICAgICAgIC52YWx1ZT0ke2ZhbHNlfQogICAgICAgICAgICBAY2hhbmdlU3ViamVjdD0keyhldmVudCkgPT4gewogIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNjaGVja2JveC1vdXRwdXQiKTsKICBpZiAob3V0cHV0ICYmIGV2ZW50LmRldGFpbCkgewogICAgY29uc3QgaXNDaGVja2VkID0gZXZlbnQuZGV0YWlsLmdldFZhbHVlKCk7CiAgICBvdXRwdXQudGV4dENvbnRlbnQgPSBgRmVhdHVyZSBpcyAke2lzQ2hlY2tlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCJ9YDsKICB9Cn19CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCAKICAgICAgICAgICAgLmxhYmVsPSR7IkRlYnVnIG1vZGUifSAKICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgIEBjaGFuZ2VTdWJqZWN0PSR7KGV2ZW50KSA9PiB7CiAgY29uc3Qgb3V0cHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2RlYnVnLW91dHB1dCIpOwogIGlmIChvdXRwdXQgJiYgZXZlbnQuZGV0YWlsKSB7CiAgICBjb25zdCBpc0NoZWNrZWQgPSBldmVudC5kZXRhaWwuZ2V0VmFsdWUoKTsKICAgIG91dHB1dC50ZXh0Q29udGVudCA9IGBEZWJ1ZyBtb2RlOiAke2lzQ2hlY2tlZCA/ICJPTiIgOiAiT0ZGIn1gOwogIH0KfX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0iaW50ZXJhY3RpdmUtc2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGlkPSJjaGVja2JveC1vdXRwdXQiIGNsYXNzPSJvdXRwdXQtdGV4dCI+RmVhdHVyZSBpcyBkaXNhYmxlZDwvZGl2PgogICAgICAgICAgPGRpdiBpZD0iZGVidWctb3V0cHV0IiBjbGFzcz0ib3V0cHV0LXRleHQiIHN0eWxlPSJtYXJnaW4tdG9wOiA4cHg7Ij5EZWJ1ZyBtb2RlOiBPRkY8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kaXY+CiAgPC9kZWVzLWRlbW93cmFwcGVyPgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtY2hlY2tib3gvZGVlcy1pbnB1dC1jaGVja2JveC5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGUxNCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMTUgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNJbnB1dENoZWNrYm94ID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1pbnB1dC1jaGVja2JveCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzSW5wdXRCYXNlOwogIGxldCBfdmFsdWVfZGVjb3JhdG9yczsKICBsZXQgX3ZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2luZGV0ZXJtaW5hdGVfZGVjb3JhdG9yczsKICBsZXQgX2luZGV0ZXJtaW5hdGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pbmRldGVybWluYXRlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNJbnB1dENoZWNrYm94MiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3ZhbHVlX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEJvb2xlYW4KICAgICAgfSldOwogICAgICBfaW5kZXRlcm1pbmF0ZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTE0KHRoaXMsIG51bGwsIF92YWx1ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2YWx1ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmFsdWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmFsdWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZhbHVlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZhbHVlX2luaXRpYWxpemVycywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTQodGhpcywgbnVsbCwgX2luZGV0ZXJtaW5hdGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaW5kZXRlcm1pbmF0ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaW5kZXRlcm1pbmF0ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pbmRldGVybWluYXRlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pbmRldGVybWluYXRlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2luZGV0ZXJtaW5hdGVfaW5pdGlhbGl6ZXJzLCBfaW5kZXRlcm1pbmF0ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE0KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0lucHV0Q2hlY2tib3gyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIC8vIFNUQVRJQwogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzg7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiSW5wdXQiXTsKICAgICN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMxNSh0aGlzLCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCBmYWxzZSk7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IHZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy4jdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB2YWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpbmRldGVybWluYXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxNSh0aGlzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczE1KHRoaXMsIF9pbmRldGVybWluYXRlX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpbmRldGVybWluYXRlKCkgewogICAgICByZXR1cm4gdGhpcy4jaW5kZXRlcm1pbmF0ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGluZGV0ZXJtaW5hdGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2luZGV0ZXJtaW5hdGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBfX3J1bkluaXRpYWxpemVyczE1KHRoaXMsIF9pbmRldGVybWluYXRlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgdGhpcy5sYWJlbFBvc2l0aW9uID0gInJpZ2h0IjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgLi4uRGVlc0lucHV0QmFzZS5iYXNlU3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgICAqIHsKICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgfQoKICAgICAgICA6aG9zdCB7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgICBmb250LWZhbWlseTogJHtjc3NHZWlzdEZvbnRGYW1pbHl9OwogICAgICAgIH0KCiAgICAgICAgLm1haW5jb250YWluZXIgewogICAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgICAgIGdhcDogOHB4OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICB9CgogICAgICAgIC5jaGVja2JveCB7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgICAgICB3aWR0aDogMThweDsKICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgMy45JSkiKX07CiAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICAgIG1hcmdpbi10b3A6IDFweDsKICAgICAgICB9CgogICAgICAgIC5tYWluY29udGFpbmVyOmhvdmVyIC5jaGVja2JveCB7CiAgICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA3OS44JSkiLCAiaHNsKDAgMCUgMjAuOSUpIil9OwogICAgICAgIH0KCiAgICAgICAgLmNoZWNrYm94LnNlbGVjdGVkIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgNTEuMiUpIiwgImhzbCgyMTcuMiA5MS4yJSA1OS44JSkiKX07CiAgICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgNTEuMiUpIiwgImhzbCgyMTcuMiA5MS4yJSA1OS44JSkiKX07CiAgICAgICAgfQoKICAgICAgICAuY2hlY2tib3g6Zm9jdXMtdmlzaWJsZSB7CiAgICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgM3B4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgNTEuMiUgLyAwLjEpIiwgImhzbCgyMTcuMiA5MS4yJSA1OS44JSAvIDAuMSkiKX07CiAgICAgICAgfQoKICAgICAgICAvKiBDaGVja21hcmsgdXNpbmcgTHVjaWRlIGljb24gc3R5bGUgKi8KICAgICAgICAuY2hlY2tib3ggLmNoZWNrbWFyayB7CiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICB0b3A6IDUwJTsKICAgICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMgZWFzZTsKICAgICAgICB9CgogICAgICAgIC5jaGVja2JveC5zZWxlY3RlZCAuY2hlY2ttYXJrIHsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgfQoKICAgICAgICAuY2hlY2tib3ggLmNoZWNrbWFyayBzdmcgewogICAgICAgICAgd2lkdGg6IDEycHg7CiAgICAgICAgICBoZWlnaHQ6IDEycHg7CiAgICAgICAgICBzdHJva2U6IHdoaXRlOwogICAgICAgICAgc3Ryb2tlLXdpZHRoOiAzOwogICAgICAgIH0KCiAgICAgICAgLyogRGlzYWJsZWQgc3RhdGUgKi8KICAgICAgICAubWFpbmNvbnRhaW5lci5kaXNhYmxlZCB7CiAgICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIH0KCiAgICAgICAgLmNoZWNrYm94LmRpc2FibGVkIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NS4xJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICB9CgogICAgICAgIC8qIExhYmVsICovCiAgICAgICAgLmxhYmVsLWNvbnRhaW5lciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMnB4OwogICAgICAgICAgZmxleDogMTsKICAgICAgICB9CgogICAgICAgIC5jaGVja2JveC1sYWJlbCB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDE1JSkiLCAiaHNsKDAgMCUgOTAlKSIpfTsKICAgICAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMTVzIGVhc2U7CiAgICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTsKICAgICAgICB9CgogICAgICAgIC5tYWluY29udGFpbmVyOmhvdmVyIC5jaGVja2JveC1sYWJlbCB7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICAgIH0KCiAgICAgICAgLm1haW5jb250YWluZXIuZGlzYWJsZWQ6aG92ZXIgLmNoZWNrYm94LWxhYmVsIHsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTUlKSIsICJoc2woMCAwJSA5MCUpIil9OwogICAgICAgIH0KCiAgICAgICAgLyogRGVzY3JpcHRpb24gKi8KICAgICAgICAuZGVzY3JpcHRpb24tdGV4dCB7CiAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQ1LjElKSIsICJoc2woMCAwJSA2My45JSkiKX07CiAgICAgICAgICBsaW5lLWhlaWdodDogMS41OwogICAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgICAgPGRpdiBjbGFzcz0ibWFpbmNvbnRhaW5lciAke3RoaXMuZGlzYWJsZWQgPyAiZGlzYWJsZWQiIDogIiJ9IiBAY2xpY2s9IiR7dGhpcy50b2dnbGVTZWxlY3RlZH0iPgogICAgICAgICAgPGRpdiAKICAgICAgICAgICAgY2xhc3M9ImNoZWNrYm94ICR7dGhpcy52YWx1ZSA/ICJzZWxlY3RlZCIgOiAiIn0gJHt0aGlzLmRpc2FibGVkID8gImRpc2FibGVkIiA6ICIifSIgCiAgICAgICAgICAgIHRhYmluZGV4PSIke3RoaXMuZGlzYWJsZWQgPyAiLTEiIDogIjAifSIKICAgICAgICAgICAgQGtleWRvd249IiR7dGhpcy5oYW5kbGVLZXlkb3dufSIKICAgICAgICAgID4KICAgICAgICAgICAgJHt0aGlzLnZhbHVlID8gYjJgCiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjaGVja21hcmsiPgogICAgICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTIwIDZMOSAxN0w0IDEyIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CiAgICAgICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgIGAgOiB0aGlzLmluZGV0ZXJtaW5hdGUgPyBiMmAKICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY2hlY2ttYXJrIj4KICAgICAgICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNSAxMkgxOSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgogICAgICAgICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICBgIDogYjJgYH0KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwtY29udGFpbmVyIj4KICAgICAgICAgICAgJHt0aGlzLmxhYmVsID8gYjJgPGRpdiBjbGFzcz0iY2hlY2tib3gtbGFiZWwiPiR7dGhpcy5sYWJlbH08L2Rpdj5gIDogIiJ9CiAgICAgICAgICAgICR7dGhpcy5kZXNjcmlwdGlvbiA/IGIyYDxkaXYgY2xhc3M9ImRlc2NyaXB0aW9uLXRleHQiPiR7dGhpcy5kZXNjcmlwdGlvbn08L2Rpdj5gIDogIiJ9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgdG9nZ2xlU2VsZWN0ZWQoKSB7CiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMudmFsdWUgPSAhdGhpcy52YWx1ZTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgibmV3VmFsdWUiLCB7CiAgICAgICAgZGV0YWlsOiB0aGlzLnZhbHVlLAogICAgICAgIGJ1YmJsZXM6IHRydWUKICAgICAgfSkpOwogICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgIH0KICAgIGdldFZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy52YWx1ZTsKICAgIH0KICAgIHNldFZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLnZhbHVlID0gdmFsdWUyOwogICAgfQogICAgZm9jdXMoKSB7CiAgICAgIGNvbnN0IGNoZWNrYm94RGl2ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5jaGVja2JveCIpOwogICAgICBpZiAoY2hlY2tib3hEaXYpIHsKICAgICAgICBjaGVja2JveERpdi5mb2N1cygpOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVLZXlkb3duKGV2ZW50KSB7CiAgICAgIGlmIChldmVudC5rZXkgPT09ICIgIiB8fCBldmVudC5rZXkgPT09ICJFbnRlciIpIHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMudG9nZ2xlU2VsZWN0ZWQoKTsKICAgICAgfQogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnMxNShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0lucHV0Q2hlY2tib3gyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBjb2xvcnMuanMKdmFyIGNvbG9yc19leHBvcnRzID0ge307Cl9fZXhwb3J0KGNvbG9yc19leHBvcnRzLCB7CiAgYnJpZ2h0OiAoKSA9PiBicmlnaHQsCiAgZGFyazogKCkgPT4gZGFyawp9KTsKdmFyIGRhcmsgPSB7CiAgYmx1ZTogIiMwMDUwYjkiLAogIGJsdWVBY3RpdmU6ICIjMDA2OWYyIiwKICBibHVlTXV0ZWQ6ICIjMDEyNDUyIiwKICB0ZXh0OiAiI2ZmZmZmZiIKfTsKdmFyIGJyaWdodCA9IHsKICBibHVlOiAiIzAwNTBiOSIsCiAgYmx1ZUFjdGl2ZTogIiMwMDY5ZjIiLAogIGJsdWVNdXRlZDogIiMwMDY5ZjIiLAogIHRleHQ6ICIjMzMzMzMzIgp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW92ZXJsYXkvZGVlcy1tb2RhbC9kZWVzLW1vZGFsLmRlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW9GdW5jOSA9ICgpID0+IGIyYAogIDxzdHlsZT4KICAgICR7aWAKICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMjAwcHg7CiAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgIH0KICAgICAgCiAgICAgIC5kZW1vLXNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjhmOWZhIiwgIiMxYTFhMWEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlMGUwZTAiLCAiIzMzMyIpfTsKICAgICAgfQogICAgICAKICAgICAgLmRlbW8tc2VjdGlvbiBoMyB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzMzMyIsICIjZmZmIil9OwogICAgICB9CiAgICAgIAogICAgICAuZGVtby1zZWN0aW9uIHAgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzY2NiIsICIjOTk5Iil9OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5idXR0b24tZ3JpZCB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDE1MHB4LCAxZnIpKTsKICAgICAgICBnYXA6IDE2cHg7CiAgICAgIH0KICAgIGB9CiAgPC9zdHlsZT4KICAKICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICA8aDM+SGVhZGVyIEJ1dHRvbnM8L2gzPgogICAgICA8cD5Nb2RhbHMgY2FuIGhhdmUgb3B0aW9uYWwgaGVhZGVyIGJ1dHRvbnMgZm9yIGhlbHAgYW5kIGNsb3NpbmcuPC9wPgogICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JpZCI+CiAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGljaz0keygpID0+IHsKICBEZWVzTW9kYWwuY3JlYXRlQW5kU2hvdyh7CiAgICBoZWFkaW5nOiAiV2l0aCBIZWxwIEJ1dHRvbiIsCiAgICBzaG93SGVscEJ1dHRvbjogdHJ1ZSwKICAgIG9uSGVscDogYXN5bmMgKCkgPT4gewogICAgICBjb25zdCBoZWxwTW9kYWwgPSBhd2FpdCBEZWVzTW9kYWwuY3JlYXRlQW5kU2hvdyh7CiAgICAgICAgaGVhZGluZzogIkhlbHAiLAogICAgICAgIHdpZHRoOiAic21hbGwiLAogICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICBzaG93SGVscEJ1dHRvbjogZmFsc2UsCiAgICAgICAgY29udGVudDogYjJgCiAgICAgICAgICAgICAgICAgIDxwPlRoaXMgaXMgdGhlIGhlbHAgY29udGVudCBmb3IgdGhlIG1vZGFsLjwvcD4KICAgICAgICAgICAgICAgICAgPHA+WW91IGNhbiBwcm92aWRlIGNvbnRleHQtc3BlY2lmaWMgaGVscCBoZXJlLjwvcD4KICAgICAgICAgICAgICAgIGAsCiAgICAgICAgbWVudU9wdGlvbnM6IFt7CiAgICAgICAgICBuYW1lOiAiR290IGl0IiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgICAgICB9XQogICAgICB9KTsKICAgIH0sCiAgICBjb250ZW50OiBiMmAKICAgICAgICAgICAgICA8cD5UaGlzIG1vZGFsIGhhcyBhIGhlbHAgYnV0dG9uIGluIHRoZSBoZWFkZXIuIENsaWNrIGl0IHRvIHNlZSBoZWxwIGNvbnRlbnQuPC9wPgogICAgICAgICAgICAgIDxwPlRoZSBjbG9zZSBidXR0b24gaXMgYWxzbyB2aXNpYmxlIGJ5IGRlZmF1bHQuPC9wPgogICAgICAgICAgICBgLAogICAgbWVudU9wdGlvbnM6IFt7CiAgICAgIG5hbWU6ICJPSyIsCiAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgIH1dCiAgfSk7Cn19PldpdGggSGVscCBCdXR0b248L2RlZXMtYnV0dG9uPgogICAgICAgIAogICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2s9JHsoKSA9PiB7CiAgRGVlc01vZGFsLmNyZWF0ZUFuZFNob3coewogICAgaGVhZGluZzogIk5vIENsb3NlIEJ1dHRvbiIsCiAgICBzaG93Q2xvc2VCdXR0b246IGZhbHNlLAogICAgY29udGVudDogYjJgCiAgICAgICAgICAgICAgPHA+VGhpcyBtb2RhbCBoYXMgbm8gY2xvc2UgYnV0dG9uIGluIHRoZSBoZWFkZXIuPC9wPgogICAgICAgICAgICAgIDxwPllvdSBtdXN0IHVzZSB0aGUgYWN0aW9uIGJ1dHRvbnMgb3IgY2xpY2sgb3V0c2lkZSB0byBjbG9zZSBpdC48L3A+CiAgICAgICAgICAgIGAsCiAgICBtZW51T3B0aW9uczogW3sKICAgICAgbmFtZTogIkNsb3NlIiwKICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWwpID0+IG1vZGFsLmRlc3Ryb3koKQogICAgfV0KICB9KTsKfX0+Tm8gQ2xvc2UgQnV0dG9uPC9kZWVzLWJ1dHRvbj4KICAgICAgICAKICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrPSR7KCkgPT4gewogIERlZXNNb2RhbC5jcmVhdGVBbmRTaG93KHsKICAgIGhlYWRpbmc6ICJCb3RoIEJ1dHRvbnMiLAogICAgc2hvd0hlbHBCdXR0b246IHRydWUsCiAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICBvbkhlbHA6ICgpID0+IGFsZXJ0KCJIZWxwIGNsaWNrZWQhIiksCiAgICBjb250ZW50OiBiMmAKICAgICAgICAgICAgICA8cD5UaGlzIG1vZGFsIGhhcyBib3RoIGhlbHAgYW5kIGNsb3NlIGJ1dHRvbnMuPC9wPgogICAgICAgICAgICBgLAogICAgbWVudU9wdGlvbnM6IFt7CiAgICAgIG5hbWU6ICJEb25lIiwKICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWwpID0+IG1vZGFsLmRlc3Ryb3koKQogICAgfV0KICB9KTsKfX0+Qm90aCBCdXR0b25zPC9kZWVzLWJ1dHRvbj4KICAgICAgICAKICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrPSR7KCkgPT4gewogIERlZXNNb2RhbC5jcmVhdGVBbmRTaG93KHsKICAgIGhlYWRpbmc6ICJDbGVhbiBIZWFkZXIiLAogICAgc2hvd0Nsb3NlQnV0dG9uOiBmYWxzZSwKICAgIHNob3dIZWxwQnV0dG9uOiBmYWxzZSwKICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgICAgIDxwPlRoaXMgbW9kYWwgaGFzIGEgY2xlYW4gaGVhZGVyIHdpdGggbm8gYnV0dG9ucy48L3A+CiAgICAgICAgICAgIGAsCiAgICBtZW51T3B0aW9uczogW3sKICAgICAgbmFtZTogIkNsb3NlIiwKICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWwpID0+IG1vZGFsLmRlc3Ryb3koKQogICAgfV0KICB9KTsKfX0+Q2xlYW4gSGVhZGVyPC9kZWVzLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIAogICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgPGgzPk1vZGFsIFdpZHRoIFZhcmlhdGlvbnM8L2gzPgogICAgICA8cD5Nb2RhbHMgY2FuIGhhdmUgZGlmZmVyZW50IHdpZHRoczogc21hbGwsIG1lZGl1bSwgbGFyZ2UsIGZ1bGxzY3JlZW4sIG9yIGN1c3RvbSBwaXhlbCB2YWx1ZXMuPC9wPgogICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JpZCI+CiAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGljaz0keygpID0+IHsKICBEZWVzTW9kYWwuY3JlYXRlQW5kU2hvdyh7CiAgICBoZWFkaW5nOiAiU21hbGwgTW9kYWwiLAogICAgd2lkdGg6ICJzbWFsbCIsCiAgICBjb250ZW50OiBiMmAKICAgICAgICAgICAgICA8cD5UaGlzIGlzIGEgc21hbGwgbW9kYWwgd2l0aCBhIHdpZHRoIG9mIDM4MHB4LiBQZXJmZWN0IGZvciBzaW1wbGUgY29uZmlybWF0aW9ucyBvciBicmllZiBtZXNzYWdlcy48L3A+CiAgICAgICAgICAgIGAsCiAgICBtZW51T3B0aW9uczogW3sKICAgICAgbmFtZTogIkNhbmNlbCIsCiAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgIH0sIHsKICAgICAgbmFtZTogIk9LIiwKICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWwpID0+IG1vZGFsLmRlc3Ryb3koKQogICAgfV0KICB9KTsKfX0+U21hbGwgTW9kYWw8L2RlZXMtYnV0dG9uPgogICAgICAgIAogICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2s9JHsoKSA9PiB7CiAgRGVlc01vZGFsLmNyZWF0ZUFuZFNob3coewogICAgaGVhZGluZzogIk1lZGl1bSBNb2RhbCAoRGVmYXVsdCkiLAogICAgd2lkdGg6ICJtZWRpdW0iLAogICAgY29udGVudDogYjJgCiAgICAgICAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgLmxhYmVsPSR7IlVzZXJuYW1lIn0+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IC5sYWJlbD0keyJFbWFpbCJ9IC5pbnB1dFR5cGU9JHsiZW1haWwifT48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgLmxhYmVsPSR7IlBhc3N3b3JkIn0gLmlucHV0VHlwZT0keyJwYXNzd29yZCJ9PjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgICAgIDwvZGVlcy1mb3JtPgogICAgICAgICAgICBgLAogICAgbWVudU9wdGlvbnM6IFt7CiAgICAgIG5hbWU6ICJDYW5jZWwiLAogICAgICBhY3Rpb246IGFzeW5jIChtb2RhbCkgPT4gbW9kYWwuZGVzdHJveSgpCiAgICB9LCB7CiAgICAgIG5hbWU6ICJTaWduIFVwIiwKICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWwpID0+IG1vZGFsLmRlc3Ryb3koKQogICAgfV0KICB9KTsKfX0+TWVkaXVtIE1vZGFsPC9kZWVzLWJ1dHRvbj4KICAgICAgICAKICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrPSR7KCkgPT4gewogIERlZXNNb2RhbC5jcmVhdGVBbmRTaG93KHsKICAgIGhlYWRpbmc6ICJMYXJnZSBNb2RhbCIsCiAgICB3aWR0aDogImxhcmdlIiwKICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgICAgIDxoND5XaWRlIENvbnRlbnQgQXJlYTwvaDQ+CiAgICAgICAgICAgICAgPHA+VGhpcyBsYXJnZSBtb2RhbCBpcyA4MDBweCB3aWRlIGFuZCBwZXJmZWN0IGZvciBkaXNwbGF5aW5nIG1vcmUgY29tcGxleCBjb250ZW50IGxpa2UgZm9ybXMgd2l0aCBtdWx0aXBsZSBjb2x1bW5zLCB0YWJsZXMsIG9yIGRldGFpbGVkIGluZm9ybWF0aW9uLjwvcD4KICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogMTZweDsgbWFyZ2luLXRvcDogMTZweDsiPgogICAgICAgICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAubGFiZWw9JHsiRmlyc3QgTmFtZSJ9PjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAubGFiZWw9JHsiTGFzdCBOYW1lIn0+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IC5sYWJlbD0keyJDb21wYW55In0+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IC5sYWJlbD0keyJQb3NpdGlvbiJ9PjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgLAogICAgbWVudU9wdGlvbnM6IFt7CiAgICAgIG5hbWU6ICJDYW5jZWwiLAogICAgICBhY3Rpb246IGFzeW5jIChtb2RhbCkgPT4gbW9kYWwuZGVzdHJveSgpCiAgICB9LCB7CiAgICAgIG5hbWU6ICJTYXZlIiwKICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWwpID0+IG1vZGFsLmRlc3Ryb3koKQogICAgfV0KICB9KTsKfX0+TGFyZ2UgTW9kYWw8L2RlZXMtYnV0dG9uPgogICAgICAgIAogICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2s9JHsoKSA9PiB7CiAgRGVlc01vZGFsLmNyZWF0ZUFuZFNob3coewogICAgaGVhZGluZzogIkZ1bGxzY3JlZW4gRWRpdG9yIiwKICAgIHdpZHRoOiAiZnVsbHNjcmVlbiIsCiAgICBzaG93SGVscEJ1dHRvbjogdHJ1ZSwKICAgIG9uSGVscDogYXN5bmMgKCkgPT4gewogICAgICBhbGVydCgiSW4gYSByZWFsIGFwcCwgdGhpcyB3b3VsZCBzaG93IGVkaXRvciBkb2N1bWVudGF0aW9uIik7CiAgICB9LAogICAgY29udGVudDogYjJgCiAgICAgICAgICAgICAgPGg0PkZ1bGxzY3JlZW4gRXhwZXJpZW5jZSB3aXRoIEhlYWRlciBDb250cm9sczwvaDQ+CiAgICAgICAgICAgICAgPHA+VGhpcyBtb2RhbCB0YWtlcyB1cCBhbG1vc3QgdGhlIGVudGlyZSB2aWV3cG9ydCB3aXRoIGEgMjBweCBtYXJnaW4gb24gYWxsIHNpZGVzLiBUaGUgaGVhZGVyIGJ1dHRvbnMgYXJlIHBhcnRpY3VsYXJseSB1c2VmdWwgaW4gZnVsbHNjcmVlbiBtb2RlLjwvcD4KICAgICAgICAgICAgICA8cD5UaGUgY29udGVudCBhcmVhIGNhbiBiZSBhcyB0YWxsIGFzIG5lZWRlZCBhbmQgd2lsbCBzY3JvbGwgaWYgbmVjZXNzYXJ5LjwvcD4KICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJoZWlnaHQ6IDIwMHB4OyBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YwZjBmMCIsICIjMmEyYTJhIil9OyBib3JkZXItcmFkaXVzOiA4cHg7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBtYXJnaW4tdG9wOiAxNnB4OyI+CiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOTk5IiwgIiM2NjYiKX0iPkxhcmdlIGNvbnRlbnQgYXJlYTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYCwKICAgIG1lbnVPcHRpb25zOiBbewogICAgICBuYW1lOiAiU2F2ZSIsCiAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgIH0sIHsKICAgICAgbmFtZTogIkNhbmNlbCIsCiAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgIH1dCiAgfSk7Cn19PkZ1bGxzY3JlZW4gTW9kYWw8L2RlZXMtYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgCiAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICA8aDM+Q3VzdG9tIFdpZHRoICYgQ29uc3RyYWludHM8L2gzPgogICAgICA8cD5Zb3UgY2FuIGFsc28gc2V0IGN1c3RvbSBwaXhlbCB3aWR0aHMgYW5kIG1pbi9tYXggY29uc3RyYWludHMuPC9wPgogICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JpZCI+CiAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGljaz0keygpID0+IHsKICBEZWVzTW9kYWwuY3JlYXRlQW5kU2hvdyh7CiAgICBoZWFkaW5nOiAiQ3VzdG9tIFdpZHRoICg3MDBweCkiLAogICAgd2lkdGg6IDcwMCwKICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgICAgIDxwPlRoaXMgbW9kYWwgaGFzIGEgY3VzdG9tIHdpZHRoIG9mIGV4YWN0bHkgNzAwIHBpeGVscy48L3A+CiAgICAgICAgICAgIGAsCiAgICBtZW51T3B0aW9uczogW3sKICAgICAgbmFtZTogIkNsb3NlIiwKICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWwpID0+IG1vZGFsLmRlc3Ryb3koKQogICAgfV0KICB9KTsKfX0+Q3VzdG9tIDcwMHB4PC9kZWVzLWJ1dHRvbj4KICAgICAgICAKICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrPSR7KCkgPT4gewogIERlZXNNb2RhbC5jcmVhdGVBbmRTaG93KHsKICAgIGhlYWRpbmc6ICJXaXRoIE1heCBXaWR0aCIsCiAgICB3aWR0aDogImxhcmdlIiwKICAgIG1heFdpZHRoOiA2MDAsCiAgICBjb250ZW50OiBiMmAKICAgICAgICAgICAgICA8cD5UaGlzIG1vZGFsIGlzIHNldCB0byAnbGFyZ2UnIGJ1dCBjb25zdHJhaW5lZCBieSBhIG1heFdpZHRoIG9mIDYwMHB4LjwvcD4KICAgICAgICAgICAgYCwKICAgIG1lbnVPcHRpb25zOiBbewogICAgICBuYW1lOiAiR290IGl0IiwKICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWwpID0+IG1vZGFsLmRlc3Ryb3koKQogICAgfV0KICB9KTsKfX0+TWF4IFdpZHRoIDYwMHB4PC9kZWVzLWJ1dHRvbj4KICAgICAgICAKICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrPSR7KCkgPT4gewogIERlZXNNb2RhbC5jcmVhdGVBbmRTaG93KHsKICAgIGhlYWRpbmc6ICJXaXRoIE1pbiBXaWR0aCIsCiAgICB3aWR0aDogMzAwLAogICAgbWluV2lkdGg6IDQwMCwKICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgICAgIDxwPlRoaXMgbW9kYWwgd2lkdGggaXMgc2V0IHRvIDMwMHB4IGJ1dCBoYXMgYSBtaW5XaWR0aCBvZiA0MDBweCwgc28gaXQgd2lsbCBiZSA0MDBweCB3aWRlLjwvcD4KICAgICAgICAgICAgYCwKICAgIG1lbnVPcHRpb25zOiBbewogICAgICBuYW1lOiAiT0siLAogICAgICBhY3Rpb246IGFzeW5jIChtb2RhbCkgPT4gbW9kYWwuZGVzdHJveSgpCiAgICB9XQogIH0pOwp9fT5NaW4gV2lkdGggNDAwcHg8L2RlZXMtYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgCiAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICA8aDM+QnV0dG9uIFZhcmlhdGlvbnM8L2gzPgogICAgICA8cD5Nb2RhbHMgY2FuIGhhdmUgZGlmZmVyZW50IGJ1dHRvbiBjb25maWd1cmF0aW9ucyB3aXRoIHByb3BlciBzcGFjaW5nLjwvcD4KICAgICAgPGRpdiBjbGFzcz0iYnV0dG9uLWdyaWQiPgogICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2s9JHsoKSA9PiB7CiAgRGVlc01vZGFsLmNyZWF0ZUFuZFNob3coewogICAgaGVhZGluZzogIk11bHRpcGxlIEFjdGlvbnMiLAogICAgY29udGVudDogYjJgCiAgICAgICAgICAgICAgPHA+VGhpcyBtb2RhbCBkZW1vbnN0cmF0ZXMgbXVsdGlwbGUgYnV0dG9ucyB3aXRoIHByb3BlciBzcGFjaW5nIGJldHdlZW4gdGhlbS48L3A+CiAgICAgICAgICAgIGAsCiAgICBtZW51T3B0aW9uczogW3sKICAgICAgbmFtZTogIkRlbGV0ZSIsCiAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgIH0sIHsKICAgICAgbmFtZTogIkNhbmNlbCIsCiAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgIH0sIHsKICAgICAgbmFtZTogIlNhdmUgQ2hhbmdlcyIsCiAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgIH1dCiAgfSk7Cn19PlRocmVlIEJ1dHRvbnM8L2RlZXMtYnV0dG9uPgogICAgICAgIAogICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2s9JHsoKSA9PiB7CiAgRGVlc01vZGFsLmNyZWF0ZUFuZFNob3coewogICAgaGVhZGluZzogIlNpbmdsZSBBY3Rpb24iLAogICAgY29udGVudDogYjJgCiAgICAgICAgICAgICAgPHA+U29tZXRpbWVzIHlvdSBqdXN0IG5lZWQgb25lIGJ1dHRvbi48L3A+CiAgICAgICAgICAgIGAsCiAgICBtZW51T3B0aW9uczogW3sKICAgICAgbmFtZTogIkFja25vd2xlZGdlIiwKICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWwpID0+IG1vZGFsLmRlc3Ryb3koKQogICAgfV0KICB9KTsKfX0+U2luZ2xlIEJ1dHRvbjwvZGVlcy1idXR0b24+CiAgICAgICAgCiAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGljaz0keygpID0+IHsKICBEZWVzTW9kYWwuY3JlYXRlQW5kU2hvdyh7CiAgICBoZWFkaW5nOiAiTm8gQWN0aW9ucyIsCiAgICBjb250ZW50OiBiMmAKICAgICAgICAgICAgICA8cD5UaGlzIG1vZGFsIGhhcyBubyBib3R0b20gYnV0dG9ucy4gVXNlIHRoZSBYIGJ1dHRvbiBvciBjbGljayBvdXRzaWRlIHRvIGNsb3NlLjwvcD4KICAgICAgICAgICAgICA8cCBzdHlsZT0ibWFyZ2luLXRvcDogMTZweDsgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNjY2IiwgIiM5OTkiKX07Ij5UaGlzIGlzIHVzZWZ1bCBmb3IgaW5mb3JtYXRpb25hbCBtb2RhbHMgdGhhdCBkb24ndCByZXF1aXJlIHVzZXIgYWN0aW9uLjwvcD4KICAgICAgICAgICAgYCwKICAgIG1lbnVPcHRpb25zOiBbXQogIH0pOwp9fT5ObyBCdXR0b25zPC9kZWVzLWJ1dHRvbj4KICAgICAgICAKICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrPSR7KCkgPT4gewogIERlZXNNb2RhbC5jcmVhdGVBbmRTaG93KHsKICAgIGhlYWRpbmc6ICJMb25nIEJ1dHRvbiBMYWJlbHMiLAogICAgY29udGVudDogYjJgCiAgICAgICAgICAgICAgPHA+VGVzdGluZyBidXR0b24gbGF5b3V0IHdpdGggbG9uZ2VyIGxhYmVscy48L3A+CiAgICAgICAgICAgIGAsCiAgICBtZW51T3B0aW9uczogW3sKICAgICAgbmFtZTogIkRpc2NhcmQgQWxsIENoYW5nZXMiLAogICAgICBhY3Rpb246IGFzeW5jIChtb2RhbCkgPT4gbW9kYWwuZGVzdHJveSgpCiAgICB9LCB7CiAgICAgIG5hbWU6ICJTYXZlIGFuZCBDb250aW51ZSBFZGl0aW5nIiwKICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWwpID0+IG1vZGFsLmRlc3Ryb3koKQogICAgfV0KICB9KTsKfX0+TG9uZyBMYWJlbHM8L2RlZXMtYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgCiAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICA8aDM+UmVzcG9uc2l2ZSBCZWhhdmlvcjwvaDM+CiAgICAgIDxwPkFsbCBtb2RhbHMgYXV0b21hdGljYWxseSBiZWNvbWUgZnVsbC13aWR0aCBvbiBtb2JpbGUgZGV2aWNlcyAoPCA3NjhweCB2aWV3cG9ydCB3aWR0aCkgZm9yIGJldHRlciB1c2FiaWxpdHkuPC9wPgogICAgICA8ZGVlcy1idXR0b24gQGNsaWNrPSR7KCkgPT4gewogIERlZXNNb2RhbC5jcmVhdGVBbmRTaG93KHsKICAgIGhlYWRpbmc6ICJSZXNwb25zaXZlIE1vZGFsIiwKICAgIHdpZHRoOiAibGFyZ2UiLAogICAgc2hvd0hlbHBCdXR0b246IHRydWUsCiAgICBvbkhlbHA6ICgpID0+IGNvbnNvbGUubG9nKCJIZWxwIHJlcXVlc3RlZCBmb3IgcmVzcG9uc2l2ZSBtb2RhbCIpLAogICAgY29udGVudDogYjJgCiAgICAgICAgICAgIDxwPlJlc2l6ZSB5b3VyIGJyb3dzZXIgd2luZG93IHRvIHNlZSBob3cgdGhpcyBtb2RhbCBhZGFwdHMuIE9uIG1vYmlsZSB2aWV3cG9ydHMsIGl0IHdpbGwgYXV0b21hdGljYWxseSB0YWtlIHRoZSBmdWxsIHdpZHRoIG1pbnVzIG1hcmdpbnMuPC9wPgogICAgICAgICAgICA8cD5UaGUgaGVhZGVyIGJ1dHRvbnMgcmVtYWluIGFjY2Vzc2libGUgYXQgYWxsIHZpZXdwb3J0IHNpemVzLjwvcD4KICAgICAgICAgIGAsCiAgICBtZW51T3B0aW9uczogW3sKICAgICAgbmFtZTogIkNsb3NlIiwKICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWwpID0+IG1vZGFsLmRlc3Ryb3koKQogICAgfV0KICB9KTsKfX0+VGVzdCBSZXNwb25zaXZlPC9kZWVzLWJ1dHRvbj4KICAgIDwvZGl2PgogIDwvZGl2PgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW92ZXJsYXkvZGVlcy1tb2RhbC9kZWVzLW1vZGFsLmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfZGlzdF90czI1KCk7CmluaXRfZGVlc19pY29uKCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTE1ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMxNiA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc01vZGFsID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1tb2RhbCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX2hlYWRpbmdfZGVjb3JhdG9yczsKICBsZXQgX2hlYWRpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oZWFkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZW50X2RlY29yYXRvcnM7CiAgbGV0IF9jb250ZW50X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29udGVudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWVudU9wdGlvbnNfZGVjb3JhdG9yczsKICBsZXQgX21lbnVPcHRpb25zX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWVudU9wdGlvbnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3dpZHRoX2RlY29yYXRvcnM7CiAgbGV0IF93aWR0aF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3dpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYXhXaWR0aF9kZWNvcmF0b3JzOwogIGxldCBfbWF4V2lkdGhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYXhXaWR0aF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWluV2lkdGhfZGVjb3JhdG9yczsKICBsZXQgX21pbldpZHRoX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWluV2lkdGhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dDbG9zZUJ1dHRvbl9kZWNvcmF0b3JzOwogIGxldCBfc2hvd0Nsb3NlQnV0dG9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0Nsb3NlQnV0dG9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93SGVscEJ1dHRvbl9kZWNvcmF0b3JzOwogIGxldCBfc2hvd0hlbHBCdXR0b25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93SGVscEJ1dHRvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfb25IZWxwX2RlY29yYXRvcnM7CiAgbGV0IF9vbkhlbHBfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vbkhlbHBfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21vYmlsZUZ1bGxzY3JlZW5fZGVjb3JhdG9yczsKICBsZXQgX21vYmlsZUZ1bGxzY3JlZW5faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tb2JpbGVGdWxsc2NyZWVuX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZW50UGFkZGluZ19kZWNvcmF0b3JzOwogIGxldCBfY29udGVudFBhZGRpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZW50UGFkZGluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW9kYWxaSW5kZXhfZGVjb3JhdG9yczsKICBsZXQgX21vZGFsWkluZGV4X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW9kYWxaSW5kZXhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc01vZGFsMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2hlYWRpbmdfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgIH0pXTsKICAgICAgX2NvbnRlbnRfZGVjb3JhdG9ycyA9IFtyNSh7fSldOwogICAgICBfbWVudU9wdGlvbnNfZGVjb3JhdG9ycyA9IFtyNSh7fSldOwogICAgICBfd2lkdGhfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9tYXhXaWR0aF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX21pbldpZHRoX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfc2hvd0Nsb3NlQnV0dG9uX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3Nob3dIZWxwQnV0dG9uX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX29uSGVscF9kZWNvcmF0b3JzID0gW241KHsgYXR0cmlidXRlOiBmYWxzZSB9KV07CiAgICAgIF9tb2JpbGVGdWxsc2NyZWVuX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2NvbnRlbnRQYWRkaW5nX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfbW9kYWxaSW5kZXhfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlMTUodGhpcywgbnVsbCwgX2hlYWRpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaGVhZGluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaGVhZGluZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5oZWFkaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5oZWFkaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2hlYWRpbmdfaW5pdGlhbGl6ZXJzLCBfaGVhZGluZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE1KHRoaXMsIG51bGwsIF9jb250ZW50X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNvbnRlbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNvbnRlbnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29udGVudCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY29udGVudCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jb250ZW50X2luaXRpYWxpemVycywgX2NvbnRlbnRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxNSh0aGlzLCBudWxsLCBfbWVudU9wdGlvbnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWVudU9wdGlvbnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1lbnVPcHRpb25zIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1lbnVPcHRpb25zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tZW51T3B0aW9ucyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tZW51T3B0aW9uc19pbml0aWFsaXplcnMsIF9tZW51T3B0aW9uc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE1KHRoaXMsIG51bGwsIF93aWR0aF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ3aWR0aCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAid2lkdGgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoud2lkdGgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLndpZHRoID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3dpZHRoX2luaXRpYWxpemVycywgX3dpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTUodGhpcywgbnVsbCwgX21heFdpZHRoX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1heFdpZHRoIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtYXhXaWR0aCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYXhXaWR0aCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWF4V2lkdGggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWF4V2lkdGhfaW5pdGlhbGl6ZXJzLCBfbWF4V2lkdGhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxNSh0aGlzLCBudWxsLCBfbWluV2lkdGhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWluV2lkdGgiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1pbldpZHRoIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1pbldpZHRoLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5taW5XaWR0aCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9taW5XaWR0aF9pbml0aWFsaXplcnMsIF9taW5XaWR0aF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE1KHRoaXMsIG51bGwsIF9zaG93Q2xvc2VCdXR0b25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2hvd0Nsb3NlQnV0dG9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93Q2xvc2VCdXR0b24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2hvd0Nsb3NlQnV0dG9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaG93Q2xvc2VCdXR0b24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd0Nsb3NlQnV0dG9uX2luaXRpYWxpemVycywgX3Nob3dDbG9zZUJ1dHRvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE1KHRoaXMsIG51bGwsIF9zaG93SGVscEJ1dHRvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93SGVscEJ1dHRvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd0hlbHBCdXR0b24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2hvd0hlbHBCdXR0b24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dIZWxwQnV0dG9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dIZWxwQnV0dG9uX2luaXRpYWxpemVycywgX3Nob3dIZWxwQnV0dG9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTUodGhpcywgbnVsbCwgX29uSGVscF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJvbkhlbHAiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm9uSGVscCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5vbkhlbHAsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm9uSGVscCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9vbkhlbHBfaW5pdGlhbGl6ZXJzLCBfb25IZWxwX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTUodGhpcywgbnVsbCwgX21vYmlsZUZ1bGxzY3JlZW5fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibW9iaWxlRnVsbHNjcmVlbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibW9iaWxlRnVsbHNjcmVlbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tb2JpbGVGdWxsc2NyZWVuLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tb2JpbGVGdWxsc2NyZWVuID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21vYmlsZUZ1bGxzY3JlZW5faW5pdGlhbGl6ZXJzLCBfbW9iaWxlRnVsbHNjcmVlbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE1KHRoaXMsIG51bGwsIF9jb250ZW50UGFkZGluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb250ZW50UGFkZGluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29udGVudFBhZGRpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29udGVudFBhZGRpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvbnRlbnRQYWRkaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbnRlbnRQYWRkaW5nX2luaXRpYWxpemVycywgX2NvbnRlbnRQYWRkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTUodGhpcywgbnVsbCwgX21vZGFsWkluZGV4X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1vZGFsWkluZGV4Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtb2RhbFpJbmRleCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tb2RhbFpJbmRleCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubW9kYWxaSW5kZXggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbW9kYWxaSW5kZXhfaW5pdGlhbGl6ZXJzLCBfbW9kYWxaSW5kZXhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxNShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNNb2RhbDIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgLy8gU1RBVElDCiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jOTsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJPdmVybGF5Il07CiAgICBzdGF0aWMgYXN5bmMgY3JlYXRlQW5kU2hvdyhvcHRpb25zQXJnKSB7CiAgICAgIGNvbnN0IGJvZHkzID0gZG9jdW1lbnQuYm9keTsKICAgICAgY29uc3QgbW9kYWwgPSBuZXcgRGVlc01vZGFsMigpOwogICAgICBtb2RhbC5oZWFkaW5nID0gb3B0aW9uc0FyZy5oZWFkaW5nOwogICAgICBtb2RhbC5jb250ZW50ID0gb3B0aW9uc0FyZy5jb250ZW50OwogICAgICBtb2RhbC5tZW51T3B0aW9ucyA9IG9wdGlvbnNBcmcubWVudU9wdGlvbnM7CiAgICAgIGlmIChvcHRpb25zQXJnLndpZHRoKQogICAgICAgIG1vZGFsLndpZHRoID0gb3B0aW9uc0FyZy53aWR0aDsKICAgICAgaWYgKG9wdGlvbnNBcmcubWF4V2lkdGgpCiAgICAgICAgbW9kYWwubWF4V2lkdGggPSBvcHRpb25zQXJnLm1heFdpZHRoOwogICAgICBpZiAob3B0aW9uc0FyZy5taW5XaWR0aCkKICAgICAgICBtb2RhbC5taW5XaWR0aCA9IG9wdGlvbnNBcmcubWluV2lkdGg7CiAgICAgIGlmIChvcHRpb25zQXJnLnNob3dDbG9zZUJ1dHRvbiAhPT0gdm9pZCAwKQogICAgICAgIG1vZGFsLnNob3dDbG9zZUJ1dHRvbiA9IG9wdGlvbnNBcmcuc2hvd0Nsb3NlQnV0dG9uOwogICAgICBpZiAob3B0aW9uc0FyZy5zaG93SGVscEJ1dHRvbiAhPT0gdm9pZCAwKQogICAgICAgIG1vZGFsLnNob3dIZWxwQnV0dG9uID0gb3B0aW9uc0FyZy5zaG93SGVscEJ1dHRvbjsKICAgICAgaWYgKG9wdGlvbnNBcmcub25IZWxwKQogICAgICAgIG1vZGFsLm9uSGVscCA9IG9wdGlvbnNBcmcub25IZWxwOwogICAgICBpZiAob3B0aW9uc0FyZy5tb2JpbGVGdWxsc2NyZWVuICE9PSB2b2lkIDApCiAgICAgICAgbW9kYWwubW9iaWxlRnVsbHNjcmVlbiA9IG9wdGlvbnNBcmcubW9iaWxlRnVsbHNjcmVlbjsKICAgICAgaWYgKG9wdGlvbnNBcmcuY29udGVudFBhZGRpbmcgIT09IHZvaWQgMCkKICAgICAgICBtb2RhbC5jb250ZW50UGFkZGluZyA9IG9wdGlvbnNBcmcuY29udGVudFBhZGRpbmc7CiAgICAgIG1vZGFsLndpbmRvd0xheWVyID0gYXdhaXQgRGVlc1dpbmRvd0xheWVyLmNyZWF0ZUFuZFNob3coewogICAgICAgIGJsdXI6IHRydWUKICAgICAgfSk7CiAgICAgIG1vZGFsLndpbmRvd0xheWVyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKCkgPT4gewogICAgICAgIGF3YWl0IG1vZGFsLmRlc3Ryb3koKTsKICAgICAgfSk7CiAgICAgIGJvZHkzLmFwcGVuZChtb2RhbC53aW5kb3dMYXllcik7CiAgICAgIGJvZHkzLmFwcGVuZChtb2RhbCk7CiAgICAgIG1vZGFsLm1vZGFsWkluZGV4ID0gekluZGV4UmVnaXN0cnkuZ2V0TmV4dFpJbmRleCgpOwogICAgICB6SW5kZXhSZWdpc3RyeS5yZWdpc3Rlcihtb2RhbCwgbW9kYWwubW9kYWxaSW5kZXgpOwogICAgICByZXR1cm4gbW9kYWw7CiAgICB9CiAgICAjaGVhZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfaGVhZGluZ19pbml0aWFsaXplcnMsICIiKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgaGVhZGluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2hlYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBoZWFkaW5nKHZhbHVlMikgewogICAgICB0aGlzLiNoZWFkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29udGVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTYodGhpcywgX2hlYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczE2KHRoaXMsIF9jb250ZW50X2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgY29udGVudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvbnRlbnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjb250ZW50KHZhbHVlMikgewogICAgICB0aGlzLiNjb250ZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWVudU9wdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE2KHRoaXMsIF9jb250ZW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfbWVudU9wdGlvbnNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IG1lbnVPcHRpb25zKCkgewogICAgICByZXR1cm4gdGhpcy4jbWVudU9wdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtZW51T3B0aW9ucyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWVudU9wdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN3aWR0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTYodGhpcywgX21lbnVPcHRpb25zX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfd2lkdGhfaW5pdGlhbGl6ZXJzLCAibWVkaXVtIikpOwogICAgZ2V0IHdpZHRoKCkgewogICAgICByZXR1cm4gdGhpcy4jd2lkdGhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB3aWR0aCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jd2lkdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtYXhXaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTYodGhpcywgX3dpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfbWF4V2lkdGhfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBtYXhXaWR0aCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21heFdpZHRoX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWF4V2lkdGgodmFsdWUyKSB7CiAgICAgIHRoaXMuI21heFdpZHRoX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWluV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE2KHRoaXMsIF9tYXhXaWR0aF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTYodGhpcywgX21pbldpZHRoX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgbWluV2lkdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtaW5XaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1pbldpZHRoKHZhbHVlMikgewogICAgICB0aGlzLiNtaW5XaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dDbG9zZUJ1dHRvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTYodGhpcywgX21pbldpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfc2hvd0Nsb3NlQnV0dG9uX2luaXRpYWxpemVycywgdHJ1ZSkpOwogICAgZ2V0IHNob3dDbG9zZUJ1dHRvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dDbG9zZUJ1dHRvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dDbG9zZUJ1dHRvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2hvd0Nsb3NlQnV0dG9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd0hlbHBCdXR0b25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE2KHRoaXMsIF9zaG93Q2xvc2VCdXR0b25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczE2KHRoaXMsIF9zaG93SGVscEJ1dHRvbl9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgc2hvd0hlbHBCdXR0b24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93SGVscEJ1dHRvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dIZWxwQnV0dG9uKHZhbHVlMikgewogICAgICB0aGlzLiNzaG93SGVscEJ1dHRvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI29uSGVscF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTYodGhpcywgX3Nob3dIZWxwQnV0dG9uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfb25IZWxwX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgb25IZWxwKCkgewogICAgICByZXR1cm4gdGhpcy4jb25IZWxwX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgb25IZWxwKHZhbHVlMikgewogICAgICB0aGlzLiNvbkhlbHBfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtb2JpbGVGdWxsc2NyZWVuX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfb25IZWxwX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfbW9iaWxlRnVsbHNjcmVlbl9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgbW9iaWxlRnVsbHNjcmVlbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI21vYmlsZUZ1bGxzY3JlZW5fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtb2JpbGVGdWxsc2NyZWVuKHZhbHVlMikgewogICAgICB0aGlzLiNtb2JpbGVGdWxsc2NyZWVuX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29udGVudFBhZGRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE2KHRoaXMsIF9tb2JpbGVGdWxsc2NyZWVuX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfY29udGVudFBhZGRpbmdfaW5pdGlhbGl6ZXJzLCAxNikpOwogICAgZ2V0IGNvbnRlbnRQYWRkaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jY29udGVudFBhZGRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjb250ZW50UGFkZGluZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29udGVudFBhZGRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtb2RhbFpJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTYodGhpcywgX2NvbnRlbnRQYWRkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfbW9kYWxaSW5kZXhfaW5pdGlhbGl6ZXJzLCAxZTMpKTsKICAgIGdldCBtb2RhbFpJbmRleCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21vZGFsWkluZGV4X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbW9kYWxaSW5kZXgodmFsdWUyKSB7CiAgICAgIHRoaXMuI21vZGFsWkluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1mYW1pbHk6ICR7Y3NzR2Vpc3RGb250RmFtaWx5fTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzMzMiLCAiI2ZmZiIpfTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CiAgICAgIC5tb2RhbENvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgbGVmdDogMHB4OwogICAgICAgIHdpZHRoOiAxMDB2dzsKICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfQogICAgICAubW9kYWwgewogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCkgc2NhbGUoMC45NSk7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBtaW4taGVpZ2h0OiAxMjBweDsKICAgICAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNDBweCk7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzA5MDkwYiIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xKSwgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4wNik7CiAgICAgICAgbWFyZ2luOiAyMHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgICB9CgogICAgICAvKiBXaWR0aCB2YXJpYXRpb25zICovCiAgICAgIC5tb2RhbC53aWR0aC1zbWFsbCB7CiAgICAgICAgd2lkdGg6IDM4MHB4OwogICAgICB9CgogICAgICAubW9kYWwud2lkdGgtbWVkaXVtIHsKICAgICAgICB3aWR0aDogNTYwcHg7CiAgICAgIH0KCiAgICAgIC5tb2RhbC53aWR0aC1sYXJnZSB7CiAgICAgICAgd2lkdGg6IDgwMHB4OwogICAgICB9CgogICAgICAubW9kYWwud2lkdGgtZnVsbHNjcmVlbiB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLSA0MHB4KTsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdmggLSA0MHB4KTsKICAgICAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNDBweCk7CiAgICAgIH0KCiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgewogICAgICAgIC5tb2RhbCB7CiAgICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAtIDQwcHgpICFpbXBvcnRhbnQ7CiAgICAgICAgICBtYXgtd2lkdGg6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLyogQWxsb3cgZnVsbCBoZWlnaHQgb24gbW9iaWxlIHdoZW4gY29udGVudCBuZWVkcyBpdCAqLwogICAgICAgIC5tb2RhbENvbnRhaW5lciB7CiAgICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAubW9kYWwgewogICAgICAgICAgbWFyZ2luOiAxMHB4OwogICAgICAgICAgbWF4LWhlaWdodDogY2FsYygxMDB2aCAtIDIwcHgpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvKiBGdWxsIHNjcmVlbiBtb2RlIG9uIG1vYmlsZSAqLwogICAgICAgIC5tb2RhbC5tb2JpbGUtZnVsbHNjcmVlbiB7CiAgICAgICAgICB3aWR0aDogMTAwdncgIWltcG9ydGFudDsKICAgICAgICAgIGhlaWdodDogMTAwdmggIWltcG9ydGFudDsKICAgICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoICFpbXBvcnRhbnQ7CiAgICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiAwOwogICAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLm1vZGFsLnNob3cgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCkgc2NhbGUoMSk7CiAgICAgIH0KCiAgICAgIC5tb2RhbC5zaG93LnByZWRlc3Ryb3kgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwcHgpIHNjYWxlKDEpOwogICAgICB9CgogICAgICAubW9kYWwgLmhlYWRpbmcgewogICAgICAgIGhlaWdodDogNDBweDsKICAgICAgICBtaW4taGVpZ2h0OiA0MHB4OwogICAgICAgIGZvbnQtZmFtaWx5OiAke2Nzc0dlaXN0Rm9udEZhbWlseX07CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBwYWRkaW5nOiAwIDEycHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAubW9kYWwgLmhlYWRpbmcgLmhlYWRlci1idXR0b25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiA4cHg7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOwogICAgICB9CgogICAgICAubW9kYWwgLmhlYWRpbmcgLmhlYWRlci1idXR0b24gewogICAgICAgIHdpZHRoOiAyOHB4OwogICAgICAgIGhlaWdodDogMjhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgICAgfQoKICAgICAgLm1vZGFsIC5oZWFkaW5nIC5oZWFkZXItYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjMjcyNzJhIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICB9CgogICAgICAubW9kYWwgLmhlYWRpbmcgLmhlYWRlci1idXR0b246YWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjM2YzZjQ2Iil9OwogICAgICB9CgogICAgICAubW9kYWwgLmhlYWRpbmcgLmhlYWRlci1idXR0b24gZGVlcy1pY29uIHsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC5tb2RhbCAuaGVhZGluZyAuaGVhZGluZy10ZXh0IHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBsaW5lLWhlaWdodDogNDBweDsKICAgICAgICBwYWRkaW5nOiAwIDQwcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICAgIH0KCiAgICAgIC5tb2RhbCAuY29udGVudCB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgICB9CiAgICAgIC5tb2RhbCAuYm90dG9tQnV0dG9ucyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAubW9kYWwgLmJvdHRvbUJ1dHRvbnMgLmJvdHRvbUJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxNnB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzI3MjcyYSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjM2YzZjQ2Iil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgIC5tb2RhbCAuYm90dG9tQnV0dG9ucyAuYm90dG9tQnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjM2YzZjQ2Iil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkMWQ1ZGIiLCAiIzUyNTI1YiIpfTsKICAgICAgfQogICAgICAubW9kYWwgLmJvdHRvbUJ1dHRvbnMgLmJvdHRvbUJ1dHRvbjphY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiM1MjUyNWIiKX07CiAgICAgIH0KICAgICAgLm1vZGFsIC5ib3R0b21CdXR0b25zIC5ib3R0b21CdXR0b246bGFzdC1jaGlsZCB7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiBub25lOwogICAgICB9CgogICAgICAubW9kYWwgLmJvdHRvbUJ1dHRvbnMgLmJvdHRvbUJ1dHRvbi5wcmltYXJ5IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjM2I4MmY2Iil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICAgICAgICBjb2xvcjogI2ZmZmZmZjsKICAgICAgfQogICAgICAubW9kYWwgLmJvdHRvbUJ1dHRvbnMgLmJvdHRvbUJ1dHRvbi5wcmltYXJ5OmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzI1NjNlYiIsICIjMjU2M2ViIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyNTYzZWIiLCAiIzI1NjNlYiIpfTsKICAgICAgfQogICAgICAubW9kYWwgLmJvdHRvbUJ1dHRvbnMgLmJvdHRvbUJ1dHRvbi5wcmltYXJ5OmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxZDRlZDgiLCAiIzFkNGVkOCIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMWQ0ZWQ4IiwgIiMxZDRlZDgiKX07CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIGNvbnN0IHdpZHRoQ2xhc3MgPSB0eXBlb2YgdGhpcy53aWR0aCA9PT0gInN0cmluZyIgPyBgd2lkdGgtJHt0aGlzLndpZHRofWAgOiAiIjsKICAgICAgY29uc3QgY3VzdG9tV2lkdGggPSB0eXBlb2YgdGhpcy53aWR0aCA9PT0gIm51bWJlciIgPyBgJHt0aGlzLndpZHRofXB4YCA6ICIiOwogICAgICBjb25zdCBtYXhXaWR0aFN0eWxlID0gdGhpcy5tYXhXaWR0aCA/IGAke3RoaXMubWF4V2lkdGh9cHhgIDogIiI7CiAgICAgIGNvbnN0IG1pbldpZHRoU3R5bGUgPSB0aGlzLm1pbldpZHRoID8gYCR7dGhpcy5taW5XaWR0aH1weGAgOiAiIjsKICAgICAgY29uc3QgbW9iaWxlRnVsbHNjcmVlbkNsYXNzID0gdGhpcy5tb2JpbGVGdWxsc2NyZWVuID8gIm1vYmlsZS1mdWxsc2NyZWVuIiA6ICIiOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxzdHlsZT4KICAgICAgICAke2N1c3RvbVdpZHRoID8gYC5tb2RhbCB7IHdpZHRoOiAke2N1c3RvbVdpZHRofTsgfWAgOiAiIn0KICAgICAgICAke21heFdpZHRoU3R5bGUgPyBgLm1vZGFsIHsgbWF4LXdpZHRoOiAke21heFdpZHRoU3R5bGV9OyB9YCA6ICIifQogICAgICAgICR7bWluV2lkdGhTdHlsZSA/IGAubW9kYWwgeyBtaW4td2lkdGg6ICR7bWluV2lkdGhTdHlsZX07IH1gIDogIiJ9CiAgICAgIDwvc3R5bGU+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsQ29udGFpbmVyIiBAY2xpY2s9JHt0aGlzLmhhbmRsZU91dHNpZGVDbGlja30gc3R5bGU9InotaW5kZXg6ICR7dGhpcy5tb2RhbFpJbmRleH0iPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsICR7d2lkdGhDbGFzc30gJHttb2JpbGVGdWxsc2NyZWVuQ2xhc3N9Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXRleHQiPiR7dGhpcy5oZWFkaW5nfTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItYnV0dG9ucyI+CiAgICAgICAgICAgICAgJHt0aGlzLnNob3dIZWxwQnV0dG9uID8gYjJgCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItYnV0dG9uIiBAY2xpY2s9JHt0aGlzLmhhbmRsZUhlbHB9IHRpdGxlPSJIZWxwIj4KICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6aGVscENpcmNsZSJ9PjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgYCA6ICIifQogICAgICAgICAgICAgICR7dGhpcy5zaG93Q2xvc2VCdXR0b24gPyBiMmAKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlci1idXR0b24iIEBjbGljaz0keygpID0+IHRoaXMuZGVzdHJveSgpfSB0aXRsZT0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTp4In0+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50IiBzdHlsZT0icGFkZGluZzogJHt0aGlzLmNvbnRlbnRQYWRkaW5nfXB4OyI+JHt0aGlzLmNvbnRlbnR9PC9kaXY+CiAgICAgICAgICAke3RoaXMubWVudU9wdGlvbnMubGVuZ3RoID4gMCA/IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJib3R0b21CdXR0b25zIj4KICAgICAgICAgICAgICAke3RoaXMubWVudU9wdGlvbnMubWFwKChhY3Rpb25BcmcsIGluZGV4MikgPT4gYjJgCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJvdHRvbUJ1dHRvbiAke2luZGV4MiA9PT0gdGhpcy5tZW51T3B0aW9ucy5sZW5ndGggLSAxID8gInByaW1hcnkiIDogIiJ9ICR7YWN0aW9uQXJnLm5hbWUgPT09ICJPSyIgPyAib2siIDogIiJ9IiBAY2xpY2s9JHsoKSA9PiB7CiAgICAgICAgYWN0aW9uQXJnLmFjdGlvbih0aGlzKTsKICAgICAgfX0+JHthY3Rpb25BcmcubmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgIGApfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGAgOiAiIn0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgd2luZG93TGF5ZXIgPSBfX3J1bkluaXRpYWxpemVyczE2KHRoaXMsIF9tb2RhbFpJbmRleF9leHRyYUluaXRpYWxpemVycyk7CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBjb25zdCBkb210b29scyA9IGF3YWl0IHRoaXMuZG9tdG9vbHNQcm9taXNlOwogICAgICBhd2FpdCBkb210b29scy5jb252ZW5pZW5jZS5zbWFydGRlbGF5LmRlbGF5Rm9yKDMwKTsKICAgICAgY29uc3QgbW9kYWwgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLm1vZGFsIik7CiAgICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoInNob3ciKTsKICAgIH0KICAgIGFzeW5jIGhhbmRsZU91dHNpZGVDbGljayhldmVudEFyZykgewogICAgICBldmVudEFyZy5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgY29uc3QgbW9kYWxDb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLm1vZGFsQ29udGFpbmVyIik7CiAgICAgIGlmIChldmVudEFyZy50YXJnZXQgPT09IG1vZGFsQ29udGFpbmVyKSB7CiAgICAgICAgYXdhaXQgdGhpcy5kZXN0cm95KCk7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGRlc3Ryb3koKSB7CiAgICAgIGNvbnN0IGRvbXRvb2xzID0gYXdhaXQgdGhpcy5kb210b29sc1Byb21pc2U7CiAgICAgIGNvbnN0IG1vZGFsID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5tb2RhbCIpOwogICAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCJwcmVkZXN0cm95Iik7CiAgICAgIGF3YWl0IGRvbXRvb2xzLmNvbnZlbmllbmNlLnNtYXJ0ZGVsYXkuZGVsYXlGb3IoMjAwKTsKICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzKTsKICAgICAgYXdhaXQgdGhpcy53aW5kb3dMYXllci5kZXN0cm95KCk7CiAgICAgIHpJbmRleFJlZ2lzdHJ5LnVucmVnaXN0ZXIodGhpcyk7CiAgICB9CiAgICBhc3luYyBoYW5kbGVIZWxwKCkgewogICAgICBpZiAodGhpcy5vbkhlbHApIHsKICAgICAgICBhd2FpdCB0aGlzLm9uSGVscCgpOwogICAgICB9CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczE2KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzTW9kYWwyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1sYWJlbC9kZWVzLWxhYmVsLmRlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW9GdW5jMTAgPSAoKSA9PiB7CiAgcmV0dXJuIGIyYAogICAgPGRlZXMtbGFiZWwgLmxhYmVsPSR7ImEgbGFiZWwifT48L2RlZXMtbGFiZWw+CiAgYDsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1sYWJlbC9kZWVzLWxhYmVsLmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTE2ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMxNyA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0xhYmVsID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1sYWJlbCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX2xhYmVsX2RlY29yYXRvcnM7CiAgbGV0IF9sYWJlbF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kZXNjcmlwdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfZGVzY3JpcHRpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kZXNjcmlwdGlvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVxdWlyZWRfZGVjb3JhdG9yczsKICBsZXQgX3JlcXVpcmVkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVxdWlyZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0xhYmVsMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2xhYmVsX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICByZWZsZWN0OiB0cnVlCiAgICAgIH0pXTsKICAgICAgX2Rlc2NyaXB0aW9uX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICByZWZsZWN0OiB0cnVlCiAgICAgIH0pXTsKICAgICAgX3JlcXVpcmVkX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgcmVmbGVjdDogdHJ1ZQogICAgICB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTE2KHRoaXMsIG51bGwsIF9sYWJlbF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsYWJlbCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibGFiZWwiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubGFiZWwsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxhYmVsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xhYmVsX2luaXRpYWxpemVycywgX2xhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTYodGhpcywgbnVsbCwgX2Rlc2NyaXB0aW9uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImRlc2NyaXB0aW9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkZXNjcmlwdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5kZXNjcmlwdGlvbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZGVzY3JpcHRpb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZGVzY3JpcHRpb25faW5pdGlhbGl6ZXJzLCBfZGVzY3JpcHRpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxNih0aGlzLCBudWxsLCBfcmVxdWlyZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicmVxdWlyZWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInJlcXVpcmVkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJlcXVpcmVkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yZXF1aXJlZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9yZXF1aXJlZF9pbml0aWFsaXplcnMsIF9yZXF1aXJlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE2KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0xhYmVsMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMTA7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiTGF5b3V0IiwgIklucHV0Il07CiAgICAjbGFiZWxfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMTcodGhpcywgX2xhYmVsX2luaXRpYWxpemVycywgIiIpOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCBsYWJlbCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xhYmVsX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbGFiZWwodmFsdWUyKSB7CiAgICAgIHRoaXMuI2xhYmVsX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZGVzY3JpcHRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE3KHRoaXMsIF9sYWJlbF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTcodGhpcywgX2Rlc2NyaXB0aW9uX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgZGVzY3JpcHRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNkZXNjcmlwdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGRlc2NyaXB0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNkZXNjcmlwdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3JlcXVpcmVkX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxNyh0aGlzLCBfZGVzY3JpcHRpb25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczE3KHRoaXMsIF9yZXF1aXJlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgcmVxdWlyZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNyZXF1aXJlZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHJlcXVpcmVkKHZhbHVlMikgewogICAgICB0aGlzLiNyZXF1aXJlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCAnUm9ib3RvJywgc2Fucy1zZXJpZjsKICAgICAgfQoKICAgICAgLmxhYmVsIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxNSUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgICBtYXJnaW4tYm90dG9tOiA2cHg7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtOwogICAgICB9CgogICAgICAucmVxdWlyZWQgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgODQuMiUgNjAuMiUpIiwgImhzbCgwIDcyLjIlIDUwLjYlKSIpfTsKICAgICAgICBtYXJnaW4tbGVmdDogMnB4OwogICAgICB9CgogICAgICBkZWVzLWljb24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCk7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQ1LjElKSIsICJoc2woMCAwJSA2My45JSkiKX07CiAgICAgICAgY3Vyc29yOiBoZWxwOwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgICR7dGhpcy5sYWJlbCA/IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+CiAgICAgICAgICAgICAgJHt0aGlzLmxhYmVsfQogICAgICAgICAgICAgICR7dGhpcy5yZXF1aXJlZCA/IGIyYDxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj5gIDogIiJ9CiAgICAgICAgICAgICAgJHt0aGlzLmRlc2NyaXB0aW9uID8gYjJgCiAgICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6aW5mbyJ9PjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgICAgIDxkZWVzLXNwZWVjaGJ1YmJsZSAudGV4dD0ke3RoaXMuZGVzY3JpcHRpb259PjwvZGVlcy1zcGVlY2hidWJibGU+CiAgICAgICAgICAgICAgICAgIGAgOiBiMmBgfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGAgOiBiMmBgfQogICAgYDsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczE3KHRoaXMsIF9yZXF1aXJlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczE3KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzTGFiZWwyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC13b3Jrc3BhY2UvZGVlcy13b3Jrc3BhY2UtbW9uYWNvL3ZlcnNpb24uanMKdmFyIE1PTkFDT19WRVJTSU9OID0gIjAuNTUuMSI7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtd29ya3NwYWNlL2RlZXMtd29ya3NwYWNlLW1vbmFjby9kZWVzLXdvcmtzcGFjZS1tb25hY28uanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF9kaXN0X3RzMjUoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlMTcgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczE4ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzV29ya3NwYWNlTW9uYWNvID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy13b3Jrc3BhY2UtbW9uYWNvIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfY29udGVudF9kZWNvcmF0b3JzOwogIGxldCBfY29udGVudF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRlbnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xhbmd1YWdlX2RlY29yYXRvcnM7CiAgbGV0IF9sYW5ndWFnZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xhbmd1YWdlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWxlUGF0aF9kZWNvcmF0b3JzOwogIGxldCBfZmlsZVBhdGhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWxlUGF0aF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29udGVudFN1YmplY3RfZGVjb3JhdG9yczsKICBsZXQgX2NvbnRlbnRTdWJqZWN0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29udGVudFN1YmplY3RfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3dvcmRXcmFwX2RlY29yYXRvcnM7CiAgbGV0IF93b3JkV3JhcF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3dvcmRXcmFwX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNXb3Jrc3BhY2VNb25hY28yID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfY29udGVudF9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBTdHJpbmcKICAgICAgfSldOwogICAgICBfbGFuZ3VhZ2VfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgIH0pXTsKICAgICAgX2ZpbGVQYXRoX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IFN0cmluZwogICAgICB9KV07CiAgICAgIF9jb250ZW50U3ViamVjdF9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBPYmplY3QKICAgICAgfSldOwogICAgICBfd29yZFdyYXBfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogQm9vbGVhbgogICAgICB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTE3KHRoaXMsIG51bGwsIF9jb250ZW50X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNvbnRlbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNvbnRlbnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29udGVudCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY29udGVudCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jb250ZW50X2luaXRpYWxpemVycywgX2NvbnRlbnRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxNyh0aGlzLCBudWxsLCBfbGFuZ3VhZ2VfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibGFuZ3VhZ2UiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImxhbmd1YWdlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmxhbmd1YWdlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5sYW5ndWFnZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9sYW5ndWFnZV9pbml0aWFsaXplcnMsIF9sYW5ndWFnZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE3KHRoaXMsIG51bGwsIF9maWxlUGF0aF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJmaWxlUGF0aCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZmlsZVBhdGgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZmlsZVBhdGgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmZpbGVQYXRoID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2ZpbGVQYXRoX2luaXRpYWxpemVycywgX2ZpbGVQYXRoX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTcodGhpcywgbnVsbCwgX2NvbnRlbnRTdWJqZWN0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNvbnRlbnRTdWJqZWN0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb250ZW50U3ViamVjdCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jb250ZW50U3ViamVjdCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY29udGVudFN1YmplY3QgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29udGVudFN1YmplY3RfaW5pdGlhbGl6ZXJzLCBfY29udGVudFN1YmplY3RfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxNyh0aGlzLCBudWxsLCBfd29yZFdyYXBfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAid29yZFdyYXAiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIndvcmRXcmFwIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLndvcmRXcmFwLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai53b3JkV3JhcCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF93b3JkV3JhcF9pbml0aWFsaXplcnMsIF93b3JkV3JhcF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE3KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1dvcmtzcGFjZU1vbmFjbzIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgLy8gREVNTwogICAgc3RhdGljIGRlbW8gPSAoKSA9PiBiMmA8ZGVlcy13b3Jrc3BhY2UtbW9uYWNvPjwvZGVlcy13b3Jrc3BhY2UtbW9uYWNvPmA7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiV29ya3NwYWNlIl07CiAgICAvLyBTVEFUSUMKICAgIHN0YXRpYyBtb25hY29EZWZlcnJlZDsKICAgIC8vIElOU1RBTkNFCiAgICBlZGl0b3JEZWZlcnJlZCA9IGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cy5zbWFydHByb21pc2UuZGVmZXIoKTsKICAgICNjb250ZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczE4KHRoaXMsIF9jb250ZW50X2luaXRpYWxpemVycywgImZ1bmN0aW9uIGhlbGxvKCkge1xuCWFsZXJ0KCdIZWxsbyB3b3JsZCEnKTtcbn0iKTsKICAgIGdldCBjb250ZW50KCkgewogICAgICByZXR1cm4gdGhpcy4jY29udGVudF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNvbnRlbnQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2NvbnRlbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsYW5ndWFnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTgodGhpcywgX2NvbnRlbnRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczE4KHRoaXMsIF9sYW5ndWFnZV9pbml0aWFsaXplcnMsICJ0eXBlc2NyaXB0IikpOwogICAgZ2V0IGxhbmd1YWdlKCkgewogICAgICByZXR1cm4gdGhpcy4jbGFuZ3VhZ2VfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsYW5ndWFnZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbGFuZ3VhZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNmaWxlUGF0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTgodGhpcywgX2xhbmd1YWdlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxOCh0aGlzLCBfZmlsZVBhdGhfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGZpbGVQYXRoKCkgewogICAgICByZXR1cm4gdGhpcy4jZmlsZVBhdGhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBmaWxlUGF0aCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZmlsZVBhdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjb250ZW50U3ViamVjdF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTgodGhpcywgX2ZpbGVQYXRoX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxOCh0aGlzLCBfY29udGVudFN1YmplY3RfaW5pdGlhbGl6ZXJzLCBuZXcgZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzLnNtYXJ0cngucnhqcy5TdWJqZWN0KCkpKTsKICAgIGdldCBjb250ZW50U3ViamVjdCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvbnRlbnRTdWJqZWN0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29udGVudFN1YmplY3QodmFsdWUyKSB7CiAgICAgIHRoaXMuI2NvbnRlbnRTdWJqZWN0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjd29yZFdyYXBfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE4KHRoaXMsIF9jb250ZW50U3ViamVjdF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTgodGhpcywgX3dvcmRXcmFwX2luaXRpYWxpemVycywgIm9mZiIpKTsKICAgIGdldCB3b3JkV3JhcCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3dvcmRXcmFwX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgd29yZFdyYXAodmFsdWUyKSB7CiAgICAgIHRoaXMuI3dvcmRXcmFwX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBtb25hY29UaGVtZVN1YnNjcmlwdGlvbiA9IChfX3J1bkluaXRpYWxpemVyczE4KHRoaXMsIF93b3JkV3JhcF9leHRyYUluaXRpYWxpemVycyksIG51bGwpOwogICAgaXNVcGRhdGluZ0Zyb21FeHRlcm5hbCA9IGZhbHNlOwogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIERvbVRvb2xzLnNldHVwRG9tVG9vbHMoKTsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgKiB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQoKICAgICAgLm1haW5ib3ggewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNjb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0ibWFpbmJveCI+CiAgICAgICAgPGRpdiBpZD0iY29udGFpbmVyIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcykgewogICAgICBzdXBlci5maXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290LmdldEVsZW1lbnRCeUlkKCJjb250YWluZXIiKTsKICAgICAgY29uc3QgbW9uYWNvQ2RuQmFzZSA9IGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL21vbmFjby1lZGl0b3JAJHtNT05BQ09fVkVSU0lPTn1gOwogICAgICBpZiAoIURlZXNXb3Jrc3BhY2VNb25hY28yLm1vbmFjb0RlZmVycmVkKSB7CiAgICAgICAgRGVlc1dvcmtzcGFjZU1vbmFjbzIubW9uYWNvRGVmZXJyZWQgPSBkb210b29sc19wbHVnaW5leHBvcnRzX2V4cG9ydHMuc21hcnRwcm9taXNlLmRlZmVyKCk7CiAgICAgICAgY29uc3Qgc2NyaXB0VXJsID0gYCR7bW9uYWNvQ2RuQmFzZX0vbWluL3ZzL2xvYWRlci5qc2A7CiAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgc2NyaXB0LnNyYyA9IHNjcmlwdFVybDsKICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4gewogICAgICAgICAgRGVlc1dvcmtzcGFjZU1vbmFjbzIubW9uYWNvRGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgIH07CiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgICB9CiAgICAgIGF3YWl0IERlZXNXb3Jrc3BhY2VNb25hY28yLm1vbmFjb0RlZmVycmVkLnByb21pc2U7CiAgICAgIHdpbmRvdy5yZXF1aXJlLmNvbmZpZyh7CiAgICAgICAgcGF0aHM6IHsgdnM6IGAke21vbmFjb0NkbkJhc2V9L21pbi92c2AgfQogICAgICB9KTsKICAgICAgd2luZG93LnJlcXVpcmUoWyJ2cy9lZGl0b3IvZWRpdG9yLm1haW4iXSwgYXN5bmMgKCkgPT4gewogICAgICAgIGNvbnN0IGRvbXRvb2xzSW5zdGFuY2UgPSBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgICBjb25zdCBpc0JyaWdodCA9IGRvbXRvb2xzSW5zdGFuY2UudGhlbWVNYW5hZ2VyLmdvQnJpZ2h0Qm9vbGVhbjsKICAgICAgICBjb25zdCBpbml0aWFsVGhlbWUgPSBpc0JyaWdodCA/ICJ2cyIgOiAidnMtZGFyayI7CiAgICAgICAgY29uc3QgbW9uYWNvSW5zdGFuY2UgPSB3aW5kb3cubW9uYWNvOwogICAgICAgIGxldCBtb2RlbCA9IG51bGw7CiAgICAgICAgaWYgKHRoaXMuZmlsZVBhdGgpIHsKICAgICAgICAgIGNvbnN0IHVyaSA9IG1vbmFjb0luc3RhbmNlLlVyaS5wYXJzZShgZmlsZTovLyR7dGhpcy5maWxlUGF0aH1gKTsKICAgICAgICAgIG1vZGVsID0gbW9uYWNvSW5zdGFuY2UuZWRpdG9yLmdldE1vZGVsKHVyaSk7CiAgICAgICAgICBpZiAoIW1vZGVsKSB7CiAgICAgICAgICAgIG1vZGVsID0gbW9uYWNvSW5zdGFuY2UuZWRpdG9yLmNyZWF0ZU1vZGVsKHRoaXMuY29udGVudCwgdGhpcy5sYW5ndWFnZSwgdXJpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1vZGVsLnNldFZhbHVlKHRoaXMuY29udGVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGVkaXRvcjIgPSBtb25hY29JbnN0YW5jZS5lZGl0b3IuY3JlYXRlKGNvbnRhaW5lciwgewogICAgICAgICAgbW9kZWw6IG1vZGVsIHx8IHZvaWQgMCwKICAgICAgICAgIHZhbHVlOiBtb2RlbCA/IHZvaWQgMCA6IHRoaXMuY29udGVudCwKICAgICAgICAgIGxhbmd1YWdlOiBtb2RlbCA/IHZvaWQgMCA6IHRoaXMubGFuZ3VhZ2UsCiAgICAgICAgICB0aGVtZTogaW5pdGlhbFRoZW1lLAogICAgICAgICAgdXNlU2hhZG93RE9NOiB0cnVlLAogICAgICAgICAgZm9udFNpemU6IDE2LAogICAgICAgICAgYXV0b21hdGljTGF5b3V0OiB0cnVlLAogICAgICAgICAgd29yZFdyYXA6IHRoaXMud29yZFdyYXAsCiAgICAgICAgICBob3ZlcjogewogICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICBkZWxheTogMzAwLAogICAgICAgICAgICBzdGlja3k6IHRydWUsCiAgICAgICAgICAgIGFib3ZlOiBmYWxzZQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHRoaXMubW9uYWNvVGhlbWVTdWJzY3JpcHRpb24gPSBkb210b29sc0luc3RhbmNlLnRoZW1lTWFuYWdlci50aGVtZU9ic2VydmFibGUuc3Vic2NyaWJlKChnb0JyaWdodCkgPT4gewogICAgICAgICAgY29uc3QgbmV3VGhlbWUgPSBnb0JyaWdodCA/ICJ2cyIgOiAidnMtZGFyayI7CiAgICAgICAgICBlZGl0b3IyLnVwZGF0ZU9wdGlvbnMoeyB0aGVtZTogbmV3VGhlbWUgfSk7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5lZGl0b3JEZWZlcnJlZC5yZXNvbHZlKGVkaXRvcjIpOwogICAgICB9KTsKICAgICAgY29uc3QgY3NzMTEgPSBhd2FpdCAoYXdhaXQgZmV0Y2goYCR7bW9uYWNvQ2RuQmFzZX0vbWluL3ZzL2VkaXRvci9lZGl0b3IubWFpbi5jc3NgKSkudGV4dCgpOwogICAgICBjb25zdCBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICBzdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBjc3MxMTsKICAgICAgdGhpcy5zaGFkb3dSb290LmFwcGVuZChzdHlsZUVsZW1lbnQpOwogICAgICBjb25zdCBlZGl0b3IgPSBhd2FpdCB0aGlzLmVkaXRvckRlZmVycmVkLnByb21pc2U7CiAgICAgIGVkaXRvci5vbkRpZENoYW5nZU1vZGVsQ29udGVudChhc3luYyAoZXZlbnRBcmcpID0+IHsKICAgICAgICBpZiAodGhpcy5pc1VwZGF0aW5nRnJvbUV4dGVybmFsKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNvbnN0IHZhbHVlMiA9IGVkaXRvci5nZXRWYWx1ZSgpOwogICAgICAgIHRoaXMuY29udGVudFN1YmplY3QubmV4dCh2YWx1ZTIpOwogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImNvbnRlbnQtY2hhbmdlIiwgewogICAgICAgICAgZGV0YWlsOiB2YWx1ZTIsCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH0pOwogICAgICB0aGlzLmNvbnRlbnRTdWJqZWN0Lm5leHQoZWRpdG9yLmdldFZhbHVlKCkpOwogICAgfQogICAgYXN5bmMgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgICBzdXBlci51cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgY29uc3QgbW9uYWNvSW5zdGFuY2UgPSB3aW5kb3cubW9uYWNvOwogICAgICBpZiAoIW1vbmFjb0luc3RhbmNlKQogICAgICAgIHJldHVybjsKICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygiZmlsZVBhdGgiKSAmJiB0aGlzLmZpbGVQYXRoKSB7CiAgICAgICAgY29uc3QgZWRpdG9yID0gYXdhaXQgdGhpcy5lZGl0b3JEZWZlcnJlZC5wcm9taXNlOwogICAgICAgIGNvbnN0IHVyaSA9IG1vbmFjb0luc3RhbmNlLlVyaS5wYXJzZShgZmlsZTovLyR7dGhpcy5maWxlUGF0aH1gKTsKICAgICAgICBsZXQgbW9kZWwgPSBtb25hY29JbnN0YW5jZS5lZGl0b3IuZ2V0TW9kZWwodXJpKTsKICAgICAgICBpZiAoIW1vZGVsKSB7CiAgICAgICAgICBtb2RlbCA9IG1vbmFjb0luc3RhbmNlLmVkaXRvci5jcmVhdGVNb2RlbCh0aGlzLmNvbnRlbnQsIHRoaXMubGFuZ3VhZ2UsIHVyaSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChtb2RlbC5nZXRWYWx1ZSgpICE9PSB0aGlzLmNvbnRlbnQpIHsKICAgICAgICAgICAgdGhpcy5pc1VwZGF0aW5nRnJvbUV4dGVybmFsID0gdHJ1ZTsKICAgICAgICAgICAgbW9kZWwuc2V0VmFsdWUodGhpcy5jb250ZW50KTsKICAgICAgICAgICAgdGhpcy5pc1VwZGF0aW5nRnJvbUV4dGVybmFsID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IGVkaXRvci5nZXRNb2RlbCgpOwogICAgICAgIGlmIChjdXJyZW50TW9kZWw/LnVyaS50b1N0cmluZygpICE9PSB1cmkudG9TdHJpbmcoKSkgewogICAgICAgICAgZWRpdG9yLnNldE1vZGVsKG1vZGVsKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoImNvbnRlbnQiKSkgewogICAgICAgIGNvbnN0IGVkaXRvciA9IGF3YWl0IHRoaXMuZWRpdG9yRGVmZXJyZWQucHJvbWlzZTsKICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBlZGl0b3IuZ2V0VmFsdWUoKTsKICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSB0aGlzLmNvbnRlbnQpIHsKICAgICAgICAgIHRoaXMuaXNVcGRhdGluZ0Zyb21FeHRlcm5hbCA9IHRydWU7CiAgICAgICAgICBlZGl0b3Iuc2V0VmFsdWUodGhpcy5jb250ZW50KTsKICAgICAgICAgIHRoaXMuaXNVcGRhdGluZ0Zyb21FeHRlcm5hbCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJsYW5ndWFnZSIpKSB7CiAgICAgICAgY29uc3QgZWRpdG9yID0gYXdhaXQgdGhpcy5lZGl0b3JEZWZlcnJlZC5wcm9taXNlOwogICAgICAgIGNvbnN0IG1vZGVsID0gZWRpdG9yLmdldE1vZGVsKCk7CiAgICAgICAgaWYgKG1vZGVsKSB7CiAgICAgICAgICBtb25hY29JbnN0YW5jZS5lZGl0b3Iuc2V0TW9kZWxMYW5ndWFnZShtb2RlbCwgdGhpcy5sYW5ndWFnZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgaWYgKHRoaXMubW9uYWNvVGhlbWVTdWJzY3JpcHRpb24pIHsKICAgICAgICB0aGlzLm1vbmFjb1RoZW1lU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgdGhpcy5tb25hY29UaGVtZVN1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIGNvbnRlbnQgZnJvbSBleHRlcm5hbCBzb3VyY2Ugd2l0aCBvcHRpb25hbCBjdXJzb3IgcHJlc2VydmF0aW9uLgogICAgICogVXNlIHRoaXMgd2hlbiB0aGUgZmlsZSBjb250ZW50IGNoYW5nZXMgZXh0ZXJuYWxseSAoZS5nLiwgZmlsZSBjaGFuZ2VkIG9uIGRpc2spLgogICAgICogQHBhcmFtIG5ld0NvbnRlbnQgVGhlIG5ldyBjb250ZW50IHRvIHNldAogICAgICogQHBhcmFtIHByZXNlcnZlQ3Vyc29yIFdoZXRoZXIgdG8gcHJlc2VydmUgY3Vyc29yL3Njcm9sbCBwb3NpdGlvbiAoZGVmYXVsdDogdHJ1ZSkKICAgICAqLwogICAgYXN5bmMgc2V0Q29udGVudEV4dGVybmFsKG5ld0NvbnRlbnQsIHByZXNlcnZlQ3Vyc29yID0gdHJ1ZSkgewogICAgICBjb25zdCBlZGl0b3IgPSBhd2FpdCB0aGlzLmVkaXRvckRlZmVycmVkLnByb21pc2U7CiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGVkaXRvci5nZXRWYWx1ZSgpOwogICAgICBpZiAoY3VycmVudFZhbHVlID09PSBuZXdDb250ZW50KQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgcG9zaXRpb24zID0gcHJlc2VydmVDdXJzb3IgPyBlZGl0b3IuZ2V0UG9zaXRpb24oKSA6IG51bGw7CiAgICAgIGNvbnN0IHNlbGVjdGlvbnMgPSBwcmVzZXJ2ZUN1cnNvciA/IGVkaXRvci5nZXRTZWxlY3Rpb25zKCkgOiBudWxsOwogICAgICBjb25zdCBzY3JvbGxUb3AgPSBwcmVzZXJ2ZUN1cnNvciA/IGVkaXRvci5nZXRTY3JvbGxUb3AoKSA6IDA7CiAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSBwcmVzZXJ2ZUN1cnNvciA/IGVkaXRvci5nZXRTY3JvbGxMZWZ0KCkgOiAwOwogICAgICB0aGlzLmlzVXBkYXRpbmdGcm9tRXh0ZXJuYWwgPSB0cnVlOwogICAgICBlZGl0b3Iuc2V0VmFsdWUobmV3Q29udGVudCk7CiAgICAgIHRoaXMuaXNVcGRhdGluZ0Zyb21FeHRlcm5hbCA9IGZhbHNlOwogICAgICBpZiAocHJlc2VydmVDdXJzb3IpIHsKICAgICAgICBpZiAocG9zaXRpb24zKSB7CiAgICAgICAgICBjb25zdCBtb2RlbCA9IGVkaXRvci5nZXRNb2RlbCgpOwogICAgICAgICAgY29uc3QgbGluZUNvdW50ID0gbW9kZWw/LmdldExpbmVDb3VudCgpIHx8IDE7CiAgICAgICAgICBjb25zdCBjbGFtcGVkTGluZSA9IE1hdGgubWluKHBvc2l0aW9uMy5saW5lTnVtYmVyLCBsaW5lQ291bnQpOwogICAgICAgICAgY29uc3QgbGluZUxlbmd0aCA9IG1vZGVsPy5nZXRMaW5lTWF4Q29sdW1uKGNsYW1wZWRMaW5lKSB8fCAxOwogICAgICAgICAgY29uc3QgY2xhbXBlZENvbHVtbiA9IE1hdGgubWluKHBvc2l0aW9uMy5jb2x1bW4sIGxpbmVMZW5ndGgpOwogICAgICAgICAgZWRpdG9yLnNldFBvc2l0aW9uKHsgbGluZU51bWJlcjogY2xhbXBlZExpbmUsIGNvbHVtbjogY2xhbXBlZENvbHVtbiB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKHNlbGVjdGlvbnMgJiYgc2VsZWN0aW9ucy5sZW5ndGggPiAwKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBlZGl0b3Iuc2V0U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTsKICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlZGl0b3Iuc2V0U2Nyb2xsUG9zaXRpb24oeyBzY3JvbGxUb3AsIHNjcm9sbExlZnQgfSk7CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMTgoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNXb3Jrc3BhY2VNb25hY28yID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LWNvZGUvZGVlcy1pbnB1dC1jb2RlLmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfdGhlbWUoKTsKaW5pdF9kZWVzX2ljb24oKTsKdmFyIF9fZXNEZWNvcmF0ZTE4ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMxOSA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgTEFOR1VBR0VTID0gWwogIHsga2V5OiAidHlwZXNjcmlwdCIsIGxhYmVsOiAiVHlwZVNjcmlwdCIgfSwKICB7IGtleTogImphdmFzY3JpcHQiLCBsYWJlbDogIkphdmFTY3JpcHQiIH0sCiAgeyBrZXk6ICJqc29uIiwgbGFiZWw6ICJKU09OIiB9LAogIHsga2V5OiAiaHRtbCIsIGxhYmVsOiAiSFRNTCIgfSwKICB7IGtleTogImNzcyIsIGxhYmVsOiAiQ1NTIiB9LAogIHsga2V5OiAic2NzcyIsIGxhYmVsOiAiU0NTUyIgfSwKICB7IGtleTogIm1hcmtkb3duIiwgbGFiZWw6ICJNYXJrZG93biIgfSwKICB7IGtleTogInlhbWwiLCBsYWJlbDogIllBTUwiIH0sCiAgeyBrZXk6ICJ4bWwiLCBsYWJlbDogIlhNTCIgfSwKICB7IGtleTogInNxbCIsIGxhYmVsOiAiU1FMIiB9LAogIHsga2V5OiAicHl0aG9uIiwgbGFiZWw6ICJQeXRob24iIH0sCiAgeyBrZXk6ICJqYXZhIiwgbGFiZWw6ICJKYXZhIiB9LAogIHsga2V5OiAiY3NoYXJwIiwgbGFiZWw6ICJDIyIgfSwKICB7IGtleTogImNwcCIsIGxhYmVsOiAiQysrIiB9LAogIHsga2V5OiAiZ28iLCBsYWJlbDogIkdvIiB9LAogIHsga2V5OiAicnVzdCIsIGxhYmVsOiAiUnVzdCIgfSwKICB7IGtleTogInNoZWxsIiwgbGFiZWw6ICJTaGVsbCIgfSwKICB7IGtleTogInBsYWludGV4dCIsIGxhYmVsOiAiUGxhaW4gVGV4dCIgfQpdOwp2YXIgRGVlc0lucHV0Q29kZSA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtaW5wdXQtY29kZSIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzSW5wdXRCYXNlOwogIGxldCBfdmFsdWVfZGVjb3JhdG9yczsKICBsZXQgX3ZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xhbmd1YWdlX2RlY29yYXRvcnM7CiAgbGV0IF9sYW5ndWFnZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xhbmd1YWdlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oZWlnaHRfZGVjb3JhdG9yczsKICBsZXQgX2hlaWdodF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2hlaWdodF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfd29yZFdyYXBfZGVjb3JhdG9yczsKICBsZXQgX3dvcmRXcmFwX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfd29yZFdyYXBfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dMaW5lTnVtYmVyc19kZWNvcmF0b3JzOwogIGxldCBfc2hvd0xpbmVOdW1iZXJzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0xpbmVOdW1iZXJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0xhbmd1YWdlRHJvcGRvd25PcGVuX2RlY29yYXRvcnM7CiAgbGV0IF9pc0xhbmd1YWdlRHJvcGRvd25PcGVuX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNMYW5ndWFnZURyb3Bkb3duT3Blbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29weVN1Y2Nlc3NfZGVjb3JhdG9yczsKICBsZXQgX2NvcHlTdWNjZXNzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29weVN1Y2Nlc3NfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0lucHV0Q29kZTIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF92YWx1ZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2xhbmd1YWdlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfaGVpZ2h0X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfd29yZFdyYXBfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9zaG93TGluZU51bWJlcnNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfaXNMYW5ndWFnZURyb3Bkb3duT3Blbl9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfY29weVN1Y2Nlc3NfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlMTgodGhpcywgbnVsbCwgX3ZhbHVlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZhbHVlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ2YWx1ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai52YWx1ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudmFsdWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxOCh0aGlzLCBudWxsLCBfbGFuZ3VhZ2VfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibGFuZ3VhZ2UiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImxhbmd1YWdlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmxhbmd1YWdlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5sYW5ndWFnZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9sYW5ndWFnZV9pbml0aWFsaXplcnMsIF9sYW5ndWFnZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE4KHRoaXMsIG51bGwsIF9oZWlnaHRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaGVpZ2h0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJoZWlnaHQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaGVpZ2h0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5oZWlnaHQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaGVpZ2h0X2luaXRpYWxpemVycywgX2hlaWdodF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE4KHRoaXMsIG51bGwsIF93b3JkV3JhcF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ3b3JkV3JhcCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAid29yZFdyYXAiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoud29yZFdyYXAsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLndvcmRXcmFwID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3dvcmRXcmFwX2luaXRpYWxpemVycywgX3dvcmRXcmFwX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTgodGhpcywgbnVsbCwgX3Nob3dMaW5lTnVtYmVyc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93TGluZU51bWJlcnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNob3dMaW5lTnVtYmVycyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93TGluZU51bWJlcnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dMaW5lTnVtYmVycyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93TGluZU51bWJlcnNfaW5pdGlhbGl6ZXJzLCBfc2hvd0xpbmVOdW1iZXJzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTgodGhpcywgbnVsbCwgX2lzTGFuZ3VhZ2VEcm9wZG93bk9wZW5fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNMYW5ndWFnZURyb3Bkb3duT3BlbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNMYW5ndWFnZURyb3Bkb3duT3BlbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc0xhbmd1YWdlRHJvcGRvd25PcGVuLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc0xhbmd1YWdlRHJvcGRvd25PcGVuID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzTGFuZ3VhZ2VEcm9wZG93bk9wZW5faW5pdGlhbGl6ZXJzLCBfaXNMYW5ndWFnZURyb3Bkb3duT3Blbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE4KHRoaXMsIG51bGwsIF9jb3B5U3VjY2Vzc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb3B5U3VjY2VzcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29weVN1Y2Nlc3MiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29weVN1Y2Nlc3MsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvcHlTdWNjZXNzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvcHlTdWNjZXNzX2luaXRpYWxpemVycywgX2NvcHlTdWNjZXNzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTgobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzSW5wdXRDb2RlMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9ICgpID0+IGIyYAogICAgPGRlZXMtaW5wdXQtY29kZQogICAgICBsYWJlbD0iVHlwZVNjcmlwdCBDb2RlIgogICAgICBrZXk9ImNvZGUiCiAgICAgIGxhbmd1YWdlPSJ0eXBlc2NyaXB0IgogICAgICBoZWlnaHQ9IjMwMHB4IgogICAgICAudmFsdWU9JHsnY29uc3QgZ3JlZXRpbmc6IHN0cmluZyA9ICJIZWxsbyBXb3JsZCI7XG5jb25zb2xlLmxvZyhncmVldGluZyk7J30KICAgID48L2RlZXMtaW5wdXQtY29kZT4KICBgOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIklucHV0IiwgIldvcmtzcGFjZSJdOwogICAgI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczE5KHRoaXMsIF92YWx1ZV9pbml0aWFsaXplcnMsICIiKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgdmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2xhbmd1YWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxOSh0aGlzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczE5KHRoaXMsIF9sYW5ndWFnZV9pbml0aWFsaXplcnMsICJ0eXBlc2NyaXB0IikpOwogICAgZ2V0IGxhbmd1YWdlKCkgewogICAgICByZXR1cm4gdGhpcy4jbGFuZ3VhZ2VfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsYW5ndWFnZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbGFuZ3VhZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNoZWlnaHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE5KHRoaXMsIF9sYW5ndWFnZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTkodGhpcywgX2hlaWdodF9pbml0aWFsaXplcnMsICIyMDBweCIpKTsKICAgIGdldCBoZWlnaHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNoZWlnaHRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBoZWlnaHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2hlaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3dvcmRXcmFwX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxOSh0aGlzLCBfaGVpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxOSh0aGlzLCBfd29yZFdyYXBfaW5pdGlhbGl6ZXJzLCAib2ZmIikpOwogICAgZ2V0IHdvcmRXcmFwKCkgewogICAgICByZXR1cm4gdGhpcy4jd29yZFdyYXBfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB3b3JkV3JhcCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jd29yZFdyYXBfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93TGluZU51bWJlcnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE5KHRoaXMsIF93b3JkV3JhcF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTkodGhpcywgX3Nob3dMaW5lTnVtYmVyc19pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93TGluZU51bWJlcnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93TGluZU51bWJlcnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93TGluZU51bWJlcnModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dMaW5lTnVtYmVyc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzTGFuZ3VhZ2VEcm9wZG93bk9wZW5fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE5KHRoaXMsIF9zaG93TGluZU51bWJlcnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczE5KHRoaXMsIF9pc0xhbmd1YWdlRHJvcGRvd25PcGVuX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc0xhbmd1YWdlRHJvcGRvd25PcGVuKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNMYW5ndWFnZURyb3Bkb3duT3Blbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzTGFuZ3VhZ2VEcm9wZG93bk9wZW4odmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzTGFuZ3VhZ2VEcm9wZG93bk9wZW5fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjb3B5U3VjY2Vzc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTkodGhpcywgX2lzTGFuZ3VhZ2VEcm9wZG93bk9wZW5fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczE5KHRoaXMsIF9jb3B5U3VjY2Vzc19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgY29weVN1Y2Nlc3MoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb3B5U3VjY2Vzc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNvcHlTdWNjZXNzKHZhbHVlMikgewogICAgICB0aGlzLiNjb3B5U3VjY2Vzc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgZWRpdG9yRWxlbWVudCA9IChfX3J1bkluaXRpYWxpemVyczE5KHRoaXMsIF9jb3B5U3VjY2Vzc19leHRyYUluaXRpYWxpemVycyksIG51bGwpOwogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICAuLi5EZWVzSW5wdXRCYXNlLmJhc2VTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgKiB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQoKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICB9CgogICAgICAuaW5wdXQtd3JhcHBlciwKICAgICAgOmhvc3QoW2xhYmVsLXBvc2l0aW9uPSJ0b3AiXSkgLmlucHV0LXdyYXBwZXIsCiAgICAgIDpob3N0KFtsYWJlbC1wb3NpdGlvbj0ibGVmdCJdKSAuaW5wdXQtd3JhcHBlciwKICAgICAgOmhvc3QoW2xhYmVsLXBvc2l0aW9uPSJyaWdodCJdKSAuaW5wdXQtd3JhcHBlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLWhlaWdodDogMDsKICAgICAgfQoKICAgICAgLmNvZGUtY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleDogMTsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSA5JSkiKX07CiAgICAgIH0KCiAgICAgIC50b29sYmFyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NyUpIiwgImhzbCgwIDAlIDclKSIpfTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLWxlZnQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItcmlnaHQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDRweDsKICAgICAgfQoKICAgICAgLmxhbmd1YWdlLXNlbGVjdG9yIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5sYW5ndWFnZS1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDZweDsKICAgICAgICBwYWRkaW5nOiA0cHggMTBweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgMTIlKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDIwJSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDIwJSkiLCAiaHNsKDAgMCUgOTAlKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLmxhbmd1YWdlLWJ1dHRvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk1JSkiLCAiaHNsKDAgMCUgMTUlKSIpfTsKICAgICAgfQoKICAgICAgLmxhbmd1YWdlLWRyb3Bkb3duIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxMDAlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSA5JSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAyMCUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7CiAgICAgICAgei1pbmRleDogMTAwOwogICAgICAgIG1heC1oZWlnaHQ6IDI1MHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWluLXdpZHRoOiAxNDBweDsKICAgICAgfQoKICAgICAgLmxhbmd1YWdlLW9wdGlvbiB7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDIwJSkiLCAiaHNsKDAgMCUgOTAlKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5sYW5ndWFnZS1vcHRpb246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NSUpIiwgImhzbCgwIDAlIDE1JSkiKX07CiAgICAgIH0KCiAgICAgIC5sYW5ndWFnZS1vcHRpb24uc2VsZWN0ZWQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5MCUpIiwgImhzbCgwIDAlIDIwJSkiKX07CiAgICAgIH0KCiAgICAgIC50b29sYmFyLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQ1JSkiLCAiaHNsKDAgMCUgNjAlKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTAlKSIsICJoc2woMCAwJSAxNSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMjAlKSIsICJoc2woMCAwJSA5MCUpIil9OwogICAgICB9CgogICAgICAudG9vbGJhci1idXR0b24uYWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODUlKSIsICJoc2woMCAwJSAyMCUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMjAlKSIsICJoc2woMCAwJSA5MCUpIil9OwogICAgICB9CgogICAgICAudG9vbGJhci1idXR0b24uc3VjY2VzcyB7CiAgICAgICAgY29sb3I6IGhzbCgxNDIuMSA3Ni4yJSAzNi4zJSk7CiAgICAgIH0KCiAgICAgIC5lZGl0b3Itd3JhcHBlciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLWhlaWdodDogMDsKICAgICAgfQoKICAgICAgZGVlcy13b3Jrc3BhY2UtbW9uYWNvIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLWRpdmlkZXIgewogICAgICAgIHdpZHRoOiAxcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4NSUpIiwgImhzbCgwIDAlIDIwJSkiKX07CiAgICAgICAgbWFyZ2luOiAwIDRweDsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgLmNvZGUtY29udGFpbmVyIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZSA9IExBTkdVQUdFUy5maW5kKChsNikgPT4gbDYua2V5ID09PSB0aGlzLmxhbmd1YWdlKSB8fCBMQU5HVUFHRVNbMF07CiAgICAgIHJldHVybiBiMmAKICAgICAgPHN0eWxlPgogICAgICAgIDpob3N0IHsKICAgICAgICAgIGhlaWdodDogJHt0aGlzLmhlaWdodH07CiAgICAgICAgfQogICAgICA8L3N0eWxlPgogICAgICA8ZGl2IGNsYXNzPSJpbnB1dC13cmFwcGVyIj4KICAgICAgICA8ZGVlcy1sYWJlbCAubGFiZWw9JHt0aGlzLmxhYmVsfSAuZGVzY3JpcHRpb249JHt0aGlzLmRlc2NyaXB0aW9ufSAucmVxdWlyZWQ9JHt0aGlzLnJlcXVpcmVkfT48L2RlZXMtbGFiZWw+CiAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1jb250YWluZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0idG9vbGJhciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItbGVmdCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFuZ3VhZ2Utc2VsZWN0b3IiPgogICAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgICBjbGFzcz0ibGFuZ3VhZ2UtYnV0dG9uIgogICAgICAgICAgICAgICAgICBAY2xpY2s9JHt0aGlzLnRvZ2dsZUxhbmd1YWdlRHJvcGRvd259CiAgICAgICAgICAgICAgICAgIEBibHVyPSR7dGhpcy5oYW5kbGVMYW5ndWFnZUJsdXJ9CiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICR7Y3VycmVudExhbmd1YWdlLmxhYmVsfQogICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTpDaGV2cm9uRG93biJ9IGljb25TaXplPSIxNCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICR7dGhpcy5pc0xhbmd1YWdlRHJvcGRvd25PcGVuID8gYjJgCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imxhbmd1YWdlLWRyb3Bkb3duIj4KICAgICAgICAgICAgICAgICAgICAke0xBTkdVQUdFUy5tYXAoKGxhbmcpID0+IGIyYAogICAgICAgICAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ibGFuZ3VhZ2Utb3B0aW9uICR7bGFuZy5rZXkgPT09IHRoaXMubGFuZ3VhZ2UgPyAic2VsZWN0ZWQiIDogIiJ9IgogICAgICAgICAgICAgICAgICAgICAgICBAbW91c2Vkb3duPSR7KGUxMSkgPT4gdGhpcy5zZWxlY3RMYW5ndWFnZShlMTEsIGxhbmcua2V5KX0KICAgICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICAgJHtsYW5nLmxhYmVsfQogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgYCl9CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgYCA6ICIifQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9vbGJhci1yaWdodCI+CiAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgY2xhc3M9InRvb2xiYXItYnV0dG9uICR7dGhpcy53b3JkV3JhcCA9PT0gIm9uIiA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICAgICAgdGl0bGU9IldvcmQgV3JhcCIKICAgICAgICAgICAgICAgIEBjbGljaz0ke3RoaXMudG9nZ2xlV29yZFdyYXB9CiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6V3JhcFRleHQifSBpY29uU2l6ZT0iMTYiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgIGNsYXNzPSJ0b29sYmFyLWJ1dHRvbiAke3RoaXMuc2hvd0xpbmVOdW1iZXJzID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICAgICAgICB0aXRsZT0iTGluZSBOdW1iZXJzIgogICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy50b2dnbGVMaW5lTnVtYmVyc30KICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTpIYXNoIn0gaWNvblNpemU9IjE2Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sYmFyLWRpdmlkZXIiPjwvZGl2PgogICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgIGNsYXNzPSJ0b29sYmFyLWJ1dHRvbiAke3RoaXMuY29weVN1Y2Nlc3MgPyAic3VjY2VzcyIgOiAiIn0iCiAgICAgICAgICAgICAgICB0aXRsZT0iQ29weSBDb2RlIgogICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy5jb3B5Q29kZX0KICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7dGhpcy5jb3B5U3VjY2VzcyA/ICJsdWNpZGU6Q2hlY2siIDogImx1Y2lkZTpDb3B5In0gaWNvblNpemU9IjE2Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICBjbGFzcz0idG9vbGJhci1idXR0b24iCiAgICAgICAgICAgICAgICB0aXRsZT0iRXhwYW5kIgogICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy5vcGVuRnVsbHNjcmVlbn0KICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTpNYXhpbWl6ZTIifSBpY29uU2l6ZT0iMTYiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZWRpdG9yLXdyYXBwZXIiPgogICAgICAgICAgICA8ZGVlcy13b3Jrc3BhY2UtbW9uYWNvCiAgICAgICAgICAgICAgLmNvbnRlbnQ9JHt0aGlzLnZhbHVlfQogICAgICAgICAgICAgIC5sYW5ndWFnZT0ke3RoaXMubGFuZ3VhZ2V9CiAgICAgICAgICAgICAgLndvcmRXcmFwPSR7dGhpcy53b3JkV3JhcH0KICAgICAgICAgICAgICBAY29udGVudC1jaGFuZ2U9JHt0aGlzLmhhbmRsZUNvbnRlbnRDaGFuZ2V9CiAgICAgICAgICAgID48L2RlZXMtd29ya3NwYWNlLW1vbmFjbz4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIHRoaXMuZWRpdG9yRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiZGVlcy13b3Jrc3BhY2UtbW9uYWNvIik7CiAgICAgIGlmICh0aGlzLmVkaXRvckVsZW1lbnQpIHsKICAgICAgICB0aGlzLmVkaXRvckVsZW1lbnQuY29udGVudFN1YmplY3Quc3Vic2NyaWJlKChuZXdDb250ZW50KSA9PiB7CiAgICAgICAgICBpZiAodGhpcy52YWx1ZSAhPT0gbmV3Q29udGVudCkgewogICAgICAgICAgICB0aGlzLnZhbHVlID0gbmV3Q29udGVudDsKICAgICAgICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIHRvZ2dsZUxhbmd1YWdlRHJvcGRvd24oKSB7CiAgICAgIHRoaXMuaXNMYW5ndWFnZURyb3Bkb3duT3BlbiA9ICF0aGlzLmlzTGFuZ3VhZ2VEcm9wZG93bk9wZW47CiAgICB9CiAgICBoYW5kbGVMYW5ndWFnZUJsdXIoKSB7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIHRoaXMuaXNMYW5ndWFnZURyb3Bkb3duT3BlbiA9IGZhbHNlOwogICAgICB9LCAxNTApOwogICAgfQogICAgYXN5bmMgc2VsZWN0TGFuZ3VhZ2UoZTExLCBsYW5ndWFnZUtleSkgewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlS2V5OwogICAgICB0aGlzLmlzTGFuZ3VhZ2VEcm9wZG93bk9wZW4gPSBmYWxzZTsKICAgICAgaWYgKHRoaXMuZWRpdG9yRWxlbWVudCkgewogICAgICAgIHRoaXMuZWRpdG9yRWxlbWVudC5sYW5ndWFnZSA9IGxhbmd1YWdlS2V5OwogICAgICAgIGNvbnN0IGVkaXRvciA9IGF3YWl0IHRoaXMuZWRpdG9yRWxlbWVudC5lZGl0b3JEZWZlcnJlZC5wcm9taXNlOwogICAgICAgIGNvbnN0IG1vZGVsID0gZWRpdG9yLmdldE1vZGVsKCk7CiAgICAgICAgaWYgKG1vZGVsKSB7CiAgICAgICAgICB3aW5kb3cubW9uYWNvLmVkaXRvci5zZXRNb2RlbExhbmd1YWdlKG1vZGVsLCBsYW5ndWFnZUtleSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0b2dnbGVXb3JkV3JhcCgpIHsKICAgICAgdGhpcy53b3JkV3JhcCA9IHRoaXMud29yZFdyYXAgPT09ICJvbiIgPyAib2ZmIiA6ICJvbiI7CiAgICAgIHRoaXMudXBkYXRlRWRpdG9yT3B0aW9uKCJ3b3JkV3JhcCIsIHRoaXMud29yZFdyYXApOwogICAgfQogICAgdG9nZ2xlTGluZU51bWJlcnMoKSB7CiAgICAgIHRoaXMuc2hvd0xpbmVOdW1iZXJzID0gIXRoaXMuc2hvd0xpbmVOdW1iZXJzOwogICAgICB0aGlzLnVwZGF0ZUVkaXRvck9wdGlvbigibGluZU51bWJlcnMiLCB0aGlzLnNob3dMaW5lTnVtYmVycyA/ICJvbiIgOiAib2ZmIik7CiAgICB9CiAgICBhc3luYyB1cGRhdGVFZGl0b3JPcHRpb24ob3B0aW9uMiwgdmFsdWUyKSB7CiAgICAgIGlmICh0aGlzLmVkaXRvckVsZW1lbnQpIHsKICAgICAgICBjb25zdCBlZGl0b3IgPSBhd2FpdCB0aGlzLmVkaXRvckVsZW1lbnQuZWRpdG9yRGVmZXJyZWQucHJvbWlzZTsKICAgICAgICBlZGl0b3IudXBkYXRlT3B0aW9ucyh7IFtvcHRpb24yXTogdmFsdWUyIH0pOwogICAgICB9CiAgICB9CiAgICBhc3luYyBjb3B5Q29kZSgpIHsKICAgICAgdHJ5IHsKICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0aGlzLnZhbHVlKTsKICAgICAgICB0aGlzLmNvcHlTdWNjZXNzID0gdHJ1ZTsKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgIHRoaXMuY29weVN1Y2Nlc3MgPSBmYWxzZTsKICAgICAgICB9LCAyZTMpOwogICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gY29weSBjb2RlOiIsIGVycik7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZUNvbnRlbnRDaGFuZ2UoZTExKSB7CiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBlMTEuZGV0YWlsOwogICAgICBpZiAodGhpcy52YWx1ZSAhPT0gbmV3Q29udGVudCkgewogICAgICAgIHRoaXMudmFsdWUgPSBuZXdDb250ZW50OwogICAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBvcGVuRnVsbHNjcmVlbigpIHsKICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy52YWx1ZTsKICAgICAgbGV0IG1vZGFsRWRpdG9yRWxlbWVudCA9IG51bGw7CiAgICAgIGxldCBtb2RhbExhbmd1YWdlID0gdGhpcy5sYW5ndWFnZTsKICAgICAgbGV0IG1vZGFsV29yZFdyYXAgPSB0aGlzLndvcmRXcmFwOwogICAgICBsZXQgbW9kYWxTaG93TGluZU51bWJlcnMgPSB0aGlzLnNob3dMaW5lTnVtYmVyczsKICAgICAgbGV0IG1vZGFsTGFuZ3VhZ2VEcm9wZG93bk9wZW4gPSBmYWxzZTsKICAgICAgbGV0IG1vZGFsQ29weVN1Y2Nlc3MgPSBmYWxzZTsKICAgICAgY29uc3QgZ2V0TGFuZ3VhZ2VMYWJlbCA9ICgpID0+IHsKICAgICAgICBjb25zdCBsYW5nID0gTEFOR1VBR0VTLmZpbmQoKGw2KSA9PiBsNi5rZXkgPT09IG1vZGFsTGFuZ3VhZ2UpOwogICAgICAgIHJldHVybiBsYW5nID8gbGFuZy5sYWJlbCA6ICJUeXBlU2NyaXB0IjsKICAgICAgfTsKICAgICAgY29uc3QgdXBkYXRlVG9vbGJhclVJID0gKG1vZGFsMikgPT4gewogICAgICAgIGNvbnN0IHRvb2xiYXIyID0gbW9kYWwyLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5tb2RhbC10b29sYmFyIik7CiAgICAgICAgaWYgKCF0b29sYmFyMikKICAgICAgICAgIHJldHVybjsKICAgICAgICBjb25zdCBsYW5nQnRuID0gdG9vbGJhcjIucXVlcnlTZWxlY3RvcigiLmxhbmd1YWdlLWJ1dHRvbiBzcGFuIik7CiAgICAgICAgaWYgKGxhbmdCdG4pCiAgICAgICAgICBsYW5nQnRuLnRleHRDb250ZW50ID0gZ2V0TGFuZ3VhZ2VMYWJlbCgpOwogICAgICAgIGNvbnN0IHdyYXBCdG4gPSB0b29sYmFyMi5xdWVyeVNlbGVjdG9yKCIud3JhcC1idG4iKTsKICAgICAgICBpZiAod3JhcEJ0bikgewogICAgICAgICAgd3JhcEJ0bi5jbGFzc0xpc3QudG9nZ2xlKCJhY3RpdmUiLCBtb2RhbFdvcmRXcmFwID09PSAib24iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGluZXNCdG4gPSB0b29sYmFyMi5xdWVyeVNlbGVjdG9yKCIubGluZXMtYnRuIik7CiAgICAgICAgaWYgKGxpbmVzQnRuKSB7CiAgICAgICAgICBsaW5lc0J0bi5jbGFzc0xpc3QudG9nZ2xlKCJhY3RpdmUiLCBtb2RhbFNob3dMaW5lTnVtYmVycyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNvcHlCdG4gPSB0b29sYmFyMi5xdWVyeVNlbGVjdG9yKCIuY29weS1idG4iKTsKICAgICAgICBjb25zdCBjb3B5SWNvbiA9IGNvcHlCdG4/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtaWNvbiIpOwogICAgICAgIGlmIChjb3B5QnRuICYmIGNvcHlJY29uKSB7CiAgICAgICAgICBjb3B5QnRuLmNsYXNzTGlzdC50b2dnbGUoInN1Y2Nlc3MiLCBtb2RhbENvcHlTdWNjZXNzKTsKICAgICAgICAgIGNvcHlJY29uLmljb24gPSBtb2RhbENvcHlTdWNjZXNzID8gImx1Y2lkZTpDaGVjayIgOiAibHVjaWRlOkNvcHkiOwogICAgICAgIH0KICAgICAgICBjb25zdCBkcm9wZG93biA9IHRvb2xiYXIyLnF1ZXJ5U2VsZWN0b3IoIi5sYW5ndWFnZS1kcm9wZG93biIpOwogICAgICAgIGlmIChkcm9wZG93bikgewogICAgICAgICAgZHJvcGRvd24uc3R5bGUuZGlzcGxheSA9IG1vZGFsTGFuZ3VhZ2VEcm9wZG93bk9wZW4gPyAiYmxvY2siIDogIm5vbmUiOwogICAgICAgIH0KICAgICAgfTsKICAgICAgY29uc3QgbW9kYWwgPSBhd2FpdCBEZWVzTW9kYWwuY3JlYXRlQW5kU2hvdyh7CiAgICAgICAgaGVhZGluZzogdGhpcy5sYWJlbCB8fCAiQ29kZSBFZGl0b3IiLAogICAgICAgIHdpZHRoOiAiZnVsbHNjcmVlbiIsCiAgICAgICAgY29udGVudFBhZGRpbmc6IDAsCiAgICAgICAgY29udGVudDogYjJgCiAgICAgICAgPHN0eWxlPgogICAgICAgICAgLm1vZGFsLXRvb2xiYXIgewogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTclKSIsICJoc2woMCAwJSA3JSkiKX07CiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgICB9CiAgICAgICAgICAubW9kYWwtdG9vbGJhciAudG9vbGJhci1sZWZ0IHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgICB9CiAgICAgICAgICAubW9kYWwtdG9vbGJhciAudG9vbGJhci1yaWdodCB7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgIGdhcDogNHB4OwogICAgICAgICAgfQogICAgICAgICAgLm1vZGFsLXRvb2xiYXIgLmxhbmd1YWdlLXNlbGVjdG9yIHsKICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgfQogICAgICAgICAgLm1vZGFsLXRvb2xiYXIgLmxhbmd1YWdlLWJ1dHRvbiB7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgIGdhcDogNnB4OwogICAgICAgICAgICBwYWRkaW5nOiA0cHggMTBweDsKICAgICAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgMTIlKSIpfTsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAyMCUpIil9OwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAyMCUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgICAgfQogICAgICAgICAgLm1vZGFsLXRvb2xiYXIgLmxhbmd1YWdlLWJ1dHRvbjpob3ZlciB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NSUpIiwgImhzbCgwIDAlIDE1JSkiKX07CiAgICAgICAgICB9CiAgICAgICAgICAubW9kYWwtdG9vbGJhciAubGFuZ3VhZ2UtZHJvcGRvd24gewogICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgIHRvcDogMTAwJTsKICAgICAgICAgICAgbGVmdDogMDsKICAgICAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDIwJSkiKX07CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuMTUpOwogICAgICAgICAgICB6LWluZGV4OiAxMDA7CiAgICAgICAgICAgIG1heC1oZWlnaHQ6IDI1MHB4OwogICAgICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgICAgICBtaW4td2lkdGg6IDE0MHB4OwogICAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgICAgfQogICAgICAgICAgLm1vZGFsLXRvb2xiYXIgLmxhbmd1YWdlLW9wdGlvbiB7CiAgICAgICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAyMCUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMgZWFzZTsKICAgICAgICAgIH0KICAgICAgICAgIC5tb2RhbC10b29sYmFyIC5sYW5ndWFnZS1vcHRpb246aG92ZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUlKSIsICJoc2woMCAwJSAxNSUpIil9OwogICAgICAgICAgfQogICAgICAgICAgLm1vZGFsLXRvb2xiYXIgLmxhbmd1YWdlLW9wdGlvbi5zZWxlY3RlZCB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5MCUpIiwgImhzbCgwIDAlIDIwJSkiKX07CiAgICAgICAgICB9CiAgICAgICAgICAubW9kYWwtdG9vbGJhciAudG9vbGJhci1idXR0b24gewogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDUlKSIsICJoc2woMCAwJSA2MCUpIil9OwogICAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICAgIH0KICAgICAgICAgIC5tb2RhbC10b29sYmFyIC50b29sYmFyLWJ1dHRvbjpob3ZlciB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5MCUpIiwgImhzbCgwIDAlIDE1JSkiKX07CiAgICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMjAlKSIsICJoc2woMCAwJSA5MCUpIil9OwogICAgICAgICAgfQogICAgICAgICAgLm1vZGFsLXRvb2xiYXIgLnRvb2xiYXItYnV0dG9uLmFjdGl2ZSB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4NSUpIiwgImhzbCgwIDAlIDIwJSkiKX07CiAgICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMjAlKSIsICJoc2woMCAwJSA5MCUpIil9OwogICAgICAgICAgfQogICAgICAgICAgLm1vZGFsLXRvb2xiYXIgLnRvb2xiYXItYnV0dG9uLnN1Y2Nlc3MgewogICAgICAgICAgICBjb2xvcjogaHNsKDE0Mi4xIDc2LjIlIDM2LjMlKTsKICAgICAgICAgIH0KICAgICAgICAgIC5tb2RhbC10b29sYmFyIC50b29sYmFyLWRpdmlkZXIgewogICAgICAgICAgICB3aWR0aDogMXB4OwogICAgICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4NSUpIiwgImhzbCgwIDAlIDIwJSkiKX07CiAgICAgICAgICAgIG1hcmdpbjogMCA0cHg7CiAgICAgICAgICB9CiAgICAgICAgICAubW9kYWwtZWRpdG9yLXdyYXBwZXIgewogICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgIGhlaWdodDogY2FsYygxMDB2aCAtIDE3NXB4KTsKICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICB9CiAgICAgICAgPC9zdHlsZT4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC10b29sYmFyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItbGVmdCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Imxhbmd1YWdlLXNlbGVjdG9yIj4KICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJsYW5ndWFnZS1idXR0b24iPgogICAgICAgICAgICAgICAgPHNwYW4+JHtnZXRMYW5ndWFnZUxhYmVsKCl9PC9zcGFuPgogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6Q2hldnJvbkRvd24ifSBpY29uU2l6ZT0iMTQiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imxhbmd1YWdlLWRyb3Bkb3duIj4KICAgICAgICAgICAgICAgICR7TEFOR1VBR0VTLm1hcCgobGFuZykgPT4gYjJgCiAgICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgICBjbGFzcz0ibGFuZ3VhZ2Utb3B0aW9uICR7bGFuZy5rZXkgPT09IG1vZGFsTGFuZ3VhZ2UgPyAic2VsZWN0ZWQiIDogIiJ9IgogICAgICAgICAgICAgICAgICAgIGRhdGEtbGFuZz0iJHtsYW5nLmtleX0iCiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAke2xhbmcubGFiZWx9CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgYCl9CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sYmFyLXJpZ2h0Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idG9vbGJhci1idXR0b24gd3JhcC1idG4gJHttb2RhbFdvcmRXcmFwID09PSAib24iID8gImFjdGl2ZSIgOiAiIn0iIHRpdGxlPSJXb3JkIFdyYXAiPgogICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOldyYXBUZXh0In0gaWNvblNpemU9IjE2Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InRvb2xiYXItYnV0dG9uIGxpbmVzLWJ0biAke21vZGFsU2hvd0xpbmVOdW1iZXJzID8gImFjdGl2ZSIgOiAiIn0iIHRpdGxlPSJMaW5lIE51bWJlcnMiPgogICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOkhhc2gifSBpY29uU2l6ZT0iMTYiPjwvZGVlcy1pY29uPgogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9vbGJhci1kaXZpZGVyIj48L2Rpdj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idG9vbGJhci1idXR0b24gY29weS1idG4iIHRpdGxlPSJDb3B5IENvZGUiPgogICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOkNvcHkifSBpY29uU2l6ZT0iMTYiPjwvZGVlcy1pY29uPgogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWVkaXRvci13cmFwcGVyIj4KICAgICAgICAgIDxkZWVzLXdvcmtzcGFjZS1tb25hY28KICAgICAgICAgICAgLmNvbnRlbnQ9JHtjdXJyZW50VmFsdWV9CiAgICAgICAgICAgIC5sYW5ndWFnZT0ke21vZGFsTGFuZ3VhZ2V9CiAgICAgICAgICAgIC53b3JkV3JhcD0ke21vZGFsV29yZFdyYXB9CiAgICAgICAgICA+PC9kZWVzLXdvcmtzcGFjZS1tb25hY28+CiAgICAgICAgPC9kaXY+CiAgICAgIGAsCiAgICAgICAgbWVudU9wdGlvbnM6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgbmFtZTogIkNhbmNlbCIsCiAgICAgICAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsUmVmKSA9PiB7CiAgICAgICAgICAgICAgYXdhaXQgbW9kYWxSZWYuZGVzdHJveSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiU2F2ZSAmIENsb3NlIiwKICAgICAgICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWxSZWYpID0+IHsKICAgICAgICAgICAgICBtb2RhbEVkaXRvckVsZW1lbnQgPSBtb2RhbFJlZi5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCJkZWVzLXdvcmtzcGFjZS1tb25hY28iKTsKICAgICAgICAgICAgICBpZiAobW9kYWxFZGl0b3JFbGVtZW50KSB7CiAgICAgICAgICAgICAgICBjb25zdCBlZGl0b3IgPSBhd2FpdCBtb2RhbEVkaXRvckVsZW1lbnQuZWRpdG9yRGVmZXJyZWQucHJvbWlzZTsKICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZWRpdG9yLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKG5ld1ZhbHVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYXdhaXQgbW9kYWxSZWYuZGVzdHJveSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9KTsKICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUyLCAxMDApKTsKICAgICAgbW9kYWxFZGl0b3JFbGVtZW50ID0gbW9kYWwuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiZGVlcy13b3Jrc3BhY2UtbW9uYWNvIik7CiAgICAgIGNvbnN0IHRvb2xiYXIgPSBtb2RhbC5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIubW9kYWwtdG9vbGJhciIpOwogICAgICBpZiAodG9vbGJhcikgewogICAgICAgIGNvbnN0IGxhbmdCdG4gPSB0b29sYmFyLnF1ZXJ5U2VsZWN0b3IoIi5sYW5ndWFnZS1idXR0b24iKTsKICAgICAgICBsYW5nQnRuPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgICAgIG1vZGFsTGFuZ3VhZ2VEcm9wZG93bk9wZW4gPSAhbW9kYWxMYW5ndWFnZURyb3Bkb3duT3BlbjsKICAgICAgICAgIHVwZGF0ZVRvb2xiYXJVSShtb2RhbCk7CiAgICAgICAgfSk7CiAgICAgICAgY29uc3QgbGFuZ09wdGlvbnMgPSB0b29sYmFyLnF1ZXJ5U2VsZWN0b3JBbGwoIi5sYW5ndWFnZS1vcHRpb24iKTsKICAgICAgICBsYW5nT3B0aW9ucy5mb3JFYWNoKChvcHRpb24yKSA9PiB7CiAgICAgICAgICBvcHRpb24yLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKCkgPT4gewogICAgICAgICAgICBjb25zdCBuZXdMYW5nID0gb3B0aW9uMi5kYXRhc2V0Lmxhbmc7CiAgICAgICAgICAgIGlmIChuZXdMYW5nICYmIG1vZGFsRWRpdG9yRWxlbWVudCkgewogICAgICAgICAgICAgIG1vZGFsTGFuZ3VhZ2UgPSBuZXdMYW5nOwogICAgICAgICAgICAgIG1vZGFsTGFuZ3VhZ2VEcm9wZG93bk9wZW4gPSBmYWxzZTsKICAgICAgICAgICAgICBjb25zdCBlZGl0b3IgPSBhd2FpdCBtb2RhbEVkaXRvckVsZW1lbnQuZWRpdG9yRGVmZXJyZWQucHJvbWlzZTsKICAgICAgICAgICAgICBjb25zdCBtb2RlbCA9IGVkaXRvci5nZXRNb2RlbCgpOwogICAgICAgICAgICAgIGlmIChtb2RlbCkgewogICAgICAgICAgICAgICAgd2luZG93Lm1vbmFjby5lZGl0b3Iuc2V0TW9kZWxMYW5ndWFnZShtb2RlbCwgbmV3TGFuZyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGxhbmdPcHRpb25zLmZvckVhY2goKG9wdCkgPT4gb3B0LmNsYXNzTGlzdC5yZW1vdmUoInNlbGVjdGVkIikpOwogICAgICAgICAgICAgIG9wdGlvbjIuY2xhc3NMaXN0LmFkZCgic2VsZWN0ZWQiKTsKICAgICAgICAgICAgICB1cGRhdGVUb29sYmFyVUkobW9kYWwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgICBjb25zdCB3cmFwQnRuID0gdG9vbGJhci5xdWVyeVNlbGVjdG9yKCIud3JhcC1idG4iKTsKICAgICAgICB3cmFwQnRuPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jICgpID0+IHsKICAgICAgICAgIG1vZGFsV29yZFdyYXAgPSBtb2RhbFdvcmRXcmFwID09PSAib24iID8gIm9mZiIgOiAib24iOwogICAgICAgICAgaWYgKG1vZGFsRWRpdG9yRWxlbWVudCkgewogICAgICAgICAgICBjb25zdCBlZGl0b3IgPSBhd2FpdCBtb2RhbEVkaXRvckVsZW1lbnQuZWRpdG9yRGVmZXJyZWQucHJvbWlzZTsKICAgICAgICAgICAgZWRpdG9yLnVwZGF0ZU9wdGlvbnMoeyB3b3JkV3JhcDogbW9kYWxXb3JkV3JhcCB9KTsKICAgICAgICAgIH0KICAgICAgICAgIHVwZGF0ZVRvb2xiYXJVSShtb2RhbCk7CiAgICAgICAgfSk7CiAgICAgICAgY29uc3QgbGluZXNCdG4gPSB0b29sYmFyLnF1ZXJ5U2VsZWN0b3IoIi5saW5lcy1idG4iKTsKICAgICAgICBsaW5lc0J0bj8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoKSA9PiB7CiAgICAgICAgICBtb2RhbFNob3dMaW5lTnVtYmVycyA9ICFtb2RhbFNob3dMaW5lTnVtYmVyczsKICAgICAgICAgIGlmIChtb2RhbEVkaXRvckVsZW1lbnQpIHsKICAgICAgICAgICAgY29uc3QgZWRpdG9yID0gYXdhaXQgbW9kYWxFZGl0b3JFbGVtZW50LmVkaXRvckRlZmVycmVkLnByb21pc2U7CiAgICAgICAgICAgIGVkaXRvci51cGRhdGVPcHRpb25zKHsgbGluZU51bWJlcnM6IG1vZGFsU2hvd0xpbmVOdW1iZXJzID8gIm9uIiA6ICJvZmYiIH0pOwogICAgICAgICAgfQogICAgICAgICAgdXBkYXRlVG9vbGJhclVJKG1vZGFsKTsKICAgICAgICB9KTsKICAgICAgICBjb25zdCBjb3B5QnRuID0gdG9vbGJhci5xdWVyeVNlbGVjdG9yKCIuY29weS1idG4iKTsKICAgICAgICBjb3B5QnRuPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jICgpID0+IHsKICAgICAgICAgIGlmIChtb2RhbEVkaXRvckVsZW1lbnQpIHsKICAgICAgICAgICAgY29uc3QgZWRpdG9yID0gYXdhaXQgbW9kYWxFZGl0b3JFbGVtZW50LmVkaXRvckRlZmVycmVkLnByb21pc2U7CiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQzID0gZWRpdG9yLmdldFZhbHVlKCk7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoY29udGVudDMpOwogICAgICAgICAgICAgIG1vZGFsQ29weVN1Y2Nlc3MgPSB0cnVlOwogICAgICAgICAgICAgIHVwZGF0ZVRvb2xiYXJVSShtb2RhbCk7CiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICBtb2RhbENvcHlTdWNjZXNzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB1cGRhdGVUb29sYmFyVUkobW9kYWwpOwogICAgICAgICAgICAgIH0sIDJlMyk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBjb3B5IGNvZGU6IiwgZXJyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUxMSkgPT4gewogICAgICAgICAgaWYgKG1vZGFsTGFuZ3VhZ2VEcm9wZG93bk9wZW4gJiYgIWxhbmdCdG4/LmNvbnRhaW5zKGUxMS50YXJnZXQpKSB7CiAgICAgICAgICAgIG1vZGFsTGFuZ3VhZ2VEcm9wZG93bk9wZW4gPSBmYWxzZTsKICAgICAgICAgICAgdXBkYXRlVG9vbGJhclVJKG1vZGFsKTsKICAgICAgICAgIH0KICAgICAgICB9LCB7IG9uY2U6IHRydWUgfSk7CiAgICAgIH0KICAgIH0KICAgIGdldFZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy52YWx1ZTsKICAgIH0KICAgIHNldFZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLnZhbHVlID0gdmFsdWUyOwogICAgICBpZiAodGhpcy5lZGl0b3JFbGVtZW50KSB7CiAgICAgICAgdGhpcy5lZGl0b3JFbGVtZW50LmNvbnRlbnQgPSB2YWx1ZTI7CiAgICAgICAgdGhpcy5lZGl0b3JFbGVtZW50LmVkaXRvckRlZmVycmVkLnByb21pc2UudGhlbigoZWRpdG9yKSA9PiB7CiAgICAgICAgICBpZiAoZWRpdG9yLmdldFZhbHVlKCkgIT09IHZhbHVlMikgewogICAgICAgICAgICBlZGl0b3Iuc2V0VmFsdWUodmFsdWUyKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMTkoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNJbnB1dENvZGUyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LWRhdGVwaWNrZXIvZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgZGVtb0Z1bmMxMSA9ICgpID0+IGIyYAogIDxzdHlsZT4KICAgICR7aWAKICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMjAwcHg7CiAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgIH0KICAgICAgCiAgICAgIGRlZXMtcGFuZWwgewogICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIGRlZXMtcGFuZWw6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgfQogICAgICAKICAgICAgLmRlbW8tb3V0cHV0IHsKICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAxMDUsIDI0MiwgMC4xKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgIH0KICAgICAgCiAgICAgIC5kYXRlLWdyb3VwIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogMTZweDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KICAgIGB9CiAgPC9zdHlsZT4KICAKICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IGRhdGVQaWNrZXIgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtZGF0ZXBpY2tlciIpOwogIGlmIChkYXRlUGlja2VyKSB7CiAgICBkYXRlUGlja2VyLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIChldmVudCkgPT4gewogICAgICBjb25zb2xlLmxvZygiQmFzaWMgZGF0ZSBzZWxlY3RlZDoiLCBldmVudC50YXJnZXQudmFsdWUpOwogICAgfSk7CiAgfQp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkJhc2ljIERhdGUgUGlja2VyIn0gLnN1YnRpdGxlPSR7IlNpbXBsZSBkYXRlIHNlbGVjdGlvbiB3aXRob3V0IHRpbWUifT4KICAgICAgICA8ZGVlcy1pbnB1dC1kYXRlcGlja2VyCiAgICAgICAgICBsYWJlbD0iU2VsZWN0IERhdGUiCiAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2hvb3NlIGEgZGF0ZSBmcm9tIHRoZSBjYWxlbmRhciIKICAgICAgICA+PC9kZWVzLWlucHV0LWRhdGVwaWNrZXI+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IGRhdGVUaW1lUGlja2VyID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCdkZWVzLWlucHV0LWRhdGVwaWNrZXJbbGFiZWw9IkV2ZW50IERhdGUgJiBUaW1lIl0nKTsKICBjb25zdCBhcHBvaW50bWVudFBpY2tlciA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcignZGVlcy1pbnB1dC1kYXRlcGlja2VyW2xhYmVsPSJBcHBvaW50bWVudCJdJyk7CiAgaWYgKGRhdGVUaW1lUGlja2VyKSB7CiAgICBkYXRlVGltZVBpY2tlci5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCAoZXZlbnQpID0+IHsKICAgICAgY29uc3QgdmFsdWUyID0gZXZlbnQudGFyZ2V0LnZhbHVlOwogICAgICBjb25zb2xlLmxvZygiMjRoIGZvcm1hdCBkYXRldGltZToiLCB2YWx1ZTIpOwogICAgfSk7CiAgfQogIGlmIChhcHBvaW50bWVudFBpY2tlcikgewogICAgYXBwb2ludG1lbnRQaWNrZXIuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHZhbHVlMiA9IGV2ZW50LnRhcmdldC52YWx1ZTsKICAgICAgY29uc29sZS5sb2coIjEyaCBmb3JtYXQgZGF0ZXRpbWU6IiwgdmFsdWUyKTsKICAgIH0pOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJEYXRlIGFuZCBUaW1lIFNlbGVjdGlvbiJ9IC5zdWJ0aXRsZT0keyJEYXRlIHBpY2tlcnMgd2l0aCB0aW1lIHNlbGVjdGlvbiBpbiBkaWZmZXJlbnQgZm9ybWF0cyJ9PgogICAgICAgIDxkZWVzLWlucHV0LWRhdGVwaWNrZXIKICAgICAgICAgIGxhYmVsPSJFdmVudCBEYXRlICYgVGltZSIKICAgICAgICAgIGRlc2NyaXB0aW9uPSJTZWxlY3QgYm90aCBkYXRlIGFuZCB0aW1lICgyNC1ob3VyIGZvcm1hdCkiCiAgICAgICAgICAuZW5hYmxlVGltZT0ke3RydWV9CiAgICAgICAgICB0aW1lRm9ybWF0PSIyNGgiCiAgICAgICAgPjwvZGVlcy1pbnB1dC1kYXRlcGlja2VyPgogICAgICAgIAogICAgICAgIDxkZWVzLWlucHV0LWRhdGVwaWNrZXIKICAgICAgICAgIGxhYmVsPSJBcHBvaW50bWVudCIKICAgICAgICAgIGRlc2NyaXB0aW9uPSJEYXRlIGFuZCB0aW1lIHdpdGggQU0vUE0gc2VsZWN0b3IgKDE1LW1pbnV0ZSBpbmNyZW1lbnRzKSIKICAgICAgICAgIC5lbmFibGVUaW1lPSR7dHJ1ZX0KICAgICAgICAgIHRpbWVGb3JtYXQ9IjEyaCIKICAgICAgICAgIC5taW51dGVJbmNyZW1lbnQ9JHsxNX0KICAgICAgICA+PC9kZWVzLWlucHV0LWRhdGVwaWNrZXI+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IHRpbWV6b25lUGlja2VycyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1pbnB1dC1kYXRlcGlja2VyIik7CiAgdGltZXpvbmVQaWNrZXJzLmZvckVhY2goKHBpY2tlcikgPT4gewogICAgcGlja2VyLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIChldmVudCkgPT4gewogICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7CiAgICAgIGNvbnNvbGUubG9nKGAke3RhcmdldC5sYWJlbH0gdmFsdWU6YCwgdGFyZ2V0LnZhbHVlKTsKICAgICAgY29uc3QgaW5wdXQgPSB0YXJnZXQuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmRhdGUtaW5wdXQiKTsKICAgICAgaWYgKGlucHV0KSB7CiAgICAgICAgY29uc29sZS5sb2coYCR7dGFyZ2V0LmxhYmVsfSBmb3JtYXR0ZWQ6YCwgaW5wdXQudmFsdWUpOwogICAgICB9CiAgICB9KTsKICB9KTsKfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJUaW1lem9uZSBTdXBwb3J0In0gLnN1YnRpdGxlPSR7IkRhdGUgYW5kIHRpbWUgc2VsZWN0aW9uIHdpdGggdGltZXpvbmUgYXdhcmVuZXNzIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtZGF0ZXBpY2tlcgogICAgICAgICAgbGFiZWw9Ik1lZXRpbmcgVGltZSAod2l0aCBUaW1lem9uZSkiCiAgICAgICAgICBkZXNjcmlwdGlvbj0iU2VsZWN0IGEgZGF0ZS90aW1lIGFuZCB0aW1lem9uZSBmb3IgdGhlIG1lZXRpbmciCiAgICAgICAgICAuZW5hYmxlVGltZT0ke3RydWV9CiAgICAgICAgICAuZW5hYmxlVGltZXpvbmU9JHt0cnVlfQogICAgICAgICAgdGltZUZvcm1hdD0iMjRoIgogICAgICAgICAgdGltZXpvbmU9IkFtZXJpY2EvTmV3X1lvcmsiCiAgICAgICAgPjwvZGVlcy1pbnB1dC1kYXRlcGlja2VyPgogICAgICAgIAogICAgICAgIDxkZWVzLWlucHV0LWRhdGVwaWNrZXIKICAgICAgICAgIGxhYmVsPSJHbG9iYWwgRXZlbnQgU2NoZWR1bGUiCiAgICAgICAgICBkZXNjcmlwdGlvbj0iU2NoZWR1bGUgYW4gZXZlbnQgYWNyb3NzIGRpZmZlcmVudCB0aW1lem9uZXMiCiAgICAgICAgICAuZW5hYmxlVGltZT0ke3RydWV9CiAgICAgICAgICAuZW5hYmxlVGltZXpvbmU9JHt0cnVlfQogICAgICAgICAgdGltZUZvcm1hdD0iMTJoIgogICAgICAgICAgdGltZXpvbmU9IkV1cm9wZS9Mb25kb24iCiAgICAgICAgICAubWludXRlSW5jcmVtZW50PSR7MzB9CiAgICAgICAgPjwvZGVlcy1pbnB1dC1kYXRlcGlja2VyPgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CgogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBmdXR1cmVEYXRlUGlja2VyID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCJkZWVzLWlucHV0LWRhdGVwaWNrZXIiKTsKICBpZiAoZnV0dXJlRGF0ZVBpY2tlcikgewogICAgZnV0dXJlRGF0ZVBpY2tlci5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCAoZXZlbnQpID0+IHsKICAgICAgY29uc3QgdmFsdWUyID0gZXZlbnQudGFyZ2V0LnZhbHVlOwogICAgICBpZiAodmFsdWUyKSB7CiAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXRlID0gbmV3IERhdGUodmFsdWUyKTsKICAgICAgICBjb25zdCB0b2RheSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpOwogICAgICAgIGNvbnN0IGRheXNEaWZmID0gTWF0aC5mbG9vcigoc2VsZWN0ZWREYXRlLmdldFRpbWUoKSAtIHRvZGF5LmdldFRpbWUoKSkgLyAoMWUzICogNjAgKiA2MCAqIDI0KSk7CiAgICAgICAgY29uc29sZS5sb2coYFNlbGVjdGVkIGRhdGUgaXMgJHtkYXlzRGlmZn0gZGF5cyBmcm9tIHRvZGF5YCk7CiAgICAgIH0KICAgIH0pOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJEYXRlIFJhbmdlIENvbnN0cmFpbnRzIn0gLnN1YnRpdGxlPSR7IkxpbWl0IHNlbGVjdGFibGUgZGF0ZXMgd2l0aCBtaW4gYW5kIG1heCB2YWx1ZXMifT4KICAgICAgICA8ZGVlcy1pbnB1dC1kYXRlcGlja2VyCiAgICAgICAgICBsYWJlbD0iRnV0dXJlIERhdGUgT25seSIKICAgICAgICAgIGRlc2NyaXB0aW9uPSJDYW4gb25seSBzZWxlY3QgZGF0ZXMgZnJvbSB0b2RheSB0byA5MCBkYXlzIGluIHRoZSBmdXR1cmUiCiAgICAgICAgICAubWluRGF0ZT0keygvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKX0KICAgICAgICAgIC5tYXhEYXRlPSR7bmV3IERhdGUoRGF0ZS5ub3coKSArIDkwICogMjQgKiA2MCAqIDYwICogMWUzKS50b0lTT1N0cmluZygpfQogICAgICAgID48L2RlZXMtaW5wdXQtZGF0ZXBpY2tlcj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgoKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgZm9ybWF0dGVyczIgPSB7CiAgICAiREQvTU0vWVlZWSI6ICJFdXJvcGVhbiIsCiAgICAiTU0vREQvWVlZWSI6ICJVUyIsCiAgICAiWVlZWS1NTS1ERCI6ICJJU08iCiAgfTsKICBjb25zdCBkYXRlUGlja2VycyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1pbnB1dC1kYXRlcGlja2VyIik7CiAgZGF0ZVBpY2tlcnMuZm9yRWFjaCgocGlja2VyKSA9PiB7CiAgICBwaWNrZXIuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDsKICAgICAgY29uc3QgaW5wdXQgPSB0YXJnZXQuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmRhdGUtaW5wdXQiKTsKICAgICAgaWYgKGlucHV0KSB7CiAgICAgICAgY29uc29sZS5sb2coYCR7dGFyZ2V0LmxhYmVsfSBmb3JtYXQ6YCwgaW5wdXQudmFsdWUpOwogICAgICB9CiAgICB9KTsKICB9KTsKfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJEYXRlIEZvcm1hdHMifSAuc3VidGl0bGU9JHsiRGlmZmVyZW50IGRhdGUgZGlzcGxheSBmb3JtYXRzIGZvciB2YXJpb3VzIHJlZ2lvbnMifT4KICAgICAgICA8ZGl2IGNsYXNzPSJkYXRlLWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWlucHV0LWRhdGVwaWNrZXIKICAgICAgICAgICAgbGFiZWw9IkV1cm9wZWFuIEZvcm1hdCIKICAgICAgICAgICAgZGF0ZUZvcm1hdD0iREQvTU0vWVlZWSIKICAgICAgICAgICAgLnZhbHVlPSR7KC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1kYXRlcGlja2VyPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1kYXRlcGlja2VyCiAgICAgICAgICAgIGxhYmVsPSJVUyBGb3JtYXQiCiAgICAgICAgICAgIGRhdGVGb3JtYXQ9Ik1NL0REL1lZWVkiCiAgICAgICAgICAgIC52YWx1ZT0keygvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtZGF0ZXBpY2tlcj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtZGF0ZXBpY2tlcgogICAgICAgICAgICBsYWJlbD0iSVNPIEZvcm1hdCIKICAgICAgICAgICAgZGF0ZUZvcm1hdD0iWVlZWS1NTS1ERCIKICAgICAgICAgICAgLnZhbHVlPSR7KC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1kYXRlcGlja2VyPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CgogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCByZXF1aXJlZFBpY2tlciA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC1kYXRlcGlja2VyW3JlcXVpcmVkXSIpOwogIGlmIChyZXF1aXJlZFBpY2tlcikgewogICAgcmVxdWlyZWRQaWNrZXIuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IHsKICAgICAgY29uc3QgcGlja2VyID0gcmVxdWlyZWRQaWNrZXI7CiAgICAgIGNvbnN0IHZhbHVlMiA9IHBpY2tlci5nZXRWYWx1ZSgpOwogICAgICBpZiAoIXZhbHVlMikgewogICAgICAgIGNvbnNvbGUubG9nKCJSZXF1aXJlZCBkYXRlIGZpZWxkIGlzIGVtcHR5Iik7CiAgICAgIH0KICAgIH0pOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJGb3JtIFN0YXRlcyJ9IC5zdWJ0aXRsZT0keyJSZXF1aXJlZCBhbmQgZGlzYWJsZWQgc3RhdGVzIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtZGF0ZXBpY2tlcgogICAgICAgICAgbGFiZWw9IkJpcnRoIERhdGUiCiAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhpcyBmaWVsZCBpcyByZXF1aXJlZCIKICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICBwbGFjZWhvbGRlcj0iU2VsZWN0IHlvdXIgYmlydGggZGF0ZSIKICAgICAgICA+PC9kZWVzLWlucHV0LWRhdGVwaWNrZXI+CiAgICAgICAgCiAgICAgICAgPGRlZXMtaW5wdXQtZGF0ZXBpY2tlcgogICAgICAgICAgbGFiZWw9IkRpc2FibGVkIERhdGUiCiAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhpcyBmaWVsZCBjYW5ub3QgYmUgZWRpdGVkIgogICAgICAgICAgLmRpc2FibGVkPSR7dHJ1ZX0KICAgICAgICAgIC52YWx1ZT0keygvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKX0KICAgICAgICA+PC9kZWVzLWlucHV0LWRhdGVwaWNrZXI+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IHVzUGlja2VyID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCdkZWVzLWlucHV0LWRhdGVwaWNrZXJbbGFiZWw9IlVTIENhbGVuZGFyIl0nKTsKICBjb25zdCBldVBpY2tlciA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcignZGVlcy1pbnB1dC1kYXRlcGlja2VyW2xhYmVsPSJFVSBDYWxlbmRhciJdJyk7CiAgaWYgKHVzUGlja2VyKSB7CiAgICBjb25zb2xlLmxvZygiVVMgQ2FsZW5kYXIgc3RhcnRzIG9uIFN1bmRheSAoMCkiKTsKICB9CiAgaWYgKGV1UGlja2VyKSB7CiAgICBjb25zb2xlLmxvZygiRVUgQ2FsZW5kYXIgc3RhcnRzIG9uIE1vbmRheSAoMSkiKTsKICB9Cn19PgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiQ2FsZW5kYXIgQ3VzdG9taXphdGlvbiJ9IC5zdWJ0aXRsZT0keyJEaWZmZXJlbnQgd2VlayBzdGFydCBkYXlzIGZvciB2YXJpb3VzIHJlZ2lvbnMifT4KICAgICAgICA8ZGl2IGNsYXNzPSJkYXRlLWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWlucHV0LWRhdGVwaWNrZXIKICAgICAgICAgICAgbGFiZWw9IlVTIENhbGVuZGFyIgogICAgICAgICAgICBkZXNjcmlwdGlvbj0iV2VlayBzdGFydHMgb24gU3VuZGF5IgogICAgICAgICAgICAud2Vla1N0YXJ0c09uPSR7MH0KICAgICAgICAgID48L2RlZXMtaW5wdXQtZGF0ZXBpY2tlcj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtZGF0ZXBpY2tlcgogICAgICAgICAgICBsYWJlbD0iRVUgQ2FsZW5kYXIiCiAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJXZWVrIHN0YXJ0cyBvbiBNb25kYXkiCiAgICAgICAgICAgIC53ZWVrU3RhcnRzT249JHsxfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1kYXRlcGlja2VyPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CgogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBnZW5lcmF0ZVdlZWtlbmRzID0gKCkgPT4gewogICAgY29uc3Qgd2Vla2VuZHMgPSBbXTsKICAgIGNvbnN0IG5vdzIgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTsKICAgIGNvbnN0IHllYXIgPSBub3cyLmdldEZ1bGxZZWFyKCk7CiAgICBjb25zdCBtb250aCA9IG5vdzIuZ2V0TW9udGgoKTsKICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7CiAgICB3aGlsZSAoZGF0ZS5nZXRNb250aCgpID09PSBtb250aCkgewogICAgICBpZiAoZGF0ZS5nZXREYXkoKSA9PT0gMCB8fCBkYXRlLmdldERheSgpID09PSA2KSB7CiAgICAgICAgd2Vla2VuZHMucHVzaChuZXcgRGF0ZShkYXRlKS50b0lTT1N0cmluZygpKTsKICAgICAgfQogICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyAxKTsKICAgIH0KICAgIHJldHVybiB3ZWVrZW5kczsKICB9OwogIGNvbnN0IHBpY2tlciA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC1kYXRlcGlja2VyIik7CiAgaWYgKHBpY2tlcikgewogICAgcGlja2VyLmRpc2FibGVkRGF0ZXMgPSBnZW5lcmF0ZVdlZWtlbmRzKCk7CiAgICBjb25zb2xlLmxvZygiRGlzYWJsZWQgd2Vla2VuZCBkYXRlcyBmb3IgY3VycmVudCBtb250aCIpOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJEaXNhYmxlZCBEYXRlcyJ9IC5zdWJ0aXRsZT0keyJDYWxlbmRhciB3aXRoIHNwZWNpZmljIGRhdGVzIGRpc2FibGVkICh3ZWVrZW5kcyBpbiBjdXJyZW50IG1vbnRoKSJ9PgogICAgICAgIDxkZWVzLWlucHV0LWRhdGVwaWNrZXIKICAgICAgICAgIGxhYmVsPSJBdmFpbGFiaWxpdHkgQ2FsZW5kYXIiCiAgICAgICAgICBkZXNjcmlwdGlvbj0iV2Vla2VuZHMgYXJlIGRpc2FibGVkIGZvciB0aGUgY3VycmVudCBtb250aCIKICAgICAgICA+PC9kZWVzLWlucHV0LWRhdGVwaWNrZXI+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IHRvZGF5ID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7CiAgY29uc3QgY3VycmVudE1vbnRoID0gdG9kYXkuZ2V0TW9udGgoKTsKICBjb25zdCBjdXJyZW50WWVhciA9IHRvZGF5LmdldEZ1bGxZZWFyKCk7CiAgY29uc3Qgc2FtcGxlRXZlbnRzID0gWwogICAgLy8gQ3VycmVudCB3ZWVrIGV2ZW50cwogICAgewogICAgICBkYXRlOiBgJHtjdXJyZW50WWVhcn0tJHsoY3VycmVudE1vbnRoICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfS0ke3RvZGF5LmdldERhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9YCwKICAgICAgdGl0bGU6ICJUZWFtIE1lZXRpbmciLAogICAgICB0eXBlOiAiaW5mbyIsCiAgICAgIGNvdW50OiAyCiAgICB9LAogICAgewogICAgICBkYXRlOiBgJHtjdXJyZW50WWVhcn0tJHsoY3VycmVudE1vbnRoICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfS0keyh0b2RheS5nZXREYXRlKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9YCwKICAgICAgdGl0bGU6ICJQcm9qZWN0IERlYWRsaW5lIiwKICAgICAgdHlwZTogIndhcm5pbmciCiAgICB9LAogICAgewogICAgICBkYXRlOiBgJHtjdXJyZW50WWVhcn0tJHsoY3VycmVudE1vbnRoICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfS0keyh0b2RheS5nZXREYXRlKCkgKyAyKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9YCwKICAgICAgdGl0bGU6ICJSZWxlYXNlIERheSIsCiAgICAgIHR5cGU6ICJzdWNjZXNzIgogICAgfSwKICAgIHsKICAgICAgZGF0ZTogYCR7Y3VycmVudFllYXJ9LSR7KGN1cnJlbnRNb250aCArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKX0tJHsodG9kYXkuZ2V0RGF0ZSgpICsgNSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfWAsCiAgICAgIHRpdGxlOiAiVXJnZW50IEZpeCBSZXF1aXJlZCIsCiAgICAgIHR5cGU6ICJlcnJvciIKICAgIH0sCiAgICAvLyBNdWx0aXBsZSBldmVudHMgb24gb25lIGRheQogICAgewogICAgICBkYXRlOiBgJHtjdXJyZW50WWVhcn0tJHsoY3VycmVudE1vbnRoICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfS0keyh0b2RheS5nZXREYXRlKCkgKyA3KS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9YCwKICAgICAgdGl0bGU6ICJNdWx0aXBsZSBFdmVudHMgVG9kYXkiLAogICAgICB0eXBlOiAiaW5mbyIsCiAgICAgIGNvdW50OiA1CiAgICB9LAogICAgLy8gTmV4dCBtb250aCBldmVudAogICAgewogICAgICBkYXRlOiBgJHtjdXJyZW50WWVhcn0tJHsoY3VycmVudE1vbnRoICsgMikudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfS0xNWAsCiAgICAgIHRpdGxlOiAiRnV0dXJlIFBsYW5uaW5nIFNlc3Npb24iLAogICAgICB0eXBlOiAiaW5mbyIKICAgIH0KICBdOwogIGNvbnN0IHBpY2tlciA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC1kYXRlcGlja2VyIik7CiAgaWYgKHBpY2tlcikgewogICAgcGlja2VyLmV2ZW50cyA9IHNhbXBsZUV2ZW50czsKICAgIGNvbnNvbGUubG9nKCJDYWxlbmRhciBldmVudHMgbG9hZGVkOiIsIHNhbXBsZUV2ZW50cyk7CiAgfQp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkNhbGVuZGFyIHdpdGggRXZlbnRzIn0gLnN1YnRpdGxlPSR7IlZpc3VhbCBmZWVkYmFjayBmb3Igc2NoZWR1bGVkIGV2ZW50cyJ9PgogICAgICAgIDxkZWVzLWlucHV0LWRhdGVwaWNrZXIKICAgICAgICAgIGxhYmVsPSJFdmVudCBDYWxlbmRhciIKICAgICAgICAgIGRlc2NyaXB0aW9uPSJEYXlzIHdpdGggY29sb3JlZCBkb3RzIGhhdmUgZXZlbnRzLiBIb3ZlciB0byBzZWUgZGV0YWlscy4iCiAgICAgICAgPjwvZGVlcy1pbnB1dC1kYXRlcGlja2VyPgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9ImRlbW8tb3V0cHV0IiBzdHlsZT0ibWFyZ2luLXRvcDogMTZweDsiPgogICAgICAgICAgPHN0cm9uZz5FdmVudCBMZWdlbmQ6PC9zdHJvbmc+PGJyPgogICAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDk2OWRhOyI+4pePIEluZm88L3NwYW4+IHwgCiAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICNkMjk5MjI7Ij7il48gV2FybmluZzwvc3Bhbj4gfCAKICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzJlYTA0MzsiPuKXjyBTdWNjZXNzPC9zcGFuPiB8IAogICAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2YyMjJlOyI+4pePIEVycm9yPC9zcGFuPjxicj4KICAgICAgICAgIDxlbT5EYXlzIHdpdGggbW9yZSB0aGFuIDMgZXZlbnRzIHNob3cgYSBjb3VudCBiYWRnZTwvZW0+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IHBpY2tlciA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC1kYXRlcGlja2VyIik7CiAgY29uc3Qgb3V0cHV0ID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjZXZlbnQtb3V0cHV0Iik7CiAgaWYgKHBpY2tlciAmJiBvdXRwdXQpIHsKICAgIHBpY2tlci5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCAoZXZlbnQpID0+IHsKICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0OwogICAgICBjb25zdCB2YWx1ZTIgPSB0YXJnZXQudmFsdWU7CiAgICAgIGlmICh2YWx1ZTIpIHsKICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUyKTsKICAgICAgICBjb25zdCBpbnB1dCA9IHRhcmdldC5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuZGF0ZS1pbnB1dCIpOwogICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gaW5wdXQ/LnZhbHVlIHx8ICJOL0EiOwogICAgICAgIG91dHB1dC5pbm5lckhUTUwgPSBgCiAgICAgICAgICAgICAgPHN0cm9uZz5FdmVudCB0cmlnZ2VyZWQhPC9zdHJvbmc+PGJyPgogICAgICAgICAgICAgIElTTyBWYWx1ZTogJHt2YWx1ZTJ9PGJyPgogICAgICAgICAgICAgIEZvcm1hdHRlZDogJHtmb3JtYXR0ZWRWYWx1ZX08YnI+CiAgICAgICAgICAgICAgRGF0ZSBvYmplY3Q6ICR7ZGF0ZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICBgOwogICAgICB9IGVsc2UgewogICAgICAgIG91dHB1dC5pbm5lckhUTUwgPSAiPGVtPkRhdGUgY2xlYXJlZDwvZW0+IjsKICAgICAgfQogICAgfSk7CiAgICBwaWNrZXIuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IHsKICAgICAgY29uc29sZS5sb2coIkRhdGVwaWNrZXIgbG9zdCBmb2N1cyIpOwogICAgfSk7CiAgfQp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkV2ZW50IEhhbmRsaW5nIn0gLnN1YnRpdGxlPSR7IkludGVyYWN0aXZlIGRlbW9uc3RyYXRpb24gb2YgY2hhbmdlIGV2ZW50cyJ9PgogICAgICAgIDxkZWVzLWlucHV0LWRhdGVwaWNrZXIKICAgICAgICAgIGxhYmVsPSJFdmVudCBEZW1vIgogICAgICAgICAgZGVzY3JpcHRpb249IlNlbGVjdCBhIGRhdGUgdG8gc2VlIHRoZSBldmVudCBkZXRhaWxzIgogICAgICAgID48L2RlZXMtaW5wdXQtZGF0ZXBpY2tlcj4KICAgICAgICAKICAgICAgICA8ZGl2IGlkPSJldmVudC1vdXRwdXQiIGNsYXNzPSJkZW1vLW91dHB1dCI+CiAgICAgICAgICA8ZW0+U2VsZWN0IGEgZGF0ZSB0byBzZWUgZXZlbnQgZGV0YWlscy4uLjwvZW0+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LWRhdGVwaWNrZXIvc3R5bGVzLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkYXRlcGlja2VyU3R5bGVzID0gWwogIC4uLkRlZXNJbnB1dEJhc2UuYmFzZVN0eWxlcywKICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuZGF0ZS1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiA0MHB4OwogICAgICAgIHBhZGRpbmc6IDAgMTJweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDIyNCA3MS40JSA0LjElKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNC4zIDMxLjglIDkxLjQlKSIsICJoc2woMjE3LjIgMzIuNiUgMTcuNSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjQgNzEuNCUgNC4xJSkiLCAiaHNsKDIxMCAyMCUgOTglKSIpfTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgICB9CgogICAgICAuZGF0ZS1pbnB1dDo6cGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMCA4LjklIDQ2LjElKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgfQoKICAgICAgLmRhdGUtaW5wdXQ6aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNy4yIDMyLjYlIDE3LjUlKSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCAyMCUgOTglKSIsICJoc2woMjE1IDI3LjklIDE2LjklKSIpfTsKICAgICAgfQoKICAgICAgLmRhdGUtaW5wdXQ6Zm9jdXMsCiAgICAgIC5kYXRlLWlucHV0Lm9wZW4gewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSAxMS4yJSkiLCAiaHNsKDIxMCAyMCUgOTglKSIpfTsKICAgICAgICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgb3V0bGluZS1vZmZzZXQ6IDJweDsKICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgyMjQgNzEuNCUgNC4xJSkiKX0sCiAgICAgICAgICAgICAgICAgICAgMCAwIDAgNHB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgMTEuMiUgLyAwLjEpIiwgImhzbCgyMTAgMjAlIDk4JSAvIDAuMSkiKX07CiAgICAgIH0KCiAgICAgIC5kYXRlLWlucHV0OmRpc2FibGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCAyMCUgOTglKSIsICJoc2woMjE1IDI3LjklIDE2LjklKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjAgOC45JSA0Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIC8qIEljb24gY29udGFpbmVyIHVzaW5nIGZsZXhib3ggZm9yIGJldHRlciBwb3NpdGlvbmluZyAqLwogICAgICAuaWNvbi1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDRweDsKICAgICAgICBwYWRkaW5nOiAwIDEycHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5pY29uLWNvbnRhaW5lciA+ICogewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICB9CgogICAgICAuY2FsZW5kYXItaWNvbiB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIwIDguOSUgNDYuMSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmNsZWFyLWJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjAgOC45JSA0Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2UsIGJhY2tncm91bmQtY29sb3IgMC4ycyBlYXNlOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5jbGVhci1idXR0b246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDIwJSA5OCUpIiwgImhzbCgyMTUgMjcuOSUgMTYuOSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyNCA3MS40JSA0LjElKSIsICJoc2woMjEwIDIwJSA5OCUpIil9OwogICAgICB9CgogICAgICAuY2xlYXItYnV0dG9uOmRpc2FibGVkIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBDYWxlbmRhciBQb3B1cCBTdHlsZXMgKi8KICAgICAgLmNhbGVuZGFyLXBvcHVwIHsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtLCBvcGFjaXR5OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTRweCk7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgyMjQgNzEuNCUgNC4xJSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNy4yIDMyLjYlIDE3LjUlKSIpfTsKICAgICAgICBib3gtc2hhZG93OiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiMCAxMHB4IDE1cHggLTNweCBoc2woMCAwJSAwJSAvIDAuMSksIDAgNHB4IDZweCAtNHB4IGhzbCgwIDAlIDAlIC8gMC4xKSIsICIwIDEwcHggMTVweCAtM3B4IGhzbCgwIDAlIDAlIC8gMC4yKSwgMCA0cHggNnB4IC00cHggaHNsKDAgMCUgMCUgLyAwLjIpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgICAgei1pbmRleDogNTA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBtaW4td2lkdGg6IDI4MHB4OwogICAgICB9CgogICAgICAuY2FsZW5kYXItcG9wdXAudG9wIHsKICAgICAgICBib3R0b206IGNhbGMoMTAwJSArIDRweCk7CiAgICAgICAgdG9wOiBhdXRvOwogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNHB4OwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSg0cHgpOwogICAgICB9CgogICAgICAuY2FsZW5kYXItcG9wdXAuYm90dG9tIHsKICAgICAgICB0b3A6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5jYWxlbmRhci1wb3B1cC5zaG93IHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYWxsOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAvKiBDYWxlbmRhciBIZWFkZXIgKi8KICAgICAgLmNhbGVuZGFyLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICAgIGdhcDogOHB4OwogICAgICB9CgogICAgICAubW9udGgteWVhci1kaXNwbGF5IHsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjQgNzEuNCUgNC4xJSkiLCAiaHNsKDIxMCAyMCUgOTglKSIpfTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5hdi1idXR0b24gewogICAgICAgIHdpZHRoOiAyOHB4OwogICAgICAgIGhlaWdodDogMjhweDsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIwIDguOSUgNDYuMSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5uYXYtYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCAyMCUgOTglKSIsICJoc2woMjE1IDI3LjklIDE2LjklKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjQgNzEuNCUgNC4xJSkiLCAiaHNsKDIxMCAyMCUgOTglKSIpfTsKICAgICAgfQoKICAgICAgLm5hdi1idXR0b246YWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNC4zIDMxLjglIDkxLjQlKSIsICJoc2woMjE3LjIgMzIuNiUgMTcuNSUpIil9OwogICAgICB9CgogICAgICAvKiBXZWVrZGF5IGhlYWRlcnMgKi8KICAgICAgLndlZWtkYXlzIHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDcsIDFmcik7CiAgICAgICAgZ2FwOiAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgICAgfQoKICAgICAgLndlZWtkYXkgewogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjAgOC45JSA0Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgICAgcGFkZGluZzogMCAwIDhweCAwOwogICAgICB9CgogICAgICAvKiBEYXlzIGdyaWQgKi8KICAgICAgLmRheXMtZ3JpZCB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCg3LCAxZnIpOwogICAgICAgIGdhcDogMnB4OwogICAgICB9CgogICAgICAuZGF5IHsKICAgICAgICBhc3BlY3QtcmF0aW86IDE7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjI0IDcxLjQlIDQuMSUpIiwgImhzbCgyMTAgMjAlIDk4JSkiKX07CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIHdpZHRoOiAzNnB4OwogICAgICAgIGhlaWdodDogMzZweDsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgLmRheTpob3Zlcjpub3QoLmRpc2FibGVkKSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgMjAlIDk4JSkiLCAiaHNsKDIxNSAyNy45JSAxNi45JSkiKX07CiAgICAgIH0KCiAgICAgIC5kYXkub3RoZXItbW9udGggewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMCA4LjklIDQ2LjElKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIC5kYXkudG9kYXkgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDIwJSA5OCUpIiwgImhzbCgyMTUgMjcuOSUgMTYuOSUpIil9OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5kYXkuc2VsZWN0ZWQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgMTEuMiUpIiwgImhzbCgyMTAgMjAlIDk4JSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDIwJSA5OCUpIiwgImhzbCgyMjIuMiA0Ny40JSAxMS4yJSkiKX07CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLmRheS5kaXNhYmxlZCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIwIDguOSUgNDYuMSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgICAgb3BhY2l0eTogMC4zOwogICAgICB9CgogICAgICAvKiBFdmVudCBpbmRpY2F0b3JzICovCiAgICAgIC5kYXkuaGFzLWV2ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5ldmVudC1pbmRpY2F0b3IgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDRweDsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiAycHg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5ldmVudC1kb3QgewogICAgICAgIHdpZHRoOiA0cHg7CiAgICAgICAgaGVpZ2h0OiA0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIwIDguOSUgNDYuMSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICB9CgogICAgICAuZXZlbnQtZG90LmluZm8gewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjExIDcwJSA1MiUpIiwgImhzbCgyMTEgNzAlIDYyJSkiKX07CiAgICAgIH0KCiAgICAgIC5ldmVudC1kb3Qud2FybmluZyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCg0NSA5MCUgNDUlKSIsICJoc2woNDUgOTAlIDU1JSkiKX07CiAgICAgIH0KCiAgICAgIC5ldmVudC1kb3Quc3VjY2VzcyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgxNDIgNjklIDQ1JSkiLCAiaHNsKDE0MiA2OSUgNTUlKSIpfTsKICAgICAgfQoKICAgICAgLmV2ZW50LWRvdC5lcnJvciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcyJSA1MSUpIiwgImhzbCgwIDcyJSA2MSUpIil9OwogICAgICB9CgogICAgICAuZXZlbnQtY291bnQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDJweDsKICAgICAgICByaWdodDogMnB4OwogICAgICAgIG1pbi13aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgcGFkZGluZzogMCA0cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcyJSA1MSUpIiwgImhzbCgwIDcyJSA2MSUpIil9OwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICB9CgogICAgICAvKiBUb29sdGlwIGZvciBldmVudCBkZXRhaWxzICovCiAgICAgIC5ldmVudC10b29sdGlwIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiBjYWxjKDEwMCUgKyA4cHgpOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDIwJSkiLCAiaHNsKDAgMCUgOTAlKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDAlKSIpfTsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZTsKICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgICB9CgogICAgICAuZXZlbnQtdG9vbHRpcDo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDEwMCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgICAgICBib3JkZXI6IDRweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMjAlKSIsICJoc2woMCAwJSA5MCUpIil9OwogICAgICB9CgogICAgICAuZGF5Lmhhcy1ldmVudDpob3ZlciAuZXZlbnQtdG9vbHRpcCB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLyogVGltZSBzZWxlY3RvciAqLwogICAgICAudGltZS1zZWxlY3RvciB7CiAgICAgICAgbWFyZ2luLXRvcDogMTJweDsKICAgICAgICBwYWRkaW5nLXRvcDogMTJweDsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNy4yIDMyLjYlIDE3LjUlKSIpfTsKICAgICAgfQoKICAgICAgLnRpbWUtc2VsZWN0b3ItdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjAgOC45JSA0Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgIH0KCiAgICAgIC50aW1lLWlucHV0cyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAudGltZS1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDY1cHg7CiAgICAgICAgaGVpZ2h0OiAzNnB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgOTEuNCUpIiwgImhzbCgyMTcuMiAzMi42JSAxNy41JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIHBhZGRpbmc6IDAgMTJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMjI0IDcxLjQlIDQuMSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyNCA3MS40JSA0LjElKSIsICJoc2woMjEwIDIwJSA5OCUpIil9OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgIH0KCiAgICAgIC50aW1lLWlucHV0OmhvdmVyIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgOTEuNCUpIiwgImhzbCgyMTcuMiAzMi42JSAxNy41JSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgMjAlIDk4JSkiLCAiaHNsKDIxNSAyNy45JSAxNi45JSkiKX07CiAgICAgIH0KCiAgICAgIC50aW1lLWlucHV0OmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSAxMS4yJSkiLCAiaHNsKDIxMCAyMCUgOTglKSIpfTsKICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSAxMS4yJSAvIDAuMSkiLCAiaHNsKDIxMCAyMCUgOTglIC8gMC4xKSIpfTsKICAgICAgfQoKICAgICAgLnRpbWUtc2VwYXJhdG9yIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjAgOC45JSA0Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgIH0KCiAgICAgIC5hbS1wbS1zZWxlY3RvciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDRweDsKICAgICAgICBtYXJnaW4tbGVmdDogOHB4OwogICAgICB9CgogICAgICAuYW0tcG0tYnV0dG9uIHsKICAgICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNC4zIDMxLjglIDkxLjQlKSIsICJoc2woMjE3LjIgMzIuNiUgMTcuNSUpIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMjI0IDcxLjQlIDQuMSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjAgOC45JSA0Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgIH0KCiAgICAgIC5hbS1wbS1idXR0b24uc2VsZWN0ZWQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgMTEuMiUpIiwgImhzbCgyMTAgMjAlIDk4JSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDIwJSA5OCUpIiwgImhzbCgyMjIuMiA0Ny40JSAxMS4yJSkiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDExLjIlKSIsICJoc2woMjEwIDIwJSA5OCUpIil9OwogICAgICB9CgogICAgICAuYW0tcG0tYnV0dG9uOmhvdmVyOm5vdCguc2VsZWN0ZWQpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCAyMCUgOTglKSIsICJoc2woMjE1IDI3LjklIDE2LjklKSIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgOTEuNCUpIiwgImhzbCgyMTcuMiAzMi42JSAxNy41JSkiKX07CiAgICAgIH0KCiAgICAgIC8qIEFjdGlvbiBidXR0b25zICovCiAgICAgIC5jYWxlbmRhci1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogOHB4OwogICAgICAgIG1hcmdpbi10b3A6IDEycHg7CiAgICAgICAgcGFkZGluZy10b3A6IDEycHg7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgOTEuNCUpIiwgImhzbCgyMTcuMiAzMi42JSAxNy41JSkiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIGhlaWdodDogMzZweDsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLnRvZGF5LWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgyMjQgNzEuNCUgNC4xJSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNy4yIDMyLjYlIDE3LjUlKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjQgNzEuNCUgNC4xJSkiLCAiaHNsKDIxMCAyMCUgOTglKSIpfTsKICAgICAgfQoKICAgICAgLnRvZGF5LWJ1dHRvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgMjAlIDk4JSkiLCAiaHNsKDIxNSAyNy45JSAxNi45JSkiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNC4zIDMxLjglIDkxLjQlKSIsICJoc2woMjE3LjIgMzIuNiUgMTcuNSUpIil9OwogICAgICB9CgogICAgICAudG9kYXktYnV0dG9uOmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNy4yIDMyLjYlIDE3LjUlKSIpfTsKICAgICAgfQoKICAgICAgLmNsZWFyLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIwIDguOSUgNDYuMSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICB9CgogICAgICAuY2xlYXItYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzIuMiUgNTAuNiUgLyAwLjEpIiwgImhzbCgwIDYyLjglIDMwLjYlIC8gMC4xKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcyLjIlIDUwLjYlKSIsICJoc2woMCA2Mi44JSAzMC42JSkiKX07CiAgICAgIH0KCiAgICAgIC5jbGVhci1idXR0b246YWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzIuMiUgNTAuNiUgLyAwLjIpIiwgImhzbCgwIDYyLjglIDMwLjYlIC8gMC4yKSIpfTsKICAgICAgfQoKICAgICAgLyogVGltZXpvbmUgc2VsZWN0b3IgKi8KICAgICAgLnRpbWV6b25lLXNlbGVjdG9yIHsKICAgICAgICBtYXJnaW4tdG9wOiAxMnB4OwogICAgICAgIHBhZGRpbmctdG9wOiAxMnB4OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNC4zIDMxLjglIDkxLjQlKSIsICJoc2woMjE3LjIgMzIuNiUgMTcuNSUpIil9OwogICAgICB9CgogICAgICAudGltZXpvbmUtc2VsZWN0b3ItdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjAgOC45JSA0Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgIH0KCiAgICAgIC50aW1lem9uZS1zZWxlY3QgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMzZweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNC4zIDMxLjglIDkxLjQlKSIsICJoc2woMjE3LjIgMzIuNiUgMTcuNSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBwYWRkaW5nOiAwIDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMjI0IDcxLjQlIDQuMSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyNCA3MS40JSA0LjElKSIsICJoc2woMjEwIDIwJSA5OCUpIil9OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogICAgICB9CgogICAgICAudGltZXpvbmUtc2VsZWN0OmhvdmVyIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgOTEuNCUpIiwgImhzbCgyMTcuMiAzMi42JSAxNy41JSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgMjAlIDk4JSkiLCAiaHNsKDIxNSAyNy45JSAxNi45JSkiKX07CiAgICAgIH0KCiAgICAgIC50aW1lem9uZS1zZWxlY3Q6Zm9jdXMgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDExLjIlKSIsICJoc2woMjEwIDIwJSA5OCUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDExLjIlIC8gMC4xKSIsICJoc2woMjEwIDIwJSA5OCUgLyAwLjEpIil9OwogICAgICB9CiAgICBgCl07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1kYXRlcGlja2VyL3RlbXBsYXRlLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciByZW5kZXJEYXRlcGlja2VyID0gKGNvbXBvbmVudCkgPT4gewogIGNvbnN0IG1vbnRoTmFtZXMgPSBbCiAgICAiSmFudWFyeSIsCiAgICAiRmVicnVhcnkiLAogICAgIk1hcmNoIiwKICAgICJBcHJpbCIsCiAgICAiTWF5IiwKICAgICJKdW5lIiwKICAgICJKdWx5IiwKICAgICJBdWd1c3QiLAogICAgIlNlcHRlbWJlciIsCiAgICAiT2N0b2JlciIsCiAgICAiTm92ZW1iZXIiLAogICAgIkRlY2VtYmVyIgogIF07CiAgY29uc3Qgd2Vla0RheXMgPSBjb21wb25lbnQud2Vla1N0YXJ0c09uID09PSAxID8gWyJNbyIsICJUdSIsICJXZSIsICJUaCIsICJGciIsICJTYSIsICJTdSJdIDogWyJTdSIsICJNbyIsICJUdSIsICJXZSIsICJUaCIsICJGciIsICJTYSJdOwogIGNvbnN0IGRheXMyID0gY29tcG9uZW50LmdldERheXNJbk1vbnRoKCk7CiAgY29uc3QgaXNBTSA9IGNvbXBvbmVudC5zZWxlY3RlZEhvdXIgPCAxMjsKICBjb25zdCB0aW1lem9uZXMgPSBjb21wb25lbnQuZ2V0VGltZXpvbmVzKCk7CiAgcmV0dXJuIGIyYAogICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LXdyYXBwZXIiPgogICAgICAgICAgPGRlZXMtbGFiZWwgLmxhYmVsPSR7Y29tcG9uZW50LmxhYmVsfSAuZGVzY3JpcHRpb249JHtjb21wb25lbnQuZGVzY3JpcHRpb259IC5yZXF1aXJlZD0ke2NvbXBvbmVudC5yZXF1aXJlZH0+PC9kZWVzLWxhYmVsPgogICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtY29udGFpbmVyIj4KICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgdHlwZT0idGV4dCIKICAgICAgICAgICAgICBjbGFzcz0iZGF0ZS1pbnB1dCAke2NvbXBvbmVudC5pc09wZW5lZCA/ICJvcGVuIiA6ICIifSIKICAgICAgICAgICAgICAudmFsdWU9JHtjb21wb25lbnQuZm9ybWF0RGF0ZShjb21wb25lbnQudmFsdWUpfQogICAgICAgICAgICAgIC5wbGFjZWhvbGRlcj0ke2NvbXBvbmVudC5wbGFjZWhvbGRlcn0KICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHtjb21wb25lbnQuZGlzYWJsZWR9CiAgICAgICAgICAgICAgQGNsaWNrPSR7Y29tcG9uZW50LnRvZ2dsZUNhbGVuZGFyfQogICAgICAgICAgICAgIEBrZXlkb3duPSR7Y29tcG9uZW50LmhhbmRsZUtleWRvd259CiAgICAgICAgICAgICAgQGlucHV0PSR7Y29tcG9uZW50LmhhbmRsZU1hbnVhbElucHV0fQogICAgICAgICAgICAgIEBibHVyPSR7Y29tcG9uZW50LmhhbmRsZUlucHV0Qmx1cn0KICAgICAgICAgICAgICBzdHlsZT0icGFkZGluZy1yaWdodDogJHtjb21wb25lbnQudmFsdWUgPyAiNjRweCIgOiAiNDBweCJ9IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpY29uLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgJHtjb21wb25lbnQudmFsdWUgJiYgIWNvbXBvbmVudC5kaXNhYmxlZCA/IGIyYAogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xlYXItYnV0dG9uIiBAY2xpY2s9JHtjb21wb25lbnQuY2xlYXJWYWx1ZX0gdGl0bGU9IkNsZWFyIj4KICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6eCIgaWNvblNpemU9IjE0Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICA8ZGVlcy1pY29uIGNsYXNzPSJjYWxlbmRhci1pY29uIiBpY29uPSJsdWNpZGU6Y2FsZW5kYXIiIGljb25TaXplPSIxNiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgCiAgICAgICAgICAgIDwhLS0gQ2FsZW5kYXIgUG9wdXAgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhbGVuZGFyLXBvcHVwICR7Y29tcG9uZW50LmlzT3BlbmVkID8gInNob3ciIDogIiJ9ICR7Y29tcG9uZW50Lm9wZW5zVG9Ub3AgPyAidG9wIiA6ICJib3R0b20ifSI+CiAgICAgICAgICAgICAgPCEtLSBNb250aC9ZZWFyIE5hdmlnYXRpb24gLS0+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FsZW5kYXItaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Im5hdi1idXR0b24iIEBjbGljaz0ke2NvbXBvbmVudC5wcmV2aW91c01vbnRofT4KICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6Y2hldnJvbkxlZnQiIGljb25TaXplPSIxNiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vbnRoLXllYXItZGlzcGxheSI+CiAgICAgICAgICAgICAgICAgICR7bW9udGhOYW1lc1tjb21wb25lbnQudmlld0RhdGUuZ2V0TW9udGgoKV19ICR7Y29tcG9uZW50LnZpZXdEYXRlLmdldEZ1bGxZZWFyKCl9CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Im5hdi1idXR0b24iIEBjbGljaz0ke2NvbXBvbmVudC5uZXh0TW9udGh9PgogICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpjaGV2cm9uUmlnaHQiIGljb25TaXplPSIxNiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgPCEtLSBXZWVrZGF5IEhlYWRlcnMgLS0+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2Vla2RheXMiPgogICAgICAgICAgICAgICAgJHt3ZWVrRGF5cy5tYXAoKGRheSkgPT4gYjJgPGRpdiBjbGFzcz0id2Vla2RheSI+JHtkYXl9PC9kaXY+YCl9CiAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgIDwhLS0gRGF5cyBHcmlkIC0tPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRheXMtZ3JpZCI+CiAgICAgICAgICAgICAgICAke2RheXMyLm1hcCgoZGF5KSA9PiB7CiAgICBjb25zdCBpc1RvZGF5MyA9IGNvbXBvbmVudC5pc1RvZGF5KGRheSk7CiAgICBjb25zdCBpc1NlbGVjdGVkID0gY29tcG9uZW50LmlzU2VsZWN0ZWQoZGF5KTsKICAgIGNvbnN0IGlzT3RoZXJNb250aCA9IGRheS5nZXRNb250aCgpICE9PSBjb21wb25lbnQudmlld0RhdGUuZ2V0TW9udGgoKTsKICAgIGNvbnN0IGlzRGlzYWJsZWQgPSBjb21wb25lbnQuaXNEaXNhYmxlZChkYXkpOwogICAgY29uc3QgZGF5RXZlbnRzID0gY29tcG9uZW50LmdldEV2ZW50c0ZvckRhdGUoZGF5KTsKICAgIGNvbnN0IGhhc0V2ZW50cyA9IGRheUV2ZW50cy5sZW5ndGggPiAwOwogICAgY29uc3QgdG90YWxFdmVudENvdW50ID0gZGF5RXZlbnRzLnJlZHVjZSgoc3VtLCBldmVudCkgPT4gc3VtICsgKGV2ZW50LmNvdW50IHx8IDEpLCAwKTsKICAgIHJldHVybiBiMmAKICAgICAgICAgICAgICAgICAgICA8ZGl2IAogICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImRheSAke2lzT3RoZXJNb250aCA/ICJvdGhlci1tb250aCIgOiAiIn0gJHtpc1RvZGF5MyA/ICJ0b2RheSIgOiAiIn0gJHtpc1NlbGVjdGVkID8gInNlbGVjdGVkIiA6ICIifSAke2lzRGlzYWJsZWQgPyAiZGlzYWJsZWQiIDogIiJ9ICR7aGFzRXZlbnRzID8gImhhcy1ldmVudCIgOiAiIn0iCiAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiAhaXNEaXNhYmxlZCAmJiBjb21wb25lbnQuc2VsZWN0RGF0ZShkYXkpfQogICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICR7ZGF5LmdldERhdGUoKX0KICAgICAgICAgICAgICAgICAgICAgICR7aGFzRXZlbnRzID8gYjJgCiAgICAgICAgICAgICAgICAgICAgICAgICR7dG90YWxFdmVudENvdW50ID4gMyA/IGIyYAogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV2ZW50LWNvdW50Ij4ke3RvdGFsRXZlbnRDb3VudH08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgYCA6IGIyYAogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV2ZW50LWluZGljYXRvciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2RheUV2ZW50cy5zbGljZSgwLCAzKS5tYXAoKGV2ZW50KSA9PiBiMmAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZXZlbnQtZG90ICR7ZXZlbnQudHlwZSB8fCAiaW5mbyJ9Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGApfQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICBgfQogICAgICAgICAgICAgICAgICAgICAgICAke2RheUV2ZW50c1swXS50aXRsZSA/IGIyYAogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV2ZW50LXRvb2x0aXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtkYXlFdmVudHNbMF0udGl0bGV9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3RvdGFsRXZlbnRDb3VudCA+IDEgPyBiMmAgKCske3RvdGFsRXZlbnRDb3VudCAtIDF9IG1vcmUpYCA6ICIifQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIGA7CiAgfSl9CiAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgIDwhLS0gVGltZSBTZWxlY3RvciAtLT4KICAgICAgICAgICAgICAke2NvbXBvbmVudC5lbmFibGVUaW1lID8gYjJgCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aW1lLXNlbGVjdG9yIj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGltZS1zZWxlY3Rvci10aXRsZSI+VGltZTwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aW1lLWlucHV0cyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IAogICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibnVtYmVyIiAKICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJ0aW1lLWlucHV0IiAKICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZT0ke2NvbXBvbmVudC50aW1lRm9ybWF0ID09PSAiMTJoIiA/IChjb21wb25lbnQuc2VsZWN0ZWRIb3VyID09PSAwID8gMTIgOiBjb21wb25lbnQuc2VsZWN0ZWRIb3VyID4gMTIgPyBjb21wb25lbnQuc2VsZWN0ZWRIb3VyIC0gMTIgOiBjb21wb25lbnQuc2VsZWN0ZWRIb3VyKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIikgOiBjb21wb25lbnQuc2VsZWN0ZWRIb3VyLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKX0KICAgICAgICAgICAgICAgICAgICAgIEBpbnB1dD0keyhlMTEpID0+IGNvbXBvbmVudC5oYW5kbGVIb3VySW5wdXQoZTExKX0KICAgICAgICAgICAgICAgICAgICAgIG1pbj0iJHtjb21wb25lbnQudGltZUZvcm1hdCA9PT0gIjEyaCIgPyAxIDogMH0iCiAgICAgICAgICAgICAgICAgICAgICBtYXg9IiR7Y29tcG9uZW50LnRpbWVGb3JtYXQgPT09ICIxMmgiID8gMTIgOiAyM30iCiAgICAgICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGltZS1zZXBhcmF0b3IiPjo8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IAogICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibnVtYmVyIiAKICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJ0aW1lLWlucHV0IiAKICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZT0ke2NvbXBvbmVudC5zZWxlY3RlZE1pbnV0ZS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9CiAgICAgICAgICAgICAgICAgICAgICBAaW5wdXQ9JHsoZTExKSA9PiBjb21wb25lbnQuaGFuZGxlTWludXRlSW5wdXQoZTExKX0KICAgICAgICAgICAgICAgICAgICAgIG1pbj0iMCIKICAgICAgICAgICAgICAgICAgICAgIG1heD0iNTkiCiAgICAgICAgICAgICAgICAgICAgICBzdGVwPSIke2NvbXBvbmVudC5taW51dGVJbmNyZW1lbnQgfHwgMX0iCiAgICAgICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICAgICAgICAke2NvbXBvbmVudC50aW1lRm9ybWF0ID09PSAiMTJoIiA/IGIyYAogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYW0tcG0tc2VsZWN0b3IiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIAogICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJhbS1wbS1idXR0b24gJHtpc0FNID8gInNlbGVjdGVkIiA6ICIifSIKICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiBjb21wb25lbnQuc2V0QU1QTSgiYW0iKX0KICAgICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICAgIEFNCiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIAogICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJhbS1wbS1idXR0b24gJHshaXNBTSA/ICJzZWxlY3RlZCIgOiAiIn0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gY29tcG9uZW50LnNldEFNUE0oInBtIil9CiAgICAgICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICAgICBQTQogICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICBgIDogIiJ9CgogICAgICAgICAgICAgIDwhLS0gVGltZXpvbmUgU2VsZWN0b3IgLS0+CiAgICAgICAgICAgICAgJHtjb21wb25lbnQuZW5hYmxlVGltZXpvbmUgPyBiMmAKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpbWV6b25lLXNlbGVjdG9yIj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGltZXpvbmUtc2VsZWN0b3ItdGl0bGUiPlRpbWV6b25lPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxzZWxlY3QgCiAgICAgICAgICAgICAgICAgICAgY2xhc3M9InRpbWV6b25lLXNlbGVjdCIgCiAgICAgICAgICAgICAgICAgICAgLnZhbHVlPSR7Y29tcG9uZW50LnRpbWV6b25lfQogICAgICAgICAgICAgICAgICAgIEBjaGFuZ2U9JHsoZTExKSA9PiBjb21wb25lbnQuaGFuZGxlVGltZXpvbmVDaGFuZ2UoZTExKX0KICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICR7dGltZXpvbmVzLm1hcCgodHopID0+IGIyYAogICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iJHt0ei52YWx1ZX0iID9zZWxlY3RlZD0ke3R6LnZhbHVlID09PSBjb21wb25lbnQudGltZXpvbmV9PgogICAgICAgICAgICAgICAgICAgICAgICAke3R6LmxhYmVsfQogICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgYCl9CiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgYCA6ICIifQoKICAgICAgICAgICAgICA8IS0tIEFjdGlvbiBCdXR0b25zIC0tPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhbGVuZGFyLWFjdGlvbnMiPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWN0aW9uLWJ1dHRvbiB0b2RheS1idXR0b24iIEBjbGljaz0ke2NvbXBvbmVudC5zZWxlY3RUb2RheX0+CiAgICAgICAgICAgICAgICAgIFRvZGF5CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImFjdGlvbi1idXR0b24gY2xlYXItYnV0dG9uIiBAY2xpY2s9JHtjb21wb25lbnQuY2xlYXJ9PgogICAgICAgICAgICAgICAgICBDbGVhcgogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIGA7Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1kYXRlcGlja2VyL2NvbXBvbmVudC5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2RlZXNfaWNvbigpOwp2YXIgX19lc0RlY29yYXRlMTkgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczIwID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzSW5wdXREYXRlcGlja2VyID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1pbnB1dC1kYXRlcGlja2VyIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNJbnB1dEJhc2U7CiAgbGV0IF92YWx1ZV9kZWNvcmF0b3JzOwogIGxldCBfdmFsdWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWx1ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZW5hYmxlVGltZV9kZWNvcmF0b3JzOwogIGxldCBfZW5hYmxlVGltZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2VuYWJsZVRpbWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RpbWVGb3JtYXRfZGVjb3JhdG9yczsKICBsZXQgX3RpbWVGb3JtYXRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90aW1lRm9ybWF0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9taW51dGVJbmNyZW1lbnRfZGVjb3JhdG9yczsKICBsZXQgX21pbnV0ZUluY3JlbWVudF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21pbnV0ZUluY3JlbWVudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGF0ZUZvcm1hdF9kZWNvcmF0b3JzOwogIGxldCBfZGF0ZUZvcm1hdF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RhdGVGb3JtYXRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21pbkRhdGVfZGVjb3JhdG9yczsKICBsZXQgX21pbkRhdGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9taW5EYXRlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYXhEYXRlX2RlY29yYXRvcnM7CiAgbGV0IF9tYXhEYXRlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWF4RGF0ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGlzYWJsZWREYXRlc19kZWNvcmF0b3JzOwogIGxldCBfZGlzYWJsZWREYXRlc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Rpc2FibGVkRGF0ZXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3dlZWtTdGFydHNPbl9kZWNvcmF0b3JzOwogIGxldCBfd2Vla1N0YXJ0c09uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfd2Vla1N0YXJ0c09uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wbGFjZWhvbGRlcl9kZWNvcmF0b3JzOwogIGxldCBfcGxhY2Vob2xkZXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wbGFjZWhvbGRlcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZW5hYmxlVGltZXpvbmVfZGVjb3JhdG9yczsKICBsZXQgX2VuYWJsZVRpbWV6b25lX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZW5hYmxlVGltZXpvbmVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RpbWV6b25lX2RlY29yYXRvcnM7CiAgbGV0IF90aW1lem9uZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RpbWV6b25lX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ldmVudHNfZGVjb3JhdG9yczsKICBsZXQgX2V2ZW50c19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2V2ZW50c19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNPcGVuZWRfZGVjb3JhdG9yczsKICBsZXQgX2lzT3BlbmVkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNPcGVuZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX29wZW5zVG9Ub3BfZGVjb3JhdG9yczsKICBsZXQgX29wZW5zVG9Ub3BfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vcGVuc1RvVG9wX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZERhdGVfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkRGF0ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkRGF0ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmlld0RhdGVfZGVjb3JhdG9yczsKICBsZXQgX3ZpZXdEYXRlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmlld0RhdGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkSG91cl9kZWNvcmF0b3JzOwogIGxldCBfc2VsZWN0ZWRIb3VyX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRIb3VyX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZE1pbnV0ZV9kZWNvcmF0b3JzOwogIGxldCBfc2VsZWN0ZWRNaW51dGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZE1pbnV0ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW5wdXREYXRlcGlja2VyMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3ZhbHVlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfZW5hYmxlVGltZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF90aW1lRm9ybWF0X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfbWludXRlSW5jcmVtZW50X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfZGF0ZUZvcm1hdF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX21pbkRhdGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9tYXhEYXRlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfZGlzYWJsZWREYXRlc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfd2Vla1N0YXJ0c09uX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfcGxhY2Vob2xkZXJfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9lbmFibGVUaW1lem9uZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF90aW1lem9uZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2V2ZW50c19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfaXNPcGVuZWRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX29wZW5zVG9Ub3BfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3NlbGVjdGVkRGF0ZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfdmlld0RhdGVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3NlbGVjdGVkSG91cl9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfc2VsZWN0ZWRNaW51dGVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlMTkodGhpcywgbnVsbCwgX3ZhbHVlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZhbHVlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ2YWx1ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai52YWx1ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudmFsdWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxOSh0aGlzLCBudWxsLCBfZW5hYmxlVGltZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJlbmFibGVUaW1lIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJlbmFibGVUaW1lIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmVuYWJsZVRpbWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmVuYWJsZVRpbWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZW5hYmxlVGltZV9pbml0aWFsaXplcnMsIF9lbmFibGVUaW1lX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTkodGhpcywgbnVsbCwgX3RpbWVGb3JtYXRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGltZUZvcm1hdCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGltZUZvcm1hdCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50aW1lRm9ybWF0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50aW1lRm9ybWF0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3RpbWVGb3JtYXRfaW5pdGlhbGl6ZXJzLCBfdGltZUZvcm1hdF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE5KHRoaXMsIG51bGwsIF9taW51dGVJbmNyZW1lbnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWludXRlSW5jcmVtZW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtaW51dGVJbmNyZW1lbnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWludXRlSW5jcmVtZW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5taW51dGVJbmNyZW1lbnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWludXRlSW5jcmVtZW50X2luaXRpYWxpemVycywgX21pbnV0ZUluY3JlbWVudF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE5KHRoaXMsIG51bGwsIF9kYXRlRm9ybWF0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImRhdGVGb3JtYXQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRhdGVGb3JtYXQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZGF0ZUZvcm1hdCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZGF0ZUZvcm1hdCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kYXRlRm9ybWF0X2luaXRpYWxpemVycywgX2RhdGVGb3JtYXRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxOSh0aGlzLCBudWxsLCBfbWluRGF0ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtaW5EYXRlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtaW5EYXRlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1pbkRhdGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1pbkRhdGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWluRGF0ZV9pbml0aWFsaXplcnMsIF9taW5EYXRlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTkodGhpcywgbnVsbCwgX21heERhdGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWF4RGF0ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWF4RGF0ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYXhEYXRlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tYXhEYXRlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21heERhdGVfaW5pdGlhbGl6ZXJzLCBfbWF4RGF0ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE5KHRoaXMsIG51bGwsIF9kaXNhYmxlZERhdGVzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImRpc2FibGVkRGF0ZXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRpc2FibGVkRGF0ZXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZGlzYWJsZWREYXRlcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZGlzYWJsZWREYXRlcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kaXNhYmxlZERhdGVzX2luaXRpYWxpemVycywgX2Rpc2FibGVkRGF0ZXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxOSh0aGlzLCBudWxsLCBfd2Vla1N0YXJ0c09uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIndlZWtTdGFydHNPbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAid2Vla1N0YXJ0c09uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLndlZWtTdGFydHNPbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoud2Vla1N0YXJ0c09uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3dlZWtTdGFydHNPbl9pbml0aWFsaXplcnMsIF93ZWVrU3RhcnRzT25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxOSh0aGlzLCBudWxsLCBfcGxhY2Vob2xkZXJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicGxhY2Vob2xkZXIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInBsYWNlaG9sZGVyIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnBsYWNlaG9sZGVyLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5wbGFjZWhvbGRlciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wbGFjZWhvbGRlcl9pbml0aWFsaXplcnMsIF9wbGFjZWhvbGRlcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE5KHRoaXMsIG51bGwsIF9lbmFibGVUaW1lem9uZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJlbmFibGVUaW1lem9uZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZW5hYmxlVGltZXpvbmUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZW5hYmxlVGltZXpvbmUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmVuYWJsZVRpbWV6b25lID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2VuYWJsZVRpbWV6b25lX2luaXRpYWxpemVycywgX2VuYWJsZVRpbWV6b25lX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTkodGhpcywgbnVsbCwgX3RpbWV6b25lX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRpbWV6b25lIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0aW1lem9uZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50aW1lem9uZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGltZXpvbmUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGltZXpvbmVfaW5pdGlhbGl6ZXJzLCBfdGltZXpvbmVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxOSh0aGlzLCBudWxsLCBfZXZlbnRzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImV2ZW50cyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZXZlbnRzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmV2ZW50cywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZXZlbnRzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2V2ZW50c19pbml0aWFsaXplcnMsIF9ldmVudHNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxOSh0aGlzLCBudWxsLCBfaXNPcGVuZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNPcGVuZWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImlzT3BlbmVkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzT3BlbmVkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc09wZW5lZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pc09wZW5lZF9pbml0aWFsaXplcnMsIF9pc09wZW5lZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE5KHRoaXMsIG51bGwsIF9vcGVuc1RvVG9wX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm9wZW5zVG9Ub3AiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm9wZW5zVG9Ub3AiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoub3BlbnNUb1RvcCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoub3BlbnNUb1RvcCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9vcGVuc1RvVG9wX2luaXRpYWxpemVycywgX29wZW5zVG9Ub3BfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxOSh0aGlzLCBudWxsLCBfc2VsZWN0ZWREYXRlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlbGVjdGVkRGF0ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0ZWREYXRlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGVkRGF0ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VsZWN0ZWREYXRlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGVkRGF0ZV9pbml0aWFsaXplcnMsIF9zZWxlY3RlZERhdGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxOSh0aGlzLCBudWxsLCBfdmlld0RhdGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmlld0RhdGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInZpZXdEYXRlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZpZXdEYXRlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52aWV3RGF0ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF92aWV3RGF0ZV9pbml0aWFsaXplcnMsIF92aWV3RGF0ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE5KHRoaXMsIG51bGwsIF9zZWxlY3RlZEhvdXJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0ZWRIb3VyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3RlZEhvdXIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0ZWRIb3VyLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3RlZEhvdXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0ZWRIb3VyX2luaXRpYWxpemVycywgX3NlbGVjdGVkSG91cl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE5KHRoaXMsIG51bGwsIF9zZWxlY3RlZE1pbnV0ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWxlY3RlZE1pbnV0ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0ZWRNaW51dGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0ZWRNaW51dGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlbGVjdGVkTWludXRlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGVkTWludXRlX2luaXRpYWxpemVycywgX3NlbGVjdGVkTWludXRlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTkobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzSW5wdXREYXRlcGlja2VyMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMTE7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiSW5wdXQiXTsKICAgICN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2VuYWJsZVRpbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF92YWx1ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX2VuYWJsZVRpbWVfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGVuYWJsZVRpbWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNlbmFibGVUaW1lX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZW5hYmxlVGltZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZW5hYmxlVGltZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3RpbWVGb3JtYXRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF9lbmFibGVUaW1lX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfdGltZUZvcm1hdF9pbml0aWFsaXplcnMsICIyNGgiKSk7CiAgICBnZXQgdGltZUZvcm1hdCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RpbWVGb3JtYXRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0aW1lRm9ybWF0KHZhbHVlMikgewogICAgICB0aGlzLiN0aW1lRm9ybWF0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWludXRlSW5jcmVtZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfdGltZUZvcm1hdF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX21pbnV0ZUluY3JlbWVudF9pbml0aWFsaXplcnMsIDEpKTsKICAgIGdldCBtaW51dGVJbmNyZW1lbnQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtaW51dGVJbmNyZW1lbnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtaW51dGVJbmNyZW1lbnQodmFsdWUyKSB7CiAgICAgIHRoaXMuI21pbnV0ZUluY3JlbWVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2RhdGVGb3JtYXRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF9taW51dGVJbmNyZW1lbnRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF9kYXRlRm9ybWF0X2luaXRpYWxpemVycywgIllZWVktTU0tREQiKSk7CiAgICBnZXQgZGF0ZUZvcm1hdCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2RhdGVGb3JtYXRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkYXRlRm9ybWF0KHZhbHVlMikgewogICAgICB0aGlzLiNkYXRlRm9ybWF0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWluRGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX2RhdGVGb3JtYXRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF9taW5EYXRlX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBtaW5EYXRlKCkgewogICAgICByZXR1cm4gdGhpcy4jbWluRGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1pbkRhdGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI21pbkRhdGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtYXhEYXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfbWluRGF0ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX21heERhdGVfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IG1heERhdGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtYXhEYXRlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWF4RGF0ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWF4RGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2Rpc2FibGVkRGF0ZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF9tYXhEYXRlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfZGlzYWJsZWREYXRlc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgZGlzYWJsZWREYXRlcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2Rpc2FibGVkRGF0ZXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkaXNhYmxlZERhdGVzKHZhbHVlMikgewogICAgICB0aGlzLiNkaXNhYmxlZERhdGVzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjd2Vla1N0YXJ0c09uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfZGlzYWJsZWREYXRlc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX3dlZWtTdGFydHNPbl9pbml0aWFsaXplcnMsIDEpKTsKICAgIGdldCB3ZWVrU3RhcnRzT24oKSB7CiAgICAgIHJldHVybiB0aGlzLiN3ZWVrU3RhcnRzT25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIC8vIERlZmF1bHQgdG8gTW9uZGF5CiAgICBzZXQgd2Vla1N0YXJ0c09uKHZhbHVlMikgewogICAgICB0aGlzLiN3ZWVrU3RhcnRzT25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNwbGFjZWhvbGRlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX3dlZWtTdGFydHNPbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX3BsYWNlaG9sZGVyX2luaXRpYWxpemVycywgIllZWVktTU0tREQiKSk7CiAgICBnZXQgcGxhY2Vob2xkZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwbGFjZWhvbGRlcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHBsYWNlaG9sZGVyKHZhbHVlMikgewogICAgICB0aGlzLiNwbGFjZWhvbGRlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2VuYWJsZVRpbWV6b25lX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfcGxhY2Vob2xkZXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF9lbmFibGVUaW1lem9uZV9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgZW5hYmxlVGltZXpvbmUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNlbmFibGVUaW1lem9uZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGVuYWJsZVRpbWV6b25lKHZhbHVlMikgewogICAgICB0aGlzLiNlbmFibGVUaW1lem9uZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3RpbWV6b25lX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfZW5hYmxlVGltZXpvbmVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF90aW1lem9uZV9pbml0aWFsaXplcnMsIEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSkpOwogICAgZ2V0IHRpbWV6b25lKCkgewogICAgICByZXR1cm4gdGhpcy4jdGltZXpvbmVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0aW1lem9uZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdGltZXpvbmVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNldmVudHNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF90aW1lem9uZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX2V2ZW50c19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgZXZlbnRzKCkgewogICAgICByZXR1cm4gdGhpcy4jZXZlbnRzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZXZlbnRzKHZhbHVlMikgewogICAgICB0aGlzLiNldmVudHNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpc09wZW5lZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX2V2ZW50c19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX2lzT3BlbmVkX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc09wZW5lZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzT3BlbmVkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaXNPcGVuZWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzT3BlbmVkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjb3BlbnNUb1RvcF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX2lzT3BlbmVkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfb3BlbnNUb1RvcF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgb3BlbnNUb1RvcCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI29wZW5zVG9Ub3BfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBvcGVuc1RvVG9wKHZhbHVlMikgewogICAgICB0aGlzLiNvcGVuc1RvVG9wX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0ZWREYXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfb3BlbnNUb1RvcF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX3NlbGVjdGVkRGF0ZV9pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIGdldCBzZWxlY3RlZERhdGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZERhdGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3RlZERhdGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlbGVjdGVkRGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3ZpZXdEYXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfc2VsZWN0ZWREYXRlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfdmlld0RhdGVfaW5pdGlhbGl6ZXJzLCAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkpOwogICAgZ2V0IHZpZXdEYXRlKCkgewogICAgICByZXR1cm4gdGhpcy4jdmlld0RhdGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB2aWV3RGF0ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdmlld0RhdGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWxlY3RlZEhvdXJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF92aWV3RGF0ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX3NlbGVjdGVkSG91cl9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBzZWxlY3RlZEhvdXIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZEhvdXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3RlZEhvdXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlbGVjdGVkSG91cl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NlbGVjdGVkTWludXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfc2VsZWN0ZWRIb3VyX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfc2VsZWN0ZWRNaW51dGVfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgc2VsZWN0ZWRNaW51dGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZE1pbnV0ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNlbGVjdGVkTWludXRlKHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3RlZE1pbnV0ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IGRhdGVwaWNrZXJTdHlsZXM7CiAgICBnZXRUaW1lem9uZXMoKSB7CiAgICAgIHJldHVybiBbCiAgICAgICAgeyB2YWx1ZTogIlVUQyIsIGxhYmVsOiAiVVRDIChDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSkiIH0sCiAgICAgICAgeyB2YWx1ZTogIkFtZXJpY2EvTmV3X1lvcmsiLCBsYWJlbDogIkVhc3Rlcm4gVGltZSAoVVMgJiBDYW5hZGEpIiB9LAogICAgICAgIHsgdmFsdWU6ICJBbWVyaWNhL0NoaWNhZ28iLCBsYWJlbDogIkNlbnRyYWwgVGltZSAoVVMgJiBDYW5hZGEpIiB9LAogICAgICAgIHsgdmFsdWU6ICJBbWVyaWNhL0RlbnZlciIsIGxhYmVsOiAiTW91bnRhaW4gVGltZSAoVVMgJiBDYW5hZGEpIiB9LAogICAgICAgIHsgdmFsdWU6ICJBbWVyaWNhL0xvc19BbmdlbGVzIiwgbGFiZWw6ICJQYWNpZmljIFRpbWUgKFVTICYgQ2FuYWRhKSIgfSwKICAgICAgICB7IHZhbHVlOiAiQW1lcmljYS9QaG9lbml4IiwgbGFiZWw6ICJBcml6b25hIiB9LAogICAgICAgIHsgdmFsdWU6ICJBbWVyaWNhL0FuY2hvcmFnZSIsIGxhYmVsOiAiQWxhc2thIiB9LAogICAgICAgIHsgdmFsdWU6ICJQYWNpZmljL0hvbm9sdWx1IiwgbGFiZWw6ICJIYXdhaWkiIH0sCiAgICAgICAgeyB2YWx1ZTogIkV1cm9wZS9Mb25kb24iLCBsYWJlbDogIkxvbmRvbiIgfSwKICAgICAgICB7IHZhbHVlOiAiRXVyb3BlL1BhcmlzIiwgbGFiZWw6ICJQYXJpcyIgfSwKICAgICAgICB7IHZhbHVlOiAiRXVyb3BlL0JlcmxpbiIsIGxhYmVsOiAiQmVybGluIiB9LAogICAgICAgIHsgdmFsdWU6ICJFdXJvcGUvTW9zY293IiwgbGFiZWw6ICJNb3Njb3ciIH0sCiAgICAgICAgeyB2YWx1ZTogIkFzaWEvRHViYWkiLCBsYWJlbDogIkR1YmFpIiB9LAogICAgICAgIHsgdmFsdWU6ICJBc2lhL0tvbGthdGEiLCBsYWJlbDogIkluZGlhIFN0YW5kYXJkIFRpbWUiIH0sCiAgICAgICAgeyB2YWx1ZTogIkFzaWEvU2hhbmdoYWkiLCBsYWJlbDogIkNoaW5hIFN0YW5kYXJkIFRpbWUiIH0sCiAgICAgICAgeyB2YWx1ZTogIkFzaWEvVG9reW8iLCBsYWJlbDogIlRva3lvIiB9LAogICAgICAgIHsgdmFsdWU6ICJBdXN0cmFsaWEvU3lkbmV5IiwgbGFiZWw6ICJTeWRuZXkiIH0sCiAgICAgICAgeyB2YWx1ZTogIlBhY2lmaWMvQXVja2xhbmQiLCBsYWJlbDogIkF1Y2tsYW5kIiB9CiAgICAgIF07CiAgICB9CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiByZW5kZXJEYXRlcGlja2VyKHRoaXMpOwogICAgfQogICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlID0gdGhpcy5oYW5kbGVDbGlja091dHNpZGUuYmluZCh0aGlzKTsKICAgIH0KICAgIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlKTsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZCgpIHsKICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7CiAgICAgICAgdGhpcy52YWx1ZSA9ICIiOwogICAgICB9CiAgICAgIGlmICh0aGlzLnZhbHVlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLnZhbHVlKTsKICAgICAgICAgIGlmICghaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gZGF0ZTsKICAgICAgICAgICAgdGhpcy52aWV3RGF0ZSA9IG5ldyBEYXRlKGRhdGUpOwogICAgICAgICAgICB0aGlzLnNlbGVjdGVkSG91ciA9IGRhdGUuZ2V0SG91cnMoKTsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1pbnV0ZSA9IGRhdGUuZ2V0TWludXRlcygpOwogICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggewogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBub3cyID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7CiAgICAgICAgdGhpcy52aWV3RGF0ZSA9IG5ldyBEYXRlKG5vdzIpOwogICAgICAgIHRoaXMuc2VsZWN0ZWRIb3VyID0gbm93Mi5nZXRIb3VycygpOwogICAgICAgIHRoaXMuc2VsZWN0ZWRNaW51dGUgPSAwOwogICAgICB9CiAgICB9CiAgICBmb3JtYXREYXRlKGlzb1N0cmluZykgewogICAgICBpZiAoIWlzb1N0cmluZykKICAgICAgICByZXR1cm4gIiI7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGlzb1N0cmluZyk7CiAgICAgICAgaWYgKGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkKICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICBsZXQgZm9ybWF0dGVkID0gdGhpcy5kYXRlRm9ybWF0OwogICAgICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKTsKICAgICAgICBjb25zdCBtb250aCA9IChkYXRlLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIik7CiAgICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpOwogICAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKCJZWVlZIiwgeWVhcik7CiAgICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoIllZIiwgeWVhci5zbGljZSgtMikpOwogICAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKCJNTSIsIG1vbnRoKTsKICAgICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgiREQiLCBkYXkpOwogICAgICAgIGlmICh0aGlzLmVuYWJsZVRpbWUpIHsKICAgICAgICAgIGNvbnN0IGhvdXJzMjQgPSBkYXRlLmdldEhvdXJzKCk7CiAgICAgICAgICBjb25zdCBob3VyczEyID0gaG91cnMyNCA9PT0gMCA/IDEyIDogaG91cnMyNCA+IDEyID8gaG91cnMyNCAtIDEyIDogaG91cnMyNDsKICAgICAgICAgIGNvbnN0IG1pbnV0ZXMgPSBkYXRlLmdldE1pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIik7CiAgICAgICAgICBjb25zdCBhbXBtID0gaG91cnMyNCA+PSAxMiA/ICJQTSIgOiAiQU0iOwogICAgICAgICAgaWYgKHRoaXMudGltZUZvcm1hdCA9PT0gIjEyaCIpIHsKICAgICAgICAgICAgZm9ybWF0dGVkICs9IGAgJHtob3VyczEyfToke21pbnV0ZXN9ICR7YW1wbX1gOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9ybWF0dGVkICs9IGAgJHtob3VyczI0LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKX06JHttaW51dGVzfWA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmVuYWJsZVRpbWV6b25lKSB7CiAgICAgICAgICBjb25zdCBmb3JtYXR0ZXIyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoImVuLVVTIiwgewogICAgICAgICAgICB0aW1lWm9uZU5hbWU6ICJzaG9ydCIsCiAgICAgICAgICAgIHRpbWVab25lOiB0aGlzLnRpbWV6b25lCiAgICAgICAgICB9KTsKICAgICAgICAgIGNvbnN0IHBhcnRzID0gZm9ybWF0dGVyMi5mb3JtYXRUb1BhcnRzKGRhdGUpOwogICAgICAgICAgY29uc3QgdHpQYXJ0ID0gcGFydHMuZmluZCgocGFydCkgPT4gcGFydC50eXBlID09PSAidGltZVpvbmVOYW1lIik7CiAgICAgICAgICBpZiAodHpQYXJ0KSB7CiAgICAgICAgICAgIGZvcm1hdHRlZCArPSBgICR7dHpQYXJ0LnZhbHVlfWA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmb3JtYXR0ZWQ7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHJldHVybiAiIjsKICAgICAgfQogICAgfQogICAgaGFuZGxlQ2xpY2tPdXRzaWRlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX3NlbGVjdGVkTWludXRlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHBhdGgyID0gZXZlbnQuY29tcG9zZWRQYXRoKCk7CiAgICAgIGlmICghcGF0aDIuaW5jbHVkZXModGhpcykpIHsKICAgICAgICB0aGlzLmlzT3BlbmVkID0gZmFsc2U7CiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLmhhbmRsZUNsaWNrT3V0c2lkZSk7CiAgICAgIH0KICAgIH0pOwogICAgYXN5bmMgdG9nZ2xlQ2FsZW5kYXIoKSB7CiAgICAgIGlmICh0aGlzLmRpc2FibGVkKQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5pc09wZW5lZCA9ICF0aGlzLmlzT3BlbmVkOwogICAgICBpZiAodGhpcy5pc09wZW5lZCkgewogICAgICAgIGNvbnN0IGlucHV0Q29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5pbnB1dC1jb250YWluZXIiKTsKICAgICAgICBjb25zdCByZWN0ID0gaW5wdXRDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgY29uc3Qgc3BhY2VCZWxvdyA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHJlY3QuYm90dG9tOwogICAgICAgIGNvbnN0IHNwYWNlQWJvdmUgPSByZWN0LnRvcDsKICAgICAgICB0aGlzLm9wZW5zVG9Ub3AgPSBzcGFjZUJlbG93IDwgNDAwICYmIHNwYWNlQWJvdmUgPiBzcGFjZUJlbG93OwogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLmhhbmRsZUNsaWNrT3V0c2lkZSk7CiAgICAgICAgfSwgMCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLmhhbmRsZUNsaWNrT3V0c2lkZSk7CiAgICAgIH0KICAgIH0KICAgIGdldERheXNJbk1vbnRoKCkgewogICAgICBjb25zdCB5ZWFyID0gdGhpcy52aWV3RGF0ZS5nZXRGdWxsWWVhcigpOwogICAgICBjb25zdCBtb250aCA9IHRoaXMudmlld0RhdGUuZ2V0TW9udGgoKTsKICAgICAgY29uc3QgZmlyc3REYXkgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7CiAgICAgIGNvbnN0IGxhc3REYXkgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDApOwogICAgICBjb25zdCBkYXlzMiA9IFtdOwogICAgICBjb25zdCBzdGFydE9mZnNldCA9IHRoaXMud2Vla1N0YXJ0c09uID09PSAxID8gZmlyc3REYXkuZ2V0RGF5KCkgPT09IDAgPyA2IDogZmlyc3REYXkuZ2V0RGF5KCkgLSAxIDogZmlyc3REYXkuZ2V0RGF5KCk7CiAgICAgIGZvciAobGV0IGkxMSA9IHN0YXJ0T2Zmc2V0OyBpMTEgPiAwOyBpMTEtLSkgewogICAgICAgIGRheXMyLnB1c2gobmV3IERhdGUoeWVhciwgbW9udGgsIDEgLSBpMTEpKTsKICAgICAgfQogICAgICBmb3IgKGxldCBpMTEgPSAxOyBpMTEgPD0gbGFzdERheS5nZXREYXRlKCk7IGkxMSsrKSB7CiAgICAgICAgZGF5czIucHVzaChuZXcgRGF0ZSh5ZWFyLCBtb250aCwgaTExKSk7CiAgICAgIH0KICAgICAgY29uc3QgcmVtYWluaW5nRGF5cyA9IDQyIC0gZGF5czIubGVuZ3RoOwogICAgICBmb3IgKGxldCBpMTEgPSAxOyBpMTEgPD0gcmVtYWluaW5nRGF5czsgaTExKyspIHsKICAgICAgICBkYXlzMi5wdXNoKG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgaTExKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGRheXMyOwogICAgfQogICAgaXNUb2RheShkYXRlKSB7CiAgICAgIGNvbnN0IHRvZGF5ID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7CiAgICAgIHJldHVybiBkYXRlLmdldERhdGUoKSA9PT0gdG9kYXkuZ2V0RGF0ZSgpICYmIGRhdGUuZ2V0TW9udGgoKSA9PT0gdG9kYXkuZ2V0TW9udGgoKSAmJiBkYXRlLmdldEZ1bGxZZWFyKCkgPT09IHRvZGF5LmdldEZ1bGxZZWFyKCk7CiAgICB9CiAgICBpc1NlbGVjdGVkKGRhdGUpIHsKICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkRGF0ZSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIHJldHVybiBkYXRlLmdldERhdGUoKSA9PT0gdGhpcy5zZWxlY3RlZERhdGUuZ2V0RGF0ZSgpICYmIGRhdGUuZ2V0TW9udGgoKSA9PT0gdGhpcy5zZWxlY3RlZERhdGUuZ2V0TW9udGgoKSAmJiBkYXRlLmdldEZ1bGxZZWFyKCkgPT09IHRoaXMuc2VsZWN0ZWREYXRlLmdldEZ1bGxZZWFyKCk7CiAgICB9CiAgICBpc0Rpc2FibGVkKGRhdGUpIHsKICAgICAgaWYgKHRoaXMubWluRGF0ZSkgewogICAgICAgIGNvbnN0IG1pbjMgPSBuZXcgRGF0ZSh0aGlzLm1pbkRhdGUpOwogICAgICAgIGlmIChkYXRlIDwgbWluMykKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmICh0aGlzLm1heERhdGUpIHsKICAgICAgICBjb25zdCBtYXgzID0gbmV3IERhdGUodGhpcy5tYXhEYXRlKTsKICAgICAgICBpZiAoZGF0ZSA+IG1heDMpCiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAodGhpcy5kaXNhYmxlZERhdGVzICYmIHRoaXMuZGlzYWJsZWREYXRlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWREYXRlcy5zb21lKChkaXNhYmxlZFN0cikgPT4gewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgZGlzYWJsZWQyID0gbmV3IERhdGUoZGlzYWJsZWRTdHIpOwogICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXREYXRlKCkgPT09IGRpc2FibGVkMi5nZXREYXRlKCkgJiYgZGF0ZS5nZXRNb250aCgpID09PSBkaXNhYmxlZDIuZ2V0TW9udGgoKSAmJiBkYXRlLmdldEZ1bGxZZWFyKCkgPT09IGRpc2FibGVkMi5nZXRGdWxsWWVhcigpOwogICAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBnZXRFdmVudHNGb3JEYXRlKGRhdGUpIHsKICAgICAgaWYgKCF0aGlzLmV2ZW50cyB8fCB0aGlzLmV2ZW50cy5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuIFtdOwogICAgICBjb25zdCBkYXRlU3RyID0gYCR7ZGF0ZS5nZXRGdWxsWWVhcigpfS0keyhkYXRlLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9LSR7ZGF0ZS5nZXREYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfWA7CiAgICAgIHJldHVybiB0aGlzLmV2ZW50cy5maWx0ZXIoKGV2ZW50KSA9PiBldmVudC5kYXRlID09PSBkYXRlU3RyKTsKICAgIH0KICAgIHNlbGVjdERhdGUoZGF0ZSkgewogICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSwgdGhpcy5zZWxlY3RlZEhvdXIsIHRoaXMuc2VsZWN0ZWRNaW51dGUpOwogICAgICB0aGlzLnZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZVdpdGhUaW1lem9uZSh0aGlzLnNlbGVjdGVkRGF0ZSk7CiAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMpOwogICAgICBpZiAoIXRoaXMuZW5hYmxlVGltZSkgewogICAgICAgIHRoaXMuaXNPcGVuZWQgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgc2VsZWN0VG9kYXkoKSB7CiAgICAgIGNvbnN0IHRvZGF5ID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7CiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gdG9kYXk7CiAgICAgIHRoaXMudmlld0RhdGUgPSBuZXcgRGF0ZSh0b2RheSk7CiAgICAgIHRoaXMuc2VsZWN0ZWRIb3VyID0gdG9kYXkuZ2V0SG91cnMoKTsKICAgICAgdGhpcy5zZWxlY3RlZE1pbnV0ZSA9IHRvZGF5LmdldE1pbnV0ZXMoKTsKICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuZm9ybWF0VmFsdWVXaXRoVGltZXpvbmUodGhpcy5zZWxlY3RlZERhdGUpOwogICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgICAgaWYgKCF0aGlzLmVuYWJsZVRpbWUpIHsKICAgICAgICB0aGlzLmlzT3BlbmVkID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGNsZWFyKCkgewogICAgICB0aGlzLnZhbHVlID0gIiI7CiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDsKICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgIHRoaXMuaXNPcGVuZWQgPSBmYWxzZTsKICAgIH0KICAgIHByZXZpb3VzTW9udGgoKSB7CiAgICAgIHRoaXMudmlld0RhdGUgPSBuZXcgRGF0ZSh0aGlzLnZpZXdEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMudmlld0RhdGUuZ2V0TW9udGgoKSAtIDEsIDEpOwogICAgfQogICAgbmV4dE1vbnRoKCkgewogICAgICB0aGlzLnZpZXdEYXRlID0gbmV3IERhdGUodGhpcy52aWV3RGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLnZpZXdEYXRlLmdldE1vbnRoKCkgKyAxLCAxKTsKICAgIH0KICAgIGhhbmRsZUhvdXJJbnB1dChlMTEpIHsKICAgICAgY29uc3QgaW5wdXQgPSBlMTEudGFyZ2V0OwogICAgICBsZXQgdmFsdWUyID0gcGFyc2VJbnQoaW5wdXQudmFsdWUpIHx8IDA7CiAgICAgIGlmICh0aGlzLnRpbWVGb3JtYXQgPT09ICIxMmgiKSB7CiAgICAgICAgdmFsdWUyID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oMTIsIHZhbHVlMikpOwogICAgICAgIGlmICh0aGlzLnNlbGVjdGVkSG91ciA+PSAxMiAmJiB2YWx1ZTIgIT09IDEyKSB7CiAgICAgICAgICB0aGlzLnNlbGVjdGVkSG91ciA9IHZhbHVlMiArIDEyOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEhvdXIgPCAxMiAmJiB2YWx1ZTIgPT09IDEyKSB7CiAgICAgICAgICB0aGlzLnNlbGVjdGVkSG91ciA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuc2VsZWN0ZWRIb3VyID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnNlbGVjdGVkSG91ciA9IE1hdGgubWF4KDAsIE1hdGgubWluKDIzLCB2YWx1ZTIpKTsKICAgICAgfQogICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkRGF0ZVRpbWUoKTsKICAgIH0KICAgIGhhbmRsZU1pbnV0ZUlucHV0KGUxMSkgewogICAgICBjb25zdCBpbnB1dCA9IGUxMS50YXJnZXQ7CiAgICAgIGxldCB2YWx1ZTIgPSBwYXJzZUludChpbnB1dC52YWx1ZSkgfHwgMDsKICAgICAgdmFsdWUyID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oNTksIHZhbHVlMikpOwogICAgICBpZiAodGhpcy5taW51dGVJbmNyZW1lbnQgJiYgdGhpcy5taW51dGVJbmNyZW1lbnQgPiAxKSB7CiAgICAgICAgdmFsdWUyID0gTWF0aC5yb3VuZCh2YWx1ZTIgLyB0aGlzLm1pbnV0ZUluY3JlbWVudCkgKiB0aGlzLm1pbnV0ZUluY3JlbWVudDsKICAgICAgfQogICAgICB0aGlzLnNlbGVjdGVkTWludXRlID0gdmFsdWUyOwogICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkRGF0ZVRpbWUoKTsKICAgIH0KICAgIHNldEFNUE0ocGVyaW9kKSB7CiAgICAgIGlmIChwZXJpb2QgPT09ICJhbSIgJiYgdGhpcy5zZWxlY3RlZEhvdXIgPj0gMTIpIHsKICAgICAgICB0aGlzLnNlbGVjdGVkSG91ciAtPSAxMjsKICAgICAgfSBlbHNlIGlmIChwZXJpb2QgPT09ICJwbSIgJiYgdGhpcy5zZWxlY3RlZEhvdXIgPCAxMikgewogICAgICAgIHRoaXMuc2VsZWN0ZWRIb3VyICs9IDEyOwogICAgICB9CiAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWREYXRlVGltZSgpOwogICAgfQogICAgdXBkYXRlU2VsZWN0ZWREYXRlVGltZSgpIHsKICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlKSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRNb250aCgpLCB0aGlzLnNlbGVjdGVkRGF0ZS5nZXREYXRlKCksIHRoaXMuc2VsZWN0ZWRIb3VyLCB0aGlzLnNlbGVjdGVkTWludXRlKTsKICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZVdpdGhUaW1lem9uZSh0aGlzLnNlbGVjdGVkRGF0ZSk7CiAgICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZVRpbWV6b25lQ2hhbmdlKGUxMSkgewogICAgICBjb25zdCBzZWxlY3QgPSBlMTEudGFyZ2V0OwogICAgICB0aGlzLnRpbWV6b25lID0gc2VsZWN0LnZhbHVlOwogICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkRGF0ZVRpbWUoKTsKICAgIH0KICAgIGZvcm1hdFZhbHVlV2l0aFRpbWV6b25lKGRhdGUpIHsKICAgICAgaWYgKCF0aGlzLmVuYWJsZVRpbWV6b25lKSB7CiAgICAgICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKTsKICAgICAgfQogICAgICBjb25zdCBmb3JtYXR0ZXIyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoImVuLVVTIiwgewogICAgICAgIHllYXI6ICJudW1lcmljIiwKICAgICAgICBtb250aDogIjItZGlnaXQiLAogICAgICAgIGRheTogIjItZGlnaXQiLAogICAgICAgIGhvdXI6ICIyLWRpZ2l0IiwKICAgICAgICBtaW51dGU6ICIyLWRpZ2l0IiwKICAgICAgICBzZWNvbmQ6ICIyLWRpZ2l0IiwKICAgICAgICBob3VyMTI6IGZhbHNlLAogICAgICAgIHRpbWVab25lOiB0aGlzLnRpbWV6b25lLAogICAgICAgIHRpbWVab25lTmFtZTogInNob3J0IgogICAgICB9KTsKICAgICAgY29uc3QgcGFydHMgPSBmb3JtYXR0ZXIyLmZvcm1hdFRvUGFydHMoZGF0ZSk7CiAgICAgIGNvbnN0IGRhdGVQYXJ0cyA9IHt9OwogICAgICBwYXJ0cy5mb3JFYWNoKChwYXJ0KSA9PiB7CiAgICAgICAgZGF0ZVBhcnRzW3BhcnQudHlwZV0gPSBwYXJ0LnZhbHVlOwogICAgICB9KTsKICAgICAgY29uc3QgaXNvU3RyaW5nID0gYCR7ZGF0ZVBhcnRzLnllYXJ9LSR7ZGF0ZVBhcnRzLm1vbnRofS0ke2RhdGVQYXJ0cy5kYXl9VCR7ZGF0ZVBhcnRzLmhvdXJ9OiR7ZGF0ZVBhcnRzLm1pbnV0ZX06JHtkYXRlUGFydHMuc2Vjb25kfWA7CiAgICAgIGNvbnN0IHR6T2Zmc2V0ID0gdGhpcy5nZXRUaW1lem9uZU9mZnNldChkYXRlLCB0aGlzLnRpbWV6b25lKTsKICAgICAgcmV0dXJuIGAke2lzb1N0cmluZ30ke3R6T2Zmc2V0fWA7CiAgICB9CiAgICBnZXRUaW1lem9uZU9mZnNldChkYXRlLCB0aW1lem9uZSkgewogICAgICBjb25zdCB0ekRhdGUgPSBuZXcgRGF0ZShkYXRlLnRvTG9jYWxlU3RyaW5nKCJlbi1VUyIsIHsgdGltZVpvbmU6IHRpbWV6b25lIH0pKTsKICAgICAgY29uc3QgdXRjRGF0ZSA9IG5ldyBEYXRlKGRhdGUudG9Mb2NhbGVTdHJpbmcoImVuLVVTIiwgeyB0aW1lWm9uZTogIlVUQyIgfSkpOwogICAgICBjb25zdCBvZmZzZXRNaW51dGVzID0gKHR6RGF0ZS5nZXRUaW1lKCkgLSB1dGNEYXRlLmdldFRpbWUoKSkgLyAoMWUzICogNjApOwogICAgICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IoTWF0aC5hYnMob2Zmc2V0TWludXRlcykgLyA2MCk7CiAgICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmFicyhvZmZzZXRNaW51dGVzKSAlIDYwOwogICAgICBjb25zdCBzaWduID0gb2Zmc2V0TWludXRlcyA+PSAwID8gIisiIDogIi0iOwogICAgICByZXR1cm4gYCR7c2lnbn0ke2hvdXJzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKX06JHttaW51dGVzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKX1gOwogICAgfQogICAgaGFuZGxlS2V5ZG93bihlMTEpIHsKICAgICAgaWYgKGUxMS5rZXkgPT09ICJFbnRlciIgfHwgZTExLmtleSA9PT0gIiAiKSB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdGhpcy50b2dnbGVDYWxlbmRhcigpOwogICAgICB9IGVsc2UgaWYgKGUxMS5rZXkgPT09ICJFc2NhcGUiICYmIHRoaXMuaXNPcGVuZWQpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICB0aGlzLmlzT3BlbmVkID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGNsZWFyVmFsdWUoZTExKSB7CiAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgdGhpcy52YWx1ZSA9ICIiOwogICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG51bGw7CiAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMpOwogICAgfQogICAgaGFuZGxlTWFudWFsSW5wdXQoZTExKSB7CiAgICAgIGNvbnN0IGlucHV0ID0gZTExLnRhcmdldDsKICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IGlucHV0LnZhbHVlLnRyaW0oKTsKICAgICAgaWYgKCFpbnB1dFZhbHVlKSB7CiAgICAgICAgdGhpcy52YWx1ZSA9ICIiOwogICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMucGFyc2VNYW51YWxEYXRlKGlucHV0VmFsdWUpOwogICAgICBpZiAocGFyc2VkRGF0ZSAmJiAhaXNOYU4ocGFyc2VkRGF0ZS5nZXRUaW1lKCkpKSB7CiAgICAgICAgdGhpcy52YWx1ZSA9IHBhcnNlZERhdGUudG9JU09TdHJpbmcoKTsKICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHBhcnNlZERhdGU7CiAgICAgICAgdGhpcy52aWV3RGF0ZSA9IG5ldyBEYXRlKHBhcnNlZERhdGUpOwogICAgICAgIHRoaXMuc2VsZWN0ZWRIb3VyID0gcGFyc2VkRGF0ZS5nZXRIb3VycygpOwogICAgICAgIHRoaXMuc2VsZWN0ZWRNaW51dGUgPSBwYXJzZWREYXRlLmdldE1pbnV0ZXMoKTsKICAgICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgICAgfQogICAgfQogICAgaGFuZGxlSW5wdXRCbHVyKGUxMSkgewogICAgICBjb25zdCBpbnB1dCA9IGUxMS50YXJnZXQ7CiAgICAgIGNvbnN0IGlucHV0VmFsdWUgPSBpbnB1dC52YWx1ZS50cmltKCk7CiAgICAgIGlmICghaW5wdXRWYWx1ZSkgewogICAgICAgIHRoaXMudmFsdWUgPSAiIjsKICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG51bGw7CiAgICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHBhcnNlZERhdGUgPSB0aGlzLnBhcnNlTWFudWFsRGF0ZShpbnB1dFZhbHVlKTsKICAgICAgaWYgKHBhcnNlZERhdGUgJiYgIWlzTmFOKHBhcnNlZERhdGUuZ2V0VGltZSgpKSkgewogICAgICAgIHRoaXMudmFsdWUgPSBwYXJzZWREYXRlLnRvSVNPU3RyaW5nKCk7CiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBwYXJzZWREYXRlOwogICAgICAgIHRoaXMudmlld0RhdGUgPSBuZXcgRGF0ZShwYXJzZWREYXRlKTsKICAgICAgICB0aGlzLnNlbGVjdGVkSG91ciA9IHBhcnNlZERhdGUuZ2V0SG91cnMoKTsKICAgICAgICB0aGlzLnNlbGVjdGVkTWludXRlID0gcGFyc2VkRGF0ZS5nZXRNaW51dGVzKCk7CiAgICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgICAgaW5wdXQudmFsdWUgPSB0aGlzLmZvcm1hdERhdGUodGhpcy52YWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW5wdXQudmFsdWUgPSB0aGlzLmZvcm1hdERhdGUodGhpcy52YWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIHBhcnNlTWFudWFsRGF0ZShpbnB1dCkgewogICAgICBpZiAoIWlucHV0KQogICAgICAgIHJldHVybiBudWxsOwogICAgICBjb25zdCBwYXJ0cyA9IGlucHV0LnNwbGl0KCIgIik7CiAgICAgIGxldCBkYXRlUGFydCA9IHBhcnRzWzBdOwogICAgICBsZXQgdGltZVBhcnQgPSBwYXJ0c1sxXSB8fCAiIjsKICAgICAgbGV0IHBhcnNlZERhdGUgPSBudWxsOwogICAgICBjb25zdCBpc29NYXRjaCA9IGRhdGVQYXJ0Lm1hdGNoKC9eKFxkezR9KS0oXGR7MSwyfSktKFxkezEsMn0pJC8pOwogICAgICBpZiAoaXNvTWF0Y2gpIHsKICAgICAgICBjb25zdCBbXzQsIHllYXIsIG1vbnRoLCBkYXldID0gaXNvTWF0Y2g7CiAgICAgICAgcGFyc2VkRGF0ZSA9IG5ldyBEYXRlKHBhcnNlSW50KHllYXIpLCBwYXJzZUludChtb250aCkgLSAxLCBwYXJzZUludChkYXkpKTsKICAgICAgfQogICAgICBpZiAoIXBhcnNlZERhdGUpIHsKICAgICAgICBjb25zdCBldU1hdGNoID0gZGF0ZVBhcnQubWF0Y2goL14oXGR7MSwyfSlcLihcZHsxLDJ9KVwuKFxkezR9KSQvKTsKICAgICAgICBpZiAoZXVNYXRjaCkgewogICAgICAgICAgY29uc3QgW180LCBkYXksIG1vbnRoLCB5ZWFyXSA9IGV1TWF0Y2g7CiAgICAgICAgICBwYXJzZWREYXRlID0gbmV3IERhdGUocGFyc2VJbnQoeWVhciksIHBhcnNlSW50KG1vbnRoKSAtIDEsIHBhcnNlSW50KGRheSkpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIXBhcnNlZERhdGUpIHsKICAgICAgICBjb25zdCB1c01hdGNoID0gZGF0ZVBhcnQubWF0Y2goL14oXGR7MSwyfSlcLyhcZHsxLDJ9KVwvKFxkezR9KSQvKTsKICAgICAgICBpZiAodXNNYXRjaCkgewogICAgICAgICAgY29uc3QgW180LCBtb250aCwgZGF5LCB5ZWFyXSA9IHVzTWF0Y2g7CiAgICAgICAgICBwYXJzZWREYXRlID0gbmV3IERhdGUocGFyc2VJbnQoeWVhciksIHBhcnNlSW50KG1vbnRoKSAtIDEsIHBhcnNlSW50KGRheSkpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIXBhcnNlZERhdGUgfHwgaXNOYU4ocGFyc2VkRGF0ZS5nZXRUaW1lKCkpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKHRpbWVQYXJ0KSB7CiAgICAgICAgY29uc3QgdGltZU1hdGNoID0gdGltZVBhcnQubWF0Y2goL14oXGR7MSwyfSk6KFxkezJ9KSQvKTsKICAgICAgICBpZiAodGltZU1hdGNoKSB7CiAgICAgICAgICBjb25zdCBbXzQsIGhvdXJzLCBtaW51dGVzXSA9IHRpbWVNYXRjaDsKICAgICAgICAgIHBhcnNlZERhdGUuc2V0SG91cnMocGFyc2VJbnQoaG91cnMpKTsKICAgICAgICAgIHBhcnNlZERhdGUuc2V0TWludXRlcyhwYXJzZUludChtaW51dGVzKSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCF0aGlzLmVuYWJsZVRpbWUpIHsKICAgICAgICBjb25zdCBub3cyID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7CiAgICAgICAgcGFyc2VkRGF0ZS5zZXRIb3Vycyhub3cyLmdldEhvdXJzKCkpOwogICAgICAgIHBhcnNlZERhdGUuc2V0TWludXRlcyhub3cyLmdldE1pbnV0ZXMoKSk7CiAgICAgICAgcGFyc2VkRGF0ZS5zZXRTZWNvbmRzKDApOwogICAgICAgIHBhcnNlZERhdGUuc2V0TWlsbGlzZWNvbmRzKDApOwogICAgICB9CiAgICAgIHJldHVybiBwYXJzZWREYXRlOwogICAgfQogICAgZ2V0VmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgfQogICAgc2V0VmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTI7CiAgICAgIGlmICh2YWx1ZTIpIHsKICAgICAgICB0cnkgewogICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlMik7CiAgICAgICAgICBpZiAoIWlzTmFOKGRhdGUuZ2V0VGltZSgpKSkgewogICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGU7CiAgICAgICAgICAgIHRoaXMudmlld0RhdGUgPSBuZXcgRGF0ZShkYXRlKTsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEhvdXIgPSBkYXRlLmdldEhvdXJzKCk7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNaW51dGUgPSBkYXRlLmdldE1pbnV0ZXMoKTsKICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMjAoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNJbnB1dERhdGVwaWNrZXIyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXRleHQvZGVlcy1pbnB1dC10ZXh0LmRlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW9GdW5jMTIgPSAoKSA9PiBiMmAKICA8c3R5bGU+CiAgICAke2lgCiAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogMjRweDsKICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgIG1heC13aWR0aDogMTIwMHB4OwogICAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgICB9CiAgICAgIAogICAgICBkZWVzLXBhbmVsIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICB9CiAgICAgIAogICAgICBkZWVzLXBhbmVsOmxhc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5ob3Jpem9udGFsLWdyb3VwIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQogICAgICAKICAgICAgLmdyaWQtbGF5b3V0IHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsKICAgICAgICBnYXA6IDE2cHg7CiAgICAgIH0KICAgICAgCiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgewogICAgICAgIC5ncmlkLWxheW91dCB7CiAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIC5pbnRlcmFjdGl2ZS1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5vdXRwdXQtdGV4dCB7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDI2LjclKSIsICJoc2woMjEwIDQwJSA4MCUpIil9OwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTglKSIsICJoc2woMjE1IDIwLjIlIDExLjglKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgbWluLWhlaWdodDogMjRweDsKICAgICAgfQogICAgYH0KICA8L3N0eWxlPgogIAogIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgaW5wdXRzID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yQWxsKCJkZWVzLWlucHV0LXRleHQiKTsKICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHsKICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZVN1YmplY3QiLCAoZXZlbnQpID0+IHsKICAgICAgY29uc29sZS5sb2coYElucHV0ICIke2lucHV0LmxhYmVsfSIgY2hhbmdlZCB0bzpgLCBpbnB1dC5nZXRWYWx1ZSgpKTsKICAgIH0pOwogICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IHsKICAgICAgY29uc29sZS5sb2coYElucHV0ICIke2lucHV0LmxhYmVsfSIgbG9zdCBmb2N1c2ApOwogICAgfSk7CiAgfSk7CiAgY29uc3QgcGFzc3dvcmRJbnB1dCA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcignZGVlcy1pbnB1dC10ZXh0W2tleT0icGFzc3dvcmQiXScpOwogIGlmIChwYXNzd29yZElucHV0KSB7CiAgICBjb25zb2xlLmxvZygiUGFzc3dvcmQgaW5wdXQgaW5jbHVkZXMgdmlzaWJpbGl0eSB0b2dnbGUiKTsKICB9Cn19PgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiQmFzaWMgVGV4dCBJbnB1dHMifSAuc3VidGl0bGU9JHsiU3RhbmRhcmQgdGV4dCBpbnB1dHMgd2l0aCBsYWJlbHMgYW5kIGRlc2NyaXB0aW9ucyJ9PgogICAgICAgIDxkZWVzLWlucHV0LXRleHQgCiAgICAgICAgICAubGFiZWw9JHsiVXNlcm5hbWUifSAKICAgICAgICAgIC52YWx1ZT0keyJqb2huZG9lIn0KICAgICAgICAgIC5rZXk9JHsidXNlcm5hbWUifQogICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAKICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IAogICAgICAgICAgLmxhYmVsPSR7IkVtYWlsIEFkZHJlc3MifSAKICAgICAgICAgIC52YWx1ZT0keyJqb2huQGV4YW1wbGUuY29tIn0gCiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiV2Ugd2lsbCBuZXZlciBzaGFyZSB5b3VyIGVtYWlsIHdpdGggYW55b25lIn0KICAgICAgICAgIC5rZXk9JHsiZW1haWwifQogICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAKICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IAogICAgICAgICAgLmxhYmVsPSR7IlBhc3N3b3JkIn0gCiAgICAgICAgICAuaXNQYXNzd29yZEJvb2w9JHt0cnVlfSAKICAgICAgICAgIC52YWx1ZT0keyJzZWNyZXQxMjMifQogICAgICAgICAgLmtleT0keyJwYXNzd29yZCJ9CiAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgICAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgaG9yaXpvbnRhbElucHV0cyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1pbnB1dC10ZXh0Iik7CiAgaG9yaXpvbnRhbElucHV0cy5mb3JFYWNoKChpbnB1dCkgPT4gewogICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGlucHV0KTsKICAgIGNvbnNvbGUubG9nKGBIb3Jpem9udGFsIGlucHV0ICIke2lucHV0LmxhYmVsfSIgZGlzcGxheTpgLCBjb21wdXRlZFN0eWxlLmRpc3BsYXkpOwogIH0pOwogIGNvbnN0IGZpcnN0TmFtZUlucHV0ID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCdkZWVzLWlucHV0LXRleHRba2V5PSJmaXJzdE5hbWUiXScpOwogIGNvbnN0IGxhc3ROYW1lSW5wdXQgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoJ2RlZXMtaW5wdXQtdGV4dFtrZXk9Imxhc3ROYW1lIl0nKTsKICBpZiAoZmlyc3ROYW1lSW5wdXQgJiYgbGFzdE5hbWVJbnB1dCkgewogICAgY29uc3QgdXBkYXRlRnVsbE5hbWUgPSAoKSA9PiB7CiAgICAgIGNvbnN0IGZpcnN0TmFtZSA9IGZpcnN0TmFtZUlucHV0LmdldFZhbHVlKCk7CiAgICAgIGNvbnN0IGxhc3ROYW1lID0gbGFzdE5hbWVJbnB1dC5nZXRWYWx1ZSgpOwogICAgICBjb25zb2xlLmxvZyhgRnVsbCBuYW1lOiAke2ZpcnN0TmFtZX0gJHtsYXN0TmFtZX1gKTsKICAgIH07CiAgICBmaXJzdE5hbWVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VTdWJqZWN0IiwgdXBkYXRlRnVsbE5hbWUpOwogICAgbGFzdE5hbWVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VTdWJqZWN0IiwgdXBkYXRlRnVsbE5hbWUpOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJIb3Jpem9udGFsIExheW91dCJ9IC5zdWJ0aXRsZT0keyJNdWx0aXBsZSBpbnB1dHMgYXJyYW5nZWQgaG9yaXpvbnRhbGx5IGZvciBjb21wYWN0IGZvcm1zIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iaG9yaXpvbnRhbC1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IAogICAgICAgICAgICAubGFiZWw9JHsiRmlyc3QgTmFtZSJ9IAogICAgICAgICAgICAudmFsdWU9JHsiSm9obiJ9IAogICAgICAgICAgICAubGF5b3V0TW9kZT0keyJob3Jpem9udGFsIn0KICAgICAgICAgICAgLmtleT0keyJmaXJzdE5hbWUifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IAogICAgICAgICAgICAubGFiZWw9JHsiTGFzdCBOYW1lIn0gCiAgICAgICAgICAgIC52YWx1ZT0keyJEb2UifSAKICAgICAgICAgICAgLmxheW91dE1vZGU9JHsiaG9yaXpvbnRhbCJ9CiAgICAgICAgICAgIC5rZXk9JHsibGFzdE5hbWUifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IAogICAgICAgICAgICAubGFiZWw9JHsiQWdlIn0gCiAgICAgICAgICAgIC52YWx1ZT0keyIyOCJ9IAogICAgICAgICAgICAubGF5b3V0TW9kZT0keyJob3Jpem9udGFsIn0KICAgICAgICAgICAgLmtleT0keyJhZ2UifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgICAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgaW5wdXRzID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yQWxsKCJkZWVzLWlucHV0LXRleHQiKTsKICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHsKICAgIGNvbnN0IHBvc2l0aW9uMyA9IGlucHV0LmxhYmVsUG9zaXRpb247CiAgICBjb25zb2xlLmxvZyhgSW5wdXQgIiR7aW5wdXQubGFiZWx9IiBoYXMgbGFiZWwgcG9zaXRpb246ICR7cG9zaXRpb24zfWApOwogIH0pOwogIGNvbnN0IGxlZnRMYWJlbElucHV0cyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgnZGVlcy1pbnB1dC10ZXh0W2xhYmVsUG9zaXRpb249ImxlZnQiXScpOwogIGlmIChsZWZ0TGFiZWxJbnB1dHMubGVuZ3RoID4gMCkgewogICAgY29uc29sZS5sb2coYCR7bGVmdExhYmVsSW5wdXRzLmxlbmd0aH0gaW5wdXRzIGhhdmUgbGVmdC1hbGlnbmVkIGxhYmVscyBmb3IgaW5saW5lIGxheW91dGApOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJMYWJlbCBQb3NpdGlvbnMifSAuc3VidGl0bGU9JHsiRGlmZmVyZW50IGxhYmVsIHBvc2l0aW9uaW5nIG9wdGlvbnMgZm9yIHZhcmlvdXMgbGF5b3V0cyJ9PgogICAgICAgIDxkZWVzLWlucHV0LXRleHQgCiAgICAgICAgICAubGFiZWw9JHsiTGFiZWwgb24gVG9wIChEZWZhdWx0KSJ9IAogICAgICAgICAgLnZhbHVlPSR7IlN0YW5kYXJkIGxheW91dCJ9IAogICAgICAgICAgLmxhYmVsUG9zaXRpb249JHsidG9wIn0KICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgCiAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAKICAgICAgICAgIC5sYWJlbD0keyJMYWJlbCBvbiBMZWZ0In0gCiAgICAgICAgICAudmFsdWU9JHsiSW5saW5lIGxhYmVsIn0gCiAgICAgICAgICAubGFiZWxQb3NpdGlvbj0keyJsZWZ0In0KICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0iZ3JpZC1sYXlvdXQiPgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAKICAgICAgICAgICAgLmxhYmVsPSR7IkNpdHkifSAKICAgICAgICAgICAgLnZhbHVlPSR7Ik5ldyBZb3JrIn0gCiAgICAgICAgICAgIC5sYWJlbFBvc2l0aW9uPSR7ImxlZnQifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IAogICAgICAgICAgICAubGFiZWw9JHsiWklQIENvZGUifSAKICAgICAgICAgICAgLnZhbHVlPSR7IjEwMDAxIn0gCiAgICAgICAgICAgIC5sYWJlbFBvc2l0aW9uPSR7ImxlZnQifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgICAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgcmVxdWlyZWRJbnB1dCA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC10ZXh0W3JlcXVpcmVkXSIpOwogIGNvbnN0IGRpc2FibGVkSW5wdXQgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtdGV4dFtkaXNhYmxlZF0iKTsKICBjb25zdCBlcnJvcklucHV0ID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCdkZWVzLWlucHV0LXRleHRbdmFsaWRhdGlvblN0YXRlPSJpbnZhbGlkIl0nKTsKICBpZiAocmVxdWlyZWRJbnB1dCkgewogICAgcmVxdWlyZWRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgKCkgPT4gewogICAgICBpZiAoIXJlcXVpcmVkSW5wdXQuZ2V0VmFsdWUoKSkgewogICAgICAgIGNvbnNvbGUubG9nKCJSZXF1aXJlZCBmaWVsZCBpcyBlbXB0eSEiKTsKICAgICAgfQogICAgfSk7CiAgfQogIGlmIChkaXNhYmxlZElucHV0KSB7CiAgICBjb25zb2xlLmxvZygiRGlzYWJsZWQgaW5wdXQgY2Fubm90IGJlIGVkaXRlZCIpOwogIH0KICBpZiAoZXJyb3JJbnB1dCkgewogICAgY29uc29sZS5sb2coIkVycm9yIGlucHV0IHNob3dzIHZhbGlkYXRpb24gbWVzc2FnZToiLCBlcnJvcklucHV0LnZhbGlkYXRpb25UZXh0KTsKICAgIGVycm9ySW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlU3ViamVjdCIsICgpID0+IHsKICAgICAgY29uc3QgdmFsdWUyID0gZXJyb3JJbnB1dC5nZXRWYWx1ZSgpOwogICAgICBpZiAodmFsdWUyLmluY2x1ZGVzKCJAIikgJiYgdmFsdWUyLmluY2x1ZGVzKCIuIikpIHsKICAgICAgICBlcnJvcklucHV0LnZhbGlkYXRpb25TdGF0ZSA9ICJ2YWxpZCI7CiAgICAgICAgZXJyb3JJbnB1dC52YWxpZGF0aW9uVGV4dCA9ICIiOwogICAgICAgIGNvbnNvbGUubG9nKCJFbWFpbCB2YWxpZGF0aW9uIHBhc3NlZCEiKTsKICAgICAgfQogICAgfSk7CiAgfQp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IlZhbGlkYXRpb24gJiBTdGF0ZXMifSAuc3VidGl0bGU9JHsiRGlmZmVyZW50IHZhbGlkYXRpb24gc3RhdGVzIGFuZCBpbnB1dCBjb25maWd1cmF0aW9ucyJ9PgogICAgICAgIDxkZWVzLWlucHV0LXRleHQgCiAgICAgICAgICAubGFiZWw9JHsiUmVxdWlyZWQgRmllbGQifSAKICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICAua2V5PSR7InJlcXVpcmVkRmllbGQifQogICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAKICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IAogICAgICAgICAgLmxhYmVsPSR7IkRpc2FibGVkIEZpZWxkIn0gCiAgICAgICAgICAudmFsdWU9JHsiQ2Fubm90IGVkaXQgdGhpcyJ9IAogICAgICAgICAgLmRpc2FibGVkPSR7dHJ1ZX0KICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgCiAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAKICAgICAgICAgIC5sYWJlbD0keyJGaWVsZCB3aXRoIEVycm9yIn0gCiAgICAgICAgICAudmFsdWU9JHsiaW52YWxpZEAifSAKICAgICAgICAgIC52YWxpZGF0aW9uVGV4dD0keyJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzIn0KICAgICAgICAgIC52YWxpZGF0aW9uU3RhdGU9JHsiaW52YWxpZCJ9CiAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgICAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgcGFzc3dvcmRJbnB1dHMgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3JBbGwoImRlZXMtaW5wdXQtdGV4dFtpc1Bhc3N3b3JkQm9vbF0iKTsKICBwYXNzd29yZElucHV0cy5mb3JFYWNoKChpbnB1dCkgPT4gewogICAgY29uc3QgY2hlY2tUb2dnbGUgPSAoKSA9PiB7CiAgICAgIGNvbnN0IGlucHV0RWwgPSBpbnB1dC5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCJpbnB1dCIpOwogICAgICBpZiAoaW5wdXRFbCkgewogICAgICAgIGNvbnNvbGUubG9nKGBQYXNzd29yZCBmaWVsZCAiJHtpbnB1dC5sYWJlbH0iIHR5cGU6YCwgaW5wdXRFbC50eXBlKTsKICAgICAgfQogICAgfTsKICAgIGlmIChpbnB1dC5zaGFkb3dSb290KSB7CiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2hlY2tUb2dnbGUpOwogICAgICBjb25zdCBpbnB1dEVsID0gaW5wdXQuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCJpbnB1dCIpOwogICAgICBpZiAoaW5wdXRFbCkgewogICAgICAgIG9ic2VydmVyLm9ic2VydmUoaW5wdXRFbCwgeyBhdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsidHlwZSJdIH0pOwogICAgICB9CiAgICB9CiAgfSk7Cn19PgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiQWR2YW5jZWQgRmVhdHVyZXMifSAuc3VidGl0bGU9JHsiUGFzc3dvcmQgdmlzaWJpbGl0eSB0b2dnbGUgYW5kIG90aGVyIGFkdmFuY2VkIGZlYXR1cmVzIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAKICAgICAgICAgIC5sYWJlbD0keyJQYXNzd29yZCB3aXRoIFRvZ2dsZSJ9IAogICAgICAgICAgLmlzUGFzc3dvcmRCb29sPSR7dHJ1ZX0KICAgICAgICAgIC52YWx1ZT0keyJteVNlY3VyZVBhc3N3b3JkMTIzIn0KICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJDbGljayB0aGUgZXllIGljb24gdG8gc2hvdy9oaWRlIHBhc3N3b3JkIn0KICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgCiAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAKICAgICAgICAgIC5sYWJlbD0keyJBUEkgS2V5In0gCiAgICAgICAgICAuaXNQYXNzd29yZEJvb2w9JHt0cnVlfQogICAgICAgICAgLnZhbHVlPSR7InNrLTEyMzQ1Njc4OTBhYmNkZWYifQogICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IktlZXAgdGhpcyBrZXkgc2VjdXJlIGFuZCBuZXZlciBzaGFyZSBpdCJ9CiAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgICAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgZHluYW1pY0lucHV0ID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCJkZWVzLWlucHV0LXRleHQiKTsKICBjb25zdCBvdXRwdXQgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoIiN0ZXh0LWlucHV0LW91dHB1dCIpOwogIGlmIChkeW5hbWljSW5wdXQgJiYgb3V0cHV0KSB7CiAgICBkeW5hbWljSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlU3ViamVjdCIsIChldmVudCkgPT4gewogICAgICBjb25zdCB2YWx1ZTIgPSBldmVudC5kZXRhaWwuZ2V0VmFsdWUoKTsKICAgICAgb3V0cHV0LnRleHRDb250ZW50ID0gYEN1cnJlbnQgdmFsdWU6ICIke3ZhbHVlMn0iYDsKICAgIH0pOwogICAgZHluYW1pY0lucHV0LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwgKCkgPT4gewogICAgICBjb25zb2xlLmxvZygiSW5wdXQgZm9jdXNlZCIpOwogICAgfSk7CiAgICBkeW5hbWljSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IHsKICAgICAgY29uc29sZS5sb2coIklucHV0IGJsdXJyZWQiKTsKICAgIH0pOwogICAgbGV0IGtleXByZXNzQ291bnQgPSAwOwogICAgZHluYW1pY0lucHV0LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCAoKSA9PiB7CiAgICAgIGtleXByZXNzQ291bnQrKzsKICAgICAgY29uc29sZS5sb2coYEtleXByZXNzIGNvdW50OiAke2tleXByZXNzQ291bnR9YCk7CiAgICB9KTsKICB9Cn19PgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiSW50ZXJhY3RpdmUgRXhhbXBsZSJ9IC5zdWJ0aXRsZT0keyJUcnkgdHlwaW5nIGluIHRoZSBpbnB1dHMgdG8gc2VlIHJlYWwtdGltZSB2YWx1ZSBjaGFuZ2VzIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAKICAgICAgICAgIC5sYWJlbD0keyJEeW5hbWljIElucHV0In0gCiAgICAgICAgICAucGxhY2Vob2xkZXI9JHsiVHlwZSBzb21ldGhpbmcgaGVyZS4uLiJ9CiAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9ImludGVyYWN0aXZlLXNlY3Rpb24iPgogICAgICAgICAgPGRpdiBpZD0idGV4dC1pbnB1dC1vdXRwdXQiIGNsYXNzPSJvdXRwdXQtdGV4dCI+Q3VycmVudCB2YWx1ZTogIiI8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgogIDwvZGl2PgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtdGV4dC9kZWVzLWlucHV0LXRleHQuanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlMjAgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczIxID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzSW5wdXRUZXh0ID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1pbnB1dC10ZXh0IildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNJbnB1dEJhc2U7CiAgbGV0IF92YWx1ZV9kZWNvcmF0b3JzOwogIGxldCBfdmFsdWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWx1ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNQYXNzd29yZEJvb2xfZGVjb3JhdG9yczsKICBsZXQgX2lzUGFzc3dvcmRCb29sX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNQYXNzd29yZEJvb2xfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dQYXNzd29yZEJvb2xfZGVjb3JhdG9yczsKICBsZXQgX3Nob3dQYXNzd29yZEJvb2xfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93UGFzc3dvcmRCb29sX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWxpZGF0aW9uU3RhdGVfZGVjb3JhdG9yczsKICBsZXQgX3ZhbGlkYXRpb25TdGF0ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbGlkYXRpb25TdGF0ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsaWRhdGlvblRleHRfZGVjb3JhdG9yczsKICBsZXQgX3ZhbGlkYXRpb25UZXh0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsaWRhdGlvblRleHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbGlkYXRpb25GdW5jdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfdmFsaWRhdGlvbkZ1bmN0aW9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsaWRhdGlvbkZ1bmN0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNJbnB1dFRleHQyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfdmFsdWVfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgIHJlZmxlY3Q6IHRydWUKICAgICAgfSldOwogICAgICBfaXNQYXNzd29yZEJvb2xfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICByZWZsZWN0OiB0cnVlCiAgICAgIH0pXTsKICAgICAgX3Nob3dQYXNzd29yZEJvb2xfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICByZWZsZWN0OiB0cnVlCiAgICAgIH0pXTsKICAgICAgX3ZhbGlkYXRpb25TdGF0ZV9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgIHJlZmxlY3Q6IHRydWUKICAgICAgfSldOwogICAgICBfdmFsaWRhdGlvblRleHRfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgcmVmbGVjdDogdHJ1ZQogICAgICB9KV07CiAgICAgIF92YWxpZGF0aW9uRnVuY3Rpb25fZGVjb3JhdG9ycyA9IFtuNSh7fSldOwogICAgICBfX2VzRGVjb3JhdGUyMCh0aGlzLCBudWxsLCBfdmFsdWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmFsdWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInZhbHVlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZhbHVlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52YWx1ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF92YWx1ZV9pbml0aWFsaXplcnMsIF92YWx1ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTIwKHRoaXMsIG51bGwsIF9pc1Bhc3N3b3JkQm9vbF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc1Bhc3N3b3JkQm9vbCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNQYXNzd29yZEJvb2wiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNQYXNzd29yZEJvb2wsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzUGFzc3dvcmRCb29sID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzUGFzc3dvcmRCb29sX2luaXRpYWxpemVycywgX2lzUGFzc3dvcmRCb29sX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjAodGhpcywgbnVsbCwgX3Nob3dQYXNzd29yZEJvb2xfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2hvd1Bhc3N3b3JkQm9vbCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd1Bhc3N3b3JkQm9vbCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93UGFzc3dvcmRCb29sLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaG93UGFzc3dvcmRCb29sID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dQYXNzd29yZEJvb2xfaW5pdGlhbGl6ZXJzLCBfc2hvd1Bhc3N3b3JkQm9vbF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTIwKHRoaXMsIG51bGwsIF92YWxpZGF0aW9uU3RhdGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmFsaWRhdGlvblN0YXRlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ2YWxpZGF0aW9uU3RhdGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmFsaWRhdGlvblN0YXRlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52YWxpZGF0aW9uU3RhdGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdmFsaWRhdGlvblN0YXRlX2luaXRpYWxpemVycywgX3ZhbGlkYXRpb25TdGF0ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTIwKHRoaXMsIG51bGwsIF92YWxpZGF0aW9uVGV4dF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2YWxpZGF0aW9uVGV4dCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmFsaWRhdGlvblRleHQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmFsaWRhdGlvblRleHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZhbGlkYXRpb25UZXh0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZhbGlkYXRpb25UZXh0X2luaXRpYWxpemVycywgX3ZhbGlkYXRpb25UZXh0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjAodGhpcywgbnVsbCwgX3ZhbGlkYXRpb25GdW5jdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2YWxpZGF0aW9uRnVuY3Rpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInZhbGlkYXRpb25GdW5jdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai52YWxpZGF0aW9uRnVuY3Rpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZhbGlkYXRpb25GdW5jdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF92YWxpZGF0aW9uRnVuY3Rpb25faW5pdGlhbGl6ZXJzLCBfdmFsaWRhdGlvbkZ1bmN0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjAobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzSW5wdXRUZXh0MiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMTI7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiSW5wdXQiXTsKICAgICN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMyMSh0aGlzLCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IHZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy4jdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB2YWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpc1Bhc3N3b3JkQm9vbF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjEodGhpcywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMSh0aGlzLCBfaXNQYXNzd29yZEJvb2xfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGlzUGFzc3dvcmRCb29sKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNQYXNzd29yZEJvb2xfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc1Bhc3N3b3JkQm9vbCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXNQYXNzd29yZEJvb2xfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93UGFzc3dvcmRCb29sX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyMSh0aGlzLCBfaXNQYXNzd29yZEJvb2xfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczIxKHRoaXMsIF9zaG93UGFzc3dvcmRCb29sX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBzaG93UGFzc3dvcmRCb29sKCkgewogICAgICByZXR1cm4gdGhpcy4jc2hvd1Bhc3N3b3JkQm9vbF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dQYXNzd29yZEJvb2wodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dQYXNzd29yZEJvb2xfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN2YWxpZGF0aW9uU3RhdGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIxKHRoaXMsIF9zaG93UGFzc3dvcmRCb29sX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMSh0aGlzLCBfdmFsaWRhdGlvblN0YXRlX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgdmFsaWRhdGlvblN0YXRlKCkgewogICAgICByZXR1cm4gdGhpcy4jdmFsaWRhdGlvblN0YXRlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdmFsaWRhdGlvblN0YXRlKHZhbHVlMikgewogICAgICB0aGlzLiN2YWxpZGF0aW9uU3RhdGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN2YWxpZGF0aW9uVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjEodGhpcywgX3ZhbGlkYXRpb25TdGF0ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjEodGhpcywgX3ZhbGlkYXRpb25UZXh0X2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCB2YWxpZGF0aW9uVGV4dCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ZhbGlkYXRpb25UZXh0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdmFsaWRhdGlvblRleHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3ZhbGlkYXRpb25UZXh0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdmFsaWRhdGlvbkZ1bmN0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyMSh0aGlzLCBfdmFsaWRhdGlvblRleHRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczIxKHRoaXMsIF92YWxpZGF0aW9uRnVuY3Rpb25faW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCB2YWxpZGF0aW9uRnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWxpZGF0aW9uRnVuY3Rpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB2YWxpZGF0aW9uRnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI3ZhbGlkYXRpb25GdW5jdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICAuLi5EZWVzSW5wdXRCYXNlLmJhc2VTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgKiB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQoKICAgICAgOmhvc3QgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB6LWluZGV4OiBhdXRvOwogICAgICAgIGZvbnQtZmFtaWx5OiAke2Nzc0dlaXN0Rm9udEZhbWlseX07CiAgICAgIH0KCiAgICAgIC5tYWluY29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxNSUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgIH0KCiAgICAgIGlucHV0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGhlaWdodDogNDBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwYWRkaW5nOiAwIDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiA0MHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSA5JSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBjdXJzb3I6IHRleHQ7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAzLjklKSIsICJoc2woMCAwJSA5OCUpIil9OwogICAgICB9CgogICAgICBpbnB1dDo6cGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDUuMSUpIiwgImhzbCgwIDAlIDYzLjklKSIpfTsKICAgICAgfQoKICAgICAgaW5wdXQ6aG92ZXI6bm90KDpkaXNhYmxlZCk6bm90KDpmb2N1cykgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDc5LjglKSIsICJoc2woMCAwJSAyMC45JSkiKX07CiAgICAgIH0KCiAgICAgIGlucHV0OmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5OCUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUgLyAwLjA1KSIsICJoc2woMCAwJSA5OCUgLyAwLjA1KSIpfTsKICAgICAgfQoKICAgICAgaW5wdXQ6ZGlzYWJsZWQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NS4xJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NS4xJSkiLCAiaHNsKDAgMCUgNjMuOSUpIil9OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAvKiBQYXNzd29yZCB0b2dnbGUgYnV0dG9uICovCiAgICAgIC5zaG93UGFzc3dvcmQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMXB4OwogICAgICAgIHRvcDogNTAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDM4cHg7CiAgICAgICAgaGVpZ2h0OiAzOHB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQ1LjElKSIsICJoc2woMCAwJSA2My45JSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMCA1cHggNXB4IDA7CiAgICAgIH0KCiAgICAgIC5zaG93UGFzc3dvcmQ6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NS4xJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTUlKSIsICJoc2woMCAwJSA5My45JSkiKX07CiAgICAgIH0KCiAgICAgIC8qIFZhbGlkYXRpb24gc3R5bGVzICovCiAgICAgIC52YWxpZGF0aW9uQ29udGFpbmVyIHsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgICAgcGFkZGluZzogNHB4IDhweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAudmFsaWRhdGlvbkNvbnRhaW5lci5lcnJvciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDg0LjIlIDYwLjIlIC8gMC4xKSIsICJoc2woMCA3Mi4yJSA1MC42JSAvIDAuMSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA4NC4yJSA2MC4yJSkiLCAiaHNsKDAgNzIuMiUgNTAuNiUpIil9OwogICAgICB9CgogICAgICAudmFsaWRhdGlvbkNvbnRhaW5lci53YXJuIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDI1IDk1JSA1MyUgLyAwLjEpIiwgImhzbCgyNSA5NSUgNjMlIC8gMC4xKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyNSA5NSUgNTMlKSIsICJoc2woMjUgOTUlIDYzJSkiKX07CiAgICAgIH0KCiAgICAgIC52YWxpZGF0aW9uQ29udGFpbmVyLnZhbGlkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlIC8gMC4xKSIsICJoc2woMTQyLjEgNzAuNiUgNDUuMyUgLyAwLjEpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlKSIsICJoc2woMTQyLjEgNzAuNiUgNDUuMyUpIil9OwogICAgICB9CgogICAgICAvKiBFcnJvciBzdGF0ZSBmb3IgaW5wdXQgKi8KICAgICAgOmhvc3QoW3ZhbGlkYXRpb24tc3RhdGU9ImludmFsaWQiXSkgaW5wdXQgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDg0LjIlIDYwLjIlKSIsICJoc2woMCA3Mi4yJSA1MC42JSkiKX07CiAgICAgIH0KCiAgICAgIDpob3N0KFt2YWxpZGF0aW9uLXN0YXRlPSJpbnZhbGlkIl0pIGlucHV0OmZvY3VzIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA4NC4yJSA2MC4yJSkiLCAiaHNsKDAgNzIuMiUgNTAuNiUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgODQuMiUgNjAuMiUgLyAwLjA1KSIsICJoc2woMCA3Mi4yJSA1MC42JSAvIDAuMDUpIil9OwogICAgICB9CgogICAgICAvKiBXYXJuaW5nIHN0YXRlIGZvciBpbnB1dCAqLwogICAgICA6aG9zdChbdmFsaWRhdGlvbi1zdGF0ZT0id2FybiJdKSBpbnB1dCB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDI1IDk1JSA1MyUpIiwgImhzbCgyNSA5NSUgNjMlKSIpfTsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZhbGlkYXRpb24tc3RhdGU9Indhcm4iXSkgaW5wdXQ6Zm9jdXMgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyNSA5NSUgNTMlKSIsICJoc2woMjUgOTUlIDYzJSkiKX07CiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjUgOTUlIDUzJSAvIDAuMDUpIiwgImhzbCgyNSA5NSUgNjMlIC8gMC4wNSkiKX07CiAgICAgIH0KCiAgICAgIC8qIFZhbGlkIHN0YXRlIGZvciBpbnB1dCAqLwogICAgICA6aG9zdChbdmFsaWRhdGlvbi1zdGF0ZT0idmFsaWQiXSkgaW5wdXQgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSkiLCAiaHNsKDE0Mi4xIDcwLjYlIDQ1LjMlKSIpfTsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZhbGlkYXRpb24tc3RhdGU9InZhbGlkIl0pIGlucHV0OmZvY3VzIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyLjEgNzYuMiUgMzYuMyUpIiwgImhzbCgxNDIuMSA3MC42JSA0NS4zJSkiKX07CiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyLjEgNzYuMiUgMzYuMyUgLyAwLjA1KSIsICJoc2woMTQyLjEgNzAuNiUgNDUuMyUgLyAwLjA1KSIpfTsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8c3R5bGU+CiAgICAgICAgaW5wdXQgewogICAgICAgICAgZm9udC1mYW1pbHk6ICR7dGhpcy5pc1Bhc3N3b3JkQm9vbCA/IGNzc01vbm9Gb250RmFtaWx5IDogImluaGVyaXQifTsKICAgICAgICAgIGxldHRlci1zcGFjaW5nOiAke3RoaXMuaXNQYXNzd29yZEJvb2wgPyAiMC41cHgiIDogIm5vcm1hbCJ9OwogICAgICAgICAgcGFkZGluZy1yaWdodDogJHt0aGlzLmlzUGFzc3dvcmRCb29sID8gIjQ4cHgiIDogIjEycHgifTsKICAgICAgICB9CiAgICAgICAgJHt0aGlzLnZhbGlkYXRpb25UZXh0ID8gaWAKICAgICAgICAgICAgICAudmFsaWRhdGlvbkNvbnRhaW5lciB7CiAgICAgICAgICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgYCA6IGlgCiAgICAgICAgICAgICAgLnZhbGlkYXRpb25Db250YWluZXIgewogICAgICAgICAgICAgICAgaGVpZ2h0OiAwOwogICAgICAgICAgICAgICAgcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNHB4KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGB9CiAgICAgIDwvc3R5bGU+CiAgICAgIDxkaXYgY2xhc3M9ImlucHV0LXdyYXBwZXIiPgogICAgICAgIDxkZWVzLWxhYmVsIC5sYWJlbD0ke3RoaXMubGFiZWx9IC5kZXNjcmlwdGlvbj0ke3RoaXMuZGVzY3JpcHRpb259IC5yZXF1aXJlZD0ke3RoaXMucmVxdWlyZWR9PjwvZGVlcy1sYWJlbD4KICAgICAgICA8ZGl2IGNsYXNzPSJtYWluY29udGFpbmVyIj4KICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICB0eXBlPSIke3RoaXMuaXNQYXNzd29yZEJvb2wgJiYgIXRoaXMuc2hvd1Bhc3N3b3JkQm9vbCA/ICJwYXNzd29yZCIgOiAidGV4dCJ9IgogICAgICAgICAgICAudmFsdWU9JHt0aGlzLnZhbHVlfQogICAgICAgICAgICBAaW5wdXQ9IiR7dGhpcy51cGRhdGVWYWx1ZX0iCiAgICAgICAgICAgIC5kaXNhYmxlZD0ke3RoaXMuZGlzYWJsZWR9CiAgICAgICAgICAgIHBsYWNlaG9sZGVyPSIke3RoaXMubGFiZWwgPyAiIiA6ICJFbnRlciB0ZXh0Li4uIn0iCiAgICAgICAgICAvPgogICAgICAgICAgJHt0aGlzLmlzUGFzc3dvcmRCb29sID8gYjJgCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaG93UGFzc3dvcmQiIEBjbGljaz0ke3RoaXMudG9nZ2xlUGFzc3dvcmRWaWV3fT4KICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0ke3RoaXMuc2hvd1Bhc3N3b3JkQm9vbCA/ICJsdWNpZGU6RXllIiA6ICJsdWNpZGU6RXllT2ZmIn0+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICBgIDogYjJgYH0KICAgICAgICAgICR7dGhpcy52YWxpZGF0aW9uVGV4dCA/IGIyYAogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idmFsaWRhdGlvbkNvbnRhaW5lciAke3RoaXMudmFsaWRhdGlvblN0YXRlIHx8ICJlcnJvciJ9Ij4KICAgICAgICAgICAgICAgICAgJHt0aGlzLnZhbGlkYXRpb25UZXh0fQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgYCA6IGIyYDxkaXYgY2xhc3M9InZhbGlkYXRpb25Db250YWluZXIiPjwvZGl2PmB9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGZpcnN0VXBkYXRlZCgpIHsKICAgIH0KICAgIGFzeW5jIHVwZGF0ZVZhbHVlKGV2ZW50QXJnKSB7CiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50QXJnLnRhcmdldDsKICAgICAgdGhpcy52YWx1ZSA9IHRhcmdldC52YWx1ZTsKICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICB9CiAgICBnZXRWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMudmFsdWU7CiAgICB9CiAgICBzZXRWYWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlMjsKICAgIH0KICAgIGFzeW5jIHRvZ2dsZVBhc3N3b3JkVmlldygpIHsKICAgICAgdGhpcy5zaG93UGFzc3dvcmRCb29sID0gIXRoaXMuc2hvd1Bhc3N3b3JkQm9vbDsKICAgIH0KICAgIGFzeW5jIGZvY3VzKCkgewogICAgICBjb25zdCB0ZXh0SW5wdXQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiaW5wdXQiKTsKICAgICAgdGV4dElucHV0LmZvY3VzKCk7CiAgICB9CiAgICBhc3luYyBibHVyKCkgewogICAgICBjb25zdCB0ZXh0SW5wdXQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiaW5wdXQiKTsKICAgICAgdGV4dElucHV0LmJsdXIoKTsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczIxKHRoaXMsIF92YWxpZGF0aW9uRnVuY3Rpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnMyMShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0lucHV0VGV4dDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXNpbXBsZS9kZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkL2RlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQuZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgZGVtb0Z1bmMxMyA9ICgpID0+IGIyYAogIDxkZWVzLWRlbW93cmFwcGVyPgogICAgPHN0eWxlPgogICAgICAke2lgCiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICAgIG1heC13aWR0aDogMTIwMHB4OwogICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5wcm9kdWN0LWdyaWQgewogICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDI4MHB4LCAxZnIpKTsKICAgICAgICAgIGdhcDogMjBweDsKICAgICAgICB9CgogICAgICAgIC5jYXJ0LXN1bW1hcnkgewogICAgICAgICAgbWFyZ2luLXRvcDogMjRweDsKICAgICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNSAyMC4yJSAyMS44JSkiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgfQoKICAgICAgICAuY2FydC1zdW1tYXJ5LXRpdGxlIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTUlKSIpfTsKICAgICAgICB9CgogICAgICAgIC5jYXJ0LWl0ZW0gewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBwYWRkaW5nOiA4cHggMDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSAyNi43JSkiLCAiaHNsKDIxNy45IDEwLjYlIDc0LjklKSIpfTsKICAgICAgICB9CgogICAgICAgIC5jYXJ0LXRvdGFsIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgcGFkZGluZy10b3A6IDE2cHg7CiAgICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICAgICAgYm9yZGVyLXRvcDogMnB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk1JSkiKX07CiAgICAgICAgfQoKICAgICAgICAuc2VsZWN0ZWQtcHJvZHVjdHMgewogICAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSAxNi44JSkiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgMjYuNyUpIiwgImhzbCgyMTcuOSAxMC42JSA3NC45JSkiKX07CiAgICAgICAgfQogICAgICBgfQogICAgPC9zdHlsZT4KICAgIAogICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiQmFzaWMgUHJvZHVjdCBDYXJkcyJ9IC5zdWJ0aXRsZT0keyJTaW1wbGUgcHJvZHVjdCBkaXNwbGF5IHdpdGggdmFyaW91cyBjb25maWd1cmF0aW9ucyJ9PgogICAgICAgIDxkaXYgY2xhc3M9InByb2R1Y3QtZ3JpZCI+CiAgICAgICAgICA8ZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZAogICAgICAgICAgICAucHJvZHVjdERhdGE9JHt7CiAgbmFtZTogIldpcmVsZXNzIEJsdWV0b290aCBIZWFkcGhvbmVzIiwKICBjYXRlZ29yeTogIkF1ZGlvIiwKICBkZXNjcmlwdGlvbjogIlByZW1pdW0gc291bmQgcXVhbGl0eSB3aXRoIGFjdGl2ZSBub2lzZSBjYW5jZWxsYXRpb24iLAogIHByaWNlOiAxNDkuOTksCiAgb3JpZ2luYWxQcmljZTogMTk5Ljk5LAogIGljb25OYW1lOiAibHVjaWRlOmhlYWRwaG9uZXMiCn19CiAgICAgICAgICAgIC5xdWFudGl0eT0kezF9CiAgICAgICAgICA+PC9kZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkPgoKICAgICAgICAgIDxkZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkCiAgICAgICAgICAgIC5wcm9kdWN0RGF0YT0ke3sKICBuYW1lOiAiU21hcnQgV2F0Y2ggU2VyaWVzIDciLAogIGNhdGVnb3J5OiAiV2VhcmFibGVzIiwKICBkZXNjcmlwdGlvbjogIlRyYWNrIHlvdXIgZml0bmVzcyBhbmQgc3RheSBjb25uZWN0ZWQgb24gdGhlIGdvIiwKICBwcmljZTogMzk5LAogIGljb25OYW1lOiAibHVjaWRlOndhdGNoIgp9fQogICAgICAgICAgICAucXVhbnRpdHk9JHsxfQogICAgICAgICAgPjwvZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZD4KCiAgICAgICAgICA8ZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZAogICAgICAgICAgICAucHJvZHVjdERhdGE9JHt7CiAgbmFtZTogIlVTQi1DIEh1YiIsCiAgY2F0ZWdvcnk6ICJBY2Nlc3NvcmllcyIsCiAgcHJpY2U6IDQ5Ljk5LAogIGljb25OYW1lOiAibHVjaWRlOnVzYiIsCiAgaW5TdG9jazogZmFsc2UKfX0KICAgICAgICAgICAgLnF1YW50aXR5PSR7MH0KICAgICAgICAgID48L2RlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQ+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJJbnRlcmFjdGl2ZSBTaG9wcGluZyBDYXJ0In0gLnN1YnRpdGxlPSR7IlByb2R1Y3QgY2FyZHMgd2l0aCBkeW5hbWljIGNhcnQgY2FsY3VsYXRpb24ifSAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IHByb2R1Y3RzID0gWwogICAgeyBpZDogImxhcHRvcCIsIGVsZW1lbnQ6IG51bGwsIGRhdGE6IHsgbmFtZTogJ01hY0Jvb2sgUHJvIDE0IicsIGNhdGVnb3J5OiAiQ29tcHV0ZXJzIiwgZGVzY3JpcHRpb246ICJNMyBQcm8gY2hpcCB3aXRoIDE4R0IgUkFNIiwgcHJpY2U6IDE5OTksIG9yaWdpbmFsUHJpY2U6IDIxOTksIGljb25OYW1lOiAibHVjaWRlOmxhcHRvcCIgfSB9LAogICAgeyBpZDogImlwYWQiLCBlbGVtZW50OiBudWxsLCBkYXRhOiB7IG5hbWU6ICJpUGFkIEFpciIsIGNhdGVnb3J5OiAiVGFibGV0cyIsIGRlc2NyaXB0aW9uOiAnMTAuOSIgTGlxdWlkIFJldGluYSBkaXNwbGF5JywgcHJpY2U6IDU5OSwgaWNvbk5hbWU6ICJsdWNpZGU6dGFibGV0IiB9IH0sCiAgICB7IGlkOiAia2V5Ym9hcmQiLCBlbGVtZW50OiBudWxsLCBkYXRhOiB7IG5hbWU6ICJNYWdpYyBLZXlib2FyZCIsIGNhdGVnb3J5OiAiQWNjZXNzb3JpZXMiLCBkZXNjcmlwdGlvbjogIldpcmVsZXNzIGtleWJvYXJkIHdpdGggVG91Y2ggSUQiLCBwcmljZTogMTQ5LCBpY29uTmFtZTogImx1Y2lkZTprZXlib2FyZCIgfSB9CiAgXTsKICBjb25zdCB1cGRhdGVDYXJ0U3VtbWFyeSA9ICgpID0+IHsKICAgIGxldCB0b3RhbCA9IDA7CiAgICBjb25zdCBpdGVtcyA9IFtdOwogICAgcHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdCkgPT4gewogICAgICBjb25zdCBlbGVtZW50NCA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcihgIyR7cHJvZHVjdC5pZH1gKTsKICAgICAgaWYgKGVsZW1lbnQ0ICYmIGVsZW1lbnQ0LnF1YW50aXR5ID4gMCkgewogICAgICAgIGNvbnN0IHN1YnRvdGFsID0gcHJvZHVjdC5kYXRhLnByaWNlICogZWxlbWVudDQucXVhbnRpdHk7CiAgICAgICAgdG90YWwgKz0gc3VidG90YWw7CiAgICAgICAgaXRlbXMucHVzaChgCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJ0LWl0ZW0iPgogICAgICAgICAgICAgICAgICA8c3Bhbj4ke3Byb2R1Y3QuZGF0YS5uYW1lfSAoJHtlbGVtZW50NC5xdWFudGl0eX0pPC9zcGFuPgogICAgICAgICAgICAgICAgICA8c3Bhbj4kJHtzdWJ0b3RhbC50b0ZpeGVkKDIpfTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIGApOwogICAgICB9CiAgICB9KTsKICAgIGNvbnN0IHN1bW1hcnkgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoIiNpbnRlcmFjdGl2ZS1jYXJ0LXN1bW1hcnkiKTsKICAgIGlmIChzdW1tYXJ5KSB7CiAgICAgIHN1bW1hcnkuaW5uZXJIVE1MID0gYAogICAgICAgICAgICAgICR7aXRlbXMuam9pbigiIil9CiAgICAgICAgICAgICAgJHtpdGVtcy5sZW5ndGggPT09IDAgPyAnPGRpdiBjbGFzcz0iY2FydC1pdGVtIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzk5OTsiPllvdXIgY2FydCBpcyBlbXB0eTwvZGl2PicgOiAiIn0KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJ0LXRvdGFsIj4KICAgICAgICAgICAgICAgIDxzcGFuPlRvdGFsPC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4+JCR7dG90YWwudG9GaXhlZCgyKX08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIGA7CiAgICB9CiAgfTsKICBzZXRUaW1lb3V0KHVwZGF0ZUNhcnRTdW1tYXJ5LCAxMDApOwogIGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZCIpLmZvckVhY2goKGNhcmQpID0+IHsKICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcigicXVhbnRpdHlDaGFuZ2UiLCB1cGRhdGVDYXJ0U3VtbWFyeSk7CiAgfSk7Cn19PgogICAgICAgIDxkaXYgY2xhc3M9InByb2R1Y3QtZ3JpZCI+CiAgICAgICAgICA8ZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZAogICAgICAgICAgICBpZD0ibGFwdG9wIgogICAgICAgICAgICAucHJvZHVjdERhdGE9JHt7CiAgbmFtZTogJ01hY0Jvb2sgUHJvIDE0IicsCiAgY2F0ZWdvcnk6ICJDb21wdXRlcnMiLAogIGRlc2NyaXB0aW9uOiAiTTMgUHJvIGNoaXAgd2l0aCAxOEdCIFJBTSIsCiAgcHJpY2U6IDE5OTksCiAgb3JpZ2luYWxQcmljZTogMjE5OSwKICBpY29uTmFtZTogImx1Y2lkZTpsYXB0b3AiCn19CiAgICAgICAgICAgIC5xdWFudGl0eT0kezF9CiAgICAgICAgICA+PC9kZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkPgoKICAgICAgICAgIDxkZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkCiAgICAgICAgICAgIGlkPSJpcGFkIgogICAgICAgICAgICAucHJvZHVjdERhdGE9JHt7CiAgbmFtZTogImlQYWQgQWlyIiwKICBjYXRlZ29yeTogIlRhYmxldHMiLAogIGRlc2NyaXB0aW9uOiAnMTAuOSIgTGlxdWlkIFJldGluYSBkaXNwbGF5JywKICBwcmljZTogNTk5LAogIGljb25OYW1lOiAibHVjaWRlOnRhYmxldCIKfX0KICAgICAgICAgICAgLnF1YW50aXR5PSR7MH0KICAgICAgICAgID48L2RlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQ+CgogICAgICAgICAgPGRlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQKICAgICAgICAgICAgaWQ9ImtleWJvYXJkIgogICAgICAgICAgICAucHJvZHVjdERhdGE9JHt7CiAgbmFtZTogIk1hZ2ljIEtleWJvYXJkIiwKICBjYXRlZ29yeTogIkFjY2Vzc29yaWVzIiwKICBkZXNjcmlwdGlvbjogIldpcmVsZXNzIGtleWJvYXJkIHdpdGggVG91Y2ggSUQiLAogIHByaWNlOiAxNDksCiAgaWNvbk5hbWU6ICJsdWNpZGU6a2V5Ym9hcmQiCn19CiAgICAgICAgICAgIC5xdWFudGl0eT0kezJ9CiAgICAgICAgICA+PC9kZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJjYXJ0LXN1bW1hcnkiPgogICAgICAgICAgPGgzIGNsYXNzPSJjYXJ0LXN1bW1hcnktdGl0bGUiPlNob3BwaW5nIENhcnQ8L2gzPgogICAgICAgICAgPGRpdiBpZD0iaW50ZXJhY3RpdmUtY2FydC1zdW1tYXJ5Ij4KICAgICAgICAgICAgPCEtLSBEeW5hbWljYWxseSB1cGRhdGVkIC0tPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJTZWxlY3RhYmxlIFByb2R1Y3QgQ2FyZHMifSAuc3VidGl0bGU9JHsiQ2xpY2sgY2FyZHMgb3IgY2hlY2tib3hlcyB0byBzZWxlY3QgcHJvZHVjdHMifT4KICAgICAgICA8ZGl2IGNsYXNzPSJwcm9kdWN0LWdyaWQiPgogICAgICAgICAgPGRlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQKICAgICAgICAgICAgLnByb2R1Y3REYXRhPSR7ewogIG5hbWU6ICJTb255IEFscGhhIDcgSVYiLAogIGNhdGVnb3J5OiAiQ2FtZXJhcyIsCiAgZGVzY3JpcHRpb246ICJGdWxsLWZyYW1lIG1pcnJvcmxlc3MgY2FtZXJhIiwKICBwcmljZTogMjQ5OCwKICBpY29uTmFtZTogImx1Y2lkZTpjYW1lcmEiCn19CiAgICAgICAgICAgIC5zZWxlY3RhYmxlPSR7dHJ1ZX0KICAgICAgICAgICAgLnNob3dRdWFudGl0eVNlbGVjdG9yPSR7ZmFsc2V9CiAgICAgICAgICAgIEBzZWxlY3Rpb25DaGFuZ2U9JHsoZTExKSA9PiB7CiAgY29uc3Qgb3V0cHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3NlbGVjdGlvbi1vdXRwdXQiKTsKICBpZiAob3V0cHV0KSB7CiAgICBjb25zdCBzZWxlY3RlZENhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZFtzZWxlY3RhYmxlXSIpOwogICAgY29uc3Qgc2VsZWN0ZWRQcm9kdWN0cyA9IFtdOwogICAgc2VsZWN0ZWRDYXJkcy5mb3JFYWNoKChjYXJkKSA9PiB7CiAgICAgIGlmIChjYXJkLnNlbGVjdGVkKSB7CiAgICAgICAgc2VsZWN0ZWRQcm9kdWN0cy5wdXNoKGNhcmQucHJvZHVjdERhdGEubmFtZSk7CiAgICAgIH0KICAgIH0pOwogICAgb3V0cHV0LnRleHRDb250ZW50ID0gc2VsZWN0ZWRQcm9kdWN0cy5sZW5ndGggPiAwID8gYFNlbGVjdGVkOiAke3NlbGVjdGVkUHJvZHVjdHMuam9pbigiLCAiKX1gIDogIk5vIHByb2R1Y3RzIHNlbGVjdGVkIjsKICB9Cn19CiAgICAgICAgICA+PC9kZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkPgoKICAgICAgICAgIDxkZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkCiAgICAgICAgICAgIC5wcm9kdWN0RGF0YT0ke3sKICBuYW1lOiAiREpJIE1pbmkgMyBQcm8iLAogIGNhdGVnb3J5OiAiRHJvbmVzIiwKICBkZXNjcmlwdGlvbjogIkxpZ2h0d2VpZ2h0IGRyb25lIHdpdGggNEsgY2FtZXJhIiwKICBwcmljZTogNzU5LAogIGljb25OYW1lOiAibHVjaWRlOnBsYW5lIgp9fQogICAgICAgICAgICAuc2VsZWN0YWJsZT0ke3RydWV9CiAgICAgICAgICAgIC5zaG93UXVhbnRpdHlTZWxlY3Rvcj0ke2ZhbHNlfQogICAgICAgICAgICBAc2VsZWN0aW9uQ2hhbmdlPSR7KGUxMSkgPT4gewogIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzZWxlY3Rpb24tb3V0cHV0Iik7CiAgaWYgKG91dHB1dCkgewogICAgY29uc3Qgc2VsZWN0ZWRDYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImRlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmRbc2VsZWN0YWJsZV0iKTsKICAgIGNvbnN0IHNlbGVjdGVkUHJvZHVjdHMgPSBbXTsKICAgIHNlbGVjdGVkQ2FyZHMuZm9yRWFjaCgoY2FyZCkgPT4gewogICAgICBpZiAoY2FyZC5zZWxlY3RlZCkgewogICAgICAgIHNlbGVjdGVkUHJvZHVjdHMucHVzaChjYXJkLnByb2R1Y3REYXRhLm5hbWUpOwogICAgICB9CiAgICB9KTsKICAgIG91dHB1dC50ZXh0Q29udGVudCA9IHNlbGVjdGVkUHJvZHVjdHMubGVuZ3RoID4gMCA/IGBTZWxlY3RlZDogJHtzZWxlY3RlZFByb2R1Y3RzLmpvaW4oIiwgIil9YCA6ICJObyBwcm9kdWN0cyBzZWxlY3RlZCI7CiAgfQp9fQogICAgICAgICAgPjwvZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZD4KCiAgICAgICAgICA8ZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZAogICAgICAgICAgICAucHJvZHVjdERhdGE9JHt7CiAgbmFtZTogIkdvUHJvIEhFUk8xMiIsCiAgY2F0ZWdvcnk6ICJBY3Rpb24gQ2FtZXJhcyIsCiAgZGVzY3JpcHRpb246ICI1LjNLIHZpZGVvIHdpdGggSHlwZXJTbW9vdGggNi4wIiwKICBwcmljZTogMzk5LAogIG9yaWdpbmFsUHJpY2U6IDQ0OSwKICBpY29uTmFtZTogImx1Y2lkZTp2aWRlbyIKfX0KICAgICAgICAgICAgLnNlbGVjdGFibGU9JHt0cnVlfQogICAgICAgICAgICAuc2hvd1F1YW50aXR5U2VsZWN0b3I9JHtmYWxzZX0KICAgICAgICAgICAgQHNlbGVjdGlvbkNoYW5nZT0keyhlMTEpID0+IHsKICBjb25zdCBvdXRwdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc2VsZWN0aW9uLW91dHB1dCIpOwogIGlmIChvdXRwdXQpIHsKICAgIGNvbnN0IHNlbGVjdGVkQ2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJkZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkW3NlbGVjdGFibGVdIik7CiAgICBjb25zdCBzZWxlY3RlZFByb2R1Y3RzID0gW107CiAgICBzZWxlY3RlZENhcmRzLmZvckVhY2goKGNhcmQpID0+IHsKICAgICAgaWYgKGNhcmQuc2VsZWN0ZWQpIHsKICAgICAgICBzZWxlY3RlZFByb2R1Y3RzLnB1c2goY2FyZC5wcm9kdWN0RGF0YS5uYW1lKTsKICAgICAgfQogICAgfSk7CiAgICBvdXRwdXQudGV4dENvbnRlbnQgPSBzZWxlY3RlZFByb2R1Y3RzLmxlbmd0aCA+IDAgPyBgU2VsZWN0ZWQ6ICR7c2VsZWN0ZWRQcm9kdWN0cy5qb2luKCIsICIpfWAgOiAiTm8gcHJvZHVjdHMgc2VsZWN0ZWQiOwogIH0KfX0KICAgICAgICAgID48L2RlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQ+CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0ic2VsZWN0ZWQtcHJvZHVjdHMiIGlkPSJzZWxlY3Rpb24tb3V0cHV0IiBzdHlsZT0ibWFyZ2luLXRvcDogMTZweDsiPgogICAgICAgICAgTm8gcHJvZHVjdHMgc2VsZWN0ZWQKICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgoKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IlByb2R1Y3QgVmFyaWF0aW9ucyJ9IC5zdWJ0aXRsZT0keyJEaWZmZXJlbnQgc3RhdGVzIGFuZCBjb25maWd1cmF0aW9ucyJ9PgogICAgICAgIDxkaXYgY2xhc3M9InByb2R1Y3QtZ3JpZCI+CiAgICAgICAgICA8ZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZAogICAgICAgICAgICAucHJvZHVjdERhdGE9JHt7CiAgbmFtZTogIkxpbWl0ZWQgRWRpdGlvbiBTbmVha2VycyIsCiAgY2F0ZWdvcnk6ICJGb290d2VhciIsCiAgZGVzY3JpcHRpb246ICJFeGNsdXNpdmUgY29sb3J3YXkgLSBPbmx5IDUwMCBwYWlycyIsCiAgcHJpY2U6IDI5OSwKICBpY29uTmFtZTogImx1Y2lkZTpmb290cHJpbnRzIiwKICBpblN0b2NrOiBmYWxzZSwKICBzdG9ja1RleHQ6ICJTb2xkIE91dCIKfX0KICAgICAgICAgICAgLnF1YW50aXR5PSR7MH0KICAgICAgICAgID48L2RlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQ+CgogICAgICAgICAgPGRlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQKICAgICAgICAgICAgLnByb2R1Y3REYXRhPSR7ewogIG5hbWU6ICJNaW5pbWFsaXN0IFdhbGxldCIsCiAgcHJpY2U6IDM5Ljk5LAogIGljb25OYW1lOiAibHVjaWRlOndhbGxldCIKfX0KICAgICAgICAgICAgLnF1YW50aXR5PSR7MX0KICAgICAgICAgID48L2RlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQ+CgogICAgICAgICAgPGRlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQKICAgICAgICAgICAgLnByb2R1Y3REYXRhPSR7ewogIG5hbWU6ICJQcmVtaXVtIENvZmZlZSBCZWFucyIsCiAgY2F0ZWdvcnk6ICJGb29kICYgQmV2ZXJhZ2UiLAogIGRlc2NyaXB0aW9uOiAiU2luZ2xlIG9yaWdpbiwgbWVkaXVtIHJvYXN0IiwKICBwcmljZTogMTguNSwKICBpY29uTmFtZTogImx1Y2lkZTpjb2ZmZWUiLAogIGN1cnJlbmN5OiAiXHUyMEFDIgp9fQogICAgICAgICAgICAucXVhbnRpdHk9JHsyfQogICAgICAgICAgPjwvZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kaXY+CiAgPC9kZWVzLWRlbW93cmFwcGVyPgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXNpbXBsZS9kZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkL2RlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQuanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlMjEgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczIyID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzU2hvcHBpbmdQcm9kdWN0Y2FyZCA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9wcm9kdWN0RGF0YV9kZWNvcmF0b3JzOwogIGxldCBfcHJvZHVjdERhdGFfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wcm9kdWN0RGF0YV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcXVhbnRpdHlfZGVjb3JhdG9yczsKICBsZXQgX3F1YW50aXR5X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcXVhbnRpdHlfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dRdWFudGl0eVNlbGVjdG9yX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93UXVhbnRpdHlTZWxlY3Rvcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dRdWFudGl0eVNlbGVjdG9yX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RhYmxlX2RlY29yYXRvcnM7CiAgbGV0IF9zZWxlY3RhYmxlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0YWJsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1Nob3BwaW5nUHJvZHVjdGNhcmQyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfcHJvZHVjdERhdGFfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF9xdWFudGl0eV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX3Nob3dRdWFudGl0eVNlbGVjdG9yX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3NlbGVjdGFibGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfc2VsZWN0ZWRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfX2VzRGVjb3JhdGUyMSh0aGlzLCBudWxsLCBfcHJvZHVjdERhdGFfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicHJvZHVjdERhdGEiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInByb2R1Y3REYXRhIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnByb2R1Y3REYXRhLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5wcm9kdWN0RGF0YSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wcm9kdWN0RGF0YV9pbml0aWFsaXplcnMsIF9wcm9kdWN0RGF0YV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTIxKHRoaXMsIG51bGwsIF9xdWFudGl0eV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJxdWFudGl0eSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicXVhbnRpdHkiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucXVhbnRpdHksIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnF1YW50aXR5ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3F1YW50aXR5X2luaXRpYWxpemVycywgX3F1YW50aXR5X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjEodGhpcywgbnVsbCwgX3Nob3dRdWFudGl0eVNlbGVjdG9yX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dRdWFudGl0eVNlbGVjdG9yIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93UXVhbnRpdHlTZWxlY3RvciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93UXVhbnRpdHlTZWxlY3Rvciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd1F1YW50aXR5U2VsZWN0b3IgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd1F1YW50aXR5U2VsZWN0b3JfaW5pdGlhbGl6ZXJzLCBfc2hvd1F1YW50aXR5U2VsZWN0b3JfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyMSh0aGlzLCBudWxsLCBfc2VsZWN0YWJsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWxlY3RhYmxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3RhYmxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGFibGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlbGVjdGFibGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0YWJsZV9pbml0aWFsaXplcnMsIF9zZWxlY3RhYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjEodGhpcywgbnVsbCwgX3NlbGVjdGVkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlbGVjdGVkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3RlZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWxlY3RlZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VsZWN0ZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0ZWRfaW5pdGlhbGl6ZXJzLCBfc2VsZWN0ZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyMShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNTaG9wcGluZ1Byb2R1Y3RjYXJkMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMTM7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiU2ltcGxlIl07CiAgICAjcHJvZHVjdERhdGFfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMjIodGhpcywgX3Byb2R1Y3REYXRhX2luaXRpYWxpemVycywgewogICAgICBuYW1lOiAiUHJvZHVjdCBOYW1lIiwKICAgICAgcHJpY2U6IDAKICAgIH0pOwogICAgZ2V0IHByb2R1Y3REYXRhKCkgewogICAgICByZXR1cm4gdGhpcy4jcHJvZHVjdERhdGFfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwcm9kdWN0RGF0YSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcHJvZHVjdERhdGFfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNxdWFudGl0eV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjIodGhpcywgX3Byb2R1Y3REYXRhX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMih0aGlzLCBfcXVhbnRpdHlfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgcXVhbnRpdHkoKSB7CiAgICAgIHJldHVybiB0aGlzLiNxdWFudGl0eV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHF1YW50aXR5KHZhbHVlMikgewogICAgICB0aGlzLiNxdWFudGl0eV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dRdWFudGl0eVNlbGVjdG9yX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyMih0aGlzLCBfcXVhbnRpdHlfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczIyKHRoaXMsIF9zaG93UXVhbnRpdHlTZWxlY3Rvcl9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93UXVhbnRpdHlTZWxlY3RvcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dRdWFudGl0eVNlbGVjdG9yX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd1F1YW50aXR5U2VsZWN0b3IodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dRdWFudGl0eVNlbGVjdG9yX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0YWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjIodGhpcywgX3Nob3dRdWFudGl0eVNlbGVjdG9yX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMih0aGlzLCBfc2VsZWN0YWJsZV9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgc2VsZWN0YWJsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlbGVjdGFibGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3RhYmxlKHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3RhYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0ZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIyKHRoaXMsIF9zZWxlY3RhYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMih0aGlzLCBfc2VsZWN0ZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHNlbGVjdGVkKCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3RlZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VsZWN0ZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC5wcm9kdWN0LWNhcmQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMjE1IDIwLjIlIDExLjglKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAucHJvZHVjdC1jYXJkOmhvdmVyIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA3OS44JSkiLCAiaHNsKDAgMCUgMjAuOSUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDZweCAtMXB4IGhzbCgwIDAlIDAlIC8gMC4xKSwgMCAycHggNHB4IC0ycHggaHNsKDAgMCUgMCUgLyAwLjEpOwogICAgICB9CgogICAgICAucHJvZHVjdC1jYXJkLnNlbGVjdGFibGUgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgLnByb2R1Y3QtY2FyZC5zZWxlY3RlZCB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNy4yIDkxLjIlIDU5LjglKSIsICJoc2woMjEzLjEgOTMuOSUgNjcuOCUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNy4yIDkxLjIlIDU5LjglIC8gMC4xKSIsICJoc2woMjEzLjEgOTMuOSUgNjcuOCUgLyAwLjEpIil9OwogICAgICB9CgogICAgICAucHJvZHVjdC1pbWFnZSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxODBweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnByb2R1Y3QtaW1hZ2UgaW1nIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb2JqZWN0LWZpdDogY292ZXI7CiAgICAgIH0KCiAgICAgIC5wcm9kdWN0LWltYWdlIGRlZXMtaWNvbiB7CiAgICAgICAgZm9udC1zaXplOiA0OHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAyMC4yJSA2NS4xJSkiLCAiaHNsKDIxNSAyMC4yJSAzNS4xJSkiKX07CiAgICAgIH0KCiAgICAgIC5zZWxlY3Rpb24tY2hlY2tib3ggewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDEycHg7CiAgICAgICAgcmlnaHQ6IDEycHg7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMjE1IDMwJSA2LjglKSIpfTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAyMC4yJSA2NS4xJSkiLCAiaHNsKDIxNSAyMC4yJSAzNS4xJSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgLnNlbGVjdGlvbi1jaGVja2JveC5jaGVja2VkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNy4yIDkxLjIlIDU5LjglKSIsICJoc2woMjEzLjEgOTMuOSUgNjcuOCUpIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTcuMiA5MS4yJSA1OS44JSkiLCAiaHNsKDIxMy4xIDkzLjklIDY3LjglKSIpfTsKICAgICAgfQoKICAgICAgLnNlbGVjdGlvbi1jaGVja2JveCBkZWVzLWljb24gewogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5zZWxlY3Rpb24tY2hlY2tib3guY2hlY2tlZCBkZWVzLWljb24gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgICAgfQoKICAgICAgLnByb2R1Y3QtY29udGVudCB7CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgIGZsZXg6IDE7CiAgICAgIH0KICAgICAgCiAgICAgIC5wcm9kdWN0LWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogNHB4OwogICAgICB9CgogICAgICAucHJvZHVjdC1jYXRlZ29yeSB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNTYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNTUuMSUpIil9OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICAgICAgICBsaW5lLWhlaWdodDogMS4zOwogICAgICB9CiAgICAgIAogICAgICAucHJvZHVjdC1uYW1lIHsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICAgIH0KCiAgICAgIC5wcm9kdWN0LWRlc2NyaXB0aW9uIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNDYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICAgICAgZmxleDogMTsKICAgICAgfQogICAgICAKICAgICAgLnByb2R1Y3QtZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGdhcDogMTZweDsKICAgICAgICBwYWRkaW5nLXRvcDogMTJweDsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgIH0KCiAgICAgIC5wcm9kdWN0LXByaWNlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAycHg7CiAgICAgIH0KCiAgICAgIC5wcmljZS1jdXJyZW50IHsKICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICB9CgogICAgICAucHJpY2Utb3JpZ2luYWwgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA1Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA1NS4xJSkiKX07CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7CiAgICAgIH0KCiAgICAgIC5zdG9jay1zdGF0dXMgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIG1hcmdpbi10b3A6IDhweDsKICAgICAgfQoKICAgICAgLnN0b2NrLXN0YXR1cy5pbi1zdG9jayB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyLjEgNzAuNiUgNDUuMyUpIiwgImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSkiKX07CiAgICAgIH0KCiAgICAgIC5zdG9jay1zdGF0dXMub3V0LW9mLXN0b2NrIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcyLjIlIDUwLjYlKSIsICJoc2woMCA2Mi44JSAzMC42JSkiKX07CiAgICAgIH0KCiAgICAgIC5zdG9jay1zdGF0dXMgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIGNvbnN0IHsgbmFtZSwgY2F0ZWdvcnksIGRlc2NyaXB0aW9uLCBwcmljZSwgb3JpZ2luYWxQcmljZSwgY3VycmVuY3kgPSAiJCIsIGluU3RvY2sgPSB0cnVlLCBzdG9ja1RleHQgPSBpblN0b2NrID8gIkluIFN0b2NrIiA6ICJPdXQgb2YgU3RvY2siLCBpbWFnZVVybCwgaWNvbk5hbWUgPSAibHVjaWRlOnBhY2thZ2UiIH0gPSB0aGlzLnByb2R1Y3REYXRhOwogICAgICBjb25zdCBmb3JtYXRQcmljZSA9ICh2YWx1ZTIpID0+IHsKICAgICAgICByZXR1cm4gYCR7Y3VycmVuY3l9JHt2YWx1ZTIudG9GaXhlZCgyKX1gOwogICAgICB9OwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgCiAgICAgICAgY2xhc3M9InByb2R1Y3QtY2FyZCAke3RoaXMuc2VsZWN0YWJsZSA/ICJzZWxlY3RhYmxlIiA6ICIifSAke3RoaXMuc2VsZWN0ZWQgPyAic2VsZWN0ZWQiIDogIiJ9IgogICAgICAgIEBjbGljaz0ke3RoaXMuaGFuZGxlQ2FyZENsaWNrfQogICAgICA+CiAgICAgICAgPGRpdiBjbGFzcz0icHJvZHVjdC1pbWFnZSI+CiAgICAgICAgICAke2ltYWdlVXJsID8gYjJgCiAgICAgICAgICAgIDxpbWcgc3JjPSIke2ltYWdlVXJsfSIgYWx0PSIke25hbWV9Ij4KICAgICAgICAgIGAgOiBiMmAKICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0ke2ljb25OYW1lfT48L2RlZXMtaWNvbj4KICAgICAgICAgIGB9CiAgICAgICAgICAke3RoaXMuc2VsZWN0YWJsZSA/IGIyYAogICAgICAgICAgICA8ZGl2IAogICAgICAgICAgICAgIGNsYXNzPSJzZWxlY3Rpb24tY2hlY2tib3ggJHt0aGlzLnNlbGVjdGVkID8gImNoZWNrZWQiIDogIiJ9IgogICAgICAgICAgICAgIEBjbGljaz0keyhlMTEpID0+IHsKICAgICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3Rpb25Ub2dnbGUoKTsKICAgICAgfX0KICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOmNoZWNrIn0+PC9kZWVzLWljb24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYCA6ICIifQogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InByb2R1Y3QtY29udGVudCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9kdWN0LWhlYWRlciI+CiAgICAgICAgICAgICR7Y2F0ZWdvcnkgPyBiMmA8ZGl2IGNsYXNzPSJwcm9kdWN0LWNhdGVnb3J5Ij4ke2NhdGVnb3J5fTwvZGl2PmAgOiAiIn0KICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvZHVjdC1uYW1lIj4ke25hbWV9PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICR7ZGVzY3JpcHRpb24gPyBiMmAKICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvZHVjdC1kZXNjcmlwdGlvbiI+JHtkZXNjcmlwdGlvbn08L2Rpdj4KICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgIDxkaXYgY2xhc3M9InN0b2NrLXN0YXR1cyAke2luU3RvY2sgPyAiaW4tc3RvY2siIDogIm91dC1vZi1zdG9jayJ9Ij4KICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0ke2luU3RvY2sgPyAibHVjaWRlOmNoZWNrLWNpcmNsZSIgOiAibHVjaWRlOngtY2lyY2xlIn0+PC9kZWVzLWljb24+CiAgICAgICAgICAgICR7c3RvY2tUZXh0fQogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9kdWN0LWZvb3RlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InByb2R1Y3QtcHJpY2UiPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwcmljZS1jdXJyZW50Ij4ke2Zvcm1hdFByaWNlKHByaWNlKX08L3NwYW4+CiAgICAgICAgICAgICAgJHtvcmlnaW5hbFByaWNlICYmIG9yaWdpbmFsUHJpY2UgPiBwcmljZSA/IGIyYAogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InByaWNlLW9yaWdpbmFsIj4ke2Zvcm1hdFByaWNlKG9yaWdpbmFsUHJpY2UpfTwvc3Bhbj4KICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAke3RoaXMuc2hvd1F1YW50aXR5U2VsZWN0b3IgPyBiMmAKICAgICAgICAgICAgICA8ZGVlcy1pbnB1dC1xdWFudGl0eXNlbGVjdG9yCiAgICAgICAgICAgICAgICAudmFsdWU9JHt0aGlzLnF1YW50aXR5fQogICAgICAgICAgICAgICAgQGNoYW5nZVN1YmplY3Q9JHsoZTExKSA9PiB7CiAgICAgICAgdGhpcy5xdWFudGl0eSA9IGUxMS5kZXRhaWwuZ2V0VmFsdWUoKTsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJxdWFudGl0eUNoYW5nZSIsIHsKICAgICAgICAgIGRldGFpbDogewogICAgICAgICAgICBxdWFudGl0eTogdGhpcy5xdWFudGl0eSwKICAgICAgICAgICAgcHJvZHVjdERhdGE6IHRoaXMucHJvZHVjdERhdGEKICAgICAgICAgIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH19CiAgICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC1xdWFudGl0eXNlbGVjdG9yPgogICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgaGFuZGxlQ2FyZENsaWNrKCkgewogICAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZCA9ICF0aGlzLnNlbGVjdGVkOwogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInNlbGVjdGlvbkNoYW5nZSIsIHsKICAgICAgICAgIGRldGFpbDogewogICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5zZWxlY3RlZCwKICAgICAgICAgICAgcHJvZHVjdERhdGE6IHRoaXMucHJvZHVjdERhdGEKICAgICAgICAgIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZVNlbGVjdGlvblRvZ2dsZSgpIHsKICAgICAgdGhpcy5zZWxlY3RlZCA9ICF0aGlzLnNlbGVjdGVkOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJzZWxlY3Rpb25DaGFuZ2UiLCB7CiAgICAgICAgZGV0YWlsOiB7CiAgICAgICAgICBzZWxlY3RlZDogdGhpcy5zZWxlY3RlZCwKICAgICAgICAgIHByb2R1Y3REYXRhOiB0aGlzLnByb2R1Y3REYXRhCiAgICAgICAgfSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczIyKHRoaXMsIF9zZWxlY3RlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczIyKF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzU2hvcHBpbmdQcm9kdWN0Y2FyZDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtcXVhbnRpdHlzZWxlY3Rvci9kZWVzLWlucHV0LXF1YW50aXR5c2VsZWN0b3IuZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgZGVtb0Z1bmMxNCA9ICgpID0+IGIyYAogIDxkZWVzLWRlbW93cmFwcGVyPgogICAgPHN0eWxlPgogICAgICAke2lgCiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICAgIG1heC13aWR0aDogMTIwMHB4OwogICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5zaG9wcGluZy1ncmlkIHsKICAgICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgyODBweCwgMWZyKSk7CiAgICAgICAgICBnYXA6IDIwcHg7CiAgICAgICAgfQoKICAgICAgICAuY2FydC1zdW1tYXJ5IHsKICAgICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMjE1IDIwLjIlIDE2LjglKSIpfTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgOTEuNCUpIiwgImhzbCgyMTUgMjAuMiUgMjEuOCUpIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIH0KCiAgICAgICAgLmNhcnQtc3VtbWFyeS10aXRsZSB7CiAgICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk1JSkiKX07CiAgICAgICAgfQoKICAgICAgICAuY2FydC1pdGVtIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgcGFkZGluZzogOHB4IDA7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgMjYuNyUpIiwgImhzbCgyMTcuOSAxMC42JSA3NC45JSkiKX07CiAgICAgICAgfQoKICAgICAgICAuY2FydC10b3RhbCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIHBhZGRpbmctdG9wOiAxNnB4OwogICAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICAgIGJvcmRlci10b3A6IDJweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICAgIH0KICAgICAgYH0KICAgIDwvc3R5bGU+CiAgICAKICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkJhc2ljIFF1YW50aXR5IFNlbGVjdG9yIn0gLnN1YnRpdGxlPSR7IlNpbXBsZSBxdWFudGl0eSBpbnB1dCB3aXRoIGluY3JlbWVudC9kZWNyZW1lbnQgYnV0dG9ucyJ9PgogICAgICAgIDxkZWVzLWlucHV0LXF1YW50aXR5c2VsZWN0b3IKICAgICAgICAgIC5sYWJlbD0keyJRdWFudGl0eSJ9CiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiU2VsZWN0IHRoZSBkZXNpcmVkIHF1YW50aXR5In0KICAgICAgICAgIC52YWx1ZT0kezF9CiAgICAgICAgPjwvZGVlcy1pbnB1dC1xdWFudGl0eXNlbGVjdG9yPgogICAgICAgIAogICAgICAgIDxkZWVzLWlucHV0LXF1YW50aXR5c2VsZWN0b3IKICAgICAgICAgIC5sYWJlbD0keyJJdGVtcyBpbiBDYXJ0In0KICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJBZGp1c3QgdGhlIHF1YW50aXR5IG9mIGl0ZW1zIn0KICAgICAgICAgIC52YWx1ZT0kezN9CiAgICAgICAgPjwvZGVlcy1pbnB1dC1xdWFudGl0eXNlbGVjdG9yPgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiU2hvcHBpbmcgQ2FydCJ9IC5zdWJ0aXRsZT0keyJNb2Rlcm4gZS1jb21tZXJjZSBwcm9kdWN0IGNhcmRzIHdpdGggaW50ZXJhY3RpdmUgcXVhbnRpdHkgc2VsZWN0b3JzIn0gLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCB1cGRhdGVDYXJ0U3VtbWFyeSA9ICgpID0+IHsKICAgIGNvbnN0IGNhcmQxID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjaGVhZHBob25lcy1xdHkiKTsKICAgIGNvbnN0IGNhcmQyID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjbW91c2UtcXR5Iik7CiAgICBjb25zdCBjYXJkMyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiI2tleWJvYXJkLXF0eSIpOwogICAgY29uc3QgcXR5MSA9IGNhcmQxPy5xdWFudGl0eSB8fCAwOwogICAgY29uc3QgcXR5MiA9IGNhcmQyPy5xdWFudGl0eSB8fCAwOwogICAgY29uc3QgcXR5MyA9IGNhcmQzPy5xdWFudGl0eSB8fCAwOwogICAgY29uc3QgcHJpY2UxID0gMzQ5Ljk5ICogcXR5MTsKICAgIGNvbnN0IHByaWNlMiA9IDk5Ljk5ICogcXR5MjsKICAgIGNvbnN0IHByaWNlMyA9IDc5Ljk5ICogcXR5MzsKICAgIGNvbnN0IHRvdGFsID0gcHJpY2UxICsgcHJpY2UyICsgcHJpY2UzOwogICAgY29uc3Qgc3VtbWFyeSA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiI2NhcnQtc3VtbWFyeS1jb250ZW50Iik7CiAgICBpZiAoc3VtbWFyeSkgewogICAgICBzdW1tYXJ5LmlubmVySFRNTCA9IGAKICAgICAgICAgICAgICAke3F0eTEgPiAwID8gYDxkaXYgY2xhc3M9ImNhcnQtaXRlbSI+CiAgICAgICAgICAgICAgICA8c3Bhbj5Tb255IFdILTEwMDBYTTUgKCR7cXR5MX0pPC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4+JCR7cHJpY2UxLnRvRml4ZWQoMil9PC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PmAgOiAiIn0KICAgICAgICAgICAgICAke3F0eTIgPiAwID8gYDxkaXYgY2xhc3M9ImNhcnQtaXRlbSI+CiAgICAgICAgICAgICAgICA8c3Bhbj5Mb2dpdGVjaCBNWCBNYXN0ZXIgM1MgKCR7cXR5Mn0pPC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4+JCR7cHJpY2UyLnRvRml4ZWQoMil9PC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PmAgOiAiIn0KICAgICAgICAgICAgICAke3F0eTMgPiAwID8gYDxkaXYgY2xhc3M9ImNhcnQtaXRlbSI+CiAgICAgICAgICAgICAgICA8c3Bhbj5LZXljaHJvbiBLMiAoJHtxdHkzfSk8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3Bhbj4kJHtwcmljZTMudG9GaXhlZCgyKX08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+YCA6ICIifQogICAgICAgICAgICAgICR7dG90YWwgPT09IDAgPyAnPGRpdiBjbGFzcz0iY2FydC1pdGVtIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzk5OTsiPllvdXIgY2FydCBpcyBlbXB0eTwvZGl2PicgOiAiIn0KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJ0LXRvdGFsIj4KICAgICAgICAgICAgICAgIDxzcGFuPlRvdGFsPC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4+JCR7dG90YWwudG9GaXhlZCgyKX08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIGA7CiAgICB9CiAgfTsKICBzZXRUaW1lb3V0KHVwZGF0ZUNhcnRTdW1tYXJ5LCAxMDApOwogIGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZCIpLmZvckVhY2goKGNhcmQpID0+IHsKICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcigicXVhbnRpdHlDaGFuZ2UiLCB1cGRhdGVDYXJ0U3VtbWFyeSk7CiAgfSk7Cn19PgogICAgICAgIDxkaXYgY2xhc3M9InNob3BwaW5nLWdyaWQiPgogICAgICAgICAgPGRlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQKICAgICAgICAgICAgaWQ9ImhlYWRwaG9uZXMtcXR5IgogICAgICAgICAgICAucHJvZHVjdERhdGE9JHt7CiAgbmFtZTogIlNvbnkgV0gtMTAwMFhNNSBXaXJlbGVzcyBIZWFkcGhvbmVzIiwKICBjYXRlZ29yeTogIkF1ZGlvIiwKICBkZXNjcmlwdGlvbjogIkluZHVzdHJ5LWxlYWRpbmcgbm9pc2UgY2FuY2VsaW5nIHdpdGggQXV0byBOQyBPcHRpbWl6ZXIiLAogIHByaWNlOiAzNDkuOTksCiAgb3JpZ2luYWxQcmljZTogMzk5Ljk5LAogIGljb25OYW1lOiAibHVjaWRlOmhlYWRwaG9uZXMiCn19CiAgICAgICAgICAgIC5xdWFudGl0eT0kezF9CiAgICAgICAgICA+PC9kZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZAogICAgICAgICAgICBpZD0ibW91c2UtcXR5IgogICAgICAgICAgICAucHJvZHVjdERhdGE9JHt7CiAgbmFtZTogIkxvZ2l0ZWNoIE1YIE1hc3RlciAzUyIsCiAgY2F0ZWdvcnk6ICJBY2Nlc3NvcmllcyIsCiAgZGVzY3JpcHRpb246ICJQZXJmb3JtYW5jZSB3aXJlbGVzcyBtb3VzZSB3aXRoIHVsdHJhLWZhc3Qgc2Nyb2xsaW5nIiwKICBwcmljZTogOTkuOTksCiAgaWNvbk5hbWU6ICJsdWNpZGU6bW91c2UtcG9pbnRlciIKfX0KICAgICAgICAgICAgLnF1YW50aXR5PSR7Mn0KICAgICAgICAgID48L2RlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQ+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkCiAgICAgICAgICAgIGlkPSJrZXlib2FyZC1xdHkiCiAgICAgICAgICAgIC5wcm9kdWN0RGF0YT0ke3sKICBuYW1lOiAiS2V5Y2hyb24gSzIgV2lyZWxlc3MgTWVjaGFuaWNhbCBLZXlib2FyZCIsCiAgY2F0ZWdvcnk6ICJLZXlib2FyZHMiLAogIGRlc2NyaXB0aW9uOiAiQ29tcGFjdCA3NSUgbGF5b3V0IHdpdGggaG90LXN3YXBwYWJsZSBzd2l0Y2hlcyIsCiAgcHJpY2U6IDc5Ljk5LAogIG9yaWdpbmFsUHJpY2U6IDk0Ljk5LAogIGljb25OYW1lOiAibHVjaWRlOmtleWJvYXJkIgp9fQogICAgICAgICAgICAucXVhbnRpdHk9JHsxfQogICAgICAgICAgPjwvZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iY2FydC1zdW1tYXJ5Ij4KICAgICAgICAgIDxoMyBjbGFzcz0iY2FydC1zdW1tYXJ5LXRpdGxlIj5PcmRlciBTdW1tYXJ5PC9oMz4KICAgICAgICAgIDxkaXYgaWQ9ImNhcnQtc3VtbWFyeS1jb250ZW50Ij4KICAgICAgICAgICAgPCEtLSBDb250ZW50IHdpbGwgYmUgZHluYW1pY2FsbHkgdXBkYXRlZCAtLT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiUmVxdWlyZWQgJiBEaXNhYmxlZCBTdGF0ZXMifSAuc3VidGl0bGU9JHsiRGlmZmVyZW50IHN0YXRlcyBmb3IgdmFsaWRhdGlvbiBhbmQgcmVzdHJpY3Rpb25zIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtcXVhbnRpdHlzZWxlY3RvcgogICAgICAgICAgLmxhYmVsPSR7Ik51bWJlciBvZiBMaWNlbnNlcyJ9CiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiU2VsZWN0IGhvdyBtYW55IGxpY2Vuc2VzIHlvdSBuZWVkIn0KICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICAudmFsdWU9JHsxfQogICAgICAgID48L2RlZXMtaW5wdXQtcXVhbnRpdHlzZWxlY3Rvcj4KICAgICAgICAKICAgICAgICA8ZGVlcy1pbnB1dC1xdWFudGl0eXNlbGVjdG9yCiAgICAgICAgICAubGFiZWw9JHsiRml4ZWQgUXVhbnRpdHkifQogICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IlRoaXMgcXVhbnRpdHkgY2Fubm90IGJlIGNoYW5nZWQifQogICAgICAgICAgLmRpc2FibGVkPSR7dHJ1ZX0KICAgICAgICAgIC52YWx1ZT0kezV9CiAgICAgICAgPjwvZGVlcy1pbnB1dC1xdWFudGl0eXNlbGVjdG9yPgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiT3JkZXIgRm9ybSJ9IC5zdWJ0aXRsZT0keyJDb21wbGV0ZSBvcmRlciBmb3JtIHdpdGggcXVhbnRpdHkgc2VsZWN0aW9uIn0+CiAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgLmxhYmVsPSR7IkN1c3RvbWVyIE5hbWUifSAucmVxdWlyZWQ9JHt0cnVlfT48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAgIC5sYWJlbD0keyJQcm9kdWN0In0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbIkJhc2ljIFBsYW4iLCAiUHJvIFBsYW4iLCAiRW50ZXJwcmlzZSBQbGFuIl19CiAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWRyb3Bkb3duPgogICAgICAgICAgPGRlZXMtaW5wdXQtcXVhbnRpdHlzZWxlY3RvcgogICAgICAgICAgICAubGFiZWw9JHsiUXVhbnRpdHkifQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiTnVtYmVyIG9mIGxpY2Vuc2VzIn0KICAgICAgICAgICAgLnZhbHVlPSR7MX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtcXVhbnRpdHlzZWxlY3Rvcj4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQKICAgICAgICAgICAgLmxhYmVsPSR7IlNwZWNpYWwgSW5zdHJ1Y3Rpb25zIn0KICAgICAgICAgICAgLmlucHV0VHlwZT0keyJ0ZXh0YXJlYSJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgPC9kZWVzLWZvcm0+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGl2PgogIDwvZGVlcy1kZW1vd3JhcHBlcj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXF1YW50aXR5c2VsZWN0b3IvZGVlcy1pbnB1dC1xdWFudGl0eXNlbGVjdG9yLmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfZGlzdF90czI1KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTIyID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMyMyA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0lucHV0UXVhbnRpdHlTZWxlY3RvciA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtaW5wdXQtcXVhbnRpdHlzZWxlY3RvciIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzSW5wdXRCYXNlOwogIGxldCBfdmFsdWVfZGVjb3JhdG9yczsKICBsZXQgX3ZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0lucHV0UXVhbnRpdHlTZWxlY3RvcjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF92YWx1ZV9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBOdW1iZXIKICAgICAgfSldOwogICAgICBfX2VzRGVjb3JhdGUyMih0aGlzLCBudWxsLCBfdmFsdWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmFsdWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInZhbHVlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZhbHVlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52YWx1ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF92YWx1ZV9pbml0aWFsaXplcnMsIF92YWx1ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTIyKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0lucHV0UXVhbnRpdHlTZWxlY3RvcjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzE0OwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIklucHV0Il07CiAgICAjdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMjModGhpcywgX3ZhbHVlX2luaXRpYWxpemVycywgMSk7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IHZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy4jdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB2YWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgLi4uRGVlc0lucHV0QmFzZS5iYXNlU3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgICA6aG9zdCB7CiAgICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIH0KCiAgICAgICAgLnF1YW50aXR5LWNvbnRhaW5lciB7CiAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgICAgaGVpZ2h0OiA0MHB4OwogICAgICAgICAgcGFkZGluZzogMDsKICAgICAgICAgIG1pbi13aWR0aDogMTIwcHg7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAucXVhbnRpdHktY29udGFpbmVyLmRpc2FibGVkIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NS4xJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIH0KCiAgICAgICAgLnF1YW50aXR5LWNvbnRhaW5lcjpob3Zlcjpub3QoLmRpc2FibGVkKSB7CiAgICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA3OS44JSkiLCAiaHNsKDAgMCUgMjAuOSUpIil9OwogICAgICAgIH0KCiAgICAgICAgLnF1YW50aXR5LWNvbnRhaW5lcjpmb2N1cy13aXRoaW4gewogICAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIil9OwogICAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgM3B4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgNTEuMiUgLyAwLjEpIiwgImhzbCgyMTcuMiA5MS4yJSA1OS44JSAvIDAuMSkiKX07CiAgICAgICAgfQoKICAgICAgICAuc2VsZWN0b3IgewogICAgICAgICAgZmxleDogMCAwIDQwcHg7CiAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNTYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNTUuMSUpIil9OwogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIH0KCiAgICAgICAgLnNlbGVjdG9yOmhvdmVyIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NS4xJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTUlKSIpfTsKICAgICAgICB9CgogICAgICAgIC5zZWxlY3RvcjphY3RpdmUgewogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDkxJSkiLCAiaHNsKDAgMCUgMTElKSIpfTsKICAgICAgICB9CgogICAgICAgIC5zZWxlY3Rvci5taW51cyB7CiAgICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICB9CgogICAgICAgIC5zZWxlY3Rvci5wbHVzIHsKICAgICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgfQoKICAgICAgICAucXVhbnRpdHkgewogICAgICAgICAgZmxleDogMTsKICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAwNmVtOwogICAgICAgIH0KCiAgICAgICAgLyogS2V5Ym9hcmQgbmF2aWdhdGlvbiBmb2N1cyBzdHlsZXMgKi8KICAgICAgICAuc2VsZWN0b3I6Zm9jdXMgewogICAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSAxNi44JSkiKX07CiAgICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIH0KCiAgICAgICAgLyogTWluIHZhbHVlIHN0YXRlICovCiAgICAgICAgLnF1YW50aXR5LWNvbnRhaW5lcltkYXRhLW1pbj0idHJ1ZSJdIC5zZWxlY3Rvci5taW51cyB7CiAgICAgICAgICBvcGFjaXR5OiAwLjM7CiAgICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICAgIH0KCiAgICAgICAgLnF1YW50aXR5LWNvbnRhaW5lcltkYXRhLW1pbj0idHJ1ZSJdIC5zZWxlY3Rvci5taW51czpob3ZlciB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDU2LjklKSIsICJoc2woMjE1IDIwLjIlIDU1LjElKSIpfTsKICAgICAgICB9CgogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJpbnB1dC13cmFwcGVyIj4KICAgICAgICAke3RoaXMubGFiZWwgPyBiMmA8ZGVlcy1sYWJlbCAubGFiZWw9JHt0aGlzLmxhYmVsfSAuZGVzY3JpcHRpb249JHt0aGlzLmRlc2NyaXB0aW9ufSAucmVxdWlyZWQ9JHt0aGlzLnJlcXVpcmVkfT48L2RlZXMtbGFiZWw+YCA6ICIifQogICAgICAgIDxkaXYgCiAgICAgICAgICBjbGFzcz0icXVhbnRpdHktY29udGFpbmVyICR7dGhpcy5kaXNhYmxlZCA/ICJkaXNhYmxlZCIgOiAiIn0iCiAgICAgICAgICBkYXRhLW1pbj0iJHt0aGlzLnZhbHVlIDw9IDB9IgogICAgICAgID4KICAgICAgICAgIDxkaXYgCiAgICAgICAgICAgIGNsYXNzPSJzZWxlY3RvciBtaW51cyIgCiAgICAgICAgICAgIEBjbGljaz0iJHsoKSA9PiB7CiAgICAgICAgdGhpcy5kZWNyZWFzZSgpOwogICAgICB9fSIKICAgICAgICAgICAgdGFiaW5kZXg9IiR7dGhpcy5kaXNhYmxlZCA/ICItMSIgOiAiMCJ9IgogICAgICAgICAgICBAa2V5ZG93bj0iJHsoZTExKSA9PiB7CiAgICAgICAgaWYgKGUxMS5rZXkgPT09ICJFbnRlciIgfHwgZTExLmtleSA9PT0gIiAiKSB7CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuZGVjcmVhc2UoKTsKICAgICAgICB9CiAgICAgIH19IgogICAgICAgICAgICByb2xlPSJidXR0b24iCiAgICAgICAgICAgIGFyaWEtbGFiZWw9IkRlY3JlYXNlIHF1YW50aXR5IgogICAgICAgICAgPuKIkjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icXVhbnRpdHkiIGFyaWEtbGl2ZT0icG9saXRlIiBhcmlhLWF0b21pYz0idHJ1ZSI+JHt0aGlzLnZhbHVlfTwvZGl2PgogICAgICAgICAgPGRpdiAKICAgICAgICAgICAgY2xhc3M9InNlbGVjdG9yIHBsdXMiIAogICAgICAgICAgICBAY2xpY2s9IiR7KCkgPT4gewogICAgICAgIHRoaXMuaW5jcmVhc2UoKTsKICAgICAgfX0iCiAgICAgICAgICAgIHRhYmluZGV4PSIke3RoaXMuZGlzYWJsZWQgPyAiLTEiIDogIjAifSIKICAgICAgICAgICAgQGtleWRvd249IiR7KGUxMSkgPT4gewogICAgICAgIGlmIChlMTEua2V5ID09PSAiRW50ZXIiIHx8IGUxMS5rZXkgPT09ICIgIikgewogICAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICB0aGlzLmluY3JlYXNlKCk7CiAgICAgICAgfQogICAgICB9fSIKICAgICAgICAgICAgcm9sZT0iYnV0dG9uIgogICAgICAgICAgICBhcmlhLWxhYmVsPSJJbmNyZWFzZSBxdWFudGl0eSIKICAgICAgICAgID4rPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGluY3JlYXNlKCkgewogICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHsKICAgICAgICB0aGlzLnZhbHVlKys7CiAgICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIGRlY3JlYXNlKCkgewogICAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgdGhpcy52YWx1ZSA+IDApIHsKICAgICAgICB0aGlzLnZhbHVlLS07CiAgICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIGdldFZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy52YWx1ZTsKICAgIH0KICAgIHNldFZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLnZhbHVlID0gdmFsdWUyOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMjModGhpcywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMjMoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNJbnB1dFF1YW50aXR5U2VsZWN0b3IyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXJhZGlvZ3JvdXAvZGVlcy1pbnB1dC1yYWRpb2dyb3VwLmRlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW9GdW5jMTUgPSAoKSA9PiBiMmAKICA8ZGVlcy1kZW1vd3JhcHBlcj4KICAgIDxzdHlsZT4KICAgICAgJHtpYAogICAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMjRweDsKICAgICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgICBtYXgtd2lkdGg6IDEyMDBweDsKICAgICAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBkZWVzLXBhbmVsIHsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGRlZXMtcGFuZWw6bGFzdC1jaGlsZCB7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuZGVtby1ncmlkIHsKICAgICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDMwMHB4LCAxZnIpKTsKICAgICAgICAgIGdhcDogMjRweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnJlc3VsdC1kaXNwbGF5IHsKICAgICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAxMDUsIDI0MiwgMC4xKTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICBgfQogICAgPC9zdHlsZT4KICAgIAogICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiMS4gQmFzaWMgUmFkaW8gR3JvdXBzIn0gLnN1YnRpdGxlPSR7IlNpbXBsZSBzdHJpbmcgb3B0aW9ucyBmb3IgY29tbW9uIHVzZSBjYXNlcyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImRlbW8tZ3JpZCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1yYWRpb2dyb3VwCiAgICAgICAgICAgIC5sYWJlbD0keyJTdWJzY3JpcHRpb24gUGxhbiJ9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WyJCYXNpYyAtICQ5L21vbnRoIiwgIlBybyAtICQyOS9tb250aCIsICJFbnRlcnByaXNlIC0gJDk5L21vbnRoIl19CiAgICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJQcm8gLSAkMjkvbW9udGgifQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiQ2hvb3NlIHlvdXIgc3Vic2NyaXB0aW9uIHRpZXIifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1yYWRpb2dyb3VwPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1yYWRpb2dyb3VwCiAgICAgICAgICAgIC5sYWJlbD0keyJQcmlvcml0eSBMZXZlbCJ9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WyJIaWdoIiwgIk1lZGl1bSIsICJMb3ciXX0KICAgICAgICAgICAgLnNlbGVjdGVkT3B0aW9uPSR7Ik1lZGl1bSJ9CiAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXJhZGlvZ3JvdXA+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyIyLiBIb3Jpem9udGFsIExheW91dCJ9IC5zdWJ0aXRsZT0keyJSYWRpbyBncm91cHMgd2l0aCBob3Jpem9udGFsIGFycmFuZ2VtZW50In0+CiAgICAgICAgPGRlZXMtaW5wdXQtcmFkaW9ncm91cAogICAgICAgICAgLmxhYmVsPSR7IkRvIHlvdSBhZ3JlZSB3aXRoIHRoZSB0ZXJtcz8ifQogICAgICAgICAgLm9wdGlvbnM9JHtbIlllcyIsICJObyIsICJNYXliZSJdfQogICAgICAgICAgLmRpcmVjdGlvbj0keyJob3Jpem9udGFsIn0KICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJZZXMifQogICAgICAgID48L2RlZXMtaW5wdXQtcmFkaW9ncm91cD4KICAgICAgICAKICAgICAgICA8ZGVlcy1pbnB1dC1yYWRpb2dyb3VwCiAgICAgICAgICAubGFiZWw9JHsiRXhwZXJpZW5jZSBMZXZlbCJ9CiAgICAgICAgICAub3B0aW9ucz0ke1siQmVnaW5uZXIiLCAiSW50ZXJtZWRpYXRlIiwgIkV4cGVydCJdfQogICAgICAgICAgLmRpcmVjdGlvbj0keyJob3Jpem9udGFsIn0KICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJJbnRlcm1lZGlhdGUifQogICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IlNlbGVjdCB5b3VyIGV4cGVyaWVuY2UgbGV2ZWwgd2l0aCB3ZWIgZGV2ZWxvcG1lbnQifQogICAgICAgID48L2RlZXMtaW5wdXQtcmFkaW9ncm91cD4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjMuIEFkdmFuY2VkIE9wdGlvbnMifSAuc3VidGl0bGU9JHsiVXNpbmcgb2JqZWN0IGZvcm1hdCB3aXRoIGtleXMgYW5kIHBheWxvYWRzIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtcmFkaW9ncm91cAogICAgICAgICAgaWQ9ImFkdmFuY2VkLXJhZGlvIgogICAgICAgICAgLmxhYmVsPSR7IlNlbGVjdCBSZWdpb24ifQogICAgICAgICAgLm9wdGlvbnM9JHtbCiAgeyBvcHRpb246ICJVbml0ZWQgU3RhdGVzIChVUyBFYXN0KSIsIGtleTogInVzLWVhc3QiLCBwYXlsb2FkOiB7IHJlZ2lvbjogInVzLWVhc3QtMSIsIGxhdGVuY3k6IDIwIH0gfSwKICB7IG9wdGlvbjogIkV1cm9wZSAoRnJhbmtmdXJ0KSIsIGtleTogImV1LWNlbnRyYWwiLCBwYXlsb2FkOiB7IHJlZ2lvbjogImV1LWNlbnRyYWwtMSIsIGxhdGVuY3k6IDUwIH0gfSwKICB7IG9wdGlvbjogIkFzaWEgUGFjaWZpYyAoU2luZ2Fwb3JlKSIsIGtleTogImFwLXNvdXRoZWFzdCIsIHBheWxvYWQ6IHsgcmVnaW9uOiAiYXAtc291dGhlYXN0LTEiLCBsYXRlbmN5OiAxMjAgfSB9Cl19CiAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiZXUtY2VudHJhbCJ9CiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiQ2hvb3NlIHRoZSBjbG9zZXN0IHJlZ2lvbiBmb3Igb3B0aW1hbCBwZXJmb3JtYW5jZSJ9CiAgICAgICAgICBAY2hhbmdlPSR7KGUxMSkgPT4gewogIGNvbnN0IGRpc3BsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcmVnaW9uLXJlc3VsdCIpOwogIGlmIChkaXNwbGF5KSB7CiAgICBkaXNwbGF5LnRleHRDb250ZW50ID0gIlNlbGVjdGVkOiAiICsgSlNPTi5zdHJpbmdpZnkoZTExLmRldGFpbC52YWx1ZSwgbnVsbCwgMik7CiAgfQp9fQogICAgICAgID48L2RlZXMtaW5wdXQtcmFkaW9ncm91cD4KICAgICAgICA8ZGl2IGlkPSJyZWdpb24tcmVzdWx0IiBjbGFzcz0icmVzdWx0LWRpc3BsYXkiPlNlbGVjdGVkOiB7ICJyZWdpb24iOiAiZXUtY2VudHJhbC0xIiwgImxhdGVuY3kiOiA1MCB9PC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI0LiBTdXJ2ZXkgRXhhbXBsZSJ9IC5zdWJ0aXRsZT0keyJNdWx0aXBsZSByYWRpbyBncm91cHMgZm9yIHN1cnZleXMgYW5kIGZvcm1zIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iZGVtby1ncmlkIj4KICAgICAgICAgIDxkZWVzLWlucHV0LXJhZGlvZ3JvdXAKICAgICAgICAgICAgLmxhYmVsPSR7IkhvdyBzYXRpc2ZpZWQgYXJlIHlvdT8ifQogICAgICAgICAgICAub3B0aW9ucz0ke1siVmVyeSBTYXRpc2ZpZWQiLCAiU2F0aXNmaWVkIiwgIk5ldXRyYWwiLCAiRGlzc2F0aXNmaWVkIiwgIlZlcnkgRGlzc2F0aXNmaWVkIl19CiAgICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJTYXRpc2ZpZWQifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1yYWRpb2dyb3VwPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1yYWRpb2dyb3VwCiAgICAgICAgICAgIC5sYWJlbD0keyJXb3VsZCB5b3UgcmVjb21tZW5kIHVzPyJ9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WyJEZWZpbml0ZWx5IiwgIlByb2JhYmx5IiwgIk5vdCBTdXJlIiwgIlByb2JhYmx5IE5vdCIsICJEZWZpbml0ZWx5IE5vdCJdfQogICAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiUHJvYmFibHkifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1yYWRpb2dyb3VwPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiNS4gU3RhdGVzICYgVmFsaWRhdGlvbiJ9IC5zdWJ0aXRsZT0keyJEaWZmZXJlbnQgc3RhdGVzIGFuZCB2YWxpZGF0aW9uIGV4YW1wbGVzIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iZGVtby1ncmlkIj4KICAgICAgICAgIDxkZWVzLWlucHV0LXJhZGlvZ3JvdXAKICAgICAgICAgICAgLmxhYmVsPSR7IlJlcXVpcmVkIFNlbGVjdGlvbiJ9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WyJPcHRpb24gQSIsICJPcHRpb24gQiIsICJPcHRpb24gQyJdfQogICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiVGhpcyBmaWVsZCBpcyByZXF1aXJlZCJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXJhZGlvZ3JvdXA+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LXJhZGlvZ3JvdXAKICAgICAgICAgICAgLmxhYmVsPSR7IkRpc2FibGVkIFN0YXRlIn0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbIkRpc2FibGVkIE9wdGlvbiAxIiwgIkRpc2FibGVkIE9wdGlvbiAyIiwgIkRpc2FibGVkIE9wdGlvbiAzIl19CiAgICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJEaXNhYmxlZCBPcHRpb24gMiJ9CiAgICAgICAgICAgIC5kaXNhYmxlZD0ke3RydWV9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXJhZGlvZ3JvdXA+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI2LiBTZXR0aW5ncyBFeGFtcGxlIn0gLnN1YnRpdGxlPSR7IkNvbW1vbiBwYXR0ZXJucyBpbiBhcHBsaWNhdGlvbiBzZXR0aW5ncyJ9PgogICAgICAgIDxkZWVzLWlucHV0LXJhZGlvZ3JvdXAKICAgICAgICAgIC5sYWJlbD0keyJUaGVtZSBQcmVmZXJlbmNlIn0KICAgICAgICAgIC5vcHRpb25zPSR7WwogIHsgb3B0aW9uOiAiTGlnaHQgVGhlbWUiLCBrZXk6ICJsaWdodCIsIHBheWxvYWQ6ICJsaWdodCIgfSwKICB7IG9wdGlvbjogIkRhcmsgVGhlbWUiLCBrZXk6ICJkYXJrIiwgcGF5bG9hZDogImRhcmsiIH0sCiAgeyBvcHRpb246ICJTeXN0ZW0gRGVmYXVsdCIsIGtleTogInN5c3RlbSIsIHBheWxvYWQ6ICJhdXRvIiB9Cl19CiAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiZGFyayJ9CiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiQ2hvb3NlIGhvdyB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGFwcGVhciJ9CiAgICAgICAgPjwvZGVlcy1pbnB1dC1yYWRpb2dyb3VwPgogICAgICAgIAogICAgICAgIDxkZWVzLWlucHV0LXJhZGlvZ3JvdXAKICAgICAgICAgIC5sYWJlbD0keyJOb3RpZmljYXRpb24gRnJlcXVlbmN5In0KICAgICAgICAgIC5vcHRpb25zPSR7WyJBbGwgTm90aWZpY2F0aW9ucyIsICJJbXBvcnRhbnQgT25seSIsICJOb25lIl19CiAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiSW1wb3J0YW50IE9ubHkifQogICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IkNvbnRyb2wgaG93IG9mdGVuIHlvdSByZWNlaXZlIG5vdGlmaWNhdGlvbnMifQogICAgICAgID48L2RlZXMtaW5wdXQtcmFkaW9ncm91cD4KICAgICAgICAKICAgICAgICA8ZGVlcy1pbnB1dC1yYWRpb2dyb3VwCiAgICAgICAgICAubGFiZWw9JHsiTGFuZ3VhZ2UifQogICAgICAgICAgLm9wdGlvbnM9JHtbIkVuZ2xpc2giLCAiR2VybWFuIiwgIkZyZW5jaCIsICJTcGFuaXNoIiwgIkphcGFuZXNlIl19CiAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiRW5nbGlzaCJ9CiAgICAgICAgICAuZGlyZWN0aW9uPSR7Imhvcml6b250YWwifQogICAgICAgID48L2RlZXMtaW5wdXQtcmFkaW9ncm91cD4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjcuIEZvcm0gSW50ZWdyYXRpb24ifSAuc3VidGl0bGU9JHsiV29ya3Mgc2VhbWxlc3NseSB3aXRoIGRlZXMtZm9ybSJ9PgogICAgICAgIDxkZWVzLWZvcm0+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0CiAgICAgICAgICAgIC5sYWJlbD0keyJQcm9kdWN0IE5hbWUifQogICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAua2V5PSR7InByb2R1Y3ROYW1lIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtcmFkaW9ncm91cAogICAgICAgICAgICAubGFiZWw9JHsiUHJvZHVjdCBDYXRlZ29yeSJ9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WyJFbGVjdHJvbmljcyIsICJDbG90aGluZyIsICJCb29rcyIsICJIb21lICYgR2FyZGVuIiwgIlNwb3J0cyJdfQogICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAua2V5PSR7ImNhdGVnb3J5In0KICAgICAgICAgID48L2RlZXMtaW5wdXQtcmFkaW9ncm91cD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtcmFkaW9ncm91cAogICAgICAgICAgICAubGFiZWw9JHsiQ29uZGl0aW9uIn0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbIk5ldyIsICJMaWtlIE5ldyIsICJHb29kIiwgIkZhaXIiLCAiUG9vciJdfQogICAgICAgICAgICAuZGlyZWN0aW9uPSR7Imhvcml6b250YWwifQogICAgICAgICAgICAua2V5PSR7ImNvbmRpdGlvbiJ9CiAgICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJOZXcifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1yYWRpb2dyb3VwPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1yYWRpb2dyb3VwCiAgICAgICAgICAgIC5sYWJlbD0keyJTaGlwcGluZyBTcGVlZCJ9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WwogIHsgb3B0aW9uOiAiU3RhbmRhcmQgKDUtNyBkYXlzKSIsIGtleTogInN0YW5kYXJkIiwgcGF5bG9hZDogeyBkYXlzOiA3LCBwcmljZTogMCB9IH0sCiAgeyBvcHRpb246ICJFeHByZXNzICgyLTMgZGF5cykiLCBrZXk6ICJleHByZXNzIiwgcGF5bG9hZDogeyBkYXlzOiAzLCBwcmljZTogMTAgfSB9LAogIHsgb3B0aW9uOiAiT3Zlcm5pZ2h0Iiwga2V5OiAib3Zlcm5pZ2h0IiwgcGF5bG9hZDogeyBkYXlzOiAxLCBwcmljZTogMjUgfSB9Cl19CiAgICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJzdGFuZGFyZCJ9CiAgICAgICAgICAgIC5rZXk9JHsic2hpcHBpbmcifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1yYWRpb2dyb3VwPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdCAudGV4dD0keyJTdWJtaXQgUHJvZHVjdCJ9PjwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kaXY+CiAgPC9kZWVzLWRlbW93cmFwcGVyPgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtcmFkaW9ncm91cC9kZWVzLWlucHV0LXJhZGlvZ3JvdXAuanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlMjMgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczI0ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzSW5wdXRSYWRpb2dyb3VwID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1pbnB1dC1yYWRpb2dyb3VwIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNJbnB1dEJhc2U7CiAgbGV0IF9vcHRpb25zX2RlY29yYXRvcnM7CiAgbGV0IF9vcHRpb25zX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfb3B0aW9uc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRPcHRpb25fZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkT3B0aW9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRPcHRpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RpcmVjdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfZGlyZWN0aW9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGlyZWN0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWxpZGF0aW9uU3RhdGVfZGVjb3JhdG9yczsKICBsZXQgX3ZhbGlkYXRpb25TdGF0ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbGlkYXRpb25TdGF0ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW5wdXRSYWRpb2dyb3VwMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX29wdGlvbnNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX3NlbGVjdGVkT3B0aW9uX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9kaXJlY3Rpb25fZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF92YWxpZGF0aW9uU3RhdGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZywgcmVmbGVjdDogdHJ1ZSB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTIzKHRoaXMsIG51bGwsIF9vcHRpb25zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm9wdGlvbnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm9wdGlvbnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoub3B0aW9ucywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoub3B0aW9ucyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9vcHRpb25zX2luaXRpYWxpemVycywgX29wdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyMyh0aGlzLCBudWxsLCBfc2VsZWN0ZWRPcHRpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0ZWRPcHRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlbGVjdGVkT3B0aW9uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGVkT3B0aW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3RlZE9wdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWxlY3RlZE9wdGlvbl9pbml0aWFsaXplcnMsIF9zZWxlY3RlZE9wdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTIzKHRoaXMsIG51bGwsIF9kaXJlY3Rpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZGlyZWN0aW9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkaXJlY3Rpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZGlyZWN0aW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kaXJlY3Rpb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZGlyZWN0aW9uX2luaXRpYWxpemVycywgX2RpcmVjdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTIzKHRoaXMsIG51bGwsIF92YWxpZGF0aW9uU3RhdGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmFsaWRhdGlvblN0YXRlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ2YWxpZGF0aW9uU3RhdGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmFsaWRhdGlvblN0YXRlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52YWxpZGF0aW9uU3RhdGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdmFsaWRhdGlvblN0YXRlX2luaXRpYWxpemVycywgX3ZhbGlkYXRpb25TdGF0ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTIzKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0lucHV0UmFkaW9ncm91cDIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzE1OwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIklucHV0Il07CiAgICAjb3B0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMyNCh0aGlzLCBfb3B0aW9uc19pbml0aWFsaXplcnMsIFtdKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgb3B0aW9ucygpIHsKICAgICAgcmV0dXJuIHRoaXMuI29wdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBvcHRpb25zKHZhbHVlMikgewogICAgICB0aGlzLiNvcHRpb25zX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0ZWRPcHRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI0KHRoaXMsIF9vcHRpb25zX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNCh0aGlzLCBfc2VsZWN0ZWRPcHRpb25faW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IHNlbGVjdGVkT3B0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRPcHRpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3RlZE9wdGlvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VsZWN0ZWRPcHRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNkaXJlY3Rpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI0KHRoaXMsIF9zZWxlY3RlZE9wdGlvbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjQodGhpcywgX2RpcmVjdGlvbl9pbml0aWFsaXplcnMsICJ2ZXJ0aWNhbCIpKTsKICAgIGdldCBkaXJlY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNkaXJlY3Rpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkaXJlY3Rpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI2RpcmVjdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3ZhbGlkYXRpb25TdGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjQodGhpcywgX2RpcmVjdGlvbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjQodGhpcywgX3ZhbGlkYXRpb25TdGF0ZV9pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIGdldCB2YWxpZGF0aW9uU3RhdGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWxpZGF0aW9uU3RhdGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB2YWxpZGF0aW9uU3RhdGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3ZhbGlkYXRpb25TdGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgLy8gRm9ybSBjb21wYXRpYmlsaXR5CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgIGNvbnN0IG9wdGlvbjIgPSB0aGlzLmdldE9wdGlvbkJ5S2V5KHRoaXMuc2VsZWN0ZWRPcHRpb24pOwogICAgICBpZiAodHlwZW9mIG9wdGlvbjIgPT09ICJvYmplY3QiICYmIG9wdGlvbjIucGF5bG9hZCAhPT0gdm9pZCAwKSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbjIucGF5bG9hZDsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZE9wdGlvbjsKICAgIH0KICAgIHNldCB2YWx1ZSh2YWwpIHsKICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICJzdHJpbmciKSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IHZhbDsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBvcHRpb24yID0gdGhpcy5vcHRpb25zLmZpbmQoKG9wdCkgPT4gdHlwZW9mIG9wdCA9PT0gIm9iamVjdCIgJiYgb3B0LnBheWxvYWQgPT09IHZhbCk7CiAgICAgICAgaWYgKG9wdGlvbjIgJiYgdHlwZW9mIG9wdGlvbjIgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uID0gb3B0aW9uMi5rZXk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIC4uLkRlZXNJbnB1dEJhc2UuYmFzZVN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICAqIHsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsICdSb2JvdG8nLCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAubWFpbmNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogMTBweDsKICAgICAgfQoKICAgICAgLm1haW5jb250YWluZXIuaG9yaXpvbnRhbCB7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZ2FwOiAyMHB4OwogICAgICB9CgogICAgICAucmFkaW8tb3B0aW9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiAxMHB4OwogICAgICAgIHBhZGRpbmc6IDZweCAwOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgIH0KCiAgICAgIC5tYWluY29udGFpbmVyLmhvcml6b250YWwgLnJhZGlvLW9wdGlvbiB7CiAgICAgICAgcGFkZGluZzogNnB4IDIwcHggNnB4IDA7CiAgICAgIH0KCiAgICAgIC5yYWRpby1vcHRpb246aG92ZXIgLnJhZGlvLWNpcmNsZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAyMC4yJSA2NS4xJSkiLCAiaHNsKDIxNSAyMC4yJSAzNS4xJSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMjE1IDIwLjIlIDExLjglKSIpfTsKICAgICAgfQoKICAgICAgLnJhZGlvLW9wdGlvbjpob3ZlciAucmFkaW8tbGFiZWwgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICB9CgogICAgICAucmFkaW8tY2lyY2xlIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDIwLjIlIDY1LjElKSIsICJoc2woMjE1IDIwLjIlIDM1LjElKSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDIxNSAzMCUgNi44JSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAucmFkaW8tb3B0aW9uLnNlbGVjdGVkIC5yYWRpby1jaXJjbGUgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTcuMiA5MS4yJSA1OS44JSkiLCAiaHNsKDIxMy4xIDkzLjklIDY3LjglKSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNy4yIDkxLjIlIDU5LjglKSIsICJoc2woMjEzLjEgOTMuOSUgNjcuOCUpIil9OwogICAgICB9CgogICAgICAucmFkaW8tb3B0aW9uLnNlbGVjdGVkIC5yYWRpby1jaXJjbGU6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgd2lkdGg6IDhweDsKICAgICAgICBoZWlnaHQ6IDhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgyMTUgMzAlIDYuOCUpIil9OwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMnMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICAgICAgfQoKICAgICAgLnJhZGlvLW9wdGlvbi5zZWxlY3RlZCAucmFkaW8tY2lyY2xlOjphZnRlciB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgICAgfQoKICAgICAgLnJhZGlvLWNpcmNsZTpmb2N1cy12aXNpYmxlIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDIxNSAzMCUgMy45JSkiKX0sCiAgICAgICAgICAgICAgICAgICAgMCAwIDAgNHB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIiwgImhzbCgyMTMuMSA5My45JSA2Ny44JSkiKX07CiAgICAgIH0KCiAgICAgIC5yYWRpby1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDI2LjclKSIsICJoc2woMjE3LjkgMTAuNiUgNzQuOSUpIil9OwogICAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMnMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDA2ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5yYWRpby1vcHRpb24uc2VsZWN0ZWQgLnJhZGlvLWxhYmVsIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgOC44JSkiLCAiaHNsKDIxMCA0MCUgOTglKSIpfTsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgLnJhZGlvLW9wdGlvbiB7CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIC5yYWRpby1vcHRpb246aG92ZXIgLnJhZGlvLWNpcmNsZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAyMC4yJSA2NS4xJSkiLCAiaHNsKDIxNSAyMC4yJSAzNS4xJSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgyMTUgMzAlIDYuOCUpIil9OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAucmFkaW8tb3B0aW9uOmhvdmVyIC5yYWRpby1sYWJlbCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDI2LjclKSIsICJoc2woMjE3LjkgMTAuNiUgNzQuOSUpIil9OwogICAgICB9CgogICAgICAubGFiZWwtdGV4dCB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDguOCUpIiwgImhzbCgyMTAgNDAlIDk4JSkiKX07CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDA2ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5kZXNjcmlwdGlvbi10ZXh0IHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNTYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNTUuMSUpIil9OwogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDAzZW07CiAgICAgIH0KCiAgICAgIC8qIFZhbGlkYXRpb24gc3R5bGVzICovCiAgICAgIDpob3N0KFt2YWxpZGF0aW9uU3RhdGU9ImludmFsaWQiXSkgLnJhZGlvLWNpcmNsZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzIuMiUgNTAuNiUpIiwgImhzbCgwIDYyLjglIDMwLjYlKSIpfTsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZhbGlkYXRpb25TdGF0ZT0iaW52YWxpZCJdKSAucmFkaW8tb3B0aW9uLnNlbGVjdGVkIC5yYWRpby1jaXJjbGUgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcyLjIlIDUwLjYlKSIsICJoc2woMCA2Mi44JSAzMC42JSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcyLjIlIDUwLjYlKSIsICJoc2woMCA2Mi44JSAzMC42JSkiKX07CiAgICAgIH0KCiAgICAgIDpob3N0KFt2YWxpZGF0aW9uU3RhdGU9InZhbGlkIl0pIC5yYWRpby1vcHRpb24uc2VsZWN0ZWQgLnJhZGlvLWNpcmNsZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDE0Mi4xIDcwLjYlIDQ1LjMlKSIsICJoc2woMTQyLjEgNzYuMiUgMzYuMyUpIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyLjEgNzAuNiUgNDUuMyUpIiwgImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSkiKX07CiAgICAgIH0KCiAgICAgIDpob3N0KFt2YWxpZGF0aW9uU3RhdGU9Indhcm4iXSkgLnJhZGlvLW9wdGlvbi5zZWxlY3RlZCAucmFkaW8tY2lyY2xlIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woNDUuNCA5My40JSA0Ny41JSkiLCAiaHNsKDQ1LjQgOTMuNCUgNDcuNSUpIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woNDUuNCA5My40JSA0Ny41JSkiLCAiaHNsKDQ1LjQgOTMuNCUgNDcuNSUpIil9OwogICAgICB9CgogICAgICAvKiBPdmVycmlkZSBiYXNlIGdyaWQgbGF5b3V0IGZvciByYWRpb2dyb3VwIHRvIHByZXZlbnQgbGFyZ2UgZ2FwcyAqLwogICAgICA6aG9zdChbbGFiZWwtcG9zaXRpb249ImxlZnQiXSkgLmlucHV0LXdyYXBwZXIgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogYXV0byBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbbGFiZWwtcG9zaXRpb249InJpZ2h0Il0pIC5pbnB1dC13cmFwcGVyIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gYXV0bzsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJpbnB1dC13cmFwcGVyIj4KICAgICAgICAke3RoaXMubGFiZWwgPyBiMmA8ZGl2IGNsYXNzPSJsYWJlbC10ZXh0Ij4ke3RoaXMubGFiZWx9PC9kaXY+YCA6ICIifQogICAgICAgIDxkaXYgY2xhc3M9Im1haW5jb250YWluZXIgJHt0aGlzLmRpcmVjdGlvbn0iPgogICAgICAgICAgJHt0aGlzLm9wdGlvbnMubWFwKChvcHRpb24yKSA9PiB7CiAgICAgICAgY29uc3Qgb3B0aW9uS2V5ID0gdGhpcy5nZXRPcHRpb25LZXkob3B0aW9uMik7CiAgICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSB0aGlzLmdldE9wdGlvbkxhYmVsKG9wdGlvbjIpOwogICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkT3B0aW9uID09PSBvcHRpb25LZXk7CiAgICAgICAgcmV0dXJuIGIyYAogICAgICAgICAgICAgIDxkaXYgCiAgICAgICAgICAgICAgICBjbGFzcz0icmFkaW8tb3B0aW9uICR7aXNTZWxlY3RlZCA/ICJzZWxlY3RlZCIgOiAiIn0iCiAgICAgICAgICAgICAgICBAY2xpY2s9IiR7KCkgPT4gdGhpcy5zZWxlY3RPcHRpb24ob3B0aW9uS2V5KX0iCiAgICAgICAgICAgICAgICBAa2V5ZG93bj0iJHsoZTExKSA9PiB0aGlzLmhhbmRsZUtleWRvd24oZTExLCBvcHRpb25LZXkpfSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8ZGl2IAogICAgICAgICAgICAgICAgICBjbGFzcz0icmFkaW8tY2lyY2xlIiAKICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9IiR7dGhpcy5kaXNhYmxlZCA/ICItMSIgOiAiMCJ9IgogICAgICAgICAgICAgICAgICByb2xlPSJyYWRpbyIKICAgICAgICAgICAgICAgICAgYXJpYS1jaGVja2VkPSIke2lzU2VsZWN0ZWR9IgogICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPSIke29wdGlvbkxhYmVsfSIKICAgICAgICAgICAgICAgID48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJhZGlvLWxhYmVsIj4ke29wdGlvbkxhYmVsfTwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgOwogICAgICB9KX0KICAgICAgICA8L2Rpdj4KICAgICAgICAke3RoaXMuZGVzY3JpcHRpb24gPyBiMmA8ZGl2IGNsYXNzPSJkZXNjcmlwdGlvbi10ZXh0Ij4ke3RoaXMuZGVzY3JpcHRpb259PC9kaXY+YCA6ICIifQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBnZXRPcHRpb25LZXkob3B0aW9uMikgewogICAgICBpZiAodHlwZW9mIG9wdGlvbjIgPT09ICJzdHJpbmciKSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbjI7CiAgICAgIH0KICAgICAgcmV0dXJuIG9wdGlvbjIua2V5OwogICAgfQogICAgZ2V0T3B0aW9uTGFiZWwob3B0aW9uMikgewogICAgICBpZiAodHlwZW9mIG9wdGlvbjIgPT09ICJzdHJpbmciKSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbjI7CiAgICAgIH0KICAgICAgcmV0dXJuIG9wdGlvbjIub3B0aW9uOwogICAgfQogICAgZ2V0T3B0aW9uQnlLZXkoa2V5MikgewogICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZpbmQoKG9wdCkgPT4gdGhpcy5nZXRPcHRpb25LZXkob3B0KSA9PT0ga2V5Mik7CiAgICB9CiAgICBzZWxlY3RPcHRpb24oa2V5MikgewogICAgICBpZiAodGhpcy5kaXNhYmxlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuc2VsZWN0ZWRPcHRpb247CiAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSBrZXkyOwogICAgICBpZiAob2xkVmFsdWUgIT09IGtleTIpIHsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjaGFuZ2UiLCB7CiAgICAgICAgICBkZXRhaWw6IHsgdmFsdWU6IHRoaXMudmFsdWUgfSwKICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgIH0pKTsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpbnB1dCIsIHsKICAgICAgICAgIGRldGFpbDogeyB2YWx1ZTogdGhpcy52YWx1ZSB9LAogICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgfSkpOwogICAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMpOwogICAgICB9CiAgICB9CiAgICBnZXRWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMudmFsdWU7CiAgICB9CiAgICBzZXRWYWx1ZSh2YWwpIHsKICAgICAgdGhpcy52YWx1ZSA9IHZhbDsKICAgIH0KICAgIGFzeW5jIHZhbGlkYXRlKCkgewogICAgICBpZiAodGhpcy5yZXF1aXJlZCAmJiAhdGhpcy5zZWxlY3RlZE9wdGlvbikgewogICAgICAgIHRoaXMudmFsaWRhdGlvblN0YXRlID0gImludmFsaWQiOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICB0aGlzLnZhbGlkYXRpb25TdGF0ZSA9ICJ2YWxpZCI7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKCkgewogICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRPcHRpb24gJiYgdGhpcy5vcHRpb25zLmxlbmd0aCA+IDAgJiYgIXRoaXMucmVxdWlyZWQpIHsKICAgICAgICBjb25zdCBmaXJzdE9wdGlvbiA9IHRoaXMub3B0aW9uc1swXTsKICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uID0gdGhpcy5nZXRPcHRpb25LZXkoZmlyc3RPcHRpb24pOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVLZXlkb3duKGV2ZW50LCBvcHRpb25LZXkpIHsKICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpCiAgICAgICAgcmV0dXJuOwogICAgICBpZiAoZXZlbnQua2V5ID09PSAiICIgfHwgZXZlbnQua2V5ID09PSAiRW50ZXIiKSB7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICB0aGlzLnNlbGVjdE9wdGlvbihvcHRpb25LZXkpOwogICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gIkFycm93RG93biIgfHwgZXZlbnQua2V5ID09PSAiQXJyb3dSaWdodCIpIHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMuZm9jdXNOZXh0T3B0aW9uKCk7CiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAiQXJyb3dVcCIgfHwgZXZlbnQua2V5ID09PSAiQXJyb3dMZWZ0IikgewogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdGhpcy5mb2N1c1ByZXZpb3VzT3B0aW9uKCk7CiAgICAgIH0KICAgIH0KICAgIGZvY3VzTmV4dE9wdGlvbigpIHsKICAgICAgY29uc3QgcmFkaW9DaXJjbGVzID0gQXJyYXkuZnJvbSh0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgiLnJhZGlvLWNpcmNsZSIpKTsKICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gcmFkaW9DaXJjbGVzLmZpbmRJbmRleCgoZWwpID0+IGVsID09PSB0aGlzLnNoYWRvd1Jvb3QuYWN0aXZlRWxlbWVudCk7CiAgICAgIGNvbnN0IG5leHRJbmRleCA9IChjdXJyZW50SW5kZXggKyAxKSAlIHJhZGlvQ2lyY2xlcy5sZW5ndGg7CiAgICAgIHJhZGlvQ2lyY2xlc1tuZXh0SW5kZXhdLmZvY3VzKCk7CiAgICB9CiAgICBmb2N1c1ByZXZpb3VzT3B0aW9uKCkgewogICAgICBjb25zdCByYWRpb0NpcmNsZXMgPSBBcnJheS5mcm9tKHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCIucmFkaW8tY2lyY2xlIikpOwogICAgICBjb25zdCBjdXJyZW50SW5kZXggPSByYWRpb0NpcmNsZXMuZmluZEluZGV4KChlbCkgPT4gZWwgPT09IHRoaXMuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50KTsKICAgICAgY29uc3QgcHJldkluZGV4ID0gY3VycmVudEluZGV4IDw9IDAgPyByYWRpb0NpcmNsZXMubGVuZ3RoIC0gMSA6IGN1cnJlbnRJbmRleCAtIDE7CiAgICAgIHJhZGlvQ2lyY2xlc1twcmV2SW5kZXhdLmZvY3VzKCk7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnMyNCh0aGlzLCBfdmFsaWRhdGlvblN0YXRlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMjQoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNJbnB1dFJhZGlvZ3JvdXAyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1mb3JtL2RlZXMtZm9ybS1zdWJtaXQvZGVlcy1mb3JtLXN1Ym1pdC5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vRnVuYzE2ID0gKCkgPT4gYjJgPGRlZXMtZm9ybS1zdWJtaXQ+U3VibWl0IEZvcm08L2RlZXMtZm9ybS1zdWJtaXQ+YDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1mb3JtL2RlZXMtZm9ybS1zdWJtaXQvZGVlcy1mb3JtLXN1Ym1pdC5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGUyNCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMjUgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNGb3JtU3VibWl0ID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1mb3JtLXN1Ym1pdCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX2Rpc2FibGVkX2RlY29yYXRvcnM7CiAgbGV0IF9kaXNhYmxlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Rpc2FibGVkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90ZXh0X2RlY29yYXRvcnM7CiAgbGV0IF90ZXh0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGV4dF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc3RhdHVzX2RlY29yYXRvcnM7CiAgbGV0IF9zdGF0dXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zdGF0dXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0Zvcm1TdWJtaXQyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfZGlzYWJsZWRfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICByZWZsZWN0OiB0cnVlCiAgICAgIH0pXTsKICAgICAgX3RleHRfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgIH0pXTsKICAgICAgX3N0YXR1c19kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBTdHJpbmcKICAgICAgfSldOwogICAgICBfX2VzRGVjb3JhdGUyNCh0aGlzLCBudWxsLCBfZGlzYWJsZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZGlzYWJsZWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRpc2FibGVkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRpc2FibGVkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kaXNhYmxlZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kaXNhYmxlZF9pbml0aWFsaXplcnMsIF9kaXNhYmxlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTI0KHRoaXMsIG51bGwsIF90ZXh0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRleHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRleHQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudGV4dCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGV4dCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90ZXh0X2luaXRpYWxpemVycywgX3RleHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNCh0aGlzLCBudWxsLCBfc3RhdHVzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInN0YXR1cyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic3RhdHVzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnN0YXR1cywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc3RhdHVzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3N0YXR1c19pbml0aWFsaXplcnMsIF9zdGF0dXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNChudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNGb3JtU3VibWl0MiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMTY7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiRm9ybSIsICJCdXR0b24iXTsKICAgICNkaXNhYmxlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMyNSh0aGlzLCBfZGlzYWJsZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSk7CiAgICBnZXQgZGlzYWJsZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNkaXNhYmxlZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGRpc2FibGVkKHZhbHVlMikgewogICAgICB0aGlzLiNkaXNhYmxlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3RleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI1KHRoaXMsIF9kaXNhYmxlZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjUodGhpcywgX3RleHRfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCB0ZXh0KCkgewogICAgICByZXR1cm4gdGhpcy4jdGV4dF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRleHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3RleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzdGF0dXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI1KHRoaXMsIF90ZXh0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNSh0aGlzLCBfc3RhdHVzX2luaXRpYWxpemVycywgIm5vcm1hbCIpKTsKICAgIGdldCBzdGF0dXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzdGF0dXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzdGF0dXModmFsdWUyKSB7CiAgICAgIHRoaXMuI3N0YXR1c19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMjUodGhpcywgX3N0YXR1c19leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gW3RoZW1lRGVmYXVsdFN0eWxlcywgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLCBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgYF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRlZXMtYnV0dG9uCiAgICAgICAgc3RhdHVzPSIke3RoaXMuc3RhdHVzfSIKICAgICAgICBAY2xpY2s9IiR7dGhpcy5zdWJtaXR9IgogICAgICAgID9kaXNhYmxlZD0iJHt0aGlzLmRpc2FibGVkfSIKICAgICAgPgogICAgICAgICR7dGhpcy50ZXh0IHx8IGIyYDxzbG90Pjwvc2xvdD5gfQogICAgICA8L2RlZXMtYnV0dG9uPgogICAgYDsKICAgIH0KICAgIGFzeW5jIHN1Ym1pdCgpIHsKICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgcGFyZW50Rm9ybUVsZW1lbnQgPSB0aGlzLmNsb3Nlc3QoImRlZXMtZm9ybSIpOwogICAgICBpZiAocGFyZW50Rm9ybUVsZW1lbnQgJiYgcGFyZW50Rm9ybUVsZW1lbnQuZ2F0aGVyQW5kRGlzcGF0Y2gpIHsKICAgICAgICBwYXJlbnRGb3JtRWxlbWVudC5nYXRoZXJBbmREaXNwYXRjaCgpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBmb2N1cygpIHsKICAgICAgY29uc3QgZG9tdG9vbHMgPSBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgYXdhaXQgZG9tdG9vbHMuY29udmVuaWVuY2Uuc21hcnRkZWxheS5kZWxheUZvcigwKTsKICAgICAgICB0aGlzLnN1Ym1pdCgpOwogICAgICB9CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczI1KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzRm9ybVN1Ym1pdDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtZHJvcGRvd24vZGVlcy1pbnB1dC1kcm9wZG93bi5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vRnVuYzE3ID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgJHtpYAogICAgICAuZGVtby1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDI0cHg7CiAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICBtYXgtd2lkdGg6IDEyMDBweDsKICAgICAgICBtYXJnaW46IDAgYXV0bzsKICAgICAgfQogICAgICAKICAgICAgZGVlcy1wYW5lbCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgfQogICAgICAKICAgICAgZGVlcy1wYW5lbDpsYXN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICB9CiAgICAgIAogICAgICAuaG9yaXpvbnRhbC1ncm91cCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTZweDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KICAgICAgCiAgICAgIC5zcGFjZXIgewogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGNvbG9yOiAjOTk5OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQogICAgYH0KICA8L3N0eWxlPgogIAogIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgY291bnRyeURyb3Bkb3duID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCdkZWVzLWlucHV0LWRyb3Bkb3duW2xhYmVsPSJTZWxlY3QgQ291bnRyeSJdJyk7CiAgY29uc3Qgcm9sZURyb3Bkb3duID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCdkZWVzLWlucHV0LWRyb3Bkb3duW2xhYmVsPSJTZWxlY3QgUm9sZSJdJyk7CiAgaWYgKGNvdW50cnlEcm9wZG93bikgewogICAgY291bnRyeURyb3Bkb3duLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGVkT3B0aW9uIiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJDb3VudHJ5IHNlbGVjdGVkOiIsIGV2ZW50LmRldGFpbCk7CiAgICB9KTsKICB9CiAgaWYgKHJvbGVEcm9wZG93bikgewogICAgcm9sZURyb3Bkb3duLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGVkT3B0aW9uIiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJSb2xlIHNlbGVjdGVkOiIsIGV2ZW50LmRldGFpbCk7CiAgICB9KTsKICB9Cn19PgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiMS4gQmFzaWMgRHJvcGRvd25zIn0gLnN1YnRpdGxlPSR7IlN0YW5kYXJkIGRyb3Bkb3duIHdpdGggc2VhcmNoIGZ1bmN0aW9uYWxpdHkgYW5kIHZhcmlvdXMgb3B0aW9ucyJ9PgogICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAubGFiZWw9JHsiU2VsZWN0IENvdW50cnkifQogICAgICAgICAgLm9wdGlvbnM9JHtbCiAgeyBvcHRpb246ICJVbml0ZWQgU3RhdGVzIiwga2V5OiAidXMiIH0sCiAgeyBvcHRpb246ICJDYW5hZGEiLCBrZXk6ICJjYSIgfSwKICB7IG9wdGlvbjogIkdlcm1hbnkiLCBrZXk6ICJkZSIgfSwKICB7IG9wdGlvbjogIkZyYW5jZSIsIGtleTogImZyIiB9LAogIHsgb3B0aW9uOiAiVW5pdGVkIEtpbmdkb20iLCBrZXk6ICJ1ayIgfSwKICB7IG9wdGlvbjogIkF1c3RyYWxpYSIsIGtleTogImF1IiB9LAogIHsgb3B0aW9uOiAiSmFwYW4iLCBrZXk6ICJqcCIgfSwKICB7IG9wdGlvbjogIkJyYXppbCIsIGtleTogImJyIiB9Cl19CiAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHt7IG9wdGlvbjogIlVuaXRlZCBTdGF0ZXMiLCBrZXk6ICJ1cyIgfX0KICAgICAgICA+PC9kZWVzLWlucHV0LWRyb3Bkb3duPgogICAgICAgIAogICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAubGFiZWw9JHsiU2VsZWN0IFJvbGUifQogICAgICAgICAgLm9wdGlvbnM9JHtbCiAgeyBvcHRpb246ICJBZG1pbmlzdHJhdG9yIiwga2V5OiAiYWRtaW4iIH0sCiAgeyBvcHRpb246ICJFZGl0b3IiLCBrZXk6ICJlZGl0b3IiIH0sCiAgeyBvcHRpb246ICJWaWV3ZXIiLCBrZXk6ICJ2aWV3ZXIiIH0sCiAgeyBvcHRpb246ICJHdWVzdCIsIGtleTogImd1ZXN0IiB9Cl19CiAgICAgICAgPjwvZGVlcy1pbnB1dC1kcm9wZG93bj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgogICAgCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IHByaW9yaXR5RHJvcGRvd24gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtZHJvcGRvd24iKTsKICBpZiAocHJpb3JpdHlEcm9wZG93bikgewogICAgcHJpb3JpdHlEcm9wZG93bi5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3RlZE9wdGlvbiIsIChldmVudCkgPT4gewogICAgICBjb25zb2xlLmxvZyhgUHJpb3JpdHkgY2hhbmdlZCB0bzogJHtldmVudC5kZXRhaWwub3B0aW9ufWApOwogICAgfSk7CiAgfQp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjIuIFdpdGhvdXQgU2VhcmNoIn0gLnN1YnRpdGxlPSR7IkRyb3Bkb3duIHdpdGggc2VhcmNoIGZ1bmN0aW9uYWxpdHkgZGlzYWJsZWQgZm9yIHNpbXBsZXIgc2VsZWN0aW9uIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtZHJvcGRvd24KICAgICAgICAgIC5sYWJlbD0keyJQcmlvcml0eSBMZXZlbCJ9CiAgICAgICAgICAuZW5hYmxlU2VhcmNoPSR7ZmFsc2V9CiAgICAgICAgICAub3B0aW9ucz0ke1sKICB7IG9wdGlvbjogIkhpZ2giLCBrZXk6ICJoaWdoIiB9LAogIHsgb3B0aW9uOiAiTWVkaXVtIiwga2V5OiAibWVkaXVtIiB9LAogIHsgb3B0aW9uOiAiTG93Iiwga2V5OiAibG93IiB9Cl19CiAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHt7IG9wdGlvbjogIk1lZGl1bSIsIGtleTogIm1lZGl1bSIgfX0KICAgICAgICA+PC9kZWVzLWlucHV0LWRyb3Bkb3duPgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgICAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgZHJvcGRvd25zID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yQWxsKCJkZWVzLWlucHV0LWRyb3Bkb3duIik7CiAgZHJvcGRvd25zLmZvckVhY2goKGRyb3Bkb3duKSA9PiB7CiAgICBkcm9wZG93bi5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3RlZE9wdGlvbiIsIChldmVudCkgPT4gewogICAgICBjb25zdCBsYWJlbCA9IGRyb3Bkb3duLmdldEF0dHJpYnV0ZSgibGFiZWwiKTsKICAgICAgY29uc29sZS5sb2coYCR7bGFiZWx9OiAke2V2ZW50LmRldGFpbC5vcHRpb259YCk7CiAgICB9KTsKICB9KTsKfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyIzLiBIb3Jpem9udGFsIExheW91dCJ9IC5zdWJ0aXRsZT0keyJNdWx0aXBsZSBkcm9wZG93bnMgaW4gYSBob3Jpem9udGFsIGxheW91dCBmb3IgY29tcGFjdCBmb3JtcyJ9PgogICAgICAgIDxkaXYgY2xhc3M9Imhvcml6b250YWwtZ3JvdXAiPgogICAgICAgICAgPGRlZXMtaW5wdXQtZHJvcGRvd24KICAgICAgICAgICAgLmxhYmVsPSR7IkRlcGFydG1lbnQifQogICAgICAgICAgICAubGF5b3V0TW9kZT0keyJob3Jpem9udGFsIn0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbCiAgeyBvcHRpb246ICJFbmdpbmVlcmluZyIsIGtleTogImVuZyIgfSwKICB7IG9wdGlvbjogIkRlc2lnbiIsIGtleTogImRlc2lnbiIgfSwKICB7IG9wdGlvbjogIk1hcmtldGluZyIsIGtleTogIm1hcmtldGluZyIgfSwKICB7IG9wdGlvbjogIlNhbGVzIiwga2V5OiAic2FsZXMiIH0KXX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtZHJvcGRvd24+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAgIC5sYWJlbD0keyJUZWFtIFNpemUifQogICAgICAgICAgICAubGF5b3V0TW9kZT0keyJob3Jpem9udGFsIn0KICAgICAgICAgICAgLmVuYWJsZVNlYXJjaD0ke2ZhbHNlfQogICAgICAgICAgICAub3B0aW9ucz0ke1sKICB7IG9wdGlvbjogIjEtNSIsIGtleTogInNtYWxsIiB9LAogIHsgb3B0aW9uOiAiNi0yMCIsIGtleTogIm1lZGl1bSIgfSwKICB7IG9wdGlvbjogIjIxLTUwIiwga2V5OiAibGFyZ2UiIH0sCiAgeyBvcHRpb246ICI1MCsiLCBrZXk6ICJ4bGFyZ2UiIH0KXX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtZHJvcGRvd24+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAgIC5sYWJlbD0keyJMb2NhdGlvbiJ9CiAgICAgICAgICAgIC5sYXlvdXRNb2RlPSR7Imhvcml6b250YWwifQogICAgICAgICAgICAub3B0aW9ucz0ke1sKICB7IG9wdGlvbjogIlJlbW90ZSIsIGtleTogInJlbW90ZSIgfSwKICB7IG9wdGlvbjogIk9uLXNpdGUiLCBrZXk6ICJvbnNpdGUiIH0sCiAgeyBvcHRpb246ICJIeWJyaWQiLCBrZXk6ICJoeWJyaWQiIH0KXX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtZHJvcGRvd24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICAgIAogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCByZXF1aXJlZERyb3Bkb3duID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCJkZWVzLWlucHV0LWRyb3Bkb3duW3JlcXVpcmVkXSIpOwogIGlmIChyZXF1aXJlZERyb3Bkb3duKSB7CiAgICByZXF1aXJlZERyb3Bkb3duLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLCAoKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJSZXF1aXJlZCBkcm9wZG93biBsb3N0IGZvY3VzIik7CiAgICB9KTsKICB9Cn19PgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiNC4gU3RhdGVzIn0gLnN1YnRpdGxlPSR7IkRpZmZlcmVudCBzdGF0ZXMgYW5kIGNvbmZpZ3VyYXRpb25zIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtZHJvcGRvd24KICAgICAgICAgIC5sYWJlbD0keyJSZXF1aXJlZCBGaWVsZCJ9CiAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgLm9wdGlvbnM9JHtbCiAgeyBvcHRpb246ICJPcHRpb24gQSIsIGtleTogImEiIH0sCiAgeyBvcHRpb246ICJPcHRpb24gQiIsIGtleTogImIiIH0sCiAgeyBvcHRpb246ICJPcHRpb24gQyIsIGtleTogImMiIH0KXX0KICAgICAgICA+PC9kZWVzLWlucHV0LWRyb3Bkb3duPgogICAgICAgIAogICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAubGFiZWw9JHsiRGlzYWJsZWQgRHJvcGRvd24ifQogICAgICAgICAgLmRpc2FibGVkPSR7dHJ1ZX0KICAgICAgICAgIC5vcHRpb25zPSR7WwogIHsgb3B0aW9uOiAiQ2Fubm90IFNlbGVjdCIsIGtleTogImRpc2FibGVkIiB9Cl19CiAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHt7IG9wdGlvbjogIkNhbm5vdCBTZWxlY3QiLCBrZXk6ICJkaXNhYmxlZCIgfX0KICAgICAgICA+PC9kZWVzLWlucHV0LWRyb3Bkb3duPgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgICAKICAgIDxkaXYgY2xhc3M9InNwYWNlciI+CiAgICAgIChTcGFjZXIgdG8gdGVzdCBkcm9wZG93biBwb3NpdGlvbmluZykKICAgIDwvZGl2PgogICAgCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IGRyb3Bkb3duID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCJkZWVzLWlucHV0LWRyb3Bkb3duIik7CiAgaWYgKGRyb3Bkb3duKSB7CiAgICBkcm9wZG93bi5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3RlZE9wdGlvbiIsIChldmVudCkgPT4gewogICAgICBjb25zb2xlLmxvZygiQm90dG9tIGRyb3Bkb3duIHNlbGVjdGVkOiIsIGV2ZW50LmRldGFpbCk7CiAgICB9KTsKICB9Cn19PgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiNS4gQm90dG9tIFBvc2l0aW9uaW5nIn0gLnN1YnRpdGxlPSR7IkRyb3Bkb3duIHRoYXQgb3BlbnMgdXB3YXJkIHdoZW4gbmVhciBib3R0b20gb2Ygdmlld3BvcnQifT4KICAgICAgICA8ZGVlcy1pbnB1dC1kcm9wZG93bgogICAgICAgICAgLmxhYmVsPSR7Ik9wZW5zIFVwd2FyZCJ9CiAgICAgICAgICAub3B0aW9ucz0ke1sKICB7IG9wdGlvbjogIkZpcnN0IE9wdGlvbiIsIGtleTogImZpcnN0IiB9LAogIHsgb3B0aW9uOiAiU2Vjb25kIE9wdGlvbiIsIGtleTogInNlY29uZCIgfSwKICB7IG9wdGlvbjogIlRoaXJkIE9wdGlvbiIsIGtleTogInRoaXJkIiB9LAogIHsgb3B0aW9uOiAiRm91cnRoIE9wdGlvbiIsIGtleTogImZvdXJ0aCIgfSwKICB7IG9wdGlvbjogIkZpZnRoIE9wdGlvbiIsIGtleTogImZpZnRoIiB9Cl19CiAgICAgICAgPjwvZGVlcy1pbnB1dC1kcm9wZG93bj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgoKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgZHJvcGRvd24gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtZHJvcGRvd24iKTsKICBjb25zdCBvdXRwdXQgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoIiNzZWxlY3Rpb24tb3V0cHV0Iik7CiAgaWYgKGRyb3Bkb3duICYmIG91dHB1dCkgewogICAgb3V0cHV0LmlubmVySFRNTCA9ICI8ZW0+U2VsZWN0IGEgcHJvZHVjdCB0byBzZWUgZGV0YWlscy4uLjwvZW0+IjsKICAgIGRyb3Bkb3duLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIChldmVudCkgPT4gewogICAgICBpZiAoZXZlbnQuZGV0YWlsLnZhbHVlKSB7CiAgICAgICAgb3V0cHV0LmlubmVySFRNTCA9IGAKICAgICAgICAgICAgICA8c3Ryb25nPlNlbGVjdGVkOjwvc3Ryb25nPiAke2V2ZW50LmRldGFpbC52YWx1ZS5vcHRpb259PGJyPgogICAgICAgICAgICAgIDxzdHJvbmc+S2V5Ojwvc3Ryb25nPiAke2V2ZW50LmRldGFpbC52YWx1ZS5rZXl9PGJyPgogICAgICAgICAgICAgIDxzdHJvbmc+UHJpY2U6PC9zdHJvbmc+ICQke2V2ZW50LmRldGFpbC52YWx1ZS5wYXlsb2FkPy5wcmljZSB8fCAiTi9BIn08YnI+CiAgICAgICAgICAgICAgPHN0cm9uZz5GZWF0dXJlczo8L3N0cm9uZz4gJHtldmVudC5kZXRhaWwudmFsdWUucGF5bG9hZD8uZmVhdHVyZXM/LmpvaW4oIiwgIikgfHwgIk4vQSJ9CiAgICAgICAgICAgIGA7CiAgICAgIH0KICAgIH0pOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI2LiBFdmVudCBIYW5kbGluZyAmIFBheWxvYWQifSAuc3VidGl0bGU9JHsiRHJvcGRvd24gd2l0aCBwYXlsb2FkIGRhdGEgYW5kIGNoYW5nZSBldmVudCBoYW5kbGluZyJ9PgogICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAubGFiZWw9JHsiU2VsZWN0IFByb2R1Y3QifQogICAgICAgICAgLm9wdGlvbnM9JHtbCiAgeyBvcHRpb246ICJCYXNpYyBQbGFuIiwga2V5OiAiYmFzaWMiLCBwYXlsb2FkOiB7IHByaWNlOiA5Ljk5LCBmZWF0dXJlczogWyJGZWF0dXJlIEEiXSB9IH0sCiAgeyBvcHRpb246ICJQcm8gUGxhbiIsIGtleTogInBybyIsIHBheWxvYWQ6IHsgcHJpY2U6IDE5Ljk5LCBmZWF0dXJlczogWyJGZWF0dXJlIEEiLCAiRmVhdHVyZSBCIl0gfSB9LAogIHsgb3B0aW9uOiAiRW50ZXJwcmlzZSBQbGFuIiwga2V5OiAiZW50ZXJwcmlzZSIsIHBheWxvYWQ6IHsgcHJpY2U6IDQ5Ljk5LCBmZWF0dXJlczogWyJGZWF0dXJlIEEiLCAiRmVhdHVyZSBCIiwgIkZlYXR1cmUgQyJdIH0gfQpdfQogICAgICAgID48L2RlZXMtaW5wdXQtZHJvcGRvd24+CiAgICAgICAgCiAgICAgICAgPGRpdiBpZD0ic2VsZWN0aW9uLW91dHB1dCIgc3R5bGU9Im1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHJnYmEoMCwgMTA1LCAyNDIsIDAuMSk7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAxNHB4OyI+PC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IGZvcm0gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoImRlZXMtZm9ybSIpOwogIGNvbnN0IHByb2plY3RUeXBlRHJvcGRvd24gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoJ2RlZXMtaW5wdXQtZHJvcGRvd25ba2V5PSJwcm9qZWN0VHlwZSJdJyk7CiAgY29uc3QgZnJhbWV3b3JrRHJvcGRvd24gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoJ2RlZXMtaW5wdXQtZHJvcGRvd25ba2V5PSJmcmFtZXdvcmsiXScpOwogIGlmIChmb3JtKSB7CiAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoImZvcm1EYXRhIiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJGb3JtIHN1Ym1pdHRlZCB3aXRoIGRhdGE6IiwgZXZlbnQuZGV0YWlsLmRhdGEpOwogICAgfSk7CiAgfQogIGlmIChwcm9qZWN0VHlwZURyb3Bkb3duICYmIGZyYW1ld29ya0Ryb3Bkb3duKSB7CiAgICBwcm9qZWN0VHlwZURyb3Bkb3duLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGVkT3B0aW9uIiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHNlbGVjdGVkVHlwZSA9IGV2ZW50LmRldGFpbC5rZXk7CiAgICAgIGNvbnNvbGUubG9nKGBQcm9qZWN0IHR5cGUgY2hhbmdlZCB0bzogJHtzZWxlY3RlZFR5cGV9YCk7CiAgICB9KTsKICB9Cn19PgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiNy4gRm9ybSBJbnRlZ3JhdGlvbiJ9IC5zdWJ0aXRsZT0keyJEcm9wZG93biB3b3JraW5nIHdpdGhpbiBhIGZvcm0gd2l0aCB2YWxpZGF0aW9uIn0+CiAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAgIC5sYWJlbD0keyJQcm9qZWN0IFR5cGUifQogICAgICAgICAgICAua2V5PSR7InByb2plY3RUeXBlIn0KICAgICAgICAgICAgLnJlcXVpcmVkPSR7dHJ1ZX0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbCiAgeyBvcHRpb246ICJXZWIgQXBwbGljYXRpb24iLCBrZXk6ICJ3ZWIiIH0sCiAgeyBvcHRpb246ICJNb2JpbGUgQXBwbGljYXRpb24iLCBrZXk6ICJtb2JpbGUiIH0sCiAgeyBvcHRpb246ICJEZXNrdG9wIEFwcGxpY2F0aW9uIiwga2V5OiAiZGVza3RvcCIgfSwKICB7IG9wdGlvbjogIkFQSSBTZXJ2aWNlIiwga2V5OiAiYXBpIiB9Cl19CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWRyb3Bkb3duPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1kcm9wZG93bgogICAgICAgICAgICAubGFiZWw9JHsiRGV2ZWxvcG1lbnQgRnJhbWV3b3JrIn0KICAgICAgICAgICAgLmtleT0keyJmcmFtZXdvcmsifQogICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAub3B0aW9ucz0ke1sKICB7IG9wdGlvbjogIlJlYWN0Iiwga2V5OiAicmVhY3QiLCBwYXlsb2FkOiB7IHR5cGU6ICJ3ZWIiIH0gfSwKICB7IG9wdGlvbjogIlZ1ZS5qcyIsIGtleTogInZ1ZSIsIHBheWxvYWQ6IHsgdHlwZTogIndlYiIgfSB9LAogIHsgb3B0aW9uOiAiQW5ndWxhciIsIGtleTogImFuZ3VsYXIiLCBwYXlsb2FkOiB7IHR5cGU6ICJ3ZWIiIH0gfSwKICB7IG9wdGlvbjogIlJlYWN0IE5hdGl2ZSIsIGtleTogInJlYWN0LW5hdGl2ZSIsIHBheWxvYWQ6IHsgdHlwZTogIm1vYmlsZSIgfSB9LAogIHsgb3B0aW9uOiAiRmx1dHRlciIsIGtleTogImZsdXR0ZXIiLCBwYXlsb2FkOiB7IHR5cGU6ICJtb2JpbGUiIH0gfSwKICB7IG9wdGlvbjogIkVsZWN0cm9uIiwga2V5OiAiZWxlY3Ryb24iLCBwYXlsb2FkOiB7IHR5cGU6ICJkZXNrdG9wIiB9IH0KXX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtZHJvcGRvd24+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWZvcm0tc3VibWl0IC50ZXh0PSR7IkNyZWF0ZSBQcm9qZWN0In0+PC9kZWVzLWZvcm0tc3VibWl0PgogICAgICAgIDwvZGVlcy1mb3JtPgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgPC9kaXY+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1kcm9wZG93bi9kZWVzLWlucHV0LWRyb3Bkb3duLmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfZGlzdF90czI1KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTI1ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMyNiA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0lucHV0RHJvcGRvd24gPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLWlucHV0LWRyb3Bkb3duIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNJbnB1dEJhc2U7CiAgbGV0IF9vcHRpb25zX2RlY29yYXRvcnM7CiAgbGV0IF9vcHRpb25zX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfb3B0aW9uc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRPcHRpb25fZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkT3B0aW9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRPcHRpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2VuYWJsZVNlYXJjaF9kZWNvcmF0b3JzOwogIGxldCBfZW5hYmxlU2VhcmNoX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZW5hYmxlU2VhcmNoX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vcGVuc1RvVG9wX2RlY29yYXRvcnM7CiAgbGV0IF9vcGVuc1RvVG9wX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfb3BlbnNUb1RvcF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZmlsdGVyZWRPcHRpb25zX2RlY29yYXRvcnM7CiAgbGV0IF9maWx0ZXJlZE9wdGlvbnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWx0ZXJlZE9wdGlvbnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2hpZ2hsaWdodGVkSW5kZXhfZGVjb3JhdG9yczsKICBsZXQgX2hpZ2hsaWdodGVkSW5kZXhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oaWdobGlnaHRlZEluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc09wZW5lZF9kZWNvcmF0b3JzOwogIGxldCBfaXNPcGVuZWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc09wZW5lZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VhcmNoVmFsdWVfZGVjb3JhdG9yczsKICBsZXQgX3NlYXJjaFZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VhcmNoVmFsdWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0lucHV0RHJvcGRvd24yID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfb3B0aW9uc19kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfc2VsZWN0ZWRPcHRpb25fZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX2VuYWJsZVNlYXJjaF9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBCb29sZWFuCiAgICAgIH0pXTsKICAgICAgX29wZW5zVG9Ub3BfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2ZpbHRlcmVkT3B0aW9uc19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaGlnaGxpZ2h0ZWRJbmRleF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaXNPcGVuZWRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3NlYXJjaFZhbHVlX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTI1KHRoaXMsIG51bGwsIF9vcHRpb25zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm9wdGlvbnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm9wdGlvbnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoub3B0aW9ucywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoub3B0aW9ucyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9vcHRpb25zX2luaXRpYWxpemVycywgX29wdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNSh0aGlzLCBudWxsLCBfc2VsZWN0ZWRPcHRpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0ZWRPcHRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlbGVjdGVkT3B0aW9uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGVkT3B0aW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3RlZE9wdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWxlY3RlZE9wdGlvbl9pbml0aWFsaXplcnMsIF9zZWxlY3RlZE9wdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTI1KHRoaXMsIG51bGwsIF9lbmFibGVTZWFyY2hfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZW5hYmxlU2VhcmNoIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJlbmFibGVTZWFyY2giIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZW5hYmxlU2VhcmNoLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5lbmFibGVTZWFyY2ggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZW5hYmxlU2VhcmNoX2luaXRpYWxpemVycywgX2VuYWJsZVNlYXJjaF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTI1KHRoaXMsIG51bGwsIF9vcGVuc1RvVG9wX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm9wZW5zVG9Ub3AiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm9wZW5zVG9Ub3AiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoub3BlbnNUb1RvcCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoub3BlbnNUb1RvcCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9vcGVuc1RvVG9wX2luaXRpYWxpemVycywgX29wZW5zVG9Ub3BfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNSh0aGlzLCBudWxsLCBfZmlsdGVyZWRPcHRpb25zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImZpbHRlcmVkT3B0aW9ucyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZmlsdGVyZWRPcHRpb25zIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmZpbHRlcmVkT3B0aW9ucywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZmlsdGVyZWRPcHRpb25zID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2ZpbHRlcmVkT3B0aW9uc19pbml0aWFsaXplcnMsIF9maWx0ZXJlZE9wdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNSh0aGlzLCBudWxsLCBfaGlnaGxpZ2h0ZWRJbmRleF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJoaWdobGlnaHRlZEluZGV4Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJoaWdobGlnaHRlZEluZGV4IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmhpZ2hsaWdodGVkSW5kZXgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmhpZ2hsaWdodGVkSW5kZXggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaGlnaGxpZ2h0ZWRJbmRleF9pbml0aWFsaXplcnMsIF9oaWdobGlnaHRlZEluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjUodGhpcywgbnVsbCwgX2lzT3BlbmVkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzT3BlbmVkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc09wZW5lZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc09wZW5lZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNPcGVuZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNPcGVuZWRfaW5pdGlhbGl6ZXJzLCBfaXNPcGVuZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNSh0aGlzLCBudWxsLCBfc2VhcmNoVmFsdWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VhcmNoVmFsdWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlYXJjaFZhbHVlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlYXJjaFZhbHVlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWFyY2hWYWx1ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWFyY2hWYWx1ZV9pbml0aWFsaXplcnMsIF9zZWFyY2hWYWx1ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTI1KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0lucHV0RHJvcGRvd24yID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMxNzsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJJbnB1dCJdOwogICAgI29wdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMjYodGhpcywgX29wdGlvbnNfaW5pdGlhbGl6ZXJzLCBbXSk7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IG9wdGlvbnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNvcHRpb25zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgb3B0aW9ucyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jb3B0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NlbGVjdGVkT3B0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyNih0aGlzLCBfb3B0aW9uc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjYodGhpcywgX3NlbGVjdGVkT3B0aW9uX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IHNlbGVjdGVkT3B0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRPcHRpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3RlZE9wdGlvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VsZWN0ZWRPcHRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIC8vIEFkZCB2YWx1ZSBwcm9wZXJ0eSBmb3IgZm9ybSBjb21wYXRpYmlsaXR5CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkT3B0aW9uOwogICAgfQogICAgc2V0IHZhbHVlKHZhbCkgewogICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uID0gdmFsOwogICAgfQogICAgI2VuYWJsZVNlYXJjaF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjYodGhpcywgX3NlbGVjdGVkT3B0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNih0aGlzLCBfZW5hYmxlU2VhcmNoX2luaXRpYWxpemVycywgdHJ1ZSkpOwogICAgZ2V0IGVuYWJsZVNlYXJjaCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2VuYWJsZVNlYXJjaF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGVuYWJsZVNlYXJjaCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZW5hYmxlU2VhcmNoX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjb3BlbnNUb1RvcF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjYodGhpcywgX2VuYWJsZVNlYXJjaF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjYodGhpcywgX29wZW5zVG9Ub3BfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IG9wZW5zVG9Ub3AoKSB7CiAgICAgIHJldHVybiB0aGlzLiNvcGVuc1RvVG9wX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgb3BlbnNUb1RvcCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jb3BlbnNUb1RvcF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2ZpbHRlcmVkT3B0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjYodGhpcywgX29wZW5zVG9Ub3BfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczI2KHRoaXMsIF9maWx0ZXJlZE9wdGlvbnNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IGZpbHRlcmVkT3B0aW9ucygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2ZpbHRlcmVkT3B0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGZpbHRlcmVkT3B0aW9ucyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZmlsdGVyZWRPcHRpb25zX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaGlnaGxpZ2h0ZWRJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjYodGhpcywgX2ZpbHRlcmVkT3B0aW9uc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjYodGhpcywgX2hpZ2hsaWdodGVkSW5kZXhfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgaGlnaGxpZ2h0ZWRJbmRleCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2hpZ2hsaWdodGVkSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBoaWdobGlnaHRlZEluZGV4KHZhbHVlMikgewogICAgICB0aGlzLiNoaWdobGlnaHRlZEluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNPcGVuZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI2KHRoaXMsIF9oaWdobGlnaHRlZEluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNih0aGlzLCBfaXNPcGVuZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGlzT3BlbmVkKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNPcGVuZWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc09wZW5lZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXNPcGVuZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWFyY2hWYWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjYodGhpcywgX2lzT3BlbmVkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNih0aGlzLCBfc2VhcmNoVmFsdWVfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IHNlYXJjaFZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy4jc2VhcmNoVmFsdWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWFyY2hWYWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VhcmNoVmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgLi4uRGVlc0lucHV0QmFzZS5iYXNlU3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgICogewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBmb250LWZhbWlseTogJHtjc3NHZWlzdEZvbnRGYW1pbHl9OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDE1JSkiLCAiaHNsKDAgMCUgOTAlKSIpfTsKICAgICAgfQoKICAgICAgLm1haW5jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLnNlbGVjdGVkQm94IHsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiA0MHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAzOHB4OwogICAgICAgIHBhZGRpbmc6IDAgNDBweCAwIDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgIC5zZWxlY3RlZEJveDpob3Zlcjpub3QoLmRpc2FibGVkKSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNzkuOCUpIiwgImhzbCgwIDAlIDIwLjklKSIpfTsKICAgICAgfQoKICAgICAgLnNlbGVjdGVkQm94OmZvY3VzLXZpc2libGUgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlIC8gMC4xKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUgLyAwLjEpIil9OwogICAgICB9CgogICAgICAuc2VsZWN0ZWRCb3guZGlzYWJsZWQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NS4xJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA2My45JSkiLCAiaHNsKDAgMCUgNDUuMSUpIil9OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAvKiBEcm9wZG93biBhcnJvdyAqLwogICAgICAuc2VsZWN0ZWRCb3g6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDEycHg7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOwogICAgICAgIHdpZHRoOiAwOwogICAgICAgIGhlaWdodDogMDsKICAgICAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci1yaWdodDogNHB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci10b3A6IDRweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDUuMSUpIiwgImhzbCgwIDAlIDYzLjklKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnNlbGVjdGVkQm94Lm9wZW46OmFmdGVyIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSkgcm90YXRlKDE4MGRlZyk7CiAgICAgIH0KCiAgICAgIC5zZWxlY3Rpb25Cb3ggewogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm0sIG9wYWNpdHk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLThweCkgc2NhbGUoMC45OCk7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDMuOSUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDZweCAtMXB4IGhzbCgwIDAlIDAlIC8gMC4xKSwgMCAycHggNHB4IC0ycHggaHNsKDAgMCUgMCUgLyAwLjEpOwogICAgICAgIG1pbi1oZWlnaHQ6IDQwcHg7CiAgICAgICAgbWF4LWhlaWdodDogMzAwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIG1hcmdpbi10b3A6IDRweDsKICAgICAgICB6LWluZGV4OiA1MDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CiAgICAgIAogICAgICAuc2VsZWN0aW9uQm94LnRvcCB7CiAgICAgICAgYm90dG9tOiBjYWxjKDEwMCUgKyA0cHgpOwogICAgICAgIHRvcDogYXV0bzsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KSBzY2FsZSgwLjk4KTsKICAgICAgfQogICAgICAKICAgICAgLnNlbGVjdGlvbkJveC5ib3R0b20gewogICAgICAgIHRvcDogMTAwJTsKICAgICAgfQoKICAgICAgLnNlbGVjdGlvbkJveC5zaG93IHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYWxsOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSBzY2FsZSgxKTsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAvKiBPcHRpb25zIGNvbnRhaW5lciAqLwogICAgICAub3B0aW9ucy1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IDI1MHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CgogICAgICAvKiBPcHRpb25zICovCiAgICAgIC5vcHRpb24gewogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGxpbmUtaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDAgOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBtYXJnaW46IDJweCAwOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxNSUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgIH0KCiAgICAgIC5vcHRpb24uaGlnaGxpZ2h0ZWQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NS4xJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICB9CgogICAgICAub3B0aW9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUuMSUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICB9CgogICAgICAvKiBObyBvcHRpb25zIG1lc3NhZ2UgKi8KICAgICAgLm5vLW9wdGlvbnMgewogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDUuMSUpIiwgImhzbCgwIDAlIDYzLjklKSIpfTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KCiAgICAgIC8qIFNlYXJjaCAqLwogICAgICAuc2VhcmNoIHsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgICAgfQogICAgICAKICAgICAgLnNlYXJjaC5ib3R0b20gewogICAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICB9CiAgICAgIAogICAgICAuc2VhcmNoIGlucHV0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgcGFkZGluZzogMCA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cyBlYXNlOwogICAgICB9CgogICAgICAuc2VhcmNoIGlucHV0OjpwbGFjZWhvbGRlciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA2My45JSkiLCAiaHNsKDAgMCUgNDUuMSUpIil9OwogICAgICB9CgogICAgICAuc2VhcmNoIGlucHV0OmZvY3VzIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgNTEuMiUpIiwgImhzbCgyMTcuMiA5MS4yJSA1OS44JSkiKX07CiAgICAgIH0KCiAgICAgIC8qIFNjcm9sbGJhciBzdHlsaW5nICovCiAgICAgIC5vcHRpb25zLWNvbnRhaW5lcjo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIHdpZHRoOiA4cHg7CiAgICAgIH0KCiAgICAgIC5vcHRpb25zLWNvbnRhaW5lcjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAub3B0aW9ucy1jb250YWluZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgIH0KCiAgICAgIC5vcHRpb25zLWNvbnRhaW5lcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA3OS44JSkiLCAiaHNsKDAgMCUgMjAuOSUpIil9OwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImlucHV0LXdyYXBwZXIiPgogICAgICAgIDxkZWVzLWxhYmVsIC5sYWJlbD0ke3RoaXMubGFiZWx9IC5kZXNjcmlwdGlvbj0ke3RoaXMuZGVzY3JpcHRpb259IC5yZXF1aXJlZD0ke3RoaXMucmVxdWlyZWR9PjwvZGVlcy1sYWJlbD4KICAgICAgICA8ZGl2IGNsYXNzPSJtYWluY29udGFpbmVyIj4KICAgICAgICAgIDxkaXYKICAgICAgICAgICAgY2xhc3M9InNlbGVjdGVkQm94ICR7dGhpcy5pc09wZW5lZCA/ICJvcGVuIiA6ICIifSAke3RoaXMuZGlzYWJsZWQgPyAiZGlzYWJsZWQiIDogIiJ9IgogICAgICAgICAgICBAY2xpY2s9IiR7KCkgPT4gIXRoaXMuZGlzYWJsZWQgJiYgdGhpcy50b2dnbGVTZWxlY3Rpb25Cb3goKX0iCiAgICAgICAgICAgIHRhYmluZGV4PSIke3RoaXMuZGlzYWJsZWQgPyAiLTEiIDogIjAifSIKICAgICAgICAgICAgQGtleWRvd249IiR7dGhpcy5oYW5kbGVTZWxlY3RlZEJveEtleWRvd259IgogICAgICAgICAgPgogICAgICAgICAgICAke3RoaXMuc2VsZWN0ZWRPcHRpb24/Lm9wdGlvbiB8fCAiU2VsZWN0IGFuIG9wdGlvbiJ9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNlbGVjdGlvbkJveCAke3RoaXMuaXNPcGVuZWQgPyAic2hvdyIgOiAiIn0gJHt0aGlzLm9wZW5zVG9Ub3AgPyAidG9wIiA6ICJib3R0b20ifSI+CiAgICAgICAgICAgICR7dGhpcy5lbmFibGVTZWFyY2ggPyBiMmAKICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VhcmNoIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgCiAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IiAKICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJTZWFyY2ggb3B0aW9ucy4uLiIgCiAgICAgICAgICAgICAgICAgICAgICAudmFsdWU9IiR7dGhpcy5zZWFyY2hWYWx1ZX0iCiAgICAgICAgICAgICAgICAgICAgICBAaW5wdXQ9IiR7dGhpcy5oYW5kbGVTZWFyY2h9IgogICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSIkeyhlMTEpID0+IGUxMS5zdG9wUHJvcGFnYXRpb24oKX0iCiAgICAgICAgICAgICAgICAgICAgICBAa2V5ZG93bj0iJHt0aGlzLmhhbmRsZVNlYXJjaEtleWRvd259IgogICAgICAgICAgICAgICAgICAgIC8+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgYCA6IG51bGx9CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wdGlvbnMtY29udGFpbmVyIj4KICAgICAgICAgICAgICAke3RoaXMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA9PT0gMCA/IGIyYDxkaXYgY2xhc3M9Im5vLW9wdGlvbnMiPk5vIG9wdGlvbnMgZm91bmQ8L2Rpdj5gIDogdGhpcy5maWx0ZXJlZE9wdGlvbnMubWFwKChvcHRpb24yLCBpbmRleDIpID0+IHsKICAgICAgICBjb25zdCBpc0hpZ2hsaWdodGVkID0gdGhpcy5oaWdobGlnaHRlZEluZGV4ID09PSBpbmRleDI7CiAgICAgICAgcmV0dXJuIGIyYAogICAgICAgICAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3B0aW9uICR7aXNIaWdobGlnaHRlZCA/ICJoaWdobGlnaHRlZCIgOiAiIn0iCiAgICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz0iJHsoKSA9PiB0aGlzLnVwZGF0ZVNlbGVjdGlvbihvcHRpb24yKX0iCiAgICAgICAgICAgICAgICAgICAgICAgIEBtb3VzZWVudGVyPSIkeygpID0+IHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA9IGluZGV4Mn0iCiAgICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICAgICR7b3B0aW9uMi5vcHRpb259CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICBgOwogICAgICB9KX0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlID0gdGhpcy5oYW5kbGVDbGlja091dHNpZGUuYmluZCh0aGlzKTsKICAgIH0KICAgIGZpcnN0VXBkYXRlZCgpIHsKICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IHRoaXMuc2VsZWN0ZWRPcHRpb24gfHwgbnVsbDsKICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICB9CiAgICB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJvcHRpb25zIikpIHsKICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgfQogICAgfQogICAgYXN5bmMgdXBkYXRlU2VsZWN0aW9uKHNlbGVjdGVkT3B0aW9uKSB7CiAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSBzZWxlY3RlZE9wdGlvbjsKICAgICAgdGhpcy5pc09wZW5lZCA9IGZhbHNlOwogICAgICB0aGlzLnNlYXJjaFZhbHVlID0gIiI7CiAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICB0aGlzLmhpZ2hsaWdodGVkSW5kZXggPSAwOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJzZWxlY3RlZE9wdGlvbiIsIHsKICAgICAgICBkZXRhaWw6IHNlbGVjdGVkT3B0aW9uLAogICAgICAgIGJ1YmJsZXM6IHRydWUKICAgICAgfSkpOwogICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgIH0KICAgIGhhbmRsZUNsaWNrT3V0c2lkZSA9IChfX3J1bkluaXRpYWxpemVyczI2KHRoaXMsIF9zZWFyY2hWYWx1ZV9leHRyYUluaXRpYWxpemVycyksIChldmVudCkgPT4gewogICAgICBjb25zdCBwYXRoMiA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgICBpZiAoIXBhdGgyLmluY2x1ZGVzKHRoaXMpKSB7CiAgICAgICAgdGhpcy5pc09wZW5lZCA9IGZhbHNlOwogICAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAiIjsKICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlKTsKICAgICAgfQogICAgfSk7CiAgICBhc3luYyB0b2dnbGVTZWxlY3Rpb25Cb3goKSB7CiAgICAgIHRoaXMuaXNPcGVuZWQgPSAhdGhpcy5pc09wZW5lZDsKICAgICAgaWYgKHRoaXMuaXNPcGVuZWQpIHsKICAgICAgICBjb25zdCBzZWxlY3RlZEJveCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuc2VsZWN0ZWRCb3giKTsKICAgICAgICBjb25zdCByZWN0ID0gc2VsZWN0ZWRCb3guZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgY29uc3Qgc3BhY2VCZWxvdyA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHJlY3QuYm90dG9tOwogICAgICAgIGNvbnN0IHNwYWNlQWJvdmUgPSByZWN0LnRvcDsKICAgICAgICB0aGlzLm9wZW5zVG9Ub3AgPSBzcGFjZUJlbG93IDwgMzAwICYmIHNwYWNlQWJvdmUgPiBzcGFjZUJlbG93OwogICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7CiAgICAgICAgY29uc3Qgc2VhcmNoSW5wdXQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLnNlYXJjaCBpbnB1dCIpOwogICAgICAgIGlmIChzZWFyY2hJbnB1dCkgewogICAgICAgICAgc2VhcmNoSW5wdXQuZm9jdXMoKTsKICAgICAgICB9CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlKTsKICAgICAgICB9LCAwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gIiI7CiAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLmhhbmRsZUNsaWNrT3V0c2lkZSk7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZVNlYXJjaChldmVudCkgewogICAgICBjb25zdCBzZWFyY2hUZXJtID0gZXZlbnQudGFyZ2V0LnZhbHVlOwogICAgICB0aGlzLnNlYXJjaFZhbHVlID0gc2VhcmNoVGVybTsKICAgICAgY29uc3Qgc2VhcmNoTG93ZXIgPSBzZWFyY2hUZXJtLnRvTG93ZXJDYXNlKCk7CiAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gdGhpcy5vcHRpb25zLmZpbHRlcigob3B0aW9uMikgPT4gb3B0aW9uMi5vcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hMb3dlcikpOwogICAgICB0aGlzLmhpZ2hsaWdodGVkSW5kZXggPSAwOwogICAgfQogICAgaGFuZGxlS2V5RG93bihldmVudCkgewogICAgICBjb25zdCBrZXkyID0gZXZlbnQua2V5OwogICAgICBjb25zdCBtYXhJbmRleCA9IHRoaXMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAtIDE7CiAgICAgIGlmIChrZXkyID09PSAiQXJyb3dEb3duIikgewogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdGhpcy5oaWdobGlnaHRlZEluZGV4ID0gdGhpcy5oaWdobGlnaHRlZEluZGV4ICsgMSA+IG1heEluZGV4ID8gMCA6IHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCArIDE7CiAgICAgIH0gZWxzZSBpZiAoa2V5MiA9PT0gIkFycm93VXAiKSB7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSW5kZXggPSB0aGlzLmhpZ2hsaWdodGVkSW5kZXggLSAxIDwgMCA/IG1heEluZGV4IDogdGhpcy5oaWdobGlnaHRlZEluZGV4IC0gMTsKICAgICAgfSBlbHNlIGlmIChrZXkyID09PSAiRW50ZXIiKSB7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICBpZiAodGhpcy5maWx0ZXJlZE9wdGlvbnNbdGhpcy5oaWdobGlnaHRlZEluZGV4XSkgewogICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24odGhpcy5maWx0ZXJlZE9wdGlvbnNbdGhpcy5oaWdobGlnaHRlZEluZGV4XSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGtleTIgPT09ICJFc2NhcGUiKSB7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICB0aGlzLmlzT3BlbmVkID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZVNlYXJjaEtleWRvd24oZXZlbnQpIHsKICAgICAgaWYgKGV2ZW50LmtleSA9PT0gIkFycm93RG93biIgfHwgZXZlbnQua2V5ID09PSAiQXJyb3dVcCIgfHwgZXZlbnQua2V5ID09PSAiRW50ZXIiKSB7CiAgICAgICAgdGhpcy5oYW5kbGVLZXlEb3duKGV2ZW50KTsKICAgICAgfQogICAgfQogICAgaGFuZGxlU2VsZWN0ZWRCb3hLZXlkb3duKGV2ZW50KSB7CiAgICAgIGlmICh0aGlzLmRpc2FibGVkKQogICAgICAgIHJldHVybjsKICAgICAgaWYgKGV2ZW50LmtleSA9PT0gIkVudGVyIiB8fCBldmVudC5rZXkgPT09ICIgIikgewogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdGhpcy50b2dnbGVTZWxlY3Rpb25Cb3goKTsKICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICJBcnJvd0Rvd24iIHx8IGV2ZW50LmtleSA9PT0gIkFycm93VXAiKSB7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICBpZiAoIXRoaXMuaXNPcGVuZWQpIHsKICAgICAgICAgIHRoaXMudG9nZ2xlU2VsZWN0aW9uQm94KCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gIkVzY2FwZSIpIHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGlmICh0aGlzLmlzT3BlbmVkKSB7CiAgICAgICAgICB0aGlzLmlzT3BlbmVkID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBnZXRWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRPcHRpb247CiAgICB9CiAgICBzZXRWYWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IHZhbHVlMjsKICAgIH0KICAgIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMjYoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNJbnB1dERyb3Bkb3duMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1maWxldXBsb2FkL2RlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW9GdW5jMTggPSAoKSA9PiBiMmAKICA8ZGVlcy1kZW1vd3JhcHBlcj4KICAgIDxzdHlsZT4KICAgICAgJHtpYAogICAgICAgIC5kZW1vLXNoZWxsIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAzMnB4OwogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICAgIG1heC13aWR0aDogMTE2MHB4OwogICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQoKICAgICAgICAuZGVtby1ncmlkIHsKICAgICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgICBnYXA6IDI0cHg7CiAgICAgICAgfQoKICAgICAgICBAbWVkaWEgKG1pbi13aWR0aDogOTYwcHgpIHsKICAgICAgICAgIC5kZW1vLWdyaWQtLXR3byB7CiAgICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIG1pbm1heCgwLCAxZnIpKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC5kZW1vLXN0YWNrIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAxOHB4OwogICAgICAgIH0KCiAgICAgICAgLmRlbW8tbm90ZSB7CiAgICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgOTAlKSIsICJoc2woMjE1IDIwJSAyNiUpIil9OwogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTMgMTAwJSA5NyUpIiwgImhzbCgyMTUgMjAlIDEyJSkiKX07CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMjUlIDMyJSkiLCAiaHNsKDIxNSAyMCUgODIlKSIpfTsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjU1OwogICAgICAgIH0KCiAgICAgICAgLmRlbW8tbm90ZSBzdHJvbmcgewogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE3IDkxJSA0NSUpIiwgImhzbCgyMTMgOTMlIDY4JSkiKX07CiAgICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIH0KICAgICAgYH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZGVtby1zaGVsbCI+CiAgICAgIDxkZWVzLXBhbmVsCiAgICAgICAgLnRpdGxlPSR7Ik1vZGVybiBmaWxlIHVwbG9hZGVyIn0KICAgICAgICAuc3VidGl0bGU9JHsiU2hhZGNuLWluc3BpcmVkIGxheW91dCB3aXRoIGRyYWcgJiBkcm9wLCBwcmV2aWV3cyBhbmQgdmFsaWRhdGlvbiJ9CiAgICAgID4KICAgICAgICA8ZGl2IGNsYXNzPSJkZW1vLWdyaWQgZGVtby1ncmlkLS10d28iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVtby1zdGFjayI+CiAgICAgICAgICAgIDxkZWVzLWlucHV0LWZpbGV1cGxvYWQKICAgICAgICAgICAgICAubGFiZWw9JHsiQXR0YWNobWVudHMifQogICAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJVcGxvYWQgc3VwcG9ydGluZyBkb2N1bWVudHMgZm9yIHlvdXIgcmVxdWVzdCJ9CiAgICAgICAgICAgICAgLmFjY2VwdD0keyJpbWFnZS8qLC5wZGYsLnppcCJ9CiAgICAgICAgICAgICAgLm1heFNpemU9JHsxMCAqIDEwMjQgKiAxMDI0fQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LWZpbGV1cGxvYWQ+CgogICAgICAgICAgICA8ZGVlcy1pbnB1dC1maWxldXBsb2FkCiAgICAgICAgICAgICAgLmxhYmVsPSR7IkJyYW5kIGFzc2V0cyJ9CiAgICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IlVwbG9hZCBoaWdoLXJlc29sdXRpb24gaW1hZ2VyeSAoSlBHL1BORykifQogICAgICAgICAgICAgIC5hY2NlcHQ9JHsiaW1hZ2UvanBlZyxpbWFnZS9wbmcifQogICAgICAgICAgICAgIC5tdWx0aXBsZT0ke2ZhbHNlfQogICAgICAgICAgICAgIC5tYXhTaXplPSR7NSAqIDEwMjQgKiAxMDI0fQogICAgICAgICAgICAgIC5idXR0b25UZXh0PSR7IlNlbGVjdCBjb3ZlciBpbWFnZSJ9CiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtZmlsZXVwbG9hZD4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc3RhY2siPgogICAgICAgICAgICA8ZGVlcy1pbnB1dC1maWxldXBsb2FkCiAgICAgICAgICAgICAgLmxhYmVsPSR7IkF1ZGlvIHVwbG9hZHMifQogICAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJTaGFyZSBwb2RjYXN0IGRyYWZ0cyAoTVAzL1dBViwgbWF4IDI1TUIgZWFjaCkifQogICAgICAgICAgICAgIC5hY2NlcHQ9JHsiYXVkaW8vKiJ9CiAgICAgICAgICAgICAgLm1heFNpemU9JHsyNSAqIDEwMjQgKiAxMDI0fQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LWZpbGV1cGxvYWQ+CgogICAgICAgICAgICA8ZGVlcy1pbnB1dC1maWxldXBsb2FkCiAgICAgICAgICAgICAgLmxhYmVsPSR7IkRpc2FibGVkIGV4YW1wbGUifQogICAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJVcGxvYWRlciBpcyBkaXNhYmxlZCB3aGlsZSBtb2RlcmF0aW9uIGlzIHBlbmRpbmcifQogICAgICAgICAgICAgIC5kaXNhYmxlZD0ke3RydWV9CiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtZmlsZXVwbG9hZD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8ZGVlcy1wYW5lbAogICAgICAgIC50aXRsZT0keyJGb3JtIGludGVncmF0aW9uIn0KICAgICAgICAuc3VidGl0bGU9JHsiQ29tYmluZSBmaWxlIHVwbG9hZHMgd2l0aCB0aGUgcmVzdCBvZiB0aGUgREVFUyBmb3JtIGVjb3N5c3RlbSJ9CiAgICAgID4KICAgICAgICA8ZGl2IGNsYXNzPSJkZW1vLWdyaWQiPgogICAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVtby1zdGFjayI+CiAgICAgICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dAogICAgICAgICAgICAgICAgLmxhYmVsPSR7IlByb2plY3QgbmFtZSJ9CiAgICAgICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiSG93IHNob3VsZCB3ZSByZWZlciB0byB0aGlzIHByb2plY3QgaW50ZXJuYWxseT8ifQogICAgICAgICAgICAgICAgLnJlcXVpcmVkPSR7dHJ1ZX0KICAgICAgICAgICAgICAgIC5rZXk9JHsicHJvamVjdE5hbWUifQogICAgICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KCiAgICAgICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dAogICAgICAgICAgICAgICAgLmxhYmVsPSR7IkNvbnRhY3QgZW1haWwifQogICAgICAgICAgICAgICAgLmlucHV0VHlwZT0keyJlbWFpbCJ9CiAgICAgICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAgICAgLmtleT0keyJjb250YWN0RW1haWwifQogICAgICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KCiAgICAgICAgICAgICAgPGRlZXMtaW5wdXQtZmlsZXVwbG9hZAogICAgICAgICAgICAgICAgLmxhYmVsPSR7IlN0YXRlbWVudCBvZiB3b3JrIn0KICAgICAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJVcGxvYWQgYSBzaWduZWQgc3RhdGVtZW50IG9mIHdvcmsgKFBERiwgbWF4IDE1TUIpIn0KICAgICAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICAgICAgICAuYWNjZXB0PSR7ImFwcGxpY2F0aW9uL3BkZiJ9CiAgICAgICAgICAgICAgICAubWF4U2l6ZT0kezE1ICogMTAyNCAqIDEwMjR9CiAgICAgICAgICAgICAgICAubXVsdGlwbGU9JHtmYWxzZX0KICAgICAgICAgICAgICAgIC5rZXk9JHsic293In0KICAgICAgICAgICAgICA+PC9kZWVzLWlucHV0LWZpbGV1cGxvYWQ+CgogICAgICAgICAgICAgIDxkZWVzLWlucHV0LWZpbGV1cGxvYWQKICAgICAgICAgICAgICAgIC5sYWJlbD0keyJDcmVhdGl2ZSByZWZlcmVuY2VzIn0KICAgICAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJPcHRpb25hbC4gVXBsb2FkIHVwIHRvIGZpdmUgdmlzdWFsIHJlZmVyZW5jZXMifQogICAgICAgICAgICAgICAgLmFjY2VwdD0keyJpbWFnZS8qIn0KICAgICAgICAgICAgICAgIC5tYXhGaWxlcz0kezV9CiAgICAgICAgICAgICAgICAubWF4U2l6ZT0kezggKiAxMDI0ICogMTAyNH0KICAgICAgICAgICAgICAgIC5rZXk9JHsicmVmZXJlbmNlcyJ9CiAgICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC1maWxldXBsb2FkPgoKICAgICAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0CiAgICAgICAgICAgICAgICAubGFiZWw9JHsiTm90ZXMifQogICAgICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IkFkZCBvcHRpb25hbCBjb250ZXh0IGZvciByZXZpZXdlcnMifQogICAgICAgICAgICAgICAgLmlucHV0VHlwZT0keyJ0ZXh0YXJlYSJ9CiAgICAgICAgICAgICAgICAua2V5PSR7Im5vdGVzIn0KICAgICAgICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CgogICAgICAgICAgICAgIDxkZWVzLWZvcm0tc3VibWl0IC50ZXh0PSR7IlN1Ym1pdCBicmllZmluZyJ9PjwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2RlZXMtZm9ybT4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJkZW1vLW5vdGUiPgogICAgICAgICAgICA8c3Ryb25nPkdvb2QgdG8ga25vdzo8L3N0cm9uZz4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5EcmFnICYgZHJvcCBoaWdobGlnaHRzIHRoZSBkcm9wem9uZSBhbmQgc3VwcG9ydHMga2V5Ym9hcmQgYWN0aXZhdGlvbi48L2xpPgogICAgICAgICAgICAgIDxsaT5BY2NlcHRlZCBmaWxlIHR5cGVzIGFyZSBzdW1tYXJpc2VkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgPGNvZGU+YWNjZXB0PC9jb2RlPiBhdHRyaWJ1dGUuPC9saT4KICAgICAgICAgICAgICA8bGk+SW1hZ2UgdXBsb2FkcyBzaG93IGxpdmUgcHJldmlld3MgZ2VuZXJhdGVkIHZpYSA8Y29kZT5VUkwuY3JlYXRlT2JqZWN0VVJMPC9jb2RlPi48L2xpPgogICAgICAgICAgICAgIDxsaT5GaWxlIHNpemUgYW5kIGZpbGUtY291bnQgbGltaXRzIHN1cmZhY2UgaW5saW5lIHZhbGlkYXRpb24gbWVzc2FnZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGhlIGNvbXBvbmVudCBzdGF5cyBjb21wYXRpYmxlIHdpdGggPGNvZGU+ZGVlcy1mb3JtPC9jb2RlPiB2YWx1ZSBhY2Nlc3NvcnMuPC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2Rpdj4KICA8L2RlZXMtZGVtb3dyYXBwZXI+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1maWxldXBsb2FkL3N0eWxlcy5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgZmlsZXVwbG9hZFN0eWxlcyA9IFsKICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgLi4uRGVlc0lucHV0QmFzZS5iYXNlU3R5bGVzLAogIGlgCiAgICA6aG9zdCB7CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgZGlzcGxheTogYmxvY2s7CiAgICB9CgoKICAgIC5pbnB1dC13cmFwcGVyIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgZ2FwOiAxMnB4OwogICAgfQoKICAgIC5kcm9wem9uZSB7CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgcGFkZGluZzogMjBweDsKICAgICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgICAgYm9yZGVyOiAxLjVweCBkYXNoZWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDgwJSkiLCAiaHNsKDIxNyAyMCUgMjUlKSIpfTsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgyMTUgMjAlIDEyJSkiKX07CiAgICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjJzIGVhc2UsIGJveC1zaGFkb3cgMC4ycyBlYXNlLCBiYWNrZ3JvdW5kIDAuMnMgZWFzZTsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICBvdXRsaW5lOiBub25lOwogICAgfQoKICAgIC5kcm9wem9uZTpmb2N1cy12aXNpYmxlIHsKICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMjE1IDIwJSAxMiUpIil9LAogICAgICAgIDAgMCAwIDRweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgNjAlIC8gMC41KSIsICJoc2woMjEzIDkzJSA2OCUgLyAwLjQpIil9OwogICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE3IDkxJSA2MCUpIiwgImhzbCgyMTMgOTMlIDY4JSkiKX07CiAgICB9CgogICAgLmRyb3B6b25lLS1hY3RpdmUgewogICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE3IDkxJSA2MCUpIiwgImhzbCgyMTMgOTMlIDY4JSkiKX07CiAgICAgIGJveC1zaGFkb3c6IDAgMTJweCAzMnB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDE1LCAyMywgNDIsIDAuMTIpIiwgInJnYmEoMCwgMCwgMCwgMC4zNSkiKX07CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE3IDkxJSA2MCUgLyAwLjA2KSIsICJoc2woMjEzIDkzJSA2OCUgLyAwLjEyKSIpfTsKICAgIH0KCiAgICAuZHJvcHpvbmUtLWhhcy1maWxlcyB7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5OSUpIiwgImhzbCgyMTUgMjAlIDExJSkiKX07CiAgICB9CgogICAgLmRyb3B6b25lLS1kaXNhYmxlZCB7CiAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICB9CgogICAgLmRyb3B6b25lX19ib2R5IHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgZ2FwOiAxNnB4OwogICAgfQoKICAgIC5kcm9wem9uZV9faWNvbiB7CiAgICAgIHdpZHRoOiA0OHB4OwogICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDE2cHg7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTcgOTElIDYwJSkiLCAiaHNsKDIxMyA5MyUgNjglKSIpfTsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTcgOTElIDYwJSAvIDAuMTIpIiwgImhzbCgyMTMgOTMlIDY4JSAvIDAuMTIpIil9OwogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgfQoKICAgIC5kcm9wem9uZV9faWNvbiBkZWVzLWljb24gewogICAgICBmb250LXNpemU6IDIycHg7CiAgICB9CgogICAgLmRyb3B6b25lX19sb2FkZXIgewogICAgICB3aWR0aDogMjBweDsKICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgICAgYm9yZGVyOiAycHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMTUsIDIzLCA0MiwgMC4xNSkiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSIpfTsKICAgICAgYm9yZGVyLXRvcC1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTcgOTElIDYwJSkiLCAiaHNsKDIxMyA5MyUgNjglKSIpfTsKICAgICAgYW5pbWF0aW9uOiBsb2FkZXItc3BpbiAwLjZzIGxpbmVhciBpbmZpbml0ZTsKICAgIH0KCiAgICAuZHJvcHpvbmVfX2NvbnRlbnQgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDRweDsKICAgICAgbWluLXdpZHRoOiAwOwogICAgfQoKICAgIC5kcm9wem9uZV9faGVhZGxpbmUgewogICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMiA0NyUgMTElKSIsICJoc2woMjEwIDIwJSA5NiUpIil9OwogICAgfQoKICAgIC5kcm9wem9uZV9fc3VibGluZSB7CiAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDE2JSA0NiUpIiwgImhzbCgyMTUgMTYlIDcwJSkiKX07CiAgICB9CgogICAgLmRyb3B6b25lX19icm93c2UgewogICAgICBhcHBlYXJhbmNlOiBub25lOwogICAgICBib3JkZXI6IG5vbmU7CiAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgIHBhZGRpbmc6IDA7CiAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgNjAlKSIsICJoc2woMjEzIDkzJSA2OCUpIil9OwogICAgICBmb250LXdlaWdodDogNjAwOwogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIH0KCiAgICAuZHJvcHpvbmVfX2Jyb3dzZTpob3ZlciB7CiAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgfQoKICAgIC5kcm9wem9uZV9fYnJvd3NlOmRpc2FibGVkIHsKICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgb3BhY2l0eTogMC42OwogICAgfQoKICAgIC5kcm9wem9uZV9fbWV0YSB7CiAgICAgIG1hcmdpbi10b3A6IDE0cHg7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgZ2FwOiA4cHg7CiAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDE2JSA1MCUpIiwgImhzbCgyMTUgMTYlIDcyJSkiKX07CiAgICB9CgogICAgLmRyb3B6b25lX19tZXRhIHNwYW4gewogICAgICBwYWRkaW5nOiA0cHggMTBweDsKICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE3IDkxJSA5NSUpIiwgImhzbCgyMTMgOTMlIDE4JSkiKX07CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE3IDkxJSA5MCUpIiwgImhzbCgyMTMgOTMlIDI0JSkiKX07CiAgICB9CgogICAgLmZpbGUtbGlzdCB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIGdhcDogMTJweDsKICAgICAgbWFyZ2luLXRvcDogMjBweDsKICAgICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgOTAlKSIsICJoc2woMjEzIDkzJSAyNCUpIil9OwogICAgfQoKICAgIC5maWxlLWxpc3RfX2hlYWRlciB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICBmb250LXdlaWdodDogNTAwOwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDQ1JSkiLCAiaHNsKDIxNSAxNiUgNjglKSIpfTsKICAgIH0KCiAgICAuZmlsZS1saXN0X19jbGVhciB7CiAgICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE3IDkxJSA2MCUpIiwgImhzbCgyMTMgOTMlIDY4JSkiKX07CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICBwYWRkaW5nOiAwOwogICAgfQoKICAgIC5maWxlLWxpc3RfX2NsZWFyOmhvdmVyIHsKICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB9CgogICAgLmZpbGUtbGlzdF9faXRlbXMgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDEycHg7CiAgICB9CgogICAgLmZpbGUtcm93IHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgZ2FwOiAxMnB4OwogICAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlIC8gMC41KSIsICJoc2woMjE1IDIwJSAxNiUgLyAwLjUpIil9OwogICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMyAyNyUgOTIlKSIsICJoc2woMjE3IDI1JSAyNiUpIil9OwogICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMgZWFzZTsKICAgIH0KCiAgICAuZmlsZS1yb3c6aG92ZXIgewogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSAvIDAuOCkiLCAiaHNsKDIxNSAyMCUgMTYlIC8gMC44KSIpfTsKICAgIH0KCiAgICAuZmlsZS10aHVtYiB7CiAgICAgIHdpZHRoOiAzNnB4OwogICAgICBoZWlnaHQ6IDM2cHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQgMzElIDkyJSkiLCAiaHNsKDIxNyAzMiUgMTglKSIpfTsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgfQoKICAgIC5maWxlLXRodW1iIGRlZXMtaWNvbiB7CiAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDE2JSA0NSUpIiwgImhzbCgyMTUgMTYlIDcwJSkiKX07CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB3aWR0aDogMThweDsKICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgZmxleC1zaHJpbms6IDA7CiAgICB9CgoKICAgIC50aHVtYi1pbWFnZSB7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIG9iamVjdC1maXQ6IGNvdmVyOwogICAgfQoKICAgIC5maWxlLW1ldGEgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDRweDsKICAgICAgbWluLXdpZHRoOiAwOwogICAgfQoKICAgIC5maWxlLW5hbWUgewogICAgICBmb250LXdlaWdodDogNjAwOwogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMiA0NyUgMTElKSIsICJoc2woMjEwIDIwJSA5NiUpIil9OwogICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIH0KCiAgICAuZmlsZS1kZXRhaWxzIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgZ2FwOiA4cHg7CiAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDQ2JSkiLCAiaHNsKDIxNSAxNiUgNzAlKSIpfTsKICAgIH0KCiAgICAuZmlsZS1zaXplIHsKICAgICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIH0KCiAgICAuZmlsZS10eXBlIHsKICAgICAgcGFkZGluZzogMnB4IDhweDsKICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0IDMxJSA4NiUpIiwgImhzbCgyMTcgMzIlIDI4JSkiKX07CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAxNiUgNDYlKSIsICJoc2woMjE1IDE2JSA3MCUpIil9OwogICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICBsZXR0ZXItc3BhY2luZzogMC4wOGVtOwogICAgICBsaW5lLWhlaWdodDogMTsKICAgIH0KCiAgICAuZmlsZS1hY3Rpb25zIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgZ2FwOiA4cHg7CiAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgfQoKICAgIC5yZW1vdmUtYnV0dG9uIHsKICAgICAgd2lkdGg6IDI4cHg7CiAgICAgIGhlaWdodDogMjhweDsKICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgYm9yZGVyOiBub25lOwogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzIGVhc2UsIHRyYW5zZm9ybSAwLjE1cyBlYXNlLCBjb2xvciAwLjE1cyBlYXNlOwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDUyJSkiLCAiaHNsKDIxNSAxNiUgNjglKSIpfTsKICAgIH0KCiAgICAucmVtb3ZlLWJ1dHRvbjpob3ZlciB7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA3MiUgNTAlIC8gMC4wOCkiLCAiaHNsKDAgNjIlIDMyJSAvIDAuMTUpIil9OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcyJSA0NiUpIiwgImhzbCgwIDcwJSA3MCUpIil9OwogICAgfQoKICAgIC5yZW1vdmUtYnV0dG9uOmFjdGl2ZSB7CiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45Nik7CiAgICB9CgogICAgLnJlbW92ZS1idXR0b24gZGVlcy1pY29uIHsKICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIHdpZHRoOiAxNHB4OwogICAgICBoZWlnaHQ6IDE0cHg7CiAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgfQoKICAgIC52YWxpZGF0aW9uLW1lc3NhZ2UgewogICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzIlIDQwJSkiLCAiaHNsKDAgNzAlIDY4JSkiKX07CiAgICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICB9CgogICAgQGtleWZyYW1lcyBsb2FkZXItc3BpbiB7CiAgICAgIHRvIHsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICB9CiAgICB9CiAgYApdOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtZmlsZXVwbG9hZC9jb21wb25lbnQuanMKaW5pdF9kZWVzX2ljb24oKTsKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIF9fZXNEZWNvcmF0ZTI2ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMyNyA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0lucHV0RmlsZXVwbG9hZCA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtaW5wdXQtZmlsZXVwbG9hZCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzSW5wdXRCYXNlOwogIGxldCBfdmFsdWVfZGVjb3JhdG9yczsKICBsZXQgX3ZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3N0YXRlX2RlY29yYXRvcnM7CiAgbGV0IF9zdGF0ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3N0YXRlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0xvYWRpbmdfZGVjb3JhdG9yczsKICBsZXQgX2lzTG9hZGluZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzTG9hZGluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYnV0dG9uVGV4dF9kZWNvcmF0b3JzOwogIGxldCBfYnV0dG9uVGV4dF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2J1dHRvblRleHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FjY2VwdF9kZWNvcmF0b3JzOwogIGxldCBfYWNjZXB0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWNjZXB0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tdWx0aXBsZV9kZWNvcmF0b3JzOwogIGxldCBfbXVsdGlwbGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tdWx0aXBsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWF4U2l6ZV9kZWNvcmF0b3JzOwogIGxldCBfbWF4U2l6ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21heFNpemVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21heEZpbGVzX2RlY29yYXRvcnM7CiAgbGV0IF9tYXhGaWxlc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21heEZpbGVzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWxpZGF0aW9uU3RhdGVfZGVjb3JhdG9yczsKICBsZXQgX3ZhbGlkYXRpb25TdGF0ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbGlkYXRpb25TdGF0ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW5wdXRGaWxldXBsb2FkMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3ZhbHVlX2RlY29yYXRvcnMgPSBbbjUoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXTsKICAgICAgX3N0YXRlX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pc0xvYWRpbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2J1dHRvblRleHRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9hY2NlcHRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9tdWx0aXBsZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9tYXhTaXplX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfbWF4RmlsZXNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF92YWxpZGF0aW9uU3RhdGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZywgcmVmbGVjdDogdHJ1ZSB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTI2KHRoaXMsIG51bGwsIF92YWx1ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2YWx1ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmFsdWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmFsdWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZhbHVlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZhbHVlX2luaXRpYWxpemVycywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjYodGhpcywgbnVsbCwgX3N0YXRlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInN0YXRlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzdGF0ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zdGF0ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc3RhdGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc3RhdGVfaW5pdGlhbGl6ZXJzLCBfc3RhdGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNih0aGlzLCBudWxsLCBfaXNMb2FkaW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzTG9hZGluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNMb2FkaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzTG9hZGluZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNMb2FkaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzTG9hZGluZ19pbml0aWFsaXplcnMsIF9pc0xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNih0aGlzLCBudWxsLCBfYnV0dG9uVGV4dF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJidXR0b25UZXh0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJidXR0b25UZXh0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmJ1dHRvblRleHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmJ1dHRvblRleHQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYnV0dG9uVGV4dF9pbml0aWFsaXplcnMsIF9idXR0b25UZXh0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjYodGhpcywgbnVsbCwgX2FjY2VwdF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhY2NlcHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFjY2VwdCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hY2NlcHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFjY2VwdCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hY2NlcHRfaW5pdGlhbGl6ZXJzLCBfYWNjZXB0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjYodGhpcywgbnVsbCwgX211bHRpcGxlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm11bHRpcGxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtdWx0aXBsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tdWx0aXBsZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubXVsdGlwbGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbXVsdGlwbGVfaW5pdGlhbGl6ZXJzLCBfbXVsdGlwbGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNih0aGlzLCBudWxsLCBfbWF4U2l6ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtYXhTaXplIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtYXhTaXplIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1heFNpemUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1heFNpemUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWF4U2l6ZV9pbml0aWFsaXplcnMsIF9tYXhTaXplX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjYodGhpcywgbnVsbCwgX21heEZpbGVzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1heEZpbGVzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtYXhGaWxlcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYXhGaWxlcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWF4RmlsZXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWF4RmlsZXNfaW5pdGlhbGl6ZXJzLCBfbWF4RmlsZXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNih0aGlzLCBudWxsLCBfdmFsaWRhdGlvblN0YXRlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZhbGlkYXRpb25TdGF0ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmFsaWRhdGlvblN0YXRlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZhbGlkYXRpb25TdGF0ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudmFsaWRhdGlvblN0YXRlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZhbGlkYXRpb25TdGF0ZV9pbml0aWFsaXplcnMsIF92YWxpZGF0aW9uU3RhdGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNihudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNJbnB1dEZpbGV1cGxvYWQyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMxODsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJJbnB1dCJdOwogICAgI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczI3KHRoaXMsIF92YWx1ZV9pbml0aWFsaXplcnMsIFtdKTsKICAgIGdldCB2YWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc3RhdGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI3KHRoaXMsIF92YWx1ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjcodGhpcywgX3N0YXRlX2luaXRpYWxpemVycywgImlkbGUiKSk7CiAgICBnZXQgc3RhdGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzdGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHN0YXRlKHZhbHVlMikgewogICAgICB0aGlzLiNzdGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzTG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjcodGhpcywgX3N0YXRlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNyh0aGlzLCBfaXNMb2FkaW5nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc0xvYWRpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc0xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc0xvYWRpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzTG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2J1dHRvblRleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI3KHRoaXMsIF9pc0xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczI3KHRoaXMsIF9idXR0b25UZXh0X2luaXRpYWxpemVycywgIlNlbGVjdCBmaWxlcyIpKTsKICAgIGdldCBidXR0b25UZXh0KCkgewogICAgICByZXR1cm4gdGhpcy4jYnV0dG9uVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGJ1dHRvblRleHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2J1dHRvblRleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhY2NlcHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI3KHRoaXMsIF9idXR0b25UZXh0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNyh0aGlzLCBfYWNjZXB0X2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBhY2NlcHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhY2NlcHRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhY2NlcHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2FjY2VwdF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI211bHRpcGxlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyNyh0aGlzLCBfYWNjZXB0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNyh0aGlzLCBfbXVsdGlwbGVfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgbXVsdGlwbGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtdWx0aXBsZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG11bHRpcGxlKHZhbHVlMikgewogICAgICB0aGlzLiNtdWx0aXBsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21heFNpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI3KHRoaXMsIF9tdWx0aXBsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjcodGhpcywgX21heFNpemVfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgbWF4U2l6ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21heFNpemVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIC8vIDAgbWVhbnMgbm8gbGltaXQKICAgIHNldCBtYXhTaXplKHZhbHVlMikgewogICAgICB0aGlzLiNtYXhTaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWF4RmlsZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI3KHRoaXMsIF9tYXhTaXplX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNyh0aGlzLCBfbWF4RmlsZXNfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgbWF4RmlsZXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtYXhGaWxlc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgLy8gMCBtZWFucyBubyBsaW1pdAogICAgc2V0IG1heEZpbGVzKHZhbHVlMikgewogICAgICB0aGlzLiNtYXhGaWxlc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3ZhbGlkYXRpb25TdGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjcodGhpcywgX21heEZpbGVzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNyh0aGlzLCBfdmFsaWRhdGlvblN0YXRlX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IHZhbGlkYXRpb25TdGF0ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ZhbGlkYXRpb25TdGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbGlkYXRpb25TdGF0ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdmFsaWRhdGlvblN0YXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdmFsaWRhdGlvbk1lc3NhZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI3KHRoaXMsIF92YWxpZGF0aW9uU3RhdGVfZXh0cmFJbml0aWFsaXplcnMpLCAiIik7CiAgICBnZXQgdmFsaWRhdGlvbk1lc3NhZ2UoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWxpZGF0aW9uTWVzc2FnZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbGlkYXRpb25NZXNzYWdlKHZhbHVlMikgewogICAgICB0aGlzLiN2YWxpZGF0aW9uTWVzc2FnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgcHJldmlld1VybE1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogICAgZHJvcEFyZWEgPSBudWxsOwogICAgc3RhdGljIHN0eWxlcyA9IGZpbGV1cGxvYWRTdHlsZXM7CiAgICByZW5kZXIoKSB7CiAgICAgIGNvbnN0IGFjY2VwdGVkU3VtbWFyeSA9IHRoaXMuZ2V0QWNjZXB0ZWRTdW1tYXJ5KCk7CiAgICAgIGNvbnN0IG1ldGFFbnRyaWVzID0gWwogICAgICAgIHRoaXMubXVsdGlwbGUgPyAiTXVsdGlwbGUgZmlsZXMgc3VwcG9ydGVkIiA6ICJTaW5nbGUgZmlsZSBvbmx5IiwKICAgICAgICB0aGlzLm1heFNpemUgPiAwID8gYE1heCAke3RoaXMuZm9ybWF0RmlsZVNpemUodGhpcy5tYXhTaXplKX1gIDogIk5vIHNpemUgbGltaXQiCiAgICAgIF07CiAgICAgIGlmIChhY2NlcHRlZFN1bW1hcnkpIHsKICAgICAgICBtZXRhRW50cmllcy5wdXNoKGBBY2NlcHRzICR7YWNjZXB0ZWRTdW1tYXJ5fWApOwogICAgICB9CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgICAgPGRlZXMtbGFiZWwKICAgICAgICAgIC5sYWJlbD0ke3RoaXMubGFiZWx9CiAgICAgICAgICAuZGVzY3JpcHRpb249JHt0aGlzLmRlc2NyaXB0aW9ufQogICAgICAgICAgLnJlcXVpcmVkPSR7dGhpcy5yZXF1aXJlZH0KICAgICAgICA+PC9kZWVzLWxhYmVsPgogICAgICAgIDxkaXYKICAgICAgICAgIGNsYXNzPSJkcm9wem9uZSAke3RoaXMuc3RhdGUgPT09ICJkcmFnT3ZlciIgPyAiZHJvcHpvbmUtLWFjdGl2ZSIgOiAiIn0gJHt0aGlzLmRpc2FibGVkID8gImRyb3B6b25lLS1kaXNhYmxlZCIgOiAiIn0gJHt0aGlzLnZhbHVlLmxlbmd0aCA+IDAgPyAiZHJvcHpvbmUtLWhhcy1maWxlcyIgOiAiIn0iCiAgICAgICAgICByb2xlPSJidXR0b24iCiAgICAgICAgICB0YWJpbmRleD0ke3RoaXMuZGlzYWJsZWQgPyAtMSA6IDB9CiAgICAgICAgICBhcmlhLWRpc2FibGVkPSR7dGhpcy5kaXNhYmxlZH0KICAgICAgICAgIGFyaWEtbGFiZWw9JHtgU2VsZWN0IGZpbGVzJHthY2NlcHRlZFN1bW1hcnkgPyBgICgke2FjY2VwdGVkU3VtbWFyeX0pYCA6ICIifWB9CiAgICAgICAgICBAY2xpY2s9JHt0aGlzLmhhbmRsZURyb3B6b25lQ2xpY2t9CiAgICAgICAgICBAa2V5ZG93bj0ke3RoaXMuaGFuZGxlRHJvcHpvbmVLZXlkb3dufQogICAgICAgID4KICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICBjbGFzcz0iZmlsZS1pbnB1dCIKICAgICAgICAgICAgc3R5bGU9InBvc2l0aW9uOiBhYnNvbHV0ZTsgb3BhY2l0eTogMDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IHdpZHRoOiAxcHg7IGhlaWdodDogMXB4OyB0b3A6IDA7IGxlZnQ6IDA7IG92ZXJmbG93OiBoaWRkZW47IgogICAgICAgICAgICB0eXBlPSJmaWxlIgogICAgICAgICAgICA/bXVsdGlwbGU9JHt0aGlzLm11bHRpcGxlfQogICAgICAgICAgICBhY2NlcHQ9JHt0aGlzLmFjY2VwdCB8fCAiIn0KICAgICAgICAgICAgP2Rpc2FibGVkPSR7dGhpcy5kaXNhYmxlZH0KICAgICAgICAgICAgQGNoYW5nZT0ke3RoaXMuaGFuZGxlRmlsZUlucHV0Q2hhbmdlfQogICAgICAgICAgICB0YWJpbmRleD0iLTEiCiAgICAgICAgICAvPgogICAgICAgICAgPGRpdiBjbGFzcz0iZHJvcHpvbmVfX2JvZHkiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkcm9wem9uZV9faWNvbiI+CiAgICAgICAgICAgICAgJHt0aGlzLmlzTG9hZGluZyA/IGIyYDxzcGFuIGNsYXNzPSJkcm9wem9uZV9fbG9hZGVyIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPmAgOiBiMmA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpGb2xkZXJPcGVuIj48L2RlZXMtaWNvbj5gfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZHJvcHpvbmVfX2NvbnRlbnQiPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkcm9wem9uZV9faGVhZGxpbmUiPiR7dGhpcy5idXR0b25UZXh0IHx8ICJTZWxlY3QgZmlsZXMifTwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZHJvcHpvbmVfX3N1YmxpbmUiPgogICAgICAgICAgICAgICAgRHJhZyBhbmQgZHJvcCBmaWxlcyBoZXJlIG9yCiAgICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICAgIHR5cGU9ImJ1dHRvbiIKICAgICAgICAgICAgICAgICAgY2xhc3M9ImRyb3B6b25lX19icm93c2UiCiAgICAgICAgICAgICAgICAgIEBjbGljaz0ke3RoaXMuaGFuZGxlQnJvd3NlQ2xpY2t9CiAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD0ke3RoaXMuZGlzYWJsZWR9CiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIGJyb3dzZQogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZHJvcHpvbmVfX21ldGEiPgogICAgICAgICAgICAke21ldGFFbnRyaWVzLm1hcCgoZW50cnkpID0+IGIyYDxzcGFuPiR7ZW50cnl9PC9zcGFuPmApfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgICAke3RoaXMucmVuZGVyRmlsZUxpc3QoKX0KICAgICAgICA8L2Rpdj4KICAgICAgICAke3RoaXMudmFsaWRhdGlvbk1lc3NhZ2UgPyBiMmA8ZGl2IGNsYXNzPSJ2YWxpZGF0aW9uLW1lc3NhZ2UiIGFyaWEtbGl2ZT0icG9saXRlIj4ke3RoaXMudmFsaWRhdGlvbk1lc3NhZ2V9PC9kaXY+YCA6IGIyYGB9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlckZpbGVMaXN0KCkgewogICAgICBpZiAodGhpcy52YWx1ZS5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gYjJgYDsKICAgICAgfQogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImZpbGUtbGlzdCI+CiAgICAgICAgPGRpdiBjbGFzcz0iZmlsZS1saXN0X19oZWFkZXIiPgogICAgICAgICAgPHNwYW4+JHt0aGlzLnZhbHVlLmxlbmd0aH0gZmlsZSR7dGhpcy52YWx1ZS5sZW5ndGggPT09IDEgPyAiIiA6ICJzIn0gc2VsZWN0ZWQ8L3NwYW4+CiAgICAgICAgICAke3RoaXMudmFsdWUubGVuZ3RoID4gMCA/IGIyYDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iZmlsZS1saXN0X19jbGVhciIgQGNsaWNrPSR7dGhpcy5oYW5kbGVDbGVhckFsbH0+Q2xlYXIgJHt0aGlzLnZhbHVlLmxlbmd0aCA+IDEgPyAiYWxsIiA6ICIifTwvYnV0dG9uPmAgOiBiMmBgfQogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImZpbGUtbGlzdF9faXRlbXMiPgogICAgICAgICAgJHt0aGlzLnZhbHVlLm1hcCgoZmlsZSkgPT4gdGhpcy5yZW5kZXJGaWxlUm93KGZpbGUpKX0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgcmVuZGVyRmlsZVJvdyhmaWxlKSB7CiAgICAgIGNvbnN0IGZpbGVUeXBlID0gdGhpcy5nZXRGaWxlVHlwZShmaWxlKTsKICAgICAgY29uc3QgcHJldmlld1VybCA9IHRoaXMuY2FuU2hvd1ByZXZpZXcoZmlsZSkgPyB0aGlzLmdldFByZXZpZXdVcmwoZmlsZSkgOiBudWxsOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImZpbGUtcm93ICR7ZmlsZVR5cGV9LWZpbGUiPgogICAgICAgIDxkaXYgY2xhc3M9ImZpbGUtdGh1bWIiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICR7cHJldmlld1VybCA/IGIyYDxpbWcgY2xhc3M9InRodW1iLWltYWdlIiBzcmM9JHtwcmV2aWV3VXJsfSBhbHQ9JHtgUHJldmlldyBvZiAke2ZpbGUubmFtZX1gfT5gIDogYjJgPGRlZXMtaWNvbiBpY29uPSR7dGhpcy5nZXRGaWxlSWNvbihmaWxlKX0+PC9kZWVzLWljb24+YH0KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJmaWxlLW1ldGEiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZmlsZS1uYW1lIiB0aXRsZT0ke2ZpbGUubmFtZX0+JHtmaWxlLm5hbWV9PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJmaWxlLWRldGFpbHMiPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iZmlsZS1zaXplIj4ke3RoaXMuZm9ybWF0RmlsZVNpemUoZmlsZS5zaXplKX08L3NwYW4+CiAgICAgICAgICAgICR7ZmlsZVR5cGUgIT09ICJmaWxlIiA/IGIyYDxzcGFuIGNsYXNzPSJmaWxlLXR5cGUiPiR7ZmlsZVR5cGV9PC9zcGFuPmAgOiBiMmBgfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iZmlsZS1hY3Rpb25zIj4KICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgdHlwZT0iYnV0dG9uIgogICAgICAgICAgICBjbGFzcz0icmVtb3ZlLWJ1dHRvbiIKICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5yZW1vdmVGaWxlKGZpbGUpfQogICAgICAgICAgICBhcmlhLWxhYmVsPSR7YFJlbW92ZSAke2ZpbGUubmFtZX1gfQogICAgICAgICAgPgogICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpYIj48L2RlZXMtaWNvbj4KICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBoYW5kbGVGaWxlSW5wdXRDaGFuZ2UgPSBhc3luYyAoZXZlbnQpID0+IHsKICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTsKICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0OwogICAgICBjb25zdCBmaWxlcyA9IEFycmF5LmZyb20odGFyZ2V0LmZpbGVzID8/IFtdKTsKICAgICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHsKICAgICAgICBhd2FpdCB0aGlzLmFkZEZpbGVzKGZpbGVzKTsKICAgICAgfQogICAgICB0YXJnZXQudmFsdWUgPSAiIjsKICAgIH07CiAgICBoYW5kbGVEcm9wem9uZUNsaWNrID0gKGV2ZW50KSA9PiB7CiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChldmVudC50YXJnZXQuY2xvc2VzdCgiLmRyb3B6b25lX19icm93c2UsIC5maWxlLWxpc3QiKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLm9wZW5GaWxlU2VsZWN0b3IoKTsKICAgIH07CiAgICBoYW5kbGVCcm93c2VDbGljayA9IChldmVudCkgPT4gewogICAgICBpZiAodGhpcy5kaXNhYmxlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgdGhpcy5vcGVuRmlsZVNlbGVjdG9yKCk7CiAgICB9OwogICAgaGFuZGxlRHJvcHpvbmVLZXlkb3duID0gKGV2ZW50KSA9PiB7CiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChldmVudC5rZXkgPT09ICJFbnRlciIgfHwgZXZlbnQua2V5ID09PSAiICIpIHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMub3BlbkZpbGVTZWxlY3RvcigpOwogICAgICB9CiAgICB9OwogICAgaGFuZGxlQ2xlYXJBbGwgPSAoZXZlbnQpID0+IHsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy5jbGVhckFsbCgpOwogICAgfTsKICAgIGhhbmRsZURyYWdFdmVudCA9IGFzeW5jIChldmVudCkgPT4gewogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICJkcmFnZW50ZXIiIHx8IGV2ZW50LnR5cGUgPT09ICJkcmFnb3ZlciIpIHsKICAgICAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSB7CiAgICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICJjb3B5IjsKICAgICAgICB9CiAgICAgICAgdGhpcy5zdGF0ZSA9ICJkcmFnT3ZlciI7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChldmVudC50eXBlID09PSAiZHJhZ2xlYXZlIikgewogICAgICAgIGlmICghdGhpcy5kcm9wQXJlYSkgewogICAgICAgICAgdGhpcy5zdGF0ZSA9ICJpZGxlIjsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZHJvcEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgY29uc3QgeyBjbGllbnRYID0gMCwgY2xpZW50WSA9IDAgfSA9IGV2ZW50OwogICAgICAgIGlmIChjbGllbnRYIDw9IHJlY3QubGVmdCB8fCBjbGllbnRYID49IHJlY3QucmlnaHQgfHwgY2xpZW50WSA8PSByZWN0LnRvcCB8fCBjbGllbnRZID49IHJlY3QuYm90dG9tKSB7CiAgICAgICAgICB0aGlzLnN0YXRlID0gImlkbGUiOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICJkcm9wIikgewogICAgICAgIHRoaXMuc3RhdGUgPSAiaWRsZSI7CiAgICAgICAgY29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXMgPz8gW10pOwogICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICBhd2FpdCB0aGlzLmFkZEZpbGVzKGZpbGVzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBhdHRhY2hEcm9wTGlzdGVuZXJzKCkgewogICAgICBpZiAoIXRoaXMuZHJvcEFyZWEpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgWyJkcmFnZW50ZXIiLCAiZHJhZ292ZXIiLCAiZHJhZ2xlYXZlIiwgImRyb3AiXS5mb3JFYWNoKChldmVudE5hbWUpID0+IHsKICAgICAgICB0aGlzLmRyb3BBcmVhLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB0aGlzLmhhbmRsZURyYWdFdmVudCk7CiAgICAgIH0pOwogICAgfQogICAgZGV0YWNoRHJvcExpc3RlbmVycygpIHsKICAgICAgaWYgKCF0aGlzLmRyb3BBcmVhKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIFsiZHJhZ2VudGVyIiwgImRyYWdvdmVyIiwgImRyYWdsZWF2ZSIsICJkcm9wIl0uZm9yRWFjaCgoZXZlbnROYW1lKSA9PiB7CiAgICAgICAgdGhpcy5kcm9wQXJlYS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgdGhpcy5oYW5kbGVEcmFnRXZlbnQpOwogICAgICB9KTsKICAgIH0KICAgIHJlYmluZEludGVyYWN0aXZlRWxlbWVudHMoKSB7CiAgICAgIGNvbnN0IG5ld0Ryb3BBcmVhID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuZHJvcHpvbmUiKTsKICAgICAgaWYgKG5ld0Ryb3BBcmVhICE9PSB0aGlzLmRyb3BBcmVhKSB7CiAgICAgICAgdGhpcy5kZXRhY2hEcm9wTGlzdGVuZXJzKCk7CiAgICAgICAgdGhpcy5kcm9wQXJlYSA9IG5ld0Ryb3BBcmVhOwogICAgICAgIHRoaXMuYXR0YWNoRHJvcExpc3RlbmVycygpOwogICAgICB9CiAgICB9CiAgICBmb3JtYXRGaWxlU2l6ZShieXRlcykgewogICAgICBjb25zdCB1bml0czIgPSBbIkJ5dGVzIiwgIktCIiwgIk1CIiwgIkdCIl07CiAgICAgIGlmIChieXRlcyA9PT0gMCkKICAgICAgICByZXR1cm4gIjAgQnl0ZXMiOwogICAgICBjb25zdCBleHBvbmVudCA9IE1hdGgubWluKE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coMTAyNCkpLCB1bml0czIubGVuZ3RoIC0gMSk7CiAgICAgIGNvbnN0IHNpemUgPSBieXRlcyAvIE1hdGgucG93KDEwMjQsIGV4cG9uZW50KTsKICAgICAgcmV0dXJuIGAke01hdGgucm91bmQoc2l6ZSAqIDEwMCkgLyAxMDB9ICR7dW5pdHMyW2V4cG9uZW50XX1gOwogICAgfQogICAgZ2V0RmlsZVR5cGUoZmlsZSkgewogICAgICBjb25zdCB0eXBlNSA9IGZpbGUudHlwZS50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAodHlwZTUuc3RhcnRzV2l0aCgiaW1hZ2UvIikpCiAgICAgICAgcmV0dXJuICJpbWFnZSI7CiAgICAgIGlmICh0eXBlNSA9PT0gImFwcGxpY2F0aW9uL3BkZiIpCiAgICAgICAgcmV0dXJuICJwZGYiOwogICAgICBpZiAodHlwZTUuaW5jbHVkZXMoIndvcmQiKSB8fCB0eXBlNS5pbmNsdWRlcygiZG9jdW1lbnQiKSkKICAgICAgICByZXR1cm4gImRvYyI7CiAgICAgIGlmICh0eXBlNS5pbmNsdWRlcygic2hlZXQiKSB8fCB0eXBlNS5pbmNsdWRlcygiZXhjZWwiKSkKICAgICAgICByZXR1cm4gInNwcmVhZHNoZWV0IjsKICAgICAgaWYgKHR5cGU1LmluY2x1ZGVzKCJwcmVzZW50YXRpb24iKSB8fCB0eXBlNS5pbmNsdWRlcygicG93ZXJwb2ludCIpKQogICAgICAgIHJldHVybiAicHJlc2VudGF0aW9uIjsKICAgICAgaWYgKHR5cGU1LnN0YXJ0c1dpdGgoInZpZGVvLyIpKQogICAgICAgIHJldHVybiAidmlkZW8iOwogICAgICBpZiAodHlwZTUuc3RhcnRzV2l0aCgiYXVkaW8vIikpCiAgICAgICAgcmV0dXJuICJhdWRpbyI7CiAgICAgIGlmICh0eXBlNS5pbmNsdWRlcygiemlwIikgfHwgdHlwZTUuaW5jbHVkZXMoImNvbXByZXNzZWQiKSkKICAgICAgICByZXR1cm4gImFyY2hpdmUiOwogICAgICByZXR1cm4gImZpbGUiOwogICAgfQogICAgZ2V0RmlsZUljb24oZmlsZSkgewogICAgICBjb25zdCBmaWxlVHlwZSA9IHRoaXMuZ2V0RmlsZVR5cGUoZmlsZSk7CiAgICAgIGNvbnN0IGljb25NYXAgPSB7CiAgICAgICAgaW1hZ2U6ICJsdWNpZGU6RmlsZUltYWdlIiwKICAgICAgICBwZGY6ICJsdWNpZGU6RmlsZVRleHQiLAogICAgICAgIGRvYzogImx1Y2lkZTpGaWxlVGV4dCIsCiAgICAgICAgc3ByZWFkc2hlZXQ6ICJsdWNpZGU6RmlsZVNwcmVhZHNoZWV0IiwKICAgICAgICBwcmVzZW50YXRpb246ICJsdWNpZGU6RmlsZUJhckNoYXJ0IiwKICAgICAgICB2aWRlbzogImx1Y2lkZTpGaWxlVmlkZW8iLAogICAgICAgIGF1ZGlvOiAibHVjaWRlOkZpbGVBdWRpbyIsCiAgICAgICAgYXJjaGl2ZTogImx1Y2lkZTpGaWxlQXJjaGl2ZSIsCiAgICAgICAgZmlsZTogImx1Y2lkZTpGaWxlIgogICAgICB9OwogICAgICByZXR1cm4gaWNvbk1hcFtmaWxlVHlwZV0gPz8gImx1Y2lkZTpGaWxlIjsKICAgIH0KICAgIGNhblNob3dQcmV2aWV3KGZpbGUpIHsKICAgICAgcmV0dXJuIGZpbGUudHlwZS5zdGFydHNXaXRoKCJpbWFnZS8iKSAmJiBmaWxlLnNpemUgPCA1ICogMTAyNCAqIDEwMjQ7CiAgICB9CiAgICB2YWxpZGF0ZUZpbGUoZmlsZSkgewogICAgICBpZiAodGhpcy5tYXhTaXplID4gMCAmJiBmaWxlLnNpemUgPiB0aGlzLm1heFNpemUpIHsKICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID0gYEZpbGUgIiR7ZmlsZS5uYW1lfSIgZXhjZWVkcyB0aGUgbWF4aW11bSBzaXplIG9mICR7dGhpcy5mb3JtYXRGaWxlU2l6ZSh0aGlzLm1heFNpemUpfWA7CiAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RhdGUgPSAiaW52YWxpZCI7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmICh0aGlzLmFjY2VwdCkgewogICAgICAgIGNvbnN0IGFjY2VwdGVkVHlwZXMgPSB0aGlzLmFjY2VwdC5zcGxpdCgiLCIpLm1hcCgoZW50cnkpID0+IGVudHJ5LnRyaW0oKSkuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkubGVuZ3RoID4gMCk7CiAgICAgICAgaWYgKGFjY2VwdGVkVHlwZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgbGV0IGlzQWNjZXB0ZWQgPSBmYWxzZTsKICAgICAgICAgIGZvciAoY29uc3QgYWNjZXB0VHlwZSBvZiBhY2NlcHRlZFR5cGVzKSB7CiAgICAgICAgICAgIGlmIChhY2NlcHRUeXBlLnN0YXJ0c1dpdGgoIi4iKSkgewogICAgICAgICAgICAgIGlmIChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChhY2NlcHRUeXBlLnRvTG93ZXJDYXNlKCkpKSB7CiAgICAgICAgICAgICAgICBpc0FjY2VwdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChhY2NlcHRUeXBlLmVuZHNXaXRoKCIvKiIpKSB7CiAgICAgICAgICAgICAgY29uc3QgcHJlZml4NCA9IGFjY2VwdFR5cGUuc2xpY2UoMCwgLTIpOwogICAgICAgICAgICAgIGlmIChmaWxlLnR5cGUuc3RhcnRzV2l0aChwcmVmaXg0KSkgewogICAgICAgICAgICAgICAgaXNBY2NlcHRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZS50eXBlID09PSBhY2NlcHRUeXBlKSB7CiAgICAgICAgICAgICAgaXNBY2NlcHRlZCA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICghaXNBY2NlcHRlZCkgewogICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID0gYEZpbGUgdHlwZSBub3QgYWNjZXB0ZWQuIEFsbG93ZWQ6ICR7YWNjZXB0ZWRUeXBlcy5qb2luKCIsICIpfWA7CiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvblN0YXRlID0gImludmFsaWQiOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZ2V0UHJldmlld1VybChmaWxlKSB7CiAgICAgIGxldCB1cmwgPSB0aGlzLnByZXZpZXdVcmxNYXAuZ2V0KGZpbGUpOwogICAgICBpZiAoIXVybCkgewogICAgICAgIHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7CiAgICAgICAgdGhpcy5wcmV2aWV3VXJsTWFwLnNldChmaWxlLCB1cmwpOwogICAgICB9CiAgICAgIHJldHVybiB1cmw7CiAgICB9CiAgICByZWxlYXNlUHJldmlldyhmaWxlKSB7CiAgICAgIGNvbnN0IHVybCA9IHRoaXMucHJldmlld1VybE1hcC5nZXQoZmlsZSk7CiAgICAgIGlmICh1cmwpIHsKICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7CiAgICAgICAgdGhpcy5wcmV2aWV3VXJsTWFwLmRlbGV0ZShmaWxlKTsKICAgICAgfQogICAgfQogICAgZ2V0QWNjZXB0ZWRTdW1tYXJ5KCkgewogICAgICBpZiAoIXRoaXMuYWNjZXB0KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgZm9ybWF0dGVkID0gQXJyYXkuZnJvbShuZXcgU2V0KHRoaXMuYWNjZXB0LnNwbGl0KCIsIikubWFwKCh0b2tlbikgPT4gdG9rZW4udHJpbSgpKS5maWx0ZXIoKHRva2VuKSA9PiB0b2tlbi5sZW5ndGggPiAwKS5tYXAoKHRva2VuKSA9PiB0aGlzLmZvcm1hdEFjY2VwdFRva2VuKHRva2VuKSkpKS5maWx0ZXIoQm9vbGVhbik7CiAgICAgIGlmIChmb3JtYXR0ZWQubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKGZvcm1hdHRlZC5sZW5ndGggPT09IDEpIHsKICAgICAgICByZXR1cm4gZm9ybWF0dGVkWzBdOwogICAgICB9CiAgICAgIGlmIChmb3JtYXR0ZWQubGVuZ3RoID09PSAyKSB7CiAgICAgICAgcmV0dXJuIGAke2Zvcm1hdHRlZFswXX0sICR7Zm9ybWF0dGVkWzFdfWA7CiAgICAgIH0KICAgICAgcmV0dXJuIGAke2Zvcm1hdHRlZC5zbGljZSgwLCAyKS5qb2luKCIsICIpfVx1MjAyNmA7CiAgICB9CiAgICBmb3JtYXRBY2NlcHRUb2tlbih0b2tlbikgewogICAgICBpZiAodG9rZW4gPT09ICIqLyoiKSB7CiAgICAgICAgcmV0dXJuICJBbGwgZmlsZXMiOwogICAgICB9CiAgICAgIGlmICh0b2tlbi5lbmRzV2l0aCgiLyoiKSkgewogICAgICAgIGNvbnN0IGZhbWlseSA9IHRva2VuLnNwbGl0KCIvIilbMF07CiAgICAgICAgaWYgKCFmYW1pbHkpIHsKICAgICAgICAgIHJldHVybiAiQWxsIGZpbGVzIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGAke2ZhbWlseS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKX0ke2ZhbWlseS5zbGljZSgxKX0gZmlsZXNgOwogICAgICB9CiAgICAgIGlmICh0b2tlbi5zdGFydHNXaXRoKCIuIikpIHsKICAgICAgICByZXR1cm4gdG9rZW4uc2xpY2UoMSkudG9VcHBlckNhc2UoKTsKICAgICAgfQogICAgICBpZiAodG9rZW4uaW5jbHVkZXMoInBkZiIpKQogICAgICAgIHJldHVybiAiUERGIjsKICAgICAgaWYgKHRva2VuLmluY2x1ZGVzKCJ6aXAiKSkKICAgICAgICByZXR1cm4gIlpJUCI7CiAgICAgIGlmICh0b2tlbi5pbmNsdWRlcygianNvbiIpKQogICAgICAgIHJldHVybiAiSlNPTiI7CiAgICAgIGlmICh0b2tlbi5pbmNsdWRlcygibXN3b3JkIikpCiAgICAgICAgcmV0dXJuICJET0MiOwogICAgICBpZiAodG9rZW4uaW5jbHVkZXMoIndvcmRwcm9jZXNzaW5nbWwiKSkKICAgICAgICByZXR1cm4gIkRPQ1giOwogICAgICBpZiAodG9rZW4uaW5jbHVkZXMoImV4Y2VsIikpCiAgICAgICAgcmV0dXJuICJYTFMiOwogICAgICBpZiAodG9rZW4uaW5jbHVkZXMoInByZXNlbnRhdGlvbiIpKQogICAgICAgIHJldHVybiAiUFBUIjsKICAgICAgY29uc3Qgc2VnbWVudHMgPSB0b2tlbi5zcGxpdCgiLyIpOwogICAgICBjb25zdCBsYXN0U2VnbWVudCA9IHNlZ21lbnRzLnBvcCgpID8/IHRva2VuOwogICAgICByZXR1cm4gbGFzdFNlZ21lbnQudG9VcHBlckNhc2UoKTsKICAgIH0KICAgIGF0dGFjaExpZmVjeWNsZUxpc3RlbmVycygpIHsKICAgICAgdGhpcy5yZWJpbmRJbnRlcmFjdGl2ZUVsZW1lbnRzKCk7CiAgICB9CiAgICBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgdGhpcy5hdHRhY2hMaWZlY3ljbGVMaXN0ZW5lcnMoKTsKICAgIH0KICAgIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoInZhbHVlIikpIHsKICAgICAgICB2b2lkIHRoaXMudmFsaWRhdGUoKTsKICAgICAgfQogICAgICB0aGlzLnJlYmluZEludGVyYWN0aXZlRWxlbWVudHMoKTsKICAgIH0KICAgIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICB0aGlzLmRldGFjaERyb3BMaXN0ZW5lcnMoKTsKICAgICAgdGhpcy52YWx1ZS5mb3JFYWNoKChmaWxlKSA9PiB0aGlzLnJlbGVhc2VQcmV2aWV3KGZpbGUpKTsKICAgICAgdGhpcy5wcmV2aWV3VXJsTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICB9CiAgICBhc3luYyBvcGVuRmlsZVNlbGVjdG9yKCkgewogICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLmlzTG9hZGluZykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7CiAgICAgIGNvbnN0IGlucHV0RmlsZSA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmZpbGUtaW5wdXQiKTsKICAgICAgaWYgKCFpbnB1dEZpbGUpIHsKICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBoYW5kbGVGb2N1cyA9ICgpID0+IHsKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgIGlmICghaW5wdXRGaWxlLmZpbGVzIHx8IGlucHV0RmlsZS5maWxlcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsIGhhbmRsZUZvY3VzKTsKICAgICAgICB9LCAzMDApOwogICAgICB9OwogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLCBoYW5kbGVGb2N1cyk7CiAgICAgIGlucHV0RmlsZS5jbGljaygpOwogICAgfQogICAgcmVtb3ZlRmlsZShmaWxlKSB7CiAgICAgIGNvbnN0IGluZGV4MiA9IHRoaXMudmFsdWUuaW5kZXhPZihmaWxlKTsKICAgICAgaWYgKGluZGV4MiA+IC0xKSB7CiAgICAgICAgdGhpcy5yZWxlYXNlUHJldmlldyhmaWxlKTsKICAgICAgICB0aGlzLnZhbHVlLnNwbGljZShpbmRleDIsIDEpOwogICAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgidmFsdWUiKTsKICAgICAgICB2b2lkIHRoaXMudmFsaWRhdGUoKTsKICAgICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgICAgfQogICAgfQogICAgY2xlYXJBbGwoKSB7CiAgICAgIGNvbnN0IGV4aXN0aW5nRmlsZXMgPSBbLi4udGhpcy52YWx1ZV07CiAgICAgIHRoaXMudmFsdWUgPSBbXTsKICAgICAgZXhpc3RpbmdGaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB0aGlzLnJlbGVhc2VQcmV2aWV3KGZpbGUpKTsKICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCJ2YWx1ZSIpOwogICAgICB2b2lkIHRoaXMudmFsaWRhdGUoKTsKICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgIHRoaXMuYnV0dG9uVGV4dCA9ICJTZWxlY3QgZmlsZXMiOwogICAgfQogICAgYXN5bmMgdXBkYXRlVmFsdWUoZXZlbnRBcmcpIHsKICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnRBcmcudGFyZ2V0OwogICAgICB0aGlzLnZhbHVlID0gQXJyYXkuZnJvbSh0YXJnZXQuZmlsZXMgPz8gW10pOwogICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgIH0KICAgIHNldFZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLnZhbHVlLmZvckVhY2goKGZpbGUpID0+IHRoaXMucmVsZWFzZVByZXZpZXcoZmlsZSkpOwogICAgICB0aGlzLnZhbHVlID0gdmFsdWUyOwogICAgICBpZiAodmFsdWUyLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLmJ1dHRvblRleHQgPSB0aGlzLm11bHRpcGxlID8gIkFkZCBtb3JlIGZpbGVzIiA6ICJSZXBsYWNlIGZpbGUiOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuYnV0dG9uVGV4dCA9ICJTZWxlY3QgZmlsZXMiOwogICAgICB9CiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgidmFsdWUiKTsKICAgICAgdm9pZCB0aGlzLnZhbGlkYXRlKCk7CiAgICB9CiAgICBnZXRWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMudmFsdWU7CiAgICB9CiAgICBhc3luYyBhZGRGaWxlcyhmaWxlcykgewogICAgICBjb25zdCBmaWxlc1RvQWRkID0gW107CiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgewogICAgICAgIGlmICh0aGlzLnZhbGlkYXRlRmlsZShmaWxlKSkgewogICAgICAgICAgZmlsZXNUb0FkZC5wdXNoKGZpbGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZmlsZXNUb0FkZC5sZW5ndGggPT09IDApIHsKICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAodGhpcy5tYXhGaWxlcyA+IDApIHsKICAgICAgICBjb25zdCB0b3RhbEZpbGVzID0gdGhpcy52YWx1ZS5sZW5ndGggKyBmaWxlc1RvQWRkLmxlbmd0aDsKICAgICAgICBpZiAodG90YWxGaWxlcyA+IHRoaXMubWF4RmlsZXMpIHsKICAgICAgICAgIGNvbnN0IGFsbG93ZWRDb3VudCA9IHRoaXMubWF4RmlsZXMgLSB0aGlzLnZhbHVlLmxlbmd0aDsKICAgICAgICAgIGlmIChhbGxvd2VkQ291bnQgPD0gMCkgewogICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID0gYE1heGltdW0gJHt0aGlzLm1heEZpbGVzfSBmaWxlcyBhbGxvd2VkYDsKICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RhdGUgPSAiaW52YWxpZCI7CiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGZpbGVzVG9BZGQuc3BsaWNlKGFsbG93ZWRDb3VudCk7CiAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID0gYE9ubHkgJHthbGxvd2VkQ291bnR9IG1vcmUgZmlsZShzKSBjYW4gYmUgYWRkZWRgOwogICAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RhdGUgPSAid2FybiI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdGhpcy5tdWx0aXBsZSAmJiBmaWxlc1RvQWRkLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLnZhbHVlLmZvckVhY2goKGZpbGUpID0+IHRoaXMucmVsZWFzZVByZXZpZXcoZmlsZSkpOwogICAgICAgIHRoaXMudmFsdWUgPSBbZmlsZXNUb0FkZFswXV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy52YWx1ZS5wdXNoKC4uLmZpbGVzVG9BZGQpOwogICAgICB9CiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2UgPSAiIjsKICAgICAgdGhpcy52YWxpZGF0aW9uU3RhdGUgPSBudWxsOwogICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoInZhbHVlIik7CiAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGUoKTsKICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7CiAgICAgIGlmICh0aGlzLnZhbHVlLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLmJ1dHRvblRleHQgPSB0aGlzLm11bHRpcGxlID8gIkFkZCBtb3JlIGZpbGVzIiA6ICJSZXBsYWNlIGZpbGUiOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuYnV0dG9uVGV4dCA9ICJTZWxlY3QgZmlsZXMiOwogICAgICB9CiAgICB9CiAgICBhc3luYyB2YWxpZGF0ZSgpIHsKICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9ICIiOwogICAgICBpZiAodGhpcy5yZXF1aXJlZCAmJiB0aGlzLnZhbHVlLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHRoaXMudmFsaWRhdGlvblN0YXRlID0gImludmFsaWQiOwogICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2UgPSAiUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCBvbmUgZmlsZSI7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiB0aGlzLnZhbHVlKSB7CiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlRmlsZShmaWxlKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLnZhbGlkYXRpb25TdGF0ZSA9IHRoaXMudmFsdWUubGVuZ3RoID4gMCA/ICJ2YWxpZCIgOiBudWxsOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMjcoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNJbnB1dEZpbGV1cGxvYWQyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9pYmFudG9vbHNANC41LjEvbm9kZV9tb2R1bGVzL2liYW50b29scy9qc25leHQvaWJhbnRvb2xzLmpzCmZ1bmN0aW9uIGlzVmFsaWRJQkFOKGliYW4sIHZhbGlkYXRpb25PcHRpb25zKSB7CiAgaWYgKHZhbGlkYXRpb25PcHRpb25zID09PSB2b2lkIDApIHsKICAgIHZhbGlkYXRpb25PcHRpb25zID0geyBhbGxvd1FSSUJBTjogdHJ1ZSB9OwogIH0KICBpZiAoaWJhbiA9PT0gdm9pZCAwIHx8IGliYW4gPT09IG51bGwpCiAgICByZXR1cm4gZmFsc2U7CiAgdmFyIHJlZyA9IG5ldyBSZWdFeHAoIl5bMC05XXsyfSQiLCAiIik7CiAgdmFyIGNvdW50cnlDb2RlID0gaWJhbi5zbGljZSgwLCAyKTsKICB2YXIgc3BlYyA9IGNvdW50cnlTcGVjc1tjb3VudHJ5Q29kZV07CiAgaWYgKHNwZWMgPT09IHZvaWQgMCB8fCBzcGVjLmJiYW5fcmVnZXhwID09PSB2b2lkIDAgfHwgc3BlYy5iYmFuX3JlZ2V4cCA9PT0gbnVsbCB8fCBzcGVjLmNoYXJzID09PSB2b2lkIDApCiAgICByZXR1cm4gZmFsc2U7CiAgcmV0dXJuIHNwZWMuY2hhcnMgPT09IGliYW4ubGVuZ3RoICYmIHJlZy50ZXN0KGliYW4uc2xpY2UoMiwgNCkpICYmIGlzVmFsaWRCQkFOKGliYW4uc2xpY2UoNCksIGNvdW50cnlDb2RlKSAmJiBpc1ZhbGlkSUJBTkNoZWNrc3VtKGliYW4pICYmICh2YWxpZGF0aW9uT3B0aW9ucy5hbGxvd1FSSUJBTiB8fCAhaXNRUklCQU4oaWJhbikpOwp9CnZhciBWYWxpZGF0aW9uRXJyb3JzSUJBTjsKKGZ1bmN0aW9uKFZhbGlkYXRpb25FcnJvcnNJQkFOMikgewogIFZhbGlkYXRpb25FcnJvcnNJQkFOMltWYWxpZGF0aW9uRXJyb3JzSUJBTjJbIk5vSUJBTlByb3ZpZGVkIl0gPSAwXSA9ICJOb0lCQU5Qcm92aWRlZCI7CiAgVmFsaWRhdGlvbkVycm9yc0lCQU4yW1ZhbGlkYXRpb25FcnJvcnNJQkFOMlsiTm9JQkFOQ291bnRyeSJdID0gMV0gPSAiTm9JQkFOQ291bnRyeSI7CiAgVmFsaWRhdGlvbkVycm9yc0lCQU4yW1ZhbGlkYXRpb25FcnJvcnNJQkFOMlsiV3JvbmdCQkFOTGVuZ3RoIl0gPSAyXSA9ICJXcm9uZ0JCQU5MZW5ndGgiOwogIFZhbGlkYXRpb25FcnJvcnNJQkFOMltWYWxpZGF0aW9uRXJyb3JzSUJBTjJbIldyb25nQkJBTkZvcm1hdCJdID0gM10gPSAiV3JvbmdCQkFORm9ybWF0IjsKICBWYWxpZGF0aW9uRXJyb3JzSUJBTjJbVmFsaWRhdGlvbkVycm9yc0lCQU4yWyJDaGVja3N1bU5vdE51bWJlciJdID0gNF0gPSAiQ2hlY2tzdW1Ob3ROdW1iZXIiOwogIFZhbGlkYXRpb25FcnJvcnNJQkFOMltWYWxpZGF0aW9uRXJyb3JzSUJBTjJbIldyb25nSUJBTkNoZWNrc3VtIl0gPSA1XSA9ICJXcm9uZ0lCQU5DaGVja3N1bSI7CiAgVmFsaWRhdGlvbkVycm9yc0lCQU4yW1ZhbGlkYXRpb25FcnJvcnNJQkFOMlsiV3JvbmdBY2NvdW50QmFua0JyYW5jaENoZWNrc3VtIl0gPSA2XSA9ICJXcm9uZ0FjY291bnRCYW5rQnJhbmNoQ2hlY2tzdW0iOwogIFZhbGlkYXRpb25FcnJvcnNJQkFOMltWYWxpZGF0aW9uRXJyb3JzSUJBTjJbIlFSSUJBTk5vdEFsbG93ZWQiXSA9IDddID0gIlFSSUJBTk5vdEFsbG93ZWQiOwp9KShWYWxpZGF0aW9uRXJyb3JzSUJBTiB8fCAoVmFsaWRhdGlvbkVycm9yc0lCQU4gPSB7fSkpOwpmdW5jdGlvbiB2YWxpZGF0ZUlCQU4oaWJhbiwgdmFsaWRhdGlvbk9wdGlvbnMpIHsKICBpZiAodmFsaWRhdGlvbk9wdGlvbnMgPT09IHZvaWQgMCkgewogICAgdmFsaWRhdGlvbk9wdGlvbnMgPSB7IGFsbG93UVJJQkFOOiB0cnVlIH07CiAgfQogIHZhciByZXN1bHQgPSB7IGVycm9yQ29kZXM6IFtdLCB2YWxpZDogdHJ1ZSB9OwogIGlmIChpYmFuICE9PSB2b2lkIDAgJiYgaWJhbiAhPT0gbnVsbCAmJiBpYmFuICE9PSAiIikgewogICAgdmFyIHNwZWMgPSBjb3VudHJ5U3BlY3NbaWJhbi5zbGljZSgwLCAyKV07CiAgICBpZiAoIXNwZWMgfHwgIShzcGVjLmJiYW5fcmVnZXhwIHx8IHNwZWMuY2hhcnMpKSB7CiAgICAgIHJlc3VsdC52YWxpZCA9IGZhbHNlOwogICAgICByZXN1bHQuZXJyb3JDb2Rlcy5wdXNoKFZhbGlkYXRpb25FcnJvcnNJQkFOLk5vSUJBTkNvdW50cnkpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgaWYgKHNwZWMgJiYgc3BlYy5jaGFycyAmJiBzcGVjLmNoYXJzICE9PSBpYmFuLmxlbmd0aCkgewogICAgICByZXN1bHQudmFsaWQgPSBmYWxzZTsKICAgICAgcmVzdWx0LmVycm9yQ29kZXMucHVzaChWYWxpZGF0aW9uRXJyb3JzSUJBTi5Xcm9uZ0JCQU5MZW5ndGgpOwogICAgfQogICAgaWYgKHNwZWMgJiYgc3BlYy5iYmFuX3JlZ2V4cCAmJiAhY2hlY2tGb3JtYXRCQkFOKGliYW4uc2xpY2UoNCksIHNwZWMuYmJhbl9yZWdleHApKSB7CiAgICAgIHJlc3VsdC52YWxpZCA9IGZhbHNlOwogICAgICByZXN1bHQuZXJyb3JDb2Rlcy5wdXNoKFZhbGlkYXRpb25FcnJvcnNJQkFOLldyb25nQkJBTkZvcm1hdCk7CiAgICB9CiAgICBpZiAoc3BlYyAmJiBzcGVjLmJiYW5fdmFsaWRhdGlvbl9mdW5jICYmICFzcGVjLmJiYW5fdmFsaWRhdGlvbl9mdW5jKGliYW4uc2xpY2UoNCkpKSB7CiAgICAgIHJlc3VsdC52YWxpZCA9IGZhbHNlOwogICAgICByZXN1bHQuZXJyb3JDb2Rlcy5wdXNoKFZhbGlkYXRpb25FcnJvcnNJQkFOLldyb25nQWNjb3VudEJhbmtCcmFuY2hDaGVja3N1bSk7CiAgICB9CiAgICB2YXIgcmVnID0gbmV3IFJlZ0V4cCgiXlswLTldezJ9JCIsICIiKTsKICAgIGlmICghcmVnLnRlc3QoaWJhbi5zbGljZSgyLCA0KSkpIHsKICAgICAgcmVzdWx0LnZhbGlkID0gZmFsc2U7CiAgICAgIHJlc3VsdC5lcnJvckNvZGVzLnB1c2goVmFsaWRhdGlvbkVycm9yc0lCQU4uQ2hlY2tzdW1Ob3ROdW1iZXIpOwogICAgfQogICAgaWYgKHJlc3VsdC5lcnJvckNvZGVzLmluZGV4T2YoVmFsaWRhdGlvbkVycm9yc0lCQU4uV3JvbmdCQkFORm9ybWF0KSAhPT0gLTEgfHwgIWlzVmFsaWRJQkFOQ2hlY2tzdW0oaWJhbikpIHsKICAgICAgcmVzdWx0LnZhbGlkID0gZmFsc2U7CiAgICAgIHJlc3VsdC5lcnJvckNvZGVzLnB1c2goVmFsaWRhdGlvbkVycm9yc0lCQU4uV3JvbmdJQkFOQ2hlY2tzdW0pOwogICAgfQogICAgaWYgKCF2YWxpZGF0aW9uT3B0aW9ucy5hbGxvd1FSSUJBTiAmJiBpc1FSSUJBTihpYmFuKSkgewogICAgICByZXN1bHQudmFsaWQgPSBmYWxzZTsKICAgICAgcmVzdWx0LmVycm9yQ29kZXMucHVzaChWYWxpZGF0aW9uRXJyb3JzSUJBTi5RUklCQU5Ob3RBbGxvd2VkKTsKICAgIH0KICB9IGVsc2UgewogICAgcmVzdWx0LnZhbGlkID0gZmFsc2U7CiAgICByZXN1bHQuZXJyb3JDb2Rlcy5wdXNoKFZhbGlkYXRpb25FcnJvcnNJQkFOLk5vSUJBTlByb3ZpZGVkKTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpmdW5jdGlvbiBpc1ZhbGlkQkJBTihiYmFuLCBjb3VudHJ5Q29kZSkgewogIGlmIChiYmFuID09PSB2b2lkIDAgfHwgYmJhbiA9PT0gbnVsbCB8fCBjb3VudHJ5Q29kZSA9PT0gdm9pZCAwIHx8IGNvdW50cnlDb2RlID09PSBudWxsKQogICAgcmV0dXJuIGZhbHNlOwogIHZhciBzcGVjID0gY291bnRyeVNwZWNzW2NvdW50cnlDb2RlXTsKICBpZiAoc3BlYyA9PT0gdm9pZCAwIHx8IHNwZWMgPT09IG51bGwgfHwgc3BlYy5iYmFuX3JlZ2V4cCA9PT0gdm9pZCAwIHx8IHNwZWMuYmJhbl9yZWdleHAgPT09IG51bGwgfHwgc3BlYy5jaGFycyA9PT0gdm9pZCAwIHx8IHNwZWMuY2hhcnMgPT09IG51bGwpCiAgICByZXR1cm4gZmFsc2U7CiAgaWYgKHNwZWMuY2hhcnMgLSA0ID09PSBiYmFuLmxlbmd0aCAmJiBjaGVja0Zvcm1hdEJCQU4oYmJhbiwgc3BlYy5iYmFuX3JlZ2V4cCkpIHsKICAgIGlmIChzcGVjLmJiYW5fdmFsaWRhdGlvbl9mdW5jKSB7CiAgICAgIHJldHVybiBzcGVjLmJiYW5fdmFsaWRhdGlvbl9mdW5jKGJiYW4ucmVwbGFjZSgvW1xzLl0rL2csICIiKSk7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGlzU0VQQUNvdW50cnkoY291bnRyeUNvZGUpIHsKICBpZiAoY291bnRyeUNvZGUgIT09IHZvaWQgMCAmJiBjb3VudHJ5Q29kZSAhPT0gbnVsbCkgewogICAgdmFyIHNwZWMgPSBjb3VudHJ5U3BlY3NbY291bnRyeUNvZGVdOwogICAgaWYgKHNwZWMgIT09IHZvaWQgMCkgewogICAgICByZXR1cm4gc3BlYy5TRVBBID8gc3BlYy5TRVBBIDogZmFsc2U7CiAgICB9CiAgfQogIHJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBpc1FSSUJBTihpYmFuKSB7CiAgaWYgKGliYW4gPT09IHZvaWQgMCB8fCBpYmFuID09PSBudWxsKQogICAgcmV0dXJuIGZhbHNlOwogIHZhciBjb3VudHJ5Q29kZSA9IGliYW4uc2xpY2UoMCwgMik7CiAgdmFyIFFSSUJBTkNvdW50cmllcyA9IFsiTEkiLCAiQ0giXTsKICBpZiAoIVFSSUJBTkNvdW50cmllcy5pbmNsdWRlcyhjb3VudHJ5Q29kZSkpCiAgICByZXR1cm4gZmFsc2U7CiAgdmFyIHJlZyA9IG5ldyBSZWdFeHAoIl4zWzAtMV17MX1bMC05XXszfSQiLCAiIik7CiAgcmV0dXJuIHJlZy50ZXN0KGliYW4uc2xpY2UoNCwgOSkpOwp9CmZ1bmN0aW9uIGNvbXBvc2VJQkFOKHBhcmFtczIpIHsKICB2YXIgZm9ybWF0ZWRfYmJhbiA9IGVsZWN0cm9uaWNGb3JtYXRJQkFOKHBhcmFtczIuYmJhbikgfHwgIiI7CiAgaWYgKHBhcmFtczIuY291bnRyeUNvZGUgPT09IG51bGwgfHwgcGFyYW1zMi5jb3VudHJ5Q29kZSA9PT0gdm9pZCAwKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgdmFyIHNwZWMgPSBjb3VudHJ5U3BlY3NbcGFyYW1zMi5jb3VudHJ5Q29kZV07CiAgaWYgKGZvcm1hdGVkX2JiYW4gIT09ICIiICYmIHNwZWMgIT09IHZvaWQgMCAmJiBzcGVjLmNoYXJzICYmIHNwZWMuY2hhcnMgIT09IG51bGwgJiYgc3BlYy5jaGFycyA9PT0gZm9ybWF0ZWRfYmJhbi5sZW5ndGggKyA0ICYmIHNwZWMuYmJhbl9yZWdleHAgJiYgc3BlYy5iYmFuX3JlZ2V4cCAhPT0gbnVsbCAmJiBjaGVja0Zvcm1hdEJCQU4oZm9ybWF0ZWRfYmJhbiwgc3BlYy5iYmFuX3JlZ2V4cCkpIHsKICAgIHZhciBjaGVja3NvbSA9IG1vZDk3MTBJYmFuKHBhcmFtczIuY291bnRyeUNvZGUgKyAiMDAiICsgZm9ybWF0ZWRfYmJhbik7CiAgICByZXR1cm4gcGFyYW1zMi5jb3VudHJ5Q29kZSArICgiMCIgKyAoOTggLSBjaGVja3NvbSkpLnNsaWNlKC0yKSArIGZvcm1hdGVkX2JiYW47CiAgfQogIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIGV4dHJhY3RJQkFOKGliYW4pIHsKICB2YXIgcmVzdWx0ID0ge307CiAgdmFyIGVGb3JtYXRJQkFOID0gZWxlY3Ryb25pY0Zvcm1hdElCQU4oaWJhbik7CiAgcmVzdWx0LmliYW4gPSBlRm9ybWF0SUJBTiB8fCBpYmFuOwogIGlmICghIWVGb3JtYXRJQkFOICYmIGlzVmFsaWRJQkFOKGVGb3JtYXRJQkFOKSkgewogICAgcmVzdWx0LmJiYW4gPSBlRm9ybWF0SUJBTi5zbGljZSg0KTsKICAgIHJlc3VsdC5jb3VudHJ5Q29kZSA9IGVGb3JtYXRJQkFOLnNsaWNlKDAsIDIpOwogICAgcmVzdWx0LnZhbGlkID0gdHJ1ZTsKICAgIHZhciBzcGVjID0gY291bnRyeVNwZWNzW3Jlc3VsdC5jb3VudHJ5Q29kZV07CiAgICBpZiAoc3BlYy5hY2NvdW50X2luZGVudGlmaWVyKSB7CiAgICAgIHZhciBhYyA9IHNwZWMuYWNjb3VudF9pbmRlbnRpZmllci5zcGxpdCgiLSIpOwogICAgICB2YXIgc3RhcnRpbmcgPSBwYXJzZUludChhY1swXSk7CiAgICAgIHZhciBlbmRpbmcgPSBwYXJzZUludChhY1sxXSk7CiAgICAgIHJlc3VsdC5hY2NvdW50TnVtYmVyID0gcmVzdWx0LmliYW4uc2xpY2Uoc3RhcnRpbmcsIGVuZGluZyArIDEpOwogICAgfQogICAgaWYgKHNwZWMuYmFua19pZGVudGlmaWVyKSB7CiAgICAgIHZhciBhYyA9IHNwZWMuYmFua19pZGVudGlmaWVyLnNwbGl0KCItIik7CiAgICAgIHZhciBzdGFydGluZyA9IHBhcnNlSW50KGFjWzBdKTsKICAgICAgdmFyIGVuZGluZyA9IHBhcnNlSW50KGFjWzFdKTsKICAgICAgcmVzdWx0LmJhbmtJZGVudGlmaWVyID0gcmVzdWx0LmJiYW4uc2xpY2Uoc3RhcnRpbmcsIGVuZGluZyArIDEpOwogICAgfQogICAgaWYgKHNwZWMuYnJhbmNoX2luZGVudGlmaWVyKSB7CiAgICAgIHZhciBhYyA9IHNwZWMuYnJhbmNoX2luZGVudGlmaWVyLnNwbGl0KCItIik7CiAgICAgIHZhciBzdGFydGluZyA9IHBhcnNlSW50KGFjWzBdKTsKICAgICAgdmFyIGVuZGluZyA9IHBhcnNlSW50KGFjWzFdKTsKICAgICAgcmVzdWx0LmJyYW5jaElkZW50aWZpZXIgPSByZXN1bHQuYmJhbi5zbGljZShzdGFydGluZywgZW5kaW5nICsgMSk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHJlc3VsdC52YWxpZCA9IGZhbHNlOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CmZ1bmN0aW9uIGNoZWNrRm9ybWF0QkJBTihiYmFuLCBiZm9ybWF0KSB7CiAgdmFyIHJlZyA9IG5ldyBSZWdFeHAoYmZvcm1hdCwgIiIpOwogIHJldHVybiByZWcudGVzdChiYmFuKTsKfQpmdW5jdGlvbiBlbGVjdHJvbmljRm9ybWF0SUJBTihpYmFuKSB7CiAgaWYgKHR5cGVvZiBpYmFuICE9PSAic3RyaW5nIikgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiBpYmFuLnJlcGxhY2UoL1stXCBdL2csICIiKS50b1VwcGVyQ2FzZSgpOwp9CmZ1bmN0aW9uIGZyaWVuZGx5Rm9ybWF0SUJBTihpYmFuLCBzZXBhcmF0b3IpIHsKICBpZiAodHlwZW9mIGliYW4gIT09ICJzdHJpbmciKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgaWYgKHNlcGFyYXRvciA9PT0gdm9pZCAwIHx8IHNlcGFyYXRvciA9PT0gbnVsbCkgewogICAgc2VwYXJhdG9yID0gIiAiOwogIH0KICB2YXIgZWxlY3Ryb25pY19pYmFuID0gZWxlY3Ryb25pY0Zvcm1hdElCQU4oaWJhbik7CiAgaWYgKGVsZWN0cm9uaWNfaWJhbiA9PT0gbnVsbCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiBlbGVjdHJvbmljX2liYW4ucmVwbGFjZSgvKC57NH0pKD8hJCkvZywgIiQxIiArIHNlcGFyYXRvcik7Cn0KZnVuY3Rpb24gaXNWYWxpZElCQU5DaGVja3N1bShpYmFuKSB7CiAgdmFyIGNvdW50cnlDb2RlID0gaWJhbi5zbGljZSgwLCAyKTsKICB2YXIgcHJvdmlkZWRDaGVja3N1bSA9IHBhcnNlSW50KGliYW4uc2xpY2UoMiwgNCksIDEwKTsKICB2YXIgYmJhbiA9IGliYW4uc2xpY2UoNCk7CiAgdmFyIHZhbGlkYXRpb25TdHJpbmcgPSByZXBsYWNlQ2hhcmF0ZXJXaXRoQ29kZSgiIi5jb25jYXQoYmJhbikuY29uY2F0KGNvdW50cnlDb2RlLCAiMDAiKSk7CiAgdmFyIHJlc3QgPSBtb2Q5NzEwKHZhbGlkYXRpb25TdHJpbmcpOwogIHJldHVybiA5OCAtIHJlc3QgPT09IHByb3ZpZGVkQ2hlY2tzdW07Cn0KZnVuY3Rpb24gcmVwbGFjZUNoYXJhdGVyV2l0aENvZGUoc3RyKSB7CiAgcmV0dXJuIHN0ci5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKGMxMSkgewogICAgdmFyIGNvZGU0ID0gYzExLmNoYXJDb2RlQXQoMCk7CiAgICByZXR1cm4gY29kZTQgPj0gNjUgPyAoY29kZTQgLSA1NSkudG9TdHJpbmcoKSA6IGMxMTsKICB9KS5qb2luKCIiKTsKfQpmdW5jdGlvbiBtb2Q5NzEwSWJhbihpYmFuKSB7CiAgcmV0dXJuIG1vZDk3MTAocmVwbGFjZUNoYXJhdGVyV2l0aENvZGUoaWJhbi5zbGljZSg0KSArIGliYW4uc2xpY2UoMCwgNCkpKTsKfQpmdW5jdGlvbiBnZXRDb3VudHJ5U3BlY2lmaWNhdGlvbnMoKSB7CiAgdmFyIGNvdW50eU1hcCA9IHt9OwogIGZvciAodmFyIGNvdW50eUNvZGUgaW4gY291bnRyeVNwZWNzKSB7CiAgICB2YXIgY291bnR5ID0gY291bnRyeVNwZWNzW2NvdW50eUNvZGVdOwogICAgY291bnR5TWFwW2NvdW50eUNvZGVdID0gewogICAgICBjaGFyczogY291bnR5LmNoYXJzIHx8IG51bGwsCiAgICAgIGJiYW5fcmVnZXhwOiBjb3VudHkuYmJhbl9yZWdleHAgfHwgbnVsbCwKICAgICAgSUJBTlJlZ2lzdHJ5OiBjb3VudHkuSUJBTlJlZ2lzdHJ5IHx8IGZhbHNlLAogICAgICBTRVBBOiBjb3VudHkuU0VQQSB8fCBmYWxzZQogICAgfTsKICB9CiAgcmV0dXJuIGNvdW50eU1hcDsKfQpmdW5jdGlvbiBpc1ZhbGlkQklDKGJpYykgewogIGlmICghYmljKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHZhciByZWcgPSBuZXcgUmVnRXhwKCJeW2EtekEtWl17Nn1bYS16QS1aMC05XXsyfShbYS16QS1aMC05XXszfSk/JCIsICIiKTsKICB2YXIgc3BlYyA9IGNvdW50cnlTcGVjc1tiaWMudG9VcHBlckNhc2UoKS5zbGljZSg0LCA2KV07CiAgcmV0dXJuIHJlZy50ZXN0KGJpYykgJiYgc3BlYyAhPT0gdm9pZCAwOwp9CnZhciBWYWxpZGF0aW9uRXJyb3JzQklDOwooZnVuY3Rpb24oVmFsaWRhdGlvbkVycm9yc0JJQzIpIHsKICBWYWxpZGF0aW9uRXJyb3JzQklDMltWYWxpZGF0aW9uRXJyb3JzQklDMlsiTm9CSUNQcm92aWRlZCJdID0gMF0gPSAiTm9CSUNQcm92aWRlZCI7CiAgVmFsaWRhdGlvbkVycm9yc0JJQzJbVmFsaWRhdGlvbkVycm9yc0JJQzJbIk5vQklDQ291bnRyeSJdID0gMV0gPSAiTm9CSUNDb3VudHJ5IjsKICBWYWxpZGF0aW9uRXJyb3JzQklDMltWYWxpZGF0aW9uRXJyb3JzQklDMlsiV3JvbmdCSUNGb3JtYXQiXSA9IDJdID0gIldyb25nQklDRm9ybWF0IjsKfSkoVmFsaWRhdGlvbkVycm9yc0JJQyB8fCAoVmFsaWRhdGlvbkVycm9yc0JJQyA9IHt9KSk7CmZ1bmN0aW9uIHZhbGlkYXRlQklDKGJpYykgewogIHZhciByZXN1bHQgPSB7IGVycm9yQ29kZXM6IFtdLCB2YWxpZDogdHJ1ZSB9OwogIGlmIChiaWMgIT09IHZvaWQgMCAmJiBiaWMgIT09IG51bGwgJiYgYmljICE9PSAiIikgewogICAgdmFyIHNwZWMgPSBjb3VudHJ5U3BlY3NbYmljLnRvVXBwZXJDYXNlKCkuc2xpY2UoNCwgNildOwogICAgaWYgKHNwZWMgPT09IHZvaWQgMCkgewogICAgICByZXN1bHQudmFsaWQgPSBmYWxzZTsKICAgICAgcmVzdWx0LmVycm9yQ29kZXMucHVzaChWYWxpZGF0aW9uRXJyb3JzQklDLk5vQklDQ291bnRyeSk7CiAgICB9IGVsc2UgewogICAgICB2YXIgcmVnID0gbmV3IFJlZ0V4cCgiXlthLXpBLVpdezZ9W2EtekEtWjAtOV17Mn0oW2EtekEtWjAtOV17M30pPyQiLCAiIik7CiAgICAgIGlmICghcmVnLnRlc3QoYmljKSkgewogICAgICAgIHJlc3VsdC52YWxpZCA9IGZhbHNlOwogICAgICAgIHJlc3VsdC5lcnJvckNvZGVzLnB1c2goVmFsaWRhdGlvbkVycm9yc0JJQy5Xcm9uZ0JJQ0Zvcm1hdCk7CiAgICAgIH0KICAgIH0KICB9IGVsc2UgewogICAgcmVzdWx0LnZhbGlkID0gZmFsc2U7CiAgICByZXN1bHQuZXJyb3JDb2Rlcy5wdXNoKFZhbGlkYXRpb25FcnJvcnNCSUMuTm9CSUNQcm92aWRlZCk7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gZXh0cmFjdEJJQyhpbnB1dEJpYykgewogIHZhciByZXN1bHQgPSB7fTsKICB2YXIgYmljID0gaW5wdXRCaWMudG9VcHBlckNhc2UoKTsKICBpZiAoaXNWYWxpZEJJQyhiaWMpKSB7CiAgICByZXN1bHQuYmFua0NvZGUgPSBiaWMuc2xpY2UoMCwgNCk7CiAgICByZXN1bHQuY291bnRyeUNvZGUgPSBiaWMuc2xpY2UoNCwgNik7CiAgICByZXN1bHQubG9jYXRpb25Db2RlID0gYmljLnNsaWNlKDYsIDgpOwogICAgcmVzdWx0LnRlc3RCSUMgPSByZXN1bHQubG9jYXRpb25Db2RlWzFdID09PSAiMCIgPyB0cnVlIDogZmFsc2U7CiAgICByZXN1bHQuYnJhbmNoQ29kZSA9IGJpYy5sZW5ndGggPiA4ID8gYmljLnNsaWNlKDgpIDogbnVsbDsKICAgIHJlc3VsdC52YWxpZCA9IHRydWU7CiAgfSBlbHNlIHsKICAgIHJlc3VsdC52YWxpZCA9IGZhbHNlOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CnZhciBjaGVja05vcndheUJCQU4gPSBmdW5jdGlvbihiYmFuKSB7CiAgdmFyIHdlaWdodHMgPSBbNSwgNCwgMywgMiwgNywgNiwgNSwgNCwgMywgMl07CiAgdmFyIGJiYW5XaXRob3V0U3BhY2VzQW5kUGVyaW9kcyA9IGJiYW4ucmVwbGFjZSgvW1xzLl0rL2csICIiKTsKICB2YXIgY29udHJvbERpZ2l0ID0gcGFyc2VJbnQoYmJhbldpdGhvdXRTcGFjZXNBbmRQZXJpb2RzLmNoYXJBdCgxMCksIDEwKTsKICB2YXIgYmJhbldpdGhvdXRDb250cm9sRGlnaXQgPSBiYmFuV2l0aG91dFNwYWNlc0FuZFBlcmlvZHMuc3Vic3RyaW5nKDAsIDEwKTsKICB2YXIgc3VtID0gMDsKICBmb3IgKHZhciBpbmRleDIgPSAwOyBpbmRleDIgPCAxMDsgaW5kZXgyKyspIHsKICAgIHN1bSArPSBwYXJzZUludChiYmFuV2l0aG91dENvbnRyb2xEaWdpdC5jaGFyQXQoaW5kZXgyKSwgMTApICogd2VpZ2h0c1tpbmRleDJdOwogIH0KICB2YXIgcmVtYWluZGVyID0gc3VtICUgMTE7CiAgcmV0dXJuIGNvbnRyb2xEaWdpdCA9PT0gKHJlbWFpbmRlciA9PT0gMCA/IDAgOiAxMSAtIHJlbWFpbmRlcik7Cn07CnZhciBjaGVja0JlbGdpYW5CQkFOID0gZnVuY3Rpb24oYmJhbikgewogIHZhciBzdHJpcHBlZCA9IGJiYW4ucmVwbGFjZSgvW1xzLl0rL2csICIiKTsKICB2YXIgY2hlY2tpbmdQYXJ0ID0gcGFyc2VJbnQoc3RyaXBwZWQuc3Vic3RyaW5nKDAsIHN0cmlwcGVkLmxlbmd0aCAtIDIpLCAxMCk7CiAgdmFyIGNoZWNrc3VtID0gcGFyc2VJbnQoc3RyaXBwZWQuc3Vic3RyaW5nKHN0cmlwcGVkLmxlbmd0aCAtIDIsIHN0cmlwcGVkLmxlbmd0aCksIDEwKTsKICB2YXIgcmVtYWluZGVyID0gY2hlY2tpbmdQYXJ0ICUgOTcgPT09IDAgPyA5NyA6IGNoZWNraW5nUGFydCAlIDk3OwogIHJldHVybiByZW1haW5kZXIgPT09IGNoZWNrc3VtOwp9Owp2YXIgbW9kOTcxMCA9IGZ1bmN0aW9uKHZhbGlkYXRpb25TdHJpbmcpIHsKICB3aGlsZSAodmFsaWRhdGlvblN0cmluZy5sZW5ndGggPiAyKSB7CiAgICB2YXIgcGFydCA9IHZhbGlkYXRpb25TdHJpbmcuc2xpY2UoMCwgNik7CiAgICB2YXIgcGFydEludCA9IHBhcnNlSW50KHBhcnQsIDEwKTsKICAgIGlmIChpc05hTihwYXJ0SW50KSkgewogICAgICByZXR1cm4gTmFOOwogICAgfQogICAgdmFsaWRhdGlvblN0cmluZyA9IHBhcnRJbnQgJSA5NyArIHZhbGlkYXRpb25TdHJpbmcuc2xpY2UocGFydC5sZW5ndGgpOwogIH0KICByZXR1cm4gcGFyc2VJbnQodmFsaWRhdGlvblN0cmluZywgMTApICUgOTc7Cn07CnZhciBjaGVja01vZDk3MTBCQkFOID0gZnVuY3Rpb24oYmJhbikgewogIHZhciBzdHJpcHBlZCA9IGJiYW4ucmVwbGFjZSgvW1xzLl0rL2csICIiKTsKICB2YXIgcmVtaW5kZXIgPSBtb2Q5NzEwKHN0cmlwcGVkKTsKICByZXR1cm4gcmVtaW5kZXIgPT09IDE7Cn07CnZhciBjaGVja1BvbGFuZEJCQU4gPSBmdW5jdGlvbihiYmFuKSB7CiAgdmFyIHdlaWdodHMgPSBbMywgOSwgNywgMSwgMywgOSwgN107CiAgdmFyIGNvbnRyb2xEaWdpdCA9IHBhcnNlSW50KGJiYW4uY2hhckF0KDcpLCAxMCk7CiAgdmFyIHRvQ2hlY2sgPSBiYmFuLnN1YnN0cmluZygwLCA3KTsKICB2YXIgc3VtID0gMDsKICBmb3IgKHZhciBpbmRleDIgPSAwOyBpbmRleDIgPCA3OyBpbmRleDIrKykgewogICAgc3VtICs9IHBhcnNlSW50KHRvQ2hlY2suY2hhckF0KGluZGV4MiksIDEwKSAqIHdlaWdodHNbaW5kZXgyXTsKICB9CiAgdmFyIHJlbWFpbmRlciA9IHN1bSAlIDEwOwogIHJldHVybiBjb250cm9sRGlnaXQgPT09IChyZW1haW5kZXIgPT09IDAgPyAwIDogMTAgLSByZW1haW5kZXIpOwp9Owp2YXIgY2hlY2tTcGFpbkJCQU4gPSBmdW5jdGlvbihiYmFuKSB7CiAgdmFyIHdlaWdodHNCYW5rQnJhbmNoID0gWzQsIDgsIDUsIDEwLCA5LCA3LCAzLCA2XTsKICB2YXIgd2VpZ2h0c0FjY291bnQgPSBbMSwgMiwgNCwgOCwgNSwgMTAsIDksIDcsIDMsIDZdOwogIHZhciBjb250cm9sQmFua0JyYW5jaCA9IHBhcnNlSW50KGJiYW4uY2hhckF0KDgpLCAxMCk7CiAgdmFyIGNvbnRyb2xBY2NvdW50ID0gcGFyc2VJbnQoYmJhbi5jaGFyQXQoOSksIDEwKTsKICB2YXIgYmFua0JyYW5jaCA9IGJiYW4uc3Vic3RyaW5nKDAsIDgpOwogIHZhciBhY2NvdW50ID0gYmJhbi5zdWJzdHJpbmcoMTAsIDIwKTsKICB2YXIgc3VtID0gMDsKICBmb3IgKHZhciBpbmRleDIgPSAwOyBpbmRleDIgPCA4OyBpbmRleDIrKykgewogICAgc3VtICs9IHBhcnNlSW50KGJhbmtCcmFuY2guY2hhckF0KGluZGV4MiksIDEwKSAqIHdlaWdodHNCYW5rQnJhbmNoW2luZGV4Ml07CiAgfQogIHZhciByZW1haW5kZXIgPSBzdW0gJSAxMTsKICBpZiAoY29udHJvbEJhbmtCcmFuY2ggIT09IChyZW1haW5kZXIgPT09IDAgPyAwIDogcmVtYWluZGVyID09PSAxID8gMSA6IDExIC0gcmVtYWluZGVyKSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBzdW0gPSAwOwogIGZvciAodmFyIGluZGV4MiA9IDA7IGluZGV4MiA8IDEwOyBpbmRleDIrKykgewogICAgc3VtICs9IHBhcnNlSW50KGFjY291bnQuY2hhckF0KGluZGV4MiksIDEwKSAqIHdlaWdodHNBY2NvdW50W2luZGV4Ml07CiAgfQogIHJlbWFpbmRlciA9IHN1bSAlIDExOwogIHJldHVybiBjb250cm9sQWNjb3VudCA9PT0gKHJlbWFpbmRlciA9PT0gMCA/IDAgOiByZW1haW5kZXIgPT09IDEgPyAxIDogMTEgLSByZW1haW5kZXIpOwp9Owp2YXIgY2hlY2tNb2QxMTEwID0gZnVuY3Rpb24odG9DaGVjaywgY29udHJvbCkgewogIHZhciBuciA9IDEwOwogIGZvciAodmFyIGluZGV4MiA9IDA7IGluZGV4MiA8IHRvQ2hlY2subGVuZ3RoOyBpbmRleDIrKykgewogICAgbnIgKz0gcGFyc2VJbnQodG9DaGVjay5jaGFyQXQoaW5kZXgyKSwgMTApOwogICAgaWYgKG5yICUgMTAgIT09IDApIHsKICAgICAgbnIgPSBuciAlIDEwOwogICAgfQogICAgbnIgPSBuciAqIDI7CiAgICBuciA9IG5yICUgMTE7CiAgfQogIHJldHVybiBjb250cm9sID09PSAoMTEgLSBuciA9PT0gMTAgPyAwIDogMTEgLSBucik7Cn07CnZhciBjaGVja0Nyb2F0aWFuQkJBTiA9IGZ1bmN0aW9uKGJiYW4pIHsKICB2YXIgY29udHJvbEJhbmtCcmFuY2ggPSBwYXJzZUludChiYmFuLmNoYXJBdCg2KSwgMTApOwogIHZhciBjb250cm9sQWNjb3VudCA9IHBhcnNlSW50KGJiYW4uY2hhckF0KDE2KSwgMTApOwogIHZhciBiYW5rQnJhbmNoID0gYmJhbi5zdWJzdHJpbmcoMCwgNik7CiAgdmFyIGFjY291bnQgPSBiYmFuLnN1YnN0cmluZyg3LCAxNik7CiAgcmV0dXJuIGNoZWNrTW9kMTExMChiYW5rQnJhbmNoLCBjb250cm9sQmFua0JyYW5jaCkgJiYgY2hlY2tNb2QxMTEwKGFjY291bnQsIGNvbnRyb2xBY2NvdW50KTsKfTsKdmFyIGNoZWNrQ3plY2hBbmRTbG92YWtCQkFOID0gZnVuY3Rpb24oYmJhbikgewogIHZhciB3ZWlnaHRzUHJlZml4ID0gWzEwLCA1LCA4LCA0LCAyLCAxXTsKICB2YXIgd2VpZ2h0c1N1ZmZpeCA9IFs2LCAzLCA3LCA5LCAxMCwgNSwgOCwgNCwgMiwgMV07CiAgdmFyIGNvbnRyb2xQcmVmaXggPSBwYXJzZUludChiYmFuLmNoYXJBdCg5KSwgMTApOwogIHZhciBjb250cm9sU3VmZml4ID0gcGFyc2VJbnQoYmJhbi5jaGFyQXQoMTkpLCAxMCk7CiAgdmFyIHByZWZpeDQgPSBiYmFuLnN1YnN0cmluZyg0LCA5KTsKICB2YXIgc3VmZml4ID0gYmJhbi5zdWJzdHJpbmcoMTAsIDE5KTsKICB2YXIgc3VtID0gMDsKICBmb3IgKHZhciBpbmRleDIgPSAwOyBpbmRleDIgPCBwcmVmaXg0Lmxlbmd0aDsgaW5kZXgyKyspIHsKICAgIHN1bSArPSBwYXJzZUludChwcmVmaXg0LmNoYXJBdChpbmRleDIpLCAxMCkgKiB3ZWlnaHRzUHJlZml4W2luZGV4Ml07CiAgfQogIHZhciByZW1haW5kZXIgPSBzdW0gJSAxMTsKICBpZiAoY29udHJvbFByZWZpeCAhPT0gKHJlbWFpbmRlciA9PT0gMCA/IDAgOiByZW1haW5kZXIgPT09IDEgPyAxIDogMTEgLSByZW1haW5kZXIpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHN1bSA9IDA7CiAgZm9yICh2YXIgaW5kZXgyID0gMDsgaW5kZXgyIDwgc3VmZml4Lmxlbmd0aDsgaW5kZXgyKyspIHsKICAgIHN1bSArPSBwYXJzZUludChzdWZmaXguY2hhckF0KGluZGV4MiksIDEwKSAqIHdlaWdodHNTdWZmaXhbaW5kZXgyXTsKICB9CiAgcmVtYWluZGVyID0gc3VtICUgMTE7CiAgcmV0dXJuIGNvbnRyb2xTdWZmaXggPT09IChyZW1haW5kZXIgPT09IDAgPyAwIDogcmVtYWluZGVyID09PSAxID8gMSA6IDExIC0gcmVtYWluZGVyKTsKfTsKdmFyIGNoZWNrRXN0b25pYW5CQkFOID0gZnVuY3Rpb24oYmJhbikgewogIHZhciB3ZWlnaHRzID0gWzcsIDEsIDMsIDcsIDEsIDMsIDcsIDEsIDMsIDcsIDEsIDMsIDddOwogIHZhciBjb250cm9sRGlnaXQgPSBwYXJzZUludChiYmFuLmNoYXJBdCgxNSksIDEwKTsKICB2YXIgdG9DaGVjayA9IGJiYW4uc3Vic3RyaW5nKDIsIDE1KTsKICB2YXIgc3VtID0gMDsKICBmb3IgKHZhciBpbmRleDIgPSAwOyBpbmRleDIgPCB0b0NoZWNrLmxlbmd0aDsgaW5kZXgyKyspIHsKICAgIHN1bSArPSBwYXJzZUludCh0b0NoZWNrLmNoYXJBdChpbmRleDIpLCAxMCkgKiB3ZWlnaHRzW2luZGV4Ml07CiAgfQogIHZhciByZW1haW5kZXIgPSBzdW0gJSAxMDsKICByZXR1cm4gY29udHJvbERpZ2l0ID09PSAocmVtYWluZGVyID09PSAwID8gMCA6IDEwIC0gcmVtYWluZGVyKTsKfTsKdmFyIGNoZWNrRnJlbmNoQkJBTiA9IGZ1bmN0aW9uKGJiYW4pIHsKICB2YXIgc3RyaXBwZWQgPSBiYmFuLnJlcGxhY2UoL1tccy5dKy9nLCAiIik7CiAgdmFyIG5vcm1hbGl6ZWQgPSBBcnJheS5mcm9tKHN0cmlwcGVkKTsKICBmb3IgKHZhciBpbmRleDIgPSAwOyBpbmRleDIgPCBzdHJpcHBlZC5sZW5ndGg7IGluZGV4MisrKSB7CiAgICB2YXIgYzExID0gbm9ybWFsaXplZFtpbmRleDJdLmNoYXJDb2RlQXQoMCk7CiAgICBpZiAoYzExID49IDY1KSB7CiAgICAgIHN3aXRjaCAoYzExKSB7CiAgICAgICAgY2FzZSA2NToKICAgICAgICBjYXNlIDc0OgogICAgICAgICAgbm9ybWFsaXplZFtpbmRleDJdID0gIjEiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA2NjoKICAgICAgICBjYXNlIDc1OgogICAgICAgIGNhc2UgODM6CiAgICAgICAgICBub3JtYWxpemVkW2luZGV4Ml0gPSAiMiI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDY3OgogICAgICAgIGNhc2UgNzY6CiAgICAgICAgY2FzZSA4NDoKICAgICAgICAgIG5vcm1hbGl6ZWRbaW5kZXgyXSA9ICIzIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNjg6CiAgICAgICAgY2FzZSA3NzoKICAgICAgICBjYXNlIDg1OgogICAgICAgICAgbm9ybWFsaXplZFtpbmRleDJdID0gIjQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA2OToKICAgICAgICBjYXNlIDc4OgogICAgICAgIGNhc2UgODY6CiAgICAgICAgICBub3JtYWxpemVkW2luZGV4Ml0gPSAiNSI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDcwOgogICAgICAgIGNhc2UgNzk6CiAgICAgICAgY2FzZSA4NzoKICAgICAgICAgIG5vcm1hbGl6ZWRbaW5kZXgyXSA9ICI2IjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNzE6CiAgICAgICAgY2FzZSA4MDoKICAgICAgICBjYXNlIDg4OgogICAgICAgICAgbm9ybWFsaXplZFtpbmRleDJdID0gIjciOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA3MjoKICAgICAgICBjYXNlIDgxOgogICAgICAgIGNhc2UgODk6CiAgICAgICAgICBub3JtYWxpemVkW2luZGV4Ml0gPSAiOCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDczOgogICAgICAgIGNhc2UgODI6CiAgICAgICAgY2FzZSA5MDoKICAgICAgICAgIG5vcm1hbGl6ZWRbaW5kZXgyXSA9ICI5IjsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQogIHZhciByZW1haW5kZXIgPSBtb2Q5NzEwKG5vcm1hbGl6ZWQuam9pbigiIikpOwogIHJldHVybiByZW1haW5kZXIgPT09IDA7Cn07CnZhciBjaGVja0h1bmdhcmlhbkJCQU4gPSBmdW5jdGlvbihiYmFuKSB7CiAgdmFyIHdlaWdodHMgPSBbOSwgNywgMywgMSwgOSwgNywgMywgMSwgOSwgNywgMywgMSwgOSwgNywgM107CiAgdmFyIGNvbnRyb2xEaWdpdEJhbmtCcmFuY2ggPSBwYXJzZUludChiYmFuLmNoYXJBdCg3KSwgMTApOwogIHZhciB0b0NoZWNrQmFua0JyYW5jaCA9IGJiYW4uc3Vic3RyaW5nKDAsIDcpOwogIHZhciBzdW0gPSAwOwogIGZvciAodmFyIGluZGV4MiA9IDA7IGluZGV4MiA8IHRvQ2hlY2tCYW5rQnJhbmNoLmxlbmd0aDsgaW5kZXgyKyspIHsKICAgIHN1bSArPSBwYXJzZUludCh0b0NoZWNrQmFua0JyYW5jaC5jaGFyQXQoaW5kZXgyKSwgMTApICogd2VpZ2h0c1tpbmRleDJdOwogIH0KICB2YXIgcmVtYWluZGVyID0gc3VtICUgMTA7CiAgaWYgKGNvbnRyb2xEaWdpdEJhbmtCcmFuY2ggIT09IChyZW1haW5kZXIgPT09IDAgPyAwIDogMTAgLSByZW1haW5kZXIpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHN1bSA9IDA7CiAgaWYgKGJiYW4uZW5kc1dpdGgoIjAwMDAwMDAwIikpIHsKICAgIHZhciB0b0NoZWNrQWNjb3VudCA9IGJiYW4uc3Vic3RyaW5nKDgsIDE1KTsKICAgIHZhciBjb250cm9sRGlnaXRBY2NvdW50ID0gcGFyc2VJbnQoYmJhbi5jaGFyQXQoMTUpLCAxMCk7CiAgICBmb3IgKHZhciBpbmRleDIgPSAwOyBpbmRleDIgPCB0b0NoZWNrQWNjb3VudC5sZW5ndGg7IGluZGV4MisrKSB7CiAgICAgIHN1bSArPSBwYXJzZUludCh0b0NoZWNrQWNjb3VudC5jaGFyQXQoaW5kZXgyKSwgMTApICogd2VpZ2h0c1tpbmRleDJdOwogICAgfQogICAgdmFyIHJlbWFpbmRlcl8xID0gc3VtICUgMTA7CiAgICByZXR1cm4gY29udHJvbERpZ2l0QWNjb3VudCA9PT0gKHJlbWFpbmRlcl8xID09PSAwID8gMCA6IDEwIC0gcmVtYWluZGVyXzEpOwogIH0gZWxzZSB7CiAgICB2YXIgdG9DaGVja0FjY291bnQgPSBiYmFuLnN1YnN0cmluZyg4LCAyMyk7CiAgICB2YXIgY29udHJvbERpZ2l0QWNjb3VudCA9IHBhcnNlSW50KGJiYW4uY2hhckF0KDIzKSwgMTApOwogICAgZm9yICh2YXIgaW5kZXgyID0gMDsgaW5kZXgyIDwgdG9DaGVja0FjY291bnQubGVuZ3RoOyBpbmRleDIrKykgewogICAgICBzdW0gKz0gcGFyc2VJbnQodG9DaGVja0FjY291bnQuY2hhckF0KGluZGV4MiksIDEwKSAqIHdlaWdodHNbaW5kZXgyXTsKICAgIH0KICAgIHZhciByZW1haW5kZXJfMiA9IHN1bSAlIDEwOwogICAgcmV0dXJuIGNvbnRyb2xEaWdpdEFjY291bnQgPT09IChyZW1haW5kZXJfMiA9PT0gMCA/IDAgOiAxMCAtIHJlbWFpbmRlcl8yKTsKICB9Cn07CnZhciBzZXRDb3VudHJ5QkJBTlZhbGlkYXRpb24gPSBmdW5jdGlvbihjb3VudHJ5LCBmdW5jKSB7CiAgaWYgKHR5cGVvZiBjb3VudHJ5U3BlY3NbY291bnRyeV0gPT09ICJ1bmRlZmluZWQiKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGNvdW50cnlTcGVjc1tjb3VudHJ5XS5iYmFuX3ZhbGlkYXRpb25fZnVuYyA9IGZ1bmM7CiAgcmV0dXJuIHRydWU7Cn07CnZhciBjb3VudHJ5U3BlY3MgPSB7CiAgQUQ6IHsKICAgIGNoYXJzOiAyNCwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezh9W0EtWjAtOV17MTJ9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiNC03IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiOC0yNCIKICB9LAogIEFFOiB7CiAgICBjaGFyczogMjMsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXszfVswLTldezE2fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0yIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICI3LTIzIgogIH0sCiAgQUY6IHt9LAogIEFHOiB7fSwKICBBSToge30sCiAgQUw6IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezh9W0EtWjAtOV17MTZ9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICIzLTciLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0yIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICIxMi0yOCIKICB9LAogIEFNOiB7fSwKICBBTzogewogICAgY2hhcnM6IDI1LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjF9JCIKICB9LAogIEFROiB7fSwKICBBUjoge30sCiAgQVM6IHt9LAogIEFUOiB7IGNoYXJzOiAyMCwgYmJhbl9yZWdleHA6ICJeWzAtOV17MTZ9JCIsIElCQU5SZWdpc3RyeTogdHJ1ZSwgU0VQQTogdHJ1ZSwgYmFua19pZGVudGlmaWVyOiAiMC00IiB9LAogIEFVOiB7fSwKICBBVzoge30sCiAgQVg6IHsKICAgIGNoYXJzOiAxOCwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezE0fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlCiAgfSwKICBBWjogewogICAgY2hhcnM6IDI4LAogICAgYmJhbl9yZWdleHA6ICJeW0EtWl17NH1bQS1aMC05XXsyMH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiNC0yOCIKICB9LAogIEJBOiB7CiAgICBjaGFyczogMjAsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxNn0kIiwKICAgIGJiYW5fdmFsaWRhdGlvbl9mdW5jOiBjaGVja01vZDk3MTBCQkFOLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiMy01IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMiIKICB9LAogIEJCOiB7fSwKICBCRDoge30sCiAgQkU6IHsKICAgIGNoYXJzOiAxNiwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezEyfSQiLAogICAgYmJhbl92YWxpZGF0aW9uX2Z1bmM6IGNoZWNrQmVsZ2lhbkJCQU4sCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0yIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICIwLTE2IgogIH0sCiAgQkY6IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVowLTldezJ9WzAtOV17MjJ9JCIKICB9LAogIEJHOiB7CiAgICBjaGFyczogMjIsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXs0fVswLTldezZ9W0EtWjAtOV17OH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICI0LTciLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0zIgogIH0sCiAgQkg6IHsKICAgIGNoYXJzOiAyMiwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezR9W0EtWjAtOV17MTR9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTMiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjgtMjIiCiAgfSwKICBCSTogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjN9JCIsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICI1LTkiLAogICAgYmFua19pZGVudGlmaWVyOiAiMC00IiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICIxNC0yNyIKICB9LAogIEJKOiB7CiAgICBjaGFyczogMjgsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aMC05XXsyfVswLTldezIyfSQiCiAgfSwKICBCTDogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTB9W0EtWjAtOV17MTF9WzAtOV17Mn0kIgogIH0sCiAgQk06IHt9LAogIEJOOiB7fSwKICBCTzoge30sCiAgQlE6IHt9LAogIEJSOiB7CiAgICBjaGFyczogMjksCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyM31bQS1aXXsxfVtBLVowLTldezF9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICI4LTEyIiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtNyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMTctMjkiCiAgfSwKICBCUzoge30sCiAgQlQ6IHt9LAogIEJWOiB7fSwKICBCVzoge30sCiAgQlk6IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezR9WzAtOV17NH1bQS1aMC05XXsxNn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIKICB9LAogIEJaOiB7fSwKICBDQToge30sCiAgQ0M6IHt9LAogIENEOiB7fSwKICBDRjogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjN9JCIKICB9LAogIENHOiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyM30kIgogIH0sCiAgQ0g6IHsKICAgIGNoYXJzOiAyMSwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezV9W0EtWjAtOV17MTJ9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC00IgogIH0sCiAgQ0k6IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezF9WzAtOV17MjN9JCIKICB9LAogIENLOiB7fSwKICBDTDoge30sCiAgQ006IHsKICAgIGNoYXJzOiAyNywKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezIzfSQiCiAgfSwKICBDTjoge30sCiAgQ086IHt9LAogIENSOiB7CiAgICBjaGFyczogMjIsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxOH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiOC0yMiIKICB9LAogIENVOiB7fSwKICBDVjogeyBjaGFyczogMjUsIGJiYW5fcmVnZXhwOiAiXlswLTldezIxfSQiIH0sCiAgQ1c6IHt9LAogIENYOiB7fSwKICBDWTogewogICAgY2hhcnM6IDI4LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17OH1bQS1aMC05XXsxNn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICIzLTciLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0yIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICIxMi0yOCIKICB9LAogIENaOiB7CiAgICBjaGFyczogMjQsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyMH0kIiwKICAgIGJiYW5fdmFsaWRhdGlvbl9mdW5jOiBjaGVja0N6ZWNoQW5kU2xvdmFrQkJBTiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTMiCiAgfSwKICBERTogewogICAgY2hhcnM6IDIyLAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTh9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC03IiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICIxMy0yMiIKICB9LAogIERKOiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyM30kIiwKICAgIGJyYW5jaF9pbmRlbnRpZmllcjogIjUtOSIsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTQiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjE0LTI3IgogIH0sCiAgREs6IHsKICAgIGNoYXJzOiAxOCwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezE0fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgU0VQQTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiNC0xOCIKICB9LAogIERNOiB7fSwKICBETzogewogICAgY2hhcnM6IDI4LAogICAgYmJhbl9yZWdleHA6ICJeW0EtWl17NH1bMC05XXsyMH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiOC0yOCIKICB9LAogIERaOiB7CiAgICBjaGFyczogMjYsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyMn0kIgogIH0sCiAgRUM6IHt9LAogIEVFOiB7CiAgICBjaGFyczogMjAsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxNn0kIiwKICAgIGJiYW5fdmFsaWRhdGlvbl9mdW5jOiBjaGVja0VzdG9uaWFuQkJBTiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTEiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjgtMjAiCiAgfSwKICBFRzogewogICAgY2hhcnM6IDI5LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjV9IiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJyYW5jaF9pbmRlbnRpZmllcjogIjQtNyIsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTMiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjE3LTI5IgogIH0sCiAgRUg6IHt9LAogIEVSOiB7fSwKICBFUzogewogICAgY2hhcnM6IDI0LAogICAgYmJhbl92YWxpZGF0aW9uX2Z1bmM6IGNoZWNrU3BhaW5CQkFOLAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjB9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiNC03IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMTQtMjQiCiAgfSwKICBFVDoge30sCiAgRkk6IHsKICAgIGNoYXJzOiAxOCwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezE0fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgU0VQQTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMiIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMC0wIgogIH0sCiAgRko6IHt9LAogIEZLOiB7CiAgICBjaGFyczogMTgsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXsyfVswLTldezEyfSQiLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0xIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICI2LTE4IgogIH0sCiAgRk06IHt9LAogIEZPOiB7CiAgICBjaGFyczogMTgsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxNH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiNC0xOCIKICB9LAogIEZSOiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxMH1bQS1aMC05XXsxMX1bMC05XXsyfSQiLAogICAgYmJhbl92YWxpZGF0aW9uX2Z1bmM6IGNoZWNrRnJlbmNoQkJBTiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTQiLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiNS05IiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICIxNC0yNCIKICB9LAogIEdBOiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyM30kIgogIH0sCiAgR0I6IHsKICAgIGNoYXJzOiAyMiwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezR9WzAtOV17MTR9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiNC05IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIKICB9LAogIEdEOiB7fSwKICBHRTogewogICAgY2hhcnM6IDIyLAogICAgYmJhbl9yZWdleHA6ICJeW0EtWjAtOV17Mn1bMC05XXsxNn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMSIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiNi0yMiIKICB9LAogIEdGOiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxMH1bQS1aMC05XXsxMX1bMC05XXsyfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlCiAgfSwKICBHRzoge30sCiAgR0g6IHt9LAogIEdJOiB7CiAgICBjaGFyczogMjMsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXs0fVtBLVowLTldezE1fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgU0VQQTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiOC0yMyIKICB9LAogIEdMOiB7CiAgICBjaGFyczogMTgsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxNH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiNC0xOCIKICB9LAogIEdNOiB7fSwKICBHTjoge30sCiAgR1A6IHsKICAgIGNoYXJzOiAyNywKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezEwfVtBLVowLTldezExfVswLTldezJ9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUKICB9LAogIEdROiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyM30kIgogIH0sCiAgR1I6IHsKICAgIGNoYXJzOiAyNywKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezd9W0EtWjAtOV17MTZ9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiMy02IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMiIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiNy0yNyIKICB9LAogIEdTOiB7fSwKICBHVDogewogICAgY2hhcnM6IDI4LAogICAgYmJhbl9yZWdleHA6ICJeW0EtWjAtOV17MjR9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTMiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjgtMjgiCiAgfSwKICBHVToge30sCiAgR1c6IHsKICAgIGNoYXJzOiAyNSwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezJ9WzAtOV17MTl9JCIKICB9LAogIEdZOiB7fSwKICBISzoge30sCiAgSE06IHt9LAogIEhOOiB7CiAgICBjaGFyczogMjgsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXs0fVswLTldezIwfSQiCiAgfSwKICBIUjogewogICAgY2hhcnM6IDIxLAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTd9JCIsCiAgICBiYmFuX3ZhbGlkYXRpb25fZnVuYzogY2hlY2tDcm9hdGlhbkJCQU4sCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC02IgogIH0sCiAgSFQ6IHt9LAogIEhVOiB7CiAgICBjaGFyczogMjgsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyNH0kIiwKICAgIGJiYW5fdmFsaWRhdGlvbl9mdW5jOiBjaGVja0h1bmdhcmlhbkJCQU4sCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiMy02IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMiIKICB9LAogIElEOiB7fSwKICBJRTogewogICAgY2hhcnM6IDIyLAogICAgYmJhbl9yZWdleHA6ICJeW0EtWjAtOV17NH1bMC05XXsxNH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICI0LTkiLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0zIgogIH0sCiAgSUw6IHsKICAgIGNoYXJzOiAyMywKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezE5fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiMy01IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMiIKICB9LAogIElNOiB7fSwKICBJTjoge30sCiAgSU86IHt9LAogIElROiB7CiAgICBjaGFyczogMjMsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXs0fVswLTldezE1fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiNC02IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMTEtMjMiCiAgfSwKICBJUjogewogICAgY2hhcnM6IDI2LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjJ9JCIKICB9LAogIElTOiB7CiAgICBjaGFyczogMjYsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyMn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICIyLTMiLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0xIgogIH0sCiAgSVQ6IHsKICAgIGNoYXJzOiAyNywKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezF9WzAtOV17MTB9W0EtWjAtOV17MTJ9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiNi0xMCIsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIxLTUiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjQtMjciCiAgfSwKICBKRToge30sCiAgSk06IHt9LAogIEpPOiB7CiAgICBjaGFyczogMzAsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXs0fVswLTldezR9W0EtWjAtOV17MTh9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICI0LTciLAogICAgYmFua19pZGVudGlmaWVyOiAiNC03IgogIH0sCiAgSlA6IHt9LAogIEtFOiB7fSwKICBLRzoge30sCiAgS0g6IHt9LAogIEtJOiB7fSwKICBLTTogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjN9JCIKICB9LAogIEtOOiB7fSwKICBLUDoge30sCiAgS1I6IHt9LAogIEtXOiB7CiAgICBjaGFyczogMzAsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXs0fVtBLVowLTldezIyfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0zIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICIyMC0zMCIKICB9LAogIEtZOiB7fSwKICBLWjogewogICAgY2hhcnM6IDIwLAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17M31bQS1aMC05XXsxM30kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMiIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMC0yMCIKICB9LAogIExBOiB7fSwKICBMQjogewogICAgY2hhcnM6IDI4LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17NH1bQS1aMC05XXsyMH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMTQtMjgiCiAgfSwKICBMQzogewogICAgY2hhcnM6IDMyLAogICAgYmJhbl9yZWdleHA6ICJeW0EtWl17NH1bQS1aMC05XXsyNH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiOC0zMiIKICB9LAogIExJOiB7CiAgICBjaGFyczogMjEsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXs1fVtBLVowLTldezEyfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgU0VQQTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtNCIKICB9LAogIExLOiB7fSwKICBMUjoge30sCiAgTFM6IHt9LAogIExUOiB7IGNoYXJzOiAyMCwgYmJhbl9yZWdleHA6ICJeWzAtOV17MTZ9JCIsIElCQU5SZWdpc3RyeTogdHJ1ZSwgU0VQQTogdHJ1ZSwgYmFua19pZGVudGlmaWVyOiAiMC00IiB9LAogIExVOiB7CiAgICBjaGFyczogMjAsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXszfVtBLVowLTldezEzfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgU0VQQTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMiIKICB9LAogIExWOiB7CiAgICBjaGFyczogMjEsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXs0fVtBLVowLTldezEzfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgU0VQQTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMC0yMSIKICB9LAogIExZOiB7CiAgICBjaGFyczogMjUsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyMX0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJyYW5jaF9pbmRlbnRpZmllcjogIjMtNSIsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTIiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjEwLTI1IgogIH0sCiAgTUE6IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezI0fSQiCiAgfSwKICBNQzogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTB9W0EtWjAtOV17MTF9WzAtOV17Mn0kIiwKICAgIGJiYW5fdmFsaWRhdGlvbl9mdW5jOiBjaGVja0ZyZW5jaEJCQU4sCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiNS05IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtNCIKICB9LAogIE1EOiB7CiAgICBjaGFyczogMjQsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aMC05XXsyfVtBLVowLTldezE4fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0xIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICI2LTI0IgogIH0sCiAgTUU6IHsKICAgIGNoYXJzOiAyMiwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezE4fSQiLAogICAgYmJhbl92YWxpZGF0aW9uX2Z1bmM6IGNoZWNrTW9kOTcxMEJCQU4sCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTIiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjQtMjIiCiAgfSwKICBNRjogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTB9W0EtWjAtOV17MTF9WzAtOV17Mn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZQogIH0sCiAgTUc6IHsKICAgIGNoYXJzOiAyNywKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezIzfSQiCiAgfSwKICBNSDoge30sCiAgTUs6IHsKICAgIGNoYXJzOiAxOSwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezN9W0EtWjAtOV17MTB9WzAtOV17Mn0kIiwKICAgIGJiYW5fdmFsaWRhdGlvbl9mdW5jOiBjaGVja01vZDk3MTBCQkFOLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0yIgogIH0sCiAgTUw6IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVowLTldezJ9WzAtOV17MjJ9JCIKICB9LAogIE1NOiB7fSwKICBNTjogewogICAgY2hhcnM6IDIwLAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTZ9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTMiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjgtMjAiCiAgfSwKICBNTzoge30sCiAgTVA6IHt9LAogIE1ROiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxMH1bQS1aMC05XXsxMX1bMC05XXsyfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlCiAgfSwKICBNUjogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjN9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICI1LTkiLAogICAgYmFua19pZGVudGlmaWVyOiAiMC00IiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICI0LTI3IgogIH0sCiAgTVM6IHt9LAogIE1UOiB7CiAgICBjaGFyczogMzEsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXs0fVswLTldezV9W0EtWjAtOV17MTh9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiNC04IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMTUtMzEiCiAgfSwKICBNVTogewogICAgY2hhcnM6IDMwLAogICAgYmJhbl9yZWdleHA6ICJeW0EtWl17NH1bMC05XXsxOX1bQS1aXXszfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiNi03IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtNSIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMC0zMCIKICB9LAogIE1WOiB7fSwKICBNVzoge30sCiAgTVg6IHt9LAogIE1ZOiB7fSwKICBNWjogewogICAgY2hhcnM6IDI1LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjF9JCIKICB9LAogIE5BOiB7fSwKICBOQzogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTB9W0EtWjAtOV17MTF9WzAtOV17Mn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZQogIH0sCiAgTkU6IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezJ9WzAtOV17MjJ9JCIKICB9LAogIE5GOiB7fSwKICBORzoge30sCiAgTkk6IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezR9WzAtOV17MjB9JCIsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTMiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjgtMjgiCiAgfSwKICBOTDogewogICAgY2hhcnM6IDE4LAogICAgYmJhbl9yZWdleHA6ICJeW0EtWl17NH1bMC05XXsxMH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTMiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjgtMTgiCiAgfSwKICBOTzogewogICAgY2hhcnM6IDE1LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTF9JCIsCiAgICBiYmFuX3ZhbGlkYXRpb25fZnVuYzogY2hlY2tOb3J3YXlCQkFOLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgU0VQQTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiNC0xNSIKICB9LAogIE5QOiB7fSwKICBOUjoge30sCiAgTlU6IHt9LAogIE5aOiB7fSwKICBPTTogewogICAgY2hhcnM6IDIzLAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17M31bQS1aMC05XXsxNn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IGZhbHNlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0yIgogIH0sCiAgUEE6IHt9LAogIFBFOiB7fSwKICBQRjogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTB9W0EtWjAtOV17MTF9WzAtOV17Mn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZQogIH0sCiAgUEc6IHt9LAogIFBIOiB7fSwKICBQSzogewogICAgY2hhcnM6IDI0LAogICAgYmJhbl9yZWdleHA6ICJeW0EtWjAtOV17NH1bMC05XXsxNn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIKICB9LAogIFBMOiB7CiAgICBjaGFyczogMjgsCiAgICBiYmFuX3ZhbGlkYXRpb25fZnVuYzogY2hlY2tQb2xhbmRCQkFOLAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjR9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiMC03IiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICIyLTI4IgogIH0sCiAgUE06IHsKICAgIGNoYXJzOiAyNywKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezEwfVtBLVowLTldezExfVswLTldezJ9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUKICB9LAogIFBOOiB7fSwKICBQUjoge30sCiAgUFM6IHsKICAgIGNoYXJzOiAyOSwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVowLTldezR9WzAtOV17MjF9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTMiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjE3LTI5IgogIH0sCiAgUFQ6IHsKICAgIGNoYXJzOiAyNSwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezIxfSQiLAogICAgYmJhbl92YWxpZGF0aW9uX2Z1bmM6IGNoZWNrTW9kOTcxMEJCQU4sCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0zIgogIH0sCiAgUFc6IHt9LAogIFBZOiB7fSwKICBRQTogewogICAgY2hhcnM6IDI5LAogICAgYmJhbl9yZWdleHA6ICJeW0EtWl17NH1bQS1aMC05XXsyMX0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiOC0yOSIKICB9LAogIFJFOiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxMH1bQS1aMC05XXsxMX1bMC05XXsyfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlCiAgfSwKICBSTzogewogICAgY2hhcnM6IDI0LAogICAgYmJhbl9yZWdleHA6ICJeW0EtWl17NH1bQS1aMC05XXsxNn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTMiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjAtMjQiCiAgfSwKICBSUzogewogICAgY2hhcnM6IDIyLAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTh9JCIsCiAgICBiYmFuX3ZhbGlkYXRpb25fZnVuYzogY2hlY2tNb2Q5NzEwQkJBTiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMiIKICB9LAogIFJVOiB7CiAgICBjaGFyczogMzMsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxNH1bQS1aMC05XXsxNX0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJyYW5jaF9pbmRlbnRpZmllcjogIjktMTMiLAogICAgYmFua19pZGVudGlmaWVyOiAiMC04IiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICIxMy0zMyIKICB9LAogIFJXOiB7fSwKICBTQTogewogICAgY2hhcnM6IDI0LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17Mn1bQS1aMC05XXsxOH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMSIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMTItMjQiCiAgfSwKICBTQjoge30sCiAgU0M6IHsKICAgIGNoYXJzOiAzMSwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezR9WzAtOV17MjB9W0EtWl17M30kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJyYW5jaF9pbmRlbnRpZmllcjogIjYtNyIsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTUiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjEyLTI4IgogIH0sCiAgU0Q6IHsKICAgIGNoYXJzOiAxOCwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezE0fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0xIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICI2LTE4IgogIH0sCiAgU0U6IHsgY2hhcnM6IDI0LCBiYmFuX3JlZ2V4cDogIl5bMC05XXsyMH0kIiwgSUJBTlJlZ2lzdHJ5OiB0cnVlLCBTRVBBOiB0cnVlLCBiYW5rX2lkZW50aWZpZXI6ICIwLTIiIH0sCiAgU0c6IHt9LAogIFNIOiB7fSwKICBTSTogewogICAgY2hhcnM6IDE5LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTV9JCIsCiAgICBiYmFuX3ZhbGlkYXRpb25fZnVuYzogY2hlY2tNb2Q5NzEwQkJBTiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICIyLTQiLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0xIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICI5LTE2IgogIH0sCiAgU0o6IHt9LAogIFNLOiB7CiAgICBjaGFyczogMjQsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyMH0kIiwKICAgIGJiYW5fdmFsaWRhdGlvbl9mdW5jOiBjaGVja0N6ZWNoQW5kU2xvdmFrQkJBTiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUKICB9LAogIFNMOiB7fSwKICBTTTogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeW0EtWl17MX1bMC05XXsxMH1bQS1aMC05XXsxMn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICI2LTEwIgogIH0sCiAgU046IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezJ9WzAtOV17MjJ9JCIKICB9LAogIFNPOiB7CiAgICBjaGFyczogMjMsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxOX0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJyYW5jaF9pbmRlbnRpZmllcjogIjQtNiIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMTEtMjMiCiAgfSwKICBTUjoge30sCiAgU1M6IHt9LAogIFNUOiB7CiAgICBjaGFyczogMjUsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyMX0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJyYW5jaF9pbmRlbnRpZmllcjogIjQtNyIKICB9LAogIFNWOiB7CiAgICBjaGFyczogMjgsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXs0fVswLTldezIwfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjgtMjgiCiAgfSwKICBTWDoge30sCiAgU1k6IHt9LAogIFNaOiB7fSwKICBUQzoge30sCiAgVEQ6IHsKICAgIGNoYXJzOiAyNywKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezIzfSQiCiAgfSwKICBURjogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTB9W0EtWjAtOV17MTF9WzAtOV17Mn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZQogIH0sCiAgVEc6IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezJ9WzAtOV17MjJ9JCIKICB9LAogIFRIOiB7fSwKICBUSjoge30sCiAgVEs6IHt9LAogIFRMOiB7CiAgICBjaGFyczogMjMsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxOX0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICI0LTIzIgogIH0sCiAgVE06IHt9LAogIFROOiB7CiAgICBjaGFyczogMjQsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyMH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJyYW5jaF9pbmRlbnRpZmllcjogIjItNCIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiNC0yNCIKICB9LAogIFRPOiB7fSwKICBUUjogewogICAgY2hhcnM6IDI2LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17NX1bQS1aMC05XXsxN30kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZQogIH0sCiAgVFQ6IHt9LAogIFRWOiB7fSwKICBUVzoge30sCiAgVFo6IHt9LAogIFVBOiB7CiAgICBjaGFyczogMjksCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXs2fVtBLVowLTldezE5fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjE1LTI5IgogIH0sCiAgVUc6IHt9LAogIFVNOiB7fSwKICBVUzoge30sCiAgVVk6IHt9LAogIFVaOiB7fSwKICBWQTogewogICAgY2hhcnM6IDIyLAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTh9IiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiNy0yMiIKICB9LAogIFZDOiB7fSwKICBWRToge30sCiAgVkc6IHsKICAgIGNoYXJzOiAyNCwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVowLTldezR9WzAtOV17MTZ9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiOC0yNCIKICB9LAogIFZJOiB7fSwKICBWTjoge30sCiAgVlU6IHt9LAogIFdGOiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxMH1bQS1aMC05XXsxMX1bMC05XXsyfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlCiAgfSwKICBXUzoge30sCiAgWEs6IHsKICAgIGNoYXJzOiAyMCwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezE2fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiMi0zIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICI0LTIwIgogIH0sCiAgWUU6IHt9LAogIFlUOiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxMH1bQS1aMC05XXsxMX1bMC05XXsyfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlCiAgfSwKICBaQToge30sCiAgWk06IHt9LAogIFpXOiB7fQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtaWJhbi9kZWVzLWlucHV0LWliYW4uZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgZGVtb0Z1bmMxOSA9ICgpID0+IGIyYAogIDxkZWVzLWRlbW93cmFwcGVyPgogICAgPHN0eWxlPgogICAgICAke2lgCiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICAgIG1heC13aWR0aDogMTIwMHB4OwogICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5wYXltZW50LWdyb3VwIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIH0KICAgICAgYH0KICAgIDwvc3R5bGU+CiAgICAKICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkJhc2ljIElCQU4gSW5wdXQifSAuc3VidGl0bGU9JHsiSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIHdpdGggYXV0b21hdGljIGZvcm1hdHRpbmcifT4KICAgICAgICA8ZGVlcy1pbnB1dC1pYmFuIAogICAgICAgICAgLmxhYmVsPSR7IkJhbmsgQWNjb3VudCBJQkFOIn0gCiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiRW50ZXIgeW91ciBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIifQogICAgICAgID48L2RlZXMtaW5wdXQtaWJhbj4KICAgICAgICAKICAgICAgICA8ZGVlcy1pbnB1dC1pYmFuIAogICAgICAgICAgLmxhYmVsPSR7IlZlcmlmaWVkIElCQU4ifSAKICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJUaGlzIElCQU4gaGFzIGJlZW4gdmVyaWZpZWQifQogICAgICAgICAgLnZhbHVlPSR7IkRFODkzNzA0MDA0NDA1MzIwMTMwMDAifQogICAgICAgID48L2RlZXMtaW5wdXQtaWJhbj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IlBheW1lbnQgSW5mb3JtYXRpb24ifSAuc3VidGl0bGU9JHsiSUJBTiBpbnB1dCB3aXRoIGhvcml6b250YWwgbGF5b3V0IGZvciBwYXltZW50IGZvcm1zIn0+CiAgICAgICAgPGRpdiBjbGFzcz0icGF5bWVudC1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IAogICAgICAgICAgICAubGFiZWw9JHsiQWNjb3VudCBIb2xkZXIifSAKICAgICAgICAgICAgLmxheW91dE1vZGU9JHsiaG9yaXpvbnRhbCJ9CiAgICAgICAgICAgIC52YWx1ZT0keyJKb2huIERvZSJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LWliYW4gCiAgICAgICAgICAgIC5sYWJlbD0keyJJQkFOIn0gCiAgICAgICAgICAgIC5sYXlvdXRNb2RlPSR7Imhvcml6b250YWwifQogICAgICAgICAgICAudmFsdWU9JHsiR0I4MldFU1QxMjM0NTY5ODc2NTQzMiJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWliYW4+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJWYWxpZGF0aW9uICYgU3RhdGVzIn0gLnN1YnRpdGxlPSR7IlJlcXVpcmVkIGZpZWxkcyBhbmQgZGlzYWJsZWQgc3RhdGVzIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtaWJhbiAKICAgICAgICAgIC5sYWJlbD0keyJQYXltZW50IEFjY291bnQifSAKICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJSZXF1aXJlZCBmb3IgcHJvY2Vzc2luZyBwYXltZW50cyJ9CiAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgID48L2RlZXMtaW5wdXQtaWJhbj4KICAgICAgICAKICAgICAgICA8ZGVlcy1pbnB1dC1pYmFuIAogICAgICAgICAgLmxhYmVsPSR7IkxvY2tlZCBJQkFOIn0gCiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiVGhpcyBJQkFOIGNhbm5vdCBiZSBjaGFuZ2VkIn0KICAgICAgICAgIC52YWx1ZT0keyJGUjE0MjAwNDEwMTAwNTA1MDAwMTNNMDI2MDYifQogICAgICAgICAgLmRpc2FibGVkPSR7dHJ1ZX0KICAgICAgICA+PC9kZWVzLWlucHV0LWliYW4+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJCYW5rIFRyYW5zZmVyIEZvcm0ifSAuc3VidGl0bGU9JHsiQ29tcGxldGUgZm9ybSBleGFtcGxlIHdpdGggSUJBTiB2YWxpZGF0aW9uIn0+CiAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgLmxhYmVsPSR7IlJlY2lwaWVudCBOYW1lIn0gLnJlcXVpcmVkPSR7dHJ1ZX0+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1pYmFuIC5sYWJlbD0keyJSZWNpcGllbnQgSUJBTiJ9IC5yZXF1aXJlZD0ke3RydWV9PjwvZGVlcy1pbnB1dC1pYmFuPgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAubGFiZWw9JHsiVHJhbnNmZXIgUmVmZXJlbmNlIn0gLmRlc2NyaXB0aW9uPSR7Ik9wdGlvbmFsIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zZmVyIn0+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IC5sYWJlbD0keyJBbW91bnQifSAuaW5wdXRUeXBlPSR7Im51bWJlciJ9IC5yZXF1aXJlZD0ke3RydWV9PjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgIDwvZGVlcy1mb3JtPgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2Rpdj4KICA8L2RlZXMtZGVtb3dyYXBwZXI+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1pYmFuL2RlZXMtaW5wdXQtaWJhbi5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2Rpc3RfdHMyNSgpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGUyNyA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMjggPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNJbnB1dEliYW4gPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLWlucHV0LWliYW4iKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0lucHV0QmFzZTsKICBsZXQgX2VudGVyZWRTdHJpbmdfZGVjb3JhdG9yczsKICBsZXQgX2VudGVyZWRTdHJpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lbnRlcmVkU3RyaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lbnRlcmVkSWJhbklzVmFsaWRfZGVjb3JhdG9yczsKICBsZXQgX2VudGVyZWRJYmFuSXNWYWxpZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2VudGVyZWRJYmFuSXNWYWxpZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsdWVfZGVjb3JhdG9yczsKICBsZXQgX3ZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0lucHV0SWJhbjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9lbnRlcmVkU3RyaW5nX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9lbnRlcmVkSWJhbklzVmFsaWRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3ZhbHVlX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IFN0cmluZwogICAgICB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTI3KHRoaXMsIG51bGwsIF9lbnRlcmVkU3RyaW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImVudGVyZWRTdHJpbmciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImVudGVyZWRTdHJpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZW50ZXJlZFN0cmluZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZW50ZXJlZFN0cmluZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9lbnRlcmVkU3RyaW5nX2luaXRpYWxpemVycywgX2VudGVyZWRTdHJpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNyh0aGlzLCBudWxsLCBfZW50ZXJlZEliYW5Jc1ZhbGlkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImVudGVyZWRJYmFuSXNWYWxpZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZW50ZXJlZEliYW5Jc1ZhbGlkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmVudGVyZWRJYmFuSXNWYWxpZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZW50ZXJlZEliYW5Jc1ZhbGlkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2VudGVyZWRJYmFuSXNWYWxpZF9pbml0aWFsaXplcnMsIF9lbnRlcmVkSWJhbklzVmFsaWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNyh0aGlzLCBudWxsLCBfdmFsdWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmFsdWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInZhbHVlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZhbHVlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52YWx1ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF92YWx1ZV9pbml0aWFsaXplcnMsIF92YWx1ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTI3KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0lucHV0SWJhbjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgLy8gU1RBVElDCiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMTk7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiSW5wdXQiXTsKICAgICNlbnRlcmVkU3RyaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczI4KHRoaXMsIF9lbnRlcmVkU3RyaW5nX2luaXRpYWxpemVycywgIiIpOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCBlbnRlcmVkU3RyaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jZW50ZXJlZFN0cmluZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGVudGVyZWRTdHJpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2VudGVyZWRTdHJpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNlbnRlcmVkSWJhbklzVmFsaWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI4KHRoaXMsIF9lbnRlcmVkU3RyaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyOCh0aGlzLCBfZW50ZXJlZEliYW5Jc1ZhbGlkX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBlbnRlcmVkSWJhbklzVmFsaWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNlbnRlcmVkSWJhbklzVmFsaWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBlbnRlcmVkSWJhbklzVmFsaWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2VudGVyZWRJYmFuSXNWYWxpZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyOCh0aGlzLCBfZW50ZXJlZEliYW5Jc1ZhbGlkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyOCh0aGlzLCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IHZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy4jdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB2YWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgLi4uRGVlc0lucHV0QmFzZS5iYXNlU3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIC8qIElCQU4gaW5wdXQgc3BlY2lmaWMgc3R5bGVzIGNhbiBnbyBoZXJlICovCiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImlucHV0LXdyYXBwZXIiPgogICAgICAgIDxkZWVzLWxhYmVsIC5sYWJlbD0ke3RoaXMubGFiZWwgfHwgIklCQU4ifSAuZGVzY3JpcHRpb249JHt0aGlzLmRlc2NyaXB0aW9ufT48L2RlZXMtbGFiZWw+CiAgICAgICAgPGRlZXMtaW5wdXQtdGV4dAogICAgICAgICAgLnZhbHVlPSR7dGhpcy52YWx1ZX0KICAgICAgICAgIC5kaXNhYmxlZD0ke3RoaXMuZGlzYWJsZWR9CiAgICAgICAgICAucmVxdWlyZWQ9JHt0aGlzLnJlcXVpcmVkfQogICAgICAgICAgLnBsYWNlaG9sZGVyPSR7IkRFODkgMzcwNCAwMDQ0IDA1MzIgMDEzMCAwMCJ9CiAgICAgICAgICBAaW5wdXQ9JHsoZXZlbnRBcmcpID0+IHsKICAgICAgICB0aGlzLnZhbGlkYXRlSWJhbihldmVudEFyZyk7CiAgICAgIH19CiAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBjb25zdCBkZWVzSW5wdXRUZXh0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtdGV4dCIpOwogICAgICBpZiAoZGVlc0lucHV0VGV4dCAmJiBkZWVzSW5wdXRUZXh0LmNoYW5nZVN1YmplY3QpIHsKICAgICAgICBkZWVzSW5wdXRUZXh0LmNoYW5nZVN1YmplY3Quc3Vic2NyaWJlKCgpID0+IHsKICAgICAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICBhc3luYyB2YWxpZGF0ZUliYW4oZXZlbnRBcmcpIHsKICAgICAgY29uc3QgaW5wdXRFbGVtZW50ID0gZXZlbnRBcmcudGFyZ2V0OwogICAgICBsZXQgZW50ZXJlZFN0cmluZyA9IGlucHV0RWxlbWVudD8udmFsdWU7CiAgICAgIGVudGVyZWRTdHJpbmcgPSBlbnRlcmVkU3RyaW5nIHx8ICIiOwogICAgICBpZiAodGhpcy5lbnRlcmVkU3RyaW5nICE9PSBlbnRlcmVkU3RyaW5nKSB7CiAgICAgICAgdGhpcy5lbnRlcmVkU3RyaW5nID0gZnJpZW5kbHlGb3JtYXRJQkFOKGVudGVyZWRTdHJpbmcpIHx8ICIiOwogICAgICAgIGlmIChpbnB1dEVsZW1lbnQpIHsKICAgICAgICAgIGlucHV0RWxlbWVudC52YWx1ZSA9IHRoaXMuZW50ZXJlZFN0cmluZzsKICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmVudGVyZWRTdHJpbmc7CiAgICAgICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5lbnRlcmVkSWJhbklzVmFsaWQgPSBpc1ZhbGlkSUJBTih0aGlzLmVudGVyZWRTdHJpbmcucmVwbGFjZSgvIC9nLCAiIikpOwogICAgICBjb25zdCBkZWVzSW5wdXRUZXh0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtdGV4dCIpOwogICAgICBkZWVzSW5wdXRUZXh0LnZhbGlkYXRpb25UZXh0ID0gYElCQU4gaXMgdmFsaWQ6ICR7dGhpcy5lbnRlcmVkSWJhbklzVmFsaWR9YDsKICAgIH0KICAgIGdldFZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy52YWx1ZTsKICAgIH0KICAgIHNldFZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLnZhbHVlID0gdmFsdWUyOwogICAgICB0aGlzLmVudGVyZWRTdHJpbmcgPSBmcmllbmRseUZvcm1hdElCQU4odmFsdWUyKSB8fCAiIjsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczI4KHRoaXMsIF92YWx1ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczI4KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzSW5wdXRJYmFuMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZS9kZWVzLWlucHV0LW11bHRpdG9nZ2xlLmRlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW9GdW5jMjAgPSAoKSA9PiBiMmAKICA8ZGVlcy1kZW1vd3JhcHBlcj4KICAgIDxzdHlsZT4KICAgICAgJHtpYAogICAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMzJweDsKICAgICAgICAgIHBhZGRpbmc6IDQ4cHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y4ZjlmYSIsICIjMGEwYTBhIil9OwogICAgICAgICAgbWluLWhlaWdodDogMTAwdmg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5zZWN0aW9uIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMxODE4MWIiKX07CiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnNlY3Rpb24tZGVzY3JpcHRpb24gewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiNhMWExYWEiKX07CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuc2V0dGluZ3MtZ3JpZCB7CiAgICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICBAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHsKICAgICAgICAgIC5zZXR0aW5ncy1ncmlkIHsKICAgICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBgfQogICAgPC9zdHlsZT4KICAgIAogICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5NdWx0aS1PcHRpb24gVG9nZ2xlPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+U2VsZWN0IGZyb20gbXVsdGlwbGUgb3B0aW9ucyB3aXRoIGEgc21vb3RoIHNsaWRpbmcgaW5kaWNhdG9yIGFuaW1hdGlvbi48L2Rpdj4KICAgICAgICAKICAgICAgICA8ZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZQogICAgICAgICAgLmxhYmVsPSR7IkRpc3BsYXkgTW9kZSJ9CiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiQ2hvb3NlIGhvdyBjb250ZW50IGlzIGRpc3BsYXllZCJ9CiAgICAgICAgICAub3B0aW9ucz0ke1siTGlzdCBWaWV3IiwgIkdyaWQgVmlldyIsICJDb21wYWN0Il19CiAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiR3JpZCBWaWV3In0KICAgICAgICA+PC9kZWVzLWlucHV0LW11bHRpdG9nZ2xlPgogICAgICAgIAogICAgICAgIDxicj48YnI+CiAgICAgICAgCiAgICAgICAgPGRlZXMtaW5wdXQtbXVsdGl0b2dnbGUKICAgICAgICAgIC5sYWJlbD0keyJULVNoaXJ0IFNpemUifQogICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IlNlbGVjdCB5b3VyIHByZWZlcnJlZCBzaXplIn0KICAgICAgICAgIC5vcHRpb25zPSR7WyJYUyIsICJTIiwgIk0iLCAiTCIsICJYTCIsICJYWEwiXX0KICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJNIn0KICAgICAgICA+PC9kZWVzLWlucHV0LW11bHRpdG9nZ2xlPgogICAgICA8L2Rpdj4KICAgICAgCiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPkJvb2xlYW4gVG9nZ2xlPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+U2ltcGxlIG9uL29mZiBzd2l0Y2hlcyB3aXRoIGN1c3RvbWl6YWJsZSBsYWJlbHMgZm9yIGNsZWFyZXIgY29udGV4dC48L2Rpdj4KICAgICAgICAKICAgICAgICA8ZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZQogICAgICAgICAgLmxhYmVsPSR7Ik5vdGlmaWNhdGlvbnMifQogICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IkVuYWJsZSBvciBkaXNhYmxlIHB1c2ggbm90aWZpY2F0aW9ucyJ9CiAgICAgICAgICAudHlwZT0keyJib29sZWFuIn0KICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJ0cnVlIn0KICAgICAgICA+PC9kZWVzLWlucHV0LW11bHRpdG9nZ2xlPgogICAgICAgIAogICAgICAgIDxicj48YnI+CiAgICAgICAgCiAgICAgICAgPGRlZXMtaW5wdXQtbXVsdGl0b2dnbGUKICAgICAgICAgIC5sYWJlbD0keyJUaGVtZSBNb2RlIn0KICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJTd2l0Y2ggYmV0d2VlbiBsaWdodCBhbmQgZGFyayB0aGVtZSJ9CiAgICAgICAgICAudHlwZT0keyJib29sZWFuIn0KICAgICAgICAgIC5ib29sZWFuVHJ1ZU5hbWU9JHsiRGFyayJ9CiAgICAgICAgICAuYm9vbGVhbkZhbHNlTmFtZT0keyJMaWdodCJ9CiAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiRGFyayJ9CiAgICAgICAgPjwvZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZT4KICAgICAgPC9kaXY+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5TZXR0aW5ncyBHcmlkPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+Q29uZmlndXJhdGlvbiBvcHRpb25zIGFycmFuZ2VkIGluIGEgcmVzcG9uc2l2ZSBncmlkIGxheW91dC48L2Rpdj4KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJzZXR0aW5ncy1ncmlkIj4KICAgICAgICAgIDxkZWVzLWlucHV0LW11bHRpdG9nZ2xlCiAgICAgICAgICAgIC5sYWJlbD0keyJBdXRvLVNhdmUifQogICAgICAgICAgICAudHlwZT0keyJib29sZWFuIn0KICAgICAgICAgICAgLmJvb2xlYW5UcnVlTmFtZT0keyJFbmFibGVkIn0KICAgICAgICAgICAgLmJvb2xlYW5GYWxzZU5hbWU9JHsiRGlzYWJsZWQifQogICAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiRW5hYmxlZCJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LW11bHRpdG9nZ2xlPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZQogICAgICAgICAgICAubGFiZWw9JHsiTGFuZ3VhZ2UifQogICAgICAgICAgICAub3B0aW9ucz0ke1siRW5nbGlzaCIsICJHZXJtYW4iLCAiRnJlbmNoIiwgIlNwYW5pc2giXX0KICAgICAgICAgICAgLnNlbGVjdGVkT3B0aW9uPSR7IkVuZ2xpc2gifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZT4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtbXVsdGl0b2dnbGUKICAgICAgICAgICAgLmxhYmVsPSR7IlF1YWxpdHkifQogICAgICAgICAgICAub3B0aW9ucz0ke1siTG93IiwgIk1lZGl1bSIsICJIaWdoIiwgIlVsdHJhIl19CiAgICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJIaWdoIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtbXVsdGl0b2dnbGU+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LW11bHRpdG9nZ2xlCiAgICAgICAgICAgIC5sYWJlbD0keyJQcml2YWN5In0KICAgICAgICAgICAgLnR5cGU9JHsiYm9vbGVhbiJ9CiAgICAgICAgICAgIC5ib29sZWFuVHJ1ZU5hbWU9JHsiUHJpdmF0ZSJ9CiAgICAgICAgICAgIC5ib29sZWFuRmFsc2VOYW1lPSR7IlB1YmxpYyJ9CiAgICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJQcml2YXRlIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtbXVsdGl0b2dnbGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+U3RhdGVzICYgRm9ybSBJbnRlZ3JhdGlvbjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPkV4YW1wbGVzIG9mIGRpc2FibGVkIHN0YXRlcyBhbmQgaW50ZWdyYXRpb24gd2l0aGluIGZvcm1zLjwvZGl2PgogICAgICAgIAogICAgICAgIDxkZWVzLWlucHV0LW11bHRpdG9nZ2xlCiAgICAgICAgICAubGFiZWw9JHsiQWNjb3VudCBUeXBlIn0KICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJUaGlzIHNldHRpbmcgaXMgbG9ja2VkIn0KICAgICAgICAgIC5vcHRpb25zPSR7WyJGcmVlIiwgIlBybyIsICJFbnRlcnByaXNlIl19CiAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiRW50ZXJwcmlzZSJ9CiAgICAgICAgICAuZGlzYWJsZWQ9JHt0cnVlfQogICAgICAgID48L2RlZXMtaW5wdXQtbXVsdGl0b2dnbGU+CiAgICAgICAgCiAgICAgICAgPGJyPjxicj4KICAgICAgICAKICAgICAgICA8ZGVlcy1mb3JtPgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAubGFiZWw9JHsiUHJvamVjdCBOYW1lIn0gLnJlcXVpcmVkPSR7dHJ1ZX0+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZQogICAgICAgICAgICAubGFiZWw9JHsiVmlzaWJpbGl0eSJ9CiAgICAgICAgICAgIC50eXBlPSR7ImJvb2xlYW4ifQogICAgICAgICAgICAuYm9vbGVhblRydWVOYW1lPSR7IlB1YmxpYyJ9CiAgICAgICAgICAgIC5ib29sZWFuRmFsc2VOYW1lPSR7IlByaXZhdGUifQogICAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiUHJpdmF0ZSJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LW11bHRpdG9nZ2xlPgogICAgICAgICAgPGRlZXMtaW5wdXQtbXVsdGl0b2dnbGUKICAgICAgICAgICAgLmxhYmVsPSR7IkxpY2Vuc2UifQogICAgICAgICAgICAub3B0aW9ucz0ke1siTUlUIiwgIkFwYWNoZSAyLjAiLCAiR1BMIHYzIiwgIlByb3ByaWV0YXJ5Il19CiAgICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJNSVQifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZT4KICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2RlZXMtZGVtb3dyYXBwZXI+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZS9kZWVzLWlucHV0LW11bHRpdG9nZ2xlLmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTI4ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMyOSA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0lucHV0TXVsdGl0b2dnbGUgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLWlucHV0LW11bHRpdG9nZ2xlIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNJbnB1dEJhc2U7CiAgbGV0IF90eXBlX2RlY29yYXRvcnM7CiAgbGV0IF90eXBlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdHlwZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYm9vbGVhblRydWVOYW1lX2RlY29yYXRvcnM7CiAgbGV0IF9ib29sZWFuVHJ1ZU5hbWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ib29sZWFuVHJ1ZU5hbWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Jvb2xlYW5GYWxzZU5hbWVfZGVjb3JhdG9yczsKICBsZXQgX2Jvb2xlYW5GYWxzZU5hbWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ib29sZWFuRmFsc2VOYW1lX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vcHRpb25zX2RlY29yYXRvcnM7CiAgbGV0IF9vcHRpb25zX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfb3B0aW9uc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRPcHRpb25fZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkT3B0aW9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRPcHRpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Jvb2xWYWx1ZV9kZWNvcmF0b3JzOwogIGxldCBfYm9vbFZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYm9vbFZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNJbnB1dE11bHRpdG9nZ2xlMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3R5cGVfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX2Jvb2xlYW5UcnVlTmFtZV9kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfYm9vbGVhbkZhbHNlTmFtZV9kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfb3B0aW9uc19kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBBcnJheQogICAgICB9KV07CiAgICAgIF9zZWxlY3RlZE9wdGlvbl9kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfYm9vbFZhbHVlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX19lc0RlY29yYXRlMjgodGhpcywgbnVsbCwgX3R5cGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidHlwZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidHlwZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50eXBlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50eXBlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3R5cGVfaW5pdGlhbGl6ZXJzLCBfdHlwZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTI4KHRoaXMsIG51bGwsIF9ib29sZWFuVHJ1ZU5hbWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYm9vbGVhblRydWVOYW1lIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJib29sZWFuVHJ1ZU5hbWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYm9vbGVhblRydWVOYW1lLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5ib29sZWFuVHJ1ZU5hbWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYm9vbGVhblRydWVOYW1lX2luaXRpYWxpemVycywgX2Jvb2xlYW5UcnVlTmFtZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTI4KHRoaXMsIG51bGwsIF9ib29sZWFuRmFsc2VOYW1lX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImJvb2xlYW5GYWxzZU5hbWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImJvb2xlYW5GYWxzZU5hbWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYm9vbGVhbkZhbHNlTmFtZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYm9vbGVhbkZhbHNlTmFtZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9ib29sZWFuRmFsc2VOYW1lX2luaXRpYWxpemVycywgX2Jvb2xlYW5GYWxzZU5hbWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyOCh0aGlzLCBudWxsLCBfb3B0aW9uc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJvcHRpb25zIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJvcHRpb25zIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm9wdGlvbnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm9wdGlvbnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfb3B0aW9uc19pbml0aWFsaXplcnMsIF9vcHRpb25zX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjgodGhpcywgbnVsbCwgX3NlbGVjdGVkT3B0aW9uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlbGVjdGVkT3B0aW9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3RlZE9wdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWxlY3RlZE9wdGlvbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VsZWN0ZWRPcHRpb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0ZWRPcHRpb25faW5pdGlhbGl6ZXJzLCBfc2VsZWN0ZWRPcHRpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyOCh0aGlzLCBudWxsLCBfYm9vbFZhbHVlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImJvb2xWYWx1ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYm9vbFZhbHVlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmJvb2xWYWx1ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYm9vbFZhbHVlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Jvb2xWYWx1ZV9pbml0aWFsaXplcnMsIF9ib29sVmFsdWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyOChudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNJbnB1dE11bHRpdG9nZ2xlMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMjA7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiSW5wdXQiXTsKICAgICN0eXBlX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczI5KHRoaXMsIF90eXBlX2luaXRpYWxpemVycywgIm11bHRpIik7CiAgICBnZXQgdHlwZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3R5cGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0eXBlKHZhbHVlMikgewogICAgICB0aGlzLiN0eXBlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYm9vbGVhblRydWVOYW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyOSh0aGlzLCBfdHlwZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjkodGhpcywgX2Jvb2xlYW5UcnVlTmFtZV9pbml0aWFsaXplcnMsICJ0cnVlIikpOwogICAgZ2V0IGJvb2xlYW5UcnVlTmFtZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2Jvb2xlYW5UcnVlTmFtZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGJvb2xlYW5UcnVlTmFtZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYm9vbGVhblRydWVOYW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYm9vbGVhbkZhbHNlTmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjkodGhpcywgX2Jvb2xlYW5UcnVlTmFtZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjkodGhpcywgX2Jvb2xlYW5GYWxzZU5hbWVfaW5pdGlhbGl6ZXJzLCAiZmFsc2UiKSk7CiAgICBnZXQgYm9vbGVhbkZhbHNlTmFtZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2Jvb2xlYW5GYWxzZU5hbWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBib29sZWFuRmFsc2VOYW1lKHZhbHVlMikgewogICAgICB0aGlzLiNib29sZWFuRmFsc2VOYW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjb3B0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjkodGhpcywgX2Jvb2xlYW5GYWxzZU5hbWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczI5KHRoaXMsIF9vcHRpb25zX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBvcHRpb25zKCkgewogICAgICByZXR1cm4gdGhpcy4jb3B0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG9wdGlvbnModmFsdWUyKSB7CiAgICAgIHRoaXMuI29wdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWxlY3RlZE9wdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjkodGhpcywgX29wdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczI5KHRoaXMsIF9zZWxlY3RlZE9wdGlvbl9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgc2VsZWN0ZWRPcHRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZE9wdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNlbGVjdGVkT3B0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3RlZE9wdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2Jvb2xWYWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjkodGhpcywgX3NlbGVjdGVkT3B0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyOSh0aGlzLCBfYm9vbFZhbHVlX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBib29sVmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNib29sVmFsdWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBib29sVmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2Jvb2xWYWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgLy8gQWRkIHZhbHVlIHByb3BlcnR5IGZvciBmb3JtIGNvbXBhdGliaWxpdHkKICAgIGdldCB2YWx1ZSgpIHsKICAgICAgaWYgKHRoaXMudHlwZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRPcHRpb24gPT09IHRoaXMuYm9vbGVhblRydWVOYW1lOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkT3B0aW9uOwogICAgfQogICAgc2V0IHZhbHVlKHZhbCkgewogICAgICBpZiAodGhpcy50eXBlID09PSAiYm9vbGVhbiIgJiYgdHlwZW9mIHZhbCA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IHZhbCA/IHRoaXMuYm9vbGVhblRydWVOYW1lIDogdGhpcy5ib29sZWFuRmFsc2VOYW1lOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSB2YWw7CiAgICAgIH0KICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7CiAgICAgIGlmICh0aGlzLmhhc1VwZGF0ZWQpIHsKICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgICAgdGhpcy5zZXRJbmRpY2F0b3IoKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICAuLi5EZWVzSW5wdXRCYXNlLmJhc2VTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICB9CgogICAgICAuc2VsZWN0aW9ucyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzE4MTgxYiIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA1KTsKICAgICAgfQoKICAgICAgLm9wdGlvbiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDhweCAyMHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzIGVhc2U7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM3MTcxN2EiKX07CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgfQoKICAgICAgLm9wdGlvbjpob3ZlciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTgxODFiIiwgIiNlNGU0ZTciKX07CiAgICAgIH0KCiAgICAgIC5vcHRpb24uc2VsZWN0ZWQgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjNjBhNWZhIil9OwogICAgICB9CgogICAgICAuaW5kaWNhdG9yIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDhweCk7CiAgICAgICAgdG9wOiA0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDU5LCAxMzAsIDI0NiwgMC4xNSkiLCAicmdiYSg1OSwgMTMwLCAyNDYsIDAuMTUpIil9OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQogICAgICAKICAgICAgLmluZGljYXRvci5uby10cmFuc2l0aW9uIHsKICAgICAgICB0cmFuc2l0aW9uOiBub25lOwogICAgICB9CiAgICAgIAogICAgICA6aG9zdChbZGlzYWJsZWRdKSAuc2VsZWN0aW9ucyB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIC5vcHRpb24gewogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIC5pbmRpY2F0b3IgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDExMywgMTEzLCAxMjIsIDAuMTUpIiwgInJnYmEoMTEzLCAxMTMsIDEyMiwgMC4xNSkiKX07CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgICAgPGRlZXMtbGFiZWwgLmxhYmVsPSR7dGhpcy5sYWJlbH0gLmRlc2NyaXB0aW9uPSR7dGhpcy5kZXNjcmlwdGlvbn0+PC9kZWVzLWxhYmVsPgogICAgICAgIDxkaXYgY2xhc3M9Im1haW5ib3giPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2VsZWN0aW9ucyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmRpY2F0b3IiPjwvZGl2PgogICAgICAgICAgJHt0aGlzLm9wdGlvbnMubWFwKChvcHRpb24yKSA9PiBiMmA8ZGl2IGNsYXNzPSJvcHRpb24gJHtvcHRpb24yID09PSB0aGlzLnNlbGVjdGVkT3B0aW9uID8gInNlbGVjdGVkIiA6ICIifSIgQGNsaWNrPSR7KCkgPT4gdGhpcy5oYW5kbGVTZWxlY3Rpb24ob3B0aW9uMil9PgogICAgICAgICAgICAgICAgJHtvcHRpb24yfQogICAgICAgICAgICAgIDwvZGl2PiBgKX0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgaWYgKHRoaXMudHlwZSA9PT0gImJvb2xlYW4iICYmIHRoaXMub3B0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgICB0aGlzLm9wdGlvbnMgPSBbdGhpcy5ib29sZWFuVHJ1ZU5hbWUgfHwgInRydWUiLCB0aGlzLmJvb2xlYW5GYWxzZU5hbWUgfHwgImZhbHNlIl07CiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkT3B0aW9uKSB7CiAgICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uID0gdGhpcy5ib29sZWFuRmFsc2VOYW1lIHx8ICJmYWxzZSI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdGhpcy5zZWxlY3RlZE9wdGlvbiAmJiB0aGlzLm9wdGlvbnMubGVuZ3RoID4gMCkgewogICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSB0aGlzLm9wdGlvbnNbMF07CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGlmICh0aGlzLnR5cGUgPT09ICJib29sZWFuIikgewogICAgICAgIHRoaXMub3B0aW9ucyA9IFt0aGlzLmJvb2xlYW5UcnVlTmFtZSB8fCAidHJ1ZSIsIHRoaXMuYm9vbGVhbkZhbHNlTmFtZSB8fCAiZmFsc2UiXTsKICAgICAgfQogICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlOwogICAgICBpZiAoZG9jdW1lbnQuZm9udHMpIHsKICAgICAgICBhd2FpdCBkb2N1bWVudC5mb250cy5yZWFkeTsKICAgICAgfQogICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShyZXNvbHZlMikpOwogICAgICB0aGlzLnNldEluZGljYXRvcigpOwogICAgfQogICAgYXN5bmMgaGFuZGxlU2VsZWN0aW9uKG9wdGlvbkFyZykgewogICAgICBpZiAodGhpcy5kaXNhYmxlZCkKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSBvcHRpb25Bcmc7CiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgdGhpcy5zZXRJbmRpY2F0b3IoKTsKICAgIH0KICAgIGluZGljYXRvckluaXRpYWxpemVkID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjkodGhpcywgX2Jvb2xWYWx1ZV9leHRyYUluaXRpYWxpemVycyksIGZhbHNlKTsKICAgIGFzeW5jIHNldEluZGljYXRvcigpIHsKICAgICAgY29uc3QgaW5kaWNhdG9yID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5pbmRpY2F0b3IiKTsKICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRleCA9IHRoaXMub3B0aW9ucy5pbmRleE9mKHRoaXMuc2VsZWN0ZWRPcHRpb24pOwogICAgICBpZiAoc2VsZWN0ZWRJbmRleCA9PT0gLTEgfHwgIWluZGljYXRvcikgewogICAgICAgIGlmIChpbmRpY2F0b3IpIHsKICAgICAgICAgIGluZGljYXRvci5zdHlsZS5vcGFjaXR5ID0gIjAiOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgb3B0aW9uMiA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGAub3B0aW9uOm50aC1jaGlsZCgke3NlbGVjdGVkSW5kZXggKyAyfSlgKTsKICAgICAgaWYgKGluZGljYXRvciAmJiBvcHRpb24yKSB7CiAgICAgICAgaWYgKCF0aGlzLmluZGljYXRvckluaXRpYWxpemVkKSB7CiAgICAgICAgICBpbmRpY2F0b3IuY2xhc3NMaXN0LmFkZCgibm8tdHJhbnNpdGlvbiIpOwogICAgICAgICAgdGhpcy5pbmRpY2F0b3JJbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgaW5kaWNhdG9yLmNsYXNzTGlzdC5yZW1vdmUoIm5vLXRyYW5zaXRpb24iKTsKICAgICAgICAgIH0sIDUwKTsKICAgICAgICB9CiAgICAgICAgaW5kaWNhdG9yLnN0eWxlLndpZHRoID0gYCR7b3B0aW9uMi5jbGllbnRXaWR0aH1weGA7CiAgICAgICAgaW5kaWNhdG9yLnN0eWxlLmxlZnQgPSBgJHtvcHRpb24yLm9mZnNldExlZnR9cHhgOwogICAgICAgIGluZGljYXRvci5zdHlsZS5vcGFjaXR5ID0gIjEiOwogICAgICB9CiAgICB9CiAgICBnZXRWYWx1ZSgpIHsKICAgICAgaWYgKHRoaXMudHlwZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRPcHRpb24gPT09IHRoaXMuYm9vbGVhblRydWVOYW1lOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkT3B0aW9uOwogICAgfQogICAgc2V0VmFsdWUodmFsdWUyKSB7CiAgICAgIGlmICh0aGlzLnR5cGUgPT09ICJib29sZWFuIiAmJiB0eXBlb2YgdmFsdWUyID09PSAiYm9vbGVhbiIpIHsKICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uID0gdmFsdWUyID8gdGhpcy5ib29sZWFuVHJ1ZU5hbWUgfHwgInRydWUiIDogdGhpcy5ib29sZWFuRmFsc2VOYW1lIHx8ICJmYWxzZSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IHZhbHVlMjsKICAgICAgfQogICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgaWYgKHRoaXMuaGFzVXBkYXRlZCkgewogICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICB0aGlzLnNldEluZGljYXRvcigpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczI5KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzSW5wdXRNdWx0aXRvZ2dsZTIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtcGhvbmUvZGVlcy1pbnB1dC1waG9uZS5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vRnVuYzIxID0gKCkgPT4gYjJgCiAgPGRlZXMtZGVtb3dyYXBwZXI+CiAgICA8c3R5bGU+CiAgICAgICR7aWAKICAgICAgICAuZGVtby1jb250YWluZXIgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICBnYXA6IDI0cHg7CiAgICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgICAgbWF4LXdpZHRoOiAxMjAwcHg7CiAgICAgICAgICBtYXJnaW46IDAgYXV0bzsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmhvcml6b250YWwtZ3JvdXAgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBnYXA6IDE2cHg7CiAgICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgfQogICAgICBgfQogICAgPC9zdHlsZT4KICAgIAogICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiQmFzaWMgUGhvbmUgSW5wdXQifSAuc3VidGl0bGU9JHsiQXV0b21hdGljIGZvcm1hdHRpbmcgZm9yIHBob25lIG51bWJlcnMifT4KICAgICAgICA8ZGVlcy1pbnB1dC1waG9uZSAKICAgICAgICAgIC5sYWJlbD0keyJQaG9uZSBOdW1iZXIifSAKICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJFbnRlciB5b3VyIHBob25lIG51bWJlciB3aXRoIGNvdW50cnkgY29kZSJ9CiAgICAgICAgICAudmFsdWU9JHsiNTU1MTIzNDU2NyJ9CiAgICAgICAgPjwvZGVlcy1pbnB1dC1waG9uZT4KICAgICAgICAKICAgICAgICA8ZGVlcy1pbnB1dC1waG9uZSAKICAgICAgICAgIC5sYWJlbD0keyJDb250YWN0IFBob25lIn0gCiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiUmVxdWlyZWQgZm9yIGFjY291bnQgdmVyaWZpY2F0aW9uIn0KICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICAucGxhY2Vob2xkZXI9JHsiKzEgKDU1NSkgMDAwLTAwMDAifQogICAgICAgID48L2RlZXMtaW5wdXQtcGhvbmU+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJIb3Jpem9udGFsIExheW91dCJ9IC5zdWJ0aXRsZT0keyJQaG9uZSBpbnB1dHMgYXJyYW5nZWQgaG9yaXpvbnRhbGx5In0+CiAgICAgICAgPGRpdiBjbGFzcz0iaG9yaXpvbnRhbC1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1waG9uZSAKICAgICAgICAgICAgLmxhYmVsPSR7Ik1vYmlsZSJ9IAogICAgICAgICAgICAubGF5b3V0TW9kZT0keyJob3Jpem9udGFsIn0KICAgICAgICAgICAgLnZhbHVlPSR7IjQxNTU1NTEyMzQifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1waG9uZT4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtcGhvbmUgCiAgICAgICAgICAgIC5sYWJlbD0keyJPZmZpY2UifSAKICAgICAgICAgICAgLmxheW91dE1vZGU9JHsiaG9yaXpvbnRhbCJ9CiAgICAgICAgICAgIC5wbGFjZWhvbGRlcj0keyIrMSAoODAwKSA1NTUtMDAwMCJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXBob25lPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiSW50ZXJuYXRpb25hbCBOdW1iZXJzIn0gLnN1YnRpdGxlPSR7IlN1cHBvcnRzIGZvcm1hdHRpbmcgZm9yIG51bWJlcnMgd2l0aCBjb3VudHJ5IGNvZGVzIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtcGhvbmUgCiAgICAgICAgICAubGFiZWw9JHsiSW50ZXJuYXRpb25hbCBDb250YWN0In0gCiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiQXV0b21hdGljYWxseSBmb3JtYXRzIGludGVybmF0aW9uYWwgbnVtYmVycyJ9CiAgICAgICAgICAudmFsdWU9JHsiNDQxMjM0NTY3ODkwIn0KICAgICAgICA+PC9kZWVzLWlucHV0LXBob25lPgogICAgICAgIAogICAgICAgIDxkZWVzLWlucHV0LXBob25lIAogICAgICAgICAgLmxhYmVsPSR7IkVtZXJnZW5jeSBDb250YWN0In0gCiAgICAgICAgICAudmFsdWU9JHsiOTExIn0KICAgICAgICAgIC5kaXNhYmxlZD0ke3RydWV9CiAgICAgICAgPjwvZGVlcy1pbnB1dC1waG9uZT4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkZvcm0gSW50ZWdyYXRpb24ifSAuc3VidGl0bGU9JHsiUGhvbmUgaW5wdXQgYXMgcGFydCBvZiBhIGNvbnRhY3QgZm9ybSJ9PgogICAgICAgIDxkZWVzLWZvcm0+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IC5sYWJlbD0keyJGdWxsIE5hbWUifSAucmVxdWlyZWQ9JHt0cnVlfT48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIDxkZWVzLWlucHV0LXBob25lIC5sYWJlbD0keyJQaG9uZSBOdW1iZXIifSAucmVxdWlyZWQ9JHt0cnVlfT48L2RlZXMtaW5wdXQtcGhvbmU+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IC5sYWJlbD0keyJFbWFpbCJ9IC5pbnB1dFR5cGU9JHsiZW1haWwifT48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kaXY+CiAgPC9kZWVzLWRlbW93cmFwcGVyPgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtcGhvbmUvZGVlcy1pbnB1dC1waG9uZS5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2Rpc3RfdHMyNSgpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGUyOSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMzAgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNJbnB1dFBob25lID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1pbnB1dC1waG9uZSIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzSW5wdXRCYXNlOwogIGxldCBfZm9ybWF0dGVkUGhvbmVfZGVjb3JhdG9yczsKICBsZXQgX2Zvcm1hdHRlZFBob25lX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZm9ybWF0dGVkUGhvbmVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbHVlX2RlY29yYXRvcnM7CiAgbGV0IF92YWx1ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wbGFjZWhvbGRlcl9kZWNvcmF0b3JzOwogIGxldCBfcGxhY2Vob2xkZXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wbGFjZWhvbGRlcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW5wdXRQaG9uZTIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9mb3JtYXR0ZWRQaG9uZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfdmFsdWVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9wbGFjZWhvbGRlcl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX19lc0RlY29yYXRlMjkodGhpcywgbnVsbCwgX2Zvcm1hdHRlZFBob25lX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImZvcm1hdHRlZFBob25lIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJmb3JtYXR0ZWRQaG9uZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5mb3JtYXR0ZWRQaG9uZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZm9ybWF0dGVkUGhvbmUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZm9ybWF0dGVkUGhvbmVfaW5pdGlhbGl6ZXJzLCBfZm9ybWF0dGVkUGhvbmVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyOSh0aGlzLCBudWxsLCBfdmFsdWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmFsdWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInZhbHVlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZhbHVlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52YWx1ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF92YWx1ZV9pbml0aWFsaXplcnMsIF92YWx1ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTI5KHRoaXMsIG51bGwsIF9wbGFjZWhvbGRlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwbGFjZWhvbGRlciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicGxhY2Vob2xkZXIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucGxhY2Vob2xkZXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnBsYWNlaG9sZGVyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3BsYWNlaG9sZGVyX2luaXRpYWxpemVycywgX3BsYWNlaG9sZGVyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjkobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzSW5wdXRQaG9uZTIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgLy8gU1RBVElDCiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMjE7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiSW5wdXQiXTsKICAgICNmb3JtYXR0ZWRQaG9uZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMzMCh0aGlzLCBfZm9ybWF0dGVkUGhvbmVfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IGZvcm1hdHRlZFBob25lKCkgewogICAgICByZXR1cm4gdGhpcy4jZm9ybWF0dGVkUGhvbmVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBmb3JtYXR0ZWRQaG9uZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZm9ybWF0dGVkUGhvbmVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzAodGhpcywgX2Zvcm1hdHRlZFBob25lX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzMCh0aGlzLCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IHZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy4jdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB2YWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNwbGFjZWhvbGRlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzAodGhpcywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzMCh0aGlzLCBfcGxhY2Vob2xkZXJfaW5pdGlhbGl6ZXJzLCAiKzEgKDU1NSkgMTIzLTQ1NjciKSk7CiAgICBnZXQgcGxhY2Vob2xkZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwbGFjZWhvbGRlcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHBsYWNlaG9sZGVyKHZhbHVlMikgewogICAgICB0aGlzLiNwbGFjZWhvbGRlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICAuLi5EZWVzSW5wdXRCYXNlLmJhc2VTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgLyogUGhvbmUgaW5wdXQgc3BlY2lmaWMgc3R5bGVzIGNhbiBnbyBoZXJlICovCiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImlucHV0LXdyYXBwZXIiPgogICAgICAgIDxkZWVzLWxhYmVsIC5sYWJlbD0ke3RoaXMubGFiZWx9IC5kZXNjcmlwdGlvbj0ke3RoaXMuZGVzY3JpcHRpb259PjwvZGVlcy1sYWJlbD4KICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0CiAgICAgICAgICAudmFsdWU9JHt0aGlzLmZvcm1hdHRlZFBob25lfQogICAgICAgICAgLmRpc2FibGVkPSR7dGhpcy5kaXNhYmxlZH0KICAgICAgICAgIC5yZXF1aXJlZD0ke3RoaXMucmVxdWlyZWR9CiAgICAgICAgICAucGxhY2Vob2xkZXI9JHt0aGlzLnBsYWNlaG9sZGVyfQogICAgICAgICAgQGlucHV0PSR7KGV2ZW50KSA9PiB0aGlzLmhhbmRsZVBob25lSW5wdXQoZXZlbnQpfQogICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcykgewogICAgICBzdXBlci5maXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgaWYgKHRoaXMudmFsdWUpIHsKICAgICAgICB0aGlzLmZvcm1hdHRlZFBob25lID0gdGhpcy5mb3JtYXRQaG9uZU51bWJlcih0aGlzLnZhbHVlKTsKICAgICAgfQogICAgICBjb25zdCBpbm5lcklucHV0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtdGV4dCIpOwogICAgICBpZiAoaW5uZXJJbnB1dCAmJiBpbm5lcklucHV0LmNoYW5nZVN1YmplY3QpIHsKICAgICAgICBpbm5lcklucHV0LmNoYW5nZVN1YmplY3Quc3Vic2NyaWJlKCgpID0+IHsKICAgICAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVQaG9uZUlucHV0KGV2ZW50KSB7CiAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0OwogICAgICBjb25zdCBjbGVhbmVkVmFsdWUgPSB0aGlzLmNsZWFuUGhvbmVOdW1iZXIoaW5wdXQudmFsdWUpOwogICAgICBjb25zdCBmb3JtYXR0ZWQgPSB0aGlzLmZvcm1hdFBob25lTnVtYmVyKGNsZWFuZWRWYWx1ZSk7CiAgICAgIGlmIChpbnB1dC52YWx1ZSAhPT0gZm9ybWF0dGVkKSB7CiAgICAgICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBpbnB1dC5zZWxlY3Rpb25TdGFydCB8fCAwOwogICAgICAgIGlucHV0LnZhbHVlID0gZm9ybWF0dGVkOwogICAgICAgIGNvbnN0IG5ld0N1cnNvclBvcyA9IHRoaXMuY2FsY3VsYXRlQ3Vyc29yUG9zaXRpb24oY2xlYW5lZFZhbHVlLCBmb3JtYXR0ZWQsIGN1cnNvclBvc2l0aW9uKTsKICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShuZXdDdXJzb3JQb3MsIG5ld0N1cnNvclBvcyk7CiAgICAgIH0KICAgICAgdGhpcy5mb3JtYXR0ZWRQaG9uZSA9IGZvcm1hdHRlZDsKICAgICAgdGhpcy52YWx1ZSA9IGNsZWFuZWRWYWx1ZTsKICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICB9CiAgICBjbGVhblBob25lTnVtYmVyKHZhbHVlMikgewogICAgICByZXR1cm4gdmFsdWUyLnJlcGxhY2UoL1xEL2csICIiKTsKICAgIH0KICAgIGZvcm1hdFBob25lTnVtYmVyKHZhbHVlMikgewogICAgICBjb25zdCBjbGVhbmVkID0gdGhpcy5jbGVhblBob25lTnVtYmVyKHZhbHVlMik7CiAgICAgIGlmIChjbGVhbmVkLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm4gIiI7CiAgICAgIGlmIChjbGVhbmVkLmxlbmd0aCA8PSAzKQogICAgICAgIHJldHVybiBjbGVhbmVkOwogICAgICBpZiAoY2xlYW5lZC5sZW5ndGggPD0gNikKICAgICAgICByZXR1cm4gYCgke2NsZWFuZWQuc2xpY2UoMCwgMyl9KSAke2NsZWFuZWQuc2xpY2UoMyl9YDsKICAgICAgaWYgKGNsZWFuZWQubGVuZ3RoIDw9IDEwKQogICAgICAgIHJldHVybiBgKCR7Y2xlYW5lZC5zbGljZSgwLCAzKX0pICR7Y2xlYW5lZC5zbGljZSgzLCA2KX0tJHtjbGVhbmVkLnNsaWNlKDYpfWA7CiAgICAgIHJldHVybiBgKyR7Y2xlYW5lZC5zbGljZSgwLCBjbGVhbmVkLmxlbmd0aCAtIDEwKX0gKCR7Y2xlYW5lZC5zbGljZSgtMTAsIC03KX0pICR7Y2xlYW5lZC5zbGljZSgtNywgLTQpfS0ke2NsZWFuZWQuc2xpY2UoLTQpfWA7CiAgICB9CiAgICBjYWxjdWxhdGVDdXJzb3JQb3NpdGlvbihjbGVhbmVkLCBmb3JtYXR0ZWQsIG9sZFBvcykgewogICAgICBsZXQgZm9ybWF0dGluZ0NoYXJzID0gMDsKICAgICAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgb2xkUG9zICYmIGkxMSA8IGZvcm1hdHRlZC5sZW5ndGg7IGkxMSsrKSB7CiAgICAgICAgaWYgKCEvXGQvLnRlc3QoZm9ybWF0dGVkW2kxMV0pKSB7CiAgICAgICAgICBmb3JtYXR0aW5nQ2hhcnMrKzsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIE1hdGgubWluKG9sZFBvcyArIGZvcm1hdHRpbmdDaGFycywgZm9ybWF0dGVkLmxlbmd0aCk7CiAgICB9CiAgICBnZXRWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMudmFsdWU7CiAgICB9CiAgICBzZXRWYWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlMjsKICAgICAgdGhpcy5mb3JtYXR0ZWRQaG9uZSA9IHRoaXMuZm9ybWF0UGhvbmVOdW1iZXIodmFsdWUyKTsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczMwKHRoaXMsIF9wbGFjZWhvbGRlcl9leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczMwKF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzSW5wdXRQaG9uZTIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtdG9nZ2xlL2RlZXMtaW5wdXQtdG9nZ2xlLmRlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW9GdW5jMjIgPSAoKSA9PiBiMmAKICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IHRvZ2dsZUFsbE9uQnRuID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjdG9nZ2xlLWFsbC1vbiIpOwogIGNvbnN0IHRvZ2dsZUFsbE9mZkJ0biA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiI3RvZ2dsZS1hbGwtb2ZmIik7CiAgY29uc3QgZmVhdHVyZVRvZ2dsZXMgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3JBbGwoIi5mZWF0dXJlLXRvZ2dsZXMgZGVlcy1pbnB1dC10b2dnbGUiKTsKICBpZiAodG9nZ2xlQWxsT25CdG4gJiYgdG9nZ2xlQWxsT2ZmQnRuKSB7CiAgICB0b2dnbGVBbGxPbkJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgZmVhdHVyZVRvZ2dsZXMuZm9yRWFjaCgodG9nZ2xlKSA9PiB7CiAgICAgICAgaWYgKCF0b2dnbGUuZGlzYWJsZWQgJiYgIXRvZ2dsZS5yZXF1aXJlZCkgewogICAgICAgICAgdG9nZ2xlLnZhbHVlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgICB0b2dnbGVBbGxPZmZCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGZlYXR1cmVUb2dnbGVzLmZvckVhY2goKHRvZ2dsZSkgPT4gewogICAgICAgIGlmICghdG9nZ2xlLmRpc2FibGVkICYmICF0b2dnbGUucmVxdWlyZWQpIHsKICAgICAgICAgIHRvZ2dsZS52YWx1ZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICB9Cn19PgogICAgPHN0eWxlPgogICAgICAke2lgCiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICAgIG1heC13aWR0aDogMTIwMHB4OwogICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQoKICAgICAgICBkZWVzLXBhbmVsIHsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgICAgfQoKICAgICAgICBkZWVzLXBhbmVsOmxhc3QtY2hpbGQgewogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgICB9CgogICAgICAgIC50b2dnbGUtZ3JvdXAgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICBnYXA6IDE2cHg7CiAgICAgICAgfQoKICAgICAgICAuaG9yaXpvbnRhbC10b2dnbGVzIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBnYXA6IDMycHg7CiAgICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgfQoKICAgICAgICAuaW50ZXJhY3RpdmUtc2VjdGlvbiB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICAgICAgfQoKICAgICAgICAub3V0cHV0LXRleHQgewogICAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSAyNi43JSkiLCAiaHNsKDIxMCA0MCUgODAlKSIpfTsKICAgICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5OCUpIiwgImhzbCgyMTUgMjAuMiUgMTEuOCUpIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgbWluLWhlaWdodDogMjRweDsKICAgICAgICB9CgogICAgICAgIC5zZXR0aW5ncy1zZWN0aW9uIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NyUpIiwgImhzbCgwIDAlIDclKSIpfTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgICB9CgogICAgICAgIC5idXR0b24tZ3JvdXAgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGdhcDogOHB4OwogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgICB9CgogICAgICAgIC5mZWF0dXJlLXRvZ2dsZXMgewogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMjE1IDIwLjIlIDExLjglKSIpfTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgOTEuNCUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICB9CgogICAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDguOCUpIiwgImhzbCgyMTAgNDAlIDk4JSkiKX07CiAgICAgICAgfQoKICAgICAgICAuZHJhZy1oaW50IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDUuMSUpIiwgImhzbCgwIDAlIDYzLjklKSIpfTsKICAgICAgICAgIG1hcmdpbi10b3A6IDhweDsKICAgICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICB9CiAgICAgIGB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkJhc2ljIFRvZ2dsZSJ9IC5zdWJ0aXRsZT0keyJTaW1wbGUgb24vb2ZmIHRvZ2dsZSBzd2l0Y2ggd2l0aCBkcmFnIHN1cHBvcnQifT4KICAgICAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtZ3JvdXAiPgogICAgICAgICAgPGRlZXMtaW5wdXQtdG9nZ2xlCiAgICAgICAgICAgIC5sYWJlbD0keyJFbmFibGUgZmVhdHVyZSJ9CiAgICAgICAgICAgIC52YWx1ZT0ke2ZhbHNlfQogICAgICAgICAgICAua2V5PSR7ImJhc2ljIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdG9nZ2xlPgoKICAgICAgICAgIDxkZWVzLWlucHV0LXRvZ2dsZQogICAgICAgICAgICAubGFiZWw9JHsiQWN0aXZlIHRvZ2dsZSJ9CiAgICAgICAgICAgIC52YWx1ZT0ke3RydWV9CiAgICAgICAgICAgIC5rZXk9JHsiYWN0aXZlIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdG9nZ2xlPgoKICAgICAgICAgIDxkZWVzLWlucHV0LXRvZ2dsZQogICAgICAgICAgICAubGFiZWw9JHsiV2l0aCBkZXNjcmlwdGlvbiJ9CiAgICAgICAgICAgIC52YWx1ZT0ke2ZhbHNlfQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiVGhpcyB0b2dnbGUgaGFzIGFkZGl0aW9uYWwgaGVscGVyIHRleHQgZXhwbGFpbmluZyBpdHMgcHVycG9zZSJ9CiAgICAgICAgICAgIC5rZXk9JHsid2l0aERlc2MifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHAgY2xhc3M9ImRyYWctaGludCI+VGlwOiBZb3UgY2FuIGRyYWcgdGhlIHRvZ2dsZSBrbm9iIHRvIHN3aXRjaCBzdGF0ZXM8L3A+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJUb2dnbGUgU3RhdGVzIn0gLnN1YnRpdGxlPSR7IkRpZmZlcmVudCB0b2dnbGUgc3RhdGVzIGFuZCBjb25maWd1cmF0aW9ucyJ9PgogICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10b2dnbGUKICAgICAgICAgICAgLmxhYmVsPSR7IkRlZmF1bHQgKG9mZikifQogICAgICAgICAgICAudmFsdWU9JHtmYWxzZX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdG9nZ2xlPgoKICAgICAgICAgIDxkZWVzLWlucHV0LXRvZ2dsZQogICAgICAgICAgICAubGFiZWw9JHsiRW5hYmxlZCAob24pIn0KICAgICAgICAgICAgLnZhbHVlPSR7dHJ1ZX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdG9nZ2xlPgoKICAgICAgICAgIDxkZWVzLWlucHV0LXRvZ2dsZQogICAgICAgICAgICAubGFiZWw9JHsiRGlzYWJsZWQgKG9mZikifQogICAgICAgICAgICAudmFsdWU9JHtmYWxzZX0KICAgICAgICAgICAgLmRpc2FibGVkPSR7dHJ1ZX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdG9nZ2xlPgoKICAgICAgICAgIDxkZWVzLWlucHV0LXRvZ2dsZQogICAgICAgICAgICAubGFiZWw9JHsiRGlzYWJsZWQgKG9uKSJ9CiAgICAgICAgICAgIC52YWx1ZT0ke3RydWV9CiAgICAgICAgICAgIC5kaXNhYmxlZD0ke3RydWV9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXRvZ2dsZT4KCiAgICAgICAgICA8ZGVlcy1pbnB1dC10b2dnbGUKICAgICAgICAgICAgLmxhYmVsPSR7IlJlcXVpcmVkIChhbHdheXMgb24pIn0KICAgICAgICAgICAgLnZhbHVlPSR7dHJ1ZX0KICAgICAgICAgICAgLnJlcXVpcmVkPSR7dHJ1ZX0KICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IlRoaXMgdG9nZ2xlIGNhbm5vdCBiZSB0dXJuZWQgb2ZmIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdG9nZ2xlPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiSG9yaXpvbnRhbCBMYXlvdXQifSAuc3VidGl0bGU9JHsiVG9nZ2xlcyBhcnJhbmdlZCBob3Jpem9udGFsbHkgZm9yIGNvbXBhY3QgaW50ZXJmYWNlcyJ9PgogICAgICAgIDxkaXYgY2xhc3M9Imhvcml6b250YWwtdG9nZ2xlcyI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10b2dnbGUKICAgICAgICAgICAgLmxhYmVsPSR7IldpRmkifQogICAgICAgICAgICAudmFsdWU9JHt0cnVlfQogICAgICAgICAgICAubGF5b3V0TW9kZT0keyJob3Jpem9udGFsIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdG9nZ2xlPgoKICAgICAgICAgIDxkZWVzLWlucHV0LXRvZ2dsZQogICAgICAgICAgICAubGFiZWw9JHsiQmx1ZXRvb3RoIn0KICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgIC5sYXlvdXRNb2RlPSR7Imhvcml6b250YWwifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CgogICAgICAgICAgPGRlZXMtaW5wdXQtdG9nZ2xlCiAgICAgICAgICAgIC5sYWJlbD0keyJHUFMifQogICAgICAgICAgICAudmFsdWU9JHt0cnVlfQogICAgICAgICAgICAubGF5b3V0TW9kZT0keyJob3Jpem9udGFsIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdG9nZ2xlPgoKICAgICAgICAgIDxkZWVzLWlucHV0LXRvZ2dsZQogICAgICAgICAgICAubGFiZWw9JHsiTkZDIn0KICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgIC5sYXlvdXRNb2RlPSR7Imhvcml6b250YWwifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJTZXR0aW5ncyBFeGFtcGxlIn0gLnN1YnRpdGxlPSR7IlRvZ2dsZXMgaW4gYSB0eXBpY2FsIHNldHRpbmdzIGNvbnRleHQifT4KICAgICAgICA8ZGl2IGNsYXNzPSJzZXR0aW5ncy1zZWN0aW9uIj4KICAgICAgICAgIDxoNCBjbGFzcz0ic2VjdGlvbi10aXRsZSI+Tm90aWZpY2F0aW9uIFNldHRpbmdzPC9oND4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtZ3JvdXAiPgogICAgICAgICAgICA8ZGVlcy1pbnB1dC10b2dnbGUKICAgICAgICAgICAgICAubGFiZWw9JHsiUHVzaCBub3RpZmljYXRpb25zIn0KICAgICAgICAgICAgICAudmFsdWU9JHt0cnVlfQogICAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJSZWNlaXZlIHB1c2ggbm90aWZpY2F0aW9ucyBvbiB5b3VyIGRldmljZSJ9CiAgICAgICAgICAgICAgLmtleT0keyJwdXNoIn0KICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CgogICAgICAgICAgICA8ZGVlcy1pbnB1dC10b2dnbGUKICAgICAgICAgICAgICAubGFiZWw9JHsiRW1haWwgbm90aWZpY2F0aW9ucyJ9CiAgICAgICAgICAgICAgLnZhbHVlPSR7dHJ1ZX0KICAgICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiR2V0IGltcG9ydGFudCB1cGRhdGVzIHZpYSBlbWFpbCJ9CiAgICAgICAgICAgICAgLmtleT0keyJlbWFpbCJ9CiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtdG9nZ2xlPgoKICAgICAgICAgICAgPGRlZXMtaW5wdXQtdG9nZ2xlCiAgICAgICAgICAgICAgLmxhYmVsPSR7IlNvdW5kIn0KICAgICAgICAgICAgICAudmFsdWU9JHtmYWxzZX0KICAgICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiUGxheSBhIHNvdW5kIGZvciBub3RpZmljYXRpb25zIn0KICAgICAgICAgICAgICAua2V5PSR7InNvdW5kIn0KICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CgogICAgICAgICAgICA8ZGVlcy1pbnB1dC10b2dnbGUKICAgICAgICAgICAgICAubGFiZWw9JHsiVmlicmF0aW9uIn0KICAgICAgICAgICAgICAudmFsdWU9JHt0cnVlfQogICAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJWaWJyYXRlIGZvciBub3RpZmljYXRpb25zIn0KICAgICAgICAgICAgICAua2V5PSR7InZpYnJhdGlvbiJ9CiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtdG9nZ2xlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJGZWF0dXJlIFRvZ2dsZXMifSAuc3VidGl0bGU9JHsiQmF0Y2ggb3BlcmF0aW9ucyBvbiBtdWx0aXBsZSB0b2dnbGVzIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9uLWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBpZD0idG9nZ2xlLWFsbC1vbiIgdHlwZT0ic2Vjb25kYXJ5Ij5FbmFibGUgQWxsPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBpZD0idG9nZ2xlLWFsbC1vZmYiIHR5cGU9InNlY29uZGFyeSI+RGlzYWJsZSBBbGw8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLXRvZ2dsZXMiPgogICAgICAgICAgPGRpdiBjbGFzcz0idG9nZ2xlLWdyb3VwIj4KICAgICAgICAgICAgPGRlZXMtaW5wdXQtdG9nZ2xlCiAgICAgICAgICAgICAgLmxhYmVsPSR7IkRhcmsgTW9kZSJ9CiAgICAgICAgICAgICAgLnZhbHVlPSR7dHJ1ZX0KICAgICAgICAgICAgICAua2V5PSR7ImRhcmtNb2RlIn0KICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CgogICAgICAgICAgICA8ZGVlcy1pbnB1dC10b2dnbGUKICAgICAgICAgICAgICAubGFiZWw9JHsiQXV0by1zYXZlIn0KICAgICAgICAgICAgICAudmFsdWU9JHt0cnVlfQogICAgICAgICAgICAgIC5rZXk9JHsiYXV0b1NhdmUifQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LXRvZ2dsZT4KCiAgICAgICAgICAgIDxkZWVzLWlucHV0LXRvZ2dsZQogICAgICAgICAgICAgIC5sYWJlbD0keyJTcGVsbCBjaGVjayJ9CiAgICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgICAgLmtleT0keyJzcGVsbENoZWNrIn0KICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CgogICAgICAgICAgICA8ZGVlcy1pbnB1dC10b2dnbGUKICAgICAgICAgICAgICAubGFiZWw9JHsiRGV2ZWxvcGVyIG1vZGUifQogICAgICAgICAgICAgIC52YWx1ZT0ke2ZhbHNlfQogICAgICAgICAgICAgIC5rZXk9JHsiZGV2TW9kZSJ9CiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtdG9nZ2xlPgoKICAgICAgICAgICAgPGRlZXMtaW5wdXQtdG9nZ2xlCiAgICAgICAgICAgICAgLmxhYmVsPSR7IkJldGEgZmVhdHVyZXMifQogICAgICAgICAgICAgIC52YWx1ZT0ke2ZhbHNlfQogICAgICAgICAgICAgIC5rZXk9JHsiYmV0YSJ9CiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtdG9nZ2xlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJJbnRlcmFjdGl2ZSBFeGFtcGxlIn0gLnN1YnRpdGxlPSR7IlRvZ2dsZSB0byBzZWUgdmFsdWUgY2hhbmdlcyBpbiByZWFsLXRpbWUifT4KICAgICAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtZ3JvdXAiPgogICAgICAgICAgPGRlZXMtaW5wdXQtdG9nZ2xlCiAgICAgICAgICAgIC5sYWJlbD0keyJBaXJwbGFuZSBtb2RlIn0KICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgIEBuZXdWYWx1ZT0keyhldmVudCkgPT4gewogIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNhaXJwbGFuZS1vdXRwdXQiKTsKICBpZiAob3V0cHV0KSB7CiAgICBvdXRwdXQudGV4dENvbnRlbnQgPSBgQWlycGxhbmUgbW9kZTogJHtldmVudC5kZXRhaWwgPyAiT04iIDogIk9GRiJ9YDsKICB9Cn19CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXRvZ2dsZT4KCiAgICAgICAgICA8ZGVlcy1pbnB1dC10b2dnbGUKICAgICAgICAgICAgLmxhYmVsPSR7IkRvIG5vdCBkaXN0dXJiIn0KICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgIEBuZXdWYWx1ZT0keyhldmVudCkgPT4gewogIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNkbmQtb3V0cHV0Iik7CiAgaWYgKG91dHB1dCkgewogICAgb3V0cHV0LnRleHRDb250ZW50ID0gYERvIG5vdCBkaXN0dXJiOiAke2V2ZW50LmRldGFpbCA/ICJFTkFCTEVEIiA6ICJESVNBQkxFRCJ9YDsKICB9Cn19CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXRvZ2dsZT4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iaW50ZXJhY3RpdmUtc2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGlkPSJhaXJwbGFuZS1vdXRwdXQiIGNsYXNzPSJvdXRwdXQtdGV4dCI+QWlycGxhbmUgbW9kZTogT0ZGPC9kaXY+CiAgICAgICAgICA8ZGl2IGlkPSJkbmQtb3V0cHV0IiBjbGFzcz0ib3V0cHV0LXRleHQiIHN0eWxlPSJtYXJnaW4tdG9wOiA4cHg7Ij5EbyBub3QgZGlzdHVyYjogRElTQUJMRUQ8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kaXY+CiAgPC9kZWVzLWRlbW93cmFwcGVyPgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtdG9nZ2xlL2RlZXMtaW5wdXQtdG9nZ2xlLmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfZGlzdF90czI1KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTMwID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMzMSA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0lucHV0VG9nZ2xlID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1pbnB1dC10b2dnbGUiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0lucHV0QmFzZTsKICBsZXQgX3ZhbHVlX2RlY29yYXRvcnM7CiAgbGV0IF92YWx1ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNJbnB1dFRvZ2dsZTIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF92YWx1ZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTMwKHRoaXMsIG51bGwsIF92YWx1ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2YWx1ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmFsdWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmFsdWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZhbHVlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZhbHVlX2luaXRpYWxpemVycywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzAobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzSW5wdXRUb2dnbGUyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIC8vIFNUQVRJQwogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzIyOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIklucHV0Il07CiAgICAjdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMzEodGhpcywgX3ZhbHVlX2luaXRpYWxpemVycywgZmFsc2UpOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCB2YWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAvKioKICAgICAqIEtub2IgcG9zaXRpb24gdHJhY2tpbmcgKDAgPSBvZmYsIG1heFRyYXZlbCA9IG9uKQogICAgICovCiAgICBjdXJyZW50WCA9IChfX3J1bkluaXRpYWxpemVyczMxKHRoaXMsIF92YWx1ZV9leHRyYUluaXRpYWxpemVycyksIDApOwogICAgLyoqCiAgICAgKiBEcmFnIHN0YXRlCiAgICAgKi8KICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTsKICAgIGhhc0RyYWdnZWQgPSBmYWxzZTsKICAgIHN0YXJ0WCA9IDA7CiAgICAvLyBUb2dnbGUgZGltZW5zaW9ucwogICAgdHJhY2tXaWR0aCA9IDM2OwogICAgdHJhY2tIZWlnaHQgPSAyMDsKICAgIGtub2JTaXplID0gMTQ7CiAgICBwYWRkaW5nID0gMjsKICAgIG1heFRyYXZlbCA9IDE2OwogICAgLy8gdHJhY2tXaWR0aCAtIGtub2JTaXplIC0gKHBhZGRpbmcgKiAyKSAtIGJvcmRlcgogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMubGFiZWxQb3NpdGlvbiA9ICJyaWdodCI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIC4uLkRlZXNJbnB1dEJhc2UuYmFzZVN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAqIHsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICBmb250LWZhbWlseTogJHtjc3NHZWlzdEZvbnRGYW1pbHl9OwogICAgICB9CgogICAgICAubWFpbmNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICB9CgogICAgICAudG9nZ2xlLXRyYWNrIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIHdpZHRoOiAzNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDMuOSUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgbWFyZ2luLXRvcDogMXB4OwogICAgICB9CgogICAgICAubWFpbmNvbnRhaW5lcjpob3ZlciAudG9nZ2xlLXRyYWNrIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA3OS44JSkiLCAiaHNsKDAgMCUgMjAuOSUpIil9OwogICAgICB9CgogICAgICA6aG9zdChbdmFsdWVdKSAudG9nZ2xlLXRyYWNrIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA1MS4yJSkiLCAiaHNsKDIxNy4yIDkxLjIlIDU5LjglKSIpfTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS10cmFjazpmb2N1cy12aXNpYmxlIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlIC8gMC4xKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUgLyAwLjEpIil9OwogICAgICB9CgogICAgICAudG9nZ2xlLWtub2IgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDJweDsKICAgICAgICB3aWR0aDogMTRweDsKICAgICAgICBoZWlnaHQ6IDE0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA2My45JSkiLCAiaHNsKDAgMCUgNDUuMSUpIil9OwogICAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4xNXMgZWFzZSwgYmFja2dyb3VuZCAwLjE1cyBlYXNlOwogICAgICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1rbm9iLmRyYWdnaW5nIHsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2YWx1ZV0pIC50b2dnbGUta25vYiB7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgIH0KCiAgICAgIC8qIERpc2FibGVkIHN0YXRlICovCiAgICAgIC5tYWluY29udGFpbmVyLmRpc2FibGVkIHsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS10cmFjay5kaXNhYmxlZCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk1LjElKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgfQoKICAgICAgLyogUmVxdWlyZWQgc3RhdGUgKGxvY2tlZCBvbikgKi8KICAgICAgOmhvc3QoW3JlcXVpcmVkXVt2YWx1ZV0pIC50b2dnbGUtdHJhY2sgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgNjEuMiUpIiwgImhzbCgyMTcuMiA5MS4yJSA0OS44JSkiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDYxLjIlKSIsICJoc2woMjE3LjIgOTEuMiUgNDkuOCUpIil9OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtyZXF1aXJlZF1bdmFsdWVdKSAudG9nZ2xlLWtub2IgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4NSUpIiwgImhzbCgwIDAlIDcwJSkiKX07CiAgICAgIH0KCiAgICAgIC8qIExhYmVsICovCiAgICAgIC5sYWJlbC1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDJweDsKICAgICAgICBmbGV4OiAxOwogICAgICB9CgogICAgICAudG9nZ2xlLWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDE1JSkiLCAiaHNsKDAgMCUgOTAlKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjE1cyBlYXNlOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtOwogICAgICB9CgogICAgICAubWFpbmNvbnRhaW5lcjpob3ZlciAudG9nZ2xlLWxhYmVsIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICB9CgogICAgICAubWFpbmNvbnRhaW5lci5kaXNhYmxlZDpob3ZlciAudG9nZ2xlLWxhYmVsIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDE1JSkiLCAiaHNsKDAgMCUgOTAlKSIpfTsKICAgICAgfQoKICAgICAgLyogRGVzY3JpcHRpb24gKi8KICAgICAgLmRlc2NyaXB0aW9uLXRleHQgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQ1LjElKSIsICJoc2woMCAwJSA2My45JSkiKX07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJpbnB1dC13cmFwcGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJtYWluY29udGFpbmVyICR7dGhpcy5kaXNhYmxlZCA/ICJkaXNhYmxlZCIgOiAiIn0iIEBjbGljaz0iJHt0aGlzLmhhbmRsZUNsaWNrfSI+CiAgICAgICAgICA8ZGl2CiAgICAgICAgICAgIGNsYXNzPSJ0b2dnbGUtdHJhY2sgJHt0aGlzLmRpc2FibGVkID8gImRpc2FibGVkIiA6ICIifSIKICAgICAgICAgICAgdGFiaW5kZXg9IiR7dGhpcy5kaXNhYmxlZCA/ICItMSIgOiAiMCJ9IgogICAgICAgICAgICBAa2V5ZG93bj0iJHt0aGlzLmhhbmRsZUtleWRvd259IgogICAgICAgICAgPgogICAgICAgICAgICA8ZGl2CiAgICAgICAgICAgICAgY2xhc3M9InRvZ2dsZS1rbm9iIgogICAgICAgICAgICAgIHN0eWxlPSJsZWZ0OiAke3RoaXMucGFkZGluZyArIHRoaXMuY3VycmVudFh9cHg7IgogICAgICAgICAgICAgIEBwb2ludGVyZG93bj0iJHt0aGlzLm9uUG9pbnRlckRvd259IgogICAgICAgICAgICAgIEBwb2ludGVybW92ZT0iJHt0aGlzLm9uUG9pbnRlck1vdmV9IgogICAgICAgICAgICAgIEBwb2ludGVydXA9IiR7dGhpcy5vblBvaW50ZXJVcH0iCiAgICAgICAgICAgICAgQHBvaW50ZXJjYW5jZWw9IiR7dGhpcy5vblBvaW50ZXJVcH0iCiAgICAgICAgICAgID48L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwtY29udGFpbmVyIj4KICAgICAgICAgICAgJHt0aGlzLmxhYmVsID8gYjJgPGRpdiBjbGFzcz0idG9nZ2xlLWxhYmVsIj4ke3RoaXMubGFiZWx9PC9kaXY+YCA6ICIifQogICAgICAgICAgICAke3RoaXMuZGVzY3JpcHRpb24gPyBiMmA8ZGl2IGNsYXNzPSJkZXNjcmlwdGlvbi10ZXh0Ij4ke3RoaXMuZGVzY3JpcHRpb259PC9kaXY+YCA6ICIifQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgYXdhaXQgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGlmICh0aGlzLnJlcXVpcmVkICYmICF0aGlzLnZhbHVlKSB7CiAgICAgICAgdGhpcy52YWx1ZSA9IHRydWU7CiAgICAgIH0KICAgICAgdGhpcy5jdXJyZW50WCA9IHRoaXMudmFsdWUgPyB0aGlzLm1heFRyYXZlbCA6IDA7CiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBDbGljayBoYW5kbGVyIC0gdG9nZ2xlcyB0aGUgdmFsdWUKICAgICAqLwogICAgYXN5bmMgaGFuZGxlQ2xpY2soZXZlbnQpIHsKICAgICAgaWYgKHRoaXMuaXNEcmFnZ2luZyB8fCB0aGlzLmhhc0RyYWdnZWQpIHsKICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAodGhpcy5kaXNhYmxlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAodGhpcy5yZXF1aXJlZCkgewogICAgICAgIHRoaXMuY3VycmVudFggPSB0aGlzLm1heFRyYXZlbDsKICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocjExKSA9PiBzZXRUaW1lb3V0KHIxMSwgMTApKTsKICAgICAgICB0aGlzLmN1cnJlbnRYID0gdGhpcy5tYXhUcmF2ZWwgLSAzOwogICAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgICAgIGF3YWl0IGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cy5zbWFydGRlbGF5LmRlbGF5Rm9yKDE1MCk7CiAgICAgICAgdGhpcy5jdXJyZW50WCA9IHRoaXMubWF4VHJhdmVsOwogICAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy52YWx1ZSA9ICF0aGlzLnZhbHVlOwogICAgICB0aGlzLmN1cnJlbnRYID0gdGhpcy52YWx1ZSA/IHRoaXMubWF4VHJhdmVsIDogMDsKICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm5ld1ZhbHVlIiwgewogICAgICAgIGRldGFpbDogdGhpcy52YWx1ZSwKICAgICAgICBidWJibGVzOiB0cnVlCiAgICAgIH0pKTsKICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgIGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cy5zbWFydGRlbGF5LmRlbGF5Rm9yKDApLnRoZW4oKCkgPT4gewogICAgICAgIHRoaXMuaGFzRHJhZ2dlZCA9IGZhbHNlOwogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogUG9pbnRlciBkb3duIC0gc3RhcnQgZHJhZ2dpbmcKICAgICAqLwogICAgb25Qb2ludGVyRG93bihldmVudCkgewogICAgICBpZiAodGhpcy5yZXF1aXJlZCB8fCB0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7CiAgICAgIHRoaXMuc3RhcnRYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuY3VycmVudFg7CiAgICAgIGV2ZW50LnRhcmdldC5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpOwogICAgfQogICAgLyoqCiAgICAgKiBQb2ludGVyIG1vdmUgLSB0cmFjayBkcmFnIHBvc2l0aW9uCiAgICAgKi8KICAgIG9uUG9pbnRlck1vdmUoZXZlbnQpIHsKICAgICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBuZXdYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuc3RhcnRYOwogICAgICB0aGlzLmhhc0RyYWdnZWQgPSB0cnVlOwogICAgICBjb25zdCB0b2dnbGVLbm9iID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIudG9nZ2xlLWtub2IiKTsKICAgICAgaWYgKHRvZ2dsZUtub2IpIHsKICAgICAgICB0b2dnbGVLbm9iLmNsYXNzTGlzdC5hZGQoImRyYWdnaW5nIik7CiAgICAgIH0KICAgICAgdGhpcy5jdXJyZW50WCA9IE1hdGgubWF4KDAsIE1hdGgubWluKG5ld1gsIHRoaXMubWF4VHJhdmVsKSk7CiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBQb2ludGVyIHVwIC0gY29tcGxldGUgZHJhZyBhbmQgc25hcCB0byBuZWFyZXN0IHNpZGUKICAgICAqLwogICAgb25Qb2ludGVyVXAoZXZlbnQpIHsKICAgICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcpCiAgICAgICAgcmV0dXJuOwogICAgICBldmVudC50YXJnZXQucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7CiAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlOwogICAgICBpZiAoIXRoaXMuaGFzRHJhZ2dlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCB0b2dnbGVLbm9iID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIudG9nZ2xlLWtub2IiKTsKICAgICAgaWYgKHRvZ2dsZUtub2IpIHsKICAgICAgICB0b2dnbGVLbm9iLmNsYXNzTGlzdC5yZW1vdmUoImRyYWdnaW5nIik7CiAgICAgIH0KICAgICAgY29uc3QgbWlkcG9pbnQgPSB0aGlzLm1heFRyYXZlbCAvIDI7CiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmN1cnJlbnRYID4gbWlkcG9pbnQ7CiAgICAgIHRoaXMuY3VycmVudFggPSB0aGlzLnZhbHVlID8gdGhpcy5tYXhUcmF2ZWwgOiAwOwogICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgibmV3VmFsdWUiLCB7CiAgICAgICAgZGV0YWlsOiB0aGlzLnZhbHVlLAogICAgICAgIGJ1YmJsZXM6IHRydWUKICAgICAgfSkpOwogICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgICAgZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzLnNtYXJ0ZGVsYXkuZGVsYXlGb3IoMCkudGhlbigoKSA9PiB7CiAgICAgICAgdGhpcy5oYXNEcmFnZ2VkID0gZmFsc2U7CiAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBTeW5jIGtub2IgcG9zaXRpb24gd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkIGV4dGVybmFsbHkKICAgICAqLwogICAgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgICBzdXBlci51cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygidmFsdWUiKSAmJiAhdGhpcy5pc0RyYWdnaW5nICYmICF0aGlzLmhhc0RyYWdnZWQpIHsKICAgICAgICB0aGlzLmN1cnJlbnRYID0gdGhpcy52YWx1ZSA/IHRoaXMubWF4VHJhdmVsIDogMDsKICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBLZXlib2FyZCBzdXBwb3J0CiAgICAgKi8KICAgIGhhbmRsZUtleWRvd24oZXZlbnQpIHsKICAgICAgaWYgKGV2ZW50LmtleSA9PT0gIiAiIHx8IGV2ZW50LmtleSA9PT0gIkVudGVyIikgewogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdGhpcy5oYW5kbGVDbGljayhldmVudCk7CiAgICAgIH0KICAgIH0KICAgIC8vIERlZXNJbnB1dEJhc2UgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCiAgICBnZXRWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMudmFsdWU7CiAgICB9CiAgICBzZXRWYWx1ZSh2YWx1ZUFyZykgewogICAgICB0aGlzLnZhbHVlID0gdmFsdWVBcmc7CiAgICB9CiAgICBmb2N1cygpIHsKICAgICAgY29uc3QgdHJhY2syID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIudG9nZ2xlLXRyYWNrIik7CiAgICAgIGlmICh0cmFjazIpIHsKICAgICAgICB0cmFjazIuZm9jdXMoKTsKICAgICAgfQogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnMzMShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0lucHV0VG9nZ2xlMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC10eXBlbGlzdC9kZWVzLWlucHV0LXR5cGVsaXN0LmRlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW9GdW5jMjMgPSAoKSA9PiBiMmAKICA8ZGVlcy1kZW1vd3JhcHBlcj4KICAgIDxzdHlsZT4KICAgICAgJHtpYAogICAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMjRweDsKICAgICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgICBtYXgtd2lkdGg6IDEyMDBweDsKICAgICAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuaG9yaXpvbnRhbC1ncm91cCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5pbmZvLWJveCB7CiAgICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICAgIGJhY2tncm91bmQ6ICNlM2YyZmQ7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBjb2xvcjogIzE5NzZkMjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewogICAgICAgICAgLmluZm8tYm94IHsKICAgICAgICAgICAgYmFja2dyb3VuZDogIzFlM2E1ZjsKICAgICAgICAgICAgY29sb3I6ICM5MGNhZjk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBgfQogICAgPC9zdHlsZT4KICAgIAogICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiQmFzaWMgVHlwZSBMaXN0In0gLnN1YnRpdGxlPSR7IkFkZCBhbmQgcmVtb3ZlIGl0ZW1zIGZyb20gYSBsaXN0In0+CiAgICAgICAgPGRlZXMtaW5wdXQtdHlwZWxpc3QKICAgICAgICAgIC5sYWJlbD0keyJUYWdzIn0KICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJBZGQgdGFncyBieSB0eXBpbmcgYW5kIHByZXNzaW5nIEVudGVyIn0KICAgICAgICAgIC52YWx1ZT0ke1siamF2YXNjcmlwdCIsICJ0eXBlc2NyaXB0IiwgIndlYi1jb21wb25lbnRzIl19CiAgICAgICAgPjwvZGVlcy1pbnB1dC10eXBlbGlzdD4KICAgICAgICAKICAgICAgICA8ZGVlcy1pbnB1dC10eXBlbGlzdAogICAgICAgICAgLmxhYmVsPSR7IlRlYW0gTWVtYmVycyJ9CiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiQWRkIGVtYWlsIGFkZHJlc3NlcyBvZiB0ZWFtIG1lbWJlcnMifQogICAgICAgICAgLnZhbHVlPSR7WyJhbGljZUBleGFtcGxlLmNvbSIsICJib2JAZXhhbXBsZS5jb20iXX0KICAgICAgICA+PC9kZWVzLWlucHV0LXR5cGVsaXN0PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiU2tpbGxzICYgS2V5d29yZHMifSAuc3VidGl0bGU9JHsiTWFuYWdlIGxpc3RzIG9mIHNraWxscyBhbmQga2V5d29yZHMifT4KICAgICAgICA8ZGVlcy1pbnB1dC10eXBlbGlzdAogICAgICAgICAgLmxhYmVsPSR7IllvdXIgU2tpbGxzIn0KICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJMaXN0IHlvdXIgcHJvZmVzc2lvbmFsIHNraWxscyJ9CiAgICAgICAgICAudmFsdWU9JHtbIkhUTUwiLCAiQ1NTIiwgIkphdmFTY3JpcHQiLCAiTm9kZS5qcyIsICJSZWFjdCJdfQogICAgICAgID48L2RlZXMtaW5wdXQtdHlwZWxpc3Q+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0iaG9yaXpvbnRhbC1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10eXBlbGlzdAogICAgICAgICAgICAubGFiZWw9JHsiQ2F0ZWdvcmllcyJ9CiAgICAgICAgICAgIC5sYXlvdXRNb2RlPSR7Imhvcml6b250YWwifQogICAgICAgICAgICAudmFsdWU9JHtbIlRlY2hub2xvZ3kiLCAiRGVzaWduIiwgIkJ1c2luZXNzIl19CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXR5cGVsaXN0PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC10eXBlbGlzdAogICAgICAgICAgICAubGFiZWw9JHsiS2V5d29yZHMifQogICAgICAgICAgICAubGF5b3V0TW9kZT0keyJob3Jpem9udGFsIn0KICAgICAgICAgICAgLnZhbHVlPSR7WyJpbm5vdmF0aW9uIiwgInN0YXJ0dXAiLCAiZ3Jvd3RoIl19CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXR5cGVsaXN0PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiUmVxdWlyZWQgJiBEaXNhYmxlZCBTdGF0ZXMifSAuc3VidGl0bGU9JHsiRGlmZmVyZW50IGlucHV0IHN0YXRlcyBmb3IgdmFsaWRhdGlvbiJ9PgogICAgICAgIDxkZWVzLWlucHV0LXR5cGVsaXN0CiAgICAgICAgICAubGFiZWw9JHsiUHJvamVjdCBEZXBlbmRlbmNpZXMifQogICAgICAgICAgLmRlc2NyaXB0aW9uPSR7Ikxpc3QgYWxsIHJlcXVpcmVkIG5wbSBwYWNrYWdlcyJ9CiAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgLnZhbHVlPSR7WyJAZGVzaWduLmVzdGF0ZS9kZWVzLWVsZW1lbnQiLCAiQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scyJdfQogICAgICAgID48L2RlZXMtaW5wdXQtdHlwZWxpc3Q+CiAgICAgICAgCiAgICAgICAgPGRlZXMtaW5wdXQtdHlwZWxpc3QKICAgICAgICAgIC5sYWJlbD0keyJTeXN0ZW0gVGFncyJ9CiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiVGhlc2UgdGFncyBhcmUgbWFuYWdlZCBieSB0aGUgc3lzdGVtIn0KICAgICAgICAgIC5kaXNhYmxlZD0ke3RydWV9CiAgICAgICAgICAudmFsdWU9JHtbInN5c3RlbSIsICJwcm90ZWN0ZWQiLCAicmVhZG9ubHkiXX0KICAgICAgICA+PC9kZWVzLWlucHV0LXR5cGVsaXN0PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiQXJ0aWNsZSBQdWJsaXNoaW5nIEZvcm0ifSAuc3VidGl0bGU9JHsiQ29tcGxldGUgZm9ybSB3aXRoIHRhZyBtYW5hZ2VtZW50In0+CiAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgLmxhYmVsPSR7IkFydGljbGUgVGl0bGUifSAucmVxdWlyZWQ9JHt0cnVlfT48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgCiAgICAgICAgICAgIC5sYWJlbD0keyJTdW1tYXJ5In0gCiAgICAgICAgICAgIC5pbnB1dFR5cGU9JHsidGV4dGFyZWEifQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiQnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGFydGljbGUifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgPGRlZXMtaW5wdXQtdHlwZWxpc3QKICAgICAgICAgICAgLmxhYmVsPSR7IlRhZ3MifQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiQWRkIHJlbGV2YW50IHRhZ3MgZm9yIGJldHRlciBkaXNjb3ZlcmFiaWxpdHkifQogICAgICAgICAgICAudmFsdWU9JHtbInR1dG9yaWFsIiwgIndlYi1kZXZlbG9wbWVudCJdfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10eXBlbGlzdD4KICAgICAgICAgIDxkZWVzLWlucHV0LXR5cGVsaXN0CiAgICAgICAgICAgIC5sYWJlbD0keyJDby1BdXRob3JzIn0KICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IkFkZCBlbWFpbCBhZGRyZXNzZXMgb2YgY28tYXV0aG9ycyJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXR5cGVsaXN0PgogICAgICAgIDwvZGVlcy1mb3JtPgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9ImluZm8tYm94Ij4KICAgICAgICAgIDxzdHJvbmc+VGlwOjwvc3Ryb25nPiBUeXBlIGEgdmFsdWUgYW5kIHByZXNzIEVudGVyIHRvIGFkZCBpdCB0byB0aGUgbGlzdC4gQ2xpY2sgb24gYW55IGl0ZW0gdG8gcmVtb3ZlIGl0LgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2Rpdj4KICA8L2RlZXMtZGVtb3dyYXBwZXI+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC10eXBlbGlzdC9kZWVzLWlucHV0LXR5cGVsaXN0LmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfZGlzdF90czI1KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTMxID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMzMiA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0lucHV0VHlwZWxpc3QgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLWlucHV0LXR5cGVsaXN0IildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNJbnB1dEJhc2U7CiAgbGV0IF92YWx1ZV9kZWNvcmF0b3JzOwogIGxldCBfdmFsdWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWx1ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW5wdXRWYWx1ZV9kZWNvcmF0b3JzOwogIGxldCBfaW5wdXRWYWx1ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lucHV0VmFsdWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0lucHV0VHlwZWxpc3QyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfdmFsdWVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX2lucHV0VmFsdWVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlMzEodGhpcywgbnVsbCwgX3ZhbHVlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZhbHVlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ2YWx1ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai52YWx1ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudmFsdWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMSh0aGlzLCBudWxsLCBfaW5wdXRWYWx1ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpbnB1dFZhbHVlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpbnB1dFZhbHVlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlucHV0VmFsdWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlucHV0VmFsdWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaW5wdXRWYWx1ZV9pbml0aWFsaXplcnMsIF9pbnB1dFZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzEobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzSW5wdXRUeXBlbGlzdDIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzIzOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIklucHV0Il07CiAgICAjdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMzIodGhpcywgX3ZhbHVlX2luaXRpYWxpemVycywgW10pOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCB2YWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaW5wdXRWYWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzIodGhpcywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzMih0aGlzLCBfaW5wdXRWYWx1ZV9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgaW5wdXRWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lucHV0VmFsdWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpbnB1dFZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLiNpbnB1dFZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIC4uLkRlZXNJbnB1dEJhc2UuYmFzZVN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMzMzIiwgIiNmZmYiKX07CiAgICAgIH0KICAgICAgLm1haW5ib3ggewogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZhZmFmYSIsICIjMjIyMjIyIil9OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgYm9yZGVyLXRvcDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIjFweCBzb2xpZCAjQ0NDIiwgIjFweCBzb2xpZCAjZmZmZmZmMTAiKX07CiAgICAgICAgYm9yZGVyLWJvdHRvbTogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIjFweCBzb2xpZCAjQ0NDIiwgIjFweCBzb2xpZCAjMjIyIil9OwogICAgICAgIGJvcmRlci1yaWdodDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIjFweCBzb2xpZCAjQ0NDIiwgIjFweCBzb2xpZCAjZmZmZmZmMTAiKX07CiAgICAgICAgYm9yZGVyLWxlZnQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIxcHggc29saWQgI0NDQyIsICIxcHggc29saWQgI2ZmZmZmZjEwIil9OwogICAgICAgIGJveC1zaGFkb3c6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIwcHggMXB4IDRweCByZ2JhKDAsMCwwLDAuMykiLCAibm9uZSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4yczsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgCiAgICAgIC5tYWluYm94OmhvdmVyIHsKICAgICAgICBmaWx0ZXI6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJicmlnaHRuZXNzKDAuOTgpIiwgImJyaWdodG5lc3MoMS4wNSkiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5tYWluYm94OmZvY3VzLXdpdGhpbiB7CiAgICAgICAgb3V0bGluZTogMnB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDA2OWYyIiwgIiMwMDg0ZmYiKX07CiAgICAgICAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7CiAgICAgIH0KCiAgICAgIC50YWdzIHsKICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLm5vdGFncyB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzk5OSIsICIjNjY2Iil9OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KCiAgICAgIGlucHV0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjVmNWY1IiwgIiMxODE4MTgiKX07CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgcGFkZGluZzogMHB4IDE2cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBsaW5lLWhlaWdodDogMzJweDsKICAgICAgICBoZWlnaHQ6IDBweDsKICAgICAgICB0cmFuc2l0aW9uOiBoZWlnaHQgMC4yczsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlMGUwZTAiLCAiIzMzMyIpfTsKICAgICAgfQoKICAgICAgaW5wdXQ6Zm9jdXMgewogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZhZmFmYSIsICIjMWExYTFhIil9OwogICAgICB9CiAgICAgIAogICAgICBpbnB1dDo6cGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzk5OSIsICIjNjY2Iil9OwogICAgICB9CgogICAgICAudGFnIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlOGY1ZTkiLCAiIzJkM2EyZCIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyZTdkMzIiLCAiIzgxYzc4NCIpfTsKICAgICAgICBwYWRkaW5nOiA0cHggMTBweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgbWFyZ2luOiAzcHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNjOGU2YzkiLCAiIzFiNWUyMCIpfTsKICAgICAgfQogICAgICAKICAgICAgLnRhZzpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNjOGU2YzkiLCAiIzNkNGYzZCIpfTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgICAgIH0KCiAgICAgIC50YWcgLnJlbW92ZSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgb3BhY2l0eTogMC43OwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4yczsKICAgICAgfQoKICAgICAgLnRhZyAucmVtb3ZlOmhvdmVyIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2M2MjgyOCIsICIjZWY1MzUwIil9OwogICAgICB9CiAgICAgIAogICAgICAvKiBEaXNhYmxlZCBzdGF0ZSAqLwogICAgICA6aG9zdChbZGlzYWJsZWRdKSAubWFpbmJveCB7CiAgICAgICAgb3BhY2l0eTogMC42OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIC50YWdzIHsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICB9CiAgICAgIAogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudGFnIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgICAKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgaW5wdXQgewogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmMGYwZjAiLCAiIzFhMWExYSIpfTsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJpbnB1dC13cmFwcGVyIj4KICAgICAgICA8ZGVlcy1sYWJlbCAubGFiZWw9JHt0aGlzLmxhYmVsfSAuZGVzY3JpcHRpb249JHt0aGlzLmRlc2NyaXB0aW9ufT48L2RlZXMtbGFiZWw+CiAgICAgICAgPGRpdiBjbGFzcz0ibWFpbmJveCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWdzIiBAY2xpY2s9JHsoKSA9PiB7CiAgICAgICAgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoImlucHV0IikuZm9jdXMoKTsKICAgICAgfX0+CiAgICAgICAgICAgICR7dGhpcy52YWx1ZS5sZW5ndGggPT09IDAgPyBiMmA8ZGl2IGNsYXNzPSJub3RhZ3MiPk5vIHRhZ3MgeWV0PC9kaXY+YCA6IHRoaXMudmFsdWUubWFwKCh0YWcpID0+IGIyYAogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWciPgogICAgICAgICAgICAgICAgICAgICAgJHt0YWd9CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icmVtb3ZlIiBAY2xpY2s9JHsoZTExKSA9PiB7CiAgICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIHRoaXMucmVtb3ZlVGFnKHRhZyk7CiAgICAgIH19PsOXPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgYCl9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICB0eXBlPSJ0ZXh0IgogICAgICAgICAgICBwbGFjZWhvbGRlcj0iVHlwZSwgcHJlc3MgRW50ZXIgdG8gYWRkIGl0Li4uIgogICAgICAgICAgICAudmFsdWU9JHt0aGlzLmlucHV0VmFsdWV9CiAgICAgICAgICAgIEBpbnB1dD0keyhlMTEpID0+IHsKICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSBlMTEudGFyZ2V0LnZhbHVlOwogICAgICB9fQogICAgICAgICAgICBAa2V5ZG93bj0keyhlMTEpID0+IHsKICAgICAgICBpZiAoZTExLmtleSA9PT0gIkVudGVyIiAmJiB0aGlzLmlucHV0VmFsdWUudHJpbSgpKSB7CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuYWRkVGFnKHRoaXMuaW5wdXRWYWx1ZS50cmltKCkpOwogICAgICAgIH0KICAgICAgfX0KICAgICAgICAgICAgLmRpc2FibGVkPSR7dGhpcy5kaXNhYmxlZH0KICAgICAgICAgIC8+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGFkZFRhZyh0YWcpIHsKICAgICAgaWYgKCF0aGlzLnZhbHVlLmluY2x1ZGVzKHRhZykpIHsKICAgICAgICB0aGlzLnZhbHVlID0gWy4uLnRoaXMudmFsdWUsIHRhZ107CiAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gIiI7CiAgICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIHJlbW92ZVRhZyh0YWcpIHsKICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUuZmlsdGVyKCh0OSkgPT4gdDkgIT09IHRhZyk7CiAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMpOwogICAgfQogICAgZ2V0VmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgfQogICAgc2V0VmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTI7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnMzMih0aGlzLCBfaW5wdXRWYWx1ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczMyKF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzSW5wdXRUeXBlbGlzdDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWRhdGF2aWV3L2RlZXMtdGFibGUvZGVlcy10YWJsZS5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vRnVuYzI0ID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgJHtpYAogICAgICAuZGVtb1dyYXBwZXIgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBwYWRkaW5nOiAzMnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NSUpIiwgImhzbCgwIDAlIDUlKSIpfTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LXdpZHRoOiAxMjAwcHg7CiAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgIH0KICAgICAgLmRlbW8tc2VjdGlvbiB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNDhweDsKICAgICAgfQogICAgICAuZGVtby10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk1JSkiKX07CiAgICAgIH0KICAgICAgLmRlbW8tZGVzY3JpcHRpb24gewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA0Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgfQogICAgICAudGhlbWUtdG9nZ2xlIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAxNnB4OwogICAgICAgIHJpZ2h0OiAxNnB4OwogICAgICAgIHotaW5kZXg6IDEwMDA7CiAgICAgIH0KICAgIGB9CiAgPC9zdHlsZT4KICA8ZGl2IGNsYXNzPSJkZW1vV3JhcHBlciI+CiAgICA8ZGVlcy1idXR0b24gY2xhc3M9InRoZW1lLXRvZ2dsZSIgQGNsaWNrPSR7KCkgPT4gewogIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiYnJpZ2h0Iik7CiAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJkYXJrIik7Cn19PlRvZ2dsZSBUaGVtZTwvZGVlcy1idXR0b24+CiAgICAKICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPkJhc2ljIFRhYmxlIHdpdGggQWN0aW9uczwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImRlbW8tZGVzY3JpcHRpb24iPkEgc3RhbmRhcmQgdGFibGUgd2l0aCByb3cgYWN0aW9ucywgZWRpdGFibGUgZmllbGRzLCBhbmQgY29udGV4dCBtZW51IHN1cHBvcnQuIERvdWJsZS1jbGljayBvbiBkZXNjcmlwdGlvbnMgdG8gZWRpdC4gR3JpZCBsaW5lcyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LjwvcD4KICAgICAgICA8ZGVlcy10YWJsZQogICAgICAgICAgaGVhZGluZzE9IkN1cnJlbnQgQWNjb3VudCBTdGF0ZW1lbnQiCiAgICAgICAgICBoZWFkaW5nMj0iQnVucSAtIFBheW1lbnQgQWNjb3VudCAyIC0gQXByaWwgMjAyMSIKICAgICAgICAgIC5lZGl0YWJsZUZpZWxkcz0iJHtbImRlc2NyaXB0aW9uIl19IgogICAgICAgICAgLmRhdGE9JHtbCiAgewogICAgZGF0ZTogIjIwMjEtMDQtMDEiLAogICAgYW1vdW50OiAiMjQ2NC42NSBcdTIwQUMiLAogICAgZGVzY3JpcHRpb246ICJQcmludGluZyBQYXBlciAoT2ZmaWNlIFN1cHBsaWVzKSAtIFNUQVBMRVMgQlJFTUVOIgogIH0sCiAgewogICAgZGF0ZTogIjIwMjEtMDQtMDIiLAogICAgYW1vdW50OiAiMTY1LjY1IFx1MjBBQyIsCiAgICBkZXNjcmlwdGlvbjogIkxvZ2l0ZWNoIE1vdXNlIChIYXJkd2FyZSkgLSBsb2dpLmNvbSBPbmxpbmVTaG9wIgogIH0sCiAgewogICAgZGF0ZTogIjIwMjEtMDQtMDMiLAogICAgYW1vdW50OiAiMjk5OSwwMCBcdTIwQUMiLAogICAgZGVzY3JpcHRpb246ICJNYWNib29rIFBybyAxNmluY2ggKEhhcmR3YXJlKSAtIEFwcGxlLmRlIE9ubGluZVNob3AiCiAgfSwKICB7CiAgICBkYXRlOiAiMjAyMS0wNC0wMSIsCiAgICBhbW91bnQ6ICIyNDY0LjY1IFx1MjBBQyIsCiAgICBkZXNjcmlwdGlvbjogIk9mZmljZS1TdXBwbGllcyAtIFNUQVBMRVMgQlJFTUVOIgogIH0sCiAgewogICAgZGF0ZTogIjIwMjEtMDQtMDEiLAogICAgYW1vdW50OiAiMjQ2NC42NSBcdTIwQUMiLAogICAgZGVzY3JpcHRpb246ICJPZmZpY2UtU3VwcGxpZXMgLSBTVEFQTEVTIEJSRU1FTiIKICB9Cl19CiAgICAgICAgICBkYXRhTmFtZT0idHJhbnNhY3Rpb25zIgogICAgICAgICAgLmRhdGFBY3Rpb25zPSIke1sKICB7CiAgICBuYW1lOiAidXBsb2FkIiwKICAgIGljb25OYW1lOiAiYmVsbCIsCiAgICB1c2VUYWJsZUJlaGF2aW91cjogInVwbG9hZCIsCiAgICB0eXBlOiBbImluUm93Il0sCiAgICBhY3Rpb25GdW5jOiBhc3luYyAob3B0aW9uc0FyZykgPT4gewogICAgICBhbGVydChvcHRpb25zQXJnLml0ZW0uYW1vdW50KTsKICAgIH0KICB9LAogIHsKICAgIG5hbWU6ICJ2aXNpYmlsaXR5IiwKICAgIGljb25OYW1lOiAiY29weSIsCiAgICB0eXBlOiBbImluUm93Il0sCiAgICB1c2VUYWJsZUJlaGF2aW91cjogInByZXZpZXciLAogICAgYWN0aW9uRnVuYzogYXN5bmMgKGl0ZW1BcmcpID0+IHsKICAgIH0KICB9LAogIHsKICAgIG5hbWU6ICJjcmVhdGUgbmV3IiwKICAgIGljb25OYW1lOiAiaW5zdGFncmFtIiwKICAgIHR5cGU6IFsiaGVhZGVyIl0sCiAgICB1c2VUYWJsZUJlaGF2aW91cjogInByZXZpZXciLAogICAgYWN0aW9uRnVuYzogYXN5bmMgKGl0ZW1BcmcpID0+IHsKICAgIH0KICB9LAogIHsKICAgIG5hbWU6ICJ0byBnYWxsZXJ5IiwKICAgIGljb25OYW1lOiAibWVzc2FnZSIsCiAgICB0eXBlOiBbImZvb3RlciJdLAogICAgdXNlVGFibGVCZWhhdmlvdXI6ICJwcmV2aWV3IiwKICAgIGFjdGlvbkZ1bmM6IGFzeW5jIChpdGVtQXJnKSA9PiB7CiAgICB9CiAgfSwKICB7CiAgICBuYW1lOiAiY29weSIsCiAgICBpY29uTmFtZTogImNvcHlTb2xpZCIsCiAgICB0eXBlOiBbImNvbnRleHRtZW51IiwgImluUm93Il0sCiAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfSwKICB7CiAgICBuYW1lOiAiZWRpdCAoZnJvbSBkZW1vKSIsCiAgICBpY29uTmFtZTogInBlblRvU3F1YXJlIiwKICAgIHR5cGU6IFsiY29udGV4dG1lbnUiXSwKICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9LAogIHsKICAgIG5hbWU6ICJwYXN0ZSIsCiAgICBpY29uTmFtZTogInBhc3RlU29saWQiLAogICAgdHlwZTogWyJjb250ZXh0bWVudSJdLAogICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0sCiAgewogICAgbmFtZTogInByZXZpZXciLAogICAgdHlwZTogWyJkb3VibGVDbGljayIsICJjb250ZXh0bWVudSJdLAogICAgaWNvbk5hbWU6ICJleWUiLAogICAgYWN0aW9uRnVuYzogYXN5bmMgKGl0ZW1BcmcpID0+IHsKICAgICAgYWxlcnQoaXRlbUFyZy5pdGVtLmFtb3VudCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KXX0iCiAgICAgICAgPjwvZGVlcy10YWJsZT4KICAgICAgPC9kaXY+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMiBjbGFzcz0iZGVtby10aXRsZSI+VGFibGUgd2l0aCBWZXJ0aWNhbCBMaW5lczwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImRlbW8tZGVzY3JpcHRpb24iPkVuaGFuY2VkIGNvbHVtbiBzZXBhcmF0aW9uIGZvciBiZXR0ZXIgZGF0YSB0cmFja2luZy48L3A+CiAgICAgICAgPGRlZXMtdGFibGUKICAgICAgICAgIGhlYWRpbmcxPSJQcm9kdWN0IEludmVudG9yeSIKICAgICAgICAgIGhlYWRpbmcyPSJDdXJyZW50IHN0b2NrIGxldmVscyBhY3Jvc3Mgd2FyZWhvdXNlcyIKICAgICAgICAgIC5zaG93VmVydGljYWxMaW5lcz0ke3RydWV9CiAgICAgICAgICAuZGF0YT0ke1sKICB7CiAgICBwcm9kdWN0OiAnTWFjQm9vayBQcm8gMTYiJywKICAgIHdhcmVob3VzZV9hOiAiNDUiLAogICAgd2FyZWhvdXNlX2I6ICIzMiIsCiAgICB3YXJlaG91c2VfYzogIjI4IiwKICAgIHRvdGFsOiAiMTA1IiwKICAgIHN0YXR1czogIlx1MjcxMyBJbiBTdG9jayIKICB9LAogIHsKICAgIHByb2R1Y3Q6ICJpUGhvbmUgMTUgUHJvIiwKICAgIHdhcmVob3VzZV9hOiAiMTIwIiwKICAgIHdhcmVob3VzZV9iOiAiODkiLAogICAgd2FyZWhvdXNlX2M6ICIxNTYiLAogICAgdG90YWw6ICIzNjUiLAogICAgc3RhdHVzOiAiXHUyNzEzIEluIFN0b2NrIgogIH0sCiAgewogICAgcHJvZHVjdDogIkFpclBvZHMgUHJvIiwKICAgIHdhcmVob3VzZV9hOiAiMCIsCiAgICB3YXJlaG91c2VfYjogIjEyIiwKICAgIHdhcmVob3VzZV9jOiAiNSIsCiAgICB0b3RhbDogIjE3IiwKICAgIHN0YXR1czogIlx1MjZBMCBMb3cgU3RvY2siCiAgfSwKICB7CiAgICBwcm9kdWN0OiAiaVBhZCBBaXIiLAogICAgd2FyZWhvdXNlX2E6ICIyMyIsCiAgICB3YXJlaG91c2VfYjogIjQ1IiwKICAgIHdhcmVob3VzZV9jOiAiNjciLAogICAgdG90YWw6ICIxMzUiLAogICAgc3RhdHVzOiAiXHUyNzEzIEluIFN0b2NrIgogIH0KXX0KICAgICAgICAgIGRhdGFOYW1lPSJwcm9kdWN0cyIKICAgICAgICA+PC9kZWVzLXRhYmxlPgogICAgICA8L2Rpdj4KICAgICAgCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgyIGNsYXNzPSJkZW1vLXRpdGxlIj5UYWJsZSB3aXRoIEZ1bGwgR3JpZDwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImRlbW8tZGVzY3JpcHRpb24iPkNvbXBsZXRlIGdyaWQgbGluZXMgZm9yIG1heGltdW0gcmVhZGFiaWxpdHkgYW5kIHN0cnVjdHVyZS48L3A+CiAgICAgICAgPGRlZXMtdGFibGUKICAgICAgICAgIGhlYWRpbmcxPSJTZXJ2ZXIgTW9uaXRvcmluZyBEYXNoYm9hcmQiCiAgICAgICAgICBoZWFkaW5nMj0iUmVhbC10aW1lIG1ldHJpY3MgYWNyb3NzIHJlZ2lvbnMiCiAgICAgICAgICAuc2hvd0dyaWQ9JHt0cnVlfQogICAgICAgICAgLmRhdGE9JHtbCiAgewogICAgc2VydmVyOiAiQVBJLTEiLAogICAgcmVnaW9uOiAiVVMtRWFzdCIsCiAgICBjcHU6ICI0NSUiLAogICAgbWVtb3J5OiAiNjIlIiwKICAgIGRpc2s6ICI3OCUiLAogICAgbGF0ZW5jeTogIjEybXMiLAogICAgdXB0aW1lOiAiOTkuOSUiLAogICAgc3RhdHVzOiAiXHV7MUY3RTJ9IEhlYWx0aHkiCiAgfSwKICB7CiAgICBzZXJ2ZXI6ICJBUEktMiIsCiAgICByZWdpb246ICJFVS1XZXN0IiwKICAgIGNwdTogIjM4JSIsCiAgICBtZW1vcnk6ICI1NSUiLAogICAgZGlzazogIjQ1JSIsCiAgICBsYXRlbmN5OiAiMjVtcyIsCiAgICB1cHRpbWU6ICI5OS44JSIsCiAgICBzdGF0dXM6ICJcdXsxRjdFMn0gSGVhbHRoeSIKICB9LAogIHsKICAgIHNlcnZlcjogIkRCLU1hc3RlciIsCiAgICByZWdpb246ICJVUy1FYXN0IiwKICAgIGNwdTogIjcyJSIsCiAgICBtZW1vcnk6ICI4MSUiLAogICAgZGlzazogIjkyJSIsCiAgICBsYXRlbmN5OiAiOG1zIiwKICAgIHVwdGltZTogIjEwMCUiLAogICAgc3RhdHVzOiAiXHV7MUY3RTF9IFdhcm5pbmciCiAgfSwKICB7CiAgICBzZXJ2ZXI6ICJEQi1SZXBsaWNhIiwKICAgIHJlZ2lvbjogIkVVLVdlc3QiLAogICAgY3B1OiAiMjMlIiwKICAgIG1lbW9yeTogIjM0JSIsCiAgICBkaXNrOiAiNDUlIiwKICAgIGxhdGVuY3k6ICIxNW1zIiwKICAgIHVwdGltZTogIjk5LjclIiwKICAgIHN0YXR1czogIlx1ezFGN0UyfSBIZWFsdGh5IgogIH0sCiAgewogICAgc2VydmVyOiAiQ2FjaGUtMSIsCiAgICByZWdpb246ICJBUC1Tb3V0aCIsCiAgICBjcHU6ICI4OSUiLAogICAgbWVtb3J5OiAiOTIlIiwKICAgIGRpc2s6ICIxMiUiLAogICAgbGF0ZW5jeTogIjEyMG1zIiwKICAgIHVwdGltZTogIjk4LjUlIiwKICAgIHN0YXR1czogIlx1ezFGNTM0fSBDcml0aWNhbCIKICB9Cl19CiAgICAgICAgICBkYXRhTmFtZT0ic2VydmVycyIKICAgICAgICAgIC5kYXRhQWN0aW9ucz0iJHtbCiAgewogICAgbmFtZTogIlNTSCBDb25uZWN0IiwKICAgIGljb25OYW1lOiAibHVjaWRlOnRlcm1pbmFsIiwKICAgIHR5cGU6IFsiaW5Sb3ciXSwKICAgIGFjdGlvbkZ1bmM6IGFzeW5jIChvcHRpb25zQXJnKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJDb25uZWN0aW5nIHRvOiIsIG9wdGlvbnNBcmcuaXRlbS5zZXJ2ZXIpOwogICAgfQogIH0sCiAgewogICAgbmFtZTogIlZpZXcgTG9ncyIsCiAgICBpY29uTmFtZTogImx1Y2lkZTpmaWxlLXRleHQiLAogICAgdHlwZTogWyJpblJvdyIsICJjb250ZXh0bWVudSJdLAogICAgYWN0aW9uRnVuYzogYXN5bmMgKG9wdGlvbnNBcmcpID0+IHsKICAgICAgY29uc29sZS5sb2coIlZpZXdpbmcgbG9ncyBmb3I6Iiwgb3B0aW9uc0FyZy5pdGVtLnNlcnZlcik7CiAgICB9CiAgfSwKICB7CiAgICBuYW1lOiAiUmVzdGFydCBTZXJ2ZXIiLAogICAgaWNvbk5hbWU6ICJsdWNpZGU6cmVmcmVzaC1jdyIsCiAgICB0eXBlOiBbImNvbnRleHRtZW51Il0sCiAgICBhY3Rpb25GdW5jOiBhc3luYyAob3B0aW9uc0FyZykgPT4gewogICAgICBjb25zb2xlLmxvZygiUmVzdGFydGluZzoiLCBvcHRpb25zQXJnLml0ZW0uc2VydmVyKTsKICAgIH0KICB9Cl19IgogICAgICAgID48L2RlZXMtdGFibGU+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPlRhYmxlIHdpdGggSG9yaXpvbnRhbCBMaW5lcyBPbmx5PC9oMj4KICAgICAgICA8cCBjbGFzcz0iZGVtby1kZXNjcmlwdGlvbiI+RW1waGFzaXMgb24gcm93IHNlcGFyYXRpb24gd2l0aG91dCBjb2x1bW4gZGl2aWRlcnMuPC9wPgogICAgICAgIDxkZWVzLXRhYmxlCiAgICAgICAgICBoZWFkaW5nMT0iU2FsZXMgUGVyZm9ybWFuY2UiCiAgICAgICAgICBoZWFkaW5nMj0iVG9wIHBlcmZvcm1lcnMgdGhpcyBxdWFydGVyIgogICAgICAgICAgLnNob3dIb3Jpem9udGFsTGluZXM9JHt0cnVlfQogICAgICAgICAgLnNob3dWZXJ0aWNhbExpbmVzPSR7ZmFsc2V9CiAgICAgICAgICAuZGF0YT0ke1sKICB7CiAgICBzYWxlc3BlcnNvbjogIkVtaWx5IEpvaG5zb24iLAogICAgcmVnaW9uOiAiTm9ydGggQW1lcmljYSIsCiAgICBkZWFsc19jbG9zZWQ6ICI0MiIsCiAgICByZXZlbnVlOiAiJDEuMk0iLAogICAgcXVvdGFfYWNoaWV2ZW1lbnQ6ICIxMjglIiwKICAgIHJhdGluZzogIlx1MkI1MFx1MkI1MFx1MkI1MFx1MkI1MFx1MkI1MCIKICB9LAogIHsKICAgIHNhbGVzcGVyc29uOiAiTWljaGFlbCBDaGVuIiwKICAgIHJlZ2lvbjogIkFzaWEgUGFjaWZpYyIsCiAgICBkZWFsc19jbG9zZWQ6ICIzOCIsCiAgICByZXZlbnVlOiAiJDk4MEsiLAogICAgcXVvdGFfYWNoaWV2ZW1lbnQ6ICIxMTUlIiwKICAgIHJhdGluZzogIlx1MkI1MFx1MkI1MFx1MkI1MFx1MkI1MFx1MkI1MCIKICB9LAogIHsKICAgIHNhbGVzcGVyc29uOiAiU2FyYWggV2lsbGlhbXMiLAogICAgcmVnaW9uOiAiRXVyb3BlIiwKICAgIGRlYWxzX2Nsb3NlZDogIjM1IiwKICAgIHJldmVudWU6ICIkODc1SyIsCiAgICBxdW90YV9hY2hpZXZlbWVudDogIjEwOCUiLAogICAgcmF0aW5nOiAiXHUyQjUwXHUyQjUwXHUyQjUwXHUyQjUwIgogIH0sCiAgewogICAgc2FsZXNwZXJzb246ICJEYXZpZCBHYXJjaWEiLAogICAgcmVnaW9uOiAiTGF0aW4gQW1lcmljYSIsCiAgICBkZWFsc19jbG9zZWQ6ICIzMSIsCiAgICByZXZlbnVlOiAiJDc1MEsiLAogICAgcXVvdGFfYWNoaWV2ZW1lbnQ6ICI5NSUiLAogICAgcmF0aW5nOiAiXHUyQjUwXHUyQjUwXHUyQjUwXHUyQjUwIgogIH0KXX0KICAgICAgICAgIGRhdGFOYW1lPSJzYWxlcyByZXBzIgogICAgICAgID48L2RlZXMtdGFibGU+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPlNpbXBsZSBUYWJsZSAoTm8gR3JpZCk8L2gyPgogICAgICAgIDxwIGNsYXNzPSJkZW1vLWRlc2NyaXB0aW9uIj5DbGVhbiwgbWluaW1hbCBkZXNpZ24gd2l0aG91dCBncmlkIGxpbmVzLiBTZXQgc2hvd0dyaWQgdG8gZmFsc2UgdG8gZGlzYWJsZSB0aGUgZGVmYXVsdCBncmlkLjwvcD4KICAgICAgICA8ZGVlcy10YWJsZQogICAgICAgICAgaGVhZGluZzE9IlRlYW0gTWVtYmVycyIKICAgICAgICAgIGhlYWRpbmcyPSJFbmdpbmVlcmluZyBEZXBhcnRtZW50IgogICAgICAgICAgLnNob3dHcmlkPSR7ZmFsc2V9CiAgICAgICAgICAuZGF0YT0ke1sKICB7CiAgICBuYW1lOiAiQWxpY2UgSm9obnNvbiIsCiAgICByb2xlOiAiTGVhZCBFbmdpbmVlciIsCiAgICBlbWFpbDogImFsaWNlQGNvbXBhbnkuY29tIiwKICAgIGxvY2F0aW9uOiAiU2FuIEZyYW5jaXNjbyIsCiAgICBqb2luZWQ6ICIyMDIwLTAzLTE1IgogIH0sCiAgewogICAgbmFtZTogIkJvYiBTbWl0aCIsCiAgICByb2xlOiAiU2VuaW9yIERldmVsb3BlciIsCiAgICBlbWFpbDogImJvYkBjb21wYW55LmNvbSIsCiAgICBsb2NhdGlvbjogIk5ldyBZb3JrIiwKICAgIGpvaW5lZDogIjIwMTktMDctMjIiCiAgfSwKICB7CiAgICBuYW1lOiAiQ2hhcmxpZSBEYXZpcyIsCiAgICByb2xlOiAiRGV2T3BzIEVuZ2luZWVyIiwKICAgIGVtYWlsOiAiY2hhcmxpZUBjb21wYW55LmNvbSIsCiAgICBsb2NhdGlvbjogIkxvbmRvbiIsCiAgICBqb2luZWQ6ICIyMDIxLTAxLTEwIgogIH0sCiAgewogICAgbmFtZTogIkRpYW5hIE1hcnRpbmV6IiwKICAgIHJvbGU6ICJGcm9udGVuZCBEZXZlbG9wZXIiLAogICAgZW1haWw6ICJkaWFuYUBjb21wYW55LmNvbSIsCiAgICBsb2NhdGlvbjogIkJhcmNlbG9uYSIsCiAgICBqb2luZWQ6ICIyMDIyLTA1LTE4IgogIH0KXX0KICAgICAgICAgIGRhdGFOYW1lPSJ0ZWFtIG1lbWJlcnMiCiAgICAgICAgPjwvZGVlcy10YWJsZT4KICAgICAgPC9kaXY+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMiBjbGFzcz0iZGVtby10aXRsZSI+VGFibGUgd2l0aCBDdXN0b20gRGlzcGxheSBGdW5jdGlvbjwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImRlbW8tZGVzY3JpcHRpb24iPlRyYW5zZm9ybSBkYXRhIGZvciBkaXNwbGF5IHVzaW5nIGN1c3RvbSBmb3JtYXR0aW5nLjwvcD4KICAgICAgICA8ZGVlcy10YWJsZQogICAgICAgICAgaGVhZGluZzE9IlNhbGVzIFJlcG9ydCIKICAgICAgICAgIGhlYWRpbmcyPSJRNCAyMDIzIFBlcmZvcm1hbmNlIgogICAgICAgICAgLmRhdGE9JHtbCiAgewogICAgcHJvZHVjdDogIkVudGVycHJpc2UgTGljZW5zZSIsCiAgICB1bml0czogNDUsCiAgICByZXZlbnVlOiAyMjVlMywKICAgIGdyb3d0aDogMC4yMywKICAgIGZvcmVjYXN0OiAyOGU0CiAgfSwKICB7CiAgICBwcm9kdWN0OiAiUHJvZmVzc2lvbmFsIExpY2Vuc2UiLAogICAgdW5pdHM6IDEyOCwKICAgIHJldmVudWU6IDEyOGUzLAogICAgZ3Jvd3RoOiAwLjE1LAogICAgZm9yZWNhc3Q6IDE0N2UzCiAgfSwKICB7CiAgICBwcm9kdWN0OiAiU3RhcnRlciBMaWNlbnNlIiwKICAgIHVuaXRzOiAzNDIsCiAgICByZXZlbnVlOiA2ODQwMCwKICAgIGdyb3d0aDogMC40MiwKICAgIGZvcmVjYXN0OiA5N2UzCiAgfQpdfQogICAgICAgICAgLmRpc3BsYXlGdW5jdGlvbj0keyhpdGVtKSA9PiAoewogIFByb2R1Y3Q6IGl0ZW0ucHJvZHVjdCwKICAiVW5pdHMgU29sZCI6IGl0ZW0udW5pdHMudG9Mb2NhbGVTdHJpbmcoKSwKICBSZXZlbnVlOiAiJCIgKyBpdGVtLnJldmVudWUudG9Mb2NhbGVTdHJpbmcoKSwKICBHcm93dGg6IChpdGVtLmdyb3d0aCAqIDEwMCkudG9GaXhlZCgxKSArICIlIiwKICAiUTEgMjAyNCBGb3JlY2FzdCI6ICIkIiArIGl0ZW0uZm9yZWNhc3QudG9Mb2NhbGVTdHJpbmcoKQp9KX0KICAgICAgICAgIGRhdGFOYW1lPSJwcm9kdWN0cyIKICAgICAgICA+PC9kZWVzLXRhYmxlPgogICAgICA8L2Rpdj4KICAgICAgCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgyIGNsYXNzPSJkZW1vLXRpdGxlIj5FbXB0eSBUYWJsZSBTdGF0ZTwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImRlbW8tZGVzY3JpcHRpb24iPkhvdyB0aGUgdGFibGUgbG9va3Mgd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZS48L3A+CiAgICAgICAgPGRlZXMtdGFibGUKICAgICAgICAgIGhlYWRpbmcxPSJObyBEYXRhIEF2YWlsYWJsZSIKICAgICAgICAgIGhlYWRpbmcyPSJUaGlzIHRhYmxlIGlzIGN1cnJlbnRseSBlbXB0eSIKICAgICAgICAgIC5kYXRhPSR7W119CiAgICAgICAgICBkYXRhTmFtZT0iaXRlbXMiCiAgICAgICAgPjwvZGVlcy10YWJsZT4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMiBjbGFzcz0iZGVtby10aXRsZSI+U2NoZW1hLUZpcnN0IENvbHVtbnMgKE5ldyk8L2gyPgogICAgICAgIDxwIGNsYXNzPSJkZW1vLWRlc2NyaXB0aW9uIj5EZWZpbmVzIGNvbHVtbnMgZXhwbGljaXRseSBhbmQgcmVuZGVycyB2aWEgc2NoZW1hLiBObyBkaXNwbGF5RnVuY3Rpb24gbmVlZGVkLjwvcD4KICAgICAgICA8ZGVlcy10YWJsZQogICAgICAgICAgaGVhZGluZzE9IlVzZXJzIChTY2hlbWEtRmlyc3QpIgogICAgICAgICAgaGVhZGluZzI9IkNvbHVtbnMgZGVmaW5lIHJlbmRlcmluZyBhbmQgb3JkZXIiCiAgICAgICAgICAuY29sdW1ucz0ke1sKICB7IGtleTogIm5hbWUiLCBoZWFkZXI6ICJOYW1lIiwgc29ydGFibGU6IHRydWUgfSwKICB7IGtleTogImVtYWlsIiwgaGVhZGVyOiAiRW1haWwiLCByZW5kZXJlcjogKHY1KSA9PiBiMmA8ZGVlcy1iYWRnZT4ke3Y1fTwvZGVlcy1iYWRnZT5gIH0sCiAgeyBrZXk6ICJqb2luZWRBdCIsIGhlYWRlcjogIkpvaW5lZCIsIHJlbmRlcmVyOiAodjUpID0+IG5ldyBEYXRlKHY1KS50b0xvY2FsZURhdGVTdHJpbmcoKSB9Cl19CiAgICAgICAgICAuZGF0YT0ke1sKICB7IG5hbWU6ICJBbGljZSIsIGVtYWlsOiAiYWxpY2VAZXhhbXBsZS5jb20iLCBqb2luZWRBdDogIjIwMjItMDgtMDEiIH0sCiAgeyBuYW1lOiAiQm9iIiwgZW1haWw6ICJib2JAZXhhbXBsZS5jb20iLCBqb2luZWRBdDogIjIwMjEtMTItMTEiIH0sCiAgeyBuYW1lOiAiQ2Fyb2wiLCBlbWFpbDogImNhcm9sQGV4YW1wbGUuY29tIiwgam9pbmVkQXQ6ICIyMDIzLTAzLTIyIiB9Cl19CiAgICAgICAgICBkYXRhTmFtZT0idXNlcnMiCiAgICAgICAgPjwvZGVlcy10YWJsZT4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMiBjbGFzcz0iZGVtby10aXRsZSI+UGFydGlhbCBTY2hlbWEgKyBBdWdtZW50IChOZXcpPC9oMj4KICAgICAgICA8cCBjbGFzcz0iZGVtby1kZXNjcmlwdGlvbiI+UHJvdmlkZXMgb25seSB0aGUgaW1wb3J0YW50IGNvbHVtbnM7IHRoZSByZXN0IGFyZSBtZXJnZWQgaW4gZnJvbSBkaXNwbGF5RnVuY3Rpb24uPC9wPgogICAgICAgIDxkZWVzLXRhYmxlCiAgICAgICAgICBoZWFkaW5nMT0iVXNlcnMgKFBhcnRpYWwgKyBBdWdtZW50KSIKICAgICAgICAgIGhlYWRpbmcyPSJNaXNzaW5nIGNvbHVtbnMgYXJlIGRlcml2ZWQiCiAgICAgICAgICAuY29sdW1ucz0ke1sKICB7IGtleTogIm5hbWUiLCBoZWFkZXI6ICJOYW1lIiwgc29ydGFibGU6IHRydWUgfQpdfQogICAgICAgICAgLmRpc3BsYXlGdW5jdGlvbj0keyh1NykgPT4gKHsgbmFtZTogdTcubmFtZSwgZW1haWw6IHU3LmVtYWlsLCByb2xlOiB1Ny5yb2xlIH0pfQogICAgICAgICAgLmF1Z21lbnRGcm9tRGlzcGxheUZ1bmN0aW9uPSR7dHJ1ZX0KICAgICAgICAgIC5kYXRhPSR7WwogIHsgbmFtZTogIkVyaW4iLCBlbWFpbDogImVyaW5AZXhhbXBsZS5jb20iLCByb2xlOiAiQWRtaW4iIH0sCiAgeyBuYW1lOiAiRmlubiIsIGVtYWlsOiAiZmlubkBleGFtcGxlLmNvbSIsIHJvbGU6ICJVc2VyIiB9LAogIHsgbmFtZTogIkdpbmEiLCBlbWFpbDogImdpbmFAZXhhbXBsZS5jb20iLCByb2xlOiAiVXNlciIgfQpdfQogICAgICAgICAgZGF0YU5hbWU9InVzZXJzIgogICAgICAgID48L2RlZXMtdGFibGU+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIiAKICAgICAgICAgICBAc2VsZWN0aW9uQ2hhbmdlPSR7KGUxMSkgPT4gewogIGNvbnNvbGUubG9nKCJTZWxlY3Rpb24gY2hhbmdlZCIsIGUxMS5kZXRhaWwpOwp9fQogICAgICAgICAgIEBzZWFyY2gtY2hhbmdlZD0keyhlMTEpID0+IHsKICBjb25zdCB0YmwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGFibGVGaWx0ZXJTZWxlY3REZW1vIik7CiAgaWYgKHRibCkKICAgIHRibC5zZXRGaWx0ZXJUZXh0KGUxMS5kZXRhaWwudmFsdWUpOwp9fQogICAgICAgICAgIEBzZWFyY2gtc3VibWl0PSR7KGUxMSkgPT4gewogIGNvbnN0IHRibCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0YWJsZUZpbHRlclNlbGVjdERlbW8iKTsKICBpZiAodGJsKQogICAgdGJsLnNldEZpbHRlclRleHQoZTExLmRldGFpbC52YWx1ZSk7Cn19CiAgICAgID4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPkZpbHRlcmluZyArIE11bHRpLVNlbGVjdGlvbiAoTmV3KTwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImRlbW8tZGVzY3JpcHRpb24iPlVzZSB0aGUgc2VhcmNoIGJhciB0byBmaWx0ZXIgcm93czsgdG9nZ2xlIHNlbGVjdGlvbiB2aWEgY2hlY2tib3hlcy4gQ2xpY2sgaGVhZGVycyB0byBzb3J0LjwvcD4KICAgICAgICA8ZGVlcy1zZWFyY2hiYXI+PC9kZWVzLXNlYXJjaGJhcj4KICAgICAgICA8ZGl2IHN0eWxlPSJoZWlnaHQ6IDEycHgiPjwvZGl2PgogICAgICAgIDxkZWVzLXRhYmxlCiAgICAgICAgICBpZD0idGFibGVGaWx0ZXJTZWxlY3REZW1vIgogICAgICAgICAgaGVhZGluZzE9IkludmVudG9yeSAoRmlsdGVyICsgU2VsZWN0KSIKICAgICAgICAgIGhlYWRpbmcyPSJUcnkgdHlwaW5nIHRvIGZpbHRlciBhbmQgc2VsZWN0aW5nIG11bHRpcGxlIHJvd3MiCiAgICAgICAgICAuc2VsZWN0aW9uTW9kZT0keyJtdWx0aSJ9CiAgICAgICAgICAucm93S2V5PSR7InNrdSJ9CiAgICAgICAgICAuY29sdW1ucz0ke1sKICB7IGtleTogInNrdSIsIGhlYWRlcjogIlNLVSIsIHNvcnRhYmxlOiB0cnVlIH0sCiAgeyBrZXk6ICJuYW1lIiwgaGVhZGVyOiAiTmFtZSIsIHNvcnRhYmxlOiB0cnVlIH0sCiAgeyBrZXk6ICJzdG9jayIsIGhlYWRlcjogIlN0b2NrIiwgc29ydGFibGU6IHRydWUgfQpdfQogICAgICAgICAgLmRhdGE9JHtbCiAgeyBza3U6ICJBLTEwMCIsIG5hbWU6ICJVU0ItQyBDYWJsZSIsIHN0b2NrOiAxMjAgfSwKICB7IHNrdTogIkEtMTAxIiwgbmFtZTogIldpcmVsZXNzIE1vdXNlIiwgc3RvY2s6IDU1IH0sCiAgeyBza3U6ICJBLTEwMiIsIG5hbWU6ICJMYXB0b3AgU3RhbmQiLCBzdG9jazogMTggfSwKICB7IHNrdTogIkItMjAwIiwgbmFtZTogIktleWJvYXJkIChJU08pIiwgc3RvY2s6IDg5IH0sCiAgeyBza3U6ICJCLTIwMSIsIG5hbWU6ICJIRE1JIEFkYXB0ZXIiLCBzdG9jazogMCB9LAogIHsgc2t1OiAiQy0zMDAiLCBuYW1lOiAiV2ViY2FtIDEwODBwIiwgc3RvY2s6IDQyIH0KXX0KICAgICAgICAgIGRhdGFOYW1lPSJpdGVtcyIKICAgICAgICA+PC9kZWVzLXRhYmxlPgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgyIGNsYXNzPSJkZW1vLXRpdGxlIj5Db2x1bW4gRmlsdGVycyArIFN0aWNreSBIZWFkZXIgKE5ldyk8L2gyPgogICAgICAgIDxwIGNsYXNzPSJkZW1vLWRlc2NyaXB0aW9uIj5QZXItY29sdW1uIHF1aWNrIGZpbHRlcnMgYW5kIHN0aWNreSBoZWFkZXIgd2l0aCBpbnRlcm5hbCBzY3JvbGwuIFRyeSBmaWx0ZXJpbmcgdGhlIE5hbWUgY29sdW1uLiBVc2VzIC0tdGFibGUtbWF4LWhlaWdodCB2YXIuPC9wPgogICAgICAgIDxzdHlsZT4KICAgICAgICAgIGRlZXMtdGFibGVbc3RpY2t5LWhlYWRlcl0geyAtLXRhYmxlLW1heC1oZWlnaHQ6IDIyMHB4OyB9CiAgICAgICAgPC9zdHlsZT4KICAgICAgICA8ZGVlcy10YWJsZQogICAgICAgICAgaGVhZGluZzE9IkVtcGxveWVlcyIKICAgICAgICAgIGhlYWRpbmcyPSJRdWljayBmaWx0ZXIgcGVyIGNvbHVtbiArIHN0aWNreSBoZWFkZXIiCiAgICAgICAgICAuc2hvd0NvbHVtbkZpbHRlcnM9JHt0cnVlfQogICAgICAgICAgLnN0aWNreUhlYWRlcj0ke3RydWV9CiAgICAgICAgICAuY29sdW1ucz0ke1sKICB7IGtleTogIm5hbWUiLCBoZWFkZXI6ICJOYW1lIiwgc29ydGFibGU6IHRydWUgfSwKICB7IGtleTogImVtYWlsIiwgaGVhZGVyOiAiRW1haWwiLCBzb3J0YWJsZTogdHJ1ZSB9LAogIHsga2V5OiAiZGVwYXJ0bWVudCIsIGhlYWRlcjogIkRlcGFydG1lbnQiLCBzb3J0YWJsZTogdHJ1ZSB9Cl19CiAgICAgICAgICAuZGF0YT0ke1sKICB7IG5hbWU6ICJBbGljZSBKb2huc29uIiwgZW1haWw6ICJhbGljZUBjb3JwLmNvbSIsIGRlcGFydG1lbnQ6ICJFbmdpbmVlcmluZyIgfSwKICB7IG5hbWU6ICJCb2IgU21pdGgiLCBlbWFpbDogImJvYkBjb3JwLmNvbSIsIGRlcGFydG1lbnQ6ICJTYWxlcyIgfSwKICB7IG5hbWU6ICJDaGFybGllIERhdmlzIiwgZW1haWw6ICJjaGFybGllQGNvcnAuY29tIiwgZGVwYXJ0bWVudDogIkhSIiB9LAogIHsgbmFtZTogIkRpYW5hIE1hcnRpbmV6IiwgZW1haWw6ICJkaWFuYUBjb3JwLmNvbSIsIGRlcGFydG1lbnQ6ICJFbmdpbmVlcmluZyIgfSwKICB7IG5hbWU6ICJFdGhhbiBCcm93biIsIGVtYWlsOiAiZXRoYW5AY29ycC5jb20iLCBkZXBhcnRtZW50OiAiRmluYW5jZSIgfSwKICB7IG5hbWU6ICJGaW9uYSBDbGFyayIsIGVtYWlsOiAiZmlvbmFAY29ycC5jb20iLCBkZXBhcnRtZW50OiAiU2FsZXMiIH0sCiAgeyBuYW1lOiAiR3JhY2UgTGVlIiwgZW1haWw6ICJncmFjZUBjb3JwLmNvbSIsIGRlcGFydG1lbnQ6ICJFbmdpbmVlcmluZyIgfSwKICB7IG5hbWU6ICJIZW5yeSBXaWxzb24iLCBlbWFpbDogImhlbnJ5QGNvcnAuY29tIiwgZGVwYXJ0bWVudDogIk1hcmtldGluZyIgfSwKICB7IG5hbWU6ICJJcmVuZSBXYWxrZXIiLCBlbWFpbDogImlyZW5lQGNvcnAuY29tIiwgZGVwYXJ0bWVudDogIkZpbmFuY2UiIH0sCiAgeyBuYW1lOiAiSmFjayBUdXJuZXIiLCBlbWFpbDogImphY2tAY29ycC5jb20iLCBkZXBhcnRtZW50OiAiU3VwcG9ydCIgfQpdfQogICAgICAgICAgZGF0YU5hbWU9ImVtcGxveWVlcyIKICAgICAgICA+PC9kZWVzLXRhYmxlPgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiIKICAgICAgICBAc2VhcmNoUmVxdWVzdD0ke2FzeW5jIChlMTEpID0+IHsKICBjb25zdCB7IHF1ZXJ5IH0gPSBlMTEuZGV0YWlsIHx8IHsgcXVlcnk6ICIiIH07CiAgY29uc3QgdGFibGUyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlcnZlclNlYXJjaERlbW8iKTsKICBjb25zdCBiYXNlRGF0YSA9IFsKICAgIHsgaWQ6IDEsIG5hbWU6ICJBbGljZSIsIGNpdHk6ICJCZXJsaW4iLCB0aXRsZTogIkVuZ2luZWVyIiB9LAogICAgeyBpZDogMiwgbmFtZTogIkJvYiIsIGNpdHk6ICJQYXJpcyIsIHRpdGxlOiAiRGVzaWduZXIiIH0sCiAgICB7IGlkOiAzLCBuYW1lOiAiQ2hhcmxpZSIsIGNpdHk6ICJMb25kb24iLCB0aXRsZTogIk1hbmFnZXIiIH0sCiAgICB7IGlkOiA0LCBuYW1lOiAiRGlhbmEiLCBjaXR5OiAiTWFkcmlkIiwgdGl0bGU6ICJFbmdpbmVlciIgfSwKICAgIHsgaWQ6IDUsIG5hbWU6ICJFdGhhbiIsIGNpdHk6ICJSb21lIiwgdGl0bGU6ICJTdXBwb3J0IiB9CiAgXTsKICBhd2FpdCBuZXcgUHJvbWlzZSgocjExKSA9PiBzZXRUaW1lb3V0KHIxMSwgMzAwKSk7CiAgY29uc3QgcTIgPSBTdHJpbmcocXVlcnkgfHwgIiIpLnRvTG93ZXJDYXNlKCk7CiAgY29uc3QgZmlsdGVyZWQgPSBxMiA/IGJhc2VEYXRhLmZpbHRlcigocjExKSA9PiBPYmplY3QudmFsdWVzKHIxMSkuc29tZSgodjUpID0+IFN0cmluZyh2NSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxMikpKSA6IGJhc2VEYXRhOwogIHRhYmxlMi5kYXRhID0gZmlsdGVyZWQ7Cn19CiAgICAgID4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPlNlcnZlciBTZWFyY2ggKE5ldyk8L2gyPgogICAgICAgIDxwIGNsYXNzPSJkZW1vLWRlc2NyaXB0aW9uIj5TZWxlY3QgU2VydmVyIG1vZGUsIHR5cGUgYSBxdWVyeSwgYW5kIHdhdGNoIHRoZSB0YWJsZSBmZXRjaCBzaW11bGF0ZWQgcmVzdWx0cy48L3A+CiAgICAgICAgPGRlZXMtdGFibGUKICAgICAgICAgIGlkPSJzZXJ2ZXJTZWFyY2hEZW1vIgogICAgICAgICAgaGVhZGluZzE9IlBlb3BsZSAoU2VydmVyIFNlYXJjaCkiCiAgICAgICAgICBoZWFkaW5nMj0iQ2xpY2sgU2VhcmNoLCBjaG9vc2UgU2VydmVyIG1vZGUsIGFuZCB0eXBlIgogICAgICAgICAgLmNvbHVtbnM9JHtbCiAgeyBrZXk6ICJuYW1lIiwgaGVhZGVyOiAiTmFtZSIgfSwKICB7IGtleTogImNpdHkiLCBoZWFkZXI6ICJDaXR5IiB9LAogIHsga2V5OiAidGl0bGUiLCBoZWFkZXI6ICJUaXRsZSIgfQpdfQogICAgICAgICAgLmRhdGE9JHtbCiAgeyBpZDogMSwgbmFtZTogIkFsaWNlIiwgY2l0eTogIkJlcmxpbiIsIHRpdGxlOiAiRW5naW5lZXIiIH0sCiAgeyBpZDogMiwgbmFtZTogIkJvYiIsIGNpdHk6ICJQYXJpcyIsIHRpdGxlOiAiRGVzaWduZXIiIH0sCiAgeyBpZDogMywgbmFtZTogIkNoYXJsaWUiLCBjaXR5OiAiTG9uZG9uIiwgdGl0bGU6ICJNYW5hZ2VyIiB9LAogIHsgaWQ6IDQsIG5hbWU6ICJEaWFuYSIsIGNpdHk6ICJNYWRyaWQiLCB0aXRsZTogIkVuZ2luZWVyIiB9LAogIHsgaWQ6IDUsIG5hbWU6ICJFdGhhbiIsIGNpdHk6ICJSb21lIiwgdGl0bGU6ICJTdXBwb3J0IiB9Cl19CiAgICAgICAgICBkYXRhTmFtZT0icGVvcGxlIgogICAgICAgID48L2RlZXMtdGFibGU+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPldpZGUgUHJvcGVydGllcyArIE1hbnkgQWN0aW9uczwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImRlbW8tZGVzY3JpcHRpb24iPkEgdGFibGUgd2l0aCBtYW55IGNvbHVtbnMgYW5kIHJpY2ggYWN0aW9ucyB0byBzdHJlc3MgdGVzdCBsYXlvdXQgYW5kIHN0aWNreSBBY3Rpb25zLjwvcD4KICAgICAgICA8ZGVlcy10YWJsZQogICAgICAgICAgaGVhZGluZzE9IlBlb3BsZSBEaXJlY3RvcnkiCiAgICAgICAgICBoZWFkaW5nMj0iTWFueSBwcm9wZXJ0aWVzIGFuZCBhY3Rpb25zIgogICAgICAgICAgLmNvbHVtbnM9JHtbCiAgeyBrZXk6ICJpZCIsIGhlYWRlcjogIklEIiwgc29ydGFibGU6IHRydWUgfSwKICB7IGtleTogIm5hbWUiLCBoZWFkZXI6ICJOYW1lIiwgc29ydGFibGU6IHRydWUgfSwKICB7IGtleTogInJvbGUiLCBoZWFkZXI6ICJSb2xlIiwgc29ydGFibGU6IHRydWUgfSwKICB7IGtleTogImRlcGFydG1lbnQiLCBoZWFkZXI6ICJEZXBhcnRtZW50Iiwgc29ydGFibGU6IHRydWUgfSwKICB7IGtleTogImVtYWlsIiwgaGVhZGVyOiAiRW1haWwiIH0sCiAgeyBrZXk6ICJwaG9uZSIsIGhlYWRlcjogIlBob25lIiB9LAogIHsga2V5OiAibG9jYXRpb24iLCBoZWFkZXI6ICJMb2NhdGlvbiIsIHNvcnRhYmxlOiB0cnVlIH0sCiAgeyBrZXk6ICJzdGF0dXMiLCBoZWFkZXI6ICJTdGF0dXMiLCBzb3J0YWJsZTogdHJ1ZSB9LAogIHsga2V5OiAiY3JlYXRlZEF0IiwgaGVhZGVyOiAiQ3JlYXRlZCIsIHNvcnRhYmxlOiB0cnVlIH0sCiAgeyBrZXk6ICJ1cGRhdGVkQXQiLCBoZWFkZXI6ICJVcGRhdGVkIiwgc29ydGFibGU6IHRydWUgfSwKICB7IGtleTogImxhc3RMb2dpbiIsIGhlYWRlcjogIkxhc3QgTG9naW4iLCBzb3J0YWJsZTogdHJ1ZSB9LAogIHsga2V5OiAicHJvamVjdHMiLCBoZWFkZXI6ICJQcm9qZWN0cyIgfSwKICB7IGtleTogInRhZ3MiLCBoZWFkZXI6ICJUYWdzIiB9LAogIHsga2V5OiAibm90ZXMiLCBoZWFkZXI6ICJOb3RlcyIgfQpdfQogICAgICAgICAgLmRhdGE9JHtbCiAgeyBpZDogMSwgbmFtZTogIkFsaWNlIEpvaG5zb24iLCByb2xlOiAiRW5naW5lZXIiLCBkZXBhcnRtZW50OiAiUiZEIiwgZW1haWw6ICJhbGljZUBjb3JwLmNvbSIsIHBob25lOiAiKzEgMjAyIDU1NSAwMTExIiwgbG9jYXRpb246ICJCZXJsaW4iLCBzdGF0dXM6ICJBY3RpdmUiLCBjcmVhdGVkQXQ6ICIyMDIzLTAxLTEyIiwgdXBkYXRlZEF0OiAiMjAyNC0wNS0wMyIsIGxhc3RMb2dpbjogIjIwMjQtMTAtMDEiLCBwcm9qZWN0czogNSwgdGFnczogInR5cGVzY3JpcHQsIHVpIiwgbm90ZXM6ICJNZW50b3IiIH0sCiAgeyBpZDogMiwgbmFtZTogIkJvYiBTbWl0aCIsIHJvbGU6ICJEZXNpZ25lciIsIGRlcGFydG1lbnQ6ICJEZXNpZ24iLCBlbWFpbDogImJvYkBjb3JwLmNvbSIsIHBob25lOiAiKzEgMjAyIDU1NSAwMTEyIiwgbG9jYXRpb246ICJQYXJpcyIsIHN0YXR1czogIkFjdGl2ZSIsIGNyZWF0ZWRBdDogIjIwMjItMTEtMDUiLCB1cGRhdGVkQXQ6ICIyMDI0LTA0LTEwIiwgbGFzdExvZ2luOiAiMjAyNC0wOS0yOCIsIHByb2plY3RzOiA4LCB0YWdzOiAiZmlnbWEsIGJyYW5kIiwgbm90ZXM6ICJQYXJ0LXRpbWUiIH0sCiAgeyBpZDogMywgbmFtZTogIkNoYXJsaWUgRGF2aXMiLCByb2xlOiAiTWFuYWdlciIsIGRlcGFydG1lbnQ6ICJPcHMiLCBlbWFpbDogImNoYXJsaWVAY29ycC5jb20iLCBwaG9uZTogIisxIDIwMiA1NTUgMDExMyIsIGxvY2F0aW9uOiAiTG9uZG9uIiwgc3RhdHVzOiAiT24gTGVhdmUiLCBjcmVhdGVkQXQ6ICIyMDIxLTA0LTIxIiwgdXBkYXRlZEF0OiAiMjAyNC0wMi0xNSIsIGxhc3RMb2dpbjogIjIwMjQtMDgtMTIiLCBwcm9qZWN0czogMywgdGFnczogInNyZSwgbGVhZGVyc2hpcCIsIG5vdGVzOiAiIiB9LAogIHsgaWQ6IDQsIG5hbWU6ICJEaWFuYSBNYXJ0aW5leiIsIHJvbGU6ICJFbmdpbmVlciIsIGRlcGFydG1lbnQ6ICJQbGF0Zm9ybSIsIGVtYWlsOiAiZGlhbmFAY29ycC5jb20iLCBwaG9uZTogIisxIDIwMiA1NTUgMDExNCIsIGxvY2F0aW9uOiAiTWFkcmlkIiwgc3RhdHVzOiAiQWN0aXZlIiwgY3JlYXRlZEF0OiAiMjAyMC0wNi0zMCIsIHVwZGF0ZWRBdDogIjIwMjQtMDYtMjUiLCBsYXN0TG9naW46ICIyMDI0LTEwLTAyIiwgcHJvamVjdHM6IDYsIHRhZ3M6ICJub2RlLCBhcGkiLCBub3RlczogIk9uLWNhbGwiIH0sCiAgeyBpZDogNSwgbmFtZTogIkV0aGFuIEJyb3duIiwgcm9sZTogIlN1cHBvcnQiLCBkZXBhcnRtZW50OiAiQ1MiLCBlbWFpbDogImV0aGFuQGNvcnAuY29tIiwgcGhvbmU6ICIrMSAyMDIgNTU1IDAxMTUiLCBsb2NhdGlvbjogIlJvbWUiLCBzdGF0dXM6ICJJbmFjdGl2ZSIsIGNyZWF0ZWRBdDogIjIwMTktMDktMTgiLCB1cGRhdGVkQXQ6ICIyMDI0LTAzLTA5IiwgbGFzdExvZ2luOiAiMjAyNC0wNi0xOSIsIHByb2plY3RzOiAyLCB0YWdzOiAiemVuZGVzayIsIG5vdGVzOiAiUmVoaXJlIiB9LAogIHsgaWQ6IDYsIG5hbWU6ICJGaW9uYSBDbGFyayIsIHJvbGU6ICJRQSIsIGRlcGFydG1lbnQ6ICJRQSIsIGVtYWlsOiAiZmlvbmFAY29ycC5jb20iLCBwaG9uZTogIisxIDIwMiA1NTUgMDExNiIsIGxvY2F0aW9uOiAiVmllbm5hIiwgc3RhdHVzOiAiQWN0aXZlIiwgY3JlYXRlZEF0OiAiMjAyMi0wMy0xNCIsIHVwZGF0ZWRBdDogIjIwMjQtMDMtMDEiLCBsYXN0TG9naW46ICIyMDI0LTA5LTA3IiwgcHJvamVjdHM6IDcsIHRhZ3M6ICJwbGF5d3JpZ2h0Iiwgbm90ZXM6ICIiIH0KXX0KICAgICAgICAgIC5kYXRhQWN0aW9ucz0ke1sKICB7IG5hbWU6ICJWaWV3IiwgaWNvbk5hbWU6ICJsdWNpZGU6ZXllIiwgdHlwZTogWyJpblJvdyIsICJjb250ZXh0bWVudSJdLCBhY3Rpb25GdW5jOiBhc3luYyAoeyBpdGVtIH0pID0+IHsKICAgIGNvbnNvbGUubG9nKCJ2aWV3IiwgaXRlbSk7CiAgfSB9LAogIHsgbmFtZTogIkVkaXQiLCBpY29uTmFtZTogImx1Y2lkZTplZGl0IiwgdHlwZTogWyJpblJvdyIsICJjb250ZXh0bWVudSJdLCBhY3Rpb25GdW5jOiBhc3luYyAoeyBpdGVtIH0pID0+IHsKICAgIGNvbnNvbGUubG9nKCJlZGl0IiwgaXRlbSk7CiAgfSB9LAogIHsgbmFtZTogIkRlbGV0ZSIsIGljb25OYW1lOiAibHVjaWRlOnRyYXNoIiwgdHlwZTogWyJpblJvdyIsICJjb250ZXh0bWVudSJdLCBhY3Rpb25GdW5jOiBhc3luYyAoeyBpdGVtIH0pID0+IHsKICAgIGNvbnNvbGUubG9nKCJkZWxldGUiLCBpdGVtKTsKICB9IH0sCiAgeyBuYW1lOiAiTWVzc2FnZSIsIGljb25OYW1lOiAibHVjaWRlOm1lc3NhZ2Utc3F1YXJlIiwgdHlwZTogWyJpblJvdyJdLCBhY3Rpb25GdW5jOiBhc3luYyAoeyBpdGVtIH0pID0+IHsKICAgIGNvbnNvbGUubG9nKCJtZXNzYWdlIiwgaXRlbSk7CiAgfSB9LAogIHsgbmFtZTogIkhpc3RvcnkiLCBpY29uTmFtZTogImx1Y2lkZTpjbG9jayIsIHR5cGU6IFsiaW5Sb3ciXSwgYWN0aW9uRnVuYzogYXN5bmMgKHsgaXRlbSB9KSA9PiB7CiAgICBjb25zb2xlLmxvZygiaGlzdG9yeSIsIGl0ZW0pOwogIH0gfSwKICB7IG5hbWU6ICJBZGQgTmV3IiwgaWNvbk5hbWU6ICJsdWNpZGU6cGx1cyIsIHR5cGU6IFsiaGVhZGVyIl0sIGFjdGlvbkZ1bmM6IGFzeW5jICh7IHRhYmxlOiB0YWJsZTIgfSkgPT4gewogICAgY29uc29sZS5sb2coImFkZCIpOwogIH0gfSwKICB7IG5hbWU6ICJFeHBvcnQgQ1NWIiwgaWNvbk5hbWU6ICJsdWNpZGU6ZG93bmxvYWQiLCB0eXBlOiBbImhlYWRlciJdLCBhY3Rpb25GdW5jOiBhc3luYyAoeyB0YWJsZTogdGFibGUyIH0pID0+IHsKICAgIGNvbnNvbGUubG9nKCJleHBvcnQiKTsKICB9IH0sCiAgeyBuYW1lOiAiQnVsayBEZWxldGUiLCBpY29uTmFtZTogImx1Y2lkZTp0cmFzaC0yIiwgdHlwZTogWyJmb290ZXIiXSwgYWN0aW9uRnVuYzogYXN5bmMgKHsgdGFibGU6IHRhYmxlMiB9KSA9PiB7CiAgICBjb25zb2xlLmxvZygiYnVsayBkZWxldGUiKTsKICB9IH0KXX0KICAgICAgICA+PC9kZWVzLXRhYmxlPgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgyIGNsYXNzPSJkZW1vLXRpdGxlIj5TY3JvbGxhYmxlIFNtYWxsIEhlaWdodDwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImRlbW8tZGVzY3JpcHRpb24iPlNhbWUgYXMgYWJvdmUsIGJ1dCB3aXRoIG1hbnkgaXRlbXMgYW5kIGEgc21hbGwgZml4ZWQgaGVpZ2h0IHRvIGZvcmNlIHZlcnRpY2FsIHNjcm9sbGluZyBpbnNpZGUgdGhlIHRhYmxlLiBBY3Rpb25zIHJlbWFpbiB2aXNpYmxlIG9uIHRoZSByaWdodDsgaG9yaXpvbnRhbCBzY3JvbGwgYXBwZWFycyBpZiBuZWVkZWQuPC9wPgogICAgICAgIDxzdHlsZT4KICAgICAgICAgICNzY3JvbGxTbWFsbEhlaWdodCB7IC0tdGFibGUtbWF4LWhlaWdodDogMjQwcHg7IH0KICAgICAgICA8L3N0eWxlPgogICAgICAgIDxkZWVzLXRhYmxlCiAgICAgICAgICBpZD0ic2Nyb2xsU21hbGxIZWlnaHQiCiAgICAgICAgICAuc3RpY2t5SGVhZGVyPSR7dHJ1ZX0KICAgICAgICAgIGhlYWRpbmcxPSJQZW9wbGUgRGlyZWN0b3J5IChTY3JvbGxhYmxlKSIKICAgICAgICAgIGhlYWRpbmcyPSJGb3JjZWQgc2Nyb2xsaW5nIHdpdGggbWFueSBpdGVtcyIKICAgICAgICAgIC5jb2x1bW5zPSR7WwogIHsga2V5OiAiaWQiLCBoZWFkZXI6ICJJRCIsIHNvcnRhYmxlOiB0cnVlIH0sCiAgeyBrZXk6ICJuYW1lIiwgaGVhZGVyOiAiTmFtZSIsIHNvcnRhYmxlOiB0cnVlIH0sCiAgeyBrZXk6ICJyb2xlIiwgaGVhZGVyOiAiUm9sZSIsIHNvcnRhYmxlOiB0cnVlIH0sCiAgeyBrZXk6ICJkZXBhcnRtZW50IiwgaGVhZGVyOiAiRGVwYXJ0bWVudCIsIHNvcnRhYmxlOiB0cnVlIH0sCiAgeyBrZXk6ICJlbWFpbCIsIGhlYWRlcjogIkVtYWlsIiB9LAogIHsga2V5OiAicGhvbmUiLCBoZWFkZXI6ICJQaG9uZSIgfSwKICB7IGtleTogImxvY2F0aW9uIiwgaGVhZGVyOiAiTG9jYXRpb24iLCBzb3J0YWJsZTogdHJ1ZSB9LAogIHsga2V5OiAic3RhdHVzIiwgaGVhZGVyOiAiU3RhdHVzIiwgc29ydGFibGU6IHRydWUgfSwKICB7IGtleTogImNyZWF0ZWRBdCIsIGhlYWRlcjogIkNyZWF0ZWQiLCBzb3J0YWJsZTogdHJ1ZSB9LAogIHsga2V5OiAidXBkYXRlZEF0IiwgaGVhZGVyOiAiVXBkYXRlZCIsIHNvcnRhYmxlOiB0cnVlIH0sCiAgeyBrZXk6ICJsYXN0TG9naW4iLCBoZWFkZXI6ICJMYXN0IExvZ2luIiwgc29ydGFibGU6IHRydWUgfSwKICB7IGtleTogInByb2plY3RzIiwgaGVhZGVyOiAiUHJvamVjdHMiIH0sCiAgeyBrZXk6ICJ0YWdzIiwgaGVhZGVyOiAiVGFncyIgfSwKICB7IGtleTogIm5vdGVzIiwgaGVhZGVyOiAiTm90ZXMiIH0KXX0KICAgICAgICAgIC5kYXRhPSR7QXJyYXkuZnJvbSh7IGxlbmd0aDogMTAwIH0sIChfNCwgaTExKSA9PiAoewogIGlkOiBpMTEgKyAxLAogIG5hbWU6IGBVc2VyICR7aTExICsgMX1gLAogIHJvbGU6IFsiRW5naW5lZXIiLCAiRGVzaWduZXIiLCAiTWFuYWdlciIsICJRQSIsICJTdXBwb3J0Il1baTExICUgNV0sCiAgZGVwYXJ0bWVudDogWyJSJkQiLCAiRGVzaWduIiwgIk9wcyIsICJRQSIsICJDUyJdW2kxMSAlIDVdLAogIGVtYWlsOiBgdXNlciR7aTExICsgMX1AY29ycC5jb21gLAogIHBob25lOiBgKzEgMjAyIDU1NSAke1N0cmluZygxZTMgKyBpMTEpLnNsaWNlKC00KX1gLAogIGxvY2F0aW9uOiBbIkJlcmxpbiIsICJQYXJpcyIsICJMb25kb24iLCAiTWFkcmlkIiwgIlJvbWUiXVtpMTEgJSA1XSwKICBzdGF0dXM6IFsiQWN0aXZlIiwgIkluYWN0aXZlIiwgIk9uIExlYXZlIl1baTExICUgM10sCiAgY3JlYXRlZEF0OiBgMjAyMy0ke1N0cmluZyhpMTEgJSAxMiArIDEpLnBhZFN0YXJ0KDIsICIwIil9LSR7U3RyaW5nKGkxMSAlIDI4ICsgMSkucGFkU3RhcnQoMiwgIjAiKX1gLAogIHVwZGF0ZWRBdDogYDIwMjQtJHtTdHJpbmcoKGkxMSArIDMpICUgMTIgKyAxKS5wYWRTdGFydCgyLCAiMCIpfS0ke1N0cmluZygoaTExICsgNykgJSAyOCArIDEpLnBhZFN0YXJ0KDIsICIwIil9YCwKICBsYXN0TG9naW46IGAyMDI0LSR7U3RyaW5nKChpMTEgKyA2KSAlIDEyICsgMSkucGFkU3RhcnQoMiwgIjAiKX0tJHtTdHJpbmcoKGkxMSArIDEwKSAlIDI4ICsgMSkucGFkU3RhcnQoMiwgIjAiKX1gLAogIHByb2plY3RzOiBpMTEgJSAxMiwKICB0YWdzOiBpMTEgJSAyID8gInR5cGVzY3JpcHQiIDogImRlc2lnbiIsCiAgbm90ZXM6IGkxMSAlIDMgPyAiIiA6ICJOb3RlIgp9KSl9CiAgICAgICAgICAuZGF0YUFjdGlvbnM9JHtbCiAgeyBuYW1lOiAiVmlldyIsIGljb25OYW1lOiAibHVjaWRlOmV5ZSIsIHR5cGU6IFsiaW5Sb3ciXSwgYWN0aW9uRnVuYzogYXN5bmMgKHsgaXRlbSB9KSA9PiB7CiAgfSB9LAogIHsgbmFtZTogIkVkaXQiLCBpY29uTmFtZTogImx1Y2lkZTplZGl0IiwgdHlwZTogWyJpblJvdyJdLCBhY3Rpb25GdW5jOiBhc3luYyAoeyBpdGVtIH0pID0+IHsKICB9IH0sCiAgeyBuYW1lOiAiRGVsZXRlIiwgaWNvbk5hbWU6ICJsdWNpZGU6dHJhc2giLCB0eXBlOiBbImluUm93Il0sIGFjdGlvbkZ1bmM6IGFzeW5jICh7IGl0ZW0gfSkgPT4gewogIH0gfQpdfQogICAgICAgID48L2RlZXMtdGFibGU+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC9kaXY+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZGF0YXZpZXcvZGVlcy10YWJsZS9zdHlsZXMuanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF90aGVtZSgpOwp2YXIgdGFibGVTdHlsZXMgPSBbCiAgdGhlbWVEZWZhdWx0U3R5bGVzLAogIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5tYWluYm94IHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDMuOSUpIiwgImhzbCgwIDAlIDk4JSkiKX07CiAgICAgICAgZm9udC1mYW1pbHk6ICR7Y3NzR2Vpc3RGb250RmFtaWx5fTsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgMy45JSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICAuaGVhZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIHBhZGRpbmc6IDE2cHggMjRweDsKICAgICAgICBtaW4taGVpZ2h0OiA2NHB4OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgfQoKICAgICAgLmhlYWRpbmdDb250YWluZXIgewogICAgICAgIGZsZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nIHsKICAgICAgICBsaW5lLWhlaWdodDogMS41OwogICAgICB9CgogICAgICAuaGVhZGluZzEgewogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk1JSkiKX07CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAyNWVtOwogICAgICB9CiAgICAgIAogICAgICAuaGVhZGluZzIgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA1Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA1NS4xJSkiKX07CiAgICAgICAgbWFyZ2luLXRvcDogMnB4OwogICAgICB9CgogICAgICAuaGVhZGluZ1NlcGFyYXRpb24gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5oZWFkZXJBY3Rpb25zIHsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5oZWFkZXJBY3Rpb24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDZweDsKICAgICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQ1LjElKSIsICJoc2woMCAwJSA2My45JSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLmhlYWRlckFjdGlvbjpob3ZlciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTUlKSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUuMSUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA3OS44JSkiLCAiaHNsKDAgMCUgMjAuOSUpIil9OwogICAgICB9CgogICAgICAuaGVhZGVyQWN0aW9uIGRlZXMtaWNvbiB7CiAgICAgICAgd2lkdGg6IDE0cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICB9CgogICAgICAuc2VhcmNoR3JpZCB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLWdhcDogMTZweDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciBtYXgtY29udGVudDsKICAgICAgICBwYWRkaW5nOiAxNnB4IDI0cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk4JSkiLCAiaHNsKDAgMCUgMy45JSkiKX07CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgIH0KCiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA5MDBweCkgewogICAgICAgIC5zZWFyY2hHcmlkIHsKICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyogbGV0IHNlYXJjaCBtb2RlIHNpemUgdG8gY29udGVudCAobm8gZm9yY2VkIHdpZHRoKSAqLwoKICAgICAgLnNlYXJjaEdyaWQuaGlkZGVuIHsKICAgICAgICBoZWlnaHQ6IDBweDsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcGFkZGluZzogMHB4IDI0cHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbS13aWR0aDogMHB4OwogICAgICB9CgogICAgICAudGFibGVTY3JvbGwgewogICAgICAgIC8qIGVuYWJsZSBob3Jpem9udGFsIHNjcm9sbCBvbmx5IHdoZW4gY29udGVudCBleGNlZWRzIHdpZHRoICovCiAgICAgICAgb3ZlcmZsb3cteDogYXV0bzsKICAgICAgICAvKiBwcmV2ZW50IHZlcnRpY2FsIHNjcm9sbCBpbnNpZGUgdGhlIHRhYmxlIGNvbnRhaW5lciAqLwogICAgICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKICAgICAgICAvKiBhdm9pZCByZXNlcnZpbmcgZXh0cmEgc3BhY2UgZm9yIGNsYXNzaWMgc2Nyb2xsYmFycyB3aGVyZSBwb3NzaWJsZSAqLwogICAgICAgIHNjcm9sbGJhci1ndXR0ZXI6IHN0YWJsZSBib3RoLWVkZ2VzOwogICAgICB9CiAgICAgIC8qIEhpZGUgaG9yaXpvbnRhbCBzY3JvbGxiYXIgZW50aXJlbHkgd2hlbiBub3QgdXNpbmcgc3RpY2t5IGhlYWRlciAqLwogICAgICA6aG9zdCg6bm90KFtzdGlja3ktaGVhZGVyXSkpIC50YWJsZVNjcm9sbCB7CiAgICAgICAgLW1zLW92ZXJmbG93LXN0eWxlOiBub25lOyAvKiBJRS9FZGdlICovCiAgICAgICAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOyAgIC8qIEZpcmVmb3ggKGhpZGVzIGJvdGggYXhlcykgKi8KICAgICAgfQogICAgICA6aG9zdCg6bm90KFtzdGlja3ktaGVhZGVyXSkpIC50YWJsZVNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7IC8qIENocm9tZS9TYWZhcmkgKi8KICAgICAgfQogICAgICAvKiBJbiBzdGlja3ktaGVhZGVyIG1vZGUsIGhpZGUgb25seSB0aGUgaG9yaXpvbnRhbCBzY3JvbGxiYXIgaW4gV2ViS2l0L0JsaW5rICovCiAgICAgIDpob3N0KFtzdGlja3ktaGVhZGVyXSkgLnRhYmxlU2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhcjpob3Jpem9udGFsIHsKICAgICAgICBoZWlnaHQ6IDBweDsKICAgICAgfQogICAgICA6aG9zdChbc3RpY2t5LWhlYWRlcl0pIC50YWJsZVNjcm9sbCB7CiAgICAgICAgbWF4LWhlaWdodDogdmFyKC0tdGFibGUtbWF4LWhlaWdodCwgMzYwcHgpOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICB0YWJsZSB7CiAgICAgICAgLyogYWxsb3cgdGFibGUgdG8gZ3JvdyB3aWRlciB0aGFuIGNvbnRhaW5lciBzbyBhY3Rpb25zIGNvbHVtbiBjYW4gc3RpY2sgKi8KICAgICAgICB3aWR0aDogbWF4LWNvbnRlbnQ7CiAgICAgICAgbWluLXdpZHRoOiAxMDAlOwogICAgICAgIGNhcHRpb24tc2lkZTogYm90dG9tOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOwogICAgICAgIGJvcmRlci1zcGFjaW5nOiAwOwogICAgICB9CiAgICAgIAogICAgICAubm9EYXRhU2V0IHsKICAgICAgICBwYWRkaW5nOiA0OHB4IDI0cHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDU2LjklKSIsICJoc2woMjE1IDIwLjIlIDU1LjElKSIpfTsKICAgICAgfQogICAgICAKICAgICAgdGhlYWQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5Ni4xJSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNzkuOCUpIiwgImhzbCgwIDAlIDIwLjklKSIpfTsKICAgICAgfQogICAgICA6aG9zdChbc3RpY2t5LWhlYWRlcl0pIHRoZWFkIHRoIHsKICAgICAgICBwb3NpdGlvbjogc3RpY2t5OwogICAgICAgIHRvcDogMDsKICAgICAgICB6LWluZGV4OiAyOwogICAgICB9CiAgICAgIAogICAgICB0Ym9keSB0ciB7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjE1cyBlYXNlOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgLyogRGVmYXVsdCBob3Jpem9udGFsIGxpbmVzIChib3R0b20gYm9yZGVyIG9ubHkpICovCiAgICAgIHRib2R5IHRyIHsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgIH0KICAgICAgCiAgICAgIHRib2R5IHRyOmxhc3QtY2hpbGQgewogICAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7CiAgICAgIH0KICAgICAgCiAgICAgIC8qIEZ1bGwgaG9yaXpvbnRhbCBsaW5lcyB3aGVuIGVuYWJsZWQgKi8KICAgICAgOmhvc3QoW3Nob3ctaG9yaXpvbnRhbC1saW5lc10pIHRib2R5IHRyIHsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICB9CiAgICAgIAogICAgICA6aG9zdChbc2hvdy1ob3Jpem9udGFsLWxpbmVzXSkgdGJvZHkgdHI6Zmlyc3QtY2hpbGQgewogICAgICAgIGJvcmRlci10b3A6IG5vbmU7CiAgICAgIH0KICAgICAgCiAgICAgIDpob3N0KFtzaG93LWhvcml6b250YWwtbGluZXNdKSB0Ym9keSB0cjpsYXN0LWNoaWxkIHsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgIH0KICAgICAgCiAgICAgIHRib2R5IHRyOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUgLyAwLjUpIiwgImhzbCgwIDAlIDE0LjklIC8gMC41KSIpfTsKICAgICAgfQogICAgICAKICAgICAgLyogQ29sdW1uIGhvdmVyIGVmZmVjdCBmb3IgYmV0dGVyIHRyYWNlYWJpbGl0eSAqLwogICAgICB0ZCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICB0ZDo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElIC8gMC4zKSIsICJoc2woMCAwJSAxNC45JSAvIDAuMykiKX07CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2U7CiAgICAgICAgei1pbmRleDogLTE7CiAgICAgIH0KICAgICAgCiAgICAgIHRkOmhvdmVyOjphZnRlciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQogICAgICAKICAgICAgLyogR3JpZCBtb2RlIC0gc2hvd3MgYm90aCB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBsaW5lcyAqLwogICAgICA6aG9zdChbc2hvdy1ncmlkXSkgdGggewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgICAgIGJvcmRlci10b3A6IG5vbmU7CiAgICAgIH0KICAgICAgCiAgICAgIDpob3N0KFtzaG93LWdyaWRdKSB0ZCB7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgfQogICAgICAKICAgICAgOmhvc3QoW3Nob3ctZ3JpZF0pIHRoOmZpcnN0LWNoaWxkLAogICAgICA6aG9zdChbc2hvdy1ncmlkXSkgdGQ6Zmlyc3QtY2hpbGQgewogICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgIH0KICAgICAgCiAgICAgIDpob3N0KFtzaG93LWdyaWRdKSB0Ym9keSB0cjpmaXJzdC1jaGlsZCB0ZCB7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgfQoKICAgICAgLyogU3RpY2t5IEFjdGlvbnMgY29sdW1uIChyaWdodCBwaW5uZWQpICovCiAgICAgIHRoZWFkIHRoLmFjdGlvbnNDb2wsCiAgICAgIHRib2R5IHRkLmFjdGlvbnNDb2wgewogICAgICAgIHBvc2l0aW9uOiBzdGlja3k7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDMuOSUpIil9OwogICAgICB9CiAgICAgIHRoZWFkIHRoLmFjdGlvbnNDb2wgeyB6LWluZGV4OiAzOyB9CiAgICAgIHRib2R5IHRkLmFjdGlvbnNDb2wgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgYm94LXNoYWRvdzogLTFweCAwIDAgMCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgfQogICAgICAKICAgICAgdGJvZHkgdHIuc2VsZWN0ZWQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5Ni4xJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICB9CgogICAgICB0Ym9keSB0ci5oYXNBdHRhY2htZW50IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlIC8gMC4xKSIsICJoc2woMTQyLjEgNzYuMiUgMzYuMyUgLyAwLjEpIil9OwogICAgICB9CgogICAgICB0aCB7CiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIHBhZGRpbmc6IDEycHggMjRweDsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNDYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtOwogICAgICB9CiAgICAgIAogICAgICA6aG9zdChbc2hvdy12ZXJ0aWNhbC1saW5lc10pIHRoIHsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgfQogICAgICAKICAgICAgdGQgewogICAgICAgIHBhZGRpbmc6IDEycHggMjRweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMy45JSkiLCAiaHNsKDAgMCUgOTglKSIpfTsKICAgICAgfQogICAgICAKICAgICAgOmhvc3QoW3Nob3ctdmVydGljYWwtbGluZXNdKSB0ZCB7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgIH0KICAgICAgCiAgICAgIHRoOmZpcnN0LWNoaWxkLAogICAgICB0ZDpmaXJzdC1jaGlsZCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAyNHB4OwogICAgICB9CiAgICAgIAogICAgICB0aDpsYXN0LWNoaWxkLAogICAgICB0ZDpsYXN0LWNoaWxkIHsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAyNHB4OwogICAgICB9CiAgICAgIAogICAgICA6aG9zdChbc2hvdy12ZXJ0aWNhbC1saW5lc10pIHRoOmxhc3QtY2hpbGQsCiAgICAgIDpob3N0KFtzaG93LXZlcnRpY2FsLWxpbmVzXSkgdGQ6bGFzdC1jaGlsZCB7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiBub25lOwogICAgICB9CiAgICAgIAogICAgICAuaW5uZXJDZWxsQ29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWluLWhlaWdodDogMjRweDsKICAgICAgICBsaW5lLWhlaWdodDogMjRweDsKICAgICAgfQogICAgICB0ZCBpbnB1dCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNHB4OwogICAgICAgIGJvdHRvbTogNHB4OwogICAgICAgIGxlZnQ6IDIwcHg7CiAgICAgICAgcmlnaHQ6IDIwcHg7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDQwcHgpOwogICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gOHB4KTsKICAgICAgICBwYWRkaW5nOiAwIDEycHg7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDklKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDMuOSUpIiwgImhzbCgwIDAlIDk4JSkiKX07CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgZm9udC1zaXplOiBpbmhlcml0OwogICAgICAgIGZvbnQtd2VpZ2h0OiBpbmhlcml0OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpOwogICAgICB9CiAgICAgIAogICAgICB0ZCBpbnB1dDpmb2N1cyB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIil9OwogICAgICAgIG91dGxpbmU6IDJweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBvdXRsaW5lLW9mZnNldDogMnB4OwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlIC8gMC4yKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUgLyAwLjIpIil9OwogICAgICB9CgogICAgICAvKiBmaWx0ZXIgcm93ICovCiAgICAgIHRoZWFkIHRyLmZpbHRlcnNSb3cgdGggewogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4IDEycHggMTJweDsKICAgICAgfQogICAgICB0aGVhZCB0ci5maWx0ZXJzUm93IHRoIGlucHV0W3R5cGU9J3RleHQnXSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDklKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDMuOSUpIiwgImhzbCgwIDAlIDk4JSkiKX07CiAgICAgIH0KICAgICAgLmFjdGlvbnNDb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBnYXA6IDRweDsKICAgICAgfQogICAgICAKICAgICAgLmFjdGlvbiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNDYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLmFjdGlvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTUlKSIpfTsKICAgICAgfQoKICAgICAgLmFjdGlvbjphY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5Ni4xJSkiLCAiaHNsKDAgMCUgMTEuOCUpIil9OwogICAgICB9CiAgICAgIAogICAgICAuYWN0aW9uIGRlZXMtaWNvbiB7CiAgICAgICAgd2lkdGg6IDE2cHg7CiAgICAgICAgaGVpZ2h0OiAxNnB4OwogICAgICB9CgogICAgICAuZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGhlaWdodDogNTJweDsKICAgICAgICBwYWRkaW5nOiAwIDI0cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDQ2LjklKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgwIDAlIDklKSIpfTsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgIH0KCiAgICAgIC50YWJsZVN0YXRpc3RpY3MgewogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5mb290ZXJBY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogOHB4OwogICAgICB9CgogICAgICAuZm9vdGVyQWN0aW9ucyAuZm9vdGVyQWN0aW9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA2cHg7CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA0Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLmZvb3RlckFjdGlvbnMgLmZvb3RlckFjdGlvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk1LjElKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTUlKSIpfTsKICAgICAgfQoKICAgICAgLmZvb3RlckFjdGlvbnMgLmZvb3RlckFjdGlvbiBkZWVzLWljb24gewogICAgICAgIHdpZHRoOiAxNHB4OwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgfQogIGAKXTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1kYXRhdmlldy9kZWVzLXRhYmxlL2RhdGEuanMKZnVuY3Rpb24gY29tcHV0ZUNvbHVtbnNGcm9tRGlzcGxheUZ1bmN0aW9uKGRpc3BsYXlGdW5jdGlvbiwgZGF0YSkgewogIGlmICghZGF0YSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkKICAgIHJldHVybiBbXTsKICBjb25zdCBmaXJzdFRyYW5zZm9ybWVkSXRlbSA9IGRpc3BsYXlGdW5jdGlvbihkYXRhWzBdKTsKICBjb25zdCBrZXlzMiA9IE9iamVjdC5rZXlzKGZpcnN0VHJhbnNmb3JtZWRJdGVtKTsKICByZXR1cm4ga2V5czIubWFwKChrZXkyKSA9PiAoewogICAga2V5OiBrZXkyLAogICAgaGVhZGVyOiBrZXkyLAogICAgdmFsdWU6IChyb3cpID0+IGRpc3BsYXlGdW5jdGlvbihyb3cpW2tleTJdCiAgfSkpOwp9CmZ1bmN0aW9uIGNvbXB1dGVFZmZlY3RpdmVDb2x1bW5zKGNvbHVtbnMsIGF1Z21lbnRGcm9tRGlzcGxheUZ1bmN0aW9uLCBkaXNwbGF5RnVuY3Rpb24sIGRhdGEpIHsKICBjb25zdCBiYXNlID0gKGNvbHVtbnMgfHwgW10pLnNsaWNlKCk7CiAgaWYgKCFhdWdtZW50RnJvbURpc3BsYXlGdW5jdGlvbikKICAgIHJldHVybiBiYXNlOwogIGNvbnN0IGZyb21EaXNwbGF5ID0gY29tcHV0ZUNvbHVtbnNGcm9tRGlzcGxheUZ1bmN0aW9uKGRpc3BsYXlGdW5jdGlvbiwgZGF0YSk7CiAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldChiYXNlLm1hcCgoYzExKSA9PiBTdHJpbmcoYzExLmtleSkpKTsKICBmb3IgKGNvbnN0IGNvbCBvZiBmcm9tRGlzcGxheSkgewogICAgaWYgKCFleGlzdGluZ0tleXMuaGFzKFN0cmluZyhjb2wua2V5KSkpIHsKICAgICAgYmFzZS5wdXNoKGNvbCk7CiAgICB9CiAgfQogIHJldHVybiBiYXNlOwp9CmZ1bmN0aW9uIGdldENlbGxWYWx1ZShyb3csIGNvbCwgZGlzcGxheUZ1bmN0aW9uKSB7CiAgcmV0dXJuIGNvbC52YWx1ZSA/IGNvbC52YWx1ZShyb3cpIDogcm93W2NvbC5rZXldOwp9CmZ1bmN0aW9uIGdldFZpZXdEYXRhKGRhdGEsIGVmZmVjdGl2ZUNvbHVtbnMsIHNvcnRLZXksIHNvcnREaXIsIGZpbHRlclRleHQsIGNvbHVtbkZpbHRlcnMsIGZpbHRlck1vZGUgPSAidGFibGUiLCBsdWNlbmVQcmVkaWNhdGUpIHsKICBsZXQgYXJyID0gZGF0YS5zbGljZSgpOwogIGNvbnN0IGZ0ID0gKGZpbHRlclRleHQgfHwgIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogIGNvbnN0IGNmID0gY29sdW1uRmlsdGVycyB8fCB7fTsKICBjb25zdCBjZktleXMgPSBPYmplY3Qua2V5cyhjZikuZmlsdGVyKChrNCkgPT4gKGNmW2s0XSA/PyAiIikudHJpbSgpLmxlbmd0aCA+IDApOwogIGlmIChmdCB8fCBjZktleXMubGVuZ3RoID4gMCkgewogICAgYXJyID0gYXJyLmZpbHRlcigocm93KSA9PiB7CiAgICAgIGZvciAoY29uc3QgazQgb2YgY2ZLZXlzKSB7CiAgICAgICAgaWYgKGZpbHRlck1vZGUgPT09ICJkYXRhIikgewogICAgICAgICAgY29uc3QgdmFsID0gcm93W2s0XTsKICAgICAgICAgIGNvbnN0IHM5ID0gU3RyaW5nKHZhbCA/PyAiIikudG9Mb3dlckNhc2UoKTsKICAgICAgICAgIGNvbnN0IG5lZWRsZSA9IFN0cmluZyhjZltrNF0pLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICBpZiAoIXM5LmluY2x1ZGVzKG5lZWRsZSkpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgY29sMiA9IGVmZmVjdGl2ZUNvbHVtbnMuZmluZCgoYzExKSA9PiBTdHJpbmcoYzExLmtleSkgPT09IGs0KTsKICAgICAgICAgIGlmICghY29sMiB8fCBjb2wyLmhpZGRlbiB8fCBjb2wyLmZpbHRlcmFibGUgPT09IGZhbHNlKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIGNvbnN0IHZhbCA9IGdldENlbGxWYWx1ZShyb3csIGNvbDIpOwogICAgICAgICAgY29uc3QgczkgPSBTdHJpbmcodmFsID8/ICIiKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgY29uc3QgbmVlZGxlID0gU3RyaW5nKGNmW2s0XSkudG9Mb3dlckNhc2UoKTsKICAgICAgICAgIGlmICghczkuaW5jbHVkZXMobmVlZGxlKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZnQpIHsKICAgICAgICBpZiAobHVjZW5lUHJlZGljYXRlKSB7CiAgICAgICAgICBpZiAoIWx1Y2VuZVByZWRpY2F0ZShyb3cpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgbGV0IGFueSA9IGZhbHNlOwogICAgICAgIGlmIChmaWx0ZXJNb2RlID09PSAiZGF0YSIpIHsKICAgICAgICAgIGZvciAoY29uc3QgdmFsIG9mIE9iamVjdC52YWx1ZXMocm93KSkgewogICAgICAgICAgICBjb25zdCBzOSA9IFN0cmluZyh2YWwgPz8gIiIpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIGlmIChzOS5pbmNsdWRlcyhmdCkpIHsKICAgICAgICAgICAgICBhbnkgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvciAoY29uc3QgY29sMiBvZiBlZmZlY3RpdmVDb2x1bW5zKSB7CiAgICAgICAgICAgIGlmIChjb2wyLmhpZGRlbikKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgY29uc3QgdmFsID0gZ2V0Q2VsbFZhbHVlKHJvdywgY29sMik7CiAgICAgICAgICAgIGNvbnN0IHM5ID0gU3RyaW5nKHZhbCA/PyAiIikudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgaWYgKHM5LmluY2x1ZGVzKGZ0KSkgewogICAgICAgICAgICAgIGFueSA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFhbnkpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9KTsKICB9CiAgaWYgKCFzb3J0S2V5IHx8ICFzb3J0RGlyKQogICAgcmV0dXJuIGFycjsKICBjb25zdCBjb2wgPSBlZmZlY3RpdmVDb2x1bW5zLmZpbmQoKGMxMSkgPT4gU3RyaW5nKGMxMS5rZXkpID09PSBzb3J0S2V5KTsKICBpZiAoIWNvbCkKICAgIHJldHVybiBhcnI7CiAgY29uc3QgZGlyID0gc29ydERpciA9PT0gImFzYyIgPyAxIDogLTE7CiAgYXJyLnNvcnQoKGE1LCBiNSkgPT4gewogICAgY29uc3QgdmEgPSBnZXRDZWxsVmFsdWUoYTUsIGNvbCk7CiAgICBjb25zdCB2YiA9IGdldENlbGxWYWx1ZShiNSwgY29sKTsKICAgIGlmICh2YSA9PSBudWxsICYmIHZiID09IG51bGwpCiAgICAgIHJldHVybiAwOwogICAgaWYgKHZhID09IG51bGwpCiAgICAgIHJldHVybiAtMSAqIGRpcjsKICAgIGlmICh2YiA9PSBudWxsKQogICAgICByZXR1cm4gMSAqIGRpcjsKICAgIGlmICh0eXBlb2YgdmEgPT09ICJudW1iZXIiICYmIHR5cGVvZiB2YiA9PT0gIm51bWJlciIpCiAgICAgIHJldHVybiAodmEgLSB2YikgKiBkaXI7CiAgICBjb25zdCBzYSA9IFN0cmluZyh2YSkudG9Mb3dlckNhc2UoKTsKICAgIGNvbnN0IHNiID0gU3RyaW5nKHZiKS50b0xvd2VyQ2FzZSgpOwogICAgaWYgKHNhIDwgc2IpCiAgICAgIHJldHVybiAtMSAqIGRpcjsKICAgIGlmIChzYSA+IHNiKQogICAgICByZXR1cm4gMSAqIGRpcjsKICAgIHJldHVybiAwOwogIH0pOwogIHJldHVybiBhcnI7Cn0KCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1kYXRhdmlldy9kZWVzLXRhYmxlL2x1Y2VuZS5qcwpmdW5jdGlvbiBzdHJpcFF1b3RlcyhzOSkgewogIGlmIChzOS5zdGFydHNXaXRoKCciJykgJiYgczkuZW5kc1dpdGgoJyInKSB8fCBzOS5zdGFydHNXaXRoKCInIikgJiYgczkuZW5kc1dpdGgoIiciKSkgewogICAgcmV0dXJuIHM5LnNsaWNlKDEsIC0xKTsKICB9CiAgcmV0dXJuIHM5Owp9CmZ1bmN0aW9uIHNwbGl0QnlPcihpbnB1dCkgewogIHJldHVybiBpbnB1dC5zcGxpdCgvXHMrT1JccysvaSkubWFwKChzOSkgPT4gczkudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7Cn0KZnVuY3Rpb24gc3BsaXRCeUFuZChpbnB1dCkgewogIHJldHVybiBpbnB1dC5zcGxpdCgvXHMrQU5EXHMrL2kpLm1hcCgoczkpID0+IHM5LnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pOwp9CmZ1bmN0aW9uIHBhcnNlVGVybShyYXcyKSB7CiAgaWYgKCFyYXcyKQogICAgcmV0dXJuIG51bGw7CiAgbGV0IG5lZ2F0ZSA9IGZhbHNlOwogIGNvbnN0IG5vdE1hdGNoID0gcmF3Mi5tYXRjaCgvXlxzKihOT1Rccyt8LSlccyooLiopJC9pKTsKICBpZiAobm90TWF0Y2gpIHsKICAgIG5lZ2F0ZSA9IHRydWU7CiAgICByYXcyID0gbm90TWF0Y2hbMl07CiAgfQogIGNvbnN0IHJhbmdlTWF0Y2ggPSByYXcyLm1hdGNoKC9eKFteOlxzXSspXHMqOlxzKlxbKC4qPylccytUT1xzKyguKj8pXF0kL2kpOwogIGlmIChyYW5nZU1hdGNoKSB7CiAgICByZXR1cm4gewogICAgICBmaWVsZDogcmFuZ2VNYXRjaFsxXSwKICAgICAgbmVnYXRlLAogICAgICByYW5nZTogeyBsb3dlcjogc3RyaXBRdW90ZXMocmFuZ2VNYXRjaFsyXSkudG9Mb3dlckNhc2UoKSwgdXBwZXI6IHN0cmlwUXVvdGVzKHJhbmdlTWF0Y2hbM10pLnRvTG93ZXJDYXNlKCksIGluY2x1c2l2ZTogdHJ1ZSB9CiAgICB9OwogIH0KICBjb25zdCBtNiA9IHJhdzIubWF0Y2goL14oW146XHNdKylccyo6XHMqKCJbXiJdKiJ8J1teJ10qJ3xbXiInXHNdKykkLyk7CiAgaWYgKG02KSB7CiAgICByZXR1cm4geyBmaWVsZDogbTZbMV0sIHZhbHVlOiBzdHJpcFF1b3RlcyhtNlsyXSkudG9Mb3dlckNhc2UoKSwgbmVnYXRlIH07CiAgfQogIGlmIChyYXcyLmxlbmd0aCA+IDApIHsKICAgIHJldHVybiB7IHZhbHVlOiBzdHJpcFF1b3RlcyhyYXcyKS50b0xvd2VyQ2FzZSgpLCBuZWdhdGUgfTsKICB9CiAgcmV0dXJuIG51bGw7Cn0KZnVuY3Rpb24gcGFyc2VMdWNlbmUoaW5wdXQpIHsKICBpZiAoIWlucHV0KQogICAgcmV0dXJuIG51bGw7CiAgY29uc3QgY2xhdXNlcyA9IHNwbGl0QnlPcihpbnB1dCkubWFwKChjbGF1c2VTdHIpID0+IHsKICAgIGNvbnN0IHRlcm1zID0gc3BsaXRCeUFuZChjbGF1c2VTdHIpLm1hcChwYXJzZVRlcm0pLmZpbHRlcigodDkpID0+ICEhdDkgJiYgISF0OS52YWx1ZSk7CiAgICByZXR1cm4geyB0ZXJtcyB9OwogIH0pLmZpbHRlcigoYzExKSA9PiBjMTEudGVybXMubGVuZ3RoID4gMCk7CiAgaWYgKGNsYXVzZXMubGVuZ3RoID09PSAwKQogICAgcmV0dXJuIG51bGw7CiAgcmV0dXJuIHsgY2xhdXNlcyB9Owp9CmZ1bmN0aW9uIGNvbXBpbGVMdWNlbmVQcmVkaWNhdGUoaW5wdXQsIG1vZGUsIGNvbHVtbnMpIHsKICBjb25zdCBhc3QgPSBwYXJzZUx1Y2VuZShpbnB1dCk7CiAgaWYgKCFhc3QpCiAgICByZXR1cm4gbnVsbDsKICBjb25zdCBjb2xNYXAgPSBuZXcgTWFwKGNvbHVtbnMubWFwKChjMTEpID0+IFtTdHJpbmcoYzExLmtleSksIGMxMV0pKTsKICBjb25zdCBjbXAgPSAoYTUsIGI1KSA9PiBhNSA8IGI1ID8gLTEgOiBhNSA+IGI1ID8gMSA6IDA7CiAgY29uc3QgY29lcmNlMiA9IChzOSkgPT4gewogICAgY29uc3Qgc3RyID0gU3RyaW5nKHM5ID8/ICIiKS50b0xvd2VyQ2FzZSgpOwogICAgY29uc3QgbnVtID0gTnVtYmVyKHN0cik7CiAgICBjb25zdCBkYXRlID0gRGF0ZS5wYXJzZShzdHIpOwogICAgaWYgKCFOdW1iZXIuaXNOYU4obnVtKSAmJiBzdHIudHJpbSgpICE9PSAiIikKICAgICAgcmV0dXJuIHsgdDogIm4iLCB2OiBudW0gfTsKICAgIGlmICghTnVtYmVyLmlzTmFOKGRhdGUpKQogICAgICByZXR1cm4geyB0OiAiZCIsIHY6IGRhdGUgfTsKICAgIHJldHVybiB7IHQ6ICJzIiwgdjogc3RyIH07CiAgfTsKICBjb25zdCBpblJhbmdlID0gKHZhbCwgbG93ZXIsIHVwcGVyKSA9PiB7CiAgICBjb25zdCBhNSA9IGNvZXJjZTIodmFsKTsKICAgIGNvbnN0IGxvID0gY29lcmNlMihsb3dlcik7CiAgICBjb25zdCB1cCA9IGNvZXJjZTIodXBwZXIpOwogICAgaWYgKGE1LnQgPT09ICJzIiAmJiBsby50ID09PSAicyIgJiYgdXAudCA9PT0gInMiKSB7CiAgICAgIGNvbnN0IGF2ID0gYTUudjsKICAgICAgcmV0dXJuIGNtcChhdiwgbG8udikgPj0gMCAmJiBjbXAoYXYsIHVwLnYpIDw9IDA7CiAgICB9CiAgICBpZiAoYTUudCA9PT0gIm4iICYmIGxvLnQgPT09ICJuIiAmJiB1cC50ID09PSAibiIpIHsKICAgICAgY29uc3QgYXYgPSBhNS52OwogICAgICByZXR1cm4gYXYgPj0gbG8udiAmJiBhdiA8PSB1cC52OwogICAgfQogICAgaWYgKGE1LnQgPT09ICJkIiAmJiBsby50ID09PSAiZCIgJiYgdXAudCA9PT0gImQiKSB7CiAgICAgIGNvbnN0IGF2ID0gYTUudjsKICAgICAgcmV0dXJuIGF2ID49IGxvLnYgJiYgYXYgPD0gdXAudjsKICAgIH0KICAgIGNvbnN0IGFzID0gU3RyaW5nKHZhbCA/PyAiIikudG9Mb3dlckNhc2UoKTsKICAgIHJldHVybiBjbXAoYXMsIGxvd2VyKSA+PSAwICYmIGNtcChhcywgdXBwZXIpIDw9IDA7CiAgfTsKICByZXR1cm4gKHJvdykgPT4gewogICAgZm9yIChjb25zdCBjbGF1c2Ugb2YgYXN0LmNsYXVzZXMpIHsKICAgICAgbGV0IGNsYXVzZU9rID0gdHJ1ZTsKICAgICAgZm9yIChjb25zdCB0ZXJtIG9mIGNsYXVzZS50ZXJtcykgewogICAgICAgIGxldCBvazMgPSBmYWxzZTsKICAgICAgICBpZiAodGVybS5yYW5nZSAmJiB0ZXJtLmZpZWxkKSB7CiAgICAgICAgICBpZiAobW9kZSA9PT0gImRhdGEiKSB7CiAgICAgICAgICAgIG9rMyA9IGluUmFuZ2Uocm93W3Rlcm0uZmllbGRdLCB0ZXJtLnJhbmdlLmxvd2VyLCB0ZXJtLnJhbmdlLnVwcGVyKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IGNvbCA9IGNvbE1hcC5nZXQodGVybS5maWVsZCk7CiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbC5oaWRkZW4pIHsKICAgICAgICAgICAgICBvazMgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjb2wudmFsdWUgPyBjb2wudmFsdWUocm93KSA6IHJvd1tjb2wua2V5XTsKICAgICAgICAgICAgICBvazMgPSBpblJhbmdlKHZhbCwgdGVybS5yYW5nZS5sb3dlciwgdGVybS5yYW5nZS51cHBlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRlcm0uZmllbGQgJiYgdGVybS52YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICBpZiAobW9kZSA9PT0gImRhdGEiKSB7CiAgICAgICAgICAgIGNvbnN0IHM5ID0gU3RyaW5nKHJvd1t0ZXJtLmZpZWxkXSA/PyAiIikudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgb2szID0gczkuaW5jbHVkZXModGVybS52YWx1ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBjb2wgPSBjb2xNYXAuZ2V0KHRlcm0uZmllbGQpOwogICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wuaGlkZGVuID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgb2szID0gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgY29uc3QgdmFsID0gY29sLnZhbHVlID8gY29sLnZhbHVlKHJvdykgOiByb3dbY29sLmtleV07CiAgICAgICAgICAgICAgY29uc3QgczkgPSBTdHJpbmcodmFsID8/ICIiKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgIG9rMyA9IHM5LmluY2x1ZGVzKHRlcm0udmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0ZXJtLnZhbHVlICE9IG51bGwpIHsKICAgICAgICAgIGlmIChtb2RlID09PSAiZGF0YSIpIHsKICAgICAgICAgICAgb2szID0gT2JqZWN0LnZhbHVlcyhyb3cpLnNvbWUoKHY1KSA9PiBTdHJpbmcodjUgPz8gIiIpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybS52YWx1ZSkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb2szID0gY29sdW1ucy5zb21lKChjb2wpID0+IHsKICAgICAgICAgICAgICBpZiAoY29sLmhpZGRlbikKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjb2wudmFsdWUgPyBjb2wudmFsdWUocm93KSA6IHJvd1tjb2wua2V5XTsKICAgICAgICAgICAgICBjb25zdCBzOSA9IFN0cmluZyh2YWwgPz8gIiIpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgcmV0dXJuIHM5LmluY2x1ZGVzKHRlcm0udmFsdWUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRlcm0ubmVnYXRlKQogICAgICAgICAgb2szID0gIW9rMzsKICAgICAgICBpZiAoIW9rMykgewogICAgICAgICAgY2xhdXNlT2sgPSBmYWxzZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY2xhdXNlT2spCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKfQoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWRhdGF2aWV3L2RlZXMtdGFibGUvZGVlcy10YWJsZS5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2Rpc3RfdHMyNSgpOwppbml0X2RlZXNfaWNvbigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGUzMiA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMzMgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNUYWJsZSA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtdGFibGUiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9oZWFkaW5nMV9kZWNvcmF0b3JzOwogIGxldCBfaGVhZGluZzFfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oZWFkaW5nMV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaGVhZGluZzJfZGVjb3JhdG9yczsKICBsZXQgX2hlYWRpbmcyX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaGVhZGluZzJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RhdGFfZGVjb3JhdG9yczsKICBsZXQgX2RhdGFfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kYXRhX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9rZXlfZGVjb3JhdG9yczsKICBsZXQgX2tleV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2tleV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGFiZWxfZGVjb3JhdG9yczsKICBsZXQgX2xhYmVsX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGFiZWxfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Rpc2FibGVkX2RlY29yYXRvcnM7CiAgbGV0IF9kaXNhYmxlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Rpc2FibGVkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZXF1aXJlZF9kZWNvcmF0b3JzOwogIGxldCBfcmVxdWlyZWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZXF1aXJlZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGF0YU5hbWVfZGVjb3JhdG9yczsKICBsZXQgX2RhdGFOYW1lX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGF0YU5hbWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlYXJjaGFibGVfZGVjb3JhdG9yczsKICBsZXQgX3NlYXJjaGFibGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWFyY2hhYmxlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kYXRhQWN0aW9uc19kZWNvcmF0b3JzOwogIGxldCBfZGF0YUFjdGlvbnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kYXRhQWN0aW9uc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29sdW1uc19kZWNvcmF0b3JzOwogIGxldCBfY29sdW1uc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbHVtbnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Jvd0tleV9kZWNvcmF0b3JzOwogIGxldCBfcm93S2V5X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcm93S2V5X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdWdtZW50RnJvbURpc3BsYXlGdW5jdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfYXVnbWVudEZyb21EaXNwbGF5RnVuY3Rpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdWdtZW50RnJvbURpc3BsYXlGdW5jdGlvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGlzcGxheUZ1bmN0aW9uX2RlY29yYXRvcnM7CiAgbGV0IF9kaXNwbGF5RnVuY3Rpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kaXNwbGF5RnVuY3Rpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JldmVyc2VEaXNwbGF5RnVuY3Rpb25fZGVjb3JhdG9yczsKICBsZXQgX3JldmVyc2VEaXNwbGF5RnVuY3Rpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZXZlcnNlRGlzcGxheUZ1bmN0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZERhdGFSb3dfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkRGF0YVJvd19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkRGF0YVJvd19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZWRpdGFibGVGaWVsZHNfZGVjb3JhdG9yczsKICBsZXQgX2VkaXRhYmxlRmllbGRzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZWRpdGFibGVGaWVsZHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dWZXJ0aWNhbExpbmVzX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93VmVydGljYWxMaW5lc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dWZXJ0aWNhbExpbmVzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93SG9yaXpvbnRhbExpbmVzX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93SG9yaXpvbnRhbExpbmVzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0hvcml6b250YWxMaW5lc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0dyaWRfZGVjb3JhdG9yczsKICBsZXQgX3Nob3dHcmlkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0dyaWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NvcnRLZXlfZGVjb3JhdG9yczsKICBsZXQgX3NvcnRLZXlfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zb3J0S2V5X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zb3J0RGlyX2RlY29yYXRvcnM7CiAgbGV0IF9zb3J0RGlyX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc29ydERpcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZmlsdGVyVGV4dF9kZWNvcmF0b3JzOwogIGxldCBfZmlsdGVyVGV4dF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ZpbHRlclRleHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbHVtbkZpbHRlcnNfZGVjb3JhdG9yczsKICBsZXQgX2NvbHVtbkZpbHRlcnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb2x1bW5GaWx0ZXJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93Q29sdW1uRmlsdGVyc19kZWNvcmF0b3JzOwogIGxldCBfc2hvd0NvbHVtbkZpbHRlcnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93Q29sdW1uRmlsdGVyc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc3RpY2t5SGVhZGVyX2RlY29yYXRvcnM7CiAgbGV0IF9zdGlja3lIZWFkZXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zdGlja3lIZWFkZXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlYXJjaE1vZGVfZGVjb3JhdG9yczsKICBsZXQgX3NlYXJjaE1vZGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWFyY2hNb2RlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3Rpb25Nb2RlX2RlY29yYXRvcnM7CiAgbGV0IF9zZWxlY3Rpb25Nb2RlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0aW9uTW9kZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRJZHNfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkSWRzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRJZHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1RhYmxlMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2hlYWRpbmcxX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IFN0cmluZwogICAgICB9KV07CiAgICAgIF9oZWFkaW5nMl9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBTdHJpbmcKICAgICAgfSldOwogICAgICBfZGF0YV9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBBcnJheQogICAgICB9KV07CiAgICAgIF9rZXlfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgIH0pXTsKICAgICAgX2xhYmVsX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IFN0cmluZwogICAgICB9KV07CiAgICAgIF9kaXNhYmxlZF9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBCb29sZWFuCiAgICAgIH0pXTsKICAgICAgX3JlcXVpcmVkX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEJvb2xlYW4KICAgICAgfSldOwogICAgICBfZGF0YU5hbWVfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgIHJlZmxlY3Q6IHRydWUKICAgICAgfSldOwogICAgICBfc2VhcmNoYWJsZV9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBCb29sZWFuCiAgICAgIH0pXTsKICAgICAgX2RhdGFBY3Rpb25zX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEFycmF5CiAgICAgIH0pXTsKICAgICAgX2NvbHVtbnNfZGVjb3JhdG9ycyA9IFtuNSh7IGF0dHJpYnV0ZTogZmFsc2UgfSldOwogICAgICBfcm93S2V5X2RlY29yYXRvcnMgPSBbbjUoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXTsKICAgICAgX2F1Z21lbnRGcm9tRGlzcGxheUZ1bmN0aW9uX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2Rpc3BsYXlGdW5jdGlvbl9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICBhdHRyaWJ1dGU6IGZhbHNlCiAgICAgIH0pXTsKICAgICAgX3JldmVyc2VEaXNwbGF5RnVuY3Rpb25fZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgYXR0cmlidXRlOiBmYWxzZQogICAgICB9KV07CiAgICAgIF9zZWxlY3RlZERhdGFSb3dfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogT2JqZWN0CiAgICAgIH0pXTsKICAgICAgX2VkaXRhYmxlRmllbGRzX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEFycmF5CiAgICAgIH0pXTsKICAgICAgX3Nob3dWZXJ0aWNhbExpbmVzX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgcmVmbGVjdDogdHJ1ZSwKICAgICAgICBhdHRyaWJ1dGU6ICJzaG93LXZlcnRpY2FsLWxpbmVzIgogICAgICB9KV07CiAgICAgIF9zaG93SG9yaXpvbnRhbExpbmVzX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgcmVmbGVjdDogdHJ1ZSwKICAgICAgICBhdHRyaWJ1dGU6ICJzaG93LWhvcml6b250YWwtbGluZXMiCiAgICAgIH0pXTsKICAgICAgX3Nob3dHcmlkX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgcmVmbGVjdDogdHJ1ZSwKICAgICAgICBhdHRyaWJ1dGU6ICJzaG93LWdyaWQiCiAgICAgIH0pXTsKICAgICAgX3NvcnRLZXlfZGVjb3JhdG9ycyA9IFtuNSh7IGF0dHJpYnV0ZTogZmFsc2UgfSldOwogICAgICBfc29ydERpcl9kZWNvcmF0b3JzID0gW241KHsgYXR0cmlidXRlOiBmYWxzZSB9KV07CiAgICAgIF9maWx0ZXJUZXh0X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfY29sdW1uRmlsdGVyc19kZWNvcmF0b3JzID0gW241KHsgYXR0cmlidXRlOiBmYWxzZSB9KV07CiAgICAgIF9zaG93Q29sdW1uRmlsdGVyc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiwgYXR0cmlidXRlOiAic2hvdy1jb2x1bW4tZmlsdGVycyIgfSldOwogICAgICBfc3RpY2t5SGVhZGVyX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlLCBhdHRyaWJ1dGU6ICJzdGlja3ktaGVhZGVyIiB9KV07CiAgICAgIF9zZWFyY2hNb2RlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfc2VsZWN0aW9uTW9kZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3NlbGVjdGVkSWRzX2RlY29yYXRvcnMgPSBbbjUoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXTsKICAgICAgX19lc0RlY29yYXRlMzIodGhpcywgbnVsbCwgX2hlYWRpbmcxX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImhlYWRpbmcxIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJoZWFkaW5nMSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5oZWFkaW5nMSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaGVhZGluZzEgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaGVhZGluZzFfaW5pdGlhbGl6ZXJzLCBfaGVhZGluZzFfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMih0aGlzLCBudWxsLCBfaGVhZGluZzJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaGVhZGluZzIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImhlYWRpbmcyIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmhlYWRpbmcyLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5oZWFkaW5nMiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9oZWFkaW5nMl9pbml0aWFsaXplcnMsIF9oZWFkaW5nMl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMyKHRoaXMsIG51bGwsIF9kYXRhX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImRhdGEiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRhdGEiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZGF0YSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZGF0YSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kYXRhX2luaXRpYWxpemVycywgX2RhdGFfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMih0aGlzLCBudWxsLCBfa2V5X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImtleSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAia2V5IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmtleSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoua2V5ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2tleV9pbml0aWFsaXplcnMsIF9rZXlfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMih0aGlzLCBudWxsLCBfbGFiZWxfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibGFiZWwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImxhYmVsIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmxhYmVsLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5sYWJlbCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9sYWJlbF9pbml0aWFsaXplcnMsIF9sYWJlbF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMyKHRoaXMsIG51bGwsIF9kaXNhYmxlZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkaXNhYmxlZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZGlzYWJsZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZGlzYWJsZWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmRpc2FibGVkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Rpc2FibGVkX2luaXRpYWxpemVycywgX2Rpc2FibGVkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzIodGhpcywgbnVsbCwgX3JlcXVpcmVkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJlcXVpcmVkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJyZXF1aXJlZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5yZXF1aXJlZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucmVxdWlyZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcmVxdWlyZWRfaW5pdGlhbGl6ZXJzLCBfcmVxdWlyZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMih0aGlzLCBudWxsLCBfZGF0YU5hbWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZGF0YU5hbWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRhdGFOYW1lIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRhdGFOYW1lLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kYXRhTmFtZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kYXRhTmFtZV9pbml0aWFsaXplcnMsIF9kYXRhTmFtZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMyKHRoaXMsIG51bGwsIF9zZWFyY2hhYmxlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlYXJjaGFibGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlYXJjaGFibGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VhcmNoYWJsZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VhcmNoYWJsZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWFyY2hhYmxlX2luaXRpYWxpemVycywgX3NlYXJjaGFibGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMih0aGlzLCBudWxsLCBfZGF0YUFjdGlvbnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZGF0YUFjdGlvbnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRhdGFBY3Rpb25zIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRhdGFBY3Rpb25zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kYXRhQWN0aW9ucyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kYXRhQWN0aW9uc19pbml0aWFsaXplcnMsIF9kYXRhQWN0aW9uc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMyKHRoaXMsIG51bGwsIF9jb2x1bW5zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNvbHVtbnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNvbHVtbnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29sdW1ucywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY29sdW1ucyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jb2x1bW5zX2luaXRpYWxpemVycywgX2NvbHVtbnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMih0aGlzLCBudWxsLCBfcm93S2V5X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJvd0tleSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicm93S2V5IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJvd0tleSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucm93S2V5ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Jvd0tleV9pbml0aWFsaXplcnMsIF9yb3dLZXlfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMih0aGlzLCBudWxsLCBfYXVnbWVudEZyb21EaXNwbGF5RnVuY3Rpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYXVnbWVudEZyb21EaXNwbGF5RnVuY3Rpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImF1Z21lbnRGcm9tRGlzcGxheUZ1bmN0aW9uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmF1Z21lbnRGcm9tRGlzcGxheUZ1bmN0aW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hdWdtZW50RnJvbURpc3BsYXlGdW5jdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hdWdtZW50RnJvbURpc3BsYXlGdW5jdGlvbl9pbml0aWFsaXplcnMsIF9hdWdtZW50RnJvbURpc3BsYXlGdW5jdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMyKHRoaXMsIG51bGwsIF9kaXNwbGF5RnVuY3Rpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZGlzcGxheUZ1bmN0aW9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkaXNwbGF5RnVuY3Rpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZGlzcGxheUZ1bmN0aW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kaXNwbGF5RnVuY3Rpb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZGlzcGxheUZ1bmN0aW9uX2luaXRpYWxpemVycywgX2Rpc3BsYXlGdW5jdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMyKHRoaXMsIG51bGwsIF9yZXZlcnNlRGlzcGxheUZ1bmN0aW9uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJldmVyc2VEaXNwbGF5RnVuY3Rpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInJldmVyc2VEaXNwbGF5RnVuY3Rpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucmV2ZXJzZURpc3BsYXlGdW5jdGlvbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucmV2ZXJzZURpc3BsYXlGdW5jdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9yZXZlcnNlRGlzcGxheUZ1bmN0aW9uX2luaXRpYWxpemVycywgX3JldmVyc2VEaXNwbGF5RnVuY3Rpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMih0aGlzLCBudWxsLCBfc2VsZWN0ZWREYXRhUm93X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlbGVjdGVkRGF0YVJvdyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0ZWREYXRhUm93IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGVkRGF0YVJvdywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VsZWN0ZWREYXRhUm93ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGVkRGF0YVJvd19pbml0aWFsaXplcnMsIF9zZWxlY3RlZERhdGFSb3dfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMih0aGlzLCBudWxsLCBfZWRpdGFibGVGaWVsZHNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZWRpdGFibGVGaWVsZHMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImVkaXRhYmxlRmllbGRzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmVkaXRhYmxlRmllbGRzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5lZGl0YWJsZUZpZWxkcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9lZGl0YWJsZUZpZWxkc19pbml0aWFsaXplcnMsIF9lZGl0YWJsZUZpZWxkc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMyKHRoaXMsIG51bGwsIF9zaG93VmVydGljYWxMaW5lc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93VmVydGljYWxMaW5lcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd1ZlcnRpY2FsTGluZXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2hvd1ZlcnRpY2FsTGluZXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dWZXJ0aWNhbExpbmVzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dWZXJ0aWNhbExpbmVzX2luaXRpYWxpemVycywgX3Nob3dWZXJ0aWNhbExpbmVzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzIodGhpcywgbnVsbCwgX3Nob3dIb3Jpem9udGFsTGluZXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2hvd0hvcml6b250YWxMaW5lcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd0hvcml6b250YWxMaW5lcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93SG9yaXpvbnRhbExpbmVzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaG93SG9yaXpvbnRhbExpbmVzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dIb3Jpem9udGFsTGluZXNfaW5pdGlhbGl6ZXJzLCBfc2hvd0hvcml6b250YWxMaW5lc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMyKHRoaXMsIG51bGwsIF9zaG93R3JpZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93R3JpZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd0dyaWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2hvd0dyaWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dHcmlkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dHcmlkX2luaXRpYWxpemVycywgX3Nob3dHcmlkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzIodGhpcywgbnVsbCwgX3NvcnRLZXlfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic29ydEtleSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic29ydEtleSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zb3J0S2V5LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zb3J0S2V5ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NvcnRLZXlfaW5pdGlhbGl6ZXJzLCBfc29ydEtleV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMyKHRoaXMsIG51bGwsIF9zb3J0RGlyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNvcnREaXIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNvcnREaXIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc29ydERpciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc29ydERpciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zb3J0RGlyX2luaXRpYWxpemVycywgX3NvcnREaXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMih0aGlzLCBudWxsLCBfZmlsdGVyVGV4dF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJmaWx0ZXJUZXh0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJmaWx0ZXJUZXh0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmZpbHRlclRleHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmZpbHRlclRleHQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZmlsdGVyVGV4dF9pbml0aWFsaXplcnMsIF9maWx0ZXJUZXh0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzIodGhpcywgbnVsbCwgX2NvbHVtbkZpbHRlcnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29sdW1uRmlsdGVycyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29sdW1uRmlsdGVycyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jb2x1bW5GaWx0ZXJzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jb2x1bW5GaWx0ZXJzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbHVtbkZpbHRlcnNfaW5pdGlhbGl6ZXJzLCBfY29sdW1uRmlsdGVyc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMyKHRoaXMsIG51bGwsIF9zaG93Q29sdW1uRmlsdGVyc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93Q29sdW1uRmlsdGVycyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd0NvbHVtbkZpbHRlcnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2hvd0NvbHVtbkZpbHRlcnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dDb2x1bW5GaWx0ZXJzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dDb2x1bW5GaWx0ZXJzX2luaXRpYWxpemVycywgX3Nob3dDb2x1bW5GaWx0ZXJzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzIodGhpcywgbnVsbCwgX3N0aWNreUhlYWRlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzdGlja3lIZWFkZXIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInN0aWNreUhlYWRlciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zdGlja3lIZWFkZXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnN0aWNreUhlYWRlciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zdGlja3lIZWFkZXJfaW5pdGlhbGl6ZXJzLCBfc3RpY2t5SGVhZGVyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzIodGhpcywgbnVsbCwgX3NlYXJjaE1vZGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VhcmNoTW9kZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VhcmNoTW9kZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWFyY2hNb2RlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWFyY2hNb2RlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlYXJjaE1vZGVfaW5pdGlhbGl6ZXJzLCBfc2VhcmNoTW9kZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMyKHRoaXMsIG51bGwsIF9zZWxlY3Rpb25Nb2RlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlbGVjdGlvbk1vZGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlbGVjdGlvbk1vZGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0aW9uTW9kZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VsZWN0aW9uTW9kZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWxlY3Rpb25Nb2RlX2luaXRpYWxpemVycywgX3NlbGVjdGlvbk1vZGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMih0aGlzLCBudWxsLCBfc2VsZWN0ZWRJZHNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0ZWRJZHMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlbGVjdGVkSWRzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGVkSWRzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3RlZElkcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWxlY3RlZElkc19pbml0aWFsaXplcnMsIF9zZWxlY3RlZElkc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMyKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1RhYmxlMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMjQ7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiRGF0YSBWaWV3Il07CiAgICAjaGVhZGluZzFfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX2hlYWRpbmcxX2luaXRpYWxpemVycywgImhlYWRpbmcgMSIpOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCBoZWFkaW5nMSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2hlYWRpbmcxX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaGVhZGluZzEodmFsdWUyKSB7CiAgICAgIHRoaXMuI2hlYWRpbmcxX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaGVhZGluZzJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9oZWFkaW5nMV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX2hlYWRpbmcyX2luaXRpYWxpemVycywgImhlYWRpbmcgMiIpKTsKICAgIGdldCBoZWFkaW5nMigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2hlYWRpbmcyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaGVhZGluZzIodmFsdWUyKSB7CiAgICAgIHRoaXMuI2hlYWRpbmcyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZGF0YV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX2hlYWRpbmcyX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfZGF0YV9pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgZGF0YSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2RhdGFfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkYXRhKHZhbHVlMikgewogICAgICB0aGlzLiNkYXRhX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAja2V5X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfZGF0YV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX2tleV9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgLy8gZGVlcy1mb3JtIGNvbXBhdGliaWxpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGdldCBrZXkoKSB7CiAgICAgIHJldHVybiB0aGlzLiNrZXlfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBrZXkodmFsdWUyKSB7CiAgICAgIHRoaXMuI2tleV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2xhYmVsX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfa2V5X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfbGFiZWxfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBsYWJlbCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xhYmVsX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbGFiZWwodmFsdWUyKSB7CiAgICAgIHRoaXMuI2xhYmVsX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZGlzYWJsZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9sYWJlbF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX2Rpc2FibGVkX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBkaXNhYmxlZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2Rpc2FibGVkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZGlzYWJsZWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2Rpc2FibGVkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcmVxdWlyZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9kaXNhYmxlZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX3JlcXVpcmVkX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCByZXF1aXJlZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3JlcXVpcmVkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcmVxdWlyZWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3JlcXVpcmVkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLmRhdGE7CiAgICB9CiAgICBzZXQgdmFsdWUoX3ZhbHVlQXJnKSB7CiAgICB9CiAgICBjaGFuZ2VTdWJqZWN0ID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX3JlcXVpcmVkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgbmV3IGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cy5zbWFydHJ4LnJ4anMuU3ViamVjdCgpKTsKICAgICNkYXRhTmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfZGF0YU5hbWVfaW5pdGlhbGl6ZXJzLCB2b2lkIDApOwogICAgLy8gZW5kIGRlZXMtZm9ybSBjb21wYXRpYmlsaXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvKioKICAgICAqIFdoYXQgZG9lcyBhIHJvdyBvZiBkYXRhIHJlcHJlc2VudD8KICAgICAqLwogICAgZ2V0IGRhdGFOYW1lKCkgewogICAgICByZXR1cm4gdGhpcy4jZGF0YU5hbWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkYXRhTmFtZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZGF0YU5hbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWFyY2hhYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfZGF0YU5hbWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9zZWFyY2hhYmxlX2luaXRpYWxpemVycywgdHJ1ZSkpOwogICAgZ2V0IHNlYXJjaGFibGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWFyY2hhYmxlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VhcmNoYWJsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VhcmNoYWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2RhdGFBY3Rpb25zX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfc2VhcmNoYWJsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX2RhdGFBY3Rpb25zX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBkYXRhQWN0aW9ucygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2RhdGFBY3Rpb25zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZGF0YUFjdGlvbnModmFsdWUyKSB7CiAgICAgIHRoaXMuI2RhdGFBY3Rpb25zX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29sdW1uc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX2RhdGFBY3Rpb25zX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfY29sdW1uc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICAvLyBzY2hlbWEtZmlyc3QgY29sdW1ucyBBUEkKICAgIGdldCBjb2x1bW5zKCkgewogICAgICByZXR1cm4gdGhpcy4jY29sdW1uc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNvbHVtbnModmFsdWUyKSB7CiAgICAgIHRoaXMuI2NvbHVtbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNyb3dLZXlfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9jb2x1bW5zX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfcm93S2V5X2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICAvKioKICAgICAqIFN0YWJsZSByb3cgaWRlbnRpdHkgZm9yIHNlbGVjdGlvbiBhbmQgdXBkYXRlcy4gSWYgcHJvdmlkZWQgYXMgYSBmdW5jdGlvbiwKICAgICAqIGl0IGlzIG9ubHkgdXNhYmxlIGFzIGEgcHJvcGVydHkgKG5vdCB2aWEgYXR0cmlidXRlKS4KICAgICAqLwogICAgZ2V0IHJvd0tleSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Jvd0tleV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHJvd0tleSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcm93S2V5X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYXVnbWVudEZyb21EaXNwbGF5RnVuY3Rpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9yb3dLZXlfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9hdWdtZW50RnJvbURpc3BsYXlGdW5jdGlvbl9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICAvKioKICAgICAqIFdoZW4gdHJ1ZSBhbmQgY29sdW1ucyBhcmUgcHJvdmlkZWQsIG1lcmdlIGFueSBtaXNzaW5nIGNvbHVtbnMgZGlzY292ZXJlZAogICAgICogdmlhIGRpc3BsYXlGdW5jdGlvbiBpbnRvIHRoZSBlZmZlY3RpdmUgc2NoZW1hLgogICAgICovCiAgICBnZXQgYXVnbWVudEZyb21EaXNwbGF5RnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNhdWdtZW50RnJvbURpc3BsYXlGdW5jdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGF1Z21lbnRGcm9tRGlzcGxheUZ1bmN0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNhdWdtZW50RnJvbURpc3BsYXlGdW5jdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2Rpc3BsYXlGdW5jdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX2F1Z21lbnRGcm9tRGlzcGxheUZ1bmN0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfZGlzcGxheUZ1bmN0aW9uX2luaXRpYWxpemVycywgKGl0ZW1BcmcpID0+IGl0ZW1BcmcpKTsKICAgIGdldCBkaXNwbGF5RnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNkaXNwbGF5RnVuY3Rpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkaXNwbGF5RnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI2Rpc3BsYXlGdW5jdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3JldmVyc2VEaXNwbGF5RnVuY3Rpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9kaXNwbGF5RnVuY3Rpb25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9yZXZlcnNlRGlzcGxheUZ1bmN0aW9uX2luaXRpYWxpemVycywgKGl0ZW1BcmcpID0+IGl0ZW1BcmcpKTsKICAgIGdldCByZXZlcnNlRGlzcGxheUZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy4jcmV2ZXJzZURpc3BsYXlGdW5jdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHJldmVyc2VEaXNwbGF5RnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI3JldmVyc2VEaXNwbGF5RnVuY3Rpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWxlY3RlZERhdGFSb3dfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9yZXZlcnNlRGlzcGxheUZ1bmN0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfc2VsZWN0ZWREYXRhUm93X2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgc2VsZWN0ZWREYXRhUm93KCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWREYXRhUm93X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0ZWREYXRhUm93KHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3RlZERhdGFSb3dfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNlZGl0YWJsZUZpZWxkc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX3NlbGVjdGVkRGF0YVJvd19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX2VkaXRhYmxlRmllbGRzX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBlZGl0YWJsZUZpZWxkcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2VkaXRhYmxlRmllbGRzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZWRpdGFibGVGaWVsZHModmFsdWUyKSB7CiAgICAgIHRoaXMuI2VkaXRhYmxlRmllbGRzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd1ZlcnRpY2FsTGluZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9lZGl0YWJsZUZpZWxkc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX3Nob3dWZXJ0aWNhbExpbmVzX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBzaG93VmVydGljYWxMaW5lcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dWZXJ0aWNhbExpbmVzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd1ZlcnRpY2FsTGluZXModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dWZXJ0aWNhbExpbmVzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd0hvcml6b250YWxMaW5lc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX3Nob3dWZXJ0aWNhbExpbmVzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfc2hvd0hvcml6b250YWxMaW5lc19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgc2hvd0hvcml6b250YWxMaW5lcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dIb3Jpem9udGFsTGluZXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93SG9yaXpvbnRhbExpbmVzKHZhbHVlMikgewogICAgICB0aGlzLiNzaG93SG9yaXpvbnRhbExpbmVzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd0dyaWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9zaG93SG9yaXpvbnRhbExpbmVzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfc2hvd0dyaWRfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgc2hvd0dyaWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93R3JpZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dHcmlkKHZhbHVlMikgewogICAgICB0aGlzLiNzaG93R3JpZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgZmlsZXMgPSAoX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfc2hvd0dyaWRfZXh0cmFJbml0aWFsaXplcnMpLCBbXSk7CiAgICBmaWxlV2Vha01hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogICAgZGF0YUNoYW5nZVN1YmplY3QgPSBuZXcgZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzLnNtYXJ0cngucnhqcy5TdWJqZWN0KCk7CiAgICAjc29ydEtleV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfc29ydEtleV9pbml0aWFsaXplcnMsIHZvaWQgMCk7CiAgICAvLyBzaW1wbGUgY2xpZW50LXNpZGUgc29ydGluZyAoUGhhc2UgMSkKICAgIGdldCBzb3J0S2V5KCkgewogICAgICByZXR1cm4gdGhpcy4jc29ydEtleV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNvcnRLZXkodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NvcnRLZXlfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzb3J0RGlyX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfc29ydEtleV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX3NvcnREaXJfaW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICBnZXQgc29ydERpcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NvcnREaXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzb3J0RGlyKHZhbHVlMikgewogICAgICB0aGlzLiNzb3J0RGlyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZmlsdGVyVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX3NvcnREaXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9maWx0ZXJUZXh0X2luaXRpYWxpemVycywgIiIpKTsKICAgIC8vIHNpbXBsZSBjbGllbnQtc2lkZSBmaWx0ZXJpbmcgKFBoYXNlIDEpCiAgICBnZXQgZmlsdGVyVGV4dCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2ZpbHRlclRleHRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBmaWx0ZXJUZXh0KHZhbHVlMikgewogICAgICB0aGlzLiNmaWx0ZXJUZXh0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29sdW1uRmlsdGVyc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX2ZpbHRlclRleHRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9jb2x1bW5GaWx0ZXJzX2luaXRpYWxpemVycywge30pKTsKICAgIC8vIHBlci1jb2x1bW4gcXVpY2sgZmlsdGVycwogICAgZ2V0IGNvbHVtbkZpbHRlcnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb2x1bW5GaWx0ZXJzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29sdW1uRmlsdGVycyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29sdW1uRmlsdGVyc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dDb2x1bW5GaWx0ZXJzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfY29sdW1uRmlsdGVyc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX3Nob3dDb2x1bW5GaWx0ZXJzX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBzaG93Q29sdW1uRmlsdGVycygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dDb2x1bW5GaWx0ZXJzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd0NvbHVtbkZpbHRlcnModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dDb2x1bW5GaWx0ZXJzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc3RpY2t5SGVhZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfc2hvd0NvbHVtbkZpbHRlcnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9zdGlja3lIZWFkZXJfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHN0aWNreUhlYWRlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3N0aWNreUhlYWRlcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHN0aWNreUhlYWRlcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jc3RpY2t5SGVhZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VhcmNoTW9kZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX3N0aWNreUhlYWRlcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX3NlYXJjaE1vZGVfaW5pdGlhbGl6ZXJzLCAidGFibGUiKSk7CiAgICAvLyBzZWFyY2ggcm93IHN0YXRlCiAgICBnZXQgc2VhcmNoTW9kZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlYXJjaE1vZGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWFyY2hNb2RlKHZhbHVlMikgewogICAgICB0aGlzLiNzZWFyY2hNb2RlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBfX3NlYXJjaFRleHRTdWIgPSBfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9zZWFyY2hNb2RlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIF9fc2VhcmNoTW9kZVN1YjsKICAgICNzZWxlY3Rpb25Nb2RlX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9zZWxlY3Rpb25Nb2RlX2luaXRpYWxpemVycywgIm5vbmUiKTsKICAgIC8vIHNlbGVjdGlvbiAoUGhhc2UgMSkKICAgIGdldCBzZWxlY3Rpb25Nb2RlKCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0aW9uTW9kZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNlbGVjdGlvbk1vZGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlbGVjdGlvbk1vZGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWxlY3RlZElkc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX3NlbGVjdGlvbk1vZGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9zZWxlY3RlZElkc19pbml0aWFsaXplcnMsIC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpKTsKICAgIGdldCBzZWxlY3RlZElkcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkSWRzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0ZWRJZHModmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlbGVjdGVkSWRzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBfcm93SWRNYXAgPSAoX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfc2VsZWN0ZWRJZHNfZXh0cmFJbml0aWFsaXplcnMpLCAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKSk7CiAgICBfcm93SWRDb3VudGVyID0gMDsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IHRhYmxlU3R5bGVzOwogICAgcmVuZGVyKCkgewogICAgICBjb25zdCB1c2luZ0NvbHVtbnMgPSBBcnJheS5pc0FycmF5KHRoaXMuY29sdW1ucykgJiYgdGhpcy5jb2x1bW5zLmxlbmd0aCA+IDA7CiAgICAgIGNvbnN0IGVmZmVjdGl2ZUNvbHVtbnMgPSB1c2luZ0NvbHVtbnMgPyBjb21wdXRlRWZmZWN0aXZlQ29sdW1ucyh0aGlzLmNvbHVtbnMsIHRoaXMuYXVnbWVudEZyb21EaXNwbGF5RnVuY3Rpb24sIHRoaXMuZGlzcGxheUZ1bmN0aW9uLCB0aGlzLmRhdGEpIDogY29tcHV0ZUNvbHVtbnNGcm9tRGlzcGxheUZ1bmN0aW9uKHRoaXMuZGlzcGxheUZ1bmN0aW9uLCB0aGlzLmRhdGEpOwogICAgICBjb25zdCBsdWNlbmVQcmVkID0gY29tcGlsZUx1Y2VuZVByZWRpY2F0ZSh0aGlzLmZpbHRlclRleHQsIHRoaXMuc2VhcmNoTW9kZSA9PT0gImRhdGEiID8gImRhdGEiIDogInRhYmxlIiwgZWZmZWN0aXZlQ29sdW1ucyk7CiAgICAgIGNvbnN0IHZpZXdEYXRhID0gZ2V0Vmlld0RhdGEodGhpcy5kYXRhLCBlZmZlY3RpdmVDb2x1bW5zLCB0aGlzLnNvcnRLZXksIHRoaXMuc29ydERpciwgdGhpcy5maWx0ZXJUZXh0LCB0aGlzLmNvbHVtbkZpbHRlcnMsIHRoaXMuc2VhcmNoTW9kZSA9PT0gImRhdGEiID8gImRhdGEiIDogInRhYmxlIiwgbHVjZW5lUHJlZCB8fCB2b2lkIDApOwogICAgICB0aGlzLl9sYXN0Vmlld0RhdGEgPSB2aWV3RGF0YTsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJtYWluYm94Ij4KICAgICAgICA8IS0tIHRoZSBoZWFkaW5nIHBhcnQgLS0+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmdDb250YWluZXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nIGhlYWRpbmcxIj4ke3RoaXMubGFiZWwgfHwgdGhpcy5oZWFkaW5nMX08L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZyBoZWFkaW5nMiI+JHt0aGlzLmhlYWRpbmcyfTwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXJBY3Rpb25zIj4KICAgICAgICAgICAgJHtkaXJlY3RpdmVzX2V4cG9ydHMucmVzb2x2ZUV4ZWMoYXN5bmMgKCkgPT4gewogICAgICAgIGNvbnN0IHJlc3VsdEFycmF5ID0gW107CiAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdGhpcy5kYXRhQWN0aW9ucykgewogICAgICAgICAgaWYgKCFhY3Rpb24udHlwZS5pbmNsdWRlcygiaGVhZGVyIikpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgcmVzdWx0QXJyYXkucHVzaChiMmA8ZGl2CiAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImhlYWRlckFjdGlvbiIKICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB7CiAgICAgICAgICAgIGFjdGlvbi5hY3Rpb25GdW5jKHsKICAgICAgICAgICAgICBpdGVtOiB0aGlzLnNlbGVjdGVkRGF0YVJvdywKICAgICAgICAgICAgICB0YWJsZTogdGhpcwogICAgICAgICAgICB9KTsKICAgICAgICAgIH19CiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAke2FjdGlvbi5pY29uTmFtZSA/IGIyYDxkZWVzLWljb24gLmljb25TaXplPSR7MTR9IC5pY29uPSR7YWN0aW9uLmljb25OYW1lfT48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAke2FjdGlvbi5uYW1lfWAgOiBhY3Rpb24ubmFtZX0KICAgICAgICAgICAgICAgICAgPC9kaXY+YCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRBcnJheTsKICAgICAgfSl9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nU2VwYXJhdGlvbiI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VhcmNoR3JpZCBoaWRkZW4iPgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dAogICAgICAgICAgICAubGFiZWw9JHsibHVjZW5lIHN5bnRheCBzZWFyY2gifQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHtgCiAgICAgICAgICAgICAgWW91IGNhbiB1c2UgdGhlIGx1Y2VuZSBzeW50YXggdG8gc2VhcmNoIGZvciBkYXRhLCBlLmcuOgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIFxgXGBcYAogICAgICAgICAgICAgIG5hbWU6ICJqb2huIiBBTkQgYWdlOiAxOAogICAgICAgICAgICAgIFxgXGBcYAogICAgICAgICAgICAgIAogICAgICAgICAgICBgfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgPGRlZXMtaW5wdXQtbXVsdGl0b2dnbGUKICAgICAgICAgICAgLmxhYmVsPSR7InNlYXJjaCBtb2RlIn0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbInRhYmxlIiwgImRhdGEiLCAic2VydmVyIl19CiAgICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJ0YWJsZSJ9CiAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0ke2AKICAgICAgICAgICAgICBUaGVyZSBhcmUgdGhyZWUgYmFzaWMgbW9kZXM6CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgKiB0YWJsZTogb25seSBzZWFyY2hlcyBkYXRhIGFscmVhZHkgaW4gdGhlIHRhYmxlCiAgICAgICAgICAgICAgKiBkYXRhOiBzZWFyY2hlcyBvcmlnaW5hbCBkYXRhLCBpZ25vcmluZyB0YWJsZSB0cmFuc2Zvcm1zCiAgICAgICAgICAgICAgKiBzZXJ2ZXI6IHNlYXJjaGVzIGRhdGEgb24gdGhlIHNlcnZlcgogICAgICAgICAgICAgIAogICAgICAgICAgICBgfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZT4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPCEtLSB0aGUgYWN0dWFsIHRhYmxlIC0tPgogICAgICAgIDxzdHlsZT48L3N0eWxlPgogICAgICAgICR7dGhpcy5kYXRhLmxlbmd0aCA+IDAgPyBiMmAKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZVNjcm9sbCI+CiAgICAgICAgICAgICAgPHRhYmxlPgogICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgJHt0aGlzLnNlbGVjdGlvbk1vZGUgIT09ICJub25lIiA/IGIyYAogICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0id2lkdGg6NDJweDsgdGV4dC1hbGlnbjpjZW50ZXI7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5zZWxlY3Rpb25Nb2RlID09PSAibXVsdGkiID8gYjJgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWU9JHt0aGlzLmFyZUFsbFZpc2libGVTZWxlY3RlZCgpfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5kZXRlcm1pbmF0ZT0ke3RoaXMuaXNWaXNpYmxlU2VsZWN0aW9uSW5kZXRlcm1pbmF0ZSgpfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbmV3VmFsdWU9JHsoZTExKSA9PiB7CiAgICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIHRoaXMuc2V0U2VsZWN0VmlzaWJsZShlMTEuZGV0YWlsID09PSB0cnVlKTsKICAgICAgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCA6IGIyYGB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgYCA6IGIyYGB9CiAgICAgICAgICAgICAgICAgICAgJHtlZmZlY3RpdmVDb2x1bW5zLmZpbHRlcigoYzExKSA9PiAhYzExLmhpZGRlbikubWFwKChjb2wpID0+IHsKICAgICAgICBjb25zdCBpc1NvcnRhYmxlID0gISFjb2wuc29ydGFibGU7CiAgICAgICAgY29uc3QgYXJpYVNvcnQgPSB0aGlzLmdldEFyaWFTb3J0KGNvbCk7CiAgICAgICAgcmV0dXJuIGIyYAogICAgICAgICAgICAgICAgICAgICAgICAgIDx0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT0iY29sdW1uaGVhZGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1zb3J0PSR7YXJpYVNvcnR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iJHtpc1NvcnRhYmxlID8gImN1cnNvcjogcG9pbnRlcjsiIDogIiJ9IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gaXNTb3J0YWJsZSA/IHRoaXMudG9nZ2xlU29ydChjb2wpIDogbnVsbH0KICAgICAgICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2NvbC5oZWFkZXIgPz8gY29sLmtleX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5yZW5kZXJTb3J0SW5kaWNhdG9yKGNvbCl9CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5gOwogICAgICB9KX0KICAgICAgICAgICAgICAgICAgICAkeygoKSA9PiB7CiAgICAgICAgaWYgKHRoaXMuZGF0YUFjdGlvbnMgJiYgdGhpcy5kYXRhQWN0aW9ucy5sZW5ndGggPiAwKSB7CiAgICAgICAgICByZXR1cm4gYjJgIDx0aCBjbGFzcz0iYWN0aW9uc0NvbCI+QWN0aW9uczwvdGg+IGA7CiAgICAgICAgfQogICAgICB9KSgpfQogICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAke3RoaXMuc2hvd0NvbHVtbkZpbHRlcnMgPyBiMmA8dHIgY2xhc3M9ImZpbHRlcnNSb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuc2VsZWN0aW9uTW9kZSAhPT0gIm5vbmUiID8gYjJgPHRoIHN0eWxlPSJ3aWR0aDo0MnB4OyI+PC90aD5gIDogYjJgYH0KICAgICAgICAgICAgICAgICAgICAgICAgJHtlZmZlY3RpdmVDb2x1bW5zLmZpbHRlcigoYzExKSA9PiAhYzExLmhpZGRlbikubWFwKChjb2wpID0+IHsKICAgICAgICBjb25zdCBrZXkyID0gU3RyaW5nKGNvbC5rZXkpOwogICAgICAgIGlmIChjb2wuZmlsdGVyYWJsZSA9PT0gZmFsc2UpCiAgICAgICAgICByZXR1cm4gYjJgPHRoPjwvdGg+YDsKICAgICAgICByZXR1cm4gYjJgPHRoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IkZpbHRlci4uLiIgLnZhbHVlPSR7dGhpcy5jb2x1bW5GaWx0ZXJzW2tleTJdIHx8ICIifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpbnB1dD0keyhlMTEpID0+IHRoaXMuc2V0Q29sdW1uRmlsdGVyKGtleTIsIGUxMS50YXJnZXQudmFsdWUpfSAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5gOwogICAgICB9KX0KICAgICAgICAgICAgICAgICAgICAgICAgJHsoKCkgPT4gewogICAgICAgIGlmICh0aGlzLmRhdGFBY3Rpb25zICYmIHRoaXMuZGF0YUFjdGlvbnMubGVuZ3RoID4gMCkgewogICAgICAgICAgcmV0dXJuIGIyYCA8dGg+PC90aD4gYDsKICAgICAgICB9CiAgICAgIH0pKCl9CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPmAgOiBiMmBgfQogICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgICAgJHt2aWV3RGF0YS5tYXAoKGl0ZW1BcmcsIHJvd0luZGV4KSA9PiB7CiAgICAgICAgY29uc3QgZ2V0VHIgPSAoZWxlbWVudEFyZykgPT4gewogICAgICAgICAgaWYgKGVsZW1lbnRBcmcudGFnTmFtZSA9PT0gIlRSIikgewogICAgICAgICAgICByZXR1cm4gZWxlbWVudEFyZzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBnZXRUcihlbGVtZW50QXJnLnBhcmVudEVsZW1lbnQpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGIyYAogICAgICAgICAgICAgICAgICAgICAgPHRyCiAgICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHsKICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRhUm93ID0gaXRlbUFyZzsKICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICJzaW5nbGUiKSB7CiAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChpdGVtQXJnKTsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZElkcy5jbGVhcigpOwogICAgICAgICAgICB0aGlzLnNlbGVjdGVkSWRzLmFkZChpZCk7CiAgICAgICAgICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpOwogICAgICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgICAgIH0KICAgICAgICB9fQogICAgICAgICAgICAgICAgICAgICAgICBAZHJhZ2VudGVyPSR7YXN5bmMgKGV2ZW50QXJnKSA9PiB7CiAgICAgICAgICBldmVudEFyZy5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgZXZlbnRBcmcuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICBjb25zdCByZWFsVGFyZ2V0ID0gZ2V0VHIoZXZlbnRBcmcudGFyZ2V0KTsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICByZWFsVGFyZ2V0LmNsYXNzTGlzdC5hZGQoImhhc0F0dGFjaG1lbnQiKTsKICAgICAgICAgIH0sIDApOwogICAgICAgIH19CiAgICAgICAgICAgICAgICAgICAgICAgIEBkcmFnbGVhdmU9JHthc3luYyAoZXZlbnRBcmcpID0+IHsKICAgICAgICAgIGV2ZW50QXJnLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBldmVudEFyZy5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgIGNvbnN0IHJlYWxUYXJnZXQgPSBnZXRUcihldmVudEFyZy50YXJnZXQpOwogICAgICAgICAgcmVhbFRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCJoYXNBdHRhY2htZW50Iik7CiAgICAgICAgfX0KICAgICAgICAgICAgICAgICAgICAgICAgQGRyYWdvdmVyPSR7YXN5bmMgKGV2ZW50QXJnKSA9PiB7CiAgICAgICAgICBldmVudEFyZy5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH19CiAgICAgICAgICAgICAgICAgICAgICAgIEBkcm9wPSR7YXN5bmMgKGV2ZW50QXJnKSA9PiB7CiAgICAgICAgICBldmVudEFyZy5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgY29uc3QgbmV3RmlsZXMgPSBbXTsKICAgICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBBcnJheS5mcm9tKGV2ZW50QXJnLmRhdGFUcmFuc2Zlci5maWxlcykpIHsKICAgICAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGUpOwogICAgICAgICAgICBuZXdGaWxlcy5wdXNoKGZpbGUpOwogICAgICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZmlsZVdlYWtNYXAuZ2V0KGl0ZW1BcmcpOwogICAgICAgICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICAgICAgdGhpcy5maWxlV2Vha01hcC5zZXQoaXRlbUFyZywgbmV3RmlsZXMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4ubmV3RmlsZXMpOwogICAgICAgICAgfQogICAgICAgIH19CiAgICAgICAgICAgICAgICAgICAgICAgIEBjb250ZXh0bWVudT0ke2FzeW5jIChldmVudEFyZykgPT4gewogICAgICAgICAgRGVlc0NvbnRleHRtZW51Lm9wZW5Db250ZXh0TWVudVdpdGhPcHRpb25zKGV2ZW50QXJnLCB0aGlzLmdldEFjdGlvbnNGb3JUeXBlKCJjb250ZXh0bWVudSIpLm1hcCgoYWN0aW9uKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1lbnVJdGVtID0gewogICAgICAgICAgICAgIG5hbWU6IGFjdGlvbi5uYW1lLAogICAgICAgICAgICAgIGljb25OYW1lOiBhY3Rpb24uaWNvbk5hbWUsCiAgICAgICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgICAgICBhd2FpdCBhY3Rpb24uYWN0aW9uRnVuYyh7CiAgICAgICAgICAgICAgICAgIGl0ZW06IGl0ZW1BcmcsCiAgICAgICAgICAgICAgICAgIHRhYmxlOiB0aGlzCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIG1lbnVJdGVtOwogICAgICAgICAgfSkpOwogICAgICAgIH19CiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSIke2l0ZW1BcmcgPT09IHRoaXMuc2VsZWN0ZWREYXRhUm93ID8gInNlbGVjdGVkIiA6ICIifSIKICAgICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLnNlbGVjdGlvbk1vZGUgIT09ICJub25lIiA/IGIyYDx0ZCBzdHlsZT0id2lkdGg6NDJweDsgdGV4dC1hbGlnbjpjZW50ZXI7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWU9JHt0aGlzLmlzUm93U2VsZWN0ZWQoaXRlbUFyZyl9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5ld1ZhbHVlPSR7KGUxMSkgPT4gewogICAgICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgdGhpcy5zZXRSb3dTZWxlY3RlZChpdGVtQXJnLCBlMTEuZGV0YWlsID09PSB0cnVlKTsKICAgICAgICB9fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5gIDogYjJgYH0KICAgICAgICAgICAgICAgICAgICAgICAgJHtlZmZlY3RpdmVDb2x1bW5zLmZpbHRlcigoYzExKSA9PiAhYzExLmhpZGRlbikubWFwKChjb2wsIGNvbEluZGV4KSA9PiB7CiAgICAgICAgICBjb25zdCB2YWx1ZTIgPSBnZXRDZWxsVmFsdWUoaXRlbUFyZywgY29sLCB0aGlzLmRpc3BsYXlGdW5jdGlvbik7CiAgICAgICAgICBjb25zdCBjb250ZW50MyA9IGNvbC5yZW5kZXJlciA/IGNvbC5yZW5kZXJlcih2YWx1ZTIsIGl0ZW1BcmcsIHsgcm93SW5kZXgsIGNvbEluZGV4LCBjb2x1bW46IGNvbCB9KSA6IHZhbHVlMjsKICAgICAgICAgIGNvbnN0IGVkaXRLZXkgPSBTdHJpbmcoY29sLmtleSk7CiAgICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBkYmxjbGljaz0keyhlMTEpID0+IHsKICAgICAgICAgICAgY29uc3QgZGJsQWN0aW9uID0gdGhpcy5kYXRhQWN0aW9ucy5maW5kKChhY3Rpb25BcmcpID0+IGFjdGlvbkFyZy50eXBlLmluY2x1ZGVzKCJkb3VibGVDbGljayIpKTsKICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGFibGVGaWVsZHMuaW5jbHVkZXMoZWRpdEtleSkpIHsKICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNlbGxFZGl0aW5nKGUxMSwgaXRlbUFyZywgZWRpdEtleSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGJsQWN0aW9uKSB7CiAgICAgICAgICAgICAgZGJsQWN0aW9uLmFjdGlvbkZ1bmMoeyBpdGVtOiBpdGVtQXJnLCB0YWJsZTogdGhpcyB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubmVyQ2VsbENvbnRhaW5lciI+JHtjb250ZW50M308L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA7CiAgICAgICAgfSl9CiAgICAgICAgICAgICAgICAgICAgICAgICR7KCgpID0+IHsKICAgICAgICAgIGlmICh0aGlzLmRhdGFBY3Rpb25zICYmIHRoaXMuZGF0YUFjdGlvbnMubGVuZ3RoID4gMCkgewogICAgICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iYWN0aW9uc0NvbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWN0aW9uc0NvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuZ2V0QWN0aW9uc0ZvclR5cGUoImluUm93IikubWFwKChhY3Rpb25BcmcpID0+IGIyYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJhY3Rpb24iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiBhY3Rpb25BcmcuYWN0aW9uRnVuYyh7CiAgICAgICAgICAgICAgaXRlbTogaXRlbUFyZywKICAgICAgICAgICAgICB0YWJsZTogdGhpcwogICAgICAgICAgICB9KX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2FjdGlvbkFyZy5pY29uTmFtZSA/IGIyYCA8ZGVlcy1pY29uIC5pY29uPSR7YWN0aW9uQXJnLmljb25OYW1lfT48L2RlZXMtaWNvbj4gYCA6IGFjdGlvbkFyZy5uYW1lfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgKX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA7CiAgICAgICAgICB9CiAgICAgICAgfSkoKX0KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+YDsKICAgICAgfSl9CiAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIGAgOiBiMmAgPGRpdiBjbGFzcz0ibm9EYXRhU2V0Ij5ObyBkYXRhIHNldCE8L2Rpdj4gYH0KICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0idGFibGVTdGF0aXN0aWNzIj4KICAgICAgICAgICAgJHt0aGlzLmRhdGEubGVuZ3RofSAke3RoaXMuZGF0YU5hbWUgfHwgImRhdGEgcm93cyJ9ICh0b3RhbCkgfAogICAgICAgICAgICAke3RoaXMuc2VsZWN0ZWREYXRhUm93ID8gYCMgJHt0aGlzLmRhdGEuaW5kZXhPZih0aGlzLnNlbGVjdGVkRGF0YVJvdykgKyAxfWAgOiBgTm9gfQogICAgICAgICAgICBzZWxlY3RlZAogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXJBY3Rpb25zIj4KICAgICAgICAgICAgJHtkaXJlY3RpdmVzX2V4cG9ydHMucmVzb2x2ZUV4ZWMoYXN5bmMgKCkgPT4gewogICAgICAgIGNvbnN0IHJlc3VsdEFycmF5ID0gW107CiAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdGhpcy5kYXRhQWN0aW9ucykgewogICAgICAgICAgaWYgKCFhY3Rpb24udHlwZS5pbmNsdWRlcygiZm9vdGVyIikpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgcmVzdWx0QXJyYXkucHVzaChiMmA8ZGl2CiAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImZvb3RlckFjdGlvbiIKICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB7CiAgICAgICAgICAgIGFjdGlvbi5hY3Rpb25GdW5jKHsKICAgICAgICAgICAgICBpdGVtOiB0aGlzLnNlbGVjdGVkRGF0YVJvdywKICAgICAgICAgICAgICB0YWJsZTogdGhpcwogICAgICAgICAgICB9KTsKICAgICAgICAgIH19CiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAke2FjdGlvbi5pY29uTmFtZSA/IGIyYDxkZWVzLWljb24gLmljb25TaXplPSR7MTR9IC5pY29uPSR7YWN0aW9uLmljb25OYW1lfT48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAke2FjdGlvbi5uYW1lfWAgOiBhY3Rpb24ubmFtZX0KICAgICAgICAgICAgICAgICAgPC9kaXY+YCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRBcnJheTsKICAgICAgfSl9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKCkgewogICAgfQogICAgYXN5bmMgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgICBzdXBlci51cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgdGhpcy5kZXRlcm1pbmVDb2x1bW5XaWR0aHMoKTsKICAgICAgaWYgKHRoaXMuc2VhcmNoYWJsZSkgewogICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5kYXRhQWN0aW9ucy5maW5kKChhY3Rpb25BcmcpID0+IGFjdGlvbkFyZy50eXBlLmluY2x1ZGVzKCJoZWFkZXIiKSAmJiBhY3Rpb25BcmcubmFtZSA9PT0gIlNlYXJjaCIpOwogICAgICAgIGlmICghZXhpc3RpbmcpIHsKICAgICAgICAgIHRoaXMuZGF0YUFjdGlvbnMudW5zaGlmdCh7CiAgICAgICAgICAgIG5hbWU6ICJTZWFyY2giLAogICAgICAgICAgICBpY29uTmFtZTogIm1hZ25pZnlpbmdHbGFzcyIsCiAgICAgICAgICAgIHR5cGU6IFsiaGVhZGVyIl0sCiAgICAgICAgICAgIGFjdGlvbkZ1bmM6IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgICBjb25zb2xlLmxvZygib3BlbiBzZWFyY2giKTsKICAgICAgICAgICAgICBjb25zdCBzZWFyY2hHcmlkID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5zZWFyY2hHcmlkIik7CiAgICAgICAgICAgICAgc2VhcmNoR3JpZC5jbGFzc0xpc3QudG9nZ2xlKCJoaWRkZW4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmRhdGFBY3Rpb25zKTsKICAgICAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgICAgIH0KICAgICAgICA7CiAgICAgICAgdGhpcy53aXJlU2VhcmNoSW5wdXRzKCk7CiAgICAgIH0KICAgIH0KICAgIF9fZGVib3VuY2VUaW1lcjsKICAgIGRlYm91bmNlUnVuKGZuLCBtcyA9IDIwMCkgewogICAgICBpZiAodGhpcy5fX2RlYm91bmNlVGltZXIpCiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX19kZWJvdW5jZVRpbWVyKTsKICAgICAgdGhpcy5fX2RlYm91bmNlVGltZXIgPSBzZXRUaW1lb3V0KGZuLCBtcyk7CiAgICB9CiAgICB3aXJlU2VhcmNoSW5wdXRzKCkgewogICAgICBjb25zdCBzZWFyY2hUZXh0RWwgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5zZWFyY2hHcmlkIGRlZXMtaW5wdXQtdGV4dCIpOwogICAgICBjb25zdCBzZWFyY2hNb2RlRWwgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5zZWFyY2hHcmlkIGRlZXMtaW5wdXQtbXVsdGl0b2dnbGUiKTsKICAgICAgaWYgKHNlYXJjaFRleHRFbCAmJiAhdGhpcy5fX3NlYXJjaFRleHRTdWIpIHsKICAgICAgICB0aGlzLl9fc2VhcmNoVGV4dFN1YiA9IHNlYXJjaFRleHRFbC5jaGFuZ2VTdWJqZWN0LnN1YnNjcmliZSgoZWwpID0+IHsKICAgICAgICAgIGNvbnN0IHZhbCA9IGVsPy52YWx1ZSA/PyAiIjsKICAgICAgICAgIHRoaXMuZGVib3VuY2VSdW4oKCkgPT4gewogICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hNb2RlID09PSAic2VydmVyIikgewogICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInNlYXJjaFJlcXVlc3QiLCB7CiAgICAgICAgICAgICAgICBkZXRhaWw6IHsgcXVlcnk6IHZhbCwgbW9kZTogInNlcnZlciIgfSwKICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5zZXRGaWx0ZXJUZXh0KHZhbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGlmIChzZWFyY2hNb2RlRWwgJiYgIXRoaXMuX19zZWFyY2hNb2RlU3ViKSB7CiAgICAgICAgdGhpcy5fX3NlYXJjaE1vZGVTdWIgPSBzZWFyY2hNb2RlRWwuY2hhbmdlU3ViamVjdC5zdWJzY3JpYmUoKGVsKSA9PiB7CiAgICAgICAgICBjb25zdCBtb2RlID0gZWw/LnNlbGVjdGVkT3B0aW9uIHx8IGVsPy52YWx1ZSB8fCAidGFibGUiOwogICAgICAgICAgaWYgKG1vZGUgPT09ICJ0YWJsZSIgfHwgbW9kZSA9PT0gImRhdGEiIHx8IG1vZGUgPT09ICJzZXJ2ZXIiKSB7CiAgICAgICAgICAgIHRoaXMuc2VhcmNoTW9kZSA9IG1vZGU7CiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHNlYXJjaFRleHRFbD8udmFsdWUgPz8gIiI7CiAgICAgICAgICAgIHRoaXMuZGVib3VuY2VSdW4oKCkgPT4gewogICAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaE1vZGUgPT09ICJzZXJ2ZXIiKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJzZWFyY2hSZXF1ZXN0IiwgeyBkZXRhaWw6IHsgcXVlcnk6IHZhbCwgbW9kZTogInNlcnZlciIgfSwgYnViYmxlczogdHJ1ZSB9KSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0RmlsdGVyVGV4dCh2YWwpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGRldGVybWluZUNvbHVtbldpZHRocygpIHsKICAgICAgY29uc3QgZG9tdG9vbHMgPSBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgYXdhaXQgZG9tdG9vbHMuY29udmVuaWVuY2Uuc21hcnRkZWxheS5kZWxheUZvcigwKTsKICAgICAgY29uc3QgdGFibGUyID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoInRhYmxlIik7CiAgICAgIGlmICghdGFibGUyKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgY2VsbHMyID0gdGFibGUyLnJvd3NbMF0uY2VsbHM7CiAgICAgIGNvbnN0IGhhbmRsZUNvbHVtbkJ5SW5kZXggPSBhc3luYyAoaTExLCB3YWl0Rm9yUmVuZGVyQXJnID0gZmFsc2UpID0+IHsKICAgICAgICBjb25zdCBkb25lID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICAgICAgY29uc3QgY2VsbDIgPSBjZWxsczJbaTExXTsKICAgICAgICBjb25zdCB3aWR0aCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNlbGwyKS53aWR0aDsKICAgICAgICBpZiAoY2VsbDIudGV4dENvbnRlbnQuaW5jbHVkZXMoIkFjdGlvbnMiKSkgewogICAgICAgICAgY29uc3QgbmVlZGVkV2lkdGggPSB0aGlzLmRhdGFBY3Rpb25zLmZpbHRlcigoYWN0aW9uQXJnKSA9PiBhY3Rpb25BcmcudHlwZS5pbmNsdWRlcygiaW5Sb3ciKSkubGVuZ3RoICogMzY7CiAgICAgICAgICBjZWxsMi5zdHlsZS53aWR0aCA9IGAke01hdGgubWF4KG5lZWRlZFdpZHRoLCA2OCl9cHhgOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjZWxsMi5zdHlsZS53aWR0aCA9IHdpZHRoOwogICAgICAgIH0KICAgICAgICBpZiAod2FpdEZvclJlbmRlckFyZykgewogICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICAgICAgZG9uZS5yZXNvbHZlKCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIGF3YWl0IGRvbmUucHJvbWlzZTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIGlmIChjZWxsczJbY2VsbHMyLmxlbmd0aCAtIDFdLnRleHRDb250ZW50LmluY2x1ZGVzKCJBY3Rpb25zIikpIHsKICAgICAgICBhd2FpdCBoYW5kbGVDb2x1bW5CeUluZGV4KGNlbGxzMi5sZW5ndGggLSAxLCB0cnVlKTsKICAgICAgfQogICAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBjZWxsczIubGVuZ3RoOyBpMTErKykgewogICAgICAgIGlmIChjZWxsczJbaTExXS50ZXh0Q29udGVudC5pbmNsdWRlcygiQWN0aW9ucyIpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgYXdhaXQgaGFuZGxlQ29sdW1uQnlJbmRleChpMTEpOwogICAgICB9CiAgICAgIHRhYmxlMi5zdHlsZS50YWJsZUxheW91dCA9ICJmaXhlZCI7CiAgICB9CiAgICAvLyBjb21wdXRlIGhlbHBlcnMgbW92ZWQgdG8gLi9kYXRhLnRzCiAgICB0b2dnbGVTb3J0KGNvbCkgewogICAgICBjb25zdCBrZXkyID0gU3RyaW5nKGNvbC5rZXkpOwogICAgICBpZiAodGhpcy5zb3J0S2V5ICE9PSBrZXkyKSB7CiAgICAgICAgdGhpcy5zb3J0S2V5ID0ga2V5MjsKICAgICAgICB0aGlzLnNvcnREaXIgPSAiYXNjIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAodGhpcy5zb3J0RGlyID09PSAiYXNjIikKICAgICAgICAgIHRoaXMuc29ydERpciA9ICJkZXNjIjsKICAgICAgICBlbHNlIGlmICh0aGlzLnNvcnREaXIgPT09ICJkZXNjIikgewogICAgICAgICAgdGhpcy5zb3J0RGlyID0gbnVsbDsKICAgICAgICAgIHRoaXMuc29ydEtleSA9IHZvaWQgMDsKICAgICAgICB9IGVsc2UKICAgICAgICAgIHRoaXMuc29ydERpciA9ICJhc2MiOwogICAgICB9CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInNvcnRDaGFuZ2UiLCB7CiAgICAgICAgZGV0YWlsOiB7IGtleTogdGhpcy5zb3J0S2V5LCBkaXI6IHRoaXMuc29ydERpciB9LAogICAgICAgIGJ1YmJsZXM6IHRydWUKICAgICAgfSkpOwogICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgIH0KICAgIGdldEFyaWFTb3J0KGNvbCkgewogICAgICBpZiAoU3RyaW5nKGNvbC5rZXkpICE9PSB0aGlzLnNvcnRLZXkgfHwgIXRoaXMuc29ydERpcikKICAgICAgICByZXR1cm4gIm5vbmUiOwogICAgICByZXR1cm4gdGhpcy5zb3J0RGlyID09PSAiYXNjIiA/ICJhc2NlbmRpbmciIDogImRlc2NlbmRpbmciOwogICAgfQogICAgcmVuZGVyU29ydEluZGljYXRvcihjb2wpIHsKICAgICAgaWYgKFN0cmluZyhjb2wua2V5KSAhPT0gdGhpcy5zb3J0S2V5IHx8ICF0aGlzLnNvcnREaXIpCiAgICAgICAgcmV0dXJuIGIyYGA7CiAgICAgIHJldHVybiBiMmA8c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6NnB4OyBvcGFjaXR5OjAuNzsiPiR7dGhpcy5zb3J0RGlyID09PSAiYXNjIiA/ICJcdTI1QjIiIDogIlx1MjVCQyJ9PC9zcGFuPmA7CiAgICB9CiAgICAvLyBmaWx0ZXJpbmcgaGVscGVycwogICAgc2V0RmlsdGVyVGV4dCh2YWx1ZTIpIHsKICAgICAgY29uc3QgcHJldiA9IHRoaXMuZmlsdGVyVGV4dDsKICAgICAgdGhpcy5maWx0ZXJUZXh0ID0gdmFsdWUyID8/ICIiOwogICAgICBpZiAocHJldiAhPT0gdGhpcy5maWx0ZXJUZXh0KSB7CiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiZmlsdGVyQ2hhbmdlIiwgewogICAgICAgICAgZGV0YWlsOiB7IHRleHQ6IHRoaXMuZmlsdGVyVGV4dCwgY29sdW1uczogeyAuLi50aGlzLmNvbHVtbkZpbHRlcnMgfSB9LAogICAgICAgICAgYnViYmxlczogdHJ1ZQogICAgICAgIH0pKTsKICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgfQogICAgfQogICAgc2V0Q29sdW1uRmlsdGVyKGtleTIsIHZhbHVlMikgewogICAgICB0aGlzLmNvbHVtbkZpbHRlcnMgPSB7IC4uLnRoaXMuY29sdW1uRmlsdGVycywgW2tleTJdOiB2YWx1ZTIgfTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiZmlsdGVyQ2hhbmdlIiwgewogICAgICAgIGRldGFpbDogeyB0ZXh0OiB0aGlzLmZpbHRlclRleHQsIGNvbHVtbnM6IHsgLi4udGhpcy5jb2x1bW5GaWx0ZXJzIH0gfSwKICAgICAgICBidWJibGVzOiB0cnVlCiAgICAgIH0pKTsKICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7CiAgICB9CiAgICAvLyBzZWxlY3Rpb24gaGVscGVycwogICAgZ2V0Um93SWQocm93KSB7CiAgICAgIGlmICh0aGlzLnJvd0tleSkgewogICAgICAgIGlmICh0eXBlb2YgdGhpcy5yb3dLZXkgPT09ICJmdW5jdGlvbiIpCiAgICAgICAgICByZXR1cm4gdGhpcy5yb3dLZXkocm93KTsKICAgICAgICByZXR1cm4gU3RyaW5nKHJvd1t0aGlzLnJvd0tleV0pOwogICAgICB9CiAgICAgIGNvbnN0IGtleTIgPSByb3c7CiAgICAgIGlmICghdGhpcy5fcm93SWRNYXAuaGFzKGtleTIpKSB7CiAgICAgICAgdGhpcy5fcm93SWRNYXAuc2V0KGtleTIsIFN0cmluZygrK3RoaXMuX3Jvd0lkQ291bnRlcikpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9yb3dJZE1hcC5nZXQoa2V5Mik7CiAgICB9CiAgICBpc1Jvd1NlbGVjdGVkKHJvdykgewogICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZElkcy5oYXModGhpcy5nZXRSb3dJZChyb3cpKTsKICAgIH0KICAgIHRvZ2dsZVJvd1NlbGVjdGVkKHJvdykgewogICAgICBjb25zdCBpZCA9IHRoaXMuZ2V0Um93SWQocm93KTsKICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gInNpbmdsZSIpIHsKICAgICAgICB0aGlzLnNlbGVjdGVkSWRzLmNsZWFyKCk7CiAgICAgICAgdGhpcy5zZWxlY3RlZElkcy5hZGQoaWQpOwogICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gIm11bHRpIikgewogICAgICAgIGlmICh0aGlzLnNlbGVjdGVkSWRzLmhhcyhpZCkpCiAgICAgICAgICB0aGlzLnNlbGVjdGVkSWRzLmRlbGV0ZShpZCk7CiAgICAgICAgZWxzZQogICAgICAgICAgdGhpcy5zZWxlY3RlZElkcy5hZGQoaWQpOwogICAgICB9CiAgICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpOwogICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgIH0KICAgIHNldFJvd1NlbGVjdGVkKHJvdywgY2hlY2tlZCkgewogICAgICBjb25zdCBpZCA9IHRoaXMuZ2V0Um93SWQocm93KTsKICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gInNpbmdsZSIpIHsKICAgICAgICB0aGlzLnNlbGVjdGVkSWRzLmNsZWFyKCk7CiAgICAgICAgaWYgKGNoZWNrZWQpCiAgICAgICAgICB0aGlzLnNlbGVjdGVkSWRzLmFkZChpZCk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAibXVsdGkiKSB7CiAgICAgICAgaWYgKGNoZWNrZWQpCiAgICAgICAgICB0aGlzLnNlbGVjdGVkSWRzLmFkZChpZCk7CiAgICAgICAgZWxzZQogICAgICAgICAgdGhpcy5zZWxlY3RlZElkcy5kZWxldGUoaWQpOwogICAgICB9CiAgICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpOwogICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgIH0KICAgIGFyZUFsbFZpc2libGVTZWxlY3RlZCgpIHsKICAgICAgY29uc3QgdmlldyA9IHRoaXMuX2xhc3RWaWV3RGF0YSB8fCBbXTsKICAgICAgaWYgKHZpZXcubGVuZ3RoID09PSAwKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgZm9yIChjb25zdCByMTEgb2YgdmlldykgewogICAgICAgIGlmICghdGhpcy5zZWxlY3RlZElkcy5oYXModGhpcy5nZXRSb3dJZChyMTEpKSkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlzVmlzaWJsZVNlbGVjdGlvbkluZGV0ZXJtaW5hdGUoKSB7CiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLl9sYXN0Vmlld0RhdGEgfHwgW107CiAgICAgIGlmICh2aWV3Lmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIGxldCBjb3VudDIgPSAwOwogICAgICBmb3IgKGNvbnN0IHIxMSBvZiB2aWV3KSB7CiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJZHMuaGFzKHRoaXMuZ2V0Um93SWQocjExKSkpCiAgICAgICAgICBjb3VudDIrKzsKICAgICAgfQogICAgICByZXR1cm4gY291bnQyID4gMCAmJiBjb3VudDIgPCB2aWV3Lmxlbmd0aDsKICAgIH0KICAgIHNldFNlbGVjdFZpc2libGUoY2hlY2tlZCkgewogICAgICBjb25zdCB2aWV3ID0gdGhpcy5fbGFzdFZpZXdEYXRhIHx8IFtdOwogICAgICBpZiAoY2hlY2tlZCkgewogICAgICAgIGZvciAoY29uc3QgcjExIG9mIHZpZXcpCiAgICAgICAgICB0aGlzLnNlbGVjdGVkSWRzLmFkZCh0aGlzLmdldFJvd0lkKHIxMSkpOwogICAgICB9IGVsc2UgewogICAgICAgIGZvciAoY29uc3QgcjExIG9mIHZpZXcpCiAgICAgICAgICB0aGlzLnNlbGVjdGVkSWRzLmRlbGV0ZSh0aGlzLmdldFJvd0lkKHIxMSkpOwogICAgICB9CiAgICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpOwogICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgIH0KICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKSB7CiAgICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGVkSWRzKTsKICAgICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5kYXRhLmZpbHRlcigocjExKSA9PiB0aGlzLnNlbGVjdGVkSWRzLmhhcyh0aGlzLmdldFJvd0lkKHIxMSkpKTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgic2VsZWN0aW9uQ2hhbmdlIiwgewogICAgICAgIGRldGFpbDogeyBzZWxlY3RlZElkcywgc2VsZWN0ZWRSb3dzIH0sCiAgICAgICAgYnViYmxlczogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBnZXRBY3Rpb25zRm9yVHlwZSh0eXBlQXJnKSB7CiAgICAgIGNvbnN0IGFjdGlvbnMgPSBbXTsKICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdGhpcy5kYXRhQWN0aW9ucykgewogICAgICAgIGlmICghYWN0aW9uLnR5cGUuaW5jbHVkZXModHlwZUFyZykpCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBhY3Rpb25zLnB1c2goYWN0aW9uKTsKICAgICAgfQogICAgICByZXR1cm4gYWN0aW9uczsKICAgIH0KICAgIGFzeW5jIGhhbmRsZUNlbGxFZGl0aW5nKGV2ZW50LCBpdGVtQXJnLCBrZXkyKSB7CiAgICAgIGF3YWl0IHRoaXMuZG9tdG9vbHNQcm9taXNlOwogICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7CiAgICAgIGNvbnN0IG9yaWdpbmFsQ29sb3IgPSB0YXJnZXQuc3R5bGUuY29sb3I7CiAgICAgIHRhcmdldC5zdHlsZS5jb2xvciA9ICJ0cmFuc3BhcmVudCI7CiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkSXRlbSA9IHRoaXMuZGlzcGxheUZ1bmN0aW9uKGl0ZW1BcmcpOwogICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSB0cmFuc2Zvcm1lZEl0ZW1ba2V5Ml0gPz8gaXRlbUFyZ1trZXkyXSA/PyAiIjsKICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwogICAgICBpbnB1dC50eXBlID0gInRleHQiOwogICAgICBpbnB1dC52YWx1ZSA9IGluaXRpYWxWYWx1ZTsKICAgICAgY29uc3QgYmx1cklucHV0ID0gYXN5bmMgKGJsdXJBcmcgPSB0cnVlLCBzYXZlQXJnID0gZmFsc2UpID0+IHsKICAgICAgICBpZiAoYmx1ckFyZykgewogICAgICAgICAgaW5wdXQuYmx1cigpOwogICAgICAgIH0KICAgICAgICBpZiAoc2F2ZUFyZykgewogICAgICAgICAgaXRlbUFyZ1trZXkyXSA9IGlucHV0LnZhbHVlOwogICAgICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgICAgfQogICAgICAgIGlucHV0LnJlbW92ZSgpOwogICAgICAgIHRhcmdldC5zdHlsZS5jb2xvciA9IG9yaWdpbmFsQ29sb3I7CiAgICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7CiAgICAgIH07CiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLCAoKSA9PiB7CiAgICAgICAgYmx1cklucHV0KGZhbHNlLCBmYWxzZSk7CiAgICAgIH0pOwogICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgKGUxMSkgPT4gewogICAgICAgIGlmIChlMTEua2V5ID09PSAiRW50ZXIiKSB7CiAgICAgICAgICBibHVySW5wdXQodHJ1ZSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKGlucHV0KTsKICAgICAgaW5wdXQuZm9jdXMoKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMzMoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNUYWJsZTIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWZvcm0vZGVlcy1mb3JtL2RlZXMtZm9ybS5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vRnVuYzI1ID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgJHtpYAogICAgICAuZGVtby1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDI0cHg7CiAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICBtYXgtd2lkdGg6IDEyMDBweDsKICAgICAgICBtYXJnaW46IDAgYXV0bzsKICAgICAgfQogICAgICAKICAgICAgZGVlcy1wYW5lbCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgfQogICAgICAKICAgICAgZGVlcy1wYW5lbDpsYXN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICB9CiAgICAgIAogICAgICAuZm9ybS1vdXRwdXQgewogICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICAgIH0KICAgICAgCiAgICAgIC5zdGF0dXMtbWVzc2FnZSB7CiAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5zdGF0dXMtbWVzc2FnZS5zdWNjZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDE0Mi4xIDcwLjYlIDQ1LjMlIC8gMC4xKSIsICJoc2woMTQyLjEgNzAuNiUgNDUuMyUgLyAwLjIpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDE0Mi4xIDcwLjYlIDM1LjMlKSIsICJoc2woMTQyLjEgNzAuNiUgNjUuMyUpIil9OwogICAgICB9CiAgICAgIAogICAgICAuc3RhdHVzLW1lc3NhZ2UuZXJyb3IgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA3Mi4yJSA1MC42JSAvIDAuMSkiLCAiaHNsKDAgNzIuMiUgNTAuNiUgLyAwLjIpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzIuMiUgNDAuNiUpIiwgImhzbCgwIDcyLjIlIDYwLjYlKSIpfTsKICAgICAgfQogICAgYH0KICA8L3N0eWxlPgogIAogIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgZm9ybSA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1mb3JtIik7CiAgY29uc3Qgb3V0cHV0RGl2ID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIuZm9ybS1vdXRwdXQiKTsKICBpZiAoZm9ybSAmJiBvdXRwdXREaXYpIHsKICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcigiZm9ybURhdGEiLCBhc3luYyAoZXZlbnRBcmcpID0+IHsKICAgICAgY29uc3QgZGF0YSA9IGV2ZW50QXJnLmRldGFpbC5kYXRhOwogICAgICBjb25zb2xlLmxvZygiRm9ybSBzdWJtaXR0ZWQgd2l0aCBkYXRhOiIsIGRhdGEpOwogICAgICBmb3JtLnNldFN0YXR1cygicGVuZGluZyIsICJQcm9jZXNzaW5nIHlvdXIgcmVnaXN0cmF0aW9uLi4uIik7CiAgICAgIG91dHB1dERpdi5pbm5lckhUTUwgPSBgPHN0cm9uZz5TdWJtaXR0ZWQgRGF0YTo8L3N0cm9uZz4KJHtKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKX1gOwogICAgICBhd2FpdCBkaXN0X3RzX2V4cG9ydHMyNS5wbHVnaW5zLnNtYXJ0ZGVsYXkuZGVsYXlGb3IoMmUzKTsKICAgICAgZm9ybS5zZXRTdGF0dXMoInN1Y2Nlc3MiLCAiUmVnaXN0cmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhIik7CiAgICAgIGF3YWl0IGRpc3RfdHNfZXhwb3J0czI1LnBsdWdpbnMuc21hcnRkZWxheS5kZWxheUZvcigyZTMpOwogICAgICBmb3JtLnJlc2V0KCk7CiAgICAgIG91dHB1dERpdi5pbm5lckhUTUwgPSAiPGVtPkZvcm0gaGFzIGJlZW4gcmVzZXQ8L2VtPiI7CiAgICB9KTsKICAgIGNvbnN0IGlucHV0cyA9IGZvcm0ucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1pbnB1dC10ZXh0LCBkZWVzLWlucHV0LWRyb3Bkb3duLCBkZWVzLWlucHV0LWNoZWNrYm94Iik7CiAgICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHsKICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlU3ViamVjdCIsICgpID0+IHsKICAgICAgICBjb25zb2xlLmxvZygiRmllbGQgY2hhbmdlZDoiLCBpbnB1dC5nZXRBdHRyaWJ1dGUoImtleSIpKTsKICAgICAgfSk7CiAgICB9KTsKICB9Cn19PgogICAgICA8ZGVlcy1wYW5lbCAuaGVhZGluZz0iQ29tcGxldGUgRm9ybSBFeGFtcGxlIiAuZGVzY3JpcHRpb249IkEgY29tcHJlaGVuc2l2ZSBmb3JtIHdpdGggdmFyaW91cyBpbnB1dCB0eXBlcywgdmFsaWRhdGlvbiwgYW5kIGZvcm0gc3VibWlzc2lvbiBoYW5kbGluZyI+CiAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgCiAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9IAogICAgICAgICAgICBrZXk9ImZpcnN0TmFtZSIgCiAgICAgICAgICAgIGxhYmVsPSJGaXJzdCBOYW1lIgogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiWW91ciBnaXZlbiBuYW1lIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAKICAgICAgICAgICAgLnJlcXVpcmVkPSR7dHJ1ZX0gCiAgICAgICAgICAgIGtleT0ibGFzdE5hbWUiIAogICAgICAgICAgICBsYWJlbD0iTGFzdCBOYW1lIgogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IAogICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfSAKICAgICAgICAgICAga2V5PSJlbWFpbCIgCiAgICAgICAgICAgIGxhYmVsPSJFbWFpbCBBZGRyZXNzIgogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiV2Ugd2lsbCB1c2UgdGhpcyB0byBjb250YWN0IHlvdSJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICAgIGtleT0iY291bnRyeSIKICAgICAgICAgICAgLmxhYmVsPSR7IkNvdW50cnkifQogICAgICAgICAgICAub3B0aW9ucz0ke1sKICB7IG9wdGlvbjogIlVuaXRlZCBTdGF0ZXMiLCBrZXk6ICJ1cyIgfSwKICB7IG9wdGlvbjogIkNhbmFkYSIsIGtleTogImNhIiB9LAogIHsgb3B0aW9uOiAiR2VybWFueSIsIGtleTogImRlIiB9LAogIHsgb3B0aW9uOiAiRnJhbmNlIiwga2V5OiAiZnIiIH0sCiAgeyBvcHRpb246ICJVbml0ZWQgS2luZ2RvbSIsIGtleTogInVrIiB9Cl19CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWRyb3Bkb3duPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0CiAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICAgIGtleT0icGFzc3dvcmQiCiAgICAgICAgICAgIGxhYmVsPSJQYXNzd29yZCIKICAgICAgICAgICAgaXNQYXNzd29yZEJvb2wKICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7Ik1pbmltdW0gOCBjaGFyYWN0ZXJzIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3gKICAgICAgICAgICAgLnJlcXVpcmVkPSR7dHJ1ZX0KICAgICAgICAgICAga2V5PSJ0ZXJtcyIKICAgICAgICAgICAgbGFiZWw9IkkgYWdyZWUgdG8gdGhlIFRlcm1zIGFuZCBDb25kaXRpb25zIgogICAgICAgICAgPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3gKICAgICAgICAgICAga2V5PSJuZXdzbGV0dGVyIgogICAgICAgICAgICBsYWJlbD0iU2VuZCBtZSBwcm9tb3Rpb25hbCBlbWFpbHMiCiAgICAgICAgICAgIC52YWx1ZT0ke3RydWV9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdD5DcmVhdGUgQWNjb3VudDwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLW91dHB1dCI+CiAgICAgICAgICA8ZW0+U3VibWl0IHRoZSBmb3JtIHRvIHNlZSB0aGUgY29sbGVjdGVkIGRhdGEuLi48L2VtPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgICAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgZm9ybSA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1mb3JtIik7CiAgaWYgKGZvcm0pIHsKICAgIGNvbnNvbGUubG9nKCJIb3Jpem9udGFsIGZvcm0gbGF5b3V0IGFjdGl2ZSIpOwogICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCJmb3JtRGF0YSIsIChldmVudCkgPT4gewogICAgICBjb25zdCBmaWx0ZXJzID0gZXZlbnQuZGV0YWlsLmRhdGE7CiAgICAgIGNvbnNvbGUubG9nKCJGaWx0ZXIgYXBwbGllZDoiLCBmaWx0ZXJzKTsKICAgICAgY29uc3QgcmVzdWx0c0NvdW50ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwKSArIDE7CiAgICAgIGNvbnNvbGUubG9nKGBGb3VuZCAke3Jlc3VsdHNDb3VudH0gcmVzdWx0cyB3aXRoIGZpbHRlcnM6YCwgZmlsdGVycyk7CiAgICB9KTsKICAgIGNvbnN0IGlucHV0cyA9IGZvcm0ucXVlcnlTZWxlY3RvckFsbCgiW2tleV0iKTsKICAgIGlucHV0cy5mb3JFYWNoKChpbnB1dCkgPT4gewogICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VTdWJqZWN0IiwgYXN5bmMgKCkgPT4gewogICAgICAgIGNvbnN0IGZvcm1EYXRhID0gYXdhaXQgZm9ybS5jb2xsZWN0Rm9ybURhdGEoKTsKICAgICAgICBjb25zb2xlLmxvZygiTGl2ZSBmaWx0ZXIgdXBkYXRlOiIsIGZvcm1EYXRhKTsKICAgICAgfSk7CiAgICB9KTsKICB9Cn19PgogICAgICA8ZGVlcy1wYW5lbCAuaGVhZGluZz0iSG9yaXpvbnRhbCBGb3JtIExheW91dCIgLmRlc2NyaXB0aW9uPSJDb21wYWN0IGZvcm0gd2l0aCBpbnB1dHMgYXJyYW5nZWQgaG9yaXpvbnRhbGx5IC0gcGVyZmVjdCBmb3IgZmlsdGVycyBhbmQgcXVpY2sgZm9ybXMiPgogICAgICAgIDxkZWVzLWZvcm0gaG9yaXpvbnRhbC1sYXlvdXQ+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IAogICAgICAgICAgICBrZXk9InNlYXJjaCIgCiAgICAgICAgICAgIGxhYmVsPSJTZWFyY2giCiAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJFbnRlciBrZXl3b3Jkcy4uLiIKICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtZHJvcGRvd24KICAgICAgICAgICAga2V5PSJjYXRlZ29yeSIKICAgICAgICAgICAgLmxhYmVsPSR7IkNhdGVnb3J5In0KICAgICAgICAgICAgLmVuYWJsZVNlYXJjaD0ke2ZhbHNlfQogICAgICAgICAgICAub3B0aW9ucz0ke1sKICB7IG9wdGlvbjogIkFsbCIsIGtleTogImFsbCIgfSwKICB7IG9wdGlvbjogIlByb2R1Y3RzIiwga2V5OiAicHJvZHVjdHMiIH0sCiAgeyBvcHRpb246ICJTZXJ2aWNlcyIsIGtleTogInNlcnZpY2VzIiB9LAogIHsgb3B0aW9uOiAiU3VwcG9ydCIsIGtleTogInN1cHBvcnQiIH0KXX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtZHJvcGRvd24+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAgIGtleT0ic29ydCIKICAgICAgICAgICAgLmxhYmVsPSR7IlNvcnQgQnkifQogICAgICAgICAgICAuZW5hYmxlU2VhcmNoPSR7ZmFsc2V9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WwogIHsgb3B0aW9uOiAiTmV3ZXN0Iiwga2V5OiAibmV3ZXN0IiB9LAogIHsgb3B0aW9uOiAiUG9wdWxhciIsIGtleTogInBvcHVsYXIiIH0sCiAgeyBvcHRpb246ICJQcmljZTogTG93IHRvIEhpZ2giLCBrZXk6ICJwcmljZV9hc2MiIH0sCiAgeyBvcHRpb246ICJQcmljZTogSGlnaCB0byBMb3ciLCBrZXk6ICJwcmljZV9kZXNjIiB9Cl19CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWRyb3Bkb3duPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveAogICAgICAgICAgICBrZXk9ImluU3RvY2siCiAgICAgICAgICAgIGxhYmVsPSJJbiBTdG9jayBPbmx5IgogICAgICAgICAgICAudmFsdWU9JHt0cnVlfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgogICAgCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IGZvcm0gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoImRlZXMtZm9ybSIpOwogIGNvbnN0IHN0YXR1c0RpdiA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiI3N0YXR1cy1kaXNwbGF5Iik7CiAgaWYgKGZvcm0pIHsKICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcigiZm9ybURhdGEiLCBhc3luYyAoZXZlbnRBcmcpID0+IHsKICAgICAgY29uc3QgZGF0YSA9IGV2ZW50QXJnLmRldGFpbC5kYXRhOwogICAgICBjb25zb2xlLmxvZygiQWR2YW5jZWQgZm9ybSBkYXRhOiIsIGRhdGEpOwogICAgICBmb3JtLnNldFN0YXR1cygicGVuZGluZyIsICJWYWxpZGF0aW5nIHlvdXIgaW5mb3JtYXRpb24uLi4iKTsKICAgICAgYXdhaXQgZGlzdF90c19leHBvcnRzMjUucGx1Z2lucy5zbWFydGRlbGF5LmRlbGF5Rm9yKDE1MDApOwogICAgICBpZiAoZGF0YS5pYmFuICYmIGRhdGEuaWJhbi5sZW5ndGggPiAxNSkgewogICAgICAgIGZvcm0uc2V0U3RhdHVzKCJzdWNjZXNzIiwgIkFwcGxpY2F0aW9uIHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHkhIik7CiAgICAgICAgaWYgKHN0YXR1c0RpdikgewogICAgICAgICAgc3RhdHVzRGl2LmNsYXNzTmFtZSA9ICJzdGF0dXMtbWVzc2FnZSBzdWNjZXNzIjsKICAgICAgICAgIHN0YXR1c0Rpdi50ZXh0Q29udGVudCA9ICJcdTI3MTMgWW91ciBhcHBsaWNhdGlvbiBoYXMgYmVlbiBzdWJtaXR0ZWQuIFdlIHdpbGwgY29udGFjdCB5b3Ugc29vbi4iOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBmb3JtLnNldFN0YXR1cygiZXJyb3IiLCAiUGxlYXNlIGNoZWNrIHlvdXIgSUJBTiIpOwogICAgICAgIGlmIChzdGF0dXNEaXYpIHsKICAgICAgICAgIHN0YXR1c0Rpdi5jbGFzc05hbWUgPSAic3RhdHVzLW1lc3NhZ2UgZXJyb3IiOwogICAgICAgICAgc3RhdHVzRGl2LnRleHRDb250ZW50ID0gIlx1MjcxNyBJbnZhbGlkIElCQU4gZm9ybWF0LiBQbGVhc2UgY2hlY2sgYW5kIHRyeSBhZ2Fpbi4iOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zb2xlLmxvZygiRm9ybSBkYXRhIGxvZ2dlZDoiLCBkYXRhKTsKICAgIH0pOwogICAgY29uc3QgZmlsZVVwbG9hZCA9IGZvcm0ucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC1maWxldXBsb2FkIik7CiAgICBpZiAoZmlsZVVwbG9hZCkgewogICAgICBmaWxlVXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIChldmVudCkgPT4gewogICAgICAgIGNvbnN0IGZpbGVzID0gZXZlbnQuZGV0YWlsPy5maWxlcyB8fCBbXTsKICAgICAgICBjb25zb2xlLmxvZyhgJHtmaWxlcy5sZW5ndGh9IGZpbGUocykgc2VsZWN0ZWQgZm9yIHVwbG9hZGApOwogICAgICB9KTsKICAgIH0KICB9Cn19PgogICAgICA8ZGVlcy1wYW5lbCAuaGVhZGluZz0iQWR2YW5jZWQgRm9ybSBGZWF0dXJlcyIgLmRlc2NyaXB0aW9uPSJGb3JtIHdpdGggc3BlY2lhbGl6ZWQgaW5wdXQgdHlwZXMgYW5kIGNvbXBsZXggdmFsaWRhdGlvbiI+CiAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgIDxkZWVzLWlucHV0LWliYW4gCiAgICAgICAgICAgIGtleT0iaWJhbiIKICAgICAgICAgICAgbGFiZWw9IklCQU4iCiAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWliYW4+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LXBob25lCiAgICAgICAgICAgIGtleT0icGhvbmUiCiAgICAgICAgICAgIGxhYmVsPSJQaG9uZSBOdW1iZXIiCiAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXBob25lPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZQogICAgICAgICAgICBrZXk9InByZWZlcmVuY2VzIgogICAgICAgICAgICAubGFiZWw9JHsiTm90aWZpY2F0aW9uIFByZWZlcmVuY2VzIn0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbIkVtYWlsIiwgIlNNUyIsICJQdXNoIiwgIkluLUFwcCJdfQogICAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiRW1haWwifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZT4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtbXVsdGlzZWxlY3QKICAgICAgICAgICAga2V5PSJpbnRlcmVzdHMiCiAgICAgICAgICAgIC5sYWJlbD0keyJBcmVhcyBvZiBJbnRlcmVzdCJ9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WwogIHsgb3B0aW9uOiAiVGVjaG5vbG9neSIsIGtleTogInRlY2giIH0sCiAgeyBvcHRpb246ICJEZXNpZ24iLCBrZXk6ICJkZXNpZ24iIH0sCiAgeyBvcHRpb246ICJCdXNpbmVzcyIsIGtleTogImJ1c2luZXNzIiB9LAogIHsgb3B0aW9uOiAiTWFya2V0aW5nIiwga2V5OiAibWFya2V0aW5nIiB9LAogIHsgb3B0aW9uOiAiU2FsZXMiLCBrZXk6ICJzYWxlcyIgfQpdfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1tdWx0aXNlbGVjdD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtZmlsZXVwbG9hZAogICAgICAgICAgICBrZXk9ImRvY3VtZW50cyIKICAgICAgICAgICAgLmxhYmVsPSR7IlVwbG9hZCBEb2N1bWVudHMifQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiUERGLCBET0MsIG9yIERPQ1ggZmlsZXMgdXAgdG8gMTBNQiJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWZpbGV1cGxvYWQ+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWZvcm0tc3VibWl0PlN1Ym1pdCBBcHBsaWNhdGlvbjwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgICAKICAgICAgICA8ZGl2IGlkPSJzdGF0dXMtZGlzcGxheSI+PC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1mb3JtL2RlZXMtZm9ybS9kZWVzLWZvcm0uanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF9kaXN0X3RzMjUoKTsKdmFyIF9fZXNEZWNvcmF0ZTMzID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMzNCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRk9STV9JTlBVVF9UWVBFUyA9IFsKICBEZWVzSW5wdXRDaGVja2JveCwKICBEZWVzSW5wdXRDb2RlLAogIERlZXNJbnB1dERhdGVwaWNrZXIsCiAgRGVlc0lucHV0RHJvcGRvd24sCiAgRGVlc0lucHV0RmlsZXVwbG9hZCwKICBEZWVzSW5wdXRJYmFuLAogIERlZXNJbnB1dE11bHRpdG9nZ2xlLAogIERlZXNJbnB1dFBob25lLAogIERlZXNJbnB1dFF1YW50aXR5U2VsZWN0b3IsCiAgRGVlc0lucHV0UmFkaW9ncm91cCwKICBEZWVzSW5wdXRUZXh0LAogIERlZXNJbnB1dFRvZ2dsZSwKICBEZWVzSW5wdXRUeXBlbGlzdCwKICBEZWVzVGFibGUKXTsKdmFyIERlZXNGb3JtID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1mb3JtIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfaG9yaXpvbnRhbExheW91dF9kZWNvcmF0b3JzOwogIGxldCBfaG9yaXpvbnRhbExheW91dF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2hvcml6b250YWxMYXlvdXRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0Zvcm0yID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfaG9yaXpvbnRhbExheW91dF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSwgYXR0cmlidXRlOiAiaG9yaXpvbnRhbC1sYXlvdXQiIH0pXTsKICAgICAgX19lc0RlY29yYXRlMzModGhpcywgbnVsbCwgX2hvcml6b250YWxMYXlvdXRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaG9yaXpvbnRhbExheW91dCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaG9yaXpvbnRhbExheW91dCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5ob3Jpem9udGFsTGF5b3V0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5ob3Jpem9udGFsTGF5b3V0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2hvcml6b250YWxMYXlvdXRfaW5pdGlhbGl6ZXJzLCBfaG9yaXpvbnRhbExheW91dF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMzKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0Zvcm0yID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMyNTsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJGb3JtIl07CiAgICBuYW1lID0gIm15Zm9ybSI7CiAgICBjaGFuZ2VTdWJqZWN0ID0gbmV3IGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cy5zbWFydHJ4LnJ4anMuU3ViamVjdCgpOwogICAgcmVhZHlEZWZlcnJlZCA9IGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cy5zbWFydHByb21pc2UuZGVmZXIoKTsKICAgICNob3Jpem9udGFsTGF5b3V0X2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczM0KHRoaXMsIF9ob3Jpem9udGFsTGF5b3V0X2luaXRpYWxpemVycywgZmFsc2UpOwogICAgLyoqCiAgICAgKiBDb250cm9scyB0aGUgbGF5b3V0IG1vZGUgb2YgY2hpbGQgaW5wdXQgY29tcG9uZW50cwogICAgICogV2hlbiB0cnVlLCBzZXRzIGFsbCBjaGlsZCBpbnB1dHMgdG8gaG9yaXpvbnRhbCBsYXlvdXQKICAgICAqLwogICAgZ2V0IGhvcml6b250YWxMYXlvdXQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNob3Jpem9udGFsTGF5b3V0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaG9yaXpvbnRhbExheW91dCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaG9yaXpvbnRhbExheW91dF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxzdHlsZT4KICAgICAgICA6aG9zdCB7CiAgICAgICAgICBkaXNwbGF5OiBjb250ZW50czsKICAgICAgICB9CiAgICAgIDwvc3R5bGU+CiAgICAgIDxzbG90Pjwvc2xvdD4KICAgIGA7CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIGNvbnN0IGZvcm1DaGlsZHJlbiA9IHRoaXMuZ2V0Rm9ybUVsZW1lbnRzKCk7CiAgICAgIHRoaXMudXBkYXRlUmVxdWlyZWRTdGF0dXMoKTsKICAgICAgdGhpcy51cGRhdGVDaGlsZHJlbkxheW91dE1vZGUoKTsKICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBmb3JtQ2hpbGRyZW4pIHsKICAgICAgICBjaGlsZC5jaGFuZ2VTdWJqZWN0LnN1YnNjcmliZShhc3luYyAoKSA9PiB7CiAgICAgICAgICBjb25zdCB2YWx1ZU9iamVjdCA9IGF3YWl0IHRoaXMuY29sbGVjdEZvcm1EYXRhKCk7CiAgICAgICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh2YWx1ZU9iamVjdCk7CiAgICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZU9iamVjdCk7CiAgICAgICAgICB0aGlzLnVwZGF0ZVJlcXVpcmVkU3RhdHVzKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgYXdhaXQgdGhpcy5hZGRCZWhhdmlvdXJzKCk7CiAgICAgIHRoaXMucmVhZHlEZWZlcnJlZC5yZXNvbHZlKCk7CiAgICB9CiAgICBnZXRGb3JtRWxlbWVudHMoKSB7CiAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pLmZpbHRlcigoY2hpbGQpID0+IEZPUk1fSU5QVVRfVFlQRVMuaW5jbHVkZXMoY2hpbGQuY29uc3RydWN0b3IpKTsKICAgIH0KICAgIGdldFN1Ym1pdEJ1dHRvbigpIHsKICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbikuZmluZCgoY2hpbGQpID0+IGNoaWxkIGluc3RhbmNlb2YgRGVlc0Zvcm1TdWJtaXQpOwogICAgfQogICAgYXN5bmMgdXBkYXRlUmVxdWlyZWRTdGF0dXMoKSB7CiAgICAgIGNvbnNvbGUubG9nKCJjaGVja2luZyB0aGUgcmVxdWlyZWQgc3RhdHVzLiIpOwogICAgICBsZXQgcmVxdWlyZWRPSyA9IHRydWU7CiAgICAgIGZvciAoY29uc3QgY2hpbGRBcmcgb2YgdGhpcy5nZXRGb3JtRWxlbWVudHMoKSkgewogICAgICAgIGlmIChjaGlsZEFyZy5yZXF1aXJlZCAmJiAhY2hpbGRBcmcudmFsdWUpIHsKICAgICAgICAgIHJlcXVpcmVkT0sgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRoaXMuZ2V0U3VibWl0QnV0dG9uKCkpIHsKICAgICAgICB0aGlzLmdldFN1Ym1pdEJ1dHRvbigpLmRpc2FibGVkID0gIXJlcXVpcmVkT0s7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogY29sbGVjdHMgdGhlIGZvcm0gZGF0YQogICAgICogQHJldHVybnMKICAgICAqLwogICAgYXN5bmMgY29sbGVjdEZvcm1EYXRhKCkgewogICAgICBjb25zdCBjaGlsZHJlbjIgPSB0aGlzLmdldEZvcm1FbGVtZW50cygpOwogICAgICBjb25zdCB2YWx1ZU9iamVjdCA9IHt9OwogICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuMikgewogICAgICAgIGlmICghY2hpbGQua2V5KSB7CiAgICAgICAgICBjb25zb2xlLmxvZyhgZm9ybSBlbGVtZW50IHdpdGggbGFiZWwgIiR7Y2hpbGQubGFiZWx9IiBoYXMgbm8ga2V5LiBza2lwcGluZy5gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB2YWx1ZU9iamVjdFtjaGlsZC5rZXldID0gY2hpbGQudmFsdWU7CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlT2JqZWN0OwogICAgfQogICAgYXN5bmMgZ2F0aGVyQW5kRGlzcGF0Y2goKSB7CiAgICAgIGNvbnN0IHZhbHVlT2JqZWN0ID0gYXdhaXQgdGhpcy5jb2xsZWN0Rm9ybURhdGEoKTsKICAgICAgY29uc3QgZm9ybURhdGFFdmVudCA9IG5ldyBDdXN0b21FdmVudCgiZm9ybURhdGEiLCB7CiAgICAgICAgZGV0YWlsOiB7CiAgICAgICAgICBkYXRhOiB2YWx1ZU9iamVjdAogICAgICAgIH0sCiAgICAgICAgYnViYmxlczogdHJ1ZQogICAgICB9KTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGZvcm1EYXRhRXZlbnQpOwogICAgICBjb25zb2xlLmxvZygiZGlzcGF0Y2hlZCBkYXRhOiIpOwogICAgICBjb25zb2xlLmxvZyh2YWx1ZU9iamVjdCk7CiAgICB9CiAgICBzZXRTdGF0dXModmlzdWFsU3RhdGVBcmcsIHRleHRTdGF0ZUFyZykgewogICAgICBjb25zdCBpbnB1dENoaWxkcmVuID0gdGhpcy5nZXRGb3JtRWxlbWVudHMoKTsKICAgICAgY29uc3Qgc3VibWl0QnV0dG9uID0gdGhpcy5nZXRTdWJtaXRCdXR0b24oKTsKICAgICAgc3dpdGNoICh2aXN1YWxTdGF0ZUFyZykgewogICAgICAgIGNhc2UgIm5vcm1hbCI6CiAgICAgICAgICBzdWJtaXRCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgIHN1Ym1pdEJ1dHRvbi5zdGF0dXMgPSAibm9ybWFsIjsKICAgICAgICAgIGZvciAoY29uc3QgaW5wdXRDaGlsZCBvZiBpbnB1dENoaWxkcmVuKSB7CiAgICAgICAgICAgIGlucHV0Q2hpbGQuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInBlbmRpbmciOgogICAgICAgICAgc3VibWl0QnV0dG9uLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgIHN1Ym1pdEJ1dHRvbi5zdGF0dXMgPSAicGVuZGluZyI7CiAgICAgICAgICBmb3IgKGNvbnN0IGlucHV0Q2hpbGQgb2YgaW5wdXRDaGlsZHJlbikgewogICAgICAgICAgICBpbnB1dENoaWxkLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInN1Y2Nlc3MiOgogICAgICAgICAgc3VibWl0QnV0dG9uLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgIHN1Ym1pdEJ1dHRvbi5zdGF0dXMgPSAic3VjY2VzcyI7CiAgICAgICAgICBmb3IgKGNvbnN0IGlucHV0Q2hpbGQgb2YgaW5wdXRDaGlsZHJlbikgewogICAgICAgICAgICBpbnB1dENoaWxkLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImVycm9yIjoKICAgICAgICAgIHN1Ym1pdEJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICBzdWJtaXRCdXR0b24uc3RhdHVzID0gImVycm9yIjsKICAgICAgICAgIGZvciAoY29uc3QgaW5wdXRDaGlsZCBvZiBpbnB1dENoaWxkcmVuKSB7CiAgICAgICAgICAgIGlucHV0Q2hpbGQuZGlzYWJsZWQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgc3VibWl0QnV0dG9uLnRleHQgPSB0ZXh0U3RhdGVBcmc7CiAgICB9CiAgICAvKioKICAgICAqIHJlc2V0cyB0aGUgZm9ybQogICAgICovCiAgICByZXNldCgpIHsKICAgICAgY29uc3QgaW5wdXRDaGlsZHJlbiA9IHRoaXMuZ2V0Rm9ybUVsZW1lbnRzKCk7CiAgICAgIGNvbnN0IHN1Ym1pdEJ1dHRvbiA9IHRoaXMuZ2V0U3VibWl0QnV0dG9uKCk7CiAgICAgIGZvciAoY29uc3QgaW5wdXRDaGlsZCBvZiBpbnB1dENoaWxkcmVuKSB7CiAgICAgICAgaW5wdXRDaGlsZC52YWx1ZSA9IG51bGw7CiAgICAgIH0KICAgICAgdGhpcy5zZXRTdGF0dXMoIm5vcm1hbCIsICJTdWJtaXQiKTsKICAgIH0KICAgIGFzeW5jIGFkZEJlaGF2aW91cnMoKSB7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIChldmVudCkgPT4gewogICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDsKICAgICAgICBpZiAoIUZPUk1fSU5QVVRfVFlQRVMuaW5jbHVkZXModGFyZ2V0LmNvbnN0cnVjdG9yKSkKICAgICAgICAgIHJldHVybjsKICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAiRW50ZXIiKSB7CiAgICAgICAgICBjb25zdCBjaGlsZHJlbjIgPSB0aGlzLmdldEZvcm1FbGVtZW50cygpOwogICAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gY2hpbGRyZW4yLmluZGV4T2YodGFyZ2V0KTsKICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPCBjaGlsZHJlbjIubGVuZ3RoIC0gMSkgewogICAgICAgICAgICBjaGlsZHJlbjJbY3VycmVudEluZGV4ICsgMV0uZm9jdXMoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRhcmdldC5ibHVyKCk7CiAgICAgICAgICAgIHRoaXMuZ2V0U3VibWl0QnV0dG9uKCk/LmZvY3VzKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlcyB0aGUgbGF5b3V0IG1vZGUgb2YgY2hpbGQgaW5wdXQgY29tcG9uZW50cyBiYXNlZCBvbiBmb3JtJ3MgaG9yaXpvbnRhbExheW91dCBwcm9wZXJ0eQogICAgICovCiAgICB1cGRhdGVDaGlsZHJlbkxheW91dE1vZGUoKSB7CiAgICAgIGNvbnN0IGZvcm1DaGlsZHJlbiA9IHRoaXMuZ2V0Rm9ybUVsZW1lbnRzKCk7CiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZm9ybUNoaWxkcmVuKSB7CiAgICAgICAgaWYgKCJsYXlvdXRNb2RlIiBpbiBjaGlsZCkgewogICAgICAgICAgY2hpbGQubGF5b3V0TW9kZSA9ICJhdXRvIjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ2FsbGVkIHdoZW4gcHJvcGVydGllcyBjaGFuZ2UKICAgICAqLwogICAgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgICBzdXBlci51cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygiaG9yaXpvbnRhbExheW91dCIpKSB7CiAgICAgICAgdGhpcy51cGRhdGVDaGlsZHJlbkxheW91dE1vZGUoKTsKICAgICAgfQogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMzQodGhpcywgX2hvcml6b250YWxMYXlvdXRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnMzNChfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0Zvcm0yID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1idXR0b24vZGVlcy1idXR0b24vZGVlcy1idXR0b24uZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2RlZXNfaWNvbigpOwp2YXIgZGVtb0Z1bmMyNiA9ICgpID0+IGIyYAogIDxzdHlsZT4KICAgICR7aWAKICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMjAwcHg7CiAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgIH0KICAgICAgCiAgICAgIGRlZXMtcGFuZWwgewogICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIGRlZXMtcGFuZWw6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgfQogICAgICAKICAgICAgLmJ1dHRvbi1ncm91cCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTJweDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KICAgICAgCiAgICAgIC52ZXJ0aWNhbC1ncm91cCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIG1heC13aWR0aDogMzAwcHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5ob3Jpem9udGFsLWdyb3VwIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQogICAgICAKICAgICAgLmRlbW8tb3V0cHV0IHsKICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMjE1IDIwLjIlIDE2LjglKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDguOCUpIiwgImhzbCgyMTAgNDAlIDk4JSkiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5pY29uLXJvdyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTJweDsKICAgICAgICBtYXJnaW46IDhweCAwOwogICAgICB9CiAgICAgIAogICAgICAuY29kZS1zbmlwcGV0IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTEuOCUpIil9OwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWFyZ2luOiA0cHggMDsKICAgICAgfQogICAgYH0KICA8L3N0eWxlPgogIAogIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgYnV0dG9ucyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1idXR0b24iKTsKICBidXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4gewogICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrZWQiLCAoKSA9PiB7CiAgICAgIGNvbnN0IHR5cGU1ID0gYnV0dG9uLmdldEF0dHJpYnV0ZSgidHlwZSIpIHx8ICJkZWZhdWx0IjsKICAgICAgY29uc29sZS5sb2coYEJ1dHRvbiB2YXJpYW50IGNsaWNrZWQ6ICR7dHlwZTV9YCk7CiAgICB9KTsKICB9KTsKfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyIxLiBCdXR0b24gVmFyaWFudHMifSAuc3VidGl0bGU9JHsiRGlmZmVyZW50IHZpc3VhbCBzdHlsZXMgZm9yIHZhcmlvdXMgdXNlIGNhc2VzIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9uLWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJkZWZhdWx0Ij5EZWZhdWx0PC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJzZWNvbmRhcnkiPlNlY29uZGFyeTwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iZGVzdHJ1Y3RpdmUiPkRlc3RydWN0aXZlPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJvdXRsaW5lIj5PdXRsaW5lPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJnaG9zdCI+R2hvc3Q8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9ImxpbmsiPkxpbmsgQnV0dG9uPC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgogICAgCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IGJ1dHRvbnMgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3JBbGwoImRlZXMtYnV0dG9uIik7CiAgYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHsKICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGlja2VkIiwgKCkgPT4gewogICAgICBjb25zdCBzaXplID0gYnV0dG9uLmdldEF0dHJpYnV0ZSgic2l6ZSIpIHx8ICJkZWZhdWx0IjsKICAgICAgY29uc29sZS5sb2coYEJ1dHRvbiBzaXplOiAke3NpemV9YCk7CiAgICB9KTsKICB9KTsKfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyIyLiBCdXR0b24gU2l6ZXMifSAuc3VidGl0bGU9JHsiTXVsdGlwbGUgc2l6ZXMgZm9yIGRpZmZlcmVudCBjb250ZXh0cyBhbmQgdXNlIGNhc2VzIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9uLWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBzaXplPSJzbSI+U21hbGwgQnV0dG9uPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBzaXplPSJkZWZhdWx0Ij5EZWZhdWx0IFNpemU8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHNpemU9ImxnIj5MYXJnZSBCdXR0b248L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHNpemU9Imljb24iIHR5cGU9Im91dGxpbmUiIC50ZXh0PSR7Ilx1ezFGNjgwfSJ9PjwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9uLWdyb3VwIiBzdHlsZT0ibWFyZ2luLXRvcDogMTZweDsiPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHNpemU9InNtIiB0eXBlPSJzZWNvbmRhcnkiPlNtYWxsIFNlY29uZGFyeTwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gc2l6ZT0iZGVmYXVsdCIgdHlwZT0iZGVzdHJ1Y3RpdmUiPkRlZmF1bHQgRGVzdHJ1Y3RpdmU8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHNpemU9ImxnIiB0eXBlPSJvdXRsaW5lIj5MYXJnZSBPdXRsaW5lPC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgogICAgCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IGljb25CdXR0b25zID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yQWxsKCJkZWVzLWJ1dHRvbiIpOwogIGljb25CdXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4gewogICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrZWQiLCAoKSA9PiB7CiAgICAgIGNvbnN0IGhhc0ljb24gPSBidXR0b24ucXVlcnlTZWxlY3RvcigiZGVlcy1pY29uIik7CiAgICAgIGlmIChoYXNJY29uKSB7CiAgICAgICAgY29uc3QgaWNvbk5hbWUgPSBoYXNJY29uLmdldEF0dHJpYnV0ZSgiaWNvbkZBIikgfHwgInVua25vd24iOwogICAgICAgIGNvbnNvbGUubG9nKGBJY29uIGJ1dHRvbiBjbGlja2VkOiAke2ljb25OYW1lfWApOwogICAgICB9CiAgICB9KTsKICB9KTsKfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyIzLiBCdXR0b25zIHdpdGggSWNvbnMifSAuc3VidGl0bGU9JHsiQ29tYmluaW5nIGljb25zIHdpdGggdGV4dCBmb3IgZW5oYW5jZWQgdmlzdWFsIGNvbW11bmljYXRpb24ifT4KICAgICAgICA8ZGl2IGNsYXNzPSJpY29uLXJvdyI+CiAgICAgICAgICA8ZGVlcy1idXR0b24+CiAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0iZmE6cGx1cyI+PC9kZWVzLWljb24+CiAgICAgICAgICAgIEFkZCBJdGVtCiAgICAgICAgICA8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9ImRlc3RydWN0aXZlIj4KICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJmYTp0cmFzaCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgIERlbGV0ZQogICAgICAgICAgPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJvdXRsaW5lIj4KICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6RG93bmxvYWQiPjwvZGVlcy1pY29uPgogICAgICAgICAgICBEb3dubG9hZAogICAgICAgICAgPC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iaWNvbi1yb3ciPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9InNlY29uZGFyeSIgc2l6ZT0ic20iPgogICAgICAgICAgICA8ZGVlcy1pY29uIGljb249ImZhOmdlYXIiPjwvZGVlcy1pY29uPgogICAgICAgICAgICBTZXR0aW5ncwogICAgICAgICAgPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJnaG9zdCI+CiAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0iZmE6Y2FyZXRMZWZ0Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgQmFjawogICAgICAgICAgPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJnaG9zdCI+CiAgICAgICAgICAgIE5leHQKICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJmYTpjYXJldFJpZ2h0Ij48L2RlZXMtaWNvbj4KICAgICAgICAgIDwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9Imljb24tcm93Ij4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBzaXplPSJpY29uIiB0eXBlPSJkZWZhdWx0Ij4KICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJmYTpwbHVzIj48L2RlZXMtaWNvbj4KICAgICAgICAgIDwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gc2l6ZT0iaWNvbiIgdHlwZT0ic2Vjb25kYXJ5Ij4KICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJmYTpnZWFyIj48L2RlZXMtaWNvbj4KICAgICAgICAgIDwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gc2l6ZT0iaWNvbiIgdHlwZT0ib3V0bGluZSI+CiAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOlNlYXJjaCI+PC9kZWVzLWljb24+CiAgICAgICAgICA8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHNpemU9Imljb24iIHR5cGU9Imdob3N0Ij4KICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6TW9yZVZlcnRpY2FsIj48L2RlZXMtaWNvbj4KICAgICAgICAgIDwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gc2l6ZT0iaWNvbiIgdHlwZT0iZGVzdHJ1Y3RpdmUiPgogICAgICAgICAgICA8ZGVlcy1pY29uIGljb249ImZhOnRyYXNoIj48L2RlZXMtaWNvbj4KICAgICAgICAgIDwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IGJ1dHRvbnMgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3JBbGwoImRlZXMtYnV0dG9uIik7CiAgYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHsKICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGlja2VkIiwgKCkgPT4gewogICAgICBjb25zdCBpY29uMyA9IGJ1dHRvbi5nZXRBdHRyaWJ1dGUoImljb24iKSB8fCAibm9uZSI7CiAgICAgIGNvbnN0IHBvc2l0aW9uMyA9IGJ1dHRvbi5nZXRBdHRyaWJ1dGUoImljb25Qb3NpdGlvbiIpIHx8ICJsZWZ0IjsKICAgICAgY29uc29sZS5sb2coYEljb24gcHJvcGVydHkgYnV0dG9uOiBpY29uPSR7aWNvbjN9LCBwb3NpdGlvbj0ke3Bvc2l0aW9uM31gKTsKICAgIH0pOwogIH0pOwp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjQuIEljb25zIHZpYSBQcm9wZXJ0eSJ9IC5zdWJ0aXRsZT0keyJTaW1wbGlmaWVkIGljb24gc3ludGF4IHVzaW5nIHRoZSBpY29uIHByb3BlcnR5In0+CiAgICAgICAgPGRpdiBjbGFzcz0iaWNvbi1yb3ciPgogICAgICAgICAgPGRlZXMtYnV0dG9uIGljb249ImZhOnBsdXMiPkFkZCBJdGVtPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJkZXN0cnVjdGl2ZSIgaWNvbj0iZmE6dHJhc2giPkRlbGV0ZTwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0ib3V0bGluZSIgaWNvbj0ibHVjaWRlOkRvd25sb2FkIj5Eb3dubG9hZDwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9Imljb24tcm93Ij4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJzZWNvbmRhcnkiIHNpemU9InNtIiBpY29uPSJmYTpnZWFyIj5TZXR0aW5nczwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iZ2hvc3QiIGljb249ImZhOmNhcmV0TGVmdCI+QmFjazwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iZ2hvc3QiIGljb249ImZhOmNhcmV0UmlnaHQiIGljb25Qb3NpdGlvbj0icmlnaHQiPk5leHQ8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJpY29uLXJvdyI+CiAgICAgICAgICA8ZGVlcy1idXR0b24gc2l6ZT0iaWNvbiIgdHlwZT0iZGVmYXVsdCIgaWNvbj0iZmE6cGx1cyI+PC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBzaXplPSJpY29uIiB0eXBlPSJzZWNvbmRhcnkiIGljb249Imx1Y2lkZTpTZXR0aW5ncyI+PC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBzaXplPSJpY29uIiB0eXBlPSJvdXRsaW5lIiBpY29uPSJsdWNpZGU6U2VhcmNoIj48L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHNpemU9Imljb24iIHR5cGU9Imdob3N0IiBpY29uPSJsdWNpZGU6TW9yZVZlcnRpY2FsIj48L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHNpemU9Imljb24iIHR5cGU9ImRlc3RydWN0aXZlIiBpY29uPSJmYTp0cmFzaCI+PC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDogMTZweDsiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1zbmlwcGV0Ij4KICAgICAgICAgICAgJmx0O2RlZXMtYnV0dG9uIGljb249ImZhOnBsdXMiJmd0O0FkZCBJdGVtJmx0Oy9kZWVzLWJ1dHRvbiZndDs8YnI+CiAgICAgICAgICAgICZsdDtkZWVzLWJ1dHRvbiBpY29uPSJmYTpjYXJldFJpZ2h0IiBpY29uUG9zaXRpb249InJpZ2h0IiZndDtOZXh0Jmx0Oy9kZWVzLWJ1dHRvbiZndDsKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CgogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBwZW5kaW5nQnV0dG9uID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCdkZWVzLWJ1dHRvbltzdGF0dXM9InBlbmRpbmciXScpOwogIGNvbnN0IHN1Y2Nlc3NCdXR0b24gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoJ2RlZXMtYnV0dG9uW3N0YXR1cz0ic3VjY2VzcyJdJyk7CiAgY29uc3QgZXJyb3JCdXR0b24gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoJ2RlZXMtYnV0dG9uW3N0YXR1cz0iZXJyb3IiXScpOwogIGlmIChwZW5kaW5nQnV0dG9uKSB7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgY29uc29sZS5sb2coIlBlbmRpbmcgYnV0dG9uIGlzIHNob3dpbmcgbG9hZGluZyBzdGF0ZSIpOwogICAgfSwgMWUzKTsKICB9CiAgaWYgKHN1Y2Nlc3NCdXR0b24pIHsKICAgIHN1Y2Nlc3NCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2tlZCIsICgpID0+IHsKICAgICAgY29uc29sZS5sb2coIlN1Y2Nlc3Mgc3RhdGUgYnV0dG9uIGNsaWNrZWQiKTsKICAgIH0pOwogIH0KICBpZiAoZXJyb3JCdXR0b24pIHsKICAgIGVycm9yQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrZWQiLCAoKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJFcnJvciBzdGF0ZSBidXR0b24gY2xpY2tlZCIpOwogICAgfSk7CiAgfQp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjUuIEJ1dHRvbiBTdGF0ZXMifSAuc3VidGl0bGU9JHsiRGlmZmVyZW50IHN0YXRlcyB0byBpbmRpY2F0ZSBidXR0b24gc3RhdHVzIGFuZCBsb2FkaW5nIGNvbmRpdGlvbnMifT4KICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JvdXAiPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHN0YXR1cz0ibm9ybWFsIj5Ob3JtYWw8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHN0YXR1cz0icGVuZGluZyI+UHJvY2Vzc2luZy4uLjwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gc3RhdHVzPSJzdWNjZXNzIj5TdWNjZXNzITwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gc3RhdHVzPSJlcnJvciI+RXJyb3IhPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBkaXNhYmxlZD5EaXNhYmxlZDwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9uLWdyb3VwIiBzdHlsZT0ibWFyZ2luLXRvcDogMTZweDsiPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9InNlY29uZGFyeSIgc3RhdHVzPSJwZW5kaW5nIiBzaXplPSJzbSI+U21hbGwgTG9hZGluZzwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0ib3V0bGluZSIgc3RhdHVzPSJwZW5kaW5nIj5EZWZhdWx0IExvYWRpbmc8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9ImRlc3RydWN0aXZlIiBzdGF0dXM9InBlbmRpbmciIHNpemU9ImxnIj5MYXJnZSBMb2FkaW5nPC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgogICAgCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IG91dHB1dCA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiI2NsaWNrLW91dHB1dCIpOwogIGNvbnN0IGNsaWNrTWVCdG4gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoImRlZXMtYnV0dG9uOmZpcnN0LW9mLXR5cGUiKTsKICBjb25zdCBkYXRhQnRuID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCdkZWVzLWJ1dHRvblt0eXBlPSJzZWNvbmRhcnkiXScpOwogIGNvbnN0IGFzeW5jQnRuID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCdkZWVzLWJ1dHRvblt0eXBlPSJkZXN0cnVjdGl2ZSJdJyk7CiAgaWYgKGNsaWNrTWVCdG4gJiYgb3V0cHV0KSB7CiAgICBjbGlja01lQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrZWQiLCAoKSA9PiB7CiAgICAgIG91dHB1dC50ZXh0Q29udGVudCA9IGBDbGlja2VkOiBEZWZhdWx0IGJ1dHRvbiBhdCAkeygvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9Mb2NhbGVUaW1lU3RyaW5nKCl9YDsKICAgIH0pOwogIH0KICBpZiAoZGF0YUJ0biAmJiBvdXRwdXQpIHsKICAgIGRhdGFCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2tlZCIsIChlMTEpID0+IHsKICAgICAgb3V0cHV0LnRleHRDb250ZW50ID0gYENsaWNrZWQ6IFNlY29uZGFyeSBidXR0b24gd2l0aCBkYXRhOiAke2UxMS5kZXRhaWwuZGF0YX1gOwogICAgfSk7CiAgfQogIGlmIChhc3luY0J0biAmJiBvdXRwdXQpIHsKICAgIGFzeW5jQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrZWQiLCBhc3luYyAoKSA9PiB7CiAgICAgIG91dHB1dC50ZXh0Q29udGVudCA9ICJQcm9jZXNzaW5nLi4uIjsKICAgICAgYXdhaXQgZGlzdF90c19leHBvcnRzMjUucGx1Z2lucy5zbWFydGRlbGF5LmRlbGF5Rm9yKDJlMyk7CiAgICAgIG91dHB1dC50ZXh0Q29udGVudCA9ICJBY3Rpb24gY29tcGxldGVkISI7CiAgICB9KTsKICB9Cn19PgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiNi4gRXZlbnQgSGFuZGxpbmcifSAuc3VidGl0bGU9JHsiSW50ZXJhY3RpdmUgZXhhbXBsZXMgd2l0aCBjbGljayBldmVudCBoYW5kbGluZyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbi1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1idXR0b24+Q2xpY2sgTWU8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9InNlY29uZGFyeSIgLmV2ZW50RGV0YWlsRGF0YT0keyJjdXN0b20tZGF0YS0xMjMifT4KICAgICAgICAgICAgQ2xpY2sgd2l0aCBEYXRhCiAgICAgICAgICA8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9ImRlc3RydWN0aXZlIj5Bc3luYyBBY3Rpb248L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICAgIAogICAgICAgIDxkaXYgaWQ9ImNsaWNrLW91dHB1dCIgY2xhc3M9ImRlbW8tb3V0cHV0Ij4KICAgICAgICAgIDxlbT5DbGljayBhIGJ1dHRvbiB0byBzZWUgdGhlIHJlc3VsdC4uLjwvZW0+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICAgIAogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBmb3JtID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCJkZWVzLWZvcm0iKTsKICBjb25zdCBvdXRwdXQgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoIiNmb3JtLW91dHB1dCIpOwogIGlmIChmb3JtICYmIG91dHB1dCkgewogICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCJmb3JtRGF0YSIsIChlMTEpID0+IHsKICAgICAgb3V0cHV0LmlubmVySFRNTCA9ICI8c3Ryb25nPkZvcm0gc3VibWl0dGVkIHdpdGggZGF0YTo8L3N0cm9uZz48YnI+IiArIEpTT04uc3RyaW5naWZ5KGUxMS5kZXRhaWwuZGF0YSwgbnVsbCwgMik7CiAgICB9KTsKICB9CiAgY29uc3QgZHJhZnRCdG4gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoJ2RlZXMtYnV0dG9uW3R5cGU9InNlY29uZGFyeSJdJyk7CiAgY29uc3QgY2FuY2VsQnRuID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCdkZWVzLWJ1dHRvblt0eXBlPSJnaG9zdCJdJyk7CiAgaWYgKGRyYWZ0QnRuKSB7CiAgICBkcmFmdEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGlja2VkIiwgKCkgPT4gewogICAgICBjb25zb2xlLmxvZygiU2F2ZSBEcmFmdCBjbGlja2VkIik7CiAgICB9KTsKICB9CiAgaWYgKGNhbmNlbEJ0bikgewogICAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrZWQiLCAoKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJDYW5jZWwgY2xpY2tlZCIpOwogICAgfSk7CiAgfQp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjcuIEZvcm0gSW50ZWdyYXRpb24ifSAuc3VidGl0bGU9JHsiQnV0dG9ucyB3b3JraW5nIHdpdGhpbiBmb3JtcyB3aXRoIGF1dG9tYXRpYyBzcGFjaW5nIn0+CiAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgbGFiZWw9Ik5hbWUiIGtleT0ibmFtZSIgcmVxdWlyZWQ+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IGxhYmVsPSJFbWFpbCIga2V5PSJlbWFpbCIgdHlwZT0iZW1haWwiIHJlcXVpcmVkPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCBsYWJlbD0iTWVzc2FnZSIga2V5PSJtZXNzYWdlIiBpc011bHRpbGluZT48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9InNlY29uZGFyeSI+U2F2ZSBEcmFmdDwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iZ2hvc3QiPkNhbmNlbDwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdD5TdWJtaXQgRm9ybTwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgICAKICAgICAgICA8ZGl2IGlkPSJmb3JtLW91dHB1dCIgY2xhc3M9ImRlbW8tb3V0cHV0IiBzdHlsZT0id2hpdGUtc3BhY2U6IHByZS13cmFwOyI+CiAgICAgICAgICA8ZW0+U3VibWl0IHRoZSBmb3JtIHRvIHNlZSB0aGUgZGF0YS4uLjwvZW0+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICAgIAogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBidXR0b25zID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yQWxsKCJkZWVzLWJ1dHRvbiIpOwogIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7CiAgICBjb25zdCB0eXBlNSA9IGJ1dHRvbi5nZXRBdHRyaWJ1dGUoInR5cGUiKTsKICAgIGlmICh0eXBlNSkgewogICAgICBjb25zb2xlLmxvZyhgTGVnYWN5IHR5cGUgIiR7dHlwZTV9IiBpcyBzdXBwb3J0ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlgKTsKICAgIH0KICB9KTsKfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI4LiBCYWNrd2FyZCBDb21wYXRpYmlsaXR5In0gLnN1YnRpdGxlPSR7Ik9sZCBidXR0b24gdHlwZXMgYXJlIGF1dG9tYXRpY2FsbHkgbWFwcGVkIHRvIG5ldyB2YXJpYW50cyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbi1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0ibm9ybWFsIj5Ob3JtYWwg4oaSIERlZmF1bHQ8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9ImhpZ2hsaWdodGVkIj5IaWdobGlnaHRlZCDihpIgRGVzdHJ1Y3RpdmU8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9ImRpc2NyZWV0Ij5EaXNjcmVldCDihpIgT3V0bGluZTwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iYmlnIj5CaWcg4oaSIExhcmdlIFNpemU8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICAgIAogICAgICAgIDxwIHN0eWxlPSJtYXJnaW4tdG9wOiAxNnB4OyBmb250LXNpemU6IDE0cHg7IGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDU2LjklKSIsICJoc2woMjE1IDIwLjIlIDU1LjElKSIpfTsiPgogICAgICAgICAgVGhlc2UgbGVnYWN5IHR5cGUgdmFsdWVzIGFyZSBtYWludGFpbmVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGJ1dCB3ZSByZWNvbW1lbmQgdXNpbmcgdGhlIG5ldyB2YXJpYW50IHN5c3RlbS4KICAgICAgICA8L3A+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICAgIAogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBhY3Rpb25Hcm91cCA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiLnZlcnRpY2FsLWdyb3VwIilbMF07CiAgY29uc3QgZGFuZ2VyR3JvdXAgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3JBbGwoIi52ZXJ0aWNhbC1ncm91cCIpWzFdOwogIGlmIChhY3Rpb25Hcm91cCkgewogICAgY29uc3QgYnV0dG9ucyA9IGFjdGlvbkdyb3VwLnF1ZXJ5U2VsZWN0b3JBbGwoImRlZXMtYnV0dG9uIik7CiAgICBidXR0b25zLmZvckVhY2goKGJ1dHRvbiwgaW5kZXgyKSA9PiB7CiAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGlja2VkIiwgKCkgPT4gewogICAgICAgIGNvbnN0IGFjdGlvbiA9IFsiU2F2ZSBDaGFuZ2VzIiwgIkRpc2NhcmQiLCAiSGVscCJdW2luZGV4Ml07CiAgICAgICAgY29uc29sZS5sb2coYEFjdGlvbiBncm91cDogJHthY3Rpb259IGNsaWNrZWRgKTsKICAgICAgfSk7CiAgICB9KTsKICB9CiAgaWYgKGRhbmdlckdyb3VwKSB7CiAgICBjb25zdCBidXR0b25zID0gZGFuZ2VyR3JvdXAucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1idXR0b24iKTsKICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uLCBpbmRleDIpID0+IHsKICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrZWQiLCAoKSA9PiB7CiAgICAgICAgY29uc3QgYWN0aW9uID0gWyJEZWxldGUgQWNjb3VudCIsICJBcmNoaXZlIERhdGEiLCAiTm90IEF2YWlsYWJsZSJdW2luZGV4Ml07CiAgICAgICAgaWYgKGluZGV4MiAhPT0gMikgewogICAgICAgICAgY29uc29sZS5sb2coYERhbmdlciB6b25lOiAke2FjdGlvbn0gY2xpY2tlZGApOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICB9Cn19PgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiOS4gQWR2YW5jZWQgRXhhbXBsZXMifSAuc3VidGl0bGU9JHsiQ29tcGxleCBidXR0b24gY29uZmlndXJhdGlvbnMgYW5kIHJlYWwtd29ybGQgdXNlIGNhc2VzIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iaG9yaXpvbnRhbC1ncm91cCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ2ZXJ0aWNhbC1ncm91cCI+CiAgICAgICAgICAgIDxoNCBzdHlsZT0ibWFyZ2luOiAwIDAgOHB4IDA7IGZvbnQtc2l6ZTogMTRweDsgZm9udC13ZWlnaHQ6IDUwMDsiPkFjdGlvbiBHcm91cDwvaDQ+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJkZWZhdWx0IiBzaXplPSJzbSI+CiAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6U2F2ZSI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgU2F2ZSBDaGFuZ2VzCiAgICAgICAgICAgIDwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJzZWNvbmRhcnkiIHNpemU9InNtIj4KICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpVbmRvMiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgRGlzY2FyZAogICAgICAgICAgICA8L2RlZXMtYnV0dG9uPgogICAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iZ2hvc3QiIHNpemU9InNtIj4KICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpIZWxwQ2lyY2xlIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICBIZWxwCiAgICAgICAgICAgIDwvZGVlcy1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJ2ZXJ0aWNhbC1ncm91cCI+CiAgICAgICAgICAgIDxoNCBzdHlsZT0ibWFyZ2luOiAwIDAgOHB4IDA7IGZvbnQtc2l6ZTogMTRweDsgZm9udC13ZWlnaHQ6IDUwMDsiPkRhbmdlciBab25lPC9oND4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9ImRlc3RydWN0aXZlIiBzaXplPSJzbSI+CiAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJmYTp0cmFzaCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgRGVsZXRlIEFjY291bnQKICAgICAgICAgICAgPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9Im91dGxpbmUiIHNpemU9InNtIj4KICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpBcmNoaXZlIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICBBcmNoaXZlIERhdGEKICAgICAgICAgICAgPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9Imdob3N0IiBzaXplPSJzbSIgZGlzYWJsZWQ+CiAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6QmFuIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICBOb3QgQXZhaWxhYmxlCiAgICAgICAgICAgIDwvZGVlcy1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAyNHB4OyI+CiAgICAgICAgICA8aDQgc3R5bGU9Im1hcmdpbjogMCAwIDhweCAwOyBmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA1MDA7Ij5Db2RlIEV4YW1wbGU6PC9oND4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtc25pcHBldCI+CiAgICAgICAgICAgICZsdDtkZWVzLWJ1dHRvbiB0eXBlPSJkZWZhdWx0IiBzaXplPSJzbSIgaWNvbj0ibHVjaWRlOlNhdmUiIEBjbGlja2VkPSJcJHtoYW5kbGVDbGlja30iJmd0Ozxicj4KICAgICAgICAgICAgJm5ic3A7Jm5ic3A7U2F2ZSBDaGFuZ2VzPGJyPgogICAgICAgICAgICAmbHQ7L2RlZXMtYnV0dG9uJmd0OwogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1idXR0b24vZGVlcy1idXR0b24vZGVlcy1idXR0b24uanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF9kaXN0X3RzMjUoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlMzQgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczM1ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzQnV0dG9uID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1idXR0b24iKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF90ZXh0X2RlY29yYXRvcnM7CiAgbGV0IF90ZXh0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGV4dF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZXZlbnREZXRhaWxEYXRhX2RlY29yYXRvcnM7CiAgbGV0IF9ldmVudERldGFpbERhdGFfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ldmVudERldGFpbERhdGFfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Rpc2FibGVkX2RlY29yYXRvcnM7CiAgbGV0IF9kaXNhYmxlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Rpc2FibGVkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0hpZGRlbl9kZWNvcmF0b3JzOwogIGxldCBfaXNIaWRkZW5faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0hpZGRlbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdHlwZV9kZWNvcmF0b3JzOwogIGxldCBfdHlwZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3R5cGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NpemVfZGVjb3JhdG9yczsKICBsZXQgX3NpemVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaXplX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zdGF0dXNfZGVjb3JhdG9yczsKICBsZXQgX3N0YXR1c19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3N0YXR1c19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW5zaWRlRm9ybV9kZWNvcmF0b3JzOwogIGxldCBfaW5zaWRlRm9ybV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2luc2lkZUZvcm1fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ljb25fZGVjb3JhdG9yczsKICBsZXQgX2ljb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pY29uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pY29uUG9zaXRpb25fZGVjb3JhdG9yczsKICBsZXQgX2ljb25Qb3NpdGlvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ljb25Qb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzQnV0dG9uMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3RleHRfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgcmVmbGVjdDogdHJ1ZSwKICAgICAgICBoYXNDaGFuZ2VkKCkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9KV07CiAgICAgIF9ldmVudERldGFpbERhdGFfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX2Rpc2FibGVkX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgcmVmbGVjdDogdHJ1ZQogICAgICB9KV07CiAgICAgIF9pc0hpZGRlbl9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBCb29sZWFuCiAgICAgIH0pXTsKICAgICAgX3R5cGVfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgIH0pXTsKICAgICAgX3NpemVfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgIH0pXTsKICAgICAgX3N0YXR1c19kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBTdHJpbmcKICAgICAgfSldOwogICAgICBfaW5zaWRlRm9ybV9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgIHJlZmxlY3Q6IHRydWUKICAgICAgfSldOwogICAgICBfaWNvbl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nLCByZWZsZWN0OiB0cnVlIH0pXTsKICAgICAgX2ljb25Qb3NpdGlvbl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nLCByZWZsZWN0OiB0cnVlIH0pXTsKICAgICAgX19lc0RlY29yYXRlMzQodGhpcywgbnVsbCwgX3RleHRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGV4dCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGV4dCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50ZXh0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50ZXh0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3RleHRfaW5pdGlhbGl6ZXJzLCBfdGV4dF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM0KHRoaXMsIG51bGwsIF9ldmVudERldGFpbERhdGFfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZXZlbnREZXRhaWxEYXRhIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJldmVudERldGFpbERhdGEiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZXZlbnREZXRhaWxEYXRhLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5ldmVudERldGFpbERhdGEgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZXZlbnREZXRhaWxEYXRhX2luaXRpYWxpemVycywgX2V2ZW50RGV0YWlsRGF0YV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM0KHRoaXMsIG51bGwsIF9kaXNhYmxlZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkaXNhYmxlZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZGlzYWJsZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZGlzYWJsZWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmRpc2FibGVkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Rpc2FibGVkX2luaXRpYWxpemVycywgX2Rpc2FibGVkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzQodGhpcywgbnVsbCwgX2lzSGlkZGVuX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzSGlkZGVuIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc0hpZGRlbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc0hpZGRlbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNIaWRkZW4gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNIaWRkZW5faW5pdGlhbGl6ZXJzLCBfaXNIaWRkZW5fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzNCh0aGlzLCBudWxsLCBfdHlwZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0eXBlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0eXBlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnR5cGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnR5cGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdHlwZV9pbml0aWFsaXplcnMsIF90eXBlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzQodGhpcywgbnVsbCwgX3NpemVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2l6ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2l6ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaXplLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaXplID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NpemVfaW5pdGlhbGl6ZXJzLCBfc2l6ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM0KHRoaXMsIG51bGwsIF9zdGF0dXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic3RhdHVzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzdGF0dXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc3RhdHVzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zdGF0dXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc3RhdHVzX2luaXRpYWxpemVycywgX3N0YXR1c19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM0KHRoaXMsIG51bGwsIF9pbnNpZGVGb3JtX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImluc2lkZUZvcm0iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImluc2lkZUZvcm0iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaW5zaWRlRm9ybSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaW5zaWRlRm9ybSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pbnNpZGVGb3JtX2luaXRpYWxpemVycywgX2luc2lkZUZvcm1fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzNCh0aGlzLCBudWxsLCBfaWNvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpY29uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpY29uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmljb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmljb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaWNvbl9pbml0aWFsaXplcnMsIF9pY29uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzQodGhpcywgbnVsbCwgX2ljb25Qb3NpdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpY29uUG9zaXRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImljb25Qb3NpdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pY29uUG9zaXRpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmljb25Qb3NpdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pY29uUG9zaXRpb25faW5pdGlhbGl6ZXJzLCBfaWNvblBvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzQobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzQnV0dG9uMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMjY7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiQnV0dG9uIl07CiAgICAjdGV4dF9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMzNSh0aGlzLCBfdGV4dF9pbml0aWFsaXplcnMsIHZvaWQgMCk7CiAgICBnZXQgdGV4dCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RleHRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0ZXh0KHZhbHVlMikgewogICAgICB0aGlzLiN0ZXh0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZXZlbnREZXRhaWxEYXRhX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNSh0aGlzLCBfdGV4dF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzUodGhpcywgX2V2ZW50RGV0YWlsRGF0YV9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgZ2V0IGV2ZW50RGV0YWlsRGF0YSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2V2ZW50RGV0YWlsRGF0YV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGV2ZW50RGV0YWlsRGF0YSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZXZlbnREZXRhaWxEYXRhX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZGlzYWJsZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM1KHRoaXMsIF9ldmVudERldGFpbERhdGFfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM1KHRoaXMsIF9kaXNhYmxlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgZGlzYWJsZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNkaXNhYmxlZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGRpc2FibGVkKHZhbHVlMikgewogICAgICB0aGlzLiNkaXNhYmxlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzSGlkZGVuX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNSh0aGlzLCBfZGlzYWJsZWRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM1KHRoaXMsIF9pc0hpZGRlbl9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaXNIaWRkZW4oKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc0hpZGRlbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzSGlkZGVuKHZhbHVlMikgewogICAgICB0aGlzLiNpc0hpZGRlbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3R5cGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM1KHRoaXMsIF9pc0hpZGRlbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzUodGhpcywgX3R5cGVfaW5pdGlhbGl6ZXJzLCAiZGVmYXVsdCIpKTsKICAgIGdldCB0eXBlKCkgewogICAgICByZXR1cm4gdGhpcy4jdHlwZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHR5cGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3R5cGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNSh0aGlzLCBfdHlwZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzUodGhpcywgX3NpemVfaW5pdGlhbGl6ZXJzLCAiZGVmYXVsdCIpKTsKICAgIGdldCBzaXplKCkgewogICAgICByZXR1cm4gdGhpcy4jc2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNpemUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzdGF0dXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM1KHRoaXMsIF9zaXplX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzNSh0aGlzLCBfc3RhdHVzX2luaXRpYWxpemVycywgIm5vcm1hbCIpKTsKICAgIGdldCBzdGF0dXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzdGF0dXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzdGF0dXModmFsdWUyKSB7CiAgICAgIHRoaXMuI3N0YXR1c19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2luc2lkZUZvcm1fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM1KHRoaXMsIF9zdGF0dXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM1KHRoaXMsIF9pbnNpZGVGb3JtX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpbnNpZGVGb3JtKCkgewogICAgICByZXR1cm4gdGhpcy4jaW5zaWRlRm9ybV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGluc2lkZUZvcm0odmFsdWUyKSB7CiAgICAgIHRoaXMuI2luc2lkZUZvcm1fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpY29uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNSh0aGlzLCBfaW5zaWRlRm9ybV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzUodGhpcywgX2ljb25faW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBpY29uKCkgewogICAgICByZXR1cm4gdGhpcy4jaWNvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGljb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI2ljb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpY29uUG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM1KHRoaXMsIF9pY29uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzNSh0aGlzLCBfaWNvblBvc2l0aW9uX2luaXRpYWxpemVycywgImxlZnQiKSk7CiAgICBnZXQgaWNvblBvc2l0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy4jaWNvblBvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaWNvblBvc2l0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNpY29uUG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBfX3J1bkluaXRpYWxpemVyczM1KHRoaXMsIF9pY29uUG9zaXRpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGlmICghdGhpcy5pbnNpZGVGb3JtICYmIHRoaXMuY2xvc2VzdCgiZGVlcy1mb3JtIikpIHsKICAgICAgICB0aGlzLmluc2lkZUZvcm0gPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgICB9CiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLyogRm9ybSBzcGFjaW5nIHN0eWxlcyAqLwogICAgICA6aG9zdChbaW5zaWRlLWZvcm1dKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgfQogICAgICAKICAgICAgOmhvc3QoW2luc2lkZS1mb3JtXTpsYXN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgfQogICAgICAKICAgICAgZGVlcy1mb3JtW2hvcml6b250YWwtbGF5b3V0XSA6aG9zdChbaW5zaWRlLWZvcm1dKSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIG1hcmdpbi1yaWdodDogMTZweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICB9CiAgICAgIAogICAgICBkZWVzLWZvcm1baG9yaXpvbnRhbC1sYXlvdXRdIDpob3N0KFtpbnNpZGUtZm9ybV06bGFzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi1yaWdodDogMDsKICAgICAgfQoKICAgICAgLmJ1dHRvbiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTsKICAgICAgICBnYXA6IDhweDsKICAgICAgfQoKICAgICAgLyogU2l6ZSB2YXJpYW50cyAqLwogICAgICAuYnV0dG9uLnNpemUtZGVmYXVsdCB7CiAgICAgICAgaGVpZ2h0OiAzNnB4OwogICAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIC5idXR0b24uc2l6ZS1zbSB7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDAgMTJweDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgIC5idXR0b24uc2l6ZS1sZyB7CiAgICAgICAgaGVpZ2h0OiA0NHB4OwogICAgICAgIHBhZGRpbmc6IDAgMjRweDsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5idXR0b24uc2l6ZS1pY29uIHsKICAgICAgICBoZWlnaHQ6IDM2cHg7CiAgICAgICAgd2lkdGg6IDM2cHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLyogRGVmYXVsdCB2YXJpYW50ICovCiAgICAgIC5idXR0b24uZGVmYXVsdCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgyMTUgMjAuMiUgMTEuOCUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgOTEuNCUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpOwogICAgICB9CgogICAgICAuYnV0dG9uLmRlZmF1bHQ6aG92ZXI6bm90KC5kaXNhYmxlZCkgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSAxMC4yJSkiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNC4zIDMxLjglIDg1JSkiLCAiaHNsKDIxNSAyMC4yJSAyMCUpIil9OwogICAgICB9CgogICAgICAuYnV0dG9uLmRlZmF1bHQ6YWN0aXZlOm5vdCguZGlzYWJsZWQpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNC4zIDMxLjglIDkxLjQlKSIsICJoc2woMjE1IDIwLjIlIDklKSIpfTsKICAgICAgfQoKICAgICAgLyogRGVzdHJ1Y3RpdmUgdmFyaWFudCAqLwogICAgICAuYnV0dG9uLmRlc3RydWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiBoc2woMCA4NC4yJSA2MC4yJSk7CiAgICAgICAgY29sb3I6IGhzbCgwIDAlIDk4JSk7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC5idXR0b24uZGVzdHJ1Y3RpdmU6aG92ZXI6bm90KC5kaXNhYmxlZCkgewogICAgICAgIGJhY2tncm91bmQ6IGhzbCgwIDg0LjIlIDU2LjIlKTsKICAgICAgfQoKICAgICAgLmJ1dHRvbi5kZXN0cnVjdGl2ZTphY3RpdmU6bm90KC5kaXNhYmxlZCkgewogICAgICAgIGJhY2tncm91bmQ6IGhzbCgwIDg0LjIlIDUyLjIlKTsKICAgICAgfQoKICAgICAgLyogT3V0bGluZSB2YXJpYW50ICovCiAgICAgIC5idXR0b24ub3V0bGluZSB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDguOCUpIiwgImhzbCgyMTAgNDAlIDk4JSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNSAyMC4yJSAyMS44JSkiKX07CiAgICAgIH0KCiAgICAgIC5idXR0b24ub3V0bGluZTpob3Zlcjpub3QoLmRpc2FibGVkKSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMjE1IDIwLjIlIDE2LjglKSIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgODUlKSIsICJoc2woMjE1IDIwLjIlIDI2LjglKSIpfTsKICAgICAgfQoKICAgICAgLmJ1dHRvbi5vdXRsaW5lOmFjdGl2ZTpub3QoLmRpc2FibGVkKSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNSAyMC4yJSAxMy44JSkiKX07CiAgICAgIH0KCiAgICAgIC8qIFNlY29uZGFyeSB2YXJpYW50ICovCiAgICAgIC5idXR0b24uc2Vjb25kYXJ5IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAuYnV0dG9uLnNlY29uZGFyeTpob3Zlcjpub3QoLmRpc2FibGVkKSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNSAyMC4yJSAxMy44JSkiKX07CiAgICAgIH0KCiAgICAgIC5idXR0b24uc2Vjb25kYXJ5OmFjdGl2ZTpub3QoLmRpc2FibGVkKSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA4NSUpIiwgImhzbCgyMTUgMjAuMiUgMTEuOCUpIil9OwogICAgICB9CgogICAgICAvKiBHaG9zdCB2YXJpYW50ICovCiAgICAgIC5idXR0b24uZ2hvc3QgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAuYnV0dG9uLmdob3N0OmhvdmVyOm5vdCguZGlzYWJsZWQpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICB9CgogICAgICAuYnV0dG9uLmdob3N0OmFjdGl2ZTpub3QoLmRpc2FibGVkKSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNSAyMC4yJSAxMy44JSkiKX07CiAgICAgIH0KCiAgICAgIC8qIExpbmsgdmFyaWFudCAqLwogICAgICAuYnV0dG9uLmxpbmsgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjEzLjEgOTMuOSUgNjcuOCUpIil9OwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb24tY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAuYnV0dG9uLmxpbms6aG92ZXI6bm90KC5kaXNhYmxlZCkgewogICAgICAgIHRleHQtZGVjb3JhdGlvbi1jb2xvcjogY3VycmVudENvbG9yOwogICAgICB9CgogICAgICAvKiBTdGF0dXMgc3RhdGVzICovCiAgICAgIC5idXR0b24ucGVuZGluZywKICAgICAgLmJ1dHRvbi5zdWNjZXNzLAogICAgICAuYnV0dG9uLmVycm9yIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDM2cHg7IC8qIFNwYWNlIGZvciBzcGlubmVyICovCiAgICAgIH0KICAgICAgCiAgICAgIC5idXR0b24uc2l6ZS1zbS5wZW5kaW5nLAogICAgICAuYnV0dG9uLnNpemUtc20uc3VjY2VzcywKICAgICAgLmJ1dHRvbi5zaXplLXNtLmVycm9yIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDMycHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5idXR0b24uc2l6ZS1sZy5wZW5kaW5nLAogICAgICAuYnV0dG9uLnNpemUtbGcuc3VjY2VzcywKICAgICAgLmJ1dHRvbi5zaXplLWxnLmVycm9yIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDQ0cHg7CiAgICAgIH0KCiAgICAgIC5idXR0b24ucGVuZGluZyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA1MS4yJSkiLCAiaHNsKDIxMy4xIDkzLjklIDY3LjglIC8gMC4yKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgyMTMuMSA5My45JSA2Ny44JSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC5idXR0b24uc3VjY2VzcyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSkiLCAiaHNsKDE0Mi4xIDcwLjYlIDQ1LjMlIC8gMC4yKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgxNDIuMSA3MC42JSA0NS4zJSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC5idXR0b24uZXJyb3IgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA4NC4yJSA2MC4yJSkiLCAiaHNsKDAgNjIuOCUgNzAuNiUgLyAwLjIpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgNjIuOCUgNzAuNiUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAvKiBEaXNhYmxlZCBzdGF0ZSAqLwogICAgICAuYnV0dG9uLmRpc2FibGVkIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLyogSGlkZGVuIHN0YXRlICovCiAgICAgIC5idXR0b24uaGlkZGVuIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBGb2N1cyBzdGF0ZSAqLwogICAgICAuYnV0dG9uOmZvY3VzLXZpc2libGUgewogICAgICAgIG91dGxpbmU6IDJweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjEzLjEgOTMuOSUgNjcuOCUpIil9OwogICAgICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7CiAgICAgIH0KCiAgICAgIC8qIExvYWRpbmcgc3Bpbm5lciAqLwogICAgICBkZWVzLXNwaW5uZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAxMHB4OwogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgfQogICAgICAKICAgICAgLmJ1dHRvbi5zaXplLXNtIGRlZXMtc3Bpbm5lciB7CiAgICAgICAgbGVmdDogOHB4OwogICAgICAgIHdpZHRoOiAxNHB4OwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgfQogICAgICAKICAgICAgLmJ1dHRvbi5zaXplLWxnIGRlZXMtc3Bpbm5lciB7CiAgICAgICAgbGVmdDogMTRweDsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC8qIEljb24gc2l6aW5nIHdpdGhpbiBidXR0b25zICovCiAgICAgIC5idXR0b24gZGVlcy1pY29uIHsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5idXR0b24uc2l6ZS1zbSBkZWVzLWljb24gewogICAgICAgIHdpZHRoOiAxNHB4OwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgfQogICAgICAKICAgICAgLmJ1dHRvbi5zaXplLWxnIGRlZXMtaWNvbiB7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICB9CgogICAgICAvKiBUZXh0IGFsaWdubWVudCAqLwogICAgICAudGV4dGJveCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgYAogICAgXTsKICAgIC8qKgogICAgICogRXh0cmFjdHMgaWNvbiBhbmQgdGV4dCBmcm9tIGxpZ2h0IERPTSBhbmQgc2V0cyBwcm9wZXJ0aWVzCiAgICAgKi8KICAgIGV4dHJhY3RMaWdodERvbSgpIHsKICAgICAgY29uc3QgaWNvbkVsZW1lbnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoImRlZXMtaWNvbiIpOwogICAgICBjb25zdCB0ZXh0Q29udGVudCA9IEFycmF5LmZyb20odGhpcy5jaGlsZE5vZGVzKS5maWx0ZXIoKG5vZGUyKSA9PiBub2RlMi5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpLm1hcCgobm9kZTIpID0+IG5vZGUyLnRleHRDb250ZW50Py50cmltKCkpLmZpbHRlcihCb29sZWFuKS5qb2luKCIgIik7CiAgICAgIGlmICh0ZXh0Q29udGVudCAmJiAhdGhpcy50ZXh0KSB7CiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgaWYgKGljb25FbGVtZW50KSB7CiAgICAgICAgY29uc3QgaWNvblZhbHVlID0gaWNvbkVsZW1lbnQuaWNvbiB8fCBpY29uRWxlbWVudC5nZXRBdHRyaWJ1dGUoImljb24iKSB8fCAoaWNvbkVsZW1lbnQuaWNvbkZBID8gYGZhOiR7aWNvbkVsZW1lbnQuaWNvbkZBfWAgOiBudWxsKTsKICAgICAgICBpZiAoaWNvblZhbHVlKSB7CiAgICAgICAgICBjb25zdCBjaGlsZHJlbjIgPSBBcnJheS5mcm9tKHRoaXMuY2hpbGROb2Rlcyk7CiAgICAgICAgICBjb25zdCBpY29uSW5kZXggPSBjaGlsZHJlbjIuaW5kZXhPZihpY29uRWxlbWVudCk7CiAgICAgICAgICBjb25zdCB0ZXh0Tm9kZXMgPSBjaGlsZHJlbjIuZmlsdGVyKChub2RlMikgPT4gbm9kZTIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFICYmIG5vZGUyLnRleHRDb250ZW50Py50cmltKCkpOwogICAgICAgICAgaWYgKHRleHROb2Rlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGNvbnN0IGZpcnN0VGV4dEluZGV4ID0gY2hpbGRyZW4yLmluZGV4T2YodGV4dE5vZGVzWzBdKTsKICAgICAgICAgICAgdGhpcy5pY29uUG9zaXRpb24gPSBpY29uSW5kZXggPCBmaXJzdFRleHRJbmRleCA/ICJsZWZ0IiA6ICJyaWdodCI7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmljb24gPSBpY29uVmFsdWU7CiAgICAgICAgfQogICAgICAgIGljb25FbGVtZW50LnJlbW92ZSgpOwogICAgICB9CiAgICAgIHRoaXMuaW5uZXJIVE1MID0gIiI7CiAgICB9CiAgICByZW5kZXIoKSB7CiAgICAgIGNvbnN0IHR5cGVNYXAgPSB7CiAgICAgICAgIm5vcm1hbCI6ICJkZWZhdWx0IiwKICAgICAgICAiaGlnaGxpZ2h0ZWQiOiAiZGVzdHJ1Y3RpdmUiLAogICAgICAgICJkaXNjcmVldCI6ICJvdXRsaW5lIiwKICAgICAgICAiYmlnIjogImRlZmF1bHQiCiAgICAgICAgLy8gV2lsbCB1c2Ugc2l6ZSBpbnN0ZWFkCiAgICAgIH07CiAgICAgIGNvbnN0IGFjdHVhbFR5cGUgPSB0eXBlTWFwW3RoaXMudHlwZV0gfHwgdGhpcy50eXBlOwogICAgICBjb25zdCBhY3R1YWxTaXplID0gdGhpcy50eXBlID09PSAiYmlnIiA/ICJsZyIgOiB0aGlzLnNpemU7CiAgICAgIGNvbnN0IGxlZnRJY29uID0gdGhpcy5pY29uUG9zaXRpb24gPT09ICJsZWZ0IiAmJiB0aGlzLmljb24gPyBiMmA8ZGVlcy1pY29uIC5pY29uPSR7dGhpcy5pY29ufT48L2RlZXMtaWNvbj5gIDogIiI7CiAgICAgIGNvbnN0IHJpZ2h0SWNvbiA9IHRoaXMuaWNvblBvc2l0aW9uID09PSAicmlnaHQiICYmIHRoaXMuaWNvbiA/IGIyYDxkZWVzLWljb24gLmljb249JHt0aGlzLmljb259PjwvZGVlcy1pY29uPmAgOiAiIjsKICAgICAgY29uc3QgaXNJY29uT25seSA9IGFjdHVhbFNpemUgPT09ICJpY29uIiAmJiB0aGlzLmljb247CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdgogICAgICAgIGNsYXNzPSJidXR0b24gJHt0aGlzLmlzSGlkZGVuID8gImhpZGRlbiIgOiAiIn0gJHthY3R1YWxUeXBlfSBzaXplLSR7YWN0dWFsU2l6ZX0gJHt0aGlzLnN0YXR1c30gJHt0aGlzLmRpc2FibGVkID8gImRpc2FibGVkIiA6ICIifSIKICAgICAgICBAY2xpY2s9IiR7dGhpcy5kaXNwYXRjaENsaWNrfSIKICAgICAgPgogICAgICAgICR7dGhpcy5zdGF0dXMgPT09ICJub3JtYWwiID8gYjJgYCA6IGIyYAogICAgICAgICAgPGRlZXMtc3Bpbm5lcgogICAgICAgICAgICAuYm53PSR7dHJ1ZX0KICAgICAgICAgICAgc3RhdHVzPSIke3RoaXMuc3RhdHVzfSIKICAgICAgICAgICAgc2l6ZT0iJHthY3R1YWxTaXplID09PSAic20iID8gMTQgOiBhY3R1YWxTaXplID09PSAibGciID8gMTggOiAxNn0iCiAgICAgICAgICA+PC9kZWVzLXNwaW5uZXI+CiAgICAgICAgYH0KICAgICAgICAke2xlZnRJY29ufQogICAgICAgICR7aXNJY29uT25seSA/ICIiIDogYjJgPGRpdiBjbGFzcz0idGV4dGJveCI+JHt0aGlzLnRleHQgfHwgIkJ1dHRvbiJ9PC9kaXY+YH0KICAgICAgICAke3JpZ2h0SWNvbn0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgZGlzcGF0Y2hDbGljaygpIHsKICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2xpY2tlZCIsIHsKICAgICAgICBkZXRhaWw6IHsKICAgICAgICAgIGRhdGE6IHRoaXMuZXZlbnREZXRhaWxEYXRhCiAgICAgICAgfSwKICAgICAgICBidWJibGVzOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZCgpIHsKICAgICAgdGhpcy5leHRyYWN0TGlnaHREb20oKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMzUoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNCdXR0b24yID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1kYXRhdmlldy9kZWVzLXN0YXRzZ3JpZC9kZWVzLXN0YXRzZ3JpZC5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2RlZXNfaWNvbigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGUzNSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMzYgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNTdGF0c0dyaWQgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLXN0YXRzZ3JpZCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3RpbGVzX2RlY29yYXRvcnM7CiAgbGV0IF90aWxlc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RpbGVzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9taW5UaWxlV2lkdGhfZGVjb3JhdG9yczsKICBsZXQgX21pblRpbGVXaWR0aF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21pblRpbGVXaWR0aF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZ2FwX2RlY29yYXRvcnM7CiAgbGV0IF9nYXBfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9nYXBfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2dyaWRBY3Rpb25zX2RlY29yYXRvcnM7CiAgbGV0IF9ncmlkQWN0aW9uc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2dyaWRBY3Rpb25zX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZXh0TWVudVZpc2libGVfZGVjb3JhdG9yczsKICBsZXQgX2NvbnRleHRNZW51VmlzaWJsZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRleHRNZW51VmlzaWJsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29udGV4dE1lbnVQb3NpdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfY29udGV4dE1lbnVQb3NpdGlvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRleHRNZW51UG9zaXRpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRleHRNZW51QWN0aW9uc19kZWNvcmF0b3JzOwogIGxldCBfY29udGV4dE1lbnVBY3Rpb25zX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29udGV4dE1lbnVBY3Rpb25zX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNTdGF0c0dyaWQyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfdGlsZXNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX21pblRpbGVXaWR0aF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX2dhcF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX2dyaWRBY3Rpb25zX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF9jb250ZXh0TWVudVZpc2libGVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2NvbnRleHRNZW51UG9zaXRpb25fZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2NvbnRleHRNZW51QWN0aW9uc19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGUzNSh0aGlzLCBudWxsLCBfdGlsZXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGlsZXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRpbGVzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRpbGVzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50aWxlcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90aWxlc19pbml0aWFsaXplcnMsIF90aWxlc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM1KHRoaXMsIG51bGwsIF9taW5UaWxlV2lkdGhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWluVGlsZVdpZHRoIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtaW5UaWxlV2lkdGgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWluVGlsZVdpZHRoLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5taW5UaWxlV2lkdGggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWluVGlsZVdpZHRoX2luaXRpYWxpemVycywgX21pblRpbGVXaWR0aF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM1KHRoaXMsIG51bGwsIF9nYXBfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZ2FwIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJnYXAiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZ2FwLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5nYXAgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZ2FwX2luaXRpYWxpemVycywgX2dhcF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM1KHRoaXMsIG51bGwsIF9ncmlkQWN0aW9uc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJncmlkQWN0aW9ucyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZ3JpZEFjdGlvbnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZ3JpZEFjdGlvbnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmdyaWRBY3Rpb25zID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2dyaWRBY3Rpb25zX2luaXRpYWxpemVycywgX2dyaWRBY3Rpb25zX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzUodGhpcywgbnVsbCwgX2NvbnRleHRNZW51VmlzaWJsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb250ZXh0TWVudVZpc2libGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNvbnRleHRNZW51VmlzaWJsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jb250ZXh0TWVudVZpc2libGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvbnRleHRNZW51VmlzaWJsZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jb250ZXh0TWVudVZpc2libGVfaW5pdGlhbGl6ZXJzLCBfY29udGV4dE1lbnVWaXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzUodGhpcywgbnVsbCwgX2NvbnRleHRNZW51UG9zaXRpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29udGV4dE1lbnVQb3NpdGlvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29udGV4dE1lbnVQb3NpdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jb250ZXh0TWVudVBvc2l0aW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jb250ZXh0TWVudVBvc2l0aW9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbnRleHRNZW51UG9zaXRpb25faW5pdGlhbGl6ZXJzLCBfY29udGV4dE1lbnVQb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM1KHRoaXMsIG51bGwsIF9jb250ZXh0TWVudUFjdGlvbnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29udGV4dE1lbnVBY3Rpb25zIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb250ZXh0TWVudUFjdGlvbnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29udGV4dE1lbnVBY3Rpb25zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jb250ZXh0TWVudUFjdGlvbnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29udGV4dE1lbnVBY3Rpb25zX2luaXRpYWxpemVycywgX2NvbnRleHRNZW51QWN0aW9uc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM1KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1N0YXRzR3JpZDIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzc7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiRGF0YSBWaWV3Il07CiAgICAjdGlsZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMzYodGhpcywgX3RpbGVzX2luaXRpYWxpemVycywgW10pOwogICAgZ2V0IHRpbGVzKCkgewogICAgICByZXR1cm4gdGhpcy4jdGlsZXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0aWxlcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdGlsZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtaW5UaWxlV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM2KHRoaXMsIF90aWxlc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzYodGhpcywgX21pblRpbGVXaWR0aF9pbml0aWFsaXplcnMsIDI1MCkpOwogICAgZ2V0IG1pblRpbGVXaWR0aCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21pblRpbGVXaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1pblRpbGVXaWR0aCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWluVGlsZVdpZHRoX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZ2FwX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNih0aGlzLCBfbWluVGlsZVdpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzNih0aGlzLCBfZ2FwX2luaXRpYWxpemVycywgMTYpKTsKICAgIGdldCBnYXAoKSB7CiAgICAgIHJldHVybiB0aGlzLiNnYXBfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBnYXAodmFsdWUyKSB7CiAgICAgIHRoaXMuI2dhcF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2dyaWRBY3Rpb25zX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNih0aGlzLCBfZ2FwX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzNih0aGlzLCBfZ3JpZEFjdGlvbnNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IGdyaWRBY3Rpb25zKCkgewogICAgICByZXR1cm4gdGhpcy4jZ3JpZEFjdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBncmlkQWN0aW9ucyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZ3JpZEFjdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjb250ZXh0TWVudVZpc2libGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM2KHRoaXMsIF9ncmlkQWN0aW9uc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzYodGhpcywgX2NvbnRleHRNZW51VmlzaWJsZV9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgY29udGV4dE1lbnVWaXNpYmxlKCkgewogICAgICByZXR1cm4gdGhpcy4jY29udGV4dE1lbnVWaXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29udGV4dE1lbnVWaXNpYmxlKHZhbHVlMikgewogICAgICB0aGlzLiNjb250ZXh0TWVudVZpc2libGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjb250ZXh0TWVudVBvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNih0aGlzLCBfY29udGV4dE1lbnVWaXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzNih0aGlzLCBfY29udGV4dE1lbnVQb3NpdGlvbl9pbml0aWFsaXplcnMsIHsgeDogMCwgeTogMCB9KSk7CiAgICBnZXQgY29udGV4dE1lbnVQb3NpdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvbnRleHRNZW51UG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjb250ZXh0TWVudVBvc2l0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNjb250ZXh0TWVudVBvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29udGV4dE1lbnVBY3Rpb25zX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNih0aGlzLCBfY29udGV4dE1lbnVQb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzYodGhpcywgX2NvbnRleHRNZW51QWN0aW9uc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgY29udGV4dE1lbnVBY3Rpb25zKCkgewogICAgICByZXR1cm4gdGhpcy4jY29udGV4dE1lbnVBY3Rpb25zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29udGV4dE1lbnVBY3Rpb25zKHZhbHVlMikgewogICAgICB0aGlzLiNjb250ZXh0TWVudUFjdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZm9udC1mYW1pbHk6ICR7Y3NzR2Vpc3RGb250RmFtaWx5fTsKICAgICAgfQoKICAgICAgLyogQ1NTIFZhcmlhYmxlcyBmb3IgY29uc2lzdGVudCBzcGFjaW5nIGFuZCBzaXppbmcgKi8KICAgICAgOmhvc3QgewogICAgICAgIC0tZ3JpZC1nYXA6IDEycHg7CiAgICAgICAgLS10aWxlLXBhZGRpbmc6IDE2cHg7CiAgICAgICAgLS1oZWFkZXItc3BhY2luZzogMTJweDsKICAgICAgICAtLWNvbnRlbnQtbWluLWhlaWdodDogNDBweDsKICAgICAgICAtLXZhbHVlLWZvbnQtc2l6ZTogMjZweDsKICAgICAgICAtLXVuaXQtZm9udC1zaXplOiAxNHB4OwogICAgICAgIC0tbGFiZWwtZm9udC1zaXplOiAxMnB4OwogICAgICAgIC0tdGl0bGUtZm9udC1zaXplOiAxM3B4OwogICAgICAgIC0tZGVzY3JpcHRpb24tc3BhY2luZzogOHB4OwogICAgICAgIC0tYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIC0tdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4xNXM7CiAgICAgIH0KCiAgICAgIC8qIEdyaWQgTGF5b3V0ICovCiAgICAgIC5ncmlkLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBtYXJnaW4tYm90dG9tOiBjYWxjKHZhcigtLWdyaWQtZ2FwKSAqIDEuNSk7CiAgICAgICAgbWluLWhlaWdodDogNDBweDsKICAgICAgfQoKICAgICAgLmdyaWQtdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtOwogICAgICB9CgogICAgICAuZ3JpZC1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogNnB4OwogICAgICB9CgogICAgICAuZ3JpZC1hY3Rpb25zIGRlZXMtYnV0dG9uIHsKICAgICAgICBmb250LXNpemU6IHZhcigtLWxhYmVsLWZvbnQtc2l6ZSk7CiAgICAgIH0KCiAgICAgIC5zdGF0cy1ncmlkIHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoJHtyKDI1MCl9cHgsIDFmcikpOwogICAgICAgIGdhcDogJHtyKDE2KX1weDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLyogVGlsZSBCYXNlIFN0eWxlcyAqLwogICAgICAuc3RhdHMtdGlsZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzA5MDkwYiIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2UwZTBlMCIsICIjMjAyMDIwIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlci1yYWRpdXMpOwogICAgICAgIHBhZGRpbmc6IHZhcigtLXRpbGUtcGFkZGluZyk7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIHZhcigtLXRyYW5zaXRpb24tZHVyYXRpb24pIGVhc2U7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgLnN0YXRzLXRpbGU6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmFmYWZhIiwgIiMwZDBkMGQiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2QwZDBkMCIsICIjMmEyYTJhIil9OwogICAgICB9CgogICAgICAuc3RhdHMtdGlsZS5jbGlja2FibGUgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgLnN0YXRzLXRpbGUuY2xpY2thYmxlOmhvdmVyIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgICAgICAgYm94LXNoYWRvdzogMCAycHggNnB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsMCwwLDAuMDMpIiwgInJnYmEoMCwwLDAsMC4xNSkiKX07CiAgICAgIH0KCiAgICAgIC8qIFRpbGUgSGVhZGVyICovCiAgICAgIC50aWxlLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogdmFyKC0taGVhZGVyLXNwYWNpbmcpOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAudGlsZS10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS10aXRsZS1mb250LXNpemUpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNDYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTsKICAgICAgICBsaW5lLWhlaWdodDogMS4yOwogICAgICB9CgogICAgICAudGlsZS1pY29uIHsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNDYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLyogVGlsZSBDb250ZW50ICovCiAgICAgIC50aWxlLWNvbnRlbnQgewogICAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLWNvbnRlbnQtbWluLWhlaWdodCk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXg6IDE7CiAgICAgIH0KCiAgICAgIC50aWxlLXZhbHVlIHsKICAgICAgICBmb250LXNpemU6IHZhcigtLXZhbHVlLWZvbnQtc2l6ZSk7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgOC44JSkiLCAiaHNsKDIxMCA0MCUgOTglKSIpfTsKICAgICAgICBsaW5lLWhlaWdodDogMS4xOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGdhcDogNHB4OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMjVlbTsKICAgICAgfQoKICAgICAgLnRpbGUtdW5pdCB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS11bml0LWZvbnQtc2l6ZSk7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA0Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CiAgICAgIH0KCiAgICAgIC50aWxlLWRlc2NyaXB0aW9uIHsKICAgICAgICBmb250LXNpemU6IHZhcigtLWxhYmVsLWZvbnQtc2l6ZSk7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNTYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNTUuMSUpIil9OwogICAgICAgIG1hcmdpbi10b3A6IHZhcigtLWRlc2NyaXB0aW9uLXNwYWNpbmcpOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAvKiBHYXVnZSBTdHlsZXMgKi8KICAgICAgLmdhdWdlLXdyYXBwZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmdhdWdlLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDEyMHB4OwogICAgICAgIGhlaWdodDogNzBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWFyZ2luLXRvcDogLThweDsKICAgICAgfQoKICAgICAgLmdhdWdlLXN2ZyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAuZ2F1Z2UtYmFja2dyb3VuZCB7CiAgICAgICAgZmlsbDogbm9uZTsKICAgICAgICBzdHJva2U6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZThlOGU4IiwgIiMxYTFhMWEiKX07CiAgICAgICAgc3Ryb2tlLXdpZHRoOiA2OwogICAgICB9CgogICAgICAuZ2F1Z2UtZmlsbCB7CiAgICAgICAgZmlsbDogbm9uZTsKICAgICAgICBzdHJva2Utd2lkdGg6IDY7CiAgICAgICAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kOwogICAgICAgIHRyYW5zaXRpb246IHN0cm9rZS1kYXNob2Zmc2V0IDAuNnMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICAgICAgfQoKICAgICAgLmdhdWdlLXRleHQgewogICAgICAgIGZpbGw6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDguOCUpIiwgImhzbCgyMTAgNDAlIDk4JSkiKX07CiAgICAgICAgZm9udC1mYW1pbHk6ICR7Y3NzR2Vpc3RGb250RmFtaWx5fTsKICAgICAgICBmb250LXNpemU6IHZhcigtLXZhbHVlLWZvbnQtc2l6ZSk7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMjVlbTsKICAgICAgfQogICAgICAKICAgICAgLmdhdWdlLXVuaXQgewogICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tdW5pdC1mb250LXNpemUpOwogICAgICAgIGZpbGw6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNDYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgZm9udC1mYW1pbHk6ICR7Y3NzR2Vpc3RGb250RmFtaWx5fTsKICAgICAgfQoKICAgICAgLyogUGVyY2VudGFnZSBTdHlsZXMgKi8KICAgICAgLnBlcmNlbnRhZ2Utd3JhcHBlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4OiAxOwogICAgICB9CgogICAgICAucGVyY2VudGFnZS12YWx1ZSB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS12YWx1ZS1mb250LXNpemUpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDguOCUpIiwgImhzbCgyMTAgNDAlIDk4JSkiKX07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDI1ZW07CiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICB9CgogICAgICAucGVyY2VudGFnZS1iYXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogNnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZThlOGU4IiwgIiMxYTFhMWEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgbWFyZ2luLXRvcDogYXV0bzsKICAgICAgfQoKICAgICAgLnBlcmNlbnRhZ2UtZmlsbCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMzMzMzMzIiwgIiNlMGUwZTAiKX07CiAgICAgICAgdHJhbnNpdGlvbjogd2lkdGggMC42cyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgfQoKICAgICAgLyogTXVsdGkgUGVyY2VudGFnZSBTdHlsZXMgKi8KICAgICAgLm11bHRpLXBlcmNlbnRhZ2Utd3JhcHBlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXg6IDE7CiAgICAgIH0KCiAgICAgIC5tdWx0aS1wZXJjZW50YWdlLWl0ZW1zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgIG1hcmdpbi10b3A6IGF1dG87CiAgICAgIH0KCiAgICAgIC5tdWx0aS1wZXJjZW50YWdlLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDRweDsKICAgICAgfQoKICAgICAgLm11bHRpLXBlcmNlbnRhZ2UtaGVhZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgIH0KCiAgICAgIC5tdWx0aS1wZXJjZW50YWdlLWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA0Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CiAgICAgIH0KCiAgICAgIC5tdWx0aS1wZXJjZW50YWdlLXZhbHVlIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgOC44JSkiLCAiaHNsKDIxMCA0MCUgOTglKSIpfTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTsKICAgICAgfQoKICAgICAgLm11bHRpLXBlcmNlbnRhZ2UtYmFyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDRweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U4ZThlOCIsICIjMWExYTFhIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAubXVsdGktcGVyY2VudGFnZS1maWxsIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzMzMzMzMiLCAiI2UwZTBlMCIpfTsKICAgICAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjZzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICB9CgogICAgICAvKiBDUFUgQ29yZXMgU3R5bGVzICovCiAgICAgIC5jcHUtY29yZXMtd3JhcHBlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLWhlaWdodDogODBweDsKICAgICAgfQoKICAgICAgLmNwdS1jb3Jlcy1oZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDEycHg7CiAgICAgIH0KCiAgICAgIC5jcHUtY29yZXMtdmFsdWUgewogICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tdmFsdWUtZm9udC1zaXplKTsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjE7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAyNWVtOwogICAgICB9CgogICAgICAuY3B1LWNvcmVzLXVuaXQgewogICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tdW5pdC1mb250LXNpemUpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNDYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtOwogICAgICB9CgogICAgICAuY3B1LWNvcmVzLWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IHZhcigtLWxhYmVsLWZvbnQtc2l6ZSk7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA1Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA1NS4xJSkiKX07CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CiAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICAgIH0KCiAgICAgIC5jcHUtY29yZXMtYmFycyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICAgICAgZ2FwOiAzcHg7CiAgICAgICAgZmxleDogMTsKICAgICAgICBtaW4taGVpZ2h0OiA2MHB4OwogICAgICAgIHBhZGRpbmc6IDRweCAwOwogICAgICB9CgogICAgICAuY3B1LWNvcmVzLWJhcnMuY2VudGVyZWQgewogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAuY3B1LWNvcmUtYmFyLWNvbnRhaW5lciB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBtaW4td2lkdGg6IDZweDsKICAgICAgICBtYXgtd2lkdGg6IDI0cHg7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNHB4OwogICAgICB9CgogICAgICAuY3B1LWNvcmUtYmFyLXdyYXBwZXIgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlOGU4ZTgiLCAiIzFhMWExYSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgbWluLWhlaWdodDogNDBweDsKICAgICAgfQoKICAgICAgLmNwdS1jb3JlLWJhci1maWxsIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2NjY2NjYiLCAiIzg4ODg4OCIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBoZWlnaHQgMC4zcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpLCBiYWNrZ3JvdW5kLWNvbG9yIDAuM3MgZWFzZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHggMnB4IDAgMDsKICAgICAgfQoKICAgICAgLmNwdS1jb3JlLWJhci1maWxsLmxvdyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSkiLCAiaHNsKDE0Mi4xIDcwLjYlIDQ1LjMlKSIpfTsKICAgICAgfQoKICAgICAgLmNwdS1jb3JlLWJhci1maWxsLm1lZGl1bSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCg0NS40IDkzLjQlIDQ3LjUlKSIsICJoc2woNDUuNCA5My40JSA0Ny41JSkiKX07CiAgICAgIH0KCiAgICAgIC5jcHUtY29yZS1iYXItZmlsbC5oaWdoIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgODQuMiUgNjAuMiUpIiwgImhzbCgwIDg0LjIlIDYwLjIlKSIpfTsKICAgICAgfQoKICAgICAgLmNwdS1jb3JlLWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDlweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDU2LjklKSIsICJoc2woMjE1IDIwLjIlIDU1LjElKSIpfTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLyogUGFydGl0aW9uIFN0eWxlcyAqLwogICAgICAucGFydGl0aW9uLXdyYXBwZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4OiAxOwogICAgICAgIGdhcDogOHB4OwogICAgICB9CgogICAgICAucGFydGl0aW9uLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgIH0KCiAgICAgIC5wYXJ0aXRpb24tcGVyY2VudGFnZSB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS12YWx1ZS1mb250LXNpemUpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDguOCUpIiwgImhzbCgyMTAgNDAlIDk4JSkiKX07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDI1ZW07CiAgICAgIH0KCiAgICAgIC5wYXJ0aXRpb24tYmFyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDZweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U4ZThlOCIsICIjMWExYTFhIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAucGFydGl0aW9uLWJhci1maWxsIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzMzMzMzMiLCAiI2UwZTBlMCIpfTsKICAgICAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjZzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICB9CgogICAgICAucGFydGl0aW9uLWJhci1maWxsLndhcm5pbmcgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woNDUuNCA5My40JSA0Ny41JSkiLCAiaHNsKDQ1LjQgOTMuNCUgNDcuNSUpIil9OwogICAgICB9CgogICAgICAucGFydGl0aW9uLWJhci1maWxsLmNyaXRpY2FsIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgODQuMiUgNjAuMiUpIiwgImhzbCgwIDg0LjIlIDYwLjIlKSIpfTsKICAgICAgfQoKICAgICAgLnBhcnRpdGlvbi1zdGF0cyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBtYXJnaW4tdG9wOiBhdXRvOwogICAgICB9CgogICAgICAucGFydGl0aW9uLXN0YXQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDJweDsKICAgICAgfQoKICAgICAgLnBhcnRpdGlvbi1zdGF0LWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA1Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA1NS4xJSkiKX07CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wMmVtOwogICAgICB9CgogICAgICAucGFydGl0aW9uLXN0YXQtdmFsdWUgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtOwogICAgICB9CgogICAgICAucGFydGl0aW9uLW1ldGEgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDZweDsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgIH0KCiAgICAgIC5wYXJ0aXRpb24tZmlsZXN5c3RlbSB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNDYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSAxNi44JSkiKX07CiAgICAgICAgcGFkZGluZzogMnB4IDZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgIH0KCiAgICAgIC5wYXJ0aXRpb24tbW91bnRwb2ludCB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDU2LjklKSIsICJoc2woMjE1IDIwLjIlIDU1LjElKSIpfTsKICAgICAgfQoKICAgICAgLyogRGlzayBTdHlsZXMgKi8KICAgICAgLmRpc2std3JhcHBlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgIH0KCiAgICAgIC5kaXNrLWNhcGFjaXR5IHsKICAgICAgICBmb250LXNpemU6IHZhcigtLXZhbHVlLWZvbnQtc2l6ZSk7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgOC44JSkiLCAiaHNsKDIxMCA0MCUgOTglKSIpfTsKICAgICAgICBsaW5lLWhlaWdodDogMS4xOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMjVlbTsKICAgICAgfQoKICAgICAgLmRpc2stbW9kZWwgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA0Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNnB4OwogICAgICB9CgogICAgICAuZGlzay10eXBlLWJhZGdlIHsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDQ2LjklKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICB9CgogICAgICAuZGlzay1tZXRyaWNzIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgbWFyZ2luLXRvcDogYXV0bzsKICAgICAgfQoKICAgICAgLmRpc2staW9wcyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTJweDsKICAgICAgfQoKICAgICAgLmRpc2staW9wcy1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgICBnYXA6IDRweDsKICAgICAgfQoKICAgICAgLmRpc2staW9wcy1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNTYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNTUuMSUpIil9OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIH0KCiAgICAgIC5kaXNrLWlvcHMtdmFsdWUgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICB9CgogICAgICAuZGlzay1oZWFsdGggewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDRweDsKICAgICAgfQoKICAgICAgLmRpc2staGVhbHRoLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICB9CgogICAgICAuZGlzay1oZWFsdGgtbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDU2LjklKSIsICJoc2woMjE1IDIwLjIlIDU1LjElKSIpfTsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICB9CgogICAgICAuZGlzay1oZWFsdGgtdmFsdWUgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICB9CgogICAgICAuZGlzay1oZWFsdGgtYmFyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDRweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U4ZThlOCIsICIjMWExYTFhIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuZGlzay1oZWFsdGgtZmlsbCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHRyYW5zaXRpb246IHdpZHRoIDAuNnMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgIH0KCiAgICAgIC5kaXNrLWhlYWx0aC1maWxsLmdvb2QgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyLjEgNzYuMiUgMzYuMyUpIiwgImhzbCgxNDIuMSA3MC42JSA0NS4zJSkiKX07CiAgICAgIH0KCiAgICAgIC5kaXNrLWhlYWx0aC1maWxsLndhcm5pbmcgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woNDUuNCA5My40JSA0Ny41JSkiLCAiaHNsKDQ1LjQgOTMuNCUgNDcuNSUpIil9OwogICAgICB9CgogICAgICAuZGlzay1oZWFsdGgtZmlsbC5jcml0aWNhbCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDg0LjIlIDYwLjIlKSIsICJoc2woMCA4NC4yJSA2MC4yJSkiKX07CiAgICAgIH0KCiAgICAgIC8qIFRyZW5kIFN0eWxlcyAqLwogICAgICAudHJlbmQtY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgZmxleDogMTsKICAgICAgfQoKICAgICAgLnRyZW5kLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgIH0KCiAgICAgIC50cmVuZC12YWx1ZSB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS12YWx1ZS1mb250LXNpemUpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDguOCUpIiwgImhzbCgyMTAgNDAlIDk4JSkiKX07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDI1ZW07CiAgICAgIH0KCiAgICAgIC50cmVuZC11bml0IHsKICAgICAgICBmb250LXNpemU6IHZhcigtLXVuaXQtZm9udC1zaXplKTsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDQ2LjklKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTsKICAgICAgfQoKICAgICAgLnRyZW5kLWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IHZhcigtLWxhYmVsLWZvbnQtc2l6ZSk7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA1Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA1NS4xJSkiKX07CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CiAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICAgIH0KCiAgICAgIC50cmVuZC1ncmFwaCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAyOHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtYXJnaW4tdG9wOiBhdXRvOwogICAgICB9CgogICAgICAudHJlbmQtc3ZnIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC50cmVuZC1saW5lIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICAgIHN0cm9rZTogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5OTk5OTkiLCAiIzY2NjY2NiIpfTsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgfQoKICAgICAgLnRyZW5kLWFyZWEgewogICAgICAgIGZpbGw6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDE1MCwgMTUwLCAxNTAsIDAuMDgpIiwgInJnYmEoMTAwLCAxMDAsIDEwMCwgMC4wOCkiKX07CiAgICAgIH0KCiAgICAgIC8qIFRleHQgVmFsdWUgU3R5bGVzICovCiAgICAgIC50ZXh0LXZhbHVlIHsKICAgICAgICBmb250LXNpemU6IHZhcigtLXZhbHVlLWZvbnQtc2l6ZSk7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgOC44JSkiLCAiaHNsKDIxMCA0MCUgOTglKSIpfTsKICAgICAgICBsaW5lLWhlaWdodDogMS4xOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMjVlbTsKICAgICAgfQoKICAgICAgLyogQ29udGV4dCBNZW51ICovCiAgICAgIGRlZXMtY29udGV4dG1lbnUgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB6LWluZGV4OiAxMDAwOwogICAgICB9CiAgICBgCiAgICBdOwogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMzYodGhpcywgX2NvbnRleHRNZW51QWN0aW9uc19leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgJHt0aGlzLmdyaWRBY3Rpb25zLmxlbmd0aCA+IDAgPyBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJncmlkLWhlYWRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJncmlkLXRpdGxlIj48L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImdyaWQtYWN0aW9ucyI+CiAgICAgICAgICAgICR7dGhpcy5ncmlkQWN0aW9ucy5tYXAoKGFjdGlvbikgPT4gYjJgCiAgICAgICAgICAgICAgPGRlZXMtYnV0dG9uIAogICAgICAgICAgICAgICAgQGNsaWNrZWQ9JHsoKSA9PiB0aGlzLmhhbmRsZUdyaWRBY3Rpb24oYWN0aW9uKX0KICAgICAgICAgICAgICAgIHR5cGU9Im91dGxpbmUiCiAgICAgICAgICAgICAgICBzaXplPSJzbSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAke2FjdGlvbi5pY29uTmFtZSA/IGIyYDxkZWVzLWljb24gLmljb249JHthY3Rpb24uaWNvbk5hbWV9IHNpemU9InNtYWxsIj48L2RlZXMtaWNvbj5gIDogIiJ9CiAgICAgICAgICAgICAgICAke2FjdGlvbi5uYW1lfQogICAgICAgICAgICAgIDwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIGApfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIGAgOiAiIn0KICAgICAgCiAgICAgIDxkaXYgY2xhc3M9InN0YXRzLWdyaWQiIHN0eWxlPSJncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KCR7dGhpcy5taW5UaWxlV2lkdGh9cHgsIDFmcikpOyBnYXA6ICR7dGhpcy5nYXB9cHg7Ij4KICAgICAgICAke3RoaXMudGlsZXMubWFwKCh0aWxlKSA9PiB0aGlzLnJlbmRlclRpbGUodGlsZSkpfQogICAgICA8L2Rpdj4KCiAgICAgICR7dGhpcy5jb250ZXh0TWVudVZpc2libGUgPyBiMmAKICAgICAgICA8ZGVlcy1jb250ZXh0bWVudQogICAgICAgICAgLng9JHt0aGlzLmNvbnRleHRNZW51UG9zaXRpb24ueH0KICAgICAgICAgIC55PSR7dGhpcy5jb250ZXh0TWVudVBvc2l0aW9uLnl9CiAgICAgICAgICAubWVudUl0ZW1zPSR7dGhpcy5jb250ZXh0TWVudUFjdGlvbnN9CiAgICAgICAgICBAY2xpY2tlZD0keygpID0+IHRoaXMuY29udGV4dE1lbnVWaXNpYmxlID0gZmFsc2V9CiAgICAgICAgPjwvZGVlcy1jb250ZXh0bWVudT4KICAgICAgYCA6ICIifQogICAgYDsKICAgIH0KICAgIHJlbmRlclRpbGUodGlsZSkgewogICAgICBjb25zdCBoYXNBY3Rpb25zID0gdGlsZS5hY3Rpb25zICYmIHRpbGUuYWN0aW9ucy5sZW5ndGggPiAwOwogICAgICBjb25zdCBjbGlja2FibGUgPSBoYXNBY3Rpb25zICYmIHRpbGUuYWN0aW9ucy5sZW5ndGggPT09IDE7CiAgICAgIGNvbnN0IGNvbHVtblNwYW4gPSB0aWxlLmNvbHVtblNwYW4gJiYgdGlsZS5jb2x1bW5TcGFuID4gMSA/IHRpbGUuY29sdW1uU3BhbiA6IHZvaWQgMDsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9InN0YXRzLXRpbGUgJHtjbGlja2FibGUgPyAiY2xpY2thYmxlIiA6ICIifSIKICAgICAgICBzdHlsZT0iJHtjb2x1bW5TcGFuID8gYGdyaWQtY29sdW1uOiBzcGFuICR7Y29sdW1uU3Bhbn1gIDogIiJ9IgogICAgICAgIEBjbGljaz0ke2NsaWNrYWJsZSA/ICgpID0+IHRoaXMuaGFuZGxlVGlsZUFjdGlvbih0aWxlLmFjdGlvbnNbMF0sIHRpbGUpIDogdm9pZCAwfQogICAgICAgIEBjb250ZXh0bWVudT0ke2hhc0FjdGlvbnMgPyAoZTExKSA9PiB0aGlzLnNob3dDb250ZXh0TWVudShlMTEsIHRpbGUpIDogdm9pZCAwfQogICAgICA+CiAgICAgICAgPGRpdiBjbGFzcz0idGlsZS1oZWFkZXIiPgogICAgICAgICAgPGgzIGNsYXNzPSJ0aWxlLXRpdGxlIj4ke3RpbGUudGl0bGV9PC9oMz4KICAgICAgICAgICR7dGlsZS5pY29uID8gYjJgCiAgICAgICAgICAgIDxkZWVzLWljb24gY2xhc3M9InRpbGUtaWNvbiIgLmljb249JHt0aWxlLmljb259IHNpemU9InNtYWxsIj48L2RlZXMtaWNvbj4KICAgICAgICAgIGAgOiAiIn0KICAgICAgICA8L2Rpdj4KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJ0aWxlLWNvbnRlbnQiPgogICAgICAgICAgJHt0aGlzLnJlbmRlclRpbGVDb250ZW50KHRpbGUpfQogICAgICAgIDwvZGl2PgogICAgICAgIAogICAgICAgICR7dGlsZS5kZXNjcmlwdGlvbiAmJiB0aWxlLnR5cGUgIT09ICJ0cmVuZCIgPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9InRpbGUtZGVzY3JpcHRpb24iPiR7dGlsZS5kZXNjcmlwdGlvbn08L2Rpdj4KICAgICAgICBgIDogIiJ9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlclRpbGVDb250ZW50KHRpbGUpIHsKICAgICAgc3dpdGNoICh0aWxlLnR5cGUpIHsKICAgICAgICBjYXNlICJudW1iZXIiOgogICAgICAgICAgcmV0dXJuIGIyYAogICAgICAgICAgPGRpdiBjbGFzcz0idGlsZS12YWx1ZSIgc3R5bGU9IiR7dGlsZS5jb2xvciA/IGBjb2xvcjogJHt0aWxlLmNvbG9yfWAgOiAiIn0iPgogICAgICAgICAgICA8c3Bhbj4ke3RpbGUudmFsdWV9PC9zcGFuPgogICAgICAgICAgICAke3RpbGUudW5pdCA/IGIyYDxzcGFuIGNsYXNzPSJ0aWxlLXVuaXQiPiR7dGlsZS51bml0fTwvc3Bhbj5gIDogIiJ9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgOwogICAgICAgIGNhc2UgImdhdWdlIjoKICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckdhdWdlKHRpbGUpOwogICAgICAgIGNhc2UgInBlcmNlbnRhZ2UiOgogICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyUGVyY2VudGFnZSh0aWxlKTsKICAgICAgICBjYXNlICJ0cmVuZCI6CiAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJUcmVuZCh0aWxlKTsKICAgICAgICBjYXNlICJtdWx0aVBlcmNlbnRhZ2UiOgogICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyTXVsdGlQZXJjZW50YWdlKHRpbGUpOwogICAgICAgIGNhc2UgImNwdUNvcmVzIjoKICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNwdUNvcmVzKHRpbGUpOwogICAgICAgIGNhc2UgInBhcnRpdGlvbiI6CiAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJQYXJ0aXRpb24odGlsZSk7CiAgICAgICAgY2FzZSAiZGlzayI6CiAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJEaXNrKHRpbGUpOwogICAgICAgIGNhc2UgInRleHQiOgogICAgICAgICAgcmV0dXJuIGIyYAogICAgICAgICAgPGRpdiBjbGFzcz0idGV4dC12YWx1ZSIgc3R5bGU9IiR7dGlsZS5jb2xvciA/IGBjb2xvcjogJHt0aWxlLmNvbG9yfWAgOiAiIn0iPgogICAgICAgICAgICAke3RpbGUudmFsdWV9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gYjJgPGRpdiBjbGFzcz0idGlsZS12YWx1ZSI+JHt0aWxlLnZhbHVlfTwvZGl2PmA7CiAgICAgIH0KICAgIH0KICAgIHJlbmRlckdhdWdlKHRpbGUpIHsKICAgICAgY29uc3QgdmFsdWUyID0gdHlwZW9mIHRpbGUudmFsdWUgPT09ICJudW1iZXIiID8gdGlsZS52YWx1ZSA6IHBhcnNlRmxvYXQodGlsZS52YWx1ZSk7CiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aWxlLmdhdWdlT3B0aW9ucyB8fCB7IG1pbjogMCwgbWF4OiAxMDAgfTsKICAgICAgY29uc3QgcGVyY2VudGFnZSA9ICh2YWx1ZTIgLSBvcHRpb25zLm1pbikgLyAob3B0aW9ucy5tYXggLSBvcHRpb25zLm1pbikgKiAxMDA7CiAgICAgIGNvbnN0IHdpZHRoID0gMTIwOwogICAgICBjb25zdCBoZWlnaHQgPSA3MDsKICAgICAgY29uc3Qgc3Ryb2tlV2lkdGggPSA2OwogICAgICBjb25zdCBwYWRkaW5nID0gc3Ryb2tlV2lkdGggLyAyICsgMjsKICAgICAgY29uc3QgcmFkaXVzID0gNDA7CiAgICAgIGNvbnN0IGNlbnRlclggPSB3aWR0aCAvIDI7CiAgICAgIGNvbnN0IGNlbnRlclkgPSBoZWlnaHQgLSBwYWRkaW5nOwogICAgICBjb25zdCBzdGFydFggPSBjZW50ZXJYIC0gcmFkaXVzOwogICAgICBjb25zdCBzdGFydFkgPSBjZW50ZXJZOwogICAgICBjb25zdCBlbmRYID0gY2VudGVyWCArIHJhZGl1czsKICAgICAgY29uc3QgZW5kWSA9IGNlbnRlclk7CiAgICAgIGNvbnN0IGFyY1BhdGggPSBgTSAke3N0YXJ0WH0gJHtzdGFydFl9IEEgJHtyYWRpdXN9ICR7cmFkaXVzfSAwIDAgMSAke2VuZFh9ICR7ZW5kWX1gOwogICAgICBjb25zdCBjaXJjdW1mZXJlbmNlID0gTWF0aC5QSSAqIHJhZGl1czsKICAgICAgY29uc3Qgc3Ryb2tlRGFzaG9mZnNldCA9IGNpcmN1bWZlcmVuY2UgLSBjaXJjdW1mZXJlbmNlICogcGVyY2VudGFnZSAvIDEwMDsKICAgICAgbGV0IHN0cm9rZUNvbG9yID0gdGlsZS5jb2xvciB8fCBjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgMjguOCUpIiwgImhzbCgyMTAgNDAlIDc4JSkiKTsKICAgICAgaWYgKG9wdGlvbnMudGhyZXNob2xkcykgewogICAgICAgIGNvbnN0IHNvcnRlZFRocmVzaG9sZHMgPSBbLi4ub3B0aW9ucy50aHJlc2hvbGRzXS5zb3J0KChhNSwgYjUpID0+IGI1LnZhbHVlIC0gYTUudmFsdWUpOwogICAgICAgIGZvciAoY29uc3QgdGhyZXNob2xkIG9mIHNvcnRlZFRocmVzaG9sZHMpIHsKICAgICAgICAgIGlmICh2YWx1ZTIgPj0gdGhyZXNob2xkLnZhbHVlKSB7CiAgICAgICAgICAgIHN0cm9rZUNvbG9yID0gdGhyZXNob2xkLmNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJnYXVnZS13cmFwcGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJnYXVnZS1jb250YWluZXIiPgogICAgICAgICAgPHN2ZyBjbGFzcz0iZ2F1Z2Utc3ZnIiB2aWV3Qm94PSIwIDAgJHt3aWR0aH0gJHtoZWlnaHR9IiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCBtZWV0Ij4KICAgICAgICAgICAgPCEtLSBCYWNrZ3JvdW5kIGFyYyAtLT4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBjbGFzcz0iZ2F1Z2UtYmFja2dyb3VuZCIKICAgICAgICAgICAgICBkPSIke2FyY1BhdGh9IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8IS0tIEZpbGxlZCBhcmMgLS0+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgY2xhc3M9ImdhdWdlLWZpbGwiCiAgICAgICAgICAgICAgZD0iJHthcmNQYXRofSIKICAgICAgICAgICAgICBzdHJva2U9IiR7c3Ryb2tlQ29sb3J9IgogICAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9IiR7Y2lyY3VtZmVyZW5jZX0iCiAgICAgICAgICAgICAgc3Ryb2tlLWRhc2hvZmZzZXQ9IiR7c3Ryb2tlRGFzaG9mZnNldH0iCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDwhLS0gVmFsdWUgdGV4dCAtLT4KICAgICAgICAgICAgPHRleHQgY2xhc3M9ImdhdWdlLXRleHQiIHg9IiR7Y2VudGVyWH0iIHk9IiR7Y2VudGVyWSAtIDh9IiBkb21pbmFudC1iYXNlbGluZT0ibWlkZGxlIj4KICAgICAgICAgICAgICA8dHNwYW4+JHt2YWx1ZTJ9PC90c3Bhbj4ke3RpbGUudW5pdCA/IGIyYDx0c3BhbiBjbGFzcz0iZ2F1Z2UtdW5pdCIgZHg9IjIiIGR5PSIwIj4ke3RpbGUudW5pdH08L3RzcGFuPmAgOiAiIn0KICAgICAgICAgICAgPC90ZXh0PgogICAgICAgICAgPC9zdmc+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlclBlcmNlbnRhZ2UodGlsZSkgewogICAgICBjb25zdCB2YWx1ZTIgPSB0eXBlb2YgdGlsZS52YWx1ZSA9PT0gIm51bWJlciIgPyB0aWxlLnZhbHVlIDogcGFyc2VGbG9hdCh0aWxlLnZhbHVlKTsKICAgICAgY29uc3QgcGVyY2VudGFnZSA9IE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgdmFsdWUyKSk7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0icGVyY2VudGFnZS13cmFwcGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJwZXJjZW50YWdlLXZhbHVlIj4ke3BlcmNlbnRhZ2V9JTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InBlcmNlbnRhZ2UtYmFyIj4KICAgICAgICAgIDxkaXYgCiAgICAgICAgICAgIGNsYXNzPSJwZXJjZW50YWdlLWZpbGwiIAogICAgICAgICAgICBzdHlsZT0id2lkdGg6ICR7cGVyY2VudGFnZX0lOyAke3RpbGUuY29sb3IgPyBgYmFja2dyb3VuZDogJHt0aWxlLmNvbG9yfWAgOiAiIn0iCiAgICAgICAgICA+PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlclRyZW5kKHRpbGUpIHsKICAgICAgaWYgKCF0aWxlLnRyZW5kRGF0YSB8fCB0aWxlLnRyZW5kRGF0YS5sZW5ndGggPCAyKSB7CiAgICAgICAgcmV0dXJuIGIyYDxkaXYgY2xhc3M9InRpbGUtdmFsdWUiPiR7dGlsZS52YWx1ZX08L2Rpdj5gOwogICAgICB9CiAgICAgIGNvbnN0IGRhdGEgPSB0aWxlLnRyZW5kRGF0YTsKICAgICAgY29uc3QgbWF4MyA9IE1hdGgubWF4KC4uLmRhdGEpOwogICAgICBjb25zdCBtaW4zID0gTWF0aC5taW4oLi4uZGF0YSk7CiAgICAgIGNvbnN0IHJhbmdlMiA9IG1heDMgLSBtaW4zIHx8IDE7CiAgICAgIGNvbnN0IHdpZHRoID0gMzAwOwogICAgICBjb25zdCBoZWlnaHQgPSAzMjsKICAgICAgY29uc3QgcGFkZGluZyA9IDI7CiAgICAgIGNvbnN0IHBvaW50cyA9IGRhdGEubWFwKCh2YWx1ZTIsIGluZGV4MikgPT4gewogICAgICAgIGNvbnN0IHgzID0gaW5kZXgyIC8gKGRhdGEubGVuZ3RoIC0gMSkgKiB3aWR0aDsKICAgICAgICBjb25zdCB5NSA9IHBhZGRpbmcgKyAoaGVpZ2h0IC0gMiAqIHBhZGRpbmcpIC0gKHZhbHVlMiAtIG1pbjMpIC8gcmFuZ2UyICogKGhlaWdodCAtIDIgKiBwYWRkaW5nKTsKICAgICAgICByZXR1cm4gYCR7eDN9LCR7eTV9YDsKICAgICAgfSkuam9pbigiICIpOwogICAgICBjb25zdCBhcmVhUG9pbnRzID0gYDAsJHtoZWlnaHR9ICR7cG9pbnRzfSAke3dpZHRofSwke2hlaWdodH1gOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InRyZW5kLWNvbnRhaW5lciI+CiAgICAgICAgPGRpdiBjbGFzcz0idHJlbmQtaGVhZGVyIj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0cmVuZC12YWx1ZSI+JHt0aWxlLnZhbHVlfTwvc3Bhbj4KICAgICAgICAgICR7dGlsZS51bml0ID8gYjJgPHNwYW4gY2xhc3M9InRyZW5kLXVuaXQiPiR7dGlsZS51bml0fTwvc3Bhbj5gIDogIiJ9CiAgICAgICAgICAke3RpbGUuZGVzY3JpcHRpb24gPyBiMmA8c3BhbiBjbGFzcz0idHJlbmQtbGFiZWwiPiR7dGlsZS5kZXNjcmlwdGlvbn08L3NwYW4+YCA6ICIifQogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InRyZW5kLWdyYXBoIj4KICAgICAgICAgIDxzdmcgY2xhc3M9InRyZW5kLXN2ZyIgdmlld0JveD0iMCAwICR7d2lkdGh9ICR7aGVpZ2h0fSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgICAgICAgICAgIDxwb2x5Z29uIGNsYXNzPSJ0cmVuZC1hcmVhIiBwb2ludHM9IiR7YXJlYVBvaW50c30iIC8+CiAgICAgICAgICAgIDxwb2x5bGluZSBjbGFzcz0idHJlbmQtbGluZSIgcG9pbnRzPSIke3BvaW50c30iIC8+CiAgICAgICAgICA8L3N2Zz4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgcmVuZGVyTXVsdGlQZXJjZW50YWdlKHRpbGUpIHsKICAgICAgaWYgKCF0aWxlLnBlcmNlbnRhZ2VzIHx8IHRpbGUucGVyY2VudGFnZXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIGIyYDxkaXYgY2xhc3M9InRpbGUtdmFsdWUiPiR7dGlsZS52YWx1ZX08L2Rpdj5gOwogICAgICB9CiAgICAgIGNvbnN0IGl0ZW1zID0gdGlsZS5wZXJjZW50YWdlcy5zbGljZSgwLCAzKTsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJtdWx0aS1wZXJjZW50YWdlLXdyYXBwZXIiPgogICAgICAgIDxkaXYgY2xhc3M9Im11bHRpLXBlcmNlbnRhZ2UtaXRlbXMiPgogICAgICAgICAgJHtpdGVtcy5tYXAoKGl0ZW0pID0+IHsKICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCBpdGVtLnZhbHVlKSk7CiAgICAgICAgcmV0dXJuIGIyYAogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im11bHRpLXBlcmNlbnRhZ2UtaXRlbSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtdWx0aS1wZXJjZW50YWdlLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtdWx0aS1wZXJjZW50YWdlLWxhYmVsIj4ke2l0ZW0ubGFiZWx9PC9zcGFuPgogICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibXVsdGktcGVyY2VudGFnZS12YWx1ZSI+JHtwZXJjZW50YWdlfSU8L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im11bHRpLXBlcmNlbnRhZ2UtYmFyIj4KICAgICAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJtdWx0aS1wZXJjZW50YWdlLWZpbGwiCiAgICAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAke3BlcmNlbnRhZ2V9JTsgJHtpdGVtLmNvbG9yID8gYGJhY2tncm91bmQ6ICR7aXRlbS5jb2xvcn1gIDogIiJ9IgogICAgICAgICAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYDsKICAgICAgfSl9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlckNwdUNvcmVzKHRpbGUpIHsKICAgICAgaWYgKCF0aWxlLmNvcmVzRGF0YSB8fCB0aWxlLmNvcmVzRGF0YS5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gYjJgPGRpdiBjbGFzcz0idGlsZS12YWx1ZSI+JHt0aWxlLnZhbHVlfTwvZGl2PmA7CiAgICAgIH0KICAgICAgY29uc3QgY29yZXMgPSB0aWxlLmNvcmVzRGF0YTsKICAgICAgY29uc3QgYXZnVXNhZ2UgPSBNYXRoLnJvdW5kKGNvcmVzLnJlZHVjZSgoc3VtLCBjb3JlMikgPT4gc3VtICsgY29yZTIudXNhZ2UsIDApIC8gY29yZXMubGVuZ3RoKTsKICAgICAgY29uc3QgZ2V0Q29sb3JDbGFzcyA9ICh1c2FnZSkgPT4gewogICAgICAgIGlmICh1c2FnZSA8IDUwKQogICAgICAgICAgcmV0dXJuICJsb3ciOwogICAgICAgIGlmICh1c2FnZSA8IDgwKQogICAgICAgICAgcmV0dXJuICJtZWRpdW0iOwogICAgICAgIHJldHVybiAiaGlnaCI7CiAgICAgIH07CiAgICAgIGNvbnN0IG1heEJhcnNXaWR0aCA9IGNvcmVzLmxlbmd0aCAqIDI0ICsgKGNvcmVzLmxlbmd0aCAtIDEpICogMzsKICAgICAgY29uc3QgY29sdW1uU3BhbiA9IHRpbGUuY29sdW1uU3BhbiB8fCAxOwogICAgICBjb25zdCBlc3RpbWF0ZWRUaWxlV2lkdGggPSB0aGlzLm1pblRpbGVXaWR0aCAqIGNvbHVtblNwYW4gKyAoY29sdW1uU3BhbiAtIDEpICogdGhpcy5nYXAgLSAzMjsKICAgICAgY29uc3Qgc2hvdWxkQ2VudGVyID0gbWF4QmFyc1dpZHRoIDwgZXN0aW1hdGVkVGlsZVdpZHRoICogMC42NjY7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iY3B1LWNvcmVzLXdyYXBwZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImNwdS1jb3Jlcy1oZWFkZXIiPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImNwdS1jb3Jlcy12YWx1ZSI+JHthdmdVc2FnZX08L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iY3B1LWNvcmVzLXVuaXQiPiU8L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iY3B1LWNvcmVzLWxhYmVsIj4ke2NvcmVzLmxlbmd0aH0gY29yZXM8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY3B1LWNvcmVzLWJhcnMgJHtzaG91bGRDZW50ZXIgPyAiY2VudGVyZWQiIDogIiJ9Ij4KICAgICAgICAgICR7Y29yZXMubWFwKChjb3JlMikgPT4gewogICAgICAgIGNvbnN0IHVzYWdlID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCBjb3JlMi51c2FnZSkpOwogICAgICAgIGNvbnN0IGNvbG9yQ2xhc3MgPSBnZXRDb2xvckNsYXNzKHVzYWdlKTsKICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY3B1LWNvcmUtYmFyLWNvbnRhaW5lciIgdGl0bGU9IkNvcmUgJHtjb3JlMi5sYWJlbCB8fCBjb3JlMi5pZH06ICR7dXNhZ2V9JSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjcHUtY29yZS1iYXItd3JhcHBlciI+CiAgICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgICBjbGFzcz0iY3B1LWNvcmUtYmFyLWZpbGwgJHtjb2xvckNsYXNzfSIKICAgICAgICAgICAgICAgICAgICBzdHlsZT0iaGVpZ2h0OiAke3VzYWdlfSUiCiAgICAgICAgICAgICAgICAgID48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgJHtjb3Jlcy5sZW5ndGggPD0gMTYgPyBiMmAKICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNwdS1jb3JlLWxhYmVsIj4ke2NvcmUyLmxhYmVsIHx8IGNvcmUyLmlkfTwvc3Bhbj4KICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYDsKICAgICAgfSl9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGZvcm1hdEJ5dGVzKGJ5dGVzKSB7CiAgICAgIGlmIChieXRlcyA9PT0gMCkKICAgICAgICByZXR1cm4gIjAgQiI7CiAgICAgIGNvbnN0IGs0ID0gMTAyNDsKICAgICAgY29uc3Qgc2l6ZXMgPSBbIkIiLCAiS0IiLCAiTUIiLCAiR0IiLCAiVEIiLCAiUEIiXTsKICAgICAgY29uc3QgaTExID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrNCkpOwogICAgICByZXR1cm4gcGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrNCwgaTExKSkudG9GaXhlZCgxKSkgKyAiICIgKyBzaXplc1tpMTFdOwogICAgfQogICAgcmVuZGVyUGFydGl0aW9uKHRpbGUpIHsKICAgICAgaWYgKCF0aWxlLnBhcnRpdGlvbkRhdGEpIHsKICAgICAgICByZXR1cm4gYjJgPGRpdiBjbGFzcz0idGlsZS12YWx1ZSI+JHt0aWxlLnZhbHVlfTwvZGl2PmA7CiAgICAgIH0KICAgICAgY29uc3QgeyB1c2VkLCB0b3RhbCwgZmlsZXN5c3RlbSwgbW91bnRQb2ludCB9ID0gdGlsZS5wYXJ0aXRpb25EYXRhOwogICAgICBjb25zdCBwZXJjZW50YWdlID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCB1c2VkIC8gdG90YWwgKiAxMDApKTsKICAgICAgY29uc3QgZnJlZSA9IHRvdGFsIC0gdXNlZDsKICAgICAgY29uc3QgZ2V0Q29sb3JDbGFzcyA9ICgpID0+IHsKICAgICAgICBpZiAocGVyY2VudGFnZSA+PSA5MCkKICAgICAgICAgIHJldHVybiAiY3JpdGljYWwiOwogICAgICAgIGlmIChwZXJjZW50YWdlID49IDc1KQogICAgICAgICAgcmV0dXJuICJ3YXJuaW5nIjsKICAgICAgICByZXR1cm4gIiI7CiAgICAgIH07CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0icGFydGl0aW9uLXdyYXBwZXIiPgogICAgICAgIDxkaXYgY2xhc3M9InBhcnRpdGlvbi1oZWFkZXIiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InBhcnRpdGlvbi1wZXJjZW50YWdlIj4ke01hdGgucm91bmQocGVyY2VudGFnZSl9JTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJwYXJ0aXRpb24tYmFyIj4KICAgICAgICAgIDxkaXYKICAgICAgICAgICAgY2xhc3M9InBhcnRpdGlvbi1iYXItZmlsbCAke2dldENvbG9yQ2xhc3MoKX0iCiAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogJHtwZXJjZW50YWdlfSUiCiAgICAgICAgICA+PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0icGFydGl0aW9uLXN0YXRzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InBhcnRpdGlvbi1zdGF0Ij4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InBhcnRpdGlvbi1zdGF0LWxhYmVsIj5Vc2VkPC9zcGFuPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0icGFydGl0aW9uLXN0YXQtdmFsdWUiPiR7dGhpcy5mb3JtYXRCeXRlcyh1c2VkKX08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InBhcnRpdGlvbi1zdGF0Ij4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InBhcnRpdGlvbi1zdGF0LWxhYmVsIj5GcmVlPC9zcGFuPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0icGFydGl0aW9uLXN0YXQtdmFsdWUiPiR7dGhpcy5mb3JtYXRCeXRlcyhmcmVlKX08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJwYXJ0aXRpb24tbWV0YSI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0icGFydGl0aW9uLWZpbGVzeXN0ZW0iPiR7ZmlsZXN5c3RlbX08L3NwYW4+CiAgICAgICAgICAke21vdW50UG9pbnQgPyBiMmA8c3BhbiBjbGFzcz0icGFydGl0aW9uLW1vdW50cG9pbnQiPiR7bW91bnRQb2ludH08L3NwYW4+YCA6ICIifQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJEaXNrKHRpbGUpIHsKICAgICAgaWYgKCF0aWxlLmRpc2tEYXRhKSB7CiAgICAgICAgcmV0dXJuIGIyYDxkaXYgY2xhc3M9InRpbGUtdmFsdWUiPiR7dGlsZS52YWx1ZX08L2Rpdj5gOwogICAgICB9CiAgICAgIGNvbnN0IHsgY2FwYWNpdHksIG1vZGVsLCB0eXBlOiB0eXBlNSwgaW9wcywgaGVhbHRoIH0gPSB0aWxlLmRpc2tEYXRhOwogICAgICBjb25zdCBnZXRIZWFsdGhDbGFzcyA9ICh2YWx1ZTIpID0+IHsKICAgICAgICBpZiAodmFsdWUyID49IDcwKQogICAgICAgICAgcmV0dXJuICJnb29kIjsKICAgICAgICBpZiAodmFsdWUyID49IDMwKQogICAgICAgICAgcmV0dXJuICJ3YXJuaW5nIjsKICAgICAgICByZXR1cm4gImNyaXRpY2FsIjsKICAgICAgfTsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJkaXNrLXdyYXBwZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImRpc2stY2FwYWNpdHkiPiR7dGhpcy5mb3JtYXRCeXRlcyhjYXBhY2l0eSl9PC9kaXY+CiAgICAgICAgJHttb2RlbCB8fCB0eXBlNSA/IGIyYAogICAgICAgICAgPGRpdiBjbGFzcz0iZGlzay1tb2RlbCI+CiAgICAgICAgICAgICR7bW9kZWwgPyBiMmA8c3Bhbj4ke21vZGVsfTwvc3Bhbj5gIDogIiJ9CiAgICAgICAgICAgICR7dHlwZTUgPyBiMmA8c3BhbiBjbGFzcz0iZGlzay10eXBlLWJhZGdlIj4ke3R5cGU1fTwvc3Bhbj5gIDogIiJ9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgIDogIiJ9CiAgICAgICAgPGRpdiBjbGFzcz0iZGlzay1tZXRyaWNzIj4KICAgICAgICAgICR7aW9wcyA/IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaXNrLWlvcHMiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpc2staW9wcy1pdGVtIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkaXNrLWlvcHMtbGFiZWwiPlJlYWQ8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGlzay1pb3BzLXZhbHVlIj4ke2lvcHMucmVhZC50b0xvY2FsZVN0cmluZygpfTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaXNrLWlvcHMtaXRlbSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGlzay1pb3BzLWxhYmVsIj5Xcml0ZTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkaXNrLWlvcHMtdmFsdWUiPiR7aW9wcy53cml0ZS50b0xvY2FsZVN0cmluZygpfTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAke2hlYWx0aCAhPT0gdm9pZCAwID8gYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpc2staGVhbHRoIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaXNrLWhlYWx0aC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRpc2staGVhbHRoLWxhYmVsIj5IZWFsdGg8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGlzay1oZWFsdGgtdmFsdWUiPiR7aGVhbHRofSU8L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlzay1oZWFsdGgtYmFyIj4KICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgY2xhc3M9ImRpc2staGVhbHRoLWZpbGwgJHtnZXRIZWFsdGhDbGFzcyhoZWFsdGgpfSIKICAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAke2hlYWx0aH0lIgogICAgICAgICAgICAgICAgPjwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGAgOiAiIn0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgaGFuZGxlR3JpZEFjdGlvbihhY3Rpb24pIHsKICAgICAgaWYgKGFjdGlvbi5hY3Rpb24pIHsKICAgICAgICBhd2FpdCBhY3Rpb24uYWN0aW9uKCk7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGhhbmRsZVRpbGVBY3Rpb24oYWN0aW9uLCBfdGlsZSkgewogICAgICBpZiAoYWN0aW9uLmFjdGlvbikgewogICAgICAgIGF3YWl0IGFjdGlvbi5hY3Rpb24oKTsKICAgICAgfQogICAgfQogICAgc2hvd0NvbnRleHRNZW51KGV2ZW50LCB0aWxlKSB7CiAgICAgIGlmICghdGlsZS5hY3Rpb25zIHx8IHRpbGUuYWN0aW9ucy5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuOwogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB0aGlzLmNvbnRleHRNZW51UG9zaXRpb24gPSB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfTsKICAgICAgdGhpcy5jb250ZXh0TWVudUFjdGlvbnMgPSB0aWxlLmFjdGlvbnM7CiAgICAgIHRoaXMuY29udGV4dE1lbnVWaXNpYmxlID0gdHJ1ZTsKICAgICAgY29uc3QgY2xvc2VIYW5kbGVyID0gKCkgPT4gewogICAgICAgIHRoaXMuY29udGV4dE1lbnVWaXNpYmxlID0gZmFsc2U7CiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBjbG9zZUhhbmRsZXIpOwogICAgICB9OwogICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGNsb3NlSGFuZGxlcik7CiAgICAgIH0sIDEwMCk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczM2KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzU3RhdHNHcmlkMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtYXBwdWkvZGVlcy1hcHB1aS9kZWVzLWFwcHVpLmRlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIF9fZXNEZWNvcmF0ZTM2ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMzNyA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVtb0Rhc2hib2FyZFZpZXcgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZW1vLWRhc2hib2FyZC12aWV3IildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfYWN0aXZhdGVkX2RlY29yYXRvcnM7CiAgbGV0IF9hY3RpdmF0ZWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY3RpdmF0ZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVtb0Rhc2hib2FyZFZpZXcyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfYWN0aXZhdGVkX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTM2KHRoaXMsIG51bGwsIF9hY3RpdmF0ZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYWN0aXZhdGVkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhY3RpdmF0ZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWN0aXZhdGVkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hY3RpdmF0ZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYWN0aXZhdGVkX2luaXRpYWxpemVycywgX2FjdGl2YXRlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM2KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVtb0Rhc2hib2FyZFZpZXcyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgICAgX19ydW5Jbml0aWFsaXplcnMzNyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICAjYWN0aXZhdGVkX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczM3KHRoaXMsIF9hY3RpdmF0ZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSk7CiAgICBnZXQgYWN0aXZhdGVkKCkgewogICAgICByZXR1cm4gdGhpcy4jYWN0aXZhdGVkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYWN0aXZhdGVkKHZhbHVlMikgewogICAgICB0aGlzLiNhY3RpdmF0ZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGN0eCA9IF9fcnVuSW5pdGlhbGl6ZXJzMzcodGhpcywgX2FjdGl2YXRlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICBzdGF0c1RpbGVzID0gWwogICAgICB7CiAgICAgICAgaWQ6ICJ1c2VycyIsCiAgICAgICAgdGl0bGU6ICJBY3RpdmUgVXNlcnMiLAogICAgICAgIHZhbHVlOiAxMjM0LAogICAgICAgIHR5cGU6ICJudW1iZXIiLAogICAgICAgIGljb246ICJsdWNpZGU6dXNlcnMiLAogICAgICAgIGRlc2NyaXB0aW9uOiAiT25saW5lIG5vdyIsCiAgICAgICAgY29sb3I6ICIjMjJjNTVlIgogICAgICB9LAogICAgICB7CiAgICAgICAgaWQ6ICJhcGktY2FsbHMiLAogICAgICAgIHRpdGxlOiAiQVBJIENhbGxzIiwKICAgICAgICB2YWx1ZTogNDUyMDAsCiAgICAgICAgdHlwZTogInRyZW5kIiwKICAgICAgICBpY29uOiAibHVjaWRlOmFjdGl2aXR5IiwKICAgICAgICBkZXNjcmlwdGlvbjogIisxMiUgZnJvbSBsYXN0IGhvdXIiLAogICAgICAgIGNvbG9yOiAiIzNiODJmNiIsCiAgICAgICAgdHJlbmREYXRhOiBbMzJlMywgMzVlMywgMzhlMywgNDFlMywgMzllMywgNDJlMywgNDUyMDBdCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpZDogImhlYWx0aCIsCiAgICAgICAgdGl0bGU6ICJTeXN0ZW0gSGVhbHRoIiwKICAgICAgICB2YWx1ZTogOTkuOSwKICAgICAgICB1bml0OiAiJSIsCiAgICAgICAgdHlwZTogImdhdWdlIiwKICAgICAgICBpY29uOiAibHVjaWRlOmhlYXJ0LXB1bHNlIiwKICAgICAgICBkZXNjcmlwdGlvbjogIkFsbCBzeXN0ZW1zIG9wZXJhdGlvbmFsIiwKICAgICAgICBjb2xvcjogIiMxMGI5ODEiLAogICAgICAgIGdhdWdlT3B0aW9uczogewogICAgICAgICAgbWluOiAwLAogICAgICAgICAgbWF4OiAxMDAsCiAgICAgICAgICB0aHJlc2hvbGRzOiBbCiAgICAgICAgICAgIHsgdmFsdWU6IDgwLCBjb2xvcjogIiNlZjQ0NDQiIH0sCiAgICAgICAgICAgIHsgdmFsdWU6IDk1LCBjb2xvcjogIiNmNTllMGIiIH0sCiAgICAgICAgICAgIHsgdmFsdWU6IDEwMCwgY29sb3I6ICIjMTBiOTgxIiB9CiAgICAgICAgICBdCiAgICAgICAgfQogICAgICB9LAogICAgICB7CiAgICAgICAgaWQ6ICJyZXNwb25zZSIsCiAgICAgICAgdGl0bGU6ICJBdmcgUmVzcG9uc2UiLAogICAgICAgIHZhbHVlOiAxMjcsCiAgICAgICAgdW5pdDogIm1zIiwKICAgICAgICB0eXBlOiAibnVtYmVyIiwKICAgICAgICBpY29uOiAibHVjaWRlOnRpbWVyIiwKICAgICAgICBkZXNjcmlwdGlvbjogIi0xNW1zIGZyb20geWVzdGVyZGF5IiwKICAgICAgICBjb2xvcjogIiM4YjVjZjYiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpZDogInJlc291cmNlcyIsCiAgICAgICAgdGl0bGU6ICJSZXNvdXJjZSBVc2FnZSIsCiAgICAgICAgdmFsdWU6ICIiLAogICAgICAgIHR5cGU6ICJtdWx0aVBlcmNlbnRhZ2UiLAogICAgICAgIGljb246ICJsdWNpZGU6c2VydmVyIiwKICAgICAgICBwZXJjZW50YWdlczogWwogICAgICAgICAgeyBsYWJlbDogIkNQVSIsIHZhbHVlOiA2NywgY29sb3I6ICIjM2I4MmY2IiB9LAogICAgICAgICAgeyBsYWJlbDogIk1lbW9yeSIsIHZhbHVlOiA4NCwgY29sb3I6ICIjOGI1Y2Y2IiB9LAogICAgICAgICAgeyBsYWJlbDogIkRpc2siLCB2YWx1ZTogNDUsIGNvbG9yOiAiIzEwYjk4MSIgfQogICAgICAgIF0KICAgICAgfSwKICAgICAgewogICAgICAgIGlkOiAicmVxdWVzdHMiLAogICAgICAgIHRpdGxlOiAiUmVxdWVzdHMvc2VjIiwKICAgICAgICB2YWx1ZTogMTg1MCwKICAgICAgICB0eXBlOiAidHJlbmQiLAogICAgICAgIGljb246ICJsdWNpZGU6emFwIiwKICAgICAgICBkZXNjcmlwdGlvbjogIkN1cnJlbnQgdGhyb3VnaHB1dCIsCiAgICAgICAgY29sb3I6ICIjMDZiNmQ0IiwKICAgICAgICB0cmVuZERhdGE6IFsxMjAwLCAxNDAwLCAxMzUwLCAxNjAwLCAxNzUwLCAxNjgwLCAxODUwXQogICAgICB9CiAgICBdOwogICAgb25BY3RpdmF0ZShjb250ZXh0MikgewogICAgICB0aGlzLmN0eCA9IGNvbnRleHQyOwogICAgICB0aGlzLmFjdGl2YXRlZCA9IHRydWU7CiAgICAgIGNvbnNvbGUubG9nKCJEYXNoYm9hcmQgYWN0aXZhdGVkIHdpdGggY29udGV4dDoiLCBjb250ZXh0Mik7CiAgICAgIGNvbnRleHQyLmFwcHVpLnNldFNlY29uZGFyeU1lbnUoewogICAgICAgIGhlYWRpbmc6ICJEYXNoYm9hcmQiLAogICAgICAgIGdyb3VwczogWwogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiUXVpY2sgQWNjZXNzIiwKICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6emFwIiwKICAgICAgICAgICAgaXRlbXM6IFsKICAgICAgICAgICAgICB7IGtleTogIk92ZXJ2aWV3IiwgaWNvbk5hbWU6ICJsYXlvdXREYXNoYm9hcmQiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJPdmVydmlldyIpIH0sCiAgICAgICAgICAgICAgeyBrZXk6ICJSZWNlbnQiLCBpY29uTmFtZTogImNsb2NrIiwgYmFkZ2U6IDUsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIlJlY2VudCIpIH0sCiAgICAgICAgICAgICAgeyB0eXBlOiAiZGl2aWRlciIgfSwKICAgICAgICAgICAgICB7IHR5cGU6ICJhY3Rpb24iLCBrZXk6ICJSZWZyZXNoIERhdGEiLCBpY29uTmFtZTogImx1Y2lkZTpyZWZyZXNoQ3ciLCBhY3Rpb246ICgpID0+IGFsZXJ0KCJSZWZyZXNoaW5nIGRhc2hib2FyZCBkYXRhLi4uIikgfQogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiRmlsdGVycyIsCiAgICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmZpbHRlciIsCiAgICAgICAgICAgIGl0ZW1zOiBbCiAgICAgICAgICAgICAgeyB0eXBlOiAiaGVhZGVyIiwgbGFiZWw6ICJUaW1lIFJhbmdlIiB9LAogICAgICAgICAgICAgIHsgdHlwZTogImZpbHRlciIsIGtleTogIkxpdmUgVXBkYXRlcyIsIGljb25OYW1lOiAibHVjaWRlOnJhZGlvIiwgYWN0aXZlOiB0cnVlLCBvblRvZ2dsZTogKGFjdGl2ZSkgPT4gY29uc29sZS5sb2coIkxpdmUgdXBkYXRlczoiLCBhY3RpdmUpIH0sCiAgICAgICAgICAgICAgeyB0eXBlOiAiZmlsdGVyIiwga2V5OiAiU2hvdyBBcmNoaXZlZCIsIGljb25OYW1lOiAibHVjaWRlOmFyY2hpdmUiLCBhY3RpdmU6IGZhbHNlLCBvblRvZ2dsZTogKGFjdGl2ZSkgPT4gY29uc29sZS5sb2coIlNob3cgYXJjaGl2ZWQ6IiwgYWN0aXZlKSB9LAogICAgICAgICAgICAgIHsgdHlwZTogImRpdmlkZXIiIH0sCiAgICAgICAgICAgICAgeyB0eXBlOiAibXVsdGlGaWx0ZXIiLCBrZXk6ICJEYXRhIFNvdXJjZXMiLCBpY29uTmFtZTogImx1Y2lkZTpkYXRhYmFzZSIsIG9wdGlvbnM6IFsKICAgICAgICAgICAgICAgIHsga2V5OiAiYXBpIiwgbGFiZWw6ICJBUEkgU2VydmVyIiwgY2hlY2tlZDogdHJ1ZSwgaWNvbk5hbWU6ICJsdWNpZGU6c2VydmVyIiB9LAogICAgICAgICAgICAgICAgeyBrZXk6ICJ3ZWIiLCBsYWJlbDogIldlYiBUcmFmZmljIiwgY2hlY2tlZDogdHJ1ZSwgaWNvbk5hbWU6ICJsdWNpZGU6Z2xvYmUiIH0sCiAgICAgICAgICAgICAgICB7IGtleTogIm1vYmlsZSIsIGxhYmVsOiAiTW9iaWxlIEFwcCIsIGNoZWNrZWQ6IGZhbHNlLCBpY29uTmFtZTogImx1Y2lkZTpzbWFydHBob25lIiB9CiAgICAgICAgICAgICAgXSwgb25DaGFuZ2U6IChrZXlzMikgPT4gY29uc29sZS5sb2coIkRhdGEgc291cmNlczoiLCBrZXlzMikgfQogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiQW5hbHl0aWNzIiwKICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6YmFyQ2hhcnQzIiwKICAgICAgICAgICAgaXRlbXM6IFsKICAgICAgICAgICAgICB7IGtleTogIk1ldHJpY3MiLCBpY29uTmFtZTogImFjdGl2aXR5IiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiTWV0cmljcyIpIH0sCiAgICAgICAgICAgICAgeyBrZXk6ICJSZXBvcnRzIiwgaWNvbk5hbWU6ICJmaWxlVGV4dCIsIGJhZGdlOiAibmV3IiwgYmFkZ2VWYXJpYW50OiAic3VjY2VzcyIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIlJlcG9ydHMiKSB9LAogICAgICAgICAgICAgIHsgdHlwZTogImRpdmlkZXIiIH0sCiAgICAgICAgICAgICAgeyB0eXBlOiAibGluayIsIGtleTogIkFuYWx5dGljcyBEb2NzIiwgaWNvbk5hbWU6ICJsdWNpZGU6ZXh0ZXJuYWxMaW5rIiwgaHJlZjogImh0dHBzOi8vZG9jcy5leGFtcGxlLmNvbS9hbmFseXRpY3MiIH0KICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfSk7CiAgICAgIGNvbnRleHQyLmFwcHVpLnNldENvbnRlbnRUYWJzKFsKICAgICAgICB7IGtleTogIk92ZXJ2aWV3IiwgaWNvbk5hbWU6ICJsdWNpZGU6bGF5b3V0RGFzaGJvYXJkIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiT3ZlcnZpZXcgdGFiIikgfSwKICAgICAgICB7IGtleTogIkFuYWx5dGljcyIsIGljb25OYW1lOiAibHVjaWRlOmJhckNoYXJ0IiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiQW5hbHl0aWNzIHRhYiIpIH0sCiAgICAgICAgeyBrZXk6ICJSZXBvcnRzIiwgaWNvbk5hbWU6ICJsdWNpZGU6ZmlsZVRleHQiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJSZXBvcnRzIHRhYiIpIH0KICAgICAgXSk7CiAgICB9CiAgICBvbkRlYWN0aXZhdGUoKSB7CiAgICAgIHRoaXMuYWN0aXZhdGVkID0gZmFsc2U7CiAgICAgIGNvbnNvbGUubG9nKCJEYXNoYm9hcmQgZGVhY3RpdmF0ZWQiKTsKICAgIH0KICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8c3R5bGU+CiAgICAgICAgOmhvc3QgewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwYWRkaW5nOiA0MHB4OwogICAgICAgICAgY29sb3I6ICNhM2EzYTM7CiAgICAgICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCAnSW50ZXInLCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmOwogICAgICAgIH0KICAgICAgICBoMSB7IGNvbG9yOiAjZmFmYWZhOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDI0cHg7IG1hcmdpbi1ib3R0b206IDhweDsgfQogICAgICAgIHAgeyBjb2xvcjogIzczNzM3MzsgbWFyZ2luLWJvdHRvbTogMzJweDsgfQogICAgICAgIGRlZXMtc3RhdHNncmlkIHsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDMycHg7CiAgICAgICAgfQoKICAgICAgICAuY3R4LWFjdGlvbnMgewogICAgICAgICAgbWFyZ2luLXRvcDogMzJweDsKICAgICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMDIpOwogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjA4KTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICB9CiAgICAgICAgLmN0eC1hY3Rpb25zIGgyIHsgY29sb3I6ICNmYWZhZmE7IGZvbnQtc2l6ZTogMTZweDsgZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogMTZweDsgfQogICAgICAgIC5idXR0b24tZ3JpZCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgfQogICAgICAgIC5jdHgtYnRuIHsKICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoNTksIDEzMCwgMjQ2LCAwLjEpOwogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1OSwgMTMwLCAyNDYsIDAuMyk7CiAgICAgICAgICBjb2xvcjogIzYwYTVmYTsKICAgICAgICAgIHBhZGRpbmc6IDhweCAxNnB4OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgfQogICAgICAgIC5jdHgtYnRuOmhvdmVyIHsKICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoNTksIDEzMCwgMjQ2LCAwLjIpOwogICAgICAgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDU5LCAxMzAsIDI0NiwgMC41KTsKICAgICAgICB9CiAgICAgICAgLmN0eC1idG4uZGFuZ2VyIHsKICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjM5LCA2OCwgNjgsIDAuMSk7CiAgICAgICAgICBib3JkZXItY29sb3I6IHJnYmEoMjM5LCA2OCwgNjgsIDAuMyk7CiAgICAgICAgICBjb2xvcjogI2Y4NzE3MTsKICAgICAgICB9CiAgICAgICAgLmN0eC1idG4uZGFuZ2VyOmhvdmVyIHsKICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjM5LCA2OCwgNjgsIDAuMik7CiAgICAgICAgICBib3JkZXItY29sb3I6IHJnYmEoMjM5LCA2OCwgNjgsIDAuNSk7CiAgICAgICAgfQogICAgICAgIC5jdHgtYnRuLnN1Y2Nlc3MgewogICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgzNCwgMTk3LCA5NCwgMC4xKTsKICAgICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgzNCwgMTk3LCA5NCwgMC4zKTsKICAgICAgICAgIGNvbG9yOiAjNGFkZTgwOwogICAgICAgIH0KICAgICAgICAuY3R4LWJ0bi5zdWNjZXNzOmhvdmVyIHsKICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzQsIDE5NywgOTQsIDAuMik7CiAgICAgICAgICBib3JkZXItY29sb3I6IHJnYmEoMzQsIDE5NywgOTQsIDAuNSk7CiAgICAgICAgfQogICAgICA8L3N0eWxlPgogICAgICA8aDE+RGFzaGJvYXJkPC9oMT4KICAgICAgPHA+V2VsY29tZSBiYWNrISBIZXJlJ3MgYW4gb3ZlcnZpZXcgb2YgeW91ciBzeXN0ZW0uPC9wPgogICAgICA8ZGVlcy1zdGF0c2dyaWQKICAgICAgICAudGlsZXM9JHt0aGlzLnN0YXRzVGlsZXN9CiAgICAgICAgQHRpbGUtYWN0aW9uPSR7KGUxMSkgPT4gY29uc29sZS5sb2coIlRpbGUgYWN0aW9uOiIsIGUxMS5kZXRhaWwpfQogICAgICA+PC9kZWVzLXN0YXRzZ3JpZD4KCiAgICAgIDxkaXYgY2xhc3M9ImN0eC1hY3Rpb25zIj4KICAgICAgICA8aDI+Q29udGV4dCBBY3Rpb25zIChjdHguYXBwdWkpPC9oMj4KICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JpZCI+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdHgtYnRuIiBAY2xpY2s9JHsoKSA9PiB0aGlzLmN0eD8uYXBwdWkuc2V0TWFpbk1lbnVWaXNpYmxlKGZhbHNlKX0+SGlkZSBNYWluIE1lbnU8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0eC1idG4gc3VjY2VzcyIgQGNsaWNrPSR7KCkgPT4gdGhpcy5jdHg/LmFwcHVpLnNldE1haW5NZW51VmlzaWJsZSh0cnVlKX0+U2hvdyBNYWluIE1lbnU8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0eC1idG4iIEBjbGljaz0keygpID0+IHRoaXMuY3R4Py5hcHB1aS5zZXRTZWNvbmRhcnlNZW51VmlzaWJsZShmYWxzZSl9PkhpZGUgU2Vjb25kYXJ5IE1lbnU8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0eC1idG4gc3VjY2VzcyIgQGNsaWNrPSR7KCkgPT4gdGhpcy5jdHg/LmFwcHVpLnNldFNlY29uZGFyeU1lbnVWaXNpYmxlKHRydWUpfT5TaG93IFNlY29uZGFyeSBNZW51PC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdHgtYnRuIiBAY2xpY2s9JHsoKSA9PiB0aGlzLmN0eD8uYXBwdWkuc2V0Q29udGVudFRhYnNWaXNpYmxlKGZhbHNlKX0+SGlkZSBDb250ZW50IFRhYnM8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0eC1idG4gc3VjY2VzcyIgQGNsaWNrPSR7KCkgPT4gdGhpcy5jdHg/LmFwcHVpLnNldENvbnRlbnRUYWJzVmlzaWJsZSh0cnVlKX0+U2hvdyBDb250ZW50IFRhYnM8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0eC1idG4iIEBjbGljaz0keygpID0+IHRoaXMuY3R4Py5hcHB1aS5zZXRNYWluTWVudUNvbGxhcHNlZCh0cnVlKX0+Q29sbGFwc2UgTWFpbiBNZW51PC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdHgtYnRuIHN1Y2Nlc3MiIEBjbGljaz0keygpID0+IHRoaXMuY3R4Py5hcHB1aS5zZXRNYWluTWVudUNvbGxhcHNlZChmYWxzZSl9PkV4cGFuZCBNYWluIE1lbnU8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0eC1idG4iIEBjbGljaz0keygpID0+IHRoaXMuY3R4Py5hcHB1aS5zZXRCcmVhZGNydW1icyhbIkRhc2hib2FyZCIsICJPdmVydmlldyIsICJTdGF0cyJdKX0+U2V0IEJyZWFkY3J1bWJzPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdHgtYnRuIiBAY2xpY2s9JHsoKSA9PiB0aGlzLmN0eD8uYXBwdWkubmF2aWdhdGVUb1ZpZXcoInByb2plY3RzIil9PkdvIHRvIFByb2plY3RzPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdHgtYnRuIiBAY2xpY2s9JHsoKSA9PiB0aGlzLmN0eD8uYXBwdWkubmF2aWdhdGVUb1ZpZXcoInNldHRpbmdzIiwgeyBzZWN0aW9uOiAic2VjdXJpdHkiIH0pfT5HbyB0byBTZXR0aW5ncy9TZWN1cml0eTwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY3R4LWJ0biIgQGNsaWNrPSR7KCkgPT4gdGhpcy5jdHg/LmFwcHVpLmFjdGl2aXR5TG9nLmFkZCh7IHR5cGU6ICJjdXN0b20iLCB1c2VyOiAiRGVtbyBVc2VyIiwgbWVzc2FnZTogIkJ1dHRvbiBjbGlja2VkIGZyb20gY3R4ISIsIGljb25OYW1lOiAibHVjaWRlOm1vdXNlLXBvaW50ZXItY2xpY2siIH0pfT5BZGQgQWN0aXZpdHkgRW50cnk8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0eC1idG4iIEBjbGljaz0keygpID0+IHRoaXMuY3R4Py5hcHB1aS5zZXRNYWluTWVudUJhZGdlKCJ0YXNrcyIsIDk5KX0+U2V0IFRhc2tzIEJhZGdlIHRvIDk5PC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdHgtYnRuIGRhbmdlciIgQGNsaWNrPSR7KCkgPT4gdGhpcy5jdHg/LmFwcHVpLmNsZWFyTWFpbk1lbnVCYWRnZSgidGFza3MiKX0+Q2xlYXIgVGFza3MgQmFkZ2U8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0eC1idG4iIEBjbGljaz0keygpID0+IHRoaXMuY3R4Py5hcHB1aS5zZXRDb250ZW50VGFic0F1dG9IaWRlKHRydWUsIDEpfT5BdXRvLWhpZGUgVGFicyAo4omkMSk8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0eC1idG4gZGFuZ2VyIiBAY2xpY2s9JHsoKSA9PiB0aGlzLmN0eD8uYXBwdWkuc2V0Q29udGVudFRhYnNBdXRvSGlkZShmYWxzZSl9PkRpc2FibGUgQXV0by1oaWRlPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdHgtYnRuIHN1Y2Nlc3MiIEBjbGljaz0keygpID0+IHRoaXMuYWRkQ2xvc2VhYmxlVGFiKCl9PkFkZCBDbG9zZWFibGUgVGFiPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHRhYkNvdW50ZXIgPSAwOwogICAgYWRkQ2xvc2VhYmxlVGFiKCkgewogICAgICBpZiAoIXRoaXMuY3R4KQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy50YWJDb3VudGVyKys7CiAgICAgIGNvbnN0IHRhYktleSA9IGBUYWIgJHt0aGlzLnRhYkNvdW50ZXJ9YDsKICAgICAgdGhpcy5jdHguYXBwdWkuYWRkQ29udGVudFRhYih7CiAgICAgICAga2V5OiB0YWJLZXksCiAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6ZmlsZSIsCiAgICAgICAgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZyhgU2VsZWN0ZWQgJHt0YWJLZXl9YCksCiAgICAgICAgY2xvc2VhYmxlOiB0cnVlLAogICAgICAgIG9uQ2xvc2U6ICgpID0+IHsKICAgICAgICAgIHRoaXMuY3R4Py5hcHB1aS5yZW1vdmVDb250ZW50VGFiKHRhYktleSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9OwogIHJldHVybiBEZW1vRGFzaGJvYXJkVmlldzIgPSBfY2xhc3NUaGlzOwp9KSgpOwp2YXIgRGVtb1NldHRpbmdzVmlldyA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlbW8tc2V0dGluZ3MtdmlldyIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3NlY3Rpb25fZGVjb3JhdG9yczsKICBsZXQgX3NlY3Rpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWN0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oYXNDaGFuZ2VzX2RlY29yYXRvcnM7CiAgbGV0IF9oYXNDaGFuZ2VzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaGFzQ2hhbmdlc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZW1vU2V0dGluZ3NWaWV3MiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3NlY3Rpb25fZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2hhc0NoYW5nZXNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlMzYodGhpcywgbnVsbCwgX3NlY3Rpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VjdGlvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VjdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWN0aW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWN0aW9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlY3Rpb25faW5pdGlhbGl6ZXJzLCBfc2VjdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM2KHRoaXMsIG51bGwsIF9oYXNDaGFuZ2VzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImhhc0NoYW5nZXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImhhc0NoYW5nZXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaGFzQ2hhbmdlcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaGFzQ2hhbmdlcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9oYXNDaGFuZ2VzX2luaXRpYWxpemVycywgX2hhc0NoYW5nZXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzNihudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlbW9TZXR0aW5nc1ZpZXcyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgICAgX19ydW5Jbml0aWFsaXplcnMzNyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICAjc2VjdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMzNyh0aGlzLCBfc2VjdGlvbl9pbml0aWFsaXplcnMsICJnZW5lcmFsIik7CiAgICBnZXQgc2VjdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlY3Rpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWN0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNzZWN0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaGFzQ2hhbmdlc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzcodGhpcywgX3NlY3Rpb25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM3KHRoaXMsIF9oYXNDaGFuZ2VzX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBoYXNDaGFuZ2VzKCkgewogICAgICByZXR1cm4gdGhpcy4jaGFzQ2hhbmdlc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGhhc0NoYW5nZXModmFsdWUyKSB7CiAgICAgIHRoaXMuI2hhc0NoYW5nZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGFwcHVpID0gX19ydW5Jbml0aWFsaXplcnMzNyh0aGlzLCBfaGFzQ2hhbmdlc19leHRyYUluaXRpYWxpemVycyk7CiAgICBvbkFjdGl2YXRlKGNvbnRleHQyKSB7CiAgICAgIHRoaXMuYXBwdWkgPSBjb250ZXh0Mi5hcHB1aTsKICAgICAgY29uc29sZS5sb2coIlNldHRpbmdzIGFjdGl2YXRlZCB3aXRoIHBhcmFtczoiLCBjb250ZXh0Mi5wYXJhbXMpOwogICAgICBpZiAoY29udGV4dDIucGFyYW1zPy5zZWN0aW9uKSB7CiAgICAgICAgdGhpcy5zZWN0aW9uID0gY29udGV4dDIucGFyYW1zLnNlY3Rpb247CiAgICAgIH0KICAgICAgY29udGV4dDIuYXBwdWkuc2V0U2Vjb25kYXJ5TWVudSh7CiAgICAgICAgaGVhZGluZzogIlNldHRpbmdzIiwKICAgICAgICBncm91cHM6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgbmFtZTogIkFjY291bnQiLAogICAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTp1c2VyIiwKICAgICAgICAgICAgaXRlbXM6IFsKICAgICAgICAgICAgICB7IGtleTogImdlbmVyYWwiLCBpY29uTmFtZTogInNldHRpbmdzIiwgYWN0aW9uOiAoKSA9PiB0aGlzLnNob3dTZWN0aW9uKCJnZW5lcmFsIikgfSwKICAgICAgICAgICAgICB7IGtleTogInByb2ZpbGUiLCBpY29uTmFtZTogInVzZXIiLCBhY3Rpb246ICgpID0+IHRoaXMuc2hvd1NlY3Rpb24oInByb2ZpbGUiKSB9LAogICAgICAgICAgICAgIHsga2V5OiAic2VjdXJpdHkiLCBpY29uTmFtZTogInNoaWVsZCIsIGFjdGlvbjogKCkgPT4gdGhpcy5zaG93U2VjdGlvbigic2VjdXJpdHkiKSB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIG5hbWU6ICJQcmVmZXJlbmNlcyIsCiAgICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOnNsaWRlcnMiLAogICAgICAgICAgICBpdGVtczogWwogICAgICAgICAgICAgIHsga2V5OiAibm90aWZpY2F0aW9ucyIsIGljb25OYW1lOiAiYmVsbCIsIGJhZGdlOiAzLCBhY3Rpb246ICgpID0+IHRoaXMuc2hvd1NlY3Rpb24oIm5vdGlmaWNhdGlvbnMiKSB9LAogICAgICAgICAgICAgIHsga2V5OiAiYXBwZWFyYW5jZSIsIGljb25OYW1lOiAicGFsZXR0ZSIsIGFjdGlvbjogKCkgPT4gdGhpcy5zaG93U2VjdGlvbigiYXBwZWFyYW5jZSIpIH0KICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfSk7CiAgICAgIGNvbnRleHQyLmFwcHVpLnNldFNlY29uZGFyeU1lbnVTZWxlY3Rpb24odGhpcy5zZWN0aW9uKTsKICAgICAgY29udGV4dDIuYXBwdWkuc2V0Q29udGVudFRhYnMoW10pOwogICAgfQogICAgb25EZWFjdGl2YXRlKCkgewogICAgICBjb25zb2xlLmxvZygiU2V0dGluZ3MgZGVhY3RpdmF0ZWQiKTsKICAgICAgdGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7CiAgICB9CiAgICBjYW5EZWFjdGl2YXRlKCkgewogICAgICBpZiAodGhpcy5oYXNDaGFuZ2VzKSB7CiAgICAgICAgcmV0dXJuICJZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMuIExlYXZlIGFueXdheT8iOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgc2hvd1NlY3Rpb24oc2VjdGlvbikgewogICAgICB0aGlzLnNlY3Rpb24gPSBzZWN0aW9uOwogICAgICB0aGlzLmFwcHVpPy5zZXRTZWNvbmRhcnlNZW51U2VsZWN0aW9uKHNlY3Rpb24pOwogICAgfQogICAgc2ltdWxhdGVDaGFuZ2UoKSB7CiAgICAgIHRoaXMuaGFzQ2hhbmdlcyA9IHRydWU7CiAgICB9CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPHN0eWxlPgogICAgICAgIDpob3N0IHsKICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgcGFkZGluZzogNDBweDsKICAgICAgICAgIGNvbG9yOiAjYTNhM2EzOwogICAgICAgICAgZm9udC1mYW1pbHk6ICdHZWlzdCBTYW5zJywgJ0ludGVyJywgLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZjsKICAgICAgICB9CiAgICAgICAgaDEgeyBjb2xvcjogI2ZhZmFmYTsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAyNHB4OyBtYXJnaW4tYm90dG9tOiA4cHg7IH0KICAgICAgICBwIHsgY29sb3I6ICM3MzczNzM7IG1hcmdpbi1ib3R0b206IDI0cHg7IH0KICAgICAgICAuc2VjdGlvbi1uYW1lIHsKICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4wNSk7CiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMSk7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgICAgY29sb3I6ICNmYWZhZmE7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICAgIH0KICAgICAgICAuYWN0aW9ucyB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgIH0KICAgICAgICBidXR0b24gewogICAgICAgICAgYmFja2dyb3VuZDogIzNiODJmNjsKICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICAgIHBhZGRpbmc6IDhweCAxNnB4OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIH0KICAgICAgICBidXR0b246aG92ZXIgewogICAgICAgICAgYmFja2dyb3VuZDogIzI1NjNlYjsKICAgICAgICB9CiAgICAgICAgLndhcm5pbmcgewogICAgICAgICAgY29sb3I6ICNmYmJmMjQ7CiAgICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICAgIH0KICAgICAgPC9zdHlsZT4KICAgICAgPGgxPlNldHRpbmdzPC9oMT4KICAgICAgPHA+TWFuYWdlIHlvdXIgYWNjb3VudCBhbmQgYXBwbGljYXRpb24gcHJlZmVyZW5jZXMuPC9wPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLW5hbWUiPgogICAgICAgIEN1cnJlbnQgc2VjdGlvbjogPHN0cm9uZz4ke3RoaXMuc2VjdGlvbn08L3N0cm9uZz4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbnMiPgogICAgICAgIDxidXR0b24gQGNsaWNrPSR7KCkgPT4gdGhpcy5zaW11bGF0ZUNoYW5nZSgpfT5NYWtlIENoYW5nZXM8L2J1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgICR7dGhpcy5oYXNDaGFuZ2VzID8gYjJgPHAgY2xhc3M9Indhcm5pbmciPllvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcy4gTmF2aWdhdGlvbiB3aWxsIHByb21wdCBmb3IgY29uZmlybWF0aW9uLjwvcD5gIDogIiJ9CiAgICBgOwogICAgfQogIH07CiAgcmV0dXJuIERlbW9TZXR0aW5nc1ZpZXcyID0gX2NsYXNzVGhpczsKfSkoKTsKdmFyIERlbW9Qcm9qZWN0c1ZpZXcgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZW1vLXByb2plY3RzLXZpZXciKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgdmFyIERlbW9Qcm9qZWN0c1ZpZXcyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfX2VzRGVjb3JhdGUzNihudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlbW9Qcm9qZWN0c1ZpZXcyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgICAgX19ydW5Jbml0aWFsaXplcnMzNyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBvbkFjdGl2YXRlKGNvbnRleHQyKSB7CiAgICAgIGNvbnRleHQyLmFwcHVpLnNldFNlY29uZGFyeU1lbnUoewogICAgICAgIGhlYWRpbmc6ICJQcm9qZWN0cyIsCiAgICAgICAgZ3JvdXBzOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIG5hbWU6ICJNeSBQcm9qZWN0cyIsCiAgICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmZvbGRlciIsCiAgICAgICAgICAgIGl0ZW1zOiBbCiAgICAgICAgICAgICAgeyBrZXk6ICJBY3RpdmUiLCBpY29uTmFtZTogImZvbGRlciIsIGJhZGdlOiAzLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJBY3RpdmUiKSB9LAogICAgICAgICAgICAgIHsga2V5OiAiQXJjaGl2ZWQiLCBpY29uTmFtZTogImFyY2hpdmUiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJBcmNoaXZlZCIpIH0sCiAgICAgICAgICAgICAgeyBrZXk6ICJTaGFyZWQiLCBpY29uTmFtZTogInVzZXJzIiwgYmFkZ2U6IDIsIGJhZGdlVmFyaWFudDogIndhcm5pbmciLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJTaGFyZWQiKSB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIG5hbWU6ICJRdWljayBBY3Rpb25zIiwKICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6emFwIiwKICAgICAgICAgICAgaXRlbXM6IFsKICAgICAgICAgICAgICB7IHR5cGU6ICJhY3Rpb24iLCBrZXk6ICJOZXcgUHJvamVjdCIsIGljb25OYW1lOiAibHVjaWRlOmZvbGRlclBsdXMiLCBhY3Rpb246ICgpID0+IGFsZXJ0KCJDcmVhdGUgbmV3IHByb2plY3QiKSB9LAogICAgICAgICAgICAgIHsgdHlwZTogImFjdGlvbiIsIGtleTogIkltcG9ydCIsIGljb25OYW1lOiAibHVjaWRlOmRvd25sb2FkIiwgYWN0aW9uOiAoKSA9PiBhbGVydCgiSW1wb3J0IHByb2plY3QiKSB9LAogICAgICAgICAgICAgIHsgdHlwZTogImRpdmlkZXIiIH0sCiAgICAgICAgICAgICAgeyB0eXBlOiAibGluayIsIGtleTogIlRlbXBsYXRlcyIsIGljb25OYW1lOiAibHVjaWRlOmxheW91dFRlbXBsYXRlIiwgaHJlZjogImh0dHBzOi8vdGVtcGxhdGVzLmV4YW1wbGUuY29tIiB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH0pOwogICAgICBjb250ZXh0Mi5hcHB1aS5zZXRDb250ZW50VGFicyhbCiAgICAgICAgeyBrZXk6ICJHcmlkIiwgaWNvbk5hbWU6ICJsdWNpZGU6Z3JpZCIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIkdyaWQgdmlldyIpIH0sCiAgICAgICAgeyBrZXk6ICJMaXN0IiwgaWNvbk5hbWU6ICJsdWNpZGU6bGlzdCIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIkxpc3QgdmlldyIpIH0sCiAgICAgICAgeyBrZXk6ICJCb2FyZCIsIGljb25OYW1lOiAibHVjaWRlOmthbmJhbiIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIkJvYXJkIHZpZXciKSB9CiAgICAgIF0pOwogICAgfQogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxzdHlsZT4KICAgICAgICA6aG9zdCB7CiAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgIHBhZGRpbmc6IDQwcHg7CiAgICAgICAgICBjb2xvcjogI2EzYTNhMzsKICAgICAgICAgIGZvbnQtZmFtaWx5OiAnR2Vpc3QgU2FucycsICdJbnRlcicsIC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWY7CiAgICAgICAgfQogICAgICAgIGgxIHsgY29sb3I6ICNmYWZhZmE7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMjRweDsgbWFyZ2luLWJvdHRvbTogMjRweDsgfQogICAgICAgIC5wcm9qZWN0cyB7CiAgICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgMWZyKTsKICAgICAgICAgIGdhcDogMTZweDsKICAgICAgICB9CiAgICAgICAgLnByb2plY3QgewogICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjAzKTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4wOCk7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMnM7CiAgICAgICAgfQogICAgICAgIC5wcm9qZWN0OmhvdmVyIHsKICAgICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjIpOwogICAgICAgIH0KICAgICAgICAucHJvamVjdCBoMyB7IGNvbG9yOiAjZmFmYWZhOyBtYXJnaW46IDAgMCA4cHggMDsgZm9udC1zaXplOiAxNnB4OyB9CiAgICAgICAgLnByb2plY3QgcCB7IGNvbG9yOiAjNzM3MzczOyBtYXJnaW46IDA7IGZvbnQtc2l6ZTogMTNweDsgfQogICAgICAgIC5iYWRnZSB7CiAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAjMTQ1MzJkOwogICAgICAgICAgY29sb3I6ICM0YWRlODA7CiAgICAgICAgICBwYWRkaW5nOiAycHggOHB4OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogOXB4OwogICAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDsKICAgICAgICB9CiAgICAgIDwvc3R5bGU+CiAgICAgIDxoMT5Qcm9qZWN0czwvaDE+CiAgICAgIDxkaXYgY2xhc3M9InByb2plY3RzIj4KICAgICAgICA8ZGl2IGNsYXNzPSJwcm9qZWN0Ij4KICAgICAgICAgIDxoMz5Gcm9udGVuZCBBcHAgPHNwYW4gY2xhc3M9ImJhZGdlIj5BY3RpdmU8L3NwYW4+PC9oMz4KICAgICAgICAgIDxwPlJlYWN0LWJhc2VkIGRhc2hib2FyZCBhcHBsaWNhdGlvbjwvcD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJwcm9qZWN0Ij4KICAgICAgICAgIDxoMz5BUEkgU2VydmVyIDxzcGFuIGNsYXNzPSJiYWRnZSI+QWN0aXZlPC9zcGFuPjwvaDM+CiAgICAgICAgICA8cD5Ob2RlLmpzIFJFU1QgQVBJIGJhY2tlbmQ8L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0icHJvamVjdCI+CiAgICAgICAgICA8aDM+TW9iaWxlIEFwcCA8c3BhbiBjbGFzcz0iYmFkZ2UiPkFjdGl2ZTwvc3Bhbj48L2gzPgogICAgICAgICAgPHA+UmVhY3QgTmF0aXZlIGlPUy9BbmRyb2lkIGFwcDwvcD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJwcm9qZWN0Ij4KICAgICAgICAgIDxoMz5Eb2N1bWVudGF0aW9uPC9oMz4KICAgICAgICAgIDxwPlRlY2huaWNhbCBkb2N1bWVudGF0aW9uIHNpdGU8L3A+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICB9OwogIHJldHVybiBEZW1vUHJvamVjdHNWaWV3MiA9IF9jbGFzc1RoaXM7Cn0pKCk7CnZhciBEZW1vVGFza3NWaWV3ID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVtby10YXNrcy12aWV3IildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIHZhciBEZW1vVGFza3NWaWV3MiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX19lc0RlY29yYXRlMzYobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZW1vVGFza3NWaWV3MiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMzcoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgb25BY3RpdmF0ZShjb250ZXh0MikgewogICAgICBjb250ZXh0Mi5hcHB1aS5zZXRTZWNvbmRhcnlNZW51KHsKICAgICAgICBoZWFkaW5nOiAiVGFza3MiLAogICAgICAgIGdyb3VwczogWwogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiVmlld3MiLAogICAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpleWUiLAogICAgICAgICAgICBpdGVtczogWwogICAgICAgICAgICAgIHsga2V5OiAiQWxsIFRhc2tzIiwgaWNvbk5hbWU6ICJsaXN0IiwgYmFkZ2U6IDEyLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJBbGwiKSB9LAogICAgICAgICAgICAgIHsga2V5OiAiVG9kYXkiLCBpY29uTmFtZTogImNhbGVuZGFyIiwgYmFkZ2U6IDMsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIlRvZGF5IikgfSwKICAgICAgICAgICAgICB7IGtleTogIlVwY29taW5nIiwgaWNvbk5hbWU6ICJjbG9jayIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIlVwY29taW5nIikgfSwKICAgICAgICAgICAgICB7IGtleTogIkNvbXBsZXRlZCIsIGljb25OYW1lOiAiY2hlY2tDaXJjbGUiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJDb21wbGV0ZWQiKSB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIG5hbWU6ICJGaWx0ZXJzIiwKICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6ZmlsdGVyIiwKICAgICAgICAgICAgaXRlbXM6IFsKICAgICAgICAgICAgICB7IHR5cGU6ICJoZWFkZXIiLCBsYWJlbDogIlByaW9yaXR5IiB9LAogICAgICAgICAgICAgIHsgdHlwZTogIm11bHRpRmlsdGVyIiwga2V5OiAiUHJpb3JpdHkiLCBpY29uTmFtZTogImx1Y2lkZTpmbGFnIiwgb3B0aW9uczogWwogICAgICAgICAgICAgICAgeyBrZXk6ICJoaWdoIiwgbGFiZWw6ICJIaWdoIiwgY2hlY2tlZDogdHJ1ZSwgaWNvbk5hbWU6ICJsdWNpZGU6YWxlcnRDaXJjbGUiIH0sCiAgICAgICAgICAgICAgICB7IGtleTogIm1lZGl1bSIsIGxhYmVsOiAiTWVkaXVtIiwgY2hlY2tlZDogdHJ1ZSwgaWNvbk5hbWU6ICJsdWNpZGU6bWludXNDaXJjbGUiIH0sCiAgICAgICAgICAgICAgICB7IGtleTogImxvdyIsIGxhYmVsOiAiTG93IiwgY2hlY2tlZDogZmFsc2UsIGljb25OYW1lOiAibHVjaWRlOmNpcmNsZSIgfQogICAgICAgICAgICAgIF0sIG9uQ2hhbmdlOiAoa2V5czIpID0+IGNvbnNvbGUubG9nKCJQcmlvcml0eSBmaWx0ZXI6Iiwga2V5czIpIH0sCiAgICAgICAgICAgICAgeyB0eXBlOiAiZGl2aWRlciIgfSwKICAgICAgICAgICAgICB7IHR5cGU6ICJoZWFkZXIiLCBsYWJlbDogIk9wdGlvbnMiIH0sCiAgICAgICAgICAgICAgeyB0eXBlOiAiZmlsdGVyIiwga2V5OiAiU2hvdyBTdWJ0YXNrcyIsIGljb25OYW1lOiAibHVjaWRlOmxpc3RUcmVlIiwgYWN0aXZlOiB0cnVlLCBvblRvZ2dsZTogKGFjdGl2ZSkgPT4gY29uc29sZS5sb2coIlNob3cgc3VidGFza3M6IiwgYWN0aXZlKSB9LAogICAgICAgICAgICAgIHsgdHlwZTogImZpbHRlciIsIGtleTogIlNob3cgQ29tcGxldGVkIiwgaWNvbk5hbWU6ICJsdWNpZGU6Y2hlY2tTcXVhcmUiLCBhY3RpdmU6IGZhbHNlLCBvblRvZ2dsZTogKGFjdGl2ZSkgPT4gY29uc29sZS5sb2coIlNob3cgY29tcGxldGVkOiIsIGFjdGl2ZSkgfQogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiQWN0aW9ucyIsCiAgICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOnphcCIsCiAgICAgICAgICAgIGl0ZW1zOiBbCiAgICAgICAgICAgICAgeyB0eXBlOiAiYWN0aW9uIiwga2V5OiAiQWRkIFRhc2siLCBpY29uTmFtZTogImx1Y2lkZTpwbHVzIiwgYWN0aW9uOiAoKSA9PiBhbGVydCgiQWRkIG5ldyB0YXNrIikgfSwKICAgICAgICAgICAgICB7IHR5cGU6ICJhY3Rpb24iLCBrZXk6ICJJbXBvcnQgVGFza3MiLCBpY29uTmFtZTogImx1Y2lkZTp1cGxvYWQiLCBhY3Rpb246ICgpID0+IGFsZXJ0KCJJbXBvcnQgdGFza3MiKSB9LAogICAgICAgICAgICAgIHsgdHlwZTogImRpdmlkZXIiIH0sCiAgICAgICAgICAgICAgeyB0eXBlOiAiYWN0aW9uIiwga2V5OiAiQ2xlYXIgQ29tcGxldGVkIiwgaWNvbk5hbWU6ICJsdWNpZGU6dHJhc2gyIiwgdmFyaWFudDogImRhbmdlciIsIGNvbmZpcm1NZXNzYWdlOiAiRGVsZXRlIGFsbCBjb21wbGV0ZWQgdGFza3M/IiwgYWN0aW9uOiAoKSA9PiBhbGVydCgiQ2xlYXJlZCBjb21wbGV0ZWQgdGFza3MiKSB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH0pOwogICAgICBjb250ZXh0Mi5hcHB1aS5zZXRDb250ZW50VGFicyhbCiAgICAgICAgeyBrZXk6ICJMaXN0IiwgaWNvbk5hbWU6ICJsdWNpZGU6bGlzdCIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIkxpc3QiKSB9LAogICAgICAgIHsga2V5OiAiQ2FsZW5kYXIiLCBpY29uTmFtZTogImx1Y2lkZTpjYWxlbmRhciIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIkNhbGVuZGFyIikgfQogICAgICBdKTsKICAgIH0KICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8c3R5bGU+CiAgICAgICAgOmhvc3QgewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwYWRkaW5nOiA0MHB4OwogICAgICAgICAgY29sb3I6ICNhM2EzYTM7CiAgICAgICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCAnSW50ZXInLCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmOwogICAgICAgIH0KICAgICAgICBoMSB7IGNvbG9yOiAjZmFmYWZhOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDI0cHg7IG1hcmdpbi1ib3R0b206IDI0cHg7IH0KICAgICAgICAudGFzay1saXN0IHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgfQogICAgICAgIC50YXNrIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjAzKTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4wOCk7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICAgICAgfQogICAgICAgIC5jaGVja2JveCB7CiAgICAgICAgICB3aWR0aDogMThweDsKICAgICAgICAgIGhlaWdodDogMThweDsKICAgICAgICAgIGJvcmRlcjogMnB4IHNvbGlkICM1MjUyNTI7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgfQogICAgICAgIC50YXNrLXRleHQgeyBjb2xvcjogI2ZhZmFmYTsgZmxleDogMTsgfQogICAgICAgIC5kdWUtZGF0ZSB7IGNvbG9yOiAjNzM3MzczOyBmb250LXNpemU6IDEycHg7IH0KICAgICAgICAucHJpb3JpdHkgewogICAgICAgICAgcGFkZGluZzogMnB4IDhweDsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB9CiAgICAgICAgLnByaW9yaXR5LmhpZ2ggeyBiYWNrZ3JvdW5kOiAjNDUwYTBhOyBjb2xvcjogI2Y4NzE3MTsgfQogICAgICAgIC5wcmlvcml0eS5tZWRpdW0geyBiYWNrZ3JvdW5kOiAjNDUxYTAzOyBjb2xvcjogI2ZiYmYyNDsgfQogICAgICA8L3N0eWxlPgogICAgICA8aDE+VGFza3M8L2gxPgogICAgICA8ZGl2IGNsYXNzPSJ0YXNrLWxpc3QiPgogICAgICAgIDxkaXYgY2xhc3M9InRhc2siPgogICAgICAgICAgPGRpdiBjbGFzcz0iY2hlY2tib3giPjwvZGl2PgogICAgICAgICAgPHNwYW4gY2xhc3M9InRhc2stdGV4dCI+UmV2aWV3IHB1bGwgcmVxdWVzdCAjNDI8L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iZHVlLWRhdGUiPlRvZGF5PC9zcGFuPgogICAgICAgICAgPHNwYW4gY2xhc3M9InByaW9yaXR5IGhpZ2giPkhpZ2g8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0idGFzayI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjaGVja2JveCI+PC9kaXY+CiAgICAgICAgICA8c3BhbiBjbGFzcz0idGFzay10ZXh0Ij5VcGRhdGUgZG9jdW1lbnRhdGlvbjwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJkdWUtZGF0ZSI+VG9tb3Jyb3c8L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0icHJpb3JpdHkgbWVkaXVtIj5NZWRpdW08L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0idGFzayI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjaGVja2JveCI+PC9kaXY+CiAgICAgICAgICA8c3BhbiBjbGFzcz0idGFzay10ZXh0Ij5Xcml0ZSB1bml0IHRlc3RzPC9zcGFuPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImR1ZS1kYXRlIj5EZWMgMjA8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICB9OwogIHJldHVybiBEZW1vVGFza3NWaWV3MiA9IF9jbGFzc1RoaXM7Cn0pKCk7CnZhciBkZW1vRnVuYzI3ID0gKCkgPT4gewogIGNvbnN0IGFwcENvbmZpZyA9IHsKICAgIGJyYW5kaW5nOiB7CiAgICAgIGxvZ29JY29uOiAibHVjaWRlOmJveCIsCiAgICAgIGxvZ29UZXh0OiAiQWNtZSBBcHAiCiAgICB9LAogICAgYXBwQmFyOiB7CiAgICAgIG1lbnVJdGVtczogWwogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJGaWxlIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgfSwKICAgICAgICAgIHN1Ym1lbnU6IFsKICAgICAgICAgICAgeyBuYW1lOiAiTmV3IFByb2plY3QiLCBzaG9ydGN1dDogIkNtZCtOIiwgaWNvbk5hbWU6ICJmaWxlUGx1cyIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIk5ldyIpIH0sCiAgICAgICAgICAgIHsgbmFtZTogIk9wZW4uLi4iLCBzaG9ydGN1dDogIkNtZCtPIiwgaWNvbk5hbWU6ICJmb2xkZXJPcGVuIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiT3BlbiIpIH0sCiAgICAgICAgICAgIHsgbmFtZTogIlJlY2VudCBQcm9qZWN0cyIsIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICB9LCBzdWJtZW51OiBbCiAgICAgICAgICAgICAgeyBuYW1lOiAibXktYXBwIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiT3BlbiBteS1hcHAiKSB9LAogICAgICAgICAgICAgIHsgbmFtZTogImNvbXBvbmVudC1saWIiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJPcGVuIGNvbXBvbmVudC1saWIiKSB9CiAgICAgICAgICAgIF0gfSwKICAgICAgICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgICAgIHsgbmFtZTogIlNhdmUgQWxsIiwgc2hvcnRjdXQ6ICJDbWQrUyIsIGljb25OYW1lOiAic2F2ZSIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlNhdmUiKSB9CiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiRWRpdCIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIH0sCiAgICAgICAgICBzdWJtZW51OiBbCiAgICAgICAgICAgIHsgbmFtZTogIlVuZG8iLCBzaG9ydGN1dDogIkNtZCtaIiwgaWNvbk5hbWU6ICJ1bmRvIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiVW5kbyIpIH0sCiAgICAgICAgICAgIHsgbmFtZTogIlJlZG8iLCBzaG9ydGN1dDogIkNtZCtTaGlmdCtaIiwgaWNvbk5hbWU6ICJyZWRvIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiUmVkbyIpIH0sCiAgICAgICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgICAgICB7IG5hbWU6ICJDdXQiLCBzaG9ydGN1dDogIkNtZCtYIiwgaWNvbk5hbWU6ICJzY2lzc29ycyIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkN1dCIpIH0sCiAgICAgICAgICAgIHsgbmFtZTogIkNvcHkiLCBzaG9ydGN1dDogIkNtZCtDIiwgaWNvbk5hbWU6ICJjb3B5IiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiQ29weSIpIH0sCiAgICAgICAgICAgIHsgbmFtZTogIlBhc3RlIiwgc2hvcnRjdXQ6ICJDbWQrViIsIGljb25OYW1lOiAiY2xpcGJvYXJkIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiUGFzdGUiKSB9CiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiVmlldyIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIH0sCiAgICAgICAgICBzdWJtZW51OiBbCiAgICAgICAgICAgIHsgbmFtZTogIlRvZ2dsZSBTaWRlYmFyIiwgc2hvcnRjdXQ6ICJDbWQrQiIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlRvZ2dsZSBzaWRlYmFyIikgfSwKICAgICAgICAgICAgeyBuYW1lOiAiVG9nZ2xlIEFjdGl2aXR5IExvZyIsIHNob3J0Y3V0OiAiQ21kK1NoaWZ0K0EiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJUb2dnbGUgYWN0aXZpdHkiKSB9CiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiSGVscCIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIH0sCiAgICAgICAgICBzdWJtZW51OiBbCiAgICAgICAgICAgIHsgbmFtZTogIkRvY3VtZW50YXRpb24iLCBpY29uTmFtZTogImJvb2siLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJEb2NzIikgfSwKICAgICAgICAgICAgeyBuYW1lOiAiS2V5Ym9hcmQgU2hvcnRjdXRzIiwgaWNvbk5hbWU6ICJrZXlib2FyZCIsIHNob3J0Y3V0OiAiQ21kKy8iLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJTaG9ydGN1dHMiKSB9LAogICAgICAgICAgICB7IGRpdmlkZXI6IHRydWUgfSwKICAgICAgICAgICAgeyBuYW1lOiAiQWJvdXQiLCBpY29uTmFtZTogImluZm8iLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJBYm91dCIpIH0KICAgICAgICAgIF0KICAgICAgICB9CiAgICAgIF0sCiAgICAgIGJyZWFkY3J1bWJzOiAiRGFzaGJvYXJkIiwKICAgICAgc2hvd1dpbmRvd0NvbnRyb2xzOiB0cnVlLAogICAgICBzaG93U2VhcmNoOiB0cnVlLAogICAgICB1c2VyOiB7CiAgICAgICAgbmFtZTogIkphbmUgU21pdGgiLAogICAgICAgIGVtYWlsOiAiamFuZS5zbWl0aEBleGFtcGxlLmNvbSIsCiAgICAgICAgc3RhdHVzOiAib25saW5lIgogICAgICB9LAogICAgICBwcm9maWxlTWVudUl0ZW1zOiBbCiAgICAgICAgeyBuYW1lOiAiUHJvZmlsZSIsIGljb25OYW1lOiAidXNlciIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlByb2ZpbGUiKSB9LAogICAgICAgIHsgbmFtZTogIkFjY291bnQgU2V0dGluZ3MiLCBpY29uTmFtZTogInNldHRpbmdzIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiU2V0dGluZ3MiKSB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsgbmFtZTogIkhlbHAgJiBTdXBwb3J0IiwgaWNvbk5hbWU6ICJoZWxwQ2lyY2xlIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiSGVscCIpIH0sCiAgICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgeyBuYW1lOiAiU2lnbiBPdXQiLCBpY29uTmFtZTogImxvZ091dCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlNpZ24gb3V0IikgfQogICAgICBdCiAgICB9LAogICAgdmlld3M6IFsKICAgICAgewogICAgICAgIGlkOiAiZGFzaGJvYXJkIiwKICAgICAgICBuYW1lOiAiRGFzaGJvYXJkIiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpob21lIiwKICAgICAgICBjb250ZW50OiAiZGVtby1kYXNoYm9hcmQtdmlldyIsCiAgICAgICAgcm91dGU6ICJkYXNoYm9hcmQiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpZDogInByb2plY3RzIiwKICAgICAgICBuYW1lOiAiUHJvamVjdHMiLAogICAgICAgIGljb25OYW1lOiAibHVjaWRlOmZvbGRlciIsCiAgICAgICAgY29udGVudDogImRlbW8tcHJvamVjdHMtdmlldyIsCiAgICAgICAgcm91dGU6ICJwcm9qZWN0cyIsCiAgICAgICAgYmFkZ2U6IDMKICAgICAgfSwKICAgICAgewogICAgICAgIGlkOiAidGFza3MiLAogICAgICAgIG5hbWU6ICJUYXNrcyIsCiAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6Y2hlY2tTcXVhcmUiLAogICAgICAgIGNvbnRlbnQ6ICJkZW1vLXRhc2tzLXZpZXciLAogICAgICAgIHJvdXRlOiAidGFza3MiLAogICAgICAgIGJhZGdlOiAxMgogICAgICB9LAogICAgICB7CiAgICAgICAgaWQ6ICJzZXR0aW5ncyIsCiAgICAgICAgbmFtZTogIlNldHRpbmdzIiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpzZXR0aW5ncyIsCiAgICAgICAgY29udGVudDogImRlbW8tc2V0dGluZ3MtdmlldyIsCiAgICAgICAgcm91dGU6ICJzZXR0aW5ncy86c2VjdGlvbj8iCiAgICAgIH0KICAgIF0sCiAgICBtYWluTWVudTogewogICAgICBzZWN0aW9uczogWwogICAgICAgIHsgbmFtZTogIk1haW4iLCB2aWV3czogWyJkYXNoYm9hcmQiXSB9LAogICAgICAgIHsgbmFtZTogIldvcmtzcGFjZSIsIHZpZXdzOiBbInByb2plY3RzIiwgInRhc2tzIl0gfQogICAgICBdLAogICAgICBib3R0b21JdGVtczogWyJzZXR0aW5ncyJdCiAgICB9LAogICAgZGVmYXVsdFZpZXc6ICJkYXNoYm9hcmQiLAogICAgYm90dG9tQmFyOiB7CiAgICAgIHZpc2libGU6IHRydWUsCiAgICAgIHdpZGdldHM6IFsKICAgICAgICB7CiAgICAgICAgICBpZDogInN0YXR1cyIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTphY3Rpdml0eSIsCiAgICAgICAgICBsYWJlbDogIlN5c3RlbSBPbmxpbmUiLAogICAgICAgICAgc3RhdHVzOiAic3VjY2VzcyIsCiAgICAgICAgICB0b29sdGlwOiAiQWxsIHN5c3RlbXMgb3BlcmF0aW9uYWwiLAogICAgICAgICAgb25DbGljazogKCkgPT4gY29uc29sZS5sb2coIlN0YXR1cyBjbGlja2VkIikKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGlkOiAibm90aWZpY2F0aW9ucyIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpiZWxsIiwKICAgICAgICAgIGxhYmVsOiAiMyBub3RpZmljYXRpb25zIiwKICAgICAgICAgIHN0YXR1czogIndhcm5pbmciLAogICAgICAgICAgdG9vbHRpcDogIllvdSBoYXZlIHVucmVhZCBub3RpZmljYXRpb25zIiwKICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IGNvbnNvbGUubG9nKCJOb3RpZmljYXRpb25zIGNsaWNrZWQiKQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgaWQ6ICJ2ZXJzaW9uIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmdpdEJyYW5jaCIsCiAgICAgICAgICBsYWJlbDogInYxLjIuMyIsCiAgICAgICAgICBwb3NpdGlvbjogInJpZ2h0IiwKICAgICAgICAgIHRvb2x0aXA6ICJDdXJyZW50IHZlcnNpb24iCiAgICAgICAgfQogICAgICBdLAogICAgICBhY3Rpb25zOiBbCiAgICAgICAgewogICAgICAgICAgaWQ6ICJ0ZXJtaW5hbCIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTp0ZXJtaW5hbCIsCiAgICAgICAgICB0b29sdGlwOiAiT3BlbiBUZXJtaW5hbCIsCiAgICAgICAgICBwb3NpdGlvbjogInJpZ2h0IiwKICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IGNvbnNvbGUubG9nKCJUZXJtaW5hbCBjbGlja2VkIikKICAgICAgICB9CiAgICAgIF0KICAgIH0sCiAgICBvblZpZXdDaGFuZ2U6ICh2aWV3SWQsIHZpZXcpID0+IHsKICAgICAgY29uc29sZS5sb2coYFZpZXcgY2hhbmdlZCB0bzogJHt2aWV3SWR9ICgke3ZpZXcubmFtZX0pYCk7CiAgICB9LAogICAgb25TZWFyY2g6IChxdWVyeSkgPT4gewogICAgICBjb25zb2xlLmxvZygiU2VhcmNoIHF1ZXJ5OiIsIHF1ZXJ5KTsKICAgIH0KICB9OwogIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICBjb250YWluZXJFbGVtZW50LmNsYXNzTmFtZSA9ICJkZW1vLWNvbnRhaW5lciI7CiAgY29udGFpbmVyRWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gInBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyBoZWlnaHQ6IDEwMCU7IHdpZHRoOiAxMDAlOyBvdmVyZmxvdzogaGlkZGVuOyI7CiAgY29uc3QgYXBwdWlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGVlcy1hcHB1aSIpOwogIGNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQoYXBwdWlFbGVtZW50KTsKICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHsKICAgIGF3YWl0IGFwcHVpRWxlbWVudC51cGRhdGVDb21wbGV0ZTsKICAgIGFwcHVpRWxlbWVudC5jb25maWd1cmUoYXBwQ29uZmlnKTsKICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICBhcHB1aUVsZW1lbnQuYWN0aXZpdHlMb2cuYWRkTWFueShbCiAgICAgICAgewogICAgICAgICAgdHlwZTogImxvZ2luIiwKICAgICAgICAgIHVzZXI6ICJKYW5lIFNtaXRoIiwKICAgICAgICAgIG1lc3NhZ2U6ICJsb2dnZWQgaW4gZnJvbSBDaHJvbWUgb24gbWFjT1MiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0eXBlOiAiY3JlYXRlIiwKICAgICAgICAgIHVzZXI6ICJKYW5lIFNtaXRoIiwKICAgICAgICAgIG1lc3NhZ2U6ICdjcmVhdGVkIHByb2plY3QgIkZyb250ZW5kIEFwcCInCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0eXBlOiAidXBkYXRlIiwKICAgICAgICAgIHVzZXI6ICJKb2huIERvZSIsCiAgICAgICAgICBtZXNzYWdlOiAidXBkYXRlZCBBUEkgZG9jdW1lbnRhdGlvbiIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIHR5cGU6ICJ2aWV3IiwKICAgICAgICAgIHVzZXI6ICJKYW5lIFNtaXRoIiwKICAgICAgICAgIG1lc3NhZ2U6ICJ2aWV3ZWQgZGFzaGJvYXJkIGFuYWx5dGljcyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIHR5cGU6ICJkZWxldGUiLAogICAgICAgICAgdXNlcjogIkFkbWluIiwKICAgICAgICAgIG1lc3NhZ2U6ICJyZW1vdmVkIGRlcHJlY2F0ZWQgZW5kcG9pbnQiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0eXBlOiAiY3VzdG9tIiwKICAgICAgICAgIHVzZXI6ICJTeXN0ZW0iLAogICAgICAgICAgbWVzc2FnZTogInNjaGVkdWxlZCBiYWNrdXAgY29tcGxldGVkIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmRhdGFiYXNlIgogICAgICAgIH0KICAgICAgXSk7CiAgICB9LCA1MDApOwogICAgYXBwdWlFbGVtZW50LnZpZXdDaGFuZ2VkJC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJWaWV3IGNoYW5nZWQgZXZlbnQ6IiwgZXZlbnQpOwogICAgICBhcHB1aUVsZW1lbnQuc2V0QnJlYWRjcnVtYnMoZXZlbnQudmlldy5uYW1lKTsKICAgIH0pOwogICAgYXBwdWlFbGVtZW50LnZpZXdMaWZlY3ljbGUkLnN1YnNjcmliZSgoZXZlbnQpID0+IHsKICAgICAgY29uc29sZS5sb2coIkxpZmVjeWNsZSBldmVudDoiLCBldmVudC50eXBlLCBldmVudC52aWV3SWQpOwogICAgfSk7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgYXBwdWlFbGVtZW50LnNldE1haW5NZW51QmFkZ2UoInRhc2tzIiwgMTUpOwogICAgICBhcHB1aUVsZW1lbnQuYWN0aXZpdHlMb2cuYWRkKHsKICAgICAgICB0eXBlOiAidXBkYXRlIiwKICAgICAgICB1c2VyOiAiU3lzdGVtIiwKICAgICAgICBtZXNzYWdlOiAibmV3IHRhc2tzIGFkZGVkIgogICAgICB9KTsKICAgIH0sIDVlMyk7CiAgfSwgMCk7CiAgcmV0dXJuIGIyYAogICAgPGRlZXMtZGVtb3dyYXBwZXI+CiAgICAgICR7Y29udGFpbmVyRWxlbWVudH0KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICBgOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWFwcHVpL2RlZXMtYXBwdWkvdmlldy5yZWdpc3RyeS5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgVmlld1JlZ2lzdHJ5ID0gY2xhc3MgewogIHZpZXdzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBpbnN0YW5jZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogIGN1cnJlbnRWaWV3SWQgPSBudWxsOwogIGFwcHVpID0gbnVsbDsKICAvKioKICAgKiBTZXQgdGhlIGFwcHVpIHJlZmVyZW5jZSBmb3IgdmlldyBhY3RpdmF0aW9uIGNvbnRleHQKICAgKi8KICBzZXRBcHB1aVJlZihhcHB1aSkgewogICAgdGhpcy5hcHB1aSA9IGFwcHVpOwogIH0KICAvKioKICAgKiBSZWdpc3RlciBhIHNpbmdsZSB2aWV3CiAgICovCiAgcmVnaXN0ZXIodmlldykgewogICAgaWYgKHRoaXMudmlld3MuaGFzKHZpZXcuaWQpKSB7CiAgICAgIGNvbnNvbGUud2FybihgVmlldyB3aXRoIGlkICIke3ZpZXcuaWR9IiBhbHJlYWR5IHJlZ2lzdGVyZWQuIE92ZXJ3cml0aW5nLmApOwogICAgfQogICAgdGhpcy52aWV3cy5zZXQodmlldy5pZCwgdmlldyk7CiAgfQogIC8qKgogICAqIFJlZ2lzdGVyIG11bHRpcGxlIHZpZXdzCiAgICovCiAgcmVnaXN0ZXJBbGwodmlld3MpIHsKICAgIHZpZXdzLmZvckVhY2goKHZpZXcpID0+IHRoaXMucmVnaXN0ZXIodmlldykpOwogIH0KICAvKioKICAgKiBHZXQgYSB2aWV3IGRlZmluaXRpb24gYnkgSUQKICAgKi8KICBnZXQodmlld0lkKSB7CiAgICByZXR1cm4gdGhpcy52aWV3cy5nZXQodmlld0lkKTsKICB9CiAgLyoqCiAgICogR2V0IGFsbCByZWdpc3RlcmVkIHZpZXcgSURzCiAgICovCiAgZ2V0Vmlld0lkcygpIHsKICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMudmlld3Mua2V5cygpKTsKICB9CiAgLyoqCiAgICogR2V0IGFsbCB2aWV3cwogICAqLwogIGdldEFsbCgpIHsKICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMudmlld3MudmFsdWVzKCkpOwogIH0KICAvKioKICAgKiBHZXQgcm91dGUgZm9yIGEgdmlldwogICAqLwogIGdldFJvdXRlKHZpZXdJZCkgewogICAgY29uc3QgdmlldyA9IHRoaXMudmlld3MuZ2V0KHZpZXdJZCk7CiAgICByZXR1cm4gdmlldz8ucm91dGUgfHwgdmlldz8uaWQgfHwgIiI7CiAgfQogIC8qKgogICAqIEZpbmQgdmlldyBieSByb3V0ZSAoc3VwcG9ydHMgcGFyYW1ldGVyaXplZCByb3V0ZXMgbGlrZSAnc2V0dGluZ3MvOnNlY3Rpb24nKQogICAqLwogIGZpbmRCeVJvdXRlKHJvdXRlKSB7CiAgICBmb3IgKGNvbnN0IHZpZXcgb2YgdGhpcy52aWV3cy52YWx1ZXMoKSkgewogICAgICBjb25zdCB2aWV3Um91dGUgPSB2aWV3LnJvdXRlIHx8IHZpZXcuaWQ7CiAgICAgIGNvbnN0IHBhcmFtczIgPSB0aGlzLm1hdGNoUm91dGUodmlld1JvdXRlLCByb3V0ZSk7CiAgICAgIGlmIChwYXJhbXMyICE9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHsgdmlldywgcGFyYW1zOiBwYXJhbXMyIH07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2b2lkIDA7CiAgfQogIC8qKgogICAqIE1hdGNoIGEgcm91dGUgcGF0dGVybiBhZ2FpbnN0IGFuIGFjdHVhbCByb3V0ZQogICAqIFJldHVybnMgcGFyYW1zIGlmIG1hdGNoZWQsIG51bGwgb3RoZXJ3aXNlCiAgICovCiAgbWF0Y2hSb3V0ZShwYXR0ZXJuLCByb3V0ZSkgewogICAgY29uc3QgcGF0dGVyblBhcnRzID0gcGF0dGVybi5zcGxpdCgiLyIpOwogICAgY29uc3Qgcm91dGVQYXJ0cyA9IHJvdXRlLnNwbGl0KCIvIik7CiAgICBjb25zdCBoYXNPcHRpb25hbFBhcmFtID0gcGF0dGVyblBhcnRzLmxlbmd0aCA+IDAgJiYgcGF0dGVyblBhcnRzW3BhdHRlcm5QYXJ0cy5sZW5ndGggLSAxXS5lbmRzV2l0aCgiPyIpOwogICAgaWYgKGhhc09wdGlvbmFsUGFyYW0pIHsKICAgICAgaWYgKHJvdXRlUGFydHMubGVuZ3RoIDwgcGF0dGVyblBhcnRzLmxlbmd0aCAtIDEgfHwgcm91dGVQYXJ0cy5sZW5ndGggPiBwYXR0ZXJuUGFydHMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocGF0dGVyblBhcnRzLmxlbmd0aCAhPT0gcm91dGVQYXJ0cy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBwYXJhbXMyID0ge307CiAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBwYXR0ZXJuUGFydHMubGVuZ3RoOyBpMTErKykgewogICAgICBsZXQgcGFydCA9IHBhdHRlcm5QYXJ0c1tpMTFdOwogICAgICBjb25zdCBpc09wdGlvbmFsID0gcGFydC5lbmRzV2l0aCgiPyIpOwogICAgICBpZiAoaXNPcHRpb25hbCkgewogICAgICAgIHBhcnQgPSBwYXJ0LnNsaWNlKDAsIC0xKTsKICAgICAgfQogICAgICBpZiAocGFydC5zdGFydHNXaXRoKCI6IikpIHsKICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSBwYXJ0LnNsaWNlKDEpOwogICAgICAgIGlmIChyb3V0ZVBhcnRzW2kxMV0gIT09IHZvaWQgMCkgewogICAgICAgICAgcGFyYW1zMltwYXJhbU5hbWVdID0gcm91dGVQYXJ0c1tpMTFdOwogICAgICAgIH0gZWxzZSBpZiAoIWlzT3B0aW9uYWwpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChyb3V0ZVBhcnRzW2kxMV0gIT09IHBhcnQpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBhcmFtczI7CiAgfQogIC8qKgogICAqIENoZWNrIGlmIG5hdmlnYXRpb24gYXdheSBmcm9tIGN1cnJlbnQgdmlldyBpcyBhbGxvd2VkCiAgICovCiAgYXN5bmMgY2FuTGVhdmVDdXJyZW50VmlldygpIHsKICAgIGlmICghdGhpcy5jdXJyZW50Vmlld0lkKQogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZXMuZ2V0KHRoaXMuY3VycmVudFZpZXdJZCk7CiAgICBpZiAoIWluc3RhbmNlKQogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNvbnN0IGxpZmVjeWNsZSA9IGluc3RhbmNlOwogICAgaWYgKHR5cGVvZiBsaWZlY3ljbGUuY2FuRGVhY3RpdmF0ZSA9PT0gImZ1bmN0aW9uIikgewogICAgICByZXR1cm4gYXdhaXQgbGlmZWN5Y2xlLmNhbkRlYWN0aXZhdGUoKTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICAvKioKICAgKiBBY3RpdmF0ZSBhIHZpZXcgLSBoYW5kbGVzIGNhY2hpbmcsIGxpZmVjeWNsZSwgYW5kIHJlbmRlcmluZwogICAqLwogIGFzeW5jIGFjdGl2YXRlVmlldyh2aWV3SWQsIGNvbnRhaW5lciwgcGFyYW1zMikgewogICAgY29uc3QgdmlldyA9IHRoaXMudmlld3MuZ2V0KHZpZXdJZCk7CiAgICBpZiAoIXZpZXcpIHsKICAgICAgY29uc29sZS5lcnJvcihgVmlldyAiJHt2aWV3SWR9IiBub3QgZm91bmQgaW4gcmVnaXN0cnlgKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBzaG91bGRDYWNoZSA9IHZpZXcuY2FjaGUgIT09IGZhbHNlOwogICAgaWYgKHRoaXMuY3VycmVudFZpZXdJZCAmJiB0aGlzLmN1cnJlbnRWaWV3SWQgIT09IHZpZXdJZCkgewogICAgICBhd2FpdCB0aGlzLmRlYWN0aXZhdGVWaWV3KHRoaXMuY3VycmVudFZpZXdJZCk7CiAgICB9CiAgICBsZXQgZWxlbWVudDQgPSBzaG91bGRDYWNoZSA/IHRoaXMuaW5zdGFuY2VzLmdldCh2aWV3SWQpIDogdm9pZCAwOwogICAgaWYgKGVsZW1lbnQ0KSB7CiAgICAgIGVsZW1lbnQ0LnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgIH0gZWxzZSB7CiAgICAgIGVsZW1lbnQ0ID0gYXdhaXQgdGhpcy5jcmVhdGVWaWV3RWxlbWVudCh2aWV3KTsKICAgICAgaWYgKCFlbGVtZW50NCkgewogICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZWxlbWVudCBmb3IgdmlldyAiJHt2aWV3SWR9ImApOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50NCk7CiAgICAgIGlmIChzaG91bGRDYWNoZSkgewogICAgICAgIHRoaXMuaW5zdGFuY2VzLnNldCh2aWV3SWQsIGVsZW1lbnQ0KTsKICAgICAgfQogICAgfQogICAgdGhpcy5jdXJyZW50Vmlld0lkID0gdmlld0lkOwogICAgYXdhaXQgdGhpcy5jYWxsT25BY3RpdmF0ZShlbGVtZW50NCwgdmlld0lkLCBwYXJhbXMyKTsKICAgIHJldHVybiBlbGVtZW50NDsKICB9CiAgLyoqCiAgICogRGVhY3RpdmF0ZSBhIHZpZXcgKGhpZGUgYW5kIGNhbGwgbGlmZWN5Y2xlIGhvb2spCiAgICovCiAgYXN5bmMgZGVhY3RpdmF0ZVZpZXcodmlld0lkKSB7CiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2VzLmdldCh2aWV3SWQpOwogICAgaWYgKCFpbnN0YW5jZSkKICAgICAgcmV0dXJuOwogICAgY29uc3QgbGlmZWN5Y2xlID0gaW5zdGFuY2U7CiAgICBpZiAodHlwZW9mIGxpZmVjeWNsZS5vbkRlYWN0aXZhdGUgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgYXdhaXQgbGlmZWN5Y2xlLm9uRGVhY3RpdmF0ZSgpOwogICAgfQogICAgaW5zdGFuY2Uuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICB9CiAgLyoqCiAgICogQ3JlYXRlIGEgdmlldyBlbGVtZW50IGZyb20gaXRzIGRlZmluaXRpb24gKHN1cHBvcnRzIGFzeW5jIGNvbnRlbnQpCiAgICovCiAgYXN5bmMgY3JlYXRlVmlld0VsZW1lbnQodmlldykgewogICAgbGV0IGNvbnRlbnQzID0gdmlldy5jb250ZW50OwogICAgaWYgKHR5cGVvZiBjb250ZW50MyA9PT0gImZ1bmN0aW9uIiAmJiAhKGNvbnRlbnQzLnByb3RvdHlwZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSAmJiBjb250ZW50My5jb25zdHJ1Y3Rvci5uYW1lID09PSAiQXN5bmNGdW5jdGlvbiIpIHsKICAgICAgdHJ5IHsKICAgICAgICBjb250ZW50MyA9IGF3YWl0IGNvbnRlbnQzKCk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGxvYWQgYXN5bmMgY29udGVudCBmb3IgdmlldyAiJHt2aWV3LmlkfSI6YCwgZXJyb3IpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBsZXQgZWxlbWVudDQ7CiAgICBpZiAodHlwZW9mIGNvbnRlbnQzID09PSAic3RyaW5nIikgewogICAgICBlbGVtZW50NCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoY29udGVudDMpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgY29udGVudDMgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgaWYgKGNvbnRlbnQzLnByb3RvdHlwZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7CiAgICAgICAgZWxlbWVudDQgPSBuZXcgY29udGVudDMoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgd3JhcHBlci5jbGFzc05hbWUgPSAidmlldy1jb250ZW50LXdyYXBwZXIiOwogICAgICAgIHdyYXBwZXIuc3R5bGUuY3NzVGV4dCA9ICJkaXNwbGF5OiBjb250ZW50czsiOwogICAgICAgIGNvbnN0IHRlbXBsYXRlID0gY29udGVudDMoKTsKICAgICAgICBEKHRlbXBsYXRlLCB3cmFwcGVyKTsKICAgICAgICBlbGVtZW50NCA9IHdyYXBwZXI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgY29udGVudCB0eXBlIGZvciB2aWV3ICIke3ZpZXcuaWR9ImApOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGVsZW1lbnQ0LmRhdGFzZXQudmlld0lkID0gdmlldy5pZDsKICAgIHJldHVybiBlbGVtZW50NDsKICB9CiAgLyoqCiAgICogQ2FsbCBvbkFjdGl2YXRlIGxpZmVjeWNsZSBob29rIG9uIGEgdmlldyBlbGVtZW50CiAgICovCiAgYXN5bmMgY2FsbE9uQWN0aXZhdGUoZWxlbWVudDQsIHZpZXdJZCwgcGFyYW1zMikgewogICAgY29uc3QgbGlmZWN5Y2xlID0gZWxlbWVudDQ7CiAgICBpZiAodHlwZW9mIGxpZmVjeWNsZS5vbkFjdGl2YXRlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIGNvbnN0IGNvbnRleHQyID0gewogICAgICAgIGFwcHVpOiB0aGlzLmFwcHVpLAogICAgICAgIHZpZXdJZCwKICAgICAgICBwYXJhbXM6IHBhcmFtczIKICAgICAgfTsKICAgICAgYXdhaXQgbGlmZWN5Y2xlLm9uQWN0aXZhdGUoY29udGV4dDIpOwogICAgfQogIH0KICAvKioKICAgKiBMZWdhY3kgbWV0aG9kIC0gcmVuZGVycyB2aWV3IHdpdGhvdXQgY2FjaGluZwogICAqIEBkZXByZWNhdGVkIFVzZSBhY3RpdmF0ZVZpZXcgaW5zdGVhZAogICAqLwogIHJlbmRlclZpZXcodmlld0lkLCBjb250YWluZXIpIHsKICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdzLmdldCh2aWV3SWQpOwogICAgaWYgKCF2aWV3KSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYFZpZXcgIiR7dmlld0lkfSIgbm90IGZvdW5kIGluIHJlZ2lzdHJ5YCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29udGFpbmVyLmlubmVySFRNTCA9ICIiOwogICAgbGV0IGVsZW1lbnQ0OwogICAgY29uc3QgY29udGVudDMgPSB2aWV3LmNvbnRlbnQ7CiAgICBpZiAodHlwZW9mIGNvbnRlbnQzID09PSAic3RyaW5nIikgewogICAgICBlbGVtZW50NCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoY29udGVudDMpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgY29udGVudDMgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgaWYgKGNvbnRlbnQzLnByb3RvdHlwZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7CiAgICAgICAgZWxlbWVudDQgPSBuZXcgY29udGVudDMoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgd3JhcHBlci5jbGFzc05hbWUgPSAidmlldy1jb250ZW50LXdyYXBwZXIiOwogICAgICAgIHdyYXBwZXIuc3R5bGUuY3NzVGV4dCA9ICJkaXNwbGF5OiBjb250ZW50czsiOwogICAgICAgIGNvbnN0IHRlbXBsYXRlID0gY29udGVudDMoKTsKICAgICAgICBEKHRlbXBsYXRlLCB3cmFwcGVyKTsKICAgICAgICBlbGVtZW50NCA9IHdyYXBwZXI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgY29udGVudCB0eXBlIGZvciB2aWV3ICIke3ZpZXdJZH0iYCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQ0KTsKICAgIHRoaXMuaW5zdGFuY2VzLnNldCh2aWV3SWQsIGVsZW1lbnQ0KTsKICAgIHRoaXMuY3VycmVudFZpZXdJZCA9IHZpZXdJZDsKICAgIHJldHVybiBlbGVtZW50NDsKICB9CiAgLyoqCiAgICogR2V0IGN1cnJlbnRseSBhY3RpdmUgdmlldyBJRAogICAqLwogIGdldEN1cnJlbnRWaWV3SWQoKSB7CiAgICByZXR1cm4gdGhpcy5jdXJyZW50Vmlld0lkOwogIH0KICAvKioKICAgKiBHZXQgY2FjaGVkIGluc3RhbmNlIG9mIGEgdmlldwogICAqLwogIGdldEluc3RhbmNlKHZpZXdJZCkgewogICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzLmdldCh2aWV3SWQpOwogIH0KICAvKioKICAgKiBDbGVhciBhIHNwZWNpZmljIGNhY2hlZCBpbnN0YW5jZQogICAqLwogIGNsZWFySW5zdGFuY2Uodmlld0lkKSB7CiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2VzLmdldCh2aWV3SWQpOwogICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLnBhcmVudE5vZGUpIHsKICAgICAgaW5zdGFuY2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpbnN0YW5jZSk7CiAgICB9CiAgICB0aGlzLmluc3RhbmNlcy5kZWxldGUodmlld0lkKTsKICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3SWQgPT09IHZpZXdJZCkgewogICAgICB0aGlzLmN1cnJlbnRWaWV3SWQgPSBudWxsOwogICAgfQogIH0KICAvKioKICAgKiBDbGVhciBhbGwgaW5zdGFuY2VzCiAgICovCiAgY2xlYXJJbnN0YW5jZXMoKSB7CiAgICBmb3IgKGNvbnN0IFt2aWV3SWQsIGluc3RhbmNlXSBvZiB0aGlzLmluc3RhbmNlcykgewogICAgICBpZiAoaW5zdGFuY2UucGFyZW50Tm9kZSkgewogICAgICAgIGluc3RhbmNlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaW5zdGFuY2UpOwogICAgICB9CiAgICB9CiAgICB0aGlzLmluc3RhbmNlcy5jbGVhcigpOwogICAgdGhpcy5jdXJyZW50Vmlld0lkID0gbnVsbDsKICB9CiAgLyoqCiAgICogVW5yZWdpc3RlciBhIHZpZXcKICAgKi8KICB1bnJlZ2lzdGVyKHZpZXdJZCkgewogICAgdGhpcy5jbGVhckluc3RhbmNlKHZpZXdJZCk7CiAgICByZXR1cm4gdGhpcy52aWV3cy5kZWxldGUodmlld0lkKTsKICB9CiAgLyoqCiAgICogQ2xlYXIgdGhlIHJlZ2lzdHJ5CiAgICovCiAgY2xlYXIoKSB7CiAgICB0aGlzLnZpZXdzLmNsZWFyKCk7CiAgICB0aGlzLmNsZWFySW5zdGFuY2VzKCk7CiAgfQogIC8qKgogICAqIENoZWNrIGlmIGEgdmlldyBpcyByZWdpc3RlcmVkCiAgICovCiAgaGFzKHZpZXdJZCkgewogICAgcmV0dXJuIHRoaXMudmlld3MuaGFzKHZpZXdJZCk7CiAgfQogIC8qKgogICAqIEdldCB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgdmlld3MKICAgKi8KICBnZXQgc2l6ZSgpIHsKICAgIHJldHVybiB0aGlzLnZpZXdzLnNpemU7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWFwcHVpL2RlZXMtYXBwdWktbWFpbm1lbnUvZGVlcy1hcHB1aS1tYWlubWVudS5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vRnVuYzI4ID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgLmRlbW8tbWFpbm1lbnUtY29udGFpbmVyIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBiYWNrZ3JvdW5kOiAjMWExYTFhOwogICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICB9CiAgICAuZGVtby1tYWlubWVudS1jb250YWluZXIgLnNwYWNlciB7CiAgICAgIGZsZXg6IDE7CiAgICAgIGJhY2tncm91bmQ6ICMwZjBmMGY7CiAgICB9CiAgPC9zdHlsZT4KICA8ZGl2IGNsYXNzPSJkZW1vLW1haW5tZW51LWNvbnRhaW5lciI+CiAgICA8ZGVlcy1hcHB1aS1tYWlubWVudQogICAgICAubG9nb0ljb249JHsibHVjaWRlOmJveCJ9CiAgICAgIC5sb2dvVGV4dD0keyJBY21lIEFwcCJ9CiAgICAgIC5tZW51R3JvdXBzPSR7WwogIHsKICAgIHRhYnM6IFsKICAgICAgeyBrZXk6ICJEYXNoYm9hcmQiLCBpY29uTmFtZTogImx1Y2lkZTpob21lIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiRGFzaGJvYXJkIikgfSwKICAgICAgeyBrZXk6ICJJbmJveCIsIGljb25OYW1lOiAibHVjaWRlOmluYm94IiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiSW5ib3giKSB9CiAgICBdCiAgfSwKICB7CiAgICBuYW1lOiAiV29ya3NwYWNlIiwKICAgIHRhYnM6IFsKICAgICAgeyBrZXk6ICJQcm9qZWN0cyIsIGljb25OYW1lOiAibHVjaWRlOmZvbGRlciIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIlByb2plY3RzIikgfSwKICAgICAgeyBrZXk6ICJUYXNrcyIsIGljb25OYW1lOiAibHVjaWRlOmNoZWNrU3F1YXJlIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiVGFza3MiKSB9LAogICAgICB7IGtleTogIkRvY3VtZW50cyIsIGljb25OYW1lOiAibHVjaWRlOmZpbGVUZXh0IiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiRG9jdW1lbnRzIikgfQogICAgXQogIH0sCiAgewogICAgbmFtZTogIkFuYWx5dGljcyIsCiAgICB0YWJzOiBbCiAgICAgIHsga2V5OiAiUmVwb3J0cyIsIGljb25OYW1lOiAibHVjaWRlOmJhckNoYXJ0MyIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIlJlcG9ydHMiKSB9LAogICAgICB7IGtleTogIkluc2lnaHRzIiwgaWNvbk5hbWU6ICJsdWNpZGU6bGlnaHRidWxiIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiSW5zaWdodHMiKSB9CiAgICBdCiAgfQpdfQogICAgICAuYm90dG9tVGFicz0ke1sKICB7IGtleTogIlNldHRpbmdzIiwgaWNvbk5hbWU6ICJsdWNpZGU6c2V0dGluZ3MiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJTZXR0aW5ncyIpIH0sCiAgeyBrZXk6ICJIZWxwIiwgaWNvbk5hbWU6ICJsdWNpZGU6aGVscENpcmNsZSIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIkhlbHAiKSB9Cl19CiAgICA+PC9kZWVzLWFwcHVpLW1haW5tZW51PgogICAgPGRpdiBjbGFzcz0ic3BhY2VyIj48L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1hcHB1aS9kZWVzLWFwcHVpLW1haW5tZW51L2RlZXMtYXBwdWktbWFpbm1lbnUuanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlMzcgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczM4ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzQXBwdWlNYWlubWVudSA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtYXBwdWktbWFpbm1lbnUiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9sb2dvSWNvbl9kZWNvcmF0b3JzOwogIGxldCBfbG9nb0ljb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb2dvSWNvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbG9nb1RleHRfZGVjb3JhdG9yczsKICBsZXQgX2xvZ29UZXh0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbG9nb1RleHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21lbnVHcm91cHNfZGVjb3JhdG9yczsKICBsZXQgX21lbnVHcm91cHNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tZW51R3JvdXBzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ib3R0b21UYWJzX2RlY29yYXRvcnM7CiAgbGV0IF9ib3R0b21UYWJzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYm90dG9tVGFic19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGFic19kZWNvcmF0b3JzOwogIGxldCBfdGFic19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RhYnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkVGFiX2RlY29yYXRvcnM7CiAgbGV0IF9zZWxlY3RlZFRhYl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkVGFiX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb2xsYXBzZWRfZGVjb3JhdG9yczsKICBsZXQgX2NvbGxhcHNlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbGxhcHNlZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzQXBwdWlNYWlubWVudTIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9sb2dvSWNvbl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2xvZ29UZXh0X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfbWVudUdyb3Vwc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfYm90dG9tVGFic19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfdGFic19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfc2VsZWN0ZWRUYWJfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX2NvbGxhcHNlZF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTM3KHRoaXMsIG51bGwsIF9sb2dvSWNvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsb2dvSWNvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibG9nb0ljb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubG9nb0ljb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxvZ29JY29uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xvZ29JY29uX2luaXRpYWxpemVycywgX2xvZ29JY29uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzcodGhpcywgbnVsbCwgX2xvZ29UZXh0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxvZ29UZXh0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsb2dvVGV4dCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sb2dvVGV4dCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubG9nb1RleHQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbG9nb1RleHRfaW5pdGlhbGl6ZXJzLCBfbG9nb1RleHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzNyh0aGlzLCBudWxsLCBfbWVudUdyb3Vwc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtZW51R3JvdXBzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtZW51R3JvdXBzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1lbnVHcm91cHMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1lbnVHcm91cHMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWVudUdyb3Vwc19pbml0aWFsaXplcnMsIF9tZW51R3JvdXBzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzcodGhpcywgbnVsbCwgX2JvdHRvbVRhYnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYm90dG9tVGFicyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYm90dG9tVGFicyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5ib3R0b21UYWJzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5ib3R0b21UYWJzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2JvdHRvbVRhYnNfaW5pdGlhbGl6ZXJzLCBfYm90dG9tVGFic19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM3KHRoaXMsIG51bGwsIF90YWJzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRhYnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRhYnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudGFicywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGFicyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90YWJzX2luaXRpYWxpemVycywgX3RhYnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzNyh0aGlzLCBudWxsLCBfc2VsZWN0ZWRUYWJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0ZWRUYWIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlbGVjdGVkVGFiIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGVkVGFiLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3RlZFRhYiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWxlY3RlZFRhYl9pbml0aWFsaXplcnMsIF9zZWxlY3RlZFRhYl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM3KHRoaXMsIG51bGwsIF9jb2xsYXBzZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29sbGFwc2VkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb2xsYXBzZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29sbGFwc2VkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jb2xsYXBzZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29sbGFwc2VkX2luaXRpYWxpemVycywgX2NvbGxhcHNlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM3KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0FwcHVpTWFpbm1lbnUyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMyODsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJBcHAgVUkiXTsKICAgICNsb2dvSWNvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMzOCh0aGlzLCBfbG9nb0ljb25faW5pdGlhbGl6ZXJzLCAiIik7CiAgICAvLyBJTlNUQU5DRQogICAgLy8gTG9nbyBwcm9wZXJ0aWVzCiAgICBnZXQgbG9nb0ljb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNsb2dvSWNvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxvZ29JY29uKHZhbHVlMikgewogICAgICB0aGlzLiNsb2dvSWNvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2xvZ29UZXh0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzOCh0aGlzLCBfbG9nb0ljb25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM4KHRoaXMsIF9sb2dvVGV4dF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgbG9nb1RleHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNsb2dvVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxvZ29UZXh0KHZhbHVlMikgewogICAgICB0aGlzLiNsb2dvVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21lbnVHcm91cHNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM4KHRoaXMsIF9sb2dvVGV4dF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzgodGhpcywgX21lbnVHcm91cHNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgLy8gTWVudSBncm91cHMgKG5ldyB3YXkpCiAgICBnZXQgbWVudUdyb3VwcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI21lbnVHcm91cHNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtZW51R3JvdXBzKHZhbHVlMikgewogICAgICB0aGlzLiNtZW51R3JvdXBzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYm90dG9tVGFic19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzgodGhpcywgX21lbnVHcm91cHNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM4KHRoaXMsIF9ib3R0b21UYWJzX2luaXRpYWxpemVycywgW10pKTsKICAgIC8vIEJvdHRvbSB0YWJzIChwaW5uZWQgdG8gYm90dG9tKQogICAgZ2V0IGJvdHRvbVRhYnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNib3R0b21UYWJzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYm90dG9tVGFicyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYm90dG9tVGFic19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3RhYnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM4KHRoaXMsIF9ib3R0b21UYWJzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzOCh0aGlzLCBfdGFic19pbml0aWFsaXplcnMsIFtdKSk7CiAgICAvLyBMZWdhY3kgdGFicyBwcm9wZXJ0eSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpCiAgICBnZXQgdGFicygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RhYnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0YWJzKHZhbHVlMikgewogICAgICB0aGlzLiN0YWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0ZWRUYWJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM4KHRoaXMsIF90YWJzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzOCh0aGlzLCBfc2VsZWN0ZWRUYWJfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBzZWxlY3RlZFRhYigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkVGFiX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0ZWRUYWIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlbGVjdGVkVGFiX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29sbGFwc2VkX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzOCh0aGlzLCBfc2VsZWN0ZWRUYWJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM4KHRoaXMsIF9jb2xsYXBzZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGNvbGxhcHNlZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvbGxhcHNlZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNvbGxhcHNlZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29sbGFwc2VkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIC0tbWVudS13aWR0aC1leHBhbmRlZDogMjAwcHg7CiAgICAgICAgLS1tZW51LXdpZHRoLWNvbGxhcHNlZDogNTZweDsKICAgICAgICAtLXRvb2x0aXAtYmc6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTgxODFiIiwgIiNmYWZhZmEiKX07CiAgICAgICAgLS10b29sdGlwLWZnOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZhZmFmYSIsICIjMTgxODFiIil9OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5tYWluQ29udGFpbmVyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2NjYiLCAiI2NjYyIpfTsKICAgICAgICB6LWluZGV4OiAke3pJbmRleExheWVycy5maXhlZC5hcHBCYXJ9OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IHZhcigtLW1lbnUtd2lkdGgtZXhwYW5kZWQpOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZhZmFmYSIsICIjMGEwYTBhIil9OwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlNWU1IiwgIiMxYTFhMWEiKX07CiAgICAgICAgZm9udC1mYW1pbHk6ICdHZWlzdCBTYW5zJywgJ0ludGVyJywgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBzYW5zLXNlcmlmOwogICAgICAgIHRyYW5zaXRpb246IHdpZHRoIDAuMjVzIGVhc2U7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjb2xsYXBzZWRdKSAubWFpbkNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IHZhcigtLW1lbnUtd2lkdGgtY29sbGFwc2VkKTsKICAgICAgfQoKICAgICAgLyogRmxvYXRpbmcgY29sbGFwc2UgdG9nZ2xlIGJ1dHRvbiAqLwogICAgICAuY29sbGFwc2UtdG9nZ2xlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IC0xMnB4OwogICAgICAgIHRvcDogMjRweDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICAgICAgd2lkdGg6IDI0cHg7CiAgICAgICAgaGVpZ2h0OiAyNHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMjcyNzJhIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlNWU1IiwgIiMzZjNmNDYiKX07CiAgICAgICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xKTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgei1pbmRleDogMTA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzczNzM3MyIsICIjYTFhMWFhIil9OwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2UsIGJhY2tncm91bmQgMC4xNXMgZWFzZTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAuY29sbGFwc2UtdG9nZ2xlOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjM2YzZjQ2Iil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzBhMGEwYSIsICIjZmFmYWZhIil9OwogICAgICB9CgogICAgICA6aG9zdCg6aG92ZXIpIC5jb2xsYXBzZS10b2dnbGUgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5jb2xsYXBzZS10b2dnbGUgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIC8qIExvZ28gU2VjdGlvbiAqLwogICAgICAubG9nb1NlY3Rpb24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEwcHg7CiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIHBhZGRpbmc6IDAgMTRweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU1ZTUiLCAiIzFhMWExYSIpfTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAubG9nb1NlY3Rpb24gLmxvZ29JY29uIHsKICAgICAgICBmb250LXNpemU6IDIycHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMGEwYTBhIiwgIiNmYWZhZmEiKX07CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5sb2dvU2VjdGlvbiAubG9nb1RleHQgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgZm9udC1zaXplOiAxNXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMGEwYTBhIiwgIiNmYWZhZmEiKX07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycyBlYXNlLCB3aWR0aCAwLjI1cyBlYXNlOwogICAgICB9CgogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLmxvZ29TZWN0aW9uIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGdhcDogMDsKICAgICAgfQoKICAgICAgOmhvc3QoW2NvbGxhcHNlZF0pIC5sb2dvU2VjdGlvbiAubG9nb1RleHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIE1pZGRsZSBTZWN0aW9uIChzY3JvbGxhYmxlKSAqLwogICAgICAubWVudVNlY3Rpb24gewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjsKICAgICAgICBwYWRkaW5nOiA4cHggMDsKICAgICAgfQoKICAgICAgLm1lbnVTZWN0aW9uOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICAgICAgd2lkdGg6IDZweDsKICAgICAgfQoKICAgICAgLm1lbnVTZWN0aW9uOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC5tZW51U2VjdGlvbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMTUpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICB9CgogICAgICAubWVudVNlY3Rpb246Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjI1KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjUpIil9OwogICAgICB9CgogICAgICAvKiBNZW51IEdyb3VwICovCiAgICAgIC5tZW51R3JvdXAgewogICAgICAgIHBhZGRpbmc6IDAgOHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgfQoKICAgICAgLm1lbnVHcm91cDpsYXN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICB9CgogICAgICAuZ3JvdXBIZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4IDZweDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MzczNzMiLCAiIzczNzM3MyIpfTsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2UsIG1heC1oZWlnaHQgMC4yNXMgZWFzZTsKICAgICAgICBtYXgtaGVpZ2h0OiAzMHB4OwogICAgICB9CgogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLmdyb3VwSGVhZGVyIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIG1heC1oZWlnaHQ6IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KCiAgICAgIC5ncm91cFRhYnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDJweDsKICAgICAgfQoKICAgICAgOmhvc3QoW2NvbGxhcHNlZF0pIC5tZW51R3JvdXAgewogICAgICAgIHBhZGRpbmc6IDAgNHB4OwogICAgICB9CgogICAgICAvKiBUYWIgSXRlbSAqLwogICAgICAudGFiIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTJweDsKICAgICAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM1MjUyNTIiLCAiI2EzYTNhMyIpfTsKICAgICAgfQoKICAgICAgLnRhYjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wNCkiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyNjI2MjYiLCAiI2U1ZTVlNSIpfTsKICAgICAgfQoKICAgICAgLnRhYjphY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDYpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkiKX07CiAgICAgIH0KCiAgICAgIC50YWIuc2VsZWN0ZWRUYWIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDYpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMGEwYTBhIiwgIiNmYWZhZmEiKX07CiAgICAgIH0KCiAgICAgIC50YWIuc2VsZWN0ZWRUYWI6OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOwogICAgICAgIHdpZHRoOiAzcHg7CiAgICAgICAgaGVpZ2h0OiAxNnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMGEwYTBhIiwgIiNmYWZhZmEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAycHggMnB4IDA7CiAgICAgIH0KCiAgICAgIC50YWIgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgb3BhY2l0eTogMC44NTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLnRhYi5zZWxlY3RlZFRhYiBkZWVzLWljb24gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC50YWIgLnRhYkxhYmVsIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZSwgd2lkdGggMC4yNXMgZWFzZTsKICAgICAgfQoKICAgICAgLyogQ29sbGFwc2VkIHRhYiBzdHlsZXMgKi8KICAgICAgOmhvc3QoW2NvbGxhcHNlZF0pIC50YWIgewogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICAgICAgZ2FwOiAwOwogICAgICB9CgogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLnRhYiAudGFiTGFiZWwgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgd2lkdGg6IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLnRhYi5zZWxlY3RlZFRhYjo6YmVmb3JlIHsKICAgICAgICBsZWZ0OiAtNHB4OwogICAgICB9CgogICAgICAvKiBUb29sdGlwIGZvciBjb2xsYXBzZWQgc3RhdGUgKi8KICAgICAgLnRhYi10b29sdGlwIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogMTAwJTsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEycHg7CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdG9vbHRpcC1iZyk7CiAgICAgICAgY29sb3I6IHZhcigtLXRvb2x0aXAtZmcpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cyBlYXNlOwogICAgICAgIHotaW5kZXg6IDEwMDA7CiAgICAgICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7CiAgICAgIH0KCiAgICAgIC50YWItdG9vbHRpcDo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogLTRweDsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICAgICAgYm9yZGVyOiA0cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB2YXIoLS10b29sdGlwLWJnKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NvbGxhcHNlZF0pIC50YWI6aG92ZXIgLnRhYi10b29sdGlwIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IDFzOwogICAgICB9CgogICAgICAvKiBCYWRnZSBzdHlsZXMgKi8KICAgICAgLmJhZGdlIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIG1pbi13aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgICAgcGFkZGluZzogMCA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOXB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgICB9CgogICAgICAuYmFkZ2UuZGVmYXVsdCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmNGY0ZjUiLCAiIzI3MjcyYSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzZjNmNDYiLCAiI2ExYTFhYSIpfTsKICAgICAgfQoKICAgICAgLmJhZGdlLnN1Y2Nlc3MgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZGNmY2U3IiwgIiMxNDUzMmQiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTY2NTM0IiwgIiM0YWRlODAiKX07CiAgICAgIH0KCiAgICAgIC5iYWRnZS53YXJuaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZlZjNjNyIsICIjNDUxYTAzIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzkyNDAwZSIsICIjZmJiZjI0Iil9OwogICAgICB9CgogICAgICAuYmFkZ2UuZXJyb3IgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmVlMmUyIiwgIiM0NTBhMGEiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOTkxYjFiIiwgIiNmODcxNzEiKX07CiAgICAgIH0KCiAgICAgIDpob3N0KFtjb2xsYXBzZWRdKSAuYmFkZ2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIEJvdHRvbSBTZWN0aW9uICovCiAgICAgIC5ib3R0b21TZWN0aW9uIHsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlNWU1IiwgIiMxYTFhMWEiKX07CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogMnB4OwogICAgICB9CgogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLmJvdHRvbVNlY3Rpb24gewogICAgICAgIHBhZGRpbmc6IDhweCA0cHg7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIGNvbnN0IGFsbFRhYnMgPSB0aGlzLmdldEFsbFRhYnMoKTsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJtYWluQ29udGFpbmVyIiBAY29udGV4dG1lbnU9JHsoZXZlbnRBcmcpID0+IHsKICAgICAgICBEZWVzQ29udGV4dG1lbnUub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZXZlbnRBcmcsIFt7CiAgICAgICAgICBuYW1lOiAiYXBwIHNldHRpbmdzIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgfSwKICAgICAgICAgIGljb25OYW1lOiAiZ2VhciIKICAgICAgICB9XSk7CiAgICAgIH19PgogICAgICAgICR7dGhpcy5sb2dvSWNvbiB8fCB0aGlzLmxvZ29UZXh0ID8gYjJgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2dvU2VjdGlvbiI+CiAgICAgICAgICAgICR7dGhpcy5sb2dvSWNvbiA/IGIyYDxkZWVzLWljb24gY2xhc3M9ImxvZ29JY29uIiAuaWNvbj0iJHt0aGlzLmxvZ29JY29ufSI+PC9kZWVzLWljb24+YCA6ICIifQogICAgICAgICAgICAke3RoaXMubG9nb1RleHQgPyBiMmA8c3BhbiBjbGFzcz0ibG9nb1RleHQiPiR7dGhpcy5sb2dvVGV4dH08L3NwYW4+YCA6ICIifQogICAgICAgICAgPC9kaXY+CiAgICAgICAgYCA6ICIifQoKICAgICAgICA8ZGl2IGNsYXNzPSJtZW51U2VjdGlvbiI+CiAgICAgICAgICAke3RoaXMubWVudUdyb3Vwcy5sZW5ndGggPiAwID8gdGhpcy5yZW5kZXJNZW51R3JvdXBzKCkgOiB0aGlzLnJlbmRlckxlZ2FjeVRhYnMoKX0KICAgICAgICA8L2Rpdj4KCiAgICAgICAgJHt0aGlzLmJvdHRvbVRhYnMubGVuZ3RoID4gMCA/IGIyYAogICAgICAgICAgPGRpdiBjbGFzcz0iYm90dG9tU2VjdGlvbiI+CiAgICAgICAgICAgICR7dGhpcy5ib3R0b21UYWJzLm1hcCgodGFiQXJnKSA9PiB0aGlzLnJlbmRlclRhYih0YWJBcmcpKX0KICAgICAgICAgIDwvZGl2PgogICAgICAgIGAgOiAiIn0KICAgICAgPC9kaXY+CiAgICAgIDxidXR0b24gY2xhc3M9ImNvbGxhcHNlLXRvZ2dsZSIgQGNsaWNrPSIkeygpID0+IHRoaXMudG9nZ2xlQ29sbGFwc2UoKX0iPgogICAgICAgIDxkZWVzLWljb24gLmljb249IiR7dGhpcy5jb2xsYXBzZWQgPyAibHVjaWRlOmNoZXZyb25SaWdodCIgOiAibHVjaWRlOmNoZXZyb25MZWZ0In0iPjwvZGVlcy1pY29uPgogICAgICA8L2J1dHRvbj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJNZW51R3JvdXBzKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgICR7dGhpcy5tZW51R3JvdXBzLm1hcCgoZ3JvdXApID0+IGIyYAogICAgICAgIDxkaXYgY2xhc3M9Im1lbnVHcm91cCI+CiAgICAgICAgICAke2dyb3VwLm5hbWUgPyBiMmA8ZGl2IGNsYXNzPSJncm91cEhlYWRlciI+JHtncm91cC5uYW1lfTwvZGl2PmAgOiAiIn0KICAgICAgICAgIDxkaXYgY2xhc3M9Imdyb3VwVGFicyI+CiAgICAgICAgICAgICR7Z3JvdXAuaXRlbXMubWFwKCh0YWJBcmcpID0+IHRoaXMucmVuZGVyVGFiKHRhYkFyZykpfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIGApfQogICAgYDsKICAgIH0KICAgIHJlbmRlckxlZ2FjeVRhYnMoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0ibWVudUdyb3VwIj4KICAgICAgICA8ZGl2IGNsYXNzPSJncm91cFRhYnMiPgogICAgICAgICAgJHt0aGlzLnRhYnMubWFwKCh0YWJBcmcpID0+IHRoaXMucmVuZGVyVGFiKHRhYkFyZykpfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJUYWIodGFiQXJnKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdgogICAgICAgIGNsYXNzPSJ0YWIgJHt0YWJBcmcgPT09IHRoaXMuc2VsZWN0ZWRUYWIgPyAic2VsZWN0ZWRUYWIiIDogIiJ9IgogICAgICAgIEBjbGljaz0iJHsoKSA9PiB7CiAgICAgICAgdGhpcy51cGRhdGVUYWIodGFiQXJnKTsKICAgICAgfX0iCiAgICAgID4KICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSIke3RhYkFyZy5pY29uTmFtZSB8fCAiIn0iPjwvZGVlcy1pY29uPgogICAgICAgIDxzcGFuIGNsYXNzPSJ0YWJMYWJlbCI+JHt0YWJBcmcua2V5fTwvc3Bhbj4KICAgICAgICAke3RhYkFyZy5iYWRnZSAhPT0gdm9pZCAwID8gYjJgCiAgICAgICAgICA8c3BhbiBjbGFzcz0iYmFkZ2UgJHt0YWJBcmcuYmFkZ2VWYXJpYW50IHx8ICJkZWZhdWx0In0iPiR7dGFiQXJnLmJhZGdlfTwvc3Bhbj4KICAgICAgICBgIDogIiJ9CiAgICAgICAgPHNwYW4gY2xhc3M9InRhYi10b29sdGlwIj4ke3RhYkFyZy5rZXl9PC9zcGFuPgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBnZXRBbGxUYWJzKCkgewogICAgICBpZiAodGhpcy5tZW51R3JvdXBzLmxlbmd0aCA+IDApIHsKICAgICAgICBjb25zdCBncm91cFRhYnMgPSB0aGlzLm1lbnVHcm91cHMuZmxhdE1hcCgoZ3JvdXApID0+IGdyb3VwLml0ZW1zKTsKICAgICAgICByZXR1cm4gWy4uLmdyb3VwVGFicywgLi4udGhpcy5ib3R0b21UYWJzXTsKICAgICAgfQogICAgICByZXR1cm4gWy4uLnRoaXMudGFicywgLi4udGhpcy5ib3R0b21UYWJzXTsKICAgIH0KICAgIHVwZGF0ZVRhYih0YWJBcmcpIHsKICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9IHRhYkFyZzsKICAgICAgdGhpcy5zZWxlY3RlZFRhYi5hY3Rpb24oKTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgidGFiLXNlbGVjdCIsIHsKICAgICAgICBkZXRhaWw6IHsgdGFiOiB0YWJBcmcgfSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGZpcnN0VXBkYXRlZCgpIHsKICAgICAgY29uc3QgYWxsVGFicyA9IHRoaXMuZ2V0QWxsVGFicygpOwogICAgICBpZiAoYWxsVGFicy5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhpcy51cGRhdGVUYWIoYWxsVGFic1swXSk7CiAgICAgIH0KICAgIH0KICAgIHRvZ2dsZUNvbGxhcHNlKCkgewogICAgICB0aGlzLmNvbGxhcHNlZCA9ICF0aGlzLmNvbGxhcHNlZDsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY29sbGFwc2UtY2hhbmdlIiwgewogICAgICAgIGRldGFpbDogeyBjb2xsYXBzZWQ6IHRoaXMuY29sbGFwc2VkIH0sCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnMzOCh0aGlzLCBfY29sbGFwc2VkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMzgoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNBcHB1aU1haW5tZW51MiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtYXBwdWkvZGVlcy1hcHB1aS1zZWNvbmRhcnltZW51L2RlZXMtYXBwdWktc2Vjb25kYXJ5bWVudS5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vRnVuYzI5ID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgLmRlbW8tc2Vjb25kYXJ5bWVudS1jb250YWluZXIgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIGJhY2tncm91bmQ6ICMxYTFhMWE7CiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIH0KICAgIC5kZW1vLXNlY29uZGFyeW1lbnUtY29udGFpbmVyIC5zcGFjZXIgewogICAgICBmbGV4OiAxOwogICAgICBiYWNrZ3JvdW5kOiAjMGYwZjBmOwogICAgICBwYWRkaW5nOiAyMHB4OwogICAgICBjb2xvcjogI2EzYTNhMzsKICAgICAgZm9udC1mYW1pbHk6ICdHZWlzdCBTYW5zJywgc2Fucy1zZXJpZjsKICAgIH0KICAgIC5kZW1vLXNlY29uZGFyeW1lbnUtY29udGFpbmVyIC5zcGFjZXIgaDMgewogICAgICBjb2xvcjogI2ZhZmFmYTsKICAgICAgbWFyZ2luLXRvcDogMDsKICAgIH0KICAgIC5kZW1vLXNlY29uZGFyeW1lbnUtY29udGFpbmVyIC5zcGFjZXIgY29kZSB7CiAgICAgIGJhY2tncm91bmQ6ICMyNzI3MmE7CiAgICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgfQogICAgLmRlbW8tc2Vjb25kYXJ5bWVudS1jb250YWluZXIgLnNwYWNlciB1bCB7CiAgICAgIGxpbmUtaGVpZ2h0OiAxLjg7CiAgICB9CiAgPC9zdHlsZT4KICA8ZGl2IGNsYXNzPSJkZW1vLXNlY29uZGFyeW1lbnUtY29udGFpbmVyIj4KICAgIDxkZWVzLWFwcHVpLXNlY29uZGFyeW1lbnUKICAgICAgLmhlYWRpbmc9JHsiUHJvamVjdHMifQogICAgICAuZ3JvdXBzPSR7WwogIC8vIEdyb3VwIDE6IFRhYiBpdGVtcyAoZGVmYXVsdCBiZWhhdmlvcikKICB7CiAgICBuYW1lOiAiTmF2aWdhdGlvbiIsCiAgICBpY29uTmFtZTogImx1Y2lkZTpjb21wYXNzIiwKICAgIGl0ZW1zOiBbCiAgICAgIHsga2V5OiAiRGFzaGJvYXJkIiwgaWNvbk5hbWU6ICJsdWNpZGU6bGF5b3V0RGFzaGJvYXJkIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiRGFzaGJvYXJkIGNsaWNrZWQiKSwgYmFkZ2U6IDMsIGJhZGdlVmFyaWFudDogIndhcm5pbmciIH0sCiAgICAgIHsga2V5OiAiUHJvamVjdHMiLCBpY29uTmFtZTogImx1Y2lkZTpmb2xkZXIiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJQcm9qZWN0cyBjbGlja2VkIiksIGJhZGdlOiAibmV3IiwgYmFkZ2VWYXJpYW50OiAic3VjY2VzcyIgfSwKICAgICAgeyBrZXk6ICJBbmFseXRpY3MiLCBpY29uTmFtZTogImx1Y2lkZTpiYXJDaGFydDIiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJBbmFseXRpY3MgY2xpY2tlZCIpIH0KICAgIF0KICB9LAogIC8vIEdyb3VwIDI6IEFjdGlvbnMKICB7CiAgICBuYW1lOiAiQWN0aW9ucyIsCiAgICBpY29uTmFtZTogImx1Y2lkZTp6YXAiLAogICAgaXRlbXM6IFsKICAgICAgeyB0eXBlOiAiYWN0aW9uIiwga2V5OiAiQ3JlYXRlIE5ldyIsIGljb25OYW1lOiAibHVjaWRlOnBsdXMiLCBhY3Rpb246ICgpID0+IGFsZXJ0KCJDcmVhdGUgTmV3IGNsaWNrZWQhIikgfSwKICAgICAgeyB0eXBlOiAiYWN0aW9uIiwga2V5OiAiSW1wb3J0IERhdGEiLCBpY29uTmFtZTogImx1Y2lkZTp1cGxvYWQiLCBhY3Rpb246ICgpID0+IGFsZXJ0KCJJbXBvcnQgRGF0YSBjbGlja2VkISIpIH0sCiAgICAgIHsgdHlwZTogImRpdmlkZXIiIH0sCiAgICAgIHsgdHlwZTogImFjdGlvbiIsIGtleTogIkRlbGV0ZSBBbGwiLCBpY29uTmFtZTogImx1Y2lkZTp0cmFzaDIiLCB2YXJpYW50OiAiZGFuZ2VyIiwgY29uZmlybU1lc3NhZ2U6ICJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIGFsbCBpdGVtcz8iLCBhY3Rpb246ICgpID0+IGFsZXJ0KCJEZWxldGVkISIpIH0KICAgIF0KICB9LAogIC8vIEdyb3VwIDM6IEZpbHRlcnMKICB7CiAgICBuYW1lOiAiRmlsdGVycyIsCiAgICBpY29uTmFtZTogImx1Y2lkZTpmaWx0ZXIiLAogICAgaXRlbXM6IFsKICAgICAgeyB0eXBlOiAiaGVhZGVyIiwgbGFiZWw6ICJTdGF0dXMiIH0sCiAgICAgIHsgdHlwZTogImZpbHRlciIsIGtleTogIlNob3cgQWN0aXZlIiwgaWNvbk5hbWU6ICJsdWNpZGU6Y2hlY2tDaXJjbGUiLCBhY3RpdmU6IHRydWUsIG9uVG9nZ2xlOiAoYWN0aXZlKSA9PiBjb25zb2xlLmxvZygiU2hvdyBBY3RpdmU6IiwgYWN0aXZlKSB9LAogICAgICB7IHR5cGU6ICJmaWx0ZXIiLCBrZXk6ICJTaG93IEFyY2hpdmVkIiwgaWNvbk5hbWU6ICJsdWNpZGU6YXJjaGl2ZSIsIGFjdGl2ZTogZmFsc2UsIG9uVG9nZ2xlOiAoYWN0aXZlKSA9PiBjb25zb2xlLmxvZygiU2hvdyBBcmNoaXZlZDoiLCBhY3RpdmUpIH0sCiAgICAgIHsgdHlwZTogImRpdmlkZXIiIH0sCiAgICAgIHsgdHlwZTogIm11bHRpRmlsdGVyIiwga2V5OiAiQ2F0ZWdvcmllcyIsIGljb25OYW1lOiAibHVjaWRlOnRhZyIsIGNvbGxhcHNlZDogZmFsc2UsIG9wdGlvbnM6IFsKICAgICAgICB7IGtleTogImZyb250ZW5kIiwgbGFiZWw6ICJGcm9udGVuZCIsIGNoZWNrZWQ6IHRydWUsIGljb25OYW1lOiAibHVjaWRlOm1vbml0b3IiIH0sCiAgICAgICAgeyBrZXk6ICJiYWNrZW5kIiwgbGFiZWw6ICJCYWNrZW5kIiwgY2hlY2tlZDogdHJ1ZSwgaWNvbk5hbWU6ICJsdWNpZGU6c2VydmVyIiB9LAogICAgICAgIHsga2V5OiAiZGV2b3BzIiwgbGFiZWw6ICJEZXZPcHMiLCBjaGVja2VkOiBmYWxzZSwgaWNvbk5hbWU6ICJsdWNpZGU6Y2xvdWQiIH0sCiAgICAgICAgeyBrZXk6ICJkZXNpZ24iLCBsYWJlbDogIkRlc2lnbiIsIGNoZWNrZWQ6IGZhbHNlLCBpY29uTmFtZTogImx1Y2lkZTpwYWxldHRlIiB9CiAgICAgIF0sIG9uQ2hhbmdlOiAoa2V5czIpID0+IGNvbnNvbGUubG9nKCJTZWxlY3RlZCBjYXRlZ29yaWVzOiIsIGtleXMyKSB9CiAgICBdCiAgfSwKICAvLyBHcm91cCA0OiBMaW5rcyBhbmQgbWlzYwogIHsKICAgIG5hbWU6ICJSZXNvdXJjZXMiLAogICAgaWNvbk5hbWU6ICJsdWNpZGU6Ym9va09wZW4iLAogICAgY29sbGFwc2VkOiB0cnVlLAogICAgaXRlbXM6IFsKICAgICAgeyB0eXBlOiAiaGVhZGVyIiwgbGFiZWw6ICJEb2N1bWVudGF0aW9uIiB9LAogICAgICB7IHR5cGU6ICJsaW5rIiwga2V5OiAiQVBJIFJlZmVyZW5jZSIsIGljb25OYW1lOiAibHVjaWRlOmZpbGVUZXh0IiwgaHJlZjogImh0dHBzOi8vYXBpLmV4YW1wbGUuY29tL2RvY3MiIH0sCiAgICAgIHsgdHlwZTogImxpbmsiLCBrZXk6ICJVc2VyIEd1aWRlIiwgaWNvbk5hbWU6ICJsdWNpZGU6Ym9vayIsIGhyZWY6ICJodHRwczovL2RvY3MuZXhhbXBsZS5jb20vZ3VpZGUiIH0sCiAgICAgIHsgdHlwZTogImRpdmlkZXIiIH0sCiAgICAgIHsgdHlwZTogImhlYWRlciIsIGxhYmVsOiAiU3VwcG9ydCIgfSwKICAgICAgeyB0eXBlOiAibGluayIsIGtleTogIkhlbHAgQ2VudGVyIiwgaWNvbk5hbWU6ICJsdWNpZGU6aGVscENpcmNsZSIsIGhyZWY6ICIvaGVscCIsIGV4dGVybmFsOiBmYWxzZSB9LAogICAgICB7IHR5cGU6ICJsaW5rIiwga2V5OiAiR2l0SHViIElzc3VlcyIsIGljb25OYW1lOiAibHVjaWRlOmdpdGh1YiIsIGhyZWY6ICJodHRwczovL2dpdGh1Yi5jb20vZXhhbXBsZS9pc3N1ZXMiIH0KICAgIF0KICB9Cl19CiAgICAgIEBpdGVtLXNlbGVjdD0keyhlMTEpID0+IGNvbnNvbGUubG9nKCJUYWIgc2VsZWN0ZWQ6IiwgZTExLmRldGFpbCl9CiAgICAgIEBhY3Rpb24tY2xpY2s9JHsoZTExKSA9PiBjb25zb2xlLmxvZygiQWN0aW9uIGNsaWNrZWQ6IiwgZTExLmRldGFpbCl9CiAgICAgIEBmaWx0ZXItdG9nZ2xlPSR7KGUxMSkgPT4gY29uc29sZS5sb2coIkZpbHRlciB0b2dnbGVkOiIsIGUxMS5kZXRhaWwpfQogICAgICBAbXVsdGlmaWx0ZXItY2hhbmdlPSR7KGUxMSkgPT4gY29uc29sZS5sb2coIk11bHRpLWZpbHRlciBjaGFuZ2VkOiIsIGUxMS5kZXRhaWwpfQogICAgICBAbGluay1jbGljaz0keyhlMTEpID0+IGNvbnNvbGUubG9nKCJMaW5rIGNsaWNrZWQ6IiwgZTExLmRldGFpbCl9CiAgICA+PC9kZWVzLWFwcHVpLXNlY29uZGFyeW1lbnU+CiAgICA8ZGl2IGNsYXNzPSJzcGFjZXIiPgogICAgICA8aDM+U2Vjb25kYXJ5IE1lbnUgRGVtbzwvaDM+CiAgICAgIDxwPlRoaXMgZGVtbyBzaG93Y2FzZXMgYWxsIDggaXRlbSB0eXBlczo8L3A+CiAgICAgIDx1bD4KICAgICAgICA8bGk+PGNvZGU+dGFiPC9jb2RlPiAtIFNlbGVjdGFibGUgaXRlbXMgKE5hdmlnYXRpb24gZ3JvdXApPC9saT4KICAgICAgICA8bGk+PGNvZGU+YWN0aW9uPC9jb2RlPiAtIEJsdWUgYWN0aW9ucyAoQWN0aW9ucyBncm91cCk8L2xpPgogICAgICAgIDxsaT48Y29kZT5hY3Rpb248L2NvZGU+IHdpdGggPGNvZGU+dmFyaWFudDogJ2Rhbmdlcic8L2NvZGU+IC0gUmVkIGRhbmdlciBhY3Rpb248L2xpPgogICAgICAgIDxsaT48Y29kZT5maWx0ZXI8L2NvZGU+IC0gQ2hlY2tib3ggdG9nZ2xlcyAoRmlsdGVycyBncm91cCk8L2xpPgogICAgICAgIDxsaT48Y29kZT5tdWx0aUZpbHRlcjwvY29kZT4gLSBDb2xsYXBzaWJsZSBtdWx0aS1zZWxlY3QgKENhdGVnb3JpZXMpPC9saT4KICAgICAgICA8bGk+PGNvZGU+ZGl2aWRlcjwvY29kZT4gLSBWaXN1YWwgc2VwYXJhdG9yczwvbGk+CiAgICAgICAgPGxpPjxjb2RlPmhlYWRlcjwvY29kZT4gLSBTZWN0aW9uIGxhYmVsczwvbGk+CiAgICAgICAgPGxpPjxjb2RlPmxpbms8L2NvZGU+IC0gRXh0ZXJuYWwvaW50ZXJuYWwgbGlua3MgKFJlc291cmNlcyBncm91cCk8L2xpPgogICAgICA8L3VsPgogICAgICA8cD5UcnkgdGhlIGNvbGxhcHNlIHRvZ2dsZSBvbiB0aGUgbGVmdCBlZGdlITwvcD4KICAgIDwvZGl2PgogIDwvZGl2PgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWFwcHVpL2RlZXMtYXBwdWktc2Vjb25kYXJ5bWVudS9kZWVzLWFwcHVpLXNlY29uZGFyeW1lbnUuanMKaW5pdF9kZWVzX2ljb24oKTsKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlMzggPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczM5ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzQXBwdWlTZWNvbmRhcnltZW51ID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1hcHB1aS1zZWNvbmRhcnltZW51IildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfaGVhZGluZ19kZWNvcmF0b3JzOwogIGxldCBfaGVhZGluZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2hlYWRpbmdfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2dyb3Vwc19kZWNvcmF0b3JzOwogIGxldCBfZ3JvdXBzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZ3JvdXBzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3Rpb25PcHRpb25zX2RlY29yYXRvcnM7CiAgbGV0IF9zZWxlY3Rpb25PcHRpb25zX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0aW9uT3B0aW9uc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRJdGVtX2RlY29yYXRvcnM7CiAgbGV0IF9zZWxlY3RlZEl0ZW1faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZEl0ZW1fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbGxhcHNlZEdyb3Vwc19kZWNvcmF0b3JzOwogIGxldCBfY29sbGFwc2VkR3JvdXBzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29sbGFwc2VkR3JvdXBzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb2xsYXBzZWRNdWx0aUZpbHRlcnNfZGVjb3JhdG9yczsKICBsZXQgX2NvbGxhcHNlZE11bHRpRmlsdGVyc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbGxhcHNlZE11bHRpRmlsdGVyc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVuZGVyQ291bnRlcl9kZWNvcmF0b3JzOwogIGxldCBfcmVuZGVyQ291bnRlcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlbmRlckNvdW50ZXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbGxhcHNlZF9kZWNvcmF0b3JzOwogIGxldCBfY29sbGFwc2VkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29sbGFwc2VkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNBcHB1aVNlY29uZGFyeW1lbnUyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfaGVhZGluZ19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2dyb3Vwc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfc2VsZWN0aW9uT3B0aW9uc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfc2VsZWN0ZWRJdGVtX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBPYmplY3QgfSldOwogICAgICBfY29sbGFwc2VkR3JvdXBzX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9jb2xsYXBzZWRNdWx0aUZpbHRlcnNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3JlbmRlckNvdW50ZXJfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2NvbGxhcHNlZF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTM4KHRoaXMsIG51bGwsIF9oZWFkaW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImhlYWRpbmciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImhlYWRpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaGVhZGluZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaGVhZGluZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9oZWFkaW5nX2luaXRpYWxpemVycywgX2hlYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzOCh0aGlzLCBudWxsLCBfZ3JvdXBzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImdyb3VwcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZ3JvdXBzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmdyb3Vwcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZ3JvdXBzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2dyb3Vwc19pbml0aWFsaXplcnMsIF9ncm91cHNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzOCh0aGlzLCBudWxsLCBfc2VsZWN0aW9uT3B0aW9uc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWxlY3Rpb25PcHRpb25zIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3Rpb25PcHRpb25zIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGlvbk9wdGlvbnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlbGVjdGlvbk9wdGlvbnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0aW9uT3B0aW9uc19pbml0aWFsaXplcnMsIF9zZWxlY3Rpb25PcHRpb25zX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzgodGhpcywgbnVsbCwgX3NlbGVjdGVkSXRlbV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWxlY3RlZEl0ZW0iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlbGVjdGVkSXRlbSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWxlY3RlZEl0ZW0sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlbGVjdGVkSXRlbSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWxlY3RlZEl0ZW1faW5pdGlhbGl6ZXJzLCBfc2VsZWN0ZWRJdGVtX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzgodGhpcywgbnVsbCwgX2NvbGxhcHNlZEdyb3Vwc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb2xsYXBzZWRHcm91cHMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNvbGxhcHNlZEdyb3VwcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jb2xsYXBzZWRHcm91cHMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvbGxhcHNlZEdyb3VwcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jb2xsYXBzZWRHcm91cHNfaW5pdGlhbGl6ZXJzLCBfY29sbGFwc2VkR3JvdXBzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzgodGhpcywgbnVsbCwgX2NvbGxhcHNlZE11bHRpRmlsdGVyc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb2xsYXBzZWRNdWx0aUZpbHRlcnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNvbGxhcHNlZE11bHRpRmlsdGVycyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jb2xsYXBzZWRNdWx0aUZpbHRlcnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvbGxhcHNlZE11bHRpRmlsdGVycyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jb2xsYXBzZWRNdWx0aUZpbHRlcnNfaW5pdGlhbGl6ZXJzLCBfY29sbGFwc2VkTXVsdGlGaWx0ZXJzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzgodGhpcywgbnVsbCwgX3JlbmRlckNvdW50ZXJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicmVuZGVyQ291bnRlciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicmVuZGVyQ291bnRlciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5yZW5kZXJDb3VudGVyLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yZW5kZXJDb3VudGVyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3JlbmRlckNvdW50ZXJfaW5pdGlhbGl6ZXJzLCBfcmVuZGVyQ291bnRlcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM4KHRoaXMsIG51bGwsIF9jb2xsYXBzZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29sbGFwc2VkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb2xsYXBzZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29sbGFwc2VkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jb2xsYXBzZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29sbGFwc2VkX2luaXRpYWxpemVycywgX2NvbGxhcHNlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM4KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0FwcHVpU2Vjb25kYXJ5bWVudTIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzI5OwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkFwcCBVSSJdOwogICAgI2hlYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMzkodGhpcywgX2hlYWRpbmdfaW5pdGlhbGl6ZXJzLCAiTWVudSIpOwogICAgLy8gSU5TVEFOQ0UKICAgIC8qKiBEeW5hbWljIGhlYWRpbmcgLSB0eXBpY2FsbHkgc2hvd3MgdGhlIHNlbGVjdGVkIE1haW5NZW51IGl0ZW0gKi8KICAgIGdldCBoZWFkaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jaGVhZGluZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGhlYWRpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2hlYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNncm91cHNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM5KHRoaXMsIF9oZWFkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzOSh0aGlzLCBfZ3JvdXBzX2luaXRpYWxpemVycywgW10pKTsKICAgIC8qKiBHcm91cGVkIGl0ZW1zIHdpdGggY29sbGFwc2Ugc3VwcG9ydCAtIHN1cHBvcnRzIG5ldyBJU2Vjb25kYXJ5TWVudUdyb3VwICovCiAgICBnZXQgZ3JvdXBzKCkgewogICAgICByZXR1cm4gdGhpcy4jZ3JvdXBzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZ3JvdXBzKHZhbHVlMikgewogICAgICB0aGlzLiNncm91cHNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWxlY3Rpb25PcHRpb25zX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzOSh0aGlzLCBfZ3JvdXBzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzOSh0aGlzLCBfc2VsZWN0aW9uT3B0aW9uc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICAvKiogTGVnYWN5IGZsYXQgbGlzdCBzdXBwb3J0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCiAgICBnZXQgc2VsZWN0aW9uT3B0aW9ucygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlbGVjdGlvbk9wdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3Rpb25PcHRpb25zKHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3Rpb25PcHRpb25zX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0ZWRJdGVtX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzOSh0aGlzLCBfc2VsZWN0aW9uT3B0aW9uc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzkodGhpcywgX3NlbGVjdGVkSXRlbV9pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIC8qKiBDdXJyZW50bHkgc2VsZWN0ZWQgdGFiIGl0ZW0gKi8KICAgIGdldCBzZWxlY3RlZEl0ZW0oKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZEl0ZW1fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3RlZEl0ZW0odmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlbGVjdGVkSXRlbV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NvbGxhcHNlZEdyb3Vwc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzkodGhpcywgX3NlbGVjdGVkSXRlbV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzkodGhpcywgX2NvbGxhcHNlZEdyb3Vwc19pbml0aWFsaXplcnMsIC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpKTsKICAgIC8qKiBJbnRlcm5hbCBzdGF0ZSBmb3IgY29sbGFwc2VkIGdyb3VwcyAqLwogICAgZ2V0IGNvbGxhcHNlZEdyb3VwcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvbGxhcHNlZEdyb3Vwc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNvbGxhcHNlZEdyb3Vwcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29sbGFwc2VkR3JvdXBzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29sbGFwc2VkTXVsdGlGaWx0ZXJzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzOSh0aGlzLCBfY29sbGFwc2VkR3JvdXBzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzOSh0aGlzLCBfY29sbGFwc2VkTXVsdGlGaWx0ZXJzX2luaXRpYWxpemVycywgLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSkpOwogICAgLyoqIEludGVybmFsIHN0YXRlIGZvciBjb2xsYXBzZWQgbXVsdGktZmlsdGVycyAqLwogICAgZ2V0IGNvbGxhcHNlZE11bHRpRmlsdGVycygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvbGxhcHNlZE11bHRpRmlsdGVyc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNvbGxhcHNlZE11bHRpRmlsdGVycyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29sbGFwc2VkTXVsdGlGaWx0ZXJzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcmVuZGVyQ291bnRlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzkodGhpcywgX2NvbGxhcHNlZE11bHRpRmlsdGVyc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzkodGhpcywgX3JlbmRlckNvdW50ZXJfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICAvKiogUmVuZGVyIGNvdW50ZXIgdG8gZm9yY2UgcmUtcmVuZGVycyB3aGVuIGl0ZW1zIGFyZSBtdXRhdGVkICovCiAgICBnZXQgcmVuZGVyQ291bnRlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3JlbmRlckNvdW50ZXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCByZW5kZXJDb3VudGVyKHZhbHVlMikgewogICAgICB0aGlzLiNyZW5kZXJDb3VudGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29sbGFwc2VkX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzOSh0aGlzLCBfcmVuZGVyQ291bnRlcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzkodGhpcywgX2NvbGxhcHNlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICAvKiogSG9yaXpvbnRhbCBjb2xsYXBzZSBzdGF0ZSAqLwogICAgZ2V0IGNvbGxhcHNlZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvbGxhcHNlZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNvbGxhcHNlZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29sbGFwc2VkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIC0tc2lkZWJhci13aWR0aC1leHBhbmRlZDogMjQwcHg7CiAgICAgICAgLS1zaWRlYmFyLXdpZHRoLWNvbGxhcHNlZDogNTZweDsKICAgICAgICAtLXNpZGViYXItYmc6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmFmYWZhIiwgIiMwYTBhMGEiKX07CiAgICAgICAgLS1zaWRlYmFyLWZnOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzUyNTI1MiIsICIjYTNhM2EzIil9OwogICAgICAgIC0tc2lkZWJhci1mZy1tdXRlZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MzczNzMiLCAiIzczNzM3MyIpfTsKICAgICAgICAtLXNpZGViYXItZmctYWN0aXZlOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzBhMGEwYSIsICIjZmFmYWZhIil9OwogICAgICAgIC0tc2lkZWJhci1ib3JkZXI6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlNWU1IiwgIiMxYTFhMWEiKX07CiAgICAgICAgLS1zaWRlYmFyLWhvdmVyOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjA0KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpIil9OwogICAgICAgIC0tc2lkZWJhci1hY3RpdmU6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDYpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkiKX07CiAgICAgICAgLS1zaWRlYmFyLWFjY2VudDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwYTBhMGEiLCAiI2ZhZmFmYSIpfTsKICAgICAgICAtLXRvb2x0aXAtYmc6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTgxODFiIiwgIiNmYWZhZmEiKX07CiAgICAgICAgLS10b29sdGlwLWZnOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZhZmFmYSIsICIjMTgxODFiIil9OwoKICAgICAgICAvKiBCYWRnZSBjb2xvcnMgKi8KICAgICAgICAtLWJhZGdlLWRlZmF1bHQtYmc6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjRmNGY1IiwgIiMyNzI3MmEiKX07CiAgICAgICAgLS1iYWRnZS1kZWZhdWx0LWZnOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNmM2Y0NiIsICIjYTFhMWFhIil9OwogICAgICAgIC0tYmFkZ2Utc3VjY2Vzcy1iZzogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkY2ZjZTciLCAiIzE0NTMyZCIpfTsKICAgICAgICAtLWJhZGdlLXN1Y2Nlc3MtZmc6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTY2NTM0IiwgIiM0YWRlODAiKX07CiAgICAgICAgLS1iYWRnZS13YXJuaW5nLWJnOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZlZjNjNyIsICIjNDUxYTAzIil9OwogICAgICAgIC0tYmFkZ2Utd2FybmluZy1mZzogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5MjQwMGUiLCAiI2ZiYmYyNCIpfTsKICAgICAgICAtLWJhZGdlLWVycm9yLWJnOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZlZTJlMiIsICIjNDUwYTBhIil9OwogICAgICAgIC0tYmFkZ2UtZXJyb3ItZmc6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOTkxYjFiIiwgIiNmODcxNzEiKX07CgogICAgICAgIC8qIEFjdGlvbiBjb2xvcnMgKi8KICAgICAgICAtLWFjdGlvbi1wcmltYXJ5OiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzI1NjNlYiIsICIjM2I4MmY2Iil9OwogICAgICAgIC0tYWN0aW9uLXByaW1hcnktaG92ZXI6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMWQ0ZWQ4IiwgIiM2MGE1ZmEiKX07CiAgICAgICAgLS1hY3Rpb24tZGFuZ2VyOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2RjMjYyNiIsICIjZWY0NDQ0Iil9OwogICAgICAgIC0tYWN0aW9uLWRhbmdlci1ob3ZlcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNiOTFjMWMiLCAiI2Y4NzE3MSIpfTsKCiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogdmFyKC0tc2lkZWJhci13aWR0aC1leHBhbmRlZCk7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tc2lkZWJhci1iZyk7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tc2lkZWJhci1ib3JkZXIpOwogICAgICAgIGZvbnQtZmFtaWx5OiAnR2Vpc3QgU2FucycsICdJbnRlcicsIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgc2Fucy1zZXJpZjsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjI1cyBlYXNlOwogICAgICB9CgogICAgICA6aG9zdChbY29sbGFwc2VkXSkgewogICAgICAgIHdpZHRoOiB2YXIoLS1zaWRlYmFyLXdpZHRoLWNvbGxhcHNlZCk7CiAgICAgIH0KCiAgICAgIC5tYWluY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAvKiBGbG9hdGluZyBjb2xsYXBzZSB0b2dnbGUgYnV0dG9uICovCiAgICAgIC5jb2xsYXBzZS10b2dnbGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogLTEycHg7CiAgICAgICAgdG9wOiAyNHB4OwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsKICAgICAgICB3aWR0aDogMjRweDsKICAgICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMyNzI3MmEiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU1ZTUiLCAiIzNmM2Y0NiIpfTsKICAgICAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEpOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzM3MzczIiwgIiNhMWExYWEiKX07CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZSwgYmFja2dyb3VuZCAwLjE1cyBlYXNlOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5jb2xsYXBzZS10b2dnbGU6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjRmNGY1IiwgIiMzZjNmNDYiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMGEwYTBhIiwgIiNmYWZhZmEiKX07CiAgICAgIH0KCiAgICAgIDpob3N0KDpob3ZlcikgLmNvbGxhcHNlLXRvZ2dsZSB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmNvbGxhcHNlLXRvZ2dsZSBkZWVzLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQoKICAgICAgLyogSGVhZGVyIFNlY3Rpb24gKi8KICAgICAgLmhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgcGFkZGluZzogMCAxNnB4OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1zaWRlYmFyLWJvcmRlcik7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQoKICAgICAgLmhlYWRlciAuaGVhZGluZyB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogdmFyKC0tc2lkZWJhci1mZy1hY3RpdmUpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZSwgd2lkdGggMC4yNXMgZWFzZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NvbGxhcHNlZF0pIC5oZWFkZXIgewogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHBhZGRpbmc6IDAgOHB4OwogICAgICB9CgogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLmhlYWRlciAuaGVhZGluZyB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB3aWR0aDogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAvKiBTY3JvbGxhYmxlIE1lbnUgU2VjdGlvbiAqLwogICAgICAubWVudVNlY3Rpb24gewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjsKICAgICAgICBwYWRkaW5nOiA4cHggMDsKICAgICAgfQoKICAgICAgLm1lbnVTZWN0aW9uOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICAgICAgd2lkdGg6IDZweDsKICAgICAgfQoKICAgICAgLm1lbnVTZWN0aW9uOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC5tZW51U2VjdGlvbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMTUpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICB9CgogICAgICAubWVudVNlY3Rpb246Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjI1KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjUpIil9OwogICAgICB9CgogICAgICAvKiBNZW51IEdyb3VwICovCiAgICAgIC5tZW51R3JvdXAgewogICAgICAgIHBhZGRpbmc6IDAgOHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgICAgfQoKICAgICAgOmhvc3QoW2NvbGxhcHNlZF0pIC5tZW51R3JvdXAgewogICAgICAgIHBhZGRpbmc6IDAgNHB4OwogICAgICB9CgogICAgICAuZ3JvdXBIZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzIGVhc2UsIG9wYWNpdHkgMC4ycyBlYXNlLCBtYXgtaGVpZ2h0IDAuMjVzIGVhc2U7CiAgICAgICAgbWF4LWhlaWdodDogNDBweDsKICAgICAgfQoKICAgICAgLmdyb3VwSGVhZGVyOmhvdmVyIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgxNDAsIDEyMCwgMTAwLCAwLjA2KSIsICJyZ2JhKDE4MCwgMTYwLCAxNDAsIDAuMDgpIil9OwogICAgICAgIHBhZGRpbmc6IDdweCAxMXB4OwogICAgICB9CgogICAgICAuZ3JvdXBIZWFkZXI6bm90KC5jb2xsYXBzZWQpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgxNDAsIDEyMCwgMTAwLCAwLjA2KSIsICJyZ2JhKDE4MCwgMTYwLCAxNDAsIDAuMDgpIil9OwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgfQoKICAgICAgLmdyb3VwSGVhZGVyIC5ncm91cFRpdGxlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzg3MTZjIiwgIiNiNWE5OWEiKX07CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuZ3JvdXBIZWFkZXIgLmdyb3VwVGl0bGUgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzg3MTZjIiwgIiNiNWE5OWEiKX07CiAgICAgIH0KCiAgICAgIC5ncm91cEhlYWRlciAuY2hldnJvbiB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzIGVhc2U7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzg3MTZjIiwgIiNiNWE5OWEiKX07CiAgICAgIH0KCiAgICAgIC5ncm91cEhlYWRlci5jb2xsYXBzZWQgLmNoZXZyb24gewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC05MGRlZyk7CiAgICAgIH0KCiAgICAgIC8qIEhpZGUgZ3JvdXAgaGVhZGVycyB3aGVuIGhvcml6b250YWxseSBjb2xsYXBzZWQgKi8KICAgICAgOmhvc3QoW2NvbGxhcHNlZF0pIC5ncm91cEhlYWRlciB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBtYXgtaGVpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAvKiBHcm91cCBJdGVtcyBDb250YWluZXIgKi8KICAgICAgLmdyb3VwSXRlbXMgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdHJhbnNpdGlvbjogbWF4LWhlaWdodCAwLjI1cyBlYXNlLCBvcGFjaXR5IDAuMnMgZWFzZSwgbWFyZ2luIDAuMjVzIGVhc2U7CiAgICAgICAgbWF4LWhlaWdodDogMTAwMHB4OwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgICAgfQoKICAgICAgLmdyb3VwSXRlbXMuY29sbGFwc2VkIHsKICAgICAgICBtYXgtaGVpZ2h0OiAwOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLyogQWx3YXlzIHNob3cgaXRlbXMgd2hlbiBob3Jpem9udGFsbHkgY29sbGFwc2VkIChyZWdhcmRsZXNzIG9mIGdyb3VwIGNvbGxhcHNlIHN0YXRlKSAqLwogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLmdyb3VwSXRlbXMgewogICAgICAgIG1heC1oZWlnaHQ6IG5vbmU7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLyogTWVudSBJdGVtIEJhc2UgKi8KICAgICAgLm1lbnVJdGVtIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTBweDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBtYXJnaW46IDJweCAwOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LXdlaWdodDogNDUwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgY29sb3I6IHZhcigtLXNpZGViYXItZmcpOwogICAgICB9CgogICAgICAubWVudUl0ZW06aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXNpZGViYXItaG92ZXIpOwogICAgICAgIGNvbG9yOiB2YXIoLS1zaWRlYmFyLWZnLWFjdGl2ZSk7CiAgICAgIH0KCiAgICAgIC5tZW51SXRlbTphY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXNpZGViYXItYWN0aXZlKTsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtLmRpc2FibGVkIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtLnNlbGVjdGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zaWRlYmFyLWFjdGl2ZSk7CiAgICAgICAgY29sb3I6IHZhcigtLXNpZGViYXItZmctYWN0aXZlKTsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICB9CgogICAgICAubWVudUl0ZW0uc2VsZWN0ZWQ6OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOwogICAgICAgIHdpZHRoOiAzcHg7CiAgICAgICAgaGVpZ2h0OiAxNnB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXNpZGViYXItYWNjZW50KTsKICAgICAgICBib3JkZXItcmFkaXVzOiAwIDJweCAycHggMDsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtIGRlZXMtaWNvbiB7CiAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgIG9wYWNpdHk6IDAuNzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtLnNlbGVjdGVkIGRlZXMtaWNvbiB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtIC5pdGVtTGFiZWwgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycyBlYXNlLCB3aWR0aCAwLjI1cyBlYXNlOwogICAgICB9CgogICAgICAvKiBBY3Rpb24gSXRlbSBTdHlsZXMgKi8KICAgICAgLm1lbnVJdGVtLmFjdGlvbi1wcmltYXJ5IHsKICAgICAgICBjb2xvcjogdmFyKC0tYWN0aW9uLXByaW1hcnkpOwogICAgICB9CgogICAgICAubWVudUl0ZW0uYWN0aW9uLXByaW1hcnk6aG92ZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1hY3Rpb24tcHJpbWFyeS1ob3Zlcik7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMzcsIDk5LCAyMzUsIDAuMDgpIiwgInJnYmEoNTksIDEzMCwgMjQ2LCAwLjEyKSIpfTsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtLmFjdGlvbi1wcmltYXJ5IGRlZXMtaWNvbiB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtLmFjdGlvbi1kYW5nZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1hY3Rpb24tZGFuZ2VyKTsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtLmFjdGlvbi1kYW5nZXI6aG92ZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1hY3Rpb24tZGFuZ2VyLWhvdmVyKTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgyMjAsIDM4LCAzOCwgMC4wOCkiLCAicmdiYSgyMzksIDY4LCA2OCwgMC4xMikiKX07CiAgICAgIH0KCiAgICAgIC5tZW51SXRlbS5hY3Rpb24tZGFuZ2VyIGRlZXMtaWNvbiB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLyogRmlsdGVyIEl0ZW0gU3R5bGVzICovCiAgICAgIC5tZW51SXRlbS5maWx0ZXIgewogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtLmZpbHRlciAuZmlsdGVyLWNoZWNrYm94IHsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkNGQ0ZDQiLCAiIzUyNTI1MiIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAubWVudUl0ZW0uZmlsdGVyIC5maWx0ZXItY2hlY2tib3guY2hlY2tlZCB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tc2lkZWJhci1hY2NlbnQpOwogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tc2lkZWJhci1hY2NlbnQpOwogICAgICB9CgogICAgICAubWVudUl0ZW0uZmlsdGVyIC5maWx0ZXItY2hlY2tib3ggZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmFmYWZhIiwgIiMwYTBhMGEiKX07CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtLmZpbHRlci5hY3RpdmUgewogICAgICAgIGNvbG9yOiB2YXIoLS1zaWRlYmFyLWZnLWFjdGl2ZSk7CiAgICAgIH0KCiAgICAgIC8qIE11bHRpLUZpbHRlciBDb250YWluZXIgKi8KICAgICAgLm11bHRpRmlsdGVyIHsKICAgICAgICBtYXJnaW46IDRweCAwOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXNpZGViYXItYm9yZGVyKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjAyKSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDIpIil9OwogICAgICB9CgogICAgICAubXVsdGlGaWx0ZXItaGVhZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIHBhZGRpbmc6IDEwcHggMTJweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cyBlYXNlOwogICAgICB9CgogICAgICAubXVsdGlGaWx0ZXItaGVhZGVyOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zaWRlYmFyLWhvdmVyKTsKICAgICAgfQoKICAgICAgLm11bHRpRmlsdGVyLWhlYWRlciAubXVsdGlGaWx0ZXItdGl0bGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogdmFyKC0tc2lkZWJhci1mZy1hY3RpdmUpOwogICAgICB9CgogICAgICAubXVsdGlGaWx0ZXItaGVhZGVyIC5tdWx0aUZpbHRlci10aXRsZSBkZWVzLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgIH0KCiAgICAgIC5tdWx0aUZpbHRlci1oZWFkZXIgLm11bHRpRmlsdGVyLWNvdW50IHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgY29sb3I6IHZhcigtLXNpZGViYXItZmctbXV0ZWQpOwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWJhZGdlLWRlZmF1bHQtYmcpOwogICAgICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICB9CgogICAgICAubXVsdGlGaWx0ZXItaGVhZGVyIC5jaGV2cm9uIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMnMgZWFzZTsKICAgICAgICBjb2xvcjogdmFyKC0tc2lkZWJhci1mZy1tdXRlZCk7CiAgICAgIH0KCiAgICAgIC5tdWx0aUZpbHRlci1oZWFkZXIuY29sbGFwc2VkIC5jaGV2cm9uIHsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpOwogICAgICB9CgogICAgICAubXVsdGlGaWx0ZXItb3B0aW9ucyB7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLXNpZGViYXItYm9yZGVyKTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRyYW5zaXRpb246IG1heC1oZWlnaHQgMC4yNXMgZWFzZSwgb3BhY2l0eSAwLjJzIGVhc2U7CiAgICAgICAgbWF4LWhlaWdodDogNTAwcHg7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLm11bHRpRmlsdGVyLW9wdGlvbnMuY29sbGFwc2VkIHsKICAgICAgICBtYXgtaGVpZ2h0OiAwOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgfQoKICAgICAgLm11bHRpRmlsdGVyLW9wdGlvbiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTBweDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cyBlYXNlOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBjb2xvcjogdmFyKC0tc2lkZWJhci1mZyk7CiAgICAgIH0KCiAgICAgIC5tdWx0aUZpbHRlci1vcHRpb246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXNpZGViYXItaG92ZXIpOwogICAgICAgIGNvbG9yOiB2YXIoLS1zaWRlYmFyLWZnLWFjdGl2ZSk7CiAgICAgIH0KCiAgICAgIC5tdWx0aUZpbHRlci1vcHRpb24gLm9wdGlvbi1jaGVja2JveCB7CiAgICAgICAgd2lkdGg6IDE2cHg7CiAgICAgICAgaGVpZ2h0OiAxNnB4OwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDRkNGQ0IiwgIiM1MjUyNTIiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLm11bHRpRmlsdGVyLW9wdGlvbiAub3B0aW9uLWNoZWNrYm94LmNoZWNrZWQgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXNpZGViYXItYWNjZW50KTsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXNpZGViYXItYWNjZW50KTsKICAgICAgfQoKICAgICAgLm11bHRpRmlsdGVyLW9wdGlvbiAub3B0aW9uLWNoZWNrYm94IGRlZXMtaWNvbiB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZhZmFmYSIsICIjMGEwYTBhIil9OwogICAgICB9CgogICAgICAubXVsdGlGaWx0ZXItb3B0aW9uIGRlZXMtaWNvbi5vcHRpb24taWNvbiB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG9wYWNpdHk6IDAuNzsKICAgICAgfQoKICAgICAgLyogRGl2aWRlciAqLwogICAgICAubWVudURpdmlkZXIgewogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXNpZGViYXItYm9yZGVyKTsKICAgICAgICBtYXJnaW46IDhweCAxMnB4OwogICAgICB9CgogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLm1lbnVEaXZpZGVyIHsKICAgICAgICBtYXJnaW46IDhweCA0cHg7CiAgICAgIH0KCiAgICAgIC8qIEhlYWRlci9MYWJlbCAqLwogICAgICAubWVudUhlYWRlciB7CiAgICAgICAgcGFkZGluZzogMTJweCAxMnB4IDRweCAxMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiB2YXIoLS1zaWRlYmFyLWZnLW11dGVkKTsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgICAgfQoKICAgICAgOmhvc3QoW2NvbGxhcHNlZF0pIC5tZW51SGVhZGVyIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBMaW5rIEl0ZW0gKi8KICAgICAgLm1lbnVJdGVtLmxpbmsgLmV4dGVybmFsLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICAgIH0KCiAgICAgIC8qIENvbGxhcHNlZCBtZW51IGl0ZW0gc3R5bGVzICovCiAgICAgIDpob3N0KFtjb2xsYXBzZWRdKSAubWVudUl0ZW0gewogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBnYXA6IDA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjb2xsYXBzZWRdKSAubWVudUl0ZW0gLml0ZW1MYWJlbCB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB3aWR0aDogMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjb2xsYXBzZWRdKSAubWVudUl0ZW0uc2VsZWN0ZWQ6OmJlZm9yZSB7CiAgICAgICAgbGVmdDogLTRweDsKICAgICAgfQoKICAgICAgOmhvc3QoW2NvbGxhcHNlZF0pIC5tZW51SXRlbSAuZmlsdGVyLWNoZWNrYm94LAogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLm1lbnVJdGVtIC5leHRlcm5hbC1pY29uIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLm11bHRpRmlsdGVyIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBUb29sdGlwIGZvciBjb2xsYXBzZWQgc3RhdGUgKi8KICAgICAgLml0ZW0tdG9vbHRpcCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDEwMCU7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxMnB4OwogICAgICAgIHBhZGRpbmc6IDZweCAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRvb2x0aXAtYmcpOwogICAgICAgIGNvbG9yOiB2YXIoLS10b29sdGlwLWZnKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMgZWFzZTsKICAgICAgICB6LWluZGV4OiAxMDAwOwogICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTUpOwogICAgICB9CgogICAgICAuaXRlbS10b29sdGlwOjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAtNHB4OwogICAgICAgIHRvcDogNTAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsKICAgICAgICBib3JkZXI6IDRweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6IHZhcigtLXRvb2x0aXAtYmcpOwogICAgICB9CgogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLm1lbnVJdGVtOmhvdmVyIC5pdGVtLXRvb2x0aXAgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogMXM7CiAgICAgIH0KCiAgICAgIC8qIEJhZGdlIFN0eWxlcyAqLwogICAgICAuYmFkZ2UgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgbWluLXdpZHRoOiAxOHB4OwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgICBwYWRkaW5nOiAwIDZweDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBib3JkZXItcmFkaXVzOiA5cHg7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5iYWRnZS5kZWZhdWx0IHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iYWRnZS1kZWZhdWx0LWJnKTsKICAgICAgICBjb2xvcjogdmFyKC0tYmFkZ2UtZGVmYXVsdC1mZyk7CiAgICAgIH0KCiAgICAgIC5iYWRnZS5zdWNjZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iYWRnZS1zdWNjZXNzLWJnKTsKICAgICAgICBjb2xvcjogdmFyKC0tYmFkZ2Utc3VjY2Vzcy1mZyk7CiAgICAgIH0KCiAgICAgIC5iYWRnZS53YXJuaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iYWRnZS13YXJuaW5nLWJnKTsKICAgICAgICBjb2xvcjogdmFyKC0tYmFkZ2Utd2FybmluZy1mZyk7CiAgICAgIH0KCiAgICAgIC5iYWRnZS5lcnJvciB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYmFkZ2UtZXJyb3ItYmcpOwogICAgICAgIGNvbG9yOiB2YXIoLS1iYWRnZS1lcnJvci1mZyk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjb2xsYXBzZWRdKSAuYmFkZ2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIExlZ2FjeSBvcHRpb25zIGNvbnRhaW5lciAqLwogICAgICAubGVnYWN5T3B0aW9ucyB7CiAgICAgICAgcGFkZGluZzogMCA4cHg7CiAgICAgIH0KCiAgICAgIC8qIERpdmlkZXIgKGxlZ2FjeSkgKi8KICAgICAgLmRpdmlkZXIgewogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXNpZGViYXItYm9yZGVyKTsKICAgICAgICBtYXJnaW46IDhweCAxMnB4OwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9Im1haW5jb250YWluZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iaGVhZGluZyI+JHt0aGlzLmhlYWRpbmd9PC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im1lbnVTZWN0aW9uIj4KICAgICAgICAgICR7dGhpcy5ncm91cHMubGVuZ3RoID4gMCA/IHRoaXMucmVuZGVyR3JvdXBzKCkgOiB0aGlzLnJlbmRlckxlZ2FjeU9wdGlvbnMoKX0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxidXR0b24gY2xhc3M9ImNvbGxhcHNlLXRvZ2dsZSIgQGNsaWNrPSIkeygpID0+IHRoaXMudG9nZ2xlQ29sbGFwc2UoKX0iPgogICAgICAgIDxkZWVzLWljb24gLmljb249IiR7dGhpcy5jb2xsYXBzZWQgPyAibHVjaWRlOmNoZXZyb25SaWdodCIgOiAibHVjaWRlOmNoZXZyb25MZWZ0In0iPjwvZGVlcy1pY29uPgogICAgICA8L2J1dHRvbj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJHcm91cHMoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgJHt0aGlzLmdyb3Vwcy5tYXAoKGdyb3VwKSA9PiBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJtZW51R3JvdXAiPgogICAgICAgICAgPGRpdgogICAgICAgICAgICBjbGFzcz0iZ3JvdXBIZWFkZXIgJHt0aGlzLmNvbGxhcHNlZEdyb3Vwcy5oYXMoZ3JvdXAubmFtZSkgPyAiY29sbGFwc2VkIiA6ICIifSIKICAgICAgICAgICAgQGNsaWNrPSIkeygpID0+IHRoaXMudG9nZ2xlR3JvdXAoZ3JvdXAubmFtZSl9IgogICAgICAgICAgPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iZ3JvdXBUaXRsZSI+CiAgICAgICAgICAgICAgJHtncm91cC5pY29uTmFtZSA/IGIyYDxkZWVzLWljb24gLmljb249IiR7dGhpcy5ub3JtYWxpemVJY29uKGdyb3VwLmljb25OYW1lKX0iPjwvZGVlcy1pY29uPmAgOiAiIn0KICAgICAgICAgICAgICAke2dyb3VwLm5hbWV9CiAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgPGRlZXMtaWNvbiBjbGFzcz0iY2hldnJvbiIgLmljb249IiR7Imx1Y2lkZTpjaGV2cm9uRG93biJ9Ij48L2RlZXMtaWNvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZ3JvdXBJdGVtcyAke3RoaXMuY29sbGFwc2VkR3JvdXBzLmhhcyhncm91cC5uYW1lKSA/ICJjb2xsYXBzZWQiIDogIiJ9Ij4KICAgICAgICAgICAgJHtncm91cC5pdGVtcy5tYXAoKGl0ZW0pID0+IHRoaXMucmVuZGVySXRlbShpdGVtLCBncm91cCkpfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIGApfQogICAgYDsKICAgIH0KICAgIHJlbmRlckl0ZW0oaXRlbSwgZ3JvdXApIHsKICAgICAgaWYgKCJoaWRkZW4iIGluIGl0ZW0gJiYgaXRlbS5oaWRkZW4pIHsKICAgICAgICByZXR1cm4gYjJgYDsKICAgICAgfQogICAgICBjb25zdCBpdGVtVHlwZSA9ICJ0eXBlIiBpbiBpdGVtID8gaXRlbS50eXBlIDogInRhYiI7CiAgICAgIHN3aXRjaCAoaXRlbVR5cGUpIHsKICAgICAgICBjYXNlICJhY3Rpb24iOgogICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQWN0aW9uSXRlbShpdGVtKTsKICAgICAgICBjYXNlICJmaWx0ZXIiOgogICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRmlsdGVySXRlbShpdGVtKTsKICAgICAgICBjYXNlICJtdWx0aUZpbHRlciI6CiAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJNdWx0aUZpbHRlckl0ZW0oaXRlbSk7CiAgICAgICAgY2FzZSAiZGl2aWRlciI6CiAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJEaXZpZGVyKCk7CiAgICAgICAgY2FzZSAiaGVhZGVyIjoKICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckhlYWRlcihpdGVtKTsKICAgICAgICBjYXNlICJsaW5rIjoKICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckxpbmtJdGVtKGl0ZW0pOwogICAgICAgIGNhc2UgInRhYiI6CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlclRhYkl0ZW0oaXRlbSwgZ3JvdXApOwogICAgICB9CiAgICB9CiAgICByZW5kZXJUYWJJdGVtKGl0ZW0sIGdyb3VwKSB7CiAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkSXRlbT8ua2V5ID09PSBpdGVtLmtleTsKICAgICAgY29uc3QgaXNEaXNhYmxlZCA9IGl0ZW0uZGlzYWJsZWQgPT09IHRydWU7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdgogICAgICAgIGNsYXNzPSJtZW51SXRlbSAke2lzU2VsZWN0ZWQgPyAic2VsZWN0ZWQiIDogIiJ9ICR7aXNEaXNhYmxlZCA/ICJkaXNhYmxlZCIgOiAiIn0iCiAgICAgICAgQGNsaWNrPSIkeygpID0+ICFpc0Rpc2FibGVkICYmIHRoaXMuc2VsZWN0VGFiSXRlbShpdGVtLCBncm91cCl9IgogICAgICAgIEBjb250ZXh0bWVudT0iJHsoZTExKSA9PiB0aGlzLmhhbmRsZUNvbnRleHRNZW51KGUxMSwgaXRlbSl9IgogICAgICA+CiAgICAgICAgJHtpdGVtLmljb25OYW1lID8gYjJgPGRlZXMtaWNvbiAuaWNvbj0iJHt0aGlzLm5vcm1hbGl6ZUljb24oaXRlbS5pY29uTmFtZSl9Ij48L2RlZXMtaWNvbj5gIDogIiJ9CiAgICAgICAgPHNwYW4gY2xhc3M9Iml0ZW1MYWJlbCI+JHtpdGVtLmtleX08L3NwYW4+CiAgICAgICAgJHtpdGVtLmJhZGdlICE9PSB2b2lkIDAgPyBiMmAKICAgICAgICAgIDxzcGFuIGNsYXNzPSJiYWRnZSAke2l0ZW0uYmFkZ2VWYXJpYW50IHx8ICJkZWZhdWx0In0iPiR7aXRlbS5iYWRnZX08L3NwYW4+CiAgICAgICAgYCA6ICIifQogICAgICAgIDxzcGFuIGNsYXNzPSJpdGVtLXRvb2x0aXAiPiR7aXRlbS5rZXl9PC9zcGFuPgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJBY3Rpb25JdGVtKGl0ZW0pIHsKICAgICAgY29uc3QgdmFyaWFudCA9IGl0ZW0udmFyaWFudCB8fCAicHJpbWFyeSI7CiAgICAgIGNvbnN0IGlzRGlzYWJsZWQgPSBpdGVtLmRpc2FibGVkID09PSB0cnVlOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYKICAgICAgICBjbGFzcz0ibWVudUl0ZW0gYWN0aW9uLSR7dmFyaWFudH0gJHtpc0Rpc2FibGVkID8gImRpc2FibGVkIiA6ICIifSIKICAgICAgICBAY2xpY2s9IiR7KCkgPT4gIWlzRGlzYWJsZWQgJiYgdGhpcy5oYW5kbGVBY3Rpb25DbGljayhpdGVtKX0iCiAgICAgID4KICAgICAgICAke2l0ZW0uaWNvbk5hbWUgPyBiMmA8ZGVlcy1pY29uIC5pY29uPSIke3RoaXMubm9ybWFsaXplSWNvbihpdGVtLmljb25OYW1lKX0iPjwvZGVlcy1pY29uPmAgOiAiIn0KICAgICAgICA8c3BhbiBjbGFzcz0iaXRlbUxhYmVsIj4ke2l0ZW0ua2V5fTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iaXRlbS10b29sdGlwIj4ke2l0ZW0ua2V5fTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgcmVuZGVyRmlsdGVySXRlbShpdGVtKSB7CiAgICAgIGNvbnN0IGlzRGlzYWJsZWQgPSBpdGVtLmRpc2FibGVkID09PSB0cnVlOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYKICAgICAgICBjbGFzcz0ibWVudUl0ZW0gZmlsdGVyICR7aXRlbS5hY3RpdmUgPyAiYWN0aXZlIiA6ICIifSAke2lzRGlzYWJsZWQgPyAiZGlzYWJsZWQiIDogIiJ9IgogICAgICAgIEBjbGljaz0iJHsoKSA9PiAhaXNEaXNhYmxlZCAmJiB0aGlzLmhhbmRsZUZpbHRlclRvZ2dsZShpdGVtKX0iCiAgICAgID4KICAgICAgICAke2l0ZW0uaWNvbk5hbWUgPyBiMmA8ZGVlcy1pY29uIC5pY29uPSIke3RoaXMubm9ybWFsaXplSWNvbihpdGVtLmljb25OYW1lKX0iPjwvZGVlcy1pY29uPmAgOiAiIn0KICAgICAgICA8c3BhbiBjbGFzcz0iaXRlbUxhYmVsIj4ke2l0ZW0ua2V5fTwvc3Bhbj4KICAgICAgICA8ZGl2IGNsYXNzPSJmaWx0ZXItY2hlY2tib3ggJHtpdGVtLmFjdGl2ZSA/ICJjaGVja2VkIiA6ICIifSI+CiAgICAgICAgICAke2l0ZW0uYWN0aXZlID8gYjJgPGRlZXMtaWNvbiAuaWNvbj0iJHsibHVjaWRlOmNoZWNrIn0iPjwvZGVlcy1pY29uPmAgOiAiIn0KICAgICAgICA8L2Rpdj4KICAgICAgICA8c3BhbiBjbGFzcz0iaXRlbS10b29sdGlwIj4ke2l0ZW0ua2V5fTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgcmVuZGVyTXVsdGlGaWx0ZXJJdGVtKGl0ZW0pIHsKICAgICAgY29uc3QgaXNDb2xsYXBzZWQgPSB0aGlzLmNvbGxhcHNlZE11bHRpRmlsdGVycy5oYXMoaXRlbS5rZXkpOwogICAgICBjb25zdCBjaGVja2VkQ291bnQgPSBpdGVtLm9wdGlvbnMuZmlsdGVyKChvcHQpID0+IG9wdC5jaGVja2VkKS5sZW5ndGg7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0ibXVsdGlGaWx0ZXIiPgogICAgICAgIDxkaXYKICAgICAgICAgIGNsYXNzPSJtdWx0aUZpbHRlci1oZWFkZXIgJHtpc0NvbGxhcHNlZCA/ICJjb2xsYXBzZWQiIDogIiJ9IgogICAgICAgICAgQGNsaWNrPSIkeygpID0+IHRoaXMudG9nZ2xlTXVsdGlGaWx0ZXIoaXRlbS5rZXkpfSIKICAgICAgICA+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ibXVsdGlGaWx0ZXItdGl0bGUiPgogICAgICAgICAgICAke2l0ZW0uaWNvbk5hbWUgPyBiMmA8ZGVlcy1pY29uIC5pY29uPSIke3RoaXMubm9ybWFsaXplSWNvbihpdGVtLmljb25OYW1lKX0iPjwvZGVlcy1pY29uPmAgOiAiIn0KICAgICAgICAgICAgJHtpdGVtLmtleX0KICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICR7Y2hlY2tlZENvdW50ID4gMCA/IGIyYDxzcGFuIGNsYXNzPSJtdWx0aUZpbHRlci1jb3VudCI+JHtjaGVja2VkQ291bnR9PC9zcGFuPmAgOiAiIn0KICAgICAgICAgIDxkZWVzLWljb24gY2xhc3M9ImNoZXZyb24iIC5pY29uPSIkeyJsdWNpZGU6Y2hldnJvbkRvd24ifSI+PC9kZWVzLWljb24+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibXVsdGlGaWx0ZXItb3B0aW9ucyAke2lzQ29sbGFwc2VkID8gImNvbGxhcHNlZCIgOiAiIn0iPgogICAgICAgICAgJHtpdGVtLm9wdGlvbnMubWFwKChvcHRpb24yKSA9PiBiMmAKICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgIGNsYXNzPSJtdWx0aUZpbHRlci1vcHRpb24iCiAgICAgICAgICAgICAgQGNsaWNrPSIkeygpID0+IHRoaXMuaGFuZGxlTXVsdGlGaWx0ZXJPcHRpb25Ub2dnbGUoaXRlbSwgb3B0aW9uMi5rZXkpfSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wdGlvbi1jaGVja2JveCAke29wdGlvbjIuY2hlY2tlZCA/ICJjaGVja2VkIiA6ICIifSI+CiAgICAgICAgICAgICAgICAke29wdGlvbjIuY2hlY2tlZCA/IGIyYDxkZWVzLWljb24gLmljb249IiR7Imx1Y2lkZTpjaGVjayJ9Ij48L2RlZXMtaWNvbj5gIDogIiJ9CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgJHtvcHRpb24yLmljb25OYW1lID8gYjJgPGRlZXMtaWNvbiBjbGFzcz0ib3B0aW9uLWljb24iIC5pY29uPSIke3RoaXMubm9ybWFsaXplSWNvbihvcHRpb24yLmljb25OYW1lKX0iPjwvZGVlcy1pY29uPmAgOiAiIn0KICAgICAgICAgICAgICA8c3Bhbj4ke29wdGlvbjIubGFiZWx9PC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGApfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJEaXZpZGVyKCkgewogICAgICByZXR1cm4gYjJgPGRpdiBjbGFzcz0ibWVudURpdmlkZXIiPjwvZGl2PmA7CiAgICB9CiAgICByZW5kZXJIZWFkZXIoaXRlbSkgewogICAgICByZXR1cm4gYjJgPGRpdiBjbGFzcz0ibWVudUhlYWRlciI+JHtpdGVtLmxhYmVsfTwvZGl2PmA7CiAgICB9CiAgICByZW5kZXJMaW5rSXRlbShpdGVtKSB7CiAgICAgIGNvbnN0IGlzRXh0ZXJuYWwgPSBpdGVtLmV4dGVybmFsID8/IGl0ZW0uaHJlZi5zdGFydHNXaXRoKCJodHRwIik7CiAgICAgIGNvbnN0IGlzRGlzYWJsZWQgPSBpdGVtLmRpc2FibGVkID09PSB0cnVlOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYKICAgICAgICBjbGFzcz0ibWVudUl0ZW0gbGluayAke2lzRGlzYWJsZWQgPyAiZGlzYWJsZWQiIDogIiJ9IgogICAgICAgIEBjbGljaz0iJHsoKSA9PiAhaXNEaXNhYmxlZCAmJiB0aGlzLmhhbmRsZUxpbmtDbGljayhpdGVtKX0iCiAgICAgID4KICAgICAgICAke2l0ZW0uaWNvbk5hbWUgPyBiMmA8ZGVlcy1pY29uIC5pY29uPSIke3RoaXMubm9ybWFsaXplSWNvbihpdGVtLmljb25OYW1lKX0iPjwvZGVlcy1pY29uPmAgOiAiIn0KICAgICAgICA8c3BhbiBjbGFzcz0iaXRlbUxhYmVsIj4ke2l0ZW0ua2V5fTwvc3Bhbj4KICAgICAgICAke2lzRXh0ZXJuYWwgPyBiMmA8ZGVlcy1pY29uIGNsYXNzPSJleHRlcm5hbC1pY29uIiAuaWNvbj0iJHsibHVjaWRlOmV4dGVybmFsTGluayJ9Ij48L2RlZXMtaWNvbj5gIDogIiJ9CiAgICAgICAgPHNwYW4gY2xhc3M9Iml0ZW0tdG9vbHRpcCI+JHtpdGVtLmtleX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlckxlZ2FjeU9wdGlvbnMoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0ibGVnYWN5T3B0aW9ucyI+CiAgICAgICAgJHt0aGlzLnNlbGVjdGlvbk9wdGlvbnMubWFwKChvcHRpb24yKSA9PiB7CiAgICAgICAgaWYgKCJkaXZpZGVyIiBpbiBvcHRpb24yICYmIG9wdGlvbjIuZGl2aWRlcikgewogICAgICAgICAgcmV0dXJuIGIyYDxkaXYgY2xhc3M9ImRpdmlkZXIiPjwvZGl2PmA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGl0ZW0gPSBvcHRpb24yOwogICAgICAgIGNvbnN0IHRhYkl0ZW0gPSB7CiAgICAgICAgICBrZXk6IGl0ZW0ua2V5LAogICAgICAgICAgaWNvbk5hbWU6IGl0ZW0uaWNvbk5hbWUsCiAgICAgICAgICBhY3Rpb246IGl0ZW0uYWN0aW9uLAogICAgICAgICAgYmFkZ2U6IGl0ZW0uYmFkZ2UsCiAgICAgICAgICBiYWRnZVZhcmlhbnQ6IGl0ZW0uYmFkZ2VWYXJpYW50CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJUYWJJdGVtKHRhYkl0ZW0pOwogICAgICB9KX0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgLy8gSGVscGVyIHRvIG5vcm1hbGl6ZSBpY29uIG5hbWVzCiAgICBub3JtYWxpemVJY29uKGljb25OYW1lKSB7CiAgICAgIHJldHVybiBpY29uTmFtZS5zdGFydHNXaXRoKCJsdWNpZGU6IikgPyBpY29uTmFtZSA6IGBsdWNpZGU6JHtpY29uTmFtZX1gOwogICAgfQogICAgdG9nZ2xlR3JvdXAoZ3JvdXBOYW1lKSB7CiAgICAgIGNvbnN0IG5ld0NvbGxhcHNlZCA9IG5ldyBTZXQodGhpcy5jb2xsYXBzZWRHcm91cHMpOwogICAgICBpZiAobmV3Q29sbGFwc2VkLmhhcyhncm91cE5hbWUpKSB7CiAgICAgICAgbmV3Q29sbGFwc2VkLmRlbGV0ZShncm91cE5hbWUpOwogICAgICB9IGVsc2UgewogICAgICAgIG5ld0NvbGxhcHNlZC5hZGQoZ3JvdXBOYW1lKTsKICAgICAgfQogICAgICB0aGlzLmNvbGxhcHNlZEdyb3VwcyA9IG5ld0NvbGxhcHNlZDsKICAgIH0KICAgIHRvZ2dsZU11bHRpRmlsdGVyKGZpbHRlcktleSkgewogICAgICBjb25zdCBuZXdDb2xsYXBzZWQgPSBuZXcgU2V0KHRoaXMuY29sbGFwc2VkTXVsdGlGaWx0ZXJzKTsKICAgICAgaWYgKG5ld0NvbGxhcHNlZC5oYXMoZmlsdGVyS2V5KSkgewogICAgICAgIG5ld0NvbGxhcHNlZC5kZWxldGUoZmlsdGVyS2V5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuZXdDb2xsYXBzZWQuYWRkKGZpbHRlcktleSk7CiAgICAgIH0KICAgICAgdGhpcy5jb2xsYXBzZWRNdWx0aUZpbHRlcnMgPSBuZXdDb2xsYXBzZWQ7CiAgICB9CiAgICB0b2dnbGVDb2xsYXBzZSgpIHsKICAgICAgdGhpcy5jb2xsYXBzZWQgPSAhdGhpcy5jb2xsYXBzZWQ7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImNvbGxhcHNlLWNoYW5nZSIsIHsKICAgICAgICBkZXRhaWw6IHsgY29sbGFwc2VkOiB0aGlzLmNvbGxhcHNlZCB9LAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgc2VsZWN0VGFiSXRlbShpdGVtLCBncm91cCkgewogICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IGl0ZW07CiAgICAgIGl0ZW0uYWN0aW9uKCk7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIml0ZW0tc2VsZWN0IiwgewogICAgICAgIGRldGFpbDogeyBpdGVtLCBncm91cCB9LAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgYXN5bmMgaGFuZGxlQWN0aW9uQ2xpY2soaXRlbSkgewogICAgICBpZiAoaXRlbS5jb25maXJtTWVzc2FnZSkgewogICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IHdpbmRvdy5jb25maXJtKGl0ZW0uY29uZmlybU1lc3NhZ2UpOwogICAgICAgIGlmICghY29uZmlybWVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIGF3YWl0IGl0ZW0uYWN0aW9uKCk7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImFjdGlvbi1jbGljayIsIHsKICAgICAgICBkZXRhaWw6IHsgaXRlbSB9LAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgaGFuZGxlRmlsdGVyVG9nZ2xlKGl0ZW0pIHsKICAgICAgY29uc3QgbmV3QWN0aXZlID0gIWl0ZW0uYWN0aXZlOwogICAgICBpdGVtLmFjdGl2ZSA9IG5ld0FjdGl2ZTsKICAgICAgaXRlbS5vblRvZ2dsZShuZXdBY3RpdmUpOwogICAgICB0aGlzLnJlbmRlckNvdW50ZXIrKzsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiZmlsdGVyLXRvZ2dsZSIsIHsKICAgICAgICBkZXRhaWw6IHsgaXRlbSwgYWN0aXZlOiBuZXdBY3RpdmUgfSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGhhbmRsZU11bHRpRmlsdGVyT3B0aW9uVG9nZ2xlKGl0ZW0sIG9wdGlvbktleSkgewogICAgICBjb25zdCBvcHRpb24yID0gaXRlbS5vcHRpb25zLmZpbmQoKG9wdCkgPT4gb3B0LmtleSA9PT0gb3B0aW9uS2V5KTsKICAgICAgaWYgKG9wdGlvbjIpIHsKICAgICAgICBvcHRpb24yLmNoZWNrZWQgPSAhb3B0aW9uMi5jaGVja2VkOwogICAgICB9CiAgICAgIGNvbnN0IHNlbGVjdGVkS2V5cyA9IGl0ZW0ub3B0aW9ucy5maWx0ZXIoKG9wdCkgPT4gb3B0LmNoZWNrZWQpLm1hcCgob3B0KSA9PiBvcHQua2V5KTsKICAgICAgaXRlbS5vbkNoYW5nZShzZWxlY3RlZEtleXMpOwogICAgICB0aGlzLnJlbmRlckNvdW50ZXIrKzsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgibXVsdGlmaWx0ZXItY2hhbmdlIiwgewogICAgICAgIGRldGFpbDogeyBpdGVtLCBzZWxlY3RlZEtleXMgfSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGhhbmRsZUxpbmtDbGljayhpdGVtKSB7CiAgICAgIGNvbnN0IGlzRXh0ZXJuYWwgPSBpdGVtLmV4dGVybmFsID8/IGl0ZW0uaHJlZi5zdGFydHNXaXRoKCJodHRwIik7CiAgICAgIGlmIChpc0V4dGVybmFsKSB7CiAgICAgICAgd2luZG93Lm9wZW4oaXRlbS5ocmVmLCAiX2JsYW5rIiwgIm5vb3BlbmVyLG5vcmVmZXJyZXIiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGl0ZW0uaHJlZjsKICAgICAgfQogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJsaW5rLWNsaWNrIiwgewogICAgICAgIGRldGFpbDogeyBpdGVtIH0sCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBoYW5kbGVDb250ZXh0TWVudShldmVudCwgaXRlbSkgewogICAgICBEZWVzQ29udGV4dG1lbnUub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZXZlbnQsIFsKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiVmlldyBkZXRhaWxzIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgfSwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmV5ZSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJFZGl0IiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgfSwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOnBlbmNpbCIKICAgICAgICB9CiAgICAgIF0pOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcykgewogICAgICBhd2FpdCBzdXBlci5maXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgaWYgKHRoaXMuZ3JvdXBzLmxlbmd0aCA+IDApIHsKICAgICAgICBjb25zdCBpbml0aWFsQ29sbGFwc2VkID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgICAgICBjb25zdCBpbml0aWFsTXVsdGlGaWx0ZXJDb2xsYXBzZWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgICAgIHRoaXMuZ3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PiB7CiAgICAgICAgICBpZiAoZ3JvdXAuY29sbGFwc2VkKSB7CiAgICAgICAgICAgIGluaXRpYWxDb2xsYXBzZWQuYWRkKGdyb3VwLm5hbWUpOwogICAgICAgICAgfQogICAgICAgICAgZ3JvdXAuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4gewogICAgICAgICAgICBpZiAoInR5cGUiIGluIGl0ZW0gJiYgaXRlbS50eXBlID09PSAibXVsdGlGaWx0ZXIiKSB7CiAgICAgICAgICAgICAgY29uc3QgbXVsdGlGaWx0ZXIgPSBpdGVtOwogICAgICAgICAgICAgIGlmIChtdWx0aUZpbHRlci5jb2xsYXBzZWQpIHsKICAgICAgICAgICAgICAgIGluaXRpYWxNdWx0aUZpbHRlckNvbGxhcHNlZC5hZGQobXVsdGlGaWx0ZXIua2V5KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICAgIHRoaXMuY29sbGFwc2VkR3JvdXBzID0gaW5pdGlhbENvbGxhcHNlZDsKICAgICAgICB0aGlzLmNvbGxhcHNlZE11bHRpRmlsdGVycyA9IGluaXRpYWxNdWx0aUZpbHRlckNvbGxhcHNlZDsKICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRJdGVtKSB7CiAgICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuZ3JvdXBzKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBncm91cC5pdGVtcykgewogICAgICAgICAgICAgIGNvbnN0IGl0ZW1UeXBlID0gInR5cGUiIGluIGl0ZW0gPyBpdGVtLnR5cGUgOiAidGFiIjsKICAgICAgICAgICAgICBpZiAoaXRlbVR5cGUgPT09ICJ0YWIiIHx8IGl0ZW1UeXBlID09PSB2b2lkIDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHRhYkl0ZW0gPSBpdGVtOwogICAgICAgICAgICAgICAgaWYgKCF0YWJJdGVtLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0VGFiSXRlbSh0YWJJdGVtLCBncm91cCk7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25PcHRpb25zLmxlbmd0aCA+IDApIHsKICAgICAgICBjb25zdCBmaXJzdE9wdGlvbiA9IHRoaXMuc2VsZWN0aW9uT3B0aW9ucy5maW5kKChvcHQpID0+ICEoImRpdmlkZXIiIGluIG9wdCkpOwogICAgICAgIGlmIChmaXJzdE9wdGlvbiAmJiAhdGhpcy5zZWxlY3RlZEl0ZW0pIHsKICAgICAgICAgIGNvbnN0IHRhYkl0ZW0gPSB7CiAgICAgICAgICAgIGtleTogZmlyc3RPcHRpb24ua2V5LAogICAgICAgICAgICBpY29uTmFtZTogZmlyc3RPcHRpb24uaWNvbk5hbWUsCiAgICAgICAgICAgIGFjdGlvbjogZmlyc3RPcHRpb24uYWN0aW9uCiAgICAgICAgICB9OwogICAgICAgICAgdGhpcy5zZWxlY3RUYWJJdGVtKHRhYkl0ZW0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMzkodGhpcywgX2NvbGxhcHNlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczM5KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzQXBwdWlTZWNvbmRhcnltZW51MiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtYXBwdWkvZGVlcy1hcHB1aS10YWJzL2RlZXMtYXBwdWktdGFicy5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBfX2VzRGVjb3JhdGUzOSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNDAgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlbW9DbG9zZWFibGVUYWJzID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVtby1jbG9zZWFibGUtdGFicyIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3RhYnNfZGVjb3JhdG9yczsKICBsZXQgX3RhYnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90YWJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90YWJDb3VudGVyX2RlY29yYXRvcnM7CiAgbGV0IF90YWJDb3VudGVyX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGFiQ291bnRlcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZW1vQ2xvc2VhYmxlVGFiczIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF90YWJzX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF90YWJDb3VudGVyX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTM5KHRoaXMsIG51bGwsIF90YWJzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRhYnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRhYnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudGFicywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGFicyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90YWJzX2luaXRpYWxpemVycywgX3RhYnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzOSh0aGlzLCBudWxsLCBfdGFiQ291bnRlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0YWJDb3VudGVyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0YWJDb3VudGVyIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRhYkNvdW50ZXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnRhYkNvdW50ZXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGFiQ291bnRlcl9pbml0aWFsaXplcnMsIF90YWJDb3VudGVyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzkobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZW1vQ2xvc2VhYmxlVGFiczIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgI3RhYnNfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX3RhYnNfaW5pdGlhbGl6ZXJzLCBbCiAgICAgIHsga2V5OiAiTWFpbiIsIGljb25OYW1lOiAibHVjaWRlOmhvbWUiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJNYWluIGNsaWNrZWQiKSB9CiAgICBdKTsKICAgIGdldCB0YWJzKCkgewogICAgICByZXR1cm4gdGhpcy4jdGFic19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRhYnModmFsdWUyKSB7CiAgICAgIHRoaXMuI3RhYnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN0YWJDb3VudGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfdGFic19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX3RhYkNvdW50ZXJfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgdGFiQ291bnRlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RhYkNvdW50ZXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0YWJDb3VudGVyKHZhbHVlMikgewogICAgICB0aGlzLiN0YWJDb3VudGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmNvbnRyb2xzIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogOHB4OwogICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICAgIH0KICAgICAgYnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSg1OSwgMTMwLCAyNDYsIDAuMSkiLCAicmdiYSg1OSwgMTMwLCAyNDYsIDAuMSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoNTksIDEzMCwgMjQ2LCAwLjMpIiwgInJnYmEoNTksIDEzMCwgMjQ2LCAwLjMpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjNjBhNWZhIil9OwogICAgICAgIHBhZGRpbmc6IDhweCAxNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICB9CiAgICAgIGJ1dHRvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoNTksIDEzMCwgMjQ2LCAwLjIpIiwgInJnYmEoNTksIDEzMCwgMjQ2LCAwLjIpIil9OwogICAgICB9CiAgICAgIC5pbmZvIHsKICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICAgIHBhZGRpbmc6IDEycHggMTZweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLDAsMCwwLjAyKSIsICJyZ2JhKDI1NSwyNTUsMjU1LDAuMDIpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiNhMWExYWEiKX07CiAgICAgIH0KICAgIGAKICAgIF07CiAgICBhZGRUYWIoKSB7CiAgICAgIHRoaXMudGFiQ291bnRlcisrOwogICAgICBjb25zdCB0YWJLZXkgPSBgRG9jdW1lbnQgJHt0aGlzLnRhYkNvdW50ZXJ9YDsKICAgICAgdGhpcy50YWJzID0gWwogICAgICAgIC4uLnRoaXMudGFicywKICAgICAgICB7CiAgICAgICAgICBrZXk6IHRhYktleSwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmZpbGUiLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZyhgJHt0YWJLZXl9IGNsaWNrZWRgKSwKICAgICAgICAgIGNsb3NlYWJsZTogdHJ1ZSwKICAgICAgICAgIG9uQ2xvc2U6ICgpID0+IHRoaXMucmVtb3ZlVGFiKHRhYktleSkKICAgICAgICB9CiAgICAgIF07CiAgICB9CiAgICByZW1vdmVUYWIodGFiS2V5KSB7CiAgICAgIHRoaXMudGFicyA9IHRoaXMudGFicy5maWx0ZXIoKHQ5KSA9PiB0OS5rZXkgIT09IHRhYktleSk7CiAgICB9CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRlZXMtYXBwdWktdGFicwogICAgICAgIC50YWJzPSR7dGhpcy50YWJzfQogICAgICAgIEB0YWItY2xvc2U9JHsoZTExKSA9PiB0aGlzLnJlbW92ZVRhYihlMTEuZGV0YWlsLnRhYi5rZXkpfQogICAgICA+PC9kZWVzLWFwcHVpLXRhYnM+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xzIj4KICAgICAgICA8YnV0dG9uIEBjbGljaz0keygpID0+IHRoaXMuYWRkVGFiKCl9PisgQWRkIE5ldyBUYWI8L2J1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImluZm8iPgogICAgICAgIENsaWNrIHRoZSBYIGJ1dHRvbiBvbiB0YWJzIHRvIGNsb3NlIHRoZW0uIFRoZSAiTWFpbiIgdGFiIGlzIG5vdCBjbG9zZWFibGUuCiAgICAgICAgPGJyPkN1cnJlbnQgdGFiczogJHt0aGlzLnRhYnMubGVuZ3RofQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfdGFiQ291bnRlcl9leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczQwKF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZW1vQ2xvc2VhYmxlVGFiczIgPSBfY2xhc3NUaGlzOwp9KSgpOwp2YXIgRGVtb0F1dG9IaWRlVGFicyA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlbW8tYXV0b2hpZGUtdGFicyIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3RhYnNfZGVjb3JhdG9yczsKICBsZXQgX3RhYnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90YWJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdXRvSGlkZV9kZWNvcmF0b3JzOwogIGxldCBfYXV0b0hpZGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdXRvSGlkZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGhyZXNob2xkX2RlY29yYXRvcnM7CiAgbGV0IF90aHJlc2hvbGRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90aHJlc2hvbGRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVtb0F1dG9IaWRlVGFiczIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF90YWJzX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9hdXRvSGlkZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfdGhyZXNob2xkX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTM5KHRoaXMsIG51bGwsIF90YWJzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRhYnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRhYnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudGFicywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGFicyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90YWJzX2luaXRpYWxpemVycywgX3RhYnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzOSh0aGlzLCBudWxsLCBfYXV0b0hpZGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYXV0b0hpZGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImF1dG9IaWRlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmF1dG9IaWRlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hdXRvSGlkZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hdXRvSGlkZV9pbml0aWFsaXplcnMsIF9hdXRvSGlkZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM5KHRoaXMsIG51bGwsIF90aHJlc2hvbGRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGhyZXNob2xkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0aHJlc2hvbGQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudGhyZXNob2xkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50aHJlc2hvbGQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGhyZXNob2xkX2luaXRpYWxpemVycywgX3RocmVzaG9sZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM5KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVtb0F1dG9IaWRlVGFiczIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgI3RhYnNfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX3RhYnNfaW5pdGlhbGl6ZXJzLCBbCiAgICAgIHsga2V5OiAiVGFiIDEiLCBpY29uTmFtZTogImx1Y2lkZTpmaWxlIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiVGFiIDEiKSB9LAogICAgICB7IGtleTogIlRhYiAyIiwgaWNvbk5hbWU6ICJsdWNpZGU6ZmlsZSIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIlRhYiAyIikgfQogICAgXSk7CiAgICBnZXQgdGFicygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RhYnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0YWJzKHZhbHVlMikgewogICAgICB0aGlzLiN0YWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYXV0b0hpZGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF90YWJzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfYXV0b0hpZGVfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgYXV0b0hpZGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhdXRvSGlkZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGF1dG9IaWRlKHZhbHVlMikgewogICAgICB0aGlzLiNhdXRvSGlkZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3RocmVzaG9sZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX2F1dG9IaWRlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfdGhyZXNob2xkX2luaXRpYWxpemVycywgMSkpOwogICAgZ2V0IHRocmVzaG9sZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RocmVzaG9sZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRocmVzaG9sZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdGhyZXNob2xkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLnRhYnMtY29udGFpbmVyIHsKICAgICAgICBtaW4taGVpZ2h0OiA2MHB4OwogICAgICAgIGJvcmRlcjogMXB4IGRhc2hlZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnRhYnMtY29udGFpbmVyIGRlZXMtYXBwdWktdGFicyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLnBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNhMWExYWEiLCAiIzcxNzE3YSIpfTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICB9CiAgICAgIC5jb250cm9scyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQogICAgICBidXR0b24gewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDU5LCAxMzAsIDI0NiwgMC4xKSIsICJyZ2JhKDU5LCAxMzAsIDI0NiwgMC4xKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSg1OSwgMTMwLCAyNDYsIDAuMykiLCAicmdiYSg1OSwgMTMwLCAyNDYsIDAuMykiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiM2MGE1ZmEiKX07CiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KICAgICAgYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSg1OSwgMTMwLCAyNDYsIDAuMikiLCAicmdiYSg1OSwgMTMwLCAyNDYsIDAuMikiKX07CiAgICAgIH0KICAgICAgYnV0dG9uLmRhbmdlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMjM5LCA2OCwgNjgsIDAuMSkiLCAicmdiYSgyMzksIDY4LCA2OCwgMC4xKSIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDIzOSwgNjgsIDY4LCAwLjMpIiwgInJnYmEoMjM5LCA2OCwgNjgsIDAuMykiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZWY0NDQ0IiwgIiNmODcxNzEiKX07CiAgICAgIH0KICAgICAgYnV0dG9uLmRhbmdlcjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMjM5LCA2OCwgNjgsIDAuMikiLCAicmdiYSgyMzksIDY4LCA2OCwgMC4yKSIpfTsKICAgICAgfQogICAgICAuaW5mbyB7CiAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwwLDAsMC4wMikiLCAicmdiYSgyNTUsMjU1LDI1NSwwLjAyKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OwogICAgICB9CiAgICBgCiAgICBdOwogICAgdGFiQ291bnRlciA9IChfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF90aHJlc2hvbGRfZXh0cmFJbml0aWFsaXplcnMpLCAyKTsKICAgIGFkZFRhYigpIHsKICAgICAgdGhpcy50YWJDb3VudGVyKys7CiAgICAgIHRoaXMudGFicyA9IFsuLi50aGlzLnRhYnMsIHsKICAgICAgICBrZXk6IGBUYWIgJHt0aGlzLnRhYkNvdW50ZXJ9YCwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpmaWxlIiwKICAgICAgICBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKGBUYWIgJHt0aGlzLnRhYkNvdW50ZXJ9YCkKICAgICAgfV07CiAgICB9CiAgICByZW1vdmVMYXN0VGFiKCkgewogICAgICBpZiAodGhpcy50YWJzLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLnRhYnMgPSB0aGlzLnRhYnMuc2xpY2UoMCwgLTEpOwogICAgICB9CiAgICB9CiAgICBjbGVhclRhYnMoKSB7CiAgICAgIHRoaXMudGFicyA9IFtdOwogICAgfQogICAgcmVuZGVyKCkgewogICAgICBjb25zdCBzaG91bGRIaWRlID0gdGhpcy5hdXRvSGlkZSAmJiB0aGlzLnRhYnMubGVuZ3RoIDw9IHRoaXMudGhyZXNob2xkOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InRhYnMtY29udGFpbmVyIj4KICAgICAgICAke3Nob3VsZEhpZGUgPyBiMmA8c3BhbiBjbGFzcz0icGxhY2Vob2xkZXIiPlRhYnMgaGlkZGVuICgke3RoaXMudGFicy5sZW5ndGh9IHRhYnMg4omkIHRocmVzaG9sZCAke3RoaXMudGhyZXNob2xkfSk8L3NwYW4+YCA6IGIyYDxkZWVzLWFwcHVpLXRhYnMKICAgICAgICAgICAgICAudGFicz0ke3RoaXMudGFic30KICAgICAgICAgICAgICAuYXV0b0hpZGU9JHt0aGlzLmF1dG9IaWRlfQogICAgICAgICAgICAgIC5hdXRvSGlkZVRocmVzaG9sZD0ke3RoaXMudGhyZXNob2xkfQogICAgICAgICAgICA+PC9kZWVzLWFwcHVpLXRhYnM+YH0KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xzIj4KICAgICAgICA8YnV0dG9uIEBjbGljaz0keygpID0+IHRoaXMuYWRkVGFiKCl9PisgQWRkIFRhYjwvYnV0dG9uPgogICAgICAgIDxidXR0b24gY2xhc3M9ImRhbmdlciIgQGNsaWNrPSR7KCkgPT4gdGhpcy5yZW1vdmVMYXN0VGFiKCl9Pi0gUmVtb3ZlIFRhYjwvYnV0dG9uPgogICAgICAgIDxidXR0b24gY2xhc3M9ImRhbmdlciIgQGNsaWNrPSR7KCkgPT4gdGhpcy5jbGVhclRhYnMoKX0+Q2xlYXIgQWxsPC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiBAY2xpY2s9JHsoKSA9PiB7CiAgICAgICAgdGhpcy50aHJlc2hvbGQgPSAwOwogICAgICB9fT5UaHJlc2hvbGQ6IDA8L2J1dHRvbj4KICAgICAgICA8YnV0dG9uIEBjbGljaz0keygpID0+IHsKICAgICAgICB0aGlzLnRocmVzaG9sZCA9IDE7CiAgICAgIH19PlRocmVzaG9sZDogMTwvYnV0dG9uPgogICAgICAgIDxidXR0b24gQGNsaWNrPSR7KCkgPT4gewogICAgICAgIHRoaXMudGhyZXNob2xkID0gMjsKICAgICAgfX0+VGhyZXNob2xkOiAyPC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJpbmZvIj4KICAgICAgICBBdXRvLWhpZGU6ICR7dGhpcy5hdXRvSGlkZSA/ICJPTiIgOiAiT0ZGIn0gfCBUaHJlc2hvbGQ6ICR7dGhpcy50aHJlc2hvbGR9IHwgVGFiczogJHt0aGlzLnRhYnMubGVuZ3RofQogICAgICAgIDxicj5UYWJzIHdpbGwgaGlkZSB3aGVuIGNvdW50IOKJpCB0aHJlc2hvbGQuCiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNDAoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlbW9BdXRvSGlkZVRhYnMyID0gX2NsYXNzVGhpczsKfSkoKTsKdmFyIGRlbW9GdW5jMzAgPSAoKSA9PiB7CiAgY29uc3QgaG9yaXpvbnRhbFRhYnMgPSBbCiAgICB7IGtleTogIkhvbWUiLCBpY29uTmFtZTogImx1Y2lkZTpob21lIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiSG9tZSBjbGlja2VkIikgfSwKICAgIHsga2V5OiAiQW5hbHl0aWNzIERhc2hib2FyZCIsIGljb25OYW1lOiAibHVjaWRlOmxpbmVDaGFydCIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIkFuYWx5dGljcyBjbGlja2VkIikgfSwKICAgIHsga2V5OiAiUmVwb3J0cyIsIGljb25OYW1lOiAibHVjaWRlOmZpbGVUZXh0IiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiUmVwb3J0cyBjbGlja2VkIikgfSwKICAgIHsga2V5OiAiVXNlciBTZXR0aW5ncyIsIGljb25OYW1lOiAibHVjaWRlOnNldHRpbmdzIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiU2V0dGluZ3MgY2xpY2tlZCIpIH0sCiAgICB7IGtleTogIkhlbHAiLCBpY29uTmFtZTogImx1Y2lkZTpoZWxwQ2lyY2xlIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiSGVscCBjbGlja2VkIikgfQogIF07CiAgY29uc3QgdmVydGljYWxUYWJzID0gWwogICAgeyBrZXk6ICJQcm9maWxlIiwgaWNvbk5hbWU6ICJsdWNpZGU6dXNlciIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIlByb2ZpbGUgY2xpY2tlZCIpIH0sCiAgICB7IGtleTogIlNlY3VyaXR5IiwgaWNvbk5hbWU6ICJsdWNpZGU6c2hpZWxkIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiU2VjdXJpdHkgY2xpY2tlZCIpIH0sCiAgICB7IGtleTogIk5vdGlmaWNhdGlvbnMiLCBpY29uTmFtZTogImx1Y2lkZTpiZWxsIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiTm90aWZpY2F0aW9ucyBjbGlja2VkIikgfSwKICAgIHsga2V5OiAiSW50ZWdyYXRpb25zIiwgaWNvbk5hbWU6ICJsdWNpZGU6bGluayIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIkludGVncmF0aW9ucyBjbGlja2VkIikgfSwKICAgIHsga2V5OiAiQWR2YW5jZWQiLCBpY29uTmFtZTogImx1Y2lkZTpjb2RlIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiQWR2YW5jZWQgY2xpY2tlZCIpIH0KICBdOwogIGNvbnN0IG5vSW5kaWNhdG9yVGFicyA9IFsKICAgIHsga2V5OiAiQWxsIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiQWxsIGNsaWNrZWQiKSB9LAogICAgeyBrZXk6ICJBY3RpdmUiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJBY3RpdmUgY2xpY2tlZCIpIH0sCiAgICB7IGtleTogIkNvbXBsZXRlZCIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIkNvbXBsZXRlZCBjbGlja2VkIikgfSwKICAgIHsga2V5OiAiQXJjaGl2ZWQiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJBcmNoaXZlZCBjbGlja2VkIikgfQogIF07CiAgY29uc3QgZGVtb0NvbnRlbnQgPSAodGV4dDkpID0+IGIyYAogICAgPGRpdiBzdHlsZT0icGFkZGluZzogMjRweDsgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiNhMWExYWEiKX07Ij4KICAgICAgJHt0ZXh0OX0KICAgIDwvZGl2PgogIGA7CiAgcmV0dXJuIGIyYAogICAgPHN0eWxlPgogICAgICAuZGVtby1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDMycHg7CiAgICAgICAgcGFkZGluZzogNDhweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y4ZjlmYSIsICIjMGEwYTBhIil9OwogICAgICAgIG1pbi1oZWlnaHQ6IDEwMHZoOwogICAgICB9CgogICAgICAuc2VjdGlvbiB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzE4MTgxYiIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSk7CiAgICAgIH0KCiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICB9CgogICAgICAudHdvLWNvbHVtbiB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDIwMHB4IDFmcjsKICAgICAgICBnYXA6IDI0cHg7CiAgICAgICAgYWxpZ24taXRlbXM6IHN0YXJ0OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5Ib3Jpem9udGFsIFRhYnMgd2l0aCBBbmltYXRlZCBJbmRpY2F0b3I8L2Rpdj4KICAgICAgICA8ZGVlcy1hcHB1aS10YWJzIC50YWJzPSR7aG9yaXpvbnRhbFRhYnN9PjwvZGVlcy1hcHB1aS10YWJzPgogICAgICAgICR7ZGVtb0NvbnRlbnQoIlNlbGVjdCBhIHRhYiB0byBzZWUgdGhlIHNtb290aCBzbGlkaW5nIGFuaW1hdGlvbiBvZiB0aGUgaW5kaWNhdG9yLiBUaGUgaW5kaWNhdG9yIGF1dG9tYXRpY2FsbHkgYWRqdXN0cyBpdHMgd2lkdGggdG8gbWF0Y2ggdGhlIHRhYiBjb250ZW50IHdpdGggbWluaW1hbCBwYWRkaW5nLiIpfQogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPkNsb3NlYWJsZSBUYWJzIChCcm93c2VyLXN0eWxlKTwvZGl2PgogICAgICAgIDxkZW1vLWNsb3NlYWJsZS10YWJzPjwvZGVtby1jbG9zZWFibGUtdGFicz4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5BdXRvLWhpZGUgVGFiczwvZGl2PgogICAgICAgIDxkZW1vLWF1dG9oaWRlLXRhYnM+PC9kZW1vLWF1dG9oaWRlLXRhYnM+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+VmVydGljYWwgVGFicyBMYXlvdXQ8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0d28tY29sdW1uIj4KICAgICAgICAgIDxkZWVzLWFwcHVpLXRhYnMgLnRhYlN0eWxlPSR7InZlcnRpY2FsIn0gLnRhYnM9JHt2ZXJ0aWNhbFRhYnN9PjwvZGVlcy1hcHB1aS10YWJzPgogICAgICAgICAgJHtkZW1vQ29udGVudCgiVmVydGljYWwgdGFicyB3b3JrIGdyZWF0IGZvciBzZXR0aW5ncyBwYWdlcyBhbmQgbmF2aWdhdGlvbiBtZW51cy4gVGhlIGFuaW1hdGVkIGluZGljYXRvciBzbW9vdGhseSB0cmFuc2l0aW9ucyBiZXR3ZWVuIHNlbGVjdGlvbnMuIil9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+V2l0aG91dCBJbmRpY2F0b3I8L2Rpdj4KICAgICAgICA8ZGVlcy1hcHB1aS10YWJzIC5zaG93VGFiSW5kaWNhdG9yPSR7ZmFsc2V9IC50YWJzPSR7bm9JbmRpY2F0b3JUYWJzfT48L2RlZXMtYXBwdWktdGFicz4KICAgICAgICAke2RlbW9Db250ZW50KCJUYWJzIGNhbiBhbHNvIGJlIHVzZWQgd2l0aG91dCB0aGUgYW5pbWF0ZWQgaW5kaWNhdG9yIGJ5IHNldHRpbmcgc2hvd1RhYkluZGljYXRvciB0byBmYWxzZS4iKX0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWFwcHVpL2RlZXMtYXBwdWktdGFicy9kZWVzLWFwcHVpLXRhYnMuanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF9kaXN0X3RzMjUoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlNDAgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczQxID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzQXBwdWlUYWJzID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1hcHB1aS10YWJzIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfdGFic19kZWNvcmF0b3JzOwogIGxldCBfdGFic19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RhYnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkVGFiX2RlY29yYXRvcnM7CiAgbGV0IF9zZWxlY3RlZFRhYl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkVGFiX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93VGFiSW5kaWNhdG9yX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93VGFiSW5kaWNhdG9yX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1RhYkluZGljYXRvcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGFiU3R5bGVfZGVjb3JhdG9yczsKICBsZXQgX3RhYlN0eWxlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGFiU3R5bGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2F1dG9IaWRlX2RlY29yYXRvcnM7CiAgbGV0IF9hdXRvSGlkZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2F1dG9IaWRlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdXRvSGlkZVRocmVzaG9sZF9kZWNvcmF0b3JzOwogIGxldCBfYXV0b0hpZGVUaHJlc2hvbGRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdXRvSGlkZVRocmVzaG9sZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2FuU2Nyb2xsTGVmdF9kZWNvcmF0b3JzOwogIGxldCBfY2FuU2Nyb2xsTGVmdF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NhblNjcm9sbExlZnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NhblNjcm9sbFJpZ2h0X2RlY29yYXRvcnM7CiAgbGV0IF9jYW5TY3JvbGxSaWdodF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NhblNjcm9sbFJpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNBcHB1aVRhYnMyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfdGFic19kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBBcnJheQogICAgICB9KV07CiAgICAgIF9zZWxlY3RlZFRhYl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogT2JqZWN0IH0pXTsKICAgICAgX3Nob3dUYWJJbmRpY2F0b3JfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfdGFiU3R5bGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9hdXRvSGlkZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9hdXRvSGlkZVRocmVzaG9sZF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX2NhblNjcm9sbExlZnRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2NhblNjcm9sbFJpZ2h0X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTQwKHRoaXMsIG51bGwsIF90YWJzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRhYnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRhYnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudGFicywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGFicyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90YWJzX2luaXRpYWxpemVycywgX3RhYnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0MCh0aGlzLCBudWxsLCBfc2VsZWN0ZWRUYWJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0ZWRUYWIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlbGVjdGVkVGFiIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGVkVGFiLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3RlZFRhYiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWxlY3RlZFRhYl9pbml0aWFsaXplcnMsIF9zZWxlY3RlZFRhYl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQwKHRoaXMsIG51bGwsIF9zaG93VGFiSW5kaWNhdG9yX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dUYWJJbmRpY2F0b3IiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNob3dUYWJJbmRpY2F0b3IiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2hvd1RhYkluZGljYXRvciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd1RhYkluZGljYXRvciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93VGFiSW5kaWNhdG9yX2luaXRpYWxpemVycywgX3Nob3dUYWJJbmRpY2F0b3JfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0MCh0aGlzLCBudWxsLCBfdGFiU3R5bGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGFiU3R5bGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRhYlN0eWxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRhYlN0eWxlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50YWJTdHlsZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90YWJTdHlsZV9pbml0aWFsaXplcnMsIF90YWJTdHlsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQwKHRoaXMsIG51bGwsIF9hdXRvSGlkZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhdXRvSGlkZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYXV0b0hpZGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYXV0b0hpZGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmF1dG9IaWRlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2F1dG9IaWRlX2luaXRpYWxpemVycywgX2F1dG9IaWRlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDAodGhpcywgbnVsbCwgX2F1dG9IaWRlVGhyZXNob2xkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImF1dG9IaWRlVGhyZXNob2xkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhdXRvSGlkZVRocmVzaG9sZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hdXRvSGlkZVRocmVzaG9sZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYXV0b0hpZGVUaHJlc2hvbGQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYXV0b0hpZGVUaHJlc2hvbGRfaW5pdGlhbGl6ZXJzLCBfYXV0b0hpZGVUaHJlc2hvbGRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0MCh0aGlzLCBudWxsLCBfY2FuU2Nyb2xsTGVmdF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjYW5TY3JvbGxMZWZ0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjYW5TY3JvbGxMZWZ0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNhblNjcm9sbExlZnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNhblNjcm9sbExlZnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY2FuU2Nyb2xsTGVmdF9pbml0aWFsaXplcnMsIF9jYW5TY3JvbGxMZWZ0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDAodGhpcywgbnVsbCwgX2NhblNjcm9sbFJpZ2h0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNhblNjcm9sbFJpZ2h0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjYW5TY3JvbGxSaWdodCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jYW5TY3JvbGxSaWdodCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY2FuU2Nyb2xsUmlnaHQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY2FuU2Nyb2xsUmlnaHRfaW5pdGlhbGl6ZXJzLCBfY2FuU2Nyb2xsUmlnaHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0MChudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNBcHB1aVRhYnMyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMzMDsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJBcHAgVUkiXTsKICAgICN0YWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczQxKHRoaXMsIF90YWJzX2luaXRpYWxpemVycywgW10pOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCB0YWJzKCkgewogICAgICByZXR1cm4gdGhpcy4jdGFic19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRhYnModmFsdWUyKSB7CiAgICAgIHRoaXMuI3RhYnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWxlY3RlZFRhYl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDEodGhpcywgX3RhYnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQxKHRoaXMsIF9zZWxlY3RlZFRhYl9pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIGdldCBzZWxlY3RlZFRhYigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkVGFiX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0ZWRUYWIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlbGVjdGVkVGFiX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd1RhYkluZGljYXRvcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDEodGhpcywgX3NlbGVjdGVkVGFiX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0MSh0aGlzLCBfc2hvd1RhYkluZGljYXRvcl9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93VGFiSW5kaWNhdG9yKCkgewogICAgICByZXR1cm4gdGhpcy4jc2hvd1RhYkluZGljYXRvcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dUYWJJbmRpY2F0b3IodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dUYWJJbmRpY2F0b3JfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN0YWJTdHlsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDEodGhpcywgX3Nob3dUYWJJbmRpY2F0b3JfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQxKHRoaXMsIF90YWJTdHlsZV9pbml0aWFsaXplcnMsICJob3Jpem9udGFsIikpOwogICAgZ2V0IHRhYlN0eWxlKCkgewogICAgICByZXR1cm4gdGhpcy4jdGFiU3R5bGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0YWJTdHlsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdGFiU3R5bGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhdXRvSGlkZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDEodGhpcywgX3RhYlN0eWxlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0MSh0aGlzLCBfYXV0b0hpZGVfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGF1dG9IaWRlKCkgewogICAgICByZXR1cm4gdGhpcy4jYXV0b0hpZGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhdXRvSGlkZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYXV0b0hpZGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhdXRvSGlkZVRocmVzaG9sZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDEodGhpcywgX2F1dG9IaWRlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0MSh0aGlzLCBfYXV0b0hpZGVUaHJlc2hvbGRfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgYXV0b0hpZGVUaHJlc2hvbGQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhdXRvSGlkZVRocmVzaG9sZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGF1dG9IaWRlVGhyZXNob2xkKHZhbHVlMikgewogICAgICB0aGlzLiNhdXRvSGlkZVRocmVzaG9sZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NhblNjcm9sbExlZnRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQxKHRoaXMsIF9hdXRvSGlkZVRocmVzaG9sZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDEodGhpcywgX2NhblNjcm9sbExlZnRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgLy8gU2Nyb2xsIHN0YXRlIGZvciBmYWRlIGluZGljYXRvcnMKICAgIGdldCBjYW5TY3JvbGxMZWZ0KCkgewogICAgICByZXR1cm4gdGhpcy4jY2FuU2Nyb2xsTGVmdF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNhblNjcm9sbExlZnQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2NhblNjcm9sbExlZnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjYW5TY3JvbGxSaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDEodGhpcywgX2NhblNjcm9sbExlZnRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQxKHRoaXMsIF9jYW5TY3JvbGxSaWdodF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgY2FuU2Nyb2xsUmlnaHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjYW5TY3JvbGxSaWdodF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNhblNjcm9sbFJpZ2h0KHZhbHVlMikgewogICAgICB0aGlzLiNjYW5TY3JvbGxSaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgcmVzaXplT2JzZXJ2ZXIgPSAoX19ydW5Jbml0aWFsaXplcnM0MSh0aGlzLCBfY2FuU2Nyb2xsUmlnaHRfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAudGFicy13cmFwcGVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICB9CgogICAgICAudGFicy13cmFwcGVyLmhvcml6b250YWwtd3JhcHBlciB7CiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyogU2Nyb2xsIGZhZGUgaW5kaWNhdG9ycyAqLwogICAgICAuc2Nyb2xsLWZhZGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAxcHg7CiAgICAgICAgd2lkdGg6IDQ4cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZTsKICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgfQoKICAgICAgLnNjcm9sbC1mYWRlLWxlZnQgewogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LAogICAgICAgICAgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzE2MTYxNiIpfSAwJSwKICAgICAgICAgICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDI1NSwyNTUsMjU1LDApIiwgInJnYmEoMjIsMjIsMjIsMCkiKX0gMTAwJSk7CiAgICAgIH0KCiAgICAgIC5zY3JvbGwtZmFkZS1yaWdodCB7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIGxlZnQsCiAgICAgICAgICAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMTYxNjE2Iil9IDAlLAogICAgICAgICAgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMjU1LDI1NSwyNTUsMCkiLCAicmdiYSgyMiwyMiwyMiwwKSIpfSAxMDAlKTsKICAgICAgfQoKICAgICAgLnNjcm9sbC1mYWRlLnZpc2libGUgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC50YWJzQ29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICB9CgogICAgICAudGFic0NvbnRhaW5lci5ob3Jpem9udGFsIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteTogaGlkZGVuOwogICAgICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICAgICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwogICAgICAgIHNjcm9sbGJhci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgICBnYXA6IDRweDsKICAgICAgfQoKICAgICAgLyogU2hvdyBzY3JvbGxiYXIgb24gaG92ZXIgKi8KICAgICAgLnRhYnMtd3JhcHBlcjpob3ZlciAudGFic0NvbnRhaW5lci5ob3Jpem9udGFsIHsKICAgICAgICBzY3JvbGxiYXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsMCwwLDAuMikiLCAicmdiYSgyNTUsMjU1LDI1NSwwLjIpIil9IHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAudGFic0NvbnRhaW5lci5ob3Jpem9udGFsOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICAgICAgaGVpZ2h0OiA0cHg7CiAgICAgIH0KCiAgICAgIC50YWJzQ29udGFpbmVyLmhvcml6b250YWw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgLnRhYnNDb250YWluZXIuaG9yaXpvbnRhbDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnMgZWFzZTsKICAgICAgfQoKICAgICAgLnRhYnMtd3JhcHBlcjpob3ZlciAudGFic0NvbnRhaW5lci5ob3Jpem9udGFsOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwwLDAsMC4yKSIsICJyZ2JhKDI1NSwyNTUsMjU1LDAuMikiKX07CiAgICAgIH0KCiAgICAgIC50YWJzLXdyYXBwZXI6aG92ZXIgLnRhYnNDb250YWluZXIuaG9yaXpvbnRhbDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsMCwwLDAuMzUpIiwgInJnYmEoMjU1LDI1NSwyNTUsMC4zNSkiKX07CiAgICAgIH0KCiAgICAgIC50YWJzQ29udGFpbmVyLnZlcnRpY2FsIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBnYXA6IDJweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOWZhZmIiLCAiIzE4MTgxYiIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgIH0KCiAgICAgIC50YWIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjNzE3MTdhIil9OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMTVzIGVhc2U7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgfQoKICAgICAgLmhvcml6b250YWwgLnRhYiB7CiAgICAgICAgcGFkZGluZzogMCAxNnB4OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHggNnB4IDAgMDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2U7CiAgICAgIH0KICAgICAgCiAgICAgIC5ob3Jpem9udGFsIC50YWI6bm90KDpsYXN0LWNoaWxkKTo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogLTJweDsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIHdpZHRoOiAxcHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KICAgICAgCiAgICAgIC5ob3Jpem9udGFsIC50YWIgLnRhYi1jb250ZW50IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICB9CgogICAgICAudmVydGljYWwgLnRhYiB7CiAgICAgICAgcGFkZGluZzogMTBweCAxNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC50YWI6aG92ZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICB9CiAgICAgIAogICAgICAuaG9yaXpvbnRhbCAudGFiOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjAzKSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpIil9OwogICAgICB9CiAgICAgIAogICAgICAuaG9yaXpvbnRhbCAudGFiOmhvdmVyOjphZnRlciwKICAgICAgLmhvcml6b250YWwgLnRhYjpob3ZlciArIC50YWI6OmFmdGVyIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICB9CgogICAgICAudmVydGljYWwgLnRhYjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMjQ0LCAyNDQsIDI0NSwgMC41KSIsICJyZ2JhKDM5LCAzOSwgNDIsIDAuNSkiKX07CiAgICAgIH0KCiAgICAgIC5ob3Jpem9udGFsIC50YWIuc2VsZWN0ZWRUYWIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICB9CiAgICAgIAogICAgICAuaG9yaXpvbnRhbCAudGFiLnNlbGVjdGVkVGFiOjphZnRlciwKICAgICAgLmhvcml6b250YWwgLnRhYi5zZWxlY3RlZFRhYiArIC50YWI6OmFmdGVyIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICB9CgogICAgICAudmVydGljYWwgLnRhYi5zZWxlY3RlZFRhYiB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICAgIH0KCiAgICAgIC50YWIgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgIH0KCiAgICAgIC50YWJJbmRpY2F0b3IgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIC50YWJJbmRpY2F0b3Iubm8tdHJhbnNpdGlvbiB7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgLnRhYnMtd3JhcHBlciAudGFiSW5kaWNhdG9yIHsKICAgICAgICBoZWlnaHQ6IDNweDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDsKICAgICAgICB6LWluZGV4OiAzOwogICAgICB9CgogICAgICAudmVydGljYWwtd3JhcHBlciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAudmVydGljYWwtd3JhcHBlciAudGFiSW5kaWNhdG9yIHsKICAgICAgICBsZWZ0OiA4cHg7CiAgICAgICAgcmlnaHQ6IDhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzI3MjcyYSIpfTsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMDgpOwogICAgICB9CgogICAgICAvKiBDbG9zZSBidXR0b24gKi8KICAgICAgLnRhYi1jbG9zZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiA4cHg7CiAgICAgICAgb3BhY2l0eTogMC40OwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMsIGJhY2tncm91bmQgMC4xNXM7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM3MTcxN2EiKX07CiAgICAgIH0KCiAgICAgIC50YWI6aG92ZXIgLnRhYi1jbG9zZSB7CiAgICAgICAgb3BhY2l0eTogMC43OwogICAgICB9CgogICAgICAudGFiLWNsb3NlOmhvdmVyIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsMCwwLDAuMSkiLCAicmdiYSgyNTUsMjU1LDI1NSwwLjEpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2VmNDQ0NCIsICIjZjg3MTcxIil9OwogICAgICB9CgogICAgICAudGFiLnNlbGVjdGVkVGFiIC50YWItY2xvc2UgewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgfQoKICAgICAgLnRhYi5zZWxlY3RlZFRhYjpob3ZlciAudGFiLWNsb3NlIHsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgIH0KCiAgICAgIC50YWIuc2VsZWN0ZWRUYWIgLnRhYi1jbG9zZTpob3ZlciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgaWYgKHRoaXMuYXV0b0hpZGUgJiYgdGhpcy50YWJzLmxlbmd0aCA8PSB0aGlzLmF1dG9IaWRlVGhyZXNob2xkKSB7CiAgICAgICAgcmV0dXJuIGIyYGA7CiAgICAgIH0KICAgICAgcmV0dXJuIGIyYAogICAgICAke3RoaXMucmVuZGVyVGFic1dyYXBwZXIoKX0KICAgIGA7CiAgICB9CiAgICByZW5kZXJUYWJzV3JhcHBlcigpIHsKICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gdGhpcy50YWJTdHlsZSA9PT0gImhvcml6b250YWwiOwogICAgICBjb25zdCB3cmFwcGVyQ2xhc3MgPSBpc0hvcml6b250YWwgPyAidGFicy13cmFwcGVyIGhvcml6b250YWwtd3JhcHBlciIgOiAidmVydGljYWwtd3JhcHBlciI7CiAgICAgIGNvbnN0IGNvbnRhaW5lckNsYXNzID0gYHRhYnNDb250YWluZXIgJHt0aGlzLnRhYlN0eWxlfWA7CiAgICAgIGlmIChpc0hvcml6b250YWwpIHsKICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgPGRpdiBjbGFzcz0iJHt3cmFwcGVyQ2xhc3N9Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9InNjcm9sbC1mYWRlIHNjcm9sbC1mYWRlLWxlZnQgJHt0aGlzLmNhblNjcm9sbExlZnQgPyAidmlzaWJsZSIgOiAiIn0iPjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iJHtjb250YWluZXJDbGFzc30iIEBzY3JvbGw9JHt0aGlzLmhhbmRsZVNjcm9sbH0+CiAgICAgICAgICAgICR7dGhpcy50YWJzLm1hcCgodGFiMikgPT4gdGhpcy5yZW5kZXJUYWIodGFiMiwgaXNIb3Jpem9udGFsKSl9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNjcm9sbC1mYWRlIHNjcm9sbC1mYWRlLXJpZ2h0ICR7dGhpcy5jYW5TY3JvbGxSaWdodCA/ICJ2aXNpYmxlIiA6ICIifSI+PC9kaXY+CiAgICAgICAgICAke3RoaXMuc2hvd1RhYkluZGljYXRvciA/IGIyYDxkaXYgY2xhc3M9InRhYkluZGljYXRvciI+PC9kaXY+YCA6ICIifQogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgICB9CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iJHt3cmFwcGVyQ2xhc3N9Ij4KICAgICAgICA8ZGl2IGNsYXNzPSIke2NvbnRhaW5lckNsYXNzfSI+CiAgICAgICAgICAke3RoaXMudGFicy5tYXAoKHRhYjIpID0+IHRoaXMucmVuZGVyVGFiKHRhYjIsIGlzSG9yaXpvbnRhbCkpfQogICAgICAgIDwvZGl2PgogICAgICAgICR7dGhpcy5zaG93VGFiSW5kaWNhdG9yID8gYjJgPGRpdiBjbGFzcz0idGFiSW5kaWNhdG9yIj48L2Rpdj5gIDogIiJ9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlclRhYih0YWIyLCBpc0hvcml6b250YWwpIHsKICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHRhYjIgPT09IHRoaXMuc2VsZWN0ZWRUYWI7CiAgICAgIGNvbnN0IGNsYXNzZXMgPSBgdGFiICR7aXNTZWxlY3RlZCA/ICJzZWxlY3RlZFRhYiIgOiAiIn1gOwogICAgICBjb25zdCBjbG9zZUJ1dHRvbiA9IHRhYjIuY2xvc2VhYmxlID8gYjJgCiAgICAgIDxzcGFuIGNsYXNzPSJ0YWItY2xvc2UiIEBjbGljaz0iJHsoZTExKSA9PiB0aGlzLmNsb3NlVGFiKGUxMSwgdGFiMil9Ij4KICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTp4In0gc3R5bGU9ImZvbnQtc2l6ZTogMTJweDsiPjwvZGVlcy1pY29uPgogICAgICA8L3NwYW4+CiAgICBgIDogIiI7CiAgICAgIGNvbnN0IGNvbnRlbnQzID0gaXNIb3Jpem9udGFsID8gYjJgCiAgICAgIDxzcGFuIGNsYXNzPSJ0YWItY29udGVudCI+CiAgICAgICAgJHt0aGlzLnJlbmRlclRhYkljb24odGFiMil9CiAgICAgICAgJHt0YWIyLmtleX0KICAgICAgPC9zcGFuPgogICAgICAke2Nsb3NlQnV0dG9ufQogICAgYCA6IGIyYAogICAgICAke3RoaXMucmVuZGVyVGFiSWNvbih0YWIyKX0KICAgICAgJHt0YWIyLmtleX0KICAgICAgJHtjbG9zZUJ1dHRvbn0KICAgIGA7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdgogICAgICAgIGNsYXNzPSIke2NsYXNzZXN9IgogICAgICAgIEBjbGljaz0iJHsoKSA9PiB0aGlzLnNlbGVjdFRhYih0YWIyKX0iCiAgICAgID4KICAgICAgICAke2NvbnRlbnQzfQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJUYWJJY29uKHRhYjIpIHsKICAgICAgcmV0dXJuIHRhYjIuaWNvbk5hbWUgPyBiMmA8ZGVlcy1pY29uIC5pY29uPSR7dGFiMi5pY29uTmFtZX0+PC9kZWVzLWljb24+YCA6ICIiOwogICAgfQogICAgc2VsZWN0VGFiKHRhYkFyZykgewogICAgICB0aGlzLnNlbGVjdGVkVGFiID0gdGFiQXJnOwogICAgICB0YWJBcmcuYWN0aW9uKCk7CiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgdGhpcy5zY3JvbGxUYWJJbnRvVmlldyh0YWJBcmcpOwogICAgICB9KTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgidGFiLXNlbGVjdCIsIHsKICAgICAgICBkZXRhaWw6IHsgdGFiOiB0YWJBcmcgfSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGNsb3NlVGFiKGUxMSwgdGFiMikgewogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIGlmICh0YWIyLm9uQ2xvc2UpIHsKICAgICAgICB0YWIyLm9uQ2xvc2UoKTsKICAgICAgfQogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJ0YWItY2xvc2UiLCB7CiAgICAgICAgZGV0YWlsOiB7IHRhYjogdGFiMiB9LAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgZmlyc3RVcGRhdGVkKCkgewogICAgICBpZiAodGhpcy50YWJzICYmIHRoaXMudGFicy5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhpcy5zZWxlY3RUYWIodGhpcy50YWJzWzBdKTsKICAgICAgfQogICAgICB0aGlzLnNldHVwUmVzaXplT2JzZXJ2ZXIoKTsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbFN0YXRlKCk7CiAgICAgIH0pOwogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGlmICh0aGlzLnJlc2l6ZU9ic2VydmVyKSB7CiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIHNldHVwUmVzaXplT2JzZXJ2ZXIoKSB7CiAgICAgIGlmICh0aGlzLnRhYlN0eWxlICE9PSAiaG9yaXpvbnRhbCIpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHsKICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbFN0YXRlKCk7CiAgICAgIH0pOwogICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi50YWJzQ29udGFpbmVyLmhvcml6b250YWwiKTsKICAgICAgaWYgKGNvbnRhaW5lcikgewogICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShjb250YWluZXIpOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVTY3JvbGwgPSAoKSA9PiB7CiAgICAgIHRoaXMudXBkYXRlU2Nyb2xsU3RhdGUoKTsKICAgIH07CiAgICB1cGRhdGVTY3JvbGxTdGF0ZSgpIHsKICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIudGFic0NvbnRhaW5lci5ob3Jpem9udGFsIik7CiAgICAgIGlmICghY29udGFpbmVyKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IGNvbnRhaW5lci5zY3JvbGxMZWZ0OwogICAgICBjb25zdCBzY3JvbGxXaWR0aCA9IGNvbnRhaW5lci5zY3JvbGxXaWR0aDsKICAgICAgY29uc3QgY2xpZW50V2lkdGggPSBjb250YWluZXIuY2xpZW50V2lkdGg7CiAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDI7CiAgICAgIHRoaXMuY2FuU2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQgPiB0aHJlc2hvbGQ7CiAgICAgIHRoaXMuY2FuU2Nyb2xsUmlnaHQgPSBzY3JvbGxMZWZ0IDwgc2Nyb2xsV2lkdGggLSBjbGllbnRXaWR0aCAtIHRocmVzaG9sZDsKICAgIH0KICAgIHNjcm9sbFRhYkludG9WaWV3KHRhYjIpIHsKICAgICAgaWYgKHRoaXMudGFiU3R5bGUgIT09ICJob3Jpem9udGFsIikKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHRhYkluZGV4ID0gdGhpcy50YWJzLmluZGV4T2YodGFiMik7CiAgICAgIGlmICh0YWJJbmRleCA9PT0gLTEpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi50YWJzQ29udGFpbmVyLmhvcml6b250YWwiKTsKICAgICAgY29uc3QgdGFiRWxlbWVudCA9IGNvbnRhaW5lcj8ucXVlcnlTZWxlY3RvcihgLnRhYjpudGgtY2hpbGQoJHt0YWJJbmRleCArIDF9KWApOwogICAgICBpZiAodGFiRWxlbWVudCAmJiBjb250YWluZXIpIHsKICAgICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGNvbnN0IHRhYlJlY3QgPSB0YWJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGNvbnN0IGlzRnVsbHlWaXNpYmxlID0gdGFiUmVjdC5sZWZ0ID49IGNvbnRhaW5lclJlY3QubGVmdCAmJiB0YWJSZWN0LnJpZ2h0IDw9IGNvbnRhaW5lclJlY3QucmlnaHQ7CiAgICAgICAgaWYgKCFpc0Z1bGx5VmlzaWJsZSkgewogICAgICAgICAgdGFiRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAic21vb3RoIiwgYmxvY2s6ICJuZWFyZXN0IiwgaW5saW5lOiAibmVhcmVzdCIgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBhc3luYyB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJ0YWJzIikgJiYgdGhpcy50YWJzICYmIHRoaXMudGFicy5sZW5ndGggPiAwICYmICF0aGlzLnNlbGVjdGVkVGFiKSB7CiAgICAgICAgdGhpcy5zZWxlY3RUYWIodGhpcy50YWJzWzBdKTsKICAgICAgfQogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJzZWxlY3RlZFRhYiIpIHx8IGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygidGFicyIpKSB7CiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgICBpZiAoIXRoaXMuaW5kaWNhdG9ySW5pdGlhbGl6ZWQgJiYgZG9jdW1lbnQuZm9udHMpIHsKICAgICAgICAgIGF3YWl0IGRvY3VtZW50LmZvbnRzLnJlYWR5OwogICAgICAgIH0KICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgICAgdGhpcy51cGRhdGVUYWJJbmRpY2F0b3IoKTsKICAgICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsU3RhdGUoKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgaW5kaWNhdG9ySW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgIHVwZGF0ZVRhYkluZGljYXRvcigpIHsKICAgICAgaWYgKCF0aGlzLnNob3VsZFNob3dJbmRpY2F0b3IoKSkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHNlbGVjdGVkVGFiRWxlbWVudCA9IHRoaXMuZ2V0U2VsZWN0ZWRUYWJFbGVtZW50KCk7CiAgICAgIGlmICghc2VsZWN0ZWRUYWJFbGVtZW50KQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgaW5kaWNhdG9yID0gdGhpcy5nZXRJbmRpY2F0b3JFbGVtZW50KCk7CiAgICAgIGlmICghaW5kaWNhdG9yKQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5oYW5kbGVJbml0aWFsVHJhbnNpdGlvbihpbmRpY2F0b3IpOwogICAgICBpZiAodGhpcy50YWJTdHlsZSA9PT0gImhvcml6b250YWwiKSB7CiAgICAgICAgdGhpcy51cGRhdGVIb3Jpem9udGFsSW5kaWNhdG9yKGluZGljYXRvciwgc2VsZWN0ZWRUYWJFbGVtZW50KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnVwZGF0ZVZlcnRpY2FsSW5kaWNhdG9yKGluZGljYXRvciwgc2VsZWN0ZWRUYWJFbGVtZW50KTsKICAgICAgfQogICAgICBpbmRpY2F0b3Iuc3R5bGUub3BhY2l0eSA9ICIxIjsKICAgIH0KICAgIHNob3VsZFNob3dJbmRpY2F0b3IoKSB7CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVGFiICYmIHRoaXMuc2hvd1RhYkluZGljYXRvciAmJiB0aGlzLnRhYnMuaW5jbHVkZXModGhpcy5zZWxlY3RlZFRhYik7CiAgICB9CiAgICBnZXRTZWxlY3RlZFRhYkVsZW1lbnQoKSB7CiAgICAgIGNvbnN0IHNlbGVjdGVkSW5kZXggPSB0aGlzLnRhYnMuaW5kZXhPZih0aGlzLnNlbGVjdGVkVGFiKTsKICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gdGhpcy50YWJTdHlsZSA9PT0gImhvcml6b250YWwiOwogICAgICBjb25zdCBzZWxlY3RvciA9IGlzSG9yaXpvbnRhbCA/IGAudGFicy13cmFwcGVyIC50YWJzQ29udGFpbmVyIC50YWI6bnRoLWNoaWxkKCR7c2VsZWN0ZWRJbmRleCArIDF9KWAgOiBgLnZlcnRpY2FsLXdyYXBwZXIgLnRhYnNDb250YWluZXIgLnRhYjpudGgtY2hpbGQoJHtzZWxlY3RlZEluZGV4ICsgMX0pYDsKICAgICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIH0KICAgIGdldEluZGljYXRvckVsZW1lbnQoKSB7CiAgICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLnRhYkluZGljYXRvciIpOwogICAgfQogICAgaGFuZGxlSW5pdGlhbFRyYW5zaXRpb24oaW5kaWNhdG9yKSB7CiAgICAgIGlmICghdGhpcy5pbmRpY2F0b3JJbml0aWFsaXplZCkgewogICAgICAgIGluZGljYXRvci5jbGFzc0xpc3QuYWRkKCJuby10cmFuc2l0aW9uIik7CiAgICAgICAgdGhpcy5pbmRpY2F0b3JJbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICBpbmRpY2F0b3IuY2xhc3NMaXN0LnJlbW92ZSgibm8tdHJhbnNpdGlvbiIpOwogICAgICAgIH0sIDUwKTsKICAgICAgfQogICAgfQogICAgdXBkYXRlSG9yaXpvbnRhbEluZGljYXRvcihpbmRpY2F0b3IsIHRhYkVsZW1lbnQpIHsKICAgICAgY29uc3QgdGFiQ29udGVudCA9IHRhYkVsZW1lbnQucXVlcnlTZWxlY3RvcigiLnRhYi1jb250ZW50Iik7CiAgICAgIGlmICghdGFiQ29udGVudCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHdyYXBwZXJSZWN0ID0gaW5kaWNhdG9yLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IGNvbnRlbnRSZWN0ID0gdGFiQ29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgY29udGVudExlZnQgPSBjb250ZW50UmVjdC5sZWZ0IC0gd3JhcHBlclJlY3QubGVmdDsKICAgICAgY29uc3QgaW5kaWNhdG9yV2lkdGggPSBjb250ZW50UmVjdC53aWR0aCArIDg7CiAgICAgIGNvbnN0IGluZGljYXRvckxlZnQgPSBjb250ZW50TGVmdCAtIDQ7CiAgICAgIGluZGljYXRvci5zdHlsZS53aWR0aCA9IGAke2luZGljYXRvcldpZHRofXB4YDsKICAgICAgaW5kaWNhdG9yLnN0eWxlLmxlZnQgPSBgJHtpbmRpY2F0b3JMZWZ0fXB4YDsKICAgIH0KICAgIHVwZGF0ZVZlcnRpY2FsSW5kaWNhdG9yKGluZGljYXRvciwgdGFiRWxlbWVudCkgewogICAgICBjb25zdCB0YWJzQ29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi52ZXJ0aWNhbC13cmFwcGVyIC50YWJzQ29udGFpbmVyIik7CiAgICAgIGlmICghdGFic0NvbnRhaW5lcikKICAgICAgICByZXR1cm47CiAgICAgIGluZGljYXRvci5zdHlsZS50b3AgPSBgJHt0YWJFbGVtZW50Lm9mZnNldFRvcCArIHRhYnNDb250YWluZXIub2Zmc2V0VG9wfXB4YDsKICAgICAgaW5kaWNhdG9yLnN0eWxlLmhlaWdodCA9IGAke3RhYkVsZW1lbnQuY2xpZW50SGVpZ2h0fXB4YDsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNDEoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNBcHB1aVRhYnMyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1hcHB1aS9kZWVzLWFwcHVpLW1haW5jb250ZW50L2RlZXMtYXBwdWktbWFpbmNvbnRlbnQuanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF9kaXN0X3RzMjUoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlNDEgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczQyID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzQXBwdWlNYWluY29udGVudCA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtYXBwdWktbWFpbmNvbnRlbnQiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF90YWJzX2RlY29yYXRvcnM7CiAgbGV0IF90YWJzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGFic19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRUYWJfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkVGFiX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRUYWJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dUYWJzX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93VGFic19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dUYWJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90YWJzQXV0b0hpZGVfZGVjb3JhdG9yczsKICBsZXQgX3RhYnNBdXRvSGlkZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RhYnNBdXRvSGlkZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGFic0F1dG9IaWRlVGhyZXNob2xkX2RlY29yYXRvcnM7CiAgbGV0IF90YWJzQXV0b0hpZGVUaHJlc2hvbGRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90YWJzQXV0b0hpZGVUaHJlc2hvbGRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0FwcHVpTWFpbmNvbnRlbnQyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfdGFic19kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBBcnJheQogICAgICB9KV07CiAgICAgIF9zZWxlY3RlZFRhYl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogT2JqZWN0IH0pXTsKICAgICAgX3Nob3dUYWJzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3RhYnNBdXRvSGlkZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF90YWJzQXV0b0hpZGVUaHJlc2hvbGRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTQxKHRoaXMsIG51bGwsIF90YWJzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRhYnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRhYnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudGFicywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGFicyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90YWJzX2luaXRpYWxpemVycywgX3RhYnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0MSh0aGlzLCBudWxsLCBfc2VsZWN0ZWRUYWJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0ZWRUYWIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlbGVjdGVkVGFiIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGVkVGFiLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3RlZFRhYiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWxlY3RlZFRhYl9pbml0aWFsaXplcnMsIF9zZWxlY3RlZFRhYl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQxKHRoaXMsIG51bGwsIF9zaG93VGFic19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93VGFicyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd1RhYnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2hvd1RhYnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dUYWJzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dUYWJzX2luaXRpYWxpemVycywgX3Nob3dUYWJzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDEodGhpcywgbnVsbCwgX3RhYnNBdXRvSGlkZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0YWJzQXV0b0hpZGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRhYnNBdXRvSGlkZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50YWJzQXV0b0hpZGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnRhYnNBdXRvSGlkZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90YWJzQXV0b0hpZGVfaW5pdGlhbGl6ZXJzLCBfdGFic0F1dG9IaWRlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDEodGhpcywgbnVsbCwgX3RhYnNBdXRvSGlkZVRocmVzaG9sZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0YWJzQXV0b0hpZGVUaHJlc2hvbGQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRhYnNBdXRvSGlkZVRocmVzaG9sZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50YWJzQXV0b0hpZGVUaHJlc2hvbGQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnRhYnNBdXRvSGlkZVRocmVzaG9sZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90YWJzQXV0b0hpZGVUaHJlc2hvbGRfaW5pdGlhbGl6ZXJzLCBfdGFic0F1dG9IaWRlVGhyZXNob2xkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDEobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzQXBwdWlNYWluY29udGVudDIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSAoKSA9PiBiMmAKICAgIDxkZWVzLWFwcHVpLW1haW5jb250ZW50CiAgICAgIC50YWJzPSR7WwogICAgICB7IGtleTogIk92ZXJ2aWV3IiwgaWNvbk5hbWU6ICJsdWNpZGU6aG9tZSIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIk92ZXJ2aWV3IikgfSwKICAgICAgeyBrZXk6ICJEZXRhaWxzIiwgaWNvbk5hbWU6ICJsdWNpZGU6ZmlsZSIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIkRldGFpbHMiKSB9LAogICAgICB7IGtleTogIlNldHRpbmdzIiwgaWNvbk5hbWU6ICJsdWNpZGU6c2V0dGluZ3MiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJTZXR0aW5ncyIpIH0KICAgIF19CiAgICA+CiAgICAgIDxkaXYgc2xvdD0iY29udGVudCIgc3R5bGU9InBhZGRpbmc6IDQwcHg7IGNvbG9yOiAjY2NjOyI+CiAgICAgICAgPGgxPk1haW4gQ29udGVudCBBcmVhPC9oMT4KICAgICAgICA8cD5UaGlzIGlzIHdoZXJlIHlvdXIgYXBwbGljYXRpb24gY29udGVudCBnb2VzLjwvcD4KICAgICAgPC9kaXY+CiAgICA8L2RlZXMtYXBwdWktbWFpbmNvbnRlbnQ+CiAgYDsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJBcHAgVUkiXTsKICAgICN0YWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczQyKHRoaXMsIF90YWJzX2luaXRpYWxpemVycywgWwogICAgICB7IGtleTogIlx1MjZBMFx1RkUwRiBQbGVhc2Ugc2V0IHRhYnMiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUud2FybigiTm8gdGFicyBjb25maWd1cmVkIGZvciBtYWluY29udGVudCIpIH0KICAgIF0pOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCB0YWJzKCkgewogICAgICByZXR1cm4gdGhpcy4jdGFic19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRhYnModmFsdWUyKSB7CiAgICAgIHRoaXMuI3RhYnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWxlY3RlZFRhYl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDIodGhpcywgX3RhYnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQyKHRoaXMsIF9zZWxlY3RlZFRhYl9pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIGdldCBzZWxlY3RlZFRhYigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkVGFiX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0ZWRUYWIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlbGVjdGVkVGFiX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd1RhYnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQyKHRoaXMsIF9zZWxlY3RlZFRhYl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDIodGhpcywgX3Nob3dUYWJzX2luaXRpYWxpemVycywgdHJ1ZSkpOwogICAgZ2V0IHNob3dUYWJzKCkgewogICAgICByZXR1cm4gdGhpcy4jc2hvd1RhYnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93VGFicyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2hvd1RhYnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN0YWJzQXV0b0hpZGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQyKHRoaXMsIF9zaG93VGFic19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDIodGhpcywgX3RhYnNBdXRvSGlkZV9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgdGFic0F1dG9IaWRlKCkgewogICAgICByZXR1cm4gdGhpcy4jdGFic0F1dG9IaWRlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdGFic0F1dG9IaWRlKHZhbHVlMikgewogICAgICB0aGlzLiN0YWJzQXV0b0hpZGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN0YWJzQXV0b0hpZGVUaHJlc2hvbGRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQyKHRoaXMsIF90YWJzQXV0b0hpZGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQyKHRoaXMsIF90YWJzQXV0b0hpZGVUaHJlc2hvbGRfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgdGFic0F1dG9IaWRlVGhyZXNob2xkKCkgewogICAgICByZXR1cm4gdGhpcy4jdGFic0F1dG9IaWRlVGhyZXNob2xkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdGFic0F1dG9IaWRlVGhyZXNob2xkKHZhbHVlMikgewogICAgICB0aGlzLiN0YWJzQXV0b0hpZGVUaHJlc2hvbGRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMzMzIiwgIiNmZmYiKX07CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGF1dG8gMWZyOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMTYxNjE2Iil9OwogICAgICB9CgogICAgICAubWFpbmNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogY29udGVudHM7CiAgICAgIH0KCiAgICAgIC50b3BiYXIgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiAxZnI7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB0cmFuc2l0aW9uOiBncmlkLXRlbXBsYXRlLXJvd3MgMC4zcyBlYXNlOwogICAgICB9CgogICAgICAudG9wYmFyID4gKiB7CiAgICAgICAgbWluLWhlaWdodDogMDsKICAgICAgfQoKICAgICAgLmNvbnRlbnQtYXJlYSB7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgbWluLWhlaWdodDogMDsKICAgICAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgICB9CgogICAgICA6aG9zdChbbm90YWJzXSkgLnRvcGJhciB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiAwZnI7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0ibWFpbmNvbnRhaW5lciI+CiAgICAgICAgPGRpdiBjbGFzcz0idG9wYmFyIj4KICAgICAgICAgIDxkZWVzLWFwcHVpLXRhYnMKICAgICAgICAgICAgLnRhYnM9JHt0aGlzLnRhYnN9CiAgICAgICAgICAgIC5zZWxlY3RlZFRhYj0ke3RoaXMuc2VsZWN0ZWRUYWJ9CiAgICAgICAgICAgIC5zaG93VGFiSW5kaWNhdG9yPSR7dHJ1ZX0KICAgICAgICAgICAgLnRhYlN0eWxlPSR7Imhvcml6b250YWwifQogICAgICAgICAgICAuYXV0b0hpZGU9JHt0aGlzLnRhYnNBdXRvSGlkZX0KICAgICAgICAgICAgLmF1dG9IaWRlVGhyZXNob2xkPSR7dGhpcy50YWJzQXV0b0hpZGVUaHJlc2hvbGR9CiAgICAgICAgICAgIEB0YWItc2VsZWN0PSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVUYWJTZWxlY3QoZTExKX0KICAgICAgICAgICAgQHRhYi1jbG9zZT0keyhlMTEpID0+IHRoaXMuaGFuZGxlVGFiQ2xvc2UoZTExKX0KICAgICAgICAgID48L2RlZXMtYXBwdWktdGFicz4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50LWFyZWEiPgogICAgICAgICAgPHNsb3Q+PC9zbG90PgogICAgICAgICAgPHNsb3QgbmFtZT0iY29udGVudCI+PC9zbG90PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBoYW5kbGVUYWJTZWxlY3QoZTExKSB7CiAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSBlMTEuZGV0YWlsLnRhYjsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgidGFiLXNlbGVjdCIsIHsKICAgICAgICBkZXRhaWw6IGUxMS5kZXRhaWwsCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBoYW5kbGVUYWJDbG9zZShlMTEpIHsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgidGFiLWNsb3NlIiwgewogICAgICAgIGRldGFpbDogZTExLmRldGFpbCwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoInNob3dUYWJzIikpIHsKICAgICAgICBpZiAodGhpcy5zaG93VGFicykgewogICAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoIm5vdGFicyIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgibm90YWJzIiwgIiIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcykgewogICAgICBhd2FpdCBzdXBlci5maXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgaWYgKCF0aGlzLnNob3dUYWJzKSB7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoIm5vdGFicyIsICIiKTsKICAgICAgfQogICAgICBjb25zdCB0YWJzQ29tcG9uZW50ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoImRlZXMtYXBwdWktdGFicyIpOwogICAgICBpZiAodGFic0NvbXBvbmVudCkgewogICAgICAgIGF3YWl0IHRhYnNDb21wb25lbnQudXBkYXRlQ29tcGxldGU7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczQyKHRoaXMsIF90YWJzQXV0b0hpZGVUaHJlc2hvbGRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM0MihfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0FwcHVpTWFpbmNvbnRlbnQyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1hcHB1aS9kZWVzLWFwcHVpL2RlZXMtYXBwdWkuanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF9kaXN0X3RzMjUoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlNDIgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczQzID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzQXBwdWkgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLWFwcHVpIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfYXBwYmFyTWVudUl0ZW1zX2RlY29yYXRvcnM7CiAgbGV0IF9hcHBiYXJNZW51SXRlbXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hcHBiYXJNZW51SXRlbXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FwcGJhckJyZWFkY3J1bWJzX2RlY29yYXRvcnM7CiAgbGV0IF9hcHBiYXJCcmVhZGNydW1ic19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FwcGJhckJyZWFkY3J1bWJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hcHBiYXJCcmVhZGNydW1iU2VwYXJhdG9yX2RlY29yYXRvcnM7CiAgbGV0IF9hcHBiYXJCcmVhZGNydW1iU2VwYXJhdG9yX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYXBwYmFyQnJlYWRjcnVtYlNlcGFyYXRvcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYXBwYmFyU2hvd1dpbmRvd0NvbnRyb2xzX2RlY29yYXRvcnM7CiAgbGV0IF9hcHBiYXJTaG93V2luZG93Q29udHJvbHNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hcHBiYXJTaG93V2luZG93Q29udHJvbHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FwcGJhclVzZXJfZGVjb3JhdG9yczsKICBsZXQgX2FwcGJhclVzZXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hcHBiYXJVc2VyX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hcHBiYXJQcm9maWxlTWVudUl0ZW1zX2RlY29yYXRvcnM7CiAgbGV0IF9hcHBiYXJQcm9maWxlTWVudUl0ZW1zX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYXBwYmFyUHJvZmlsZU1lbnVJdGVtc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYXBwYmFyU2hvd1NlYXJjaF9kZWNvcmF0b3JzOwogIGxldCBfYXBwYmFyU2hvd1NlYXJjaF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FwcGJhclNob3dTZWFyY2hfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21haW5tZW51TG9nb0ljb25fZGVjb3JhdG9yczsKICBsZXQgX21haW5tZW51TG9nb0ljb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYWlubWVudUxvZ29JY29uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYWlubWVudUxvZ29UZXh0X2RlY29yYXRvcnM7CiAgbGV0IF9tYWlubWVudUxvZ29UZXh0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbm1lbnVMb2dvVGV4dF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbm1lbnVHcm91cHNfZGVjb3JhdG9yczsKICBsZXQgX21haW5tZW51R3JvdXBzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbm1lbnVHcm91cHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21haW5tZW51Qm90dG9tVGFic19kZWNvcmF0b3JzOwogIGxldCBfbWFpbm1lbnVCb3R0b21UYWJzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbm1lbnVCb3R0b21UYWJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYWlubWVudVRhYnNfZGVjb3JhdG9yczsKICBsZXQgX21haW5tZW51VGFic19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21haW5tZW51VGFic19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbm1lbnVTZWxlY3RlZFRhYl9kZWNvcmF0b3JzOwogIGxldCBfbWFpbm1lbnVTZWxlY3RlZFRhYl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21haW5tZW51U2VsZWN0ZWRUYWJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlY29uZGFyeW1lbnVIZWFkaW5nX2RlY29yYXRvcnM7CiAgbGV0IF9zZWNvbmRhcnltZW51SGVhZGluZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlY29uZGFyeW1lbnVIZWFkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWNvbmRhcnltZW51R3JvdXBzX2RlY29yYXRvcnM7CiAgbGV0IF9zZWNvbmRhcnltZW51R3JvdXBzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2Vjb25kYXJ5bWVudUdyb3Vwc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2Vjb25kYXJ5bWVudVNlbGVjdGVkSXRlbV9kZWNvcmF0b3JzOwogIGxldCBfc2Vjb25kYXJ5bWVudVNlbGVjdGVkSXRlbV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlY29uZGFyeW1lbnVTZWxlY3RlZEl0ZW1fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21haW5tZW51Q29sbGFwc2VkX2RlY29yYXRvcnM7CiAgbGV0IF9tYWlubWVudUNvbGxhcHNlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21haW5tZW51Q29sbGFwc2VkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWNvbmRhcnltZW51Q29sbGFwc2VkX2RlY29yYXRvcnM7CiAgbGV0IF9zZWNvbmRhcnltZW51Q29sbGFwc2VkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2Vjb25kYXJ5bWVudUNvbGxhcHNlZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbm1lbnVWaXNpYmxlX2RlY29yYXRvcnM7CiAgbGV0IF9tYWlubWVudVZpc2libGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYWlubWVudVZpc2libGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlY29uZGFyeW1lbnVWaXNpYmxlX2RlY29yYXRvcnM7CiAgbGV0IF9zZWNvbmRhcnltZW51VmlzaWJsZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlY29uZGFyeW1lbnVWaXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYWluY29udGVudFRhYnNWaXNpYmxlX2RlY29yYXRvcnM7CiAgbGV0IF9tYWluY29udGVudFRhYnNWaXNpYmxlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbmNvbnRlbnRUYWJzVmlzaWJsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29udGVudFRhYnNBdXRvSGlkZV9kZWNvcmF0b3JzOwogIGxldCBfY29udGVudFRhYnNBdXRvSGlkZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRlbnRUYWJzQXV0b0hpZGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRlbnRUYWJzQXV0b0hpZGVUaHJlc2hvbGRfZGVjb3JhdG9yczsKICBsZXQgX2NvbnRlbnRUYWJzQXV0b0hpZGVUaHJlc2hvbGRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZW50VGFic0F1dG9IaWRlVGhyZXNob2xkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY3Rpdml0eUxvZ1Zpc2libGVfZGVjb3JhdG9yczsKICBsZXQgX2FjdGl2aXR5TG9nVmlzaWJsZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FjdGl2aXR5TG9nVmlzaWJsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWN0aXZpdHlMb2dDb3VudF9kZWNvcmF0b3JzOwogIGxldCBfYWN0aXZpdHlMb2dDb3VudF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FjdGl2aXR5TG9nQ291bnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21haW5jb250ZW50VGFic19kZWNvcmF0b3JzOwogIGxldCBfbWFpbmNvbnRlbnRUYWJzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbmNvbnRlbnRUYWJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYWluY29udGVudFNlbGVjdGVkVGFiX2RlY29yYXRvcnM7CiAgbGV0IF9tYWluY29udGVudFNlbGVjdGVkVGFiX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbmNvbnRlbnRTZWxlY3RlZFRhYl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYXBwYmFyX2RlY29yYXRvcnM7CiAgbGV0IF9hcHBiYXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hcHBiYXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21haW5tZW51X2RlY29yYXRvcnM7CiAgbGV0IF9tYWlubWVudV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21haW5tZW51X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWNvbmRhcnltZW51X2RlY29yYXRvcnM7CiAgbGV0IF9zZWNvbmRhcnltZW51X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2Vjb25kYXJ5bWVudV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbmNvbnRlbnRfZGVjb3JhdG9yczsKICBsZXQgX21haW5jb250ZW50X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbmNvbnRlbnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FjdGl2aXR5bG9nRWxlbWVudF9kZWNvcmF0b3JzOwogIGxldCBfYWN0aXZpdHlsb2dFbGVtZW50X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWN0aXZpdHlsb2dFbGVtZW50X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ib3R0b21iYXJFbGVtZW50X2RlY29yYXRvcnM7CiAgbGV0IF9ib3R0b21iYXJFbGVtZW50X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYm90dG9tYmFyRWxlbWVudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYm90dG9tYmFyVmlzaWJsZV9kZWNvcmF0b3JzOwogIGxldCBfYm90dG9tYmFyVmlzaWJsZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2JvdHRvbWJhclZpc2libGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2N1cnJlbnRWaWV3X2RlY29yYXRvcnM7CiAgbGV0IF9jdXJyZW50Vmlld19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2N1cnJlbnRWaWV3X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNBcHB1aTIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9hcHBiYXJNZW51SXRlbXNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX2FwcGJhckJyZWFkY3J1bWJzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfYXBwYmFyQnJlYWRjcnVtYlNlcGFyYXRvcl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2FwcGJhclNob3dXaW5kb3dDb250cm9sc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9hcHBiYXJVc2VyX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBPYmplY3QgfSldOwogICAgICBfYXBwYmFyUHJvZmlsZU1lbnVJdGVtc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfYXBwYmFyU2hvd1NlYXJjaF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9tYWlubWVudUxvZ29JY29uX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfbWFpbm1lbnVMb2dvVGV4dF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX21haW5tZW51R3JvdXBzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF9tYWlubWVudUJvdHRvbVRhYnNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX21haW5tZW51VGFic19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfbWFpbm1lbnVTZWxlY3RlZFRhYl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogT2JqZWN0IH0pXTsKICAgICAgX3NlY29uZGFyeW1lbnVIZWFkaW5nX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfc2Vjb25kYXJ5bWVudUdyb3Vwc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfc2Vjb25kYXJ5bWVudVNlbGVjdGVkSXRlbV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogT2JqZWN0IH0pXTsKICAgICAgX21haW5tZW51Q29sbGFwc2VkX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3NlY29uZGFyeW1lbnVDb2xsYXBzZWRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfbWFpbm1lbnVWaXNpYmxlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3NlY29uZGFyeW1lbnVWaXNpYmxlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX21haW5jb250ZW50VGFic1Zpc2libGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfY29udGVudFRhYnNBdXRvSGlkZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9jb250ZW50VGFic0F1dG9IaWRlVGhyZXNob2xkX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfYWN0aXZpdHlMb2dWaXNpYmxlX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9hY3Rpdml0eUxvZ0NvdW50X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9tYWluY29udGVudFRhYnNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX21haW5jb250ZW50U2VsZWN0ZWRUYWJfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF9hcHBiYXJfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX21haW5tZW51X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9zZWNvbmRhcnltZW51X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9tYWluY29udGVudF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfYWN0aXZpdHlsb2dFbGVtZW50X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9ib3R0b21iYXJFbGVtZW50X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9ib3R0b21iYXJWaXNpYmxlX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9jdXJyZW50Vmlld19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGU0Mih0aGlzLCBudWxsLCBfYXBwYmFyTWVudUl0ZW1zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFwcGJhck1lbnVJdGVtcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYXBwYmFyTWVudUl0ZW1zIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmFwcGJhck1lbnVJdGVtcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYXBwYmFyTWVudUl0ZW1zID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FwcGJhck1lbnVJdGVtc19pbml0aWFsaXplcnMsIF9hcHBiYXJNZW51SXRlbXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Mih0aGlzLCBudWxsLCBfYXBwYmFyQnJlYWRjcnVtYnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYXBwYmFyQnJlYWRjcnVtYnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFwcGJhckJyZWFkY3J1bWJzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmFwcGJhckJyZWFkY3J1bWJzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hcHBiYXJCcmVhZGNydW1icyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hcHBiYXJCcmVhZGNydW1ic19pbml0aWFsaXplcnMsIF9hcHBiYXJCcmVhZGNydW1ic19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQyKHRoaXMsIG51bGwsIF9hcHBiYXJCcmVhZGNydW1iU2VwYXJhdG9yX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFwcGJhckJyZWFkY3J1bWJTZXBhcmF0b3IiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFwcGJhckJyZWFkY3J1bWJTZXBhcmF0b3IiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYXBwYmFyQnJlYWRjcnVtYlNlcGFyYXRvciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYXBwYmFyQnJlYWRjcnVtYlNlcGFyYXRvciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hcHBiYXJCcmVhZGNydW1iU2VwYXJhdG9yX2luaXRpYWxpemVycywgX2FwcGJhckJyZWFkY3J1bWJTZXBhcmF0b3JfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Mih0aGlzLCBudWxsLCBfYXBwYmFyU2hvd1dpbmRvd0NvbnRyb2xzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFwcGJhclNob3dXaW5kb3dDb250cm9scyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYXBwYmFyU2hvd1dpbmRvd0NvbnRyb2xzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmFwcGJhclNob3dXaW5kb3dDb250cm9scywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYXBwYmFyU2hvd1dpbmRvd0NvbnRyb2xzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FwcGJhclNob3dXaW5kb3dDb250cm9sc19pbml0aWFsaXplcnMsIF9hcHBiYXJTaG93V2luZG93Q29udHJvbHNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Mih0aGlzLCBudWxsLCBfYXBwYmFyVXNlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhcHBiYXJVc2VyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhcHBiYXJVc2VyIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmFwcGJhclVzZXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFwcGJhclVzZXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYXBwYmFyVXNlcl9pbml0aWFsaXplcnMsIF9hcHBiYXJVc2VyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDIodGhpcywgbnVsbCwgX2FwcGJhclByb2ZpbGVNZW51SXRlbXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYXBwYmFyUHJvZmlsZU1lbnVJdGVtcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYXBwYmFyUHJvZmlsZU1lbnVJdGVtcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hcHBiYXJQcm9maWxlTWVudUl0ZW1zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hcHBiYXJQcm9maWxlTWVudUl0ZW1zID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FwcGJhclByb2ZpbGVNZW51SXRlbXNfaW5pdGlhbGl6ZXJzLCBfYXBwYmFyUHJvZmlsZU1lbnVJdGVtc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQyKHRoaXMsIG51bGwsIF9hcHBiYXJTaG93U2VhcmNoX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFwcGJhclNob3dTZWFyY2giLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFwcGJhclNob3dTZWFyY2giIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYXBwYmFyU2hvd1NlYXJjaCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYXBwYmFyU2hvd1NlYXJjaCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hcHBiYXJTaG93U2VhcmNoX2luaXRpYWxpemVycywgX2FwcGJhclNob3dTZWFyY2hfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Mih0aGlzLCBudWxsLCBfbWFpbm1lbnVMb2dvSWNvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtYWlubWVudUxvZ29JY29uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtYWlubWVudUxvZ29JY29uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1haW5tZW51TG9nb0ljb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1haW5tZW51TG9nb0ljb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWFpbm1lbnVMb2dvSWNvbl9pbml0aWFsaXplcnMsIF9tYWlubWVudUxvZ29JY29uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDIodGhpcywgbnVsbCwgX21haW5tZW51TG9nb1RleHRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWFpbm1lbnVMb2dvVGV4dCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWFpbm1lbnVMb2dvVGV4dCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYWlubWVudUxvZ29UZXh0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tYWlubWVudUxvZ29UZXh0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21haW5tZW51TG9nb1RleHRfaW5pdGlhbGl6ZXJzLCBfbWFpbm1lbnVMb2dvVGV4dF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQyKHRoaXMsIG51bGwsIF9tYWlubWVudUdyb3Vwc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtYWlubWVudUdyb3VwcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWFpbm1lbnVHcm91cHMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWFpbm1lbnVHcm91cHMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1haW5tZW51R3JvdXBzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21haW5tZW51R3JvdXBzX2luaXRpYWxpemVycywgX21haW5tZW51R3JvdXBzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDIodGhpcywgbnVsbCwgX21haW5tZW51Qm90dG9tVGFic19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtYWlubWVudUJvdHRvbVRhYnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1haW5tZW51Qm90dG9tVGFicyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYWlubWVudUJvdHRvbVRhYnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1haW5tZW51Qm90dG9tVGFicyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tYWlubWVudUJvdHRvbVRhYnNfaW5pdGlhbGl6ZXJzLCBfbWFpbm1lbnVCb3R0b21UYWJzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDIodGhpcywgbnVsbCwgX21haW5tZW51VGFic19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtYWlubWVudVRhYnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1haW5tZW51VGFicyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYWlubWVudVRhYnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1haW5tZW51VGFicyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tYWlubWVudVRhYnNfaW5pdGlhbGl6ZXJzLCBfbWFpbm1lbnVUYWJzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDIodGhpcywgbnVsbCwgX21haW5tZW51U2VsZWN0ZWRUYWJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWFpbm1lbnVTZWxlY3RlZFRhYiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWFpbm1lbnVTZWxlY3RlZFRhYiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYWlubWVudVNlbGVjdGVkVGFiLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tYWlubWVudVNlbGVjdGVkVGFiID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21haW5tZW51U2VsZWN0ZWRUYWJfaW5pdGlhbGl6ZXJzLCBfbWFpbm1lbnVTZWxlY3RlZFRhYl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQyKHRoaXMsIG51bGwsIF9zZWNvbmRhcnltZW51SGVhZGluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWNvbmRhcnltZW51SGVhZGluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2Vjb25kYXJ5bWVudUhlYWRpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2Vjb25kYXJ5bWVudUhlYWRpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlY29uZGFyeW1lbnVIZWFkaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlY29uZGFyeW1lbnVIZWFkaW5nX2luaXRpYWxpemVycywgX3NlY29uZGFyeW1lbnVIZWFkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDIodGhpcywgbnVsbCwgX3NlY29uZGFyeW1lbnVHcm91cHNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2Vjb25kYXJ5bWVudUdyb3VwcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2Vjb25kYXJ5bWVudUdyb3VwcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWNvbmRhcnltZW51R3JvdXBzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWNvbmRhcnltZW51R3JvdXBzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlY29uZGFyeW1lbnVHcm91cHNfaW5pdGlhbGl6ZXJzLCBfc2Vjb25kYXJ5bWVudUdyb3Vwc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQyKHRoaXMsIG51bGwsIF9zZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlY29uZGFyeW1lbnVTZWxlY3RlZEl0ZW0iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlY29uZGFyeW1lbnVTZWxlY3RlZEl0ZW0iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2Vjb25kYXJ5bWVudVNlbGVjdGVkSXRlbSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2Vjb25kYXJ5bWVudVNlbGVjdGVkSXRlbSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtX2luaXRpYWxpemVycywgX3NlY29uZGFyeW1lbnVTZWxlY3RlZEl0ZW1fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Mih0aGlzLCBudWxsLCBfbWFpbm1lbnVDb2xsYXBzZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWFpbm1lbnVDb2xsYXBzZWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1haW5tZW51Q29sbGFwc2VkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1haW5tZW51Q29sbGFwc2VkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tYWlubWVudUNvbGxhcHNlZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tYWlubWVudUNvbGxhcHNlZF9pbml0aWFsaXplcnMsIF9tYWlubWVudUNvbGxhcHNlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQyKHRoaXMsIG51bGwsIF9zZWNvbmRhcnltZW51Q29sbGFwc2VkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlY29uZGFyeW1lbnVDb2xsYXBzZWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlY29uZGFyeW1lbnVDb2xsYXBzZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2Vjb25kYXJ5bWVudUNvbGxhcHNlZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2Vjb25kYXJ5bWVudUNvbGxhcHNlZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWNvbmRhcnltZW51Q29sbGFwc2VkX2luaXRpYWxpemVycywgX3NlY29uZGFyeW1lbnVDb2xsYXBzZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Mih0aGlzLCBudWxsLCBfbWFpbm1lbnVWaXNpYmxlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1haW5tZW51VmlzaWJsZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWFpbm1lbnVWaXNpYmxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1haW5tZW51VmlzaWJsZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWFpbm1lbnVWaXNpYmxlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21haW5tZW51VmlzaWJsZV9pbml0aWFsaXplcnMsIF9tYWlubWVudVZpc2libGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Mih0aGlzLCBudWxsLCBfc2Vjb25kYXJ5bWVudVZpc2libGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2Vjb25kYXJ5bWVudVZpc2libGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlY29uZGFyeW1lbnVWaXNpYmxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlY29uZGFyeW1lbnVWaXNpYmxlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWNvbmRhcnltZW51VmlzaWJsZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWNvbmRhcnltZW51VmlzaWJsZV9pbml0aWFsaXplcnMsIF9zZWNvbmRhcnltZW51VmlzaWJsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQyKHRoaXMsIG51bGwsIF9tYWluY29udGVudFRhYnNWaXNpYmxlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1haW5jb250ZW50VGFic1Zpc2libGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1haW5jb250ZW50VGFic1Zpc2libGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWFpbmNvbnRlbnRUYWJzVmlzaWJsZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWFpbmNvbnRlbnRUYWJzVmlzaWJsZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tYWluY29udGVudFRhYnNWaXNpYmxlX2luaXRpYWxpemVycywgX21haW5jb250ZW50VGFic1Zpc2libGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Mih0aGlzLCBudWxsLCBfY29udGVudFRhYnNBdXRvSGlkZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb250ZW50VGFic0F1dG9IaWRlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb250ZW50VGFic0F1dG9IaWRlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNvbnRlbnRUYWJzQXV0b0hpZGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvbnRlbnRUYWJzQXV0b0hpZGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29udGVudFRhYnNBdXRvSGlkZV9pbml0aWFsaXplcnMsIF9jb250ZW50VGFic0F1dG9IaWRlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDIodGhpcywgbnVsbCwgX2NvbnRlbnRUYWJzQXV0b0hpZGVUaHJlc2hvbGRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29udGVudFRhYnNBdXRvSGlkZVRocmVzaG9sZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29udGVudFRhYnNBdXRvSGlkZVRocmVzaG9sZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jb250ZW50VGFic0F1dG9IaWRlVGhyZXNob2xkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jb250ZW50VGFic0F1dG9IaWRlVGhyZXNob2xkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbnRlbnRUYWJzQXV0b0hpZGVUaHJlc2hvbGRfaW5pdGlhbGl6ZXJzLCBfY29udGVudFRhYnNBdXRvSGlkZVRocmVzaG9sZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQyKHRoaXMsIG51bGwsIF9hY3Rpdml0eUxvZ1Zpc2libGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYWN0aXZpdHlMb2dWaXNpYmxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhY3Rpdml0eUxvZ1Zpc2libGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWN0aXZpdHlMb2dWaXNpYmxlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hY3Rpdml0eUxvZ1Zpc2libGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYWN0aXZpdHlMb2dWaXNpYmxlX2luaXRpYWxpemVycywgX2FjdGl2aXR5TG9nVmlzaWJsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQyKHRoaXMsIG51bGwsIF9hY3Rpdml0eUxvZ0NvdW50X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFjdGl2aXR5TG9nQ291bnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFjdGl2aXR5TG9nQ291bnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWN0aXZpdHlMb2dDb3VudCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYWN0aXZpdHlMb2dDb3VudCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hY3Rpdml0eUxvZ0NvdW50X2luaXRpYWxpemVycywgX2FjdGl2aXR5TG9nQ291bnRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Mih0aGlzLCBudWxsLCBfbWFpbmNvbnRlbnRUYWJzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1haW5jb250ZW50VGFicyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWFpbmNvbnRlbnRUYWJzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1haW5jb250ZW50VGFicywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWFpbmNvbnRlbnRUYWJzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21haW5jb250ZW50VGFic19pbml0aWFsaXplcnMsIF9tYWluY29udGVudFRhYnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Mih0aGlzLCBudWxsLCBfbWFpbmNvbnRlbnRTZWxlY3RlZFRhYl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtYWluY29udGVudFNlbGVjdGVkVGFiIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtYWluY29udGVudFNlbGVjdGVkVGFiIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1haW5jb250ZW50U2VsZWN0ZWRUYWIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1haW5jb250ZW50U2VsZWN0ZWRUYWIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWFpbmNvbnRlbnRTZWxlY3RlZFRhYl9pbml0aWFsaXplcnMsIF9tYWluY29udGVudFNlbGVjdGVkVGFiX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDIodGhpcywgbnVsbCwgX2FwcGJhcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhcHBiYXIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFwcGJhciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hcHBiYXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFwcGJhciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hcHBiYXJfaW5pdGlhbGl6ZXJzLCBfYXBwYmFyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDIodGhpcywgbnVsbCwgX21haW5tZW51X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1haW5tZW51Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtYWlubWVudSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYWlubWVudSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWFpbm1lbnUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWFpbm1lbnVfaW5pdGlhbGl6ZXJzLCBfbWFpbm1lbnVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Mih0aGlzLCBudWxsLCBfc2Vjb25kYXJ5bWVudV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWNvbmRhcnltZW51Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWNvbmRhcnltZW51IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlY29uZGFyeW1lbnUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlY29uZGFyeW1lbnUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2Vjb25kYXJ5bWVudV9pbml0aWFsaXplcnMsIF9zZWNvbmRhcnltZW51X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDIodGhpcywgbnVsbCwgX21haW5jb250ZW50X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1haW5jb250ZW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtYWluY29udGVudCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYWluY29udGVudCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWFpbmNvbnRlbnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWFpbmNvbnRlbnRfaW5pdGlhbGl6ZXJzLCBfbWFpbmNvbnRlbnRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Mih0aGlzLCBudWxsLCBfYWN0aXZpdHlsb2dFbGVtZW50X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFjdGl2aXR5bG9nRWxlbWVudCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYWN0aXZpdHlsb2dFbGVtZW50IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmFjdGl2aXR5bG9nRWxlbWVudCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYWN0aXZpdHlsb2dFbGVtZW50ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FjdGl2aXR5bG9nRWxlbWVudF9pbml0aWFsaXplcnMsIF9hY3Rpdml0eWxvZ0VsZW1lbnRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Mih0aGlzLCBudWxsLCBfYm90dG9tYmFyRWxlbWVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJib3R0b21iYXJFbGVtZW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJib3R0b21iYXJFbGVtZW50IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmJvdHRvbWJhckVsZW1lbnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmJvdHRvbWJhckVsZW1lbnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYm90dG9tYmFyRWxlbWVudF9pbml0aWFsaXplcnMsIF9ib3R0b21iYXJFbGVtZW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDIodGhpcywgbnVsbCwgX2JvdHRvbWJhclZpc2libGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYm90dG9tYmFyVmlzaWJsZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYm90dG9tYmFyVmlzaWJsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5ib3R0b21iYXJWaXNpYmxlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5ib3R0b21iYXJWaXNpYmxlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2JvdHRvbWJhclZpc2libGVfaW5pdGlhbGl6ZXJzLCBfYm90dG9tYmFyVmlzaWJsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQyKHRoaXMsIG51bGwsIF9jdXJyZW50Vmlld19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjdXJyZW50VmlldyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3VycmVudFZpZXciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3VycmVudFZpZXcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmN1cnJlbnRWaWV3ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2N1cnJlbnRWaWV3X2luaXRpYWxpemVycywgX2N1cnJlbnRWaWV3X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDIobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzQXBwdWkyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMyNzsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJBcHAgVUkiXTsKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUkVBQ1RJVkUgT0JTRVJWQUJMRVMgKFJ4SlMgU3ViamVjdHMpCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8qKiBPYnNlcnZhYmxlIHN0cmVhbSBvZiB2aWV3IGxpZmVjeWNsZSBldmVudHMgKi8KICAgIHZpZXdMaWZlY3ljbGUkID0gbmV3IGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cy5zbWFydHJ4LnJ4anMuU3ViamVjdCgpOwogICAgLyoqIE9ic2VydmFibGUgc3RyZWFtIG9mIHZpZXcgY2hhbmdlIGV2ZW50cyAqLwogICAgdmlld0NoYW5nZWQkID0gbmV3IGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cy5zbWFydHJ4LnJ4anMuU3ViamVjdCgpOwogICAgI2FwcGJhck1lbnVJdGVtc19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfYXBwYmFyTWVudUl0ZW1zX2luaXRpYWxpemVycywgW10pOwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBJTlRFUk5BTCBQUk9QRVJUSUVTIChQcm9wZXJ0aWVzIGZvciBjaGlsZCBjb21wb25lbnRzKQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcm9wZXJ0aWVzIGZvciBhcHBiYXIKICAgIGdldCBhcHBiYXJNZW51SXRlbXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhcHBiYXJNZW51SXRlbXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhcHBiYXJNZW51SXRlbXModmFsdWUyKSB7CiAgICAgIHRoaXMuI2FwcGJhck1lbnVJdGVtc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2FwcGJhckJyZWFkY3J1bWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfYXBwYmFyTWVudUl0ZW1zX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfYXBwYmFyQnJlYWRjcnVtYnNfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGFwcGJhckJyZWFkY3J1bWJzKCkgewogICAgICByZXR1cm4gdGhpcy4jYXBwYmFyQnJlYWRjcnVtYnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhcHBiYXJCcmVhZGNydW1icyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYXBwYmFyQnJlYWRjcnVtYnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhcHBiYXJCcmVhZGNydW1iU2VwYXJhdG9yX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfYXBwYmFyQnJlYWRjcnVtYnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9hcHBiYXJCcmVhZGNydW1iU2VwYXJhdG9yX2luaXRpYWxpemVycywgIiA+ICIpKTsKICAgIGdldCBhcHBiYXJCcmVhZGNydW1iU2VwYXJhdG9yKCkgewogICAgICByZXR1cm4gdGhpcy4jYXBwYmFyQnJlYWRjcnVtYlNlcGFyYXRvcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFwcGJhckJyZWFkY3J1bWJTZXBhcmF0b3IodmFsdWUyKSB7CiAgICAgIHRoaXMuI2FwcGJhckJyZWFkY3J1bWJTZXBhcmF0b3JfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhcHBiYXJTaG93V2luZG93Q29udHJvbHNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9hcHBiYXJCcmVhZGNydW1iU2VwYXJhdG9yX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfYXBwYmFyU2hvd1dpbmRvd0NvbnRyb2xzX2luaXRpYWxpemVycywgdHJ1ZSkpOwogICAgZ2V0IGFwcGJhclNob3dXaW5kb3dDb250cm9scygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FwcGJhclNob3dXaW5kb3dDb250cm9sc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFwcGJhclNob3dXaW5kb3dDb250cm9scyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYXBwYmFyU2hvd1dpbmRvd0NvbnRyb2xzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYXBwYmFyVXNlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX2FwcGJhclNob3dXaW5kb3dDb250cm9sc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX2FwcGJhclVzZXJfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBhcHBiYXJVc2VyKCkgewogICAgICByZXR1cm4gdGhpcy4jYXBwYmFyVXNlcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFwcGJhclVzZXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI2FwcGJhclVzZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhcHBiYXJQcm9maWxlTWVudUl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfYXBwYmFyVXNlcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX2FwcGJhclByb2ZpbGVNZW51SXRlbXNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IGFwcGJhclByb2ZpbGVNZW51SXRlbXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhcHBiYXJQcm9maWxlTWVudUl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYXBwYmFyUHJvZmlsZU1lbnVJdGVtcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYXBwYmFyUHJvZmlsZU1lbnVJdGVtc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2FwcGJhclNob3dTZWFyY2hfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9hcHBiYXJQcm9maWxlTWVudUl0ZW1zX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfYXBwYmFyU2hvd1NlYXJjaF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgYXBwYmFyU2hvd1NlYXJjaCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FwcGJhclNob3dTZWFyY2hfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhcHBiYXJTaG93U2VhcmNoKHZhbHVlMikgewogICAgICB0aGlzLiNhcHBiYXJTaG93U2VhcmNoX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWFpbm1lbnVMb2dvSWNvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX2FwcGJhclNob3dTZWFyY2hfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9tYWlubWVudUxvZ29JY29uX2luaXRpYWxpemVycywgIiIpKTsKICAgIC8vIFByb3BlcnRpZXMgZm9yIG1haW5tZW51CiAgICBnZXQgbWFpbm1lbnVMb2dvSWNvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI21haW5tZW51TG9nb0ljb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtYWlubWVudUxvZ29JY29uKHZhbHVlMikgewogICAgICB0aGlzLiNtYWlubWVudUxvZ29JY29uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWFpbm1lbnVMb2dvVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX21haW5tZW51TG9nb0ljb25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9tYWlubWVudUxvZ29UZXh0X2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBtYWlubWVudUxvZ29UZXh0KCkgewogICAgICByZXR1cm4gdGhpcy4jbWFpbm1lbnVMb2dvVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1haW5tZW51TG9nb1RleHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI21haW5tZW51TG9nb1RleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtYWlubWVudUdyb3Vwc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX21haW5tZW51TG9nb1RleHRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9tYWlubWVudUdyb3Vwc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgbWFpbm1lbnVHcm91cHMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtYWlubWVudUdyb3Vwc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1haW5tZW51R3JvdXBzKHZhbHVlMikgewogICAgICB0aGlzLiNtYWlubWVudUdyb3Vwc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21haW5tZW51Qm90dG9tVGFic19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX21haW5tZW51R3JvdXBzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfbWFpbm1lbnVCb3R0b21UYWJzX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBtYWlubWVudUJvdHRvbVRhYnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtYWlubWVudUJvdHRvbVRhYnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtYWlubWVudUJvdHRvbVRhYnModmFsdWUyKSB7CiAgICAgIHRoaXMuI21haW5tZW51Qm90dG9tVGFic19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21haW5tZW51VGFic19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX21haW5tZW51Qm90dG9tVGFic19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX21haW5tZW51VGFic19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgbWFpbm1lbnVUYWJzKCkgewogICAgICByZXR1cm4gdGhpcy4jbWFpbm1lbnVUYWJzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWFpbm1lbnVUYWJzKHZhbHVlMikgewogICAgICB0aGlzLiNtYWlubWVudVRhYnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtYWlubWVudVNlbGVjdGVkVGFiX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfbWFpbm1lbnVUYWJzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfbWFpbm1lbnVTZWxlY3RlZFRhYl9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgZ2V0IG1haW5tZW51U2VsZWN0ZWRUYWIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtYWlubWVudVNlbGVjdGVkVGFiX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWFpbm1lbnVTZWxlY3RlZFRhYih2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWFpbm1lbnVTZWxlY3RlZFRhYl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NlY29uZGFyeW1lbnVIZWFkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfbWFpbm1lbnVTZWxlY3RlZFRhYl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX3NlY29uZGFyeW1lbnVIZWFkaW5nX2luaXRpYWxpemVycywgIiIpKTsKICAgIC8vIFByb3BlcnRpZXMgZm9yIHNlY29uZGFyeW1lbnUKICAgIGdldCBzZWNvbmRhcnltZW51SGVhZGluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlY29uZGFyeW1lbnVIZWFkaW5nX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2Vjb25kYXJ5bWVudUhlYWRpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlY29uZGFyeW1lbnVIZWFkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2Vjb25kYXJ5bWVudUdyb3Vwc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX3NlY29uZGFyeW1lbnVIZWFkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfc2Vjb25kYXJ5bWVudUdyb3Vwc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgc2Vjb25kYXJ5bWVudUdyb3VwcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlY29uZGFyeW1lbnVHcm91cHNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWNvbmRhcnltZW51R3JvdXBzKHZhbHVlMikgewogICAgICB0aGlzLiNzZWNvbmRhcnltZW51R3JvdXBzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2Vjb25kYXJ5bWVudVNlbGVjdGVkSXRlbV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX3NlY29uZGFyeW1lbnVHcm91cHNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9zZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgc2Vjb25kYXJ5bWVudVNlbGVjdGVkSXRlbSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlY29uZGFyeW1lbnVTZWxlY3RlZEl0ZW1fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtKHZhbHVlMikgewogICAgICB0aGlzLiNzZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWFpbm1lbnVDb2xsYXBzZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9zZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfbWFpbm1lbnVDb2xsYXBzZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgLy8gQ29sbGFwc2Ugc3RhdGVzCiAgICBnZXQgbWFpbm1lbnVDb2xsYXBzZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtYWlubWVudUNvbGxhcHNlZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1haW5tZW51Q29sbGFwc2VkKHZhbHVlMikgewogICAgICB0aGlzLiNtYWlubWVudUNvbGxhcHNlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NlY29uZGFyeW1lbnVDb2xsYXBzZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9tYWlubWVudUNvbGxhcHNlZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX3NlY29uZGFyeW1lbnVDb2xsYXBzZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHNlY29uZGFyeW1lbnVDb2xsYXBzZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWNvbmRhcnltZW51Q29sbGFwc2VkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2Vjb25kYXJ5bWVudUNvbGxhcHNlZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2Vjb25kYXJ5bWVudUNvbGxhcHNlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21haW5tZW51VmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX3NlY29uZGFyeW1lbnVDb2xsYXBzZWRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9tYWlubWVudVZpc2libGVfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICAvLyBWaXNpYmlsaXR5IHN0YXRlcwogICAgZ2V0IG1haW5tZW51VmlzaWJsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21haW5tZW51VmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1haW5tZW51VmlzaWJsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWFpbm1lbnVWaXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2Vjb25kYXJ5bWVudVZpc2libGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9tYWlubWVudVZpc2libGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9zZWNvbmRhcnltZW51VmlzaWJsZV9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzZWNvbmRhcnltZW51VmlzaWJsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlY29uZGFyeW1lbnVWaXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2Vjb25kYXJ5bWVudVZpc2libGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlY29uZGFyeW1lbnVWaXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWFpbmNvbnRlbnRUYWJzVmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX3NlY29uZGFyeW1lbnVWaXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfbWFpbmNvbnRlbnRUYWJzVmlzaWJsZV9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBtYWluY29udGVudFRhYnNWaXNpYmxlKCkgewogICAgICByZXR1cm4gdGhpcy4jbWFpbmNvbnRlbnRUYWJzVmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1haW5jb250ZW50VGFic1Zpc2libGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI21haW5jb250ZW50VGFic1Zpc2libGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjb250ZW50VGFic0F1dG9IaWRlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfbWFpbmNvbnRlbnRUYWJzVmlzaWJsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX2NvbnRlbnRUYWJzQXV0b0hpZGVfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGNvbnRlbnRUYWJzQXV0b0hpZGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb250ZW50VGFic0F1dG9IaWRlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29udGVudFRhYnNBdXRvSGlkZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29udGVudFRhYnNBdXRvSGlkZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NvbnRlbnRUYWJzQXV0b0hpZGVUaHJlc2hvbGRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9jb250ZW50VGFic0F1dG9IaWRlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfY29udGVudFRhYnNBdXRvSGlkZVRocmVzaG9sZF9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBjb250ZW50VGFic0F1dG9IaWRlVGhyZXNob2xkKCkgewogICAgICByZXR1cm4gdGhpcy4jY29udGVudFRhYnNBdXRvSGlkZVRocmVzaG9sZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNvbnRlbnRUYWJzQXV0b0hpZGVUaHJlc2hvbGQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2NvbnRlbnRUYWJzQXV0b0hpZGVUaHJlc2hvbGRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhY3Rpdml0eUxvZ1Zpc2libGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9jb250ZW50VGFic0F1dG9IaWRlVGhyZXNob2xkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfYWN0aXZpdHlMb2dWaXNpYmxlX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIC8vIEFjdGl2aXR5IGxvZyB2aXNpYmlsaXR5IGFuZCBjb3VudAogICAgZ2V0IGFjdGl2aXR5TG9nVmlzaWJsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FjdGl2aXR5TG9nVmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFjdGl2aXR5TG9nVmlzaWJsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYWN0aXZpdHlMb2dWaXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYWN0aXZpdHlMb2dDb3VudF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX2FjdGl2aXR5TG9nVmlzaWJsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX2FjdGl2aXR5TG9nQ291bnRfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgYWN0aXZpdHlMb2dDb3VudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FjdGl2aXR5TG9nQ291bnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhY3Rpdml0eUxvZ0NvdW50KHZhbHVlMikgewogICAgICB0aGlzLiNhY3Rpdml0eUxvZ0NvdW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWFpbmNvbnRlbnRUYWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfYWN0aXZpdHlMb2dDb3VudF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX21haW5jb250ZW50VGFic19pbml0aWFsaXplcnMsIFtdKSk7CiAgICAvLyBQcm9wZXJ0aWVzIGZvciBtYWluY29udGVudAogICAgZ2V0IG1haW5jb250ZW50VGFicygpIHsKICAgICAgcmV0dXJuIHRoaXMuI21haW5jb250ZW50VGFic19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1haW5jb250ZW50VGFicyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWFpbmNvbnRlbnRUYWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWFpbmNvbnRlbnRTZWxlY3RlZFRhYl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX21haW5jb250ZW50VGFic19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX21haW5jb250ZW50U2VsZWN0ZWRUYWJfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBtYWluY29udGVudFNlbGVjdGVkVGFiKCkgewogICAgICByZXR1cm4gdGhpcy4jbWFpbmNvbnRlbnRTZWxlY3RlZFRhYl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1haW5jb250ZW50U2VsZWN0ZWRUYWIodmFsdWUyKSB7CiAgICAgIHRoaXMuI21haW5jb250ZW50U2VsZWN0ZWRUYWJfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhcHBiYXJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9tYWluY29udGVudFNlbGVjdGVkVGFiX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfYXBwYmFyX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICAvLyBSZWZlcmVuY2VzIHRvIGNoaWxkIGNvbXBvbmVudHMKICAgIGdldCBhcHBiYXIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhcHBiYXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhcHBiYXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI2FwcGJhcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21haW5tZW51X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfYXBwYmFyX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfbWFpbm1lbnVfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBtYWlubWVudSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21haW5tZW51X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWFpbm1lbnUodmFsdWUyKSB7CiAgICAgIHRoaXMuI21haW5tZW51X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2Vjb25kYXJ5bWVudV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX21haW5tZW51X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfc2Vjb25kYXJ5bWVudV9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgZ2V0IHNlY29uZGFyeW1lbnUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWNvbmRhcnltZW51X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2Vjb25kYXJ5bWVudSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2Vjb25kYXJ5bWVudV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21haW5jb250ZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfc2Vjb25kYXJ5bWVudV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX21haW5jb250ZW50X2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgbWFpbmNvbnRlbnQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtYWluY29udGVudF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1haW5jb250ZW50KHZhbHVlMikgewogICAgICB0aGlzLiNtYWluY29udGVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2FjdGl2aXR5bG9nRWxlbWVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX21haW5jb250ZW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfYWN0aXZpdHlsb2dFbGVtZW50X2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgYWN0aXZpdHlsb2dFbGVtZW50KCkgewogICAgICByZXR1cm4gdGhpcy4jYWN0aXZpdHlsb2dFbGVtZW50X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYWN0aXZpdHlsb2dFbGVtZW50KHZhbHVlMikgewogICAgICB0aGlzLiNhY3Rpdml0eWxvZ0VsZW1lbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNib3R0b21iYXJFbGVtZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfYWN0aXZpdHlsb2dFbGVtZW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfYm90dG9tYmFyRWxlbWVudF9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgZ2V0IGJvdHRvbWJhckVsZW1lbnQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNib3R0b21iYXJFbGVtZW50X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYm90dG9tYmFyRWxlbWVudCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYm90dG9tYmFyRWxlbWVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2JvdHRvbWJhclZpc2libGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9ib3R0b21iYXJFbGVtZW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfYm90dG9tYmFyVmlzaWJsZV9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBib3R0b21iYXJWaXNpYmxlKCkgewogICAgICByZXR1cm4gdGhpcy4jYm90dG9tYmFyVmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGJvdHRvbWJhclZpc2libGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2JvdHRvbWJhclZpc2libGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjdXJyZW50Vmlld19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX2JvdHRvbWJhclZpc2libGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9jdXJyZW50Vmlld19pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgLy8gQ3VycmVudCB2aWV3IHN0YXRlCiAgICBnZXQgY3VycmVudFZpZXcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjdXJyZW50Vmlld19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGN1cnJlbnRWaWV3KHZhbHVlMikgewogICAgICB0aGlzLiNjdXJyZW50Vmlld19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgLy8gSW50ZXJuYWwgc2VydmljZXMKICAgIHZpZXdSZWdpc3RyeSA9IChfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9jdXJyZW50Vmlld19leHRyYUluaXRpYWxpemVycyksIG5ldyBWaWV3UmVnaXN0cnkoKSk7CiAgICByb3V0ZXJDbGVhbnVwID0gbnVsbDsKICAgIHNlYXJjaENhbGxiYWNrID0gbnVsbDsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YwZjBmMCIsICIjMWExYTFhIil9OwogICAgICB9CiAgICAgIC5tYWluZ3JpZCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNDBweDsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDQwcHggLSAyNHB4KTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIC8qIGdyaWQtdGVtcGxhdGUtY29sdW1ucyBzZXQgZHluYW1pY2FsbHkgaW4gdGVtcGxhdGUgKi8KICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDFmcjsKICAgICAgICB0cmFuc2l0aW9uOiBncmlkLXRlbXBsYXRlLWNvbHVtbnMgMC4zcyBlYXNlLCBoZWlnaHQgMC4zcyBlYXNlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIDpob3N0KFtib3R0b21iYXItaGlkZGVuXSkgLm1haW5ncmlkIHsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDQwcHgpOwogICAgICB9CgogICAgICBkZWVzLWFwcHVpLWJvdHRvbWJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KCiAgICAgIC8qIFotaW5kZXggbGF5ZXJpbmcgZm9yIHByb3BlciBzdGFja2luZyAqLwogICAgICAubWFpbmdyaWQgPiBkZWVzLWFwcHVpLW1haW5tZW51IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgei1pbmRleDogMzsKICAgICAgfQoKICAgICAgLm1haW5ncmlkID4gZGVlcy1hcHB1aS1zZWNvbmRhcnltZW51IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgfQoKICAgICAgLm1haW5ncmlkID4gZGVlcy1hcHB1aS1tYWluY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgbWluLWhlaWdodDogMDsKICAgICAgfQoKICAgICAgLm1haW5ncmlkID4gZGVlcy1hcHB1aS1hY3Rpdml0eWxvZyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgZWFzZSwgdHJhbnNmb3JtIDAuM3MgZWFzZTsKICAgICAgfQoKICAgICAgLm1haW5ncmlkID4gZGVlcy1hcHB1aS1hY3Rpdml0eWxvZy5oaWRkZW4gewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDIwcHgpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAubWFpbmdyaWQgPiBkZWVzLWFwcHVpLWFjdGl2aXR5bG9nLnZpc2libGUgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOwogICAgICB9CgogICAgICAvKiBWaWV3IGNvbnRhaW5lciBmb3IgZHluYW1pY2FsbHkgbG9hZGVkIHZpZXdzICovCiAgICAgIC52aWV3LWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogY29udGVudHM7CiAgICAgIH0KCiAgICAgIC52aWV3LWNvbnRhaW5lcjplbXB0eSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGVlcy1hcHB1aS1hcHBiYXIKICAgICAgICAubWVudUl0ZW1zPSR7dGhpcy5hcHBiYXJNZW51SXRlbXN9CiAgICAgICAgLmJyZWFkY3J1bWJzPSR7dGhpcy5hcHBiYXJCcmVhZGNydW1ic30KICAgICAgICAuYnJlYWRjcnVtYlNlcGFyYXRvcj0ke3RoaXMuYXBwYmFyQnJlYWRjcnVtYlNlcGFyYXRvcn0KICAgICAgICAuc2hvd1dpbmRvd0NvbnRyb2xzPSR7dGhpcy5hcHBiYXJTaG93V2luZG93Q29udHJvbHN9CiAgICAgICAgLnVzZXI9JHt0aGlzLmFwcGJhclVzZXJ9CiAgICAgICAgLnByb2ZpbGVNZW51SXRlbXM9JHt0aGlzLmFwcGJhclByb2ZpbGVNZW51SXRlbXN9CiAgICAgICAgLnNob3dTZWFyY2g9JHt0aGlzLmFwcGJhclNob3dTZWFyY2h9CiAgICAgICAgLnNob3dBY3Rpdml0eUxvZ1RvZ2dsZT0ke3RydWV9CiAgICAgICAgLmFjdGl2aXR5TG9nQ291bnQ9JHt0aGlzLmFjdGl2aXR5TG9nQ291bnR9CiAgICAgICAgLmFjdGl2aXR5TG9nQWN0aXZlPSR7dGhpcy5hY3Rpdml0eUxvZ1Zpc2libGV9CiAgICAgICAgQG1lbnUtc2VsZWN0PSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVBcHBiYXJNZW51U2VsZWN0KGUxMSl9CiAgICAgICAgQGJyZWFkY3J1bWItbmF2aWdhdGU9JHsoZTExKSA9PiB0aGlzLmhhbmRsZUFwcGJhckJyZWFkY3J1bWJOYXZpZ2F0ZShlMTEpfQogICAgICAgIEBzZWFyY2gtY2xpY2s9JHsoKSA9PiB0aGlzLmhhbmRsZUFwcGJhclNlYXJjaENsaWNrKCl9CiAgICAgICAgQHNlYXJjaC1xdWVyeT0keyhlMTEpID0+IHRoaXMuaGFuZGxlQXBwYmFyU2VhcmNoUXVlcnkoZTExKX0KICAgICAgICBAdXNlci1tZW51LW9wZW49JHsoKSA9PiB0aGlzLmhhbmRsZUFwcGJhclVzZXJNZW51T3BlbigpfQogICAgICAgIEBwcm9maWxlLW1lbnUtc2VsZWN0PSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVBcHBiYXJQcm9maWxlTWVudVNlbGVjdChlMTEpfQogICAgICAgIEBhY3Rpdml0eS10b2dnbGU9JHsoKSA9PiB0aGlzLnRvZ2dsZUFjdGl2aXR5TG9nKCl9CiAgICAgID48L2RlZXMtYXBwdWktYXBwYmFyPgogICAgICA8ZGl2IGNsYXNzPSJtYWluZ3JpZCIgc3R5bGU9ImdyaWQtdGVtcGxhdGUtY29sdW1uczogYXV0byBhdXRvIDFmciAke3RoaXMuYWN0aXZpdHlMb2dWaXNpYmxlID8gIjI4MHB4IiA6ICIwcHgifTsiPgogICAgICAgICR7dGhpcy5tYWlubWVudVZpc2libGUgPyBiMmAKICAgICAgICAgIDxkZWVzLWFwcHVpLW1haW5tZW51CiAgICAgICAgICAgIC5sb2dvSWNvbj0ke3RoaXMubWFpbm1lbnVMb2dvSWNvbn0KICAgICAgICAgICAgLmxvZ29UZXh0PSR7dGhpcy5tYWlubWVudUxvZ29UZXh0fQogICAgICAgICAgICAubWVudUdyb3Vwcz0ke3RoaXMubWFpbm1lbnVHcm91cHN9CiAgICAgICAgICAgIC5ib3R0b21UYWJzPSR7dGhpcy5tYWlubWVudUJvdHRvbVRhYnN9CiAgICAgICAgICAgIC50YWJzPSR7dGhpcy5tYWlubWVudVRhYnN9CiAgICAgICAgICAgIC5zZWxlY3RlZFRhYj0ke3RoaXMubWFpbm1lbnVTZWxlY3RlZFRhYn0KICAgICAgICAgICAgLmNvbGxhcHNlZD0ke3RoaXMubWFpbm1lbnVDb2xsYXBzZWR9CiAgICAgICAgICAgIEB0YWItc2VsZWN0PSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVNYWlubWVudVRhYlNlbGVjdChlMTEpfQogICAgICAgICAgICBAY29sbGFwc2UtY2hhbmdlPSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVNYWlubWVudUNvbGxhcHNlQ2hhbmdlKGUxMSl9CiAgICAgICAgICA+PC9kZWVzLWFwcHVpLW1haW5tZW51PgogICAgICAgIGAgOiAiIn0KICAgICAgICAke3RoaXMuc2Vjb25kYXJ5bWVudVZpc2libGUgPyBiMmAKICAgICAgICAgIDxkZWVzLWFwcHVpLXNlY29uZGFyeW1lbnUKICAgICAgICAgICAgLmhlYWRpbmc9JHt0aGlzLnNlY29uZGFyeW1lbnVIZWFkaW5nfQogICAgICAgICAgICAuZ3JvdXBzPSR7dGhpcy5zZWNvbmRhcnltZW51R3JvdXBzfQogICAgICAgICAgICAuc2VsZWN0ZWRJdGVtPSR7dGhpcy5zZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtfQogICAgICAgICAgICAuY29sbGFwc2VkPSR7dGhpcy5zZWNvbmRhcnltZW51Q29sbGFwc2VkfQogICAgICAgICAgICBAaXRlbS1zZWxlY3Q9JHsoZTExKSA9PiB0aGlzLmhhbmRsZVNlY29uZGFyeW1lbnVJdGVtU2VsZWN0KGUxMSl9CiAgICAgICAgICAgIEBjb2xsYXBzZS1jaGFuZ2U9JHsoZTExKSA9PiB0aGlzLmhhbmRsZVNlY29uZGFyeW1lbnVDb2xsYXBzZUNoYW5nZShlMTEpfQogICAgICAgICAgPjwvZGVlcy1hcHB1aS1zZWNvbmRhcnltZW51PgogICAgICAgIGAgOiAiIn0KICAgICAgICA8ZGVlcy1hcHB1aS1tYWluY29udGVudAogICAgICAgICAgLnRhYnM9JHt0aGlzLm1haW5jb250ZW50VGFic30KICAgICAgICAgIC5zZWxlY3RlZFRhYj0ke3RoaXMubWFpbmNvbnRlbnRTZWxlY3RlZFRhYn0KICAgICAgICAgIC5zaG93VGFicz0ke3RoaXMubWFpbmNvbnRlbnRUYWJzVmlzaWJsZX0KICAgICAgICAgIC50YWJzQXV0b0hpZGU9JHt0aGlzLmNvbnRlbnRUYWJzQXV0b0hpZGV9CiAgICAgICAgICAudGFic0F1dG9IaWRlVGhyZXNob2xkPSR7dGhpcy5jb250ZW50VGFic0F1dG9IaWRlVGhyZXNob2xkfQogICAgICAgICAgQHRhYi1zZWxlY3Q9JHsoZTExKSA9PiB0aGlzLmhhbmRsZUNvbnRlbnRUYWJTZWxlY3QoZTExKX0KICAgICAgICAgIEB0YWItY2xvc2U9JHsoZTExKSA9PiB0aGlzLmhhbmRsZUNvbnRlbnRUYWJDbG9zZShlMTEpfQogICAgICAgID4KICAgICAgICAgIDxkaXYgY2xhc3M9InZpZXctY29udGFpbmVyIj48L2Rpdj4KICAgICAgICAgIDxzbG90IG5hbWU9Im1haW5jb250ZW50Ij48L3Nsb3Q+CiAgICAgICAgPC9kZWVzLWFwcHVpLW1haW5jb250ZW50PgogICAgICAgIDxkZWVzLWFwcHVpLWFjdGl2aXR5bG9nCiAgICAgICAgICBjbGFzcz0iJHt0aGlzLmFjdGl2aXR5TG9nVmlzaWJsZSA/ICJ2aXNpYmxlIiA6ICJoaWRkZW4ifSIKICAgICAgICA+PC9kZWVzLWFwcHVpLWFjdGl2aXR5bG9nPgogICAgICA8L2Rpdj4KICAgICAgJHt0aGlzLmJvdHRvbWJhclZpc2libGUgPyBiMmAKICAgICAgICA8ZGVlcy1hcHB1aS1ib3R0b21iYXI+PC9kZWVzLWFwcHVpLWJvdHRvbWJhcj4KICAgICAgYCA6ICIifQogICAgYDsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZCgpIHsKICAgICAgdGhpcy5hcHBiYXIgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiZGVlcy1hcHB1aS1hcHBiYXIiKTsKICAgICAgdGhpcy5tYWlubWVudSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCJkZWVzLWFwcHVpLW1haW5tZW51Iik7CiAgICAgIHRoaXMuc2Vjb25kYXJ5bWVudSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCJkZWVzLWFwcHVpLXNlY29uZGFyeW1lbnUiKTsKICAgICAgdGhpcy5tYWluY29udGVudCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCJkZWVzLWFwcHVpLW1haW5jb250ZW50Iik7CiAgICAgIHRoaXMuYWN0aXZpdHlsb2dFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoImRlZXMtYXBwdWktYWN0aXZpdHlsb2ciKTsKICAgICAgdGhpcy5ib3R0b21iYXJFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoImRlZXMtYXBwdWktYm90dG9tYmFyIik7CiAgICAgIGlmICh0aGlzLmFjdGl2aXR5bG9nRWxlbWVudCkgewogICAgICAgIHRoaXMuYWN0aXZpdHlsb2dFbGVtZW50LmVudHJpZXMkLnN1YnNjcmliZSgoZW50cmllcykgPT4gewogICAgICAgICAgdGhpcy5hY3Rpdml0eUxvZ0NvdW50ID0gZW50cmllcy5sZW5ndGg7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgdGhpcy52aWV3UmVnaXN0cnkuc2V0QXBwdWlSZWYodGhpcyk7CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgaWYgKHRoaXMucm91dGVyQ2xlYW51cCkgewogICAgICAgIHRoaXMucm91dGVyQ2xlYW51cCgpOwogICAgICAgIHRoaXMucm91dGVyQ2xlYW51cCA9IG51bGw7CiAgICAgIH0KICAgICAgdGhpcy52aWV3TGlmZWN5Y2xlJC5jb21wbGV0ZSgpOwogICAgICB0aGlzLnZpZXdDaGFuZ2VkJC5jb21wbGV0ZSgpOwogICAgfQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQUk9HUkFNTUFUSUMgQVBJOiBBUFAgQkFSCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8qKgogICAgICogU2V0IHRoZSBhcHAgYmFyIG1lbnUgaXRlbXMgKEZpbGUsIEVkaXQsIFZpZXcsIGV0Yy4pCiAgICAgKi8KICAgIHNldEFwcEJhck1lbnVzKG1lbnVzKSB7CiAgICAgIHRoaXMuYXBwYmFyTWVudUl0ZW1zID0gWy4uLm1lbnVzXTsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIGEgc2luZ2xlIGFwcCBiYXIgbWVudSBieSBuYW1lCiAgICAgKi8KICAgIHVwZGF0ZUFwcEJhck1lbnUobmFtZSwgdXBkYXRlKSB7CiAgICAgIHRoaXMuYXBwYmFyTWVudUl0ZW1zID0gdGhpcy5hcHBiYXJNZW51SXRlbXMubWFwKChtZW51KSA9PiB7CiAgICAgICAgaWYgKCJuYW1lIiBpbiBtZW51ICYmIG1lbnUubmFtZSA9PT0gbmFtZSkgewogICAgICAgICAgcmV0dXJuIHsgLi4ubWVudSwgLi4udXBkYXRlIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBtZW51OwogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogU2V0IHRoZSBicmVhZGNydW1icyAoc3RyaW5nIG9yIGFycmF5KQogICAgICovCiAgICBzZXRCcmVhZGNydW1icyhicmVhZGNydW1icykgewogICAgICBpZiAoQXJyYXkuaXNBcnJheShicmVhZGNydW1icykpIHsKICAgICAgICB0aGlzLmFwcGJhckJyZWFkY3J1bWJzID0gYnJlYWRjcnVtYnMuam9pbih0aGlzLmFwcGJhckJyZWFkY3J1bWJTZXBhcmF0b3IpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuYXBwYmFyQnJlYWRjcnVtYnMgPSBicmVhZGNydW1iczsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTZXQgdGhlIGN1cnJlbnQgdXNlcgogICAgICovCiAgICBzZXRVc2VyKHVzZXIpIHsKICAgICAgdGhpcy5hcHBiYXJVc2VyID0gdXNlcjsKICAgIH0KICAgIC8qKgogICAgICogU2V0IHRoZSBwcm9maWxlIGRyb3Bkb3duIG1lbnUgaXRlbXMKICAgICAqLwogICAgc2V0UHJvZmlsZU1lbnVJdGVtcyhpdGVtcykgewogICAgICB0aGlzLmFwcGJhclByb2ZpbGVNZW51SXRlbXMgPSBbLi4uaXRlbXNdOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgc2VhcmNoIGJhciB2aXNpYmlsaXR5CiAgICAgKi8KICAgIHNldFNlYXJjaFZpc2libGUodmlzaWJsZSkgewogICAgICB0aGlzLmFwcGJhclNob3dTZWFyY2ggPSB2aXNpYmxlOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgd2luZG93IGNvbnRyb2xzIHZpc2liaWxpdHkKICAgICAqLwogICAgc2V0V2luZG93Q29udHJvbHNWaXNpYmxlKHZpc2libGUpIHsKICAgICAgdGhpcy5hcHBiYXJTaG93V2luZG93Q29udHJvbHMgPSB2aXNpYmxlOwogICAgfQogICAgLyoqCiAgICAgKiBSZWdpc3RlciBhIHNlYXJjaCBjYWxsYmFjawogICAgICovCiAgICBvblNlYXJjaChjYWxsYmFjaykgewogICAgICB0aGlzLnNlYXJjaENhbGxiYWNrID0gY2FsbGJhY2s7CiAgICB9CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFBST0dSQU1NQVRJQyBBUEk6IE1BSU4gTUVOVQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvKioKICAgICAqIFNldCB0aGUgZW50aXJlIG1haW4gbWVudSBjb25maWd1cmF0aW9uCiAgICAgKi8KICAgIHNldE1haW5NZW51KGNvbmZpZzMpIHsKICAgICAgaWYgKGNvbmZpZzMubG9nb0ljb24gIT09IHZvaWQgMCkgewogICAgICAgIHRoaXMubWFpbm1lbnVMb2dvSWNvbiA9IGNvbmZpZzMubG9nb0ljb247CiAgICAgIH0KICAgICAgaWYgKGNvbmZpZzMubG9nb1RleHQgIT09IHZvaWQgMCkgewogICAgICAgIHRoaXMubWFpbm1lbnVMb2dvVGV4dCA9IGNvbmZpZzMubG9nb1RleHQ7CiAgICAgIH0KICAgICAgaWYgKGNvbmZpZzMuZ3JvdXBzICE9PSB2b2lkIDApIHsKICAgICAgICB0aGlzLm1haW5tZW51R3JvdXBzID0gWy4uLmNvbmZpZzMuZ3JvdXBzXTsKICAgICAgfQogICAgICBpZiAoY29uZmlnMy5ib3R0b21UYWJzICE9PSB2b2lkIDApIHsKICAgICAgICB0aGlzLm1haW5tZW51Qm90dG9tVGFicyA9IFsuLi5jb25maWczLmJvdHRvbVRhYnNdOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZSBhIHNwZWNpZmljIG1lbnUgZ3JvdXAgYnkgbmFtZQogICAgICovCiAgICB1cGRhdGVNYWluTWVudUdyb3VwKGdyb3VwTmFtZSwgdXBkYXRlKSB7CiAgICAgIHRoaXMubWFpbm1lbnVHcm91cHMgPSB0aGlzLm1haW5tZW51R3JvdXBzLm1hcCgoZ3JvdXApID0+IGdyb3VwLm5hbWUgPT09IGdyb3VwTmFtZSA/IHsgLi4uZ3JvdXAsIC4uLnVwZGF0ZSB9IDogZ3JvdXApOwogICAgfQogICAgLyoqCiAgICAgKiBBZGQgYSBtZW51IGl0ZW0gdG8gYSBzcGVjaWZpYyBncm91cAogICAgICovCiAgICBhZGRNYWluTWVudUl0ZW0oZ3JvdXBOYW1lLCB0YWIyKSB7CiAgICAgIHRoaXMubWFpbm1lbnVHcm91cHMgPSB0aGlzLm1haW5tZW51R3JvdXBzLm1hcCgoZ3JvdXApID0+IHsKICAgICAgICBpZiAoZ3JvdXAubmFtZSA9PT0gZ3JvdXBOYW1lKSB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAuLi5ncm91cCwKICAgICAgICAgICAgaXRlbXM6IFsuLi5ncm91cC5pdGVtcyB8fCBbXSwgdGFiMl0KICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBncm91cDsKICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZSBhIG1lbnUgaXRlbSBmcm9tIGEgZ3JvdXAgYnkga2V5CiAgICAgKi8KICAgIHJlbW92ZU1haW5NZW51SXRlbShncm91cE5hbWUsIHRhYktleSkgewogICAgICB0aGlzLm1haW5tZW51R3JvdXBzID0gdGhpcy5tYWlubWVudUdyb3Vwcy5tYXAoKGdyb3VwKSA9PiB7CiAgICAgICAgaWYgKGdyb3VwLm5hbWUgPT09IGdyb3VwTmFtZSkgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgLi4uZ3JvdXAsCiAgICAgICAgICAgIGl0ZW1zOiAoZ3JvdXAuaXRlbXMgfHwgW10pLmZpbHRlcigodDkpID0+IHQ5LmtleSAhPT0gdGFiS2V5KQogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGdyb3VwOwogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogU2V0IHRoZSBzZWxlY3RlZCBtYWluIG1lbnUgaXRlbSBieSBrZXkKICAgICAqLwogICAgc2V0TWFpbk1lbnVTZWxlY3Rpb24odGFiS2V5KSB7CiAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5tYWlubWVudUdyb3VwcykgewogICAgICAgIGNvbnN0IHRhYjIgPSBncm91cC5pdGVtcz8uZmluZCgodDkpID0+IHQ5LmtleSA9PT0gdGFiS2V5KTsKICAgICAgICBpZiAodGFiMikgewogICAgICAgICAgdGhpcy5tYWlubWVudVNlbGVjdGVkVGFiID0gdGFiMjsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgYm90dG9tVGFiID0gdGhpcy5tYWlubWVudUJvdHRvbVRhYnMuZmluZCgodDkpID0+IHQ5LmtleSA9PT0gdGFiS2V5KTsKICAgICAgaWYgKGJvdHRvbVRhYikgewogICAgICAgIHRoaXMubWFpbm1lbnVTZWxlY3RlZFRhYiA9IGJvdHRvbVRhYjsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTZXQgbWFpbiBtZW51IGNvbGxhcHNlZCBzdGF0ZQogICAgICovCiAgICBzZXRNYWluTWVudUNvbGxhcHNlZChjb2xsYXBzZWQpIHsKICAgICAgdGhpcy5tYWlubWVudUNvbGxhcHNlZCA9IGNvbGxhcHNlZDsKICAgIH0KICAgIC8qKgogICAgICogU2V0IG1haW4gbWVudSB2aXNpYmlsaXR5CiAgICAgKi8KICAgIHNldE1haW5NZW51VmlzaWJsZSh2aXNpYmxlKSB7CiAgICAgIHRoaXMubWFpbm1lbnVWaXNpYmxlID0gdmlzaWJsZTsKICAgIH0KICAgIC8qKgogICAgICogU2V0IHNlY29uZGFyeSBtZW51IGNvbGxhcHNlZCBzdGF0ZQogICAgICovCiAgICBzZXRTZWNvbmRhcnlNZW51Q29sbGFwc2VkKGNvbGxhcHNlZCkgewogICAgICB0aGlzLnNlY29uZGFyeW1lbnVDb2xsYXBzZWQgPSBjb2xsYXBzZWQ7CiAgICB9CiAgICAvKioKICAgICAqIFNldCBzZWNvbmRhcnkgbWVudSB2aXNpYmlsaXR5CiAgICAgKi8KICAgIHNldFNlY29uZGFyeU1lbnVWaXNpYmxlKHZpc2libGUpIHsKICAgICAgdGhpcy5zZWNvbmRhcnltZW51VmlzaWJsZSA9IHZpc2libGU7CiAgICB9CiAgICAvKioKICAgICAqIFNldCBjb250ZW50IHRhYnMgdmlzaWJpbGl0eQogICAgICovCiAgICBzZXRDb250ZW50VGFic1Zpc2libGUodmlzaWJsZSkgewogICAgICB0aGlzLm1haW5jb250ZW50VGFic1Zpc2libGUgPSB2aXNpYmxlOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgY29udGVudCB0YWJzIGF1dG8taGlkZSBiZWhhdmlvcgogICAgICogQHBhcmFtIGVuYWJsZWQgLSBFbmFibGUgYXV0by1oaWRlIGZlYXR1cmUKICAgICAqIEBwYXJhbSB0aHJlc2hvbGQgLSBIaWRlIHdoZW4gdGFicy5sZW5ndGggPD0gdGhyZXNob2xkIChkZWZhdWx0IDAgPSBoaWRlIHdoZW4gbm8gdGFicykKICAgICAqLwogICAgc2V0Q29udGVudFRhYnNBdXRvSGlkZShlbmFibGVkLCB0aHJlc2hvbGQgPSAwKSB7CiAgICAgIHRoaXMuY29udGVudFRhYnNBdXRvSGlkZSA9IGVuYWJsZWQ7CiAgICAgIHRoaXMuY29udGVudFRhYnNBdXRvSGlkZVRocmVzaG9sZCA9IHRocmVzaG9sZDsKICAgIH0KICAgIC8qKgogICAgICogU2V0IGEgYmFkZ2Ugb24gYSBtYWluIG1lbnUgaXRlbQogICAgICovCiAgICBzZXRNYWluTWVudUJhZGdlKHRhYktleSwgYmFkZ2UpIHsKICAgICAgdGhpcy5tYWlubWVudUdyb3VwcyA9IHRoaXMubWFpbm1lbnVHcm91cHMubWFwKChncm91cCkgPT4gKHsKICAgICAgICAuLi5ncm91cCwKICAgICAgICBpdGVtczogKGdyb3VwLml0ZW1zIHx8IFtdKS5tYXAoKHRhYjIpID0+IHRhYjIua2V5ID09PSB0YWJLZXkgPyB7IC4uLnRhYjIsIGJhZGdlIH0gOiB0YWIyKQogICAgICB9KSk7CiAgICAgIHRoaXMubWFpbm1lbnVCb3R0b21UYWJzID0gdGhpcy5tYWlubWVudUJvdHRvbVRhYnMubWFwKCh0YWIyKSA9PiB0YWIyLmtleSA9PT0gdGFiS2V5ID8geyAuLi50YWIyLCBiYWRnZSB9IDogdGFiMik7CiAgICB9CiAgICAvKioKICAgICAqIENsZWFyIGEgYmFkZ2UgZnJvbSBhIG1haW4gbWVudSBpdGVtCiAgICAgKi8KICAgIGNsZWFyTWFpbk1lbnVCYWRnZSh0YWJLZXkpIHsKICAgICAgdGhpcy5tYWlubWVudUdyb3VwcyA9IHRoaXMubWFpbm1lbnVHcm91cHMubWFwKChncm91cCkgPT4gKHsKICAgICAgICAuLi5ncm91cCwKICAgICAgICBpdGVtczogKGdyb3VwLml0ZW1zIHx8IFtdKS5tYXAoKHRhYjIpID0+IHsKICAgICAgICAgIGlmICh0YWIyLmtleSA9PT0gdGFiS2V5KSB7CiAgICAgICAgICAgIGNvbnN0IHsgYmFkZ2UsIC4uLnJlc3QgfSA9IHRhYjI7CiAgICAgICAgICAgIHJldHVybiByZXN0OwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRhYjI7CiAgICAgICAgfSkKICAgICAgfSkpOwogICAgICB0aGlzLm1haW5tZW51Qm90dG9tVGFicyA9IHRoaXMubWFpbm1lbnVCb3R0b21UYWJzLm1hcCgodGFiMikgPT4gewogICAgICAgIGlmICh0YWIyLmtleSA9PT0gdGFiS2V5KSB7CiAgICAgICAgICBjb25zdCB7IGJhZGdlLCAuLi5yZXN0IH0gPSB0YWIyOwogICAgICAgICAgcmV0dXJuIHJlc3Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0YWIyOwogICAgICB9KTsKICAgIH0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUFJPR1JBTU1BVElDIEFQSTogU0VDT05EQVJZIE1FTlUKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLyoqCiAgICAgKiBTZXQgdGhlIHNlY29uZGFyeSBtZW51IGNvbmZpZ3VyYXRpb24KICAgICAqLwogICAgc2V0U2Vjb25kYXJ5TWVudShjb25maWczKSB7CiAgICAgIGlmIChjb25maWczLmhlYWRpbmcgIT09IHZvaWQgMCkgewogICAgICAgIHRoaXMuc2Vjb25kYXJ5bWVudUhlYWRpbmcgPSBjb25maWczLmhlYWRpbmc7CiAgICAgIH0KICAgICAgdGhpcy5zZWNvbmRhcnltZW51R3JvdXBzID0gWy4uLmNvbmZpZzMuZ3JvdXBzXTsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIGEgc3BlY2lmaWMgc2Vjb25kYXJ5IG1lbnUgZ3JvdXAKICAgICAqLwogICAgdXBkYXRlU2Vjb25kYXJ5TWVudUdyb3VwKGdyb3VwTmFtZSwgdXBkYXRlKSB7CiAgICAgIHRoaXMuc2Vjb25kYXJ5bWVudUdyb3VwcyA9IHRoaXMuc2Vjb25kYXJ5bWVudUdyb3Vwcy5tYXAoKGdyb3VwKSA9PiBncm91cC5uYW1lID09PSBncm91cE5hbWUgPyB7IC4uLmdyb3VwLCAuLi51cGRhdGUgfSA6IGdyb3VwKTsKICAgIH0KICAgIC8qKgogICAgICogQWRkIGFuIGl0ZW0gdG8gYSBzZWNvbmRhcnkgbWVudSBncm91cAogICAgICovCiAgICBhZGRTZWNvbmRhcnlNZW51SXRlbShncm91cE5hbWUsIGl0ZW0pIHsKICAgICAgdGhpcy5zZWNvbmRhcnltZW51R3JvdXBzID0gdGhpcy5zZWNvbmRhcnltZW51R3JvdXBzLm1hcCgoZ3JvdXApID0+IHsKICAgICAgICBpZiAoZ3JvdXAubmFtZSA9PT0gZ3JvdXBOYW1lKSB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAuLi5ncm91cCwKICAgICAgICAgICAgaXRlbXM6IFsuLi5ncm91cC5pdGVtcywgaXRlbV0KICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBncm91cDsKICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIFNldCB0aGUgc2VsZWN0ZWQgc2Vjb25kYXJ5IG1lbnUgaXRlbSBieSBrZXkgKGZvciB0YWIgaXRlbXMgb25seSkKICAgICAqLwogICAgc2V0U2Vjb25kYXJ5TWVudVNlbGVjdGlvbihpdGVtS2V5KSB7CiAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5zZWNvbmRhcnltZW51R3JvdXBzKSB7CiAgICAgICAgY29uc3QgaXRlbSA9IGdyb3VwLml0ZW1zLmZpbmQoKGkxMSkgPT4gImtleSIgaW4gaTExICYmIGkxMS5rZXkgPT09IGl0ZW1LZXkpOwogICAgICAgIGlmIChpdGVtICYmICghKCJ0eXBlIiBpbiBpdGVtKSB8fCBpdGVtLnR5cGUgPT09ICJ0YWIiIHx8IGl0ZW0udHlwZSA9PT0gdm9pZCAwKSkgewogICAgICAgICAgdGhpcy5zZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtID0gaXRlbTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ2xlYXIgdGhlIHNlY29uZGFyeSBtZW51CiAgICAgKi8KICAgIGNsZWFyU2Vjb25kYXJ5TWVudSgpIHsKICAgICAgdGhpcy5zZWNvbmRhcnltZW51SGVhZGluZyA9ICIiOwogICAgICB0aGlzLnNlY29uZGFyeW1lbnVHcm91cHMgPSBbXTsKICAgICAgdGhpcy5zZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtID0gdm9pZCAwOwogICAgfQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQUk9HUkFNTUFUSUMgQVBJOiBDT05URU5UIFRBQlMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLyoqCiAgICAgKiBTZXQgdGhlIGNvbnRlbnQgdGFicwogICAgICovCiAgICBzZXRDb250ZW50VGFicyh0YWJzKSB7CiAgICAgIHRoaXMubWFpbmNvbnRlbnRUYWJzID0gWy4uLnRhYnNdOwogICAgICBpZiAodGFicy5sZW5ndGggPiAwICYmICF0aGlzLm1haW5jb250ZW50U2VsZWN0ZWRUYWIpIHsKICAgICAgICB0aGlzLm1haW5jb250ZW50U2VsZWN0ZWRUYWIgPSB0YWJzWzBdOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEFkZCBhIGNvbnRlbnQgdGFiCiAgICAgKi8KICAgIGFkZENvbnRlbnRUYWIodGFiMikgewogICAgICB0aGlzLm1haW5jb250ZW50VGFicyA9IFsuLi50aGlzLm1haW5jb250ZW50VGFicywgdGFiMl07CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZSBhIGNvbnRlbnQgdGFiIGJ5IGtleQogICAgICovCiAgICByZW1vdmVDb250ZW50VGFiKHRhYktleSkgewogICAgICB0aGlzLm1haW5jb250ZW50VGFicyA9IHRoaXMubWFpbmNvbnRlbnRUYWJzLmZpbHRlcigodDkpID0+IHQ5LmtleSAhPT0gdGFiS2V5KTsKICAgICAgaWYgKHRoaXMubWFpbmNvbnRlbnRTZWxlY3RlZFRhYj8ua2V5ID09PSB0YWJLZXkpIHsKICAgICAgICB0aGlzLm1haW5jb250ZW50U2VsZWN0ZWRUYWIgPSB0aGlzLm1haW5jb250ZW50VGFic1swXTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTZWxlY3QgYSBjb250ZW50IHRhYiBieSBrZXkKICAgICAqLwogICAgc2VsZWN0Q29udGVudFRhYih0YWJLZXkpIHsKICAgICAgY29uc3QgdGFiMiA9IHRoaXMubWFpbmNvbnRlbnRUYWJzLmZpbmQoKHQ5KSA9PiB0OS5rZXkgPT09IHRhYktleSk7CiAgICAgIGlmICh0YWIyKSB7CiAgICAgICAgdGhpcy5tYWluY29udGVudFNlbGVjdGVkVGFiID0gdGFiMjsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjb250ZW50IHRhYgogICAgICovCiAgICBnZXRTZWxlY3RlZENvbnRlbnRUYWIoKSB7CiAgICAgIHJldHVybiB0aGlzLm1haW5jb250ZW50U2VsZWN0ZWRUYWI7CiAgICB9CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFBST0dSQU1NQVRJQyBBUEk6IEFDVElWSVRZIExPRwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvKioKICAgICAqIEdldCB0aGUgYWN0aXZpdHkgbG9nIEFQSQogICAgICovCiAgICBnZXQgYWN0aXZpdHlMb2coKSB7CiAgICAgIGlmICghdGhpcy5hY3Rpdml0eWxvZ0VsZW1lbnQpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgYWRkOiAoZW50cnkpID0+IHsKICAgICAgICAgICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHRoaXMuYWN0aXZpdHlsb2dFbGVtZW50Py5hZGQoZW50cnkpKTsKICAgICAgICAgIH0sCiAgICAgICAgICBhZGRNYW55OiAoZW50cmllcykgPT4gewogICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4gdGhpcy5hY3Rpdml0eWxvZ0VsZW1lbnQ/LmFkZE1hbnkoZW50cmllcykpOwogICAgICAgICAgfSwKICAgICAgICAgIGNsZWFyOiAoKSA9PiB7CiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29tcGxldGUudGhlbigoKSA9PiB0aGlzLmFjdGl2aXR5bG9nRWxlbWVudD8uY2xlYXIoKSk7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0RW50cmllczogKCkgPT4gdGhpcy5hY3Rpdml0eWxvZ0VsZW1lbnQ/LmdldEVudHJpZXMoKSB8fCBbXSwKICAgICAgICAgIGZpbHRlcjogKGNyaXRlcmlhKSA9PiB0aGlzLmFjdGl2aXR5bG9nRWxlbWVudD8uZmlsdGVyKGNyaXRlcmlhKSB8fCBbXSwKICAgICAgICAgIHNlYXJjaDogKHF1ZXJ5KSA9PiB0aGlzLmFjdGl2aXR5bG9nRWxlbWVudD8uc2VhcmNoKHF1ZXJ5KSB8fCBbXQogICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICBhZGQ6IChlbnRyeSkgPT4gdGhpcy5hY3Rpdml0eWxvZ0VsZW1lbnQuYWRkKGVudHJ5KSwKICAgICAgICBhZGRNYW55OiAoZW50cmllcykgPT4gdGhpcy5hY3Rpdml0eWxvZ0VsZW1lbnQuYWRkTWFueShlbnRyaWVzKSwKICAgICAgICBjbGVhcjogKCkgPT4gdGhpcy5hY3Rpdml0eWxvZ0VsZW1lbnQuY2xlYXIoKSwKICAgICAgICBnZXRFbnRyaWVzOiAoKSA9PiB0aGlzLmFjdGl2aXR5bG9nRWxlbWVudC5nZXRFbnRyaWVzKCksCiAgICAgICAgZmlsdGVyOiAoY3JpdGVyaWEpID0+IHRoaXMuYWN0aXZpdHlsb2dFbGVtZW50LmZpbHRlcihjcml0ZXJpYSksCiAgICAgICAgc2VhcmNoOiAocXVlcnkpID0+IHRoaXMuYWN0aXZpdHlsb2dFbGVtZW50LnNlYXJjaChxdWVyeSkKICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogU2V0IGFjdGl2aXR5IGxvZyB2aXNpYmlsaXR5CiAgICAgKi8KICAgIHNldEFjdGl2aXR5TG9nVmlzaWJsZSh2aXNpYmxlKSB7CiAgICAgIHRoaXMuYWN0aXZpdHlMb2dWaXNpYmxlID0gdmlzaWJsZTsKICAgIH0KICAgIC8qKgogICAgICogVG9nZ2xlIGFjdGl2aXR5IGxvZyB2aXNpYmlsaXR5CiAgICAgKi8KICAgIHRvZ2dsZUFjdGl2aXR5TG9nKCkgewogICAgICB0aGlzLmFjdGl2aXR5TG9nVmlzaWJsZSA9ICF0aGlzLmFjdGl2aXR5TG9nVmlzaWJsZTsKICAgIH0KICAgIC8qKgogICAgICogR2V0IGFjdGl2aXR5IGxvZyB2aXNpYmlsaXR5IHN0YXRlCiAgICAgKi8KICAgIGdldEFjdGl2aXR5TG9nVmlzaWJsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuYWN0aXZpdHlMb2dWaXNpYmxlOwogICAgfQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQUk9HUkFNTUFUSUMgQVBJOiBCT1RUT00gQkFSCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8qKgogICAgICogR2V0IHRoZSBib3R0b20gYmFyIEFQSSBmb3Igd2lkZ2V0L2FjdGlvbiBtYW5hZ2VtZW50CiAgICAgKi8KICAgIGdldCBib3R0b21CYXIoKSB7CiAgICAgIGlmICghdGhpcy5ib3R0b21iYXJFbGVtZW50KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGFkZFdpZGdldDogKHdpZGdldCkgPT4gewogICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4gdGhpcy5ib3R0b21iYXJFbGVtZW50Py5hZGRXaWRnZXQod2lkZ2V0KSk7CiAgICAgICAgICB9LAogICAgICAgICAgdXBkYXRlV2lkZ2V0OiAoaWQsIHVwZGF0ZSkgPT4gewogICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4gdGhpcy5ib3R0b21iYXJFbGVtZW50Py51cGRhdGVXaWRnZXQoaWQsIHVwZGF0ZSkpOwogICAgICAgICAgfSwKICAgICAgICAgIHJlbW92ZVdpZGdldDogKGlkKSA9PiB7CiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29tcGxldGUudGhlbigoKSA9PiB0aGlzLmJvdHRvbWJhckVsZW1lbnQ/LnJlbW92ZVdpZGdldChpZCkpOwogICAgICAgICAgfSwKICAgICAgICAgIGdldFdpZGdldDogKGlkKSA9PiB0aGlzLmJvdHRvbWJhckVsZW1lbnQ/LmdldFdpZGdldChpZCksCiAgICAgICAgICBjbGVhcldpZGdldHM6ICgpID0+IHsKICAgICAgICAgICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHRoaXMuYm90dG9tYmFyRWxlbWVudD8uY2xlYXJXaWRnZXRzKCkpOwogICAgICAgICAgfSwKICAgICAgICAgIGFkZEFjdGlvbjogKGFjdGlvbikgPT4gewogICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4gdGhpcy5ib3R0b21iYXJFbGVtZW50Py5hZGRBY3Rpb24oYWN0aW9uKSk7CiAgICAgICAgICB9LAogICAgICAgICAgcmVtb3ZlQWN0aW9uOiAoaWQpID0+IHsKICAgICAgICAgICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHRoaXMuYm90dG9tYmFyRWxlbWVudD8ucmVtb3ZlQWN0aW9uKGlkKSk7CiAgICAgICAgICB9LAogICAgICAgICAgY2xlYXJBY3Rpb25zOiAoKSA9PiB7CiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29tcGxldGUudGhlbigoKSA9PiB0aGlzLmJvdHRvbWJhckVsZW1lbnQ/LmNsZWFyQWN0aW9ucygpKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgYWRkV2lkZ2V0OiAod2lkZ2V0KSA9PiB0aGlzLmJvdHRvbWJhckVsZW1lbnQuYWRkV2lkZ2V0KHdpZGdldCksCiAgICAgICAgdXBkYXRlV2lkZ2V0OiAoaWQsIHVwZGF0ZSkgPT4gdGhpcy5ib3R0b21iYXJFbGVtZW50LnVwZGF0ZVdpZGdldChpZCwgdXBkYXRlKSwKICAgICAgICByZW1vdmVXaWRnZXQ6IChpZCkgPT4gdGhpcy5ib3R0b21iYXJFbGVtZW50LnJlbW92ZVdpZGdldChpZCksCiAgICAgICAgZ2V0V2lkZ2V0OiAoaWQpID0+IHRoaXMuYm90dG9tYmFyRWxlbWVudC5nZXRXaWRnZXQoaWQpLAogICAgICAgIGNsZWFyV2lkZ2V0czogKCkgPT4gdGhpcy5ib3R0b21iYXJFbGVtZW50LmNsZWFyV2lkZ2V0cygpLAogICAgICAgIGFkZEFjdGlvbjogKGFjdGlvbikgPT4gdGhpcy5ib3R0b21iYXJFbGVtZW50LmFkZEFjdGlvbihhY3Rpb24pLAogICAgICAgIHJlbW92ZUFjdGlvbjogKGlkKSA9PiB0aGlzLmJvdHRvbWJhckVsZW1lbnQucmVtb3ZlQWN0aW9uKGlkKSwKICAgICAgICBjbGVhckFjdGlvbnM6ICgpID0+IHRoaXMuYm90dG9tYmFyRWxlbWVudC5jbGVhckFjdGlvbnMoKQogICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgYm90dG9tIGJhciB2aXNpYmlsaXR5CiAgICAgKi8KICAgIHNldEJvdHRvbUJhclZpc2libGUodmlzaWJsZSkgewogICAgICB0aGlzLmJvdHRvbWJhclZpc2libGUgPSB2aXNpYmxlOwogICAgICBpZiAoIXZpc2libGUpIHsKICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgiYm90dG9tYmFyLWhpZGRlbiIsICIiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYm90dG9tYmFyLWhpZGRlbiIpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEdldCBib3R0b20gYmFyIHZpc2liaWxpdHkgc3RhdGUKICAgICAqLwogICAgZ2V0Qm90dG9tQmFyVmlzaWJsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuYm90dG9tYmFyVmlzaWJsZTsKICAgIH0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUFJPR1JBTU1BVElDIEFQSTogTkFWSUdBVElPTgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvKioKICAgICAqIE5hdmlnYXRlIHRvIGEgdmlldyBieSBJRAogICAgICovCiAgICBhc3luYyBuYXZpZ2F0ZVRvVmlldyh2aWV3SWQsIHBhcmFtczIpIHsKICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld1JlZ2lzdHJ5LmdldCh2aWV3SWQpOwogICAgICBpZiAoIXZpZXcpIHsKICAgICAgICBjb25zb2xlLndhcm4oYENhbm5vdCBuYXZpZ2F0ZSB0byB1bmtub3duIHZpZXc6ICR7dmlld0lkfWApOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBjb25zdCBjYW5MZWF2ZSA9IGF3YWl0IHRoaXMudmlld1JlZ2lzdHJ5LmNhbkxlYXZlQ3VycmVudFZpZXcoKTsKICAgICAgaWYgKGNhbkxlYXZlICE9PSB0cnVlKSB7CiAgICAgICAgaWYgKHR5cGVvZiBjYW5MZWF2ZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IHdpbmRvdy5jb25maXJtKGNhbkxlYXZlKTsKICAgICAgICAgIGlmICghY29uZmlybWVkKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy52aWV3TGlmZWN5Y2xlJC5uZXh0KHsgdHlwZTogImxvYWRpbmciLCB2aWV3SWQgfSk7CiAgICAgIHRyeSB7CiAgICAgICAgYXdhaXQgdGhpcy5sb2FkVmlldyh2aWV3LCBwYXJhbXMyKTsKICAgICAgICBjb25zdCByb3V0ZSA9IHZpZXcucm91dGUgfHwgdmlld0lkOwogICAgICAgIGNvbnN0IG5ld0hhc2ggPSBgIyR7cm91dGV9YDsKICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2ggIT09IG5ld0hhc2gpIHsKICAgICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSh7IHZpZXdJZCB9LCAiIiwgbmV3SGFzaCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIHRoaXMudmlld0xpZmVjeWNsZSQubmV4dCh7IHR5cGU6ICJsb2FkRXJyb3IiLCB2aWV3SWQsIGVycm9yIH0pOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgdmlldwogICAgICovCiAgICBnZXRDdXJyZW50VmlldygpIHsKICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFZpZXc7CiAgICB9CiAgICAvKioKICAgICAqIEdldCBhY2Nlc3MgdG8gdGhlIHZpZXcgcmVnaXN0cnkgKGZvciBhZHZhbmNlZCB1c2UpCiAgICAgKi8KICAgIGdldFZpZXdSZWdpc3RyeSgpIHsKICAgICAgcmV0dXJuIHRoaXMudmlld1JlZ2lzdHJ5OwogICAgfQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBVTklGSUVEIENPTkZJR1VSQVRJT04KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLyoqCiAgICAgKiBDb25maWd1cmUgdGhlIGFwcCBzaGVsbCB3aXRoIGEgdW5pZmllZCBjb25maWcgb2JqZWN0CiAgICAgKi8KICAgIGNvbmZpZ3VyZShjb25maWczKSB7CiAgICAgIGlmIChjb25maWczLnZpZXdzKSB7CiAgICAgICAgdGhpcy52aWV3UmVnaXN0cnkuY2xlYXIoKTsKICAgICAgICB0aGlzLnZpZXdSZWdpc3RyeS5yZWdpc3RlckFsbChjb25maWczLnZpZXdzKTsKICAgICAgfQogICAgICBpZiAoY29uZmlnMy5icmFuZGluZykgewogICAgICAgIHRoaXMubWFpbm1lbnVMb2dvSWNvbiA9IGNvbmZpZzMuYnJhbmRpbmcubG9nb0ljb24gfHwgIiI7CiAgICAgICAgdGhpcy5tYWlubWVudUxvZ29UZXh0ID0gY29uZmlnMy5icmFuZGluZy5sb2dvVGV4dCB8fCAiIjsKICAgICAgfQogICAgICBpZiAoY29uZmlnMy5hcHBCYXIpIHsKICAgICAgICB0aGlzLmFwcGJhck1lbnVJdGVtcyA9IGNvbmZpZzMuYXBwQmFyLm1lbnVJdGVtcyB8fCBbXTsKICAgICAgICB0aGlzLmFwcGJhckJyZWFkY3J1bWJzID0gY29uZmlnMy5hcHBCYXIuYnJlYWRjcnVtYnMgfHwgIiI7CiAgICAgICAgdGhpcy5hcHBiYXJCcmVhZGNydW1iU2VwYXJhdG9yID0gY29uZmlnMy5hcHBCYXIuYnJlYWRjcnVtYlNlcGFyYXRvciB8fCAiID4gIjsKICAgICAgICB0aGlzLmFwcGJhclNob3dXaW5kb3dDb250cm9scyA9IGNvbmZpZzMuYXBwQmFyLnNob3dXaW5kb3dDb250cm9scyA/PyB0cnVlOwogICAgICAgIHRoaXMuYXBwYmFyU2hvd1NlYXJjaCA9IGNvbmZpZzMuYXBwQmFyLnNob3dTZWFyY2ggPz8gZmFsc2U7CiAgICAgICAgdGhpcy5hcHBiYXJVc2VyID0gY29uZmlnMy5hcHBCYXIudXNlcjsKICAgICAgICB0aGlzLmFwcGJhclByb2ZpbGVNZW51SXRlbXMgPSBjb25maWczLmFwcEJhci5wcm9maWxlTWVudUl0ZW1zIHx8IFtdOwogICAgICB9CiAgICAgIGlmIChjb25maWczLm1haW5NZW51KSB7CiAgICAgICAgaWYgKGNvbmZpZzMubWFpbk1lbnUuc2VjdGlvbnMpIHsKICAgICAgICAgIHRoaXMubWFpbm1lbnVHcm91cHMgPSB0aGlzLmJ1aWxkTWFpbk1lbnVGcm9tU2VjdGlvbnMoY29uZmlnMyk7CiAgICAgICAgfSBlbHNlIGlmIChjb25maWczLm1haW5NZW51Lmdyb3VwcykgewogICAgICAgICAgdGhpcy5tYWlubWVudUdyb3VwcyA9IGNvbmZpZzMubWFpbk1lbnUuZ3JvdXBzOwogICAgICAgIH0KICAgICAgICBpZiAoY29uZmlnMy5tYWluTWVudS5sb2dvSWNvbikgewogICAgICAgICAgdGhpcy5tYWlubWVudUxvZ29JY29uID0gY29uZmlnMy5tYWluTWVudS5sb2dvSWNvbjsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbmZpZzMubWFpbk1lbnUubG9nb1RleHQpIHsKICAgICAgICAgIHRoaXMubWFpbm1lbnVMb2dvVGV4dCA9IGNvbmZpZzMubWFpbk1lbnUubG9nb1RleHQ7CiAgICAgICAgfQogICAgICAgIGlmIChjb25maWczLm1haW5NZW51LmJvdHRvbVRhYnMpIHsKICAgICAgICAgIHRoaXMubWFpbm1lbnVCb3R0b21UYWJzID0gY29uZmlnMy5tYWluTWVudS5ib3R0b21UYWJzOwogICAgICAgIH0gZWxzZSBpZiAoY29uZmlnMy5tYWluTWVudS5ib3R0b21JdGVtcykgewogICAgICAgICAgdGhpcy5tYWlubWVudUJvdHRvbVRhYnMgPSB0aGlzLmJ1aWxkQm90dG9tVGFic0Zyb21JdGVtcyhjb25maWczLm1haW5NZW51LmJvdHRvbUl0ZW1zKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNvbmZpZzMuYm90dG9tQmFyKSB7CiAgICAgICAgdGhpcy5zZXRCb3R0b21CYXJWaXNpYmxlKGNvbmZpZzMuYm90dG9tQmFyLnZpc2libGUgPz8gdHJ1ZSk7CiAgICAgICAgaWYgKGNvbmZpZzMuYm90dG9tQmFyLndpZGdldHMpIHsKICAgICAgICAgIGNvbmZpZzMuYm90dG9tQmFyLndpZGdldHMuZm9yRWFjaCgod2lkZ2V0KSA9PiB7CiAgICAgICAgICAgIHRoaXMuYm90dG9tQmFyLmFkZFdpZGdldCh3aWRnZXQpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmIChjb25maWczLmJvdHRvbUJhci5hY3Rpb25zKSB7CiAgICAgICAgICBjb25maWczLmJvdHRvbUJhci5hY3Rpb25zLmZvckVhY2goKGFjdGlvbikgPT4gewogICAgICAgICAgICB0aGlzLmJvdHRvbUJhci5hZGRBY3Rpb24oYWN0aW9uKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLnNldHVwUm91dGVySW50ZWdyYXRpb24oY29uZmlnMyk7CiAgICAgIGlmIChjb25maWczLm9uVmlld0NoYW5nZSkgewogICAgICAgIHRoaXMudmlld0NoYW5nZWQkLnN1YnNjcmliZSgoZXZlbnQpID0+IHsKICAgICAgICAgIGNvbmZpZzMub25WaWV3Q2hhbmdlKGV2ZW50LnZpZXdJZCwgZXZlbnQudmlldyk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKGNvbmZpZzMub25TZWFyY2gpIHsKICAgICAgICB0aGlzLnNlYXJjaENhbGxiYWNrID0gY29uZmlnMy5vblNlYXJjaDsKICAgICAgfQogICAgICBpZiAoY29uZmlnMy5kZWZhdWx0VmlldykgewogICAgICAgIHRoaXMubmF2aWdhdGVUb1ZpZXcoY29uZmlnMy5kZWZhdWx0Vmlldyk7CiAgICAgIH0KICAgIH0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUFJJVkFURSBIRUxQRVIgTUVUSE9EUwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBzZXR1cFJvdXRlckludGVncmF0aW9uKGNvbmZpZzMpIHsKICAgICAgY29uc3QgaGFuZGxlSGFzaENoYW5nZSA9ICgpID0+IHsKICAgICAgICBjb25zdCBoYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2guc2xpY2UoMSk7CiAgICAgICAgaWYgKCFoYXNoKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNvbnN0IG1hdGNoMiA9IHRoaXMudmlld1JlZ2lzdHJ5LmZpbmRCeVJvdXRlKGhhc2gpOwogICAgICAgIGlmIChtYXRjaDIpIHsKICAgICAgICAgIHRoaXMubmF2aWdhdGVUb1ZpZXcobWF0Y2gyLnZpZXcuaWQsIG1hdGNoMi5wYXJhbXMpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLCBoYW5kbGVIYXNoQ2hhbmdlKTsKICAgICAgdGhpcy5yb3V0ZXJDbGVhbnVwID0gKCkgPT4gewogICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJoYXNoY2hhbmdlIiwgaGFuZGxlSGFzaENoYW5nZSk7CiAgICAgIH07CiAgICAgIGNvbnN0IGN1cnJlbnRIYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2guc2xpY2UoMSk7CiAgICAgIGlmIChjdXJyZW50SGFzaCkgewogICAgICAgIGNvbnN0IG1hdGNoMiA9IHRoaXMudmlld1JlZ2lzdHJ5LmZpbmRCeVJvdXRlKGN1cnJlbnRIYXNoKTsKICAgICAgICBpZiAobWF0Y2gyKSB7CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubmF2aWdhdGVUb1ZpZXcobWF0Y2gyLnZpZXcuaWQsIG1hdGNoMi5wYXJhbXMpLCAwKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGJ1aWxkTWFpbk1lbnVGcm9tU2VjdGlvbnMoY29uZmlnMykgewogICAgICBpZiAoIWNvbmZpZzMubWFpbk1lbnU/LnNlY3Rpb25zKQogICAgICAgIHJldHVybiBbXTsKICAgICAgcmV0dXJuIGNvbmZpZzMubWFpbk1lbnUuc2VjdGlvbnMubWFwKChzZWN0aW9uKSA9PiAoewogICAgICAgIG5hbWU6IHNlY3Rpb24ubmFtZSwKICAgICAgICBpdGVtczogc2VjdGlvbi52aWV3cy5tYXAoKHZpZXdJZCkgPT4gewogICAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld1JlZ2lzdHJ5LmdldCh2aWV3SWQpOwogICAgICAgICAgaWYgKCF2aWV3KSB7CiAgICAgICAgICAgIGNvbnNvbGUud2FybihgVmlldyAiJHt2aWV3SWR9IiBub3QgZm91bmQgaW4gcmVnaXN0cnlgKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBrZXk6IHZpZXcuaWQsCiAgICAgICAgICAgIGljb25OYW1lOiB2aWV3Lmljb25OYW1lLAogICAgICAgICAgICBhY3Rpb246ICgpID0+IHRoaXMubmF2aWdhdGVUb1ZpZXcodmlld0lkKSwKICAgICAgICAgICAgYmFkZ2U6IHZpZXcuYmFkZ2UKICAgICAgICAgIH07CiAgICAgICAgfSkuZmlsdGVyKEJvb2xlYW4pCiAgICAgIH0pKTsKICAgIH0KICAgIGJ1aWxkQm90dG9tVGFic0Zyb21JdGVtcyhpdGVtcykgewogICAgICByZXR1cm4gaXRlbXMubWFwKCh2aWV3SWQpID0+IHsKICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3UmVnaXN0cnkuZ2V0KHZpZXdJZCk7CiAgICAgICAgaWYgKCF2aWV3KSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oYFZpZXcgIiR7dmlld0lkfSIgbm90IGZvdW5kIGluIHJlZ2lzdHJ5YCk7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGtleTogdmlldy5pZCwKICAgICAgICAgIGljb25OYW1lOiB2aWV3Lmljb25OYW1lLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLm5hdmlnYXRlVG9WaWV3KHZpZXdJZCkKICAgICAgICB9OwogICAgICB9KS5maWx0ZXIoQm9vbGVhbik7CiAgICB9CiAgICBhc3luYyBsb2FkVmlldyh2aWV3LCBwYXJhbXMyKSB7CiAgICAgIGNvbnN0IHByZXZpb3VzVmlldyA9IHRoaXMuY3VycmVudFZpZXc7CiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSB2aWV3OwogICAgICBjb25zdCB2aWV3Q29udGFpbmVyID0gdGhpcy5tYWluY29udGVudD8ucXVlcnlTZWxlY3RvcigiLnZpZXctY29udGFpbmVyIikgfHwgdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIudmlldy1jb250YWluZXIiKTsKICAgICAgaWYgKHZpZXdDb250YWluZXIpIHsKICAgICAgICBjb25zdCBlbGVtZW50NCA9IGF3YWl0IHRoaXMudmlld1JlZ2lzdHJ5LmFjdGl2YXRlVmlldyh2aWV3LmlkLCB2aWV3Q29udGFpbmVyLCBwYXJhbXMyKTsKICAgICAgICBpZiAoZWxlbWVudDQpIHsKICAgICAgICAgIHRoaXMudmlld0xpZmVjeWNsZSQubmV4dCh7CiAgICAgICAgICAgIHR5cGU6ICJhY3RpdmF0ZWQiLAogICAgICAgICAgICB2aWV3SWQ6IHZpZXcuaWQsCiAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQ0LAogICAgICAgICAgICBwYXJhbXM6IHBhcmFtczIKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodmlldy5zZWNvbmRhcnlNZW51KSB7CiAgICAgICAgdGhpcy5zZWNvbmRhcnltZW51R3JvdXBzID0gdmlldy5zZWNvbmRhcnlNZW51OwogICAgICAgIHRoaXMuc2Vjb25kYXJ5bWVudUhlYWRpbmcgPSB2aWV3Lm5hbWU7CiAgICAgIH0KICAgICAgaWYgKHZpZXcuY29udGVudFRhYnMpIHsKICAgICAgICB0aGlzLm1haW5jb250ZW50VGFicyA9IHZpZXcuY29udGVudFRhYnM7CiAgICAgIH0KICAgICAgdGhpcy5zZXRNYWluTWVudVNlbGVjdGlvbih2aWV3LmlkKTsKICAgICAgY29uc3QgY2hhbmdlRXZlbnQgPSB7CiAgICAgICAgdmlld0lkOiB2aWV3LmlkLAogICAgICAgIHZpZXcsCiAgICAgICAgcHJldmlvdXNWaWV3LAogICAgICAgIHBhcmFtczogcGFyYW1zMgogICAgICB9OwogICAgICB0aGlzLnZpZXdDaGFuZ2VkJC5uZXh0KGNoYW5nZUV2ZW50KTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgidmlldy1jaGFuZ2UiLCB7CiAgICAgICAgZGV0YWlsOiBjaGFuZ2VFdmVudCwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRVZFTlQgSEFORExFUlMgKEludGVybmFsKQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBoYW5kbGVBcHBiYXJNZW51U2VsZWN0KGUxMSkgewogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJhcHBiYXItbWVudS1zZWxlY3QiLCB7CiAgICAgICAgZGV0YWlsOiBlMTEuZGV0YWlsLAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgaGFuZGxlQXBwYmFyQnJlYWRjcnVtYk5hdmlnYXRlKGUxMSkgewogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJhcHBiYXItYnJlYWRjcnVtYi1uYXZpZ2F0ZSIsIHsKICAgICAgICBkZXRhaWw6IGUxMS5kZXRhaWwsCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBoYW5kbGVBcHBiYXJTZWFyY2hDbGljaygpIHsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiYXBwYmFyLXNlYXJjaC1jbGljayIsIHsKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGhhbmRsZUFwcGJhclNlYXJjaFF1ZXJ5KGUxMSkgewogICAgICBpZiAodGhpcy5zZWFyY2hDYWxsYmFjaykgewogICAgICAgIHRoaXMuc2VhcmNoQ2FsbGJhY2soZTExLmRldGFpbC5xdWVyeSk7CiAgICAgIH0KICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgic2VhcmNoLXF1ZXJ5IiwgewogICAgICAgIGRldGFpbDogZTExLmRldGFpbCwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGhhbmRsZUFwcGJhclVzZXJNZW51T3BlbigpIHsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiYXBwYmFyLXVzZXItbWVudS1vcGVuIiwgewogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgaGFuZGxlQXBwYmFyUHJvZmlsZU1lbnVTZWxlY3QoZTExKSB7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImFwcGJhci1wcm9maWxlLW1lbnUtc2VsZWN0IiwgewogICAgICAgIGRldGFpbDogZTExLmRldGFpbCwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGhhbmRsZU1haW5tZW51VGFiU2VsZWN0KGUxMSkgewogICAgICB0aGlzLm1haW5tZW51U2VsZWN0ZWRUYWIgPSBlMTEuZGV0YWlsLnRhYjsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgibWFpbm1lbnUtdGFiLXNlbGVjdCIsIHsKICAgICAgICBkZXRhaWw6IGUxMS5kZXRhaWwsCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBoYW5kbGVTZWNvbmRhcnltZW51SXRlbVNlbGVjdChlMTEpIHsKICAgICAgdGhpcy5zZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtID0gZTExLmRldGFpbC5pdGVtOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJzZWNvbmRhcnltZW51LWl0ZW0tc2VsZWN0IiwgewogICAgICAgIGRldGFpbDogZTExLmRldGFpbCwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGhhbmRsZU1haW5tZW51Q29sbGFwc2VDaGFuZ2UoZTExKSB7CiAgICAgIHRoaXMubWFpbm1lbnVDb2xsYXBzZWQgPSBlMTEuZGV0YWlsLmNvbGxhcHNlZDsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgibWFpbm1lbnUtY29sbGFwc2UtY2hhbmdlIiwgewogICAgICAgIGRldGFpbDogZTExLmRldGFpbCwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGhhbmRsZVNlY29uZGFyeW1lbnVDb2xsYXBzZUNoYW5nZShlMTEpIHsKICAgICAgdGhpcy5zZWNvbmRhcnltZW51Q29sbGFwc2VkID0gZTExLmRldGFpbC5jb2xsYXBzZWQ7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInNlY29uZGFyeW1lbnUtY29sbGFwc2UtY2hhbmdlIiwgewogICAgICAgIGRldGFpbDogZTExLmRldGFpbCwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGhhbmRsZUNvbnRlbnRUYWJTZWxlY3QoZTExKSB7CiAgICAgIHRoaXMubWFpbmNvbnRlbnRTZWxlY3RlZFRhYiA9IGUxMS5kZXRhaWwudGFiOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjb250ZW50LXRhYi1zZWxlY3QiLCB7CiAgICAgICAgZGV0YWlsOiBlMTEuZGV0YWlsLAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgaGFuZGxlQ29udGVudFRhYkNsb3NlKGUxMSkgewogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjb250ZW50LXRhYi1jbG9zZSIsIHsKICAgICAgICBkZXRhaWw6IGUxMS5kZXRhaWwsCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczQzKF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzQXBwdWkyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1hcHB1aS9kZWVzLW1vYmlsZW5hdmlnYXRpb24vZGVlcy1tb2JpbGVuYXZpZ2F0aW9uLmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfZGVlc19pY29uKCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTQzID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM0NCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc01vYmlsZW5hdmlnYXRpb24gPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLW1vYmlsZW5hdmlnYXRpb24iKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9oZWFkaW5nX2RlY29yYXRvcnM7CiAgbGV0IF9oZWFkaW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaGVhZGluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWVudUl0ZW1zX2RlY29yYXRvcnM7CiAgbGV0IF9tZW51SXRlbXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tZW51SXRlbXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21vYmlsZU5hdlpJbmRleF9kZWNvcmF0b3JzOwogIGxldCBfbW9iaWxlTmF2WkluZGV4X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW9iaWxlTmF2WkluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNNb2JpbGVuYXZpZ2F0aW9uMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2hlYWRpbmdfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgIH0pXTsKICAgICAgX21lbnVJdGVtc19kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBBcnJheQogICAgICB9KV07CiAgICAgIF9tb2JpbGVOYXZaSW5kZXhfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlNDModGhpcywgbnVsbCwgX2hlYWRpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaGVhZGluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaGVhZGluZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5oZWFkaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5oZWFkaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2hlYWRpbmdfaW5pdGlhbGl6ZXJzLCBfaGVhZGluZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQzKHRoaXMsIG51bGwsIF9tZW51SXRlbXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWVudUl0ZW1zIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtZW51SXRlbXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWVudUl0ZW1zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tZW51SXRlbXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWVudUl0ZW1zX2luaXRpYWxpemVycywgX21lbnVJdGVtc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQzKHRoaXMsIG51bGwsIF9tb2JpbGVOYXZaSW5kZXhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibW9iaWxlTmF2WkluZGV4Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtb2JpbGVOYXZaSW5kZXgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubW9iaWxlTmF2WkluZGV4LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tb2JpbGVOYXZaSW5kZXggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbW9iaWxlTmF2WkluZGV4X2luaXRpYWxpemVycywgX21vYmlsZU5hdlpJbmRleF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQzKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc01vYmlsZW5hdmlnYXRpb24yID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIC8vIFNUQVRJQwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkFwcCBVSSJdOwogICAgc3RhdGljIGRlbW8gPSAoKSA9PiBiMmAKICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2s9JHsoKSA9PiB7CiAgICAgIERlZXNNb2JpbGVuYXZpZ2F0aW9uMi5jcmVhdGVBbmRTaG93KFsKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiRGFzaGJvYXJkIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmxheW91dC1kYXNoYm9hcmQiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoZGVlc01vYmlsZU5hdikgPT4gewogICAgICAgICAgICBjb25zb2xlLmxvZygiTmF2aWdhdGUgdG8gZGFzaGJvYXJkIik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIlByb2ZpbGUiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6dXNlciIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jIChkZWVzTW9iaWxlTmF2KSA9PiB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJOYXZpZ2F0ZSB0byBwcm9maWxlIik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIlNldHRpbmdzIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOnNldHRpbmdzIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKGRlZXNNb2JpbGVOYXYpID0+IHsKICAgICAgICAgICAgY29uc29sZS5sb2coIk5hdmlnYXRlIHRvIHNldHRpbmdzIik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIkhlbHAiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6aGVscC1jaXJjbGUiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoZGVlc01vYmlsZU5hdikgPT4gewogICAgICAgICAgICBjb25zb2xlLmxvZygiU2hvdyBoZWxwIik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIlNpZ24gT3V0IiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmxvZy1vdXQiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoZGVlc01vYmlsZU5hdikgPT4gewogICAgICAgICAgICBjb25zb2xlLmxvZygiU2lnbiBvdXQiKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBdKTsKICAgIH19Pk9wZW4gTW9iaWxlIE5hdmlnYXRpb248L2RlZXMtYnV0dG9uPgogIGA7CiAgICBzdGF0aWMgc2luZ2xldG9uUmVmOwogICAgc3RhdGljIGFzeW5jIGNyZWF0ZUFuZFNob3cobWVudUl0ZW1zQXJnKSB7CiAgICAgIGlmICghdGhpcy5zaW5nbGV0b25SZWYpIHsKICAgICAgICB0aGlzLnNpbmdsZXRvblJlZiA9IG5ldyBEZWVzTW9iaWxlbmF2aWdhdGlvbjIoKTsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh0aGlzLnNpbmdsZXRvblJlZik7CiAgICAgICAgYXdhaXQgdGhpcy5zaW5nbGV0b25SZWYuaW5pdCgpOwogICAgICB9CiAgICAgIHRoaXMuc2luZ2xldG9uUmVmLm1lbnVJdGVtcyA9IG1lbnVJdGVtc0FyZzsKICAgICAgYXdhaXQgdGhpcy5zaW5nbGV0b25SZWYucmVhZHlEZWZlcnJlZC5wcm9taXNlOwogICAgICB0aGlzLnNpbmdsZXRvblJlZi5zaG93KCk7CiAgICAgIHJldHVybiB0aGlzLnNpbmdsZXRvblJlZjsKICAgIH0KICAgICNoZWFkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczQ0KHRoaXMsIF9oZWFkaW5nX2luaXRpYWxpemVycywgYE1lbnVgKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgaGVhZGluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2hlYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBoZWFkaW5nKHZhbHVlMikgewogICAgICB0aGlzLiNoZWFkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWVudUl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0NCh0aGlzLCBfaGVhZGluZ19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDQodGhpcywgX21lbnVJdGVtc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgbWVudUl0ZW1zKCkgewogICAgICByZXR1cm4gdGhpcy4jbWVudUl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWVudUl0ZW1zKHZhbHVlMikgewogICAgICB0aGlzLiNtZW51SXRlbXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtb2JpbGVOYXZaSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ0KHRoaXMsIF9tZW51SXRlbXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQ0KHRoaXMsIF9tb2JpbGVOYXZaSW5kZXhfaW5pdGlhbGl6ZXJzLCAxZTMpKTsKICAgIGdldCBtb2JpbGVOYXZaSW5kZXgoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtb2JpbGVOYXZaSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtb2JpbGVOYXZaSW5kZXgodmFsdWUyKSB7CiAgICAgIHRoaXMuI21vYmlsZU5hdlpJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgcmVhZHlEZWZlcnJlZCA9IChfX3J1bkluaXRpYWxpemVyczQ0KHRoaXMsIF9tb2JpbGVOYXZaSW5kZXhfZXh0cmFJbml0aWFsaXplcnMpLCBkaXN0X3RzX2V4cG9ydHMyNS5wbHVnaW5zLnNtYXJ0cHJvbWlzZS5kZWZlcigpKTsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgfQogICAgLyoqCiAgICAgKiBpbml0cyB0aGUgbW9iaWxlIG5hdmlnYXRpb24KICAgICAqLwogICAgYXN5bmMgaW5pdCgpIHsKICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgdGhpcy5yZWFkeURlZmVycmVkLnJlc29sdmUoKTsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1mYW1pbHk6ICR7Y3NzR2Vpc3RGb250RmFtaWx5fTsKICAgICAgfQoKICAgICAgLm1haW4gewogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtYXgtd2lkdGg6IDMyMHB4OwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgICAgICB6LWluZGV4OiB2YXIoLS16LWluZGV4KTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHJpZ2h0OiAwcHg7CiAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgYm90dG9tOiAwcHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzA5MDkwYiIpfTsKICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgYm94LXNoYWRvdzogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIi0yMHB4IDAgMjVweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4xKSwgLTEwcHggMCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjA0KSIsICItMjBweCAwIDI1cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMyksIC0xMHB4IDAgMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSIpfTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KCiAgICAgIC5tYWluLnNob3cgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhbGw7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDBweCk7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmhlYWRlciB7CiAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgfQoKICAgICAgLmhlYWRpbmcgewogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMmVtOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgLm1lbnUtY29udGFpbmVyIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICB9CgogICAgICAubWVudUl0ZW0gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEycHg7CiAgICAgICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjMjcyNzJhIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICB9CgogICAgICAubWVudUl0ZW06YWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjM2YzZjQ2Iil9OwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OCk7CiAgICAgIH0KCiAgICAgIC5tZW51SXRlbSBkZWVzLWljb24gewogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjNzE3MTdhIil9OwogICAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5tZW51SXRlbTpob3ZlciBkZWVzLWljb24gewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICB9CgogICAgICAubWVudUl0ZW0tdGV4dCB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtLWRpdmlkZXIgewogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgICAgbWFyZ2luOiA4cHggMTZweDsKICAgICAgfQoKICAgICAgLyogTW9iaWxlIHJlc3BvbnNpdmVuZXNzICovCiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA0MDBweCkgewogICAgICAgIC5tYWluIHsKICAgICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgICB3aWR0aDogODV2dzsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIEFuaW1hdGlvbiBmb3IgbWVudSBpdGVtcyAqLwogICAgICBAa2V5ZnJhbWVzIHNsaWRlSW5SaWdodCB7CiAgICAgICAgZnJvbSB7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDIwcHgpOwogICAgICAgIH0KICAgICAgICB0byB7CiAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLm1haW4uc2hvdyAubWVudUl0ZW0gewogICAgICAgIGFuaW1hdGlvbjogc2xpZGVJblJpZ2h0IDAuM3MgZWFzZS1vdXQgZm9yd2FyZHM7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiBjYWxjKHZhcigtLWl0ZW0taW5kZXgsIDApICogMC4wNXMpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC8qIFNjcm9sbGJhciBzdHlsaW5nICovCiAgICAgIC5tZW51LWNvbnRhaW5lcjo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIHdpZHRoOiA2cHg7CiAgICAgIH0KCiAgICAgIC5tZW51LWNvbnRhaW5lcjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAubWVudS1jb250YWluZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjM2YzZjQ2Iil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgfQoKICAgICAgLm1lbnUtY29udGFpbmVyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkMWQ1ZGIiLCAiIzUyNTI1YiIpfTsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8c3R5bGU+CiAgICAgICAgLm1haW4gewogICAgICAgICAgLS16LWluZGV4OiAke3RoaXMubW9iaWxlTmF2WkluZGV4fTsKICAgICAgICB9CiAgICAgIDwvc3R5bGU+CiAgICAgIDxkaXYgY2xhc3M9Im1haW4iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICA8aDIgY2xhc3M9ImhlYWRpbmciPiR7dGhpcy5oZWFkaW5nfTwvaDI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibWVudS1jb250YWluZXIiPgogICAgICAgICAgJHt0aGlzLm1lbnVJdGVtcy5tYXAoKG1lbnVJdGVtLCBpbmRleDIpID0+IHsKICAgICAgICBpZiAoImRpdmlkZXIiIGluIG1lbnVJdGVtICYmIG1lbnVJdGVtLmRpdmlkZXIpIHsKICAgICAgICAgIHJldHVybiBiMmA8ZGl2IGNsYXNzPSJtZW51SXRlbS1kaXZpZGVyIj48L2Rpdj5gOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgY2xhc3M9Im1lbnVJdGVtIgogICAgICAgICAgICAgICAgc3R5bGU9Ii0taXRlbS1pbmRleDogJHtpbmRleDJ9IgogICAgICAgICAgICAgICAgQGNsaWNrPSIkeygpID0+IHsKICAgICAgICAgIHRoaXMuaGlkZSgpOwogICAgICAgICAgbWVudUl0ZW0uYWN0aW9uKHRoaXMpOwogICAgICAgIH19IgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICR7bWVudUl0ZW0uaWNvbk5hbWUgPyBiMmAKICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0ke21lbnVJdGVtLmljb25OYW1lfSBzaXplPSIyMCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWVudUl0ZW0tdGV4dCI+JHttZW51SXRlbS5uYW1lfTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYDsKICAgICAgfSl9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHdpbmRvd0xheWVyOwogICAgLyoqCiAgICAgKiBpbml0cyB0aGUgc2hvdwogICAgICovCiAgICBhc3luYyBzaG93KCkgewogICAgICBjb25zdCBkb210b29scyA9IGF3YWl0IHRoaXMuZG9tdG9vbHNQcm9taXNlOwogICAgICBjb25zdCBtYWluID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5tYWluIik7CiAgICAgIGlmICghdGhpcy53aW5kb3dMYXllcikgewogICAgICAgIHRoaXMud2luZG93TGF5ZXIgPSBhd2FpdCBEZWVzV2luZG93TGF5ZXIuY3JlYXRlQW5kU2hvdyh7CiAgICAgICAgICBibHVyOiB0cnVlCiAgICAgICAgfSk7CiAgICAgICAgdGhpcy53aW5kb3dMYXllci5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgICAgIHRoaXMuaGlkZSgpOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHRoaXMud2luZG93TGF5ZXIpOwogICAgICAgIGF3YWl0IHRoaXMud2luZG93TGF5ZXIuc2hvdygpOwogICAgICB9CiAgICAgIHRoaXMubW9iaWxlTmF2WkluZGV4ID0gekluZGV4UmVnaXN0cnkuZ2V0TmV4dFpJbmRleCgpOwogICAgICB6SW5kZXhSZWdpc3RyeS5yZWdpc3Rlcih0aGlzLCB0aGlzLm1vYmlsZU5hdlpJbmRleCk7CiAgICAgIGF3YWl0IGRvbXRvb2xzLmNvbnZlbmllbmNlLnNtYXJ0ZGVsYXkuZGVsYXlGb3IoMTApOwogICAgICBtYWluLmNsYXNzTGlzdC5hZGQoInNob3ciKTsKICAgIH0KICAgIC8qKgogICAgICogaW5pdHMgdGhlIGhpZGUgZnVuY3Rpb24KICAgICAqLwogICAgYXN5bmMgaGlkZSgpIHsKICAgICAgY29uc3QgZG9tdG9vbHMgPSBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgY29uc3QgbWFpbiA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIubWFpbiIpOwogICAgICBtYWluLmNsYXNzTGlzdC5yZW1vdmUoInNob3ciKTsKICAgICAgekluZGV4UmVnaXN0cnkudW5yZWdpc3Rlcih0aGlzKTsKICAgICAgaWYgKHRoaXMud2luZG93TGF5ZXIpIHsKICAgICAgICBhd2FpdCB0aGlzLndpbmRvd0xheWVyLmRlc3Ryb3koKTsKICAgICAgfQogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHpJbmRleFJlZ2lzdHJ5LnVucmVnaXN0ZXIodGhpcyk7CiAgICAgIGlmICh0aGlzLndpbmRvd0xheWVyKSB7CiAgICAgICAgYXdhaXQgdGhpcy53aW5kb3dMYXllci5kZXN0cm95KCk7CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNDQoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNNb2JpbGVuYXZpZ2F0aW9uMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtYnV0dG9uL2RlZXMtYnV0dG9uLWV4aXQvZGVlcy1idXR0b24tZXhpdC5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgX19lc0RlY29yYXRlNDQgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczQ1ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzQnV0dG9uRXhpdCA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtYnV0dG9uLWV4aXQiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9zaXplX2RlY29yYXRvcnM7CiAgbGV0IF9zaXplX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2l6ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzQnV0dG9uRXhpdDIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9zaXplX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IE51bWJlcgogICAgICB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTQ0KHRoaXMsIG51bGwsIF9zaXplX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNpemUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNpemUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2l6ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2l6ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaXplX2luaXRpYWxpemVycywgX3NpemVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0NChudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNCdXR0b25FeGl0MiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAvLyBERU1PCiAgICBzdGF0aWMgZGVtbyA9ICgpID0+IGIyYAogICAgPGRlZXMtYnV0dG9uLWV4aXQ+PC9kZWVzLWJ1dHRvbi1leGl0PgogIGA7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiQnV0dG9uIl07CiAgICAjc2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM0NSh0aGlzLCBfc2l6ZV9pbml0aWFsaXplcnMsIDI0KTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgc2l6ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NpemVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaXplKHZhbHVlMikgewogICAgICB0aGlzLiNzaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdHlsZXMgPSAoX19ydW5Jbml0aWFsaXplcnM0NSh0aGlzLCBfc2l6ZV9leHRyYUluaXRpYWxpemVycyksIFsKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAoKICAgIGAKICAgIF0pOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxzdHlsZT4KICAgICAgICAubWFpbmNvbnRhaW5lciB7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICB3aWR0aDogJHt0aGlzLnNpemV9cHg7CiAgICAgICAgICBoZWlnaHQ6ICR7dGhpcy5zaXplfXB4OwogICAgICAgIH0KICAgICAgPC9zdHlsZT4KICAgICAgPGRpdiBjbGFzcz0ibWFpbmNvbnRhaW5lciI+CiAgICAgICAgPGRpdiBjbGFzcz0iZmlyc3RMaW5lIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWNvbmRMaW5lIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM0NShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0J1dHRvbkV4aXQyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1idXR0b24vZGVlcy1idXR0b24tZ3JvdXAvZGVlcy1idXR0b24tZ3JvdXAuZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgZGVtb0Z1bmMzMSA9ICgpID0+IHsKICByZXR1cm4gYjJgCiAgICA8c3R5bGU+CiAgICAgICR7aWAKICAgICAgICAuZGVtb0JveCB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwMDAwOwogICAgICAgICAgcGFkZGluZzogNDBweDsKICAgICAgICAgIG1pbi1oZWlnaHQ6IDEwMHZoOwogICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICB9CgogICAgICAgIC5kZW1vLXNlY3Rpb24gewogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMzJweDsKICAgICAgICB9CgogICAgICAgIC5kZW1vLXRpdGxlIHsKICAgICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCBzYW5zLXNlcmlmOwogICAgICAgIH0KCiAgICAgICAgLmRlbW8tZGVzY3JpcHRpb24gewogICAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICAgICAgZm9udC1mYW1pbHk6ICdHZWlzdCBTYW5zJywgc2Fucy1zZXJpZjsKICAgICAgICB9CiAgICAgIGB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0iZGVtb0JveCI+CiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgyIGNsYXNzPSJkZW1vLXRpdGxlIj5CYXNpYyBCdXR0b24gR3JvdXBzPC9oMj4KICAgICAgICA8cCBjbGFzcz0iZGVtby1kZXNjcmlwdGlvbiI+QnV0dG9uIGdyb3VwcyB3aXRob3V0IGxhYmVscyBmb3Igc2ltcGxlIGdyb3VwaW5nPC9wPgogICAgICAgIAogICAgICAgIDxkZWVzLWJ1dHRvbi1ncm91cD4KICAgICAgICAgIDxkZWVzLWJ1dHRvbj5PcHRpb24gMTwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24+T3B0aW9uIDI8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uPk9wdGlvbiAzPC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2RlZXMtYnV0dG9uLWdyb3VwPgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgyIGNsYXNzPSJkZW1vLXRpdGxlIj5MYWJlbGVkIEJ1dHRvbiBHcm91cHM8L2gyPgogICAgICAgIDxwIGNsYXNzPSJkZW1vLWRlc2NyaXB0aW9uIj5CdXR0b24gZ3JvdXBzIHdpdGggZGVzY3JpcHRpdmUgbGFiZWxzPC9wPgogICAgICAgIAogICAgICAgIDxkZWVzLWJ1dHRvbi1ncm91cCBsYWJlbD0iVmlldyBNb2RlOiI+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iaGlnaGxpZ2h0ZWQiPkdyaWQ8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uPkxpc3Q8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uPkNhcmRzPC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2RlZXMtYnV0dG9uLWdyb3VwPgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgyIGNsYXNzPSJkZW1vLXRpdGxlIj5NdWx0aXBsZSBHcm91cHM8L2gyPgogICAgICAgIDxwIGNsYXNzPSJkZW1vLWRlc2NyaXB0aW9uIj5NdWx0aXBsZSBidXR0b24gZ3JvdXBzIHVzZWQgdG9nZXRoZXI8L3A+CiAgICAgICAgCiAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZ2FwOiAxNnB4OyBmbGV4LXdyYXA6IHdyYXA7Ij4KICAgICAgICAgIDxkZWVzLWJ1dHRvbi1ncm91cCBsYWJlbD0iRGF0YXNldDoiPgogICAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iaGlnaGxpZ2h0ZWQiPlN5c3RlbTwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj5OZXR3b3JrPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPlNhbGVzPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDwvZGVlcy1idXR0b24tZ3JvdXA+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWJ1dHRvbi1ncm91cCBsYWJlbD0iVGltZSBSYW5nZToiPgogICAgICAgICAgICA8ZGVlcy1idXR0b24+MUg8L2RlZXMtYnV0dG9uPgogICAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iaGlnaGxpZ2h0ZWQiPjI0SDwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj43RDwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj4zMEQ8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPC9kZWVzLWJ1dHRvbi1ncm91cD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtYnV0dG9uLWdyb3VwIGxhYmVsPSJBY3Rpb25zOiI+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj5SZWZyZXNoPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPkV4cG9ydDwvZGVlcy1idXR0b24+CiAgICAgICAgICA8L2RlZXMtYnV0dG9uLWdyb3VwPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgyIGNsYXNzPSJkZW1vLXRpdGxlIj5WZXJ0aWNhbCBCdXR0b24gR3JvdXBzPC9oMj4KICAgICAgICA8cCBjbGFzcz0iZGVtby1kZXNjcmlwdGlvbiI+QnV0dG9uIGdyb3VwcyB3aXRoIHZlcnRpY2FsIGxheW91dDwvcD4KICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBnYXA6IDI0cHg7Ij4KICAgICAgICAgIDxkZWVzLWJ1dHRvbi1ncm91cCBkaXJlY3Rpb249InZlcnRpY2FsIiBsYWJlbD0iTmF2aWdhdGlvbjoiPgogICAgICAgICAgICA8ZGVlcy1idXR0b24+RGFzaGJvYXJkPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9ImhpZ2hsaWdodGVkIj5BbmFseXRpY3M8L2RlZXMtYnV0dG9uPgogICAgICAgICAgICA8ZGVlcy1idXR0b24+UmVwb3J0czwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj5TZXR0aW5nczwvZGVlcy1idXR0b24+CiAgICAgICAgICA8L2RlZXMtYnV0dG9uLWdyb3VwPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1idXR0b24tZ3JvdXAgZGlyZWN0aW9uPSJ2ZXJ0aWNhbCI+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj5BZGQgSXRlbTwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj5FZGl0IEl0ZW08L2RlZXMtYnV0dG9uPgogICAgICAgICAgICA8ZGVlcy1idXR0b24+RGVsZXRlIEl0ZW08L2RlZXMtYnV0dG9uPgogICAgICAgICAgPC9kZWVzLWJ1dHRvbi1ncm91cD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMiBjbGFzcz0iZGVtby10aXRsZSI+TWl4ZWQgQnV0dG9uIFR5cGVzPC9oMj4KICAgICAgICA8cCBjbGFzcz0iZGVtby1kZXNjcmlwdGlvbiI+RGlmZmVyZW50IGJ1dHRvbiB0eXBlcyB3aXRoaW4gZ3JvdXBzPC9wPgogICAgICAgIAogICAgICAgIDxkZWVzLWJ1dHRvbi1ncm91cCBsYWJlbD0iU3RhdHVzOiI+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0ic3VjY2VzcyI+QWN0aXZlPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbj5QZW5kaW5nPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJkYW5nZXIiPkluYWN0aXZlPC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2RlZXMtYnV0dG9uLWdyb3VwPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIGA7Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtYnV0dG9uL2RlZXMtYnV0dG9uLWdyb3VwL2RlZXMtYnV0dG9uLWdyb3VwLmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfZGlzdF90czI1KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTQ1ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM0NiA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0J1dHRvbkdyb3VwID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1idXR0b24tZ3JvdXAiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9sYWJlbF9kZWNvcmF0b3JzOwogIGxldCBfbGFiZWxfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sYWJlbF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGlyZWN0aW9uX2RlY29yYXRvcnM7CiAgbGV0IF9kaXJlY3Rpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kaXJlY3Rpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0J1dHRvbkdyb3VwMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2xhYmVsX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9kaXJlY3Rpb25fZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX19lc0RlY29yYXRlNDUodGhpcywgbnVsbCwgX2xhYmVsX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxhYmVsIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsYWJlbCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sYWJlbCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubGFiZWwgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbGFiZWxfaW5pdGlhbGl6ZXJzLCBfbGFiZWxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0NSh0aGlzLCBudWxsLCBfZGlyZWN0aW9uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImRpcmVjdGlvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZGlyZWN0aW9uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRpcmVjdGlvbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZGlyZWN0aW9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2RpcmVjdGlvbl9pbml0aWFsaXplcnMsIF9kaXJlY3Rpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0NShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNCdXR0b25Hcm91cDIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzMxOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkJ1dHRvbiJdOwogICAgI2xhYmVsX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczQ2KHRoaXMsIF9sYWJlbF9pbml0aWFsaXplcnMsICIiKTsKICAgIGdldCBsYWJlbCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xhYmVsX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbGFiZWwodmFsdWUyKSB7CiAgICAgIHRoaXMuI2xhYmVsX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZGlyZWN0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Nih0aGlzLCBfbGFiZWxfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQ2KHRoaXMsIF9kaXJlY3Rpb25faW5pdGlhbGl6ZXJzLCAiaG9yaXpvbnRhbCIpKTsKICAgIGdldCBkaXJlY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNkaXJlY3Rpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkaXJlY3Rpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI2RpcmVjdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNDYodGhpcywgX2RpcmVjdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIGRvbXRvb2xzX2VsZW1lbnRiYXNpY19leHBvcnRzLnNldHVwKCk7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmJ1dHRvbi1ncm91cCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjA1KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgfQoKICAgICAgLmJ1dHRvbi1ncm91cC52ZXJ0aWNhbCB7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogc3RyZXRjaDsKICAgICAgfQoKICAgICAgLmxhYmVsIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2NjYiLCAiIzk5OSIpfTsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC1mYW1pbHk6ICdHZWlzdCBTYW5zJywgc2Fucy1zZXJpZjsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDhweDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAuYnV0dG9uLWdyb3VwLnZlcnRpY2FsIC5sYWJlbCB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgfQoKICAgICAgOjpzbG90dGVkKCopIHsKICAgICAgICBtYXJnaW46IDAgIWltcG9ydGFudDsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JvdXAgJHt0aGlzLmRpcmVjdGlvbn0iPgogICAgICAgICR7dGhpcy5sYWJlbCA/IGIyYDxzcGFuIGNsYXNzPSJsYWJlbCI+JHt0aGlzLmxhYmVsfTwvc3Bhbj5gIDogIiJ9CiAgICAgICAgPHNsb3Q+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczQ2KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzQnV0dG9uR3JvdXAyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1jaGFydC9kZWVzLWNoYXJ0LWFyZWEvZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgZGVtb0Z1bmMzMiA9ICgpID0+IHsKICBjb25zdCBpbml0aWFsRGF0YXNldHMgPSB7CiAgICBzeXN0ZW06IHsKICAgICAgbGFiZWw6ICJTeXN0ZW0gVXNhZ2UgKCUpIiwKICAgICAgc2VyaWVzOiBbCiAgICAgICAgewogICAgICAgICAgbmFtZTogIkNQVSIsCiAgICAgICAgICBkYXRhOiBbCiAgICAgICAgICAgIHsgeDogbmV3IERhdGUoRGF0ZS5ub3coKSAtIDNlNSkudG9JU09TdHJpbmcoKSwgeTogMjUgfSwKICAgICAgICAgICAgeyB4OiBuZXcgRGF0ZShEYXRlLm5vdygpIC0gMjRlNCkudG9JU09TdHJpbmcoKSwgeTogMzAgfSwKICAgICAgICAgICAgeyB4OiBuZXcgRGF0ZShEYXRlLm5vdygpIC0gMThlNCkudG9JU09TdHJpbmcoKSwgeTogMjggfSwKICAgICAgICAgICAgeyB4OiBuZXcgRGF0ZShEYXRlLm5vdygpIC0gMTJlNCkudG9JU09TdHJpbmcoKSwgeTogMzUgfSwKICAgICAgICAgICAgeyB4OiBuZXcgRGF0ZShEYXRlLm5vdygpIC0gNmU0KS50b0lTT1N0cmluZygpLCB5OiAzMiB9LAogICAgICAgICAgICB7IHg6ICgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKSwgeTogMzggfQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIk1lbW9yeSIsCiAgICAgICAgICBkYXRhOiBbCiAgICAgICAgICAgIHsgeDogbmV3IERhdGUoRGF0ZS5ub3coKSAtIDNlNSkudG9JU09TdHJpbmcoKSwgeTogNDUgfSwKICAgICAgICAgICAgeyB4OiBuZXcgRGF0ZShEYXRlLm5vdygpIC0gMjRlNCkudG9JU09TdHJpbmcoKSwgeTogNDggfSwKICAgICAgICAgICAgeyB4OiBuZXcgRGF0ZShEYXRlLm5vdygpIC0gMThlNCkudG9JU09TdHJpbmcoKSwgeTogNDYgfSwKICAgICAgICAgICAgeyB4OiBuZXcgRGF0ZShEYXRlLm5vdygpIC0gMTJlNCkudG9JU09TdHJpbmcoKSwgeTogNTIgfSwKICAgICAgICAgICAgeyB4OiBuZXcgRGF0ZShEYXRlLm5vdygpIC0gNmU0KS50b0lTT1N0cmluZygpLCB5OiA1MCB9LAogICAgICAgICAgICB7IHg6ICgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKSwgeTogNTUgfQogICAgICAgICAgXQogICAgICAgIH0KICAgICAgXQogICAgfQogIH07CiAgY29uc3QgaW5pdGlhbEZvcm1hdHRlcnMgPSB7CiAgICBzeXN0ZW06ICh2YWwpID0+IGAke3ZhbH0lYAogIH07CiAgcmV0dXJuIGIyYAogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICAgIGNvbnN0IGNoYXJ0RWxlbWVudCA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiI21haW4tY2hhcnQiKTsKICAgIGNvbnN0IGNvbm5lY3Rpb25zQ2hhcnRFbGVtZW50ID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjY29ubmVjdGlvbnMtY2hhcnQiKTsKICAgIGxldCBpbnRlcnZhbElkOwogICAgbGV0IGNvbm5lY3Rpb25zSW50ZXJ2YWxJZDsKICAgIGxldCBjdXJyZW50RGF0YXNldCA9ICJzeXN0ZW0iOwogICAgY29uc3QgZm9ybWF0dGVyczIgPSB7CiAgICAgIHN5c3RlbTogKHZhbCkgPT4gYCR7dmFsfSVgLAogICAgICBuZXR3b3JrOiAodmFsKSA9PiBgJHt2YWx9IE1icHNgLAogICAgICBzYWxlczogKHZhbCkgPT4gYCQke3ZhbC50b0xvY2FsZVN0cmluZygpfWAKICAgIH07CiAgICBjb25zdCBUSU1FX1dJTkRPVyA9IDIgKiA2MCAqIDFlMzsKICAgIGNvbnN0IFVQREFURV9JTlRFUlZBTCA9IDFlMzsKICAgIGNvbnN0IERBVEFfUE9JTlRfSU5URVJWQUwgPSA1ZTM7CiAgICBsZXQgcHJldmlvdXNWYWx1ZXMgPSB7CiAgICAgIGNwdTogMzAsCiAgICAgIG1lbW9yeTogNTAsCiAgICAgIGRvd25sb2FkOiAxNTAsCiAgICAgIHVwbG9hZDogMzAsCiAgICAgIGNvbm5lY3Rpb25zOiAxNTAKICAgIH07CiAgICBjb25zdCBnZW5lcmF0ZUluaXRpYWxEYXRhID0gKGJhc2VWYWx1ZSwgdmFyaWFuY2UsIGludGVydmFsMyA9IERBVEFfUE9JTlRfSU5URVJWQUwpID0+IHsKICAgICAgY29uc3QgZGF0YSA9IFtdOwogICAgICBjb25zdCBub3cyID0gRGF0ZS5ub3coKTsKICAgICAgY29uc3QgcG9pbnRDb3VudCA9IE1hdGguZmxvb3IoVElNRV9XSU5ET1cgLyBpbnRlcnZhbDMpOwogICAgICBmb3IgKGxldCBpMTEgPSBwb2ludENvdW50OyBpMTEgPj0gMDsgaTExLS0pIHsKICAgICAgICBjb25zdCB0aW1lc3RhbXAyID0gbmV3IERhdGUobm93MiAtIGkxMSAqIGludGVydmFsMykudG9JU09TdHJpbmcoKTsKICAgICAgICBjb25zdCB2YWx1ZTIgPSBiYXNlVmFsdWUgKyAoTWF0aC5yYW5kb20oKSAtIDAuNSkgKiB2YXJpYW5jZTsKICAgICAgICBkYXRhLnB1c2goeyB4OiB0aW1lc3RhbXAyLCB5OiBNYXRoLnJvdW5kKHZhbHVlMikgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGRhdGE7CiAgICB9OwogICAgY29uc3QgZGF0YXNldHMgPSB7CiAgICAgIHN5c3RlbTogewogICAgICAgIGxhYmVsOiAiU3lzdGVtIFVzYWdlICglKSIsCiAgICAgICAgc2VyaWVzOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIG5hbWU6ICJDUFUiLAogICAgICAgICAgICBkYXRhOiBnZW5lcmF0ZUluaXRpYWxEYXRhKHByZXZpb3VzVmFsdWVzLmNwdSwgMTApCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiTWVtb3J5IiwKICAgICAgICAgICAgZGF0YTogZ2VuZXJhdGVJbml0aWFsRGF0YShwcmV2aW91c1ZhbHVlcy5tZW1vcnksIDgpCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICBuZXR3b3JrOiB7CiAgICAgICAgbGFiZWw6ICJOZXR3b3JrIFRyYWZmaWMgKE1icHMpIiwKICAgICAgICBzZXJpZXM6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgbmFtZTogIkRvd25sb2FkIiwKICAgICAgICAgICAgZGF0YTogZ2VuZXJhdGVJbml0aWFsRGF0YShwcmV2aW91c1ZhbHVlcy5kb3dubG9hZCwgMzApCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiVXBsb2FkIiwKICAgICAgICAgICAgZGF0YTogZ2VuZXJhdGVJbml0aWFsRGF0YShwcmV2aW91c1ZhbHVlcy51cGxvYWQsIDEwKQogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfSwKICAgICAgc2FsZXM6IHsKICAgICAgICBsYWJlbDogIlNhbGVzIEFuYWx5dGljcyIsCiAgICAgICAgc2VyaWVzOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIG5hbWU6ICJSZXZlbnVlIiwKICAgICAgICAgICAgZGF0YTogWwogICAgICAgICAgICAgIHsgeDogIjIwMjUtMDEtMDEiLCB5OiA0NWUzIH0sCiAgICAgICAgICAgICAgeyB4OiAiMjAyNS0wMS0wMiIsIHk6IDUyZTMgfSwKICAgICAgICAgICAgICB7IHg6ICIyMDI1LTAxLTAzIiwgeTogNDhlMyB9LAogICAgICAgICAgICAgIHsgeDogIjIwMjUtMDEtMDQiLCB5OiA2MWUzIH0sCiAgICAgICAgICAgICAgeyB4OiAiMjAyNS0wMS0wNSIsIHk6IDU4ZTMgfSwKICAgICAgICAgICAgICB7IHg6ICIyMDI1LTAxLTA2IiwgeTogNjVlMyB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIG5hbWU6ICJQcm9maXQiLAogICAgICAgICAgICBkYXRhOiBbCiAgICAgICAgICAgICAgeyB4OiAiMjAyNS0wMS0wMSIsIHk6IDEyZTMgfSwKICAgICAgICAgICAgICB7IHg6ICIyMDI1LTAxLTAyIiwgeTogMTRlMyB9LAogICAgICAgICAgICAgIHsgeDogIjIwMjUtMDEtMDMiLCB5OiAxMWUzIH0sCiAgICAgICAgICAgICAgeyB4OiAiMjAyNS0wMS0wNCIsIHk6IDE4ZTMgfSwKICAgICAgICAgICAgICB7IHg6ICIyMDI1LTAxLTA1IiwgeTogMTZlMyB9LAogICAgICAgICAgICAgIHsgeDogIjIwMjUtMDEtMDYiLCB5OiAyZTQgfQogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9CiAgICB9OwogICAgY29uc3QgZ2V0TmV4dFZhbHVlID0gKGN1cnJlbnQsIG1pbjMsIG1heDMsIG1heENoYW5nZSA9IDUpID0+IHsKICAgICAgY29uc3QgY2hhbmdlID0gKE1hdGgucmFuZG9tKCkgLSAwLjUpICogbWF4Q2hhbmdlICogMjsKICAgICAgbGV0IG5ld1ZhbHVlID0gY3VycmVudCArIGNoYW5nZTsKICAgICAgY29uc3QgY2VudGVyID0gKG1pbjMgKyBtYXgzKSAvIDI7CiAgICAgIGNvbnN0IHByZXNzdXJlID0gKGNlbnRlciAtIG5ld1ZhbHVlKSAqIDAuMTsKICAgICAgbmV3VmFsdWUgKz0gcHJlc3N1cmU7CiAgICAgIG5ld1ZhbHVlID0gTWF0aC5tYXgobWluMywgTWF0aC5taW4obWF4MywgbmV3VmFsdWUpKTsKICAgICAgcmV0dXJuIE1hdGgucm91bmQobmV3VmFsdWUpOwogICAgfTsKICAgIGxldCBsYXN0RGF0YVBvaW50VGltZSA9IERhdGUubm93KCk7CiAgICBsZXQgY29ubmVjdGlvbnNMYXN0VXBkYXRlID0gRGF0ZS5ub3coKTsKICAgIGNvbnN0IGFkZFJlYWx0aW1lRGF0YSA9ICgpID0+IHsKICAgICAgaWYgKCFjaGFydEVsZW1lbnQpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBub3cyID0gRGF0ZS5ub3coKTsKICAgICAgY29uc3Qgc2hvdWxkQWRkUG9pbnQgPSBub3cyIC0gbGFzdERhdGFQb2ludFRpbWUgPj0gREFUQV9QT0lOVF9JTlRFUlZBTDsKICAgICAgaWYgKHNob3VsZEFkZFBvaW50KSB7CiAgICAgICAgbGFzdERhdGFQb2ludFRpbWUgPSBub3cyOwogICAgICAgIGNvbnN0IG5ld1RpbWVzdGFtcCA9IG5ldyBEYXRlKG5vdzIpLnRvSVNPU3RyaW5nKCk7CiAgICAgICAgaWYgKGN1cnJlbnREYXRhc2V0ID09PSAic3lzdGVtIikgewogICAgICAgICAgcHJldmlvdXNWYWx1ZXMuY3B1ID0gZ2V0TmV4dFZhbHVlKHByZXZpb3VzVmFsdWVzLmNwdSwgMjAsIDUwLCAzKTsKICAgICAgICAgIHByZXZpb3VzVmFsdWVzLm1lbW9yeSA9IGdldE5leHRWYWx1ZShwcmV2aW91c1ZhbHVlcy5tZW1vcnksIDQwLCA3MCwgMik7CiAgICAgICAgICBjb25zdCBjdXJyZW50U2VyaWVzID0gY2hhcnRFbGVtZW50LmNoYXJ0U2VyaWVzLm1hcCgoc2VyaWVzLCBpbmRleDIpID0+ICh7CiAgICAgICAgICAgIG5hbWU6IHNlcmllcy5uYW1lLAogICAgICAgICAgICBkYXRhOiBbCiAgICAgICAgICAgICAgLi4uc2VyaWVzLmRhdGEsCiAgICAgICAgICAgICAgaW5kZXgyID09PSAwID8geyB4OiBuZXdUaW1lc3RhbXAsIHk6IHByZXZpb3VzVmFsdWVzLmNwdSB9IDogeyB4OiBuZXdUaW1lc3RhbXAsIHk6IHByZXZpb3VzVmFsdWVzLm1lbW9yeSB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0pKTsKICAgICAgICAgIGNoYXJ0RWxlbWVudC51cGRhdGVTZXJpZXMoY3VycmVudFNlcmllcywgZmFsc2UpOwogICAgICAgIH0gZWxzZSBpZiAoY3VycmVudERhdGFzZXQgPT09ICJuZXR3b3JrIikgewogICAgICAgICAgcHJldmlvdXNWYWx1ZXMuZG93bmxvYWQgPSBnZXROZXh0VmFsdWUocHJldmlvdXNWYWx1ZXMuZG93bmxvYWQsIDEwMCwgMjAwLCAxMCk7CiAgICAgICAgICBwcmV2aW91c1ZhbHVlcy51cGxvYWQgPSBnZXROZXh0VmFsdWUocHJldmlvdXNWYWx1ZXMudXBsb2FkLCAyMCwgNTAsIDUpOwogICAgICAgICAgY29uc3QgY3VycmVudFNlcmllcyA9IGNoYXJ0RWxlbWVudC5jaGFydFNlcmllcy5tYXAoKHNlcmllcywgaW5kZXgyKSA9PiAoewogICAgICAgICAgICBuYW1lOiBzZXJpZXMubmFtZSwKICAgICAgICAgICAgZGF0YTogWwogICAgICAgICAgICAgIC4uLnNlcmllcy5kYXRhLAogICAgICAgICAgICAgIGluZGV4MiA9PT0gMCA/IHsgeDogbmV3VGltZXN0YW1wLCB5OiBwcmV2aW91c1ZhbHVlcy5kb3dubG9hZCB9IDogeyB4OiBuZXdUaW1lc3RhbXAsIHk6IHByZXZpb3VzVmFsdWVzLnVwbG9hZCB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0pKTsKICAgICAgICAgIGNoYXJ0RWxlbWVudC51cGRhdGVTZXJpZXMoY3VycmVudFNlcmllcywgZmFsc2UpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGNvbnN0IHVwZGF0ZUNvbm5lY3Rpb25zID0gKCkgPT4gewogICAgICBpZiAoIWNvbm5lY3Rpb25zQ2hhcnRFbGVtZW50KQogICAgICAgIHJldHVybjsKICAgICAgY29uc3Qgbm93MiA9IERhdGUubm93KCk7CiAgICAgIGNvbnN0IG5ld1RpbWVzdGFtcCA9IG5ldyBEYXRlKG5vdzIpLnRvSVNPU3RyaW5nKCk7CiAgICAgIGNvbnN0IGNoYW5nZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDIxKSAtIDEwOwogICAgICBwcmV2aW91c1ZhbHVlcy5jb25uZWN0aW9ucyA9IE1hdGgubWF4KDUwLCBNYXRoLm1pbigzMDAsIHByZXZpb3VzVmFsdWVzLmNvbm5lY3Rpb25zICsgY2hhbmdlKSk7CiAgICAgIGNvbnN0IGN1cnJlbnRTZXJpZXMgPSBjb25uZWN0aW9uc0NoYXJ0RWxlbWVudC5jaGFydFNlcmllczsKICAgICAgY29uc3QgbmV3RGF0YSA9IFt7CiAgICAgICAgbmFtZTogY3VycmVudFNlcmllc1swXT8ubmFtZSB8fCAiQ29ubmVjdGlvbnMiLAogICAgICAgIGRhdGE6IFsKICAgICAgICAgIC4uLmN1cnJlbnRTZXJpZXNbMF0/LmRhdGEgfHwgW10sCiAgICAgICAgICB7IHg6IG5ld1RpbWVzdGFtcCwgeTogcHJldmlvdXNWYWx1ZXMuY29ubmVjdGlvbnMgfQogICAgICAgIF0KICAgICAgfV07CiAgICAgIGNvbm5lY3Rpb25zQ2hhcnRFbGVtZW50LnVwZGF0ZVNlcmllcyhuZXdEYXRhLCBmYWxzZSk7CiAgICB9OwogICAgY29uc3Qgc3dpdGNoRGF0YXNldCA9IChuYW1lKSA9PiB7CiAgICAgIGN1cnJlbnREYXRhc2V0ID0gbmFtZTsKICAgICAgY29uc3QgZGF0YXNldCA9IGRhdGFzZXRzW25hbWVdOwogICAgICBjaGFydEVsZW1lbnQubGFiZWwgPSBkYXRhc2V0LmxhYmVsOwogICAgICBjaGFydEVsZW1lbnQuc2VyaWVzID0gZGF0YXNldC5zZXJpZXM7CiAgICAgIGNoYXJ0RWxlbWVudC55QXhpc0Zvcm1hdHRlciA9IGZvcm1hdHRlcnMyW25hbWVdOwogICAgICBpZiAobmFtZSA9PT0gInN5c3RlbSIpIHsKICAgICAgICBjaGFydEVsZW1lbnQueUF4aXNTY2FsaW5nID0gInBlcmNlbnRhZ2UiOwogICAgICAgIGNoYXJ0RWxlbWVudC55QXhpc01heCA9IDEwMDsKICAgICAgfSBlbHNlIGlmIChuYW1lID09PSAibmV0d29yayIpIHsKICAgICAgICBjaGFydEVsZW1lbnQueUF4aXNTY2FsaW5nID0gImR5bmFtaWMiOwogICAgICB9IGVsc2UgewogICAgICAgIGNoYXJ0RWxlbWVudC55QXhpc1NjYWxpbmcgPSAiZHluYW1pYyI7CiAgICAgIH0KICAgICAgbGFzdERhdGFQb2ludFRpbWUgPSBEYXRlLm5vdygpIC0gREFUQV9QT0lOVF9JTlRFUlZBTDsKICAgIH07CiAgICBjb25zdCBzdGFydFJlYWx0aW1lID0gKCkgPT4gewogICAgICBpZiAoIWludGVydmFsSWQgJiYgKGN1cnJlbnREYXRhc2V0ID09PSAic3lzdGVtIiB8fCBjdXJyZW50RGF0YXNldCA9PT0gIm5ldHdvcmsiKSkgewogICAgICAgIGNoYXJ0RWxlbWVudC5yZWFsdGltZU1vZGUgPSB0cnVlOwogICAgICAgIGludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4gYWRkUmVhbHRpbWVEYXRhKCksIERBVEFfUE9JTlRfSU5URVJWQUwpOwogICAgICB9CiAgICAgIGlmICghY29ubmVjdGlvbnNJbnRlcnZhbElkKSB7CiAgICAgICAgY29ubmVjdGlvbnNDaGFydEVsZW1lbnQucmVhbHRpbWVNb2RlID0gdHJ1ZTsKICAgICAgICBjb25uZWN0aW9uc0ludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4gdXBkYXRlQ29ubmVjdGlvbnMoKSwgVVBEQVRFX0lOVEVSVkFMKTsKICAgICAgfQogICAgfTsKICAgIGNvbnN0IHN0b3BSZWFsdGltZSA9ICgpID0+IHsKICAgICAgaWYgKGludGVydmFsSWQpIHsKICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTsKICAgICAgICBpbnRlcnZhbElkID0gbnVsbDsKICAgICAgICBjaGFydEVsZW1lbnQucmVhbHRpbWVNb2RlID0gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGNvbm5lY3Rpb25zSW50ZXJ2YWxJZCkgewogICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKGNvbm5lY3Rpb25zSW50ZXJ2YWxJZCk7CiAgICAgICAgY29ubmVjdGlvbnNJbnRlcnZhbElkID0gbnVsbDsKICAgICAgICBjb25uZWN0aW9uc0NoYXJ0RWxlbWVudC5yZWFsdGltZU1vZGUgPSBmYWxzZTsKICAgICAgfQogICAgfTsKICAgIGNvbnN0IHJhbmRvbWl6ZURhdGEgPSAoKSA9PiB7CiAgICAgIGlmIChjdXJyZW50RGF0YXNldCA9PT0gInN5c3RlbSIpIHsKICAgICAgICBwcmV2aW91c1ZhbHVlcy5jcHUgPSBNYXRoLnJhbmRvbSgpID4gMC41ID8gODUgOiAyNTsKICAgICAgICBwcmV2aW91c1ZhbHVlcy5tZW1vcnkgPSBNYXRoLnJhbmRvbSgpID4gMC41ID8gODAgOiA0NTsKICAgICAgfSBlbHNlIGlmIChjdXJyZW50RGF0YXNldCA9PT0gIm5ldHdvcmsiKSB7CiAgICAgICAgcHJldmlvdXNWYWx1ZXMuZG93bmxvYWQgPSBNYXRoLnJhbmRvbSgpID4gMC41ID8gMjUwIDogMTAwOwogICAgICAgIHByZXZpb3VzVmFsdWVzLnVwbG9hZCA9IE1hdGgucmFuZG9tKCkgPiAwLjUgPyA4MCA6IDIwOwogICAgICB9CiAgICAgIHByZXZpb3VzVmFsdWVzLmNvbm5lY3Rpb25zID0gTWF0aC5yYW5kb20oKSA+IDAuNSA/IDI4MCA6IDgwOwogICAgICBsYXN0RGF0YVBvaW50VGltZSA9IDA7CiAgICAgIGNvbm5lY3Rpb25zTGFzdFVwZGF0ZSA9IDA7CiAgICB9OwogICAgY29uc3QgYnV0dG9ucyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1idXR0b24iKTsKICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7CiAgICAgIGNvbnN0IHRleHQ5ID0gYnV0dG9uLnRleHRDb250ZW50Py50cmltKCk7CiAgICAgIGlmICh0ZXh0OSA9PT0gIlN5c3RlbSBVc2FnZSIpIHsKICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBzd2l0Y2hEYXRhc2V0KCJzeXN0ZW0iKSk7CiAgICAgIH0gZWxzZSBpZiAodGV4dDkgPT09ICJOZXR3b3JrIFRyYWZmaWMiKSB7CiAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gc3dpdGNoRGF0YXNldCgibmV0d29yayIpKTsKICAgICAgfSBlbHNlIGlmICh0ZXh0OSA9PT0gIlNhbGVzIERhdGEiKSB7CiAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gc3dpdGNoRGF0YXNldCgic2FsZXMiKSk7CiAgICAgIH0gZWxzZSBpZiAodGV4dDkgPT09ICJTdGFydCBMaXZlIikgewogICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHN0YXJ0UmVhbHRpbWUoKSk7CiAgICAgIH0gZWxzZSBpZiAodGV4dDkgPT09ICJTdG9wIExpdmUiKSB7CiAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gc3RvcFJlYWx0aW1lKCkpOwogICAgICB9IGVsc2UgaWYgKHRleHQ5ID09PSAiU3Bpa2UgVmFsdWVzIikgewogICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHJhbmRvbWl6ZURhdGEoKSk7CiAgICAgIH0KICAgIH0pOwogICAgY29uc3QgdXBkYXRlQnV0dG9uU3RhdGVzID0gKCkgPT4gewogICAgICBjb25zdCBidXR0b25zMiA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1idXR0b24iKTsKICAgICAgYnV0dG9uczIuZm9yRWFjaCgoYnV0dG9uKSA9PiB7CiAgICAgICAgY29uc3QgdGV4dDkgPSBidXR0b24udGV4dENvbnRlbnQ/LnRyaW0oKTsKICAgICAgICBpZiAodGV4dDkgPT09ICJTeXN0ZW0gVXNhZ2UiKSB7CiAgICAgICAgICBidXR0b24udHlwZSA9IGN1cnJlbnREYXRhc2V0ID09PSAic3lzdGVtIiA/ICJoaWdobGlnaHRlZCIgOiAibm9ybWFsIjsKICAgICAgICB9IGVsc2UgaWYgKHRleHQ5ID09PSAiTmV0d29yayBUcmFmZmljIikgewogICAgICAgICAgYnV0dG9uLnR5cGUgPSBjdXJyZW50RGF0YXNldCA9PT0gIm5ldHdvcmsiID8gImhpZ2hsaWdodGVkIiA6ICJub3JtYWwiOwogICAgICAgIH0gZWxzZSBpZiAodGV4dDkgPT09ICJTYWxlcyBEYXRhIikgewogICAgICAgICAgYnV0dG9uLnR5cGUgPSBjdXJyZW50RGF0YXNldCA9PT0gInNhbGVzIiA/ICJoaWdobGlnaHRlZCIgOiAibm9ybWFsIjsKICAgICAgICB9CiAgICAgIH0pOwogICAgfTsKICAgIGNoYXJ0RWxlbWVudC5yb2xsaW5nV2luZG93ID0gVElNRV9XSU5ET1c7CiAgICBjaGFydEVsZW1lbnQucmVhbHRpbWVNb2RlID0gZmFsc2U7CiAgICBjaGFydEVsZW1lbnQueUF4aXNTY2FsaW5nID0gInBlcmNlbnRhZ2UiOwogICAgY2hhcnRFbGVtZW50LnlBeGlzTWF4ID0gMTAwOwogICAgY2hhcnRFbGVtZW50LmF1dG9TY3JvbGxJbnRlcnZhbCA9IDFlMzsKICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICBjaGFydEVsZW1lbnQudXBkYXRlVGltZVdpbmRvdygpOwogICAgfSwgMTAwKTsKICAgIGNvbnN0IG9yaWdpbmFsU3dpdGNoRGF0YXNldCA9IHN3aXRjaERhdGFzZXQ7CiAgICBjb25zdCBzd2l0Y2hEYXRhc2V0V2l0aEJ1dHRvblVwZGF0ZSA9IChuYW1lKSA9PiB7CiAgICAgIG9yaWdpbmFsU3dpdGNoRGF0YXNldChuYW1lKTsKICAgICAgdXBkYXRlQnV0dG9uU3RhdGVzKCk7CiAgICB9OwogICAgYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHsKICAgICAgY29uc3QgdGV4dDkgPSBidXR0b24udGV4dENvbnRlbnQ/LnRyaW0oKTsKICAgICAgaWYgKHRleHQ5ID09PSAiU3lzdGVtIFVzYWdlIikgewogICAgICAgIGJ1dHRvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHN3aXRjaERhdGFzZXQoInN5c3RlbSIpKTsKICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBzd2l0Y2hEYXRhc2V0V2l0aEJ1dHRvblVwZGF0ZSgic3lzdGVtIikpOwogICAgICB9IGVsc2UgaWYgKHRleHQ5ID09PSAiTmV0d29yayBUcmFmZmljIikgewogICAgICAgIGJ1dHRvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHN3aXRjaERhdGFzZXQoIm5ldHdvcmsiKSk7CiAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gc3dpdGNoRGF0YXNldFdpdGhCdXR0b25VcGRhdGUoIm5ldHdvcmsiKSk7CiAgICAgIH0gZWxzZSBpZiAodGV4dDkgPT09ICJTYWxlcyBEYXRhIikgewogICAgICAgIGJ1dHRvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHN3aXRjaERhdGFzZXQoInNhbGVzIikpOwogICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHN3aXRjaERhdGFzZXRXaXRoQnV0dG9uVXBkYXRlKCJzYWxlcyIpKTsKICAgICAgfQogICAgfSk7CiAgICBpZiAoY29ubmVjdGlvbnNDaGFydEVsZW1lbnQpIHsKICAgICAgY29uc3QgaW5pdGlhbENvbm5lY3Rpb25zRGF0YSA9IGdlbmVyYXRlSW5pdGlhbERhdGEocHJldmlvdXNWYWx1ZXMuY29ubmVjdGlvbnMsIDMwLCBVUERBVEVfSU5URVJWQUwpOwogICAgICBjb25uZWN0aW9uc0NoYXJ0RWxlbWVudC5zZXJpZXMgPSBbewogICAgICAgIG5hbWU6ICJDb25uZWN0aW9ucyIsCiAgICAgICAgZGF0YTogaW5pdGlhbENvbm5lY3Rpb25zRGF0YQogICAgICB9XTsKICAgICAgY29ubmVjdGlvbnNDaGFydEVsZW1lbnQucm9sbGluZ1dpbmRvdyA9IFRJTUVfV0lORE9XOwogICAgICBjb25uZWN0aW9uc0NoYXJ0RWxlbWVudC5yZWFsdGltZU1vZGUgPSBmYWxzZTsKICAgICAgY29ubmVjdGlvbnNDaGFydEVsZW1lbnQueUF4aXNTY2FsaW5nID0gImZpeGVkIjsKICAgICAgY29ubmVjdGlvbnNDaGFydEVsZW1lbnQueUF4aXNNYXggPSAzNTA7CiAgICAgIGNvbm5lY3Rpb25zQ2hhcnRFbGVtZW50LmF1dG9TY3JvbGxJbnRlcnZhbCA9IDFlMzsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgY29ubmVjdGlvbnNDaGFydEVsZW1lbnQudXBkYXRlVGltZVdpbmRvdygpOwogICAgICB9LCAxMDApOwogICAgfQogIH19PgogICAgICA8c3R5bGU+CiAgICAgICAgJHtpYAogICAgICAgIC5kZW1vQm94IHsKICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NSUpIiwgImhzbCgwIDAlIDklKSIpfTsKICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgcGFkZGluZzogNDBweDsKICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMjRweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmNvbnRyb2xzIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgICBnYXA6IDEycHg7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5jaGFydC1jb250YWluZXIgewogICAgICAgICAgZmxleDogMTsKICAgICAgICAgIG1pbi1oZWlnaHQ6IDQwMHB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuaW5mbyB7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA1Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA1NS4xJSkiKX07CiAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCAnR2Vpc3QgU2FucycsIHNhbnMtc2VyaWY7CiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7CiAgICAgICAgfQogICAgICBgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9ImRlbW9Cb3giPgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9scyI+CiAgICAgICAgPGRlZXMtYnV0dG9uLWdyb3VwIGxhYmVsPSJEYXRhc2V0OiI+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iaGlnaGxpZ2h0ZWQiPlN5c3RlbSBVc2FnZTwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24+TmV0d29yayBUcmFmZmljPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbj5TYWxlcyBEYXRhPC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2RlZXMtYnV0dG9uLWdyb3VwPgogICAgICAgIAogICAgICAgIDxkZWVzLWJ1dHRvbi1ncm91cCBsYWJlbD0iUmVhbC10aW1lOiI+CiAgICAgICAgICA8ZGVlcy1idXR0b24+U3RhcnQgTGl2ZTwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24+U3RvcCBMaXZlPC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2RlZXMtYnV0dG9uLWdyb3VwPgogICAgICAgIAogICAgICAgIDxkZWVzLWJ1dHRvbi1ncm91cCBsYWJlbD0iQWN0aW9uczoiPgogICAgICAgICAgPGRlZXMtYnV0dG9uPlNwaWtlIFZhbHVlczwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kZWVzLWJ1dHRvbi1ncm91cD4KICAgICAgPC9kaXY+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJjaGFydC1jb250YWluZXIiPgogICAgICAgIDxkZWVzLWNoYXJ0LWFyZWEKICAgICAgICAgIGlkPSJtYWluLWNoYXJ0IgogICAgICAgICAgLmxhYmVsPSR7aW5pdGlhbERhdGFzZXRzLnN5c3RlbS5sYWJlbH0KICAgICAgICAgIC5zZXJpZXM9JHtpbml0aWFsRGF0YXNldHMuc3lzdGVtLnNlcmllc30KICAgICAgICAgIC55QXhpc0Zvcm1hdHRlcj0ke2luaXRpYWxGb3JtYXR0ZXJzLnN5c3RlbX0KICAgICAgICA+PC9kZWVzLWNoYXJ0LWFyZWE+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iY2hhcnQtY29udGFpbmVyIiBzdHlsZT0ibWFyZ2luLXRvcDogMjBweDsiPgogICAgICAgIDxkZWVzLWNoYXJ0LWFyZWEKICAgICAgICAgIGlkPSJjb25uZWN0aW9ucy1jaGFydCIKICAgICAgICAgIC5sYWJlbD0keyJBY3RpdmUgQ29ubmVjdGlvbnMifQogICAgICAgICAgLnNlcmllcz0ke1t7CiAgICBuYW1lOiAiQ29ubmVjdGlvbnMiLAogICAgZGF0YTogW10KICB9XX0KICAgICAgICAgIC55QXhpc0Zvcm1hdHRlcj0keyh2YWwpID0+IGAke3ZhbH1gfQogICAgICAgID48L2RlZXMtY2hhcnQtYXJlYT4KICAgICAgPC9kaXY+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJpbmZvIj4KICAgICAgICBSZWFsLXRpbWUgbW9uaXRvcmluZyB3aXRoIDItbWludXRlIHJvbGxpbmcgd2luZG93IOKAoiAKICAgICAgICBVcGRhdGVzIGV2ZXJ5IHNlY29uZCB3aXRoIHNtb290aCB2YWx1ZSB0cmFuc2l0aW9ucyDigKIgCiAgICAgICAgQ2xpY2sgJ1NwaWtlIFZhbHVlcycgdG8gc2ltdWxhdGUgbG9hZCBzcGlrZXMKICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICBgOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWNoYXJ0L2RlZXMtY2hhcnQtYXJlYS9zdHlsZXMuanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGNoYXJ0QXJlYVN0eWxlcyA9IFsKICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsICdSb2JvdG8nLCBzYW5zLXNlcmlmOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMy45JSkiLCAiaHNsKDAgMCUgOTglKSIpfTsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQogICAgICAubWFpbmJveCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogNDAwcHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDMuOSUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuY2hhcnRUaXRsZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgcGFkZGluZzogMTZweCAyNHB4OwogICAgICAgIHotaW5kZXg6IDEwOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMjAlKSIsICJoc2woMCAwJSA2My45JSkiKX07CiAgICAgIH0KICAgICAgLmNoYXJ0Q29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgbGVmdDogMHB4OwogICAgICAgIGJvdHRvbTogMHB4OwogICAgICAgIHJpZ2h0OiAwcHg7CiAgICAgICAgcGFkZGluZzogNDRweCAxNnB4IDE2cHggMHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IC8qIEVuc3VyZSBjb250YWluZXIgZG9lc24ndCBvdmVycmlkZSBjaGFydCBiYWNrZ3JvdW5kICovCiAgICAgIH0KICAgICAgCiAgICAgIC8qIEFwZXhDaGFydHMgdGhlbWUgb3ZlcnJpZGVzICovCiAgICAgIC5hcGV4Y2hhcnRzLWNhbnZhcyB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLmFwZXhjaGFydHMtaW5uZXIgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5hcGV4Y2hhcnRzLWdyYXBoaWNhbCB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgICAgfQogICAgYApdOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWNoYXJ0L2RlZXMtY2hhcnQtYXJlYS90ZW1wbGF0ZS5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgcmVuZGVyQ2hhcnRBcmVhID0gKGNvbXBvbmVudCkgPT4gewogIHJldHVybiBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJtYWluYm94Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNoYXJ0VGl0bGUiPiR7Y29tcG9uZW50LmxhYmVsfTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iY2hhcnRDb250YWluZXIiPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICBgOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWNoYXJ0L2RlZXMtY2hhcnQtYXJlYS9jb21wb25lbnQuanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF9kaXN0X3RzMjUoKTsKaW5pdF9zZXJ2aWNlcygpOwp2YXIgX19lc0RlY29yYXRlNDYgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczQ3ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzQ2hhcnRBcmVhID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1jaGFydC1hcmVhIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfY2hhcnRfZGVjb3JhdG9yczsKICBsZXQgX2NoYXJ0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2hhcnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xhYmVsX2RlY29yYXRvcnM7CiAgbGV0IF9sYWJlbF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZXJpZXNfZGVjb3JhdG9yczsKICBsZXQgX3Nlcmllc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nlcmllc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfeUF4aXNGb3JtYXR0ZXJfZGVjb3JhdG9yczsKICBsZXQgX3lBeGlzRm9ybWF0dGVyX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfeUF4aXNGb3JtYXR0ZXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JvbGxpbmdXaW5kb3dfZGVjb3JhdG9yczsKICBsZXQgX3JvbGxpbmdXaW5kb3dfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yb2xsaW5nV2luZG93X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZWFsdGltZU1vZGVfZGVjb3JhdG9yczsKICBsZXQgX3JlYWx0aW1lTW9kZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlYWx0aW1lTW9kZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfeUF4aXNTY2FsaW5nX2RlY29yYXRvcnM7CiAgbGV0IF95QXhpc1NjYWxpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF95QXhpc1NjYWxpbmdfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3lBeGlzTWF4X2RlY29yYXRvcnM7CiAgbGV0IF95QXhpc01heF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3lBeGlzTWF4X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdXRvU2Nyb2xsSW50ZXJ2YWxfZGVjb3JhdG9yczsKICBsZXQgX2F1dG9TY3JvbGxJbnRlcnZhbF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2F1dG9TY3JvbGxJbnRlcnZhbF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzQ2hhcnRBcmVhMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2NoYXJ0X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9sYWJlbF9kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfc2VyaWVzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF95QXhpc0Zvcm1hdHRlcl9kZWNvcmF0b3JzID0gW241KHsgYXR0cmlidXRlOiBmYWxzZSB9KV07CiAgICAgIF9yb2xsaW5nV2luZG93X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfcmVhbHRpbWVNb2RlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3lBeGlzU2NhbGluZ19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3lBeGlzTWF4X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfYXV0b1Njcm9sbEludGVydmFsX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfX2VzRGVjb3JhdGU0Nih0aGlzLCBudWxsLCBfY2hhcnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY2hhcnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNoYXJ0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNoYXJ0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jaGFydCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jaGFydF9pbml0aWFsaXplcnMsIF9jaGFydF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ2KHRoaXMsIG51bGwsIF9sYWJlbF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsYWJlbCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibGFiZWwiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubGFiZWwsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxhYmVsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xhYmVsX2luaXRpYWxpemVycywgX2xhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDYodGhpcywgbnVsbCwgX3Nlcmllc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZXJpZXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlcmllcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZXJpZXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlcmllcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZXJpZXNfaW5pdGlhbGl6ZXJzLCBfc2VyaWVzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDYodGhpcywgbnVsbCwgX3lBeGlzRm9ybWF0dGVyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInlBeGlzRm9ybWF0dGVyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ5QXhpc0Zvcm1hdHRlciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai55QXhpc0Zvcm1hdHRlciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoueUF4aXNGb3JtYXR0ZXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfeUF4aXNGb3JtYXR0ZXJfaW5pdGlhbGl6ZXJzLCBfeUF4aXNGb3JtYXR0ZXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Nih0aGlzLCBudWxsLCBfcm9sbGluZ1dpbmRvd19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJyb2xsaW5nV2luZG93Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJyb2xsaW5nV2luZG93IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJvbGxpbmdXaW5kb3csIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnJvbGxpbmdXaW5kb3cgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcm9sbGluZ1dpbmRvd19pbml0aWFsaXplcnMsIF9yb2xsaW5nV2luZG93X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDYodGhpcywgbnVsbCwgX3JlYWx0aW1lTW9kZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJyZWFsdGltZU1vZGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInJlYWx0aW1lTW9kZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5yZWFsdGltZU1vZGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnJlYWx0aW1lTW9kZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9yZWFsdGltZU1vZGVfaW5pdGlhbGl6ZXJzLCBfcmVhbHRpbWVNb2RlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDYodGhpcywgbnVsbCwgX3lBeGlzU2NhbGluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ5QXhpc1NjYWxpbmciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInlBeGlzU2NhbGluZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai55QXhpc1NjYWxpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnlBeGlzU2NhbGluZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF95QXhpc1NjYWxpbmdfaW5pdGlhbGl6ZXJzLCBfeUF4aXNTY2FsaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDYodGhpcywgbnVsbCwgX3lBeGlzTWF4X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInlBeGlzTWF4Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ5QXhpc01heCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai55QXhpc01heCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoueUF4aXNNYXggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfeUF4aXNNYXhfaW5pdGlhbGl6ZXJzLCBfeUF4aXNNYXhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Nih0aGlzLCBudWxsLCBfYXV0b1Njcm9sbEludGVydmFsX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImF1dG9TY3JvbGxJbnRlcnZhbCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYXV0b1Njcm9sbEludGVydmFsIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmF1dG9TY3JvbGxJbnRlcnZhbCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYXV0b1Njcm9sbEludGVydmFsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2F1dG9TY3JvbGxJbnRlcnZhbF9pbml0aWFsaXplcnMsIF9hdXRvU2Nyb2xsSW50ZXJ2YWxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0NihudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNDaGFydEFyZWEyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMzMjsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJDaGFydCJdOwogICAgI2NoYXJ0X2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczQ3KHRoaXMsIF9jaGFydF9pbml0aWFsaXplcnMsIHZvaWQgMCk7CiAgICAvLyBpbnN0YW5jZQogICAgZ2V0IGNoYXJ0KCkgewogICAgICByZXR1cm4gdGhpcy4jY2hhcnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjaGFydCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY2hhcnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDcodGhpcywgX2NoYXJ0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Nyh0aGlzLCBfbGFiZWxfaW5pdGlhbGl6ZXJzLCAiVW50aXRsZWQgQ2hhcnQiKSk7CiAgICBnZXQgbGFiZWwoKSB7CiAgICAgIHJldHVybiB0aGlzLiNsYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxhYmVsKHZhbHVlMikgewogICAgICB0aGlzLiNsYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nlcmllc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDcodGhpcywgX2xhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Nyh0aGlzLCBfc2VyaWVzX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBzZXJpZXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZXJpZXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZXJpZXModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nlcmllc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgLy8gT3ZlcnJpZGUgZ2V0dGVyIHRvIHJldHVybiBpbnRlcm5hbCBjaGFydCBkYXRhCiAgICBnZXQgY2hhcnRTZXJpZXMoKSB7CiAgICAgIHJldHVybiB0aGlzLmludGVybmFsQ2hhcnREYXRhLmxlbmd0aCA+IDAgPyB0aGlzLmludGVybmFsQ2hhcnREYXRhIDogdGhpcy5zZXJpZXM7CiAgICB9CiAgICAjeUF4aXNGb3JtYXR0ZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ3KHRoaXMsIF9zZXJpZXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQ3KHRoaXMsIF95QXhpc0Zvcm1hdHRlcl9pbml0aWFsaXplcnMsICh2YWwpID0+IGAke3ZhbH0gTWJwc2ApKTsKICAgIGdldCB5QXhpc0Zvcm1hdHRlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3lBeGlzRm9ybWF0dGVyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgeUF4aXNGb3JtYXR0ZXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3lBeGlzRm9ybWF0dGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcm9sbGluZ1dpbmRvd19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDcodGhpcywgX3lBeGlzRm9ybWF0dGVyX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Nyh0aGlzLCBfcm9sbGluZ1dpbmRvd19pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCByb2xsaW5nV2luZG93KCkgewogICAgICByZXR1cm4gdGhpcy4jcm9sbGluZ1dpbmRvd19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgLy8gMCBtZWFucyBubyByb2xsaW5nIHdpbmRvdwogICAgc2V0IHJvbGxpbmdXaW5kb3codmFsdWUyKSB7CiAgICAgIHRoaXMuI3JvbGxpbmdXaW5kb3dfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNyZWFsdGltZU1vZGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ3KHRoaXMsIF9yb2xsaW5nV2luZG93X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Nyh0aGlzLCBfcmVhbHRpbWVNb2RlX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCByZWFsdGltZU1vZGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNyZWFsdGltZU1vZGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCByZWFsdGltZU1vZGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3JlYWx0aW1lTW9kZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3lBeGlzU2NhbGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDcodGhpcywgX3JlYWx0aW1lTW9kZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDcodGhpcywgX3lBeGlzU2NhbGluZ19pbml0aWFsaXplcnMsICJkeW5hbWljIikpOwogICAgZ2V0IHlBeGlzU2NhbGluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3lBeGlzU2NhbGluZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHlBeGlzU2NhbGluZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jeUF4aXNTY2FsaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjeUF4aXNNYXhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ3KHRoaXMsIF95QXhpc1NjYWxpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQ3KHRoaXMsIF95QXhpc01heF9pbml0aWFsaXplcnMsIDEwMCkpOwogICAgZ2V0IHlBeGlzTWF4KCkgewogICAgICByZXR1cm4gdGhpcy4jeUF4aXNNYXhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIC8vIFVzZWQgd2hlbiB5QXhpc1NjYWxpbmcgaXMgJ2ZpeGVkJyBvciAncGVyY2VudGFnZScKICAgIHNldCB5QXhpc01heCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jeUF4aXNNYXhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhdXRvU2Nyb2xsSW50ZXJ2YWxfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ3KHRoaXMsIF95QXhpc01heF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDcodGhpcywgX2F1dG9TY3JvbGxJbnRlcnZhbF9pbml0aWFsaXplcnMsIDFlMykpOwogICAgZ2V0IGF1dG9TY3JvbGxJbnRlcnZhbCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2F1dG9TY3JvbGxJbnRlcnZhbF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgLy8gQXV0by1zY3JvbGwgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzICgwIHRvIGRpc2FibGUpCiAgICBzZXQgYXV0b1Njcm9sbEludGVydmFsKHZhbHVlMikgewogICAgICB0aGlzLiNhdXRvU2Nyb2xsSW50ZXJ2YWxfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHJlc2l6ZU9ic2VydmVyID0gX19ydW5Jbml0aWFsaXplcnM0Nyh0aGlzLCBfYXV0b1Njcm9sbEludGVydmFsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIHJlc2l6ZVRpbWVvdXQ7CiAgICBpbnRlcm5hbENoYXJ0RGF0YSA9IFtdOwogICAgYXV0b1Njcm9sbFRpbWVyID0gbnVsbDsKICAgIERFQlVHX1JFU0laRSA9IGZhbHNlOwogICAgLy8gU2V0IHRvIHRydWUgdG8gZW5hYmxlIHJlc2l6ZSBkZWJ1Z2dpbmcKICAgIC8vIENoYXJ0IGNvbG9yIHNjaGVtZXMKICAgIENIQVJUX0NPTE9SUyA9IHsKICAgICAgZGFyazogWwogICAgICAgICJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIiwKICAgICAgICAvLyBCbHVlCiAgICAgICAgImhzbCgxNzMuNCA4MC40JSA0MCUpIiwKICAgICAgICAvLyBUZWFsCiAgICAgICAgImhzbCgyODAuMyA4Ny40JSA2Ni43JSkiLAogICAgICAgIC8vIFB1cnBsZQogICAgICAgICJoc2woMjQuNiA5NSUgNTMuMSUpIgogICAgICAgIC8vIE9yYW5nZQogICAgICBdLAogICAgICBsaWdodDogWwogICAgICAgICJoc2woMjIyLjIgNDcuNCUgNTEuMiUpIiwKICAgICAgICAvLyBCbHVlIChzaGFkY24gcHJpbWFyeSkKICAgICAgICAiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlKSIsCiAgICAgICAgLy8gR3JlZW4gKHNoYWRjbiBzdWNjZXNzKQogICAgICAgICJoc2woMjgwLjMgNDcuNyUgNTAuMiUpIiwKICAgICAgICAvLyBQdXJwbGUgKG11dGVkKQogICAgICAgICJoc2woMjAuNSA5MC4yJSA0OC4yJSkiCiAgICAgICAgLy8gT3JhbmdlIChzaGFkY24gZGVzdHJ1Y3RpdmUgdmFyaWFudCkKICAgICAgXQogICAgfTsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBkb210b29sc19lbGVtZW50YmFzaWNfZXhwb3J0cy5zZXR1cCgpOwogICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgICAgICAgaWYgKHRoaXMucmVzaXplVGltZW91dCkgewogICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZW91dCk7CiAgICAgICAgfQogICAgICAgIHRoaXMucmVzaXplVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgIGlmICh0aGlzLmNoYXJ0KSB7CiAgICAgICAgICAgIGlmICh0aGlzLkRFQlVHX1JFU0laRSAmJiBlbnRyaWVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbMF07CiAgICAgICAgICAgICAgY29uc29sZS5sb2coIkRlZXNDaGFydEFyZWEgLSBSZXNpemUgZGV0ZWN0ZWQ6IiwgewogICAgICAgICAgICAgICAgd2lkdGg6IGVudHJ5LmNvbnRlbnRSZWN0LndpZHRoLAogICAgICAgICAgICAgICAgaGVpZ2h0OiBlbnRyeS5jb250ZW50UmVjdC5oZWlnaHQKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnJlc2l6ZUNoYXJ0KCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgMTAwKTsKICAgICAgfSk7CiAgICAgIHRoaXMucmVnaXN0ZXJHYXJiYWdlRnVuY3Rpb24oYXN5bmMgKCkgPT4gewogICAgICAgIGlmICh0aGlzLnJlc2l6ZVRpbWVvdXQpIHsKICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVvdXQpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlcikgewogICAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc3RvcEF1dG9TY3JvbGwoKTsKICAgICAgICBpZiAodGhpcy5jaGFydCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhpcy5jaGFydC5kZXN0cm95KCk7CiAgICAgICAgICAgIHRoaXMuY2hhcnQgPSBudWxsOwogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgZGVzdHJveWluZyBjaGFydDoiLCBlcnJvcik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBpZiAodGhpcy5jaGFydCkgewogICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlMikgPT4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlc29sdmUyKSk7CiAgICAgICAgYXdhaXQgdGhpcy5yZXNpemVDaGFydCgpOwogICAgICB9CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gY2hhcnRBcmVhU3R5bGVzOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gcmVuZGVyQ2hhcnRBcmVhKHRoaXMpOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKCkgewogICAgICBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgY29uc3QgQXBleENoYXJ0c0xpYiA9IGF3YWl0IERlZXNTZXJ2aWNlTGliTG9hZGVyLmdldEluc3RhbmNlKCkubG9hZEFwZXhDaGFydHMoKTsKICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZTIpKTsKICAgICAgY29uc3QgbWFpbmJveCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIubWFpbmJveCIpOwogICAgICBjb25zdCBjaGFydENvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuY2hhcnRDb250YWluZXIiKTsKICAgICAgaWYgKCFtYWluYm94IHx8ICFjaGFydENvbnRhaW5lcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkNoYXJ0IGNvbnRhaW5lcnMgbm90IGZvdW5kIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHN0eWxlQ2hhcnRDb250YWluZXIgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjaGFydENvbnRhaW5lcik7CiAgICAgIGNvbnN0IHBhZGRpbmdUb3AgPSBwYXJzZUludChzdHlsZUNoYXJ0Q29udGFpbmVyLnBhZGRpbmdUb3AsIDEwKTsKICAgICAgY29uc3QgcGFkZGluZ0JvdHRvbSA9IHBhcnNlSW50KHN0eWxlQ2hhcnRDb250YWluZXIucGFkZGluZ0JvdHRvbSwgMTApOwogICAgICBjb25zdCBwYWRkaW5nTGVmdCA9IHBhcnNlSW50KHN0eWxlQ2hhcnRDb250YWluZXIucGFkZGluZ0xlZnQsIDEwKTsKICAgICAgY29uc3QgcGFkZGluZ1JpZ2h0ID0gcGFyc2VJbnQoc3R5bGVDaGFydENvbnRhaW5lci5wYWRkaW5nUmlnaHQsIDEwKTsKICAgICAgY29uc3QgaW5pdGlhbFdpZHRoID0gbWFpbmJveC5jbGllbnRXaWR0aCAtIHBhZGRpbmdMZWZ0IC0gcGFkZGluZ1JpZ2h0OwogICAgICBjb25zdCBpbml0aWFsSGVpZ2h0ID0gbWFpbmJveC5vZmZzZXRIZWlnaHQgLSBwYWRkaW5nVG9wIC0gcGFkZGluZ0JvdHRvbTsKICAgICAgY29uc3QgY2hhcnRTZXJpZXMgPSB0aGlzLnNlcmllcy5sZW5ndGggPiAwID8gdGhpcy5zZXJpZXMgOiBbCiAgICAgICAgewogICAgICAgICAgbmFtZTogImNwdSIsCiAgICAgICAgICBkYXRhOiBbCiAgICAgICAgICAgIHsgeDogIjIwMjUtMDEtMTVUMDM6MDA6MDAiLCB5OiAyNSB9LAogICAgICAgICAgICB7IHg6ICIyMDI1LTAxLTE1VDA3OjAwOjAwIiwgeTogMzAgfSwKICAgICAgICAgICAgeyB4OiAiMjAyNS0wMS0xNVQxMTowMDowMCIsIHk6IDIwIH0sCiAgICAgICAgICAgIHsgeDogIjIwMjUtMDEtMTVUMTU6MDA6MDAiLCB5OiAzNSB9LAogICAgICAgICAgICB7IHg6ICIyMDI1LTAxLTE1VDE5OjAwOjAwIiwgeTogMjUgfQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIm1lbW9yeSIsCiAgICAgICAgICBkYXRhOiBbCiAgICAgICAgICAgIHsgeDogIjIwMjUtMDEtMTVUMDM6MDA6MDAiLCB5OiAxMCB9LAogICAgICAgICAgICB7IHg6ICIyMDI1LTAxLTE1VDA3OjAwOjAwIiwgeTogMTIgfSwKICAgICAgICAgICAgeyB4OiAiMjAyNS0wMS0xNVQxMTowMDowMCIsIHk6IDEwIH0sCiAgICAgICAgICAgIHsgeDogIjIwMjUtMDEtMTVUMTU6MDA6MDAiLCB5OiAzMCB9LAogICAgICAgICAgICB7IHg6ICIyMDI1LTAxLTE1VDE5OjAwOjAwIiwgeTogNDAgfQogICAgICAgICAgXQogICAgICAgIH0KICAgICAgXTsKICAgICAgdGhpcy5pbnRlcm5hbENoYXJ0RGF0YSA9IGNoYXJ0U2VyaWVzOwogICAgICBjb25zdCBpc0RhcmsgPSAhdGhpcy5nb0JyaWdodDsKICAgICAgY29uc3QgdGhlbWUgPSBpc0RhcmsgPyAiZGFyayIgOiAibGlnaHQiOwogICAgICB2YXIgb3B0aW9ucyA9IHsKICAgICAgICBzZXJpZXM6IGNoYXJ0U2VyaWVzLAogICAgICAgIGNoYXJ0OiB7CiAgICAgICAgICB3aWR0aDogaW5pdGlhbFdpZHRoIHx8IDEwMCwKICAgICAgICAgIC8vIFVzZSBhY3R1YWwgd2lkdGggb3IgZmFsbGJhY2sKICAgICAgICAgIGhlaWdodDogaW5pdGlhbEhlaWdodCB8fCAxMDAsCiAgICAgICAgICAvLyBVc2UgYWN0dWFsIGhlaWdodCBvciBmYWxsYmFjawogICAgICAgICAgdHlwZTogImFyZWEiLAogICAgICAgICAgYmFja2dyb3VuZDogInRyYW5zcGFyZW50IiwKICAgICAgICAgIC8vIFRyYW5zcGFyZW50IGJhY2tncm91bmQgdG8gaW5oZXJpdCBmcm9tIGNvbnRhaW5lcgogICAgICAgICAgdG9vbGJhcjogewogICAgICAgICAgICBzaG93OiBmYWxzZQogICAgICAgICAgICAvLyBUaGlzIGxpbmUgZGlzYWJsZXMgdGhlIHRvb2xiYXIKICAgICAgICAgIH0sCiAgICAgICAgICBhbmltYXRpb25zOiB7CiAgICAgICAgICAgIGVuYWJsZWQ6ICF0aGlzLnJlYWx0aW1lTW9kZSwKICAgICAgICAgICAgLy8gRGlzYWJsZSBhbmltYXRpb25zIGluIHJlYWx0aW1lIG1vZGUKICAgICAgICAgICAgc3BlZWQ6IDQwMCwKICAgICAgICAgICAgYW5pbWF0ZUdyYWR1YWxseTogewogICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgICAgICAgICAgIC8vIERpc2FibGUgZ3JhZHVhbCBhbmltYXRpb24gZm9yIGNsZWFuZXIgdXBkYXRlcwogICAgICAgICAgICAgIGRlbGF5OiAwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGR5bmFtaWNBbmltYXRpb246IHsKICAgICAgICAgICAgICBlbmFibGVkOiAhdGhpcy5yZWFsdGltZU1vZGUsCiAgICAgICAgICAgICAgc3BlZWQ6IDM1MAogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgem9vbTogewogICAgICAgICAgICBlbmFibGVkOiBmYWxzZQogICAgICAgICAgICAvLyBEaXNhYmxlIHpvb20gZm9yIGNsZWFuZXIgaW50ZXJhY3Rpb24KICAgICAgICAgIH0sCiAgICAgICAgICBzZWxlY3Rpb246IHsKICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UKICAgICAgICAgICAgLy8gRGlzYWJsZSBzZWxlY3Rpb24KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGRhdGFMYWJlbHM6IHsKICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICBzdHJva2U6IHsKICAgICAgICAgIHdpZHRoOiAyLAogICAgICAgICAgY3VydmU6ICJzbW9vdGgiCiAgICAgICAgfSwKICAgICAgICB4YXhpczogewogICAgICAgICAgdHlwZTogImRhdGV0aW1lIiwKICAgICAgICAgIC8vIFRpbWUtc2VyaWVzIGRhdGEKICAgICAgICAgIGxhYmVsczogewogICAgICAgICAgICBmb3JtYXQ6ICJISDptbTpzcyIsCiAgICAgICAgICAgIC8vIFRpbWUgZm9ybWF0dGluZyB3aXRoIHNlY29uZHMKICAgICAgICAgICAgZGF0ZXRpbWVVVEM6IGZhbHNlLAogICAgICAgICAgICBzdHlsZTogewogICAgICAgICAgICAgIGNvbG9yczogW2lzRGFyayA/ICJoc2woMCAwJSA2My45JSkiIDogImhzbCgwIDAlIDIwJSkiXSwKICAgICAgICAgICAgICAvLyBMYWJlbCBjb2xvcgogICAgICAgICAgICAgIGZvbnRTaXplOiAiMTJweCIsCiAgICAgICAgICAgICAgZm9udEZhbWlseTogJy1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgIlNlZ29lIFVJIiwgc2Fucy1zZXJpZicsCiAgICAgICAgICAgICAgZm9udFdlaWdodDogIjQwMCIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGF4aXNCb3JkZXI6IHsKICAgICAgICAgICAgc2hvdzogZmFsc2UKICAgICAgICAgICAgLy8gSGlkZSB4LWF4aXMgYm9yZGVyCiAgICAgICAgICB9LAogICAgICAgICAgYXhpc1RpY2tzOiB7CiAgICAgICAgICAgIHNob3c6IGZhbHNlCiAgICAgICAgICAgIC8vIEhpZGUgeC1heGlzIHRpY2tzCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB5YXhpczogewogICAgICAgICAgbWluOiAwLAogICAgICAgICAgbWF4OiB0aGlzLnlBeGlzU2NhbGluZyA9PT0gImR5bmFtaWMiID8gdm9pZCAwIDogdGhpcy55QXhpc01heCwKICAgICAgICAgIGxhYmVsczogewogICAgICAgICAgICBmb3JtYXR0ZXI6IHRoaXMueUF4aXNGb3JtYXR0ZXIsCiAgICAgICAgICAgIHN0eWxlOiB7CiAgICAgICAgICAgICAgY29sb3JzOiBbaXNEYXJrID8gImhzbCgwIDAlIDYzLjklKSIgOiAiaHNsKDAgMCUgMjAlKSJdLAogICAgICAgICAgICAgIC8vIExhYmVsIGNvbG9yCiAgICAgICAgICAgICAgZm9udFNpemU6ICIxMnB4IiwKICAgICAgICAgICAgICBmb250RmFtaWx5OiAnLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBzYW5zLXNlcmlmJywKICAgICAgICAgICAgICBmb250V2VpZ2h0OiAiNDAwIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgYXhpc0JvcmRlcjogewogICAgICAgICAgICBzaG93OiBmYWxzZQogICAgICAgICAgICAvLyBIaWRlIHktYXhpcyBib3JkZXIKICAgICAgICAgIH0sCiAgICAgICAgICBheGlzVGlja3M6IHsKICAgICAgICAgICAgc2hvdzogZmFsc2UKICAgICAgICAgICAgLy8gSGlkZSB5LWF4aXMgdGlja3MKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHRvb2x0aXA6IHsKICAgICAgICAgIHNoYXJlZDogdHJ1ZSwKICAgICAgICAgIC8vIEVuYWJsZXMgdGhlIHRvb2x0aXAgdG8gZGlzcGxheSBhY3Jvc3Mgc2VyaWVzCiAgICAgICAgICBpbnRlcnNlY3Q6IGZhbHNlLAogICAgICAgICAgLy8gQWxsb3dzIGhvdmVyaW5nIGFueXdoZXJlIG9uIHRoZSBjaGFydAogICAgICAgICAgZm9sbG93Q3Vyc29yOiB0cnVlLAogICAgICAgICAgLy8gTWFrZXMgdG9vbHRpcCBmb2xsb3cgbW91c2UgZXZlbiBiZXR3ZWVuIHBvaW50cwogICAgICAgICAgeDogewogICAgICAgICAgICBmb3JtYXQ6ICJkZC9NTS95eSBISDptbSIKICAgICAgICAgIH0sCiAgICAgICAgICBjdXN0b206ICh7IHNlcmllcywgZGF0YVBvaW50SW5kZXgsIHc6IHczIH0pID0+IHsKICAgICAgICAgICAgY29uc3QgY3VycmVudFRoZW1lID0gdzMuY29uZmlnLnRoZW1lLm1vZGU7CiAgICAgICAgICAgIGNvbnN0IGlzRGFya01vZGUgPSBjdXJyZW50VGhlbWUgPT09ICJkYXJrIjsKICAgICAgICAgICAgY29uc3QgYmdDb2xvciA9IGlzRGFya01vZGUgPyAiaHNsKDAgMCUgOSUpIiA6ICJoc2woMCAwJSAxMDAlKSI7CiAgICAgICAgICAgIGNvbnN0IHRleHRDb2xvciA9IGlzRGFya01vZGUgPyAiaHNsKDAgMCUgOTUlKSIgOiAiaHNsKDAgMCUgOSUpIjsKICAgICAgICAgICAgY29uc3QgYm9yZGVyQ29sb3IgPSBpc0RhcmtNb2RlID8gImhzbCgwIDAlIDE0LjklKSIgOiAiaHNsKDAgMCUgODkuOCUpIjsKICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVyMiA9IHczLmNvbmZpZy55YXhpc1swXT8ubGFiZWxzPy5mb3JtYXR0ZXIgfHwgKCh2YWwpID0+IHZhbC50b1N0cmluZygpKTsKICAgICAgICAgICAgbGV0IHRvb2x0aXBDb250ZW50ID0gYDxkaXYgc3R5bGU9InBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6ICR7YmdDb2xvcn07IGNvbG9yOiAke3RleHRDb2xvcn07IGJvcmRlci1yYWRpdXM6IDZweDsgYm94LXNoYWRvdzogMCAycHggOHB4IDAgaHNsKDAgMCUgMCUgLyAke2lzRGFya01vZGUgPyAiMC4yIiA6ICIwLjEifSk7IGJvcmRlcjogMXB4IHNvbGlkICR7Ym9yZGVyQ29sb3J9O2ZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJweDsiPmA7CiAgICAgICAgICAgIHNlcmllcy5mb3JFYWNoKChzOSwgaW5kZXgyKSA9PiB7CiAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSB3My5nbG9iYWxzLnNlcmllc05hbWVzW2luZGV4Ml07CiAgICAgICAgICAgICAgY29uc3QgdmFsdWUyID0gczlbZGF0YVBvaW50SW5kZXhdOwogICAgICAgICAgICAgIGNvbnN0IGNvbG9yMiA9IHczLmdsb2JhbHMuY29sb3JzW2luZGV4Ml07CiAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSBmb3JtYXR0ZXIyKHZhbHVlMik7CiAgICAgICAgICAgICAgdG9vbHRpcENvbnRlbnQgKz0gYDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBtYXJnaW46ICR7aW5kZXgyID4gMCA/ICI2cHgiIDogIjAifSAwOyI+CiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IDEwcHg7IGhlaWdodDogMTBweDsgYmFja2dyb3VuZDogJHtjb2xvcjJ9OyBib3JkZXItcmFkaXVzOiAycHg7Ij48L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiA1MDA7Ij4ke2xhYmVsfTo8L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OiBhdXRvOyBmb250LXdlaWdodDogNjAwOyI+JHtmb3JtYXR0ZWRWYWx1ZX08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PmA7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0b29sdGlwQ29udGVudCArPSBgPC9kaXY+YDsKICAgICAgICAgICAgcmV0dXJuIHRvb2x0aXBDb250ZW50OwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgZ3JpZDogewogICAgICAgICAgeGF4aXM6IHsKICAgICAgICAgICAgbGluZXM6IHsKICAgICAgICAgICAgICBzaG93OiBmYWxzZQogICAgICAgICAgICAgIC8vIEhpZGUgdmVydGljYWwgZ3JpZCBsaW5lcyBmb3IgY2xlYW5lciBsb29rCiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICB5YXhpczogewogICAgICAgICAgICBsaW5lczogewogICAgICAgICAgICAgIHNob3c6IHRydWUKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGJvcmRlckNvbG9yOiBpc0RhcmsgPyAiaHNsKDAgMCUgMTQuOSUpIiA6ICJoc2woMCAwJSA5NCUpIiwKICAgICAgICAgIC8vIFZlcnkgc3VidGxlIGdyaWQgbGluZXMKICAgICAgICAgIHN0cm9rZURhc2hBcnJheTogMCwKICAgICAgICAgIC8vIFNvbGlkIGxpbmUKICAgICAgICAgIHBhZGRpbmc6IHsKICAgICAgICAgICAgdG9wOiAxMCwKICAgICAgICAgICAgcmlnaHQ6IDIwLAogICAgICAgICAgICBib3R0b206IDEwLAogICAgICAgICAgICBsZWZ0OiAyMAogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgZmlsbDogewogICAgICAgICAgdHlwZTogImdyYWRpZW50IiwKICAgICAgICAgIC8vIEdyYWRpZW50IGZpbGwgZm9yIHRoZSBhcmVhCiAgICAgICAgICBncmFkaWVudDogewogICAgICAgICAgICBzaGFkZTogaXNEYXJrID8gImRhcmsiIDogImxpZ2h0IiwKICAgICAgICAgICAgdHlwZTogInZlcnRpY2FsIiwKICAgICAgICAgICAgc2hhZGVJbnRlbnNpdHk6IDAuMSwKICAgICAgICAgICAgb3BhY2l0eUZyb206IGlzRGFyayA/IDAuMiA6IDAuMywKICAgICAgICAgICAgb3BhY2l0eVRvOiAwLAogICAgICAgICAgICBzdG9wczogWzAsIDEwMF0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGNvbG9yczogaXNEYXJrID8gdGhpcy5DSEFSVF9DT0xPUlMuZGFyayA6IHRoaXMuQ0hBUlRfQ09MT1JTLmxpZ2h0LAogICAgICAgIHRoZW1lOiB7CiAgICAgICAgICBtb2RlOiB0aGVtZQogICAgICAgIH0KICAgICAgfTsKICAgICAgdHJ5IHsKICAgICAgICB0aGlzLmNoYXJ0ID0gbmV3IEFwZXhDaGFydHNMaWIodGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5jaGFydENvbnRhaW5lciIpLCBvcHRpb25zKTsKICAgICAgICBhd2FpdCB0aGlzLmNoYXJ0LnJlbmRlcigpOwogICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlMikgPT4gc2V0VGltZW91dChyZXNvbHZlMiwgMTAwKSk7CiAgICAgICAgYXdhaXQgdGhpcy5yZXNpemVDaGFydCgpOwogICAgICAgIGNvbnN0IG1haW5ib3gyID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5tYWluYm94Iik7CiAgICAgICAgaWYgKG1haW5ib3gyICYmIHRoaXMucmVzaXplT2JzZXJ2ZXIpIHsKICAgICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKG1haW5ib3gyKTsKICAgICAgICAgIGlmICh0aGlzLkRFQlVHX1JFU0laRSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygiRGVlc0NoYXJ0QXJlYSAtIFJlc2l6ZU9ic2VydmVyIGF0dGFjaGVkIHRvIG1haW5ib3giKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgY2hhcnQ6IiwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICBhc3luYyB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJnb0JyaWdodCIpICYmIHRoaXMuY2hhcnQpIHsKICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNoYXJ0VGhlbWUoKTsKICAgICAgfQogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJzZXJpZXMiKSAmJiB0aGlzLmNoYXJ0ICYmIHRoaXMuc2VyaWVzLmxlbmd0aCA+IDApIHsKICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVNlcmllcyh0aGlzLnNlcmllcyk7CiAgICAgIH0KICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygieUF4aXNGb3JtYXR0ZXIiKSAmJiB0aGlzLmNoYXJ0KSB7CiAgICAgICAgYXdhaXQgdGhpcy5jaGFydC51cGRhdGVPcHRpb25zKHsKICAgICAgICAgIHlheGlzOiB7CiAgICAgICAgICAgIGxhYmVsczogewogICAgICAgICAgICAgIGZvcm1hdHRlcjogdGhpcy55QXhpc0Zvcm1hdHRlcgogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygicmVhbHRpbWVNb2RlIikgJiYgdGhpcy5jaGFydCkgewogICAgICAgIGF3YWl0IHRoaXMuY2hhcnQudXBkYXRlT3B0aW9ucyh7CiAgICAgICAgICBjaGFydDogewogICAgICAgICAgICBhbmltYXRpb25zOiB7CiAgICAgICAgICAgICAgZW5hYmxlZDogIXRoaXMucmVhbHRpbWVNb2RlLAogICAgICAgICAgICAgIHNwZWVkOiA0MDAsCiAgICAgICAgICAgICAgYW5pbWF0ZUdyYWR1YWxseTogewogICAgICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCiAgICAgICAgICAgICAgICBkZWxheTogMAogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgZHluYW1pY0FuaW1hdGlvbjogewogICAgICAgICAgICAgICAgZW5hYmxlZDogIXRoaXMucmVhbHRpbWVNb2RlLAogICAgICAgICAgICAgICAgc3BlZWQ6IDM1MAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmICh0aGlzLnJlYWx0aW1lTW9kZSAmJiB0aGlzLnJvbGxpbmdXaW5kb3cgPiAwICYmIHRoaXMuYXV0b1Njcm9sbEludGVydmFsID4gMCkgewogICAgICAgICAgdGhpcy5zdGFydEF1dG9TY3JvbGwoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5zdG9wQXV0b1Njcm9sbCgpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJhdXRvU2Nyb2xsSW50ZXJ2YWwiKSAmJiB0aGlzLmNoYXJ0KSB7CiAgICAgICAgdGhpcy5zdG9wQXV0b1Njcm9sbCgpOwogICAgICAgIGlmICh0aGlzLnJlYWx0aW1lTW9kZSAmJiB0aGlzLnJvbGxpbmdXaW5kb3cgPiAwICYmIHRoaXMuYXV0b1Njcm9sbEludGVydmFsID4gMCkgewogICAgICAgICAgdGhpcy5zdGFydEF1dG9TY3JvbGwoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKChjaGFuZ2VkUHJvcGVydGllcy5oYXMoInlBeGlzU2NhbGluZyIpIHx8IGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygieUF4aXNNYXgiKSkgJiYgdGhpcy5jaGFydCkgewogICAgICAgIGF3YWl0IHRoaXMuY2hhcnQudXBkYXRlT3B0aW9ucyh7CiAgICAgICAgICB5YXhpczogewogICAgICAgICAgICBtaW46IDAsCiAgICAgICAgICAgIG1heDogdGhpcy55QXhpc1NjYWxpbmcgPT09ICJkeW5hbWljIiA/IHZvaWQgMCA6IHRoaXMueUF4aXNNYXgKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgYXN5bmMgdXBkYXRlU2VyaWVzKG5ld1NlcmllcywgYW5pbWF0ZSA9IHRydWUpIHsKICAgICAgaWYgKCF0aGlzLmNoYXJ0KSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgdGhpcy5pbnRlcm5hbENoYXJ0RGF0YSA9IG5ld1NlcmllczsKICAgICAgICBpZiAodGhpcy5yb2xsaW5nV2luZG93ID4gMCAmJiB0aGlzLnJlYWx0aW1lTW9kZSkgewogICAgICAgICAgY29uc3Qgbm93MiA9IERhdGUubm93KCk7CiAgICAgICAgICBjb25zdCBjdXRvZmZUaW1lID0gbm93MiAtIHRoaXMucm9sbGluZ1dpbmRvdzsKICAgICAgICAgIGNvbnN0IGZpbHRlcmVkU2VyaWVzID0gbmV3U2VyaWVzLm1hcCgoc2VyaWVzKSA9PiAoewogICAgICAgICAgICBuYW1lOiBzZXJpZXMubmFtZSwKICAgICAgICAgICAgZGF0YTogc2VyaWVzLmRhdGEuZmlsdGVyKChwb2ludDQpID0+IHsKICAgICAgICAgICAgICBpZiAodHlwZW9mIHBvaW50NCA9PT0gIm9iamVjdCIgJiYgcG9pbnQ0ICE9PSBudWxsICYmICJ4IiBpbiBwb2ludDQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShwb2ludDQueCkuZ2V0VGltZSgpID4gY3V0b2ZmVGltZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9KQogICAgICAgICAgfSkpOwogICAgICAgICAgaWYgKGZpbHRlcmVkU2VyaWVzLnNvbWUoKHM5KSA9PiBzOS5kYXRhLmxlbmd0aCA+IDApKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnlBeGlzU2NhbGluZyA9PT0gImR5bmFtaWMiKSB7CiAgICAgICAgICAgICAgY29uc3QgYWxsVmFsdWVzID0gZmlsdGVyZWRTZXJpZXMuZmxhdE1hcCgoczkpID0+IHM5LmRhdGEubWFwKChkNikgPT4gZDYueSkpOwogICAgICAgICAgICAgIGlmIChhbGxWYWx1ZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY29uc3QgbWF4VmFsdWUgPSBNYXRoLm1heCguLi5hbGxWYWx1ZXMpOwogICAgICAgICAgICAgICAgY29uc3QgZHluYW1pY01heCA9IE1hdGguY2VpbChtYXhWYWx1ZSAqIDEuMSk7CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoYXJ0LnVwZGF0ZU9wdGlvbnMoewogICAgICAgICAgICAgICAgICB5YXhpczogewogICAgICAgICAgICAgICAgICAgIG1pbjogMCwKICAgICAgICAgICAgICAgICAgICBtYXg6IGR5bmFtaWNNYXgKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGFydC51cGRhdGVTZXJpZXMoZmlsdGVyZWRTZXJpZXMsIGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXdhaXQgdGhpcy5jaGFydC51cGRhdGVTZXJpZXMobmV3U2VyaWVzLCBhbmltYXRlKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHVwZGF0ZSBjaGFydCBzZXJpZXM6IiwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICAvLyBVcGRhdGUganVzdCB0aGUgeC1heGlzIGZvciBzbW9vdGggc2Nyb2xsaW5nIGluIHJlYWx0aW1lIG1vZGUKICAgIC8vIFB1YmxpYyBmb3IgYWR2YW5jZWQgdXNhZ2UgaW4gZGVtb3MsIGJ1dCB0eXBpY2FsbHkgaGFuZGxlZCBhdXRvbWF0aWNhbGx5CiAgICBhc3luYyB1cGRhdGVUaW1lV2luZG93KCkgewogICAgICBpZiAoIXRoaXMuY2hhcnQgfHwgdGhpcy5yb2xsaW5nV2luZG93IDw9IDApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgbm93MiA9IERhdGUubm93KCk7CiAgICAgIGNvbnN0IGN1dG9mZlRpbWUgPSBub3cyIC0gdGhpcy5yb2xsaW5nV2luZG93OwogICAgICBhd2FpdCB0aGlzLmNoYXJ0LnVwZGF0ZU9wdGlvbnMoewogICAgICAgIHhheGlzOiB7CiAgICAgICAgICBtaW46IGN1dG9mZlRpbWUsCiAgICAgICAgICBtYXg6IG5vdzIsCiAgICAgICAgICBsYWJlbHM6IHsKICAgICAgICAgICAgZm9ybWF0OiAiSEg6bW06c3MiLAogICAgICAgICAgICBkYXRldGltZVVUQzogZmFsc2UsCiAgICAgICAgICAgIHN0eWxlOiB7CiAgICAgICAgICAgICAgY29sb3JzOiBbIXRoaXMuZ29CcmlnaHQgPyAiaHNsKDAgMCUgNjMuOSUpIiA6ICJoc2woMCAwJSAyMCUpIl0sCiAgICAgICAgICAgICAgZm9udFNpemU6ICIxMnB4IiwKICAgICAgICAgICAgICBmb250RmFtaWx5OiAnLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBzYW5zLXNlcmlmJywKICAgICAgICAgICAgICBmb250V2VpZ2h0OiAiNDAwIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgdGlja0Ftb3VudDogNgogICAgICAgIH0KICAgICAgfSwgZmFsc2UsIGZhbHNlKTsKICAgIH0KICAgIGFzeW5jIGFwcGVuZERhdGEobmV3RGF0YSkgewogICAgICBpZiAoIXRoaXMuY2hhcnQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5jaGFydC5hcHBlbmREYXRhKG5ld0RhdGEpOwogICAgfQogICAgYXN5bmMgdXBkYXRlT3B0aW9ucyhvcHRpb25zLCByZWRyYXdQYXRocywgYW5pbWF0ZSkgewogICAgICBpZiAoIXRoaXMuY2hhcnQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuY2hhcnQudXBkYXRlT3B0aW9ucyhvcHRpb25zLCByZWRyYXdQYXRocywgYW5pbWF0ZSk7CiAgICB9CiAgICBhc3luYyByZXNpemVDaGFydCgpIHsKICAgICAgaWYgKCF0aGlzLmNoYXJ0KSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLkRFQlVHX1JFU0laRSkgewogICAgICAgIGNvbnNvbGUubG9nKCJEZWVzQ2hhcnRBcmVhIC0gcmVzaXplQ2hhcnQgY2FsbGVkIik7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBtYWluYm94ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5tYWluYm94Iik7CiAgICAgICAgY29uc3QgY2hhcnRDb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmNoYXJ0Q29udGFpbmVyIik7CiAgICAgICAgaWYgKCFtYWluYm94IHx8ICFjaGFydENvbnRhaW5lcikgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2b2lkIG1haW5ib3gub2Zmc2V0SGVpZ2h0OwogICAgICAgIGNvbnN0IHN0eWxlQ2hhcnRDb250YWluZXIgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjaGFydENvbnRhaW5lcik7CiAgICAgICAgY29uc3QgcGFkZGluZ1RvcCA9IHBhcnNlSW50KHN0eWxlQ2hhcnRDb250YWluZXIucGFkZGluZ1RvcCwgMTApOwogICAgICAgIGNvbnN0IHBhZGRpbmdCb3R0b20gPSBwYXJzZUludChzdHlsZUNoYXJ0Q29udGFpbmVyLnBhZGRpbmdCb3R0b20sIDEwKTsKICAgICAgICBjb25zdCBwYWRkaW5nTGVmdCA9IHBhcnNlSW50KHN0eWxlQ2hhcnRDb250YWluZXIucGFkZGluZ0xlZnQsIDEwKTsKICAgICAgICBjb25zdCBwYWRkaW5nUmlnaHQgPSBwYXJzZUludChzdHlsZUNoYXJ0Q29udGFpbmVyLnBhZGRpbmdSaWdodCwgMTApOwogICAgICAgIGNvbnN0IGFjdHVhbFdpZHRoID0gbWFpbmJveC5jbGllbnRXaWR0aCAtIHBhZGRpbmdMZWZ0IC0gcGFkZGluZ1JpZ2h0OwogICAgICAgIGNvbnN0IGFjdHVhbEhlaWdodCA9IG1haW5ib3gub2Zmc2V0SGVpZ2h0IC0gcGFkZGluZ1RvcCAtIHBhZGRpbmdCb3R0b207CiAgICAgICAgaWYgKGFjdHVhbFdpZHRoID4gMCAmJiBhY3R1YWxIZWlnaHQgPiAwKSB7CiAgICAgICAgICBpZiAodGhpcy5ERUJVR19SRVNJWkUpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coIkRlZXNDaGFydEFyZWEgLSBVcGRhdGluZyBjaGFydCBkaW1lbnNpb25zOiIsIHsKICAgICAgICAgICAgICB3aWR0aDogYWN0dWFsV2lkdGgsCiAgICAgICAgICAgICAgaGVpZ2h0OiBhY3R1YWxIZWlnaHQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBhd2FpdCB0aGlzLmNoYXJ0LnVwZGF0ZU9wdGlvbnMoewogICAgICAgICAgICBjaGFydDogewogICAgICAgICAgICAgIHdpZHRoOiBhY3R1YWxXaWR0aCwKICAgICAgICAgICAgICBoZWlnaHQ6IGFjdHVhbEhlaWdodAogICAgICAgICAgICB9CiAgICAgICAgICB9LCB0cnVlLCBmYWxzZSk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byByZXNpemUgY2hhcnQ6IiwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIE1hbnVhbGx5IHRyaWdnZXIgYSBjaGFydCByZXNpemUuIFVzZWZ1bCB3aGVuIGF1dG9tYXRpYyBkZXRlY3Rpb24gZG9lc24ndCB3b3JrLgogICAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNhbiBiZSBjYWxsZWQgZnJvbSBvdXRzaWRlIHRoZSBjb21wb25lbnQuCiAgICAgKi8KICAgIGFzeW5jIGZvcmNlUmVzaXplKCkgewogICAgICBhd2FpdCB0aGlzLnJlc2l6ZUNoYXJ0KCk7CiAgICB9CiAgICBzdGFydEF1dG9TY3JvbGwoKSB7CiAgICAgIGlmICh0aGlzLmF1dG9TY3JvbGxUaW1lcikgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLmF1dG9TY3JvbGxUaW1lciA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgdGhpcy51cGRhdGVUaW1lV2luZG93KCk7CiAgICAgIH0sIHRoaXMuYXV0b1Njcm9sbEludGVydmFsKTsKICAgIH0KICAgIHN0b3BBdXRvU2Nyb2xsKCkgewogICAgICBpZiAodGhpcy5hdXRvU2Nyb2xsVGltZXIpIHsKICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmF1dG9TY3JvbGxUaW1lcik7CiAgICAgICAgdGhpcy5hdXRvU2Nyb2xsVGltZXIgPSBudWxsOwogICAgICB9CiAgICB9CiAgICBhc3luYyB1cGRhdGVDaGFydFRoZW1lKCkgewogICAgICBpZiAoIXRoaXMuY2hhcnQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgaXNEYXJrID0gIXRoaXMuZ29CcmlnaHQ7CiAgICAgIGNvbnN0IHRoZW1lID0gaXNEYXJrID8gImRhcmsiIDogImxpZ2h0IjsKICAgICAgYXdhaXQgdGhpcy5jaGFydC51cGRhdGVPcHRpb25zKHsKICAgICAgICB0aGVtZTogewogICAgICAgICAgbW9kZTogdGhlbWUKICAgICAgICB9LAogICAgICAgIGNvbG9yczogaXNEYXJrID8gdGhpcy5DSEFSVF9DT0xPUlMuZGFyayA6IHRoaXMuQ0hBUlRfQ09MT1JTLmxpZ2h0LAogICAgICAgIHhheGlzOiB7CiAgICAgICAgICBsYWJlbHM6IHsKICAgICAgICAgICAgc3R5bGU6IHsKICAgICAgICAgICAgICBjb2xvcnM6IFtpc0RhcmsgPyAiaHNsKDAgMCUgNjMuOSUpIiA6ICJoc2woMCAwJSAyMCUpIl0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgeWF4aXM6IHsKICAgICAgICAgIGxhYmVsczogewogICAgICAgICAgICBzdHlsZTogewogICAgICAgICAgICAgIGNvbG9yczogW2lzRGFyayA/ICJoc2woMCAwJSA2My45JSkiIDogImhzbCgwIDAlIDIwJSkiXQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBncmlkOiB7CiAgICAgICAgICBib3JkZXJDb2xvcjogaXNEYXJrID8gImhzbCgwIDAlIDE0LjklKSIgOiAiaHNsKDAgMCUgOTQlKSIKICAgICAgICB9LAogICAgICAgIGZpbGw6IHsKICAgICAgICAgIGdyYWRpZW50OiB7CiAgICAgICAgICAgIHNoYWRlOiBpc0RhcmsgPyAiZGFyayIgOiAibGlnaHQiLAogICAgICAgICAgICBvcGFjaXR5RnJvbTogaXNEYXJrID8gMC4yIDogMC4zCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNDcoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNDaGFydEFyZWEyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1jaGFydC9kZWVzLWNoYXJ0LWxvZy9kZWVzLWNoYXJ0LWxvZy5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vRnVuYzMzID0gKCkgPT4gewogIHJldHVybiBiMmAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgICBjb25zdCBzdHJ1Y3R1cmVkTG9nID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjc3RydWN0dXJlZC1sb2ciKTsKICAgIGNvbnN0IHJhd0xvZyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiI3Jhdy1sb2ciKTsKICAgIGxldCBzdHJ1Y3R1cmVkSW50ZXJ2YWxJZDsKICAgIGxldCByYXdJbnRlcnZhbElkOwogICAgY29uc3Qgc2VydmVyU291cmNlcyA9IFsiU2VydmVyIiwgIkRhdGFiYXNlIiwgIkFQSSIsICJBdXRoIiwgIkNhY2hlIiwgIlF1ZXVlIiwgIldlYlNvY2tldCIsICJTY2hlZHVsZXIiXTsKICAgIGNvbnN0IGxvZ1RlbXBsYXRlcyA9IHsKICAgICAgZGVidWc6IFsKICAgICAgICAiTG9hZGluZyBtb2R1bGU6IHt7bW9kdWxlfX0iLAogICAgICAgICJDYWNoZSBoaXQgZm9yIGtleToge3trZXl9fSIsCiAgICAgICAgIlNRTCBxdWVyeSBleGVjdXRlZCBpbiB7e3RpbWV9fW1zIiwKICAgICAgICAiUmVxdWVzdCBoZWFkZXJzOiB7e2hlYWRlcnN9fSIsCiAgICAgICAgIkVudmlyb25tZW50IHZhcmlhYmxlIGxvYWRlZDoge3t2YXJ9fSIKICAgICAgXSwKICAgICAgaW5mbzogWwogICAgICAgICJSZXF1ZXN0IHJlY2VpdmVkOiB7e21ldGhvZH19IHt7cGF0aH19IiwKICAgICAgICAiVXNlciB7e3VzZXJJZH19IGF1dGhlbnRpY2F0ZWQgc3VjY2Vzc2Z1bGx5IiwKICAgICAgICAiUHJvY2Vzc2luZyBqb2Ige3tqb2JJZH19IGZyb20gcXVldWUiLAogICAgICAgICdTY2hlZHVsZWQgdGFzayAie3t0YXNrfX0iIHN0YXJ0ZWQnLAogICAgICAgICJXZWJTb2NrZXQgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCBmcm9tIHt7aXB9fSIKICAgICAgXSwKICAgICAgd2FybjogWwogICAgICAgICJTbG93IHF1ZXJ5IGRldGVjdGVkOiB7e3F1ZXJ5fX0gKHt7dGltZX19bXMpIiwKICAgICAgICAiTWVtb3J5IHVzYWdlIGF0IHt7cGVyY2VudH19JSIsCiAgICAgICAgIlJhdGUgbGltaXQgYXBwcm9hY2hpbmcgZm9yIElQIHt7aXB9fSIsCiAgICAgICAgIkRlcHJlY2F0ZWQgQVBJIGVuZHBvaW50IGNhbGxlZDoge3tlbmRwb2ludH19IiwKICAgICAgICAiQ2VydGlmaWNhdGUgZXhwaXJlcyBpbiB7e2RheXN9fSBkYXlzIgogICAgICBdLAogICAgICBlcnJvcjogWwogICAgICAgICJEYXRhYmFzZSBjb25uZWN0aW9uIGxvc3Q6IHt7ZXJyb3J9fSIsCiAgICAgICAgIkZhaWxlZCB0byBwcm9jZXNzIHJlcXVlc3Q6IHt7ZXJyb3J9fSIsCiAgICAgICAgIkF1dGhlbnRpY2F0aW9uIGZhaWxlZCBmb3IgdXNlciB7e3VzZXJ9fSIsCiAgICAgICAgIkZpbGUgbm90IGZvdW5kOiB7e3BhdGh9fSIsCiAgICAgICAgIlNlcnZpY2UgdW5hdmFpbGFibGU6IHt7c2VydmljZX19IgogICAgICBdLAogICAgICBzdWNjZXNzOiBbCiAgICAgICAgIlNlcnZlciBzdGFydGVkIHN1Y2Nlc3NmdWxseSBvbiBwb3J0IHt7cG9ydH19IiwKICAgICAgICAiRGF0YWJhc2UgbWlncmF0aW9uIGNvbXBsZXRlZCIsCiAgICAgICAgIkJhY2t1cCBjb21wbGV0ZWQ6IHt7c2l6ZX19IE1CIiwKICAgICAgICAiU1NMIGNlcnRpZmljYXRlIHJlbmV3ZWQiLAogICAgICAgICJIZWFsdGggY2hlY2sgcGFzc2VkOiBhbGwgc3lzdGVtcyBvcGVyYXRpb25hbCIKICAgICAgXQogICAgfTsKICAgIGNvbnN0IGRvY2tlckxvZ1RlbXBsYXRlcyA9IFsKICAgICAgIlx4MUJbOTBtMjAyNC0wMS0xNVQxMDoyMzo0NS4xMjNaXHgxQlswbSBceDFCWzM2bUlORk9ceDFCWzBtICBbbmdpbnhdIEdFVCAvYXBpL2hlYWx0aCAyMDAgLSAybXMiLAogICAgICAiXHgxQls5MG0yMDI0LTAxLTE1VDEwOjIzOjQ1LjQ1NlpceDFCWzBtIFx4MUJbMzNtV0FSTlx4MUJbMG0gIFtyZWRpc10gQ29ubmVjdGlvbiBwb29sIHJ1bm5pbmcgbG93OiAzLzEwIiwKICAgICAgIlx4MUJbOTBtMjAyNC0wMS0xNVQxMDoyMzo0NS43ODlaXHgxQlswbSBceDFCWzMxbUVSUk9SXHgxQlswbSBbbW9uZ29kYl0gUXVlcnkgdGltZW91dCBhZnRlciAzMDAwMG1zIiwKICAgICAgIlx4MUJbOTBtMjAyNC0wMS0xNVQxMDoyMzo0Ni4wMTJaXHgxQlswbSBceDFCWzM2bUlORk9ceDFCWzBtICBbYXBwXSBQcm9jZXNzaW5nIGJhdGNoIGpvYiAje3tqb2JJZH19IiwKICAgICAgIlx4MUJbOTBtMjAyNC0wMS0xNVQxMDoyMzo0Ni4zNDVaXHgxQlswbSBceDFCWzMybU9LXHgxQlswbSAgICBbaGVhbHRoXSBBbGwgc2VydmljZXMgaGVhbHRoeSIsCiAgICAgICJceDFCWzkwbTIwMjQtMDEtMTVUMTA6MjM6NDYuNjc4Wlx4MUJbMG0gXHgxQlszNm1JTkZPXHgxQlswbSAgW2thZmthXSBNZXNzYWdlIGNvbnN1bWVkIGZyb20gdG9waWM6IGV2ZW50cyIsCiAgICAgICJceDFCWzkwbTIwMjQtMDEtMTVUMTA6MjM6NDcuMDAxWlx4MUJbMG0gXHgxQlszNW1ERUJVR1x4MUJbMG0gW2dycGNdIFJlcXVlc3QgcmVjZWl2ZWQ6IEdldFVzZXIoaWQ9e3t1c2VySWR9fSkiLAogICAgICAiXHgxQls5MG0yMDI0LTAxLTE1VDEwOjIzOjQ3LjIzNFpceDFCWzBtIFx4MUJbMzFtRVJST1JceDFCWzBtIFthdXRoXSBUb2tlbiB2YWxpZGF0aW9uIGZhaWxlZDogZXhwaXJlZCIsCiAgICAgICJceDFCWzkwbTIwMjQtMDEtMTVUMTA6MjM6NDcuNTY3Wlx4MUJbMG0gXHgxQlszM21XQVJOXHgxQlswbSAgW3JhdGUtbGltaXRdIElQIHt7aXB9fSBhcHByb2FjaGluZyByYXRlIGxpbWl0IiwKICAgICAgIlx4MUJbOTBtMjAyNC0wMS0xNVQxMDoyMzo0Ny44OTBaXHgxQlswbSBceDFCWzM2bUlORk9ceDFCWzBtICBbd2Vic29ja2V0XSBDbGllbnQgY29ubmVjdGVkOiBzZXNzaW9uPXt7c2Vzc2lvbn19IiwKICAgICAgLy8gTXVsdGktbGluZSBsb2cgZW50cnkgbGlrZSBzdGFjayB0cmFjZXMKICAgICAgIlx4MUJbMzFtRXJyb3I6IENvbm5lY3Rpb24gcmVmdXNlZFx4MUJbMG1cbiAgICBhdCBUY3BDb25uZWN0aW9uLmNvbm5lY3QgKC9hcHAvbm9kZV9tb2R1bGVzL3BnL2xpYi9jb25uZWN0aW9uLmpzOjEyOjE1KVxuICAgIGF0IFBvb2wuY29ubmVjdCAoL2FwcC9ub2RlX21vZHVsZXMvcGcvbGliL3Bvb2wuanM6NDU6MjMpXG4gICAgYXQgYXN5bmMgRGF0YWJhc2VTZXJ2aWNlLnF1ZXJ5ICgvYXBwL3NyYy9kYi9zZXJ2aWNlLnRzOjg5OjEyKSIKICAgIF07CiAgICBjb25zdCBnZW5lcmF0ZVJhbmRvbUxvZyA9ICgpID0+IHsKICAgICAgY29uc3QgbGV2ZWxzID0gWyJkZWJ1ZyIsICJpbmZvIiwgIndhcm4iLCAiZXJyb3IiLCAic3VjY2VzcyJdOwogICAgICBjb25zdCB3ZWlnaHRzID0gWzAuMiwgMC41LCAwLjE1LCAwLjEsIDAuMDVdOwogICAgICBjb25zdCByYW5kb20gPSBNYXRoLnJhbmRvbSgpOwogICAgICBsZXQgY3VtdWxhdGl2ZSA9IDA7CiAgICAgIGxldCBsZXZlbCA9ICJpbmZvIjsKICAgICAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgd2VpZ2h0cy5sZW5ndGg7IGkxMSsrKSB7CiAgICAgICAgY3VtdWxhdGl2ZSArPSB3ZWlnaHRzW2kxMV07CiAgICAgICAgaWYgKHJhbmRvbSA8IGN1bXVsYXRpdmUpIHsKICAgICAgICAgIGxldmVsID0gbGV2ZWxzW2kxMV07CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3Qgc291cmNlID0gc2VydmVyU291cmNlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBzZXJ2ZXJTb3VyY2VzLmxlbmd0aCldOwogICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBsb2dUZW1wbGF0ZXNbbGV2ZWxdOwogICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRlbXBsYXRlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0ZW1wbGF0ZXMubGVuZ3RoKV07CiAgICAgIGNvbnN0IG1lc3NhZ2UyID0gdGVtcGxhdGUucmVwbGFjZSgie3ttb2R1bGV9fSIsIFsiZXhwcmVzcyIsICJtb25nb29zZSIsICJyZWRpcyIsICJzb2NrZXQuaW8iXVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA0KV0pLnJlcGxhY2UoInt7a2V5fX0iLCAidXNlcjoiICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMWUzKSkucmVwbGFjZSgie3t0aW1lfX0iLCBTdHJpbmcoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNTAwKSArIDUwKSkucmVwbGFjZSgie3toZWFkZXJzfX0iLCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uLCBBdXRob3JpemF0aW9uOiBCZWFyZXIgLi4uIikucmVwbGFjZSgie3t2YXJ9fSIsIFsiTk9ERV9FTlYiLCAiREFUQUJBU0VfVVJMIiwgIkFQSV9LRVkiLCAiUE9SVCJdW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDQpXSkucmVwbGFjZSgie3ttZXRob2R9fSIsIFsiR0VUIiwgIlBPU1QiLCAiUFVUIiwgIkRFTEVURSJdW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDQpXSkucmVwbGFjZSgie3twYXRofX0iLCBbIi9hcGkvdXNlcnMiLCAiL2FwaS9hdXRoL2xvZ2luIiwgIi9hcGkvcHJvZHVjdHMiLCAiL2hlYWx0aCJdW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDQpXSkucmVwbGFjZSgie3t1c2VySWR9fSIsIFN0cmluZyhNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxZTQpKSkucmVwbGFjZSgie3tqb2JJZH19IiwgImpvYl8iICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDExKSkucmVwbGFjZSgie3t0YXNrfX0iLCBbImNsZWFudXAiLCAiYmFja3VwIiwgInJlcG9ydC1nZW5lcmF0aW9uIiwgImNhY2hlLXJlZnJlc2giXVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA0KV0pLnJlcGxhY2UoInt7aXB9fSIsIGAxOTIuMTY4LjEuJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyNTUpfWApLnJlcGxhY2UoInt7cXVlcnl9fSIsICJTRUxFQ1QgKiBGUk9NIHVzZXJzIFdIRVJFIC4uLiIpLnJlcGxhY2UoInt7cGVyY2VudH19IiwgU3RyaW5nKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDMwKSArIDcwKSkucmVwbGFjZSgie3tlbmRwb2ludH19IiwgIi9hcGkvdjEvbGVnYWN5IikucmVwbGFjZSgie3tkYXlzfX0iLCBTdHJpbmcoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMzApICsgMSkpLnJlcGxhY2UoInt7ZXJyb3J9fSIsIFsiRUNPTk5SRUZVU0VEIiwgIkVUSU1FRE9VVCIsICJFTk9URk9VTkQiXVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAzKV0pLnJlcGxhY2UoInt7dXNlcn19IiwgInVzZXJfIiArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDFlMykpLnJlcGxhY2UoInt7c2VydmljZX19IiwgWyJSZWRpcyIsICJNb25nb0RCIiwgIkVsYXN0aWNTZWFyY2giXVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAzKV0pLnJlcGxhY2UoInt7cG9ydH19IiwgU3RyaW5nKDNlMyArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwKSkpLnJlcGxhY2UoInt7c2l6ZX19IiwgU3RyaW5nKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDUwMCkgKyAxMDApKTsKICAgICAgc3RydWN0dXJlZExvZy5hZGRMb2cobGV2ZWwsIG1lc3NhZ2UyLCBzb3VyY2UpOwogICAgfTsKICAgIGNvbnN0IGdlbmVyYXRlRG9ja2VyTG9nID0gKCkgPT4gewogICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY2tlckxvZ1RlbXBsYXRlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBkb2NrZXJMb2dUZW1wbGF0ZXMubGVuZ3RoKV07CiAgICAgIGNvbnN0IG5vdzIgPSAoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCk7CiAgICAgIGNvbnN0IGxvZ0xpbmUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC8yMDI0LTAxLTE1VDEwOjIzOlxkezJ9XC5cZHszfVovZywgbm93MikucmVwbGFjZSgie3tqb2JJZH19IiwgU3RyaW5nKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDFlNCkpKS5yZXBsYWNlKCJ7e3VzZXJJZH19IiwgU3RyaW5nKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDFlNCkpKS5yZXBsYWNlKCJ7e2lwfX0iLCBgMTkyLjE2OC4xLiR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU1KX1gKS5yZXBsYWNlKCJ7e3Nlc3Npb259fSIsIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxMSkpOwogICAgICByYXdMb2cud3JpdGVsblJhdyhsb2dMaW5lKTsKICAgIH07CiAgICBjb25zdCBzdGFydFN0cnVjdHVyZWRTaW11bGF0aW9uID0gKCkgPT4gewogICAgICBpZiAoIXN0cnVjdHVyZWRJbnRlcnZhbElkKSB7CiAgICAgICAgY29uc3Qgc2NoZWR1bGVOZXh0ID0gKCkgPT4gewogICAgICAgICAgZ2VuZXJhdGVSYW5kb21Mb2coKTsKICAgICAgICAgIGNvbnN0IG5leHREZWxheSA9IE1hdGgucmFuZG9tKCkgKiAyZTMgKyA1MDA7CiAgICAgICAgICBzdHJ1Y3R1cmVkSW50ZXJ2YWxJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgaWYgKHN0cnVjdHVyZWRJbnRlcnZhbElkKSB7CiAgICAgICAgICAgICAgc2NoZWR1bGVOZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIG5leHREZWxheSk7CiAgICAgICAgfTsKICAgICAgICBzY2hlZHVsZU5leHQoKTsKICAgICAgfQogICAgfTsKICAgIGNvbnN0IHN0b3BTdHJ1Y3R1cmVkU2ltdWxhdGlvbiA9ICgpID0+IHsKICAgICAgaWYgKHN0cnVjdHVyZWRJbnRlcnZhbElkKSB7CiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChzdHJ1Y3R1cmVkSW50ZXJ2YWxJZCk7CiAgICAgICAgc3RydWN0dXJlZEludGVydmFsSWQgPSBudWxsOwogICAgICB9CiAgICB9OwogICAgY29uc3Qgc3RhcnRSYXdTaW11bGF0aW9uID0gKCkgPT4gewogICAgICBpZiAoIXJhd0ludGVydmFsSWQpIHsKICAgICAgICBjb25zdCBzY2hlZHVsZU5leHQgPSAoKSA9PiB7CiAgICAgICAgICBnZW5lcmF0ZURvY2tlckxvZygpOwogICAgICAgICAgY29uc3QgbmV4dERlbGF5ID0gTWF0aC5yYW5kb20oKSAqIDFlMyArIDIwMDsKICAgICAgICAgIHJhd0ludGVydmFsSWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGlmIChyYXdJbnRlcnZhbElkKSB7CiAgICAgICAgICAgICAgc2NoZWR1bGVOZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIG5leHREZWxheSk7CiAgICAgICAgfTsKICAgICAgICBzY2hlZHVsZU5leHQoKTsKICAgICAgfQogICAgfTsKICAgIGNvbnN0IHN0b3BSYXdTaW11bGF0aW9uID0gKCkgPT4gewogICAgICBpZiAocmF3SW50ZXJ2YWxJZCkgewogICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQocmF3SW50ZXJ2YWxJZCk7CiAgICAgICAgcmF3SW50ZXJ2YWxJZCA9IG51bGw7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCBidXR0b25zID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yQWxsKCJkZWVzLWJ1dHRvbiIpOwogICAgYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHsKICAgICAgY29uc3QgdGV4dDkgPSBidXR0b24udGV4dENvbnRlbnQ/LnRyaW0oKTsKICAgICAgc3dpdGNoICh0ZXh0OSkgewogICAgICAgIGNhc2UgIkFkZCBTdHJ1Y3R1cmVkIExvZyI6CiAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBnZW5lcmF0ZVJhbmRvbUxvZygpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlN0YXJ0IFN0cnVjdHVyZWQiOgogICAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gc3RhcnRTdHJ1Y3R1cmVkU2ltdWxhdGlvbigpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlN0b3AgU3RydWN0dXJlZCI6CiAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBzdG9wU3RydWN0dXJlZFNpbXVsYXRpb24oKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJBZGQgRG9ja2VyIExvZyI6CiAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBnZW5lcmF0ZURvY2tlckxvZygpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlN0YXJ0IERvY2tlciI6CiAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBzdGFydFJhd1NpbXVsYXRpb24oKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJTdG9wIERvY2tlciI6CiAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBzdG9wUmF3U2ltdWxhdGlvbigpKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9KTsKICB9fT4KICAgICAgPHN0eWxlPgogICAgICAgICR7aWAKICAgICAgICAgIC5kZW1vQm94IHsKICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUlKSIsICJoc2woMCAwJSA1JSkiKX07CiAgICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICAgIHBhZGRpbmc6IDQwcHg7CiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICAgIGdhcDogMjRweDsKICAgICAgICAgIH0KICAgICAgICAgIC5zZWN0aW9uIHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgICAgfQogICAgICAgICAgLnNlY3Rpb24tdGl0bGUgewogICAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAnR2Vpc3QgU2FucycsIHNhbnMtc2VyaWY7CiAgICAgICAgICB9CiAgICAgICAgICAuc2VjdGlvbi1kZXNjcmlwdGlvbiB7CiAgICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDQ2LjklKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCBzYW5zLXNlcmlmOwogICAgICAgICAgfQogICAgICAgICAgLmNvbnRyb2xzIHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgZ2FwOiAxMHB4OwogICAgICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgICB9CiAgICAgICAgYH0KICAgICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9ImRlbW9Cb3giPgogICAgICA8IS0tIFN0cnVjdHVyZWQgTG9ncyBTZWN0aW9uIC0tPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5TdHJ1Y3R1cmVkIExvZ3MgKElMb2dFbnRyeSk8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj4KICAgICAgICAgIFN0cnVjdHVyZWQgbG9nIGVudHJpZXMgd2l0aCBsZXZlbCwgbWVzc2FnZSwgYW5kIHNvdXJjZS4gU3VwcG9ydHMgc2VhcmNoIGFuZCBrZXl3b3JkIGhpZ2hsaWdodGluZy4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9scyI+CiAgICAgICAgICA8ZGVlcy1idXR0b24+QWRkIFN0cnVjdHVyZWQgTG9nPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbj5TdGFydCBTdHJ1Y3R1cmVkPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbj5TdG9wIFN0cnVjdHVyZWQ8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkZWVzLWNoYXJ0LWxvZwogICAgICAgICAgaWQ9InN0cnVjdHVyZWQtbG9nIgogICAgICAgICAgLmxhYmVsPSR7IlByb2R1Y3Rpb24gU2VydmVyIExvZ3MifQogICAgICAgICAgLmhpZ2hsaWdodEtleXdvcmRzPSR7WyJlcnJvciIsICJmYWlsZWQiLCAidGltZW91dCJdfQogICAgICAgICAgLnNob3dNZXRyaWNzPSR7dHJ1ZX0KICAgICAgICA+PC9kZWVzLWNoYXJ0LWxvZz4KICAgICAgPC9kaXY+CgogICAgICA8IS0tIFJhdyBMb2dzIFNlY3Rpb24gLS0+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlJhdyBMb2dzIChEb2NrZXIvQ29udGFpbmVyIFN0eWxlKTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPgogICAgICAgICAgUmF3IGxvZyBvdXRwdXQgd2l0aCBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgZm9yIHJlYWwgRG9ja2VyL2NvbnRhaW5lciBsb2dzLgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xzIj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbj5BZGQgRG9ja2VyIExvZzwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24+U3RhcnQgRG9ja2VyPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbj5TdG9wIERvY2tlcjwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRlZXMtY2hhcnQtbG9nCiAgICAgICAgICBpZD0icmF3LWxvZyIKICAgICAgICAgIC5sYWJlbD0keyJEb2NrZXIgQ29udGFpbmVyIExvZ3MifQogICAgICAgICAgLm1vZGU9JHsicmF3In0KICAgICAgICAgIC5zaG93TWV0cmljcz0ke2ZhbHNlfQogICAgICAgID48L2RlZXMtY2hhcnQtbG9nPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgogIGA7Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtY2hhcnQvZGVlcy1jaGFydC1sb2cvZGVlcy1jaGFydC1sb2cuanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF9kaXN0X3RzMjUoKTsKaW5pdF90aGVtZSgpOwppbml0X3NlcnZpY2VzKCk7CnZhciBfX2VzRGVjb3JhdGU0NyA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNDggPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNDaGFydExvZyA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtY2hhcnQtbG9nIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfbGFiZWxfZGVjb3JhdG9yczsKICBsZXQgX2xhYmVsX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGFiZWxfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21vZGVfZGVjb3JhdG9yczsKICBsZXQgX21vZGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tb2RlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb2dFbnRyaWVzX2RlY29yYXRvcnM7CiAgbGV0IF9sb2dFbnRyaWVzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbG9nRW50cmllc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYXV0b1Njcm9sbF9kZWNvcmF0b3JzOwogIGxldCBfYXV0b1Njcm9sbF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2F1dG9TY3JvbGxfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21heEVudHJpZXNfZGVjb3JhdG9yczsKICBsZXQgX21heEVudHJpZXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYXhFbnRyaWVzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oaWdobGlnaHRLZXl3b3Jkc19kZWNvcmF0b3JzOwogIGxldCBfaGlnaGxpZ2h0S2V5d29yZHNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oaWdobGlnaHRLZXl3b3Jkc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd01ldHJpY3NfZGVjb3JhdG9yczsKICBsZXQgX3Nob3dNZXRyaWNzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd01ldHJpY3NfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlYXJjaFF1ZXJ5X2RlY29yYXRvcnM7CiAgbGV0IF9zZWFyY2hRdWVyeV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlYXJjaFF1ZXJ5X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWx0ZXJNb2RlX2RlY29yYXRvcnM7CiAgbGV0IF9maWx0ZXJNb2RlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZmlsdGVyTW9kZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWV0cmljc19kZWNvcmF0b3JzOwogIGxldCBfbWV0cmljc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21ldHJpY3NfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Rlcm1pbmFsUmVhZHlfZGVjb3JhdG9yczsKICBsZXQgX3Rlcm1pbmFsUmVhZHlfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90ZXJtaW5hbFJlYWR5X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNDaGFydExvZzIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9sYWJlbF9kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfbW9kZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2xvZ0VudHJpZXNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX2F1dG9TY3JvbGxfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfbWF4RW50cmllc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX2hpZ2hsaWdodEtleXdvcmRzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF9zaG93TWV0cmljc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9zZWFyY2hRdWVyeV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfZmlsdGVyTW9kZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfbWV0cmljc19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfdGVybWluYWxSZWFkeV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGU0Nyh0aGlzLCBudWxsLCBfbGFiZWxfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibGFiZWwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImxhYmVsIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmxhYmVsLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5sYWJlbCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9sYWJlbF9pbml0aWFsaXplcnMsIF9sYWJlbF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ3KHRoaXMsIG51bGwsIF9tb2RlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1vZGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1vZGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubW9kZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubW9kZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tb2RlX2luaXRpYWxpemVycywgX21vZGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Nyh0aGlzLCBudWxsLCBfbG9nRW50cmllc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsb2dFbnRyaWVzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsb2dFbnRyaWVzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmxvZ0VudHJpZXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxvZ0VudHJpZXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbG9nRW50cmllc19pbml0aWFsaXplcnMsIF9sb2dFbnRyaWVzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDcodGhpcywgbnVsbCwgX2F1dG9TY3JvbGxfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYXV0b1Njcm9sbCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYXV0b1Njcm9sbCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hdXRvU2Nyb2xsLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hdXRvU2Nyb2xsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2F1dG9TY3JvbGxfaW5pdGlhbGl6ZXJzLCBfYXV0b1Njcm9sbF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ3KHRoaXMsIG51bGwsIF9tYXhFbnRyaWVzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1heEVudHJpZXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1heEVudHJpZXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWF4RW50cmllcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWF4RW50cmllcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tYXhFbnRyaWVzX2luaXRpYWxpemVycywgX21heEVudHJpZXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Nyh0aGlzLCBudWxsLCBfaGlnaGxpZ2h0S2V5d29yZHNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaGlnaGxpZ2h0S2V5d29yZHMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImhpZ2hsaWdodEtleXdvcmRzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmhpZ2hsaWdodEtleXdvcmRzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5oaWdobGlnaHRLZXl3b3JkcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9oaWdobGlnaHRLZXl3b3Jkc19pbml0aWFsaXplcnMsIF9oaWdobGlnaHRLZXl3b3Jkc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ3KHRoaXMsIG51bGwsIF9zaG93TWV0cmljc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93TWV0cmljcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd01ldHJpY3MiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2hvd01ldHJpY3MsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dNZXRyaWNzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dNZXRyaWNzX2luaXRpYWxpemVycywgX3Nob3dNZXRyaWNzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDcodGhpcywgbnVsbCwgX3NlYXJjaFF1ZXJ5X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlYXJjaFF1ZXJ5Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWFyY2hRdWVyeSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWFyY2hRdWVyeSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VhcmNoUXVlcnkgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VhcmNoUXVlcnlfaW5pdGlhbGl6ZXJzLCBfc2VhcmNoUXVlcnlfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Nyh0aGlzLCBudWxsLCBfZmlsdGVyTW9kZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJmaWx0ZXJNb2RlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJmaWx0ZXJNb2RlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmZpbHRlck1vZGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmZpbHRlck1vZGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZmlsdGVyTW9kZV9pbml0aWFsaXplcnMsIF9maWx0ZXJNb2RlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDcodGhpcywgbnVsbCwgX21ldHJpY3NfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWV0cmljcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWV0cmljcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tZXRyaWNzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tZXRyaWNzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21ldHJpY3NfaW5pdGlhbGl6ZXJzLCBfbWV0cmljc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ3KHRoaXMsIG51bGwsIF90ZXJtaW5hbFJlYWR5X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRlcm1pbmFsUmVhZHkiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRlcm1pbmFsUmVhZHkiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudGVybWluYWxSZWFkeSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGVybWluYWxSZWFkeSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90ZXJtaW5hbFJlYWR5X2luaXRpYWxpemVycywgX3Rlcm1pbmFsUmVhZHlfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0NyhudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNDaGFydExvZzIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzMzOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkNoYXJ0IiwgIldvcmtzcGFjZSJdOwogICAgI2xhYmVsX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczQ4KHRoaXMsIF9sYWJlbF9pbml0aWFsaXplcnMsICJTZXJ2ZXIgTG9ncyIpOwogICAgZ2V0IGxhYmVsKCkgewogICAgICByZXR1cm4gdGhpcy4jbGFiZWxfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsYWJlbCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbGFiZWxfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtb2RlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0OCh0aGlzLCBfbGFiZWxfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQ4KHRoaXMsIF9tb2RlX2luaXRpYWxpemVycywgInN0cnVjdHVyZWQiKSk7CiAgICBnZXQgbW9kZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21vZGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtb2RlKHZhbHVlMikgewogICAgICB0aGlzLiNtb2RlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbG9nRW50cmllc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDgodGhpcywgX21vZGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQ4KHRoaXMsIF9sb2dFbnRyaWVzX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBsb2dFbnRyaWVzKCkgewogICAgICByZXR1cm4gdGhpcy4jbG9nRW50cmllc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxvZ0VudHJpZXModmFsdWUyKSB7CiAgICAgIHRoaXMuI2xvZ0VudHJpZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhdXRvU2Nyb2xsX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0OCh0aGlzLCBfbG9nRW50cmllc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDgodGhpcywgX2F1dG9TY3JvbGxfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgYXV0b1Njcm9sbCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2F1dG9TY3JvbGxfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhdXRvU2Nyb2xsKHZhbHVlMikgewogICAgICB0aGlzLiNhdXRvU2Nyb2xsX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWF4RW50cmllc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDgodGhpcywgX2F1dG9TY3JvbGxfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQ4KHRoaXMsIF9tYXhFbnRyaWVzX2luaXRpYWxpemVycywgMWU0KSk7CiAgICBnZXQgbWF4RW50cmllcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI21heEVudHJpZXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtYXhFbnRyaWVzKHZhbHVlMikgewogICAgICB0aGlzLiNtYXhFbnRyaWVzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaGlnaGxpZ2h0S2V5d29yZHNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ4KHRoaXMsIF9tYXhFbnRyaWVzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0OCh0aGlzLCBfaGlnaGxpZ2h0S2V5d29yZHNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IGhpZ2hsaWdodEtleXdvcmRzKCkgewogICAgICByZXR1cm4gdGhpcy4jaGlnaGxpZ2h0S2V5d29yZHNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBoaWdobGlnaHRLZXl3b3Jkcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaGlnaGxpZ2h0S2V5d29yZHNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93TWV0cmljc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDgodGhpcywgX2hpZ2hsaWdodEtleXdvcmRzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0OCh0aGlzLCBfc2hvd01ldHJpY3NfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgc2hvd01ldHJpY3MoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93TWV0cmljc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dNZXRyaWNzKHZhbHVlMikgewogICAgICB0aGlzLiNzaG93TWV0cmljc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NlYXJjaFF1ZXJ5X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0OCh0aGlzLCBfc2hvd01ldHJpY3NfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQ4KHRoaXMsIF9zZWFyY2hRdWVyeV9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgc2VhcmNoUXVlcnkoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWFyY2hRdWVyeV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNlYXJjaFF1ZXJ5KHZhbHVlMikgewogICAgICB0aGlzLiNzZWFyY2hRdWVyeV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2ZpbHRlck1vZGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ4KHRoaXMsIF9zZWFyY2hRdWVyeV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDgodGhpcywgX2ZpbHRlck1vZGVfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGZpbHRlck1vZGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNmaWx0ZXJNb2RlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZmlsdGVyTW9kZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZmlsdGVyTW9kZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21ldHJpY3NfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ4KHRoaXMsIF9maWx0ZXJNb2RlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0OCh0aGlzLCBfbWV0cmljc19pbml0aWFsaXplcnMsIHsgZGVidWc6IDAsIGluZm86IDAsIHdhcm46IDAsIGVycm9yOiAwLCBzdWNjZXNzOiAwLCB0b3RhbDogMCwgcmF0ZTogMCB9KSk7CiAgICBnZXQgbWV0cmljcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI21ldHJpY3NfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtZXRyaWNzKHZhbHVlMikgewogICAgICB0aGlzLiNtZXRyaWNzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdGVybWluYWxSZWFkeV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDgodGhpcywgX21ldHJpY3NfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQ4KHRoaXMsIF90ZXJtaW5hbFJlYWR5X2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCB0ZXJtaW5hbFJlYWR5KCkgewogICAgICByZXR1cm4gdGhpcy4jdGVybWluYWxSZWFkeV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRlcm1pbmFsUmVhZHkodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Rlcm1pbmFsUmVhZHlfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIC8vIEJ1ZmZlciBvZiBhbGwgbG9nIGVudHJpZXMgZm9yIGZpbHRlciBtb2RlCiAgICBsb2dCdWZmZXIgPSAoX19ydW5Jbml0aWFsaXplcnM0OCh0aGlzLCBfdGVybWluYWxSZWFkeV9leHRyYUluaXRpYWxpemVycyksIFtdKTsKICAgIC8vIFRyYWNrIHRyYWlsaW5nIGhpZGRlbiBlbnRyaWVzIGNvdW50IGZvciBsaXZlIHVwZGF0ZXMgaW4gZmlsdGVyIG1vZGUKICAgIHRyYWlsaW5nSGlkZGVuQ291bnQgPSAwOwogICAgLy8geHRlcm0gaW5zdGFuY2VzCiAgICB0ZXJtaW5hbCA9IG51bGw7CiAgICBmaXRBZGRvbiA9IG51bGw7CiAgICBzZWFyY2hBZGRvbiA9IG51bGw7CiAgICByZXNpemVPYnNlcnZlciA9IG51bGw7CiAgICB0ZXJtaW5hbFRoZW1lU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgIGRvbXRvb2xzSW5zdGFuY2UgPSBudWxsOwogICAgLy8gUmF0ZSBjYWxjdWxhdGlvbgogICAgcmF0ZUJ1ZmZlciA9IFtdOwogICAgcmF0ZUludGVydmFsID0gbnVsbDsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc2Fucy1zZXJpZjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDMuOSUpIiwgImhzbCgwIDAlIDk4JSkiKX07CiAgICAgIH0KCiAgICAgIC5tYWluYm94IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiA0MDBweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgMy45JSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTclKSIsICJoc2woMCAwJSA3JSkiKX07CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEycHg7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CgogICAgICAudGl0bGUgewogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk1JSkiKX07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLnNlYXJjaC1ib3ggewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDRweDsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAzMDBweDsKICAgICAgfQoKICAgICAgLnNlYXJjaC1ib3ggaW5wdXQgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgcGFkZGluZzogNHB4IDhweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSA5JSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTUlKSIpfTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICAuc2VhcmNoLWJveCBpbnB1dDpmb2N1cyB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIil9OwogICAgICB9CgogICAgICAuc2VhcmNoLWJveCBpbnB1dDo6cGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNjMuOSUpIiwgImhzbCgwIDAlIDQ1LjElKSIpfTsKICAgICAgfQoKICAgICAgLnNlYXJjaC1uYXYgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiAycHg7CiAgICAgIH0KCiAgICAgIC5zZWFyY2gtbmF2IGJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogNHB4IDZweDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NS4xJSkiLCAiaHNsKDAgMCUgNjMuOSUpIil9OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgfQoKICAgICAgLnNlYXJjaC1uYXYgYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUuMSUpIiwgImhzbCgwIDAlIDIwJSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxNSUpIiwgImhzbCgwIDAlIDkzLjklKSIpfTsKICAgICAgfQoKICAgICAgLmZpbHRlci10b2dnbGUgewogICAgICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NS4xJSkiLCAiaHNsKDAgMCUgNjMuOSUpIil9OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLmZpbHRlci10b2dnbGU6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NS4xJSkiLCAiaHNsKDAgMCUgMjAlKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDE1JSkiLCAiaHNsKDAgMCUgOTMuOSUpIil9OwogICAgICB9CgogICAgICAuZmlsdGVyLXRvZ2dsZS5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woNDUgOTMlIDQ3JSkiLCAiaHNsKDQ1IDkzJSA0NyUpIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCg0NSA5MyUgNDclKSIsICJoc2woNDUgOTMlIDQ3JSkiKX07CiAgICAgICAgY29sb3I6IGhzbCgwIDAlIDklKTsKICAgICAgfQoKICAgICAgLmNvbnRyb2xzIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogNnB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgICB9CgogICAgICAuY29udHJvbC1idXR0b24gewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIHBhZGRpbmc6IDRweCAxMHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDUuMSUpIiwgImhzbCgwIDAlIDYzLjklKSIpfTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzOwogICAgICB9CgogICAgICAuY29udHJvbC1idXR0b246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NS4xJSkiLCAiaHNsKDAgMCUgMjAlKSIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA3OS44JSkiLCAiaHNsKDAgMCUgMjUlKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDE1JSkiLCAiaHNsKDAgMCUgOTMuOSUpIil9OwogICAgICB9CgogICAgICAuY29udHJvbC1idXR0b24uYWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA1MS4yJSkiLCAiaHNsKDIxNy4yIDkxLjIlIDU5LjglKSIpfTsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KCiAgICAgIC50ZXJtaW5hbC1jb250YWluZXIgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDMuOSUpIil9OwogICAgICB9CgogICAgICAudGVybWluYWwtY29udGFpbmVyIC54dGVybSB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAubG9hZGluZy1zdGF0ZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQ1LjElKSIsICJoc2woMCAwJSA2My45JSkiKX07CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgLm1ldHJpY3MtYmFyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTclKSIsICJoc2woMCAwJSA3JSkiKX07CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIHBhZGRpbmc6IDZweCAxMnB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAubWV0cmljIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgIH0KCiAgICAgIC5tZXRyaWM6OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgd2lkdGg6IDhweDsKICAgICAgICBoZWlnaHQ6IDhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIH0KCiAgICAgIC5tZXRyaWMuZXJyb3I6OmJlZm9yZSB7CiAgICAgICAgYmFja2dyb3VuZDogaHNsKDAgODQuMiUgNjAuMiUpOwogICAgICB9CgogICAgICAubWV0cmljLndhcm46OmJlZm9yZSB7CiAgICAgICAgYmFja2dyb3VuZDogaHNsKDI1IDk1JSA1MyUpOwogICAgICB9CgogICAgICAubWV0cmljLmluZm86OmJlZm9yZSB7CiAgICAgICAgYmFja2dyb3VuZDogaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKTsKICAgICAgfQoKICAgICAgLm1ldHJpYy5zdWNjZXNzOjpiZWZvcmUgewogICAgICAgIGJhY2tncm91bmQ6IGhzbCgxNDIuMSA3Ni4yJSAzNi4zJSk7CiAgICAgIH0KCiAgICAgIC5tZXRyaWMuZGVidWc6OmJlZm9yZSB7CiAgICAgICAgYmFja2dyb3VuZDogaHNsKDAgMCUgNjMuOSUpOwogICAgICB9CgogICAgICAubWV0cmljLnJhdGUgewogICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDUuMSUpIiwgImhzbCgwIDAlIDYzLjklKSIpfTsKICAgICAgfQoKICAgICAgLm1ldHJpYy5yYXRlOjpiZWZvcmUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgZG9tdG9vbHNfZWxlbWVudGJhc2ljX2V4cG9ydHMuc2V0dXAoKTsKICAgIH0KICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJtYWluYm94Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPiR7dGhpcy5sYWJlbH08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNlYXJjaC1ib3giPgogICAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IgogICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJTZWFyY2ggbG9ncy4uLiIKICAgICAgICAgICAgICAudmFsdWU9JHt0aGlzLnNlYXJjaFF1ZXJ5fQogICAgICAgICAgICAgIEBpbnB1dD0keyhlMTEpID0+IHRoaXMuaGFuZGxlU2VhcmNoSW5wdXQoZTExKX0KICAgICAgICAgICAgICBAa2V5ZG93bj0keyhlMTEpID0+IHRoaXMuaGFuZGxlU2VhcmNoS2V5ZG93bihlMTEpfQogICAgICAgICAgICAvPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWFyY2gtbmF2Ij4KICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz0keygpID0+IHRoaXMuc2VhcmNoUHJldmlvdXMoKX0gdGl0bGU9IlByZXZpb3VzIG1hdGNoIj7ihpE8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz0keygpID0+IHRoaXMuc2VhcmNoTmV4dCgpfSB0aXRsZT0iTmV4dCBtYXRjaCI+4oaTPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgY2xhc3M9ImZpbHRlci10b2dnbGUgJHt0aGlzLmZpbHRlck1vZGUgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnRvZ2dsZUZpbHRlck1vZGUoKX0KICAgICAgICAgICAgICB0aXRsZT0iJHt0aGlzLmZpbHRlck1vZGUgPyAiU3dpdGNoIHRvIGhpZ2hsaWdodCBtb2RlIiA6ICJTd2l0Y2ggdG8gZmlsdGVyIG1vZGUifSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgICR7dGhpcy5maWx0ZXJNb2RlID8gIkZpbHRlciIgOiAiSGlnaGxpZ2h0In0KICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xzIj4KICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgIGNsYXNzPSJjb250cm9sLWJ1dHRvbiAke3RoaXMuYXV0b1Njcm9sbCA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMudG9nZ2xlQXV0b1Njcm9sbCgpfQogICAgICAgICAgICA+CiAgICAgICAgICAgICAgQXV0byBTY3JvbGwKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNvbnRyb2wtYnV0dG9uIiBAY2xpY2s9JHsoKSA9PiB0aGlzLmNsZWFyTG9ncygpfT4KICAgICAgICAgICAgICBDbGVhcgogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXJtaW5hbC1jb250YWluZXIiPgogICAgICAgICAgJHshdGhpcy50ZXJtaW5hbFJlYWR5ID8gYjJgPGRpdiBjbGFzcz0ibG9hZGluZy1zdGF0ZSI+TG9hZGluZyB0ZXJtaW5hbC4uLjwvZGl2PmAgOiAiIn0KICAgICAgICA8L2Rpdj4KCiAgICAgICAgJHt0aGlzLnNob3dNZXRyaWNzID8gYjJgCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWV0cmljcy1iYXIiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1ldHJpYyBlcnJvciI+ZXJyb3JzOiAke3RoaXMubWV0cmljcy5lcnJvcn08L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWV0cmljIHdhcm4iPndhcm5zOiAke3RoaXMubWV0cmljcy53YXJufTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtZXRyaWMgaW5mbyI+aW5mbzogJHt0aGlzLm1ldHJpY3MuaW5mb308L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWV0cmljIHN1Y2Nlc3MiPnN1Y2Nlc3M6ICR7dGhpcy5tZXRyaWNzLnN1Y2Nlc3N9PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1ldHJpYyBkZWJ1ZyI+ZGVidWc6ICR7dGhpcy5tZXRyaWNzLmRlYnVnfTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtZXRyaWMgcmF0ZSI+JHt0aGlzLm1ldHJpY3MucmF0ZS50b0ZpeGVkKDEpfSBsb2dzL3NlYzwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYCA6ICIifQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIHRoaXMuZG9tdG9vbHNJbnN0YW5jZSA9IGF3YWl0IHRoaXMuZG9tdG9vbHNQcm9taXNlOwogICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVUZXJtaW5hbCgpOwogICAgICBpZiAodGhpcy5sb2dFbnRyaWVzLmxlbmd0aCA+IDApIHsKICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMubG9nRW50cmllcykgewogICAgICAgICAgdGhpcy53cml0ZUxvZ0VudHJ5KGVudHJ5KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGluaXRpYWxpemVUZXJtaW5hbCgpIHsKICAgICAgY29uc3QgbGliTG9hZGVyID0gRGVlc1NlcnZpY2VMaWJMb2FkZXIuZ2V0SW5zdGFuY2UoKTsKICAgICAgY29uc3QgW3h0ZXJtQnVuZGxlLCBmaXRCdW5kbGUsIHNlYXJjaEJ1bmRsZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbCiAgICAgICAgbGliTG9hZGVyLmxvYWRYdGVybSgpLAogICAgICAgIGxpYkxvYWRlci5sb2FkWHRlcm1GaXRBZGRvbigpLAogICAgICAgIGxpYkxvYWRlci5sb2FkWHRlcm1TZWFyY2hBZGRvbigpCiAgICAgIF0pOwogICAgICBhd2FpdCB0aGlzLmluamVjdFh0ZXJtU3R5bGVzSW50b1NoYWRvdygpOwogICAgICB0aGlzLnRlcm1pbmFsID0gbmV3IHh0ZXJtQnVuZGxlLlRlcm1pbmFsKHsKICAgICAgICBjdXJzb3JCbGluazogZmFsc2UsCiAgICAgICAgZGlzYWJsZVN0ZGluOiB0cnVlLAogICAgICAgIGZvbnRTaXplOiAxMiwKICAgICAgICBmb250RmFtaWx5OiAiJ1NGIE1vbm8nLCAnTW9uYWNvJywgJ0NvbnNvbGFzJywgJ0xpYmVyYXRpb24gTW9ubycsICdDb3VyaWVyIE5ldycsIG1vbm9zcGFjZSIsCiAgICAgICAgdGhlbWU6IHRoaXMuZ2V0VGVybWluYWxUaGVtZSgpLAogICAgICAgIHNjcm9sbGJhY2s6IHRoaXMubWF4RW50cmllcywKICAgICAgICBjb252ZXJ0RW9sOiB0cnVlCiAgICAgIH0pOwogICAgICB0aGlzLmZpdEFkZG9uID0gbmV3IGZpdEJ1bmRsZS5GaXRBZGRvbigpOwogICAgICB0aGlzLnNlYXJjaEFkZG9uID0gbmV3IHNlYXJjaEJ1bmRsZS5TZWFyY2hBZGRvbigpOwogICAgICB0aGlzLnRlcm1pbmFsLmxvYWRBZGRvbih0aGlzLmZpdEFkZG9uKTsKICAgICAgdGhpcy50ZXJtaW5hbC5sb2FkQWRkb24odGhpcy5zZWFyY2hBZGRvbik7CiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIudGVybWluYWwtY29udGFpbmVyIik7CiAgICAgIHRoaXMudGVybWluYWwub3Blbihjb250YWluZXIpOwogICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShyZXNvbHZlMikpOwogICAgICB0aGlzLmZpdEFkZG9uLmZpdCgpOwogICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHsKICAgICAgICB0aGlzLmZpdEFkZG9uPy5maXQoKTsKICAgICAgfSk7CiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShjb250YWluZXIpOwogICAgICB0aGlzLnRlcm1pbmFsVGhlbWVTdWJzY3JpcHRpb24gPSB0aGlzLmRvbXRvb2xzSW5zdGFuY2UudGhlbWVNYW5hZ2VyLnRoZW1lT2JzZXJ2YWJsZS5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgIGlmICh0aGlzLnRlcm1pbmFsKSB7CiAgICAgICAgICB0aGlzLnRlcm1pbmFsLm9wdGlvbnMudGhlbWUgPSB0aGlzLmdldFRlcm1pbmFsVGhlbWUoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLnJhdGVJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHRoaXMuY2FsY3VsYXRlUmF0ZSgpLCAxZTMpOwogICAgICB0aGlzLnRlcm1pbmFsUmVhZHkgPSB0cnVlOwogICAgfQogICAgZ2V0VGVybWluYWxUaGVtZSgpIHsKICAgICAgY29uc3QgaXNEYXJrID0gdGhpcy5kb210b29sc0luc3RhbmNlPy50aGVtZU1hbmFnZXI/LmlzRGFya01vZGUgPz8gdHJ1ZTsKICAgICAgcmV0dXJuIGlzRGFyayA/IHsKICAgICAgICBiYWNrZ3JvdW5kOiAiIzBhMGEwYSIsCiAgICAgICAgZm9yZWdyb3VuZDogIiNlMGUwZTAiLAogICAgICAgIGN1cnNvcjogIiNlMGUwZTAiLAogICAgICAgIHNlbGVjdGlvbkJhY2tncm91bmQ6ICIjNDA0MDQwIiwKICAgICAgICBibGFjazogIiMwMDAwMDAiLAogICAgICAgIHJlZDogIiNmZjU1NTUiLAogICAgICAgIGdyZWVuOiAiIzUwZmE3YiIsCiAgICAgICAgeWVsbG93OiAiI2YxZmE4YyIsCiAgICAgICAgYmx1ZTogIiM2MjcyYTQiLAogICAgICAgIG1hZ2VudGE6ICIjZmY3OWM2IiwKICAgICAgICBjeWFuOiAiIzhiZTlmZCIsCiAgICAgICAgd2hpdGU6ICIjZjhmOGYyIiwKICAgICAgICBicmlnaHRCbGFjazogIiM2MjcyYTQiLAogICAgICAgIGJyaWdodFJlZDogIiNmZjZlNmUiLAogICAgICAgIGJyaWdodEdyZWVuOiAiIzY5ZmY5NCIsCiAgICAgICAgYnJpZ2h0WWVsbG93OiAiI2ZmZmZhNSIsCiAgICAgICAgYnJpZ2h0Qmx1ZTogIiNkNmFjZmYiLAogICAgICAgIGJyaWdodE1hZ2VudGE6ICIjZmY5MmRmIiwKICAgICAgICBicmlnaHRDeWFuOiAiI2E0ZmZmZiIsCiAgICAgICAgYnJpZ2h0V2hpdGU6ICIjZmZmZmZmIgogICAgICB9IDogewogICAgICAgIGJhY2tncm91bmQ6ICIjZmZmZmZmIiwKICAgICAgICBmb3JlZ3JvdW5kOiAiIzMzMzMzMyIsCiAgICAgICAgY3Vyc29yOiAiIzMzMzMzMyIsCiAgICAgICAgc2VsZWN0aW9uQmFja2dyb3VuZDogIiNhZGQ2ZmYiLAogICAgICAgIGJsYWNrOiAiIzAwMDAwMCIsCiAgICAgICAgcmVkOiAiI2NkMzEzMSIsCiAgICAgICAgZ3JlZW46ICIjMDBiYzAwIiwKICAgICAgICB5ZWxsb3c6ICIjOTQ5ODAwIiwKICAgICAgICBibHVlOiAiIzA0NTFhNSIsCiAgICAgICAgbWFnZW50YTogIiNiYzA1YmMiLAogICAgICAgIGN5YW46ICIjMDU5OGJjIiwKICAgICAgICB3aGl0ZTogIiM1NTU1NTUiLAogICAgICAgIGJyaWdodEJsYWNrOiAiIzY2NjY2NiIsCiAgICAgICAgYnJpZ2h0UmVkOiAiI2NkMzEzMSIsCiAgICAgICAgYnJpZ2h0R3JlZW46ICIjMTRjZTE0IiwKICAgICAgICBicmlnaHRZZWxsb3c6ICIjYjViYTAwIiwKICAgICAgICBicmlnaHRCbHVlOiAiIzA0NTFhNSIsCiAgICAgICAgYnJpZ2h0TWFnZW50YTogIiNiYzA1YmMiLAogICAgICAgIGJyaWdodEN5YW46ICIjMDU5OGJjIiwKICAgICAgICBicmlnaHRXaGl0ZTogIiNhNWE1YTUiCiAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIEluamVjdCB4dGVybSBDU1Mgc3R5bGVzIGludG8gc2hhZG93IHJvb3QKICAgICAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc2hhZG93IERPTSBkb2Vzbid0IGluaGVyaXQgc3R5bGVzIGZyb20gZG9jdW1lbnQuaGVhZAogICAgICovCiAgICBhc3luYyBpbmplY3RYdGVybVN0eWxlc0ludG9TaGFkb3coKSB7CiAgICAgIGNvbnN0IHN0eWxlSWQgPSAieHRlcm0tc2hhZG93LXN0eWxlcyI7CiAgICAgIGlmICh0aGlzLnNoYWRvd1Jvb3QuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgY3NzVXJsID0gYCR7Q0ROX0JBU0V9L3h0ZXJtQCR7Q0ROX1ZFUlNJT05TLnh0ZXJtfS9jc3MveHRlcm0uY3NzYDsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChjc3NVcmwpOwogICAgICBjb25zdCBjc3NUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpOwogICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgIHN0eWxlLmlkID0gc3R5bGVJZDsKICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBjc3NUZXh0OwogICAgICB0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoc3R5bGUpOwogICAgfQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBTdHJ1Y3R1cmVkIExvZyBNZXRob2RzCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0KICAgIC8qKgogICAgICogQWRkIGEgc2luZ2xlIHN0cnVjdHVyZWQgbG9nIGVudHJ5CiAgICAgKi8KICAgIGFkZExvZyhsZXZlbCwgbWVzc2FnZTIsIHNvdXJjZSkgewogICAgICBjb25zdCBlbnRyeSA9IHsKICAgICAgICB0aW1lc3RhbXA6ICgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKSwKICAgICAgICBsZXZlbCwKICAgICAgICBtZXNzYWdlOiBtZXNzYWdlMiwKICAgICAgICBzb3VyY2UKICAgICAgfTsKICAgICAgdGhpcy5sb2dCdWZmZXIucHVzaChlbnRyeSk7CiAgICAgIGlmICh0aGlzLmxvZ0J1ZmZlci5sZW5ndGggPiB0aGlzLm1heEVudHJpZXMpIHsKICAgICAgICB0aGlzLmxvZ0J1ZmZlci5zaGlmdCgpOwogICAgICB9CiAgICAgIGlmICghdGhpcy5maWx0ZXJNb2RlIHx8ICF0aGlzLnNlYXJjaFF1ZXJ5KSB7CiAgICAgICAgdGhpcy53cml0ZUxvZ0VudHJ5KGVudHJ5KTsKICAgICAgfSBlbHNlIGlmICh0aGlzLmVudHJ5TWF0Y2hlc0ZpbHRlcihlbnRyeSkpIHsKICAgICAgICB0aGlzLnRyYWlsaW5nSGlkZGVuQ291bnQgPSAwOwogICAgICAgIHRoaXMud3JpdGVMb2dFbnRyeShlbnRyeSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy51cGRhdGVUcmFpbGluZ1BsYWNlaG9sZGVyKCk7CiAgICAgIH0KICAgICAgdGhpcy51cGRhdGVNZXRyaWNzKGVudHJ5LmxldmVsKTsKICAgIH0KICAgIC8qKgogICAgICogQWRkIG11bHRpcGxlIHN0cnVjdHVyZWQgbG9nIGVudHJpZXMKICAgICAqLwogICAgdXBkYXRlTG9nKGVudHJpZXMpIHsKICAgICAgaWYgKCFlbnRyaWVzKQogICAgICAgIHJldHVybjsKICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7CiAgICAgICAgdGhpcy5sb2dCdWZmZXIucHVzaChlbnRyeSk7CiAgICAgICAgaWYgKHRoaXMubG9nQnVmZmVyLmxlbmd0aCA+IHRoaXMubWF4RW50cmllcykgewogICAgICAgICAgdGhpcy5sb2dCdWZmZXIuc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLmZpbHRlck1vZGUgfHwgIXRoaXMuc2VhcmNoUXVlcnkpIHsKICAgICAgICAgIHRoaXMud3JpdGVMb2dFbnRyeShlbnRyeSk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVudHJ5TWF0Y2hlc0ZpbHRlcihlbnRyeSkpIHsKICAgICAgICAgIHRoaXMudHJhaWxpbmdIaWRkZW5Db3VudCA9IDA7CiAgICAgICAgICB0aGlzLndyaXRlTG9nRW50cnkoZW50cnkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnVwZGF0ZVRyYWlsaW5nUGxhY2Vob2xkZXIoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy51cGRhdGVNZXRyaWNzKGVudHJ5LmxldmVsKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGUgdGhlIHRyYWlsaW5nIGhpZGRlbiBwbGFjZWhvbGRlciBpbiByZWFsLXRpbWUKICAgICAqIENsZWFycyB0aGUgbGFzdCBsaW5lIGlmIGEgcGxhY2Vob2xkZXIgYWxyZWFkeSBleGlzdHMsIHRoZW4gd3JpdGVzIHVwZGF0ZWQgY291bnQKICAgICAqLwogICAgdXBkYXRlVHJhaWxpbmdQbGFjZWhvbGRlcigpIHsKICAgICAgaWYgKCF0aGlzLnRlcm1pbmFsKQogICAgICAgIHJldHVybjsKICAgICAgaWYgKHRoaXMudHJhaWxpbmdIaWRkZW5Db3VudCA+IDApIHsKICAgICAgICB0aGlzLnRlcm1pbmFsLndyaXRlKCJceDFCWzFBXHgxQlsyS1xyIik7CiAgICAgIH0KICAgICAgdGhpcy50cmFpbGluZ0hpZGRlbkNvdW50Kys7CiAgICAgIHRoaXMud3JpdGVIaWRkZW5QbGFjZWhvbGRlcih0aGlzLnRyYWlsaW5nSGlkZGVuQ291bnQpOwogICAgICBpZiAodGhpcy5hdXRvU2Nyb2xsKSB7CiAgICAgICAgdGhpcy50ZXJtaW5hbC5zY3JvbGxUb0JvdHRvbSgpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrIGlmIGEgbG9nIGVudHJ5IG1hdGNoZXMgdGhlIGN1cnJlbnQgZmlsdGVyCiAgICAgKi8KICAgIGVudHJ5TWF0Y2hlc0ZpbHRlcihlbnRyeSkgewogICAgICBpZiAoIXRoaXMuc2VhcmNoUXVlcnkpCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zZWFyY2hRdWVyeS50b0xvd2VyQ2FzZSgpOwogICAgICByZXR1cm4gZW50cnkubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSB8fCBlbnRyeS5sZXZlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSB8fCAoZW50cnkuc291cmNlPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSA/PyBmYWxzZSk7CiAgICB9CiAgICB3cml0ZUxvZ0VudHJ5KGVudHJ5KSB7CiAgICAgIGlmICghdGhpcy50ZXJtaW5hbCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0TG9nRW50cnkoZW50cnkpOwogICAgICB0aGlzLnRlcm1pbmFsLndyaXRlbG4oZm9ybWF0dGVkKTsKICAgICAgaWYgKHRoaXMuYXV0b1Njcm9sbCkgewogICAgICAgIHRoaXMudGVybWluYWwuc2Nyb2xsVG9Cb3R0b20oKTsKICAgICAgfQogICAgfQogICAgZm9ybWF0TG9nRW50cnkoZW50cnkpIHsKICAgICAgY29uc3QgdGltZXN0YW1wMiA9IHRoaXMuZm9ybWF0VGltZXN0YW1wKGVudHJ5LnRpbWVzdGFtcCk7CiAgICAgIGNvbnN0IGxldmVsQ29sb3JzID0gewogICAgICAgIGRlYnVnOiAiXHgxQls5MG0iLAogICAgICAgIC8vIEdyYXkKICAgICAgICBpbmZvOiAiXHgxQlszNm0iLAogICAgICAgIC8vIEN5YW4KICAgICAgICB3YXJuOiAiXHgxQlszM20iLAogICAgICAgIC8vIFllbGxvdwogICAgICAgIGVycm9yOiAiXHgxQlszMW0iLAogICAgICAgIC8vIFJlZAogICAgICAgIHN1Y2Nlc3M6ICJceDFCWzMybSIKICAgICAgICAvLyBHcmVlbgogICAgICB9OwogICAgICBjb25zdCByZXNldCA9ICJceDFCWzBtIjsKICAgICAgY29uc3QgZGltID0gIlx4MUJbMm0iOwogICAgICBjb25zdCBsZXZlbFN0ciA9IGAke2xldmVsQ29sb3JzW2VudHJ5LmxldmVsXX1bJHtlbnRyeS5sZXZlbC50b1VwcGVyQ2FzZSgpLnBhZEVuZCg3KX1dJHtyZXNldH1gOwogICAgICBjb25zdCBzb3VyY2VTdHIgPSBlbnRyeS5zb3VyY2UgPyBgJHtkaW19WyR7ZW50cnkuc291cmNlfV0ke3Jlc2V0fSBgIDogIiI7CiAgICAgIGNvbnN0IG1lc3NhZ2VTdHIgPSB0aGlzLmFwcGx5SGlnaGxpZ2h0cyhlbnRyeS5tZXNzYWdlKTsKICAgICAgcmV0dXJuIGAke2RpbX0ke3RpbWVzdGFtcDJ9JHtyZXNldH0gJHtsZXZlbFN0cn0gJHtzb3VyY2VTdHJ9JHttZXNzYWdlU3RyfWA7CiAgICB9CiAgICBmb3JtYXRUaW1lc3RhbXAoaXNvU3RyaW5nKSB7CiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShpc29TdHJpbmcpOwogICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVRpbWVTdHJpbmcoImVuLVVTIiwgewogICAgICAgIGhvdXIxMjogZmFsc2UsCiAgICAgICAgaG91cjogIjItZGlnaXQiLAogICAgICAgIG1pbnV0ZTogIjItZGlnaXQiLAogICAgICAgIHNlY29uZDogIjItZGlnaXQiLAogICAgICAgIGZyYWN0aW9uYWxTZWNvbmREaWdpdHM6IDMKICAgICAgfSk7CiAgICB9CiAgICBhcHBseUhpZ2hsaWdodHModGV4dDkpIHsKICAgICAgY29uc3Qga2V5d29yZHMgPSBbLi4udGhpcy5oaWdobGlnaHRLZXl3b3Jkc107CiAgICAgIGlmICh0aGlzLmZpbHRlck1vZGUgJiYgdGhpcy5zZWFyY2hRdWVyeSkgewogICAgICAgIGtleXdvcmRzLnB1c2godGhpcy5zZWFyY2hRdWVyeSk7CiAgICAgIH0KICAgICAgaWYgKGtleXdvcmRzLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm4gdGV4dDk7CiAgICAgIGxldCByZXN1bHQgPSB0ZXh0OTsKICAgICAgZm9yIChjb25zdCBrZXl3b3JkIG9mIGtleXdvcmRzKSB7CiAgICAgICAgY29uc3QgZXNjYXBlZCA9IGtleXdvcmQucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICJcXCQmIik7CiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGAoJHtlc2NhcGVkfSlgLCAiZ2kiKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShyZWdleCwgIlx4MUJbNDNtXHgxQlszMG0kMVx4MUJbMG0iKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBSYXcgTG9nIE1ldGhvZHMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PQogICAgLyoqCiAgICAgKiBXcml0ZSByYXcgZGF0YSB0byB0aGUgdGVybWluYWwgKGZvciBEb2NrZXIgbG9ncywgZXRjLikKICAgICAqLwogICAgd3JpdGVSYXcoZGF0YSkgewogICAgICBpZiAoIXRoaXMudGVybWluYWwpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLnRlcm1pbmFsLndyaXRlKGRhdGEpOwogICAgICB0aGlzLnJlY29yZExvZ0V2ZW50KCk7CiAgICAgIGlmICh0aGlzLmF1dG9TY3JvbGwpIHsKICAgICAgICB0aGlzLnRlcm1pbmFsLnNjcm9sbFRvQm90dG9tKCk7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogV3JpdGUgYSByYXcgbGluZSB0byB0aGUgdGVybWluYWwKICAgICAqLwogICAgd3JpdGVsblJhdyhsaW5lKSB7CiAgICAgIGlmICghdGhpcy50ZXJtaW5hbCkKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMudGVybWluYWwud3JpdGVsbihsaW5lKTsKICAgICAgdGhpcy5yZWNvcmRMb2dFdmVudCgpOwogICAgICBpZiAodGhpcy5hdXRvU2Nyb2xsKSB7CiAgICAgICAgdGhpcy50ZXJtaW5hbC5zY3JvbGxUb0JvdHRvbSgpOwogICAgICB9CiAgICB9CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFNlYXJjaCBNZXRob2RzCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0KICAgIGhhbmRsZVNlYXJjaElucHV0KGUxMSkgewogICAgICBjb25zdCBpbnB1dCA9IGUxMS50YXJnZXQ7CiAgICAgIGNvbnN0IG5ld1F1ZXJ5ID0gaW5wdXQudmFsdWU7CiAgICAgIGNvbnN0IHF1ZXJ5Q2hhbmdlZCA9IHRoaXMuc2VhcmNoUXVlcnkgIT09IG5ld1F1ZXJ5OwogICAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gbmV3UXVlcnk7CiAgICAgIGlmICh0aGlzLmZpbHRlck1vZGUgJiYgcXVlcnlDaGFuZ2VkKSB7CiAgICAgICAgdGhpcy5yZVJlbmRlckZpbHRlcmVkTG9ncygpOwogICAgICB9IGVsc2UgaWYgKHRoaXMuc2VhcmNoUXVlcnkpIHsKICAgICAgICB0aGlzLnNlYXJjaEFkZG9uPy5maW5kTmV4dCh0aGlzLnNlYXJjaFF1ZXJ5KTsKICAgICAgfQogICAgfQogICAgaGFuZGxlU2VhcmNoS2V5ZG93bihlMTEpIHsKICAgICAgaWYgKGUxMS5rZXkgPT09ICJFbnRlciIpIHsKICAgICAgICBpZiAoZTExLnNoaWZ0S2V5KSB7CiAgICAgICAgICB0aGlzLnNlYXJjaFByZXZpb3VzKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuc2VhcmNoTmV4dCgpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChlMTEua2V5ID09PSAiRXNjYXBlIikgewogICAgICAgIHRoaXMuc2VhcmNoUXVlcnkgPSAiIjsKICAgICAgICBlMTEudGFyZ2V0LnZhbHVlID0gIiI7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2VhcmNoIGZvciBhIHF1ZXJ5IGluIHRoZSB0ZXJtaW5hbAogICAgICovCiAgICBzZWFyY2gocXVlcnkpIHsKICAgICAgdGhpcy5zZWFyY2hRdWVyeSA9IHF1ZXJ5OwogICAgICB0aGlzLnNlYXJjaEFkZG9uPy5maW5kTmV4dChxdWVyeSk7CiAgICB9CiAgICAvKioKICAgICAqIEZpbmQgbmV4dCBzZWFyY2ggbWF0Y2gKICAgICAqLwogICAgc2VhcmNoTmV4dCgpIHsKICAgICAgaWYgKHRoaXMuc2VhcmNoUXVlcnkpIHsKICAgICAgICB0aGlzLnNlYXJjaEFkZG9uPy5maW5kTmV4dCh0aGlzLnNlYXJjaFF1ZXJ5KTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBGaW5kIHByZXZpb3VzIHNlYXJjaCBtYXRjaAogICAgICovCiAgICBzZWFyY2hQcmV2aW91cygpIHsKICAgICAgaWYgKHRoaXMuc2VhcmNoUXVlcnkpIHsKICAgICAgICB0aGlzLnNlYXJjaEFkZG9uPy5maW5kUHJldmlvdXModGhpcy5zZWFyY2hRdWVyeSk7CiAgICAgIH0KICAgIH0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PQogICAgLy8gQ29udHJvbCBNZXRob2RzCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0KICAgIHRvZ2dsZUF1dG9TY3JvbGwoKSB7CiAgICAgIHRoaXMuYXV0b1Njcm9sbCA9ICF0aGlzLmF1dG9TY3JvbGw7CiAgICAgIGlmICh0aGlzLmF1dG9TY3JvbGwgJiYgdGhpcy50ZXJtaW5hbCkgewogICAgICAgIHRoaXMudGVybWluYWwuc2Nyb2xsVG9Cb3R0b20oKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBUb2dnbGUgYmV0d2VlbiBmaWx0ZXIgbW9kZSBhbmQgaGlnaGxpZ2h0IG1vZGUKICAgICAqLwogICAgdG9nZ2xlRmlsdGVyTW9kZSgpIHsKICAgICAgdGhpcy5maWx0ZXJNb2RlID0gIXRoaXMuZmlsdGVyTW9kZTsKICAgICAgdGhpcy5yZVJlbmRlckZpbHRlcmVkTG9ncygpOwogICAgfQogICAgLyoqCiAgICAgKiBSZS1yZW5kZXIgbG9ncyBiYXNlZCBvbiBjdXJyZW50IGZpbHRlciBzdGF0ZQogICAgICogSW4gZmlsdGVyIG1vZGU6IHNob3cgbWF0Y2hpbmcgbG9ncyB3aXRoIHBsYWNlaG9sZGVycyBmb3IgaGlkZGVuIGVudHJpZXMKICAgICAqIEluIGhpZ2hsaWdodCBtb2RlOiBzaG93IGFsbCBsb2dzCiAgICAgKi8KICAgIHJlUmVuZGVyRmlsdGVyZWRMb2dzKCkgewogICAgICBpZiAoIXRoaXMudGVybWluYWwpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLnRlcm1pbmFsLmNsZWFyKCk7CiAgICAgIHRoaXMudHJhaWxpbmdIaWRkZW5Db3VudCA9IDA7CiAgICAgIGlmICghdGhpcy5maWx0ZXJNb2RlIHx8ICF0aGlzLnNlYXJjaFF1ZXJ5KSB7CiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmxvZ0J1ZmZlcikgewogICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gdGhpcy5mb3JtYXRMb2dFbnRyeShlbnRyeSk7CiAgICAgICAgICB0aGlzLnRlcm1pbmFsLndyaXRlbG4oZm9ybWF0dGVkKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGV0IGhpZGRlbkNvdW50ID0gMDsKICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMubG9nQnVmZmVyKSB7CiAgICAgICAgICBpZiAodGhpcy5lbnRyeU1hdGNoZXNGaWx0ZXIoZW50cnkpKSB7CiAgICAgICAgICAgIGlmIChoaWRkZW5Db3VudCA+IDApIHsKICAgICAgICAgICAgICB0aGlzLndyaXRlSGlkZGVuUGxhY2Vob2xkZXIoaGlkZGVuQ291bnQpOwogICAgICAgICAgICAgIGhpZGRlbkNvdW50ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWQgPSB0aGlzLmZvcm1hdExvZ0VudHJ5KGVudHJ5KTsKICAgICAgICAgICAgdGhpcy50ZXJtaW5hbC53cml0ZWxuKGZvcm1hdHRlZCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoaWRkZW5Db3VudCsrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaGlkZGVuQ291bnQgPiAwKSB7CiAgICAgICAgICB0aGlzLndyaXRlSGlkZGVuUGxhY2Vob2xkZXIoaGlkZGVuQ291bnQpOwogICAgICAgICAgdGhpcy50cmFpbGluZ0hpZGRlbkNvdW50ID0gaGlkZGVuQ291bnQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0aGlzLmF1dG9TY3JvbGwpIHsKICAgICAgICB0aGlzLnRlcm1pbmFsLnNjcm9sbFRvQm90dG9tKCk7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogV3JpdGUgYSBwbGFjZWhvbGRlciBsaW5lIHNob3dpbmcgaG93IG1hbnkgbG9nIGVudHJpZXMgYXJlIGhpZGRlbiBieSBmaWx0ZXIKICAgICAqLwogICAgd3JpdGVIaWRkZW5QbGFjZWhvbGRlcihjb3VudDIpIHsKICAgICAgY29uc3QgZGltID0gIlx4MUJbMm0iOwogICAgICBjb25zdCByZXNldCA9ICJceDFCWzBtIjsKICAgICAgY29uc3QgdGV4dDkgPSBjb3VudDIgPT09IDEgPyBgWzEgbG9nIGxpbmUgaGlkZGVuIGJ5IGZpbHRlciAuLi5dYCA6IGBbJHtjb3VudDJ9IGxvZyBsaW5lcyBoaWRkZW4gYnkgZmlsdGVyIC4uLl1gOwogICAgICB0aGlzLnRlcm1pbmFsPy53cml0ZWxuKGAke2RpbX0ke3RleHQ5fSR7cmVzZXR9YCk7CiAgICB9CiAgICAvKioKICAgICAqIENsZWFyIGFsbCBsb2dzIGFuZCByZXNldCBtZXRyaWNzCiAgICAgKi8KICAgIGNsZWFyTG9ncygpIHsKICAgICAgdGhpcy50ZXJtaW5hbD8uY2xlYXIoKTsKICAgICAgdGhpcy5sb2dCdWZmZXIgPSBbXTsKICAgICAgdGhpcy50cmFpbGluZ0hpZGRlbkNvdW50ID0gMDsKICAgICAgdGhpcy5yZXNldE1ldHJpY3MoKTsKICAgIH0KICAgIC8qKgogICAgICogU2Nyb2xsIHRvIHRoZSBib3R0b20gb2YgdGhlIGxvZwogICAgICovCiAgICBzY3JvbGxUb0JvdHRvbSgpIHsKICAgICAgdGhpcy50ZXJtaW5hbD8uc2Nyb2xsVG9Cb3R0b20oKTsKICAgIH0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PQogICAgLy8gTWV0cmljcyBNZXRob2RzCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0KICAgIHVwZGF0ZU1ldHJpY3MobGV2ZWwpIHsKICAgICAgdGhpcy5tZXRyaWNzID0gewogICAgICAgIC4uLnRoaXMubWV0cmljcywKICAgICAgICBbbGV2ZWxdOiB0aGlzLm1ldHJpY3NbbGV2ZWxdICsgMSwKICAgICAgICB0b3RhbDogdGhpcy5tZXRyaWNzLnRvdGFsICsgMQogICAgICB9OwogICAgICB0aGlzLnJlY29yZExvZ0V2ZW50KCk7CiAgICB9CiAgICByZWNvcmRMb2dFdmVudCgpIHsKICAgICAgdGhpcy5yYXRlQnVmZmVyLnB1c2goRGF0ZS5ub3coKSk7CiAgICB9CiAgICBjYWxjdWxhdGVSYXRlKCkgewogICAgICBjb25zdCBub3cyID0gRGF0ZS5ub3coKTsKICAgICAgdGhpcy5yYXRlQnVmZmVyID0gdGhpcy5yYXRlQnVmZmVyLmZpbHRlcigodDkpID0+IG5vdzIgLSB0OSA8IDFlNCk7CiAgICAgIGNvbnN0IHJhdGUgPSB0aGlzLnJhdGVCdWZmZXIubGVuZ3RoIC8gMTA7CiAgICAgIGlmIChyYXRlICE9PSB0aGlzLm1ldHJpY3MucmF0ZSkgewogICAgICAgIHRoaXMubWV0cmljcyA9IHsgLi4udGhpcy5tZXRyaWNzLCByYXRlIH07CiAgICAgIH0KICAgIH0KICAgIHJlc2V0TWV0cmljcygpIHsKICAgICAgdGhpcy5tZXRyaWNzID0geyBkZWJ1ZzogMCwgaW5mbzogMCwgd2FybjogMCwgZXJyb3I6IDAsIHN1Y2Nlc3M6IDAsIHRvdGFsOiAwLCByYXRlOiAwIH07CiAgICAgIHRoaXMucmF0ZUJ1ZmZlciA9IFtdOwogICAgfQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBMaWZlY3ljbGUKICAgIC8vID09PT09PT09PT09PT09PT09PT09PQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGlmICh0aGlzLnJlc2l6ZU9ic2VydmVyKSB7CiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMudGVybWluYWxUaGVtZVN1YnNjcmlwdGlvbikgewogICAgICAgIHRoaXMudGVybWluYWxUaGVtZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICB9CiAgICAgIGlmICh0aGlzLnJhdGVJbnRlcnZhbCkgewogICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5yYXRlSW50ZXJ2YWwpOwogICAgICB9CiAgICAgIGlmICh0aGlzLnRlcm1pbmFsKSB7CiAgICAgICAgdGhpcy50ZXJtaW5hbC5kaXNwb3NlKCk7CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNDgoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNDaGFydExvZzIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWRhdGF2aWV3L2RlZXMtZGF0YXZpZXctY29kZWJveC9kZWVzLWRhdGF2aWV3LWNvZGVib3guZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgZGVtb0Z1bmMzNCA9ICgpID0+IGIyYAogIDxzdHlsZT4KICAgIC5kZW1vV3JhcHBlciB7CiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIG1pbi1oZWlnaHQ6IDEwMHZoOwogICAgICBwYWRkaW5nOiA0OHB4OwogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y4ZjlmYSIsICIjMGEwYTBhIil9OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDMycHg7CiAgICB9CiAgICAKICAgIC5zZWN0aW9uIHsKICAgICAgbWF4LXdpZHRoOiA5MDBweDsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgfQogICAgCiAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICB9CiAgICAKICAgIC5zZWN0aW9uLWRlc2NyaXB0aW9uIHsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgIH0KICA8L3N0eWxlPgogIDxkaXYgY2xhc3M9ImRlbW9XcmFwcGVyIj4KICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5UeXBlU2NyaXB0IENvZGUgRXhhbXBsZTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5BIGNvbXByZWhlbnNpdmUgVHlwZVNjcmlwdCBjb2RlIGV4YW1wbGUgd2l0aCB2YXJpb3VzIHN5bnRheCBoaWdobGlnaHRpbmcuPC9kaXY+CiAgICAgIDxkZWVzLWRhdGF2aWV3LWNvZGVib3ggcHJvZ2xhbmc9InR5cGVzY3JpcHQiPgppbnRlcmZhY2UgVXNlciB7CiAgaWQ6IG51bWJlcjsKICBuYW1lOiBzdHJpbmc7CiAgZW1haWw6IHN0cmluZzsKICBpc0FjdGl2ZTogYm9vbGVhbjsKfQoKY2xhc3MgVXNlclNlcnZpY2UgewogIHByaXZhdGUgdXNlcnM6IFVzZXJbXSA9IFtdOwogIAogIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBpVXJsOiBzdHJpbmcpIHsKICAgIGNvbnNvbGUubG9nKCdVc2VyU2VydmljZSBpbml0aWFsaXplZCcpOwogIH0KICAKICBhc3luYyBnZXRVc2VycygpOiBQcm9taXNlPFVzZXJbXT4gewogICAgdHJ5IHsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0aGlzLmFwaVVybCk7CiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICAgIHJldHVybiBkYXRhLnVzZXJzOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZldGNoIHVzZXJzOicsIGVycm9yKTsKICAgICAgcmV0dXJuIFtdOwogICAgfQogIH0KICAKICBhZGRVc2VyKHVzZXI6IFVzZXIpOiB2b2lkIHsKICAgIHRoaXMudXNlcnMucHVzaCh1c2VyKTsKICB9Cn0KCi8vIFVzYWdlIGV4YW1wbGUKY29uc3Qgc2VydmljZSA9IG5ldyBVc2VyU2VydmljZSgnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vdXNlcnMnKTsKY29uc3QgdXNlcnMgPSBhd2FpdCBzZXJ2aWNlLmdldFVzZXJzKCk7CmNvbnNvbGUubG9nKCdGb3VuZCB1c2VyczonLCB1c2Vycy5sZW5ndGgpOwogICAgICA8L2RlZXMtZGF0YXZpZXctY29kZWJveD4KICAgIDwvZGl2PgogICAgCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+SmF2YVNjcmlwdCBFeGFtcGxlPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPk1vZGVybiBKYXZhU2NyaXB0IHdpdGggRVM2KyBmZWF0dXJlcy48L2Rpdj4KICAgICAgPGRlZXMtZGF0YXZpZXctY29kZWJveCBwcm9nbGFuZz0iamF2YXNjcmlwdCI+Ci8vIEFycmF5IG1hbmlwdWxhdGlvbiBleGFtcGxlcwpjb25zdCBudW1iZXJzID0gWzEsIDIsIDMsIDQsIDVdOwpjb25zdCBkb3VibGVkID0gbnVtYmVycy5tYXAobiA9PiBuICogMik7CmNvbnN0IGZpbHRlcmVkID0gbnVtYmVycy5maWx0ZXIobiA9PiBuID4gMyk7CgovLyBPYmplY3QgZGVzdHJ1Y3R1cmluZwpjb25zdCB1c2VyID0geyBuYW1lOiAnSm9obicsIGFnZTogMzAsIGNpdHk6ICdOZXcgWW9yaycgfTsKY29uc3QgeyBuYW1lLCBhZ2UgfSA9IHVzZXI7CgovLyBQcm9taXNlIGhhbmRsaW5nCmNvbnN0IGZldGNoRGF0YSA9IGFzeW5jICh1cmwpID0+IHsKICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7CiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTsKfTsKCi8vIE1vZGVybiBzeW50YXgKY29uc3QgZ3JlZXQgPSAobmFtZSA9ICdXb3JsZCcpID0+IFxgSGVsbG8sIFwke25hbWV9IVxgOwpjb25zb2xlLmxvZyhncmVldCgnU2hhZENOJykpOwogICAgICA8L2RlZXMtZGF0YXZpZXctY29kZWJveD4KICAgIDwvZGl2PgogICAgCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+UHl0aG9uIEV4YW1wbGU8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+UHl0aG9uIGNvZGUgd2l0aCBjbGFzc2VzIGFuZCB0eXBlIGhpbnRzLjwvZGl2PgogICAgICA8ZGVlcy1kYXRhdmlldy1jb2RlYm94IHByb2dsYW5nPSJweXRob24iPgpmcm9tIHR5cGluZyBpbXBvcnQgTGlzdCwgT3B0aW9uYWwKaW1wb3J0IGFzeW5jaW8KCmNsYXNzIERhdGFQcm9jZXNzb3I6CiAgICAiIiJBIHNpbXBsZSBkYXRhIHByb2Nlc3NvciBjbGFzcyIiIgogICAgCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZTogc3RyKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5kYXRhOiBMaXN0W2RpY3RdID0gW10KICAgIAogICAgYXN5bmMgZGVmIHByb2Nlc3NfZGF0YShzZWxmLCBpdGVtczogTGlzdFtkaWN0XSkgLT4gTGlzdFtkaWN0XToKICAgICAgICAiIiJQcm9jZXNzIGRhdGEgaXRlbXMgYXN5bmNocm9ub3VzbHkiIiIKICAgICAgICByZXN1bHRzID0gW10KICAgICAgICBmb3IgaXRlbSBpbiBpdGVtczoKICAgICAgICAgICAgIyBTaW11bGF0ZSBhc3luYyBwcm9jZXNzaW5nCiAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMC4xKQogICAgICAgICAgICByZXN1bHRzLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAnaWQnOiBpdGVtLmdldCgnaWQnKSwKICAgICAgICAgICAgICAgICdwcm9jZXNzZWQnOiBUcnVlLAogICAgICAgICAgICAgICAgJ3Byb2Nlc3Nvcic6IHNlbGYubmFtZQogICAgICAgICAgICB9KQogICAgICAgIHJldHVybiByZXN1bHRzCiAgICAKICAgIGRlZiBnZXRfc3VtbWFyeShzZWxmKSAtPiBkaWN0OgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICdwcm9jZXNzb3InOiBzZWxmLm5hbWUsCiAgICAgICAgICAgICdpdGVtc19wcm9jZXNzZWQnOiBsZW4oc2VsZi5kYXRhKQogICAgICAgIH0KCiMgVXNhZ2UKcHJvY2Vzc29yID0gRGF0YVByb2Nlc3NvcigiTWFpbiIpCmRhdGEgPSBhd2FpdCBwcm9jZXNzb3IucHJvY2Vzc19kYXRhKFt7J2lkJzogMX0sIHsnaWQnOiAyfV0pCiAgICAgIDwvZGVlcy1kYXRhdmlldy1jb2RlYm94PgogICAgPC9kaXY+CiAgICAKICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5DU1MgRXhhbXBsZTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5Nb2Rlcm4gQ1NTIHdpdGggY3VzdG9tIHByb3BlcnRpZXMgYW5kIGFuaW1hdGlvbnMuIE5vdGUgdGhlIHNob3J0ZXIgbGFuZ3VhZ2UgbGFiZWwuPC9kaXY+CiAgICAgIDxkZWVzLWRhdGF2aWV3LWNvZGVib3ggcHJvZ2xhbmc9ImNzcyI+Ci8qIE1vZGVybiBDU1Mgd2l0aCBjdXN0b20gcHJvcGVydGllcyAqLwo6cm9vdCB7CiAgLS1wcmltYXJ5LWNvbG9yOiAjM2I4MmY2OwogIC0tc2Vjb25kYXJ5LWNvbG9yOiAjMTBiOTgxOwogIC0tYmFja2dyb3VuZDogI2ZmZmZmZjsKICAtLXRleHQtY29sb3I6ICMwOTA5MGI7CiAgLS1ib3JkZXItcmFkaXVzOiA2cHg7Cn0KCi5jYXJkIHsKICBiYWNrZ3JvdW5kOiB2YXIoLS1iYWNrZ3JvdW5kKTsKICBib3JkZXI6IDFweCBzb2xpZCAjZTVlN2ViOwogIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlci1yYWRpdXMpOwogIHBhZGRpbmc6IDI0cHg7CiAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xKTsKICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwp9CgouY2FyZDpob3ZlciB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpOwogIGJveC1zaGFkb3c6IDAgNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMSk7Cn0KCkBrZXlmcmFtZXMgZmFkZUluIHsKICBmcm9tIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwcHgpOyB9CiAgdG8geyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH0KfQogICAgICA8L2RlZXMtZGF0YXZpZXctY29kZWJveD4KICAgIDwvZGl2PgogICAgCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+SlNPTiBFeGFtcGxlPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPkpTT04gY29uZmlndXJhdGlvbiB3aXRoIHByb3BlciBmb3JtYXR0aW5nLjwvZGl2PgogICAgICA8ZGVlcy1kYXRhdmlldy1jb2RlYm94IHByb2dsYW5nPSJqc29uIj4KewogICJuYW1lIjogIkBkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZyIsCiAgInZlcnNpb24iOiAiMS4xMC43IiwKICAiZGVzY3JpcHRpb24iOiAiQSBjb21wcmVoZW5zaXZlIGNhdGFsb2cgb2Ygd2ViIGNvbXBvbmVudHMiLAogICJtYWluIjogImRpc3RfdHNfd2ViL2luZGV4LmpzIiwKICAidHlwZSI6ICJtb2R1bGUiLAogICJzY3JpcHRzIjogewogICAgImJ1aWxkIjogInRzYnVpbGQgdHNmb2xkZXJzIC0tYWxsb3dpbXBsaWNpdGFueSAmJiB0c2J1bmRsZSBlbGVtZW50IC0tcHJvZHVjdGlvbiIsCiAgICAid2F0Y2giOiAidHN3YXRjaCBlbGVtZW50IiwKICAgICJ0ZXN0IjogInRzdGVzdCB0ZXN0LyAtLXdlYiAtLXZlcmJvc2UiCiAgfSwKICAiZGVwZW5kZW5jaWVzIjogewogICAgIkBkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudCI6ICJeMi4wLjQ1IiwKICAgICJoaWdobGlnaHQuanMiOiAiXjExLjkuMCIKICB9Cn0KICAgICAgPC9kZWVzLWRhdGF2aWV3LWNvZGVib3g+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1kYXRhdmlldy9kZWVzLWRhdGF2aWV3LWNvZGVib3gvZGVlcy1kYXRhdmlldy1jb2RlYm94LmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfZGlzdF90czExKCk7CmluaXRfZGlzdF90czI1KCk7CmluaXRfc2VydmljZXMoKTsKdmFyIF9fZXNEZWNvcmF0ZTQ4ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM0OSA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0RhdGF2aWV3Q29kZWJveCA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtZGF0YXZpZXctY29kZWJveCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3Byb2dMYW5nX2RlY29yYXRvcnM7CiAgbGV0IF9wcm9nTGFuZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Byb2dMYW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb2RlVG9EaXNwbGF5X2RlY29yYXRvcnM7CiAgbGV0IF9jb2RlVG9EaXNwbGF5X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29kZVRvRGlzcGxheV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzRGF0YXZpZXdDb2RlYm94MiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3Byb2dMYW5nX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9jb2RlVG9EaXNwbGF5X2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICByZWZsZWN0OiB0cnVlCiAgICAgIH0pXTsKICAgICAgX19lc0RlY29yYXRlNDgodGhpcywgbnVsbCwgX3Byb2dMYW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInByb2dMYW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJwcm9nTGFuZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5wcm9nTGFuZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucHJvZ0xhbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcHJvZ0xhbmdfaW5pdGlhbGl6ZXJzLCBfcHJvZ0xhbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0OCh0aGlzLCBudWxsLCBfY29kZVRvRGlzcGxheV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb2RlVG9EaXNwbGF5Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb2RlVG9EaXNwbGF5IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNvZGVUb0Rpc3BsYXksIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvZGVUb0Rpc3BsYXkgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29kZVRvRGlzcGxheV9pbml0aWFsaXplcnMsIF9jb2RlVG9EaXNwbGF5X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDgobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzRGF0YXZpZXdDb2RlYm94MiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMzQ7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiRGF0YSBWaWV3IiwgIldvcmtzcGFjZSJdOwogICAgI3Byb2dMYW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczQ5KHRoaXMsIF9wcm9nTGFuZ19pbml0aWFsaXplcnMsICJ0eXBlc2NyaXB0Iik7CiAgICBnZXQgcHJvZ0xhbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwcm9nTGFuZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHByb2dMYW5nKHZhbHVlMikgewogICAgICB0aGlzLiNwcm9nTGFuZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NvZGVUb0Rpc3BsYXlfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ5KHRoaXMsIF9wcm9nTGFuZ19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDkodGhpcywgX2NvZGVUb0Rpc3BsYXlfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGNvZGVUb0Rpc3BsYXkoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb2RlVG9EaXNwbGF5X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29kZVRvRGlzcGxheSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29kZVRvRGlzcGxheV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICB9CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgJHtkb210b29sc19lbGVtZW50YmFzaWNfZXhwb3J0cy5zdHlsZXN9CiAgICAgIDxzdHlsZT4KICAgICAgICA6aG9zdCB7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgICBmb250LWZhbWlseTogJHtjc3NHZWlzdEZvbnRGYW1pbHl9OwogICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICB9CiAgICAgICAgLm1haW5ib3ggewogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xKSwgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4wNik7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMDkwOTBiIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICB9CgogICAgICAgIC5hcHBiYXIgewogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiNhMWExYWEiKX07CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y5ZmFmYiIsICIjMTgxODFiIil9OwogICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgICAgbGluZS1oZWlnaHQ6IDMycHg7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB9CgogICAgICAgIC5hcHBiYXIgLmZpbGVOYW1lIHsKICAgICAgICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0OwogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgZmxleDogMTsKICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICB9CgogICAgICAgIC5ib3R0b21CYXIgewogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiNhMWExYWEiKX07CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y5ZmFmYiIsICIjMTgxODFiIil9OwogICAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgICAgICBoZWlnaHQ6IDI4cHg7CiAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICBsaW5lLWhlaWdodDogMjhweDsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgfQoKICAgICAgICAuc3BhY2VzTGFiZWwgewogICAgICAgICAgcGFkZGluZzogMCAxNnB4OwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgfQoKICAgICAgICAubGFuZ3VhZ2VMYWJlbCB7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICAgIGxpbmUtaGVpZ2h0OiAyOHB4OwogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoNTksIDEzMCwgMjQ2LCAwLjEpIiwgInJnYmEoNTksIDEzMCwgMjQ2LCAwLjEpIil9OwogICAgICAgICAgcGFkZGluZzogMHB4IDE2cHg7CiAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgfQoKICAgICAgICAuaGxqcy1rZXl3b3JkIHsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2RjMjYyNiIsICIjZjg3MTcxIil9OwogICAgICAgIH0KCiAgICAgICAgLmNvZGVncmlkIHsKICAgICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDUwcHggYXV0bzsKICAgICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgICAgZmxleDogMTsKICAgICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgfQoKICAgICAgICAubGluZU51bWJlcnMgewogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM1MjUyNWIiKX07CiAgICAgICAgICBwYWRkaW5nOiAyNHB4IDE2cHggMHB4IDBweDsKICAgICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgICB9CgogICAgICAgIC5saW5lQ291bnRlcjpsYXN0LWNoaWxkIHsKICAgICAgICAgIG9wYWNpdHk6IDUwJTsKICAgICAgICB9CgogICAgICAgIHByZSB7CiAgICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICAgICAgbWFyZ2luOiAwcHg7CiAgICAgICAgICBwYWRkaW5nOiAyNHB4IDI0cHg7CiAgICAgICAgfQoKICAgICAgICBjb2RlIHsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgICBwYWRkaW5nOiAwcHg7CiAgICAgICAgICBtYXJnaW46IDBweDsKICAgICAgICB9CgogICAgICAgIGNvZGUsCiAgICAgICAgY29kZSAqLAogICAgICAgIC5saW5lTnVtYmVycyB7CiAgICAgICAgICBsaW5lLWhlaWdodDogMS40ZW07CiAgICAgICAgICBmb250LXdlaWdodDogMjAwOwogICAgICAgICAgZm9udC1mYW1pbHk6ICR7Y3NzTW9ub0ZvbnRGYW1pbHl9OwogICAgICAgIH0KCiAgICAgICAgLmhsanMtc3RyaW5nIHsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA1OTY2OSIsICIjMTBiOTgxIil9OwogICAgICAgIH0KCiAgICAgICAgLmhsanMtYnVpbHRfaW4gewogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOGI1Y2Y2IiwgIiNhNzhiZmEiKX07CiAgICAgICAgfQoKICAgICAgICAuaGxqcy1mdW5jdGlvbiB7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzYwYTVmYSIpfTsKICAgICAgICB9CgogICAgICAgIC5obGpzLXBhcmFtcyB7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwODkxYjIiLCAiIzA2YjZkNCIpfTsKICAgICAgICB9CgogICAgICAgIC5obGpzLWNvbW1lbnQgewogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM3MTcxN2EiKX07CiAgICAgICAgfQoKICAgICAgICAuaGxqcy1udW1iZXIgewogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZWE1ODBjIiwgIiNmYjkyM2MiKX07CiAgICAgICAgfQoKICAgICAgICAuaGxqcy1saXRlcmFsIHsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2RjMjYyNiIsICIjZjg3MTcxIil9OwogICAgICAgIH0KCiAgICAgICAgLmhsanMtYXR0ciB7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM4YjVjZjYiLCAiI2E3OGJmYSIpfTsKICAgICAgICB9CgogICAgICAgIC5obGpzLXZhcmlhYmxlIHsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICAgIH0KICAgICAgPC9zdHlsZT4KICAgICAgPGRpdgogICAgICAgIGNsYXNzPSJtYWluYm94IgogICAgICAgIEBjb250ZXh0bWVudT0iJHsoZXZlbnRBcmcpID0+IHsKICAgICAgICBEZWVzQ29udGV4dG1lbnUub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZXZlbnRBcmcsIFsKICAgICAgICAgIHsKICAgICAgICAgICAgbmFtZTogIkFib3V0IiwKICAgICAgICAgICAgaWNvbk5hbWU6ICJjaXJjbGVJbmZvIiwKICAgICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICBdKTsKICAgICAgfX0iCiAgICAgID4KICAgICAgICA8ZGl2IGNsYXNzPSJhcHBiYXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZmlsZU5hbWUiPmluZGV4LnRzPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY29kZWdyaWQiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZU51bWJlcnMiPgogICAgICAgICAgICAkeygoKSA9PiB7CiAgICAgICAgbGV0IGxpbmVDb3VudGVyID0gMDsKICAgICAgICByZXR1cm4gdGhpcy5jb2RlVG9EaXNwbGF5LnNwbGl0KCJcbiIpLm1hcCgobGluZUFyZykgPT4gewogICAgICAgICAgbGluZUNvdW50ZXIrKzsKICAgICAgICAgIHJldHVybiBiMmA8ZGl2IGNsYXNzPSJsaW5lQ291bnRlciI+JHtsaW5lQ291bnRlcn08L2Rpdj5gOwogICAgICAgIH0pOwogICAgICB9KSgpfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cHJlPjxjb2RlPjwvY29kZT48L3ByZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJib3R0b21CYXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3BhY2VzTGFiZWwiPlNwYWNlczogMjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGFuZ3VhZ2VMYWJlbCI+JHt0aGlzLnByb2dMYW5nfTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBjb2RlVG9EaXNwbGF5U3RvcmUgPSAoX19ydW5Jbml0aWFsaXplcnM0OSh0aGlzLCBfY29kZVRvRGlzcGxheV9leHRyYUluaXRpYWxpemVycyksICIiKTsKICAgIGhpZ2hsaWdodEpzID0gbnVsbDsKICAgIGFzeW5jIHVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLnVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgY29uc29sZS5sb2coImhpZ2hsaWdodGluZyBub3ciKTsKICAgICAgY29uc29sZS5sb2codGhpcy5jaGlsZE5vZGVzKTsKICAgICAgY29uc3Qgc2xvdHRlZENvZGVOb2RlcyA9IFtdOwogICAgICB0aGlzLmNoaWxkTm9kZXMuZm9yRWFjaCgoY2hpbGROb2RlKSA9PiB7CiAgICAgICAgaWYgKGNoaWxkTm9kZS5ub2RlTmFtZSA9PT0gIiN0ZXh0IikgewogICAgICAgICAgc2xvdHRlZENvZGVOb2Rlcy5wdXNoKGNoaWxkTm9kZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgaWYgKHRoaXMuY29kZVRvRGlzcGxheSAmJiB0aGlzLmNvZGVUb0Rpc3BsYXkgIT09IHRoaXMuY29kZVRvRGlzcGxheVN0b3JlKSB7CiAgICAgICAgdGhpcy5jb2RlVG9EaXNwbGF5U3RvcmUgPSBzbWFydHN0cmluZ19pbmRlbnRfZXhwb3J0cy5ub3JtYWxpemUodGhpcy5jb2RlVG9EaXNwbGF5KS50cmltU3RhcnQoKTsKICAgICAgfQogICAgICBpZiAoc2xvdHRlZENvZGVOb2Rlc1swXSAmJiBzbG90dGVkQ29kZU5vZGVzWzBdLndob2xlVGV4dCAmJiAhdGhpcy5jb2RlVG9EaXNwbGF5KSB7CiAgICAgICAgdGhpcy5jb2RlVG9EaXNwbGF5U3RvcmUgPSBzbWFydHN0cmluZ19pbmRlbnRfZXhwb3J0cy5ub3JtYWxpemUoc2xvdHRlZENvZGVOb2Rlc1swXS53aG9sZVRleHQpLnRyaW1TdGFydCgpOwogICAgICAgIHRoaXMuY29kZVRvRGlzcGxheSA9IHRoaXMuY29kZVRvRGlzcGxheVN0b3JlOwogICAgICB9CiAgICAgIGF3YWl0IGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cy5zbWFydGRlbGF5LmRlbGF5Rm9yKDApOwogICAgICBpZiAoIXRoaXMuaGlnaGxpZ2h0SnMpIHsKICAgICAgICB0aGlzLmhpZ2hsaWdodEpzID0gYXdhaXQgRGVlc1NlcnZpY2VMaWJMb2FkZXIuZ2V0SW5zdGFuY2UoKS5sb2FkSGlnaGxpZ2h0SnMoKTsKICAgICAgfQogICAgICBjb25zdCBsb2NhbENvZGVOb2RlID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoImNvZGUiKTsKICAgICAgY29uc3QgaGlnaGxpZ2h0ZWRIdG1sID0gdGhpcy5oaWdobGlnaHRKcy5oaWdobGlnaHQodGhpcy5jb2RlVG9EaXNwbGF5U3RvcmUsIHsKICAgICAgICBsYW5ndWFnZTogdGhpcy5wcm9nTGFuZywKICAgICAgICBpZ25vcmVJbGxlZ2FsczogdHJ1ZQogICAgICB9KTsKICAgICAgbG9jYWxDb2RlTm9kZS5pbm5lckhUTUwgPSBoaWdobGlnaHRlZEh0bWwudmFsdWU7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczQ5KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzRGF0YXZpZXdDb2RlYm94MiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZGF0YXZpZXcvZGVlcy1kYXRhdmlldy1zdGF0dXNvYmplY3QvZGVlcy1kYXRhdmlldy1zdGF0dXNvYmplY3QuZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgZGVtb0Z1bmMzNSA9ICgpID0+IGIyYCA8c3R5bGU+CiAgICAuZGVtbyB7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjVmNWY1IiwgIiMwYTBhMGEiKX07CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICBjb250ZW50OiAnJzsKICAgICAgcGFkZGluZzogNDBweDsKICAgIH0KICAgIAogICAgLmRlbW8tZ3JpZCB7CiAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgIGdhcDogMjRweDsKICAgICAgbWF4LXdpZHRoOiA4MDBweDsKICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICB9CiAgICAKICAgIC5kZW1vLXNlY3Rpb24gewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDE2cHg7CiAgICB9CiAgICAKICAgIC5kZW1vLXRpdGxlIHsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICBmb250LXdlaWdodDogNjAwOwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQ1LjElKSIsICJoc2woMCAwJSA2My45JSkiKX07CiAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc2Fucy1zZXJpZjsKICAgIH0KICAgIAogICAgLmRlbW8tbm90ZSB7CiAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NS4xJSkiLCAiaHNsKDAgMCUgNjMuOSUpIil9OwogICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc2Fucy1zZXJpZjsKICAgIH0KICA8L3N0eWxlPgogIDxkaXYgY2xhc3M9ImRlbW8iPgogICAgPGRpdiBjbGFzcz0iZGVtby1ub3RlIj4KICAgICAgUmlnaHQtY2xpY2sgb24gYW55IGRldGFpbCByb3cgdG8gY29weSB0aGUgdmFsdWUsIGtleSwgb3Iga2V5OnZhbHVlIGNvbWJpbmF0aW9uCiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImRlbW8tZ3JpZCI+CiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iZGVtby10aXRsZSI+U2VydmljZSBIZWFsdGggU3RhdHVzPC9kaXY+CiAgICAgICAgPGRlZXMtZGF0YXZpZXctc3RhdHVzb2JqZWN0CiAgICAgICAgICAuc3RhdHVzT2JqZWN0PSR7ewogIGlkOiAiMSIsCiAgbmFtZTogIkFQSSBHYXRld2F5IFNlcnZpY2UiLAogIGNvbWJpbmVkU3RhdHVzOiAib2siLAogIGNvbWJpbmVkU3RhdHVzVGV4dDogIkFsbCBzeXN0ZW1zIG9wZXJhdGlvbmFsIiwKICBkZXRhaWxzOiBbCiAgICB7CiAgICAgIG5hbWU6ICJSZXNwb25zZSBUaW1lIiwKICAgICAgdmFsdWU6ICI0NW1zIChhdmcpIiwKICAgICAgc3RhdHVzOiAib2siLAogICAgICBzdGF0dXNUZXh0OiAiV2l0aGluIG5vcm1hbCByYW5nZSIKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJVcHRpbWUiLAogICAgICB2YWx1ZTogIjk5Ljk5JSAoMzAgZGF5cykiLAogICAgICBzdGF0dXM6ICJvayIsCiAgICAgIHN0YXR1c1RleHQ6ICJFeGNlbGxlbnQgdXB0aW1lIgogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkFjdGl2ZSBDb25uZWN0aW9ucyIsCiAgICAgIHZhbHVlOiAiMSwyMzQgLyAxMCwwMDAiLAogICAgICBzdGF0dXM6ICJvayIsCiAgICAgIHN0YXR1c1RleHQ6ICJOb3JtYWwgbG9hZCIKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJTU0wgQ2VydGlmaWNhdGUiLAogICAgICB2YWx1ZTogIlZhbGlkIHVudGlsIDIwMjQtMTItMzEiLAogICAgICBzdGF0dXM6ICJvayIsCiAgICAgIHN0YXR1c1RleHQ6ICJDZXJ0aWZpY2F0ZSB2YWxpZCIKICAgIH0KICBdCn19CiAgICAgICAgPgogICAgICAgIDwvZGVlcy1kYXRhdmlldy1zdGF0dXNvYmplY3Q+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkZW1vLXRpdGxlIj5EYXRhYmFzZSBDbHVzdGVyIFN0YXR1czwvZGl2PgogICAgICAgIDxkZWVzLWRhdGF2aWV3LXN0YXR1c29iamVjdAogICAgICAgICAgLnN0YXR1c09iamVjdD0ke3sKICBpZDogIjIiLAogIG5hbWU6ICJQb3N0Z3JlU1FMIENsdXN0ZXIiLAogIGNvbWJpbmVkU3RhdHVzOiAicGFydGx5X29rIiwKICBjb21iaW5lZFN0YXR1c1RleHQ6ICJNaW5vciBpc3N1ZXMgZGV0ZWN0ZWQiLAogIGRldGFpbHM6IFsKICAgIHsKICAgICAgbmFtZTogIlByaW1hcnkgTm9kZSIsCiAgICAgIHZhbHVlOiAiZGItcHJpbWFyeS0wMSAoaGVhbHRoeSkiLAogICAgICBzdGF0dXM6ICJvayIsCiAgICAgIHN0YXR1c1RleHQ6ICJPcGVyYXRpbmcgbm9ybWFsbHkiCiAgICB9LAogICAgewogICAgICBuYW1lOiAiUmVwbGljYSBMYWciLAogICAgICB2YWx1ZTogIjIuNSBzZWNvbmRzIiwKICAgICAgc3RhdHVzOiAicGFydGx5X29rIiwKICAgICAgc3RhdHVzVGV4dDogIlNsaWdodGx5IGVsZXZhdGVkIgogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkRpc2sgVXNhZ2UiLAogICAgICB2YWx1ZTogIjc4JSAoMzEyR0IgLyA0MDBHQikiLAogICAgICBzdGF0dXM6ICJwYXJ0bHlfb2siLAogICAgICBzdGF0dXNUZXh0OiAiQXBwcm9hY2hpbmcgdGhyZXNob2xkIgogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkNvbm5lY3Rpb24gUG9vbCIsCiAgICAgIHZhbHVlOiAiODkgLyAxMDAgY29ubmVjdGlvbnMiLAogICAgICBzdGF0dXM6ICJvayIsCiAgICAgIHN0YXR1c1RleHQ6ICJXaXRoaW4gbGltaXRzIgogICAgfQogIF0KfX0KICAgICAgICA+CiAgICAgICAgPC9kZWVzLWRhdGF2aWV3LXN0YXR1c29iamVjdD4KICAgICAgPC9kaXY+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxkaXYgY2xhc3M9ImRlbW8tdGl0bGUiPkJ1aWxkIFBpcGVsaW5lIFN0YXR1czwvZGl2PgogICAgICAgIDxkZWVzLWRhdGF2aWV3LXN0YXR1c29iamVjdAogICAgICAgICAgLnN0YXR1c09iamVjdD0ke3sKICBpZDogIjMiLAogIG5hbWU6ICJDSS9DRCBQaXBlbGluZSIsCiAgY29tYmluZWRTdGF0dXM6ICJub3Rfb2siLAogIGNvbWJpbmVkU3RhdHVzVGV4dDogIkJ1aWxkIGZhaWx1cmUiLAogIGRldGFpbHM6IFsKICAgIHsKICAgICAgbmFtZTogIkxhc3QgQnVpbGQiLAogICAgICB2YWx1ZTogIkJ1aWxkICMxMjM0IC0gRmFpbGVkIiwKICAgICAgc3RhdHVzOiAibm90X29rIiwKICAgICAgc3RhdHVzVGV4dDogIlRlc3QgZmFpbHVyZXMiCiAgICB9LAogICAgewogICAgICBuYW1lOiAiRmFpbGVkIFRlc3RzIiwKICAgICAgdmFsdWU6ICIzIHRlc3RzIGZhaWxlZDogYXV0aC5zcGVjLnRzLCB1c2VyLnNwZWMudHMsIGFwaS5zcGVjLnRzIiwKICAgICAgc3RhdHVzOiAibm90X29rIiwKICAgICAgc3RhdHVzVGV4dDogIlVuaXQgdGVzdCBmYWlsdXJlcyIKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJDb2RlIENvdmVyYWdlIiwKICAgICAgdmFsdWU6ICI4Mi41JSAodGFyZ2V0OiA4NSUpIiwKICAgICAgc3RhdHVzOiAicGFydGx5X29rIiwKICAgICAgc3RhdHVzVGV4dDogIkJlbG93IHRhcmdldCIKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJCdWlsZCBEdXJhdGlvbiIsCiAgICAgIHZhbHVlOiAiMTJtIDM0cyIsCiAgICAgIHN0YXR1czogIm9rIiwKICAgICAgc3RhdHVzVGV4dDogIk5vcm1hbCBkdXJhdGlvbiIKICAgIH0KICBdCn19CiAgICAgICAgPgogICAgICAgIDwvZGVlcy1kYXRhdmlldy1zdGF0dXNvYmplY3Q+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC9kaXY+YDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1kYXRhdmlldy9kZWVzLWRhdGF2aWV3LXN0YXR1c29iamVjdC9kZWVzLWRhdGF2aWV3LXN0YXR1c29iamVjdC5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU0OSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNTAgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNEYXRhdmlld1N0YXR1c29iamVjdCA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtZGF0YXZpZXctc3RhdHVzb2JqZWN0IildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfc3RhdHVzT2JqZWN0X2RlY29yYXRvcnM7CiAgbGV0IF9zdGF0dXNPYmplY3RfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zdGF0dXNPYmplY3RfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0RhdGF2aWV3U3RhdHVzb2JqZWN0MiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3N0YXR1c09iamVjdF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogT2JqZWN0IH0pXTsKICAgICAgX19lc0RlY29yYXRlNDkodGhpcywgbnVsbCwgX3N0YXR1c09iamVjdF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzdGF0dXNPYmplY3QiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInN0YXR1c09iamVjdCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zdGF0dXNPYmplY3QsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnN0YXR1c09iamVjdCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zdGF0dXNPYmplY3RfaW5pdGlhbGl6ZXJzLCBfc3RhdHVzT2JqZWN0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDkobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzRGF0YXZpZXdTdGF0dXNvYmplY3QyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMzNTsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJEYXRhIFZpZXciXTsKICAgICNzdGF0dXNPYmplY3RfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX3N0YXR1c09iamVjdF9pbml0aWFsaXplcnMsIHZvaWQgMCk7CiAgICBnZXQgc3RhdHVzT2JqZWN0KCkgewogICAgICByZXR1cm4gdGhpcy4jc3RhdHVzT2JqZWN0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc3RhdHVzT2JqZWN0KHZhbHVlMikgewogICAgICB0aGlzLiNzdGF0dXNPYmplY3RfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgJ1JvYm90bycsIHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC5tYWluYm94IHsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDMuOSUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCAwIGhzbCgwIDAlIDAlIC8gMC4xKSwgMCAxcHggMnB4IC0xcHggaHNsKDAgMCUgMCUgLyAwLjEpOwogICAgICAgIG1pbi1oZWlnaHQ6IDQ4cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTglKSIpfTsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmhlYWRpbmcgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDQ4cHggYXV0byAxMDBweDsKICAgICAgICBoZWlnaHQ6IDU2cHg7CiAgICAgICAgcGFkZGluZzogMCAxNnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NyUpIiwgImhzbCgwIDAlIDclKSIpfTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgIH0KCiAgICAgIGgxIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDBweDsKICAgICAgICBwYWRkaW5nOiAwcHggMTJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDE1JSkiLCAiaHNsKDAgMCUgOTMuOSUpIil9OwogICAgICB9CgogICAgICAuc3RhdHVzZG90IHsKICAgICAgICBoZWlnaHQ6IDEwcHg7CiAgICAgICAgd2lkdGg6IDEwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA2My45JSkiLCAiaHNsKDAgMCUgNDUuMSUpIil9OwogICAgICAgIG1hcmdpbjogYXV0bzsKICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDYzLjklIC8gMC4yKSIsICJoc2woMCAwJSA0NS4xJSAvIDAuMikiKX07CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKICAgICAgfQoKICAgICAgLmNvcHlNYWluIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NS4xJSkiLCAiaHNsKDAgMCUgNjMuOSUpIil9OwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLmNvcHlNYWluOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUuMSUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA3OS44JSkiLCAiaHNsKDAgMCUgMjAuOSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTUlKSIsICJoc2woMCAwJSA5My45JSkiKX07CiAgICAgIH0KCiAgICAgIC5jb3B5TWFpbjphY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5MSUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTgpOwogICAgICB9CgogICAgICAuc3RhdHVzZG90Lm9rIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlKSIsICJoc2woMTQyLjEgNzAuNiUgNDUuMyUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlIC8gMC4yKSIsICJoc2woMTQyLjEgNzAuNiUgNDUuMyUgLyAwLjIpIil9OwogICAgICB9CgogICAgICAuc3RhdHVzZG90Lm5vdF9vayB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDg0LjIlIDYwLjIlKSIsICJoc2woMCA3Mi4yJSA1MC42JSkiKX07CiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgM3B4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA4NC4yJSA2MC4yJSAvIDAuMikiLCAiaHNsKDAgNzIuMiUgNTAuNiUgLyAwLjIpIil9OwogICAgICB9CgogICAgICAuc3RhdHVzZG90LnBhcnRseV9vayB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyNSA5NSUgNTMlKSIsICJoc2woMjUgOTUlIDYzJSkiKX07CiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgM3B4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjUgOTUlIDUzJSAvIDAuMikiLCAiaHNsKDI1IDk1JSA2MyUgLyAwLjIpIil9OwogICAgICB9CgogICAgICAuZGV0YWlsIHsKICAgICAgICBtaW4taGVpZ2h0OiA2MHB4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDQ4cHggYXV0bzsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk0JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxNnB4OwogICAgICAgIGN1cnNvcjogY29udGV4dC1tZW51OwogICAgICB9CgogICAgICAuZGV0YWlsOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTclKSIsICJoc2woMCAwJSA3JSkiKX07CiAgICAgIH0KCiAgICAgIC5kZXRhaWw6YWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUlKSIsICJoc2woMCAwJSA5JSkiKX07CiAgICAgIH0KCiAgICAgIC5kZXRhaWwgLmRldGFpbHNUZXh0IHsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsKICAgICAgfQoKICAgICAgLmRldGFpbCAuZGV0YWlsc1RleHQgLmxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQ1LjElKSIsICJoc2woMCAwJSA2My45JSkiKX0KICAgICAgICBtYXJnaW4tYm90dG9tOiAycHg7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CiAgICAgIH0KCiAgICAgIC5kZXRhaWwgLmRldGFpbHNUZXh0IC52YWx1ZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtZmFtaWx5OiAnSW50ZWwgT25lIE1vbm8nLCAnR2Vpc3QgTW9ubycsIG1vbm9zcGFjZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDE1JSkiLCAiaHNsKDAgMCUgOTAlKSIpfTsKICAgICAgICBsaW5lLWhlaWdodDogMS41OwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9Im1haW5ib3giPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmciPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdHVzZG90ICR7dGhpcy5zdGF0dXNPYmplY3Q/LmNvbWJpbmVkU3RhdHVzfSI+PC9kaXY+CiAgICAgICAgICA8aDE+JHt0aGlzLnN0YXR1c09iamVjdD8ubmFtZSB8fCAiTm8gc3RhdHVzIG9iamVjdCBhc3NpZ25lZCJ9PC9oMT4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvcHlNYWluIiBAY2xpY2s9JHt0aGlzLmhhbmRsZUNvcHlBc0pzb259PkNvcHkgSlNPTjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgICR7dGhpcy5zdGF0dXNPYmplY3Q/LmRldGFpbHM/Lm1hcCgoZGV0YWlsQXJnKSA9PiB7CiAgICAgICAgcmV0dXJuIGIyYAogICAgICAgICAgICA8ZGl2IAogICAgICAgICAgICAgIGNsYXNzPSJkZXRhaWwiCiAgICAgICAgICAgICAgQGNvbnRleHRtZW51PSR7KGV2ZW50KSA9PiB7CiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgRGVlc0NvbnRleHRtZW51Lm9wZW5Db250ZXh0TWVudVdpdGhPcHRpb25zKGV2ZW50LCBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBuYW1lOiAiQ29weSBWYWx1ZSIsCiAgICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6Y29weSIsCiAgICAgICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlUb0NsaXBib2FyZChkZXRhaWxBcmcudmFsdWUsICJWYWx1ZSIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgIG5hbWU6ICJDb3B5IEtleSIsCiAgICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6a2V5IiwKICAgICAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weVRvQ2xpcGJvYXJkKGRldGFpbEFyZy5uYW1lLCAiS2V5Iik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgbmFtZTogIkNvcHkgS2V5OlZhbHVlIiwKICAgICAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpjb3B5LXBsdXMiLAogICAgICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb3B5VG9DbGlwYm9hcmQoYCR7ZGV0YWlsQXJnLm5hbWV9OiAke2RldGFpbEFyZy52YWx1ZX1gLCAiS2V5OlZhbHVlIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICBdKTsKICAgICAgICB9fQogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdHVzZG90ICR7ZGV0YWlsQXJnLnN0YXR1c30iPjwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRldGFpbHNUZXh0Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj4ke2RldGFpbEFyZy5uYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idmFsdWUiPiR7ZGV0YWlsQXJnLnZhbHVlfTwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGA7CiAgICAgIH0pfQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoKSB7CiAgICB9CiAgICBhc3luYyBjb3B5VG9DbGlwYm9hcmQodGV4dDksIHR5cGU1ID0gIlRleHQiKSB7CiAgICAgIHRyeSB7CiAgICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dDkpOwogICAgICAgIGNvbnNvbGUubG9nKGAke3R5cGU1fSBjb3BpZWQgdG8gY2xpcGJvYXJkYCk7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjb3B5ICR7dHlwZTV9OmAsIGVycik7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGhhbmRsZUNvcHlBc0pzb24oKSB7CiAgICAgIGlmICghdGhpcy5zdGF0dXNPYmplY3QpCiAgICAgICAgcmV0dXJuOwogICAgICB0cnkgewogICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KEpTT04uc3RyaW5naWZ5KHRoaXMuc3RhdHVzT2JqZWN0LCBudWxsLCAyKSk7CiAgICAgICAgY29uc3QgYnV0dG9uID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5jb3B5TWFpbiIpOwogICAgICAgIGNvbnN0IG9yaWdpbmFsVGV4dCA9IGJ1dHRvbi50ZXh0Q29udGVudDsKICAgICAgICBidXR0b24udGV4dENvbnRlbnQgPSAiQ29waWVkISI7CiAgICAgICAgY29uc3QgaXNEYXJrID0gIXRoaXMuZ29CcmlnaHQ7CiAgICAgICAgYnV0dG9uLnN0eWxlLmJhY2tncm91bmQgPSBpc0RhcmsgPyAiaHNsKDE0Mi4xIDcwLjYlIDQ1LjMlIC8gMC4xKSIgOiAiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlIC8gMC4xKSI7CiAgICAgICAgYnV0dG9uLnN0eWxlLmJvcmRlckNvbG9yID0gaXNEYXJrID8gImhzbCgxNDIuMSA3MC42JSA0NS4zJSkiIDogImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSkiOwogICAgICAgIGJ1dHRvbi5zdHlsZS5jb2xvciA9IGlzRGFyayA/ICJoc2woMTQyLjEgNzAuNiUgNDUuMyUpIiA6ICJoc2woMTQyLjEgNzYuMiUgMzYuMyUpIjsKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDsKICAgICAgICAgIGJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kID0gIiI7CiAgICAgICAgICBidXR0b24uc3R5bGUuYm9yZGVyQ29sb3IgPSAiIjsKICAgICAgICAgIGJ1dHRvbi5zdHlsZS5jb2xvciA9ICIiOwogICAgICAgIH0sIDE1MDApOwogICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gY29weToiLCBlcnIpOwogICAgICB9CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfc3RhdHVzT2JqZWN0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNTAoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNEYXRhdmlld1N0YXR1c29iamVjdDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWZlZWRiYWNrL2RlZXMtYWN0aW9uYmFyL2luZGV4LmpzCmluaXRfZGVlc19hY3Rpb25iYXIoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1mZWVkYmFjay9kZWVzLWJhZGdlL2RlZXMtYmFkZ2UuZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgZGVtb0Z1bmMzNiA9ICgpID0+IGIyYAogIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBhbGlnbi1pdGVtczogY2VudGVyOyI+CiAgICA8ZGVlcy1iYWRnZSAudGV4dD0keyJEZWZhdWx0In0+PC9kZWVzLWJhZGdlPgogICAgPGRlZXMtYmFkZ2UgLnR5cGU9JHsicHJpbWFyeSJ9IC50ZXh0PSR7IlByaW1hcnkifT48L2RlZXMtYmFkZ2U+CiAgICA8ZGVlcy1iYWRnZSAudHlwZT0keyJzdWNjZXNzIn0gLnRleHQ9JHsiU3VjY2VzcyJ9PjwvZGVlcy1iYWRnZT4KICAgIDxkZWVzLWJhZGdlIC50eXBlPSR7Indhcm5pbmcifSAudGV4dD0keyJXYXJuaW5nIn0+PC9kZWVzLWJhZGdlPgogICAgPGRlZXMtYmFkZ2UgLnR5cGU9JHsiZXJyb3IifSAudGV4dD0keyJFcnJvciJ9PjwvZGVlcy1iYWRnZT4KICAgIDxkZWVzLWJhZGdlIC50eXBlPSR7InByaW1hcnkifSAucm91bmRlZD0ke3RydWV9IC50ZXh0PSR7IlJvdW5kZWQifT48L2RlZXMtYmFkZ2U+CiAgPC9kaXY+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZmVlZGJhY2svZGVlcy1iYWRnZS9kZWVzLWJhZGdlLmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfZGlzdF90czI1KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTUxID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM1MiA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0JhZGdlID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1iYWRnZSIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3R5cGVfZGVjb3JhdG9yczsKICBsZXQgX3R5cGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90eXBlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90ZXh0X2RlY29yYXRvcnM7CiAgbGV0IF90ZXh0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGV4dF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcm91bmRlZF9kZWNvcmF0b3JzOwogIGxldCBfcm91bmRlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JvdW5kZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0JhZGdlMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3R5cGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF90ZXh0X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfcm91bmRlZF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTUxKHRoaXMsIG51bGwsIF90eXBlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInR5cGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInR5cGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudHlwZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudHlwZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90eXBlX2luaXRpYWxpemVycywgX3R5cGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1MSh0aGlzLCBudWxsLCBfdGV4dF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0ZXh0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0ZXh0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRleHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnRleHQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGV4dF9pbml0aWFsaXplcnMsIF90ZXh0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTEodGhpcywgbnVsbCwgX3JvdW5kZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicm91bmRlZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicm91bmRlZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5yb3VuZGVkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yb3VuZGVkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3JvdW5kZWRfaW5pdGlhbGl6ZXJzLCBfcm91bmRlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTUxKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0JhZGdlMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMzY7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiRmVlZGJhY2siXTsKICAgICN0eXBlX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczUyKHRoaXMsIF90eXBlX2luaXRpYWxpemVycywgImRlZmF1bHQiKTsKICAgIGdldCB0eXBlKCkgewogICAgICByZXR1cm4gdGhpcy4jdHlwZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHR5cGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3R5cGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN0ZXh0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1Mih0aGlzLCBfdHlwZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTIodGhpcywgX3RleHRfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IHRleHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0ZXh0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdGV4dCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdGV4dF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3JvdW5kZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczUyKHRoaXMsIF90ZXh0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1Mih0aGlzLCBfcm91bmRlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgcm91bmRlZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3JvdW5kZWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCByb3VuZGVkKHZhbHVlMikgewogICAgICB0aGlzLiNyb3VuZGVkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnM1Mih0aGlzLCBfcm91bmRlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIGRvbXRvb2xzX2VsZW1lbnRiYXNpY19leHBvcnRzLnNldHVwKCk7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmJhZGdlIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLmJhZGdlLnJvdW5kZWQgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICAgIH0KCiAgICAgIC5iYWRnZS5kZWZhdWx0IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y1ZjVmNSIsICIjMzMzIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzY2NiIsICIjY2NjIil9OwogICAgICB9CgogICAgICAuYmFkZ2UucHJpbWFyeSB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwNTBiOTsKICAgICAgICBjb2xvcjogI2ZmZmZmZjsKICAgICAgfQoKICAgICAgLmJhZGdlLnN1Y2Nlc3MgewogICAgICAgIGJhY2tncm91bmQ6ICMyZTdkMzI7CiAgICAgICAgY29sb3I6ICNmZmZmZmY7CiAgICAgIH0KCiAgICAgIC5iYWRnZS53YXJuaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZWQ2YzAyOwogICAgICAgIGNvbG9yOiAjZmZmZmZmOwogICAgICB9CgogICAgICAuYmFkZ2UuZXJyb3IgewogICAgICAgIGJhY2tncm91bmQ6ICNlNDAwMmI7CiAgICAgICAgY29sb3I6ICNmZmZmZmY7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iYmFkZ2UgJHt0aGlzLnR5cGV9ICR7dGhpcy5yb3VuZGVkID8gInJvdW5kZWQiIDogIiJ9Ij4KICAgICAgICAke3RoaXMudGV4dH0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM1MihfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0JhZGdlMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZmVlZGJhY2svZGVlcy1oaW50L2RlZXMtaGludC5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vRnVuYzM3ID0gKCkgPT4gYjJgCiAgPGRlZXMtaGludD48L2RlZXMtaGludD4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1mZWVkYmFjay9kZWVzLWhpbnQvZGVlcy1oaW50LmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfZGlzdF90czI1KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTUyID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM1MyA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0hpbnQgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLWhpbnQiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF90eXBlX2RlY29yYXRvcnM7CiAgbGV0IF90eXBlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdHlwZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSGludDIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF90eXBlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfX2VzRGVjb3JhdGU1Mih0aGlzLCBudWxsLCBfdHlwZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0eXBlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0eXBlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnR5cGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnR5cGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdHlwZV9pbml0aWFsaXplcnMsIF90eXBlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTIobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzSGludDIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzM3OwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkZlZWRiYWNrIl07CiAgICAjdHlwZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM1Myh0aGlzLCBfdHlwZV9pbml0aWFsaXplcnMsICJpbmZvIik7CiAgICBnZXQgdHlwZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3R5cGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0eXBlKHZhbHVlMikgewogICAgICB0aGlzLiN0eXBlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnM1Myh0aGlzLCBfdHlwZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIGRvbXRvb2xzX2VsZW1lbnRiYXNpY19leHBvcnRzLnNldHVwKCk7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gW3RoZW1lRGVmYXVsdFN0eWxlcywgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLCBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgYF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAgPGRpdiBjbGFzcz0ibWFpbmJveCI+PC9kaXY+IGA7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczUzKF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzSGludDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWZlZWRiYWNrL2RlZXMtcHJvZ3Jlc3NiYXIvZGVlcy1wcm9ncmVzc2Jhci5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vRnVuYzM4ID0gKCkgPT4gewogIHJldHVybiBiMmAKICAgIDxkZWVzLXByb2dyZXNzYmFyCiAgICAgIC5wZXJjZW50YWdlPSR7NTB9CiAgICA+PC9kZWVzLXByb2dyZXNzYmFyPgogIGA7Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZmVlZGJhY2svZGVlcy1wcm9ncmVzc2Jhci9kZWVzLXByb2dyZXNzYmFyLmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfZGlzdF90czI1KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTUzID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM1NCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1Byb2dyZXNzYmFyID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1wcm9ncmVzc2JhciIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3BlcmNlbnRhZ2VfZGVjb3JhdG9yczsKICBsZXQgX3BlcmNlbnRhZ2VfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wZXJjZW50YWdlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNQcm9ncmVzc2JhcjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9wZXJjZW50YWdlX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IE51bWJlcgogICAgICB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTUzKHRoaXMsIG51bGwsIF9wZXJjZW50YWdlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInBlcmNlbnRhZ2UiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInBlcmNlbnRhZ2UiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucGVyY2VudGFnZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucGVyY2VudGFnZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wZXJjZW50YWdlX2luaXRpYWxpemVycywgX3BlcmNlbnRhZ2VfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1MyhudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNQcm9ncmVzc2JhcjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgLy8gU1RBVElDCiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMzg7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiRmVlZGJhY2siXTsKICAgICNwZXJjZW50YWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczU0KHRoaXMsIF9wZXJjZW50YWdlX2luaXRpYWxpemVycywgMCk7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IHBlcmNlbnRhZ2UoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwZXJjZW50YWdlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcGVyY2VudGFnZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcGVyY2VudGFnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoYnJpZ2h0LnRleHQsIGRhcmsudGV4dCl9OwogICAgICB9CiAgICAgIC5wcm9ncmVzc0JhckNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIG1pbi13aWR0aDogMjAwcHg7CiAgICAgIH0KCiAgICAgIC5wcm9ncmVzc0JhciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlZWVlZWIiLCAiIzQ0NCIpfTsKICAgICAgICBoZWlnaHQ6IDhweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgYm9yZGVyLXRvcDogMC41cHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIm5vbmUiLCAiIzU1NSIpfTsKICAgICAgfQoKICAgICAgLnByb2dyZXNzQmFyRmlsbCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoZGFyay5ibHVlQWN0aXZlLCBicmlnaHQuYmx1ZUFjdGl2ZSl9OwogICAgICAgIGhlaWdodDogOHB4OwogICAgICAgIG1hcmdpbi10b3A6IC0wLjVweDsKICAgICAgICB0cmFuc2l0aW9uOiAwLjJzIHdpZHRoOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICB3aWR0aDogMHB4OwogICAgICAgIGJvcmRlci10b3A6IDAuNSBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgibm9uZSIsICIjMzk4ZmZmIil9OwogICAgICB9CgogICAgICAucHJvZ3Jlc3NUZXh0IHsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzQmFyQ29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ncmVzc0JhciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ncmVzc0JhckZpbGwiPjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icHJvZ3Jlc3NUZXh0Ij4KICAgICAgICAgICAgJHt0aGlzLnBlcmNlbnRhZ2V9JQogICAgICAgICAgPGRpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcykgewogICAgICBzdXBlci5maXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHsKICAgICAgICB0aGlzLnVwZGF0ZVBlcmNlbnRhZ2UoKTsKICAgICAgfSk7CiAgICB9CiAgICBhc3luYyB1cGRhdGVQZXJjZW50YWdlKCkgewogICAgICBjb25zdCBwcm9ncmVzc0JhckZpbGwgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLnByb2dyZXNzQmFyRmlsbCIpOwogICAgICBwcm9ncmVzc0JhckZpbGwuc3R5bGUud2lkdGggPSBgJHt0aGlzLnBlcmNlbnRhZ2V9JWA7CiAgICB9CiAgICB1cGRhdGVkKCkgewogICAgICB0aGlzLnVwZGF0ZVBlcmNlbnRhZ2UoKTsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczU0KHRoaXMsIF9wZXJjZW50YWdlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNTQoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNQcm9ncmVzc2JhcjIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWZlZWRiYWNrL2RlZXMtc3Bpbm5lci9kZWVzLXNwaW5uZXIuanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF9kaXN0X3RzMjUoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlNTQgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczU1ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzU3Bpbm5lciA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtc3Bpbm5lciIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3NpemVfZGVjb3JhdG9yczsKICBsZXQgX3NpemVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaXplX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ibndfZGVjb3JhdG9yczsKICBsZXQgX2Jud19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Jud19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc3RhdHVzX2RlY29yYXRvcnM7CiAgbGV0IF9zdGF0dXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zdGF0dXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1NwaW5uZXIyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfc2l6ZV9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBOdW1iZXIKICAgICAgfSldOwogICAgICBfYm53X2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IFN0cmluZwogICAgICB9KV07CiAgICAgIF9zdGF0dXNfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX19lc0RlY29yYXRlNTQodGhpcywgbnVsbCwgX3NpemVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2l6ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2l6ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaXplLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaXplID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NpemVfaW5pdGlhbGl6ZXJzLCBfc2l6ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU0KHRoaXMsIG51bGwsIF9ibndfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYm53Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJibnciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYm53LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5ibncgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYm53X2luaXRpYWxpemVycywgX2Jud19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU0KHRoaXMsIG51bGwsIF9zdGF0dXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic3RhdHVzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzdGF0dXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc3RhdHVzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zdGF0dXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc3RhdHVzX2luaXRpYWxpemVycywgX3N0YXR1c19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU0KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1NwaW5uZXIyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJGZWVkYmFjayJdOwogICAgc3RhdGljIGRlbW8gPSAoKSA9PiBiMmAKICAgIDxkZWVzLXNwaW5uZXI+PC9kZWVzLXNwaW5uZXI+CiAgICA8ZGVlcy1zcGlubmVyIHN0YXR1cz0ic3VjY2VzcyI+PC9kZWVzLXNwaW5uZXI+CiAgICA8ZGVlcy1zcGlubmVyIHN0YXR1cz0iZXJyb3IiPjwvZGVlcy1zcGlubmVyPgogICAgPGRlZXMtc3Bpbm5lciBzaXplPSR7NjR9IHN0YXR1cz0ic3VjY2VzcyI+PC9kZWVzLXNwaW5uZXI+CiAgICA8ZGVlcy1zcGlubmVyIC5zaXplPSR7NjR9IHN0YXR1cz0iZXJyb3IiPjwvZGVlcy1zcGlubmVyPgogIGA7CiAgICAjc2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM1NSh0aGlzLCBfc2l6ZV9pbml0aWFsaXplcnMsIDIwKTsKICAgIGdldCBzaXplKCkgewogICAgICByZXR1cm4gdGhpcy4jc2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNpemUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNibndfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU1KHRoaXMsIF9zaXplX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1NSh0aGlzLCBfYm53X2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBibncoKSB7CiAgICAgIHJldHVybiB0aGlzLiNibndfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBibncodmFsdWUyKSB7CiAgICAgIHRoaXMuI2Jud19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3N0YXR1c19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTUodGhpcywgX2Jud19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTUodGhpcywgX3N0YXR1c19pbml0aWFsaXplcnMsICJub3JtYWwiKSk7CiAgICBnZXQgc3RhdHVzKCkgewogICAgICByZXR1cm4gdGhpcy4jc3RhdHVzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc3RhdHVzKHZhbHVlMikgewogICAgICB0aGlzLiNzdGF0dXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBfX3J1bkluaXRpYWxpemVyczU1KHRoaXMsIF9zdGF0dXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgI2xvYWRpbmcgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB0cmFuc2l0aW9uOiBub25lOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICAgIGJhY2tncm91bmQ6ICM4YmMzNGEwMDsKICAgICAgICBib3JkZXI6IDNweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjEpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzMzMiLCAiI2ZmZiIpfTsKICAgICAgICBhbmltYXRpb246IHNwaW4gMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IHNwaW4gMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgICNsb2FkaW5nLnN1Y2Nlc3MgewogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYW5pbWF0aW9uOiBub25lOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBub25lOwogICAgICB9CgogICAgICAjbG9hZGluZy5lcnJvciB7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBhbmltYXRpb246IG5vbmU7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgc3BpbiB7CiAgICAgICAgdG8gewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgIH0KICAgICAgfQogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgc3BpbiB7CiAgICAgICAgdG8gewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZGVlcy1pY29uIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxzdHlsZT4KICAgICAgICAjbG9hZGluZyB7CiAgICAgICAgICB3aWR0aDogJHt0aGlzLnNpemV9cHg7CiAgICAgICAgICBoZWlnaHQ6ICR7dGhpcy5zaXplfXB4OwogICAgICAgIH0KICAgICAgICAjbG9hZGluZy5zdWNjZXNzIHsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSh0aGlzLmJudyA/ICIjMzMzIiA6IGAjOGJjMzRhYCwgdGhpcy5ibncgPyAiI2ZmZiIgOiBgIzhiYzM0YWApfTsKICAgICAgICAgIAogICAgICAgIH0KICAgICAgICAjbG9hZGluZy5lcnJvciB7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUodGhpcy5ibncgPyAiIzMzMyIgOiBgI2U2NGExOWAsIHRoaXMuYm53ID8gIiNmZmYiIDogYCNlNjRhMTlgKX07CiAgICAgICAgfQogICAgICAgIGRlZXMtaWNvbiB7CiAgICAgICAgICBmb250LXNpemU6ICR7dGhpcy5zaXplfXB4OwogICAgICAgIH0KICAgICAgPC9zdHlsZT4KICAgICAgPGRpdiBjbGFzcz0iJHt0aGlzLnN0YXR1c30iIGlkPSJsb2FkaW5nIj4KICAgICAgICAkeygoKSA9PiB7CiAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAic3VjY2VzcyIpIHsKICAgICAgICAgIHJldHVybiBiMmA8ZGVlcy1pY29uIHN0eWxlPSJ0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMSUpIHRyYW5zbGF0ZVkoMyUpOyIgLmljb249JHsiZmE6Y2lyY2xlLWNoZWNrIn0+PC9kZWVzLWljb24+YDsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdHVzID09PSAiZXJyb3IiKSB7CiAgICAgICAgICByZXR1cm4gYjJgPGRlZXMtaWNvbiAuaWNvbj0keyJmYTpjaXJjbGUteG1hcmsifT48L2RlZXMtaWNvbj5gOwogICAgICAgIH0KICAgICAgfSkoKX0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM1NShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1NwaW5uZXIyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1mZWVkYmFjay9kZWVzLXRvYXN0L2RlZXMtdG9hc3QuZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgZGVtb0Z1bmMzOSA9ICgpID0+IGIyYAogICAgPHN0eWxlPgogICAgICAuZGVtby1jb250YWluZXIgewogICAgICAgIHBhZGRpbmc6IDMycHg7CiAgICAgICAgbWluLWhlaWdodDogMTAwdmg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOGY5ZmEiLCAiIzBhMGEwYSIpfTsKICAgICAgfQoKICAgICAgLmRlbW8tc2VjdGlvbiB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNDhweDsKICAgICAgfQoKICAgICAgLmRlbW8tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMjRweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMzMzIiwgIiNmZmYiKX07CiAgICAgIH0KCiAgICAgIC5kZW1vLWRlc2NyaXB0aW9uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNjY2IiwgIiNhYWEiKX07CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgfQoKICAgICAgLmJ1dHRvbi1ncmlkIHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjAwcHgsIDFmcikpOwogICAgICAgIGdhcDogMTZweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAzMnB4OwogICAgICB9CgogICAgICAudGhlbWUtdG9nZ2xlIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAxNnB4OwogICAgICAgIHJpZ2h0OiAxNnB4OwogICAgICAgIHotaW5kZXg6IDEwMDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICAgIDxkZWVzLWJ1dHRvbiBjbGFzcz0idGhlbWUtdG9nZ2xlIiBAY2xpY2tlZD0keygpID0+IHsKICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoImJyaWdodCIpOwp9fT5Ub2dnbGUgVGhlbWU8L2RlZXMtYnV0dG9uPgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPlRvYXN0IFR5cGVzPC9oMj4KICAgICAgICA8cCBjbGFzcz0iZGVtby1kZXNjcmlwdGlvbiI+CiAgICAgICAgICBEaWZmZXJlbnQgdG9hc3QgdHlwZXMgZm9yIHZhcmlvdXMgbm90aWZpY2F0aW9uIHNjZW5hcmlvcy4gQ2xpY2sgYW55IGJ1dHRvbiB0byBzaG93IGEgdG9hc3QuCiAgICAgICAgPC9wPgogICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbi1ncmlkIj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2tlZD0keygpID0+IHsKICBEZWVzVG9hc3QuaW5mbygiVGhpcyBpcyBhbiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2UiKTsKfX0+SW5mbyBUb2FzdDwvZGVlcy1idXR0b24+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJoaWdobGlnaHRlZCIgQGNsaWNrZWQ9JHsoKSA9PiB7CiAgRGVlc1RvYXN0LnN1Y2Nlc3MoIk9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ISIpOwp9fT5TdWNjZXNzIFRvYXN0PC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGlja2VkPSR7KCkgPT4gewogIERlZXNUb2FzdC53YXJuaW5nKCJQbGVhc2UgcmV2aWV3IGJlZm9yZSBwcm9jZWVkaW5nIik7Cn19Pldhcm5pbmcgVG9hc3Q8L2RlZXMtYnV0dG9uPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrZWQ9JHsoKSA9PiB7CiAgRGVlc1RvYXN0LmVycm9yKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIik7Cn19PkVycm9yIFRvYXN0PC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMiBjbGFzcz0iZGVtby10aXRsZSI+VG9hc3QgUG9zaXRpb25zPC9oMj4KICAgICAgICA8cCBjbGFzcz0iZGVtby1kZXNjcmlwdGlvbiI+CiAgICAgICAgICBUb2FzdHMgY2FuIGFwcGVhciBpbiBkaWZmZXJlbnQgcG9zaXRpb25zIG9uIHRoZSBzY3JlZW4uCiAgICAgICAgPC9wPgogICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbi1ncmlkIj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2tlZD0keygpID0+IHsKICBEZWVzVG9hc3Quc2hvdyh7CiAgICBtZXNzYWdlOiAiVG9wIFJpZ2h0IFBvc2l0aW9uIiwKICAgIHR5cGU6ICJpbmZvIiwKICAgIHBvc2l0aW9uOiAidG9wLXJpZ2h0IgogIH0pOwp9fT5Ub3AgUmlnaHQ8L2RlZXMtYnV0dG9uPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrZWQ9JHsoKSA9PiB7CiAgRGVlc1RvYXN0LnNob3coewogICAgbWVzc2FnZTogIlRvcCBMZWZ0IFBvc2l0aW9uIiwKICAgIHR5cGU6ICJpbmZvIiwKICAgIHBvc2l0aW9uOiAidG9wLWxlZnQiCiAgfSk7Cn19PlRvcCBMZWZ0PC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGlja2VkPSR7KCkgPT4gewogIERlZXNUb2FzdC5zaG93KHsKICAgIG1lc3NhZ2U6ICJCb3R0b20gUmlnaHQgUG9zaXRpb24iLAogICAgdHlwZTogImluZm8iLAogICAgcG9zaXRpb246ICJib3R0b20tcmlnaHQiCiAgfSk7Cn19PkJvdHRvbSBSaWdodDwvZGVlcy1idXR0b24+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2tlZD0keygpID0+IHsKICBEZWVzVG9hc3Quc2hvdyh7CiAgICBtZXNzYWdlOiAiQm90dG9tIExlZnQgUG9zaXRpb24iLAogICAgdHlwZTogImluZm8iLAogICAgcG9zaXRpb246ICJib3R0b20tbGVmdCIKICB9KTsKfX0+Qm90dG9tIExlZnQ8L2RlZXMtYnV0dG9uPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrZWQ9JHsoKSA9PiB7CiAgRGVlc1RvYXN0LnNob3coewogICAgbWVzc2FnZTogIlRvcCBDZW50ZXIgUG9zaXRpb24iLAogICAgdHlwZTogImluZm8iLAogICAgcG9zaXRpb246ICJ0b3AtY2VudGVyIgogIH0pOwp9fT5Ub3AgQ2VudGVyPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGlja2VkPSR7KCkgPT4gewogIERlZXNUb2FzdC5zaG93KHsKICAgIG1lc3NhZ2U6ICJCb3R0b20gQ2VudGVyIFBvc2l0aW9uIiwKICAgIHR5cGU6ICJpbmZvIiwKICAgIHBvc2l0aW9uOiAiYm90dG9tLWNlbnRlciIKICB9KTsKfX0+Qm90dG9tIENlbnRlcjwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPkR1cmF0aW9uIE9wdGlvbnM8L2gyPgogICAgICAgIDxwIGNsYXNzPSJkZW1vLWRlc2NyaXB0aW9uIj4KICAgICAgICAgIENvbnRyb2wgaG93IGxvbmcgdG9hc3RzIHN0YXkgdmlzaWJsZS4gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLgogICAgICAgIDwvcD4KICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JpZCI+CiAgICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrZWQ9JHsoKSA9PiB7CiAgRGVlc1RvYXN0LnNob3coewogICAgbWVzc2FnZTogIlF1aWNrIHRvYXN0ICgxIHNlY29uZCkiLAogICAgdHlwZTogImluZm8iLAogICAgZHVyYXRpb246IDFlMwogIH0pOwp9fT4xIFNlY29uZDwvZGVlcy1idXR0b24+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2tlZD0keygpID0+IHsKICBEZWVzVG9hc3Quc2hvdyh7CiAgICBtZXNzYWdlOiAiU3RhbmRhcmQgdG9hc3QgKDMgc2Vjb25kcykiLAogICAgdHlwZTogImluZm8iLAogICAgZHVyYXRpb246IDNlMwogIH0pOwp9fT4zIFNlY29uZHMgKERlZmF1bHQpPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGlja2VkPSR7KCkgPT4gewogIERlZXNUb2FzdC5zaG93KHsKICAgIG1lc3NhZ2U6ICJMb25nIHRvYXN0ICg1IHNlY29uZHMpIiwKICAgIHR5cGU6ICJpbmZvIiwKICAgIGR1cmF0aW9uOiA1ZTMKICB9KTsKfX0+NSBTZWNvbmRzPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGlja2VkPSR7KCkgPT4gewogIERlZXNUb2FzdC5zaG93KHsKICAgIG1lc3NhZ2U6ICJNYW51YWwgZGlzbWlzcyBvbmx5IChjbGljayB0byBjbG9zZSkiLAogICAgdHlwZTogIndhcm5pbmciLAogICAgZHVyYXRpb246IDAKICB9KTsKfX0+Tm8gQXV0by1EaXNtaXNzPC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMiBjbGFzcz0iZGVtby10aXRsZSI+TXVsdGlwbGUgVG9hc3RzPC9oMj4KICAgICAgICA8cCBjbGFzcz0iZGVtby1kZXNjcmlwdGlvbiI+CiAgICAgICAgICBNdWx0aXBsZSB0b2FzdHMgc3RhY2sgYXV0b21hdGljYWxseS4gVGhleSBtYWludGFpbiB0aGVpciBvcmRlciBhbmQgYW5pbWF0ZSBzbW9vdGhseS4KICAgICAgICA8L3A+CiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9uLWdyaWQiPgogICAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGlja2VkPSR7KCkgPT4gewogIERlZXNUb2FzdC5pbmZvKCJGaXJzdCBub3RpZmljYXRpb24iKTsKICBzZXRUaW1lb3V0KCgpID0+IERlZXNUb2FzdC5zdWNjZXNzKCJTZWNvbmQgbm90aWZpY2F0aW9uIiksIDIwMCk7CiAgc2V0VGltZW91dCgoKSA9PiBEZWVzVG9hc3Qud2FybmluZygiVGhpcmQgbm90aWZpY2F0aW9uIiksIDQwMCk7CiAgc2V0VGltZW91dCgoKSA9PiBEZWVzVG9hc3QuZXJyb3IoIkZvdXJ0aCBub3RpZmljYXRpb24iKSwgNjAwKTsKfX0+U2hvdyBNdWx0aXBsZTwvZGVlcy1idXR0b24+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2tlZD0keygpID0+IHsKICBmb3IgKGxldCBpMTEgPSAxOyBpMTEgPD0gNTsgaTExKyspIHsKICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICBEZWVzVG9hc3Quc2hvdyh7CiAgICAgICAgbWVzc2FnZTogYE5vdGlmaWNhdGlvbiAjJHtpMTF9YCwKICAgICAgICB0eXBlOiBpMTEgJSAyID09PSAwID8gInN1Y2Nlc3MiIDogImluZm8iLAogICAgICAgIGR1cmF0aW9uOiAyZTMgKyBpMTEgKiA1MDAKICAgICAgfSk7CiAgICB9LCBpMTEgKiAxMDApOwogIH0KfX0+UmFwaWQgRmlyZTwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPlJlYWwtV29ybGQgRXhhbXBsZXM8L2gyPgogICAgICAgIDxwIGNsYXNzPSJkZW1vLWRlc2NyaXB0aW9uIj4KICAgICAgICAgIENvbW1vbiB1c2UgY2FzZXMgZm9yIHRvYXN0IG5vdGlmaWNhdGlvbnMgaW4gYXBwbGljYXRpb25zLgogICAgICAgIDwvcD4KICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JpZCI+CiAgICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrZWQ9JHthc3luYyAoKSA9PiB7CiAgY29uc3QgdG9hc3QgPSBhd2FpdCBEZWVzVG9hc3Quc2hvdyh7CiAgICBtZXNzYWdlOiAiU2F2aW5nIGNoYW5nZXMuLi4iLAogICAgdHlwZTogImluZm8iLAogICAgZHVyYXRpb246IDAKICB9KTsKICBzZXRUaW1lb3V0KCgpID0+IHsKICAgIHRvYXN0LmRpc21pc3MoKTsKICAgIERlZXNUb2FzdC5zdWNjZXNzKCJDaGFuZ2VzIHNhdmVkIHN1Y2Nlc3NmdWxseSEiKTsKICB9LCAyZTMpOwp9fT5TYXZlIE9wZXJhdGlvbjwvZGVlcy1idXR0b24+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2tlZD0keygpID0+IHsKICBEZWVzVG9hc3QuZXJyb3IoIkZhaWxlZCB0byBjb25uZWN0IHRvIHNlcnZlci4gUGxlYXNlIGNoZWNrIHlvdXIgaW50ZXJuZXQgY29ubmVjdGlvbi4iKTsKfX0+TmV0d29yayBFcnJvcjwvZGVlcy1idXR0b24+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2tlZD0keygpID0+IHsKICBEZWVzVG9hc3Qud2FybmluZygiWW91ciBzZXNzaW9uIHdpbGwgZXhwaXJlIGluIDUgbWludXRlcyIpOwp9fT5TZXNzaW9uIFdhcm5pbmc8L2RlZXMtYnV0dG9uPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrZWQ9JHsoKSA9PiB7CiAgRGVlc1RvYXN0LnN1Y2Nlc3MoIkZpbGUgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5ISIpOwp9fT5VcGxvYWQgQ29tcGxldGU8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgyIGNsYXNzPSJkZW1vLXRpdGxlIj5Qcm9ncmFtbWF0aWMgQ29udHJvbDwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImRlbW8tZGVzY3JpcHRpb24iPgogICAgICAgICAgQWR2YW5jZWQgY29udHJvbCBvdmVyIHRvYXN0IGJlaGF2aW9yLgogICAgICAgIDwvcD4KICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JpZCI+CiAgICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrZWQ9JHthc3luYyAoKSA9PiB7CiAgY29uc3QgdG9hc3QgPSBhd2FpdCBEZWVzVG9hc3Quc2hvdyh7CiAgICBtZXNzYWdlOiAiVGhpcyB0b2FzdCBjYW4gYmUgZGlzbWlzc2VkIHByb2dyYW1tYXRpY2FsbHkiLAogICAgdHlwZTogImluZm8iLAogICAgZHVyYXRpb246IDAKICB9KTsKICBzZXRUaW1lb3V0KCgpID0+IHsKICAgIHRvYXN0LmRpc21pc3MoKTsKICAgIERlZXNUb2FzdC5zdWNjZXNzKCJUb2FzdCBkaXNtaXNzZWQgYWZ0ZXIgMiBzZWNvbmRzIik7CiAgfSwgMmUzKTsKfX0+UHJvZ3JhbW1hdGljIERpc21pc3M8L2RlZXMtYnV0dG9uPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrZWQ9JHsoKSA9PiB7CiAgRGVlc1RvYXN0LmluZm8oIkluZm8gbWVzc2FnZSIsIDJlMyk7CiAgc2V0VGltZW91dCgoKSA9PiBEZWVzVG9hc3Quc3VjY2VzcygiU3VjY2VzcyBtZXNzYWdlIiwgMmUzKSwgNTAwKTsKICBzZXRUaW1lb3V0KCgpID0+IERlZXNUb2FzdC53YXJuaW5nKCJXYXJuaW5nIG1lc3NhZ2UiLCAyZTMpLCAxZTMpOwogIHNldFRpbWVvdXQoKCkgPT4gRGVlc1RvYXN0LmVycm9yKCJFcnJvciBtZXNzYWdlIiwgMmUzKSwgMTUwMCk7Cn19PkNvbnZlbmllbmNlIE1ldGhvZHM8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIGA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZmVlZGJhY2svZGVlcy10b2FzdC9kZWVzLXRvYXN0LmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfZGlzdF90czI1KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTU1ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM1NiA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1RvYXN0ID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy10b2FzdCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX21lc3NhZ2VfZGVjb3JhdG9yczsKICBsZXQgX21lc3NhZ2VfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tZXNzYWdlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90eXBlX2RlY29yYXRvcnM7CiAgbGV0IF90eXBlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdHlwZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZHVyYXRpb25fZGVjb3JhdG9yczsKICBsZXQgX2R1cmF0aW9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZHVyYXRpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzVmlzaWJsZV9kZWNvcmF0b3JzOwogIGxldCBfaXNWaXNpYmxlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNWaXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNUb2FzdDIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9tZXNzYWdlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfdHlwZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2R1cmF0aW9uX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfaXNWaXNpYmxlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0pXTsKICAgICAgX19lc0RlY29yYXRlNTUodGhpcywgbnVsbCwgX21lc3NhZ2VfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWVzc2FnZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWVzc2FnZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tZXNzYWdlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tZXNzYWdlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21lc3NhZ2VfaW5pdGlhbGl6ZXJzLCBfbWVzc2FnZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU1KHRoaXMsIG51bGwsIF90eXBlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInR5cGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInR5cGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudHlwZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudHlwZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90eXBlX2luaXRpYWxpemVycywgX3R5cGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1NSh0aGlzLCBudWxsLCBfZHVyYXRpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZHVyYXRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImR1cmF0aW9uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmR1cmF0aW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kdXJhdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kdXJhdGlvbl9pbml0aWFsaXplcnMsIF9kdXJhdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU1KHRoaXMsIG51bGwsIF9pc1Zpc2libGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNWaXNpYmxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc1Zpc2libGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNWaXNpYmxlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc1Zpc2libGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNWaXNpYmxlX2luaXRpYWxpemVycywgX2lzVmlzaWJsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU1KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1RvYXN0MiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAvLyBTVEFUSUMKICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMzOTsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJGZWVkYmFjayIsICJPdmVybGF5Il07CiAgICBzdGF0aWMgdG9hc3RDb250YWluZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIHN0YXRpYyBnZXRPckNyZWF0ZUNvbnRhaW5lcihwb3NpdGlvbjMpIHsKICAgICAgaWYgKCF0aGlzLnRvYXN0Q29udGFpbmVycy5oYXMocG9zaXRpb24zKSkgewogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSBgdG9hc3QtY29udGFpbmVyIHRvYXN0LWNvbnRhaW5lci0ke3Bvc2l0aW9uM31gOwogICAgICAgIGNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gYAogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB6LWluZGV4OiAke3pJbmRleExheWVycy5vdmVybGF5LnRvYXN0fTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDhweDsKICAgICAgYDsKICAgICAgICBzd2l0Y2ggKHBvc2l0aW9uMykgewogICAgICAgICAgY2FzZSAidG9wLXJpZ2h0IjoKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRvcCA9ICIwIjsKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gIjAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgInRvcC1sZWZ0IjoKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRvcCA9ICIwIjsKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmxlZnQgPSAiMCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiYm90dG9tLXJpZ2h0IjoKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvdHRvbSA9ICIwIjsKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gIjAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImJvdHRvbS1sZWZ0IjoKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvdHRvbSA9ICIwIjsKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmxlZnQgPSAiMCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAidG9wLWNlbnRlciI6CiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS50b3AgPSAiMCI7CiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gIjUwJSI7CiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gPSAidHJhbnNsYXRlWCgtNTAlKSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiYm90dG9tLWNlbnRlciI6CiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSAiMCI7CiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gIjUwJSI7CiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gPSAidHJhbnNsYXRlWCgtNTAlKSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7CiAgICAgICAgdGhpcy50b2FzdENvbnRhaW5lcnMuc2V0KHBvc2l0aW9uMywgY29udGFpbmVyKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy50b2FzdENvbnRhaW5lcnMuZ2V0KHBvc2l0aW9uMyk7CiAgICB9CiAgICBzdGF0aWMgYXN5bmMgc2hvdyhvcHRpb25zKSB7CiAgICAgIGNvbnN0IG9wdHMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgPyB7IG1lc3NhZ2U6IG9wdGlvbnMgfSA6IG9wdGlvbnM7CiAgICAgIGNvbnN0IHRvYXN0ID0gbmV3IERlZXNUb2FzdDIoKTsKICAgICAgdG9hc3QubWVzc2FnZSA9IG9wdHMubWVzc2FnZTsKICAgICAgdG9hc3QudHlwZSA9IG9wdHMudHlwZSB8fCAiaW5mbyI7CiAgICAgIHRvYXN0LmR1cmF0aW9uID0gb3B0cy5kdXJhdGlvbiB8fCAzZTM7CiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZ2V0T3JDcmVhdGVDb250YWluZXIob3B0cy5wb3NpdGlvbiB8fCAidG9wLXJpZ2h0Iik7CiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b2FzdCk7CiAgICAgIGF3YWl0IHRvYXN0LnVwZGF0ZUNvbXBsZXRlOwogICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgIHRvYXN0LmlzVmlzaWJsZSA9IHRydWU7CiAgICAgIH0pOwogICAgICBpZiAodG9hc3QuZHVyYXRpb24gPiAwKSB7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICB0b2FzdC5kaXNtaXNzKCk7CiAgICAgICAgfSwgdG9hc3QuZHVyYXRpb24pOwogICAgICB9CiAgICAgIHJldHVybiB0b2FzdDsKICAgIH0KICAgIC8vIEFsaWFzIGZvciBjb25zaXN0ZW5jeSB3aXRoIERlZXNNb2RhbAogICAgc3RhdGljIGFzeW5jIGNyZWF0ZUFuZFNob3cob3B0aW9ucykgewogICAgICByZXR1cm4gdGhpcy5zaG93KG9wdGlvbnMpOwogICAgfQogICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kcwogICAgc3RhdGljIGluZm8obWVzc2FnZTIsIGR1cmF0aW9uKSB7CiAgICAgIHJldHVybiB0aGlzLnNob3coeyBtZXNzYWdlOiBtZXNzYWdlMiwgdHlwZTogImluZm8iLCBkdXJhdGlvbiB9KTsKICAgIH0KICAgIHN0YXRpYyBzdWNjZXNzKG1lc3NhZ2UyLCBkdXJhdGlvbikgewogICAgICByZXR1cm4gdGhpcy5zaG93KHsgbWVzc2FnZTogbWVzc2FnZTIsIHR5cGU6ICJzdWNjZXNzIiwgZHVyYXRpb24gfSk7CiAgICB9CiAgICBzdGF0aWMgd2FybmluZyhtZXNzYWdlMiwgZHVyYXRpb24pIHsKICAgICAgcmV0dXJuIHRoaXMuc2hvdyh7IG1lc3NhZ2U6IG1lc3NhZ2UyLCB0eXBlOiAid2FybmluZyIsIGR1cmF0aW9uIH0pOwogICAgfQogICAgc3RhdGljIGVycm9yKG1lc3NhZ2UyLCBkdXJhdGlvbikgewogICAgICByZXR1cm4gdGhpcy5zaG93KHsgbWVzc2FnZTogbWVzc2FnZTIsIHR5cGU6ICJlcnJvciIsIGR1cmF0aW9uIH0pOwogICAgfQogICAgI21lc3NhZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNTYodGhpcywgX21lc3NhZ2VfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IG1lc3NhZ2UoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtZXNzYWdlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWVzc2FnZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWVzc2FnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3R5cGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU2KHRoaXMsIF9tZXNzYWdlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1Nih0aGlzLCBfdHlwZV9pbml0aWFsaXplcnMsICJpbmZvIikpOwogICAgZ2V0IHR5cGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0eXBlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdHlwZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdHlwZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2R1cmF0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1Nih0aGlzLCBfdHlwZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTYodGhpcywgX2R1cmF0aW9uX2luaXRpYWxpemVycywgM2UzKSk7CiAgICBnZXQgZHVyYXRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNkdXJhdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGR1cmF0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNkdXJhdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzVmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTYodGhpcywgX2R1cmF0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1Nih0aGlzLCBfaXNWaXNpYmxlX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc1Zpc2libGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc1Zpc2libGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc1Zpc2libGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzVmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNTYodGhpcywgX2lzVmlzaWJsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIGRvbXRvb2xzX2VsZW1lbnRiYXNpY19leHBvcnRzLnNldHVwKCk7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICAgIGZvbnQtZmFtaWx5OiAke2Nzc0dlaXN0Rm9udEZhbWlseX07CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEwcHgpOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpc3Zpc2libGVdKSB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgIH0KCiAgICAgIC50b2FzdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTJweDsKICAgICAgICBwYWRkaW5nOiAxNnB4IDIwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmIiwgIiMyMjIiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlMGUwZTAiLCAiIzMzMyIpfTsKICAgICAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsMCwwLDAuMSkiLCAicmdiYSgwLDAsMCwwLjMpIil9OwogICAgICAgIG1pbi13aWR0aDogMzAwcHg7CiAgICAgICAgbWF4LXdpZHRoOiA1MDBweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC50b2FzdDpob3ZlciB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjAyKTsKICAgICAgfQoKICAgICAgLmljb24gewogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5pY29uIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAubWVzc2FnZSB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzMzMiLCAiI2ZmZiIpfTsKICAgICAgfQoKICAgICAgLmNsb3NlIHsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7CiAgICAgIH0KCiAgICAgIC5jbG9zZTpob3ZlciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmNsb3NlIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGZpbGw6IGN1cnJlbnRDb2xvcjsKICAgICAgfQoKICAgICAgLyogVHlwZS1zcGVjaWZpYyBzdHlsZXMgKi8KICAgICAgOmhvc3QoW3R5cGU9ImluZm8iXSkgLmljb24gewogICAgICAgIGNvbG9yOiAjMDA4NGZmOwogICAgICB9CgogICAgICA6aG9zdChbdHlwZT0ic3VjY2VzcyJdKSAuaWNvbiB7CiAgICAgICAgY29sb3I6ICMyMmM1NWU7CiAgICAgIH0KCiAgICAgIDpob3N0KFt0eXBlPSJ3YXJuaW5nIl0pIC5pY29uIHsKICAgICAgICBjb2xvcjogI2Y1OWUwYjsKICAgICAgfQoKICAgICAgOmhvc3QoW3R5cGU9ImVycm9yIl0pIC5pY29uIHsKICAgICAgICBjb2xvcjogI2VmNDQ0NDsKICAgICAgfQoKICAgICAgLyogUHJvZ3Jlc3MgYmFyICovCiAgICAgIC5wcm9ncmVzcyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGhlaWdodDogM3B4OwogICAgICAgIGJhY2tncm91bmQ6IGN1cnJlbnRDb2xvcjsKICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAwIDhweCA4cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnByb2dyZXNzLWJhciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6IGN1cnJlbnRDb2xvcjsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdDsKICAgICAgICBhbmltYXRpb246IHByb2dyZXNzIGxpbmVhciBmb3J3YXJkczsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBwcm9ncmVzcyB7CiAgICAgICAgZnJvbSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKTsKICAgICAgICB9CiAgICAgICAgdG8gewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMCk7CiAgICAgICAgfQogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICBjb25zdCBpY29uczYgPSB7CiAgICAgICAgaW5mbzogYjJgPHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIGZpbGw9ImN1cnJlbnRDb2xvciI+CiAgICAgICAgPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTAgMThhOCA4IDAgMTAwLTE2IDggOCAwIDAwMCAxNnptMS0xMWExIDEgMCAxMC0yIDB2Mkg3YTEgMSAwIDEwMCAyaDJ2MmExIDEgMCAxMDIgMHYtMmgyYTEgMSAwIDEwMC0yaC0yVjd6IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz4KICAgICAgPC9zdmc+YCwKICAgICAgICBzdWNjZXNzOiBiMmA8c3ZnIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0iY3VycmVudENvbG9yIj4KICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMCAxOGE4IDggMCAxMDAtMTYgOCA4IDAgMDAwIDE2em0zLjcwNy05LjI5M2ExIDEgMCAwMC0xLjQxNC0xLjQxNEw5IDEwLjU4NiA3LjcwNyA5LjI5M2ExIDEgMCAwMC0xLjQxNCAxLjQxNGwyIDJhMSAxIDAgMDAxLjQxNCAwbDQtNHoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPgogICAgICA8L3N2Zz5gLAogICAgICAgIHdhcm5pbmc6IGIyYDxzdmcgdmlld0JveD0iMCAwIDIwIDIwIiBmaWxsPSJjdXJyZW50Q29sb3IiPgogICAgICAgIDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTguMjU3IDMuMDk5Yy43NjUtMS4zNiAyLjcyMi0xLjM2IDMuNDg2IDBsNS41OCA5LjkyYy43NSAxLjMzNC0uMjEzIDIuOTgtMS43NDIgMi45OEg0LjQyYy0xLjUzIDAtMi40OTMtMS42NDYtMS43NDMtMi45OGw1LjU4LTkuOTJ6TTExIDEzYTEgMSAwIDExLTIgMCAxIDEgMCAwMTIgMHptLTEtOGExIDEgMCAwMC0xIDF2M2ExIDEgMCAwMDIgMFY2YTEgMSAwIDAwLTEtMXoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPgogICAgICA8L3N2Zz5gLAogICAgICAgIGVycm9yOiBiMmA8c3ZnIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0iY3VycmVudENvbG9yIj4KICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMCAxOGE4IDggMCAxMDAtMTYgOCA4IDAgMDAwIDE2ek04LjcwNyA3LjI5M2ExIDEgMCAwMC0xLjQxNCAxLjQxNEw4LjU4NiAxMGwtMS4yOTMgMS4yOTNhMSAxIDAgMTAxLjQxNCAxLjQxNEwxMCAxMS40MTRsMS4yOTMgMS4yOTNhMSAxIDAgMDAxLjQxNC0xLjQxNEwxMS40MTQgMTBsMS4yOTMtMS4yOTNhMSAxIDAgMDAtMS40MTQtMS40MTRMMTAgOC41ODYgOC43MDcgNy4yOTN6IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz4KICAgICAgPC9zdmc+YAogICAgICB9OwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InRvYXN0IiBAY2xpY2s9JHt0aGlzLmRpc21pc3N9PgogICAgICAgIDxkaXYgY2xhc3M9Imljb24iPgogICAgICAgICAgJHtpY29uczZbdGhpcy50eXBlXX0KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4ke3RoaXMubWVzc2FnZX08L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjbG9zZSI+CiAgICAgICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0iY3VycmVudENvbG9yIj4KICAgICAgICAgICAgPHBhdGggZD0iTTQuNjQ2IDQuNjQ2YS41LjUgMCAwIDEgLjcwOCAwTDggNy4yOTNsMi42NDYtMi42NDdhLjUuNSAwIDAgMSAuNzA4LjcwOEw4LjcwNyA4bDIuNjQ3IDIuNjQ2YS41LjUgMCAwIDEtLjcwOC43MDhMOCA4LjcwN2wtMi42NDYgMi42NDdhLjUuNSAwIDAgMS0uNzA4LS43MDhMNy4yOTMgOCA0LjY0NiA1LjM1NGEuNS41IDAgMCAxIDAtLjcwOHoiLz4KICAgICAgICAgIDwvc3ZnPgogICAgICAgIDwvZGl2PgogICAgICAgICR7dGhpcy5kdXJhdGlvbiA+IDAgPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIiBzdHlsZT0iYW5pbWF0aW9uLWR1cmF0aW9uOiAke3RoaXMuZHVyYXRpb259bXMiPjwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgYCA6ICIifQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBkaXNtaXNzKCkgewogICAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlOwogICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHNldFRpbWVvdXQocmVzb2x2ZTIsIDMwMCkpOwogICAgICB0aGlzLnJlbW92ZSgpOwogICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnBhcmVudEVsZW1lbnQ7CiAgICAgIGlmIChjb250YWluZXIgJiYgY29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgewogICAgICAgIGNvbnRhaW5lci5yZW1vdmUoKTsKICAgICAgICBmb3IgKGNvbnN0IFtwb3NpdGlvbjMsIGNvbnRdIG9mIERlZXNUb2FzdDIudG9hc3RDb250YWluZXJzLmVudHJpZXMoKSkgewogICAgICAgICAgaWYgKGNvbnQgPT09IGNvbnRhaW5lcikgewogICAgICAgICAgICBEZWVzVG9hc3QyLnRvYXN0Q29udGFpbmVycy5kZWxldGUocG9zaXRpb24zKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJ0eXBlIiwgdGhpcy50eXBlKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNTYoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNUb2FzdDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtbGlzdC9kZWVzLWlucHV0LWxpc3QuZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgZGVtb0Z1bmM0MCA9ICgpID0+IGIyYAogIDxkZWVzLWRlbW93cmFwcGVyPgogICAgPHN0eWxlPgogICAgICAke2lgCiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICAgIG1heC13aWR0aDogMTIwMHB4OwogICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGRlZXMtcGFuZWwgewogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZGVlcy1wYW5lbDpsYXN0LWNoaWxkIHsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5ncmlkLWxheW91dCB7CiAgICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOwogICAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICBAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHsKICAgICAgICAgIC5ncmlkLWxheW91dCB7CiAgICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAub3V0cHV0LXByZXZpZXcgewogICAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAjZjNmNGY2OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgY29sb3I6ICMzNzQxNTE7CiAgICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgfQogICAgICAgIAogICAgICAgIEBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsKICAgICAgICAgIC5vdXRwdXQtcHJldmlldyB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICMyYzJjMmM7CiAgICAgICAgICAgIGNvbG9yOiAjZTRlNGU3OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAuZmVhdHVyZS1ub3RlIHsKICAgICAgICAgIG1hcmdpbi10b3A6IDEycHg7CiAgICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgICAgYmFja2dyb3VuZDogI2VmZjZmZjsKICAgICAgICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgIzNiODJmNjsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIGNvbG9yOiAjMWU0MGFmOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgICAuZmVhdHVyZS1ub3RlIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogIzFlM2E1ZjsKICAgICAgICAgICAgY29sb3I6ICM5M2M1ZmQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBgfQogICAgPC9zdHlsZT4KICAgIAogICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiMS4gQmFzaWMgTGlzdCBJbnB1dCJ9IC5zdWJ0aXRsZT0keyJTaW1wbGUgbGlzdCBtYW5hZ2VtZW50IHdpdGggYWRkLCBlZGl0LCBhbmQgZGVsZXRlIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtbGlzdAogICAgICAgICAgLmxhYmVsPSR7IlNob3BwaW5nIExpc3QifQogICAgICAgICAgLnBsYWNlaG9sZGVyPSR7IkFkZCBpdGVtIHRvIHlvdXIgbGlzdC4uLiJ9CiAgICAgICAgICAudmFsdWU9JHtbIk1pbGsiLCAiQnJlYWQiLCAiRWdncyIsICJDaGVlc2UiXX0KICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJEb3VibGUtY2xpY2sgdG8gZWRpdCBpdGVtcywgb3IgdXNlIHRoZSBlZGl0IGJ1dHRvbiJ9CiAgICAgICAgPjwvZGVlcy1pbnB1dC1saXN0PgogICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtbm90ZSI+CiAgICAgICAgICDwn5KhIERvdWJsZS1jbGljayBhbnkgaXRlbSB0byBxdWlja2x5IGVkaXQgaXQgaW5saW5lCiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyIyLiBTb3J0YWJsZSBMaXN0In0gLnN1YnRpdGxlPSR7IkRyYWcgYW5kIGRyb3AgdG8gcmVvcmRlciBpdGVtcyJ9PgogICAgICAgIDxkZWVzLWlucHV0LWxpc3QKICAgICAgICAgIC5sYWJlbD0keyJUYXNrIFByaW9yaXR5In0KICAgICAgICAgIC5wbGFjZWhvbGRlcj0keyJBZGQgYSB0YXNrLi4uIn0KICAgICAgICAgIC5zb3J0YWJsZT0ke3RydWV9CiAgICAgICAgICAudmFsdWU9JHtbCiAgIlJldmlldyBwdWxsIHJlcXVlc3RzIiwKICAiRml4IGNyaXRpY2FsIGJ1ZyIsCiAgIlVwZGF0ZSBkb2N1bWVudGF0aW9uIiwKICAiRGVwbG95IHRvIHByb2R1Y3Rpb24iLAogICJUZWFtIHN0YW5kdXAgbWVldGluZyIKXX0KICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJEcmFnIGl0ZW1zIHVzaW5nIHRoZSBoYW5kbGUgdG8gcmVvcmRlciB0aGVtIn0KICAgICAgICA+PC9kZWVzLWlucHV0LWxpc3Q+CiAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1ub3RlIj4KICAgICAgICAgIPCflIQgRHJhZyB0aGUgZ3JpcCBoYW5kbGUgdG8gcmVvcmRlciB0YXNrcyBieSBwcmlvcml0eQogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiMy4gVmFsaWRhdGlvbiAmIENvbnN0cmFpbnRzIn0gLnN1YnRpdGxlPSR7Ikxpc3RzIHdpdGggbWluaW11bS9tYXhpbXVtIGl0ZW1zIGFuZCBkdXBsaWNhdGUgcHJldmVudGlvbiJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImdyaWQtbGF5b3V0Ij4KICAgICAgICAgIDxkZWVzLWlucHV0LWxpc3QKICAgICAgICAgICAgLmxhYmVsPSR7IlRlYW0gTWVtYmVycyAoTWluIDIsIE1heCA1KSJ9CiAgICAgICAgICAgIC5wbGFjZWhvbGRlcj0keyJBZGQgdGVhbSBtZW1iZXIuLi4ifQogICAgICAgICAgICAubWluSXRlbXM9JHsyfQogICAgICAgICAgICAubWF4SXRlbXM9JHs1fQogICAgICAgICAgICAudmFsdWU9JHtbIkFsaWNlIiwgIkJvYiJdfQogICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiQWRkIDItNSB0ZWFtIG1lbWJlcnMifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1saXN0PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1saXN0CiAgICAgICAgICAgIC5sYWJlbD0keyJVbmlxdWUgVGFncyAoTm8gRHVwbGljYXRlcykifQogICAgICAgICAgICAucGxhY2Vob2xkZXI9JHsiQWRkIHVuaXF1ZSB0YWcuLi4ifQogICAgICAgICAgICAuYWxsb3dEdXBsaWNhdGVzPSR7ZmFsc2V9CiAgICAgICAgICAgIC52YWx1ZT0ke1siZnJvbnRlbmQiLCAiYmFja2VuZCIsICJkYXRhYmFzZSJdfQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiRHVwbGljYXRlIGl0ZW1zIGFyZSBub3QgYWxsb3dlZCJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWxpc3Q+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI0LiBEZWxldGUgQ29uZmlybWF0aW9uIn0gLnN1YnRpdGxlPSR7IlJlcXVpcmUgY29uZmlybWF0aW9uIGJlZm9yZSBkZWxldGluZyBpdGVtcyJ9PgogICAgICAgIDxkZWVzLWlucHV0LWxpc3QKICAgICAgICAgIC5sYWJlbD0keyJJbXBvcnRhbnQgRG9jdW1lbnRzIn0KICAgICAgICAgIC5wbGFjZWhvbGRlcj0keyJBZGQgZG9jdW1lbnQgbmFtZS4uLiJ9CiAgICAgICAgICAuY29uZmlybURlbGV0ZT0ke3RydWV9CiAgICAgICAgICAudmFsdWU9JHtbCiAgIkNvbnRyYWN0XzIwMjQucGRmIiwKICAiRmluYW5jaWFsX1JlcG9ydF9RMy54bHN4IiwKICAiUHJvamVjdF9Qcm9wb3NhbC5kb2N4IiwKICAiTWVldGluZ19Ob3Rlcy50eHQiCl19CiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiRGVsZXRpb24gcmVxdWlyZXMgY29uZmlybWF0aW9uIGZvciBzYWZldHkifQogICAgICAgID48L2RlZXMtaW5wdXQtbGlzdD4KICAgICAgPC9kZWVzLXBhbmVsPgoKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjUuIERpc2FibGVkIFN0YXRlIn0gLnN1YnRpdGxlPSR7IlJlYWQtb25seSBsaXN0IGRpc3BsYXkifT4KICAgICAgICA8ZGVlcy1pbnB1dC1saXN0CiAgICAgICAgICAubGFiZWw9JHsiU3lzdGVtIERlZmF1bHRzIn0KICAgICAgICAgIC52YWx1ZT0ke1siRGVmYXVsdCBTZXR0aW5nIDEiLCAiRGVmYXVsdCBTZXR0aW5nIDIiLCAiRGVmYXVsdCBTZXR0aW5nIDMiXX0KICAgICAgICAgIC5kaXNhYmxlZD0ke3RydWV9CiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiVGhlc2UgaXRlbXMgY2Fubm90IGJlIG1vZGlmaWVkIn0KICAgICAgICA+PC9kZWVzLWlucHV0LWxpc3Q+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI2LiBGb3JtIEludGVncmF0aW9uIn0gLnN1YnRpdGxlPSR7Ikxpc3QgaW5wdXQgd29ya2luZyB3aXRoaW4gYSBmb3JtIGNvbnRleHQifT4KICAgICAgICA8ZGVlcy1mb3JtPgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dAogICAgICAgICAgICAubGFiZWw9JHsiUmVjaXBlIE5hbWUifQogICAgICAgICAgICAucGxhY2Vob2xkZXI9JHsiTXkgQW1hemluZyBSZWNpcGUifQogICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAua2V5PSR7Im5hbWUifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJncmlkLWxheW91dCI+CiAgICAgICAgICAgIDxkZWVzLWlucHV0LWxpc3QKICAgICAgICAgICAgICAubGFiZWw9JHsiSW5ncmVkaWVudHMifQogICAgICAgICAgICAgIC5wbGFjZWhvbGRlcj0keyJBZGQgaW5ncmVkaWVudC4uLiJ9CiAgICAgICAgICAgICAgLnJlcXVpcmVkPSR7dHJ1ZX0KICAgICAgICAgICAgICAubWluSXRlbXM9JHszfQogICAgICAgICAgICAgIC5rZXk9JHsiaW5ncmVkaWVudHMifQogICAgICAgICAgICAgIC5zb3J0YWJsZT0ke3RydWV9CiAgICAgICAgICAgICAgLnZhbHVlPSR7WwogICIyIGN1cHMgZmxvdXIiLAogICIxIGN1cCBzdWdhciIsCiAgIjMgZWdncyIKXX0KICAgICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiQWRkIGF0IGxlYXN0IDMgaW5ncmVkaWVudHMifQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LWxpc3Q+CiAgICAgICAgICAgIAogICAgICAgICAgICA8ZGVlcy1pbnB1dC1saXN0CiAgICAgICAgICAgICAgLmxhYmVsPSR7Ikluc3RydWN0aW9ucyJ9CiAgICAgICAgICAgICAgLnBsYWNlaG9sZGVyPSR7IkFkZCBpbnN0cnVjdGlvbiBzdGVwLi4uIn0KICAgICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAgIC5taW5JdGVtcz0kezJ9CiAgICAgICAgICAgICAgLmtleT0keyJpbnN0cnVjdGlvbnMifQogICAgICAgICAgICAgIC5zb3J0YWJsZT0ke3RydWV9CiAgICAgICAgICAgICAgLnZhbHVlPSR7WwogICJQcmVoZWF0IG92ZW4gdG8gMzUwXHhCMEYiLAogICJNaXggZHJ5IGluZ3JlZGllbnRzIgpdfQogICAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJBZGQgY29va2luZyBpbnN0cnVjdGlvbnMgaW4gb3JkZXIifQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LWxpc3Q+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dAogICAgICAgICAgICAubGFiZWw9JHsiTm90ZXMifQogICAgICAgICAgICAuaW5wdXRUeXBlPSR7InRleHRhcmVhIn0KICAgICAgICAgICAgLnBsYWNlaG9sZGVyPSR7IkFueSBzcGVjaWFsIG5vdGVzIG9yIHRpcHMuLi4ifQogICAgICAgICAgICAua2V5PSR7Im5vdGVzIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtZm9ybS1zdWJtaXQgLnRleHQ9JHsiU2F2ZSBSZWNpcGUifT48L2RlZXMtZm9ybS1zdWJtaXQ+CiAgICAgICAgPC9kZWVzLWZvcm0+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI3LiBJbnRlcmFjdGl2ZSBEZW1vIn0gLnN1YnRpdGxlPSR7IkJ1aWxkIHlvdXIgb3duIGZlYXR1cmUgbGlzdCBhbmQgc2VlIHRoZSBkYXRhIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtbGlzdAogICAgICAgICAgaWQ9ImludGVyYWN0aXZlLWxpc3QiCiAgICAgICAgICAubGFiZWw9JHsiUHJvZHVjdCBGZWF0dXJlcyJ9CiAgICAgICAgICAucGxhY2Vob2xkZXI9JHsiQWRkIGEgZmVhdHVyZS4uLiJ9CiAgICAgICAgICAuc29ydGFibGU9JHt0cnVlfQogICAgICAgICAgLmNvbmZpcm1EZWxldGU9JHtmYWxzZX0KICAgICAgICAgIC5hbGxvd0R1cGxpY2F0ZXM9JHtmYWxzZX0KICAgICAgICAgIC5tYXhJdGVtcz0kezEwfQogICAgICAgICAgQGNoYW5nZT0keyhlMTEpID0+IHsKICBjb25zdCBwcmV2aWV3ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2xpc3QtanNvbiIpOwogIGlmIChwcmV2aWV3KSB7CiAgICBjb25zdCBkYXRhID0gewogICAgICBpdGVtczogZTExLmRldGFpbC52YWx1ZSwKICAgICAgY291bnQ6IGUxMS5kZXRhaWwudmFsdWUubGVuZ3RoLAogICAgICB0aW1lc3RhbXA6ICgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKQogICAgfTsKICAgIHByZXZpZXcudGV4dENvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTsKICB9Cn19CiAgICAgICAgPjwvZGVlcy1pbnB1dC1saXN0PgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9Im91dHB1dC1wcmV2aWV3IiBpZD0ibGlzdC1qc29uIj4KICAgICAgICAgIHsKICAgICAgICAgICAgIml0ZW1zIjogW10sCiAgICAgICAgICAgICJjb3VudCI6IDAsCiAgICAgICAgICAgICJ0aW1lc3RhbXAiOiAiJHsoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCl9IgogICAgICAgICAgfQogICAgICAgIDwvZGl2PgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtbm90ZSI+CiAgICAgICAgICDinKggQWRkLCBlZGl0LCByZW1vdmUsIGFuZCByZW9yZGVyIGl0ZW1zIHRvIHNlZSB0aGUgSlNPTiBvdXRwdXQgdXBkYXRlIGluIHJlYWwtdGltZQogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiOC4gQWR2YW5jZWQgQ29uZmlndXJhdGlvbiJ9IC5zdWJ0aXRsZT0keyJDb21iaW5lIGFsbCBmZWF0dXJlcyBmb3IgY29tcGxleCB1c2UgY2FzZXMifT4KICAgICAgICA8ZGVlcy1pbnB1dC1saXN0CiAgICAgICAgICAubGFiZWw9JHsiUHJvamVjdCBNaWxlc3RvbmVzIn0KICAgICAgICAgIC5wbGFjZWhvbGRlcj0keyJBZGQgbWlsZXN0b25lLi4uIn0KICAgICAgICAgIC52YWx1ZT0ke1sKICAiUHJvamVjdCBLaWNrb2ZmIC0gV2VlayAxIiwKICAiUmVxdWlyZW1lbnRzIEdhdGhlcmluZyAtIFdlZWsgMi0zIiwKICAiRGVzaWduIFBoYXNlIC0gV2VlayA0LTYiLAogICJEZXZlbG9wbWVudCBTcHJpbnQgMSAtIFdlZWsgNy05IiwKICAiVGVzdGluZyAmIFFBIC0gV2VlayAxMC0xMSIsCiAgIkRlcGxveW1lbnQgLSBXZWVrIDEyIgpdfQogICAgICAgICAgLnNvcnRhYmxlPSR7dHJ1ZX0KICAgICAgICAgIC5jb25maXJtRGVsZXRlPSR7dHJ1ZX0KICAgICAgICAgIC5hbGxvd0R1cGxpY2F0ZXM9JHtmYWxzZX0KICAgICAgICAgIC5taW5JdGVtcz0kezN9CiAgICAgICAgICAubWF4SXRlbXM9JHsxMn0KICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiTWFuYWdlIHByb2plY3QgbWlsZXN0b25lcyAoMy0xMiBpdGVtcywgc29ydGFibGUsIG5vIGR1cGxpY2F0ZXMpIn0KICAgICAgICA+PC9kZWVzLWlucHV0LWxpc3Q+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI5LiBFbXB0eSBTdGF0ZSJ9IC5zdWJ0aXRsZT0keyJIb3cgdGhlIGNvbXBvbmVudCBsb29rcyB3aXRoIG5vIGl0ZW1zIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtbGlzdAogICAgICAgICAgLmxhYmVsPSR7IllvdXIgSWRlYXMifQogICAgICAgICAgLnBsYWNlaG9sZGVyPSR7IlNoYXJlIHlvdXIgaWRlYXMuLi4ifQogICAgICAgICAgLnZhbHVlPSR7W119CiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiU3RhcnQgYWRkaW5nIGl0ZW1zIHRvIGJ1aWxkIHlvdXIgbGlzdCJ9CiAgICAgICAgPjwvZGVlcy1pbnB1dC1saXN0PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2Rpdj4KICA8L2RlZXMtZGVtb3dyYXBwZXI+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1saXN0L2RlZXMtaW5wdXQtbGlzdC5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2RlZXNfaWNvbigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU1NiA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNTcgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNJbnB1dExpc3QgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLWlucHV0LWxpc3QiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0lucHV0QmFzZTsKICBsZXQgX3ZhbHVlX2RlY29yYXRvcnM7CiAgbGV0IF92YWx1ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wbGFjZWhvbGRlcl9kZWNvcmF0b3JzOwogIGxldCBfcGxhY2Vob2xkZXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wbGFjZWhvbGRlcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWF4SXRlbXNfZGVjb3JhdG9yczsKICBsZXQgX21heEl0ZW1zX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWF4SXRlbXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21pbkl0ZW1zX2RlY29yYXRvcnM7CiAgbGV0IF9taW5JdGVtc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21pbkl0ZW1zX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hbGxvd0R1cGxpY2F0ZXNfZGVjb3JhdG9yczsKICBsZXQgX2FsbG93RHVwbGljYXRlc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FsbG93RHVwbGljYXRlc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc29ydGFibGVfZGVjb3JhdG9yczsKICBsZXQgX3NvcnRhYmxlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc29ydGFibGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbmZpcm1EZWxldGVfZGVjb3JhdG9yczsKICBsZXQgX2NvbmZpcm1EZWxldGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb25maXJtRGVsZXRlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWxpZGF0aW9uVGV4dF9kZWNvcmF0b3JzOwogIGxldCBfdmFsaWRhdGlvblRleHRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWxpZGF0aW9uVGV4dF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW5wdXRWYWx1ZV9kZWNvcmF0b3JzOwogIGxldCBfaW5wdXRWYWx1ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lucHV0VmFsdWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2VkaXRpbmdJbmRleF9kZWNvcmF0b3JzOwogIGxldCBfZWRpdGluZ0luZGV4X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZWRpdGluZ0luZGV4X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lZGl0aW5nVmFsdWVfZGVjb3JhdG9yczsKICBsZXQgX2VkaXRpbmdWYWx1ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2VkaXRpbmdWYWx1ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZHJhZ2dlZEluZGV4X2RlY29yYXRvcnM7CiAgbGV0IF9kcmFnZ2VkSW5kZXhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnZ2VkSW5kZXhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RyYWdPdmVySW5kZXhfZGVjb3JhdG9yczsKICBsZXQgX2RyYWdPdmVySW5kZXhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnT3ZlckluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnU3RhcnRZX2RlY29yYXRvcnM7CiAgbGV0IF9kcmFnU3RhcnRZX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZHJhZ1N0YXJ0WV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZHJhZ0N1cnJlbnRZX2RlY29yYXRvcnM7CiAgbGV0IF9kcmFnQ3VycmVudFlfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnQ3VycmVudFlfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RhcmdldEluZGV4X2RlY29yYXRvcnM7CiAgbGV0IF90YXJnZXRJbmRleF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RhcmdldEluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pdGVtSGVpZ2h0X2RlY29yYXRvcnM7CiAgbGV0IF9pdGVtSGVpZ2h0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXRlbUhlaWdodF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW5wdXRMaXN0MiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3ZhbHVlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF9wbGFjZWhvbGRlcl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX21heEl0ZW1zX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfbWluSXRlbXNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF9hbGxvd0R1cGxpY2F0ZXNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfc29ydGFibGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfY29uZmlybURlbGV0ZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF92YWxpZGF0aW9uVGV4dF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2lucHV0VmFsdWVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2VkaXRpbmdJbmRleF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfZWRpdGluZ1ZhbHVlX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9kcmFnZ2VkSW5kZXhfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2RyYWdPdmVySW5kZXhfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2RyYWdTdGFydFlfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2RyYWdDdXJyZW50WV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfdGFyZ2V0SW5kZXhfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2l0ZW1IZWlnaHRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlNTYodGhpcywgbnVsbCwgX3ZhbHVlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZhbHVlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ2YWx1ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai52YWx1ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudmFsdWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nih0aGlzLCBudWxsLCBfcGxhY2Vob2xkZXJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicGxhY2Vob2xkZXIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInBsYWNlaG9sZGVyIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnBsYWNlaG9sZGVyLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5wbGFjZWhvbGRlciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wbGFjZWhvbGRlcl9pbml0aWFsaXplcnMsIF9wbGFjZWhvbGRlcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU2KHRoaXMsIG51bGwsIF9tYXhJdGVtc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtYXhJdGVtcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWF4SXRlbXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWF4SXRlbXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1heEl0ZW1zID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21heEl0ZW1zX2luaXRpYWxpemVycywgX21heEl0ZW1zX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTYodGhpcywgbnVsbCwgX21pbkl0ZW1zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1pbkl0ZW1zIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtaW5JdGVtcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5taW5JdGVtcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWluSXRlbXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWluSXRlbXNfaW5pdGlhbGl6ZXJzLCBfbWluSXRlbXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nih0aGlzLCBudWxsLCBfYWxsb3dEdXBsaWNhdGVzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFsbG93RHVwbGljYXRlcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYWxsb3dEdXBsaWNhdGVzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmFsbG93RHVwbGljYXRlcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYWxsb3dEdXBsaWNhdGVzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FsbG93RHVwbGljYXRlc19pbml0aWFsaXplcnMsIF9hbGxvd0R1cGxpY2F0ZXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nih0aGlzLCBudWxsLCBfc29ydGFibGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic29ydGFibGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNvcnRhYmxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNvcnRhYmxlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zb3J0YWJsZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zb3J0YWJsZV9pbml0aWFsaXplcnMsIF9zb3J0YWJsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU2KHRoaXMsIG51bGwsIF9jb25maXJtRGVsZXRlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNvbmZpcm1EZWxldGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNvbmZpcm1EZWxldGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29uZmlybURlbGV0ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY29uZmlybURlbGV0ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jb25maXJtRGVsZXRlX2luaXRpYWxpemVycywgX2NvbmZpcm1EZWxldGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nih0aGlzLCBudWxsLCBfdmFsaWRhdGlvblRleHRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmFsaWRhdGlvblRleHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInZhbGlkYXRpb25UZXh0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZhbGlkYXRpb25UZXh0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52YWxpZGF0aW9uVGV4dCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF92YWxpZGF0aW9uVGV4dF9pbml0aWFsaXplcnMsIF92YWxpZGF0aW9uVGV4dF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU2KHRoaXMsIG51bGwsIF9pbnB1dFZhbHVlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlucHV0VmFsdWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImlucHV0VmFsdWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaW5wdXRWYWx1ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaW5wdXRWYWx1ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pbnB1dFZhbHVlX2luaXRpYWxpemVycywgX2lucHV0VmFsdWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nih0aGlzLCBudWxsLCBfZWRpdGluZ0luZGV4X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImVkaXRpbmdJbmRleCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZWRpdGluZ0luZGV4IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmVkaXRpbmdJbmRleCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZWRpdGluZ0luZGV4ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2VkaXRpbmdJbmRleF9pbml0aWFsaXplcnMsIF9lZGl0aW5nSW5kZXhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nih0aGlzLCBudWxsLCBfZWRpdGluZ1ZhbHVlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImVkaXRpbmdWYWx1ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZWRpdGluZ1ZhbHVlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmVkaXRpbmdWYWx1ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZWRpdGluZ1ZhbHVlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2VkaXRpbmdWYWx1ZV9pbml0aWFsaXplcnMsIF9lZGl0aW5nVmFsdWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nih0aGlzLCBudWxsLCBfZHJhZ2dlZEluZGV4X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImRyYWdnZWRJbmRleCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZHJhZ2dlZEluZGV4IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRyYWdnZWRJbmRleCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZHJhZ2dlZEluZGV4ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2RyYWdnZWRJbmRleF9pbml0aWFsaXplcnMsIF9kcmFnZ2VkSW5kZXhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nih0aGlzLCBudWxsLCBfZHJhZ092ZXJJbmRleF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkcmFnT3ZlckluZGV4Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkcmFnT3ZlckluZGV4IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRyYWdPdmVySW5kZXgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmRyYWdPdmVySW5kZXggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZHJhZ092ZXJJbmRleF9pbml0aWFsaXplcnMsIF9kcmFnT3ZlckluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTYodGhpcywgbnVsbCwgX2RyYWdTdGFydFlfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZHJhZ1N0YXJ0WSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZHJhZ1N0YXJ0WSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5kcmFnU3RhcnRZLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kcmFnU3RhcnRZID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2RyYWdTdGFydFlfaW5pdGlhbGl6ZXJzLCBfZHJhZ1N0YXJ0WV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU2KHRoaXMsIG51bGwsIF9kcmFnQ3VycmVudFlfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZHJhZ0N1cnJlbnRZIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkcmFnQ3VycmVudFkiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZHJhZ0N1cnJlbnRZLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kcmFnQ3VycmVudFkgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZHJhZ0N1cnJlbnRZX2luaXRpYWxpemVycywgX2RyYWdDdXJyZW50WV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU2KHRoaXMsIG51bGwsIF90YXJnZXRJbmRleF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0YXJnZXRJbmRleCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGFyZ2V0SW5kZXgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudGFyZ2V0SW5kZXgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnRhcmdldEluZGV4ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3RhcmdldEluZGV4X2luaXRpYWxpemVycywgX3RhcmdldEluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTYodGhpcywgbnVsbCwgX2l0ZW1IZWlnaHRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXRlbUhlaWdodCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXRlbUhlaWdodCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pdGVtSGVpZ2h0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pdGVtSGVpZ2h0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2l0ZW1IZWlnaHRfaW5pdGlhbGl6ZXJzLCBfaXRlbUhlaWdodF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU2KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0lucHV0TGlzdDIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgLy8gU1RBVElDCiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jNDA7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiSW5wdXQiXTsKICAgICN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM1Nyh0aGlzLCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCBbXSk7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IHZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy4jdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB2YWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNwbGFjZWhvbGRlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTcodGhpcywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1Nyh0aGlzLCBfcGxhY2Vob2xkZXJfaW5pdGlhbGl6ZXJzLCAiQWRkIG5ldyBpdGVtLi4uIikpOwogICAgZ2V0IHBsYWNlaG9sZGVyKCkgewogICAgICByZXR1cm4gdGhpcy4jcGxhY2Vob2xkZXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwbGFjZWhvbGRlcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jcGxhY2Vob2xkZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtYXhJdGVtc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTcodGhpcywgX3BsYWNlaG9sZGVyX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1Nyh0aGlzLCBfbWF4SXRlbXNfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgbWF4SXRlbXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtYXhJdGVtc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgLy8gMCBtZWFucyB1bmxpbWl0ZWQKICAgIHNldCBtYXhJdGVtcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWF4SXRlbXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtaW5JdGVtc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTcodGhpcywgX21heEl0ZW1zX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1Nyh0aGlzLCBfbWluSXRlbXNfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgbWluSXRlbXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtaW5JdGVtc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1pbkl0ZW1zKHZhbHVlMikgewogICAgICB0aGlzLiNtaW5JdGVtc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2FsbG93RHVwbGljYXRlc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTcodGhpcywgX21pbkl0ZW1zX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1Nyh0aGlzLCBfYWxsb3dEdXBsaWNhdGVzX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBhbGxvd0R1cGxpY2F0ZXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhbGxvd0R1cGxpY2F0ZXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhbGxvd0R1cGxpY2F0ZXModmFsdWUyKSB7CiAgICAgIHRoaXMuI2FsbG93RHVwbGljYXRlc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NvcnRhYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1Nyh0aGlzLCBfYWxsb3dEdXBsaWNhdGVzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1Nyh0aGlzLCBfc29ydGFibGVfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHNvcnRhYmxlKCkgewogICAgICByZXR1cm4gdGhpcy4jc29ydGFibGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzb3J0YWJsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc29ydGFibGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjb25maXJtRGVsZXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1Nyh0aGlzLCBfc29ydGFibGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU3KHRoaXMsIF9jb25maXJtRGVsZXRlX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBjb25maXJtRGVsZXRlKCkgewogICAgICByZXR1cm4gdGhpcy4jY29uZmlybURlbGV0ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNvbmZpcm1EZWxldGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2NvbmZpcm1EZWxldGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN2YWxpZGF0aW9uVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTcodGhpcywgX2NvbmZpcm1EZWxldGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU3KHRoaXMsIF92YWxpZGF0aW9uVGV4dF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgdmFsaWRhdGlvblRleHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWxpZGF0aW9uVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbGlkYXRpb25UZXh0KHZhbHVlMikgewogICAgICB0aGlzLiN2YWxpZGF0aW9uVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lucHV0VmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU3KHRoaXMsIF92YWxpZGF0aW9uVGV4dF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTcodGhpcywgX2lucHV0VmFsdWVfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGlucHV0VmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpbnB1dFZhbHVlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaW5wdXRWYWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaW5wdXRWYWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2VkaXRpbmdJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTcodGhpcywgX2lucHV0VmFsdWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU3KHRoaXMsIF9lZGl0aW5nSW5kZXhfaW5pdGlhbGl6ZXJzLCAtMSkpOwogICAgZ2V0IGVkaXRpbmdJbmRleCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2VkaXRpbmdJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGVkaXRpbmdJbmRleCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZWRpdGluZ0luZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZWRpdGluZ1ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1Nyh0aGlzLCBfZWRpdGluZ0luZGV4X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1Nyh0aGlzLCBfZWRpdGluZ1ZhbHVlX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBlZGl0aW5nVmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNlZGl0aW5nVmFsdWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBlZGl0aW5nVmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2VkaXRpbmdWYWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2RyYWdnZWRJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTcodGhpcywgX2VkaXRpbmdWYWx1ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTcodGhpcywgX2RyYWdnZWRJbmRleF9pbml0aWFsaXplcnMsIC0xKSk7CiAgICBnZXQgZHJhZ2dlZEluZGV4KCkgewogICAgICByZXR1cm4gdGhpcy4jZHJhZ2dlZEluZGV4X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZHJhZ2dlZEluZGV4KHZhbHVlMikgewogICAgICB0aGlzLiNkcmFnZ2VkSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNkcmFnT3ZlckluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1Nyh0aGlzLCBfZHJhZ2dlZEluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1Nyh0aGlzLCBfZHJhZ092ZXJJbmRleF9pbml0aWFsaXplcnMsIC0xKSk7CiAgICBnZXQgZHJhZ092ZXJJbmRleCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2RyYWdPdmVySW5kZXhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkcmFnT3ZlckluZGV4KHZhbHVlMikgewogICAgICB0aGlzLiNkcmFnT3ZlckluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZHJhZ1N0YXJ0WV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTcodGhpcywgX2RyYWdPdmVySW5kZXhfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU3KHRoaXMsIF9kcmFnU3RhcnRZX2luaXRpYWxpemVycywgMCkpOwogICAgLy8gRW5oYW5jZWQgZHJhZyBzdGF0ZSBmb3IgaW50ZXJhY3RpdmUgcmVvcmRlcmluZwogICAgZ2V0IGRyYWdTdGFydFkoKSB7CiAgICAgIHJldHVybiB0aGlzLiNkcmFnU3RhcnRZX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZHJhZ1N0YXJ0WSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZHJhZ1N0YXJ0WV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2RyYWdDdXJyZW50WV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTcodGhpcywgX2RyYWdTdGFydFlfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU3KHRoaXMsIF9kcmFnQ3VycmVudFlfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgZHJhZ0N1cnJlbnRZKCkgewogICAgICByZXR1cm4gdGhpcy4jZHJhZ0N1cnJlbnRZX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZHJhZ0N1cnJlbnRZKHZhbHVlMikgewogICAgICB0aGlzLiNkcmFnQ3VycmVudFlfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN0YXJnZXRJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTcodGhpcywgX2RyYWdDdXJyZW50WV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTcodGhpcywgX3RhcmdldEluZGV4X2luaXRpYWxpemVycywgLTEpKTsKICAgIGdldCB0YXJnZXRJbmRleCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RhcmdldEluZGV4X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdGFyZ2V0SW5kZXgodmFsdWUyKSB7CiAgICAgIHRoaXMuI3RhcmdldEluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXRlbUhlaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTcodGhpcywgX3RhcmdldEluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1Nyh0aGlzLCBfaXRlbUhlaWdodF9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBpdGVtSGVpZ2h0KCkgewogICAgICByZXR1cm4gdGhpcy4jaXRlbUhlaWdodF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGl0ZW1IZWlnaHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2l0ZW1IZWlnaHRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIC8vIEJvdW5kIGV2ZW50IGhhbmRsZXJzIGZvciBjbGVhbnVwCiAgICBib3VuZEhhbmRsZUdsb2JhbERyYWdPdmVyID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTcodGhpcywgX2l0ZW1IZWlnaHRfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgIGJvdW5kSGFuZGxlR2xvYmFsRHJhZ0VuZCA9IG51bGw7CiAgICAvLyBTdG9yZSBvcmlnaW5hbCBpdGVtIHBvc2l0aW9ucyBmb3IgYWNjdXJhdGUgaGl0IGRldGVjdGlvbiAoYmVmb3JlIHRyYW5zZm9ybXMpCiAgICBvcmlnaW5hbEl0ZW1SZWN0cyA9IFtdOwogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICAuLi5EZWVzSW5wdXRCYXNlLmJhc2VTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsICdSb2JvdG8nLCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuaW5wdXQtd3JhcHBlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5saXN0LWNvbnRhaW5lciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDMuOSUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICB9CgogICAgICAubGlzdC1jb250YWluZXI6aG92ZXI6bm90KC5kaXNhYmxlZCkgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDc5LjglKSIsICJoc2woMCAwJSAyMC45JSkiKX07CiAgICAgIH0KCiAgICAgIC5saXN0LWNvbnRhaW5lcjpmb2N1cy13aXRoaW4gewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA1MS4yJSkiLCAiaHNsKDIxNy4yIDkxLjIlIDU5LjglKSIpfTsKICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA1MS4yJSAvIDAuMSkiLCAiaHNsKDIxNy4yIDkxLjIlIDU5LjglIC8gMC4xKSIpfTsKICAgICAgfQoKICAgICAgLmxpc3QtY29udGFpbmVyLmRpc2FibGVkIHsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgfQoKICAgICAgLmxpc3QtaXRlbXMgewogICAgICAgIG1heC1oZWlnaHQ6IDQwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5saXN0LWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSAzLjklKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycyBlYXNlLCBiYWNrZ3JvdW5kIDAuMTVzIGVhc2UsIGJveC1zaGFkb3cgMC4xNXMgZWFzZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsgLyogUHJldmVudCBhbmltYXRpb24gZnJvbSBhZmZlY3Rpbmcgc2Nyb2xsIGJvdW5kcyAqLwogICAgICB9CgogICAgICAubGlzdC1pdGVtOmxhc3Qtb2YtdHlwZSB7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgICAgfQoKICAgICAgLmxpc3QtaXRlbXM6bm90KC5pcy1kcmFnZ2luZykgLmxpc3QtaXRlbTpob3Zlcjpub3QoLmRpc2FibGVkKSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk3LjUlKSIsICJoc2woMCAwJSA2LjklKSIpfTsKICAgICAgfQoKICAgICAgLyogRHJhZ2dpbmcgaXRlbSAtIGZvbGxvd3MgY3Vyc29yICovCiAgICAgIC5saXN0LWl0ZW0uZHJhZ2dpbmcgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB6LWluZGV4OiAxMDA7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk4JSkiLCAiaHNsKDIxNSAyMC4yJSAxMiUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDEycHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4xNSkiLCAicmdiYSgwLCAwLCAwLCAwLjQpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuMTVzIGVhc2UsIGJhY2tncm91bmQgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLyogSXRlbXMgdGhhdCBuZWVkIHRvIG1vdmUgdXAgdG8gbWFrZSBzcGFjZSAqLwogICAgICAubGlzdC1pdGVtLm1vdmUtdXAgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWShjYWxjKC0xICogdmFyKC0taXRlbS1oZWlnaHQsIDQ4cHgpKSk7CiAgICAgIH0KCiAgICAgIC8qIEl0ZW1zIHRoYXQgbmVlZCB0byBtb3ZlIGRvd24gdG8gbWFrZSBzcGFjZSAqLwogICAgICAubGlzdC1pdGVtLm1vdmUtZG93biB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKHZhcigtLWl0ZW0taGVpZ2h0LCA0OHB4KSk7CiAgICAgIH0KCgogICAgICAuZHJhZy1oYW5kbGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBjdXJzb3I6IG1vdmU7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA2My45JSkiLCAiaHNsKDAgMCUgNDUuMSUpIil9OwogICAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5kcmFnLWhhbmRsZTpob3ZlciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NS4xJSkiLCAiaHNsKDAgMCUgNjMuOSUpIil9OwogICAgICB9CgogICAgICAuZHJhZy1oYW5kbGUgZGVlcy1pY29uIHsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5pdGVtLWNvbnRlbnQgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgfQoKICAgICAgLml0ZW0tdGV4dCB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgICB9CgogICAgICAuaXRlbS1lZGl0LWlucHV0IHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSA5JSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA1MS4yJSkiLCAiaHNsKDIxNy4yIDkxLjIlIDU5LjglKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICB9CgogICAgICAuaXRlbS1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogNHB4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDI4cHg7CiAgICAgICAgaGVpZ2h0OiAyOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDUuMSUpIiwgImhzbCgwIDAlIDYzLjklKSIpfTsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idXR0b246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NS4xJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk1JSkiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uLnNhdmUgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlKSIsICJoc2woMTQyLjEgNzAuNiUgNDUuMyUpIil9OwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbi5zYXZlOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlIC8gMC4xKSIsICJoc2woMTQyLjEgNzAuNiUgNDUuMyUgLyAwLjEpIil9OwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbi5jYW5jZWwgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzIuMiUgNTAuNiUpIiwgImhzbCgwIDYyLjglIDUwLjYlKSIpfTsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idXR0b24uY2FuY2VsOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzIuMiUgNTAuNiUgLyAwLjEpIiwgImhzbCgwIDYyLjglIDUwLjYlIC8gMC4xKSIpfTsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idXR0b24uZGVsZXRlIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcyLjIlIDUwLjYlKSIsICJoc2woMCA2Mi44JSA1MC42JSkiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uLmRlbGV0ZTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcyLjIlIDUwLjYlIC8gMC4xKSIsICJoc2woMCA2Mi44JSA1MC42JSAvIDAuMSkiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uIGRlZXMtaWNvbiB7CiAgICAgICAgd2lkdGg6IDE0cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICB9CgogICAgICAuYWRkLWl0ZW0tY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHBhZGRpbmc6IDEycHggMTZweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTcuNSUpIiwgImhzbCgwIDAlIDYuOSUpIil9OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgfQoKICAgICAgLmFkZC1pbnB1dCB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDklKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICB9CgogICAgICAuYWRkLWlucHV0OmZvY3VzIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgNTEuMiUpIiwgImhzbCgyMTcuMiA5MS4yJSA1OS44JSkiKX07CiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgM3B4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgNTEuMiUgLyAwLjEpIiwgImhzbCgyMTcuMiA5MS4yJSA1OS44JSAvIDAuMSkiKX07CiAgICAgIH0KCiAgICAgIC5hZGQtaW5wdXQ6OnBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDYzLjklKSIsICJoc2woMCAwJSA0NS4xJSkiKX07CiAgICAgIH0KCiAgICAgIC5hZGQtaW5wdXQ6ZGlzYWJsZWQgewogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAuYWRkLWJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZSB7CiAgICAgICAgcGFkZGluZzogMzJweCAxNnB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDYzLjklKSIsICJoc2woMCAwJSA0NS4xJSkiKX07CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQoKICAgICAgLnZhbGlkYXRpb24tbWVzc2FnZSB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA3Mi4yJSA1MC42JSkiLCAiaHNsKDAgNjIuOCUgMzAuNiUpIil9OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiA2cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgfQoKICAgICAgLmRlc2NyaXB0aW9uIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA1Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA1NS4xJSkiKX07CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIG1hcmdpbi10b3A6IDZweDsKICAgICAgICBsaW5lLWhlaWdodDogMS41OwogICAgICB9CgogICAgICAvKiBTY3JvbGxiYXIgc3R5bGluZyAqLwogICAgICAubGlzdC1pdGVtczo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIHdpZHRoOiA4cHg7CiAgICAgIH0KCiAgICAgIC5saXN0LWl0ZW1zOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC5saXN0LWl0ZW1zOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAyNC45JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICB9CgogICAgICAubGlzdC1pdGVtczo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA3OS44JSkiLCAiaHNsKDAgMCUgMzQuOSUpIil9OwogICAgICB9CgogICAgICAvKiBEaXNhYmxlIHRyYW5zaXRpb25zIGR1cmluZyBkcm9wIHRvIHByZXZlbnQgZmxhc2ggKi8KICAgICAgLmxpc3QtaXRlbXMuZHJvcHBpbmcgLmxpc3QtaXRlbSB7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImlucHV0LXdyYXBwZXIiPgogICAgICAgICR7dGhpcy5sYWJlbCA/IGIyYDxkZWVzLWxhYmVsIC5sYWJlbD0ke3RoaXMubGFiZWx9IC5yZXF1aXJlZD0ke3RoaXMucmVxdWlyZWR9PjwvZGVlcy1sYWJlbD5gIDogIiJ9CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0ibGlzdC1jb250YWluZXIgJHt0aGlzLmRpc2FibGVkID8gImRpc2FibGVkIiA6ICIifSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaXN0LWl0ZW1zIj4KICAgICAgICAgICAgJHt0aGlzLnZhbHVlLmxlbmd0aCA+IDAgPyB0aGlzLnZhbHVlLm1hcCgoaXRlbSwgaW5kZXgyKSA9PiBiMmAKICAgICAgICAgICAgICA8ZGl2CiAgICAgICAgICAgICAgICBjbGFzcz0ibGlzdC1pdGVtICR7dGhpcy5kcmFnZ2VkSW5kZXggPT09IGluZGV4MiA/ICJkcmFnZ2luZyIgOiAiIn0iCiAgICAgICAgICAgICAgICBkcmFnZ2FibGU9IiR7dGhpcy5zb3J0YWJsZSAmJiAhdGhpcy5kaXNhYmxlZH0iCiAgICAgICAgICAgICAgICBAZHJhZ3N0YXJ0PSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVEcmFnU3RhcnQoZTExLCBpbmRleDIpfQogICAgICAgICAgICAgICAgQGRyYWdlbmQ9JHt0aGlzLmhhbmRsZURyYWdFbmR9CiAgICAgICAgICAgICAgICBAZHJhZ292ZXI9JHsoZTExKSA9PiB0aGlzLmhhbmRsZURyYWdPdmVyKGUxMSwgaW5kZXgyKX0KICAgICAgICAgICAgICAgIEBkcm9wPSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVEcm9wKGUxMSwgaW5kZXgyKX0KICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAke3RoaXMuc29ydGFibGUgJiYgIXRoaXMuZGlzYWJsZWQgPyBiMmAKICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZHJhZy1oYW5kbGUiPgogICAgICAgICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOmdyaXBWZXJ0aWNhbCJ9PjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgJHt0aGlzLmVkaXRpbmdJbmRleCA9PT0gaW5kZXgyID8gYjJgCiAgICAgICAgICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Iml0ZW0tZWRpdC1pbnB1dCIKICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZT0ke3RoaXMuZWRpdGluZ1ZhbHVlfQogICAgICAgICAgICAgICAgICAgICAgQGlucHV0PSR7KGUxMSkgPT4gdGhpcy5lZGl0aW5nVmFsdWUgPSBlMTEudGFyZ2V0LnZhbHVlfQogICAgICAgICAgICAgICAgICAgICAgQGtleWRvd249JHsoZTExKSA9PiB0aGlzLmhhbmRsZUVkaXRLZXlEb3duKGUxMSwgaW5kZXgyKX0KICAgICAgICAgICAgICAgICAgICAgIEBibHVyPSR7KCkgPT4gdGhpcy5zYXZlRWRpdChpbmRleDIpfQogICAgICAgICAgICAgICAgICAgIC8+CiAgICAgICAgICAgICAgICAgIGAgOiBiMmAKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpdGVtLXRleHQiIEBkYmxjbGljaz0keygpID0+ICF0aGlzLmRpc2FibGVkICYmIHRoaXMuc3RhcnRFZGl0KGluZGV4Mil9PgogICAgICAgICAgICAgICAgICAgICAgJHtpdGVtfQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICBgfQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Iml0ZW0tYWN0aW9ucyI+CiAgICAgICAgICAgICAgICAgICR7dGhpcy5lZGl0aW5nSW5kZXggPT09IGluZGV4MiA/IGIyYAogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImFjdGlvbi1idXR0b24gc2F2ZSIgQGNsaWNrPSR7KCkgPT4gdGhpcy5zYXZlRWRpdChpbmRleDIpfT4KICAgICAgICAgICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOmNoZWNrIn0+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWN0aW9uLWJ1dHRvbiBjYW5jZWwiIEBjbGljaz0keygpID0+IHRoaXMuY2FuY2VsRWRpdCgpfT4KICAgICAgICAgICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOngifT48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgYCA6IGIyYAogICAgICAgICAgICAgICAgICAgICR7IXRoaXMuZGlzYWJsZWQgPyBiMmAKICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImFjdGlvbi1idXR0b24iIEBjbGljaz0keygpID0+IHRoaXMuc3RhcnRFZGl0KGluZGV4Mil9PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTpwZW5jaWwifT48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWN0aW9uLWJ1dHRvbiBkZWxldGUiIEBjbGljaz0keygpID0+IHRoaXMucmVtb3ZlSXRlbShpbmRleDIpfT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6dHJhc2gyIn0+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgICAgICAgIGB9CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYCkgOiBiMmAKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+CiAgICAgICAgICAgICAgICBObyBpdGVtcyBhZGRlZCB5ZXQKICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYH0KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgCiAgICAgICAgICAkeyF0aGlzLmRpc2FibGVkICYmICghdGhpcy5tYXhJdGVtcyB8fCB0aGlzLnZhbHVlLmxlbmd0aCA8IHRoaXMubWF4SXRlbXMpID8gYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFkZC1pdGVtLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IgogICAgICAgICAgICAgICAgY2xhc3M9ImFkZC1pbnB1dCIKICAgICAgICAgICAgICAgIC5wbGFjZWhvbGRlcj0ke3RoaXMucGxhY2Vob2xkZXJ9CiAgICAgICAgICAgICAgICAudmFsdWU9JHt0aGlzLmlucHV0VmFsdWV9CiAgICAgICAgICAgICAgICBAaW5wdXQ9JHt0aGlzLmhhbmRsZUlucHV0fQogICAgICAgICAgICAgICAgQGtleWRvd249JHt0aGlzLmhhbmRsZUFkZEtleURvd259CiAgICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHt0aGlzLmRpc2FibGVkfQogICAgICAgICAgICAgIC8+CiAgICAgICAgICAgICAgPGRlZXMtYnV0dG9uCiAgICAgICAgICAgICAgICBjbGFzcz0iYWRkLWJ1dHRvbiIKICAgICAgICAgICAgICAgIEBjbGljaz0ke3RoaXMuYWRkSXRlbX0KICAgICAgICAgICAgICAgID9kaXNhYmxlZD0keyF0aGlzLmlucHV0VmFsdWUudHJpbSgpfQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOnBsdXMifT48L2RlZXMtaWNvbj4gQWRkCiAgICAgICAgICAgICAgPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgIDogIiJ9CiAgICAgICAgPC9kaXY+CgogICAgICAgICR7dGhpcy52YWxpZGF0aW9uVGV4dCA/IGIyYAogICAgICAgICAgPGRpdiBjbGFzcz0idmFsaWRhdGlvbi1tZXNzYWdlIj4ke3RoaXMudmFsaWRhdGlvblRleHR9PC9kaXY+CiAgICAgICAgYCA6ICIifQogICAgICAgIAogICAgICAgICR7dGhpcy5kZXNjcmlwdGlvbiA/IGIyYAogICAgICAgICAgPGRpdiBjbGFzcz0iZGVzY3JpcHRpb24iPiR7dGhpcy5kZXNjcmlwdGlvbn08L2Rpdj4KICAgICAgICBgIDogIiJ9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGhhbmRsZUlucHV0KGUxMSkgewogICAgICB0aGlzLmlucHV0VmFsdWUgPSBlMTEudGFyZ2V0LnZhbHVlOwogICAgfQogICAgaGFuZGxlQWRkS2V5RG93bihlMTEpIHsKICAgICAgaWYgKGUxMS5rZXkgPT09ICJFbnRlciIgJiYgdGhpcy5pbnB1dFZhbHVlLnRyaW0oKSkgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMuYWRkSXRlbSgpOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVFZGl0S2V5RG93bihlMTEsIGluZGV4MikgewogICAgICBpZiAoZTExLmtleSA9PT0gIkVudGVyIikgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMuc2F2ZUVkaXQoaW5kZXgyKTsKICAgICAgfSBlbHNlIGlmIChlMTEua2V5ID09PSAiRXNjYXBlIikgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMuY2FuY2VsRWRpdCgpOwogICAgICB9CiAgICB9CiAgICBhZGRJdGVtKCkgewogICAgICBjb25zdCB0cmltbWVkVmFsdWUgPSB0aGlzLmlucHV0VmFsdWUudHJpbSgpOwogICAgICBpZiAoIXRyaW1tZWRWYWx1ZSkKICAgICAgICByZXR1cm47CiAgICAgIGlmICghdGhpcy5hbGxvd0R1cGxpY2F0ZXMgJiYgdGhpcy52YWx1ZS5pbmNsdWRlcyh0cmltbWVkVmFsdWUpKSB7CiAgICAgICAgdGhpcy52YWxpZGF0aW9uVGV4dCA9ICJUaGlzIGl0ZW0gYWxyZWFkeSBleGlzdHMgaW4gdGhlIGxpc3QiOwogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy52YWxpZGF0aW9uVGV4dCA9ICIiLCAzZTMpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAodGhpcy5tYXhJdGVtcyAmJiB0aGlzLnZhbHVlLmxlbmd0aCA+PSB0aGlzLm1heEl0ZW1zKSB7CiAgICAgICAgdGhpcy52YWxpZGF0aW9uVGV4dCA9IGBNYXhpbXVtICR7dGhpcy5tYXhJdGVtc30gaXRlbXMgYWxsb3dlZGA7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnZhbGlkYXRpb25UZXh0ID0gIiIsIDNlMyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMudmFsdWUgPSBbLi4udGhpcy52YWx1ZSwgdHJpbW1lZFZhbHVlXTsKICAgICAgdGhpcy5pbnB1dFZhbHVlID0gIiI7CiAgICAgIHRoaXMudmFsaWRhdGlvblRleHQgPSAiIjsKICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5hZGQtaW5wdXQiKTsKICAgICAgaWYgKGlucHV0KSB7CiAgICAgICAgaW5wdXQudmFsdWUgPSAiIjsKICAgICAgICBpbnB1dC5mb2N1cygpOwogICAgICB9CiAgICAgIHRoaXMuZW1pdENoYW5nZSgpOwogICAgfQogICAgc3RhcnRFZGl0KGluZGV4MikgewogICAgICB0aGlzLmVkaXRpbmdJbmRleCA9IGluZGV4MjsKICAgICAgdGhpcy5lZGl0aW5nVmFsdWUgPSB0aGlzLnZhbHVlW2luZGV4Ml07CiAgICAgIHRoaXMudXBkYXRlQ29tcGxldGUudGhlbigoKSA9PiB7CiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5pdGVtLWVkaXQtaW5wdXQiKTsKICAgICAgICBpZiAoaW5wdXQpIHsKICAgICAgICAgIGlucHV0LmZvY3VzKCk7CiAgICAgICAgICBpbnB1dC5zZWxlY3QoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgc2F2ZUVkaXQoaW5kZXgyKSB7CiAgICAgIGNvbnN0IHRyaW1tZWRWYWx1ZSA9IHRoaXMuZWRpdGluZ1ZhbHVlLnRyaW0oKTsKICAgICAgaWYgKCF0cmltbWVkVmFsdWUpIHsKICAgICAgICB0aGlzLmNhbmNlbEVkaXQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCF0aGlzLmFsbG93RHVwbGljYXRlcyAmJiB0cmltbWVkVmFsdWUgIT09IHRoaXMudmFsdWVbaW5kZXgyXSAmJiB0aGlzLnZhbHVlLmluY2x1ZGVzKHRyaW1tZWRWYWx1ZSkpIHsKICAgICAgICB0aGlzLnZhbGlkYXRpb25UZXh0ID0gIlRoaXMgaXRlbSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbGlzdCI7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnZhbGlkYXRpb25UZXh0ID0gIiIsIDNlMyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gWy4uLnRoaXMudmFsdWVdOwogICAgICBuZXdWYWx1ZVtpbmRleDJdID0gdHJpbW1lZFZhbHVlOwogICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7CiAgICAgIHRoaXMuZWRpdGluZ0luZGV4ID0gLTE7CiAgICAgIHRoaXMuZWRpdGluZ1ZhbHVlID0gIiI7CiAgICAgIHRoaXMudmFsaWRhdGlvblRleHQgPSAiIjsKICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7CiAgICB9CiAgICBjYW5jZWxFZGl0KCkgewogICAgICB0aGlzLmVkaXRpbmdJbmRleCA9IC0xOwogICAgICB0aGlzLmVkaXRpbmdWYWx1ZSA9ICIiOwogICAgfQogICAgYXN5bmMgcmVtb3ZlSXRlbShpbmRleDIpIHsKICAgICAgaWYgKHRoaXMuY29uZmlybURlbGV0ZSkgewogICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMuc2hvd0NvbmZpcm1EaWFsb2coYERlbGV0ZSAiJHt0aGlzLnZhbHVlW2luZGV4Ml19Ij9gKTsKICAgICAgICBpZiAoIWNvbmZpcm1lZCkKICAgICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIoKF80LCBpMTEpID0+IGkxMSAhPT0gaW5kZXgyKTsKICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7CiAgICB9CiAgICBhc3luYyBzaG93Q29uZmlybURpYWxvZyhtZXNzYWdlMikgewogICAgICByZXR1cm4gY29uZmlybShtZXNzYWdlMik7CiAgICB9CiAgICAvLyBEcmFnIGFuZCBkcm9wIGhhbmRsZXJzIC0gSW50ZXJhY3RpdmUgaW1wbGVtZW50YXRpb24KICAgIGhhbmRsZURyYWdTdGFydChlMTEsIGluZGV4MikgewogICAgICBpZiAoIXRoaXMuc29ydGFibGUgfHwgdGhpcy5kaXNhYmxlZCkKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gaW5kZXgyOwogICAgICB0aGlzLnRhcmdldEluZGV4ID0gaW5kZXgyOwogICAgICBlMTEuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAibW92ZSI7CiAgICAgIGUxMS5kYXRhVHJhbnNmZXIuc2V0RGF0YSgidGV4dC9wbGFpbiIsIGluZGV4Mi50b1N0cmluZygpKTsKICAgICAgY29uc3QgZW1wdHlJbWcgPSBuZXcgSW1hZ2UoKTsKICAgICAgZW1wdHlJbWcuc3JjID0gImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBSUFBQUFVRUJBQUFBQ3dBQUFBQUFRQUJBQUFDQWtRQkFEcz0iOwogICAgICBlMTEuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZShlbXB0eUltZywgMCwgMCk7CiAgICAgIHRoaXMuZHJhZ1N0YXJ0WSA9IGUxMS5jbGllbnRZOwogICAgICB0aGlzLmRyYWdDdXJyZW50WSA9IGUxMS5jbGllbnRZOwogICAgICBjb25zdCBsaXN0SXRlbXMgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5saXN0LWl0ZW1zIik7CiAgICAgIGNvbnN0IGFsbEl0ZW1zID0gQXJyYXkuZnJvbShsaXN0SXRlbXM/LnF1ZXJ5U2VsZWN0b3JBbGwoIi5saXN0LWl0ZW0iKSB8fCBbXSk7CiAgICAgIGlmIChhbGxJdGVtc1tpbmRleDJdKSB7CiAgICAgICAgdGhpcy5pdGVtSGVpZ2h0ID0gYWxsSXRlbXNbaW5kZXgyXS5vZmZzZXRIZWlnaHQ7CiAgICAgIH0KICAgICAgdGhpcy5vcmlnaW5hbEl0ZW1SZWN0cyA9IGFsbEl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7CiAgICAgIGxpc3RJdGVtcz8uY2xhc3NMaXN0LmFkZCgiaXMtZHJhZ2dpbmciKTsKICAgICAgdGhpcy5ib3VuZEhhbmRsZUdsb2JhbERyYWdPdmVyID0gdGhpcy5oYW5kbGVHbG9iYWxEcmFnT3Zlci5iaW5kKHRoaXMpOwogICAgICB0aGlzLmJvdW5kSGFuZGxlR2xvYmFsRHJhZ0VuZCA9IHRoaXMuaGFuZGxlR2xvYmFsRHJhZ0VuZC5iaW5kKHRoaXMpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJkcmFnb3ZlciIsIHRoaXMuYm91bmRIYW5kbGVHbG9iYWxEcmFnT3Zlcik7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRyYWdlbmQiLCB0aGlzLmJvdW5kSGFuZGxlR2xvYmFsRHJhZ0VuZCk7CiAgICB9CiAgICBoYW5kbGVHbG9iYWxEcmFnT3ZlcihlMTEpIHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGlmICh0aGlzLmRyYWdnZWRJbmRleCA9PT0gLTEpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLmRyYWdDdXJyZW50WSA9IGUxMS5jbGllbnRZOwogICAgICBjb25zdCBsaXN0SXRlbXMgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5saXN0LWl0ZW1zIik7CiAgICAgIGlmICghbGlzdEl0ZW1zKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5mcm9tKGxpc3RJdGVtcy5xdWVyeVNlbGVjdG9yQWxsKCIubGlzdC1pdGVtIikpOwogICAgICBjb25zdCBkcmFnZ2VkRWxlbWVudCA9IGl0ZW1zW3RoaXMuZHJhZ2dlZEluZGV4XTsKICAgICAgaWYgKCFkcmFnZ2VkRWxlbWVudCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGRlbHRhWSA9IHRoaXMuZHJhZ0N1cnJlbnRZIC0gdGhpcy5kcmFnU3RhcnRZOwogICAgICBkcmFnZ2VkRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke2RlbHRhWX1weClgOwogICAgICBjb25zdCBkcmFnZ2VkUmVjdCA9IHRoaXMub3JpZ2luYWxJdGVtUmVjdHNbdGhpcy5kcmFnZ2VkSW5kZXhdOwogICAgICBpZiAoIWRyYWdnZWRSZWN0KQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgZHJhZ2dlZENlbnRlciA9IGRyYWdnZWRSZWN0LnRvcCArIGRyYWdnZWRSZWN0LmhlaWdodCAvIDIgKyBkZWx0YVk7CiAgICAgIGxldCBuZXdUYXJnZXRJbmRleCA9IHRoaXMuZHJhZ2dlZEluZGV4OwogICAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBpdGVtcy5sZW5ndGg7IGkxMSsrKSB7CiAgICAgICAgaWYgKGkxMSA9PT0gdGhpcy5kcmFnZ2VkSW5kZXgpCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5vcmlnaW5hbEl0ZW1SZWN0c1tpMTFdOwogICAgICAgIGlmICghcmVjdCkKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGxldCBpdGVtQ2VudGVyID0gcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDI7CiAgICAgICAgaWYgKGl0ZW1zW2kxMV0uY2xhc3NMaXN0LmNvbnRhaW5zKCJtb3ZlLXVwIikpIHsKICAgICAgICAgIGl0ZW1DZW50ZXIgLT0gdGhpcy5pdGVtSGVpZ2h0OwogICAgICAgIH0gZWxzZSBpZiAoaXRlbXNbaTExXS5jbGFzc0xpc3QuY29udGFpbnMoIm1vdmUtZG93biIpKSB7CiAgICAgICAgICBpdGVtQ2VudGVyICs9IHRoaXMuaXRlbUhlaWdodDsKICAgICAgICB9CiAgICAgICAgaWYgKGRyYWdnZWRDZW50ZXIgPCBpdGVtQ2VudGVyICYmIGkxMSA8IHRoaXMuZHJhZ2dlZEluZGV4KSB7CiAgICAgICAgICBuZXdUYXJnZXRJbmRleCA9IGkxMTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gZWxzZSBpZiAoZHJhZ2dlZENlbnRlciA+IGl0ZW1DZW50ZXIgJiYgaTExID4gdGhpcy5kcmFnZ2VkSW5kZXgpIHsKICAgICAgICAgIG5ld1RhcmdldEluZGV4ID0gaTExOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobmV3VGFyZ2V0SW5kZXggIT09IHRoaXMudGFyZ2V0SW5kZXgpIHsKICAgICAgICB0aGlzLnRhcmdldEluZGV4ID0gbmV3VGFyZ2V0SW5kZXg7CiAgICAgICAgdGhpcy51cGRhdGVJdGVtUG9zaXRpb25zKGl0ZW1zKTsKICAgICAgfQogICAgfQogICAgdXBkYXRlSXRlbVBvc2l0aW9ucyhpdGVtcykgewogICAgICBjb25zdCBkcmFnZ2VkSWR4ID0gdGhpcy5kcmFnZ2VkSW5kZXg7CiAgICAgIGNvbnN0IHRhcmdldElkeCA9IHRoaXMudGFyZ2V0SW5kZXg7CiAgICAgIGNvbnN0IGxpc3RJdGVtcyA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmxpc3QtaXRlbXMiKTsKICAgICAgaWYgKGxpc3RJdGVtcykgewogICAgICAgIGxpc3RJdGVtcy5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1pdGVtLWhlaWdodCIsIGAke3RoaXMuaXRlbUhlaWdodH1weGApOwogICAgICB9CiAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0sIGkxMSkgPT4gewogICAgICAgIGlmIChpMTEgPT09IGRyYWdnZWRJZHgpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCJtb3ZlLXVwIiwgIm1vdmUtZG93biIpOwogICAgICAgIGl0ZW0uc3R5bGUuc2V0UHJvcGVydHkoIi0taXRlbS1oZWlnaHQiLCBgJHt0aGlzLml0ZW1IZWlnaHR9cHhgKTsKICAgICAgICBpZiAoZHJhZ2dlZElkeCA8IHRhcmdldElkeCkgewogICAgICAgICAgaWYgKGkxMSA+IGRyYWdnZWRJZHggJiYgaTExIDw9IHRhcmdldElkeCkgewogICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoIm1vdmUtdXAiKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGRyYWdnZWRJZHggPiB0YXJnZXRJZHgpIHsKICAgICAgICAgIGlmIChpMTEgPj0gdGFyZ2V0SWR4ICYmIGkxMSA8IGRyYWdnZWRJZHgpIHsKICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKCJtb3ZlLWRvd24iKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgaGFuZGxlR2xvYmFsRHJhZ0VuZCgpIHsKICAgICAgaWYgKHRoaXMuYm91bmRIYW5kbGVHbG9iYWxEcmFnT3ZlcikgewogICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImRyYWdvdmVyIiwgdGhpcy5ib3VuZEhhbmRsZUdsb2JhbERyYWdPdmVyKTsKICAgICAgICB0aGlzLmJvdW5kSGFuZGxlR2xvYmFsRHJhZ092ZXIgPSBudWxsOwogICAgICB9CiAgICAgIGlmICh0aGlzLmJvdW5kSGFuZGxlR2xvYmFsRHJhZ0VuZCkgewogICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImRyYWdlbmQiLCB0aGlzLmJvdW5kSGFuZGxlR2xvYmFsRHJhZ0VuZCk7CiAgICAgICAgdGhpcy5ib3VuZEhhbmRsZUdsb2JhbERyYWdFbmQgPSBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IGxpc3RJdGVtcyA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmxpc3QtaXRlbXMiKTsKICAgICAgY29uc3QgaXRlbXMgPSBsaXN0SXRlbXM/LnF1ZXJ5U2VsZWN0b3JBbGwoIi5saXN0LWl0ZW0iKTsKICAgICAgY29uc3QgZHJhZ2dlZEVsZW1lbnQgPSBpdGVtcz8uW3RoaXMuZHJhZ2dlZEluZGV4XTsKICAgICAgaWYgKHRoaXMuZHJhZ2dlZEluZGV4ID09PSAtMSB8fCB0aGlzLnRhcmdldEluZGV4ID09PSAtMSB8fCB0aGlzLmRyYWdnZWRJbmRleCA9PT0gdGhpcy50YXJnZXRJbmRleCkgewogICAgICAgIGlmIChkcmFnZ2VkRWxlbWVudCAmJiB0aGlzLmRyYWdnZWRJbmRleCAhPT0gLTEpIHsKICAgICAgICAgIGRyYWdnZWRFbGVtZW50LnN0eWxlLnRyYW5zaXRpb24gPSAidHJhbnNmb3JtIDAuMTVzIGVhc2UiOwogICAgICAgICAgZHJhZ2dlZEVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gInRyYW5zbGF0ZVkoMCkiOwogICAgICAgICAgbGV0IGhhbmRsZWQyID0gZmFsc2U7CiAgICAgICAgICBjb25zdCBvblJldHVybiA9ICgpID0+IHsKICAgICAgICAgICAgaWYgKGhhbmRsZWQyKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgaGFuZGxlZDIgPSB0cnVlOwogICAgICAgICAgICBkcmFnZ2VkRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIiwgb25SZXR1cm4pOwogICAgICAgICAgICB0aGlzLmNsZWFudXBEcmFnU3RhdGUobGlzdEl0ZW1zLCBpdGVtcyk7CiAgICAgICAgICB9OwogICAgICAgICAgZHJhZ2dlZEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsIG9uUmV0dXJuLCB7IG9uY2U6IHRydWUgfSk7CiAgICAgICAgICBzZXRUaW1lb3V0KG9uUmV0dXJuLCAyMDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmNsZWFudXBEcmFnU3RhdGUobGlzdEl0ZW1zLCBpdGVtcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBkcmFnZ2VkUmVjdCA9IHRoaXMub3JpZ2luYWxJdGVtUmVjdHNbdGhpcy5kcmFnZ2VkSW5kZXhdOwogICAgICBjb25zdCB0YXJnZXRSZWN0ID0gdGhpcy5vcmlnaW5hbEl0ZW1SZWN0c1t0aGlzLnRhcmdldEluZGV4XTsKICAgICAgaWYgKCFkcmFnZ2VkUmVjdCB8fCAhdGFyZ2V0UmVjdCB8fCAhZHJhZ2dlZEVsZW1lbnQpIHsKICAgICAgICB0aGlzLmNsZWFudXBEcmFnU3RhdGUobGlzdEl0ZW1zLCBpdGVtcyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxldCBmaW5hbFk7CiAgICAgIGlmICh0aGlzLnRhcmdldEluZGV4ID4gdGhpcy5kcmFnZ2VkSW5kZXgpIHsKICAgICAgICBmaW5hbFkgPSB0YXJnZXRSZWN0LmJvdHRvbSAtIGRyYWdnZWRSZWN0LmJvdHRvbTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmaW5hbFkgPSB0YXJnZXRSZWN0LnRvcCAtIGRyYWdnZWRSZWN0LnRvcDsKICAgICAgfQogICAgICBkcmFnZ2VkRWxlbWVudC5zdHlsZS50cmFuc2l0aW9uID0gInRyYW5zZm9ybSAwLjE1cyBlYXNlIjsKICAgICAgZHJhZ2dlZEVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHtmaW5hbFl9cHgpYDsKICAgICAgbGV0IGhhbmRsZWQgPSBmYWxzZTsKICAgICAgY29uc3Qgb25UcmFuc2l0aW9uRW5kID0gKCkgPT4gewogICAgICAgIGlmIChoYW5kbGVkKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGhhbmRsZWQgPSB0cnVlOwogICAgICAgIGRyYWdnZWRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLCBvblRyYW5zaXRpb25FbmQpOwogICAgICAgIGxpc3RJdGVtcz8uY2xhc3NMaXN0LmFkZCgiZHJvcHBpbmciKTsKICAgICAgICB2b2lkIGxpc3RJdGVtcz8ub2Zmc2V0SGVpZ2h0OwogICAgICAgIGl0ZW1zPy5mb3JFYWNoKChpdGVtKSA9PiB7CiAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoIm1vdmUtdXAiLCAibW92ZS1kb3duIiwgImRyYWdnaW5nIik7CiAgICAgICAgICBpdGVtLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJ0cmFuc2Zvcm0iKTsKICAgICAgICAgIGl0ZW0uc3R5bGUucmVtb3ZlUHJvcGVydHkoInRyYW5zaXRpb24iKTsKICAgICAgICB9KTsKICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IFsuLi50aGlzLnZhbHVlXTsKICAgICAgICBjb25zdCBbZHJhZ2dlZEl0ZW1dID0gbmV3VmFsdWUuc3BsaWNlKHRoaXMuZHJhZ2dlZEluZGV4LCAxKTsKICAgICAgICBuZXdWYWx1ZS5zcGxpY2UodGhpcy50YXJnZXRJbmRleCwgMCwgZHJhZ2dlZEl0ZW0pOwogICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTsKICAgICAgICB0aGlzLmRyYWdnZWRJbmRleCA9IC0xOwogICAgICAgIHRoaXMuZHJhZ092ZXJJbmRleCA9IC0xOwogICAgICAgIHRoaXMudGFyZ2V0SW5kZXggPSAtMTsKICAgICAgICB0aGlzLmRyYWdTdGFydFkgPSAwOwogICAgICAgIHRoaXMuZHJhZ0N1cnJlbnRZID0gMDsKICAgICAgICB0aGlzLm9yaWdpbmFsSXRlbVJlY3RzID0gW107CiAgICAgICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHsKICAgICAgICAgIGNvbnN0IGZyZXNoSXRlbXMgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3JBbGwoIi5saXN0LWl0ZW0iKTsKICAgICAgICAgIGZyZXNoSXRlbXM/LmZvckVhY2goKGl0ZW0pID0+IHsKICAgICAgICAgICAgaXRlbS5zdHlsZS50cmFuc2l0aW9uID0gIm5vbmUiOwogICAgICAgICAgfSk7CiAgICAgICAgICB2b2lkIHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmxpc3QtaXRlbXMiKT8ub2Zmc2V0SGVpZ2h0OwogICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICAgICAgZnJlc2hJdGVtcz8uZm9yRWFjaCgoaXRlbSkgPT4gewogICAgICAgICAgICAgIGl0ZW0uc3R5bGUucmVtb3ZlUHJvcGVydHkoInRyYW5zaXRpb24iKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGxpc3RJdGVtcz8uY2xhc3NMaXN0LnJlbW92ZSgiZHJvcHBpbmciLCAiaXMtZHJhZ2dpbmciKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBkcmFnZ2VkRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIiwgb25UcmFuc2l0aW9uRW5kLCB7IG9uY2U6IHRydWUgfSk7CiAgICAgIHNldFRpbWVvdXQob25UcmFuc2l0aW9uRW5kLCAyMDApOwogICAgfQogICAgY2xlYW51cERyYWdTdGF0ZShsaXN0SXRlbXMsIGl0ZW1zKSB7CiAgICAgIGxpc3RJdGVtcz8uY2xhc3NMaXN0LmFkZCgiZHJvcHBpbmciKTsKICAgICAgdm9pZCBsaXN0SXRlbXM/Lm9mZnNldEhlaWdodDsKICAgICAgaXRlbXM/LmZvckVhY2goKGl0ZW0pID0+IHsKICAgICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoIm1vdmUtdXAiLCAibW92ZS1kb3duIiwgImRyYWdnaW5nIik7CiAgICAgICAgaXRlbS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidHJhbnNmb3JtIik7CiAgICAgICAgaXRlbS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidHJhbnNpdGlvbiIpOwogICAgICB9KTsKICAgICAgdGhpcy5kcmFnZ2VkSW5kZXggPSAtMTsKICAgICAgdGhpcy5kcmFnT3ZlckluZGV4ID0gLTE7CiAgICAgIHRoaXMudGFyZ2V0SW5kZXggPSAtMTsKICAgICAgdGhpcy5kcmFnU3RhcnRZID0gMDsKICAgICAgdGhpcy5kcmFnQ3VycmVudFkgPSAwOwogICAgICB0aGlzLm9yaWdpbmFsSXRlbVJlY3RzID0gW107CiAgICAgIHRoaXMudXBkYXRlQ29tcGxldGUudGhlbigoKSA9PiB7CiAgICAgICAgY29uc3QgZnJlc2hJdGVtcyA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvckFsbCgiLmxpc3QtaXRlbSIpOwogICAgICAgIGZyZXNoSXRlbXM/LmZvckVhY2goKGl0ZW0pID0+IHsKICAgICAgICAgIGl0ZW0uc3R5bGUudHJhbnNpdGlvbiA9ICJub25lIjsKICAgICAgICB9KTsKICAgICAgICB2b2lkIHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmxpc3QtaXRlbXMiKT8ub2Zmc2V0SGVpZ2h0OwogICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICBmcmVzaEl0ZW1zPy5mb3JFYWNoKChpdGVtKSA9PiB7CiAgICAgICAgICAgIGl0ZW0uc3R5bGUucmVtb3ZlUHJvcGVydHkoInRyYW5zaXRpb24iKTsKICAgICAgICAgIH0pOwogICAgICAgICAgbGlzdEl0ZW1zPy5jbGFzc0xpc3QucmVtb3ZlKCJkcm9wcGluZyIsICJpcy1kcmFnZ2luZyIpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICAgIGhhbmRsZURyYWdFbmQoKSB7CiAgICAgIHRoaXMuaGFuZGxlR2xvYmFsRHJhZ0VuZCgpOwogICAgfQogICAgaGFuZGxlRHJhZ092ZXIoZTExLCBpbmRleDIpIHsKICAgICAgaWYgKCF0aGlzLnNvcnRhYmxlIHx8IHRoaXMuZGlzYWJsZWQpCiAgICAgICAgcmV0dXJuOwogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgZTExLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gIm1vdmUiOwogICAgfQogICAgaGFuZGxlRHJhZ0xlYXZlKCkgewogICAgfQogICAgaGFuZGxlRHJvcChlMTEsIGRyb3BJbmRleCkgewogICAgICBpZiAoIXRoaXMuc29ydGFibGUgfHwgdGhpcy5kaXNhYmxlZCkKICAgICAgICByZXR1cm47CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgfQogICAgZW1pdENoYW5nZSgpIHsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2hhbmdlIiwgewogICAgICAgIGRldGFpbDogeyB2YWx1ZTogdGhpcy52YWx1ZSB9LAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgIH0KICAgIGdldFZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy52YWx1ZTsKICAgIH0KICAgIHNldFZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLnZhbHVlID0gdmFsdWUyIHx8IFtdOwogICAgfQogICAgYXN5bmMgdmFsaWRhdGUoKSB7CiAgICAgIGlmICh0aGlzLnJlcXVpcmVkICYmICghdGhpcy52YWx1ZSB8fCB0aGlzLnZhbHVlLmxlbmd0aCA9PT0gMCkpIHsKICAgICAgICB0aGlzLnZhbGlkYXRpb25UZXh0ID0gIkF0IGxlYXN0IG9uZSBpdGVtIGlzIHJlcXVpcmVkIjsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKHRoaXMubWluSXRlbXMgJiYgdGhpcy52YWx1ZS5sZW5ndGggPCB0aGlzLm1pbkl0ZW1zKSB7CiAgICAgICAgdGhpcy52YWxpZGF0aW9uVGV4dCA9IGBBdCBsZWFzdCAke3RoaXMubWluSXRlbXN9IGl0ZW1zIHJlcXVpcmVkYDsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdGhpcy52YWxpZGF0aW9uVGV4dCA9ICIiOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNTcoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNJbnB1dExpc3QyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXJpY2h0ZXh0L2RlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW9GdW5jNDEgPSAoKSA9PiBiMmAKICA8ZGVlcy1kZW1vd3JhcHBlcj4KICAgIDxzdHlsZT4KICAgICAgJHtpYAogICAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMjRweDsKICAgICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgICBtYXgtd2lkdGg6IDEyMDBweDsKICAgICAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBkZWVzLXBhbmVsIHsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGRlZXMtcGFuZWw6bGFzdC1jaGlsZCB7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuZ3JpZC1sYXlvdXQgewogICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsKICAgICAgICAgIGdhcDogMTZweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgICAgICAgICAuZ3JpZC1sYXlvdXQgewogICAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLm91dHB1dC1wcmV2aWV3IHsKICAgICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgICAgYmFja2dyb3VuZDogI2YzZjRmNjsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICAgIGNvbG9yOiAjMzc0MTUxOwogICAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOwogICAgICAgICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgICAub3V0cHV0LXByZXZpZXcgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjMmMyYzJjOwogICAgICAgICAgICBjb2xvcjogI2U0ZTRlNzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIGB9CiAgICA8L3N0eWxlPgogICAgCiAgICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyIxLiBCYXNpYyBSaWNoIFRleHQgRWRpdG9yIn0gLnN1YnRpdGxlPSR7IkEgZnVsbC1mZWF0dXJlZCByaWNoIHRleHQgZWRpdG9yIHdpdGggZm9ybWF0dGluZyB0b29sYmFyIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtcmljaHRleHQgCiAgICAgICAgICAubGFiZWw9JHsiQXJ0aWNsZSBDb250ZW50In0gCiAgICAgICAgICAudmFsdWU9JHsnPGgxPldlbGNvbWUgdG8gdGhlIFJpY2ggVGV4dCBFZGl0b3IhPC9oMT48cD5UaGlzIGlzIGEgZmVhdHVyZS1yaWNoIGVkaXRvciBidWlsdCB3aXRoIFRpcFRhcC4gWW91IGNhbjo8L3A+PHVsPjxsaT48c3Ryb25nPkZvcm1hdCB0ZXh0PC9zdHJvbmc+IHdpdGggPGVtPnZhcmlvdXM8L2VtPiA8dT5zdHlsZXM8L3U+PC9saT48bGk+Q3JlYXRlIGRpZmZlcmVudCBoZWFkaW5nIGxldmVsczwvbGk+PGxpPkFkZCA8YSBocmVmPSJodHRwczovL2V4YW1wbGUuY29tIj5saW5rczwvYT4gdG8gZXh0ZXJuYWwgcmVzb3VyY2VzPC9saT48bGk+V3JpdGUgPGNvZGU+aW5saW5lIGNvZGU8L2NvZGU+IG9yIGNvZGUgYmxvY2tzPC9saT48L3VsPjxibG9ja3F1b3RlPjxwPlVzZSB0aGUgdG9vbGJhciBhYm92ZSB0byBleHBsb3JlIGFsbCB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGF2YWlsYWJsZSE8L3A+PC9ibG9ja3F1b3RlPjxwPlN0YXJ0IHR5cGluZyB0byBzZWUgdGhlIG1hZ2ljIGhhcHBlbi4uLjwvcD4nfQogICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IlVzZSB0aGUgdG9vbGJhciB0byBmb3JtYXQgeW91ciBjb250ZW50IHdpdGggaGVhZGluZ3MsIGxpc3RzLCBsaW5rcywgYW5kIG1vcmUifQogICAgICAgICAgLnNob3dXb3JkQ291bnQ9JHt0cnVlfQogICAgICAgID48L2RlZXMtaW5wdXQtcmljaHRleHQ+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyIyLiBXaXRoIFBsYWNlaG9sZGVyIn0gLnN1YnRpdGxlPSR7IkVtcHR5IGVkaXRvciB3aXRoIHBsYWNlaG9sZGVyIHRleHQifT4KICAgICAgICA8ZGVlcy1pbnB1dC1yaWNodGV4dCAKICAgICAgICAgIC5sYWJlbD0keyJCbG9nIFBvc3QifSAKICAgICAgICAgIC5wbGFjZWhvbGRlcj0keyJTdGFydCB3cml0aW5nIHlvdXIgYmxvZyBwb3N0IGhlcmUuLi4ifQogICAgICAgICAgLnNob3dXb3JkQ291bnQ9JHt0cnVlfQogICAgICAgID48L2RlZXMtaW5wdXQtcmljaHRleHQ+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyIzLiBEaWZmZXJlbnQgSGVpZ2h0cyJ9IC5zdWJ0aXRsZT0keyJFZGl0b3JzIHdpdGggZGlmZmVyZW50IG1pbmltdW0gaGVpZ2h0cyBmb3IgdmFyaW91cyB1c2UgY2FzZXMifT4KICAgICAgICA8ZGl2IGNsYXNzPSJncmlkLWxheW91dCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1yaWNodGV4dCAKICAgICAgICAgICAgLmxhYmVsPSR7IlNob3J0IE5vdGUifSAKICAgICAgICAgICAgLm1pbkhlaWdodD0kezE1MH0KICAgICAgICAgICAgLnBsYWNlaG9sZGVyPSR7IlF1aWNrIG5vdGUuLi4ifQogICAgICAgICAgICAuc2hvd1dvcmRDb3VudD0ke2ZhbHNlfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1yaWNodGV4dD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtcmljaHRleHQgCiAgICAgICAgICAgIC5sYWJlbD0keyJFeHRlbmRlZCBDb250ZW50In0gCiAgICAgICAgICAgIC5taW5IZWlnaHQ9JHszMDB9CiAgICAgICAgICAgIC5wbGFjZWhvbGRlcj0keyJXcml0ZSB5b3VyIGV4dGVuZGVkIGNvbnRlbnQgaGVyZS4uLiJ9CiAgICAgICAgICAgIC5zaG93V29yZENvdW50PSR7dHJ1ZX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtcmljaHRleHQ+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI0LiBDb2RlIEV4YW1wbGVzIn0gLnN1YnRpdGxlPSR7IkVkaXRvciBwcmUtZmlsbGVkIHdpdGggY29kZSBleGFtcGxlcyJ9PgogICAgICAgIDxkZWVzLWlucHV0LXJpY2h0ZXh0IAogICAgICAgICAgLmxhYmVsPSR7IlRlY2huaWNhbCBEb2N1bWVudGF0aW9uIn0gCiAgICAgICAgICAudmFsdWU9JHsnPGgyPkluc3RhbGxhdGlvbiBHdWlkZTwvaDI+PHA+VG8gaW5zdGFsbCB0aGUgcGFja2FnZSwgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDo8L3A+PHByZT48Y29kZT5ucG0gaW5zdGFsbCBAZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2c8L2NvZGU+PC9wcmU+PHA+VGhlbiBpbXBvcnQgdGhlIGNvbXBvbmVudCBpbiB5b3VyIFR5cGVTY3JpcHQgZmlsZTo8L3A+PHByZT48Y29kZT5pbXBvcnQgeyBEZWVzSW5wdXRSaWNodGV4dCB9IGZyb20gIkBkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZyI7PC9jb2RlPjwvcHJlPjxwPllvdSBjYW4gbm93IHVzZSB0aGUgPGNvZGU+Jmx0O2RlZXMtaW5wdXQtcmljaHRleHQmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHlvdXIgdGVtcGxhdGVzLjwvcD4nfQogICAgICAgICAgLm1pbkhlaWdodD0kezI1MH0KICAgICAgICAgIC5zaG93V29yZENvdW50PSR7dHJ1ZX0KICAgICAgICA+PC9kZWVzLWlucHV0LXJpY2h0ZXh0PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiNS4gRGlzYWJsZWQgU3RhdGUifSAuc3VidGl0bGU9JHsiUmVhZC1vbmx5IHJpY2ggdGV4dCBjb250ZW50In0+CiAgICAgICAgPGRlZXMtaW5wdXQtcmljaHRleHQgCiAgICAgICAgICAubGFiZWw9JHsiUHVibGlzaGVkIEFydGljbGUgKFJlYWQgT25seSkifSAKICAgICAgICAgIC52YWx1ZT0keyc8aDI+VGhlIEZ1dHVyZSBvZiBXZWIgQ29tcG9uZW50czwvaDI+PHA+V2ViIENvbXBvbmVudHMgaGF2ZSByZXZvbHV0aW9uaXplZCBob3cgd2UgYnVpbGQgbW9kZXJuIHdlYiBhcHBsaWNhdGlvbnMuLi48L3A+PGJsb2NrcXVvdGU+PHA+IlRoZSBmdXR1cmUgb2Ygd2ViIGRldmVsb3BtZW50IGxpZXMgaW4gcmV1c2FibGUsIGVuY2Fwc3VsYXRlZCBjb21wb25lbnRzLiI8L3A+PC9ibG9ja3F1b3RlPid9CiAgICAgICAgICAuZGlzYWJsZWQ9JHt0cnVlfQogICAgICAgICAgLnNob3dXb3JkQ291bnQ9JHt0cnVlfQogICAgICAgID48L2RlZXMtaW5wdXQtcmljaHRleHQ+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI2LiBJbnRlcmFjdGl2ZSBEZW1vIn0gLnN1YnRpdGxlPSR7IlR5cGUgaW4gdGhlIGVkaXRvciBiZWxvdyBhbmQgc2VlIHRoZSBIVE1MIG91dHB1dCJ9PgogICAgICAgIDxkZWVzLWlucHV0LXJpY2h0ZXh0IAogICAgICAgICAgaWQ9ImludGVyYWN0aXZlLWVkaXRvciIKICAgICAgICAgIC5sYWJlbD0keyJUcnkgaXQgeW91cnNlbGYifSAKICAgICAgICAgIC5wbGFjZWhvbGRlcj0keyJUeXBlIHNvbWV0aGluZyBoZXJlLi4uIn0KICAgICAgICAgIC5zaG93V29yZENvdW50PSR7dHJ1ZX0KICAgICAgICAgIEBjaGFuZ2U9JHsoZTExKSA9PiB7CiAgY29uc3Qgb3V0cHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI291dHB1dC1wcmV2aWV3Iik7CiAgaWYgKG91dHB1dCkgewogICAgb3V0cHV0LnRleHRDb250ZW50ID0gZTExLmRldGFpbC52YWx1ZTsKICB9Cn19CiAgICAgICAgPjwvZGVlcy1pbnB1dC1yaWNodGV4dD4KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJvdXRwdXQtcHJldmlldyIgaWQ9Im91dHB1dC1wcmV2aWV3Ij4KICAgICAgICAgIDxlbT5IVE1MIG91dHB1dCB3aWxsIGFwcGVhciBoZXJlLi4uPC9lbT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kaXY+CiAgPC9kZWVzLWRlbW93cmFwcGVyPgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtcmljaHRleHQvc3R5bGVzLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciByaWNodGV4dFN0eWxlcyA9IFsKICAuLi5EZWVzSW5wdXRCYXNlLmJhc2VTdHlsZXMsCiAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogIGlgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZm9udC1mYW1pbHk6IEludGVyLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgfQoKICAgICAgLmlucHV0LXdyYXBwZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLmxhYmVsIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxNSUpIiwgImhzbCgwIDAlIDkzLjklKSIpfTsKICAgICAgfQoKICAgICAgLmVkaXRvci1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBtaW4taGVpZ2h0OiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiMjAwcHgiLCAiMjAwcHgiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSA5JSkiKX07CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICB9CgogICAgICAuZWRpdG9yLWNvbnRhaW5lcjpob3ZlciB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNzkuOCUpIiwgImhzbCgwIDAlIDIwLjklKSIpfTsKICAgICAgfQoKICAgICAgLmVkaXRvci1jb250YWluZXIuZm9jdXNlZCB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk4JSkiKX07CiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSAvIDAuMDUpIiwgImhzbCgwIDAlIDk4JSAvIDAuMDUpIil9OwogICAgICB9CgogICAgICAuZWRpdG9yLXRvb2xiYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIGdhcDogNHB4OwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5Ni4xJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDQ2LjklKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItYnV0dG9uIGRlZXMtaWNvbiB7CiAgICAgICAgd2lkdGg6IDE2cHg7CiAgICAgICAgaGVpZ2h0OiAxNnB4OwogICAgICB9CgogICAgICAudG9vbGJhci1idXR0b246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NS4xJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk1JSkiKX07CiAgICAgIH0KCiAgICAgIC50b29sYmFyLWJ1dHRvbi5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTglKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDMuOSUpIil9OwogICAgICB9CgogICAgICAudG9vbGJhci1idXR0b246ZGlzYWJsZWQgewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICB9CgogICAgICAudG9vbGJhci1kaXZpZGVyIHsKICAgICAgICB3aWR0aDogMXB4OwogICAgICAgIGhlaWdodDogMjRweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBtYXJnaW46IDAgNHB4OwogICAgICB9CgogICAgICAuZWRpdG9yLWNvbnRlbnQgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLW1pbi1oZWlnaHQsIDIwMHB4KTsKICAgICAgfQoKICAgICAgLmVkaXRvci1jb250ZW50IC5Qcm9zZU1pcnJvciB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBsaW5lLWhlaWdodDogMS42OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMy45JSkiLCAiaHNsKDAgMCUgOTglKSIpfTsKICAgICAgICBtaW4taGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAuZWRpdG9yLWNvbnRlbnQgLlByb3NlTWlycm9yIHAgewogICAgICAgIG1hcmdpbjogMC41ZW0gMDsKICAgICAgfQoKICAgICAgLmVkaXRvci1jb250ZW50IC5Qcm9zZU1pcnJvciBwOmZpcnN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CgogICAgICAuZWRpdG9yLWNvbnRlbnQgLlByb3NlTWlycm9yIHA6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLmVkaXRvci1jb250ZW50IC5Qcm9zZU1pcnJvciBoMSB7CiAgICAgICAgZm9udC1zaXplOiAyZW07CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgbWFyZ2luOiAxZW0gMCAwLjVlbSAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICAgIH0KCiAgICAgIC5lZGl0b3ItY29udGVudCAuUHJvc2VNaXJyb3IgaDIgewogICAgICAgIGZvbnQtc2l6ZTogMS41ZW07CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgbWFyZ2luOiAxZW0gMCAwLjVlbSAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjM7CiAgICAgIH0KCiAgICAgIC5lZGl0b3ItY29udGVudCAuUHJvc2VNaXJyb3IgaDMgewogICAgICAgIGZvbnQtc2l6ZTogMS4yNWVtOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIG1hcmdpbjogMWVtIDAgMC41ZW0gMDsKICAgICAgICBsaW5lLWhlaWdodDogMS40OwogICAgICB9CgogICAgICAuZWRpdG9yLWNvbnRlbnQgLlByb3NlTWlycm9yIHVsLAogICAgICAuZWRpdG9yLWNvbnRlbnQgLlByb3NlTWlycm9yIG9sIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDEuNWVtOwogICAgICAgIG1hcmdpbjogMC41ZW0gMDsKICAgICAgfQoKICAgICAgLmVkaXRvci1jb250ZW50IC5Qcm9zZU1pcnJvciBsaSB7CiAgICAgICAgbWFyZ2luOiAwLjI1ZW0gMDsKICAgICAgfQoKICAgICAgLmVkaXRvci1jb250ZW50IC5Qcm9zZU1pcnJvciBibG9ja3F1b3RlIHsKICAgICAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIG1hcmdpbjogMWVtIDA7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxZW07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNDYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQoKICAgICAgLmVkaXRvci1jb250ZW50IC5Qcm9zZU1pcnJvciBjb2RlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUuMSUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgcGFkZGluZzogMC4yZW0gMC40ZW07CiAgICAgICAgZm9udC1mYW1pbHk6ICdJbnRlbCBPbmUgTW9ubycsICdGaXJhIENvZGUnLCAnU0YgTW9ubycsIE1vbmFjbywgJ0Nhc2NhZGlhIENvZGUnLCAnUm9ib3RvIE1vbm8nLCBDb25zb2xhcywgJ0NvdXJpZXIgTmV3JywgbW9ub3NwYWNlOwogICAgICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxNSUpIiwgImhzbCgwIDAlIDkzLjklKSIpfTsKICAgICAgfQoKICAgICAgLmVkaXRvci1jb250ZW50IC5Qcm9zZU1pcnJvciBwcmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAzLjklKSIsICJoc2woMCAwJSA5OCUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTglKSIsICJoc2woMCAwJSAzLjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgcGFkZGluZzogMWVtOwogICAgICAgIG1hcmdpbjogMWVtIDA7CiAgICAgICAgb3ZlcmZsb3cteDogYXV0bzsKICAgICAgfQoKICAgICAgLmVkaXRvci1jb250ZW50IC5Qcm9zZU1pcnJvciBwcmUgY29kZSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICAgIH0KCiAgICAgIC5lZGl0b3ItY29udGVudCAuUHJvc2VNaXJyb3IgYSB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgNTEuMiUpIiwgImhzbCgyMTcuMiA5MS4yJSA1OS44JSkiKX07CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAuZWRpdG9yLWNvbnRlbnQgLlByb3NlTWlycm9yIGE6aG92ZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDQxLjIlKSIsICJoc2woMjE3LjIgOTEuMiUgNjkuOCUpIil9OwogICAgICB9CgogICAgICAuZWRpdG9yLWZvb3RlciB7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA0Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLndvcmQtY291bnQgewogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5saW5rLWlucHV0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDEwMCU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBib3gtc2hhZG93OiAwIDRweCA2cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMSk7CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICB6LWluZGV4OiAxMDAwOwogICAgICB9CgogICAgICAubGluay1pbnB1dC5zaG93IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgLmxpbmstaW5wdXQgaW5wdXQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMy45JSkiLCAiaHNsKDAgMCUgOTglKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICB9CgogICAgICAubGluay1pbnB1dCBpbnB1dDpmb2N1cyB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk4JSkiKX07CiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSAvIDAuMDUpIiwgImhzbCgwIDAlIDk4JSAvIDAuMDUpIil9OwogICAgICB9CgogICAgICAubGluay1pbnB1dC1idXR0b25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogOHB4OwogICAgICAgIG1hcmdpbi10b3A6IDhweDsKICAgICAgfQoKICAgICAgLmxpbmstaW5wdXQtYnV0dG9ucyBidXR0b24gewogICAgICAgIHBhZGRpbmc6IDZweCAxMnB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NS4xJSkiLCAiaHNsKDAgMCUgNjMuOSUpIil9OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5saW5rLWlucHV0LWJ1dHRvbnMgYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUuMSUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICB9CgogICAgICAubGluay1pbnB1dC1idXR0b25zIGJ1dHRvbi5wcmltYXJ5IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk4JSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSAzLjklKSIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTglKSIpfTsKICAgICAgfQoKICAgICAgLmxpbmstaW5wdXQtYnV0dG9ucyBidXR0b24ucHJpbWFyeTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDE1JSkiLCAiaHNsKDAgMCUgOTMuOSUpIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDE1JSkiLCAiaHNsKDAgMCUgOTMuOSUpIil9OwogICAgICB9CgogICAgICAuZGVzY3JpcHRpb24gewogICAgICAgIG1hcmdpbi10b3A6IDhweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNDYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIC5lZGl0b3ItY29udGFpbmVyIHsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgLnRvb2xiYXItYnV0dG9uLAogICAgICA6aG9zdChbZGlzYWJsZWRdKSAuZWRpdG9yLWNvbnRlbnQgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICBgCl07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1yaWNodGV4dC90ZW1wbGF0ZS5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgcmVuZGVyUmljaHRleHQgPSAoY29tcG9uZW50KSA9PiB7CiAgcmV0dXJuIGIyYAogICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LXdyYXBwZXIiPgogICAgICAgICAgJHtjb21wb25lbnQubGFiZWwgPyBiMmA8bGFiZWwgY2xhc3M9ImxhYmVsIj4ke2NvbXBvbmVudC5sYWJlbH08L2xhYmVsPmAgOiAiIn0KICAgICAgICAgIDxkaXYgY2xhc3M9ImVkaXRvci1jb250YWluZXIgJHtjb21wb25lbnQuZWRpdG9yPy5pc0ZvY3VzZWQgPyAiZm9jdXNlZCIgOiAiIn0iIHN0eWxlPSItLW1pbi1oZWlnaHQ6ICR7Y29tcG9uZW50Lm1pbkhlaWdodH1weCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVkaXRvci10b29sYmFyIj4KICAgICAgICAgICAgICAke2NvbXBvbmVudC5yZW5kZXJUb29sYmFyKCl9CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGluay1pbnB1dCAke2NvbXBvbmVudC5zaG93TGlua0lucHV0ID8gInNob3ciIDogIiJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ1cmwiIHBsYWNlaG9sZGVyPSJFbnRlciBVUkwuLi4iIEBrZXlkb3duPSR7Y29tcG9uZW50LmhhbmRsZUxpbmtJbnB1dEtleWRvd259IC8+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5rLWlucHV0LWJ1dHRvbnMiPgogICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJwcmltYXJ5IiBAY2xpY2s9JHtjb21wb25lbnQuc2F2ZUxpbmt9PlNhdmU8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9JHtjb21wb25lbnQucmVtb3ZlTGlua30+UmVtb3ZlPC9idXR0b24+CiAgICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPSR7Y29tcG9uZW50LmhpZGVMaW5rSW5wdXR9PkNhbmNlbDwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJlZGl0b3ItY29udGVudCI+PC9kaXY+CiAgICAgICAgICAgICR7Y29tcG9uZW50LnNob3dXb3JkQ291bnQgPyBiMmAKICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZWRpdG9yLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IndvcmQtY291bnQiPiR7Y29tcG9uZW50LndvcmRDb3VudH0gd29yZCR7Y29tcG9uZW50LndvcmRDb3VudCAhPT0gMSA/ICJzIiA6ICIifTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICR7Y29tcG9uZW50LmRlc2NyaXB0aW9uID8gYjJgPGRpdiBjbGFzcz0iZGVzY3JpcHRpb24iPiR7Y29tcG9uZW50LmRlc2NyaXB0aW9ufTwvZGl2PmAgOiAiIn0KICAgICAgICA8L2Rpdj4KICAgICAgYDsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXJpY2h0ZXh0L2NvbXBvbmVudC5qcwppbml0X2RlZXNfaWNvbigpOwppbml0X2Rpc3RfdHMyNigpOwppbml0X3NlcnZpY2VzKCk7CnZhciBfX2VzRGVjb3JhdGU1NyA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNTggPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNJbnB1dFJpY2h0ZXh0ID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1pbnB1dC1yaWNodGV4dCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzSW5wdXRCYXNlOwogIGxldCBfdmFsdWVfZGVjb3JhdG9yczsKICBsZXQgX3ZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BsYWNlaG9sZGVyX2RlY29yYXRvcnM7CiAgbGV0IF9wbGFjZWhvbGRlcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BsYWNlaG9sZGVyX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93V29yZENvdW50X2RlY29yYXRvcnM7CiAgbGV0IF9zaG93V29yZENvdW50X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1dvcmRDb3VudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWluSGVpZ2h0X2RlY29yYXRvcnM7CiAgbGV0IF9taW5IZWlnaHRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9taW5IZWlnaHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dMaW5rSW5wdXRfZGVjb3JhdG9yczsKICBsZXQgX3Nob3dMaW5rSW5wdXRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93TGlua0lucHV0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF93b3JkQ291bnRfZGVjb3JhdG9yczsKICBsZXQgX3dvcmRDb3VudF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3dvcmRDb3VudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW5wdXRSaWNodGV4dDIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF92YWx1ZV9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgcmVmbGVjdDogdHJ1ZQogICAgICB9KV07CiAgICAgIF9wbGFjZWhvbGRlcl9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBTdHJpbmcKICAgICAgfSldOwogICAgICBfc2hvd1dvcmRDb3VudF9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBCb29sZWFuCiAgICAgIH0pXTsKICAgICAgX21pbkhlaWdodF9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBOdW1iZXIKICAgICAgfSldOwogICAgICBfc2hvd0xpbmtJbnB1dF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfd29yZENvdW50X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTU3KHRoaXMsIG51bGwsIF92YWx1ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2YWx1ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmFsdWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmFsdWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZhbHVlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZhbHVlX2luaXRpYWxpemVycywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTcodGhpcywgbnVsbCwgX3BsYWNlaG9sZGVyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInBsYWNlaG9sZGVyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJwbGFjZWhvbGRlciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5wbGFjZWhvbGRlciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucGxhY2Vob2xkZXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcGxhY2Vob2xkZXJfaW5pdGlhbGl6ZXJzLCBfcGxhY2Vob2xkZXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nyh0aGlzLCBudWxsLCBfc2hvd1dvcmRDb3VudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93V29yZENvdW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93V29yZENvdW50IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dXb3JkQ291bnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dXb3JkQ291bnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd1dvcmRDb3VudF9pbml0aWFsaXplcnMsIF9zaG93V29yZENvdW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTcodGhpcywgbnVsbCwgX21pbkhlaWdodF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtaW5IZWlnaHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1pbkhlaWdodCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5taW5IZWlnaHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1pbkhlaWdodCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9taW5IZWlnaHRfaW5pdGlhbGl6ZXJzLCBfbWluSGVpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTcodGhpcywgbnVsbCwgX3Nob3dMaW5rSW5wdXRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2hvd0xpbmtJbnB1dCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd0xpbmtJbnB1dCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93TGlua0lucHV0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaG93TGlua0lucHV0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dMaW5rSW5wdXRfaW5pdGlhbGl6ZXJzLCBfc2hvd0xpbmtJbnB1dF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU3KHRoaXMsIG51bGwsIF93b3JkQ291bnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAid29yZENvdW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ3b3JkQ291bnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoud29yZENvdW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai53b3JkQ291bnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfd29yZENvdW50X2luaXRpYWxpemVycywgX3dvcmRDb3VudF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU3KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0lucHV0UmljaHRleHQyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmM0MTsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJJbnB1dCJdOwogICAgI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF92YWx1ZV9pbml0aWFsaXplcnMsICIiKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgdmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3BsYWNlaG9sZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9wbGFjZWhvbGRlcl9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgcGxhY2Vob2xkZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwbGFjZWhvbGRlcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHBsYWNlaG9sZGVyKHZhbHVlMikgewogICAgICB0aGlzLiNwbGFjZWhvbGRlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dXb3JkQ291bnRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9wbGFjZWhvbGRlcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX3Nob3dXb3JkQ291bnRfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgc2hvd1dvcmRDb3VudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dXb3JkQ291bnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93V29yZENvdW50KHZhbHVlMikgewogICAgICB0aGlzLiNzaG93V29yZENvdW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWluSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfc2hvd1dvcmRDb3VudF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX21pbkhlaWdodF9pbml0aWFsaXplcnMsIDIwMCkpOwogICAgZ2V0IG1pbkhlaWdodCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21pbkhlaWdodF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1pbkhlaWdodCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWluSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd0xpbmtJbnB1dF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX21pbkhlaWdodF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX3Nob3dMaW5rSW5wdXRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHNob3dMaW5rSW5wdXQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93TGlua0lucHV0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd0xpbmtJbnB1dCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2hvd0xpbmtJbnB1dF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3dvcmRDb3VudF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX3Nob3dMaW5rSW5wdXRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF93b3JkQ291bnRfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgd29yZENvdW50KCkgewogICAgICByZXR1cm4gdGhpcy4jd29yZENvdW50X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgd29yZENvdW50KHZhbHVlMikgewogICAgICB0aGlzLiN3b3JkQ291bnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGVkaXRvckVsZW1lbnQgPSBfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF93b3JkQ291bnRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgbGlua0lucHV0RWxlbWVudDsKICAgIHRpcHRhcEJ1bmRsZSA9IG51bGw7CiAgICBlZGl0b3I7CiAgICBzdGF0aWMgc3R5bGVzID0gcmljaHRleHRTdHlsZXM7CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiByZW5kZXJSaWNodGV4dCh0aGlzKTsKICAgIH0KICAgIHJlbmRlclRvb2xiYXIoKSB7CiAgICAgIGNvbnN0IGJ1dHRvbnMgPSB0aGlzLmdldFRvb2xiYXJCdXR0b25zKCk7CiAgICAgIHJldHVybiBiMmAKICAgICAgJHtidXR0b25zLm1hcCgoYnV0dG9uKSA9PiB7CiAgICAgICAgaWYgKGJ1dHRvbi5pc0RpdmlkZXIpIHsKICAgICAgICAgIHJldHVybiBiMmA8ZGl2IGNsYXNzPSJ0b29sYmFyLWRpdmlkZXIiPjwvZGl2PmA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBiMmAKICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgY2xhc3M9InRvb2xiYXItYnV0dG9uICR7YnV0dG9uLmlzQWN0aXZlPy4oKSA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICBAY2xpY2s9JHtidXR0b24uYWN0aW9ufQogICAgICAgICAgICB0aXRsZT0ke2J1dHRvbi50aXRsZX0KICAgICAgICAgICAgP2Rpc2FibGVkPSR7dGhpcy5kaXNhYmxlZCB8fCAhdGhpcy5lZGl0b3J9CiAgICAgICAgICA+CiAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHtidXR0b24uaWNvbn0+PC9kZWVzLWljb24+CiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICBgOwogICAgICB9KX0KICAgIGA7CiAgICB9CiAgICBnZXRUb29sYmFyQnV0dG9ucygpIHsKICAgICAgaWYgKCF0aGlzLmVkaXRvcikKICAgICAgICByZXR1cm4gW107CiAgICAgIHJldHVybiBbCiAgICAgICAgewogICAgICAgICAgbmFtZTogImJvbGQiLAogICAgICAgICAgaWNvbjogImx1Y2lkZTpib2xkIiwKICAgICAgICAgIHRpdGxlOiAiQm9sZCAoQ3RybCtCKSIsCiAgICAgICAgICBhY3Rpb246ICgpID0+IHRoaXMuZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVCb2xkKCkucnVuKCksCiAgICAgICAgICBpc0FjdGl2ZTogKCkgPT4gdGhpcy5lZGl0b3IuaXNBY3RpdmUoImJvbGQiKQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIml0YWxpYyIsCiAgICAgICAgICBpY29uOiAibHVjaWRlOml0YWxpYyIsCiAgICAgICAgICB0aXRsZTogIkl0YWxpYyAoQ3RybCtJKSIsCiAgICAgICAgICBhY3Rpb246ICgpID0+IHRoaXMuZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVJdGFsaWMoKS5ydW4oKSwKICAgICAgICAgIGlzQWN0aXZlOiAoKSA9PiB0aGlzLmVkaXRvci5pc0FjdGl2ZSgiaXRhbGljIikKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJ1bmRlcmxpbmUiLAogICAgICAgICAgaWNvbjogImx1Y2lkZTp1bmRlcmxpbmUiLAogICAgICAgICAgdGl0bGU6ICJVbmRlcmxpbmUgKEN0cmwrVSkiLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlVW5kZXJsaW5lKCkucnVuKCksCiAgICAgICAgICBpc0FjdGl2ZTogKCkgPT4gdGhpcy5lZGl0b3IuaXNBY3RpdmUoInVuZGVybGluZSIpCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAic3RyaWtlIiwKICAgICAgICAgIGljb246ICJsdWNpZGU6c3RyaWtldGhyb3VnaCIsCiAgICAgICAgICB0aXRsZTogIlN0cmlrZXRocm91Z2giLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlU3RyaWtlKCkucnVuKCksCiAgICAgICAgICBpc0FjdGl2ZTogKCkgPT4gdGhpcy5lZGl0b3IuaXNBY3RpdmUoInN0cmlrZSIpCiAgICAgICAgfSwKICAgICAgICB7IG5hbWU6ICJkaXZpZGVyMSIsIHRpdGxlOiAiIiwgaXNEaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogImgxIiwKICAgICAgICAgIGljb246ICJsdWNpZGU6aGVhZGluZzEiLAogICAgICAgICAgdGl0bGU6ICJIZWFkaW5nIDEiLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlSGVhZGluZyh7IGxldmVsOiAxIH0pLnJ1bigpLAogICAgICAgICAgaXNBY3RpdmU6ICgpID0+IHRoaXMuZWRpdG9yLmlzQWN0aXZlKCJoZWFkaW5nIiwgeyBsZXZlbDogMSB9KQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogImgyIiwKICAgICAgICAgIGljb246ICJsdWNpZGU6aGVhZGluZzIiLAogICAgICAgICAgdGl0bGU6ICJIZWFkaW5nIDIiLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlSGVhZGluZyh7IGxldmVsOiAyIH0pLnJ1bigpLAogICAgICAgICAgaXNBY3RpdmU6ICgpID0+IHRoaXMuZWRpdG9yLmlzQWN0aXZlKCJoZWFkaW5nIiwgeyBsZXZlbDogMiB9KQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogImgzIiwKICAgICAgICAgIGljb246ICJsdWNpZGU6aGVhZGluZzMiLAogICAgICAgICAgdGl0bGU6ICJIZWFkaW5nIDMiLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlSGVhZGluZyh7IGxldmVsOiAzIH0pLnJ1bigpLAogICAgICAgICAgaXNBY3RpdmU6ICgpID0+IHRoaXMuZWRpdG9yLmlzQWN0aXZlKCJoZWFkaW5nIiwgeyBsZXZlbDogMyB9KQogICAgICAgIH0sCiAgICAgICAgeyBuYW1lOiAiZGl2aWRlcjIiLCB0aXRsZTogIiIsIGlzRGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJidWxsZXRMaXN0IiwKICAgICAgICAgIGljb246ICJsdWNpZGU6bGlzdCIsCiAgICAgICAgICB0aXRsZTogIkJ1bGxldCBMaXN0IiwKICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUJ1bGxldExpc3QoKS5ydW4oKSwKICAgICAgICAgIGlzQWN0aXZlOiAoKSA9PiB0aGlzLmVkaXRvci5pc0FjdGl2ZSgiYnVsbGV0TGlzdCIpCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAib3JkZXJlZExpc3QiLAogICAgICAgICAgaWNvbjogImx1Y2lkZTpsaXN0T3JkZXJlZCIsCiAgICAgICAgICB0aXRsZTogIk51bWJlcmVkIExpc3QiLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlT3JkZXJlZExpc3QoKS5ydW4oKSwKICAgICAgICAgIGlzQWN0aXZlOiAoKSA9PiB0aGlzLmVkaXRvci5pc0FjdGl2ZSgib3JkZXJlZExpc3QiKQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogImJsb2NrcXVvdGUiLAogICAgICAgICAgaWNvbjogImx1Y2lkZTpxdW90ZSIsCiAgICAgICAgICB0aXRsZTogIlF1b3RlIiwKICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUJsb2NrcXVvdGUoKS5ydW4oKSwKICAgICAgICAgIGlzQWN0aXZlOiAoKSA9PiB0aGlzLmVkaXRvci5pc0FjdGl2ZSgiYmxvY2txdW90ZSIpCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiY29kZSIsCiAgICAgICAgICBpY29uOiAibHVjaWRlOmNvZGUiLAogICAgICAgICAgdGl0bGU6ICJDb2RlIiwKICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUNvZGUoKS5ydW4oKSwKICAgICAgICAgIGlzQWN0aXZlOiAoKSA9PiB0aGlzLmVkaXRvci5pc0FjdGl2ZSgiY29kZSIpCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiY29kZUJsb2NrIiwKICAgICAgICAgIGljb246ICJsdWNpZGU6ZmlsZUNvZGUiLAogICAgICAgICAgdGl0bGU6ICJDb2RlIEJsb2NrIiwKICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUNvZGVCbG9jaygpLnJ1bigpLAogICAgICAgICAgaXNBY3RpdmU6ICgpID0+IHRoaXMuZWRpdG9yLmlzQWN0aXZlKCJjb2RlQmxvY2siKQogICAgICAgIH0sCiAgICAgICAgeyBuYW1lOiAiZGl2aWRlcjMiLCB0aXRsZTogIiIsIGlzRGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJsaW5rIiwKICAgICAgICAgIGljb246ICJsdWNpZGU6bGluayIsCiAgICAgICAgICB0aXRsZTogIkFkZCBMaW5rIiwKICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy50b2dnbGVMaW5rKCksCiAgICAgICAgICBpc0FjdGl2ZTogKCkgPT4gdGhpcy5lZGl0b3IuaXNBY3RpdmUoImxpbmsiKQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogImFsaWduTGVmdCIsCiAgICAgICAgICBpY29uOiAibHVjaWRlOmFsaWduTGVmdCIsCiAgICAgICAgICB0aXRsZTogIkFsaWduIExlZnQiLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmVkaXRvci5jaGFpbigpLmZvY3VzKCkuc2V0VGV4dEFsaWduKCJsZWZ0IikucnVuKCksCiAgICAgICAgICBpc0FjdGl2ZTogKCkgPT4gdGhpcy5lZGl0b3IuaXNBY3RpdmUoeyB0ZXh0QWxpZ246ICJsZWZ0IiB9KQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogImFsaWduQ2VudGVyIiwKICAgICAgICAgIGljb246ICJsdWNpZGU6YWxpZ25DZW50ZXIiLAogICAgICAgICAgdGl0bGU6ICJBbGlnbiBDZW50ZXIiLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmVkaXRvci5jaGFpbigpLmZvY3VzKCkuc2V0VGV4dEFsaWduKCJjZW50ZXIiKS5ydW4oKSwKICAgICAgICAgIGlzQWN0aXZlOiAoKSA9PiB0aGlzLmVkaXRvci5pc0FjdGl2ZSh7IHRleHRBbGlnbjogImNlbnRlciIgfSkKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJhbGlnblJpZ2h0IiwKICAgICAgICAgIGljb246ICJsdWNpZGU6YWxpZ25SaWdodCIsCiAgICAgICAgICB0aXRsZTogIkFsaWduIFJpZ2h0IiwKICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpLnNldFRleHRBbGlnbigicmlnaHQiKS5ydW4oKSwKICAgICAgICAgIGlzQWN0aXZlOiAoKSA9PiB0aGlzLmVkaXRvci5pc0FjdGl2ZSh7IHRleHRBbGlnbjogInJpZ2h0IiB9KQogICAgICAgIH0sCiAgICAgICAgeyBuYW1lOiAiZGl2aWRlcjQiLCB0aXRsZTogIiIsIGlzRGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJ1bmRvIiwKICAgICAgICAgIGljb246ICJsdWNpZGU6dW5kbyIsCiAgICAgICAgICB0aXRsZTogIlVuZG8gKEN0cmwrWikiLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmVkaXRvci5jaGFpbigpLmZvY3VzKCkudW5kbygpLnJ1bigpCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAicmVkbyIsCiAgICAgICAgICBpY29uOiAibHVjaWRlOnJlZG8iLAogICAgICAgICAgdGl0bGU6ICJSZWRvIChDdHJsK1kpIiwKICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpLnJlZG8oKS5ydW4oKQogICAgICAgIH0KICAgICAgXTsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZCgpIHsKICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgdGhpcy50aXB0YXBCdW5kbGUgPSBhd2FpdCBEZWVzU2VydmljZUxpYkxvYWRlci5nZXRJbnN0YW5jZSgpLmxvYWRUaXB0YXAoKTsKICAgICAgdGhpcy5lZGl0b3JFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItY29udGVudCIpOwogICAgICB0aGlzLmxpbmtJbnB1dEVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmxpbmstaW5wdXQgaW5wdXQiKTsKICAgICAgdGhpcy5pbml0aWFsaXplRWRpdG9yKCk7CiAgICB9CiAgICBpbml0aWFsaXplRWRpdG9yKCkgewogICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAhdGhpcy50aXB0YXBCdW5kbGUpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCB7IEVkaXRvciwgU3RhcnRlcktpdCwgVW5kZXJsaW5lLCBUZXh0QWxpZ24sIExpbmssIFR5cG9ncmFwaHkgfSA9IHRoaXMudGlwdGFwQnVuZGxlOwogICAgICB0aGlzLmVkaXRvciA9IG5ldyBFZGl0b3IoewogICAgICAgIGVsZW1lbnQ6IHRoaXMuZWRpdG9yRWxlbWVudCwKICAgICAgICBleHRlbnNpb25zOiBbCiAgICAgICAgICBTdGFydGVyS2l0LmNvbmZpZ3VyZSh7CiAgICAgICAgICAgIGhlYWRpbmc6IHsKICAgICAgICAgICAgICBsZXZlbHM6IFsxLCAyLCAzXQogICAgICAgICAgICB9CiAgICAgICAgICB9KSwKICAgICAgICAgIFVuZGVybGluZS5jb25maWd1cmUoe30pLAogICAgICAgICAgVGV4dEFsaWduLmNvbmZpZ3VyZSh7CiAgICAgICAgICAgIHR5cGVzOiBbImhlYWRpbmciLCAicGFyYWdyYXBoIl0KICAgICAgICAgIH0pLAogICAgICAgICAgTGluay5jb25maWd1cmUoewogICAgICAgICAgICBvcGVuT25DbGljazogZmFsc2UsCiAgICAgICAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7CiAgICAgICAgICAgICAgY2xhc3M6ICJlZGl0b3ItbGluayIKICAgICAgICAgICAgfQogICAgICAgICAgfSksCiAgICAgICAgICBUeXBvZ3JhcGh5LmNvbmZpZ3VyZSh7fSkKICAgICAgICBdLAogICAgICAgIGNvbnRlbnQ6IHRoaXMudmFsdWUgfHwgKHRoaXMucGxhY2Vob2xkZXIgPyBgPHA+JHt0aGlzLnBsYWNlaG9sZGVyfTwvcD5gIDogIiIpLAogICAgICAgIG9uVXBkYXRlOiAoeyBlZGl0b3IgfSkgPT4gewogICAgICAgICAgdGhpcy52YWx1ZSA9IGVkaXRvci5nZXRIVE1MKCk7CiAgICAgICAgICB0aGlzLnVwZGF0ZVdvcmRDb3VudCgpOwogICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaW5wdXQiLCB7CiAgICAgICAgICAgIGRldGFpbDogeyB2YWx1ZTogdGhpcy52YWx1ZSB9LAogICAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgICAgfSkpOwogICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2hhbmdlIiwgewogICAgICAgICAgICBkZXRhaWw6IHsgdmFsdWU6IHRoaXMudmFsdWUgfSwKICAgICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICAgIH0pKTsKICAgICAgICB9LAogICAgICAgIG9uU2VsZWN0aW9uVXBkYXRlOiAoKSA9PiB7CiAgICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgICB9LAogICAgICAgIG9uRm9jdXM6ICgpID0+IHsKICAgICAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgICAgIH0sCiAgICAgICAgb25CbHVyOiAoKSA9PiB7CiAgICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLnVwZGF0ZVdvcmRDb3VudCgpOwogICAgfQogICAgdXBkYXRlV29yZENvdW50KCkgewogICAgICBpZiAoIXRoaXMuZWRpdG9yKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgdGV4dDkgPSB0aGlzLmVkaXRvci5nZXRUZXh0KCk7CiAgICAgIHRoaXMud29yZENvdW50ID0gdGV4dDkudHJpbSgpID8gdGV4dDkudHJpbSgpLnNwbGl0KC9ccysvKS5sZW5ndGggOiAwOwogICAgfQogICAgdG9nZ2xlTGluaygpIHsKICAgICAgaWYgKCF0aGlzLmVkaXRvcikKICAgICAgICByZXR1cm47CiAgICAgIGlmICh0aGlzLmVkaXRvci5pc0FjdGl2ZSgibGluayIpKSB7CiAgICAgICAgY29uc3QgaHJlZiA9IHRoaXMuZWRpdG9yLmdldEF0dHJpYnV0ZXMoImxpbmsiKS5ocmVmOwogICAgICAgIHRoaXMuc2hvd0xpbmtJbnB1dCA9IHRydWU7CiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICAgIGlmICh0aGlzLmxpbmtJbnB1dEVsZW1lbnQpIHsKICAgICAgICAgICAgdGhpcy5saW5rSW5wdXRFbGVtZW50LnZhbHVlID0gaHJlZiB8fCAiIjsKICAgICAgICAgICAgdGhpcy5saW5rSW5wdXRFbGVtZW50LmZvY3VzKCk7CiAgICAgICAgICAgIHRoaXMubGlua0lucHV0RWxlbWVudC5zZWxlY3QoKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnNob3dMaW5rSW5wdXQgPSB0cnVlOwogICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5saW5rSW5wdXRFbGVtZW50KSB7CiAgICAgICAgICAgIHRoaXMubGlua0lucHV0RWxlbWVudC52YWx1ZSA9ICIiOwogICAgICAgICAgICB0aGlzLmxpbmtJbnB1dEVsZW1lbnQuZm9jdXMoKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgc2F2ZUxpbmsoKSB7CiAgICAgIGlmICghdGhpcy5lZGl0b3IgfHwgIXRoaXMubGlua0lucHV0RWxlbWVudCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHVybCA9IHRoaXMubGlua0lucHV0RWxlbWVudC52YWx1ZTsKICAgICAgaWYgKHVybCkgewogICAgICAgIHRoaXMuZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5zZXRMaW5rKHsgaHJlZjogdXJsIH0pLnJ1bigpOwogICAgICB9CiAgICAgIHRoaXMuaGlkZUxpbmtJbnB1dCgpOwogICAgfQogICAgcmVtb3ZlTGluaygpIHsKICAgICAgaWYgKCF0aGlzLmVkaXRvcikKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMuZWRpdG9yLmNoYWluKCkuZm9jdXMoKS51bnNldExpbmsoKS5ydW4oKTsKICAgICAgdGhpcy5oaWRlTGlua0lucHV0KCk7CiAgICB9CiAgICBoaWRlTGlua0lucHV0KCkgewogICAgICB0aGlzLnNob3dMaW5rSW5wdXQgPSBmYWxzZTsKICAgICAgdGhpcy5lZGl0b3I/LmNvbW1hbmRzLmZvY3VzKCk7CiAgICB9CiAgICBoYW5kbGVMaW5rSW5wdXRLZXlkb3duKGUxMSkgewogICAgICBpZiAoZTExLmtleSA9PT0gIkVudGVyIikgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMuc2F2ZUxpbmsoKTsKICAgICAgfSBlbHNlIGlmIChlMTEua2V5ID09PSAiRXNjYXBlIikgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMuaGlkZUxpbmtJbnB1dCgpOwogICAgICB9CiAgICB9CiAgICBzZXRWYWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlMjsKICAgICAgaWYgKHRoaXMuZWRpdG9yICYmIHZhbHVlMiAhPT0gdGhpcy5lZGl0b3IuZ2V0SFRNTCgpKSB7CiAgICAgICAgdGhpcy5lZGl0b3IuY29tbWFuZHMuc2V0Q29udGVudCh2YWx1ZTIpOwogICAgICB9CiAgICB9CiAgICBnZXRWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMudmFsdWU7CiAgICB9CiAgICBjbGVhcigpIHsKICAgICAgdGhpcy5zZXRWYWx1ZSgiIik7CiAgICB9CiAgICBmb2N1cygpIHsKICAgICAgdGhpcy5lZGl0b3I/LmNvbW1hbmRzLmZvY3VzKCk7CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgaWYgKHRoaXMuZWRpdG9yKSB7CiAgICAgICAgdGhpcy5lZGl0b3IuZGVzdHJveSgpOwogICAgICB9CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczU4KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzSW5wdXRSaWNodGV4dDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtdGFncy9kZWVzLWlucHV0LXRhZ3MuZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgX2EzOwp2YXIgZGVtb0Z1bmM0MiA9ICgpID0+IGIyKF9hMyB8fCAoX2EzID0gX190ZW1wbGF0ZShbIlxuICA8ZGVlcy1kZW1vd3JhcHBlcj5cbiAgICA8c3R5bGU+XG4gICAgICAiLCAnXG4gICAgPC9zdHlsZT5cbiAgICBcbiAgICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+XG4gICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JywgIiAuc3VidGl0bGU9IiwgIj5cbiAgICAgICAgPGRlZXMtaW5wdXQtdGFnc1xuICAgICAgICAgIC5sYWJlbD0iLCAiXG4gICAgICAgICAgLnBsYWNlaG9sZGVyPSIsICJcbiAgICAgICAgICAudmFsdWU9IiwgIlxuICAgICAgICAgIC5kZXNjcmlwdGlvbj0iLCAiXG4gICAgICAgID48L2RlZXMtaW5wdXQtdGFncz5cbiAgICAgIDwvZGVlcy1wYW5lbD5cblxuICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSIsICIgLnN1YnRpdGxlPSIsICI+XG4gICAgICAgIDxkZWVzLWlucHV0LXRhZ3NcbiAgICAgICAgICAubGFiZWw9IiwgIlxuICAgICAgICAgIC5wbGFjZWhvbGRlcj0iLCAiXG4gICAgICAgICAgLnN1Z2dlc3Rpb25zPSIsICJcbiAgICAgICAgICAudmFsdWU9IiwgIlxuICAgICAgICAgIC5kZXNjcmlwdGlvbj0iLCAiXG4gICAgICAgID48L2RlZXMtaW5wdXQtdGFncz5cbiAgICAgIDwvZGVlcy1wYW5lbD5cblxuICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSIsICIgLnN1YnRpdGxlPSIsICc+XG4gICAgICAgIDxkaXYgY2xhc3M9ImdyaWQtbGF5b3V0Ij5cbiAgICAgICAgICA8ZGVlcy1pbnB1dC10YWdzXG4gICAgICAgICAgICAubGFiZWw9JywgIlxuICAgICAgICAgICAgLnBsYWNlaG9sZGVyPSIsICJcbiAgICAgICAgICAgIC5tYXhUYWdzPSIsICJcbiAgICAgICAgICAgIC52YWx1ZT0iLCAiXG4gICAgICAgICAgICAuZGVzY3JpcHRpb249IiwgIlxuICAgICAgICAgID48L2RlZXMtaW5wdXQtdGFncz5cbiAgICAgICAgICBcbiAgICAgICAgICA8ZGVlcy1pbnB1dC10YWdzXG4gICAgICAgICAgICAubGFiZWw9IiwgIlxuICAgICAgICAgICAgLnBsYWNlaG9sZGVyPSIsICJcbiAgICAgICAgICAgIC5tYXhUYWdzPSIsICJcbiAgICAgICAgICAgIC5zdWdnZXN0aW9ucz0iLCAiXG4gICAgICAgICAgICAudmFsdWU9IiwgIlxuICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSIsICJcbiAgICAgICAgICA+PC9kZWVzLWlucHV0LXRhZ3M+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kZWVzLXBhbmVsPlxuXG4gICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9IiwgIiAuc3VidGl0bGU9IiwgIj5cbiAgICAgICAgPGRlZXMtaW5wdXQtdGFnc1xuICAgICAgICAgIC5sYWJlbD0iLCAiXG4gICAgICAgICAgLnBsYWNlaG9sZGVyPSIsICJcbiAgICAgICAgICAucmVxdWlyZWQ9IiwgIlxuICAgICAgICAgIC5kZXNjcmlwdGlvbj0iLCAiXG4gICAgICAgID48L2RlZXMtaW5wdXQtdGFncz5cbiAgICAgIDwvZGVlcy1wYW5lbD5cblxuICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSIsICIgLnN1YnRpdGxlPSIsICI+XG4gICAgICAgIDxkZWVzLWlucHV0LXRhZ3NcbiAgICAgICAgICAubGFiZWw9IiwgIlxuICAgICAgICAgIC52YWx1ZT0iLCAiXG4gICAgICAgICAgLmRpc2FibGVkPSIsICJcbiAgICAgICAgICAuZGVzY3JpcHRpb249IiwgIlxuICAgICAgICA+PC9kZWVzLWlucHV0LXRhZ3M+XG4gICAgICA8L2RlZXMtcGFuZWw+XG5cbiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0iLCAiIC5zdWJ0aXRsZT0iLCAiPlxuICAgICAgICA8ZGVlcy1mb3JtPlxuICAgICAgICAgIDxkZWVzLWlucHV0LXRleHRcbiAgICAgICAgICAgIC5sYWJlbD0iLCAiXG4gICAgICAgICAgICAucGxhY2Vob2xkZXI9IiwgIlxuICAgICAgICAgICAgLnJlcXVpcmVkPSIsICJcbiAgICAgICAgICAgIC5rZXk9IiwgJ1xuICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD5cbiAgICAgICAgICBcbiAgICAgICAgICA8ZGl2IGNsYXNzPSJncmlkLWxheW91dCI+XG4gICAgICAgICAgICA8ZGVlcy1pbnB1dC10YWdzXG4gICAgICAgICAgICAgIC5sYWJlbD0nLCAiXG4gICAgICAgICAgICAgIC5wbGFjZWhvbGRlcj0iLCAiXG4gICAgICAgICAgICAgIC5yZXF1aXJlZD0iLCAiXG4gICAgICAgICAgICAgIC5rZXk9IiwgIlxuICAgICAgICAgICAgICAuc3VnZ2VzdGlvbnM9IiwgIlxuICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC10YWdzPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGVlcy1pbnB1dC10YWdzXG4gICAgICAgICAgICAgIC5sYWJlbD0iLCAiXG4gICAgICAgICAgICAgIC5wbGFjZWhvbGRlcj0iLCAiXG4gICAgICAgICAgICAgIC5rZXk9IiwgIlxuICAgICAgICAgICAgICAubWF4VGFncz0iLCAiXG4gICAgICAgICAgICAgIC5zdWdnZXN0aW9ucz0iLCAiXG4gICAgICAgICAgICA+PC9kZWVzLWlucHV0LXRhZ3M+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgXG4gICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dFxuICAgICAgICAgICAgLmxhYmVsPSIsICJcbiAgICAgICAgICAgIC5pbnB1dFR5cGU9IiwgIlxuICAgICAgICAgICAgLnBsYWNlaG9sZGVyPSIsICJcbiAgICAgICAgICAgIC5rZXk9IiwgIlxuICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD5cbiAgICAgICAgICBcbiAgICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdCAudGV4dD0iLCAiPjwvZGVlcy1mb3JtLXN1Ym1pdD5cbiAgICAgICAgPC9kZWVzLWZvcm0+XG4gICAgICA8L2RlZXMtcGFuZWw+XG5cbiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0iLCAiIC5zdWJ0aXRsZT0iLCAnPlxuICAgICAgICA8ZGVlcy1pbnB1dC10YWdzXG4gICAgICAgICAgaWQ9ImludGVyYWN0aXZlLXRhZ3MiXG4gICAgICAgICAgLmxhYmVsPScsICJcbiAgICAgICAgICAucGxhY2Vob2xkZXI9IiwgIlxuICAgICAgICAgIC5zdWdnZXN0aW9ucz0iLCAiXG4gICAgICAgICAgQGNoYW5nZT0iLCBgCiAgICAgICAgPjwvZGVlcy1pbnB1dC10YWdzPgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9InRhZy1wcmV2aWV3IiBpZD0idGFncy1wcmV2aWV3Ij4KICAgICAgICAgIDxlbSBzdHlsZT0iY29sb3I6ICM5OTk7Ij5ObyB0YWdzIGFkZGVkIHlldC4uLjwvZW0+CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0ib3V0cHV0LXByZXZpZXciIGlkPSJ0YWdzLWpzb24iPgogICAgICAgICAgPGVtPkpTT04gb3V0cHV0IHdpbGwgYXBwZWFyIGhlcmUuLi48L2VtPgogICAgICAgIDwvZGl2PgogICAgICAgIAogICAgICAgIDxzY3JpcHQ+CiAgICAgICAgICAvLyBVcGRhdGUgSlNPTiBwcmV2aWV3CiAgICAgICAgICBjb25zdCB0YWdzSW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaW50ZXJhY3RpdmUtdGFncycpOwogICAgICAgICAgdGFnc0lucHV0Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4gewogICAgICAgICAgICBjb25zdCBqc29uUHJldmlldyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0YWdzLWpzb24nKTsKICAgICAgICAgICAgaWYgKGpzb25QcmV2aWV3KSB7CiAgICAgICAgICAgICAganNvblByZXZpZXcudGV4dENvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShlLmRldGFpbC52YWx1ZSwgbnVsbCwgMik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIDxcL3NjcmlwdD4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kaXY+CiAgPC9kZWVzLWRlbW93cmFwcGVyPgpgXSkpLCBpYAogICAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMjRweDsKICAgICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgICBtYXgtd2lkdGg6IDEyMDBweDsKICAgICAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBkZWVzLXBhbmVsIHsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGRlZXMtcGFuZWw6bGFzdC1jaGlsZCB7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuZ3JpZC1sYXlvdXQgewogICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsKICAgICAgICAgIGdhcDogMTZweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgICAgICAgICAuZ3JpZC1sYXlvdXQgewogICAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLm91dHB1dC1wcmV2aWV3IHsKICAgICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgICAgYmFja2dyb3VuZDogI2YzZjRmNjsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICAgIGNvbG9yOiAjMzc0MTUxOwogICAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOwogICAgICAgICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgICAub3V0cHV0LXByZXZpZXcgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjMmMyYzJjOwogICAgICAgICAgICBjb2xvcjogI2U0ZTRlNzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnRhZy1wcmV2aWV3IHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgICBnYXA6IDhweDsKICAgICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAjZjlmYWZiOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgbWluLWhlaWdodDogNDBweDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIEBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsKICAgICAgICAgIC50YWctcHJldmlldyB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICMxZjI5Mzc7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC50YWctcHJldmlldy1pdGVtIHsKICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgIHBhZGRpbmc6IDRweCAxMnB4OwogICAgICAgICAgYmFja2dyb3VuZDogI2UwZTdmZjsKICAgICAgICAgIGNvbG9yOiAjNDMzOGNhOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewogICAgICAgICAgLnRhZy1wcmV2aWV3LWl0ZW0gewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjMzEyZTgxOwogICAgICAgICAgICBjb2xvcjogI2M3ZDJmZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIGAsICIxLiBCYXNpYyBUYWdzIElucHV0IiwgIlNpbXBsZSB0YWcgaW5wdXQgd2l0aCBjb21tb24gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIiwgIlByb2dyYW1taW5nIExhbmd1YWdlcyIsICJBZGQgYSBsYW5ndWFnZS4uLiIsIFsiSmF2YVNjcmlwdCIsICJUeXBlU2NyaXB0IiwgIlB5dGhvbiIsICJHbyJdLCAiUHJlc3MgRW50ZXIgb3IgY29tbWEgdG8gYWRkIHRhZ3MiLCAiMi4gVGFncyB3aXRoIFN1Z2dlc3Rpb25zIiwgIkF1dG8tY29tcGxldGUgc3VnZ2VzdGlvbnMgZm9yIGZhc3RlciBpbnB1dCIsICJUZWNoIFN0YWNrIiwgIlR5cGUgdG8gc2VlIHN1Z2dlc3Rpb25zLi4uIiwgWwogICJSZWFjdCIsCiAgIlZ1ZSIsCiAgIkFuZ3VsYXIiLAogICJTdmVsdGUiLAogICJMaXQiLAogICJOZXh0LmpzIiwKICAiTnV4dCIsCiAgIlN2ZWx0ZUtpdCIsCiAgIk5vZGUuanMiLAogICJEZW5vIiwKICAiQnVuIiwKICAiRXhwcmVzcyIsCiAgIkZhc3RpZnkiLAogICJOZXN0LmpzIiwKICAiS29hIiwKICAiTW9uZ29EQiIsCiAgIlBvc3RncmVTUUwiLAogICJSZWRpcyIsCiAgIk15U1FMIiwKICAiU1FMaXRlIiwKICAiQ2Fzc2FuZHJhIiwKICAiRG9ja2VyIiwKICAiS3ViZXJuZXRlcyIsCiAgIkFXUyIsCiAgIkF6dXJlIiwKICAiR0NQIiwKICAiVmVyY2VsIiwKICAiTmV0bGlmeSIKXSwgWyJSZWFjdCIsICJOb2RlLmpzIiwgIlBvc3RncmVTUUwiLCAiRG9ja2VyIl0sICJTdGFydCB0eXBpbmcgdG8gc2VlIHN1Z2dlc3Rpb25zIGZyb20gcG9wdWxhciB0ZWNobm9sb2dpZXMiLCAiMy4gTGltaXRlZCBUYWdzIiwgIlJlc3RyaWN0IHRoZSBudW1iZXIgb2YgdGFncyB1c2VycyBjYW4gYWRkIiwgIlRvcCAzIFNraWxscyIsICJBZGQgdXAgdG8gMyBza2lsbHMuLi4iLCAzLCBbIkRlc2lnbiIsICJEZXZlbG9wbWVudCJdLCAiTWF4aW11bSAzIHRhZ3MgYWxsb3dlZCIsICJDYXRlZ29yaWVzIChNYXggNSkiLCAiU2VsZWN0IGNhdGVnb3JpZXMuLi4iLCA1LCBbIkJsb2ciLCAiVHV0b3JpYWwiLCAiTmV3cyIsICJSZXZpZXciLCAiR3VpZGUiLCAiQ2FzZSBTdHVkeSIsICJJbnRlcnZpZXciXSwgWyJUdXRvcmlhbCIsICJHdWlkZSJdLCAiQ2hvb3NlIHVwIHRvIDUgY2F0ZWdvcmllcyIsICI0LiBSZXF1aXJlZCAmIFZhbGlkYXRpb24iLCAiVGFncyBpbnB1dCB3aXRoIHZhbGlkYXRpb24gcmVxdWlyZW1lbnRzIiwgIlByb2plY3QgVGFncyIsICJBZGQgYXQgbGVhc3Qgb25lIHRhZy4uLiIsIHRydWUsICJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIC0gYWRkIGF0IGxlYXN0IG9uZSB0YWciLCAiNS4gRGlzYWJsZWQgU3RhdGUiLCAiUmVhZC1vbmx5IHRhZ3MgZGlzcGxheSIsICJTeXN0ZW0gVGFncyIsIFsiU3lzdGVtIiwgIlByb3RlY3RlZCIsICJSZWFkLU9ubHkiLCAiQXJjaGl2ZSJdLCB0cnVlLCAiVGhlc2UgdGFncyBjYW5ub3QgYmUgbW9kaWZpZWQiLCAiNi4gRm9ybSBJbnRlZ3JhdGlvbiIsICJUYWdzIGlucHV0IHdvcmtpbmcgd2l0aGluIGEgZm9ybSBjb250ZXh0IiwgIlByb2plY3QgTmFtZSIsICJNeSBBd2Vzb21lIFByb2plY3QiLCB0cnVlLCAibmFtZSIsICJUZWNobm9sb2dpZXMgVXNlZCIsICJBZGQgdGVjaG5vbG9naWVzLi4uIiwgdHJ1ZSwgInRlY2hub2xvZ2llcyIsIFsKICAiVHlwZVNjcmlwdCIsCiAgIkphdmFTY3JpcHQiLAogICJQeXRob24iLAogICJHbyIsCiAgIlJ1c3QiLAogICJSZWFjdCIsCiAgIlZ1ZSIsCiAgIkFuZ3VsYXIiLAogICJTdmVsdGUiLAogICJOb2RlLmpzIiwKICAiRGVubyIsCiAgIkV4cHJlc3MiLAogICJGYXN0QVBJIgpdLCAiUHJvamVjdCBUYWdzIiwgIkFkZCBkZXNjcmlwdGl2ZSB0YWdzLi4uIiwgInRhZ3MiLCAxMCwgWwogICJmcm9udGVuZCIsCiAgImJhY2tlbmQiLAogICJmdWxsc3RhY2siLAogICJtb2JpbGUiLAogICJkZXNrdG9wIiwKICAid2ViIiwKICAiYXBpIiwKICAiZGF0YWJhc2UiLAogICJkZXZvcHMiLAogICJ1aS91eCIsCiAgIm9wZW5zb3VyY2UiLAogICJzYWFzIiwKICAiZW50ZXJwcmlzZSIsCiAgInN0YXJ0dXAiCl0sICJEZXNjcmlwdGlvbiIsICJ0ZXh0YXJlYSIsICJEZXNjcmliZSB5b3VyIHByb2plY3QuLi4iLCAiZGVzY3JpcHRpb24iLCAiQ3JlYXRlIFByb2plY3QiLCAiNy4gSW50ZXJhY3RpdmUgRGVtbyIsICJBZGQgdGFncyBhbmQgc2VlIHRoZW0gY29sbGVjdGVkIGluIHJlYWwtdGltZSIsICJZb3VyIEludGVyZXN0cyIsICJUeXBlIHlvdXIgaW50ZXJlc3RzLi4uIiwgWwogICJNdXNpYyIsCiAgIk1vdmllcyIsCiAgIkJvb2tzIiwKICAiVHJhdmVsIiwKICAiUGhvdG9ncmFwaHkiLAogICJDb29raW5nIiwKICAiR2FtaW5nIiwKICAiU3BvcnRzIiwKICAiQXJ0IiwKICAiVGVjaG5vbG9neSIsCiAgIkZhc2hpb24iLAogICJGaXRuZXNzIiwKICAiTmF0dXJlIiwKICAiU2NpZW5jZSIsCiAgIkhpc3RvcnkiCl0sIChlMTEpID0+IHsKICBjb25zdCBwcmV2aWV3ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3RhZ3MtcHJldmlldyIpOwogIGNvbnN0IHRhZ3MgPSBlMTEuZGV0YWlsLnZhbHVlOwogIGlmIChwcmV2aWV3KSB7CiAgICBpZiAodGFncy5sZW5ndGggPT09IDApIHsKICAgICAgcHJldmlldy5pbm5lckhUTUwgPSAnPGVtIHN0eWxlPSJjb2xvcjogIzk5OTsiPk5vIHRhZ3MgYWRkZWQgeWV0Li4uPC9lbT4nOwogICAgfSBlbHNlIHsKICAgICAgcHJldmlldy5pbm5lckhUTUwgPSB0YWdzLm1hcCgodGFnKSA9PiBgPHNwYW4gY2xhc3M9InRhZy1wcmV2aWV3LWl0ZW0iPiR7dGFnfTwvc3Bhbj5gKS5qb2luKCIiKTsKICAgIH0KICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtdGFncy9kZWVzLWlucHV0LXRhZ3MuanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF9kZWVzX2ljb24oKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlNTggPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczU5ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzSW5wdXRUYWdzID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1pbnB1dC10YWdzIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNJbnB1dEJhc2U7CiAgbGV0IF92YWx1ZV9kZWNvcmF0b3JzOwogIGxldCBfdmFsdWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWx1ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcGxhY2Vob2xkZXJfZGVjb3JhdG9yczsKICBsZXQgX3BsYWNlaG9sZGVyX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcGxhY2Vob2xkZXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21heFRhZ3NfZGVjb3JhdG9yczsKICBsZXQgX21heFRhZ3NfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYXhUYWdzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zdWdnZXN0aW9uc19kZWNvcmF0b3JzOwogIGxldCBfc3VnZ2VzdGlvbnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zdWdnZXN0aW9uc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW5wdXRWYWx1ZV9kZWNvcmF0b3JzOwogIGxldCBfaW5wdXRWYWx1ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lucHV0VmFsdWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dTdWdnZXN0aW9uc19kZWNvcmF0b3JzOwogIGxldCBfc2hvd1N1Z2dlc3Rpb25zX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1N1Z2dlc3Rpb25zX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oaWdobGlnaHRlZFN1Z2dlc3Rpb25JbmRleF9kZWNvcmF0b3JzOwogIGxldCBfaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oaWdobGlnaHRlZFN1Z2dlc3Rpb25JbmRleF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsaWRhdGlvblRleHRfZGVjb3JhdG9yczsKICBsZXQgX3ZhbGlkYXRpb25UZXh0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsaWRhdGlvblRleHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0lucHV0VGFnczIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF92YWx1ZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfcGxhY2Vob2xkZXJfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9tYXhUYWdzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfc3VnZ2VzdGlvbnNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX2lucHV0VmFsdWVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3Nob3dTdWdnZXN0aW9uc19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXhfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3ZhbGlkYXRpb25UZXh0X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfX2VzRGVjb3JhdGU1OCh0aGlzLCBudWxsLCBfdmFsdWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmFsdWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInZhbHVlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZhbHVlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52YWx1ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF92YWx1ZV9pbml0aWFsaXplcnMsIF92YWx1ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU4KHRoaXMsIG51bGwsIF9wbGFjZWhvbGRlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwbGFjZWhvbGRlciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicGxhY2Vob2xkZXIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucGxhY2Vob2xkZXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnBsYWNlaG9sZGVyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3BsYWNlaG9sZGVyX2luaXRpYWxpemVycywgX3BsYWNlaG9sZGVyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTgodGhpcywgbnVsbCwgX21heFRhZ3NfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWF4VGFncyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWF4VGFncyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYXhUYWdzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tYXhUYWdzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21heFRhZ3NfaW5pdGlhbGl6ZXJzLCBfbWF4VGFnc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU4KHRoaXMsIG51bGwsIF9zdWdnZXN0aW9uc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzdWdnZXN0aW9ucyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic3VnZ2VzdGlvbnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc3VnZ2VzdGlvbnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnN1Z2dlc3Rpb25zID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3N1Z2dlc3Rpb25zX2luaXRpYWxpemVycywgX3N1Z2dlc3Rpb25zX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTgodGhpcywgbnVsbCwgX2lucHV0VmFsdWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaW5wdXRWYWx1ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaW5wdXRWYWx1ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pbnB1dFZhbHVlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pbnB1dFZhbHVlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lucHV0VmFsdWVfaW5pdGlhbGl6ZXJzLCBfaW5wdXRWYWx1ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU4KHRoaXMsIG51bGwsIF9zaG93U3VnZ2VzdGlvbnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2hvd1N1Z2dlc3Rpb25zIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93U3VnZ2VzdGlvbnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2hvd1N1Z2dlc3Rpb25zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaG93U3VnZ2VzdGlvbnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd1N1Z2dlc3Rpb25zX2luaXRpYWxpemVycywgX3Nob3dTdWdnZXN0aW9uc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU4KHRoaXMsIG51bGwsIF9oaWdobGlnaHRlZFN1Z2dlc3Rpb25JbmRleF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJoaWdobGlnaHRlZFN1Z2dlc3Rpb25JbmRleCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmhpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2hpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4X2luaXRpYWxpemVycywgX2hpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTgodGhpcywgbnVsbCwgX3ZhbGlkYXRpb25UZXh0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZhbGlkYXRpb25UZXh0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ2YWxpZGF0aW9uVGV4dCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai52YWxpZGF0aW9uVGV4dCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudmFsaWRhdGlvblRleHQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdmFsaWRhdGlvblRleHRfaW5pdGlhbGl6ZXJzLCBfdmFsaWRhdGlvblRleHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1OChudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNJbnB1dFRhZ3MyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIC8vIFNUQVRJQwogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzQyOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIklucHV0Il07CiAgICAjdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX3ZhbHVlX2luaXRpYWxpemVycywgW10pOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCB2YWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcGxhY2Vob2xkZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF92YWx1ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX3BsYWNlaG9sZGVyX2luaXRpYWxpemVycywgIkFkZCB0YWdzLi4uIikpOwogICAgZ2V0IHBsYWNlaG9sZGVyKCkgewogICAgICByZXR1cm4gdGhpcy4jcGxhY2Vob2xkZXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwbGFjZWhvbGRlcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jcGxhY2Vob2xkZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtYXhUYWdzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfcGxhY2Vob2xkZXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9tYXhUYWdzX2luaXRpYWxpemVycywgMCkpOwogICAgZ2V0IG1heFRhZ3MoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtYXhUYWdzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICAvLyAwIG1lYW5zIHVubGltaXRlZAogICAgc2V0IG1heFRhZ3ModmFsdWUyKSB7CiAgICAgIHRoaXMuI21heFRhZ3NfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzdWdnZXN0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX21heFRhZ3NfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9zdWdnZXN0aW9uc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgc3VnZ2VzdGlvbnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzdWdnZXN0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHN1Z2dlc3Rpb25zKHZhbHVlMikgewogICAgICB0aGlzLiNzdWdnZXN0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lucHV0VmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9zdWdnZXN0aW9uc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX2lucHV0VmFsdWVfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGlucHV0VmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpbnB1dFZhbHVlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaW5wdXRWYWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaW5wdXRWYWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dTdWdnZXN0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX2lucHV0VmFsdWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9zaG93U3VnZ2VzdGlvbnNfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHNob3dTdWdnZXN0aW9ucygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dTdWdnZXN0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dTdWdnZXN0aW9ucyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2hvd1N1Z2dlc3Rpb25zX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9zaG93U3VnZ2VzdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9oaWdobGlnaHRlZFN1Z2dlc3Rpb25JbmRleF9pbml0aWFsaXplcnMsIC0xKSk7CiAgICBnZXQgaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXgoKSB7CiAgICAgIHJldHVybiB0aGlzLiNoaWdobGlnaHRlZFN1Z2dlc3Rpb25JbmRleF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGhpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4KHZhbHVlMikgewogICAgICB0aGlzLiNoaWdobGlnaHRlZFN1Z2dlc3Rpb25JbmRleF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3ZhbGlkYXRpb25UZXh0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXhfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF92YWxpZGF0aW9uVGV4dF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgdmFsaWRhdGlvblRleHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWxpZGF0aW9uVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbGlkYXRpb25UZXh0KHZhbHVlMikgewogICAgICB0aGlzLiN2YWxpZGF0aW9uVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICAuLi5EZWVzSW5wdXRCYXNlLmJhc2VTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsICdSb2JvdG8nLCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuaW5wdXQtd3JhcHBlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC50YWdzLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDZweDsKICAgICAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgICAgICBtaW4taGVpZ2h0OiA0MHB4OwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBjdXJzb3I6IHRleHQ7CiAgICAgIH0KCiAgICAgIC50YWdzLWNvbnRhaW5lcjpob3Zlcjpub3QoLmRpc2FibGVkKSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNzkuOCUpIiwgImhzbCgwIDAlIDIwLjklKSIpfTsKICAgICAgfQoKICAgICAgLnRhZ3MtY29udGFpbmVyOmZvY3VzLXdpdGhpbiB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlIC8gMC4xKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUgLyAwLjEpIil9OwogICAgICB9CgogICAgICAudGFncy1jb250YWluZXIuZGlzYWJsZWQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NS4xJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIC50YWcgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgICAgcGFkZGluZzogMnB4IDhweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAyMC4yJSA2NS4xJSAvIDAuMikiLCAiaHNsKDIxNSAyMC4yJSAzNS4xJSAvIDAuMikiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDI2LjclKSIsICJoc2woMjE3LjkgMTAuNiUgNzQuOSUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDIwLjIlIDY1LjElIC8gMC4zKSIsICJoc2woMjE1IDIwLjIlIDM1LjElIC8gMC4zKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE4cHg7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgYW5pbWF0aW9uOiB0YWdBcHBlYXIgMC4xNXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyB0YWdBcHBlYXIgewogICAgICAgIGZyb20gewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk1KTsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICAgIHRvIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7CiAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLnRhZy1yZW1vdmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB3aWR0aDogMTRweDsKICAgICAgICBoZWlnaHQ6IDE0cHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA0Ni43JSkiLCAiaHNsKDIxNy45IDEwLjYlIDU0LjklKSIpfTsKICAgICAgfQoKICAgICAgLnRhZy1yZW1vdmU6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAwJSAvIDAuMDgpIiwgImhzbCgwIDAlIDEwMCUgLyAwLjA4KSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgMjYuNyUpIiwgImhzbCgyMTcuOSAxMC42JSA3NC45JSkiKX07CiAgICAgIH0KCiAgICAgIC50YWctcmVtb3ZlIGRlZXMtaWNvbiB7CiAgICAgICAgd2lkdGg6IDEwcHg7CiAgICAgICAgaGVpZ2h0OiAxMHB4OwogICAgICB9CgogICAgICAudGFnLWlucHV0IHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG1pbi13aWR0aDogMTIwcHg7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk1JSkiKX07CiAgICAgICAgcGFkZGluZzogMnB4IDRweDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfQoKICAgICAgLnRhZy1pbnB1dDo6cGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNjMuOSUpIiwgImhzbCgwIDAlIDQ1LjElKSIpfTsKICAgICAgfQoKICAgICAgLnRhZy1pbnB1dDpkaXNhYmxlZCB7CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgfQoKICAgICAgLyogU3VnZ2VzdGlvbnMgZHJvcGRvd24gKi8KICAgICAgLnN1Z2dlc3Rpb25zLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuc3VnZ2VzdGlvbnMtZHJvcGRvd24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDEwMCU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDMuOSUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBib3gtc2hhZG93OiAwIDRweCA2cHggLTFweCBoc2woMCAwJSAwJSAvIDAuMSksIDAgMnB4IDRweCAtMnB4IGhzbCgwIDAlIDAlIC8gMC4xKTsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHotaW5kZXg6IDEwMDA7CiAgICAgIH0KCiAgICAgIC5zdWdnZXN0aW9uIHsKICAgICAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTUlKSIsICJoc2woMCAwJSA5MCUpIil9OwogICAgICB9CgogICAgICAuc3VnZ2VzdGlvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk1LjElKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgIH0KCiAgICAgIC5zdWdnZXN0aW9uLmhpZ2hsaWdodGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk1JSkiKX07CiAgICAgIH0KCiAgICAgIC8qIFZhbGlkYXRpb24gc3R5bGVzICovCiAgICAgIC52YWxpZGF0aW9uLW1lc3NhZ2UgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzIuMiUgNTAuNiUpIiwgImhzbCgwIDYyLjglIDMwLjYlKSIpfTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWFyZ2luLXRvcDogNnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICAgIH0KCiAgICAgIC8qIERlc2NyaXB0aW9uIHN0eWxlcyAqLwogICAgICAuZGVzY3JpcHRpb24gewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDU2LjklKSIsICJoc2woMjE1IDIwLjIlIDU1LjElKSIpfTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWFyZ2luLXRvcDogNnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICAgIH0KCiAgICAgIC8qIFNjcm9sbGJhciBzdHlsaW5nICovCiAgICAgIC5zdWdnZXN0aW9ucy1kcm9wZG93bjo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIHdpZHRoOiA4cHg7CiAgICAgIH0KCiAgICAgIC5zdWdnZXN0aW9ucy1kcm9wZG93bjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAuc3VnZ2VzdGlvbnMtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgIH0KCiAgICAgIC5zdWdnZXN0aW9ucy1kcm9wZG93bjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA3OS44JSkiLCAiaHNsKDAgMCUgMjAuOSUpIil9OwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICBjb25zdCBmaWx0ZXJlZFN1Z2dlc3Rpb25zID0gdGhpcy5zdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+ICF0aGlzLnZhbHVlLmluY2x1ZGVzKHN1Z2dlc3Rpb24pICYmIHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLmlucHV0VmFsdWUudG9Mb3dlckNhc2UoKSkpOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImlucHV0LXdyYXBwZXIiPgogICAgICAgICR7dGhpcy5sYWJlbCA/IGIyYDxkZWVzLWxhYmVsIC5sYWJlbD0ke3RoaXMubGFiZWx9IC5yZXF1aXJlZD0ke3RoaXMucmVxdWlyZWR9PjwvZGVlcy1sYWJlbD5gIDogIiJ9CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0ic3VnZ2VzdGlvbnMtY29udGFpbmVyIj4KICAgICAgICAgIDxkaXYKICAgICAgICAgICAgY2xhc3M9InRhZ3MtY29udGFpbmVyICR7dGhpcy5kaXNhYmxlZCA/ICJkaXNhYmxlZCIgOiAiIn0iCiAgICAgICAgICAgIEBjbGljaz0ke3RoaXMuaGFuZGxlQ29udGFpbmVyQ2xpY2t9CiAgICAgICAgICA+CiAgICAgICAgICAgICR7dGhpcy52YWx1ZS5tYXAoKHRhZykgPT4gYjJgCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFnIj4KICAgICAgICAgICAgICAgIDxzcGFuPiR7dGFnfTwvc3Bhbj4KICAgICAgICAgICAgICAgICR7IXRoaXMuZGlzYWJsZWQgPyBiMmAKICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFnLXJlbW92ZSIgQGNsaWNrPSR7KGUxMSkgPT4gdGhpcy5yZW1vdmVUYWcoZTExLCB0YWcpfT4KICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTp4In0+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgYCA6ICIifQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgKX0KICAgICAgICAgICAgCiAgICAgICAgICAgICR7IXRoaXMuZGlzYWJsZWQgJiYgKCF0aGlzLm1heFRhZ3MgfHwgdGhpcy52YWx1ZS5sZW5ndGggPCB0aGlzLm1heFRhZ3MpID8gYjJgCiAgICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IgogICAgICAgICAgICAgICAgY2xhc3M9InRhZy1pbnB1dCIKICAgICAgICAgICAgICAgIC5wbGFjZWhvbGRlcj0ke3RoaXMucGxhY2Vob2xkZXJ9CiAgICAgICAgICAgICAgICAudmFsdWU9JHt0aGlzLmlucHV0VmFsdWV9CiAgICAgICAgICAgICAgICBAaW5wdXQ9JHt0aGlzLmhhbmRsZUlucHV0fQogICAgICAgICAgICAgICAgQGtleWRvd249JHt0aGlzLmhhbmRsZUtleURvd259CiAgICAgICAgICAgICAgICBAZm9jdXM9JHt0aGlzLmhhbmRsZUZvY3VzfQogICAgICAgICAgICAgICAgQGJsdXI9JHt0aGlzLmhhbmRsZUJsdXJ9CiAgICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHt0aGlzLmRpc2FibGVkfQogICAgICAgICAgICAgIC8+CiAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICR7dGhpcy5zaG93U3VnZ2VzdGlvbnMgJiYgZmlsdGVyZWRTdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Z2dlc3Rpb25zLWRyb3Bkb3duIj4KICAgICAgICAgICAgICAke2ZpbHRlcmVkU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uLCBpbmRleDIpID0+IGIyYAogICAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgICBjbGFzcz0ic3VnZ2VzdGlvbiAke2luZGV4MiA9PT0gdGhpcy5oaWdobGlnaHRlZFN1Z2dlc3Rpb25JbmRleCA/ICJoaWdobGlnaHRlZCIgOiAiIn0iCiAgICAgICAgICAgICAgICAgIEBtb3VzZWRvd249JHsoZTExKSA9PiB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdGhpcy5hZGRUYWcoc3VnZ2VzdGlvbik7CiAgICAgIH19CiAgICAgICAgICAgICAgICAgIEBtb3VzZWVudGVyPSR7KCkgPT4gdGhpcy5oaWdobGlnaHRlZFN1Z2dlc3Rpb25JbmRleCA9IGluZGV4Mn0KICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgJHtzdWdnZXN0aW9ufQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgYCl9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYCA6ICIifQogICAgICAgIDwvZGl2PgoKICAgICAgICAke3RoaXMudmFsaWRhdGlvblRleHQgPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9InZhbGlkYXRpb24tbWVzc2FnZSI+JHt0aGlzLnZhbGlkYXRpb25UZXh0fTwvZGl2PgogICAgICAgIGAgOiAiIn0KICAgICAgICAKICAgICAgICAke3RoaXMuZGVzY3JpcHRpb24gPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9ImRlc2NyaXB0aW9uIj4ke3RoaXMuZGVzY3JpcHRpb259PC9kaXY+CiAgICAgICAgYCA6ICIifQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBoYW5kbGVDb250YWluZXJDbGljayhlMTEpIHsKICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnRhZy1pbnB1dCIpOwogICAgICBpZiAoaW5wdXQgJiYgZTExLnRhcmdldCAhPT0gaW5wdXQpIHsKICAgICAgICBpbnB1dC5mb2N1cygpOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVJbnB1dChlMTEpIHsKICAgICAgY29uc3QgaW5wdXQgPSBlMTEudGFyZ2V0OwogICAgICB0aGlzLmlucHV0VmFsdWUgPSBpbnB1dC52YWx1ZTsKICAgICAgaWYgKHRoaXMuaW5wdXRWYWx1ZS5pbmNsdWRlcygiLCIpIHx8IHRoaXMuaW5wdXRWYWx1ZS5pbmNsdWRlcygiOyIpKSB7CiAgICAgICAgY29uc3QgdGFnID0gdGhpcy5pbnB1dFZhbHVlLnJlcGxhY2UoL1ssO10vZywgIiIpLnRyaW0oKTsKICAgICAgICBpZiAodGFnKSB7CiAgICAgICAgICB0aGlzLmFkZFRhZyh0YWcpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaGFuZGxlS2V5RG93bihlMTEpIHsKICAgICAgY29uc3QgaW5wdXQgPSBlMTEudGFyZ2V0OwogICAgICBpZiAoZTExLmtleSA9PT0gIkVudGVyIikgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4ID49IDAgJiYgdGhpcy5zaG93U3VnZ2VzdGlvbnMpIHsKICAgICAgICAgIGNvbnN0IGZpbHRlcmVkU3VnZ2VzdGlvbnMgPSB0aGlzLnN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gIXRoaXMudmFsdWUuaW5jbHVkZXMoc3VnZ2VzdGlvbikgJiYgc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuaW5wdXRWYWx1ZS50b0xvd2VyQ2FzZSgpKSk7CiAgICAgICAgICBpZiAoZmlsdGVyZWRTdWdnZXN0aW9uc1t0aGlzLmhpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4XSkgewogICAgICAgICAgICB0aGlzLmFkZFRhZyhmaWx0ZXJlZFN1Z2dlc3Rpb25zW3RoaXMuaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXhdKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW5wdXRWYWx1ZS50cmltKCkpIHsKICAgICAgICAgIHRoaXMuYWRkVGFnKHRoaXMuaW5wdXRWYWx1ZS50cmltKCkpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChlMTEua2V5ID09PSAiQmFja3NwYWNlIiAmJiAhdGhpcy5pbnB1dFZhbHVlICYmIHRoaXMudmFsdWUubGVuZ3RoID4gMCkgewogICAgICAgIHRoaXMucmVtb3ZlVGFnKGUxMSwgdGhpcy52YWx1ZVt0aGlzLnZhbHVlLmxlbmd0aCAtIDFdKTsKICAgICAgfSBlbHNlIGlmIChlMTEua2V5ID09PSAiQXJyb3dEb3duIiAmJiB0aGlzLnNob3dTdWdnZXN0aW9ucykgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNvbnN0IGZpbHRlcmVkQ291bnQgPSB0aGlzLnN1Z2dlc3Rpb25zLmZpbHRlcigoczkpID0+ICF0aGlzLnZhbHVlLmluY2x1ZGVzKHM5KSAmJiBzOS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuaW5wdXRWYWx1ZS50b0xvd2VyQ2FzZSgpKSkubGVuZ3RoOwogICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXggPSBNYXRoLm1pbih0aGlzLmhpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4ICsgMSwgZmlsdGVyZWRDb3VudCAtIDEpOwogICAgICB9IGVsc2UgaWYgKGUxMS5rZXkgPT09ICJBcnJvd1VwIiAmJiB0aGlzLnNob3dTdWdnZXN0aW9ucykgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXggPSBNYXRoLm1heCh0aGlzLmhpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4IC0gMSwgMCk7CiAgICAgIH0gZWxzZSBpZiAoZTExLmtleSA9PT0gIkVzY2FwZSIpIHsKICAgICAgICB0aGlzLnNob3dTdWdnZXN0aW9ucyA9IGZhbHNlOwogICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXggPSAtMTsKICAgICAgfQogICAgfQogICAgaGFuZGxlRm9jdXMoKSB7CiAgICAgIGlmICh0aGlzLnN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLnNob3dTdWdnZXN0aW9ucyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZUJsdXIoKSB7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIHRoaXMuc2hvd1N1Z2dlc3Rpb25zID0gZmFsc2U7CiAgICAgICAgdGhpcy5oaWdobGlnaHRlZFN1Z2dlc3Rpb25JbmRleCA9IC0xOwogICAgICB9LCAyMDApOwogICAgfQogICAgYWRkVGFnKHRhZykgewogICAgICBpZiAoIXRhZyB8fCB0aGlzLnZhbHVlLmluY2x1ZGVzKHRhZykpCiAgICAgICAgcmV0dXJuOwogICAgICBpZiAodGhpcy5tYXhUYWdzICYmIHRoaXMudmFsdWUubGVuZ3RoID49IHRoaXMubWF4VGFncykKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMudmFsdWUgPSBbLi4udGhpcy52YWx1ZSwgdGFnXTsKICAgICAgdGhpcy5pbnB1dFZhbHVlID0gIiI7CiAgICAgIHRoaXMuc2hvd1N1Z2dlc3Rpb25zID0gZmFsc2U7CiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXggPSAtMTsKICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi50YWctaW5wdXQiKTsKICAgICAgaWYgKGlucHV0KSB7CiAgICAgICAgaW5wdXQudmFsdWUgPSAiIjsKICAgICAgfQogICAgICB0aGlzLmVtaXRDaGFuZ2UoKTsKICAgIH0KICAgIHJlbW92ZVRhZyhlMTEsIHRhZykgewogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcigodDkpID0+IHQ5ICE9PSB0YWcpOwogICAgICB0aGlzLmVtaXRDaGFuZ2UoKTsKICAgIH0KICAgIGVtaXRDaGFuZ2UoKSB7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImNoYW5nZSIsIHsKICAgICAgICBkZXRhaWw6IHsgdmFsdWU6IHRoaXMudmFsdWUgfSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICB9CiAgICBnZXRWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMudmFsdWU7CiAgICB9CiAgICBzZXRWYWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlMiB8fCBbXTsKICAgIH0KICAgIGFzeW5jIHZhbGlkYXRlKCkgewogICAgICBpZiAodGhpcy5yZXF1aXJlZCAmJiAoIXRoaXMudmFsdWUgfHwgdGhpcy52YWx1ZS5sZW5ndGggPT09IDApKSB7CiAgICAgICAgdGhpcy52YWxpZGF0aW9uVGV4dCA9ICJBdCBsZWFzdCBvbmUgdGFnIGlzIHJlcXVpcmVkIjsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdGhpcy52YWxpZGF0aW9uVGV4dCA9ICIiOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF92YWxpZGF0aW9uVGV4dF9leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczU5KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzSW5wdXRUYWdzMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnLmRlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGdlbmVyYXRlUmVwb3J0QmxvY2tzID0gKCkgPT4gewogIGNvbnN0IHRpbWVzdGFtcDIgPSBEYXRlLm5vdygpOwogIHJldHVybiBbCiAgICB7CiAgICAgIGlkOiBgdGl0bGUtJHt0aW1lc3RhbXAyfWAsCiAgICAgIHR5cGU6ICJoZWFkaW5nLTEiLAogICAgICBjb250ZW50OiAiU3lzdGVtIFBlcmZvcm1hbmNlIFJlcG9ydCIKICAgIH0sCiAgICB7CiAgICAgIGlkOiBgZGF0ZS0ke3RpbWVzdGFtcDIgKyAxfWAsCiAgICAgIHR5cGU6ICJwYXJhZ3JhcGgiLAogICAgICBjb250ZW50OiBgR2VuZXJhdGVkIG9uOiAkeygvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9Mb2NhbGVTdHJpbmcoKX1gCiAgICB9LAogICAgewogICAgICBpZDogYHN1bW1hcnktaGVhZGluZy0ke3RpbWVzdGFtcDIgKyAyfWAsCiAgICAgIHR5cGU6ICJoZWFkaW5nLTIiLAogICAgICBjb250ZW50OiAiRXhlY3V0aXZlIFN1bW1hcnkiCiAgICB9LAogICAgewogICAgICBpZDogYHN1bW1hcnktJHt0aW1lc3RhbXAyICsgM31gLAogICAgICB0eXBlOiAicGFyYWdyYXBoIiwKICAgICAgY29udGVudDogIlRoaXMgcmVwb3J0IHByb3ZpZGVzIGFuIGFuYWx5c2lzIG9mIHN5c3RlbSBwZXJmb3JtYW5jZSBtZXRyaWNzIG92ZXIgdGhlIGxhc3QgMzAgZGF5cy4iCiAgICB9LAogICAgewogICAgICBpZDogYG1ldHJpY3MtaGVhZGluZy0ke3RpbWVzdGFtcDIgKyA0fWAsCiAgICAgIHR5cGU6ICJoZWFkaW5nLTIiLAogICAgICBjb250ZW50OiAiS2V5IE1ldHJpY3MiCiAgICB9LAogICAgewogICAgICBpZDogYG1ldHJpY3MtbGlzdC0ke3RpbWVzdGFtcDIgKyA1fWAsCiAgICAgIHR5cGU6ICJsaXN0IiwKICAgICAgY29udGVudDogIkF2ZXJhZ2UgcmVzcG9uc2UgdGltZTogMTI0bXNcblVwdGltZTogOTkuOTclXG5DUFUgdXRpbGl6YXRpb246IDQ1JVxuTWVtb3J5IHVzYWdlOiAyLjNHQiAvIDhHQiIsCiAgICAgIG1ldGFkYXRhOiB7IGxpc3RUeXBlOiAiYnVsbGV0IiB9CiAgICB9LAogICAgewogICAgICBpZDogYGFuYWx5c2lzLWhlYWRpbmctJHt0aW1lc3RhbXAyICsgNn1gLAogICAgICB0eXBlOiAiaGVhZGluZy0yIiwKICAgICAgY29udGVudDogIlBlcmZvcm1hbmNlIEFuYWx5c2lzIgogICAgfSwKICAgIHsKICAgICAgaWQ6IGBhbmFseXNpcy1xdW90ZS0ke3RpbWVzdGFtcDIgKyA3fWAsCiAgICAgIHR5cGU6ICJxdW90ZSIsCiAgICAgIGNvbnRlbnQ6ICJTeXN0ZW0gcGVyZm9ybWFuY2UgcmVtYWlucyB3aXRoaW4gYWNjZXB0YWJsZSBwYXJhbWV0ZXJzIHdpdGggcm9vbSBmb3Igb3B0aW1pemF0aW9uIGluIG1lbW9yeSBtYW5hZ2VtZW50LiIKICAgIH0sCiAgICB7CiAgICAgIGlkOiBgY29kZS1oZWFkaW5nLSR7dGltZXN0YW1wMiArIDh9YCwKICAgICAgdHlwZTogImhlYWRpbmctMyIsCiAgICAgIGNvbnRlbnQ6ICJTYW1wbGUgUXVlcnkgUGVyZm9ybWFuY2UiCiAgICB9LAogICAgewogICAgICBpZDogYGNvZGUtYmxvY2stJHt0aW1lc3RhbXAyICsgOX1gLAogICAgICB0eXBlOiAiY29kZSIsCiAgICAgIGNvbnRlbnQ6ICJTRUxFQ1QgQVZHKHJlc3BvbnNlX3RpbWUpIGFzIGF2Z190aW1lLFxuICAgICAgIENPVU5UKCopIGFzIHRvdGFsX3JlcXVlc3RzLFxuICAgICAgIERBVEUoY3JlYXRlZF9hdCkgYXMgZGF0ZVxuRlJPTSBwZXJmb3JtYW5jZV9sb2dzXG5XSEVSRSBjcmVhdGVkX2F0ID49IE5PVygpIC0gSU5URVJWQUwgMzAgREFZXG5HUk9VUCBCWSBEQVRFKGNyZWF0ZWRfYXQpXG5PUkRFUiBCWSBkYXRlIERFU0M7IiwKICAgICAgbWV0YWRhdGE6IHsgbGFuZ3VhZ2U6ICJzcWwiIH0KICAgIH0sCiAgICB7CiAgICAgIGlkOiBgZGl2aWRlci0ke3RpbWVzdGFtcDIgKyAxMH1gLAogICAgICB0eXBlOiAiZGl2aWRlciIsCiAgICAgIGNvbnRlbnQ6ICIiCiAgICB9LAogICAgewogICAgICBpZDogYGZvb3Rlci0ke3RpbWVzdGFtcDIgKyAxMX1gLAogICAgICB0eXBlOiAicGFyYWdyYXBoIiwKICAgICAgY29udGVudDogIlJlcG9ydCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBTeXN0ZW0gTW9uaXRvciB2Mi41LjAiCiAgICB9CiAgXTsKfTsKdmFyIGdlbmVyYXRlUmVjaXBlQmxvY2tzID0gKCkgPT4gewogIGNvbnN0IHRpbWVzdGFtcDIgPSBEYXRlLm5vdygpOwogIHJldHVybiBbCiAgICB7CiAgICAgIGlkOiBgcmVjaXBlLXRpdGxlLSR7dGltZXN0YW1wMn1gLAogICAgICB0eXBlOiAiaGVhZGluZy0xIiwKICAgICAgY29udGVudDogIkNsYXNzaWMgTWFyZ2hlcml0YSBQaXp6YSIKICAgIH0sCiAgICB7CiAgICAgIGlkOiBgcmVjaXBlLWludHJvLSR7dGltZXN0YW1wMiArIDF9YCwKICAgICAgdHlwZTogInBhcmFncmFwaCIsCiAgICAgIGNvbnRlbnQ6ICJBIHRyYWRpdGlvbmFsIEl0YWxpYW4gcGl6emEgd2l0aCBmcmVzaCBiYXNpbCwgbW96emFyZWxsYSwgYW5kIHRvbWF0byBzYXVjZS4iCiAgICB9LAogICAgewogICAgICBpZDogYGluZ3JlZGllbnRzLWhlYWRpbmctJHt0aW1lc3RhbXAyICsgMn1gLAogICAgICB0eXBlOiAiaGVhZGluZy0yIiwKICAgICAgY29udGVudDogIlx1ezFGMzU1fSBJbmdyZWRpZW50cyIKICAgIH0sCiAgICB7CiAgICAgIGlkOiBgZG91Z2gtaGVhZGluZy0ke3RpbWVzdGFtcDIgKyAzfWAsCiAgICAgIHR5cGU6ICJoZWFkaW5nLTMiLAogICAgICBjb250ZW50OiAiRm9yIHRoZSBEb3VnaDoiCiAgICB9LAogICAgewogICAgICBpZDogYGRvdWdoLWxpc3QtJHt0aW1lc3RhbXAyICsgNH1gLAogICAgICB0eXBlOiAibGlzdCIsCiAgICAgIGNvbnRlbnQ6ICc1MDBnIHRpcG8gIjAwIiBmbG91clxuMzI1bWwgd2FybSB3YXRlclxuMTBnIHNhbHRcbjdnIGFjdGl2ZSBkcnkgeWVhc3RcbjIgdGJzcCBvbGl2ZSBvaWwnLAogICAgICBtZXRhZGF0YTogeyBsaXN0VHlwZTogImJ1bGxldCIgfQogICAgfSwKICAgIHsKICAgICAgaWQ6IGB0b3BwaW5ncy1oZWFkaW5nLSR7dGltZXN0YW1wMiArIDV9YCwKICAgICAgdHlwZTogImhlYWRpbmctMyIsCiAgICAgIGNvbnRlbnQ6ICJGb3IgdGhlIFRvcHBpbmdzOiIKICAgIH0sCiAgICB7CiAgICAgIGlkOiBgdG9wcGluZ3MtbGlzdC0ke3RpbWVzdGFtcDIgKyA2fWAsCiAgICAgIHR5cGU6ICJsaXN0IiwKICAgICAgY29udGVudDogIjQwMGcgY2FubmVkIFNhbiBNYXJ6YW5vIHRvbWF0b2VzXG4yNTBnIGZyZXNoIG1venphcmVsbGFcbkZyZXNoIGJhc2lsIGxlYXZlc1xuRXh0cmEgdmlyZ2luIG9saXZlIG9pbFxuU2FsdCBhbmQgcGVwcGVyIHRvIHRhc3RlIiwKICAgICAgbWV0YWRhdGE6IHsgbGlzdFR5cGU6ICJidWxsZXQiIH0KICAgIH0sCiAgICB7CiAgICAgIGlkOiBgaW5zdHJ1Y3Rpb25zLWhlYWRpbmctJHt0aW1lc3RhbXAyICsgN31gLAogICAgICB0eXBlOiAiaGVhZGluZy0yIiwKICAgICAgY29udGVudDogIlx1ezFGNDY4fVx1MjAwRFx1ezFGMzczfSBJbnN0cnVjdGlvbnMiCiAgICB9LAogICAgewogICAgICBpZDogYHN0ZXBzLWxpc3QtJHt0aW1lc3RhbXAyICsgOH1gLAogICAgICB0eXBlOiAibGlzdCIsCiAgICAgIGNvbnRlbnQ6ICJEaXNzb2x2ZSB5ZWFzdCBpbiB3YXJtIHdhdGVyIGFuZCBsZXQgc3RhbmQgZm9yIDUgbWludXRlc1xuTWl4IGZsb3VyIGFuZCBzYWx0LCBjcmVhdGUgYSB3ZWxsIGluIGNlbnRlclxuQWRkIHllYXN0IG1peHR1cmUgYW5kIG9saXZlIG9pbFxuS25lYWQgZm9yIDEwIG1pbnV0ZXMgdW50aWwgc21vb3RoXG5MZXQgcmlzZSBmb3IgMS0yIGhvdXJzIHVudGlsIGRvdWJsZWRcblB1bmNoIGRvd24gYW5kIGRpdmlkZSBpbnRvIHBvcnRpb25zXG5Sb2xsIG91dCBlYWNoIHBvcnRpb24gdG8gMTItaW5jaCBjaXJjbGVzXG5Ub3Agd2l0aCBjcnVzaGVkIHRvbWF0b2VzLCBtb3p6YXJlbGxhLCBhbmQgYmFzaWxcbkJha2UgYXQgNDc1XHhCMEYgKDI0NVx4QjBDKSBmb3IgMTAtMTIgbWludXRlcyIsCiAgICAgIG1ldGFkYXRhOiB7IGxpc3RUeXBlOiAib3JkZXJlZCIgfQogICAgfSwKICAgIHsKICAgICAgaWQ6IGB0aXAtJHt0aW1lc3RhbXAyICsgOX1gLAogICAgICB0eXBlOiAicXVvdGUiLAogICAgICBjb250ZW50OiAiUHJvIHRpcDogRm9yIGFuIGF1dGhlbnRpYyB0YXN0ZSwgdXNlIGEgcGl6emEgc3RvbmUgYW5kIHByZWhlYXQgaXQgaW4gdGhlIG92ZW4gZm9yIGF0IGxlYXN0IDMwIG1pbnV0ZXMgYmVmb3JlIGJha2luZy4iCiAgICB9LAogICAgewogICAgICBpZDogYGRpdmlkZXItJHt0aW1lc3RhbXAyICsgMTB9YCwKICAgICAgdHlwZTogImRpdmlkZXIiLAogICAgICBjb250ZW50OiAiIgogICAgfSwKICAgIHsKICAgICAgaWQ6IGBzZXJ2aW5ncy0ke3RpbWVzdGFtcDIgKyAxMX1gLAogICAgICB0eXBlOiAicGFyYWdyYXBoIiwKICAgICAgY29udGVudDogIlNlcnZpbmdzOiA0IHBpenphcyB8IFByZXAgdGltZTogMiBob3VycyB8IENvb2sgdGltZTogMTIgbWludXRlcyIKICAgIH0KICBdOwp9Owp2YXIgaW5pdGlhbGl6ZUVkaXRvcnMgPSAoY29udGFpbmVyKSA9PiB7CiAgY29uc3QgZWRpdG9ycyA9IHt9OwogIGVkaXRvcnMuYmFzaWMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI2VkaXRvci1iYXNpYyIpOwogIGVkaXRvcnMuYXJ0aWNsZSA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIjZWRpdG9yLWFydGljbGUiKTsKICBlZGl0b3JzLmRyYWdEcm9wID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIiNlZGl0b3ItZHJhZ2Ryb3AiKTsKICBlZGl0b3JzLnR1dG9yaWFsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIiNlZGl0b3ItdHV0b3JpYWwiKTsKICBlZGl0b3JzLm1lZXRpbmcgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI2VkaXRvci1tZWV0aW5nIik7CiAgZWRpdG9ycy5yZWNpcGUgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI2VkaXRvci1yZWNpcGUiKTsKICBlZGl0b3JzLnRlY2huaWNhbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIjZWRpdG9yLXRlY2huaWNhbCIpOwogIGVkaXRvcnMuZm9ybUludGVncmF0aW9uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIiNlZGl0b3ItZm9ybS1pbnRlZ3JhdGlvbiIpOwogIGVkaXRvcnMucHJvZ3JhbW1hdGljID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIiNlZGl0b3ItcHJvZ3JhbW1hdGljIik7CiAgZWRpdG9ycy5leHBvcnREZW1vID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIiNlZGl0b3ItZXhwb3J0Iik7CiAgcmV0dXJuIGVkaXRvcnM7Cn07CnZhciBzZXR1cFByb2dyYW1tYXRpY0RlbW8gPSAoY29udGFpbmVyLCBlZGl0b3IpID0+IHsKICBjb25zdCByZXBvcnRCdG4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI2J0bi1nZW5lcmF0ZS1yZXBvcnQiKTsKICBjb25zdCByZWNpcGVCdG4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI2J0bi1nZW5lcmF0ZS1yZWNpcGUiKTsKICBjb25zdCBjbGVhckJ0biA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIjYnRuLWNsZWFyLWVkaXRvciIpOwogIGlmIChyZXBvcnRCdG4pIHsKICAgIHJlcG9ydEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgZWRpdG9yLmltcG9ydEJsb2NrcyhnZW5lcmF0ZVJlcG9ydEJsb2NrcygpKTsKICAgIH0pOwogIH0KICBpZiAocmVjaXBlQnRuKSB7CiAgICByZWNpcGVCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGVkaXRvci5pbXBvcnRCbG9ja3MoZ2VuZXJhdGVSZWNpcGVCbG9ja3MoKSk7CiAgICB9KTsKICB9CiAgaWYgKGNsZWFyQnRuKSB7CiAgICBjbGVhckJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgZWRpdG9yLmltcG9ydEJsb2NrcyhbXSk7CiAgICB9KTsKICB9Cn07CnZhciBzZXR1cEV4cG9ydERlbW8gPSAoY29udGFpbmVyLCBlZGl0b3IpID0+IHsKICBjb25zdCBleHBvcnRCbG9ja3NCdG4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI2J0bi1leHBvcnQtYmxvY2tzIik7CiAgY29uc3QgZXhwb3J0SHRtbEJ0biA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIjYnRuLWV4cG9ydC1odG1sIik7CiAgY29uc3QgZXhwb3J0TWFya2Rvd25CdG4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI2J0bi1leHBvcnQtbWFya2Rvd24iKTsKICBjb25zdCBzYXZlU3RhdGVCdG4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI2J0bi1zYXZlLXN0YXRlIik7CiAgY29uc3QgcmVzdG9yZVN0YXRlQnRuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIiNidG4tcmVzdG9yZS1zdGF0ZSIpOwogIGxldCBzYXZlZFN0YXRlID0gbnVsbDsKICBpZiAoZXhwb3J0QmxvY2tzQnRuKSB7CiAgICBleHBvcnRCbG9ja3NCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGNvbnN0IGJsb2NrcyA9IGVkaXRvci5leHBvcnRCbG9ja3MoKTsKICAgICAgY29uc29sZS5sb2coIkV4cG9ydGVkIGJsb2NrczoiLCBibG9ja3MpOwogICAgICBhbGVydChgRXhwb3J0ZWQgJHtibG9ja3MubGVuZ3RofSBibG9ja3MgdG8gY29uc29sZS4gQ2hlY2sgZGV2ZWxvcGVyIHRvb2xzLmApOwogICAgfSk7CiAgfQogIGlmIChleHBvcnRIdG1sQnRuKSB7CiAgICBleHBvcnRIdG1sQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgICBjb25zdCBodG1sMTYgPSBlZGl0b3IuZXhwb3J0QXNIdG1sKCk7CiAgICAgIGNvbnNvbGUubG9nKCJIVE1MIEV4cG9ydDoiLCBodG1sMTYpOwogICAgICBhbGVydCgiSFRNTCBleHBvcnRlZCB0byBjb25zb2xlLiBDaGVjayBkZXZlbG9wZXIgdG9vbHMuIik7CiAgICB9KTsKICB9CiAgaWYgKGV4cG9ydE1hcmtkb3duQnRuKSB7CiAgICBleHBvcnRNYXJrZG93bkJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgY29uc3QgbWFya2Rvd24gPSBlZGl0b3IuZXhwb3J0QXNNYXJrZG93bigpOwogICAgICBjb25zb2xlLmxvZygiTWFya2Rvd24gRXhwb3J0OiIsIG1hcmtkb3duKTsKICAgICAgYWxlcnQoIk1hcmtkb3duIGV4cG9ydGVkIHRvIGNvbnNvbGUuIENoZWNrIGRldmVsb3BlciB0b29scy4iKTsKICAgIH0pOwogIH0KICBpZiAoc2F2ZVN0YXRlQnRuKSB7CiAgICBzYXZlU3RhdGVCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIHNhdmVkU3RhdGUgPSBlZGl0b3IuZXhwb3J0U3RhdGUoKTsKICAgICAgY29uc29sZS5sb2coIlNhdmVkIHN0YXRlOiIsIHNhdmVkU3RhdGUpOwogICAgICBhbGVydCgiRWRpdG9yIHN0YXRlIHNhdmVkISIpOwogICAgfSk7CiAgfQogIGlmIChyZXN0b3JlU3RhdGVCdG4pIHsKICAgIHJlc3RvcmVTdGF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgaWYgKHNhdmVkU3RhdGUpIHsKICAgICAgICBlZGl0b3IuaW1wb3J0U3RhdGUoc2F2ZWRTdGF0ZSk7CiAgICAgICAgYWxlcnQoIkVkaXRvciBzdGF0ZSByZXN0b3JlZCEiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhbGVydCgiTm8gc2F2ZWQgc3RhdGUgZm91bmQuIFNhdmUgc3RhdGUgZmlyc3QhIik7CiAgICAgIH0KICAgIH0pOwogIH0KfTsKdmFyIHNldHVwT3V0cHV0Rm9ybWF0RGVtbyA9IChjb250YWluZXIsIGh0bWxFZGl0b3IsIG1hcmtkb3duRWRpdG9yKSA9PiB7CiAgY29uc3QgaHRtbEJ0biA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIjYnRuLXNob3ctaHRtbC1vdXRwdXQiKTsKICBjb25zdCBodG1sUHJldmlldyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIjb3V0cHV0LXByZXZpZXctaHRtbCIpOwogIGlmIChodG1sQnRuICYmIGh0bWxQcmV2aWV3ICYmIGh0bWxFZGl0b3IpIHsKICAgIGh0bWxCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGh0bWxQcmV2aWV3LnRleHRDb250ZW50ID0gaHRtbEVkaXRvci5nZXRWYWx1ZSgpOwogICAgICBodG1sUHJldmlldy5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIik7CiAgICB9KTsKICB9CiAgY29uc3QgbWFya2Rvd25CdG4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI2J0bi1zaG93LW1hcmtkb3duLW91dHB1dCIpOwogIGNvbnN0IG1hcmtkb3duUHJldmlldyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIjb3V0cHV0LXByZXZpZXctbWFya2Rvd24iKTsKICBpZiAobWFya2Rvd25CdG4gJiYgbWFya2Rvd25QcmV2aWV3ICYmIG1hcmtkb3duRWRpdG9yKSB7CiAgICBtYXJrZG93bkJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgbWFya2Rvd25QcmV2aWV3LnRleHRDb250ZW50ID0gbWFya2Rvd25FZGl0b3IuZ2V0VmFsdWUoKTsKICAgICAgbWFya2Rvd25QcmV2aWV3LmNsYXNzTGlzdC5hZGQoInZpc2libGUiKTsKICAgIH0pOwogIH0KfTsKdmFyIHBvcHVsYXRlSW5pdGlhbENvbnRlbnQgPSAoZWRpdG9ycykgPT4gewogIGlmIChlZGl0b3JzLmFydGljbGUpIHsKICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICBjb25zdCBhcnRpY2xlQmxvY2tzID0gWwogICAgICAgIHsKICAgICAgICAgIGlkOiAiaW50cm8taGVhZGluZy0iICsgRGF0ZS5ub3coKSwKICAgICAgICAgIHR5cGU6ICJoZWFkaW5nLTIiLAogICAgICAgICAgY29udGVudDogIkludHJvZHVjdGlvbiB0byBNb2Rlcm4gV2ViIERldmVsb3BtZW50IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgaWQ6ICJpbnRyby1wYXJhLSIgKyBEYXRlLm5vdygpLAogICAgICAgICAgdHlwZTogInBhcmFncmFwaCIsCiAgICAgICAgICBjb250ZW50OiAiTW9kZXJuIHdlYiBkZXZlbG9wbWVudCBoYXMgZXZvbHZlZCBzaWduaWZpY2FudGx5IG92ZXIgdGhlIHBhc3QgZGVjYWRlLiBJbiB0aGlzIGFydGljbGUsIHdlJ2xsIGV4cGxvcmUgdGhlIGtleSB0ZWNobm9sb2dpZXMgYW5kIGJlc3QgcHJhY3RpY2VzIHRoYXQgZGVmaW5lIHdlYiBkZXZlbG9wbWVudCBpbiAyMDI0LiIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGlkOiAidGVjaC1oZWFkaW5nLSIgKyBEYXRlLm5vdygpLAogICAgICAgICAgdHlwZTogImhlYWRpbmctMyIsCiAgICAgICAgICBjb250ZW50OiAiS2V5IFRlY2hub2xvZ2llcyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGlkOiAidGVjaC1saXN0LSIgKyBEYXRlLm5vdygpLAogICAgICAgICAgdHlwZTogImxpc3QiLAogICAgICAgICAgY29udGVudDogIlR5cGVTY3JpcHQgLSBUeXBlLXNhZmUgSmF2YVNjcmlwdCBkZXZlbG9wbWVudFxuV2ViIENvbXBvbmVudHMgLSBOYXRpdmUgY29tcG9uZW50IG1vZGVsXG5FUyBNb2R1bGVzIC0gTW9kZXJuIG1vZHVsZSBzeXN0ZW1cbldlYkFzc2VtYmx5IC0gSGlnaC1wZXJmb3JtYW5jZSBjb21wdXRpbmciLAogICAgICAgICAgbWV0YWRhdGE6IHsgbGlzdFR5cGU6ICJvcmRlcmVkIiB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBpZDogInF1b3RlLSIgKyBEYXRlLm5vdygpLAogICAgICAgICAgdHlwZTogInF1b3RlIiwKICAgICAgICAgIGNvbnRlbnQ6ICJUaGUgYmVzdCB3YXkgdG8gcHJlZGljdCB0aGUgZnV0dXJlIGlzIHRvIGludmVudCBpdC4gLSBBbGFuIEtheSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGlkOiAiZXhhbXBsZS1oZWFkaW5nLSIgKyBEYXRlLm5vdygpLAogICAgICAgICAgdHlwZTogImhlYWRpbmctMyIsCiAgICAgICAgICBjb250ZW50OiAiQ29kZSBFeGFtcGxlIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgaWQ6ICJjb2RlLWV4YW1wbGUtIiArIERhdGUubm93KCksCiAgICAgICAgICB0eXBlOiAiY29kZSIsCiAgICAgICAgICBjb250ZW50OiAiY2xhc3MgTW9kZXJuV2ViQXBwIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pO1xuICB9XG4gIFxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG59IiwKICAgICAgICAgIG1ldGFkYXRhOiB7IGxhbmd1YWdlOiAiamF2YXNjcmlwdCIgfQogICAgICAgIH0KICAgICAgXTsKICAgICAgZWRpdG9ycy5hcnRpY2xlLmltcG9ydEJsb2NrcyhhcnRpY2xlQmxvY2tzKTsKICAgIH0sIDUwMCk7CiAgfQogIGlmIChlZGl0b3JzLmRyYWdEcm9wKSB7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgY29uc3QgZHJhZ0Jsb2NrcyA9IFsKICAgICAgICB7CiAgICAgICAgICBpZDogImRyYWctdGl0bGUtIiArIERhdGUubm93KCksCiAgICAgICAgICB0eXBlOiAiaGVhZGluZy0xIiwKICAgICAgICAgIGNvbnRlbnQ6ICJEcmFnICYgRHJvcCBEZW1vIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgaWQ6ICJkcmFnLWludHJvLSIgKyBEYXRlLm5vdygpLAogICAgICAgICAgdHlwZTogInBhcmFncmFwaCIsCiAgICAgICAgICBjb250ZW50OiAiVGhpcyBlZGl0b3IgZGVtb25zdHJhdGVzIGRyYWcgYW5kIGRyb3AgZnVuY3Rpb25hbGl0eS4gVHJ5IGRyYWdnaW5nIHRoZXNlIGJsb2NrcyBhcm91bmQhIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgaWQ6ICJkcmFnLWhlYWRpbmctIiArIERhdGUubm93KCksCiAgICAgICAgICB0eXBlOiAiaGVhZGluZy0yIiwKICAgICAgICAgIGNvbnRlbnQ6ICJIb3cgSXQgV29ya3MiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBpZDogImRyYWctbGlzdC0iICsgRGF0ZS5ub3coKSwKICAgICAgICAgIHR5cGU6ICJsaXN0IiwKICAgICAgICAgIGNvbnRlbnQ6ICJIb3ZlciBvdmVyIGFueSBibG9jayB0byBzZWUgdGhlIGRyYWcgaGFuZGxlXG5DbGljayBhbmQgaG9sZCB0aGUgaGFuZGxlIHRvIHN0YXJ0IGRyYWdnaW5nXG5EcmFnIHRvIHJlb3JkZXIgYmxvY2tzXG5SZWxlYXNlIHRvIGRyb3AgaW4gdGhlIG5ldyBwb3NpdGlvbiIsCiAgICAgICAgICBtZXRhZGF0YTogeyBsaXN0VHlwZTogIm9yZGVyZWQiIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGlkOiAiZHJhZy1xdW90ZS0iICsgRGF0ZS5ub3coKSwKICAgICAgICAgIHR5cGU6ICJxdW90ZSIsCiAgICAgICAgICBjb250ZW50OiAiVGhlIGRyYWcgYW5kIGRyb3AgZmVhdHVyZSBtYWtlcyBpdCBlYXN5IHRvIHJlb3JnYW5pemUgeW91ciBjb250ZW50IHdpdGhvdXQgY3V0dGluZyBhbmQgcGFzdGluZy4iCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBpZDogImRyYWctZGl2aWRlci0iICsgRGF0ZS5ub3coKSwKICAgICAgICAgIHR5cGU6ICJkaXZpZGVyIiwKICAgICAgICAgIGNvbnRlbnQ6ICIiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBpZDogImRyYWctZm9vdGVyLSIgKyBEYXRlLm5vdygpLAogICAgICAgICAgdHlwZTogInBhcmFncmFwaCIsCiAgICAgICAgICBjb250ZW50OiAiTm90ZTogRGl2aWRlciBibG9ja3MgY2Fubm90IGJlIGRyYWdnZWQsIGJ1dCBvdGhlciBibG9ja3MgY2FuIGJlIG1vdmVkIGFyb3VuZCB0aGVtLiIKICAgICAgICB9CiAgICAgIF07CiAgICAgIGVkaXRvcnMuZHJhZ0Ryb3AuaW1wb3J0QmxvY2tzKGRyYWdCbG9ja3MpOwogICAgfSwgNjAwKTsKICB9Cn07CnZhciBkZW1vRnVuYzQzID0gKCkgPT4gYjJgCiAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHNldFRpbWVvdXQocmVzb2x2ZTIsIDUwMCkpOwogIGNvbnN0IGVkaXRvcnMgPSBpbml0aWFsaXplRWRpdG9ycyhlbGVtZW50QXJnKTsKICBpZiAoZWRpdG9ycy5wcm9ncmFtbWF0aWMpIHsKICAgIHNldHVwUHJvZ3JhbW1hdGljRGVtbyhlbGVtZW50QXJnLCBlZGl0b3JzLnByb2dyYW1tYXRpYyk7CiAgfQogIGlmIChlZGl0b3JzLmV4cG9ydERlbW8pIHsKICAgIHNldHVwRXhwb3J0RGVtbyhlbGVtZW50QXJnLCBlZGl0b3JzLmV4cG9ydERlbW8pOwogIH0KICBzZXR1cE91dHB1dEZvcm1hdERlbW8oZWxlbWVudEFyZywgZWRpdG9ycy5tZWV0aW5nLCBlZGl0b3JzLnJlY2lwZSk7CiAgcG9wdWxhdGVJbml0aWFsQ29udGVudChlZGl0b3JzKTsKICBjb25zb2xlLmxvZygiV1lTSVdZRyBEZW1vIGluaXRpYWxpemVkIHdpdGggZWRpdG9yczoiLCBPYmplY3Qua2V5cyhlZGl0b3JzKSk7Cn19PgogIDxzdHlsZT4KICAgICR7aWAKICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMjAwcHg7CiAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgIH0KICAgICAgCiAgICAgIGRlZXMtcGFuZWwgewogICAgICAgIG1hcmdpbi1ib3R0b206IDMycHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5wYW5lbC1kZXNjcmlwdGlvbiB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBsaW5lLWhlaWdodDogMS42OwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLnBhbmVsLWRlc2NyaXB0aW9uIHsKICAgICAgICAgIGNvbG9yOiAjOTk5OwogICAgICAgIH0KICAgICAgfQoKICAgICAgLmZlYXR1cmUtZ3JpZCB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDIwMHB4LCAxZnIpKTsKICAgICAgICBnYXA6IDE2cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgfQoKICAgICAgLmZlYXR1cmUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIGNvbG9yOiAjNTU1OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQoKICAgICAgLmZlYXR1cmUtaWNvbiB7CiAgICAgICAgY29sb3I6ICMwMDY2Y2M7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgfQoKICAgICAgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewogICAgICAgIC5mZWF0dXJlLWl0ZW0gewogICAgICAgICAgY29sb3I6ICNhYWE7CiAgICAgICAgfQogICAgICAgIC5mZWF0dXJlLWljb24gewogICAgICAgICAgY29sb3I6ICM0ZDk0ZmY7CiAgICAgICAgfQogICAgICB9CgogICAgICAuc2hvcnRjdXRzLWJveCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAxMDIsIDIwNCwgMC4wNSk7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAxMDIsIDIwNCwgMC4yKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICB9CgogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLnNob3J0Y3V0cy1ib3ggewogICAgICAgICAgYmFja2dyb3VuZDogcmdiYSg3NywgMTQ4LCAyNTUsIDAuMSk7CiAgICAgICAgICBib3JkZXItY29sb3I6IHJnYmEoNzcsIDE0OCwgMjU1LCAwLjMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLnNob3J0Y3V0cy10aXRsZSB7CiAgICAgICAgbWFyZ2luOiAwIDAgMTJweCAwOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAjMDA2NmNjOwogICAgICB9CgogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLnNob3J0Y3V0cy10aXRsZSB7CiAgICAgICAgICBjb2xvcjogIzRkOTRmZjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5zaG9ydGN1dHMtZ3JpZCB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgxODBweCwgMWZyKSk7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgIH0KCiAgICAgIC5zaG9ydGN1dC1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGNvbG9yOiAjNTU1OwogICAgICB9CgogICAgICAuc2hvcnRjdXQta2V5IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjBmMGYwOwogICAgICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAjMzMzOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgIEBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsKICAgICAgICAuc2hvcnRjdXQtaXRlbSB7CiAgICAgICAgICBjb2xvcjogI2JiYjsKICAgICAgICB9CiAgICAgICAgLnNob3J0Y3V0LWtleSB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAjMzMzOwogICAgICAgICAgY29sb3I6ICNkZGQ7CiAgICAgICAgfQogICAgICB9CgogICAgICAub3V0cHV0LWdyaWQgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgzMjBweCwgMWZyKSk7CiAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgIH0KCiAgICAgIC5vdXRwdXQtY2FyZCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogMTJweDsKICAgICAgfQoKICAgICAgLm91dHB1dC1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5vdXRwdXQtcHJldmlldyB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDE1LCAyMywgNDIsIDAuMDQpOwogICAgICAgIGNvbG9yOiB2YXIoLS1kZWVzLWNvbG9yLXRleHQsICMwZjE3MmEpOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTUsIDIzLCA0MiwgMC4xKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICAgICAgZm9udC1mYW1pbHk6ICdHZWlzdCBNb25vJywgJ0ZpcmEgQ29kZScsIG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWF4LWhlaWdodDogMjgwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KFt0aGVtZT0nZGFyayddKSAub3V0cHV0LXByZXZpZXcgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjUwLCAyNTAsIDI1MCwgMC4wNik7CiAgICAgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1MCwgMjUwLCAyNTAsIDAuMTUpOwogICAgICAgIGNvbG9yOiB2YXIoLS1kZWVzLWNvbG9yLXRleHQsICNmNGY0ZjUpOwogICAgICB9CgogICAgICAub3V0cHV0LXByZXZpZXcudmlzaWJsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgewogICAgICAgIC5vdXRwdXQtZ3JpZCB7CiAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIC50aXBzLWJveCB7CiAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6ICNmMGY4ZmY7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBsaW5lLWhlaWdodDogMS42OwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLnRpcHMtYm94IHsKICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoNzcsIDE0OCwgMjU1LCAwLjEpOwogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgLnRpcHMtYm94IHN0cm9uZyB7CiAgICAgICAgY29sb3I6ICMwMDY2Y2M7CiAgICAgIH0KICAgICAgCiAgICAgIEBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsKICAgICAgICAudGlwcy1ib3ggc3Ryb25nIHsKICAgICAgICAgIGNvbG9yOiAjNGQ5NGZmOwogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgLnRpcHMtbGlzdCB7CiAgICAgICAgbWFyZ2luOiA4cHggMCAwIDA7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAyNHB4OwogICAgICB9CiAgICAgIAogICAgICAudGlwcy1saXN0IGxpIHsKICAgICAgICBtYXJnaW46IDRweCAwOwogICAgICB9CiAgICAgIAogICAgICAuYnV0dG9uLWdyb3VwIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogOHB4OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICB9CiAgICAgIAogICAgICAuZGVtby1idXR0b24gewogICAgICAgIHBhZGRpbmc6IDhweCAxNnB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGJhY2tncm91bmQ6ICNmOGY4Zjg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogICAgICB9CiAgICAgIAogICAgICAuZGVtby1idXR0b246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICNlOGU4ZTg7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjY2NjOwogICAgICB9CiAgICAgIAogICAgICAuZGVtby1idXR0b246YWN0aXZlIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewogICAgICAgIC5kZW1vLWJ1dHRvbiB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAjMzMzOwogICAgICAgICAgYm9yZGVyLWNvbG9yOiAjNTU1OwogICAgICAgICAgY29sb3I6ICNkZGQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5kZW1vLWJ1dHRvbjpob3ZlciB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAjNDQ0OwogICAgICAgICAgYm9yZGVyLWNvbG9yOiAjNjY2OwogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgLmV4cG9ydC1pbmZvLWdyaWQgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyNTBweCwgMWZyKSk7CiAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5leHBvcnQtaW5mby1jYXJkIHsKICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgfQogICAgICAKICAgICAgLmV4cG9ydC1pbmZvLWNhcmQuYmxvY2tzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDEwMiwgMjA0LCAwLjEpOwogICAgICB9CiAgICAgIAogICAgICAuZXhwb3J0LWluZm8tY2FyZC5odG1sIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDc2LCAxNzUsIDgwLCAwLjEpOwogICAgICB9CiAgICAgIAogICAgICAuZXhwb3J0LWluZm8tY2FyZC5tYXJrZG93biB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDE1MiwgMCwgMC4xKTsKICAgICAgfQogICAgICAKICAgICAgLmV4cG9ydC1pbmZvLWNhcmQuc3RhdGUgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTU2LCAzOSwgMTc2LCAwLjEpOwogICAgICB9CiAgICAgIAogICAgICAuZXhwb3J0LWluZm8tY2FyZCBzdHJvbmcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgfQogICAgICAKICAgICAgLmV4cG9ydC1pbmZvLWNhcmQuYmxvY2tzIHN0cm9uZyB7CiAgICAgICAgY29sb3I6ICMwMDY2Y2M7CiAgICAgIH0KICAgICAgCiAgICAgIC5leHBvcnQtaW5mby1jYXJkLmh0bWwgc3Ryb25nIHsKICAgICAgICBjb2xvcjogIzRDQUY1MDsKICAgICAgfQogICAgICAKICAgICAgLmV4cG9ydC1pbmZvLWNhcmQubWFya2Rvd24gc3Ryb25nIHsKICAgICAgICBjb2xvcjogI0ZGOTgwMDsKICAgICAgfQogICAgICAKICAgICAgLmV4cG9ydC1pbmZvLWNhcmQuc3RhdGUgc3Ryb25nIHsKICAgICAgICBjb2xvcjogIzlDMjdCMDsKICAgICAgfQogICAgICAKICAgICAgLmV4cG9ydC1pbmZvLWNhcmQgcCB7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBsaW5lLWhlaWdodDogMS41OwogICAgICB9CiAgICBgfQogIDwvc3R5bGU+CiAgCiAgICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyIxLiBcdXsxRjY4MH0gTW9kZXJuIFdZU0lXWUcgRWRpdG9yIn0+CiAgICAgICAgPHAgY2xhc3M9InBhbmVsLWRlc2NyaXB0aW9uIj4KICAgICAgICAgIEEgcG93ZXJmdWwgYmxvY2stYmFzZWQgZWRpdG9yIHdpdGggc2xhc2ggY29tbWFuZHMsIGtleWJvYXJkIHNob3J0Y3V0cywgYW5kIG11bHRpcGxlIG91dHB1dCBmb3JtYXRzLiAKICAgICAgICAgIFBlcmZlY3QgZm9yIGNvbnRlbnQgY3JlYXRpb24sIGJsb2cgcG9zdHMsIGRvY3VtZW50YXRpb24sIGFuZCBtb3JlLgogICAgICAgIDwvcD4KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLWdyaWQiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1pdGVtIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZlYXR1cmUtaWNvbiI+4pyTPC9zcGFuPgogICAgICAgICAgICA8c3Bhbj5TbGFzaCBjb21tYW5kcyAoLyk8L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtaXRlbSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmZWF0dXJlLWljb24iPuKckzwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4+S2V5Ym9hcmQgc2hvcnRjdXRzPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLWl0ZW0iPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iZmVhdHVyZS1pY29uIj7inJM8L3NwYW4+CiAgICAgICAgICAgIDxzcGFuPkJsb2NrLWJhc2VkIGVkaXRpbmc8L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtaXRlbSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmZWF0dXJlLWljb24iPuKckzwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4+RHJhZyAmIGRyb3AgcmVvcmRlcmluZzwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1pdGVtIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZlYXR1cmUtaWNvbiI+4pyTPC9zcGFuPgogICAgICAgICAgICA8c3Bhbj5IVE1MICYgTWFya2Rvd24gb3V0cHV0PC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLWl0ZW0iPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iZmVhdHVyZS1pY29uIj7inJM8L3NwYW4+CiAgICAgICAgICAgIDxzcGFuPkRhcmsgbW9kZSBzdXBwb3J0PC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLWl0ZW0iPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iZmVhdHVyZS1pY29uIj7inJM8L3NwYW4+CiAgICAgICAgICAgIDxzcGFuPk1vYmlsZSByZXNwb25zaXZlPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPGRlZXMtaW5wdXQtd3lzaXd5ZyAKICAgICAgICAgIGlkPSJlZGl0b3ItYmFzaWMiCiAgICAgICAgICBsYWJlbD0iUmljaCBUZXh0IEVkaXRvciIgCiAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhcnQgdHlwaW5nIG9yIHVzZSAnLycgdG8gaW5zZXJ0IGRpZmZlcmVudCBibG9jayB0eXBlcyIKICAgICAgICAgIG91dHB1dEZvcm1hdD0iaHRtbCIKICAgICAgICA+PC9kZWVzLWlucHV0LXd5c2l3eWc+CgogICAgICAgIDxkaXYgY2xhc3M9InNob3J0Y3V0cy1ib3giPgogICAgICAgICAgPGg0IGNsYXNzPSJzaG9ydGN1dHMtdGl0bGUiPuKMqO+4jyBLZXlib2FyZCBTaG9ydGN1dHM8L2g0PgogICAgICAgICAgPGRpdiBjbGFzcz0ic2hvcnRjdXRzLWdyaWQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaG9ydGN1dC1pdGVtIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2hvcnRjdXQta2V5Ij4vPC9zcGFuPiBTbGFzaCBjb21tYW5kcwogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2hvcnRjdXQtaXRlbSI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNob3J0Y3V0LWtleSI+Izwvc3Bhbj4gSGVhZGluZyAxCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaG9ydGN1dC1pdGVtIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2hvcnRjdXQta2V5Ij4jIzwvc3Bhbj4gSGVhZGluZyAyCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaG9ydGN1dC1pdGVtIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2hvcnRjdXQta2V5Ij4jIyM8L3NwYW4+IEhlYWRpbmcgMwogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2hvcnRjdXQtaXRlbSI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNob3J0Y3V0LWtleSI+Pjwvc3Bhbj4gUXVvdGUKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNob3J0Y3V0LWl0ZW0iPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzaG9ydGN1dC1rZXkiPlxgXGBcYDwvc3Bhbj4gQ29kZSBibG9jawogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2hvcnRjdXQtaXRlbSI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNob3J0Y3V0LWtleSI+Kjwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InNob3J0Y3V0LWtleSI+LTwvc3Bhbj4gQnVsbGV0IGxpc3QKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNob3J0Y3V0LWl0ZW0iPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzaG9ydGN1dC1rZXkiPjEuPC9zcGFuPiBOdW1iZXJlZCBsaXN0CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaG9ydGN1dC1pdGVtIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2hvcnRjdXQta2V5Ij4tLS08L3NwYW4+IERpdmlkZXIKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjIuIFx1ezFGNEREfSBCbG9nIFBvc3QgRXhhbXBsZSJ9PgogICAgICAgIDxwIGNsYXNzPSJwYW5lbC1kZXNjcmlwdGlvbiI+CiAgICAgICAgICBQZXJmZWN0IGZvciBjcmVhdGluZyByaWNoIGNvbnRlbnQgd2l0aCBtdWx0aXBsZSBibG9jayB0eXBlcy4gCiAgICAgICAgICBUaGUgZWRpdG9yIHByZXNlcnZlcyBmb3JtYXR0aW5nIGFuZCBwcm92aWRlcyBhIGNsZWFuIGVkaXRpbmcgZXhwZXJpZW5jZS4KICAgICAgICA8L3A+CiAgICAgICAgCiAgICAgICAgPGRlZXMtaW5wdXQtd3lzaXd5ZyAKICAgICAgICAgIGlkPSJlZGl0b3ItYXJ0aWNsZSIKICAgICAgICAgIGxhYmVsPSJCbG9nIFBvc3QgQ29udGVudCIgCiAgICAgICAgICBkZXNjcmlwdGlvbj0iV3JpdGUgeW91ciBhcnRpY2xlIHVzaW5nIHZhcmlvdXMgZm9ybWF0dGluZyBvcHRpb25zIgogICAgICAgICAgb3V0cHV0Rm9ybWF0PSJodG1sIgogICAgICAgID48L2RlZXMtaW5wdXQtd3lzaXd5Zz4KICAgICAgPC9kZWVzLXBhbmVsPgoKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjMuIFx1ezFGNTAwfSBEcmFnICYgRHJvcCBSZW9yZGVyaW5nIn0+CiAgICAgICAgPHAgY2xhc3M9InBhbmVsLWRlc2NyaXB0aW9uIj4KICAgICAgICAgIEVhc2lseSByZWFycmFuZ2UgeW91ciBjb250ZW50IGJsb2NrcyBieSBkcmFnZ2luZyB0aGVtLiAKICAgICAgICAgIEhvdmVyIG92ZXIgYW55IGJsb2NrIHRvIHJldmVhbCB0aGUgZHJhZyBoYW5kbGUgb24gdGhlIGxlZnQgc2lkZS4KICAgICAgICA8L3A+CiAgICAgICAgCiAgICAgICAgPGRlZXMtaW5wdXQtd3lzaXd5ZyAKICAgICAgICAgIGlkPSJlZGl0b3ItZHJhZ2Ryb3AiCiAgICAgICAgICBsYWJlbD0iRHJhZyAmIERyb3AgRGVtbyIgCiAgICAgICAgICBkZXNjcmlwdGlvbj0iVHJ5IGRyYWdnaW5nIGJsb2NrcyB0byByZW9yZGVyIHRoZW0gLSBob3ZlciB0byBzZWUgZHJhZyBoYW5kbGVzIgogICAgICAgID48L2RlZXMtaW5wdXQtd3lzaXd5Zz4KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJ0aXBzLWJveCI+CiAgICAgICAgICA8c3Ryb25nPvCfkqEgVGlwczo8L3N0cm9uZz4KICAgICAgICAgIDx1bCBjbGFzcz0idGlwcy1saXN0Ij4KICAgICAgICAgICAgPGxpPkhvdmVyIG92ZXIgYW55IGJsb2NrIHRvIHNlZSB0aGUgZHJhZyBoYW5kbGUgKOKLruKLrikgb24gdGhlIGxlZnQ8L2xpPgogICAgICAgICAgICA8bGk+Q2xpY2sgYW5kIGhvbGQgdGhlIGRyYWcgaGFuZGxlIHRvIHN0YXJ0IGRyYWdnaW5nPC9saT4KICAgICAgICAgICAgPGxpPkJsdWUgaW5kaWNhdG9ycyBzaG93IHdoZXJlIHRoZSBibG9jayB3aWxsIGJlIGRyb3BwZWQ8L2xpPgogICAgICAgICAgICA8bGk+RGl2aWRlciBibG9ja3MgY2Fubm90IGJlIGRyYWdnZWQ8L2xpPgogICAgICAgICAgICA8bGk+VGhlIGVkaXRvciBtYWludGFpbnMgZm9jdXMgb24gdGhlIG1vdmVkIGJsb2NrIGFmdGVyIGRyb3BwaW5nPC9saT4KICAgICAgICAgIDwvdWw+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI0LiBcdXsxRjREQX0gVHV0b3JpYWwgJiBEb2N1bWVudGF0aW9uIn0+CiAgICAgICAgPHAgY2xhc3M9InBhbmVsLWRlc2NyaXB0aW9uIj4KICAgICAgICAgIENyZWF0ZSBjb21wcmVoZW5zaXZlIHR1dG9yaWFscyBhbmQgZG9jdW1lbnRhdGlvbiB3aXRoIGNvZGUgZXhhbXBsZXMsIGxpc3RzLCBhbmQgc3RydWN0dXJlZCBjb250ZW50LgogICAgICAgIDwvcD4KICAgICAgICAKICAgICAgICA8ZGVlcy1pbnB1dC13eXNpd3lnIAogICAgICAgICAgaWQ9ImVkaXRvci10dXRvcmlhbCIKICAgICAgICAgIGxhYmVsPSJHaXQgVHV0b3JpYWwiIAogICAgICAgICAgZGVzY3JpcHRpb249IlN0ZXAtYnktc3RlcCBndWlkZSB3aXRoIGNvbW1hbmRzIGFuZCBleHBsYW5hdGlvbnMiCiAgICAgICAgICBvdXRwdXRGb3JtYXQ9Im1hcmtkb3duIgogICAgICAgICAgdmFsdWU9IiMgR2l0IFR1dG9yaWFsIGZvciBCZWdpbm5lcnMKCkdpdCBpcyBhIGRpc3RyaWJ1dGVkIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gdGhhdCBoZWxwcyB5b3UgdHJhY2sgY2hhbmdlcyBpbiB5b3VyIGNvZGUgb3ZlciB0aW1lLiBUaGlzIHR1dG9yaWFsIHdpbGwgZ3VpZGUgeW91IHRocm91Z2ggdGhlIGJhc2ljcy4KCiMjIFByZXJlcXVpc2l0ZXMKCkJlZm9yZSBzdGFydGluZywgZW5zdXJlIHlvdSBoYXZlOgoKLSBHaXQgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtCi0gQSB0ZXh0IGVkaXRvciBvciBJREUKLSBCYXNpYyBjb21tYW5kIGxpbmUga25vd2xlZGdlCgojIyBHZXR0aW5nIFN0YXJ0ZWQKCiMjIyAxLiBDb25maWd1cmUgR2l0CgpGaXJzdCwgc2V0IHVwIHlvdXIgaWRlbnRpdHk6CgpcYFxgXGBiYXNoCmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lICZxdW90O1lvdXIgTmFtZSZxdW90OwpnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgJnF1b3Q7eW91ci5lbWFpbEBleGFtcGxlLmNvbSZxdW90OwpcYFxgXGAKCiMjIyAyLiBJbml0aWFsaXplIGEgUmVwb3NpdG9yeQoKQ3JlYXRlIGEgbmV3IEdpdCByZXBvc2l0b3J5OgoKXGBcYFxgYmFzaApta2RpciBteS1wcm9qZWN0CmNkIG15LXByb2plY3QKZ2l0IGluaXQKXGBcYFxgCgojIyMgMy4gQmFzaWMgR2l0IFdvcmtmbG93CgojIyMjIEFkZGluZyBGaWxlcwoKQ3JlYXRlIGEgZmlsZSBhbmQgYWRkIGl0IHRvIHN0YWdpbmc6CgpcYFxgXGBiYXNoCmVjaG8gJnF1b3Q7IyBNeSBQcm9qZWN0JnF1b3Q7ID4gUkVBRE1FLm1kCmdpdCBhZGQgUkVBRE1FLm1kClxgXGBcYAoKIyMjIyBDb21taXR0aW5nIENoYW5nZXMKClxgXGBcYGJhc2gKZ2l0IGNvbW1pdCAtbSAmcXVvdDtJbml0aWFsIGNvbW1pdCZxdW90OwpcYFxgXGAKCj4gKipCZXN0IFByYWN0aWNlOioqIFdyaXRlIGNsZWFyLCBkZXNjcmlwdGl2ZSBjb21taXQgbWVzc2FnZXMgdGhhdCBleHBsYWluIHdoYXQgY2hhbmdlcyB3ZXJlIG1hZGUgYW5kIHdoeS4KCiMjIyA0LiBXb3JraW5nIHdpdGggQnJhbmNoZXMKCkJyYW5jaGVzIGFsbG93IHlvdSB0byB3b3JrIG9uIGZlYXR1cmVzIGluZGVwZW5kZW50bHk6CgpcYFxgXGBiYXNoCiMgQ3JlYXRlIGFuZCBzd2l0Y2ggdG8gYSBuZXcgYnJhbmNoCmdpdCBjaGVja291dCAtYiBmZWF0dXJlLWJyYW5jaAoKIyBNYWtlIGNoYW5nZXMgYW5kIGNvbW1pdApnaXQgYWRkIC4KZ2l0IGNvbW1pdCAtbSAmcXVvdDtBZGQgbmV3IGZlYXR1cmUmcXVvdDsKCiMgU3dpdGNoIGJhY2sgdG8gbWFpbgpnaXQgY2hlY2tvdXQgbWFpbgoKIyBNZXJnZSB0aGUgZmVhdHVyZQpnaXQgbWVyZ2UgZmVhdHVyZS1icmFuY2gKXGBcYFxgCgotLS0KCiMjIENvbW1vbiBDb21tYW5kcyBSZWZlcmVuY2UKCnwgQ29tbWFuZCB8IERlc2NyaXB0aW9uIHwKfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfAp8IFxgZ2l0IHN0YXR1c1xgIHwgQ2hlY2sgcmVwb3NpdG9yeSBzdGF0dXMgfAp8IFxgZ2l0IGxvZ1xgIHwgVmlldyBjb21taXQgaGlzdG9yeSB8CnwgXGBnaXQgZGlmZlxgIHwgU2hvdyBjaGFuZ2VzIHwKfCBcYGdpdCBwdWxsXGAgfCBGZXRjaCBhbmQgbWVyZ2UgY2hhbmdlcyB8CnwgXGBnaXQgcHVzaFxgIHwgVXBsb2FkIGNoYW5nZXMgdG8gcmVtb3RlIHwKCiMjIE5leHQgU3RlcHMKCjEuIExlYXJuIGFib3V0IHJlbW90ZSByZXBvc2l0b3JpZXMKMi4gRXhwbG9yZSBhZHZhbmNlZCBHaXQgZmVhdHVyZXMKMy4gUHJhY3RpY2Ugd2l0aCByZWFsIHByb2plY3RzCjQuIENvbnRyaWJ1dGUgdG8gb3BlbiBzb3VyY2UKCioqSGFwcHkgY29kaW5nISoqIPCfmoAiCiAgICAgICAgPjwvZGVlcy1pbnB1dC13eXNpd3lnPgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiNS4gXHV7MUY1MDR9IE91dHB1dCBGb3JtYXRzIn0+CiAgICAgICAgPHAgY2xhc3M9InBhbmVsLWRlc2NyaXB0aW9uIj4KICAgICAgICAgIENob29zZSBiZXR3ZWVuIEhUTUwgYW5kIE1hcmtkb3duIG91dHB1dCBmb3JtYXRzIGRlcGVuZGluZyBvbiB5b3VyIG5lZWRzLiAKICAgICAgICAgIFBlcmZlY3QgZm9yIHN0YXRpYyBzaXRlIGdlbmVyYXRvcnMsIGRvY3VtZW50YXRpb24gc3lzdGVtcywgb3IgYW55IGNvbnRlbnQgbWFuYWdlbWVudCB3b3JrZmxvdy4KICAgICAgICA8L3A+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0ib3V0cHV0LWdyaWQiPgogICAgICAgICAgPGRpdiBjbGFzcz0ib3V0cHV0LWNhcmQiPgogICAgICAgICAgICA8ZGVlcy1pbnB1dC13eXNpd3lnIAogICAgICAgICAgICAgIGlkPSJlZGl0b3ItbWVldGluZyIKICAgICAgICAgICAgICBsYWJlbD0iTWVldGluZyBOb3RlcyIgCiAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0cnVjdHVyZWQgbWVldGluZyBkb2N1bWVudGF0aW9uIgogICAgICAgICAgICAgIG91dHB1dEZvcm1hdD0iaHRtbCIKICAgICAgICAgICAgICB2YWx1ZT0iPGgyPlE0IFBsYW5uaW5nIE1lZXRpbmc8L2gyPjxwPjxzdHJvbmc+RGF0ZTo8L3N0cm9uZz4gRGVjZW1iZXIgMTUsIDIwMjQ8YnI+PHN0cm9uZz5BdHRlbmRlZXM6PC9zdHJvbmc+IFByb2R1Y3QgVGVhbSwgRW5naW5lZXJpbmcsIERlc2lnbjwvcD48aDM+QWdlbmRhIEl0ZW1zPC9oMz48b2w+PGxpPlJldmlldyBRMyBhY2hpZXZlbWVudHM8L2xpPjxsaT5TZXQgUTQgb2JqZWN0aXZlczwvbGk+PGxpPlJlc291cmNlIGFsbG9jYXRpb248L2xpPjxsaT5UaW1lbGluZSBkaXNjdXNzaW9uPC9saT48L29sPjxoMz5LZXkgRGVjaXNpb25zPC9oMz48dWw+PGxpPkxhdW5jaCBuZXcgZGFzaGJvYXJkIGZlYXR1cmUgYnkgZW5kIG9mIEphbnVhcnk8L2xpPjxsaT5JbmNyZWFzZSBlbmdpbmVlcmluZyB0ZWFtIGJ5IDIgZGV2ZWxvcGVyczwvbGk+PGxpPkltcGxlbWVudCB3ZWVrbHkgZGVzaWduIHJldmlld3M8L2xpPjwvdWw+PGJsb2NrcXVvdGU+JnF1b3Q7Rm9jdXMgb24gdXNlciBleHBlcmllbmNlIGltcHJvdmVtZW50cyBiYXNlZCBvbiBRMyBmZWVkYmFjayZxdW90OyAtIFByb2R1Y3QgTWFuYWdlcjwvYmxvY2txdW90ZT48aDM+QWN0aW9uIEl0ZW1zPC9oMz48dWw+PGxpPlNhcmFoOiBDcmVhdGUgZGV0YWlsZWQgcHJvamVjdCB0aW1lbGluZTwvbGk+PGxpPk1pa2U6IERyYWZ0IHRlY2huaWNhbCByZXF1aXJlbWVudHM8L2xpPjxsaT5MaXNhOiBTY2hlZHVsZSB1c2VyIHJlc2VhcmNoIHNlc3Npb25zPC9saT48L3VsPjxocj48cD5OZXh0IG1lZXRpbmc6IEphbnVhcnkgNSwgMjAyNTwvcD4iCiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtd3lzaXd5Zz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3V0cHV0LWFjdGlvbnMiPgogICAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1zaG93LWh0bWwtb3V0cHV0IiBjbGFzcz0iZGVtby1idXR0b24iPlNob3cgSFRNTCBPdXRwdXQ8L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxwcmUgaWQ9Im91dHB1dC1wcmV2aWV3LWh0bWwiIGNsYXNzPSJvdXRwdXQtcHJldmlldyIgYXJpYS1saXZlPSJwb2xpdGUiPjwvcHJlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICAKICAgICAgICAgIDxkaXYgY2xhc3M9Im91dHB1dC1jYXJkIj4KICAgICAgICAgICAgPGRlZXMtaW5wdXQtd3lzaXd5ZyAKICAgICAgICAgICAgICBpZD0iZWRpdG9yLXJlY2lwZSIKICAgICAgICAgICAgICBsYWJlbD0iUmVjaXBlIEJsb2cgUG9zdCIgCiAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZvb2QgYmxvZyB3aXRoIG1peGVkIGNvbnRlbnQiCiAgICAgICAgICAgICAgb3V0cHV0Rm9ybWF0PSJtYXJrZG93biIKICAgICAgICAgICAgICB2YWx1ZT0iIyBVbHRpbWF0ZSBDaG9jb2xhdGUgQ2hpcCBDb29raWVzCgpUaGVyZSdzIG5vdGhpbmcgcXVpdGUgbGlrZSB0aGUgc21lbGwgb2YgZnJlc2hseSBiYWtlZCBjaG9jb2xhdGUgY2hpcCBjb29raWVzLiBUaGlzIHJlY2lwZSBoYXMgYmVlbiBwZXJmZWN0ZWQgb3ZlciB5ZWFycyBvZiB0ZXN0aW5nIQoKIyMgSW5ncmVkaWVudHMKCi0gMsK8IGN1cHMgYWxsLXB1cnBvc2UgZmxvdXIKLSAxIHRzcCBiYWtpbmcgc29kYQotIDEgdHNwIHNhbHQKLSAxIGN1cCBidXR0ZXIsIHNvZnRlbmVkCi0gwr4gY3VwIGdyYW51bGF0ZWQgc3VnYXIKLSDCviBjdXAgcGFja2VkIGJyb3duIHN1Z2FyCi0gMiBsYXJnZSBlZ2dzCi0gMiB0c3AgdmFuaWxsYSBleHRyYWN0Ci0gMiBjdXBzIGNob2NvbGF0ZSBjaGlwcwoKIyMgSW5zdHJ1Y3Rpb25zCgojIyMgU3RlcCAxOiBQcmVwYXJhdGlvbgoKUHJlaGVhdCB5b3VyIG92ZW4gdG8gKiozNzXCsEYgKDE5MMKwQykqKi4gVGhpcyB0ZW1wZXJhdHVyZSBpcyBjcnVjaWFsIGZvciBhY2hpZXZpbmcgdGhlIHBlcmZlY3QgdGV4dHVyZS4KCiMjIyBTdGVwIDI6IE1peCBEcnkgSW5ncmVkaWVudHMKCkluIGEgbWVkaXVtIGJvd2wsIHdoaXNrIHRvZ2V0aGVyOgoKMS4gRmxvdXIKMi4gQmFraW5nIHNvZGEKMy4gU2FsdAoKIyMjIFN0ZXAgMzogQ3JlYW0gQnV0dGVyIGFuZCBTdWdhcnMKClxgXGBcYApDcmVhbSBidXR0ZXIgYW5kIHN1Z2FycyBmb3IgMy00IG1pbnV0ZXMKdW50aWwgbGlnaHQgYW5kIGZsdWZmeQpcYFxgXGAKCj4gKipQcm8gdGlwOioqIFJvb20gdGVtcGVyYXR1cmUgaW5ncmVkaWVudHMgbWl4IGJldHRlciBhbmQgY3JlYXRlIGEgbW9yZSB1bmlmb3JtIGRvdWdoLgoKIyMjIFN0ZXAgNDogQWRkIFdldCBJbmdyZWRpZW50cwoKQmVhdCBpbiBlZ2dzIG9uZSBhdCBhIHRpbWUsIHRoZW4gYWRkIHZhbmlsbGEgZXh0cmFjdC4KCiMjIyBTdGVwIDU6IENvbWJpbmUgYW5kIEJha2UKCkdyYWR1YWxseSBibGVuZCBpbiBmbG91ciBtaXh0dXJlLCB0aGVuIHN0aXIgaW4gY2hvY29sYXRlIGNoaXBzLiBEcm9wIHJvdW5kZWQgdGFibGVzcG9vbnMgb250byB1bmdyZWFzZWQgY29va2llIHNoZWV0cy4KCi0tLQoKKipCYWtpbmcgdGltZToqKiA5LTExIG1pbnV0ZXMgb3IgdW50aWwgZ29sZGVuIGJyb3duCgoqKllpZWxkOioqIEFib3V0IDUgZG96ZW4gY29va2llcyIKICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC13eXNpd3lnPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvdXRwdXQtYWN0aW9ucyI+CiAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYnRuLXNob3ctbWFya2Rvd24tb3V0cHV0IiBjbGFzcz0iZGVtby1idXR0b24iPlNob3cgTWFya2Rvd24gT3V0cHV0PC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8cHJlIGlkPSJvdXRwdXQtcHJldmlldy1tYXJrZG93biIgY2xhc3M9Im91dHB1dC1wcmV2aWV3IiBhcmlhLWxpdmU9InBvbGl0ZSI+PC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgoKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjYuIFx1ezFGM0E4fSBBZHZhbmNlZCBFZGl0aW5nIn0+CiAgICAgICAgPHAgY2xhc3M9InBhbmVsLWRlc2NyaXB0aW9uIj4KICAgICAgICAgIENyZWF0ZSBjb21wbGV4IGRvY3VtZW50cyB3aXRoIG1peGVkIGNvbnRlbnQgdHlwZXMuIFRoZSBlZGl0b3IgaGFuZGxlcyBhbGwgZm9ybWF0dGluZyBzZWFtbGVzc2x5LgogICAgICAgIDwvcD4KICAgICAgICAKICAgICAgICA8ZGVlcy1pbnB1dC13eXNpd3lnIAogICAgICAgICAgaWQ9ImVkaXRvci10ZWNobmljYWwiCiAgICAgICAgICBsYWJlbD0iVGVjaG5pY2FsIERvY3VtZW50YXRpb24iIAogICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSB0ZWNobmljYWwgZG9jcyB3aXRoIGNvZGUgZXhhbXBsZXMgYW5kIHN0cnVjdHVyZWQgY29udGVudCIKICAgICAgICAgIHZhbHVlPSI8aDE+QVBJIERvY3VtZW50YXRpb248L2gxPjxwPldlbGNvbWUgdG8gb3VyIEFQSSBkb2N1bWVudGF0aW9uLiBCZWxvdyB5b3UnbGwgZmluZCBleGFtcGxlcyBvZiBob3cgdG8gdXNlIG91ciBlbmRwb2ludHMuPC9wPjxoMj5BdXRoZW50aWNhdGlvbjwvaDI+PHA+QWxsIEFQSSByZXF1ZXN0cyByZXF1aXJlIGF1dGhlbnRpY2F0aW9uIHVzaW5nIGFuIEFQSSBrZXk6PC9wPjxwcmU+PGNvZGU+QXV0aG9yaXphdGlvbjogQmVhcmVyIFlPVVJfQVBJX0tFWTwvY29kZT48L3ByZT48aDI+RW5kcG9pbnRzPC9oMj48aDM+R0VUIC91c2VyczwvaDM+PHA+UmV0cmlldmUgYSBsaXN0IG9mIHVzZXJzIGZyb20gdGhlIHN5c3RlbS48L3A+PHByZT48Y29kZT5jdXJsIC1YIEdFVCBodHRwczovL2FwaS5leGFtcGxlLmNvbS91c2VycyBcXAogIC1IICZxdW90O0F1dGhvcml6YXRpb246IEJlYXJlciBZT1VSX0FQSV9LRVkmcXVvdDs8L2NvZGU+PC9wcmU+PGJsb2NrcXVvdGU+Tm90ZTogUmF0ZSBsaW1pdGluZyBhcHBsaWVzIHRvIGFsbCBlbmRwb2ludHMuIFlvdSBjYW4gbWFrZSB1cCB0byAxMDAgcmVxdWVzdHMgcGVyIG1pbnV0ZS48L2Jsb2NrcXVvdGU+PGgzPlBPU1QgL3VzZXJzPC9oMz48cD5DcmVhdGUgYSBuZXcgdXNlciBpbiB0aGUgc3lzdGVtLjwvcD48cHJlPjxjb2RlPnsKICAmcXVvdDtuYW1lJnF1b3Q7OiAmcXVvdDtKb2huIERvZSZxdW90OywKICAmcXVvdDtlbWFpbCZxdW90OzogJnF1b3Q7am9obkBleGFtcGxlLmNvbSZxdW90OywKICAmcXVvdDtyb2xlJnF1b3Q7OiAmcXVvdDt1c2VyJnF1b3Q7Cn08L2NvZGU+PC9wcmU+PGhyPjxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVmZXIgdG8gb3VyIGNvbXBsZXRlIGRvY3VtZW50YXRpb24uPC9wPiIKICAgICAgICAgIG91dHB1dEZvcm1hdD0iaHRtbCIKICAgICAgICA+PC9kZWVzLWlucHV0LXd5c2l3eWc+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI3LiBcdTI2OTlcdUZFMEYgRm9ybSBJbnRlZ3JhdGlvbiJ9PgogICAgICAgIDxwIGNsYXNzPSJwYW5lbC1kZXNjcmlwdGlvbiI+CiAgICAgICAgICBTZWFtbGVzc2x5IGludGVncmF0ZXMgd2l0aCBkZWVzLWZvcm0gZm9yIGNvbXBsZXRlIGZvcm0gc29sdXRpb25zLiAKICAgICAgICAgIEFsbCBzdGFuZGFyZCBmb3JtIGZlYXR1cmVzIGxpa2UgdmFsaWRhdGlvbiwgcmVxdWlyZWQgZmllbGRzLCBhbmQgZGF0YSBiaW5kaW5nIHdvcmsgb3V0IG9mIHRoZSBib3guCiAgICAgICAgPC9wPgogICAgICAgIAogICAgICAgIDxkZWVzLWZvcm0+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IAogICAgICAgICAgICBsYWJlbD0iQXJ0aWNsZSBUaXRsZSIgCiAgICAgICAgICAgIHJlcXVpcmVkPSJ0cnVlIgogICAgICAgICAgICB2YWx1ZT0iSG93IHRvIEJ1aWxkIE1vZGVybiBXZWIgQXBwbGljYXRpb25zIgogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC13eXNpd3lnIAogICAgICAgICAgICBpZD0iZWRpdG9yLWZvcm0taW50ZWdyYXRpb24iCiAgICAgICAgICAgIGxhYmVsPSJBcnRpY2xlIENvbnRlbnQiIAogICAgICAgICAgICBkZXNjcmlwdGlvbj0iV3JpdGUgeW91ciBhcnRpY2xlIGNvbnRlbnQgaGVyZSIKICAgICAgICAgICAgcmVxdWlyZWQ9InRydWUiCiAgICAgICAgICAgIG91dHB1dEZvcm1hdD0ibWFya2Rvd24iCiAgICAgICAgICA+PC9kZWVzLWlucHV0LXd5c2l3eWc+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LXRhZ3MKICAgICAgICAgICAgbGFiZWw9IlRhZ3MiCiAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBZGQgcmVsZXZhbnQgdGFncyBmb3IgeW91ciBhcnRpY2xlIgogICAgICAgICAgPjwvZGVlcy1pbnB1dC10YWdzPgogICAgICAgIDwvZGVlcy1mb3JtPgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiOC4gXHV7MUY5RTl9IFByb2dyYW1tYXRpYyBCbG9jayBDcmVhdGlvbiJ9PgogICAgICAgIDxwIGNsYXNzPSJwYW5lbC1kZXNjcmlwdGlvbiI+CiAgICAgICAgICBDcmVhdGUgY29udGVudCBwcm9ncmFtbWF0aWNhbGx5IHVzaW5nIHRoZSBibG9jayBBUEkgZm9yIGR5bmFtaWMgZG9jdW1lbnQgZ2VuZXJhdGlvbi4KICAgICAgICA8L3A+CiAgICAgICAgCiAgICAgICAgPGRlZXMtaW5wdXQtd3lzaXd5ZwogICAgICAgICAgaWQ9ImVkaXRvci1wcm9ncmFtbWF0aWMiCiAgICAgICAgICBsYWJlbD0iUHJvZ3JhbW1hdGljYWxseSBHZW5lcmF0ZWQgQ29udGVudCIKICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGlzIGNvbnRlbnQgd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIGltcG9ydEJsb2NrcyBBUEkiCiAgICAgICAgPjwvZGVlcy1pbnB1dC13eXNpd3lnPgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbi1ncm91cCI+CiAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tZ2VuZXJhdGUtcmVwb3J0IiBjbGFzcz0iZGVtby1idXR0b24iPgogICAgICAgICAgICBHZW5lcmF0ZSBSZXBvcnQKICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgCiAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tZ2VuZXJhdGUtcmVjaXBlIiBjbGFzcz0iZGVtby1idXR0b24iPgogICAgICAgICAgICBHZW5lcmF0ZSBSZWNpcGUKICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgCiAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tY2xlYXItZWRpdG9yIiBjbGFzcz0iZGVtby1idXR0b24iPgogICAgICAgICAgICBDbGVhciBFZGl0b3IKICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiOS4gXHV7MUY0RTR9IEV4cG9ydC9JbXBvcnQgRmVhdHVyZXMifT4KICAgICAgICA8cCBjbGFzcz0icGFuZWwtZGVzY3JpcHRpb24iPgogICAgICAgICAgVGhlIFdZU0lXWUcgZWRpdG9yIHByb3ZpZGVzIG11bHRpcGxlIGV4cG9ydCBmb3JtYXRzIGFuZCBsb3NzbGVzcyBzYXZlL3Jlc3RvcmUgY2FwYWJpbGl0aWVzIGZvciBtYXhpbXVtIGZsZXhpYmlsaXR5LgogICAgICAgIDwvcD4KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJleHBvcnQtaW5mby1ncmlkIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImV4cG9ydC1pbmZvLWNhcmQgYmxvY2tzIj4KICAgICAgICAgICAgPHN0cm9uZz5Mb3NzbGVzcyBCbG9ja3M8L3N0cm9uZz4KICAgICAgICAgICAgPHA+RXhwb3J0IGFuZCBpbXBvcnQgcmF3IGJsb2NrIHN0cnVjdHVyZSBmb3IgcGVyZmVjdCByb3VuZC10cmlwIGVkaXRpbmc8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImV4cG9ydC1pbmZvLWNhcmQgaHRtbCI+CiAgICAgICAgICAgIDxzdHJvbmc+SFRNTCBFeHBvcnQ8L3N0cm9uZz4KICAgICAgICAgICAgPHA+R2V0IGNsZWFuLCBzZW1hbnRpYyBIVE1MIHJlZ2FyZGxlc3Mgb2Ygb3V0cHV0IGZvcm1hdCBzZXR0aW5nPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJleHBvcnQtaW5mby1jYXJkIG1hcmtkb3duIj4KICAgICAgICAgICAgPHN0cm9uZz5NYXJrZG93biBFeHBvcnQ8L3N0cm9uZz4KICAgICAgICAgICAgPHA+RXhwb3J0IGFzIE1hcmtkb3duIGZvciBkb2NzLCBSRUFETUVzLCBhbmQgc3RhdGljIHNpdGVzPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJleHBvcnQtaW5mby1jYXJkIHN0YXRlIj4KICAgICAgICAgICAgPHN0cm9uZz5TdGF0ZSBNYW5hZ2VtZW50PC9zdHJvbmc+CiAgICAgICAgICAgIDxwPlNhdmUgYW5kIHJlc3RvcmUgY29tcGxldGUgZWRpdG9yIHN0YXRlIGluY2x1ZGluZyBzZXR0aW5nczwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIAogICAgICAgIDxkZWVzLWlucHV0LXd5c2l3eWcKICAgICAgICAgIGlkPSJlZGl0b3ItZXhwb3J0IgogICAgICAgICAgbGFiZWw9IkV4cG9ydCBEZW1vIEVkaXRvciIKICAgICAgICAgIGRlc2NyaXB0aW9uPSJUcnkgdGhlIGV4cG9ydCBidXR0b25zIGJlbG93IHRvIHNlZSBkaWZmZXJlbnQgb3V0cHV0IGZvcm1hdHMiCiAgICAgICAgICB2YWx1ZT0iPGgxPlNvZnR3YXJlIFJlbGVhc2UgTm90ZXM8L2gxPjxwPjxzdHJvbmc+VmVyc2lvbiAyLjUuMDwvc3Ryb25nPiAtIFJlbGVhc2VkIERlY2VtYmVyIDE1LCAyMDI0PC9wPjxoMj7wn46JIE5ldyBGZWF0dXJlczwvaDI+PHVsPjxsaT5BZGRlZCBkYXJrIG1vZGUgc3VwcG9ydCBhY3Jvc3MgYWxsIGNvbXBvbmVudHM8L2xpPjxsaT5JbXBsZW1lbnRlZCByZWFsLXRpbWUgY29sbGFib3JhdGlvbiBmZWF0dXJlczwvbGk+PGxpPk5ldyBkYXNoYm9hcmQgYW5hbHl0aWNzIHdpZGdldHM8L2xpPjxsaT5FeHBvcnQgZnVuY3Rpb25hbGl0eSBmb3IgYWxsIHJlcG9ydCB0eXBlczwvbGk+PC91bD48aDI+8J+QmyBCdWcgRml4ZXM8L2gyPjx1bD48bGk+Rml4ZWQgbWVtb3J5IGxlYWsgaW4gZGF0YSBwcm9jZXNzaW5nIG1vZHVsZTwvbGk+PGxpPlJlc29sdmVkIGF1dGhlbnRpY2F0aW9uIHRpbWVvdXQgaXNzdWVzPC9saT48bGk+Q29ycmVjdGVkIHRpbWV6b25lIGhhbmRsaW5nIGluIHNjaGVkdWxlZCB0YXNrczwvbGk+PC91bD48aDI+4pqhIFBlcmZvcm1hbmNlIEltcHJvdmVtZW50czwvaDI+PGJsb2NrcXVvdGU+UGFnZSBsb2FkIHRpbWVzIHJlZHVjZWQgYnkgNDAlIHRocm91Z2ggbGF6eSBsb2FkaW5nIGFuZCBjb2RlIHNwbGl0dGluZzwvYmxvY2txdW90ZT48aDI+8J+UpyBUZWNobmljYWwgRGV0YWlsczwvaDI+PHByZT48Y29kZT4vLyBOZXcgQVBJIGVuZHBvaW50IGZvciBiYXRjaCBvcGVyYXRpb25zClBPU1QgL2FwaS92Mi9iYXRjaAp7CiAgJnF1b3Q7b3BlcmF0aW9ucyZxdW90OzogWwogICAgeyAmcXVvdDttZXRob2QmcXVvdDs6ICZxdW90O0dFVCZxdW90OywgJnF1b3Q7cGF0aCZxdW90OzogJnF1b3Q7L3VzZXJzLzEyMyZxdW90OyB9LAogICAgeyAmcXVvdDttZXRob2QmcXVvdDs6ICZxdW90O1BVVCZxdW90OywgJnF1b3Q7cGF0aCZxdW90OzogJnF1b3Q7L3NldHRpbmdzJnF1b3Q7LCAmcXVvdDtib2R5JnF1b3Q7OiB7Li4ufSB9CiAgXQp9PC9jb2RlPjwvcHJlPjxoMj7wn5KhIE1pZ3JhdGlvbiBHdWlkZTwvaDI+PG9sPjxsaT5VcGRhdGUgeW91ciBkZXBlbmRlbmNpZXMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uczwvbGk+PGxpPlJ1biBkYXRhYmFzZSBtaWdyYXRpb25zOiA8Y29kZT5ucG0gcnVuIG1pZ3JhdGU8L2NvZGU+PC9saT48bGk+Q2xlYXIgY2FjaGU6IDxjb2RlPm5wbSBydW4gY2FjaGU6Y2xlYXI8L2NvZGU+PC9saT48bGk+UmVzdGFydCBhbGwgc2VydmljZXM8L2xpPjwvb2w+PGhyPjxwPkZvciBxdWVzdGlvbnMgb3IgaXNzdWVzLCBwbGVhc2UgY29udGFjdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBvciBmaWxlIGEgdGlja2V0IGluIG91ciBpc3N1ZSB0cmFja2VyLjwvcD4iCiAgICAgICAgPjwvZGVlcy1pbnB1dC13eXNpd3lnPgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbi1ncm91cCI+CiAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tZXhwb3J0LWJsb2NrcyIgY2xhc3M9ImRlbW8tYnV0dG9uIj4KICAgICAgICAgICAgRXhwb3J0IEJsb2NrcwogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAKICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1leHBvcnQtaHRtbCIgY2xhc3M9ImRlbW8tYnV0dG9uIj4KICAgICAgICAgICAgRXhwb3J0IGFzIEhUTUwKICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgCiAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tZXhwb3J0LW1hcmtkb3duIiBjbGFzcz0iZGVtby1idXR0b24iPgogICAgICAgICAgICBFeHBvcnQgYXMgTWFya2Rvd24KICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgCiAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tc2F2ZS1zdGF0ZSIgY2xhc3M9ImRlbW8tYnV0dG9uIj4KICAgICAgICAgICAgU2F2ZSBTdGF0ZQogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAKICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1yZXN0b3JlLXN0YXRlIiBjbGFzcz0iZGVtby1idXR0b24iPgogICAgICAgICAgICBSZXN0b3JlIFN0YXRlCiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kaXY+CiAgPC9kZWVzLWRlbW93cmFwcGVyPgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy93eXNpd3lnLnNob3J0Y3V0cy5qcwp2YXIgV3lzaXd5Z1Nob3J0Y3V0cyA9IGNsYXNzIHsKICBzdGF0aWMgSEVBRElOR19QQVRURVJOUyA9IFsKICAgIHsgcGF0dGVybjogL14jW1xzXHUwMEEwXSQvLCB0eXBlOiAiaGVhZGluZy0xIiB9LAogICAgeyBwYXR0ZXJuOiAvXiMjW1xzXHUwMEEwXSQvLCB0eXBlOiAiaGVhZGluZy0yIiB9LAogICAgeyBwYXR0ZXJuOiAvXiMjI1tcc1x1MDBBMF0kLywgdHlwZTogImhlYWRpbmctMyIgfQogIF07CiAgc3RhdGljIExJU1RfUEFUVEVSTlMgPSBbCiAgICB7IHBhdHRlcm46IC9eWyotXVtcc1x1MDBBMF0kLywgdHlwZTogImJ1bGxldCIgfSwKICAgIHsgcGF0dGVybjogL14oXGQrKVwuW1xzXHUwMEEwXSQvLCB0eXBlOiAib3JkZXJlZCIgfSwKICAgIHsgcGF0dGVybjogL14oXGQrKVwpW1xzXHUwMEEwXSQvLCB0eXBlOiAib3JkZXJlZCIgfQogIF07CiAgc3RhdGljIFFVT1RFX1BBVFRFUk4gPSAvXj5bXHNcdTAwQTBdJC87CiAgc3RhdGljIENPREVfUEFUVEVSTiA9IC9eYGBgJC87CiAgc3RhdGljIERJVklERVJfUEFUVEVSTlMgPSBbIi0tLSIsICIqKioiLCAiX19fIl07CiAgc3RhdGljIGNoZWNrSGVhZGluZ1Nob3J0Y3V0KGNvbnRlbnQzKSB7CiAgICBmb3IgKGNvbnN0IHsgcGF0dGVybiwgdHlwZTogdHlwZTUgfSBvZiB0aGlzLkhFQURJTkdfUEFUVEVSTlMpIHsKICAgICAgaWYgKHBhdHRlcm4udGVzdChjb250ZW50MykpIHsKICAgICAgICByZXR1cm4geyB0eXBlOiB0eXBlNSB9OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgc3RhdGljIGNoZWNrTGlzdFNob3J0Y3V0KGNvbnRlbnQzKSB7CiAgICBmb3IgKGNvbnN0IHsgcGF0dGVybiwgdHlwZTogdHlwZTUgfSBvZiB0aGlzLkxJU1RfUEFUVEVSTlMpIHsKICAgICAgaWYgKHBhdHRlcm4udGVzdChjb250ZW50MykpIHsKICAgICAgICByZXR1cm4geyB0eXBlOiAibGlzdCIsIGxpc3RUeXBlOiB0eXBlNSB9OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgc3RhdGljIGNoZWNrUXVvdGVTaG9ydGN1dChjb250ZW50MykgewogICAgcmV0dXJuIHRoaXMuUVVPVEVfUEFUVEVSTi50ZXN0KGNvbnRlbnQzKTsKICB9CiAgc3RhdGljIGNoZWNrQ29kZVNob3J0Y3V0KGNvbnRlbnQzKSB7CiAgICByZXR1cm4gdGhpcy5DT0RFX1BBVFRFUk4udGVzdChjb250ZW50Myk7CiAgfQogIHN0YXRpYyBjaGVja0RpdmlkZXJTaG9ydGN1dChjb250ZW50MykgewogICAgcmV0dXJuIHRoaXMuRElWSURFUl9QQVRURVJOUy5pbmNsdWRlcyhjb250ZW50Myk7CiAgfQogIHN0YXRpYyBnZXRTbGFzaE1lbnVJdGVtcygpIHsKICAgIHJldHVybiBbCiAgICAgIHsgdHlwZTogInBhcmFncmFwaCIsIGxhYmVsOiAiUGFyYWdyYXBoIiwgaWNvbjogImx1Y2lkZTpwaWxjcm93IiB9LAogICAgICB7IHR5cGU6ICJoZWFkaW5nLTEiLCBsYWJlbDogIkhlYWRpbmcgMSIsIGljb246ICJsdWNpZGU6aGVhZGluZzEiIH0sCiAgICAgIHsgdHlwZTogImhlYWRpbmctMiIsIGxhYmVsOiAiSGVhZGluZyAyIiwgaWNvbjogImx1Y2lkZTpoZWFkaW5nMiIgfSwKICAgICAgeyB0eXBlOiAiaGVhZGluZy0zIiwgbGFiZWw6ICJIZWFkaW5nIDMiLCBpY29uOiAibHVjaWRlOmhlYWRpbmczIiB9LAogICAgICB7IHR5cGU6ICJxdW90ZSIsIGxhYmVsOiAiUXVvdGUiLCBpY29uOiAibHVjaWRlOnF1b3RlIiB9LAogICAgICB7IHR5cGU6ICJjb2RlIiwgbGFiZWw6ICJDb2RlIEJsb2NrIiwgaWNvbjogImx1Y2lkZTpmaWxlQ29kZSIgfSwKICAgICAgeyB0eXBlOiAibGlzdCIsIGxhYmVsOiAiQnVsbGV0IExpc3QiLCBpY29uOiAibHVjaWRlOmxpc3QiIH0sCiAgICAgIHsgdHlwZTogImltYWdlIiwgbGFiZWw6ICJJbWFnZSIsIGljb246ICJsdWNpZGU6aW1hZ2UiIH0sCiAgICAgIHsgdHlwZTogImRpdmlkZXIiLCBsYWJlbDogIkRpdmlkZXIiLCBpY29uOiAibHVjaWRlOm1pbnVzIiB9LAogICAgICB7IHR5cGU6ICJ5b3V0dWJlIiwgbGFiZWw6ICJZb3VUdWJlIiwgaWNvbjogImx1Y2lkZTp5b3V0dWJlIiB9LAogICAgICB7IHR5cGU6ICJtYXJrZG93biIsIGxhYmVsOiAiTWFya2Rvd24iLCBpY29uOiAibHVjaWRlOmZpbGVUZXh0IiB9LAogICAgICB7IHR5cGU6ICJodG1sIiwgbGFiZWw6ICJIVE1MIiwgaWNvbjogImx1Y2lkZTpjb2RlIiB9LAogICAgICB7IHR5cGU6ICJhdHRhY2htZW50IiwgbGFiZWw6ICJGaWxlIEF0dGFjaG1lbnQiLCBpY29uOiAibHVjaWRlOnBhcGVyY2xpcCIgfQogICAgXTsKICB9CiAgc3RhdGljIGdlbmVyYXRlQmxvY2tJZCgpIHsKICAgIHJldHVybiBgYmxvY2stJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvZGVlcy1zbGFzaC1tZW51LmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfZGVlc19pY29uKCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTU5ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM2MCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1NsYXNoTWVudSA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtc2xhc2gtbWVudSIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3Zpc2libGVfZGVjb3JhdG9yczsKICBsZXQgX3Zpc2libGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92aXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wb3NpdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfcG9zaXRpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZmlsdGVyX2RlY29yYXRvcnM7CiAgbGV0IF9maWx0ZXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWx0ZXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkSW5kZXhfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkSW5kZXhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZEluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tZW51WkluZGV4X2RlY29yYXRvcnM7CiAgbGV0IF9tZW51WkluZGV4X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWVudVpJbmRleF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzU2xhc2hNZW51MiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3Zpc2libGVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3Bvc2l0aW9uX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9maWx0ZXJfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3NlbGVjdGVkSW5kZXhfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX21lbnVaSW5kZXhfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlNTkodGhpcywgbnVsbCwgX3Zpc2libGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmlzaWJsZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmlzaWJsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai52aXNpYmxlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52aXNpYmxlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Zpc2libGVfaW5pdGlhbGl6ZXJzLCBfdmlzaWJsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU5KHRoaXMsIG51bGwsIF9wb3NpdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwb3NpdGlvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicG9zaXRpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucG9zaXRpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnBvc2l0aW9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Bvc2l0aW9uX2luaXRpYWxpemVycywgX3Bvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTkodGhpcywgbnVsbCwgX2ZpbHRlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJmaWx0ZXIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZpbHRlciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5maWx0ZXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmZpbHRlciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9maWx0ZXJfaW5pdGlhbGl6ZXJzLCBfZmlsdGVyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTkodGhpcywgbnVsbCwgX3NlbGVjdGVkSW5kZXhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0ZWRJbmRleCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0ZWRJbmRleCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWxlY3RlZEluZGV4LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3RlZEluZGV4ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGVkSW5kZXhfaW5pdGlhbGl6ZXJzLCBfc2VsZWN0ZWRJbmRleF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU5KHRoaXMsIG51bGwsIF9tZW51WkluZGV4X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1lbnVaSW5kZXgiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1lbnVaSW5kZXgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWVudVpJbmRleCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWVudVpJbmRleCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tZW51WkluZGV4X2luaXRpYWxpemVycywgX21lbnVaSW5kZXhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1OShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNTbGFzaE1lbnUyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBpbnN0YW5jZTsKICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHsKICAgICAgaWYgKCFEZWVzU2xhc2hNZW51Mi5pbnN0YW5jZSkgewogICAgICAgIERlZXNTbGFzaE1lbnUyLmluc3RhbmNlID0gbmV3IERlZXNTbGFzaE1lbnUyKCk7CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEZWVzU2xhc2hNZW51Mi5pbnN0YW5jZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIERlZXNTbGFzaE1lbnUyLmluc3RhbmNlOwogICAgfQogICAgI3Zpc2libGVfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX3Zpc2libGVfaW5pdGlhbGl6ZXJzLCBmYWxzZSk7CiAgICBnZXQgdmlzaWJsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Zpc2libGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB2aXNpYmxlKHZhbHVlMikgewogICAgICB0aGlzLiN2aXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczYwKHRoaXMsIF92aXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2MCh0aGlzLCBfcG9zaXRpb25faW5pdGlhbGl6ZXJzLCB7IHg6IDAsIHk6IDAgfSkpOwogICAgZ2V0IHBvc2l0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy4jcG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwb3NpdGlvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jcG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNmaWx0ZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczYwKHRoaXMsIF9wb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX2ZpbHRlcl9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgZmlsdGVyKCkgewogICAgICByZXR1cm4gdGhpcy4jZmlsdGVyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZmlsdGVyKHZhbHVlMikgewogICAgICB0aGlzLiNmaWx0ZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWxlY3RlZEluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2MCh0aGlzLCBfZmlsdGVyX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2MCh0aGlzLCBfc2VsZWN0ZWRJbmRleF9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBzZWxlY3RlZEluZGV4KCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNlbGVjdGVkSW5kZXgodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlbGVjdGVkSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtZW51WkluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2MCh0aGlzLCBfc2VsZWN0ZWRJbmRleF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX21lbnVaSW5kZXhfaW5pdGlhbGl6ZXJzLCAxZTMpKTsKICAgIGdldCBtZW51WkluZGV4KCkgewogICAgICByZXR1cm4gdGhpcy4jbWVudVpJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1lbnVaSW5kZXgodmFsdWUyKSB7CiAgICAgIHRoaXMuI21lbnVaSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGNhbGxiYWNrID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX21lbnVaSW5kZXhfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAwOwogICAgICAgIGhlaWdodDogMDsKICAgICAgfQoKICAgICAgLnNsYXNoLW1lbnUgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMDkwOTBiIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSksIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDYpOwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgICBtaW4td2lkdGg6IDIyMHB4OwogICAgICAgIG1heC1oZWlnaHQ6IDMwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgYW5pbWF0aW9uOiBmYWRlSW5TY2FsZSAwLjE1cyBlYXNlLW91dDsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBmYWRlSW5TY2FsZSB7CiAgICAgICAgZnJvbSB7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk4KSB0cmFuc2xhdGVZKC0ycHgpOwogICAgICAgIH0KICAgICAgICB0byB7CiAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGVZKDApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLnNsYXNoLW1lbnUtaXRlbSB7CiAgICAgICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQoKICAgICAgLnNsYXNoLW1lbnUtaXRlbTpob3ZlciwKICAgICAgLnNsYXNoLW1lbnUtaXRlbS5zZWxlY3RlZCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmNGY0ZjUiLCAiIzI3MjcyYSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgICAgfQoKICAgICAgLnNsYXNoLW1lbnUtaXRlbSAuaWNvbiB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgICAgfQoKICAgICAgLnNsYXNoLW1lbnUtaXRlbTpob3ZlciAuaWNvbiwKICAgICAgLnNsYXNoLW1lbnUtaXRlbS5zZWxlY3RlZCAuaWNvbiB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiMzYjgyZjYiKX07CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIGlmICghdGhpcy52aXNpYmxlKQogICAgICAgIHJldHVybiBiMmBgOwogICAgICB0aGlzLnN0eWxlLnpJbmRleCA9IHRoaXMubWVudVpJbmRleC50b1N0cmluZygpOwogICAgICBjb25zdCBtZW51SXRlbXMgPSB0aGlzLmdldEZpbHRlcmVkTWVudUl0ZW1zKCk7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiAKICAgICAgICBjbGFzcz0ic2xhc2gtbWVudSIgCiAgICAgICAgc3R5bGU9ImxlZnQ6ICR7dGhpcy5wb3NpdGlvbi54fXB4OyB0b3A6ICR7dGhpcy5wb3NpdGlvbi55fXB4OyIKICAgICAgICB0YWJpbmRleD0iLTEiCiAgICAgICAgZGF0YS1tZW51LXR5cGU9InNsYXNoIgogICAgICA+CiAgICAgICAgJHttZW51SXRlbXMubWFwKChpdGVtLCBpbmRleDIpID0+IGIyYAogICAgICAgICAgPGRpdiAKICAgICAgICAgICAgY2xhc3M9InNsYXNoLW1lbnUtaXRlbSAke2luZGV4MiA9PT0gdGhpcy5zZWxlY3RlZEluZGV4ID8gInNlbGVjdGVkIiA6ICIifSIKICAgICAgICAgICAgZGF0YS1pdGVtLXR5cGU9IiR7aXRlbS50eXBlfSIKICAgICAgICAgICAgZGF0YS1pdGVtLWluZGV4PSIke2luZGV4Mn0iCiAgICAgICAgICA+CiAgICAgICAgICAgIDxkZWVzLWljb24gY2xhc3M9Imljb24iIC5pY29uPSIke2l0ZW0uaWNvbn0iIGljb25TaXplPSIxNiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgIDxzcGFuPiR7aXRlbS5sYWJlbH08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgKX0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgZ2V0RmlsdGVyZWRNZW51SXRlbXMoKSB7CiAgICAgIGNvbnN0IGFsbEl0ZW1zID0gV3lzaXd5Z1Nob3J0Y3V0cy5nZXRTbGFzaE1lbnVJdGVtcygpOwogICAgICByZXR1cm4gYWxsSXRlbXMuZmlsdGVyKChpdGVtKSA9PiB0aGlzLmZpbHRlciA9PT0gIiIgfHwgaXRlbS5sYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuZmlsdGVyLnRvTG93ZXJDYXNlKCkpKTsKICAgIH0KICAgIHNlbGVjdEl0ZW0odHlwZTUpIHsKICAgICAgaWYgKHRoaXMuY2FsbGJhY2spIHsKICAgICAgICB0aGlzLmNhbGxiYWNrKHR5cGU1KTsKICAgICAgfQogICAgICB0aGlzLmhpZGUoKTsKICAgIH0KICAgIHNob3cocG9zaXRpb24zLCBjYWxsYmFjaykgewogICAgICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb24zOwogICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgIHRoaXMuZmlsdGVyID0gIiI7CiAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7CiAgICAgIHRoaXMubWVudVpJbmRleCA9IHpJbmRleFJlZ2lzdHJ5LmdldE5leHRaSW5kZXgoKTsKICAgICAgekluZGV4UmVnaXN0cnkucmVnaXN0ZXIodGhpcywgdGhpcy5tZW51WkluZGV4KTsKICAgICAgdGhpcy5zdHlsZS56SW5kZXggPSB0aGlzLm1lbnVaSW5kZXgudG9TdHJpbmcoKTsKICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTsKICAgIH0KICAgIGhpZGUoKSB7CiAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlOwogICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbDsKICAgICAgdGhpcy5maWx0ZXIgPSAiIjsKICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gMDsKICAgICAgekluZGV4UmVnaXN0cnkudW5yZWdpc3Rlcih0aGlzKTsKICAgIH0KICAgIHVwZGF0ZUZpbHRlcihmaWx0ZXIyKSB7CiAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyMjsKICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gMDsKICAgIH0KICAgIG5hdmlnYXRlKGRpcmVjdGlvbikgewogICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0RmlsdGVyZWRNZW51SXRlbXMoKTsKICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gImRvd24iKSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gKHRoaXMuc2VsZWN0ZWRJbmRleCArIDEpICUgaXRlbXMubGVuZ3RoOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IHRoaXMuc2VsZWN0ZWRJbmRleCA9PT0gMCA/IGl0ZW1zLmxlbmd0aCAtIDEgOiB0aGlzLnNlbGVjdGVkSW5kZXggLSAxOwogICAgICB9CiAgICB9CiAgICBzZWxlY3RDdXJyZW50KCkgewogICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0RmlsdGVyZWRNZW51SXRlbXMoKTsKICAgICAgaWYgKGl0ZW1zW3RoaXMuc2VsZWN0ZWRJbmRleF0pIHsKICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oaXRlbXNbdGhpcy5zZWxlY3RlZEluZGV4XS50eXBlKTsKICAgICAgfQogICAgfQogICAgZmlyc3RVcGRhdGVkKCkgewogICAgICB0aGlzLnNoYWRvd1Jvb3Q/LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsIChlMTEpID0+IHsKICAgICAgICBjb25zdCBtZW51ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuc2xhc2gtbWVudSIpOwogICAgICAgIGlmIChtZW51ICYmIG1lbnUuY29udGFpbnMoZTExLnRhcmdldCkpIHsKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMuc2hhZG93Um9vdD8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZTExKSA9PiB7CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZTExLnRhcmdldDsKICAgICAgICBjb25zdCBtZW51SXRlbSA9IHRhcmdldC5jbG9zZXN0KCIuc2xhc2gtbWVudS1pdGVtIik7CiAgICAgICAgaWYgKG1lbnVJdGVtKSB7CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgIGNvbnN0IGl0ZW1UeXBlID0gbWVudUl0ZW0uZ2V0QXR0cmlidXRlKCJkYXRhLWl0ZW0tdHlwZSIpOwogICAgICAgICAgaWYgKGl0ZW1UeXBlKSB7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShpdGVtVHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdGhpcy5zaGFkb3dSb290Py5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIiwgKGUxMSkgPT4gewogICAgICAgIGNvbnN0IHRhcmdldCA9IGUxMS50YXJnZXQ7CiAgICAgICAgY29uc3QgbWVudUl0ZW0gPSB0YXJnZXQuY2xvc2VzdCgiLnNsYXNoLW1lbnUtaXRlbSIpOwogICAgICAgIGlmIChtZW51SXRlbSkgewogICAgICAgICAgY29uc3QgaW5kZXgyID0gcGFyc2VJbnQobWVudUl0ZW0uZ2V0QXR0cmlidXRlKCJkYXRhLWl0ZW0taW5kZXgiKSB8fCAiMCIsIDEwKTsKICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IGluZGV4MjsKICAgICAgICB9CiAgICAgIH0sIHRydWUpOwogICAgICB0aGlzLnNoYWRvd1Jvb3Q/LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwgKGUxMSkgPT4gewogICAgICAgIGNvbnN0IG1lbnUgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5zbGFzaC1tZW51Iik7CiAgICAgICAgaWYgKG1lbnUgJiYgbWVudS5jb250YWlucyhlMTEudGFyZ2V0KSkgewogICAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgfQogICAgICB9LCB0cnVlKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNjAoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNTbGFzaE1lbnUyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvd3lzaXd5Zy5zZWxlY3Rpb24uanMKdmFyIFd5c2l3eWdTZWxlY3Rpb24gPSBjbGFzcyB7CiAgLyoqCiAgICogR2V0cyBzZWxlY3Rpb24gaW5mbyB0aGF0IHdvcmtzIGFjcm9zcyBTaGFkb3cgRE9NIGJvdW5kYXJpZXMKICAgKiBAcGFyYW0gc2hhZG93Um9vdHMgLSBTaGFkb3cgcm9vdHMgdG8gaW5jbHVkZSBpbiB0aGUgc2VsZWN0aW9uIHNlYXJjaAogICAqLwogIHN0YXRpYyBnZXRTZWxlY3Rpb25JbmZvKC4uLnNoYWRvd1Jvb3RzKSB7CiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICBjb25zb2xlLmxvZygiV3lzaXd5Z1NlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvIC0gc2VsZWN0aW9uOiIsIHNlbGVjdGlvbiwgInJhbmdlQ291bnQ6Iiwgc2VsZWN0aW9uPy5yYW5nZUNvdW50KTsKICAgIGlmICghc2VsZWN0aW9uKQogICAgICByZXR1cm4gbnVsbDsKICAgIGlmICgiZ2V0Q29tcG9zZWRSYW5nZXMiIGluIHNlbGVjdGlvbiAmJiB0eXBlb2Ygc2VsZWN0aW9uLmdldENvbXBvc2VkUmFuZ2VzID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIGNvbnNvbGUubG9nKCJVc2luZyBnZXRDb21wb3NlZFJhbmdlcyB3aXRoIiwgc2hhZG93Um9vdHMubGVuZ3RoLCAic2hhZG93IHJvb3RzIik7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmFuZ2VzID0gc2VsZWN0aW9uLmdldENvbXBvc2VkUmFuZ2VzKHsgc2hhZG93Um9vdHMgfSk7CiAgICAgICAgY29uc29sZS5sb2coImdldENvbXBvc2VkUmFuZ2VzIHJldHVybmVkIiwgcmFuZ2VzLmxlbmd0aCwgInJhbmdlcyIpOwogICAgICAgIGlmIChyYW5nZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgY29uc3QgcmFuZ2UyID0gcmFuZ2VzWzBdOwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgc3RhcnRDb250YWluZXI6IHJhbmdlMi5zdGFydENvbnRhaW5lciwKICAgICAgICAgICAgc3RhcnRPZmZzZXQ6IHJhbmdlMi5zdGFydE9mZnNldCwKICAgICAgICAgICAgZW5kQ29udGFpbmVyOiByYW5nZTIuZW5kQ29udGFpbmVyLAogICAgICAgICAgICBlbmRPZmZzZXQ6IHJhbmdlMi5lbmRPZmZzZXQsCiAgICAgICAgICAgIGNvbGxhcHNlZDogcmFuZ2UyLmNvbGxhcHNlZAogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJnZXRDb21wb3NlZFJhbmdlcyBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBnZXRSYW5nZUF0OiIsIGVycm9yKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY29uc29sZS5sb2coImdldENvbXBvc2VkUmFuZ2VzIG5vdCBhdmFpbGFibGUsIHVzaW5nIGZhbGxiYWNrIik7CiAgICB9CiAgICBpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7CiAgICAgIGNvbnN0IHJhbmdlMiA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgICByZXR1cm4gewogICAgICAgIHN0YXJ0Q29udGFpbmVyOiByYW5nZTIuc3RhcnRDb250YWluZXIsCiAgICAgICAgc3RhcnRPZmZzZXQ6IHJhbmdlMi5zdGFydE9mZnNldCwKICAgICAgICBlbmRDb250YWluZXI6IHJhbmdlMi5lbmRDb250YWluZXIsCiAgICAgICAgZW5kT2Zmc2V0OiByYW5nZTIuZW5kT2Zmc2V0LAogICAgICAgIGNvbGxhcHNlZDogcmFuZ2UyLmNvbGxhcHNlZAogICAgICB9OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIC8qKgogICAqIENoZWNrcyBpZiBhIHNlbGVjdGlvbiBpcyB3aXRoaW4gYSBzcGVjaWZpYyBlbGVtZW50IChjb25zaWRlcmluZyBTaGFkb3cgRE9NKQogICAqLwogIHN0YXRpYyBpc1NlbGVjdGlvbkluRWxlbWVudChlbGVtZW50NCwgc2hhZG93Um9vdCkgewogICAgY29uc3Qgc2VsZWN0aW9uSW5mbyA9IHNoYWRvd1Jvb3QgPyB0aGlzLmdldFNlbGVjdGlvbkluZm8oc2hhZG93Um9vdCkgOiB0aGlzLmdldFNlbGVjdGlvbkluZm8oKTsKICAgIGlmICghc2VsZWN0aW9uSW5mbykKICAgICAgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIGVsZW1lbnQ0LmNvbnRhaW5zKHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIpIHx8IGVsZW1lbnQ0LmNvbnRhaW5zKHNlbGVjdGlvbkluZm8uZW5kQ29udGFpbmVyKTsKICB9CiAgLyoqCiAgICogR2V0cyB0aGUgc2VsZWN0ZWQgdGV4dCBhY3Jvc3MgU2hhZG93IERPTSBib3VuZGFyaWVzCiAgICovCiAgc3RhdGljIGdldFNlbGVjdGVkVGV4dCgpIHsKICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgIHJldHVybiBzZWxlY3Rpb24gPyBzZWxlY3Rpb24udG9TdHJpbmcoKSA6ICIiOwogIH0KICAvKioKICAgKiBDcmVhdGVzIGEgcmFuZ2UgZnJvbSBzZWxlY3Rpb24gaW5mbwogICAqLwogIHN0YXRpYyBjcmVhdGVSYW5nZUZyb21JbmZvKGluZm8pIHsKICAgIGNvbnN0IHJhbmdlMiA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICByYW5nZTIuc2V0U3RhcnQoaW5mby5zdGFydENvbnRhaW5lciwgaW5mby5zdGFydE9mZnNldCk7CiAgICByYW5nZTIuc2V0RW5kKGluZm8uZW5kQ29udGFpbmVyLCBpbmZvLmVuZE9mZnNldCk7CiAgICByZXR1cm4gcmFuZ2UyOwogIH0KICAvKioKICAgKiBTZXRzIHNlbGVjdGlvbiBmcm9tIGEgcmFuZ2UgKHdvcmtzIHdpdGggU2hhZG93IERPTSkKICAgKi8KICBzdGF0aWMgc2V0U2VsZWN0aW9uRnJvbVJhbmdlKHJhbmdlMikgewogICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgaWYgKHNlbGVjdGlvbikgewogICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZTIpOwogICAgfQogIH0KICAvKioKICAgKiBHZXRzIGN1cnNvciBwb3NpdGlvbiByZWxhdGl2ZSB0byBhIHNwZWNpZmljIGVsZW1lbnQKICAgKi8KICBzdGF0aWMgZ2V0Q3Vyc29yUG9zaXRpb25JbkVsZW1lbnQoZWxlbWVudDQsIC4uLnNoYWRvd1Jvb3RzKSB7CiAgICBjb25zdCBzZWxlY3Rpb25JbmZvID0gc2hhZG93Um9vdHMubGVuZ3RoID4gMCA/IHRoaXMuZ2V0U2VsZWN0aW9uSW5mbyguLi5zaGFkb3dSb290cykgOiB0aGlzLmdldFNlbGVjdGlvbkluZm8oKTsKICAgIGlmICghc2VsZWN0aW9uSW5mbyB8fCAhc2VsZWN0aW9uSW5mby5jb2xsYXBzZWQpCiAgICAgIHJldHVybiBudWxsOwogICAgdHJ5IHsKICAgICAgY29uc3QgcmFuZ2UyID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgcmFuZ2UyLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50NCk7CiAgICAgIGNvbnN0IGlzQ29udGFpbmVkID0gdGhpcy5jb250YWluc0Fjcm9zc1NoYWRvd0RPTShlbGVtZW50NCwgc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lcik7CiAgICAgIGlmIChpc0NvbnRhaW5lZCkgewogICAgICAgIHJhbmdlMi5zZXRFbmQoc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lciwgc2VsZWN0aW9uSW5mby5zdGFydE9mZnNldCk7CiAgICAgICAgY29uc3QgcG9zaXRpb24zID0gcmFuZ2UyLnRvU3RyaW5nKCkubGVuZ3RoOwogICAgICAgIHJldHVybiBwb3NpdGlvbjM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgdGV4dDkgPSBlbGVtZW50NC50ZXh0Q29udGVudCB8fCAiIjsKICAgICAgICBjb25zdCBzZWxlY3Rpb25UZXh0ID0gc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lci50ZXh0Q29udGVudCB8fCAiIjsKICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydE9mZnNldCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb25JbmZvLnN0YXJ0T2Zmc2V0ID09PSBzZWxlY3Rpb25UZXh0Lmxlbmd0aCkgewogICAgICAgICAgcmV0dXJuIHRleHQ5Lmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgY29uc29sZS53YXJuKCJTZWxlY3Rpb24gY29udGFpbmVyIG5vdCB3aXRoaW4gZWxlbWVudCwgdXNpbmcgdGV4dCBtYXRjaGluZyBmYWxsYmFjayIpOwogICAgICAgIHJldHVybiBzZWxlY3Rpb25JbmZvLnN0YXJ0T2Zmc2V0OwogICAgICB9CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLndhcm4oIkZhaWxlZCB0byBnZXQgY3Vyc29yIHBvc2l0aW9uOiIsIGVycm9yKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQogIC8qKgogICAqIEdldHMgY3Vyc29yIHBvc2l0aW9uIGZyb20gbW91c2UgY29vcmRpbmF0ZXMgd2l0aCBTaGFkb3cgRE9NIHN1cHBvcnQKICAgKi8KICBzdGF0aWMgZ2V0Q3Vyc29yUG9zaXRpb25Gcm9tUG9pbnQoeDMsIHk1LCBjb250YWluZXIsIC4uLnNoYWRvd1Jvb3RzKSB7CiAgICBpZiAoImNhcmV0UG9zaXRpb25Gcm9tUG9pbnQiIGluIGRvY3VtZW50ICYmIGRvY3VtZW50LmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQpIHsKICAgICAgbGV0IGNhcmV0UG9zID0gbnVsbDsKICAgICAgdHJ5IHsKICAgICAgICBjYXJldFBvcyA9IGRvY3VtZW50LmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQoeDMsIHk1LCAuLi5zaGFkb3dSb290cyk7CiAgICAgIH0gY2F0Y2ggKGUxMSkgewogICAgICAgIGNhcmV0UG9zID0gZG9jdW1lbnQuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCh4MywgeTUpOwogICAgICB9CiAgICAgIGlmIChjYXJldFBvcyAmJiBjb250YWluZXIuY29udGFpbnMoY2FyZXRQb3Mub2Zmc2V0Tm9kZSkpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRPZmZzZXRJbkVsZW1lbnQoY2FyZXRQb3Mub2Zmc2V0Tm9kZSwgY2FyZXRQb3Mub2Zmc2V0LCBjb250YWluZXIpOwogICAgICB9CiAgICB9CiAgICBpZiAoImNhcmV0UmFuZ2VGcm9tUG9pbnQiIGluIGRvY3VtZW50KSB7CiAgICAgIGNvbnN0IHJhbmdlMiA9IGRvY3VtZW50LmNhcmV0UmFuZ2VGcm9tUG9pbnQoeDMsIHk1KTsKICAgICAgaWYgKHJhbmdlMiAmJiBjb250YWluZXIuY29udGFpbnMocmFuZ2UyLnN0YXJ0Q29udGFpbmVyKSkgewogICAgICAgIHJldHVybiB0aGlzLmdldE9mZnNldEluRWxlbWVudChyYW5nZTIuc3RhcnRDb250YWluZXIsIHJhbmdlMi5zdGFydE9mZnNldCwgY29udGFpbmVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIC8qKgogICAqIEhlbHBlciB0byBnZXQgdGhlIHRvdGFsIGNoYXJhY3RlciBvZmZzZXQgb2YgYSBwb3NpdGlvbiB3aXRoaW4gYW4gZWxlbWVudAogICAqLwogIHN0YXRpYyBnZXRPZmZzZXRJbkVsZW1lbnQobm9kZTIsIG9mZnNldCwgY29udGFpbmVyKSB7CiAgICBsZXQgdG90YWxPZmZzZXQgPSAwOwogICAgbGV0IGZvdW5kID0gZmFsc2U7CiAgICBjb25zdCB3YWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGNvbnRhaW5lciwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIG51bGwpOwogICAgbGV0IHRleHROb2RlOwogICAgd2hpbGUgKHRleHROb2RlID0gd2Fsa2VyLm5leHROb2RlKCkpIHsKICAgICAgaWYgKHRleHROb2RlID09PSBub2RlMikgewogICAgICAgIHRvdGFsT2Zmc2V0ICs9IG9mZnNldDsKICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG90YWxPZmZzZXQgKz0gdGV4dE5vZGUudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZm91bmQgPyB0b3RhbE9mZnNldCA6IDA7CiAgfQogIC8qKgogICAqIFNldHMgY3Vyc29yIHBvc2l0aW9uIGluIGFuIGVsZW1lbnQKICAgKi8KICBzdGF0aWMgc2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQsIHBvc2l0aW9uMykgewogICAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihlbGVtZW50NCwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIG51bGwpOwogICAgbGV0IGN1cnJlbnRQb3NpdGlvbiA9IDA7CiAgICBsZXQgdGFyZ2V0Tm9kZSA9IG51bGw7CiAgICBsZXQgdGFyZ2V0T2Zmc2V0ID0gMDsKICAgIHdoaWxlICh3YWxrZXIubmV4dE5vZGUoKSkgewogICAgICBjb25zdCBub2RlMiA9IHdhbGtlci5jdXJyZW50Tm9kZTsKICAgICAgY29uc3Qgbm9kZUxlbmd0aCA9IG5vZGUyLnRleHRDb250ZW50Py5sZW5ndGggfHwgMDsKICAgICAgaWYgKGN1cnJlbnRQb3NpdGlvbiArIG5vZGVMZW5ndGggPj0gcG9zaXRpb24zKSB7CiAgICAgICAgdGFyZ2V0Tm9kZSA9IG5vZGUyOwogICAgICAgIHRhcmdldE9mZnNldCA9IHBvc2l0aW9uMyAtIGN1cnJlbnRQb3NpdGlvbjsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjdXJyZW50UG9zaXRpb24gKz0gbm9kZUxlbmd0aDsKICAgIH0KICAgIGlmICh0YXJnZXROb2RlKSB7CiAgICAgIGNvbnN0IHJhbmdlMiA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgIHJhbmdlMi5zZXRTdGFydCh0YXJnZXROb2RlLCB0YXJnZXRPZmZzZXQpOwogICAgICByYW5nZTIuY29sbGFwc2UodHJ1ZSk7CiAgICAgIHRoaXMuc2V0U2VsZWN0aW9uRnJvbVJhbmdlKHJhbmdlMik7CiAgICB9CiAgfQogIC8qKgogICAqIENoZWNrIGlmIGEgbm9kZSBpcyBjb250YWluZWQgd2l0aGluIGFuIGVsZW1lbnQgYWNyb3NzIFNoYWRvdyBET00gYm91bmRhcmllcwogICAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgZWxlbWVudC5jb250YWlucygpIGRvZXNuJ3Qgd29yayBhY3Jvc3MgU2hhZG93IERPTQogICAqLwogIHN0YXRpYyBjb250YWluc0Fjcm9zc1NoYWRvd0RPTShjb250YWluZXIsIG5vZGUyKSB7CiAgICBpZiAoIWNvbnRhaW5lciB8fCAhbm9kZTIpCiAgICAgIHJldHVybiBmYWxzZTsKICAgIGxldCBjdXJyZW50ID0gbm9kZTI7CiAgICB3aGlsZSAoY3VycmVudCkgewogICAgICBpZiAoY3VycmVudCA9PT0gY29udGFpbmVyKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnQubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAmJiBjdXJyZW50Lmhvc3QpIHsKICAgICAgICBjb25zdCBzaGFkb3dSb290ID0gY3VycmVudDsKICAgICAgICBpZiAoc2hhZG93Um9vdC5jb250YWlucyhjb250YWluZXIpKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGN1cnJlbnQgPSBzaGFkb3dSb290Lmhvc3Q7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50Tm9kZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvd3lzaXd5Zy5mb3JtYXR0aW5nLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBXeXNpd3lnRm9ybWF0dGluZyA9IGNsYXNzIHsKICBzdGF0aWMgZm9ybWF0QnV0dG9ucyA9IFsKICAgIHsgY29tbWFuZDogImJvbGQiLCBpY29uOiAiQiIsIGxhYmVsOiAiQm9sZCIsIHNob3J0Y3V0OiAiXHUyMzE4QiIgfSwKICAgIHsgY29tbWFuZDogIml0YWxpYyIsIGljb246ICJJIiwgbGFiZWw6ICJJdGFsaWMiLCBzaG9ydGN1dDogIlx1MjMxOEkiIH0sCiAgICB7IGNvbW1hbmQ6ICJ1bmRlcmxpbmUiLCBpY29uOiAiVSIsIGxhYmVsOiAiVW5kZXJsaW5lIiwgc2hvcnRjdXQ6ICJcdTIzMThVIiB9LAogICAgeyBjb21tYW5kOiAic3RyaWtlVGhyb3VnaCIsIGljb246ICJTXHUwMzM2IiwgbGFiZWw6ICJTdHJpa2V0aHJvdWdoIiB9LAogICAgeyBjb21tYW5kOiAiY29kZSIsIGljb246ICJ7IH0iLCBsYWJlbDogIklubGluZSBDb2RlIiB9LAogICAgeyBjb21tYW5kOiAibGluayIsIGljb246ICJcdXsxRjUxN30iLCBsYWJlbDogIkxpbmsiLCBzaG9ydGN1dDogIlx1MjMxOEsiIH0KICBdOwogIHN0YXRpYyByZW5kZXJGb3JtYXR0aW5nTWVudShwb3NpdGlvbjMsIG9uRm9ybWF0KSB7CiAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgCiAgICAgICAgY2xhc3M9ImZvcm1hdHRpbmctbWVudSIgCiAgICAgICAgc3R5bGU9InRvcDogJHtwb3NpdGlvbjMueX1weDsgbGVmdDogJHtwb3NpdGlvbjMueH1weDsiCiAgICAgICAgQG1vdXNlZG93bj0iJHsoZTExKSA9PiB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICB9fSIKICAgICAgICBAY2xpY2s9IiR7KGUxMSkgPT4gZTExLnN0b3BQcm9wYWdhdGlvbigpfSIKICAgICAgPgogICAgICAgICR7dGhpcy5mb3JtYXRCdXR0b25zLm1hcCgoYnV0dG9uKSA9PiBiMmAKICAgICAgICAgIDxidXR0b24gCiAgICAgICAgICAgIGNsYXNzPSJmb3JtYXQtYnV0dG9uICR7YnV0dG9uLmNvbW1hbmR9IgogICAgICAgICAgICBAY2xpY2s9IiR7KCkgPT4gb25Gb3JtYXQoYnV0dG9uLmNvbW1hbmQpfSIKICAgICAgICAgICAgdGl0bGU9IiR7YnV0dG9uLmxhYmVsfSR7YnV0dG9uLnNob3J0Y3V0ID8gYCAoJHtidXR0b24uc2hvcnRjdXR9KWAgOiAiIn0iCiAgICAgICAgICA+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSIke2J1dHRvbi5jb21tYW5kID09PSAiY29kZSIgPyAiY29kZS1pY29uIiA6ICIifSI+JHtidXR0b24uaWNvbn08L3NwYW4+CiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICBgKX0KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICBzdGF0aWMgYXBwbHlGb3JtYXQoY29tbWFuZCwgdmFsdWUyLCByYW5nZTIsIHNoYWRvd1Jvb3RzKSB7CiAgICBsZXQgd29ya2luZ1JhbmdlOwogICAgaWYgKHJhbmdlMikgewogICAgICB3b3JraW5nUmFuZ2UgPSByYW5nZTI7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgd29ya2luZ1JhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7CiAgICB9CiAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKICAgICAgY2FzZSAiYm9sZCI6CiAgICAgICAgdGhpcy53cmFwU2VsZWN0aW9uKHdvcmtpbmdSYW5nZSwgInN0cm9uZyIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJpdGFsaWMiOgogICAgICAgIHRoaXMud3JhcFNlbGVjdGlvbih3b3JraW5nUmFuZ2UsICJlbSIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJ1bmRlcmxpbmUiOgogICAgICAgIHRoaXMud3JhcFNlbGVjdGlvbih3b3JraW5nUmFuZ2UsICJ1Iik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInN0cmlrZVRocm91Z2giOgogICAgICAgIHRoaXMud3JhcFNlbGVjdGlvbih3b3JraW5nUmFuZ2UsICJzIik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImNvZGUiOgogICAgICAgIHRoaXMud3JhcFNlbGVjdGlvbih3b3JraW5nUmFuZ2UsICJjb2RlIik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImxpbmsiOgogICAgICAgIGlmICghdmFsdWUyKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHRoaXMud3JhcFNlbGVjdGlvbldpdGhMaW5rKHdvcmtpbmdSYW5nZSwgdmFsdWUyKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChzaGFkb3dSb290cyAmJiBzaGFkb3dSb290cy5sZW5ndGggPiAwKSB7CiAgICAgIFd5c2l3eWdTZWxlY3Rpb24uc2V0U2VsZWN0aW9uRnJvbVJhbmdlKHdvcmtpbmdSYW5nZSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgIGlmIChzZWxlY3Rpb24pIHsKICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHdvcmtpbmdSYW5nZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBzdGF0aWMgd3JhcFNlbGVjdGlvbihyYW5nZTIsIHRhZ05hbWUpIHsKICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgIGlmICghc2VsZWN0aW9uKQogICAgICByZXR1cm47CiAgICBjb25zdCBoYXNGb3JtYXR0aW5nID0gdGhpcy5zZWxlY3Rpb25Db250YWluc1RhZyhyYW5nZTIsIHRhZ05hbWUpOwogICAgaWYgKGhhc0Zvcm1hdHRpbmcpIHsKICAgICAgdGhpcy5yZW1vdmVUYWdGcm9tU2VsZWN0aW9uKHJhbmdlMiwgdGFnTmFtZSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBjb250ZW50cyA9IHJhbmdlMi5leHRyYWN0Q29udGVudHMoKTsKICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGNvbnRlbnRzKTsKICAgICAgICByYW5nZTIuaW5zZXJ0Tm9kZSh3cmFwcGVyKTsKICAgICAgICByYW5nZTIuc2VsZWN0Tm9kZUNvbnRlbnRzKHdyYXBwZXIpOwogICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UyKTsKICAgICAgfSBjYXRjaCAoZTExKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHdyYXAgc2VsZWN0aW9uOiIsIGUxMSk7CiAgICAgIH0KICAgIH0KICB9CiAgLyoqCiAgICogQ2hlY2sgaWYgdGhlIHNlbGVjdGlvbiBjb250YWlucyBvciBpcyB3aXRoaW4gYW55IGluc3RhbmNlcyBvZiBhIHRhZwogICAqLwogIHN0YXRpYyBzZWxlY3Rpb25Db250YWluc1RhZyhyYW5nZTIsIHRhZ05hbWUpIHsKICAgIGxldCBub2RlMiA9IHJhbmdlMi5zdGFydENvbnRhaW5lcjsKICAgIHdoaWxlIChub2RlMiAmJiBub2RlMiAhPT0gcmFuZ2UyLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLm93bmVyRG9jdW1lbnQpIHsKICAgICAgaWYgKG5vZGUyLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgIGNvbnN0IGVsZW1lbnQ0ID0gbm9kZTI7CiAgICAgICAgaWYgKGVsZW1lbnQ0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnTmFtZSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIG5vZGUyID0gbm9kZTIucGFyZW50Tm9kZTsKICAgIH0KICAgIG5vZGUyID0gcmFuZ2UyLmVuZENvbnRhaW5lcjsKICAgIHdoaWxlIChub2RlMiAmJiBub2RlMiAhPT0gcmFuZ2UyLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLm93bmVyRG9jdW1lbnQpIHsKICAgICAgaWYgKG5vZGUyLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgIGNvbnN0IGVsZW1lbnQ0ID0gbm9kZTI7CiAgICAgICAgaWYgKGVsZW1lbnQ0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnTmFtZSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIG5vZGUyID0gbm9kZTIucGFyZW50Tm9kZTsKICAgIH0KICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIGNvbnN0IGNvbnRlbnRzID0gcmFuZ2UyLmNsb25lQ29udGVudHMoKTsKICAgIHRlbXBEaXYuYXBwZW5kQ2hpbGQoY29udGVudHMpOwogICAgY29uc3QgdGFncyA9IHRlbXBEaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7CiAgICByZXR1cm4gdGFncy5sZW5ndGggPiAwOwogIH0KICAvKioKICAgKiBSZW1vdmUgYWxsIGluc3RhbmNlcyBvZiBhIHRhZyBmcm9tIHRoZSBzZWxlY3Rpb24KICAgKi8KICBzdGF0aWMgcmVtb3ZlVGFnRnJvbVNlbGVjdGlvbihyYW5nZTIsIHRhZ05hbWUpIHsKICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgIGlmICghc2VsZWN0aW9uKQogICAgICByZXR1cm47CiAgICBsZXQgZXhwYW5kZWRSYW5nZSA9IHJhbmdlMi5jbG9uZVJhbmdlKCk7CiAgICBsZXQgc3RhcnROb2RlID0gcmFuZ2UyLnN0YXJ0Q29udGFpbmVyOwogICAgbGV0IHN0YXJ0VGFnID0gbnVsbDsKICAgIHdoaWxlIChzdGFydE5vZGUgJiYgc3RhcnROb2RlICE9PSByYW5nZTIuY29tbW9uQW5jZXN0b3JDb250YWluZXIub3duZXJEb2N1bWVudCkgewogICAgICBpZiAoc3RhcnROb2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBzdGFydE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YWdOYW1lKSB7CiAgICAgICAgc3RhcnRUYWcgPSBzdGFydE5vZGU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgc3RhcnROb2RlID0gc3RhcnROb2RlLnBhcmVudE5vZGU7CiAgICB9CiAgICBsZXQgZW5kTm9kZSA9IHJhbmdlMi5lbmRDb250YWluZXI7CiAgICBsZXQgZW5kVGFnID0gbnVsbDsKICAgIHdoaWxlIChlbmROb2RlICYmIGVuZE5vZGUgIT09IHJhbmdlMi5jb21tb25BbmNlc3RvckNvbnRhaW5lci5vd25lckRvY3VtZW50KSB7CiAgICAgIGlmIChlbmROb2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBlbmROb2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnTmFtZSkgewogICAgICAgIGVuZFRhZyA9IGVuZE5vZGU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZW5kTm9kZSA9IGVuZE5vZGUucGFyZW50Tm9kZTsKICAgIH0KICAgIGlmIChzdGFydFRhZykgewogICAgICBleHBhbmRlZFJhbmdlLnNldFN0YXJ0QmVmb3JlKHN0YXJ0VGFnKTsKICAgIH0KICAgIGlmIChlbmRUYWcpIHsKICAgICAgZXhwYW5kZWRSYW5nZS5zZXRFbmRBZnRlcihlbmRUYWcpOwogICAgfQogICAgY29uc3QgZnJhZ21lbnQgPSBleHBhbmRlZFJhbmdlLmV4dHJhY3RDb250ZW50cygpOwogICAgY29uc3QgcHJvY2Vzc2VkRnJhZ21lbnQgPSB0aGlzLnJlbW92ZVRhZ3NGcm9tRnJhZ21lbnQoZnJhZ21lbnQsIHRhZ05hbWUpOwogICAgZXhwYW5kZWRSYW5nZS5pbnNlcnROb2RlKHByb2Nlc3NlZEZyYWdtZW50KTsKICAgIGNvbnN0IHRleHROb2RlcyA9IFtdOwogICAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihwcm9jZXNzZWRGcmFnbWVudCwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIG51bGwpOwogICAgbGV0IG5vZGUyOwogICAgd2hpbGUgKG5vZGUyID0gd2Fsa2VyLm5leHROb2RlKCkpIHsKICAgICAgdGV4dE5vZGVzLnB1c2gobm9kZTIpOwogICAgfQogICAgaWYgKHRleHROb2Rlcy5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IG5ld1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgbmV3UmFuZ2Uuc2V0U3RhcnQodGV4dE5vZGVzWzBdLCAwKTsKICAgICAgbmV3UmFuZ2Uuc2V0RW5kKHRleHROb2Rlc1t0ZXh0Tm9kZXMubGVuZ3RoIC0gMV0sIHRleHROb2Rlc1t0ZXh0Tm9kZXMubGVuZ3RoIC0gMV0udGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwKTsKICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UobmV3UmFuZ2UpOwogICAgfQogIH0KICAvKioKICAgKiBSZW1vdmUgYWxsIGluc3RhbmNlcyBvZiBhIHRhZyBmcm9tIGEgZG9jdW1lbnQgZnJhZ21lbnQKICAgKi8KICBzdGF0aWMgcmVtb3ZlVGFnc0Zyb21GcmFnbWVudChmcmFnbWVudCwgdGFnTmFtZSkgewogICAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgdGVtcERpdi5hcHBlbmRDaGlsZChmcmFnbWVudCk7CiAgICBjb25zdCB0YWdzID0gdGVtcERpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsKICAgIGNvbnN0IHRhZ0FycmF5ID0gQXJyYXkuZnJvbSh0YWdzKTsKICAgIHRhZ0FycmF5LmZvckVhY2goKHRhZykgPT4gewogICAgICBjb25zdCBwYXJlbnQgPSB0YWcucGFyZW50Tm9kZTsKICAgICAgaWYgKHBhcmVudCkgewogICAgICAgIHdoaWxlICh0YWcuZmlyc3RDaGlsZCkgewogICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0YWcuZmlyc3RDaGlsZCwgdGFnKTsKICAgICAgICB9CiAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKHRhZyk7CiAgICAgIH0KICAgIH0pOwogICAgY29uc3QgbmV3RnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CiAgICB3aGlsZSAodGVtcERpdi5maXJzdENoaWxkKSB7CiAgICAgIG5ld0ZyYWdtZW50LmFwcGVuZENoaWxkKHRlbXBEaXYuZmlyc3RDaGlsZCk7CiAgICB9CiAgICByZXR1cm4gbmV3RnJhZ21lbnQ7CiAgfQogIHN0YXRpYyB3cmFwU2VsZWN0aW9uV2l0aExpbmsocmFuZ2UyLCB1cmwpIHsKICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgIGlmICghc2VsZWN0aW9uKQogICAgICByZXR1cm47CiAgICBpZiAodGhpcy5zZWxlY3Rpb25Db250YWluc1RhZyhyYW5nZTIsICJhIikpIHsKICAgICAgdGhpcy5yZW1vdmVUYWdGcm9tU2VsZWN0aW9uKHJhbmdlMiwgImEiKTsKICAgICAgaWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkgewogICAgICAgIHJhbmdlMiA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgICB9CiAgICB9CiAgICBjb25zdCBsaW5rMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKICAgIGxpbmszLmhyZWYgPSB1cmw7CiAgICBsaW5rMy50YXJnZXQgPSAiX2JsYW5rIjsKICAgIGxpbmszLnJlbCA9ICJub29wZW5lciBub3JlZmVycmVyIjsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGNvbnRlbnRzID0gcmFuZ2UyLmV4dHJhY3RDb250ZW50cygpOwogICAgICBsaW5rMy5hcHBlbmRDaGlsZChjb250ZW50cyk7CiAgICAgIHJhbmdlMi5pbnNlcnROb2RlKGxpbmszKTsKICAgICAgcmFuZ2UyLnNlbGVjdE5vZGVDb250ZW50cyhsaW5rMyk7CiAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlMik7CiAgICB9IGNhdGNoIChlMTEpIHsKICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBsaW5rOiIsIGUxMSk7CiAgICB9CiAgfQogIHN0YXRpYyBnZXRTZWxlY3Rpb25Db29yZGluYXRlcyguLi5zaGFkb3dSb290cykgewogICAgY29uc3Qgc2VsZWN0aW9uSW5mbyA9IFd5c2l3eWdTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uSW5mbyguLi5zaGFkb3dSb290cyk7CiAgICBjb25zb2xlLmxvZygiZ2V0U2VsZWN0aW9uQ29vcmRpbmF0ZXMgLSBzZWxlY3Rpb25JbmZvOiIsIHNlbGVjdGlvbkluZm8pOwogICAgaWYgKCFzZWxlY3Rpb25JbmZvKSB7CiAgICAgIGNvbnNvbGUubG9nKCJObyBzZWxlY3Rpb24gaW5mbyBhdmFpbGFibGUiKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCByYW5nZTIgPSBXeXNpd3lnU2VsZWN0aW9uLmNyZWF0ZVJhbmdlRnJvbUluZm8oc2VsZWN0aW9uSW5mbyk7CiAgICBjb25zdCByZWN0ID0gcmFuZ2UyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgY29uc29sZS5sb2coIlJhbmdlIHJlY3Q6IiwgcmVjdCk7CiAgICBpZiAocmVjdC53aWR0aCA9PT0gMCAmJiByZWN0LmhlaWdodCA9PT0gMCkgewogICAgICBjb25zb2xlLmxvZygiUmVjdCB3aWR0aCBhbmQgaGVpZ2h0IGFyZSAwLCB0cnlpbmcgZGlmZmVyZW50IGFwcHJvYWNoIik7CiAgICAgIGlmICgiY2FyZXRQb3NpdGlvbkZyb21Qb2ludCIgaW4gZG9jdW1lbnQpIHsKICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHsKICAgICAgICAgIGNvbnN0IHJhbmdlMyA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgICAgICAgY29uc3QgdGVtcFNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgICAgICB0ZW1wU3Bhbi50ZXh0Q29udGVudCA9ICJcdTIwMEIiOwogICAgICAgICAgcmFuZ2UzLmluc2VydE5vZGUodGVtcFNwYW4pOwogICAgICAgICAgY29uc3Qgc3BhblJlY3QgPSB0ZW1wU3Bhbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgIHRlbXBTcGFuLnJlbW92ZSgpOwogICAgICAgICAgaWYgKHNwYW5SZWN0LndpZHRoID4gMCB8fCBzcGFuUmVjdC5oZWlnaHQgPiAwKSB7CiAgICAgICAgICAgIGNvbnN0IGNvb3JkczIgPSB7CiAgICAgICAgICAgICAgeDogc3BhblJlY3QubGVmdCwKICAgICAgICAgICAgICB5OiBNYXRoLm1heCg0NSwgc3BhblJlY3QudG9wIC0gNDUpCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJVc2VkIHNwYW4gdHJpY2sgZm9yIGNvb3JkczoiLCBjb29yZHMyKTsKICAgICAgICAgICAgcmV0dXJuIGNvb3JkczI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgY29vcmRzID0gewogICAgICB4OiByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gMiwKICAgICAgeTogTWF0aC5tYXgoNDUsIHJlY3QudG9wIC0gNDUpCiAgICAgIC8vIFBvc2l0aW9uIGFib3ZlIHNlbGVjdGlvbiwgYnV0IGVuc3VyZSBpdCdzIG5vdCBuZWdhdGl2ZQogICAgfTsKICAgIGNvbnNvbGUubG9nKCJSZXR1cm5pbmcgY29vcmRzOiIsIGNvb3Jkcyk7CiAgICByZXR1cm4gY29vcmRzOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvZGVlcy1mb3JtYXR0aW5nLW1lbnUuanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlNjAgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczYxID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzRm9ybWF0dGluZ01lbnUgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLWZvcm1hdHRpbmctbWVudSIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3Zpc2libGVfZGVjb3JhdG9yczsKICBsZXQgX3Zpc2libGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92aXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wb3NpdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfcG9zaXRpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWVudVpJbmRleF9kZWNvcmF0b3JzOwogIGxldCBfbWVudVpJbmRleF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21lbnVaSW5kZXhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0Zvcm1hdHRpbmdNZW51MiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3Zpc2libGVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3Bvc2l0aW9uX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9tZW51WkluZGV4X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTYwKHRoaXMsIG51bGwsIF92aXNpYmxlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZpc2libGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInZpc2libGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmlzaWJsZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudmlzaWJsZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF92aXNpYmxlX2luaXRpYWxpemVycywgX3Zpc2libGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2MCh0aGlzLCBudWxsLCBfcG9zaXRpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicG9zaXRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInBvc2l0aW9uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnBvc2l0aW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5wb3NpdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wb3NpdGlvbl9pbml0aWFsaXplcnMsIF9wb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTYwKHRoaXMsIG51bGwsIF9tZW51WkluZGV4X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1lbnVaSW5kZXgiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1lbnVaSW5kZXgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWVudVpJbmRleCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWVudVpJbmRleCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tZW51WkluZGV4X2luaXRpYWxpemVycywgX21lbnVaSW5kZXhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2MChudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNGb3JtYXR0aW5nTWVudTIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGluc3RhbmNlOwogICAgc3RhdGljIGdldEluc3RhbmNlKCkgewogICAgICBpZiAoIURlZXNGb3JtYXR0aW5nTWVudTIuaW5zdGFuY2UpIHsKICAgICAgICBEZWVzRm9ybWF0dGluZ01lbnUyLmluc3RhbmNlID0gbmV3IERlZXNGb3JtYXR0aW5nTWVudTIoKTsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKERlZXNGb3JtYXR0aW5nTWVudTIuaW5zdGFuY2UpOwogICAgICB9CiAgICAgIHJldHVybiBEZWVzRm9ybWF0dGluZ01lbnUyLmluc3RhbmNlOwogICAgfQogICAgI3Zpc2libGVfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNjEodGhpcywgX3Zpc2libGVfaW5pdGlhbGl6ZXJzLCBmYWxzZSk7CiAgICBnZXQgdmlzaWJsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Zpc2libGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB2aXNpYmxlKHZhbHVlMikgewogICAgICB0aGlzLiN2aXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczYxKHRoaXMsIF92aXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2MSh0aGlzLCBfcG9zaXRpb25faW5pdGlhbGl6ZXJzLCB7IHg6IDAsIHk6IDAgfSkpOwogICAgZ2V0IHBvc2l0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy4jcG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwb3NpdGlvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jcG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtZW51WkluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2MSh0aGlzLCBfcG9zaXRpb25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczYxKHRoaXMsIF9tZW51WkluZGV4X2luaXRpYWxpemVycywgMWUzKSk7CiAgICBnZXQgbWVudVpJbmRleCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21lbnVaSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtZW51WkluZGV4KHZhbHVlMikgewogICAgICB0aGlzLiNtZW51WkluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBjYWxsYmFjayA9IChfX3J1bkluaXRpYWxpemVyczYxKHRoaXMsIF9tZW51WkluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzKSwgbnVsbCk7CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogMDsKICAgICAgICBoZWlnaHQ6IDA7CiAgICAgIH0KCiAgICAgIC5mb3JtYXR0aW5nLW1lbnUgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMjYyNjI2Iil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTBlMGUwIiwgIiM0MDQwNDAiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDE2cHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDJweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBhbmltYXRpb246IGZhZGVJblNjYWxlIDAuMTVzIGVhc2Utb3V0OwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZhZGVJblNjYWxlIHsKICAgICAgICBmcm9tIHsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTUpIHRyYW5zbGF0ZVkoNXB4KTsKICAgICAgICB9CiAgICAgICAgdG8gewogICAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSkgdHJhbnNsYXRlWSgwKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5mb3JtYXQtYnV0dG9uIHsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMDAwMCIsICIjZTBlMGUwIil9OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLmZvcm1hdC1idXR0b246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjBmMGYwIiwgIiMzMzMzMzMiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDA2NmNjIiwgIiM0ZDk0ZmYiKX07CiAgICAgIH0KCiAgICAgIC5mb3JtYXQtYnV0dG9uOmFjdGl2ZSB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk1KTsKICAgICAgfQoKICAgICAgLmZvcm1hdC1idXR0b24uYm9sZCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgfQoKICAgICAgLmZvcm1hdC1idXR0b24uaXRhbGljIHsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KCiAgICAgIC5mb3JtYXQtYnV0dG9uLnVuZGVybGluZSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KCiAgICAgIC5mb3JtYXQtYnV0dG9uIC5jb2RlLWljb24gewogICAgICAgIGZvbnQtZmFtaWx5OiAnU0YgTW9ubycsICdNb25hY28nLCAnSW5jb25zb2xhdGEnLCAnRmlyYSBDb2RlJywgbW9ub3NwYWNlOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgaWYgKCF0aGlzLnZpc2libGUpCiAgICAgICAgcmV0dXJuIGIyYGA7CiAgICAgIHRoaXMuc3R5bGUuekluZGV4ID0gdGhpcy5tZW51WkluZGV4LnRvU3RyaW5nKCk7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiAKICAgICAgICBjbGFzcz0iZm9ybWF0dGluZy1tZW51IiAKICAgICAgICBzdHlsZT0ibGVmdDogJHt0aGlzLnBvc2l0aW9uLnh9cHg7IHRvcDogJHt0aGlzLnBvc2l0aW9uLnl9cHg7IgogICAgICAgIHRhYmluZGV4PSItMSIKICAgICAgICBkYXRhLW1lbnUtdHlwZT0iZm9ybWF0dGluZyIKICAgICAgPgogICAgICAgICR7V3lzaXd5Z0Zvcm1hdHRpbmcuZm9ybWF0QnV0dG9ucy5tYXAoKGJ1dHRvbikgPT4gYjJgCiAgICAgICAgICA8YnV0dG9uIAogICAgICAgICAgICBjbGFzcz0iZm9ybWF0LWJ1dHRvbiAke2J1dHRvbi5jb21tYW5kfSIKICAgICAgICAgICAgZGF0YS1jb21tYW5kPSIke2J1dHRvbi5jb21tYW5kfSIKICAgICAgICAgICAgdGl0bGU9IiR7YnV0dG9uLmxhYmVsfSR7YnV0dG9uLnNob3J0Y3V0ID8gYCAoJHtidXR0b24uc2hvcnRjdXR9KWAgOiAiIn0iCiAgICAgICAgICA+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSIke2J1dHRvbi5jb21tYW5kID09PSAiY29kZSIgPyAiY29kZS1pY29uIiA6ICIifSI+JHtidXR0b24uaWNvbn08L3NwYW4+CiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICBgKX0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXBwbHlGb3JtYXQoY29tbWFuZCkgewogICAgICBpZiAodGhpcy5jYWxsYmFjaykgewogICAgICAgIHRoaXMuY2FsbGJhY2soY29tbWFuZCk7CiAgICAgIH0KICAgICAgaWYgKGNvbW1hbmQgPT09ICJsaW5rIikgewogICAgICAgIHRoaXMuaGlkZSgpOwogICAgICB9CiAgICB9CiAgICBzaG93KHBvc2l0aW9uMywgY2FsbGJhY2spIHsKICAgICAgY29uc29sZS5sb2coIkZvcm1hdHRpbmdNZW51LnNob3cgY2FsbGVkOiIsIHsgcG9zaXRpb246IHBvc2l0aW9uMywgdmlzaWJsZTogdGhpcy52aXNpYmxlIH0pOwogICAgICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb24zOwogICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgIHRoaXMubWVudVpJbmRleCA9IHpJbmRleFJlZ2lzdHJ5LmdldE5leHRaSW5kZXgoKTsKICAgICAgekluZGV4UmVnaXN0cnkucmVnaXN0ZXIodGhpcywgdGhpcy5tZW51WkluZGV4KTsKICAgICAgdGhpcy5zdHlsZS56SW5kZXggPSB0aGlzLm1lbnVaSW5kZXgudG9TdHJpbmcoKTsKICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTsKICAgIH0KICAgIGhpZGUoKSB7CiAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlOwogICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbDsKICAgICAgekluZGV4UmVnaXN0cnkudW5yZWdpc3Rlcih0aGlzKTsKICAgIH0KICAgIHVwZGF0ZVBvc2l0aW9uKHBvc2l0aW9uMykgewogICAgICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb24zOwogICAgfQogICAgZmlyc3RVcGRhdGVkKCkgewogICAgICB0aGlzLnNoYWRvd1Jvb3Q/LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsIChlMTEpID0+IHsKICAgICAgICBjb25zdCBtZW51ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuZm9ybWF0dGluZy1tZW51Iik7CiAgICAgICAgaWYgKG1lbnUgJiYgbWVudS5jb250YWlucyhlMTEudGFyZ2V0KSkgewogICAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdGhpcy5zaGFkb3dSb290Py5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIChlMTEpID0+IHsKICAgICAgICBjb25zdCB0YXJnZXQgPSBlMTEudGFyZ2V0OwogICAgICAgIGNvbnN0IGJ1dHRvbiA9IHRhcmdldC5jbG9zZXN0KCIuZm9ybWF0LWJ1dHRvbiIpOwogICAgICAgIGlmIChidXR0b24pIHsKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgY29uc3QgY29tbWFuZCA9IGJ1dHRvbi5nZXRBdHRyaWJ1dGUoImRhdGEtY29tbWFuZCIpOwogICAgICAgICAgaWYgKGNvbW1hbmQpIHsKICAgICAgICAgICAgdGhpcy5hcHBseUZvcm1hdChjb21tYW5kKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLnNoYWRvd1Jvb3Q/LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwgKGUxMSkgPT4gewogICAgICAgIGNvbnN0IG1lbnUgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5mb3JtYXR0aW5nLW1lbnUiKTsKICAgICAgICBpZiAobWVudSAmJiBtZW51LmNvbnRhaW5zKGUxMS50YXJnZXQpKSB7CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICB9CiAgICAgIH0sIHRydWUpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM2MShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0Zvcm1hdHRpbmdNZW51MiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL3d5c2l3eWcuaW50ZXJmYWNlcy5qcwppbml0X2Rpc3RfdHMyNigpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy93eXNpd3lnLmNvbnN0YW50cy5qcwp2YXIgUFJPR1JBTU1JTkdfTEFOR1VBR0VTID0gWwogICJKYXZhU2NyaXB0IiwKICAiVHlwZVNjcmlwdCIsCiAgIlB5dGhvbiIsCiAgIkphdmEiLAogICJDKysiLAogICJDIyIsCiAgIkdvIiwKICAiUnVzdCIsCiAgIkhUTUwiLAogICJDU1MiLAogICJTUUwiLAogICJTaGVsbCIsCiAgIkpTT04iLAogICJZQU1MIiwKICAiTWFya2Rvd24iLAogICJQbGFpbiBUZXh0IgpdOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy93eXNpd3lnLnN0eWxlcy5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgd3lzaXd5Z1N0eWxlcyA9IGlgCiAgOmhvc3QgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgfQoKICAud3lzaXd5Zy1jb250YWluZXIgewogICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzA5MDkwYiIpfTsKICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAyMDBweDsKICAgIHBhZGRpbmc6IDI0cHg7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgfQoKICAud3lzaXd5Zy1jb250YWluZXI6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2QxZDVkYiIsICIjM2YzZjQ2Iil9OwogIH0KCiAgLnd5c2l3eWctY29udGFpbmVyOmZvY3VzLXdpdGhpbiB7CiAgICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBvdXRsaW5lLW9mZnNldDogMnB4OwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjRmNGY1IiwgIiMxODE4MWIiKX0sIDAgMCAwIDRweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSg1OSwgMTMwLCAyNDYsIDAuNSkiLCAicmdiYSg1OSwgMTMwLCAyNDYsIDAuNSkiKX07CiAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiMzYjgyZjYiKX07CiAgfQoKICAvKiBWaXN1YWwgaGludCBmb3IgdGV4dCBzZWxlY3Rpb24gKi8KICAuZWRpdG9yLWNvbnRlbnQ6aG92ZXIgewogICAgY3Vyc29yOiB0ZXh0OwogIH0KCiAgLmVkaXRvci1jb250ZW50IHsKICAgIG91dGxpbmU6IG5vbmU7CiAgICBtaW4taGVpZ2h0OiAxNjBweDsKICAgIG1hcmdpbjogMCAtOHB4OwogICAgcGFkZGluZzogMCA4cHg7CiAgfQoKICAuYmxvY2sgewogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogNHB4IDA7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgIG1pbi1oZWlnaHQ6IDEuNmVtOwogICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgfQoKICAvKiBGaXJzdCBhbmQgbGFzdCBibG9ja3MgZG9uJ3QgbmVlZCBleHRyYSBzcGFjaW5nICovCiAgLmJsb2NrLXdyYXBwZXI6Zmlyc3QtY2hpbGQgLmJsb2NrIHsKICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICB9CgogIC5ibG9jay13cmFwcGVyOmxhc3QtY2hpbGQgLmJsb2NrIHsKICAgIG1hcmdpbi1ib3R0b206IDA7CiAgfQoKICAuYmxvY2suc2VsZWN0ZWQgewogICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoNTksIDEzMCwgMjQ2LCAwLjA1KSIsICJyZ2JhKDU5LCAxMzAsIDI0NiwgMC4wNSkiKX07CiAgICBvdXRsaW5lOiAycHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoNTksIDEzMCwgMjQ2LCAwLjIpIiwgInJnYmEoNTksIDEzMCwgMjQ2LCAwLjIpIil9OwogICAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBtYXJnaW4tbGVmdDogLThweDsKICAgIG1hcmdpbi1yaWdodDogLThweDsKICAgIHBhZGRpbmctbGVmdDogOHB4OwogICAgcGFkZGluZy1yaWdodDogOHB4OwogIH0KCiAgLmJsb2NrW2NvbnRlbnRlZGl0YWJsZV0gewogICAgb3V0bGluZTogbm9uZTsKICB9CgogIC5ibG9jay5wYXJhZ3JhcGggewogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDEuNjsKICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgfQoKICAuYmxvY2sucGFyYWdyYXBoOmVtcHR5OjpiZWZvcmUgewogICAgY29udGVudDogIlR5cGUgJy8nIGZvciBjb21tYW5kcy4uLiI7CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiIzcxNzE3YSIpfTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDEuNjsKICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgfQoKICAuYmxvY2suaGVhZGluZy0xIHsKICAgIGZvbnQtc2l6ZTogMzJweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMS4yOwogICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgfQoKICAuYmxvY2suaGVhZGluZy0xOmVtcHR5OjpiZWZvcmUgewogICAgY29udGVudDogIkhlYWRpbmcgMSI7CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiIzcxNzE3YSIpfTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgZm9udC1zaXplOiAzMnB4OwogICAgbGluZS1oZWlnaHQ6IDEuMjsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgfQoKICAuYmxvY2suaGVhZGluZy0yIHsKICAgIGZvbnQtc2l6ZTogMjRweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsaW5lLWhlaWdodDogMS4zOwogICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgfQoKICAuYmxvY2suaGVhZGluZy0yOmVtcHR5OjpiZWZvcmUgewogICAgY29udGVudDogIkhlYWRpbmcgMiI7CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiIzcxNzE3YSIpfTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgZm9udC1zaXplOiAyNHB4OwogICAgbGluZS1oZWlnaHQ6IDEuMzsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgfQoKICAuYmxvY2suaGVhZGluZy0zIHsKICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsaW5lLWhlaWdodDogMS40OwogICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgfQoKICAuYmxvY2suaGVhZGluZy0zOmVtcHR5OjpiZWZvcmUgewogICAgY29udGVudDogIkhlYWRpbmcgMyI7CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiIzcxNzE3YSIpfTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgfQoKICAuYmxvY2sucXVvdGUgewogICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgcGFkZGluZy1sZWZ0OiAyMHB4OwogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiNhMWExYWEiKX07CiAgICBtYXJnaW4tbGVmdDogMDsKICAgIG1hcmdpbi1yaWdodDogMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjY7CiAgfQoKICAuYmxvY2sucXVvdGU6ZW1wdHk6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiUXVvdGUiOwogICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM3MTcxN2EiKX07CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjY7CiAgICBmb250LXdlaWdodDogNDAwOwogICAgZm9udC1zdHlsZTogaXRhbGljOwogIH0KCiAgLmNvZGUtYmxvY2stY29udGFpbmVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG1hcmdpbjogMjBweCAwOwogIH0KCiAgLmNvZGUtbGFuZ3VhZ2UgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgcmlnaHQ6IDA7CiAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjMjcyNzJhIil9OwogICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiNhMWExYWEiKX07CiAgICBwYWRkaW5nOiA0cHggMTJweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDAgNHB4IDAgNHB4OwogICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLCBzYW5zLXNlcmlmOwogICAgdGV4dC10cmFuc2Zvcm06IGxvd2VyY2FzZTsKICAgIHotaW5kZXg6IDE7CiAgfQoKICAuYmxvY2suY29kZSB7CiAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjMTgxODFiIil9OwogICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDE2cHg7CiAgICBwYWRkaW5nLXRvcDogMzJweDsgLyogTWFrZSByb29tIGZvciBsYW5ndWFnZSBpbmRpY2F0b3IgKi8KICAgIGZvbnQtZmFtaWx5OiAnU0YgTW9ubycsICdNb25hY28nLCAnSW5jb25zb2xhdGEnLCAnRmlyYSBDb2RlJywgbW9ub3NwYWNlOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgb3ZlcmZsb3cteDogYXV0bzsKICB9CgogIC5ibG9jay5jb2RlOmVtcHR5OjpiZWZvcmUgewogICAgY29udGVudDogIi8vIENvZGUgYmxvY2siOwogICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM3MTcxN2EiKX07CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGZvbnQtZmFtaWx5OiAnU0YgTW9ubycsICdNb25hY28nLCAnSW5jb25zb2xhdGEnLCAnRmlyYSBDb2RlJywgbW9ub3NwYWNlOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNjsKICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgfQoKICAuYmxvY2subGlzdCB7CiAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgfQoKICAuYmxvY2subGlzdCB1bCwKICAuYmxvY2subGlzdCBvbCB7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwIDAgMCAyNHB4OwogICAgbGlzdC1zdHlsZS1wb3NpdGlvbjogb3V0c2lkZTsKICB9CgogIC5ibG9jay5saXN0IHVsIHsKICAgIGxpc3Qtc3R5bGU6IGRpc2M7CiAgfQoKICAuYmxvY2subGlzdCBvbCB7CiAgICBsaXN0LXN0eWxlOiBkZWNpbWFsOwogIH0KCiAgLmJsb2NrLmxpc3QgbGkgewogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNjsKICB9CgogIC5ibG9jay5saXN0IGxpOmxhc3QtY2hpbGQgewogICAgbWFyZ2luLWJvdHRvbTogMDsKICB9CgogIC5ibG9jay5kaXZpZGVyIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmc6IDIwcHggMDsKICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogIH0KCiAgLmJsb2NrLmRpdmlkZXIgaHIgewogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICBtYXJnaW46IDA7CiAgfQoKICAuc2xhc2gtbWVudSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMDkwOTBiIil9OwogICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSksIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDYpOwogICAgcGFkZGluZzogNHB4OwogICAgei1pbmRleDogMTAwMDsKICAgIG1pbi13aWR0aDogMjIwcHg7CiAgICBtYXgtaGVpZ2h0OiAzMDBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIHVzZXItc2VsZWN0OiBub25lOwogIH0KCiAgLnNsYXNoLW1lbnUtaXRlbSB7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICB9CgogIC5zbGFzaC1tZW51LWl0ZW06aG92ZXIsCiAgLnNsYXNoLW1lbnUtaXRlbS5zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjMjcyNzJhIil9OwogICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgfQoKICAuc2xhc2gtbWVudS1pdGVtIC5pY29uIHsKICAgIHdpZHRoOiAyNHB4OwogICAgaGVpZ2h0OiAyNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICB9CgogIC5zbGFzaC1tZW51LWl0ZW06aG92ZXIgLmljb24sCiAgLnNsYXNoLW1lbnUtaXRlbS5zZWxlY3RlZCAuaWNvbiB7CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICB9CgogIC50b29sYmFyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTQwcHg7CiAgICBsZWZ0OiAwOwogICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzA5MDkwYiIpfTsKICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjA2KTsKICAgIHBhZGRpbmc6IDRweDsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBnYXA6IDRweDsKICAgIHotaW5kZXg6IDEwMDA7CiAgfQoKICAudG9vbGJhci52aXNpYmxlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgfQoKICAudG9vbGJhci1idXR0b24gewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDMycHg7CiAgICBib3JkZXI6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogIH0KCiAgLnRvb2xiYXItYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjRmNGY1IiwgIiMyNzI3MmEiKX07CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICB9CgogIC8qIERyYWcgYW5kIERyb3AgU3R5bGVzICovCiAgLmJsb2NrLXdyYXBwZXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuM3MgZWFzZSwgb3BhY2l0eSAwLjJzIGVhc2U7CiAgfQoKICAvKiBFbnN1cmUgcHJvcGVyIHNwYWNpbmcgY29udGV4dCBmb3IgYmxvY2tzICovCiAgLmJsb2NrLXdyYXBwZXIgKyAuYmxvY2std3JhcHBlciAuYmxvY2sgewogICAgbWFyZ2luLXRvcDogMTZweDsKICB9CgogIC8qIE92ZXJyaWRlIGZvciBoZWFkaW5ncyBmb2xsb3dpbmcgb3RoZXIgYmxvY2tzICovCiAgLmJsb2NrLXdyYXBwZXIgKyAuYmxvY2std3JhcHBlciAuYmxvY2suaGVhZGluZy0xLAogIC5ibG9jay13cmFwcGVyICsgLmJsb2NrLXdyYXBwZXIgLmJsb2NrLmhlYWRpbmctMiwKICAuYmxvY2std3JhcHBlciArIC5ibG9jay13cmFwcGVyIC5ibG9jay5oZWFkaW5nLTMgewogICAgbWFyZ2luLXRvcDogMjRweDsKICB9CgogIC8qIENvZGUgYW5kIHF1b3RlIGJsb2NrcyBuZWVkIGNvbnNpc3RlbnQgc3BhY2luZyAqLwogIC5ibG9jay13cmFwcGVyICsgLmJsb2NrLXdyYXBwZXIgLmJsb2NrLmNvZGUsCiAgLmJsb2NrLXdyYXBwZXIgKyAuYmxvY2std3JhcHBlciAuYmxvY2sucXVvdGUgewogICAgbWFyZ2luLXRvcDogMjBweDsKICB9CgogIC5kcmFnLWhhbmRsZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAtMjhweDsKICAgIHRvcDogNTAlOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOwogICAgd2lkdGg6IDI0cHg7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBjdXJzb3I6IGdyYWI7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2U7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM3MTcxN2EiKX07CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgfQoKICAuZHJhZy1oYW5kbGU6OmJlZm9yZSB7CiAgICBjb250ZW50OiAi4ouu4ouuIjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxldHRlci1zcGFjaW5nOiAtMnB4OwogIH0KCiAgLmJsb2NrLXdyYXBwZXI6aG92ZXIgLmRyYWctaGFuZGxlIHsKICAgIG9wYWNpdHk6IDE7CiAgfQoKICAuZHJhZy1oYW5kbGU6aG92ZXIgewogICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiNhMWExYWEiKX07CiAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjMjcyNzJhIil9OwogIH0KCiAgLmRyYWctaGFuZGxlOmFjdGl2ZSB7CiAgICBjdXJzb3I6IGdyYWJiaW5nOwogICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzNmM2Y0NiIpfTsKICB9CgogIC5ibG9jay13cmFwcGVyLmRyYWdnaW5nIHsKICAgIG9wYWNpdHk6IDAuODsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgei1pbmRleDogMjAwMTsKICAgIHRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDsKICB9CgoKICAvKiBCbG9ja3MgdGhhdCBzaG91bGQgbW92ZSBvdXQgb2YgdGhlIHdheSAqLwogIC5ibG9jay13cmFwcGVyLm1vdmUtZG93biB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkodmFyKC0tZHJhZy1vZmZzZXQsIDBweCkpOwogIH0KCiAgLmJsb2NrLXdyYXBwZXIubW92ZS11cCB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoY2FsYygtMSAqIHZhcigtLWRyYWctb2Zmc2V0LCAwcHgpKSk7CiAgfQoKICAvKiBEcm9wIGluZGljYXRvciAqLwogIC5kcm9wLWluZGljYXRvciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSg1OSwgMTMwLCAyNDYsIDAuMDUpIiwgInJnYmEoNTksIDEzMCwgMjQ2LCAwLjA1KSIpfTsKICAgIGJvcmRlcjogMnB4IGRhc2hlZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjM2I4MmY2Iil9OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgdHJhbnNpdGlvbjogdG9wIDAuMnMgZWFzZSwgaGVpZ2h0IDAuMnMgZWFzZTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMTk5OTsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgfQoKICAvKiBSZW1vdmUgb2xkIGRyYWctb3ZlciBzdHlsZXMgKi8KICAuYmxvY2std3JhcHBlci5kcmFnLW92ZXItYmVmb3JlLAogIC5ibG9jay13cmFwcGVyLmRyYWctb3Zlci1hZnRlciB7CiAgICAvKiBObyBsb25nZXIgbmVlZGVkLCB1c2luZyBkcm9wIGluZGljYXRvciBpbnN0ZWFkICovCiAgfQoKICAuZWRpdG9yLWNvbnRlbnQuZHJhZ2dpbmcgKiB7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICB9CgogIC8qIEJsb2NrIFNldHRpbmdzIEJ1dHRvbiAtIFJlbW92ZWQgaW4gZmF2b3Igb2YgY29udGV4dCBtZW51ICovCgogIC8qIFRleHQgU2VsZWN0aW9uIFN0eWxlcyAqLwogIC5ibG9jayA6OnNlbGVjdGlvbiB7CiAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSg1OSwgMTMwLCAyNDYsIDAuMikiLCAicmdiYSg1OSwgMTMwLCAyNDYsIDAuMikiKX07CiAgICBjb2xvcjogaW5oZXJpdDsKICB9CgogIC8qIEZvcm1hdHRpbmcgTWVudSAqLwogIC5mb3JtYXR0aW5nLW1lbnUgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzA5MDkwYiIpfTsKICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjA2KTsKICAgIHBhZGRpbmc6IDRweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDJweDsKICAgIHotaW5kZXg6IDEwMDE7CiAgICBhbmltYXRpb246IGZhZGVJblNjYWxlIDAuMTVzIGVhc2Utb3V0OwogIH0KCiAgQGtleWZyYW1lcyBmYWRlSW5TY2FsZSB7CiAgICBmcm9tIHsKICAgICAgb3BhY2l0eTogMDsKICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk4KSB0cmFuc2xhdGVZKDJweCk7CiAgICB9CiAgICB0byB7CiAgICAgIG9wYWNpdHk6IDE7CiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSkgdHJhbnNsYXRlWSgwKTsKICAgIH0KICB9CgogIC5mb3JtYXQtYnV0dG9uIHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAzMnB4OwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgfQoKICAuZm9ybWF0LWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjMjcyNzJhIil9OwogICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiMzYjgyZjYiKX07CiAgfQoKICAuZm9ybWF0LWJ1dHRvbjphY3RpdmUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk1KTsKICB9CgogIC5mb3JtYXQtYnV0dG9uLmJvbGQgewogICAgZm9udC13ZWlnaHQ6IDcwMDsKICB9CgogIC5mb3JtYXQtYnV0dG9uLml0YWxpYyB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgfQoKICAuZm9ybWF0LWJ1dHRvbi51bmRlcmxpbmUgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgfQoKICAuZm9ybWF0LWJ1dHRvbiAuY29kZS1pY29uIHsKICAgIGZvbnQtZmFtaWx5OiAnU0YgTW9ubycsICdNb25hY28nLCAnSW5jb25zb2xhdGEnLCAnRmlyYSBDb2RlJywgbW9ub3NwYWNlOwogICAgZm9udC1zaXplOiAxMnB4OwogIH0KCiAgLyogQXBwbGllZCBmb3JtYXQgc3R5bGVzIGluIGNvbnRlbnQgKi8KICAuYmxvY2sgc3Ryb25nLAogIC5ibG9jayBiIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICB9CgogIC5ibG9jayBlbSwKICAuYmxvY2sgaSB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgfQoKICAuYmxvY2sgdSB7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICB9CgogIC5ibG9jayBzdHJpa2UsCiAgLmJsb2NrIHMgewogICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7CiAgICBvcGFjaXR5OiAwLjc7CiAgfQoKICAuYmxvY2sgY29kZSB7CiAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjMjcyNzJhIil9OwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIGZvbnQtZmFtaWx5OiAnU0YgTW9ubycsICdNb25hY28nLCAnSW5jb25zb2xhdGEnLCAnRmlyYSBDb2RlJywgbW9ub3NwYWNlOwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogIH0KCiAgLmJsb2NrIGEgewogICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiMzYjgyZjYiKX07CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4xNXMgZWFzZTsKICB9CgogIC5ibG9jayBhOmhvdmVyIHsKICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiMzYjgyZjYiKX07CiAgfQpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy93eXNpd3lnLmNvbnZlcnRlcnMuanMKdmFyIFd5c2l3eWdDb252ZXJ0ZXJzID0gY2xhc3MgewogIHN0YXRpYyBlc2NhcGVIdG1sKHRleHQ5KSB7CiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIGRpdi50ZXh0Q29udGVudCA9IHRleHQ5OwogICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7CiAgfQogIHN0YXRpYyBmb3JtYXRGaWxlU2l6ZShieXRlcykgewogICAgaWYgKGJ5dGVzID09PSAwKQogICAgICByZXR1cm4gIjAgQnl0ZXMiOwogICAgY29uc3QgazQgPSAxMDI0OwogICAgY29uc3Qgc2l6ZXMgPSBbIkJ5dGVzIiwgIktCIiwgIk1CIiwgIkdCIl07CiAgICBjb25zdCBpMTEgPSBNYXRoLmZsb29yKE1hdGgubG9nKGJ5dGVzKSAvIE1hdGgubG9nKGs0KSk7CiAgICByZXR1cm4gcGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrNCwgaTExKSkudG9GaXhlZCgyKSkgKyAiICIgKyBzaXplc1tpMTFdOwogIH0KICBzdGF0aWMgZ2V0SHRtbE91dHB1dChibG9ja3MpIHsKICAgIHJldHVybiBibG9ja3MubWFwKChibG9jaykgPT4gewogICAgICBjb25zdCBjb250ZW50MyA9IGJsb2NrLmNvbnRlbnQuaW5jbHVkZXMoIjwiKSAmJiBibG9jay5jb250ZW50LmluY2x1ZGVzKCI+IikgPyBibG9jay5jb250ZW50IDogdGhpcy5lc2NhcGVIdG1sKGJsb2NrLmNvbnRlbnQpOwogICAgICBzd2l0Y2ggKGJsb2NrLnR5cGUpIHsKICAgICAgICBjYXNlICJwYXJhZ3JhcGgiOgogICAgICAgICAgcmV0dXJuIGJsb2NrLmNvbnRlbnQgPyBgPHA+JHtjb250ZW50M308L3A+YCA6ICIiOwogICAgICAgIGNhc2UgImhlYWRpbmctMSI6CiAgICAgICAgICByZXR1cm4gYDxoMT4ke2NvbnRlbnQzfTwvaDE+YDsKICAgICAgICBjYXNlICJoZWFkaW5nLTIiOgogICAgICAgICAgcmV0dXJuIGA8aDI+JHtjb250ZW50M308L2gyPmA7CiAgICAgICAgY2FzZSAiaGVhZGluZy0zIjoKICAgICAgICAgIHJldHVybiBgPGgzPiR7Y29udGVudDN9PC9oMz5gOwogICAgICAgIGNhc2UgInF1b3RlIjoKICAgICAgICAgIHJldHVybiBgPGJsb2NrcXVvdGU+JHtjb250ZW50M308L2Jsb2NrcXVvdGU+YDsKICAgICAgICBjYXNlICJjb2RlIjoKICAgICAgICAgIHJldHVybiBgPHByZT48Y29kZT4ke3RoaXMuZXNjYXBlSHRtbChibG9jay5jb250ZW50KX08L2NvZGU+PC9wcmU+YDsKICAgICAgICBjYXNlICJsaXN0IjoKICAgICAgICAgIGNvbnN0IGl0ZW1zID0gYmxvY2suY29udGVudC5zcGxpdCgiXG4iKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHJpbSgpKTsKICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGNvbnN0IGxpc3RUYWcgPSBibG9jay5tZXRhZGF0YT8ubGlzdFR5cGUgPT09ICJvcmRlcmVkIiA/ICJvbCIgOiAidWwiOwogICAgICAgICAgICByZXR1cm4gYDwke2xpc3RUYWd9PiR7aXRlbXMubWFwKChpdGVtKSA9PiBgPGxpPiR7aXRlbX08L2xpPmApLmpvaW4oIiIpfTwvJHtsaXN0VGFnfT5gOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIGNhc2UgImRpdmlkZXIiOgogICAgICAgICAgcmV0dXJuICI8aHI+IjsKICAgICAgICBjYXNlICJpbWFnZSI6CiAgICAgICAgICBjb25zdCBpbWFnZVVybCA9IGJsb2NrLm1ldGFkYXRhPy51cmw7CiAgICAgICAgICBpZiAoaW1hZ2VVcmwpIHsKICAgICAgICAgICAgY29uc3QgYWx0VGV4dCA9IHRoaXMuZXNjYXBlSHRtbChibG9jay5jb250ZW50IHx8ICJJbWFnZSIpOwogICAgICAgICAgICByZXR1cm4gYDxpbWcgc3JjPSIke2ltYWdlVXJsfSIgYWx0PSIke2FsdFRleHR9IiAvPmA7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgY2FzZSAieW91dHViZSI6CiAgICAgICAgICBjb25zdCB2aWRlb0lkID0gYmxvY2subWV0YWRhdGE/LnZpZGVvSWQ7CiAgICAgICAgICBpZiAodmlkZW9JZCkgewogICAgICAgICAgICByZXR1cm4gYDxpZnJhbWUgd2lkdGg9IjU2MCIgaGVpZ2h0PSIzMTUiIHNyYz0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJHt2aWRlb0lkfSIgZnJhbWVib3JkZXI9IjAiIGFsbG93PSJhY2NlbGVyb21ldGVyOyBhdXRvcGxheTsgY2xpcGJvYXJkLXdyaXRlOyBlbmNyeXB0ZWQtbWVkaWE7IGd5cm9zY29wZTsgcGljdHVyZS1pbi1waWN0dXJlIiBhbGxvd2Z1bGxzY3JlZW4+PC9pZnJhbWU+YDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICBjYXNlICJtYXJrZG93biI6CiAgICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3M9Im1hcmtkb3duLWNvbnRlbnQiPiR7dGhpcy5lc2NhcGVIdG1sKGJsb2NrLmNvbnRlbnQpfTwvZGl2PmA7CiAgICAgICAgY2FzZSAiaHRtbCI6CiAgICAgICAgICByZXR1cm4gYmxvY2suY29udGVudDsKICAgICAgICBjYXNlICJhdHRhY2htZW50IjoKICAgICAgICAgIGNvbnN0IGZpbGVzID0gYmxvY2subWV0YWRhdGE/LmZpbGVzIHx8IFtdOwogICAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPSJhdHRhY2htZW50cyI+JHtmaWxlcy5tYXAoKGZpbGUpID0+IGA8ZGl2IGNsYXNzPSJhdHRhY2htZW50LWl0ZW0iIGRhdGEtZmlsZS1pZD0iJHtmaWxlLmlkfSI+CiAgICAgICAgICAgICAgICA8YSBocmVmPSIke2ZpbGUuZGF0YX0iIGRvd25sb2FkPSIke2ZpbGUubmFtZX0iPiR7dGhpcy5lc2NhcGVIdG1sKGZpbGUubmFtZSl9PC9hPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZpbGUtc2l6ZSI+KCR7dGhpcy5mb3JtYXRGaWxlU2l6ZShmaWxlLnNpemUpfSk8L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+YCkuam9pbigiIil9PC9kaXY+YDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIGA8cD4ke2NvbnRlbnQzfTwvcD5gOwogICAgICB9CiAgICB9KS5maWx0ZXIoKGh0bWwxNikgPT4gaHRtbDE2ICE9PSAiIikuam9pbigiXG4iKTsKICB9CiAgc3RhdGljIGdldE1hcmtkb3duT3V0cHV0KGJsb2NrcykgewogICAgcmV0dXJuIGJsb2Nrcy5tYXAoKGJsb2NrKSA9PiB7CiAgICAgIHN3aXRjaCAoYmxvY2sudHlwZSkgewogICAgICAgIGNhc2UgInBhcmFncmFwaCI6CiAgICAgICAgICByZXR1cm4gYmxvY2suY29udGVudDsKICAgICAgICBjYXNlICJoZWFkaW5nLTEiOgogICAgICAgICAgcmV0dXJuIGAjICR7YmxvY2suY29udGVudH1gOwogICAgICAgIGNhc2UgImhlYWRpbmctMiI6CiAgICAgICAgICByZXR1cm4gYCMjICR7YmxvY2suY29udGVudH1gOwogICAgICAgIGNhc2UgImhlYWRpbmctMyI6CiAgICAgICAgICByZXR1cm4gYCMjIyAke2Jsb2NrLmNvbnRlbnR9YDsKICAgICAgICBjYXNlICJxdW90ZSI6CiAgICAgICAgICByZXR1cm4gYD4gJHtibG9jay5jb250ZW50fWA7CiAgICAgICAgY2FzZSAiY29kZSI6CiAgICAgICAgICByZXR1cm4gYFxgXGBcYAoke2Jsb2NrLmNvbnRlbnR9ClxgXGBcYGA7CiAgICAgICAgY2FzZSAibGlzdCI6CiAgICAgICAgICBjb25zdCBpdGVtcyA9IGJsb2NrLmNvbnRlbnQuc3BsaXQoIlxuIikuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnRyaW0oKSk7CiAgICAgICAgICBpZiAoYmxvY2subWV0YWRhdGE/Lmxpc3RUeXBlID09PSAib3JkZXJlZCIpIHsKICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbSwgaW5kZXgyKSA9PiBgJHtpbmRleDIgKyAxfS4gJHtpdGVtfWApLmpvaW4oIlxuIik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtKSA9PiBgLSAke2l0ZW19YCkuam9pbigiXG4iKTsKICAgICAgICAgIH0KICAgICAgICBjYXNlICJkaXZpZGVyIjoKICAgICAgICAgIHJldHVybiAiLS0tIjsKICAgICAgICBjYXNlICJpbWFnZSI6CiAgICAgICAgICBjb25zdCBpbWFnZVVybCA9IGJsb2NrLm1ldGFkYXRhPy51cmw7CiAgICAgICAgICBjb25zdCBhbHRUZXh0ID0gYmxvY2suY29udGVudCB8fCAiSW1hZ2UiOwogICAgICAgICAgcmV0dXJuIGltYWdlVXJsID8gYCFbJHthbHRUZXh0fV0oJHtpbWFnZVVybH0pYCA6ICIiOwogICAgICAgIGNhc2UgInlvdXR1YmUiOgogICAgICAgICAgY29uc3QgdmlkZW9JZCA9IGJsb2NrLm1ldGFkYXRhPy52aWRlb0lkOwogICAgICAgICAgY29uc3QgdXJsID0gYmxvY2subWV0YWRhdGE/LnVybCB8fCAodmlkZW9JZCA/IGBodHRwczovL3lvdXR1YmUuY29tL3dhdGNoP3Y9JHt2aWRlb0lkfWAgOiAiIik7CiAgICAgICAgICByZXR1cm4gdXJsID8gYFtZb3VUdWJlIFZpZGVvXSgke3VybH0pYCA6ICIiOwogICAgICAgIGNhc2UgIm1hcmtkb3duIjoKICAgICAgICAgIHJldHVybiBibG9jay5jb250ZW50OwogICAgICAgIGNhc2UgImh0bWwiOgogICAgICAgICAgcmV0dXJuIGA8IS0tIEhUTUwgQmxvY2sKJHtibG9jay5jb250ZW50fQotLT5gOwogICAgICAgIGNhc2UgImF0dGFjaG1lbnQiOgogICAgICAgICAgY29uc3QgZmlsZXMgPSBibG9jay5tZXRhZGF0YT8uZmlsZXMgfHwgW107CiAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICByZXR1cm4gZmlsZXMubWFwKChmaWxlKSA9PiBgLSBbJHtmaWxlLm5hbWV9XSgke2ZpbGUuZGF0YX0pYCkuam9pbigiXG4iKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIGJsb2NrLmNvbnRlbnQ7CiAgICAgIH0KICAgIH0pLmZpbHRlcigobWQpID0+IG1kICE9PSAiIikuam9pbigiXG5cbiIpOwogIH0KICBzdGF0aWMgcGFyc2VIdG1sVG9CbG9ja3MoaHRtbDE2KSB7CiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7CiAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGh0bWwxNiwgInRleHQvaHRtbCIpOwogICAgY29uc3QgYmxvY2tzID0gW107CiAgICBjb25zdCBwcm9jZXNzTm9kZSA9IChub2RlMikgPT4gewogICAgICBpZiAobm9kZTIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFICYmIG5vZGUyLnRleHRDb250ZW50Py50cmltKCkpIHsKICAgICAgICBibG9ja3MucHVzaCh7CiAgICAgICAgICBpZDogYGJsb2NrLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOSl9YCwKICAgICAgICAgIHR5cGU6ICJwYXJhZ3JhcGgiLAogICAgICAgICAgY29udGVudDogbm9kZTIudGV4dENvbnRlbnQudHJpbSgpCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSBpZiAobm9kZTIubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgY29uc3QgZWxlbWVudDQgPSBub2RlMjsKICAgICAgICBjb25zdCB0YWdOYW1lID0gZWxlbWVudDQudGFnTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIHN3aXRjaCAodGFnTmFtZSkgewogICAgICAgICAgY2FzZSAicCI6CiAgICAgICAgICAgIGJsb2Nrcy5wdXNoKHsKICAgICAgICAgICAgICBpZDogYGJsb2NrLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOSl9YCwKICAgICAgICAgICAgICB0eXBlOiAicGFyYWdyYXBoIiwKICAgICAgICAgICAgICBjb250ZW50OiBlbGVtZW50NC5pbm5lckhUTUwgfHwgIiIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiaDEiOgogICAgICAgICAgICBibG9ja3MucHVzaCh7CiAgICAgICAgICAgICAgaWQ6IGBibG9jay0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDkpfWAsCiAgICAgICAgICAgICAgdHlwZTogImhlYWRpbmctMSIsCiAgICAgICAgICAgICAgY29udGVudDogZWxlbWVudDQuaW5uZXJIVE1MIHx8ICIiCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImgyIjoKICAgICAgICAgICAgYmxvY2tzLnB1c2goewogICAgICAgICAgICAgIGlkOiBgYmxvY2stJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gLAogICAgICAgICAgICAgIHR5cGU6ICJoZWFkaW5nLTIiLAogICAgICAgICAgICAgIGNvbnRlbnQ6IGVsZW1lbnQ0LmlubmVySFRNTCB8fCAiIgogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJoMyI6CiAgICAgICAgICAgIGJsb2Nrcy5wdXNoKHsKICAgICAgICAgICAgICBpZDogYGJsb2NrLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOSl9YCwKICAgICAgICAgICAgICB0eXBlOiAiaGVhZGluZy0zIiwKICAgICAgICAgICAgICBjb250ZW50OiBlbGVtZW50NC5pbm5lckhUTUwgfHwgIiIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiYmxvY2txdW90ZSI6CiAgICAgICAgICAgIGJsb2Nrcy5wdXNoKHsKICAgICAgICAgICAgICBpZDogYGJsb2NrLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOSl9YCwKICAgICAgICAgICAgICB0eXBlOiAicXVvdGUiLAogICAgICAgICAgICAgIGNvbnRlbnQ6IGVsZW1lbnQ0LmlubmVySFRNTCB8fCAiIgogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJwcmUiOgogICAgICAgICAgY2FzZSAiY29kZSI6CiAgICAgICAgICAgIGJsb2Nrcy5wdXNoKHsKICAgICAgICAgICAgICBpZDogYGJsb2NrLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOSl9YCwKICAgICAgICAgICAgICB0eXBlOiAiY29kZSIsCiAgICAgICAgICAgICAgY29udGVudDogZWxlbWVudDQudGV4dENvbnRlbnQgfHwgIiIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAidWwiOgogICAgICAgICAgY2FzZSAib2wiOgogICAgICAgICAgICBjb25zdCBsaXN0SXRlbXMgPSBBcnJheS5mcm9tKGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3JBbGwoImxpIikpOwogICAgICAgICAgICBjb25zdCBjb250ZW50MyA9IGxpc3RJdGVtcy5tYXAoKGxpMikgPT4gbGkyLmlubmVySFRNTCB8fCAiIikuam9pbigiXG4iKTsKICAgICAgICAgICAgYmxvY2tzLnB1c2goewogICAgICAgICAgICAgIGlkOiBgYmxvY2stJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gLAogICAgICAgICAgICAgIHR5cGU6ICJsaXN0IiwKICAgICAgICAgICAgICBjb250ZW50OiBjb250ZW50MywKICAgICAgICAgICAgICBtZXRhZGF0YTogeyBsaXN0VHlwZTogdGFnTmFtZSA9PT0gIm9sIiA/ICJvcmRlcmVkIiA6ICJidWxsZXQiIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiaHIiOgogICAgICAgICAgICBibG9ja3MucHVzaCh7CiAgICAgICAgICAgICAgaWQ6IGBibG9jay0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDkpfWAsCiAgICAgICAgICAgICAgdHlwZTogImRpdmlkZXIiLAogICAgICAgICAgICAgIGNvbnRlbnQ6ICIgIgogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJpbWciOgogICAgICAgICAgICBjb25zdCBpbWdFbGVtZW50ID0gZWxlbWVudDQ7CiAgICAgICAgICAgIGJsb2Nrcy5wdXNoKHsKICAgICAgICAgICAgICBpZDogYGJsb2NrLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOSl9YCwKICAgICAgICAgICAgICB0eXBlOiAiaW1hZ2UiLAogICAgICAgICAgICAgIGNvbnRlbnQ6IGltZ0VsZW1lbnQuYWx0IHx8ICIiLAogICAgICAgICAgICAgIG1ldGFkYXRhOiB7IHVybDogaW1nRWxlbWVudC5zcmMgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBlbGVtZW50NC5jaGlsZE5vZGVzLmZvckVhY2goKGNoaWxkKSA9PiBwcm9jZXNzTm9kZShjaGlsZCkpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGRvYy5ib2R5LmNoaWxkTm9kZXMuZm9yRWFjaCgobm9kZTIpID0+IHByb2Nlc3NOb2RlKG5vZGUyKSk7CiAgICByZXR1cm4gYmxvY2tzOwogIH0KICBzdGF0aWMgcGFyc2VNYXJrZG93blRvQmxvY2tzKG1hcmtkb3duKSB7CiAgICBjb25zdCBsaW5lcyA9IG1hcmtkb3duLnNwbGl0KCJcbiIpOwogICAgY29uc3QgYmxvY2tzID0gW107CiAgICBsZXQgY3VycmVudExpc3RJdGVtcyA9IFtdOwogICAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgbGluZXMubGVuZ3RoOyBpMTErKykgewogICAgICBjb25zdCBsaW5lID0gbGluZXNbaTExXTsKICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgiIyAiKSkgewogICAgICAgIGJsb2Nrcy5wdXNoKHsKICAgICAgICAgIGlkOiBgYmxvY2stJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gLAogICAgICAgICAgdHlwZTogImhlYWRpbmctMSIsCiAgICAgICAgICBjb250ZW50OiBsaW5lLnN1YnN0cmluZygyKQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiIyMgIikpIHsKICAgICAgICBibG9ja3MucHVzaCh7CiAgICAgICAgICBpZDogYGJsb2NrLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOSl9YCwKICAgICAgICAgIHR5cGU6ICJoZWFkaW5nLTIiLAogICAgICAgICAgY29udGVudDogbGluZS5zdWJzdHJpbmcoMykKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiMjIyAiKSkgewogICAgICAgIGJsb2Nrcy5wdXNoKHsKICAgICAgICAgIGlkOiBgYmxvY2stJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gLAogICAgICAgICAgdHlwZTogImhlYWRpbmctMyIsCiAgICAgICAgICBjb250ZW50OiBsaW5lLnN1YnN0cmluZyg0KQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiPiAiKSkgewogICAgICAgIGJsb2Nrcy5wdXNoKHsKICAgICAgICAgIGlkOiBgYmxvY2stJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gLAogICAgICAgICAgdHlwZTogInF1b3RlIiwKICAgICAgICAgIGNvbnRlbnQ6IGxpbmUuc3Vic3RyaW5nKDIpCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCJgYGAiKSkgewogICAgICAgIGNvbnN0IGNvZGVMaW5lcyA9IFtdOwogICAgICAgIGkxMSsrOwogICAgICAgIHdoaWxlIChpMTEgPCBsaW5lcy5sZW5ndGggJiYgIWxpbmVzW2kxMV0uc3RhcnRzV2l0aCgiYGBgIikpIHsKICAgICAgICAgIGNvZGVMaW5lcy5wdXNoKGxpbmVzW2kxMV0pOwogICAgICAgICAgaTExKys7CiAgICAgICAgfQogICAgICAgIGJsb2Nrcy5wdXNoKHsKICAgICAgICAgIGlkOiBgYmxvY2stJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gLAogICAgICAgICAgdHlwZTogImNvZGUiLAogICAgICAgICAgY29udGVudDogY29kZUxpbmVzLmpvaW4oIlxuIikKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmIChsaW5lLm1hdGNoKC9eKFwqfC0pIC8pKSB7CiAgICAgICAgY3VycmVudExpc3RJdGVtcy5wdXNoKGxpbmUuc3Vic3RyaW5nKDIpKTsKICAgICAgICBpZiAoaTExID09PSBsaW5lcy5sZW5ndGggLSAxIHx8ICFsaW5lc1tpMTEgKyAxXS5tYXRjaCgvXihcKnwtKSAvKSkgewogICAgICAgICAgYmxvY2tzLnB1c2goewogICAgICAgICAgICBpZDogYGJsb2NrLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOSl9YCwKICAgICAgICAgICAgdHlwZTogImxpc3QiLAogICAgICAgICAgICBjb250ZW50OiBjdXJyZW50TGlzdEl0ZW1zLmpvaW4oIlxuIiksCiAgICAgICAgICAgIG1ldGFkYXRhOiB7IGxpc3RUeXBlOiAiYnVsbGV0IiB9CiAgICAgICAgICB9KTsKICAgICAgICAgIGN1cnJlbnRMaXN0SXRlbXMgPSBbXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobGluZS5tYXRjaCgvXlxkK1wuIC8pKSB7CiAgICAgICAgY3VycmVudExpc3RJdGVtcy5wdXNoKGxpbmUucmVwbGFjZSgvXlxkK1wuIC8sICIiKSk7CiAgICAgICAgaWYgKGkxMSA9PT0gbGluZXMubGVuZ3RoIC0gMSB8fCAhbGluZXNbaTExICsgMV0ubWF0Y2goL15cZCtcLiAvKSkgewogICAgICAgICAgYmxvY2tzLnB1c2goewogICAgICAgICAgICBpZDogYGJsb2NrLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOSl9YCwKICAgICAgICAgICAgdHlwZTogImxpc3QiLAogICAgICAgICAgICBjb250ZW50OiBjdXJyZW50TGlzdEl0ZW1zLmpvaW4oIlxuIiksCiAgICAgICAgICAgIG1ldGFkYXRhOiB7IGxpc3RUeXBlOiAib3JkZXJlZCIgfQogICAgICAgICAgfSk7CiAgICAgICAgICBjdXJyZW50TGlzdEl0ZW1zID0gW107CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGxpbmUgPT09ICItLS0iIHx8IGxpbmUgPT09ICIqKioiIHx8IGxpbmUgPT09ICJfX18iKSB7CiAgICAgICAgYmxvY2tzLnB1c2goewogICAgICAgICAgaWQ6IGBibG9jay0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDkpfWAsCiAgICAgICAgICB0eXBlOiAiZGl2aWRlciIsCiAgICAgICAgICBjb250ZW50OiAiICIKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmIChsaW5lLm1hdGNoKC9eIVxbKFteXF1dKilcXVwoKFteXCldKylcKSQvKSkgewogICAgICAgIGNvbnN0IG1hdGNoMiA9IGxpbmUubWF0Y2goL14hXFsoW15cXV0qKVxdXCgoW15cKV0rKVwpJC8pOwogICAgICAgIGlmIChtYXRjaDIpIHsKICAgICAgICAgIGJsb2Nrcy5wdXNoKHsKICAgICAgICAgICAgaWQ6IGBibG9jay0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDkpfWAsCiAgICAgICAgICAgIHR5cGU6ICJpbWFnZSIsCiAgICAgICAgICAgIGNvbnRlbnQ6IG1hdGNoMlsxXSB8fCAiIiwKICAgICAgICAgICAgbWV0YWRhdGE6IHsgdXJsOiBtYXRjaDJbMl0gfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGxpbmUudHJpbSgpKSB7CiAgICAgICAgYmxvY2tzLnB1c2goewogICAgICAgICAgaWQ6IGBibG9jay0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDkpfWAsCiAgICAgICAgICB0eXBlOiAicGFyYWdyYXBoIiwKICAgICAgICAgIGNvbnRlbnQ6IGxpbmUKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJsb2NrczsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL3d5c2l3eWcuYmxvY2tzLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBXeXNpd3lnQmxvY2tzID0gY2xhc3MgewogIHN0YXRpYyByZW5kZXJMaXN0Q29udGVudChjb250ZW50MywgbWV0YWRhdGEpIHsKICAgIGNvbnN0IGl0ZW1zID0gY29udGVudDMuc3BsaXQoIlxuIikuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnRyaW0oKSk7CiAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKQogICAgICByZXR1cm4gIiI7CiAgICBjb25zdCBsaXN0VGFnID0gbWV0YWRhdGE/Lmxpc3RUeXBlID09PSAib3JkZXJlZCIgPyAib2wiIDogInVsIjsKICAgIHJldHVybiBgPCR7bGlzdFRhZ30+JHtpdGVtcy5tYXAoKGl0ZW0pID0+IGA8bGk+JHtpdGVtfTwvbGk+YCkuam9pbigiIil9PC8ke2xpc3RUYWd9PmA7CiAgfQogIHN0YXRpYyByZW5kZXJCbG9jayhibG9jaywgaXNTZWxlY3RlZCwgaGFuZGxlcnMyKSB7CiAgICBpZiAoYmxvY2sudHlwZSA9PT0gImRpdmlkZXIiKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgICA8ZGl2CiAgICAgICAgICBjbGFzcz0iYmxvY2sgZGl2aWRlciIKICAgICAgICAgIGRhdGEtYmxvY2staWQ9IiR7YmxvY2suaWR9IgogICAgICAgID4KICAgICAgICAgIDxocj4KICAgICAgICA8L2Rpdj4KICAgICAgYDsKICAgIH0KICAgIGlmIChibG9jay50eXBlID09PSAibGlzdCIpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICAgIDxkaXYKICAgICAgICAgIGNsYXNzPSJibG9jayBsaXN0ICR7aXNTZWxlY3RlZCA/ICJzZWxlY3RlZCIgOiAiIn0iCiAgICAgICAgICBkYXRhLWJsb2NrLWlkPSIke2Jsb2NrLmlkfSIKICAgICAgICAgIGNvbnRlbnRlZGl0YWJsZT0idHJ1ZSIKICAgICAgICAgIEBpbnB1dD0iJHtoYW5kbGVyczIub25JbnB1dH0iCiAgICAgICAgICBAa2V5ZG93bj0iJHtoYW5kbGVyczIub25LZXlEb3dufSIKICAgICAgICAgIEBmb2N1cz0iJHtoYW5kbGVyczIub25Gb2N1c30iCiAgICAgICAgICBAYmx1cj0iJHtoYW5kbGVyczIub25CbHVyfSIKICAgICAgICAgIEBjb21wb3NpdGlvbnN0YXJ0PSIke2hhbmRsZXJzMi5vbkNvbXBvc2l0aW9uU3RhcnR9IgogICAgICAgICAgQGNvbXBvc2l0aW9uZW5kPSIke2hhbmRsZXJzMi5vbkNvbXBvc2l0aW9uRW5kfSIKICAgICAgICAgIEBtb3VzZXVwPSIkeyhlMTEpID0+IHsKICAgICAgICBjb25zb2xlLmxvZygiQmxvY2sgbW91c2V1cCBldmVudCBmaXJlZCIpOwogICAgICAgIGlmIChoYW5kbGVyczIub25Nb3VzZVVwKQogICAgICAgICAgaGFuZGxlcnMyLm9uTW91c2VVcChlMTEpOwogICAgICB9fSIKICAgICAgICAgIC5pbm5lckhUTUw9IiR7dGhpcy5yZW5kZXJMaXN0Q29udGVudChibG9jay5jb250ZW50LCBibG9jay5tZXRhZGF0YSl9IgogICAgICAgID48L2Rpdj4KICAgICAgYDsKICAgIH0KICAgIGlmIChibG9jay50eXBlID09PSAiY29kZSIpIHsKICAgICAgY29uc3QgbGFuZ3VhZ2UgPSBibG9jay5tZXRhZGF0YT8ubGFuZ3VhZ2UgfHwgInBsYWluIHRleHQiOwogICAgICByZXR1cm4gYjJgCiAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1ibG9jay1jb250YWluZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1sYW5ndWFnZSI+JHtsYW5ndWFnZX08L2Rpdj4KICAgICAgICAgIDxkaXYKICAgICAgICAgICAgY2xhc3M9ImJsb2NrICR7YmxvY2sudHlwZX0gJHtpc1NlbGVjdGVkID8gInNlbGVjdGVkIiA6ICIifSIKICAgICAgICAgICAgY29udGVudGVkaXRhYmxlPSJ0cnVlIgogICAgICAgICAgICBAaW5wdXQ9IiR7aGFuZGxlcnMyLm9uSW5wdXR9IgogICAgICAgICAgICBAa2V5ZG93bj0iJHtoYW5kbGVyczIub25LZXlEb3dufSIKICAgICAgICAgICAgQGZvY3VzPSIke2hhbmRsZXJzMi5vbkZvY3VzfSIKICAgICAgICAgICAgQGJsdXI9IiR7aGFuZGxlcnMyLm9uQmx1cn0iCiAgICAgICAgICAgIEBjb21wb3NpdGlvbnN0YXJ0PSIke2hhbmRsZXJzMi5vbkNvbXBvc2l0aW9uU3RhcnR9IgogICAgICAgICAgICBAY29tcG9zaXRpb25lbmQ9IiR7aGFuZGxlcnMyLm9uQ29tcG9zaXRpb25FbmR9IgogICAgICAgICAgICBAbW91c2V1cD0iJHsoZTExKSA9PiB7CiAgICAgICAgY29uc29sZS5sb2coIkJsb2NrIG1vdXNldXAgZXZlbnQgZmlyZWQiKTsKICAgICAgICBpZiAoaGFuZGxlcnMyLm9uTW91c2VVcCkKICAgICAgICAgIGhhbmRsZXJzMi5vbk1vdXNlVXAoZTExKTsKICAgICAgfX0iCiAgICAgICAgICAgIC50ZXh0Q29udGVudD0iJHtibG9jay5jb250ZW50IHx8ICIifSIKICAgICAgICAgID48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgYDsKICAgIH0KICAgIGNvbnN0IGJsb2NrRWxlbWVudCA9IGIyYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9ImJsb2NrICR7YmxvY2sudHlwZX0gJHtpc1NlbGVjdGVkID8gInNlbGVjdGVkIiA6ICIifSIKICAgICAgICBjb250ZW50ZWRpdGFibGU9InRydWUiCiAgICAgICAgQGlucHV0PSIke2hhbmRsZXJzMi5vbklucHV0fSIKICAgICAgICBAa2V5ZG93bj0iJHtoYW5kbGVyczIub25LZXlEb3dufSIKICAgICAgICBAZm9jdXM9IiR7aGFuZGxlcnMyLm9uRm9jdXN9IgogICAgICAgIEBibHVyPSIke2hhbmRsZXJzMi5vbkJsdXJ9IgogICAgICAgIEBjb21wb3NpdGlvbnN0YXJ0PSIke2hhbmRsZXJzMi5vbkNvbXBvc2l0aW9uU3RhcnR9IgogICAgICAgIEBjb21wb3NpdGlvbmVuZD0iJHtoYW5kbGVyczIub25Db21wb3NpdGlvbkVuZH0iCiAgICAgICAgQG1vdXNldXA9IiR7KGUxMSkgPT4gewogICAgICBjb25zb2xlLmxvZygiQmxvY2sgbW91c2V1cCBldmVudCBmaXJlZCIpOwogICAgICBpZiAoaGFuZGxlcnMyLm9uTW91c2VVcCkKICAgICAgICBoYW5kbGVyczIub25Nb3VzZVVwKGUxMSk7CiAgICB9fSIKICAgICAgICAuaW5uZXJIVE1MPSIke2Jsb2NrLmNvbnRlbnQgfHwgIiJ9IgogICAgICA+PC9kaXY+CiAgICBgOwogICAgcmV0dXJuIGJsb2NrRWxlbWVudDsKICB9CiAgc3RhdGljIHNldEN1cnNvclRvRW5kKGVsZW1lbnQ0KSB7CiAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICBpZiAoIXNlbCkKICAgICAgcmV0dXJuOwogICAgY29uc3QgcmFuZ2UyID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgIGlmIChlbGVtZW50NC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkgewogICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJcdTIwMEIiKTsKICAgICAgZWxlbWVudDQuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOwogICAgICByYW5nZTIuc2V0U3RhcnQodGV4dE5vZGUsIDEpOwogICAgICByYW5nZTIuY29sbGFwc2UodHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBsYXN0Tm9kZSA9IHRoaXMuZ2V0TGFzdE5vZGUoZWxlbWVudDQpOwogICAgICBpZiAobGFzdE5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7CiAgICAgICAgcmFuZ2UyLnNldFN0YXJ0KGxhc3ROb2RlLCBsYXN0Tm9kZS50ZXh0Q29udGVudD8ubGVuZ3RoIHx8IDApOwogICAgICB9IGVsc2UgewogICAgICAgIHJhbmdlMi5zZXRTdGFydEFmdGVyKGxhc3ROb2RlKTsKICAgICAgfQogICAgICByYW5nZTIuY29sbGFwc2UodHJ1ZSk7CiAgICB9CiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICBzZWwuYWRkUmFuZ2UocmFuZ2UyKTsKICAgIGlmIChlbGVtZW50NC50ZXh0Q29udGVudCA9PT0gIlx1MjAwQiIpIHsKICAgICAgZWxlbWVudDQudGV4dENvbnRlbnQgPSAiIjsKICAgIH0KICB9CiAgc3RhdGljIHNldEN1cnNvclRvU3RhcnQoZWxlbWVudDQpIHsKICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgIGlmICghc2VsKQogICAgICByZXR1cm47CiAgICBjb25zdCByYW5nZTIgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgaWYgKGVsZW1lbnQ0LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7CiAgICAgIHJhbmdlMi5zZXRTdGFydChlbGVtZW50NCwgMCk7CiAgICAgIHJhbmdlMi5jb2xsYXBzZSh0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGZpcnN0Tm9kZSA9IHRoaXMuZ2V0Rmlyc3ROb2RlKGVsZW1lbnQ0KTsKICAgICAgaWYgKGZpcnN0Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHsKICAgICAgICByYW5nZTIuc2V0U3RhcnQoZmlyc3ROb2RlLCAwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByYW5nZTIuc2V0U3RhcnRCZWZvcmUoZmlyc3ROb2RlKTsKICAgICAgfQogICAgICByYW5nZTIuY29sbGFwc2UodHJ1ZSk7CiAgICB9CiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICBzZWwuYWRkUmFuZ2UocmFuZ2UyKTsKICB9CiAgc3RhdGljIGdldExhc3ROb2RlKGVsZW1lbnQ0KSB7CiAgICBpZiAoZWxlbWVudDQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIGVsZW1lbnQ0OwogICAgfQogICAgY29uc3QgbGFzdENoaWxkID0gZWxlbWVudDQuY2hpbGROb2Rlc1tlbGVtZW50NC5jaGlsZE5vZGVzLmxlbmd0aCAtIDFdOwogICAgaWYgKGxhc3RDaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgfHwgbGFzdENoaWxkLmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBsYXN0Q2hpbGQ7CiAgICB9CiAgICByZXR1cm4gdGhpcy5nZXRMYXN0Tm9kZShsYXN0Q2hpbGQpOwogIH0KICBzdGF0aWMgZ2V0Rmlyc3ROb2RlKGVsZW1lbnQ0KSB7CiAgICBpZiAoZWxlbWVudDQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIGVsZW1lbnQ0OwogICAgfQogICAgY29uc3QgZmlyc3RDaGlsZCA9IGVsZW1lbnQ0LmNoaWxkTm9kZXNbMF07CiAgICBpZiAoZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgfHwgZmlyc3RDaGlsZC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gZmlyc3RDaGlsZDsKICAgIH0KICAgIHJldHVybiB0aGlzLmdldEZpcnN0Tm9kZShmaXJzdENoaWxkKTsKICB9CiAgc3RhdGljIGZvY3VzTGlzdEl0ZW0obGlzdEVsZW1lbnQpIHsKICAgIGNvbnN0IGZpcnN0TGkgPSBsaXN0RWxlbWVudC5xdWVyeVNlbGVjdG9yKCJsaSIpOwogICAgaWYgKGZpcnN0TGkpIHsKICAgICAgZmlyc3RMaS5mb2N1cygpOwogICAgICBjb25zdCByYW5nZTIgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgIHJhbmdlMi5zZWxlY3ROb2RlQ29udGVudHMoZmlyc3RMaSk7CiAgICAgIHJhbmdlMi5jb2xsYXBzZSh0cnVlKTsKICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UyKTsKICAgIH0KICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL3d5c2l3eWcuYmxvY2tvcGVyYXRpb25zLmpzCnZhciBXeXNpd3lnQmxvY2tPcGVyYXRpb25zID0gY2xhc3MgewogIGNvbXBvbmVudDsKICBjb25zdHJ1Y3Rvcihjb21wb25lbnQpIHsKICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwogIH0KICAvKioKICAgKiBDcmVhdGVzIGEgbmV3IGJsb2NrIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCiAgICovCiAgY3JlYXRlQmxvY2sodHlwZTUgPSAicGFyYWdyYXBoIiwgY29udGVudDMgPSAiIiwgbWV0YWRhdGEpIHsKICAgIHJldHVybiB7CiAgICAgIGlkOiBXeXNpd3lnU2hvcnRjdXRzLmdlbmVyYXRlQmxvY2tJZCgpLAogICAgICB0eXBlOiB0eXBlNSwKICAgICAgY29udGVudDogY29udGVudDMsCiAgICAgIC4uLm1ldGFkYXRhICYmIHsgbWV0YWRhdGEgfQogICAgfTsKICB9CiAgLyoqCiAgICogSW5zZXJ0cyBhIGJsb2NrIGFmdGVyIHRoZSBzcGVjaWZpZWQgYmxvY2sKICAgKi8KICBhc3luYyBpbnNlcnRCbG9ja0FmdGVyKGFmdGVyQmxvY2ssIG5ld0Jsb2NrLCBmb2N1c05ld0Jsb2NrID0gdHJ1ZSkgewogICAgY29uc3QgYmxvY2tzID0gdGhpcy5jb21wb25lbnQuYmxvY2tzOwogICAgY29uc3QgYmxvY2tJbmRleCA9IGJsb2Nrcy5maW5kSW5kZXgoKGI1KSA9PiBiNS5pZCA9PT0gYWZ0ZXJCbG9jay5pZCk7CiAgICB0aGlzLmNvbXBvbmVudC5ibG9ja3MgPSBbCiAgICAgIC4uLmJsb2Nrcy5zbGljZSgwLCBibG9ja0luZGV4ICsgMSksCiAgICAgIG5ld0Jsb2NrLAogICAgICAuLi5ibG9ja3Muc2xpY2UoYmxvY2tJbmRleCArIDEpCiAgICBdOwogICAgaWYgKHRoaXMuY29tcG9uZW50LmVkaXRvckNvbnRlbnRSZWYpIHsKICAgICAgY29uc3QgYWZ0ZXJXcmFwcGVyID0gdGhpcy5jb21wb25lbnQuZWRpdG9yQ29udGVudFJlZi5xdWVyeVNlbGVjdG9yKGBbZGF0YS1ibG9jay1pZD0iJHthZnRlckJsb2NrLmlkfSJdYCk7CiAgICAgIGlmIChhZnRlcldyYXBwZXIpIHsKICAgICAgICBjb25zdCBuZXdXcmFwcGVyID0gdGhpcy5jb21wb25lbnQuY3JlYXRlQmxvY2tFbGVtZW50KG5ld0Jsb2NrKTsKICAgICAgICBhZnRlcldyYXBwZXIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJhZnRlcmVuZCIsIG5ld1dyYXBwZXIpOwogICAgICB9CiAgICB9CiAgICB0aGlzLmNvbXBvbmVudC51cGRhdGVWYWx1ZSgpOwogICAgaWYgKGZvY3VzTmV3QmxvY2sgJiYgbmV3QmxvY2sudHlwZSAhPT0gImRpdmlkZXIiKSB7CiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlMikgPT4gc2V0VGltZW91dChyZXNvbHZlMiwgMCkpOwogICAgICBhd2FpdCB0aGlzLmZvY3VzQmxvY2sobmV3QmxvY2suaWQsICJzdGFydCIpOwogICAgfQogIH0KICAvKioKICAgKiBSZW1vdmVzIGEgYmxvY2sgYnkgaXRzIElECiAgICovCiAgcmVtb3ZlQmxvY2soYmxvY2tJZCkgewogICAgdGhpcy5jb21wb25lbnQuc2F2ZVRvSGlzdG9yeShmYWxzZSk7CiAgICB0aGlzLmNvbXBvbmVudC5ibG9ja3MgPSB0aGlzLmNvbXBvbmVudC5ibG9ja3MuZmlsdGVyKChiNSkgPT4gYjUuaWQgIT09IGJsb2NrSWQpOwogICAgaWYgKHRoaXMuY29tcG9uZW50LmVkaXRvckNvbnRlbnRSZWYpIHsKICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuY29tcG9uZW50LmVkaXRvckNvbnRlbnRSZWYucXVlcnlTZWxlY3RvcihgW2RhdGEtYmxvY2staWQ9IiR7YmxvY2tJZH0iXWApOwogICAgICBpZiAod3JhcHBlcikgewogICAgICAgIHdyYXBwZXIucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuY29tcG9uZW50LnVwZGF0ZVZhbHVlKCk7CiAgfQogIC8qKgogICAqIEZpbmRzIGEgYmxvY2sgYnkgaXRzIElECiAgICovCiAgZmluZEJsb2NrKGJsb2NrSWQpIHsKICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC5ibG9ja3MuZmluZCgoYjUpID0+IGI1LmlkID09PSBibG9ja0lkKTsKICB9CiAgLyoqCiAgICogR2V0cyB0aGUgaW5kZXggb2YgYSBibG9jawogICAqLwogIGdldEJsb2NrSW5kZXgoYmxvY2tJZCkgewogICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LmJsb2Nrcy5maW5kSW5kZXgoKGI1KSA9PiBiNS5pZCA9PT0gYmxvY2tJZCk7CiAgfQogIC8qKgogICAqIEZvY3VzZXMgYSBzcGVjaWZpYyBibG9jawogICAqLwogIGFzeW5jIGZvY3VzQmxvY2soYmxvY2tJZCwgY3Vyc29yUG9zaXRpb24gPSAic3RhcnQiKSB7CiAgICBjb25zdCB3cmFwcGVyRWxlbWVudCA9IHRoaXMuY29tcG9uZW50LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihgW2RhdGEtYmxvY2staWQ9IiR7YmxvY2tJZH0iXWApOwogICAgaWYgKHdyYXBwZXJFbGVtZW50KSB7CiAgICAgIGNvbnN0IGJsb2NrQ29tcG9uZW50ID0gd3JhcHBlckVsZW1lbnQucXVlcnlTZWxlY3RvcigiZGVlcy13eXNpd3lnLWJsb2NrIik7CiAgICAgIGlmIChibG9ja0NvbXBvbmVudCkgewogICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlMikgPT4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlc29sdmUyKSk7CiAgICAgICAgYmxvY2tDb21wb25lbnQuZm9jdXNXaXRoQ3Vyc29yKGN1cnNvclBvc2l0aW9uKTsKICAgICAgfQogICAgfQogIH0KICAvKioKICAgKiBVcGRhdGVzIHRoZSBjb250ZW50IG9mIGEgYmxvY2sKICAgKi8KICB1cGRhdGVCbG9ja0NvbnRlbnQoYmxvY2tJZCwgY29udGVudDMpIHsKICAgIGNvbnN0IGJsb2NrID0gdGhpcy5maW5kQmxvY2soYmxvY2tJZCk7CiAgICBpZiAoYmxvY2spIHsKICAgICAgYmxvY2suY29udGVudCA9IGNvbnRlbnQzOwogICAgICB0aGlzLmNvbXBvbmVudC51cGRhdGVWYWx1ZSgpOwogICAgfQogIH0KICAvKioKICAgKiBUcmFuc2Zvcm1zIGEgYmxvY2sgdG8gYSBkaWZmZXJlbnQgdHlwZQogICAqLwogIHRyYW5zZm9ybUJsb2NrKGJsb2NrSWQsIG5ld1R5cGUsIG1ldGFkYXRhKSB7CiAgICBjb25zdCBibG9jayA9IHRoaXMuZmluZEJsb2NrKGJsb2NrSWQpOwogICAgaWYgKGJsb2NrKSB7CiAgICAgIHRoaXMuY29tcG9uZW50LnNhdmVUb0hpc3RvcnkoZmFsc2UpOwogICAgICBibG9jay50eXBlID0gbmV3VHlwZTsKICAgICAgYmxvY2suY29udGVudCA9ICIiOwogICAgICBpZiAobWV0YWRhdGEpIHsKICAgICAgICBibG9jay5tZXRhZGF0YSA9IG1ldGFkYXRhOwogICAgICB9CiAgICAgIGlmICh0aGlzLmNvbXBvbmVudC5lZGl0b3JDb250ZW50UmVmKSB7CiAgICAgICAgdGhpcy5jb21wb25lbnQudXBkYXRlQmxvY2tFbGVtZW50KGJsb2NrSWQpOwogICAgICB9CiAgICAgIHRoaXMuY29tcG9uZW50LnVwZGF0ZVZhbHVlKCk7CiAgICB9CiAgfQogIC8qKgogICAqIE1vdmVzIGEgYmxvY2sgdG8gYSBuZXcgcG9zaXRpb24KICAgKi8KICBtb3ZlQmxvY2soYmxvY2tJZCwgdGFyZ2V0SW5kZXgpIHsKICAgIGNvbnN0IGJsb2NrcyA9IFsuLi50aGlzLmNvbXBvbmVudC5ibG9ja3NdOwogICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5nZXRCbG9ja0luZGV4KGJsb2NrSWQpOwogICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gLTEgfHwgdGFyZ2V0SW5kZXggPCAwIHx8IHRhcmdldEluZGV4ID49IGJsb2Nrcy5sZW5ndGgpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgW21vdmVkQmxvY2tdID0gYmxvY2tzLnNwbGljZShjdXJyZW50SW5kZXgsIDEpOwogICAgYmxvY2tzLnNwbGljZSh0YXJnZXRJbmRleCwgMCwgbW92ZWRCbG9jayk7CiAgICB0aGlzLmNvbXBvbmVudC5ibG9ja3MgPSBibG9ja3M7CiAgICB0aGlzLmNvbXBvbmVudC51cGRhdGVWYWx1ZSgpOwogIH0KICAvKioKICAgKiBHZXRzIHRoZSBwcmV2aW91cyBibG9jawogICAqLwogIGdldFByZXZpb3VzQmxvY2soYmxvY2tJZCkgewogICAgY29uc3QgaW5kZXgyID0gdGhpcy5nZXRCbG9ja0luZGV4KGJsb2NrSWQpOwogICAgcmV0dXJuIGluZGV4MiA+IDAgPyB0aGlzLmNvbXBvbmVudC5ibG9ja3NbaW5kZXgyIC0gMV0gOiBudWxsOwogIH0KICAvKioKICAgKiBHZXRzIHRoZSBuZXh0IGJsb2NrCiAgICovCiAgZ2V0TmV4dEJsb2NrKGJsb2NrSWQpIHsKICAgIGNvbnN0IGluZGV4MiA9IHRoaXMuZ2V0QmxvY2tJbmRleChibG9ja0lkKTsKICAgIHJldHVybiBpbmRleDIgPCB0aGlzLmNvbXBvbmVudC5ibG9ja3MubGVuZ3RoIC0gMSA/IHRoaXMuY29tcG9uZW50LmJsb2Nrc1tpbmRleDIgKyAxXSA6IG51bGw7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy9ibG9ja3MvYmxvY2suYmFzZS5qcwp2YXIgQmFzZUJsb2NrSGFuZGxlciA9IGNsYXNzIHsKICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBjb21tb24gc2V0dXAKICBzZXR1cChlbGVtZW50NCwgYmxvY2ssIGhhbmRsZXJzMikgewogIH0KICAvLyBDb21tb24gc3R5bGVzIGNhbiBiZSBkZWZpbmVkIGhlcmUKICBnZXRTdHlsZXMoKSB7CiAgICByZXR1cm4gIiI7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy9ibG9ja3MvYmxvY2sucmVnaXN0cnkuanMKdmFyIEJsb2NrUmVnaXN0cnkgPSBjbGFzcyB7CiAgc3RhdGljIGhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBzdGF0aWMgcmVnaXN0ZXIodHlwZTUsIGhhbmRsZXIyKSB7CiAgICB0aGlzLmhhbmRsZXJzLnNldCh0eXBlNSwgaGFuZGxlcjIpOwogIH0KICBzdGF0aWMgZ2V0SGFuZGxlcih0eXBlNSkgewogICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMuZ2V0KHR5cGU1KTsKICB9CiAgc3RhdGljIGdldEFsbFR5cGVzKCkgewogICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5oYW5kbGVycy5rZXlzKCkpOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvYmxvY2tzL3RleHQvcGFyYWdyYXBoLmJsb2NrLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBQYXJhZ3JhcGhCbG9ja0hhbmRsZXIgPSBjbGFzcyBleHRlbmRzIEJhc2VCbG9ja0hhbmRsZXIgewogIHR5cGUgPSAicGFyYWdyYXBoIjsKICAvLyBUcmFjayBjdXJzb3IgcG9zaXRpb24KICBsYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IDA7CiAgbGFzdFNlbGVjdGVkVGV4dCA9ICIiOwogIHNlbGVjdGlvbkhhbmRsZXIgPSBudWxsOwogIHJlbmRlcihibG9jaywgaXNTZWxlY3RlZCkgewogICAgY29uc3Qgc2VsZWN0ZWRDbGFzcyA9IGlzU2VsZWN0ZWQgPyAiIHNlbGVjdGVkIiA6ICIiOwogICAgY29uc3QgcGxhY2Vob2xkZXIgPSB0aGlzLmdldFBsYWNlaG9sZGVyKCk7CiAgICByZXR1cm4gYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9ImJsb2NrIHBhcmFncmFwaCR7c2VsZWN0ZWRDbGFzc30iCiAgICAgICAgY29udGVudGVkaXRhYmxlPSJ0cnVlIgogICAgICAgIGRhdGEtcGxhY2Vob2xkZXI9IiR7cGxhY2Vob2xkZXJ9IgogICAgICAgIGRhdGEtYmxvY2staWQ9IiR7YmxvY2suaWR9IgogICAgICAgIGRhdGEtYmxvY2stdHlwZT0iJHtibG9jay50eXBlfSIKICAgICAgPjwvZGl2PgogICAgYDsKICB9CiAgc2V0dXAoZWxlbWVudDQsIGJsb2NrLCBoYW5kbGVyczIpIHsKICAgIGNvbnN0IHBhcmFncmFwaEJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLnBhcmFncmFwaCIpOwogICAgaWYgKCFwYXJhZ3JhcGhCbG9jaykgewogICAgICBjb25zb2xlLmVycm9yKCJQYXJhZ3JhcGhCbG9ja0hhbmRsZXIuc2V0dXA6IE5vIHBhcmFncmFwaCBibG9jayBlbGVtZW50IGZvdW5kIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChibG9jay5jb250ZW50ICYmICFwYXJhZ3JhcGhCbG9jay5pbm5lckhUTUwpIHsKICAgICAgcGFyYWdyYXBoQmxvY2suaW5uZXJIVE1MID0gYmxvY2suY29udGVudDsKICAgIH0KICAgIHBhcmFncmFwaEJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgKGUxMSkgPT4gewogICAgICBoYW5kbGVyczIub25JbnB1dChlMTEpOwogICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KTsKICAgICAgaWYgKHBvcyAhPT0gbnVsbCkgewogICAgICAgIHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gPSBwb3M7CiAgICAgIH0KICAgIH0pOwogICAgcGFyYWdyYXBoQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIChlMTEpID0+IHsKICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCk7CiAgICAgIGlmIChwb3MgIT09IG51bGwpIHsKICAgICAgICB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gcG9zOwogICAgICB9CiAgICAgIGhhbmRsZXJzMi5vbktleURvd24oZTExKTsKICAgIH0pOwogICAgcGFyYWdyYXBoQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLCAoKSA9PiB7CiAgICAgIGhhbmRsZXJzMi5vbkZvY3VzKCk7CiAgICB9KTsKICAgIHBhcmFncmFwaEJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLCAoKSA9PiB7CiAgICAgIGhhbmRsZXJzMi5vbkJsdXIoKTsKICAgIH0pOwogICAgcGFyYWdyYXBoQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiY29tcG9zaXRpb25zdGFydCIsICgpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uQ29tcG9zaXRpb25TdGFydCgpOwogICAgfSk7CiAgICBwYXJhZ3JhcGhCbG9jay5hZGRFdmVudExpc3RlbmVyKCJjb21wb3NpdGlvbmVuZCIsICgpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uQ29tcG9zaXRpb25FbmQoKTsKICAgIH0pOwogICAgcGFyYWdyYXBoQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIChlMTEpID0+IHsKICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCk7CiAgICAgIGlmIChwb3MgIT09IG51bGwpIHsKICAgICAgICB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gcG9zOwogICAgICB9CiAgICAgIGhhbmRsZXJzMi5vbk1vdXNlVXA/LihlMTEpOwogICAgfSk7CiAgICBwYXJhZ3JhcGhCbG9jay5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIChlMTEpID0+IHsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCk7CiAgICAgICAgaWYgKHBvcyAhPT0gbnVsbCkgewogICAgICAgICAgdGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IHBvczsKICAgICAgICB9CiAgICAgIH0sIDApOwogICAgfSk7CiAgICBwYXJhZ3JhcGhCbG9jay5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsIChlMTEpID0+IHsKICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCk7CiAgICAgIGlmIChwb3MgIT09IG51bGwpIHsKICAgICAgICB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gcG9zOwogICAgICB9CiAgICB9KTsKICAgIHRoaXMuc2V0dXBTZWxlY3Rpb25IYW5kbGVyKGVsZW1lbnQ0LCBwYXJhZ3JhcGhCbG9jaywgYmxvY2spOwogIH0KICBzZXR1cFNlbGVjdGlvbkhhbmRsZXIoZWxlbWVudDQsIHBhcmFncmFwaEJsb2NrLCBibG9jaykgewogICAgY29uc3QgY2hlY2tTZWxlY3Rpb24gPSAoKSA9PiB7CiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTsKICAgICAgaWYgKHNlbGVjdGVkVGV4dC5sZW5ndGggPT09IDApIHsKICAgICAgICBpZiAodGhpcy5sYXN0U2VsZWN0ZWRUZXh0KSB7CiAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZFRleHQgPSAiIjsKICAgICAgICAgIHRoaXMuZGlzcGF0Y2hTZWxlY3Rpb25FdmVudChlbGVtZW50NCwgewogICAgICAgICAgICB0ZXh0OiAiIiwKICAgICAgICAgICAgYmxvY2tJZDogYmxvY2suaWQsCiAgICAgICAgICAgIGhhc1NlbGVjdGlvbjogZmFsc2UKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgd3lzaXd5Z0Jsb2NrMiA9IHBhcmFncmFwaEJsb2NrLmdldFJvb3ROb2RlKCkuaG9zdDsKICAgICAgY29uc3QgcGFyZW50Q29tcG9uZW50ID0gd3lzaXd5Z0Jsb2NrMj8uY2xvc2VzdCgiZGVlcy1pbnB1dC13eXNpd3lnIik7CiAgICAgIGNvbnN0IHBhcmVudFNoYWRvd1Jvb3QgPSBwYXJlbnRDb21wb25lbnQ/LnNoYWRvd1Jvb3Q7CiAgICAgIGNvbnN0IGJsb2NrU2hhZG93Um9vdCA9IHd5c2l3eWdCbG9jazI/LnNoYWRvd1Jvb3Q7CiAgICAgIGNvbnN0IHNoYWRvd1Jvb3RzID0gW107CiAgICAgIGlmIChwYXJlbnRTaGFkb3dSb290KQogICAgICAgIHNoYWRvd1Jvb3RzLnB1c2gocGFyZW50U2hhZG93Um9vdCk7CiAgICAgIGlmIChibG9ja1NoYWRvd1Jvb3QpCiAgICAgICAgc2hhZG93Um9vdHMucHVzaChibG9ja1NoYWRvd1Jvb3QpOwogICAgICBjb25zdCBzZWxlY3Rpb25JbmZvID0gV3lzaXd5Z1NlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvKC4uLnNoYWRvd1Jvb3RzKTsKICAgICAgaWYgKCFzZWxlY3Rpb25JbmZvKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3Qgc3RhcnRJbkJsb2NrID0gV3lzaXd5Z1NlbGVjdGlvbi5jb250YWluc0Fjcm9zc1NoYWRvd0RPTShwYXJhZ3JhcGhCbG9jaywgc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lcik7CiAgICAgIGNvbnN0IGVuZEluQmxvY2sgPSBXeXNpd3lnU2VsZWN0aW9uLmNvbnRhaW5zQWNyb3NzU2hhZG93RE9NKHBhcmFncmFwaEJsb2NrLCBzZWxlY3Rpb25JbmZvLmVuZENvbnRhaW5lcik7CiAgICAgIGlmIChzdGFydEluQmxvY2sgfHwgZW5kSW5CbG9jaykgewogICAgICAgIGlmIChzZWxlY3RlZFRleHQgIT09IHRoaXMubGFzdFNlbGVjdGVkVGV4dCkgewogICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRUZXh0ID0gc2VsZWN0ZWRUZXh0OwogICAgICAgICAgY29uc3QgcmFuZ2UyID0gV3lzaXd5Z1NlbGVjdGlvbi5jcmVhdGVSYW5nZUZyb21JbmZvKHNlbGVjdGlvbkluZm8pOwogICAgICAgICAgY29uc3QgcmVjdCA9IHJhbmdlMi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgIHRoaXMuZGlzcGF0Y2hTZWxlY3Rpb25FdmVudChlbGVtZW50NCwgewogICAgICAgICAgICB0ZXh0OiBzZWxlY3RlZFRleHQudHJpbSgpLAogICAgICAgICAgICBibG9ja0lkOiBibG9jay5pZCwKICAgICAgICAgICAgcmFuZ2U6IHJhbmdlMiwKICAgICAgICAgICAgcmVjdCwKICAgICAgICAgICAgaGFzU2VsZWN0aW9uOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGhpcy5sYXN0U2VsZWN0ZWRUZXh0KSB7CiAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRUZXh0ID0gIiI7CiAgICAgICAgdGhpcy5kaXNwYXRjaFNlbGVjdGlvbkV2ZW50KGVsZW1lbnQ0LCB7CiAgICAgICAgICB0ZXh0OiAiIiwKICAgICAgICAgIGJsb2NrSWQ6IGJsb2NrLmlkLAogICAgICAgICAgaGFzU2VsZWN0aW9uOiBmYWxzZQogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIiwgY2hlY2tTZWxlY3Rpb24pOwogICAgdGhpcy5zZWxlY3Rpb25IYW5kbGVyID0gY2hlY2tTZWxlY3Rpb247CiAgICBjb25zdCB3eXNpd3lnQmxvY2sgPSBlbGVtZW50NC5jbG9zZXN0KCJkZWVzLXd5c2l3eWctYmxvY2siKTsKICAgIGlmICh3eXNpd3lnQmxvY2spIHsKICAgICAgY29uc3Qgb3JpZ2luYWxEaXNjb25uZWN0ZWRDYWxsYmFjayA9IHd5c2l3eWdCbG9jay5kaXNjb25uZWN0ZWRDYWxsYmFjazsKICAgICAgd3lzaXd5Z0Jsb2NrLmRpc2Nvbm5lY3RlZENhbGxiYWNrID0gYXN5bmMgZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uSGFuZGxlcikgewogICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIiwgdGhpcy5zZWxlY3Rpb25IYW5kbGVyKTsKICAgICAgICAgIHRoaXMuc2VsZWN0aW9uSGFuZGxlciA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChvcmlnaW5hbERpc2Nvbm5lY3RlZENhbGxiYWNrKSB7CiAgICAgICAgICBhd2FpdCBvcmlnaW5hbERpc2Nvbm5lY3RlZENhbGxiYWNrLmNhbGwod3lzaXd5Z0Jsb2NrKTsKICAgICAgICB9CiAgICAgIH0uYmluZCh0aGlzKTsKICAgIH0KICB9CiAgZGlzcGF0Y2hTZWxlY3Rpb25FdmVudChlbGVtZW50NCwgZGV0YWlsKSB7CiAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgiYmxvY2stdGV4dC1zZWxlY3RlZCIsIHsKICAgICAgZGV0YWlsLAogICAgICBidWJibGVzOiB0cnVlLAogICAgICBjb21wb3NlZDogdHJ1ZQogICAgfSk7CiAgICBlbGVtZW50NC5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICB9CiAgZ2V0U3R5bGVzKCkgewogICAgcmV0dXJuIGAKICAgICAgLyogUGFyYWdyYXBoIHNwZWNpZmljIHN0eWxlcyAqLwogICAgICAuYmxvY2sucGFyYWdyYXBoIHsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNjsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICB9CiAgICBgOwogIH0KICBnZXRQbGFjZWhvbGRlcigpIHsKICAgIHJldHVybiAiVHlwZSAnLycgZm9yIGNvbW1hbmRzLi4uIjsKICB9CiAgLyoqCiAgICogSGVscGVyIHRvIGdldCB0aGUgbGFzdCB0ZXh0IG5vZGUgaW4gYW4gZWxlbWVudAogICAqLwogIGdldExhc3RUZXh0Tm9kZShlbGVtZW50NCkgewogICAgaWYgKGVsZW1lbnQ0Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICByZXR1cm4gZWxlbWVudDQ7CiAgICB9CiAgICBmb3IgKGxldCBpMTEgPSBlbGVtZW50NC5jaGlsZE5vZGVzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgICBjb25zdCBsYXN0VGV4dCA9IHRoaXMuZ2V0TGFzdFRleHROb2RlKGVsZW1lbnQ0LmNoaWxkTm9kZXNbaTExXSk7CiAgICAgIGlmIChsYXN0VGV4dCkKICAgICAgICByZXR1cm4gbGFzdFRleHQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgLy8gSGVscGVyIG1ldGhvZHMgZm9yIHBhcmFncmFwaCBmdW5jdGlvbmFsaXR5CiAgZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQsIGNvbnRleHQyKSB7CiAgICBjb25zdCBwYXJhZ3JhcGhCbG9jayA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jay5wYXJhZ3JhcGgiKTsKICAgIGlmICghcGFyYWdyYXBoQmxvY2spIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCB3eXNpd3lnQmxvY2sgPSBjb250ZXh0Mj8uY29tcG9uZW50OwogICAgY29uc3QgcGFyZW50Q29tcG9uZW50ID0gd3lzaXd5Z0Jsb2NrPy5jbG9zZXN0KCJkZWVzLWlucHV0LXd5c2l3eWciKTsKICAgIGNvbnN0IHBhcmVudFNoYWRvd1Jvb3QgPSBwYXJlbnRDb21wb25lbnQ/LnNoYWRvd1Jvb3Q7CiAgICBjb25zdCBibG9ja1NoYWRvd1Jvb3QgPSBjb250ZXh0Mj8uc2hhZG93Um9vdDsKICAgIGNvbnN0IHNoYWRvd1Jvb3RzID0gW107CiAgICBpZiAocGFyZW50U2hhZG93Um9vdCkKICAgICAgc2hhZG93Um9vdHMucHVzaChwYXJlbnRTaGFkb3dSb290KTsKICAgIGlmIChibG9ja1NoYWRvd1Jvb3QpCiAgICAgIHNoYWRvd1Jvb3RzLnB1c2goYmxvY2tTaGFkb3dSb290KTsKICAgIGNvbnN0IHNlbGVjdGlvbkluZm8gPSBXeXNpd3lnU2VsZWN0aW9uLmdldFNlbGVjdGlvbkluZm8oLi4uc2hhZG93Um9vdHMpOwogICAgaWYgKCFzZWxlY3Rpb25JbmZvKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKCFXeXNpd3lnU2VsZWN0aW9uLmNvbnRhaW5zQWNyb3NzU2hhZG93RE9NKHBhcmFncmFwaEJsb2NrLCBzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHByZUNhcmV0UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgcHJlQ2FyZXRSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMocGFyYWdyYXBoQmxvY2spOwogICAgcHJlQ2FyZXRSYW5nZS5zZXRFbmQoc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lciwgc2VsZWN0aW9uSW5mby5zdGFydE9mZnNldCk7CiAgICBjb25zdCBwb3NpdGlvbjMgPSBwcmVDYXJldFJhbmdlLnRvU3RyaW5nKCkubGVuZ3RoOwogICAgcmV0dXJuIHBvc2l0aW9uMzsKICB9CiAgZ2V0Q29udGVudChlbGVtZW50NCwgY29udGV4dDIpIHsKICAgIGNvbnN0IHBhcmFncmFwaEJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLnBhcmFncmFwaCIpOwogICAgaWYgKCFwYXJhZ3JhcGhCbG9jaykKICAgICAgcmV0dXJuICIiOwogICAgY29uc3QgY29udGVudDMgPSBwYXJhZ3JhcGhCbG9jay5pbm5lckhUTUwgfHwgIiI7CiAgICByZXR1cm4gY29udGVudDM7CiAgfQogIHNldENvbnRlbnQoZWxlbWVudDQsIGNvbnRlbnQzLCBjb250ZXh0MikgewogICAgY29uc3QgcGFyYWdyYXBoQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2sucGFyYWdyYXBoIik7CiAgICBpZiAoIXBhcmFncmFwaEJsb2NrKQogICAgICByZXR1cm47CiAgICBjb25zdCBoYWRGb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHBhcmFncmFwaEJsb2NrIHx8IGVsZW1lbnQ0LnNoYWRvd1Jvb3Q/LmFjdGl2ZUVsZW1lbnQgPT09IHBhcmFncmFwaEJsb2NrOwogICAgcGFyYWdyYXBoQmxvY2suaW5uZXJIVE1MID0gY29udGVudDM7CiAgICBpZiAoaGFkRm9jdXMpIHsKICAgICAgcGFyYWdyYXBoQmxvY2suZm9jdXMoKTsKICAgIH0KICB9CiAgc2V0Q3Vyc29yVG9TdGFydChlbGVtZW50NCwgY29udGV4dDIpIHsKICAgIGNvbnN0IHBhcmFncmFwaEJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLnBhcmFncmFwaCIpOwogICAgaWYgKHBhcmFncmFwaEJsb2NrKSB7CiAgICAgIFd5c2l3eWdCbG9ja3Muc2V0Q3Vyc29yVG9TdGFydChwYXJhZ3JhcGhCbG9jayk7CiAgICB9CiAgfQogIHNldEN1cnNvclRvRW5kKGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgcGFyYWdyYXBoQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2sucGFyYWdyYXBoIik7CiAgICBpZiAocGFyYWdyYXBoQmxvY2spIHsKICAgICAgV3lzaXd5Z0Jsb2Nrcy5zZXRDdXJzb3JUb0VuZChwYXJhZ3JhcGhCbG9jayk7CiAgICB9CiAgfQogIGZvY3VzKGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgcGFyYWdyYXBoQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2sucGFyYWdyYXBoIik7CiAgICBpZiAoIXBhcmFncmFwaEJsb2NrKQogICAgICByZXR1cm47CiAgICBpZiAoIXBhcmFncmFwaEJsb2NrLmhhc0F0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIikpIHsKICAgICAgcGFyYWdyYXBoQmxvY2suc2V0QXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiLCAidHJ1ZSIpOwogICAgfQogICAgcGFyYWdyYXBoQmxvY2suZm9jdXMoKTsKICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSBwYXJhZ3JhcGhCbG9jayAmJiBlbGVtZW50NC5zaGFkb3dSb290Py5hY3RpdmVFbGVtZW50ICE9PSBwYXJhZ3JhcGhCbG9jaykgewogICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHsKICAgICAgICBwYXJhZ3JhcGhCbG9jay5mb2N1cygpOwogICAgICB9KTsKICAgIH0KICB9CiAgZm9jdXNXaXRoQ3Vyc29yKGVsZW1lbnQ0LCBwb3NpdGlvbjMgPSAiZW5kIiwgY29udGV4dDIpIHsKICAgIGNvbnN0IHBhcmFncmFwaEJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLnBhcmFncmFwaCIpOwogICAgaWYgKCFwYXJhZ3JhcGhCbG9jaykKICAgICAgcmV0dXJuOwogICAgaWYgKCFwYXJhZ3JhcGhCbG9jay5oYXNBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIpKSB7CiAgICAgIHBhcmFncmFwaEJsb2NrLnNldEF0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIiwgInRydWUiKTsKICAgIH0KICAgIGlmIChwb3NpdGlvbjMgPT09ICJlbmQiICYmIHBhcmFncmFwaEJsb2NrLnRleHRDb250ZW50ICYmIHBhcmFncmFwaEJsb2NrLnRleHRDb250ZW50Lmxlbmd0aCA+IDApIHsKICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICBpZiAoc2VsKSB7CiAgICAgICAgY29uc3QgcmFuZ2UyID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICBjb25zdCBsYXN0Tm9kZSA9IHRoaXMuZ2V0TGFzdFRleHROb2RlKHBhcmFncmFwaEJsb2NrKSB8fCBwYXJhZ3JhcGhCbG9jazsKICAgICAgICBpZiAobGFzdE5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7CiAgICAgICAgICByYW5nZTIuc2V0U3RhcnQobGFzdE5vZGUsIGxhc3ROb2RlLnRleHRDb250ZW50Py5sZW5ndGggfHwgMCk7CiAgICAgICAgICByYW5nZTIuc2V0RW5kKGxhc3ROb2RlLCBsYXN0Tm9kZS50ZXh0Q29udGVudD8ubGVuZ3RoIHx8IDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByYW5nZTIuc2VsZWN0Tm9kZUNvbnRlbnRzKGxhc3ROb2RlKTsKICAgICAgICAgIHJhbmdlMi5jb2xsYXBzZShmYWxzZSk7CiAgICAgICAgfQogICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UyKTsKICAgICAgfQogICAgfQogICAgcGFyYWdyYXBoQmxvY2suZm9jdXMoKTsKICAgIGNvbnN0IHNldEN1cnNvciA9ICgpID0+IHsKICAgICAgaWYgKHBvc2l0aW9uMyA9PT0gInN0YXJ0IikgewogICAgICAgIHRoaXMuc2V0Q3Vyc29yVG9TdGFydChlbGVtZW50NCwgY29udGV4dDIpOwogICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uMyA9PT0gImVuZCIgJiYgKCFwYXJhZ3JhcGhCbG9jay50ZXh0Q29udGVudCB8fCBwYXJhZ3JhcGhCbG9jay50ZXh0Q29udGVudC5sZW5ndGggPT09IDApKSB7CiAgICAgICAgdGhpcy5zZXRDdXJzb3JUb0VuZChlbGVtZW50NCwgY29udGV4dDIpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwb3NpdGlvbjMgPT09ICJudW1iZXIiKSB7CiAgICAgICAgV3lzaXd5Z1NlbGVjdGlvbi5zZXRDdXJzb3JQb3NpdGlvbihwYXJhZ3JhcGhCbG9jaywgcG9zaXRpb24zKTsKICAgICAgfQogICAgfTsKICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBwYXJhZ3JhcGhCbG9jayB8fCBlbGVtZW50NC5zaGFkb3dSb290Py5hY3RpdmVFbGVtZW50ID09PSBwYXJhZ3JhcGhCbG9jaykgewogICAgICBzZXRDdXJzb3IoKTsKICAgIH0gZWxzZSB7CiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gewogICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBwYXJhZ3JhcGhCbG9jayB8fCBlbGVtZW50NC5zaGFkb3dSb290Py5hY3RpdmVFbGVtZW50ID09PSBwYXJhZ3JhcGhCbG9jaykgewogICAgICAgICAgc2V0Q3Vyc29yKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gcGFyYWdyYXBoQmxvY2sgfHwgZWxlbWVudDQuc2hhZG93Um9vdD8uYWN0aXZlRWxlbWVudCA9PT0gcGFyYWdyYXBoQmxvY2spIHsKICAgICAgICAgICAgICBzZXRDdXJzb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgMTApOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfQogIGdldFNwbGl0Q29udGVudChlbGVtZW50NCwgY29udGV4dDIpIHsKICAgIGNvbnN0IHBhcmFncmFwaEJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLnBhcmFncmFwaCIpOwogICAgaWYgKCFwYXJhZ3JhcGhCbG9jaykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHd5c2l3eWdCbG9jayA9IGNvbnRleHQyPy5jb21wb25lbnQ7CiAgICBjb25zdCBwYXJlbnRDb21wb25lbnQgPSB3eXNpd3lnQmxvY2s/LmNsb3Nlc3QoImRlZXMtaW5wdXQtd3lzaXd5ZyIpOwogICAgY29uc3QgcGFyZW50U2hhZG93Um9vdCA9IHBhcmVudENvbXBvbmVudD8uc2hhZG93Um9vdDsKICAgIGNvbnN0IGJsb2NrU2hhZG93Um9vdCA9IGNvbnRleHQyPy5zaGFkb3dSb290OwogICAgY29uc3Qgc2hhZG93Um9vdHMgPSBbXTsKICAgIGlmIChwYXJlbnRTaGFkb3dSb290KQogICAgICBzaGFkb3dSb290cy5wdXNoKHBhcmVudFNoYWRvd1Jvb3QpOwogICAgaWYgKGJsb2NrU2hhZG93Um9vdCkKICAgICAgc2hhZG93Um9vdHMucHVzaChibG9ja1NoYWRvd1Jvb3QpOwogICAgY29uc3Qgc2VsZWN0aW9uSW5mbyA9IFd5c2l3eWdTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uSW5mbyguLi5zaGFkb3dSb290cyk7CiAgICBpZiAoIXNlbGVjdGlvbkluZm8pIHsKICAgICAgaWYgKHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gIT09IG51bGwpIHsKICAgICAgICBjb25zdCBmdWxsVGV4dCA9IHBhcmFncmFwaEJsb2NrLnRleHRDb250ZW50IHx8ICIiOwogICAgICAgIGNvbnN0IHBvcyA9IE1hdGgubWluKHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24sIGZ1bGxUZXh0Lmxlbmd0aCk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGJlZm9yZTogZnVsbFRleHQuc3Vic3RyaW5nKDAsIHBvcyksCiAgICAgICAgICBhZnRlcjogZnVsbFRleHQuc3Vic3RyaW5nKHBvcykKICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKCFXeXNpd3lnU2VsZWN0aW9uLmNvbnRhaW5zQWNyb3NzU2hhZG93RE9NKHBhcmFncmFwaEJsb2NrLCBzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyKSkgewogICAgICBpZiAodGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IGZ1bGxUZXh0ID0gcGFyYWdyYXBoQmxvY2sudGV4dENvbnRlbnQgfHwgIiI7CiAgICAgICAgY29uc3QgcG9zID0gTWF0aC5taW4odGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiwgZnVsbFRleHQubGVuZ3RoKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgYmVmb3JlOiBmdWxsVGV4dC5zdWJzdHJpbmcoMCwgcG9zKSwKICAgICAgICAgIGFmdGVyOiBmdWxsVGV4dC5zdWJzdHJpbmcocG9zKQogICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBjdXJzb3JQb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0LCBjb250ZXh0Mik7CiAgICBpZiAoY3Vyc29yUG9zID09PSBudWxsIHx8IGN1cnNvclBvcyA9PT0gMCkgewogICAgICByZXR1cm4gewogICAgICAgIGJlZm9yZTogIiIsCiAgICAgICAgYWZ0ZXI6IHBhcmFncmFwaEJsb2NrLmlubmVySFRNTAogICAgICB9OwogICAgfQogICAgY29uc3QgYmVmb3JlUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgY29uc3QgYWZ0ZXJSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICBiZWZvcmVSYW5nZS5zZXRTdGFydChwYXJhZ3JhcGhCbG9jaywgMCk7CiAgICBiZWZvcmVSYW5nZS5zZXRFbmQoc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lciwgc2VsZWN0aW9uSW5mby5zdGFydE9mZnNldCk7CiAgICBhZnRlclJhbmdlLnNldFN0YXJ0KHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIsIHNlbGVjdGlvbkluZm8uc3RhcnRPZmZzZXQpOwogICAgYWZ0ZXJSYW5nZS5zZXRFbmQocGFyYWdyYXBoQmxvY2ssIHBhcmFncmFwaEJsb2NrLmNoaWxkTm9kZXMubGVuZ3RoKTsKICAgIGNvbnN0IGJlZm9yZUZyYWdtZW50ID0gYmVmb3JlUmFuZ2UuY2xvbmVDb250ZW50cygpOwogICAgY29uc3QgYWZ0ZXJGcmFnbWVudCA9IGFmdGVyUmFuZ2UuY2xvbmVDb250ZW50cygpOwogICAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgdGVtcERpdi5hcHBlbmRDaGlsZChiZWZvcmVGcmFnbWVudCk7CiAgICBjb25zdCBiZWZvcmVIdG1sID0gdGVtcERpdi5pbm5lckhUTUw7CiAgICB0ZW1wRGl2LmlubmVySFRNTCA9ICIiOwogICAgdGVtcERpdi5hcHBlbmRDaGlsZChhZnRlckZyYWdtZW50KTsKICAgIGNvbnN0IGFmdGVySHRtbCA9IHRlbXBEaXYuaW5uZXJIVE1MOwogICAgcmV0dXJuIHsKICAgICAgYmVmb3JlOiBiZWZvcmVIdG1sLAogICAgICBhZnRlcjogYWZ0ZXJIdG1sCiAgICB9OwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvYmxvY2tzL3RleHQvaGVhZGluZy5ibG9jay5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgSGVhZGluZ0Jsb2NrSGFuZGxlciA9IGNsYXNzIGV4dGVuZHMgQmFzZUJsb2NrSGFuZGxlciB7CiAgdHlwZTsKICBsZXZlbDsKICAvLyBUcmFjayBjdXJzb3IgcG9zaXRpb24KICBsYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IDA7CiAgbGFzdFNlbGVjdGVkVGV4dCA9ICIiOwogIHNlbGVjdGlvbkhhbmRsZXIgPSBudWxsOwogIGNvbnN0cnVjdG9yKHR5cGU1KSB7CiAgICBzdXBlcigpOwogICAgdGhpcy50eXBlID0gdHlwZTU7CiAgICB0aGlzLmxldmVsID0gcGFyc2VJbnQodHlwZTUuc3BsaXQoIi0iKVsxXSk7CiAgfQogIHJlbmRlcihibG9jaywgaXNTZWxlY3RlZCkgewogICAgY29uc3Qgc2VsZWN0ZWRDbGFzcyA9IGlzU2VsZWN0ZWQgPyAiIHNlbGVjdGVkIiA6ICIiOwogICAgY29uc3QgcGxhY2Vob2xkZXIgPSB0aGlzLmdldFBsYWNlaG9sZGVyKCk7CiAgICByZXR1cm4gYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9ImJsb2NrIGhlYWRpbmctJHt0aGlzLmxldmVsfSR7c2VsZWN0ZWRDbGFzc30iCiAgICAgICAgY29udGVudGVkaXRhYmxlPSJ0cnVlIgogICAgICAgIGRhdGEtcGxhY2Vob2xkZXI9IiR7cGxhY2Vob2xkZXJ9IgogICAgICAgIGRhdGEtYmxvY2staWQ9IiR7YmxvY2suaWR9IgogICAgICAgIGRhdGEtYmxvY2stdHlwZT0iJHtibG9jay50eXBlfSIKICAgICAgPjwvZGl2PgogICAgYDsKICB9CiAgc2V0dXAoZWxlbWVudDQsIGJsb2NrLCBoYW5kbGVyczIpIHsKICAgIGNvbnN0IGhlYWRpbmdCbG9jayA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoYC5ibG9jay5oZWFkaW5nLSR7dGhpcy5sZXZlbH1gKTsKICAgIGlmICghaGVhZGluZ0Jsb2NrKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkhlYWRpbmdCbG9ja0hhbmRsZXIuc2V0dXA6IE5vIGhlYWRpbmcgYmxvY2sgZWxlbWVudCBmb3VuZCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoYmxvY2suY29udGVudCAmJiAhaGVhZGluZ0Jsb2NrLmlubmVySFRNTCkgewogICAgICBoZWFkaW5nQmxvY2suaW5uZXJIVE1MID0gYmxvY2suY29udGVudDsKICAgIH0KICAgIGhlYWRpbmdCbG9jay5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIChlMTEpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uSW5wdXQoZTExKTsKICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCk7CiAgICAgIGlmIChwb3MgIT09IG51bGwpIHsKICAgICAgICB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gcG9zOwogICAgICB9CiAgICB9KTsKICAgIGhlYWRpbmdCbG9jay5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgKGUxMSkgPT4gewogICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KTsKICAgICAgaWYgKHBvcyAhPT0gbnVsbCkgewogICAgICAgIHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gPSBwb3M7CiAgICAgIH0KICAgICAgaGFuZGxlcnMyLm9uS2V5RG93bihlMTEpOwogICAgfSk7CiAgICBoZWFkaW5nQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLCAoKSA9PiB7CiAgICAgIGhhbmRsZXJzMi5vbkZvY3VzKCk7CiAgICB9KTsKICAgIGhlYWRpbmdCbG9jay5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgKCkgPT4gewogICAgICBoYW5kbGVyczIub25CbHVyKCk7CiAgICB9KTsKICAgIGhlYWRpbmdCbG9jay5hZGRFdmVudExpc3RlbmVyKCJjb21wb3NpdGlvbnN0YXJ0IiwgKCkgPT4gewogICAgICBoYW5kbGVyczIub25Db21wb3NpdGlvblN0YXJ0KCk7CiAgICB9KTsKICAgIGhlYWRpbmdCbG9jay5hZGRFdmVudExpc3RlbmVyKCJjb21wb3NpdGlvbmVuZCIsICgpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uQ29tcG9zaXRpb25FbmQoKTsKICAgIH0pOwogICAgaGVhZGluZ0Jsb2NrLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCAoZTExKSA9PiB7CiAgICAgIGNvbnN0IHBvcyA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQpOwogICAgICBpZiAocG9zICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IHBvczsKICAgICAgfQogICAgICBoYW5kbGVyczIub25Nb3VzZVVwPy4oZTExKTsKICAgIH0pOwogICAgaGVhZGluZ0Jsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUxMSkgPT4gewogICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KTsKICAgICAgICBpZiAocG9zICE9PSBudWxsKSB7CiAgICAgICAgICB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gcG9zOwogICAgICAgIH0KICAgICAgfSwgMCk7CiAgICB9KTsKICAgIGhlYWRpbmdCbG9jay5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsIChlMTEpID0+IHsKICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCk7CiAgICAgIGlmIChwb3MgIT09IG51bGwpIHsKICAgICAgICB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gcG9zOwogICAgICB9CiAgICB9KTsKICAgIHRoaXMuc2V0dXBTZWxlY3Rpb25IYW5kbGVyKGVsZW1lbnQ0LCBoZWFkaW5nQmxvY2ssIGJsb2NrKTsKICB9CiAgc2V0dXBTZWxlY3Rpb25IYW5kbGVyKGVsZW1lbnQ0LCBoZWFkaW5nQmxvY2ssIGJsb2NrKSB7CiAgICBjb25zdCBjaGVja1NlbGVjdGlvbiA9ICgpID0+IHsKICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvbi50b1N0cmluZygpOwogICAgICBpZiAoc2VsZWN0ZWRUZXh0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgIGlmICh0aGlzLmxhc3RTZWxlY3RlZFRleHQpIHsKICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkVGV4dCA9ICIiOwogICAgICAgICAgdGhpcy5kaXNwYXRjaFNlbGVjdGlvbkV2ZW50KGVsZW1lbnQ0LCB7CiAgICAgICAgICAgIHRleHQ6ICIiLAogICAgICAgICAgICBibG9ja0lkOiBibG9jay5pZCwKICAgICAgICAgICAgaGFzU2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCB3eXNpd3lnQmxvY2syID0gaGVhZGluZ0Jsb2NrLmdldFJvb3ROb2RlKCkuaG9zdDsKICAgICAgY29uc3QgcGFyZW50Q29tcG9uZW50ID0gd3lzaXd5Z0Jsb2NrMj8uY2xvc2VzdCgiZGVlcy1pbnB1dC13eXNpd3lnIik7CiAgICAgIGNvbnN0IHBhcmVudFNoYWRvd1Jvb3QgPSBwYXJlbnRDb21wb25lbnQ/LnNoYWRvd1Jvb3Q7CiAgICAgIGNvbnN0IGJsb2NrU2hhZG93Um9vdCA9IHd5c2l3eWdCbG9jazI/LnNoYWRvd1Jvb3Q7CiAgICAgIGNvbnN0IHNoYWRvd1Jvb3RzID0gW107CiAgICAgIGlmIChwYXJlbnRTaGFkb3dSb290KQogICAgICAgIHNoYWRvd1Jvb3RzLnB1c2gocGFyZW50U2hhZG93Um9vdCk7CiAgICAgIGlmIChibG9ja1NoYWRvd1Jvb3QpCiAgICAgICAgc2hhZG93Um9vdHMucHVzaChibG9ja1NoYWRvd1Jvb3QpOwogICAgICBjb25zdCBzZWxlY3Rpb25JbmZvID0gV3lzaXd5Z1NlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvKC4uLnNoYWRvd1Jvb3RzKTsKICAgICAgaWYgKCFzZWxlY3Rpb25JbmZvKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3Qgc3RhcnRJbkJsb2NrID0gV3lzaXd5Z1NlbGVjdGlvbi5jb250YWluc0Fjcm9zc1NoYWRvd0RPTShoZWFkaW5nQmxvY2ssIHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIpOwogICAgICBjb25zdCBlbmRJbkJsb2NrID0gV3lzaXd5Z1NlbGVjdGlvbi5jb250YWluc0Fjcm9zc1NoYWRvd0RPTShoZWFkaW5nQmxvY2ssIHNlbGVjdGlvbkluZm8uZW5kQ29udGFpbmVyKTsKICAgICAgaWYgKHN0YXJ0SW5CbG9jayB8fCBlbmRJbkJsb2NrKSB7CiAgICAgICAgaWYgKHNlbGVjdGVkVGV4dCAhPT0gdGhpcy5sYXN0U2VsZWN0ZWRUZXh0KSB7CiAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZFRleHQgPSBzZWxlY3RlZFRleHQ7CiAgICAgICAgICBjb25zdCByYW5nZTIgPSBXeXNpd3lnU2VsZWN0aW9uLmNyZWF0ZVJhbmdlRnJvbUluZm8oc2VsZWN0aW9uSW5mbyk7CiAgICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgdGhpcy5kaXNwYXRjaFNlbGVjdGlvbkV2ZW50KGVsZW1lbnQ0LCB7CiAgICAgICAgICAgIHRleHQ6IHNlbGVjdGVkVGV4dC50cmltKCksCiAgICAgICAgICAgIGJsb2NrSWQ6IGJsb2NrLmlkLAogICAgICAgICAgICByYW5nZTogcmFuZ2UyLAogICAgICAgICAgICByZWN0LAogICAgICAgICAgICBoYXNTZWxlY3Rpb246IHRydWUKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0aGlzLmxhc3RTZWxlY3RlZFRleHQpIHsKICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZFRleHQgPSAiIjsKICAgICAgICB0aGlzLmRpc3BhdGNoU2VsZWN0aW9uRXZlbnQoZWxlbWVudDQsIHsKICAgICAgICAgIHRleHQ6ICIiLAogICAgICAgICAgYmxvY2tJZDogYmxvY2suaWQsCiAgICAgICAgICBoYXNTZWxlY3Rpb246IGZhbHNlCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3Rpb25jaGFuZ2UiLCBjaGVja1NlbGVjdGlvbik7CiAgICB0aGlzLnNlbGVjdGlvbkhhbmRsZXIgPSBjaGVja1NlbGVjdGlvbjsKICAgIGNvbnN0IHd5c2l3eWdCbG9jayA9IGhlYWRpbmdCbG9jay5nZXRSb290Tm9kZSgpLmhvc3Q7CiAgICBpZiAod3lzaXd5Z0Jsb2NrKSB7CiAgICAgIGNvbnN0IG9yaWdpbmFsRGlzY29ubmVjdGVkQ2FsbGJhY2sgPSB3eXNpd3lnQmxvY2suZGlzY29ubmVjdGVkQ2FsbGJhY2s7CiAgICAgIHd5c2l3eWdCbG9jay5kaXNjb25uZWN0ZWRDYWxsYmFjayA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbkhhbmRsZXIpIHsKICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIsIHRoaXMuc2VsZWN0aW9uSGFuZGxlcik7CiAgICAgICAgICB0aGlzLnNlbGVjdGlvbkhhbmRsZXIgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAob3JpZ2luYWxEaXNjb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgYXdhaXQgb3JpZ2luYWxEaXNjb25uZWN0ZWRDYWxsYmFjay5jYWxsKHd5c2l3eWdCbG9jayk7CiAgICAgICAgfQogICAgICB9LmJpbmQodGhpcyk7CiAgICB9CiAgfQogIGRpc3BhdGNoU2VsZWN0aW9uRXZlbnQoZWxlbWVudDQsIGRldGFpbCkgewogICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoImJsb2NrLXRleHQtc2VsZWN0ZWQiLCB7CiAgICAgIGRldGFpbCwKICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgY29tcG9zZWQ6IHRydWUKICAgIH0pOwogICAgZWxlbWVudDQuZGlzcGF0Y2hFdmVudChldmVudCk7CiAgfQogIGdldFN0eWxlcygpIHsKICAgIHJldHVybiBgCiAgICAgIC5ibG9jay5oZWFkaW5nLTEgewogICAgICAgIGZvbnQtc2l6ZTogMzJweDsKICAgICAgICBmb250LXdlaWdodDogNzAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICAgICAgbWFyZ2luOiAyNHB4IDAgOHB4IDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwIiwgIiNmZmZmZmYiKX07CiAgICAgIH0KCiAgICAgIC5ibG9jay5oZWFkaW5nLTIgewogICAgICAgIGZvbnQtc2l6ZTogMjRweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjM7CiAgICAgICAgbWFyZ2luOiAyMHB4IDAgNnB4IDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwIiwgIiNmZmZmZmYiKX07CiAgICAgIH0KCiAgICAgIC5ibG9jay5oZWFkaW5nLTMgewogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICAgICAgbWFyZ2luOiAxNnB4IDAgNHB4IDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwIiwgIiNmZmZmZmYiKX07CiAgICAgIH0KICAgIGA7CiAgfQogIGdldFBsYWNlaG9sZGVyKCkgewogICAgc3dpdGNoICh0aGlzLmxldmVsKSB7CiAgICAgIGNhc2UgMToKICAgICAgICByZXR1cm4gIkhlYWRpbmcgMSI7CiAgICAgIGNhc2UgMjoKICAgICAgICByZXR1cm4gIkhlYWRpbmcgMiI7CiAgICAgIGNhc2UgMzoKICAgICAgICByZXR1cm4gIkhlYWRpbmcgMyI7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuICJIZWFkaW5nIjsKICAgIH0KICB9CiAgLyoqCiAgICogSGVscGVyIHRvIGdldCB0aGUgbGFzdCB0ZXh0IG5vZGUgaW4gYW4gZWxlbWVudAogICAqLwogIGdldExhc3RUZXh0Tm9kZShlbGVtZW50NCkgewogICAgaWYgKGVsZW1lbnQ0Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICByZXR1cm4gZWxlbWVudDQ7CiAgICB9CiAgICBmb3IgKGxldCBpMTEgPSBlbGVtZW50NC5jaGlsZE5vZGVzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgICBjb25zdCBsYXN0VGV4dCA9IHRoaXMuZ2V0TGFzdFRleHROb2RlKGVsZW1lbnQ0LmNoaWxkTm9kZXNbaTExXSk7CiAgICAgIGlmIChsYXN0VGV4dCkKICAgICAgICByZXR1cm4gbGFzdFRleHQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgLy8gSGVscGVyIG1ldGhvZHMgZm9yIGhlYWRpbmcgZnVuY3Rpb25hbGl0eSAobW9zdGx5IHRoZSBzYW1lIGFzIHBhcmFncmFwaCkKICBnZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCwgY29udGV4dDIpIHsKICAgIGNvbnN0IGhlYWRpbmdCbG9jayA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoYC5ibG9jay5oZWFkaW5nLSR7dGhpcy5sZXZlbH1gKTsKICAgIGlmICghaGVhZGluZ0Jsb2NrKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3Qgd3lzaXd5Z0Jsb2NrID0gY29udGV4dDI/LmNvbXBvbmVudDsKICAgIGNvbnN0IHBhcmVudENvbXBvbmVudCA9IHd5c2l3eWdCbG9jaz8uY2xvc2VzdCgiZGVlcy1pbnB1dC13eXNpd3lnIik7CiAgICBjb25zdCBwYXJlbnRTaGFkb3dSb290ID0gcGFyZW50Q29tcG9uZW50Py5zaGFkb3dSb290OwogICAgY29uc3QgYmxvY2tTaGFkb3dSb290ID0gY29udGV4dDI/LnNoYWRvd1Jvb3Q7CiAgICBjb25zdCBzaGFkb3dSb290cyA9IFtdOwogICAgaWYgKHBhcmVudFNoYWRvd1Jvb3QpCiAgICAgIHNoYWRvd1Jvb3RzLnB1c2gocGFyZW50U2hhZG93Um9vdCk7CiAgICBpZiAoYmxvY2tTaGFkb3dSb290KQogICAgICBzaGFkb3dSb290cy5wdXNoKGJsb2NrU2hhZG93Um9vdCk7CiAgICBjb25zdCBzZWxlY3Rpb25JbmZvID0gV3lzaXd5Z1NlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvKC4uLnNoYWRvd1Jvb3RzKTsKICAgIGlmICghc2VsZWN0aW9uSW5mbykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmICghV3lzaXd5Z1NlbGVjdGlvbi5jb250YWluc0Fjcm9zc1NoYWRvd0RPTShoZWFkaW5nQmxvY2ssIHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgcHJlQ2FyZXRSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICBwcmVDYXJldFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhoZWFkaW5nQmxvY2spOwogICAgcHJlQ2FyZXRSYW5nZS5zZXRFbmQoc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lciwgc2VsZWN0aW9uSW5mby5zdGFydE9mZnNldCk7CiAgICBjb25zdCBwb3NpdGlvbjMgPSBwcmVDYXJldFJhbmdlLnRvU3RyaW5nKCkubGVuZ3RoOwogICAgcmV0dXJuIHBvc2l0aW9uMzsKICB9CiAgZ2V0Q29udGVudChlbGVtZW50NCwgY29udGV4dDIpIHsKICAgIGNvbnN0IGhlYWRpbmdCbG9jayA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoYC5ibG9jay5oZWFkaW5nLSR7dGhpcy5sZXZlbH1gKTsKICAgIGlmICghaGVhZGluZ0Jsb2NrKQogICAgICByZXR1cm4gIiI7CiAgICBjb25zdCBjb250ZW50MyA9IGhlYWRpbmdCbG9jay5pbm5lckhUTUwgfHwgIiI7CiAgICByZXR1cm4gY29udGVudDM7CiAgfQogIHNldENvbnRlbnQoZWxlbWVudDQsIGNvbnRlbnQzLCBjb250ZXh0MikgewogICAgY29uc3QgaGVhZGluZ0Jsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcihgLmJsb2NrLmhlYWRpbmctJHt0aGlzLmxldmVsfWApOwogICAgaWYgKCFoZWFkaW5nQmxvY2spCiAgICAgIHJldHVybjsKICAgIGNvbnN0IGhhZEZvY3VzID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gaGVhZGluZ0Jsb2NrIHx8IGVsZW1lbnQ0LnNoYWRvd1Jvb3Q/LmFjdGl2ZUVsZW1lbnQgPT09IGhlYWRpbmdCbG9jazsKICAgIGhlYWRpbmdCbG9jay5pbm5lckhUTUwgPSBjb250ZW50MzsKICAgIGlmIChoYWRGb2N1cykgewogICAgICBoZWFkaW5nQmxvY2suZm9jdXMoKTsKICAgIH0KICB9CiAgc2V0Q3Vyc29yVG9TdGFydChlbGVtZW50NCwgY29udGV4dDIpIHsKICAgIGNvbnN0IGhlYWRpbmdCbG9jayA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoYC5ibG9jay5oZWFkaW5nLSR7dGhpcy5sZXZlbH1gKTsKICAgIGlmIChoZWFkaW5nQmxvY2spIHsKICAgICAgV3lzaXd5Z0Jsb2Nrcy5zZXRDdXJzb3JUb1N0YXJ0KGhlYWRpbmdCbG9jayk7CiAgICB9CiAgfQogIHNldEN1cnNvclRvRW5kKGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgaGVhZGluZ0Jsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcihgLmJsb2NrLmhlYWRpbmctJHt0aGlzLmxldmVsfWApOwogICAgaWYgKGhlYWRpbmdCbG9jaykgewogICAgICBXeXNpd3lnQmxvY2tzLnNldEN1cnNvclRvRW5kKGhlYWRpbmdCbG9jayk7CiAgICB9CiAgfQogIGZvY3VzKGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgaGVhZGluZ0Jsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcihgLmJsb2NrLmhlYWRpbmctJHt0aGlzLmxldmVsfWApOwogICAgaWYgKCFoZWFkaW5nQmxvY2spCiAgICAgIHJldHVybjsKICAgIGlmICghaGVhZGluZ0Jsb2NrLmhhc0F0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIikpIHsKICAgICAgaGVhZGluZ0Jsb2NrLnNldEF0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIiwgInRydWUiKTsKICAgIH0KICAgIGhlYWRpbmdCbG9jay5mb2N1cygpOwogICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGhlYWRpbmdCbG9jayAmJiBlbGVtZW50NC5zaGFkb3dSb290Py5hY3RpdmVFbGVtZW50ICE9PSBoZWFkaW5nQmxvY2spIHsKICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7CiAgICAgICAgaGVhZGluZ0Jsb2NrLmZvY3VzKCk7CiAgICAgIH0pOwogICAgfQogIH0KICBmb2N1c1dpdGhDdXJzb3IoZWxlbWVudDQsIHBvc2l0aW9uMyA9ICJlbmQiLCBjb250ZXh0MikgewogICAgY29uc3QgaGVhZGluZ0Jsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcihgLmJsb2NrLmhlYWRpbmctJHt0aGlzLmxldmVsfWApOwogICAgaWYgKCFoZWFkaW5nQmxvY2spCiAgICAgIHJldHVybjsKICAgIGlmICghaGVhZGluZ0Jsb2NrLmhhc0F0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIikpIHsKICAgICAgaGVhZGluZ0Jsb2NrLnNldEF0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIiwgInRydWUiKTsKICAgIH0KICAgIGlmIChwb3NpdGlvbjMgPT09ICJlbmQiICYmIGhlYWRpbmdCbG9jay50ZXh0Q29udGVudCAmJiBoZWFkaW5nQmxvY2sudGV4dENvbnRlbnQubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgIGlmIChzZWwpIHsKICAgICAgICBjb25zdCByYW5nZTIgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICAgIGNvbnN0IGxhc3ROb2RlID0gdGhpcy5nZXRMYXN0VGV4dE5vZGUoaGVhZGluZ0Jsb2NrKSB8fCBoZWFkaW5nQmxvY2s7CiAgICAgICAgaWYgKGxhc3ROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgcmFuZ2UyLnNldFN0YXJ0KGxhc3ROb2RlLCBsYXN0Tm9kZS50ZXh0Q29udGVudD8ubGVuZ3RoIHx8IDApOwogICAgICAgICAgcmFuZ2UyLnNldEVuZChsYXN0Tm9kZSwgbGFzdE5vZGUudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmFuZ2UyLnNlbGVjdE5vZGVDb250ZW50cyhsYXN0Tm9kZSk7CiAgICAgICAgICByYW5nZTIuY29sbGFwc2UoZmFsc2UpOwogICAgICAgIH0KICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlMik7CiAgICAgIH0KICAgIH0KICAgIGhlYWRpbmdCbG9jay5mb2N1cygpOwogICAgY29uc3Qgc2V0Q3Vyc29yID0gKCkgPT4gewogICAgICBpZiAocG9zaXRpb24zID09PSAic3RhcnQiKSB7CiAgICAgICAgdGhpcy5zZXRDdXJzb3JUb1N0YXJ0KGVsZW1lbnQ0LCBjb250ZXh0Mik7CiAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24zID09PSAiZW5kIiAmJiAoIWhlYWRpbmdCbG9jay50ZXh0Q29udGVudCB8fCBoZWFkaW5nQmxvY2sudGV4dENvbnRlbnQubGVuZ3RoID09PSAwKSkgewogICAgICAgIHRoaXMuc2V0Q3Vyc29yVG9FbmQoZWxlbWVudDQsIGNvbnRleHQyKTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcG9zaXRpb24zID09PSAibnVtYmVyIikgewogICAgICAgIFd5c2l3eWdTZWxlY3Rpb24uc2V0Q3Vyc29yUG9zaXRpb24oaGVhZGluZ0Jsb2NrLCBwb3NpdGlvbjMpOwogICAgICB9CiAgICB9OwogICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGhlYWRpbmdCbG9jayB8fCBlbGVtZW50NC5zaGFkb3dSb290Py5hY3RpdmVFbGVtZW50ID09PSBoZWFkaW5nQmxvY2spIHsKICAgICAgc2V0Q3Vyc29yKCk7CiAgICB9IGVsc2UgewogICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gaGVhZGluZ0Jsb2NrIHx8IGVsZW1lbnQ0LnNoYWRvd1Jvb3Q/LmFjdGl2ZUVsZW1lbnQgPT09IGhlYWRpbmdCbG9jaykgewogICAgICAgICAgc2V0Q3Vyc29yKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gaGVhZGluZ0Jsb2NrIHx8IGVsZW1lbnQ0LnNoYWRvd1Jvb3Q/LmFjdGl2ZUVsZW1lbnQgPT09IGhlYWRpbmdCbG9jaykgewogICAgICAgICAgICAgIHNldEN1cnNvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCAxMCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9CiAgZ2V0U3BsaXRDb250ZW50KGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgaGVhZGluZ0Jsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcihgLmJsb2NrLmhlYWRpbmctJHt0aGlzLmxldmVsfWApOwogICAgaWYgKCFoZWFkaW5nQmxvY2spIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCB3eXNpd3lnQmxvY2sgPSBjb250ZXh0Mj8uY29tcG9uZW50OwogICAgY29uc3QgcGFyZW50Q29tcG9uZW50ID0gd3lzaXd5Z0Jsb2NrPy5jbG9zZXN0KCJkZWVzLWlucHV0LXd5c2l3eWciKTsKICAgIGNvbnN0IHBhcmVudFNoYWRvd1Jvb3QgPSBwYXJlbnRDb21wb25lbnQ/LnNoYWRvd1Jvb3Q7CiAgICBjb25zdCBibG9ja1NoYWRvd1Jvb3QgPSBjb250ZXh0Mj8uc2hhZG93Um9vdDsKICAgIGNvbnN0IHNoYWRvd1Jvb3RzID0gW107CiAgICBpZiAocGFyZW50U2hhZG93Um9vdCkKICAgICAgc2hhZG93Um9vdHMucHVzaChwYXJlbnRTaGFkb3dSb290KTsKICAgIGlmIChibG9ja1NoYWRvd1Jvb3QpCiAgICAgIHNoYWRvd1Jvb3RzLnB1c2goYmxvY2tTaGFkb3dSb290KTsKICAgIGNvbnN0IHNlbGVjdGlvbkluZm8gPSBXeXNpd3lnU2VsZWN0aW9uLmdldFNlbGVjdGlvbkluZm8oLi4uc2hhZG93Um9vdHMpOwogICAgaWYgKCFzZWxlY3Rpb25JbmZvKSB7CiAgICAgIGlmICh0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uICE9PSBudWxsKSB7CiAgICAgICAgY29uc3QgZnVsbFRleHQgPSBoZWFkaW5nQmxvY2sudGV4dENvbnRlbnQgfHwgIiI7CiAgICAgICAgY29uc3QgcG9zID0gTWF0aC5taW4odGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiwgZnVsbFRleHQubGVuZ3RoKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgYmVmb3JlOiBmdWxsVGV4dC5zdWJzdHJpbmcoMCwgcG9zKSwKICAgICAgICAgIGFmdGVyOiBmdWxsVGV4dC5zdWJzdHJpbmcocG9zKQogICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoIVd5c2l3eWdTZWxlY3Rpb24uY29udGFpbnNBY3Jvc3NTaGFkb3dET00oaGVhZGluZ0Jsb2NrLCBzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyKSkgewogICAgICBpZiAodGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IGZ1bGxUZXh0ID0gaGVhZGluZ0Jsb2NrLnRleHRDb250ZW50IHx8ICIiOwogICAgICAgIGNvbnN0IHBvcyA9IE1hdGgubWluKHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24sIGZ1bGxUZXh0Lmxlbmd0aCk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGJlZm9yZTogZnVsbFRleHQuc3Vic3RyaW5nKDAsIHBvcyksCiAgICAgICAgICBhZnRlcjogZnVsbFRleHQuc3Vic3RyaW5nKHBvcykKICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgY3Vyc29yUG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCwgY29udGV4dDIpOwogICAgaWYgKGN1cnNvclBvcyA9PT0gbnVsbCB8fCBjdXJzb3JQb3MgPT09IDApIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBiZWZvcmU6ICIiLAogICAgICAgIGFmdGVyOiBoZWFkaW5nQmxvY2suaW5uZXJIVE1MCiAgICAgIH07CiAgICB9CiAgICBjb25zdCBiZWZvcmVSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICBjb25zdCBhZnRlclJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgIGJlZm9yZVJhbmdlLnNldFN0YXJ0KGhlYWRpbmdCbG9jaywgMCk7CiAgICBiZWZvcmVSYW5nZS5zZXRFbmQoc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lciwgc2VsZWN0aW9uSW5mby5zdGFydE9mZnNldCk7CiAgICBhZnRlclJhbmdlLnNldFN0YXJ0KHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIsIHNlbGVjdGlvbkluZm8uc3RhcnRPZmZzZXQpOwogICAgYWZ0ZXJSYW5nZS5zZXRFbmQoaGVhZGluZ0Jsb2NrLCBoZWFkaW5nQmxvY2suY2hpbGROb2Rlcy5sZW5ndGgpOwogICAgY29uc3QgYmVmb3JlRnJhZ21lbnQgPSBiZWZvcmVSYW5nZS5jbG9uZUNvbnRlbnRzKCk7CiAgICBjb25zdCBhZnRlckZyYWdtZW50ID0gYWZ0ZXJSYW5nZS5jbG9uZUNvbnRlbnRzKCk7CiAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICB0ZW1wRGl2LmFwcGVuZENoaWxkKGJlZm9yZUZyYWdtZW50KTsKICAgIGNvbnN0IGJlZm9yZUh0bWwgPSB0ZW1wRGl2LmlubmVySFRNTDsKICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gIiI7CiAgICB0ZW1wRGl2LmFwcGVuZENoaWxkKGFmdGVyRnJhZ21lbnQpOwogICAgY29uc3QgYWZ0ZXJIdG1sID0gdGVtcERpdi5pbm5lckhUTUw7CiAgICByZXR1cm4gewogICAgICBiZWZvcmU6IGJlZm9yZUh0bWwsCiAgICAgIGFmdGVyOiBhZnRlckh0bWwKICAgIH07CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy9ibG9ja3MvdGV4dC9xdW90ZS5ibG9jay5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgUXVvdGVCbG9ja0hhbmRsZXIgPSBjbGFzcyBleHRlbmRzIEJhc2VCbG9ja0hhbmRsZXIgewogIHR5cGUgPSAicXVvdGUiOwogIC8vIFRyYWNrIGN1cnNvciBwb3NpdGlvbgogIGxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gMDsKICBsYXN0U2VsZWN0ZWRUZXh0ID0gIiI7CiAgc2VsZWN0aW9uSGFuZGxlciA9IG51bGw7CiAgcmVuZGVyKGJsb2NrLCBpc1NlbGVjdGVkKSB7CiAgICBjb25zdCBzZWxlY3RlZENsYXNzID0gaXNTZWxlY3RlZCA/ICIgc2VsZWN0ZWQiIDogIiI7CiAgICBjb25zdCBwbGFjZWhvbGRlciA9IHRoaXMuZ2V0UGxhY2Vob2xkZXIoKTsKICAgIHJldHVybiBgCiAgICAgIDxkaXYKICAgICAgICBjbGFzcz0iYmxvY2sgcXVvdGUke3NlbGVjdGVkQ2xhc3N9IgogICAgICAgIGNvbnRlbnRlZGl0YWJsZT0idHJ1ZSIKICAgICAgICBkYXRhLXBsYWNlaG9sZGVyPSIke3BsYWNlaG9sZGVyfSIKICAgICAgICBkYXRhLWJsb2NrLWlkPSIke2Jsb2NrLmlkfSIKICAgICAgICBkYXRhLWJsb2NrLXR5cGU9IiR7YmxvY2sudHlwZX0iCiAgICAgID48L2Rpdj4KICAgIGA7CiAgfQogIHNldHVwKGVsZW1lbnQ0LCBibG9jaywgaGFuZGxlcnMyKSB7CiAgICBjb25zdCBxdW90ZUJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLnF1b3RlIik7CiAgICBpZiAoIXF1b3RlQmxvY2spIHsKICAgICAgY29uc29sZS5lcnJvcigiUXVvdGVCbG9ja0hhbmRsZXIuc2V0dXA6IE5vIHF1b3RlIGJsb2NrIGVsZW1lbnQgZm91bmQiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGJsb2NrLmNvbnRlbnQgJiYgIXF1b3RlQmxvY2suaW5uZXJIVE1MKSB7CiAgICAgIHF1b3RlQmxvY2suaW5uZXJIVE1MID0gYmxvY2suY29udGVudDsKICAgIH0KICAgIHF1b3RlQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCAoZTExKSA9PiB7CiAgICAgIGhhbmRsZXJzMi5vbklucHV0KGUxMSk7CiAgICAgIGNvbnN0IHBvcyA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQpOwogICAgICBpZiAocG9zICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IHBvczsKICAgICAgfQogICAgfSk7CiAgICBxdW90ZUJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCAoZTExKSA9PiB7CiAgICAgIGNvbnN0IHBvcyA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQpOwogICAgICBpZiAocG9zICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IHBvczsKICAgICAgfQogICAgICBoYW5kbGVyczIub25LZXlEb3duKGUxMSk7CiAgICB9KTsKICAgIHF1b3RlQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLCAoKSA9PiB7CiAgICAgIGhhbmRsZXJzMi5vbkZvY3VzKCk7CiAgICB9KTsKICAgIHF1b3RlQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uQmx1cigpOwogICAgfSk7CiAgICBxdW90ZUJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBvc2l0aW9uc3RhcnQiLCAoKSA9PiB7CiAgICAgIGhhbmRsZXJzMi5vbkNvbXBvc2l0aW9uU3RhcnQoKTsKICAgIH0pOwogICAgcXVvdGVCbG9jay5hZGRFdmVudExpc3RlbmVyKCJjb21wb3NpdGlvbmVuZCIsICgpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uQ29tcG9zaXRpb25FbmQoKTsKICAgIH0pOwogICAgcXVvdGVCbG9jay5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgKGUxMSkgPT4gewogICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KTsKICAgICAgaWYgKHBvcyAhPT0gbnVsbCkgewogICAgICAgIHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gPSBwb3M7CiAgICAgIH0KICAgICAgaGFuZGxlcnMyLm9uTW91c2VVcD8uKGUxMSk7CiAgICB9KTsKICAgIHF1b3RlQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZTExKSA9PiB7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIGNvbnN0IHBvcyA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQpOwogICAgICAgIGlmIChwb3MgIT09IG51bGwpIHsKICAgICAgICAgIHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gPSBwb3M7CiAgICAgICAgfQogICAgICB9LCAwKTsKICAgIH0pOwogICAgcXVvdGVCbG9jay5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsIChlMTEpID0+IHsKICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCk7CiAgICAgIGlmIChwb3MgIT09IG51bGwpIHsKICAgICAgICB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gcG9zOwogICAgICB9CiAgICB9KTsKICAgIHRoaXMuc2V0dXBTZWxlY3Rpb25IYW5kbGVyKGVsZW1lbnQ0LCBxdW90ZUJsb2NrLCBibG9jayk7CiAgfQogIHNldHVwU2VsZWN0aW9uSGFuZGxlcihlbGVtZW50NCwgcXVvdGVCbG9jaywgYmxvY2spIHsKICAgIGNvbnN0IGNoZWNrU2VsZWN0aW9uID0gKCkgPT4gewogICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICAgIGlmIChzZWxlY3RlZFRleHQubGVuZ3RoID09PSAwKSB7CiAgICAgICAgaWYgKHRoaXMubGFzdFNlbGVjdGVkVGV4dCkgewogICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRUZXh0ID0gIiI7CiAgICAgICAgICB0aGlzLmRpc3BhdGNoU2VsZWN0aW9uRXZlbnQoZWxlbWVudDQsIHsKICAgICAgICAgICAgdGV4dDogIiIsCiAgICAgICAgICAgIGJsb2NrSWQ6IGJsb2NrLmlkLAogICAgICAgICAgICBoYXNTZWxlY3Rpb246IGZhbHNlCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHd5c2l3eWdCbG9jazIgPSBxdW90ZUJsb2NrLmdldFJvb3ROb2RlKCkuaG9zdDsKICAgICAgY29uc3QgcGFyZW50Q29tcG9uZW50ID0gd3lzaXd5Z0Jsb2NrMj8uY2xvc2VzdCgiZGVlcy1pbnB1dC13eXNpd3lnIik7CiAgICAgIGNvbnN0IHBhcmVudFNoYWRvd1Jvb3QgPSBwYXJlbnRDb21wb25lbnQ/LnNoYWRvd1Jvb3Q7CiAgICAgIGNvbnN0IGJsb2NrU2hhZG93Um9vdCA9IHd5c2l3eWdCbG9jazI/LnNoYWRvd1Jvb3Q7CiAgICAgIGNvbnN0IHNoYWRvd1Jvb3RzID0gW107CiAgICAgIGlmIChwYXJlbnRTaGFkb3dSb290KQogICAgICAgIHNoYWRvd1Jvb3RzLnB1c2gocGFyZW50U2hhZG93Um9vdCk7CiAgICAgIGlmIChibG9ja1NoYWRvd1Jvb3QpCiAgICAgICAgc2hhZG93Um9vdHMucHVzaChibG9ja1NoYWRvd1Jvb3QpOwogICAgICBjb25zdCBzZWxlY3Rpb25JbmZvID0gV3lzaXd5Z1NlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvKC4uLnNoYWRvd1Jvb3RzKTsKICAgICAgaWYgKCFzZWxlY3Rpb25JbmZvKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3Qgc3RhcnRJbkJsb2NrID0gV3lzaXd5Z1NlbGVjdGlvbi5jb250YWluc0Fjcm9zc1NoYWRvd0RPTShxdW90ZUJsb2NrLCBzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyKTsKICAgICAgY29uc3QgZW5kSW5CbG9jayA9IFd5c2l3eWdTZWxlY3Rpb24uY29udGFpbnNBY3Jvc3NTaGFkb3dET00ocXVvdGVCbG9jaywgc2VsZWN0aW9uSW5mby5lbmRDb250YWluZXIpOwogICAgICBpZiAoc3RhcnRJbkJsb2NrIHx8IGVuZEluQmxvY2spIHsKICAgICAgICBpZiAoc2VsZWN0ZWRUZXh0ICE9PSB0aGlzLmxhc3RTZWxlY3RlZFRleHQpIHsKICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkVGV4dCA9IHNlbGVjdGVkVGV4dDsKICAgICAgICAgIGNvbnN0IHJhbmdlMiA9IFd5c2l3eWdTZWxlY3Rpb24uY3JlYXRlUmFuZ2VGcm9tSW5mbyhzZWxlY3Rpb25JbmZvKTsKICAgICAgICAgIGNvbnN0IHJlY3QgPSByYW5nZTIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICB0aGlzLmRpc3BhdGNoU2VsZWN0aW9uRXZlbnQoZWxlbWVudDQsIHsKICAgICAgICAgICAgdGV4dDogc2VsZWN0ZWRUZXh0LnRyaW0oKSwKICAgICAgICAgICAgYmxvY2tJZDogYmxvY2suaWQsCiAgICAgICAgICAgIHJhbmdlOiByYW5nZTIsCiAgICAgICAgICAgIHJlY3QsCiAgICAgICAgICAgIGhhc1NlbGVjdGlvbjogdHJ1ZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRoaXMubGFzdFNlbGVjdGVkVGV4dCkgewogICAgICAgIHRoaXMubGFzdFNlbGVjdGVkVGV4dCA9ICIiOwogICAgICAgIHRoaXMuZGlzcGF0Y2hTZWxlY3Rpb25FdmVudChlbGVtZW50NCwgewogICAgICAgICAgdGV4dDogIiIsCiAgICAgICAgICBibG9ja0lkOiBibG9jay5pZCwKICAgICAgICAgIGhhc1NlbGVjdGlvbjogZmFsc2UKICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIsIGNoZWNrU2VsZWN0aW9uKTsKICAgIHRoaXMuc2VsZWN0aW9uSGFuZGxlciA9IGNoZWNrU2VsZWN0aW9uOwogICAgY29uc3Qgd3lzaXd5Z0Jsb2NrID0gcXVvdGVCbG9jay5nZXRSb290Tm9kZSgpLmhvc3Q7CiAgICBpZiAod3lzaXd5Z0Jsb2NrKSB7CiAgICAgIGNvbnN0IG9yaWdpbmFsRGlzY29ubmVjdGVkQ2FsbGJhY2sgPSB3eXNpd3lnQmxvY2suZGlzY29ubmVjdGVkQ2FsbGJhY2s7CiAgICAgIHd5c2l3eWdCbG9jay5kaXNjb25uZWN0ZWRDYWxsYmFjayA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbkhhbmRsZXIpIHsKICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIsIHRoaXMuc2VsZWN0aW9uSGFuZGxlcik7CiAgICAgICAgICB0aGlzLnNlbGVjdGlvbkhhbmRsZXIgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAob3JpZ2luYWxEaXNjb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgYXdhaXQgb3JpZ2luYWxEaXNjb25uZWN0ZWRDYWxsYmFjay5jYWxsKHd5c2l3eWdCbG9jayk7CiAgICAgICAgfQogICAgICB9LmJpbmQodGhpcyk7CiAgICB9CiAgfQogIGRpc3BhdGNoU2VsZWN0aW9uRXZlbnQoZWxlbWVudDQsIGRldGFpbCkgewogICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoImJsb2NrLXRleHQtc2VsZWN0ZWQiLCB7CiAgICAgIGRldGFpbCwKICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgY29tcG9zZWQ6IHRydWUKICAgIH0pOwogICAgZWxlbWVudDQuZGlzcGF0Y2hFdmVudChldmVudCk7CiAgfQogIGdldFN0eWxlcygpIHsKICAgIHJldHVybiBgCiAgICAgIC8qIFF1b3RlIHNwZWNpZmljIHN0eWxlcyAqLwogICAgICAuYmxvY2sucXVvdGUgewogICAgICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDY2Y2MiLCAiIzRkOTRmZiIpfTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNTU1IiwgIiNiMGIwYjAiKX07CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7CiAgICAgICAgbWFyZ2luOiAxNnB4IDA7CiAgICAgIH0KICAgIGA7CiAgfQogIGdldFBsYWNlaG9sZGVyKCkgewogICAgcmV0dXJuICJBZGQgYSBxdW90ZS4uLiI7CiAgfQogIC8vIEhlbHBlciBtZXRob2RzIGZvciBxdW90ZSBmdW5jdGlvbmFsaXR5CiAgZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQsIGNvbnRleHQyKSB7CiAgICBjb25zdCBxdW90ZUJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLnF1b3RlIik7CiAgICBpZiAoIXF1b3RlQmxvY2spIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCB3eXNpd3lnQmxvY2sgPSBjb250ZXh0Mj8uY29tcG9uZW50OwogICAgY29uc3QgcGFyZW50Q29tcG9uZW50ID0gd3lzaXd5Z0Jsb2NrPy5jbG9zZXN0KCJkZWVzLWlucHV0LXd5c2l3eWciKTsKICAgIGNvbnN0IHBhcmVudFNoYWRvd1Jvb3QgPSBwYXJlbnRDb21wb25lbnQ/LnNoYWRvd1Jvb3Q7CiAgICBjb25zdCBibG9ja1NoYWRvd1Jvb3QgPSBjb250ZXh0Mj8uc2hhZG93Um9vdDsKICAgIGNvbnN0IHNoYWRvd1Jvb3RzID0gW107CiAgICBpZiAocGFyZW50U2hhZG93Um9vdCkKICAgICAgc2hhZG93Um9vdHMucHVzaChwYXJlbnRTaGFkb3dSb290KTsKICAgIGlmIChibG9ja1NoYWRvd1Jvb3QpCiAgICAgIHNoYWRvd1Jvb3RzLnB1c2goYmxvY2tTaGFkb3dSb290KTsKICAgIGNvbnN0IHNlbGVjdGlvbkluZm8gPSBXeXNpd3lnU2VsZWN0aW9uLmdldFNlbGVjdGlvbkluZm8oLi4uc2hhZG93Um9vdHMpOwogICAgaWYgKCFzZWxlY3Rpb25JbmZvKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKCFXeXNpd3lnU2VsZWN0aW9uLmNvbnRhaW5zQWNyb3NzU2hhZG93RE9NKHF1b3RlQmxvY2ssIHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgcHJlQ2FyZXRSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICBwcmVDYXJldFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhxdW90ZUJsb2NrKTsKICAgIHByZUNhcmV0UmFuZ2Uuc2V0RW5kKHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIsIHNlbGVjdGlvbkluZm8uc3RhcnRPZmZzZXQpOwogICAgY29uc3QgcG9zaXRpb24zID0gcHJlQ2FyZXRSYW5nZS50b1N0cmluZygpLmxlbmd0aDsKICAgIHJldHVybiBwb3NpdGlvbjM7CiAgfQogIGdldENvbnRlbnQoZWxlbWVudDQsIGNvbnRleHQyKSB7CiAgICBjb25zdCBxdW90ZUJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLnF1b3RlIik7CiAgICBpZiAoIXF1b3RlQmxvY2spCiAgICAgIHJldHVybiAiIjsKICAgIGNvbnN0IGNvbnRlbnQzID0gcXVvdGVCbG9jay5pbm5lckhUTUwgfHwgIiI7CiAgICByZXR1cm4gY29udGVudDM7CiAgfQogIHNldENvbnRlbnQoZWxlbWVudDQsIGNvbnRlbnQzLCBjb250ZXh0MikgewogICAgY29uc3QgcXVvdGVCbG9jayA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jay5xdW90ZSIpOwogICAgaWYgKCFxdW90ZUJsb2NrKQogICAgICByZXR1cm47CiAgICBjb25zdCBoYWRGb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHF1b3RlQmxvY2sgfHwgZWxlbWVudDQuc2hhZG93Um9vdD8uYWN0aXZlRWxlbWVudCA9PT0gcXVvdGVCbG9jazsKICAgIHF1b3RlQmxvY2suaW5uZXJIVE1MID0gY29udGVudDM7CiAgICBpZiAoaGFkRm9jdXMpIHsKICAgICAgcXVvdGVCbG9jay5mb2N1cygpOwogICAgfQogIH0KICBzZXRDdXJzb3JUb1N0YXJ0KGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgcXVvdGVCbG9jayA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jay5xdW90ZSIpOwogICAgaWYgKHF1b3RlQmxvY2spIHsKICAgICAgV3lzaXd5Z0Jsb2Nrcy5zZXRDdXJzb3JUb1N0YXJ0KHF1b3RlQmxvY2spOwogICAgfQogIH0KICBzZXRDdXJzb3JUb0VuZChlbGVtZW50NCwgY29udGV4dDIpIHsKICAgIGNvbnN0IHF1b3RlQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2sucXVvdGUiKTsKICAgIGlmIChxdW90ZUJsb2NrKSB7CiAgICAgIFd5c2l3eWdCbG9ja3Muc2V0Q3Vyc29yVG9FbmQocXVvdGVCbG9jayk7CiAgICB9CiAgfQogIGZvY3VzKGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgcXVvdGVCbG9jayA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jay5xdW90ZSIpOwogICAgaWYgKCFxdW90ZUJsb2NrKQogICAgICByZXR1cm47CiAgICBpZiAoIXF1b3RlQmxvY2suaGFzQXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiKSkgewogICAgICBxdW90ZUJsb2NrLnNldEF0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIiwgInRydWUiKTsKICAgIH0KICAgIHF1b3RlQmxvY2suZm9jdXMoKTsKICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSBxdW90ZUJsb2NrICYmIGVsZW1lbnQ0LnNoYWRvd1Jvb3Q/LmFjdGl2ZUVsZW1lbnQgIT09IHF1b3RlQmxvY2spIHsKICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7CiAgICAgICAgcXVvdGVCbG9jay5mb2N1cygpOwogICAgICB9KTsKICAgIH0KICB9CiAgZm9jdXNXaXRoQ3Vyc29yKGVsZW1lbnQ0LCBwb3NpdGlvbjMgPSAiZW5kIiwgY29udGV4dDIpIHsKICAgIGNvbnN0IHF1b3RlQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2sucXVvdGUiKTsKICAgIGlmICghcXVvdGVCbG9jaykKICAgICAgcmV0dXJuOwogICAgaWYgKCFxdW90ZUJsb2NrLmhhc0F0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIikpIHsKICAgICAgcXVvdGVCbG9jay5zZXRBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIsICJ0cnVlIik7CiAgICB9CiAgICBxdW90ZUJsb2NrLmZvY3VzKCk7CiAgICBjb25zdCBzZXRDdXJzb3IgPSAoKSA9PiB7CiAgICAgIGlmIChwb3NpdGlvbjMgPT09ICJzdGFydCIpIHsKICAgICAgICB0aGlzLnNldEN1cnNvclRvU3RhcnQoZWxlbWVudDQsIGNvbnRleHQyKTsKICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbjMgPT09ICJlbmQiKSB7CiAgICAgICAgdGhpcy5zZXRDdXJzb3JUb0VuZChlbGVtZW50NCwgY29udGV4dDIpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwb3NpdGlvbjMgPT09ICJudW1iZXIiKSB7CiAgICAgICAgV3lzaXd5Z1NlbGVjdGlvbi5zZXRDdXJzb3JQb3NpdGlvbihxdW90ZUJsb2NrLCBwb3NpdGlvbjMpOwogICAgICB9CiAgICB9OwogICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHF1b3RlQmxvY2sgfHwgZWxlbWVudDQuc2hhZG93Um9vdD8uYWN0aXZlRWxlbWVudCA9PT0gcXVvdGVCbG9jaykgewogICAgICBzZXRDdXJzb3IoKTsKICAgIH0gZWxzZSB7CiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gewogICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBxdW90ZUJsb2NrIHx8IGVsZW1lbnQ0LnNoYWRvd1Jvb3Q/LmFjdGl2ZUVsZW1lbnQgPT09IHF1b3RlQmxvY2spIHsKICAgICAgICAgIHNldEN1cnNvcigpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfQogIGdldFNwbGl0Q29udGVudChlbGVtZW50NCwgY29udGV4dDIpIHsKICAgIGNvbnN0IHF1b3RlQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2sucXVvdGUiKTsKICAgIGlmICghcXVvdGVCbG9jaykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHd5c2l3eWdCbG9jayA9IGNvbnRleHQyPy5jb21wb25lbnQ7CiAgICBjb25zdCBwYXJlbnRDb21wb25lbnQgPSB3eXNpd3lnQmxvY2s/LmNsb3Nlc3QoImRlZXMtaW5wdXQtd3lzaXd5ZyIpOwogICAgY29uc3QgcGFyZW50U2hhZG93Um9vdCA9IHBhcmVudENvbXBvbmVudD8uc2hhZG93Um9vdDsKICAgIGNvbnN0IGJsb2NrU2hhZG93Um9vdCA9IGNvbnRleHQyPy5zaGFkb3dSb290OwogICAgY29uc3Qgc2hhZG93Um9vdHMgPSBbXTsKICAgIGlmIChwYXJlbnRTaGFkb3dSb290KQogICAgICBzaGFkb3dSb290cy5wdXNoKHBhcmVudFNoYWRvd1Jvb3QpOwogICAgaWYgKGJsb2NrU2hhZG93Um9vdCkKICAgICAgc2hhZG93Um9vdHMucHVzaChibG9ja1NoYWRvd1Jvb3QpOwogICAgY29uc3Qgc2VsZWN0aW9uSW5mbyA9IFd5c2l3eWdTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uSW5mbyguLi5zaGFkb3dSb290cyk7CiAgICBpZiAoIXNlbGVjdGlvbkluZm8pIHsKICAgICAgaWYgKHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gIT09IG51bGwpIHsKICAgICAgICBjb25zdCBmdWxsVGV4dCA9IHF1b3RlQmxvY2sudGV4dENvbnRlbnQgfHwgIiI7CiAgICAgICAgY29uc3QgcG9zID0gTWF0aC5taW4odGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiwgZnVsbFRleHQubGVuZ3RoKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgYmVmb3JlOiBmdWxsVGV4dC5zdWJzdHJpbmcoMCwgcG9zKSwKICAgICAgICAgIGFmdGVyOiBmdWxsVGV4dC5zdWJzdHJpbmcocG9zKQogICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoIVd5c2l3eWdTZWxlY3Rpb24uY29udGFpbnNBY3Jvc3NTaGFkb3dET00ocXVvdGVCbG9jaywgc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lcikpIHsKICAgICAgaWYgKHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gIT09IG51bGwpIHsKICAgICAgICBjb25zdCBmdWxsVGV4dCA9IHF1b3RlQmxvY2sudGV4dENvbnRlbnQgfHwgIiI7CiAgICAgICAgY29uc3QgcG9zID0gTWF0aC5taW4odGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiwgZnVsbFRleHQubGVuZ3RoKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgYmVmb3JlOiBmdWxsVGV4dC5zdWJzdHJpbmcoMCwgcG9zKSwKICAgICAgICAgIGFmdGVyOiBmdWxsVGV4dC5zdWJzdHJpbmcocG9zKQogICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBjdXJzb3JQb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0LCBjb250ZXh0Mik7CiAgICBpZiAoY3Vyc29yUG9zID09PSBudWxsIHx8IGN1cnNvclBvcyA9PT0gMCkgewogICAgICByZXR1cm4gewogICAgICAgIGJlZm9yZTogIiIsCiAgICAgICAgYWZ0ZXI6IHF1b3RlQmxvY2suaW5uZXJIVE1MCiAgICAgIH07CiAgICB9CiAgICBjb25zdCBiZWZvcmVSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICBjb25zdCBhZnRlclJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgIGJlZm9yZVJhbmdlLnNldFN0YXJ0KHF1b3RlQmxvY2ssIDApOwogICAgYmVmb3JlUmFuZ2Uuc2V0RW5kKHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIsIHNlbGVjdGlvbkluZm8uc3RhcnRPZmZzZXQpOwogICAgYWZ0ZXJSYW5nZS5zZXRTdGFydChzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyLCBzZWxlY3Rpb25JbmZvLnN0YXJ0T2Zmc2V0KTsKICAgIGFmdGVyUmFuZ2Uuc2V0RW5kKHF1b3RlQmxvY2ssIHF1b3RlQmxvY2suY2hpbGROb2Rlcy5sZW5ndGgpOwogICAgY29uc3QgYmVmb3JlRnJhZ21lbnQgPSBiZWZvcmVSYW5nZS5jbG9uZUNvbnRlbnRzKCk7CiAgICBjb25zdCBhZnRlckZyYWdtZW50ID0gYWZ0ZXJSYW5nZS5jbG9uZUNvbnRlbnRzKCk7CiAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICB0ZW1wRGl2LmFwcGVuZENoaWxkKGJlZm9yZUZyYWdtZW50KTsKICAgIGNvbnN0IGJlZm9yZUh0bWwgPSB0ZW1wRGl2LmlubmVySFRNTDsKICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gIiI7CiAgICB0ZW1wRGl2LmFwcGVuZENoaWxkKGFmdGVyRnJhZ21lbnQpOwogICAgY29uc3QgYWZ0ZXJIdG1sID0gdGVtcERpdi5pbm5lckhUTUw7CiAgICByZXR1cm4gewogICAgICBiZWZvcmU6IGJlZm9yZUh0bWwsCiAgICAgIGFmdGVyOiBhZnRlckh0bWwKICAgIH07CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy9ibG9ja3MvdGV4dC9jb2RlLmJsb2NrLmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfc2VydmljZXMoKTsKdmFyIENvZGVCbG9ja0hhbmRsZXIgPSBjbGFzcyBleHRlbmRzIEJhc2VCbG9ja0hhbmRsZXIgewogIHR5cGUgPSAiY29kZSI7CiAgaGlnaGxpZ2h0VGltZXIgPSBudWxsOwogIGhpZ2hsaWdodEpzID0gbnVsbDsKICByZW5kZXIoYmxvY2ssIGlzU2VsZWN0ZWQpIHsKICAgIGNvbnN0IGxhbmd1YWdlID0gYmxvY2subWV0YWRhdGE/Lmxhbmd1YWdlIHx8ICJ0eXBlc2NyaXB0IjsKICAgIGNvbnN0IGNvbnRlbnQzID0gYmxvY2suY29udGVudCB8fCAiIjsKICAgIGNvbnN0IGxpbmVDb3VudCA9IGNvbnRlbnQzLnNwbGl0KCJcbiIpLmxlbmd0aDsKICAgIGxldCBsaW5lTnVtYmVyc0h0bWwgPSAiIjsKICAgIGZvciAobGV0IGkxMSA9IDE7IGkxMSA8PSBsaW5lQ291bnQ7IGkxMSsrKSB7CiAgICAgIGxpbmVOdW1iZXJzSHRtbCArPSBgPGRpdiBjbGFzcz0ibGluZS1udW1iZXIiPiR7aTExfTwvZGl2PmA7CiAgICB9CiAgICBjb25zdCBsYW5ndWFnZU9wdGlvbnMgPSBQUk9HUkFNTUlOR19MQU5HVUFHRVMubWFwKChsYW5nKSA9PiB7CiAgICAgIGNvbnN0IHZhbHVlMiA9IGxhbmcudG9Mb3dlckNhc2UoKTsKICAgICAgcmV0dXJuIGA8b3B0aW9uIHZhbHVlPSIke3ZhbHVlMn0iICR7dmFsdWUyID09PSBsYW5ndWFnZSA/ICJzZWxlY3RlZCIgOiAiIn0+JHtsYW5nfTwvb3B0aW9uPmA7CiAgICB9KS5qb2luKCIiKTsKICAgIHJldHVybiBgCiAgICAgIDxkaXYgY2xhc3M9ImNvZGUtYmxvY2stY29udGFpbmVyJHtpc1NlbGVjdGVkID8gIiBzZWxlY3RlZCIgOiAiIn0iIGRhdGEtbGFuZ3VhZ2U9IiR7bGFuZ3VhZ2V9Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWhlYWRlciI+CiAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJsYW5ndWFnZS1zZWxlY3RvciIgZGF0YS1ibG9jay1pZD0iJHtibG9jay5pZH0iPgogICAgICAgICAgICAke2xhbmd1YWdlT3B0aW9uc30KICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY29weS1idXR0b24iIHRpdGxlPSJDb3B5IGNvZGUiPgogICAgICAgICAgICA8c3ZnIGNsYXNzPSJjb3B5LWljb24iIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2IiBmaWxsPSJjdXJyZW50Q29sb3IiPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wIDYuNzVDMCA1Ljc4NC43ODQgNSAxLjc1IDVoMS41YS43NS43NSAwIDAxMCAxLjVoLTEuNWEuMjUuMjUgMCAwMC0uMjUuMjV2Ny41YzAgLjEzOC4xMTIuMjUuMjUuMjVoNy41YS4yNS4yNSAwIDAwLjI1LS4yNXYtMS41YS43NS43NSAwIDAxMS41IDB2MS41QTEuNzUgMS43NSAwIDAxOS4yNSAxNmgtNy41QTEuNzUgMS43NSAwIDAxMCAxNC4yNXYtNy41eiI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik01IDEuNzVDNSAuNzg0IDUuNzg0IDAgNi43NSAwaDcuNUMxNS4yMTYgMCAxNiAuNzg0IDE2IDEuNzV2Ny41QTEuNzUgMS43NSAwIDAxMTQuMjUgMTFoLTcuNUExLjc1IDEuNzUgMCAwMTUgOS4yNXYtNy41em0xLjc1LS4yNWEuMjUuMjUgMCAwMC0uMjUuMjV2Ny41YzAgLjEzOC4xMTIuMjUuMjUuMjVoNy41YS4yNS4yNSAwIDAwLjI1LS4yNXYtNy41YS4yNS4yNSAwIDAwLS4yNS0uMjVoLTcuNXoiPjwvcGF0aD4KICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb3B5LXRleHQiPkNvcHk8L3NwYW4+CiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWJvZHkiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1udW1iZXJzIj4ke2xpbmVOdW1iZXJzSHRtbH08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtY29udGVudCI+CiAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUtcHJlIj48Y29kZSBjbGFzcz0iY29kZS1lZGl0b3IiIAogICAgICAgICAgICAgICAgIGNvbnRlbnRlZGl0YWJsZT0idHJ1ZSIKICAgICAgICAgICAgICAgICBkYXRhLWJsb2NrLWlkPSIke2Jsb2NrLmlkfSIKICAgICAgICAgICAgICAgICBkYXRhLWJsb2NrLXR5cGU9IiR7YmxvY2sudHlwZX0iCiAgICAgICAgICAgICAgICAgc3BlbGxjaGVjaz0iZmFsc2UiPiR7dGhpcy5lc2NhcGVIdG1sKGNvbnRlbnQzKX08L2NvZGU+PC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICBzZXR1cChlbGVtZW50NCwgYmxvY2ssIGhhbmRsZXJzMikgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmNvZGUtZWRpdG9yIik7CiAgICBjb25zdCBjb250YWluZXIgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuY29kZS1ibG9jay1jb250YWluZXIiKTsKICAgIGNvbnN0IGNvcHlCdXR0b24gPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuY29weS1idXR0b24iKTsKICAgIGNvbnN0IGxhbmd1YWdlU2VsZWN0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIubGFuZ3VhZ2Utc2VsZWN0b3IiKTsKICAgIGlmICghZWRpdG9yIHx8ICFjb250YWluZXIpCiAgICAgIHJldHVybjsKICAgIGlmIChsYW5ndWFnZVNlbGVjdG9yKSB7CiAgICAgIGxhbmd1YWdlU2VsZWN0b3IuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgKGUxMSkgPT4gewogICAgICAgIGNvbnN0IG5ld0xhbmd1YWdlID0gZTExLnRhcmdldC52YWx1ZTsKICAgICAgICBibG9jay5tZXRhZGF0YSA9IHsgLi4uYmxvY2subWV0YWRhdGEsIGxhbmd1YWdlOiBuZXdMYW5ndWFnZSB9OwogICAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoImRhdGEtbGFuZ3VhZ2UiLCBuZXdMYW5ndWFnZSk7CiAgICAgICAgaWYgKGJsb2NrLmNvbnRlbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gZWRpdG9yKSB7CiAgICAgICAgICB0aGlzLmFwcGx5SGlnaGxpZ2h0aW5nKGVsZW1lbnQ0LCBibG9jayk7CiAgICAgICAgfQogICAgICAgIGlmIChoYW5kbGVyczIub25JbnB1dCkgewogICAgICAgICAgaGFuZGxlcnMyLm9uSW5wdXQobmV3IElucHV0RXZlbnQoImlucHV0IikpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBpZiAoY29weUJ1dHRvbikgewogICAgICBjb3B5QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKCkgPT4gewogICAgICAgIGNvbnN0IGNvbnRlbnQzID0gZWRpdG9yLnRleHRDb250ZW50IHx8ICIiOwogICAgICAgIHRyeSB7CiAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChjb250ZW50Myk7CiAgICAgICAgICBjb25zdCBjb3B5VGV4dCA9IGNvcHlCdXR0b24ucXVlcnlTZWxlY3RvcigiLmNvcHktdGV4dCIpOwogICAgICAgICAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gY29weVRleHQudGV4dENvbnRlbnQ7CiAgICAgICAgICBjb3B5VGV4dC50ZXh0Q29udGVudCA9ICJDb3BpZWQhIjsKICAgICAgICAgIGNvcHlCdXR0b24uY2xhc3NMaXN0LmFkZCgiY29waWVkIik7CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgY29weVRleHQudGV4dENvbnRlbnQgPSBvcmlnaW5hbFRleHQ7CiAgICAgICAgICAgIGNvcHlCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgiY29waWVkIik7CiAgICAgICAgICB9LCAyZTMpOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGNvcHk6IiwgZXJyKTsKICAgICAgICAgIGNvbnN0IHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTsKICAgICAgICAgIHRleHRBcmVhLnZhbHVlID0gY29udGVudDM7CiAgICAgICAgICB0ZXh0QXJlYS5zdHlsZS5wb3NpdGlvbiA9ICJmaXhlZCI7CiAgICAgICAgICB0ZXh0QXJlYS5zdHlsZS5vcGFjaXR5ID0gIjAiOwogICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXh0QXJlYSk7CiAgICAgICAgICB0ZXh0QXJlYS5zZWxlY3QoKTsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCJjb3B5Iik7CiAgICAgICAgICAgIGNvbnN0IGNvcHlUZXh0ID0gY29weUJ1dHRvbi5xdWVyeVNlbGVjdG9yKCIuY29weS10ZXh0Iik7CiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVGV4dCA9IGNvcHlUZXh0LnRleHRDb250ZW50OwogICAgICAgICAgICBjb3B5VGV4dC50ZXh0Q29udGVudCA9ICJDb3BpZWQhIjsKICAgICAgICAgICAgY29weUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCJjb3BpZWQiKTsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgY29weVRleHQudGV4dENvbnRlbnQgPSBvcmlnaW5hbFRleHQ7CiAgICAgICAgICAgICAgY29weUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCJjb3BpZWQiKTsKICAgICAgICAgICAgfSwgMmUzKTsKICAgICAgICAgIH0gY2F0Y2ggKGVycjIpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcigiRmFsbGJhY2sgY29weSBmYWlsZWQ6IiwgZXJyMik7CiAgICAgICAgICB9CiAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRleHRBcmVhKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgbGV0IGlzRWRpdGluZyA9IGZhbHNlOwogICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwgKCkgPT4gewogICAgICBpc0VkaXRpbmcgPSB0cnVlOwogICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgiZWRpdGluZyIpOwogICAgICBjb25zdCBjb250ZW50MyA9IGVkaXRvci50ZXh0Q29udGVudCB8fCAiIjsKICAgICAgZWRpdG9yLnRleHRDb250ZW50ID0gY29udGVudDM7CiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgY29uc3QgcmFuZ2UyID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgaWYgKGVkaXRvci5maXJzdENoaWxkKSB7CiAgICAgICAgICByYW5nZTIuc2V0U3RhcnQoZWRpdG9yLmZpcnN0Q2hpbGQsIDApOwogICAgICAgICAgcmFuZ2UyLmNvbGxhcHNlKHRydWUpOwogICAgICAgICAgc2VsZWN0aW9uPy5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UyKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBoYW5kbGVyczIub25Gb2N1cygpOwogICAgfSk7CiAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IHsKICAgICAgaXNFZGl0aW5nID0gZmFsc2U7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCJlZGl0aW5nIik7CiAgICAgIHRoaXMuYXBwbHlIaWdobGlnaHRpbmcoZWxlbWVudDQsIGJsb2NrKTsKICAgICAgaGFuZGxlcnMyLm9uQmx1cigpOwogICAgfSk7CiAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCAoZTExKSA9PiB7CiAgICAgIGhhbmRsZXJzMi5vbklucHV0KGUxMSk7CiAgICAgIHRoaXMudXBkYXRlTGluZU51bWJlcnMoZWxlbWVudDQpOwogICAgICBjbGVhclRpbWVvdXQodGhpcy5oaWdobGlnaHRUaW1lcik7CiAgICB9KTsKICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgKGUxMSkgPT4gewogICAgICBpZiAoZTExLmtleSA9PT0gIlRhYiIpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHsKICAgICAgICAgIGNvbnN0IHJhbmdlMiA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICAiKTsKICAgICAgICAgIHJhbmdlMi5pbnNlcnROb2RlKHRleHROb2RlKTsKICAgICAgICAgIHJhbmdlMi5zZXRTdGFydEFmdGVyKHRleHROb2RlKTsKICAgICAgICAgIHJhbmdlMi5zZXRFbmRBZnRlcih0ZXh0Tm9kZSk7CiAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UyKTsKICAgICAgICAgIGhhbmRsZXJzMi5vbklucHV0KG5ldyBJbnB1dEV2ZW50KCJpbnB1dCIpKTsKICAgICAgICAgIHRoaXMudXBkYXRlTGluZU51bWJlcnMoZWxlbWVudDQpOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKFsiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiQXJyb3dVcCIsICJBcnJvd0Rvd24iXS5pbmNsdWRlcyhlMTEua2V5KSkgewogICAgICAgIGNvbnN0IGN1cnNvclBvcyA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQpOwogICAgICAgIGNvbnN0IHRleHRMZW5ndGggPSBlZGl0b3IudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwOwogICAgICAgIGlmIChlMTEua2V5ID09PSAiQXJyb3dMZWZ0IiAmJiBjdXJzb3JQb3MgPT09IDAgfHwgZTExLmtleSA9PT0gIkFycm93UmlnaHQiICYmIGN1cnNvclBvcyA9PT0gdGV4dExlbmd0aCkgewogICAgICAgICAgaGFuZGxlcnMyLm9uS2V5RG93bihlMTEpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoZTExLmtleSA9PT0gIkFycm93VXAiIHx8IGUxMS5rZXkgPT09ICJBcnJvd0Rvd24iKSB7CiAgICAgICAgICBjb25zdCBsaW5lcyA9IChlZGl0b3IudGV4dENvbnRlbnQgfHwgIiIpLnNwbGl0KCJcbiIpOwogICAgICAgICAgY29uc3QgY3VycmVudExpbmUgPSB0aGlzLmdldEN1cnJlbnRMaW5lSW5kZXgoZWRpdG9yKTsKICAgICAgICAgIGlmIChlMTEua2V5ID09PSAiQXJyb3dVcCIgJiYgY3VycmVudExpbmUgPT09IDAgfHwgZTExLmtleSA9PT0gIkFycm93RG93biIgJiYgY3VycmVudExpbmUgPT09IGxpbmVzLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgaGFuZGxlcnMyLm9uS2V5RG93bihlMTEpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGhhbmRsZXJzMi5vbktleURvd24oZTExKTsKICAgIH0pOwogICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoInBhc3RlIiwgKGUxMSkgPT4gewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgY29uc3QgdGV4dDkgPSBlMTEuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YSgidGV4dC9wbGFpbiIpOwogICAgICBpZiAodGV4dDkpIHsKICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHsKICAgICAgICAgIGNvbnN0IHJhbmdlMiA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgICAgICAgcmFuZ2UyLmRlbGV0ZUNvbnRlbnRzKCk7CiAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQ5KTsKICAgICAgICAgIHJhbmdlMi5pbnNlcnROb2RlKHRleHROb2RlKTsKICAgICAgICAgIHJhbmdlMi5zZXRTdGFydEFmdGVyKHRleHROb2RlKTsKICAgICAgICAgIHJhbmdlMi5zZXRFbmRBZnRlcih0ZXh0Tm9kZSk7CiAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UyKTsKICAgICAgICAgIGhhbmRsZXJzMi5vbklucHV0KG5ldyBJbnB1dEV2ZW50KCJpbnB1dCIpKTsKICAgICAgICAgIHRoaXMudXBkYXRlTGluZU51bWJlcnMoZWxlbWVudDQpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcG9zaXRpb25zdGFydCIsICgpID0+IGhhbmRsZXJzMi5vbkNvbXBvc2l0aW9uU3RhcnQoKSk7CiAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcG9zaXRpb25lbmQiLCAoKSA9PiBoYW5kbGVyczIub25Db21wb3NpdGlvbkVuZCgpKTsKICAgIGlmIChibG9jay5jb250ZW50ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGVkaXRvcikgewogICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgIHRoaXMuYXBwbHlIaWdobGlnaHRpbmcoZWxlbWVudDQsIGJsb2NrKTsKICAgICAgfSk7CiAgICB9CiAgfQogIHVwZGF0ZUxpbmVOdW1iZXJzKGVsZW1lbnQ0KSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuY29kZS1lZGl0b3IiKTsKICAgIGNvbnN0IGxpbmVOdW1iZXJzQ29udGFpbmVyID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmxpbmUtbnVtYmVycyIpOwogICAgaWYgKCFlZGl0b3IgfHwgIWxpbmVOdW1iZXJzQ29udGFpbmVyKQogICAgICByZXR1cm47CiAgICBjb25zdCBjb250ZW50MyA9IGVkaXRvci50ZXh0Q29udGVudCB8fCAiIjsKICAgIGNvbnN0IGxpbmVzID0gY29udGVudDMuc3BsaXQoIlxuIik7CiAgICBjb25zdCBsaW5lQ291bnQgPSBsaW5lcy5sZW5ndGggfHwgMTsKICAgIGxldCBsaW5lTnVtYmVyc0h0bWwgPSAiIjsKICAgIGZvciAobGV0IGkxMSA9IDE7IGkxMSA8PSBsaW5lQ291bnQ7IGkxMSsrKSB7CiAgICAgIGxpbmVOdW1iZXJzSHRtbCArPSBgPGRpdiBjbGFzcz0ibGluZS1udW1iZXIiPiR7aTExfTwvZGl2PmA7CiAgICB9CiAgICBsaW5lTnVtYmVyc0NvbnRhaW5lci5pbm5lckhUTUwgPSBsaW5lTnVtYmVyc0h0bWw7CiAgfQogIGdldEN1cnJlbnRMaW5lSW5kZXgoZWRpdG9yKSB7CiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkKICAgICAgcmV0dXJuIDA7CiAgICBjb25zdCByYW5nZTIgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgIGNvbnN0IHByZUNhcmV0UmFuZ2UgPSByYW5nZTIuY2xvbmVSYW5nZSgpOwogICAgcHJlQ2FyZXRSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWRpdG9yKTsKICAgIHByZUNhcmV0UmFuZ2Uuc2V0RW5kKHJhbmdlMi5zdGFydENvbnRhaW5lciwgcmFuZ2UyLnN0YXJ0T2Zmc2V0KTsKICAgIGNvbnN0IHRleHRCZWZvcmVDdXJzb3IgPSBwcmVDYXJldFJhbmdlLnRvU3RyaW5nKCk7CiAgICBjb25zdCBsaW5lc0JlZm9yZUN1cnNvciA9IHRleHRCZWZvcmVDdXJzb3Iuc3BsaXQoIlxuIik7CiAgICByZXR1cm4gbGluZXNCZWZvcmVDdXJzb3IubGVuZ3RoIC0gMTsKICB9CiAgYXN5bmMgYXBwbHlIaWdobGlnaHRpbmcoZWxlbWVudDQsIGJsb2NrKSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuY29kZS1lZGl0b3IiKTsKICAgIGlmICghZWRpdG9yKQogICAgICByZXR1cm47CiAgICBpZiAoIXRoaXMuaGlnaGxpZ2h0SnMpIHsKICAgICAgdGhpcy5oaWdobGlnaHRKcyA9IGF3YWl0IERlZXNTZXJ2aWNlTGliTG9hZGVyLmdldEluc3RhbmNlKCkubG9hZEhpZ2hsaWdodEpzKCk7CiAgICB9CiAgICBjb25zdCBjdXJzb3JQb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KTsKICAgIGNvbnN0IGNvbnRlbnQzID0gZWRpdG9yLnRleHRDb250ZW50IHx8ICIiOwogICAgY29uc3QgbGFuZ3VhZ2UgPSBibG9jay5tZXRhZGF0YT8ubGFuZ3VhZ2UgfHwgInR5cGVzY3JpcHQiOwogICAgdHJ5IHsKICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5oaWdobGlnaHRKcy5oaWdobGlnaHQoY29udGVudDMsIHsKICAgICAgICBsYW5ndWFnZSwKICAgICAgICBpZ25vcmVJbGxlZ2FsczogdHJ1ZQogICAgICB9KTsKICAgICAgaWYgKHJlc3VsdC52YWx1ZSkgewogICAgICAgIGVkaXRvci5pbm5lckhUTUwgPSByZXN1bHQudmFsdWU7CiAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGVkaXRvciAmJiBjdXJzb3JQb3MgIT09IG51bGwpIHsKICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICAgIFd5c2l3eWdTZWxlY3Rpb24uc2V0Q3Vyc29yUG9zaXRpb24oZWRpdG9yLCBjdXJzb3JQb3MpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLndhcm4oIlN5bnRheCBoaWdobGlnaHRpbmcgZmFpbGVkOiIsIGVycm9yKTsKICAgIH0KICB9CiAgZXNjYXBlSHRtbCh0ZXh0OSkgewogICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBkaXYudGV4dENvbnRlbnQgPSB0ZXh0OTsKICAgIHJldHVybiBkaXYuaW5uZXJIVE1MOwogIH0KICBnZXRDb250ZW50KGVsZW1lbnQ0KSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuY29kZS1lZGl0b3IiKTsKICAgIHJldHVybiBlZGl0b3I/LnRleHRDb250ZW50IHx8ICIiOwogIH0KICBzZXRDb250ZW50KGVsZW1lbnQ0LCBjb250ZW50MykgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmNvZGUtZWRpdG9yIik7CiAgICBpZiAoIWVkaXRvcikKICAgICAgcmV0dXJuOwogICAgZWRpdG9yLnRleHRDb250ZW50ID0gY29udGVudDM7CiAgICB0aGlzLnVwZGF0ZUxpbmVOdW1iZXJzKGVsZW1lbnQ0KTsKICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSBlZGl0b3IpIHsKICAgICAgY29uc3QgYmxvY2sgPSB7CiAgICAgICAgaWQ6IGVkaXRvci5kYXRhc2V0LmJsb2NrSWQgfHwgIiIsCiAgICAgICAgdHlwZTogImNvZGUiLAogICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQzLAogICAgICAgIG1ldGFkYXRhOiB7CiAgICAgICAgICBsYW5ndWFnZTogZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmNvZGUtYmxvY2stY29udGFpbmVyIik/LmdldEF0dHJpYnV0ZSgiZGF0YS1sYW5ndWFnZSIpIHx8ICJ0eXBlc2NyaXB0IgogICAgICAgIH0KICAgICAgfTsKICAgICAgdGhpcy5hcHBseUhpZ2hsaWdodGluZyhlbGVtZW50NCwgYmxvY2spOwogICAgfQogIH0KICBnZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCkgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmNvZGUtZWRpdG9yIik7CiAgICBpZiAoIWVkaXRvcikKICAgICAgcmV0dXJuIG51bGw7CiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkKICAgICAgcmV0dXJuIG51bGw7CiAgICBjb25zdCByYW5nZTIgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgIGlmICghZWRpdG9yLmNvbnRhaW5zKHJhbmdlMi5zdGFydENvbnRhaW5lcikpCiAgICAgIHJldHVybiBudWxsOwogICAgY29uc3QgcHJlQ2FyZXRSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICBwcmVDYXJldFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlZGl0b3IpOwogICAgcHJlQ2FyZXRSYW5nZS5zZXRFbmQocmFuZ2UyLnN0YXJ0Q29udGFpbmVyLCByYW5nZTIuc3RhcnRPZmZzZXQpOwogICAgcmV0dXJuIHByZUNhcmV0UmFuZ2UudG9TdHJpbmcoKS5sZW5ndGg7CiAgfQogIHNldEN1cnNvclRvU3RhcnQoZWxlbWVudDQpIHsKICAgIGNvbnN0IGVkaXRvciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5jb2RlLWVkaXRvciIpOwogICAgaWYgKGVkaXRvcikgewogICAgICBXeXNpd3lnU2VsZWN0aW9uLnNldEN1cnNvclBvc2l0aW9uKGVkaXRvciwgMCk7CiAgICB9CiAgfQogIHNldEN1cnNvclRvRW5kKGVsZW1lbnQ0KSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuY29kZS1lZGl0b3IiKTsKICAgIGlmIChlZGl0b3IpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gZWRpdG9yLnRleHRDb250ZW50Py5sZW5ndGggfHwgMDsKICAgICAgV3lzaXd5Z1NlbGVjdGlvbi5zZXRDdXJzb3JQb3NpdGlvbihlZGl0b3IsIGxlbmd0aCk7CiAgICB9CiAgfQogIGZvY3VzKGVsZW1lbnQ0KSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuY29kZS1lZGl0b3IiKTsKICAgIGVkaXRvcj8uZm9jdXMoKTsKICB9CiAgZm9jdXNXaXRoQ3Vyc29yKGVsZW1lbnQ0LCBwb3NpdGlvbjMgPSAiZW5kIikgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmNvZGUtZWRpdG9yIik7CiAgICBpZiAoIWVkaXRvcikKICAgICAgcmV0dXJuOwogICAgZWRpdG9yLmZvY3VzKCk7CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICBpZiAocG9zaXRpb24zID09PSAic3RhcnQiKSB7CiAgICAgICAgdGhpcy5zZXRDdXJzb3JUb1N0YXJ0KGVsZW1lbnQ0KTsKICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbjMgPT09ICJlbmQiKSB7CiAgICAgICAgdGhpcy5zZXRDdXJzb3JUb0VuZChlbGVtZW50NCk7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBvc2l0aW9uMyA9PT0gIm51bWJlciIpIHsKICAgICAgICBXeXNpd3lnU2VsZWN0aW9uLnNldEN1cnNvclBvc2l0aW9uKGVkaXRvciwgcG9zaXRpb24zKTsKICAgICAgfQogICAgfSk7CiAgfQogIGdldFNwbGl0Q29udGVudChlbGVtZW50NCkgewogICAgY29uc3QgcG9zaXRpb24zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCk7CiAgICBpZiAocG9zaXRpb24zID09PSBudWxsKQogICAgICByZXR1cm4gbnVsbDsKICAgIGNvbnN0IGNvbnRlbnQzID0gdGhpcy5nZXRDb250ZW50KGVsZW1lbnQ0KTsKICAgIHJldHVybiB7CiAgICAgIGJlZm9yZTogY29udGVudDMuc3Vic3RyaW5nKDAsIHBvc2l0aW9uMyksCiAgICAgIGFmdGVyOiBjb250ZW50My5zdWJzdHJpbmcocG9zaXRpb24zKQogICAgfTsKICB9CiAgZ2V0U3R5bGVzKCkgewogICAgcmV0dXJuIGAKICAgICAgLyogQ29kZSBCbG9jayBDb250YWluZXIgLSBNaW5pbWFsaXN0IHNoYWRjbiBzdHlsZSAqLwogICAgICAuY29kZS1ibG9jay1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtYXJnaW46IDEycHggMDsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzc0MTUxIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICB9CiAgICAgIAogICAgICAuY29kZS1ibG9jay1jb250YWluZXIuc2VsZWN0ZWQgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5Y2EzYWYiLCAiIzZiNzI4MCIpfTsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtYmxvY2stY29udGFpbmVyLmVkaXRpbmcgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2YjcyODAiLCAiIzljYTNhZiIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZhZmFmYSIsICIjMGEwYTBhIil9OwogICAgICB9CiAgICAgIAogICAgICAvKiBIZWFkZXIgLSBTaW1wbGlmaWVkICovCiAgICAgIC5jb2RlLWhlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzNzQxNTEiKX07CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQogICAgICAKICAgICAgLmxhbmd1YWdlLXNlbGVjdG9yIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNmI3MjgwIiwgIiM5Y2EzYWYiKX07CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07CiAgICAgICAgZm9udC1mYW1pbHk6ICR7Y3NzR2Vpc3RGb250RmFtaWx5fTsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgcGFkZGluZzogNHB4IDhweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQogICAgICAKICAgICAgLmxhbmd1YWdlLXNlbGVjdG9yOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y5ZmFmYiIsICIjMWYyOTM3Iil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzM3NDE1MSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzNzQxNTEiLCAiI2U1ZTdlYiIpfTsKICAgICAgfQogICAgICAKICAgICAgLmxhbmd1YWdlLXNlbGVjdG9yOmZvY3VzIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOWNhM2FmIiwgIiM2YjcyODAiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC8qIENvcHkgQnV0dG9uIC0gTWluaW1hbCAqLwogICAgICAuY29weS1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDRweDsKICAgICAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2YjcyODAiLCAiIzljYTNhZiIpfTsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC1mYW1pbHk6ICR7Y3NzR2Vpc3RGb250RmFtaWx5fTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQogICAgICAKICAgICAgLmNvcHktYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y5ZmFmYiIsICIjMWYyOTM3Iil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzM3NDE1MSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzNzQxNTEiLCAiI2U1ZTdlYiIpfTsKICAgICAgfQogICAgICAKICAgICAgLmNvcHktYnV0dG9uOmFjdGl2ZSB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk4KTsKICAgICAgfQogICAgICAKICAgICAgLmNvcHktYnV0dG9uLmNvcGllZCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDU5NjY5IiwgIiMxMGI5ODEiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5jb3B5LWljb24gewogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIG9wYWNpdHk6IDAuNzsKICAgICAgfQogICAgICAKICAgICAgLmNvcHktYnV0dG9uOmhvdmVyIC5jb3B5LWljb24gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb3B5LXRleHQgewogICAgICAgIG1pbi13aWR0aDogNDBweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KICAgICAgCiAgICAgIC8qIENvZGUgQm9keSAqLwogICAgICAuY29kZS1ib2R5IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZhZmFmYSIsICIjMGEwYTBhIil9OwogICAgICB9CiAgICAgIAogICAgICAvKiBMaW5lIE51bWJlcnMgLSBTdWJ0bGUgKi8KICAgICAgLmxpbmUtbnVtYmVycyB7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgcGFkZGluZzogMTJweCAwOwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIG1pbi13aWR0aDogNDBweDsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzc0MTUxIil9OwogICAgICB9CiAgICAgIAogICAgICAubGluZS1udW1iZXIgewogICAgICAgIHBhZGRpbmc6IDAgMTJweCAwIDhweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5Y2EzYWYiLCAiIzRiNTU2MyIpfTsKICAgICAgICBmb250LWZhbWlseTogJHtjc3NNb25vRm9udEZhbWlseX07CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgfQogICAgICAKICAgICAgLyogQ29kZSBDb250ZW50ICovCiAgICAgIC5jb2RlLWNvbnRlbnQgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgb3ZlcmZsb3cteDogYXV0bzsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2RlLXByZSB7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2RlLWVkaXRvciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LWZhbWlseTogJHtjc3NNb25vRm9udEZhbWlseX07CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzExMTgyNyIsICIjZjlmYWZiIil9OwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgbWluLWhlaWdodDogNjBweDsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQogICAgICAKICAgICAgLyogUGxhY2Vob2xkZXIgKi8KICAgICAgLmNvZGUtZWRpdG9yOmVtcHR5OjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICIvLyBUeXBlIG9yIHBhc3RlIGNvZGUgaGVyZS4uLiI7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOWNhM2FmIiwgIiM0YjU1NjMiKX07CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgICAgCiAgICAgIC8qIFdoZW4gZWRpdGluZyAoZm9jdXNlZCksIHNob3cgZ3JleSB0ZXh0IHdpdGhvdXQgaGlnaGxpZ2h0aW5nICovCiAgICAgIC5jb2RlLWJsb2NrLWNvbnRhaW5lci5lZGl0aW5nIC5jb2RlLWVkaXRvciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNmI3MjgwIiwgIiM5Y2EzYWYiKX0gIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtYmxvY2stY29udGFpbmVyLmVkaXRpbmcgLmNvZGUtZWRpdG9yICogewogICAgICAgIGNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC8qIFN5bnRheCBIaWdobGlnaHRpbmcgLSBNdXRlZCBjb2xvcnMgKi8KICAgICAgLmNvZGUtZWRpdG9yIC5obGpzLWtleXdvcmQgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2RjMjYyNiIsICIjZjg3MTcxIil9OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2RlLWVkaXRvciAuaGxqcy1zdHJpbmcgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA1OTY2OSIsICIjMTBiOTgxIil9OwogICAgICB9CiAgICAgIAogICAgICAuY29kZS1lZGl0b3IgLmhsanMtbnVtYmVyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3YzNhZWQiLCAiI2E3OGJmYSIpfTsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtZWRpdG9yIC5obGpzLWZ1bmN0aW9uIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyNTYzZWIiLCAiIzYwYTVmYSIpfTsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtZWRpdG9yIC5obGpzLWNvbW1lbnQgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzZiNzI4MCIsICIjNmI3MjgwIil9OwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtZWRpdG9yIC5obGpzLXZhcmlhYmxlLAogICAgICAuY29kZS1lZGl0b3IgLmhsanMtYXR0ciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZWE1ODBjIiwgIiNmYjkyM2MiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2RlLWVkaXRvciAuaGxqcy1jbGFzcywKICAgICAgLmNvZGUtZWRpdG9yIC5obGpzLXRpdGxlIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyNTYzZWIiLCAiIzYwYTVmYSIpfTsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICB9CiAgICAgIAogICAgICAuY29kZS1lZGl0b3IgLmhsanMtcGFyYW1zIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzNzQxNTEiLCAiI2U1ZTdlYiIpfTsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtZWRpdG9yIC5obGpzLWJ1aWx0X2luIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3YzNhZWQiLCAiI2E3OGJmYSIpfTsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtZWRpdG9yIC5obGpzLWxpdGVyYWwgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzdjM2FlZCIsICIjYTc4YmZhIil9OwogICAgICB9CiAgICAgIAogICAgICAuY29kZS1lZGl0b3IgLmhsanMtbWV0YSB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNmI3MjgwIiwgIiM5Y2EzYWYiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2RlLWVkaXRvciAuaGxqcy1wdW5jdHVhdGlvbiB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMzc0MTUxIiwgIiNkMWQ1ZGIiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2RlLWVkaXRvciAuaGxqcy10YWcgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2RjMjYyNiIsICIjZjg3MTcxIil9OwogICAgICB9CiAgICAgIAogICAgICAuY29kZS1lZGl0b3IgLmhsanMtYXR0cmlidXRlIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyNTYzZWIiLCAiIzYwYTVmYSIpfTsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtZWRpdG9yIC5obGpzLXNlbGVjdG9yLXRhZyB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZGMyNjI2IiwgIiNmODcxNzEiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2RlLWVkaXRvciAuaGxqcy1zZWxlY3Rvci1jbGFzcyB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMjU2M2ViIiwgIiM2MGE1ZmEiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2RlLWVkaXRvciAuaGxqcy1zZWxlY3Rvci1pZCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjN2MzYWVkIiwgIiNhNzhiZmEiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC8qIFNlbGVjdGlvbiAqLwogICAgICAuY29kZS1lZGl0b3I6OnNlbGVjdGlvbiwKICAgICAgLmNvZGUtZWRpdG9yICo6OnNlbGVjdGlvbiB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoOTksIDEwMiwgMjQxLCAwLjIpIiwgInJnYmEoOTksIDEwMiwgMjQxLCAwLjMpIil9OwogICAgICB9CiAgICAgIAogICAgICAvKiBTY3JvbGxiYXIgc3R5bGluZyAtIE1pbmltYWwgKi8KICAgICAgLmNvZGUtY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIGhlaWdodDogNnB4OwogICAgICB9CiAgICAgIAogICAgICAuY29kZS1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2RlLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2QxZDVkYiIsICIjNGI1NTYzIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOWNhM2FmIiwgIiM2YjcyODAiKX07CiAgICAgIH0KICAgIGA7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy9ibG9ja3MvdGV4dC9saXN0LmJsb2NrLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBMaXN0QmxvY2tIYW5kbGVyID0gY2xhc3MgZXh0ZW5kcyBCYXNlQmxvY2tIYW5kbGVyIHsKICB0eXBlID0gImxpc3QiOwogIC8vIFRyYWNrIGN1cnNvciBwb3NpdGlvbiBhbmQgbGlzdCBzdGF0ZQogIGxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gMDsKICBsYXN0U2VsZWN0ZWRUZXh0ID0gIiI7CiAgc2VsZWN0aW9uSGFuZGxlciA9IG51bGw7CiAgcmVuZGVyKGJsb2NrLCBpc1NlbGVjdGVkKSB7CiAgICBjb25zdCBzZWxlY3RlZENsYXNzID0gaXNTZWxlY3RlZCA/ICIgc2VsZWN0ZWQiIDogIiI7CiAgICBjb25zdCBsaXN0VHlwZSA9IGJsb2NrLm1ldGFkYXRhPy5saXN0VHlwZSB8fCAidW5vcmRlcmVkIjsKICAgIGNvbnN0IGxpc3RUYWcgPSBsaXN0VHlwZSA9PT0gIm9yZGVyZWQiID8gIm9sIiA6ICJ1bCI7CiAgICBjb25zdCBsaXN0Q29udGVudCA9IHRoaXMucmVuZGVyTGlzdENvbnRlbnQoYmxvY2suY29udGVudCwgYmxvY2subWV0YWRhdGEpOwogICAgcmV0dXJuIGAKICAgICAgPGRpdgogICAgICAgIGNsYXNzPSJibG9jayBsaXN0JHtzZWxlY3RlZENsYXNzfSIKICAgICAgICBjb250ZW50ZWRpdGFibGU9InRydWUiCiAgICAgICAgZGF0YS1ibG9jay1pZD0iJHtibG9jay5pZH0iCiAgICAgICAgZGF0YS1ibG9jay10eXBlPSIke2Jsb2NrLnR5cGV9IgogICAgICA+JHtsaXN0Q29udGVudH08L2Rpdj4KICAgIGA7CiAgfQogIHJlbmRlckxpc3RDb250ZW50KGNvbnRlbnQzLCBtZXRhZGF0YSkgewogICAgaWYgKCFjb250ZW50MykKICAgICAgcmV0dXJuICI8dWw+PGxpPjwvbGk+PC91bD4iOwogICAgY29uc3QgbGlzdFR5cGUgPSBtZXRhZGF0YT8ubGlzdFR5cGUgfHwgInVub3JkZXJlZCI7CiAgICBjb25zdCBsaXN0VGFnID0gbGlzdFR5cGUgPT09ICJvcmRlcmVkIiA/ICJvbCIgOiAidWwiOwogICAgY29uc3QgbGluZXMgPSBjb250ZW50My5zcGxpdCgiXG4iKS5maWx0ZXIoKGxpbmUpID0+IGxpbmUudHJpbSgpKTsKICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIGA8JHtsaXN0VGFnfT48bGk+PC9saT48LyR7bGlzdFRhZ30+YDsKICAgIH0KICAgIGNvbnN0IGxpc3RJdGVtcyA9IGxpbmVzLm1hcCgobGluZSkgPT4gYDxsaT4ke2xpbmV9PC9saT5gKS5qb2luKCIiKTsKICAgIHJldHVybiBgPCR7bGlzdFRhZ30+JHtsaXN0SXRlbXN9PC8ke2xpc3RUYWd9PmA7CiAgfQogIHNldHVwKGVsZW1lbnQ0LCBibG9jaywgaGFuZGxlcnMyKSB7CiAgICBjb25zdCBsaXN0QmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2subGlzdCIpOwogICAgaWYgKCFsaXN0QmxvY2spIHsKICAgICAgY29uc29sZS5lcnJvcigiTGlzdEJsb2NrSGFuZGxlci5zZXR1cDogTm8gbGlzdCBibG9jayBlbGVtZW50IGZvdW5kIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChibG9jay5jb250ZW50ICYmICFsaXN0QmxvY2suaW5uZXJIVE1MKSB7CiAgICAgIGxpc3RCbG9jay5pbm5lckhUTUwgPSB0aGlzLnJlbmRlckxpc3RDb250ZW50KGJsb2NrLmNvbnRlbnQsIGJsb2NrLm1ldGFkYXRhKTsKICAgIH0KICAgIGxpc3RCbG9jay5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIChlMTEpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uSW5wdXQoZTExKTsKICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCk7CiAgICAgIGlmIChwb3MgIT09IG51bGwpIHsKICAgICAgICB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gcG9zOwogICAgICB9CiAgICB9KTsKICAgIGxpc3RCbG9jay5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgKGUxMSkgPT4gewogICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KTsKICAgICAgaWYgKHBvcyAhPT0gbnVsbCkgewogICAgICAgIHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gPSBwb3M7CiAgICAgIH0KICAgICAgaWYgKGUxMS5rZXkgPT09ICJFbnRlciIgJiYgIWUxMS5zaGlmdEtleSkgewogICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkgewogICAgICAgICAgY29uc3QgcmFuZ2UyID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7CiAgICAgICAgICBjb25zdCBjdXJyZW50TGkgPSByYW5nZTIuc3RhcnRDb250YWluZXIucGFyZW50RWxlbWVudD8uY2xvc2VzdCgibGkiKTsKICAgICAgICAgIGlmIChjdXJyZW50TGkgJiYgY3VycmVudExpLnRleHRDb250ZW50ID09PSAiIikgewogICAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgaGFuZGxlcnMyLm9uS2V5RG93bihlMTEpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGhhbmRsZXJzMi5vbktleURvd24oZTExKTsKICAgIH0pOwogICAgbGlzdEJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwgKCkgPT4gewogICAgICBoYW5kbGVyczIub25Gb2N1cygpOwogICAgfSk7CiAgICBsaXN0QmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uQmx1cigpOwogICAgfSk7CiAgICBsaXN0QmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiY29tcG9zaXRpb25zdGFydCIsICgpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uQ29tcG9zaXRpb25TdGFydCgpOwogICAgfSk7CiAgICBsaXN0QmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiY29tcG9zaXRpb25lbmQiLCAoKSA9PiB7CiAgICAgIGhhbmRsZXJzMi5vbkNvbXBvc2l0aW9uRW5kKCk7CiAgICB9KTsKICAgIGxpc3RCbG9jay5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgKGUxMSkgPT4gewogICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KTsKICAgICAgaWYgKHBvcyAhPT0gbnVsbCkgewogICAgICAgIHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gPSBwb3M7CiAgICAgIH0KICAgICAgaGFuZGxlcnMyLm9uTW91c2VVcD8uKGUxMSk7CiAgICB9KTsKICAgIGxpc3RCbG9jay5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIChlMTEpID0+IHsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCk7CiAgICAgICAgaWYgKHBvcyAhPT0gbnVsbCkgewogICAgICAgICAgdGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IHBvczsKICAgICAgICB9CiAgICAgIH0sIDApOwogICAgfSk7CiAgICBsaXN0QmxvY2suYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLCAoZTExKSA9PiB7CiAgICAgIGNvbnN0IHBvcyA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQpOwogICAgICBpZiAocG9zICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IHBvczsKICAgICAgfQogICAgfSk7CiAgICB0aGlzLnNldHVwU2VsZWN0aW9uSGFuZGxlcihlbGVtZW50NCwgbGlzdEJsb2NrLCBibG9jayk7CiAgfQogIHNldHVwU2VsZWN0aW9uSGFuZGxlcihlbGVtZW50NCwgbGlzdEJsb2NrLCBibG9jaykgewogICAgY29uc3QgY2hlY2tTZWxlY3Rpb24gPSAoKSA9PiB7CiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTsKICAgICAgaWYgKHNlbGVjdGVkVGV4dC5sZW5ndGggPT09IDApIHsKICAgICAgICBpZiAodGhpcy5sYXN0U2VsZWN0ZWRUZXh0KSB7CiAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZFRleHQgPSAiIjsKICAgICAgICAgIHRoaXMuZGlzcGF0Y2hTZWxlY3Rpb25FdmVudChlbGVtZW50NCwgewogICAgICAgICAgICB0ZXh0OiAiIiwKICAgICAgICAgICAgYmxvY2tJZDogYmxvY2suaWQsCiAgICAgICAgICAgIGhhc1NlbGVjdGlvbjogZmFsc2UKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgd3lzaXd5Z0Jsb2NrMiA9IGxpc3RCbG9jay5nZXRSb290Tm9kZSgpLmhvc3Q7CiAgICAgIGNvbnN0IHBhcmVudENvbXBvbmVudCA9IHd5c2l3eWdCbG9jazI/LmNsb3Nlc3QoImRlZXMtaW5wdXQtd3lzaXd5ZyIpOwogICAgICBjb25zdCBwYXJlbnRTaGFkb3dSb290ID0gcGFyZW50Q29tcG9uZW50Py5zaGFkb3dSb290OwogICAgICBjb25zdCBibG9ja1NoYWRvd1Jvb3QgPSB3eXNpd3lnQmxvY2syPy5zaGFkb3dSb290OwogICAgICBjb25zdCBzaGFkb3dSb290cyA9IFtdOwogICAgICBpZiAocGFyZW50U2hhZG93Um9vdCkKICAgICAgICBzaGFkb3dSb290cy5wdXNoKHBhcmVudFNoYWRvd1Jvb3QpOwogICAgICBpZiAoYmxvY2tTaGFkb3dSb290KQogICAgICAgIHNoYWRvd1Jvb3RzLnB1c2goYmxvY2tTaGFkb3dSb290KTsKICAgICAgY29uc3Qgc2VsZWN0aW9uSW5mbyA9IFd5c2l3eWdTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uSW5mbyguLi5zaGFkb3dSb290cyk7CiAgICAgIGlmICghc2VsZWN0aW9uSW5mbykKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHN0YXJ0SW5CbG9jayA9IFd5c2l3eWdTZWxlY3Rpb24uY29udGFpbnNBY3Jvc3NTaGFkb3dET00obGlzdEJsb2NrLCBzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyKTsKICAgICAgY29uc3QgZW5kSW5CbG9jayA9IFd5c2l3eWdTZWxlY3Rpb24uY29udGFpbnNBY3Jvc3NTaGFkb3dET00obGlzdEJsb2NrLCBzZWxlY3Rpb25JbmZvLmVuZENvbnRhaW5lcik7CiAgICAgIGlmIChzdGFydEluQmxvY2sgfHwgZW5kSW5CbG9jaykgewogICAgICAgIGlmIChzZWxlY3RlZFRleHQgIT09IHRoaXMubGFzdFNlbGVjdGVkVGV4dCkgewogICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRUZXh0ID0gc2VsZWN0ZWRUZXh0OwogICAgICAgICAgY29uc3QgcmFuZ2UyID0gV3lzaXd5Z1NlbGVjdGlvbi5jcmVhdGVSYW5nZUZyb21JbmZvKHNlbGVjdGlvbkluZm8pOwogICAgICAgICAgY29uc3QgcmVjdCA9IHJhbmdlMi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgIHRoaXMuZGlzcGF0Y2hTZWxlY3Rpb25FdmVudChlbGVtZW50NCwgewogICAgICAgICAgICB0ZXh0OiBzZWxlY3RlZFRleHQudHJpbSgpLAogICAgICAgICAgICBibG9ja0lkOiBibG9jay5pZCwKICAgICAgICAgICAgcmFuZ2U6IHJhbmdlMiwKICAgICAgICAgICAgcmVjdCwKICAgICAgICAgICAgaGFzU2VsZWN0aW9uOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGhpcy5sYXN0U2VsZWN0ZWRUZXh0KSB7CiAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRUZXh0ID0gIiI7CiAgICAgICAgdGhpcy5kaXNwYXRjaFNlbGVjdGlvbkV2ZW50KGVsZW1lbnQ0LCB7CiAgICAgICAgICB0ZXh0OiAiIiwKICAgICAgICAgIGJsb2NrSWQ6IGJsb2NrLmlkLAogICAgICAgICAgaGFzU2VsZWN0aW9uOiBmYWxzZQogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIiwgY2hlY2tTZWxlY3Rpb24pOwogICAgdGhpcy5zZWxlY3Rpb25IYW5kbGVyID0gY2hlY2tTZWxlY3Rpb247CiAgICBjb25zdCB3eXNpd3lnQmxvY2sgPSBsaXN0QmxvY2suZ2V0Um9vdE5vZGUoKS5ob3N0OwogICAgaWYgKHd5c2l3eWdCbG9jaykgewogICAgICBjb25zdCBvcmlnaW5hbERpc2Nvbm5lY3RlZENhbGxiYWNrID0gd3lzaXd5Z0Jsb2NrLmRpc2Nvbm5lY3RlZENhbGxiYWNrOwogICAgICB3eXNpd3lnQmxvY2suZGlzY29ubmVjdGVkQ2FsbGJhY2sgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25IYW5kbGVyKSB7CiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3Rpb25jaGFuZ2UiLCB0aGlzLnNlbGVjdGlvbkhhbmRsZXIpOwogICAgICAgICAgdGhpcy5zZWxlY3Rpb25IYW5kbGVyID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKG9yaWdpbmFsRGlzY29ubmVjdGVkQ2FsbGJhY2spIHsKICAgICAgICAgIGF3YWl0IG9yaWdpbmFsRGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh3eXNpd3lnQmxvY2spOwogICAgICAgIH0KICAgICAgfS5iaW5kKHRoaXMpOwogICAgfQogIH0KICBkaXNwYXRjaFNlbGVjdGlvbkV2ZW50KGVsZW1lbnQ0LCBkZXRhaWwpIHsKICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCJibG9jay10ZXh0LXNlbGVjdGVkIiwgewogICAgICBkZXRhaWwsCiAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICB9KTsKICAgIGVsZW1lbnQ0LmRpc3BhdGNoRXZlbnQoZXZlbnQpOwogIH0KICBnZXRTdHlsZXMoKSB7CiAgICByZXR1cm4gYAogICAgICAvKiBMaXN0IHNwZWNpZmljIHN0eWxlcyAqLwogICAgICAuYmxvY2subGlzdCB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQogICAgICAKICAgICAgLmJsb2NrLmxpc3QgdWwsCiAgICAgIC5ibG9jay5saXN0IG9sIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAyNHB4OwogICAgICB9CiAgICAgIAogICAgICAuYmxvY2subGlzdCBsaSB7CiAgICAgICAgbWFyZ2luOiA0cHggMDsKICAgICAgICBsaW5lLWhlaWdodDogMS42OwogICAgICB9CiAgICAgIAogICAgICAuYmxvY2subGlzdCBsaTpsYXN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICB9CiAgICBgOwogIH0KICBnZXRQbGFjZWhvbGRlcigpIHsKICAgIHJldHVybiAiIjsKICB9CiAgLy8gSGVscGVyIG1ldGhvZHMgZm9yIGxpc3QgZnVuY3Rpb25hbGl0eQogIGdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgbGlzdEJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLmxpc3QiKTsKICAgIGlmICghbGlzdEJsb2NrKQogICAgICByZXR1cm4gbnVsbDsKICAgIGNvbnN0IHd5c2l3eWdCbG9jayA9IGNvbnRleHQyPy5jb21wb25lbnQ7CiAgICBjb25zdCBwYXJlbnRDb21wb25lbnQgPSB3eXNpd3lnQmxvY2s/LmNsb3Nlc3QoImRlZXMtaW5wdXQtd3lzaXd5ZyIpOwogICAgY29uc3QgcGFyZW50U2hhZG93Um9vdCA9IHBhcmVudENvbXBvbmVudD8uc2hhZG93Um9vdDsKICAgIGNvbnN0IGJsb2NrU2hhZG93Um9vdCA9IGNvbnRleHQyPy5zaGFkb3dSb290OwogICAgY29uc3Qgc2hhZG93Um9vdHMgPSBbXTsKICAgIGlmIChwYXJlbnRTaGFkb3dSb290KQogICAgICBzaGFkb3dSb290cy5wdXNoKHBhcmVudFNoYWRvd1Jvb3QpOwogICAgaWYgKGJsb2NrU2hhZG93Um9vdCkKICAgICAgc2hhZG93Um9vdHMucHVzaChibG9ja1NoYWRvd1Jvb3QpOwogICAgY29uc3Qgc2VsZWN0aW9uSW5mbyA9IFd5c2l3eWdTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uSW5mbyguLi5zaGFkb3dSb290cyk7CiAgICBpZiAoIXNlbGVjdGlvbkluZm8pCiAgICAgIHJldHVybiBudWxsOwogICAgaWYgKCFXeXNpd3lnU2VsZWN0aW9uLmNvbnRhaW5zQWNyb3NzU2hhZG93RE9NKGxpc3RCbG9jaywgc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lcikpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBwcmVDYXJldFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgIHByZUNhcmV0UmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGxpc3RCbG9jayk7CiAgICBwcmVDYXJldFJhbmdlLnNldEVuZChzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyLCBzZWxlY3Rpb25JbmZvLnN0YXJ0T2Zmc2V0KTsKICAgIHJldHVybiBwcmVDYXJldFJhbmdlLnRvU3RyaW5nKCkubGVuZ3RoOwogIH0KICBnZXRDb250ZW50KGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgbGlzdEJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLmxpc3QiKTsKICAgIGlmICghbGlzdEJsb2NrKQogICAgICByZXR1cm4gIiI7CiAgICBjb25zdCBsaXN0SXRlbXMgPSBsaXN0QmxvY2sucXVlcnlTZWxlY3RvckFsbCgibGkiKTsKICAgIGNvbnN0IGNvbnRlbnQzID0gQXJyYXkuZnJvbShsaXN0SXRlbXMpLm1hcCgobGkyKSA9PiBsaTIudGV4dENvbnRlbnQgfHwgIiIpLmpvaW4oIlxuIik7CiAgICByZXR1cm4gY29udGVudDM7CiAgfQogIHNldENvbnRlbnQoZWxlbWVudDQsIGNvbnRlbnQzLCBjb250ZXh0MikgewogICAgY29uc3QgbGlzdEJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLmxpc3QiKTsKICAgIGlmICghbGlzdEJsb2NrKQogICAgICByZXR1cm47CiAgICBjb25zdCBoYWRGb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGxpc3RCbG9jayB8fCBlbGVtZW50NC5zaGFkb3dSb290Py5hY3RpdmVFbGVtZW50ID09PSBsaXN0QmxvY2s7CiAgICBjb25zdCBsaXN0RWxlbWVudCA9IGxpc3RCbG9jay5xdWVyeVNlbGVjdG9yKCJ1bCwgb2wiKTsKICAgIGNvbnN0IGlzT3JkZXJlZCA9IGxpc3RFbGVtZW50Py50YWdOYW1lID09PSAiT0wiOwogICAgbGlzdEJsb2NrLmlubmVySFRNTCA9IHRoaXMucmVuZGVyTGlzdENvbnRlbnQoY29udGVudDMsIHsgbGlzdFR5cGU6IGlzT3JkZXJlZCA/ICJvcmRlcmVkIiA6ICJ1bm9yZGVyZWQiIH0pOwogICAgaWYgKGhhZEZvY3VzKSB7CiAgICAgIGxpc3RCbG9jay5mb2N1cygpOwogICAgfQogIH0KICBzZXRDdXJzb3JUb1N0YXJ0KGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgbGlzdEJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLmxpc3QiKTsKICAgIGlmICghbGlzdEJsb2NrKQogICAgICByZXR1cm47CiAgICBjb25zdCBmaXJzdExpID0gbGlzdEJsb2NrLnF1ZXJ5U2VsZWN0b3IoImxpIik7CiAgICBpZiAoZmlyc3RMaSkgewogICAgICBjb25zdCB0ZXh0Tm9kZSA9IHRoaXMuZ2V0Rmlyc3RUZXh0Tm9kZShmaXJzdExpKTsKICAgICAgaWYgKHRleHROb2RlKSB7CiAgICAgICAgY29uc3QgcmFuZ2UyID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgcmFuZ2UyLnNldFN0YXJ0KHRleHROb2RlLCAwKTsKICAgICAgICByYW5nZTIuc2V0RW5kKHRleHROb2RlLCAwKTsKICAgICAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UyKTsKICAgICAgfQogICAgfQogIH0KICBzZXRDdXJzb3JUb0VuZChlbGVtZW50NCwgY29udGV4dDIpIHsKICAgIGNvbnN0IGxpc3RCbG9jayA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jay5saXN0Iik7CiAgICBpZiAoIWxpc3RCbG9jaykKICAgICAgcmV0dXJuOwogICAgY29uc3QgbGFzdExpID0gbGlzdEJsb2NrLnF1ZXJ5U2VsZWN0b3IoImxpOmxhc3QtY2hpbGQiKTsKICAgIGlmIChsYXN0TGkpIHsKICAgICAgY29uc3QgdGV4dE5vZGUgPSB0aGlzLmdldExhc3RUZXh0Tm9kZShsYXN0TGkpOwogICAgICBpZiAodGV4dE5vZGUpIHsKICAgICAgICBjb25zdCByYW5nZTIgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICBjb25zdCB0ZXh0TGVuZ3RoID0gdGV4dE5vZGUudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwOwogICAgICAgIHJhbmdlMi5zZXRTdGFydCh0ZXh0Tm9kZSwgdGV4dExlbmd0aCk7CiAgICAgICAgcmFuZ2UyLnNldEVuZCh0ZXh0Tm9kZSwgdGV4dExlbmd0aCk7CiAgICAgICAgc2VsZWN0aW9uPy5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICBzZWxlY3Rpb24/LmFkZFJhbmdlKHJhbmdlMik7CiAgICAgIH0KICAgIH0KICB9CiAgZ2V0Rmlyc3RUZXh0Tm9kZShlbGVtZW50NCkgewogICAgaWYgKGVsZW1lbnQ0Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICByZXR1cm4gZWxlbWVudDQ7CiAgICB9CiAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBlbGVtZW50NC5jaGlsZE5vZGVzLmxlbmd0aDsgaTExKyspIHsKICAgICAgY29uc3QgZmlyc3RUZXh0ID0gdGhpcy5nZXRGaXJzdFRleHROb2RlKGVsZW1lbnQ0LmNoaWxkTm9kZXNbaTExXSk7CiAgICAgIGlmIChmaXJzdFRleHQpCiAgICAgICAgcmV0dXJuIGZpcnN0VGV4dDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBnZXRMYXN0VGV4dE5vZGUoZWxlbWVudDQpIHsKICAgIGlmIChlbGVtZW50NC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHsKICAgICAgcmV0dXJuIGVsZW1lbnQ0OwogICAgfQogICAgZm9yIChsZXQgaTExID0gZWxlbWVudDQuY2hpbGROb2Rlcy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgICAgY29uc3QgbGFzdFRleHQgPSB0aGlzLmdldExhc3RUZXh0Tm9kZShlbGVtZW50NC5jaGlsZE5vZGVzW2kxMV0pOwogICAgICBpZiAobGFzdFRleHQpCiAgICAgICAgcmV0dXJuIGxhc3RUZXh0OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGZvY3VzKGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgbGlzdEJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLmxpc3QiKTsKICAgIGlmICghbGlzdEJsb2NrKQogICAgICByZXR1cm47CiAgICBpZiAoIWxpc3RCbG9jay5oYXNBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIpKSB7CiAgICAgIGxpc3RCbG9jay5zZXRBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIsICJ0cnVlIik7CiAgICB9CiAgICBsaXN0QmxvY2suZm9jdXMoKTsKICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSBsaXN0QmxvY2sgJiYgZWxlbWVudDQuc2hhZG93Um9vdD8uYWN0aXZlRWxlbWVudCAhPT0gbGlzdEJsb2NrKSB7CiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gewogICAgICAgIGxpc3RCbG9jay5mb2N1cygpOwogICAgICB9KTsKICAgIH0KICB9CiAgZm9jdXNXaXRoQ3Vyc29yKGVsZW1lbnQ0LCBwb3NpdGlvbjMgPSAiZW5kIiwgY29udGV4dDIpIHsKICAgIGNvbnN0IGxpc3RCbG9jayA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jay5saXN0Iik7CiAgICBpZiAoIWxpc3RCbG9jaykKICAgICAgcmV0dXJuOwogICAgaWYgKCFsaXN0QmxvY2suaGFzQXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiKSkgewogICAgICBsaXN0QmxvY2suc2V0QXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiLCAidHJ1ZSIpOwogICAgfQogICAgbGlzdEJsb2NrLmZvY3VzKCk7CiAgICBjb25zdCBzZXRDdXJzb3IgPSAoKSA9PiB7CiAgICAgIGlmIChwb3NpdGlvbjMgPT09ICJzdGFydCIpIHsKICAgICAgICB0aGlzLnNldEN1cnNvclRvU3RhcnQoZWxlbWVudDQsIGNvbnRleHQyKTsKICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbjMgPT09ICJlbmQiKSB7CiAgICAgICAgdGhpcy5zZXRDdXJzb3JUb0VuZChlbGVtZW50NCwgY29udGV4dDIpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwb3NpdGlvbjMgPT09ICJudW1iZXIiKSB7CiAgICAgICAgdGhpcy5zZXRDdXJzb3JUb0VuZChlbGVtZW50NCwgY29udGV4dDIpOwogICAgICB9CiAgICB9OwogICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGxpc3RCbG9jayB8fCBlbGVtZW50NC5zaGFkb3dSb290Py5hY3RpdmVFbGVtZW50ID09PSBsaXN0QmxvY2spIHsKICAgICAgc2V0Q3Vyc29yKCk7CiAgICB9IGVsc2UgewogICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHsKICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gbGlzdEJsb2NrIHx8IGVsZW1lbnQ0LnNoYWRvd1Jvb3Q/LmFjdGl2ZUVsZW1lbnQgPT09IGxpc3RCbG9jaykgewogICAgICAgICAgc2V0Q3Vyc29yKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9CiAgZ2V0U3BsaXRDb250ZW50KGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgbGlzdEJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLmxpc3QiKTsKICAgIGlmICghbGlzdEJsb2NrKQogICAgICByZXR1cm4gbnVsbDsKICAgIHJldHVybiBudWxsOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvYmxvY2tzL21lZGlhL2ltYWdlLmJsb2NrLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBJbWFnZUJsb2NrSGFuZGxlciA9IGNsYXNzIGV4dGVuZHMgQmFzZUJsb2NrSGFuZGxlciB7CiAgdHlwZSA9ICJpbWFnZSI7CiAgcmVuZGVyKGJsb2NrLCBpc1NlbGVjdGVkKSB7CiAgICBjb25zdCBpbWFnZVVybCA9IGJsb2NrLm1ldGFkYXRhPy51cmw7CiAgICBjb25zdCBhbHRUZXh0ID0gYmxvY2suY29udGVudCB8fCAiSW1hZ2UiOwogICAgY29uc3QgaXNMb2FkaW5nID0gYmxvY2subWV0YWRhdGE/LmxvYWRpbmc7CiAgICByZXR1cm4gYAogICAgICA8ZGl2IGNsYXNzPSJpbWFnZS1ibG9jay1jb250YWluZXIke2lzU2VsZWN0ZWQgPyAiIHNlbGVjdGVkIiA6ICIifSIgCiAgICAgICAgICAgZGF0YS1ibG9jay1pZD0iJHtibG9jay5pZH0iCiAgICAgICAgICAgZGF0YS1oYXMtaW1hZ2U9IiR7ISFpbWFnZVVybH0iCiAgICAgICAgICAgdGFiaW5kZXg9IjAiPgogICAgICAgICR7aXNMb2FkaW5nID8gdGhpcy5yZW5kZXJMb2FkaW5nKCkgOiBpbWFnZVVybCA/IHRoaXMucmVuZGVySW1hZ2UoaW1hZ2VVcmwsIGFsdFRleHQpIDogdGhpcy5yZW5kZXJQbGFjZWhvbGRlcigpfQogICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiAKICAgICAgICAgICAgICAgY2xhc3M9ImltYWdlLWZpbGUtaW5wdXQiIAogICAgICAgICAgICAgICBhY2NlcHQ9ImltYWdlLyoiIAogICAgICAgICAgICAgICBzdHlsZT0iZGlzcGxheTogbm9uZTsiIC8+CiAgICAgIDwvZGl2PgogICAgYDsKICB9CiAgcmVuZGVyUGxhY2Vob2xkZXIoKSB7CiAgICByZXR1cm4gYAogICAgICA8ZGl2IGNsYXNzPSJpbWFnZS11cGxvYWQtcGxhY2Vob2xkZXIiIHN0eWxlPSJjdXJzb3I6IHBvaW50ZXI7Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJ1cGxvYWQtaWNvbiIgc3R5bGU9InBvaW50ZXItZXZlbnRzOiBub25lOyI+CiAgICAgICAgICA8c3ZnIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxLjUiPgogICAgICAgICAgICA8cmVjdCB4PSIzIiB5PSIzIiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHJ4PSIyIiByeT0iMiIvPgogICAgICAgICAgICA8Y2lyY2xlIGN4PSI4LjUiIGN5PSI4LjUiIHI9IjEuNSIvPgogICAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPSIyMSAxNSAxNiAxMCA1IDIxIi8+CiAgICAgICAgICA8L3N2Zz4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJ1cGxvYWQtdGV4dCIgc3R5bGU9InBvaW50ZXItZXZlbnRzOiBub25lOyI+Q2xpY2sgdG8gdXBsb2FkIGFuIGltYWdlPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0idXBsb2FkLWhpbnQiIHN0eWxlPSJwb2ludGVyLWV2ZW50czogbm9uZTsiPm9yIGRyYWcgYW5kIGRyb3A8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICByZW5kZXJJbWFnZSh1cmwsIGFsdFRleHQpIHsKICAgIHJldHVybiBgCiAgICAgIDxkaXYgY2xhc3M9ImltYWdlLWNvbnRhaW5lciI+CiAgICAgICAgPGltZyBzcmM9IiR7dXJsfSIgYWx0PSIke3RoaXMuZXNjYXBlSHRtbChhbHRUZXh0KX0iIC8+CiAgICAgIDwvZGl2PgogICAgYDsKICB9CiAgcmVuZGVyTG9hZGluZygpIHsKICAgIHJldHVybiBgCiAgICAgIDxkaXYgY2xhc3M9ImltYWdlLWxvYWRpbmciPgogICAgICAgIDxkaXYgY2xhc3M9ImxvYWRpbmctc3Bpbm5lciI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibG9hZGluZy10ZXh0Ij5VcGxvYWRpbmcgaW1hZ2UuLi48L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICBzZXR1cChlbGVtZW50NCwgYmxvY2ssIGhhbmRsZXJzMikgewogICAgY29uc3QgY29udGFpbmVyID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmltYWdlLWJsb2NrLWNvbnRhaW5lciIpOwogICAgY29uc3QgZmlsZUlucHV0ID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmltYWdlLWZpbGUtaW5wdXQiKTsKICAgIGlmICghY29udGFpbmVyKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkltYWdlQmxvY2tIYW5kbGVyOiBDb3VsZCBub3QgZmluZCBjb250YWluZXIiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCFmaWxlSW5wdXQpIHsKICAgICAgY29uc29sZS5lcnJvcigiSW1hZ2VCbG9ja0hhbmRsZXI6IENvdWxkIG5vdCBmaW5kIGZpbGUgaW5wdXQiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcGxhY2Vob2xkZXIgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmltYWdlLXVwbG9hZC1wbGFjZWhvbGRlciIpOwogICAgaWYgKHBsYWNlaG9sZGVyKSB7CiAgICAgIHBsYWNlaG9sZGVyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUxMSkgPT4gewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICBjb25zb2xlLmxvZygiSW1hZ2VCbG9ja0hhbmRsZXI6IFBsYWNlaG9sZGVyIGNsaWNrZWQsIG9wZW5pbmcgZmlsZSBzZWxlY3RvciIpOwogICAgICAgIGZpbGVJbnB1dC5jbGljaygpOwogICAgICB9KTsKICAgIH0KICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uRm9jdXMoKTsKICAgIH0pOwogICAgZmlsZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGFzeW5jIChlMTEpID0+IHsKICAgICAgY29uc3QgaW5wdXQgPSBlMTEudGFyZ2V0OwogICAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXM/LlswXTsKICAgICAgaWYgKGZpbGUpIHsKICAgICAgICBjb25zb2xlLmxvZygiSW1hZ2VCbG9ja0hhbmRsZXI6IEZpbGUgc2VsZWN0ZWQ6IiwgZmlsZS5uYW1lKTsKICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZpbGVVcGxvYWQoZmlsZSwgYmxvY2ssIGhhbmRsZXJzMik7CiAgICAgIH0KICAgIH0pOwogICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdvdmVyIiwgKGUxMSkgPT4gewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBpZiAoIWJsb2NrLm1ldGFkYXRhPy51cmwpIHsKICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgiZHJhZy1vdmVyIik7CiAgICAgIH0KICAgIH0pOwogICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdsZWF2ZSIsIChlMTEpID0+IHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoImRyYWctb3ZlciIpOwogICAgfSk7CiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigiZHJvcCIsIGFzeW5jIChlMTEpID0+IHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoImRyYWctb3ZlciIpOwogICAgICBjb25zdCBmaWxlID0gZTExLmRhdGFUcmFuc2Zlcj8uZmlsZXNbMF07CiAgICAgIGlmIChmaWxlICYmIGZpbGUudHlwZS5zdGFydHNXaXRoKCJpbWFnZS8iKSAmJiAhYmxvY2subWV0YWRhdGE/LnVybCkgewogICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRmlsZVVwbG9hZChmaWxlLCBibG9jaywgaGFuZGxlcnMyKTsKICAgICAgfQogICAgfSk7CiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLCAoKSA9PiBoYW5kbGVyczIub25Gb2N1cygpKTsKICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgKCkgPT4gaGFuZGxlcnMyLm9uQmx1cigpKTsKICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgKGUxMSkgPT4gewogICAgICBpZiAoZTExLmtleSA9PT0gIkRlbGV0ZSIgfHwgZTExLmtleSA9PT0gIkJhY2tzcGFjZSIpIHsKICAgICAgICBpZiAoYmxvY2subWV0YWRhdGE/LnVybCkgewogICAgICAgICAgYmxvY2subWV0YWRhdGEudXJsID0gdm9pZCAwOwogICAgICAgICAgYmxvY2subWV0YWRhdGEubG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgYmxvY2suY29udGVudCA9ICIiOwogICAgICAgICAgaGFuZGxlcnMyLm9uSW5wdXQobmV3IElucHV0RXZlbnQoImlucHV0IikpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICBoYW5kbGVyczIub25LZXlEb3duKGUxMSk7CiAgICB9KTsKICB9CiAgYXN5bmMgaGFuZGxlRmlsZVVwbG9hZChmaWxlLCBibG9jaywgaGFuZGxlcnMyKSB7CiAgICBjb25zb2xlLmxvZygiSW1hZ2VCbG9ja0hhbmRsZXI6IFN0YXJ0aW5nIGZpbGUgdXBsb2FkIiwgewogICAgICBmaWxlTmFtZTogZmlsZS5uYW1lLAogICAgICBmaWxlU2l6ZTogZmlsZS5zaXplLAogICAgICBibG9ja0lkOiBibG9jay5pZAogICAgfSk7CiAgICBpZiAoIWZpbGUudHlwZS5zdGFydHNXaXRoKCJpbWFnZS8iKSkgewogICAgICBjb25zb2xlLmVycm9yKCJJbnZhbGlkIGZpbGUgdHlwZToiLCBmaWxlLnR5cGUpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBtYXhTaXplID0gMTAgKiAxMDI0ICogMTAyNDsKICAgIGlmIChmaWxlLnNpemUgPiBtYXhTaXplKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkZpbGUgdG9vIGxhcmdlLiBNYXhpbXVtIHNpemUgaXMgMTBNQiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIWJsb2NrLm1ldGFkYXRhKQogICAgICBibG9jay5tZXRhZGF0YSA9IHt9OwogICAgYmxvY2subWV0YWRhdGEubG9hZGluZyA9IHRydWU7CiAgICBibG9jay5tZXRhZGF0YS5maWxlTmFtZSA9IGZpbGUubmFtZTsKICAgIGJsb2NrLm1ldGFkYXRhLmZpbGVTaXplID0gZmlsZS5zaXplOwogICAgYmxvY2subWV0YWRhdGEubWltZVR5cGUgPSBmaWxlLnR5cGU7CiAgICBjb25zb2xlLmxvZygiSW1hZ2VCbG9ja0hhbmRsZXI6IFNldCBsb2FkaW5nIHN0YXRlLCByZXF1ZXN0aW5nIHVwZGF0ZSIpOwogICAgaGFuZGxlcnMyLm9uUmVxdWVzdFVwZGF0ZT8uKCk7CiAgICB0cnkgewogICAgICBjb25zdCBkYXRhVXJsID0gYXdhaXQgdGhpcy5maWxlVG9EYXRhVXJsKGZpbGUpOwogICAgICBibG9jay5tZXRhZGF0YS51cmwgPSBkYXRhVXJsOwogICAgICBibG9jay5tZXRhZGF0YS5sb2FkaW5nID0gZmFsc2U7CiAgICAgIGNvbnN0IG5hbWVXaXRob3V0RXh0ID0gZmlsZS5uYW1lLnJlcGxhY2UoL1wuW14vLl0rJC8sICIiKTsKICAgICAgYmxvY2suY29udGVudCA9IG5hbWVXaXRob3V0RXh0OwogICAgICBjb25zb2xlLmxvZygiSW1hZ2VCbG9ja0hhbmRsZXI6IFVwbG9hZCBjb21wbGV0ZSwgcmVxdWVzdGluZyB1cGRhdGUiLCB7CiAgICAgICAgaGFzVXJsOiAhIWJsb2NrLm1ldGFkYXRhLnVybCwKICAgICAgICB1cmxMZW5ndGg6IGRhdGFVcmwubGVuZ3RoLAogICAgICAgIGFsdFRleHQ6IGJsb2NrLmNvbnRlbnQKICAgICAgfSk7CiAgICAgIGhhbmRsZXJzMi5vblJlcXVlc3RVcGRhdGU/LigpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHVwbG9hZCBpbWFnZToiLCBlcnJvcik7CiAgICAgIGJsb2NrLm1ldGFkYXRhLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgaGFuZGxlcnMyLm9uUmVxdWVzdFVwZGF0ZT8uKCk7CiAgICB9CiAgfQogIGZpbGVUb0RhdGFVcmwoZmlsZSkgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0KSA9PiB7CiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZTExKSA9PiB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gZTExLnRhcmdldD8ucmVzdWx0OwogICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAic3RyaW5nIikgewogICAgICAgICAgcmVzb2x2ZTIocmVzdWx0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcigiRmFpbGVkIHRvIHJlYWQgZmlsZSIpKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJlYWRlci5vbmVycm9yID0gcmVqZWN0OwogICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTsKICAgIH0pOwogIH0KICBlc2NhcGVIdG1sKHRleHQ5KSB7CiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIGRpdi50ZXh0Q29udGVudCA9IHRleHQ5OwogICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7CiAgfQogIGdldENvbnRlbnQoZWxlbWVudDQpIHsKICAgIGNvbnN0IGJsb2NrID0gdGhpcy5nZXRCbG9ja0Zyb21FbGVtZW50KGVsZW1lbnQ0KTsKICAgIHJldHVybiBibG9jaz8uY29udGVudCB8fCAiIjsKICB9CiAgc2V0Q29udGVudChlbGVtZW50NCwgY29udGVudDMpIHsKICAgIGNvbnN0IGJsb2NrID0gdGhpcy5nZXRCbG9ja0Zyb21FbGVtZW50KGVsZW1lbnQ0KTsKICAgIGlmIChibG9jaykgewogICAgICBibG9jay5jb250ZW50ID0gY29udGVudDM7CiAgICB9CiAgfQogIGdldEJsb2NrRnJvbUVsZW1lbnQoZWxlbWVudDQpIHsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5pbWFnZS1ibG9jay1jb250YWluZXIiKTsKICAgIGNvbnN0IGJsb2NrSWQgPSBjb250YWluZXI/LmdldEF0dHJpYnV0ZSgiZGF0YS1ibG9jay1pZCIpOwogICAgaWYgKCFibG9ja0lkKQogICAgICByZXR1cm4gbnVsbDsKICAgIHJldHVybiB7CiAgICAgIGlkOiBibG9ja0lkLAogICAgICB0eXBlOiAiaW1hZ2UiLAogICAgICBjb250ZW50OiAiIiwKICAgICAgbWV0YWRhdGE6IHt9CiAgICB9OwogIH0KICBnZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHNldEN1cnNvclRvU3RhcnQoZWxlbWVudDQpIHsKICAgIHRoaXMuZm9jdXMoZWxlbWVudDQpOwogIH0KICBzZXRDdXJzb3JUb0VuZChlbGVtZW50NCkgewogICAgdGhpcy5mb2N1cyhlbGVtZW50NCk7CiAgfQogIGZvY3VzKGVsZW1lbnQ0KSB7CiAgICBjb25zdCBjb250YWluZXIgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuaW1hZ2UtYmxvY2stY29udGFpbmVyIik7CiAgICBjb250YWluZXI/LmZvY3VzKCk7CiAgfQogIGZvY3VzV2l0aEN1cnNvcihlbGVtZW50NCwgcG9zaXRpb24zID0gImVuZCIpIHsKICAgIHRoaXMuZm9jdXMoZWxlbWVudDQpOwogIH0KICBnZXRTcGxpdENvbnRlbnQoZWxlbWVudDQpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBnZXRTdHlsZXMoKSB7CiAgICByZXR1cm4gYAogICAgICAvKiBJbWFnZSBCbG9jayBDb250YWluZXIgKi8KICAgICAgLmltYWdlLWJsb2NrLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1hcmdpbjogMTJweCAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIAogICAgICAuaW1hZ2UtYmxvY2stY29udGFpbmVyLnNlbGVjdGVkIHsKICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2MzY2ZjEiLCAiIzgxOGNmOCIpfTsKICAgICAgfQogICAgICAKICAgICAgLyogVXBsb2FkIFBsYWNlaG9sZGVyICovCiAgICAgIC5pbWFnZS11cGxvYWQtcGxhY2Vob2xkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHBhZGRpbmc6IDQ4cHggMjRweDsKICAgICAgICBib3JkZXI6IDJweCBkYXNoZWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzM3NDE1MSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmYWZhZmEiLCAiIzBhMGEwYSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQogICAgICAKICAgICAgLmltYWdlLWJsb2NrLWNvbnRhaW5lcjpob3ZlciAuaW1hZ2UtdXBsb2FkLXBsYWNlaG9sZGVyIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOWNhM2FmIiwgIiM2YjcyODAiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOWZhZmIiLCAiIzExMTgyNyIpfTsKICAgICAgfQogICAgICAKICAgICAgLmltYWdlLWJsb2NrLWNvbnRhaW5lci5kcmFnLW92ZXIgLmltYWdlLXVwbG9hZC1wbGFjZWhvbGRlciB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzYzNjZmMSIsICIjODE4Y2Y4Iil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZWZmNmZmIiwgIiMxZTFiNGIiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC51cGxvYWQtaWNvbiB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5Y2EzYWYiLCAiIzRiNTU2MyIpfTsKICAgICAgfQogICAgICAKICAgICAgLnVwbG9hZC10ZXh0IHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzNzQxNTEiLCAiI2U1ZTdlYiIpfTsKICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC51cGxvYWQtaGludCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzljYTNhZiIsICIjNmI3MjgwIil9OwogICAgICB9CiAgICAgIAogICAgICAvKiBJbWFnZSBDb250YWluZXIgKi8KICAgICAgLmltYWdlLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIG1pbi1oZWlnaHQ6IDIwMHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjlmYWZiIiwgIiMxMTE4MjciKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5pbWFnZS1jb250YWluZXIgaW1nIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgfQogICAgICAKICAgICAgLyogTG9hZGluZyBTdGF0ZSAqLwogICAgICAuaW1hZ2UtbG9hZGluZyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgcGFkZGluZzogNDhweCAyNHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmFmYWZhIiwgIiMwYTBhMGEiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5sb2FkaW5nLXNwaW5uZXIgewogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBib3JkZXI6IDNweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzc0MTUxIil9OwogICAgICAgIGJvcmRlci10b3AtY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNjM2NmYxIiwgIiM4MThjZjgiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGFuaW1hdGlvbjogc3BpbiAwLjhzIGxpbmVhciBpbmZpbml0ZTsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICB9CiAgICAgIAogICAgICBAa2V5ZnJhbWVzIHNwaW4gewogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfQogICAgICB9CiAgICAgIAogICAgICAubG9hZGluZy10ZXh0IHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNmI3MjgwIiwgIiM5Y2EzYWYiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC8qIEZpbGUgaW5wdXQgaGlkZGVuICovCiAgICAgIC5pbWFnZS1maWxlLWlucHV0IHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIGA7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy9ibG9ja3MvbWVkaWEveW91dHViZS5ibG9jay5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgWW91VHViZUJsb2NrSGFuZGxlciA9IGNsYXNzIGV4dGVuZHMgQmFzZUJsb2NrSGFuZGxlciB7CiAgdHlwZSA9ICJ5b3V0dWJlIjsKICByZW5kZXIoYmxvY2ssIGlzU2VsZWN0ZWQpIHsKICAgIGNvbnN0IHZpZGVvSWQgPSBibG9jay5tZXRhZGF0YT8udmlkZW9JZDsKICAgIGNvbnN0IHVybCA9IGJsb2NrLm1ldGFkYXRhPy51cmwgfHwgIiI7CiAgICByZXR1cm4gYAogICAgICA8ZGl2IGNsYXNzPSJ5b3V0dWJlLWJsb2NrLWNvbnRhaW5lciR7aXNTZWxlY3RlZCA/ICIgc2VsZWN0ZWQiIDogIiJ9IiAKICAgICAgICAgICBkYXRhLWJsb2NrLWlkPSIke2Jsb2NrLmlkfSIKICAgICAgICAgICBkYXRhLWhhcy12aWRlbz0iJHshIXZpZGVvSWR9Ij4KICAgICAgICAke3ZpZGVvSWQgPyB0aGlzLnJlbmRlclZpZGVvKHZpZGVvSWQpIDogdGhpcy5yZW5kZXJQbGFjZWhvbGRlcih1cmwpfQogICAgICA8L2Rpdj4KICAgIGA7CiAgfQogIHJlbmRlclBsYWNlaG9sZGVyKHVybCkgewogICAgcmV0dXJuIGAKICAgICAgPGRpdiBjbGFzcz0ieW91dHViZS1wbGFjZWhvbGRlciI+CiAgICAgICAgPGRpdiBjbGFzcz0icGxhY2Vob2xkZXItaWNvbiI+CiAgICAgICAgICA8c3ZnIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJjdXJyZW50Q29sb3IiPgogICAgICAgICAgICA8cGF0aCBkPSJNMTkuNjE1IDMuMTg0Yy0zLjYwNC0uMjQ2LTExLjYzMS0uMjQ1LTE1LjIzIDAtMy44OTcuMjY2LTQuMzU2IDIuNjItNC4zODUgOC44MTYuMDI5IDYuMTg1LjQ4NCA4LjU0OSA0LjM4NSA4LjgxNiAzLjYuMjQ1IDExLjYyNi4yNDYgMTUuMjMgMCAzLjg5Ny0uMjY2IDQuMzU2LTIuNjIgNC4zODUtOC44MTYtLjAyOS02LjE4NS0uNDg0LTguNTQ5LTQuMzg1LTguODE2em0tMTAuNjE1IDEyLjgxNnYtOGw4IDMuOTkzLTggNC4wMDd6Ii8+CiAgICAgICAgICA8L3N2Zz4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJwbGFjZWhvbGRlci10ZXh0Ij5FbnRlciBZb3VUdWJlIFVSTDwvZGl2PgogICAgICAgIDxpbnB1dCB0eXBlPSJ1cmwiIAogICAgICAgICAgICAgICBjbGFzcz0ieW91dHViZS11cmwtaW5wdXQiIAogICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iaHR0cHM6Ly95b3V0dWJlLmNvbS93YXRjaD92PS4uLiIgCiAgICAgICAgICAgICAgIHZhbHVlPSIke3RoaXMuZXNjYXBlSHRtbCh1cmwpfSIgLz4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJ5b3V0dWJlLWVtYmVkLWJ0biI+RW1iZWQgVmlkZW88L2J1dHRvbj4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICByZW5kZXJWaWRlbyh2aWRlb0lkKSB7CiAgICByZXR1cm4gYAogICAgICA8ZGl2IGNsYXNzPSJ5b3V0dWJlLWNvbnRhaW5lciI+CiAgICAgICAgPGlmcmFtZSAKICAgICAgICAgIHNyYz0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJHt2aWRlb0lkfSIKICAgICAgICAgIGZyYW1lYm9yZGVyPSIwIgogICAgICAgICAgYWxsb3c9ImFjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBjbGlwYm9hcmQtd3JpdGU7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmUiCiAgICAgICAgICBhbGxvd2Z1bGxzY3JlZW4KICAgICAgICA+PC9pZnJhbWU+CiAgICAgIDwvZGl2PgogICAgYDsKICB9CiAgc2V0dXAoZWxlbWVudDQsIGJsb2NrLCBoYW5kbGVyczIpIHsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi55b3V0dWJlLWJsb2NrLWNvbnRhaW5lciIpOwogICAgaWYgKCFjb250YWluZXIpCiAgICAgIHJldHVybjsKICAgIGlmIChibG9jay5tZXRhZGF0YT8udmlkZW9JZCkgewogICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsICIwIik7CiAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsICgpID0+IGhhbmRsZXJzMi5vbkZvY3VzKCkpOwogICAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IGhhbmRsZXJzMi5vbkJsdXIoKSk7CiAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgKGUxMSkgPT4gewogICAgICAgIGlmIChlMTEua2V5ID09PSAiRGVsZXRlIiB8fCBlMTEua2V5ID09PSAiQmFja3NwYWNlIikgewogICAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBoYW5kbGVyczIub25LZXlEb3duKGUxMSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhhbmRsZXJzMi5vbktleURvd24oZTExKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCB1cmxJbnB1dCA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi55b3V0dWJlLXVybC1pbnB1dCIpOwogICAgY29uc3QgZW1iZWRCdG4gPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIueW91dHViZS1lbWJlZC1idG4iKTsKICAgIGlmICghdXJsSW5wdXQgfHwgIWVtYmVkQnRuKQogICAgICByZXR1cm47CiAgICB1cmxJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsICgpID0+IGhhbmRsZXJzMi5vbkZvY3VzKCkpOwogICAgdXJsSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IGhhbmRsZXJzMi5vbkJsdXIoKSk7CiAgICBlbWJlZEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgdGhpcy5lbWJlZFZpZGVvKHVybElucHV0LnZhbHVlLCBibG9jaywgaGFuZGxlcnMyKTsKICAgIH0pOwogICAgdXJsSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIChlMTEpID0+IHsKICAgICAgaWYgKGUxMS5rZXkgPT09ICJFbnRlciIpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICB0aGlzLmVtYmVkVmlkZW8odXJsSW5wdXQudmFsdWUsIGJsb2NrLCBoYW5kbGVyczIpOwogICAgICB9IGVsc2UgaWYgKGUxMS5rZXkgPT09ICJFc2NhcGUiKSB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdXJsSW5wdXQuYmx1cigpOwogICAgICB9CiAgICB9KTsKICAgIHVybElucHV0LmFkZEV2ZW50TGlzdGVuZXIoInBhc3RlIiwgKGUxMSkgPT4gewogICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICBjb25zdCBwYXN0ZWRVcmwgPSB1cmxJbnB1dC52YWx1ZTsKICAgICAgICBpZiAodGhpcy5leHRyYWN0WW91VHViZVZpZGVvSWQocGFzdGVkVXJsKSkgewogICAgICAgICAgdGhpcy5lbWJlZFZpZGVvKHBhc3RlZFVybCwgYmxvY2ssIGhhbmRsZXJzMik7CiAgICAgICAgfQogICAgICB9LCAwKTsKICAgIH0pOwogICAgdXJsSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCAoKSA9PiB7CiAgICAgIGlmICghYmxvY2subWV0YWRhdGEpCiAgICAgICAgYmxvY2subWV0YWRhdGEgPSB7fTsKICAgICAgYmxvY2subWV0YWRhdGEudXJsID0gdXJsSW5wdXQudmFsdWU7CiAgICB9KTsKICB9CiAgZW1iZWRWaWRlbyh1cmwsIGJsb2NrLCBoYW5kbGVyczIpIHsKICAgIGNvbnN0IHZpZGVvSWQgPSB0aGlzLmV4dHJhY3RZb3VUdWJlVmlkZW9JZCh1cmwpOwogICAgaWYgKCF2aWRlb0lkKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkludmFsaWQgWW91VHViZSBVUkwiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCFibG9jay5tZXRhZGF0YSkKICAgICAgYmxvY2subWV0YWRhdGEgPSB7fTsKICAgIGJsb2NrLm1ldGFkYXRhLnZpZGVvSWQgPSB2aWRlb0lkOwogICAgYmxvY2subWV0YWRhdGEudXJsID0gdXJsOwogICAgYmxvY2suY29udGVudCA9IGBZb3VUdWJlIFZpZGVvOiAke3ZpZGVvSWR9YDsKICAgIGhhbmRsZXJzMi5vblJlcXVlc3RVcGRhdGU/LigpOwogIH0KICBleHRyYWN0WW91VHViZVZpZGVvSWQodXJsKSB7CiAgICBjb25zdCBwYXR0ZXJuczIgPSBbCiAgICAgIC8oPzp5b3V0dWJlXC5jb21cLyg/OlteXC9dK1wvLitcL3woPzp2fGUoPzptYmVkKT8pXC98LipbPyZddj0pfHlvdXR1XC5iZVwvKShbXiImP1wvIF17MTF9KS8sCiAgICAgIC95b3V0dWJlXC5jb21cL2VtYmVkXC8oW14iJj9cLyBdezExfSkvLAogICAgICAveW91dHViZVwuY29tXC93YXRjaFw/dj0oW14iJj9cLyBdezExfSkvLAogICAgICAveW91dHVcLmJlXC8oW14iJj9cLyBdezExfSkvCiAgICBdOwogICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zMikgewogICAgICBjb25zdCBtYXRjaDIgPSB1cmwubWF0Y2gocGF0dGVybik7CiAgICAgIGlmIChtYXRjaDIpIHsKICAgICAgICByZXR1cm4gbWF0Y2gyWzFdOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZXNjYXBlSHRtbCh0ZXh0OSkgewogICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBkaXYudGV4dENvbnRlbnQgPSB0ZXh0OTsKICAgIHJldHVybiBkaXYuaW5uZXJIVE1MOwogIH0KICBnZXRDb250ZW50KGVsZW1lbnQ0KSB7CiAgICBjb25zdCBibG9jayA9IHRoaXMuZ2V0QmxvY2tGcm9tRWxlbWVudChlbGVtZW50NCk7CiAgICByZXR1cm4gYmxvY2s/LmNvbnRlbnQgfHwgIiI7CiAgfQogIHNldENvbnRlbnQoZWxlbWVudDQsIGNvbnRlbnQzKSB7CiAgICBjb25zdCBibG9jayA9IHRoaXMuZ2V0QmxvY2tGcm9tRWxlbWVudChlbGVtZW50NCk7CiAgICBpZiAoYmxvY2spIHsKICAgICAgYmxvY2suY29udGVudCA9IGNvbnRlbnQzOwogICAgfQogIH0KICBnZXRCbG9ja0Zyb21FbGVtZW50KGVsZW1lbnQ0KSB7CiAgICBjb25zdCBjb250YWluZXIgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIueW91dHViZS1ibG9jay1jb250YWluZXIiKTsKICAgIGNvbnN0IGJsb2NrSWQgPSBjb250YWluZXI/LmdldEF0dHJpYnV0ZSgiZGF0YS1ibG9jay1pZCIpOwogICAgaWYgKCFibG9ja0lkKQogICAgICByZXR1cm4gbnVsbDsKICAgIHJldHVybiB7CiAgICAgIGlkOiBibG9ja0lkLAogICAgICB0eXBlOiAieW91dHViZSIsCiAgICAgIGNvbnRlbnQ6ICIiLAogICAgICBtZXRhZGF0YToge30KICAgIH07CiAgfQogIGdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgc2V0Q3Vyc29yVG9TdGFydChlbGVtZW50NCkgewogICAgdGhpcy5mb2N1cyhlbGVtZW50NCk7CiAgfQogIHNldEN1cnNvclRvRW5kKGVsZW1lbnQ0KSB7CiAgICB0aGlzLmZvY3VzKGVsZW1lbnQ0KTsKICB9CiAgZm9jdXMoZWxlbWVudDQpIHsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi55b3V0dWJlLWJsb2NrLWNvbnRhaW5lciIpOwogICAgY29uc3QgdXJsSW5wdXQgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIueW91dHViZS11cmwtaW5wdXQiKTsKICAgIGlmICh1cmxJbnB1dCkgewogICAgICB1cmxJbnB1dC5mb2N1cygpOwogICAgfSBlbHNlIGlmIChjb250YWluZXIpIHsKICAgICAgY29udGFpbmVyLmZvY3VzKCk7CiAgICB9CiAgfQogIGZvY3VzV2l0aEN1cnNvcihlbGVtZW50NCwgcG9zaXRpb24zID0gImVuZCIpIHsKICAgIHRoaXMuZm9jdXMoZWxlbWVudDQpOwogIH0KICBnZXRTcGxpdENvbnRlbnQoZWxlbWVudDQpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBnZXRTdHlsZXMoKSB7CiAgICByZXR1cm4gYAogICAgICAvKiBZb3VUdWJlIEJsb2NrIENvbnRhaW5lciAqLwogICAgICAueW91dHViZS1ibG9jay1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtYXJnaW46IDEycHggMDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CiAgICAgIAogICAgICAueW91dHViZS1ibG9jay1jb250YWluZXIuc2VsZWN0ZWQgewogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzYzNjZmMSIsICIjODE4Y2Y4Iil9OwogICAgICB9CiAgICAgIAogICAgICAvKiBZb3VUdWJlIFBsYWNlaG9sZGVyICovCiAgICAgIC55b3V0dWJlLXBsYWNlaG9sZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiAzMnB4IDI0cHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzM3NDE1MSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmYWZhZmEiLCAiIzBhMGEwYSIpfTsKICAgICAgICBnYXA6IDEycHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5wbGFjZWhvbGRlci1pY29uIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkYzI2MjYiLCAiI2VmNDQ0NCIpfTsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgIH0KICAgICAgCiAgICAgIC5wbGFjZWhvbGRlci10ZXh0IHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzNzQxNTEiLCAiI2U1ZTdlYiIpfTsKICAgICAgfQogICAgICAKICAgICAgLnlvdXR1YmUtdXJsLWlucHV0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtYXgtd2lkdGg6IDQwMHB4OwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzNzQxNTEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMxMTE4MjciKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTExODI3IiwgIiNmOWZhZmIiKX07CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIHNhbnMtc2VyaWY7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQogICAgICAKICAgICAgLnlvdXR1YmUtdXJsLWlucHV0OmZvY3VzIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNmI3MjgwIiwgIiM5Y2EzYWYiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzFmMjkzNyIpfTsKICAgICAgfQogICAgICAKICAgICAgLnlvdXR1YmUtdXJsLWlucHV0OjpwbGFjZWhvbGRlciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOWNhM2FmIiwgIiM0YjU1NjMiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC55b3V0dWJlLWVtYmVkLWJ0biB7CiAgICAgICAgcGFkZGluZzogNnB4IDE2cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxMTE4MjciLCAiI2Y5ZmFmYiIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOWZhZmIiLCAiIzExMTgyNyIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc2Fucy1zZXJpZjsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQogICAgICAKICAgICAgLnlvdXR1YmUtZW1iZWQtYnRuOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzM3NDE1MSIsICIjZTVlN2ViIil9OwogICAgICB9CiAgICAgIAogICAgICAueW91dHViZS1lbWJlZC1idG46YWN0aXZlIHsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTgpOwogICAgICB9CiAgICAgIAogICAgICAvKiBZb3VUdWJlIENvbnRhaW5lciAqLwogICAgICAueW91dHViZS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogNTYuMjUlOyAvKiAxNjo5IGFzcGVjdCByYXRpbyAqLwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwIiwgIiMwMDAwMDAiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC55b3V0dWJlLWNvbnRhaW5lciBpZnJhbWUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgfQogICAgYDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL2Jsb2Nrcy9tZWRpYS9hdHRhY2htZW50LmJsb2NrLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBBdHRhY2htZW50QmxvY2tIYW5kbGVyID0gY2xhc3MgZXh0ZW5kcyBCYXNlQmxvY2tIYW5kbGVyIHsKICB0eXBlID0gImF0dGFjaG1lbnQiOwogIHJlbmRlcihibG9jaywgaXNTZWxlY3RlZCkgewogICAgY29uc3QgZmlsZXMgPSBibG9jay5tZXRhZGF0YT8uZmlsZXMgfHwgW107CiAgICByZXR1cm4gYAogICAgICA8ZGl2IGNsYXNzPSJhdHRhY2htZW50LWJsb2NrLWNvbnRhaW5lciR7aXNTZWxlY3RlZCA/ICIgc2VsZWN0ZWQiIDogIiJ9IiAKICAgICAgICAgICBkYXRhLWJsb2NrLWlkPSIke2Jsb2NrLmlkfSIKICAgICAgICAgICB0YWJpbmRleD0iMCI+CiAgICAgICAgPGRpdiBjbGFzcz0iYXR0YWNobWVudC1oZWFkZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0iYXR0YWNobWVudC1pY29uIj5cdXsxRjRDRX08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dGFjaG1lbnQtdGl0bGUiPkZpbGUgQXR0YWNobWVudHM8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJhdHRhY2htZW50LWxpc3QiPgogICAgICAgICAgJHtmaWxlcy5sZW5ndGggPiAwID8gdGhpcy5yZW5kZXJGaWxlcyhmaWxlcykgOiB0aGlzLnJlbmRlclBsYWNlaG9sZGVyKCl9CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGlucHV0IHR5cGU9ImZpbGUiIAogICAgICAgICAgICAgICBjbGFzcz0iYXR0YWNobWVudC1maWxlLWlucHV0IiAKICAgICAgICAgICAgICAgbXVsdGlwbGUgCiAgICAgICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OiBub25lOyIgLz4KICAgICAgICAke2ZpbGVzLmxlbmd0aCA+IDAgPyAnPGJ1dHRvbiBjbGFzcz0iYWRkLW1vcmUtZmlsZXMiPkFkZCBNb3JlIEZpbGVzPC9idXR0b24+JyA6ICIifQogICAgICA8L2Rpdj4KICAgIGA7CiAgfQogIHJlbmRlclBsYWNlaG9sZGVyKCkgewogICAgcmV0dXJuIGAKICAgICAgPGRpdiBjbGFzcz0iYXR0YWNobWVudC1wbGFjZWhvbGRlciI+CiAgICAgICAgPGRpdiBjbGFzcz0icGxhY2Vob2xkZXItdGV4dCI+Q2xpY2sgdG8gYWRkIGZpbGVzPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0icGxhY2Vob2xkZXItaGludCI+b3IgZHJhZyBhbmQgZHJvcDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgfQogIHJlbmRlckZpbGVzKGZpbGVzKSB7CiAgICByZXR1cm4gZmlsZXMubWFwKChmaWxlKSA9PiBgCiAgICAgIDxkaXYgY2xhc3M9ImF0dGFjaG1lbnQtaXRlbSIgZGF0YS1maWxlLWlkPSIke2ZpbGUuaWR9Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJmaWxlLWljb24iPiR7dGhpcy5nZXRGaWxlSWNvbihmaWxlLnR5cGUpfTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImZpbGUtaW5mbyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJmaWxlLW5hbWUiPiR7dGhpcy5lc2NhcGVIdG1sKGZpbGUubmFtZSl9PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJmaWxlLXNpemUiPiR7dGhpcy5mb3JtYXRGaWxlU2l6ZShmaWxlLnNpemUpfTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxidXR0b24gY2xhc3M9InJlbW92ZS1maWxlIiBkYXRhLWZpbGUtaWQ9IiR7ZmlsZS5pZH0iPlx4RDc8L2J1dHRvbj4KICAgICAgPC9kaXY+CiAgICBgKS5qb2luKCIiKTsKICB9CiAgc2V0dXAoZWxlbWVudDQsIGJsb2NrLCBoYW5kbGVyczIpIHsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5hdHRhY2htZW50LWJsb2NrLWNvbnRhaW5lciIpOwogICAgY29uc3QgZmlsZUlucHV0ID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmF0dGFjaG1lbnQtZmlsZS1pbnB1dCIpOwogICAgaWYgKCFjb250YWluZXIgfHwgIWZpbGVJbnB1dCkgewogICAgICBjb25zb2xlLmVycm9yKCJBdHRhY2htZW50QmxvY2tIYW5kbGVyOiBDb3VsZCBub3QgZmluZCByZXF1aXJlZCBlbGVtZW50cyIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIWJsb2NrLm1ldGFkYXRhKQogICAgICBibG9jay5tZXRhZGF0YSA9IHt9OwogICAgaWYgKCFibG9jay5tZXRhZGF0YS5maWxlcykKICAgICAgYmxvY2subWV0YWRhdGEuZmlsZXMgPSBbXTsKICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5hdHRhY2htZW50LXBsYWNlaG9sZGVyIik7CiAgICBpZiAocGxhY2Vob2xkZXIpIHsKICAgICAgcGxhY2Vob2xkZXIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZTExKSA9PiB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIGZpbGVJbnB1dC5jbGljaygpOwogICAgICB9KTsKICAgIH0KICAgIGNvbnN0IGFkZE1vcmVCdG4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmFkZC1tb3JlLWZpbGVzIik7CiAgICBpZiAoYWRkTW9yZUJ0bikgewogICAgICBhZGRNb3JlQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUxMSkgPT4gewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICBmaWxlSW5wdXQuY2xpY2soKTsKICAgICAgfSk7CiAgICB9CiAgICBmaWxlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgYXN5bmMgKGUxMSkgPT4gewogICAgICBjb25zdCBpbnB1dCA9IGUxMS50YXJnZXQ7CiAgICAgIGNvbnN0IGZpbGVzID0gaW5wdXQuZmlsZXM7CiAgICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGaWxlQXR0YWNobWVudHMoZmlsZXMsIGJsb2NrLCBoYW5kbGVyczIpOwogICAgICAgIGlucHV0LnZhbHVlID0gIiI7CiAgICAgIH0KICAgIH0pOwogICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUxMSkgPT4gewogICAgICBjb25zdCB0YXJnZXQgPSBlMTEudGFyZ2V0OwogICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygicmVtb3ZlLWZpbGUiKSkgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICBjb25zdCBmaWxlSWQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCJkYXRhLWZpbGUtaWQiKTsKICAgICAgICBpZiAoZmlsZUlkKSB7CiAgICAgICAgICB0aGlzLnJlbW92ZUZpbGUoZmlsZUlkLCBibG9jaywgaGFuZGxlcnMyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdvdmVyIiwgKGUxMSkgPT4gewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgiZHJhZy1vdmVyIik7CiAgICB9KTsKICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJkcmFnbGVhdmUiLCAoZTExKSA9PiB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnLW92ZXIiKTsKICAgIH0pOwogICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoImRyb3AiLCBhc3luYyAoZTExKSA9PiB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnLW92ZXIiKTsKICAgICAgY29uc3QgZmlsZXMgPSBlMTEuZGF0YVRyYW5zZmVyPy5maWxlczsKICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApIHsKICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZpbGVBdHRhY2htZW50cyhmaWxlcywgYmxvY2ssIGhhbmRsZXJzMik7CiAgICAgIH0KICAgIH0pOwogICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwgKCkgPT4gaGFuZGxlcnMyLm9uRm9jdXMoKSk7CiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IGhhbmRsZXJzMi5vbkJsdXIoKSk7CiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIChlMTEpID0+IHsKICAgICAgaWYgKGUxMS5rZXkgPT09ICJEZWxldGUiIHx8IGUxMS5rZXkgPT09ICJCYWNrc3BhY2UiKSB7CiAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGNvbnRhaW5lciAmJiBibG9jay5tZXRhZGF0YT8uZmlsZXM/Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgYmxvY2subWV0YWRhdGEuZmlsZXMgPSBbXTsKICAgICAgICAgIGhhbmRsZXJzMi5vblJlcXVlc3RVcGRhdGU/LigpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICBoYW5kbGVyczIub25LZXlEb3duKGUxMSk7CiAgICB9KTsKICB9CiAgYXN5bmMgaGFuZGxlRmlsZUF0dGFjaG1lbnRzKGZpbGVzLCBibG9jaywgaGFuZGxlcnMyKSB7CiAgICBpZiAoIWJsb2NrLm1ldGFkYXRhKQogICAgICBibG9jay5tZXRhZGF0YSA9IHt9OwogICAgaWYgKCFibG9jay5tZXRhZGF0YS5maWxlcykKICAgICAgYmxvY2subWV0YWRhdGEuZmlsZXMgPSBbXTsKICAgIGZvciAoY29uc3QgZmlsZSBvZiBBcnJheS5mcm9tKGZpbGVzKSkgewogICAgICB0cnkgewogICAgICAgIGNvbnN0IGRhdGFVcmwgPSBhd2FpdCB0aGlzLmZpbGVUb0RhdGFVcmwoZmlsZSk7CiAgICAgICAgY29uc3QgZmlsZURhdGEgPSB7CiAgICAgICAgICBpZDogdGhpcy5nZW5lcmF0ZUlkKCksCiAgICAgICAgICBuYW1lOiBmaWxlLm5hbWUsCiAgICAgICAgICBzaXplOiBmaWxlLnNpemUsCiAgICAgICAgICB0eXBlOiBmaWxlLnR5cGUsCiAgICAgICAgICBkYXRhOiBkYXRhVXJsCiAgICAgICAgfTsKICAgICAgICBibG9jay5tZXRhZGF0YS5maWxlcy5wdXNoKGZpbGVEYXRhKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gYXR0YWNoIGZpbGU6IiwgZmlsZS5uYW1lLCBlcnJvcik7CiAgICAgIH0KICAgIH0KICAgIGJsb2NrLmNvbnRlbnQgPSBgJHtibG9jay5tZXRhZGF0YS5maWxlcy5sZW5ndGh9IGZpbGUke2Jsb2NrLm1ldGFkYXRhLmZpbGVzLmxlbmd0aCAhPT0gMSA/ICJzIiA6ICIifSBhdHRhY2hlZGA7CiAgICBoYW5kbGVyczIub25SZXF1ZXN0VXBkYXRlPy4oKTsKICB9CiAgcmVtb3ZlRmlsZShmaWxlSWQsIGJsb2NrLCBoYW5kbGVyczIpIHsKICAgIGlmICghYmxvY2subWV0YWRhdGE/LmZpbGVzKQogICAgICByZXR1cm47CiAgICBibG9jay5tZXRhZGF0YS5maWxlcyA9IGJsb2NrLm1ldGFkYXRhLmZpbGVzLmZpbHRlcigoZjcpID0+IGY3LmlkICE9PSBmaWxlSWQpOwogICAgYmxvY2suY29udGVudCA9IGJsb2NrLm1ldGFkYXRhLmZpbGVzLmxlbmd0aCA+IDAgPyBgJHtibG9jay5tZXRhZGF0YS5maWxlcy5sZW5ndGh9IGZpbGUke2Jsb2NrLm1ldGFkYXRhLmZpbGVzLmxlbmd0aCAhPT0gMSA/ICJzIiA6ICIifSBhdHRhY2hlZGAgOiAiIjsKICAgIGhhbmRsZXJzMi5vblJlcXVlc3RVcGRhdGU/LigpOwogIH0KICBmaWxlVG9EYXRhVXJsKGZpbGUpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdCkgPT4gewogICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwogICAgICByZWFkZXIub25sb2FkID0gKGUxMSkgPT4gewogICAgICAgIGNvbnN0IHJlc3VsdCA9IGUxMS50YXJnZXQ/LnJlc3VsdDsKICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIHJlc29sdmUyKHJlc3VsdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoIkZhaWxlZCB0byByZWFkIGZpbGUiKSk7CiAgICAgICAgfQogICAgICB9OwogICAgICByZWFkZXIub25lcnJvciA9IHJlamVjdDsKICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7CiAgICB9KTsKICB9CiAgZ2V0RmlsZUljb24obWltZVR5cGUpIHsKICAgIGlmIChtaW1lVHlwZS5zdGFydHNXaXRoKCJpbWFnZS8iKSkKICAgICAgcmV0dXJuICJcdXsxRjVCQ31cdUZFMEYiOwogICAgaWYgKG1pbWVUeXBlLnN0YXJ0c1dpdGgoInZpZGVvLyIpKQogICAgICByZXR1cm4gIlx1ezFGM0E1fSI7CiAgICBpZiAobWltZVR5cGUuc3RhcnRzV2l0aCgiYXVkaW8vIikpCiAgICAgIHJldHVybiAiXHV7MUYzQjV9IjsKICAgIGlmIChtaW1lVHlwZS5pbmNsdWRlcygicGRmIikpCiAgICAgIHJldHVybiAiXHV7MUY0QzR9IjsKICAgIGlmIChtaW1lVHlwZS5pbmNsdWRlcygiemlwIikgfHwgbWltZVR5cGUuaW5jbHVkZXMoInJhciIpIHx8IG1pbWVUeXBlLmluY2x1ZGVzKCJ0YXIiKSkKICAgICAgcmV0dXJuICJcdXsxRjVDNH1cdUZFMEYiOwogICAgaWYgKG1pbWVUeXBlLmluY2x1ZGVzKCJzaGVldCIpKQogICAgICByZXR1cm4gIlx1ezFGNENBfSI7CiAgICBpZiAobWltZVR5cGUuaW5jbHVkZXMoImRvY3VtZW50IikgfHwgbWltZVR5cGUuaW5jbHVkZXMoIm1zd29yZCIpKQogICAgICByZXR1cm4gIlx1ezFGNEREfSI7CiAgICBpZiAobWltZVR5cGUuaW5jbHVkZXMoInByZXNlbnRhdGlvbiIpKQogICAgICByZXR1cm4gIlx1ezFGNENCfSI7CiAgICBpZiAobWltZVR5cGUuaW5jbHVkZXMoInRleHQiKSkKICAgICAgcmV0dXJuICJcdXsxRjRDM30iOwogICAgcmV0dXJuICJcdXsxRjRDMX0iOwogIH0KICBmb3JtYXRGaWxlU2l6ZShieXRlcykgewogICAgaWYgKGJ5dGVzID09PSAwKQogICAgICByZXR1cm4gIjAgQnl0ZXMiOwogICAgY29uc3QgazQgPSAxMDI0OwogICAgY29uc3Qgc2l6ZXMgPSBbIkJ5dGVzIiwgIktCIiwgIk1CIiwgIkdCIl07CiAgICBjb25zdCBpMTEgPSBNYXRoLmZsb29yKE1hdGgubG9nKGJ5dGVzKSAvIE1hdGgubG9nKGs0KSk7CiAgICByZXR1cm4gcGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrNCwgaTExKSkudG9GaXhlZCgyKSkgKyAiICIgKyBzaXplc1tpMTFdOwogIH0KICBnZW5lcmF0ZUlkKCkgewogICAgcmV0dXJuIGBmaWxlLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSl9YDsKICB9CiAgZXNjYXBlSHRtbCh0ZXh0OSkgewogICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBkaXYudGV4dENvbnRlbnQgPSB0ZXh0OTsKICAgIHJldHVybiBkaXYuaW5uZXJIVE1MOwogIH0KICBnZXRDb250ZW50KGVsZW1lbnQ0KSB7CiAgICBjb25zdCBibG9jayA9IHRoaXMuZ2V0QmxvY2tGcm9tRWxlbWVudChlbGVtZW50NCk7CiAgICByZXR1cm4gYmxvY2s/LmNvbnRlbnQgfHwgIiI7CiAgfQogIHNldENvbnRlbnQoZWxlbWVudDQsIGNvbnRlbnQzKSB7CiAgICBjb25zdCBibG9jayA9IHRoaXMuZ2V0QmxvY2tGcm9tRWxlbWVudChlbGVtZW50NCk7CiAgICBpZiAoYmxvY2spIHsKICAgICAgYmxvY2suY29udGVudCA9IGNvbnRlbnQzOwogICAgfQogIH0KICBnZXRCbG9ja0Zyb21FbGVtZW50KGVsZW1lbnQ0KSB7CiAgICBjb25zdCBjb250YWluZXIgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYXR0YWNobWVudC1ibG9jay1jb250YWluZXIiKTsKICAgIGNvbnN0IGJsb2NrSWQgPSBjb250YWluZXI/LmdldEF0dHJpYnV0ZSgiZGF0YS1ibG9jay1pZCIpOwogICAgaWYgKCFibG9ja0lkKQogICAgICByZXR1cm4gbnVsbDsKICAgIHJldHVybiB7CiAgICAgIGlkOiBibG9ja0lkLAogICAgICB0eXBlOiAiYXR0YWNobWVudCIsCiAgICAgIGNvbnRlbnQ6ICIiLAogICAgICBtZXRhZGF0YToge30KICAgIH07CiAgfQogIGdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgc2V0Q3Vyc29yVG9TdGFydChlbGVtZW50NCkgewogICAgdGhpcy5mb2N1cyhlbGVtZW50NCk7CiAgfQogIHNldEN1cnNvclRvRW5kKGVsZW1lbnQ0KSB7CiAgICB0aGlzLmZvY3VzKGVsZW1lbnQ0KTsKICB9CiAgZm9jdXMoZWxlbWVudDQpIHsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5hdHRhY2htZW50LWJsb2NrLWNvbnRhaW5lciIpOwogICAgY29udGFpbmVyPy5mb2N1cygpOwogIH0KICBmb2N1c1dpdGhDdXJzb3IoZWxlbWVudDQsIHBvc2l0aW9uMyA9ICJlbmQiKSB7CiAgICB0aGlzLmZvY3VzKGVsZW1lbnQ0KTsKICB9CiAgZ2V0U3BsaXRDb250ZW50KGVsZW1lbnQ0KSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZ2V0U3R5bGVzKCkgewogICAgcmV0dXJuIGAKICAgICAgLyogQXR0YWNobWVudCBCbG9jayBDb250YWluZXIgKi8KICAgICAgLmF0dGFjaG1lbnQtYmxvY2stY29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWFyZ2luOiAxMnB4IDA7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzM3NDE1MSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMxMTE4MjciKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5hdHRhY2htZW50LWJsb2NrLWNvbnRhaW5lci5zZWxlY3RlZCB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzljYTNhZiIsICIjNmI3MjgwIil9OwogICAgICB9CiAgICAgIAogICAgICAuYXR0YWNobWVudC1ibG9jay1jb250YWluZXIuZHJhZy1vdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y5ZmFmYiIsICIjMWYyOTM3Iil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2MzY2ZjEiLCAiIzgxOGNmOCIpfTsKICAgICAgfQogICAgICAKICAgICAgLyogSGVhZGVyICovCiAgICAgIC5hdHRhY2htZW50LWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHBhZGRpbmc6IDEycHggMTZweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzM3NDE1MSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y5ZmFmYiIsICIjMGEwYTBhIil9OwogICAgICB9CiAgICAgIAogICAgICAuYXR0YWNobWVudC1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICB9CiAgICAgIAogICAgICAuYXR0YWNobWVudC10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMzc0MTUxIiwgIiNlNWU3ZWIiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC8qIEZpbGUgTGlzdCAqLwogICAgICAuYXR0YWNobWVudC1saXN0IHsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgbWluLWhlaWdodDogODBweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC8qIFBsYWNlaG9sZGVyICovCiAgICAgIC5hdHRhY2htZW50LXBsYWNlaG9sZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQogICAgICAKICAgICAgLmF0dGFjaG1lbnQtcGxhY2Vob2xkZXI6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjlmYWZiIiwgIiMxZjI5MzciKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5wbGFjZWhvbGRlci10ZXh0IHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNmI3MjgwIiwgIiM5Y2EzYWYiKX07CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNHB4OwogICAgICB9CiAgICAgIAogICAgICAucGxhY2Vob2xkZXItaGludCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzljYTNhZiIsICIjNmI3MjgwIil9OwogICAgICB9CiAgICAgIAogICAgICAvKiBGaWxlIEl0ZW1zICovCiAgICAgIC5hdHRhY2htZW50LWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEycHg7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOWZhZmIiLCAiIzFmMjkzNyIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzc0MTUxIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQogICAgICAKICAgICAgLmF0dGFjaG1lbnQtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmM2Y0ZjYiLCAiIzM3NDE1MSIpfTsKICAgICAgfQogICAgICAKICAgICAgLmZpbGUtaWNvbiB7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CiAgICAgIAogICAgICAuZmlsZS1pbmZvIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgfQogICAgICAKICAgICAgLmZpbGUtbmFtZSB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTExODI3IiwgIiNmOWZhZmIiKX07CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICAgIAogICAgICAuZmlsZS1zaXplIHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNmI3MjgwIiwgIiM5Y2EzYWYiKX07CiAgICAgICAgbWFyZ2luLXRvcDogMnB4OwogICAgICB9CiAgICAgIAogICAgICAucmVtb3ZlLWZpbGUgewogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHdpZHRoOiAyNHB4OwogICAgICAgIGhlaWdodDogMjRweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzZiNzI4MCIsICIjOWNhM2FmIil9OwogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQogICAgICAKICAgICAgLnJlbW92ZS1maWxlOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZlZTJlMiIsICIjOTkxYjFiIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmY2E1YTUiLCAiI2RjMjYyNiIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkYzI2MjYiLCAiI2ZjYTVhNSIpfTsKICAgICAgfQogICAgICAKICAgICAgLyogQWRkIE1vcmUgRmlsZXMgQnV0dG9uICovCiAgICAgIC5hZGQtbW9yZS1maWxlcyB7CiAgICAgICAgbWFyZ2luOiA4cHg7CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzM3NDE1MSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzM3NDE1MSIsICIjZTVlN2ViIil9OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmOwogICAgICB9CiAgICAgIAogICAgICAuYWRkLW1vcmUtZmlsZXM6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjlmYWZiIiwgIiMxZjI5MzciKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2QxZDVkYiIsICIjNGI1NTYzIil9OwogICAgICB9CiAgICAgIAogICAgICAvKiBIaWRkZW4gZmlsZSBpbnB1dCAqLwogICAgICAuYXR0YWNobWVudC1maWxlLWlucHV0IHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIGA7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy9ibG9ja3MvY29udGVudC9kaXZpZGVyLmJsb2NrLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBEaXZpZGVyQmxvY2tIYW5kbGVyID0gY2xhc3MgZXh0ZW5kcyBCYXNlQmxvY2tIYW5kbGVyIHsKICB0eXBlID0gImRpdmlkZXIiOwogIHJlbmRlcihibG9jaywgaXNTZWxlY3RlZCkgewogICAgY29uc3Qgc2VsZWN0ZWRDbGFzcyA9IGlzU2VsZWN0ZWQgPyAiIHNlbGVjdGVkIiA6ICIiOwogICAgcmV0dXJuIGAKICAgICAgPGRpdiBjbGFzcz0iYmxvY2sgZGl2aWRlciR7c2VsZWN0ZWRDbGFzc30iIGRhdGEtYmxvY2staWQ9IiR7YmxvY2suaWR9IiBkYXRhLWJsb2NrLXR5cGU9IiR7YmxvY2sudHlwZX0iIHRhYmluZGV4PSIwIj4KICAgICAgICA8aHI+CiAgICAgIDwvZGl2PgogICAgYDsKICB9CiAgc2V0dXAoZWxlbWVudDQsIGJsb2NrLCBoYW5kbGVyczIpIHsKICAgIGNvbnN0IGRpdmlkZXJCbG9jayA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jay5kaXZpZGVyIik7CiAgICBpZiAoIWRpdmlkZXJCbG9jaykKICAgICAgcmV0dXJuOwogICAgZGl2aWRlckJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUxMSkgPT4gewogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIGRpdmlkZXJCbG9jay5mb2N1cygpOwogICAgICBoYW5kbGVyczIub25Gb2N1cz8uKCk7CiAgICB9KTsKICAgIGRpdmlkZXJCbG9jay5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsICgpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uRm9jdXM/LigpOwogICAgfSk7CiAgICBkaXZpZGVyQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uQmx1cj8uKCk7CiAgICB9KTsKICAgIGRpdmlkZXJCbG9jay5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgKGUxMSkgPT4gewogICAgICBpZiAoZTExLmtleSA9PT0gIkJhY2tzcGFjZSIgfHwgZTExLmtleSA9PT0gIkRlbGV0ZSIpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICBoYW5kbGVyczIub25LZXlEb3duPy4oZTExKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBoYW5kbGVyczIub25LZXlEb3duPy4oZTExKTsKICAgICAgfQogICAgfSk7CiAgfQogIGdldFN0eWxlcygpIHsKICAgIHJldHVybiBgCiAgICAgIC5ibG9jay5kaXZpZGVyIHsKICAgICAgICBwYWRkaW5nOiA4cHggMDsKICAgICAgICBtYXJnaW46IDE2cHggMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLmJsb2NrLmRpdmlkZXI6Zm9jdXMgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5ibG9jay5kaXZpZGVyLnNlbGVjdGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAxMDIsIDIwNCwgMC4wNSkiLCAicmdiYSg3NywgMTQ4LCAyNTUsIDAuMDgpIil9OwogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDJweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAxMDIsIDIwNCwgMC4yKSIsICJyZ2JhKDc3LCAxNDgsIDI1NSwgMC4yKSIpfTsKICAgICAgfQoKICAgICAgLmJsb2NrLmRpdmlkZXIgaHIgewogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlMGUwZTAiLCAiIzMzMyIpfTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIGA7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy9ibG9ja3MvY29udGVudC9tYXJrZG93bi5ibG9jay5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgTWFya2Rvd25CbG9ja0hhbmRsZXIgPSBjbGFzcyBleHRlbmRzIEJhc2VCbG9ja0hhbmRsZXIgewogIHR5cGUgPSAibWFya2Rvd24iOwogIHJlbmRlcihibG9jaywgaXNTZWxlY3RlZCkgewogICAgY29uc3QgaXNFZGl0TW9kZSA9IGJsb2NrLm1ldGFkYXRhPy5pc0VkaXRNb2RlID8/IHRydWU7CiAgICBjb25zdCBjb250ZW50MyA9IGJsb2NrLmNvbnRlbnQgfHwgIiI7CiAgICByZXR1cm4gYAogICAgICA8ZGl2IGNsYXNzPSJtYXJrZG93bi1ibG9jay1jb250YWluZXIke2lzU2VsZWN0ZWQgPyAiIHNlbGVjdGVkIiA6ICIifSIgCiAgICAgICAgICAgZGF0YS1ibG9jay1pZD0iJHtibG9jay5pZH0iCiAgICAgICAgICAgZGF0YS1lZGl0LW1vZGU9IiR7aXNFZGl0TW9kZX0iPgogICAgICAgIDxkaXYgY2xhc3M9Im1hcmtkb3duLWhlYWRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtYXJrZG93bi1pY29uIj5NXHUyMTkzPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtYXJrZG93bi10aXRsZSI+TWFya2Rvd248L2Rpdj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9Im1hcmtkb3duLXRvZ2dsZS1tb2RlIiB0aXRsZT0iJHtpc0VkaXRNb2RlID8gIlByZXZpZXciIDogIkVkaXQifSI+CiAgICAgICAgICAgICR7aXNFZGl0TW9kZSA/ICJcdXsxRjQ0MX1cdUZFMEYiIDogIlx1MjcwRlx1RkUwRiJ9CiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtYXJrZG93bi1jb250ZW50Ij4KICAgICAgICAgICR7aXNFZGl0TW9kZSA/IHRoaXMucmVuZGVyRWRpdG9yKGNvbnRlbnQzKSA6IHRoaXMucmVuZGVyUHJldmlldyhjb250ZW50Myl9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICB9CiAgcmVuZGVyRWRpdG9yKGNvbnRlbnQzKSB7CiAgICByZXR1cm4gYAogICAgICA8dGV4dGFyZWEgY2xhc3M9Im1hcmtkb3duLWVkaXRvciIgCiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iRW50ZXIgbWFya2Rvd24gY29udGVudC4uLiIKICAgICAgICAgICAgICAgIHNwZWxsY2hlY2s9ImZhbHNlIj4ke3RoaXMuZXNjYXBlSHRtbChjb250ZW50Myl9PC90ZXh0YXJlYT4KICAgIGA7CiAgfQogIHJlbmRlclByZXZpZXcoY29udGVudDMpIHsKICAgIGNvbnN0IGh0bWwxNiA9IHRoaXMucGFyc2VNYXJrZG93bihjb250ZW50Myk7CiAgICByZXR1cm4gYAogICAgICA8ZGl2IGNsYXNzPSJtYXJrZG93bi1wcmV2aWV3Ij4KICAgICAgICAke2h0bWwxNiB8fCAnPGRpdiBjbGFzcz0icHJldmlldy1lbXB0eSI+Tm8gY29udGVudCB0byBwcmV2aWV3PC9kaXY+J30KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICBzZXR1cChlbGVtZW50NCwgYmxvY2ssIGhhbmRsZXJzMikgewogICAgY29uc3QgY29udGFpbmVyID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLm1hcmtkb3duLWJsb2NrLWNvbnRhaW5lciIpOwogICAgY29uc3QgdG9nZ2xlQnRuID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLm1hcmtkb3duLXRvZ2dsZS1tb2RlIik7CiAgICBpZiAoIWNvbnRhaW5lciB8fCAhdG9nZ2xlQnRuKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIk1hcmtkb3duQmxvY2tIYW5kbGVyOiBDb3VsZCBub3QgZmluZCByZXF1aXJlZCBlbGVtZW50cyIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIWJsb2NrLm1ldGFkYXRhKQogICAgICBibG9jay5tZXRhZGF0YSA9IHt9OwogICAgaWYgKGJsb2NrLm1ldGFkYXRhLmlzRWRpdE1vZGUgPT09IHZvaWQgMCkKICAgICAgYmxvY2subWV0YWRhdGEuaXNFZGl0TW9kZSA9IHRydWU7CiAgICB0b2dnbGVCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZTExKSA9PiB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIGlmIChibG9jay5tZXRhZGF0YS5pc0VkaXRNb2RlKSB7CiAgICAgICAgY29uc3QgZWRpdG9yID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5tYXJrZG93bi1lZGl0b3IiKTsKICAgICAgICBpZiAoZWRpdG9yKSB7CiAgICAgICAgICBibG9jay5jb250ZW50ID0gZWRpdG9yLnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICBibG9jay5tZXRhZGF0YS5pc0VkaXRNb2RlID0gIWJsb2NrLm1ldGFkYXRhLmlzRWRpdE1vZGU7CiAgICAgIGhhbmRsZXJzMi5vblJlcXVlc3RVcGRhdGU/LigpOwogICAgfSk7CiAgICBpZiAoYmxvY2subWV0YWRhdGEuaXNFZGl0TW9kZSkgewogICAgICB0aGlzLnNldHVwRWRpdG9yKGVsZW1lbnQ0LCBibG9jaywgaGFuZGxlcnMyKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuc2V0dXBQcmV2aWV3KGVsZW1lbnQ0LCBibG9jaywgaGFuZGxlcnMyKTsKICAgIH0KICB9CiAgc2V0dXBFZGl0b3IoZWxlbWVudDQsIGJsb2NrLCBoYW5kbGVyczIpIHsKICAgIGNvbnN0IGVkaXRvciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5tYXJrZG93bi1lZGl0b3IiKTsKICAgIGlmICghZWRpdG9yKQogICAgICByZXR1cm47CiAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLCAoKSA9PiBoYW5kbGVyczIub25Gb2N1cygpKTsKICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgKCkgPT4gaGFuZGxlcnMyLm9uQmx1cigpKTsKICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsICgpID0+IHsKICAgICAgYmxvY2suY29udGVudCA9IGVkaXRvci52YWx1ZTsKICAgIH0pOwogICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCAoZTExKSA9PiB7CiAgICAgIGlmIChlMTEua2V5ID09PSAiVGFiIikgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNvbnN0IHN0YXJ0ID0gZWRpdG9yLnNlbGVjdGlvblN0YXJ0OwogICAgICAgIGNvbnN0IGVuZDMgPSBlZGl0b3Iuc2VsZWN0aW9uRW5kOwogICAgICAgIGNvbnN0IHZhbHVlMiA9IGVkaXRvci52YWx1ZTsKICAgICAgICBpZiAoZTExLnNoaWZ0S2V5KSB7CiAgICAgICAgICBjb25zdCBiZWZvcmVDdXJzb3IgPSB2YWx1ZTIuc3Vic3RyaW5nKDAsIHN0YXJ0KTsKICAgICAgICAgIGNvbnN0IGxhc3ROZXdsaW5lID0gYmVmb3JlQ3Vyc29yLmxhc3RJbmRleE9mKCJcbiIpOwogICAgICAgICAgY29uc3QgbGluZVN0YXJ0ID0gbGFzdE5ld2xpbmUgKyAxOwogICAgICAgICAgY29uc3QgbGluZUNvbnRlbnQgPSB2YWx1ZTIuc3Vic3RyaW5nKGxpbmVTdGFydCwgc3RhcnQpOwogICAgICAgICAgaWYgKGxpbmVDb250ZW50LnN0YXJ0c1dpdGgoIiAgIikpIHsKICAgICAgICAgICAgZWRpdG9yLnZhbHVlID0gdmFsdWUyLnN1YnN0cmluZygwLCBsaW5lU3RhcnQpICsgbGluZUNvbnRlbnQuc3Vic3RyaW5nKDIpICsgdmFsdWUyLnN1YnN0cmluZyhzdGFydCk7CiAgICAgICAgICAgIGVkaXRvci5zZWxlY3Rpb25TdGFydCA9IGVkaXRvci5zZWxlY3Rpb25FbmQgPSBzdGFydCAtIDI7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVkaXRvci52YWx1ZSA9IHZhbHVlMi5zdWJzdHJpbmcoMCwgc3RhcnQpICsgIiAgIiArIHZhbHVlMi5zdWJzdHJpbmcoZW5kMyk7CiAgICAgICAgICBlZGl0b3Iuc2VsZWN0aW9uU3RhcnQgPSBlZGl0b3Iuc2VsZWN0aW9uRW5kID0gc3RhcnQgKyAyOwogICAgICAgIH0KICAgICAgICBibG9jay5jb250ZW50ID0gZWRpdG9yLnZhbHVlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoKGUxMS5jdHJsS2V5IHx8IGUxMS5tZXRhS2V5KSAmJiBlMTEua2V5ID09PSAiYiIpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICB0aGlzLndyYXBTZWxlY3Rpb24oZWRpdG9yLCAiKioiLCAiKioiKTsKICAgICAgICBibG9jay5jb250ZW50ID0gZWRpdG9yLnZhbHVlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoKGUxMS5jdHJsS2V5IHx8IGUxMS5tZXRhS2V5KSAmJiBlMTEua2V5ID09PSAiaSIpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICB0aGlzLndyYXBTZWxlY3Rpb24oZWRpdG9yLCAiXyIsICJfIik7CiAgICAgICAgYmxvY2suY29udGVudCA9IGVkaXRvci52YWx1ZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKChlMTEuY3RybEtleSB8fCBlMTEubWV0YUtleSkgJiYgZTExLmtleSA9PT0gImsiKSB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdGhpcy5pbnNlcnRMaW5rKGVkaXRvcik7CiAgICAgICAgYmxvY2suY29udGVudCA9IGVkaXRvci52YWx1ZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaGFuZGxlcnMyLm9uS2V5RG93bihlMTEpOwogICAgfSk7CiAgICB0aGlzLmF1dG9SZXNpemUoZWRpdG9yKTsKICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsICgpID0+IHRoaXMuYXV0b1Jlc2l6ZShlZGl0b3IpKTsKICB9CiAgc2V0dXBQcmV2aWV3KGVsZW1lbnQ0LCBibG9jaywgaGFuZGxlcnMyKSB7CiAgICBjb25zdCBjb250YWluZXIgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIubWFya2Rvd24tYmxvY2stY29udGFpbmVyIik7CiAgICBjb25zdCBwcmV2aWV3ID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLm1hcmtkb3duLXByZXZpZXciKTsKICAgIGlmICghY29udGFpbmVyIHx8ICFwcmV2aWV3KQogICAgICByZXR1cm47CiAgICBwcmV2aWV3LnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCAiMCIpOwogICAgcHJldmlldy5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsICgpID0+IGhhbmRsZXJzMi5vbkZvY3VzKCkpOwogICAgcHJldmlldy5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgKCkgPT4gaGFuZGxlcnMyLm9uQmx1cigpKTsKICAgIHByZXZpZXcuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIChlMTEpID0+IHsKICAgICAgaWYgKGUxMS5rZXkgPT09ICJFbnRlciIgJiYgIWUxMS5zaGlmdEtleSkgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGJsb2NrLm1ldGFkYXRhLmlzRWRpdE1vZGUgPSB0cnVlOwogICAgICAgIGhhbmRsZXJzMi5vblJlcXVlc3RVcGRhdGU/LigpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBoYW5kbGVyczIub25LZXlEb3duKGUxMSk7CiAgICB9KTsKICB9CiAgd3JhcFNlbGVjdGlvbihlZGl0b3IsIGJlZm9yZSwgYWZ0ZXIpIHsKICAgIGNvbnN0IHN0YXJ0ID0gZWRpdG9yLnNlbGVjdGlvblN0YXJ0OwogICAgY29uc3QgZW5kMyA9IGVkaXRvci5zZWxlY3Rpb25FbmQ7CiAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBlZGl0b3IudmFsdWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQzKTsKICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gYmVmb3JlICsgKHNlbGVjdGVkVGV4dCB8fCAidGV4dCIpICsgYWZ0ZXI7CiAgICBlZGl0b3IudmFsdWUgPSBlZGl0b3IudmFsdWUuc3Vic3RyaW5nKDAsIHN0YXJ0KSArIHJlcGxhY2VtZW50ICsgZWRpdG9yLnZhbHVlLnN1YnN0cmluZyhlbmQzKTsKICAgIGlmIChzZWxlY3RlZFRleHQpIHsKICAgICAgZWRpdG9yLnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7CiAgICAgIGVkaXRvci5zZWxlY3Rpb25FbmQgPSBzdGFydCArIHJlcGxhY2VtZW50Lmxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIGVkaXRvci5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0ICsgYmVmb3JlLmxlbmd0aDsKICAgICAgZWRpdG9yLnNlbGVjdGlvbkVuZCA9IHN0YXJ0ICsgYmVmb3JlLmxlbmd0aCArIDQ7CiAgICB9CiAgICBlZGl0b3IuZm9jdXMoKTsKICB9CiAgaW5zZXJ0TGluayhlZGl0b3IpIHsKICAgIGNvbnN0IHN0YXJ0ID0gZWRpdG9yLnNlbGVjdGlvblN0YXJ0OwogICAgY29uc3QgZW5kMyA9IGVkaXRvci5zZWxlY3Rpb25FbmQ7CiAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBlZGl0b3IudmFsdWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQzKTsKICAgIGNvbnN0IGxpbmtUZXh0ID0gc2VsZWN0ZWRUZXh0IHx8ICJsaW5rIHRleHQiOwogICAgY29uc3QgcmVwbGFjZW1lbnQgPSBgWyR7bGlua1RleHR9XSh1cmwpYDsKICAgIGVkaXRvci52YWx1ZSA9IGVkaXRvci52YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnQpICsgcmVwbGFjZW1lbnQgKyBlZGl0b3IudmFsdWUuc3Vic3RyaW5nKGVuZDMpOwogICAgZWRpdG9yLnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQgKyBsaW5rVGV4dC5sZW5ndGggKyAzOwogICAgZWRpdG9yLnNlbGVjdGlvbkVuZCA9IHN0YXJ0ICsgbGlua1RleHQubGVuZ3RoICsgNjsKICAgIGVkaXRvci5mb2N1cygpOwogIH0KICBhdXRvUmVzaXplKGVkaXRvcikgewogICAgZWRpdG9yLnN0eWxlLmhlaWdodCA9ICJhdXRvIjsKICAgIGVkaXRvci5zdHlsZS5oZWlnaHQgPSBlZGl0b3Iuc2Nyb2xsSGVpZ2h0ICsgInB4IjsKICB9CiAgcGFyc2VNYXJrZG93bihtYXJrZG93bikgewogICAgbGV0IGh0bWwxNiA9IHRoaXMuZXNjYXBlSHRtbChtYXJrZG93bik7CiAgICBodG1sMTYgPSBodG1sMTYucmVwbGFjZSgvXiMjIyAoLispJC9nbSwgIjxoMz4kMTwvaDM+Iik7CiAgICBodG1sMTYgPSBodG1sMTYucmVwbGFjZSgvXiMjICguKykkL2dtLCAiPGgyPiQxPC9oMj4iKTsKICAgIGh0bWwxNiA9IGh0bWwxNi5yZXBsYWNlKC9eIyAoLispJC9nbSwgIjxoMT4kMTwvaDE+Iik7CiAgICBodG1sMTYgPSBodG1sMTYucmVwbGFjZSgvXCpcKiguKz8pXCpcKi9nLCAiPHN0cm9uZz4kMTwvc3Ryb25nPiIpOwogICAgaHRtbDE2ID0gaHRtbDE2LnJlcGxhY2UoL19fKC4rPylfXy9nLCAiPHN0cm9uZz4kMTwvc3Ryb25nPiIpOwogICAgaHRtbDE2ID0gaHRtbDE2LnJlcGxhY2UoL1wqKC4rPylcKi9nLCAiPGVtPiQxPC9lbT4iKTsKICAgIGh0bWwxNiA9IGh0bWwxNi5yZXBsYWNlKC9fKC4rPylfL2csICI8ZW0+JDE8L2VtPiIpOwogICAgaHRtbDE2ID0gaHRtbDE2LnJlcGxhY2UoL2BgYChbXHNcU10qPylgYGAvZywgIjxwcmU+PGNvZGU+JDE8L2NvZGU+PC9wcmU+Iik7CiAgICBodG1sMTYgPSBodG1sMTYucmVwbGFjZSgvYCguKz8pYC9nLCAiPGNvZGU+JDE8L2NvZGU+Iik7CiAgICBodG1sMTYgPSBodG1sMTYucmVwbGFjZSgvXFsoW15cXV0rKVxdXCgoW14pXSspXCkvZywgJzxhIGhyZWY9IiQyIj4kMTwvYT4nKTsKICAgIGh0bWwxNiA9IGh0bWwxNi5yZXBsYWNlKC9eXCogKC4rKSQvZ20sICI8bGk+JDE8L2xpPiIpOwogICAgaHRtbDE2ID0gaHRtbDE2LnJlcGxhY2UoL14tICguKykkL2dtLCAiPGxpPiQxPC9saT4iKTsKICAgIGh0bWwxNiA9IGh0bWwxNi5yZXBsYWNlKC9eXGQrXC4gKC4rKSQvZ20sICI8bGk+JDE8L2xpPiIpOwogICAgaHRtbDE2ID0gaHRtbDE2LnJlcGxhY2UoLyg8bGk+Lio8XC9saT5cbj8pKy9nLCAobWF0Y2gyKSA9PiB7CiAgICAgIHJldHVybiAiPHVsPiIgKyBtYXRjaDIgKyAiPC91bD4iOwogICAgfSk7CiAgICBodG1sMTYgPSBodG1sMTYucmVwbGFjZSgvXG5cbi9nLCAiPC9wPjxwPiIpOwogICAgaHRtbDE2ID0gIjxwPiIgKyBodG1sMTYgKyAiPC9wPiI7CiAgICBodG1sMTYgPSBodG1sMTYucmVwbGFjZSgvPHA+PFwvcD4vZywgIiIpOwogICAgaHRtbDE2ID0gaHRtbDE2LnJlcGxhY2UoLzxwPig8aFsxLTNdPikvZywgIiQxIik7CiAgICBodG1sMTYgPSBodG1sMTYucmVwbGFjZSgvKDxcL2hbMS0zXT4pPFwvcD4vZywgIiQxIik7CiAgICBodG1sMTYgPSBodG1sMTYucmVwbGFjZSgvPHA+KDx1bD4pL2csICIkMSIpOwogICAgaHRtbDE2ID0gaHRtbDE2LnJlcGxhY2UoLyg8XC91bD4pPFwvcD4vZywgIiQxIik7CiAgICBodG1sMTYgPSBodG1sMTYucmVwbGFjZSgvPHA+KDxwcmU+KS9nLCAiJDEiKTsKICAgIGh0bWwxNiA9IGh0bWwxNi5yZXBsYWNlKC8oPFwvcHJlPik8XC9wPi9nLCAiJDEiKTsKICAgIHJldHVybiBodG1sMTY7CiAgfQogIGVzY2FwZUh0bWwodGV4dDkpIHsKICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgZGl2LnRleHRDb250ZW50ID0gdGV4dDk7CiAgICByZXR1cm4gZGl2LmlubmVySFRNTDsKICB9CiAgZ2V0Q29udGVudChlbGVtZW50NCkgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLm1hcmtkb3duLWVkaXRvciIpOwogICAgaWYgKGVkaXRvcikgewogICAgICByZXR1cm4gZWRpdG9yLnZhbHVlOwogICAgfQogICAgY29uc3QgY29udGFpbmVyID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLm1hcmtkb3duLWJsb2NrLWNvbnRhaW5lciIpOwogICAgY29uc3QgYmxvY2tJZCA9IGNvbnRhaW5lcj8uZ2V0QXR0cmlidXRlKCJkYXRhLWJsb2NrLWlkIik7CiAgICByZXR1cm4gIiI7CiAgfQogIHNldENvbnRlbnQoZWxlbWVudDQsIGNvbnRlbnQzKSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIubWFya2Rvd24tZWRpdG9yIik7CiAgICBpZiAoZWRpdG9yKSB7CiAgICAgIGVkaXRvci52YWx1ZSA9IGNvbnRlbnQzOwogICAgICB0aGlzLmF1dG9SZXNpemUoZWRpdG9yKTsKICAgIH0KICB9CiAgZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQpIHsKICAgIGNvbnN0IGVkaXRvciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5tYXJrZG93bi1lZGl0b3IiKTsKICAgIHJldHVybiBlZGl0b3IgPyBlZGl0b3Iuc2VsZWN0aW9uU3RhcnQgOiBudWxsOwogIH0KICBzZXRDdXJzb3JUb1N0YXJ0KGVsZW1lbnQ0KSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIubWFya2Rvd24tZWRpdG9yIik7CiAgICBpZiAoZWRpdG9yKSB7CiAgICAgIGVkaXRvci5zZWxlY3Rpb25TdGFydCA9IGVkaXRvci5zZWxlY3Rpb25FbmQgPSAwOwogICAgICBlZGl0b3IuZm9jdXMoKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZm9jdXMoZWxlbWVudDQpOwogICAgfQogIH0KICBzZXRDdXJzb3JUb0VuZChlbGVtZW50NCkgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLm1hcmtkb3duLWVkaXRvciIpOwogICAgaWYgKGVkaXRvcikgewogICAgICBjb25zdCBsZW5ndGggPSBlZGl0b3IudmFsdWUubGVuZ3RoOwogICAgICBlZGl0b3Iuc2VsZWN0aW9uU3RhcnQgPSBlZGl0b3Iuc2VsZWN0aW9uRW5kID0gbGVuZ3RoOwogICAgICBlZGl0b3IuZm9jdXMoKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZm9jdXMoZWxlbWVudDQpOwogICAgfQogIH0KICBmb2N1cyhlbGVtZW50NCkgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLm1hcmtkb3duLWVkaXRvciIpOwogICAgaWYgKGVkaXRvcikgewogICAgICBlZGl0b3IuZm9jdXMoKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHByZXZpZXcgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIubWFya2Rvd24tcHJldmlldyIpOwogICAgICBwcmV2aWV3Py5mb2N1cygpOwogICAgfQogIH0KICBmb2N1c1dpdGhDdXJzb3IoZWxlbWVudDQsIHBvc2l0aW9uMyA9ICJlbmQiKSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIubWFya2Rvd24tZWRpdG9yIik7CiAgICBpZiAoZWRpdG9yKSB7CiAgICAgIGlmIChwb3NpdGlvbjMgPT09ICJzdGFydCIpIHsKICAgICAgICB0aGlzLnNldEN1cnNvclRvU3RhcnQoZWxlbWVudDQpOwogICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uMyA9PT0gImVuZCIpIHsKICAgICAgICB0aGlzLnNldEN1cnNvclRvRW5kKGVsZW1lbnQ0KTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcG9zaXRpb24zID09PSAibnVtYmVyIikgewogICAgICAgIGVkaXRvci5zZWxlY3Rpb25TdGFydCA9IGVkaXRvci5zZWxlY3Rpb25FbmQgPSBwb3NpdGlvbjM7CiAgICAgICAgZWRpdG9yLmZvY3VzKCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZm9jdXMoZWxlbWVudDQpOwogICAgfQogIH0KICBnZXRTcGxpdENvbnRlbnQoZWxlbWVudDQpIHsKICAgIGNvbnN0IGVkaXRvciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5tYXJrZG93bi1lZGl0b3IiKTsKICAgIGlmICghZWRpdG9yKQogICAgICByZXR1cm4gbnVsbDsKICAgIGNvbnN0IGN1cnNvclBvcyA9IGVkaXRvci5zZWxlY3Rpb25TdGFydDsKICAgIHJldHVybiB7CiAgICAgIGJlZm9yZTogZWRpdG9yLnZhbHVlLnN1YnN0cmluZygwLCBjdXJzb3JQb3MpLAogICAgICBhZnRlcjogZWRpdG9yLnZhbHVlLnN1YnN0cmluZyhjdXJzb3JQb3MpCiAgICB9OwogIH0KICBnZXRTdHlsZXMoKSB7CiAgICByZXR1cm4gYAogICAgICAvKiBNYXJrZG93biBCbG9jayBDb250YWluZXIgKi8KICAgICAgLm1hcmtkb3duLWJsb2NrLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1hcmdpbjogMTJweCAwOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzNzQxNTEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzExMTgyNyIpfTsKICAgICAgfQogICAgICAKICAgICAgLm1hcmtkb3duLWJsb2NrLWNvbnRhaW5lci5zZWxlY3RlZCB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzljYTNhZiIsICIjNmI3MjgwIil9OwogICAgICB9CiAgICAgIAogICAgICAvKiBIZWFkZXIgKi8KICAgICAgLm1hcmtkb3duLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzc0MTUxIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjlmYWZiIiwgIiMwYTBhMGEiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5tYXJrZG93bi1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgIH0KICAgICAgCiAgICAgIC5tYXJrZG93bi10aXRsZSB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzNzQxNTEiLCAiI2U1ZTdlYiIpfTsKICAgICAgfQogICAgICAKICAgICAgLm1hcmtkb3duLXRvZ2dsZS1tb2RlIHsKICAgICAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzNzQxNTEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KICAgICAgCiAgICAgIC5tYXJrZG93bi10b2dnbGUtbW9kZTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmM2Y0ZjYiLCAiIzFmMjkzNyIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDFkNWRiIiwgIiM0YjU1NjMiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC8qIENvbnRlbnQgKi8KICAgICAgLm1hcmtkb3duLWNvbnRlbnQgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtaW4taGVpZ2h0OiAxMjBweDsKICAgICAgfQogICAgICAKICAgICAgLyogRWRpdG9yICovCiAgICAgIC5tYXJrZG93bi1lZGl0b3IgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1pbi1oZWlnaHQ6IDEyMHB4OwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgcmVzaXplOiBub25lOwogICAgICAgIGZvbnQtZmFtaWx5OiAnTW9uYWNvJywgJ0NvbnNvbGFzJywgJ0NvdXJpZXIgTmV3JywgbW9ub3NwYWNlOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBsaW5lLWhlaWdodDogMS42OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzFmMjkzNyIsICIjZjNmNGY2Iil9OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgIC5tYXJrZG93bi1lZGl0b3I6OnBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5Y2EzYWYiLCAiIzZiNzI4MCIpfTsKICAgICAgfQogICAgICAKICAgICAgLyogUHJldmlldyAqLwogICAgICAubWFya2Rvd24tcHJldmlldyB7CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICBtaW4taGVpZ2h0OiA5NnB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMWYyOTM3IiwgIiNmM2Y0ZjYiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5wcmV2aWV3LWVtcHR5IHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5Y2EzYWYiLCAiIzZiNzI4MCIpfTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KICAgICAgCiAgICAgIC8qIE1hcmtkb3duIHByZXZpZXcgc3R5bGVzICovCiAgICAgIC5tYXJrZG93bi1wcmV2aWV3IGgxIHsKICAgICAgICBmb250LXNpemU6IDI0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBtYXJnaW46IDE2cHggMCA4cHggMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxMTE4MjciLCAiI2Y5ZmFmYiIpfTsKICAgICAgfQogICAgICAKICAgICAgLm1hcmtkb3duLXByZXZpZXcgaDIgewogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIG1hcmdpbjogMTRweCAwIDZweCAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzExMTgyNyIsICIjZjlmYWZiIil9OwogICAgICB9CiAgICAgIAogICAgICAubWFya2Rvd24tcHJldmlldyBoMyB7CiAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgbWFyZ2luOiAxMnB4IDAgNHB4IDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTExODI3IiwgIiNmOWZhZmIiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5tYXJrZG93bi1wcmV2aWV3IHAgewogICAgICAgIG1hcmdpbjogOHB4IDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5tYXJrZG93bi1wcmV2aWV3IHVsLAogICAgICAubWFya2Rvd24tcHJldmlldyBvbCB7CiAgICAgICAgbWFyZ2luOiA4cHggMDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDI0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5tYXJrZG93bi1wcmV2aWV3IGxpIHsKICAgICAgICBtYXJnaW46IDRweCAwOwogICAgICB9CiAgICAgIAogICAgICAubWFya2Rvd24tcHJldmlldyBjb2RlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YzZjRmNiIsICIjMWYyOTM3Iil9OwogICAgICAgIHBhZGRpbmc6IDJweCA0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGZvbnQtZmFtaWx5OiAnTW9uYWNvJywgJ0NvbnNvbGFzJywgJ0NvdXJpZXIgTmV3JywgbW9ub3NwYWNlOwogICAgICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICAgIH0KICAgICAgCiAgICAgIC5tYXJrZG93bi1wcmV2aWV3IHByZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmM2Y0ZjYiLCAiIzFmMjkzNyIpfTsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICAgIG1hcmdpbjogOHB4IDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5tYXJrZG93bi1wcmV2aWV3IHByZSBjb2RlIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CiAgICAgIAogICAgICAubWFya2Rvd24tcHJldmlldyBzdHJvbmcgewogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTExODI3IiwgIiNmOWZhZmIiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5tYXJrZG93bi1wcmV2aWV3IGVtIHsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KICAgICAgCiAgICAgIC5tYXJrZG93bi1wcmV2aWV3IGEgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjNjBhNWZhIil9OwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQogICAgICAKICAgICAgLm1hcmtkb3duLXByZXZpZXcgYTpob3ZlciB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KICAgICAgCiAgICAgIC5tYXJrZG93bi1wcmV2aWV3IGJsb2NrcXVvdGUgewogICAgICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzM3NDE1MSIpfTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDEycHg7CiAgICAgICAgbWFyZ2luOiA4cHggMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2YjcyODAiLCAiIzljYTNhZiIpfTsKICAgICAgfQogICAgYDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL2Jsb2Nrcy9jb250ZW50L2h0bWwuYmxvY2suanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIEh0bWxCbG9ja0hhbmRsZXIgPSBjbGFzcyBleHRlbmRzIEJhc2VCbG9ja0hhbmRsZXIgewogIHR5cGUgPSAiaHRtbCI7CiAgcmVuZGVyKGJsb2NrLCBpc1NlbGVjdGVkKSB7CiAgICBjb25zdCBpc0VkaXRNb2RlID0gYmxvY2subWV0YWRhdGE/LmlzRWRpdE1vZGUgPz8gdHJ1ZTsKICAgIGNvbnN0IGNvbnRlbnQzID0gYmxvY2suY29udGVudCB8fCAiIjsKICAgIHJldHVybiBgCiAgICAgIDxkaXYgY2xhc3M9Imh0bWwtYmxvY2stY29udGFpbmVyJHtpc1NlbGVjdGVkID8gIiBzZWxlY3RlZCIgOiAiIn0iIAogICAgICAgICAgIGRhdGEtYmxvY2staWQ9IiR7YmxvY2suaWR9IgogICAgICAgICAgIGRhdGEtZWRpdC1tb2RlPSIke2lzRWRpdE1vZGV9Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJodG1sLWhlYWRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJodG1sLWljb24iPiZsdDsvJmd0OzwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaHRtbC10aXRsZSI+SFRNTDwvZGl2PgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iaHRtbC10b2dnbGUtbW9kZSIgdGl0bGU9IiR7aXNFZGl0TW9kZSA/ICJQcmV2aWV3IiA6ICJFZGl0In0iPgogICAgICAgICAgICAke2lzRWRpdE1vZGUgPyAiXHV7MUY0NDF9XHVGRTBGIiA6ICJcdTI3MEZcdUZFMEYifQogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iaHRtbC1jb250ZW50Ij4KICAgICAgICAgICR7aXNFZGl0TW9kZSA/IHRoaXMucmVuZGVyRWRpdG9yKGNvbnRlbnQzKSA6IHRoaXMucmVuZGVyUHJldmlldyhjb250ZW50Myl9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICB9CiAgcmVuZGVyRWRpdG9yKGNvbnRlbnQzKSB7CiAgICByZXR1cm4gYAogICAgICA8dGV4dGFyZWEgY2xhc3M9Imh0bWwtZWRpdG9yIiAKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJFbnRlciBIVE1MIGNvbnRlbnQuLi4iCiAgICAgICAgICAgICAgICBzcGVsbGNoZWNrPSJmYWxzZSI+JHt0aGlzLmVzY2FwZUh0bWwoY29udGVudDMpfTwvdGV4dGFyZWE+CiAgICBgOwogIH0KICByZW5kZXJQcmV2aWV3KGNvbnRlbnQzKSB7CiAgICByZXR1cm4gYAogICAgICA8ZGl2IGNsYXNzPSJodG1sLXByZXZpZXciPgogICAgICAgICR7Y29udGVudDMgfHwgJzxkaXYgY2xhc3M9InByZXZpZXctZW1wdHkiPk5vIGNvbnRlbnQgdG8gcHJldmlldzwvZGl2Pid9CiAgICAgIDwvZGl2PgogICAgYDsKICB9CiAgc2V0dXAoZWxlbWVudDQsIGJsb2NrLCBoYW5kbGVyczIpIHsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5odG1sLWJsb2NrLWNvbnRhaW5lciIpOwogICAgY29uc3QgdG9nZ2xlQnRuID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmh0bWwtdG9nZ2xlLW1vZGUiKTsKICAgIGlmICghY29udGFpbmVyIHx8ICF0b2dnbGVCdG4pIHsKICAgICAgY29uc29sZS5lcnJvcigiSHRtbEJsb2NrSGFuZGxlcjogQ291bGQgbm90IGZpbmQgcmVxdWlyZWQgZWxlbWVudHMiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCFibG9jay5tZXRhZGF0YSkKICAgICAgYmxvY2subWV0YWRhdGEgPSB7fTsKICAgIGlmIChibG9jay5tZXRhZGF0YS5pc0VkaXRNb2RlID09PSB2b2lkIDApCiAgICAgIGJsb2NrLm1ldGFkYXRhLmlzRWRpdE1vZGUgPSB0cnVlOwogICAgdG9nZ2xlQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUxMSkgPT4gewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBpZiAoYmxvY2subWV0YWRhdGEuaXNFZGl0TW9kZSkgewogICAgICAgIGNvbnN0IGVkaXRvciA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuaHRtbC1lZGl0b3IiKTsKICAgICAgICBpZiAoZWRpdG9yKSB7CiAgICAgICAgICBibG9jay5jb250ZW50ID0gZWRpdG9yLnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICBibG9jay5tZXRhZGF0YS5pc0VkaXRNb2RlID0gIWJsb2NrLm1ldGFkYXRhLmlzRWRpdE1vZGU7CiAgICAgIGhhbmRsZXJzMi5vblJlcXVlc3RVcGRhdGU/LigpOwogICAgfSk7CiAgICBpZiAoYmxvY2subWV0YWRhdGEuaXNFZGl0TW9kZSkgewogICAgICB0aGlzLnNldHVwRWRpdG9yKGVsZW1lbnQ0LCBibG9jaywgaGFuZGxlcnMyKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuc2V0dXBQcmV2aWV3KGVsZW1lbnQ0LCBibG9jaywgaGFuZGxlcnMyKTsKICAgIH0KICB9CiAgc2V0dXBFZGl0b3IoZWxlbWVudDQsIGJsb2NrLCBoYW5kbGVyczIpIHsKICAgIGNvbnN0IGVkaXRvciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5odG1sLWVkaXRvciIpOwogICAgaWYgKCFlZGl0b3IpCiAgICAgIHJldHVybjsKICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsICgpID0+IGhhbmRsZXJzMi5vbkZvY3VzKCkpOwogICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLCAoKSA9PiBoYW5kbGVyczIub25CbHVyKCkpOwogICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgKCkgPT4gewogICAgICBibG9jay5jb250ZW50ID0gZWRpdG9yLnZhbHVlOwogICAgICB0aGlzLnZhbGlkYXRlSHRtbChlZGl0b3IudmFsdWUpOwogICAgfSk7CiAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIChlMTEpID0+IHsKICAgICAgaWYgKGUxMS5rZXkgPT09ICJUYWIiKSB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgY29uc3Qgc3RhcnQgPSBlZGl0b3Iuc2VsZWN0aW9uU3RhcnQ7CiAgICAgICAgY29uc3QgZW5kMyA9IGVkaXRvci5zZWxlY3Rpb25FbmQ7CiAgICAgICAgY29uc3QgdmFsdWUyID0gZWRpdG9yLnZhbHVlOwogICAgICAgIGlmIChlMTEuc2hpZnRLZXkpIHsKICAgICAgICAgIGNvbnN0IGJlZm9yZUN1cnNvciA9IHZhbHVlMi5zdWJzdHJpbmcoMCwgc3RhcnQpOwogICAgICAgICAgY29uc3QgbGFzdE5ld2xpbmUgPSBiZWZvcmVDdXJzb3IubGFzdEluZGV4T2YoIlxuIik7CiAgICAgICAgICBjb25zdCBsaW5lU3RhcnQgPSBsYXN0TmV3bGluZSArIDE7CiAgICAgICAgICBjb25zdCBsaW5lQ29udGVudCA9IHZhbHVlMi5zdWJzdHJpbmcobGluZVN0YXJ0LCBzdGFydCk7CiAgICAgICAgICBpZiAobGluZUNvbnRlbnQuc3RhcnRzV2l0aCgiICAiKSkgewogICAgICAgICAgICBlZGl0b3IudmFsdWUgPSB2YWx1ZTIuc3Vic3RyaW5nKDAsIGxpbmVTdGFydCkgKyBsaW5lQ29udGVudC5zdWJzdHJpbmcoMikgKyB2YWx1ZTIuc3Vic3RyaW5nKHN0YXJ0KTsKICAgICAgICAgICAgZWRpdG9yLnNlbGVjdGlvblN0YXJ0ID0gZWRpdG9yLnNlbGVjdGlvbkVuZCA9IHN0YXJ0IC0gMjsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZWRpdG9yLnZhbHVlID0gdmFsdWUyLnN1YnN0cmluZygwLCBzdGFydCkgKyAiICAiICsgdmFsdWUyLnN1YnN0cmluZyhlbmQzKTsKICAgICAgICAgIGVkaXRvci5zZWxlY3Rpb25TdGFydCA9IGVkaXRvci5zZWxlY3Rpb25FbmQgPSBzdGFydCArIDI7CiAgICAgICAgfQogICAgICAgIGJsb2NrLmNvbnRlbnQgPSBlZGl0b3IudmFsdWU7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICgoZTExLmN0cmxLZXkgfHwgZTExLm1ldGFLZXkpICYmIGUxMS5rZXkgPT09ICIvIikgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMuYXV0b0Nsb3NlVGFnKGVkaXRvcik7CiAgICAgICAgYmxvY2suY29udGVudCA9IGVkaXRvci52YWx1ZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaGFuZGxlcnMyLm9uS2V5RG93bihlMTEpOwogICAgfSk7CiAgICB0aGlzLmF1dG9SZXNpemUoZWRpdG9yKTsKICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsICgpID0+IHRoaXMuYXV0b1Jlc2l6ZShlZGl0b3IpKTsKICB9CiAgc2V0dXBQcmV2aWV3KGVsZW1lbnQ0LCBibG9jaywgaGFuZGxlcnMyKSB7CiAgICBjb25zdCBjb250YWluZXIgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuaHRtbC1ibG9jay1jb250YWluZXIiKTsKICAgIGNvbnN0IHByZXZpZXcgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuaHRtbC1wcmV2aWV3Iik7CiAgICBpZiAoIWNvbnRhaW5lciB8fCAhcHJldmlldykKICAgICAgcmV0dXJuOwogICAgcHJldmlldy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwgIjAiKTsKICAgIHByZXZpZXcuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLCAoKSA9PiBoYW5kbGVyczIub25Gb2N1cygpKTsKICAgIHByZXZpZXcuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IGhhbmRsZXJzMi5vbkJsdXIoKSk7CiAgICBwcmV2aWV3LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCAoZTExKSA9PiB7CiAgICAgIGlmIChlMTEua2V5ID09PSAiRW50ZXIiICYmICFlMTEuc2hpZnRLZXkpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICBibG9jay5tZXRhZGF0YS5pc0VkaXRNb2RlID0gdHJ1ZTsKICAgICAgICBoYW5kbGVyczIub25SZXF1ZXN0VXBkYXRlPy4oKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaGFuZGxlcnMyLm9uS2V5RG93bihlMTEpOwogICAgfSk7CiAgICB0aGlzLnNhbmRib3hDb250ZW50KHByZXZpZXcpOwogIH0KICBhdXRvQ2xvc2VUYWcoZWRpdG9yKSB7CiAgICBjb25zdCBjdXJzb3JQb3MgPSBlZGl0b3Iuc2VsZWN0aW9uU3RhcnQ7CiAgICBjb25zdCB0ZXh0OSA9IGVkaXRvci52YWx1ZTsKICAgIGxldCB0YWdTdGFydCA9IGN1cnNvclBvczsKICAgIHdoaWxlICh0YWdTdGFydCA+IDAgJiYgdGV4dDlbdGFnU3RhcnQgLSAxXSAhPT0gIjwiKSB7CiAgICAgIHRhZ1N0YXJ0LS07CiAgICB9CiAgICBpZiAodGFnU3RhcnQgPiAwKSB7CiAgICAgIGNvbnN0IHRhZ0NvbnRlbnQgPSB0ZXh0OS5zdWJzdHJpbmcodGFnU3RhcnQsIGN1cnNvclBvcyk7CiAgICAgIGNvbnN0IHRhZ01hdGNoID0gdGFnQ29udGVudC5tYXRjaCgvXihcdyspLyk7CiAgICAgIGlmICh0YWdNYXRjaCkgewogICAgICAgIGNvbnN0IHRhZ05hbWUgPSB0YWdNYXRjaFsxXTsKICAgICAgICBjb25zdCBjbG9zaW5nVGFnID0gYDwvJHt0YWdOYW1lfT5gOwogICAgICAgIGVkaXRvci52YWx1ZSA9IHRleHQ5LnN1YnN0cmluZygwLCBjdXJzb3JQb3MpICsgIj4iICsgY2xvc2luZ1RhZyArIHRleHQ5LnN1YnN0cmluZyhjdXJzb3JQb3MpOwogICAgICAgIGVkaXRvci5zZWxlY3Rpb25TdGFydCA9IGVkaXRvci5zZWxlY3Rpb25FbmQgPSBjdXJzb3JQb3MgKyAxOwogICAgICB9CiAgICB9CiAgfQogIGF1dG9SZXNpemUoZWRpdG9yKSB7CiAgICBlZGl0b3Iuc3R5bGUuaGVpZ2h0ID0gImF1dG8iOwogICAgZWRpdG9yLnN0eWxlLmhlaWdodCA9IGVkaXRvci5zY3JvbGxIZWlnaHQgKyAicHgiOwogIH0KICB2YWxpZGF0ZUh0bWwoaHRtbDE2KSB7CiAgICBjb25zdCBvcGVuVGFncyA9IFtdOwogICAgY29uc3QgdGFnUmVnZXggPSAvPFwvPyhbYS16QS1aXVthLXpBLVowLTldKilcYltePl0qPi9nOwogICAgbGV0IG1hdGNoMjsKICAgIHdoaWxlICgobWF0Y2gyID0gdGFnUmVnZXguZXhlYyhodG1sMTYpKSAhPT0gbnVsbCkgewogICAgICBjb25zdCBpc0Nsb3NpbmcgPSBtYXRjaDJbMF0uc3RhcnRzV2l0aCgiPC8iKTsKICAgICAgY29uc3QgdGFnTmFtZSA9IG1hdGNoMlsxXS50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAoaXNDbG9zaW5nKSB7CiAgICAgICAgaWYgKG9wZW5UYWdzLmxlbmd0aCA9PT0gMCB8fCBvcGVuVGFnc1tvcGVuVGFncy5sZW5ndGggLSAxXSAhPT0gdGFnTmFtZSkgewogICAgICAgICAgY29uc29sZS53YXJuKGBNaXNtYXRjaGVkIGNsb3NpbmcgdGFnOiAke3RhZ05hbWV9YCk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIG9wZW5UYWdzLnBvcCgpOwogICAgICB9IGVsc2UgaWYgKCFtYXRjaDJbMF0uZW5kc1dpdGgoIi8+IikpIHsKICAgICAgICBvcGVuVGFncy5wdXNoKHRhZ05hbWUpOwogICAgICB9CiAgICB9CiAgICBpZiAob3BlblRhZ3MubGVuZ3RoID4gMCkgewogICAgICBjb25zb2xlLndhcm4oYFVuY2xvc2VkIHRhZ3M6ICR7b3BlblRhZ3Muam9pbigiLCAiKX1gKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIHNhbmRib3hDb250ZW50KHByZXZpZXcpIHsKICAgIGNvbnN0IHNjcmlwdHMgPSBwcmV2aWV3LnF1ZXJ5U2VsZWN0b3JBbGwoInNjcmlwdCIpOwogICAgc2NyaXB0cy5mb3JFYWNoKChzY3JpcHQpID0+IHNjcmlwdC5yZW1vdmUoKSk7CiAgICBjb25zdCBhbGxFbGVtZW50cyA9IHByZXZpZXcucXVlcnlTZWxlY3RvckFsbCgiKiIpOwogICAgYWxsRWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHsKICAgICAgQXJyYXkuZnJvbShlbC5hdHRyaWJ1dGVzKS5mb3JFYWNoKChhdHRyKSA9PiB7CiAgICAgICAgaWYgKGF0dHIubmFtZS5zdGFydHNXaXRoKCJvbiIpKSB7CiAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgICBjb25zdCBmb3JtcyA9IHByZXZpZXcucXVlcnlTZWxlY3RvckFsbCgiZm9ybSIpOwogICAgZm9ybXMuZm9yRWFjaCgoZm9ybSkgPT4gewogICAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIChlMTEpID0+IHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIH0pOwogICAgfSk7CiAgfQogIGVzY2FwZUh0bWwodGV4dDkpIHsKICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgZGl2LnRleHRDb250ZW50ID0gdGV4dDk7CiAgICByZXR1cm4gZGl2LmlubmVySFRNTDsKICB9CiAgZ2V0Q29udGVudChlbGVtZW50NCkgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmh0bWwtZWRpdG9yIik7CiAgICBpZiAoZWRpdG9yKSB7CiAgICAgIHJldHVybiBlZGl0b3IudmFsdWU7CiAgICB9CiAgICBjb25zdCBjb250YWluZXIgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuaHRtbC1ibG9jay1jb250YWluZXIiKTsKICAgIGNvbnN0IGJsb2NrSWQgPSBjb250YWluZXI/LmdldEF0dHJpYnV0ZSgiZGF0YS1ibG9jay1pZCIpOwogICAgcmV0dXJuICIiOwogIH0KICBzZXRDb250ZW50KGVsZW1lbnQ0LCBjb250ZW50MykgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmh0bWwtZWRpdG9yIik7CiAgICBpZiAoZWRpdG9yKSB7CiAgICAgIGVkaXRvci52YWx1ZSA9IGNvbnRlbnQzOwogICAgICB0aGlzLmF1dG9SZXNpemUoZWRpdG9yKTsKICAgIH0KICB9CiAgZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQpIHsKICAgIGNvbnN0IGVkaXRvciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5odG1sLWVkaXRvciIpOwogICAgcmV0dXJuIGVkaXRvciA/IGVkaXRvci5zZWxlY3Rpb25TdGFydCA6IG51bGw7CiAgfQogIHNldEN1cnNvclRvU3RhcnQoZWxlbWVudDQpIHsKICAgIGNvbnN0IGVkaXRvciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5odG1sLWVkaXRvciIpOwogICAgaWYgKGVkaXRvcikgewogICAgICBlZGl0b3Iuc2VsZWN0aW9uU3RhcnQgPSBlZGl0b3Iuc2VsZWN0aW9uRW5kID0gMDsKICAgICAgZWRpdG9yLmZvY3VzKCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmZvY3VzKGVsZW1lbnQ0KTsKICAgIH0KICB9CiAgc2V0Q3Vyc29yVG9FbmQoZWxlbWVudDQpIHsKICAgIGNvbnN0IGVkaXRvciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5odG1sLWVkaXRvciIpOwogICAgaWYgKGVkaXRvcikgewogICAgICBjb25zdCBsZW5ndGggPSBlZGl0b3IudmFsdWUubGVuZ3RoOwogICAgICBlZGl0b3Iuc2VsZWN0aW9uU3RhcnQgPSBlZGl0b3Iuc2VsZWN0aW9uRW5kID0gbGVuZ3RoOwogICAgICBlZGl0b3IuZm9jdXMoKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZm9jdXMoZWxlbWVudDQpOwogICAgfQogIH0KICBmb2N1cyhlbGVtZW50NCkgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmh0bWwtZWRpdG9yIik7CiAgICBpZiAoZWRpdG9yKSB7CiAgICAgIGVkaXRvci5mb2N1cygpOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgcHJldmlldyA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5odG1sLXByZXZpZXciKTsKICAgICAgcHJldmlldz8uZm9jdXMoKTsKICAgIH0KICB9CiAgZm9jdXNXaXRoQ3Vyc29yKGVsZW1lbnQ0LCBwb3NpdGlvbjMgPSAiZW5kIikgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmh0bWwtZWRpdG9yIik7CiAgICBpZiAoZWRpdG9yKSB7CiAgICAgIGlmIChwb3NpdGlvbjMgPT09ICJzdGFydCIpIHsKICAgICAgICB0aGlzLnNldEN1cnNvclRvU3RhcnQoZWxlbWVudDQpOwogICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uMyA9PT0gImVuZCIpIHsKICAgICAgICB0aGlzLnNldEN1cnNvclRvRW5kKGVsZW1lbnQ0KTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcG9zaXRpb24zID09PSAibnVtYmVyIikgewogICAgICAgIGVkaXRvci5zZWxlY3Rpb25TdGFydCA9IGVkaXRvci5zZWxlY3Rpb25FbmQgPSBwb3NpdGlvbjM7CiAgICAgICAgZWRpdG9yLmZvY3VzKCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZm9jdXMoZWxlbWVudDQpOwogICAgfQogIH0KICBnZXRTcGxpdENvbnRlbnQoZWxlbWVudDQpIHsKICAgIGNvbnN0IGVkaXRvciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5odG1sLWVkaXRvciIpOwogICAgaWYgKCFlZGl0b3IpCiAgICAgIHJldHVybiBudWxsOwogICAgY29uc3QgY3Vyc29yUG9zID0gZWRpdG9yLnNlbGVjdGlvblN0YXJ0OwogICAgcmV0dXJuIHsKICAgICAgYmVmb3JlOiBlZGl0b3IudmFsdWUuc3Vic3RyaW5nKDAsIGN1cnNvclBvcyksCiAgICAgIGFmdGVyOiBlZGl0b3IudmFsdWUuc3Vic3RyaW5nKGN1cnNvclBvcykKICAgIH07CiAgfQogIGdldFN0eWxlcygpIHsKICAgIHJldHVybiBgCiAgICAgIC8qIEhUTUwgQmxvY2sgQ29udGFpbmVyICovCiAgICAgIC5odG1sLWJsb2NrLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1hcmdpbjogMTJweCAwOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzNzQxNTEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzExMTgyNyIpfTsKICAgICAgfQogICAgICAKICAgICAgLmh0bWwtYmxvY2stY29udGFpbmVyLnNlbGVjdGVkIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOWNhM2FmIiwgIiM2YjcyODAiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC8qIEhlYWRlciAqLwogICAgICAuaHRtbC1oZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzM3NDE1MSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y5ZmFmYiIsICIjMGEwYTBhIil9OwogICAgICB9CiAgICAgIAogICAgICAuaHRtbC1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgICAgZm9udC1mYW1pbHk6ICdNb25hY28nLCAnQ29uc29sYXMnLCAnQ291cmllciBOZXcnLCBtb25vc3BhY2U7CiAgICAgIH0KICAgICAgCiAgICAgIC5odG1sLXRpdGxlIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzM3NDE1MSIsICIjZTVlN2ViIil9OwogICAgICB9CiAgICAgIAogICAgICAuaHRtbC10b2dnbGUtbW9kZSB7CiAgICAgICAgcGFkZGluZzogNHB4IDhweDsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzc0MTUxIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICB9CiAgICAgIAogICAgICAuaHRtbC10b2dnbGUtbW9kZTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmM2Y0ZjYiLCAiIzFmMjkzNyIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDFkNWRiIiwgIiM0YjU1NjMiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC8qIENvbnRlbnQgKi8KICAgICAgLmh0bWwtY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1pbi1oZWlnaHQ6IDEyMHB4OwogICAgICB9CiAgICAgIAogICAgICAvKiBFZGl0b3IgKi8KICAgICAgLmh0bWwtZWRpdG9yIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtaW4taGVpZ2h0OiAxMjBweDsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgICBmb250LWZhbWlseTogJ01vbmFjbycsICdDb25zb2xhcycsICdDb3VyaWVyIE5ldycsIG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxZjI5MzciLCAiI2YzZjRmNiIpfTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIAogICAgICAuaHRtbC1lZGl0b3I6OnBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5Y2EzYWYiLCAiIzZiNzI4MCIpfTsKICAgICAgfQogICAgICAKICAgICAgLyogUHJldmlldyAqLwogICAgICAuaHRtbC1wcmV2aWV3IHsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDk2cHg7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxZjI5MzciLCAiI2YzZjRmNiIpfTsKICAgICAgfQogICAgICAKICAgICAgLnByZXZpZXctZW1wdHkgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzljYTNhZiIsICIjNmI3MjgwIil9OwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQogICAgICAKICAgICAgLyogU2FuZGJveGVkIEhUTUwgcHJldmlldyBzdHlsZXMgKi8KICAgICAgLmh0bWwtcHJldmlldyAqIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgCiAgICAgIC5odG1sLXByZXZpZXcgaW1nIHsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgIH0KICAgICAgCiAgICAgIC5odG1sLXByZXZpZXcgYSB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiM2MGE1ZmEiKX07CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CiAgICAgIAogICAgICAuaHRtbC1wcmV2aWV3IGE6aG92ZXIgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICB9CiAgICAgIAogICAgICAuaHRtbC1wcmV2aWV3IHRhYmxlIHsKICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbjogOHB4IDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5odG1sLXByZXZpZXcgdGgsCiAgICAgIC5odG1sLXByZXZpZXcgdGQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzNzQxNTEiKX07CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5odG1sLXByZXZpZXcgdGggewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjlmYWZiIiwgIiMxZjI5MzciKX07CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgfQogICAgICAKICAgICAgLmh0bWwtcHJldmlldyBwcmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjNmNGY2IiwgIiMxZjI5MzciKX07CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgb3ZlcmZsb3cteDogYXV0bzsKICAgICAgICBtYXJnaW46IDhweCAwOwogICAgICB9CiAgICAgIAogICAgICAuaHRtbC1wcmV2aWV3IGNvZGUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjNmNGY2IiwgIiMxZjI5MzciKX07CiAgICAgICAgcGFkZGluZzogMnB4IDRweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZm9udC1mYW1pbHk6ICdNb25hY28nLCAnQ29uc29sYXMnLCAnQ291cmllciBOZXcnLCBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiAwLjllbTsKICAgICAgfQogICAgICAKICAgICAgLmh0bWwtcHJldmlldyBwcmUgY29kZSB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQogICAgYDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL3d5c2l3eWcuYmxvY2tyZWdpc3RyYXRpb24uanMKZnVuY3Rpb24gcmVnaXN0ZXJBbGxCbG9ja0hhbmRsZXJzKCkgewogIEJsb2NrUmVnaXN0cnkucmVnaXN0ZXIoImRpdmlkZXIiLCBuZXcgRGl2aWRlckJsb2NrSGFuZGxlcigpKTsKICBCbG9ja1JlZ2lzdHJ5LnJlZ2lzdGVyKCJwYXJhZ3JhcGgiLCBuZXcgUGFyYWdyYXBoQmxvY2tIYW5kbGVyKCkpOwogIEJsb2NrUmVnaXN0cnkucmVnaXN0ZXIoImhlYWRpbmctMSIsIG5ldyBIZWFkaW5nQmxvY2tIYW5kbGVyKCJoZWFkaW5nLTEiKSk7CiAgQmxvY2tSZWdpc3RyeS5yZWdpc3RlcigiaGVhZGluZy0yIiwgbmV3IEhlYWRpbmdCbG9ja0hhbmRsZXIoImhlYWRpbmctMiIpKTsKICBCbG9ja1JlZ2lzdHJ5LnJlZ2lzdGVyKCJoZWFkaW5nLTMiLCBuZXcgSGVhZGluZ0Jsb2NrSGFuZGxlcigiaGVhZGluZy0zIikpOwogIEJsb2NrUmVnaXN0cnkucmVnaXN0ZXIoInF1b3RlIiwgbmV3IFF1b3RlQmxvY2tIYW5kbGVyKCkpOwogIEJsb2NrUmVnaXN0cnkucmVnaXN0ZXIoImNvZGUiLCBuZXcgQ29kZUJsb2NrSGFuZGxlcigpKTsKICBCbG9ja1JlZ2lzdHJ5LnJlZ2lzdGVyKCJsaXN0IiwgbmV3IExpc3RCbG9ja0hhbmRsZXIoKSk7CiAgQmxvY2tSZWdpc3RyeS5yZWdpc3RlcigiaW1hZ2UiLCBuZXcgSW1hZ2VCbG9ja0hhbmRsZXIoKSk7CiAgQmxvY2tSZWdpc3RyeS5yZWdpc3RlcigieW91dHViZSIsIG5ldyBZb3VUdWJlQmxvY2tIYW5kbGVyKCkpOwogIEJsb2NrUmVnaXN0cnkucmVnaXN0ZXIoImF0dGFjaG1lbnQiLCBuZXcgQXR0YWNobWVudEJsb2NrSGFuZGxlcigpKTsKICBCbG9ja1JlZ2lzdHJ5LnJlZ2lzdGVyKCJtYXJrZG93biIsIG5ldyBNYXJrZG93bkJsb2NrSGFuZGxlcigpKTsKICBCbG9ja1JlZ2lzdHJ5LnJlZ2lzdGVyKCJodG1sIiwgbmV3IEh0bWxCbG9ja0hhbmRsZXIoKSk7Cn0KcmVnaXN0ZXJBbGxCbG9ja0hhbmRsZXJzKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL3d5c2l3eWcubW9kYWxtYW5hZ2VyLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBXeXNpd3lnTW9kYWxNYW5hZ2VyID0gY2xhc3MgewogIC8qKgogICAqIFNob3dzIGxhbmd1YWdlIHNlbGVjdGlvbiBtb2RhbCBmb3IgY29kZSBibG9ja3MKICAgKi8KICBzdGF0aWMgYXN5bmMgc2hvd0xhbmd1YWdlU2VsZWN0aW9uTW9kYWwoKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiB7CiAgICAgIGxldCBzZWxlY3RlZExhbmd1YWdlID0gbnVsbDsKICAgICAgRGVlc01vZGFsLmNyZWF0ZUFuZFNob3coewogICAgICAgIGhlYWRpbmc6ICJTZWxlY3QgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UiLAogICAgICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAubGFuZ3VhZ2UtY29udGFpbmVyIHsKICAgICAgICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgICAgICAgIG1heC1oZWlnaHQ6IDQwMHB4OwogICAgICAgICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLmxhbmd1YWdlLWdyaWQgewogICAgICAgICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMTIwcHgsIDFmcikpOwogICAgICAgICAgICAgIGdhcDogOHB4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC5sYW5ndWFnZS1idXR0b24gewogICAgICAgICAgICAgIHBhZGRpbmc6IDEycHggOHB4OwogICAgICAgICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzNzQxNTEiKX07CiAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMzc0MTUxIiwgIiNlNWU3ZWIiKX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLmxhbmd1YWdlLWJ1dHRvbjpob3ZlciB7CiAgICAgICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOWZhZmIiLCAiIzFmMjkzNyIpfTsKICAgICAgICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDFkNWRiIiwgIiM0YjU1NjMiKX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLmxhbmd1YWdlLWJ1dHRvbi5zZWxlY3RlZCB7CiAgICAgICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmM2Y0ZjYiLCAiIzM3NDE1MSIpfTsKICAgICAgICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOWNhM2FmIiwgIiM2YjcyODAiKX07CiAgICAgICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTExODI3IiwgIiNmOWZhZmIiKX07CiAgICAgICAgICAgIH0KICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsYW5ndWFnZS1jb250YWluZXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYW5ndWFnZS1ncmlkIj4KICAgICAgICAgICAgICAke3RoaXMuZ2V0TGFuZ3VhZ2VzKCkubWFwKChsYW5nKSA9PiBiMmAKICAgICAgICAgICAgICAgIDxkaXYgCiAgICAgICAgICAgICAgICAgIGNsYXNzPSJsYW5ndWFnZS1idXR0b24gJHtzZWxlY3RlZExhbmd1YWdlID09PSBsYW5nLnRvTG93ZXJDYXNlKCkgPyAic2VsZWN0ZWQiIDogIiJ9IiAKICAgICAgICAgICAgICAgICAgQGNsaWNrPSIkeygpID0+IHsKICAgICAgICAgIHNlbGVjdGVkTGFuZ3VhZ2UgPSBsYW5nLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImRlZXMtbW9kYWwiKTsKICAgICAgICAgIGlmIChtb2RhbCAmJiB0eXBlb2YgbW9kYWwuZGVzdHJveSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBtb2RhbC5kZXN0cm95KCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXNvbHZlMihzZWxlY3RlZExhbmd1YWdlKTsKICAgICAgICB9fSI+CiAgICAgICAgICAgICAgICAgICR7bGFuZ30KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIGApfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGAsCiAgICAgICAgbWVudU9wdGlvbnM6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgbmFtZTogIkNhbmNlbCIsCiAgICAgICAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiB7CiAgICAgICAgICAgICAgbW9kYWwuZGVzdHJveSgpOwogICAgICAgICAgICAgIHJlc29sdmUyKG51bGwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9KTsKICAgIH0pOwogIH0KICAvKioKICAgKiBTaG93cyBibG9jayBzZXR0aW5ncyBtb2RhbAogICAqLwogIHN0YXRpYyBhc3luYyBzaG93QmxvY2tTZXR0aW5nc01vZGFsKGJsb2NrLCBvblVwZGF0ZSkgewogICAgY29uc3QgY29udGVudDMgPSBiMmAKICAgICAgPHN0eWxlPgogICAgICAgIC5zZXR0aW5ncy1jb250YWluZXIgewogICAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICB9CiAgICAgICAgLnNldHRpbmdzLXNlY3Rpb24gewogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgICB9CiAgICAgICAgLnNldHRpbmdzLXNlY3Rpb246bGFzdC1jaGlsZCB7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICAgIH0KICAgICAgICAuc2V0dGluZ3MtbGFiZWwgewogICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzZiNzI4MCIsICIjOWNhM2FmIil9OwogICAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07CiAgICAgICAgfQogICAgICAgIC5ibG9jay10eXBlLWdyaWQgewogICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDE2MHB4LCAxZnIpKTsKICAgICAgICAgIGdhcDogOHB4OwogICAgICAgIH0KICAgICAgICAuYmxvY2stdHlwZS1idXR0b24gewogICAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzM3NDE1MSIpfTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzNzQxNTEiLCAiI2U1ZTdlYiIpfTsKICAgICAgICB9CiAgICAgICAgLmJsb2NrLXR5cGUtYnV0dG9uOmhvdmVyIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjlmYWZiIiwgIiMxZjI5MzciKX07CiAgICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDFkNWRiIiwgIiM0YjU1NjMiKX07CiAgICAgICAgfQogICAgICAgIC5ibG9jay10eXBlLWJ1dHRvbi5zZWxlY3RlZCB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YzZjRmNiIsICIjMzc0MTUxIil9OwogICAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzljYTNhZiIsICIjNmI3MjgwIil9OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTExODI3IiwgIiNmOWZhZmIiKX07CiAgICAgICAgfQogICAgICAgIC5ibG9jay10eXBlLWljb24gewogICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICAgIHdpZHRoOiAyMHB4OwogICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgICAgfQogICAgICA8L3N0eWxlPgogICAgICA8ZGl2IGNsYXNzPSJzZXR0aW5ncy1jb250YWluZXIiPgogICAgICAgICR7dGhpcy5nZXRCbG9ja1R5cGVTZWxlY3RvcihibG9jaywgb25VcGRhdGUpfQogICAgICAgICR7YmxvY2sudHlwZSA9PT0gImNvZGUiID8gdGhpcy5nZXRDb2RlQmxvY2tTZXR0aW5ncyhibG9jaywgb25VcGRhdGUpIDogIiJ9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIERlZXNNb2RhbC5jcmVhdGVBbmRTaG93KHsKICAgICAgaGVhZGluZzogIkJsb2NrIFNldHRpbmdzIiwKICAgICAgY29udGVudDogY29udGVudDMsCiAgICAgIG1lbnVPcHRpb25zOiBbCiAgICAgICAgewogICAgICAgICAgbmFtZTogIkRvbmUiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWwpID0+IHsKICAgICAgICAgICAgbW9kYWwuZGVzdHJveSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgXQogICAgfSk7CiAgfQogIC8qKgogICAqIEdldHMgY29kZSBibG9jayBzZXR0aW5ncyBjb250ZW50CiAgICovCiAgc3RhdGljIGdldENvZGVCbG9ja1NldHRpbmdzKGJsb2NrLCBvblVwZGF0ZSkgewogICAgY29uc3QgY3VycmVudExhbmd1YWdlID0gYmxvY2subWV0YWRhdGE/Lmxhbmd1YWdlIHx8ICJqYXZhc2NyaXB0IjsKICAgIHJldHVybiBiMmAKICAgICAgPHN0eWxlPgogICAgICAgIC5sYW5ndWFnZS1ncmlkIHsKICAgICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgxMDBweCwgMWZyKSk7CiAgICAgICAgICBnYXA6IDZweDsKICAgICAgICB9CiAgICAgICAgLmxhbmd1YWdlLWJ1dHRvbiB7CiAgICAgICAgICBwYWRkaW5nOiA4cHggNHB4OwogICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzc0MTUxIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzNzQxNTEiLCAiI2U1ZTdlYiIpfTsKICAgICAgICB9CiAgICAgICAgLmxhbmd1YWdlLWJ1dHRvbjpob3ZlciB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y5ZmFmYiIsICIjMWYyOTM3Iil9OwogICAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2QxZDVkYiIsICIjNGI1NTYzIil9OwogICAgICAgIH0KICAgICAgICAubGFuZ3VhZ2UtYnV0dG9uLnNlbGVjdGVkIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjNmNGY2IiwgIiMzNzQxNTEiKX07CiAgICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOWNhM2FmIiwgIiM2YjcyODAiKX07CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxMTE4MjciLCAiI2Y5ZmFmYiIpfTsKICAgICAgICB9CiAgICAgIDwvc3R5bGU+CiAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzLXNlY3Rpb24iPgogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzLWxhYmVsIj5Qcm9ncmFtbWluZyBMYW5ndWFnZTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Imxhbmd1YWdlLWdyaWQiPgogICAgICAgICAgJHt0aGlzLmdldExhbmd1YWdlcygpLm1hcCgobGFuZykgPT4gYjJgCiAgICAgICAgICAgIDxkaXYgCiAgICAgICAgICAgICAgY2xhc3M9Imxhbmd1YWdlLWJ1dHRvbiAke2N1cnJlbnRMYW5ndWFnZSA9PT0gbGFuZy50b0xvd2VyQ2FzZSgpID8gInNlbGVjdGVkIiA6ICIifSIgCiAgICAgICAgICAgICAgQGNsaWNrPSIkeygpID0+IHsKICAgICAgaWYgKCFibG9jay5tZXRhZGF0YSkKICAgICAgICBibG9jay5tZXRhZGF0YSA9IHt9OwogICAgICBibG9jay5tZXRhZGF0YS5sYW5ndWFnZSA9IGxhbmcudG9Mb3dlckNhc2UoKTsKICAgICAgb25VcGRhdGUoYmxvY2spOwogICAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImRlZXMtbW9kYWwiKTsKICAgICAgaWYgKG1vZGFsICYmIHR5cGVvZiBtb2RhbC5kZXN0cm95ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgbW9kYWwuZGVzdHJveSgpOwogICAgICB9CiAgICB9fSIKICAgICAgICAgICAgICBkYXRhLWxhbmc9IiR7bGFuZ30iCiAgICAgICAgICAgID4ke2xhbmd9PC9kaXY+CiAgICAgICAgICBgKX0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICAvKioKICAgKiBHZXRzIGF2YWlsYWJsZSBwcm9ncmFtbWluZyBsYW5ndWFnZXMKICAgKi8KICBzdGF0aWMgZ2V0TGFuZ3VhZ2VzKCkgewogICAgcmV0dXJuIFsuLi5QUk9HUkFNTUlOR19MQU5HVUFHRVNdOwogIH0KICAvKioKICAgKiBHZXRzIGJsb2NrIHR5cGUgc2VsZWN0b3IKICAgKi8KICBzdGF0aWMgZ2V0QmxvY2tUeXBlU2VsZWN0b3IoYmxvY2ssIG9uVXBkYXRlKSB7CiAgICBjb25zdCBibG9ja1R5cGVzID0gV3lzaXd5Z1Nob3J0Y3V0cy5nZXRTbGFzaE1lbnVJdGVtcygpLmZpbHRlcigoaXRlbSkgPT4gaXRlbS50eXBlICE9PSAiZGl2aWRlciIpOwogICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJzZXR0aW5ncy1zZWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZXR0aW5ncy1sYWJlbCI+QmxvY2sgVHlwZTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImJsb2NrLXR5cGUtZ3JpZCI+CiAgICAgICAgICAke2Jsb2NrVHlwZXMubWFwKChpdGVtKSA9PiBiMmAKICAgICAgICAgICAgPGRpdiAKICAgICAgICAgICAgICBjbGFzcz0iYmxvY2stdHlwZS1idXR0b24gJHtibG9jay50eXBlID09PSBpdGVtLnR5cGUgPyAic2VsZWN0ZWQiIDogIiJ9IgogICAgICAgICAgICAgIEBjbGljaz0iJHthc3luYyAoZTExKSA9PiB7CiAgICAgIGNvbnN0IGJ1dHRvbiA9IGUxMS5jdXJyZW50VGFyZ2V0OwogICAgICBjb25zdCBvbGRUeXBlID0gYmxvY2sudHlwZTsKICAgICAgYmxvY2sudHlwZSA9IGl0ZW0udHlwZTsKICAgICAgaWYgKG9sZFR5cGUgPT09ICJjb2RlIiAmJiBibG9jay50eXBlICE9PSAiY29kZSIpIHsKICAgICAgICBkZWxldGUgYmxvY2subWV0YWRhdGE/Lmxhbmd1YWdlOwogICAgICB9IGVsc2UgaWYgKG9sZFR5cGUgPT09ICJsaXN0IiAmJiBibG9jay50eXBlICE9PSAibGlzdCIpIHsKICAgICAgICBkZWxldGUgYmxvY2subWV0YWRhdGE/Lmxpc3RUeXBlOwogICAgICB9IGVsc2UgaWYgKGJsb2NrLnR5cGUgPT09ICJsaXN0IiAmJiAhYmxvY2subWV0YWRhdGE/Lmxpc3RUeXBlKSB7CiAgICAgICAgYmxvY2subWV0YWRhdGEgPSB7IGxpc3RUeXBlOiAiYnVsbGV0IiB9OwogICAgICB9IGVsc2UgaWYgKGJsb2NrLnR5cGUgPT09ICJjb2RlIiAmJiAhYmxvY2subWV0YWRhdGE/Lmxhbmd1YWdlKSB7CiAgICAgICAgY29uc3QgbGFuZ3VhZ2UgPSBhd2FpdCB0aGlzLnNob3dMYW5ndWFnZVNlbGVjdGlvbk1vZGFsKCk7CiAgICAgICAgaWYgKGxhbmd1YWdlKSB7CiAgICAgICAgICBibG9jay5tZXRhZGF0YSA9IHsgbGFuZ3VhZ2UgfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYmxvY2sudHlwZSA9IG9sZFR5cGU7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIG9uVXBkYXRlKGJsb2NrKTsKICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJkZWVzLW1vZGFsIik7CiAgICAgIGlmIChtb2RhbCAmJiB0eXBlb2YgbW9kYWwuZGVzdHJveSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIG1vZGFsLmRlc3Ryb3koKTsKICAgICAgfQogICAgfX0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYmxvY2stdHlwZS1pY29uIj4ke2l0ZW0uaWNvbn08L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4+JHtpdGVtLmxhYmVsfTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgKX0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvd3lzaXd5Zy5pbnB1dGhhbmRsZXIuanMKdmFyIFd5c2l3eWdJbnB1dEhhbmRsZXIgPSBjbGFzcyB7CiAgY29tcG9uZW50OwogIHNhdmVUaW1lb3V0ID0gbnVsbDsKICBjb25zdHJ1Y3Rvcihjb21wb25lbnQpIHsKICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwogIH0KICAvKioKICAgKiBIYW5kbGVzIGlucHV0IGV2ZW50cyBmb3IgYmxvY2tzCiAgICovCiAgaGFuZGxlQmxvY2tJbnB1dChlMTEsIGJsb2NrKSB7CiAgICBpZiAodGhpcy5jb21wb25lbnQuaXNDb21wb3NpbmcpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IHRhcmdldCA9IGUxMS50YXJnZXQ7CiAgICBjb25zdCB0ZXh0Q29udGVudCA9IHRhcmdldC50ZXh0Q29udGVudCB8fCAiIjsKICAgIGNvbnN0IGRldGVjdGVkVHlwZSA9IHRoaXMuZGV0ZWN0QmxvY2tUeXBlSW50ZW50KHRleHRDb250ZW50KTsKICAgIGlmIChkZXRlY3RlZFR5cGUgJiYgZGV0ZWN0ZWRUeXBlLnR5cGUgIT09IGJsb2NrLnR5cGUpIHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHRoaXMuaGFuZGxlQmxvY2tUcmFuc2Zvcm1hdGlvbihibG9jaywgZGV0ZWN0ZWRUeXBlLCB0YXJnZXQpOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLmhhbmRsZVNsYXNoQ29tbWFuZCh0ZXh0Q29udGVudCwgdGFyZ2V0KTsKICAgIHRoaXMuc2NoZWR1bGVBdXRvU2F2ZSgpOwogIH0KICAvKioKICAgKiBVcGRhdGVzIGJsb2NrIGNvbnRlbnQgYmFzZWQgb24gaXRzIHR5cGUKICAgKi8KICB1cGRhdGVCbG9ja0NvbnRlbnQoYmxvY2ssIHRhcmdldCkgewogICAgY29uc3Qgd3JhcHBlckVsZW1lbnQgPSB0YXJnZXQuY2xvc2VzdCgiLmJsb2NrLXdyYXBwZXIiKTsKICAgIGNvbnN0IGJsb2NrQ29tcG9uZW50ID0gd3JhcHBlckVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgaWYgKGJsb2NrQ29tcG9uZW50KSB7CiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBibG9ja0NvbXBvbmVudC5nZXRDb250ZW50KCk7CiAgICAgIGlmIChibG9jay5jb250ZW50ICE9PSBuZXdDb250ZW50KSB7CiAgICAgICAgYmxvY2suY29udGVudCA9IG5ld0NvbnRlbnQ7CiAgICAgIH0KICAgICAgaWYgKGJsb2NrLnR5cGUgPT09ICJsaXN0IikgewogICAgICAgIGNvbnN0IGxpc3RFbGVtZW50ID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoIm9sLCB1bCIpOwogICAgICAgIGlmIChsaXN0RWxlbWVudCkgewogICAgICAgICAgYmxvY2subWV0YWRhdGEgPSB7CiAgICAgICAgICAgIGxpc3RUeXBlOiBsaXN0RWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJvbCIgPyAib3JkZXJlZCIgOiAiYnVsbGV0IgogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChibG9jay50eXBlID09PSAibGlzdCIpIHsKICAgICAgICBjb25zdCBsaXN0SXRlbXMgPSB0YXJnZXQucXVlcnlTZWxlY3RvckFsbCgibGkiKTsKICAgICAgICBibG9jay5jb250ZW50ID0gQXJyYXkuZnJvbShsaXN0SXRlbXMpLm1hcCgobGkyKSA9PiBsaTIuaW5uZXJIVE1MIHx8ICIiKS5qb2luKCJcbiIpOwogICAgICAgIGNvbnN0IGxpc3RFbGVtZW50ID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoIm9sLCB1bCIpOwogICAgICAgIGlmIChsaXN0RWxlbWVudCkgewogICAgICAgICAgYmxvY2subWV0YWRhdGEgPSB7CiAgICAgICAgICAgIGxpc3RUeXBlOiBsaXN0RWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJvbCIgPyAib3JkZXJlZCIgOiAiYnVsbGV0IgogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYmxvY2sudHlwZSA9PT0gImNvZGUiKSB7CiAgICAgICAgYmxvY2suY29udGVudCA9IHRhcmdldC50ZXh0Q29udGVudCB8fCAiIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBibG9jay5jb250ZW50ID0gdGFyZ2V0LmlubmVySFRNTCB8fCAiIjsKICAgICAgfQogICAgfQogIH0KICAvKioKICAgKiBEZXRlY3RzIGlmIHRoZSB1c2VyIGlzIHRyeWluZyB0byBjcmVhdGUgYSBzcGVjaWZpYyBibG9jayB0eXBlCiAgICovCiAgZGV0ZWN0QmxvY2tUeXBlSW50ZW50KGNvbnRlbnQzKSB7CiAgICBjb25zdCBoZWFkaW5nUmVzdWx0ID0gV3lzaXd5Z1Nob3J0Y3V0cy5jaGVja0hlYWRpbmdTaG9ydGN1dChjb250ZW50Myk7CiAgICBpZiAoaGVhZGluZ1Jlc3VsdCkgewogICAgICByZXR1cm4gaGVhZGluZ1Jlc3VsdDsKICAgIH0KICAgIGNvbnN0IGxpc3RSZXN1bHQgPSBXeXNpd3lnU2hvcnRjdXRzLmNoZWNrTGlzdFNob3J0Y3V0KGNvbnRlbnQzKTsKICAgIGlmIChsaXN0UmVzdWx0KSB7CiAgICAgIHJldHVybiBsaXN0UmVzdWx0OwogICAgfQogICAgaWYgKFd5c2l3eWdTaG9ydGN1dHMuY2hlY2tRdW90ZVNob3J0Y3V0KGNvbnRlbnQzKSkgewogICAgICByZXR1cm4geyB0eXBlOiAicXVvdGUiIH07CiAgICB9CiAgICBpZiAoV3lzaXd5Z1Nob3J0Y3V0cy5jaGVja0NvZGVTaG9ydGN1dChjb250ZW50MykpIHsKICAgICAgcmV0dXJuIHsgdHlwZTogImNvZGUiIH07CiAgICB9CiAgICBpZiAoV3lzaXd5Z1Nob3J0Y3V0cy5jaGVja0RpdmlkZXJTaG9ydGN1dChjb250ZW50MykpIHsKICAgICAgcmV0dXJuIHsgdHlwZTogImRpdmlkZXIiIH07CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgLyoqCiAgICogSGFuZGxlcyBibG9jayB0eXBlIHRyYW5zZm9ybWF0aW9uCiAgICovCiAgYXN5bmMgaGFuZGxlQmxvY2tUcmFuc2Zvcm1hdGlvbihibG9jaywgZGV0ZWN0ZWRUeXBlLCB0YXJnZXQpIHsKICAgIGNvbnN0IGJsb2NrT3BzID0gdGhpcy5jb21wb25lbnQuYmxvY2tPcGVyYXRpb25zOwogICAgaWYgKGRldGVjdGVkVHlwZS50eXBlID09PSAibGlzdCIpIHsKICAgICAgYmxvY2sudHlwZSA9ICJsaXN0IjsKICAgICAgYmxvY2suY29udGVudCA9ICIiOwogICAgICBibG9jay5tZXRhZGF0YSA9IHsgbGlzdFR5cGU6IGRldGVjdGVkVHlwZS5saXN0VHlwZSB9OwogICAgICBjb25zdCBsaXN0VGFnID0gZGV0ZWN0ZWRUeXBlLmxpc3RUeXBlID09PSAib3JkZXJlZCIgPyAib2wiIDogInVsIjsKICAgICAgdGFyZ2V0LmlubmVySFRNTCA9IGA8JHtsaXN0VGFnfT48bGk+PC9saT48LyR7bGlzdFRhZ30+YDsKICAgICAgdGhpcy5jb21wb25lbnQudXBkYXRlVmFsdWUoKTsKICAgICAgaWYgKHRoaXMuY29tcG9uZW50LmVkaXRvckNvbnRlbnRSZWYpIHsKICAgICAgICB0aGlzLmNvbXBvbmVudC51cGRhdGVCbG9ja0VsZW1lbnQoYmxvY2suaWQpOwogICAgICB9CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIFd5c2l3eWdCbG9ja3MuZm9jdXNMaXN0SXRlbSh0YXJnZXQpOwogICAgICB9LCAwKTsKICAgIH0gZWxzZSBpZiAoZGV0ZWN0ZWRUeXBlLnR5cGUgPT09ICJkaXZpZGVyIikgewogICAgICBibG9jay50eXBlID0gImRpdmlkZXIiOwogICAgICBibG9jay5jb250ZW50ID0gIiAiOwogICAgICBpZiAodGhpcy5jb21wb25lbnQuZWRpdG9yQ29udGVudFJlZikgewogICAgICAgIHRoaXMuY29tcG9uZW50LnVwZGF0ZUJsb2NrRWxlbWVudChibG9jay5pZCk7CiAgICAgIH0KICAgICAgY29uc3QgbmV3QmxvY2sgPSBibG9ja09wcy5jcmVhdGVCbG9jaygpOwogICAgICBibG9ja09wcy5pbnNlcnRCbG9ja0FmdGVyKGJsb2NrLCBuZXdCbG9jayk7CiAgICAgIHRoaXMuY29tcG9uZW50LnVwZGF0ZVZhbHVlKCk7CiAgICB9IGVsc2UgaWYgKGRldGVjdGVkVHlwZS50eXBlID09PSAiY29kZSIpIHsKICAgICAgY29uc3QgbGFuZ3VhZ2UgPSBhd2FpdCBXeXNpd3lnTW9kYWxNYW5hZ2VyLnNob3dMYW5ndWFnZVNlbGVjdGlvbk1vZGFsKCk7CiAgICAgIGlmIChsYW5ndWFnZSkgewogICAgICAgIGJsb2NrLnR5cGUgPSAiY29kZSI7CiAgICAgICAgYmxvY2suY29udGVudCA9ICIiOwogICAgICAgIGJsb2NrLm1ldGFkYXRhID0geyBsYW5ndWFnZSB9OwogICAgICAgIHRhcmdldC50ZXh0Q29udGVudCA9ICIiOwogICAgICAgIHRoaXMuY29tcG9uZW50LnVwZGF0ZVZhbHVlKCk7CiAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50LmVkaXRvckNvbnRlbnRSZWYpIHsKICAgICAgICAgIHRoaXMuY29tcG9uZW50LnVwZGF0ZUJsb2NrRWxlbWVudChibG9jay5pZCk7CiAgICAgICAgfQogICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4gewogICAgICAgICAgYXdhaXQgYmxvY2tPcHMuZm9jdXNCbG9jayhibG9jay5pZCwgInN0YXJ0Iik7CiAgICAgICAgfSwgNTApOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBibG9jay50eXBlID0gZGV0ZWN0ZWRUeXBlLnR5cGU7CiAgICAgIGJsb2NrLmNvbnRlbnQgPSAiIjsKICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gIiI7CiAgICAgIHRoaXMuY29tcG9uZW50LnVwZGF0ZVZhbHVlKCk7CiAgICAgIGlmICh0aGlzLmNvbXBvbmVudC5lZGl0b3JDb250ZW50UmVmKSB7CiAgICAgICAgdGhpcy5jb21wb25lbnQudXBkYXRlQmxvY2tFbGVtZW50KGJsb2NrLmlkKTsKICAgICAgfQogICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHsKICAgICAgICBhd2FpdCBibG9ja09wcy5mb2N1c0Jsb2NrKGJsb2NrLmlkLCAic3RhcnQiKTsKICAgICAgfSwgNTApOwogICAgfQogIH0KICAvKioKICAgKiBIYW5kbGVzIHNsYXNoIGNvbW1hbmQgZGV0ZWN0aW9uIGFuZCBtZW51IGRpc3BsYXkKICAgKi8KICBoYW5kbGVTbGFzaENvbW1hbmQodGV4dENvbnRlbnQsIHRhcmdldCkgewogICAgY29uc3Qgc2xhc2hNZW51ID0gdGhpcy5jb21wb25lbnQuc2xhc2hNZW51OwogICAgY29uc3QgaXNTbGFzaE1lbnVWaXNpYmxlID0gc2xhc2hNZW51ICYmIHNsYXNoTWVudS52aXNpYmxlOwogICAgaWYgKHRleHRDb250ZW50ID09PSAiLyIgfHwgdGV4dENvbnRlbnQuc3RhcnRzV2l0aCgiLyIpICYmIGlzU2xhc2hNZW51VmlzaWJsZSkgewogICAgICBpZiAoIWlzU2xhc2hNZW51VmlzaWJsZSAmJiB0ZXh0Q29udGVudCA9PT0gIi8iKSB7CiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZ2V0Q2FyZXRDb29yZGluYXRlcyh0YXJnZXQpOwogICAgICAgIHNsYXNoTWVudS5zaG93KHsgeDogcmVjdC5sZWZ0LCB5OiByZWN0LmJvdHRvbSArIDQgfSwgKHR5cGU1KSA9PiB7CiAgICAgICAgICB0aGlzLmNvbXBvbmVudC5pbnNlcnRCbG9jayh0eXBlNSk7CiAgICAgICAgfSk7CiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSB0YXJnZXQpIHsKICAgICAgICAgICAgdGFyZ2V0LmZvY3VzKCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKHNsYXNoTWVudSkgewogICAgICAgIHNsYXNoTWVudS51cGRhdGVGaWx0ZXIodGV4dENvbnRlbnQuc2xpY2UoMSkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKCF0ZXh0Q29udGVudC5zdGFydHNXaXRoKCIvIikpIHsKICAgICAgdGhpcy5jb21wb25lbnQuY2xvc2VTbGFzaE1lbnUoKTsKICAgIH0KICB9CiAgLyoqCiAgICogR2V0cyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGNhcmV0L2N1cnNvcgogICAqLwogIGdldENhcmV0Q29vcmRpbmF0ZXMoZWxlbWVudDQpIHsKICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7CiAgICAgIGNvbnN0IHJhbmdlMiA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgICBjb25zdCByZWN0ID0gcmFuZ2UyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBpZiAocmVjdC53aWR0aCA+IDAgfHwgcmVjdC5oZWlnaHQgPiAwKSB7CiAgICAgICAgcmV0dXJuIHJlY3Q7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBlbGVtZW50NC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICB9CiAgLyoqCiAgICogU2NoZWR1bGVzIGF1dG8tc2F2ZSBhZnRlciBhIGRlbGF5CiAgICovCiAgc2NoZWR1bGVBdXRvU2F2ZSgpIHsKICAgIGlmICh0aGlzLnNhdmVUaW1lb3V0KSB7CiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNhdmVUaW1lb3V0KTsKICAgIH0KICAgIGlmICh0aGlzLmNvbXBvbmVudC5zbGFzaE1lbnUgJiYgdGhpcy5jb21wb25lbnQuc2xhc2hNZW51LnZpc2libGUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5zYXZlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICB0aGlzLnN5bmNBbGxCbG9ja0NvbnRlbnQoKTsKICAgICAgdGhpcy5jb21wb25lbnQudXBkYXRlVmFsdWUoKTsKICAgIH0sIDJlMyk7CiAgfQogIC8qKgogICAqIFN5bmNzIGNvbnRlbnQgZnJvbSBhbGwgYmxvY2sgRE9NcyB0byB0aGUgZGF0YSBtb2RlbAogICAqLwogIHN5bmNBbGxCbG9ja0NvbnRlbnQoKSB7CiAgICB0aGlzLmNvbXBvbmVudC5ibG9ja3MuZm9yRWFjaCgoYmxvY2spID0+IHsKICAgICAgY29uc3Qgd3JhcHBlckVsZW1lbnQgPSB0aGlzLmNvbXBvbmVudC5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKGBbZGF0YS1ibG9jay1pZD0iJHtibG9jay5pZH0iXWApOwogICAgICBjb25zdCBibG9ja0NvbXBvbmVudCA9IHdyYXBwZXJFbGVtZW50Py5xdWVyeVNlbGVjdG9yKCJkZWVzLXd5c2l3eWctYmxvY2siKTsKICAgICAgaWYgKGJsb2NrQ29tcG9uZW50ICYmIGJsb2NrQ29tcG9uZW50LmdldENvbnRlbnQpIHsKICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gYmxvY2tDb21wb25lbnQuZ2V0Q29udGVudCgpOwogICAgICAgIGlmIChibG9jay5jb250ZW50ICE9PSBuZXdDb250ZW50KSB7CiAgICAgICAgICBibG9jay5jb250ZW50ID0gbmV3Q29udGVudDsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KICAvKioKICAgKiBDbGVhbnMgdXAgcmVzb3VyY2VzCiAgICovCiAgZGVzdHJveSgpIHsKICAgIGlmICh0aGlzLnNhdmVUaW1lb3V0KSB7CiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNhdmVUaW1lb3V0KTsKICAgIH0KICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL3d5c2l3eWcua2V5Ym9hcmRoYW5kbGVyLmpzCnZhciBXeXNpd3lnS2V5Ym9hcmRIYW5kbGVyID0gY2xhc3MgewogIGNvbXBvbmVudDsKICBjb25zdHJ1Y3Rvcihjb21wb25lbnQpIHsKICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwogIH0KICAvKioKICAgKiBIYW5kbGVzIGtleWJvYXJkIGV2ZW50cyBmb3IgYmxvY2tzCiAgICovCiAgYXN5bmMgaGFuZGxlQmxvY2tLZXlEb3duKGUxMSwgYmxvY2spIHsKICAgIGlmICh0aGlzLmNvbXBvbmVudC5zbGFzaE1lbnUudmlzaWJsZSAmJiB0aGlzLmlzU2xhc2hNZW51S2V5KGUxMS5rZXkpKSB7CiAgICAgIHRoaXMuY29tcG9uZW50LmhhbmRsZVNsYXNoTWVudUtleWJvYXJkKGUxMSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLmhhbmRsZUZvcm1hdHRpbmdTaG9ydGN1dHMoZTExKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBzd2l0Y2ggKGUxMS5rZXkpIHsKICAgICAgY2FzZSAiVGFiIjoKICAgICAgICB0aGlzLmhhbmRsZVRhYihlMTEsIGJsb2NrKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiRW50ZXIiOgogICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRW50ZXIoZTExLCBibG9jayk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIkJhY2tzcGFjZSI6CiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVCYWNrc3BhY2UoZTExLCBibG9jayk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIkRlbGV0ZSI6CiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVEZWxldGUoZTExLCBibG9jayk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIkFycm93VXAiOgogICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQXJyb3dVcChlMTEsIGJsb2NrKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiQXJyb3dEb3duIjoKICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUFycm93RG93bihlMTEsIGJsb2NrKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiQXJyb3dMZWZ0IjoKICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUFycm93TGVmdChlMTEsIGJsb2NrKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiQXJyb3dSaWdodCI6CiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVBcnJvd1JpZ2h0KGUxMSwgYmxvY2spOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KICAvKioKICAgKiBDaGVja3MgaWYga2V5IGlzIGZvciBzbGFzaCBtZW51IG5hdmlnYXRpb24KICAgKi8KICBpc1NsYXNoTWVudUtleShrZXkyKSB7CiAgICByZXR1cm4gWyJBcnJvd0Rvd24iLCAiQXJyb3dVcCIsICJFbnRlciIsICJFc2NhcGUiXS5pbmNsdWRlcyhrZXkyKTsKICB9CiAgLyoqCiAgICogSGFuZGxlcyBmb3JtYXR0aW5nIGtleWJvYXJkIHNob3J0Y3V0cwogICAqLwogIGhhbmRsZUZvcm1hdHRpbmdTaG9ydGN1dHMoZTExKSB7CiAgICBpZiAoIShlMTEubWV0YUtleSB8fCBlMTEuY3RybEtleSkpCiAgICAgIHJldHVybiBmYWxzZTsKICAgIHN3aXRjaCAoZTExLmtleS50b0xvd2VyQ2FzZSgpKSB7CiAgICAgIGNhc2UgImIiOgogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5jb21wb25lbnQuYXBwbHlGb3JtYXQoImJvbGQiKSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGNhc2UgImkiOgogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5jb21wb25lbnQuYXBwbHlGb3JtYXQoIml0YWxpYyIpKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgY2FzZSAidSI6CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLmNvbXBvbmVudC5hcHBseUZvcm1hdCgidW5kZXJsaW5lIikpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICBjYXNlICJrIjoKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHRoaXMuY29tcG9uZW50LmFwcGx5Rm9ybWF0KCJsaW5rIikpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICAvKioKICAgKiBIYW5kbGVzIFRhYiBrZXkKICAgKi8KICBoYW5kbGVUYWIoZTExLCBibG9jaykgewogICAgaWYgKGJsb2NrLnR5cGUgPT09ICJjb2RlIikgewogICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYgKGJsb2NrLnR5cGUgPT09ICJsaXN0IikgewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgIH0KICB9CiAgLyoqCiAgICogSGFuZGxlcyBFbnRlciBrZXkKICAgKi8KICBhc3luYyBoYW5kbGVFbnRlcihlMTEsIGJsb2NrKSB7CiAgICBjb25zdCBibG9ja09wcyA9IHRoaXMuY29tcG9uZW50LmJsb2NrT3BlcmF0aW9uczsKICAgIGNvbnN0IG5vbkVkaXRhYmxlVHlwZXMgPSBbImRpdmlkZXIiLCAiaW1hZ2UiLCAieW91dHViZSIsICJhdHRhY2htZW50Il07CiAgICBpZiAobm9uRWRpdGFibGVUeXBlcy5pbmNsdWRlcyhibG9jay50eXBlKSkgewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgY29uc3QgbmV3QmxvY2sgPSBibG9ja09wcy5jcmVhdGVCbG9jaygpOwogICAgICBhd2FpdCBibG9ja09wcy5pbnNlcnRCbG9ja0FmdGVyKGJsb2NrLCBuZXdCbG9jayk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChibG9jay50eXBlID09PSAiY29kZSIpIHsKICAgICAgaWYgKGUxMS5zaGlmdEtleSkgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNvbnN0IG5ld0Jsb2NrID0gYmxvY2tPcHMuY3JlYXRlQmxvY2soKTsKICAgICAgICBhd2FpdCBibG9ja09wcy5pbnNlcnRCbG9ja0FmdGVyKGJsb2NrLCBuZXdCbG9jayk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCFlMTEuc2hpZnRLZXkpIHsKICAgICAgaWYgKGJsb2NrLnR5cGUgPT09ICJsaXN0IikgewogICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRW50ZXJJbkxpc3QoZTExLCBibG9jayk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgY29uc3QgYmxvY2tXcmFwcGVyID0gdGhpcy5jb21wb25lbnQuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihgW2RhdGEtYmxvY2staWQ9IiR7YmxvY2suaWR9Il1gKTsKICAgICAgICBjb25zdCBibG9ja0NvbXBvbmVudCA9IGJsb2NrV3JhcHBlcj8ucXVlcnlTZWxlY3RvcigiZGVlcy13eXNpd3lnLWJsb2NrIik7CiAgICAgICAgaWYgKGJsb2NrQ29tcG9uZW50ICYmIGJsb2NrQ29tcG9uZW50LmdldFNwbGl0Q29udGVudCkgewogICAgICAgICAgY29uc3Qgc3BsaXRDb250ZW50ID0gYmxvY2tDb21wb25lbnQuZ2V0U3BsaXRDb250ZW50KCk7CiAgICAgICAgICBpZiAoc3BsaXRDb250ZW50KSB7CiAgICAgICAgICAgIGJsb2NrQ29tcG9uZW50LnNldENvbnRlbnQoc3BsaXRDb250ZW50LmJlZm9yZSk7CiAgICAgICAgICAgIGJsb2NrLmNvbnRlbnQgPSBzcGxpdENvbnRlbnQuYmVmb3JlOwogICAgICAgICAgICBjb25zdCBuZXdCbG9jayA9IGJsb2NrT3BzLmNyZWF0ZUJsb2NrKCJwYXJhZ3JhcGgiLCBzcGxpdENvbnRlbnQuYWZ0ZXIpOwogICAgICAgICAgICBhd2FpdCBibG9ja09wcy5pbnNlcnRCbG9ja0FmdGVyKGJsb2NrLCBuZXdCbG9jayk7CiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50LnVwZGF0ZVZhbHVlKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBuZXdCbG9jayA9IGJsb2NrT3BzLmNyZWF0ZUJsb2NrKCk7CiAgICAgICAgICAgIGF3YWl0IGJsb2NrT3BzLmluc2VydEJsb2NrQWZ0ZXIoYmxvY2ssIG5ld0Jsb2NrKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgbmV3QmxvY2sgPSBibG9ja09wcy5jcmVhdGVCbG9jaygpOwogICAgICAgICAgYXdhaXQgYmxvY2tPcHMuaW5zZXJ0QmxvY2tBZnRlcihibG9jaywgbmV3QmxvY2spOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICAvKioKICAgKiBIYW5kbGVzIEVudGVyIGtleSBpbiBsaXN0IGJsb2NrcwogICAqLwogIGFzeW5jIGhhbmRsZUVudGVySW5MaXN0KGUxMSwgYmxvY2spIHsKICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7CiAgICAgIGNvbnN0IHJhbmdlMiA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgICBjb25zdCBjdXJyZW50TGkgPSByYW5nZTIuc3RhcnRDb250YWluZXIucGFyZW50RWxlbWVudD8uY2xvc2VzdCgibGkiKTsKICAgICAgaWYgKGN1cnJlbnRMaSAmJiBjdXJyZW50TGkudGV4dENvbnRlbnQgPT09ICIiKSB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgY29uc3QgYmxvY2tPcHMgPSB0aGlzLmNvbXBvbmVudC5ibG9ja09wZXJhdGlvbnM7CiAgICAgICAgY29uc3QgbmV3QmxvY2sgPSBibG9ja09wcy5jcmVhdGVCbG9jaygpOwogICAgICAgIGF3YWl0IGJsb2NrT3BzLmluc2VydEJsb2NrQWZ0ZXIoYmxvY2ssIG5ld0Jsb2NrKTsKICAgICAgfQogICAgfQogIH0KICAvKioKICAgKiBIYW5kbGVzIEJhY2tzcGFjZSBrZXkKICAgKi8KICBhc3luYyBoYW5kbGVCYWNrc3BhY2UoZTExLCBibG9jaykgewogICAgY29uc3QgYmxvY2tPcHMgPSB0aGlzLmNvbXBvbmVudC5ibG9ja09wZXJhdGlvbnM7CiAgICBjb25zdCBub25FZGl0YWJsZVR5cGVzID0gWyJkaXZpZGVyIiwgImltYWdlIiwgInlvdXR1YmUiLCAiYXR0YWNobWVudCJdOwogICAgaWYgKG5vbkVkaXRhYmxlVHlwZXMuaW5jbHVkZXMoYmxvY2sudHlwZSkpIHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGlmICh0aGlzLmNvbXBvbmVudC5ibG9ja3MubGVuZ3RoID09PSAxKSB7CiAgICAgICAgdGhpcy5jb21wb25lbnQuc2F2ZVRvSGlzdG9yeShmYWxzZSk7CiAgICAgICAgYmxvY2tPcHMucmVtb3ZlQmxvY2soYmxvY2suaWQpOwogICAgICAgIGNvbnN0IG5ld0Jsb2NrID0gYmxvY2tPcHMuY3JlYXRlQmxvY2soInBhcmFncmFwaCIsICIiKTsKICAgICAgICB0aGlzLmNvbXBvbmVudC5ibG9ja3MgPSBbbmV3QmxvY2tdOwogICAgICAgIHRoaXMuY29tcG9uZW50LnJlbmRlckJsb2Nrc1Byb2dyYW1tYXRpY2FsbHkoKTsKICAgICAgICBhd2FpdCBibG9ja09wcy5mb2N1c0Jsb2NrKG5ld0Jsb2NrLmlkLCAic3RhcnQiKTsKICAgICAgICB0aGlzLmNvbXBvbmVudC51cGRhdGVWYWx1ZSgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLmNvbXBvbmVudC5zYXZlVG9IaXN0b3J5KGZhbHNlKTsKICAgICAgY29uc3QgcHJldkJsb2NrID0gYmxvY2tPcHMuZ2V0UHJldmlvdXNCbG9jayhibG9jay5pZCk7CiAgICAgIGNvbnN0IG5leHRCbG9jayA9IGJsb2NrT3BzLmdldE5leHRCbG9jayhibG9jay5pZCk7CiAgICAgIGJsb2NrT3BzLnJlbW92ZUJsb2NrKGJsb2NrLmlkKTsKICAgICAgaWYgKHByZXZCbG9jayAmJiBwcmV2QmxvY2sudHlwZSAhPT0gImRpdmlkZXIiICYmIHByZXZCbG9jay50eXBlICE9PSAiaW1hZ2UiKSB7CiAgICAgICAgYXdhaXQgYmxvY2tPcHMuZm9jdXNCbG9jayhwcmV2QmxvY2suaWQsICJlbmQiKTsKICAgICAgfSBlbHNlIGlmIChuZXh0QmxvY2sgJiYgbmV4dEJsb2NrLnR5cGUgIT09ICJkaXZpZGVyIiAmJiBuZXh0QmxvY2sudHlwZSAhPT0gImltYWdlIikgewogICAgICAgIGF3YWl0IGJsb2NrT3BzLmZvY3VzQmxvY2sobmV4dEJsb2NrLmlkLCAic3RhcnQiKTsKICAgICAgfSBlbHNlIGlmIChwcmV2QmxvY2spIHsKICAgICAgICBhd2FpdCBibG9ja09wcy5mb2N1c0Jsb2NrKHByZXZCbG9jay5pZCk7CiAgICAgIH0gZWxzZSBpZiAobmV4dEJsb2NrKSB7CiAgICAgICAgYXdhaXQgYmxvY2tPcHMuZm9jdXNCbG9jayhuZXh0QmxvY2suaWQpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGJsb2NrV3JhcHBlciA9IHRoaXMuY29tcG9uZW50LnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke2Jsb2NrLmlkfSJdYCk7CiAgICBjb25zdCBibG9ja0NvbXBvbmVudCA9IGJsb2NrV3JhcHBlcj8ucXVlcnlTZWxlY3RvcigiZGVlcy13eXNpd3lnLWJsb2NrIik7CiAgICBpZiAoIWJsb2NrQ29tcG9uZW50IHx8ICFibG9ja0NvbXBvbmVudC5zaGFkb3dSb290KQogICAgICByZXR1cm47CiAgICBjb25zdCB0YXJnZXQgPSBibG9jay50eXBlID09PSAiY29kZSIgPyBibG9ja0NvbXBvbmVudC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5jb2RlLWVkaXRvciIpIDogYmxvY2tDb21wb25lbnQuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuYmxvY2siKTsKICAgIGlmICghdGFyZ2V0KQogICAgICByZXR1cm47CiAgICBjb25zdCBwYXJlbnRDb21wb25lbnQgPSBibG9ja0NvbXBvbmVudC5jbG9zZXN0KCJkZWVzLWlucHV0LXd5c2l3eWciKTsKICAgIGNvbnN0IHNoYWRvd1Jvb3RzID0gW107CiAgICBpZiAocGFyZW50Q29tcG9uZW50Py5zaGFkb3dSb290KQogICAgICBzaGFkb3dSb290cy5wdXNoKHBhcmVudENvbXBvbmVudC5zaGFkb3dSb290KTsKICAgIHNoYWRvd1Jvb3RzLnB1c2goYmxvY2tDb21wb25lbnQuc2hhZG93Um9vdCk7CiAgICBjb25zdCBjdXJzb3JQb3MgPSBXeXNpd3lnU2VsZWN0aW9uLmdldEN1cnNvclBvc2l0aW9uSW5FbGVtZW50KHRhcmdldCwgLi4uc2hhZG93Um9vdHMpOwogICAgY29uc3QgYWN0dWFsQ29udGVudCA9IGJsb2NrQ29tcG9uZW50LmdldENvbnRlbnQgPyBibG9ja0NvbXBvbmVudC5nZXRDb250ZW50KCkgOiB0YXJnZXQudGV4dENvbnRlbnQ7CiAgICBpZiAoY3Vyc29yUG9zID09PSAwKSB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb25zdCBwcmV2QmxvY2sgPSBibG9ja09wcy5nZXRQcmV2aW91c0Jsb2NrKGJsb2NrLmlkKTsKICAgICAgaWYgKHByZXZCbG9jaykgewogICAgICAgIGNvbnN0IG5vbkVkaXRhYmxlVHlwZXMyID0gWyJkaXZpZGVyIiwgImltYWdlIiwgInlvdXR1YmUiLCAiYXR0YWNobWVudCJdOwogICAgICAgIGlmIChub25FZGl0YWJsZVR5cGVzMi5pbmNsdWRlcyhwcmV2QmxvY2sudHlwZSkpIHsKICAgICAgICAgIGF3YWl0IGJsb2NrT3BzLmZvY3VzQmxvY2socHJldkJsb2NrLmlkKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5jb21wb25lbnQuc2F2ZVRvSGlzdG9yeShmYWxzZSk7CiAgICAgICAgaWYgKHByZXZCbG9jay50eXBlID09PSAiY29kZSIgJiYgYmxvY2sudHlwZSAhPT0gImNvZGUiKSB7CiAgICAgICAgICBpZiAoYmxvY2suY29udGVudCA9PT0gIiIpIHsKICAgICAgICAgICAgYmxvY2tPcHMucmVtb3ZlQmxvY2soYmxvY2suaWQpOwogICAgICAgICAgICBhd2FpdCBibG9ja09wcy5mb2N1c0Jsb2NrKHByZXZCbG9jay5pZCwgImVuZCIpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoYmxvY2sudHlwZSA9PT0gImNvZGUiICYmIHByZXZCbG9jay50eXBlICE9PSAiY29kZSIpIHsKICAgICAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQyID0gYmxvY2tDb21wb25lbnQuZ2V0Q29udGVudCA/IGJsb2NrQ29tcG9uZW50LmdldENvbnRlbnQoKSA6IGJsb2NrLmNvbnRlbnQ7CiAgICAgICAgICBpZiAoYWN0dWFsQ29udGVudDIgPT09ICIiIHx8IGFjdHVhbENvbnRlbnQyLnRyaW0oKSA9PT0gIiIpIHsKICAgICAgICAgICAgYmxvY2tPcHMucmVtb3ZlQmxvY2soYmxvY2suaWQpOwogICAgICAgICAgICBhd2FpdCBibG9ja09wcy5mb2N1c0Jsb2NrKHByZXZCbG9jay5pZCwgImVuZCIpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBwcmV2QmxvY2tXcmFwcGVyID0gdGhpcy5jb21wb25lbnQuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihgW2RhdGEtYmxvY2staWQ9IiR7cHJldkJsb2NrLmlkfSJdYCk7CiAgICAgICAgY29uc3QgcHJldkJsb2NrQ29tcG9uZW50ID0gcHJldkJsb2NrV3JhcHBlcj8ucXVlcnlTZWxlY3RvcigiZGVlcy13eXNpd3lnLWJsb2NrIik7CiAgICAgICAgY29uc3QgcHJldkNvbnRlbnQgPSBwcmV2QmxvY2tDb21wb25lbnQ/LmdldENvbnRlbnQoKSB8fCBwcmV2QmxvY2suY29udGVudCB8fCAiIjsKICAgICAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IGJsb2NrQ29tcG9uZW50LmdldENvbnRlbnQoKSB8fCBibG9jay5jb250ZW50IHx8ICIiOwogICAgICAgIGxldCBtZXJnZWRDb250ZW50ID0gIiI7CiAgICAgICAgaWYgKHByZXZCbG9jay50eXBlID09PSAiY29kZSIgJiYgYmxvY2sudHlwZSA9PT0gImNvZGUiKSB7CiAgICAgICAgICBtZXJnZWRDb250ZW50ID0gcHJldkNvbnRlbnQgKyAocHJldkNvbnRlbnQgJiYgY3VycmVudENvbnRlbnQgPyAiXG4iIDogIiIpICsgY3VycmVudENvbnRlbnQ7CiAgICAgICAgfSBlbHNlIGlmIChwcmV2QmxvY2sudHlwZSA9PT0gImxpc3QiICYmIGJsb2NrLnR5cGUgPT09ICJsaXN0IikgewogICAgICAgICAgbWVyZ2VkQ29udGVudCA9IHByZXZDb250ZW50ICsgKHByZXZDb250ZW50ICYmIGN1cnJlbnRDb250ZW50ID8gIlxuIiA6ICIiKSArIGN1cnJlbnRDb250ZW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtZXJnZWRDb250ZW50ID0gcHJldkNvbnRlbnQgKyAocHJldkNvbnRlbnQgJiYgY3VycmVudENvbnRlbnQgPyAiICIgOiAiIikgKyBjdXJyZW50Q29udGVudDsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWVyZ2VQb2ludCA9IHByZXZDb250ZW50Lmxlbmd0aDsKICAgICAgICBibG9ja09wcy51cGRhdGVCbG9ja0NvbnRlbnQocHJldkJsb2NrLmlkLCBtZXJnZWRDb250ZW50KTsKICAgICAgICBpZiAocHJldkJsb2NrQ29tcG9uZW50KSB7CiAgICAgICAgICBwcmV2QmxvY2tDb21wb25lbnQuc2V0Q29udGVudChtZXJnZWRDb250ZW50KTsKICAgICAgICB9CiAgICAgICAgYmxvY2tPcHMucmVtb3ZlQmxvY2soYmxvY2suaWQpOwogICAgICAgIGF3YWl0IGJsb2NrT3BzLmZvY3VzQmxvY2socHJldkJsb2NrLmlkLCBtZXJnZVBvaW50KTsKICAgICAgfQogICAgfSBlbHNlIGlmICh0aGlzLmNvbXBvbmVudC5ibG9ja3MubGVuZ3RoID4gMSkgewogICAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IGJsb2NrQ29tcG9uZW50LmdldENvbnRlbnQgPyBibG9ja0NvbXBvbmVudC5nZXRDb250ZW50KCkgOiBibG9jay5jb250ZW50OwogICAgICBpZiAoY3VycmVudENvbnRlbnQgPT09ICIiIHx8IGN1cnJlbnRDb250ZW50LnRyaW0oKSA9PT0gIiIpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICBjb25zdCBwcmV2QmxvY2sgPSBibG9ja09wcy5nZXRQcmV2aW91c0Jsb2NrKGJsb2NrLmlkKTsKICAgICAgICBpZiAocHJldkJsb2NrKSB7CiAgICAgICAgICBibG9ja09wcy5yZW1vdmVCbG9jayhibG9jay5pZCk7CiAgICAgICAgICBpZiAocHJldkJsb2NrLnR5cGUgIT09ICJkaXZpZGVyIikgewogICAgICAgICAgICBhd2FpdCBibG9ja09wcy5mb2N1c0Jsb2NrKHByZXZCbG9jay5pZCwgImVuZCIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICAvKioKICAgKiBIYW5kbGVzIERlbGV0ZSBrZXkKICAgKi8KICBhc3luYyBoYW5kbGVEZWxldGUoZTExLCBibG9jaykgewogICAgY29uc3QgYmxvY2tPcHMgPSB0aGlzLmNvbXBvbmVudC5ibG9ja09wZXJhdGlvbnM7CiAgICBjb25zdCBub25FZGl0YWJsZVR5cGVzID0gWyJkaXZpZGVyIiwgImltYWdlIiwgInlvdXR1YmUiLCAiYXR0YWNobWVudCJdOwogICAgaWYgKG5vbkVkaXRhYmxlVHlwZXMuaW5jbHVkZXMoYmxvY2sudHlwZSkpIHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGlmICh0aGlzLmNvbXBvbmVudC5ibG9ja3MubGVuZ3RoID09PSAxKSB7CiAgICAgICAgdGhpcy5jb21wb25lbnQuc2F2ZVRvSGlzdG9yeShmYWxzZSk7CiAgICAgICAgYmxvY2tPcHMucmVtb3ZlQmxvY2soYmxvY2suaWQpOwogICAgICAgIGNvbnN0IG5ld0Jsb2NrID0gYmxvY2tPcHMuY3JlYXRlQmxvY2soInBhcmFncmFwaCIsICIiKTsKICAgICAgICB0aGlzLmNvbXBvbmVudC5ibG9ja3MgPSBbbmV3QmxvY2tdOwogICAgICAgIHRoaXMuY29tcG9uZW50LnJlbmRlckJsb2Nrc1Byb2dyYW1tYXRpY2FsbHkoKTsKICAgICAgICBhd2FpdCBibG9ja09wcy5mb2N1c0Jsb2NrKG5ld0Jsb2NrLmlkLCAic3RhcnQiKTsKICAgICAgICB0aGlzLmNvbXBvbmVudC51cGRhdGVWYWx1ZSgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLmNvbXBvbmVudC5zYXZlVG9IaXN0b3J5KGZhbHNlKTsKICAgICAgY29uc3QgcHJldkJsb2NrID0gYmxvY2tPcHMuZ2V0UHJldmlvdXNCbG9jayhibG9jay5pZCk7CiAgICAgIGNvbnN0IG5leHRCbG9jayA9IGJsb2NrT3BzLmdldE5leHRCbG9jayhibG9jay5pZCk7CiAgICAgIGJsb2NrT3BzLnJlbW92ZUJsb2NrKGJsb2NrLmlkKTsKICAgICAgY29uc3Qgbm9uRWRpdGFibGVUeXBlczIgPSBbImRpdmlkZXIiLCAiaW1hZ2UiLCAieW91dHViZSIsICJhdHRhY2htZW50Il07CiAgICAgIGlmIChuZXh0QmxvY2sgJiYgIW5vbkVkaXRhYmxlVHlwZXMyLmluY2x1ZGVzKG5leHRCbG9jay50eXBlKSkgewogICAgICAgIGF3YWl0IGJsb2NrT3BzLmZvY3VzQmxvY2sobmV4dEJsb2NrLmlkLCAic3RhcnQiKTsKICAgICAgfSBlbHNlIGlmIChwcmV2QmxvY2sgJiYgIW5vbkVkaXRhYmxlVHlwZXMyLmluY2x1ZGVzKHByZXZCbG9jay50eXBlKSkgewogICAgICAgIGF3YWl0IGJsb2NrT3BzLmZvY3VzQmxvY2socHJldkJsb2NrLmlkLCAiZW5kIik7CiAgICAgIH0gZWxzZSBpZiAobmV4dEJsb2NrKSB7CiAgICAgICAgYXdhaXQgYmxvY2tPcHMuZm9jdXNCbG9jayhuZXh0QmxvY2suaWQpOwogICAgICB9IGVsc2UgaWYgKHByZXZCbG9jaykgewogICAgICAgIGF3YWl0IGJsb2NrT3BzLmZvY3VzQmxvY2socHJldkJsb2NrLmlkKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBibG9ja1dyYXBwZXIgPSB0aGlzLmNvbXBvbmVudC5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKGBbZGF0YS1ibG9jay1pZD0iJHtibG9jay5pZH0iXWApOwogICAgY29uc3QgYmxvY2tDb21wb25lbnQgPSBibG9ja1dyYXBwZXI/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgaWYgKCFibG9ja0NvbXBvbmVudCB8fCAhYmxvY2tDb21wb25lbnQuc2hhZG93Um9vdCkKICAgICAgcmV0dXJuOwogICAgY29uc3QgdGFyZ2V0ID0gYmxvY2sudHlwZSA9PT0gImNvZGUiID8gYmxvY2tDb21wb25lbnQuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuY29kZS1lZGl0b3IiKSA6IGJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmJsb2NrIik7CiAgICBpZiAoIXRhcmdldCkKICAgICAgcmV0dXJuOwogICAgY29uc3QgcGFyZW50Q29tcG9uZW50ID0gYmxvY2tDb21wb25lbnQuY2xvc2VzdCgiZGVlcy1pbnB1dC13eXNpd3lnIik7CiAgICBjb25zdCBzaGFkb3dSb290cyA9IFtdOwogICAgaWYgKHBhcmVudENvbXBvbmVudD8uc2hhZG93Um9vdCkKICAgICAgc2hhZG93Um9vdHMucHVzaChwYXJlbnRDb21wb25lbnQuc2hhZG93Um9vdCk7CiAgICBzaGFkb3dSb290cy5wdXNoKGJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QpOwogICAgY29uc3QgY3Vyc29yUG9zID0gV3lzaXd5Z1NlbGVjdGlvbi5nZXRDdXJzb3JQb3NpdGlvbkluRWxlbWVudCh0YXJnZXQsIC4uLnNoYWRvd1Jvb3RzKTsKICAgIGNvbnN0IHRleHRMZW5ndGggPSB0YXJnZXQudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwOwogICAgaWYgKGN1cnNvclBvcyA9PT0gdGV4dExlbmd0aCkgewogICAgICBjb25zdCBuZXh0QmxvY2sgPSBibG9ja09wcy5nZXROZXh0QmxvY2soYmxvY2suaWQpOwogICAgICBjb25zdCBub25FZGl0YWJsZVR5cGVzMiA9IFsiZGl2aWRlciIsICJpbWFnZSIsICJ5b3V0dWJlIiwgImF0dGFjaG1lbnQiXTsKICAgICAgaWYgKG5leHRCbG9jayAmJiBub25FZGl0YWJsZVR5cGVzMi5pbmNsdWRlcyhuZXh0QmxvY2sudHlwZSkpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICBhd2FpdCBibG9ja09wcy5mb2N1c0Jsb2NrKG5leHRCbG9jay5pZCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgfQogIC8qKgogICAqIEhhbmRsZXMgQXJyb3dVcCBrZXkgLSBuYXZpZ2F0ZSB0byBwcmV2aW91cyBibG9jayBpZiBhdCBiZWdpbm5pbmcgb3IgZmlyc3QgbGluZQogICAqLwogIGFzeW5jIGhhbmRsZUFycm93VXAoZTExLCBibG9jaykgewogICAgY29uc3Qgbm9uRWRpdGFibGVUeXBlcyA9IFsiZGl2aWRlciIsICJpbWFnZSIsICJ5b3V0dWJlIiwgImF0dGFjaG1lbnQiXTsKICAgIGlmIChub25FZGl0YWJsZVR5cGVzLmluY2x1ZGVzKGJsb2NrLnR5cGUpKSB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb25zdCBibG9ja09wcyA9IHRoaXMuY29tcG9uZW50LmJsb2NrT3BlcmF0aW9uczsKICAgICAgY29uc3QgcHJldkJsb2NrID0gYmxvY2tPcHMuZ2V0UHJldmlvdXNCbG9jayhibG9jay5pZCk7CiAgICAgIGlmIChwcmV2QmxvY2spIHsKICAgICAgICBhd2FpdCBibG9ja09wcy5mb2N1c0Jsb2NrKHByZXZCbG9jay5pZCwgbm9uRWRpdGFibGVUeXBlcy5pbmNsdWRlcyhwcmV2QmxvY2sudHlwZSkgPyB2b2lkIDAgOiAiZW5kIik7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgYmxvY2tXcmFwcGVyID0gdGhpcy5jb21wb25lbnQuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihgW2RhdGEtYmxvY2staWQ9IiR7YmxvY2suaWR9Il1gKTsKICAgIGNvbnN0IGJsb2NrQ29tcG9uZW50ID0gYmxvY2tXcmFwcGVyPy5xdWVyeVNlbGVjdG9yKCJkZWVzLXd5c2l3eWctYmxvY2siKTsKICAgIGlmICghYmxvY2tDb21wb25lbnQgfHwgIWJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IHRhcmdldCA9IGJsb2NrLnR5cGUgPT09ICJjb2RlIiA/IGJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmNvZGUtZWRpdG9yIikgOiBibG9ja0NvbXBvbmVudC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jayIpOwogICAgaWYgKCF0YXJnZXQpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IHBhcmVudENvbXBvbmVudCA9IGJsb2NrQ29tcG9uZW50LmNsb3Nlc3QoImRlZXMtaW5wdXQtd3lzaXd5ZyIpOwogICAgY29uc3Qgc2hhZG93Um9vdHMgPSBbXTsKICAgIGlmIChwYXJlbnRDb21wb25lbnQ/LnNoYWRvd1Jvb3QpCiAgICAgIHNoYWRvd1Jvb3RzLnB1c2gocGFyZW50Q29tcG9uZW50LnNoYWRvd1Jvb3QpOwogICAgc2hhZG93Um9vdHMucHVzaChibG9ja0NvbXBvbmVudC5zaGFkb3dSb290KTsKICAgIGNvbnN0IHNlbGVjdGlvbkluZm8gPSBXeXNpd3lnU2VsZWN0aW9uLmdldFNlbGVjdGlvbkluZm8oLi4uc2hhZG93Um9vdHMpOwogICAgaWYgKCFzZWxlY3Rpb25JbmZvIHx8ICFzZWxlY3Rpb25JbmZvLmNvbGxhcHNlZCkKICAgICAgcmV0dXJuOwogICAgaWYgKHRoaXMuaXNPbkZpcnN0TGluZShzZWxlY3Rpb25JbmZvLCB0YXJnZXQsIC4uLnNoYWRvd1Jvb3RzKSkgewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgY29uc3QgYmxvY2tPcHMgPSB0aGlzLmNvbXBvbmVudC5ibG9ja09wZXJhdGlvbnM7CiAgICAgIGNvbnN0IHByZXZCbG9jayA9IGJsb2NrT3BzLmdldFByZXZpb3VzQmxvY2soYmxvY2suaWQpOwogICAgICBpZiAocHJldkJsb2NrKSB7CiAgICAgICAgY29uc3Qgbm9uRWRpdGFibGVUeXBlczIgPSBbImRpdmlkZXIiLCAiaW1hZ2UiLCAieW91dHViZSIsICJhdHRhY2htZW50Il07CiAgICAgICAgYXdhaXQgYmxvY2tPcHMuZm9jdXNCbG9jayhwcmV2QmxvY2suaWQsIG5vbkVkaXRhYmxlVHlwZXMyLmluY2x1ZGVzKHByZXZCbG9jay50eXBlKSA/IHZvaWQgMCA6ICJlbmQiKTsKICAgICAgfQogICAgfQogIH0KICAvKioKICAgKiBIYW5kbGVzIEFycm93RG93biBrZXkgLSBuYXZpZ2F0ZSB0byBuZXh0IGJsb2NrIGlmIGF0IGVuZCBvciBsYXN0IGxpbmUKICAgKi8KICBhc3luYyBoYW5kbGVBcnJvd0Rvd24oZTExLCBibG9jaykgewogICAgY29uc3Qgbm9uRWRpdGFibGVUeXBlcyA9IFsiZGl2aWRlciIsICJpbWFnZSIsICJ5b3V0dWJlIiwgImF0dGFjaG1lbnQiXTsKICAgIGlmIChub25FZGl0YWJsZVR5cGVzLmluY2x1ZGVzKGJsb2NrLnR5cGUpKSB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb25zdCBibG9ja09wcyA9IHRoaXMuY29tcG9uZW50LmJsb2NrT3BlcmF0aW9uczsKICAgICAgY29uc3QgbmV4dEJsb2NrID0gYmxvY2tPcHMuZ2V0TmV4dEJsb2NrKGJsb2NrLmlkKTsKICAgICAgaWYgKG5leHRCbG9jaykgewogICAgICAgIGNvbnN0IG5vbkVkaXRhYmxlVHlwZXMyID0gWyJkaXZpZGVyIiwgImltYWdlIiwgInlvdXR1YmUiLCAiYXR0YWNobWVudCJdOwogICAgICAgIGF3YWl0IGJsb2NrT3BzLmZvY3VzQmxvY2sobmV4dEJsb2NrLmlkLCBub25FZGl0YWJsZVR5cGVzMi5pbmNsdWRlcyhuZXh0QmxvY2sudHlwZSkgPyB2b2lkIDAgOiAic3RhcnQiKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBibG9ja1dyYXBwZXIgPSB0aGlzLmNvbXBvbmVudC5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKGBbZGF0YS1ibG9jay1pZD0iJHtibG9jay5pZH0iXWApOwogICAgY29uc3QgYmxvY2tDb21wb25lbnQgPSBibG9ja1dyYXBwZXI/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgaWYgKCFibG9ja0NvbXBvbmVudCB8fCAhYmxvY2tDb21wb25lbnQuc2hhZG93Um9vdCkKICAgICAgcmV0dXJuOwogICAgY29uc3QgdGFyZ2V0ID0gYmxvY2sudHlwZSA9PT0gImNvZGUiID8gYmxvY2tDb21wb25lbnQuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuY29kZS1lZGl0b3IiKSA6IGJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmJsb2NrIik7CiAgICBpZiAoIXRhcmdldCkKICAgICAgcmV0dXJuOwogICAgY29uc3QgcGFyZW50Q29tcG9uZW50ID0gYmxvY2tDb21wb25lbnQuY2xvc2VzdCgiZGVlcy1pbnB1dC13eXNpd3lnIik7CiAgICBjb25zdCBzaGFkb3dSb290cyA9IFtdOwogICAgaWYgKHBhcmVudENvbXBvbmVudD8uc2hhZG93Um9vdCkKICAgICAgc2hhZG93Um9vdHMucHVzaChwYXJlbnRDb21wb25lbnQuc2hhZG93Um9vdCk7CiAgICBzaGFkb3dSb290cy5wdXNoKGJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QpOwogICAgY29uc3Qgc2VsZWN0aW9uSW5mbyA9IFd5c2l3eWdTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uSW5mbyguLi5zaGFkb3dSb290cyk7CiAgICBpZiAoIXNlbGVjdGlvbkluZm8gfHwgIXNlbGVjdGlvbkluZm8uY29sbGFwc2VkKQogICAgICByZXR1cm47CiAgICBpZiAodGhpcy5pc09uTGFzdExpbmUoc2VsZWN0aW9uSW5mbywgdGFyZ2V0LCAuLi5zaGFkb3dSb290cykpIHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnN0IGJsb2NrT3BzID0gdGhpcy5jb21wb25lbnQuYmxvY2tPcGVyYXRpb25zOwogICAgICBjb25zdCBuZXh0QmxvY2sgPSBibG9ja09wcy5nZXROZXh0QmxvY2soYmxvY2suaWQpOwogICAgICBpZiAobmV4dEJsb2NrKSB7CiAgICAgICAgY29uc3Qgbm9uRWRpdGFibGVUeXBlczIgPSBbImRpdmlkZXIiLCAiaW1hZ2UiLCAieW91dHViZSIsICJhdHRhY2htZW50Il07CiAgICAgICAgYXdhaXQgYmxvY2tPcHMuZm9jdXNCbG9jayhuZXh0QmxvY2suaWQsIG5vbkVkaXRhYmxlVHlwZXMyLmluY2x1ZGVzKG5leHRCbG9jay50eXBlKSA/IHZvaWQgMCA6ICJzdGFydCIpOwogICAgICB9CiAgICB9CiAgfQogIC8qKgogICAqIEhlbHBlciB0byBnZXQgdGhlIGxhc3QgdGV4dCBub2RlIGluIGFuIGVsZW1lbnQKICAgKi8KICBnZXRMYXN0VGV4dE5vZGUoZWxlbWVudDQpIHsKICAgIGlmIChlbGVtZW50NC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHsKICAgICAgcmV0dXJuIGVsZW1lbnQ0OwogICAgfQogICAgZm9yIChsZXQgaTExID0gZWxlbWVudDQuY2hpbGROb2Rlcy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgICAgY29uc3QgbGFzdFRleHQgPSB0aGlzLmdldExhc3RUZXh0Tm9kZShlbGVtZW50NC5jaGlsZE5vZGVzW2kxMV0pOwogICAgICBpZiAobGFzdFRleHQpCiAgICAgICAgcmV0dXJuIGxhc3RUZXh0OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIC8qKgogICAqIEhhbmRsZXMgQXJyb3dMZWZ0IGtleSAtIG5hdmlnYXRlIHRvIHByZXZpb3VzIGJsb2NrIGlmIGF0IGJlZ2lubmluZwogICAqLwogIGFzeW5jIGhhbmRsZUFycm93TGVmdChlMTEsIGJsb2NrKSB7CiAgICBjb25zdCBub25FZGl0YWJsZVR5cGVzID0gWyJkaXZpZGVyIiwgImltYWdlIiwgInlvdXR1YmUiLCAiYXR0YWNobWVudCJdOwogICAgaWYgKG5vbkVkaXRhYmxlVHlwZXMuaW5jbHVkZXMoYmxvY2sudHlwZSkpIHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnN0IGJsb2NrT3BzID0gdGhpcy5jb21wb25lbnQuYmxvY2tPcGVyYXRpb25zOwogICAgICBjb25zdCBwcmV2QmxvY2sgPSBibG9ja09wcy5nZXRQcmV2aW91c0Jsb2NrKGJsb2NrLmlkKTsKICAgICAgaWYgKHByZXZCbG9jaykgewogICAgICAgIGNvbnN0IG5vbkVkaXRhYmxlVHlwZXMyID0gWyJkaXZpZGVyIiwgImltYWdlIiwgInlvdXR1YmUiLCAiYXR0YWNobWVudCJdOwogICAgICAgIGF3YWl0IGJsb2NrT3BzLmZvY3VzQmxvY2socHJldkJsb2NrLmlkLCBub25FZGl0YWJsZVR5cGVzMi5pbmNsdWRlcyhwcmV2QmxvY2sudHlwZSkgPyB2b2lkIDAgOiAiZW5kIik7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgYmxvY2tXcmFwcGVyID0gdGhpcy5jb21wb25lbnQuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihgW2RhdGEtYmxvY2staWQ9IiR7YmxvY2suaWR9Il1gKTsKICAgIGNvbnN0IGJsb2NrQ29tcG9uZW50ID0gYmxvY2tXcmFwcGVyPy5xdWVyeVNlbGVjdG9yKCJkZWVzLXd5c2l3eWctYmxvY2siKTsKICAgIGlmICghYmxvY2tDb21wb25lbnQgfHwgIWJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IHRhcmdldCA9IGJsb2NrLnR5cGUgPT09ICJjb2RlIiA/IGJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmNvZGUtZWRpdG9yIikgOiBibG9ja0NvbXBvbmVudC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jayIpOwogICAgaWYgKCF0YXJnZXQpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IHBhcmVudENvbXBvbmVudCA9IGJsb2NrQ29tcG9uZW50LmNsb3Nlc3QoImRlZXMtaW5wdXQtd3lzaXd5ZyIpOwogICAgY29uc3Qgc2hhZG93Um9vdHMgPSBbXTsKICAgIGlmIChwYXJlbnRDb21wb25lbnQ/LnNoYWRvd1Jvb3QpCiAgICAgIHNoYWRvd1Jvb3RzLnB1c2gocGFyZW50Q29tcG9uZW50LnNoYWRvd1Jvb3QpOwogICAgc2hhZG93Um9vdHMucHVzaChibG9ja0NvbXBvbmVudC5zaGFkb3dSb290KTsKICAgIGNvbnN0IHNlbGVjdGlvbkluZm8gPSBXeXNpd3lnU2VsZWN0aW9uLmdldFNlbGVjdGlvbkluZm8oLi4uc2hhZG93Um9vdHMpOwogICAgaWYgKCFzZWxlY3Rpb25JbmZvIHx8ICFzZWxlY3Rpb25JbmZvLmNvbGxhcHNlZCkKICAgICAgcmV0dXJuOwogICAgY29uc3QgY3Vyc29yUG9zID0gV3lzaXd5Z1NlbGVjdGlvbi5nZXRDdXJzb3JQb3NpdGlvbkluRWxlbWVudCh0YXJnZXQsIC4uLnNoYWRvd1Jvb3RzKTsKICAgIGlmIChjdXJzb3JQb3MgPT09IDApIHsKICAgICAgY29uc3QgYmxvY2tPcHMgPSB0aGlzLmNvbXBvbmVudC5ibG9ja09wZXJhdGlvbnM7CiAgICAgIGNvbnN0IHByZXZCbG9jayA9IGJsb2NrT3BzLmdldFByZXZpb3VzQmxvY2soYmxvY2suaWQpOwogICAgICBpZiAocHJldkJsb2NrKSB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgY29uc3Qgbm9uRWRpdGFibGVUeXBlczIgPSBbImRpdmlkZXIiLCAiaW1hZ2UiLCAieW91dHViZSIsICJhdHRhY2htZW50Il07CiAgICAgICAgY29uc3QgcG9zaXRpb24zID0gbm9uRWRpdGFibGVUeXBlczIuaW5jbHVkZXMocHJldkJsb2NrLnR5cGUpID8gdm9pZCAwIDogImVuZCI7CiAgICAgICAgYXdhaXQgYmxvY2tPcHMuZm9jdXNCbG9jayhwcmV2QmxvY2suaWQsIHBvc2l0aW9uMyk7CiAgICAgIH0KICAgIH0KICB9CiAgLyoqCiAgICogSGFuZGxlcyBBcnJvd1JpZ2h0IGtleSAtIG5hdmlnYXRlIHRvIG5leHQgYmxvY2sgaWYgYXQgZW5kCiAgICovCiAgYXN5bmMgaGFuZGxlQXJyb3dSaWdodChlMTEsIGJsb2NrKSB7CiAgICBjb25zdCBub25FZGl0YWJsZVR5cGVzID0gWyJkaXZpZGVyIiwgImltYWdlIiwgInlvdXR1YmUiLCAiYXR0YWNobWVudCJdOwogICAgaWYgKG5vbkVkaXRhYmxlVHlwZXMuaW5jbHVkZXMoYmxvY2sudHlwZSkpIHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnN0IGJsb2NrT3BzID0gdGhpcy5jb21wb25lbnQuYmxvY2tPcGVyYXRpb25zOwogICAgICBjb25zdCBuZXh0QmxvY2sgPSBibG9ja09wcy5nZXROZXh0QmxvY2soYmxvY2suaWQpOwogICAgICBpZiAobmV4dEJsb2NrKSB7CiAgICAgICAgY29uc3Qgbm9uRWRpdGFibGVUeXBlczIgPSBbImRpdmlkZXIiLCAiaW1hZ2UiLCAieW91dHViZSIsICJhdHRhY2htZW50Il07CiAgICAgICAgYXdhaXQgYmxvY2tPcHMuZm9jdXNCbG9jayhuZXh0QmxvY2suaWQsIG5vbkVkaXRhYmxlVHlwZXMyLmluY2x1ZGVzKG5leHRCbG9jay50eXBlKSA/IHZvaWQgMCA6ICJzdGFydCIpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGJsb2NrV3JhcHBlciA9IHRoaXMuY29tcG9uZW50LnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke2Jsb2NrLmlkfSJdYCk7CiAgICBjb25zdCBibG9ja0NvbXBvbmVudCA9IGJsb2NrV3JhcHBlcj8ucXVlcnlTZWxlY3RvcigiZGVlcy13eXNpd3lnLWJsb2NrIik7CiAgICBpZiAoIWJsb2NrQ29tcG9uZW50IHx8ICFibG9ja0NvbXBvbmVudC5zaGFkb3dSb290KQogICAgICByZXR1cm47CiAgICBjb25zdCB0YXJnZXQgPSBibG9jay50eXBlID09PSAiY29kZSIgPyBibG9ja0NvbXBvbmVudC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5jb2RlLWVkaXRvciIpIDogYmxvY2tDb21wb25lbnQuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuYmxvY2siKTsKICAgIGlmICghdGFyZ2V0KQogICAgICByZXR1cm47CiAgICBjb25zdCBwYXJlbnRDb21wb25lbnQgPSBibG9ja0NvbXBvbmVudC5jbG9zZXN0KCJkZWVzLWlucHV0LXd5c2l3eWciKTsKICAgIGNvbnN0IHNoYWRvd1Jvb3RzID0gW107CiAgICBpZiAocGFyZW50Q29tcG9uZW50Py5zaGFkb3dSb290KQogICAgICBzaGFkb3dSb290cy5wdXNoKHBhcmVudENvbXBvbmVudC5zaGFkb3dSb290KTsKICAgIHNoYWRvd1Jvb3RzLnB1c2goYmxvY2tDb21wb25lbnQuc2hhZG93Um9vdCk7CiAgICBjb25zdCBzZWxlY3Rpb25JbmZvID0gV3lzaXd5Z1NlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvKC4uLnNoYWRvd1Jvb3RzKTsKICAgIGlmICghc2VsZWN0aW9uSW5mbyB8fCAhc2VsZWN0aW9uSW5mby5jb2xsYXBzZWQpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IGN1cnNvclBvcyA9IFd5c2l3eWdTZWxlY3Rpb24uZ2V0Q3Vyc29yUG9zaXRpb25JbkVsZW1lbnQodGFyZ2V0LCAuLi5zaGFkb3dSb290cyk7CiAgICBjb25zdCB0ZXh0TGVuZ3RoID0gdGFyZ2V0LnRleHRDb250ZW50Py5sZW5ndGggfHwgMDsKICAgIGlmIChjdXJzb3JQb3MgPT09IHRleHRMZW5ndGgpIHsKICAgICAgY29uc3QgYmxvY2tPcHMgPSB0aGlzLmNvbXBvbmVudC5ibG9ja09wZXJhdGlvbnM7CiAgICAgIGNvbnN0IG5leHRCbG9jayA9IGJsb2NrT3BzLmdldE5leHRCbG9jayhibG9jay5pZCk7CiAgICAgIGlmIChuZXh0QmxvY2spIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICBjb25zdCBub25FZGl0YWJsZVR5cGVzMiA9IFsiZGl2aWRlciIsICJpbWFnZSIsICJ5b3V0dWJlIiwgImF0dGFjaG1lbnQiXTsKICAgICAgICBhd2FpdCBibG9ja09wcy5mb2N1c0Jsb2NrKG5leHRCbG9jay5pZCwgbm9uRWRpdGFibGVUeXBlczIuaW5jbHVkZXMobmV4dEJsb2NrLnR5cGUpID8gdm9pZCAwIDogInN0YXJ0Iik7CiAgICAgIH0KICAgIH0KICB9CiAgLyoqCiAgICogSGFuZGxlcyBzbGFzaCBtZW51IGtleWJvYXJkIG5hdmlnYXRpb24KICAgKiBOb3RlOiBUaGlzIGlzIG5vdyBoYW5kbGVkIGJ5IHRoZSBjb21wb25lbnQgZGlyZWN0bHkKICAgKi8KICAvKioKICAgKiBDaGVjayBpZiBjdXJzb3IgaXMgb24gdGhlIGZpcnN0IGxpbmUgb2YgYSBibG9jawogICAqLwogIGlzT25GaXJzdExpbmUoc2VsZWN0aW9uSW5mbywgdGFyZ2V0LCAuLi5zaGFkb3dSb290cykgewogICAgdHJ5IHsKICAgICAgY29uc3QgcmFuZ2UyID0gV3lzaXd5Z1NlbGVjdGlvbi5jcmVhdGVSYW5nZUZyb21JbmZvKHNlbGVjdGlvbkluZm8pOwogICAgICBjb25zdCByZWN0ID0gcmFuZ2UyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBsZXQgY29udGFpbmVyID0gcmFuZ2UyLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyOwogICAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnRFbGVtZW50OwogICAgICB9CiAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IGlzTmVhclRvcCA9IHJlY3QudG9wIC0gY29udGFpbmVyUmVjdC50b3AgPCA1OwogICAgICBpZiAoY29udGFpbmVyLnRleHRDb250ZW50ICYmICFjb250YWluZXIudGV4dENvbnRlbnQuaW5jbHVkZXMoIlxuIikpIHsKICAgICAgICBjb25zdCBjdXJzb3JQb3MgPSBXeXNpd3lnU2VsZWN0aW9uLmdldEN1cnNvclBvc2l0aW9uSW5FbGVtZW50KGNvbnRhaW5lciwgLi4uc2hhZG93Um9vdHMpOwogICAgICAgIHJldHVybiBjdXJzb3JQb3MgPT09IDA7CiAgICAgIH0KICAgICAgcmV0dXJuIGlzTmVhclRvcDsKICAgIH0gY2F0Y2ggKGUxMSkgewogICAgICBjb25zb2xlLndhcm4oIkVycm9yIGNoZWNraW5nIGZpcnN0IGxpbmU6IiwgZTExKTsKICAgICAgY29uc3QgY3Vyc29yUG9zID0gc2VsZWN0aW9uSW5mby5zdGFydE9mZnNldDsKICAgICAgcmV0dXJuIGN1cnNvclBvcyA9PT0gMDsKICAgIH0KICB9CiAgLyoqCiAgICogQ2hlY2sgaWYgY3Vyc29yIGlzIG9uIHRoZSBsYXN0IGxpbmUgb2YgYSBibG9jawogICAqLwogIGlzT25MYXN0TGluZShzZWxlY3Rpb25JbmZvLCB0YXJnZXQsIC4uLnNoYWRvd1Jvb3RzKSB7CiAgICB0cnkgewogICAgICBjb25zdCByYW5nZTIgPSBXeXNpd3lnU2VsZWN0aW9uLmNyZWF0ZVJhbmdlRnJvbUluZm8oc2VsZWN0aW9uSW5mbyk7CiAgICAgIGNvbnN0IHJlY3QgPSByYW5nZTIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGxldCBjb250YWluZXIgPSByYW5nZTIuY29tbW9uQW5jZXN0b3JDb250YWluZXI7CiAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7CiAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudEVsZW1lbnQ7CiAgICAgIH0KICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgaXNOZWFyQm90dG9tID0gY29udGFpbmVyUmVjdC5ib3R0b20gLSByZWN0LmJvdHRvbSA8IDU7CiAgICAgIGlmIChjb250YWluZXIudGV4dENvbnRlbnQgJiYgIWNvbnRhaW5lci50ZXh0Q29udGVudC5pbmNsdWRlcygiXG4iKSkgewogICAgICAgIGNvbnN0IHRleHRMZW5ndGggPSB0YXJnZXQudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwOwogICAgICAgIGNvbnN0IGN1cnNvclBvcyA9IFd5c2l3eWdTZWxlY3Rpb24uZ2V0Q3Vyc29yUG9zaXRpb25JbkVsZW1lbnQodGFyZ2V0LCAuLi5zaGFkb3dSb290cyk7CiAgICAgICAgcmV0dXJuIGN1cnNvclBvcyA9PT0gdGV4dExlbmd0aDsKICAgICAgfQogICAgICByZXR1cm4gaXNOZWFyQm90dG9tOwogICAgfSBjYXRjaCAoZTExKSB7CiAgICAgIGNvbnNvbGUud2FybigiRXJyb3IgY2hlY2tpbmcgbGFzdCBsaW5lOiIsIGUxMSk7CiAgICAgIGNvbnN0IHRleHRMZW5ndGggPSB0YXJnZXQudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwOwogICAgICBjb25zdCBjdXJzb3JQb3MgPSBXeXNpd3lnU2VsZWN0aW9uLmdldEN1cnNvclBvc2l0aW9uSW5FbGVtZW50KHRhcmdldCwgLi4uc2hhZG93Um9vdHMpOwogICAgICByZXR1cm4gY3Vyc29yUG9zID09PSB0ZXh0TGVuZ3RoOwogICAgfQogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvd3lzaXd5Zy5kcmFnZHJvcGhhbmRsZXIuanMKdmFyIFd5c2l3eWdEcmFnRHJvcEhhbmRsZXIgPSBjbGFzcyB7CiAgY29tcG9uZW50OwogIGRyYWdnZWRCbG9ja0lkID0gbnVsbDsKICBkcmFnT3ZlckJsb2NrSWQgPSBudWxsOwogIGRyYWdPdmVyUG9zaXRpb24gPSBudWxsOwogIGRyb3BJbmRpY2F0b3IgPSBudWxsOwogIGluaXRpYWxNb3VzZVkgPSAwOwogIGluaXRpYWxCbG9ja1kgPSAwOwogIGRyYWdnZWRCbG9ja0VsZW1lbnQgPSBudWxsOwogIGRyYWdnZWRCbG9ja0hlaWdodCA9IDA7CiAgZHJhZ2dlZEJsb2NrQ29udGVudEhlaWdodCA9IDA7CiAgZHJhZ2dlZEJsb2NrTWFyZ2luVG9wID0gMDsKICBsYXN0VXBkYXRlVGltZSA9IDA7CiAgdXBkYXRlVGhyb3R0bGUgPSA4MDsKICAvLyBtaWxsaXNlY29uZHMKICBjb25zdHJ1Y3Rvcihjb21wb25lbnQpIHsKICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwogIH0KICAvKioKICAgKiBHZXRzIHRoZSBjdXJyZW50IGRyYWcgc3RhdGUKICAgKi8KICBnZXQgZHJhZ1N0YXRlKCkgewogICAgcmV0dXJuIHsKICAgICAgZHJhZ2dlZEJsb2NrSWQ6IHRoaXMuZHJhZ2dlZEJsb2NrSWQsCiAgICAgIGRyYWdPdmVyQmxvY2tJZDogdGhpcy5kcmFnT3ZlckJsb2NrSWQsCiAgICAgIGRyYWdPdmVyUG9zaXRpb246IHRoaXMuZHJhZ092ZXJQb3NpdGlvbgogICAgfTsKICB9CiAgLyoqCiAgICogSGFuZGxlcyBkcmFnIHN0YXJ0CiAgICovCiAgaGFuZGxlRHJhZ1N0YXJ0KGUxMSwgYmxvY2spIHsKICAgIGlmICghZTExLmRhdGFUcmFuc2ZlcikKICAgICAgcmV0dXJuOwogICAgdGhpcy5kcmFnZ2VkQmxvY2tJZCA9IGJsb2NrLmlkOwogICAgZTExLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gIm1vdmUiOwogICAgZTExLmRhdGFUcmFuc2Zlci5zZXREYXRhKCJ0ZXh0L3BsYWluIiwgYmxvY2suaWQpOwogICAgY29uc3QgZW1wdHlJbWcgPSBuZXcgSW1hZ2UoKTsKICAgIGVtcHR5SW1nLnNyYyA9ICJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUlBQUFBVUVCQUFBQUN3QUFBQUFBUUFCQUFBQ0FrUUJBRHM9IjsKICAgIGUxMS5kYXRhVHJhbnNmZXIuc2V0RHJhZ0ltYWdlKGVtcHR5SW1nLCAwLCAwKTsKICAgIHRoaXMuaW5pdGlhbE1vdXNlWSA9IGUxMS5jbGllbnRZOwogICAgdGhpcy5kcmFnZ2VkQmxvY2tFbGVtZW50ID0gdGhpcy5jb21wb25lbnQuZWRpdG9yQ29udGVudFJlZi5xdWVyeVNlbGVjdG9yKGBbZGF0YS1ibG9jay1pZD0iJHtibG9jay5pZH0iXWApOwogICAgaWYgKHRoaXMuZHJhZ2dlZEJsb2NrRWxlbWVudCkgewogICAgICBjb25zdCByZWN0ID0gdGhpcy5kcmFnZ2VkQmxvY2tFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICB0aGlzLmluaXRpYWxCbG9ja1kgPSByZWN0LnRvcDsKICAgICAgY29uc3QgaW5uZXJCbG9jayA9IHRoaXMuZHJhZ2dlZEJsb2NrRWxlbWVudC5xdWVyeVNlbGVjdG9yKCIuYmxvY2siKTsKICAgICAgaWYgKGlubmVyQmxvY2spIHsKICAgICAgICBjb25zdCBpbm5lclJlY3QgPSBpbm5lckJsb2NrLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShpbm5lckJsb2NrKTsKICAgICAgICB0aGlzLmRyYWdnZWRCbG9ja01hcmdpblRvcCA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUubWFyZ2luVG9wKSB8fCAwOwogICAgICAgIHRoaXMuZHJhZ2dlZEJsb2NrQ29udGVudEhlaWdodCA9IGlubmVyUmVjdC5oZWlnaHQ7CiAgICAgIH0KICAgICAgdGhpcy5kcmFnZ2VkQmxvY2tIZWlnaHQgPSByZWN0LmhlaWdodDsKICAgICAgY29uc29sZS5sb2coIkRyYWcgbWVhc3VyZW1lbnRzOiIsIHsKICAgICAgICB3cmFwcGVySGVpZ2h0OiByZWN0LmhlaWdodCwKICAgICAgICBtYXJnaW5Ub3A6IHRoaXMuZHJhZ2dlZEJsb2NrTWFyZ2luVG9wLAogICAgICAgIGRyb3BJbmRpY2F0b3JIZWlnaHQ6IHRoaXMuZHJhZ2dlZEJsb2NrSGVpZ2h0LAogICAgICAgIGNvbnRlbnRIZWlnaHQ6IHRoaXMuZHJhZ2dlZEJsb2NrQ29udGVudEhlaWdodCwKICAgICAgICBibG9ja0lkOiBibG9jay5pZAogICAgICB9KTsKICAgICAgdGhpcy5jcmVhdGVEcm9wSW5kaWNhdG9yKCk7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRyYWdvdmVyIiwgdGhpcy5oYW5kbGVHbG9iYWxEcmFnT3Zlcik7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRyYWdlbmQiLCB0aGlzLmhhbmRsZUdsb2JhbERyYWdFbmQpOwogICAgfQogICAgdGhpcy5jb21wb25lbnQuZHJhZ2dlZEJsb2NrSWQgPSB0aGlzLmRyYWdnZWRCbG9ja0lkOwogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIGlmICh0aGlzLmRyYWdnZWRCbG9ja0VsZW1lbnQpIHsKICAgICAgICB0aGlzLmRyYWdnZWRCbG9ja0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgiZHJhZ2dpbmciKTsKICAgICAgfQogICAgICBpZiAodGhpcy5jb21wb25lbnQuZWRpdG9yQ29udGVudFJlZikgewogICAgICAgIHRoaXMuY29tcG9uZW50LmVkaXRvckNvbnRlbnRSZWYuY2xhc3NMaXN0LmFkZCgiZHJhZ2dpbmciKTsKICAgICAgfQogICAgfSwgMTApOwogIH0KICAvKioKICAgKiBIYW5kbGVzIGRyYWcgZW5kCiAgICovCiAgaGFuZGxlRHJhZ0VuZCgpIHsKICAgIGNvbnN0IGFsbEJsb2NrcyA9IHRoaXMuY29tcG9uZW50LmVkaXRvckNvbnRlbnRSZWYucXVlcnlTZWxlY3RvckFsbCgiLmJsb2NrLXdyYXBwZXIiKTsKICAgIGFsbEJsb2Nrcy5mb3JFYWNoKChibG9jaykgPT4gewogICAgICBibG9jay5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnZ2luZyIsICJtb3ZlLXVwIiwgIm1vdmUtZG93biIpOwogICAgICBibG9jay5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiLS1kcmFnLW9mZnNldCIpOwogICAgICBibG9jay5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidHJhbnNmb3JtIik7CiAgICB9KTsKICAgIGlmICh0aGlzLmNvbXBvbmVudC5lZGl0b3JDb250ZW50UmVmKSB7CiAgICAgIHRoaXMuY29tcG9uZW50LmVkaXRvckNvbnRlbnRSZWYuY2xhc3NMaXN0LnJlbW92ZSgiZHJhZ2dpbmciKTsKICAgIH0KICAgIHRoaXMuZHJhZ2dlZEJsb2NrSWQgPSBudWxsOwogICAgdGhpcy5kcmFnT3ZlckJsb2NrSWQgPSBudWxsOwogICAgdGhpcy5kcmFnT3ZlclBvc2l0aW9uID0gbnVsbDsKICAgIHRoaXMuZHJhZ2dlZEJsb2NrRWxlbWVudCA9IG51bGw7CiAgICB0aGlzLmRyYWdnZWRCbG9ja0hlaWdodCA9IDA7CiAgICB0aGlzLmRyYWdnZWRCbG9ja0NvbnRlbnRIZWlnaHQgPSAwOwogICAgdGhpcy5kcmFnZ2VkQmxvY2tNYXJnaW5Ub3AgPSAwOwogICAgdGhpcy5pbml0aWFsQmxvY2tZID0gMDsKICAgIHRoaXMuY29tcG9uZW50LmRyYWdnZWRCbG9ja0lkID0gbnVsbDsKICAgIHRoaXMuY29tcG9uZW50LmRyYWdPdmVyQmxvY2tJZCA9IG51bGw7CiAgICB0aGlzLmNvbXBvbmVudC5kcmFnT3ZlclBvc2l0aW9uID0gbnVsbDsKICB9CiAgLyoqCiAgICogSGFuZGxlcyBkcmFnIG92ZXIKICAgKi8KICBoYW5kbGVEcmFnT3ZlcihlMTEsIGJsb2NrKSB7CiAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgIGlmICghZTExLmRhdGFUcmFuc2ZlciB8fCAhdGhpcy5kcmFnZ2VkQmxvY2tJZCB8fCB0aGlzLmRyYWdnZWRCbG9ja0lkID09PSBibG9jay5pZCkKICAgICAgcmV0dXJuOwogICAgZTExLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gIm1vdmUiOwogICAgY29uc3QgcmVjdCA9IGUxMS5jdXJyZW50VGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgY29uc3QgbWlkcG9pbnQgPSByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gMjsKICAgIHRoaXMuZHJhZ092ZXJCbG9ja0lkID0gYmxvY2suaWQ7CiAgICB0aGlzLmRyYWdPdmVyUG9zaXRpb24gPSBlMTEuY2xpZW50WSA8IG1pZHBvaW50ID8gImJlZm9yZSIgOiAiYWZ0ZXIiOwogICAgdGhpcy5jb21wb25lbnQuZHJhZ092ZXJCbG9ja0lkID0gdGhpcy5kcmFnT3ZlckJsb2NrSWQ7CiAgICB0aGlzLmNvbXBvbmVudC5kcmFnT3ZlclBvc2l0aW9uID0gdGhpcy5kcmFnT3ZlclBvc2l0aW9uOwogIH0KICAvKioKICAgKiBIYW5kbGVzIGRyYWcgbGVhdmUKICAgKi8KICBoYW5kbGVEcmFnTGVhdmUoYmxvY2spIHsKICAgIGlmICh0aGlzLmRyYWdPdmVyQmxvY2tJZCA9PT0gYmxvY2suaWQpIHsKICAgICAgdGhpcy5kcmFnT3ZlckJsb2NrSWQgPSBudWxsOwogICAgICB0aGlzLmRyYWdPdmVyUG9zaXRpb24gPSBudWxsOwogICAgICB0aGlzLmNvbXBvbmVudC5kcmFnT3ZlckJsb2NrSWQgPSBudWxsOwogICAgICB0aGlzLmNvbXBvbmVudC5kcmFnT3ZlclBvc2l0aW9uID0gbnVsbDsKICAgIH0KICB9CiAgLyoqCiAgICogSGFuZGxlcyBkcm9wCiAgICovCiAgaGFuZGxlRHJvcChlMTEsIHRhcmdldEJsb2NrKSB7CiAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgIGlmICghdGhpcy5kcmFnZ2VkQmxvY2tJZCB8fCB0aGlzLmRyYWdnZWRCbG9ja0lkID09PSB0YXJnZXRCbG9jay5pZCkKICAgICAgcmV0dXJuOwogICAgdGhpcy5jb21wb25lbnQuaGFuZGxlRHJvcChlMTEsIHRhcmdldEJsb2NrKTsKICB9CiAgLyoqCiAgICogQ2hlY2tzIGlmIGEgYmxvY2sgaXMgYmVpbmcgZHJhZ2dlZAogICAqLwogIGlzRHJhZ2dpbmcoYmxvY2tJZCkgewogICAgcmV0dXJuIHRoaXMuZHJhZ2dlZEJsb2NrSWQgPT09IGJsb2NrSWQ7CiAgfQogIC8qKgogICAqIENoZWNrcyBpZiBhIGJsb2NrIGhhcyBkcmFnIG92ZXIgc3RhdGUKICAgKi8KICBpc0RyYWdPdmVyKGJsb2NrSWQpIHsKICAgIHJldHVybiB0aGlzLmRyYWdPdmVyQmxvY2tJZCA9PT0gYmxvY2tJZDsKICB9CiAgLyoqCiAgICogR2V0cyBkcmFnIG92ZXIgQ1NTIGNsYXNzZXMgZm9yIGEgYmxvY2sKICAgKi8KICBnZXREcmFnT3ZlckNsYXNzZXMoYmxvY2tJZCkgewogICAgaWYgKCF0aGlzLmlzRHJhZ092ZXIoYmxvY2tJZCkpCiAgICAgIHJldHVybiAiIjsKICAgIHJldHVybiB0aGlzLmRyYWdPdmVyUG9zaXRpb24gPT09ICJiZWZvcmUiID8gImRyYWctb3Zlci1iZWZvcmUiIDogImRyYWctb3Zlci1hZnRlciI7CiAgfQogIC8qKgogICAqIENyZWF0ZXMgdGhlIGRyb3AgaW5kaWNhdG9yIGVsZW1lbnQKICAgKi8KICBjcmVhdGVEcm9wSW5kaWNhdG9yKCkgewogICAgdGhpcy5kcm9wSW5kaWNhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICB0aGlzLmRyb3BJbmRpY2F0b3IuY2xhc3NOYW1lID0gImRyb3AtaW5kaWNhdG9yIjsKICAgIHRoaXMuZHJvcEluZGljYXRvci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgdGhpcy5jb21wb25lbnQuZWRpdG9yQ29udGVudFJlZi5hcHBlbmRDaGlsZCh0aGlzLmRyb3BJbmRpY2F0b3IpOwogIH0KICAvKioKICAgKiBIYW5kbGVzIGdsb2JhbCBkcmFnb3ZlciB0byB1cGRhdGUgZHJhZ2dlZCBibG9jayBwb3NpdGlvbiBhbmQgbW92ZSBvdGhlciBibG9ja3MKICAgKi8KICBoYW5kbGVHbG9iYWxEcmFnT3ZlciA9IChlMTEpID0+IHsKICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgaWYgKCF0aGlzLmRyYWdnZWRCbG9ja0VsZW1lbnQpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IGRlbHRhWSA9IGUxMS5jbGllbnRZIC0gdGhpcy5pbml0aWFsTW91c2VZOwogICAgdGhpcy5kcmFnZ2VkQmxvY2tFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7ZGVsdGFZfXB4KWA7CiAgICBjb25zdCBub3cyID0gRGF0ZS5ub3coKTsKICAgIGlmIChub3cyIC0gdGhpcy5sYXN0VXBkYXRlVGltZSA8IHRoaXMudXBkYXRlVGhyb3R0bGUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5sYXN0VXBkYXRlVGltZSA9IG5vdzI7CiAgICB0aGlzLnVwZGF0ZUJsb2NrUG9zaXRpb25zKGUxMS5jbGllbnRZKTsKICB9OwogIC8qKgogICAqIFVwZGF0ZXMgYmxvY2sgcG9zaXRpb25zIGJhc2VkIG9uIGN1cnNvciBwb3NpdGlvbgogICAqLwogIHVwZGF0ZUJsb2NrUG9zaXRpb25zKG1vdXNlWSkgewogICAgY29uc3QgYmxvY2tzID0gQXJyYXkuZnJvbSh0aGlzLmNvbXBvbmVudC5lZGl0b3JDb250ZW50UmVmLnF1ZXJ5U2VsZWN0b3JBbGwoIi5ibG9jay13cmFwcGVyIikpOwogICAgY29uc3QgZHJhZ2dlZEluZGV4ID0gYmxvY2tzLmZpbmRJbmRleCgoYjUpID0+IGI1LmdldEF0dHJpYnV0ZSgiZGF0YS1ibG9jay1pZCIpID09PSB0aGlzLmRyYWdnZWRCbG9ja0lkKTsKICAgIGlmIChkcmFnZ2VkSW5kZXggPT09IC0xKQogICAgICByZXR1cm47CiAgICBibG9ja3MuZm9yRWFjaCgoYmxvY2spID0+IHsKICAgICAgaWYgKGJsb2NrLmdldEF0dHJpYnV0ZSgiZGF0YS1ibG9jay1pZCIpICE9PSB0aGlzLmRyYWdnZWRCbG9ja0lkKSB7CiAgICAgICAgYmxvY2suY2xhc3NMaXN0LnJlbW92ZSgibW92ZS11cCIsICJtb3ZlLWRvd24iKTsKICAgICAgICBibG9jay5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiLS1kcmFnLW9mZnNldCIpOwogICAgICB9CiAgICB9KTsKICAgIGxldCBuZXdJbmRleCA9IGJsb2Nrcy5sZW5ndGg7CiAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBibG9ja3MubGVuZ3RoOyBpMTErKykgewogICAgICBpZiAoaTExID09PSBkcmFnZ2VkSW5kZXgpCiAgICAgICAgY29udGludWU7CiAgICAgIGNvbnN0IGJsb2NrID0gYmxvY2tzW2kxMV07CiAgICAgIGNvbnN0IHJlY3QgPSBibG9jay5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgYmxvY2tUb3AgPSByZWN0LnRvcDsKICAgICAgaWYgKG1vdXNlWSA8IGJsb2NrVG9wICsgcmVjdC5oZWlnaHQgKiAwLjUpIHsKICAgICAgICBuZXdJbmRleCA9IGkxMTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgYmxvY2tzLmxlbmd0aDsgaTExKyspIHsKICAgICAgaWYgKGkxMSA9PT0gZHJhZ2dlZEluZGV4KQogICAgICAgIGNvbnRpbnVlOwogICAgICBjb25zdCBibG9jayA9IGJsb2Nrc1tpMTFdOwogICAgICBpZiAoZHJhZ2dlZEluZGV4IDwgbmV3SW5kZXgpIHsKICAgICAgICBpZiAoaTExID4gZHJhZ2dlZEluZGV4ICYmIGkxMSA8IG5ld0luZGV4KSB7CiAgICAgICAgICBibG9jay5jbGFzc0xpc3QuYWRkKCJtb3ZlLXVwIik7CiAgICAgICAgICBibG9jay5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1kcmFnLW9mZnNldCIsIGAke3RoaXMuZHJhZ2dlZEJsb2NrSGVpZ2h0fXB4YCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGRyYWdnZWRJbmRleCA+IG5ld0luZGV4KSB7CiAgICAgICAgaWYgKGkxMSA+PSBuZXdJbmRleCAmJiBpMTEgPCBkcmFnZ2VkSW5kZXgpIHsKICAgICAgICAgIGJsb2NrLmNsYXNzTGlzdC5hZGQoIm1vdmUtZG93biIpOwogICAgICAgICAgYmxvY2suc3R5bGUuc2V0UHJvcGVydHkoIi0tZHJhZy1vZmZzZXQiLCBgJHt0aGlzLmRyYWdnZWRCbG9ja0hlaWdodH1weGApOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhpcy51cGRhdGVEcm9wSW5kaWNhdG9yKGJsb2NrcywgbmV3SW5kZXgsIGRyYWdnZWRJbmRleCk7CiAgfQogIC8qKgogICAqIFVwZGF0ZXMgdGhlIGRyb3AgaW5kaWNhdG9yIHBvc2l0aW9uCiAgICovCiAgdXBkYXRlRHJvcEluZGljYXRvcihibG9ja3MsIHRhcmdldEluZGV4LCBkcmFnZ2VkSW5kZXgpIHsKICAgIGlmICghdGhpcy5kcm9wSW5kaWNhdG9yIHx8ICF0aGlzLmRyYWdnZWRCbG9ja0VsZW1lbnQpCiAgICAgIHJldHVybjsKICAgIHRoaXMuZHJvcEluZGljYXRvci5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmNvbXBvbmVudC5lZGl0b3JDb250ZW50UmVmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgbGV0IHRvcFBvc2l0aW9uID0gMDsKICAgIGNvbnN0IHZpc3VhbEJsb2NrcyA9IFtdOwogICAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgYmxvY2tzLmxlbmd0aDsgaTExKyspIHsKICAgICAgaWYgKGkxMSA9PT0gZHJhZ2dlZEluZGV4KQogICAgICAgIGNvbnRpbnVlOwogICAgICBjb25zdCBibG9jayA9IGJsb2Nrc1tpMTFdOwogICAgICBjb25zdCByZWN0ID0gYmxvY2suZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGxldCB0b3AgPSByZWN0LnRvcCAtIGNvbnRhaW5lclJlY3QudG9wOwogICAgICBsZXQgYm90dG9tID0gcmVjdC5ib3R0b20gLSBjb250YWluZXJSZWN0LnRvcDsKICAgICAgY29uc3QgdHJhbnNmb3JtMiA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGJsb2NrKS50cmFuc2Zvcm07CiAgICAgIGlmICh0cmFuc2Zvcm0yICYmIHRyYW5zZm9ybTIgIT09ICJub25lIikgewogICAgICAgIGNvbnN0IG1hdHJpeCA9IG5ldyBET01NYXRyaXgodHJhbnNmb3JtMik7CiAgICAgICAgY29uc3QgeU9mZnNldCA9IG1hdHJpeC5tNDI7CiAgICAgICAgdG9wICs9IHlPZmZzZXQ7CiAgICAgICAgYm90dG9tICs9IHlPZmZzZXQ7CiAgICAgIH0KICAgICAgdmlzdWFsQmxvY2tzLnB1c2goeyBpbmRleDogaTExLCB0b3AsIGJvdHRvbSB9KTsKICAgIH0KICAgIHZpc3VhbEJsb2Nrcy5zb3J0KChhNSwgYjUpID0+IGE1LnRvcCAtIGI1LnRvcCk7CiAgICBsZXQgYWRqdXN0ZWRUYXJnZXRJbmRleCA9IHRhcmdldEluZGV4OwogICAgaWYgKHRhcmdldEluZGV4ID4gZHJhZ2dlZEluZGV4KSB7CiAgICAgIGFkanVzdGVkVGFyZ2V0SW5kZXgtLTsKICAgIH0KICAgIGxldCBibG9ja01hcmdpbiA9IDE2OwogICAgaWYgKHRoaXMuZHJhZ2dlZEJsb2NrRWxlbWVudCkgewogICAgICBjb25zdCBkcmFnZ2VkQmxvY2sgPSB0aGlzLmNvbXBvbmVudC5ibG9ja3MuZmluZCgoYjUpID0+IGI1LmlkID09PSB0aGlzLmRyYWdnZWRCbG9ja0lkKTsKICAgICAgaWYgKGRyYWdnZWRCbG9jaykgewogICAgICAgIGNvbnN0IGJsb2NrVHlwZSA9IGRyYWdnZWRCbG9jay50eXBlOwogICAgICAgIGlmIChibG9ja1R5cGUgPT09ICJoZWFkaW5nLTEiIHx8IGJsb2NrVHlwZSA9PT0gImhlYWRpbmctMiIgfHwgYmxvY2tUeXBlID09PSAiaGVhZGluZy0zIikgewogICAgICAgICAgYmxvY2tNYXJnaW4gPSAyNDsKICAgICAgICB9IGVsc2UgaWYgKGJsb2NrVHlwZSA9PT0gImNvZGUiIHx8IGJsb2NrVHlwZSA9PT0gInF1b3RlIikgewogICAgICAgICAgYmxvY2tNYXJnaW4gPSAyMDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChhZGp1c3RlZFRhcmdldEluZGV4ID09PSAwKSB7CiAgICAgIHRvcFBvc2l0aW9uID0gMDsKICAgIH0gZWxzZSBpZiAoYWRqdXN0ZWRUYXJnZXRJbmRleCA+PSB2aXN1YWxCbG9ja3MubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGxhc3RCbG9jayA9IHZpc3VhbEJsb2Nrc1t2aXN1YWxCbG9ja3MubGVuZ3RoIC0gMV07CiAgICAgIGlmIChsYXN0QmxvY2spIHsKICAgICAgICB0b3BQb3NpdGlvbiA9IGxhc3RCbG9jay5ib3R0b207CiAgICAgICAgdG9wUG9zaXRpb24gKz0gYmxvY2tNYXJnaW47CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGJsb2NrQmVmb3JlID0gdmlzdWFsQmxvY2tzW2FkanVzdGVkVGFyZ2V0SW5kZXggLSAxXTsKICAgICAgaWYgKGJsb2NrQmVmb3JlKSB7CiAgICAgICAgdG9wUG9zaXRpb24gPSBibG9ja0JlZm9yZS5ib3R0b207CiAgICAgICAgdG9wUG9zaXRpb24gKz0gYmxvY2tNYXJnaW47CiAgICAgIH0KICAgIH0KICAgIHRoaXMuZHJvcEluZGljYXRvci5zdHlsZS5oZWlnaHQgPSBgJHt0aGlzLmRyYWdnZWRCbG9ja0hlaWdodH1weGA7CiAgICB0aGlzLmRyb3BJbmRpY2F0b3Iuc3R5bGUudG9wID0gYCR7TWF0aC5tYXgoMCwgdG9wUG9zaXRpb24pfXB4YDsKICAgIGNvbnNvbGUubG9nKCJEcm9wIGluZGljYXRvciB1cGRhdGU6IiwgewogICAgICB0YXJnZXRJbmRleCwKICAgICAgYWRqdXN0ZWRUYXJnZXRJbmRleCwKICAgICAgZHJhZ2dlZEluZGV4LAogICAgICB0b3BQb3NpdGlvbiwKICAgICAgaGVpZ2h0OiB0aGlzLmRyYWdnZWRCbG9ja0hlaWdodCwKICAgICAgYmxvY2tNYXJnaW4sCiAgICAgIHZpc3VhbEJsb2NrczogdmlzdWFsQmxvY2tzLm1hcCgoYjUpID0+ICh7IGluZGV4OiBiNS5pbmRleCwgdG9wOiBiNS50b3AsIGJvdHRvbTogYjUuYm90dG9tIH0pKQogICAgfSk7CiAgfQogIC8qKgogICAqIEhhbmRsZXMgZ2xvYmFsIGRyYWcgZW5kCiAgICovCiAgaGFuZGxlR2xvYmFsRHJhZ0VuZCA9ICgpID0+IHsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImRyYWdvdmVyIiwgdGhpcy5oYW5kbGVHbG9iYWxEcmFnT3Zlcik7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJkcmFnZW5kIiwgdGhpcy5oYW5kbGVHbG9iYWxEcmFnRW5kKTsKICAgIGlmICh0aGlzLmRyb3BJbmRpY2F0b3IpIHsKICAgICAgdGhpcy5kcm9wSW5kaWNhdG9yLnJlbW92ZSgpOwogICAgICB0aGlzLmRyb3BJbmRpY2F0b3IgPSBudWxsOwogICAgfQogICAgaWYgKHRoaXMuZHJhZ2dlZEJsb2NrSWQpIHsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICB0aGlzLnBlcmZvcm1Ecm9wKCk7CiAgICAgICAgdGhpcy5oYW5kbGVEcmFnRW5kKCk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5oYW5kbGVEcmFnRW5kKCk7CiAgICB9CiAgfTsKICAvKioKICAgKiBQZXJmb3JtcyB0aGUgYWN0dWFsIGRyb3Agb3BlcmF0aW9uCiAgICovCiAgcGVyZm9ybURyb3AoKSB7CiAgICBpZiAoIXRoaXMuZHJhZ2dlZEJsb2NrSWQpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IGJsb2NrRWxlbWVudHMyID0gQXJyYXkuZnJvbSh0aGlzLmNvbXBvbmVudC5lZGl0b3JDb250ZW50UmVmLnF1ZXJ5U2VsZWN0b3JBbGwoIi5ibG9jay13cmFwcGVyIikpOwogICAgY29uc3QgZHJhZ2dlZEVsZW1lbnQgPSBibG9ja0VsZW1lbnRzMi5maW5kKChlbCkgPT4gZWwuZ2V0QXR0cmlidXRlKCJkYXRhLWJsb2NrLWlkIikgPT09IHRoaXMuZHJhZ2dlZEJsb2NrSWQpOwogICAgaWYgKCFkcmFnZ2VkRWxlbWVudCkKICAgICAgcmV0dXJuOwogICAgY29uc3QgdmlzdWFsT3JkZXIgPSBibG9ja0VsZW1lbnRzMi5tYXAoKGVsKSA9PiB7CiAgICAgIGNvbnN0IGlkID0gZWwuZ2V0QXR0cmlidXRlKCJkYXRhLWJsb2NrLWlkIik7CiAgICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgY2VudGVyWSA9IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyAyOwogICAgICByZXR1cm4geyBpZCwgY2VudGVyWSwgZWxlbWVudDogZWwgfTsKICAgIH0pOwogICAgdmlzdWFsT3JkZXIuc29ydCgoYTUsIGI1KSA9PiBhNS5jZW50ZXJZIC0gYjUuY2VudGVyWSk7CiAgICBjb25zdCBuZXdCbG9ja0lkcyA9IHZpc3VhbE9yZGVyLm1hcCgoaXRlbSkgPT4gaXRlbS5pZCkuZmlsdGVyKChpZCkgPT4gaWQgIT09IG51bGwpOwogICAgY29uc3Qgb3JpZ2luYWxCbG9ja3MgPSBbLi4udGhpcy5jb21wb25lbnQuYmxvY2tzXTsKICAgIGNvbnN0IGRyYWdnZWRCbG9jayA9IG9yaWdpbmFsQmxvY2tzLmZpbmQoKGI1KSA9PiBiNS5pZCA9PT0gdGhpcy5kcmFnZ2VkQmxvY2tJZCk7CiAgICBpZiAoIWRyYWdnZWRCbG9jaykKICAgICAgcmV0dXJuOwogICAgY29uc3Qgb2xkT3JkZXIgPSBvcmlnaW5hbEJsb2Nrcy5tYXAoKGI1KSA9PiBiNS5pZCk7CiAgICBjb25zdCBvcmRlckNoYW5nZWQgPSAhbmV3QmxvY2tJZHMuZXZlcnkoKGlkLCBpbmRleDIpID0+IGlkID09PSBvbGRPcmRlcltpbmRleDJdKTsKICAgIGlmICghb3JkZXJDaGFuZ2VkKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG5ld0Jsb2NrcyA9IG5ld0Jsb2NrSWRzLm1hcCgoaWQpID0+IG9yaWdpbmFsQmxvY2tzLmZpbmQoKGI1KSA9PiBiNS5pZCA9PT0gaWQpKS5maWx0ZXIoQm9vbGVhbik7CiAgICB0aGlzLmNvbXBvbmVudC5ibG9ja3MgPSBuZXdCbG9ja3M7CiAgICB0aGlzLmNvbXBvbmVudC5yZW5kZXJCbG9ja3NQcm9ncmFtbWF0aWNhbGx5KCk7CiAgICB0aGlzLmNvbXBvbmVudC51cGRhdGVWYWx1ZSgpOwogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIGlmIChkcmFnZ2VkQmxvY2sudHlwZSAhPT0gImRpdmlkZXIiKSB7CiAgICAgICAgdGhpcy5jb21wb25lbnQuYmxvY2tPcGVyYXRpb25zLmZvY3VzQmxvY2soZHJhZ2dlZEJsb2NrLmlkKTsKICAgICAgfQogICAgfSwgMTAwKTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL3d5c2l3eWcuaGlzdG9yeS5qcwp2YXIgV3lzaXd5Z0hpc3RvcnkgPSBjbGFzcyB7CiAgaGlzdG9yeSA9IFtdOwogIGN1cnJlbnRJbmRleCA9IC0xOwogIG1heEhpc3RvcnlTaXplID0gNTA7CiAgbGFzdFNhdmVUaW1lID0gMDsKICBzYXZlRGVib3VuY2VNcyA9IDUwMDsKICAvLyBEZWJvdW5jZSBzYXZlcyB0byBhdm9pZCB0b28gbWFueSBzbmFwc2hvdHMKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuaGlzdG9yeSA9IFtdOwogICAgdGhpcy5jdXJyZW50SW5kZXggPSAtMTsKICB9CiAgLyoqCiAgICogU2F2ZSBjdXJyZW50IHN0YXRlIHRvIGhpc3RvcnkKICAgKi8KICBzYXZlU3RhdGUoYmxvY2tzLCBzZWxlY3RlZEJsb2NrSWQsIGN1cnNvclBvc2l0aW9uKSB7CiAgICBjb25zdCBub3cyID0gRGF0ZS5ub3coKTsKICAgIGlmIChub3cyIC0gdGhpcy5sYXN0U2F2ZVRpbWUgPCB0aGlzLnNhdmVEZWJvdW5jZU1zICYmIHRoaXMuY3VycmVudEluZGV4ID49IDApIHsKICAgICAgdGhpcy5oaXN0b3J5W3RoaXMuY3VycmVudEluZGV4XSA9IHsKICAgICAgICBibG9ja3M6IHRoaXMuY2xvbmVCbG9ja3MoYmxvY2tzKSwKICAgICAgICBzZWxlY3RlZEJsb2NrSWQsCiAgICAgICAgY3Vyc29yUG9zaXRpb246IGN1cnNvclBvc2l0aW9uID8geyAuLi5jdXJzb3JQb3NpdGlvbiB9IDogdm9pZCAwLAogICAgICAgIHRpbWVzdGFtcDogbm93MgogICAgICB9OwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5jdXJyZW50SW5kZXggPCB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMSkgewogICAgICB0aGlzLmhpc3RvcnkgPSB0aGlzLmhpc3Rvcnkuc2xpY2UoMCwgdGhpcy5jdXJyZW50SW5kZXggKyAxKTsKICAgIH0KICAgIGNvbnN0IG5ld1N0YXRlID0gewogICAgICBibG9ja3M6IHRoaXMuY2xvbmVCbG9ja3MoYmxvY2tzKSwKICAgICAgc2VsZWN0ZWRCbG9ja0lkLAogICAgICBjdXJzb3JQb3NpdGlvbjogY3Vyc29yUG9zaXRpb24gPyB7IC4uLmN1cnNvclBvc2l0aW9uIH0gOiB2b2lkIDAsCiAgICAgIHRpbWVzdGFtcDogbm93MgogICAgfTsKICAgIHRoaXMuaGlzdG9yeS5wdXNoKG5ld1N0YXRlKTsKICAgIHRoaXMuY3VycmVudEluZGV4Kys7CiAgICBpZiAodGhpcy5oaXN0b3J5Lmxlbmd0aCA+IHRoaXMubWF4SGlzdG9yeVNpemUpIHsKICAgICAgdGhpcy5oaXN0b3J5LnNoaWZ0KCk7CiAgICAgIHRoaXMuY3VycmVudEluZGV4LS07CiAgICB9CiAgICB0aGlzLmxhc3RTYXZlVGltZSA9IG5vdzI7CiAgfQogIC8qKgogICAqIEZvcmNlIHNhdmUgYSBjaGVja3BvaW50ICh1c2VmdWwgZm9yIG9wZXJhdGlvbnMgbGlrZSBibG9jayBkZWxldGlvbikKICAgKi8KICBzYXZlQ2hlY2twb2ludChibG9ja3MsIHNlbGVjdGVkQmxvY2tJZCwgY3Vyc29yUG9zaXRpb24pIHsKICAgIHRoaXMubGFzdFNhdmVUaW1lID0gMDsKICAgIHRoaXMuc2F2ZVN0YXRlKGJsb2Nrcywgc2VsZWN0ZWRCbG9ja0lkLCBjdXJzb3JQb3NpdGlvbik7CiAgfQogIC8qKgogICAqIFVuZG8gdG8gcHJldmlvdXMgc3RhdGUKICAgKi8KICB1bmRvKCkgewogICAgaWYgKCF0aGlzLmNhblVuZG8oKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHRoaXMuY3VycmVudEluZGV4LS07CiAgICByZXR1cm4gdGhpcy5jbG9uZVN0YXRlKHRoaXMuaGlzdG9yeVt0aGlzLmN1cnJlbnRJbmRleF0pOwogIH0KICAvKioKICAgKiBSZWRvIHRvIG5leHQgc3RhdGUKICAgKi8KICByZWRvKCkgewogICAgaWYgKCF0aGlzLmNhblJlZG8oKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHRoaXMuY3VycmVudEluZGV4Kys7CiAgICByZXR1cm4gdGhpcy5jbG9uZVN0YXRlKHRoaXMuaGlzdG9yeVt0aGlzLmN1cnJlbnRJbmRleF0pOwogIH0KICAvKioKICAgKiBDaGVjayBpZiB1bmRvIGlzIGF2YWlsYWJsZQogICAqLwogIGNhblVuZG8oKSB7CiAgICByZXR1cm4gdGhpcy5jdXJyZW50SW5kZXggPiAwOwogIH0KICAvKioKICAgKiBDaGVjayBpZiByZWRvIGlzIGF2YWlsYWJsZQogICAqLwogIGNhblJlZG8oKSB7CiAgICByZXR1cm4gdGhpcy5jdXJyZW50SW5kZXggPCB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMTsKICB9CiAgLyoqCiAgICogR2V0IGN1cnJlbnQgc3RhdGUKICAgKi8KICBnZXRDdXJyZW50U3RhdGUoKSB7CiAgICBpZiAodGhpcy5jdXJyZW50SW5kZXggPj0gMCAmJiB0aGlzLmN1cnJlbnRJbmRleCA8IHRoaXMuaGlzdG9yeS5sZW5ndGgpIHsKICAgICAgcmV0dXJuIHRoaXMuY2xvbmVTdGF0ZSh0aGlzLmhpc3RvcnlbdGhpcy5jdXJyZW50SW5kZXhdKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICAvKioKICAgKiBDbGVhciBoaXN0b3J5CiAgICovCiAgY2xlYXIoKSB7CiAgICB0aGlzLmhpc3RvcnkgPSBbXTsKICAgIHRoaXMuY3VycmVudEluZGV4ID0gLTE7CiAgICB0aGlzLmxhc3RTYXZlVGltZSA9IDA7CiAgfQogIC8qKgogICAqIERlZXAgY2xvbmUgYmxvY2tzCiAgICovCiAgY2xvbmVCbG9ja3MoYmxvY2tzKSB7CiAgICByZXR1cm4gYmxvY2tzLm1hcCgoYmxvY2spID0+ICh7CiAgICAgIC4uLmJsb2NrLAogICAgICBtZXRhZGF0YTogYmxvY2subWV0YWRhdGEgPyB7IC4uLmJsb2NrLm1ldGFkYXRhIH0gOiB2b2lkIDAKICAgIH0pKTsKICB9CiAgLyoqCiAgICogQ2xvbmUgYSBoaXN0b3J5IHN0YXRlCiAgICovCiAgY2xvbmVTdGF0ZShzdGF0ZTEwKSB7CiAgICByZXR1cm4gewogICAgICBibG9ja3M6IHRoaXMuY2xvbmVCbG9ja3Moc3RhdGUxMC5ibG9ja3MpLAogICAgICBzZWxlY3RlZEJsb2NrSWQ6IHN0YXRlMTAuc2VsZWN0ZWRCbG9ja0lkLAogICAgICBjdXJzb3JQb3NpdGlvbjogc3RhdGUxMC5jdXJzb3JQb3NpdGlvbiA/IHsgLi4uc3RhdGUxMC5jdXJzb3JQb3NpdGlvbiB9IDogdm9pZCAwLAogICAgICB0aW1lc3RhbXA6IHN0YXRlMTAudGltZXN0YW1wCiAgICB9OwogIH0KICAvKioKICAgKiBHZXQgaGlzdG9yeSBpbmZvIGZvciBkZWJ1Z2dpbmcKICAgKi8KICBnZXRIaXN0b3J5SW5mbygpIHsKICAgIHJldHVybiB7CiAgICAgIHNpemU6IHRoaXMuaGlzdG9yeS5sZW5ndGgsCiAgICAgIGN1cnJlbnRJbmRleDogdGhpcy5jdXJyZW50SW5kZXgsCiAgICAgIGNhblVuZG86IHRoaXMuY2FuVW5kbygpLAogICAgICBjYW5SZWRvOiB0aGlzLmNhblJlZG8oKQogICAgfTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL2RlZXMtd3lzaXd5Zy1ibG9jay5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU2MSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNjIgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNXeXNpd3lnQmxvY2sgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLXd5c2l3eWctYmxvY2siKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9ibG9ja19kZWNvcmF0b3JzOwogIGxldCBfYmxvY2tfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ibG9ja19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNTZWxlY3RlZF9kZWNvcmF0b3JzOwogIGxldCBfaXNTZWxlY3RlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzU2VsZWN0ZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2hhbmRsZXJzX2RlY29yYXRvcnM7CiAgbGV0IF9oYW5kbGVyc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2hhbmRsZXJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF93eXNpd3lnQ29tcG9uZW50X2RlY29yYXRvcnM7CiAgbGV0IF93eXNpd3lnQ29tcG9uZW50X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfd3lzaXd5Z0NvbXBvbmVudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzV3lzaXd5Z0Jsb2NrMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2Jsb2NrX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBPYmplY3QgfSldOwogICAgICBfaXNTZWxlY3RlZF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9oYW5kbGVyc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogT2JqZWN0IH0pXTsKICAgICAgX3d5c2l3eWdDb21wb25lbnRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTYxKHRoaXMsIG51bGwsIF9ibG9ja19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJibG9jayIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYmxvY2siIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYmxvY2ssIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmJsb2NrID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Jsb2NrX2luaXRpYWxpemVycywgX2Jsb2NrX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjEodGhpcywgbnVsbCwgX2lzU2VsZWN0ZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNTZWxlY3RlZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNTZWxlY3RlZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc1NlbGVjdGVkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc1NlbGVjdGVkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzU2VsZWN0ZWRfaW5pdGlhbGl6ZXJzLCBfaXNTZWxlY3RlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTYxKHRoaXMsIG51bGwsIF9oYW5kbGVyc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJoYW5kbGVycyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaGFuZGxlcnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaGFuZGxlcnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmhhbmRsZXJzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2hhbmRsZXJzX2luaXRpYWxpemVycywgX2hhbmRsZXJzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjEodGhpcywgbnVsbCwgX3d5c2l3eWdDb21wb25lbnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAid3lzaXd5Z0NvbXBvbmVudCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAid3lzaXd5Z0NvbXBvbmVudCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai53eXNpd3lnQ29tcG9uZW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai53eXNpd3lnQ29tcG9uZW50ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3d5c2l3eWdDb21wb25lbnRfaW5pdGlhbGl6ZXJzLCBfd3lzaXd5Z0NvbXBvbmVudF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTYxKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1d5c2l3eWdCbG9jazIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGlmICh0aGlzLl9zZWxlY3Rpb25IYW5kbGVyKSB7CiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIiwgdGhpcy5fc2VsZWN0aW9uSGFuZGxlcik7CiAgICAgIH0KICAgIH0KICAgICNibG9ja19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM2Mih0aGlzLCBfYmxvY2tfaW5pdGlhbGl6ZXJzLCB2b2lkIDApOwogICAgZ2V0IGJsb2NrKCkgewogICAgICByZXR1cm4gdGhpcy4jYmxvY2tfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBibG9jayh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYmxvY2tfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpc1NlbGVjdGVkX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2Mih0aGlzLCBfYmxvY2tfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczYyKHRoaXMsIF9pc1NlbGVjdGVkX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc1NlbGVjdGVkKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNTZWxlY3RlZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzU2VsZWN0ZWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzU2VsZWN0ZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNoYW5kbGVyc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjIodGhpcywgX2lzU2VsZWN0ZWRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczYyKHRoaXMsIF9oYW5kbGVyc19pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgZ2V0IGhhbmRsZXJzKCkgewogICAgICByZXR1cm4gdGhpcy4jaGFuZGxlcnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBoYW5kbGVycyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaGFuZGxlcnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN3eXNpd3lnQ29tcG9uZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2Mih0aGlzLCBfaGFuZGxlcnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczYyKHRoaXMsIF93eXNpd3lnQ29tcG9uZW50X2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgd3lzaXd5Z0NvbXBvbmVudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3d5c2l3eWdDb21wb25lbnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIC8vIFJlZmVyZW5jZSB0byBwYXJlbnQgZGVlcy1pbnB1dC13eXNpd3lnCiAgICBzZXQgd3lzaXd5Z0NvbXBvbmVudCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jd3lzaXd5Z0NvbXBvbmVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgLy8gUmVmZXJlbmNlIHRvIHRoZSBlZGl0YWJsZSBibG9jayBlbGVtZW50CiAgICBibG9ja0VsZW1lbnQgPSAoX19ydW5Jbml0aWFsaXplcnM2Mih0aGlzLCBfd3lzaXd5Z0NvbXBvbmVudF9leHRyYUluaXRpYWxpemVycyksIG51bGwpOwogICAgLy8gVHJhY2sgaWYgd2UndmUgaW5pdGlhbGl6ZWQgdGhlIGNvbnRlbnQKICAgIGNvbnRlbnRJbml0aWFsaXplZCA9IGZhbHNlOwogICAgLy8gVHJhY2sgY3Vyc29yIHBvc2l0aW9uCiAgICBsYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IDA7CiAgICBsYXN0U2VsZWN0ZWRUZXh0ID0gIiI7CiAgICBoYW5kbGVyU3R5bGVzSW5qZWN0ZWQgPSBmYWxzZTsKICAgIC8vIEJsb2NrIHR5cGVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBjb250ZW50ZWRpdGFibGUKICAgIHN0YXRpYyBOT05fRURJVEFCTEVfVFlQRVMgPSBbImltYWdlIiwgImRpdmlkZXIiLCAieW91dHViZSJdOwogICAgaW5qZWN0SGFuZGxlclN0eWxlcygpIHsKICAgICAgaWYgKHRoaXMuaGFuZGxlclN0eWxlc0luamVjdGVkKQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5oYW5kbGVyU3R5bGVzSW5qZWN0ZWQgPSB0cnVlOwogICAgICBsZXQgc3R5bGVzMyA9ICIiOwogICAgICBjb25zdCBibG9ja1R5cGVzID0gQmxvY2tSZWdpc3RyeS5nZXRBbGxUeXBlcygpOwogICAgICBmb3IgKGNvbnN0IHR5cGU1IG9mIGJsb2NrVHlwZXMpIHsKICAgICAgICBjb25zdCBoYW5kbGVyMiA9IEJsb2NrUmVnaXN0cnkuZ2V0SGFuZGxlcih0eXBlNSk7CiAgICAgICAgaWYgKGhhbmRsZXIyKSB7CiAgICAgICAgICBzdHlsZXMzICs9IGhhbmRsZXIyLmdldFN0eWxlcygpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc3R5bGVzMykgewogICAgICAgIGNvbnN0IHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgICAgc3R5bGVFbGVtZW50LnRleHRDb250ZW50ID0gc3R5bGVzMzsKICAgICAgICB0aGlzLnNoYWRvd1Jvb3Q/LmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC5ibG9jayB7CiAgICAgICAgcGFkZGluZzogNHB4IDA7CiAgICAgICAgbWluLWhlaWdodDogMS42ZW07CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMDAwMCIsICIjZTBlMGUwIil9OwogICAgICB9CgogICAgICAuYmxvY2s6ZW1wdHk6bm90KDpmb2N1cyk6OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5OTkiLCAiIzY2NiIpfTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIEJsb2NrLXNwZWNpZmljIHN0eWxlcyBtb3ZlZCB0byBoYW5kbGVycyAqLwoKCiAgICAgIC8qIEZvcm1hdHRpbmcgc3R5bGVzICovCiAgICAgIC5ibG9jayA6aXMoYiwgc3Ryb25nKSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAwMDAiLCAiI2ZmZmZmZiIpfTsKICAgICAgfQoKICAgICAgLmJsb2NrIDppcyhpLCBlbSkgewogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQoKICAgICAgLmJsb2NrIHUgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICB9CgogICAgICAuYmxvY2sgcyB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7CiAgICAgIH0KCiAgICAgIC5ibG9jayBjb2RlIHsKICAgICAgICBmb250LWZhbWlseTogJ1NGIE1vbm8nLCAnTW9uYWNvJywgJ0luY29uc29sYXRhJywgJ0ZpcmEgQ29kZScsIG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDAuOWVtOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDYpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSIpfTsKICAgICAgICBwYWRkaW5nOiAycHggNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkMTQiLCAiI2ZmNmI2YiIpfTsKICAgICAgfQoKICAgICAgLmJsb2NrIGEgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwNjZjYyIsICIjNGQ5NGZmIil9OwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMTVzIGVhc2U7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAuYmxvY2sgYTpob3ZlciB7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDY2Y2MiLCAiIzRkOTRmZiIpfTsKICAgICAgfQoKICAgICAgLyogQ29kZSBibG9jayBjb250YWluZXIgYW5kIGxhbmd1YWdlIHN0eWxlcyBtb3ZlZCB0byBoYW5kbGVyICovCgogICAgICAvKiBTZWxlY3Rpb24gc3R5bGVzICovCiAgICAgIC5ibG9jayA6OnNlbGVjdGlvbiB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMTAyLCAyMDQsIDAuMykiLCAicmdiYSg3NywgMTQ4LCAyNTUsIDAuMykiKX07CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgIH0KCgogICAgICAvKiBTdHJpa2UgdGhyb3VnaCAqLwogICAgICAuYmxvY2sgOmlzKHMsIHN0cmlrZSkgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOwogICAgICAgIG9wYWNpdHk6IDAuNzsKICAgICAgfQoKCiAgICAgIC8qIEJsb2NrIG1hcmdpbiBhZGp1c3RtZW50cyBiYXNlZCBvbiB0eXBlICovCiAgICAgIDpob3N0LWNvbnRleHQoLmJsb2NrLXdyYXBwZXI6Zmlyc3QtY2hpbGQpIC5ibG9jayB7CiAgICAgICAgbWFyZ2luLXRvcDogMCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdC1jb250ZXh0KC5ibG9jay13cmFwcGVyOmxhc3QtY2hpbGQpIC5ibG9jayB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLyogU2VsZWN0ZWQgc3RhdGUgKi8KICAgICAgLmJsb2NrLnNlbGVjdGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAxMDIsIDIwNCwgMC4wNSkiLCAicmdiYSg3NywgMTQ4LCAyNTUsIDAuMDgpIil9OwogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDJweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAxMDIsIDIwNCwgMC4yKSIsICJyZ2JhKDc3LCAxNDgsIDI1NSwgMC4yKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC04cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAtOHB4OwogICAgICAgIHBhZGRpbmctbGVmdDogOHB4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKICAgICAgfQoKCgoKICAgIGAKICAgIF07CiAgICBzaG91bGRVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygiaXNTZWxlY3RlZCIpICYmIHRoaXMuYmxvY2spIHsKICAgICAgICBsZXQgZWxlbWVudDQgPSBudWxsOwogICAgICAgIGNvbnN0IGJsb2NrVHlwZSA9IHRoaXMuYmxvY2sudHlwZTsKICAgICAgICBjb25zdCBzZWxlY3RvciA9IGAuYmxvY2suJHtibG9ja1R5cGV9YDsKICAgICAgICBlbGVtZW50NCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICAgICAgaWYgKGVsZW1lbnQ0KSB7CiAgICAgICAgICBpZiAodGhpcy5pc1NlbGVjdGVkKSB7CiAgICAgICAgICAgIGVsZW1lbnQ0LmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkIik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlbGVtZW50NC5jbGFzc0xpc3QucmVtb3ZlKCJzZWxlY3RlZCIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygiYmxvY2siKSAmJiB0aGlzLmJsb2NrKSB7CiAgICAgICAgY29uc3Qgb2xkQmxvY2sgPSBjaGFuZ2VkUHJvcGVydGllcy5nZXQoImJsb2NrIik7CiAgICAgICAgaWYgKG9sZEJsb2NrICYmIG9sZEJsb2NrLmlkICYmIG9sZEJsb2NrLnR5cGUgJiYgb2xkQmxvY2suaWQgPT09IHRoaXMuYmxvY2suaWQgJiYgb2xkQmxvY2sudHlwZSA9PT0gdGhpcy5ibG9jay50eXBlKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAhdGhpcy5ibG9ja0VsZW1lbnQgfHwgdGhpcy5ibG9jaz8udHlwZSAhPT0gdGhpcy5ibG9ja0VsZW1lbnQuZGF0YXNldC5ibG9ja1R5cGU7CiAgICB9CiAgICBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIHRoaXMuY29udGVudEluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgdGhpcy5pbmplY3RIYW5kbGVyU3R5bGVzKCk7CiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnd5c2l3eWctYmxvY2stY29udGFpbmVyIik7CiAgICAgIGlmIChjb250YWluZXIgJiYgdGhpcy5ibG9jaykgewogICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSB0aGlzLnJlbmRlckJsb2NrQ29udGVudCgpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmJsb2NrKSB7CiAgICAgICAgY29uc3QgaGFuZGxlcjIgPSBCbG9ja1JlZ2lzdHJ5LmdldEhhbmRsZXIodGhpcy5ibG9jay50eXBlKTsKICAgICAgICBpZiAoaGFuZGxlcjIpIHsKICAgICAgICAgIGNvbnN0IGJsb2NrRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnd5c2l3eWctYmxvY2stY29udGFpbmVyIik7CiAgICAgICAgICBpZiAoYmxvY2tFbGVtZW50KSB7CiAgICAgICAgICAgIGhhbmRsZXIyLnNldHVwKGJsb2NrRWxlbWVudCwgdGhpcy5ibG9jaywgdGhpcy5oYW5kbGVycyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IGVkaXRhYmxlQmxvY2sgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jayIpOwogICAgICBpZiAoZWRpdGFibGVCbG9jaykgewogICAgICAgIGVkaXRhYmxlQmxvY2suc2V0QXR0cmlidXRlKCJkYXRhLWJsb2NrLWlkIiwgdGhpcy5ibG9jay5pZCk7CiAgICAgICAgZWRpdGFibGVCbG9jay5zZXRBdHRyaWJ1dGUoImRhdGEtYmxvY2stdHlwZSIsIHRoaXMuYmxvY2sudHlwZSk7CiAgICAgICAgZWRpdGFibGVCbG9jay5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIChlMTEpID0+IHsKICAgICAgICAgIHRoaXMuaGFuZGxlcnM/Lm9uSW5wdXQ/LihlMTEpOwogICAgICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlZGl0YWJsZUJsb2NrKTsKICAgICAgICAgIGlmIChwb3MgIT09IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IHBvczsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBlZGl0YWJsZUJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCAoZTExKSA9PiB7CiAgICAgICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVkaXRhYmxlQmxvY2spOwogICAgICAgICAgaWYgKHBvcyAhPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gcG9zOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5oYW5kbGVycz8ub25LZXlEb3duPy4oZTExKTsKICAgICAgICB9KTsKICAgICAgICBlZGl0YWJsZUJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwgKCkgPT4gewogICAgICAgICAgdGhpcy5oYW5kbGVycz8ub25Gb2N1cz8uKCk7CiAgICAgICAgfSk7CiAgICAgICAgZWRpdGFibGVCbG9jay5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgKCkgPT4gewogICAgICAgICAgdGhpcy5oYW5kbGVycz8ub25CbHVyPy4oKTsKICAgICAgICB9KTsKICAgICAgICBlZGl0YWJsZUJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBvc2l0aW9uc3RhcnQiLCAoKSA9PiB7CiAgICAgICAgICB0aGlzLmhhbmRsZXJzPy5vbkNvbXBvc2l0aW9uU3RhcnQ/LigpOwogICAgICAgIH0pOwogICAgICAgIGVkaXRhYmxlQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiY29tcG9zaXRpb25lbmQiLCAoKSA9PiB7CiAgICAgICAgICB0aGlzLmhhbmRsZXJzPy5vbkNvbXBvc2l0aW9uRW5kPy4oKTsKICAgICAgICB9KTsKICAgICAgICBlZGl0YWJsZUJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCAoZTExKSA9PiB7CiAgICAgICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVkaXRhYmxlQmxvY2spOwogICAgICAgICAgaWYgKHBvcyAhPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gcG9zOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5oYW5kbGVycz8ub25Nb3VzZVVwPy4oZTExKTsKICAgICAgICB9KTsKICAgICAgICBlZGl0YWJsZUJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHBvcyA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oZWRpdGFibGVCbG9jayk7CiAgICAgICAgICAgIGlmIChwb3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gcG9zOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCAwKTsKICAgICAgICB9KTsKICAgICAgICBjb25zdCBjaGVja1NlbGVjdGlvbiA9ICgpID0+IHsKICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTsKICAgICAgICAgIGlmIChzZWxlY3RlZFRleHQubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmxhc3RTZWxlY3RlZFRleHQpIHsKICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZFRleHQgPSAiIjsKICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJibG9jay10ZXh0LXNlbGVjdGVkIiwgewogICAgICAgICAgICAgICAgZGV0YWlsOiB7CiAgICAgICAgICAgICAgICAgIHRleHQ6ICIiLAogICAgICAgICAgICAgICAgICBibG9ja0lkOiB0aGlzLmJsb2NrLmlkLAogICAgICAgICAgICAgICAgICBoYXNTZWxlY3Rpb246IGZhbHNlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGN1cnJlbnRFZGl0YWJsZUJsb2NrID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuYmxvY2siKTsKICAgICAgICAgIGlmICghY3VycmVudEVkaXRhYmxlQmxvY2spCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGNvbnN0IHBhcmVudENvbXBvbmVudCA9IHRoaXMuY2xvc2VzdCgiZGVlcy1pbnB1dC13eXNpd3lnIik7CiAgICAgICAgICBjb25zdCBwYXJlbnRTaGFkb3dSb290ID0gcGFyZW50Q29tcG9uZW50Py5zaGFkb3dSb290OwogICAgICAgICAgY29uc3Qgc2hhZG93Um9vdHMgPSBbXTsKICAgICAgICAgIGlmIChwYXJlbnRTaGFkb3dSb290KQogICAgICAgICAgICBzaGFkb3dSb290cy5wdXNoKHBhcmVudFNoYWRvd1Jvb3QpOwogICAgICAgICAgaWYgKHRoaXMuc2hhZG93Um9vdCkKICAgICAgICAgICAgc2hhZG93Um9vdHMucHVzaCh0aGlzLnNoYWRvd1Jvb3QpOwogICAgICAgICAgY29uc3Qgc2VsZWN0aW9uSW5mbyA9IFd5c2l3eWdTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uSW5mbyguLi5zaGFkb3dSb290cyk7CiAgICAgICAgICBpZiAoIXNlbGVjdGlvbkluZm8pCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGNvbnN0IHN0YXJ0SW5CbG9jayA9IFd5c2l3eWdTZWxlY3Rpb24uY29udGFpbnNBY3Jvc3NTaGFkb3dET00oY3VycmVudEVkaXRhYmxlQmxvY2ssIHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIpOwogICAgICAgICAgY29uc3QgZW5kSW5CbG9jayA9IFd5c2l3eWdTZWxlY3Rpb24uY29udGFpbnNBY3Jvc3NTaGFkb3dET00oY3VycmVudEVkaXRhYmxlQmxvY2ssIHNlbGVjdGlvbkluZm8uZW5kQ29udGFpbmVyKTsKICAgICAgICAgIGlmIChzdGFydEluQmxvY2sgfHwgZW5kSW5CbG9jaykgewogICAgICAgICAgICBpZiAoc2VsZWN0ZWRUZXh0ICE9PSB0aGlzLmxhc3RTZWxlY3RlZFRleHQpIHsKICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZFRleHQgPSBzZWxlY3RlZFRleHQ7CiAgICAgICAgICAgICAgY29uc3QgcmFuZ2UyID0gV3lzaXd5Z1NlbGVjdGlvbi5jcmVhdGVSYW5nZUZyb21JbmZvKHNlbGVjdGlvbkluZm8pOwogICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSByYW5nZTIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiYmxvY2stdGV4dC1zZWxlY3RlZCIsIHsKICAgICAgICAgICAgICAgIGRldGFpbDogewogICAgICAgICAgICAgICAgICB0ZXh0OiBzZWxlY3RlZFRleHQudHJpbSgpLAogICAgICAgICAgICAgICAgICBibG9ja0lkOiB0aGlzLmJsb2NrLmlkLAogICAgICAgICAgICAgICAgICByYW5nZTogcmFuZ2UyLAogICAgICAgICAgICAgICAgICByZWN0LAogICAgICAgICAgICAgICAgICBoYXNTZWxlY3Rpb246IHRydWUKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5sYXN0U2VsZWN0ZWRUZXh0KSB7CiAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkVGV4dCA9ICIiOwogICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJibG9jay10ZXh0LXNlbGVjdGVkIiwgewogICAgICAgICAgICAgIGRldGFpbDogewogICAgICAgICAgICAgICAgdGV4dDogIiIsCiAgICAgICAgICAgICAgICBibG9ja0lkOiB0aGlzLmJsb2NrLmlkLAogICAgICAgICAgICAgICAgaGFzU2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgICAgICB9KSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3Rpb25jaGFuZ2UiLCBjaGVja1NlbGVjdGlvbik7CiAgICAgICAgdGhpcy5fc2VsZWN0aW9uSGFuZGxlciA9IGNoZWNrU2VsZWN0aW9uOwogICAgICAgIGVkaXRhYmxlQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLCAoKSA9PiB7CiAgICAgICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVkaXRhYmxlQmxvY2spOwogICAgICAgICAgaWYgKHBvcyAhPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gcG9zOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmICh0aGlzLmJsb2NrLmNvbnRlbnQpIHsKICAgICAgICAgIGVkaXRhYmxlQmxvY2suaW5uZXJIVE1MID0gdGhpcy5ibG9jay5jb250ZW50OwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLmJsb2NrRWxlbWVudCA9IGVkaXRhYmxlQmxvY2s7CiAgICB9CiAgICByZW5kZXIoKSB7CiAgICAgIGlmICghdGhpcy5ibG9jaykKICAgICAgICByZXR1cm4gdTNgYDsKICAgICAgcmV0dXJuIHUzYDxkaXYgY2xhc3M9Ind5c2l3eWctYmxvY2stY29udGFpbmVyIj48L2Rpdj5gOwogICAgfQogICAgcmVuZGVyQmxvY2tDb250ZW50KCkgewogICAgICBpZiAoIXRoaXMuYmxvY2spCiAgICAgICAgcmV0dXJuICIiOwogICAgICBjb25zdCBoYW5kbGVyMiA9IEJsb2NrUmVnaXN0cnkuZ2V0SGFuZGxlcih0aGlzLmJsb2NrLnR5cGUpOwogICAgICBpZiAoaGFuZGxlcjIpIHsKICAgICAgICByZXR1cm4gaGFuZGxlcjIucmVuZGVyKHRoaXMuYmxvY2ssIHRoaXMuaXNTZWxlY3RlZCk7CiAgICAgIH0KICAgICAgY29uc3Qgc2VsZWN0ZWRDbGFzcyA9IHRoaXMuaXNTZWxlY3RlZCA/ICIgc2VsZWN0ZWQiIDogIiI7CiAgICAgIHJldHVybiBgCiAgICAgIDxkaXYKICAgICAgICBjbGFzcz0iYmxvY2sgJHt0aGlzLmJsb2NrLnR5cGV9JHtzZWxlY3RlZENsYXNzfSIKICAgICAgICBjb250ZW50ZWRpdGFibGU9InRydWUiCiAgICAgID48L2Rpdj4KICAgIGA7CiAgICB9CiAgICBmb2N1cygpIHsKICAgICAgY29uc3QgaGFuZGxlcjIgPSBCbG9ja1JlZ2lzdHJ5LmdldEhhbmRsZXIodGhpcy5ibG9jay50eXBlKTsKICAgICAgaWYgKGhhbmRsZXIyICYmIGhhbmRsZXIyLmZvY3VzKSB7CiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIud3lzaXd5Zy1ibG9jay1jb250YWluZXIiKTsKICAgICAgICBjb25zdCBjb250ZXh0MiA9IHsgc2hhZG93Um9vdDogdGhpcy5zaGFkb3dSb290LCBjb21wb25lbnQ6IHRoaXMgfTsKICAgICAgICByZXR1cm4gaGFuZGxlcjIuZm9jdXMoY29udGFpbmVyLCBjb250ZXh0Mik7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuYmxvY2sgJiYgRGVlc1d5c2l3eWdCbG9jazIuTk9OX0VESVRBQkxFX1RZUEVTLmluY2x1ZGVzKHRoaXMuYmxvY2sudHlwZSkpIHsKICAgICAgICBjb25zdCBibG9ja0VsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoYC5ibG9jay4ke3RoaXMuYmxvY2sudHlwZX1gKTsKICAgICAgICBpZiAoYmxvY2tFbGVtZW50KSB7CiAgICAgICAgICBibG9ja0VsZW1lbnQuZm9jdXMoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IGVkaXRhYmxlRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmJsb2NrIik7CiAgICAgIGlmICghZWRpdGFibGVFbGVtZW50KQogICAgICAgIHJldHVybjsKICAgICAgaWYgKCFlZGl0YWJsZUVsZW1lbnQuaGFzQXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiKSkgewogICAgICAgIGVkaXRhYmxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIsICJ0cnVlIik7CiAgICAgIH0KICAgICAgZWRpdGFibGVFbGVtZW50LmZvY3VzKCk7CiAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSBlZGl0YWJsZUVsZW1lbnQgJiYgdGhpcy5zaGFkb3dSb290Py5hY3RpdmVFbGVtZW50ICE9PSBlZGl0YWJsZUVsZW1lbnQpIHsKICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHsKICAgICAgICAgIGVkaXRhYmxlRWxlbWVudC5mb2N1cygpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICBmb2N1c1dpdGhDdXJzb3IocG9zaXRpb24zID0gImVuZCIpIHsKICAgICAgY29uc3QgaGFuZGxlcjIgPSBCbG9ja1JlZ2lzdHJ5LmdldEhhbmRsZXIodGhpcy5ibG9jay50eXBlKTsKICAgICAgaWYgKGhhbmRsZXIyICYmIGhhbmRsZXIyLmZvY3VzV2l0aEN1cnNvcikgewogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnd5c2l3eWctYmxvY2stY29udGFpbmVyIik7CiAgICAgICAgY29uc3QgY29udGV4dDIgPSB7IHNoYWRvd1Jvb3Q6IHRoaXMuc2hhZG93Um9vdCwgY29tcG9uZW50OiB0aGlzIH07CiAgICAgICAgcmV0dXJuIGhhbmRsZXIyLmZvY3VzV2l0aEN1cnNvcihjb250YWluZXIsIHBvc2l0aW9uMywgY29udGV4dDIpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmJsb2NrICYmIERlZXNXeXNpd3lnQmxvY2syLk5PTl9FRElUQUJMRV9UWVBFUy5pbmNsdWRlcyh0aGlzLmJsb2NrLnR5cGUpKSB7CiAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBlZGl0YWJsZUVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jayIpOwogICAgICBpZiAoIWVkaXRhYmxlRWxlbWVudCkKICAgICAgICByZXR1cm47CiAgICAgIGlmICghZWRpdGFibGVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIikpIHsKICAgICAgICBlZGl0YWJsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiLCAidHJ1ZSIpOwogICAgICB9CiAgICAgIGVkaXRhYmxlRWxlbWVudC5mb2N1cygpOwogICAgICBjb25zdCBzZXRDdXJzb3IgPSAoKSA9PiB7CiAgICAgICAgaWYgKHBvc2l0aW9uMyA9PT0gInN0YXJ0IikgewogICAgICAgICAgdGhpcy5zZXRDdXJzb3JUb1N0YXJ0KCk7CiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbjMgPT09ICJlbmQiKSB7CiAgICAgICAgICB0aGlzLnNldEN1cnNvclRvRW5kKCk7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcG9zaXRpb24zID09PSAibnVtYmVyIikgewogICAgICAgICAgV3lzaXd5Z1NlbGVjdGlvbi5zZXRDdXJzb3JQb3NpdGlvbihlZGl0YWJsZUVsZW1lbnQsIHBvc2l0aW9uMyk7CiAgICAgICAgfQogICAgICB9OwogICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZWRpdGFibGVFbGVtZW50IHx8IHRoaXMuc2hhZG93Um9vdD8uYWN0aXZlRWxlbWVudCA9PT0gZWRpdGFibGVFbGVtZW50KSB7CiAgICAgICAgc2V0Q3Vyc29yKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7CiAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZWRpdGFibGVFbGVtZW50IHx8IHRoaXMuc2hhZG93Um9vdD8uYWN0aXZlRWxlbWVudCA9PT0gZWRpdGFibGVFbGVtZW50KSB7CiAgICAgICAgICAgIHNldEN1cnNvcigpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEdldCBjdXJzb3IgcG9zaXRpb24gaW4gdGhlIGVkaXRhYmxlIGVsZW1lbnQKICAgICAqLwogICAgZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQpIHsKICAgICAgY29uc3QgaGFuZGxlcjIgPSBCbG9ja1JlZ2lzdHJ5LmdldEhhbmRsZXIodGhpcy5ibG9jay50eXBlKTsKICAgICAgaWYgKGhhbmRsZXIyICYmIGhhbmRsZXIyLmdldEN1cnNvclBvc2l0aW9uKSB7CiAgICAgICAgY29uc3QgY29udGV4dDIgPSB7IHNoYWRvd1Jvb3Q6IHRoaXMuc2hhZG93Um9vdCwgY29tcG9uZW50OiB0aGlzIH07CiAgICAgICAgcmV0dXJuIGhhbmRsZXIyLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0LCBjb250ZXh0Mik7CiAgICAgIH0KICAgICAgY29uc3QgcGFyZW50Q29tcG9uZW50ID0gdGhpcy5jbG9zZXN0KCJkZWVzLWlucHV0LXd5c2l3eWciKTsKICAgICAgY29uc3QgcGFyZW50U2hhZG93Um9vdCA9IHBhcmVudENvbXBvbmVudD8uc2hhZG93Um9vdDsKICAgICAgY29uc3Qgc2hhZG93Um9vdHMgPSBbXTsKICAgICAgaWYgKHBhcmVudFNoYWRvd1Jvb3QpCiAgICAgICAgc2hhZG93Um9vdHMucHVzaChwYXJlbnRTaGFkb3dSb290KTsKICAgICAgaWYgKHRoaXMuc2hhZG93Um9vdCkKICAgICAgICBzaGFkb3dSb290cy5wdXNoKHRoaXMuc2hhZG93Um9vdCk7CiAgICAgIGNvbnN0IHNlbGVjdGlvbkluZm8gPSBXeXNpd3lnU2VsZWN0aW9uLmdldFNlbGVjdGlvbkluZm8oLi4uc2hhZG93Um9vdHMpOwogICAgICBjb25zb2xlLmxvZygiZ2V0Q3Vyc29yUG9zaXRpb246IFNlbGVjdGlvbiBpbmZvIGZyb20gc2hhZG93IERPTXM6IiwgewogICAgICAgIHNlbGVjdGlvbkluZm8sCiAgICAgICAgc2hhZG93Um9vdHNDb3VudDogc2hhZG93Um9vdHMubGVuZ3RoCiAgICAgIH0pOwogICAgICBpZiAoIXNlbGVjdGlvbkluZm8pIHsKICAgICAgICBjb25zb2xlLmxvZygiZ2V0Q3Vyc29yUG9zaXRpb246IE5vIHNlbGVjdGlvbiBmb3VuZCIpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnNvbGUubG9nKCJnZXRDdXJzb3JQb3NpdGlvbjogUmFuZ2UgaW5mbzoiLCB7CiAgICAgICAgc3RhcnRDb250YWluZXI6IHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIsCiAgICAgICAgc3RhcnRPZmZzZXQ6IHNlbGVjdGlvbkluZm8uc3RhcnRPZmZzZXQsCiAgICAgICAgY29sbGFwc2VkOiBzZWxlY3Rpb25JbmZvLmNvbGxhcHNlZCwKICAgICAgICBzdGFydENvbnRhaW5lclRleHQ6IHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIudGV4dENvbnRlbnQKICAgICAgfSk7CiAgICAgIGlmICghZWxlbWVudDQuY29udGFpbnMoc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lcikpIHsKICAgICAgICBjb25zb2xlLmxvZygiZ2V0Q3Vyc29yUG9zaXRpb246IFJhbmdlIG5vdCBpbiBlbGVtZW50Iik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgcHJlQ2FyZXRSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgIHByZUNhcmV0UmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVsZW1lbnQ0KTsKICAgICAgcHJlQ2FyZXRSYW5nZS5zZXRFbmQoc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lciwgc2VsZWN0aW9uSW5mby5zdGFydE9mZnNldCk7CiAgICAgIGNvbnN0IHBvc2l0aW9uMyA9IHByZUNhcmV0UmFuZ2UudG9TdHJpbmcoKS5sZW5ndGg7CiAgICAgIGNvbnNvbGUubG9nKCJnZXRDdXJzb3JQb3NpdGlvbjogQ2FsY3VsYXRlZCBwb3NpdGlvbjoiLCB7CiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uMywKICAgICAgICBwcmVDYXJldFRleHQ6IHByZUNhcmV0UmFuZ2UudG9TdHJpbmcoKSwKICAgICAgICBlbGVtZW50VGV4dDogZWxlbWVudDQudGV4dENvbnRlbnQsCiAgICAgICAgZWxlbWVudFRleHRMZW5ndGg6IGVsZW1lbnQ0LnRleHRDb250ZW50Py5sZW5ndGgKICAgICAgfSk7CiAgICAgIHJldHVybiBwb3NpdGlvbjM7CiAgICB9CiAgICBnZXRDb250ZW50KCkgewogICAgICBjb25zdCBoYW5kbGVyMiA9IEJsb2NrUmVnaXN0cnkuZ2V0SGFuZGxlcih0aGlzLmJsb2NrLnR5cGUpOwogICAgICBpZiAoaGFuZGxlcjIgJiYgaGFuZGxlcjIuZ2V0Q29udGVudCkgewogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnd5c2l3eWctYmxvY2stY29udGFpbmVyIik7CiAgICAgICAgY29uc3QgY29udGV4dDIgPSB7IHNoYWRvd1Jvb3Q6IHRoaXMuc2hhZG93Um9vdCwgY29tcG9uZW50OiB0aGlzIH07CiAgICAgICAgcmV0dXJuIGhhbmRsZXIyLmdldENvbnRlbnQoY29udGFpbmVyLCBjb250ZXh0Mik7CiAgICAgIH0KICAgICAgY29uc3QgZWRpdGFibGVFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuYmxvY2siKTsKICAgICAgaWYgKCFlZGl0YWJsZUVsZW1lbnQpCiAgICAgICAgcmV0dXJuICIiOwogICAgICBjb25zdCBjb250ZW50MyA9IGVkaXRhYmxlRWxlbWVudC5pbm5lckhUTUwgfHwgIiI7CiAgICAgIGNvbnNvbGUubG9nKCJHZXR0aW5nIGNvbnRlbnQgZnJvbSBibG9jazoiLCBjb250ZW50Myk7CiAgICAgIHJldHVybiBjb250ZW50MzsKICAgIH0KICAgIHNldENvbnRlbnQoY29udGVudDMpIHsKICAgICAgY29uc3QgaGFuZGxlcjIgPSBCbG9ja1JlZ2lzdHJ5LmdldEhhbmRsZXIodGhpcy5ibG9jay50eXBlKTsKICAgICAgaWYgKGhhbmRsZXIyICYmIGhhbmRsZXIyLnNldENvbnRlbnQpIHsKICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi53eXNpd3lnLWJsb2NrLWNvbnRhaW5lciIpOwogICAgICAgIGNvbnN0IGNvbnRleHQyID0geyBzaGFkb3dSb290OiB0aGlzLnNoYWRvd1Jvb3QsIGNvbXBvbmVudDogdGhpcyB9OwogICAgICAgIHJldHVybiBoYW5kbGVyMi5zZXRDb250ZW50KGNvbnRhaW5lciwgY29udGVudDMsIGNvbnRleHQyKTsKICAgICAgfQogICAgICBjb25zdCBlZGl0YWJsZUVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jayIpOwogICAgICBpZiAoIWVkaXRhYmxlRWxlbWVudCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGhhZEZvY3VzID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZWRpdGFibGVFbGVtZW50IHx8IHRoaXMuc2hhZG93Um9vdD8uYWN0aXZlRWxlbWVudCA9PT0gZWRpdGFibGVFbGVtZW50OwogICAgICBlZGl0YWJsZUVsZW1lbnQuaW5uZXJIVE1MID0gY29udGVudDM7CiAgICAgIGlmIChoYWRGb2N1cykgewogICAgICAgIGVkaXRhYmxlRWxlbWVudC5mb2N1cygpOwogICAgICB9CiAgICB9CiAgICBzZXRDdXJzb3JUb1N0YXJ0KCkgewogICAgICBjb25zdCBoYW5kbGVyMiA9IEJsb2NrUmVnaXN0cnkuZ2V0SGFuZGxlcih0aGlzLmJsb2NrLnR5cGUpOwogICAgICBpZiAoaGFuZGxlcjIgJiYgaGFuZGxlcjIuc2V0Q3Vyc29yVG9TdGFydCkgewogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnd5c2l3eWctYmxvY2stY29udGFpbmVyIik7CiAgICAgICAgY29uc3QgY29udGV4dDIgPSB7IHNoYWRvd1Jvb3Q6IHRoaXMuc2hhZG93Um9vdCwgY29tcG9uZW50OiB0aGlzIH07CiAgICAgICAgcmV0dXJuIGhhbmRsZXIyLnNldEN1cnNvclRvU3RhcnQoY29udGFpbmVyLCBjb250ZXh0Mik7CiAgICAgIH0KICAgICAgY29uc3QgZWRpdGFibGVFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuYmxvY2siKTsKICAgICAgaWYgKGVkaXRhYmxlRWxlbWVudCkgewogICAgICAgIFd5c2l3eWdCbG9ja3Muc2V0Q3Vyc29yVG9TdGFydChlZGl0YWJsZUVsZW1lbnQpOwogICAgICB9CiAgICB9CiAgICBzZXRDdXJzb3JUb0VuZCgpIHsKICAgICAgY29uc3QgaGFuZGxlcjIgPSBCbG9ja1JlZ2lzdHJ5LmdldEhhbmRsZXIodGhpcy5ibG9jay50eXBlKTsKICAgICAgaWYgKGhhbmRsZXIyICYmIGhhbmRsZXIyLnNldEN1cnNvclRvRW5kKSB7CiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIud3lzaXd5Zy1ibG9jay1jb250YWluZXIiKTsKICAgICAgICBjb25zdCBjb250ZXh0MiA9IHsgc2hhZG93Um9vdDogdGhpcy5zaGFkb3dSb290LCBjb21wb25lbnQ6IHRoaXMgfTsKICAgICAgICByZXR1cm4gaGFuZGxlcjIuc2V0Q3Vyc29yVG9FbmQoY29udGFpbmVyLCBjb250ZXh0Mik7CiAgICAgIH0KICAgICAgY29uc3QgZWRpdGFibGVFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuYmxvY2siKTsKICAgICAgaWYgKGVkaXRhYmxlRWxlbWVudCkgewogICAgICAgIFd5c2l3eWdCbG9ja3Muc2V0Q3Vyc29yVG9FbmQoZWRpdGFibGVFbGVtZW50KTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBHZXQgY29udGV4dCBtZW51IGl0ZW1zIGZvciB0aGlzIGJsb2NrCiAgICAgKi8KICAgIGdldENvbnRleHRNZW51SXRlbXMoKSB7CiAgICAgIGlmICghdGhpcy5ibG9jayB8fCB0aGlzLmJsb2NrLnR5cGUgPT09ICJkaXZpZGVyIikgewogICAgICAgIHJldHVybiBbXTsKICAgICAgfQogICAgICBjb25zdCBibG9ja1R5cGVzID0gV3lzaXd5Z1Nob3J0Y3V0cy5nZXRTbGFzaE1lbnVJdGVtcygpOwogICAgICBjb25zdCBjdXJyZW50VHlwZSA9IHRoaXMuYmxvY2sudHlwZTsKICAgICAgY29uc3Qgd3lzaXd5Z0NvbXBvbmVudCA9IHRoaXMud3lzaXd5Z0NvbXBvbmVudDsKICAgICAgY29uc3QgYmxvY2tJZCA9IHRoaXMuYmxvY2suaWQ7CiAgICAgIGNvbnN0IGJsb2NrVHlwZUl0ZW1zID0gYmxvY2tUeXBlcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSAhPT0gY3VycmVudFR5cGUgJiYgaXRlbS50eXBlICE9PSAiZGl2aWRlciIpLm1hcCgoaXRlbSkgPT4gKHsKICAgICAgICBuYW1lOiBpdGVtLmxhYmVsLAogICAgICAgIGljb25OYW1lOiBpdGVtLmljb24ucmVwbGFjZSgibHVjaWRlOiIsICIiKSwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIGlmICh3eXNpd3lnQ29tcG9uZW50ICYmIHd5c2l3eWdDb21wb25lbnQuYmxvY2tPcGVyYXRpb25zKSB7CiAgICAgICAgICAgIGNvbnN0IGJsb2NrVG9UcmFuc2Zvcm0gPSB3eXNpd3lnQ29tcG9uZW50LmJsb2Nrcy5maW5kKChiNSkgPT4gYjUuaWQgPT09IGJsb2NrSWQpOwogICAgICAgICAgICBpZiAoYmxvY2tUb1RyYW5zZm9ybSkgewogICAgICAgICAgICAgIGJsb2NrVG9UcmFuc2Zvcm0udHlwZSA9IGl0ZW0udHlwZTsKICAgICAgICAgICAgICBibG9ja1RvVHJhbnNmb3JtLmNvbnRlbnQgPSBibG9ja1RvVHJhbnNmb3JtLmNvbnRlbnQgfHwgIiI7CiAgICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gImNvZGUiKSB7CiAgICAgICAgICAgICAgICBibG9ja1RvVHJhbnNmb3JtLm1ldGFkYXRhID0geyBsYW5ndWFnZTogInR5cGVzY3JpcHQiIH07CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICJsaXN0IikgewogICAgICAgICAgICAgICAgYmxvY2tUb1RyYW5zZm9ybS5tZXRhZGF0YSA9IHsgbGlzdFR5cGU6ICJidWxsZXQiIH07CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICJpbWFnZSIpIHsKICAgICAgICAgICAgICAgIGJsb2NrVG9UcmFuc2Zvcm0uY29udGVudCA9ICIiOwogICAgICAgICAgICAgICAgYmxvY2tUb1RyYW5zZm9ybS5tZXRhZGF0YSA9IHsgdXJsOiAiIiwgbG9hZGluZzogZmFsc2UgfTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gInlvdXR1YmUiKSB7CiAgICAgICAgICAgICAgICBibG9ja1RvVHJhbnNmb3JtLmNvbnRlbnQgPSAiIjsKICAgICAgICAgICAgICAgIGJsb2NrVG9UcmFuc2Zvcm0ubWV0YWRhdGEgPSB7IHZpZGVvSWQ6ICIiLCB1cmw6ICIiIH07CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICJtYXJrZG93biIpIHsKICAgICAgICAgICAgICAgIGJsb2NrVG9UcmFuc2Zvcm0ubWV0YWRhdGEgPSB7IHNob3dQcmV2aWV3OiBmYWxzZSB9OwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAiaHRtbCIpIHsKICAgICAgICAgICAgICAgIGJsb2NrVG9UcmFuc2Zvcm0ubWV0YWRhdGEgPSB7IHNob3dQcmV2aWV3OiBmYWxzZSB9OwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAiYXR0YWNobWVudCIpIHsKICAgICAgICAgICAgICAgIGJsb2NrVG9UcmFuc2Zvcm0uY29udGVudCA9ICIiOwogICAgICAgICAgICAgICAgYmxvY2tUb1RyYW5zZm9ybS5tZXRhZGF0YSA9IHsgZmlsZXM6IFtdIH07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHd5c2l3eWdDb21wb25lbnQudXBkYXRlQmxvY2tFbGVtZW50KGJsb2NrSWQpOwogICAgICAgICAgICAgIHd5c2l3eWdDb21wb25lbnQudXBkYXRlVmFsdWUoKTsKICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgICAgICAgICAgd3lzaXd5Z0NvbXBvbmVudC5ibG9ja09wZXJhdGlvbnMuZm9jdXNCbG9jayhibG9ja0lkKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSkpOwogICAgICBjb25zdCBtZW51SXRlbXMgPSBbCiAgICAgICAgewogICAgICAgICAgbmFtZTogIkNoYW5nZSBUeXBlIiwKICAgICAgICAgIGljb25OYW1lOiAidHlwZSIsCiAgICAgICAgICBzdWJtZW51OiBibG9ja1R5cGVJdGVtcwogICAgICAgIH0KICAgICAgXTsKICAgICAgaWYgKCFbImltYWdlIiwgImRpdmlkZXIiLCAieW91dHViZSIsICJhdHRhY2htZW50Il0uaW5jbHVkZXModGhpcy5ibG9jay50eXBlKSkgewogICAgICAgIG1lbnVJdGVtcy5wdXNoKHsgZGl2aWRlcjogdHJ1ZSB9LCB7CiAgICAgICAgICBuYW1lOiAiQ3V0IiwKICAgICAgICAgIGljb25OYW1lOiAic2Npc3NvcnMiLAogICAgICAgICAgc2hvcnRjdXQ6ICJDbWQrWCIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoImN1dCIpOwogICAgICAgICAgfQogICAgICAgIH0sIHsKICAgICAgICAgIG5hbWU6ICJDb3B5IiwKICAgICAgICAgIGljb25OYW1lOiAiY29weSIsCiAgICAgICAgICBzaG9ydGN1dDogIkNtZCtDIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpOwogICAgICAgICAgfQogICAgICAgIH0sIHsKICAgICAgICAgIG5hbWU6ICJQYXN0ZSIsCiAgICAgICAgICBpY29uTmFtZTogImNsaXBib2FyZCIsCiAgICAgICAgICBzaG9ydGN1dDogIkNtZCtWIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgicGFzdGUiKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICBtZW51SXRlbXMucHVzaCh7IGRpdmlkZXI6IHRydWUgfSwgewogICAgICAgIG5hbWU6ICJEZWxldGUgQmxvY2siLAogICAgICAgIGljb25OYW1lOiAidHJhc2gyIiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIGlmICh3eXNpd3lnQ29tcG9uZW50ICYmIHd5c2l3eWdDb21wb25lbnQuYmxvY2tPcGVyYXRpb25zKSB7CiAgICAgICAgICAgIHd5c2l3eWdDb21wb25lbnQuYmxvY2tPcGVyYXRpb25zLmRlbGV0ZUJsb2NrKGJsb2NrSWQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiBtZW51SXRlbXM7CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgY29udGVudCBzcGxpdCBhdCBjdXJzb3IgcG9zaXRpb24KICAgICAqLwogICAgZ2V0U3BsaXRDb250ZW50KCkgewogICAgICBjb25zb2xlLmxvZygiZ2V0U3BsaXRDb250ZW50OiBTdGFydGluZy4uLiIpOwogICAgICBjb25zdCBoYW5kbGVyMiA9IEJsb2NrUmVnaXN0cnkuZ2V0SGFuZGxlcih0aGlzLmJsb2NrLnR5cGUpOwogICAgICBjb25zb2xlLmxvZygiZ2V0U3BsaXRDb250ZW50OiBDaGVja2luZyBmb3IgaGFuZGxlciIsIHsKICAgICAgICBibG9ja1R5cGU6IHRoaXMuYmxvY2sudHlwZSwKICAgICAgICBoYXNIYW5kbGVyOiAhIWhhbmRsZXIyLAogICAgICAgIGhhc1NwbGl0TWV0aG9kOiAhIShoYW5kbGVyMiAmJiBoYW5kbGVyMi5nZXRTcGxpdENvbnRlbnQpCiAgICAgIH0pOwogICAgICBpZiAoaGFuZGxlcjIgJiYgaGFuZGxlcjIuZ2V0U3BsaXRDb250ZW50KSB7CiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIud3lzaXd5Zy1ibG9jay1jb250YWluZXIiKTsKICAgICAgICBjb25zb2xlLmxvZygiZ2V0U3BsaXRDb250ZW50OiBGb3VuZCBjb250YWluZXIiLCB7CiAgICAgICAgICBjb250YWluZXI6ICEhY29udGFpbmVyLAogICAgICAgICAgY29udGFpbmVySFRNTDogY29udGFpbmVyPy5pbm5lckhUTUw/LnN1YnN0cmluZygwLCAxMDApCiAgICAgICAgfSk7CiAgICAgICAgY29uc3QgY29udGV4dDIgPSB7CiAgICAgICAgICBzaGFkb3dSb290OiB0aGlzLnNoYWRvd1Jvb3QsCiAgICAgICAgICBjb21wb25lbnQ6IHRoaXMKICAgICAgICB9OwogICAgICAgIHJldHVybiBoYW5kbGVyMi5nZXRTcGxpdENvbnRlbnQoY29udGFpbmVyLCBjb250ZXh0Mik7CiAgICAgIH0KICAgICAgY29uc3QgZWRpdGFibGVFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuYmxvY2siKTsKICAgICAgaWYgKCFlZGl0YWJsZUVsZW1lbnQpIHsKICAgICAgICBjb25zb2xlLmxvZygiZ2V0U3BsaXRDb250ZW50OiBObyBlZGl0YWJsZSBlbGVtZW50IGZvdW5kIik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc29sZS5sb2coImdldFNwbGl0Q29udGVudDogRWxlbWVudCBpbmZvOiIsIHsKICAgICAgICBibG9ja1R5cGU6IHRoaXMuYmxvY2sudHlwZSwKICAgICAgICBpbm5lckhUTUw6IGVkaXRhYmxlRWxlbWVudC5pbm5lckhUTUwsCiAgICAgICAgdGV4dENvbnRlbnQ6IGVkaXRhYmxlRWxlbWVudC50ZXh0Q29udGVudCwKICAgICAgICB0ZXh0TGVuZ3RoOiBlZGl0YWJsZUVsZW1lbnQudGV4dENvbnRlbnQ/Lmxlbmd0aAogICAgICB9KTsKICAgICAgY29uc3QgcGFyZW50Q29tcG9uZW50ID0gdGhpcy5jbG9zZXN0KCJkZWVzLWlucHV0LXd5c2l3eWciKTsKICAgICAgY29uc3QgcGFyZW50U2hhZG93Um9vdCA9IHBhcmVudENvbXBvbmVudD8uc2hhZG93Um9vdDsKICAgICAgY29uc3Qgc2hhZG93Um9vdHMgPSBbXTsKICAgICAgaWYgKHBhcmVudFNoYWRvd1Jvb3QpCiAgICAgICAgc2hhZG93Um9vdHMucHVzaChwYXJlbnRTaGFkb3dSb290KTsKICAgICAgaWYgKHRoaXMuc2hhZG93Um9vdCkKICAgICAgICBzaGFkb3dSb290cy5wdXNoKHRoaXMuc2hhZG93Um9vdCk7CiAgICAgIGNvbnN0IHNlbGVjdGlvbkluZm8gPSBXeXNpd3lnU2VsZWN0aW9uLmdldFNlbGVjdGlvbkluZm8oLi4uc2hhZG93Um9vdHMpOwogICAgICBjb25zb2xlLmxvZygiZ2V0U3BsaXRDb250ZW50OiBTZWxlY3Rpb24gaW5mbyBmcm9tIHNoYWRvdyBET01zOiIsIHsKICAgICAgICBzZWxlY3Rpb25JbmZvLAogICAgICAgIHNoYWRvd1Jvb3RzQ291bnQ6IHNoYWRvd1Jvb3RzLmxlbmd0aAogICAgICB9KTsKICAgICAgaWYgKCFzZWxlY3Rpb25JbmZvKSB7CiAgICAgICAgY29uc29sZS5sb2coImdldFNwbGl0Q29udGVudDogTm8gc2VsZWN0aW9uLCB1c2luZyBsYXN0IGtub3duIHBvc2l0aW9uOiIsIHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24pOwogICAgICAgIGlmICh0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uICE9PSBudWxsKSB7CiAgICAgICAgICBjb25zdCBmdWxsVGV4dCA9IGVkaXRhYmxlRWxlbWVudC50ZXh0Q29udGVudCB8fCAiIjsKICAgICAgICAgIGNvbnN0IHBvcyA9IE1hdGgubWluKHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24sIGZ1bGxUZXh0Lmxlbmd0aCk7CiAgICAgICAgICBjb25zb2xlLmxvZygiZ2V0U3BsaXRDb250ZW50OiBTcGxpdHRpbmcgd2l0aCBsYXN0IGtub3duIHBvc2l0aW9uOiIsIHsKICAgICAgICAgICAgcG9zLAogICAgICAgICAgICBmdWxsVGV4dExlbmd0aDogZnVsbFRleHQubGVuZ3RoLAogICAgICAgICAgICBiZWZvcmU6IGZ1bGxUZXh0LnN1YnN0cmluZygwLCBwb3MpLAogICAgICAgICAgICBhZnRlcjogZnVsbFRleHQuc3Vic3RyaW5nKHBvcykKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgYmVmb3JlOiBmdWxsVGV4dC5zdWJzdHJpbmcoMCwgcG9zKSwKICAgICAgICAgICAgYWZ0ZXI6IGZ1bGxUZXh0LnN1YnN0cmluZyhwb3MpCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zb2xlLmxvZygiZ2V0U3BsaXRDb250ZW50OiBTZWxlY3Rpb24gcmFuZ2U6IiwgewogICAgICAgIHN0YXJ0Q29udGFpbmVyOiBzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyLAogICAgICAgIHN0YXJ0T2Zmc2V0OiBzZWxlY3Rpb25JbmZvLnN0YXJ0T2Zmc2V0LAogICAgICAgIHN0YXJ0Q29udGFpbmVySW5FbGVtZW50OiBlZGl0YWJsZUVsZW1lbnQuY29udGFpbnMoc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lcikKICAgICAgfSk7CiAgICAgIGlmICghV3lzaXd5Z1NlbGVjdGlvbi5jb250YWluc0Fjcm9zc1NoYWRvd0RPTShlZGl0YWJsZUVsZW1lbnQsIHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIpKSB7CiAgICAgICAgY29uc29sZS5sb2coImdldFNwbGl0Q29udGVudDogU2VsZWN0aW9uIG5vdCBpbiB0aGlzIGJsb2NrLCB1c2luZyBsYXN0IGtub3duIHBvc2l0aW9uOiIsIHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24pOwogICAgICAgIGlmICh0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uICE9PSBudWxsKSB7CiAgICAgICAgICBjb25zdCBmdWxsVGV4dCA9IGVkaXRhYmxlRWxlbWVudC50ZXh0Q29udGVudCB8fCAiIjsKICAgICAgICAgIGNvbnN0IHBvcyA9IE1hdGgubWluKHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24sIGZ1bGxUZXh0Lmxlbmd0aCk7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBiZWZvcmU6IGZ1bGxUZXh0LnN1YnN0cmluZygwLCBwb3MpLAogICAgICAgICAgICBhZnRlcjogZnVsbFRleHQuc3Vic3RyaW5nKHBvcykKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IGN1cnNvclBvcyA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oZWRpdGFibGVFbGVtZW50KTsKICAgICAgY29uc29sZS5sb2coImdldFNwbGl0Q29udGVudDogQ3Vyc29yIHBvc2l0aW9uIGZvciBIVE1MIHNwbGl0OiIsIGN1cnNvclBvcyk7CiAgICAgIGlmIChjdXJzb3JQb3MgPT09IG51bGwgfHwgY3Vyc29yUG9zID09PSAwKSB7CiAgICAgICAgY29uc29sZS5sb2coImdldFNwbGl0Q29udGVudDogQ3Vyc29yIGF0IHN0YXJ0IG9yIG51bGwsIG1vdmluZyBhbGwgY29udGVudCIpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBiZWZvcmU6ICIiLAogICAgICAgICAgYWZ0ZXI6IGVkaXRhYmxlRWxlbWVudC5pbm5lckhUTUwKICAgICAgICB9OwogICAgICB9CiAgICAgIGNvbnN0IGJlZm9yZVJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgY29uc3QgYWZ0ZXJSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgIGJlZm9yZVJhbmdlLnNldFN0YXJ0KGVkaXRhYmxlRWxlbWVudCwgMCk7CiAgICAgIGJlZm9yZVJhbmdlLnNldEVuZChzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyLCBzZWxlY3Rpb25JbmZvLnN0YXJ0T2Zmc2V0KTsKICAgICAgYWZ0ZXJSYW5nZS5zZXRTdGFydChzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyLCBzZWxlY3Rpb25JbmZvLnN0YXJ0T2Zmc2V0KTsKICAgICAgYWZ0ZXJSYW5nZS5zZXRFbmQoZWRpdGFibGVFbGVtZW50LCBlZGl0YWJsZUVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGgpOwogICAgICBjb25zdCBiZWZvcmVGcmFnbWVudCA9IGJlZm9yZVJhbmdlLmNsb25lQ29udGVudHMoKTsKICAgICAgY29uc3QgYWZ0ZXJGcmFnbWVudCA9IGFmdGVyUmFuZ2UuY2xvbmVDb250ZW50cygpOwogICAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgIHRlbXBEaXYuYXBwZW5kQ2hpbGQoYmVmb3JlRnJhZ21lbnQpOwogICAgICBjb25zdCBiZWZvcmVIdG1sID0gdGVtcERpdi5pbm5lckhUTUw7CiAgICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gIiI7CiAgICAgIHRlbXBEaXYuYXBwZW5kQ2hpbGQoYWZ0ZXJGcmFnbWVudCk7CiAgICAgIGNvbnN0IGFmdGVySHRtbCA9IHRlbXBEaXYuaW5uZXJIVE1MOwogICAgICBjb25zb2xlLmxvZygiZ2V0U3BsaXRDb250ZW50OiBGaW5hbCBzcGxpdCByZXN1bHQ6IiwgewogICAgICAgIGN1cnNvclBvcywKICAgICAgICBiZWZvcmVIdG1sLAogICAgICAgIGJlZm9yZUxlbmd0aDogYmVmb3JlSHRtbC5sZW5ndGgsCiAgICAgICAgYmVmb3JlSHRtbFByZXZpZXc6IGJlZm9yZUh0bWwuc3Vic3RyaW5nKDAsIDEwMCkgKyAoYmVmb3JlSHRtbC5sZW5ndGggPiAxMDAgPyAiLi4uIiA6ICIiKSwKICAgICAgICBhZnRlckh0bWwsCiAgICAgICAgYWZ0ZXJMZW5ndGg6IGFmdGVySHRtbC5sZW5ndGgsCiAgICAgICAgYWZ0ZXJIdG1sUHJldmlldzogYWZ0ZXJIdG1sLnN1YnN0cmluZygwLCAxMDApICsgKGFmdGVySHRtbC5sZW5ndGggPiAxMDAgPyAiLi4uIiA6ICIiKQogICAgICB9KTsKICAgICAgcmV0dXJuIHsKICAgICAgICBiZWZvcmU6IGJlZm9yZUh0bWwsCiAgICAgICAgYWZ0ZXI6IGFmdGVySHRtbAogICAgICB9OwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM2MihfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1d5c2l3eWdCbG9jazIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy9kZWVzLWlucHV0LXd5c2l3eWcuanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlNjIgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczYzID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzSW5wdXRXeXNpd3lnID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1pbnB1dC13eXNpd3lnIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNJbnB1dEJhc2U7CiAgbGV0IF92YWx1ZV9kZWNvcmF0b3JzOwogIGxldCBfdmFsdWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWx1ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfb3V0cHV0Rm9ybWF0X2RlY29yYXRvcnM7CiAgbGV0IF9vdXRwdXRGb3JtYXRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vdXRwdXRGb3JtYXRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Jsb2Nrc19kZWNvcmF0b3JzOwogIGxldCBfYmxvY2tzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYmxvY2tzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnZ2VkQmxvY2tJZF9kZWNvcmF0b3JzOwogIGxldCBfZHJhZ2dlZEJsb2NrSWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnZ2VkQmxvY2tJZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZHJhZ092ZXJCbG9ja0lkX2RlY29yYXRvcnM7CiAgbGV0IF9kcmFnT3ZlckJsb2NrSWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnT3ZlckJsb2NrSWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RyYWdPdmVyUG9zaXRpb25fZGVjb3JhdG9yczsKICBsZXQgX2RyYWdPdmVyUG9zaXRpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnT3ZlclBvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZFRleHRfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkVGV4dF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkVGV4dF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW5wdXRXeXNpd3lnMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3ZhbHVlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfb3V0cHV0Rm9ybWF0X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfYmxvY2tzX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9kcmFnZ2VkQmxvY2tJZF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfZHJhZ092ZXJCbG9ja0lkX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9kcmFnT3ZlclBvc2l0aW9uX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9zZWxlY3RlZFRleHRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlNjIodGhpcywgbnVsbCwgX3ZhbHVlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZhbHVlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ2YWx1ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai52YWx1ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudmFsdWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2Mih0aGlzLCBudWxsLCBfb3V0cHV0Rm9ybWF0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm91dHB1dEZvcm1hdCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAib3V0cHV0Rm9ybWF0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm91dHB1dEZvcm1hdCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoub3V0cHV0Rm9ybWF0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX291dHB1dEZvcm1hdF9pbml0aWFsaXplcnMsIF9vdXRwdXRGb3JtYXRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2Mih0aGlzLCBudWxsLCBfYmxvY2tzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImJsb2NrcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYmxvY2tzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmJsb2Nrcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYmxvY2tzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Jsb2Nrc19pbml0aWFsaXplcnMsIF9ibG9ja3NfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2Mih0aGlzLCBudWxsLCBfZHJhZ2dlZEJsb2NrSWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZHJhZ2dlZEJsb2NrSWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRyYWdnZWRCbG9ja0lkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRyYWdnZWRCbG9ja0lkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kcmFnZ2VkQmxvY2tJZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kcmFnZ2VkQmxvY2tJZF9pbml0aWFsaXplcnMsIF9kcmFnZ2VkQmxvY2tJZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTYyKHRoaXMsIG51bGwsIF9kcmFnT3ZlckJsb2NrSWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZHJhZ092ZXJCbG9ja0lkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkcmFnT3ZlckJsb2NrSWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZHJhZ092ZXJCbG9ja0lkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kcmFnT3ZlckJsb2NrSWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZHJhZ092ZXJCbG9ja0lkX2luaXRpYWxpemVycywgX2RyYWdPdmVyQmxvY2tJZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTYyKHRoaXMsIG51bGwsIF9kcmFnT3ZlclBvc2l0aW9uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImRyYWdPdmVyUG9zaXRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRyYWdPdmVyUG9zaXRpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZHJhZ092ZXJQb3NpdGlvbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZHJhZ092ZXJQb3NpdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kcmFnT3ZlclBvc2l0aW9uX2luaXRpYWxpemVycywgX2RyYWdPdmVyUG9zaXRpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2Mih0aGlzLCBudWxsLCBfc2VsZWN0ZWRUZXh0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlbGVjdGVkVGV4dCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0ZWRUZXh0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGVkVGV4dCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VsZWN0ZWRUZXh0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGVkVGV4dF9pbml0aWFsaXplcnMsIF9zZWxlY3RlZFRleHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2MihudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNJbnB1dFd5c2l3eWcyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmM0MzsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJJbnB1dCIsICJXb3Jrc3BhY2UiXTsKICAgICN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM2Myh0aGlzLCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI291dHB1dEZvcm1hdF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjModGhpcywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2Myh0aGlzLCBfb3V0cHV0Rm9ybWF0X2luaXRpYWxpemVycywgImh0bWwiKSk7CiAgICBnZXQgb3V0cHV0Rm9ybWF0KCkgewogICAgICByZXR1cm4gdGhpcy4jb3V0cHV0Rm9ybWF0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgb3V0cHV0Rm9ybWF0KHZhbHVlMikgewogICAgICB0aGlzLiNvdXRwdXRGb3JtYXRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNibG9ja3NfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczYzKHRoaXMsIF9vdXRwdXRGb3JtYXRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczYzKHRoaXMsIF9ibG9ja3NfaW5pdGlhbGl6ZXJzLCBbCiAgICAgIHsKICAgICAgICBpZDogV3lzaXd5Z1Nob3J0Y3V0cy5nZW5lcmF0ZUJsb2NrSWQoKSwKICAgICAgICB0eXBlOiAicGFyYWdyYXBoIiwKICAgICAgICBjb250ZW50OiAiIgogICAgICB9CiAgICBdKSk7CiAgICBnZXQgYmxvY2tzKCkgewogICAgICByZXR1cm4gdGhpcy4jYmxvY2tzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYmxvY2tzKHZhbHVlMikgewogICAgICB0aGlzLiNibG9ja3NfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIC8vIE5vdCB1c2luZyBAc3RhdGUgdG8gYXZvaWQgcmUtcmVuZGVycyB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzCiAgICBzZWxlY3RlZEJsb2NrSWQgPSAoX19ydW5Jbml0aWFsaXplcnM2Myh0aGlzLCBfYmxvY2tzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgbnVsbCk7CiAgICAvLyBTbGFzaCBtZW51IGlzIG5vdyBnbG9iYWxseSByZW5kZXJlZAogICAgc2xhc2hNZW51ID0gRGVlc1NsYXNoTWVudS5nZXRJbnN0YW5jZSgpOwogICAgI2RyYWdnZWRCbG9ja0lkX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczYzKHRoaXMsIF9kcmFnZ2VkQmxvY2tJZF9pbml0aWFsaXplcnMsIG51bGwpOwogICAgZ2V0IGRyYWdnZWRCbG9ja0lkKCkgewogICAgICByZXR1cm4gdGhpcy4jZHJhZ2dlZEJsb2NrSWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkcmFnZ2VkQmxvY2tJZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZHJhZ2dlZEJsb2NrSWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNkcmFnT3ZlckJsb2NrSWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczYzKHRoaXMsIF9kcmFnZ2VkQmxvY2tJZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjModGhpcywgX2RyYWdPdmVyQmxvY2tJZF9pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIGdldCBkcmFnT3ZlckJsb2NrSWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNkcmFnT3ZlckJsb2NrSWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkcmFnT3ZlckJsb2NrSWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2RyYWdPdmVyQmxvY2tJZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2RyYWdPdmVyUG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczYzKHRoaXMsIF9kcmFnT3ZlckJsb2NrSWRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczYzKHRoaXMsIF9kcmFnT3ZlclBvc2l0aW9uX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IGRyYWdPdmVyUG9zaXRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNkcmFnT3ZlclBvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZHJhZ092ZXJQb3NpdGlvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jZHJhZ092ZXJQb3NpdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgLy8gRm9ybWF0dGluZyBtZW51IGlzIG5vdyBnbG9iYWxseSByZW5kZXJlZAogICAgZm9ybWF0dGluZ01lbnUgPSAoX19ydW5Jbml0aWFsaXplcnM2Myh0aGlzLCBfZHJhZ092ZXJQb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyksIERlZXNGb3JtYXR0aW5nTWVudS5nZXRJbnN0YW5jZSgpKTsKICAgICNzZWxlY3RlZFRleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNjModGhpcywgX3NlbGVjdGVkVGV4dF9pbml0aWFsaXplcnMsICIiKTsKICAgIGdldCBzZWxlY3RlZFRleHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZFRleHRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3RlZFRleHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlbGVjdGVkVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgZWRpdG9yQ29udGVudFJlZiA9IF9fcnVuSW5pdGlhbGl6ZXJzNjModGhpcywgX3NlbGVjdGVkVGV4dF9leHRyYUluaXRpYWxpemVycyk7CiAgICBpc0NvbXBvc2luZyA9IGZhbHNlOwogICAgLy8gSGFuZGxlciBpbnN0YW5jZXMKICAgIGJsb2NrT3BlcmF0aW9uczsKICAgIGlucHV0SGFuZGxlcjsKICAgIGtleWJvYXJkSGFuZGxlcjsKICAgIGRyYWdEcm9wSGFuZGxlcjsKICAgIGhpc3Rvcnk7CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIC4uLkRlZXNJbnB1dEJhc2UuYmFzZVN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICB3eXNpd3lnU3R5bGVzCiAgICBdOwogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zID0gbmV3IFd5c2l3eWdCbG9ja09wZXJhdGlvbnModGhpcyk7CiAgICAgIHRoaXMuaW5wdXRIYW5kbGVyID0gbmV3IFd5c2l3eWdJbnB1dEhhbmRsZXIodGhpcyk7CiAgICAgIHRoaXMua2V5Ym9hcmRIYW5kbGVyID0gbmV3IFd5c2l3eWdLZXlib2FyZEhhbmRsZXIodGhpcyk7CiAgICAgIHRoaXMuZHJhZ0Ryb3BIYW5kbGVyID0gbmV3IFd5c2l3eWdEcmFnRHJvcEhhbmRsZXIodGhpcyk7CiAgICAgIHRoaXMuaGlzdG9yeSA9IG5ldyBXeXNpd3lnSGlzdG9yeSgpOwogICAgfQogICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgdGhpcy5pbnB1dEhhbmRsZXI/LmRlc3Ryb3koKTsKICAgICAgaWYgKHRoaXMuYmx1clRpbWVvdXQpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ibHVyVGltZW91dCk7CiAgICAgICAgdGhpcy5ibHVyVGltZW91dCA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZCgpIHsKICAgICAgaWYgKHRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZS50cmltKCkubGVuZ3RoID4gMCkgewogICAgICAgIGNvbnN0IHBhcnNlZEJsb2NrcyA9IHRoaXMub3V0cHV0Rm9ybWF0ID09PSAiaHRtbCIgPyBXeXNpd3lnQ29udmVydGVycy5wYXJzZUh0bWxUb0Jsb2Nrcyh0aGlzLnZhbHVlKSA6IFd5c2l3eWdDb252ZXJ0ZXJzLnBhcnNlTWFya2Rvd25Ub0Jsb2Nrcyh0aGlzLnZhbHVlKTsKICAgICAgICBpZiAocGFyc2VkQmxvY2tzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMuYmxvY2tzID0gcGFyc2VkQmxvY2tzOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLnVwZGF0ZVZhbHVlKCk7CiAgICAgIHRoaXMuZWRpdG9yQ29udGVudFJlZiA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuZWRpdG9yLWNvbnRlbnQiKTsKICAgICAgaWYgKHRoaXMuZWRpdG9yQ29udGVudFJlZikgewogICAgICAgIHRoaXMuZWRpdG9yQ29udGVudFJlZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIChlMTEpID0+IHRoaXMuaGFuZGxlRWRpdG9yQ2xpY2soZTExKSk7CiAgICAgIH0KICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCJibG9jay10ZXh0LXNlbGVjdGVkIiwgKGUxMSkgPT4gewogICAgICAgIGlmICghdGhpcy5zbGFzaE1lbnUudmlzaWJsZSAmJiBlMTEuZGV0YWlsLmhhc1NlbGVjdGlvbiAmJiBlMTEuZGV0YWlsLnRleHQubGVuZ3RoID4gMCkgewogICAgICAgICAgdGhpcy5zZWxlY3RlZFRleHQgPSBlMTEuZGV0YWlsLnRleHQ7CiAgICAgICAgICBpZiAoZTExLmRldGFpbC5yZWN0KSB7CiAgICAgICAgICAgIGNvbnN0IGNvb3JkcyA9IHsKICAgICAgICAgICAgICB4OiBlMTEuZGV0YWlsLnJlY3QubGVmdCArIGUxMS5kZXRhaWwucmVjdC53aWR0aCAvIDIsCiAgICAgICAgICAgICAgeTogTWF0aC5tYXgoNDUsIGUxMS5kZXRhaWwucmVjdC50b3AgLSA0NSkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5mb3JtYXR0aW5nTWVudS5zaG93KGNvb3JkcywgYXN5bmMgKGNvbW1hbmQpID0+IGF3YWl0IHRoaXMuYXBwbHlGb3JtYXQoY29tbWFuZCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsIChlMTEpID0+IHsKICAgICAgICBjb25zdCBmb3JtYXR0aW5nTWVudUVsZW1lbnQgPSB0aGlzLmZvcm1hdHRpbmdNZW51LnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5mb3JtYXR0aW5nLW1lbnUiKTsKICAgICAgICBpZiAoZm9ybWF0dGluZ01lbnVFbGVtZW50ICYmIGZvcm1hdHRpbmdNZW51RWxlbWVudC5jb250YWlucyhlMTEudGFyZ2V0KSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24udG9TdHJpbmcoKS50cmltKCkubGVuZ3RoID4gMCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5mb3JtYXR0aW5nTWVudS52aXNpYmxlKSB7CiAgICAgICAgICB0aGlzLmhpZGVGb3JtYXR0aW5nTWVudSgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIChlMTEpID0+IHsKICAgICAgICBjb25zdCB0YXJnZXQgPSBlMTEudGFyZ2V0OwogICAgICAgIGlmICghdGhpcy5jb250YWlucyh0YXJnZXQpICYmICF0aGlzLnNoYWRvd1Jvb3Q/LmNvbnRhaW5zKHRhcmdldCkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKChlMTEubWV0YUtleSB8fCBlMTEuY3RybEtleSkgJiYgIWUxMS5zaGlmdEtleSAmJiBlMTEua2V5ID09PSAieiIpIHsKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgdGhpcy51bmRvKCk7CiAgICAgICAgfSBlbHNlIGlmICgoZTExLm1ldGFLZXkgfHwgZTExLmN0cmxLZXkpICYmIGUxMS5zaGlmdEtleSAmJiBlMTEua2V5ID09PSAieiIpIHsKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgdGhpcy5yZWRvKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdGhpcy5oaXN0b3J5LnNhdmVTdGF0ZSh0aGlzLmJsb2NrcywgdGhpcy5zZWxlY3RlZEJsb2NrSWQpOwogICAgICB0aGlzLnJlbmRlckJsb2Nrc1Byb2dyYW1tYXRpY2FsbHkoKTsKICAgIH0KICAgIC8qKgogICAgICogUmVuZGVycyBhbGwgYmxvY2tzIHByb2dyYW1tYXRpY2FsbHkgd2l0aG91dCB0cmlnZ2VyaW5nIHJlLXJlbmRlcnMKICAgICAqLwogICAgcmVuZGVyQmxvY2tzUHJvZ3JhbW1hdGljYWxseSgpIHsKICAgICAgaWYgKCF0aGlzLmVkaXRvckNvbnRlbnRSZWYpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLmVkaXRvckNvbnRlbnRSZWYuaW5uZXJIVE1MID0gIiI7CiAgICAgIHRoaXMuYmxvY2tzLmZvckVhY2goKGJsb2NrKSA9PiB7CiAgICAgICAgY29uc3QgYmxvY2tXcmFwcGVyID0gdGhpcy5jcmVhdGVCbG9ja0VsZW1lbnQoYmxvY2spOwogICAgICAgIHRoaXMuZWRpdG9yQ29udGVudFJlZi5hcHBlbmRDaGlsZChibG9ja1dyYXBwZXIpOwogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGJsb2NrIGVsZW1lbnQgcHJvZ3JhbW1hdGljYWxseQogICAgICovCiAgICBjcmVhdGVCbG9ja0VsZW1lbnQoYmxvY2spIHsKICAgICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICB3cmFwcGVyLmNsYXNzTmFtZSA9ICJibG9jay13cmFwcGVyIjsKICAgICAgd3JhcHBlci5zZXRBdHRyaWJ1dGUoImRhdGEtYmxvY2staWQiLCBibG9jay5pZCk7CiAgICAgIGlmIChibG9jay50eXBlICE9PSAiZGl2aWRlciIpIHsKICAgICAgICBjb25zdCBkcmFnSGFuZGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgZHJhZ0hhbmRsZS5jbGFzc05hbWUgPSAiZHJhZy1oYW5kbGUiOwogICAgICAgIGRyYWdIYW5kbGUuZHJhZ2dhYmxlID0gdHJ1ZTsKICAgICAgICBkcmFnSGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdzdGFydCIsIChlMTEpID0+IHRoaXMuZHJhZ0Ryb3BIYW5kbGVyLmhhbmRsZURyYWdTdGFydChlMTEsIGJsb2NrKSk7CiAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChkcmFnSGFuZGxlKTsKICAgICAgfQogICAgICBjb25zdCBibG9ja0NvbXBvbmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgICBibG9ja0NvbXBvbmVudC5ibG9jayA9IGJsb2NrOwogICAgICBibG9ja0NvbXBvbmVudC5pc1NlbGVjdGVkID0gdGhpcy5zZWxlY3RlZEJsb2NrSWQgPT09IGJsb2NrLmlkOwogICAgICBibG9ja0NvbXBvbmVudC53eXNpd3lnQ29tcG9uZW50ID0gdGhpczsKICAgICAgYmxvY2tDb21wb25lbnQuaGFuZGxlcnMgPSB7CiAgICAgICAgb25JbnB1dDogKGUxMSkgPT4gdGhpcy5pbnB1dEhhbmRsZXIuaGFuZGxlQmxvY2tJbnB1dChlMTEsIGJsb2NrKSwKICAgICAgICBvbktleURvd246IChlMTEpID0+IHRoaXMua2V5Ym9hcmRIYW5kbGVyLmhhbmRsZUJsb2NrS2V5RG93bihlMTEsIGJsb2NrKSwKICAgICAgICBvbkZvY3VzOiAoKSA9PiB0aGlzLmhhbmRsZUJsb2NrRm9jdXMoYmxvY2spLAogICAgICAgIG9uQmx1cjogKCkgPT4gdGhpcy5oYW5kbGVCbG9ja0JsdXIoYmxvY2spLAogICAgICAgIG9uQ29tcG9zaXRpb25TdGFydDogKCkgPT4gdGhpcy5pc0NvbXBvc2luZyA9IHRydWUsCiAgICAgICAgb25Db21wb3NpdGlvbkVuZDogKCkgPT4gdGhpcy5pc0NvbXBvc2luZyA9IGZhbHNlLAogICAgICAgIG9uTW91c2VVcDogKGUxMSkgPT4gdGhpcy5oYW5kbGVUZXh0U2VsZWN0aW9uKGUxMSksCiAgICAgICAgb25SZXF1ZXN0VXBkYXRlOiAoKSA9PiB0aGlzLnVwZGF0ZUJsb2NrRWxlbWVudChibG9jay5pZCkKICAgICAgfTsKICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChibG9ja0NvbXBvbmVudCk7CiAgICAgIHdyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcigiZHJhZ292ZXIiLCAoZTExKSA9PiB0aGlzLmRyYWdEcm9wSGFuZGxlci5oYW5kbGVEcmFnT3ZlcihlMTEsIGJsb2NrKSk7CiAgICAgIHdyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcigiZHJvcCIsIChlMTEpID0+IHRoaXMuZHJhZ0Ryb3BIYW5kbGVyLmhhbmRsZURyb3AoZTExLCBibG9jaykpOwogICAgICB3cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdsZWF2ZSIsICgpID0+IHRoaXMuZHJhZ0Ryb3BIYW5kbGVyLmhhbmRsZURyYWdMZWF2ZShibG9jaykpOwogICAgICByZXR1cm4gd3JhcHBlcjsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlcyBhIHNwZWNpZmljIGJsb2NrIGVsZW1lbnQKICAgICAqLwogICAgdXBkYXRlQmxvY2tFbGVtZW50KGJsb2NrSWQpIHsKICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLmJsb2Nrcy5maW5kKChiNSkgPT4gYjUuaWQgPT09IGJsb2NrSWQpOwogICAgICBpZiAoIWJsb2NrKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuZWRpdG9yQ29udGVudFJlZi5xdWVyeVNlbGVjdG9yKGBbZGF0YS1ibG9jay1pZD0iJHtibG9ja0lkfSJdYCk7CiAgICAgIGlmICghd3JhcHBlcikKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IG5ld1dyYXBwZXIgPSB0aGlzLmNyZWF0ZUJsb2NrRWxlbWVudChibG9jayk7CiAgICAgIHdyYXBwZXIucmVwbGFjZVdpdGgobmV3V3JhcHBlcik7CiAgICB9CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiB1M2AKICAgICAgPGRlZXMtbGFiZWwKICAgICAgICAubGFiZWw9IiR7dGhpcy5sYWJlbH0iCiAgICAgICAgLmRlc2NyaXB0aW9uPSIke3RoaXMuZGVzY3JpcHRpb259IgogICAgICAgIC5yZXF1aXJlZD0iJHt0aGlzLnJlcXVpcmVkfSIKICAgICAgPjwvZGVlcy1sYWJlbD4KICAgICAgPGRpdiBjbGFzcz0id3lzaXd5Zy1jb250YWluZXIiPgogICAgICAgIDxkaXYgCiAgICAgICAgICBjbGFzcz0iZWRpdG9yLWNvbnRlbnQgJHt0aGlzLmRyYWdnZWRCbG9ja0lkID8gImRyYWdnaW5nIiA6ICIifSIKICAgICAgICAgIGlkPSJlZGl0b3ItY29udGVudCIKICAgICAgICA+CiAgICAgICAgICA8IS0tIEJsb2NrcyB3aWxsIGJlIHJlbmRlcmVkIHByb2dyYW1tYXRpY2FsbHkgLS0+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIC8vIE9sZCByZW5kZXJCbG9jayBtZXRob2QgcmVtb3ZlZCAtIHVzaW5nIHByb2dyYW1tYXRpYyByZW5kZXJpbmcgaW5zdGVhZAogICAgaGFuZGxlU2xhc2hNZW51S2V5Ym9hcmQoZTExKSB7CiAgICAgIHN3aXRjaCAoZTExLmtleSkgewogICAgICAgIGNhc2UgIkFycm93RG93biI6CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuc2xhc2hNZW51Lm5hdmlnYXRlKCJkb3duIik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJBcnJvd1VwIjoKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgdGhpcy5zbGFzaE1lbnUubmF2aWdhdGUoInVwIik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJFbnRlciI6CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuc2xhc2hNZW51LnNlbGVjdEN1cnJlbnQoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkVzY2FwZSI6CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuY2xvc2VTbGFzaE1lbnUodHJ1ZSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgY2xvc2VTbGFzaE1lbnUoY2xlYXJTbGFzaCA9IGZhbHNlKSB7CiAgICAgIGlmIChjbGVhclNsYXNoICYmIHRoaXMuc2VsZWN0ZWRCbG9ja0lkKSB7CiAgICAgICAgY29uc3QgY3VycmVudEJsb2NrID0gdGhpcy5ibG9ja3MuZmluZCgoYjUpID0+IGI1LmlkID09PSB0aGlzLnNlbGVjdGVkQmxvY2tJZCk7CiAgICAgICAgaWYgKGN1cnJlbnRCbG9jaykgewogICAgICAgICAgY29uc3Qgd3JhcHBlckVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihgW2RhdGEtYmxvY2staWQ9IiR7Y3VycmVudEJsb2NrLmlkfSJdYCk7CiAgICAgICAgICBjb25zdCBibG9ja0NvbXBvbmVudCA9IHdyYXBwZXJFbGVtZW50Py5xdWVyeVNlbGVjdG9yKCJkZWVzLXd5c2l3eWctYmxvY2siKTsKICAgICAgICAgIGlmIChibG9ja0NvbXBvbmVudCkgewogICAgICAgICAgICBjb25zdCBjb250ZW50MyA9IGJsb2NrQ29tcG9uZW50LmdldENvbnRlbnQoKTsKICAgICAgICAgICAgaWYgKGNvbnRlbnQzLnN0YXJ0c1dpdGgoIi8iKSkgewogICAgICAgICAgICAgIGNvbnN0IGNsZWFuQ29udGVudCA9IGNvbnRlbnQzLnJlcGxhY2UoL15cL1teXHNdKlxzKi8sICIiKS50cmltKCk7CiAgICAgICAgICAgICAgYmxvY2tDb21wb25lbnQuc2V0Q29udGVudChjbGVhbkNvbnRlbnQpOwogICAgICAgICAgICAgIGN1cnJlbnRCbG9jay5jb250ZW50ID0gY2xlYW5Db250ZW50OwogICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICAgICAgICBibG9ja0NvbXBvbmVudC5mb2N1c1dpdGhDdXJzb3IoMCk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5zbGFzaE1lbnUuaGlkZSgpOwogICAgfQogICAgaGFuZGxlQmxvY2tGb2N1cyhibG9jaykgewogICAgICBpZiAodGhpcy5ibHVyVGltZW91dCkgewogICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmJsdXJUaW1lb3V0KTsKICAgICAgICB0aGlzLmJsdXJUaW1lb3V0ID0gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBwcmV2U2VsZWN0ZWRJZCA9IHRoaXMuc2VsZWN0ZWRCbG9ja0lkOwogICAgICB0aGlzLnNlbGVjdGVkQmxvY2tJZCA9IGJsb2NrLmlkOwogICAgICBpZiAocHJldlNlbGVjdGVkSWQgIT09IGJsb2NrLmlkKSB7CiAgICAgICAgaWYgKHByZXZTZWxlY3RlZElkKSB7CiAgICAgICAgICBjb25zdCBwcmV2V3JhcHBlciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihgW2RhdGEtYmxvY2staWQ9IiR7cHJldlNlbGVjdGVkSWR9Il1gKTsKICAgICAgICAgIGNvbnN0IHByZXZCbG9ja0NvbXBvbmVudCA9IHByZXZXcmFwcGVyPy5xdWVyeVNlbGVjdG9yKCJkZWVzLXd5c2l3eWctYmxvY2siKTsKICAgICAgICAgIGlmIChwcmV2QmxvY2tDb21wb25lbnQpIHsKICAgICAgICAgICAgcHJldkJsb2NrQ29tcG9uZW50LmlzU2VsZWN0ZWQgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihgW2RhdGEtYmxvY2staWQ9IiR7YmxvY2suaWR9Il1gKTsKICAgICAgICBjb25zdCBibG9ja0NvbXBvbmVudCA9IHdyYXBwZXI/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgICAgIGlmIChibG9ja0NvbXBvbmVudCkgewogICAgICAgICAgYmxvY2tDb21wb25lbnQuaXNTZWxlY3RlZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBibHVyVGltZW91dCA9IG51bGw7CiAgICBoYW5kbGVCbG9ja0JsdXIoYmxvY2spIHsKICAgICAgaWYgKHRoaXMuYmx1clRpbWVvdXQpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ibHVyVGltZW91dCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuc2xhc2hNZW51LnZpc2libGUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgd3JhcHBlckVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke2Jsb2NrLmlkfSJdYCk7CiAgICAgIGNvbnN0IGJsb2NrQ29tcG9uZW50ID0gd3JhcHBlckVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgICBpZiAoYmxvY2tDb21wb25lbnQgJiYgYmxvY2tDb21wb25lbnQuZ2V0Q29udGVudCkgewogICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBibG9ja0NvbXBvbmVudC5nZXRDb250ZW50KCk7CiAgICAgICAgaWYgKGJsb2NrLmNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHsKICAgICAgICAgIGJsb2NrLmNvbnRlbnQgPSBuZXdDb250ZW50OwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLmJsdXJUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8uYWN0aXZlRWxlbWVudDsKICAgICAgICBjb25zdCBpc0Jsb2NrRm9jdXNlZCA9IGFjdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucygiYmxvY2siKTsKICAgICAgICBpZiAoIWlzQmxvY2tGb2N1c2VkKSB7CiAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKCk7CiAgICAgICAgfQogICAgICB9LCAxMDApOwogICAgfQogICAgaGFuZGxlRWRpdG9yQ2xpY2soZTExKSB7CiAgICAgIGNvbnN0IHRhcmdldCA9IGUxMS50YXJnZXQ7CiAgICAgIGlmICh0aGlzLnNsYXNoTWVudS52aXNpYmxlKSB7CiAgICAgICAgdGhpcy5jbG9zZVNsYXNoTWVudSh0cnVlKTsKICAgICAgfQogICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygiZWRpdG9yLWNvbnRlbnQiKSkgewogICAgICAgIGNvbnN0IGxhc3RCbG9jayA9IHRoaXMuYmxvY2tzW3RoaXMuYmxvY2tzLmxlbmd0aCAtIDFdOwogICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zLmZvY3VzQmxvY2sobGFzdEJsb2NrLmlkLCBsYXN0QmxvY2sudHlwZSA9PT0gImRpdmlkZXIiIHx8IGxhc3RCbG9jay50eXBlID09PSAiaW1hZ2UiID8gdm9pZCAwIDogImVuZCIpOwogICAgICB9CiAgICB9CiAgICBjcmVhdGVOZXdCbG9jayh0eXBlNSA9ICJwYXJhZ3JhcGgiLCBjb250ZW50MyA9ICIiLCBtZXRhZGF0YSkgewogICAgICByZXR1cm4gewogICAgICAgIGlkOiBXeXNpd3lnU2hvcnRjdXRzLmdlbmVyYXRlQmxvY2tJZCgpLAogICAgICAgIHR5cGU6IHR5cGU1LAogICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQzLAogICAgICAgIC4uLm1ldGFkYXRhICYmIHsgbWV0YWRhdGEgfQogICAgICB9OwogICAgfQogICAgYXN5bmMgaW5zZXJ0QmxvY2tBZnRlcihhZnRlckJsb2NrLCBuZXdCbG9jaywgZm9jdXNOZXdCbG9jayA9IHRydWUpIHsKICAgICAgY29uc3QgYmxvY2tJbmRleCA9IHRoaXMuYmxvY2tzLmZpbmRJbmRleCgoYjUpID0+IGI1LmlkID09PSBhZnRlckJsb2NrLmlkKTsKICAgICAgdGhpcy5ibG9ja3MgPSBbLi4udGhpcy5ibG9ja3Muc2xpY2UoMCwgYmxvY2tJbmRleCArIDEpLCBuZXdCbG9jaywgLi4udGhpcy5ibG9ja3Muc2xpY2UoYmxvY2tJbmRleCArIDEpXTsKICAgICAgY29uc3QgYWZ0ZXJXcmFwcGVyID0gdGhpcy5lZGl0b3JDb250ZW50UmVmLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke2FmdGVyQmxvY2suaWR9Il1gKTsKICAgICAgaWYgKGFmdGVyV3JhcHBlcikgewogICAgICAgIGNvbnN0IG5ld1dyYXBwZXIgPSB0aGlzLmNyZWF0ZUJsb2NrRWxlbWVudChuZXdCbG9jayk7CiAgICAgICAgYWZ0ZXJXcmFwcGVyLmluc2VydEFkamFjZW50RWxlbWVudCgiYWZ0ZXJlbmQiLCBuZXdXcmFwcGVyKTsKICAgICAgfQogICAgICB0aGlzLnVwZGF0ZVZhbHVlKCk7CiAgICAgIGlmIChmb2N1c05ld0Jsb2NrICYmIG5ld0Jsb2NrLnR5cGUgIT09ICJkaXZpZGVyIikgewogICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlMikgPT4gc2V0VGltZW91dChyZXNvbHZlMiwgMCkpOwogICAgICAgIGF3YWl0IHRoaXMuYmxvY2tPcGVyYXRpb25zLmZvY3VzQmxvY2sobmV3QmxvY2suaWQsICJzdGFydCIpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBpbnNlcnRCbG9jayh0eXBlNSkgewogICAgICBjb25zdCBjdXJyZW50QmxvY2sgPSB0aGlzLmJsb2Nrcy5maW5kKChiNSkgPT4gYjUuaWQgPT09IHRoaXMuc2VsZWN0ZWRCbG9ja0lkKTsKICAgICAgaWYgKCFjdXJyZW50QmxvY2spIHsKICAgICAgICB0aGlzLmNsb3NlU2xhc2hNZW51KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHdyYXBwZXJFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke2N1cnJlbnRCbG9jay5pZH0iXWApOwogICAgICBjb25zdCBibG9ja0NvbXBvbmVudCA9IHdyYXBwZXJFbGVtZW50Py5xdWVyeVNlbGVjdG9yKCJkZWVzLXd5c2l3eWctYmxvY2siKTsKICAgICAgaWYgKGJsb2NrQ29tcG9uZW50KSB7CiAgICAgICAgY29uc3QgY29udGVudDMgPSBibG9ja0NvbXBvbmVudC5nZXRDb250ZW50KCk7CiAgICAgICAgaWYgKGNvbnRlbnQzLnN0YXJ0c1dpdGgoIi8iKSkgewogICAgICAgICAgY29uc3QgY2xlYW5Db250ZW50ID0gY29udGVudDMucmVwbGFjZSgvXlwvW15cc10qXHMqLywgIiIpLnRyaW0oKTsKICAgICAgICAgIGJsb2NrQ29tcG9uZW50LnNldENvbnRlbnQoY2xlYW5Db250ZW50KTsKICAgICAgICAgIGN1cnJlbnRCbG9jay5jb250ZW50ID0gY2xlYW5Db250ZW50OwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLmNsb3NlU2xhc2hNZW51KGZhbHNlKTsKICAgICAgaWYgKHR5cGU1ID09PSAiY29kZSIpIHsKICAgICAgICBjdXJyZW50QmxvY2subWV0YWRhdGEgPSB7IGxhbmd1YWdlOiAidHlwZXNjcmlwdCIgfTsKICAgICAgfQogICAgICBjdXJyZW50QmxvY2sudHlwZSA9IHR5cGU1OwogICAgICBjdXJyZW50QmxvY2suY29udGVudCA9IGN1cnJlbnRCbG9jay5jb250ZW50IHx8ICIiOwogICAgICBpZiAodHlwZTUgPT09ICJkaXZpZGVyIikgewogICAgICAgIGN1cnJlbnRCbG9jay5jb250ZW50ID0gIiAiOwogICAgICAgIGNvbnN0IG5ld0Jsb2NrID0gdGhpcy5jcmVhdGVOZXdCbG9jaygpOwogICAgICAgIHRoaXMuaW5zZXJ0QmxvY2tBZnRlcihjdXJyZW50QmxvY2ssIG5ld0Jsb2NrKTsKICAgICAgfSBlbHNlIGlmICh0eXBlNSA9PT0gImxpc3QiKSB7CiAgICAgICAgY3VycmVudEJsb2NrLm1ldGFkYXRhID0geyBsaXN0VHlwZTogImJ1bGxldCIgfTsKICAgICAgICBjdXJyZW50QmxvY2suY29udGVudCA9ICIiOwogICAgICB9IGVsc2UgaWYgKHR5cGU1ID09PSAiaW1hZ2UiKSB7CiAgICAgICAgY3VycmVudEJsb2NrLmNvbnRlbnQgPSAiIjsKICAgICAgICBjdXJyZW50QmxvY2subWV0YWRhdGEgPSB7IHVybDogIiIsIGxvYWRpbmc6IGZhbHNlIH07CiAgICAgIH0gZWxzZSBpZiAodHlwZTUgPT09ICJ5b3V0dWJlIikgewogICAgICAgIGN1cnJlbnRCbG9jay5jb250ZW50ID0gIiI7CiAgICAgICAgY3VycmVudEJsb2NrLm1ldGFkYXRhID0geyB2aWRlb0lkOiAiIiwgdXJsOiAiIiB9OwogICAgICB9IGVsc2UgaWYgKHR5cGU1ID09PSAibWFya2Rvd24iKSB7CiAgICAgICAgY3VycmVudEJsb2NrLm1ldGFkYXRhID0geyBzaG93UHJldmlldzogZmFsc2UgfTsKICAgICAgfSBlbHNlIGlmICh0eXBlNSA9PT0gImh0bWwiKSB7CiAgICAgICAgY3VycmVudEJsb2NrLm1ldGFkYXRhID0geyBzaG93UHJldmlldzogZmFsc2UgfTsKICAgICAgfSBlbHNlIGlmICh0eXBlNSA9PT0gImF0dGFjaG1lbnQiKSB7CiAgICAgICAgY3VycmVudEJsb2NrLmNvbnRlbnQgPSAiIjsKICAgICAgICBjdXJyZW50QmxvY2subWV0YWRhdGEgPSB7IGZpbGVzOiBbXSB9OwogICAgICB9IGVsc2UgewogICAgICAgIGN1cnJlbnRCbG9jay5jb250ZW50ID0gY3VycmVudEJsb2NrLmNvbnRlbnQgfHwgIiI7CiAgICAgIH0KICAgICAgdGhpcy51cGRhdGVCbG9ja0VsZW1lbnQoY3VycmVudEJsb2NrLmlkKTsKICAgICAgdGhpcy51cGRhdGVWYWx1ZSgpOwogICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHNldFRpbWVvdXQocmVzb2x2ZTIsIDApKTsKICAgICAgaWYgKHR5cGU1ID09PSAibGlzdCIpIHsKICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9ucy5mb2N1c0Jsb2NrKGN1cnJlbnRCbG9jay5pZCwgInN0YXJ0Iik7CiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICAgIGNvbnN0IGJsb2NrV3JhcHBlciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihgW2RhdGEtYmxvY2staWQ9IiR7Y3VycmVudEJsb2NrLmlkfSJdYCk7CiAgICAgICAgICBjb25zdCBibG9ja0NvbXBvbmVudDIgPSBibG9ja1dyYXBwZXI/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgICAgICAgaWYgKGJsb2NrQ29tcG9uZW50MikgewogICAgICAgICAgICBibG9ja0NvbXBvbmVudDIuZm9jdXNMaXN0SXRlbSgpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKHR5cGU1ICE9PSAiZGl2aWRlciIgJiYgdHlwZTUgIT09ICJpbWFnZSIgJiYgdHlwZTUgIT09ICJ5b3V0dWJlIiAmJiB0eXBlNSAhPT0gIm1hcmtkb3duIiAmJiB0eXBlNSAhPT0gImh0bWwiICYmIHR5cGU1ICE9PSAiYXR0YWNobWVudCIpIHsKICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9ucy5mb2N1c0Jsb2NrKGN1cnJlbnRCbG9jay5pZCwgInN0YXJ0Iik7CiAgICAgIH0gZWxzZSBpZiAodHlwZTUgPT09ICJpbWFnZSIgfHwgdHlwZTUgPT09ICJ5b3V0dWJlIiB8fCB0eXBlNSA9PT0gIm1hcmtkb3duIiB8fCB0eXBlNSA9PT0gImh0bWwiIHx8IHR5cGU1ID09PSAiYXR0YWNobWVudCIpIHsKICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9ucy5mb2N1c0Jsb2NrKGN1cnJlbnRCbG9jay5pZCk7CiAgICAgIH0KICAgIH0KICAgIHVwZGF0ZVZhbHVlKCkgewogICAgICBpZiAodGhpcy5vdXRwdXRGb3JtYXQgPT09ICJodG1sIikgewogICAgICAgIHRoaXMudmFsdWUgPSBXeXNpd3lnQ29udmVydGVycy5nZXRIdG1sT3V0cHV0KHRoaXMuYmxvY2tzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnZhbHVlID0gV3lzaXd5Z0NvbnZlcnRlcnMuZ2V0TWFya2Rvd25PdXRwdXQodGhpcy5ibG9ja3MpOwogICAgICB9CiAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMudmFsdWUpOwogICAgICB0aGlzLnNhdmVUb0hpc3RvcnkodHJ1ZSk7CiAgICB9CiAgICBnZXRWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMudmFsdWU7CiAgICB9CiAgICBzZXRWYWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlMjsKICAgICAgaWYgKHRoaXMub3V0cHV0Rm9ybWF0ID09PSAiaHRtbCIpIHsKICAgICAgICB0aGlzLmJsb2NrcyA9IFd5c2l3eWdDb252ZXJ0ZXJzLnBhcnNlSHRtbFRvQmxvY2tzKHZhbHVlMik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5ibG9ja3MgPSBXeXNpd3lnQ29udmVydGVycy5wYXJzZU1hcmtkb3duVG9CbG9ja3ModmFsdWUyKTsKICAgICAgfQogICAgICBpZiAodGhpcy5ibG9ja3MubGVuZ3RoID09PSAwKSB7CiAgICAgICAgdGhpcy5ibG9ja3MgPSBbewogICAgICAgICAgaWQ6IFd5c2l3eWdTaG9ydGN1dHMuZ2VuZXJhdGVCbG9ja0lkKCksCiAgICAgICAgICB0eXBlOiAicGFyYWdyYXBoIiwKICAgICAgICAgIGNvbnRlbnQ6ICIiCiAgICAgICAgfV07CiAgICAgIH0KICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcy52YWx1ZSk7CiAgICAgIGlmICh0aGlzLmVkaXRvckNvbnRlbnRSZWYpIHsKICAgICAgICB0aGlzLnJlbmRlckJsb2Nrc1Byb2dyYW1tYXRpY2FsbHkoKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBFeHBvcnQgdGhlIGVkaXRvciBjb250ZW50IGFzIHJhdyBibG9ja3MgKGxvc3NsZXNzKQogICAgICovCiAgICBleHBvcnRCbG9ja3MoKSB7CiAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuYmxvY2tzKSk7CiAgICB9CiAgICAvKioKICAgICAqIEltcG9ydCByYXcgYmxvY2tzIChsb3NzbGVzcykKICAgICAqLwogICAgaW1wb3J0QmxvY2tzKGJsb2NrcykgewogICAgICB0aGlzLmJsb2NrcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYmxvY2tzKSk7CiAgICAgIHRoaXMudXBkYXRlVmFsdWUoKTsKICAgICAgaWYgKHRoaXMuZWRpdG9yQ29udGVudFJlZikgewogICAgICAgIHRoaXMucmVuZGVyQmxvY2tzUHJvZ3JhbW1hdGljYWxseSgpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEV4cG9ydCBjb250ZW50IGFzIEhUTUwgcmVnYXJkbGVzcyBvZiBvdXRwdXRGb3JtYXQgc2V0dGluZwogICAgICovCiAgICBleHBvcnRBc0h0bWwoKSB7CiAgICAgIHJldHVybiBXeXNpd3lnQ29udmVydGVycy5nZXRIdG1sT3V0cHV0KHRoaXMuYmxvY2tzKTsKICAgIH0KICAgIC8qKgogICAgICogRXhwb3J0IGNvbnRlbnQgYXMgTWFya2Rvd24gcmVnYXJkbGVzcyBvZiBvdXRwdXRGb3JtYXQgc2V0dGluZwogICAgICovCiAgICBleHBvcnRBc01hcmtkb3duKCkgewogICAgICByZXR1cm4gV3lzaXd5Z0NvbnZlcnRlcnMuZ2V0TWFya2Rvd25PdXRwdXQodGhpcy5ibG9ja3MpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlZGl0b3Igc3RhdGUgKGZvciBzYXZpbmcpCiAgICAgKi8KICAgIGV4cG9ydFN0YXRlKCkgewogICAgICByZXR1cm4gewogICAgICAgIGJsb2NrczogdGhpcy5leHBvcnRCbG9ja3MoKSwKICAgICAgICBvdXRwdXRGb3JtYXQ6IHRoaXMub3V0cHV0Rm9ybWF0CiAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIFJlc3RvcmUgZWRpdG9yIHN0YXRlIGZyb20gSlNPTgogICAgICovCiAgICBpbXBvcnRTdGF0ZShzdGF0ZTEwKSB7CiAgICAgIGlmIChzdGF0ZTEwLm91dHB1dEZvcm1hdCkgewogICAgICAgIHRoaXMub3V0cHV0Rm9ybWF0ID0gc3RhdGUxMC5vdXRwdXRGb3JtYXQ7CiAgICAgIH0KICAgICAgdGhpcy5pbXBvcnRCbG9ja3Moc3RhdGUxMC5ibG9ja3MpOwogICAgfQogICAgaGFuZGxlRHJhZ0VuZCgpIHsKICAgICAgaWYgKHRoaXMuZHJhZ2dlZEJsb2NrSWQpIHsKICAgICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5lZGl0b3JDb250ZW50UmVmLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke3RoaXMuZHJhZ2dlZEJsb2NrSWR9Il1gKTsKICAgICAgICBpZiAod3JhcHBlcikgewogICAgICAgICAgd3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnZ2luZyIpOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBhbGxXcmFwcGVycyA9IHRoaXMuZWRpdG9yQ29udGVudFJlZi5xdWVyeVNlbGVjdG9yQWxsKCIuYmxvY2std3JhcHBlciIpOwogICAgICBhbGxXcmFwcGVycy5mb3JFYWNoKCh3cmFwcGVyKSA9PiB7CiAgICAgICAgd3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnLW92ZXItYmVmb3JlIiwgImRyYWctb3Zlci1hZnRlciIpOwogICAgICB9KTsKICAgICAgdGhpcy5lZGl0b3JDb250ZW50UmVmLmNsYXNzTGlzdC5yZW1vdmUoImRyYWdnaW5nIik7CiAgICAgIHRoaXMuZHJhZ2dlZEJsb2NrSWQgPSBudWxsOwogICAgICB0aGlzLmRyYWdPdmVyQmxvY2tJZCA9IG51bGw7CiAgICAgIHRoaXMuZHJhZ092ZXJQb3NpdGlvbiA9IG51bGw7CiAgICB9CiAgICBoYW5kbGVEcm9wKGUxMSwgdGFyZ2V0QmxvY2spIHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGlmICghdGhpcy5kcmFnZ2VkQmxvY2tJZCB8fCB0aGlzLmRyYWdnZWRCbG9ja0lkID09PSB0YXJnZXRCbG9jay5pZCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGRyYWdnZWRJbmRleCA9IHRoaXMuYmxvY2tzLmZpbmRJbmRleCgoYjUpID0+IGI1LmlkID09PSB0aGlzLmRyYWdnZWRCbG9ja0lkKTsKICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSB0aGlzLmJsb2Nrcy5maW5kSW5kZXgoKGI1KSA9PiBiNS5pZCA9PT0gdGFyZ2V0QmxvY2suaWQpOwogICAgICBpZiAoZHJhZ2dlZEluZGV4ID09PSAtMSB8fCB0YXJnZXRJbmRleCA9PT0gLTEpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBbZHJhZ2dlZEJsb2NrXSA9IHRoaXMuYmxvY2tzLnNwbGljZShkcmFnZ2VkSW5kZXgsIDEpOwogICAgICBsZXQgbmV3SW5kZXggPSB0YXJnZXRJbmRleDsKICAgICAgaWYgKHRoaXMuZHJhZ092ZXJQb3NpdGlvbiA9PT0gImFmdGVyIikgewogICAgICAgIG5ld0luZGV4ID0gZHJhZ2dlZEluZGV4IDwgdGFyZ2V0SW5kZXggPyB0YXJnZXRJbmRleCA6IHRhcmdldEluZGV4ICsgMTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuZXdJbmRleCA9IGRyYWdnZWRJbmRleCA8IHRhcmdldEluZGV4ID8gdGFyZ2V0SW5kZXggLSAxIDogdGFyZ2V0SW5kZXg7CiAgICAgIH0KICAgICAgdGhpcy5ibG9ja3Muc3BsaWNlKG5ld0luZGV4LCAwLCBkcmFnZ2VkQmxvY2spOwogICAgICB0aGlzLnJlbmRlckJsb2Nrc1Byb2dyYW1tYXRpY2FsbHkoKTsKICAgICAgdGhpcy51cGRhdGVWYWx1ZSgpOwogICAgICB0aGlzLmhhbmRsZURyYWdFbmQoKTsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgY29uc3QgbW92ZWRCbG9ja0VsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihgW2RhdGEtYmxvY2staWQ9IiR7ZHJhZ2dlZEJsb2NrLmlkfSJdIC5ibG9ja2ApOwogICAgICAgIGlmIChtb3ZlZEJsb2NrRWxlbWVudCAmJiBkcmFnZ2VkQmxvY2sudHlwZSAhPT0gImRpdmlkZXIiKSB7CiAgICAgICAgICBtb3ZlZEJsb2NrRWxlbWVudC5mb2N1cygpOwogICAgICAgIH0KICAgICAgfSwgMTAwKTsKICAgIH0KICAgIGhhbmRsZVRleHRTZWxlY3Rpb24oX2UpIHsKICAgICAgaWYgKHRoaXMuc2xhc2hNZW51LnZpc2libGUpCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgdXBkYXRlRm9ybWF0dGluZ01lbnVQb3NpdGlvbigpIHsKICAgICAgY29uc3Qgc2hhZG93Um9vdHMgPSBbXTsKICAgICAgaWYgKHRoaXMuc2hhZG93Um9vdCkKICAgICAgICBzaGFkb3dSb290cy5wdXNoKHRoaXMuc2hhZG93Um9vdCk7CiAgICAgIGNvbnN0IGJsb2NrV3JhcHBlcnMgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ibG9jay13cmFwcGVyIik7CiAgICAgIGJsb2NrV3JhcHBlcnM/LmZvckVhY2goKHdyYXBwZXIpID0+IHsKICAgICAgICBjb25zdCBibG9ja0NvbXBvbmVudCA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcigiZGVlcy13eXNpd3lnLWJsb2NrIik7CiAgICAgICAgaWYgKGJsb2NrQ29tcG9uZW50Py5zaGFkb3dSb290KSB7CiAgICAgICAgICBzaGFkb3dSb290cy5wdXNoKGJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGNvbnN0IGNvb3JkcyA9IFd5c2l3eWdGb3JtYXR0aW5nLmdldFNlbGVjdGlvbkNvb3JkaW5hdGVzKC4uLnNoYWRvd1Jvb3RzKTsKICAgICAgaWYgKGNvb3JkcykgewogICAgICAgIHRoaXMuZm9ybWF0dGluZ01lbnUuc2hvdyh7IHg6IGNvb3Jkcy54LCB5OiBjb29yZHMueSB9LCBhc3luYyAoY29tbWFuZCkgPT4gYXdhaXQgdGhpcy5hcHBseUZvcm1hdChjb21tYW5kKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgIH0KICAgIH0KICAgIGhpZGVGb3JtYXR0aW5nTWVudSgpIHsKICAgICAgdGhpcy5mb3JtYXR0aW5nTWVudS5oaWRlKCk7CiAgICAgIHRoaXMuc2VsZWN0ZWRUZXh0ID0gIiI7CiAgICB9CiAgICBhc3luYyBhcHBseUZvcm1hdChjb21tYW5kKSB7CiAgICAgIGNvbnN0IHNoYWRvd1Jvb3RzID0gW107CiAgICAgIGlmICh0aGlzLnNoYWRvd1Jvb3QpCiAgICAgICAgc2hhZG93Um9vdHMucHVzaCh0aGlzLnNoYWRvd1Jvb3QpOwogICAgICBjb25zdCBibG9ja1dyYXBwZXJzID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yQWxsKCIuYmxvY2std3JhcHBlciIpOwogICAgICBibG9ja1dyYXBwZXJzPy5mb3JFYWNoKCh3cmFwcGVyKSA9PiB7CiAgICAgICAgY29uc3QgYmxvY2tDb21wb25lbnQgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgICAgIGlmIChibG9ja0NvbXBvbmVudD8uc2hhZG93Um9vdCkgewogICAgICAgICAgc2hhZG93Um9vdHMucHVzaChibG9ja0NvbXBvbmVudC5zaGFkb3dSb290KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBjb25zdCBzZWxlY3Rpb25JbmZvID0gV3lzaXd5Z1NlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvKC4uLnNoYWRvd1Jvb3RzKTsKICAgICAgaWYgKCFzZWxlY3Rpb25JbmZvKQogICAgICAgIHJldHVybjsKICAgICAgbGV0IHRhcmdldEJsb2NrOwogICAgICBsZXQgdGFyZ2V0QmxvY2tDb21wb25lbnQ7CiAgICAgIGNvbnN0IHdyYXBwZXJzID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ibG9jay13cmFwcGVyIik7CiAgICAgIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IHdyYXBwZXJzLmxlbmd0aDsgaTExKyspIHsKICAgICAgICBjb25zdCB3cmFwcGVyID0gd3JhcHBlcnNbaTExXTsKICAgICAgICBjb25zdCBibG9ja0NvbXBvbmVudCA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcigiZGVlcy13eXNpd3lnLWJsb2NrIik7CiAgICAgICAgaWYgKGJsb2NrQ29tcG9uZW50Py5zaGFkb3dSb290KSB7CiAgICAgICAgICBjb25zdCBibG9jayA9IGJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmJsb2NrIik7CiAgICAgICAgICBpZiAoYmxvY2sgJiYgKGJsb2NrLmNvbnRhaW5zKHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIpIHx8IGJsb2NrLmNvbnRhaW5zKHNlbGVjdGlvbkluZm8uZW5kQ29udGFpbmVyKSkpIHsKICAgICAgICAgICAgY29uc3QgYmxvY2tJZCA9IHdyYXBwZXIuZ2V0QXR0cmlidXRlKCJkYXRhLWJsb2NrLWlkIik7CiAgICAgICAgICAgIHRhcmdldEJsb2NrID0gdGhpcy5ibG9ja3MuZmluZCgoYjUpID0+IGI1LmlkID09PSBibG9ja0lkKTsKICAgICAgICAgICAgdGFyZ2V0QmxvY2tDb21wb25lbnQgPSBibG9ja0NvbXBvbmVudDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdGFyZ2V0QmxvY2sgfHwgIXRhcmdldEJsb2NrQ29tcG9uZW50KQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgcmFuZ2UyID0gV3lzaXd5Z1NlbGVjdGlvbi5jcmVhdGVSYW5nZUZyb21JbmZvKHNlbGVjdGlvbkluZm8pOwogICAgICBpZiAoY29tbWFuZCA9PT0gImxpbmsiKSB7CiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5zaG93TGlua0RpYWxvZygpOwogICAgICAgIGlmICghdXJsKSB7CiAgICAgICAgICB0YXJnZXRCbG9ja0NvbXBvbmVudC5mb2N1cygpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBXeXNpd3lnRm9ybWF0dGluZy5hcHBseUZvcm1hdChjb21tYW5kLCB1cmwsIHJhbmdlMiwgc2hhZG93Um9vdHMpOwogICAgICB9IGVsc2UgewogICAgICAgIFd5c2l3eWdGb3JtYXR0aW5nLmFwcGx5Rm9ybWF0KGNvbW1hbmQsIHZvaWQgMCwgcmFuZ2UyLCBzaGFkb3dSb290cyk7CiAgICAgIH0KICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUyLCAxMCkpOwogICAgICB0YXJnZXRCbG9jay5jb250ZW50ID0gdGFyZ2V0QmxvY2tDb21wb25lbnQuZ2V0Q29udGVudCgpOwogICAgICB0aGlzLnVwZGF0ZVZhbHVlKCk7CiAgICAgIHRhcmdldEJsb2NrQ29tcG9uZW50LmZvY3VzKCk7CiAgICAgIGlmIChjb21tYW5kID09PSAibGluayIpIHsKICAgICAgICB0aGlzLmhpZGVGb3JtYXR0aW5nTWVudSgpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc2VsZWN0ZWRUZXh0ID0gIiI7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIHNob3dMaW5rRGlhbG9nKCkgewogICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiB7CiAgICAgICAgbGV0IGxpbmtVcmwgPSBudWxsOwogICAgICAgIERlZXNNb2RhbC5jcmVhdGVBbmRTaG93KHsKICAgICAgICAgIGhlYWRpbmc6ICJBZGQgTGluayIsCiAgICAgICAgICBjb250ZW50OiB1M2AKICAgICAgICAgIDxzdHlsZT4KICAgICAgICAgICAgLmxpbmstaW5wdXQgewogICAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRlZXMtY29sb3ItbGluZS1icmlnaHQpOwogICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1kZWVzLWNvbG9yLWlucHV0KTsKICAgICAgICAgICAgICBjb2xvcjogdmFyKC0tZGVlcy1jb2xvci10ZXh0KTsKICAgICAgICAgICAgICBtYXJnaW46IDE2cHggMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAubGluay1pbnB1dDpmb2N1cyB7CiAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWRlZXMtY29sb3ItcHJpbWFyeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgICA8aW5wdXQgCiAgICAgICAgICAgIGNsYXNzPSJsaW5rLWlucHV0IiAKICAgICAgICAgICAgdHlwZT0idXJsIiAKICAgICAgICAgICAgcGxhY2Vob2xkZXI9Imh0dHBzOi8vZXhhbXBsZS5jb20iIAogICAgICAgICAgICBAa2V5ZG93bj0iJHsoZTExKSA9PiB7CiAgICAgICAgICAgIGlmIChlMTEua2V5ID09PSAiRW50ZXIiKSB7CiAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBlMTEudGFyZ2V0OwogICAgICAgICAgICAgIGxpbmtVcmwgPSBpbnB1dC52YWx1ZTsKICAgICAgICAgICAgICBjb25zdCBtb2RhbCA9IGlucHV0LmNsb3Nlc3QoImRlZXMtbW9kYWwiKTsKICAgICAgICAgICAgICBpZiAobW9kYWwpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG9rQnV0dG9uID0gbW9kYWwuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmJvdHRvbUJ1dHRvbjpsYXN0LWNoaWxkIik7CiAgICAgICAgICAgICAgICBpZiAob2tCdXR0b24pCiAgICAgICAgICAgICAgICAgIG9rQnV0dG9uLmNsaWNrKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9fSIKICAgICAgICAgICAgQGlucHV0PSIkeyhlMTEpID0+IHsKICAgICAgICAgICAgbGlua1VybCA9IGUxMS50YXJnZXQudmFsdWU7CiAgICAgICAgICB9fSIKICAgICAgICAgIC8+CiAgICAgICAgYCwKICAgICAgICAgIG1lbnVPcHRpb25zOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBuYW1lOiAiQ2FuY2VsIiwKICAgICAgICAgICAgICBhY3Rpb246IGFzeW5jIChtb2RhbCkgPT4gewogICAgICAgICAgICAgICAgbW9kYWwuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgcmVzb2x2ZTIobnVsbCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgbmFtZTogIkFkZCBMaW5rIiwKICAgICAgICAgICAgICBhY3Rpb246IGFzeW5jIChtb2RhbCkgPT4gewogICAgICAgICAgICAgICAgbW9kYWwuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgcmVzb2x2ZTIobGlua1VybCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICBdCiAgICAgICAgfSk7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImRlZXMtbW9kYWwgLmxpbmstaW5wdXQiKTsKICAgICAgICAgIGlmIChpbnB1dCkgewogICAgICAgICAgICBpbnB1dC5mb2N1cygpOwogICAgICAgICAgfQogICAgICAgIH0sIDEwMCk7CiAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBVbmRvIHRoZSBsYXN0IGFjdGlvbgogICAgICovCiAgICB1bmRvKCkgewogICAgICBjb25zdCBzdGF0ZTEwID0gdGhpcy5oaXN0b3J5LnVuZG8oKTsKICAgICAgaWYgKHN0YXRlMTApIHsKICAgICAgICB0aGlzLnJlc3RvcmVTdGF0ZShzdGF0ZTEwKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZWRvIHRoZSBuZXh0IGFjdGlvbgogICAgICovCiAgICByZWRvKCkgewogICAgICBjb25zdCBzdGF0ZTEwID0gdGhpcy5oaXN0b3J5LnJlZG8oKTsKICAgICAgaWYgKHN0YXRlMTApIHsKICAgICAgICB0aGlzLnJlc3RvcmVTdGF0ZShzdGF0ZTEwKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZXN0b3JlIGVkaXRvciBzdGF0ZSBmcm9tIGhpc3RvcnkKICAgICAqLwogICAgcmVzdG9yZVN0YXRlKHN0YXRlMTApIHsKICAgICAgdGhpcy5ibG9ja3MgPSBzdGF0ZTEwLmJsb2NrczsKICAgICAgdGhpcy5zZWxlY3RlZEJsb2NrSWQgPSBzdGF0ZTEwLnNlbGVjdGVkQmxvY2tJZDsKICAgICAgdGhpcy5yZW5kZXJCbG9ja3NQcm9ncmFtbWF0aWNhbGx5KCk7CiAgICAgIGlmIChzdGF0ZTEwLmN1cnNvclBvc2l0aW9uKSB7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICBjb25zdCBibG9ja1dyYXBwZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke3N0YXRlMTAuY3Vyc29yUG9zaXRpb24uYmxvY2tJZH0iXWApOwogICAgICAgICAgY29uc3QgYmxvY2tDb21wb25lbnQgPSBibG9ja1dyYXBwZXI/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgICAgICAgaWYgKGJsb2NrQ29tcG9uZW50KSB7CiAgICAgICAgICAgIGJsb2NrQ29tcG9uZW50LmZvY3VzV2l0aEN1cnNvcihzdGF0ZTEwLmN1cnNvclBvc2l0aW9uLm9mZnNldCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgNTApOwogICAgICB9IGVsc2UgaWYgKHN0YXRlMTAuc2VsZWN0ZWRCbG9ja0lkKSB7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9ucy5mb2N1c0Jsb2NrKHN0YXRlMTAuc2VsZWN0ZWRCbG9ja0lkKTsKICAgICAgICB9LCA1MCk7CiAgICAgIH0KICAgICAgdGhpcy51cGRhdGVWYWx1ZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBTYXZlIGN1cnJlbnQgc3RhdGUgdG8gaGlzdG9yeSB3aXRoIGN1cnNvciBwb3NpdGlvbgogICAgICovCiAgICBzYXZlVG9IaXN0b3J5KGRlYm91bmNlNCA9IHRydWUpIHsKICAgICAgbGV0IGN1cnNvclBvc2l0aW9uOwogICAgICBpZiAodGhpcy5zZWxlY3RlZEJsb2NrSWQpIHsKICAgICAgICBjb25zdCBibG9ja1dyYXBwZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke3RoaXMuc2VsZWN0ZWRCbG9ja0lkfSJdYCk7CiAgICAgICAgY29uc3QgYmxvY2tDb21wb25lbnQgPSBibG9ja1dyYXBwZXI/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgICAgIGlmIChibG9ja0NvbXBvbmVudCAmJiB0eXBlb2YgYmxvY2tDb21wb25lbnQuZ2V0Q3Vyc29yUG9zaXRpb24gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIGNvbnN0IGVkaXRhYmxlRWxlbWVudCA9IGJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jayIpOwogICAgICAgICAgaWYgKGVkaXRhYmxlRWxlbWVudCkgewogICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBibG9ja0NvbXBvbmVudC5nZXRDdXJzb3JQb3NpdGlvbihlZGl0YWJsZUVsZW1lbnQpOwogICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgY3Vyc29yUG9zaXRpb24gPSB7CiAgICAgICAgICAgICAgICBibG9ja0lkOiB0aGlzLnNlbGVjdGVkQmxvY2tJZCwKICAgICAgICAgICAgICAgIG9mZnNldAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRlYm91bmNlNCkgewogICAgICAgIHRoaXMuaGlzdG9yeS5zYXZlU3RhdGUodGhpcy5ibG9ja3MsIHRoaXMuc2VsZWN0ZWRCbG9ja0lkLCBjdXJzb3JQb3NpdGlvbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5oaXN0b3J5LnNhdmVDaGVja3BvaW50KHRoaXMuYmxvY2tzLCB0aGlzLnNlbGVjdGVkQmxvY2tJZCwgY3Vyc29yUG9zaXRpb24pOwogICAgICB9CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczYzKF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzSW5wdXRXeXNpd3lnMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvcHJvZmlsZXBpY3R1cmUvcHJvZmlsZXBpY3R1cmUuY3JvcHBlci5qcwp2YXIgSW1hZ2VDcm9wcGVyID0gY2xhc3MgewogIG9wdGlvbnM7CiAgY2FudmFzOwogIGN0eDsKICBpbWc7CiAgb3ZlcmxheUNhbnZhczsKICBvdmVybGF5Q3R4OwogIC8vIENyb3AgYXJlYSBwcm9wZXJ0aWVzCiAgY3JvcFggPSAwOwogIGNyb3BZID0gMDsKICBjcm9wU2l6ZSA9IDIwMDsKICBtaW5Dcm9wU2l6ZSA9IDUwOwogIC8vIEludGVyYWN0aW9uIHN0YXRlCiAgaXNEcmFnZ2luZyA9IGZhbHNlOwogIGlzUmVzaXppbmcgPSBmYWxzZTsKICBkcmFnU3RhcnRYID0gMDsKICBkcmFnU3RhcnRZID0gMDsKICByZXNpemVIYW5kbGUgPSAiIjsKICAvLyBJbWFnZSBwcm9wZXJ0aWVzCiAgaW1hZ2VTY2FsZSA9IDE7CiAgaW1hZ2VPZmZzZXRYID0gMDsKICBpbWFnZU9mZnNldFkgPSAwOwogIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIHRoaXMub3B0aW9ucyA9IHsKICAgICAgbWluU2l6ZTogNTAsCiAgICAgIG91dHB1dFNpemU6IDgwMCwKICAgICAgLy8gSGlnaGVyIGRlZmF1bHQgcmVzb2x1dGlvbgogICAgICBvdXRwdXRRdWFsaXR5OiAwLjk1LAogICAgICAvLyBIaWdoZXIgcXVhbGl0eQogICAgICAuLi5vcHRpb25zCiAgICB9OwogICAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgIHRoaXMuY3R4ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgIHRoaXMub3ZlcmxheUNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgdGhpcy5vdmVybGF5Q3R4ID0gdGhpcy5vdmVybGF5Q2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICB0aGlzLmltZyA9IG5ldyBJbWFnZSgpOwogIH0KICBhc3luYyBpbml0aWFsaXplKCkgewogICAgYXdhaXQgdGhpcy5sb2FkSW1hZ2UoKTsKICAgIHRoaXMuc2V0dXBDYW52YXNlcygpOwogICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7CiAgICB0aGlzLnJlbmRlcigpOwogIH0KICBhc3luYyBsb2FkSW1hZ2UoKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgICAgdGhpcy5pbWcub25sb2FkID0gKCkgPT4gcmVzb2x2ZTIoKTsKICAgICAgdGhpcy5pbWcub25lcnJvciA9IHJlamVjdDsKICAgICAgdGhpcy5pbWcuc3JjID0gdGhpcy5vcHRpb25zLmltYWdlOwogICAgfSk7CiAgfQogIHNldHVwQ2FudmFzZXMoKSB7CiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLm9wdGlvbnMuY29udGFpbmVyOwogICAgY29uc3QgY29udGFpbmVyU2l6ZSA9IE1hdGgubWluKGNvbnRhaW5lci5jbGllbnRXaWR0aCwgY29udGFpbmVyLmNsaWVudEhlaWdodCk7CiAgICB0aGlzLmNhbnZhcy53aWR0aCA9IGNvbnRhaW5lclNpemU7CiAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSBjb250YWluZXJTaXplOwogICAgdGhpcy5jYW52YXMuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICB0aGlzLmNhbnZhcy5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICB0aGlzLmNhbnZhcy5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICB0aGlzLmNhbnZhcy5zdHlsZS50b3AgPSAiMCI7CiAgICB0aGlzLmNhbnZhcy5zdHlsZS5sZWZ0ID0gIjAiOwogICAgdGhpcy5vdmVybGF5Q2FudmFzLndpZHRoID0gY29udGFpbmVyU2l6ZTsKICAgIHRoaXMub3ZlcmxheUNhbnZhcy5oZWlnaHQgPSBjb250YWluZXJTaXplOwogICAgdGhpcy5vdmVybGF5Q2FudmFzLnN0eWxlLndpZHRoID0gIjEwMCUiOwogICAgdGhpcy5vdmVybGF5Q2FudmFzLnN0eWxlLmhlaWdodCA9ICIxMDAlIjsKICAgIHRoaXMub3ZlcmxheUNhbnZhcy5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICB0aGlzLm92ZXJsYXlDYW52YXMuc3R5bGUudG9wID0gIjAiOwogICAgdGhpcy5vdmVybGF5Q2FudmFzLnN0eWxlLmxlZnQgPSAiMCI7CiAgICB0aGlzLm92ZXJsYXlDYW52YXMuc3R5bGUuY3Vyc29yID0gIm1vdmUiOwogICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY2FudmFzKTsKICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm92ZXJsYXlDYW52YXMpOwogICAgY29uc3Qgc2NhbGUgPSBNYXRoLm1pbihjb250YWluZXJTaXplIC8gdGhpcy5pbWcud2lkdGgsIGNvbnRhaW5lclNpemUgLyB0aGlzLmltZy5oZWlnaHQpOwogICAgdGhpcy5pbWFnZVNjYWxlID0gc2NhbGU7CiAgICB0aGlzLmltYWdlT2Zmc2V0WCA9IChjb250YWluZXJTaXplIC0gdGhpcy5pbWcud2lkdGggKiBzY2FsZSkgLyAyOwogICAgdGhpcy5pbWFnZU9mZnNldFkgPSAoY29udGFpbmVyU2l6ZSAtIHRoaXMuaW1nLmhlaWdodCAqIHNjYWxlKSAvIDI7CiAgICBjb25zdCBzY2FsZWRJbWFnZVdpZHRoID0gdGhpcy5pbWcud2lkdGggKiBzY2FsZTsKICAgIGNvbnN0IHNjYWxlZEltYWdlSGVpZ2h0ID0gdGhpcy5pbWcuaGVpZ2h0ICogc2NhbGU7CiAgICBjb25zdCBtYXhDcm9wU2l6ZSA9IE1hdGgubWluKHNjYWxlZEltYWdlV2lkdGgsIHNjYWxlZEltYWdlSGVpZ2h0LCBjb250YWluZXJTaXplICogMC44KTsKICAgIHRoaXMuY3JvcFNpemUgPSBtYXhDcm9wU2l6ZSAqIDAuODsKICAgIHRoaXMuY3JvcFggPSAoY29udGFpbmVyU2l6ZSAtIHRoaXMuY3JvcFNpemUpIC8gMjsKICAgIHRoaXMuY3JvcFkgPSAoY29udGFpbmVyU2l6ZSAtIHRoaXMuY3JvcFNpemUpIC8gMjsKICB9CiAgc2V0dXBFdmVudExpc3RlbmVycygpIHsKICAgIHRoaXMub3ZlcmxheUNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLCB0aGlzLmhhbmRsZU1vdXNlRG93bi5iaW5kKHRoaXMpKTsKICAgIHRoaXMub3ZlcmxheUNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCB0aGlzLmhhbmRsZU1vdXNlTW92ZS5iaW5kKHRoaXMpKTsKICAgIHRoaXMub3ZlcmxheUNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5oYW5kbGVNb3VzZVVwLmJpbmQodGhpcykpOwogICAgdGhpcy5vdmVybGF5Q2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLCB0aGlzLmhhbmRsZU1vdXNlVXAuYmluZCh0aGlzKSk7CiAgICB0aGlzLm92ZXJsYXlDYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpKTsKICAgIHRoaXMub3ZlcmxheUNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLCB0aGlzLmhhbmRsZVRvdWNoTW92ZS5iaW5kKHRoaXMpKTsKICAgIHRoaXMub3ZlcmxheUNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIHRoaXMuaGFuZGxlVG91Y2hFbmQuYmluZCh0aGlzKSk7CiAgfQogIGhhbmRsZU1vdXNlRG93bihlMTEpIHsKICAgIGNvbnN0IHJlY3QgPSB0aGlzLm92ZXJsYXlDYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICBjb25zdCB4MyA9IChlMTEuY2xpZW50WCAtIHJlY3QubGVmdCkgKiAodGhpcy5vdmVybGF5Q2FudmFzLndpZHRoIC8gcmVjdC53aWR0aCk7CiAgICBjb25zdCB5NSA9IChlMTEuY2xpZW50WSAtIHJlY3QudG9wKSAqICh0aGlzLm92ZXJsYXlDYW52YXMuaGVpZ2h0IC8gcmVjdC5oZWlnaHQpOwogICAgY29uc3QgaGFuZGxlMyA9IHRoaXMuZ2V0UmVzaXplSGFuZGxlKHgzLCB5NSk7CiAgICBpZiAoaGFuZGxlMykgewogICAgICB0aGlzLmlzUmVzaXppbmcgPSB0cnVlOwogICAgICB0aGlzLnJlc2l6ZUhhbmRsZSA9IGhhbmRsZTM7CiAgICB9IGVsc2UgaWYgKHRoaXMuaXNJbnNpZGVDcm9wQXJlYSh4MywgeTUpKSB7CiAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7CiAgICB9CiAgICB0aGlzLmRyYWdTdGFydFggPSB4MzsKICAgIHRoaXMuZHJhZ1N0YXJ0WSA9IHk1OwogIH0KICBoYW5kbGVNb3VzZU1vdmUoZTExKSB7CiAgICBjb25zdCByZWN0ID0gdGhpcy5vdmVybGF5Q2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgY29uc3QgeDMgPSAoZTExLmNsaWVudFggLSByZWN0LmxlZnQpICogKHRoaXMub3ZlcmxheUNhbnZhcy53aWR0aCAvIHJlY3Qud2lkdGgpOwogICAgY29uc3QgeTUgPSAoZTExLmNsaWVudFkgLSByZWN0LnRvcCkgKiAodGhpcy5vdmVybGF5Q2FudmFzLmhlaWdodCAvIHJlY3QuaGVpZ2h0KTsKICAgIGNvbnN0IGhhbmRsZTMgPSB0aGlzLmdldFJlc2l6ZUhhbmRsZSh4MywgeTUpOwogICAgaWYgKGhhbmRsZTMpIHsKICAgICAgdGhpcy5vdmVybGF5Q2FudmFzLnN0eWxlLmN1cnNvciA9IHRoaXMuZ2V0UmVzaXplQ3Vyc29yKGhhbmRsZTMpOwogICAgfSBlbHNlIGlmICh0aGlzLmlzSW5zaWRlQ3JvcEFyZWEoeDMsIHk1KSkgewogICAgICB0aGlzLm92ZXJsYXlDYW52YXMuc3R5bGUuY3Vyc29yID0gIm1vdmUiOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5vdmVybGF5Q2FudmFzLnN0eWxlLmN1cnNvciA9ICJkZWZhdWx0IjsKICAgIH0KICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHsKICAgICAgY29uc3QgZHggPSB4MyAtIHRoaXMuZHJhZ1N0YXJ0WDsKICAgICAgY29uc3QgZHkgPSB5NSAtIHRoaXMuZHJhZ1N0YXJ0WTsKICAgICAgY29uc3QgbWluWCA9IHRoaXMuaW1hZ2VPZmZzZXRYOwogICAgICBjb25zdCBtYXhYID0gdGhpcy5pbWFnZU9mZnNldFggKyB0aGlzLmltZy53aWR0aCAqIHRoaXMuaW1hZ2VTY2FsZSAtIHRoaXMuY3JvcFNpemU7CiAgICAgIGNvbnN0IG1pblkgPSB0aGlzLmltYWdlT2Zmc2V0WTsKICAgICAgY29uc3QgbWF4WSA9IHRoaXMuaW1hZ2VPZmZzZXRZICsgdGhpcy5pbWcuaGVpZ2h0ICogdGhpcy5pbWFnZVNjYWxlIC0gdGhpcy5jcm9wU2l6ZTsKICAgICAgdGhpcy5jcm9wWCA9IE1hdGgubWF4KG1pblgsIE1hdGgubWluKG1heFgsIHRoaXMuY3JvcFggKyBkeCkpOwogICAgICB0aGlzLmNyb3BZID0gTWF0aC5tYXgobWluWSwgTWF0aC5taW4obWF4WSwgdGhpcy5jcm9wWSArIGR5KSk7CiAgICAgIHRoaXMuZHJhZ1N0YXJ0WCA9IHgzOwogICAgICB0aGlzLmRyYWdTdGFydFkgPSB5NTsKICAgICAgdGhpcy5yZW5kZXIoKTsKICAgIH0KICAgIGlmICh0aGlzLmlzUmVzaXppbmcpIHsKICAgICAgdGhpcy5oYW5kbGVSZXNpemUoeDMsIHk1KTsKICAgICAgdGhpcy5kcmFnU3RhcnRYID0geDM7CiAgICAgIHRoaXMuZHJhZ1N0YXJ0WSA9IHk1OwogICAgICB0aGlzLnJlbmRlcigpOwogICAgfQogIH0KICBoYW5kbGVNb3VzZVVwKCkgewogICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7CiAgICB0aGlzLmlzUmVzaXppbmcgPSBmYWxzZTsKICAgIHRoaXMucmVzaXplSGFuZGxlID0gIiI7CiAgfQogIGhhbmRsZVRvdWNoU3RhcnQoZTExKSB7CiAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgIGNvbnN0IHRvdWNoID0gZTExLnRvdWNoZXNbMF07CiAgICBjb25zdCBtb3VzZUV2ZW50ID0gbmV3IE1vdXNlRXZlbnQoIm1vdXNlZG93biIsIHsKICAgICAgY2xpZW50WDogdG91Y2guY2xpZW50WCwKICAgICAgY2xpZW50WTogdG91Y2guY2xpZW50WQogICAgfSk7CiAgICB0aGlzLmhhbmRsZU1vdXNlRG93bihtb3VzZUV2ZW50KTsKICB9CiAgaGFuZGxlVG91Y2hNb3ZlKGUxMSkgewogICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICBjb25zdCB0b3VjaCA9IGUxMS50b3VjaGVzWzBdOwogICAgY29uc3QgbW91c2VFdmVudCA9IG5ldyBNb3VzZUV2ZW50KCJtb3VzZW1vdmUiLCB7CiAgICAgIGNsaWVudFg6IHRvdWNoLmNsaWVudFgsCiAgICAgIGNsaWVudFk6IHRvdWNoLmNsaWVudFkKICAgIH0pOwogICAgdGhpcy5oYW5kbGVNb3VzZU1vdmUobW91c2VFdmVudCk7CiAgfQogIGhhbmRsZVRvdWNoRW5kKGUxMSkgewogICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICB0aGlzLmhhbmRsZU1vdXNlVXAoKTsKICB9CiAgZ2V0UmVzaXplSGFuZGxlKHgzLCB5NSkgewogICAgY29uc3QgaGFuZGxlU2l6ZSA9IDIwOwogICAgY29uc3QgaGFuZGxlcyA9IHsKICAgICAgIm53IjogeyB4OiB0aGlzLmNyb3BYLCB5OiB0aGlzLmNyb3BZIH0sCiAgICAgICJuZSI6IHsgeDogdGhpcy5jcm9wWCArIHRoaXMuY3JvcFNpemUsIHk6IHRoaXMuY3JvcFkgfSwKICAgICAgInN3IjogeyB4OiB0aGlzLmNyb3BYLCB5OiB0aGlzLmNyb3BZICsgdGhpcy5jcm9wU2l6ZSB9LAogICAgICAic2UiOiB7IHg6IHRoaXMuY3JvcFggKyB0aGlzLmNyb3BTaXplLCB5OiB0aGlzLmNyb3BZICsgdGhpcy5jcm9wU2l6ZSB9CiAgICB9OwogICAgZm9yIChjb25zdCBba2V5MiwgcG9zXSBvZiBPYmplY3QuZW50cmllcyhoYW5kbGVzKSkgewogICAgICBpZiAoTWF0aC5hYnMoeDMgLSBwb3MueCkgPCBoYW5kbGVTaXplICYmIE1hdGguYWJzKHk1IC0gcG9zLnkpIDwgaGFuZGxlU2l6ZSkgewogICAgICAgIHJldHVybiBrZXkyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gIiI7CiAgfQogIGdldFJlc2l6ZUN1cnNvcihoYW5kbGUzKSB7CiAgICBjb25zdCBjdXJzb3JzID0gewogICAgICAibnciOiAibnctcmVzaXplIiwKICAgICAgIm5lIjogIm5lLXJlc2l6ZSIsCiAgICAgICJzdyI6ICJzdy1yZXNpemUiLAogICAgICAic2UiOiAic2UtcmVzaXplIgogICAgfTsKICAgIHJldHVybiBjdXJzb3JzW2hhbmRsZTNdIHx8ICJkZWZhdWx0IjsKICB9CiAgaXNJbnNpZGVDcm9wQXJlYSh4MywgeTUpIHsKICAgIHJldHVybiB4MyA+PSB0aGlzLmNyb3BYICYmIHgzIDw9IHRoaXMuY3JvcFggKyB0aGlzLmNyb3BTaXplICYmIHk1ID49IHRoaXMuY3JvcFkgJiYgeTUgPD0gdGhpcy5jcm9wWSArIHRoaXMuY3JvcFNpemU7CiAgfQogIGhhbmRsZVJlc2l6ZSh4MywgeTUpIHsKICAgIGNvbnN0IGR4ID0geDMgLSB0aGlzLmRyYWdTdGFydFg7CiAgICBjb25zdCBkeSA9IHk1IC0gdGhpcy5kcmFnU3RhcnRZOwogICAgY29uc3QgaW1nTGVmdCA9IHRoaXMuaW1hZ2VPZmZzZXRYOwogICAgY29uc3QgaW1nVG9wID0gdGhpcy5pbWFnZU9mZnNldFk7CiAgICBjb25zdCBpbWdSaWdodCA9IHRoaXMuaW1hZ2VPZmZzZXRYICsgdGhpcy5pbWcud2lkdGggKiB0aGlzLmltYWdlU2NhbGU7CiAgICBjb25zdCBpbWdCb3R0b20gPSB0aGlzLmltYWdlT2Zmc2V0WSArIHRoaXMuaW1nLmhlaWdodCAqIHRoaXMuaW1hZ2VTY2FsZTsKICAgIHN3aXRjaCAodGhpcy5yZXNpemVIYW5kbGUpIHsKICAgICAgY2FzZSAic2UiOgogICAgICAgIHRoaXMuY3JvcFNpemUgPSBNYXRoLm1heCh0aGlzLm1pbkNyb3BTaXplLCBNYXRoLm1pbih0aGlzLmNyb3BTaXplICsgTWF0aC5tYXgoZHgsIGR5KSwgTWF0aC5taW4oaW1nUmlnaHQgLSB0aGlzLmNyb3BYLCBpbWdCb3R0b20gLSB0aGlzLmNyb3BZKSkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJudyI6CiAgICAgICAgY29uc3QgbmV3U2l6ZSA9IE1hdGgubWF4KHRoaXMubWluQ3JvcFNpemUsIHRoaXMuY3JvcFNpemUgLSBNYXRoLm1heChkeCwgZHkpKTsKICAgICAgICBjb25zdCBzaXplRGlmZiA9IHRoaXMuY3JvcFNpemUgLSBuZXdTaXplOwogICAgICAgIGNvbnN0IG5ld1ggPSB0aGlzLmNyb3BYICsgc2l6ZURpZmY7CiAgICAgICAgY29uc3QgbmV3WSA9IHRoaXMuY3JvcFkgKyBzaXplRGlmZjsKICAgICAgICBpZiAobmV3WCA+PSBpbWdMZWZ0ICYmIG5ld1kgPj0gaW1nVG9wKSB7CiAgICAgICAgICB0aGlzLmNyb3BYID0gbmV3WDsKICAgICAgICAgIHRoaXMuY3JvcFkgPSBuZXdZOwogICAgICAgICAgdGhpcy5jcm9wU2l6ZSA9IG5ld1NpemU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJuZSI6CiAgICAgICAgY29uc3QgbmVTaXplRHggPSBNYXRoLm1heChkeCwgLWR5KTsKICAgICAgICBjb25zdCBuZU5ld1NpemUgPSBNYXRoLm1heCh0aGlzLm1pbkNyb3BTaXplLCB0aGlzLmNyb3BTaXplICsgbmVTaXplRHgpOwogICAgICAgIGNvbnN0IG5lU2l6ZURpZmYgPSBuZU5ld1NpemUgLSB0aGlzLmNyb3BTaXplOwogICAgICAgIGNvbnN0IG5lTmV3WSA9IHRoaXMuY3JvcFkgLSBuZVNpemVEaWZmOwogICAgICAgIGlmIChuZU5ld1kgPj0gaW1nVG9wICYmIHRoaXMuY3JvcFggKyBuZU5ld1NpemUgPD0gaW1nUmlnaHQpIHsKICAgICAgICAgIHRoaXMuY3JvcFkgPSBuZU5ld1k7CiAgICAgICAgICB0aGlzLmNyb3BTaXplID0gbmVOZXdTaXplOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAic3ciOgogICAgICAgIGNvbnN0IHN3U2l6ZUR4ID0gTWF0aC5tYXgoLWR4LCBkeSk7CiAgICAgICAgY29uc3Qgc3dOZXdTaXplID0gTWF0aC5tYXgodGhpcy5taW5Dcm9wU2l6ZSwgdGhpcy5jcm9wU2l6ZSArIHN3U2l6ZUR4KTsKICAgICAgICBjb25zdCBzd1NpemVEaWZmID0gc3dOZXdTaXplIC0gdGhpcy5jcm9wU2l6ZTsKICAgICAgICBjb25zdCBzd05ld1ggPSB0aGlzLmNyb3BYIC0gc3dTaXplRGlmZjsKICAgICAgICBpZiAoc3dOZXdYID49IGltZ0xlZnQgJiYgdGhpcy5jcm9wWSArIHN3TmV3U2l6ZSA8PSBpbWdCb3R0b20pIHsKICAgICAgICAgIHRoaXMuY3JvcFggPSBzd05ld1g7CiAgICAgICAgICB0aGlzLmNyb3BTaXplID0gc3dOZXdTaXplOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KICB9CiAgcmVuZGVyKCkgewogICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpOwogICAgdGhpcy5vdmVybGF5Q3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLm92ZXJsYXlDYW52YXMud2lkdGgsIHRoaXMub3ZlcmxheUNhbnZhcy5oZWlnaHQpOwogICAgdGhpcy5jdHguZmlsbFN0eWxlID0gIiMwMDAwMDAiOwogICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7CiAgICB0aGlzLmN0eC5kcmF3SW1hZ2UodGhpcy5pbWcsIHRoaXMuaW1hZ2VPZmZzZXRYLCB0aGlzLmltYWdlT2Zmc2V0WSwgdGhpcy5pbWcud2lkdGggKiB0aGlzLmltYWdlU2NhbGUsIHRoaXMuaW1nLmhlaWdodCAqIHRoaXMuaW1hZ2VTY2FsZSk7CiAgICB0aGlzLm92ZXJsYXlDdHguZmlsbFN0eWxlID0gInJnYmEoMCwgMCwgMCwgMC41KSI7CiAgICB0aGlzLm92ZXJsYXlDdHguZmlsbFJlY3QodGhpcy5pbWFnZU9mZnNldFgsIHRoaXMuaW1hZ2VPZmZzZXRZLCB0aGlzLmltZy53aWR0aCAqIHRoaXMuaW1hZ2VTY2FsZSwgdGhpcy5pbWcuaGVpZ2h0ICogdGhpcy5pbWFnZVNjYWxlKTsKICAgIHRoaXMub3ZlcmxheUN0eC5zYXZlKCk7CiAgICBpZiAodGhpcy5vcHRpb25zLnNoYXBlID09PSAicm91bmQiKSB7CiAgICAgIHRoaXMub3ZlcmxheUN0eC5iZWdpblBhdGgoKTsKICAgICAgdGhpcy5vdmVybGF5Q3R4LmFyYyh0aGlzLmNyb3BYICsgdGhpcy5jcm9wU2l6ZSAvIDIsIHRoaXMuY3JvcFkgKyB0aGlzLmNyb3BTaXplIC8gMiwgdGhpcy5jcm9wU2l6ZSAvIDIsIDAsIE1hdGguUEkgKiAyKTsKICAgICAgdGhpcy5vdmVybGF5Q3R4LmNsaXAoKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMub3ZlcmxheUN0eC5iZWdpblBhdGgoKTsKICAgICAgdGhpcy5vdmVybGF5Q3R4LnJlY3QodGhpcy5jcm9wWCwgdGhpcy5jcm9wWSwgdGhpcy5jcm9wU2l6ZSwgdGhpcy5jcm9wU2l6ZSk7CiAgICAgIHRoaXMub3ZlcmxheUN0eC5jbGlwKCk7CiAgICB9CiAgICB0aGlzLm92ZXJsYXlDdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMub3ZlcmxheUNhbnZhcy53aWR0aCwgdGhpcy5vdmVybGF5Q2FudmFzLmhlaWdodCk7CiAgICB0aGlzLm92ZXJsYXlDdHgucmVzdG9yZSgpOwogICAgdGhpcy5vdmVybGF5Q3R4LnN0cm9rZVN0eWxlID0gIndoaXRlIjsKICAgIHRoaXMub3ZlcmxheUN0eC5saW5lV2lkdGggPSAyOwogICAgaWYgKHRoaXMub3B0aW9ucy5zaGFwZSA9PT0gInJvdW5kIikgewogICAgICB0aGlzLm92ZXJsYXlDdHguYmVnaW5QYXRoKCk7CiAgICAgIHRoaXMub3ZlcmxheUN0eC5hcmModGhpcy5jcm9wWCArIHRoaXMuY3JvcFNpemUgLyAyLCB0aGlzLmNyb3BZICsgdGhpcy5jcm9wU2l6ZSAvIDIsIHRoaXMuY3JvcFNpemUgLyAyLCAwLCBNYXRoLlBJICogMik7CiAgICAgIHRoaXMub3ZlcmxheUN0eC5zdHJva2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMub3ZlcmxheUN0eC5zdHJva2VSZWN0KHRoaXMuY3JvcFgsIHRoaXMuY3JvcFksIHRoaXMuY3JvcFNpemUsIHRoaXMuY3JvcFNpemUpOwogICAgfQogICAgdGhpcy5kcmF3UmVzaXplSGFuZGxlcygpOwogIH0KICBkcmF3UmVzaXplSGFuZGxlcygpIHsKICAgIGNvbnN0IGhhbmRsZVNpemUgPSA4OwogICAgY29uc3QgaGFuZGxlcyA9IFsKICAgICAgeyB4OiB0aGlzLmNyb3BYLCB5OiB0aGlzLmNyb3BZIH0sCiAgICAgIHsgeDogdGhpcy5jcm9wWCArIHRoaXMuY3JvcFNpemUsIHk6IHRoaXMuY3JvcFkgfSwKICAgICAgeyB4OiB0aGlzLmNyb3BYLCB5OiB0aGlzLmNyb3BZICsgdGhpcy5jcm9wU2l6ZSB9LAogICAgICB7IHg6IHRoaXMuY3JvcFggKyB0aGlzLmNyb3BTaXplLCB5OiB0aGlzLmNyb3BZICsgdGhpcy5jcm9wU2l6ZSB9CiAgICBdOwogICAgdGhpcy5vdmVybGF5Q3R4LmZpbGxTdHlsZSA9ICJ3aGl0ZSI7CiAgICBoYW5kbGVzLmZvckVhY2goKGhhbmRsZTMpID0+IHsKICAgICAgdGhpcy5vdmVybGF5Q3R4LmJlZ2luUGF0aCgpOwogICAgICB0aGlzLm92ZXJsYXlDdHguYXJjKGhhbmRsZTMueCwgaGFuZGxlMy55LCBoYW5kbGVTaXplLCAwLCBNYXRoLlBJICogMik7CiAgICAgIHRoaXMub3ZlcmxheUN0eC5maWxsKCk7CiAgICB9KTsKICB9CiAgYXN5bmMgZ2V0Q3JvcHBlZEltYWdlKCkgewogICAgY29uc3QgY3JvcENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgY29uc3QgY3JvcEN0eCA9IGNyb3BDYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgIGNvbnN0IHNjYWxlID0gMSAvIHRoaXMuaW1hZ2VTY2FsZTsKICAgIGNvbnN0IG9yaWdpbmFsQ3JvcFNpemUgPSB0aGlzLmNyb3BTaXplICogc2NhbGU7CiAgICBjb25zdCBvdXRwdXRTaXplID0gdGhpcy5vcHRpb25zLm91dHB1dFNpemU7CiAgICBpZiAob3V0cHV0U2l6ZSA+IG9yaWdpbmFsQ3JvcFNpemUpIHsKICAgICAgY29uc29sZS5pbmZvKGBQcm9maWxlIHBpY3R1cmU6IFVwc2NhbGluZyBmcm9tICR7TWF0aC5yb3VuZChvcmlnaW5hbENyb3BTaXplKX1weCB0byAke291dHB1dFNpemV9cHhgKTsKICAgIH0KICAgIGNyb3BDYW52YXMud2lkdGggPSBvdXRwdXRTaXplOwogICAgY3JvcENhbnZhcy5oZWlnaHQgPSBvdXRwdXRTaXplOwogICAgY29uc3Qgc3ggPSAodGhpcy5jcm9wWCAtIHRoaXMuaW1hZ2VPZmZzZXRYKSAqIHNjYWxlOwogICAgY29uc3Qgc3kgPSAodGhpcy5jcm9wWSAtIHRoaXMuaW1hZ2VPZmZzZXRZKSAqIHNjYWxlOwogICAgY29uc3Qgc1NpemUgPSB0aGlzLmNyb3BTaXplICogc2NhbGU7CiAgICBpZiAodGhpcy5vcHRpb25zLnNoYXBlID09PSAicm91bmQiKSB7CiAgICAgIGNyb3BDdHguYmVnaW5QYXRoKCk7CiAgICAgIGNyb3BDdHguYXJjKG91dHB1dFNpemUgLyAyLCBvdXRwdXRTaXplIC8gMiwgb3V0cHV0U2l6ZSAvIDIsIDAsIE1hdGguUEkgKiAyKTsKICAgICAgY3JvcEN0eC5jbGlwKCk7CiAgICB9CiAgICBjcm9wQ3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IHRydWU7CiAgICBjcm9wQ3R4LmltYWdlU21vb3RoaW5nUXVhbGl0eSA9ICJoaWdoIjsKICAgIGNyb3BDdHguZHJhd0ltYWdlKHRoaXMuaW1nLCBzeCwgc3ksIHNTaXplLCBzU2l6ZSwgMCwgMCwgb3V0cHV0U2l6ZSwgb3V0cHV0U2l6ZSk7CiAgICBjb25zdCBpc1BuZyA9IHRoaXMub3B0aW9ucy5pbWFnZS5pbmNsdWRlcygiaW1hZ2UvcG5nIik7CiAgICBjb25zdCBmb3JtYXQyID0gaXNQbmcgPyAiaW1hZ2UvcG5nIiA6ICJpbWFnZS9qcGVnIjsKICAgIHJldHVybiBjcm9wQ2FudmFzLnRvRGF0YVVSTChmb3JtYXQyLCB0aGlzLm9wdGlvbnMub3V0cHV0UXVhbGl0eSk7CiAgfQogIGRlc3Ryb3koKSB7CiAgICB0aGlzLmNhbnZhcy5yZW1vdmUoKTsKICAgIHRoaXMub3ZlcmxheUNhbnZhcy5yZW1vdmUoKTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvcHJvZmlsZXBpY3R1cmUvcHJvZmlsZXBpY3R1cmUubW9kYWwuanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF9kZWVzX2ljb24oKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlNjMgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczY0ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBQcm9maWxlUGljdHVyZU1vZGFsID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1wcm9maWxlcGljdHVyZS1tb2RhbCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX2luaXRpYWxJbWFnZV9kZWNvcmF0b3JzOwogIGxldCBfaW5pdGlhbEltYWdlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW5pdGlhbEltYWdlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaGFwZV9kZWNvcmF0b3JzOwogIGxldCBfc2hhcGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaGFwZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfb3V0cHV0U2l6ZV9kZWNvcmF0b3JzOwogIGxldCBfb3V0cHV0U2l6ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX291dHB1dFNpemVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX291dHB1dFF1YWxpdHlfZGVjb3JhdG9yczsKICBsZXQgX291dHB1dFF1YWxpdHlfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vdXRwdXRRdWFsaXR5X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50U3RlcF9kZWNvcmF0b3JzOwogIGxldCBfY3VycmVudFN0ZXBfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50U3RlcF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3JvcHBlZEltYWdlX2RlY29yYXRvcnM7CiAgbGV0IF9jcm9wcGVkSW1hZ2VfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jcm9wcGVkSW1hZ2VfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzUHJvY2Vzc2luZ19kZWNvcmF0b3JzOwogIGxldCBfaXNQcm9jZXNzaW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNQcm9jZXNzaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIFByb2ZpbGVQaWN0dXJlTW9kYWwyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfaW5pdGlhbEltYWdlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfc2hhcGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9vdXRwdXRTaXplX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfb3V0cHV0UXVhbGl0eV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX2N1cnJlbnRTdGVwX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9jcm9wcGVkSW1hZ2VfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2lzUHJvY2Vzc2luZ19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGU2Myh0aGlzLCBudWxsLCBfaW5pdGlhbEltYWdlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImluaXRpYWxJbWFnZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaW5pdGlhbEltYWdlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmluaXRpYWxJbWFnZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaW5pdGlhbEltYWdlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2luaXRpYWxJbWFnZV9pbml0aWFsaXplcnMsIF9pbml0aWFsSW1hZ2VfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2Myh0aGlzLCBudWxsLCBfc2hhcGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2hhcGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNoYXBlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNoYXBlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaGFwZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaGFwZV9pbml0aWFsaXplcnMsIF9zaGFwZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTYzKHRoaXMsIG51bGwsIF9vdXRwdXRTaXplX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm91dHB1dFNpemUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm91dHB1dFNpemUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoub3V0cHV0U2l6ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoub3V0cHV0U2l6ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9vdXRwdXRTaXplX2luaXRpYWxpemVycywgX291dHB1dFNpemVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2Myh0aGlzLCBudWxsLCBfb3V0cHV0UXVhbGl0eV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJvdXRwdXRRdWFsaXR5Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJvdXRwdXRRdWFsaXR5IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm91dHB1dFF1YWxpdHksIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm91dHB1dFF1YWxpdHkgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfb3V0cHV0UXVhbGl0eV9pbml0aWFsaXplcnMsIF9vdXRwdXRRdWFsaXR5X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjModGhpcywgbnVsbCwgX2N1cnJlbnRTdGVwX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImN1cnJlbnRTdGVwIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjdXJyZW50U3RlcCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jdXJyZW50U3RlcCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY3VycmVudFN0ZXAgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY3VycmVudFN0ZXBfaW5pdGlhbGl6ZXJzLCBfY3VycmVudFN0ZXBfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2Myh0aGlzLCBudWxsLCBfY3JvcHBlZEltYWdlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNyb3BwZWRJbWFnZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3JvcHBlZEltYWdlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNyb3BwZWRJbWFnZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY3JvcHBlZEltYWdlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Nyb3BwZWRJbWFnZV9pbml0aWFsaXplcnMsIF9jcm9wcGVkSW1hZ2VfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2Myh0aGlzLCBudWxsLCBfaXNQcm9jZXNzaW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzUHJvY2Vzc2luZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNQcm9jZXNzaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzUHJvY2Vzc2luZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNQcm9jZXNzaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzUHJvY2Vzc2luZ19pbml0aWFsaXplcnMsIF9pc1Byb2Nlc3NpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2MyhudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIFByb2ZpbGVQaWN0dXJlTW9kYWwyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgICNpbml0aWFsSW1hZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNjQodGhpcywgX2luaXRpYWxJbWFnZV9pbml0aWFsaXplcnMsICIiKTsKICAgIGdldCBpbml0aWFsSW1hZ2UoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpbml0aWFsSW1hZ2VfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpbml0aWFsSW1hZ2UodmFsdWUyKSB7CiAgICAgIHRoaXMuI2luaXRpYWxJbWFnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NoYXBlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2NCh0aGlzLCBfaW5pdGlhbEltYWdlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2NCh0aGlzLCBfc2hhcGVfaW5pdGlhbGl6ZXJzLCAicm91bmQiKSk7CiAgICBnZXQgc2hhcGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaGFwZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNoYXBlKHZhbHVlMikgewogICAgICB0aGlzLiNzaGFwZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI291dHB1dFNpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY0KHRoaXMsIF9zaGFwZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjQodGhpcywgX291dHB1dFNpemVfaW5pdGlhbGl6ZXJzLCA4MDApKTsKICAgIGdldCBvdXRwdXRTaXplKCkgewogICAgICByZXR1cm4gdGhpcy4jb3V0cHV0U2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG91dHB1dFNpemUodmFsdWUyKSB7CiAgICAgIHRoaXMuI291dHB1dFNpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNvdXRwdXRRdWFsaXR5X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2NCh0aGlzLCBfb3V0cHV0U2l6ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjQodGhpcywgX291dHB1dFF1YWxpdHlfaW5pdGlhbGl6ZXJzLCAwLjk1KSk7CiAgICBnZXQgb3V0cHV0UXVhbGl0eSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI291dHB1dFF1YWxpdHlfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBvdXRwdXRRdWFsaXR5KHZhbHVlMikgewogICAgICB0aGlzLiNvdXRwdXRRdWFsaXR5X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY3VycmVudFN0ZXBfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY0KHRoaXMsIF9vdXRwdXRRdWFsaXR5X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2NCh0aGlzLCBfY3VycmVudFN0ZXBfaW5pdGlhbGl6ZXJzLCAiY3JvcCIpKTsKICAgIGdldCBjdXJyZW50U3RlcCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRTdGVwX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY3VycmVudFN0ZXAodmFsdWUyKSB7CiAgICAgIHRoaXMuI2N1cnJlbnRTdGVwX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY3JvcHBlZEltYWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2NCh0aGlzLCBfY3VycmVudFN0ZXBfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczY0KHRoaXMsIF9jcm9wcGVkSW1hZ2VfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGNyb3BwZWRJbWFnZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2Nyb3BwZWRJbWFnZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNyb3BwZWRJbWFnZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY3JvcHBlZEltYWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNQcm9jZXNzaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2NCh0aGlzLCBfY3JvcHBlZEltYWdlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2NCh0aGlzLCBfaXNQcm9jZXNzaW5nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc1Byb2Nlc3NpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc1Byb2Nlc3NpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc1Byb2Nlc3NpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzUHJvY2Vzc2luZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgY3JvcHBlciA9IChfX3J1bkluaXRpYWxpemVyczY0KHRoaXMsIF9pc1Byb2Nlc3NpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgIHdpbmRvd0xheWVyOwogICAgekluZGV4ID0gMDsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1mYW1pbHk6ICR7Y3NzR2Vpc3RGb250RmFtaWx5fTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzMzMiLCAiI2ZmZiIpfTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB6LWluZGV4OiB2YXIoLS16LWluZGV4KTsKICAgICAgfQoKICAgICAgLm1vZGFsLWNvbnRhaW5lciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzBhMGEwYSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDgpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkiKX07CiAgICAgICAgYm94LXNoYWRvdzogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIjAgMjBweCAyNXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDEwcHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4wNCkiLCAiMCAyMHB4IDI1cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMyksIDAgMTBweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpIil9OwogICAgICAgIHdpZHRoOiA0ODBweDsKICAgICAgICBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSAzMnB4KTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTBweCkgc2NhbGUoMC45OCk7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBhbmltYXRpb246IG1vZGFsU2hvdyAwLjI1cyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpIGZvcndhcmRzOwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIG1vZGFsU2hvdyB7CiAgICAgICAgdG8gewogICAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwcHgpIHNjYWxlKDEpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLm1vZGFsLWhlYWRlciB7CiAgICAgICAgaGVpZ2h0OiA1MnB4OwogICAgICAgIHBhZGRpbmc6IDAgMjBweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wNikiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KSIpfTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAubW9kYWwtdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtOwogICAgICB9CgogICAgICAuY2xvc2UtYnV0dG9uIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDEwcHg7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM3MTcxN2EiKX07CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5jbG9zZS1idXR0b246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDUpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICAgIH0KCiAgICAgIC5jbG9zZS1idXR0b246YWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjA4KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpIil9OwogICAgICB9CgogICAgICAubW9kYWwtYm9keSB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiAyMHB4OwogICAgICB9CgogICAgICAuY3JvcHBlci1jb250YWluZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1heC13aWR0aDogMzYwcHg7CiAgICAgICAgYXNwZWN0LXJhdGlvOiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMDAwMCIsICIjMDAwMDAwIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBib3gtc2hhZG93OiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaW5zZXQgMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4wNikiLCAiaW5zZXQgMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSIpfTsKICAgICAgfQoKICAgICAgLnByZXZpZXctY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5wcmV2aWV3LWltYWdlIHsKICAgICAgICB3aWR0aDogMTgwcHg7CiAgICAgICAgaGVpZ2h0OiAxODBweDsKICAgICAgICBvYmplY3QtZml0OiBjb3ZlcjsKICAgICAgICBib3JkZXI6IDRweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMTgxODFiIil9OwogICAgICAgIGJveC1zaGFkb3c6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIwIDEwcHggMTVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4xKSwgMCA0cHggNnB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjA1KSIsICIwIDEwcHggMTVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4zKSwgMCA0cHggNnB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpIil9OwogICAgICB9CgogICAgICAucHJldmlldy1pbWFnZS5yb3VuZCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICAucHJldmlldy1pbWFnZS5zcXVhcmUgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5zdWNjZXNzLW1lc3NhZ2UgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEwcHg7CiAgICAgICAgcGFkZGluZzogMTBweCAyMHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTBiOTgxIiwgIiMxMGI5ODEiKX07CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGFuaW1hdGlvbjogc3VjY2Vzc1B1bHNlIDAuNHMgZWFzZS1vdXQ7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgc3VjY2Vzc1B1bHNlIHsKICAgICAgICAwJSB7IHRyYW5zZm9ybTogc2NhbGUoMC45KTsgb3BhY2l0eTogMDsgfQogICAgICAgIDUwJSB7IHRyYW5zZm9ybTogc2NhbGUoMS4wMik7IH0KICAgICAgICAxMDAlIHsgdHJhbnNmb3JtOiBzY2FsZSgxKTsgb3BhY2l0eTogMTsgfQogICAgICB9CgogICAgICAubW9kYWwtZm9vdGVyIHsKICAgICAgICBwYWRkaW5nOiAyMHB4IDI0cHg7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDYpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNikiKX07CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDEwcHg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmluc3RydWN0aW9ucyB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBsaW5lLWhlaWdodDogMS41OwogICAgICAgIG1heC13aWR0aDogMzIwcHg7CiAgICAgIH0KCiAgICAgIC5sb2FkaW5nLXNwaW5uZXIgewogICAgICAgIHdpZHRoOiA0MHB4OwogICAgICAgIGhlaWdodDogNDBweDsKICAgICAgICBib3JkZXI6IDNweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjEpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSIpfTsKICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjNjBhNWZhIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBhbmltYXRpb246IHNwaW4gMC42cyBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgc3BpbiB7CiAgICAgICAgdG8gewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgewogICAgICAgIC5tb2RhbC1jb250YWluZXIgewogICAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLSAzMnB4KTsKICAgICAgICAgIG1hcmdpbjogMTZweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLm1vZGFsLWJvZHkgewogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICB9CiAgICAgIH0KICAgIGAKICAgIF07CiAgICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgdGhpcy53aW5kb3dMYXllciA9IGF3YWl0IERlZXNXaW5kb3dMYXllci5jcmVhdGVBbmRTaG93KHsKICAgICAgICBibHVyOiB0cnVlCiAgICAgIH0pOwogICAgICB0aGlzLndpbmRvd0xheWVyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gdGhpcy5jbG9zZSgpKTsKICAgICAgdGhpcy56SW5kZXggPSB6SW5kZXhSZWdpc3RyeS5nZXROZXh0WkluZGV4KCk7CiAgICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoIi0tei1pbmRleCIsIHRoaXMuekluZGV4LnRvU3RyaW5nKCkpOwogICAgICB6SW5kZXhSZWdpc3RyeS5yZWdpc3Rlcih0aGlzLCB0aGlzLnpJbmRleCk7CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgaWYgKHRoaXMuY3JvcHBlcikgewogICAgICAgIHRoaXMuY3JvcHBlci5kZXN0cm95KCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMud2luZG93TGF5ZXIpIHsKICAgICAgICBhd2FpdCB0aGlzLndpbmRvd0xheWVyLmRlc3Ryb3koKTsKICAgICAgfQogICAgICB6SW5kZXhSZWdpc3RyeS51bnJlZ2lzdGVyKHRoaXMpOwogICAgfQogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRhaW5lciIgQGNsaWNrPSR7KGUxMSkgPT4gZTExLnN0b3BQcm9wYWdhdGlvbigpfT4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgPGgzIGNsYXNzPSJtb2RhbC10aXRsZSI+CiAgICAgICAgICAgICR7dGhpcy5jdXJyZW50U3RlcCA9PT0gImNyb3AiID8gIkFkanVzdCBJbWFnZSIgOiAiU3VjY2VzcyJ9CiAgICAgICAgICA8L2gzPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xvc2UtYnV0dG9uIiBAY2xpY2s9JHt0aGlzLmNsb3NlfSB0aXRsZT0iQ2xvc2UiPgogICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTp4IiBpY29uU2l6ZT0iMTYiPjwvZGVlcy1pY29uPgogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAke3RoaXMuY3VycmVudFN0ZXAgPT09ICJjcm9wIiA/IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnN0cnVjdGlvbnMiPgogICAgICAgICAgICAgIFBvc2l0aW9uIGFuZCByZXNpemUgdGhlIHNxdWFyZSB0byBzZWxlY3QgeW91ciBwcm9maWxlIGFyZWEKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNyb3BwZXItY29udGFpbmVyIiBpZD0iY3JvcHBlckNvbnRhaW5lciI+PC9kaXY+CiAgICAgICAgICBgIDogYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InByZXZpZXctY29udGFpbmVyIj4KICAgICAgICAgICAgICAke3RoaXMuaXNQcm9jZXNzaW5nID8gYjJgCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2FkaW5nLXNwaW5uZXIiPjwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5zdHJ1Y3Rpb25zIj5TYXZpbmcuLi48L2Rpdj4KICAgICAgICAgICAgICBgIDogYjJgCiAgICAgICAgICAgICAgICA8aW1nIAogICAgICAgICAgICAgICAgICBjbGFzcz0icHJldmlldy1pbWFnZSAke3RoaXMuc2hhcGV9IiAKICAgICAgICAgICAgICAgICAgc3JjPSIke3RoaXMuY3JvcHBlZEltYWdlfSIgCiAgICAgICAgICAgICAgICAgIGFsdD0iQ3JvcHBlZCBwcmV2aWV3IgogICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Y2Nlc3MtbWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOmNoZWNrIiBpY29uU2l6ZT0iMTYiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgICA8c3Bhbj5Mb29raW5nIGdvb2QhPC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgYH0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgfQogICAgICAgIDwvZGl2PgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAke3RoaXMuY3VycmVudFN0ZXAgPT09ICJjcm9wIiA/IGIyYAogICAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iZGVzdHJ1Y3RpdmUiIHNpemU9InNtIiBAY2xpY2s9JHt0aGlzLmNsb3NlfT4KICAgICAgICAgICAgICBDYW5jZWwKICAgICAgICAgICAgPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9ImRlZmF1bHQiIHNpemU9InNtIiBAY2xpY2s9JHt0aGlzLmhhbmRsZUNyb3B9PgogICAgICAgICAgICAgIFNhdmUKICAgICAgICAgICAgPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIGAgOiAiIn0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKCkgewogICAgICBpZiAodGhpcy5jdXJyZW50U3RlcCA9PT0gImNyb3AiKSB7CiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplQ3JvcHBlcigpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBpbml0aWFsaXplQ3JvcHBlcigpIHsKICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290LmdldEVsZW1lbnRCeUlkKCJjcm9wcGVyQ29udGFpbmVyIik7CiAgICAgIGlmICghY29udGFpbmVyKQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5jcm9wcGVyID0gbmV3IEltYWdlQ3JvcHBlcih7CiAgICAgICAgY29udGFpbmVyLAogICAgICAgIGltYWdlOiB0aGlzLmluaXRpYWxJbWFnZSwKICAgICAgICBzaGFwZTogdGhpcy5zaGFwZSwKICAgICAgICBhc3BlY3RSYXRpbzogMSwKICAgICAgICBvdXRwdXRTaXplOiB0aGlzLm91dHB1dFNpemUsCiAgICAgICAgb3V0cHV0UXVhbGl0eTogdGhpcy5vdXRwdXRRdWFsaXR5CiAgICAgIH0pOwogICAgICBhd2FpdCB0aGlzLmNyb3BwZXIuaW5pdGlhbGl6ZSgpOwogICAgfQogICAgYXN5bmMgaGFuZGxlQ3JvcCgpIHsKICAgICAgaWYgKCF0aGlzLmNyb3BwZXIpCiAgICAgICAgcmV0dXJuOwogICAgICB0cnkgewogICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gdHJ1ZTsKICAgICAgICB0aGlzLmN1cnJlbnRTdGVwID0gInByZXZpZXciOwogICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7CiAgICAgICAgY29uc3QgY3JvcHBlZERhdGEgPSBhd2FpdCB0aGlzLmNyb3BwZXIuZ2V0Q3JvcHBlZEltYWdlKCk7CiAgICAgICAgdGhpcy5jcm9wcGVkSW1hZ2UgPSBjcm9wcGVkRGF0YTsKICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHNldFRpbWVvdXQocmVzb2x2ZTIsIDgwMCkpOwogICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgic2F2ZSIsIHsKICAgICAgICAgIGRldGFpbDogeyBjcm9wcGVkSW1hZ2U6IHRoaXMuY3JvcHBlZEltYWdlIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICB0aGlzLmNsb3NlKCk7CiAgICAgICAgfSwgMTUwMCk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgY3JvcHBpbmcgaW1hZ2U6IiwgZXJyb3IpOwogICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGNsb3NlKCkgewogICAgICB0aGlzLnJlbW92ZSgpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM2NChfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gUHJvZmlsZVBpY3R1cmVNb2RhbDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L3Byb2ZpbGVwaWN0dXJlL2RlZXMtaW5wdXQtcHJvZmlsZXBpY3R1cmUuZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgZGVtb0Z1bmM0NCA9ICgpID0+IGIyYAogIDxzdHlsZT4KICAgICR7aWAKICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMjAwcHg7CiAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgIH0KICAgICAgCiAgICAgIGRlZXMtcGFuZWwgewogICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5kZW1vLXJvdyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDQ4cHg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KICAgICAgCiAgICAgIC5kZW1vLW91dHB1dCB7CiAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMTA1LCAyNDIsIDAuMSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsKICAgICAgICBtYXgtaGVpZ2h0OiAxMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgIAogICAgICAuZmVhdHVyZS1saXN0IHsKICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICAgIHBhZGRpbmctbGVmdDogMjBweDsKICAgICAgfQogICAgICAKICAgICAgLmZlYXR1cmUtbGlzdCBsaSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICB9CiAgICBgfQogIDwvc3R5bGU+CiAgCiAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCByb3VuZFByb2ZpbGUgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoJ2RlZXMtaW5wdXQtcHJvZmlsZXBpY3R1cmVbc2hhcGU9InJvdW5kIl0nKTsKICBpZiAocm91bmRQcm9maWxlKSB7CiAgICByb3VuZFByb2ZpbGUuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDsKICAgICAgY29uc29sZS5sb2coIlJvdW5kIHByb2ZpbGUgcGljdHVyZSBjaGFuZ2VkOiIsIHRhcmdldC52YWx1ZT8uc3Vic3RyaW5nKDAsIDUwKSArICIuLi4iKTsKICAgIH0pOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJQcm9maWxlIFBpY3R1cmUgSW5wdXQifSAuc3VidGl0bGU9JHsiQmFzaWMgdXNhZ2Ugd2l0aCByb3VuZCBhbmQgc3F1YXJlIHNoYXBlcyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImRlbW8tcm93Ij4KICAgICAgICAgIDxkZWVzLWlucHV0LXByb2ZpbGVwaWN0dXJlCiAgICAgICAgICAgIGxhYmVsPSJQcm9maWxlIFBpY3R1cmUgKFJvdW5kKSIKICAgICAgICAgICAgZGVzY3JpcHRpb249IkNsaWNrIHRvIHVwbG9hZCBvciBkcmFnICYgZHJvcCBhbiBpbWFnZSIKICAgICAgICAgICAgc2hhcGU9InJvdW5kIgogICAgICAgICAgICBzaXplPSIxMjAiCiAgICAgICAgICA+PC9kZWVzLWlucHV0LXByb2ZpbGVwaWN0dXJlPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1wcm9maWxlcGljdHVyZQogICAgICAgICAgICBsYWJlbD0iUHJvZmlsZSBQaWN0dXJlIChTcXVhcmUpIgogICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3VwcG9ydHMgSlBFRywgUE5HLCBhbmQgV2ViUCBmb3JtYXRzIgogICAgICAgICAgICBzaGFwZT0ic3F1YXJlIgogICAgICAgICAgICBzaXplPSIxMjAiCiAgICAgICAgICA+PC9kZWVzLWlucHV0LXByb2ZpbGVwaWN0dXJlPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CgogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBwcm9maWxlcyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1pbnB1dC1wcm9maWxlcGljdHVyZSIpOwogIHByb2ZpbGVzLmZvckVhY2goKHByb2ZpbGUpID0+IHsKICAgIHByb2ZpbGUuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDsKICAgICAgY29uc29sZS5sb2coYFByb2ZpbGUgKHNpemUgJHt0YXJnZXQuc2l6ZX0pIGNoYW5nZWRgKTsKICAgIH0pOwogIH0pOwp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IlNpemUgVmFyaWF0aW9ucyJ9IC5zdWJ0aXRsZT0keyJQcm9maWxlIHBpY3R1cmVzIGluIGRpZmZlcmVudCBzaXplcyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImRlbW8tcm93Ij4KICAgICAgICAgIDxkZWVzLWlucHV0LXByb2ZpbGVwaWN0dXJlCiAgICAgICAgICAgIGxhYmVsPSJTbWFsbCAoODBweCkiCiAgICAgICAgICAgIHNoYXBlPSJyb3VuZCIKICAgICAgICAgICAgc2l6ZT0iODAiCiAgICAgICAgICA+PC9kZWVzLWlucHV0LXByb2ZpbGVwaWN0dXJlPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1wcm9maWxlcGljdHVyZQogICAgICAgICAgICBsYWJlbD0iTWVkaXVtICgxMjBweCkiCiAgICAgICAgICAgIHNoYXBlPSJyb3VuZCIKICAgICAgICAgICAgc2l6ZT0iMTIwIgogICAgICAgICAgPjwvZGVlcy1pbnB1dC1wcm9maWxlcGljdHVyZT4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtcHJvZmlsZXBpY3R1cmUKICAgICAgICAgICAgbGFiZWw9IkxhcmdlICgxNjBweCkiCiAgICAgICAgICAgIHNoYXBlPSJyb3VuZCIKICAgICAgICAgICAgc2l6ZT0iMTYwIgogICAgICAgICAgPjwvZGVlcy1pbnB1dC1wcm9maWxlcGljdHVyZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgoKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3Qgc2FtcGxlSW1hZ2VVcmwgPSAiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTWpBd0lpQm9aV2xuYUhROUlqSXdNQ0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JajRLSUNBOFpHVm1jejRLSUNBZ0lEeHNhVzVsWVhKSGNtRmthV1Z1ZENCcFpEMGlaM0poWkdsbGJuUWlJSGd4UFNJd0pTSWdlVEU5SWpBbElpQjRNajBpTVRBd0pTSWdlVEk5SWpFd01DVWlQZ29nSUNBZ0lDQThjM1J2Y0NCdlptWnpaWFE5SWpBbElpQnpkRzl3TFdOdmJHOXlQU0lqTmpZM1pXVmhJaUF2UGdvZ0lDQWdJQ0E4YzNSdmNDQnZabVp6WlhROUlqRXdNQ1VpSUhOMGIzQXRZMjlzYjNJOUlpTTNOalJpWVRJaUlDOCtDaUFnSUNBOEwyeHBibVZoY2tkeVlXUnBaVzUwUGdvZ0lEd3ZaR1ZtY3o0S0lDQThjbVZqZENCM2FXUjBhRDBpTWpBd0lpQm9aV2xuYUhROUlqSXdNQ0lnWm1sc2JEMGlkWEpzS0NObmNtRmthV1Z1ZENraUlDOCtDaUFnUEhSbGVIUWdlRDBpTlRBbElpQjVQU0kxTUNVaUlHUnZiV2x1WVc1MExXSmhjMlZzYVc1bFBTSnRhV1JrYkdVaUlIUmxlSFF0WVc1amFHOXlQU0p0YVdSa2JHVWlJR1p2Ym5RdFptRnRhV3g1UFNKQmNtbGhiQ0lnWm05dWRDMXphWHBsUFNJNE1DSWdabWxzYkQwaWQyaHBkR1VpUGtwRVBDOTBaWGgwUGdvOEwzTjJaejQ9IjsKICBjb25zdCBwcmVmaWxsZWRQcm9maWxlID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjcHJlZmlsbGVkLXByb2ZpbGUiKTsKICBpZiAocHJlZmlsbGVkUHJvZmlsZSkgewogICAgcHJlZmlsbGVkUHJvZmlsZS52YWx1ZSA9IHNhbXBsZUltYWdlVXJsOwogICAgcHJlZmlsbGVkUHJvZmlsZS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCAoZXZlbnQpID0+IHsKICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0OwogICAgICBjb25zdCBvdXRwdXQgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoIiNwcmVmaWxsZWQtb3V0cHV0Iik7CiAgICAgIGlmIChvdXRwdXQpIHsKICAgICAgICBvdXRwdXQudGV4dENvbnRlbnQgPSB0YXJnZXQudmFsdWUgPyBgSW1hZ2UgZGF0YTogJHt0YXJnZXQudmFsdWUuc3Vic3RyaW5nKDAsIDgwKX0uLi5gIDogIk5vIGltYWdlIHNlbGVjdGVkIjsKICAgICAgfQogICAgfSk7CiAgfQp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IlByZS1maWxsZWQgYW5kIFZhbHVlIEJpbmRpbmcifSAuc3VidGl0bGU9JHsiUHJvZmlsZSBwaWN0dXJlIHdpdGggaW5pdGlhbCB2YWx1ZSBhbmQgY2hhbmdlIHRyYWNraW5nIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtcHJvZmlsZXBpY3R1cmUKICAgICAgICAgIGlkPSJwcmVmaWxsZWQtcHJvZmlsZSIKICAgICAgICAgIGxhYmVsPSJFZGl0IEV4aXN0aW5nIFByb2ZpbGUiCiAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2xpY2sgdGhlIGVkaXQgYnV0dG9uIHRvIGNoYW5nZSBvciBkZWxldGUgdG8gcmVtb3ZlIgogICAgICAgICAgc2hhcGU9InJvdW5kIgogICAgICAgICAgc2l6ZT0iMTUwIgogICAgICAgID48L2RlZXMtaW5wdXQtcHJvZmlsZXBpY3R1cmU+CiAgICAgICAgCiAgICAgICAgPGRpdiBpZD0icHJlZmlsbGVkLW91dHB1dCIgY2xhc3M9ImRlbW8tb3V0cHV0Ij4KICAgICAgICAgIEltYWdlIGRhdGEgd2lsbCBhcHBlYXIgaGVyZSB3aGVuIGNoYW5nZWQKICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgoKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgZGlzYWJsZWRQcm9maWxlID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjZGlzYWJsZWQtcHJvZmlsZSIpOwogIGlmIChkaXNhYmxlZFByb2ZpbGUpIHsKICAgIGRpc2FibGVkUHJvZmlsZS52YWx1ZSA9ICJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlNakF3SWlCb1pXbG5hSFE5SWpJd01DSWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklqNEtJQ0E4Y21WamRDQjNhV1IwYUQwaU1qQXdJaUJvWldsbmFIUTlJakl3TUNJZ1ptbHNiRDBpSTJOalkyTmpZeUlnTHo0S0lDQThkR1Y0ZENCNFBTSTFNQ1VpSUhrOUlqVXdKU0lnWkc5dGFXNWhiblF0WW1GelpXeHBibVU5SW0xcFpHUnNaU0lnZEdWNGRDMWhibU5vYjNJOUltMXBaR1JzWlNJZ1ptOXVkQzFtWVcxcGJIazlJa0Z5YVdGc0lpQm1iMjUwTFhOcGVtVTlJall3SWlCbWFXeHNQU0ozYUdsMFpTSStUa0U4TDNSbGVIUStDand2YzNablBnPT0iOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJGb3JtIFN0YXRlcyJ9IC5zdWJ0aXRsZT0keyJEaWZmZXJlbnQgc3RhdGVzIGFuZCBjb25maWd1cmF0aW9ucyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImRlbW8tcm93Ij4KICAgICAgICAgIDxkZWVzLWlucHV0LXByb2ZpbGVwaWN0dXJlCiAgICAgICAgICAgIGxhYmVsPSJSZXF1aXJlZCBGaWVsZCIKICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQiCiAgICAgICAgICAgIHNoYXBlPSJyb3VuZCIKICAgICAgICAgICAgLnJlcXVpcmVkPSR7dHJ1ZX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtcHJvZmlsZXBpY3R1cmU+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LXByb2ZpbGVwaWN0dXJlCiAgICAgICAgICAgIGlkPSJkaXNhYmxlZC1wcm9maWxlIgogICAgICAgICAgICBsYWJlbD0iRGlzYWJsZWQgU3RhdGUiCiAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDYW5ub3QgYmUgZWRpdGVkIgogICAgICAgICAgICBzaGFwZT0ic3F1YXJlIgogICAgICAgICAgICAuZGlzYWJsZWQ9JHt0cnVlfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1wcm9maWxlcGljdHVyZT4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtcHJvZmlsZXBpY3R1cmUKICAgICAgICAgICAgbGFiZWw9IlVwbG9hZCBPbmx5IgogICAgICAgICAgICBkZXNjcmlwdGlvbj0iRGVsZXRlIG5vdCBhbGxvd2VkIgogICAgICAgICAgICBzaGFwZT0icm91bmQiCiAgICAgICAgICAgIC5hbGxvd0RlbGV0ZT0ke2ZhbHNlfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1wcm9maWxlcGljdHVyZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgoKICAgIDxkZWVzLWRlbW93cmFwcGVyPgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiRmVhdHVyZXMifSAuc3VidGl0bGU9JHsiQ29tcGxldGUgZmVhdHVyZSBzZXQgb2YgdGhlIHByb2ZpbGUgcGljdHVyZSBpbnB1dCJ9PgogICAgICAgIDx1bCBjbGFzcz0iZmVhdHVyZS1saXN0Ij4KICAgICAgICAgIDxsaT48c3Ryb25nPkltYWdlIFVwbG9hZDo8L3N0cm9uZz4gQ2xpY2sgdG8gdXBsb2FkIG9yIGRyYWcgJiBkcm9wIGltYWdlczwvbGk+CiAgICAgICAgICA8bGk+PHN0cm9uZz5JbWFnZSBDcm9wcGluZzo8L3N0cm9uZz4gSW50ZXJhY3RpdmUgY3JvcCB0b29sIHdpdGggcmVzaXplIGhhbmRsZXM8L2xpPgogICAgICAgICAgPGxpPjxzdHJvbmc+U2hhcGUgU3VwcG9ydDo8L3N0cm9uZz4gUm91bmQgb3Igc3F1YXJlIHByb2ZpbGUgcGljdHVyZXM8L2xpPgogICAgICAgICAgPGxpPjxzdHJvbmc+U2l6ZSBDdXN0b21pemF0aW9uOjwvc3Ryb25nPiBBZGp1c3RhYmxlIGRpbWVuc2lvbnM8L2xpPgogICAgICAgICAgPGxpPjxzdHJvbmc+UHJldmlldyAmIEVkaXQ6PC9zdHJvbmc+IEhvdmVyIG92ZXJsYXkgd2l0aCBlZGl0IGFuZCBkZWxldGUgb3B0aW9uczwvbGk+CiAgICAgICAgICA8bGk+PHN0cm9uZz5GaWxlIFZhbGlkYXRpb246PC9zdHJvbmc+IEZvcm1hdCBhbmQgc2l6ZSByZXN0cmljdGlvbnM8L2xpPgogICAgICAgICAgPGxpPjxzdHJvbmc+UmVzcG9uc2l2ZSBEZXNpZ246PC9zdHJvbmc+IFdvcmtzIG9uIGRlc2t0b3AgYW5kIG1vYmlsZSBkZXZpY2VzPC9saT4KICAgICAgICAgIDxsaT48c3Ryb25nPkZvcm0gSW50ZWdyYXRpb246PC9zdHJvbmc+IFN0YW5kYXJkIGZvcm0gdmFsdWUgYmluZGluZyBhbmQgdmFsaWRhdGlvbjwvbGk+CiAgICAgICAgICA8bGk+PHN0cm9uZz5BY2Nlc3NpYmlsaXR5Ojwvc3Ryb25nPiBLZXlib2FyZCBuYXZpZ2F0aW9uIGFuZCBzY3JlZW4gcmVhZGVyIHN1cHBvcnQ8L2xpPgogICAgICAgICAgPGxpPjxzdHJvbmc+Wi1JbmRleCBNYW5hZ2VtZW50Ojwvc3Ryb25nPiBQcm9wZXIgbW9kYWwgc3RhY2tpbmcgd2l0aCByZWdpc3RyeTwvbGk+CiAgICAgICAgPC91bD4KICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAyNHB4OyI+CiAgICAgICAgICA8c3Ryb25nPlN1cHBvcnRlZCBGb3JtYXRzOjwvc3Ryb25nPiBKUEVHLCBQTkcsIFdlYlA8YnI+CiAgICAgICAgICA8c3Ryb25nPk1heCBGaWxlIFNpemU6PC9zdHJvbmc+IDVNQiAoY29uZmlndXJhYmxlKTxicj4KICAgICAgICAgIDxzdHJvbmc+T3V0cHV0IEZvcm1hdDo8L3N0cm9uZz4gQmFzZTY0IGVuY29kZWQgSlBFRwogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgPC9kaXY+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvcHJvZmlsZXBpY3R1cmUvZGVlcy1pbnB1dC1wcm9maWxlcGljdHVyZS5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2RlZXNfaWNvbigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU2NCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNjUgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNJbnB1dFByb2ZpbGVQaWN0dXJlID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1pbnB1dC1wcm9maWxlcGljdHVyZSIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzSW5wdXRCYXNlOwogIGxldCBfdmFsdWVfZGVjb3JhdG9yczsKICBsZXQgX3ZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NoYXBlX2RlY29yYXRvcnM7CiAgbGV0IF9zaGFwZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NoYXBlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaXplX2RlY29yYXRvcnM7CiAgbGV0IF9zaXplX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2l6ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcGxhY2Vob2xkZXJfZGVjb3JhdG9yczsKICBsZXQgX3BsYWNlaG9sZGVyX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcGxhY2Vob2xkZXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FsbG93VXBsb2FkX2RlY29yYXRvcnM7CiAgbGV0IF9hbGxvd1VwbG9hZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FsbG93VXBsb2FkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hbGxvd0RlbGV0ZV9kZWNvcmF0b3JzOwogIGxldCBfYWxsb3dEZWxldGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hbGxvd0RlbGV0ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWF4RmlsZVNpemVfZGVjb3JhdG9yczsKICBsZXQgX21heEZpbGVTaXplX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWF4RmlsZVNpemVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FjY2VwdGVkRm9ybWF0c19kZWNvcmF0b3JzOwogIGxldCBfYWNjZXB0ZWRGb3JtYXRzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWNjZXB0ZWRGb3JtYXRzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vdXRwdXRTaXplX2RlY29yYXRvcnM7CiAgbGV0IF9vdXRwdXRTaXplX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfb3V0cHV0U2l6ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfb3V0cHV0UXVhbGl0eV9kZWNvcmF0b3JzOwogIGxldCBfb3V0cHV0UXVhbGl0eV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX291dHB1dFF1YWxpdHlfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzSG92ZXJlZF9kZWNvcmF0b3JzOwogIGxldCBfaXNIb3ZlcmVkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNIb3ZlcmVkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0RyYWdnaW5nX2RlY29yYXRvcnM7CiAgbGV0IF9pc0RyYWdnaW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNEcmFnZ2luZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNMb2FkaW5nX2RlY29yYXRvcnM7CiAgbGV0IF9pc0xvYWRpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0lucHV0UHJvZmlsZVBpY3R1cmUyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfdmFsdWVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9zaGFwZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3NpemVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF9wbGFjZWhvbGRlcl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2FsbG93VXBsb2FkX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2FsbG93RGVsZXRlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX21heEZpbGVTaXplX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfYWNjZXB0ZWRGb3JtYXRzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF9vdXRwdXRTaXplX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfb3V0cHV0UXVhbGl0eV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX2lzSG92ZXJlZF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaXNEcmFnZ2luZ19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaXNMb2FkaW5nX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTY0KHRoaXMsIG51bGwsIF92YWx1ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2YWx1ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmFsdWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmFsdWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZhbHVlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZhbHVlX2luaXRpYWxpemVycywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjQodGhpcywgbnVsbCwgX3NoYXBlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNoYXBlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaGFwZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaGFwZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hhcGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hhcGVfaW5pdGlhbGl6ZXJzLCBfc2hhcGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2NCh0aGlzLCBudWxsLCBfc2l6ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaXplIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaXplIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNpemUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNpemUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2l6ZV9pbml0aWFsaXplcnMsIF9zaXplX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjQodGhpcywgbnVsbCwgX3BsYWNlaG9sZGVyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInBsYWNlaG9sZGVyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJwbGFjZWhvbGRlciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5wbGFjZWhvbGRlciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucGxhY2Vob2xkZXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcGxhY2Vob2xkZXJfaW5pdGlhbGl6ZXJzLCBfcGxhY2Vob2xkZXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2NCh0aGlzLCBudWxsLCBfYWxsb3dVcGxvYWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYWxsb3dVcGxvYWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFsbG93VXBsb2FkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmFsbG93VXBsb2FkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hbGxvd1VwbG9hZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hbGxvd1VwbG9hZF9pbml0aWFsaXplcnMsIF9hbGxvd1VwbG9hZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY0KHRoaXMsIG51bGwsIF9hbGxvd0RlbGV0ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhbGxvd0RlbGV0ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYWxsb3dEZWxldGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWxsb3dEZWxldGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFsbG93RGVsZXRlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FsbG93RGVsZXRlX2luaXRpYWxpemVycywgX2FsbG93RGVsZXRlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjQodGhpcywgbnVsbCwgX21heEZpbGVTaXplX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1heEZpbGVTaXplIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtYXhGaWxlU2l6ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYXhGaWxlU2l6ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWF4RmlsZVNpemUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWF4RmlsZVNpemVfaW5pdGlhbGl6ZXJzLCBfbWF4RmlsZVNpemVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2NCh0aGlzLCBudWxsLCBfYWNjZXB0ZWRGb3JtYXRzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFjY2VwdGVkRm9ybWF0cyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYWNjZXB0ZWRGb3JtYXRzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmFjY2VwdGVkRm9ybWF0cywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYWNjZXB0ZWRGb3JtYXRzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FjY2VwdGVkRm9ybWF0c19pbml0aWFsaXplcnMsIF9hY2NlcHRlZEZvcm1hdHNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2NCh0aGlzLCBudWxsLCBfb3V0cHV0U2l6ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJvdXRwdXRTaXplIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJvdXRwdXRTaXplIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm91dHB1dFNpemUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm91dHB1dFNpemUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfb3V0cHV0U2l6ZV9pbml0aWFsaXplcnMsIF9vdXRwdXRTaXplX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjQodGhpcywgbnVsbCwgX291dHB1dFF1YWxpdHlfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAib3V0cHV0UXVhbGl0eSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAib3V0cHV0UXVhbGl0eSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5vdXRwdXRRdWFsaXR5LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5vdXRwdXRRdWFsaXR5ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX291dHB1dFF1YWxpdHlfaW5pdGlhbGl6ZXJzLCBfb3V0cHV0UXVhbGl0eV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY0KHRoaXMsIG51bGwsIF9pc0hvdmVyZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNIb3ZlcmVkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc0hvdmVyZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNIb3ZlcmVkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc0hvdmVyZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNIb3ZlcmVkX2luaXRpYWxpemVycywgX2lzSG92ZXJlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY0KHRoaXMsIG51bGwsIF9pc0RyYWdnaW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzRHJhZ2dpbmciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImlzRHJhZ2dpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNEcmFnZ2luZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNEcmFnZ2luZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pc0RyYWdnaW5nX2luaXRpYWxpemVycywgX2lzRHJhZ2dpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2NCh0aGlzLCBudWxsLCBfaXNMb2FkaW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzTG9hZGluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNMb2FkaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzTG9hZGluZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNMb2FkaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzTG9hZGluZ19pbml0aWFsaXplcnMsIF9pc0xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2NChudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNJbnB1dFByb2ZpbGVQaWN0dXJlMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jNDQ7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiSW5wdXQiXTsKICAgICN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM2NSh0aGlzLCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgLy8gQmFzZTY0IGVuY29kZWQgaW1hZ2Ugb3IgVVJMCiAgICBzZXQgdmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hhcGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY1KHRoaXMsIF92YWx1ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjUodGhpcywgX3NoYXBlX2luaXRpYWxpemVycywgInJvdW5kIikpOwogICAgZ2V0IHNoYXBlKCkgewogICAgICByZXR1cm4gdGhpcy4jc2hhcGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaGFwZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2hhcGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2NSh0aGlzLCBfc2hhcGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczY1KHRoaXMsIF9zaXplX2luaXRpYWxpemVycywgMTIwKSk7CiAgICBnZXQgc2l6ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NpemVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaXplKHZhbHVlMikgewogICAgICB0aGlzLiNzaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcGxhY2Vob2xkZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY1KHRoaXMsIF9zaXplX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2NSh0aGlzLCBfcGxhY2Vob2xkZXJfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IHBsYWNlaG9sZGVyKCkgewogICAgICByZXR1cm4gdGhpcy4jcGxhY2Vob2xkZXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwbGFjZWhvbGRlcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jcGxhY2Vob2xkZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhbGxvd1VwbG9hZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjUodGhpcywgX3BsYWNlaG9sZGVyX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2NSh0aGlzLCBfYWxsb3dVcGxvYWRfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgYWxsb3dVcGxvYWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhbGxvd1VwbG9hZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFsbG93VXBsb2FkKHZhbHVlMikgewogICAgICB0aGlzLiNhbGxvd1VwbG9hZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2FsbG93RGVsZXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2NSh0aGlzLCBfYWxsb3dVcGxvYWRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczY1KHRoaXMsIF9hbGxvd0RlbGV0ZV9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBhbGxvd0RlbGV0ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FsbG93RGVsZXRlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYWxsb3dEZWxldGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2FsbG93RGVsZXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWF4RmlsZVNpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY1KHRoaXMsIF9hbGxvd0RlbGV0ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjUodGhpcywgX21heEZpbGVTaXplX2luaXRpYWxpemVycywgNSAqIDEwMjQgKiAxMDI0KSk7CiAgICBnZXQgbWF4RmlsZVNpemUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtYXhGaWxlU2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgLy8gNU1CCiAgICBzZXQgbWF4RmlsZVNpemUodmFsdWUyKSB7CiAgICAgIHRoaXMuI21heEZpbGVTaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYWNjZXB0ZWRGb3JtYXRzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2NSh0aGlzLCBfbWF4RmlsZVNpemVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczY1KHRoaXMsIF9hY2NlcHRlZEZvcm1hdHNfaW5pdGlhbGl6ZXJzLCBbImltYWdlL2pwZWciLCAiaW1hZ2UvcG5nIiwgImltYWdlL3dlYnAiXSkpOwogICAgZ2V0IGFjY2VwdGVkRm9ybWF0cygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FjY2VwdGVkRm9ybWF0c19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFjY2VwdGVkRm9ybWF0cyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYWNjZXB0ZWRGb3JtYXRzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjb3V0cHV0U2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjUodGhpcywgX2FjY2VwdGVkRm9ybWF0c19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjUodGhpcywgX291dHB1dFNpemVfaW5pdGlhbGl6ZXJzLCA4MDApKTsKICAgIGdldCBvdXRwdXRTaXplKCkgewogICAgICByZXR1cm4gdGhpcy4jb3V0cHV0U2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgLy8gT3V0cHV0IHJlc29sdXRpb24gaW4gcGl4ZWxzCiAgICBzZXQgb3V0cHV0U2l6ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jb3V0cHV0U2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI291dHB1dFF1YWxpdHlfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY1KHRoaXMsIF9vdXRwdXRTaXplX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2NSh0aGlzLCBfb3V0cHV0UXVhbGl0eV9pbml0aWFsaXplcnMsIDAuOTUpKTsKICAgIGdldCBvdXRwdXRRdWFsaXR5KCkgewogICAgICByZXR1cm4gdGhpcy4jb3V0cHV0UXVhbGl0eV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgLy8gMC0xIHF1YWxpdHkgZm9yIEpQRUcKICAgIHNldCBvdXRwdXRRdWFsaXR5KHZhbHVlMikgewogICAgICB0aGlzLiNvdXRwdXRRdWFsaXR5X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNIb3ZlcmVkX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2NSh0aGlzLCBfb3V0cHV0UXVhbGl0eV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjUodGhpcywgX2lzSG92ZXJlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaXNIb3ZlcmVkKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNIb3ZlcmVkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaXNIb3ZlcmVkKHZhbHVlMikgewogICAgICB0aGlzLiNpc0hvdmVyZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpc0RyYWdnaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2NSh0aGlzLCBfaXNIb3ZlcmVkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2NSh0aGlzLCBfaXNEcmFnZ2luZ19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaXNEcmFnZ2luZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzRHJhZ2dpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc0RyYWdnaW5nKHZhbHVlMikgewogICAgICB0aGlzLiNpc0RyYWdnaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNMb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2NSh0aGlzLCBfaXNEcmFnZ2luZ19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjUodGhpcywgX2lzTG9hZGluZ19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaXNMb2FkaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNMb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaXNMb2FkaW5nKHZhbHVlMikgewogICAgICB0aGlzLiNpc0xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIG1vZGFsSW5zdGFuY2UgPSAoX19ydW5Jbml0aWFsaXplcnM2NSh0aGlzLCBfaXNMb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgbnVsbCk7CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIC4uLkRlZXNJbnB1dEJhc2UuYmFzZVN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuaW5wdXQtd3JhcHBlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogMTZweDsKICAgICAgfQoKICAgICAgLnByb2ZpbGUtY29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOwogICAgICB9CgogICAgICAucHJvZmlsZS1jb250YWluZXI6aG92ZXIgewogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wMik7CiAgICAgIH0KCiAgICAgIC5wcm9maWxlLXBpY3R1cmUgewogICAgICAgIHdpZHRoOiB2YXIoLS1zaXplLCAxMjBweCk7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1zaXplLCAxMjBweCk7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmNWY1ZjUiLCAiIzE4MTgxYiIpfTsKICAgICAgICBib3JkZXI6IDNweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOwogICAgICB9CgogICAgICAucHJvZmlsZS1waWN0dXJlLnJvdW5kIHsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIH0KCiAgICAgIC5wcm9maWxlLXBpY3R1cmUuc3F1YXJlIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgICB9CgogICAgICAucHJvZmlsZS1waWN0dXJlLmRyYWdnaW5nIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiM2MGE1ZmEiKX07CiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgNHB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDU5LCAxMzAsIDI0NiwgMC4xNSkiLCAicmdiYSg5NiwgMTY1LCAyNTAsIDAuMTUpIil9OwogICAgICB9CgogICAgICAucHJvZmlsZS1waWN0dXJlOmhvdmVyIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDRkNGQ4IiwgIiMzZjNmNDYiKX07CiAgICAgIH0KCiAgICAgIC5wcm9maWxlLXBpY3R1cmU6ZGlzYWJsZWQgewogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAucHJvZmlsZS1pbWFnZSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG9iamVjdC1maXQ6IGNvdmVyOwogICAgICB9CgogICAgICAucGxhY2Vob2xkZXItaWNvbiB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiNhMWExYWEiKX07CiAgICAgIH0KCiAgICAgIC5vdmVybGF5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgZWFzZTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLnByb2ZpbGUtY29udGFpbmVyOmhvdmVyIC5vdmVybGF5IHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAub3ZlcmxheS1jb250ZW50IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogMTJweDsKICAgICAgfQoKICAgICAgLm92ZXJsYXktYnV0dG9uIHsKICAgICAgICB3aWR0aDogNDBweDsKICAgICAgICBoZWlnaHQ6IDQwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpIiwgInJnYmEoMzksIDM5LCA0MiwgMC45NSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4xKSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMSk7CiAgICAgIH0KCiAgICAgIC5vdmVybGF5LWJ1dHRvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzNmM2Y0NiIpfTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMSk7CiAgICAgICAgYm94LXNoYWRvdzogMCA0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7CiAgICAgIH0KCiAgICAgIC5vdmVybGF5LWJ1dHRvbi5kZWxldGUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDIzOSwgNjgsIDY4LCAwLjkpIiwgInJnYmEoMjIwLCAzOCwgMzgsIDAuOSkiKX07CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC5vdmVybGF5LWJ1dHRvbi5kZWxldGU6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZWY0NDQ0IiwgIiNkYzI2MjYiKX07CiAgICAgIH0KCiAgICAgIC5kcm9wLXpvbmUtdGV4dCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5oaWRkZW4taW5wdXQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIExvYWRpbmcgYW5pbWF0aW9uICovCiAgICAgIC5sb2FkaW5nLW92ZXJsYXkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KSIsICJyZ2JhKDAsIDAsIDAsIDAuOCkiKX07CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZTsKICAgICAgfQoKICAgICAgLmxvYWRpbmctb3ZlcmxheS5zaG93IHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICB9CgogICAgICAubG9hZGluZy1zcGlubmVyIHsKICAgICAgICB3aWR0aDogNDBweDsKICAgICAgICBoZWlnaHQ6IDQwcHg7CiAgICAgICAgYm9yZGVyOiAzcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4xKSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkiKX07CiAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzYwYTVmYSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYW5pbWF0aW9uOiBzcGluIDAuNnMgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIHNwaW4gewogICAgICAgIHRvIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIHB1bHNlIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wNSk7CiAgICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgfQogICAgICB9CgogICAgICAucHJvZmlsZS1waWN0dXJlLmNsaWNraW5nIHsKICAgICAgICBhbmltYXRpb246IHB1bHNlIDAuM3MgZWFzZS1vdXQ7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgICAgPGRlZXMtbGFiZWwgLmxhYmVsPSR7dGhpcy5sYWJlbH0gLmRlc2NyaXB0aW9uPSR7dGhpcy5kZXNjcmlwdGlvbn0gLnJlcXVpcmVkPSR7dGhpcy5yZXF1aXJlZH0+PC9kZWVzLWxhYmVsPgogICAgICAgIAogICAgICAgIDxkaXYgCiAgICAgICAgICBjbGFzcz0icHJvZmlsZS1jb250YWluZXIiCiAgICAgICAgICBAY2xpY2s9JHt0aGlzLmhhbmRsZUNsaWNrfQogICAgICAgICAgQGRyYWdvdmVyPSR7dGhpcy5oYW5kbGVEcmFnT3Zlcn0KICAgICAgICAgIEBkcmFnbGVhdmU9JHt0aGlzLmhhbmRsZURyYWdMZWF2ZX0KICAgICAgICAgIEBkcm9wPSR7dGhpcy5oYW5kbGVEcm9wfQogICAgICAgICAgc3R5bGU9Ii0tc2l6ZTogJHt0aGlzLnNpemV9cHgiCiAgICAgICAgPgogICAgICAgICAgPGRpdiBjbGFzcz0icHJvZmlsZS1waWN0dXJlICR7dGhpcy5zaGFwZX0gJHt0aGlzLmlzRHJhZ2dpbmcgPyAiZHJhZ2dpbmciIDogIiJ9ICR7dGhpcy5pc0xvYWRpbmcgJiYgIXRoaXMudmFsdWUgPyAiY2xpY2tpbmciIDogIiJ9Ij4KICAgICAgICAgICAgJHt0aGlzLnZhbHVlID8gYjJgCiAgICAgICAgICAgICAgPGltZyBjbGFzcz0icHJvZmlsZS1pbWFnZSIgc3JjPSIke3RoaXMudmFsdWV9IiBhbHQ9IlByb2ZpbGUgcGljdHVyZSIgLz4KICAgICAgICAgICAgYCA6IGIyYAogICAgICAgICAgICAgIDxkZWVzLWljb24gY2xhc3M9InBsYWNlaG9sZGVyLWljb24iIGljb249Imx1Y2lkZTp1c2VyIiBpY29uU2l6ZT0iJHt0aGlzLnNpemUgKiAwLjV9Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgYH0KICAgICAgICAgICAgCiAgICAgICAgICAgICR7dGhpcy5pc0RyYWdnaW5nID8gYjJgCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3ZlcmxheSIgc3R5bGU9Im9wYWNpdHk6IDEiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZHJvcC16b25lLXRleHQiPgogICAgICAgICAgICAgICAgICBEcm9wIGltYWdlIGhlcmUKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgIAogICAgICAgICAgICAke3RoaXMudmFsdWUgJiYgIXRoaXMuZGlzYWJsZWQgPyBiMmAKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJvdmVybGF5Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im92ZXJsYXktY29udGVudCI+CiAgICAgICAgICAgICAgICAgICR7dGhpcy5hbGxvd1VwbG9hZCA/IGIyYAogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Im92ZXJsYXktYnV0dG9uIiBAY2xpY2s9JHsoZTExKSA9PiB7CiAgICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIHRoaXMub3Blbk1vZGFsKCk7CiAgICAgIH19IHRpdGxlPSJDaGFuZ2UgcGljdHVyZSI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpwZW5jaWwiIGljb25TaXplPSIyMCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICAgICAgJHt0aGlzLmFsbG93RGVsZXRlID8gYjJgCiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ib3ZlcmxheS1idXR0b24gZGVsZXRlIiBAY2xpY2s9JHsoZTExKSA9PiB7CiAgICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIHRoaXMuZGVsZXRlUGljdHVyZSgpOwogICAgICB9fSB0aXRsZT0iRGVsZXRlIHBpY3R1cmUiPgogICAgICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6dHJhc2gyIiBpY29uU2l6ZT0iMjAiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYCA6ICIifQogICAgICAgICAgICAKICAgICAgICAgICAgJHt0aGlzLmlzTG9hZGluZyAmJiAhdGhpcy52YWx1ZSA/IGIyYAogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxvYWRpbmctb3ZlcmxheSBzaG93Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxvYWRpbmctc3Bpbm5lciI+PC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIAogICAgICAgIDxpbnB1dAogICAgICAgICAgdHlwZT0iZmlsZSIKICAgICAgICAgIGNsYXNzPSJoaWRkZW4taW5wdXQiCiAgICAgICAgICBhY2NlcHQ9IiR7dGhpcy5hY2NlcHRlZEZvcm1hdHMuam9pbigiLCIpfSIKICAgICAgICAgIEBjaGFuZ2U9JHt0aGlzLmhhbmRsZUZpbGVTZWxlY3R9CiAgICAgICAgLz4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgaGFuZGxlQ2xpY2soKSB7CiAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8ICF0aGlzLmFsbG93VXBsb2FkKQogICAgICAgIHJldHVybjsKICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7CiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlOwogICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5oaWRkZW4taW5wdXQiKTsKICAgICAgICBjb25zdCBoYW5kbGVGb2N1cyA9ICgpID0+IHsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICBpZiAoIWlucHV0LmZpbGVzIHx8IGlucHV0LmZpbGVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3VzIiwgaGFuZGxlRm9jdXMpOwogICAgICAgICAgfSwgMzAwKTsKICAgICAgICB9OwogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsIGhhbmRsZUZvY3VzKTsKICAgICAgICBpbnB1dC5jbGljaygpOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVGaWxlU2VsZWN0KGV2ZW50KSB7CiAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0OwogICAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXM/LlswXTsKICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTsKICAgICAgaWYgKGZpbGUpIHsKICAgICAgICB0aGlzLnByb2Nlc3NGaWxlKGZpbGUpOwogICAgICB9CiAgICAgIGlucHV0LnZhbHVlID0gIiI7CiAgICB9CiAgICBoYW5kbGVEcmFnT3ZlcihldmVudCkgewogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgdGhpcy5hbGxvd1VwbG9hZCkgewogICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZURyYWdMZWF2ZSgpIHsKICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7CiAgICB9CiAgICBoYW5kbGVEcm9wKGV2ZW50KSB7CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlOwogICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAhdGhpcy5hbGxvd1VwbG9hZCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGZpbGUgPSBldmVudC5kYXRhVHJhbnNmZXI/LmZpbGVzWzBdOwogICAgICBpZiAoZmlsZSkgewogICAgICAgIHRoaXMucHJvY2Vzc0ZpbGUoZmlsZSk7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIHByb2Nlc3NGaWxlKGZpbGUpIHsKICAgICAgaWYgKCF0aGlzLmFjY2VwdGVkRm9ybWF0cy5pbmNsdWRlcyhmaWxlLnR5cGUpKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiSW52YWxpZCBmaWxlIHR5cGU6IiwgZmlsZS50eXBlKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGZpbGUuc2l6ZSA+IHRoaXMubWF4RmlsZVNpemUpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJGaWxlIHRvbyBsYXJnZToiLCBmaWxlLnNpemUpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwogICAgICByZWFkZXIub25sb2FkID0gYXN5bmMgKGUxMSkgPT4gewogICAgICAgIGNvbnN0IGJhc2U2NDIgPSBlMTEudGFyZ2V0Py5yZXN1bHQ7CiAgICAgICAgYXdhaXQgdGhpcy5vcGVuTW9kYWwoYmFzZTY0Mik7CiAgICAgIH07CiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpOwogICAgfQogICAgYXN5bmMgb3Blbk1vZGFsKGluaXRpYWxJbWFnZSkgewogICAgICBjb25zdCBpbWFnZVRvRWRpdCA9IGluaXRpYWxJbWFnZSB8fCB0aGlzLnZhbHVlOwogICAgICBpZiAoIWltYWdlVG9FZGl0KSB7CiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmhpZGRlbi1pbnB1dCIpOwogICAgICAgIGlucHV0LmNsaWNrKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMubW9kYWxJbnN0YW5jZSA9IG5ldyBQcm9maWxlUGljdHVyZU1vZGFsKCk7CiAgICAgIHRoaXMubW9kYWxJbnN0YW5jZS5zaGFwZSA9IHRoaXMuc2hhcGU7CiAgICAgIHRoaXMubW9kYWxJbnN0YW5jZS5pbml0aWFsSW1hZ2UgPSBpbWFnZVRvRWRpdDsKICAgICAgdGhpcy5tb2RhbEluc3RhbmNlLm91dHB1dFNpemUgPSB0aGlzLm91dHB1dFNpemU7CiAgICAgIHRoaXMubW9kYWxJbnN0YW5jZS5vdXRwdXRRdWFsaXR5ID0gdGhpcy5vdXRwdXRRdWFsaXR5OwogICAgICB0aGlzLm1vZGFsSW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcigic2F2ZSIsIChldmVudCkgPT4gewogICAgICAgIHRoaXMudmFsdWUgPSBldmVudC5kZXRhaWwuY3JvcHBlZEltYWdlOwogICAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMpOwogICAgICB9KTsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLm1vZGFsSW5zdGFuY2UpOwogICAgfQogICAgZGVsZXRlUGljdHVyZSgpIHsKICAgICAgdGhpcy52YWx1ZSA9ICIiOwogICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgIH0KICAgIGdldFZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy52YWx1ZTsKICAgIH0KICAgIHNldFZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLnZhbHVlID0gdmFsdWUyOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM2NShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0lucHV0UHJvZmlsZVBpY3R1cmUyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1jaGlwcy9kZWVzLWNoaXBzLmRlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW9GdW5jNDUgPSAoKSA9PiBiMmAKICA8c3R5bGU+CiAgICAuZGVtb0NvbnRhaW5lciB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIGdhcDogMzJweDsKICAgICAgcGFkZGluZzogNDhweDsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOGY5ZmEiLCAiIzBhMGEwYSIpfTsKICAgICAgbWluLWhlaWdodDogMTAwdmg7CiAgICB9CiAgICAKICAgIC5zZWN0aW9uIHsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzE4MTgxYiIpfTsKICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICBwYWRkaW5nOiAyNHB4OwogICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEpOwogICAgfQogICAgCiAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICB9CiAgICAKICAgIC5zZWN0aW9uLWRlc2NyaXB0aW9uIHsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgIH0KICA8L3N0eWxlPgogIDxkaXYgY2xhc3M9ImRlbW9Db250YWluZXIiPgogICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPk5vbi1TZWxlY3RhYmxlIENoaXBzPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPkJhc2ljIGNoaXBzIHdpdGhvdXQgc2VsZWN0aW9uIGNhcGFiaWxpdHkuIFVzZSBmb3IgZGlzcGxheS1vbmx5IHRhZ3MuPC9kaXY+CiAgICAgIDxkZWVzLWNoaXBzCiAgICAgICAgc2VsZWN0aW9uTW9kZT0ibm9uZSIKICAgICAgICAuc2VsZWN0YWJsZUNoaXBzPSR7WwogIHsga2V5OiAic3RhdHVzIiwgdmFsdWU6ICJBY3RpdmUiIH0sCiAgeyBrZXk6ICJ0aWVyIiwgdmFsdWU6ICJQcmVtaXVtIiB9LAogIHsga2V5OiAicmVnaW9uIiwgdmFsdWU6ICJFVS1XZXN0IiB9LAogIHsga2V5OiAidHlwZSIsIHZhbHVlOiAiRW50ZXJwcmlzZSIgfQpdfQogICAgICA+PC9kZWVzLWNoaXBzPgogICAgPC9kaXY+CiAgICAKICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5TaW5nbGUgU2VsZWN0aW9uIENoaXBzPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPkNsaWNrIHRvIHNlbGVjdCBvbmUgY2hpcCBhdCBhIHRpbWUuIFVzZWZ1bCBmb3IgZmlsdGVycyBhbmQgb3B0aW9ucy48L2Rpdj4KICAgICAgPGRlZXMtY2hpcHMKICAgICAgICBzZWxlY3Rpb25Nb2RlPSJzaW5nbGUiCiAgICAgICAgLnNlbGVjdGFibGVDaGlwcz0ke1sKICB7IGtleTogImFsbCIsIHZhbHVlOiAiQWxsIFByb2plY3RzIiB9LAogIHsga2V5OiAiYWN0aXZlIiwgdmFsdWU6ICJBY3RpdmUiIH0sCiAgeyBrZXk6ICJhcmNoaXZlZCIsIHZhbHVlOiAiQXJjaGl2ZWQiIH0sCiAgeyBrZXk6ICJkcmFmdHMiLCB2YWx1ZTogIkRyYWZ0cyIgfQpdfQogICAgICA+PC9kZWVzLWNoaXBzPgogICAgPC9kaXY+CiAgICAKICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5NdWx0aXBsZSBTZWxlY3Rpb24gQ2hpcHM8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+U2VsZWN0IG11bHRpcGxlIGNoaXBzIHNpbXVsdGFuZW91c2x5LiBHcmVhdCBmb3IgdGFnIHNlbGVjdGlvbi48L2Rpdj4KICAgICAgPGRlZXMtY2hpcHMKICAgICAgICBzZWxlY3Rpb25Nb2RlPSJtdWx0aXBsZSIKICAgICAgICAuc2VsZWN0YWJsZUNoaXBzPSR7WwogIHsga2V5OiAianMiLCB2YWx1ZTogIkphdmFTY3JpcHQiIH0sCiAgeyBrZXk6ICJ0cyIsIHZhbHVlOiAiVHlwZVNjcmlwdCIgfSwKICB7IGtleTogInJlYWN0IiwgdmFsdWU6ICJSZWFjdCIgfSwKICB7IGtleTogInZ1ZSIsIHZhbHVlOiAiVnVlIiB9LAogIHsga2V5OiAiYW5ndWxhciIsIHZhbHVlOiAiQW5ndWxhciIgfSwKICB7IGtleTogIm5vZGUiLCB2YWx1ZTogIk5vZGUuanMiIH0KXX0KICAgICAgPjwvZGVlcy1jaGlwcz4KICAgIDwvZGl2PgogICAgCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+UmVtb3ZhYmxlIENoaXBzIHdpdGggS2V5czwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5DaGlwcyB3aXRoIHJlbW92ZSBidXR0b25zIGFuZCBrZXktdmFsdWUgcGFpcnMuIFBlcmZlY3QgZm9yIGR5bmFtaWMgbGlzdHMuPC9kaXY+CiAgICAgIDxkZWVzLWNoaXBzCiAgICAgICAgc2VsZWN0aW9uTW9kZT0ic2luZ2xlIgogICAgICAgIGNoaXBzQXJlUmVtb3ZhYmxlCiAgICAgICAgLnNlbGVjdGFibGVDaGlwcz0ke1sKICB7IGtleTogImVudiIsIHZhbHVlOiAiUHJvZHVjdGlvbiIgfSwKICB7IGtleTogInZlcnNpb24iLCB2YWx1ZTogIjIuNC4xIiB9LAogIHsga2V5OiAiYnJhbmNoIiwgdmFsdWU6ICJtYWluIiB9LAogIHsga2V5OiAiYXV0aG9yIiwgdmFsdWU6ICJKb2huIERvZSIgfQpdfQogICAgICA+PC9kZWVzLWNoaXBzPgogICAgPC9kaXY+CiAgICAKICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5NaXhlZCBDb250ZW50IEV4YW1wbGU8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+Q29tYmluaW5nIGRpZmZlcmVudCBjaGlwIHR5cGVzIGZvciBjb21wbGV4IFVJcy48L2Rpdj4KICAgICAgPGRlZXMtY2hpcHMKICAgICAgICBzZWxlY3Rpb25Nb2RlPSJtdWx0aXBsZSIKICAgICAgICBjaGlwc0FyZVJlbW92YWJsZQogICAgICAgIC5zZWxlY3RhYmxlQ2hpcHM9JHtbCiAgeyBrZXk6ICJwcmlvcml0eSIsIHZhbHVlOiAiSGlnaCIgfSwKICB7IGtleTogInN0YXR1cyIsIHZhbHVlOiAiSW4gUHJvZ3Jlc3MiIH0sCiAgeyBrZXk6ICJidWciLCB2YWx1ZTogIkJ1ZyIgfSwKICB7IGtleTogImZlYXR1cmUiLCB2YWx1ZTogIkZlYXR1cmUiIH0sCiAgeyBrZXk6ICJzcHJpbnQiLCB2YWx1ZTogIlNwcmludCAyMyIgfSwKICB7IGtleTogImFzc2lnbmVlIiwgdmFsdWU6ICJBbGljZSIgfQpdfQogICAgICA+PC9kZWVzLWNoaXBzPgogICAgPC9kaXY+CiAgPC9kaXY+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbGF5b3V0L2RlZXMtY2hpcHMvZGVlcy1jaGlwcy5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2Rpc3RfdHMyNSgpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU2NSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNjYgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNDaGlwcyA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtY2hpcHMiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9zZWxlY3Rpb25Nb2RlX2RlY29yYXRvcnM7CiAgbGV0IF9zZWxlY3Rpb25Nb2RlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0aW9uTW9kZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2hpcHNBcmVSZW1vdmFibGVfZGVjb3JhdG9yczsKICBsZXQgX2NoaXBzQXJlUmVtb3ZhYmxlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2hpcHNBcmVSZW1vdmFibGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGFibGVDaGlwc19kZWNvcmF0b3JzOwogIGxldCBfc2VsZWN0YWJsZUNoaXBzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0YWJsZUNoaXBzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZENoaXBfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkQ2hpcF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkQ2hpcF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRDaGlwc19kZWNvcmF0b3JzOwogIGxldCBfc2VsZWN0ZWRDaGlwc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkQ2hpcHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0NoaXBzMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3NlbGVjdGlvbk1vZGVfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX2NoaXBzQXJlUmVtb3ZhYmxlX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEJvb2xlYW4KICAgICAgfSldOwogICAgICBfc2VsZWN0YWJsZUNoaXBzX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEFycmF5CiAgICAgIH0pXTsKICAgICAgX3NlbGVjdGVkQ2hpcF9kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfc2VsZWN0ZWRDaGlwc19kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBBcnJheQogICAgICB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTY1KHRoaXMsIG51bGwsIF9zZWxlY3Rpb25Nb2RlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlbGVjdGlvbk1vZGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlbGVjdGlvbk1vZGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0aW9uTW9kZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VsZWN0aW9uTW9kZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWxlY3Rpb25Nb2RlX2luaXRpYWxpemVycywgX3NlbGVjdGlvbk1vZGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2NSh0aGlzLCBudWxsLCBfY2hpcHNBcmVSZW1vdmFibGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY2hpcHNBcmVSZW1vdmFibGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNoaXBzQXJlUmVtb3ZhYmxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNoaXBzQXJlUmVtb3ZhYmxlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jaGlwc0FyZVJlbW92YWJsZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jaGlwc0FyZVJlbW92YWJsZV9pbml0aWFsaXplcnMsIF9jaGlwc0FyZVJlbW92YWJsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY1KHRoaXMsIG51bGwsIF9zZWxlY3RhYmxlQ2hpcHNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0YWJsZUNoaXBzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3RhYmxlQ2hpcHMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0YWJsZUNoaXBzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3RhYmxlQ2hpcHMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0YWJsZUNoaXBzX2luaXRpYWxpemVycywgX3NlbGVjdGFibGVDaGlwc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY1KHRoaXMsIG51bGwsIF9zZWxlY3RlZENoaXBfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0ZWRDaGlwIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3RlZENoaXAiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0ZWRDaGlwLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3RlZENoaXAgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0ZWRDaGlwX2luaXRpYWxpemVycywgX3NlbGVjdGVkQ2hpcF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY1KHRoaXMsIG51bGwsIF9zZWxlY3RlZENoaXBzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlbGVjdGVkQ2hpcHMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlbGVjdGVkQ2hpcHMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0ZWRDaGlwcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VsZWN0ZWRDaGlwcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWxlY3RlZENoaXBzX2luaXRpYWxpemVycywgX3NlbGVjdGVkQ2hpcHNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2NShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNDaGlwczIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzQ1OwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkxheW91dCJdOwogICAgI3NlbGVjdGlvbk1vZGVfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNjYodGhpcywgX3NlbGVjdGlvbk1vZGVfaW5pdGlhbGl6ZXJzLCAic2luZ2xlIik7CiAgICBnZXQgc2VsZWN0aW9uTW9kZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlbGVjdGlvbk1vZGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3Rpb25Nb2RlKHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3Rpb25Nb2RlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY2hpcHNBcmVSZW1vdmFibGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY2KHRoaXMsIF9zZWxlY3Rpb25Nb2RlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2Nih0aGlzLCBfY2hpcHNBcmVSZW1vdmFibGVfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGNoaXBzQXJlUmVtb3ZhYmxlKCkgewogICAgICByZXR1cm4gdGhpcy4jY2hpcHNBcmVSZW1vdmFibGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjaGlwc0FyZVJlbW92YWJsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY2hpcHNBcmVSZW1vdmFibGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWxlY3RhYmxlQ2hpcHNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY2KHRoaXMsIF9jaGlwc0FyZVJlbW92YWJsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjYodGhpcywgX3NlbGVjdGFibGVDaGlwc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgc2VsZWN0YWJsZUNoaXBzKCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0YWJsZUNoaXBzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0YWJsZUNoaXBzKHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3RhYmxlQ2hpcHNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWxlY3RlZENoaXBfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY2KHRoaXMsIF9zZWxlY3RhYmxlQ2hpcHNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczY2KHRoaXMsIF9zZWxlY3RlZENoaXBfaW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICBnZXQgc2VsZWN0ZWRDaGlwKCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRDaGlwX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0ZWRDaGlwKHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3RlZENoaXBfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWxlY3RlZENoaXBzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2Nih0aGlzLCBfc2VsZWN0ZWRDaGlwX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2Nih0aGlzLCBfc2VsZWN0ZWRDaGlwc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgc2VsZWN0ZWRDaGlwcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkQ2hpcHNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3RlZENoaXBzKHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3RlZENoaXBzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnM2Nih0aGlzLCBfc2VsZWN0ZWRDaGlwc19leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgIC5tYWluYm94IHsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBnYXA6IDhweDsKICAgICAgfQoKICAgICAgLmNoaXAgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjRmNGY1IiwgIiMyNzI3MmEiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzNmM2Y0NiIpfTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiAwcHggMTJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBib3gtc2hhZG93OiAwIDFweCAycHggMCByZ2JhKDAsIDAsIDAsIDAuMDUpOwogICAgICB9CgogICAgICAuY2hpcDpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzNmM2Y0NiIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDFkNWRiIiwgIiM1MjUyNWIiKX07CiAgICAgIH0KCiAgICAgIC5jaGlwOmFjdGl2ZSB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk4KTsKICAgICAgfQoKICAgICAgLmNoaXAuc2VsZWN0ZWQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiMzYjgyZjYiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjM2I4MmY2Iil9OwogICAgICAgIGNvbG9yOiAjZmZmZmZmOwogICAgICB9CgogICAgICAuY2hpcC5zZWxlY3RlZDpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyNTYzZWIiLCAiIzI1NjNlYiIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMjU2M2ViIiwgIiMyNTYzZWIiKX07CiAgICAgIH0KCiAgICAgIC5jaGlwS2V5IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjA2KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkiKX07CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC04cHg7CiAgICAgICAgcGFkZGluZzogMHB4IDhweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiNhMWExYWEiKX07CiAgICAgIH0KCiAgICAgIC5jaGlwLnNlbGVjdGVkIC5jaGlwS2V5IHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7CiAgICAgICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgICAgfQoKICAgICAgZGVlcy1pY29uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDE2cHg7CiAgICAgICAgaGVpZ2h0OiAxNnB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiA4cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAtNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgICAgfQoKICAgICAgLmNoaXAuc2VsZWN0ZWQgZGVlcy1pY29uIHsKICAgICAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpOwogICAgICB9CgogICAgICBkZWVzLWljb246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMSkiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2VmNDQ0NCIsICIjZWY0NDQ0Iil9OwogICAgICB9CgogICAgICAuY2hpcC5zZWxlY3RlZCBkZWVzLWljb246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgICAgICBjb2xvcjogI2ZmZmZmZjsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJtYWluYm94Ij4KICAgICAgICAke3RoaXMuc2VsZWN0YWJsZUNoaXBzLm1hcCgoY2hpcCkgPT4gYjJgCiAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNlbGVjdENoaXAoY2hpcCl9CiAgICAgICAgICAgICAgY2xhc3M9ImNoaXAgJHt0aGlzLmlzU2VsZWN0ZWQoY2hpcCkgPyAic2VsZWN0ZWQiIDogIiJ9IgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgJHtjaGlwLmtleSA/IGIyYDxkaXYgY2xhc3M9ImNoaXBLZXkiPiR7Y2hpcC5rZXl9PC9kaXY+YCA6IGIyYGB9ICR7Y2hpcC52YWx1ZX0KICAgICAgICAgICAgICAke3RoaXMuY2hpcHNBcmVSZW1vdmFibGUgPyBiMmAKICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uCiAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoZXZlbnQpID0+IHsKICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICB0aGlzLnJlbW92ZUNoaXAoY2hpcCk7CiAgICAgIH19CiAgICAgICAgICAgICAgICAgICAgICAuaWNvbj0keyJmYTp4bWFyayJ9CiAgICAgICAgICAgICAgICAgICAgPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgICBgIDogYjJgYH0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgKX0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKCkgewogICAgfQogICAgaXNTZWxlY3RlZChjaGlwKSB7CiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICJzaW5nbGUiKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRDaGlwID8gdGhpcy5pc1NhbWVDaGlwKHRoaXMuc2VsZWN0ZWRDaGlwLCBjaGlwKSA6IGZhbHNlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQ2hpcHMuc29tZSgoc2VsZWN0ZWQpID0+IHRoaXMuaXNTYW1lQ2hpcChzZWxlY3RlZCwgY2hpcCkpOwogICAgICB9CiAgICB9CiAgICBpc1NhbWVDaGlwKGNoaXAxLCBjaGlwMikgewogICAgICBpZiAoY2hpcDEua2V5ICYmIGNoaXAyLmtleSkgewogICAgICAgIHJldHVybiBjaGlwMS5rZXkgPT09IGNoaXAyLmtleTsKICAgICAgfQogICAgICByZXR1cm4gY2hpcDEudmFsdWUgPT09IGNoaXAyLnZhbHVlICYmIGNoaXAxLmtleSA9PT0gY2hpcDIua2V5OwogICAgfQogICAgYXN5bmMgc2VsZWN0Q2hpcChjaGlwKSB7CiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICJub25lIikgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAic2luZ2xlIikgewogICAgICAgIGlmICh0aGlzLmlzU2VsZWN0ZWQoY2hpcCkpIHsKICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGlwID0gbnVsbDsKICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGlwcyA9IFtdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hpcCA9IGNoaXA7CiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hpcHMgPSBbY2hpcF07CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gIm11bHRpcGxlIikgewogICAgICAgIGlmICh0aGlzLmlzU2VsZWN0ZWQoY2hpcCkpIHsKICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGlwcyA9IHRoaXMuc2VsZWN0ZWRDaGlwcy5maWx0ZXIoKHNlbGVjdGVkKSA9PiAhdGhpcy5pc1NhbWVDaGlwKHNlbGVjdGVkLCBjaGlwKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGlwcyA9IFsuLi50aGlzLnNlbGVjdGVkQ2hpcHMsIGNoaXBdOwogICAgICAgIH0KICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgfQogICAgICBjb25zb2xlLmxvZyh0aGlzLnNlbGVjdGVkQ2hpcHMpOwogICAgfQogICAgcmVtb3ZlQ2hpcChjaGlwVG9SZW1vdmUpIHsKICAgICAgdGhpcy5zZWxlY3RhYmxlQ2hpcHMgPSB0aGlzLnNlbGVjdGFibGVDaGlwcy5maWx0ZXIoKGNoaXApID0+ICF0aGlzLmlzU2FtZUNoaXAoY2hpcCwgY2hpcFRvUmVtb3ZlKSk7CiAgICAgIHRoaXMuc2VsZWN0ZWRDaGlwcyA9IHRoaXMuc2VsZWN0ZWRDaGlwcy5maWx0ZXIoKGNoaXApID0+ICF0aGlzLmlzU2FtZUNoaXAoY2hpcCwgY2hpcFRvUmVtb3ZlKSk7CiAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ2hpcCAmJiB0aGlzLmlzU2FtZUNoaXAodGhpcy5zZWxlY3RlZENoaXAsIGNoaXBUb1JlbW92ZSkpIHsKICAgICAgICB0aGlzLnNlbGVjdGVkQ2hpcCA9IG51bGw7CiAgICAgIH0KICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczY2KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzQ2hpcHMyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1kYXNoYm9hcmRncmlkL2RlZXMtZGFzaGJvYXJkZ3JpZC5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vRnVuYzQ2ID0gKCkgPT4gewogIHJldHVybiBiMmAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgICBjb25zdCBncmlkID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjZGFzaGJvYXJkR3JpZCIpOwogICAgY29uc3Qgc2VlZFdpZGdldHMgPSBbCiAgICAgIHsKICAgICAgICBpZDogIm1ldHJpY3MxIiwKICAgICAgICB4OiAwLAogICAgICAgIHk6IDAsCiAgICAgICAgdzogMywKICAgICAgICBoOiAyLAogICAgICAgIHRpdGxlOiAiUmV2ZW51ZSIsCiAgICAgICAgaWNvbjogImx1Y2lkZTpkb2xsYXJTaWduIiwKICAgICAgICBjb250ZW50OiBiMmAKICAgICAgICAgICAgPGRpdiBzdHlsZT0icGFkZGluZzogMjBweDsiPgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZTogMzJweDsgZm9udC13ZWlnaHQ6IDcwMDsgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07Ij4kMTI0LDU2MzwvZGl2PgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImNvbG9yOiAjMjJjNTVlOyBmb250LXNpemU6IDE0cHg7IG1hcmdpbi10b3A6IDhweDsiPuKGkSAxMi41JSBmcm9tIGxhc3QgbW9udGg8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpZDogIm1ldHJpY3MyIiwKICAgICAgICB4OiAzLAogICAgICAgIHk6IDAsCiAgICAgICAgdzogMywKICAgICAgICBoOiAyLAogICAgICAgIHRpdGxlOiAiVXNlcnMiLAogICAgICAgIGljb246ICJsdWNpZGU6dXNlcnMiLAogICAgICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgICA8ZGl2IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyI+CiAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOiAzMnB4OyBmb250LXdlaWdodDogNzAwOyBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsiPjgsMjM0PC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iY29sb3I6ICMzYjgyZjY7IGZvbnQtc2l6ZTogMTRweDsgbWFyZ2luLXRvcDogOHB4OyI+4oaRIDUuMiUgZnJvbSBsYXN0IHdlZWs8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpZDogImNoYXJ0MSIsCiAgICAgICAgeDogNiwKICAgICAgICB5OiAwLAogICAgICAgIHc6IDYsCiAgICAgICAgaDogNCwKICAgICAgICB0aXRsZTogIkFuYWx5dGljcyIsCiAgICAgICAgaWNvbjogImx1Y2lkZTpsaW5lQ2hhcnQiLAogICAgICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgICA8ZGl2IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyBoZWlnaHQ6IDEwMCU7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyI+CiAgICAgICAgICAgICAgPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzcxNzE3YTsiPgogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6bGluZUNoYXJ0In0gc3R5bGU9ImZvbnQtc2l6ZTogNDhweDsgbWFyZ2luLWJvdHRvbTogMTZweDsiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgPGRpdj5DaGFydCB2aXN1YWxpemF0aW9uIGFyZWE8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgCiAgICAgIH0KICAgIF07CiAgICBncmlkLndpZGdldHMgPSBzZWVkV2lkZ2V0cy5tYXAoKHdpZGdldCkgPT4gKHsgLi4ud2lkZ2V0IH0pKTsKICAgIGdyaWQuY2VsbEhlaWdodCA9IDgwOwogICAgZ3JpZC5tYXJnaW4gPSB7IHRvcDogMTAsIHJpZ2h0OiAxMCwgYm90dG9tOiAxMCwgbGVmdDogMTAgfTsKICAgIGdyaWQuZW5hYmxlQW5pbWF0aW9uID0gdHJ1ZTsKICAgIGdyaWQuc2hvd0dyaWRMaW5lcyA9IGZhbHNlOwogICAgY29uc3QgYmFzZUxheW91dCA9IGdyaWQuZ2V0TGF5b3V0KCkubWFwKChpdGVtKSA9PiAoeyAuLi5pdGVtIH0pKTsKICAgIGNvbnN0IG1vYmlsZUxheW91dCA9IGdyaWQud2lkZ2V0cy5tYXAoKHdpZGdldCwgaW5kZXgyKSA9PiAoewogICAgICBpZDogd2lkZ2V0LmlkLAogICAgICB4OiAwLAogICAgICB5OiBpbmRleDIgPT09IDAgPyAwIDogZ3JpZC53aWRnZXRzLnNsaWNlKDAsIGluZGV4MikucmVkdWNlKChhY2MsIHByZXYpID0+IGFjYyArIHByZXYuaCwgMCksCiAgICAgIHc6IGdyaWQuY29sdW1ucywKICAgICAgaDogd2lkZ2V0LmgKICAgIH0pKTsKICAgIGdyaWQubGF5b3V0cyA9IHsKICAgICAgYmFzZTogYmFzZUxheW91dCwKICAgICAgbW9iaWxlOiBtb2JpbGVMYXlvdXQKICAgIH07CiAgICBjb25zdCBzdGF0dXNFbCA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiI2Rhc2hib2FyZExheW91dFN0YXR1cyIpOwogICAgY29uc3QgdXBkYXRlU3RhdHVzID0gKCkgPT4gewogICAgICBjb25zdCBsYXlvdXQgPSBncmlkLmdldExheW91dCgpOwogICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGBBY3RpdmUgYnJlYWtwb2ludDogJHtncmlkLmFjdGl2ZUJyZWFrcG9pbnR9IFx1MjAyMiBUaWxlczogJHtsYXlvdXQubGVuZ3RofWA7CiAgICB9OwogICAgY29uc3QgbWVkaWFRdWVyeSA9IHdpbmRvdy5tYXRjaE1lZGlhKCIobWF4LXdpZHRoOiA3NjhweCkiKTsKICAgIGNvbnN0IGhhbmRsZUJyZWFrcG9pbnQgPSAoKSA9PiB7CiAgICAgIGNvbnN0IHRhcmdldCA9IG1lZGlhUXVlcnkubWF0Y2hlcyA/ICJtb2JpbGUiIDogImJhc2UiOwogICAgICBncmlkLmFwcGx5QnJlYWtwb2ludExheW91dCh0YXJnZXQpOwogICAgICB1cGRhdGVTdGF0dXMoKTsKICAgIH07CiAgICBpZiAodHlwZW9mIG1lZGlhUXVlcnkuYWRkRXZlbnRMaXN0ZW5lciA9PT0gImZ1bmN0aW9uIikgewogICAgICBtZWRpYVF1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGhhbmRsZUJyZWFrcG9pbnQpOwogICAgfSBlbHNlIHsKICAgICAgbWVkaWFRdWVyeS5hZGRMaXN0ZW5lcj8uKGhhbmRsZUJyZWFrcG9pbnQpOwogICAgfQogICAgaGFuZGxlQnJlYWtwb2ludCgpOwogICAgbGV0IHdpZGdldENvdW50ZXIgPSA0OwogICAgY29uc3QgYnV0dG9ucyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1idXR0b24iKTsKICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7CiAgICAgIGNvbnN0IHRleHQ5ID0gYnV0dG9uLnRleHRDb250ZW50Py50cmltKCk7CiAgICAgIHN3aXRjaCAodGV4dDkpIHsKICAgICAgICBjYXNlICJUb2dnbGUgQW5pbWF0aW9uIjoKICAgICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgICAgICAgZ3JpZC5lbmFibGVBbmltYXRpb24gPSAhZ3JpZC5lbmFibGVBbmltYXRpb247CiAgICAgICAgICB9KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlRvZ2dsZSBHcmlkIExpbmVzIjoKICAgICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgICAgICAgZ3JpZC5zaG93R3JpZExpbmVzID0gIWdyaWQuc2hvd0dyaWRMaW5lczsKICAgICAgICAgIH0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQWRkIFdpZGdldCI6CiAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IG5ld1dpZGdldCA9IHsKICAgICAgICAgICAgICBpZDogYHdpZGdldCR7d2lkZ2V0Q291bnRlcisrfWAsCiAgICAgICAgICAgICAgeDogMCwKICAgICAgICAgICAgICB5OiAwLAogICAgICAgICAgICAgIHc6IDMsCiAgICAgICAgICAgICAgaDogMiwKICAgICAgICAgICAgICBhdXRvUG9zaXRpb246IHRydWUsCiAgICAgICAgICAgICAgdGl0bGU6IGBXaWRnZXQgJHt3aWRnZXRDb3VudGVyIC0gMX1gLAogICAgICAgICAgICAgIGljb246ICJsdWNpZGU6cGFja2FnZSIsCiAgICAgICAgICAgICAgY29udGVudDogYjJgCiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9InBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImNvbG9yOiAjNzE3MTdhOyI+TmV3IHdpZGdldCBjb250ZW50PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDogOHB4OyBmb250LXNpemU6IDI0cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OyI+JHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxZTMpfTwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIGAKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZ3JpZC5hZGRXaWRnZXQobmV3V2lkZ2V0LCB0cnVlKTsKICAgICAgICAgIH0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQ29tcGFjdCBHcmlkIjoKICAgICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgICAgICAgZ3JpZC5jb21wYWN0KCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlRvZ2dsZSBFZGl0IE1vZGUiOgogICAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgICAgICAgICBncmlkLmVkaXRhYmxlID0gIWdyaWQuZWRpdGFibGU7CiAgICAgICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IGdyaWQuZWRpdGFibGUgPyAiTG9jayBHcmlkIiA6ICJVbmxvY2sgR3JpZCI7CiAgICAgICAgICB9KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlJlc2V0IExheW91dCI6CiAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgICAgICAgIGdyaWQuYXBwbHlCcmVha3BvaW50TGF5b3V0KGdyaWQuYWN0aXZlQnJlYWtwb2ludCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfSk7CiAgICBsZXQgbGFzdFBsYWNlaG9sZGVyUG9zaXRpb24gPSBudWxsOwogICAgbGV0IG1vdmVFdmVudENvdW50ZXIgPSAwOwogICAgY29uc3QgbG9nR3JpZFN0YXRlID0gKGV2ZW50TmFtZSwgZGV0YWlscykgPT4gewogICAgICBjb25zdCBsYXlvdXQgPSBncmlkLmdldExheW91dCgpOwogICAgICBjb25zb2xlLmdyb3VwKGBcdXsxRjUwNH0gJHtldmVudE5hbWV9IFtFdmVudCAjJHsrK21vdmVFdmVudENvdW50ZXJ9XWApOwogICAgICBjb25zb2xlLmxvZygiVGltZXN0YW1wOiIsICgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKSk7CiAgICAgIGNvbnNvbGUubG9nKCJHcmlkIENvbmZpZ3VyYXRpb246IiwgewogICAgICAgIGNvbHVtbnM6IGdyaWQuY29sdW1ucywKICAgICAgICBjZWxsSGVpZ2h0OiBncmlkLmNlbGxIZWlnaHQsCiAgICAgICAgbWFyZ2luOiBncmlkLm1hcmdpbiwKICAgICAgICBlZGl0YWJsZTogZ3JpZC5lZGl0YWJsZSwKICAgICAgICBhY3RpdmVCcmVha3BvaW50OiBncmlkLmFjdGl2ZUJyZWFrcG9pbnQKICAgICAgfSk7CiAgICAgIGNvbnNvbGUubG9nKCJDdXJyZW50IExheW91dDoiLCBsYXlvdXQpOwogICAgICBjb25zb2xlLmxvZygiV2lkZ2V0IENvdW50OiIsIGxheW91dC5sZW5ndGgpOwogICAgICBjb25zb2xlLmxvZygiR3JpZCBCb3VuZHM6IiwgewogICAgICAgIHRvdGFsV2lkZ2V0czogZ3JpZC53aWRnZXRzLmxlbmd0aCwKICAgICAgICBtYXhZOiBNYXRoLm1heCguLi5sYXlvdXQubWFwKCh3MykgPT4gdzMueSArIHczLmgpKSwKICAgICAgICBvY2N1cGllZDogbGF5b3V0Lm1hcCgodzMpID0+IGAke3czLmlkfTogKCR7dzMueH0sJHt3My55fSkgJHt3My53fXgke3czLmh9YCkuam9pbigiLCAiKQogICAgICB9KTsKICAgICAgaWYgKGRldGFpbHMpIHsKICAgICAgICBjb25zb2xlLmxvZygiRXZlbnQgRGV0YWlsczoiLCBkZXRhaWxzKTsKICAgICAgfQogICAgICBjb25zb2xlLmdyb3VwRW5kKCk7CiAgICB9OwogICAgY29uc3QgcGxhY2Vob2xkZXJPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBncmlkLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5wbGFjZWhvbGRlciIpOwogICAgICBpZiAocGxhY2Vob2xkZXIpIHsKICAgICAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPSB7CiAgICAgICAgICBsZWZ0OiBwbGFjZWhvbGRlci5zdHlsZS5sZWZ0LAogICAgICAgICAgdG9wOiBwbGFjZWhvbGRlci5zdHlsZS50b3AsCiAgICAgICAgICB3aWR0aDogcGxhY2Vob2xkZXIuc3R5bGUud2lkdGgsCiAgICAgICAgICBoZWlnaHQ6IHBsYWNlaG9sZGVyLnN0eWxlLmhlaWdodAogICAgICAgIH07CiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGN1cnJlbnRQb3NpdGlvbikgIT09IEpTT04uc3RyaW5naWZ5KGxhc3RQbGFjZWhvbGRlclBvc2l0aW9uKSkgewogICAgICAgICAgY29uc29sZS5ncm91cCgiXHV7MUY0Q0R9IFBsYWNlaG9sZGVyIFBvc2l0aW9uIENoYW5nZWQiKTsKICAgICAgICAgIGNvbnNvbGUubG9nKCJQcmV2aW91czoiLCBsYXN0UGxhY2Vob2xkZXJQb3NpdGlvbik7CiAgICAgICAgICBjb25zb2xlLmxvZygiQ3VycmVudDoiLCBjdXJyZW50UG9zaXRpb24pOwogICAgICAgICAgY29uc3QgZ3JpZEluZm8gPSBncmlkLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5ncmlkLWNvbnRhaW5lciIpOwogICAgICAgICAgaWYgKGdyaWRJbmZvKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJHcmlkIENvbnRhaW5lciBEaW1lbnNpb25zOiIsIHsKICAgICAgICAgICAgICB3aWR0aDogZ3JpZEluZm8uY2xpZW50V2lkdGgsCiAgICAgICAgICAgICAgaGVpZ2h0OiBncmlkSW5mby5jbGllbnRIZWlnaHQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7CiAgICAgICAgICBsYXN0UGxhY2Vob2xkZXJQb3NpdGlvbiA9IGN1cnJlbnRQb3NpdGlvbjsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgaWYgKGdyaWQuc2hhZG93Um9vdCkgewogICAgICBwbGFjZWhvbGRlck9ic2VydmVyLm9ic2VydmUoZ3JpZC5zaGFkb3dSb290LCB7CiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLAogICAgICAgIHN1YnRyZWU6IHRydWUsCiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFsic3R5bGUiXQogICAgICB9KTsKICAgIH0KICAgIGxvZ0dyaWRTdGF0ZSgiSW5pdGlhbCBHcmlkIFN0YXRlIik7CiAgICBncmlkLmFkZEV2ZW50TGlzdGVuZXIoIndpZGdldC1tb3ZlIiwgKGUxMSkgPT4gewogICAgICBsb2dHcmlkU3RhdGUoIldpZGdldCBNb3ZlIiwgewogICAgICAgIHdpZGdldDogZTExLmRldGFpbC53aWRnZXQsCiAgICAgICAgZGlzcGxhY2VkOiBlMTEuZGV0YWlsLmRpc3BsYWNlZCwKICAgICAgICBzd2FwcGVkV2l0aDogZTExLmRldGFpbC5zd2FwcGVkV2l0aAogICAgICB9KTsKICAgIH0pOwogICAgZ3JpZC5hZGRFdmVudExpc3RlbmVyKCJ3aWRnZXQtcmVzaXplIiwgKGUxMSkgPT4gewogICAgICBsb2dHcmlkU3RhdGUoIldpZGdldCBSZXNpemUiLCB7CiAgICAgICAgd2lkZ2V0OiBlMTEuZGV0YWlsLndpZGdldCwKICAgICAgICBkaXNwbGFjZWQ6IGUxMS5kZXRhaWwuZGlzcGxhY2VkLAogICAgICAgIHN3YXBwZWRXaXRoOiBlMTEuZGV0YWlsLnN3YXBwZWRXaXRoCiAgICAgIH0pOwogICAgfSk7CiAgICBncmlkLmFkZEV2ZW50TGlzdGVuZXIoIndpZGdldC1yZW1vdmUiLCAoZTExKSA9PiB7CiAgICAgIGxvZ0dyaWRTdGF0ZSgiV2lkZ2V0IFJlbW92ZSIsIHsKICAgICAgICByZW1vdmVkV2lkZ2V0OiBlMTEuZGV0YWlsLndpZGdldAogICAgICB9KTsKICAgICAgdXBkYXRlU3RhdHVzKCk7CiAgICB9KTsKICAgIGdyaWQuYWRkRXZlbnRMaXN0ZW5lcigibGF5b3V0LWNoYW5nZSIsICgpID0+IHsKICAgICAgbG9nR3JpZFN0YXRlKCJMYXlvdXQgQ2hhbmdlIik7CiAgICAgIHVwZGF0ZVN0YXR1cygpOwogICAgfSk7CiAgICBncmlkLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIiwgKGUxMSkgPT4gewogICAgICBjb25zdCBpc0hlYWRlciA9IGUxMS50YXJnZXQuY2xvc2VzdCgiLndpZGdldC1oZWFkZXIiKTsKICAgICAgY29uc3QgaXNSZXNpemVIYW5kbGUgPSBlMTEudGFyZ2V0LmNsb3Nlc3QoIi5yZXNpemUtaGFuZGxlIik7CiAgICAgIGlmIChpc0hlYWRlciB8fCBpc1Jlc2l6ZUhhbmRsZSkgewogICAgICAgIGNvbnNvbGUuZ3JvdXAoYFx1ezFGM0FGfSBJbnRlcmFjdGlvbiBTdGFydGVkOiAke2lzSGVhZGVyID8gIkRyYWciIDogIlJlc2l6ZSJ9YCk7CiAgICAgICAgY29uc29sZS5sb2coIlRhcmdldCBXaWRnZXQ6IiwgZTExLnRhcmdldC5jbG9zZXN0KCIud2lkZ2V0Iik/LmdldEF0dHJpYnV0ZSgiZGF0YS13aWRnZXQtaWQiKSk7CiAgICAgICAgY29uc29sZS5sb2coIlBvaW50ZXIgUG9zaXRpb246IiwgeyB4OiBlMTEuY2xpZW50WCwgeTogZTExLmNsaWVudFkgfSk7CiAgICAgICAgY29uc29sZS5ncm91cEVuZCgpOwogICAgICAgIGNvbnN0IGhhbmRsZVBvaW50ZXJNb3ZlID0gKG1vdmVFdmVudCkgPT4gewogICAgICAgICAgY29uc3Qgd2lkZ2V0ID0gZTExLnRhcmdldC5jbG9zZXN0KCIud2lkZ2V0Iik7CiAgICAgICAgICBpZiAod2lkZ2V0KSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBcdTIxOTRcdUZFMEYgUG9pbnRlciBNb3ZlOmAsIHsKICAgICAgICAgICAgICB3aWRnZXRJZDogd2lkZ2V0LmdldEF0dHJpYnV0ZSgiZGF0YS13aWRnZXQtaWQiKSwKICAgICAgICAgICAgICBwb3NpdGlvbjogeyB4OiBtb3ZlRXZlbnQuY2xpZW50WCwgeTogbW92ZUV2ZW50LmNsaWVudFkgfSwKICAgICAgICAgICAgICBkZWx0YTogewogICAgICAgICAgICAgICAgeDogbW92ZUV2ZW50LmNsaWVudFggLSBlMTEuY2xpZW50WCwKICAgICAgICAgICAgICAgIHk6IG1vdmVFdmVudC5jbGllbnRZIC0gZTExLmNsaWVudFkKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgY29uc3QgaGFuZGxlUG9pbnRlclVwID0gKCkgPT4gewogICAgICAgICAgY29uc29sZS5ncm91cCgiXHV7MUYzQzF9IEludGVyYWN0aW9uIEVuZGVkIik7CiAgICAgICAgICBsb2dHcmlkU3RhdGUoIkZpbmFsIFN0YXRlIEFmdGVyIEludGVyYWN0aW9uIik7CiAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7CiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsIGhhbmRsZVBvaW50ZXJNb3ZlKTsKICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsIGhhbmRsZVBvaW50ZXJVcCk7CiAgICAgICAgfTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsIGhhbmRsZVBvaW50ZXJNb3ZlKTsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCBoYW5kbGVQb2ludGVyVXApOwogICAgICB9CiAgICB9KTsKICAgIGNvbnN0IG9yaWdpbmFsQWRkV2lkZ2V0ID0gZ3JpZC5hZGRXaWRnZXQuYmluZChncmlkKTsKICAgIGdyaWQuYWRkV2lkZ2V0ID0gKHdpZGdldCwgYXV0b1Bvc2l0aW9uKSA9PiB7CiAgICAgIGNvbnNvbGUuZ3JvdXAoIlx1Mjc5NSBBZGRpbmcgV2lkZ2V0Iik7CiAgICAgIGNvbnNvbGUubG9nKCJOZXcgV2lkZ2V0OiIsIHdpZGdldCk7CiAgICAgIGNvbnNvbGUubG9nKCJBdXRvIFBvc2l0aW9uOiIsIGF1dG9Qb3NpdGlvbik7CiAgICAgIGNvbnN0IHJlc3VsdCA9IG9yaWdpbmFsQWRkV2lkZ2V0KHdpZGdldCwgYXV0b1Bvc2l0aW9uKTsKICAgICAgbG9nR3JpZFN0YXRlKCJBZnRlciBXaWRnZXQgQWRkZWQiKTsKICAgICAgY29uc29sZS5ncm91cEVuZCgpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKICAgIGNvbnN0IG9yaWdpbmFsQ29tcGFjdCA9IGdyaWQuY29tcGFjdC5iaW5kKGdyaWQpOwogICAgZ3JpZC5jb21wYWN0ID0gKGRpcmVjdGlvbikgPT4gewogICAgICBjb25zb2xlLmdyb3VwKCJcdXsxRjVEQ31cdUZFMEYgQ29tcGFjdGluZyBHcmlkIik7CiAgICAgIGNvbnNvbGUubG9nKCJEaXJlY3Rpb246IiwgZGlyZWN0aW9uIHx8ICJ2ZXJ0aWNhbCIpOwogICAgICBsb2dHcmlkU3RhdGUoIkJlZm9yZSBDb21wYWN0Iik7CiAgICAgIGNvbnN0IHJlc3VsdCA9IG9yaWdpbmFsQ29tcGFjdChkaXJlY3Rpb24pOwogICAgICBsb2dHcmlkU3RhdGUoIkFmdGVyIENvbXBhY3QiKTsKICAgICAgY29uc29sZS5ncm91cEVuZCgpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKICAgIHVwZGF0ZVN0YXR1cygpOwogIH19PgogICAgICA8c3R5bGU+CiAgICAgICAgJHtpYAogICAgICAgICAgLmRlbW9Cb3ggewogICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjRmNGY1IiwgIiMwOTA5MGIiKX07CiAgICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICAgIHBhZGRpbmc6IDQwcHg7CiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICAgIGdhcDogMjRweDsKICAgICAgICAgIH0KCiAgICAgICAgICAuZGVtby1jb250cm9scyB7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgICAgfQoKICAgICAgICAgIC5kZW1vLWNvbnRyb2xzIGRlZXMtYnV0dG9uIHsKICAgICAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgICB9CgogICAgICAgICAgLmdyaWQtY29udGFpbmVyLXdyYXBwZXIgewogICAgICAgICAgICBmbGV4OiAxOwogICAgICAgICAgICBtaW4taGVpZ2h0OiA2MDBweDsKICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgfQoKICAgICAgICAgIC5pbmZvIHsKICAgICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM3MTcxN2EiKX07CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICAgICAgZm9udC1mYW1pbHk6ICdHZWlzdCBTYW5zJywgc2Fucy1zZXJpZjsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgICBnYXA6IDZweDsKICAgICAgICAgIH0KCiAgICAgICAgICAjZGFzaGJvYXJkTGF5b3V0U3RhdHVzIHsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiM2MGE1ZmEiKX07CiAgICAgICAgICB9CiAgICAgICAgYH0KICAgICAgPC9zdHlsZT4KICAgICAgPGRpdiBjbGFzcz0iZGVtb0JveCI+CiAgICAgICAgPGRpdiBjbGFzcz0iZGVtby1jb250cm9scyI+CiAgICAgICAgICA8ZGVlcy1idXR0b24tZ3JvdXAgbGFiZWw9IkFuaW1hdGlvbjoiPgogICAgICAgICAgICA8ZGVlcy1idXR0b24+VG9nZ2xlIEFuaW1hdGlvbjwvZGVlcy1idXR0b24+CiAgICAgICAgICA8L2RlZXMtYnV0dG9uLWdyb3VwPgoKICAgICAgICAgIDxkZWVzLWJ1dHRvbi1ncm91cCBsYWJlbD0iRGlzcGxheToiPgogICAgICAgICAgICA8ZGVlcy1idXR0b24+VG9nZ2xlIEdyaWQgTGluZXM8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPC9kZWVzLWJ1dHRvbi1ncm91cD4KCiAgICAgICAgICA8ZGVlcy1idXR0b24tZ3JvdXAgbGFiZWw9IkFjdGlvbnM6Ij4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPkFkZCBXaWRnZXQ8L2RlZXMtYnV0dG9uPgogICAgICAgICAgICA8ZGVlcy1idXR0b24+Q29tcGFjdCBHcmlkPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPlJlc2V0IExheW91dDwvZGVlcy1idXR0b24+CiAgICAgICAgICA8L2RlZXMtYnV0dG9uLWdyb3VwPgoKICAgICAgICAgIDxkZWVzLWJ1dHRvbi1ncm91cCBsYWJlbD0iTW9kZToiPgogICAgICAgICAgICA8ZGVlcy1idXR0b24+VG9nZ2xlIEVkaXQgTW9kZTwvZGVlcy1idXR0b24+CiAgICAgICAgICA8L2RlZXMtYnV0dG9uLWdyb3VwPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJncmlkLWNvbnRhaW5lci13cmFwcGVyIj4KICAgICAgICAgIDxkZWVzLWRhc2hib2FyZGdyaWQgaWQ9ImRhc2hib2FyZEdyaWQiPjwvZGVlcy1kYXNoYm9hcmRncmlkPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJpbmZvIj4KICAgICAgICAgIDxkaXY+RHJhZyB0byByZXBvc2l0aW9uLCByZXNpemUgZnJvbSBoYW5kbGVzLCBvciByaWdodC1jbGljayBhIGhlYWRlciB0byBkZWxldGUgYSB0aWxlLjwvZGl2PgogICAgICAgICAgPGRpdiBpZD0iZGFzaGJvYXJkTGF5b3V0U3RhdHVzIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgYDsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1kYXNoYm9hcmRncmlkL3N0eWxlcy5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgZGFzaGJvYXJkR3JpZFN0eWxlcyA9IFsKICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5ncmlkLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1pbi1oZWlnaHQ6IDQwMHB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgIC5ncmlkLXdpZGdldCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpbGwtY2hhbmdlOiBhdXRvOwogICAgICB9CiAgICAgIAogICAgICA6aG9zdChbZW5hYmxlYW5pbWF0aW9uXSkgLmdyaWQtd2lkZ2V0IHsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICB9CgogICAgICAuZ3JpZC13aWRnZXQuZHJhZ2dpbmcgewogICAgICAgIHotaW5kZXg6IDEwMDA7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgICBjdXJzb3I6IGdyYWJiaW5nOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KICAgICAgCiAgICAgIC5ncmlkLXdpZGdldC5wbGFjZWhvbGRlciB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQogICAgICAKICAgICAgLmdyaWQtd2lkZ2V0LnBsYWNlaG9sZGVyIC53aWRnZXQtY29udGVudCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoNTksIDEzMCwgMjQ2LCAwLjEpIiwgInJnYmEoNTksIDEzMCwgMjQ2LCAwLjEpIil9OwogICAgICAgIGJvcmRlcjogMnB4IGRhc2hlZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjM2I4MmY2Iil9OwogICAgICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5ncmlkLXdpZGdldC5yZXNpemluZyB7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAud2lkZ2V0LWNvbnRlbnQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMDkwOTBiIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIGJveC1zaGFkb3c6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEpIiwgIjAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMykiKX07CiAgICAgICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjJzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5ncmlkLXdpZGdldDpob3ZlciAud2lkZ2V0LWNvbnRlbnQgewogICAgICAgIGJveC1zaGFkb3c6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4xNSkiLCAiMCA0cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuNCkiKX07CiAgICAgIH0KCiAgICAgIC5ncmlkLXdpZGdldC5kcmFnZ2luZyAud2lkZ2V0LWNvbnRlbnQgewogICAgICAgIGJveC1zaGFkb3c6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIwIDE2cHggNDhweCByZ2JhKDAsIDAsIDAsIDAuMjUpIiwgIjAgMTZweCA0OHB4IHJnYmEoMCwgMCwgMCwgMC42KSIpfTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMDUpOwogICAgICB9CgogICAgICAud2lkZ2V0LWhlYWRlciB7CiAgICAgICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y5ZmFmYiIsICIjMGEwYTBhIil9OwogICAgICAgIGN1cnNvcjogZ3JhYjsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQogICAgICAKICAgICAgLndpZGdldC1oZWFkZXI6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjRmNGY1IiwgIiMxODE4MWIiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC53aWRnZXQtaGVhZGVyOmFjdGl2ZSB7CiAgICAgICAgY3Vyc29yOiBncmFiYmluZzsKICAgICAgfQoKICAgICAgLndpZGdldC1oZWFkZXIubG9ja2VkIHsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KICAgICAgCiAgICAgIC53aWRnZXQtaGVhZGVyLmxvY2tlZDpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOWZhZmIiLCAiIzBhMGEwYSIpfTsKICAgICAgfQoKICAgICAgLndpZGdldC1oZWFkZXIgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM3MTcxN2EiKX07CiAgICAgIH0KCiAgICAgIC53aWRnZXQtYm9keSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgICAgfQoKICAgICAgLndpZGdldC1ib2R5Lmhhcy1oZWFkZXIgewogICAgICAgIHRvcDogNDVweDsKICAgICAgfQoKICAgICAgLnJlc2l6ZS1oYW5kbGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgfQoKICAgICAgLnJlc2l6ZS1oYW5kbGU6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiMzYjgyZjYiKX07CiAgICAgICAgb3BhY2l0eTogMC4zOwogICAgICB9CgogICAgICAucmVzaXplLWhhbmRsZS1lIHsKICAgICAgICBjdXJzb3I6IGV3LXJlc2l6ZTsKICAgICAgICB3aWR0aDogMTJweDsKICAgICAgICByaWdodDogLTZweDsKICAgICAgICB0b3A6IDEwJTsKICAgICAgICBoZWlnaHQ6IDgwJTsKICAgICAgfQoKICAgICAgLnJlc2l6ZS1oYW5kbGUtcyB7CiAgICAgICAgY3Vyc29yOiBucy1yZXNpemU7CiAgICAgICAgaGVpZ2h0OiAxMnB4OwogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgICAgYm90dG9tOiAtNnB4OwogICAgICAgIGxlZnQ6IDEwJTsKICAgICAgfQoKICAgICAgLnJlc2l6ZS1oYW5kbGUtc2UgewogICAgICAgIGN1cnNvcjogc2UtcmVzaXplOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICByaWdodDogLTJweDsKICAgICAgICBib3R0b206IC0ycHg7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZTsKICAgICAgfQogICAgICAKICAgICAgLnJlc2l6ZS1oYW5kbGUtc2U6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDRweDsKICAgICAgICBib3R0b206IDRweDsKICAgICAgICB3aWR0aDogNnB4OwogICAgICAgIGhlaWdodDogNnB4OwogICAgICAgIGJvcmRlci1yaWdodDogMnB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM3MTcxN2EiKX07CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM3MTcxN2EiKX07CiAgICAgIH0KCiAgICAgIC5ncmlkLXdpZGdldDpob3ZlciAucmVzaXplLWhhbmRsZS1zZSB7CiAgICAgICAgb3BhY2l0eTogMC43OwogICAgICB9CgogICAgICAucmVzaXplLWhhbmRsZS1zZTpob3ZlciB7CiAgICAgICAgb3BhY2l0eTogMSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucmVzaXplLWhhbmRsZS1zZTpob3Zlcjo6YWZ0ZXIgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICAgICAgfQoKICAgICAgLmdyaWQtcGxhY2Vob2xkZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjM2I4MmY2Iil9OwogICAgICAgIG9wYWNpdHk6IDAuMTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgYm9yZGVyOiAycHggZGFzaGVkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiMzYjgyZjYiKX07CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmVtcHR5LXN0YXRlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjNzE3MTdhIil9OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiAzMnB4OwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDQ4cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KICAgICAgCiAgICAgIC5ncmlkLWxpbmVzIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHotaW5kZXg6IC0xOwogICAgICB9CiAgICAgIAogICAgICAuZ3JpZC1saW5lLXZlcnRpY2FsIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgICAgb3BhY2l0eTogMC4zOwogICAgICB9CiAgICAgIAogICAgICAuZ3JpZC1saW5lLWhvcml6b250YWwgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgICAgb3BhY2l0eTogMC4zOwogICAgICB9CiAgYApdOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWxheW91dC9kZWVzLWRhc2hib2FyZGdyaWQvbGF5b3V0LmpzCnZhciBERUZBVUxUX01BUkdJTiA9IDEwOwp2YXIgcmVzb2x2ZU1hcmdpbnMgPSAobWFyZ2luKSA9PiB7CiAgaWYgKHR5cGVvZiBtYXJnaW4gPT09ICJudW1iZXIiKSB7CiAgICByZXR1cm4gewogICAgICBob3Jpem9udGFsOiBtYXJnaW4sCiAgICAgIHZlcnRpY2FsOiBtYXJnaW4sCiAgICAgIHRvcDogbWFyZ2luLAogICAgICByaWdodDogbWFyZ2luLAogICAgICBib3R0b206IG1hcmdpbiwKICAgICAgbGVmdDogbWFyZ2luCiAgICB9OwogIH0KICBjb25zdCByZXNvbHZlZDIgPSB7CiAgICB0b3A6IG1hcmdpbi50b3AgPz8gREVGQVVMVF9NQVJHSU4sCiAgICByaWdodDogbWFyZ2luLnJpZ2h0ID8/IERFRkFVTFRfTUFSR0lOLAogICAgYm90dG9tOiBtYXJnaW4uYm90dG9tID8/IERFRkFVTFRfTUFSR0lOLAogICAgbGVmdDogbWFyZ2luLmxlZnQgPz8gREVGQVVMVF9NQVJHSU4KICB9OwogIHJldHVybiB7CiAgICAuLi5yZXNvbHZlZDIsCiAgICBob3Jpem9udGFsOiAocmVzb2x2ZWQyLmxlZnQgKyByZXNvbHZlZDIucmlnaHQpIC8gMiwKICAgIHZlcnRpY2FsOiAocmVzb2x2ZWQyLnRvcCArIHJlc29sdmVkMi5ib3R0b20pIC8gMgogIH07Cn07CnZhciBjYWxjdWxhdGVDZWxsTWV0cmljcyA9IChjb250YWluZXJXaWR0aCwgY29sdW1ucywgbWFyZ2lucywgY2VsbEhlaWdodCwgY2VsbEhlaWdodFVuaXQpID0+IHsKICBjb25zdCB0b3RhbE1hcmdpbldpZHRoID0gbWFyZ2lucy5ob3Jpem9udGFsICogKGNvbHVtbnMgKyAxKTsKICBjb25zdCBhdmFpbGFibGVXaWR0aCA9IE1hdGgubWF4KGNvbnRhaW5lcldpZHRoIC0gdG90YWxNYXJnaW5XaWR0aCwgMCk7CiAgY29uc3QgY2VsbFdpZHRoUHggPSBjb2x1bW5zID4gMCA/IGF2YWlsYWJsZVdpZHRoIC8gY29sdW1ucyA6IDA7CiAgY29uc3QgY2VsbEhlaWdodFB4ID0gY2VsbEhlaWdodFVuaXQgPT09ICJhdXRvIiA/IGNlbGxXaWR0aFB4IDogY2VsbEhlaWdodDsKICByZXR1cm4gewogICAgY29udGFpbmVyV2lkdGgsCiAgICBjZWxsV2lkdGhQeCwKICAgIG1hcmdpbkhvcml6b250YWxQeDogbWFyZ2lucy5ob3Jpem9udGFsLAogICAgY2VsbEhlaWdodFB4LAogICAgbWFyZ2luVmVydGljYWxQeDogbWFyZ2lucy52ZXJ0aWNhbAogIH07Cn07CnZhciBjYWxjdWxhdGVHcmlkSGVpZ2h0ID0gKHdpZGdldHMsIG1hcmdpbnMsIGNlbGxIZWlnaHQpID0+IHsKICBpZiAod2lkZ2V0cy5sZW5ndGggPT09IDApCiAgICByZXR1cm4gMDsKICBjb25zdCBtYXhZID0gTWF0aC5tYXgoLi4ud2lkZ2V0cy5tYXAoKHdpZGdldCkgPT4gd2lkZ2V0LnkgKyB3aWRnZXQuaCksIDApOwogIHJldHVybiBtYXhZICogY2VsbEhlaWdodCArIChtYXhZICsgMSkgKiBtYXJnaW5zLnZlcnRpY2FsOwp9Owp2YXIgb3ZlcmxhcHMgPSAod2lkZ2V0LCB4MywgeTUsIHczLCBoOSkgPT4geDMgPCB3aWRnZXQueCArIHdpZGdldC53ICYmIHgzICsgdzMgPiB3aWRnZXQueCAmJiB5NSA8IHdpZGdldC55ICsgd2lkZ2V0LmggJiYgeTUgKyBoOSA+IHdpZGdldC55Owp2YXIgY29sbGVjdENvbGxpc2lvbnMgPSAod2lkZ2V0cywgdGFyZ2V0LCBuZXh0WCwgbmV4dFksIG5leHRXID0gdGFyZ2V0LncsIG5leHRIID0gdGFyZ2V0LmgpID0+IHsKICByZXR1cm4gd2lkZ2V0cy5maWx0ZXIoKHdpZGdldCkgPT4gewogICAgaWYgKHdpZGdldC5pZCA9PT0gdGFyZ2V0LmlkKQogICAgICByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gb3ZlcmxhcHMod2lkZ2V0LCBuZXh0WCwgbmV4dFksIG5leHRXLCBuZXh0SCk7CiAgfSk7Cn07CnZhciBjaGVja0NvbGxpc2lvbiA9ICh3aWRnZXRzLCB0YXJnZXQsIG5leHRYLCBuZXh0WSkgPT4gY29sbGVjdENvbGxpc2lvbnMod2lkZ2V0cywgdGFyZ2V0LCBuZXh0WCwgbmV4dFkpLmxlbmd0aCA+IDA7CnZhciBjbG9uZVdpZGdldCA9ICh3aWRnZXQpID0+ICh7IC4uLndpZGdldCB9KTsKdmFyIGNsb25lV2lkZ2V0cyA9ICh3aWRnZXRzKSA9PiB3aWRnZXRzLm1hcChjbG9uZVdpZGdldCk7CnZhciBmaW5kQXZhaWxhYmxlUG9zaXRpb24gPSAod2lkZ2V0cywgd2lkdGgsIGhlaWdodCwgY29sdW1ucykgPT4gewogIGZvciAobGV0IHk1ID0gMDsgeTUgPCAyMDA7IHk1KyspIHsKICAgIGZvciAobGV0IHgzID0gMDsgeDMgPD0gY29sdW1ucyAtIHdpZHRoOyB4MysrKSB7CiAgICAgIGNvbnN0IGlzRnJlZSA9ICF3aWRnZXRzLnNvbWUoKHdpZGdldCkgPT4gb3ZlcmxhcHMod2lkZ2V0LCB4MywgeTUsIHdpZHRoLCBoZWlnaHQpKTsKICAgICAgaWYgKGlzRnJlZSkgewogICAgICAgIHJldHVybiB7IHg6IHgzLCB5OiB5NSB9OwogICAgICB9CiAgICB9CiAgfQogIGNvbnN0IG1heFkgPSB3aWRnZXRzLnJlZHVjZSgoYWNjLCB3aWRnZXQpID0+IE1hdGgubWF4KGFjYywgd2lkZ2V0LnkgKyB3aWRnZXQuaCksIDApOwogIHJldHVybiB7IHg6IDAsIHk6IG1heFkgfTsKfTsKdmFyIHJlc29sdmVXaWRnZXRQbGFjZW1lbnQgPSAod2lkZ2V0cywgd2lkZ2V0SWQsIG5leHQyLCBjb2x1bW5zLCBwcmV2aW91c1Bvc2l0aW9uKSA9PiB7CiAgY29uc3Qgc291cmNlV2lkZ2V0cyA9IGNsb25lV2lkZ2V0cyh3aWRnZXRzKTsKICBjb25zdCBtb3ZpbmcgPSBzb3VyY2VXaWRnZXRzLmZpbmQoKHdpZGdldCkgPT4gd2lkZ2V0LmlkID09PSB3aWRnZXRJZCk7CiAgY29uc3Qgb3JpZ2luYWwgPSB3aWRnZXRzLmZpbmQoKHdpZGdldCkgPT4gd2lkZ2V0LmlkID09PSB3aWRnZXRJZCk7CiAgaWYgKCFtb3ZpbmcgfHwgIW9yaWdpbmFsKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY29uc3QgdGFyZ2V0ID0gewogICAgeDogbmV4dDIueCwKICAgIHk6IG5leHQyLnksCiAgICB3OiBuZXh0Mi53ID8/IG1vdmluZy53LAogICAgaDogbmV4dDIuaCA/PyBtb3ZpbmcuaAogIH07CiAgbW92aW5nLnggPSB0YXJnZXQueDsKICBtb3ZpbmcueSA9IHRhcmdldC55OwogIG1vdmluZy53ID0gdGFyZ2V0Lnc7CiAgbW92aW5nLmggPSB0YXJnZXQuaDsKICBjb25zdCBjb2xsaXNpb25zID0gY29sbGVjdENvbGxpc2lvbnMoc291cmNlV2lkZ2V0cywgbW92aW5nLCB0YXJnZXQueCwgdGFyZ2V0LnksIHRhcmdldC53LCB0YXJnZXQuaCk7CiAgaWYgKGNvbGxpc2lvbnMubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4geyB3aWRnZXRzOiBzb3VyY2VXaWRnZXRzLCBtb3ZlZFdpZGdldHM6IFttb3ZpbmcuaWRdIH07CiAgfQogIGlmIChjb2xsaXNpb25zLmxlbmd0aCA9PT0gMSkgewogICAgY29uc3Qgb3RoZXIgPSBjb2xsaXNpb25zWzBdOwogICAgaWYgKCFvdGhlci5sb2NrZWQgJiYgIW90aGVyLm5vTW92ZSAmJiBvdGhlci53ID09PSBtb3ZpbmcudyAmJiBvdGhlci5oID09PSBtb3ZpbmcuaCkgewogICAgICBjb25zdCBvdGhlckNsb25lID0gc291cmNlV2lkZ2V0cy5maW5kKCh3aWRnZXQpID0+IHdpZGdldC5pZCA9PT0gb3RoZXIuaWQpOwogICAgICBpZiAob3RoZXJDbG9uZSkgewogICAgICAgIGNvbnN0IHN3YXBUYXJnZXQgPSBvcmlnaW5hbDsKICAgICAgICBjb25zdCBwcmV2aW91c090aGVyUG9zaXRpb24gPSB7IHg6IG90aGVyQ2xvbmUueCwgeTogb3RoZXJDbG9uZS55IH07CiAgICAgICAgb3RoZXJDbG9uZS54ID0gc3dhcFRhcmdldC54OwogICAgICAgIG90aGVyQ2xvbmUueSA9IHN3YXBUYXJnZXQueTsKICAgICAgICBjb25zdCBzd2FwVmFsaWQgPSBjb2xsZWN0Q29sbGlzaW9ucyhzb3VyY2VXaWRnZXRzLCBtb3ZpbmcsIG1vdmluZy54LCBtb3ZpbmcueSwgbW92aW5nLncsIG1vdmluZy5oKS5sZW5ndGggPT09IDAgJiYgY29sbGVjdENvbGxpc2lvbnMoc291cmNlV2lkZ2V0cywgb3RoZXJDbG9uZSwgb3RoZXJDbG9uZS54LCBvdGhlckNsb25lLnksIG90aGVyQ2xvbmUudywgb3RoZXJDbG9uZS5oKS5sZW5ndGggPT09IDA7CiAgICAgICAgaWYgKHN3YXBWYWxpZCkgewogICAgICAgICAgcmV0dXJuIHsgd2lkZ2V0czogc291cmNlV2lkZ2V0cywgbW92ZWRXaWRnZXRzOiBbbW92aW5nLmlkLCBvdGhlckNsb25lLmlkXSwgc3dhcHBlZFdpdGg6IG90aGVyQ2xvbmUuaWQgfTsKICAgICAgICB9CiAgICAgICAgb3RoZXJDbG9uZS54ID0gcHJldmlvdXNPdGhlclBvc2l0aW9uLng7CiAgICAgICAgb3RoZXJDbG9uZS55ID0gcHJldmlvdXNPdGhlclBvc2l0aW9uLnk7CiAgICAgIH0KICAgIH0KICB9CiAgY29uc3QgbW92ZWRJZHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbbW92aW5nLmlkXSk7CiAgZm9yIChjb25zdCBvZmZlbmRpbmcgb2YgY29sbGlzaW9ucykgewogICAgaWYgKG9mZmVuZGluZy5sb2NrZWQgfHwgb2ZmZW5kaW5nLm5vTW92ZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IGNsb25lID0gc291cmNlV2lkZ2V0cy5maW5kKCh3aWRnZXQpID0+IHdpZGdldC5pZCA9PT0gb2ZmZW5kaW5nLmlkKTsKICAgIGlmICghY2xvbmUpCiAgICAgIGNvbnRpbnVlOwogICAgY29uc3QgcmVtYWluaW5nID0gc291cmNlV2lkZ2V0cy5maWx0ZXIoKHdpZGdldCkgPT4gd2lkZ2V0LmlkICE9PSBvZmZlbmRpbmcuaWQpOwogICAgY29uc3QgcG9zaXRpb24zID0gZmluZEF2YWlsYWJsZVBvc2l0aW9uKHJlbWFpbmluZywgY2xvbmUudywgY2xvbmUuaCwgY29sdW1ucyk7CiAgICBjbG9uZS54ID0gcG9zaXRpb24zLng7CiAgICBjbG9uZS55ID0gcG9zaXRpb24zLnk7CiAgICBtb3ZlZElkcy5hZGQoY2xvbmUuaWQpOwogIH0KICBjb25zdCB2ZXJpZnkgPSBjb2xsZWN0Q29sbGlzaW9ucyhzb3VyY2VXaWRnZXRzLCBtb3ZpbmcsIG1vdmluZy54LCBtb3ZpbmcueSwgbW92aW5nLncsIG1vdmluZy5oKTsKICBpZiAodmVyaWZ5Lmxlbmd0aCA+IDApIHsKICAgIHJldHVybiBudWxsOwogIH0KICByZXR1cm4geyB3aWRnZXRzOiBzb3VyY2VXaWRnZXRzLCBtb3ZlZFdpZGdldHM6IEFycmF5LmZyb20obW92ZWRJZHMpIH07Cn07CnZhciBjb21wYWN0TGF5b3V0ID0gKHdpZGdldHMsIGRpcmVjdGlvbiA9ICJ2ZXJ0aWNhbCIpID0+IHsKICBjb25zdCBzb3J0ZWQgPSBbLi4ud2lkZ2V0c10uc29ydCgoYTUsIGI1KSA9PiB7CiAgICBpZiAoZGlyZWN0aW9uID09PSAidmVydGljYWwiKSB7CiAgICAgIGlmIChhNS55ICE9PSBiNS55KQogICAgICAgIHJldHVybiBhNS55IC0gYjUueTsKICAgICAgcmV0dXJuIGE1LnggLSBiNS54OwogICAgfQogICAgaWYgKGE1LnggIT09IGI1LngpCiAgICAgIHJldHVybiBhNS54IC0gYjUueDsKICAgIHJldHVybiBhNS55IC0gYjUueTsKICB9KTsKICBmb3IgKGNvbnN0IHdpZGdldCBvZiBzb3J0ZWQpIHsKICAgIGlmICh3aWRnZXQubG9ja2VkIHx8IHdpZGdldC5ub01vdmUpCiAgICAgIGNvbnRpbnVlOwogICAgaWYgKGRpcmVjdGlvbiA9PT0gInZlcnRpY2FsIikgewogICAgICB3aGlsZSAod2lkZ2V0LnkgPiAwICYmICFjaGVja0NvbGxpc2lvbih3aWRnZXRzLCB3aWRnZXQsIHdpZGdldC54LCB3aWRnZXQueSAtIDEpKSB7CiAgICAgICAgd2lkZ2V0LnkgLT0gMTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgd2hpbGUgKHdpZGdldC54ID4gMCAmJiAhY2hlY2tDb2xsaXNpb24od2lkZ2V0cywgd2lkZ2V0LCB3aWRnZXQueCAtIDEsIHdpZGdldC55KSkgewogICAgICAgIHdpZGdldC54IC09IDE7CiAgICAgIH0KICAgIH0KICB9Cn07CnZhciBhcHBseUxheW91dCA9ICh3aWRnZXRzLCBsYXlvdXQpID0+IHsKICByZXR1cm4gd2lkZ2V0cy5tYXAoKHdpZGdldCkgPT4gewogICAgY29uc3QgbGF5b3V0SXRlbSA9IGxheW91dC5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSB3aWRnZXQuaWQpOwogICAgcmV0dXJuIGxheW91dEl0ZW0gPyB7IC4uLndpZGdldCwgLi4ubGF5b3V0SXRlbSB9IDogd2lkZ2V0OwogIH0pOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWxheW91dC9kZWVzLWRhc2hib2FyZGdyaWQvaW50ZXJhY3Rpb24uanMKdmFyIGNvbXB1dGVHcmlkQ29vcmRpbmF0ZXMgPSAoeyBwb2ludGVyLCBjb250YWluZXJSZWN0LCBtZXRyaWNzLCBjb2x1bW5zLCB3aWRnZXQsIHJ0bCwgZHJhZ09mZnNldFggPSAwLCBkcmFnT2Zmc2V0WSA9IDAgfSkgPT4gewogIGNvbnN0IHJlbGF0aXZlWCA9IHBvaW50ZXIuY2xpZW50WCAtIGNvbnRhaW5lclJlY3QubGVmdCAtIGRyYWdPZmZzZXRYOwogIGNvbnN0IHJlbGF0aXZlWSA9IHBvaW50ZXIuY2xpZW50WSAtIGNvbnRhaW5lclJlY3QudG9wIC0gZHJhZ09mZnNldFk7CiAgY29uc3QgbWFyZ2luWCA9IG1ldHJpY3MubWFyZ2luSG9yaXpvbnRhbFB4OwogIGNvbnN0IG1hcmdpblkgPSBtZXRyaWNzLm1hcmdpblZlcnRpY2FsUHg7CiAgY29uc3QgY2VsbFdpZHRoID0gbWV0cmljcy5jZWxsV2lkdGhQeDsKICBjb25zdCBjZWxsSGVpZ2h0ID0gbWV0cmljcy5jZWxsSGVpZ2h0UHg7CiAgY29uc3QgY2xhbXAzID0gKHZhbHVlMiwgbWluMywgbWF4MykgPT4gTWF0aC5tYXgobWluMywgTWF0aC5taW4obWF4MywgdmFsdWUyKSk7CiAgY29uc3QgYWRqdXN0ZWRYID0gY2xhbXAzKHJlbGF0aXZlWCAtIG1hcmdpblgsIDAsIGNvbnRhaW5lclJlY3Qud2lkdGggLSBtYXJnaW5YKTsKICBjb25zdCBhZGp1c3RlZFkgPSBjbGFtcDMocmVsYXRpdmVZIC0gbWFyZ2luWSwgMCwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTsKICBjb25zdCBjZWxsUGx1c01hcmdpblggPSBjZWxsV2lkdGggKyBtYXJnaW5YOwogIGNvbnN0IGNlbGxQbHVzTWFyZ2luWSA9IGNlbGxIZWlnaHQgKyBtYXJnaW5ZOwogIGxldCBncmlkWCA9IE1hdGgucm91bmQoYWRqdXN0ZWRYIC8gY2VsbFBsdXNNYXJnaW5YKTsKICBpZiAocnRsKSB7CiAgICBncmlkWCA9IGNvbHVtbnMgLSB3aWRnZXQudyAtIGdyaWRYOwogIH0KICBncmlkWCA9IGNsYW1wMyhncmlkWCwgMCwgY29sdW1ucyAtIHdpZGdldC53KTsKICBjb25zdCBncmlkWSA9IGNsYW1wMyhNYXRoLnJvdW5kKGFkanVzdGVkWSAvIGNlbGxQbHVzTWFyZ2luWSksIDAsIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKTsKICByZXR1cm4geyB4OiBncmlkWCwgeTogZ3JpZFkgfTsKfTsKdmFyIGNvbXB1dGVSZXNpemVEaW1lbnNpb25zID0gKHsgcG9pbnRlciwgY29udGFpbmVyUmVjdCwgbWV0cmljcywgc3RhcnRXaWR0aCwgc3RhcnRIZWlnaHQsIHN0YXJ0UG9pbnRlciwgaGFuZGxlcjogaGFuZGxlcjIsIHdpZGdldCwgY29sdW1ucyB9KSA9PiB7CiAgY29uc3QgZGVsdGFYID0gcG9pbnRlci5jbGllbnRYIC0gc3RhcnRQb2ludGVyLmNsaWVudFg7CiAgY29uc3QgZGVsdGFZID0gcG9pbnRlci5jbGllbnRZIC0gc3RhcnRQb2ludGVyLmNsaWVudFk7CiAgbGV0IHdpZHRoID0gc3RhcnRXaWR0aDsKICBsZXQgaGVpZ2h0ID0gc3RhcnRIZWlnaHQ7CiAgY29uc3QgY2VsbFBsdXNNYXJnaW5YID0gbWV0cmljcy5jZWxsV2lkdGhQeCArIG1ldHJpY3MubWFyZ2luSG9yaXpvbnRhbFB4OwogIGNvbnN0IGNlbGxQbHVzTWFyZ2luWSA9IG1ldHJpY3MuY2VsbEhlaWdodFB4ICsgbWV0cmljcy5tYXJnaW5WZXJ0aWNhbFB4OwogIGlmIChoYW5kbGVyMi5pbmNsdWRlcygiZSIpKSB7CiAgICBjb25zdCBkZWx0YUNvbHMgPSBNYXRoLnJvdW5kKGRlbHRhWCAvIGNlbGxQbHVzTWFyZ2luWCk7CiAgICB3aWR0aCA9IHN0YXJ0V2lkdGggKyBkZWx0YUNvbHM7CiAgfQogIGlmIChoYW5kbGVyMi5pbmNsdWRlcygicyIpKSB7CiAgICBjb25zdCBkZWx0YVJvd3MgPSBNYXRoLnJvdW5kKGRlbHRhWSAvIGNlbGxQbHVzTWFyZ2luWSk7CiAgICBoZWlnaHQgPSBzdGFydEhlaWdodCArIGRlbHRhUm93czsKICB9CiAgY29uc3QgY2xhbXBlZFdpZHRoID0gTWF0aC5tYXgod2lkZ2V0Lm1pblcgfHwgMSwgTWF0aC5taW4od2lkdGgsIHdpZGdldC5tYXhXIHx8IGNvbHVtbnMgLSB3aWRnZXQueCkpOwogIGNvbnN0IGNsYW1wZWRIZWlnaHQgPSBNYXRoLm1heCh3aWRnZXQubWluSCB8fCAxLCBNYXRoLm1pbihoZWlnaHQsIHdpZGdldC5tYXhIIHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSk7CiAgcmV0dXJuIHsKICAgIHdpZHRoOiBjbGFtcGVkV2lkdGgsCiAgICBoZWlnaHQ6IGNsYW1wZWRIZWlnaHQKICB9Owp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWxheW91dC9kZWVzLWRhc2hib2FyZGdyaWQvY29udGV4dG1lbnUuanMKdmFyIG9wZW5XaWRnZXRDb250ZXh0TWVudSA9ICh7IHdpZGdldCwgaG9zdCwgZXZlbnQgfSkgPT4gewogIGNvbnN0IGl0ZW1zID0gWwogICAgewogICAgICBuYW1lOiAiRGVsZXRlIHRpbGUiLAogICAgICBpY29uTmFtZTogImx1Y2lkZTp0cmFzaDIiLAogICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICBob3N0LnJlbW92ZVdpZGdldCh3aWRnZXQuaWQpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgXTsKICBEZWVzQ29udGV4dG1lbnUub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZXZlbnQsIGl0ZW1zKTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1kYXNoYm9hcmRncmlkL2RlZXMtZGFzaGJvYXJkZ3JpZC5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2RlZXNfaWNvbigpOwp2YXIgX19lc0RlY29yYXRlNjYgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczY3ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzRGFzaGJvYXJkZ3JpZCA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtZGFzaGJvYXJkZ3JpZCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3dpZGdldHNfZGVjb3JhdG9yczsKICBsZXQgX3dpZGdldHNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF93aWRnZXRzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jZWxsSGVpZ2h0X2RlY29yYXRvcnM7CiAgbGV0IF9jZWxsSGVpZ2h0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2VsbEhlaWdodF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFyZ2luX2RlY29yYXRvcnM7CiAgbGV0IF9tYXJnaW5faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYXJnaW5fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbHVtbnNfZGVjb3JhdG9yczsKICBsZXQgX2NvbHVtbnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb2x1bW5zX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lZGl0YWJsZV9kZWNvcmF0b3JzOwogIGxldCBfZWRpdGFibGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lZGl0YWJsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZW5hYmxlQW5pbWF0aW9uX2RlY29yYXRvcnM7CiAgbGV0IF9lbmFibGVBbmltYXRpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lbmFibGVBbmltYXRpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NlbGxIZWlnaHRVbml0X2RlY29yYXRvcnM7CiAgbGV0IF9jZWxsSGVpZ2h0VW5pdF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NlbGxIZWlnaHRVbml0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ydGxfZGVjb3JhdG9yczsKICBsZXQgX3J0bF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3J0bF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0dyaWRMaW5lc19kZWNvcmF0b3JzOwogIGxldCBfc2hvd0dyaWRMaW5lc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dHcmlkTGluZXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xheW91dHNfZGVjb3JhdG9yczsKICBsZXQgX2xheW91dHNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sYXlvdXRzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY3RpdmVCcmVha3BvaW50X2RlY29yYXRvcnM7CiAgbGV0IF9hY3RpdmVCcmVha3BvaW50X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWN0aXZlQnJlYWtwb2ludF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcGxhY2Vob2xkZXJQb3NpdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfcGxhY2Vob2xkZXJQb3NpdGlvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BsYWNlaG9sZGVyUG9zaXRpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21ldHJpY3NfZGVjb3JhdG9yczsKICBsZXQgX21ldHJpY3NfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tZXRyaWNzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZXNvbHZlZE1hcmdpbnNfZGVjb3JhdG9yczsKICBsZXQgX3Jlc29sdmVkTWFyZ2luc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Jlc29sdmVkTWFyZ2luc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcHJldmlld1dpZGdldHNfZGVjb3JhdG9yczsKICBsZXQgX3ByZXZpZXdXaWRnZXRzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcHJldmlld1dpZGdldHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0Rhc2hib2FyZGdyaWQyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfd2lkZ2V0c19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfY2VsbEhlaWdodF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX21hcmdpbl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogT2JqZWN0IH0pXTsKICAgICAgX2NvbHVtbnNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF9lZGl0YWJsZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9lbmFibGVBbmltYXRpb25fZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSldOwogICAgICBfY2VsbEhlaWdodFVuaXRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9ydGxfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfc2hvd0dyaWRMaW5lc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9sYXlvdXRzX2RlY29yYXRvcnMgPSBbbjUoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXTsKICAgICAgX2FjdGl2ZUJyZWFrcG9pbnRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9wbGFjZWhvbGRlclBvc2l0aW9uX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9tZXRyaWNzX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9yZXNvbHZlZE1hcmdpbnNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3ByZXZpZXdXaWRnZXRzX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTY2KHRoaXMsIG51bGwsIF93aWRnZXRzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIndpZGdldHMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIndpZGdldHMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoud2lkZ2V0cywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoud2lkZ2V0cyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF93aWRnZXRzX2luaXRpYWxpemVycywgX3dpZGdldHNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2Nih0aGlzLCBudWxsLCBfY2VsbEhlaWdodF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjZWxsSGVpZ2h0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjZWxsSGVpZ2h0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNlbGxIZWlnaHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNlbGxIZWlnaHQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY2VsbEhlaWdodF9pbml0aWFsaXplcnMsIF9jZWxsSGVpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjYodGhpcywgbnVsbCwgX21hcmdpbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtYXJnaW4iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1hcmdpbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYXJnaW4sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1hcmdpbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tYXJnaW5faW5pdGlhbGl6ZXJzLCBfbWFyZ2luX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjYodGhpcywgbnVsbCwgX2NvbHVtbnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29sdW1ucyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29sdW1ucyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jb2x1bW5zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jb2x1bW5zID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbHVtbnNfaW5pdGlhbGl6ZXJzLCBfY29sdW1uc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY2KHRoaXMsIG51bGwsIF9lZGl0YWJsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJlZGl0YWJsZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZWRpdGFibGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZWRpdGFibGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmVkaXRhYmxlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2VkaXRhYmxlX2luaXRpYWxpemVycywgX2VkaXRhYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjYodGhpcywgbnVsbCwgX2VuYWJsZUFuaW1hdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJlbmFibGVBbmltYXRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImVuYWJsZUFuaW1hdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5lbmFibGVBbmltYXRpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmVuYWJsZUFuaW1hdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9lbmFibGVBbmltYXRpb25faW5pdGlhbGl6ZXJzLCBfZW5hYmxlQW5pbWF0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjYodGhpcywgbnVsbCwgX2NlbGxIZWlnaHRVbml0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNlbGxIZWlnaHRVbml0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjZWxsSGVpZ2h0VW5pdCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jZWxsSGVpZ2h0VW5pdCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY2VsbEhlaWdodFVuaXQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY2VsbEhlaWdodFVuaXRfaW5pdGlhbGl6ZXJzLCBfY2VsbEhlaWdodFVuaXRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2Nih0aGlzLCBudWxsLCBfcnRsX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJ0bCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicnRsIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJ0bCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucnRsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3J0bF9pbml0aWFsaXplcnMsIF9ydGxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2Nih0aGlzLCBudWxsLCBfc2hvd0dyaWRMaW5lc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93R3JpZExpbmVzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93R3JpZExpbmVzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dHcmlkTGluZXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dHcmlkTGluZXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd0dyaWRMaW5lc19pbml0aWFsaXplcnMsIF9zaG93R3JpZExpbmVzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjYodGhpcywgbnVsbCwgX2xheW91dHNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibGF5b3V0cyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibGF5b3V0cyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sYXlvdXRzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5sYXlvdXRzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xheW91dHNfaW5pdGlhbGl6ZXJzLCBfbGF5b3V0c19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY2KHRoaXMsIG51bGwsIF9hY3RpdmVCcmVha3BvaW50X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFjdGl2ZUJyZWFrcG9pbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFjdGl2ZUJyZWFrcG9pbnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWN0aXZlQnJlYWtwb2ludCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYWN0aXZlQnJlYWtwb2ludCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hY3RpdmVCcmVha3BvaW50X2luaXRpYWxpemVycywgX2FjdGl2ZUJyZWFrcG9pbnRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2Nih0aGlzLCBudWxsLCBfcGxhY2Vob2xkZXJQb3NpdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwbGFjZWhvbGRlclBvc2l0aW9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJwbGFjZWhvbGRlclBvc2l0aW9uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnBsYWNlaG9sZGVyUG9zaXRpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnBsYWNlaG9sZGVyUG9zaXRpb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcGxhY2Vob2xkZXJQb3NpdGlvbl9pbml0aWFsaXplcnMsIF9wbGFjZWhvbGRlclBvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjYodGhpcywgbnVsbCwgX21ldHJpY3NfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWV0cmljcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWV0cmljcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tZXRyaWNzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tZXRyaWNzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21ldHJpY3NfaW5pdGlhbGl6ZXJzLCBfbWV0cmljc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY2KHRoaXMsIG51bGwsIF9yZXNvbHZlZE1hcmdpbnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicmVzb2x2ZWRNYXJnaW5zIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJyZXNvbHZlZE1hcmdpbnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucmVzb2x2ZWRNYXJnaW5zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yZXNvbHZlZE1hcmdpbnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcmVzb2x2ZWRNYXJnaW5zX2luaXRpYWxpemVycywgX3Jlc29sdmVkTWFyZ2luc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY2KHRoaXMsIG51bGwsIF9wcmV2aWV3V2lkZ2V0c19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwcmV2aWV3V2lkZ2V0cyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicHJldmlld1dpZGdldHMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucHJldmlld1dpZGdldHMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnByZXZpZXdXaWRnZXRzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ByZXZpZXdXaWRnZXRzX2luaXRpYWxpemVycywgX3ByZXZpZXdXaWRnZXRzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjYobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzRGFzaGJvYXJkZ3JpZDIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzQ2OwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkxheW91dCJdOwogICAgc3RhdGljIHN0eWxlcyA9IGRhc2hib2FyZEdyaWRTdHlsZXM7CiAgICAjd2lkZ2V0c19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM2Nyh0aGlzLCBfd2lkZ2V0c19pbml0aWFsaXplcnMsIFtdKTsKICAgIGdldCB3aWRnZXRzKCkgewogICAgICByZXR1cm4gdGhpcy4jd2lkZ2V0c19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHdpZGdldHModmFsdWUyKSB7CiAgICAgIHRoaXMuI3dpZGdldHNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjZWxsSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2Nyh0aGlzLCBfd2lkZ2V0c19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjcodGhpcywgX2NlbGxIZWlnaHRfaW5pdGlhbGl6ZXJzLCA4MCkpOwogICAgZ2V0IGNlbGxIZWlnaHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjZWxsSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY2VsbEhlaWdodCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY2VsbEhlaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21hcmdpbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjcodGhpcywgX2NlbGxIZWlnaHRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczY3KHRoaXMsIF9tYXJnaW5faW5pdGlhbGl6ZXJzLCAxMCkpOwogICAgZ2V0IG1hcmdpbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI21hcmdpbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1hcmdpbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWFyZ2luX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29sdW1uc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjcodGhpcywgX21hcmdpbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjcodGhpcywgX2NvbHVtbnNfaW5pdGlhbGl6ZXJzLCAxMikpOwogICAgZ2V0IGNvbHVtbnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb2x1bW5zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29sdW1ucyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29sdW1uc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2VkaXRhYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2Nyh0aGlzLCBfY29sdW1uc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjcodGhpcywgX2VkaXRhYmxlX2luaXRpYWxpemVycywgdHJ1ZSkpOwogICAgZ2V0IGVkaXRhYmxlKCkgewogICAgICByZXR1cm4gdGhpcy4jZWRpdGFibGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBlZGl0YWJsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZWRpdGFibGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNlbmFibGVBbmltYXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY3KHRoaXMsIF9lZGl0YWJsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjcodGhpcywgX2VuYWJsZUFuaW1hdGlvbl9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBlbmFibGVBbmltYXRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNlbmFibGVBbmltYXRpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBlbmFibGVBbmltYXRpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI2VuYWJsZUFuaW1hdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NlbGxIZWlnaHRVbml0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2Nyh0aGlzLCBfZW5hYmxlQW5pbWF0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2Nyh0aGlzLCBfY2VsbEhlaWdodFVuaXRfaW5pdGlhbGl6ZXJzLCAicHgiKSk7CiAgICBnZXQgY2VsbEhlaWdodFVuaXQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjZWxsSGVpZ2h0VW5pdF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNlbGxIZWlnaHRVbml0KHZhbHVlMikgewogICAgICB0aGlzLiNjZWxsSGVpZ2h0VW5pdF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3J0bF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjcodGhpcywgX2NlbGxIZWlnaHRVbml0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2Nyh0aGlzLCBfcnRsX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBydGwoKSB7CiAgICAgIHJldHVybiB0aGlzLiNydGxfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBydGwodmFsdWUyKSB7CiAgICAgIHRoaXMuI3J0bF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dHcmlkTGluZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY3KHRoaXMsIF9ydGxfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczY3KHRoaXMsIF9zaG93R3JpZExpbmVzX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBzaG93R3JpZExpbmVzKCkgewogICAgICByZXR1cm4gdGhpcy4jc2hvd0dyaWRMaW5lc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dHcmlkTGluZXModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dHcmlkTGluZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsYXlvdXRzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2Nyh0aGlzLCBfc2hvd0dyaWRMaW5lc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjcodGhpcywgX2xheW91dHNfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBsYXlvdXRzKCkgewogICAgICByZXR1cm4gdGhpcy4jbGF5b3V0c19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxheW91dHModmFsdWUyKSB7CiAgICAgIHRoaXMuI2xheW91dHNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhY3RpdmVCcmVha3BvaW50X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2Nyh0aGlzLCBfbGF5b3V0c19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjcodGhpcywgX2FjdGl2ZUJyZWFrcG9pbnRfaW5pdGlhbGl6ZXJzLCAiYmFzZSIpKTsKICAgIGdldCBhY3RpdmVCcmVha3BvaW50KCkgewogICAgICByZXR1cm4gdGhpcy4jYWN0aXZlQnJlYWtwb2ludF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFjdGl2ZUJyZWFrcG9pbnQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2FjdGl2ZUJyZWFrcG9pbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNwbGFjZWhvbGRlclBvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2Nyh0aGlzLCBfYWN0aXZlQnJlYWtwb2ludF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjcodGhpcywgX3BsYWNlaG9sZGVyUG9zaXRpb25faW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICBnZXQgcGxhY2Vob2xkZXJQb3NpdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3BsYWNlaG9sZGVyUG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwbGFjZWhvbGRlclBvc2l0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNwbGFjZWhvbGRlclBvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWV0cmljc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjcodGhpcywgX3BsYWNlaG9sZGVyUG9zaXRpb25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczY3KHRoaXMsIF9tZXRyaWNzX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IG1ldHJpY3MoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtZXRyaWNzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWV0cmljcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWV0cmljc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Jlc29sdmVkTWFyZ2luc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjcodGhpcywgX21ldHJpY3NfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczY3KHRoaXMsIF9yZXNvbHZlZE1hcmdpbnNfaW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICBnZXQgcmVzb2x2ZWRNYXJnaW5zKCkgewogICAgICByZXR1cm4gdGhpcy4jcmVzb2x2ZWRNYXJnaW5zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcmVzb2x2ZWRNYXJnaW5zKHZhbHVlMikgewogICAgICB0aGlzLiNyZXNvbHZlZE1hcmdpbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNwcmV2aWV3V2lkZ2V0c19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjcodGhpcywgX3Jlc29sdmVkTWFyZ2luc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjcodGhpcywgX3ByZXZpZXdXaWRnZXRzX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IHByZXZpZXdXaWRnZXRzKCkgewogICAgICByZXR1cm4gdGhpcy4jcHJldmlld1dpZGdldHNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwcmV2aWV3V2lkZ2V0cyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcHJldmlld1dpZGdldHNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGNvbnRhaW5lckJvdW5kcyA9IChfX3J1bkluaXRpYWxpemVyczY3KHRoaXMsIF9wcmV2aWV3V2lkZ2V0c19leHRyYUluaXRpYWxpemVycyksIG51bGwpOwogICAgZHJhZ1N0YXRlID0gbnVsbDsKICAgIHJlc2l6ZVN0YXRlID0gbnVsbDsKICAgIHJlc2l6ZU9ic2VydmVyOwogICAgaW50ZXJhY3Rpb25BY3RpdmUgPSBmYWxzZTsKICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLmNvbXB1dGVNZXRyaWNzKCk7CiAgICAgIHRoaXMub2JzZXJ2ZVJlc2l6ZSgpOwogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuZGlzY29ubmVjdFJlc2l6ZU9ic2VydmVyKCk7CiAgICAgIHRoaXMucmVsZWFzZVBvaW50ZXJFdmVudHMoKTsKICAgIH0KICAgIHVwZGF0ZWQoY2hhbmdlZCkgewogICAgICBpZiAoY2hhbmdlZC5oYXMoIm1hcmdpbiIpIHx8IGNoYW5nZWQuaGFzKCJjb2x1bW5zIikgfHwgY2hhbmdlZC5oYXMoImNlbGxIZWlnaHQiKSB8fCBjaGFuZ2VkLmhhcygiY2VsbEhlaWdodFVuaXQiKSkgewogICAgICAgIHRoaXMuY29tcHV0ZU1ldHJpY3MoKTsKICAgICAgfQogICAgICBpZiAoY2hhbmdlZC5oYXMoIndpZGdldHMiKSAmJiAhdGhpcy5pbnRlcmFjdGlvbkFjdGl2ZSkgewogICAgICAgIHRoaXMubm90aWZ5TGF5b3V0Q2hhbmdlKCk7CiAgICAgIH0KICAgIH0KICAgIHJlbmRlcigpIHsKICAgICAgY29uc3QgYmFzZVdpZGdldHMgPSB0aGlzLndpZGdldHM7CiAgICAgIGlmIChiYXNlV2lkZ2V0cy5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiPgogICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6bGF5b3V0R3JpZCJ9PjwvZGVlcy1pY29uPgogICAgICAgICAgPGRpdj5ObyB3aWRnZXRzIGNvbmZpZ3VyZWQ8L2Rpdj4KICAgICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZTogMTRweDsgbWFyZ2luLXRvcDogOHB4OyI+QWRkIHdpZGdldHMgdG8gcG9wdWxhdGUgdGhlIGRhc2hib2FyZDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgICB9CiAgICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLmVuc3VyZU1ldHJpY3MoKTsKICAgICAgY29uc3QgbWFyZ2lucyA9IHRoaXMucmVzb2x2ZWRNYXJnaW5zID8/IHJlc29sdmVNYXJnaW5zKHRoaXMubWFyZ2luKTsKICAgICAgY29uc3QgY2VsbEhlaWdodCA9IG1ldHJpY3MuY2VsbEhlaWdodFB4OwogICAgICBjb25zdCBsYXlvdXRGb3JIZWlnaHQgPSB0aGlzLnByZXZpZXdXaWRnZXRzID8/IHRoaXMud2lkZ2V0czsKICAgICAgY29uc3QgZ3JpZEhlaWdodCA9IGNhbGN1bGF0ZUdyaWRIZWlnaHQobGF5b3V0Rm9ySGVpZ2h0LCBtYXJnaW5zLCBjZWxsSGVpZ2h0KTsKICAgICAgY29uc3QgcHJldmlld01hcCA9IHRoaXMucHJldmlld1dpZGdldHMgPyBuZXcgTWFwKHRoaXMucHJldmlld1dpZGdldHMubWFwKCh3aWRnZXQpID0+IFt3aWRnZXQuaWQsIHdpZGdldF0pKSA6IG51bGw7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iZ3JpZC1jb250YWluZXIiIHN0eWxlPSJoZWlnaHQ6ICR7Z3JpZEhlaWdodH1weDsiPgogICAgICAgICR7dGhpcy5zaG93R3JpZExpbmVzID8gdGhpcy5yZW5kZXJHcmlkTGluZXMobWV0cmljcywgZ3JpZEhlaWdodCkgOiBudWxsfQogICAgICAgICR7YmFzZVdpZGdldHMubWFwKCh3aWRnZXQpID0+IHRoaXMucmVuZGVyV2lkZ2V0KHdpZGdldCwgbWV0cmljcywgbWFyZ2lucywgcHJldmlld01hcCkpfQogICAgICAgICR7dGhpcy5wbGFjZWhvbGRlclBvc2l0aW9uID8gdGhpcy5yZW5kZXJQbGFjZWhvbGRlcihtZXRyaWNzLCBtYXJnaW5zKSA6IG51bGx9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlckdyaWRMaW5lcyhtZXRyaWNzLCBncmlkSGVpZ2h0KSB7CiAgICAgIGNvbnN0IHZlcnRpY2FsID0gW107CiAgICAgIGNvbnN0IGhvcml6b250YWwgPSBbXTsKICAgICAgY29uc3QgY2VsbFBsdXNNYXJnaW5YID0gbWV0cmljcy5jZWxsV2lkdGhQeCArIG1ldHJpY3MubWFyZ2luSG9yaXpvbnRhbFB4OwogICAgICBjb25zdCBjZWxsUGx1c01hcmdpblkgPSBtZXRyaWNzLmNlbGxIZWlnaHRQeCArIG1ldHJpY3MubWFyZ2luVmVydGljYWxQeDsKICAgICAgZm9yIChsZXQgaTExID0gMDsgaTExIDw9IHRoaXMuY29sdW1uczsgaTExKyspIHsKICAgICAgICBjb25zdCBsZWZ0UHggPSBpMTEgKiBjZWxsUGx1c01hcmdpblggKyBtZXRyaWNzLm1hcmdpbkhvcml6b250YWxQeDsKICAgICAgICBjb25zdCBsZWZ0UGVyY2VudCA9IHRoaXMucHhUb1BlcmNlbnQobGVmdFB4LCBtZXRyaWNzLmNvbnRhaW5lcldpZHRoKTsKICAgICAgICB2ZXJ0aWNhbC5wdXNoKGIyYDxkaXYgY2xhc3M9ImdyaWQtbGluZS12ZXJ0aWNhbCIgc3R5bGU9ImxlZnQ6ICR7bGVmdFBlcmNlbnR9JTsiPjwvZGl2PmApOwogICAgICB9CiAgICAgIGNvbnN0IHJvd3MgPSBNYXRoLmNlaWwoZ3JpZEhlaWdodCAvIGNlbGxQbHVzTWFyZ2luWSk7CiAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8PSByb3dzOyByb3crKykgewogICAgICAgIGNvbnN0IHRvcCA9IHJvdyAqIGNlbGxQbHVzTWFyZ2luWTsKICAgICAgICBob3Jpem9udGFsLnB1c2goYjJgPGRpdiBjbGFzcz0iZ3JpZC1saW5lLWhvcml6b250YWwiIHN0eWxlPSJ0b3A6ICR7dG9wfXB4OyI+PC9kaXY+YCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJncmlkLWxpbmVzIj4KICAgICAgICAke3ZlcnRpY2FsfQogICAgICAgICR7aG9yaXpvbnRhbH0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgcmVuZGVyV2lkZ2V0KHdpZGdldCwgbWV0cmljcywgbWFyZ2lucywgcHJldmlld01hcCkgewogICAgICBjb25zdCBpc0RyYWdnaW5nID0gdGhpcy5kcmFnU3RhdGU/LndpZGdldElkID09PSB3aWRnZXQuaWQ7CiAgICAgIGNvbnN0IGlzUmVzaXppbmcgPSB0aGlzLnJlc2l6ZVN0YXRlPy53aWRnZXRJZCA9PT0gd2lkZ2V0LmlkOwogICAgICBjb25zdCBpc0xvY2tlZCA9IHdpZGdldC5sb2NrZWQgfHwgIXRoaXMuZWRpdGFibGU7CiAgICAgIGNvbnN0IHByZXZpZXdXaWRnZXQgPSBwcmV2aWV3TWFwPy5nZXQod2lkZ2V0LmlkKSA/PyBudWxsOwogICAgICBjb25zdCBsYXlvdXRGb3JSZW5kZXIgPSBpc0RyYWdnaW5nID8gd2lkZ2V0IDogcHJldmlld1dpZGdldCA/PyB3aWRnZXQ7CiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmNvbXB1dGVXaWRnZXRSZWN0KGxheW91dEZvclJlbmRlciwgbWV0cmljcywgbWFyZ2lucyk7CiAgICAgIGNvbnN0IHNpZGVQcm9wZXJ0eSA9IHRoaXMucnRsID8gInJpZ2h0IiA6ICJsZWZ0IjsKICAgICAgY29uc3Qgc2lkZVZhbHVlID0gdGhpcy5weFRvUGVyY2VudChyZWN0LmxlZnQsIG1ldHJpY3MuY29udGFpbmVyV2lkdGgpOwogICAgICBjb25zdCB3aWR0aFBlcmNlbnQgPSB0aGlzLnB4VG9QZXJjZW50KHJlY3Qud2lkdGgsIG1ldHJpY3MuY29udGFpbmVyV2lkdGgpOwogICAgICBsZXQgdHJhbnNmb3JtMiA9ICIiOwogICAgICBpZiAoaXNEcmFnZ2luZyAmJiB0aGlzLmRyYWdTdGF0ZT8uY3VycmVudFBvaW50ZXIpIHsKICAgICAgICBjb25zdCBwb2ludGVyID0gdGhpcy5kcmFnU3RhdGUuY3VycmVudFBvaW50ZXI7CiAgICAgICAgY29uc3QgYm91bmRzID0gdGhpcy5jb250YWluZXJCb3VuZHMgPz8gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBjb25zdCB0cmFuc2xhdGVYID0gcG9pbnRlci5jbGllbnRYIC0gYm91bmRzLmxlZnQgLSB0aGlzLmRyYWdTdGF0ZS5vZmZzZXRYIC0gcmVjdC5sZWZ0OwogICAgICAgIGNvbnN0IHRyYW5zbGF0ZVkgPSBwb2ludGVyLmNsaWVudFkgLSBib3VuZHMudG9wIC0gdGhpcy5kcmFnU3RhdGUub2Zmc2V0WSAtIHJlY3QudG9wOwogICAgICAgIHRyYW5zZm9ybTIgPSBgdHJhbnNmb3JtOiB0cmFuc2xhdGUoJHt0cmFuc2xhdGVYfXB4LCAke3RyYW5zbGF0ZVl9cHgpO2A7CiAgICAgIH0KICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9ImdyaWQtd2lkZ2V0ICR7aXNEcmFnZ2luZyA/ICJkcmFnZ2luZyIgOiAiIn0gJHtpc1Jlc2l6aW5nID8gInJlc2l6aW5nIiA6ICIifSIKICAgICAgICBzdHlsZT0iCiAgICAgICAgICAke3NpZGVQcm9wZXJ0eX06ICR7c2lkZVZhbHVlfSU7CiAgICAgICAgICB0b3A6ICR7cmVjdC50b3B9cHg7CiAgICAgICAgICB3aWR0aDogJHt3aWR0aFBlcmNlbnR9JTsKICAgICAgICAgIGhlaWdodDogJHtyZWN0LmhlaWdodH1weDsKICAgICAgICAgICR7dHJhbnNmb3JtMn0KICAgICAgICAiCiAgICAgICAgZGF0YS13aWRnZXQtaWQ9JHt3aWRnZXQuaWR9CiAgICAgID4KICAgICAgICA8ZGl2IGNsYXNzPSJ3aWRnZXQtY29udGVudCI+CiAgICAgICAgICAke3dpZGdldC50aXRsZSA/IGIyYAogICAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgICBjbGFzcz0id2lkZ2V0LWhlYWRlciAke2lzTG9ja2VkID8gImxvY2tlZCIgOiAiIn0iCiAgICAgICAgICAgICAgICAgIEBwb2ludGVyZG93bj0keyFpc0xvY2tlZCAmJiAhd2lkZ2V0Lm5vTW92ZSA/IChldnQpID0+IHRoaXMuc3RhcnREcmFnKGV2dCwgd2lkZ2V0KSA6IG51bGx9CiAgICAgICAgICAgICAgICAgIEBjb250ZXh0bWVudT0keyhldnQpID0+IHRoaXMuaGFuZGxlV2lkZ2V0Q29udGV4dE1lbnUoZXZ0LCB3aWRnZXQpfQogICAgICAgICAgICAgICAgICB0YWJpbmRleD0keyFpc0xvY2tlZCAmJiAhd2lkZ2V0Lm5vTW92ZSA/IDAgOiAtMX0KICAgICAgICAgICAgICAgICAgQGtleWRvd249JHsoZXZ0KSA9PiB0aGlzLmhhbmRsZUhlYWRlcktleWRvd24oZXZ0LCB3aWRnZXQpfQogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAke3dpZGdldC5pY29uID8gYjJgPGRlZXMtaWNvbiAuaWNvbj0ke3dpZGdldC5pY29ufT48L2RlZXMtaWNvbj5gIDogbnVsbH0KICAgICAgICAgICAgICAgICAgJHt3aWRnZXQudGl0bGV9CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICBgIDogbnVsbH0KICAgICAgICAgIDxkaXYgY2xhc3M9IndpZGdldC1ib2R5ICR7d2lkZ2V0LnRpdGxlID8gImhhcy1oZWFkZXIiIDogIiJ9Ij4KICAgICAgICAgICAgJHt3aWRnZXQuY29udGVudH0KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgJHshaXNMb2NrZWQgJiYgIXdpZGdldC5ub1Jlc2l6ZSA/IGIyYAogICAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgICBjbGFzcz0icmVzaXplLWhhbmRsZSByZXNpemUtaGFuZGxlLWUiCiAgICAgICAgICAgICAgICAgIEBwb2ludGVyZG93bj0keyhldnQpID0+IHRoaXMuc3RhcnRSZXNpemUoZXZ0LCB3aWRnZXQsICJlIil9CiAgICAgICAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2CiAgICAgICAgICAgICAgICAgIGNsYXNzPSJyZXNpemUtaGFuZGxlIHJlc2l6ZS1oYW5kbGUtcyIKICAgICAgICAgICAgICAgICAgQHBvaW50ZXJkb3duPSR7KGV2dCkgPT4gdGhpcy5zdGFydFJlc2l6ZShldnQsIHdpZGdldCwgInMiKX0KICAgICAgICAgICAgICAgID48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgY2xhc3M9InJlc2l6ZS1oYW5kbGUgcmVzaXplLWhhbmRsZS1zZSIKICAgICAgICAgICAgICAgICAgQHBvaW50ZXJkb3duPSR7KGV2dCkgPT4gdGhpcy5zdGFydFJlc2l6ZShldnQsIHdpZGdldCwgInNlIil9CiAgICAgICAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICAgICAgYCA6IG51bGx9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlclBsYWNlaG9sZGVyKG1ldHJpY3MsIG1hcmdpbnMpIHsKICAgICAgaWYgKCF0aGlzLnBsYWNlaG9sZGVyUG9zaXRpb24pIHsKICAgICAgICByZXR1cm4gYjJgYDsKICAgICAgfQogICAgICBjb25zdCByZWN0ID0gdGhpcy5jb21wdXRlV2lkZ2V0UmVjdCh0aGlzLnBsYWNlaG9sZGVyUG9zaXRpb24sIG1ldHJpY3MsIG1hcmdpbnMpOwogICAgICBjb25zdCBzaWRlUHJvcGVydHkgPSB0aGlzLnJ0bCA/ICJyaWdodCIgOiAibGVmdCI7CiAgICAgIGNvbnN0IHNpZGVWYWx1ZSA9IHRoaXMucHhUb1BlcmNlbnQocmVjdC5sZWZ0LCBtZXRyaWNzLmNvbnRhaW5lcldpZHRoKTsKICAgICAgY29uc3Qgd2lkdGhQZXJjZW50ID0gdGhpcy5weFRvUGVyY2VudChyZWN0LndpZHRoLCBtZXRyaWNzLmNvbnRhaW5lcldpZHRoKTsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9ImdyaWQtd2lkZ2V0IHBsYWNlaG9sZGVyIgogICAgICAgIHN0eWxlPSIKICAgICAgICAgICR7c2lkZVByb3BlcnR5fTogJHtzaWRlVmFsdWV9JTsKICAgICAgICAgIHRvcDogJHtyZWN0LnRvcH1weDsKICAgICAgICAgIHdpZHRoOiAke3dpZHRoUGVyY2VudH0lOwogICAgICAgICAgaGVpZ2h0OiAke3JlY3QuaGVpZ2h0fXB4OwogICAgICAgICIKICAgICAgPgogICAgICAgIDxkaXYgY2xhc3M9IndpZGdldC1jb250ZW50Ij48L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgc3RhcnREcmFnKGV2ZW50LCB3aWRnZXQpIHsKICAgICAgaWYgKCF0aGlzLmVkaXRhYmxlIHx8IHdpZGdldC5ub01vdmUgfHwgd2lkZ2V0LmxvY2tlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgY29uc3Qgd2lkZ2V0RWxlbWVudCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQuY2xvc2VzdCgiLmdyaWQtd2lkZ2V0Iik7CiAgICAgIGlmICghd2lkZ2V0RWxlbWVudCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCB3aWRnZXRSZWN0ID0gd2lkZ2V0RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgdGhpcy5jb250YWluZXJCb3VuZHMgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICB0aGlzLmVuc3VyZU1ldHJpY3MoKTsKICAgICAgdGhpcy5kcmFnU3RhdGUgPSB7CiAgICAgICAgd2lkZ2V0SWQ6IHdpZGdldC5pZCwKICAgICAgICBwb2ludGVySWQ6IGV2ZW50LnBvaW50ZXJJZCwKICAgICAgICBvZmZzZXRYOiBldmVudC5jbGllbnRYIC0gd2lkZ2V0UmVjdC5sZWZ0LAogICAgICAgIG9mZnNldFk6IGV2ZW50LmNsaWVudFkgLSB3aWRnZXRSZWN0LnRvcCwKICAgICAgICBzdGFydDogeyBpZDogd2lkZ2V0LmlkLCB4OiB3aWRnZXQueCwgeTogd2lkZ2V0LnksIHc6IHdpZGdldC53LCBoOiB3aWRnZXQuaCB9LAogICAgICAgIHByZXZpb3VzUG9zaXRpb246IHsgaWQ6IHdpZGdldC5pZCwgeDogd2lkZ2V0LngsIHk6IHdpZGdldC55LCB3OiB3aWRnZXQudywgaDogd2lkZ2V0LmggfSwKICAgICAgICBjdXJyZW50UG9pbnRlcjogeyBjbGllbnRYOiBldmVudC5jbGllbnRYLCBjbGllbnRZOiBldmVudC5jbGllbnRZIH0sCiAgICAgICAgbGFzdFBsYWNlbWVudDogbnVsbAogICAgICB9OwogICAgICB0aGlzLmludGVyYWN0aW9uQWN0aXZlID0gdHJ1ZTsKICAgICAgZXZlbnQuY3VycmVudFRhcmdldC5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsIHRoaXMuaGFuZGxlRHJhZ01vdmUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCB0aGlzLmhhbmRsZURyYWdFbmQpOwogICAgICB0aGlzLnBsYWNlaG9sZGVyUG9zaXRpb24gPSB7IGlkOiB3aWRnZXQuaWQsIHg6IHdpZGdldC54LCB5OiB3aWRnZXQueSwgdzogd2lkZ2V0LncsIGg6IHdpZGdldC5oIH07CiAgICB9CiAgICBoYW5kbGVEcmFnTW92ZSA9IChldmVudCkgPT4gewogICAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgbWV0cmljcyA9IHRoaXMuZW5zdXJlTWV0cmljcygpOwogICAgICBjb25zdCBhY3RpdmVXaWRnZXRzID0gdGhpcy53aWRnZXRzOwogICAgICBjb25zdCB3aWRnZXQgPSBhY3RpdmVXaWRnZXRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IHRoaXMuZHJhZ1N0YXRlLndpZGdldElkKTsKICAgICAgaWYgKCF3aWRnZXQpCiAgICAgICAgcmV0dXJuOwogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb25zdCBwcmV2aW91c1Bvc2l0aW9uID0gdGhpcy5kcmFnU3RhdGUucHJldmlvdXNQb3NpdGlvbjsKICAgICAgY29uc3QgY29vcmRzID0gY29tcHV0ZUdyaWRDb29yZGluYXRlcyh7CiAgICAgICAgcG9pbnRlcjogeyBjbGllbnRYOiBldmVudC5jbGllbnRYLCBjbGllbnRZOiBldmVudC5jbGllbnRZIH0sCiAgICAgICAgY29udGFpbmVyUmVjdDogdGhpcy5jb250YWluZXJCb3VuZHMgPz8gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICAgICAgICBtZXRyaWNzLAogICAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1ucywKICAgICAgICB3aWRnZXQsCiAgICAgICAgcnRsOiB0aGlzLnJ0bCwKICAgICAgICBkcmFnT2Zmc2V0WDogdGhpcy5kcmFnU3RhdGUub2Zmc2V0WCwKICAgICAgICBkcmFnT2Zmc2V0WTogdGhpcy5kcmFnU3RhdGUub2Zmc2V0WQogICAgICB9KTsKICAgICAgY29uc3QgcGxhY2VtZW50ID0gcmVzb2x2ZVdpZGdldFBsYWNlbWVudChhY3RpdmVXaWRnZXRzLCB3aWRnZXQuaWQsIHsgeDogY29vcmRzLngsIHk6IGNvb3Jkcy55IH0sIHRoaXMuY29sdW1ucywgcHJldmlvdXNQb3NpdGlvbik7CiAgICAgIGlmIChwbGFjZW1lbnQpIHsKICAgICAgICBjb25zdCB1cGRhdGVkV2lkZ2V0ID0gcGxhY2VtZW50LndpZGdldHMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gd2lkZ2V0LmlkKTsKICAgICAgICB0aGlzLmRyYWdTdGF0ZSA9IHsKICAgICAgICAgIC4uLnRoaXMuZHJhZ1N0YXRlLAogICAgICAgICAgY3VycmVudFBvaW50ZXI6IHsgY2xpZW50WDogZXZlbnQuY2xpZW50WCwgY2xpZW50WTogZXZlbnQuY2xpZW50WSB9LAogICAgICAgICAgbGFzdFBsYWNlbWVudDogcGxhY2VtZW50LAogICAgICAgICAgcHJldmlvdXNQb3NpdGlvbjogdXBkYXRlZFdpZGdldCA/IHsgaWQ6IHVwZGF0ZWRXaWRnZXQuaWQsIHg6IHVwZGF0ZWRXaWRnZXQueCwgeTogdXBkYXRlZFdpZGdldC55LCB3OiB1cGRhdGVkV2lkZ2V0LncsIGg6IHVwZGF0ZWRXaWRnZXQuaCB9IDogeyBpZDogd2lkZ2V0LmlkLCB4OiBjb29yZHMueCwgeTogY29vcmRzLnksIHc6IHdpZGdldC53LCBoOiB3aWRnZXQuaCB9CiAgICAgICAgfTsKICAgICAgICB0aGlzLnByZXZpZXdXaWRnZXRzID0gcGxhY2VtZW50LndpZGdldHM7CiAgICAgICAgY29uc3QgcHJldmlld1dpZGdldCA9IHBsYWNlbWVudC53aWRnZXRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IHdpZGdldC5pZCk7CiAgICAgICAgaWYgKHByZXZpZXdXaWRnZXQpIHsKICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXJQb3NpdGlvbiA9IHsKICAgICAgICAgICAgaWQ6IHByZXZpZXdXaWRnZXQuaWQsCiAgICAgICAgICAgIHg6IHByZXZpZXdXaWRnZXQueCwKICAgICAgICAgICAgeTogcHJldmlld1dpZGdldC55LAogICAgICAgICAgICB3OiBwcmV2aWV3V2lkZ2V0LncsCiAgICAgICAgICAgIGg6IHByZXZpZXdXaWRnZXQuaAogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5wbGFjZWhvbGRlclBvc2l0aW9uID0geyBpZDogd2lkZ2V0LmlkLCB4OiBjb29yZHMueCwgeTogY29vcmRzLnksIHc6IHdpZGdldC53LCBoOiB3aWRnZXQuaCB9OwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnByZXZpZXdXaWRnZXRzID0gbnVsbDsKICAgICAgICB0aGlzLnBsYWNlaG9sZGVyUG9zaXRpb24gPSBudWxsOwogICAgICB9CiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgfTsKICAgIGhhbmRsZURyYWdFbmQgPSAoZXZlbnQpID0+IHsKICAgICAgY29uc3QgZHJhZ1N0YXRlID0gdGhpcy5kcmFnU3RhdGU7CiAgICAgIGlmICghZHJhZ1N0YXRlIHx8IGV2ZW50LnBvaW50ZXJJZCAhPT0gZHJhZ1N0YXRlLnBvaW50ZXJJZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBsYXlvdXRTb3VyY2UgPSB0aGlzLndpZGdldHM7CiAgICAgIHRoaXMucHJldmlld1dpZGdldHMgPSBudWxsOwogICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnBsYWNlaG9sZGVyUG9zaXRpb24gPz8gZHJhZ1N0YXRlLnN0YXJ0OwogICAgICBjb25zdCBwbGFjZW1lbnQgPSByZXNvbHZlV2lkZ2V0UGxhY2VtZW50KGxheW91dFNvdXJjZSwgZHJhZ1N0YXRlLndpZGdldElkLCB7IHg6IHRhcmdldC54LCB5OiB0YXJnZXQueSB9LCB0aGlzLmNvbHVtbnMsIGRyYWdTdGF0ZS5wcmV2aW91c1Bvc2l0aW9uKTsKICAgICAgaWYgKHBsYWNlbWVudCkgewogICAgICAgIGNvbnN0IGZpbmFsV2lkZ2V0ID0gcGxhY2VtZW50LndpZGdldHMuZmluZCgodzMpID0+IHczLmlkID09PSBkcmFnU3RhdGUud2lkZ2V0SWQpOwogICAgICAgIGlmIChmaW5hbFdpZGdldCkgewogICAgICAgICAgY29uc3QgaGFzT3ZlcmxhcCA9IHBsYWNlbWVudC53aWRnZXRzLnNvbWUoKHczKSA9PiB7CiAgICAgICAgICAgIGlmICh3My5pZCA9PT0gZHJhZ1N0YXRlLndpZGdldElkKQogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgcmV0dXJuIGZpbmFsV2lkZ2V0LnggPCB3My54ICsgdzMudyAmJiBmaW5hbFdpZGdldC54ICsgZmluYWxXaWRnZXQudyA+IHczLnggJiYgZmluYWxXaWRnZXQueSA8IHczLnkgKyB3My5oICYmIGZpbmFsV2lkZ2V0LnkgKyBmaW5hbFdpZGdldC5oID4gdzMueTsKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKCFoYXNPdmVybGFwKSB7CiAgICAgICAgICAgIHRoaXMuY29tbWl0UGxhY2VtZW50KHBsYWNlbWVudCwgZHJhZ1N0YXRlLndpZGdldElkLCAid2lkZ2V0LW1vdmUiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMud2lkZ2V0cyA9IHRoaXMud2lkZ2V0cy5tYXAoKHdpZGdldCkgPT4gd2lkZ2V0LmlkID09PSBkcmFnU3RhdGUud2lkZ2V0SWQgPyB7IC4uLndpZGdldCwgeDogZHJhZ1N0YXRlLnN0YXJ0LngsIHk6IGRyYWdTdGF0ZS5zdGFydC55IH0gOiB3aWRnZXQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLndpZGdldHMgPSB0aGlzLndpZGdldHMubWFwKCh3aWRnZXQpID0+IHdpZGdldC5pZCA9PT0gZHJhZ1N0YXRlLndpZGdldElkID8geyAuLi53aWRnZXQsIHg6IGRyYWdTdGF0ZS5zdGFydC54LCB5OiBkcmFnU3RhdGUuc3RhcnQueSB9IDogd2lkZ2V0KTsKICAgICAgfQogICAgICB0aGlzLnBsYWNlaG9sZGVyUG9zaXRpb24gPSBudWxsOwogICAgICB0aGlzLmRyYWdTdGF0ZSA9IG51bGw7CiAgICAgIHRoaXMuaW50ZXJhY3Rpb25BY3RpdmUgPSBmYWxzZTsKICAgICAgdGhpcy5yZWxlYXNlUG9pbnRlckV2ZW50cygpOwogICAgfTsKICAgIHN0YXJ0UmVzaXplKGV2ZW50LCB3aWRnZXQsIGhhbmRsZXIyKSB7CiAgICAgIGlmICghdGhpcy5lZGl0YWJsZSB8fCB3aWRnZXQubm9SZXNpemUgfHwgd2lkZ2V0LmxvY2tlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgdGhpcy5lbnN1cmVNZXRyaWNzKCk7CiAgICAgIHRoaXMucmVzaXplU3RhdGUgPSB7CiAgICAgICAgd2lkZ2V0SWQ6IHdpZGdldC5pZCwKICAgICAgICBwb2ludGVySWQ6IGV2ZW50LnBvaW50ZXJJZCwKICAgICAgICBoYW5kbGVyOiBoYW5kbGVyMiwKICAgICAgICBzdGFydFBvaW50ZXI6IHsgY2xpZW50WDogZXZlbnQuY2xpZW50WCwgY2xpZW50WTogZXZlbnQuY2xpZW50WSB9LAogICAgICAgIHN0YXJ0OiB7IGlkOiB3aWRnZXQuaWQsIHg6IHdpZGdldC54LCB5OiB3aWRnZXQueSwgdzogd2lkZ2V0LncsIGg6IHdpZGdldC5oIH0sCiAgICAgICAgc3RhcnRXaWR0aDogd2lkZ2V0LncsCiAgICAgICAgc3RhcnRIZWlnaHQ6IHdpZGdldC5oLAogICAgICAgIGxhc3RQbGFjZW1lbnQ6IG51bGwKICAgICAgfTsKICAgICAgdGhpcy5pbnRlcmFjdGlvbkFjdGl2ZSA9IHRydWU7CiAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQuc2V0UG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCB0aGlzLmhhbmRsZVJlc2l6ZU1vdmUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCB0aGlzLmhhbmRsZVJlc2l6ZUVuZCk7CiAgICAgIHRoaXMucGxhY2Vob2xkZXJQb3NpdGlvbiA9IHsgaWQ6IHdpZGdldC5pZCwgeDogd2lkZ2V0LngsIHk6IHdpZGdldC55LCB3OiB3aWRnZXQudywgaDogd2lkZ2V0LmggfTsKICAgIH0KICAgIGhhbmRsZVJlc2l6ZU1vdmUgPSAoZXZlbnQpID0+IHsKICAgICAgaWYgKCF0aGlzLnJlc2l6ZVN0YXRlKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgbWV0cmljcyA9IHRoaXMuZW5zdXJlTWV0cmljcygpOwogICAgICBjb25zdCBhY3RpdmVXaWRnZXRzID0gdGhpcy53aWRnZXRzOwogICAgICBjb25zdCB3aWRnZXQgPSBhY3RpdmVXaWRnZXRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IHRoaXMucmVzaXplU3RhdGUud2lkZ2V0SWQpOwogICAgICBpZiAoIXdpZGdldCkKICAgICAgICByZXR1cm47CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnN0IG5leHRTaXplID0gY29tcHV0ZVJlc2l6ZURpbWVuc2lvbnMoewogICAgICAgIHBvaW50ZXI6IHsgY2xpZW50WDogZXZlbnQuY2xpZW50WCwgY2xpZW50WTogZXZlbnQuY2xpZW50WSB9LAogICAgICAgIGNvbnRhaW5lclJlY3Q6IHRoaXMuY29udGFpbmVyQm91bmRzID8/IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICAgICAgbWV0cmljcywKICAgICAgICBzdGFydFdpZHRoOiB0aGlzLnJlc2l6ZVN0YXRlLnN0YXJ0V2lkdGgsCiAgICAgICAgc3RhcnRIZWlnaHQ6IHRoaXMucmVzaXplU3RhdGUuc3RhcnRIZWlnaHQsCiAgICAgICAgc3RhcnRQb2ludGVyOiB0aGlzLnJlc2l6ZVN0YXRlLnN0YXJ0UG9pbnRlciwKICAgICAgICBoYW5kbGVyOiB0aGlzLnJlc2l6ZVN0YXRlLmhhbmRsZXIsCiAgICAgICAgd2lkZ2V0LAogICAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1ucwogICAgICB9KTsKICAgICAgY29uc3QgcGxhY2VtZW50ID0gcmVzb2x2ZVdpZGdldFBsYWNlbWVudChhY3RpdmVXaWRnZXRzLCB3aWRnZXQuaWQsIHsgeDogd2lkZ2V0LngsIHk6IHdpZGdldC55LCB3OiBuZXh0U2l6ZS53aWR0aCwgaDogbmV4dFNpemUuaGVpZ2h0IH0sIHRoaXMuY29sdW1ucywgdGhpcy5yZXNpemVTdGF0ZS5zdGFydCk7CiAgICAgIGlmIChwbGFjZW1lbnQpIHsKICAgICAgICB0aGlzLnJlc2l6ZVN0YXRlID0geyAuLi50aGlzLnJlc2l6ZVN0YXRlLCBsYXN0UGxhY2VtZW50OiBwbGFjZW1lbnQgfTsKICAgICAgICB0aGlzLnByZXZpZXdXaWRnZXRzID0gcGxhY2VtZW50LndpZGdldHM7CiAgICAgICAgY29uc3QgcHJldmlld1dpZGdldCA9IHBsYWNlbWVudC53aWRnZXRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IHdpZGdldC5pZCk7CiAgICAgICAgaWYgKHByZXZpZXdXaWRnZXQpIHsKICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXJQb3NpdGlvbiA9IHsKICAgICAgICAgICAgaWQ6IHByZXZpZXdXaWRnZXQuaWQsCiAgICAgICAgICAgIHg6IHByZXZpZXdXaWRnZXQueCwKICAgICAgICAgICAgeTogcHJldmlld1dpZGdldC55LAogICAgICAgICAgICB3OiBwcmV2aWV3V2lkZ2V0LncsCiAgICAgICAgICAgIGg6IHByZXZpZXdXaWRnZXQuaAogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5wbGFjZWhvbGRlclBvc2l0aW9uID0gewogICAgICAgICAgICBpZDogd2lkZ2V0LmlkLAogICAgICAgICAgICB4OiB3aWRnZXQueCwKICAgICAgICAgICAgeTogd2lkZ2V0LnksCiAgICAgICAgICAgIHc6IG5leHRTaXplLndpZHRoLAogICAgICAgICAgICBoOiBuZXh0U2l6ZS5oZWlnaHQKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMucHJldmlld1dpZGdldHMgPSBudWxsOwogICAgICAgIHRoaXMucGxhY2Vob2xkZXJQb3NpdGlvbiA9IG51bGw7CiAgICAgIH0KICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7CiAgICB9OwogICAgaGFuZGxlUmVzaXplRW5kID0gKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHJlc2l6ZVN0YXRlID0gdGhpcy5yZXNpemVTdGF0ZTsKICAgICAgaWYgKCFyZXNpemVTdGF0ZSB8fCBldmVudC5wb2ludGVySWQgIT09IHJlc2l6ZVN0YXRlLnBvaW50ZXJJZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBsYXlvdXRTb3VyY2UgPSB0aGlzLndpZGdldHM7CiAgICAgIHRoaXMucHJldmlld1dpZGdldHMgPSBudWxsOwogICAgICBjb25zdCBwbGFjZW1lbnQgPSByZXNpemVTdGF0ZS5sYXN0UGxhY2VtZW50ID8/IHJlc29sdmVXaWRnZXRQbGFjZW1lbnQobGF5b3V0U291cmNlLCByZXNpemVTdGF0ZS53aWRnZXRJZCwgewogICAgICAgIHg6IHRoaXMucGxhY2Vob2xkZXJQb3NpdGlvbj8ueCA/PyByZXNpemVTdGF0ZS5zdGFydC54LAogICAgICAgIHk6IHRoaXMucGxhY2Vob2xkZXJQb3NpdGlvbj8ueSA/PyByZXNpemVTdGF0ZS5zdGFydC55LAogICAgICAgIHc6IHRoaXMucGxhY2Vob2xkZXJQb3NpdGlvbj8udyA/PyByZXNpemVTdGF0ZS5zdGFydC53LAogICAgICAgIGg6IHRoaXMucGxhY2Vob2xkZXJQb3NpdGlvbj8uaCA/PyByZXNpemVTdGF0ZS5zdGFydC5oCiAgICAgIH0sIHRoaXMuY29sdW1ucywgcmVzaXplU3RhdGUuc3RhcnQpOwogICAgICBpZiAocGxhY2VtZW50KSB7CiAgICAgICAgdGhpcy5jb21taXRQbGFjZW1lbnQocGxhY2VtZW50LCByZXNpemVTdGF0ZS53aWRnZXRJZCwgIndpZGdldC1yZXNpemUiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLndpZGdldHMgPSB0aGlzLndpZGdldHMubWFwKCh3aWRnZXQpID0+IHdpZGdldC5pZCA9PT0gcmVzaXplU3RhdGUud2lkZ2V0SWQgPyB7IC4uLndpZGdldCwgdzogcmVzaXplU3RhdGUuc3RhcnQudywgaDogcmVzaXplU3RhdGUuc3RhcnQuaCB9IDogd2lkZ2V0KTsKICAgICAgfQogICAgICB0aGlzLnBsYWNlaG9sZGVyUG9zaXRpb24gPSBudWxsOwogICAgICB0aGlzLnJlc2l6ZVN0YXRlID0gbnVsbDsKICAgICAgdGhpcy5pbnRlcmFjdGlvbkFjdGl2ZSA9IGZhbHNlOwogICAgICB0aGlzLnJlbGVhc2VQb2ludGVyRXZlbnRzKCk7CiAgICB9OwogICAgaGFuZGxlSGVhZGVyS2V5ZG93bihldmVudCwgd2lkZ2V0KSB7CiAgICAgIGlmICghdGhpcy5lZGl0YWJsZSB8fCB3aWRnZXQubm9Nb3ZlIHx8IHdpZGdldC5sb2NrZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qga2V5MiA9IGV2ZW50LmtleTsKICAgICAgY29uc3QgaXNSZXNpemUgPSBldmVudC5zaGlmdEtleTsKICAgICAgbGV0IHBsYWNlbWVudCA9IG51bGw7CiAgICAgIGlmIChpc1Jlc2l6ZSAmJiBbIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoa2V5MikpIHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNvbnN0IGRlbHRhMiA9IGtleTIgPT09ICJBcnJvd1JpZ2h0IiB8fCBrZXkyID09PSAiQXJyb3dEb3duIiA/IDEgOiAtMTsKICAgICAgICBpZiAoa2V5MiA9PT0gIkFycm93TGVmdCIgfHwga2V5MiA9PT0gIkFycm93UmlnaHQiKSB7CiAgICAgICAgICBjb25zdCBtYXhXaWR0aCA9IHdpZGdldC5tYXhXID8/IHRoaXMuY29sdW1ucyAtIHdpZGdldC54OwogICAgICAgICAgY29uc3QgbmV4dFdpZHRoID0gTWF0aC5tYXgod2lkZ2V0Lm1pblcgPz8gMSwgTWF0aC5taW4obWF4V2lkdGgsIHdpZGdldC53ICsgZGVsdGEyKSk7CiAgICAgICAgICBwbGFjZW1lbnQgPSByZXNvbHZlV2lkZ2V0UGxhY2VtZW50KHRoaXMud2lkZ2V0cywgd2lkZ2V0LmlkLCB7IHg6IHdpZGdldC54LCB5OiB3aWRnZXQueSwgdzogbmV4dFdpZHRoLCBoOiB3aWRnZXQuaCB9LCB0aGlzLmNvbHVtbnMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSB3aWRnZXQubWF4SCA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICAgICAgICBjb25zdCBuZXh0SGVpZ2h0ID0gTWF0aC5tYXgod2lkZ2V0Lm1pbkggPz8gMSwgTWF0aC5taW4obWF4SGVpZ2h0LCB3aWRnZXQuaCArIGRlbHRhMikpOwogICAgICAgICAgcGxhY2VtZW50ID0gcmVzb2x2ZVdpZGdldFBsYWNlbWVudCh0aGlzLndpZGdldHMsIHdpZGdldC5pZCwgeyB4OiB3aWRnZXQueCwgeTogd2lkZ2V0LnksIHc6IHdpZGdldC53LCBoOiBuZXh0SGVpZ2h0IH0sIHRoaXMuY29sdW1ucyk7CiAgICAgICAgfQogICAgICAgIGlmIChwbGFjZW1lbnQpIHsKICAgICAgICAgIHRoaXMuY29tbWl0UGxhY2VtZW50KHBsYWNlbWVudCwgd2lkZ2V0LmlkLCAid2lkZ2V0LXJlc2l6ZSIpOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgbW92ZU1hcCA9IHsKICAgICAgICBBcnJvd0xlZnQ6IHsgZHg6IC0xLCBkeTogMCB9LAogICAgICAgIEFycm93UmlnaHQ6IHsgZHg6IDEsIGR5OiAwIH0sCiAgICAgICAgQXJyb3dVcDogeyBkeDogMCwgZHk6IC0xIH0sCiAgICAgICAgQXJyb3dEb3duOiB7IGR4OiAwLCBkeTogMSB9CiAgICAgIH07CiAgICAgIGNvbnN0IGRlbHRhID0gbW92ZU1hcFtrZXkyXTsKICAgICAgaWYgKCFkZWx0YSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb25zdCB0YXJnZXRYID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5jb2x1bW5zIC0gd2lkZ2V0LncsIHdpZGdldC54ICsgZGVsdGEuZHgpKTsKICAgICAgY29uc3QgdGFyZ2V0WSA9IE1hdGgubWF4KDAsIHdpZGdldC55ICsgZGVsdGEuZHkpOwogICAgICBwbGFjZW1lbnQgPSByZXNvbHZlV2lkZ2V0UGxhY2VtZW50KHRoaXMud2lkZ2V0cywgd2lkZ2V0LmlkLCB7IHg6IHRhcmdldFgsIHk6IHRhcmdldFkgfSwgdGhpcy5jb2x1bW5zKTsKICAgICAgaWYgKHBsYWNlbWVudCkgewogICAgICAgIHRoaXMuY29tbWl0UGxhY2VtZW50KHBsYWNlbWVudCwgd2lkZ2V0LmlkLCAid2lkZ2V0LW1vdmUiKTsKICAgICAgfQogICAgfQogICAgaGFuZGxlV2lkZ2V0Q29udGV4dE1lbnUoZXZlbnQsIHdpZGdldCkgewogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgb3BlbldpZGdldENvbnRleHRNZW51KHsgd2lkZ2V0LCBob3N0OiB0aGlzLCBldmVudCB9KTsKICAgIH0KICAgIGNvbW1pdFBsYWNlbWVudChyZXN1bHQsIHdpZGdldElkLCB0eXBlNSkgewogICAgICB0aGlzLnByZXZpZXdXaWRnZXRzID0gbnVsbDsKICAgICAgdGhpcy53aWRnZXRzID0gcmVzdWx0LndpZGdldHM7CiAgICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLndpZGdldHMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gd2lkZ2V0SWQpOwogICAgICBpZiAoc3ViamVjdCkgewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQodHlwZTUsIHsKICAgICAgICAgIGRldGFpbDogewogICAgICAgICAgICB3aWRnZXQ6IHN1YmplY3QsCiAgICAgICAgICAgIGRpc3BsYWNlZDogcmVzdWx0Lm1vdmVkV2lkZ2V0cy5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gd2lkZ2V0SWQpLAogICAgICAgICAgICBzd2FwcGVkV2l0aDogcmVzdWx0LnN3YXBwZWRXaXRoCiAgICAgICAgICB9LAogICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgfSkpOwogICAgICB9CiAgICB9CiAgICByZW1vdmVXaWRnZXQod2lkZ2V0SWQpIHsKICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy53aWRnZXRzLmZpbmQoKHdpZGdldCkgPT4gd2lkZ2V0LmlkID09PSB3aWRnZXRJZCk7CiAgICAgIGlmICghdGFyZ2V0KQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy53aWRnZXRzID0gdGhpcy53aWRnZXRzLmZpbHRlcigod2lkZ2V0KSA9PiB3aWRnZXQuaWQgIT09IHdpZGdldElkKTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgid2lkZ2V0LXJlbW92ZSIsIHsKICAgICAgICBkZXRhaWw6IHsgd2lkZ2V0OiB0YXJnZXQgfSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIHVwZGF0ZVdpZGdldCh3aWRnZXRJZCwgdXBkYXRlcykgewogICAgICB0aGlzLndpZGdldHMgPSB0aGlzLndpZGdldHMubWFwKCh3aWRnZXQpID0+IHdpZGdldC5pZCA9PT0gd2lkZ2V0SWQgPyB7IC4uLndpZGdldCwgLi4udXBkYXRlcyB9IDogd2lkZ2V0KTsKICAgIH0KICAgIGdldExheW91dCgpIHsKICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0cy5tYXAoKHsgaWQsIHg6IHgzLCB5OiB5NSwgdzogdzMsIGg6IGg5IH0pID0+ICh7IGlkLCB4OiB4MywgeTogeTUsIHc6IHczLCBoOiBoOSB9KSk7CiAgICB9CiAgICBzZXRMYXlvdXQobGF5b3V0KSB7CiAgICAgIHRoaXMud2lkZ2V0cyA9IGFwcGx5TGF5b3V0KHRoaXMud2lkZ2V0cywgbGF5b3V0KTsKICAgIH0KICAgIGxvY2tHcmlkKCkgewogICAgICB0aGlzLmVkaXRhYmxlID0gZmFsc2U7CiAgICB9CiAgICB1bmxvY2tHcmlkKCkgewogICAgICB0aGlzLmVkaXRhYmxlID0gdHJ1ZTsKICAgIH0KICAgIGFkZFdpZGdldCh3aWRnZXQsIGF1dG9Qb3NpdGlvbiA9IGZhbHNlKSB7CiAgICAgIGNvbnN0IG5leHRXaWRnZXQgPSB7IC4uLndpZGdldCB9OwogICAgICBpZiAoYXV0b1Bvc2l0aW9uIHx8IG5leHRXaWRnZXQuYXV0b1Bvc2l0aW9uKSB7CiAgICAgICAgY29uc3QgcG9zaXRpb24zID0gZmluZEF2YWlsYWJsZVBvc2l0aW9uKHRoaXMud2lkZ2V0cywgbmV4dFdpZGdldC53LCBuZXh0V2lkZ2V0LmgsIHRoaXMuY29sdW1ucyk7CiAgICAgICAgbmV4dFdpZGdldC54ID0gcG9zaXRpb24zLng7CiAgICAgICAgbmV4dFdpZGdldC55ID0gcG9zaXRpb24zLnk7CiAgICAgIH0KICAgICAgdGhpcy53aWRnZXRzID0gWy4uLnRoaXMud2lkZ2V0cywgbmV4dFdpZGdldF07CiAgICB9CiAgICBjb21wYWN0KGRpcmVjdGlvbiA9ICJ2ZXJ0aWNhbCIpIHsKICAgICAgY29uc3QgbmV4dFdpZGdldHMgPSB0aGlzLndpZGdldHMubWFwKCh3aWRnZXQpID0+ICh7IC4uLndpZGdldCB9KSk7CiAgICAgIGNvbXBhY3RMYXlvdXQobmV4dFdpZGdldHMsIGRpcmVjdGlvbik7CiAgICAgIHRoaXMud2lkZ2V0cyA9IG5leHRXaWRnZXRzOwogICAgfQogICAgYXBwbHlCcmVha3BvaW50TGF5b3V0KGJyZWFrcG9pbnQpIHsKICAgICAgdGhpcy5hY3RpdmVCcmVha3BvaW50ID0gYnJlYWtwb2ludDsKICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5sYXlvdXRzPy5bYnJlYWtwb2ludF07CiAgICAgIGlmIChsYXlvdXQpIHsKICAgICAgICB0aGlzLnNldExheW91dChsYXlvdXQpOwogICAgICB9CiAgICB9CiAgICBub3RpZnlMYXlvdXRDaGFuZ2UoKSB7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImxheW91dC1jaGFuZ2UiLCB7CiAgICAgICAgZGV0YWlsOiB7IGxheW91dDogdGhpcy5nZXRMYXlvdXQoKSB9LAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgZW5zdXJlTWV0cmljcygpIHsKICAgICAgaWYgKCF0aGlzLm1ldHJpY3MpIHsKICAgICAgICB0aGlzLmNvbXB1dGVNZXRyaWNzKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMubWV0cmljczsKICAgIH0KICAgIGNvbXB1dGVNZXRyaWNzKCkgewogICAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBib3VuZHMgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICB0aGlzLmNvbnRhaW5lckJvdW5kcyA9IGJvdW5kczsKICAgICAgY29uc3QgbWFyZ2lucyA9IHJlc29sdmVNYXJnaW5zKHRoaXMubWFyZ2luKTsKICAgICAgdGhpcy5yZXNvbHZlZE1hcmdpbnMgPSBtYXJnaW5zOwogICAgICB0aGlzLm1ldHJpY3MgPSBjYWxjdWxhdGVDZWxsTWV0cmljcyhib3VuZHMud2lkdGgsIHRoaXMuY29sdW1ucywgbWFyZ2lucywgdGhpcy5jZWxsSGVpZ2h0LCB0aGlzLmNlbGxIZWlnaHRVbml0KTsKICAgIH0KICAgIG9ic2VydmVSZXNpemUoKSB7CiAgICAgIGlmICh0aGlzLnJlc2l6ZU9ic2VydmVyKQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7CiAgICAgICAgdGhpcy5jb21wdXRlTWV0cmljcygpOwogICAgICB9KTsKICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMpOwogICAgfQogICAgZGlzY29ubmVjdFJlc2l6ZU9ic2VydmVyKCkgewogICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7CiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSB2b2lkIDA7CiAgICB9CiAgICByZWxlYXNlUG9pbnRlckV2ZW50cygpIHsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCB0aGlzLmhhbmRsZURyYWdNb3ZlKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgdGhpcy5oYW5kbGVEcmFnRW5kKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCB0aGlzLmhhbmRsZVJlc2l6ZU1vdmUpOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCB0aGlzLmhhbmRsZVJlc2l6ZUVuZCk7CiAgICB9CiAgICBweFRvUGVyY2VudCh2YWx1ZTIsIGNvbnRhaW5lcikgewogICAgICBpZiAoIWNvbnRhaW5lcikKICAgICAgICByZXR1cm4gMDsKICAgICAgcmV0dXJuIE51bWJlcigodmFsdWUyIC8gY29udGFpbmVyICogMTAwKS50b0ZpeGVkKDQpKTsKICAgIH0KICAgIGNvbXB1dGVXaWRnZXRSZWN0KHdpZGdldCwgbWV0cmljcywgbWFyZ2lucykgewogICAgICBjb25zdCBjZWxsV2lkdGggPSBtZXRyaWNzLmNlbGxXaWR0aFB4OwogICAgICBjb25zdCBjZWxsSGVpZ2h0ID0gbWV0cmljcy5jZWxsSGVpZ2h0UHg7CiAgICAgIGNvbnN0IGxlZnQgPSB3aWRnZXQueCAqIChjZWxsV2lkdGggKyBtYXJnaW5zLmhvcml6b250YWwpICsgbWFyZ2lucy5ob3Jpem9udGFsOwogICAgICBjb25zdCB0b3AgPSB3aWRnZXQueSAqIChjZWxsSGVpZ2h0ICsgbWFyZ2lucy52ZXJ0aWNhbCkgKyBtYXJnaW5zLnZlcnRpY2FsOwogICAgICBjb25zdCB3aWR0aCA9IHdpZGdldC53ICogY2VsbFdpZHRoICsgTWF0aC5tYXgoMCwgd2lkZ2V0LncgLSAxKSAqIG1hcmdpbnMuaG9yaXpvbnRhbDsKICAgICAgY29uc3QgaGVpZ2h0ID0gd2lkZ2V0LmggKiBjZWxsSGVpZ2h0ICsgTWF0aC5tYXgoMCwgd2lkZ2V0LmggLSAxKSAqIG1hcmdpbnMudmVydGljYWw7CiAgICAgIHJldHVybiB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9OwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM2NyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0Rhc2hib2FyZGdyaWQyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1oZWFkaW5nL2RlZXMtaGVhZGluZy5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CmZ1bmN0aW9uIGRlbW9GdW5jNDcoKSB7CiAgcmV0dXJuIGIyYAogICAgPGRlZXMtaGVhZGluZyBsZXZlbD0iMSI+VGhpcyBpcyBhIEgxIGhlYWRpbmc8L2RlZXMtaGVhZGluZz4KICAgIDxkZWVzLWhlYWRpbmcgbGV2ZWw9IjIiPlRoaXMgaXMgYSBIMiBoZWFkaW5nPC9kZWVzLWhlYWRpbmc+CiAgICA8ZGVlcy1oZWFkaW5nIGxldmVsPSIzIj5UaGlzIGlzIGEgSDMgaGVhZGluZzwvZGVlcy1oZWFkaW5nPgogICAgPGRlZXMtaGVhZGluZyBsZXZlbD0iNCI+VGhpcyBpcyBhIEg0IGhlYWRpbmc8L2RlZXMtaGVhZGluZz4KICAgIDxkZWVzLWhlYWRpbmcgbGV2ZWw9IjUiPlRoaXMgaXMgYSBINSBoZWFkaW5nPC9kZWVzLWhlYWRpbmc+CiAgICA8ZGVlcy1oZWFkaW5nIGxldmVsPSI2Ij5UaGlzIGlzIGEgSDYgaGVhZGluZzwvZGVlcy1oZWFkaW5nPgogICAgPGRlZXMtaGVhZGluZyBsZXZlbD0iaHIiPlRoaXMgaXMgYW4gaHIgaGVhZGluZzwvZGVlcy1oZWFkaW5nPgogICAgPGRlZXMtaGVhZGluZyBsZXZlbD0iaHItc21hbGwiPlRoaXMgaXMgYW4gaHIgc21hbGwgaGVhZGluZzwvZGVlcy1oZWFkaW5nPgogIGA7Cn0KCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1oZWFkaW5nL2RlZXMtaGVhZGluZy5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU2NyA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNjggPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNIZWFkaW5nID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1oZWFkaW5nIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfbGV2ZWxfZGVjb3JhdG9yczsKICBsZXQgX2xldmVsX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGV2ZWxfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0hlYWRpbmcyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfbGV2ZWxfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZywgcmVmbGVjdDogdHJ1ZSB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTY3KHRoaXMsIG51bGwsIF9sZXZlbF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsZXZlbCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibGV2ZWwiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubGV2ZWwsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxldmVsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xldmVsX2luaXRpYWxpemVycywgX2xldmVsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjcobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzSGVhZGluZzIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgLy8gZGVtbwogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzQ3OwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkxheW91dCJdOwogICAgI2xldmVsX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczY4KHRoaXMsIF9sZXZlbF9pbml0aWFsaXplcnMsICIxIik7CiAgICAvLyBwcm9wZXJ0aWVzCiAgICAvKioKICAgICAqIEhlYWRpbmcgbGV2ZWw6IDEtNiBmb3IgaDEtaDYsIG9yICdocicgZm9yIGhvcml6b250YWwgcnVsZSBzdHlsZQogICAgICovCiAgICBnZXQgbGV2ZWwoKSB7CiAgICAgIHJldHVybiB0aGlzLiNsZXZlbF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxldmVsKHZhbHVlMikgewogICAgICB0aGlzLiNsZXZlbF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgLy8gU1RBVElDIFNUWUxFUwogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIC8qIEhlYWRpbmcgc3R5bGVzICovCiAgICAgIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYgewogICAgICAgIG1hcmdpbjogMTZweCAwIDhweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMCIsICIjZmZmIil9OwogICAgICB9CiAgICAgIGgxIHsgZm9udC1zaXplOiAzMnB4OyBmb250LWZhbWlseTogJHtjc3NDYWxTYW5zRm9udEZhbWlseX07IGxldHRlci1zcGFjaW5nOiAwLjAyNWVtO30KICAgICAgaDIgeyBmb250LXNpemU6IDI4cHg7IH0KICAgICAgaDMgeyBmb250LXNpemU6IDI0cHg7IH0KICAgICAgaDQgeyBmb250LXNpemU6IDIwcHg7IH0KICAgICAgaDUgeyBmb250LXNpemU6IDE2cHg7IH0KICAgICAgaDYgeyBmb250LXNpemU6IDE0cHg7IH0KICAgICAgLyogSG9yaXpvbnRhbCBydWxlIHN0eWxlIGhlYWRpbmcgKi8KICAgICAgLmhlYWRpbmctaHIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAxNnB4IDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwIiwgIiNmZmYiKX07CiAgICAgIH0KICAgICAgLyogRmFkZSBsaW5lcyB0b3dhcmQgYW5kIGF3YXkgZnJvbSB0ZXh0IGZvciBociBzdHlsZSAqLwogICAgICAuaGVhZGluZy1ocjo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBmbGV4OiAxOwogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIC8qIGZhZGUgaW4gdG93YXJkIGNlbnRlciAqLwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHRyYW5zcGFyZW50LCAjY2NjKSIsICJsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHRyYW5zcGFyZW50LCAjMzMzKSIpfTsKICAgICAgICBtYXJnaW46IDAgOHB4OwogICAgICB9CiAgICAgIC5oZWFkaW5nLWhyOjphZnRlciB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgZmxleDogMTsKICAgICAgICBoZWlnaHQ6IDFweDsKICAgICAgICAvKiBmYWRlIG91dCBhd2F5IGZyb20gY2VudGVyICovCiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImxpbmVhci1ncmFkaWVudCh0byByaWdodCwgI2NjYywgdHJhbnNwYXJlbnQpIiwgImxpbmVhci1ncmFkaWVudCh0byByaWdodCwgIzMzMywgdHJhbnNwYXJlbnQpIil9OwogICAgICAgIG1hcmdpbjogMCA4cHg7CiAgICAgIH0KICAgICAgLyogU21hbGwgaHIgdmFyaWFudCB3aXRoIHJlZHVjZWQgbWFyZ2lucyAqLwogICAgICAuaGVhZGluZy1oci5oZWFkaW5nLWhyLXNtYWxsIHsKICAgICAgICBtYXJnaW46IDhweCAwOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgfQogICAgICAuaGVhZGluZy1oci5oZWFkaW5nLWhyLXNtYWxsOjpiZWZvcmUsCiAgICAgIC5oZWFkaW5nLWhyLmhlYWRpbmctaHItc21hbGw6OmFmdGVyIHsKICAgICAgICBtYXJnaW46IDAgOHB4OwogICAgICB9CiAgICBgCiAgICBdOwogICAgLy8gSU5TVEFOQ0UKICAgIHJlbmRlcigpIHsKICAgICAgc3dpdGNoICh0aGlzLmxldmVsKSB7CiAgICAgICAgY2FzZSAiMSI6CiAgICAgICAgICByZXR1cm4gYjJgPGgxPjxzbG90Pjwvc2xvdD48L2gxPmA7CiAgICAgICAgY2FzZSAiMiI6CiAgICAgICAgICByZXR1cm4gYjJgPGgyPjxzbG90Pjwvc2xvdD48L2gyPmA7CiAgICAgICAgY2FzZSAiMyI6CiAgICAgICAgICByZXR1cm4gYjJgPGgzPjxzbG90Pjwvc2xvdD48L2gzPmA7CiAgICAgICAgY2FzZSAiNCI6CiAgICAgICAgICByZXR1cm4gYjJgPGg0PjxzbG90Pjwvc2xvdD48L2g0PmA7CiAgICAgICAgY2FzZSAiNSI6CiAgICAgICAgICByZXR1cm4gYjJgPGg1PjxzbG90Pjwvc2xvdD48L2g1PmA7CiAgICAgICAgY2FzZSAiNiI6CiAgICAgICAgICByZXR1cm4gYjJgPGg2PjxzbG90Pjwvc2xvdD48L2g2PmA7CiAgICAgICAgY2FzZSAiaHIiOgogICAgICAgICAgcmV0dXJuIGIyYDxkaXYgY2xhc3M9ImhlYWRpbmctaHIiPjxzbG90Pjwvc2xvdD48L2Rpdj5gOwogICAgICAgIGNhc2UgImhyLXNtYWxsIjoKICAgICAgICAgIHJldHVybiBiMmA8ZGl2IGNsYXNzPSJoZWFkaW5nLWhyIGhlYWRpbmctaHItc21hbGwiPjxzbG90Pjwvc2xvdD48L2Rpdj5gOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gYjJgPGgxPjxzbG90Pjwvc2xvdD48L2gxPmA7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczY4KHRoaXMsIF9sZXZlbF9leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczY4KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzSGVhZGluZzIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWxheW91dC9kZWVzLXBhZ2luYXRpb24vZGVlcy1wYWdpbmF0aW9uLmRlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW9GdW5jNDggPSAoKSA9PiBiMmAKICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDE2cHg7Ij4KICAgIDwhLS0gU21hbGwgc2V0IG9mIHBhZ2VzIC0tPgogICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA0cHg7Ij4KICAgICAgPHNwYW4+NSBwYWdlcywgc3RhcnRpbmcgYXQgMTo8L3NwYW4+CiAgICAgIDxkZWVzLXBhZ2luYXRpb24KICAgICAgICAudG90YWw9JHs1fQogICAgICAgIC5wYWdlPSR7MX0KICAgICAgICBAcGFnZS1jaGFuZ2U9JHsoZTExKSA9PiBjb25zb2xlLmxvZygiUGFnZSBjaGFuZ2VkIHRvIiwgZTExLmRldGFpbC5wYWdlKX0KICAgICAgPjwvZGVlcy1wYWdpbmF0aW9uPgogICAgPC9kaXY+CgogICAgPCEtLSBMYXJnZXIgc2V0IG9mIHBhZ2VzIC0tPgogICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA0cHg7Ij4KICAgICAgPHNwYW4+MTUgcGFnZXMsIHN0YXJ0aW5nIGF0IDg6PC9zcGFuPgogICAgICA8ZGVlcy1wYWdpbmF0aW9uCiAgICAgICAgLnRvdGFsPSR7MTV9CiAgICAgICAgLnBhZ2U9JHs4fQogICAgICAgIEBwYWdlLWNoYW5nZT0keyhlMTEpID0+IGNvbnNvbGUubG9nKCJQYWdlIGNoYW5nZWQgdG8iLCBlMTEuZGV0YWlsLnBhZ2UpfQogICAgICA+PC9kZWVzLXBhZ2luYXRpb24+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1wYWdpbmF0aW9uL2RlZXMtcGFnaW5hdGlvbi5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU2OCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNjkgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNQYWdpbmF0aW9uID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1wYWdpbmF0aW9uIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfcGFnZV9kZWNvcmF0b3JzOwogIGxldCBfcGFnZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BhZ2VfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RvdGFsX2RlY29yYXRvcnM7CiAgbGV0IF90b3RhbF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RvdGFsX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNQYWdpbmF0aW9uMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3BhZ2VfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KV07CiAgICAgIF90b3RhbF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pXTsKICAgICAgX19lc0RlY29yYXRlNjgodGhpcywgbnVsbCwgX3BhZ2VfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicGFnZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicGFnZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5wYWdlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5wYWdlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3BhZ2VfaW5pdGlhbGl6ZXJzLCBfcGFnZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY4KHRoaXMsIG51bGwsIF90b3RhbF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0b3RhbCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidG90YWwiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudG90YWwsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnRvdGFsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3RvdGFsX2luaXRpYWxpemVycywgX3RvdGFsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjgobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzUGFnaW5hdGlvbjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzQ4OwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkxheW91dCJdOwogICAgI3BhZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNjkodGhpcywgX3BhZ2VfaW5pdGlhbGl6ZXJzLCAxKTsKICAgIC8qKiBDdXJyZW50IHBhZ2UgKDEtYmFzZWQpICovCiAgICBnZXQgcGFnZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3BhZ2VfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwYWdlKHZhbHVlMikgewogICAgICB0aGlzLiNwYWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdG90YWxfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY5KHRoaXMsIF9wYWdlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2OSh0aGlzLCBfdG90YWxfaW5pdGlhbGl6ZXJzLCAxKSk7CiAgICAvKiogVG90YWwgbnVtYmVyIG9mIHBhZ2VzICovCiAgICBnZXQgdG90YWwoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0b3RhbF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRvdGFsKHZhbHVlMikgewogICAgICB0aGlzLiN0b3RhbF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CiAgICAgIGJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwIDJweDsKICAgICAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzMzMyIsICIjY2NjIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnM7CiAgICAgIH0KICAgICAgYnV0dG9uOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2VlZSIsICIjNDQ0Iil9OwogICAgICB9CiAgICAgIGJ1dHRvbjpkaXNhYmxlZCB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2FhYSIsICIjNjY2Iil9OwogICAgICB9CiAgICAgIGJ1dHRvbi5jdXJyZW50IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDA1MGI5OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQogICAgICBzcGFuLmVsbGlwc2lzIHsKICAgICAgICBtYXJnaW46IDAgNHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzMzMyIsICIjY2NjIil9OwogICAgICB9CiAgICBgCiAgICBdOwogICAgZ2V0IHBhZ2VzKCkgewogICAgICBjb25zdCBwYWdlcyA9IFtdOwogICAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWw7CiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnBhZ2U7CiAgICAgIGlmICh0b3RhbCA8PSA3KSB7CiAgICAgICAgZm9yIChsZXQgaTExID0gMTsgaTExIDw9IHRvdGFsOyBpMTErKykgewogICAgICAgICAgcGFnZXMucHVzaChpMTEpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBwYWdlcy5wdXNoKDEpOwogICAgICAgIGlmIChjdXJyZW50ID4gNCkgewogICAgICAgICAgcGFnZXMucHVzaCgiLi4uIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMiwgY3VycmVudCAtIDIpOwogICAgICAgIGNvbnN0IGVuZDMgPSBNYXRoLm1pbih0b3RhbCAtIDEsIGN1cnJlbnQgKyAyKTsKICAgICAgICBmb3IgKGxldCBpMTEgPSBzdGFydDsgaTExIDw9IGVuZDM7IGkxMSsrKSB7CiAgICAgICAgICBwYWdlcy5wdXNoKGkxMSk7CiAgICAgICAgfQogICAgICAgIGlmIChjdXJyZW50IDwgdG90YWwgLSAzKSB7CiAgICAgICAgICBwYWdlcy5wdXNoKCIuLi4iKTsKICAgICAgICB9CiAgICAgICAgcGFnZXMucHVzaCh0b3RhbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhZ2VzOwogICAgfQogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxidXR0b24KICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmNoYW5nZVBhZ2UodGhpcy5wYWdlIC0gMSl9CiAgICAgICAgP2Rpc2FibGVkPSR7dGhpcy5wYWdlIDw9IDF9CiAgICAgICAgYXJpYS1sYWJlbD0iUHJldmlvdXMgcGFnZSIKICAgICAgPgogICAgICAgIOKAuQogICAgICA8L2J1dHRvbj4KICAgICAgJHt0aGlzLnBhZ2VzLm1hcCgocDcpID0+IHA3ID09PSAiLi4uIiA/IGIyYDxzcGFuIGNsYXNzPSJlbGxpcHNpcyI+4oCmPC9zcGFuPmAgOiBiMmAKICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICBjbGFzcz0iJHtwNyA9PT0gdGhpcy5wYWdlID8gImN1cnJlbnQiIDogIiJ9IgogICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5jaGFuZ2VQYWdlKHA3KX0KICAgICAgICAgICAgICAgID9kaXNhYmxlZD0ke3A3ID09PSB0aGlzLnBhZ2V9CiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPSJQYWdlICR7cDd9IgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICR7cDd9CiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIGApfQogICAgICA8YnV0dG9uCiAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5jaGFuZ2VQYWdlKHRoaXMucGFnZSArIDEpfQogICAgICAgID9kaXNhYmxlZD0ke3RoaXMucGFnZSA+PSB0aGlzLnRvdGFsfQogICAgICAgIGFyaWEtbGFiZWw9Ik5leHQgcGFnZSIKICAgICAgPgogICAgICAgIOKAugogICAgICA8L2J1dHRvbj4KICAgIGA7CiAgICB9CiAgICBjaGFuZ2VQYWdlKG5ld1BhZ2UpIHsKICAgICAgaWYgKG5ld1BhZ2UgPCAxIHx8IG5ld1BhZ2UgPiB0aGlzLnRvdGFsIHx8IG5ld1BhZ2UgPT09IHRoaXMucGFnZSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLnBhZ2UgPSBuZXdQYWdlOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJwYWdlLWNoYW5nZSIsIHsKICAgICAgICBkZXRhaWw6IHsgcGFnZTogdGhpcy5wYWdlIH0sCiAgICAgICAgYnViYmxlczogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnM2OSh0aGlzLCBfdG90YWxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM2OShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1BhZ2luYXRpb24yID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1zdGVwcGVyL2RlZXMtc3RlcHBlci5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBzdGVwcGVyRGVtbyA9ICgpID0+IGIyYAogIDxkZWVzLXN0ZXBwZXIKICAgIC5zdGVwcz0ke1sKICB7CiAgICB0aXRsZTogIkFjY291bnQgU2V0dXAiLAogICAgY29udGVudDogYjJgCiAgICAgICAgICA8ZGVlcy1mb3JtPgogICAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IGtleT0iZW1haWwiIGxhYmVsPSJXb3JrIEVtYWlsIiByZXF1aXJlZD48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCBrZXk9InBhc3N3b3JkIiBsYWJlbD0iQ3JlYXRlIFBhc3N3b3JkIiB0eXBlPSJwYXNzd29yZCIgcmVxdWlyZWQ+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICAgIDxkZWVzLWZvcm0tc3VibWl0PkNvbnRpbnVlPC9kZWVzLWZvcm0tc3VibWl0PgogICAgICAgICAgPC9kZWVzLWZvcm0+CiAgICAgICAgYCwKICAgIHZhbGlkYXRpb25GdW5jOiBhc3luYyAoc3RlcHBlckFyZywgZWxlbWVudEFyZykgPT4gewogICAgICBjb25zdCBkZWVzRm9ybSA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1mb3JtIik7CiAgICAgIGRlZXNGb3JtLmFkZEV2ZW50TGlzdGVuZXIoImZvcm1EYXRhIiwgKCkgPT4gc3RlcHBlckFyZy5nb05leHQoKSwgeyBvbmNlOiB0cnVlIH0pOwogICAgfQogIH0sCiAgewogICAgdGl0bGU6ICJQcm9maWxlIERldGFpbHMiLAogICAgY29udGVudDogYjJgCiAgICAgICAgICA8ZGVlcy1mb3JtPgogICAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IGtleT0iZmlyc3ROYW1lIiBsYWJlbD0iRmlyc3QgTmFtZSIgcmVxdWlyZWQ+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQga2V5PSJsYXN0TmFtZSIgbGFiZWw9Ikxhc3QgTmFtZSIgcmVxdWlyZWQ+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICAgIDxkZWVzLWZvcm0tc3VibWl0PkNvbnRpbnVlPC9kZWVzLWZvcm0tc3VibWl0PgogICAgICAgICAgPC9kZWVzLWZvcm0+CiAgICAgICAgYCwKICAgIHZhbGlkYXRpb25GdW5jOiBhc3luYyAoc3RlcHBlckFyZywgZWxlbWVudEFyZykgPT4gewogICAgICBjb25zdCBkZWVzRm9ybSA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1mb3JtIik7CiAgICAgIGRlZXNGb3JtLmFkZEV2ZW50TGlzdGVuZXIoImZvcm1EYXRhIiwgKCkgPT4gc3RlcHBlckFyZy5nb05leHQoKSwgeyBvbmNlOiB0cnVlIH0pOwogICAgfQogIH0sCiAgewogICAgdGl0bGU6ICJDb250YWN0IEluZm9ybWF0aW9uIiwKICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgICAgPGRlZXMtaW5wdXQtcGhvbmUga2V5PSJwaG9uZSIgbGFiZWw9Ik1vYmlsZSBOdW1iZXIiIHJlcXVpcmVkPjwvZGVlcy1pbnB1dC1waG9uZT4KICAgICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCBrZXk9ImNvbXBhbnkiIGxhYmVsPSJDb21wYW55Ij48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgICAgPGRlZXMtZm9ybS1zdWJtaXQ+Q29udGludWU8L2RlZXMtZm9ybS1zdWJtaXQ+CiAgICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgICBgLAogICAgdmFsaWRhdGlvbkZ1bmM6IGFzeW5jIChzdGVwcGVyQXJnLCBlbGVtZW50QXJnKSA9PiB7CiAgICAgIGNvbnN0IGRlZXNGb3JtID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCJkZWVzLWZvcm0iKTsKICAgICAgZGVlc0Zvcm0uYWRkRXZlbnRMaXN0ZW5lcigiZm9ybURhdGEiLCAoKSA9PiBzdGVwcGVyQXJnLmdvTmV4dCgpLCB7IG9uY2U6IHRydWUgfSk7CiAgICB9CiAgfSwKICB7CiAgICB0aXRsZTogIlRlYW0gU2l6ZSIsCiAgICBjb250ZW50OiBiMmAKICAgICAgICAgIDxkZWVzLWZvcm0+CiAgICAgICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAgICAga2V5PSJ0ZWFtU2l6ZSIKICAgICAgICAgICAgICBsYWJlbD0iSG93IGJpZyBpcyB5b3VyIHRlYW0/IgogICAgICAgICAgICAgIC5vcHRpb25zPSR7WwogICAgICB7IGxhYmVsOiAiMS01IiwgdmFsdWU6ICIxLTUiIH0sCiAgICAgIHsgbGFiZWw6ICI2LTIwIiwgdmFsdWU6ICI2LTIwIiB9LAogICAgICB7IGxhYmVsOiAiMjEtNTAiLCB2YWx1ZTogIjIxLTUwIiB9LAogICAgICB7IGxhYmVsOiAiNTErIiwgdmFsdWU6ICI1MSsiIH0KICAgIF19CiAgICAgICAgICAgICAgcmVxdWlyZWQKICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC1kcm9wZG93bj4KICAgICAgICAgICAgPGRlZXMtZm9ybS1zdWJtaXQ+Q29udGludWU8L2RlZXMtZm9ybS1zdWJtaXQ+CiAgICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgICBgLAogICAgdmFsaWRhdGlvbkZ1bmM6IGFzeW5jIChzdGVwcGVyQXJnLCBlbGVtZW50QXJnKSA9PiB7CiAgICAgIGNvbnN0IGRlZXNGb3JtID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCJkZWVzLWZvcm0iKTsKICAgICAgZGVlc0Zvcm0uYWRkRXZlbnRMaXN0ZW5lcigiZm9ybURhdGEiLCAoKSA9PiBzdGVwcGVyQXJnLmdvTmV4dCgpLCB7IG9uY2U6IHRydWUgfSk7CiAgICB9CiAgfSwKICB7CiAgICB0aXRsZTogIkdvYWxzIiwKICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgICAgPGRlZXMtaW5wdXQtbXVsdGl0b2dnbGUKICAgICAgICAgICAgICBrZXk9ImdvYWwiCiAgICAgICAgICAgICAgbGFiZWw9Ik1haW4gb2JqZWN0aXZlIgogICAgICAgICAgICAgIC5vcHRpb25zPSR7WwogICAgICB7IGxhYmVsOiAiT25ib2FyZGluZyIsIHZhbHVlOiAib25ib2FyZGluZyIgfSwKICAgICAgeyBsYWJlbDogIkFuYWx5dGljcyIsIHZhbHVlOiAiYW5hbHl0aWNzIiB9LAogICAgICB7IGxhYmVsOiAiQXV0b21hdGlvbiIsIHZhbHVlOiAiYXV0b21hdGlvbiIgfQogICAgXX0KICAgICAgICAgICAgICByZXF1aXJlZAogICAgICAgICAgICA+PC9kZWVzLWlucHV0LW11bHRpdG9nZ2xlPgogICAgICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdD5Db250aW51ZTwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICAgIDwvZGVlcy1mb3JtPgogICAgICAgIGAsCiAgICB2YWxpZGF0aW9uRnVuYzogYXN5bmMgKHN0ZXBwZXJBcmcsIGVsZW1lbnRBcmcpID0+IHsKICAgICAgY29uc3QgZGVlc0Zvcm0gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoImRlZXMtZm9ybSIpOwogICAgICBkZWVzRm9ybS5hZGRFdmVudExpc3RlbmVyKCJmb3JtRGF0YSIsICgpID0+IHN0ZXBwZXJBcmcuZ29OZXh0KCksIHsgb25jZTogdHJ1ZSB9KTsKICAgIH0KICB9LAogIHsKICAgIHRpdGxlOiAiQnJhbmQgUHJlZmVyZW5jZXMiLAogICAgY29udGVudDogYjJgCiAgICAgICAgICA8ZGVlcy1mb3JtPgogICAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IGtleT0iYnJhbmRDb2xvciIgbGFiZWw9IlByaW1hcnkgYnJhbmQgY29sb3IiPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IGtleT0idG9uZSIgbGFiZWw9IlByZWZlcnJlZCB0b25lIChlLmcuIGZyaWVuZGx5LCBmb3JtYWwpIj48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgICAgPGRlZXMtZm9ybS1zdWJtaXQ+Q29udGludWU8L2RlZXMtZm9ybS1zdWJtaXQ+CiAgICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgICBgLAogICAgdmFsaWRhdGlvbkZ1bmM6IGFzeW5jIChzdGVwcGVyQXJnLCBlbGVtZW50QXJnKSA9PiB7CiAgICAgIGNvbnN0IGRlZXNGb3JtID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCJkZWVzLWZvcm0iKTsKICAgICAgZGVlc0Zvcm0uYWRkRXZlbnRMaXN0ZW5lcigiZm9ybURhdGEiLCAoKSA9PiBzdGVwcGVyQXJnLmdvTmV4dCgpLCB7IG9uY2U6IHRydWUgfSk7CiAgICB9CiAgfSwKICB7CiAgICB0aXRsZTogIkludGVncmF0aW9ucyIsCiAgICBjb250ZW50OiBiMmAKICAgICAgICAgIDxkZWVzLWZvcm0+CiAgICAgICAgICAgIDxkZWVzLWlucHV0LWxpc3QKICAgICAgICAgICAgICBrZXk9ImludGVncmF0aW9ucyIKICAgICAgICAgICAgICBsYWJlbD0iSW50ZWdyYXRpb25zIGluIHVzZSIKICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iQWRkIGludGVncmF0aW9uIgogICAgICAgICAgICA+PC9kZWVzLWlucHV0LWxpc3Q+CiAgICAgICAgICAgIDxkZWVzLWZvcm0tc3VibWl0PkNvbnRpbnVlPC9kZWVzLWZvcm0tc3VibWl0PgogICAgICAgICAgPC9kZWVzLWZvcm0+CiAgICAgICAgYCwKICAgIHZhbGlkYXRpb25GdW5jOiBhc3luYyAoc3RlcHBlckFyZywgZWxlbWVudEFyZykgPT4gewogICAgICBjb25zdCBkZWVzRm9ybSA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1mb3JtIik7CiAgICAgIGRlZXNGb3JtLmFkZEV2ZW50TGlzdGVuZXIoImZvcm1EYXRhIiwgKCkgPT4gc3RlcHBlckFyZy5nb05leHQoKSwgeyBvbmNlOiB0cnVlIH0pOwogICAgfQogIH0sCiAgewogICAgdGl0bGU6ICJSZXZpZXcgJiBMYXVuY2giLAogICAgY29udGVudDogYjJgCiAgICAgICAgICA8ZGVlcy1wYW5lbD4KICAgICAgICAgICAgPHA+QWxtb3N0IHRoZXJlISBSZXZpZXcgeW91ciBzZWxlY3Rpb25zIGFuZCBsYXVuY2ggd2hlbmV2ZXIgeW91J3JlIHJlYWR5LjwvcD4KICAgICAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgICBgCiAgfQpdfQogID48L2RlZXMtc3RlcHBlcj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1zdGVwcGVyL2RlZXMtc3RlcHBlci5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2Rpc3RfdHMyNSgpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU2OSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNzAgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNTdGVwcGVyID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1zdGVwcGVyIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfc3RlcHNfZGVjb3JhdG9yczsKICBsZXQgX3N0ZXBzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc3RlcHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkU3RlcF9kZWNvcmF0b3JzOwogIGxldCBfc2VsZWN0ZWRTdGVwX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRTdGVwX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNTdGVwcGVyMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3N0ZXBzX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEFycmF5CiAgICAgIH0pXTsKICAgICAgX3NlbGVjdGVkU3RlcF9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBPYmplY3QKICAgICAgfSldOwogICAgICBfX2VzRGVjb3JhdGU2OSh0aGlzLCBudWxsLCBfc3RlcHNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic3RlcHMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInN0ZXBzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnN0ZXBzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zdGVwcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zdGVwc19pbml0aWFsaXplcnMsIF9zdGVwc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY5KHRoaXMsIG51bGwsIF9zZWxlY3RlZFN0ZXBfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0ZWRTdGVwIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3RlZFN0ZXAiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0ZWRTdGVwLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3RlZFN0ZXAgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0ZWRTdGVwX2luaXRpYWxpemVycywgX3NlbGVjdGVkU3RlcF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY5KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1N0ZXBwZXIyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gc3RlcHBlckRlbW87CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiTGF5b3V0IiwgIkZvcm0iXTsKICAgICNzdGVwc19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM3MCh0aGlzLCBfc3RlcHNfaW5pdGlhbGl6ZXJzLCBbXSk7CiAgICBnZXQgc3RlcHMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzdGVwc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHN0ZXBzKHZhbHVlMikgewogICAgICB0aGlzLiNzdGVwc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NlbGVjdGVkU3RlcF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzAodGhpcywgX3N0ZXBzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3MCh0aGlzLCBfc2VsZWN0ZWRTdGVwX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgc2VsZWN0ZWRTdGVwKCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRTdGVwX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0ZWRTdGVwKHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3RlZFN0ZXBfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIC5zdGVwcGVyQ29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5zdGVwIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC43cyBjdWJpYy1iZXppZXIoMC44NywgMCwgMC4xMywgMSksIGJveC1zaGFkb3cgMC43cyBjdWJpYy1iZXppZXIoMC44NywgMCwgMC4xMywgMSksIGZpbHRlciAwLjdzIGN1YmljLWJlemllcigwLjg3LCAwLCAwLjEzLCAxKSwgYm9yZGVyIDAuN3MgY3ViaWMtYmV6aWVyKDAuODcsIDAsIDAuMTMsIDEpOwogICAgICAgIG1heC13aWR0aDogNTAwcHg7CiAgICAgICAgbWluLWhlaWdodDogMzAwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMGYwZjExIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTJlOGYwIiwgIiMyNzI3MjkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMGYxNzJhIiwgIiNmNWY1ZjUiKX07CiAgICAgICAgbWFyZ2luOiBhdXRvOwogICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgICAgZmlsdGVyOiBvcGFjaXR5KDAuNTUpIHNhdHVyYXRlKDAuODUpOwogICAgICAgIGJveC1zaGFkb3c6IDAgOHB4IDMycHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICB9CgogICAgICAuc3RlcC5zZWxlY3RlZCB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDsKICAgICAgICBmaWx0ZXI6IG9wYWNpdHkoMSkgc2F0dXJhdGUoMSk7CiAgICAgICAgdXNlci1zZWxlY3Q6IGF1dG87CiAgICAgIH0KCiAgICAgIC5zdGVwLmhpZGRlblN0ZXAgewogICAgICAgIGZpbHRlcjogb3BhY2l0eSgwKTsKICAgICAgfQoKICAgICAgLnN0ZXAuZW50cmFuY2UgewogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjM1cyBlYXNlLCBib3gtc2hhZG93IDAuMzVzIGVhc2UsIGZpbHRlciAwLjM1cyBlYXNlLCBib3JkZXIgMC4zNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnN0ZXAuZW50cmFuY2UuaGlkZGVuU3RlcCB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDE2cHgpOwogICAgICB9CgogICAgICAuc3RlcDpsYXN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMDB2aDsKICAgICAgfQoKICAgICAgLnN0ZXAgLnN0ZXBDb3VudGVyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2NDc0OGIiLCAiI2ExYTFhYSIpfTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxMnB4OwogICAgICAgIHJpZ2h0OiAxMnB4OwogICAgICAgIHBhZGRpbmc6IDZweCAxNHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgyMjYsIDIzMiwgMjQwLCAwLjUpIiwgInJnYmEoNjMsIDYzLCA3MCwgMC40NSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMjI2LCAyMzIsIDI0MCwgMC43KSIsICJyZ2JhKDYzLCA2MywgNzAsIDAuNikiKX07CiAgICAgIH0KCiAgICAgIC5zdGVwIC5nb0JhY2sgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDEycHg7CiAgICAgICAgbGVmdDogMTJweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNnB4OwogICAgICAgIHBhZGRpbmc6IDZweCAxMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDIyNiwgMjMyLCAyNDAsIDAuOSkiLCAicmdiYSg2MywgNjMsIDcwLCAwLjg1KSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpIiwgInJnYmEoMzksIDM5LCA0MiwgMC44NSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNDc1NTY5IiwgIiNkNGQ0ZDgiKX07CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGJvcmRlciAwLjJzIGVhc2UsIGNvbG9yIDAuMnMgZWFzZSwgYmFja2dyb3VuZCAwLjJzIGVhc2UsIHRyYW5zZm9ybSAwLjJzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5zdGVwIC5nb0JhY2s6aG92ZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzBmMTcyYSIsICIjZmFmYWZhIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoZGFyay5ibHVlLCBkYXJrLmJsdWUpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgyMjYsIDIzMiwgMjQwLCAwLjk1KSIsICJyZ2JhKDYzLCA2MywgNzAsIDAuNykiKX07CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0ycHgpOwogICAgICB9CgogICAgICAuc3RlcCAuZ29CYWNrOmFjdGl2ZSB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMGYxNzJhIiwgIiNmYWZhZmEiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZShkYXJrLmJsdWVBY3RpdmUsIGRhcmsuYmx1ZUFjdGl2ZSl9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDIyNiwgMjMyLCAyNDAsIDAuODUpIiwgInJnYmEoNjMsIDYzLCA3MCwgMC42KSIpfTsKICAgICAgfQoKICAgICAgLnN0ZXAgLmdvQmFjayBzcGFuIHsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycyBlYXNlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLnN0ZXAgLmdvQmFjazpob3ZlciBzcGFuIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTJweCk7CiAgICAgIH0KCiAgICAgIC5zdGVwIC50aXRsZSB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHBhZGRpbmctdG9wOiA2NHB4OwogICAgICAgIGZvbnQtZmFtaWx5OiAnR2Vpc3QgU2FucycsIHNhbnMtc2VyaWY7CiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIC5zdGVwIC5jb250ZW50IHsKICAgICAgICBwYWRkaW5nOiAzMnB4OwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InN0ZXBwZXJDb250YWluZXIiPgogICAgICAgICR7dGhpcy5zdGVwcy5tYXAoKHN0ZXBBcmcpID0+IGIyYDxkaXYKICAgICAgICAgICAgICBjbGFzcz0ic3RlcCAke3N0ZXBBcmcgPT09IHRoaXMuc2VsZWN0ZWRTdGVwID8gInNlbGVjdGVkIiA6IG51bGx9ICR7dGhpcy5nZXRJbmRleE9mU3RlcChzdGVwQXJnKSA+IHRoaXMuZ2V0SW5kZXhPZlN0ZXAodGhpcy5zZWxlY3RlZFN0ZXApID8gImhpZGRlblN0ZXAiIDogIiJ9ICR7dGhpcy5nZXRJbmRleE9mU3RlcChzdGVwQXJnKSA9PT0gMCA/ICJlbnRyYW5jZSIgOiAiIn0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICAke3RoaXMuZ2V0SW5kZXhPZlN0ZXAoc3RlcEFyZykgPiAwID8gYjJgPGRpdiBjbGFzcz0iZ29CYWNrIiBAY2xpY2s9JHt0aGlzLmdvQmFja30+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBJbnRlciI+PC08L3NwYW4+IGdvIHRvIHByZXZpb3VzIHN0ZXA8L2Rpdj5gIDogYGB9CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RlcENvdW50ZXIiPgogICAgICAgICAgICAgICAgU3RlcCAke3RoaXMuc3RlcHMuZmluZEluZGV4KChlbGVtZW50QXJnKSA9PiBlbGVtZW50QXJnID09PSBzdGVwQXJnKSArIDF9IG9mCiAgICAgICAgICAgICAgICAke3RoaXMuc3RlcHMubGVuZ3RofQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4ke3N0ZXBBcmcudGl0bGV9PC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+JHtzdGVwQXJnLmNvbnRlbnR9PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PiBgKX0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgZ2V0SW5kZXhPZlN0ZXAgPSAoX19ydW5Jbml0aWFsaXplcnM3MCh0aGlzLCBfc2VsZWN0ZWRTdGVwX2V4dHJhSW5pdGlhbGl6ZXJzKSwgKHN0ZXBBcmcpID0+IHsKICAgICAgcmV0dXJuIHRoaXMuc3RlcHMuZmluZEluZGV4KChzdGVwQXJnMikgPT4gc3RlcEFyZyA9PT0gc3RlcEFyZzIpOwogICAgfSk7CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIGF3YWl0IHRoaXMuZG9tdG9vbHNQcm9taXNlOwogICAgICBhd2FpdCB0aGlzLmRvbXRvb2xzLmNvbnZlbmllbmNlLnNtYXJ0ZGVsYXkuZGVsYXlGb3IoMCk7CiAgICAgIHRoaXMuc2VsZWN0ZWRTdGVwID0gdGhpcy5zdGVwc1swXTsKICAgICAgdGhpcy5zZXRTY3JvbGxTdGF0dXMoKTsKICAgICAgYXdhaXQgdGhpcy5kb210b29scy5jb252ZW5pZW5jZS5zbWFydGRlbGF5LmRlbGF5Rm9yKDM1MCk7CiAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuc3RlcC5lbnRyYW5jZSIpPy5jbGFzc0xpc3QucmVtb3ZlKCJlbnRyYW5jZSIpOwogICAgfQogICAgYXN5bmMgdXBkYXRlZCgpIHsKICAgICAgdGhpcy5zZXRTY3JvbGxTdGF0dXMoKTsKICAgIH0KICAgIHNjcm9sbGVyOwogICAgYXN5bmMgc2V0U2Nyb2xsU3RhdHVzKCkgewogICAgICBjb25zdCBzdGVwcGVyQ29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5zdGVwcGVyQ29udGFpbmVyIik7CiAgICAgIGNvbnN0IGZpcnN0U3RlcEVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLnN0ZXAiKTsKICAgICAgY29uc3Qgc2VsZWN0ZWRTdGVwRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuc2VsZWN0ZWQiKTsKICAgICAgaWYgKCFzZWxlY3RlZFN0ZXBFbGVtZW50KSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghc3RlcHBlckNvbnRhaW5lci5zdHlsZS5wYWRkaW5nVG9wKSB7CiAgICAgICAgc3RlcHBlckNvbnRhaW5lci5zdHlsZS5wYWRkaW5nVG9wID0gYCR7c3RlcHBlckNvbnRhaW5lci5vZmZzZXRIZWlnaHQgLyAyIC0gc2VsZWN0ZWRTdGVwRWxlbWVudC5vZmZzZXRIZWlnaHQgLyAyfXB4YDsKICAgICAgfQogICAgICBjb25zb2xlLmxvZygiU2V0dGluZyBzY3JvbGwgc3RhdHVzIik7CiAgICAgIGNvbnNvbGUubG9nKHNlbGVjdGVkU3RlcEVsZW1lbnQpOwogICAgICBjb25zdCBzY3JvbGxQb3NpdGlvbiA9IHNlbGVjdGVkU3RlcEVsZW1lbnQub2Zmc2V0VG9wIC0gc3RlcHBlckNvbnRhaW5lci5vZmZzZXRIZWlnaHQgLyAyICsgc2VsZWN0ZWRTdGVwRWxlbWVudC5vZmZzZXRIZWlnaHQgLyAyOwogICAgICBjb25zb2xlLmxvZyhzY3JvbGxQb3NpdGlvbik7CiAgICAgIGNvbnN0IGRvbXRvb2xzSW5zdGFuY2UgPSBhd2FpdCBEb21Ub29scy5zZXR1cERvbVRvb2xzKCk7CiAgICAgIGlmICghdGhpcy5zY3JvbGxlcikgewogICAgICAgIHRoaXMuc2Nyb2xsZXIgPSBuZXcgZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzLlN3ZWV0U2Nyb2xsKHsKICAgICAgICAgIHZlcnRpY2FsOiB0cnVlLAogICAgICAgICAgaG9yaXpvbnRhbDogZmFsc2UsCiAgICAgICAgICBlYXNpbmc6ICJlYXNlSW5PdXRFeHBvIiwKICAgICAgICAgIGR1cmF0aW9uOiA3MDAKICAgICAgICB9LCBzdGVwcGVyQ29udGFpbmVyKTsKICAgICAgfQogICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRTdGVwLnZhbGlkYXRpb25GdW5jQ2FsbGVkICYmIHRoaXMuc2VsZWN0ZWRTdGVwLnZhbGlkYXRpb25GdW5jKSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZFN0ZXAuYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwogICAgICAgIHRoaXMuc2VsZWN0ZWRTdGVwLnZhbGlkYXRpb25GdW5jQ2FsbGVkID0gdHJ1ZTsKICAgICAgICBhd2FpdCB0aGlzLnNlbGVjdGVkU3RlcC52YWxpZGF0aW9uRnVuYyh0aGlzLCBzZWxlY3RlZFN0ZXBFbGVtZW50LCB0aGlzLnNlbGVjdGVkU3RlcC5hYm9ydENvbnRyb2xsZXIuc2lnbmFsKTsKICAgICAgfQogICAgICB0aGlzLnNjcm9sbGVyLnRvKHNjcm9sbFBvc2l0aW9uKTsKICAgIH0KICAgIGFzeW5jIGdvQmFjaygpIHsKICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5zdGVwcy5maW5kSW5kZXgoKHN0ZXBBcmcpID0+IHN0ZXBBcmcgPT09IHRoaXMuc2VsZWN0ZWRTdGVwKTsKICAgICAgaWYgKGN1cnJlbnRJbmRleCA8PSAwKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLnNlbGVjdGVkU3RlcC5hYm9ydENvbnRyb2xsZXIpIHsKICAgICAgICB0aGlzLnNlbGVjdGVkU3RlcC5hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgfQogICAgICBjb25zdCBjdXJyZW50U3RlcCA9IHRoaXMuc3RlcHNbY3VycmVudEluZGV4XTsKICAgICAgY3VycmVudFN0ZXAudmFsaWRhdGlvbkZ1bmNDYWxsZWQgPSBmYWxzZTsKICAgICAgY29uc3QgcHJldmlvdXNTdGVwID0gdGhpcy5zdGVwc1tjdXJyZW50SW5kZXggLSAxXTsKICAgICAgcHJldmlvdXNTdGVwLnZhbGlkYXRpb25GdW5jQ2FsbGVkID0gZmFsc2U7CiAgICAgIHRoaXMuc2VsZWN0ZWRTdGVwID0gcHJldmlvdXNTdGVwOwogICAgICBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgYXdhaXQgdGhpcy5kb210b29scy5jb252ZW5pZW5jZS5zbWFydGRlbGF5LmRlbGF5Rm9yKDEwMCk7CiAgICAgIHRoaXMuc2VsZWN0ZWRTdGVwLm9uUmV0dXJuVG9TdGVwRnVuYz8uKHRoaXMsIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuc2VsZWN0ZWQiKSk7CiAgICB9CiAgICBnb05leHQoKSB7CiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMuc3RlcHMuZmluZEluZGV4KChzdGVwQXJnKSA9PiBzdGVwQXJnID09PSB0aGlzLnNlbGVjdGVkU3RlcCk7CiAgICAgIGlmIChjdXJyZW50SW5kZXggPCAwIHx8IGN1cnJlbnRJbmRleCA+PSB0aGlzLnN0ZXBzLmxlbmd0aCAtIDEpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTdGVwLmFib3J0Q29udHJvbGxlcikgewogICAgICAgIHRoaXMuc2VsZWN0ZWRTdGVwLmFib3J0Q29udHJvbGxlci5hYm9ydCgpOwogICAgICB9CiAgICAgIGNvbnN0IGN1cnJlbnRTdGVwID0gdGhpcy5zdGVwc1tjdXJyZW50SW5kZXhdOwogICAgICBjdXJyZW50U3RlcC52YWxpZGF0aW9uRnVuY0NhbGxlZCA9IGZhbHNlOwogICAgICBjb25zdCBuZXh0U3RlcCA9IHRoaXMuc3RlcHNbY3VycmVudEluZGV4ICsgMV07CiAgICAgIG5leHRTdGVwLnZhbGlkYXRpb25GdW5jQ2FsbGVkID0gZmFsc2U7CiAgICAgIHRoaXMuc2VsZWN0ZWRTdGVwID0gbmV4dFN0ZXA7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczcwKF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzU3RlcHBlcjIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW1lZGlhL2RlZXMtaW1hZ2Utdmlld2VyL2RlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW8gPSAoKSA9PiBiMmAKICA8c3R5bGU+CiAgICAuZGVtby1jb250YWluZXIgewogICAgICBwYWRkaW5nOiA0OHB4OwogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y4ZjlmYSIsICIjMGEwYTBhIil9OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDMycHg7CiAgICB9CgogICAgLnNlY3Rpb24gewogICAgICBtYXgtd2lkdGg6IDkwMHB4OwogICAgICB3aWR0aDogMTAwJTsKICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICB9CgogICAgLnNlY3Rpb24tdGl0bGUgewogICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICB9CgogICAgLnNlY3Rpb24tZGVzY3JpcHRpb24gewogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OwogICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgfQoKICAgIGRlZXMtaW1hZ2Utdmlld2VyIHsKICAgICAgaGVpZ2h0OiA0MDBweDsKICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgfQoKICAgIC5jb21wYWN0IHsKICAgICAgaGVpZ2h0OiAyNTBweDsKICAgIH0KICA8L3N0eWxlPgoKICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+SlBFRyBJbWFnZSB3aXRoIFRvb2xiYXI8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+QSBsYW5kc2NhcGUgcGhvdG8gd2l0aCB6b29tLCBwYW4sIGZpdCwgYW5kIGRvd25sb2FkIGNvbnRyb2xzLjwvZGl2PgogICAgICA8ZGVlcy1pbWFnZS12aWV3ZXIKICAgICAgICBzcmM9Imh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTA2NzQ0MDM4MTM2LTQ2MjczODM0YjNmYj93PTEyMDAiCiAgICAgICAgYWx0PSJNb3VudGFpbiBsYW5kc2NhcGUiCiAgICAgID48L2RlZXMtaW1hZ2Utdmlld2VyPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlBORyB3aXRoIFRyYW5zcGFyZW5jeTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5UcmFuc3BhcmVudCBQTkcgZGlzcGxheWVkIG9uIGEgY2hlY2tlcmJvYXJkIGJhY2tncm91bmQuPC9kaXY+CiAgICAgIDxkZWVzLWltYWdlLXZpZXdlcgogICAgICAgIHNyYz0iaHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy80LzQ3L1BOR190cmFuc3BhcmVuY3lfZGVtb25zdHJhdGlvbl8xLnBuZyIKICAgICAgICBhbHQ9IlBORyB0cmFuc3BhcmVuY3kgZGVtbyIKICAgICAgPjwvZGVlcy1pbWFnZS12aWV3ZXI+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+U1ZHIEltYWdlPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPlNjYWxhYmxlIHZlY3RvciBncmFwaGljLjwvZGl2PgogICAgICA8ZGVlcy1pbWFnZS12aWV3ZXIKICAgICAgICBzcmM9Imh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvMC8wMi9TVkdfbG9nby5zdmciCiAgICAgICAgYWx0PSJTVkcgbG9nbyIKICAgICAgICBmaXQ9ImNvbnRhaW4iCiAgICAgID48L2RlZXMtaW1hZ2Utdmlld2VyPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPk5vIFRvb2xiYXIgVmFyaWFudDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5JbWFnZSB2aWV3ZXIgd2l0aCB0aGUgdG9vbGJhciBoaWRkZW4uPC9kaXY+CiAgICAgIDxkZWVzLWltYWdlLXZpZXdlcgogICAgICAgIGNsYXNzPSJjb21wYWN0IgogICAgICAgIHNyYz0iaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0Njk0NzQ5NjgwMjgtNTY2MjNmMDJlNDJlP3c9ODAwIgogICAgICAgIGFsdD0iTmF0dXJlIHNjZW5lIgogICAgICAgIC5zaG93VG9vbGJhcj0ke2ZhbHNlfQogICAgICA+PC9kZWVzLWltYWdlLXZpZXdlcj4KICAgIDwvZGl2PgogIDwvZGl2PgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW1lZGlhL2RlZXMtaW1hZ2Utdmlld2VyL2NvbXBvbmVudC5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2RlZXNfaWNvbigpOwp2YXIgX19lc0RlY29yYXRlNzAgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczcxID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzSW1hZ2VWaWV3ZXIgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLWltYWdlLXZpZXdlciIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3NyY19kZWNvcmF0b3JzOwogIGxldCBfc3JjX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc3JjX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hbHRfZGVjb3JhdG9yczsKICBsZXQgX2FsdF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FsdF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZml0X2RlY29yYXRvcnM7CiAgbGV0IF9maXRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maXRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dUb29sYmFyX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93VG9vbGJhcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dUb29sYmFyX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF96b29tX2RlY29yYXRvcnM7CiAgbGV0IF96b29tX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfem9vbV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcGFuWF9kZWNvcmF0b3JzOwogIGxldCBfcGFuWF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BhblhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BhbllfZGVjb3JhdG9yczsKICBsZXQgX3BhbllfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wYW5ZX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0RyYWdnaW5nX2RlY29yYXRvcnM7CiAgbGV0IF9pc0RyYWdnaW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNEcmFnZ2luZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbG9hZGluZ19kZWNvcmF0b3JzOwogIGxldCBfbG9hZGluZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Vycm9yX2RlY29yYXRvcnM7CiAgbGV0IF9lcnJvcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Vycm9yX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pbWFnZU5hdHVyYWxXaWR0aF9kZWNvcmF0b3JzOwogIGxldCBfaW1hZ2VOYXR1cmFsV2lkdGhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pbWFnZU5hdHVyYWxXaWR0aF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW1hZ2VOYXR1cmFsSGVpZ2h0X2RlY29yYXRvcnM7CiAgbGV0IF9pbWFnZU5hdHVyYWxIZWlnaHRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pbWFnZU5hdHVyYWxIZWlnaHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0ltYWdlVmlld2VyMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3NyY19kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfYWx0X2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9maXRfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX3Nob3dUb29sYmFyX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3pvb21fZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3BhblhfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3BhbllfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2lzRHJhZ2dpbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2xvYWRpbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2Vycm9yX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pbWFnZU5hdHVyYWxXaWR0aF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaW1hZ2VOYXR1cmFsSGVpZ2h0X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTcwKHRoaXMsIG51bGwsIF9zcmNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic3JjIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzcmMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc3JjLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zcmMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc3JjX2luaXRpYWxpemVycywgX3NyY19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcwKHRoaXMsIG51bGwsIF9hbHRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYWx0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhbHQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWx0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hbHQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYWx0X2luaXRpYWxpemVycywgX2FsdF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcwKHRoaXMsIG51bGwsIF9maXRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZml0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJmaXQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZml0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5maXQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZml0X2luaXRpYWxpemVycywgX2ZpdF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcwKHRoaXMsIG51bGwsIF9zaG93VG9vbGJhcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93VG9vbGJhciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd1Rvb2xiYXIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2hvd1Rvb2xiYXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dUb29sYmFyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dUb29sYmFyX2luaXRpYWxpemVycywgX3Nob3dUb29sYmFyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzAodGhpcywgbnVsbCwgX3pvb21fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiem9vbSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiem9vbSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai56b29tLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai56b29tID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3pvb21faW5pdGlhbGl6ZXJzLCBfem9vbV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcwKHRoaXMsIG51bGwsIF9wYW5YX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInBhblgiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInBhblgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucGFuWCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucGFuWCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wYW5YX2luaXRpYWxpemVycywgX3BhblhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3MCh0aGlzLCBudWxsLCBfcGFuWV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwYW5ZIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJwYW5ZIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnBhblksIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnBhblkgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcGFuWV9pbml0aWFsaXplcnMsIF9wYW5ZX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzAodGhpcywgbnVsbCwgX2lzRHJhZ2dpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNEcmFnZ2luZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNEcmFnZ2luZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc0RyYWdnaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc0RyYWdnaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzRHJhZ2dpbmdfaW5pdGlhbGl6ZXJzLCBfaXNEcmFnZ2luZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcwKHRoaXMsIG51bGwsIF9sb2FkaW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxvYWRpbmciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImxvYWRpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubG9hZGluZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubG9hZGluZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9sb2FkaW5nX2luaXRpYWxpemVycywgX2xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3MCh0aGlzLCBudWxsLCBfZXJyb3JfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZXJyb3IiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImVycm9yIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmVycm9yLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5lcnJvciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9lcnJvcl9pbml0aWFsaXplcnMsIF9lcnJvcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcwKHRoaXMsIG51bGwsIF9pbWFnZU5hdHVyYWxXaWR0aF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpbWFnZU5hdHVyYWxXaWR0aCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaW1hZ2VOYXR1cmFsV2lkdGgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaW1hZ2VOYXR1cmFsV2lkdGgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmltYWdlTmF0dXJhbFdpZHRoID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2ltYWdlTmF0dXJhbFdpZHRoX2luaXRpYWxpemVycywgX2ltYWdlTmF0dXJhbFdpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzAodGhpcywgbnVsbCwgX2ltYWdlTmF0dXJhbEhlaWdodF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpbWFnZU5hdHVyYWxIZWlnaHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImltYWdlTmF0dXJhbEhlaWdodCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pbWFnZU5hdHVyYWxIZWlnaHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmltYWdlTmF0dXJhbEhlaWdodCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pbWFnZU5hdHVyYWxIZWlnaHRfaW5pdGlhbGl6ZXJzLCBfaW1hZ2VOYXR1cmFsSGVpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzAobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzSW1hZ2VWaWV3ZXIyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtbzsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJNZWRpYSJdOwogICAgI3NyY19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM3MSh0aGlzLCBfc3JjX2luaXRpYWxpemVycywgIiIpOwogICAgZ2V0IHNyYygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NyY19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNyYyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc3JjX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYWx0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3MSh0aGlzLCBfc3JjX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3MSh0aGlzLCBfYWx0X2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBhbHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhbHRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhbHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2FsdF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2ZpdF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX2FsdF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX2ZpdF9pbml0aWFsaXplcnMsICJjb250YWluIikpOwogICAgZ2V0IGZpdCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2ZpdF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGZpdCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZml0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd1Rvb2xiYXJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczcxKHRoaXMsIF9maXRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczcxKHRoaXMsIF9zaG93VG9vbGJhcl9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93VG9vbGJhcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dUb29sYmFyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd1Rvb2xiYXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dUb29sYmFyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjem9vbV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX3Nob3dUb29sYmFyX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3MSh0aGlzLCBfem9vbV9pbml0aWFsaXplcnMsIDEpKTsKICAgIGdldCB6b29tKCkgewogICAgICByZXR1cm4gdGhpcy4jem9vbV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHpvb20odmFsdWUyKSB7CiAgICAgIHRoaXMuI3pvb21fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNwYW5YX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3MSh0aGlzLCBfem9vbV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX3BhblhfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgcGFuWCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3BhblhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwYW5YKHZhbHVlMikgewogICAgICB0aGlzLiNwYW5YX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcGFuWV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX3BhblhfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczcxKHRoaXMsIF9wYW5ZX2luaXRpYWxpemVycywgMCkpOwogICAgZ2V0IHBhblkoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwYW5ZX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcGFuWSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcGFuWV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzRHJhZ2dpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczcxKHRoaXMsIF9wYW5ZX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3MSh0aGlzLCBfaXNEcmFnZ2luZ19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaXNEcmFnZ2luZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzRHJhZ2dpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc0RyYWdnaW5nKHZhbHVlMikgewogICAgICB0aGlzLiNpc0RyYWdnaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX2lzRHJhZ2dpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczcxKHRoaXMsIF9sb2FkaW5nX2luaXRpYWxpemVycywgdHJ1ZSkpOwogICAgZ2V0IGxvYWRpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNsb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbG9hZGluZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2Vycm9yX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3MSh0aGlzLCBfbG9hZGluZ19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX2Vycm9yX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBlcnJvcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2Vycm9yX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZXJyb3IodmFsdWUyKSB7CiAgICAgIHRoaXMuI2Vycm9yX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaW1hZ2VOYXR1cmFsV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczcxKHRoaXMsIF9lcnJvcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX2ltYWdlTmF0dXJhbFdpZHRoX2luaXRpYWxpemVycywgMCkpOwogICAgZ2V0IGltYWdlTmF0dXJhbFdpZHRoKCkgewogICAgICByZXR1cm4gdGhpcy4jaW1hZ2VOYXR1cmFsV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpbWFnZU5hdHVyYWxXaWR0aCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaW1hZ2VOYXR1cmFsV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpbWFnZU5hdHVyYWxIZWlnaHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczcxKHRoaXMsIF9pbWFnZU5hdHVyYWxXaWR0aF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX2ltYWdlTmF0dXJhbEhlaWdodF9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBpbWFnZU5hdHVyYWxIZWlnaHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpbWFnZU5hdHVyYWxIZWlnaHRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpbWFnZU5hdHVyYWxIZWlnaHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2ltYWdlTmF0dXJhbEhlaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgZHJhZ1N0YXJ0WCA9IChfX3J1bkluaXRpYWxpemVyczcxKHRoaXMsIF9pbWFnZU5hdHVyYWxIZWlnaHRfZXh0cmFJbml0aWFsaXplcnMpLCAwKTsKICAgIGRyYWdTdGFydFkgPSAwOwogICAgZHJhZ1N0YXJ0UGFuWCA9IDA7CiAgICBkcmFnU3RhcnRQYW5ZID0gMDsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8c3R5bGU+CiAgICAgICAgOmhvc3QgewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBSb2JvdG8sIHNhbnMtc2VyaWY7CiAgICAgICAgfQoKICAgICAgICAudmlld2VyLWNvbnRhaW5lciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NyUpIiwgImhzbCgyMTUgMjAlIDEwJSkiKX07CiAgICAgICAgfQoKICAgICAgICAudG9vbGJhciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgICAgcGFkZGluZzogMCAxNnB4OwogICAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiaHNsKDIxNSAyMCUgMTUlKSIpfTsKICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICJoc2woMjE3IDI1JSAyMiUpIil9OwogICAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgfQoKICAgICAgICAudG9vbGJhci1ncm91cCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGdhcDogNHB4OwogICAgICAgIH0KCiAgICAgICAgLnRvb2xiYXItYnV0dG9uIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDE2JSA0NSUpIiwgImhzbCgyMTUgMTYlIDc1JSkiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICB9CgogICAgICAgIC50b29sYmFyLWJ1dHRvbiBkZWVzLWljb24gewogICAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgIH0KCiAgICAgICAgLnRvb2xiYXItYnV0dG9uOmhvdmVyIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0IDMxJSA5MiUpIiwgImhzbCgyMTcgMjUlIDIyJSkiKX07CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgICAgICB9CgogICAgICAgIC50b29sYmFyLWJ1dHRvbjphY3RpdmUgewogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzNmM2Y0NiIpfTsKICAgICAgICB9CgogICAgICAgIC56b29tLWxldmVsIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgICBtaW4td2lkdGg6IDQ4cHg7CiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDQ1JSkiLCAiaHNsKDIxNSAxNiUgNzUlKSIpfTsKICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB9CgogICAgICAgIC5pbWFnZS1hcmVhIHsKICAgICAgICAgIGZsZXg6IDE7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgY3Vyc29yOiAke3RoaXMuem9vbSA+IDEgPyB0aGlzLmlzRHJhZ2dpbmcgPyAiZ3JhYmJpbmciIDogImdyYWIiIDogImRlZmF1bHQifTsKICAgICAgICB9CgogICAgICAgIC5jaGVja2VyYm9hcmQgewogICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgaW5zZXQ6IDA7CiAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOgogICAgICAgICAgICBsaW5lYXItZ3JhZGllbnQoNDVkZWcsICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjBmMGYwIiwgIiMxYTFhMWEiKX0gMjUlLCB0cmFuc3BhcmVudCAyNSUpLAogICAgICAgICAgICBsaW5lYXItZ3JhZGllbnQoLTQ1ZGVnLCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YwZjBmMCIsICIjMWExYTFhIil9IDI1JSwgdHJhbnNwYXJlbnQgMjUlKSwKICAgICAgICAgICAgbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCB0cmFuc3BhcmVudCA3NSUsICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjBmMGYwIiwgIiMxYTFhMWEiKX0gNzUlKSwKICAgICAgICAgICAgbGluZWFyLWdyYWRpZW50KC00NWRlZywgdHJhbnNwYXJlbnQgNzUlLCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YwZjBmMCIsICIjMWExYTFhIil9IDc1JSk7CiAgICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IDE2cHggMTZweDsKICAgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgMCwgMCA4cHgsIDhweCAtOHB4LCAtOHB4IDBweDsKICAgICAgICAgIG9wYWNpdHk6IDAuMzsKICAgICAgICB9CgogICAgICAgIC5pbWFnZS13cmFwcGVyIHsKICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgIGluc2V0OiAwOwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKCR7dGhpcy5wYW5YfXB4LCAke3RoaXMucGFuWX1weCkgc2NhbGUoJHt0aGlzLnpvb219KTsKICAgICAgICAgIHRyYW5zaXRpb246ICR7dGhpcy5pc0RyYWdnaW5nID8gIm5vbmUiIDogInRyYW5zZm9ybSAwLjJzIGVhc2UifTsKICAgICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgICAgfQoKICAgICAgICAuaW1hZ2Utd3JhcHBlciBpbWcgewogICAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgICAgbWF4LWhlaWdodDogMTAwJTsKICAgICAgICAgIG9iamVjdC1maXQ6ICR7dGhpcy5maXR9OwogICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgICAtd2Via2l0LXVzZXItZHJhZzogbm9uZTsKICAgICAgICB9CgogICAgICAgIC5pbWFnZS13cmFwcGVyIGltZy5hY3R1YWwgewogICAgICAgICAgbWF4LXdpZHRoOiBub25lOwogICAgICAgICAgbWF4LWhlaWdodDogbm9uZTsKICAgICAgICAgIG9iamVjdC1maXQ6IG5vbmU7CiAgICAgICAgfQoKICAgICAgICAubG9hZGluZy1vdmVybGF5IHsKICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgIGluc2V0OiAwOwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDI1NSwyNTUsMjU1LDAuOCkiLCAicmdiYSgwLDAsMCwwLjYpIil9OwogICAgICAgIH0KCiAgICAgICAgLmxvYWRpbmctc3Bpbm5lciB7CiAgICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICAgIGJvcmRlcjogM3B4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzZjNmNDYiKX07CiAgICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjNjBhNWZhIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgICAgYW5pbWF0aW9uOiBzcGluIDAuOHMgbGluZWFyIGluZmluaXRlOwogICAgICAgIH0KCiAgICAgICAgQGtleWZyYW1lcyBzcGluIHsKICAgICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfQogICAgICAgIH0KCiAgICAgICAgLmVycm9yLW92ZXJsYXkgewogICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgaW5zZXQ6IDA7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgIGdhcDogOHB4OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiNhMWExYWEiKX07CiAgICAgICAgfQoKICAgICAgICAuZXJyb3Itb3ZlcmxheSAuZXJyb3ItaWNvbiB7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkYzI2MjYiLCAiI2Y4NzE3MSIpfTsKICAgICAgICAgIGZvbnQtc2l6ZTogMzJweDsKICAgICAgICB9CgogICAgICAgIC5lcnJvci10ZXh0IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICB9CgogICAgICAgIC5pbWFnZS1pbmZvIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ExYTFhYSIsICIjNzE3MTdhIil9OwogICAgICAgICAgcGFkZGluZzogMCA0cHg7CiAgICAgICAgfQogICAgICA8L3N0eWxlPgoKICAgICAgPGRpdiBjbGFzcz0idmlld2VyLWNvbnRhaW5lciI+CiAgICAgICAgJHt0aGlzLnNob3dUb29sYmFyID8gYjJgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sYmFyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9vbGJhci1ncm91cCI+CiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idG9vbGJhci1idXR0b24iIEBjbGljaz0ke3RoaXMuem9vbU91dH0gdGl0bGU9Ilpvb20gb3V0Ij4KICAgICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOlpvb21PdXQiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InRvb2xiYXItYnV0dG9uIiBAY2xpY2s9JHt0aGlzLnJlc2V0Wm9vbX0+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iem9vbS1sZXZlbCI+JHtNYXRoLnJvdW5kKHRoaXMuem9vbSAqIDEwMCl9JTwvc3Bhbj4KICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJ0b29sYmFyLWJ1dHRvbiIgQGNsaWNrPSR7dGhpcy56b29tSW59IHRpdGxlPSJab29tIGluIj4KICAgICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOlpvb21JbiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sYmFyLWdyb3VwIj4KICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJ0b29sYmFyLWJ1dHRvbiIgQGNsaWNrPSR7dGhpcy5maXRUb1NjcmVlbn0gdGl0bGU9IkZpdCB0byBzY3JlZW4iPgogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6TWF4aW1pemUiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InRvb2xiYXItYnV0dG9uIiBAY2xpY2s9JHt0aGlzLmFjdHVhbFNpemV9IHRpdGxlPSJBY3R1YWwgc2l6ZSAoMTAwJSkiPgogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6U2NhbiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sYmFyLWdyb3VwIj4KICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJ0b29sYmFyLWJ1dHRvbiIgQGNsaWNrPSR7dGhpcy5kb3dubG9hZH0gdGl0bGU9IkRvd25sb2FkIj4KICAgICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOkRvd25sb2FkIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICR7dGhpcy5pbWFnZU5hdHVyYWxXaWR0aCA+IDAgPyBiMmAKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sYmFyLWdyb3VwIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpbWFnZS1pbmZvIj4ke3RoaXMuaW1hZ2VOYXR1cmFsV2lkdGh9IHggJHt0aGlzLmltYWdlTmF0dXJhbEhlaWdodH08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgIDwvZGl2PgogICAgICAgIGAgOiAiIn0KCiAgICAgICAgPGRpdgogICAgICAgICAgY2xhc3M9ImltYWdlLWFyZWEiCiAgICAgICAgICBAd2hlZWw9JHt0aGlzLmhhbmRsZVdoZWVsfQogICAgICAgICAgQG1vdXNlZG93bj0ke3RoaXMuaGFuZGxlTW91c2VEb3dufQogICAgICAgICAgQG1vdXNlbW92ZT0ke3RoaXMuaGFuZGxlTW91c2VNb3ZlfQogICAgICAgICAgQG1vdXNldXA9JHt0aGlzLmhhbmRsZU1vdXNlVXB9CiAgICAgICAgICBAbW91c2VsZWF2ZT0ke3RoaXMuaGFuZGxlTW91c2VVcH0KICAgICAgICAgIEBkYmxjbGljaz0ke3RoaXMuaGFuZGxlRG91YmxlQ2xpY2t9CiAgICAgICAgPgogICAgICAgICAgPGRpdiBjbGFzcz0iY2hlY2tlcmJvYXJkIj48L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImltYWdlLXdyYXBwZXIiPgogICAgICAgICAgICAke3RoaXMuc3JjID8gYjJgCiAgICAgICAgICAgICAgPGltZwogICAgICAgICAgICAgICAgY2xhc3M9IiR7dGhpcy5maXQgPT09ICJhY3R1YWwiID8gImFjdHVhbCIgOiAiIn0iCiAgICAgICAgICAgICAgICBzcmM9IiR7dGhpcy5zcmN9IgogICAgICAgICAgICAgICAgYWx0PSIke3RoaXMuYWx0fSIKICAgICAgICAgICAgICAgIEBsb2FkPSR7dGhpcy5oYW5kbGVJbWFnZUxvYWR9CiAgICAgICAgICAgICAgICBAZXJyb3I9JHt0aGlzLmhhbmRsZUltYWdlRXJyb3J9CiAgICAgICAgICAgICAgICBkcmFnZ2FibGU9ImZhbHNlIgogICAgICAgICAgICAgIC8+CiAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgJHt0aGlzLmxvYWRpbmcgJiYgdGhpcy5zcmMgPyBiMmAKICAgICAgICAgICAgPGRpdiBjbGFzcz0ibG9hZGluZy1vdmVybGF5Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2FkaW5nLXNwaW5uZXIiPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICR7dGhpcy5lcnJvciA/IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJlcnJvci1vdmVybGF5Ij4KICAgICAgICAgICAgICA8ZGVlcy1pY29uIGNsYXNzPSJlcnJvci1pY29uIiBpY29uPSJsdWNpZGU6SW1hZ2VPZmYiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvci10ZXh0Ij4ke3RoaXMuZXJyb3J9PC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGAgOiAiIn0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgem9vbUluKCkgewogICAgICB0aGlzLnpvb20gPSBNYXRoLm1pbigxMCwgdGhpcy56b29tICogMS4yNSk7CiAgICB9CiAgICB6b29tT3V0KCkgewogICAgICB0aGlzLnpvb20gPSBNYXRoLm1heCgwLjEsIHRoaXMuem9vbSAvIDEuMjUpOwogICAgICBpZiAodGhpcy56b29tIDw9IDEpIHsKICAgICAgICB0aGlzLnBhblggPSAwOwogICAgICAgIHRoaXMucGFuWSA9IDA7CiAgICAgIH0KICAgIH0KICAgIHJlc2V0Wm9vbSgpIHsKICAgICAgdGhpcy56b29tID0gMTsKICAgICAgdGhpcy5wYW5YID0gMDsKICAgICAgdGhpcy5wYW5ZID0gMDsKICAgIH0KICAgIGZpdFRvU2NyZWVuKCkgewogICAgICB0aGlzLnpvb20gPSAxOwogICAgICB0aGlzLnBhblggPSAwOwogICAgICB0aGlzLnBhblkgPSAwOwogICAgICB0aGlzLmZpdCA9ICJjb250YWluIjsKICAgIH0KICAgIGFjdHVhbFNpemUoKSB7CiAgICAgIHRoaXMuem9vbSA9IDE7CiAgICAgIHRoaXMucGFuWCA9IDA7CiAgICAgIHRoaXMucGFuWSA9IDA7CiAgICAgIHRoaXMuZml0ID0gImFjdHVhbCI7CiAgICB9CiAgICBkb3dubG9hZCgpIHsKICAgICAgaWYgKCF0aGlzLnNyYykKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGxpbmszID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwogICAgICBsaW5rMy5ocmVmID0gdGhpcy5zcmM7CiAgICAgIGxpbmszLmRvd25sb2FkID0gdGhpcy5zcmMuc3BsaXQoIi8iKS5wb3AoKSB8fCAiaW1hZ2UiOwogICAgICBsaW5rMy5jbGljaygpOwogICAgfQogICAgaGFuZGxlSW1hZ2VMb2FkKGUxMSkgewogICAgICBjb25zdCBpbWcgPSBlMTEudGFyZ2V0OwogICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgdGhpcy5lcnJvciA9ICIiOwogICAgICB0aGlzLmltYWdlTmF0dXJhbFdpZHRoID0gaW1nLm5hdHVyYWxXaWR0aDsKICAgICAgdGhpcy5pbWFnZU5hdHVyYWxIZWlnaHQgPSBpbWcubmF0dXJhbEhlaWdodDsKICAgIH0KICAgIGhhbmRsZUltYWdlRXJyb3IoKSB7CiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICB0aGlzLmVycm9yID0gIkZhaWxlZCB0byBsb2FkIGltYWdlIjsKICAgIH0KICAgIGhhbmRsZVdoZWVsKGUxMSkgewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgY29uc3QgZGVsdGEgPSBlMTEuZGVsdGFZID4gMCA/IDAuOSA6IDEuMTsKICAgICAgY29uc3QgbmV3Wm9vbSA9IE1hdGgubWluKDEwLCBNYXRoLm1heCgwLjEsIHRoaXMuem9vbSAqIGRlbHRhKSk7CiAgICAgIHRoaXMuem9vbSA9IG5ld1pvb207CiAgICAgIGlmICh0aGlzLnpvb20gPD0gMSkgewogICAgICAgIHRoaXMucGFuWCA9IDA7CiAgICAgICAgdGhpcy5wYW5ZID0gMDsKICAgICAgfQogICAgfQogICAgaGFuZGxlTW91c2VEb3duKGUxMSkgewogICAgICBpZiAodGhpcy56b29tIDw9IDEpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlOwogICAgICB0aGlzLmRyYWdTdGFydFggPSBlMTEuY2xpZW50WDsKICAgICAgdGhpcy5kcmFnU3RhcnRZID0gZTExLmNsaWVudFk7CiAgICAgIHRoaXMuZHJhZ1N0YXJ0UGFuWCA9IHRoaXMucGFuWDsKICAgICAgdGhpcy5kcmFnU3RhcnRQYW5ZID0gdGhpcy5wYW5ZOwogICAgfQogICAgaGFuZGxlTW91c2VNb3ZlKGUxMSkgewogICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZykKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMucGFuWCA9IHRoaXMuZHJhZ1N0YXJ0UGFuWCArIChlMTEuY2xpZW50WCAtIHRoaXMuZHJhZ1N0YXJ0WCk7CiAgICAgIHRoaXMucGFuWSA9IHRoaXMuZHJhZ1N0YXJ0UGFuWSArIChlMTEuY2xpZW50WSAtIHRoaXMuZHJhZ1N0YXJ0WSk7CiAgICB9CiAgICBoYW5kbGVNb3VzZVVwKCkgewogICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTsKICAgIH0KICAgIGhhbmRsZURvdWJsZUNsaWNrKCkgewogICAgICBpZiAodGhpcy56b29tID09PSAxKSB7CiAgICAgICAgdGhpcy56b29tID0gMjsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnpvb20gPSAxOwogICAgICAgIHRoaXMucGFuWCA9IDA7CiAgICAgICAgdGhpcy5wYW5ZID0gMDsKICAgICAgfQogICAgfQogICAgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgICBzdXBlci51cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygic3JjIikpIHsKICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlOwogICAgICAgIHRoaXMuZXJyb3IgPSAiIjsKICAgICAgICB0aGlzLnpvb20gPSAxOwogICAgICAgIHRoaXMucGFuWCA9IDA7CiAgICAgICAgdGhpcy5wYW5ZID0gMDsKICAgICAgICB0aGlzLmltYWdlTmF0dXJhbFdpZHRoID0gMDsKICAgICAgICB0aGlzLmltYWdlTmF0dXJhbEhlaWdodCA9IDA7CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNzEoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNJbWFnZVZpZXdlcjIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW1lZGlhL2RlZXMtYXVkaW8tdmlld2VyL2RlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW8yID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgcGFkZGluZzogNDhweDsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOGY5ZmEiLCAiIzBhMGEwYSIpfTsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgZ2FwOiAzMnB4OwogICAgfQoKICAgIC5zZWN0aW9uIHsKICAgICAgbWF4LXdpZHRoOiA2MDBweDsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgfQoKICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICBmb250LXdlaWdodDogNjAwOwogICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgfQoKICAgIC5zZWN0aW9uLWRlc2NyaXB0aW9uIHsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgIH0KCiAgICBkZWVzLWF1ZGlvLXZpZXdlciB7CiAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIH0KICA8L3N0eWxlPgoKICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+QXVkaW8gd2l0aCBXYXZlZm9ybTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5BdWRpbyBwbGF5ZXIgd2l0aCB3YXZlZm9ybSB2aXN1YWxpemF0aW9uIGFuZCBmdWxsIHRyYW5zcG9ydCBjb250cm9scy48L2Rpdj4KICAgICAgPGRlZXMtYXVkaW8tdmlld2VyCiAgICAgICAgc3JjPSJodHRwczovL3d3dy5zb3VuZGhlbGl4LmNvbS9leGFtcGxlcy9tcDMvU291bmRIZWxpeC1Tb25nLTEubXAzIgogICAgICAgIHRpdGxlPSJTb3VuZEhlbGl4IFNvbmcgMSIKICAgICAgICBhcnRpc3Q9IlQuIFNjaHVlcmdlciIKICAgICAgPjwvZGVlcy1hdWRpby12aWV3ZXI+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+QXVkaW8gd2l0aG91dCBXYXZlZm9ybTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5TaW1wbGUgYXVkaW8gcGxheWVyIHdpdGggYSBzZWVrYmFyIGluc3RlYWQgb2YgYSB3YXZlZm9ybS48L2Rpdj4KICAgICAgPGRlZXMtYXVkaW8tdmlld2VyCiAgICAgICAgc3JjPSJodHRwczovL3d3dy5zb3VuZGhlbGl4LmNvbS9leGFtcGxlcy9tcDMvU291bmRIZWxpeC1Tb25nLTIubXAzIgogICAgICAgIHRpdGxlPSJTb3VuZEhlbGl4IFNvbmcgMiIKICAgICAgICAuc2hvd1dhdmVmb3JtPSR7ZmFsc2V9CiAgICAgID48L2RlZXMtYXVkaW8tdmlld2VyPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPk1pbmltYWwgQXVkaW8gUGxheWVyPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPk5vIHRpdGxlIG9yIGFydGlzdCBtZXRhZGF0YSDigJQganVzdCB0aGUgcGxheWVyLjwvZGl2PgogICAgICA8ZGVlcy1hdWRpby12aWV3ZXIKICAgICAgICBzcmM9Imh0dHBzOi8vd3d3LnNvdW5kaGVsaXguY29tL2V4YW1wbGVzL21wMy9Tb3VuZEhlbGl4LVNvbmctMy5tcDMiCiAgICAgID48L2RlZXMtYXVkaW8tdmlld2VyPgogICAgPC9kaXY+CiAgPC9kaXY+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy1hdWRpby12aWV3ZXIvY29tcG9uZW50LmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfZGVlc19pY29uKCk7CnZhciBfX2VzRGVjb3JhdGU3MSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNzIgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNBdWRpb1ZpZXdlciA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtYXVkaW8tdmlld2VyIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfc3JjX2RlY29yYXRvcnM7CiAgbGV0IF9zcmNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zcmNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RpdGxlX2RlY29yYXRvcnM7CiAgbGV0IF90aXRsZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RpdGxlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hcnRpc3RfZGVjb3JhdG9yczsKICBsZXQgX2FydGlzdF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FydGlzdF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1dhdmVmb3JtX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93V2F2ZWZvcm1faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93V2F2ZWZvcm1fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2F1dG9wbGF5X2RlY29yYXRvcnM7CiAgbGV0IF9hdXRvcGxheV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2F1dG9wbGF5X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb29wX2RlY29yYXRvcnM7CiAgbGV0IF9sb29wX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbG9vcF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNQbGF5aW5nX2RlY29yYXRvcnM7CiAgbGV0IF9pc1BsYXlpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc1BsYXlpbmdfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2N1cnJlbnRUaW1lX2RlY29yYXRvcnM7CiAgbGV0IF9jdXJyZW50VGltZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2N1cnJlbnRUaW1lX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kdXJhdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfZHVyYXRpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kdXJhdGlvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdm9sdW1lX2RlY29yYXRvcnM7CiAgbGV0IF92b2x1bWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92b2x1bWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzTXV0ZWRfZGVjb3JhdG9yczsKICBsZXQgX2lzTXV0ZWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc011dGVkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb2FkaW5nX2RlY29yYXRvcnM7CiAgbGV0IF9sb2FkaW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbG9hZGluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZXJyb3JfZGVjb3JhdG9yczsKICBsZXQgX2Vycm9yX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZXJyb3JfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3dhdmVmb3JtRGF0YV9kZWNvcmF0b3JzOwogIGxldCBfd2F2ZWZvcm1EYXRhX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfd2F2ZWZvcm1EYXRhX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF93YXZlZm9ybVJlYWR5X2RlY29yYXRvcnM7CiAgbGV0IF93YXZlZm9ybVJlYWR5X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfd2F2ZWZvcm1SZWFkeV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzQXVkaW9WaWV3ZXIyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfc3JjX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF90aXRsZV9kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfYXJ0aXN0X2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9zaG93V2F2ZWZvcm1fZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfYXV0b3BsYXlfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfbG9vcF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9pc1BsYXlpbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2N1cnJlbnRUaW1lX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9kdXJhdGlvbl9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfdm9sdW1lX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pc011dGVkX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9sb2FkaW5nX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9lcnJvcl9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfd2F2ZWZvcm1EYXRhX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF93YXZlZm9ybVJlYWR5X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTcxKHRoaXMsIG51bGwsIF9zcmNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic3JjIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzcmMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc3JjLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zcmMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc3JjX2luaXRpYWxpemVycywgX3NyY19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcxKHRoaXMsIG51bGwsIF90aXRsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0aXRsZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGl0bGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudGl0bGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnRpdGxlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3RpdGxlX2luaXRpYWxpemVycywgX3RpdGxlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzEodGhpcywgbnVsbCwgX2FydGlzdF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhcnRpc3QiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFydGlzdCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hcnRpc3QsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFydGlzdCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hcnRpc3RfaW5pdGlhbGl6ZXJzLCBfYXJ0aXN0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzEodGhpcywgbnVsbCwgX3Nob3dXYXZlZm9ybV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93V2F2ZWZvcm0iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNob3dXYXZlZm9ybSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93V2F2ZWZvcm0sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dXYXZlZm9ybSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93V2F2ZWZvcm1faW5pdGlhbGl6ZXJzLCBfc2hvd1dhdmVmb3JtX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzEodGhpcywgbnVsbCwgX2F1dG9wbGF5X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImF1dG9wbGF5Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhdXRvcGxheSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hdXRvcGxheSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYXV0b3BsYXkgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYXV0b3BsYXlfaW5pdGlhbGl6ZXJzLCBfYXV0b3BsYXlfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3MSh0aGlzLCBudWxsLCBfbG9vcF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsb29wIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsb29wIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmxvb3AsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxvb3AgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbG9vcF9pbml0aWFsaXplcnMsIF9sb29wX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzEodGhpcywgbnVsbCwgX2lzUGxheWluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc1BsYXlpbmciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImlzUGxheWluZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc1BsYXlpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzUGxheWluZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pc1BsYXlpbmdfaW5pdGlhbGl6ZXJzLCBfaXNQbGF5aW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzEodGhpcywgbnVsbCwgX2N1cnJlbnRUaW1lX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImN1cnJlbnRUaW1lIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjdXJyZW50VGltZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jdXJyZW50VGltZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY3VycmVudFRpbWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY3VycmVudFRpbWVfaW5pdGlhbGl6ZXJzLCBfY3VycmVudFRpbWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3MSh0aGlzLCBudWxsLCBfZHVyYXRpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZHVyYXRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImR1cmF0aW9uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmR1cmF0aW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kdXJhdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kdXJhdGlvbl9pbml0aWFsaXplcnMsIF9kdXJhdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcxKHRoaXMsIG51bGwsIF92b2x1bWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidm9sdW1lIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ2b2x1bWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudm9sdW1lLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52b2x1bWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdm9sdW1lX2luaXRpYWxpemVycywgX3ZvbHVtZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcxKHRoaXMsIG51bGwsIF9pc011dGVkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzTXV0ZWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImlzTXV0ZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNNdXRlZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNNdXRlZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pc011dGVkX2luaXRpYWxpemVycywgX2lzTXV0ZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3MSh0aGlzLCBudWxsLCBfbG9hZGluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsb2FkaW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsb2FkaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmxvYWRpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxvYWRpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbG9hZGluZ19pbml0aWFsaXplcnMsIF9sb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzEodGhpcywgbnVsbCwgX2Vycm9yX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImVycm9yIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJlcnJvciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5lcnJvciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZXJyb3IgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZXJyb3JfaW5pdGlhbGl6ZXJzLCBfZXJyb3JfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3MSh0aGlzLCBudWxsLCBfd2F2ZWZvcm1EYXRhX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIndhdmVmb3JtRGF0YSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAid2F2ZWZvcm1EYXRhIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLndhdmVmb3JtRGF0YSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoud2F2ZWZvcm1EYXRhID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3dhdmVmb3JtRGF0YV9pbml0aWFsaXplcnMsIF93YXZlZm9ybURhdGFfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3MSh0aGlzLCBudWxsLCBfd2F2ZWZvcm1SZWFkeV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ3YXZlZm9ybVJlYWR5Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ3YXZlZm9ybVJlYWR5IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLndhdmVmb3JtUmVhZHksIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLndhdmVmb3JtUmVhZHkgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfd2F2ZWZvcm1SZWFkeV9pbml0aWFsaXplcnMsIF93YXZlZm9ybVJlYWR5X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzEobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzQXVkaW9WaWV3ZXIyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtbzI7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiTWVkaWEiXTsKICAgICNzcmNfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNzIodGhpcywgX3NyY19pbml0aWFsaXplcnMsICIiKTsKICAgIGdldCBzcmMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzcmNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzcmModmFsdWUyKSB7CiAgICAgIHRoaXMuI3NyY19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3RpdGxlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Mih0aGlzLCBfc3JjX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Mih0aGlzLCBfdGl0bGVfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IHRpdGxlKCkgewogICAgICByZXR1cm4gdGhpcy4jdGl0bGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0aXRsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdGl0bGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhcnRpc3RfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczcyKHRoaXMsIF90aXRsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzIodGhpcywgX2FydGlzdF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgYXJ0aXN0KCkgewogICAgICByZXR1cm4gdGhpcy4jYXJ0aXN0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYXJ0aXN0KHZhbHVlMikgewogICAgICB0aGlzLiNhcnRpc3RfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93V2F2ZWZvcm1fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczcyKHRoaXMsIF9hcnRpc3RfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczcyKHRoaXMsIF9zaG93V2F2ZWZvcm1faW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgc2hvd1dhdmVmb3JtKCkgewogICAgICByZXR1cm4gdGhpcy4jc2hvd1dhdmVmb3JtX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd1dhdmVmb3JtKHZhbHVlMikgewogICAgICB0aGlzLiNzaG93V2F2ZWZvcm1fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhdXRvcGxheV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzIodGhpcywgX3Nob3dXYXZlZm9ybV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzIodGhpcywgX2F1dG9wbGF5X2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBhdXRvcGxheSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2F1dG9wbGF5X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYXV0b3BsYXkodmFsdWUyKSB7CiAgICAgIHRoaXMuI2F1dG9wbGF5X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbG9vcF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzIodGhpcywgX2F1dG9wbGF5X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Mih0aGlzLCBfbG9vcF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgbG9vcCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xvb3BfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsb29wKHZhbHVlMikgewogICAgICB0aGlzLiNsb29wX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNQbGF5aW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Mih0aGlzLCBfbG9vcF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzIodGhpcywgX2lzUGxheWluZ19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaXNQbGF5aW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNQbGF5aW5nX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaXNQbGF5aW5nKHZhbHVlMikgewogICAgICB0aGlzLiNpc1BsYXlpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjdXJyZW50VGltZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzIodGhpcywgX2lzUGxheWluZ19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzIodGhpcywgX2N1cnJlbnRUaW1lX2luaXRpYWxpemVycywgMCkpOwogICAgZ2V0IGN1cnJlbnRUaW1lKCkgewogICAgICByZXR1cm4gdGhpcy4jY3VycmVudFRpbWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjdXJyZW50VGltZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY3VycmVudFRpbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNkdXJhdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzIodGhpcywgX2N1cnJlbnRUaW1lX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Mih0aGlzLCBfZHVyYXRpb25faW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgZHVyYXRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNkdXJhdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGR1cmF0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNkdXJhdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3ZvbHVtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzIodGhpcywgX2R1cmF0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Mih0aGlzLCBfdm9sdW1lX2luaXRpYWxpemVycywgMSkpOwogICAgZ2V0IHZvbHVtZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ZvbHVtZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZvbHVtZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdm9sdW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNNdXRlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzIodGhpcywgX3ZvbHVtZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzIodGhpcywgX2lzTXV0ZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGlzTXV0ZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc011dGVkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaXNNdXRlZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXNNdXRlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczcyKHRoaXMsIF9pc011dGVkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Mih0aGlzLCBfbG9hZGluZ19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgbG9hZGluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsb2FkaW5nKHZhbHVlMikgewogICAgICB0aGlzLiNsb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZXJyb3JfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczcyKHRoaXMsIF9sb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Mih0aGlzLCBfZXJyb3JfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGVycm9yKCkgewogICAgICByZXR1cm4gdGhpcy4jZXJyb3JfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBlcnJvcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jZXJyb3JfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN3YXZlZm9ybURhdGFfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczcyKHRoaXMsIF9lcnJvcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzIodGhpcywgX3dhdmVmb3JtRGF0YV9pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgd2F2ZWZvcm1EYXRhKCkgewogICAgICByZXR1cm4gdGhpcy4jd2F2ZWZvcm1EYXRhX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgd2F2ZWZvcm1EYXRhKHZhbHVlMikgewogICAgICB0aGlzLiN3YXZlZm9ybURhdGFfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN3YXZlZm9ybVJlYWR5X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Mih0aGlzLCBfd2F2ZWZvcm1EYXRhX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Mih0aGlzLCBfd2F2ZWZvcm1SZWFkeV9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgd2F2ZWZvcm1SZWFkeSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3dhdmVmb3JtUmVhZHlfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB3YXZlZm9ybVJlYWR5KHZhbHVlMikgewogICAgICB0aGlzLiN3YXZlZm9ybVJlYWR5X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBhdWRpb0VsZW1lbnQgPSAoX19ydW5Jbml0aWFsaXplcnM3Mih0aGlzLCBfd2F2ZWZvcm1SZWFkeV9leHRyYUluaXRpYWxpemVycyksIG51bGwpOwogICAgY2FudmFzRWxlbWVudCA9IG51bGw7CiAgICBhbmltRnJhbWVJZCA9IDA7CiAgICB2b2x1bWVCZWZvcmVNdXRlID0gMTsKICAgIHJlbmRlcigpIHsKICAgICAgY29uc3QgdGl0bGVUZXh0ID0gdGhpcy50aXRsZSAmJiB0aGlzLmFydGlzdCA/IGAke3RoaXMudGl0bGV9IFx1MjAxNCAke3RoaXMuYXJ0aXN0fWAgOiB0aGlzLnRpdGxlIHx8IHRoaXMuYXJ0aXN0IHx8ICIiOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxzdHlsZT4KICAgICAgICA6aG9zdCB7CiAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICB9CgogICAgICAgIC52aWV3ZXItY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk3JSkiLCAiaHNsKDIxNSAyMCUgMTAlKSIpfTsKICAgICAgICB9CgogICAgICAgIC50b29sYmFyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgICAgcGFkZGluZzogMCAxNnB4OwogICAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiaHNsKDIxNSAyMCUgMTUlKSIpfTsKICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICJoc2woMjE3IDI1JSAyMiUpIil9OwogICAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgfQoKICAgICAgICAudG9vbGJhci1ncm91cCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGdhcDogNHB4OwogICAgICAgIH0KCiAgICAgICAgLnRvb2xiYXItZ3JvdXAtLWVuZCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGdhcDogNHB4OwogICAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICAgICAgfQoKICAgICAgICAudG9vbGJhci1idXR0b24gewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDQ1JSkiLCAiaHNsKDIxNSAxNiUgNzUlKSIpfTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgfQoKICAgICAgICAudG9vbGJhci1idXR0b24gZGVlcy1pY29uIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICB9CgogICAgICAgIC50b29sYmFyLWJ1dHRvbjpob3ZlciB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNCAzMSUgOTIlKSIsICJoc2woMjE3IDI1JSAyMiUpIil9OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICAgICAgfQoKICAgICAgICAudG9vbGJhci1idXR0b246YWN0aXZlIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzZjNmNDYiKX07CiAgICAgICAgfQoKICAgICAgICAudG9vbGJhci1idXR0b24uYWN0aXZlIHsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgNjAlKSIsICJoc2woMjEzIDkzJSA2OCUpIil9OwogICAgICAgIH0KCiAgICAgICAgLnRvb2xiYXItdGl0bGUgewogICAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAxNiUgNDUlKSIsICJoc2woMjE1IDE2JSA3NSUpIil9OwogICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgICB9CgogICAgICAgIC50aW1lLWRpc3BsYXkgewogICAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDQ1JSkiLCAiaHNsKDIxNSAxNiUgNzUlKSIpfTsKICAgICAgICAgIG1pbi13aWR0aDogOTBweDsKICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIH0KCiAgICAgICAgLnZvbHVtZS1ncm91cCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGdhcDogNHB4OwogICAgICAgIH0KCiAgICAgICAgLnZvbHVtZS1zbGlkZXIgewogICAgICAgICAgd2lkdGg6IDcwcHg7CiAgICAgICAgICBoZWlnaHQ6IDRweDsKICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNCAzMSUgOTElKSIsICJoc2woMjE3IDI1JSAyMiUpIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB9CgogICAgICAgIC52b2x1bWUtc2xpZGVyOjotd2Via2l0LXNsaWRlci10aHVtYiB7CiAgICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICB3aWR0aDogMTJweDsKICAgICAgICAgIGhlaWdodDogMTJweDsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE3IDkxJSA2MCUpIiwgImhzbCgyMTMgOTMlIDY4JSkiKX07CiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgfQoKICAgICAgICAudm9sdW1lLXNsaWRlcjo6LW1vei1yYW5nZS10aHVtYiB7CiAgICAgICAgICB3aWR0aDogMTJweDsKICAgICAgICAgIGhlaWdodDogMTJweDsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE3IDkxJSA2MCUpIiwgImhzbCgyMTMgOTMlIDY4JSkiKX07CiAgICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgfQoKICAgICAgICAuY29udGVudC1hcmVhIHsKICAgICAgICAgIGZsZXg6IDE7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB9CgogICAgICAgIC53YXZlZm9ybS1jb250YWluZXIgewogICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgaW5zZXQ6IDA7CiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIH0KCiAgICAgICAgLndhdmVmb3JtLWNvbnRhaW5lciBjYW52YXMgewogICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB9CgogICAgICAgIC5zZWVrYmFyLWNvbnRhaW5lciB7CiAgICAgICAgICB3aWR0aDogODAlOwogICAgICAgICAgbWF4LXdpZHRoOiA2MDBweDsKICAgICAgICAgIGhlaWdodDogNnB4OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQgMzElIDkxJSkiLCAiaHNsKDIxNyAyNSUgMjIlKSIpfTsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgfQoKICAgICAgICAuc2Vla2Jhci1maWxsIHsKICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE3IDkxJSA2MCUpIiwgImhzbCgyMTMgOTMlIDY4JSkiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjFzIGxpbmVhcjsKICAgICAgICB9CgogICAgICAgIC5lcnJvci1vdmVybGF5IHsKICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgIGluc2V0OiAwOwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICBnYXA6IDhweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OwogICAgICAgIH0KCiAgICAgICAgLmVycm9yLW92ZXJsYXkgLmVycm9yLWljb24gewogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZGMyNjI2IiwgIiNmODcxNzEiKX07CiAgICAgICAgICBmb250LXNpemU6IDMycHg7CiAgICAgICAgfQoKICAgICAgICAuZXJyb3ItdGV4dCB7CiAgICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgfQoKICAgICAgICAubG9hZGluZy1vdmVybGF5IHsKICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgIGluc2V0OiAwOwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB9CgogICAgICAgIC5sb2FkaW5nLXNwaW5uZXIgewogICAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgICBib3JkZXI6IDNweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNCAzMSUgODYlKSIsICJoc2woMjE3IDI1JSAyOCUpIil9OwogICAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTcgOTElIDYwJSkiLCAiaHNsKDIxMyA5MyUgNjglKSIpfTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICAgIGFuaW1hdGlvbjogc3BpbiAwLjhzIGxpbmVhciBpbmZpbml0ZTsKICAgICAgICB9CgogICAgICAgIEBrZXlmcmFtZXMgc3BpbiB7CiAgICAgICAgICB0byB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH0KICAgICAgICB9CiAgICAgIDwvc3R5bGU+CgogICAgICA8ZGl2IGNsYXNzPSJ2aWV3ZXItY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sYmFyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItZ3JvdXAiPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJ0b29sYmFyLWJ1dHRvbiIgQGNsaWNrPSR7dGhpcy50b2dnbGVQbGF5fT4KICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZToke3RoaXMuaXNQbGF5aW5nID8gIlBhdXNlIiA6ICJQbGF5In0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRpbWUtZGlzcGxheSI+CiAgICAgICAgICAgICAgJHt0aGlzLmZvcm1hdFRpbWUodGhpcy5jdXJyZW50VGltZSl9IC8gJHt0aGlzLmZvcm1hdFRpbWUodGhpcy5kdXJhdGlvbil9CiAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICR7dGl0bGVUZXh0ID8gYjJgCiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0b29sYmFyLXRpdGxlIj4ke3RpdGxlVGV4dH08L3NwYW4+CiAgICAgICAgICBgIDogIiJ9CgogICAgICAgICAgPGRpdiBjbGFzcz0idG9vbGJhci1ncm91cC0tZW5kIj4KICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgIGNsYXNzPSJ0b29sYmFyLWJ1dHRvbiAke3RoaXMubG9vcCA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICAgIEBjbGljaz0ke3RoaXMudG9nZ2xlTG9vcH0KICAgICAgICAgICAgICB0aXRsZT0iTG9vcCIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOlJlcGVhdCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgIDwvYnV0dG9uPgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0idm9sdW1lLWdyb3VwIj4KICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJ0b29sYmFyLWJ1dHRvbiIgQGNsaWNrPSR7dGhpcy50b2dnbGVNdXRlfSB0aXRsZT0iJHt0aGlzLmlzTXV0ZWQgPyAiVW5tdXRlIiA6ICJNdXRlIn0iPgogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6JHt0aGlzLmlzTXV0ZWQgfHwgdGhpcy52b2x1bWUgPT09IDAgPyAiVm9sdW1lWCIgOiB0aGlzLnZvbHVtZSA8IDAuNSA/ICJWb2x1bWUxIiA6ICJWb2x1bWUyIn0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICAgICAgY2xhc3M9InZvbHVtZS1zbGlkZXIiCiAgICAgICAgICAgICAgICB0eXBlPSJyYW5nZSIKICAgICAgICAgICAgICAgIG1pbj0iMCIKICAgICAgICAgICAgICAgIG1heD0iMSIKICAgICAgICAgICAgICAgIHN0ZXA9IjAuMDEiCiAgICAgICAgICAgICAgICAudmFsdWU9JHtTdHJpbmcodGhpcy5pc011dGVkID8gMCA6IHRoaXMudm9sdW1lKX0KICAgICAgICAgICAgICAgIEBpbnB1dD0ke3RoaXMuaGFuZGxlVm9sdW1lQ2hhbmdlfQogICAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQtYXJlYSI+CiAgICAgICAgICAke3RoaXMuZXJyb3IgPyBiMmAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZXJyb3Itb3ZlcmxheSI+CiAgICAgICAgICAgICAgPGRlZXMtaWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0ibHVjaWRlOk11c2ljT2ZmIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3ItdGV4dCI+JHt0aGlzLmVycm9yfTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgIDogdGhpcy5sb2FkaW5nID8gYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxvYWRpbmctb3ZlcmxheSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibG9hZGluZy1zcGlubmVyIj48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgIDogdGhpcy5zaG93V2F2ZWZvcm0gPyBiMmAKICAgICAgICAgICAgPGRpdiBjbGFzcz0id2F2ZWZvcm0tY29udGFpbmVyIiBAY2xpY2s9JHt0aGlzLmhhbmRsZVdhdmVmb3JtQ2xpY2t9PgogICAgICAgICAgICAgIDxjYW52YXM+PC9jYW52YXM+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYCA6IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWVrYmFyLWNvbnRhaW5lciIgQGNsaWNrPSR7dGhpcy5oYW5kbGVTZWVrYmFyQ2xpY2t9PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlZWtiYXItZmlsbCIgc3R5bGU9IndpZHRoOiAke3RoaXMuZHVyYXRpb24gPyB0aGlzLmN1cnJlbnRUaW1lIC8gdGhpcy5kdXJhdGlvbiAqIDEwMCA6IDB9JSI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYH0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGlmICh0aGlzLnNyYykgewogICAgICAgIHRoaXMuaW5pdEF1ZGlvKCk7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLmNsZWFudXAoKTsKICAgIH0KICAgIGFzeW5jIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoInNyYyIpICYmIHRoaXMuc3JjKSB7CiAgICAgICAgdGhpcy5jbGVhbnVwKCk7CiAgICAgICAgdGhpcy5pbml0QXVkaW8oKTsKICAgICAgfQogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJ3YXZlZm9ybURhdGEiKSB8fCBjaGFuZ2VkUHJvcGVydGllcy5oYXMoImN1cnJlbnRUaW1lIikpIHsKICAgICAgICB0aGlzLmRyYXdXYXZlZm9ybSgpOwogICAgICB9CiAgICB9CiAgICBwbGF5KCkgewogICAgICB0aGlzLmF1ZGlvRWxlbWVudD8ucGxheSgpOwogICAgfQogICAgcGF1c2UoKSB7CiAgICAgIHRoaXMuYXVkaW9FbGVtZW50Py5wYXVzZSgpOwogICAgfQogICAgdG9nZ2xlUGxheSgpIHsKICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKSB7CiAgICAgICAgdGhpcy5wYXVzZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMucGxheSgpOwogICAgICB9CiAgICB9CiAgICBzZWVrKHRpbWUpIHsKICAgICAgaWYgKHRoaXMuYXVkaW9FbGVtZW50KSB7CiAgICAgICAgdGhpcy5hdWRpb0VsZW1lbnQuY3VycmVudFRpbWUgPSB0aW1lOwogICAgICB9CiAgICB9CiAgICBzZXRWb2x1bWUodjUpIHsKICAgICAgdGhpcy52b2x1bWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB2NSkpOwogICAgICBpZiAodGhpcy5hdWRpb0VsZW1lbnQpIHsKICAgICAgICB0aGlzLmF1ZGlvRWxlbWVudC52b2x1bWUgPSB0aGlzLnZvbHVtZTsKICAgICAgfQogICAgICBpZiAodGhpcy52b2x1bWUgPiAwKSB7CiAgICAgICAgdGhpcy5pc011dGVkID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHRvZ2dsZU11dGUoKSB7CiAgICAgIGlmICh0aGlzLmlzTXV0ZWQpIHsKICAgICAgICB0aGlzLmlzTXV0ZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLnZvbHVtZSA9IHRoaXMudm9sdW1lQmVmb3JlTXV0ZSB8fCAwLjU7CiAgICAgICAgaWYgKHRoaXMuYXVkaW9FbGVtZW50KSB7CiAgICAgICAgICB0aGlzLmF1ZGlvRWxlbWVudC52b2x1bWUgPSB0aGlzLnZvbHVtZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy52b2x1bWVCZWZvcmVNdXRlID0gdGhpcy52b2x1bWU7CiAgICAgICAgdGhpcy5pc011dGVkID0gdHJ1ZTsKICAgICAgICBpZiAodGhpcy5hdWRpb0VsZW1lbnQpIHsKICAgICAgICAgIHRoaXMuYXVkaW9FbGVtZW50LnZvbHVtZSA9IDA7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0b2dnbGVMb29wKCkgewogICAgICB0aGlzLmxvb3AgPSAhdGhpcy5sb29wOwogICAgICBpZiAodGhpcy5hdWRpb0VsZW1lbnQpIHsKICAgICAgICB0aGlzLmF1ZGlvRWxlbWVudC5sb29wID0gdGhpcy5sb29wOwogICAgICB9CiAgICB9CiAgICBpbml0QXVkaW8oKSB7CiAgICAgIHRoaXMuYXVkaW9FbGVtZW50ID0gbmV3IEF1ZGlvKCk7CiAgICAgIHRoaXMuYXVkaW9FbGVtZW50LmNyb3NzT3JpZ2luID0gImFub255bW91cyI7CiAgICAgIHRoaXMuYXVkaW9FbGVtZW50LnNyYyA9IHRoaXMuc3JjOwogICAgICB0aGlzLmF1ZGlvRWxlbWVudC52b2x1bWUgPSB0aGlzLmlzTXV0ZWQgPyAwIDogdGhpcy52b2x1bWU7CiAgICAgIHRoaXMuYXVkaW9FbGVtZW50Lmxvb3AgPSB0aGlzLmxvb3A7CiAgICAgIHRoaXMuYXVkaW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwgKCkgPT4gewogICAgICAgIHRoaXMuZHVyYXRpb24gPSB0aGlzLmF1ZGlvRWxlbWVudC5kdXJhdGlvbjsKICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgfSk7CiAgICAgIHRoaXMuYXVkaW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBsYXkiLCAoKSA9PiB7CiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSB0cnVlOwogICAgICAgIHRoaXMuc3RhcnRUaW1lVXBkYXRlKCk7CiAgICAgIH0pOwogICAgICB0aGlzLmF1ZGlvRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJwYXVzZSIsICgpID0+IHsKICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlOwogICAgICAgIHRoaXMuc3RvcFRpbWVVcGRhdGUoKTsKICAgICAgfSk7CiAgICAgIHRoaXMuYXVkaW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIiwgKCkgPT4gewogICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5zdG9wVGltZVVwZGF0ZSgpOwogICAgICB9KTsKICAgICAgdGhpcy5hdWRpb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCAoKSA9PiB7CiAgICAgICAgdGhpcy5lcnJvciA9ICJGYWlsZWQgdG8gbG9hZCBhdWRpbyI7CiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICAgIH0pOwogICAgICB0aGlzLmF1ZGlvRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwgKCkgPT4gewogICAgICAgIHRoaXMuY3VycmVudFRpbWUgPSB0aGlzLmF1ZGlvRWxlbWVudC5jdXJyZW50VGltZTsKICAgICAgfSk7CiAgICAgIGlmICh0aGlzLmF1dG9wbGF5KSB7CiAgICAgICAgdGhpcy5hdWRpb0VsZW1lbnQucGxheSgpLmNhdGNoKCgpID0+IHsKICAgICAgICB9KTsKICAgICAgfQogICAgICBpZiAodGhpcy5zaG93V2F2ZWZvcm0pIHsKICAgICAgICB0aGlzLmxvYWRXYXZlZm9ybSgpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBsb2FkV2F2ZWZvcm0oKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHRoaXMuc3JjKTsKICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7CiAgICAgICAgY29uc3QgYXVkaW9Db250ZXh0ID0gbmV3IEF1ZGlvQ29udGV4dCgpOwogICAgICAgIGNvbnN0IGF1ZGlvQnVmZmVyID0gYXdhaXQgYXVkaW9Db250ZXh0LmRlY29kZUF1ZGlvRGF0YShhcnJheUJ1ZmZlcik7CiAgICAgICAgY29uc3QgY2hhbm5lbERhdGEgPSBhdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YSgwKTsKICAgICAgICBjb25zdCBiYXJzID0gMjAwOwogICAgICAgIGNvbnN0IGJsb2NrU2l6ZSA9IE1hdGguZmxvb3IoY2hhbm5lbERhdGEubGVuZ3RoIC8gYmFycyk7CiAgICAgICAgY29uc3Qgd2F2ZWZvcm0gPSBbXTsKICAgICAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBiYXJzOyBpMTErKykgewogICAgICAgICAgbGV0IHN1bSA9IDA7CiAgICAgICAgICBmb3IgKGxldCBqNCA9IDA7IGo0IDwgYmxvY2tTaXplOyBqNCsrKSB7CiAgICAgICAgICAgIHN1bSArPSBNYXRoLmFicyhjaGFubmVsRGF0YVtpMTEgKiBibG9ja1NpemUgKyBqNF0pOwogICAgICAgICAgfQogICAgICAgICAgd2F2ZWZvcm0ucHVzaChzdW0gLyBibG9ja1NpemUpOwogICAgICAgIH0KICAgICAgICBjb25zdCBtYXgzID0gTWF0aC5tYXgoLi4ud2F2ZWZvcm0pOwogICAgICAgIHRoaXMud2F2ZWZvcm1EYXRhID0gd2F2ZWZvcm0ubWFwKCh2NSkgPT4gbWF4MyA+IDAgPyB2NSAvIG1heDMgOiAwKTsKICAgICAgICB0aGlzLndhdmVmb3JtUmVhZHkgPSB0cnVlOwogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICAgIGF3YWl0IGF1ZGlvQ29udGV4dC5jbG9zZSgpOwogICAgICB9IGNhdGNoIHsKICAgICAgICB0aGlzLndhdmVmb3JtUmVhZHkgPSBmYWxzZTsKICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgZHJhd1dhdmVmb3JtKCkgewogICAgICBpZiAoIXRoaXMuc2hvd1dhdmVmb3JtIHx8ICF0aGlzLndhdmVmb3JtUmVhZHkpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBjYW52YXMgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoImNhbnZhcyIpOwogICAgICBpZiAoIWNhbnZhcykKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMuY2FudmFzRWxlbWVudCA9IGNhbnZhczsKICAgICAgY29uc3QgY29udGFpbmVyID0gY2FudmFzLnBhcmVudEVsZW1lbnQ7CiAgICAgIGNvbnN0IGRwciA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7CiAgICAgIGNvbnN0IHdpZHRoID0gY29udGFpbmVyLmNsaWVudFdpZHRoOwogICAgICBjb25zdCBoZWlnaHQgPSBjb250YWluZXIuY2xpZW50SGVpZ2h0OwogICAgICBjYW52YXMud2lkdGggPSB3aWR0aCAqIGRwcjsKICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIGRwcjsKICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgIGlmICghY3R4KQogICAgICAgIHJldHVybjsKICAgICAgY3R4LnNjYWxlKGRwciwgZHByKTsKICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgY29uc3QgYmFycyA9IHRoaXMud2F2ZWZvcm1EYXRhLmxlbmd0aDsKICAgICAgaWYgKGJhcnMgPT09IDApCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBiYXJXaWR0aCA9IHdpZHRoIC8gYmFyczsKICAgICAgY29uc3QgcGxheWVkUmF0aW8gPSB0aGlzLmR1cmF0aW9uID4gMCA/IHRoaXMuY3VycmVudFRpbWUgLyB0aGlzLmR1cmF0aW9uIDogMDsKICAgICAgY29uc3QgcGxheWVkQmFycyA9IE1hdGguZmxvb3IocGxheWVkUmF0aW8gKiBiYXJzKTsKICAgICAgY29uc3QgaXNEYXJrID0gZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoInRoZW1lLWRhcmsiKSB8fCB3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIpLm1hdGNoZXM7CiAgICAgIGNvbnN0IHBsYXllZENvbG9yID0gaXNEYXJrID8gImhzbCgyMTMgOTMlIDY4JSkiIDogImhzbCgyMTcgOTElIDYwJSkiOwogICAgICBjb25zdCB1bnBsYXllZENvbG9yID0gaXNEYXJrID8gImhzbCgyMTcgMjUlIDIyJSkiIDogImhzbCgyMTQgMzElIDg2JSkiOwogICAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBiYXJzOyBpMTErKykgewogICAgICAgIGNvbnN0IGFtcGxpdHVkZSA9IHRoaXMud2F2ZWZvcm1EYXRhW2kxMV07CiAgICAgICAgY29uc3QgYmFySGVpZ2h0ID0gTWF0aC5tYXgoMiwgYW1wbGl0dWRlICogKGhlaWdodCAtIDQpKTsKICAgICAgICBjb25zdCB4MyA9IGkxMSAqIGJhcldpZHRoOwogICAgICAgIGNvbnN0IHk1ID0gKGhlaWdodCAtIGJhckhlaWdodCkgLyAyOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSBpMTEgPCBwbGF5ZWRCYXJzID8gcGxheWVkQ29sb3IgOiB1bnBsYXllZENvbG9yOwogICAgICAgIGN0eC5maWxsUmVjdCh4MyArIDAuNSwgeTUsIGJhcldpZHRoIC0gMSwgYmFySGVpZ2h0KTsKICAgICAgfQogICAgfQogICAgaGFuZGxlV2F2ZWZvcm1DbGljayhlMTEpIHsKICAgICAgY29uc3QgcmVjdCA9IGUxMS5jdXJyZW50VGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBjb25zdCByYXRpbyA9IChlMTEuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoOwogICAgICB0aGlzLnNlZWsocmF0aW8gKiB0aGlzLmR1cmF0aW9uKTsKICAgIH0KICAgIGhhbmRsZVNlZWtiYXJDbGljayhlMTEpIHsKICAgICAgY29uc3QgcmVjdCA9IGUxMS5jdXJyZW50VGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBjb25zdCByYXRpbyA9IChlMTEuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoOwogICAgICB0aGlzLnNlZWsocmF0aW8gKiB0aGlzLmR1cmF0aW9uKTsKICAgIH0KICAgIGhhbmRsZVZvbHVtZUNoYW5nZShlMTEpIHsKICAgICAgY29uc3QgdmFsdWUyID0gcGFyc2VGbG9hdChlMTEudGFyZ2V0LnZhbHVlKTsKICAgICAgdGhpcy5zZXRWb2x1bWUodmFsdWUyKTsKICAgIH0KICAgIHN0YXJ0VGltZVVwZGF0ZSgpIHsKICAgICAgdGhpcy5zdG9wVGltZVVwZGF0ZSgpOwogICAgICBjb25zdCB1cGRhdGUgPSAoKSA9PiB7CiAgICAgICAgaWYgKHRoaXMuYXVkaW9FbGVtZW50ICYmIHRoaXMuaXNQbGF5aW5nKSB7CiAgICAgICAgICB0aGlzLmN1cnJlbnRUaW1lID0gdGhpcy5hdWRpb0VsZW1lbnQuY3VycmVudFRpbWU7CiAgICAgICAgICB0aGlzLmFuaW1GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHVwZGF0ZSk7CiAgICAgICAgfQogICAgICB9OwogICAgICB0aGlzLmFuaW1GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHVwZGF0ZSk7CiAgICB9CiAgICBzdG9wVGltZVVwZGF0ZSgpIHsKICAgICAgaWYgKHRoaXMuYW5pbUZyYW1lSWQpIHsKICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1GcmFtZUlkKTsKICAgICAgICB0aGlzLmFuaW1GcmFtZUlkID0gMDsKICAgICAgfQogICAgfQogICAgZm9ybWF0VGltZShzZWNvbmRzKSB7CiAgICAgIGlmICghaXNGaW5pdGUoc2Vjb25kcykgfHwgc2Vjb25kcyA8IDApCiAgICAgICAgcmV0dXJuICIwOjAwIjsKICAgICAgY29uc3QgbWlucyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTsKICAgICAgY29uc3Qgc2VjcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAlIDYwKTsKICAgICAgcmV0dXJuIGAke21pbnN9OiR7c2Vjcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9YDsKICAgIH0KICAgIGNsZWFudXAoKSB7CiAgICAgIHRoaXMuc3RvcFRpbWVVcGRhdGUoKTsKICAgICAgaWYgKHRoaXMuYXVkaW9FbGVtZW50KSB7CiAgICAgICAgdGhpcy5hdWRpb0VsZW1lbnQucGF1c2UoKTsKICAgICAgICB0aGlzLmF1ZGlvRWxlbWVudC5zcmMgPSAiIjsKICAgICAgICB0aGlzLmF1ZGlvRWxlbWVudCA9IG51bGw7CiAgICAgIH0KICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTsKICAgICAgdGhpcy5jdXJyZW50VGltZSA9IDA7CiAgICAgIHRoaXMuZHVyYXRpb24gPSAwOwogICAgICB0aGlzLndhdmVmb3JtRGF0YSA9IFtdOwogICAgICB0aGlzLndhdmVmb3JtUmVhZHkgPSBmYWxzZTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNzIoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNBdWRpb1ZpZXdlcjIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW1lZGlhL2RlZXMtdmlkZW8tdmlld2VyL2RlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW8zID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgcGFkZGluZzogNDhweDsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOGY5ZmEiLCAiIzBhMGEwYSIpfTsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgZ2FwOiAzMnB4OwogICAgfQoKICAgIC5zZWN0aW9uIHsKICAgICAgbWF4LXdpZHRoOiA4MDBweDsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgfQoKICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICBmb250LXdlaWdodDogNjAwOwogICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgfQoKICAgIC5zZWN0aW9uLWRlc2NyaXB0aW9uIHsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgIH0KICA8L3N0eWxlPgoKICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+VmlkZW8gd2l0aCBDdXN0b20gQ29udHJvbHM8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+QSB2aWRlbyBwbGF5ZXIgd2l0aCBvdmVybGF5IGNvbnRyb2xzLCBzZWVraW5nLCBhbmQgdm9sdW1lIGFkanVzdG1lbnQuPC9kaXY+CiAgICAgIDxkZWVzLXZpZGVvLXZpZXdlcgogICAgICAgIHNyYz0iaHR0cHM6Ly9jb21tb25kYXRhc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9ndHYtdmlkZW9zLWJ1Y2tldC9zYW1wbGUvQmlnQnVja0J1bm55Lm1wNCIKICAgICAgICBwb3N0ZXI9Imh0dHBzOi8vY29tbW9uZGF0YXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZ3R2LXZpZGVvcy1idWNrZXQvc2FtcGxlL2ltYWdlcy9CaWdCdWNrQnVubnkuanBnIgogICAgICA+PC9kZWVzLXZpZGVvLXZpZXdlcj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5BdXRvcGxheSBNdXRlZDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5WaWRlbyB0aGF0IGF1dG9wbGF5cyBtdXRlZCwgY29tbW9ubHkgdXNlZCBmb3IgcHJldmlld3MuPC9kaXY+CiAgICAgIDxkZWVzLXZpZGVvLXZpZXdlcgogICAgICAgIHNyYz0iaHR0cHM6Ly9jb21tb25kYXRhc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9ndHYtdmlkZW9zLWJ1Y2tldC9zYW1wbGUvRWxlcGhhbnRzRHJlYW0ubXA0IgogICAgICAgIHBvc3Rlcj0iaHR0cHM6Ly9jb21tb25kYXRhc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9ndHYtdmlkZW9zLWJ1Y2tldC9zYW1wbGUvaW1hZ2VzL0VsZXBoYW50c0RyZWFtLmpwZyIKICAgICAgICAuYXV0b3BsYXk9JHt0cnVlfQogICAgICAgIC5tdXRlZD0ke3RydWV9CiAgICAgID48L2RlZXMtdmlkZW8tdmlld2VyPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPk5hdGl2ZSBDb250cm9sczwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5WaWRlbyB1c2luZyBicm93c2VyLW5hdGl2ZSBjb250cm9scyBpbnN0ZWFkIG9mIGN1c3RvbSBvdmVybGF5LjwvZGl2PgogICAgICA8ZGVlcy12aWRlby12aWV3ZXIKICAgICAgICBzcmM9Imh0dHBzOi8vY29tbW9uZGF0YXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZ3R2LXZpZGVvcy1idWNrZXQvc2FtcGxlL0ZvckJpZ2dlckJsYXplcy5tcDQiCiAgICAgICAgLnNob3dDb250cm9scz0ke2ZhbHNlfQogICAgICA+PC9kZWVzLXZpZGVvLXZpZXdlcj4KICAgIDwvZGl2PgogIDwvZGl2PgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW1lZGlhL2RlZXMtdmlkZW8tdmlld2VyL2NvbXBvbmVudC5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2RlZXNfaWNvbigpOwp2YXIgX19lc0RlY29yYXRlNzIgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczczID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzVmlkZW9WaWV3ZXIgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLXZpZGVvLXZpZXdlciIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3NyY19kZWNvcmF0b3JzOwogIGxldCBfc3JjX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc3JjX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wb3N0ZXJfZGVjb3JhdG9yczsKICBsZXQgX3Bvc3Rlcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Bvc3Rlcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0NvbnRyb2xzX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93Q29udHJvbHNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93Q29udHJvbHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2F1dG9wbGF5X2RlY29yYXRvcnM7CiAgbGV0IF9hdXRvcGxheV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2F1dG9wbGF5X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb29wX2RlY29yYXRvcnM7CiAgbGV0IF9sb29wX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbG9vcF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbXV0ZWRfZGVjb3JhdG9yczsKICBsZXQgX211dGVkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbXV0ZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzUGxheWluZ19kZWNvcmF0b3JzOwogIGxldCBfaXNQbGF5aW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNQbGF5aW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50VGltZV9kZWNvcmF0b3JzOwogIGxldCBfY3VycmVudFRpbWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50VGltZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZHVyYXRpb25fZGVjb3JhdG9yczsKICBsZXQgX2R1cmF0aW9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZHVyYXRpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZvbHVtZV9kZWNvcmF0b3JzOwogIGxldCBfdm9sdW1lX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdm9sdW1lX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb2FkaW5nX2RlY29yYXRvcnM7CiAgbGV0IF9sb2FkaW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbG9hZGluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZXJyb3JfZGVjb3JhdG9yczsKICBsZXQgX2Vycm9yX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZXJyb3JfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzRnVsbHNjcmVlbl9kZWNvcmF0b3JzOwogIGxldCBfaXNGdWxsc2NyZWVuX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNGdWxsc2NyZWVuX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250cm9sc1Zpc2libGVfZGVjb3JhdG9yczsKICBsZXQgX2NvbnRyb2xzVmlzaWJsZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRyb2xzVmlzaWJsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzVmlkZW9WaWV3ZXIyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfc3JjX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9wb3N0ZXJfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX3Nob3dDb250cm9sc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9hdXRvcGxheV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9sb29wX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX211dGVkX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2lzUGxheWluZ19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfY3VycmVudFRpbWVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2R1cmF0aW9uX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF92b2x1bWVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2xvYWRpbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2Vycm9yX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pc0Z1bGxzY3JlZW5fZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2NvbnRyb2xzVmlzaWJsZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGU3Mih0aGlzLCBudWxsLCBfc3JjX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNyYyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic3JjIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNyYywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc3JjID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NyY19pbml0aWFsaXplcnMsIF9zcmNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Mih0aGlzLCBudWxsLCBfcG9zdGVyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInBvc3RlciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicG9zdGVyIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnBvc3Rlciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucG9zdGVyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Bvc3Rlcl9pbml0aWFsaXplcnMsIF9wb3N0ZXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Mih0aGlzLCBudWxsLCBfc2hvd0NvbnRyb2xzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dDb250cm9scyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd0NvbnRyb2xzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dDb250cm9scywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd0NvbnRyb2xzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dDb250cm9sc19pbml0aWFsaXplcnMsIF9zaG93Q29udHJvbHNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Mih0aGlzLCBudWxsLCBfYXV0b3BsYXlfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYXV0b3BsYXkiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImF1dG9wbGF5IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmF1dG9wbGF5LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hdXRvcGxheSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hdXRvcGxheV9pbml0aWFsaXplcnMsIF9hdXRvcGxheV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcyKHRoaXMsIG51bGwsIF9sb29wX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxvb3AiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImxvb3AiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubG9vcCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubG9vcCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9sb29wX2luaXRpYWxpemVycywgX2xvb3BfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Mih0aGlzLCBudWxsLCBfbXV0ZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibXV0ZWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm11dGVkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm11dGVkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tdXRlZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tdXRlZF9pbml0aWFsaXplcnMsIF9tdXRlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcyKHRoaXMsIG51bGwsIF9pc1BsYXlpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNQbGF5aW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc1BsYXlpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNQbGF5aW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc1BsYXlpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNQbGF5aW5nX2luaXRpYWxpemVycywgX2lzUGxheWluZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcyKHRoaXMsIG51bGwsIF9jdXJyZW50VGltZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjdXJyZW50VGltZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3VycmVudFRpbWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3VycmVudFRpbWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmN1cnJlbnRUaW1lID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2N1cnJlbnRUaW1lX2luaXRpYWxpemVycywgX2N1cnJlbnRUaW1lX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzIodGhpcywgbnVsbCwgX2R1cmF0aW9uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImR1cmF0aW9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkdXJhdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5kdXJhdGlvbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZHVyYXRpb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZHVyYXRpb25faW5pdGlhbGl6ZXJzLCBfZHVyYXRpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Mih0aGlzLCBudWxsLCBfdm9sdW1lX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZvbHVtZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidm9sdW1lIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZvbHVtZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudm9sdW1lID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZvbHVtZV9pbml0aWFsaXplcnMsIF92b2x1bWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Mih0aGlzLCBudWxsLCBfbG9hZGluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsb2FkaW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsb2FkaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmxvYWRpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxvYWRpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbG9hZGluZ19pbml0aWFsaXplcnMsIF9sb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzIodGhpcywgbnVsbCwgX2Vycm9yX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImVycm9yIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJlcnJvciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5lcnJvciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZXJyb3IgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZXJyb3JfaW5pdGlhbGl6ZXJzLCBfZXJyb3JfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Mih0aGlzLCBudWxsLCBfaXNGdWxsc2NyZWVuX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzRnVsbHNjcmVlbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNGdWxsc2NyZWVuIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzRnVsbHNjcmVlbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNGdWxsc2NyZWVuID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzRnVsbHNjcmVlbl9pbml0aWFsaXplcnMsIF9pc0Z1bGxzY3JlZW5fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Mih0aGlzLCBudWxsLCBfY29udHJvbHNWaXNpYmxlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNvbnRyb2xzVmlzaWJsZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29udHJvbHNWaXNpYmxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNvbnRyb2xzVmlzaWJsZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY29udHJvbHNWaXNpYmxlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbnRyb2xzVmlzaWJsZV9pbml0aWFsaXplcnMsIF9jb250cm9sc1Zpc2libGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3MihudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNWaWRlb1ZpZXdlcjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vMzsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJNZWRpYSJdOwogICAgI3NyY19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM3Myh0aGlzLCBfc3JjX2luaXRpYWxpemVycywgIiIpOwogICAgZ2V0IHNyYygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NyY19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNyYyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc3JjX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcG9zdGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Myh0aGlzLCBfc3JjX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Myh0aGlzLCBfcG9zdGVyX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBwb3N0ZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwb3N0ZXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwb3N0ZXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Bvc3Rlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dDb250cm9sc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzModGhpcywgX3Bvc3Rlcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzModGhpcywgX3Nob3dDb250cm9sc19pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93Q29udHJvbHMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93Q29udHJvbHNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93Q29udHJvbHModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dDb250cm9sc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2F1dG9wbGF5X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Myh0aGlzLCBfc2hvd0NvbnRyb2xzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Myh0aGlzLCBfYXV0b3BsYXlfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGF1dG9wbGF5KCkgewogICAgICByZXR1cm4gdGhpcy4jYXV0b3BsYXlfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhdXRvcGxheSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYXV0b3BsYXlfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsb29wX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Myh0aGlzLCBfYXV0b3BsYXlfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczczKHRoaXMsIF9sb29wX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBsb29wKCkgewogICAgICByZXR1cm4gdGhpcy4jbG9vcF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxvb3AodmFsdWUyKSB7CiAgICAgIHRoaXMuI2xvb3BfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtdXRlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzModGhpcywgX2xvb3BfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczczKHRoaXMsIF9tdXRlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgbXV0ZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtdXRlZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG11dGVkKHZhbHVlMikgewogICAgICB0aGlzLiNtdXRlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzUGxheWluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzModGhpcywgX211dGVkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Myh0aGlzLCBfaXNQbGF5aW5nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc1BsYXlpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc1BsYXlpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc1BsYXlpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzUGxheWluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2N1cnJlbnRUaW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Myh0aGlzLCBfaXNQbGF5aW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Myh0aGlzLCBfY3VycmVudFRpbWVfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgY3VycmVudFRpbWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjdXJyZW50VGltZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGN1cnJlbnRUaW1lKHZhbHVlMikgewogICAgICB0aGlzLiNjdXJyZW50VGltZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2R1cmF0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Myh0aGlzLCBfY3VycmVudFRpbWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczczKHRoaXMsIF9kdXJhdGlvbl9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBkdXJhdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2R1cmF0aW9uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZHVyYXRpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI2R1cmF0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdm9sdW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Myh0aGlzLCBfZHVyYXRpb25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczczKHRoaXMsIF92b2x1bWVfaW5pdGlhbGl6ZXJzLCAxKSk7CiAgICBnZXQgdm9sdW1lKCkgewogICAgICByZXR1cm4gdGhpcy4jdm9sdW1lX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdm9sdW1lKHZhbHVlMikgewogICAgICB0aGlzLiN2b2x1bWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Myh0aGlzLCBfdm9sdW1lX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Myh0aGlzLCBfbG9hZGluZ19pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBsb2FkaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jbG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxvYWRpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNlcnJvcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzModGhpcywgX2xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczczKHRoaXMsIF9lcnJvcl9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgZXJyb3IoKSB7CiAgICAgIHJldHVybiB0aGlzLiNlcnJvcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGVycm9yKHZhbHVlMikgewogICAgICB0aGlzLiNlcnJvcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzRnVsbHNjcmVlbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzModGhpcywgX2Vycm9yX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Myh0aGlzLCBfaXNGdWxsc2NyZWVuX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc0Z1bGxzY3JlZW4oKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc0Z1bGxzY3JlZW5fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc0Z1bGxzY3JlZW4odmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzRnVsbHNjcmVlbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NvbnRyb2xzVmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzModGhpcywgX2lzRnVsbHNjcmVlbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzModGhpcywgX2NvbnRyb2xzVmlzaWJsZV9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBjb250cm9sc1Zpc2libGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb250cm9sc1Zpc2libGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjb250cm9sc1Zpc2libGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2NvbnRyb2xzVmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgaGlkZUNvbnRyb2xzVGltZXIgPSAoX19ydW5Jbml0aWFsaXplcnM3Myh0aGlzLCBfY29udHJvbHNWaXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgbnVsbCk7CiAgICB2aWRlb0VsZW1lbnQgPSBudWxsOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxzdHlsZT4KICAgICAgICA6aG9zdCB7CiAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICB9CgogICAgICAgIC52aWRlby1jb250YWluZXIgewogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICBhc3BlY3QtcmF0aW86IDE2IC8gOTsKICAgICAgICAgIGJhY2tncm91bmQ6ICMwMDAwMDA7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIH0KCiAgICAgICAgdmlkZW8gewogICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICBvYmplY3QtZml0OiBjb250YWluOwogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgfQoKICAgICAgICAub3ZlcmxheSB7CiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICBpbnNldDogMDsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB9CgogICAgICAgIC5jZW50ZXItcGxheSB7CiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICB0b3A6IDUwJTsKICAgICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgICAgICAgd2lkdGg6IDY0cHg7CiAgICAgICAgICBoZWlnaHQ6IDY0cHg7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICAgICAgICBjb2xvcjogI2ZmZmZmZjsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZSwgdHJhbnNmb3JtIDAuMnMgZWFzZTsKICAgICAgICAgIG9wYWNpdHk6ICR7dGhpcy5pc1BsYXlpbmcgPyAwIDogMX07CiAgICAgICAgICBwb2ludGVyLWV2ZW50czogJHt0aGlzLmlzUGxheWluZyA/ICJub25lIiA6ICJhdXRvIn07CiAgICAgICAgfQoKICAgICAgICAuY2VudGVyLXBsYXkgZGVlcy1pY29uIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMjhweDsKICAgICAgICB9CgogICAgICAgIC5jZW50ZXItcGxheTpob3ZlciB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuOCk7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSBzY2FsZSgxLjEpOwogICAgICAgIH0KCiAgICAgICAgLmNvbnRyb2xzLWJhciB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodHJhbnNwYXJlbnQsIHJnYmEoMCwgMCwgMCwgMC43KSk7CiAgICAgICAgICBwYWRkaW5nOiAyNHB4IDEycHggMTJweDsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgICBvcGFjaXR5OiAke3RoaXMuY29udHJvbHNWaXNpYmxlIHx8ICF0aGlzLmlzUGxheWluZyA/IDEgOiAwfTsKICAgICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcyBlYXNlOwogICAgICAgIH0KCiAgICAgICAgLnNlZWtiYXItcm93IHsKICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgaGVpZ2h0OiA0cHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgfQoKICAgICAgICAuc2Vla2Jhci1yb3c6aG92ZXIgewogICAgICAgICAgaGVpZ2h0OiA2cHg7CiAgICAgICAgfQoKICAgICAgICAuc2Vla2Jhci1wcm9ncmVzcyB7CiAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjNjBhNWZhIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgfQoKICAgICAgICAuY29udHJvbHMtcm93IHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgfQoKICAgICAgICAuY3RybC1idXR0b24gewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgICBjb2xvcjogI2ZmZmZmZjsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMgZWFzZTsKICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIH0KCiAgICAgICAgLmN0cmwtYnV0dG9uIGRlZXMtaWNvbiB7CiAgICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgfQoKICAgICAgICAuY3RybC1idXR0b246aG92ZXIgewogICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTsKICAgICAgICB9CgogICAgICAgIC50aW1lLWRpc3BsYXkgewogICAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgICAgICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7CiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIH0KCiAgICAgICAgLnNwYWNlciB7CiAgICAgICAgICBmbGV4OiAxOwogICAgICAgIH0KCiAgICAgICAgLnZvbHVtZS1ncm91cCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGdhcDogNHB4OwogICAgICAgIH0KCiAgICAgICAgLnZvbHVtZS1zbGlkZXIgewogICAgICAgICAgd2lkdGg6IDYwcHg7CiAgICAgICAgICBoZWlnaHQ6IDRweDsKICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIH0KCiAgICAgICAgLnZvbHVtZS1zbGlkZXI6Oi13ZWJraXQtc2xpZGVyLXRodW1iIHsKICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgIHdpZHRoOiAxMnB4OwogICAgICAgICAgaGVpZ2h0OiAxMnB4OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjsKICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB9CgogICAgICAgIC52b2x1bWUtc2xpZGVyOjotbW96LXJhbmdlLXRodW1iIHsKICAgICAgICAgIHdpZHRoOiAxMnB4OwogICAgICAgICAgaGVpZ2h0OiAxMnB4OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjsKICAgICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB9CgogICAgICAgIC5sb2FkaW5nLW92ZXJsYXkgewogICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgaW5zZXQ6IDA7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgfQoKICAgICAgICAubG9hZGluZy1zcGlubmVyIHsKICAgICAgICAgIHdpZHRoOiA0MHB4OwogICAgICAgICAgaGVpZ2h0OiA0MHB4OwogICAgICAgICAgYm9yZGVyOiAzcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogI2ZmZmZmZjsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICAgIGFuaW1hdGlvbjogc3BpbiAwLjhzIGxpbmVhciBpbmZpbml0ZTsKICAgICAgICB9CgogICAgICAgIEBrZXlmcmFtZXMgc3BpbiB7CiAgICAgICAgICB0byB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH0KICAgICAgICB9CgogICAgICAgIC5lcnJvci1vdmVybGF5IHsKICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgIGluc2V0OiAwOwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICBnYXA6IDhweDsKICAgICAgICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICAgICAgfQoKICAgICAgICAuZXJyb3Itb3ZlcmxheSBkZWVzLWljb24gewogICAgICAgICAgY29sb3I6ICNmODcxNzE7CiAgICAgICAgICBmb250LXNpemU6IDMycHg7CiAgICAgICAgfQoKICAgICAgICAuZXJyb3ItdGV4dCB7CiAgICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgfQogICAgICA8L3N0eWxlPgoKICAgICAgPGRpdgogICAgICAgIGNsYXNzPSJ2aWRlby1jb250YWluZXIiCiAgICAgICAgQG1vdXNlbW92ZT0ke3RoaXMuaGFuZGxlTW91c2VNb3ZlfQogICAgICAgIEBtb3VzZWxlYXZlPSR7dGhpcy5oYW5kbGVNb3VzZUxlYXZlfQogICAgICA+CiAgICAgICAgPHZpZGVvCiAgICAgICAgICAuc3JjPSR7dGhpcy5zcmN9CiAgICAgICAgICAucG9zdGVyPSR7dGhpcy5wb3N0ZXJ9CiAgICAgICAgICAubXV0ZWQ9JHt0aGlzLm11dGVkfQogICAgICAgICAgLmxvb3A9JHt0aGlzLmxvb3B9CiAgICAgICAgICA/YXV0b3BsYXk9JHt0aGlzLmF1dG9wbGF5fQogICAgICAgICAgP2NvbnRyb2xzPSR7IXRoaXMuc2hvd0NvbnRyb2xzfQogICAgICAgICAgcGxheXNpbmxpbmUKICAgICAgICAgIEBsb2FkZWRtZXRhZGF0YT0ke3RoaXMuaGFuZGxlTG9hZGVkTWV0YWRhdGF9CiAgICAgICAgICBAcGxheT0ke3RoaXMuaGFuZGxlUGxheX0KICAgICAgICAgIEBwYXVzZT0ke3RoaXMuaGFuZGxlUGF1c2V9CiAgICAgICAgICBAZW5kZWQ9JHt0aGlzLmhhbmRsZUVuZGVkfQogICAgICAgICAgQHRpbWV1cGRhdGU9JHt0aGlzLmhhbmRsZVRpbWVVcGRhdGV9CiAgICAgICAgICBAZXJyb3I9JHt0aGlzLmhhbmRsZUVycm9yfQogICAgICAgICAgQHdhaXRpbmc9JHsoKSA9PiB7CiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTsKICAgICAgfX0KICAgICAgICAgIEBjYW5wbGF5PSR7KCkgPT4gewogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICB9fQogICAgICAgID48L3ZpZGVvPgoKICAgICAgICAke3RoaXMuc2hvd0NvbnRyb2xzID8gYjJgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJvdmVybGF5IiBAY2xpY2s9JHt0aGlzLmhhbmRsZU92ZXJsYXlDbGlja30+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNlbnRlci1wbGF5Ij4KICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpQbGF5Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9scy1iYXIiIEBjbGljaz0keyhlMTEpID0+IGUxMS5zdG9wUHJvcGFnYXRpb24oKX0+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2Vla2Jhci1yb3ciIEBjbGljaz0ke3RoaXMuaGFuZGxlU2Vla30+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWVrYmFyLXByb2dyZXNzIiBzdHlsZT0id2lkdGg6ICR7dGhpcy5kdXJhdGlvbiA/IHRoaXMuY3VycmVudFRpbWUgLyB0aGlzLmR1cmF0aW9uICogMTAwIDogMH0lIj48L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbHMtcm93Ij4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0cmwtYnV0dG9uIiBAY2xpY2s9JHt0aGlzLnRvZ2dsZVBsYXl9PgogICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZToke3RoaXMuaXNQbGF5aW5nID8gIlBhdXNlIiA6ICJQbGF5In0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgPC9idXR0b24+CgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRpbWUtZGlzcGxheSI+CiAgICAgICAgICAgICAgICAgICR7dGhpcy5mb3JtYXRUaW1lKHRoaXMuY3VycmVudFRpbWUpfSAvICR7dGhpcy5mb3JtYXRUaW1lKHRoaXMuZHVyYXRpb24pfQogICAgICAgICAgICAgICAgPC9zcGFuPgoKICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzcGFjZXIiPjwvc3Bhbj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ2b2x1bWUtZ3JvdXAiPgogICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdHJsLWJ1dHRvbiIgQGNsaWNrPSR7dGhpcy50b2dnbGVNdXRlfT4KICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZToke3RoaXMubXV0ZWQgfHwgdGhpcy52b2x1bWUgPT09IDAgPyAiVm9sdW1lWCIgOiB0aGlzLnZvbHVtZSA8IDAuNSA/ICJWb2x1bWUxIiA6ICJWb2x1bWUyIn0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgICAgICAgY2xhc3M9InZvbHVtZS1zbGlkZXIiCiAgICAgICAgICAgICAgICAgICAgdHlwZT0icmFuZ2UiCiAgICAgICAgICAgICAgICAgICAgbWluPSIwIgogICAgICAgICAgICAgICAgICAgIG1heD0iMSIKICAgICAgICAgICAgICAgICAgICBzdGVwPSIwLjAxIgogICAgICAgICAgICAgICAgICAgIC52YWx1ZT0ke1N0cmluZyh0aGlzLm11dGVkID8gMCA6IHRoaXMudm9sdW1lKX0KICAgICAgICAgICAgICAgICAgICBAaW5wdXQ9JHt0aGlzLmhhbmRsZVZvbHVtZUNoYW5nZX0KICAgICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0cmwtYnV0dG9uIiBAY2xpY2s9JHt0aGlzLnRvZ2dsZUZ1bGxzY3JlZW59IHRpdGxlPSJGdWxsc2NyZWVuIj4KICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6JHt0aGlzLmlzRnVsbHNjcmVlbiA/ICJNaW5pbWl6ZSIgOiAiTWF4aW1pemUifSI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgIDogIiJ9CgogICAgICAgICR7dGhpcy5sb2FkaW5nICYmICF0aGlzLmVycm9yID8gYjJgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2FkaW5nLW92ZXJsYXkiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2FkaW5nLXNwaW5uZXIiPjwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgYCA6ICIifQoKICAgICAgICAke3RoaXMuZXJyb3IgPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9ImVycm9yLW92ZXJsYXkiPgogICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpWaWRlb09mZiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvci10ZXh0Ij4ke3RoaXMuZXJyb3J9PC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgYCA6ICIifQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIHRoaXMudmlkZW9FbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpIHx8IG51bGw7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZ1bGxzY3JlZW5jaGFuZ2UiLCB0aGlzLmhhbmRsZUZ1bGxzY3JlZW5DaGFuZ2UpOwogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImZ1bGxzY3JlZW5jaGFuZ2UiLCB0aGlzLmhhbmRsZUZ1bGxzY3JlZW5DaGFuZ2UpOwogICAgICBpZiAodGhpcy5oaWRlQ29udHJvbHNUaW1lcikgewogICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmhpZGVDb250cm9sc1RpbWVyKTsKICAgICAgfQogICAgfQogICAgcGxheSgpIHsKICAgICAgdGhpcy52aWRlb0VsZW1lbnQ/LnBsYXkoKTsKICAgIH0KICAgIHBhdXNlKCkgewogICAgICB0aGlzLnZpZGVvRWxlbWVudD8ucGF1c2UoKTsKICAgIH0KICAgIHRvZ2dsZVBsYXkoKSB7CiAgICAgIGlmICh0aGlzLmlzUGxheWluZykgewogICAgICAgIHRoaXMucGF1c2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnBsYXkoKTsKICAgICAgfQogICAgfQogICAgc2Vlayh0aW1lKSB7CiAgICAgIGlmICh0aGlzLnZpZGVvRWxlbWVudCkgewogICAgICAgIHRoaXMudmlkZW9FbGVtZW50LmN1cnJlbnRUaW1lID0gdGltZTsKICAgICAgfQogICAgfQogICAgc2V0Vm9sdW1lKHY1KSB7CiAgICAgIHRoaXMudm9sdW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdjUpKTsKICAgICAgaWYgKHRoaXMudmlkZW9FbGVtZW50KSB7CiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQudm9sdW1lID0gdGhpcy52b2x1bWU7CiAgICAgIH0KICAgIH0KICAgIHRvZ2dsZUZ1bGxzY3JlZW4oKSB7CiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnZpZGVvLWNvbnRhaW5lciIpOwogICAgICBpZiAoIWNvbnRhaW5lcikKICAgICAgICByZXR1cm47CiAgICAgIGlmICh0aGlzLmlzRnVsbHNjcmVlbikgewogICAgICAgIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuPy4oKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250YWluZXIucmVxdWVzdEZ1bGxzY3JlZW4/LigpOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVMb2FkZWRNZXRhZGF0YSgpIHsKICAgICAgaWYgKHRoaXMudmlkZW9FbGVtZW50KSB7CiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IHRoaXMudmlkZW9FbGVtZW50LmR1cmF0aW9uOwogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVQbGF5KCkgewogICAgICB0aGlzLmlzUGxheWluZyA9IHRydWU7CiAgICAgIHRoaXMuc2NoZWR1bGVIaWRlQ29udHJvbHMoKTsKICAgIH0KICAgIGhhbmRsZVBhdXNlKCkgewogICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlOwogICAgICB0aGlzLmNvbnRyb2xzVmlzaWJsZSA9IHRydWU7CiAgICB9CiAgICBoYW5kbGVFbmRlZCgpIHsKICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTsKICAgICAgdGhpcy5jb250cm9sc1Zpc2libGUgPSB0cnVlOwogICAgfQogICAgaGFuZGxlVGltZVVwZGF0ZSgpIHsKICAgICAgaWYgKHRoaXMudmlkZW9FbGVtZW50KSB7CiAgICAgICAgdGhpcy5jdXJyZW50VGltZSA9IHRoaXMudmlkZW9FbGVtZW50LmN1cnJlbnRUaW1lOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVFcnJvcigpIHsKICAgICAgdGhpcy5lcnJvciA9ICJGYWlsZWQgdG8gbG9hZCB2aWRlbyI7CiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgfQogICAgaGFuZGxlT3ZlcmxheUNsaWNrKCkgewogICAgICB0aGlzLnRvZ2dsZVBsYXkoKTsKICAgIH0KICAgIGhhbmRsZVNlZWsoZTExKSB7CiAgICAgIGNvbnN0IHJlY3QgPSBlMTEuY3VycmVudFRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgcmF0aW8gPSAoZTExLmNsaWVudFggLSByZWN0LmxlZnQpIC8gcmVjdC53aWR0aDsKICAgICAgdGhpcy5zZWVrKHJhdGlvICogdGhpcy5kdXJhdGlvbik7CiAgICB9CiAgICBoYW5kbGVWb2x1bWVDaGFuZ2UoZTExKSB7CiAgICAgIGNvbnN0IHZhbHVlMiA9IHBhcnNlRmxvYXQoZTExLnRhcmdldC52YWx1ZSk7CiAgICAgIHRoaXMuc2V0Vm9sdW1lKHZhbHVlMik7CiAgICAgIHRoaXMubXV0ZWQgPSB2YWx1ZTIgPT09IDA7CiAgICB9CiAgICB0b2dnbGVNdXRlKCkgewogICAgICB0aGlzLm11dGVkID0gIXRoaXMubXV0ZWQ7CiAgICAgIGlmICh0aGlzLnZpZGVvRWxlbWVudCkgewogICAgICAgIHRoaXMudmlkZW9FbGVtZW50Lm11dGVkID0gdGhpcy5tdXRlZDsKICAgICAgfQogICAgfQogICAgaGFuZGxlTW91c2VNb3ZlKCkgewogICAgICB0aGlzLmNvbnRyb2xzVmlzaWJsZSA9IHRydWU7CiAgICAgIHRoaXMuc2NoZWR1bGVIaWRlQ29udHJvbHMoKTsKICAgIH0KICAgIGhhbmRsZU1vdXNlTGVhdmUoKSB7CiAgICAgIGlmICh0aGlzLmlzUGxheWluZykgewogICAgICAgIHRoaXMuY29udHJvbHNWaXNpYmxlID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHNjaGVkdWxlSGlkZUNvbnRyb2xzKCkgewogICAgICBpZiAodGhpcy5oaWRlQ29udHJvbHNUaW1lcikgewogICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmhpZGVDb250cm9sc1RpbWVyKTsKICAgICAgfQogICAgICBpZiAodGhpcy5pc1BsYXlpbmcpIHsKICAgICAgICB0aGlzLmhpZGVDb250cm9sc1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICB0aGlzLmNvbnRyb2xzVmlzaWJsZSA9IGZhbHNlOwogICAgICAgIH0sIDNlMyk7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZUZ1bGxzY3JlZW5DaGFuZ2UgPSAoKSA9PiB7CiAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gISFkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudDsKICAgIH07CiAgICBmb3JtYXRUaW1lKHNlY29uZHMpIHsKICAgICAgaWYgKCFpc0Zpbml0ZShzZWNvbmRzKSB8fCBzZWNvbmRzIDwgMCkKICAgICAgICByZXR1cm4gIjA6MDAiOwogICAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApOwogICAgICBjb25zdCBzZWNzID0gTWF0aC5mbG9vcihzZWNvbmRzICUgNjApOwogICAgICByZXR1cm4gYCR7bWluc306JHtzZWNzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKX1gOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM3MyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1ZpZGVvVmlld2VyMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy1wZGYtc2hhcmVkL1BkZk1hbmFnZXIuanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIFBkZk1hbmFnZXIgPSBjbGFzcyB7CiAgc3RhdGljIHBkZmpzTGliOwogIHN0YXRpYyBpbml0aWFsaXplZCA9IGZhbHNlOwogIHN0YXRpYyBhc3luYyBpbml0aWFsaXplKCkgewogICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpCiAgICAgIHJldHVybjsKICAgIHRoaXMucGRmanNMaWIgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vcGRmanMtZGlzdEA0LjAuMzc5Lytlc20iKTsKICAgIHRoaXMucGRmanNMaWIuR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMgPSAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9wZGZqcy1kaXN0QDQuMC4zNzkvYnVpbGQvcGRmLndvcmtlci5tanMiOwogICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7CiAgfQogIHN0YXRpYyBhc3luYyBsb2FkRG9jdW1lbnQodXJsKSB7CiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemUoKTsKICAgIGNvbnN0IGxvYWRpbmdUYXNrID0gdGhpcy5wZGZqc0xpYi5nZXREb2N1bWVudCh1cmwpOwogICAgY29uc3QgZG9jdW1lbnQ0ID0gYXdhaXQgbG9hZGluZ1Rhc2sucHJvbWlzZTsKICAgIHJldHVybiBkb2N1bWVudDQ7CiAgfQogIHN0YXRpYyByZWxlYXNlRG9jdW1lbnQoX3VybCkgewogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXBkZi12aWV3ZXIvc3R5bGVzLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciB2aWV3ZXJTdHlsZXMgPSBbCiAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogIGlgCiAgICA6aG9zdCB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgaGVpZ2h0OiA2MDBweDsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCBzYW5zLXNlcmlmOwogICAgICBjb250YWluOiBsYXlvdXQgc3R5bGU7CiAgICB9CgogICAgLnBkZi12aWV3ZXIgewogICAgICB3aWR0aDogMTAwJTsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTclKSIsICJoc2woMjE1IDIwJSAxMCUpIil9OwogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB9CgogICAgLnRvb2xiYXIgewogICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMjE1IDIwJSAxNSUpIil9OwogICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQgMzElIDkxJSkiLCAiaHNsKDIxNyAyNSUgMjIlKSIpfTsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgcGFkZGluZzogMCAxNnB4OwogICAgICBnYXA6IDE2cHg7CiAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgfQoKICAgIC50b29sYmFyLWdyb3VwIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgZ2FwOiA0cHg7CiAgICB9CgogICAgLnRvb2xiYXItZ3JvdXAtLWVuZCB7CiAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgfQoKICAgIC50b29sYmFyLWJ1dHRvbiB7CiAgICAgIHdpZHRoOiAzMnB4OwogICAgICBoZWlnaHQ6IDMycHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cyBlYXNlOwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDQ1JSkiLCAiaHNsKDIxNSAxNiUgNzUlKSIpfTsKICAgIH0KCiAgICAudG9vbGJhci1idXR0b246aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNCAzMSUgOTIlKSIsICJoc2woMjE3IDI1JSAyMiUpIil9OwogICAgfQoKICAgIC50b29sYmFyLWJ1dHRvbjpkaXNhYmxlZCB7CiAgICAgIG9wYWNpdHk6IDAuNDsKICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgIH0KCiAgICAudG9vbGJhci1idXR0b24gZGVlcy1pY29uIHsKICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgfQoKICAgIC5wYWdlLWluZm8gewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBnYXA6IDhweDsKICAgICAgcGFkZGluZzogMCA4cHg7CiAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDE2JSA0NSUpIiwgImhzbCgyMTUgMTYlIDc1JSkiKX07CiAgICB9CgogICAgLnBhZ2UtaW5wdXQgewogICAgICB3aWR0aDogNDhweDsKICAgICAgaGVpZ2h0OiAyOHB4OwogICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0IDMxJSA4NiUpIiwgImhzbCgyMTcgMjUlIDI4JSkiKX07CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMjE1IDIwJSAxMiUpIil9OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIgNDclIDExJSkiLCAiaHNsKDIxMCAyMCUgOTYlKSIpfTsKICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgICBvdXRsaW5lOiBub25lOwogICAgfQoKICAgIC5wYWdlLWlucHV0OmZvY3VzIHsKICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgNjAlKSIsICJoc2woMjEzIDkzJSA2OCUpIil9OwogICAgfQoKICAgIC5wYWdlLXNlcGFyYXRvciB7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAxNiUgNjAlKSIsICJoc2woMjE1IDE2JSA1MCUpIil9OwogICAgfQoKICAgIC56b29tLWxldmVsIHsKICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICBmb250LXdlaWdodDogNTAwOwogICAgICBtaW4td2lkdGg6IDQ4cHg7CiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIH0KCiAgICAudmlld2VyLWNvbnRhaW5lciB7CiAgICAgIGZsZXg6IDE7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgbWluLWhlaWdodDogMDsKICAgIH0KCiAgICAuc2lkZWJhciB7CiAgICAgIHdpZHRoOiAyMDBweDsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgyMTUgMjAlIDE1JSkiKX07CiAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0IDMxJSA5MSUpIiwgImhzbCgyMTcgMjUlIDIyJSkiKX07CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIGhlaWdodDogMTAwJTsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIH0KCiAgICAuc2lkZWJhci1oZWFkZXIgewogICAgICBoZWlnaHQ6IDQwcHg7CiAgICAgIHBhZGRpbmc6IDAgMTJweDsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQgMzElIDkxJSkiLCAiaHNsKDIxNyAyNSUgMjIlKSIpfTsKICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICBmb250LXdlaWdodDogNjAwOwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDQ1JSkiLCAiaHNsKDIxNSAxNiUgNzUlKSIpfTsKICAgIH0KCiAgICAuc2lkZWJhci1jbG9zZSB7CiAgICAgIHdpZHRoOiAyNHB4OwogICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDE2JSA0NSUpIiwgImhzbCgyMTUgMTYlIDc1JSkiKX07CiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMgZWFzZTsKICAgIH0KCiAgICAuc2lkZWJhci1jbG9zZTpob3ZlciB7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0IDMxJSA5MiUpIiwgImhzbCgyMTcgMjUlIDIyJSkiKX07CiAgICB9CgogICAgLnNpZGViYXItY2xvc2UgZGVlcy1pY29uIHsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgfQoKICAgIC5zaWRlYmFyLWNvbnRlbnQgewogICAgICBmbGV4OiAxOwogICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgICBtaW4taGVpZ2h0OiAwOwogICAgfQoKICAgIC50aHVtYm5haWwgewogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICBib3JkZXI6IDJweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMTVzIGVhc2U7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NSUpIiwgImhzbCgyMTUgMjAlIDE4JSkiKX07CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgICAgLyogRGVmYXVsdCBBNCBhc3BlY3QgcmF0aW8gKDI5N21tIC8gMjEwbW0g4omIIDEuNDE0KSAqLwogICAgICBtaW4taGVpZ2h0OiBjYWxjKDE3NnB4ICogMS40MTQpOwogICAgfQoKICAgIC50aHVtYm5haWw6bGFzdC1jaGlsZCB7CiAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICB9CgogICAgLnRodW1ibmFpbDpob3ZlciB7CiAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQgMzElIDg2JSkiLCAiaHNsKDIxNyAyNSUgMzUlKSIpfTsKICAgIH0KCiAgICAudGh1bWJuYWlsLmFjdGl2ZSB7CiAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTcgOTElIDYwJSkiLCAiaHNsKDIxMyA5MyUgNjglKSIpfTsKICAgIH0KCiAgICAudGh1bWJuYWlsLWNhbnZhcyB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICBpbWFnZS1yZW5kZXJpbmc6IC13ZWJraXQtb3B0aW1pemUtY29udHJhc3Q7CiAgICAgIGltYWdlLXJlbmRlcmluZzogY3Jpc3AtZWRnZXM7CiAgICB9CgogICAgLnRodW1ibmFpbC1udW1iZXIgewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIGJvdHRvbTogNHB4OwogICAgICByaWdodDogNHB4OwogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjcpIiwgInJnYmEoMCwgMCwgMCwgMC44KSIpfTsKICAgICAgY29sb3I6IHdoaXRlOwogICAgICBmb250LXNpemU6IDExcHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIH0KCiAgICAudmlld2VyLW1haW4gewogICAgICBmbGV4OiAxOwogICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgIHNjcm9sbC1iZWhhdmlvcjogc21vb3RoOwogICAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgICBtaW4taGVpZ2h0OiAwOwogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB9CgogICAgLmxvYWRpbmctY29udGFpbmVyIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIGhlaWdodDogMTAwJTsKICAgICAgZ2FwOiAxNnB4OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDQ1JSkiLCAiaHNsKDIxNSAxNiUgNzUlKSIpfTsKICAgIH0KCiAgICAubG9hZGluZy1zcGlubmVyIHsKICAgICAgd2lkdGg6IDMycHg7CiAgICAgIGhlaWdodDogMzJweDsKICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICBib3JkZXI6IDNweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNCAzMSUgODYlKSIsICJoc2woMjE3IDI1JSAyOCUpIil9OwogICAgICBib3JkZXItdG9wLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgNjAlKSIsICJoc2woMjEzIDkzJSA2OCUpIil9OwogICAgICBhbmltYXRpb246IHNwaW4gMC44cyBsaW5lYXIgaW5maW5pdGU7CiAgICB9CgogICAgQGtleWZyYW1lcyBzcGluIHsKICAgICAgdG8gewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CiAgICAgIH0KICAgIH0KCiAgICAubG9hZGluZy10ZXh0IHsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICBmb250LXdlaWdodDogNTAwOwogICAgfQoKICAgIC5wYWdlcy1jb250YWluZXIgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBnYXA6IDIwcHg7CiAgICB9CgogICAgLnBhZ2Utd3JhcHBlciB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB3aWR0aDogMTAwJTsKICAgIH0KCiAgICAuY2FudmFzLWNvbnRhaW5lciB7CiAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICBib3gtc2hhZG93OiAwIDJweCAxMnB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMSkiLCAicmdiYSgwLCAwLCAwLCAwLjMpIil9OwogICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIH0KCiAgICAucGFnZS1jYW52YXMgewogICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgaW1hZ2UtcmVuZGVyaW5nOiAtd2Via2l0LW9wdGltaXplLWNvbnRyYXN0OwogICAgICBpbWFnZS1yZW5kZXJpbmc6IGNyaXNwLWVkZ2VzOwogICAgfQoKICAgIC5wZGYtdmlld2VyLndpdGgtc2lkZWJhciAudmlld2VyLW1haW4gewogICAgICBtYXJnaW4tbGVmdDogMDsKICAgIH0KICBgCl07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy1wZGYtdmlld2VyL2RlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW80ID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgcGFkZGluZzogNDBweDsKICAgICAgYmFja2dyb3VuZDogI2Y1ZjVmNTsKICAgIH0KCiAgICAuZGVtby1zZWN0aW9uIHsKICAgICAgbWFyZ2luLWJvdHRvbTogNDBweDsKICAgIH0KCiAgICBoMyB7CiAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIH0KCiAgICBkZWVzLXBkZi12aWV3ZXIgewogICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkOwogICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB9CgogICAgLnZpZXdlci10YWxsIHsKICAgICAgaGVpZ2h0OiA4MDBweDsKICAgIH0KCiAgICAudmlld2VyLWNvbXBhY3QgewogICAgICBoZWlnaHQ6IDUwMHB4OwogICAgfQogIDwvc3R5bGU+CgogIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgIDxoMz5GdWxsIEZlYXR1cmVkIFBERiBWaWV3ZXIgd2l0aCBUb29sYmFyPC9oMz4KICAgICAgPGRlZXMtcGRmLXZpZXdlcgogICAgICAgIGNsYXNzPSJ2aWV3ZXItdGFsbCIKICAgICAgICBwZGZVcmw9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9tb3ppbGxhL3BkZi5qcy9iYTJlZGVhZS93ZWIvY29tcHJlc3NlZC50cmFjZW1vbmtleS1wbGRpLTA5LnBkZiIKICAgICAgICBzaG93VG9vbGJhcj0idHJ1ZSIKICAgICAgICBzaG93U2lkZWJhcj0iZmFsc2UiCiAgICAgICAgaW5pdGlhbFpvb209InBhZ2UtZml0IgogICAgICA+PC9kZWVzLXBkZi12aWV3ZXI+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICA8aDM+UERGIFZpZXdlciB3aXRoIFNpZGViYXIgTmF2aWdhdGlvbjwvaDM+CiAgICAgIDxkZWVzLXBkZi12aWV3ZXIKICAgICAgICBjbGFzcz0idmlld2VyLXRhbGwiCiAgICAgICAgcGRmVXJsPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbW96aWxsYS9wZGYuanMvYmEyZWRlYWUvd2ViL2NvbXByZXNzZWQudHJhY2Vtb25rZXktcGxkaS0wOS5wZGYiCiAgICAgICAgc2hvd1Rvb2xiYXI9InRydWUiCiAgICAgICAgc2hvd1NpZGViYXI9InRydWUiCiAgICAgICAgaW5pdGlhbFpvb209InBhZ2Utd2lkdGgiCiAgICAgID48L2RlZXMtcGRmLXZpZXdlcj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgIDxoMz5Db21wYWN0IFZpZXdlciB3aXRob3V0IENvbnRyb2xzPC9oMz4KICAgICAgPGRlZXMtcGRmLXZpZXdlcgogICAgICAgIGNsYXNzPSJ2aWV3ZXItY29tcGFjdCIKICAgICAgICBwZGZVcmw9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9tb3ppbGxhL3BkZi5qcy9iYTJlZGVhZS9leGFtcGxlcy9sZWFybmluZy9oZWxsb3dvcmxkLnBkZiIKICAgICAgICBzaG93VG9vbGJhcj0iZmFsc2UiCiAgICAgICAgc2hvd1NpZGViYXI9ImZhbHNlIgogICAgICAgIGluaXRpYWxab29tPSJhdXRvIgogICAgICA+PC9kZWVzLXBkZi12aWV3ZXI+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXBkZi12aWV3ZXIvY29tcG9uZW50LmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfZGVlc19pY29uKCk7CnZhciBfX2VzRGVjb3JhdGU3MyA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNzQgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNQZGZWaWV3ZXIgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLXBkZi12aWV3ZXIiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9wZGZVcmxfZGVjb3JhdG9yczsKICBsZXQgX3BkZlVybF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BkZlVybF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW5pdGlhbFBhZ2VfZGVjb3JhdG9yczsKICBsZXQgX2luaXRpYWxQYWdlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW5pdGlhbFBhZ2VfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2luaXRpYWxab29tX2RlY29yYXRvcnM7CiAgbGV0IF9pbml0aWFsWm9vbV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2luaXRpYWxab29tX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93VG9vbGJhcl9kZWNvcmF0b3JzOwogIGxldCBfc2hvd1Rvb2xiYXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93VG9vbGJhcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1NpZGViYXJfZGVjb3JhdG9yczsKICBsZXQgX3Nob3dTaWRlYmFyX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1NpZGViYXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2N1cnJlbnRQYWdlX2RlY29yYXRvcnM7CiAgbGV0IF9jdXJyZW50UGFnZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2N1cnJlbnRQYWdlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90b3RhbFBhZ2VzX2RlY29yYXRvcnM7CiAgbGV0IF90b3RhbFBhZ2VzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdG90YWxQYWdlc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VycmVudFpvb21fZGVjb3JhdG9yczsKICBsZXQgX2N1cnJlbnRab29tX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VycmVudFpvb21fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xvYWRpbmdfZGVjb3JhdG9yczsKICBsZXQgX2xvYWRpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kb2N1bWVudElkX2RlY29yYXRvcnM7CiAgbGV0IF9kb2N1bWVudElkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZG9jdW1lbnRJZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGh1bWJuYWlsRGF0YV9kZWNvcmF0b3JzOwogIGxldCBfdGh1bWJuYWlsRGF0YV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RodW1ibmFpbERhdGFfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BhZ2VEYXRhX2RlY29yYXRvcnM7CiAgbGV0IF9wYWdlRGF0YV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BhZ2VEYXRhX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNQZGZWaWV3ZXIyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfcGRmVXJsX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfaW5pdGlhbFBhZ2VfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF9pbml0aWFsWm9vbV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3Nob3dUb29sYmFyX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3Nob3dTaWRlYmFyX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2N1cnJlbnRQYWdlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfdG90YWxQYWdlc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX2N1cnJlbnRab29tX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfbG9hZGluZ19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9kb2N1bWVudElkX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfdGh1bWJuYWlsRGF0YV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfcGFnZURhdGFfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX19lc0RlY29yYXRlNzModGhpcywgbnVsbCwgX3BkZlVybF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwZGZVcmwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInBkZlVybCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5wZGZVcmwsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnBkZlVybCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wZGZVcmxfaW5pdGlhbGl6ZXJzLCBfcGRmVXJsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzModGhpcywgbnVsbCwgX2luaXRpYWxQYWdlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImluaXRpYWxQYWdlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpbml0aWFsUGFnZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pbml0aWFsUGFnZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaW5pdGlhbFBhZ2UgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaW5pdGlhbFBhZ2VfaW5pdGlhbGl6ZXJzLCBfaW5pdGlhbFBhZ2VfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Myh0aGlzLCBudWxsLCBfaW5pdGlhbFpvb21fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaW5pdGlhbFpvb20iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImluaXRpYWxab29tIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmluaXRpYWxab29tLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pbml0aWFsWm9vbSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pbml0aWFsWm9vbV9pbml0aWFsaXplcnMsIF9pbml0aWFsWm9vbV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTczKHRoaXMsIG51bGwsIF9zaG93VG9vbGJhcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93VG9vbGJhciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd1Rvb2xiYXIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2hvd1Rvb2xiYXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dUb29sYmFyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dUb29sYmFyX2luaXRpYWxpemVycywgX3Nob3dUb29sYmFyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzModGhpcywgbnVsbCwgX3Nob3dTaWRlYmFyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dTaWRlYmFyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93U2lkZWJhciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93U2lkZWJhciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd1NpZGViYXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd1NpZGViYXJfaW5pdGlhbGl6ZXJzLCBfc2hvd1NpZGViYXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Myh0aGlzLCBudWxsLCBfY3VycmVudFBhZ2VfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY3VycmVudFBhZ2UiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImN1cnJlbnRQYWdlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmN1cnJlbnRQYWdlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jdXJyZW50UGFnZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jdXJyZW50UGFnZV9pbml0aWFsaXplcnMsIF9jdXJyZW50UGFnZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTczKHRoaXMsIG51bGwsIF90b3RhbFBhZ2VzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRvdGFsUGFnZXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRvdGFsUGFnZXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudG90YWxQYWdlcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudG90YWxQYWdlcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90b3RhbFBhZ2VzX2luaXRpYWxpemVycywgX3RvdGFsUGFnZXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Myh0aGlzLCBudWxsLCBfY3VycmVudFpvb21fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY3VycmVudFpvb20iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImN1cnJlbnRab29tIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmN1cnJlbnRab29tLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jdXJyZW50Wm9vbSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jdXJyZW50Wm9vbV9pbml0aWFsaXplcnMsIF9jdXJyZW50Wm9vbV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTczKHRoaXMsIG51bGwsIF9sb2FkaW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxvYWRpbmciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImxvYWRpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubG9hZGluZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubG9hZGluZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9sb2FkaW5nX2luaXRpYWxpemVycywgX2xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Myh0aGlzLCBudWxsLCBfZG9jdW1lbnRJZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkb2N1bWVudElkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkb2N1bWVudElkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRvY3VtZW50SWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmRvY3VtZW50SWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZG9jdW1lbnRJZF9pbml0aWFsaXplcnMsIF9kb2N1bWVudElkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzModGhpcywgbnVsbCwgX3RodW1ibmFpbERhdGFfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGh1bWJuYWlsRGF0YSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGh1bWJuYWlsRGF0YSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50aHVtYm5haWxEYXRhLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50aHVtYm5haWxEYXRhID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3RodW1ibmFpbERhdGFfaW5pdGlhbGl6ZXJzLCBfdGh1bWJuYWlsRGF0YV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTczKHRoaXMsIG51bGwsIF9wYWdlRGF0YV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwYWdlRGF0YSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicGFnZURhdGEiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucGFnZURhdGEsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnBhZ2VEYXRhID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3BhZ2VEYXRhX2luaXRpYWxpemVycywgX3BhZ2VEYXRhX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzMobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzUGRmVmlld2VyMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW80OwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIk1lZGlhIiwgIlBERiJdOwogICAgc3RhdGljIHN0eWxlcyA9IHZpZXdlclN0eWxlczsKICAgICNwZGZVcmxfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNzQodGhpcywgX3BkZlVybF9pbml0aWFsaXplcnMsICIiKTsKICAgIGdldCBwZGZVcmwoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwZGZVcmxfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwZGZVcmwodmFsdWUyKSB7CiAgICAgIHRoaXMuI3BkZlVybF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2luaXRpYWxQYWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3NCh0aGlzLCBfcGRmVXJsX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3NCh0aGlzLCBfaW5pdGlhbFBhZ2VfaW5pdGlhbGl6ZXJzLCAxKSk7CiAgICBnZXQgaW5pdGlhbFBhZ2UoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpbml0aWFsUGFnZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGluaXRpYWxQYWdlKHZhbHVlMikgewogICAgICB0aGlzLiNpbml0aWFsUGFnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2luaXRpYWxab29tX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3NCh0aGlzLCBfaW5pdGlhbFBhZ2VfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc0KHRoaXMsIF9pbml0aWFsWm9vbV9pbml0aWFsaXplcnMsICJhdXRvIikpOwogICAgZ2V0IGluaXRpYWxab29tKCkgewogICAgICByZXR1cm4gdGhpcy4jaW5pdGlhbFpvb21fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpbml0aWFsWm9vbSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaW5pdGlhbFpvb21fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93VG9vbGJhcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzQodGhpcywgX2luaXRpYWxab29tX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3NCh0aGlzLCBfc2hvd1Rvb2xiYXJfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgc2hvd1Rvb2xiYXIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93VG9vbGJhcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dUb29sYmFyKHZhbHVlMikgewogICAgICB0aGlzLiNzaG93VG9vbGJhcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dTaWRlYmFyX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3NCh0aGlzLCBfc2hvd1Rvb2xiYXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc0KHRoaXMsIF9zaG93U2lkZWJhcl9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgc2hvd1NpZGViYXIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93U2lkZWJhcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dTaWRlYmFyKHZhbHVlMikgewogICAgICB0aGlzLiNzaG93U2lkZWJhcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2N1cnJlbnRQYWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3NCh0aGlzLCBfc2hvd1NpZGViYXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc0KHRoaXMsIF9jdXJyZW50UGFnZV9pbml0aWFsaXplcnMsIDEpKTsKICAgIGdldCBjdXJyZW50UGFnZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRQYWdlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY3VycmVudFBhZ2UodmFsdWUyKSB7CiAgICAgIHRoaXMuI2N1cnJlbnRQYWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdG90YWxQYWdlc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzQodGhpcywgX2N1cnJlbnRQYWdlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3NCh0aGlzLCBfdG90YWxQYWdlc19pbml0aWFsaXplcnMsIDEpKTsKICAgIGdldCB0b3RhbFBhZ2VzKCkgewogICAgICByZXR1cm4gdGhpcy4jdG90YWxQYWdlc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRvdGFsUGFnZXModmFsdWUyKSB7CiAgICAgIHRoaXMuI3RvdGFsUGFnZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjdXJyZW50Wm9vbV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzQodGhpcywgX3RvdGFsUGFnZXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc0KHRoaXMsIF9jdXJyZW50Wm9vbV9pbml0aWFsaXplcnMsIDEpKTsKICAgIGdldCBjdXJyZW50Wm9vbSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRab29tX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY3VycmVudFpvb20odmFsdWUyKSB7CiAgICAgIHRoaXMuI2N1cnJlbnRab29tX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzQodGhpcywgX2N1cnJlbnRab29tX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3NCh0aGlzLCBfbG9hZGluZ19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgbG9hZGluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsb2FkaW5nKHZhbHVlMikgewogICAgICB0aGlzLiNsb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZG9jdW1lbnRJZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzQodGhpcywgX2xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc0KHRoaXMsIF9kb2N1bWVudElkX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBkb2N1bWVudElkKCkgewogICAgICByZXR1cm4gdGhpcy4jZG9jdW1lbnRJZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGRvY3VtZW50SWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2RvY3VtZW50SWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN0aHVtYm5haWxEYXRhX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3NCh0aGlzLCBfZG9jdW1lbnRJZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzQodGhpcywgX3RodW1ibmFpbERhdGFfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IHRodW1ibmFpbERhdGEoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0aHVtYm5haWxEYXRhX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdGh1bWJuYWlsRGF0YSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdGh1bWJuYWlsRGF0YV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3BhZ2VEYXRhX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3NCh0aGlzLCBfdGh1bWJuYWlsRGF0YV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzQodGhpcywgX3BhZ2VEYXRhX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBwYWdlRGF0YSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3BhZ2VEYXRhX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcGFnZURhdGEodmFsdWUyKSB7CiAgICAgIHRoaXMuI3BhZ2VEYXRhX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBwZGZEb2N1bWVudCA9IF9fcnVuSW5pdGlhbGl6ZXJzNzQodGhpcywgX3BhZ2VEYXRhX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIHJlbmRlclN0YXRlID0gImlkbGUiOwogICAgcmVuZGVyQWJvcnRDb250cm9sbGVyID0gbnVsbDsKICAgIHBhZ2VSZW5kZXJpbmcgPSBmYWxzZTsKICAgIHBhZ2VOdW1QZW5kaW5nID0gbnVsbDsKICAgIGN1cnJlbnRSZW5kZXJUYXNrID0gbnVsbDsKICAgIGN1cnJlbnRSZW5kZXJQcm9taXNlID0gbnVsbDsKICAgIHRodW1ibmFpbFJlbmRlclRhc2tzID0gW107CiAgICBwYWdlUmVuZGVyVGFza3MgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgY2FudmFzOwogICAgY3R4OwogICAgdmlld2VyTWFpbiA9IG51bGw7CiAgICByZXNpemVPYnNlcnZlcjsKICAgIGludGVyc2VjdGlvbk9ic2VydmVyOwogICAgc2Nyb2xsVGhyb3R0bGVUaW1lb3V0OwogICAgdmlld3BvcnREaW1lbnNpb25zID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07CiAgICB2aWV3cG9ydE1vZGUgPSAiYXV0byI7CiAgICBNQU5VQUxfTUlOX1pPT00gPSAwLjU7CiAgICBNQU5VQUxfTUFYX1pPT00gPSAzOwogICAgQUJTT0xVVEVfTUlOX1pPT00gPSAwLjE7CiAgICBBQlNPTFVURV9NQVhfWk9PTSA9IDQ7CiAgICBQQUdFX0dBUCA9IDIwOwogICAgUkVOREVSX0JVRkZFUiA9IDM7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgIH0KICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJwZGYtdmlld2VyICR7dGhpcy5zaG93U2lkZWJhciA/ICJ3aXRoLXNpZGViYXIiIDogIiJ9Ij4KICAgICAgICAke3RoaXMuc2hvd1Rvb2xiYXIgPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sYmFyLWdyb3VwIj4KICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICBjbGFzcz0idG9vbGJhci1idXR0b24iCiAgICAgICAgICAgICAgICBAY2xpY2s9JHt0aGlzLnByZXZpb3VzUGFnZX0KICAgICAgICAgICAgICAgID9kaXNhYmxlZD0ke3RoaXMuY3VycmVudFBhZ2UgPD0gMX0KICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpDaGV2cm9uTGVmdCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnZS1pbmZvIj4KICAgICAgICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICAgICAgICB0eXBlPSJudW1iZXIiCiAgICAgICAgICAgICAgICAgIG1pbj0iMSIKICAgICAgICAgICAgICAgICAgbWF4PSIke3RoaXMudG90YWxQYWdlc30iCiAgICAgICAgICAgICAgICAgIC52YWx1ZT0ke1N0cmluZyh0aGlzLmN1cnJlbnRQYWdlKX0KICAgICAgICAgICAgICAgICAgQGNoYW5nZT0ke3RoaXMuaGFuZGxlUGFnZUlucHV0fQogICAgICAgICAgICAgICAgICBjbGFzcz0icGFnZS1pbnB1dCIKICAgICAgICAgICAgICAgIC8+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icGFnZS1zZXBhcmF0b3IiPi88L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icGFnZS10b3RhbCI+JHt0aGlzLnRvdGFsUGFnZXN9PC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgIGNsYXNzPSJ0b29sYmFyLWJ1dHRvbiIKICAgICAgICAgICAgICAgIEBjbGljaz0ke3RoaXMubmV4dFBhZ2V9CiAgICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHt0aGlzLmN1cnJlbnRQYWdlID49IHRoaXMudG90YWxQYWdlc30KICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpDaGV2cm9uUmlnaHQiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItZ3JvdXAiPgogICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgIGNsYXNzPSJ0b29sYmFyLWJ1dHRvbiIKICAgICAgICAgICAgICAgIEBjbGljaz0ke3RoaXMuem9vbU91dH0KICAgICAgICAgICAgICAgID9kaXNhYmxlZD0keyF0aGlzLmNhblpvb21PdXR9CiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6Wm9vbU91dCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgY2xhc3M9InRvb2xiYXItYnV0dG9uIgogICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy5yZXNldFpvb219CiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Inpvb20tbGV2ZWwiPiR7TWF0aC5yb3VuZCh0aGlzLmN1cnJlbnRab29tICogMTAwKX0lPC9zcGFuPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgIGNsYXNzPSJ0b29sYmFyLWJ1dHRvbiIKICAgICAgICAgICAgICAgIEBjbGljaz0ke3RoaXMuem9vbUlufQogICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7IXRoaXMuY2FuWm9vbUlufQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOlpvb21JbiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9vbGJhci1ncm91cCI+CiAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgY2xhc3M9InRvb2xiYXItYnV0dG9uIgogICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy5maXRUb1BhZ2V9CiAgICAgICAgICAgICAgICB0aXRsZT0iRml0IHRvIHBhZ2UiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6TWF4aW1pemUiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgIGNsYXNzPSJ0b29sYmFyLWJ1dHRvbiIKICAgICAgICAgICAgICAgIEBjbGljaz0ke3RoaXMuZml0VG9XaWR0aH0KICAgICAgICAgICAgICAgIHRpdGxlPSJGaXQgdG8gd2lkdGgiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6QXJyb3dMZWZ0UmlnaHQiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItZ3JvdXAgdG9vbGJhci1ncm91cC0tZW5kIj4KICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICBjbGFzcz0idG9vbGJhci1idXR0b24iCiAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNob3dTaWRlYmFyID0gIXRoaXMuc2hvd1NpZGViYXJ9CiAgICAgICAgICAgICAgICB0aXRsZT0iJHt0aGlzLnNob3dTaWRlYmFyID8gIkhpZGUgdGh1bWJuYWlscyIgOiAiU2hvdyB0aHVtYm5haWxzIn0iCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSIke3RoaXMuc2hvd1NpZGViYXIgPyAibHVjaWRlOlNpZGViYXJDbG9zZSIgOiAibHVjaWRlOlNpZGViYXIifSI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgY2xhc3M9InRvb2xiYXItYnV0dG9uIgogICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy5kb3dubG9hZFBkZn0KICAgICAgICAgICAgICAgIHRpdGxlPSJEb3dubG9hZCIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpEb3dubG9hZCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgY2xhc3M9InRvb2xiYXItYnV0dG9uIgogICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy5wcmludFBkZn0KICAgICAgICAgICAgICAgIHRpdGxlPSJQcmludCIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpQcmludGVyIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgIDogIiJ9CgogICAgICAgIDxkaXYgY2xhc3M9InZpZXdlci1jb250YWluZXIiPgogICAgICAgICAgJHt0aGlzLnNob3dTaWRlYmFyID8gYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxzcGFuPlBhZ2VzPC9zcGFuPgogICAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgICBjbGFzcz0ic2lkZWJhci1jbG9zZSIKICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5zaG93U2lkZWJhciA9IGZhbHNlfQogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpYIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItY29udGVudCI+CiAgICAgICAgICAgICAgICAke2RpcmVjdGl2ZXNfZXhwb3J0cy5rZXllZCh0aGlzLmRvY3VtZW50SWQsIGIyYAogICAgICAgICAgICAgICAgICAke2RpcmVjdGl2ZXNfZXhwb3J0cy5yZXBlYXQodGhpcy50aHVtYm5haWxEYXRhLCAoaXRlbSkgPT4gaXRlbS5wYWdlLCAoaXRlbSkgPT4gYjJgCiAgICAgICAgICAgICAgICAgICAgICA8ZGl2CiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJ0aHVtYm5haWwgJHt0aGlzLmN1cnJlbnRQYWdlID09PSBpdGVtLnBhZ2UgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1wYWdlPSIke2l0ZW0ucGFnZX0iCiAgICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz0ke3RoaXMuaGFuZGxlVGh1bWJuYWlsQ2xpY2t9CiAgICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYW52YXMgY2xhc3M9InRodW1ibmFpbC1jYW52YXMiIGRhdGEtcGFnZT0iJHtpdGVtLnBhZ2V9Ij48L2NhbnZhcz4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRodW1ibmFpbC1udW1iZXIiPiR7aXRlbS5wYWdlfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIGApfQogICAgICAgICAgICAgICAgYCl9CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYCA6ICIifQoKICAgICAgICAgIDxkaXYgY2xhc3M9InZpZXdlci1tYWluIiBAc2Nyb2xsPSR7dGhpcy5oYW5kbGVTY3JvbGx9PgogICAgICAgICAgICAke3RoaXMubG9hZGluZyA/IGIyYAogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxvYWRpbmctY29udGFpbmVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxvYWRpbmctc3Bpbm5lciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2FkaW5nLXRleHQiPkxvYWRpbmcgUERGLi4uPC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIGAgOiBiMmAKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlcy1jb250YWluZXIiPgogICAgICAgICAgICAgICAgJHtkaXJlY3RpdmVzX2V4cG9ydHMucmVwZWF0KHRoaXMucGFnZURhdGEsIChpdGVtKSA9PiBpdGVtLnBhZ2UsIChpdGVtKSA9PiBiMmAKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXdyYXBwZXIiIGRhdGEtcGFnZT0iJHtpdGVtLnBhZ2V9Ij4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhbnZhcy1jb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzIGNsYXNzPSJwYWdlLWNhbnZhcyIgZGF0YS1wYWdlPSIke2l0ZW0ucGFnZX0iPjwvY2FudmFzPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIGApfQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlOwogICAgICB0aGlzLmVuc3VyZVZpZXdlclJlZnMoKTsKICAgICAgaWYgKHRoaXMucGRmVXJsKSB7CiAgICAgICAgdGhpcy5kb2N1bWVudElkID0gYCR7dGhpcy5wZGZVcmx9LSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpfWA7CiAgICAgICAgYXdhaXQgdGhpcy5sb2FkUGRmKCk7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7CiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSB2b2lkIDA7CiAgICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTsKICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlciA9IHZvaWQgMDsKICAgICAgaWYgKHRoaXMuc2Nyb2xsVGhyb3R0bGVUaW1lb3V0KSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsVGhyb3R0bGVUaW1lb3V0KTsKICAgICAgICB0aGlzLnNjcm9sbFRocm90dGxlVGltZW91dCA9IHZvaWQgMDsKICAgICAgfQogICAgICB0aGlzLnJlbmRlclN0YXRlID0gImRpc3Bvc2VkIjsKICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwRG9jdW1lbnQoKTsKICAgICAgdGhpcy5jYW52YXMgPSB2b2lkIDA7CiAgICAgIHRoaXMuY3R4ID0gdm9pZCAwOwogICAgfQogICAgYXN5bmMgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgICBzdXBlci51cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygicGRmVXJsIikgJiYgdGhpcy5wZGZVcmwpIHsKICAgICAgICBjb25zdCBwcmV2aW91c1VybCA9IGNoYW5nZWRQcm9wZXJ0aWVzLmdldCgicGRmVXJsIik7CiAgICAgICAgaWYgKHByZXZpb3VzVXJsKSB7CiAgICAgICAgICBQZGZNYW5hZ2VyLnJlbGVhc2VEb2N1bWVudChwcmV2aW91c1VybCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuZG9jdW1lbnRJZCA9IGAke3RoaXMucGRmVXJsfS0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKX1gOwogICAgICAgIGF3YWl0IHRoaXMubG9hZFBkZigpOwogICAgICB9CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoInNob3dTaWRlYmFyIikgJiYgdGhpcy5zaG93U2lkZWJhciAmJiB0aGlzLnBkZkRvY3VtZW50KSB7CiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZTIpKTsKICAgICAgICB0aGlzLnRodW1ibmFpbERhdGEuZm9yRWFjaCgodGh1bWIpID0+IHRodW1iLnJlbmRlcmVkID0gZmFsc2UpOwogICAgICAgIGF3YWl0IHRoaXMucmVuZGVyVGh1bWJuYWlscygpOwogICAgICAgIHRoaXMuc2V0dXBJbnRlcnNlY3Rpb25PYnNlcnZlcigpOwogICAgICAgIHRoaXMuc2Nyb2xsVGh1bWJuYWlsSW50b1ZpZXcodGhpcy5jdXJyZW50UGFnZSk7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGxvYWRQZGYoKSB7CiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7CiAgICAgIHRoaXMucmVuZGVyU3RhdGUgPSAibG9hZGluZyI7CiAgICAgIHRyeSB7CiAgICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwRG9jdW1lbnQoKTsKICAgICAgICB0aGlzLnJlbmRlckFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKICAgICAgICBjb25zdCBzaWduYWwgPSB0aGlzLnJlbmRlckFib3J0Q29udHJvbGxlci5zaWduYWw7CiAgICAgICAgdGhpcy5wZGZEb2N1bWVudCA9IGF3YWl0IFBkZk1hbmFnZXIubG9hZERvY3VtZW50KHRoaXMucGRmVXJsKTsKICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy50b3RhbFBhZ2VzID0gdGhpcy5wZGZEb2N1bWVudC5udW1QYWdlczsKICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5pbml0aWFsUGFnZTsKICAgICAgICB0aGlzLnJlc29sdmVJbml0aWFsVmlld3BvcnRNb2RlKCk7CiAgICAgICAgdGhpcy50aHVtYm5haWxEYXRhID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdGhpcy50b3RhbFBhZ2VzIH0sIChfNCwgaTExKSA9PiAoewogICAgICAgICAgcGFnZTogaTExICsgMSwKICAgICAgICAgIHJlbmRlcmVkOiBmYWxzZQogICAgICAgIH0pKTsKICAgICAgICB0aGlzLnBhZ2VEYXRhID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdGhpcy50b3RhbFBhZ2VzIH0sIChfNCwgaTExKSA9PiAoewogICAgICAgICAgcGFnZTogaTExICsgMSwKICAgICAgICAgIHJlbmRlcmVkOiBmYWxzZSwKICAgICAgICAgIHJlbmRlcmluZzogZmFsc2UKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgICB0aGlzLmVuc3VyZVZpZXdlclJlZnMoKTsKICAgICAgICB0aGlzLnNldHVwSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKTsKICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShyZXNvbHZlMikpOwogICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkKICAgICAgICAgIHJldHVybjsKICAgICAgICB0aGlzLnJlbmRlclN0YXRlID0gInJlbmRlcmluZy1tYWluIjsKICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclZpc2libGVQYWdlcygpOwogICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkKICAgICAgICAgIHJldHVybjsKICAgICAgICBpZiAodGhpcy5pbml0aWFsUGFnZSA+IDEpIHsKICAgICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsVG9QYWdlKHRoaXMuaW5pdGlhbFBhZ2UsIGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuc2hvd1NpZGViYXIpIHsKICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7CiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShyZXNvbHZlMikpOwogICAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclRodW1ibmFpbHMoKTsKICAgICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLnJlbmRlclN0YXRlID0gInJlbmRlcmVkIjsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJFcnJvciBsb2FkaW5nIFBERjoiLCBlcnJvcik7CiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5yZW5kZXJTdGF0ZSA9ICJlcnJvciI7CiAgICAgIH0KICAgIH0KICAgIHNldHVwSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKSB7CiAgICAgIGlmICh0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyKSB7CiAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgIH0KICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZW50cmllcykgPT4gewogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykgewogICAgICAgICAgY29uc3QgcGFnZVdyYXBwZXIgPSBlbnRyeS50YXJnZXQ7CiAgICAgICAgICBjb25zdCBwYWdlTnVtID0gcGFyc2VJbnQocGFnZVdyYXBwZXIuZGF0YXNldC5wYWdlIHx8ICIxIik7CiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHsKICAgICAgICAgICAgdGhpcy5yZW5kZXJQYWdlSWZOZWVkZWQocGFnZU51bSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LCB7CiAgICAgICAgcm9vdDogdGhpcy52aWV3ZXJNYWluLAogICAgICAgIHJvb3RNYXJnaW46IGAke3RoaXMuUkVOREVSX0JVRkZFUiAqIDEwMH1weCAwcHhgLAogICAgICAgIHRocmVzaG9sZDogMC4wMQogICAgICB9KTsKICAgICAgY29uc3QgcGFnZVdyYXBwZXJzID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yQWxsKCIucGFnZS13cmFwcGVyIik7CiAgICAgIGlmIChwYWdlV3JhcHBlcnMpIHsKICAgICAgICBwYWdlV3JhcHBlcnMuZm9yRWFjaCgod3JhcHBlcikgPT4gewogICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlcj8ub2JzZXJ2ZSh3cmFwcGVyKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgYXN5bmMgcmVuZGVyVmlzaWJsZVBhZ2VzKCkgewogICAgICBpZiAoIXRoaXMudmlld2VyTWFpbikKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGNsaWVudEhlaWdodCA9IHRoaXMudmlld2VyTWFpbi5jbGllbnRIZWlnaHQ7CiAgICAgIGZvciAoY29uc3QgcGFnZUluZm8gb2YgdGhpcy5wYWdlRGF0YSkgewogICAgICAgIGNvbnN0IHBhZ2VXcmFwcGVyID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKGAucGFnZS13cmFwcGVyW2RhdGEtcGFnZT0iJHtwYWdlSW5mby5wYWdlfSJdYCk7CiAgICAgICAgaWYgKCFwYWdlV3JhcHBlcikKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNvbnN0IHJlY3QgPSBwYWdlV3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBjb25zdCB2aWV3ZXJSZWN0ID0gdGhpcy52aWV3ZXJNYWluLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGNvbnN0IHJlbGF0aXZlVG9wID0gcmVjdC50b3AgLSB2aWV3ZXJSZWN0LnRvcDsKICAgICAgICBjb25zdCByZWxhdGl2ZUJvdHRvbSA9IHJlbGF0aXZlVG9wICsgcmVjdC5oZWlnaHQ7CiAgICAgICAgY29uc3QgYnVmZmVyMiA9IHRoaXMuUkVOREVSX0JVRkZFUiAqIGNsaWVudEhlaWdodDsKICAgICAgICBpZiAocmVsYXRpdmVCb3R0b20gPj0gLWJ1ZmZlcjIgJiYgcmVsYXRpdmVUb3AgPD0gY2xpZW50SGVpZ2h0ICsgYnVmZmVyMikgewogICAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJQYWdlSWZOZWVkZWQocGFnZUluZm8ucGFnZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBhc3luYyByZW5kZXJQYWdlSWZOZWVkZWQocGFnZU51bSkgewogICAgICBjb25zdCBwYWdlSW5mbyA9IHRoaXMucGFnZURhdGEuZmluZCgocDcpID0+IHA3LnBhZ2UgPT09IHBhZ2VOdW0pOwogICAgICBpZiAoIXBhZ2VJbmZvIHx8IHBhZ2VJbmZvLnJlbmRlcmVkIHx8IHBhZ2VJbmZvLnJlbmRlcmluZykKICAgICAgICByZXR1cm47CiAgICAgIHBhZ2VJbmZvLnJlbmRlcmluZyA9IHRydWU7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKGAucGFnZS1jYW52YXNbZGF0YS1wYWdlPSIke3BhZ2VOdW19Il1gKTsKICAgICAgICBpZiAoIWNhbnZhcykgewogICAgICAgICAgcGFnZUluZm8ucmVuZGVyaW5nID0gZmFsc2U7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCB0aGlzLnBkZkRvY3VtZW50LmdldFBhZ2UocGFnZU51bSk7CiAgICAgICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLmNvbXB1dGVWaWV3cG9ydChwYWdlKTsKICAgICAgICBjb25zdCBkcHIgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxOwogICAgICAgIGNhbnZhcy53aWR0aCA9IE1hdGguZmxvb3Iodmlld3BvcnQud2lkdGggKiBkcHIpOwogICAgICAgIGNhbnZhcy5oZWlnaHQgPSBNYXRoLmZsb29yKHZpZXdwb3J0LmhlaWdodCAqIGRwcik7CiAgICAgICAgY2FudmFzLnN0eWxlLndpZHRoID0gYCR7dmlld3BvcnQud2lkdGh9cHhgOwogICAgICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBgJHt2aWV3cG9ydC5oZWlnaHR9cHhgOwogICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgIGlmICghY3R4KSB7CiAgICAgICAgICBwYWdlLmNsZWFudXA/LigpOwogICAgICAgICAgcGFnZUluZm8ucmVuZGVyaW5nID0gZmFsc2U7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGN0eC5zY2FsZShkcHIsIGRwcik7CiAgICAgICAgY29uc3QgcmVuZGVyQ29udGV4dCA9IHsKICAgICAgICAgIGNhbnZhc0NvbnRleHQ6IGN0eCwKICAgICAgICAgIHZpZXdwb3J0CiAgICAgICAgfTsKICAgICAgICBjb25zdCByZW5kZXJUYXNrID0gcGFnZS5yZW5kZXIocmVuZGVyQ29udGV4dCk7CiAgICAgICAgdGhpcy5wYWdlUmVuZGVyVGFza3Muc2V0KHBhZ2VOdW0sIHJlbmRlclRhc2spOwogICAgICAgIGF3YWl0IHJlbmRlclRhc2sucHJvbWlzZTsKICAgICAgICBwYWdlLmNsZWFudXA/LigpOwogICAgICAgIHBhZ2VJbmZvLnJlbmRlcmVkID0gdHJ1ZTsKICAgICAgICBwYWdlSW5mby5yZW5kZXJpbmcgPSBmYWxzZTsKICAgICAgICB0aGlzLnBhZ2VSZW5kZXJUYXNrcy5kZWxldGUocGFnZU51bSk7CiAgICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCJwYWdlRGF0YSIpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGlmIChlcnJvcj8ubmFtZSAhPT0gIlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiIpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHJlbmRlcmluZyBwYWdlICR7cGFnZU51bX06YCwgZXJyb3IpOwogICAgICAgIH0KICAgICAgICBwYWdlSW5mby5yZW5kZXJpbmcgPSBmYWxzZTsKICAgICAgICB0aGlzLnBhZ2VSZW5kZXJUYXNrcy5kZWxldGUocGFnZU51bSk7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZVNjcm9sbCA9ICgpID0+IHsKICAgICAgaWYgKHRoaXMuc2Nyb2xsVGhyb3R0bGVUaW1lb3V0KSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsVGhyb3R0bGVUaW1lb3V0KTsKICAgICAgfQogICAgICB0aGlzLnNjcm9sbFRocm90dGxlVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRQYWdlKCk7CiAgICAgICAgdGhpcy5yZW5kZXJWaXNpYmxlUGFnZXMoKTsKICAgICAgfSwgNTApOwogICAgfTsKICAgIHVwZGF0ZUN1cnJlbnRQYWdlKCkgewogICAgICBpZiAoIXRoaXMudmlld2VyTWFpbikKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IHRoaXMudmlld2VyTWFpbi5zY3JvbGxUb3A7CiAgICAgIGNvbnN0IGNsaWVudEhlaWdodCA9IHRoaXMudmlld2VyTWFpbi5jbGllbnRIZWlnaHQ7CiAgICAgIGNvbnN0IGNlbnRlclkgPSBzY3JvbGxUb3AgKyBjbGllbnRIZWlnaHQgLyAyOwogICAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCB0aGlzLnBhZ2VEYXRhLmxlbmd0aDsgaTExKyspIHsKICAgICAgICBjb25zdCBwYWdlV3JhcHBlciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihgLnBhZ2Utd3JhcHBlcltkYXRhLXBhZ2U9IiR7aTExICsgMX0iXWApOwogICAgICAgIGlmICghcGFnZVdyYXBwZXIpCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjb25zdCByZWN0ID0gcGFnZVdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgY29uc3Qgdmlld2VyUmVjdCA9IHRoaXMudmlld2VyTWFpbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBjb25zdCByZWxhdGl2ZVRvcCA9IHJlY3QudG9wIC0gdmlld2VyUmVjdC50b3AgKyBzY3JvbGxUb3A7CiAgICAgICAgY29uc3QgcmVsYXRpdmVCb3R0b20gPSByZWxhdGl2ZVRvcCArIHJlY3QuaGVpZ2h0OwogICAgICAgIGlmIChjZW50ZXJZID49IHJlbGF0aXZlVG9wICYmIGNlbnRlclkgPD0gcmVsYXRpdmVCb3R0b20pIHsKICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlICE9PSBpMTEgKyAxKSB7CiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBpMTEgKyAxOwogICAgICAgICAgICBpZiAodGhpcy5zaG93U2lkZWJhcikgewogICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGh1bWJuYWlsSW50b1ZpZXcoaTExICsgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgc2Nyb2xsVGh1bWJuYWlsSW50b1ZpZXcocGFnZU51bSkgewogICAgICBjb25zdCB0aHVtYm5haWwgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoYC50aHVtYm5haWxbZGF0YS1wYWdlPSIke3BhZ2VOdW19Il1gKTsKICAgICAgY29uc3Qgc2lkZWJhckNvbnRlbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5zaWRlYmFyLWNvbnRlbnQiKTsKICAgICAgaWYgKHRodW1ibmFpbCAmJiBzaWRlYmFyQ29udGVudCkgewogICAgICAgIGNvbnN0IHRodW1ibmFpbFJlY3QgPSB0aHVtYm5haWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgY29uc3Qgc2lkZWJhclJlY3QgPSBzaWRlYmFyQ29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBjb25zdCBpc0Fib3ZlID0gdGh1bWJuYWlsUmVjdC50b3AgPCBzaWRlYmFyUmVjdC50b3A7CiAgICAgICAgY29uc3QgaXNCZWxvdyA9IHRodW1ibmFpbFJlY3QuYm90dG9tID4gc2lkZWJhclJlY3QuYm90dG9tOwogICAgICAgIGlmIChpc0Fib3ZlIHx8IGlzQmVsb3cpIHsKICAgICAgICAgIGNvbnN0IHRodW1ibmFpbE9mZnNldCA9IHRodW1ibmFpbC5vZmZzZXRUb3A7CiAgICAgICAgICBjb25zdCB0aHVtYm5haWxIZWlnaHQgPSB0aHVtYm5haWwub2Zmc2V0SGVpZ2h0OwogICAgICAgICAgY29uc3Qgc2lkZWJhckhlaWdodCA9IHNpZGViYXJDb250ZW50LmNsaWVudEhlaWdodDsKICAgICAgICAgIGNvbnN0IHRhcmdldFNjcm9sbFRvcCA9IHRodW1ibmFpbE9mZnNldCAtIHNpZGViYXJIZWlnaHQgLyAyICsgdGh1bWJuYWlsSGVpZ2h0IC8gMjsKICAgICAgICAgIHNpZGViYXJDb250ZW50LnNjcm9sbFRvKHsKICAgICAgICAgICAgdG9wOiBNYXRoLm1heCgwLCB0YXJnZXRTY3JvbGxUb3ApLAogICAgICAgICAgICBiZWhhdmlvcjogInNtb290aCIKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXN5bmMgc2Nyb2xsVG9QYWdlKHBhZ2VOdW0sIHNtb290aCA9IHRydWUpIHsKICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgY29uc3QgcGFnZVdyYXBwZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoYC5wYWdlLXdyYXBwZXJbZGF0YS1wYWdlPSIke3BhZ2VOdW19Il1gKTsKICAgICAgaWYgKHBhZ2VXcmFwcGVyICYmIHRoaXMudmlld2VyTWFpbikgewogICAgICAgIGNvbnN0IHBhZ2VSZWN0ID0gcGFnZVdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgY29uc3Qgdmlld2VyUmVjdCA9IHRoaXMudmlld2VyTWFpbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBjb25zdCBjdXJyZW50U2Nyb2xsVG9wID0gdGhpcy52aWV3ZXJNYWluLnNjcm9sbFRvcDsKICAgICAgICBjb25zdCB0YXJnZXRTY3JvbGxUb3AgPSBjdXJyZW50U2Nyb2xsVG9wICsgKHBhZ2VSZWN0LnRvcCAtIHZpZXdlclJlY3QudG9wKSAtIHRoaXMudmlld2VyTWFpbi5jbGllbnRUb3A7CiAgICAgICAgaWYgKHNtb290aCkgewogICAgICAgICAgdGhpcy52aWV3ZXJNYWluLnNjcm9sbFRvKHsKICAgICAgICAgICAgdG9wOiB0YXJnZXRTY3JvbGxUb3AsCiAgICAgICAgICAgIGJlaGF2aW9yOiAic21vb3RoIgogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMudmlld2VyTWFpbi5zY3JvbGxUb3AgPSB0YXJnZXRTY3JvbGxUb3A7CiAgICAgICAgfQogICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlTnVtOwogICAgICAgIGlmICh0aGlzLnNob3dTaWRlYmFyKSB7CiAgICAgICAgICB0aGlzLnNjcm9sbFRodW1ibmFpbEludG9WaWV3KHBhZ2VOdW0pOwogICAgICAgIH0KICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclBhZ2VJZk5lZWRlZChwYWdlTnVtKTsKICAgICAgfQogICAgfQogICAgYXN5bmMgcmVuZGVyVGh1bWJuYWlscygpIHsKICAgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLnRodW1ibmFpbERhdGEubGVuZ3RoID4gMCAmJiB0aGlzLnRodW1ibmFpbERhdGEuZXZlcnkoKHQ5KSA9PiB0OS5yZW5kZXJlZCkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHRoaXMucmVuZGVyQWJvcnRDb250cm9sbGVyPy5zaWduYWwuYWJvcnRlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBzaWduYWwgPSB0aGlzLnJlbmRlckFib3J0Q29udHJvbGxlcj8uc2lnbmFsOwogICAgICB0aGlzLnJlbmRlclN0YXRlID0gInJlbmRlcmluZy10aHVtYnMiOwogICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgdGhpcy50aHVtYm5haWxSZW5kZXJUYXNrcykgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0YXNrLmNhbmNlbCgpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMudGh1bWJuYWlsUmVuZGVyVGFza3MgPSBbXTsKICAgICAgdHJ5IHsKICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlOwogICAgICAgIGNvbnN0IHRodW1ibmFpbHMgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3JBbGwoIi50aHVtYm5haWwiKTsKICAgICAgICBjb25zdCB0aHVtYm5haWxDYW52YXNlcyA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvckFsbCgiLnRodW1ibmFpbC1jYW52YXMiKTsKICAgICAgICBjb25zdCBzaWRlYmFyQ29udGVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnNpZGViYXItY29udGVudCIpOwogICAgICAgIGNvbnN0IHNpZGViYXJTdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzaWRlYmFyQ29udGVudCk7CiAgICAgICAgY29uc3Qgc2lkZWJhclBhZGRpbmcgPSBwYXJzZUZsb2F0KHNpZGViYXJTdHlsZXMucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChzaWRlYmFyU3R5bGVzLnBhZGRpbmdSaWdodCk7CiAgICAgICAgY29uc3QgbWF4VGh1bWJuYWlsV2lkdGggPSAyMDAgLSBzaWRlYmFyUGFkZGluZyAtIDQ7CiAgICAgICAgZm9yIChjb25zdCBjYW52YXMgb2YgQXJyYXkuZnJvbSh0aHVtYm5haWxDYW52YXNlcykpIHsKICAgICAgICAgIGNvbnN0IGNvbnRleHQyID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgICBpZiAoY29udGV4dDIpIHsKICAgICAgICAgICAgY29udGV4dDIuY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IHRodW1ibmFpbENhbnZhc2VzLmxlbmd0aDsgaTExKyspIHsKICAgICAgICAgIGlmIChzaWduYWw/LmFib3J0ZWQpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IHRodW1ibmFpbENhbnZhc2VzW2kxMV07CiAgICAgICAgICBjb25zdCB0aHVtYm5haWwgPSB0aHVtYm5haWxzW2kxMV07CiAgICAgICAgICBjb25zdCBwYWdlTnVtID0gcGFyc2VJbnQoY2FudmFzLmRhdGFzZXQucGFnZSB8fCAiMSIpOwogICAgICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHRoaXMucGRmRG9jdW1lbnQuZ2V0UGFnZShwYWdlTnVtKTsKICAgICAgICAgIGNvbnN0IGluaXRpYWxWaWV3cG9ydCA9IHBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZTogMSB9KTsKICAgICAgICAgIGNvbnN0IHNjYWxlID0gbWF4VGh1bWJuYWlsV2lkdGggLyBpbml0aWFsVmlld3BvcnQud2lkdGg7CiAgICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZSB9KTsKICAgICAgICAgIGNvbnN0IGRwciA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7CiAgICAgICAgICBjYW52YXMud2lkdGggPSBNYXRoLmZsb29yKHZpZXdwb3J0LndpZHRoICogZHByKTsKICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBNYXRoLmZsb29yKHZpZXdwb3J0LmhlaWdodCAqIGRwcik7CiAgICAgICAgICBjYW52YXMuc3R5bGUud2lkdGggPSBgJHt2aWV3cG9ydC53aWR0aH1weGA7CiAgICAgICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gYCR7dmlld3BvcnQuaGVpZ2h0fXB4YDsKICAgICAgICAgIHRodW1ibmFpbC5zdHlsZS5oZWlnaHQgPSBgJHt2aWV3cG9ydC5oZWlnaHR9cHhgOwogICAgICAgICAgdGh1bWJuYWlsLnN0eWxlLm1pbkhlaWdodCA9IGAke3ZpZXdwb3J0LmhlaWdodH1weGA7CiAgICAgICAgICBjb25zdCBjb250ZXh0MiA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgICAgaWYgKCFjb250ZXh0MikgewogICAgICAgICAgICBwYWdlLmNsZWFudXA/LigpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnRleHQyLnNjYWxlKGRwciwgZHByKTsKICAgICAgICAgIGNvbnN0IHJlbmRlckNvbnRleHQgPSB7CiAgICAgICAgICAgIGNhbnZhc0NvbnRleHQ6IGNvbnRleHQyLAogICAgICAgICAgICB2aWV3cG9ydAogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHJlbmRlclRhc2sgPSBwYWdlLnJlbmRlcihyZW5kZXJDb250ZXh0KTsKICAgICAgICAgIHRoaXMudGh1bWJuYWlsUmVuZGVyVGFza3MucHVzaChyZW5kZXJUYXNrKTsKICAgICAgICAgIGF3YWl0IHJlbmRlclRhc2sucHJvbWlzZTsKICAgICAgICAgIHBhZ2UuY2xlYW51cD8uKCk7CiAgICAgICAgICBjb25zdCB0aHVtYkRhdGEgPSB0aGlzLnRodW1ibmFpbERhdGEuZmluZCgodDkpID0+IHQ5LnBhZ2UgPT09IHBhZ2VOdW0pOwogICAgICAgICAgaWYgKHRodW1iRGF0YSkgewogICAgICAgICAgICB0aHVtYkRhdGEucmVuZGVyZWQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoInRodW1ibmFpbERhdGEiKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBpZiAoZXJyb3I/Lm5hbWUgIT09ICJSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24iKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCJFcnJvciByZW5kZXJpbmcgdGh1bWJuYWlsczoiLCBlcnJvcik7CiAgICAgICAgfQogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRoaXMudGh1bWJuYWlsUmVuZGVyVGFza3MgPSBbXTsKICAgICAgfQogICAgfQogICAgcHJldmlvdXNQYWdlKCkgewogICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA+IDEpIHsKICAgICAgICB0aGlzLnNjcm9sbFRvUGFnZSh0aGlzLmN1cnJlbnRQYWdlIC0gMSk7CiAgICAgIH0KICAgIH0KICAgIG5leHRQYWdlKCkgewogICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA8IHRoaXMudG90YWxQYWdlcykgewogICAgICAgIHRoaXMuc2Nyb2xsVG9QYWdlKHRoaXMuY3VycmVudFBhZ2UgKyAxKTsKICAgICAgfQogICAgfQogICAgaGFuZGxlVGh1bWJuYWlsQ2xpY2soZTExKSB7CiAgICAgIGNvbnN0IHRhcmdldCA9IGUxMS5jdXJyZW50VGFyZ2V0OwogICAgICBjb25zdCBwYWdlTnVtID0gcGFyc2VJbnQodGFyZ2V0LmRhdGFzZXQucGFnZSB8fCAiMSIpOwogICAgICB0aGlzLnNjcm9sbFRvUGFnZShwYWdlTnVtKTsKICAgIH0KICAgIGhhbmRsZVBhZ2VJbnB1dChlMTEpIHsKICAgICAgY29uc3QgaW5wdXQgPSBlMTEudGFyZ2V0OwogICAgICBjb25zdCBwYWdlTnVtID0gcGFyc2VJbnQoaW5wdXQudmFsdWUpOwogICAgICB0aGlzLnNjcm9sbFRvUGFnZShwYWdlTnVtKTsKICAgIH0KICAgIHpvb21JbigpIHsKICAgICAgY29uc3QgbmV4dFpvb20gPSBNYXRoLm1pbih0aGlzLk1BTlVBTF9NQVhfWk9PTSwgdGhpcy5jdXJyZW50Wm9vbSAqIDEuMik7CiAgICAgIHRoaXMudmlld3BvcnRNb2RlID0gImN1c3RvbSI7CiAgICAgIGlmIChuZXh0Wm9vbSAhPT0gdGhpcy5jdXJyZW50Wm9vbSkgewogICAgICAgIHRoaXMuY3VycmVudFpvb20gPSBuZXh0Wm9vbTsKICAgICAgICB0aGlzLnJlUmVuZGVyQWxsUGFnZXMoKTsKICAgICAgfQogICAgfQogICAgem9vbU91dCgpIHsKICAgICAgY29uc3QgbmV4dFpvb20gPSBNYXRoLm1heCh0aGlzLk1BTlVBTF9NSU5fWk9PTSwgdGhpcy5jdXJyZW50Wm9vbSAvIDEuMik7CiAgICAgIHRoaXMudmlld3BvcnRNb2RlID0gImN1c3RvbSI7CiAgICAgIGlmIChuZXh0Wm9vbSAhPT0gdGhpcy5jdXJyZW50Wm9vbSkgewogICAgICAgIHRoaXMuY3VycmVudFpvb20gPSBuZXh0Wm9vbTsKICAgICAgICB0aGlzLnJlUmVuZGVyQWxsUGFnZXMoKTsKICAgICAgfQogICAgfQogICAgcmVzZXRab29tKCkgewogICAgICB0aGlzLnZpZXdwb3J0TW9kZSA9ICJjdXN0b20iOwogICAgICB0aGlzLmN1cnJlbnRab29tID0gMTsKICAgICAgdGhpcy5yZVJlbmRlckFsbFBhZ2VzKCk7CiAgICB9CiAgICBmaXRUb1BhZ2UoKSB7CiAgICAgIHRoaXMudmlld3BvcnRNb2RlID0gInBhZ2UtZml0IjsKICAgICAgdGhpcy5yZVJlbmRlckFsbFBhZ2VzKCk7CiAgICB9CiAgICBmaXRUb1dpZHRoKCkgewogICAgICB0aGlzLnZpZXdwb3J0TW9kZSA9ICJwYWdlLXdpZHRoIjsKICAgICAgdGhpcy5yZVJlbmRlckFsbFBhZ2VzKCk7CiAgICB9CiAgICByZVJlbmRlckFsbFBhZ2VzKCkgewogICAgICB0aGlzLnBhZ2VEYXRhLmZvckVhY2goKHBhZ2UpID0+IHsKICAgICAgICBwYWdlLnJlbmRlcmVkID0gZmFsc2U7CiAgICAgICAgcGFnZS5yZW5kZXJpbmcgPSBmYWxzZTsKICAgICAgfSk7CiAgICAgIHRoaXMucGFnZVJlbmRlclRhc2tzLmZvckVhY2goKHRhc2spID0+IHsKICAgICAgICB0cnkgewogICAgICAgICAgdGFzay5jYW5jZWwoKTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMucGFnZVJlbmRlclRhc2tzLmNsZWFyKCk7CiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4gewogICAgICAgIHRoaXMucmVuZGVyVmlzaWJsZVBhZ2VzKCk7CiAgICAgIH0pOwogICAgfQogICAgZG93bmxvYWRQZGYoKSB7CiAgICAgIGNvbnN0IGxpbmszID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwogICAgICBsaW5rMy5ocmVmID0gdGhpcy5wZGZVcmw7CiAgICAgIGxpbmszLmRvd25sb2FkID0gdGhpcy5wZGZVcmwuc3BsaXQoIi8iKS5wb3AoKSB8fCAiZG9jdW1lbnQucGRmIjsKICAgICAgbGluazMuY2xpY2soKTsKICAgIH0KICAgIHByaW50UGRmKCkgewogICAgICB3aW5kb3cub3Blbih0aGlzLnBkZlVybCwgIl9ibGFuayIpPy5wcmludCgpOwogICAgfQogICAgLyoqCiAgICAgKiBQcm92aWRlIGNvbnRleHQgbWVudSBpdGVtcyBmb3IgcmlnaHQtY2xpY2sgZnVuY3Rpb25hbGl0eQogICAgICovCiAgICBnZXRDb250ZXh0TWVudUl0ZW1zKCkgewogICAgICByZXR1cm4gWwogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJPcGVuIFBERiBpbiBOZXcgVGFiIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOkV4dGVybmFsTGluayIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgd2luZG93Lm9wZW4odGhpcy5wZGZVcmwsICJfYmxhbmsiKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJDb3B5IFBERiBVUkwiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6Q29weSIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGhpcy5wZGZVcmwpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIkRvd25sb2FkIFBERiIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpEb3dubG9hZCIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgdGhpcy5kb3dubG9hZFBkZigpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIlByaW50IFBERiIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpQcmludGVyIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICB0aGlzLnByaW50UGRmKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBdOwogICAgfQogICAgZ2V0IGNhblpvb21JbigpIHsKICAgICAgcmV0dXJuIHRoaXMudmlld3BvcnRNb2RlICE9PSAiY3VzdG9tIiB8fCB0aGlzLmN1cnJlbnRab29tIDwgdGhpcy5NQU5VQUxfTUFYX1pPT007CiAgICB9CiAgICBnZXQgY2FuWm9vbU91dCgpIHsKICAgICAgcmV0dXJuIHRoaXMudmlld3BvcnRNb2RlICE9PSAiY3VzdG9tIiB8fCB0aGlzLmN1cnJlbnRab29tID4gdGhpcy5NQU5VQUxfTUlOX1pPT007CiAgICB9CiAgICBlbnN1cmVWaWV3ZXJSZWZzKCkgewogICAgICBpZiAoIXRoaXMudmlld2VyTWFpbikgewogICAgICAgIHRoaXMudmlld2VyTWFpbiA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnZpZXdlci1tYWluIik7CiAgICAgIH0KICAgICAgaWYgKHRoaXMudmlld2VyTWFpbiAmJiAhdGhpcy5yZXNpemVPYnNlcnZlcikgewogICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgdGhpcy5tZWFzdXJlVmlld3BvcnREaW1lbnNpb25zKCk7CiAgICAgICAgICBpZiAodGhpcy5wZGZEb2N1bWVudCkgewogICAgICAgICAgICB0aGlzLnJlUmVuZGVyQWxsUGFnZXMoKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy52aWV3ZXJNYWluKTsKICAgICAgICB0aGlzLm1lYXN1cmVWaWV3cG9ydERpbWVuc2lvbnMoKTsKICAgICAgICB0aGlzLnZpZXdlck1haW4uYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLCAoZTExKSA9PiB7CiAgICAgICAgICBjb25zdCBlbGVtZW50NCA9IGUxMS5jdXJyZW50VGFyZ2V0OwogICAgICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gZWxlbWVudDQuc2Nyb2xsVG9wOwogICAgICAgICAgY29uc3Qgc2Nyb2xsSGVpZ2h0ID0gZWxlbWVudDQuc2Nyb2xsSGVpZ2h0OwogICAgICAgICAgY29uc3QgY2xpZW50SGVpZ2h0ID0gZWxlbWVudDQuY2xpZW50SGVpZ2h0OwogICAgICAgICAgY29uc3QgZGVsdGFZID0gZTExLmRlbHRhWTsKICAgICAgICAgIGNvbnN0IGlzQXRUb3AgPSBzY3JvbGxUb3AgPT09IDA7CiAgICAgICAgICBjb25zdCBpc0F0Qm90dG9tID0gTWF0aC5hYnMoc2Nyb2xsVG9wICsgY2xpZW50SGVpZ2h0IC0gc2Nyb2xsSGVpZ2h0KSA8IDE7CiAgICAgICAgICBpZiAoZGVsdGFZIDwgMCAmJiAhaXNBdFRvcCB8fCBkZWx0YVkgPiAwICYmICFpc0F0Qm90dG9tKSB7CiAgICAgICAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgIH0gZWxzZSBpZiAoZGVsdGFZIDwgMCAmJiBpc0F0VG9wIHx8IGRlbHRhWSA+IDAgJiYgaXNBdEJvdHRvbSkgewogICAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgfQogICAgICAgIH0sIHsgcGFzc2l2ZTogZmFsc2UgfSk7CiAgICAgIH0KICAgIH0KICAgIG1lYXN1cmVWaWV3cG9ydERpbWVuc2lvbnMoKSB7CiAgICAgIGlmICghdGhpcy52aWV3ZXJNYWluKSB7CiAgICAgICAgdGhpcy52aWV3cG9ydERpbWVuc2lvbnMgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgc3R5bGVzMyA9IGdldENvbXB1dGVkU3R5bGUodGhpcy52aWV3ZXJNYWluKTsKICAgICAgY29uc3QgcGFkZGluZ1ggPSBwYXJzZUZsb2F0KHN0eWxlczMucGFkZGluZ0xlZnQgfHwgIjAiKSArIHBhcnNlRmxvYXQoc3R5bGVzMy5wYWRkaW5nUmlnaHQgfHwgIjAiKTsKICAgICAgY29uc3QgcGFkZGluZ1kgPSBwYXJzZUZsb2F0KHN0eWxlczMucGFkZGluZ1RvcCB8fCAiMCIpICsgcGFyc2VGbG9hdChzdHlsZXMzLnBhZGRpbmdCb3R0b20gfHwgIjAiKTsKICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCh0aGlzLnZpZXdlck1haW4uY2xpZW50V2lkdGggLSBwYWRkaW5nWCwgMCk7CiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KHRoaXMudmlld2VyTWFpbi5jbGllbnRIZWlnaHQgLSBwYWRkaW5nWSwgMCk7CiAgICAgIHRoaXMudmlld3BvcnREaW1lbnNpb25zID0geyB3aWR0aCwgaGVpZ2h0IH07CiAgICB9CiAgICByZXNvbHZlSW5pdGlhbFZpZXdwb3J0TW9kZSgpIHsKICAgICAgaWYgKHR5cGVvZiB0aGlzLmluaXRpYWxab29tID09PSAibnVtYmVyIikgewogICAgICAgIHRoaXMudmlld3BvcnRNb2RlID0gImN1c3RvbSI7CiAgICAgICAgdGhpcy5jdXJyZW50Wm9vbSA9IHRoaXMubm9ybWFsaXplWm9vbSh0aGlzLmluaXRpYWxab29tLCB0cnVlKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLmluaXRpYWxab29tID09PSAicGFnZS13aWR0aCIpIHsKICAgICAgICB0aGlzLnZpZXdwb3J0TW9kZSA9ICJwYWdlLXdpZHRoIjsKICAgICAgfSBlbHNlIGlmICh0aGlzLmluaXRpYWxab29tID09PSAicGFnZS1maXQiIHx8IHRoaXMuaW5pdGlhbFpvb20gPT09ICJhdXRvIikgewogICAgICAgIHRoaXMudmlld3BvcnRNb2RlID0gInBhZ2UtZml0IjsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnZpZXdwb3J0TW9kZSA9ICJhdXRvIjsKICAgICAgfQogICAgICBpZiAodGhpcy52aWV3cG9ydE1vZGUgIT09ICJjdXN0b20iKSB7CiAgICAgICAgdGhpcy5jdXJyZW50Wm9vbSA9IDE7CiAgICAgIH0KICAgIH0KICAgIGNvbXB1dGVWaWV3cG9ydChwYWdlKSB7CiAgICAgIHRoaXMubWVhc3VyZVZpZXdwb3J0RGltZW5zaW9ucygpOwogICAgICBjb25zdCBiYXNlVmlld3BvcnQgPSBwYWdlLmdldFZpZXdwb3J0KHsgc2NhbGU6IDEgfSk7CiAgICAgIGxldCBzY2FsZTsKICAgICAgc3dpdGNoICh0aGlzLnZpZXdwb3J0TW9kZSkgewogICAgICAgIGNhc2UgInBhZ2Utd2lkdGgiOiB7CiAgICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aCA9IHRoaXMudmlld3BvcnREaW1lbnNpb25zLndpZHRoIHx8IGJhc2VWaWV3cG9ydC53aWR0aDsKICAgICAgICAgIHNjYWxlID0gYXZhaWxhYmxlV2lkdGggLyBiYXNlVmlld3BvcnQud2lkdGg7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAicGFnZS1maXQiOgogICAgICAgIGNhc2UgImF1dG8iOiB7CiAgICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aCA9IHRoaXMudmlld3BvcnREaW1lbnNpb25zLndpZHRoIHx8IGJhc2VWaWV3cG9ydC53aWR0aDsKICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZUhlaWdodCA9IHRoaXMudmlld3BvcnREaW1lbnNpb25zLmhlaWdodCB8fCBiYXNlVmlld3BvcnQuaGVpZ2h0OwogICAgICAgICAgY29uc3Qgd2lkdGhTY2FsZSA9IGF2YWlsYWJsZVdpZHRoIC8gYmFzZVZpZXdwb3J0LndpZHRoOwogICAgICAgICAgY29uc3QgaGVpZ2h0U2NhbGUgPSBhdmFpbGFibGVIZWlnaHQgLyBiYXNlVmlld3BvcnQuaGVpZ2h0OwogICAgICAgICAgc2NhbGUgPSBNYXRoLm1pbih3aWR0aFNjYWxlLCBoZWlnaHRTY2FsZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAiY3VzdG9tIjoKICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICBzY2FsZSA9IHRoaXMubm9ybWFsaXplWm9vbSh0aGlzLmN1cnJlbnRab29tIHx8IDEsIGZhbHNlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShzY2FsZSkgfHwgc2NhbGUgPD0gMCkgewogICAgICAgIHNjYWxlID0gMTsKICAgICAgfQogICAgICBjb25zdCBjbGFtcGVkU2NhbGUgPSB0aGlzLnZpZXdwb3J0TW9kZSA9PT0gImN1c3RvbSIgPyB0aGlzLm5vcm1hbGl6ZVpvb20oc2NhbGUsIHRydWUpIDogdGhpcy5ub3JtYWxpemVab29tKHNjYWxlLCBmYWxzZSk7CiAgICAgIGlmICh0aGlzLnZpZXdwb3J0TW9kZSAhPT0gImN1c3RvbSIpIHsKICAgICAgICB0aGlzLmN1cnJlbnRab29tID0gY2xhbXBlZFNjYWxlOwogICAgICB9CiAgICAgIHJldHVybiBwYWdlLmdldFZpZXdwb3J0KHsgc2NhbGU6IGNsYW1wZWRTY2FsZSB9KTsKICAgIH0KICAgIG5vcm1hbGl6ZVpvb20odmFsdWUyLCBjbGFtcFRvTWFudWFsUmFuZ2UpIHsKICAgICAgY29uc3QgbWluMyA9IGNsYW1wVG9NYW51YWxSYW5nZSA/IHRoaXMuTUFOVUFMX01JTl9aT09NIDogdGhpcy5BQlNPTFVURV9NSU5fWk9PTTsKICAgICAgY29uc3QgbWF4MyA9IGNsYW1wVG9NYW51YWxSYW5nZSA/IHRoaXMuTUFOVUFMX01BWF9aT09NIDogdGhpcy5BQlNPTFVURV9NQVhfWk9PTTsKICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHZhbHVlMiwgbWluMyksIG1heDMpOwogICAgfQogICAgYXN5bmMgY2xlYW51cERvY3VtZW50KCkgewogICAgICBpZiAodGhpcy5yZW5kZXJBYm9ydENvbnRyb2xsZXIpIHsKICAgICAgICB0aGlzLnJlbmRlckFib3J0Q29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHRoaXMucmVuZGVyQWJvcnRDb250cm9sbGVyID0gbnVsbDsKICAgICAgfQogICAgICBpZiAodGhpcy5jdXJyZW50UmVuZGVyUHJvbWlzZSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBhd2FpdCB0aGlzLmN1cnJlbnRSZW5kZXJQcm9taXNlOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgfQogICAgICAgIHRoaXMuY3VycmVudFJlbmRlclByb21pc2UgPSBudWxsOwogICAgICB9CiAgICAgIHRoaXMuY3VycmVudFJlbmRlclRhc2sgPSBudWxsOwogICAgICB0aGlzLnBhZ2VSZW5kZXJUYXNrcy5mb3JFYWNoKCh0YXNrKSA9PiB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRhc2suY2FuY2VsKCk7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLnBhZ2VSZW5kZXJUYXNrcy5jbGVhcigpOwogICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgdGhpcy50aHVtYm5haWxSZW5kZXJUYXNrcyB8fCBbXSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0YXNrLmNhbmNlbCgpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMudGh1bWJuYWlsUmVuZGVyVGFza3MgPSBbXTsKICAgICAgdGhpcy5yZW5kZXJTdGF0ZSA9ICJpZGxlIjsKICAgICAgdGhpcy5wYWdlUmVuZGVyaW5nID0gZmFsc2U7CiAgICAgIHRoaXMucGFnZU51bVBlbmRpbmcgPSBudWxsOwogICAgICB0aGlzLnRodW1ibmFpbERhdGEgPSBbXTsKICAgICAgdGhpcy5wYWdlRGF0YSA9IFtdOwogICAgICB0aGlzLmRvY3VtZW50SWQgPSAiIjsKICAgICAgaWYgKHRoaXMuY2FudmFzICYmIHRoaXMuY3R4KSB7CiAgICAgICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpOwogICAgICB9CiAgICAgIGlmICh0aGlzLnBkZkRvY3VtZW50KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRoaXMucGRmRG9jdW1lbnQuZGVzdHJveSgpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCJFcnJvciBkZXN0cm95aW5nIFBERiBkb2N1bWVudDoiLCBlcnJvcik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMucGRmRG9jdW1lbnQgPSBudWxsOwogICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNzQoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNQZGZWaWV3ZXIyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXByZXZpZXcvZGVlcy1wcmV2aWV3LmRlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW9GdW5jNDkgPSAoKSA9PiBiMmAKICA8c3R5bGU+CiAgICAuZGVtby1jb250YWluZXIgewogICAgICBwYWRkaW5nOiA0OHB4OwogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y4ZjlmYSIsICIjMGEwYTBhIil9OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDQwcHg7CiAgICB9CgogICAgLnNlY3Rpb24gewogICAgICBtYXgtd2lkdGg6IDkwMHB4OwogICAgICB3aWR0aDogMTAwJTsKICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICB9CgogICAgLnNlY3Rpb24tdGl0bGUgewogICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICB9CgogICAgLnNlY3Rpb24tZGVzY3JpcHRpb24gewogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OwogICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgfQoKICAgIC5wcmV2aWV3LWltYWdlIHsKICAgICAgaGVpZ2h0OiA0MDBweDsKICAgIH0KCiAgICAucHJldmlldy1wZGYgewogICAgICBoZWlnaHQ6IDYwMHB4OwogICAgfQogIDwvc3R5bGU+CgogIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5JbWFnZSBQcmV2aWV3IChVUkwpPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPkF1dG8tZGV0ZWN0cyBpbWFnZSBmcm9tIFVSTCBleHRlbnNpb24gYW5kIHJlbmRlcnMgd2l0aCB0aGUgaW1hZ2Ugdmlld2VyLjwvZGl2PgogICAgICA8ZGVlcy1wcmV2aWV3CiAgICAgICAgY2xhc3M9InByZXZpZXctaW1hZ2UiCiAgICAgICAgdXJsPSJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUwNjc0NDAzODEzNi00NjI3MzgzNGIzZmI/dz0xMjAwIgogICAgICAgIGZpbGVuYW1lPSJsYW5kc2NhcGUuanBnIgogICAgICA+PC9kZWVzLXByZXZpZXc+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+UERGIFByZXZpZXcgKFVSTCk8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+QXV0by1kZXRlY3RzIFBERiBhbmQgZGlzcGxheXMgd2l0aCB0aGUgUERGIHZpZXdlciBpbmNsdWRpbmcgdG9vbGJhci48L2Rpdj4KICAgICAgPGRlZXMtcHJldmlldwogICAgICAgIGNsYXNzPSJwcmV2aWV3LXBkZiIKICAgICAgICB1cmw9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9tb3ppbGxhL3BkZi5qcy9iYTJlZGVhZS93ZWIvY29tcHJlc3NlZC50cmFjZW1vbmtleS1wbGRpLTA5LnBkZiIKICAgICAgICBmaWxlbmFtZT0icmVzZWFyY2gtcGFwZXIucGRmIgogICAgICA+PC9kZWVzLXByZXZpZXc+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+Q29kZSBQcmV2aWV3IChUZXh0IENvbnRlbnQpPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPlR5cGVTY3JpcHQgY29kZSBkaXNwbGF5ZWQgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIHZpYSB0aGUgY29kZWJveC48L2Rpdj4KICAgICAgPGRlZXMtcHJldmlldwogICAgICAgIGZpbGVuYW1lPSJleGFtcGxlLnRzIgogICAgICAgIGxhbmd1YWdlPSJ0eXBlc2NyaXB0IgogICAgICAgIC50ZXh0Q29udGVudD0ke2BpbXBvcnQgeyBodG1sLCBjc3MgfSBmcm9tICdsaXQnOwoKZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7CiAgc3RhdGljIHN0eWxlcyA9IGNzc1xgCiAgICA6aG9zdCB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICBwYWRkaW5nOiAxNnB4OwogICAgfQogIFxgOwoKICByZW5kZXIoKSB7CiAgICByZXR1cm4gaHRtbFxgPGgxPkhlbGxvIFdvcmxkPC9oMT5cYDsKICB9Cn1gfQogICAgICA+PC9kZWVzLXByZXZpZXc+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+QXVkaW8gUHJldmlldyAoVVJMKTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5BdWRpbyBmaWxlIGRldGVjdGVkIGJ5IGV4dGVuc2lvbiwgc2hvd24gd2l0aCB3YXZlZm9ybSBwbGF5ZXIuPC9kaXY+CiAgICAgIDxkZWVzLXByZXZpZXcKICAgICAgICB1cmw9Imh0dHBzOi8vd3d3LnNvdW5kaGVsaXguY29tL2V4YW1wbGVzL21wMy9Tb3VuZEhlbGl4LVNvbmctMS5tcDMiCiAgICAgICAgZmlsZW5hbWU9InNvbmcubXAzIgogICAgICA+PC9kZWVzLXByZXZpZXc+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+VmlkZW8gUHJldmlldyAoVVJMKTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5WaWRlbyBmaWxlIGRldGVjdGVkIGZyb20gVVJMLCByZW5kZXJlZCB3aXRoIGN1c3RvbSB2aWRlbyBjb250cm9scy48L2Rpdj4KICAgICAgPGRlZXMtcHJldmlldwogICAgICAgIHVybD0iaHR0cHM6Ly9jb21tb25kYXRhc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9ndHYtdmlkZW9zLWJ1Y2tldC9zYW1wbGUvQmlnQnVja0J1bm55Lm1wNCIKICAgICAgICBmaWxlbmFtZT0iYmlnLWJ1Y2stYnVubnkubXA0IgogICAgICA+PC9kZWVzLXByZXZpZXc+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+RXhwbGljaXQgVHlwZSBPdmVycmlkZTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5Gb3JjZSBjb250ZW50IHR5cGUgdG8gJ3RleHQnIGV2ZW4gdGhvdWdoIHRoZSBVUkwgaGFzIG5vIGV4dGVuc2lvbi48L2Rpdj4KICAgICAgPGRlZXMtcHJldmlldwogICAgICAgIGNvbnRlbnRUeXBlPSJ0ZXh0IgogICAgICAgIC50ZXh0Q29udGVudD0keyJUaGlzIGlzIHBsYWluIHRleHQgY29udGVudC5cbkl0IHByZXNlcnZlcyB3aGl0ZXNwYWNlIGFuZCBsaW5lIGJyZWFrcy5cblxuVXNlZnVsIGZvciBsb2cgZmlsZXMsIFJFQURNRXMsIGV0Yy4ifQogICAgICAgIGZpbGVuYW1lPSJub3Rlcy50eHQiCiAgICAgID48L2RlZXMtcHJldmlldz4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5Vbmtub3duIFR5cGU8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+V2hlbiBjb250ZW50IHR5cGUgY2Fubm90IGJlIGRldGVjdGVkLCBzaG93cyBhIHBsYWNlaG9sZGVyLjwvZGl2PgogICAgICA8ZGVlcy1wcmV2aWV3CiAgICAgICAgZmlsZW5hbWU9ImRhdGEuYmluIgogICAgICAgIGNvbnRlbnRUeXBlPSJ1bmtub3duIgogICAgICA+PC9kZWVzLXByZXZpZXc+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXByZXZpZXcvZGVlcy1wcmV2aWV3LmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfZGVlc19pY29uKCk7CnZhciBfX2VzRGVjb3JhdGU3NCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNzUgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIEVYVEVOU0lPTl9NQVAgPSB7CiAgLy8gSW1hZ2UKICBqcGc6ICJpbWFnZSIsCiAganBlZzogImltYWdlIiwKICBwbmc6ICJpbWFnZSIsCiAgZ2lmOiAiaW1hZ2UiLAogIHdlYnA6ICJpbWFnZSIsCiAgc3ZnOiAiaW1hZ2UiLAogIGJtcDogImltYWdlIiwKICBhdmlmOiAiaW1hZ2UiLAogIGljbzogImltYWdlIiwKICAvLyBQREYKICBwZGY6ICJwZGYiLAogIC8vIEF1ZGlvCiAgbXAzOiAiYXVkaW8iLAogIHdhdjogImF1ZGlvIiwKICBvZ2c6ICJhdWRpbyIsCiAgZmxhYzogImF1ZGlvIiwKICBhYWM6ICJhdWRpbyIsCiAgbTRhOiAiYXVkaW8iLAogIG9wdXM6ICJhdWRpbyIsCiAgd2ViYTogImF1ZGlvIiwKICAvLyBWaWRlbwogIG1wNDogInZpZGVvIiwKICB3ZWJtOiAidmlkZW8iLAogIG1vdjogInZpZGVvIiwKICBhdmk6ICJ2aWRlbyIsCiAgbWt2OiAidmlkZW8iLAogIG9ndjogInZpZGVvIiwKICAvLyBDb2RlCiAgdHM6ICJjb2RlIiwKICBqczogImNvZGUiLAogIGpzeDogImNvZGUiLAogIHRzeDogImNvZGUiLAogIGpzb246ICJjb2RlIiwKICBodG1sOiAiY29kZSIsCiAgY3NzOiAiY29kZSIsCiAgc2NzczogImNvZGUiLAogIGxlc3M6ICJjb2RlIiwKICBweTogImNvZGUiLAogIGphdmE6ICJjb2RlIiwKICBnbzogImNvZGUiLAogIHJzOiAiY29kZSIsCiAgeWFtbDogImNvZGUiLAogIHltbDogImNvZGUiLAogIHhtbDogImNvZGUiLAogIHNxbDogImNvZGUiLAogIHNoOiAiY29kZSIsCiAgYmFzaDogImNvZGUiLAogIHpzaDogImNvZGUiLAogIG1kOiAiY29kZSIsCiAgYzogImNvZGUiLAogIGNwcDogImNvZGUiLAogIGg6ICJjb2RlIiwKICBocHA6ICJjb2RlIiwKICByYjogImNvZGUiLAogIHBocDogImNvZGUiLAogIHN3aWZ0OiAiY29kZSIsCiAga3Q6ICJjb2RlIiwKICAvLyBUZXh0CiAgdHh0OiAidGV4dCIsCiAgbG9nOiAidGV4dCIsCiAgY3N2OiAidGV4dCIsCiAgZW52OiAidGV4dCIKfTsKdmFyIE1JTUVfUFJFRklYX01BUCA9IHsKICAiaW1hZ2UvIjogImltYWdlIiwKICAiYXVkaW8vIjogImF1ZGlvIiwKICAidmlkZW8vIjogInZpZGVvIiwKICAiYXBwbGljYXRpb24vcGRmIjogInBkZiIKfTsKdmFyIEVYVEVOU0lPTl9MQU5HX01BUCA9IHsKICB0czogInR5cGVzY3JpcHQiLAogIHRzeDogInR5cGVzY3JpcHQiLAogIGpzOiAiamF2YXNjcmlwdCIsCiAganN4OiAiamF2YXNjcmlwdCIsCiAganNvbjogImpzb24iLAogIGh0bWw6ICJ4bWwiLAogIHhtbDogInhtbCIsCiAgY3NzOiAiY3NzIiwKICBzY3NzOiAic2NzcyIsCiAgbGVzczogImxlc3MiLAogIHB5OiAicHl0aG9uIiwKICBqYXZhOiAiamF2YSIsCiAgZ286ICJnbyIsCiAgcnM6ICJydXN0IiwKICB5YW1sOiAieWFtbCIsCiAgeW1sOiAieWFtbCIsCiAgc3FsOiAic3FsIiwKICBzaDogImJhc2giLAogIGJhc2g6ICJiYXNoIiwKICB6c2g6ICJiYXNoIiwKICBjOiAiYyIsCiAgY3BwOiAiY3BwIiwKICBoOiAiYyIsCiAgaHBwOiAiY3BwIiwKICByYjogInJ1YnkiLAogIHBocDogInBocCIsCiAgc3dpZnQ6ICJzd2lmdCIsCiAga3Q6ICJrb3RsaW4iLAogIG1kOiAibWFya2Rvd24iCn07CnZhciBUWVBFX0lDT05TID0gewogIGltYWdlOiAibHVjaWRlOkltYWdlIiwKICBwZGY6ICJsdWNpZGU6RmlsZVRleHQiLAogIGF1ZGlvOiAibHVjaWRlOk11c2ljIiwKICB2aWRlbzogImx1Y2lkZTpWaWRlbyIsCiAgY29kZTogImx1Y2lkZTpDb2RlIiwKICB0ZXh0OiAibHVjaWRlOkZpbGVUZXh0IiwKICB1bmtub3duOiAibHVjaWRlOkZpbGUiCn07CnZhciBEZWVzUHJldmlldyA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtcHJldmlldyIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3VybF9kZWNvcmF0b3JzOwogIGxldCBfdXJsX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdXJsX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWxlX2RlY29yYXRvcnM7CiAgbGV0IF9maWxlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZmlsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYmFzZTY0X2RlY29yYXRvcnM7CiAgbGV0IF9iYXNlNjRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9iYXNlNjRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RleHRDb250ZW50X2RlY29yYXRvcnM7CiAgbGV0IF90ZXh0Q29udGVudF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RleHRDb250ZW50X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZW50VHlwZV9kZWNvcmF0b3JzOwogIGxldCBfY29udGVudFR5cGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZW50VHlwZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGFuZ3VhZ2VfZGVjb3JhdG9yczsKICBsZXQgX2xhbmd1YWdlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGFuZ3VhZ2VfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21pbWVUeXBlX2RlY29yYXRvcnM7CiAgbGV0IF9taW1lVHlwZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21pbWVUeXBlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWxlbmFtZV9kZWNvcmF0b3JzOwogIGxldCBfZmlsZW5hbWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWxlbmFtZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1Rvb2xiYXJfZGVjb3JhdG9yczsKICBsZXQgX3Nob3dUb29sYmFyX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1Rvb2xiYXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dGaWxlbmFtZV9kZWNvcmF0b3JzOwogIGxldCBfc2hvd0ZpbGVuYW1lX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0ZpbGVuYW1lX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZXNvbHZlZFR5cGVfZGVjb3JhdG9yczsKICBsZXQgX3Jlc29sdmVkVHlwZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Jlc29sdmVkVHlwZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVzb2x2ZWRTcmNfZGVjb3JhdG9yczsKICBsZXQgX3Jlc29sdmVkU3JjX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVzb2x2ZWRTcmNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Jlc29sdmVkVGV4dF9kZWNvcmF0b3JzOwogIGxldCBfcmVzb2x2ZWRUZXh0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVzb2x2ZWRUZXh0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZXNvbHZlZExhbmdfZGVjb3JhdG9yczsKICBsZXQgX3Jlc29sdmVkTGFuZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Jlc29sdmVkTGFuZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbG9hZGluZ19kZWNvcmF0b3JzOwogIGxldCBfbG9hZGluZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Vycm9yX2RlY29yYXRvcnM7CiAgbGV0IF9lcnJvcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Vycm9yX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNQcmV2aWV3MiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3VybF9kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfZmlsZV9kZWNvcmF0b3JzID0gW241KHsgYXR0cmlidXRlOiBmYWxzZSB9KV07CiAgICAgIF9iYXNlNjRfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX3RleHRDb250ZW50X2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9jb250ZW50VHlwZV9kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfbGFuZ3VhZ2VfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX21pbWVUeXBlX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9maWxlbmFtZV9kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfc2hvd1Rvb2xiYXJfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfc2hvd0ZpbGVuYW1lX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3Jlc29sdmVkVHlwZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfcmVzb2x2ZWRTcmNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3Jlc29sdmVkVGV4dF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfcmVzb2x2ZWRMYW5nX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9sb2FkaW5nX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9lcnJvcl9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGU3NCh0aGlzLCBudWxsLCBfdXJsX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInVybCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidXJsIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnVybCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudXJsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3VybF9pbml0aWFsaXplcnMsIF91cmxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3NCh0aGlzLCBudWxsLCBfZmlsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJmaWxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJmaWxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmZpbGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmZpbGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZmlsZV9pbml0aWFsaXplcnMsIF9maWxlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzQodGhpcywgbnVsbCwgX2Jhc2U2NF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJiYXNlNjQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImJhc2U2NCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5iYXNlNjQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmJhc2U2NCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9iYXNlNjRfaW5pdGlhbGl6ZXJzLCBfYmFzZTY0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzQodGhpcywgbnVsbCwgX3RleHRDb250ZW50X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRleHRDb250ZW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0ZXh0Q29udGVudCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50ZXh0Q29udGVudCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGV4dENvbnRlbnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGV4dENvbnRlbnRfaW5pdGlhbGl6ZXJzLCBfdGV4dENvbnRlbnRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3NCh0aGlzLCBudWxsLCBfY29udGVudFR5cGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29udGVudFR5cGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNvbnRlbnRUeXBlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNvbnRlbnRUeXBlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jb250ZW50VHlwZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jb250ZW50VHlwZV9pbml0aWFsaXplcnMsIF9jb250ZW50VHlwZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc0KHRoaXMsIG51bGwsIF9sYW5ndWFnZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsYW5ndWFnZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibGFuZ3VhZ2UiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubGFuZ3VhZ2UsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxhbmd1YWdlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xhbmd1YWdlX2luaXRpYWxpemVycywgX2xhbmd1YWdlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzQodGhpcywgbnVsbCwgX21pbWVUeXBlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1pbWVUeXBlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtaW1lVHlwZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5taW1lVHlwZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWltZVR5cGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWltZVR5cGVfaW5pdGlhbGl6ZXJzLCBfbWltZVR5cGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3NCh0aGlzLCBudWxsLCBfZmlsZW5hbWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZmlsZW5hbWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZpbGVuYW1lIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmZpbGVuYW1lLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5maWxlbmFtZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9maWxlbmFtZV9pbml0aWFsaXplcnMsIF9maWxlbmFtZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc0KHRoaXMsIG51bGwsIF9zaG93VG9vbGJhcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93VG9vbGJhciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd1Rvb2xiYXIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2hvd1Rvb2xiYXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dUb29sYmFyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dUb29sYmFyX2luaXRpYWxpemVycywgX3Nob3dUb29sYmFyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzQodGhpcywgbnVsbCwgX3Nob3dGaWxlbmFtZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93RmlsZW5hbWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNob3dGaWxlbmFtZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93RmlsZW5hbWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dGaWxlbmFtZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93RmlsZW5hbWVfaW5pdGlhbGl6ZXJzLCBfc2hvd0ZpbGVuYW1lX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzQodGhpcywgbnVsbCwgX3Jlc29sdmVkVHlwZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJyZXNvbHZlZFR5cGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInJlc29sdmVkVHlwZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5yZXNvbHZlZFR5cGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnJlc29sdmVkVHlwZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9yZXNvbHZlZFR5cGVfaW5pdGlhbGl6ZXJzLCBfcmVzb2x2ZWRUeXBlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzQodGhpcywgbnVsbCwgX3Jlc29sdmVkU3JjX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJlc29sdmVkU3JjIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJyZXNvbHZlZFNyYyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5yZXNvbHZlZFNyYywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucmVzb2x2ZWRTcmMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcmVzb2x2ZWRTcmNfaW5pdGlhbGl6ZXJzLCBfcmVzb2x2ZWRTcmNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3NCh0aGlzLCBudWxsLCBfcmVzb2x2ZWRUZXh0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJlc29sdmVkVGV4dCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicmVzb2x2ZWRUZXh0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJlc29sdmVkVGV4dCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucmVzb2x2ZWRUZXh0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Jlc29sdmVkVGV4dF9pbml0aWFsaXplcnMsIF9yZXNvbHZlZFRleHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3NCh0aGlzLCBudWxsLCBfcmVzb2x2ZWRMYW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJlc29sdmVkTGFuZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicmVzb2x2ZWRMYW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJlc29sdmVkTGFuZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucmVzb2x2ZWRMYW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Jlc29sdmVkTGFuZ19pbml0aWFsaXplcnMsIF9yZXNvbHZlZExhbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3NCh0aGlzLCBudWxsLCBfbG9hZGluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsb2FkaW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsb2FkaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmxvYWRpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxvYWRpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbG9hZGluZ19pbml0aWFsaXplcnMsIF9sb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzQodGhpcywgbnVsbCwgX2Vycm9yX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImVycm9yIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJlcnJvciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5lcnJvciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZXJyb3IgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZXJyb3JfaW5pdGlhbGl6ZXJzLCBfZXJyb3JfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3NChudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNQcmV2aWV3MiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jNDk7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiTWVkaWEiLCAiRGF0YSBWaWV3Il07CiAgICAjdXJsX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF91cmxfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICAvLyBDb250ZW50IHNvdXJjZXMgKHVzZSBvbmUpCiAgICBnZXQgdXJsKCkgewogICAgICByZXR1cm4gdGhpcy4jdXJsX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdXJsKHZhbHVlMikgewogICAgICB0aGlzLiN1cmxfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNmaWxlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfdXJsX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfZmlsZV9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgZ2V0IGZpbGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNmaWxlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZmlsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZmlsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2Jhc2U2NF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzUodGhpcywgX2ZpbGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF9iYXNlNjRfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGJhc2U2NCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2Jhc2U2NF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGJhc2U2NCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYmFzZTY0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdGV4dENvbnRlbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF9iYXNlNjRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF90ZXh0Q29udGVudF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgdGV4dENvbnRlbnQoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0ZXh0Q29udGVudF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRleHRDb250ZW50KHZhbHVlMikgewogICAgICB0aGlzLiN0ZXh0Q29udGVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NvbnRlbnRUeXBlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfdGV4dENvbnRlbnRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF9jb250ZW50VHlwZV9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgLy8gSGludHMgJiBvdmVycmlkZXMKICAgIGdldCBjb250ZW50VHlwZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvbnRlbnRUeXBlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29udGVudFR5cGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2NvbnRlbnRUeXBlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbGFuZ3VhZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF9jb250ZW50VHlwZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzUodGhpcywgX2xhbmd1YWdlX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBsYW5ndWFnZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xhbmd1YWdlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbGFuZ3VhZ2UodmFsdWUyKSB7CiAgICAgIHRoaXMuI2xhbmd1YWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWltZVR5cGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF9sYW5ndWFnZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzUodGhpcywgX21pbWVUeXBlX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBtaW1lVHlwZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21pbWVUeXBlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWltZVR5cGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI21pbWVUeXBlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZmlsZW5hbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF9taW1lVHlwZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzUodGhpcywgX2ZpbGVuYW1lX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBmaWxlbmFtZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2ZpbGVuYW1lX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZmlsZW5hbWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2ZpbGVuYW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd1Rvb2xiYXJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF9maWxlbmFtZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzUodGhpcywgX3Nob3dUb29sYmFyX2luaXRpYWxpemVycywgdHJ1ZSkpOwogICAgLy8gVUkKICAgIGdldCBzaG93VG9vbGJhcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dUb29sYmFyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd1Rvb2xiYXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dUb29sYmFyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd0ZpbGVuYW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfc2hvd1Rvb2xiYXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF9zaG93RmlsZW5hbWVfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgc2hvd0ZpbGVuYW1lKCkgewogICAgICByZXR1cm4gdGhpcy4jc2hvd0ZpbGVuYW1lX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd0ZpbGVuYW1lKHZhbHVlMikgewogICAgICB0aGlzLiNzaG93RmlsZW5hbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNyZXNvbHZlZFR5cGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF9zaG93RmlsZW5hbWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF9yZXNvbHZlZFR5cGVfaW5pdGlhbGl6ZXJzLCAidW5rbm93biIpKTsKICAgIC8vIEludGVybmFsCiAgICBnZXQgcmVzb2x2ZWRUeXBlKCkgewogICAgICByZXR1cm4gdGhpcy4jcmVzb2x2ZWRUeXBlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcmVzb2x2ZWRUeXBlKHZhbHVlMikgewogICAgICB0aGlzLiNyZXNvbHZlZFR5cGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNyZXNvbHZlZFNyY19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzUodGhpcywgX3Jlc29sdmVkVHlwZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzUodGhpcywgX3Jlc29sdmVkU3JjX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCByZXNvbHZlZFNyYygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Jlc29sdmVkU3JjX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcmVzb2x2ZWRTcmModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Jlc29sdmVkU3JjX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcmVzb2x2ZWRUZXh0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfcmVzb2x2ZWRTcmNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF9yZXNvbHZlZFRleHRfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IHJlc29sdmVkVGV4dCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Jlc29sdmVkVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHJlc29sdmVkVGV4dCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcmVzb2x2ZWRUZXh0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcmVzb2x2ZWRMYW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfcmVzb2x2ZWRUZXh0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfcmVzb2x2ZWRMYW5nX2luaXRpYWxpemVycywgInRleHQiKSk7CiAgICBnZXQgcmVzb2x2ZWRMYW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jcmVzb2x2ZWRMYW5nX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcmVzb2x2ZWRMYW5nKHZhbHVlMikgewogICAgICB0aGlzLiNyZXNvbHZlZExhbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfcmVzb2x2ZWRMYW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfbG9hZGluZ19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgbG9hZGluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsb2FkaW5nKHZhbHVlMikgewogICAgICB0aGlzLiNsb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZXJyb3JfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF9sb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfZXJyb3JfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGVycm9yKCkgewogICAgICByZXR1cm4gdGhpcy4jZXJyb3JfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBlcnJvcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jZXJyb3JfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIG9iamVjdFVybCA9IChfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF9lcnJvcl9leHRyYUluaXRpYWxpemVycyksICIiKTsKICAgIHJlbmRlcigpIHsKICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSB0aGlzLmZpbGVuYW1lIHx8IHRoaXMuZmlsZT8ubmFtZSB8fCB0aGlzLmdldEZpbGVuYW1lRnJvbVVybCgpIHx8ICIiOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxzdHlsZT4KICAgICAgICA6aG9zdCB7CiAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICB9CgogICAgICAgIC5wcmV2aWV3LWNvbnRhaW5lciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzA5MDkwYiIpfTsKICAgICAgICB9CgogICAgICAgIC5oZWFkZXItYmFyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgICBwYWRkaW5nOiAwIDE2cHg7CiAgICAgICAgICBoZWlnaHQ6IDQwcHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y5ZmFmYiIsICJoc2woMjE1IDIwJSAxNSUpIil9OwogICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgImhzbCgyMTcgMjUlIDIyJSkiKX07CiAgICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB9CgogICAgICAgIC5oZWFkZXItaWNvbiB7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDQ1JSkiLCAiaHNsKDIxNSAxNiUgNzUlKSIpfTsKICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgIH0KCiAgICAgICAgLmhlYWRlci1maWxlbmFtZSB7CiAgICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgZmxleDogMTsKICAgICAgICB9CgogICAgICAgIC5oZWFkZXItYmFkZ2UgewogICAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSg1OSwgMTMwLCAyNDYsIDAuMSkiLCAicmdiYSg1OSwgMTMwLCAyNDYsIDAuMTUpIil9OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiM2MGE1ZmEiKX07CiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgfQoKICAgICAgICAuY29udGVudC1hcmVhIHsKICAgICAgICAgIGZsZXg6IDE7CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgbWluLWhlaWdodDogMjAwcHg7CiAgICAgICAgfQoKICAgICAgICAuY29udGVudC1hcmVhID4gKiB7CiAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB9CgogICAgICAgIGRlZXMtaW1hZ2Utdmlld2VyIHsKICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIH0KCiAgICAgICAgZGVlcy1wZGYtdmlld2VyIHsKICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIH0KCiAgICAgICAgZGVlcy12aWRlby12aWV3ZXIgewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgfQoKICAgICAgICBkZWVzLWF1ZGlvLXZpZXdlciB7CiAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB9CgogICAgICAgIGRlZXMtZGF0YXZpZXctY29kZWJveCB7CiAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB9CgogICAgICAgIC50ZXh0LXZpZXdlciB7CiAgICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgICAgZm9udC1mYW1pbHk6IHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBtb25vc3BhY2U7CiAgICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgICBsaW5lLWhlaWdodDogMS41OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgfQoKICAgICAgICAucGxhY2Vob2xkZXIgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICBnYXA6IDEycHg7CiAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICBtaW4taGVpZ2h0OiAyMDBweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ExYTFhYSIsICIjNzE3MTdhIil9OwogICAgICAgIH0KCiAgICAgICAgLnBsYWNlaG9sZGVyIGRlZXMtaWNvbiB7CiAgICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgICBmb250LXNpemU6IDMycHg7CiAgICAgICAgfQoKICAgICAgICAucGxhY2Vob2xkZXItdGV4dCB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQoKICAgICAgICAubG9hZGluZy1jb250YWluZXIgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgIG1pbi1oZWlnaHQ6IDIwMHB4OwogICAgICAgIH0KCiAgICAgICAgLmxvYWRpbmctc3Bpbm5lciB7CiAgICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICAgIGJvcmRlcjogM3B4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzZjNmNDYiKX07CiAgICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjNjBhNWZhIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgICAgYW5pbWF0aW9uOiBzcGluIDAuOHMgbGluZWFyIGluZmluaXRlOwogICAgICAgIH0KCiAgICAgICAgQGtleWZyYW1lcyBzcGluIHsKICAgICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfQogICAgICAgIH0KCiAgICAgICAgLmVycm9yLWNvbnRhaW5lciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgIGdhcDogOHB4OwogICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgICAgbWluLWhlaWdodDogMjAwcHg7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkYzI2MjYiLCAiI2Y4NzE3MSIpfTsKICAgICAgICB9CgogICAgICAgIC5lcnJvci1jb250YWluZXIgZGVlcy1pY29uIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMzJweDsKICAgICAgICB9CgogICAgICAgIC5lcnJvci10ZXh0IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICB9CiAgICAgIDwvc3R5bGU+CgogICAgICA8ZGl2IGNsYXNzPSJwcmV2aWV3LWNvbnRhaW5lciI+CiAgICAgICAgJHt0aGlzLnNob3dGaWxlbmFtZSAmJiBkaXNwbGF5TmFtZSA/IGIyYAogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGVyLWJhciI+CiAgICAgICAgICAgIDxkZWVzLWljb24gY2xhc3M9ImhlYWRlci1pY29uIiBpY29uPSIke1RZUEVfSUNPTlNbdGhpcy5yZXNvbHZlZFR5cGVdfSI+PC9kZWVzLWljb24+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJoZWFkZXItZmlsZW5hbWUiPiR7ZGlzcGxheU5hbWV9PC9zcGFuPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iaGVhZGVyLWJhZGdlIj4ke3RoaXMucmVzb2x2ZWRUeXBlfTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGAgOiAiIn0KCiAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudC1hcmVhIj4KICAgICAgICAgICR7dGhpcy5lcnJvciA/IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJlcnJvci1jb250YWluZXIiPgogICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOkFsZXJ0VHJpYW5nbGUiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvci10ZXh0Ij4ke3RoaXMuZXJyb3J9PC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGAgOiB0aGlzLmxvYWRpbmcgPyBiMmAKICAgICAgICAgICAgPGRpdiBjbGFzcz0ibG9hZGluZy1jb250YWluZXIiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxvYWRpbmctc3Bpbm5lciI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYCA6IHRoaXMucmVuZGVyQ29udGVudCgpfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJDb250ZW50KCkgewogICAgICBzd2l0Y2ggKHRoaXMucmVzb2x2ZWRUeXBlKSB7CiAgICAgICAgY2FzZSAiaW1hZ2UiOgogICAgICAgICAgcmV0dXJuIGIyYAogICAgICAgICAgPGRlZXMtaW1hZ2Utdmlld2VyCiAgICAgICAgICAgIC5zcmM9JHt0aGlzLnJlc29sdmVkU3JjfQogICAgICAgICAgICAuc2hvd1Rvb2xiYXI9JHt0aGlzLnNob3dUb29sYmFyfQogICAgICAgICAgICBhbHQ9IiR7dGhpcy5maWxlbmFtZSB8fCAiIn0iCiAgICAgICAgICA+PC9kZWVzLWltYWdlLXZpZXdlcj4KICAgICAgICBgOwogICAgICAgIGNhc2UgInBkZiI6CiAgICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgICA8ZGVlcy1wZGYtdmlld2VyCiAgICAgICAgICAgIC5wZGZVcmw9JHt0aGlzLnJlc29sdmVkU3JjfQogICAgICAgICAgICAuc2hvd1Rvb2xiYXI9JHt0aGlzLnNob3dUb29sYmFyfQogICAgICAgICAgICBpbml0aWFsWm9vbT0icGFnZS1maXQiCiAgICAgICAgICA+PC9kZWVzLXBkZi12aWV3ZXI+CiAgICAgICAgYDsKICAgICAgICBjYXNlICJhdWRpbyI6CiAgICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgICA8ZGVlcy1hdWRpby12aWV3ZXIKICAgICAgICAgICAgLnNyYz0ke3RoaXMucmVzb2x2ZWRTcmN9CiAgICAgICAgICAgIC50aXRsZT0ke3RoaXMuZmlsZW5hbWUgfHwgdGhpcy5maWxlPy5uYW1lIHx8ICIifQogICAgICAgICAgPjwvZGVlcy1hdWRpby12aWV3ZXI+CiAgICAgICAgYDsKICAgICAgICBjYXNlICJ2aWRlbyI6CiAgICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgICA8ZGVlcy12aWRlby12aWV3ZXIKICAgICAgICAgICAgLnNyYz0ke3RoaXMucmVzb2x2ZWRTcmN9CiAgICAgICAgICA+PC9kZWVzLXZpZGVvLXZpZXdlcj4KICAgICAgICBgOwogICAgICAgIGNhc2UgImNvZGUiOgogICAgICAgICAgcmV0dXJuIGIyYAogICAgICAgICAgPGRlZXMtZGF0YXZpZXctY29kZWJveAogICAgICAgICAgICAucHJvZ0xhbmc9JHt0aGlzLnJlc29sdmVkTGFuZ30KICAgICAgICAgICAgLmNvZGVUb0Rpc3BsYXk9JHt0aGlzLnJlc29sdmVkVGV4dH0KICAgICAgICAgID48L2RlZXMtZGF0YXZpZXctY29kZWJveD4KICAgICAgICBgOwogICAgICAgIGNhc2UgInRleHQiOgogICAgICAgICAgcmV0dXJuIGIyYDxwcmUgY2xhc3M9InRleHQtdmlld2VyIj4ke3RoaXMucmVzb2x2ZWRUZXh0fTwvcHJlPmA7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJldHVybiBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9InBsYWNlaG9sZGVyIj4KICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6RmlsZVF1ZXN0aW9uIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InBsYWNlaG9sZGVyLXRleHQiPlByZXZpZXcgbm90IGF2YWlsYWJsZTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGA7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGNvbnN0IHJlbGV2YW50ID0gWyJ1cmwiLCAiZmlsZSIsICJiYXNlNjQiLCAidGV4dENvbnRlbnQiLCAiY29udGVudFR5cGUiLCAibGFuZ3VhZ2UiLCAibWltZVR5cGUiLCAiZmlsZW5hbWUiXTsKICAgICAgY29uc3QgbmVlZHNSZXNvbHZlID0gcmVsZXZhbnQuc29tZSgoa2V5MikgPT4gY2hhbmdlZFByb3BlcnRpZXMuaGFzKGtleTIpKTsKICAgICAgaWYgKG5lZWRzUmVzb2x2ZSkgewogICAgICAgIGF3YWl0IHRoaXMucmVzb2x2ZUNvbnRlbnQoKTsKICAgICAgfQogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMucmV2b2tlT2JqZWN0VXJsKCk7CiAgICB9CiAgICBhc3luYyByZXNvbHZlQ29udGVudCgpIHsKICAgICAgdGhpcy5lcnJvciA9ICIiOwogICAgICB0aGlzLnJldm9rZU9iamVjdFVybCgpOwogICAgICB0aGlzLnJlc29sdmVkVHlwZSA9IHRoaXMuZGV0ZWN0VHlwZSgpOwogICAgICB0cnkgewogICAgICAgIGlmICh0aGlzLnVybCkgewogICAgICAgICAgdGhpcy5yZXNvbHZlZFNyYyA9IHRoaXMudXJsOwogICAgICAgICAgaWYgKHRoaXMucmVzb2x2ZWRUeXBlID09PSAiY29kZSIgfHwgdGhpcy5yZXNvbHZlZFR5cGUgPT09ICJ0ZXh0IikgewogICAgICAgICAgICBpZiAoIXRoaXMudGV4dENvbnRlbnQpIHsKICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godGhpcy51cmwpOwogICAgICAgICAgICAgIHRoaXMucmVzb2x2ZWRUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpOwogICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMucmVzb2x2ZWRUZXh0ID0gdGhpcy50ZXh0Q29udGVudDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWxlKSB7CiAgICAgICAgICB0aGlzLm9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwodGhpcy5maWxlKTsKICAgICAgICAgIHRoaXMucmVzb2x2ZWRTcmMgPSB0aGlzLm9iamVjdFVybDsKICAgICAgICAgIGlmICh0aGlzLnJlc29sdmVkVHlwZSA9PT0gImNvZGUiIHx8IHRoaXMucmVzb2x2ZWRUeXBlID09PSAidGV4dCIpIHsKICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5yZXNvbHZlZFRleHQgPSBhd2FpdCB0aGlzLmZpbGUudGV4dCgpOwogICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYmFzZTY0KSB7CiAgICAgICAgICBjb25zdCBtaW1lID0gdGhpcy5taW1lVHlwZSB8fCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjsKICAgICAgICAgIHRoaXMucmVzb2x2ZWRTcmMgPSBgZGF0YToke21pbWV9O2Jhc2U2NCwke3RoaXMuYmFzZTY0fWA7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRleHRDb250ZW50KSB7CiAgICAgICAgICB0aGlzLnJlc29sdmVkVGV4dCA9IHRoaXMudGV4dENvbnRlbnQ7CiAgICAgICAgfQogICAgICB9IGNhdGNoIHsKICAgICAgICB0aGlzLmVycm9yID0gIkZhaWxlZCB0byBsb2FkIGNvbnRlbnQiOwogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICB9CiAgICAgIHRoaXMucmVzb2x2ZWRMYW5nID0gdGhpcy5yZXNvbHZlTGFuZ3VhZ2UoKTsKICAgIH0KICAgIGRldGVjdFR5cGUoKSB7CiAgICAgIGlmICh0aGlzLmNvbnRlbnRUeXBlKQogICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRUeXBlOwogICAgICBjb25zdCBtaW1lID0gdGhpcy5taW1lVHlwZSB8fCB0aGlzLmZpbGU/LnR5cGUgfHwgIiI7CiAgICAgIGlmIChtaW1lKSB7CiAgICAgICAgaWYgKG1pbWUgPT09ICJhcHBsaWNhdGlvbi9wZGYiKQogICAgICAgICAgcmV0dXJuICJwZGYiOwogICAgICAgIGZvciAoY29uc3QgW3ByZWZpeDQsIHR5cGU1XSBvZiBPYmplY3QuZW50cmllcyhNSU1FX1BSRUZJWF9NQVApKSB7CiAgICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoKHByZWZpeDQpKQogICAgICAgICAgICByZXR1cm4gdHlwZTU7CiAgICAgICAgfQogICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGgoInRleHQvIikpCiAgICAgICAgICByZXR1cm4gInRleHQiOwogICAgICB9CiAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZ2V0RXh0ZW5zaW9uKCk7CiAgICAgIGlmIChleHQgJiYgRVhURU5TSU9OX01BUFtleHRdKQogICAgICAgIHJldHVybiBFWFRFTlNJT05fTUFQW2V4dF07CiAgICAgIGlmICh0aGlzLnRleHRDb250ZW50KSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2UgPyAiY29kZSIgOiAidGV4dCI7CiAgICAgIH0KICAgICAgcmV0dXJuICJ1bmtub3duIjsKICAgIH0KICAgIGdldEV4dGVuc2lvbigpIHsKICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZmlsZW5hbWUgfHwgdGhpcy5maWxlPy5uYW1lIHx8ICIiOwogICAgICBpZiAobmFtZSkgewogICAgICAgIGNvbnN0IHBhcnRzID0gbmFtZS5zcGxpdCgiLiIpOwogICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKQogICAgICAgICAgcmV0dXJuIHBhcnRzLnBvcCgpLnRvTG93ZXJDYXNlKCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMudXJsKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHBhdGhuYW1lID0gbmV3IFVSTCh0aGlzLnVybCwgImh0dHBzOi8vcGxhY2Vob2xkZXIuY29tIikucGF0aG5hbWU7CiAgICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGhuYW1lLnNwbGl0KCIuIik7CiAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMSkKICAgICAgICAgICAgcmV0dXJuIHBhcnRzLnBvcCgpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGdldEZpbGVuYW1lRnJvbVVybCgpIHsKICAgICAgaWYgKCF0aGlzLnVybCkKICAgICAgICByZXR1cm4gIiI7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcGF0aG5hbWUgPSBuZXcgVVJMKHRoaXMudXJsLCAiaHR0cHM6Ly9wbGFjZWhvbGRlci5jb20iKS5wYXRobmFtZTsKICAgICAgICByZXR1cm4gcGF0aG5hbWUuc3BsaXQoIi8iKS5wb3AoKSB8fCAiIjsKICAgICAgfSBjYXRjaCB7CiAgICAgICAgcmV0dXJuICIiOwogICAgICB9CiAgICB9CiAgICByZXNvbHZlTGFuZ3VhZ2UoKSB7CiAgICAgIGlmICh0aGlzLmxhbmd1YWdlKQogICAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlOwogICAgICBjb25zdCBleHQgPSB0aGlzLmdldEV4dGVuc2lvbigpOwogICAgICByZXR1cm4gRVhURU5TSU9OX0xBTkdfTUFQW2V4dF0gfHwgInRleHQiOwogICAgfQogICAgcmV2b2tlT2JqZWN0VXJsKCkgewogICAgICBpZiAodGhpcy5vYmplY3RVcmwpIHsKICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMub2JqZWN0VXJsKTsKICAgICAgICB0aGlzLm9iamVjdFVybCA9ICIiOwogICAgICB9CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczc1KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzUHJldmlldzIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW1lZGlhL2RlZXMtcGRmL2NvbXBvbmVudC5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2Rpc3RfdHMoKTsKaW5pdF9kZWVzX2ljb24oKTsKdmFyIF9fZXNEZWNvcmF0ZTc1ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM3NiA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1BkZiA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtcGRmIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfcGRmVXJsX2RlY29yYXRvcnM7CiAgbGV0IF9wZGZVcmxfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wZGZVcmxfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1BkZjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9wZGZVcmxfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX19lc0RlY29yYXRlNzUodGhpcywgbnVsbCwgX3BkZlVybF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwZGZVcmwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInBkZlVybCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5wZGZVcmwsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnBkZlVybCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wZGZVcmxfaW5pdGlhbGl6ZXJzLCBfcGRmVXJsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzUobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzUGRmMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAvLyBERU1PCiAgICBzdGF0aWMgZGVtbyA9ICgpID0+IGIyYCA8ZGVlcy1wZGY+PC9kZWVzLXBkZj4gYDsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJNZWRpYSIsICJQREYiXTsKICAgICNwZGZVcmxfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNzYodGhpcywgX3BkZlVybF9pbml0aWFsaXplcnMsICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbW96aWxsYS9wZGYuanMvYmEyZWRlYWUvZXhhbXBsZXMvbGVhcm5pbmcvaGVsbG93b3JsZC5wZGYiKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgcGRmVXJsKCkgewogICAgICByZXR1cm4gdGhpcy4jcGRmVXJsX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcGRmVXJsKHZhbHVlMikgewogICAgICB0aGlzLiNwZGZVcmxfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBfX3J1bkluaXRpYWxpemVyczc2KHRoaXMsIF9wZGZVcmxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxzdHlsZT4KICAgICAgICA6aG9zdCB7CiAgICAgICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCBzYW5zLXNlcmlmOwogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgbWF4LXdpZHRoOiA4MDBweDsKICAgICAgICB9CiAgICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgfQoKICAgICAgICAjcGRmY2FudmFzIHsKICAgICAgICAgIGJveC1zaGFkb3c6IDBweCAwcHggNXB4ICNjY2M7CiAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB9CiAgICAgIDwvc3R5bGU+CiAgICAgIDxjYW52YXMKICAgICAgICBpZD0icGRmY2FudmFzIgogICAgICAgIC5oZWlnaHQ9JHswfQogICAgICAgIC53aWR0aD0kezB9CgogICAgICA+PC9jYW52YXM+CiAgICBgOwogICAgfQogICAgc3RhdGljIHBkZkpzUmVhZHk7CiAgICBzdGF0aWMgcGRmanNMaWI7CiAgICAvLyB0eXBlb2YgcGRmanNUeXBlczsKICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBpZiAoIURlZXNQZGYyLnBkZkpzUmVhZHkpIHsKICAgICAgICBjb25zdCBwZGZKc1JlYWR5RGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMyNS5wbHVnaW5zLnNtYXJ0cHJvbWlzZS5kZWZlcigpOwogICAgICAgIERlZXNQZGYyLnBkZkpzUmVhZHkgPSBwZGZKc1JlYWR5RGVmZXJyZWQucHJvbWlzZTsKICAgICAgICBEZWVzUGRmMi5wZGZqc0xpYiA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9wZGZqcy1kaXN0QDQuMC4zNzkvK2VzbSIpOwogICAgICAgIERlZXNQZGYyLnBkZmpzTGliLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjID0gImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vcGRmanMtZGlzdEA0LjAuMzc5L2J1aWxkL3BkZi53b3JrZXIubWpzIjsKICAgICAgICBwZGZKc1JlYWR5RGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICB9CiAgICAgIGF3YWl0IERlZXNQZGYyLnBkZkpzUmVhZHk7CiAgICAgIHRoaXMuZGlzcGxheUNvbnRlbnQoKTsKICAgIH0KICAgIGFzeW5jIGRpc3BsYXlDb250ZW50KCkgewogICAgICBhd2FpdCBEZWVzUGRmMi5wZGZKc1JlYWR5OwogICAgICBjb25zdCBsb2FkaW5nVGFzayA9IERlZXNQZGYyLnBkZmpzTGliLmdldERvY3VtZW50KHRoaXMucGRmVXJsKTsKICAgICAgbG9hZGluZ1Rhc2sucHJvbWlzZS50aGVuKChwZGYpID0+IHsKICAgICAgICBjb25zb2xlLmxvZygiUERGIGxvYWRlZCIpOwogICAgICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSAxOwogICAgICAgIHBkZi5nZXRQYWdlKHBhZ2VOdW1iZXIpLnRoZW4oKHBhZ2UpID0+IHsKICAgICAgICAgIGNvbnNvbGUubG9nKCJQYWdlIGxvYWRlZCIpOwogICAgICAgICAgY29uc3Qgc2NhbGUgPSAxMDsKICAgICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gcGFnZS5nZXRWaWV3cG9ydCh7IHNjYWxlIH0pOwogICAgICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIiNwZGZjYW52YXMiKTsKICAgICAgICAgIGNvbnN0IGNvbnRleHQyID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gdmlld3BvcnQuaGVpZ2h0OwogICAgICAgICAgY2FudmFzLndpZHRoID0gdmlld3BvcnQud2lkdGg7CiAgICAgICAgICBjb25zdCByZW5kZXJDb250ZXh0ID0gewogICAgICAgICAgICBjYW52YXNDb250ZXh0OiBjb250ZXh0MiwKICAgICAgICAgICAgdmlld3BvcnQKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCByZW5kZXJUYXNrID0gcGFnZS5yZW5kZXIocmVuZGVyQ29udGV4dCk7CiAgICAgICAgICByZW5kZXJUYXNrLnByb21pc2UudGhlbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coIlBhZ2UgcmVuZGVyZWQiKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9LCAocmVhc29uKSA9PiB7CiAgICAgICAgY29uc29sZS5lcnJvcihyZWFzb24pOwogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogUHJvdmlkZSBjb250ZXh0IG1lbnUgaXRlbXMgZm9yIHRoZSBnbG9iYWwgY29udGV4dCBtZW51IGhhbmRsZXIKICAgICAqLwogICAgZ2V0Q29udGV4dE1lbnVJdGVtcygpIHsKICAgICAgcmV0dXJuIFsKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiT3BlbiBQREYgaW4gTmV3IFRhYiIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpFeHRlcm5hbExpbmsiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIHdpbmRvdy5vcGVuKHRoaXMucGRmVXJsLCAiX2JsYW5rIik7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7IGRpdmlkZXI6IHRydWUgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiQ29weSBQREYgVVJMIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOkNvcHkiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRoaXMucGRmVXJsKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJEb3dubG9hZCBQREYiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6RG93bmxvYWQiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGxpbmszID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwogICAgICAgICAgICBsaW5rMy5ocmVmID0gdGhpcy5wZGZVcmw7CiAgICAgICAgICAgIGxpbmszLmRvd25sb2FkID0gdGhpcy5wZGZVcmwuc3BsaXQoIi8iKS5wb3AoKSB8fCAiZG9jdW1lbnQucGRmIjsKICAgICAgICAgICAgbGluazMuY2xpY2soKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIF07CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczc2KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzUGRmMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy10aWxlLXNoYXJlZC9zdHlsZXMuanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIHRpbGVCYXNlU3R5bGVzID0gWwogIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICBpYAogICAgOmhvc3QgewogICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIH0KCiAgICAudGlsZS1jb250YWluZXIgewogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIHdpZHRoOiAyMDBweDsKICAgICAgaGVpZ2h0OiAyNjBweDsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk4JSkiLCAiaHNsKDIxNSAyMCUgMTQlKSIpfTsKICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycyBlYXNlLCBib3gtc2hhZG93IDAuMnMgZWFzZTsKICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMTIpIiwgInJnYmEoMCwgMCwgMCwgMC4yNCkiKX07CiAgICB9CgogICAgLnRpbGUtY29udGFpbmVyLmNsaWNrYWJsZSB7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIH0KCiAgICAudGlsZS1jb250YWluZXIuY2xpY2thYmxlOmhvdmVyIHsKICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpOwogICAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMTIpIiwgInJnYmEoMCwgMCwgMCwgMC4zKSIpfTsKICAgIH0KCiAgICAudGlsZS1jb250YWluZXIuY2xpY2thYmxlOmhvdmVyIC50aWxlLW92ZXJsYXkgewogICAgICBvcGFjaXR5OiAxOwogICAgfQoKICAgIC50aWxlLWNvbnRlbnQgewogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgfQoKICAgIC50aWxlLW92ZXJsYXkgewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHRvcDogMDsKICAgICAgbGVmdDogMDsKICAgICAgcmlnaHQ6IDA7CiAgICAgIGJvdHRvbTogMDsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC43KSIsICJyZ2JhKDAsIDAsIDAsIDAuOCkiKX07CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICBnYXA6IDhweDsKICAgICAgb3BhY2l0eTogMDsKICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2U7CiAgICAgIHotaW5kZXg6IDIwOwogICAgfQoKICAgIC50aWxlLW92ZXJsYXkgZGVlcy1pY29uIHsKICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICBjb2xvcjogd2hpdGU7CiAgICB9CgogICAgLnRpbGUtb3ZlcmxheSBzcGFuIHsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICBmb250LXdlaWdodDogNTAwOwogICAgICBjb2xvcjogd2hpdGU7CiAgICB9CgogICAgLnRpbGUtaW5mbyB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgYm90dG9tOiA4cHg7CiAgICAgIGxlZnQ6IDhweDsKICAgICAgcmlnaHQ6IDhweDsKICAgICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlIC8gMC45MikiLCAiaHNsKDIxNSAyMCUgMTIlIC8gMC45MikiKX07CiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgZ2FwOiA2cHg7CiAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDE2JSA0NSUpIiwgImhzbCgyMTUgMTYlIDc1JSkiKX07CiAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMnB4KTsKICAgICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTsKICAgICAgei1pbmRleDogMTA7CiAgICB9CgogICAgLnRpbGUtaW5mbyBkZWVzLWljb24gewogICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgNjAlKSIsICJoc2woMjEzIDkzJSA2OCUpIil9OwogICAgfQoKICAgIC50aWxlLWluZm8tdGV4dCB7CiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIH0KCiAgICAudGlsZS1iYWRnZSB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgdG9wOiA4cHg7CiAgICAgIGxlZnQ6IDhweDsKICAgICAgcmlnaHQ6IDhweDsKICAgICAgcGFkZGluZzogNXB4IDhweDsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDAlIC8gMC43KSIsICJoc2woMCAwJSAxMDAlIC8gMC45KSIpfTsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJ3aGl0ZSIsICJoc2woMjE1IDIwJSAxMiUpIil9OwogICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTJweCk7CiAgICAgIHotaW5kZXg6IDE1OwogICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgYW5pbWF0aW9uOiBmYWRlSW4gMC4ycyBlYXNlOwogICAgfQoKICAgIC50aWxlLWJhZGdlLWNvcm5lciB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgYm90dG9tOiA4cHg7CiAgICAgIHJpZ2h0OiA4cHg7CiAgICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAwJSAvIDAuNikiLCAiaHNsKDAgMCUgMTAwJSAvIDAuODUpIil9OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIndoaXRlIiwgImhzbCgyMTUgMjAlIDEyJSkiKX07CiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICBmb250LXdlaWdodDogNjAwOwogICAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoOHB4KTsKICAgICAgei1pbmRleDogMTA7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgfQoKICAgIC50aWxlLWJhZGdlLXRvcHJpZ2h0IHsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB0b3A6IDhweDsKICAgICAgcmlnaHQ6IDhweDsKICAgICAgcGFkZGluZzogM3B4IDhweDsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDAlIC8gMC42KSIsICJoc2woMCAwJSAxMDAlIC8gMC44NSkiKX07CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgid2hpdGUiLCAiaHNsKDIxNSAyMCUgMTIlKSIpfTsKICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpOwogICAgICB6LWluZGV4OiAxNTsKICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB9CgogICAgLyogU2hpZnQgYm90dG9tIGJhZGdlcyB1cCB3aGVuIGxhYmVsIGlzIHByZXNlbnQgKi8KICAgIC50aWxlLWNvbnRhaW5lcjpoYXMoLnRpbGUtbGFiZWwpIC50aWxlLWJhZGdlLWNvcm5lciB7CiAgICAgIGJvdHRvbTogMzNweDsKICAgIH0KCiAgICAudGlsZS1jb250YWluZXI6aGFzKC50aWxlLWxhYmVsKSAudGlsZS1pbmZvIHsKICAgICAgYm90dG9tOiAzM3B4OwogICAgfQoKICAgIC50aWxlLWxvYWRpbmcsCiAgICAudGlsZS1lcnJvciB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgdG9wOiAwOwogICAgICBsZWZ0OiAwOwogICAgICByaWdodDogMDsKICAgICAgYm90dG9tOiAwOwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgZ2FwOiAxMnB4OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDQ1JSkiLCAiaHNsKDIxNSAxNiUgNzUlKSIpfTsKICAgIH0KCiAgICAudGlsZS1sb2FkaW5nIHsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk5JSkiLCAiaHNsKDIxNSAyMCUgMTQlKSIpfTsKICAgIH0KCiAgICAudGlsZS1lcnJvciB7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA3MiUgOTglKSIsICJoc2woMCA2MiUgMjAlKSIpfTsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA3MiUgNDAlKSIsICJoc2woMCA3MCUgNjglKSIpfTsKICAgIH0KCiAgICAudGlsZS1lcnJvciBkZWVzLWljb24gewogICAgICBmb250LXNpemU6IDMycHg7CiAgICB9CgogICAgLnRpbGUtc3Bpbm5lciB7CiAgICAgIHdpZHRoOiAyNHB4OwogICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgYm9yZGVyOiAycHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQgMzElIDg2JSkiLCAiaHNsKDIxNyAyNSUgMjglKSIpfTsKICAgICAgYm9yZGVyLXRvcC1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTcgOTElIDYwJSkiLCAiaHNsKDIxMyA5MyUgNjglKSIpfTsKICAgICAgYW5pbWF0aW9uOiBzcGluIDAuOHMgbGluZWFyIGluZmluaXRlOwogICAgfQoKICAgIC50aWxlLWxvYWRpbmctdGV4dCwKICAgIC50aWxlLWVycm9yLXRleHQgewogICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICB9CgogICAgLnRpbGUtbGFiZWwgewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIGJvdHRvbTogMDsKICAgICAgbGVmdDogMDsKICAgICAgcmlnaHQ6IDA7CiAgICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSAvIDAuOTUpIiwgImhzbCgyMTUgMjAlIDEyJSAvIDAuOTUpIil9OwogICAgICBmb250LXNpemU6IDExcHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAxNiUgMzUlKSIsICJoc2woMjE1IDE2JSA3NSUpIil9OwogICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgei1pbmRleDogMTA7CiAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMnB4KTsKICAgIH0KCiAgICBAa2V5ZnJhbWVzIHNwaW4gewogICAgICB0byB7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgfQogICAgfQoKICAgIEBrZXlmcmFtZXMgZmFkZUluIHsKICAgICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTRweCk7CiAgICAgIH0KICAgICAgdG8gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgICB9CiAgICB9CgogICAgLyogU2l6ZSB2YXJpYW50cyAqLwogICAgOmhvc3QoW3NpemU9InNtYWxsIl0pIC50aWxlLWNvbnRhaW5lciB7CiAgICAgIHdpZHRoOiAxNTBweDsKICAgICAgaGVpZ2h0OiAxOTVweDsKICAgIH0KCiAgICA6aG9zdChbc2l6ZT0ibGFyZ2UiXSkgLnRpbGUtY29udGFpbmVyIHsKICAgICAgd2lkdGg6IDI1MHB4OwogICAgICBoZWlnaHQ6IDMyNXB4OwogICAgfQoKICAgIC8qIEdyaWQgb3B0aW1pemF0aW9ucyAqLwogICAgOmhvc3QoW2dyaWQtbW9kZV0pIC50aWxlLWNvbnRhaW5lciB7CiAgICAgIHdpbGwtY2hhbmdlOiBhdXRvOwogICAgfQogIGAKXTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXRpbGUtc2hhcmVkL0RlZXNUaWxlQmFzZS5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2RlZXNfaWNvbigpOwp2YXIgX19lc0RlY29yYXRlNzYgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczc3ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzVGlsZUJhc2UgPSAoKCkgPT4gewogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfY2xpY2thYmxlX2RlY29yYXRvcnM7CiAgbGV0IF9jbGlja2FibGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGlja2FibGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xvYWRpbmdfZGVjb3JhdG9yczsKICBsZXQgX2xvYWRpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lcnJvcl9kZWNvcmF0b3JzOwogIGxldCBfZXJyb3JfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lcnJvcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2l6ZV9kZWNvcmF0b3JzOwogIGxldCBfc2l6ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NpemVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xhYmVsX2RlY29yYXRvcnM7CiAgbGV0IF9sYWJlbF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgcmV0dXJuIGNsYXNzIERlZXNUaWxlQmFzZSBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfY2xpY2thYmxlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2xvYWRpbmdfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfZXJyb3JfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfc2l6ZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nLCByZWZsZWN0OiB0cnVlIH0pXTsKICAgICAgX2xhYmVsX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfX2VzRGVjb3JhdGU3Nih0aGlzLCBudWxsLCBfY2xpY2thYmxlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNsaWNrYWJsZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY2xpY2thYmxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNsaWNrYWJsZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY2xpY2thYmxlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NsaWNrYWJsZV9pbml0aWFsaXplcnMsIF9jbGlja2FibGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Nih0aGlzLCBudWxsLCBfbG9hZGluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsb2FkaW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsb2FkaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmxvYWRpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxvYWRpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbG9hZGluZ19pbml0aWFsaXplcnMsIF9sb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzYodGhpcywgbnVsbCwgX2Vycm9yX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImVycm9yIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJlcnJvciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5lcnJvciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZXJyb3IgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZXJyb3JfaW5pdGlhbGl6ZXJzLCBfZXJyb3JfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Nih0aGlzLCBudWxsLCBfc2l6ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaXplIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaXplIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNpemUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNpemUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2l6ZV9pbml0aWFsaXplcnMsIF9zaXplX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzYodGhpcywgbnVsbCwgX2xhYmVsX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxhYmVsIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsYWJlbCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sYWJlbCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubGFiZWwgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbGFiZWxfaW5pdGlhbGl6ZXJzLCBfbGFiZWxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gdGlsZUJhc2VTdHlsZXM7CiAgICAjY2xpY2thYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczc3KHRoaXMsIF9jbGlja2FibGVfaW5pdGlhbGl6ZXJzLCB0cnVlKTsKICAgIGdldCBjbGlja2FibGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjbGlja2FibGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjbGlja2FibGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2NsaWNrYWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc3KHRoaXMsIF9jbGlja2FibGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc3KHRoaXMsIF9sb2FkaW5nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBsb2FkaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jbG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxvYWRpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNlcnJvcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzcodGhpcywgX2xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc3KHRoaXMsIF9lcnJvcl9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgZXJyb3IoKSB7CiAgICAgIHJldHVybiB0aGlzLiNlcnJvcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGVycm9yKHZhbHVlMikgewogICAgICB0aGlzLiNlcnJvcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc3KHRoaXMsIF9lcnJvcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzcodGhpcywgX3NpemVfaW5pdGlhbGl6ZXJzLCAiZGVmYXVsdCIpKTsKICAgIGdldCBzaXplKCkgewogICAgICByZXR1cm4gdGhpcy4jc2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNpemUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzcodGhpcywgX3NpemVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc3KHRoaXMsIF9sYWJlbF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgbGFiZWwoKSB7CiAgICAgIHJldHVybiB0aGlzLiNsYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxhYmVsKHZhbHVlMikgewogICAgICB0aGlzLiNsYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgb2JzZXJ2ZXIgPSBfX3J1bkluaXRpYWxpemVyczc3KHRoaXMsIF9sYWJlbF9leHRyYUluaXRpYWxpemVycyk7CiAgICBfdmlzaWJsZSA9IGZhbHNlOwogICAgLyoqIFdoZXRoZXIgdGhpcyB0aWxlIGlzIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSB2aWV3cG9ydCAqLwogICAgZ2V0IGlzVmlzaWJsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuX3Zpc2libGU7CiAgICB9CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdgogICAgICAgIGNsYXNzPSJ0aWxlLWNvbnRhaW5lciAke3RoaXMuY2xpY2thYmxlID8gImNsaWNrYWJsZSIgOiAiIn0gJHt0aGlzLmxvYWRpbmcgPyAibG9hZGluZyIgOiAiIn0gJHt0aGlzLmVycm9yID8gImVycm9yIiA6ICIifSIKICAgICAgICBAY2xpY2s9JHt0aGlzLmhhbmRsZVRpbGVDbGlja30KICAgICAgICBAbW91c2VlbnRlcj0ke3RoaXMub25UaWxlTW91c2VFbnRlcn0KICAgICAgICBAbW91c2VsZWF2ZT0ke3RoaXMub25UaWxlTW91c2VMZWF2ZX0KICAgICAgICBAbW91c2Vtb3ZlPSR7dGhpcy5vblRpbGVNb3VzZU1vdmV9CiAgICAgID4KICAgICAgICAke3RoaXMubG9hZGluZyA/IGIyYAogICAgICAgICAgPGRpdiBjbGFzcz0idGlsZS1sb2FkaW5nIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGlsZS1zcGlubmVyIj48L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGlsZS1sb2FkaW5nLXRleHQiPkxvYWRpbmcuLi48L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGAgOiAiIn0KCiAgICAgICAgJHt0aGlzLmVycm9yID8gYjJgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aWxlLWVycm9yIj4KICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6QWxlcnRUcmlhbmdsZSI+PC9kZWVzLWljb24+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpbGUtZXJyb3ItdGV4dCI+RmFpbGVkIHRvIGxvYWQ8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGAgOiAiIn0KCiAgICAgICAgJHshdGhpcy5sb2FkaW5nICYmICF0aGlzLmVycm9yID8gdGhpcy5yZW5kZXJUaWxlQ29udGVudCgpIDogIiJ9CgogICAgICAgICR7dGhpcy5sYWJlbCA/IGIyYAogICAgICAgICAgPGRpdiBjbGFzcz0idGlsZS1sYWJlbCI+JHt0aGlzLmxhYmVsfTwvZGl2PgogICAgICAgIGAgOiAiIn0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuc2V0dXBJbnRlcnNlY3Rpb25PYnNlcnZlcigpOwogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGlmICh0aGlzLm9ic2VydmVyKSB7CiAgICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgdGhpcy5vYnNlcnZlciA9IHZvaWQgMDsKICAgICAgfQogICAgfQogICAgc2V0dXBJbnRlcnNlY3Rpb25PYnNlcnZlcigpIHsKICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZW50cmllcykgPT4gewogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykgewogICAgICAgICAgY29uc3Qgd2FzVmlzaWJsZSA9IHRoaXMuX3Zpc2libGU7CiAgICAgICAgICB0aGlzLl92aXNpYmxlID0gZW50cnkuaXNJbnRlcnNlY3Rpbmc7CiAgICAgICAgICBpZiAodGhpcy5fdmlzaWJsZSAmJiAhd2FzVmlzaWJsZSkgewogICAgICAgICAgICB0aGlzLm9uQmVjYW1lVmlzaWJsZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwgeyByb290OiBudWxsLCByb290TWFyZ2luOiAiMjAwcHgiLCB0aHJlc2hvbGQ6IDAuMDEgfSk7CiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzKTsKICAgIH0KICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgdGlsZSBmaXJzdCBlbnRlcnMgdGhlIHZpZXdwb3J0LiBPdmVycmlkZSBmb3IgbGF6eSBsb2FkaW5nLiAqLwogICAgb25CZWNhbWVWaXNpYmxlKCkgewogICAgfQogICAgLyoqIENhbGxlZCB3aGVuIG1vdXNlIGVudGVycyB0aGUgdGlsZSBjb250YWluZXIuIE92ZXJyaWRlIGluIHN1YmNsYXNzZXMuICovCiAgICBvblRpbGVNb3VzZUVudGVyKCkgewogICAgfQogICAgLyoqIENhbGxlZCB3aGVuIG1vdXNlIGxlYXZlcyB0aGUgdGlsZSBjb250YWluZXIuIE92ZXJyaWRlIGluIHN1YmNsYXNzZXMuICovCiAgICBvblRpbGVNb3VzZUxlYXZlKCkgewogICAgfQogICAgLyoqIENhbGxlZCB3aGVuIG1vdXNlIG1vdmVzIG92ZXIgdGhlIHRpbGUgY29udGFpbmVyLiBPdmVycmlkZSBpbiBzdWJjbGFzc2VzLiAqLwogICAgb25UaWxlTW91c2VNb3ZlKF9lKSB7CiAgICB9CiAgICBoYW5kbGVUaWxlQ2xpY2soKSB7CiAgICAgIGlmICghdGhpcy5jbGlja2FibGUpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJ0aWxlLWNsaWNrIiwgewogICAgICAgIGRldGFpbDogdGhpcy5nZXRUaWxlQ2xpY2tEZXRhaWwoKSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIC8qKiBSZXR1cm4gdGhlIGRldGFpbCBvYmplY3QgZm9yIHRpbGUtY2xpY2sgZXZlbnRzLiBPdmVycmlkZSBpbiBzdWJjbGFzc2VzLiAqLwogICAgZ2V0VGlsZUNsaWNrRGV0YWlsKCkgewogICAgICByZXR1cm4ge307CiAgICB9CiAgfTsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXBkZi1zaGFyZWQvQ2FudmFzUG9vbC5qcwp2YXIgQ2FudmFzUG9vbCA9IGNsYXNzIHsKICBzdGF0aWMgcG9vbCA9IFtdOwogIHN0YXRpYyBtYXhQb29sU2l6ZSA9IDIwOwogIHN0YXRpYyBNSU5fQ0FOVkFTX1NJWkUgPSAyNTY7CiAgc3RhdGljIE1BWF9DQU5WQVNfU0laRSA9IDQwOTY7CiAgc3RhdGljIGFjcXVpcmUod2lkdGgsIGhlaWdodCkgewogICAgY29uc3Qgc3VpdGFibGUgPSB0aGlzLnBvb2wuZmluZCgoaXRlbSkgPT4gIWl0ZW0uaW5Vc2UgJiYgaXRlbS5jYW52YXMud2lkdGggPj0gd2lkdGggJiYgaXRlbS5jYW52YXMuaGVpZ2h0ID49IGhlaWdodCAmJiBpdGVtLmNhbnZhcy53aWR0aCA8PSB3aWR0aCAqIDEuNSAmJiBpdGVtLmNhbnZhcy5oZWlnaHQgPD0gaGVpZ2h0ICogMS41KTsKICAgIGlmIChzdWl0YWJsZSkgewogICAgICBzdWl0YWJsZS5pblVzZSA9IHRydWU7CiAgICAgIHN1aXRhYmxlLmxhc3RVc2VkID0gRGF0ZS5ub3coKTsKICAgICAgc3VpdGFibGUuY2FudmFzLndpZHRoID0gd2lkdGg7CiAgICAgIHN1aXRhYmxlLmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7CiAgICAgIHN1aXRhYmxlLmN0eC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7CiAgICAgIHJldHVybiBzdWl0YWJsZTsKICAgIH0KICAgIGlmICh0aGlzLnBvb2wubGVuZ3RoIDwgdGhpcy5tYXhQb29sU2l6ZSkgewogICAgICBjb25zdCBjYW52YXMyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CiAgICAgIGNvbnN0IGN0eDIgPSBjYW52YXMyLmdldENvbnRleHQoIjJkIiwgewogICAgICAgIGFscGhhOiB0cnVlLAogICAgICAgIGRlc3luY2hyb25pemVkOiB0cnVlCiAgICAgIH0pOwogICAgICBjYW52YXMyLndpZHRoID0gTWF0aC5taW4oTWF0aC5tYXgod2lkdGgsIHRoaXMuTUlOX0NBTlZBU19TSVpFKSwgdGhpcy5NQVhfQ0FOVkFTX1NJWkUpOwogICAgICBjYW52YXMyLmhlaWdodCA9IE1hdGgubWluKE1hdGgubWF4KGhlaWdodCwgdGhpcy5NSU5fQ0FOVkFTX1NJWkUpLCB0aGlzLk1BWF9DQU5WQVNfU0laRSk7CiAgICAgIGNvbnN0IHBvb2xlZENhbnZhcyA9IHsKICAgICAgICBjYW52YXM6IGNhbnZhczIsCiAgICAgICAgY3R4OiBjdHgyLAogICAgICAgIGluVXNlOiB0cnVlLAogICAgICAgIGxhc3RVc2VkOiBEYXRlLm5vdygpCiAgICAgIH07CiAgICAgIHRoaXMucG9vbC5wdXNoKHBvb2xlZENhbnZhcyk7CiAgICAgIHJldHVybiBwb29sZWRDYW52YXM7CiAgICB9CiAgICBjb25zdCBscnUgPSB0aGlzLnBvb2wuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5pblVzZSkuc29ydCgoYTUsIGI1KSA9PiBhNS5sYXN0VXNlZCAtIGI1Lmxhc3RVc2VkKVswXTsKICAgIGlmIChscnUpIHsKICAgICAgbHJ1LmNhbnZhcy53aWR0aCA9IHdpZHRoOwogICAgICBscnUuY2FudmFzLmhlaWdodCA9IGhlaWdodDsKICAgICAgbHJ1LmN0eC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7CiAgICAgIGxydS5pblVzZSA9IHRydWU7CiAgICAgIGxydS5sYXN0VXNlZCA9IERhdGUubm93KCk7CiAgICAgIHJldHVybiBscnU7CiAgICB9CiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgY2FudmFzLndpZHRoID0gd2lkdGg7CiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0OwogICAgcmV0dXJuIHsKICAgICAgY2FudmFzLAogICAgICBjdHgsCiAgICAgIGluVXNlOiB0cnVlLAogICAgICBsYXN0VXNlZDogRGF0ZS5ub3coKQogICAgfTsKICB9CiAgc3RhdGljIHJlbGVhc2UocG9vbGVkQ2FudmFzKSB7CiAgICBpZiAodGhpcy5wb29sLmluY2x1ZGVzKHBvb2xlZENhbnZhcykpIHsKICAgICAgcG9vbGVkQ2FudmFzLmluVXNlID0gZmFsc2U7CiAgICAgIHBvb2xlZENhbnZhcy5jdHguY2xlYXJSZWN0KDAsIDAsIHBvb2xlZENhbnZhcy5jYW52YXMud2lkdGgsIHBvb2xlZENhbnZhcy5jYW52YXMuaGVpZ2h0KTsKICAgIH0KICB9CiAgc3RhdGljIHJlbGVhc2VBbGwoKSB7CiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5wb29sKSB7CiAgICAgIGl0ZW0uaW5Vc2UgPSBmYWxzZTsKICAgICAgaXRlbS5jdHguY2xlYXJSZWN0KDAsIDAsIGl0ZW0uY2FudmFzLndpZHRoLCBpdGVtLmNhbnZhcy5oZWlnaHQpOwogICAgfQogIH0KICBzdGF0aWMgZGVzdHJveSgpIHsKICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLnBvb2wpIHsKICAgICAgaXRlbS5jYW52YXMud2lkdGggPSAwOwogICAgICBpdGVtLmNhbnZhcy5oZWlnaHQgPSAwOwogICAgfQogICAgdGhpcy5wb29sID0gW107CiAgfQogIHN0YXRpYyBnZXRTdGF0cygpIHsKICAgIHJldHVybiB7CiAgICAgIHBvb2xTaXplOiB0aGlzLnBvb2wubGVuZ3RoLAogICAgICBtYXhQb29sU2l6ZTogdGhpcy5tYXhQb29sU2l6ZSwKICAgICAgaW5Vc2U6IHRoaXMucG9vbC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaW5Vc2UpLmxlbmd0aCwKICAgICAgYXZhaWxhYmxlOiB0aGlzLnBvb2wuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5pblVzZSkubGVuZ3RoCiAgICB9OwogIH0KICBzdGF0aWMgYWRqdXN0UG9vbFNpemUobmV3U2l6ZSkgewogICAgaWYgKG5ld1NpemUgPCB0aGlzLnBvb2wubGVuZ3RoKSB7CiAgICAgIGNvbnN0IHRvUmVtb3ZlID0gdGhpcy5wb29sLmxlbmd0aCAtIG5ld1NpemU7CiAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnBvb2wuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5pblVzZSkuc2xpY2UoMCwgdG9SZW1vdmUpOwogICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcmVtb3ZlZCkgewogICAgICAgIGNvbnN0IGluZGV4MiA9IHRoaXMucG9vbC5pbmRleE9mKGl0ZW0pOwogICAgICAgIGlmIChpbmRleDIgPiAtMSkgewogICAgICAgICAgdGhpcy5wb29sLnNwbGljZShpbmRleDIsIDEpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhpcy5tYXhQb29sU2l6ZSA9IG5ld1NpemU7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW1lZGlhL2RlZXMtcGRmLXNoYXJlZC91dGlscy5qcwpmdW5jdGlvbiBkZWJvdW5jZTMoZnVuYywgd2FpdDIpIHsKICBsZXQgdGltZW91dDI7CiAgcmV0dXJuIGZ1bmN0aW9uIGV4ZWN1dGVkRnVuY3Rpb24oLi4uYXJncykgewogICAgY29uc3QgbGF0ZXIgPSAoKSA9PiB7CiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0Mik7CiAgICAgIGZ1bmMoLi4uYXJncyk7CiAgICB9OwogICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQyKTsKICAgIHRpbWVvdXQyID0gd2luZG93LnNldFRpbWVvdXQobGF0ZXIsIHdhaXQyKTsKICB9Owp9CmZ1bmN0aW9uIHRocm90dGxlMihmdW5jLCBsaW1pdCkgewogIGxldCBpblRocm90dGxlOwogIHJldHVybiBmdW5jdGlvbiBleGVjdXRlZEZ1bmN0aW9uKC4uLmFyZ3MpIHsKICAgIGlmICghaW5UaHJvdHRsZSkgewogICAgICBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICBpblRocm90dGxlID0gdHJ1ZTsKICAgICAgc2V0VGltZW91dCgoKSA9PiBpblRocm90dGxlID0gZmFsc2UsIGxpbWl0KTsKICAgIH0KICB9Owp9CmZ1bmN0aW9uIGZvcm1hdEZpbGVTaXplKGJ5dGVzKSB7CiAgaWYgKGJ5dGVzID09PSAwKQogICAgcmV0dXJuICIwIEJ5dGVzIjsKICBjb25zdCBrNCA9IDEwMjQ7CiAgY29uc3Qgc2l6ZXMgPSBbIkJ5dGVzIiwgIktCIiwgIk1CIiwgIkdCIl07CiAgY29uc3QgaTExID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrNCkpOwogIHJldHVybiBNYXRoLnJvdW5kKGJ5dGVzIC8gTWF0aC5wb3coazQsIGkxMSkgKiAxMDApIC8gMTAwICsgIiAiICsgc2l6ZXNbaTExXTsKfQpmdW5jdGlvbiBpc0luVmlld3BvcnQoZWxlbWVudDQsIG1hcmdpbiA9IDApIHsKICBjb25zdCByZWN0ID0gZWxlbWVudDQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgcmV0dXJuIHJlY3QudG9wID49IC1tYXJnaW4gJiYgcmVjdC5sZWZ0ID49IC1tYXJnaW4gJiYgcmVjdC5ib3R0b20gPD0gKHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSArIG1hcmdpbiAmJiByZWN0LnJpZ2h0IDw9ICh3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpICsgbWFyZ2luOwp9CnZhciBQZXJmb3JtYW5jZU1vbml0b3IgPSBjbGFzcyB7CiAgc3RhdGljIG1hcmtzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBzdGF0aWMgbWVhc3VyZXMgPSBbXTsKICBzdGF0aWMgbWFyayhuYW1lKSB7CiAgICB0aGlzLm1hcmtzLnNldChuYW1lLCBwZXJmb3JtYW5jZS5ub3coKSk7CiAgfQogIHN0YXRpYyBtZWFzdXJlKG5hbWUsIHN0YXJ0TWFyaykgewogICAgY29uc3Qgc3RhcnQgPSB0aGlzLm1hcmtzLmdldChzdGFydE1hcmspOwogICAgaWYgKHN0YXJ0KSB7CiAgICAgIGNvbnN0IGR1cmF0aW9uID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydDsKICAgICAgdGhpcy5tZWFzdXJlcy5wdXNoKHsgbmFtZSwgZHVyYXRpb24gfSk7CiAgICAgIHRoaXMubWFya3MuZGVsZXRlKHN0YXJ0TWFyayk7CiAgICAgIHJldHVybiBkdXJhdGlvbjsKICAgIH0KICAgIHJldHVybiAwOwogIH0KICBzdGF0aWMgZ2V0UmVwb3J0KCkgewogICAgY29uc3QgcmVwb3J0ID0gewogICAgICBtZWFzdXJlczogWy4uLnRoaXMubWVhc3VyZXNdLAogICAgICBhdmVyYWdlczoge30KICAgIH07CiAgICBjb25zdCBncm91cGVkID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIGZvciAoY29uc3QgbWVhc3VyZSBvZiB0aGlzLm1lYXN1cmVzKSB7CiAgICAgIGlmICghZ3JvdXBlZC5oYXMobWVhc3VyZS5uYW1lKSkgewogICAgICAgIGdyb3VwZWQuc2V0KG1lYXN1cmUubmFtZSwgW10pOwogICAgICB9CiAgICAgIGdyb3VwZWQuZ2V0KG1lYXN1cmUubmFtZSkucHVzaChtZWFzdXJlLmR1cmF0aW9uKTsKICAgIH0KICAgIGZvciAoY29uc3QgW25hbWUsIGR1cmF0aW9uc10gb2YgZ3JvdXBlZCkgewogICAgICByZXBvcnQuYXZlcmFnZXNbbmFtZV0gPSBkdXJhdGlvbnMucmVkdWNlKChhNSwgYjUpID0+IGE1ICsgYjUsIDApIC8gZHVyYXRpb25zLmxlbmd0aDsKICAgIH0KICAgIHJldHVybiByZXBvcnQ7CiAgfQogIHN0YXRpYyBjbGVhcigpIHsKICAgIHRoaXMubWFya3MuY2xlYXIoKTsKICAgIHRoaXMubWVhc3VyZXMgPSBbXTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy10aWxlLXBkZi9zdHlsZXMuanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIHRpbGVQZGZTdHlsZXMgPSBpYAogIC5wcmV2aWV3LXN0YWNrIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogIH0KCiAgLnByZXZpZXctc3RhY2subm9uLWE0IHsKICAgIHBhZGRpbmc6IDEycHg7CiAgfQoKICAucHJldmlldy1jYW52YXMgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICB3aWR0aDogYXV0bzsKICAgIGhlaWdodDogYXV0bzsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47CiAgICBpbWFnZS1yZW5kZXJpbmc6IGF1dG87CiAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjEpIiwgInJnYmEoMCwgMCwgMCwgMC4zKSIpfTsKICB9CgogIC5ub24tYTQgLnByZXZpZXctY2FudmFzIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0IDMxJSA5MiUpIiwgImhzbCgyMTcgMjUlIDI0JSkiKX07CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgfQoKICAvKiBHcmlkIG9wdGltaXphdGlvbnMgKi8KICA6aG9zdChbZ3JpZC1tb2RlXSkgLnByZXZpZXctY2FudmFzIHsKICAgIGltYWdlLXJlbmRlcmluZzogLXdlYmtpdC1vcHRpbWl6ZS1jb250cmFzdDsKICAgIGltYWdlLXJlbmRlcmluZzogY3Jpc3AtZWRnZXM7CiAgfQpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW1lZGlhL2RlZXMtdGlsZS1wZGYvZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgZGVtbzUgPSAoKSA9PiB7CiAgY29uc3Qgc2FtcGxlUGRmcyA9IFsKICAgICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbW96aWxsYS9wZGYuanMvYmEyZWRlYWUvZXhhbXBsZXMvbGVhcm5pbmcvaGVsbG93b3JsZC5wZGYiLAogICAgImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9tb3ppbGxhL3BkZi5qcy9iYTJlZGVhZS93ZWIvY29tcHJlc3NlZC50cmFjZW1vbmtleS1wbGRpLTA5LnBkZiIKICBdOwogIGNvbnN0IGdlbmVyYXRlR3JpZEl0ZW1zID0gKGNvdW50MikgPT4gewogICAgY29uc3QgaXRlbXMgPSBbXTsKICAgIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IGNvdW50MjsgaTExKyspIHsKICAgICAgY29uc3QgcGRmVXJsID0gc2FtcGxlUGRmc1tpMTEgJSBzYW1wbGVQZGZzLmxlbmd0aF07CiAgICAgIGl0ZW1zLnB1c2goYjJgCiAgICAgICAgPGRlZXMtdGlsZS1wZGYKICAgICAgICAgIHBkZlVybD0iJHtwZGZVcmx9IgogICAgICAgICAgY2xpY2thYmxlPSJ0cnVlIgogICAgICAgICAgZ3JpZC1tb2RlCiAgICAgICAgICBAdGlsZS1jbGljaz0keyhlMTEpID0+IHsKICAgICAgICBjb25zb2xlLmxvZygiUERGIFRpbGUgY2xpY2tlZDoiLCBlMTEuZGV0YWlsKTsKICAgICAgICBhbGVydChgUERGIGNsaWNrZWQ6ICR7ZTExLmRldGFpbC5wYWdlQ291bnR9IHBhZ2VzYCk7CiAgICAgIH19CiAgICAgICAgPjwvZGVlcy10aWxlLXBkZj4KICAgICAgYCk7CiAgICB9CiAgICByZXR1cm4gaXRlbXM7CiAgfTsKICByZXR1cm4gYjJgCiAgICA8c3R5bGU+CiAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZzogNDBweDsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1OwogICAgICB9CgogICAgICAuZGVtby1zZWN0aW9uIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiA2MHB4OwogICAgICB9CgogICAgICBoMyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgfQoKICAgICAgLnByZXZpZXctZ3JpZCB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgyMDBweCwgMWZyKSk7CiAgICAgICAgZ2FwOiAyNHB4OwogICAgICB9CgogICAgICAucHJldmlldy1yb3cgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKICAgICAgfQoKICAgICAgLnByZXZpZXctbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIG1pbi13aWR0aDogMTAwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMz5TaW5nbGUgUERGIFRpbGU8L2gzPgogICAgICAgIDxkZWVzLXRpbGUtcGRmCiAgICAgICAgICBwZGZVcmw9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9tb3ppbGxhL3BkZi5qcy9iYTJlZGVhZS93ZWIvY29tcHJlc3NlZC50cmFjZW1vbmtleS1wbGRpLTA5LnBkZiIKICAgICAgICAgIGNsaWNrYWJsZT0idHJ1ZSIKICAgICAgICA+PC9kZWVzLXRpbGUtcGRmPgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgzPkRpZmZlcmVudCBTaXplczwvaDM+CiAgICAgICAgPGRpdiBjbGFzcz0icHJldmlldy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0icHJldmlldy1sYWJlbCI+U21hbGw6PC9kaXY+CiAgICAgICAgICA8ZGVlcy10aWxlLXBkZgogICAgICAgICAgICBzaXplPSJzbWFsbCIKICAgICAgICAgICAgcGRmVXJsPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbW96aWxsYS9wZGYuanMvYmEyZWRlYWUvZXhhbXBsZXMvbGVhcm5pbmcvaGVsbG93b3JsZC5wZGYiCiAgICAgICAgICAgIGNsaWNrYWJsZT0idHJ1ZSIKICAgICAgICAgID48L2RlZXMtdGlsZS1wZGY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9InByZXZpZXctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9InByZXZpZXctbGFiZWwiPkRlZmF1bHQ6PC9kaXY+CiAgICAgICAgICA8ZGVlcy10aWxlLXBkZgogICAgICAgICAgICBwZGZVcmw9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9tb3ppbGxhL3BkZi5qcy9iYTJlZGVhZS9leGFtcGxlcy9sZWFybmluZy9oZWxsb3dvcmxkLnBkZiIKICAgICAgICAgICAgY2xpY2thYmxlPSJ0cnVlIgogICAgICAgICAgPjwvZGVlcy10aWxlLXBkZj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0icHJldmlldy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0icHJldmlldy1sYWJlbCI+TGFyZ2U6PC9kaXY+CiAgICAgICAgICA8ZGVlcy10aWxlLXBkZgogICAgICAgICAgICBzaXplPSJsYXJnZSIKICAgICAgICAgICAgcGRmVXJsPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbW96aWxsYS9wZGYuanMvYmEyZWRlYWUvZXhhbXBsZXMvbGVhcm5pbmcvaGVsbG93b3JsZC5wZGYiCiAgICAgICAgICAgIGNsaWNrYWJsZT0idHJ1ZSIKICAgICAgICAgID48L2RlZXMtdGlsZS1wZGY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDM+V2l0aCBMYWJlbDwvaDM+CiAgICAgICAgPGRlZXMtdGlsZS1wZGYKICAgICAgICAgIHBkZlVybD0iaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL21vemlsbGEvcGRmLmpzL2JhMmVkZWFlL3dlYi9jb21wcmVzc2VkLnRyYWNlbW9ua2V5LXBsZGktMDkucGRmIgogICAgICAgICAgY2xpY2thYmxlPSJ0cnVlIgogICAgICAgICAgbGFiZWw9IlJlc2VhcmNoIFBhcGVyLnBkZiIKICAgICAgICA+PC9kZWVzLXRpbGUtcGRmPgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgzPk5vbi1DbGlja2FibGU8L2gzPgogICAgICAgIDxkZWVzLXRpbGUtcGRmCiAgICAgICAgICBwZGZVcmw9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9tb3ppbGxhL3BkZi5qcy9iYTJlZGVhZS9leGFtcGxlcy9sZWFybmluZy9oZWxsb3dvcmxkLnBkZiIKICAgICAgICAgIGNsaWNrYWJsZT0iZmFsc2UiCiAgICAgICAgPjwvZGVlcy10aWxlLXBkZj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMz5HcmlkIC0gMjAgUERGcyB3aXRoIExhenkgTG9hZGluZzwvaDM+CiAgICAgICAgPGRpdiBjbGFzcz0icHJldmlldy1ncmlkIj4KICAgICAgICAgICR7Z2VuZXJhdGVHcmlkSXRlbXMoMjApfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIGA7Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy10aWxlLXBkZi9jb21wb25lbnQuanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIF9fZXNEZWNvcmF0ZTc3ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM3OCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1RpbGVQZGYgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLXRpbGUtcGRmIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNUaWxlQmFzZTsKICBsZXQgX3BkZlVybF9kZWNvcmF0b3JzOwogIGxldCBfcGRmVXJsX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcGRmVXJsX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50UHJldmlld1BhZ2VfZGVjb3JhdG9yczsKICBsZXQgX2N1cnJlbnRQcmV2aWV3UGFnZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2N1cnJlbnRQcmV2aWV3UGFnZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcGFnZUNvdW50X2RlY29yYXRvcnM7CiAgbGV0IF9wYWdlQ291bnRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wYWdlQ291bnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlbmRlcmVkX2RlY29yYXRvcnM7CiAgbGV0IF9yZW5kZXJlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlbmRlcmVkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0hvdmVyaW5nX2RlY29yYXRvcnM7CiAgbGV0IF9pc0hvdmVyaW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNIb3ZlcmluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNBNEZvcm1hdF9kZWNvcmF0b3JzOwogIGxldCBfaXNBNEZvcm1hdF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzQTRGb3JtYXRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1RpbGVQZGYyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfcGRmVXJsX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfY3VycmVudFByZXZpZXdQYWdlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfcGFnZUNvdW50X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfcmVuZGVyZWRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfaXNIb3ZlcmluZ19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9pc0E0Rm9ybWF0X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX19lc0RlY29yYXRlNzcodGhpcywgbnVsbCwgX3BkZlVybF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwZGZVcmwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInBkZlVybCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5wZGZVcmwsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnBkZlVybCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wZGZVcmxfaW5pdGlhbGl6ZXJzLCBfcGRmVXJsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzcodGhpcywgbnVsbCwgX2N1cnJlbnRQcmV2aWV3UGFnZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjdXJyZW50UHJldmlld1BhZ2UiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImN1cnJlbnRQcmV2aWV3UGFnZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jdXJyZW50UHJldmlld1BhZ2UsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmN1cnJlbnRQcmV2aWV3UGFnZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jdXJyZW50UHJldmlld1BhZ2VfaW5pdGlhbGl6ZXJzLCBfY3VycmVudFByZXZpZXdQYWdlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzcodGhpcywgbnVsbCwgX3BhZ2VDb3VudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwYWdlQ291bnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInBhZ2VDb3VudCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5wYWdlQ291bnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnBhZ2VDb3VudCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wYWdlQ291bnRfaW5pdGlhbGl6ZXJzLCBfcGFnZUNvdW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzcodGhpcywgbnVsbCwgX3JlbmRlcmVkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJlbmRlcmVkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJyZW5kZXJlZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5yZW5kZXJlZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucmVuZGVyZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcmVuZGVyZWRfaW5pdGlhbGl6ZXJzLCBfcmVuZGVyZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Nyh0aGlzLCBudWxsLCBfaXNIb3ZlcmluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc0hvdmVyaW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc0hvdmVyaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzSG92ZXJpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzSG92ZXJpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNIb3ZlcmluZ19pbml0aWFsaXplcnMsIF9pc0hvdmVyaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzcodGhpcywgbnVsbCwgX2lzQTRGb3JtYXRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNBNEZvcm1hdCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNBNEZvcm1hdCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc0E0Rm9ybWF0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc0E0Rm9ybWF0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzQTRGb3JtYXRfaW5pdGlhbGl6ZXJzLCBfaXNBNEZvcm1hdF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc3KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1RpbGVQZGYyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtbzU7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiTWVkaWEiLCAiUERGIl07CiAgICBzdGF0aWMgc3R5bGVzID0gWy4uLnRpbGVCYXNlU3R5bGVzLCB0aWxlUGRmU3R5bGVzXTsKICAgICNwZGZVcmxfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNzgodGhpcywgX3BkZlVybF9pbml0aWFsaXplcnMsICIiKTsKICAgIGdldCBwZGZVcmwoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwZGZVcmxfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwZGZVcmwodmFsdWUyKSB7CiAgICAgIHRoaXMuI3BkZlVybF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2N1cnJlbnRQcmV2aWV3UGFnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzgodGhpcywgX3BkZlVybF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzgodGhpcywgX2N1cnJlbnRQcmV2aWV3UGFnZV9pbml0aWFsaXplcnMsIDEpKTsKICAgIGdldCBjdXJyZW50UHJldmlld1BhZ2UoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjdXJyZW50UHJldmlld1BhZ2VfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjdXJyZW50UHJldmlld1BhZ2UodmFsdWUyKSB7CiAgICAgIHRoaXMuI2N1cnJlbnRQcmV2aWV3UGFnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3BhZ2VDb3VudF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzgodGhpcywgX2N1cnJlbnRQcmV2aWV3UGFnZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzgodGhpcywgX3BhZ2VDb3VudF9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBwYWdlQ291bnQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwYWdlQ291bnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwYWdlQ291bnQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3BhZ2VDb3VudF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3JlbmRlcmVkX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3OCh0aGlzLCBfcGFnZUNvdW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3OCh0aGlzLCBfcmVuZGVyZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHJlbmRlcmVkKCkgewogICAgICByZXR1cm4gdGhpcy4jcmVuZGVyZWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCByZW5kZXJlZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcmVuZGVyZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpc0hvdmVyaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3OCh0aGlzLCBfcmVuZGVyZWRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc4KHRoaXMsIF9pc0hvdmVyaW5nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc0hvdmVyaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNIb3ZlcmluZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzSG92ZXJpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzSG92ZXJpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpc0E0Rm9ybWF0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3OCh0aGlzLCBfaXNIb3ZlcmluZ19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzgodGhpcywgX2lzQTRGb3JtYXRfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgaXNBNEZvcm1hdCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzQTRGb3JtYXRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc0E0Rm9ybWF0KHZhbHVlMikgewogICAgICB0aGlzLiNpc0E0Rm9ybWF0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICByZW5kZXJQYWdlc1Rhc2sgPSAoX19ydW5Jbml0aWFsaXplcnM3OCh0aGlzLCBfaXNBNEZvcm1hdF9leHRyYUluaXRpYWxpemVycyksIG51bGwpOwogICAgcmVuZGVyUGFnZXNRdWV1ZWQgPSBmYWxzZTsKICAgIHBkZkRvY3VtZW50OwogICAgY2FudmFzZXMgPSBbXTsKICAgIHJlc2l6ZU9ic2VydmVyOwogICAgc3RhY2tFbGVtZW50ID0gbnVsbDsKICAgIGxvYWRlZFBkZlVybCA9IG51bGw7CiAgICByZW5kZXJUaWxlQ29udGVudCgpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJwcmV2aWV3LXN0YWNrICR7IXRoaXMuaXNBNEZvcm1hdCA/ICJub24tYTQiIDogIiJ9Ij4KICAgICAgICA8Y2FudmFzCiAgICAgICAgICBjbGFzcz0icHJldmlldy1jYW52YXMiCiAgICAgICAgICBkYXRhLXBhZ2U9IiR7dGhpcy5jdXJyZW50UHJldmlld1BhZ2V9IgogICAgICAgID48L2NhbnZhcz4KICAgICAgPC9kaXY+CgogICAgICAke3RoaXMucGFnZUNvdW50ID4gMSAmJiB0aGlzLmlzSG92ZXJpbmcgPyBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJ0aWxlLWJhZGdlIj4KICAgICAgICAgIFBhZ2UgJHt0aGlzLmN1cnJlbnRQcmV2aWV3UGFnZX0gb2YgJHt0aGlzLnBhZ2VDb3VudH0KICAgICAgICA8L2Rpdj4KICAgICAgYCA6ICIifQoKICAgICAgJHt0aGlzLnBhZ2VDb3VudCA+IDAgJiYgIXRoaXMuaXNIb3ZlcmluZyA/IGIyYAogICAgICAgIDxkaXYgY2xhc3M9InRpbGUtYmFkZ2UtY29ybmVyIj4KICAgICAgICAgICR7dGhpcy5wYWdlQ291bnR9IHBhZ2Uke3RoaXMucGFnZUNvdW50ID4gMSA/ICJzIiA6ICIifQogICAgICAgIDwvZGl2PgogICAgICBgIDogIiJ9CgogICAgICAke3RoaXMuY2xpY2thYmxlID8gYjJgCiAgICAgICAgPGRpdiBjbGFzcz0idGlsZS1vdmVybGF5Ij4KICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOkV5ZSI+PC9kZWVzLWljb24+CiAgICAgICAgICA8c3Bhbj5WaWV3IFBERjwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgYCA6ICIifQogICAgYDsKICAgIH0KICAgIGdldFRpbGVDbGlja0RldGFpbCgpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBwZGZVcmw6IHRoaXMucGRmVXJsLAogICAgICAgIHBhZ2VDb3VudDogdGhpcy5wYWdlQ291bnQKICAgICAgfTsKICAgIH0KICAgIG9uQmVjYW1lVmlzaWJsZSgpIHsKICAgICAgaWYgKCF0aGlzLnJlbmRlcmVkICYmIHRoaXMucGRmVXJsKSB7CiAgICAgICAgdGhpcy5sb2FkQW5kUmVuZGVyUHJldmlldygpOwogICAgICB9CiAgICB9CiAgICBvblRpbGVNb3VzZUVudGVyKCkgewogICAgICB0aGlzLmlzSG92ZXJpbmcgPSB0cnVlOwogICAgfQogICAgb25UaWxlTW91c2VMZWF2ZSgpIHsKICAgICAgdGhpcy5pc0hvdmVyaW5nID0gZmFsc2U7CiAgICAgIGlmICh0aGlzLmN1cnJlbnRQcmV2aWV3UGFnZSAhPT0gMSkgewogICAgICAgIHRoaXMuY3VycmVudFByZXZpZXdQYWdlID0gMTsKICAgICAgICB2b2lkIHRoaXMuc2NoZWR1bGVSZW5kZXJQYWdlcygpOwogICAgICB9CiAgICB9CiAgICBvblRpbGVNb3VzZU1vdmUoZTExKSB7CiAgICAgIGlmICghdGhpcy5pc0hvdmVyaW5nIHx8IHRoaXMucGFnZUNvdW50IDw9IDEpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCByZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgeDMgPSBlMTEuY2xpZW50WCAtIHJlY3QubGVmdDsKICAgICAgY29uc3Qgd2lkdGggPSByZWN0LndpZHRoOwogICAgICBjb25zdCBwZXJjZW50YWdlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgeDMgLyB3aWR0aCkpOwogICAgICBjb25zdCBuZXdQYWdlID0gTWF0aC5jZWlsKHBlcmNlbnRhZ2UgKiB0aGlzLnBhZ2VDb3VudCkgfHwgMTsKICAgICAgaWYgKG5ld1BhZ2UgIT09IHRoaXMuY3VycmVudFByZXZpZXdQYWdlKSB7CiAgICAgICAgdGhpcy5jdXJyZW50UHJldmlld1BhZ2UgPSBuZXdQYWdlOwogICAgICAgIHZvaWQgdGhpcy5zY2hlZHVsZVJlbmRlclBhZ2VzKCk7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlOwogICAgICB0aGlzLmNhY2hlRWxlbWVudHMoKTsKICAgICAgdGhpcy5zZXR1cFJlc2l6ZU9ic2VydmVyKCk7CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgdGhpcy5jbGVhbnVwKCk7CiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTsKICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IHZvaWQgMDsKICAgIH0KICAgIGFzeW5jIGxvYWRBbmRSZW5kZXJQcmV2aWV3KCkgewogICAgICBpZiAodGhpcy5yZW5kZXJlZCB8fCB0aGlzLmxvYWRpbmcpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlOwogICAgICB0aGlzLmVycm9yID0gZmFsc2U7CiAgICAgIFBlcmZvcm1hbmNlTW9uaXRvci5tYXJrKGBwcmV2aWV3LWxvYWQtJHt0aGlzLnBkZlVybH1gKTsKICAgICAgdHJ5IHsKICAgICAgICB0aGlzLnBkZkRvY3VtZW50ID0gYXdhaXQgUGRmTWFuYWdlci5sb2FkRG9jdW1lbnQodGhpcy5wZGZVcmwpOwogICAgICAgIHRoaXMucGFnZUNvdW50ID0gdGhpcy5wZGZEb2N1bWVudC5udW1QYWdlczsKICAgICAgICB0aGlzLmN1cnJlbnRQcmV2aWV3UGFnZSA9IDE7CiAgICAgICAgdGhpcy5sb2FkZWRQZGZVcmwgPSB0aGlzLnBkZlVybDsKICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlOwogICAgICAgIHRoaXMuY2FjaGVFbGVtZW50cygpOwogICAgICAgIGF3YWl0IHRoaXMuc2NoZWR1bGVSZW5kZXJQYWdlcygpOwogICAgICAgIHRoaXMucmVuZGVyZWQgPSB0cnVlOwogICAgICAgIGNvbnN0IGR1cmF0aW9uID0gUGVyZm9ybWFuY2VNb25pdG9yLm1lYXN1cmUoYHByZXZpZXctcmVuZGVyLSR7dGhpcy5wZGZVcmx9YCwgYHByZXZpZXctbG9hZC0ke3RoaXMucGRmVXJsfWApOwogICAgICAgIGNvbnNvbGUubG9nKGBQREYgdGlsZSByZW5kZXJlZCBpbiAke2R1cmF0aW9ufW1zYCk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGxvYWQgUERGIHRpbGU6IiwgZXJyb3IpOwogICAgICAgIHRoaXMuZXJyb3IgPSB0cnVlOwogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBzY2hlZHVsZVJlbmRlclBhZ2VzKCkgewogICAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMucmVuZGVyUGFnZXNUYXNrKSB7CiAgICAgICAgdGhpcy5yZW5kZXJQYWdlc1F1ZXVlZCA9IHRydWU7CiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyUGFnZXNUYXNrOwogICAgICB9CiAgICAgIHRoaXMucmVuZGVyUGFnZXNUYXNrID0gKGFzeW5jICgpID0+IHsKICAgICAgICB0cnkgewogICAgICAgICAgYXdhaXQgdGhpcy5wZXJmb3JtUmVuZGVyUGFnZXMoKTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHJlbmRlciBQREYgdGlsZSBwYWdlczoiLCBlcnJvcik7CiAgICAgICAgfQogICAgICB9KSgpLmZpbmFsbHkoKCkgPT4gewogICAgICAgIHRoaXMucmVuZGVyUGFnZXNUYXNrID0gbnVsbDsKICAgICAgICBpZiAodGhpcy5yZW5kZXJQYWdlc1F1ZXVlZCkgewogICAgICAgICAgdGhpcy5yZW5kZXJQYWdlc1F1ZXVlZCA9IGZhbHNlOwogICAgICAgICAgdm9pZCB0aGlzLnNjaGVkdWxlUmVuZGVyUGFnZXMoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gdGhpcy5yZW5kZXJQYWdlc1Rhc2s7CiAgICB9CiAgICBhc3luYyBwZXJmb3JtUmVuZGVyUGFnZXMoKSB7CiAgICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkKICAgICAgICByZXR1cm47CiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlMikgPT4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlc29sdmUyKSk7CiAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnByZXZpZXctY2FudmFzIik7CiAgICAgIGlmICghY2FudmFzKQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5jbGVhckNhbnZhc2VzKCk7CiAgICAgIHRoaXMuY2FjaGVFbGVtZW50cygpOwogICAgICBjb25zdCB7IGF2YWlsYWJsZVdpZHRoLCBhdmFpbGFibGVIZWlnaHQgfSA9IHRoaXMuZ2V0QXZhaWxhYmxlU2l6ZSgpOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IHBhZ2VOdW0gPSB0aGlzLmN1cnJlbnRQcmV2aWV3UGFnZTsKICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5wZGZEb2N1bWVudC5nZXRQYWdlKHBhZ2VOdW0pOwogICAgICAgIGNvbnN0IGluaXRpYWxWaWV3cG9ydCA9IHBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZTogMSB9KTsKICAgICAgICBjb25zdCBhc3BlY3RSYXRpbyA9IGluaXRpYWxWaWV3cG9ydC5oZWlnaHQgLyBpbml0aWFsVmlld3BvcnQud2lkdGg7CiAgICAgICAgY29uc3QgYTRQb3J0cmFpdFJhdGlvID0gMS40MTQ7CiAgICAgICAgY29uc3QgYTRMYW5kc2NhcGVSYXRpbyA9IDAuNzA3OwogICAgICAgIGNvbnN0IGxldHRlclBvcnRyYWl0UmF0aW8gPSAxLjI5NDsKICAgICAgICBjb25zdCBsZXR0ZXJMYW5kc2NhcGVSYXRpbyA9IDAuNzczOwogICAgICAgIGNvbnN0IHRvbGVyYW5jZSA9IDAuMDU7CiAgICAgICAgY29uc3QgaXNBNFBvcnRyYWl0ID0gTWF0aC5hYnMoYXNwZWN0UmF0aW8gLSBhNFBvcnRyYWl0UmF0aW8pIDwgYTRQb3J0cmFpdFJhdGlvICogdG9sZXJhbmNlOwogICAgICAgIGNvbnN0IGlzQTRMYW5kc2NhcGUgPSBNYXRoLmFicyhhc3BlY3RSYXRpbyAtIGE0TGFuZHNjYXBlUmF0aW8pIDwgYTRMYW5kc2NhcGVSYXRpbyAqIHRvbGVyYW5jZTsKICAgICAgICBjb25zdCBpc0xldHRlclBvcnRyYWl0ID0gTWF0aC5hYnMoYXNwZWN0UmF0aW8gLSBsZXR0ZXJQb3J0cmFpdFJhdGlvKSA8IGxldHRlclBvcnRyYWl0UmF0aW8gKiB0b2xlcmFuY2U7CiAgICAgICAgY29uc3QgaXNMZXR0ZXJMYW5kc2NhcGUgPSBNYXRoLmFicyhhc3BlY3RSYXRpbyAtIGxldHRlckxhbmRzY2FwZVJhdGlvKSA8IGxldHRlckxhbmRzY2FwZVJhdGlvICogdG9sZXJhbmNlOwogICAgICAgIHRoaXMuaXNBNEZvcm1hdCA9IGlzQTRQb3J0cmFpdCB8fCBpc0E0TGFuZHNjYXBlIHx8IGlzTGV0dGVyUG9ydHJhaXQgfHwgaXNMZXR0ZXJMYW5kc2NhcGU7CiAgICAgICAgY29uc3QgYWRqdXN0ZWRXaWR0aCA9IHRoaXMuaXNBNEZvcm1hdCA/IGF2YWlsYWJsZVdpZHRoIDogYXZhaWxhYmxlV2lkdGggLSAyNDsKICAgICAgICBjb25zdCBhZGp1c3RlZEhlaWdodCA9IHRoaXMuaXNBNEZvcm1hdCA/IGF2YWlsYWJsZUhlaWdodCA6IGF2YWlsYWJsZUhlaWdodCAtIDI0OwogICAgICAgIGNvbnN0IHNjYWxlWCA9IGFkanVzdGVkV2lkdGggPiAwID8gYWRqdXN0ZWRXaWR0aCAvIGluaXRpYWxWaWV3cG9ydC53aWR0aCA6IDA7CiAgICAgICAgY29uc3Qgc2NhbGVZID0gYWRqdXN0ZWRIZWlnaHQgPiAwID8gYWRqdXN0ZWRIZWlnaHQgLyBpbml0aWFsVmlld3BvcnQuaGVpZ2h0IDogMDsKICAgICAgICBjb25zdCBiYXNlU2NhbGUgPSBNYXRoLm1pbihzY2FsZVggfHwgMC41LCBzY2FsZVkgfHwgc2NhbGVYIHx8IDAuNSk7CiAgICAgICAgY29uc3QgcmVuZGVyU2NhbGUgPSBNYXRoLm1pbihiYXNlU2NhbGUgKiAyLCAzKTsKICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShyZW5kZXJTY2FsZSkgfHwgcmVuZGVyU2NhbGUgPD0gMCkgewogICAgICAgICAgcGFnZS5jbGVhbnVwPy4oKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3Qgdmlld3BvcnQgPSBwYWdlLmdldFZpZXdwb3J0KHsgc2NhbGU6IHJlbmRlclNjYWxlIH0pOwogICAgICAgIGNvbnN0IHBvb2xlZENhbnZhcyA9IENhbnZhc1Bvb2wuYWNxdWlyZSh2aWV3cG9ydC53aWR0aCwgdmlld3BvcnQuaGVpZ2h0KTsKICAgICAgICB0aGlzLmNhbnZhc2VzLnB1c2gocG9vbGVkQ2FudmFzKTsKICAgICAgICBjb25zdCByZW5kZXJDb250ZXh0ID0gewogICAgICAgICAgY2FudmFzQ29udGV4dDogcG9vbGVkQ2FudmFzLmN0eCwKICAgICAgICAgIHZpZXdwb3J0CiAgICAgICAgfTsKICAgICAgICBhd2FpdCBwYWdlLnJlbmRlcihyZW5kZXJDb250ZXh0KS5wcm9taXNlOwogICAgICAgIGNhbnZhcy53aWR0aCA9IHZpZXdwb3J0LndpZHRoOwogICAgICAgIGNhbnZhcy5oZWlnaHQgPSB2aWV3cG9ydC5oZWlnaHQ7CiAgICAgICAgY29uc3QgZGlzcGxheVdpZHRoID0gYWRqdXN0ZWRXaWR0aDsKICAgICAgICBjb25zdCBkaXNwbGF5SGVpZ2h0ID0gdmlld3BvcnQuaGVpZ2h0IC8gdmlld3BvcnQud2lkdGggKiBhZGp1c3RlZFdpZHRoOwogICAgICAgIGlmIChkaXNwbGF5SGVpZ2h0ID4gYWRqdXN0ZWRIZWlnaHQpIHsKICAgICAgICAgIGNvbnN0IGFsdERpc3BsYXlIZWlnaHQgPSBhZGp1c3RlZEhlaWdodDsKICAgICAgICAgIGNvbnN0IGFsdERpc3BsYXlXaWR0aCA9IHZpZXdwb3J0LndpZHRoIC8gdmlld3BvcnQuaGVpZ2h0ICogYWRqdXN0ZWRIZWlnaHQ7CiAgICAgICAgICBjYW52YXMuc3R5bGUud2lkdGggPSBgJHthbHREaXNwbGF5V2lkdGh9cHhgOwogICAgICAgICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke2FsdERpc3BsYXlIZWlnaHR9cHhgOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjYW52YXMuc3R5bGUud2lkdGggPSBgJHtkaXNwbGF5V2lkdGh9cHhgOwogICAgICAgICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke2Rpc3BsYXlIZWlnaHR9cHhgOwogICAgICAgIH0KICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgICBpZiAoY3R4KSB7CiAgICAgICAgICBjdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gdHJ1ZTsKICAgICAgICAgIGN0eC5pbWFnZVNtb290aGluZ1F1YWxpdHkgPSAiaGlnaCI7CiAgICAgICAgICBjdHguZHJhd0ltYWdlKHBvb2xlZENhbnZhcy5jYW52YXMsIDAsIDApOwogICAgICAgIH0KICAgICAgICBwYWdlLmNsZWFudXAoKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcmVuZGVyIHBhZ2UgJHt0aGlzLmN1cnJlbnRQcmV2aWV3UGFnZX06YCwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICBjbGVhckNhbnZhc2VzKCkgewogICAgICBmb3IgKGNvbnN0IHBvb2xlZENhbnZhcyBvZiB0aGlzLmNhbnZhc2VzKSB7CiAgICAgICAgQ2FudmFzUG9vbC5yZWxlYXNlKHBvb2xlZENhbnZhcyk7CiAgICAgIH0KICAgICAgdGhpcy5jYW52YXNlcyA9IFtdOwogICAgfQogICAgY2xlYW51cCgpIHsKICAgICAgdGhpcy5jbGVhckNhbnZhc2VzKCk7CiAgICAgIGlmICh0aGlzLnBkZkRvY3VtZW50KSB7CiAgICAgICAgUGRmTWFuYWdlci5yZWxlYXNlRG9jdW1lbnQodGhpcy5sb2FkZWRQZGZVcmwgPz8gdGhpcy5wZGZVcmwpOwogICAgICAgIHRoaXMucGRmRG9jdW1lbnQgPSBudWxsOwogICAgICB9CiAgICAgIHRoaXMucmVuZGVyUGFnZXNRdWV1ZWQgPSBmYWxzZTsKICAgICAgdGhpcy5wYWdlQ291bnQgPSAwOwogICAgICB0aGlzLmN1cnJlbnRQcmV2aWV3UGFnZSA9IDE7CiAgICAgIHRoaXMuaXNIb3ZlcmluZyA9IGZhbHNlOwogICAgICB0aGlzLmlzQTRGb3JtYXQgPSB0cnVlOwogICAgICB0aGlzLnN0YWNrRWxlbWVudCA9IG51bGw7CiAgICAgIHRoaXMubG9hZGVkUGRmVXJsID0gbnVsbDsKICAgICAgdGhpcy5yZW5kZXJlZCA9IGZhbHNlOwogICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgdGhpcy5lcnJvciA9IGZhbHNlOwogICAgfQogICAgYXN5bmMgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgICBzdXBlci51cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygicGRmVXJsIikgJiYgdGhpcy5wZGZVcmwpIHsKICAgICAgICBjb25zdCBwcmV2aW91c1VybCA9IGNoYW5nZWRQcm9wZXJ0aWVzLmdldCgicGRmVXJsIik7CiAgICAgICAgaWYgKHByZXZpb3VzVXJsKSB7CiAgICAgICAgICBQZGZNYW5hZ2VyLnJlbGVhc2VEb2N1bWVudChwcmV2aW91c1VybCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuY2xlYW51cCgpOwogICAgICAgIHRoaXMucmVuZGVyZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLmN1cnJlbnRQcmV2aWV3UGFnZSA9IDE7CiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgaWYgKHJlY3QudG9wIDwgd2luZG93LmlubmVySGVpZ2h0ICYmIHJlY3QuYm90dG9tID4gMCkgewogICAgICAgICAgdGhpcy5sb2FkQW5kUmVuZGVyUHJldmlldygpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJjdXJyZW50UHJldmlld1BhZ2UiKSAmJiB0aGlzLnJlbmRlcmVkKSB7CiAgICAgICAgYXdhaXQgdGhpcy5zY2hlZHVsZVJlbmRlclBhZ2VzKCk7CiAgICAgIH0KICAgIH0KICAgIGdldENvbnRleHRNZW51SXRlbXMoKSB7CiAgICAgIGNvbnN0IGl0ZW1zID0gW107CiAgICAgIGlmICh0aGlzLmNsaWNrYWJsZSkgewogICAgICAgIGl0ZW1zLnB1c2goewogICAgICAgICAgbmFtZTogIlZpZXcgUERGIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOkV5ZSIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgidGlsZS1jbGljayIsIHsKICAgICAgICAgICAgICBkZXRhaWw6IHRoaXMuZ2V0VGlsZUNsaWNrRGV0YWlsKCksCiAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgICAgICB9KSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgaXRlbXMucHVzaCh7IGRpdmlkZXI6IHRydWUgfSk7CiAgICAgIH0KICAgICAgaXRlbXMucHVzaCh7CiAgICAgICAgbmFtZTogIk9wZW4gUERGIGluIE5ldyBUYWIiLAogICAgICAgIGljb25OYW1lOiAibHVjaWRlOkV4dGVybmFsTGluayIsCiAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICB3aW5kb3cub3Blbih0aGlzLnBkZlVybCwgIl9ibGFuayIpOwogICAgICAgIH0KICAgICAgfSwgeyBkaXZpZGVyOiB0cnVlIH0sIHsKICAgICAgICBuYW1lOiAiQ29weSBQREYgVVJMIiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpDb3B5IiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRoaXMucGRmVXJsKTsKICAgICAgICB9CiAgICAgIH0sIHsKICAgICAgICBuYW1lOiAiRG93bmxvYWQgUERGIiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpEb3dubG9hZCIsCiAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICBjb25zdCBsaW5rMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKICAgICAgICAgIGxpbmszLmhyZWYgPSB0aGlzLnBkZlVybDsKICAgICAgICAgIGxpbmszLmRvd25sb2FkID0gdGhpcy5wZGZVcmwuc3BsaXQoIi8iKS5wb3AoKSB8fCAiZG9jdW1lbnQucGRmIjsKICAgICAgICAgIGxpbmszLmNsaWNrKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgaWYgKHRoaXMucGFnZUNvdW50ID4gMCkgewogICAgICAgIGl0ZW1zLnB1c2goeyBkaXZpZGVyOiB0cnVlIH0sIHsKICAgICAgICAgIG5hbWU6IGAke3RoaXMucGFnZUNvdW50fSBwYWdlJHt0aGlzLnBhZ2VDb3VudCA+IDEgPyAicyIgOiAiIn1gLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6RmlsZVRleHQiLAogICAgICAgICAgZGlzYWJsZWQ6IHRydWUsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gaXRlbXM7CiAgICB9CiAgICBjYWNoZUVsZW1lbnRzKCkgewogICAgICBpZiAoIXRoaXMuc3RhY2tFbGVtZW50KSB7CiAgICAgICAgdGhpcy5zdGFja0VsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5wcmV2aWV3LXN0YWNrIik7CiAgICAgIH0KICAgIH0KICAgIHNldHVwUmVzaXplT2JzZXJ2ZXIoKSB7CiAgICAgIGlmICh0aGlzLnJlc2l6ZU9ic2VydmVyKQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7CiAgICAgICAgaWYgKHRoaXMucmVuZGVyZWQgJiYgdGhpcy5wZGZEb2N1bWVudCAmJiAhdGhpcy5sb2FkaW5nKSB7CiAgICAgICAgICB2b2lkIHRoaXMuc2NoZWR1bGVSZW5kZXJQYWdlcygpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzKTsKICAgIH0KICAgIGdldEF2YWlsYWJsZVNpemUoKSB7CiAgICAgIGlmICghdGhpcy5zdGFja0VsZW1lbnQpIHsKICAgICAgICB0aGlzLnN0YWNrRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnByZXZpZXctc3RhY2siKTsKICAgICAgfQogICAgICBpZiAoIXRoaXMuc3RhY2tFbGVtZW50KSB7CiAgICAgICAgcmV0dXJuIHsgYXZhaWxhYmxlV2lkdGg6IDIwMCwgYXZhaWxhYmxlSGVpZ2h0OiAyNjAgfTsKICAgICAgfQogICAgICBjb25zdCByZWN0ID0gdGhpcy5zdGFja0VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gTWF0aC5tYXgocmVjdC53aWR0aCwgMCkgfHwgMjAwOwogICAgICBjb25zdCBhdmFpbGFibGVIZWlnaHQgPSBNYXRoLm1heChyZWN0LmhlaWdodCwgMCkgfHwgMjYwOwogICAgICByZXR1cm4geyBhdmFpbGFibGVXaWR0aCwgYXZhaWxhYmxlSGVpZ2h0IH07CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczc4KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzVGlsZVBkZjIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW1lZGlhL2RlZXMtcGRmLXByZXZpZXcvY29tcG9uZW50LmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBfX2VzRGVjb3JhdGU3OCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNzkgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNQZGZQcmV2aWV3ID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy1wZGYtcHJldmlldyIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzVGlsZVBkZjsKICB2YXIgRGVlc1BkZlByZXZpZXcyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfX2VzRGVjb3JhdGU3OChudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNQZGZQcmV2aWV3MiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFtdOwogICAgLy8gSGlkZSBmcm9tIGRlbW8gY2F0YWxvZwogICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGNvbnNvbGUud2FybigiW2RlZXMtcGRmLXByZXZpZXddIGlzIGRlcHJlY2F0ZWQuIFVzZSA8ZGVlcy10aWxlLXBkZj4gaW5zdGVhZC4gVGhpcyBjb21wb25lbnQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuIik7CiAgICAgIHJldHVybiBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM3OShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1BkZlByZXZpZXcyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXRpbGUtaW1hZ2UvZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgZGVtbzYgPSAoKSA9PiBiMmAKICA8c3R5bGU+CiAgICAuZGVtby1jb250YWluZXIgewogICAgICBwYWRkaW5nOiA0MHB4OwogICAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1OwogICAgfQogICAgLmRlbW8tc2VjdGlvbiB7CiAgICAgIG1hcmdpbi1ib3R0b206IDYwcHg7CiAgICB9CiAgICBoMyB7CiAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIH0KICAgIC50aWxlLXJvdyB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGdhcDogMjRweDsKICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIH0KICA8L3N0eWxlPgoKICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICA8aDM+SW1hZ2UgVGlsZXM8L2gzPgogICAgICA8ZGl2IGNsYXNzPSJ0aWxlLXJvdyI+CiAgICAgICAgPGRlZXMtdGlsZS1pbWFnZQogICAgICAgICAgc3JjPSJodHRwczovL3BpY3N1bS5waG90b3MvODAwLzYwMCIKICAgICAgICAgIGFsdD0iTGFuZHNjYXBlIHBob3RvIgogICAgICAgICAgbGFiZWw9ImxhbmRzY2FwZS5qcGciCiAgICAgICAgICBAdGlsZS1jbGljaz0keyhlMTEpID0+IGNvbnNvbGUubG9nKCJJbWFnZSBjbGlja2VkOiIsIGUxMS5kZXRhaWwpfQogICAgICAgID48L2RlZXMtdGlsZS1pbWFnZT4KCiAgICAgICAgPGRlZXMtdGlsZS1pbWFnZQogICAgICAgICAgc3JjPSJodHRwczovL3BpY3N1bS5waG90b3MvNDAwLzQwMCIKICAgICAgICAgIGFsdD0iU3F1YXJlIHBob3RvIgogICAgICAgICAgbGFiZWw9InNxdWFyZS5wbmciCiAgICAgICAgPjwvZGVlcy10aWxlLWltYWdlPgoKICAgICAgICA8ZGVlcy10aWxlLWltYWdlCiAgICAgICAgICBzcmM9Imh0dHBzOi8vcGljc3VtLnBob3Rvcy8zMDAvOTAwIgogICAgICAgICAgYWx0PSJQb3J0cmFpdCBwaG90byIKICAgICAgICAgIGxhYmVsPSJwb3J0cmFpdC53ZWJwIgogICAgICAgID48L2RlZXMtdGlsZS1pbWFnZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICA8aDM+U2l6ZSBWYXJpYW50czwvaDM+CiAgICAgIDxkaXYgY2xhc3M9InRpbGUtcm93Ij4KICAgICAgICA8ZGVlcy10aWxlLWltYWdlCiAgICAgICAgICBzaXplPSJzbWFsbCIKICAgICAgICAgIHNyYz0iaHR0cHM6Ly9waWNzdW0ucGhvdG9zLzIwMC8yMDAiCiAgICAgICAgICBhbHQ9IlNtYWxsIgogICAgICAgICAgbGFiZWw9InNtYWxsLmpwZyIKICAgICAgICA+PC9kZWVzLXRpbGUtaW1hZ2U+CgogICAgICAgIDxkZWVzLXRpbGUtaW1hZ2UKICAgICAgICAgIHNyYz0iaHR0cHM6Ly9waWNzdW0ucGhvdG9zLzYwMC80MDAiCiAgICAgICAgICBhbHQ9IkRlZmF1bHQiCiAgICAgICAgICBsYWJlbD0iZGVmYXVsdC5qcGciCiAgICAgICAgPjwvZGVlcy10aWxlLWltYWdlPgoKICAgICAgICA8ZGVlcy10aWxlLWltYWdlCiAgICAgICAgICBzaXplPSJsYXJnZSIKICAgICAgICAgIHNyYz0iaHR0cHM6Ly9waWNzdW0ucGhvdG9zLzEyMDAvODAwIgogICAgICAgICAgYWx0PSJMYXJnZSIKICAgICAgICAgIGxhYmVsPSJsYXJnZS5qcGciCiAgICAgICAgPjwvZGVlcy10aWxlLWltYWdlPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgIDxoMz5FcnJvciBTdGF0ZSAoYnJva2VuIFVSTCk8L2gzPgogICAgICA8ZGVlcy10aWxlLWltYWdlCiAgICAgICAgc3JjPSJodHRwczovL2ludmFsaWQtdXJsLXRoYXQtZG9lcy1ub3QtZXhpc3QuZXhhbXBsZS9pbWFnZS5wbmciCiAgICAgICAgYWx0PSJCcm9rZW4iCiAgICAgICAgbGFiZWw9ImJyb2tlbi5wbmciCiAgICAgID48L2RlZXMtdGlsZS1pbWFnZT4KICAgIDwvZGl2PgogIDwvZGl2PgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW1lZGlhL2RlZXMtdGlsZS1pbWFnZS9jb21wb25lbnQuanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIF9fZXNEZWNvcmF0ZTc5ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM4MCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1RpbGVJbWFnZSA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtdGlsZS1pbWFnZSIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzVGlsZUJhc2U7CiAgbGV0IF9zcmNfZGVjb3JhdG9yczsKICBsZXQgX3NyY19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NyY19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWx0X2RlY29yYXRvcnM7CiAgbGV0IF9hbHRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hbHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ltYWdlTG9hZGVkX2RlY29yYXRvcnM7CiAgbGV0IF9pbWFnZUxvYWRlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ltYWdlTG9hZGVkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pbWFnZVdpZHRoX2RlY29yYXRvcnM7CiAgbGV0IF9pbWFnZVdpZHRoX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW1hZ2VXaWR0aF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW1hZ2VIZWlnaHRfZGVjb3JhdG9yczsKICBsZXQgX2ltYWdlSGVpZ2h0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW1hZ2VIZWlnaHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1RpbGVJbWFnZTIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9zcmNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9hbHRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9pbWFnZUxvYWRlZF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaW1hZ2VXaWR0aF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaW1hZ2VIZWlnaHRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlNzkodGhpcywgbnVsbCwgX3NyY19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzcmMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNyYyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zcmMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNyYyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zcmNfaW5pdGlhbGl6ZXJzLCBfc3JjX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzkodGhpcywgbnVsbCwgX2FsdF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhbHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFsdCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hbHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFsdCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hbHRfaW5pdGlhbGl6ZXJzLCBfYWx0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzkodGhpcywgbnVsbCwgX2ltYWdlTG9hZGVkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImltYWdlTG9hZGVkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpbWFnZUxvYWRlZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pbWFnZUxvYWRlZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaW1hZ2VMb2FkZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaW1hZ2VMb2FkZWRfaW5pdGlhbGl6ZXJzLCBfaW1hZ2VMb2FkZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3OSh0aGlzLCBudWxsLCBfaW1hZ2VXaWR0aF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpbWFnZVdpZHRoIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpbWFnZVdpZHRoIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmltYWdlV2lkdGgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmltYWdlV2lkdGggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaW1hZ2VXaWR0aF9pbml0aWFsaXplcnMsIF9pbWFnZVdpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzkodGhpcywgbnVsbCwgX2ltYWdlSGVpZ2h0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImltYWdlSGVpZ2h0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpbWFnZUhlaWdodCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pbWFnZUhlaWdodCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaW1hZ2VIZWlnaHQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaW1hZ2VIZWlnaHRfaW5pdGlhbGl6ZXJzLCBfaW1hZ2VIZWlnaHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3OShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNUaWxlSW1hZ2UyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtbzY7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiTWVkaWEiXTsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIC4uLnRpbGVCYXNlU3R5bGVzLAogICAgICBpYAogICAgICAuaW1hZ2Utd3JhcHBlciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmVwZWF0aW5nLWNvbmljLWdyYWRpZW50KCNlOGU4ZTggMCUgMjUlLCB3aGl0ZSAwJSA1MCUpIDUwJSAvIDE2cHggMTZweCIsICJyZXBlYXRpbmctY29uaWMtZ3JhZGllbnQoaHNsKDIxNSAyMCUgMTglKSAwJSAyNSUsIGhzbCgyMTUgMjAlIDE0JSkgMCUgNTAlKSA1MCUgLyAxNnB4IDE2cHgiKX07CiAgICAgIH0KCiAgICAgIC5pbWFnZS13cmFwcGVyIGltZyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG9iamVjdC1maXQ6IGNvdmVyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcyBlYXNlOwogICAgICB9CgogICAgICAuaW1hZ2Utd3JhcHBlciBpbWcubG9hZGVkIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAuaW1hZ2Utd3JhcHBlciBpbWcubG9hZGluZyB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLnRpbGUtYmFkZ2UtdG9wcmlnaHQuZGltZW5zaW9uLWJhZGdlIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycyBlYXNlOwogICAgICB9CgogICAgICAudGlsZS1jb250YWluZXIuY2xpY2thYmxlOmhvdmVyIC50aWxlLWJhZGdlLXRvcHJpZ2h0LmRpbWVuc2lvbi1iYWRnZSB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQogICAgYAogICAgXTsKICAgICNzcmNfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzODAodGhpcywgX3NyY19pbml0aWFsaXplcnMsICIiKTsKICAgIGdldCBzcmMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzcmNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzcmModmFsdWUyKSB7CiAgICAgIHRoaXMuI3NyY19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2FsdF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODAodGhpcywgX3NyY19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODAodGhpcywgX2FsdF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgYWx0KCkgewogICAgICByZXR1cm4gdGhpcy4jYWx0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYWx0KHZhbHVlMikgewogICAgICB0aGlzLiNhbHRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpbWFnZUxvYWRlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODAodGhpcywgX2FsdF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODAodGhpcywgX2ltYWdlTG9hZGVkX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpbWFnZUxvYWRlZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2ltYWdlTG9hZGVkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaW1hZ2VMb2FkZWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2ltYWdlTG9hZGVkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaW1hZ2VXaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODAodGhpcywgX2ltYWdlTG9hZGVkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4MCh0aGlzLCBfaW1hZ2VXaWR0aF9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBpbWFnZVdpZHRoKCkgewogICAgICByZXR1cm4gdGhpcy4jaW1hZ2VXaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGltYWdlV2lkdGgodmFsdWUyKSB7CiAgICAgIHRoaXMuI2ltYWdlV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpbWFnZUhlaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODAodGhpcywgX2ltYWdlV2lkdGhfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczgwKHRoaXMsIF9pbWFnZUhlaWdodF9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBpbWFnZUhlaWdodCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2ltYWdlSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaW1hZ2VIZWlnaHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2ltYWdlSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBoYXNTdGFydGVkTG9hZGluZyA9IChfX3J1bkluaXRpYWxpemVyczgwKHRoaXMsIF9pbWFnZUhlaWdodF9leHRyYUluaXRpYWxpemVycyksIGZhbHNlKTsKICAgIHJlbmRlclRpbGVDb250ZW50KCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImltYWdlLXdyYXBwZXIiPgogICAgICAgICR7dGhpcy5oYXNTdGFydGVkTG9hZGluZyA/IGIyYAogICAgICAgICAgPGltZwogICAgICAgICAgICBjbGFzcz0iJHt0aGlzLmltYWdlTG9hZGVkID8gImxvYWRlZCIgOiAibG9hZGluZyJ9IgogICAgICAgICAgICBzcmM9IiR7dGhpcy5zcmN9IgogICAgICAgICAgICBhbHQ9IiR7dGhpcy5hbHR9IgogICAgICAgICAgICBAbG9hZD0ke3RoaXMuaGFuZGxlSW1hZ2VMb2FkfQogICAgICAgICAgICBAZXJyb3I9JHt0aGlzLmhhbmRsZUltYWdlRXJyb3J9CiAgICAgICAgICAvPgogICAgICAgIGAgOiAiIn0KICAgICAgPC9kaXY+CgogICAgICAke3RoaXMuaW1hZ2VXaWR0aCA+IDAgJiYgdGhpcy5pbWFnZUhlaWdodCA+IDAgPyBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJ0aWxlLWJhZGdlLXRvcHJpZ2h0IGRpbWVuc2lvbi1iYWRnZSI+CiAgICAgICAgICAke3RoaXMuaW1hZ2VXaWR0aH0gw5cgJHt0aGlzLmltYWdlSGVpZ2h0fQogICAgICAgIDwvZGl2PgogICAgICBgIDogIiJ9CgogICAgICAke3RoaXMuaW1hZ2VMb2FkZWQgPyBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJ0aWxlLWluZm8iPgogICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6SW1hZ2UiPjwvZGVlcy1pY29uPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRpbGUtaW5mby10ZXh0Ij4ke3RoaXMuaW1hZ2VXaWR0aH0gw5cgJHt0aGlzLmltYWdlSGVpZ2h0fTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgYCA6ICIifQoKICAgICAgJHt0aGlzLmNsaWNrYWJsZSA/IGIyYAogICAgICAgIDxkaXYgY2xhc3M9InRpbGUtb3ZlcmxheSI+CiAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpFeWUiPjwvZGVlcy1pY29uPgogICAgICAgICAgPHNwYW4+VmlldyBJbWFnZTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgYCA6ICIifQogICAgYDsKICAgIH0KICAgIGdldFRpbGVDbGlja0RldGFpbCgpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBzcmM6IHRoaXMuc3JjLAogICAgICAgIGFsdDogdGhpcy5hbHQsCiAgICAgICAgd2lkdGg6IHRoaXMuaW1hZ2VXaWR0aCwKICAgICAgICBoZWlnaHQ6IHRoaXMuaW1hZ2VIZWlnaHQKICAgICAgfTsKICAgIH0KICAgIG9uQmVjYW1lVmlzaWJsZSgpIHsKICAgICAgaWYgKCF0aGlzLmhhc1N0YXJ0ZWRMb2FkaW5nICYmIHRoaXMuc3JjKSB7CiAgICAgICAgdGhpcy5oYXNTdGFydGVkTG9hZGluZyA9IHRydWU7CiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTsKICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgfQogICAgfQogICAgaGFuZGxlSW1hZ2VMb2FkKGUxMSkgewogICAgICBjb25zdCBpbWcgPSBlMTEudGFyZ2V0OwogICAgICB0aGlzLmltYWdlV2lkdGggPSBpbWcubmF0dXJhbFdpZHRoOwogICAgICB0aGlzLmltYWdlSGVpZ2h0ID0gaW1nLm5hdHVyYWxIZWlnaHQ7CiAgICAgIHRoaXMuaW1hZ2VMb2FkZWQgPSB0cnVlOwogICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgIH0KICAgIGhhbmRsZUltYWdlRXJyb3IoKSB7CiAgICAgIHRoaXMuZXJyb3IgPSB0cnVlOwogICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgIH0KICAgIGFzeW5jIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoInNyYyIpICYmIHRoaXMuc3JjICYmIHRoaXMuaXNWaXNpYmxlKSB7CiAgICAgICAgdGhpcy5oYXNTdGFydGVkTG9hZGluZyA9IHRydWU7CiAgICAgICAgdGhpcy5pbWFnZUxvYWRlZCA9IGZhbHNlOwogICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzODAoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNUaWxlSW1hZ2UyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXRpbGUtYXVkaW8vZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgZGVtbzcgPSAoKSA9PiBiMmAKICA8c3R5bGU+CiAgICAuZGVtby1jb250YWluZXIgewogICAgICBwYWRkaW5nOiA0MHB4OwogICAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1OwogICAgfQogICAgLmRlbW8tc2VjdGlvbiB7CiAgICAgIG1hcmdpbi1ib3R0b206IDYwcHg7CiAgICB9CiAgICBoMyB7CiAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIH0KICAgIC50aWxlLXJvdyB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGdhcDogMjRweDsKICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIH0KICA8L3N0eWxlPgoKICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICA8aDM+QXVkaW8gVGlsZXM8L2gzPgogICAgICA8ZGl2IGNsYXNzPSJ0aWxlLXJvdyI+CiAgICAgICAgPGRlZXMtdGlsZS1hdWRpbwogICAgICAgICAgc3JjPSJodHRwczovL3d3dy5zb3VuZGhlbGl4LmNvbS9leGFtcGxlcy9tcDMvU291bmRIZWxpeC1Tb25nLTEubXAzIgogICAgICAgICAgdGl0bGU9IlNvdW5kSGVsaXggU29uZyAxIgogICAgICAgICAgYXJ0aXN0PSJULiBTY2h1ZXJnZXIiCiAgICAgICAgICBsYWJlbD0ic291bmRoZWxpeC0xLm1wMyIKICAgICAgICAgIEB0aWxlLWNsaWNrPSR7KGUxMSkgPT4gY29uc29sZS5sb2coIkF1ZGlvIGNsaWNrZWQ6IiwgZTExLmRldGFpbCl9CiAgICAgICAgPjwvZGVlcy10aWxlLWF1ZGlvPgoKICAgICAgICA8ZGVlcy10aWxlLWF1ZGlvCiAgICAgICAgICBzcmM9Imh0dHBzOi8vd3d3LnNvdW5kaGVsaXguY29tL2V4YW1wbGVzL21wMy9Tb3VuZEhlbGl4LVNvbmctMi5tcDMiCiAgICAgICAgICB0aXRsZT0iU291bmRIZWxpeCBTb25nIDIiCiAgICAgICAgICBhcnRpc3Q9IlQuIFNjaHVlcmdlciIKICAgICAgICAgIGxhYmVsPSJzb3VuZGhlbGl4LTIubXAzIgogICAgICAgID48L2RlZXMtdGlsZS1hdWRpbz4KCiAgICAgICAgPGRlZXMtdGlsZS1hdWRpbwogICAgICAgICAgc3JjPSJodHRwczovL3d3dy5zb3VuZGhlbGl4LmNvbS9leGFtcGxlcy9tcDMvU291bmRIZWxpeC1Tb25nLTMubXAzIgogICAgICAgICAgdGl0bGU9IlNvdW5kSGVsaXggU29uZyAzIgogICAgICAgICAgbGFiZWw9InNvdW5kaGVsaXgtMy5tcDMiCiAgICAgICAgPjwvZGVlcy10aWxlLWF1ZGlvPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgIDxoMz5TaXplIFZhcmlhbnRzPC9oMz4KICAgICAgPGRpdiBjbGFzcz0idGlsZS1yb3ciPgogICAgICAgIDxkZWVzLXRpbGUtYXVkaW8KICAgICAgICAgIHNpemU9InNtYWxsIgogICAgICAgICAgc3JjPSJodHRwczovL3d3dy5zb3VuZGhlbGl4LmNvbS9leGFtcGxlcy9tcDMvU291bmRIZWxpeC1Tb25nLTEubXAzIgogICAgICAgICAgdGl0bGU9IlNtYWxsIgogICAgICAgICAgbGFiZWw9InNtYWxsLm1wMyIKICAgICAgICA+PC9kZWVzLXRpbGUtYXVkaW8+CgogICAgICAgIDxkZWVzLXRpbGUtYXVkaW8KICAgICAgICAgIHNyYz0iaHR0cHM6Ly93d3cuc291bmRoZWxpeC5jb20vZXhhbXBsZXMvbXAzL1NvdW5kSGVsaXgtU29uZy0xLm1wMyIKICAgICAgICAgIHRpdGxlPSJEZWZhdWx0IgogICAgICAgICAgbGFiZWw9ImRlZmF1bHQubXAzIgogICAgICAgID48L2RlZXMtdGlsZS1hdWRpbz4KCiAgICAgICAgPGRlZXMtdGlsZS1hdWRpbwogICAgICAgICAgc2l6ZT0ibGFyZ2UiCiAgICAgICAgICBzcmM9Imh0dHBzOi8vd3d3LnNvdW5kaGVsaXguY29tL2V4YW1wbGVzL21wMy9Tb3VuZEhlbGl4LVNvbmctMS5tcDMiCiAgICAgICAgICB0aXRsZT0iTGFyZ2UiCiAgICAgICAgICBsYWJlbD0ibGFyZ2UubXAzIgogICAgICAgID48L2RlZXMtdGlsZS1hdWRpbz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXRpbGUtYXVkaW8vY29tcG9uZW50LmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBfX2VzRGVjb3JhdGU4MCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzODEgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNUaWxlQXVkaW8gPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLXRpbGUtYXVkaW8iKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc1RpbGVCYXNlOwogIGxldCBfc3JjX2RlY29yYXRvcnM7CiAgbGV0IF9zcmNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zcmNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RpdGxlX2RlY29yYXRvcnM7CiAgbGV0IF90aXRsZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RpdGxlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hcnRpc3RfZGVjb3JhdG9yczsKICBsZXQgX2FydGlzdF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FydGlzdF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZHVyYXRpb25fZGVjb3JhdG9yczsKICBsZXQgX2R1cmF0aW9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZHVyYXRpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3dhdmVmb3JtRGF0YV9kZWNvcmF0b3JzOwogIGxldCBfd2F2ZWZvcm1EYXRhX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfd2F2ZWZvcm1EYXRhX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF93YXZlZm9ybVJlYWR5X2RlY29yYXRvcnM7CiAgbGV0IF93YXZlZm9ybVJlYWR5X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfd2F2ZWZvcm1SZWFkeV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNQcmV2aWV3UGxheWluZ19kZWNvcmF0b3JzOwogIGxldCBfaXNQcmV2aWV3UGxheWluZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzUHJldmlld1BsYXlpbmdfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1RpbGVBdWRpbzIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9zcmNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF90aXRsZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2FydGlzdF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2R1cmF0aW9uX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF93YXZlZm9ybURhdGFfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3dhdmVmb3JtUmVhZHlfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2lzUHJldmlld1BsYXlpbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlODAodGhpcywgbnVsbCwgX3NyY19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzcmMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNyYyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zcmMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNyYyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zcmNfaW5pdGlhbGl6ZXJzLCBfc3JjX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODAodGhpcywgbnVsbCwgX3RpdGxlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRpdGxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0aXRsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50aXRsZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGl0bGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGl0bGVfaW5pdGlhbGl6ZXJzLCBfdGl0bGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4MCh0aGlzLCBudWxsLCBfYXJ0aXN0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFydGlzdCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYXJ0aXN0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmFydGlzdCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYXJ0aXN0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FydGlzdF9pbml0aWFsaXplcnMsIF9hcnRpc3RfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4MCh0aGlzLCBudWxsLCBfZHVyYXRpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZHVyYXRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImR1cmF0aW9uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmR1cmF0aW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kdXJhdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kdXJhdGlvbl9pbml0aWFsaXplcnMsIF9kdXJhdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTgwKHRoaXMsIG51bGwsIF93YXZlZm9ybURhdGFfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAid2F2ZWZvcm1EYXRhIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ3YXZlZm9ybURhdGEiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoud2F2ZWZvcm1EYXRhLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai53YXZlZm9ybURhdGEgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfd2F2ZWZvcm1EYXRhX2luaXRpYWxpemVycywgX3dhdmVmb3JtRGF0YV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTgwKHRoaXMsIG51bGwsIF93YXZlZm9ybVJlYWR5X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIndhdmVmb3JtUmVhZHkiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIndhdmVmb3JtUmVhZHkiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoud2F2ZWZvcm1SZWFkeSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoud2F2ZWZvcm1SZWFkeSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF93YXZlZm9ybVJlYWR5X2luaXRpYWxpemVycywgX3dhdmVmb3JtUmVhZHlfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4MCh0aGlzLCBudWxsLCBfaXNQcmV2aWV3UGxheWluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc1ByZXZpZXdQbGF5aW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc1ByZXZpZXdQbGF5aW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzUHJldmlld1BsYXlpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzUHJldmlld1BsYXlpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNQcmV2aWV3UGxheWluZ19pbml0aWFsaXplcnMsIF9pc1ByZXZpZXdQbGF5aW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODAobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzVGlsZUF1ZGlvMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW83OwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIk1lZGlhIl07CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICAuLi50aWxlQmFzZVN0eWxlcywKICAgICAgaWAKICAgICAgLmF1ZGlvLWNvbnRlbnQgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCBoc2woMjUwIDQwJSA5NiUpLCBoc2woMjgwIDMwJSA5NCUpKSIsICJsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCBoc2woMjUwIDMwJSAxNiUpLCBoc2woMjgwIDI1JSAxNCUpKSIpfTsKICAgICAgfQoKICAgICAgLm11c2ljLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogNDhweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyNTAgNjAlIDY1JSkiLCAiaHNsKDI1MCA2MCUgNzAlKSIpfTsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgIH0KCiAgICAgIC5hdWRpby10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjUwIDIwJSAzNSUpIiwgImhzbCgyNTAgMjAlIDgwJSkiKX07CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAuYXVkaW8tYXJ0aXN0IHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyNTAgMTUlIDUwJSkiLCAiaHNsKDI1MCAxNSUgNjUlKSIpfTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgcGFkZGluZzogMCAxNnB4OwogICAgICAgIG1hcmdpbi10b3A6IC0xMnB4OwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgIC53YXZlZm9ybS1jb250YWluZXIgewogICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAzMnB4KTsKICAgICAgICBoZWlnaHQ6IDQwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC53YXZlZm9ybS1jb250YWluZXIgY2FudmFzIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCgogICAgICAucGxheS1vdmVybGF5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycyBlYXNlOwogICAgICAgIHotaW5kZXg6IDE4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAudGlsZS1jb250YWluZXIuY2xpY2thYmxlOmhvdmVyIC5wbGF5LW92ZXJsYXkgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5wbGF5LWNpcmNsZSB7CiAgICAgICAgd2lkdGg6IDQ4cHg7CiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpOwogICAgICB9CgogICAgICAucGxheS1jaXJjbGUgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICBgCiAgICBdOwogICAgI3NyY19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM4MSh0aGlzLCBfc3JjX2luaXRpYWxpemVycywgIiIpOwogICAgZ2V0IHNyYygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NyY19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNyYyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc3JjX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdGl0bGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgxKHRoaXMsIF9zcmNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczgxKHRoaXMsIF90aXRsZV9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgdGl0bGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0aXRsZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRpdGxlKHZhbHVlMikgewogICAgICB0aGlzLiN0aXRsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2FydGlzdF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODEodGhpcywgX3RpdGxlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4MSh0aGlzLCBfYXJ0aXN0X2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBhcnRpc3QoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhcnRpc3RfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhcnRpc3QodmFsdWUyKSB7CiAgICAgIHRoaXMuI2FydGlzdF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2R1cmF0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4MSh0aGlzLCBfYXJ0aXN0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4MSh0aGlzLCBfZHVyYXRpb25faW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgZHVyYXRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNkdXJhdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGR1cmF0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNkdXJhdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3dhdmVmb3JtRGF0YV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODEodGhpcywgX2R1cmF0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4MSh0aGlzLCBfd2F2ZWZvcm1EYXRhX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCB3YXZlZm9ybURhdGEoKSB7CiAgICAgIHJldHVybiB0aGlzLiN3YXZlZm9ybURhdGFfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB3YXZlZm9ybURhdGEodmFsdWUyKSB7CiAgICAgIHRoaXMuI3dhdmVmb3JtRGF0YV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3dhdmVmb3JtUmVhZHlfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgxKHRoaXMsIF93YXZlZm9ybURhdGFfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczgxKHRoaXMsIF93YXZlZm9ybVJlYWR5X2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCB3YXZlZm9ybVJlYWR5KCkgewogICAgICByZXR1cm4gdGhpcy4jd2F2ZWZvcm1SZWFkeV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHdhdmVmb3JtUmVhZHkodmFsdWUyKSB7CiAgICAgIHRoaXMuI3dhdmVmb3JtUmVhZHlfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpc1ByZXZpZXdQbGF5aW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4MSh0aGlzLCBfd2F2ZWZvcm1SZWFkeV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODEodGhpcywgX2lzUHJldmlld1BsYXlpbmdfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGlzUHJldmlld1BsYXlpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc1ByZXZpZXdQbGF5aW5nX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaXNQcmV2aWV3UGxheWluZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXNQcmV2aWV3UGxheWluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgYXVkaW9FbGVtZW50ID0gKF9fcnVuSW5pdGlhbGl6ZXJzODEodGhpcywgX2lzUHJldmlld1BsYXlpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgIHByZXZpZXdUaW1lb3V0ID0gbnVsbDsKICAgIGhhc0xvYWRlZFdhdmVmb3JtID0gZmFsc2U7CiAgICByZW5kZXJUaWxlQ29udGVudCgpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJhdWRpby1jb250ZW50Ij4KICAgICAgICA8ZGVlcy1pY29uIGNsYXNzPSJtdXNpYy1pY29uIiBpY29uPSJsdWNpZGU6TXVzaWMiPjwvZGVlcy1pY29uPgoKICAgICAgICAke3RoaXMudGl0bGUgPyBiMmA8ZGl2IGNsYXNzPSJhdWRpby10aXRsZSI+JHt0aGlzLnRpdGxlfTwvZGl2PmAgOiAiIn0KICAgICAgICAke3RoaXMuYXJ0aXN0ID8gYjJgPGRpdiBjbGFzcz0iYXVkaW8tYXJ0aXN0Ij4ke3RoaXMuYXJ0aXN0fTwvZGl2PmAgOiAiIn0KCiAgICAgICAgJHt0aGlzLndhdmVmb3JtUmVhZHkgPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9IndhdmVmb3JtLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxjYW52YXM+PC9jYW52YXM+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgIDogIiJ9CiAgICAgIDwvZGl2PgoKICAgICAgJHt0aGlzLmR1cmF0aW9uID4gMCA/IGIyYAogICAgICAgIDxkaXYgY2xhc3M9InRpbGUtYmFkZ2UtY29ybmVyIj4ke3RoaXMuZm9ybWF0VGltZSh0aGlzLmR1cmF0aW9uKX08L2Rpdj4KICAgICAgYCA6ICIifQoKICAgICAgPGRpdiBjbGFzcz0icGxheS1vdmVybGF5Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJwbGF5LWNpcmNsZSI+CiAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpQbGF5Ij48L2RlZXMtaWNvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICAke3RoaXMuY2xpY2thYmxlID8gYjJgCiAgICAgICAgPGRpdiBjbGFzcz0idGlsZS1vdmVybGF5Ij4KICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOkhlYWRwaG9uZXMiPjwvZGVlcy1pY29uPgogICAgICAgICAgPHNwYW4+UGxheSBBdWRpbzwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgYCA6ICIifQogICAgYDsKICAgIH0KICAgIGdldFRpbGVDbGlja0RldGFpbCgpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBzcmM6IHRoaXMuc3JjLAogICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLAogICAgICAgIGFydGlzdDogdGhpcy5hcnRpc3QsCiAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24KICAgICAgfTsKICAgIH0KICAgIG9uQmVjYW1lVmlzaWJsZSgpIHsKICAgICAgaWYgKCF0aGlzLmhhc0xvYWRlZFdhdmVmb3JtICYmIHRoaXMuc3JjKSB7CiAgICAgICAgdGhpcy5oYXNMb2FkZWRXYXZlZm9ybSA9IHRydWU7CiAgICAgICAgdGhpcy5sb2FkQXVkaW9NZXRhKCk7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGxvYWRBdWRpb01ldGEoKSB7CiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgYXVkaW8gPSBuZXcgQXVkaW8oKTsKICAgICAgICBhdWRpby5jcm9zc09yaWdpbiA9ICJhbm9ueW1vdXMiOwogICAgICAgIGF1ZGlvLnByZWxvYWQgPSAibWV0YWRhdGEiOwogICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0KSA9PiB7CiAgICAgICAgICBhdWRpby5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsICgpID0+IHsKICAgICAgICAgICAgdGhpcy5kdXJhdGlvbiA9IGF1ZGlvLmR1cmF0aW9uOwogICAgICAgICAgICByZXNvbHZlMigpOwogICAgICAgICAgfSwgeyBvbmNlOiB0cnVlIH0pOwogICAgICAgICAgYXVkaW8uYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCAoKSA9PiByZWplY3QobmV3IEVycm9yKCJGYWlsZWQgdG8gbG9hZCBhdWRpbyIpKSwgeyBvbmNlOiB0cnVlIH0pOwogICAgICAgICAgYXVkaW8uc3JjID0gdGhpcy5zcmM7CiAgICAgICAgfSk7CiAgICAgICAgYXdhaXQgdGhpcy5sb2FkV2F2ZWZvcm0oKTsKICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgfSBjYXRjaCB7CiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGxvYWRXYXZlZm9ybSgpIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHRoaXMuc3JjKTsKICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7CiAgICAgICAgY29uc3QgYXVkaW9Db250ZXh0ID0gbmV3IEF1ZGlvQ29udGV4dCgpOwogICAgICAgIGNvbnN0IGF1ZGlvQnVmZmVyID0gYXdhaXQgYXVkaW9Db250ZXh0LmRlY29kZUF1ZGlvRGF0YShhcnJheUJ1ZmZlcik7CiAgICAgICAgY29uc3QgY2hhbm5lbERhdGEgPSBhdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YSgwKTsKICAgICAgICBjb25zdCBiYXJzID0gODA7CiAgICAgICAgY29uc3QgYmxvY2tTaXplID0gTWF0aC5mbG9vcihjaGFubmVsRGF0YS5sZW5ndGggLyBiYXJzKTsKICAgICAgICBjb25zdCB3YXZlZm9ybSA9IFtdOwogICAgICAgIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IGJhcnM7IGkxMSsrKSB7CiAgICAgICAgICBsZXQgc3VtID0gMDsKICAgICAgICAgIGZvciAobGV0IGo0ID0gMDsgajQgPCBibG9ja1NpemU7IGo0KyspIHsKICAgICAgICAgICAgc3VtICs9IE1hdGguYWJzKGNoYW5uZWxEYXRhW2kxMSAqIGJsb2NrU2l6ZSArIGo0XSk7CiAgICAgICAgICB9CiAgICAgICAgICB3YXZlZm9ybS5wdXNoKHN1bSAvIGJsb2NrU2l6ZSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1heDMgPSBNYXRoLm1heCguLi53YXZlZm9ybSk7CiAgICAgICAgdGhpcy53YXZlZm9ybURhdGEgPSB3YXZlZm9ybS5tYXAoKHY1KSA9PiBtYXgzID4gMCA/IHY1IC8gbWF4MyA6IDApOwogICAgICAgIHRoaXMud2F2ZWZvcm1SZWFkeSA9IHRydWU7CiAgICAgICAgYXdhaXQgYXVkaW9Db250ZXh0LmNsb3NlKCk7CiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgICB0aGlzLmRyYXdXYXZlZm9ybSgpOwogICAgICB9IGNhdGNoIHsKICAgICAgICB0aGlzLndhdmVmb3JtUmVhZHkgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgZHJhd1dhdmVmb3JtKCkgewogICAgICBpZiAoIXRoaXMud2F2ZWZvcm1SZWFkeSkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLndhdmVmb3JtLWNvbnRhaW5lciBjYW52YXMiKTsKICAgICAgaWYgKCFjYW52YXMpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBjb250YWluZXIgPSBjYW52YXMucGFyZW50RWxlbWVudDsKICAgICAgY29uc3QgZHByID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTsKICAgICAgY29uc3Qgd2lkdGggPSBjb250YWluZXIuY2xpZW50V2lkdGg7CiAgICAgIGNvbnN0IGhlaWdodCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7CiAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoICogZHByOwogICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogZHByOwogICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgaWYgKCFjdHgpCiAgICAgICAgcmV0dXJuOwogICAgICBjdHguc2NhbGUoZHByLCBkcHIpOwogICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwogICAgICBjb25zdCBiYXJzID0gdGhpcy53YXZlZm9ybURhdGEubGVuZ3RoOwogICAgICBpZiAoYmFycyA9PT0gMCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGJhcldpZHRoID0gd2lkdGggLyBiYXJzOwogICAgICBjb25zdCBpc0RhcmsgPSBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygidGhlbWUtZGFyayIpIHx8IHdpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIikubWF0Y2hlczsKICAgICAgY29uc3QgYmFyQ29sb3IgPSBpc0RhcmsgPyAiaHNsKDI1MCA1MCUgNjAlKSIgOiAiaHNsKDI1MCA1MCUgNzAlKSI7CiAgICAgIGN0eC5maWxsU3R5bGUgPSBiYXJDb2xvcjsKICAgICAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgYmFyczsgaTExKyspIHsKICAgICAgICBjb25zdCBhbXBsaXR1ZGUgPSB0aGlzLndhdmVmb3JtRGF0YVtpMTFdOwogICAgICAgIGNvbnN0IGJhckhlaWdodCA9IE1hdGgubWF4KDIsIGFtcGxpdHVkZSAqIChoZWlnaHQgLSA0KSk7CiAgICAgICAgY29uc3QgeDMgPSBpMTEgKiBiYXJXaWR0aDsKICAgICAgICBjb25zdCB5NSA9IChoZWlnaHQgLSBiYXJIZWlnaHQpIC8gMjsKICAgICAgICBjdHguZmlsbFJlY3QoeDMgKyAwLjUsIHk1LCBiYXJXaWR0aCAtIDEsIGJhckhlaWdodCk7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoInNyYyIpICYmIHRoaXMuc3JjICYmIHRoaXMuaXNWaXNpYmxlKSB7CiAgICAgICAgdGhpcy5oYXNMb2FkZWRXYXZlZm9ybSA9IHRydWU7CiAgICAgICAgdGhpcy53YXZlZm9ybVJlYWR5ID0gZmFsc2U7CiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IDA7CiAgICAgICAgdGhpcy5sb2FkQXVkaW9NZXRhKCk7CiAgICAgIH0KICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygid2F2ZWZvcm1SZWFkeSIpICYmIHRoaXMud2F2ZWZvcm1SZWFkeSkgewogICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7CiAgICAgICAgdGhpcy5kcmF3V2F2ZWZvcm0oKTsKICAgICAgfQogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGlmICh0aGlzLnByZXZpZXdUaW1lb3V0KSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucHJldmlld1RpbWVvdXQpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmF1ZGlvRWxlbWVudCkgewogICAgICAgIHRoaXMuYXVkaW9FbGVtZW50LnBhdXNlKCk7CiAgICAgICAgdGhpcy5hdWRpb0VsZW1lbnQuc3JjID0gIiI7CiAgICAgICAgdGhpcy5hdWRpb0VsZW1lbnQgPSBudWxsOwogICAgICB9CiAgICB9CiAgICBmb3JtYXRUaW1lKHNlY29uZHMpIHsKICAgICAgaWYgKCFpc0Zpbml0ZShzZWNvbmRzKSB8fCBzZWNvbmRzIDwgMCkKICAgICAgICByZXR1cm4gIjA6MDAiOwogICAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApOwogICAgICBjb25zdCBzZWNzID0gTWF0aC5mbG9vcihzZWNvbmRzICUgNjApOwogICAgICByZXR1cm4gYCR7bWluc306JHtzZWNzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKX1gOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM4MShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1RpbGVBdWRpbzIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW1lZGlhL2RlZXMtdGlsZS12aWRlby9kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vOCA9ICgpID0+IGIyYAogIDxzdHlsZT4KICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgIHBhZGRpbmc6IDQwcHg7CiAgICAgIGJhY2tncm91bmQ6ICNmNWY1ZjU7CiAgICB9CiAgICAuZGVtby1zZWN0aW9uIHsKICAgICAgbWFyZ2luLWJvdHRvbTogNjBweDsKICAgIH0KICAgIGgzIHsKICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICBmb250LXdlaWdodDogNjAwOwogICAgfQogICAgLnRpbGUtcm93IHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZ2FwOiAyNHB4OwogICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgfQogIDwvc3R5bGU+CgogIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgIDxoMz5WaWRlbyBUaWxlczwvaDM+CiAgICAgIDxkaXYgY2xhc3M9InRpbGUtcm93Ij4KICAgICAgICA8ZGVlcy10aWxlLXZpZGVvCiAgICAgICAgICBzcmM9Imh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vaHRtbC9tb3ZfYmJiLm1wNCIKICAgICAgICAgIGxhYmVsPSJidW5ueS5tcDQiCiAgICAgICAgICBAdGlsZS1jbGljaz0keyhlMTEpID0+IGNvbnNvbGUubG9nKCJWaWRlbyBjbGlja2VkOiIsIGUxMS5kZXRhaWwpfQogICAgICAgID48L2RlZXMtdGlsZS12aWRlbz4KCiAgICAgICAgPGRlZXMtdGlsZS12aWRlbwogICAgICAgICAgc3JjPSJodHRwczovL3d3dy53M3NjaG9vbHMuY29tL2h0bWwvbW92aWUubXA0IgogICAgICAgICAgcG9zdGVyPSJodHRwczovL3BpY3N1bS5waG90b3MvNDAwLzMwMCIKICAgICAgICAgIGxhYmVsPSJtb3ZpZS5tcDQiCiAgICAgICAgPjwvZGVlcy10aWxlLXZpZGVvPgoKICAgICAgICA8ZGVlcy10aWxlLXZpZGVvCiAgICAgICAgICBzcmM9Imh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vaHRtbC9tb3ZfYmJiLm1wNCIKICAgICAgICAgIGxhYmVsPSJhbm90aGVyLXZpZGVvLm1wNCIKICAgICAgICA+PC9kZWVzLXRpbGUtdmlkZW8+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgPGgzPlNpemUgVmFyaWFudHM8L2gzPgogICAgICA8ZGl2IGNsYXNzPSJ0aWxlLXJvdyI+CiAgICAgICAgPGRlZXMtdGlsZS12aWRlbwogICAgICAgICAgc2l6ZT0ic21hbGwiCiAgICAgICAgICBzcmM9Imh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vaHRtbC9tb3ZfYmJiLm1wNCIKICAgICAgICAgIGxhYmVsPSJzbWFsbC5tcDQiCiAgICAgICAgPjwvZGVlcy10aWxlLXZpZGVvPgoKICAgICAgICA8ZGVlcy10aWxlLXZpZGVvCiAgICAgICAgICBzcmM9Imh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vaHRtbC9tb3ZfYmJiLm1wNCIKICAgICAgICAgIGxhYmVsPSJkZWZhdWx0Lm1wNCIKICAgICAgICA+PC9kZWVzLXRpbGUtdmlkZW8+CgogICAgICAgIDxkZWVzLXRpbGUtdmlkZW8KICAgICAgICAgIHNpemU9ImxhcmdlIgogICAgICAgICAgc3JjPSJodHRwczovL3d3dy53M3NjaG9vbHMuY29tL2h0bWwvbW92X2JiYi5tcDQiCiAgICAgICAgICBsYWJlbD0ibGFyZ2UubXA0IgogICAgICAgID48L2RlZXMtdGlsZS12aWRlbz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICA8aDM+V2l0aCBQb3N0ZXIgSW1hZ2U8L2gzPgogICAgICA8ZGVlcy10aWxlLXZpZGVvCiAgICAgICAgc3JjPSJodHRwczovL3d3dy53M3NjaG9vbHMuY29tL2h0bWwvbW92aWUubXA0IgogICAgICAgIHBvc3Rlcj0iaHR0cHM6Ly9waWNzdW0ucGhvdG9zLzYwMC80MDAiCiAgICAgICAgbGFiZWw9InBvc3Rlci12aWRlby5tcDQiCiAgICAgID48L2RlZXMtdGlsZS12aWRlbz4KICAgIDwvZGl2PgogIDwvZGl2PgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW1lZGlhL2RlZXMtdGlsZS12aWRlby9jb21wb25lbnQuanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIF9fZXNEZWNvcmF0ZTgxID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM4MiA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1RpbGVWaWRlbyA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtdGlsZS12aWRlbyIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzVGlsZUJhc2U7CiAgbGV0IF9zcmNfZGVjb3JhdG9yczsKICBsZXQgX3NyY19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NyY19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcG9zdGVyX2RlY29yYXRvcnM7CiAgbGV0IF9wb3N0ZXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wb3N0ZXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2R1cmF0aW9uX2RlY29yYXRvcnM7CiAgbGV0IF9kdXJhdGlvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2R1cmF0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90aHVtYm5haWxDYXB0dXJlZF9kZWNvcmF0b3JzOwogIGxldCBfdGh1bWJuYWlsQ2FwdHVyZWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90aHVtYm5haWxDYXB0dXJlZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNIb3ZlcmluZ19kZWNvcmF0b3JzOwogIGxldCBfaXNIb3ZlcmluZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzSG92ZXJpbmdfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1RpbGVWaWRlbzIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9zcmNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9wb3N0ZXJfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9kdXJhdGlvbl9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfdGh1bWJuYWlsQ2FwdHVyZWRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2lzSG92ZXJpbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlODEodGhpcywgbnVsbCwgX3NyY19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzcmMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNyYyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zcmMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNyYyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zcmNfaW5pdGlhbGl6ZXJzLCBfc3JjX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODEodGhpcywgbnVsbCwgX3Bvc3Rlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwb3N0ZXIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInBvc3RlciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5wb3N0ZXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnBvc3RlciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wb3N0ZXJfaW5pdGlhbGl6ZXJzLCBfcG9zdGVyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODEodGhpcywgbnVsbCwgX2R1cmF0aW9uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImR1cmF0aW9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkdXJhdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5kdXJhdGlvbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZHVyYXRpb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZHVyYXRpb25faW5pdGlhbGl6ZXJzLCBfZHVyYXRpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4MSh0aGlzLCBudWxsLCBfdGh1bWJuYWlsQ2FwdHVyZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGh1bWJuYWlsQ2FwdHVyZWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRodW1ibmFpbENhcHR1cmVkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRodW1ibmFpbENhcHR1cmVkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50aHVtYm5haWxDYXB0dXJlZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90aHVtYm5haWxDYXB0dXJlZF9pbml0aWFsaXplcnMsIF90aHVtYm5haWxDYXB0dXJlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTgxKHRoaXMsIG51bGwsIF9pc0hvdmVyaW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzSG92ZXJpbmciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImlzSG92ZXJpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNIb3ZlcmluZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNIb3ZlcmluZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pc0hvdmVyaW5nX2luaXRpYWxpemVycywgX2lzSG92ZXJpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4MShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNUaWxlVmlkZW8yID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtbzg7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiTWVkaWEiXTsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIC4uLnRpbGVCYXNlU3R5bGVzLAogICAgICBpYAogICAgICAudmlkZW8td3JhcHBlciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgIH0KCiAgICAgIC52aWRlby13cmFwcGVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb2JqZWN0LWZpdDogY292ZXI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC52aWRlby13cmFwcGVyIGNhbnZhcyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG9iamVjdC1maXQ6IGNvdmVyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAucG9zdGVyLWltYWdlIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb2JqZWN0LWZpdDogY292ZXI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCgogICAgICAucGxheS1vdmVybGF5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB6LWluZGV4OiAxNTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZTsKICAgICAgfQoKICAgICAgLnBsYXktb3ZlcmxheSBkZWVzLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KCiAgICAgIC50aWxlLWNvbnRhaW5lci5jbGlja2FibGU6aG92ZXIgLnBsYXktb3ZlcmxheSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLnZpZGVvLWhvdmVyLXByZXZpZXcgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb2JqZWN0LWZpdDogY292ZXI7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcyBlYXNlOwogICAgICB9CgogICAgICAudmlkZW8taG92ZXItcHJldmlldy5hY3RpdmUgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICAjc3JjX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczgyKHRoaXMsIF9zcmNfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICBnZXQgc3JjKCkgewogICAgICByZXR1cm4gdGhpcy4jc3JjX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc3JjKHZhbHVlMikgewogICAgICB0aGlzLiNzcmNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNwb3N0ZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgyKHRoaXMsIF9zcmNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczgyKHRoaXMsIF9wb3N0ZXJfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IHBvc3RlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Bvc3Rlcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHBvc3Rlcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jcG9zdGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZHVyYXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgyKHRoaXMsIF9wb3N0ZXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczgyKHRoaXMsIF9kdXJhdGlvbl9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBkdXJhdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2R1cmF0aW9uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZHVyYXRpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI2R1cmF0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdGh1bWJuYWlsQ2FwdHVyZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgyKHRoaXMsIF9kdXJhdGlvbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODIodGhpcywgX3RodW1ibmFpbENhcHR1cmVkX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCB0aHVtYm5haWxDYXB0dXJlZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RodW1ibmFpbENhcHR1cmVkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdGh1bWJuYWlsQ2FwdHVyZWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3RodW1ibmFpbENhcHR1cmVkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNIb3ZlcmluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODIodGhpcywgX3RodW1ibmFpbENhcHR1cmVkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4Mih0aGlzLCBfaXNIb3ZlcmluZ19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaXNIb3ZlcmluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzSG92ZXJpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc0hvdmVyaW5nKHZhbHVlMikgewogICAgICB0aGlzLiNpc0hvdmVyaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICB0aHVtYm5haWxDYW52YXMgPSAoX19ydW5Jbml0aWFsaXplcnM4Mih0aGlzLCBfaXNIb3ZlcmluZ19leHRyYUluaXRpYWxpemVycyksIG51bGwpOwogICAgaG92ZXJWaWRlbyA9IG51bGw7CiAgICBoYXNTdGFydGVkTG9hZGluZyA9IGZhbHNlOwogICAgcmVuZGVyVGlsZUNvbnRlbnQoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0idmlkZW8td3JhcHBlciI+CiAgICAgICAgJHt0aGlzLnBvc3RlciA/IGIyYAogICAgICAgICAgPGltZyBjbGFzcz0icG9zdGVyLWltYWdlIiBzcmM9IiR7dGhpcy5wb3N0ZXJ9IiBhbHQ9IiIgLz4KICAgICAgICBgIDogdGhpcy50aHVtYm5haWxDYXB0dXJlZCA/IGIyYAogICAgICAgICAgPGNhbnZhcz48L2NhbnZhcz4KICAgICAgICBgIDogYjJgCiAgICAgICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyBiYWNrZ3JvdW5kOiAjMDAwOyI+PC9kaXY+CiAgICAgICAgYH0KCiAgICAgICAgJHt0aGlzLmlzSG92ZXJpbmcgJiYgdGhpcy5zcmMgPyBiMmAKICAgICAgICAgIDx2aWRlbwogICAgICAgICAgICBjbGFzcz0idmlkZW8taG92ZXItcHJldmlldyAke3RoaXMuaXNIb3ZlcmluZyA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICAuc3JjPSR7dGhpcy5zcmN9CiAgICAgICAgICAgIG11dGVkCiAgICAgICAgICAgIHBsYXlzaW5saW5lCiAgICAgICAgICAgIEBsb2FkZWRkYXRhPSR7dGhpcy5oYW5kbGVIb3ZlclZpZGVvTG9hZGVkfQogICAgICAgICAgPjwvdmlkZW8+CiAgICAgICAgYCA6ICIifQogICAgICA8L2Rpdj4KCiAgICAgICR7dGhpcy5kdXJhdGlvbiA+IDAgPyBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJ0aWxlLWJhZGdlLWNvcm5lciI+JHt0aGlzLmZvcm1hdFRpbWUodGhpcy5kdXJhdGlvbil9PC9kaXY+CiAgICAgIGAgOiAiIn0KCiAgICAgICR7IXRoaXMuaXNIb3ZlcmluZyA/IGIyYAogICAgICAgIDxkaXYgY2xhc3M9InBsYXktb3ZlcmxheSI+CiAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpQbGF5Ij48L2RlZXMtaWNvbj4KICAgICAgICA8L2Rpdj4KICAgICAgYCA6ICIifQoKICAgICAgJHt0aGlzLmNsaWNrYWJsZSA/IGIyYAogICAgICAgIDxkaXYgY2xhc3M9InRpbGUtb3ZlcmxheSI+CiAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpQbGF5Ij48L2RlZXMtaWNvbj4KICAgICAgICAgIDxzcGFuPlBsYXkgVmlkZW88L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgIGAgOiAiIn0KICAgIGA7CiAgICB9CiAgICBnZXRUaWxlQ2xpY2tEZXRhaWwoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgc3JjOiB0aGlzLnNyYywKICAgICAgICBwb3N0ZXI6IHRoaXMucG9zdGVyLAogICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uCiAgICAgIH07CiAgICB9CiAgICBvbkJlY2FtZVZpc2libGUoKSB7CiAgICAgIGlmICghdGhpcy5oYXNTdGFydGVkTG9hZGluZyAmJiB0aGlzLnNyYykgewogICAgICAgIHRoaXMuaGFzU3RhcnRlZExvYWRpbmcgPSB0cnVlOwogICAgICAgIHRoaXMuY2FwdHVyZUZpcnN0RnJhbWUoKTsKICAgICAgfQogICAgfQogICAgYXN5bmMgY2FwdHVyZUZpcnN0RnJhbWUoKSB7CiAgICAgIGlmICh0aGlzLnBvc3RlcikgewogICAgICAgIHRoaXMubG9hZER1cmF0aW9uKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpOwogICAgICAgIHZpZGVvLmNyb3NzT3JpZ2luID0gImFub255bW91cyI7CiAgICAgICAgdmlkZW8ubXV0ZWQgPSB0cnVlOwogICAgICAgIHZpZGVvLnByZWxvYWQgPSAibWV0YWRhdGEiOwogICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0KSA9PiB7CiAgICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIiwgKCkgPT4gewogICAgICAgICAgICB0aGlzLmR1cmF0aW9uID0gdmlkZW8uZHVyYXRpb247CiAgICAgICAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gMC4xOwogICAgICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCJzZWVrZWQiLCAoKSA9PiB7CiAgICAgICAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CiAgICAgICAgICAgICAgY2FudmFzLndpZHRoID0gdmlkZW8udmlkZW9XaWR0aDsKICAgICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gdmlkZW8udmlkZW9IZWlnaHQ7CiAgICAgICAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgICAgICAgaWYgKGN0eCkgewogICAgICAgICAgICAgICAgY3R4LmRyYXdJbWFnZSh2aWRlbywgMCwgMCk7CiAgICAgICAgICAgICAgICB0aGlzLnRodW1ibmFpbENhbnZhcyA9IGNhbnZhczsKICAgICAgICAgICAgICAgIHRoaXMudGh1bWJuYWlsQ2FwdHVyZWQgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB2aWRlby5zcmMgPSAiIjsKICAgICAgICAgICAgICB2aWRlby5sb2FkKCk7CiAgICAgICAgICAgICAgcmVzb2x2ZTIoKTsKICAgICAgICAgICAgfSwgeyBvbmNlOiB0cnVlIH0pOwogICAgICAgICAgfSwgeyBvbmNlOiB0cnVlIH0pOwogICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCAoKSA9PiByZWplY3QobmV3IEVycm9yKCJGYWlsZWQgdG8gbG9hZCB2aWRlbyIpKSwgeyBvbmNlOiB0cnVlIH0pOwogICAgICAgICAgdmlkZW8uc3JjID0gdGhpcy5zcmM7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgICB0aGlzLmNvcHlUaHVtYm5haWxUb0NhbnZhcygpOwogICAgICB9IGNhdGNoIHsKICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgICB0aGlzLmxvYWREdXJhdGlvbigpOwogICAgICB9CiAgICB9CiAgICBsb2FkRHVyYXRpb24oKSB7CiAgICAgIGNvbnN0IHZpZGVvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTsKICAgICAgdmlkZW8ucHJlbG9hZCA9ICJtZXRhZGF0YSI7CiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwgKCkgPT4gewogICAgICAgIHRoaXMuZHVyYXRpb24gPSB2aWRlby5kdXJhdGlvbjsKICAgICAgICB2aWRlby5zcmMgPSAiIjsKICAgICAgICB2aWRlby5sb2FkKCk7CiAgICAgIH0pOwogICAgICB2aWRlby5zcmMgPSB0aGlzLnNyYzsKICAgIH0KICAgIGNvcHlUaHVtYm5haWxUb0NhbnZhcygpIHsKICAgICAgaWYgKCF0aGlzLnRodW1ibmFpbENhbnZhcykKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnZpZGVvLXdyYXBwZXIgY2FudmFzIik7CiAgICAgIGlmICghY2FudmFzKQogICAgICAgIHJldHVybjsKICAgICAgY2FudmFzLndpZHRoID0gdGhpcy50aHVtYm5haWxDYW52YXMud2lkdGg7CiAgICAgIGNhbnZhcy5oZWlnaHQgPSB0aGlzLnRodW1ibmFpbENhbnZhcy5oZWlnaHQ7CiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICBpZiAoY3R4KSB7CiAgICAgICAgY3R4LmRyYXdJbWFnZSh0aGlzLnRodW1ibmFpbENhbnZhcywgMCwgMCk7CiAgICAgIH0KICAgIH0KICAgIG9uVGlsZU1vdXNlRW50ZXIoKSB7CiAgICAgIHRoaXMuaXNIb3ZlcmluZyA9IHRydWU7CiAgICB9CiAgICBvblRpbGVNb3VzZUxlYXZlKCkgewogICAgICB0aGlzLmlzSG92ZXJpbmcgPSBmYWxzZTsKICAgICAgdGhpcy5ob3ZlclZpZGVvID0gbnVsbDsKICAgIH0KICAgIGhhbmRsZUhvdmVyVmlkZW9Mb2FkZWQoZTExKSB7CiAgICAgIHRoaXMuaG92ZXJWaWRlbyA9IGUxMS50YXJnZXQ7CiAgICAgIHRoaXMuaG92ZXJWaWRlby5wbGF5KCkuY2F0Y2goKCkgPT4gewogICAgICB9KTsKICAgIH0KICAgIGFzeW5jIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoInNyYyIpICYmIHRoaXMuc3JjICYmIHRoaXMuaXNWaXNpYmxlKSB7CiAgICAgICAgdGhpcy5oYXNTdGFydGVkTG9hZGluZyA9IHRydWU7CiAgICAgICAgdGhpcy50aHVtYm5haWxDYXB0dXJlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuZHVyYXRpb24gPSAwOwogICAgICAgIHRoaXMuY2FwdHVyZUZpcnN0RnJhbWUoKTsKICAgICAgfQogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJ0aHVtYm5haWxDYXB0dXJlZCIpICYmIHRoaXMudGh1bWJuYWlsQ2FwdHVyZWQpIHsKICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlOwogICAgICAgIHRoaXMuY29weVRodW1ibmFpbFRvQ2FudmFzKCk7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBpZiAodGhpcy5ob3ZlclZpZGVvKSB7CiAgICAgICAgdGhpcy5ob3ZlclZpZGVvLnBhdXNlKCk7CiAgICAgICAgdGhpcy5ob3ZlclZpZGVvLnNyYyA9ICIiOwogICAgICAgIHRoaXMuaG92ZXJWaWRlbyA9IG51bGw7CiAgICAgIH0KICAgICAgdGhpcy50aHVtYm5haWxDYW52YXMgPSBudWxsOwogICAgfQogICAgZm9ybWF0VGltZShzZWNvbmRzKSB7CiAgICAgIGlmICghaXNGaW5pdGUoc2Vjb25kcykgfHwgc2Vjb25kcyA8IDApCiAgICAgICAgcmV0dXJuICIwOjAwIjsKICAgICAgY29uc3QgbWlucyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTsKICAgICAgY29uc3Qgc2VjcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAlIDYwKTsKICAgICAgcmV0dXJuIGAke21pbnN9OiR7c2Vjcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9YDsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzODIoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNUaWxlVmlkZW8yID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXRpbGUtbm90ZS9kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vOSA9ICgpID0+IHsKICBjb25zdCBzYW1wbGVDb2RlID0gYGltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnOwoKZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IHsKICBwcml2YXRlIGl0ZW1zOiBzdHJpbmdbXSA9IFtdOwoKICByZW5kZXIoKSB7CiAgICByZXR1cm4gaHRtbFxgCiAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgXCR7dGhpcy5pdGVtcy5tYXAoaXRlbSA9PiBodG1sXGAKICAgICAgICAgIDxzcGFuPlwke2l0ZW19PC9zcGFuPgogICAgICAgIFxgKX0KICAgICAgPC9kaXY+CiAgICBcYDsKICB9Cn1gOwogIGNvbnN0IHNhbXBsZVRleHQgPSBgTWVldGluZyBOb3RlcyAtIFE0IFBsYW5uaW5nCkRhdGU6IEphbnVhcnkgMTUsIDIwMjYKQXR0ZW5kZWVzOiBBbGljZSwgQm9iLCBDaGFybGllCgpLZXkgRGVjaXNpb25zOgoxLiBMYXVuY2ggbmV3IGZlYXR1cmUgYnkgTWFyY2gKMi4gSGlyZSAyIG1vcmUgZW5naW5lZXJzCjMuIE1pZ3JhdGUgdG8gbmV3IENJL0NEIHBpcGVsaW5lCjQuIFVwZGF0ZSBkZXNpZ24gc3lzdGVtIHRvIHYzCgpBY3Rpb24gSXRlbXM6Ci0gQWxpY2U6IERyYWZ0IFBSRCBieSBuZXh0IHdlZWsKLSBCb2I6IFNldCB1cCBpbnRlcnZpZXcgcGlwZWxpbmUKLSBDaGFybGllOiBFdmFsdWF0ZSBKZW5raW5zIHZzIEdpdEh1YiBBY3Rpb25zYDsKICBjb25zdCBzYW1wbGVKc29uID0gYHsKICAibmFtZSI6ICJAZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2ciLAogICJ2ZXJzaW9uIjogIjMuMzguMCIsCiAgImRlc2NyaXB0aW9uIjogIkRlc2lnbiBjb21wb25lbnQgY2F0YWxvZyIsCiAgImRlcGVuZGVuY2llcyI6IHsKICAgICJAZGVzaWduLmVzdGF0ZS9kZWVzLWVsZW1lbnQiOiAiXjIuMC4wIiwKICAgICJsaXQiOiAiXjMuMS4wIgogIH0sCiAgInNjcmlwdHMiOiB7CiAgICAiYnVpbGQiOiAidHNidWlsZCIsCiAgICAidGVzdCI6ICJ0c3Rlc3QiCiAgfQp9YDsKICByZXR1cm4gYjJgCiAgICA8c3R5bGU+CiAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZzogNDBweDsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1OwogICAgICB9CiAgICAgIC5kZW1vLXNlY3Rpb24gewogICAgICAgIG1hcmdpbi1ib3R0b206IDYwcHg7CiAgICAgIH0KICAgICAgaDMgewogICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIH0KICAgICAgLnRpbGUtcm93IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogMjRweDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMz5Ob3RlIFRpbGVzPC9oMz4KICAgICAgICA8ZGl2IGNsYXNzPSJ0aWxlLXJvdyI+CiAgICAgICAgICA8ZGVlcy10aWxlLW5vdGUKICAgICAgICAgICAgdGl0bGU9ImNvbXBvbmVudC50cyIKICAgICAgICAgICAgLmNvbnRlbnQ9JHtzYW1wbGVDb2RlfQogICAgICAgICAgICBsYW5ndWFnZT0idHlwZXNjcmlwdCIKICAgICAgICAgICAgbGFiZWw9ImNvbXBvbmVudC50cyIKICAgICAgICAgICAgQHRpbGUtY2xpY2s9JHsoZTExKSA9PiBjb25zb2xlLmxvZygiTm90ZSBjbGlja2VkOiIsIGUxMS5kZXRhaWwpfQogICAgICAgICAgPjwvZGVlcy10aWxlLW5vdGU+CgogICAgICAgICAgPGRlZXMtdGlsZS1ub3RlCiAgICAgICAgICAgIHRpdGxlPSJNZWV0aW5nIE5vdGVzIgogICAgICAgICAgICAuY29udGVudD0ke3NhbXBsZVRleHR9CiAgICAgICAgICAgIGxhYmVsPSJtZWV0aW5nLW5vdGVzLnR4dCIKICAgICAgICAgID48L2RlZXMtdGlsZS1ub3RlPgoKICAgICAgICAgIDxkZWVzLXRpbGUtbm90ZQogICAgICAgICAgICB0aXRsZT0icGFja2FnZS5qc29uIgogICAgICAgICAgICAuY29udGVudD0ke3NhbXBsZUpzb259CiAgICAgICAgICAgIGxhbmd1YWdlPSJqc29uIgogICAgICAgICAgICBsYWJlbD0icGFja2FnZS5qc29uIgogICAgICAgICAgPjwvZGVlcy10aWxlLW5vdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDM+U2l6ZSBWYXJpYW50czwvaDM+CiAgICAgICAgPGRpdiBjbGFzcz0idGlsZS1yb3ciPgogICAgICAgICAgPGRlZXMtdGlsZS1ub3RlCiAgICAgICAgICAgIHNpemU9InNtYWxsIgogICAgICAgICAgICB0aXRsZT0ic21hbGwudHMiCiAgICAgICAgICAgIC5jb250ZW50PSR7c2FtcGxlQ29kZX0KICAgICAgICAgICAgbGFuZ3VhZ2U9InRzIgogICAgICAgICAgICBsYWJlbD0ic21hbGwudHMiCiAgICAgICAgICA+PC9kZWVzLXRpbGUtbm90ZT4KCiAgICAgICAgICA8ZGVlcy10aWxlLW5vdGUKICAgICAgICAgICAgdGl0bGU9ImRlZmF1bHQudHMiCiAgICAgICAgICAgIC5jb250ZW50PSR7c2FtcGxlQ29kZX0KICAgICAgICAgICAgbGFuZ3VhZ2U9InRzIgogICAgICAgICAgICBsYWJlbD0iZGVmYXVsdC50cyIKICAgICAgICAgID48L2RlZXMtdGlsZS1ub3RlPgoKICAgICAgICAgIDxkZWVzLXRpbGUtbm90ZQogICAgICAgICAgICBzaXplPSJsYXJnZSIKICAgICAgICAgICAgdGl0bGU9ImxhcmdlLnRzIgogICAgICAgICAgICAuY29udGVudD0ke3NhbXBsZUNvZGV9CiAgICAgICAgICAgIGxhbmd1YWdlPSJ0cyIKICAgICAgICAgICAgbGFiZWw9ImxhcmdlLnRzIgogICAgICAgICAgPjwvZGVlcy10aWxlLW5vdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDM+V2l0aG91dCBUaXRsZTwvaDM+CiAgICAgICAgPGRlZXMtdGlsZS1ub3RlCiAgICAgICAgICAuY29udGVudD0ke3NhbXBsZVRleHR9CiAgICAgICAgICBsYWJlbD0idW50aXRsZWQudHh0IgogICAgICAgID48L2RlZXMtdGlsZS1ub3RlPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIGA7Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy10aWxlLW5vdGUvY29tcG9uZW50LmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBfX2VzRGVjb3JhdGU4MiA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzODMgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNUaWxlTm90ZSA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtdGlsZS1ub3RlIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNUaWxlQmFzZTsKICBsZXQgX3RpdGxlX2RlY29yYXRvcnM7CiAgbGV0IF90aXRsZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RpdGxlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZW50X2RlY29yYXRvcnM7CiAgbGV0IF9jb250ZW50X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29udGVudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGFuZ3VhZ2VfZGVjb3JhdG9yczsKICBsZXQgX2xhbmd1YWdlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGFuZ3VhZ2VfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzSG92ZXJpbmdfZGVjb3JhdG9yczsKICBsZXQgX2lzSG92ZXJpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0hvdmVyaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNUaWxlTm90ZTIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF90aXRsZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2NvbnRlbnRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9sYW5ndWFnZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2lzSG92ZXJpbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlODIodGhpcywgbnVsbCwgX3RpdGxlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRpdGxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0aXRsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50aXRsZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGl0bGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGl0bGVfaW5pdGlhbGl6ZXJzLCBfdGl0bGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4Mih0aGlzLCBudWxsLCBfY29udGVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb250ZW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb250ZW50IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNvbnRlbnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvbnRlbnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29udGVudF9pbml0aWFsaXplcnMsIF9jb250ZW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODIodGhpcywgbnVsbCwgX2xhbmd1YWdlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxhbmd1YWdlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsYW5ndWFnZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sYW5ndWFnZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubGFuZ3VhZ2UgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbGFuZ3VhZ2VfaW5pdGlhbGl6ZXJzLCBfbGFuZ3VhZ2VfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4Mih0aGlzLCBudWxsLCBfaXNIb3ZlcmluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc0hvdmVyaW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc0hvdmVyaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzSG92ZXJpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzSG92ZXJpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNIb3ZlcmluZ19pbml0aWFsaXplcnMsIF9pc0hvdmVyaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODIobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzVGlsZU5vdGUyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtbzk7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiTWVkaWEiXTsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIC4uLnRpbGVCYXNlU3R5bGVzLAogICAgICBpYAogICAgICAubm90ZS1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICJoc2woNjAgNSUgOTYlKSIpfTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAubm90ZS1oZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDEycHggMTRweCA4cHg7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5ub3RlLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMjAlIDIwJSkiLCAiaHNsKDIxNSAyMCUgMjAlKSIpfTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMzsKICAgICAgfQoKICAgICAgLm5vdGUtYm9keSB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBwYWRkaW5nOiAwIDE0cHggMTRweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLm5vdGUtdGV4dCB7CiAgICAgICAgZm9udC1mYW1pbHk6IHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDEwJSA0MCUpIiwgImhzbCgyMTUgMTAlIDM1JSkiKX07CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgLm5vdGUtZmFkZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGhlaWdodDogNjBweDsKICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgICB0cmFuc3BhcmVudCwKICAgICAgICAgICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgImhzbCg2MCA1JSA5NiUpIil9CiAgICAgICAgKTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLnRpbGUtYmFkZ2UtdG9wcmlnaHQubm90ZS1sYW5ndWFnZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMjAlIDkyJSkiLCAiaHNsKDIxNSAyMCUgODglKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDUwJSkiLCAiaHNsKDIxNSAxNiUgNDAlKSIpfTsKICAgICAgICBmb250LXNpemU6IDlweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIHotaW5kZXg6IDU7CiAgICAgIH0KCiAgICAgIC5ub3RlLWxpbmVzIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHdpZHRoOiAzNHB4OwogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA3MCUgODUlKSIsICJoc2woMCA1MCUgODAlKSIpfTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgcGFkZGluZy10b3A6IDEycHg7CiAgICAgIH0KCiAgICAgIC5saW5lLW51bWJlciB7CiAgICAgICAgZm9udC1mYW1pbHk6IHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiA5cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE1cHg7IC8qIG1hdGNoZXMgMTBweCAqIDEuNSBsaW5lLWhlaWdodCAqLwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAxMCUgNzUlKSIsICJoc2woMjE1IDEwJSA3MCUpIil9OwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDZweDsKICAgICAgfQoKICAgIGAKICAgIF07CiAgICAjdGl0bGVfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzODModGhpcywgX3RpdGxlX2luaXRpYWxpemVycywgIiIpOwogICAgZ2V0IHRpdGxlKCkgewogICAgICByZXR1cm4gdGhpcy4jdGl0bGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0aXRsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdGl0bGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjb250ZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4Myh0aGlzLCBfdGl0bGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczgzKHRoaXMsIF9jb250ZW50X2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBjb250ZW50KCkgewogICAgICByZXR1cm4gdGhpcy4jY29udGVudF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNvbnRlbnQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2NvbnRlbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsYW5ndWFnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODModGhpcywgX2NvbnRlbnRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczgzKHRoaXMsIF9sYW5ndWFnZV9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgbGFuZ3VhZ2UoKSB7CiAgICAgIHJldHVybiB0aGlzLiNsYW5ndWFnZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxhbmd1YWdlKHZhbHVlMikgewogICAgICB0aGlzLiNsYW5ndWFnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzSG92ZXJpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgzKHRoaXMsIF9sYW5ndWFnZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODModGhpcywgX2lzSG92ZXJpbmdfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGlzSG92ZXJpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc0hvdmVyaW5nX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaXNIb3ZlcmluZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXNIb3ZlcmluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgbm90ZUJvZHlFbGVtZW50ID0gKF9fcnVuSW5pdGlhbGl6ZXJzODModGhpcywgX2lzSG92ZXJpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgIHJlbmRlclRpbGVDb250ZW50KCkgewogICAgICBjb25zdCBsaW5lcyA9IHRoaXMuY29udGVudC5zcGxpdCgiXG4iKTsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJub3RlLWNvbnRlbnQiPgogICAgICAgICR7dGhpcy5sYW5ndWFnZSA/IGIyYAogICAgICAgICAgPGRpdiBjbGFzcz0idGlsZS1iYWRnZS10b3ByaWdodCBub3RlLWxhbmd1YWdlIj4ke3RoaXMubGFuZ3VhZ2V9PC9kaXY+CiAgICAgICAgYCA6ICIifQoKICAgICAgICAke3RoaXMudGl0bGUgPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9Im5vdGUtaGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibm90ZS10aXRsZSI+JHt0aGlzLnRpdGxlfTwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgYCA6ICIifQoKICAgICAgICA8ZGl2IGNsYXNzPSJub3RlLWJvZHkiPgogICAgICAgICAgPHByZSBjbGFzcz0ibm90ZS10ZXh0Ij4ke2xpbmVzLmpvaW4oIlxuIil9PC9wcmU+CiAgICAgICAgICAkeyF0aGlzLmlzSG92ZXJpbmcgPyBiMmA8ZGl2IGNsYXNzPSJub3RlLWZhZGUiPjwvZGl2PmAgOiAiIn0KICAgICAgICA8L2Rpdj4KCiAgICAgICAgJHt0aGlzLmlzSG92ZXJpbmcgJiYgbGluZXMubGVuZ3RoID4gMTIgPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9InRpbGUtYmFkZ2UtY29ybmVyIj4KICAgICAgICAgICAgTGluZSAke3RoaXMuZ2V0VmlzaWJsZUxpbmVSYW5nZShsaW5lcy5sZW5ndGgpfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgYCA6ICIifQogICAgICA8L2Rpdj4KCiAgICAgICR7dGhpcy5jbGlja2FibGUgPyBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJ0aWxlLW92ZXJsYXkiPgogICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6RmlsZVRleHQiPjwvZGVlcy1pY29uPgogICAgICAgICAgPHNwYW4+T3BlbiBOb3RlPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICBgIDogIiJ9CiAgICBgOwogICAgfQogICAgZ2V0VGlsZUNsaWNrRGV0YWlsKCkgewogICAgICByZXR1cm4gewogICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLAogICAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudCwKICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZQogICAgICB9OwogICAgfQogICAgb25UaWxlTW91c2VFbnRlcigpIHsKICAgICAgdGhpcy5pc0hvdmVyaW5nID0gdHJ1ZTsKICAgICAgaWYgKCF0aGlzLm5vdGVCb2R5RWxlbWVudCkgewogICAgICAgIHRoaXMubm90ZUJvZHlFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIubm90ZS1ib2R5Iik7CiAgICAgIH0KICAgIH0KICAgIG9uVGlsZU1vdXNlTGVhdmUoKSB7CiAgICAgIHRoaXMuaXNIb3ZlcmluZyA9IGZhbHNlOwogICAgICBpZiAodGhpcy5ub3RlQm9keUVsZW1lbnQpIHsKICAgICAgICB0aGlzLm5vdGVCb2R5RWxlbWVudC5zY3JvbGxUb3AgPSAwOwogICAgICB9CiAgICB9CiAgICBvblRpbGVNb3VzZU1vdmUoZTExKSB7CiAgICAgIGlmICghdGhpcy5pc0hvdmVyaW5nIHx8ICF0aGlzLm5vdGVCb2R5RWxlbWVudCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHRvdGFsTGluZXMgPSB0aGlzLmNvbnRlbnQuc3BsaXQoIlxuIikubGVuZ3RoOwogICAgICBpZiAodG90YWxMaW5lcyA8PSAxMikKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBjb25zdCB4MyA9IGUxMS5jbGllbnRYIC0gcmVjdC5sZWZ0OwogICAgICBjb25zdCBwZXJjZW50YWdlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgeDMgLyByZWN0LndpZHRoKSk7CiAgICAgIGNvbnN0IG1heFNjcm9sbCA9IHRoaXMubm90ZUJvZHlFbGVtZW50LnNjcm9sbEhlaWdodCAtIHRoaXMubm90ZUJvZHlFbGVtZW50LmNsaWVudEhlaWdodDsKICAgICAgdGhpcy5ub3RlQm9keUVsZW1lbnQuc2Nyb2xsVG9wID0gcGVyY2VudGFnZSAqIG1heFNjcm9sbDsKICAgIH0KICAgIGdldFZpc2libGVMaW5lUmFuZ2UodG90YWxMaW5lcykgewogICAgICBpZiAoIXRoaXMubm90ZUJvZHlFbGVtZW50KQogICAgICAgIHJldHVybiBgMVx1MjAxMzEyIG9mICR7dG90YWxMaW5lc31gOwogICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gMTU7CiAgICAgIGNvbnN0IGZpcnN0TGluZSA9IE1hdGguZmxvb3IodGhpcy5ub3RlQm9keUVsZW1lbnQuc2Nyb2xsVG9wIC8gbGluZUhlaWdodCkgKyAxOwogICAgICBjb25zdCB2aXNpYmxlQ291bnQgPSBNYXRoLmZsb29yKHRoaXMubm90ZUJvZHlFbGVtZW50LmNsaWVudEhlaWdodCAvIGxpbmVIZWlnaHQpOwogICAgICBjb25zdCBsYXN0TGluZSA9IE1hdGgubWluKGZpcnN0TGluZSArIHZpc2libGVDb3VudCAtIDEsIHRvdGFsTGluZXMpOwogICAgICByZXR1cm4gYCR7Zmlyc3RMaW5lfVx1MjAxMyR7bGFzdExpbmV9IG9mICR7dG90YWxMaW5lc31gOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM4MyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1RpbGVOb3RlMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy10aWxlLWZvbGRlci9kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vMTAgPSAoKSA9PiB7CiAgY29uc3QgcGhvdG9zRm9sZGVyID0gWwogICAgeyB0eXBlOiAiaW1hZ2UiLCBuYW1lOiAic3Vuc2V0LmpwZyIsIHRodW1ibmFpbFNyYzogImh0dHBzOi8vcGljc3VtLnBob3Rvcy8yMDAvMjAwP3JhbmRvbT0xIiB9LAogICAgeyB0eXBlOiAiaW1hZ2UiLCBuYW1lOiAibW91bnRhaW4uanBnIiwgdGh1bWJuYWlsU3JjOiAiaHR0cHM6Ly9waWNzdW0ucGhvdG9zLzIwMC8yMDA/cmFuZG9tPTIiIH0sCiAgICB7IHR5cGU6ICJpbWFnZSIsIG5hbWU6ICJvY2Vhbi5qcGciLCB0aHVtYm5haWxTcmM6ICJodHRwczovL3BpY3N1bS5waG90b3MvMjAwLzIwMD9yYW5kb209MyIgfSwKICAgIHsgdHlwZTogImltYWdlIiwgbmFtZTogImZvcmVzdC5qcGciLCB0aHVtYm5haWxTcmM6ICJodHRwczovL3BpY3N1bS5waG90b3MvMjAwLzIwMD9yYW5kb209NCIgfSwKICAgIHsgdHlwZTogImltYWdlIiwgbmFtZTogImNpdHkuanBnIiwgdGh1bWJuYWlsU3JjOiAiaHR0cHM6Ly9waWNzdW0ucGhvdG9zLzIwMC8yMDA/cmFuZG9tPTUiIH0sCiAgICB7IHR5cGU6ICJpbWFnZSIsIG5hbWU6ICJkZXNlcnQuanBnIiwgdGh1bWJuYWlsU3JjOiAiaHR0cHM6Ly9waWNzdW0ucGhvdG9zLzIwMC8yMDA/cmFuZG9tPTYiIH0KICBdOwogIGNvbnN0IHByb2plY3RGb2xkZXIgPSBbCiAgICB7IHR5cGU6ICJub3RlIiwgbmFtZTogIlJFQURNRS5tZCIgfSwKICAgIHsgdHlwZTogIm5vdGUiLCBuYW1lOiAicGFja2FnZS5qc29uIiB9LAogICAgeyB0eXBlOiAiZm9sZGVyIiwgbmFtZTogInNyYyIgfSwKICAgIHsgdHlwZTogImZvbGRlciIsIG5hbWU6ICJ0ZXN0IiB9LAogICAgeyB0eXBlOiAibm90ZSIsIG5hbWU6ICJ0c2NvbmZpZy5qc29uIiB9LAogICAgeyB0eXBlOiAicGRmIiwgbmFtZTogImRvY3MucGRmIiB9LAogICAgeyB0eXBlOiAiaW1hZ2UiLCBuYW1lOiAibG9nby5wbmciLCB0aHVtYm5haWxTcmM6ICJodHRwczovL3BpY3N1bS5waG90b3MvMTAwLzEwMD9yYW5kb209MTAiIH0KICBdOwogIGNvbnN0IG1lZGlhRm9sZGVyID0gWwogICAgeyB0eXBlOiAidmlkZW8iLCBuYW1lOiAiaW50cm8ubXA0IiB9LAogICAgeyB0eXBlOiAiYXVkaW8iLCBuYW1lOiAiYmFja2dyb3VuZC5tcDMiIH0sCiAgICB7IHR5cGU6ICJpbWFnZSIsIG5hbWU6ICJ0aHVtYm5haWwuanBnIiwgdGh1bWJuYWlsU3JjOiAiaHR0cHM6Ly9waWNzdW0ucGhvdG9zLzIwMC8yMDA/cmFuZG9tPTIwIiB9LAogICAgeyB0eXBlOiAicGRmIiwgbmFtZTogInN0b3J5Ym9hcmQucGRmIiB9CiAgXTsKICBjb25zdCBlbXB0eUZvbGRlciA9IFtdOwogIGNvbnN0IHNpbmdsZUl0ZW1Gb2xkZXIgPSBbCiAgICB7IHR5cGU6ICJwZGYiLCBuYW1lOiAicmVwb3J0LnBkZiIgfQogIF07CiAgcmV0dXJuIGIyYAogICAgPHN0eWxlPgogICAgICAuZGVtby1jb250YWluZXIgewogICAgICAgIHBhZGRpbmc6IDQwcHg7CiAgICAgICAgYmFja2dyb3VuZDogI2Y1ZjVmNTsKICAgICAgfQogICAgICAuZGVtby1zZWN0aW9uIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiA2MHB4OwogICAgICB9CiAgICAgIGgzIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICB9CiAgICAgIC50aWxlLXJvdyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDI0cHg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDM+Rm9sZGVyIFRpbGVzPC9oMz4KICAgICAgICA8ZGl2IGNsYXNzPSJ0aWxlLXJvdyI+CiAgICAgICAgICA8ZGVlcy10aWxlLWZvbGRlcgogICAgICAgICAgICBuYW1lPSJQaG90b3MiCiAgICAgICAgICAgIC5pdGVtcz0ke3Bob3Rvc0ZvbGRlcn0KICAgICAgICAgICAgbGFiZWw9IjYgcGhvdG9zIgogICAgICAgICAgICBAdGlsZS1jbGljaz0keyhlMTEpID0+IGNvbnNvbGUubG9nKCJGb2xkZXIgY2xpY2tlZDoiLCBlMTEuZGV0YWlsKX0KICAgICAgICAgID48L2RlZXMtdGlsZS1mb2xkZXI+CgogICAgICAgICAgPGRlZXMtdGlsZS1mb2xkZXIKICAgICAgICAgICAgbmFtZT0ibXktcHJvamVjdCIKICAgICAgICAgICAgLml0ZW1zPSR7cHJvamVjdEZvbGRlcn0KICAgICAgICAgICAgbGFiZWw9IlByb2plY3QgZmlsZXMiCiAgICAgICAgICA+PC9kZWVzLXRpbGUtZm9sZGVyPgoKICAgICAgICAgIDxkZWVzLXRpbGUtZm9sZGVyCiAgICAgICAgICAgIG5hbWU9Ik1lZGlhIEFzc2V0cyIKICAgICAgICAgICAgLml0ZW1zPSR7bWVkaWFGb2xkZXJ9CiAgICAgICAgICAgIGxhYmVsPSJNaXhlZCBtZWRpYSIKICAgICAgICAgID48L2RlZXMtdGlsZS1mb2xkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDM+RWRnZSBDYXNlczwvaDM+CiAgICAgICAgPGRpdiBjbGFzcz0idGlsZS1yb3ciPgogICAgICAgICAgPGRlZXMtdGlsZS1mb2xkZXIKICAgICAgICAgICAgbmFtZT0iRW1wdHkgRm9sZGVyIgogICAgICAgICAgICAuaXRlbXM9JHtlbXB0eUZvbGRlcn0KICAgICAgICAgID48L2RlZXMtdGlsZS1mb2xkZXI+CgogICAgICAgICAgPGRlZXMtdGlsZS1mb2xkZXIKICAgICAgICAgICAgbmFtZT0iU2luZ2xlIEl0ZW0iCiAgICAgICAgICAgIC5pdGVtcz0ke3NpbmdsZUl0ZW1Gb2xkZXJ9CiAgICAgICAgICA+PC9kZWVzLXRpbGUtZm9sZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgzPlNpemUgVmFyaWFudHM8L2gzPgogICAgICAgIDxkaXYgY2xhc3M9InRpbGUtcm93Ij4KICAgICAgICAgIDxkZWVzLXRpbGUtZm9sZGVyCiAgICAgICAgICAgIHNpemU9InNtYWxsIgogICAgICAgICAgICBuYW1lPSJTbWFsbCIKICAgICAgICAgICAgLml0ZW1zPSR7cGhvdG9zRm9sZGVyfQogICAgICAgICAgPjwvZGVlcy10aWxlLWZvbGRlcj4KCiAgICAgICAgICA8ZGVlcy10aWxlLWZvbGRlcgogICAgICAgICAgICBuYW1lPSJEZWZhdWx0IgogICAgICAgICAgICAuaXRlbXM9JHtwaG90b3NGb2xkZXJ9CiAgICAgICAgICA+PC9kZWVzLXRpbGUtZm9sZGVyPgoKICAgICAgICAgIDxkZWVzLXRpbGUtZm9sZGVyCiAgICAgICAgICAgIHNpemU9ImxhcmdlIgogICAgICAgICAgICBuYW1lPSJMYXJnZSIKICAgICAgICAgICAgLml0ZW1zPSR7cGhvdG9zRm9sZGVyfQogICAgICAgICAgPjwvZGVlcy10aWxlLWZvbGRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW1lZGlhL2RlZXMtdGlsZS1mb2xkZXIvY29tcG9uZW50LmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBfX2VzRGVjb3JhdGU4MyA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzODQgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIFRZUEVfSUNPTl9NQVAgPSB7CiAgcGRmOiAibHVjaWRlOkZpbGVUZXh0IiwKICBpbWFnZTogImx1Y2lkZTpJbWFnZSIsCiAgYXVkaW86ICJsdWNpZGU6TXVzaWMiLAogIHZpZGVvOiAibHVjaWRlOlZpZGVvIiwKICBub3RlOiAibHVjaWRlOkZpbGVDb2RlIiwKICBmb2xkZXI6ICJsdWNpZGU6Rm9sZGVyIiwKICB1bmtub3duOiAibHVjaWRlOkZpbGUiCn07CnZhciBEZWVzVGlsZUZvbGRlciA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtdGlsZS1mb2xkZXIiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc1RpbGVCYXNlOwogIGxldCBfbmFtZV9kZWNvcmF0b3JzOwogIGxldCBfbmFtZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX25hbWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2l0ZW1zX2RlY29yYXRvcnM7CiAgbGV0IF9pdGVtc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2l0ZW1zX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNUaWxlRm9sZGVyMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX25hbWVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9pdGVtc19kZWNvcmF0b3JzID0gW241KHsgYXR0cmlidXRlOiBmYWxzZSB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTgzKHRoaXMsIG51bGwsIF9uYW1lX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm5hbWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm5hbWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubmFtZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubmFtZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9uYW1lX2luaXRpYWxpemVycywgX25hbWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4Myh0aGlzLCBudWxsLCBfaXRlbXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXRlbXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIml0ZW1zIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLml0ZW1zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pdGVtcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pdGVtc19pbml0aWFsaXplcnMsIF9pdGVtc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTgzKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1RpbGVGb2xkZXIyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtbzEwOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIk1lZGlhIl07CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICAuLi50aWxlQmFzZVN0eWxlcywKICAgICAgaWAKICAgICAgLmZvbGRlci1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDQwIDMwJSA5NyUpIiwgImhzbCgyMTUgMjAlIDE0JSkiKX07CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmZvbGRlci1oZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBwYWRkaW5nOiAxMnB4IDE0cHggOHB4OwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAuZm9sZGVyLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCg0MCA4MCUgNTAlKSIsICJoc2woNDAgNzAlIDYwJSkiKX07CiAgICAgIH0KCiAgICAgIC5mb2xkZXItbmFtZSB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDIwJSAyMCUpIiwgImhzbCgyMTUgMTYlIDgwJSkiKX07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIGZsZXg6IDE7CiAgICAgIH0KCiAgICAgIC5wcmV2aWV3LWdyaWQgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiAxZnIgMWZyOwogICAgICAgIGdhcDogNHB4OwogICAgICAgIHBhZGRpbmc6IDAgMTRweCAxNHB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgIH0KCiAgICAgIC5ncmlkLWNlbGwgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAyMCUgOTQlKSIsICJoc2woMjE1IDIwJSAxOCUpIil9OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLmdyaWQtY2VsbCBpbWcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvYmplY3QtZml0OiBjb3ZlcjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgLmdyaWQtY2VsbCBkZWVzLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDYwJSkiLCAiaHNsKDIxNSAxNiUgNTUlKSIpfTsKICAgICAgfQoKICAgICAgLmdyaWQtY2VsbC1lbXB0eSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTUlIDk2JSkiLCAiaHNsKDIxNSAyMCUgMTYlKSIpfTsKICAgICAgfQoKICAgIGAKICAgIF07CiAgICAjbmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM4NCh0aGlzLCBfbmFtZV9pbml0aWFsaXplcnMsICIiKTsKICAgIGdldCBuYW1lKCkgewogICAgICByZXR1cm4gdGhpcy4jbmFtZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG5hbWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI25hbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpdGVtc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODQodGhpcywgX25hbWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczg0KHRoaXMsIF9pdGVtc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgaXRlbXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpdGVtc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGl0ZW1zKHZhbHVlMikgewogICAgICB0aGlzLiNpdGVtc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgcmVuZGVyVGlsZUNvbnRlbnQoKSB7CiAgICAgIGNvbnN0IHByZXZpZXdJdGVtcyA9IHRoaXMuaXRlbXMuc2xpY2UoMCwgNCk7CiAgICAgIGNvbnN0IGVtcHR5Q2VsbHMgPSA0IC0gcHJldmlld0l0ZW1zLmxlbmd0aDsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJmb2xkZXItY29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0iZm9sZGVyLWhlYWRlciI+CiAgICAgICAgICA8ZGVlcy1pY29uIGNsYXNzPSJmb2xkZXItaWNvbiIgaWNvbj0ibHVjaWRlOkZvbGRlciI+PC9kZWVzLWljb24+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xkZXItbmFtZSI+JHt0aGlzLm5hbWUgfHwgIlVudGl0bGVkIEZvbGRlciJ9PC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9InByZXZpZXctZ3JpZCI+CiAgICAgICAgICAke3ByZXZpZXdJdGVtcy5tYXAoKGl0ZW0pID0+IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJncmlkLWNlbGwiPgogICAgICAgICAgICAgICR7aXRlbS50aHVtYm5haWxTcmMgPyBiMmAKICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIke2l0ZW0udGh1bWJuYWlsU3JjfSIgYWx0PSIke2l0ZW0ubmFtZX0iIC8+CiAgICAgICAgICAgICAgYCA6IGIyYAogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSIke1RZUEVfSUNPTl9NQVBbaXRlbS50eXBlXSB8fCBUWVBFX0lDT05fTUFQLnVua25vd259Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICBgfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGApfQogICAgICAgICAgJHtBcnJheS5mcm9tKHsgbGVuZ3RoOiBlbXB0eUNlbGxzIH0pLm1hcCgoKSA9PiBiMmAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JpZC1jZWxsIGdyaWQtY2VsbC1lbXB0eSI+PC9kaXY+CiAgICAgICAgICBgKX0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJ0aWxlLWJhZGdlLWNvcm5lciI+CiAgICAgICAgJHt0aGlzLml0ZW1zLmxlbmd0aH0gaXRlbSR7dGhpcy5pdGVtcy5sZW5ndGggIT09IDEgPyAicyIgOiAiIn0KICAgICAgPC9kaXY+CgogICAgICAke3RoaXMuY2xpY2thYmxlID8gYjJgCiAgICAgICAgPGRpdiBjbGFzcz0idGlsZS1vdmVybGF5Ij4KICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOkZvbGRlck9wZW4iPjwvZGVlcy1pY29uPgogICAgICAgICAgPHNwYW4+T3BlbiBGb2xkZXI8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgIGAgOiAiIn0KICAgIGA7CiAgICB9CiAgICBnZXRUaWxlQ2xpY2tEZXRhaWwoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgbmFtZTogdGhpcy5uYW1lLAogICAgICAgIGl0ZW1Db3VudDogdGhpcy5pdGVtcy5sZW5ndGgsCiAgICAgICAgaXRlbXM6IHRoaXMuaXRlbXMKICAgICAgfTsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczg0KHRoaXMsIF9pdGVtc19leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczg0KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzVGlsZUZvbGRlcjIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW92ZXJsYXkvZGVlcy1zcGVlY2hidWJibGUvZGVlcy1zcGVlY2hidWJibGUuZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgZGVtb0Z1bmM1MCA9ICgpID0+IHsKICByZXR1cm4gYjJgCiAgICA8c3R5bGU+CiAgICAgIC5yZWYxIHsKICAgICAgICBtYXJnaW46IDIwcHg7CiAgICAgICAgd2lkdGg6IDEwcHg7CiAgICAgICAgaGVpZ2h0OiAxMHB4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJlZDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9InJlZjEiPjwvZGl2PgogICAgPGRlZXMtc3BlZWNoYnViYmxlIC50ZXh0PSR7YAogICAgICAqKlRoaXMgaXMgYSBsb25nZXIgbWFya2Rvd24gdGV4dCB0aGF0ICBjYW4gYmUgdXNlZCB0aGUgd3JpdGUqKiAgCiAgICAgIGEgbG9uZ2VyIGRlc2NyaXB0aW9uIGFib3V0IHdoYXRzIGdvaW5nIG9uIHRoZSBhcHAgIAogIAogICAgICAqKlRoaXMgaXMgYSBzdWJoZWFkZXIqKgogICAgICBhbmQgYW5vdGhlciB0ZXh0CiAgICAKICAgIGB9PjwvZGVlcy1zcGVlY2hidWJibGU+CiAgYDsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1vdmVybGF5L2RlZXMtc3BlZWNoYnViYmxlL2RlZXMtc3BlZWNoYnViYmxlLmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTg0ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM4NSA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1NwZWVjaGJ1YmJsZSA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtc3BlZWNoYnViYmxlIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfcmVmZmVkRWxlbWVudF9kZWNvcmF0b3JzOwogIGxldCBfcmVmZmVkRWxlbWVudF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlZmZlZEVsZW1lbnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RleHRfZGVjb3JhdG9yczsKICBsZXQgX3RleHRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90ZXh0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF93YXZlX2RlY29yYXRvcnM7CiAgbGV0IF93YXZlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfd2F2ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFuaWZlc3RlZF9kZWNvcmF0b3JzOwogIGxldCBfbWFuaWZlc3RlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21hbmlmZXN0ZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3N0YXR1c19kZWNvcmF0b3JzOwogIGxldCBfc3RhdHVzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc3RhdHVzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNTcGVlY2hidWJibGUyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfcmVmZmVkRWxlbWVudF9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBPYmplY3QKICAgICAgfSldOwogICAgICBfdGV4dF9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgcmVmbGVjdDogdHJ1ZQogICAgICB9KV07CiAgICAgIF93YXZlX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEJvb2xlYW4KICAgICAgfSldOwogICAgICBfbWFuaWZlc3RlZF9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBCb29sZWFuCiAgICAgIH0pXTsKICAgICAgX3N0YXR1c19kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBTdHJpbmcKICAgICAgfSldOwogICAgICBfX2VzRGVjb3JhdGU4NCh0aGlzLCBudWxsLCBfcmVmZmVkRWxlbWVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJyZWZmZWRFbGVtZW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJyZWZmZWRFbGVtZW50IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJlZmZlZEVsZW1lbnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnJlZmZlZEVsZW1lbnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcmVmZmVkRWxlbWVudF9pbml0aWFsaXplcnMsIF9yZWZmZWRFbGVtZW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODQodGhpcywgbnVsbCwgX3RleHRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGV4dCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGV4dCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50ZXh0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50ZXh0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3RleHRfaW5pdGlhbGl6ZXJzLCBfdGV4dF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTg0KHRoaXMsIG51bGwsIF93YXZlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIndhdmUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIndhdmUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoud2F2ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoud2F2ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF93YXZlX2luaXRpYWxpemVycywgX3dhdmVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4NCh0aGlzLCBudWxsLCBfbWFuaWZlc3RlZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtYW5pZmVzdGVkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtYW5pZmVzdGVkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1hbmlmZXN0ZWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1hbmlmZXN0ZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWFuaWZlc3RlZF9pbml0aWFsaXplcnMsIF9tYW5pZmVzdGVkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODQodGhpcywgbnVsbCwgX3N0YXR1c19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzdGF0dXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInN0YXR1cyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zdGF0dXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnN0YXR1cyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zdGF0dXNfaW5pdGlhbGl6ZXJzLCBfc3RhdHVzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODQobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzU3BlZWNoYnViYmxlMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jNTA7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiT3ZlcmxheSJdOwogICAgLy8gU1RBVElDCiAgICBzdGF0aWMgYXN5bmMgY3JlYXRlQW5kU2hvdyhyZWZFbGVtZW50LCB0ZXh0QXJnKSB7CiAgICAgIGNvbnN0IHdpbmRvd0xheWVyID0gYXdhaXQgRGVlc1dpbmRvd0xheWVyLmNyZWF0ZUFuZFNob3coewogICAgICAgIGJsdXI6IGZhbHNlCiAgICAgIH0pOwogICAgICBjb25zdCBzcGVlY2hidWJibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkZWVzLXNwZWVjaGJ1YmJsZSIpOwogICAgICBzcGVlY2hidWJibGUud2luZG93TGF5ZXIgPSB3aW5kb3dMYXllcjsKICAgICAgc3BlZWNoYnViYmxlLnJlZmZlZEVsZW1lbnQgPSByZWZFbGVtZW50OwogICAgICBzcGVlY2hidWJibGUudGV4dCA9IHRleHRBcmc7CiAgICAgIHNwZWVjaGJ1YmJsZS5tYW5pZmVzdGVkID0gdHJ1ZTsKICAgICAgd2luZG93TGF5ZXIuYXBwZW5kQ2hpbGQoc3BlZWNoYnViYmxlKTsKICAgICAgd2luZG93TGF5ZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICJub25lIjsKICAgICAgd2luZG93TGF5ZXIuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIud2luZG93T3ZlcmxheSIpLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAibm9uZSI7CiAgICAgIHJldHVybiBzcGVlY2hidWJibGU7CiAgICB9CiAgICAjcmVmZmVkRWxlbWVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM4NSh0aGlzLCBfcmVmZmVkRWxlbWVudF9pbml0aWFsaXplcnMsIHZvaWQgMCk7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IHJlZmZlZEVsZW1lbnQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNyZWZmZWRFbGVtZW50X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcmVmZmVkRWxlbWVudCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcmVmZmVkRWxlbWVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3RleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczg1KHRoaXMsIF9yZWZmZWRFbGVtZW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4NSh0aGlzLCBfdGV4dF9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgZ2V0IHRleHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0ZXh0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdGV4dCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdGV4dF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3dhdmVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczg1KHRoaXMsIF90ZXh0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4NSh0aGlzLCBfd2F2ZV9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgd2F2ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3dhdmVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB3YXZlKHZhbHVlMikgewogICAgICB0aGlzLiN3YXZlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWFuaWZlc3RlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODUodGhpcywgX3dhdmVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczg1KHRoaXMsIF9tYW5pZmVzdGVkX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBtYW5pZmVzdGVkKCkgewogICAgICByZXR1cm4gdGhpcy4jbWFuaWZlc3RlZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1hbmlmZXN0ZWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI21hbmlmZXN0ZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzdGF0dXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczg1KHRoaXMsIF9tYW5pZmVzdGVkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4NSh0aGlzLCBfc3RhdHVzX2luaXRpYWxpemVycywgIm5vcm1hbCIpKTsKICAgIGdldCBzdGF0dXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzdGF0dXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzdGF0dXModmFsdWUyKSB7CiAgICAgIHRoaXMuI3N0YXR1c19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgd2luZG93TGF5ZXIgPSBfX3J1bkluaXRpYWxpemVyczg1KHRoaXMsIF9zdGF0dXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMzMzIiwgIiNmZmYiKX07CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5tYWluY29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yczsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMHB4KTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4yczsKICAgICAgICBtYXJnaW4tbGVmdDogMHB4OwogICAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMHB4IDBweCAycHggcmdiYSgwLCAwLCAwLCAwLjIpKTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzOwogICAgICB9CgogICAgICAuYXJyb3cgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmYiLCAiIzMzMyIpfTsKICAgICAgICBoZWlnaHQ6IDE1cHg7CiAgICAgICAgd2lkdGg6IDE1cHg7CiAgICAgICAgbGVmdDogMnB4OwogICAgICAgIHRvcDogMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgIH0KCiAgICAgIC5zcGVlY2hidWJibGUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmIiwgIiMzMzMiKX07CiAgICAgICAgcGFkZGluZzogMHB4IDE2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBtaW4td2lkdGg6IDI0MHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICB0b3A6IDBweDsKICAgICAgICBsZWZ0OiA4cHg7CiAgICAgIH0KCiAgICAgIC53YXZlIHsKICAgICAgICBhbmltYXRpb24tbmFtZTogd2F2ZS1hbmltYXRpb247IC8qIFJlZmVycyB0byB0aGUgbmFtZSBvZiB5b3VyIEBrZXlmcmFtZXMgZWxlbWVudCBiZWxvdyAqLwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMi41czsgLyogQ2hhbmdlIHRvIHNwZWVkIHVwIG9yIHNsb3cgZG93biAqLwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOyAvKiBOZXZlciBzdG9wIHdhdmluZyA6KSAqLwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDcwJSA3MCU7IC8qIFBpdm90IGFyb3VuZCB0aGUgYm90dG9tLWxlZnQgcGFsbSAqLwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyB3YXZlLWFuaW1hdGlvbiB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgICAgICAgfQogICAgICAgIDEwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxNGRlZyk7CiAgICAgICAgfSAvKiBUaGUgZm9sbG93aW5nIGZpdmUgdmFsdWVzIGNhbiBiZSBwbGF5ZWQgd2l0aCB0byBtYWtlIHRoZSB3YXZpbmcgbW9yZSBvciBsZXNzIGV4dHJlbWUgKi8KICAgICAgICAyMCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLThkZWcpOwogICAgICAgIH0KICAgICAgICAzMCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTRkZWcpOwogICAgICAgIH0KICAgICAgICA0MCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTRkZWcpOwogICAgICAgIH0KICAgICAgICA1MCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTBkZWcpOwogICAgICAgIH0KICAgICAgICA2MCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgICAgICAgfSAvKiBSZXNldCBmb3IgdGhlIGxhc3QgaGFsZiB0byBwYXVzZSAqLwogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgICAgICAgfQogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgICR7dGhpcy5tYW5pZmVzdGVkID8gYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1haW5jb250YWluZXIiIEBjbGljaz0ke3RoaXMuaGFuZGxlQ2xpY2t9PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFycm93Ij48L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzcGVlY2hidWJibGUiPgogICAgICAgICAgICAgICAgJHt0aGlzLndhdmUgPyBiMmA8c3BhbiBjbGFzcz0id2F2ZSI+8J+Rizwvc3Bhbj5gIDogYjJgYH0KICAgICAgICAgICAgICAgICR7ZGlyZWN0aXZlc19leHBvcnRzLnJlc29sdmUodGhpcy5nZXRIdG1sKCkpfQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGAgOiBiMmBgfQogICAgYDsKICAgIH0KICAgIGFzeW5jIGhhbmRsZUNsaWNrKCkgewogICAgICBjb25zb2xlLmxvZygic3BlZWNoYnViYmxlIGdvdCBjbGlja2VkLiIpOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKCkgewogICAgICBpZiAoIXRoaXMucmVmZmVkRWxlbWVudCkgewogICAgICAgIHRoaXMucmVmZmVkRWxlbWVudCA9IHRoaXMucHJldmlvdXNFbGVtZW50U2libGluZzsKICAgICAgfQogICAgICBpZiAodGhpcy5tYW5pZmVzdGVkKSB7CiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVQb3NpdGlvbigpOwogICAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIubWFpbmNvbnRhaW5lciIpLnN0eWxlLm9wYWNpdHkgPSAiMSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGV0IHNwZWVjaGJ1YmJsZTsKICAgICAgICB0aGlzLnJlZmZlZEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsIGFzeW5jICgpID0+IHsKICAgICAgICAgIHNwZWVjaGJ1YmJsZSA9IGF3YWl0IERlZXNTcGVlY2hidWJibGUyLmNyZWF0ZUFuZFNob3codGhpcy5yZWZmZWRFbGVtZW50LCB0aGlzLnRleHQpOwogICAgICAgIH0pOwogICAgICAgIHRoaXMucmVmZmVkRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwgKCkgPT4gewogICAgICAgICAgc3BlZWNoYnViYmxlLmRlc3Ryb3koKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgYXN5bmMgdXBkYXRlUG9zaXRpb24oKSB7CiAgICAgIGNvbnN0IHJlZkVsZW1lbnQgPSB0aGlzLnJlZmZlZEVsZW1lbnQ7CiAgICAgIGNvbnN0IGJvdW5kaW5nQ2xpZW50UmVjdCA9IHJlZkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIHRoaXMuc3R5bGUucG9zaXRpb24gPSAiZml4ZWQiOwogICAgICB0aGlzLnN0eWxlLnRvcCA9IGAke2JvdW5kaW5nQ2xpZW50UmVjdC50b3AgLSAxM31weGA7CiAgICAgIHRoaXMuc3R5bGUubGVmdCA9IGAke2JvdW5kaW5nQ2xpZW50UmVjdC5sZWZ0ICsgcmVmRWxlbWVudC5jbGllbnRXaWR0aCArIDR9cHhgOwogICAgICBpZiAoYm91bmRpbmdDbGllbnRSZWN0LnJpZ2h0ID4gMjUwKSB7CiAgICAgICAgdGhpcy5zdHlsZS53aWR0aCA9IGAyNTBweGA7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGdldEh0bWwoKSB7CiAgICAgIGlmICghdGhpcy50ZXh0KSB7CiAgICAgICAgcmV0dXJuICIiOwogICAgICB9CiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBkaXN0X3RzX2V4cG9ydHMyNS5wbHVnaW5zLnNtYXJ0c3RyaW5nLm5vcm1hbGl6ZS5zdGFuZGFyZCh0aGlzLnRleHQpOwogICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkaXN0X3RzX2V4cG9ydHMyNS5wbHVnaW5zLnNtYXJ0bWFya2Rvd24uU21hcnRNYXJrZG93bi5lYXN5TWFya2Rvd25Ub0h0bWwobm9ybWFsaXplZCk7CiAgICAgIHJldHVybiBvOChyZXN1bHQpOwogICAgfQogICAgYXN5bmMgc2hvdygpIHsKICAgIH0KICAgIGFzeW5jIGRlc3Ryb3koKSB7CiAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIubWFpbmNvbnRhaW5lciIpLnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgIHRoaXMud2luZG93TGF5ZXIuZGVzdHJveSgpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM4NShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1NwZWVjaGJ1YmJsZTIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXNpbXBsZS9kZWVzLXNpbXBsZS1hcHBkYXNoL2RlZXMtc2ltcGxlLWFwcGRhc2guZGVtby5qcwppbml0X2Rpc3RfdHMyNigpOwp2YXIgX19lc0RlY29yYXRlODYgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczg3ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZW1vVmlld0Rhc2hib2FyZCA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlbW8tdmlldy1kYXNoYm9hcmQiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgdmFyIERlbW9WaWV3RGFzaGJvYXJkMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX19lc0RlY29yYXRlODYobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZW1vVmlld0Rhc2hib2FyZDIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNDBweDsKICAgICAgfQogICAgICBoMSB7CiAgICAgICAgbWFyZ2luOiAwIDAgMjBweCAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMCIsICIjZmZmIil9OwogICAgICB9CiAgICAgIGRlZXMtc3RhdHNncmlkIHsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICB9CiAgICBgCiAgICBdOwogICAgc3RhdHNUaWxlcyA9IFsKICAgICAgewogICAgICAgIGlkOiAidXNlcnMiLAogICAgICAgIHRpdGxlOiAiQWN0aXZlIFVzZXJzIiwKICAgICAgICB2YWx1ZTogMTIzNCwKICAgICAgICB0eXBlOiAibnVtYmVyIiwKICAgICAgICBpY29uOiAiZmFVc2VycyIsCiAgICAgICAgZGVzY3JpcHRpb246ICIrMTUlIGZyb20gbGFzdCB3ZWVrIiwKICAgICAgICBjb2xvcjogIiMyMmM1NWUiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpZDogInBhZ2V2aWV3cyIsCiAgICAgICAgdGl0bGU6ICJQYWdlIFZpZXdzIiwKICAgICAgICB2YWx1ZTogNTY3MDAsCiAgICAgICAgdHlwZTogIm51bWJlciIsCiAgICAgICAgaWNvbjogImZhRXllIiwKICAgICAgICBkZXNjcmlwdGlvbjogIjU2LjdrIHRvdGFsIHZpZXdzIiwKICAgICAgICBjb2xvcjogIiMzYjgyZjYiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpZDogInVwdGltZSIsCiAgICAgICAgdGl0bGU6ICJTeXN0ZW0gVXB0aW1lIiwKICAgICAgICB2YWx1ZTogODksCiAgICAgICAgdW5pdDogIiUiLAogICAgICAgIHR5cGU6ICJnYXVnZSIsCiAgICAgICAgaWNvbjogImZhU2VydmVyIiwKICAgICAgICBkZXNjcmlwdGlvbjogIkxhc3QgMzAgZGF5cyIsCiAgICAgICAgY29sb3I6ICIjMTBiOTgxIiwKICAgICAgICBnYXVnZU9wdGlvbnM6IHsKICAgICAgICAgIG1pbjogMCwKICAgICAgICAgIG1heDogMTAwLAogICAgICAgICAgdGhyZXNob2xkczogWwogICAgICAgICAgICB7IHZhbHVlOiA4MCwgY29sb3I6ICIjZWY0NDQ0IiB9LAogICAgICAgICAgICB7IHZhbHVlOiA5MCwgY29sb3I6ICIjZjU5ZTBiIiB9LAogICAgICAgICAgICB7IHZhbHVlOiAxMDAsIGNvbG9yOiAiIzEwYjk4MSIgfQogICAgICAgICAgXQogICAgICAgIH0KICAgICAgfSwKICAgICAgewogICAgICAgIGlkOiAicmVzcG9uc2UiLAogICAgICAgIHRpdGxlOiAiQXZnIFJlc3BvbnNlIFRpbWUiLAogICAgICAgIHZhbHVlOiAzLjIsCiAgICAgICAgdW5pdDogInMiLAogICAgICAgIHR5cGU6ICJudW1iZXIiLAogICAgICAgIGljb246ICJmYUNsb2NrIiwKICAgICAgICBkZXNjcmlwdGlvbjogIi0wLjVzIGltcHJvdmVtZW50IiwKICAgICAgICBjb2xvcjogIiNmNTllMGIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpZDogInJldmVudWUiLAogICAgICAgIHRpdGxlOiAiTW9udGhseSBSZXZlbnVlIiwKICAgICAgICB2YWx1ZTogNDg1MjAsCiAgICAgICAgdW5pdDogIiQiLAogICAgICAgIHR5cGU6ICJ0cmVuZCIsCiAgICAgICAgaWNvbjogImZhRG9sbGFyU2lnbiIsCiAgICAgICAgZGVzY3JpcHRpb246ICIrOC4yJSBncm93dGgiLAogICAgICAgIGNvbG9yOiAiIzIyYzU1ZSIsCiAgICAgICAgdHJlbmREYXRhOiBbMzVlMywgMzhlMywgMzc1MDAsIDQxZTMsIDM5ODAwLCA0MmUzLCA0NDEwMCwgNDMyMDAsIDQ1NjAwLCA0NzEwMCwgNDY4MDAsIDQ4NTIwXQogICAgICB9LAogICAgICB7CiAgICAgICAgaWQ6ICJ0cmFmZmljIiwKICAgICAgICB0aXRsZTogIlRyYWZmaWMgVHJlbmQiLAogICAgICAgIHZhbHVlOiAxNjgwLAogICAgICAgIHR5cGU6ICJ0cmVuZCIsCiAgICAgICAgaWNvbjogImZhQ2hhcnRMaW5lIiwKICAgICAgICBkZXNjcmlwdGlvbjogIkxhc3QgNyBkYXlzIiwKICAgICAgICBjb2xvcjogIiMzYjgyZjYiLAogICAgICAgIHRyZW5kRGF0YTogWzEyMDAsIDEzNTAsIDExMDAsIDE0NTAsIDE2MDAsIDE1NTAsIDE2ODBdCiAgICAgIH0KICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGgxPkRhc2hib2FyZDwvaDE+CiAgICAgIDxwPldlbGNvbWUgdG8geW91ciBhcHBsaWNhdGlvbiBkYXNoYm9hcmQuIEhlcmUncyBhbiBvdmVydmlldyBvZiB5b3VyIG1ldHJpY3M6PC9wPgogICAgICA8ZGVlcy1zdGF0c2dyaWQKICAgICAgICAudGlsZXM9JHt0aGlzLnN0YXRzVGlsZXN9CiAgICAgICAgQHRpbGUtYWN0aW9uPSR7KGUxMSkgPT4gewogICAgICAgIGNvbnNvbGUubG9nKCJUaWxlIGFjdGlvbjoiLCBlMTEuZGV0YWlsKTsKICAgICAgfX0KICAgICAgPjwvZGVlcy1zdGF0c2dyaWQ+CiAgICBgOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM4NyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVtb1ZpZXdEYXNoYm9hcmQyID0gX2NsYXNzVGhpczsKfSkoKTsKdmFyIERlbW9WaWV3QW5hbHl0aWNzID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVtby12aWV3LWFuYWx5dGljcyIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICB2YXIgRGVtb1ZpZXdBbmFseXRpY3MyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfX2VzRGVjb3JhdGU4NihudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlbW9WaWV3QW5hbHl0aWNzMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiA0MHB4OwogICAgICB9CiAgICAgIGgxIHsKICAgICAgICBtYXJnaW46IDAgMCAyMHB4IDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwIiwgIiNmZmYiKX07CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGgxPkFuYWx5dGljczwvaDE+CiAgICAgIDxwPlRoaXMgaXMgdGhlIGFuYWx5dGljcyB2aWV3LiBZb3UgY2FuIGFkZCBjaGFydHMgYW5kIG1ldHJpY3MgaGVyZS48L3A+CiAgICBgOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM4NyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVtb1ZpZXdBbmFseXRpY3MyID0gX2NsYXNzVGhpczsKfSkoKTsKdmFyIERlbW9WaWV3U2V0dGluZ3MgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZW1vLXZpZXctc2V0dGluZ3MiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgdmFyIERlbW9WaWV3U2V0dGluZ3MyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfX2VzRGVjb3JhdGU4NihudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlbW9WaWV3U2V0dGluZ3MyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDQwcHg7CiAgICAgIH0KICAgICAgaDEgewogICAgICAgIG1hcmdpbjogMCAwIDIwcHggMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAiLCAiI2ZmZiIpfTsKICAgICAgfQogICAgICAuc2V0dGluZ3Mtc2VjdGlvbiB7CiAgICAgICAgbWFyZ2luLXRvcDogMzBweDsKICAgICAgfQogICAgICAuc2V0dGluZ3Mtc2VjdGlvbiBoMiB7CiAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgIG1hcmdpbjogMCAwIDE1cHggMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzMzMiLCAiI2NjYyIpfTsKICAgICAgfQogICAgICAuaG9yaXpvbnRhbC1mb3JtLXNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjVmNWY1IiwgIiMxYTFhMWEiKX07CiAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgbWFyZ2luOiAxNXB4IDA7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGgxPlNldHRpbmdzPC9oMT4KICAgICAgPHA+Q29uZmlndXJlIHlvdXIgYXBwbGljYXRpb24gc2V0dGluZ3MgYmVsb3c6PC9wPgogICAgICAKICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3Mtc2VjdGlvbiI+CiAgICAgICAgPGgyPkdlbmVyYWwgU2V0dGluZ3M8L2gyPgogICAgICAgIDxkZWVzLWZvcm0+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IGtleT0iYXBwTmFtZSIgbGFiZWw9IkFwcGxpY2F0aW9uIE5hbWUiIHZhbHVlPSJNeSBBcHAiPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCBrZXk9ImFwaUVuZHBvaW50IiBsYWJlbD0iQVBJIEVuZHBvaW50IiB2YWx1ZT0iaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20iPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgPGRlZXMtaW5wdXQtZHJvcGRvd24KICAgICAgICAgICAga2V5PSJlbnZpcm9ubWVudCIKICAgICAgICAgICAgbGFiZWw9IkVudmlyb25tZW50IgogICAgICAgICAgICAub3B0aW9ucz0ke1sKICAgICAgICB7IG9wdGlvbjogIkRldmVsb3BtZW50Iiwga2V5OiAiZGV2IiB9LAogICAgICAgIHsgb3B0aW9uOiAiU3RhZ2luZyIsIGtleTogInN0YWdpbmciIH0sCiAgICAgICAgeyBvcHRpb246ICJQcm9kdWN0aW9uIiwga2V5OiAicHJvZCIgfQogICAgICBdfQogICAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHt7IG9wdGlvbjogIlByb2R1Y3Rpb24iLCBrZXk6ICJwcm9kIiB9fQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1kcm9wZG93bj4KICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IGtleT0iZW5hYmxlTm90aWZpY2F0aW9ucyIgbGFiZWw9IkVuYWJsZSBOb3RpZmljYXRpb25zIiB2YWx1ZT0idHJ1ZSI+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3gga2V5PSJlbmFibGVBbmFseXRpY3MiIGxhYmVsPSJFbmFibGUgQW5hbHl0aWNzIiB2YWx1ZT0iZmFsc2UiPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICAgIDxkZWVzLWZvcm0tc3VibWl0PlNhdmUgR2VuZXJhbCBTZXR0aW5nczwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgPC9kaXY+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJzZXR0aW5ncy1zZWN0aW9uIj4KICAgICAgICA8aDI+RGlzcGxheSBQcmVmZXJlbmNlczwvaDI+CiAgICAgICAgPGRpdiBjbGFzcz0iaG9yaXpvbnRhbC1mb3JtLXNlY3Rpb24iPgogICAgICAgICAgPHAgc3R5bGU9Im1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDE2cHg7Ij5RdWljayBkaXNwbGF5IHNldHRpbmdzIHVzaW5nIGhvcml6b250YWwgbGF5b3V0OjwvcD4KICAgICAgICAgIDxkZWVzLWZvcm0gaG9yaXpvbnRhbC1sYXlvdXQ+CiAgICAgICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAgICAga2V5PSJ0aGVtZSIKICAgICAgICAgICAgICBsYWJlbD0iVGhlbWUiCiAgICAgICAgICAgICAgLmVuYWJsZVNlYXJjaD0ke2ZhbHNlfQogICAgICAgICAgICAgIC5vcHRpb25zPSR7WwogICAgICAgIHsgb3B0aW9uOiAiTGlnaHQiLCBrZXk6ICJsaWdodCIgfSwKICAgICAgICB7IG9wdGlvbjogIkRhcmsiLCBrZXk6ICJkYXJrIiB9LAogICAgICAgIHsgb3B0aW9uOiAiQXV0byIsIGtleTogImF1dG8iIH0KICAgICAgXX0KICAgICAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHt7IG9wdGlvbjogIkRhcmsiLCBrZXk6ICJkYXJrIiB9fQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LWRyb3Bkb3duPgogICAgICAgICAgICA8ZGVlcy1pbnB1dC1kcm9wZG93bgogICAgICAgICAgICAgIGtleT0ibGFuZ3VhZ2UiCiAgICAgICAgICAgICAgbGFiZWw9Ikxhbmd1YWdlIgogICAgICAgICAgICAgIC5lbmFibGVTZWFyY2g9JHtmYWxzZX0KICAgICAgICAgICAgICAub3B0aW9ucz0ke1sKICAgICAgICB7IG9wdGlvbjogIkVuZ2xpc2giLCBrZXk6ICJlbiIgfSwKICAgICAgICB7IG9wdGlvbjogIkdlcm1hbiIsIGtleTogImRlIiB9LAogICAgICAgIHsgb3B0aW9uOiAiU3BhbmlzaCIsIGtleTogImVzIiB9LAogICAgICAgIHsgb3B0aW9uOiAiRnJlbmNoIiwga2V5OiAiZnIiIH0KICAgICAgXX0KICAgICAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHt7IG9wdGlvbjogIkVuZ2xpc2giLCBrZXk6ICJlbiIgfX0KICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC1kcm9wZG93bj4KICAgICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3gga2V5PSJjb21wYWN0TW9kZSIgbGFiZWw9IkNvbXBhY3QgTW9kZSI+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgICAgPC9kZWVzLWZvcm0+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3Mtc2VjdGlvbiI+CiAgICAgICAgPGgyPk5vdGlmaWNhdGlvbiBTZXR0aW5nczwvaDI+CiAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgIDxkZWVzLWlucHV0LXJhZGlvZ3JvdXAKICAgICAgICAgICAgLmxhYmVsPSR7IkVtYWlsIEZyZXF1ZW5jeSJ9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WyJSZWFsLXRpbWUiLCAiRGFpbHkgRGlnZXN0IiwgIldlZWtseSBTdW1tYXJ5IiwgIk5ldmVyIl19CiAgICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJSZWFsLXRpbWUifQogICAgICAgICAgICAua2V5PSR7ImVtYWlsRnJlcXVlbmN5In0KICAgICAgICAgID48L2RlZXMtaW5wdXQtcmFkaW9ncm91cD4KICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IGtleT0icHVzaE5vdGlmaWNhdGlvbnMiIGxhYmVsPSJFbmFibGUgUHVzaCBOb3RpZmljYXRpb25zIiB2YWx1ZT0idHJ1ZSI+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3gga2V5PSJzb3VuZEFsZXJ0cyIgbGFiZWw9IlBsYXkgU291bmQgZm9yIEFsZXJ0cyIgdmFsdWU9InRydWUiPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICAgIDxkZWVzLWZvcm0tc3VibWl0PlVwZGF0ZSBOb3RpZmljYXRpb25zPC9kZWVzLWZvcm0tc3VibWl0PgogICAgICAgIDwvZGVlcy1mb3JtPgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczg3KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZW1vVmlld1NldHRpbmdzMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CnZhciBkZW1vRnVuYzUxID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgYm9keSB7CiAgICAgIG1hcmdpbjogMDsKICAgICAgcGFkZGluZzogMDsKICAgIH0KICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgdG9wOiAwOwogICAgICBsZWZ0OiAwOwogICAgfQogIDwvc3R5bGU+CiAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgPGRlZXMtc2ltcGxlLWFwcGRhc2gKICAgICAgbmFtZT0iTXkgQXBwbGljYXRpb24iCiAgICAgIHRlcm1pbmFsU2V0dXBDb21tYW5kPSJlY2hvICdXZWxjb21lIHRvIHRoZSB0ZXJtaW5hbCEnIgogICAgICAudmlld1RhYnM9JHtbCiAgewogICAgbmFtZTogIkRhc2hib2FyZCIsCiAgICBpY29uTmFtZTogImx1Y2lkZTpob21lIiwKICAgIGVsZW1lbnQ6IERlbW9WaWV3RGFzaGJvYXJkCiAgfSwKICB7CiAgICBuYW1lOiAiQW5hbHl0aWNzIiwKICAgIGljb25OYW1lOiAibHVjaWRlOmxpbmVDaGFydCIsCiAgICBlbGVtZW50OiBEZW1vVmlld0FuYWx5dGljcwogIH0sCiAgewogICAgbmFtZTogIlNldHRpbmdzIiwKICAgIGljb25OYW1lOiAibHVjaWRlOnNldHRpbmdzIiwKICAgIGVsZW1lbnQ6IERlbW9WaWV3U2V0dGluZ3MKICB9Cl19CiAgICAgIEBsb2dvdXQ9JHsoKSA9PiB7CiAgY29uc29sZS5sb2coIkxvZ291dCBldmVudCB0cmlnZ2VyZWQiKTsKICBhbGVydCgiTG9nb3V0IGNsaWNrZWQhIik7Cn19CiAgICAgIEB2aWV3LXNlbGVjdD0keyhlMTEpID0+IHsKICBjb25zb2xlLmxvZygiVmlldyBzZWxlY3RlZDoiLCBlMTEuZGV0YWlsLnZpZXcubmFtZSk7Cn19CiAgICA+PC9kZWVzLXNpbXBsZS1hcHBkYXNoPgogIDwvZGl2PgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXNpbXBsZS9kZWVzLXNpbXBsZS1hcHBkYXNoL2RlZXMtc2ltcGxlLWFwcGRhc2guanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF9kZWVzX2ljb24oKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlODcgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczg4ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzU2ltcGxlQXBwRGFzaCA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtc2ltcGxlLWFwcGRhc2giKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9uYW1lX2RlY29yYXRvcnM7CiAgbGV0IF9uYW1lX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbmFtZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmlld1RhYnNfZGVjb3JhdG9yczsKICBsZXQgX3ZpZXdUYWJzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmlld1RhYnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Rlcm1pbmFsU2V0dXBDb21tYW5kX2RlY29yYXRvcnM7CiAgbGV0IF90ZXJtaW5hbFNldHVwQ29tbWFuZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Rlcm1pbmFsU2V0dXBDb21tYW5kX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZFZpZXdfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkVmlld19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkVmlld19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzU2ltcGxlQXBwRGFzaDIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9uYW1lX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF92aWV3VGFic19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfdGVybWluYWxTZXR1cENvbW1hbmRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9zZWxlY3RlZFZpZXdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlODcodGhpcywgbnVsbCwgX25hbWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibmFtZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibmFtZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5uYW1lLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5uYW1lID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX25hbWVfaW5pdGlhbGl6ZXJzLCBfbmFtZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTg3KHRoaXMsIG51bGwsIF92aWV3VGFic19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2aWV3VGFicyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmlld1RhYnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmlld1RhYnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZpZXdUYWJzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZpZXdUYWJzX2luaXRpYWxpemVycywgX3ZpZXdUYWJzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODcodGhpcywgbnVsbCwgX3Rlcm1pbmFsU2V0dXBDb21tYW5kX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRlcm1pbmFsU2V0dXBDb21tYW5kIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0ZXJtaW5hbFNldHVwQ29tbWFuZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50ZXJtaW5hbFNldHVwQ29tbWFuZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGVybWluYWxTZXR1cENvbW1hbmQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGVybWluYWxTZXR1cENvbW1hbmRfaW5pdGlhbGl6ZXJzLCBfdGVybWluYWxTZXR1cENvbW1hbmRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4Nyh0aGlzLCBudWxsLCBfc2VsZWN0ZWRWaWV3X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlbGVjdGVkVmlldyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0ZWRWaWV3IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGVkVmlldywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VsZWN0ZWRWaWV3ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGVkVmlld19pbml0aWFsaXplcnMsIF9zZWxlY3RlZFZpZXdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4NyhudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNTaW1wbGVBcHBEYXNoMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAvLyBTVEFUSUMKICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmM1MTsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJTaW1wbGUiXTsKICAgICNuYW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczg4KHRoaXMsIF9uYW1lX2luaXRpYWxpemVycywgIkFwcGxpY2F0aW9uIERhc2hib2FyZCIpOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCBuYW1lKCkgewogICAgICByZXR1cm4gdGhpcy4jbmFtZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG5hbWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI25hbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN2aWV3VGFic19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODgodGhpcywgX25hbWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczg4KHRoaXMsIF92aWV3VGFic19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgdmlld1RhYnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2aWV3VGFic19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZpZXdUYWJzKHZhbHVlMikgewogICAgICB0aGlzLiN2aWV3VGFic19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Rlcm1pbmFsU2V0dXBDb21tYW5kX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4OCh0aGlzLCBfdmlld1RhYnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczg4KHRoaXMsIF90ZXJtaW5hbFNldHVwQ29tbWFuZF9pbml0aWFsaXplcnMsIGBlY2hvICJUZXJtaW5hbCByZWFkeSJgKSk7CiAgICBnZXQgdGVybWluYWxTZXR1cENvbW1hbmQoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0ZXJtaW5hbFNldHVwQ29tbWFuZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRlcm1pbmFsU2V0dXBDb21tYW5kKHZhbHVlMikgewogICAgICB0aGlzLiN0ZXJtaW5hbFNldHVwQ29tbWFuZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NlbGVjdGVkVmlld19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODgodGhpcywgX3Rlcm1pbmFsU2V0dXBDb21tYW5kX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4OCh0aGlzLCBfc2VsZWN0ZWRWaWV3X2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgc2VsZWN0ZWRWaWV3KCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRWaWV3X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0ZWRWaWV3KHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3RlZFZpZXdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxNSUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAubWFpbmNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDBweDsKICAgICAgICByaWdodDogMHB4OwogICAgICAgIGJvdHRvbTogMHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5hcHBiYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDBweDsKICAgICAgICBsZWZ0OiAwcHg7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSAyNHB4KTsKICAgICAgICB3aWR0aDogMjQwcHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk5JSkiLCAiaHNsKDAgMCUgNyUpIil9OwogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5MSUpIiwgImhzbCgwIDAlIDEzJSkiKX07CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtZmFtaWx5OiAnR2Vpc3QgU2FucycsIHNhbnMtc2VyaWY7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byAxZnIgbWluLWNvbnRlbnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnNpZGViYXItaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAyMHB4IDE2cHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5MSUpIiwgImhzbCgwIDAlIDEzJSkiKX07CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTJweDsKICAgICAgfQoKICAgICAgLmhlYWRlci1pY29uLXdyYXBwZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB3aWR0aDogMzZweDsKICAgICAgICBoZWlnaHQ6IDM2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgibGluZWFyLWdyYWRpZW50KDEzNWRlZywgaHNsKDIxNSAyMCUgOTUlKSAwJSwgaHNsKDIxNSAyMCUgOTAlKSAxMDAlKSIsICJsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCBoc2woMjE1IDIwJSAxOCUpIDAlLCBoc2woMjE1IDIwJSAxNCUpIDEwMCUpIil9OwogICAgICAgIGJveC1zaGFkb3c6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIwIDFweCAycHggcmdiKDAgMCAwIC8gMC4wNSksIGluc2V0IDAgMXB4IDAgcmdiKDI1NSAyNTUgMjU1IC8gMC41KSIsICIwIDFweCAycHggcmdiKDAgMCAwIC8gMC4yKSwgaW5zZXQgMCAxcHggMCByZ2IoMjU1IDI1NSAyNTUgLyAwLjA1KSIpfTsKICAgICAgfQoKICAgICAgLmhlYWRlci1pY29uLXdyYXBwZXIgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDIwJSA0MCUpIiwgImhzbCgyMTUgMjAlIDcwJSkiKX07CiAgICAgIH0KCiAgICAgIC5hcHBOYW1lIHsKICAgICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5OCUpIil9OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDJlbTsKICAgICAgfQoKICAgICAgLnZpZXdUYWJzLWNvbnRhaW5lciB7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBwYWRkaW5nOiAxMnB4IDhweDsKICAgICAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47CiAgICAgICAgc2Nyb2xsYmFyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODUlKSIsICJoc2woMCAwJSAyMCUpIil9IHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAudmlld1RhYnMtY29udGFpbmVyOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICAgICAgd2lkdGg6IDZweDsKICAgICAgfQoKICAgICAgLnZpZXdUYWJzLWNvbnRhaW5lcjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAudmlld1RhYnMtY29udGFpbmVyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg1JSkiLCAiaHNsKDAgMCUgMjAlKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgIH0KCiAgICAgIC52aWV3VGFicy1jb250YWluZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNzUlKSIsICJoc2woMCAwJSAzMCUpIil9OwogICAgICB9CgogICAgICAuc2VjdGlvbi1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNTAlKSIsICJoc2woMCAwJSA1MCUpIil9OwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4IDhweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICAgIH0KCiAgICAgIC52aWV3VGFicyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogMnB4OwogICAgICB9CgogICAgICAudmlld1RhYiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTBweDsKICAgICAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDAlKSIsICJoc2woMCAwJSA2NSUpIil9OwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgIH0KCiAgICAgIC52aWV3VGFiOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMCUgLyAwLjA0KSIsICJoc2woMCAwJSAxMDAlIC8gMC4wNSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxNSUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgIH0KCiAgICAgIC52aWV3VGFiOmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDAlIC8gMC4wNikiLCAiaHNsKDAgMCUgMTAwJSAvIDAuMDcpIil9OwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OSk7CiAgICAgIH0KCiAgICAgIC52aWV3VGFiLnNlbGVjdGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAyNSUgOTUlKSIsICJoc2woMjE1IDIwJSAxNSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAyNSUgMzAlKSIsICJoc2woMjE1IDI1JSA4NSUpIil9OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC52aWV3VGFiLnNlbGVjdGVkOjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHRvcDogOHB4OwogICAgICAgIGJvdHRvbTogOHB4OwogICAgICAgIHdpZHRoOiAzcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAycHggMnB4IDA7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgNzAlIDUwJSkiLCAiaHNsKDIxNSA3MCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLnZpZXdUYWIgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgb3BhY2l0eTogMC41NTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnZpZXdUYWI6aG92ZXIgZGVlcy1pY29uIHsKICAgICAgICBvcGFjaXR5OiAwLjc1OwogICAgICB9CgogICAgICAudmlld1RhYi5zZWxlY3RlZCBkZWVzLWljb24gewogICAgICAgIG9wYWNpdHk6IDAuOTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgNzAlIDQ1JSkiLCAiaHNsKDIxNSA3MCUgNjUlKSIpfTsKICAgICAgfQoKICAgICAgLnZpZXdUYWIgc3BhbiB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgIC5hcHBBY3Rpb25zIHsKICAgICAgICBwYWRkaW5nOiAxMnB4IDhweDsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDkxJSkiLCAiaHNsKDAgMCUgMTMlKSIpfTsKICAgICAgfQoKICAgICAgLmFjdGlvbiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTBweDsKICAgICAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQwJSkiLCAiaHNsKDAgMCUgNjUlKSIpfTsKICAgICAgfQoKICAgICAgLmFjdGlvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDg0JSA2MCUgLyAwLjA4KSIsICJoc2woMCA4NCUgNjAlIC8gMC4xMikiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA4NCUgNDUlKSIsICJoc2woMCA4NCUgNjUlKSIpfTsKICAgICAgfQoKICAgICAgLmFjdGlvbiBkZWVzLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5hY3Rpb246aG92ZXIgZGVlcy1pY29uIHsKICAgICAgICBvcGFjaXR5OiAwLjk7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA4NCUgNDUlKSIsICJoc2woMCA4NCUgNjUlKSIpfTsKICAgICAgfQoKICAgICAgLmFwcGNvbnRlbnQgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIHJpZ2h0OiAwcHg7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSAyNHB4KTsKICAgICAgICBib3R0b206IDI0cHg7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDI0MHB4KTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTclKSIsICJoc2woMCAwJSA1JSkiKX07CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjsKICAgICAgfQoKICAgICAgLmNvbnRyb2xiYXIgewogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDBweDsKICAgICAgICBsZWZ0OiAwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAyNHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIwIDEzJSAxOCUpIiwgImhzbCgyMjAgMTMlIDEyJSkiKX07CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAxZW07CiAgICAgIH0KCiAgICAgIC5jb250cm9sIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA2cHg7CiAgICAgICAgcGFkZGluZzogMCAxMnB4OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICBjb2xvcjogaHNsKDAgMCUgNzAlKTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIGhzbCgwIDAlIDEwMCUgLyAwLjA4KTsKICAgICAgfQoKICAgICAgLmNvbnRyb2w6Zmlyc3QtY2hpbGQgewogICAgICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgICB9CgogICAgICAuY29udHJvbDpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogaHNsKDAgMCUgMTAwJSAvIDAuMDYpOwogICAgICAgIGNvbG9yOiBoc2woMCAwJSA5NSUpOwogICAgICB9CgogICAgICAuY29udHJvbCBkZWVzLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgLmNvbnRyb2wuc3RhdHVzLWNvbm5lY3RlZCBkZWVzLWljb24gewogICAgICAgIGNvbG9yOiBoc2woMTQyIDcwJSA1MCUpOwogICAgICB9CgogICAgICAuY29udHJvbC5zdGF0dXMtdGVybWluYWwgZGVlcy1pY29uIHsKICAgICAgICBjb2xvcjogaHNsKDQ1IDkwJSA1NSUpOwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9Im1haW5jb250YWluZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImFwcGJhciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLWhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlci1pY29uLXdyYXBwZXIiPgogICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249IiR7Imx1Y2lkZTpsYXlvdXRHcmlkIn0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXBwTmFtZSI+JHt0aGlzLm5hbWV9PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InZpZXdUYWJzLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tbGFiZWwiPk5hdmlnYXRpb248L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idmlld1RhYnMiPgogICAgICAgICAgICAgICR7dGhpcy52aWV3VGFicy5tYXAoKHZpZXcpID0+IGIyYAogICAgICAgICAgICAgICAgICA8ZGl2CiAgICAgICAgICAgICAgICAgICAgY2xhc3M9InZpZXdUYWIgJHt0aGlzLnNlbGVjdGVkVmlldyA9PT0gdmlldyA/ICJzZWxlY3RlZCIgOiAiIn0iCiAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5sb2FkVmlldyh2aWV3KX0KICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICR7dmlldy5pY29uTmFtZSA/IGIyYAogICAgICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0iJHt2aWV3Lmljb25OYW1lLmluY2x1ZGVzKCI6IikgPyB2aWV3Lmljb25OYW1lIDogYGx1Y2lkZToke3ZpZXcuaWNvbk5hbWV9YH0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgICAgIGAgOiBiMmAKICAgICAgICAgICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249IiR7Imx1Y2lkZTpmaWxlIn0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgICAgIGB9CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHt2aWV3Lm5hbWV9PC9zcGFuPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIGApfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iYXBwQWN0aW9ucyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbiIgQGNsaWNrPSR7KCkgPT4gewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImxvZ291dCIsIHsgYnViYmxlczogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSkpOwogICAgICB9fT4KICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSIkeyJsdWNpZGU6bG9nT3V0In0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIDxzcGFuPlNpZ24gb3V0PC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImFwcGNvbnRlbnQiPgogICAgICAgICAgPCEtLSBDb250ZW50IGdvZXMgaGVyZSAtLT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sYmFyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wgc3RhdHVzLWNvbm5lY3RlZCI+CiAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249IiR7Imx1Y2lkZTp3aWZpIn0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICA8c3Bhbj5Db25uZWN0ZWQ8L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wgc3RhdHVzLXRlcm1pbmFsIiBAY2xpY2s9JHt0aGlzLmxhdW5jaFRlcm1pbmFsfT4KICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0iJHsibHVjaWRlOnRlcm1pbmFsIn0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICA8c3Bhbj5UZXJtaW5hbDwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIGNvbnN0IGRvbXRvb2xzID0gYXdhaXQgdGhpcy5kb210b29sc1Byb21pc2U7CiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBpZiAodGhpcy52aWV3VGFicyAmJiB0aGlzLnZpZXdUYWJzLmxlbmd0aCA+IDApIHsKICAgICAgICBhd2FpdCB0aGlzLmxvYWRWaWV3KHRoaXMudmlld1RhYnNbMF0pOwogICAgICB9CiAgICB9CiAgICBjdXJyZW50VGVybWluYWwgPSBfX3J1bkluaXRpYWxpemVyczg4KHRoaXMsIF9zZWxlY3RlZFZpZXdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgYXN5bmMgbGF1bmNoVGVybWluYWwoKSB7CiAgICAgIGNvbnN0IGRvbXRvb2xzID0gYXdhaXQgdGhpcy5kb210b29sc1Byb21pc2U7CiAgICAgIGlmICh0aGlzLmN1cnJlbnRUZXJtaW5hbCkgewogICAgICAgIGF3YWl0IHRoaXMuY2xvc2VUZXJtaW5hbCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBtYWluY29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5tYWluY29udGFpbmVyIik7CiAgICAgIGNvbnN0IHsgRGVlc1dvcmtzcGFjZVRlcm1pbmFsOiBEZWVzV29ya3NwYWNlVGVybWluYWwyIH0gPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2RlZXNfd29ya3NwYWNlX3Rlcm1pbmFsKCksIGRlZXNfd29ya3NwYWNlX3Rlcm1pbmFsX2V4cG9ydHMpKTsKICAgICAgY29uc3QgdGVybWluYWwgPSBuZXcgRGVlc1dvcmtzcGFjZVRlcm1pbmFsMigpOwogICAgICB0ZXJtaW5hbC5zZXR1cENvbW1hbmQgPSB0aGlzLnRlcm1pbmFsU2V0dXBDb21tYW5kOwogICAgICB0aGlzLmN1cnJlbnRUZXJtaW5hbCA9IHRlcm1pbmFsOwogICAgICBtYWluY29udGFpbmVyLmFwcGVuZENoaWxkKHRlcm1pbmFsKTsKICAgICAgdGVybWluYWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICB0ZXJtaW5hbC5zdHlsZS56SW5kZXggPSAiMTAiOwogICAgICB0ZXJtaW5hbC5zdHlsZS50b3AgPSAiMHB4IjsKICAgICAgdGVybWluYWwuc3R5bGUubGVmdCA9ICIyNDBweCI7CiAgICAgIHRlcm1pbmFsLnN0eWxlLnJpZ2h0ID0gIjBweCI7CiAgICAgIHRlcm1pbmFsLnN0eWxlLmJvdHRvbSA9ICIyNHB4IjsKICAgICAgdGVybWluYWwuc3R5bGUub3BhY2l0eSA9ICIwIjsKICAgICAgdGVybWluYWwuc3R5bGUudHJhbnNmb3JtID0gInRyYW5zbGF0ZVkoOHB4KSBzY2FsZSgwLjk5KSI7CiAgICAgIHRlcm1pbmFsLnN0eWxlLnRyYW5zaXRpb24gPSAiYWxsIDAuMjVzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSkiOwogICAgICB0ZXJtaW5hbC5zdHlsZS5ib3hTaGFkb3cgPSAiMCAyNXB4IDUwcHggLTEycHggcmdiKDAgMCAwIC8gMC41KSwgMCAwIDAgMXB4IHJnYigyNTUgMjU1IDI1NSAvIDAuMDUpIjsKICAgICAgdGVybWluYWwuc3R5bGUubWF4V2lkdGggPSBgY2FsYygke21haW5jb250YWluZXIuY2xpZW50V2lkdGh9cHggLTI0MHB4KWA7CiAgICAgIHRlcm1pbmFsLnN0eWxlLm1heEhlaWdodCA9IGBjYWxjKCR7bWFpbmNvbnRhaW5lci5jbGllbnRIZWlnaHR9cHggLSAyNHB4KWA7CiAgICAgIHRlcm1pbmFsLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwgKCkgPT4gdGhpcy5jbG9zZVRlcm1pbmFsKCkpOwogICAgICBhd2FpdCBkb210b29scy5jb252ZW5pZW5jZS5zbWFydGRlbGF5LmRlbGF5Rm9yKDApOwogICAgICB0ZXJtaW5hbC5zdHlsZS5vcGFjaXR5ID0gIjEiOwogICAgICB0ZXJtaW5hbC5zdHlsZS50cmFuc2Zvcm0gPSAidHJhbnNsYXRlWSgwKSBzY2FsZSgxKSI7CiAgICAgIHJldHVybiB0ZXJtaW5hbDsKICAgIH0KICAgIGFzeW5jIGNsb3NlVGVybWluYWwoKSB7CiAgICAgIGNvbnN0IGRvbXRvb2xzID0gYXdhaXQgdGhpcy5kb210b29sc1Byb21pc2U7CiAgICAgIGlmICh0aGlzLmN1cnJlbnRUZXJtaW5hbCkgewogICAgICAgIHRoaXMuY3VycmVudFRlcm1pbmFsLnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgICAgdGhpcy5jdXJyZW50VGVybWluYWwuc3R5bGUudHJhbnNmb3JtID0gInRyYW5zbGF0ZVkoOHB4KSBzY2FsZSgwLjk5KSI7CiAgICAgICAgYXdhaXQgZG9tdG9vbHMuY29udmVuaWVuY2Uuc21hcnRkZWxheS5kZWxheUZvcigyNTApOwogICAgICAgIHRoaXMuY3VycmVudFRlcm1pbmFsLnJlbW92ZSgpOwogICAgICAgIHRoaXMuY3VycmVudFRlcm1pbmFsID0gbnVsbDsKICAgICAgfQogICAgfQogICAgY3VycmVudFZpZXc7CiAgICBhc3luYyBsb2FkVmlldyh2aWV3QXJnKSB7CiAgICAgIGNvbnN0IGFwcGNvbnRlbnQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmFwcGNvbnRlbnQiKTsKICAgICAgY29uc3QgdmlldyA9IG5ldyB2aWV3QXJnLmVsZW1lbnQoKTsKICAgICAgaWYgKHRoaXMuY3VycmVudFZpZXcpIHsKICAgICAgICB0aGlzLmN1cnJlbnRWaWV3LnJlbW92ZSgpOwogICAgICB9CiAgICAgIGFwcGNvbnRlbnQuYXBwZW5kQ2hpbGQodmlldyk7CiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSB2aWV3OwogICAgICB0aGlzLnNlbGVjdGVkVmlldyA9IHZpZXdBcmc7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInZpZXctc2VsZWN0IiwgewogICAgICAgIGRldGFpbDogeyB2aWV3OiB2aWV3QXJnIH0sCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczg4KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzU2ltcGxlQXBwRGFzaDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXNpbXBsZS9kZWVzLXNpbXBsZS1sb2dpbi9kZWVzLXNpbXBsZS1sb2dpbi5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vRnVuYzUyID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgYm9keSB7CiAgICAgIG1hcmdpbjogMDsKICAgICAgcGFkZGluZzogMDsKICAgIH0KICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgdG9wOiAwOwogICAgICBsZWZ0OiAwOwogICAgfQogIDwvc3R5bGU+CiAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgPGRlZXMtc2ltcGxlLWxvZ2luIAogICAgICBuYW1lPSJNeSBBcHBsaWNhdGlvbiIKICAgICAgQGxvZ2luPSR7KGUxMSkgPT4gewogIGNvbnNvbGUubG9nKCJMb2dpbiBldmVudCByZWNlaXZlZDoiLCBlMTEuZGV0YWlsKTsKICBjb25zdCBsb2dpbkRhdGEgPSBlMTEuZGV0YWlsPy5kYXRhIHx8IGUxMS5kZXRhaWw7CiAgaWYgKGxvZ2luRGF0YT8udXNlcm5hbWUgJiYgbG9naW5EYXRhPy5wYXNzd29yZCkgewogICAgYWxlcnQoYExvZ2luIGF0dGVtcHRlZCB3aXRoOgpVc2VybmFtZTogJHtsb2dpbkRhdGEudXNlcm5hbWV9ClBhc3N3b3JkOiAke2xvZ2luRGF0YS5wYXNzd29yZH1gKTsKICB9IGVsc2UgewogICAgY29uc29sZS5lcnJvcigiSW52YWxpZCBsb2dpbiBkYXRhIHN0cnVjdHVyZToiLCBlMTEuZGV0YWlsKTsKICB9Cn19CiAgICA+CiAgICAgIDxkaXYgc3R5bGU9InBhZGRpbmc6IDQwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsiPgogICAgICAgIDxoMT5XZWxjb21lITwvaDE+CiAgICAgICAgPHA+VGhpcyBpcyB0aGUgc2xvdHRlZCBjb250ZW50IHRoYXQgYXBwZWFycyBhZnRlciBsb2dpbi48L3A+CiAgICAgIDwvZGl2PgogICAgPC9kZWVzLXNpbXBsZS1sb2dpbj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1zaW1wbGUvZGVlcy1zaW1wbGUtbG9naW4vZGVlcy1zaW1wbGUtbG9naW4uanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlODggPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczg5ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzU2ltcGxlTG9naW4gPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLXNpbXBsZS1sb2dpbiIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX25hbWVfZGVjb3JhdG9yczsKICBsZXQgX25hbWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9uYW1lX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNTaW1wbGVMb2dpbjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9uYW1lX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTg4KHRoaXMsIG51bGwsIF9uYW1lX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm5hbWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm5hbWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubmFtZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubmFtZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9uYW1lX2luaXRpYWxpemVycywgX25hbWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4OChudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNTaW1wbGVMb2dpbjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgLy8gU1RBVElDCiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jNTI7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiU2ltcGxlIl07CiAgICAjbmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM4OSh0aGlzLCBfbmFtZV9pbml0aWFsaXplcnMsICJBcHBsaWNhdGlvbiIpOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCBuYW1lKCkgewogICAgICByZXR1cm4gdGhpcy4jbmFtZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG5hbWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI25hbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAzLjklKSIsICJoc2woMCAwJSA5OCUpIil9OwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAubG9naW5Db250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSAzLjklKSIpfTsKICAgICAgfQoKICAgICAgLnNsb3RDb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZSwgdHJhbnNmb3JtIDAuMnMgZWFzZTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmxvZ2luIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtYXgtd2lkdGg6IDM2MHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDI0cHg7CiAgICAgIH0KCiAgICAgIC5sb2dpbi1oZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDhweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5oZWFkZXIgewogICAgICAgIGZvbnQtc2l6ZTogMjRweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMjVlbTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5OCUpIil9OwogICAgICB9CgogICAgICAuc3ViaGVhZGVyIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NS4xJSkiLCAiaHNsKDAgMCUgNjMuOSUpIil9OwogICAgICB9CgogICAgICAubG9naW4tY2FyZCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDklKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgfQoKICAgICAgLmxvZ2luLWNhcmQgZGVlcy1mb3JtIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAxNnB4OwogICAgICB9CgogICAgICAubG9naW4tY2FyZCBkZWVzLWlucHV0LXRleHQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAubG9naW4tY2FyZCBkZWVzLWZvcm0tc3VibWl0IHsKICAgICAgICBtYXJnaW4tdG9wOiA4cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0ibG9naW5Db250YWluZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImxvZ2luIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxvZ2luLWhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+U2lnbiBpbjwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJoZWFkZXIiPkVudGVyIHlvdXIgY3JlZGVudGlhbHMgdG8gYWNjZXNzICR7dGhpcy5uYW1lfTwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2dpbi1jYXJkIj4KICAgICAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IGtleT0idXNlcm5hbWUiIGxhYmVsPSJVc2VybmFtZSIgcmVxdWlyZWQ+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCBrZXk9InBhc3N3b3JkIiBsYWJlbD0iUGFzc3dvcmQiIGlzUGFzc3dvcmRCb29sIHJlcXVpcmVkPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgICAgIDxkZWVzLWZvcm0tc3VibWl0PlNpZ24gaW48L2RlZXMtZm9ybS1zdWJtaXQ+CiAgICAgICAgICAgIDwvZGVlcy1mb3JtPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzbG90Q29udGFpbmVyIj4KICAgICAgICA8c2xvdD48L3Nsb3Q+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiZGVlcy1mb3JtIik7CiAgICAgIGlmIChmb3JtKSB7CiAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCJmb3JtRGF0YSIsIChldmVudCkgPT4gewogICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgibG9naW4iLCB7CiAgICAgICAgICAgIGRldGFpbDogZXZlbnQuZGV0YWlsLAogICAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgICAgfSkpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIGFsbG93cyBzd2l0Y2hpbmcgdG8gc2xvdHRlZCBjb250ZW50CiAgICAgKi8KICAgIGFzeW5jIHN3aXRjaFRvU2xvdHRlZENvbnRlbnQoKSB7CiAgICAgIGNvbnN0IGRvbXRvb2xzID0gYXdhaXQgdGhpcy5kb210b29sc1Byb21pc2U7CiAgICAgIGNvbnN0IGxvZ2luRGl2ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5sb2dpbiIpOwogICAgICBjb25zdCBsb2dpbkNvbnRhaW5lckRpdiA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIubG9naW5Db250YWluZXIiKTsKICAgICAgY29uc3Qgc2xvdENvbnRhaW5lckRpdiA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuc2xvdENvbnRhaW5lciIpOwogICAgICBsb2dpbkRpdi5zdHlsZS5vcGFjaXR5ID0gIjAiOwogICAgICBsb2dpbkRpdi5zdHlsZS50cmFuc2Zvcm0gPSAidHJhbnNsYXRlWSgyMHB4KSI7CiAgICAgIGxvZ2luQ29udGFpbmVyRGl2LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAibm9uZSI7CiAgICAgIHNsb3RDb250YWluZXJEaXYuc3R5bGUudHJhbnNmb3JtID0gInRyYW5zbGF0ZVkoMjBweCkiOwogICAgICBhd2FpdCBkb210b29scy5jb252ZW5pZW5jZS5zbWFydGRlbGF5LmRlbGF5Rm9yKDMwMCk7CiAgICAgIHNsb3RDb250YWluZXJEaXYuc3R5bGUub3BhY2l0eSA9ICIxIjsKICAgICAgc2xvdENvbnRhaW5lckRpdi5zdHlsZS50cmFuc2Zvcm0gPSAidHJhbnNsYXRlWSgwcHgpIjsKICAgICAgYXdhaXQgZG9tdG9vbHMuY29udmVuaWVuY2Uuc21hcnRkZWxheS5kZWxheUZvcigzMDApOwogICAgICBzbG90Q29udGFpbmVyRGl2LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAiYWxsIjsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczg5KHRoaXMsIF9uYW1lX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzODkoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNTaW1wbGVMb2dpbjIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXV0aWxpdHkvZGVlcy1pY29uL2luZGV4LmpzCmluaXRfZGVlc19pY29uKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtdXRpbGl0eS9kZWVzLXNlYXJjaGJhci9kZWVzLXNlYXJjaGJhci5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vRnVuYzUzID0gKCkgPT4gewogIGNvbnN0IG9uQ2hhbmdlZCA9IChlMTEpID0+IHsKICAgIGNvbnN0IHdyYXBwZXIgPSBlMTEudGFyZ2V0LmNsb3Nlc3QoIi5kZW1vV3JhcHBlciIpOwogICAgY29uc3QgZWwgPSB3cmFwcGVyPy5xdWVyeVNlbGVjdG9yKCIjY2hhbmdlZCIpOwogICAgaWYgKGVsKQogICAgICBlbC50ZXh0Q29udGVudCA9IGBzZWFyY2gtY2hhbmdlZDogJHtlMTEuZGV0YWlsLnZhbHVlfWA7CiAgfTsKICBjb25zdCBvblN1Ym1pdCA9IChlMTEpID0+IHsKICAgIGNvbnN0IHdyYXBwZXIgPSBlMTEudGFyZ2V0LmNsb3Nlc3QoIi5kZW1vV3JhcHBlciIpOwogICAgY29uc3QgZWwgPSB3cmFwcGVyPy5xdWVyeVNlbGVjdG9yKCIjc3VibWl0dGVkIik7CiAgICBpZiAoZWwpCiAgICAgIGVsLnRleHRDb250ZW50ID0gYHNlYXJjaC1zdWJtaXQ6ICR7ZTExLmRldGFpbC52YWx1ZX1gOwogIH07CiAgcmV0dXJuIGIyYAogICAgPHN0eWxlPgogICAgICAuZGVtb1dyYXBwZXIgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAKICAgICAgICBiYWNrZ3JvdW5kOiAjODg4ODg4OwogICAgICB9CiAgICAgIC5sb2dzIHsKICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgIHdpZHRoOiA2MDBweDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICB9CiAgICAgIC5sb2dzIGRpdiB7CiAgICAgICAgbWFyZ2luOiA0cHggMDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9ImRlbW9XcmFwcGVyIj4KICAgICAgPGRlZXMtc2VhcmNoYmFyCiAgICAgICAgQHNlYXJjaC1jaGFuZ2VkPSR7b25DaGFuZ2VkfQogICAgICAgIEBzZWFyY2gtc3VibWl0PSR7b25TdWJtaXR9CiAgICAgID48L2RlZXMtc2VhcmNoYmFyPgogICAgICA8ZGl2IGNsYXNzPSJsb2dzIj4KICAgICAgICA8ZGl2IGlkPSJjaGFuZ2VkIj5zZWFyY2gtY2hhbmdlZDo8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJzdWJtaXR0ZWQiPnNlYXJjaC1zdWJtaXQ6PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgYDsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC11dGlsaXR5L2RlZXMtc2VhcmNoYmFyL2RlZXMtc2VhcmNoYmFyLmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTg5ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM5MCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1NlYXJjaGJhciA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtc2VhcmNoYmFyIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfZmlsdGVyc19kZWNvcmF0b3JzOwogIGxldCBfZmlsdGVyc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ZpbHRlcnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1NlYXJjaGJhcjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9maWx0ZXJzX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTg5KHRoaXMsIG51bGwsIF9maWx0ZXJzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImZpbHRlcnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZpbHRlcnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZmlsdGVycywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZmlsdGVycyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9maWx0ZXJzX2luaXRpYWxpemVycywgX2ZpbHRlcnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4OShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNTZWFyY2hiYXIyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIC8vIERFTU8KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmM1MzsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJVdGlsaXR5Il07CiAgICAvLyBTVEFUSUMKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgcGFkZGluZzogNDBweDsKICAgICAgICBmb250LWZhbWlseTogRGVlcyBTYW5zOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZWVlZWViIiwgIiMwMDAwMDAiKX07CiAgICAgIH0KCiAgICAgIC5zZWFyY2hib3hDb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtYXJnaW46IGF1dG87CiAgICAgICAgbWF4LXdpZHRoOiA4MDBweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMDAwMDE1IiwgIiNmZmZmZmYxNSIpfTsKICAgICAgICAtLWJveEhlaWdodDogNjBweDsKICAgICAgICBoZWlnaHQ6IHZhcigtLWJveEhlaWdodCk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm94SGVpZ2h0KTsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDE0MHB4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwMTUiLCAiI2ZmZmZmZjIwIil9OwogICAgICB9CgogICAgICBpbnB1dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMDAwMCIsICIjZWVlZWViIil9OwogICAgICAgIHBhZGRpbmctbGVmdDogMjVweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IC04cHg7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5zZWFyY2hCdXR0b24gewogICAgICAgIC0tYnV0dG9uUGFkZGluZzogOHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZWVlZWViIiwgIiMwMDAwMDAiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwIiwgIiNlZWVlZWIiKX07CiAgICAgICAgbGluZS1oZWlnaHQ6IGNhbGModmFyKC0tYm94SGVpZ2h0KSAtICh2YXIoLS1idXR0b25QYWRkaW5nKSAqIDIpKTsKICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3hIZWlnaHQpOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSkgOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDUwJSA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIAogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjFzLCBiYWNrZ3JvdW5kIDAuMXM7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiB2YXIoLS1idXR0b25QYWRkaW5nKTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgLnNlYXJjaEJ1dHRvbjpob3ZlciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoYnJpZ2h0LmJsdWUsIGRhcmsuYmx1ZSl9OwogICAgICB9CgogICAgICAuc2VhcmNoQnV0dG9uOmFjdGl2ZSB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoYnJpZ2h0LmJsdWVBY3RpdmUsIGRhcmsuYmx1ZUFjdGl2ZSl9OwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OCk7CiAgICAgIH0KCiAgICAgIC5maWx0ZXJzIHsKICAgICAgICBtYXJnaW46IGF1dG87CiAgICAgICAgbWF4LXdpZHRoOiA4MDBweDsKICAgICAgfQogICAgYAogICAgXTsKICAgICNmaWx0ZXJzX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczkwKHRoaXMsIF9maWx0ZXJzX2luaXRpYWxpemVycywgW10pOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCBmaWx0ZXJzKCkgewogICAgICByZXR1cm4gdGhpcy4jZmlsdGVyc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGZpbHRlcnModmFsdWUyKSB7CiAgICAgIHRoaXMuI2ZpbHRlcnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHNlYXJjaElucHV0ID0gX19ydW5Jbml0aWFsaXplcnM5MCh0aGlzLCBfZmlsdGVyc19leHRyYUluaXRpYWxpemVycyk7CiAgICBzZWFyY2hCdXR0b247CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgIH0KICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJzZWFyY2hib3hDb250YWluZXIiPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iWW91ciBTa2lsbHMgKGUuZy4gVHlwZVNjcmlwdCwgUnVzdCwgUHJvamVjdG1hbmFnZW1lbnQpIiAvPgogICAgICAgIDxkaXYgY2xhc3M9InNlYXJjaEJ1dHRvbiI+U2VhcmNoIC0+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgICAke3RoaXMuZmlsdGVycy5sZW5ndGggPiAwID8gYjJgCiAgICAgICAgPGRpdiBjbGFzcz0iZmlsdGVycyI+CiAgICAgICAgPGRlZXMtaGVhZGluZyBsZXZlbD0iaHItc21hbGwiPkZpbHRlcnM8L2RlZXMtaGVhZGluZz4KICAgICAgICA8ZGVlcy1pbnB1dC1kcm9wZG93biAubGFiZWw9JHsibG9jYXRpb24ifT48L2RlZXMtaW5wdXQtZHJvcGRvd24+CiAgICAgIDwvZGl2PiAgCiAgICAgIGAgOiBiMmBgfQogICAgYDsKICAgIH0KICAgIC8qKgogICAgICogTGlmZWN5Y2xlOiBhZnRlciBmaXJzdCByZW5kZXIsIHdpcmUgdXAgZXZlbnRzIGZvciBpbnB1dCBhbmQgc3VibWl0IGFjdGlvbnMKICAgICAqLwogICAgZmlyc3RVcGRhdGVkKCkgewogICAgICB0aGlzLnNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgKCkgPT4gewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInNlYXJjaC1jaGFuZ2VkIiwgewogICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLAogICAgICAgICAgZGV0YWlsOiB7IHZhbHVlOiB0aGlzLnNlYXJjaElucHV0LnZhbHVlIH0KICAgICAgICB9KSk7CiAgICAgIH0pOwogICAgICB0aGlzLnNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCAoZTExKSA9PiB7CiAgICAgICAgaWYgKGUxMS5rZXkgPT09ICJFbnRlciIpIHsKICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoU3VibWl0KCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdGhpcy5zZWFyY2hCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB0aGlzLl9kaXNwYXRjaFN1Ym1pdCgpKTsKICAgIH0KICAgIC8qKgogICAgICogRGlzcGF0Y2ggYSBzdWJtaXQgZXZlbnQgd2l0aCB0aGUgY3VycmVudCBzZWFyY2ggdmFsdWUKICAgICAqLwogICAgX2Rpc3BhdGNoU3VibWl0KCkgewogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJzZWFyY2gtc3VibWl0IiwgewogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUsCiAgICAgICAgZGV0YWlsOiB7IHZhbHVlOiB0aGlzLnNlYXJjaElucHV0LnZhbHVlIH0KICAgICAgfSkpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM5MChfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1NlYXJjaGJhcjIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXV0aWxpdHkvZGVlcy10aGVtZS9kZWVzLXRoZW1lLmRlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW9GdW5jNTQgPSAoKSA9PiBiMmAKICA8c3R5bGU+CiAgICAuZGVtby1jb250YWluZXIgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDMycHg7CiAgICAgIHBhZGRpbmc6IDQ4cHg7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjhmOWZhIiwgIiMwYTBhMGEiKX07CiAgICAgIG1pbi1oZWlnaHQ6IDEwMHZoOwogICAgfQoKICAgIC5zZWN0aW9uIHsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzE4MTgxYiIpfTsKICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICBwYWRkaW5nOiAyNHB4OwogICAgfQoKICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICBmb250LXdlaWdodDogNjAwOwogICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgIH0KCiAgICAuc2VjdGlvbi1kZXNjcmlwdGlvbiB7CiAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiNhMWExYWEiKX07CiAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICB9CgogICAgLnRva2VuLWdyaWQgewogICAgICBkaXNwbGF5OiBncmlkOwogICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgyMDBweCwgMWZyKSk7CiAgICAgIGdhcDogMTZweDsKICAgIH0KCiAgICAudG9rZW4taXRlbSB7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjRmNGY1IiwgIiMyNzI3MmEiKX07CiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgcGFkZGluZzogMTZweDsKICAgIH0KCiAgICAudG9rZW4tbmFtZSB7CiAgICAgIGZvbnQtZmFtaWx5OiAnSW50ZWwgT25lIE1vbm8nLCBtb25vc3BhY2U7CiAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiNhMWExYWEiKX07CiAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIH0KCiAgICAudG9rZW4tdmFsdWUgewogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgfQoKICAgIC5zcGFjaW5nLWRlbW8gewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICAgIGdhcDogOHB4OwogICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICB9CgogICAgLnNwYWNpbmctYm94IHsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgfQoKICAgIC5yYWRpdXMtZGVtbyB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGdhcDogMTZweDsKICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgfQoKICAgIC5yYWRpdXMtYm94IHsKICAgICAgd2lkdGg6IDYwcHg7CiAgICAgIGhlaWdodDogNjBweDsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICBmb250LXdlaWdodDogNTAwOwogICAgfQoKICAgIC5zaGFkb3ctZGVtbyB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGdhcDogMjRweDsKICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgfQoKICAgIC5zaGFkb3ctYm94IHsKICAgICAgd2lkdGg6IDEwMHB4OwogICAgICBoZWlnaHQ6IDEwMHB4OwogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMjcyNzJhIil9OwogICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICBmb250LXNpemU6IDEycHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OwogICAgfQoKICAgIC5oZWlnaHQtZGVtbyB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGdhcDogMTZweDsKICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICB9CgogICAgLmhlaWdodC1ib3ggewogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjM2I4MmY2Iil9OwogICAgICB3aWR0aDogMTIwcHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICBmb250LXdlaWdodDogNTAwOwogICAgfQogIDwvc3R5bGU+CiAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgPGRlZXMtdGhlbWU+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlNwYWNpbmcgU2NhbGU8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj4KICAgICAgICAgIENTUyB2YXJpYWJsZXM6IC0tZGVlcy1zcGFjaW5nLXhzIHRocm91Z2ggLS1kZWVzLXNwYWNpbmctM3hsCiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic3BhY2luZy1kZW1vIj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNwYWNpbmctYm94IiBzdHlsZT0id2lkdGg6IHZhcigtLWRlZXMtc3BhY2luZy14cyk7IGhlaWdodDogdmFyKC0tZGVlcy1zcGFjaW5nLXhzKTsiPjwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj54cyAoNHB4KTwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzcGFjaW5nLWJveCIgc3R5bGU9IndpZHRoOiB2YXIoLS1kZWVzLXNwYWNpbmctc20pOyBoZWlnaHQ6IHZhcigtLWRlZXMtc3BhY2luZy1zbSk7Ij48L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+c20gKDhweCk8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3BhY2luZy1ib3giIHN0eWxlPSJ3aWR0aDogdmFyKC0tZGVlcy1zcGFjaW5nLW1kKTsgaGVpZ2h0OiB2YXIoLS1kZWVzLXNwYWNpbmctbWQpOyI+PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLW5hbWUiPm1kICgxMnB4KTwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzcGFjaW5nLWJveCIgc3R5bGU9IndpZHRoOiB2YXIoLS1kZWVzLXNwYWNpbmctbGcpOyBoZWlnaHQ6IHZhcigtLWRlZXMtc3BhY2luZy1sZyk7Ij48L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+bGcgKDE2cHgpPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNwYWNpbmctYm94IiBzdHlsZT0id2lkdGg6IHZhcigtLWRlZXMtc3BhY2luZy14bCk7IGhlaWdodDogdmFyKC0tZGVlcy1zcGFjaW5nLXhsKTsiPjwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj54bCAoMjRweCk8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3BhY2luZy1ib3giIHN0eWxlPSJ3aWR0aDogdmFyKC0tZGVlcy1zcGFjaW5nLTJ4bCk7IGhlaWdodDogdmFyKC0tZGVlcy1zcGFjaW5nLTJ4bCk7Ij48L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+MnhsICgzMnB4KTwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzcGFjaW5nLWJveCIgc3R5bGU9IndpZHRoOiB2YXIoLS1kZWVzLXNwYWNpbmctM3hsKTsgaGVpZ2h0OiB2YXIoLS1kZWVzLXNwYWNpbmctM3hsKTsiPjwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj4zeGwgKDQ4cHgpPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5Cb3JkZXIgUmFkaXVzIFNjYWxlPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+CiAgICAgICAgICBDU1MgdmFyaWFibGVzOiAtLWRlZXMtcmFkaXVzLXhzIHRocm91Z2ggLS1kZWVzLXJhZGl1cy1mdWxsCiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0icmFkaXVzLWRlbW8iPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icmFkaXVzLWJveCIgc3R5bGU9ImJvcmRlci1yYWRpdXM6IHZhcigtLWRlZXMtcmFkaXVzLXhzKTsiPnhzPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLW5hbWUiPjJweDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyYWRpdXMtYm94IiBzdHlsZT0iYm9yZGVyLXJhZGl1czogdmFyKC0tZGVlcy1yYWRpdXMtc20pOyI+c208L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+NHB4PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJhZGl1cy1ib3giIHN0eWxlPSJib3JkZXItcmFkaXVzOiB2YXIoLS1kZWVzLXJhZGl1cy1tZCk7Ij5tZDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj42cHg8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icmFkaXVzLWJveCIgc3R5bGU9ImJvcmRlci1yYWRpdXM6IHZhcigtLWRlZXMtcmFkaXVzLWxnKTsiPmxnPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLW5hbWUiPjhweDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyYWRpdXMtYm94IiBzdHlsZT0iYm9yZGVyLXJhZGl1czogdmFyKC0tZGVlcy1yYWRpdXMteGwpOyI+eGw8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+MTJweDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyYWRpdXMtYm94IiBzdHlsZT0iYm9yZGVyLXJhZGl1czogdmFyKC0tZGVlcy1yYWRpdXMtZnVsbCk7Ij5mdWxsPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLW5hbWUiPjk5OXB4PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5TaGFkb3cgRWxldmF0aW9uIFNjYWxlPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+CiAgICAgICAgICBDU1MgdmFyaWFibGVzOiAtLWRlZXMtc2hhZG93LXhzIHRocm91Z2ggLS1kZWVzLXNoYWRvdy1sZwogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNoYWRvdy1kZW1vIj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvdy1ib3giIHN0eWxlPSJib3gtc2hhZG93OiB2YXIoLS1kZWVzLXNoYWRvdy14cyk7Ij54czwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj5taW5pbWFsPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvdy1ib3giIHN0eWxlPSJib3gtc2hhZG93OiB2YXIoLS1kZWVzLXNoYWRvdy1zbSk7Ij5zbTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj5zdWJ0bGU8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2hhZG93LWJveCIgc3R5bGU9ImJveC1zaGFkb3c6IHZhcigtLWRlZXMtc2hhZG93LW1kKTsiPm1kPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLW5hbWUiPm1lZGl1bTwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaGFkb3ctYm94IiBzdHlsZT0iYm94LXNoYWRvdzogdmFyKC0tZGVlcy1zaGFkb3ctbGcpOyI+bGc8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+cHJvbWluZW50PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5Db250cm9sIEhlaWdodCBTY2FsZTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPgogICAgICAgICAgQ1NTIHZhcmlhYmxlczogLS1kZWVzLWNvbnRyb2wtaGVpZ2h0LXNtIHRocm91Z2ggLS1kZWVzLWNvbnRyb2wtaGVpZ2h0LXhsCiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVpZ2h0LWRlbW8iPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVpZ2h0LWJveCIgc3R5bGU9ImhlaWdodDogdmFyKC0tZGVlcy1jb250cm9sLWhlaWdodC1zbSk7Ij5zbTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj4zMnB4PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlaWdodC1ib3giIHN0eWxlPSJoZWlnaHQ6IHZhcigtLWRlZXMtY29udHJvbC1oZWlnaHQtbWQpOyI+bWQ8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+MzZweDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWlnaHQtYm94IiBzdHlsZT0iaGVpZ2h0OiB2YXIoLS1kZWVzLWNvbnRyb2wtaGVpZ2h0LWxnKTsiPmxnPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLW5hbWUiPjQwcHg8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVpZ2h0LWJveCIgc3R5bGU9ImhlaWdodDogdmFyKC0tZGVlcy1jb250cm9sLWhlaWdodC14bCk7Ij54bDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj40OHB4PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5UcmFuc2l0aW9uIER1cmF0aW9uczwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPgogICAgICAgICAgQ1NTIHZhcmlhYmxlczogLS1kZWVzLXRyYW5zaXRpb24tZmFzdCB0aHJvdWdoIC0tZGVlcy10cmFuc2l0aW9uLXNsb3dlcgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InRva2VuLWdyaWQiPgogICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4taXRlbSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLW5hbWUiPi0tZGVlcy10cmFuc2l0aW9uLWZhc3Q8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tdmFsdWUiPjAuMXM8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4taXRlbSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLW5hbWUiPi0tZGVlcy10cmFuc2l0aW9uLWRlZmF1bHQ8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tdmFsdWUiPjAuMTVzPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLWl0ZW0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj4tLWRlZXMtdHJhbnNpdGlvbi1zbG93PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLXZhbHVlIj4wLjJzPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLWl0ZW0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj4tLWRlZXMtdHJhbnNpdGlvbi1zbG93ZXI8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tdmFsdWUiPjAuM3M8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGVlcy10aGVtZT4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC11dGlsaXR5L2RlZXMtdGhlbWUvZGVlcy10aGVtZS5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU5MCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzOTEgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNUaGVtZSA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtdGhlbWUiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9jdXN0b21TcGFjaW5nX2RlY29yYXRvcnM7CiAgbGV0IF9jdXN0b21TcGFjaW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VzdG9tU3BhY2luZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VzdG9tUmFkaXVzX2RlY29yYXRvcnM7CiAgbGV0IF9jdXN0b21SYWRpdXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXN0b21SYWRpdXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2N1c3RvbVNoYWRvd3NfZGVjb3JhdG9yczsKICBsZXQgX2N1c3RvbVNoYWRvd3NfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXN0b21TaGFkb3dzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXN0b21UcmFuc2l0aW9uc19kZWNvcmF0b3JzOwogIGxldCBfY3VzdG9tVHJhbnNpdGlvbnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXN0b21UcmFuc2l0aW9uc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VzdG9tQ29udHJvbEhlaWdodHNfZGVjb3JhdG9yczsKICBsZXQgX2N1c3RvbUNvbnRyb2xIZWlnaHRzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VzdG9tQ29udHJvbEhlaWdodHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1RoZW1lMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2N1c3RvbVNwYWNpbmdfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF9jdXN0b21SYWRpdXNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF9jdXN0b21TaGFkb3dzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBPYmplY3QgfSldOwogICAgICBfY3VzdG9tVHJhbnNpdGlvbnNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF9jdXN0b21Db250cm9sSGVpZ2h0c19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogT2JqZWN0IH0pXTsKICAgICAgX19lc0RlY29yYXRlOTAodGhpcywgbnVsbCwgX2N1c3RvbVNwYWNpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY3VzdG9tU3BhY2luZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3VzdG9tU3BhY2luZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jdXN0b21TcGFjaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jdXN0b21TcGFjaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2N1c3RvbVNwYWNpbmdfaW5pdGlhbGl6ZXJzLCBfY3VzdG9tU3BhY2luZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTkwKHRoaXMsIG51bGwsIF9jdXN0b21SYWRpdXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY3VzdG9tUmFkaXVzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjdXN0b21SYWRpdXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3VzdG9tUmFkaXVzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jdXN0b21SYWRpdXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY3VzdG9tUmFkaXVzX2luaXRpYWxpemVycywgX2N1c3RvbVJhZGl1c19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTkwKHRoaXMsIG51bGwsIF9jdXN0b21TaGFkb3dzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImN1c3RvbVNoYWRvd3MiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImN1c3RvbVNoYWRvd3MiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3VzdG9tU2hhZG93cywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY3VzdG9tU2hhZG93cyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jdXN0b21TaGFkb3dzX2luaXRpYWxpemVycywgX2N1c3RvbVNoYWRvd3NfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5MCh0aGlzLCBudWxsLCBfY3VzdG9tVHJhbnNpdGlvbnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY3VzdG9tVHJhbnNpdGlvbnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImN1c3RvbVRyYW5zaXRpb25zIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmN1c3RvbVRyYW5zaXRpb25zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jdXN0b21UcmFuc2l0aW9ucyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jdXN0b21UcmFuc2l0aW9uc19pbml0aWFsaXplcnMsIF9jdXN0b21UcmFuc2l0aW9uc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTkwKHRoaXMsIG51bGwsIF9jdXN0b21Db250cm9sSGVpZ2h0c19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjdXN0b21Db250cm9sSGVpZ2h0cyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3VzdG9tQ29udHJvbEhlaWdodHMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3VzdG9tQ29udHJvbEhlaWdodHMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmN1c3RvbUNvbnRyb2xIZWlnaHRzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2N1c3RvbUNvbnRyb2xIZWlnaHRzX2luaXRpYWxpemVycywgX2N1c3RvbUNvbnRyb2xIZWlnaHRzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTAobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzVGhlbWUyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmM1NDsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJVdGlsaXR5Il07CiAgICAjY3VzdG9tU3BhY2luZ19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM5MSh0aGlzLCBfY3VzdG9tU3BhY2luZ19pbml0aWFsaXplcnMsIG51bGwpOwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByb3BlcnRpZXMgZm9yIHRoZW1lIG92ZXJyaWRlcwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIGdldCBjdXN0b21TcGFjaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jY3VzdG9tU3BhY2luZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGN1c3RvbVNwYWNpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2N1c3RvbVNwYWNpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjdXN0b21SYWRpdXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczkxKHRoaXMsIF9jdXN0b21TcGFjaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5MSh0aGlzLCBfY3VzdG9tUmFkaXVzX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IGN1c3RvbVJhZGl1cygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2N1c3RvbVJhZGl1c19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGN1c3RvbVJhZGl1cyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY3VzdG9tUmFkaXVzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY3VzdG9tU2hhZG93c19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTEodGhpcywgX2N1c3RvbVJhZGl1c19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTEodGhpcywgX2N1c3RvbVNoYWRvd3NfaW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICBnZXQgY3VzdG9tU2hhZG93cygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2N1c3RvbVNoYWRvd3NfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjdXN0b21TaGFkb3dzKHZhbHVlMikgewogICAgICB0aGlzLiNjdXN0b21TaGFkb3dzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY3VzdG9tVHJhbnNpdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczkxKHRoaXMsIF9jdXN0b21TaGFkb3dzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5MSh0aGlzLCBfY3VzdG9tVHJhbnNpdGlvbnNfaW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICBnZXQgY3VzdG9tVHJhbnNpdGlvbnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjdXN0b21UcmFuc2l0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGN1c3RvbVRyYW5zaXRpb25zKHZhbHVlMikgewogICAgICB0aGlzLiNjdXN0b21UcmFuc2l0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2N1c3RvbUNvbnRyb2xIZWlnaHRzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5MSh0aGlzLCBfY3VzdG9tVHJhbnNpdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczkxKHRoaXMsIF9jdXN0b21Db250cm9sSGVpZ2h0c19pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIGdldCBjdXN0b21Db250cm9sSGVpZ2h0cygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2N1c3RvbUNvbnRyb2xIZWlnaHRzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY3VzdG9tQ29udHJvbEhlaWdodHModmFsdWUyKSB7CiAgICAgIHRoaXMuI2N1c3RvbUNvbnRyb2xIZWlnaHRzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gU3R5bGVzCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBjb250ZW50czsKICAgICAgfQogICAgYAogICAgXTsKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBSZW5kZXIKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPHN0eWxlPgogICAgICAgICR7dGhpcy5nZW5lcmF0ZUN1c3RvbVN0eWxlcygpfQogICAgICA8L3N0eWxlPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICBgOwogICAgfQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByaXZhdGUgTWV0aG9kcwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIGdlbmVyYXRlQ3VzdG9tU3R5bGVzKCkgewogICAgICBjb25zdCBzdHlsZXMzID0gWyI6aG9zdCB7Il07CiAgICAgIGlmICh0aGlzLmN1c3RvbVNwYWNpbmcpIHsKICAgICAgICBmb3IgKGNvbnN0IFtrZXkyLCB2YWx1ZTJdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY3VzdG9tU3BhY2luZykpIHsKICAgICAgICAgIGlmICh2YWx1ZTIpIHsKICAgICAgICAgICAgc3R5bGVzMy5wdXNoKGAgIC0tZGVlcy1zcGFjaW5nLSR7a2V5Mn06ICR7dmFsdWUyfTtgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRoaXMuY3VzdG9tUmFkaXVzKSB7CiAgICAgICAgZm9yIChjb25zdCBba2V5MiwgdmFsdWUyXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmN1c3RvbVJhZGl1cykpIHsKICAgICAgICAgIGlmICh2YWx1ZTIpIHsKICAgICAgICAgICAgc3R5bGVzMy5wdXNoKGAgIC0tZGVlcy1yYWRpdXMtJHtrZXkyfTogJHt2YWx1ZTJ9O2ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodGhpcy5jdXN0b21TaGFkb3dzKSB7CiAgICAgICAgZm9yIChjb25zdCBba2V5MiwgdmFsdWUyXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmN1c3RvbVNoYWRvd3MpKSB7CiAgICAgICAgICBpZiAodmFsdWUyKSB7CiAgICAgICAgICAgIHN0eWxlczMucHVzaChgICAtLWRlZXMtc2hhZG93LSR7a2V5Mn06ICR7dmFsdWUyfTtgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRoaXMuY3VzdG9tVHJhbnNpdGlvbnMpIHsKICAgICAgICBmb3IgKGNvbnN0IFtrZXkyLCB2YWx1ZTJdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY3VzdG9tVHJhbnNpdGlvbnMpKSB7CiAgICAgICAgICBpZiAodmFsdWUyKSB7CiAgICAgICAgICAgIGNvbnN0IGNzc0tleSA9IGtleTIgPT09ICJkZWZhdWx0IiA/ICJkZWZhdWx0IiA6IGtleTI7CiAgICAgICAgICAgIHN0eWxlczMucHVzaChgICAtLWRlZXMtdHJhbnNpdGlvbi0ke2Nzc0tleX06ICR7dmFsdWUyfTtgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRoaXMuY3VzdG9tQ29udHJvbEhlaWdodHMpIHsKICAgICAgICBmb3IgKGNvbnN0IFtrZXkyLCB2YWx1ZTJdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY3VzdG9tQ29udHJvbEhlaWdodHMpKSB7CiAgICAgICAgICBpZiAodmFsdWUyKSB7CiAgICAgICAgICAgIHN0eWxlczMucHVzaChgICAtLWRlZXMtY29udHJvbC1oZWlnaHQtJHtrZXkyfTogJHt2YWx1ZTJ9O2ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBzdHlsZXMzLnB1c2goIn0iKTsKICAgICAgcmV0dXJuIHN0eWxlczMuam9pbigiXG4iKTsKICAgIH0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQdWJsaWMgQVBJIE1ldGhvZHMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvKioKICAgICAqIFNldCBhIHNwYWNpbmcgdmFsdWUgZHluYW1pY2FsbHkKICAgICAqLwogICAgc2V0U3BhY2luZyhrZXkyLCB2YWx1ZTIpIHsKICAgICAgdGhpcy5jdXN0b21TcGFjaW5nID0geyAuLi50aGlzLmN1c3RvbVNwYWNpbmcsIFtrZXkyXTogdmFsdWUyIH07CiAgICB9CiAgICAvKioKICAgICAqIFNldCBhIHJhZGl1cyB2YWx1ZSBkeW5hbWljYWxseQogICAgICovCiAgICBzZXRSYWRpdXMoa2V5MiwgdmFsdWUyKSB7CiAgICAgIHRoaXMuY3VzdG9tUmFkaXVzID0geyAuLi50aGlzLmN1c3RvbVJhZGl1cywgW2tleTJdOiB2YWx1ZTIgfTsKICAgIH0KICAgIC8qKgogICAgICogU2V0IGEgc2hhZG93IHZhbHVlIGR5bmFtaWNhbGx5CiAgICAgKi8KICAgIHNldFNoYWRvdyhrZXkyLCB2YWx1ZTIpIHsKICAgICAgdGhpcy5jdXN0b21TaGFkb3dzID0geyAuLi50aGlzLmN1c3RvbVNoYWRvd3MsIFtrZXkyXTogdmFsdWUyIH07CiAgICB9CiAgICAvKioKICAgICAqIFNldCBhIHRyYW5zaXRpb24gdmFsdWUgZHluYW1pY2FsbHkKICAgICAqLwogICAgc2V0VHJhbnNpdGlvbihrZXkyLCB2YWx1ZTIpIHsKICAgICAgdGhpcy5jdXN0b21UcmFuc2l0aW9ucyA9IHsgLi4udGhpcy5jdXN0b21UcmFuc2l0aW9ucywgW2tleTJdOiB2YWx1ZTIgfTsKICAgIH0KICAgIC8qKgogICAgICogU2V0IGEgY29udHJvbCBoZWlnaHQgdmFsdWUgZHluYW1pY2FsbHkKICAgICAqLwogICAgc2V0Q29udHJvbEhlaWdodChrZXkyLCB2YWx1ZTIpIHsKICAgICAgdGhpcy5jdXN0b21Db250cm9sSGVpZ2h0cyA9IHsgLi4udGhpcy5jdXN0b21Db250cm9sSGVpZ2h0cywgW2tleTJdOiB2YWx1ZTIgfTsKICAgIH0KICAgIC8qKgogICAgICogR2V0IHRoZSBjdXJyZW50IHRoZW1lIGNvbmZpZ3VyYXRpb24gKGRlZmF1bHRzICsgb3ZlcnJpZGVzKQogICAgICovCiAgICBnZXRUaGVtZSgpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBjb2xvcnM6IHRoZW1lRGVmYXVsdHMuY29sb3JzLAogICAgICAgIHNwYWNpbmc6IHsgLi4udGhlbWVEZWZhdWx0cy5zcGFjaW5nLCAuLi50aGlzLmN1c3RvbVNwYWNpbmcgfSwKICAgICAgICByYWRpdXM6IHsgLi4udGhlbWVEZWZhdWx0cy5yYWRpdXMsIC4uLnRoaXMuY3VzdG9tUmFkaXVzIH0sCiAgICAgICAgc2hhZG93czogeyAuLi50aGVtZURlZmF1bHRzLnNoYWRvd3MsIC4uLnRoaXMuY3VzdG9tU2hhZG93cyB9LAogICAgICAgIHRyYW5zaXRpb25zOiB7IC4uLnRoZW1lRGVmYXVsdHMudHJhbnNpdGlvbnMsIC4uLnRoaXMuY3VzdG9tVHJhbnNpdGlvbnMgfSwKICAgICAgICBjb250cm9sSGVpZ2h0czogeyAuLi50aGVtZURlZmF1bHRzLmNvbnRyb2xIZWlnaHRzLCAuLi50aGlzLmN1c3RvbUNvbnRyb2xIZWlnaHRzIH0KICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogUmVzZXQgYWxsIGN1c3RvbSBvdmVycmlkZXMgdG8gZGVmYXVsdHMKICAgICAqLwogICAgcmVzZXRUb0RlZmF1bHRzKCkgewogICAgICB0aGlzLmN1c3RvbVNwYWNpbmcgPSBudWxsOwogICAgICB0aGlzLmN1c3RvbVJhZGl1cyA9IG51bGw7CiAgICAgIHRoaXMuY3VzdG9tU2hhZG93cyA9IG51bGw7CiAgICAgIHRoaXMuY3VzdG9tVHJhbnNpdGlvbnMgPSBudWxsOwogICAgICB0aGlzLmN1c3RvbUNvbnRyb2xIZWlnaHRzID0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQXBwbHkgYSBjb21wbGV0ZSB0aGVtZSBvYmplY3QKICAgICAqLwogICAgYXBwbHlUaGVtZSh0aGVtZSkgewogICAgICBpZiAodGhlbWUuc3BhY2luZykKICAgICAgICB0aGlzLmN1c3RvbVNwYWNpbmcgPSB0aGVtZS5zcGFjaW5nOwogICAgICBpZiAodGhlbWUucmFkaXVzKQogICAgICAgIHRoaXMuY3VzdG9tUmFkaXVzID0gdGhlbWUucmFkaXVzOwogICAgICBpZiAodGhlbWUuc2hhZG93cykKICAgICAgICB0aGlzLmN1c3RvbVNoYWRvd3MgPSB0aGVtZS5zaGFkb3dzOwogICAgICBpZiAodGhlbWUudHJhbnNpdGlvbnMpCiAgICAgICAgdGhpcy5jdXN0b21UcmFuc2l0aW9ucyA9IHRoZW1lLnRyYW5zaXRpb25zOwogICAgICBpZiAodGhlbWUuY29udHJvbEhlaWdodHMpCiAgICAgICAgdGhpcy5jdXN0b21Db250cm9sSGVpZ2h0cyA9IHRoZW1lLmNvbnRyb2xIZWlnaHRzOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzOTEodGhpcywgX2N1c3RvbUNvbnRyb2xIZWlnaHRzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzOTEoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNUaGVtZTIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXV0aWxpdHkvZGVlcy11cGRhdGVyL2RlZXMtdXBkYXRlci5kZW1vLmpzCmluaXRfZGlzdF90czI2KCk7CnZhciBkZW1vRnVuYzU1ID0gYXN5bmMgKCkgPT4gewogIGNvbnN0IHVwZGF0ZXIgPSBhd2FpdCBEZWVzVXBkYXRlci5jcmVhdGVBbmRTaG93KCk7CiAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7CiAgICBhd2FpdCB1cGRhdGVyLmRlc3Ryb3koKTsKICB9LCAxZTQpOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXV0aWxpdHkvZGVlcy11cGRhdGVyL2RlZXMtdXBkYXRlci5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2Rpc3RfdHMyNigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU5MSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzOTIgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNVcGRhdGVyID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy11cGRhdGVyIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfY3VycmVudFZlcnNpb25fZGVjb3JhdG9yczsKICBsZXQgX2N1cnJlbnRWZXJzaW9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VycmVudFZlcnNpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3VwZGF0ZWRWZXJzaW9uX2RlY29yYXRvcnM7CiAgbGV0IF91cGRhdGVkVmVyc2lvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3VwZGF0ZWRWZXJzaW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNVcGRhdGVyMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2N1cnJlbnRWZXJzaW9uX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IFN0cmluZwogICAgICB9KV07CiAgICAgIF91cGRhdGVkVmVyc2lvbl9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBTdHJpbmcKICAgICAgfSldOwogICAgICBfX2VzRGVjb3JhdGU5MSh0aGlzLCBudWxsLCBfY3VycmVudFZlcnNpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY3VycmVudFZlcnNpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImN1cnJlbnRWZXJzaW9uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmN1cnJlbnRWZXJzaW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jdXJyZW50VmVyc2lvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jdXJyZW50VmVyc2lvbl9pbml0aWFsaXplcnMsIF9jdXJyZW50VmVyc2lvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTkxKHRoaXMsIG51bGwsIF91cGRhdGVkVmVyc2lvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ1cGRhdGVkVmVyc2lvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidXBkYXRlZFZlcnNpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudXBkYXRlZFZlcnNpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnVwZGF0ZWRWZXJzaW9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3VwZGF0ZWRWZXJzaW9uX2luaXRpYWxpemVycywgX3VwZGF0ZWRWZXJzaW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTEobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzVXBkYXRlcjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzU1OwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIlV0aWxpdHkiXTsKICAgIHN0YXRpYyBhc3luYyBjcmVhdGVBbmRTaG93KCkgewogICAgICBjb25zdCB1cGRhdGVyID0gbmV3IERlZXNVcGRhdGVyMigpOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHVwZGF0ZXIpOwogICAgICByZXR1cm4gdXBkYXRlcjsKICAgIH0KICAgICNjdXJyZW50VmVyc2lvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM5Mih0aGlzLCBfY3VycmVudFZlcnNpb25faW5pdGlhbGl6ZXJzLCB2b2lkIDApOwogICAgZ2V0IGN1cnJlbnRWZXJzaW9uKCkgewogICAgICByZXR1cm4gdGhpcy4jY3VycmVudFZlcnNpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjdXJyZW50VmVyc2lvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jY3VycmVudFZlcnNpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN1cGRhdGVkVmVyc2lvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTIodGhpcywgX2N1cnJlbnRWZXJzaW9uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5Mih0aGlzLCBfdXBkYXRlZFZlcnNpb25faW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCB1cGRhdGVkVmVyc2lvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3VwZGF0ZWRWZXJzaW9uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdXBkYXRlZFZlcnNpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI3VwZGF0ZWRWZXJzaW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnM5Mih0aGlzLCBfdXBkYXRlZFZlcnNpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBkaXN0X3RzX2V4cG9ydHMyNS5lbGVtZW50QmFzaWMuc2V0dXAoKTsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICAubW9kYWxDb250YWluZXIgewogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZWVlZWViIiwgIiMyMjIiKX07CiAgICAgICAgbWF4LXdpZHRoOiA4MDBweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZWVlZWViIiwgIiMzMzMiKX07CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nQ29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgcGFkZGluZzogNDBweCA0MHB4OwogICAgICB9CgogICAgICBoMSB7CiAgICAgICAgbWFyZ2luOiBub25lOwogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzMzMiLCAiI2ZmZiIpfTsKICAgICAgICBtYXJnaW4tbGVmdDogMjBweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CgogICAgICAuYnV0dG9uQ29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNTAlIDUwJTsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGVlcy13aW5kb3dsYXllcgogICAgICAgIEBjbGlja2VkPSIke3RoaXMud2luZG93TGF5ZXJDbGlja2VkfSIKICAgICAgICAub3B0aW9ucz0ke3sKICAgICAgICBibHVyOiB0cnVlCiAgICAgIH19CiAgICAgID4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbENvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nQ29udGFpbmVyIj4KICAgICAgICAgICAgPGRlZXMtc3Bpbm5lciAuc2l6ZT0kezYwfT48L2RlZXMtc3Bpbm5lcj4KICAgICAgICAgICAgPGgxPlVwZGF0aW5nIHRoZSBhcHBsaWNhdGlvbi4uLjwvaDE+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzIj4KICAgICAgICAgICAgPGRlZXMtcHJvZ3Jlc3NiYXIgLnByb2dyZXNzPSR7MC41fT48L2RlZXMtcHJvZ3Jlc3NiYXI+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbkNvbnRhaW5lciI+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj5Nb3JlIGluZm88L2RlZXMtYnV0dG9uPgogICAgICAgICAgICA8ZGVlcy1idXR0b24+Q2hhbmdlbG9nPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PiA8L2RlZXMtd2luZG93bGF5ZXIKICAgICAgPj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBkZXN0cm95KCkgewogICAgICB0aGlzLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcyk7CiAgICB9CiAgICB3aW5kb3dMYXllckNsaWNrZWQoKSB7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczkyKF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzVXBkYXRlcjIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXdvcmtzcGFjZS9kZWVzLXdvcmtzcGFjZS1maWxldHJlZS9kZWVzLXdvcmtzcGFjZS1maWxldHJlZS5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2Rpc3RfdHMyNSgpOwppbml0X3RoZW1lKCk7CmluaXRfZGVlc19pY29uKCk7CnZhciBfX2VzRGVjb3JhdGU5MiA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzOTMgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNXb3Jrc3BhY2VGaWxldHJlZSA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtd29ya3NwYWNlLWZpbGV0cmVlIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfZXhlY3V0aW9uRW52aXJvbm1lbnRfZGVjb3JhdG9yczsKICBsZXQgX2V4ZWN1dGlvbkVudmlyb25tZW50X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZXhlY3V0aW9uRW52aXJvbm1lbnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Jvb3RQYXRoX2RlY29yYXRvcnM7CiAgbGV0IF9yb290UGF0aF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Jvb3RQYXRoX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZFBhdGhfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkUGF0aF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkUGF0aF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdHJlZURhdGFfZGVjb3JhdG9yczsKICBsZXQgX3RyZWVEYXRhX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdHJlZURhdGFfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzTG9hZGluZ19kZWNvcmF0b3JzOwogIGxldCBfaXNMb2FkaW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNMb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lcnJvck1lc3NhZ2VfZGVjb3JhdG9yczsKICBsZXQgX2Vycm9yTWVzc2FnZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Vycm9yTWVzc2FnZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzV29ya3NwYWNlRmlsZXRyZWUyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfZXhlY3V0aW9uRW52aXJvbm1lbnRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF9yb290UGF0aF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3NlbGVjdGVkUGF0aF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3RyZWVEYXRhX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pc0xvYWRpbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2Vycm9yTWVzc2FnZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGU5Mih0aGlzLCBudWxsLCBfZXhlY3V0aW9uRW52aXJvbm1lbnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZXhlY3V0aW9uRW52aXJvbm1lbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImV4ZWN1dGlvbkVudmlyb25tZW50IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmV4ZWN1dGlvbkVudmlyb25tZW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5leGVjdXRpb25FbnZpcm9ubWVudCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9leGVjdXRpb25FbnZpcm9ubWVudF9pbml0aWFsaXplcnMsIF9leGVjdXRpb25FbnZpcm9ubWVudF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTkyKHRoaXMsIG51bGwsIF9yb290UGF0aF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJyb290UGF0aCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicm9vdFBhdGgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucm9vdFBhdGgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnJvb3RQYXRoID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Jvb3RQYXRoX2luaXRpYWxpemVycywgX3Jvb3RQYXRoX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTIodGhpcywgbnVsbCwgX3NlbGVjdGVkUGF0aF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWxlY3RlZFBhdGgiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlbGVjdGVkUGF0aCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWxlY3RlZFBhdGgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlbGVjdGVkUGF0aCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWxlY3RlZFBhdGhfaW5pdGlhbGl6ZXJzLCBfc2VsZWN0ZWRQYXRoX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTIodGhpcywgbnVsbCwgX3RyZWVEYXRhX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRyZWVEYXRhIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0cmVlRGF0YSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50cmVlRGF0YSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudHJlZURhdGEgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdHJlZURhdGFfaW5pdGlhbGl6ZXJzLCBfdHJlZURhdGFfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5Mih0aGlzLCBudWxsLCBfaXNMb2FkaW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzTG9hZGluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNMb2FkaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzTG9hZGluZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNMb2FkaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzTG9hZGluZ19pbml0aWFsaXplcnMsIF9pc0xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5Mih0aGlzLCBudWxsLCBfZXJyb3JNZXNzYWdlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImVycm9yTWVzc2FnZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZXJyb3JNZXNzYWdlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmVycm9yTWVzc2FnZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZXJyb3JNZXNzYWdlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Vycm9yTWVzc2FnZV9pbml0aWFsaXplcnMsIF9lcnJvck1lc3NhZ2VfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5MihudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNXb3Jrc3BhY2VGaWxldHJlZTIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSAoKSA9PiBiMmAKICAgIDxkaXYgc3R5bGU9IndpZHRoOiAzMDBweDsgaGVpZ2h0OiA0MDBweDsgcG9zaXRpb246IHJlbGF0aXZlOyI+CiAgICAgIDxkZWVzLXdvcmtzcGFjZS1maWxldHJlZT48L2RlZXMtd29ya3NwYWNlLWZpbGV0cmVlPgogICAgPC9kaXY+CiAgYDsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJXb3Jrc3BhY2UiXTsKICAgICNleGVjdXRpb25FbnZpcm9ubWVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM5Myh0aGlzLCBfZXhlY3V0aW9uRW52aXJvbm1lbnRfaW5pdGlhbGl6ZXJzLCBudWxsKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgZXhlY3V0aW9uRW52aXJvbm1lbnQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNleGVjdXRpb25FbnZpcm9ubWVudF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGV4ZWN1dGlvbkVudmlyb25tZW50KHZhbHVlMikgewogICAgICB0aGlzLiNleGVjdXRpb25FbnZpcm9ubWVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Jvb3RQYXRoX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5Myh0aGlzLCBfZXhlY3V0aW9uRW52aXJvbm1lbnRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczkzKHRoaXMsIF9yb290UGF0aF9pbml0aWFsaXplcnMsICIvIikpOwogICAgZ2V0IHJvb3RQYXRoKCkgewogICAgICByZXR1cm4gdGhpcy4jcm9vdFBhdGhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCByb290UGF0aCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcm9vdFBhdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWxlY3RlZFBhdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczkzKHRoaXMsIF9yb290UGF0aF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTModGhpcywgX3NlbGVjdGVkUGF0aF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgc2VsZWN0ZWRQYXRoKCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRQYXRoX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0ZWRQYXRoKHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3RlZFBhdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN0cmVlRGF0YV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTModGhpcywgX3NlbGVjdGVkUGF0aF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTModGhpcywgX3RyZWVEYXRhX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCB0cmVlRGF0YSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RyZWVEYXRhX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdHJlZURhdGEodmFsdWUyKSB7CiAgICAgIHRoaXMuI3RyZWVEYXRhX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNMb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5Myh0aGlzLCBfdHJlZURhdGFfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczkzKHRoaXMsIF9pc0xvYWRpbmdfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGlzTG9hZGluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzTG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzTG9hZGluZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXNMb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZXJyb3JNZXNzYWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5Myh0aGlzLCBfaXNMb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5Myh0aGlzLCBfZXJyb3JNZXNzYWdlX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBlcnJvck1lc3NhZ2UoKSB7CiAgICAgIHJldHVybiB0aGlzLiNlcnJvck1lc3NhZ2VfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBlcnJvck1lc3NhZ2UodmFsdWUyKSB7CiAgICAgIHRoaXMuI2Vycm9yTWVzc2FnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgZXhwYW5kZWRQYXRocyA9IChfX3J1bkluaXRpYWxpemVyczkzKHRoaXMsIF9lcnJvck1lc3NhZ2VfZXh0cmFJbml0aWFsaXplcnMpLCAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKTsKICAgIGxvYWRUcmVlU3RhcnRlZCA9IGZhbHNlOwogICAgLy8gQ2xpcGJvYXJkIHN0YXRlIGZvciBjb3B5L3Bhc3RlIG9wZXJhdGlvbnMKICAgIGNsaXBib2FyZFBhdGggPSBudWxsOwogICAgY2xpcGJvYXJkT3BlcmF0aW9uID0gbnVsbDsKICAgIC8vIEZpbGUgd2F0Y2hlciBmb3IgYXV0by1yZWZyZXNoCiAgICBmaWxlV2F0Y2hlciA9IG51bGw7CiAgICByZWZyZXNoRGVib3VuY2VUaW1lb3V0ID0gbnVsbDsKICAgIGxhc3RFeGVjdXRpb25FbnZpcm9ubWVudCA9IG51bGw7CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk4JSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgIC50cmVlLWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZzogOHB4IDA7CiAgICAgIH0KCiAgICAgIC50cmVlLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgbWFyZ2luOiAxcHggNHB4OwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xcyBlYXNlOwogICAgICB9CgogICAgICAudHJlZS1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTMlKSIsICJoc2woMCAwJSAxNCUpIil9OwogICAgICB9CgogICAgICAudHJlZS1pdGVtLnNlbGVjdGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCAxMDAlIDk1JSkiLCAiaHNsKDIxMCA1MCUgMjAlKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgMTAwJSA0MCUpIiwgImhzbCgyMTAgMTAwJSA3MCUpIil9OwogICAgICB9CgogICAgICAudHJlZS1pdGVtLnNlbGVjdGVkOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCAxMDAlIDkyJSkiLCAiaHNsKDIxMCA1MCUgMjUlKSIpfTsKICAgICAgfQoKICAgICAgLmluZGVudCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAuZXhwYW5kLWljb24gewogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA1MCUpIiwgImhzbCgwIDAlIDYwJSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5leHBhbmQtaWNvbi5leHBhbmRlZCB7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOwogICAgICB9CgogICAgICAuZXhwYW5kLWljb24uaGlkZGVuIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5maWxlLWljb24gewogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDZweDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5maWxlLWljb24gZGVlcy1pY29uIHsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5maWxlLWljb24uZm9sZGVyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCg0NSA4MCUgNDUlKSIsICJoc2woNDUgNzAlIDU1JSkiKX07CiAgICAgIH0KCiAgICAgIC5maWxlLWljb24uZmlsZSB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA1MCUpIiwgImhzbCgwIDAlIDYwJSkiKX07CiAgICAgIH0KCiAgICAgIC5maWxlLWljb24udHlwZXNjcmlwdCB7CiAgICAgICAgY29sb3I6IGhzbCgyMTEgNjAlIDQ4JSk7CiAgICAgIH0KCiAgICAgIC5maWxlLWljb24uamF2YXNjcmlwdCB7CiAgICAgICAgY29sb3I6IGhzbCg1MyA5MyUgNTQlKTsKICAgICAgfQoKICAgICAgLmZpbGUtaWNvbi5qc29uIHsKICAgICAgICBjb2xvcjogaHNsKDQ1IDgwJSA1MCUpOwogICAgICB9CgogICAgICAuZmlsZS1pY29uLmh0bWwgewogICAgICAgIGNvbG9yOiBoc2woMTQgNzclIDUyJSk7CiAgICAgIH0KCiAgICAgIC5maWxlLWljb24uY3NzIHsKICAgICAgICBjb2xvcjogaHNsKDIyOCA3NyUgNTklKTsKICAgICAgfQoKICAgICAgLmZpbGUtaWNvbi5tYXJrZG93biB7CiAgICAgICAgY29sb3I6IGhzbCgwIDAlIDUwJSk7CiAgICAgIH0KCiAgICAgIC5maWxlLW5hbWUgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMjAlKSIsICJoc2woMCAwJSA4NSUpIil9OwogICAgICB9CgogICAgICAubG9hZGluZyB7CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA1MCUpIiwgImhzbCgwIDAlIDYwJSkiKX07CiAgICAgIH0KCiAgICAgIC5lcnJvciB7CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgY29sb3I6IGhzbCgwIDcwJSA1MCUpOwogICAgICB9CgogICAgICAuZW1wdHkgewogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNTAlKSIsICJoc2woMCAwJSA2MCUpIil9OwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQoKICAgICAgLmZpbGV0cmVlLXRvb2xiYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgaGVpZ2h0OiAzNnB4OwogICAgICAgIHBhZGRpbmc6IDAgMTJweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg1JSkiLCAiaHNsKDAgMCUgMTUlKSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTYlKSIsICJoc2woMCAwJSA4JSkiKX07CiAgICAgICAgcG9zaXRpb246IHN0aWNreTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDAlKSIsICJoc2woMCAwJSA2MCUpIil9OwogICAgICB9CgogICAgICAudG9vbGJhci1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogNHB4OwogICAgICB9CgogICAgICAudG9vbGJhci1idXR0b24gewogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIG9wYWNpdHk6IDAuNzsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzLCBiYWNrZ3JvdW5kIDAuMTVzOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDMwJSkiLCAiaHNsKDAgMCUgNzAlKSIpfTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItYnV0dG9uOmhvdmVyIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAwJSAvIDAuMDgpIiwgImhzbCgwIDAlIDEwMCUgLyAwLjEpIil9OwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHkiPgogICAgICAgICAgTm8gZXhlY3V0aW9uIGVudmlyb25tZW50IHByb3ZpZGVkLgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgICB9CiAgICAgIGlmICh0aGlzLmlzTG9hZGluZykgewogICAgICAgIHJldHVybiBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJsb2FkaW5nIj4KICAgICAgICAgIExvYWRpbmcgZmlsZXMuLi4KICAgICAgICA8L2Rpdj4KICAgICAgYDsKICAgICAgfQogICAgICBpZiAodGhpcy5lcnJvck1lc3NhZ2UpIHsKICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgPGRpdiBjbGFzcz0iZXJyb3IiPgogICAgICAgICAgJHt0aGlzLmVycm9yTWVzc2FnZX0KICAgICAgICA8L2Rpdj4KICAgICAgYDsKICAgICAgfQogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImZpbGV0cmVlLXRvb2xiYXIiPgogICAgICAgIDxzcGFuIGNsYXNzPSJ0b29sYmFyLXRpdGxlIj5FeHBsb3Jlcjwvc3Bhbj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sYmFyLWFjdGlvbnMiPgogICAgICAgICAgPGRpdiBjbGFzcz0idG9vbGJhci1idXR0b24iIEBjbGljaz0keygpID0+IHRoaXMuY3JlYXRlTmV3RmlsZSgiLyIpfSB0aXRsZT0iTmV3IEZpbGUiPgogICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTpmaWxlUGx1cyJ9IGljb25TaXplPSIxNiI+PC9kZWVzLWljb24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItYnV0dG9uIiBAY2xpY2s9JHsoKSA9PiB0aGlzLmNyZWF0ZU5ld0ZvbGRlcigiLyIpfSB0aXRsZT0iTmV3IEZvbGRlciI+CiAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOmZvbGRlclBsdXMifSBpY29uU2l6ZT0iMTYiPjwvZGVlcy1pY29uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICAke3RoaXMudHJlZURhdGEubGVuZ3RoID09PSAwID8gYjJgPGRpdiBjbGFzcz0iZW1wdHkiPk5vIGZpbGVzIGZvdW5kLjwvZGl2PmAgOiBiMmAKICAgICAgICAgICAgPGRpdiBjbGFzcz0idHJlZS1jb250YWluZXIiIEBjb250ZXh0bWVudT0ke3RoaXMuaGFuZGxlRW1wdHlTcGFjZUNvbnRleHRNZW51fT4KICAgICAgICAgICAgICAke3RoaXMucmVuZGVyVHJlZSh0aGlzLnRyZWVEYXRhKX0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgfQogICAgYDsKICAgIH0KICAgIHJlbmRlclRyZWUobm9kZXMpIHsKICAgICAgcmV0dXJuIG5vZGVzLm1hcCgobm9kZTIpID0+IHRoaXMucmVuZGVyTm9kZShub2RlMikpOwogICAgfQogICAgcmVuZGVyTm9kZShub2RlMikgewogICAgICBjb25zdCBpc0RpcmVjdG9yeSA9IG5vZGUyLnR5cGUgPT09ICJkaXJlY3RvcnkiOwogICAgICBjb25zdCBpc0V4cGFuZGVkID0gdGhpcy5leHBhbmRlZFBhdGhzLmhhcyhub2RlMi5wYXRoKTsKICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IG5vZGUyLnBhdGggPT09IHRoaXMuc2VsZWN0ZWRQYXRoOwogICAgICBjb25zdCBpY29uQ2xhc3MgPSB0aGlzLmdldEZpbGVJY29uQ2xhc3Mobm9kZTIpOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYKICAgICAgICBjbGFzcz0idHJlZS1pdGVtICR7aXNTZWxlY3RlZCA/ICJzZWxlY3RlZCIgOiAiIn0iCiAgICAgICAgc3R5bGU9InBhZGRpbmctbGVmdDogJHs4ICsgbm9kZTIubGV2ZWwgKiAxNn1weCIKICAgICAgICBAY2xpY2s9JHsoZTExKSA9PiB0aGlzLmhhbmRsZUl0ZW1DbGljayhlMTEsIG5vZGUyKX0KICAgICAgICBAY29udGV4dG1lbnU9JHsoZTExKSA9PiB0aGlzLmhhbmRsZUNvbnRleHRNZW51KGUxMSwgbm9kZTIpfQogICAgICA+CiAgICAgICAgPHNwYW4gY2xhc3M9ImV4cGFuZC1pY29uICR7aXNFeHBhbmRlZCA/ICJleHBhbmRlZCIgOiAiIn0gJHshaXNEaXJlY3RvcnkgPyAiaGlkZGVuIiA6ICIifSI+CiAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTpjaGV2cm9uUmlnaHQifSBpY29uU2l6ZT0iMTIiPjwvZGVlcy1pY29uPgogICAgICAgIDwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iZmlsZS1pY29uICR7aWNvbkNsYXNzfSI+CiAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7dGhpcy5nZXRGaWxlSWNvbihub2RlMil9IGljb25TaXplPSIxNiI+PC9kZWVzLWljb24+CiAgICAgICAgPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJmaWxlLW5hbWUiPiR7bm9kZTIubmFtZX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICAke2lzRGlyZWN0b3J5ICYmIGlzRXhwYW5kZWQgJiYgbm9kZTIuY2hpbGRyZW4gPyB0aGlzLnJlbmRlclRyZWUobm9kZTIuY2hpbGRyZW4pIDogIiJ9CiAgICBgOwogICAgfQogICAgZ2V0RmlsZUljb24obm9kZTIpIHsKICAgICAgaWYgKG5vZGUyLnR5cGUgPT09ICJkaXJlY3RvcnkiKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRQYXRocy5oYXMobm9kZTIucGF0aCkgPyAibHVjaWRlOmZvbGRlck9wZW4iIDogImx1Y2lkZTpmb2xkZXIiOwogICAgICB9CiAgICAgIGNvbnN0IGV4dCA9IG5vZGUyLm5hbWUuc3BsaXQoIi4iKS5wb3AoKT8udG9Mb3dlckNhc2UoKTsKICAgICAgc3dpdGNoIChleHQpIHsKICAgICAgICBjYXNlICJ0cyI6CiAgICAgICAgY2FzZSAidHN4IjoKICAgICAgICAgIHJldHVybiAibHVjaWRlOmZpbGVDb2RlIjsKICAgICAgICBjYXNlICJqcyI6CiAgICAgICAgY2FzZSAianN4IjoKICAgICAgICAgIHJldHVybiAibHVjaWRlOmZpbGVDb2RlIjsKICAgICAgICBjYXNlICJqc29uIjoKICAgICAgICAgIHJldHVybiAibHVjaWRlOmZpbGVKc29uIjsKICAgICAgICBjYXNlICJodG1sIjoKICAgICAgICAgIHJldHVybiAibHVjaWRlOmZpbGVDb2RlIjsKICAgICAgICBjYXNlICJjc3MiOgogICAgICAgIGNhc2UgInNjc3MiOgogICAgICAgIGNhc2UgImxlc3MiOgogICAgICAgICAgcmV0dXJuICJsdWNpZGU6ZmlsZUNvZGUiOwogICAgICAgIGNhc2UgIm1kIjoKICAgICAgICAgIHJldHVybiAibHVjaWRlOmZpbGVUZXh0IjsKICAgICAgICBjYXNlICJwbmciOgogICAgICAgIGNhc2UgImpwZyI6CiAgICAgICAgY2FzZSAianBlZyI6CiAgICAgICAgY2FzZSAiZ2lmIjoKICAgICAgICBjYXNlICJzdmciOgogICAgICAgICAgcmV0dXJuICJsdWNpZGU6aW1hZ2UiOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gImx1Y2lkZTpmaWxlIjsKICAgICAgfQogICAgfQogICAgZ2V0RmlsZUljb25DbGFzcyhub2RlMikgewogICAgICBpZiAobm9kZTIudHlwZSA9PT0gImRpcmVjdG9yeSIpCiAgICAgICAgcmV0dXJuICJmb2xkZXIiOwogICAgICBjb25zdCBleHQgPSBub2RlMi5uYW1lLnNwbGl0KCIuIikucG9wKCk/LnRvTG93ZXJDYXNlKCk7CiAgICAgIHN3aXRjaCAoZXh0KSB7CiAgICAgICAgY2FzZSAidHMiOgogICAgICAgIGNhc2UgInRzeCI6CiAgICAgICAgICByZXR1cm4gInR5cGVzY3JpcHQiOwogICAgICAgIGNhc2UgImpzIjoKICAgICAgICBjYXNlICJqc3giOgogICAgICAgICAgcmV0dXJuICJqYXZhc2NyaXB0IjsKICAgICAgICBjYXNlICJqc29uIjoKICAgICAgICAgIHJldHVybiAianNvbiI7CiAgICAgICAgY2FzZSAiaHRtbCI6CiAgICAgICAgICByZXR1cm4gImh0bWwiOwogICAgICAgIGNhc2UgImNzcyI6CiAgICAgICAgY2FzZSAic2NzcyI6CiAgICAgICAgY2FzZSAibGVzcyI6CiAgICAgICAgICByZXR1cm4gImNzcyI7CiAgICAgICAgY2FzZSAibWQiOgogICAgICAgICAgcmV0dXJuICJtYXJrZG93biI7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJldHVybiAiZmlsZSI7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGhhbmRsZUl0ZW1DbGljayhlMTEsIG5vZGUyKSB7CiAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgaWYgKG5vZGUyLnR5cGUgPT09ICJkaXJlY3RvcnkiKSB7CiAgICAgICAgYXdhaXQgdGhpcy50b2dnbGVEaXJlY3Rvcnkobm9kZTIpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc2VsZWN0ZWRQYXRoID0gbm9kZTIucGF0aDsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJmaWxlLXNlbGVjdCIsIHsKICAgICAgICAgIGRldGFpbDogeyBwYXRoOiBub2RlMi5wYXRoLCBuYW1lOiBub2RlMi5uYW1lIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIHRvZ2dsZURpcmVjdG9yeShub2RlMikgewogICAgICBpZiAodGhpcy5leHBhbmRlZFBhdGhzLmhhcyhub2RlMi5wYXRoKSkgewogICAgICAgIHRoaXMuZXhwYW5kZWRQYXRocy5kZWxldGUobm9kZTIucGF0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5leHBhbmRlZFBhdGhzLmFkZChub2RlMi5wYXRoKTsKICAgICAgICBpZiAoIW5vZGUyLmNoaWxkcmVuIHx8IG5vZGUyLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRGlyZWN0b3J5Q29udGVudHMobm9kZTIpOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgIH0KICAgIGFzeW5jIGxvYWREaXJlY3RvcnlDb250ZW50cyhub2RlMikgewogICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpCiAgICAgICAgcmV0dXJuOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnJlYWREaXIobm9kZTIucGF0aCk7CiAgICAgICAgbm9kZTIuY2hpbGRyZW4gPSB0aGlzLnNvcnRFbnRyaWVzKGVudHJpZXMpLm1hcCgoZW50cnkpID0+ICh7CiAgICAgICAgICAuLi5lbnRyeSwKICAgICAgICAgIGxldmVsOiBub2RlMi5sZXZlbCArIDEsCiAgICAgICAgICBleHBhbmRlZDogZmFsc2UsCiAgICAgICAgICBjaGlsZHJlbjogZW50cnkudHlwZSA9PT0gImRpcmVjdG9yeSIgPyBbXSA6IHZvaWQgMAogICAgICAgIH0pKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBkaXJlY3RvcnkgJHtub2RlMi5wYXRofTpgLCBlcnJvcik7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGhhbmRsZUNvbnRleHRNZW51KGUxMSwgbm9kZTIpIHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgY29uc3QgbWVudUl0ZW1zID0gW107CiAgICAgIGlmIChub2RlMi50eXBlID09PSAiZGlyZWN0b3J5IikgewogICAgICAgIG1lbnVJdGVtcy5wdXNoKHsKICAgICAgICAgIG5hbWU6ICJOZXcgRmlsZSIsCiAgICAgICAgICBpY29uTmFtZTogImZpbGVQbHVzIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gdGhpcy5jcmVhdGVOZXdGaWxlKG5vZGUyLnBhdGgpCiAgICAgICAgfSwgewogICAgICAgICAgbmFtZTogIk5ldyBGb2xkZXIiLAogICAgICAgICAgaWNvbk5hbWU6ICJmb2xkZXJQbHVzIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gdGhpcy5jcmVhdGVOZXdGb2xkZXIobm9kZTIucGF0aCkKICAgICAgICB9LCB7IGRpdmlkZXI6IHRydWUgfSk7CiAgICAgIH0KICAgICAgbWVudUl0ZW1zLnB1c2goewogICAgICAgIG5hbWU6ICJSZW5hbWUiLAogICAgICAgIGljb25OYW1lOiAicGVuY2lsIiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMucmVuYW1lSXRlbShub2RlMikKICAgICAgfSwgewogICAgICAgIG5hbWU6ICJEdXBsaWNhdGUiLAogICAgICAgIGljb25OYW1lOiAiZmlsZXMiLAogICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gdGhpcy5kdXBsaWNhdGVJdGVtKG5vZGUyKQogICAgICB9LCB7CiAgICAgICAgbmFtZTogIkNvcHkiLAogICAgICAgIGljb25OYW1lOiAiY29weSIsCiAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB0aGlzLmNvcHlJdGVtKG5vZGUyKQogICAgICB9KTsKICAgICAgaWYgKG5vZGUyLnR5cGUgPT09ICJkaXJlY3RvcnkiICYmIHRoaXMuY2xpcGJvYXJkUGF0aCkgewogICAgICAgIG1lbnVJdGVtcy5wdXNoKHsKICAgICAgICAgIG5hbWU6ICJQYXN0ZSIsCiAgICAgICAgICBpY29uTmFtZTogImNsaXBib2FyZCIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMucGFzdGVJdGVtKG5vZGUyLnBhdGgpCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgbWVudUl0ZW1zLnB1c2goeyBkaXZpZGVyOiB0cnVlIH0sIHsKICAgICAgICBuYW1lOiAiRGVsZXRlIiwKICAgICAgICBpY29uTmFtZTogInRyYXNoMiIsCiAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB0aGlzLmRlbGV0ZUl0ZW0obm9kZTIpCiAgICAgIH0pOwogICAgICBhd2FpdCBEZWVzQ29udGV4dG1lbnUub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZTExLCBtZW51SXRlbXMpOwogICAgfQogICAgYXN5bmMgaGFuZGxlRW1wdHlTcGFjZUNvbnRleHRNZW51KGUxMSkgewogICAgICBjb25zdCB0YXJnZXQgPSBlMTEudGFyZ2V0OwogICAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoIi50cmVlLWl0ZW0iKSkKICAgICAgICByZXR1cm47CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIGNvbnN0IG1lbnVJdGVtcyA9IFsKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiTmV3IEZpbGUiLAogICAgICAgICAgaWNvbk5hbWU6ICJmaWxlUGx1cyIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMuY3JlYXRlTmV3RmlsZSgiLyIpCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiTmV3IEZvbGRlciIsCiAgICAgICAgICBpY29uTmFtZTogImZvbGRlclBsdXMiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB0aGlzLmNyZWF0ZU5ld0ZvbGRlcigiLyIpCiAgICAgICAgfQogICAgICBdOwogICAgICBpZiAodGhpcy5jbGlwYm9hcmRQYXRoKSB7CiAgICAgICAgbWVudUl0ZW1zLnB1c2goeyBkaXZpZGVyOiB0cnVlIH0sIHsKICAgICAgICAgIG5hbWU6ICJQYXN0ZSIsCiAgICAgICAgICBpY29uTmFtZTogImNsaXBib2FyZCIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMucGFzdGVJdGVtKCIvIikKICAgICAgICB9KTsKICAgICAgfQogICAgICBhd2FpdCBEZWVzQ29udGV4dG1lbnUub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZTExLCBtZW51SXRlbXMpOwogICAgfQogICAgYXN5bmMgc2hvd0lucHV0TW9kYWwob3B0aW9ucykgewogICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUyKSA9PiB7CiAgICAgICAgY29uc3QgbW9kYWwgPSBhd2FpdCBEZWVzTW9kYWwuY3JlYXRlQW5kU2hvdyh7CiAgICAgICAgICBoZWFkaW5nOiBvcHRpb25zLmhlYWRpbmcsCiAgICAgICAgICB3aWR0aDogInNtYWxsIiwKICAgICAgICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dAogICAgICAgICAgICAubGFiZWw9JHtvcHRpb25zLmxhYmVsfQogICAgICAgICAgICAudmFsdWU9JHtvcHRpb25zLnZhbHVlIHx8ICIifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgIGAsCiAgICAgICAgICBtZW51T3B0aW9uczogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgbmFtZTogIkNhbmNlbCIsCiAgICAgICAgICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWxSZWYpID0+IHsKICAgICAgICAgICAgICAgIGF3YWl0IG1vZGFsUmVmLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgIHJlc29sdmUyKG51bGwpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMuYnV0dG9uTmFtZSB8fCAiQ3JlYXRlIiwKICAgICAgICAgICAgICBhY3Rpb246IGFzeW5jIChtb2RhbFJlZikgPT4gewogICAgICAgICAgICAgICAgY29uc3QgY29udGVudEVsMiA9IG1vZGFsUmVmLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5tb2RhbCAuY29udGVudCIpOwogICAgICAgICAgICAgICAgY29uc3QgaW5wdXRFbGVtZW50ID0gY29udGVudEVsMj8ucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC10ZXh0Iik7CiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dFZhbHVlID0gaW5wdXRFbGVtZW50Py52YWx1ZT8udHJpbSgpIHx8ICIiOwogICAgICAgICAgICAgICAgYXdhaXQgbW9kYWxSZWYuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgcmVzb2x2ZTIoaW5wdXRWYWx1ZSB8fCBudWxsKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIF0KICAgICAgICB9KTsKICAgICAgICBhd2FpdCBtb2RhbC51cGRhdGVDb21wbGV0ZTsKICAgICAgICBjb25zdCBjb250ZW50RWwgPSBtb2RhbC5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIubW9kYWwgLmNvbnRlbnQiKTsKICAgICAgICBpZiAoY29udGVudEVsKSB7CiAgICAgICAgICBjb25zdCBpbnB1dEVsZW1lbnQgPSBjb250ZW50RWwucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC10ZXh0Iik7CiAgICAgICAgICBpZiAoaW5wdXRFbGVtZW50KSB7CiAgICAgICAgICAgIGF3YWl0IGlucHV0RWxlbWVudC51cGRhdGVDb21wbGV0ZTsKICAgICAgICAgICAgaW5wdXRFbGVtZW50LmZvY3VzKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIGFzeW5jIGNyZWF0ZU5ld0ZpbGUocGFyZW50UGF0aCkgewogICAgICBjb25zdCBmaWxlTmFtZSA9IGF3YWl0IHRoaXMuc2hvd0lucHV0TW9kYWwoewogICAgICAgIGhlYWRpbmc6ICJOZXcgRmlsZSIsCiAgICAgICAgbGFiZWw6ICJGaWxlIG5hbWUiCiAgICAgIH0pOwogICAgICBpZiAoIWZpbGVOYW1lIHx8ICF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgbmV3UGF0aCA9IHBhcmVudFBhdGggPT09ICIvIiA/IGAvJHtmaWxlTmFtZX1gIDogYCR7cGFyZW50UGF0aH0vJHtmaWxlTmFtZX1gOwogICAgICB0cnkgewogICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQud3JpdGVGaWxlKG5ld1BhdGgsICIiKTsKICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJmaWxlLWNyZWF0ZWQiLCB7CiAgICAgICAgICBkZXRhaWw6IHsgcGF0aDogbmV3UGF0aCB9LAogICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgfSkpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgZmlsZToiLCBlcnJvcik7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGNyZWF0ZU5ld0ZvbGRlcihwYXJlbnRQYXRoKSB7CiAgICAgIGNvbnN0IGZvbGRlck5hbWUgPSBhd2FpdCB0aGlzLnNob3dJbnB1dE1vZGFsKHsKICAgICAgICBoZWFkaW5nOiAiTmV3IEZvbGRlciIsCiAgICAgICAgbGFiZWw6ICJGb2xkZXIgbmFtZSIKICAgICAgfSk7CiAgICAgIGlmICghZm9sZGVyTmFtZSB8fCAhdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IG5ld1BhdGggPSBwYXJlbnRQYXRoID09PSAiLyIgPyBgLyR7Zm9sZGVyTmFtZX1gIDogYCR7cGFyZW50UGF0aH0vJHtmb2xkZXJOYW1lfWA7CiAgICAgIHRyeSB7CiAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5ta2RpcihuZXdQYXRoKTsKICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJmb2xkZXItY3JlYXRlZCIsIHsKICAgICAgICAgIGRldGFpbDogeyBwYXRoOiBuZXdQYXRoIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBmb2xkZXI6IiwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBkZWxldGVJdGVtKG5vZGUyKSB7CiAgICAgIGlmICghdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGNvbmZpcm0oYERlbGV0ZSAke25vZGUyLm5hbWV9P2ApOwogICAgICBpZiAoIWNvbmZpcm1lZCkKICAgICAgICByZXR1cm47CiAgICAgIHRyeSB7CiAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5ybShub2RlMi5wYXRoLCB7IHJlY3Vyc2l2ZTogbm9kZTIudHlwZSA9PT0gImRpcmVjdG9yeSIgfSk7CiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7CiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaXRlbS1kZWxldGVkIiwgewogICAgICAgICAgZGV0YWlsOiB7IHBhdGg6IG5vZGUyLnBhdGgsIHR5cGU6IG5vZGUyLnR5cGUgfSwKICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgIH0pKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gZGVsZXRlIGl0ZW06IiwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJlbmFtZSBhIGZpbGUgb3IgZm9sZGVyCiAgICAgKi8KICAgIGFzeW5jIHJlbmFtZUl0ZW0obm9kZTIpIHsKICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgbmV3TmFtZSA9IGF3YWl0IHRoaXMuc2hvd0lucHV0TW9kYWwoewogICAgICAgIGhlYWRpbmc6ICJSZW5hbWUiLAogICAgICAgIGxhYmVsOiAiTmV3IG5hbWUiLAogICAgICAgIHZhbHVlOiBub2RlMi5uYW1lLAogICAgICAgIGJ1dHRvbk5hbWU6ICJSZW5hbWUiCiAgICAgIH0pOwogICAgICBpZiAoIW5ld05hbWUgfHwgbmV3TmFtZSA9PT0gbm9kZTIubmFtZSkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBub2RlMi5wYXRoLnN1YnN0cmluZygwLCBub2RlMi5wYXRoLmxhc3RJbmRleE9mKCIvIikpIHx8ICIvIjsKICAgICAgY29uc3QgbmV3UGF0aCA9IHBhcmVudFBhdGggPT09ICIvIiA/IGAvJHtuZXdOYW1lfWAgOiBgJHtwYXJlbnRQYXRofS8ke25ld05hbWV9YDsKICAgICAgdHJ5IHsKICAgICAgICBpZiAobm9kZTIudHlwZSA9PT0gImZpbGUiKSB7CiAgICAgICAgICBjb25zdCBjb250ZW50MyA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZEZpbGUobm9kZTIucGF0aCk7CiAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LndyaXRlRmlsZShuZXdQYXRoLCBjb250ZW50Myk7CiAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnJtKG5vZGUyLnBhdGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlEaXJlY3RvcnlDb250ZW50cyhub2RlMi5wYXRoLCBuZXdQYXRoKTsKICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucm0obm9kZTIucGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7CiAgICAgICAgfQogICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpOwogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIml0ZW0tcmVuYW1lZCIsIHsKICAgICAgICAgIGRldGFpbDogeyBvbGRQYXRoOiBub2RlMi5wYXRoLCBuZXdQYXRoLCB0eXBlOiBub2RlMi50eXBlIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHJlbmFtZSBpdGVtOiIsIGVycm9yKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBEdXBsaWNhdGUgYSBmaWxlIG9yIGZvbGRlcgogICAgICovCiAgICBhc3luYyBkdXBsaWNhdGVJdGVtKG5vZGUyKSB7CiAgICAgIGlmICghdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBub2RlMi5wYXRoLnN1YnN0cmluZygwLCBub2RlMi5wYXRoLmxhc3RJbmRleE9mKCIvIikpIHx8ICIvIjsKICAgICAgbGV0IG5ld05hbWU7CiAgICAgIGlmIChub2RlMi50eXBlID09PSAiZmlsZSIpIHsKICAgICAgICBjb25zdCBsYXN0RG90ID0gbm9kZTIubmFtZS5sYXN0SW5kZXhPZigiLiIpOwogICAgICAgIGlmIChsYXN0RG90ID4gMCkgewogICAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBub2RlMi5uYW1lLnN1YnN0cmluZygwLCBsYXN0RG90KTsKICAgICAgICAgIGNvbnN0IGV4dCA9IG5vZGUyLm5hbWUuc3Vic3RyaW5nKGxhc3REb3QpOwogICAgICAgICAgbmV3TmFtZSA9IGAke2Jhc2VOYW1lfV9jb3B5JHtleHR9YDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV3TmFtZSA9IGAke25vZGUyLm5hbWV9X2NvcHlgOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBuZXdOYW1lID0gYCR7bm9kZTIubmFtZX1fY29weWA7CiAgICAgIH0KICAgICAgY29uc3QgbmV3UGF0aCA9IHBhcmVudFBhdGggPT09ICIvIiA/IGAvJHtuZXdOYW1lfWAgOiBgJHtwYXJlbnRQYXRofS8ke25ld05hbWV9YDsKICAgICAgdHJ5IHsKICAgICAgICBpZiAobm9kZTIudHlwZSA9PT0gImZpbGUiKSB7CiAgICAgICAgICBjb25zdCBjb250ZW50MyA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZEZpbGUobm9kZTIucGF0aCk7CiAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LndyaXRlRmlsZShuZXdQYXRoLCBjb250ZW50Myk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGF3YWl0IHRoaXMuY29weURpcmVjdG9yeUNvbnRlbnRzKG5vZGUyLnBhdGgsIG5ld1BhdGgpOwogICAgICAgIH0KICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpdGVtLWR1cGxpY2F0ZWQiLCB7CiAgICAgICAgICBkZXRhaWw6IHsgc291cmNlUGF0aDogbm9kZTIucGF0aCwgbmV3UGF0aCwgdHlwZTogbm9kZTIudHlwZSB9LAogICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgfSkpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBkdXBsaWNhdGUgaXRlbToiLCBlcnJvcik7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ29weSBpdGVtIHBhdGggdG8gY2xpcGJvYXJkCiAgICAgKi8KICAgIGFzeW5jIGNvcHlJdGVtKG5vZGUyKSB7CiAgICAgIHRoaXMuY2xpcGJvYXJkUGF0aCA9IG5vZGUyLnBhdGg7CiAgICAgIHRoaXMuY2xpcGJvYXJkT3BlcmF0aW9uID0gImNvcHkiOwogICAgfQogICAgLyoqCiAgICAgKiBQYXN0ZSBjb3BpZWQgaXRlbSB0byB0YXJnZXQgZGlyZWN0b3J5CiAgICAgKi8KICAgIGFzeW5jIHBhc3RlSXRlbSh0YXJnZXRQYXRoKSB7CiAgICAgIGlmICghdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCB8fCAhdGhpcy5jbGlwYm9hcmRQYXRoKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgbmFtZSA9IHRoaXMuY2xpcGJvYXJkUGF0aC5zcGxpdCgiLyIpLnBvcCgpIHx8ICJwYXN0ZWQiOwogICAgICBjb25zdCBuZXdQYXRoID0gdGFyZ2V0UGF0aCA9PT0gIi8iID8gYC8ke25hbWV9YCA6IGAke3RhcmdldFBhdGh9LyR7bmFtZX1gOwogICAgICB0cnkgewogICAgICAgIGlmICghYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5leGlzdHModGhpcy5jbGlwYm9hcmRQYXRoKSkgewogICAgICAgICAgY29uc29sZS5lcnJvcigiU291cmNlIGZpbGUgbm8gbG9uZ2VyIGV4aXN0cyIpOwogICAgICAgICAgdGhpcy5jbGlwYm9hcmRQYXRoID0gbnVsbDsKICAgICAgICAgIHRoaXMuY2xpcGJvYXJkT3BlcmF0aW9uID0gbnVsbDsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IGNvbnRlbnQzID0gYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5yZWFkRmlsZSh0aGlzLmNsaXBib2FyZFBhdGgpOwogICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC53cml0ZUZpbGUobmV3UGF0aCwgY29udGVudDMpOwogICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgYXdhaXQgdGhpcy5jb3B5RGlyZWN0b3J5Q29udGVudHModGhpcy5jbGlwYm9hcmRQYXRoLCBuZXdQYXRoKTsKICAgICAgICB9CiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7CiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaXRlbS1wYXN0ZWQiLCB7CiAgICAgICAgICBkZXRhaWw6IHsgc291cmNlUGF0aDogdGhpcy5jbGlwYm9hcmRQYXRoLCB0YXJnZXRQYXRoOiBuZXdQYXRoIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5jbGlwYm9hcmRQYXRoID0gbnVsbDsKICAgICAgICB0aGlzLmNsaXBib2FyZE9wZXJhdGlvbiA9IG51bGw7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHBhc3RlIGl0ZW06IiwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJlY3Vyc2l2ZWx5IGNvcHkgZGlyZWN0b3J5IGNvbnRlbnRzIHRvIGEgbmV3IHBhdGgKICAgICAqLwogICAgYXN5bmMgY29weURpcmVjdG9yeUNvbnRlbnRzKHNvdXJjZVBhdGgsIGRlc3RQYXRoKSB7CiAgICAgIGlmICghdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCkKICAgICAgICByZXR1cm47CiAgICAgIGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQubWtkaXIoZGVzdFBhdGgpOwogICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5yZWFkRGlyKHNvdXJjZVBhdGgpOwogICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHsKICAgICAgICBjb25zdCBzcmNFbnRyeVBhdGggPSBzb3VyY2VQYXRoID09PSAiLyIgPyBgLyR7ZW50cnkubmFtZX1gIDogYCR7c291cmNlUGF0aH0vJHtlbnRyeS5uYW1lfWA7CiAgICAgICAgY29uc3QgZGVzdEVudHJ5UGF0aCA9IGRlc3RQYXRoID09PSAiLyIgPyBgLyR7ZW50cnkubmFtZX1gIDogYCR7ZGVzdFBhdGh9LyR7ZW50cnkubmFtZX1gOwogICAgICAgIGlmIChlbnRyeS50eXBlID09PSAiZGlyZWN0b3J5IikgewogICAgICAgICAgYXdhaXQgdGhpcy5jb3B5RGlyZWN0b3J5Q29udGVudHMoc3JjRW50cnlQYXRoLCBkZXN0RW50cnlQYXRoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgY29udGVudDMgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnJlYWRGaWxlKHNyY0VudHJ5UGF0aCk7CiAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LndyaXRlRmlsZShkZXN0RW50cnlQYXRoLCBjb250ZW50Myk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIGF3YWl0IHRoaXMubG9hZFRyZWUoKTsKICAgIH0KICAgIGFzeW5jIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygiZXhlY3V0aW9uRW52aXJvbm1lbnQiKSkgewogICAgICAgIGlmICh0aGlzLmxhc3RFeGVjdXRpb25FbnZpcm9ubWVudCAhPT0gdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCkgewogICAgICAgICAgdGhpcy5zdG9wRmlsZVdhdGNoZXIoKTsKICAgICAgICAgIHRoaXMubGFzdEV4ZWN1dGlvbkVudmlyb25tZW50ID0gdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudDsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFRyZWUoKTsKICAgICAgICAgIHRoaXMuc3RhcnRGaWxlV2F0Y2hlcigpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuc3RvcEZpbGVXYXRjaGVyKCk7CiAgICAgIGlmICh0aGlzLnJlZnJlc2hEZWJvdW5jZVRpbWVvdXQpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWZyZXNoRGVib3VuY2VUaW1lb3V0KTsKICAgICAgICB0aGlzLnJlZnJlc2hEZWJvdW5jZVRpbWVvdXQgPSBudWxsOwogICAgICB9CiAgICB9CiAgICBzdGFydEZpbGVXYXRjaGVyKCkgewogICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQgfHwgdGhpcy5maWxlV2F0Y2hlcikKICAgICAgICByZXR1cm47CiAgICAgIHRyeSB7CiAgICAgICAgdGhpcy5maWxlV2F0Y2hlciA9IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQud2F0Y2goIi8iLCAoX2V2ZW50LCBfZmlsZW5hbWUpID0+IHsKICAgICAgICAgIGlmICh0aGlzLnJlZnJlc2hEZWJvdW5jZVRpbWVvdXQpIHsKICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVmcmVzaERlYm91bmNlVGltZW91dCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLnJlZnJlc2hEZWJvdW5jZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7CiAgICAgICAgICB9LCAzMDApOwogICAgICAgIH0sIHsgcmVjdXJzaXZlOiB0cnVlIH0pOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUud2FybigiRmlsZSB3YXRjaGluZyBub3Qgc3VwcG9ydGVkOiIsIGVycm9yKTsKICAgICAgfQogICAgfQogICAgc3RvcEZpbGVXYXRjaGVyKCkgewogICAgICBpZiAodGhpcy5maWxlV2F0Y2hlcikgewogICAgICAgIHRoaXMuZmlsZVdhdGNoZXIuc3RvcCgpOwogICAgICAgIHRoaXMuZmlsZVdhdGNoZXIgPSBudWxsOwogICAgICB9CiAgICB9CiAgICBhc3luYyBsb2FkVHJlZSgpIHsKICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICAgIHJldHVybjsKICAgICAgaWYgKHRoaXMubG9hZFRyZWVTdGFydGVkKQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5sb2FkVHJlZVN0YXJ0ZWQgPSB0cnVlOwogICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7CiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gIiI7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnJlYWR5KSB7CiAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LmluaXQoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZERpcih0aGlzLnJvb3RQYXRoKTsKICAgICAgICB0aGlzLnRyZWVEYXRhID0gdGhpcy5zb3J0RW50cmllcyhlbnRyaWVzKS5tYXAoKGVudHJ5KSA9PiAoewogICAgICAgICAgLi4uZW50cnksCiAgICAgICAgICBsZXZlbDogMCwKICAgICAgICAgIGV4cGFuZGVkOiBmYWxzZSwKICAgICAgICAgIGNoaWxkcmVuOiBlbnRyeS50eXBlID09PSAiZGlyZWN0b3J5IiA/IFtdIDogdm9pZCAwCiAgICAgICAgfSkpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gYEZhaWxlZCB0byBsb2FkIGZpbGVzOiAke2Vycm9yfWA7CiAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGxvYWQgZmlsZSB0cmVlOiIsIGVycm9yKTsKICAgICAgICB0aGlzLmxvYWRUcmVlU3RhcnRlZCA9IGZhbHNlOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHNvcnRFbnRyaWVzKGVudHJpZXMpIHsKICAgICAgcmV0dXJuIGVudHJpZXMuc29ydCgoYTUsIGI1KSA9PiB7CiAgICAgICAgaWYgKGE1LnR5cGUgIT09IGI1LnR5cGUpIHsKICAgICAgICAgIHJldHVybiBhNS50eXBlID09PSAiZGlyZWN0b3J5IiA/IC0xIDogMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGE1Lm5hbWUubG9jYWxlQ29tcGFyZShiNS5uYW1lKTsKICAgICAgfSk7CiAgICB9CiAgICBhc3luYyByZWZyZXNoKCkgewogICAgICB0aGlzLmV4cGFuZGVkUGF0aHMuY2xlYXIoKTsKICAgICAgdGhpcy5sb2FkVHJlZVN0YXJ0ZWQgPSBmYWxzZTsKICAgICAgYXdhaXQgdGhpcy5sb2FkVHJlZSgpOwogICAgfQogICAgc2VsZWN0RmlsZShwYXRoMikgewogICAgICB0aGlzLnNlbGVjdGVkUGF0aCA9IHBhdGgyOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM5MyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1dvcmtzcGFjZUZpbGV0cmVlMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtd29ya3NwYWNlL2RlZXMtd29ya3NwYWNlLXRlcm1pbmFsLXByZXZpZXcvZGVlcy13b3Jrc3BhY2UtdGVybWluYWwtcHJldmlldy5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X3RoZW1lKCk7CmluaXRfc2VydmljZXMoKTsKdmFyIF9fZXNEZWNvcmF0ZTkzID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjcpIHsKICAgIGlmIChmNyAhPT0gdm9pZCAwICYmIHR5cGVvZiBmNyAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmNzsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF80LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluKSBjb250ZXh0MltwN10gPSBwNyA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwN107CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDddID0gY29udGV4dEluLmFjY2Vzc1twN107CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY3KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjcgfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgIH0gZWxzZSBpZiAoXzQgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNDsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM5NCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1dvcmtzcGFjZVRlcm1pbmFsUHJldmlldyA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbdDQoImRlZXMtd29ya3NwYWNlLXRlcm1pbmFsLXByZXZpZXciKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9jb21tYW5kX2RlY29yYXRvcnM7CiAgbGV0IF9jb21tYW5kX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29tbWFuZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGluZXNfZGVjb3JhdG9yczsKICBsZXQgX2xpbmVzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGluZXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1dvcmtzcGFjZVRlcm1pbmFsUHJldmlldzIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9jb21tYW5kX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfbGluZXNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX19lc0RlY29yYXRlOTModGhpcywgbnVsbCwgX2NvbW1hbmRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29tbWFuZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29tbWFuZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jb21tYW5kLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jb21tYW5kID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbW1hbmRfaW5pdGlhbGl6ZXJzLCBfY29tbWFuZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTkzKHRoaXMsIG51bGwsIF9saW5lc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsaW5lcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibGluZXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubGluZXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxpbmVzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xpbmVzX2luaXRpYWxpemVycywgX2xpbmVzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTMobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzV29ya3NwYWNlVGVybWluYWxQcmV2aWV3MiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9ICgpID0+IGIyYAogICAgPGRlZXMtd29ya3NwYWNlLXRlcm1pbmFsLXByZXZpZXcKICAgICAgLmNvbW1hbmQ9JHsicG5wbSBpbnN0YWxsIn0KICAgICAgLmxpbmVzPSR7WwogICAgICAiUGFja2FnZXM6ICs0MiIsCiAgICAgICJQcm9ncmVzczogcmVzb2x2ZWQgMTQyLCByZXVzZWQgMTQwLCBkb3dubG9hZGVkIDIsIGFkZGVkIDQyLCBkb25lIiwKICAgICAgIiIsCiAgICAgICJkZXBlbmRlbmNpZXM6IiwKICAgICAgIisgQHB1c2gucm9ja3Mvc21hcnRwcm9taXNlIDQuMi4zIiwKICAgICAgIisgdHlwZXNjcmlwdCA1LjMuMyIsCiAgICAgICIiLAogICAgICAiRG9uZSBpbiAyLjNzIgogICAgXX0KICAgID48L2RlZXMtd29ya3NwYWNlLXRlcm1pbmFsLXByZXZpZXc+CiAgYDsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJXb3Jrc3BhY2UiXTsKICAgICNjb21tYW5kX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczk0KHRoaXMsIF9jb21tYW5kX2luaXRpYWxpemVycywgIiIpOwogICAgLyoqCiAgICAgKiBUaGUgY29tbWFuZCBiZWluZyBkaXNwbGF5ZWQgKHNob3duIGluIGhlYWRlcikKICAgICAqLwogICAgZ2V0IGNvbW1hbmQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb21tYW5kX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29tbWFuZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29tbWFuZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2xpbmVzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5NCh0aGlzLCBfY29tbWFuZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTQodGhpcywgX2xpbmVzX2luaXRpYWxpemVycywgW10pKTsKICAgIC8qKgogICAgICogT3V0cHV0IGxpbmVzIHRvIGRpc3BsYXkKICAgICAqLwogICAgZ2V0IGxpbmVzKCkgewogICAgICByZXR1cm4gdGhpcy4jbGluZXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsaW5lcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbGluZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHRlcm1pbmFsID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTQodGhpcywgX2xpbmVzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgbnVsbCk7CiAgICBmaXRBZGRvbiA9IG51bGw7CiAgICBsYXN0TGluZUNvdW50ID0gMDsKICAgIHJlc2l6ZU9ic2VydmVyID0gbnVsbDsKICAgIHRlcm1pbmFsVGhlbWVTdWJzY3JpcHRpb24gPSBudWxsOwogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDIwMHB4OwogICAgICB9CgogICAgICAudGVybWluYWwtcHJldmlldyB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMwMDAwMDAiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg1JSkiLCAiaHNsKDAgMCUgMjAlKSIpfTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KCiAgICAgIC50ZXJtaW5hbC1oZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTYlKSIsICJoc2woMCAwJSAxMCUpIil9OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LWZhbWlseTogJ1NGIE1vbm8nLCAnTW9uYWNvJywgJ0luY29uc29sYXRhJywgJ0ZpcmEgQ29kZScsIG1vbm9zcGFjZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQwJSkiLCAiaHNsKDAgMCUgNjAlKSIpfTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg1JSkiLCAiaHNsKDAgMCUgMjAlKSIpfTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLnRlcm1pbmFsLWhlYWRlci1pY29uIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDUwJSkiLCAiaHNsKDAgMCUgNTAlKSIpfTsKICAgICAgfQoKICAgICAgLnRlcm1pbmFsLWhlYWRlci1jb21tYW5kIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDIwJSkiLCAiaHNsKDAgMCUgODAlKSIpfTsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICB9CgogICAgICAudGVybWluYWwtY29udGFpbmVyIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgIH0KCiAgICAgICN4dGVybS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDhweDsKICAgICAgICBsZWZ0OiA4cHg7CiAgICAgICAgcmlnaHQ6IDhweDsKICAgICAgICBib3R0b206IDhweDsKICAgICAgfQoKICAgICAgLyogeHRlcm0uanMgc3R5bGVzICovCiAgICAgIC54dGVybSB7CiAgICAgICAgZm9udC1mZWF0dXJlLXNldHRpbmdzOiAnbGlnYScgMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIC54dGVybS5mb2N1cywKICAgICAgLnh0ZXJtOmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICAueHRlcm0gLnh0ZXJtLWhlbHBlcnMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgfQoKICAgICAgLnh0ZXJtIC54dGVybS1oZWxwZXItdGV4dGFyZWEgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBsZWZ0OiAtOTk5OWVtOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWR0aDogMDsKICAgICAgICBoZWlnaHQ6IDA7CiAgICAgICAgei1pbmRleDogLTU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgfQoKICAgICAgLnh0ZXJtIC5jb21wb3NpdGlvbi12aWV3IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMDAwMDAwIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzMzMzMzMyIsICIjZmZmZmZmIil9OwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQoKICAgICAgLnh0ZXJtIC5jb21wb3NpdGlvbi12aWV3LmFjdGl2ZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC54dGVybSAueHRlcm0tdmlld3BvcnQgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMwMDAwMDAiKX07CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICB9CgogICAgICAueHRlcm0gLnh0ZXJtLXNjcmVlbiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAueHRlcm0gLnh0ZXJtLXNjcmVlbiBjYW52YXMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLnh0ZXJtIC54dGVybS1zY3JvbGwtYXJlYSB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAueHRlcm0tY2hhci1tZWFzdXJlLWVsZW1lbnQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAtOTk5OWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC54dGVybSB7CiAgICAgICAgY3Vyc29yOiB0ZXh0OwogICAgICB9CgogICAgICAueHRlcm0uZW5hYmxlLW1vdXNlLWV2ZW50cyB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICAueHRlcm0ueHRlcm0tY3Vyc29yLXBvaW50ZXIgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgLnh0ZXJtLmNvbHVtbi1zZWxlY3QuZm9jdXMgewogICAgICAgIGN1cnNvcjogY3Jvc3NoYWlyOwogICAgICB9CgogICAgICAueHRlcm0gLnh0ZXJtLWFjY2Vzc2liaWxpdHksCiAgICAgIC54dGVybSAueHRlcm0tbWVzc2FnZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgICBjb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC54dGVybSAubGl2ZS1yZWdpb24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAtOTk5OXB4OwogICAgICAgIHdpZHRoOiAxcHg7CiAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnh0ZXJtLWRpbSB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAueHRlcm0tdW5kZXJsaW5lIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQoKICAgICAgLyogQ3VzdG9tIHNjcm9sbGJhciBmb3IgeHRlcm0gdmlld3BvcnQgKi8KICAgICAgLnh0ZXJtIC54dGVybS12aWV3cG9ydDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIHdpZHRoOiA4cHg7CiAgICAgIH0KCiAgICAgIC54dGVybSAueHRlcm0tdmlld3BvcnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTYlKSIsICJoc2woMCAwJSA4JSkiKX07CiAgICAgIH0KCiAgICAgIC54dGVybSAueHRlcm0tdmlld3BvcnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODAlKSIsICJoc2woMCAwJSAyNSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgfQoKICAgICAgLnh0ZXJtIC54dGVybS12aWV3cG9ydDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA3MCUpIiwgImhzbCgwIDAlIDM1JSkiKX07CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0idGVybWluYWwtcHJldmlldyI+CiAgICAgICAgPGRpdiBjbGFzcz0idGVybWluYWwtaGVhZGVyIj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXJtaW5hbC1oZWFkZXItaWNvbiI+JDwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXJtaW5hbC1oZWFkZXItY29tbWFuZCI+JHt0aGlzLmNvbW1hbmQgfHwgIldhaXRpbmcuLi4ifTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXJtaW5hbC1jb250YWluZXIiPgogICAgICAgICAgPGRpdiBpZD0ieHRlcm0tY29udGFpbmVyIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGVybWluYWwgdGhlbWUgY29sb3JzIGJhc2VkIG9uIGJyaWdodC9kYXJrIG1vZGUKICAgICAqLwogICAgZ2V0VGVybWluYWxUaGVtZShpc0JyaWdodCkgewogICAgICByZXR1cm4gaXNCcmlnaHQgPyB7CiAgICAgICAgYmFja2dyb3VuZDogIiNmZmZmZmYiLAogICAgICAgIGZvcmVncm91bmQ6ICIjMzMzMzMzIiwKICAgICAgICBjdXJzb3I6ICIjMzMzMzMzIiwKICAgICAgICBjdXJzb3JBY2NlbnQ6ICIjZmZmZmZmIiwKICAgICAgICBzZWxlY3Rpb25CYWNrZ3JvdW5kOiAicmdiYSgwLCAwLCAwLCAwLjIpIgogICAgICB9IDogewogICAgICAgIGJhY2tncm91bmQ6ICIjMDAwMDAwIiwKICAgICAgICBmb3JlZ3JvdW5kOiAiI2NjY2NjYyIsCiAgICAgICAgY3Vyc29yOiAiI2NjY2NjYyIsCiAgICAgICAgY3Vyc29yQWNjZW50OiAiIzAwMDAwMCIsCiAgICAgICAgc2VsZWN0aW9uQmFja2dyb3VuZDogInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSIKICAgICAgfTsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQoInh0ZXJtLWNvbnRhaW5lciIpOwogICAgICBpZiAoIWNvbnRhaW5lcikKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGRvbXRvb2xzSW5zdGFuY2UgPSBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgY29uc3QgaXNCcmlnaHQgPSBkb210b29sc0luc3RhbmNlLnRoZW1lTWFuYWdlci5nb0JyaWdodEJvb2xlYW47CiAgICAgIGNvbnN0IGxpYkxvYWRlciA9IERlZXNTZXJ2aWNlTGliTG9hZGVyLmdldEluc3RhbmNlKCk7CiAgICAgIGNvbnN0IFt4dGVybUJ1bmRsZSwgZml0QWRkb25CdW5kbGVdID0gYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgICAgIGxpYkxvYWRlci5sb2FkWHRlcm0oKSwKICAgICAgICBsaWJMb2FkZXIubG9hZFh0ZXJtRml0QWRkb24oKQogICAgICBdKTsKICAgICAgdGhpcy50ZXJtaW5hbCA9IG5ldyB4dGVybUJ1bmRsZS5UZXJtaW5hbCh7CiAgICAgICAgY29udmVydEVvbDogdHJ1ZSwKICAgICAgICBjdXJzb3JCbGluazogZmFsc2UsCiAgICAgICAgZGlzYWJsZVN0ZGluOiB0cnVlLAogICAgICAgIGZvbnRTaXplOiAxMiwKICAgICAgICBmb250RmFtaWx5OiAiJ1NGIE1vbm8nLCAnTW9uYWNvJywgJ0luY29uc29sYXRhJywgJ0ZpcmEgQ29kZScsIG1vbm9zcGFjZSIsCiAgICAgICAgdGhlbWU6IHRoaXMuZ2V0VGVybWluYWxUaGVtZShpc0JyaWdodCksCiAgICAgICAgc2Nyb2xsYmFjazogMWUzCiAgICAgIH0pOwogICAgICB0aGlzLnRlcm1pbmFsVGhlbWVTdWJzY3JpcHRpb24gPSBkb210b29sc0luc3RhbmNlLnRoZW1lTWFuYWdlci50aGVtZU9ic2VydmFibGUuc3Vic2NyaWJlKChnb0JyaWdodCkgPT4gewogICAgICAgIGlmICh0aGlzLnRlcm1pbmFsKSB7CiAgICAgICAgICB0aGlzLnRlcm1pbmFsLm9wdGlvbnMudGhlbWUgPSB0aGlzLmdldFRlcm1pbmFsVGhlbWUoZ29CcmlnaHQpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMuZml0QWRkb24gPSBuZXcgZml0QWRkb25CdW5kbGUuRml0QWRkb24oKTsKICAgICAgdGhpcy50ZXJtaW5hbC5sb2FkQWRkb24odGhpcy5maXRBZGRvbik7CiAgICAgIHRoaXMudGVybWluYWwub3Blbihjb250YWluZXIpOwogICAgICB0aGlzLmZpdEFkZG9uLmZpdCgpOwogICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHsKICAgICAgICBpZiAodGhpcy5maXRBZGRvbikgewogICAgICAgICAgdGhpcy5maXRBZGRvbi5maXQoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyKTsKICAgICAgdGhpcy53cml0ZU5ld0xpbmVzKCk7CiAgICB9CiAgICBhc3luYyB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJsaW5lcyIpKSB7CiAgICAgICAgdGhpcy53cml0ZU5ld0xpbmVzKCk7CiAgICAgIH0KICAgIH0KICAgIHdyaXRlTmV3TGluZXMoKSB7CiAgICAgIGlmICghdGhpcy50ZXJtaW5hbCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IG5ld0xpbmVzID0gdGhpcy5saW5lcy5zbGljZSh0aGlzLmxhc3RMaW5lQ291bnQpOwogICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbmV3TGluZXMpIHsKICAgICAgICB0aGlzLnRlcm1pbmFsLndyaXRlbG4obGluZSk7CiAgICAgIH0KICAgICAgdGhpcy5sYXN0TGluZUNvdW50ID0gdGhpcy5saW5lcy5sZW5ndGg7CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgaWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpIHsKICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbnVsbDsKICAgICAgfQogICAgICBpZiAodGhpcy50ZXJtaW5hbFRoZW1lU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgdGhpcy50ZXJtaW5hbFRoZW1lU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgdGhpcy50ZXJtaW5hbFRoZW1lU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgfQogICAgICBpZiAodGhpcy50ZXJtaW5hbCkgewogICAgICAgIHRoaXMudGVybWluYWwuZGlzcG9zZSgpOwogICAgICAgIHRoaXMudGVybWluYWwgPSBudWxsOwogICAgICB9CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICB9CiAgICAvKioKICAgICAqIEFkZCBhIG5ldyBsaW5lIHRvIHRoZSBvdXRwdXQKICAgICAqLwogICAgYWRkTGluZShsaW5lKSB7CiAgICAgIHRoaXMubGluZXMgPSBbLi4udGhpcy5saW5lcywgbGluZV07CiAgICB9CiAgICAvKioKICAgICAqIENsZWFyIGFsbCBvdXRwdXQgbGluZXMKICAgICAqLwogICAgY2xlYXIoKSB7CiAgICAgIHRoaXMubGluZXMgPSBbXTsKICAgICAgdGhpcy5sYXN0TGluZUNvdW50ID0gMDsKICAgICAgaWYgKHRoaXMudGVybWluYWwpIHsKICAgICAgICB0aGlzLnRlcm1pbmFsLmNsZWFyKCk7CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzOTQoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNXb3Jrc3BhY2VUZXJtaW5hbFByZXZpZXcyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC13b3Jrc3BhY2UvZGVlcy13b3Jrc3BhY2UtYm90dG9tYmFyL2RlZXMtd29ya3NwYWNlLWJvdHRvbWJhci5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X3RoZW1lKCk7CmluaXRfZGVlc19pY29uKCk7CnZhciBfX2VzRGVjb3JhdGU5NCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzOTUgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNXb3Jrc3BhY2VCb3R0b21iYXIgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLXdvcmtzcGFjZS1ib3R0b21iYXIiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9leGVjdXRpb25FbnZpcm9ubWVudF9kZWNvcmF0b3JzOwogIGxldCBfZXhlY3V0aW9uRW52aXJvbm1lbnRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9leGVjdXRpb25FbnZpcm9ubWVudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2NyaXB0c19kZWNvcmF0b3JzOwogIGxldCBfc2NyaXB0c19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NjcmlwdHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BhY2thZ2VTdGF0dXNfZGVjb3JhdG9yczsKICBsZXQgX3BhY2thZ2VTdGF0dXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wYWNrYWdlU3RhdHVzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vdXRkYXRlZFBhY2thZ2VzX2RlY29yYXRvcnM7CiAgbGV0IF9vdXRkYXRlZFBhY2thZ2VzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfb3V0ZGF0ZWRQYWNrYWdlc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNDaGVja2luZ1BhY2thZ2VzX2RlY29yYXRvcnM7CiAgbGV0IF9pc0NoZWNraW5nUGFja2FnZXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0NoZWNraW5nUGFja2FnZXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1dvcmtzcGFjZUJvdHRvbWJhcjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9leGVjdXRpb25FbnZpcm9ubWVudF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogT2JqZWN0IH0pXTsKICAgICAgX3NjcmlwdHNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3BhY2thZ2VTdGF0dXNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX291dGRhdGVkUGFja2FnZXNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2lzQ2hlY2tpbmdQYWNrYWdlc19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGU5NCh0aGlzLCBudWxsLCBfZXhlY3V0aW9uRW52aXJvbm1lbnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZXhlY3V0aW9uRW52aXJvbm1lbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImV4ZWN1dGlvbkVudmlyb25tZW50IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmV4ZWN1dGlvbkVudmlyb25tZW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5leGVjdXRpb25FbnZpcm9ubWVudCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9leGVjdXRpb25FbnZpcm9ubWVudF9pbml0aWFsaXplcnMsIF9leGVjdXRpb25FbnZpcm9ubWVudF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk0KHRoaXMsIG51bGwsIF9zY3JpcHRzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNjcmlwdHMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNjcmlwdHMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2NyaXB0cywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2NyaXB0cyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zY3JpcHRzX2luaXRpYWxpemVycywgX3NjcmlwdHNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5NCh0aGlzLCBudWxsLCBfcGFja2FnZVN0YXR1c19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwYWNrYWdlU3RhdHVzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJwYWNrYWdlU3RhdHVzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnBhY2thZ2VTdGF0dXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnBhY2thZ2VTdGF0dXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcGFja2FnZVN0YXR1c19pbml0aWFsaXplcnMsIF9wYWNrYWdlU3RhdHVzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTQodGhpcywgbnVsbCwgX291dGRhdGVkUGFja2FnZXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAib3V0ZGF0ZWRQYWNrYWdlcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAib3V0ZGF0ZWRQYWNrYWdlcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5vdXRkYXRlZFBhY2thZ2VzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5vdXRkYXRlZFBhY2thZ2VzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX291dGRhdGVkUGFja2FnZXNfaW5pdGlhbGl6ZXJzLCBfb3V0ZGF0ZWRQYWNrYWdlc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk0KHRoaXMsIG51bGwsIF9pc0NoZWNraW5nUGFja2FnZXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNDaGVja2luZ1BhY2thZ2VzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc0NoZWNraW5nUGFja2FnZXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNDaGVja2luZ1BhY2thZ2VzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc0NoZWNraW5nUGFja2FnZXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNDaGVja2luZ1BhY2thZ2VzX2luaXRpYWxpemVycywgX2lzQ2hlY2tpbmdQYWNrYWdlc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk0KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1dvcmtzcGFjZUJvdHRvbWJhcjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgI2V4ZWN1dGlvbkVudmlyb25tZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczk1KHRoaXMsIF9leGVjdXRpb25FbnZpcm9ubWVudF9pbml0aWFsaXplcnMsIG51bGwpOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCBleGVjdXRpb25FbnZpcm9ubWVudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2V4ZWN1dGlvbkVudmlyb25tZW50X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZXhlY3V0aW9uRW52aXJvbm1lbnQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2V4ZWN1dGlvbkVudmlyb25tZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2NyaXB0c19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTUodGhpcywgX2V4ZWN1dGlvbkVudmlyb25tZW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5NSh0aGlzLCBfc2NyaXB0c19pbml0aWFsaXplcnMsIHt9KSk7CiAgICAvLyBTY3JpcHQgcnVubmVyIHN0YXRlCiAgICBnZXQgc2NyaXB0cygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NjcmlwdHNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzY3JpcHRzKHZhbHVlMikgewogICAgICB0aGlzLiNzY3JpcHRzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcGFja2FnZVN0YXR1c19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTUodGhpcywgX3NjcmlwdHNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk1KHRoaXMsIF9wYWNrYWdlU3RhdHVzX2luaXRpYWxpemVycywgImlkbGUiKSk7CiAgICAvLyBQYWNrYWdlIGNoZWNrZXIgc3RhdGUKICAgIGdldCBwYWNrYWdlU3RhdHVzKCkgewogICAgICByZXR1cm4gdGhpcy4jcGFja2FnZVN0YXR1c19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHBhY2thZ2VTdGF0dXModmFsdWUyKSB7CiAgICAgIHRoaXMuI3BhY2thZ2VTdGF0dXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNvdXRkYXRlZFBhY2thZ2VzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5NSh0aGlzLCBfcGFja2FnZVN0YXR1c19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTUodGhpcywgX291dGRhdGVkUGFja2FnZXNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IG91dGRhdGVkUGFja2FnZXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNvdXRkYXRlZFBhY2thZ2VzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgb3V0ZGF0ZWRQYWNrYWdlcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jb3V0ZGF0ZWRQYWNrYWdlc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzQ2hlY2tpbmdQYWNrYWdlc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTUodGhpcywgX291dGRhdGVkUGFja2FnZXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk1KHRoaXMsIF9pc0NoZWNraW5nUGFja2FnZXNfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGlzQ2hlY2tpbmdQYWNrYWdlcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzQ2hlY2tpbmdQYWNrYWdlc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzQ2hlY2tpbmdQYWNrYWdlcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXNDaGVja2luZ1BhY2thZ2VzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAvLyBUcmFjayBpZiB3ZSBoYXZlIGEgcGVuZGluZyBwYWNrYWdlIHVwZGF0ZSB0aGF0IHNob3VsZCB0cmlnZ2VyIHJlZnJlc2gKICAgIHBlbmRpbmdQYWNrYWdlVXBkYXRlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTUodGhpcywgX2lzQ2hlY2tpbmdQYWNrYWdlc19leHRyYUluaXRpYWxpemVycyksIGZhbHNlKTsKICAgIC8vIEJvdW5kIGhhbmRsZXIgZm9yIHByb2Nlc3MtY29tcGxldGUgZXZlbnRzCiAgICBoYW5kbGVQcm9jZXNzQ29tcGxldGUgPSAoZTExKSA9PiB7CiAgICAgIGlmICh0aGlzLnBlbmRpbmdQYWNrYWdlVXBkYXRlKSB7CiAgICAgICAgdGhpcy5wZW5kaW5nUGFja2FnZVVwZGF0ZSA9IGZhbHNlOwogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jaGVja1BhY2thZ2VzKCksIDUwMCk7CiAgICAgIH0KICAgIH07CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMjRweDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLmJvdHRvbS1iYXIgewogICAgICAgIGhlaWdodDogMjRweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgcGFkZGluZzogMCA4cHg7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk0JSkiLCAiaHNsKDAgMCUgNiUpIil9OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODUlKSIsICJoc2woMCAwJSAxNSUpIil9OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQwJSkiLCAiaHNsKDAgMCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLndpZGdldCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNHB4OwogICAgICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzIGVhc2UsIGNvbG9yIDAuMTVzIGVhc2U7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLndpZGdldDpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg4JSkiLCAiaHNsKDAgMCUgMTIlKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDIwJSkiLCAiaHNsKDAgMCUgODAlKSIpfTsKICAgICAgfQoKICAgICAgLndpZGdldCBkZWVzLWljb24gewogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAud2lkZ2V0LXNlcGFyYXRvciB7CiAgICAgICAgd2lkdGg6IDFweDsKICAgICAgICBoZWlnaHQ6IDE0cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDgwJSkiLCAiaHNsKDAgMCUgMjAlKSIpfTsKICAgICAgICBtYXJnaW46IDAgNHB4OwogICAgICB9CgogICAgICAud2lkZ2V0LnJ1bm5pbmcgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCAxMDAlIDQ1JSkiLCAiaHNsKDIxMCAxMDAlIDYwJSkiKX07CiAgICAgIH0KCiAgICAgIC53aWRnZXQudXAtdG8tZGF0ZSB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyIDcwJSAzNSUpIiwgImhzbCgxNDIgNzAlIDUwJSkiKX07CiAgICAgIH0KCiAgICAgIC53aWRnZXQudXBkYXRlcy1hdmFpbGFibGUgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDM4IDkyJSA0NSUpIiwgImhzbCgzOCA5MiUgNTUlKSIpfTsKICAgICAgfQoKICAgICAgLndpZGdldC5lcnJvciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA3MCUgNTAlKSIsICJoc2woMCA3MCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBzcGluIHsKICAgICAgICBmcm9tIHsgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH0KICAgICAgICB0byB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH0KICAgICAgfQoKICAgICAgLnNwaW5uaW5nIHsKICAgICAgICBhbmltYXRpb246IHNwaW4gMXMgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICAuc3BhY2VyIHsKICAgICAgICBmbGV4OiAxOwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImJvdHRvbS1iYXIiPgogICAgICAgIDwhLS0gU2NyaXB0IFJ1bm5lciBXaWRnZXQgLS0+CiAgICAgICAgPGRpdgogICAgICAgICAgY2xhc3M9IndpZGdldCIKICAgICAgICAgIEBjbGljaz0ke3RoaXMuaGFuZGxlU2NyaXB0Q2xpY2t9CiAgICAgICAgICB0aXRsZT0iUnVuIHNjcmlwdCIKICAgICAgICA+CiAgICAgICAgICA8ZGVlcy1pY29uCiAgICAgICAgICAgIC5pY29uPSR7Imx1Y2lkZTpwbGF5In0KICAgICAgICAgICAgaWNvblNpemU9IjEyIgogICAgICAgICAgPjwvZGVlcy1pY29uPgogICAgICAgICAgPHNwYW4+U2NyaXB0czwvc3Bhbj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0id2lkZ2V0LXNlcGFyYXRvciI+PC9kaXY+CgogICAgICAgIDwhLS0gUGFja2FnZSBDaGVja2VyIFdpZGdldCAtLT4KICAgICAgICA8ZGl2CiAgICAgICAgICBjbGFzcz0id2lkZ2V0ICR7dGhpcy5nZXRQYWNrYWdlU3RhdHVzQ2xhc3MoKX0iCiAgICAgICAgICBAY2xpY2s9JHt0aGlzLmhhbmRsZVBhY2thZ2VDbGlja30KICAgICAgICAgIHRpdGxlPSIke3RoaXMuZ2V0UGFja2FnZVRvb2x0aXAoKX0iCiAgICAgICAgPgogICAgICAgICAgPGRlZXMtaWNvbgogICAgICAgICAgICAuaWNvbj0ke3RoaXMuZ2V0UGFja2FnZUljb24oKX0KICAgICAgICAgICAgaWNvblNpemU9IjEyIgogICAgICAgICAgICBjbGFzcz0iJHt0aGlzLmlzQ2hlY2tpbmdQYWNrYWdlcyA/ICJzcGlubmluZyIgOiAiIn0iCiAgICAgICAgICA+PC9kZWVzLWljb24+CiAgICAgICAgICA8c3Bhbj4ke3RoaXMuZ2V0UGFja2FnZVN0YXR1c1RleHQoKX08L3NwYW4+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9InNwYWNlciI+PC9kaXY+CgogICAgICAgIDwhLS0gRnV0dXJlIHdpZGdldHMgY2FuIGJlIGFkZGVkIGhlcmUgLS0+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicHJvY2Vzcy1jb21wbGV0ZSIsIHRoaXMuaGFuZGxlUHJvY2Vzc0NvbXBsZXRlKTsKICAgIH0KICAgIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicHJvY2Vzcy1jb21wbGV0ZSIsIHRoaXMuaGFuZGxlUHJvY2Vzc0NvbXBsZXRlKTsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZCgpIHsKICAgICAgYXdhaXQgdGhpcy5sb2FkU2NyaXB0cygpOwogICAgICBhd2FpdCB0aGlzLmNoZWNrUGFja2FnZXMoKTsKICAgIH0KICAgIGFzeW5jIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygiZXhlY3V0aW9uRW52aXJvbm1lbnQiKSAmJiB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KSB7CiAgICAgICAgYXdhaXQgdGhpcy5sb2FkU2NyaXB0cygpOwogICAgICAgIGF3YWl0IHRoaXMuY2hlY2tQYWNrYWdlcygpOwogICAgICB9CiAgICB9CiAgICAvLyA9PT09PT09PT09IFNjcmlwdCBSdW5uZXIgPT09PT09PT09PQogICAgYXN5bmMgbG9hZFNjcmlwdHMoKSB7CiAgICAgIGlmICghdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCkKICAgICAgICByZXR1cm47CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcGFja2FnZUpzb25FeGlzdHMgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LmV4aXN0cygiL3BhY2thZ2UuanNvbiIpOwogICAgICAgIGlmICghcGFja2FnZUpzb25FeGlzdHMpIHsKICAgICAgICAgIHRoaXMuc2NyaXB0cyA9IHt9OwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBjb250ZW50MyA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZEZpbGUoIi9wYWNrYWdlLmpzb24iKTsKICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoY29udGVudDMpOwogICAgICAgIHRoaXMuc2NyaXB0cyA9IHBhY2thZ2VKc29uLnNjcmlwdHMgfHwge307CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJGYWlsZWQgdG8gbG9hZCBzY3JpcHRzIGZyb20gcGFja2FnZS5qc29uOiIsIGVycm9yKTsKICAgICAgICB0aGlzLnNjcmlwdHMgPSB7fTsKICAgICAgfQogICAgfQogICAgYXN5bmMgaGFuZGxlU2NyaXB0Q2xpY2soZTExKSB7CiAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgY29uc3Qgc2NyaXB0TmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnNjcmlwdHMpOwogICAgICBpZiAoc2NyaXB0TmFtZXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IG1lbnVJdGVtcyA9IHNjcmlwdE5hbWVzLm1hcCgobmFtZSkgPT4gKHsKICAgICAgICBuYW1lLAogICAgICAgIGljb25OYW1lOiAibHVjaWRlOnRlcm1pbmFsIiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIGF3YWl0IHRoaXMucnVuU2NyaXB0KG5hbWUpOwogICAgICAgIH0KICAgICAgfSkpOwogICAgICBhd2FpdCBEZWVzQ29udGV4dG1lbnUub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZTExLCBtZW51SXRlbXMpOwogICAgfQogICAgYXN5bmMgcnVuU2NyaXB0KHNjcmlwdE5hbWUpIHsKICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgZGV0YWlsID0gewogICAgICAgIHR5cGU6ICJzY3JpcHQiLAogICAgICAgIGxhYmVsOiBzY3JpcHROYW1lLAogICAgICAgIGNvbW1hbmQ6ICJwbnBtIiwKICAgICAgICBhcmdzOiBbInJ1biIsIHNjcmlwdE5hbWVdLAogICAgICAgIG1ldGFkYXRhOiB7IHNjcmlwdE5hbWUgfQogICAgICB9OwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJydW4tcHJvY2VzcyIsIHsKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlLAogICAgICAgIGRldGFpbAogICAgICB9KSk7CiAgICB9CiAgICAvLyA9PT09PT09PT09IFBhY2thZ2UgQ2hlY2tlciA9PT09PT09PT09CiAgICBhc3luYyBjaGVja1BhY2thZ2VzKCkgewogICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKICAgICAgICB0aGlzLnBhY2thZ2VTdGF0dXMgPSAiaWRsZSI7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcGFja2FnZUpzb25FeGlzdHMgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LmV4aXN0cygiL3BhY2thZ2UuanNvbiIpOwogICAgICAgIGlmICghcGFja2FnZUpzb25FeGlzdHMpIHsKICAgICAgICAgIHRoaXMucGFja2FnZVN0YXR1cyA9ICJpZGxlIjsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5wYWNrYWdlU3RhdHVzID0gImNoZWNraW5nIjsKICAgICAgICB0aGlzLmlzQ2hlY2tpbmdQYWNrYWdlcyA9IHRydWU7CiAgICAgICAgY29uc3QgcHJvY2VzczQgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnNwYXduKCJwbnBtIiwgWyJvdXRkYXRlZCIsICItLWpzb24iXSk7CiAgICAgICAgbGV0IG91dHB1dCA9ICIiOwogICAgICAgIGNvbnN0IG91dHB1dFJlYWRlciA9IHByb2Nlc3M0Lm91dHB1dC5nZXRSZWFkZXIoKTsKICAgICAgICBjb25zdCByZWFkT3V0cHV0ID0gYXN5bmMgKCkgPT4gewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlOiB2YWx1ZTIgfSA9IGF3YWl0IG91dHB1dFJlYWRlci5yZWFkKCk7CiAgICAgICAgICAgICAgaWYgKGRvbmUpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBvdXRwdXQgKz0gdmFsdWUyOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJlYWRPdXRwdXQoKTsKICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IFByb21pc2UucmFjZShbCiAgICAgICAgICBwcm9jZXNzNC5leGl0LAogICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUyKC0xKSwgMWU0KSkKICAgICAgICBdKTsKICAgICAgICB0cnkgewogICAgICAgICAgYXdhaXQgb3V0cHV0UmVhZGVyLmNhbmNlbCgpOwogICAgICAgIH0gY2F0Y2ggewogICAgICAgIH0KICAgICAgICBpZiAoZXhpdENvZGUgPT09IC0xKSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oIlBhY2thZ2UgY2hlY2sgdGltZWQgb3V0Iik7CiAgICAgICAgICB0aGlzLnBhY2thZ2VTdGF0dXMgPSAiZXJyb3IiOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoZXhpdENvZGUgPT09IDApIHsKICAgICAgICAgIHRoaXMucGFja2FnZVN0YXR1cyA9ICJ1cC10by1kYXRlIjsKICAgICAgICAgIHRoaXMub3V0ZGF0ZWRQYWNrYWdlcyA9IFtdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBvdXRkYXRlZERhdGEgPSBKU09OLnBhcnNlKG91dHB1dCk7CiAgICAgICAgICAgIHRoaXMub3V0ZGF0ZWRQYWNrYWdlcyA9IHRoaXMucGFyc2VPdXRkYXRlZFBhY2thZ2VzKG91dGRhdGVkRGF0YSk7CiAgICAgICAgICAgIHRoaXMucGFja2FnZVN0YXR1cyA9IHRoaXMub3V0ZGF0ZWRQYWNrYWdlcy5sZW5ndGggPiAwID8gInVwZGF0ZXMtYXZhaWxhYmxlIiA6ICJ1cC10by1kYXRlIjsKICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICB0aGlzLnBhY2thZ2VTdGF0dXMgPSAidXBkYXRlcy1hdmFpbGFibGUiOwogICAgICAgICAgICB0aGlzLm91dGRhdGVkUGFja2FnZXMgPSBbXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJGYWlsZWQgdG8gY2hlY2sgZm9yIHBhY2thZ2UgdXBkYXRlczoiLCBlcnJvcik7CiAgICAgICAgdGhpcy5wYWNrYWdlU3RhdHVzID0gImVycm9yIjsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0aGlzLmlzQ2hlY2tpbmdQYWNrYWdlcyA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBwYXJzZU91dGRhdGVkUGFja2FnZXMoZGF0YSkgewogICAgICBjb25zdCBwYWNrYWdlcyA9IFtdOwogICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICJvYmplY3QiICYmIGRhdGEgIT09IG51bGwpIHsKICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBpbmZvXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkgewogICAgICAgICAgY29uc3QgcGtnSW5mbyA9IGluZm87CiAgICAgICAgICBwYWNrYWdlcy5wdXNoKHsKICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgY3VycmVudDogcGtnSW5mby5jdXJyZW50IHx8ICJ1bmtub3duIiwKICAgICAgICAgICAgd2FudGVkOiBwa2dJbmZvLndhbnRlZCB8fCBwa2dJbmZvLmN1cnJlbnQgfHwgInVua25vd24iLAogICAgICAgICAgICBsYXRlc3Q6IHBrZ0luZm8ubGF0ZXN0IHx8IHBrZ0luZm8ud2FudGVkIHx8ICJ1bmtub3duIiwKICAgICAgICAgICAgdHlwZTogcGtnSW5mby5kZXBlbmRlbmN5VHlwZSA9PT0gImRldkRlcGVuZGVuY2llcyIgPyAiZGV2RGVwZW5kZW5jaWVzIiA6ICJkZXBlbmRlbmNpZXMiCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHBhY2thZ2VzOwogICAgfQogICAgYXN5bmMgaGFuZGxlUGFja2FnZUNsaWNrKGUxMSkgewogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIGNvbnN0IG1lbnVJdGVtcyA9IFtdOwogICAgICBtZW51SXRlbXMucHVzaCh7CiAgICAgICAgbmFtZTogdGhpcy5pc0NoZWNraW5nUGFja2FnZXMgPyAiQ2hlY2tpbmcuLi4iIDogIkNoZWNrIGZvciB1cGRhdGVzIiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpyZWZyZXNoQ3ciLAogICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgaWYgKHRoaXMuaXNDaGVja2luZ1BhY2thZ2VzKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjb25zdCBkZXRhaWwgPSB7CiAgICAgICAgICAgIHR5cGU6ICJwYWNrYWdlLXVwZGF0ZSIsCiAgICAgICAgICAgIGxhYmVsOiAiY2hlY2sgcGFja2FnZXMiLAogICAgICAgICAgICBjb21tYW5kOiAicG5wbSIsCiAgICAgICAgICAgIGFyZ3M6IFsib3V0ZGF0ZWQiXQogICAgICAgICAgfTsKICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInJ1bi1wcm9jZXNzIiwgewogICAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgICBjb21wb3NlZDogdHJ1ZSwKICAgICAgICAgICAgZGV0YWlsCiAgICAgICAgICB9KSk7CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2hlY2tQYWNrYWdlcygpLCAzZTMpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGlmICh0aGlzLm91dGRhdGVkUGFja2FnZXMubGVuZ3RoID4gMCkgewogICAgICAgIG1lbnVJdGVtcy5wdXNoKHsgZGl2aWRlcjogdHJ1ZSB9KTsKICAgICAgICBjb25zdCBkaXNwbGF5UGFja2FnZXMgPSB0aGlzLm91dGRhdGVkUGFja2FnZXMuc2xpY2UoMCwgMTApOwogICAgICAgIGZvciAoY29uc3QgcGtnIG9mIGRpc3BsYXlQYWNrYWdlcykgewogICAgICAgICAgbWVudUl0ZW1zLnB1c2goewogICAgICAgICAgICBuYW1lOiBgJHtwa2cubmFtZX06ICR7cGtnLmN1cnJlbnR9IFx1MjE5MiAke3BrZy5sYXRlc3R9YCwKICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6cGFja2FnZSIsCiAgICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlUGFja2FnZShwa2cubmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5vdXRkYXRlZFBhY2thZ2VzLmxlbmd0aCA+IDEwKSB7CiAgICAgICAgICBtZW51SXRlbXMucHVzaCh7CiAgICAgICAgICAgIG5hbWU6IGAuLi4gYW5kICR7dGhpcy5vdXRkYXRlZFBhY2thZ2VzLmxlbmd0aCAtIDEwfSBtb3JlYCwKICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6bW9yZUhvcml6b250YWwiLAogICAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIG1lbnVJdGVtcy5wdXNoKHsgZGl2aWRlcjogdHJ1ZSB9KTsKICAgICAgICBtZW51SXRlbXMucHVzaCh7CiAgICAgICAgICBuYW1lOiAiVXBkYXRlIGFsbCBwYWNrYWdlcyIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTphcnJvd1VwQ2lyY2xlIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUFsbFBhY2thZ2VzKCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgYXdhaXQgRGVlc0NvbnRleHRtZW51Lm9wZW5Db250ZXh0TWVudVdpdGhPcHRpb25zKGUxMSwgbWVudUl0ZW1zKTsKICAgIH0KICAgIGFzeW5jIHVwZGF0ZVBhY2thZ2UocGFja2FnZU5hbWUpIHsKICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5wZW5kaW5nUGFja2FnZVVwZGF0ZSA9IHRydWU7CiAgICAgIGNvbnN0IGRldGFpbCA9IHsKICAgICAgICB0eXBlOiAicGFja2FnZS11cGRhdGUiLAogICAgICAgIGxhYmVsOiBgdXBkYXRlICR7cGFja2FnZU5hbWV9YCwKICAgICAgICBjb21tYW5kOiAicG5wbSIsCiAgICAgICAgYXJnczogWyJ1cGRhdGUiLCAiLS1sYXRlc3QiLCBwYWNrYWdlTmFtZV0sCiAgICAgICAgbWV0YWRhdGE6IHsgcGFja2FnZU5hbWUgfQogICAgICB9OwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJydW4tcHJvY2VzcyIsIHsKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlLAogICAgICAgIGRldGFpbAogICAgICB9KSk7CiAgICB9CiAgICBhc3luYyB1cGRhdGVBbGxQYWNrYWdlcygpIHsKICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5wZW5kaW5nUGFja2FnZVVwZGF0ZSA9IHRydWU7CiAgICAgIGNvbnN0IGRldGFpbCA9IHsKICAgICAgICB0eXBlOiAicGFja2FnZS11cGRhdGUiLAogICAgICAgIGxhYmVsOiAidXBkYXRlIGFsbCIsCiAgICAgICAgY29tbWFuZDogInBucG0iLAogICAgICAgIGFyZ3M6IFsidXBkYXRlIiwgIi0tbGF0ZXN0Il0KICAgICAgfTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgicnVuLXByb2Nlc3MiLCB7CiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZSwKICAgICAgICBkZXRhaWwKICAgICAgfSkpOwogICAgfQogICAgLy8gPT09PT09PT09PSBIZWxwZXIgTWV0aG9kcyA9PT09PT09PT09CiAgICBnZXRQYWNrYWdlU3RhdHVzQ2xhc3MoKSB7CiAgICAgIGlmICh0aGlzLmlzQ2hlY2tpbmdQYWNrYWdlcykKICAgICAgICByZXR1cm4gIiI7CiAgICAgIHJldHVybiB0aGlzLnBhY2thZ2VTdGF0dXM7CiAgICB9CiAgICBnZXRQYWNrYWdlSWNvbigpIHsKICAgICAgaWYgKHRoaXMuaXNDaGVja2luZ1BhY2thZ2VzKQogICAgICAgIHJldHVybiAibHVjaWRlOmxvYWRlcjIiOwogICAgICBzd2l0Y2ggKHRoaXMucGFja2FnZVN0YXR1cykgewogICAgICAgIGNhc2UgInVwLXRvLWRhdGUiOgogICAgICAgICAgcmV0dXJuICJsdWNpZGU6Y2hlY2tDaXJjbGUiOwogICAgICAgIGNhc2UgInVwZGF0ZXMtYXZhaWxhYmxlIjoKICAgICAgICAgIHJldHVybiAibHVjaWRlOmFsZXJ0Q2lyY2xlIjsKICAgICAgICBjYXNlICJlcnJvciI6CiAgICAgICAgICByZXR1cm4gImx1Y2lkZTp4Q2lyY2xlIjsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuICJsdWNpZGU6cGFja2FnZSI7CiAgICAgIH0KICAgIH0KICAgIGdldFBhY2thZ2VTdGF0dXNUZXh0KCkgewogICAgICBpZiAodGhpcy5pc0NoZWNraW5nUGFja2FnZXMpCiAgICAgICAgcmV0dXJuICJDaGVja2luZy4uLiI7CiAgICAgIHN3aXRjaCAodGhpcy5wYWNrYWdlU3RhdHVzKSB7CiAgICAgICAgY2FzZSAidXAtdG8tZGF0ZSI6CiAgICAgICAgICByZXR1cm4gIlVwIHRvIGRhdGUiOwogICAgICAgIGNhc2UgInVwZGF0ZXMtYXZhaWxhYmxlIjoKICAgICAgICAgIHJldHVybiBgJHt0aGlzLm91dGRhdGVkUGFja2FnZXMubGVuZ3RofSB1cGRhdGUke3RoaXMub3V0ZGF0ZWRQYWNrYWdlcy5sZW5ndGggIT09IDEgPyAicyIgOiAiIn1gOwogICAgICAgIGNhc2UgImVycm9yIjoKICAgICAgICAgIHJldHVybiAiQ2hlY2sgZmFpbGVkIjsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuICJQYWNrYWdlcyI7CiAgICAgIH0KICAgIH0KICAgIGdldFBhY2thZ2VUb29sdGlwKCkgewogICAgICBpZiAodGhpcy5pc0NoZWNraW5nUGFja2FnZXMpCiAgICAgICAgcmV0dXJuICJDaGVja2luZyBmb3IgcGFja2FnZSB1cGRhdGVzLi4uIjsKICAgICAgc3dpdGNoICh0aGlzLnBhY2thZ2VTdGF0dXMpIHsKICAgICAgICBjYXNlICJ1cC10by1kYXRlIjoKICAgICAgICAgIHJldHVybiAiQWxsIHBhY2thZ2VzIGFyZSB1cCB0byBkYXRlIjsKICAgICAgICBjYXNlICJ1cGRhdGVzLWF2YWlsYWJsZSI6CiAgICAgICAgICByZXR1cm4gYCR7dGhpcy5vdXRkYXRlZFBhY2thZ2VzLmxlbmd0aH0gcGFja2FnZSB1cGRhdGUke3RoaXMub3V0ZGF0ZWRQYWNrYWdlcy5sZW5ndGggIT09IDEgPyAicyIgOiAiIn0gYXZhaWxhYmxlYDsKICAgICAgICBjYXNlICJlcnJvciI6CiAgICAgICAgICByZXR1cm4gIkZhaWxlZCB0byBjaGVjayBmb3IgdXBkYXRlcy4gQ2xpY2sgdG8gcmV0cnkuIjsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuICJDbGljayB0byBjaGVjayBmb3IgcGFja2FnZSB1cGRhdGVzIjsKICAgICAgfQogICAgfQogICAgLy8gPT09PT09PT09PSBQdWJsaWMgTWV0aG9kcyA9PT09PT09PT09CiAgICAvKioKICAgICAqIE1hbnVhbGx5IHRyaWdnZXIgYSBwYWNrYWdlIGNoZWNrCiAgICAgKi8KICAgIGFzeW5jIHJlZnJlc2hQYWNrYWdlU3RhdHVzKCkgewogICAgICBhd2FpdCB0aGlzLmNoZWNrUGFja2FnZXMoKTsKICAgIH0KICAgIC8qKgogICAgICogTWFudWFsbHkgcmVsb2FkIHNjcmlwdHMgZnJvbSBwYWNrYWdlLmpzb24KICAgICAqLwogICAgYXN5bmMgcmVmcmVzaFNjcmlwdHMoKSB7CiAgICAgIGF3YWl0IHRoaXMubG9hZFNjcmlwdHMoKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzOTUoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNXb3Jrc3BhY2VCb3R0b21iYXIyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC13b3Jrc3BhY2UvZGVlcy13b3Jrc3BhY2UvdHlwZXNjcmlwdC1pbnRlbGxpc2Vuc2UuanMKdmFyIFR5cGVTY3JpcHRJbnRlbGxpU2Vuc2VNYW5hZ2VyID0gY2xhc3MgewogIGxvYWRlZExpYnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogIG5vdEZvdW5kUGFja2FnZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogIC8vIFBhY2thZ2VzIGNoZWNrZWQgYnV0IG5vdCBmb3VuZAogIG1vbmFjb0luc3RhbmNlID0gbnVsbDsKICBleGVjdXRpb25FbnZpcm9ubWVudCA9IG51bGw7CiAgLy8gQ2FjaGUgb2YgZmlsZSBjb250ZW50cyBmb3Igc3luY2hyb25vdXMgYWNjZXNzIGFuZCBtb2R1bGUgcmVzb2x1dGlvbgogIGZpbGVDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgLy8gVHJhY2sgZXh0cmEgbGlicyBhZGRlZCBmb3IgY2xlYW51cAogIGFkZGVkRXh0cmFMaWJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAvKioKICAgKiBHZXQgVHlwZVNjcmlwdCBBUEkgd2l0aCBwcm9wZXIgdHlwaW5nIGZvciBNb25hY28gMC41NSsKICAgKi8KICBnZXQgdHNBcGkoKSB7CiAgICBpZiAoIXRoaXMubW9uYWNvSW5zdGFuY2UpCiAgICAgIHJldHVybiBudWxsOwogICAgcmV0dXJuIHRoaXMubW9uYWNvSW5zdGFuY2UubGFuZ3VhZ2VzLnR5cGVzY3JpcHQ7CiAgfQogIC8qKgogICAqIEluaXRpYWxpemUgd2l0aCBNb25hY28gYW5kIGV4ZWN1dGlvbiBlbnZpcm9ubWVudAogICAqLwogIGFzeW5jIGluaXQobW9uYWNvSW5zdCwgZW52MikgewogICAgdGhpcy5tb25hY29JbnN0YW5jZSA9IG1vbmFjb0luc3Q7CiAgICB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50ID0gZW52MjsKICAgIHRoaXMuY29uZmlndXJlQ29tcGlsZXJPcHRpb25zKCk7CiAgICBhd2FpdCB0aGlzLmxvYWRBbGxQcm9qZWN0RmlsZXMoKTsKICB9CiAgLyoqCiAgICogUmVjdXJzaXZlbHkgbG9hZCBhbGwgLnRzLy5qcyBmaWxlcyBmcm9tIHRoZSB2aXJ0dWFsIGZpbGVzeXN0ZW0gaW50byBNb25hY28KICAgKi8KICBhc3luYyBsb2FkQWxsUHJvamVjdEZpbGVzKCkgewogICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICByZXR1cm47CiAgICBhd2FpdCB0aGlzLmxvYWRGaWxlc0Zyb21EaXJlY3RvcnkoIi8iKTsKICB9CiAgLyoqCiAgICogUmVjdXJzaXZlbHkgbG9hZCBmaWxlcyBmcm9tIGEgZGlyZWN0b3J5CiAgICovCiAgYXN5bmMgbG9hZEZpbGVzRnJvbURpcmVjdG9yeShkaXJQYXRoKSB7CiAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpCiAgICAgIHJldHVybjsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnJlYWREaXIoZGlyUGF0aCk7CiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykgewogICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gZGlyUGF0aCA9PT0gIi8iID8gYC8ke2VudHJ5Lm5hbWV9YCA6IGAke2RpclBhdGh9LyR7ZW50cnkubmFtZX1gOwogICAgICAgIGlmIChlbnRyeS5uYW1lID09PSAibm9kZV9tb2R1bGVzIikKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGlmIChlbnRyeS50eXBlID09PSAiZGlyZWN0b3J5IikgewogICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRmlsZXNGcm9tRGlyZWN0b3J5KGZ1bGxQYXRoKTsKICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LnR5cGUgPT09ICJmaWxlIikgewogICAgICAgICAgY29uc3QgZXh0ID0gZW50cnkubmFtZS5zcGxpdCgiLiIpLnBvcCgpPy50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgaWYgKGV4dCA9PT0gInRzIiB8fCBleHQgPT09ICJ0c3giIHx8IGV4dCA9PT0gImpzIiB8fCBleHQgPT09ICJqc3giKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgY29uc3QgY29udGVudDMgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnJlYWRGaWxlKGZ1bGxQYXRoKTsKICAgICAgICAgICAgICB0aGlzLmFkZEZpbGVNb2RlbChmdWxsUGF0aCwgY29udGVudDMpOwogICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBjYXRjaCB7CiAgICB9CiAgfQogIGNvbmZpZ3VyZUNvbXBpbGVyT3B0aW9ucygpIHsKICAgIGNvbnN0IHRzID0gdGhpcy50c0FwaTsKICAgIGlmICghdHMpCiAgICAgIHJldHVybjsKICAgIHRzLnR5cGVzY3JpcHREZWZhdWx0cy5zZXRDb21waWxlck9wdGlvbnMoewogICAgICB0YXJnZXQ6IHRzLlNjcmlwdFRhcmdldC5FUzIwMjAsCiAgICAgIG1vZHVsZTogdHMuTW9kdWxlS2luZC5FU05leHQsCiAgICAgIC8vIFVzZSBCdW5kbGVyIHJlc29sdXRpb24gaWYgYXZhaWxhYmxlIChNb25hY28gMC40NSspLCBmYWxsYmFjayB0byBOb2RlSnMKICAgICAgbW9kdWxlUmVzb2x1dGlvbjogdHMuTW9kdWxlUmVzb2x1dGlvbktpbmQuQnVuZGxlciA/PyB0cy5Nb2R1bGVSZXNvbHV0aW9uS2luZC5Ob2RlSnMsCiAgICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsCiAgICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwKICAgICAgc3RyaWN0OiB0cnVlLAogICAgICBub0VtaXQ6IHRydWUsCiAgICAgIGFsbG93SnM6IHRydWUsCiAgICAgIGNoZWNrSnM6IGZhbHNlLAogICAgICBhbGxvd05vblRzRXh0ZW5zaW9uczogdHJ1ZSwKICAgICAgbGliOiBbImVzMjAyMCIsICJkb20iLCAiZG9tLml0ZXJhYmxlIl0sCiAgICAgIC8vIFNldCBiYXNlVXJsIHRvIHJvb3QgZm9yIHJlc29sdmluZyBhYnNvbHV0ZSBpbXBvcnRzCiAgICAgIGJhc2VVcmw6ICIvIiwKICAgICAgLy8gQWxsb3cgaW1wb3J0aW5nIC50cyBleHRlbnNpb25zIGRpcmVjdGx5ICh1c2VmdWwgZm9yIHNvbWUgc2V0dXBzKQogICAgICBhbGxvd0ltcG9ydGluZ1RzRXh0ZW5zaW9uczogdHJ1ZSwKICAgICAgLy8gUmVzb2x2ZSBKU09OIG1vZHVsZXMKICAgICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUKICAgIH0pOwogICAgdHMudHlwZXNjcmlwdERlZmF1bHRzLnNldERpYWdub3N0aWNzT3B0aW9ucyh7CiAgICAgIG5vU2VtYW50aWNWYWxpZGF0aW9uOiBmYWxzZSwKICAgICAgbm9TeW50YXhWYWxpZGF0aW9uOiBmYWxzZQogICAgfSk7CiAgICB0cy50eXBlc2NyaXB0RGVmYXVsdHMuc2V0RWFnZXJNb2RlbFN5bmModHJ1ZSk7CiAgfQogIC8qKgogICAqIFBhcnNlIGltcG9ydHMgZnJvbSBUeXBlU2NyaXB0L0phdmFTY3JpcHQgY29udGVudAogICAqLwogIHBhcnNlSW1wb3J0cyhjb250ZW50MykgewogICAgY29uc3QgaW1wb3J0cyA9IFtdOwogICAgY29uc3QgaW1wb3J0UmVnZXggPSAvaW1wb3J0XHMrKD86W1x3Knt9XHMsXStmcm9tXHMrKT9bJyJdKFteJyJdKylbJyJdL2c7CiAgICBsZXQgbWF0Y2gyOwogICAgd2hpbGUgKChtYXRjaDIgPSBpbXBvcnRSZWdleC5leGVjKGNvbnRlbnQzKSkgIT09IG51bGwpIHsKICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IG1hdGNoMlsxXTsKICAgICAgaWYgKCFpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoIi4iKSAmJiAhaW1wb3J0UGF0aC5zdGFydHNXaXRoKCIvIikpIHsKICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGltcG9ydFBhdGguc3RhcnRzV2l0aCgiQCIpID8gaW1wb3J0UGF0aC5zcGxpdCgiLyIpLnNsaWNlKDAsIDIpLmpvaW4oIi8iKSA6IGltcG9ydFBhdGguc3BsaXQoIi8iKVswXTsKICAgICAgICBpbXBvcnRzLnB1c2gocGFja2FnZU5hbWUpOwogICAgICB9CiAgICB9CiAgICBjb25zdCByZXF1aXJlUmVnZXggPSAvcmVxdWlyZVxzKlwoXHMqWyciXShbXiciXSspWyciXVxzKlwpL2c7CiAgICB3aGlsZSAoKG1hdGNoMiA9IHJlcXVpcmVSZWdleC5leGVjKGNvbnRlbnQzKSkgIT09IG51bGwpIHsKICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IG1hdGNoMlsxXTsKICAgICAgaWYgKCFpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoIi4iKSAmJiAhaW1wb3J0UGF0aC5zdGFydHNXaXRoKCIvIikpIHsKICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGltcG9ydFBhdGguc3RhcnRzV2l0aCgiQCIpID8gaW1wb3J0UGF0aC5zcGxpdCgiLyIpLnNsaWNlKDAsIDIpLmpvaW4oIi8iKSA6IGltcG9ydFBhdGguc3BsaXQoIi8iKVswXTsKICAgICAgICBpbXBvcnRzLnB1c2gocGFja2FnZU5hbWUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gWy4uLm5ldyBTZXQoaW1wb3J0cyldOwogIH0KICAvKioKICAgKiBMb2FkIHR5cGUgZGVmaW5pdGlvbnMgZm9yIGEgcGFja2FnZSBmcm9tIHZpcnR1YWwgRlMKICAgKi8KICBhc3luYyBsb2FkVHlwZXNGb3JQYWNrYWdlKHBhY2thZ2VOYW1lKSB7CiAgICBpZiAoIXRoaXMubW9uYWNvSW5zdGFuY2UgfHwgIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpCiAgICAgIHJldHVybjsKICAgIGlmICh0aGlzLmxvYWRlZExpYnMuaGFzKHBhY2thZ2VOYW1lKSkKICAgICAgcmV0dXJuOwogICAgaWYgKHRoaXMubm90Rm91bmRQYWNrYWdlcy5oYXMocGFja2FnZU5hbWUpKQogICAgICByZXR1cm47CiAgICB0cnkgewogICAgICBsZXQgdHlwZXNMb2FkZWQgPSBhd2FpdCB0aGlzLnRyeUxvYWRQYWNrYWdlVHlwZXMocGFja2FnZU5hbWUpOwogICAgICBpZiAoIXR5cGVzTG9hZGVkKSB7CiAgICAgICAgdHlwZXNMb2FkZWQgPSBhd2FpdCB0aGlzLnRyeUxvYWRBdFR5cGVzUGFja2FnZShwYWNrYWdlTmFtZSk7CiAgICAgIH0KICAgICAgaWYgKHR5cGVzTG9hZGVkKSB7CiAgICAgICAgdGhpcy5sb2FkZWRMaWJzLmFkZChwYWNrYWdlTmFtZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5ub3RGb3VuZFBhY2thZ2VzLmFkZChwYWNrYWdlTmFtZSk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGxvYWQgdHlwZXMgZm9yICR7cGFja2FnZU5hbWV9OmAsIGVycm9yKTsKICAgIH0KICB9CiAgYXN5bmMgdHJ5TG9hZFBhY2thZ2VUeXBlcyhwYWNrYWdlTmFtZSkgewogICAgY29uc3QgdHMgPSB0aGlzLnRzQXBpOwogICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50IHx8ICF0cykKICAgICAgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgYmFzZVBhdGggPSBgL25vZGVfbW9kdWxlcy8ke3BhY2thZ2VOYW1lfWA7CiAgICB0cnkgewogICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBgJHtiYXNlUGF0aH0vcGFja2FnZS5qc29uYDsKICAgICAgY29uc3QgcGFja2FnZUpzb25FeGlzdHMgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LmV4aXN0cyhwYWNrYWdlSnNvblBhdGgpOwogICAgICBpZiAocGFja2FnZUpzb25FeGlzdHMpIHsKICAgICAgICBjb25zdCBwYWNrYWdlSnNvbkNvbnRlbnQgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCk7CiAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uQ29udGVudCk7CiAgICAgICAgdHMudHlwZXNjcmlwdERlZmF1bHRzLmFkZEV4dHJhTGliKHBhY2thZ2VKc29uQ29udGVudCwgYGZpbGU6Ly8ke3BhY2thZ2VKc29uUGF0aH1gKTsKICAgICAgICBjb25zdCB0eXBlc1BhdGggPSBwYWNrYWdlSnNvbi50eXBlcyB8fCBwYWNrYWdlSnNvbi50eXBpbmdzOwogICAgICAgIGlmICh0eXBlc1BhdGgpIHsKICAgICAgICAgIGF3YWl0IHRoaXMubG9hZEFsbER0c0ZpbGVzRnJvbVBhY2thZ2UoYmFzZVBhdGgpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IGNvbW1vblBhdGhzID0gWwogICAgICAgIGAke2Jhc2VQYXRofS9pbmRleC5kLnRzYCwKICAgICAgICBgJHtiYXNlUGF0aH0vZGlzdC9pbmRleC5kLnRzYCwKICAgICAgICBgJHtiYXNlUGF0aH0vbGliL2luZGV4LmQudHNgCiAgICAgIF07CiAgICAgIGZvciAoY29uc3QgZHRzUGF0aCBvZiBjb21tb25QYXRocykgewogICAgICAgIGlmIChhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LmV4aXN0cyhkdHNQYXRoKSkgewogICAgICAgICAgYXdhaXQgdGhpcy5sb2FkQWxsRHRzRmlsZXNGcm9tUGFja2FnZShiYXNlUGF0aCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGxvYWQgcGFja2FnZSB0eXBlcyBmb3IgJHtwYWNrYWdlTmFtZX06YCwgZXJyb3IpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIC8qKgogICAqIFJlY3Vyc2l2ZWx5IGxvYWQgYWxsIC5kLnRzIGZpbGVzIGZyb20gYSBwYWNrYWdlIGRpcmVjdG9yeQogICAqLwogIGFzeW5jIGxvYWRBbGxEdHNGaWxlc0Zyb21QYWNrYWdlKGJhc2VQYXRoKSB7CiAgICBjb25zdCB0cyA9IHRoaXMudHNBcGk7CiAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQgfHwgIXRzKQogICAgICByZXR1cm47CiAgICBhd2FpdCB0aGlzLmxvYWREdHNGaWxlc0Zyb21EaXJlY3RvcnkoYmFzZVBhdGgpOwogIH0KICAvKioKICAgKiBSZWN1cnNpdmVseSBsb2FkIC5kLnRzIGZpbGVzIGZyb20gYSBkaXJlY3RvcnkKICAgKi8KICBhc3luYyBsb2FkRHRzRmlsZXNGcm9tRGlyZWN0b3J5KGRpclBhdGgpIHsKICAgIGNvbnN0IHRzID0gdGhpcy50c0FwaTsKICAgIGlmICghdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCB8fCAhdHMpCiAgICAgIHJldHVybjsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnJlYWREaXIoZGlyUGF0aCk7CiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykgewogICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gZGlyUGF0aCA9PT0gIi8iID8gYC8ke2VudHJ5Lm5hbWV9YCA6IGAke2RpclBhdGh9LyR7ZW50cnkubmFtZX1gOwogICAgICAgIGlmIChlbnRyeS5uYW1lID09PSAibm9kZV9tb2R1bGVzIikKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGlmIChlbnRyeS50eXBlID09PSAiZGlyZWN0b3J5IikgewogICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRHRzRmlsZXNGcm9tRGlyZWN0b3J5KGZ1bGxQYXRoKTsKICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LnR5cGUgPT09ICJmaWxlIiAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKCIuZC50cyIpKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBjb250ZW50MyA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZEZpbGUoZnVsbFBhdGgpOwogICAgICAgICAgICB0cy50eXBlc2NyaXB0RGVmYXVsdHMuYWRkRXh0cmFMaWIoY29udGVudDMsIGBmaWxlOi8vJHtmdWxsUGF0aH1gKTsKICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBjYXRjaCB7CiAgICB9CiAgfQogIGFzeW5jIHRyeUxvYWRBdFR5cGVzUGFja2FnZShwYWNrYWdlTmFtZSkgewogICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICByZXR1cm4gZmFsc2U7CiAgICBjb25zdCB0eXBlc1BhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUuc3RhcnRzV2l0aCgiQCIpID8gYEB0eXBlcy8ke3BhY2thZ2VOYW1lLnNsaWNlKDEpLnJlcGxhY2UoIi8iLCAiX18iKX1gIDogYEB0eXBlcy8ke3BhY2thZ2VOYW1lfWA7CiAgICBjb25zdCBiYXNlUGF0aCA9IGAvbm9kZV9tb2R1bGVzLyR7dHlwZXNQYWNrYWdlTmFtZX1gOwogICAgdHJ5IHsKICAgICAgY29uc3QgaW5kZXhQYXRoID0gYCR7YmFzZVBhdGh9L2luZGV4LmQudHNgOwogICAgICBpZiAoYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5leGlzdHMoaW5kZXhQYXRoKSkgewogICAgICAgIGF3YWl0IHRoaXMubG9hZEFsbER0c0ZpbGVzRnJvbVBhY2thZ2UoYmFzZVBhdGgpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gY2F0Y2ggewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIC8qKgogICAqIFByb2Nlc3MgY29udGVudCBjaGFuZ2UgYW5kIGxvYWQgdHlwZXMgZm9yIGFueSBuZXcgaW1wb3J0cwogICAqLwogIGFzeW5jIHByb2Nlc3NDb250ZW50Q2hhbmdlKGNvbnRlbnQzKSB7CiAgICBjb25zdCBpbXBvcnRzID0gdGhpcy5wYXJzZUltcG9ydHMoY29udGVudDMpOwogICAgZm9yIChjb25zdCBwYWNrYWdlTmFtZSBvZiBpbXBvcnRzKSB7CiAgICAgIGlmICghdGhpcy5sb2FkZWRMaWJzLmhhcyhwYWNrYWdlTmFtZSkpIHsKICAgICAgICBhd2FpdCB0aGlzLmxvYWRUeXBlc0ZvclBhY2thZ2UocGFja2FnZU5hbWUpOwogICAgICB9CiAgICB9CiAgfQogIC8qKgogICAqIFNjYW4gbm9kZV9tb2R1bGVzIGZvciBwYWNrYWdlcyBhbmQgbG9hZCB0eXBlcyBmb3IgYW55IG5vdCB5ZXQgbG9hZGVkLgogICAqIENhbGxlZCB3aGVuIG5vZGVfbW9kdWxlcyBjaGFuZ2VzIChlLmcuLCBhZnRlciBwbnBtIGluc3RhbGwpLgogICAqLwogIGFzeW5jIHNjYW5BbmRMb2FkTmV3UGFja2FnZVR5cGVzKCkgewogICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICByZXR1cm47CiAgICB0aGlzLm5vdEZvdW5kUGFja2FnZXMuY2xlYXIoKTsKICAgIHRyeSB7CiAgICAgIGlmICghYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5leGlzdHMoIi9ub2RlX21vZHVsZXMiKSkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnJlYWREaXIoIi9ub2RlX21vZHVsZXMiKTsKICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7CiAgICAgICAgaWYgKGVudHJ5LnR5cGUgIT09ICJkaXJlY3RvcnkiKQogICAgICAgICAgY29udGludWU7CiAgICAgICAgaWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgiQCIpKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBzY29wZWRQYXRoID0gYC9ub2RlX21vZHVsZXMvJHtlbnRyeS5uYW1lfWA7CiAgICAgICAgICAgIGNvbnN0IHNjb3BlZEVudHJpZXMgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnJlYWREaXIoc2NvcGVkUGF0aCk7CiAgICAgICAgICAgIGZvciAoY29uc3Qgc2NvcGVkRW50cnkgb2Ygc2NvcGVkRW50cmllcykgewogICAgICAgICAgICAgIGlmIChzY29wZWRFbnRyeS50eXBlID09PSAiZGlyZWN0b3J5IikgewogICAgICAgICAgICAgICAgY29uc3QgcGFja2FnZU5hbWUgPSBgJHtlbnRyeS5uYW1lfS8ke3Njb3BlZEVudHJ5Lm5hbWV9YDsKICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFR5cGVzRm9yUGFja2FnZShwYWNrYWdlTmFtZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCFlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoIi4iKSkgewogICAgICAgICAgYXdhaXQgdGhpcy5sb2FkVHlwZXNGb3JQYWNrYWdlKGVudHJ5Lm5hbWUpOwogICAgICAgIH0KICAgICAgfQogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS53YXJuKCJGYWlsZWQgdG8gc2NhbiBub2RlX21vZHVsZXM6IiwgZXJyb3IpOwogICAgfQogIH0KICAvKioKICAgKiBBZGQgYSBmaWxlIG1vZGVsIHRvIE1vbmFjbyBmb3IgY3Jvc3MtZmlsZSBJbnRlbGxpU2Vuc2UKICAgKiBBbHNvIHJlZ2lzdGVycyB0aGUgZmlsZSB3aXRoIFR5cGVTY3JpcHQgdmlhIGFkZEV4dHJhTGliIGZvciBtb2R1bGUgcmVzb2x1dGlvbgogICAqLwogIGFkZEZpbGVNb2RlbChwYXRoMiwgY29udGVudDMpIHsKICAgIGlmICghdGhpcy5tb25hY29JbnN0YW5jZSkKICAgICAgcmV0dXJuOwogICAgdGhpcy5maWxlQ2FjaGUuc2V0KHBhdGgyLCBjb250ZW50Myk7CiAgICBjb25zdCB1cmkgPSB0aGlzLm1vbmFjb0luc3RhbmNlLlVyaS5wYXJzZShgZmlsZTovLyR7cGF0aDJ9YCk7CiAgICBjb25zdCBleGlzdGluZ01vZGVsID0gdGhpcy5tb25hY29JbnN0YW5jZS5lZGl0b3IuZ2V0TW9kZWwodXJpKTsKICAgIGlmIChleGlzdGluZ01vZGVsKSB7CiAgICAgIGlmIChleGlzdGluZ01vZGVsLmdldFZhbHVlKCkgIT09IGNvbnRlbnQzKSB7CiAgICAgICAgZXhpc3RpbmdNb2RlbC5zZXRWYWx1ZShjb250ZW50Myk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy5nZXRMYW5ndWFnZUZyb21QYXRoKHBhdGgyKTsKICAgICAgdGhpcy5tb25hY29JbnN0YW5jZS5lZGl0b3IuY3JlYXRlTW9kZWwoY29udGVudDMsIGxhbmd1YWdlLCB1cmkpOwogICAgfQogICAgdGhpcy5hZGRGaWxlQXNFeHRyYUxpYihwYXRoMiwgY29udGVudDMpOwogIH0KICAvKioKICAgKiBBZGQgYSBmaWxlIGFzIGFuIGV4dHJhIGxpYiBmb3IgVHlwZVNjcmlwdCBtb2R1bGUgcmVzb2x1dGlvbi4KICAgKiBUaGlzIGVuYWJsZXMgVHlwZVNjcmlwdCB0byByZXNvbHZlIGltcG9ydHMgdG8gcHJvamVjdCBmaWxlcy4KICAgKi8KICBhZGRGaWxlQXNFeHRyYUxpYihwYXRoMiwgY29udGVudDMpIHsKICAgIGNvbnN0IHRzID0gdGhpcy50c0FwaTsKICAgIGlmICghdHMpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5hZGRlZEV4dHJhTGlicy5nZXQocGF0aDIpOwogICAgaWYgKGV4aXN0aW5nKSB7CiAgICAgIGV4aXN0aW5nLmRpc3Bvc2UoKTsKICAgIH0KICAgIGNvbnN0IGZpbGVQYXRoID0gYGZpbGU6Ly8ke3BhdGgyfWA7CiAgICBjb25zdCBkaXNwb3NhYmxlID0gdHMudHlwZXNjcmlwdERlZmF1bHRzLmFkZEV4dHJhTGliKGNvbnRlbnQzLCBmaWxlUGF0aCk7CiAgICB0aGlzLmFkZGVkRXh0cmFMaWJzLnNldChwYXRoMiwgZGlzcG9zYWJsZSk7CiAgICBpZiAocGF0aDIuZW5kc1dpdGgoIi50cyIpICYmICFwYXRoMi5lbmRzV2l0aCgiLmQudHMiKSkgewogICAgICBjb25zdCBqc1BhdGggPSBwYXRoMi5yZXBsYWNlKC9cLnRzJC8sICIuanMiKTsKICAgICAgY29uc3QganNGaWxlUGF0aCA9IGBmaWxlOi8vJHtqc1BhdGh9YDsKICAgICAgY29uc3QganNEaXNwb3NhYmxlID0gdHMudHlwZXNjcmlwdERlZmF1bHRzLmFkZEV4dHJhTGliKGNvbnRlbnQzLCBqc0ZpbGVQYXRoKTsKICAgICAgdGhpcy5hZGRlZEV4dHJhTGlicy5zZXQoanNQYXRoLCBqc0Rpc3Bvc2FibGUpOwogICAgICB0aGlzLmZpbGVDYWNoZS5zZXQoanNQYXRoLCBjb250ZW50Myk7CiAgICB9IGVsc2UgaWYgKHBhdGgyLmVuZHNXaXRoKCIudHN4IikpIHsKICAgICAgY29uc3QganN4UGF0aCA9IHBhdGgyLnJlcGxhY2UoL1wudHN4JC8sICIuanN4Iik7CiAgICAgIGNvbnN0IGpzeEZpbGVQYXRoID0gYGZpbGU6Ly8ke2pzeFBhdGh9YDsKICAgICAgY29uc3QganN4RGlzcG9zYWJsZSA9IHRzLnR5cGVzY3JpcHREZWZhdWx0cy5hZGRFeHRyYUxpYihjb250ZW50MywganN4RmlsZVBhdGgpOwogICAgICB0aGlzLmFkZGVkRXh0cmFMaWJzLnNldChqc3hQYXRoLCBqc3hEaXNwb3NhYmxlKTsKICAgICAgdGhpcy5maWxlQ2FjaGUuc2V0KGpzeFBhdGgsIGNvbnRlbnQzKTsKICAgIH0KICB9CiAgLyoqCiAgICogR2V0IGNhY2hlZCBmaWxlIGNvbnRlbnQgZm9yIHN5bmNocm9ub3VzIGFjY2VzcwogICAqLwogIGdldEZpbGVDb250ZW50KHBhdGgyKSB7CiAgICByZXR1cm4gdGhpcy5maWxlQ2FjaGUuZ2V0KHBhdGgyKTsKICB9CiAgZ2V0TGFuZ3VhZ2VGcm9tUGF0aChwYXRoMikgewogICAgY29uc3QgZXh0ID0gcGF0aDIuc3BsaXQoIi4iKS5wb3AoKT8udG9Mb3dlckNhc2UoKTsKICAgIHN3aXRjaCAoZXh0KSB7CiAgICAgIGNhc2UgInRzIjoKICAgICAgY2FzZSAidHN4IjoKICAgICAgICByZXR1cm4gInR5cGVzY3JpcHQiOwogICAgICBjYXNlICJqcyI6CiAgICAgIGNhc2UgImpzeCI6CiAgICAgICAgcmV0dXJuICJqYXZhc2NyaXB0IjsKICAgICAgY2FzZSAianNvbiI6CiAgICAgICAgcmV0dXJuICJqc29uIjsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gInBsYWludGV4dCI7CiAgICB9CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXdvcmtzcGFjZS9kZWVzLXdvcmtzcGFjZS1kaWZmLWVkaXRvci9kZWVzLXdvcmtzcGFjZS1kaWZmLWVkaXRvci5qcwppbml0X2Rpc3RfdHMyNigpOwppbml0X2Rpc3RfdHMyNSgpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU5NSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzOTYgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNXb3Jrc3BhY2VEaWZmRWRpdG9yID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFt0NCgiZGVlcy13b3Jrc3BhY2UtZGlmZi1lZGl0b3IiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9vcmlnaW5hbENvbnRlbnRfZGVjb3JhdG9yczsKICBsZXQgX29yaWdpbmFsQ29udGVudF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX29yaWdpbmFsQ29udGVudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW9kaWZpZWRDb250ZW50X2RlY29yYXRvcnM7CiAgbGV0IF9tb2RpZmllZENvbnRlbnRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tb2RpZmllZENvbnRlbnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX29yaWdpbmFsTGFiZWxfZGVjb3JhdG9yczsKICBsZXQgX29yaWdpbmFsTGFiZWxfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vcmlnaW5hbExhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tb2RpZmllZExhYmVsX2RlY29yYXRvcnM7CiAgbGV0IF9tb2RpZmllZExhYmVsX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW9kaWZpZWRMYWJlbF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGFuZ3VhZ2VfZGVjb3JhdG9yczsKICBsZXQgX2xhbmd1YWdlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGFuZ3VhZ2VfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ZpbGVQYXRoX2RlY29yYXRvcnM7CiAgbGV0IF9maWxlUGF0aF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ZpbGVQYXRoX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNXb3Jrc3BhY2VEaWZmRWRpdG9yMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX29yaWdpbmFsQ29udGVudF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX21vZGlmaWVkQ29udGVudF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX29yaWdpbmFsTGFiZWxfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9tb2RpZmllZExhYmVsX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfbGFuZ3VhZ2VfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9maWxlUGF0aF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX19lc0RlY29yYXRlOTUodGhpcywgbnVsbCwgX29yaWdpbmFsQ29udGVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJvcmlnaW5hbENvbnRlbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm9yaWdpbmFsQ29udGVudCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5vcmlnaW5hbENvbnRlbnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm9yaWdpbmFsQ29udGVudCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9vcmlnaW5hbENvbnRlbnRfaW5pdGlhbGl6ZXJzLCBfb3JpZ2luYWxDb250ZW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTUodGhpcywgbnVsbCwgX21vZGlmaWVkQ29udGVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtb2RpZmllZENvbnRlbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1vZGlmaWVkQ29udGVudCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tb2RpZmllZENvbnRlbnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1vZGlmaWVkQ29udGVudCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tb2RpZmllZENvbnRlbnRfaW5pdGlhbGl6ZXJzLCBfbW9kaWZpZWRDb250ZW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTUodGhpcywgbnVsbCwgX29yaWdpbmFsTGFiZWxfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAib3JpZ2luYWxMYWJlbCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAib3JpZ2luYWxMYWJlbCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5vcmlnaW5hbExhYmVsLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5vcmlnaW5hbExhYmVsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX29yaWdpbmFsTGFiZWxfaW5pdGlhbGl6ZXJzLCBfb3JpZ2luYWxMYWJlbF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk1KHRoaXMsIG51bGwsIF9tb2RpZmllZExhYmVsX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1vZGlmaWVkTGFiZWwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1vZGlmaWVkTGFiZWwiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubW9kaWZpZWRMYWJlbCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubW9kaWZpZWRMYWJlbCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tb2RpZmllZExhYmVsX2luaXRpYWxpemVycywgX21vZGlmaWVkTGFiZWxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5NSh0aGlzLCBudWxsLCBfbGFuZ3VhZ2VfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibGFuZ3VhZ2UiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImxhbmd1YWdlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmxhbmd1YWdlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5sYW5ndWFnZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9sYW5ndWFnZV9pbml0aWFsaXplcnMsIF9sYW5ndWFnZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk1KHRoaXMsIG51bGwsIF9maWxlUGF0aF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJmaWxlUGF0aCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZmlsZVBhdGgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZmlsZVBhdGgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmZpbGVQYXRoID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2ZpbGVQYXRoX2luaXRpYWxpemVycywgX2ZpbGVQYXRoX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTUobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzV29ya3NwYWNlRGlmZkVkaXRvcjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgLy8gREVNTwogICAgc3RhdGljIGRlbW8gPSAoKSA9PiBiMmAKICAgIDxkZWVzLXdvcmtzcGFjZS1kaWZmLWVkaXRvcgogICAgICAub3JpZ2luYWxDb250ZW50PSR7J2Z1bmN0aW9uIGhlbGxvKCkge1xuICBjb25zb2xlLmxvZygiSGVsbG8iKTtcbn0nfQogICAgICAubW9kaWZpZWRDb250ZW50PSR7J2Z1bmN0aW9uIGhlbGxvKCkge1xuICBjb25zb2xlLmxvZygiSGVsbG8gV29ybGQhIik7XG4gIHJldHVybiB0cnVlO1xufSd9CiAgICAgIC5sYW5ndWFnZT0keyJ0eXBlc2NyaXB0In0KICAgICAgLmZpbGVQYXRoPSR7Ii9kZW1vL2V4YW1wbGUudHMifQogICAgPjwvZGVlcy13b3Jrc3BhY2UtZGlmZi1lZGl0b3I+CiAgYDsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJXb3Jrc3BhY2UiXTsKICAgIC8vIElOU1RBTkNFCiAgICBkaWZmRWRpdG9yRGVmZXJyZWQgPSBkb210b29sc19wbHVnaW5leHBvcnRzX2V4cG9ydHMuc21hcnRwcm9taXNlLmRlZmVyKCk7CiAgICAjb3JpZ2luYWxDb250ZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczk2KHRoaXMsIF9vcmlnaW5hbENvbnRlbnRfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICBnZXQgb3JpZ2luYWxDb250ZW50KCkgewogICAgICByZXR1cm4gdGhpcy4jb3JpZ2luYWxDb250ZW50X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgb3JpZ2luYWxDb250ZW50KHZhbHVlMikgewogICAgICB0aGlzLiNvcmlnaW5hbENvbnRlbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtb2RpZmllZENvbnRlbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk2KHRoaXMsIF9vcmlnaW5hbENvbnRlbnRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk2KHRoaXMsIF9tb2RpZmllZENvbnRlbnRfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IG1vZGlmaWVkQ29udGVudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21vZGlmaWVkQ29udGVudF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1vZGlmaWVkQ29udGVudCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbW9kaWZpZWRDb250ZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjb3JpZ2luYWxMYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTYodGhpcywgX21vZGlmaWVkQ29udGVudF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTYodGhpcywgX29yaWdpbmFsTGFiZWxfaW5pdGlhbGl6ZXJzLCAiRGlzayBWZXJzaW9uIikpOwogICAgZ2V0IG9yaWdpbmFsTGFiZWwoKSB7CiAgICAgIHJldHVybiB0aGlzLiNvcmlnaW5hbExhYmVsX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgb3JpZ2luYWxMYWJlbCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jb3JpZ2luYWxMYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21vZGlmaWVkTGFiZWxfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk2KHRoaXMsIF9vcmlnaW5hbExhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5Nih0aGlzLCBfbW9kaWZpZWRMYWJlbF9pbml0aWFsaXplcnMsICJMb2NhbCBWZXJzaW9uIikpOwogICAgZ2V0IG1vZGlmaWVkTGFiZWwoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtb2RpZmllZExhYmVsX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbW9kaWZpZWRMYWJlbCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbW9kaWZpZWRMYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2xhbmd1YWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5Nih0aGlzLCBfbW9kaWZpZWRMYWJlbF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTYodGhpcywgX2xhbmd1YWdlX2luaXRpYWxpemVycywgInR5cGVzY3JpcHQiKSk7CiAgICBnZXQgbGFuZ3VhZ2UoKSB7CiAgICAgIHJldHVybiB0aGlzLiNsYW5ndWFnZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxhbmd1YWdlKHZhbHVlMikgewogICAgICB0aGlzLiNsYW5ndWFnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2ZpbGVQYXRoX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5Nih0aGlzLCBfbGFuZ3VhZ2VfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk2KHRoaXMsIF9maWxlUGF0aF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgZmlsZVBhdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLiNmaWxlUGF0aF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGZpbGVQYXRoKHZhbHVlMikgewogICAgICB0aGlzLiNmaWxlUGF0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgZGlmZkVkaXRvciA9IChfX3J1bkluaXRpYWxpemVyczk2KHRoaXMsIF9maWxlUGF0aF9leHRyYUluaXRpYWxpemVycyksIG51bGwpOwogICAgbW9uYWNvVGhlbWVTdWJzY3JpcHRpb24gPSBudWxsOwogICAgb3JpZ2luYWxNb2RlbCA9IG51bGw7CiAgICBtb2RpZmllZE1vZGVsID0gbnVsbDsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBEb21Ub29scy5zZXR1cERvbVRvb2xzKCk7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgIH0KCiAgICAgICogewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgIC5kaWZmLXdyYXBwZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5kaWZmLXRvb2xiYXIgewogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTYlKSIsICJoc2woMCAwJSAxMiUpIil9OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODUlKSIsICJoc2woMCAwJSAyMCUpIil9OwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAuZGlmZi1pbmZvIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDMwJSkiLCAiaHNsKDAgMCUgODAlKSIpfTsKICAgICAgfQoKICAgICAgLmRpZmYtZmlsZW5hbWUgewogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAyMCUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgIH0KCiAgICAgIC5kaWZmLWxhYmVscyB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNTAlKSIsICJoc2woMCAwJSA2MCUpIil9OwogICAgICB9CgogICAgICAuZGlmZi1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgIH0KCiAgICAgIC5kaWZmLWNvbnRhaW5lciB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAubmF2LWJ1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9ucyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBtYXJnaW4tbGVmdDogMTZweDsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgY29uc3QgZmlsZU5hbWUgPSB0aGlzLmZpbGVQYXRoLnNwbGl0KCIvIikucG9wKCkgfHwgImZpbGUiOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImRpZmYtd3JhcHBlciI+CiAgICAgICAgPGRpdiBjbGFzcz0iZGlmZi10b29sYmFyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRpZmYtaW5mbyI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkaWZmLWZpbGVuYW1lIj4ke2ZpbGVOYW1lfTwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRpZmYtbGFiZWxzIj4ke3RoaXMub3JpZ2luYWxMYWJlbH0g4oaUICR7dGhpcy5tb2RpZmllZExhYmVsfTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlmZi1hY3Rpb25zIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LWJ1dHRvbnMiPgogICAgICAgICAgICAgIDxkZWVzLWJ1dHRvbgogICAgICAgICAgICAgICAgdHlwZT0ib3V0bGluZSIKICAgICAgICAgICAgICAgIEBjbGljaz0ke3RoaXMuZ29Ub1ByZXZpb3VzRGlmZn0KICAgICAgICAgICAgICA+UHJldmlvdXM8L2RlZXMtYnV0dG9uPgogICAgICAgICAgICAgIDxkZWVzLWJ1dHRvbgogICAgICAgICAgICAgICAgdHlwZT0ib3V0bGluZSIKICAgICAgICAgICAgICAgIEBjbGljaz0ke3RoaXMuZ29Ub05leHREaWZmfQogICAgICAgICAgICAgID5OZXh0PC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbi1idXR0b25zIj4KICAgICAgICAgICAgICA8ZGVlcy1idXR0b24KICAgICAgICAgICAgICAgIHR5cGU9ImhpZ2hsaWdodGVkIgogICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy5hY2NlcHRMb2NhbH0KICAgICAgICAgICAgICA+VXNlIExvY2FsPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgICA8ZGVlcy1idXR0b24KICAgICAgICAgICAgICAgIHR5cGU9Im91dGxpbmUiCiAgICAgICAgICAgICAgICBAY2xpY2s9JHt0aGlzLmFjY2VwdERpc2t9CiAgICAgICAgICAgICAgPlVzZSBEaXNrPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgICA8ZGVlcy1idXR0b24KICAgICAgICAgICAgICAgIHR5cGU9Im91dGxpbmUiCiAgICAgICAgICAgICAgICBAY2xpY2s9JHt0aGlzLmNsb3NlfQogICAgICAgICAgICAgID5DbG9zZTwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iZGlmZi1jb250YWluZXIiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIGF3YWl0IHN1cGVyLmZpcnN0VXBkYXRlZCgvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKTsKICAgICAgYXdhaXQgdGhpcy5pbml0RGlmZkVkaXRvcigpOwogICAgfQogICAgYXN5bmMgaW5pdERpZmZFZGl0b3IoKSB7CiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmRpZmYtY29udGFpbmVyIik7CiAgICAgIGlmICghY29udGFpbmVyKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgbW9uYWNvQ2RuQmFzZSA9IGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL21vbmFjby1lZGl0b3JAJHtNT05BQ09fVkVSU0lPTn1gOwogICAgICBsZXQgbW9uYWNvSW5zdGFuY2UgPSB3aW5kb3cubW9uYWNvOwogICAgICBpZiAoIW1vbmFjb0luc3RhbmNlKSB7CiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiB7CiAgICAgICAgICBjb25zdCBjaGVja01vbmFjbyA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgICAgICAgaWYgKHdpbmRvdy5tb25hY28pIHsKICAgICAgICAgICAgICBjbGVhckludGVydmFsKGNoZWNrTW9uYWNvKTsKICAgICAgICAgICAgICByZXNvbHZlMigpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCAxMDApOwogICAgICAgIH0pOwogICAgICAgIG1vbmFjb0luc3RhbmNlID0gd2luZG93Lm1vbmFjbzsKICAgICAgfQogICAgICBjb25zdCBkb210b29sc0luc3RhbmNlID0gYXdhaXQgdGhpcy5kb210b29sc1Byb21pc2U7CiAgICAgIGNvbnN0IGlzQnJpZ2h0ID0gZG9tdG9vbHNJbnN0YW5jZS50aGVtZU1hbmFnZXIuZ29CcmlnaHRCb29sZWFuOwogICAgICBjb25zdCBpbml0aWFsVGhlbWUgPSBpc0JyaWdodCA/ICJ2cyIgOiAidnMtZGFyayI7CiAgICAgIGNvbnN0IHRpbWVzdGFtcDIgPSBEYXRlLm5vdygpOwogICAgICBjb25zdCBvcmlnaW5hbFVyaSA9IG1vbmFjb0luc3RhbmNlLlVyaS5wYXJzZShgZGlmZjovL29yaWdpbmFsLyR7dGltZXN0YW1wMn0ke3RoaXMuZmlsZVBhdGh9YCk7CiAgICAgIGNvbnN0IG1vZGlmaWVkVXJpID0gbW9uYWNvSW5zdGFuY2UuVXJpLnBhcnNlKGBkaWZmOi8vbW9kaWZpZWQvJHt0aW1lc3RhbXAyfSR7dGhpcy5maWxlUGF0aH1gKTsKICAgICAgdGhpcy5vcmlnaW5hbE1vZGVsID0gbW9uYWNvSW5zdGFuY2UuZWRpdG9yLmNyZWF0ZU1vZGVsKHRoaXMub3JpZ2luYWxDb250ZW50LCB0aGlzLmxhbmd1YWdlLCBvcmlnaW5hbFVyaSk7CiAgICAgIHRoaXMubW9kaWZpZWRNb2RlbCA9IG1vbmFjb0luc3RhbmNlLmVkaXRvci5jcmVhdGVNb2RlbCh0aGlzLm1vZGlmaWVkQ29udGVudCwgdGhpcy5sYW5ndWFnZSwgbW9kaWZpZWRVcmkpOwogICAgICB0aGlzLmRpZmZFZGl0b3IgPSBtb25hY29JbnN0YW5jZS5lZGl0b3IuY3JlYXRlRGlmZkVkaXRvcihjb250YWluZXIsIHsKICAgICAgICBhdXRvbWF0aWNMYXlvdXQ6IHRydWUsCiAgICAgICAgcmVhZE9ubHk6IGZhbHNlLAogICAgICAgIC8vIEFsbG93IGVkaXRpbmcgdGhlIG1vZGlmaWVkIChsb2NhbCkgc2lkZQogICAgICAgIG9yaWdpbmFsRWRpdGFibGU6IGZhbHNlLAogICAgICAgIC8vIERpc2sgdmVyc2lvbiBpcyByZWFkLW9ubHkKICAgICAgICByZW5kZXJTaWRlQnlTaWRlOiB0cnVlLAogICAgICAgIGlnbm9yZVRyaW1XaGl0ZXNwYWNlOiBmYWxzZSwKICAgICAgICBmb250U2l6ZTogMTQsCiAgICAgICAgbWluaW1hcDogewogICAgICAgICAgZW5hYmxlZDogZmFsc2UKICAgICAgICB9CiAgICAgIH0pOwogICAgICBtb25hY29JbnN0YW5jZS5lZGl0b3Iuc2V0VGhlbWUoaW5pdGlhbFRoZW1lKTsKICAgICAgdGhpcy5kaWZmRWRpdG9yLnNldE1vZGVsKHsKICAgICAgICBvcmlnaW5hbDogdGhpcy5vcmlnaW5hbE1vZGVsLAogICAgICAgIG1vZGlmaWVkOiB0aGlzLm1vZGlmaWVkTW9kZWwKICAgICAgfSk7CiAgICAgIHRoaXMubW9uYWNvVGhlbWVTdWJzY3JpcHRpb24gPSBkb210b29sc0luc3RhbmNlLnRoZW1lTWFuYWdlci50aGVtZU9ic2VydmFibGUuc3Vic2NyaWJlKChnb0JyaWdodCkgPT4gewogICAgICAgIGNvbnN0IG5ld1RoZW1lID0gZ29CcmlnaHQgPyAidnMiIDogInZzLWRhcmsiOwogICAgICAgIG1vbmFjb0luc3RhbmNlLmVkaXRvci5zZXRUaGVtZShuZXdUaGVtZSk7CiAgICAgIH0pOwogICAgICBjb25zdCBjc3NJZCA9ICJtb25hY28tZGlmZi1lZGl0b3ItY3NzIjsKICAgICAgaWYgKCF0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKGNzc0lkKSkgewogICAgICAgIGNvbnN0IGNzc1Jlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7bW9uYWNvQ2RuQmFzZX0vbWluL3ZzL2VkaXRvci9lZGl0b3IubWFpbi5jc3NgKTsKICAgICAgICBjb25zdCBjc3NUZXh0ID0gYXdhaXQgY3NzUmVzcG9uc2UudGV4dCgpOwogICAgICAgIGNvbnN0IHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgICAgc3R5bGVFbGVtZW50LmlkID0gY3NzSWQ7CiAgICAgICAgc3R5bGVFbGVtZW50LnRleHRDb250ZW50ID0gY3NzVGV4dDsKICAgICAgICB0aGlzLnNoYWRvd1Jvb3Q/LmFwcGVuZChzdHlsZUVsZW1lbnQpOwogICAgICB9CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmRpZmZFZGl0b3I/LnJldmVhbEZpcnN0RGlmZigpOwogICAgICAgIH0gY2F0Y2ggewogICAgICAgIH0KICAgICAgfSwgMTAwKTsKICAgICAgdGhpcy5kaWZmRWRpdG9yRGVmZXJyZWQucmVzb2x2ZSh0aGlzLmRpZmZFZGl0b3IpOwogICAgfQogICAgZ29Ub05leHREaWZmKCkgewogICAgICB0cnkgewogICAgICAgIHRoaXMuZGlmZkVkaXRvcj8uZ29Ub0RpZmYoIm5leHQiKTsKICAgICAgfSBjYXRjaCB7CiAgICAgIH0KICAgIH0KICAgIGdvVG9QcmV2aW91c0RpZmYoKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdGhpcy5kaWZmRWRpdG9yPy5nb1RvRGlmZigicHJldmlvdXMiKTsKICAgICAgfSBjYXRjaCB7CiAgICAgIH0KICAgIH0KICAgIGFjY2VwdExvY2FsKCkgewogICAgICBjb25zdCBtb2RpZmllZENvbnRlbnQgPSB0aGlzLmRpZmZFZGl0b3I/LmdldE1vZGlmaWVkRWRpdG9yKCkuZ2V0VmFsdWUoKSB8fCB0aGlzLm1vZGlmaWVkQ29udGVudDsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiZGlmZi1yZXNvbHZlZCIsIHsKICAgICAgICBkZXRhaWw6IHsgYWN0aW9uOiAidXNlLWxvY2FsIiwgY29udGVudDogbW9kaWZpZWRDb250ZW50IH0sCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBhY2NlcHREaXNrKCkgewogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJkaWZmLXJlc29sdmVkIiwgewogICAgICAgIGRldGFpbDogeyBhY3Rpb246ICJ1c2UtZGlzayIsIGNvbnRlbnQ6IHRoaXMub3JpZ2luYWxDb250ZW50IH0sCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBjbG9zZSgpIHsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiZGlmZi1jbG9zZWQiLCB7CiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgaWYgKHRoaXMubW9uYWNvVGhlbWVTdWJzY3JpcHRpb24pIHsKICAgICAgICB0aGlzLm1vbmFjb1RoZW1lU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgdGhpcy5tb25hY29UaGVtZVN1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgIH0KICAgICAgaWYgKHRoaXMub3JpZ2luYWxNb2RlbCkgewogICAgICAgIHRoaXMub3JpZ2luYWxNb2RlbC5kaXNwb3NlKCk7CiAgICAgICAgdGhpcy5vcmlnaW5hbE1vZGVsID0gbnVsbDsKICAgICAgfQogICAgICBpZiAodGhpcy5tb2RpZmllZE1vZGVsKSB7CiAgICAgICAgdGhpcy5tb2RpZmllZE1vZGVsLmRpc3Bvc2UoKTsKICAgICAgICB0aGlzLm1vZGlmaWVkTW9kZWwgPSBudWxsOwogICAgICB9CiAgICAgIGlmICh0aGlzLmRpZmZFZGl0b3IpIHsKICAgICAgICB0aGlzLmRpZmZFZGl0b3IuZGlzcG9zZSgpOwogICAgICAgIHRoaXMuZGlmZkVkaXRvciA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzOTYoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNXb3Jrc3BhY2VEaWZmRWRpdG9yMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtd29ya3NwYWNlL2RlZXMtd29ya3NwYWNlL2RlZXMtd29ya3NwYWNlLmpzCmluaXRfZGlzdF90czI2KCk7CmluaXRfZGlzdF90czI1KCk7CmluaXRfdGhlbWUoKTsKaW5pdF9ncm91cF9ydW50aW1lKCk7CmluaXRfZGVlc193b3Jrc3BhY2VfdGVybWluYWwoKTsKaW5pdF9kZWVzX3dvcmtzcGFjZV90ZXJtaW5hbCgpOwppbml0X2RlZXNfaWNvbigpOwppbml0X2RlZXNfYWN0aW9uYmFyKCk7CnZhciBfX2VzRGVjb3JhdGU5NiA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY3KSB7CiAgICBpZiAoZjcgIT09IHZvaWQgMCAmJiB0eXBlb2YgZjcgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjc7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNCwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbikgY29udGV4dDJbcDddID0gcDcgPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDddOwogICAgZm9yICh2YXIgcDcgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A3XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDddOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmNykgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY3IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF80OwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICB9IGVsc2UgaWYgKF80ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF80KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzQ7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzOTcgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNXb3Jrc3BhY2UgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLXdvcmtzcGFjZSIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX2V4ZWN1dGlvbkVudmlyb25tZW50X2RlY29yYXRvcnM7CiAgbGV0IF9leGVjdXRpb25FbnZpcm9ubWVudF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2V4ZWN1dGlvbkVudmlyb25tZW50X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pbml0aWFsaXphdGlvblByb21pc2VfZGVjb3JhdG9yczsKICBsZXQgX2luaXRpYWxpemF0aW9uUHJvbWlzZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2luaXRpYWxpemF0aW9uUHJvbWlzZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0ZpbGVUcmVlX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93RmlsZVRyZWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93RmlsZVRyZWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dUZXJtaW5hbF9kZWNvcmF0b3JzOwogIGxldCBfc2hvd1Rlcm1pbmFsX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1Rlcm1pbmFsX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWxlVHJlZVdpZHRoX2RlY29yYXRvcnM7CiAgbGV0IF9maWxlVHJlZVdpZHRoX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZmlsZVRyZWVXaWR0aF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGVybWluYWxIZWlnaHRfZGVjb3JhdG9yczsKICBsZXQgX3Rlcm1pbmFsSGVpZ2h0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGVybWluYWxIZWlnaHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX29wZW5GaWxlc19kZWNvcmF0b3JzOwogIGxldCBfb3BlbkZpbGVzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfb3BlbkZpbGVzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY3RpdmVGaWxlUGF0aF9kZWNvcmF0b3JzOwogIGxldCBfYWN0aXZlRmlsZVBhdGhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY3RpdmVGaWxlUGF0aF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNUZXJtaW5hbENvbGxhcHNlZF9kZWNvcmF0b3JzOwogIGxldCBfaXNUZXJtaW5hbENvbGxhcHNlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzVGVybWluYWxDb2xsYXBzZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzRmlsZVRyZWVDb2xsYXBzZWRfZGVjb3JhdG9yczsKICBsZXQgX2lzRmlsZVRyZWVDb2xsYXBzZWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0ZpbGVUcmVlQ29sbGFwc2VkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0luaXRpYWxpemluZ19kZWNvcmF0b3JzOwogIGxldCBfaXNJbml0aWFsaXppbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0luaXRpYWxpemluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWN0aXZlQm90dG9tUGFuZWxfZGVjb3JhdG9yczsKICBsZXQgX2FjdGl2ZUJvdHRvbVBhbmVsX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWN0aXZlQm90dG9tUGFuZWxfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RpYWdub3N0aWNNYXJrZXJzX2RlY29yYXRvcnM7CiAgbGV0IF9kaWFnbm9zdGljTWFya2Vyc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RpYWdub3N0aWNNYXJrZXJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdXRvU2F2ZV9kZWNvcmF0b3JzOwogIGxldCBfYXV0b1NhdmVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdXRvU2F2ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW5pdENvbW1hbmRfZGVjb3JhdG9yczsKICBsZXQgX2luaXRDb21tYW5kX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW5pdENvbW1hbmRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2luaXRPdXRwdXRfZGVjb3JhdG9yczsKICBsZXQgX2luaXRPdXRwdXRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pbml0T3V0cHV0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50RmlsZVRyZWVXaWR0aF9kZWNvcmF0b3JzOwogIGxldCBfY3VycmVudEZpbGVUcmVlV2lkdGhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50RmlsZVRyZWVXaWR0aF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VycmVudFRlcm1pbmFsSGVpZ2h0X2RlY29yYXRvcnM7CiAgbGV0IF9jdXJyZW50VGVybWluYWxIZWlnaHRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50VGVybWluYWxIZWlnaHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzRHJhZ2dpbmdGaWxlVHJlZV9kZWNvcmF0b3JzOwogIGxldCBfaXNEcmFnZ2luZ0ZpbGVUcmVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNEcmFnZ2luZ0ZpbGVUcmVlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0RyYWdnaW5nVGVybWluYWxfZGVjb3JhdG9yczsKICBsZXQgX2lzRHJhZ2dpbmdUZXJtaW5hbF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzRHJhZ2dpbmdUZXJtaW5hbF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0RpZmZWaWV3X2RlY29yYXRvcnM7CiAgbGV0IF9zaG93RGlmZlZpZXdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93RGlmZlZpZXdfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RpZmZWaWV3Q29uZmlnX2RlY29yYXRvcnM7CiAgbGV0IF9kaWZmVmlld0NvbmZpZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RpZmZWaWV3Q29uZmlnX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNXb3Jrc3BhY2UyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfZXhlY3V0aW9uRW52aXJvbm1lbnRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF9pbml0aWFsaXphdGlvblByb21pc2VfZGVjb3JhdG9ycyA9IFtuNSh7IGF0dHJpYnV0ZTogZmFsc2UgfSldOwogICAgICBfc2hvd0ZpbGVUcmVlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3Nob3dUZXJtaW5hbF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9maWxlVHJlZVdpZHRoX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfdGVybWluYWxIZWlnaHRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF9vcGVuRmlsZXNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2FjdGl2ZUZpbGVQYXRoX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pc1Rlcm1pbmFsQ29sbGFwc2VkX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pc0ZpbGVUcmVlQ29sbGFwc2VkX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pc0luaXRpYWxpemluZ19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfYWN0aXZlQm90dG9tUGFuZWxfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2RpYWdub3N0aWNNYXJrZXJzX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9hdXRvU2F2ZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaW5pdENvbW1hbmRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2luaXRPdXRwdXRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2N1cnJlbnRGaWxlVHJlZVdpZHRoX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9jdXJyZW50VGVybWluYWxIZWlnaHRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2lzRHJhZ2dpbmdGaWxlVHJlZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaXNEcmFnZ2luZ1Rlcm1pbmFsX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9zaG93RGlmZlZpZXdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2RpZmZWaWV3Q29uZmlnX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTk2KHRoaXMsIG51bGwsIF9leGVjdXRpb25FbnZpcm9ubWVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJleGVjdXRpb25FbnZpcm9ubWVudCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZXhlY3V0aW9uRW52aXJvbm1lbnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZXhlY3V0aW9uRW52aXJvbm1lbnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmV4ZWN1dGlvbkVudmlyb25tZW50ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2V4ZWN1dGlvbkVudmlyb25tZW50X2luaXRpYWxpemVycywgX2V4ZWN1dGlvbkVudmlyb25tZW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTYodGhpcywgbnVsbCwgX2luaXRpYWxpemF0aW9uUHJvbWlzZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpbml0aWFsaXphdGlvblByb21pc2UiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImluaXRpYWxpemF0aW9uUHJvbWlzZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pbml0aWFsaXphdGlvblByb21pc2UsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmluaXRpYWxpemF0aW9uUHJvbWlzZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pbml0aWFsaXphdGlvblByb21pc2VfaW5pdGlhbGl6ZXJzLCBfaW5pdGlhbGl6YXRpb25Qcm9taXNlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTYodGhpcywgbnVsbCwgX3Nob3dGaWxlVHJlZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93RmlsZVRyZWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNob3dGaWxlVHJlZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93RmlsZVRyZWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dGaWxlVHJlZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93RmlsZVRyZWVfaW5pdGlhbGl6ZXJzLCBfc2hvd0ZpbGVUcmVlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTYodGhpcywgbnVsbCwgX3Nob3dUZXJtaW5hbF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93VGVybWluYWwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNob3dUZXJtaW5hbCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93VGVybWluYWwsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dUZXJtaW5hbCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93VGVybWluYWxfaW5pdGlhbGl6ZXJzLCBfc2hvd1Rlcm1pbmFsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTYodGhpcywgbnVsbCwgX2ZpbGVUcmVlV2lkdGhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZmlsZVRyZWVXaWR0aCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZmlsZVRyZWVXaWR0aCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5maWxlVHJlZVdpZHRoLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5maWxlVHJlZVdpZHRoID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2ZpbGVUcmVlV2lkdGhfaW5pdGlhbGl6ZXJzLCBfZmlsZVRyZWVXaWR0aF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk2KHRoaXMsIG51bGwsIF90ZXJtaW5hbEhlaWdodF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0ZXJtaW5hbEhlaWdodCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGVybWluYWxIZWlnaHQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudGVybWluYWxIZWlnaHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnRlcm1pbmFsSGVpZ2h0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Rlcm1pbmFsSGVpZ2h0X2luaXRpYWxpemVycywgX3Rlcm1pbmFsSGVpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTYodGhpcywgbnVsbCwgX29wZW5GaWxlc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJvcGVuRmlsZXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm9wZW5GaWxlcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5vcGVuRmlsZXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm9wZW5GaWxlcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9vcGVuRmlsZXNfaW5pdGlhbGl6ZXJzLCBfb3BlbkZpbGVzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTYodGhpcywgbnVsbCwgX2FjdGl2ZUZpbGVQYXRoX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFjdGl2ZUZpbGVQYXRoIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhY3RpdmVGaWxlUGF0aCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hY3RpdmVGaWxlUGF0aCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYWN0aXZlRmlsZVBhdGggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYWN0aXZlRmlsZVBhdGhfaW5pdGlhbGl6ZXJzLCBfYWN0aXZlRmlsZVBhdGhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5Nih0aGlzLCBudWxsLCBfaXNUZXJtaW5hbENvbGxhcHNlZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc1Rlcm1pbmFsQ29sbGFwc2VkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc1Rlcm1pbmFsQ29sbGFwc2VkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzVGVybWluYWxDb2xsYXBzZWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzVGVybWluYWxDb2xsYXBzZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNUZXJtaW5hbENvbGxhcHNlZF9pbml0aWFsaXplcnMsIF9pc1Rlcm1pbmFsQ29sbGFwc2VkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTYodGhpcywgbnVsbCwgX2lzRmlsZVRyZWVDb2xsYXBzZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNGaWxlVHJlZUNvbGxhcHNlZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNGaWxlVHJlZUNvbGxhcHNlZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc0ZpbGVUcmVlQ29sbGFwc2VkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc0ZpbGVUcmVlQ29sbGFwc2VkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzRmlsZVRyZWVDb2xsYXBzZWRfaW5pdGlhbGl6ZXJzLCBfaXNGaWxlVHJlZUNvbGxhcHNlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk2KHRoaXMsIG51bGwsIF9pc0luaXRpYWxpemluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc0luaXRpYWxpemluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNJbml0aWFsaXppbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNJbml0aWFsaXppbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzSW5pdGlhbGl6aW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzSW5pdGlhbGl6aW5nX2luaXRpYWxpemVycywgX2lzSW5pdGlhbGl6aW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTYodGhpcywgbnVsbCwgX2FjdGl2ZUJvdHRvbVBhbmVsX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFjdGl2ZUJvdHRvbVBhbmVsIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhY3RpdmVCb3R0b21QYW5lbCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hY3RpdmVCb3R0b21QYW5lbCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYWN0aXZlQm90dG9tUGFuZWwgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYWN0aXZlQm90dG9tUGFuZWxfaW5pdGlhbGl6ZXJzLCBfYWN0aXZlQm90dG9tUGFuZWxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5Nih0aGlzLCBudWxsLCBfZGlhZ25vc3RpY01hcmtlcnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZGlhZ25vc3RpY01hcmtlcnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRpYWdub3N0aWNNYXJrZXJzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRpYWdub3N0aWNNYXJrZXJzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kaWFnbm9zdGljTWFya2VycyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kaWFnbm9zdGljTWFya2Vyc19pbml0aWFsaXplcnMsIF9kaWFnbm9zdGljTWFya2Vyc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk2KHRoaXMsIG51bGwsIF9hdXRvU2F2ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhdXRvU2F2ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYXV0b1NhdmUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYXV0b1NhdmUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmF1dG9TYXZlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2F1dG9TYXZlX2luaXRpYWxpemVycywgX2F1dG9TYXZlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTYodGhpcywgbnVsbCwgX2luaXRDb21tYW5kX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImluaXRDb21tYW5kIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpbml0Q29tbWFuZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pbml0Q29tbWFuZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaW5pdENvbW1hbmQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaW5pdENvbW1hbmRfaW5pdGlhbGl6ZXJzLCBfaW5pdENvbW1hbmRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5Nih0aGlzLCBudWxsLCBfaW5pdE91dHB1dF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpbml0T3V0cHV0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpbml0T3V0cHV0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmluaXRPdXRwdXQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmluaXRPdXRwdXQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaW5pdE91dHB1dF9pbml0aWFsaXplcnMsIF9pbml0T3V0cHV0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTYodGhpcywgbnVsbCwgX2N1cnJlbnRGaWxlVHJlZVdpZHRoX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImN1cnJlbnRGaWxlVHJlZVdpZHRoIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjdXJyZW50RmlsZVRyZWVXaWR0aCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jdXJyZW50RmlsZVRyZWVXaWR0aCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY3VycmVudEZpbGVUcmVlV2lkdGggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY3VycmVudEZpbGVUcmVlV2lkdGhfaW5pdGlhbGl6ZXJzLCBfY3VycmVudEZpbGVUcmVlV2lkdGhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5Nih0aGlzLCBudWxsLCBfY3VycmVudFRlcm1pbmFsSGVpZ2h0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImN1cnJlbnRUZXJtaW5hbEhlaWdodCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3VycmVudFRlcm1pbmFsSGVpZ2h0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmN1cnJlbnRUZXJtaW5hbEhlaWdodCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY3VycmVudFRlcm1pbmFsSGVpZ2h0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2N1cnJlbnRUZXJtaW5hbEhlaWdodF9pbml0aWFsaXplcnMsIF9jdXJyZW50VGVybWluYWxIZWlnaHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5Nih0aGlzLCBudWxsLCBfaXNEcmFnZ2luZ0ZpbGVUcmVlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzRHJhZ2dpbmdGaWxlVHJlZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNEcmFnZ2luZ0ZpbGVUcmVlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzRHJhZ2dpbmdGaWxlVHJlZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNEcmFnZ2luZ0ZpbGVUcmVlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzRHJhZ2dpbmdGaWxlVHJlZV9pbml0aWFsaXplcnMsIF9pc0RyYWdnaW5nRmlsZVRyZWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5Nih0aGlzLCBudWxsLCBfaXNEcmFnZ2luZ1Rlcm1pbmFsX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzRHJhZ2dpbmdUZXJtaW5hbCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNEcmFnZ2luZ1Rlcm1pbmFsIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzRHJhZ2dpbmdUZXJtaW5hbCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNEcmFnZ2luZ1Rlcm1pbmFsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzRHJhZ2dpbmdUZXJtaW5hbF9pbml0aWFsaXplcnMsIF9pc0RyYWdnaW5nVGVybWluYWxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5Nih0aGlzLCBudWxsLCBfc2hvd0RpZmZWaWV3X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dEaWZmVmlldyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd0RpZmZWaWV3IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dEaWZmVmlldywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd0RpZmZWaWV3ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dEaWZmVmlld19pbml0aWFsaXplcnMsIF9zaG93RGlmZlZpZXdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5Nih0aGlzLCBudWxsLCBfZGlmZlZpZXdDb25maWdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZGlmZlZpZXdDb25maWciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRpZmZWaWV3Q29uZmlnIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRpZmZWaWV3Q29uZmlnLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kaWZmVmlld0NvbmZpZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kaWZmVmlld0NvbmZpZ19pbml0aWFsaXplcnMsIF9kaWZmVmlld0NvbmZpZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk2KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1dvcmtzcGFjZTIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSAoKSA9PiB7CiAgICAgIGNvbnN0IGVudjIgPSBuZXcgV2ViQ29udGFpbmVyRW52aXJvbm1lbnQoKTsKICAgICAgY29uc3QgbW91bnRQcm9taXNlID0gKGFzeW5jICgpID0+IHsKICAgICAgICBhd2FpdCBlbnYyLmluaXQoKTsKICAgICAgICBjb25zdCBmaWxlVHJlZSA9IHsKICAgICAgICAgICJwYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAgIGZpbGU6IHsKICAgICAgICAgICAgICBjb250ZW50czogSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICAgICAgbmFtZTogImRlbW8tcHJvamVjdCIsCiAgICAgICAgICAgICAgICB2ZXJzaW9uOiAiMS4wLjAiLAogICAgICAgICAgICAgICAgdHlwZTogIm1vZHVsZSIsCiAgICAgICAgICAgICAgICBzY3JpcHRzOiB7CiAgICAgICAgICAgICAgICAgIGJ1aWxkOiAidHNjIiwKICAgICAgICAgICAgICAgICAgZGV2OiAidHNjIC0td2F0Y2giCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiB7CiAgICAgICAgICAgICAgICAgICJAcHVzaC5yb2Nrcy9zbWFydHByb21pc2UiOiAiXjQuMi4zIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRldkRlcGVuZGVuY2llczogewogICAgICAgICAgICAgICAgICAiQHR5cGVzL25vZGUiOiAiXjIyLjAuMCIsCiAgICAgICAgICAgICAgICAgIHR5cGVzY3JpcHQ6ICJeNS4wLjAiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwgbnVsbCwgMikKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJucG1leHRyYS5qc29uIjogewogICAgICAgICAgICBmaWxlOiB7CiAgICAgICAgICAgICAgY29udGVudHM6IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgIGRlZXNFZGl0b3JXb3Jrc3BhY2U6IHsKICAgICAgICAgICAgICAgICAgb25Jbml0OiAicG5wbSBpbnN0YWxsIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sIG51bGwsIDIpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAidHNjb25maWcuanNvbiI6IHsKICAgICAgICAgICAgZmlsZTogewogICAgICAgICAgICAgIGNvbnRlbnRzOiBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICBjb21waWxlck9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAiRVMyMDIyIiwKICAgICAgICAgICAgICAgICAgbW9kdWxlOiAiTm9kZU5leHQiLAogICAgICAgICAgICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiAiTm9kZU5leHQiLAogICAgICAgICAgICAgICAgICBzdHJpY3Q6IHRydWUsCiAgICAgICAgICAgICAgICAgIG91dERpcjogIi4vZGlzdCIsCiAgICAgICAgICAgICAgICAgIHJvb3REaXI6ICIuL3NyYyIsCiAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uOiB0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgaW5jbHVkZTogWyJzcmMvKiovKiJdCiAgICAgICAgICAgICAgfSwgbnVsbCwgMikKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIHNyYzogewogICAgICAgICAgICBkaXJlY3Rvcnk6IHsKICAgICAgICAgICAgICAiaW5kZXgudHMiOiB7CiAgICAgICAgICAgICAgICBmaWxlOiB7CiAgICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBgLy8gTWFpbiBlbnRyeSBwb2ludAppbXBvcnQgeyBncmVldCwgZm9ybWF0TmFtZSB9IGZyb20gJy4vdXRpbHMuanMnOwoKY29uc3QgbmFtZSA9IGZvcm1hdE5hbWUoJ1dvcmxkJyk7CmNvbnNvbGUubG9nKGdyZWV0KG5hbWUpKTsKCi8vIEV4YW1wbGUgYXN5bmMgZnVuY3Rpb24KYXN5bmMgZnVuY3Rpb24gbWFpbigpIHsKICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoJ0hlbGxvIGZyb20gYXN5bmMhJyk7CiAgY29uc29sZS5sb2cocmVzdWx0KTsKfQoKbWFpbigpOwpgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAidXRpbHMudHMiOiB7CiAgICAgICAgICAgICAgICBmaWxlOiB7CiAgICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBgLy8gVXRpbGl0eSBmdW5jdGlvbnMKCmV4cG9ydCBpbnRlcmZhY2UgSVVzZXIgewogIGZpcnN0TmFtZTogc3RyaW5nOwogIGxhc3ROYW1lOiBzdHJpbmc7Cn0KCmV4cG9ydCBmdW5jdGlvbiBncmVldChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgewogIHJldHVybiBcYEhlbGxvLCBcJHtuYW1lfSFcYDsKfQoKZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHsKICByZXR1cm4gbmFtZS50cmltKCkudG9VcHBlckNhc2UoKTsKfQoKZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVzZXIoZmlyc3ROYW1lOiBzdHJpbmcsIGxhc3ROYW1lOiBzdHJpbmcpOiBJVXNlciB7CiAgcmV0dXJuIHsgZmlyc3ROYW1lLCBsYXN0TmFtZSB9Owp9CmAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICJpbXBvcnR0ZXN0LnRzIjogewogICAgICAgICAgICAgICAgZmlsZTogewogICAgICAgICAgICAgICAgICBjb250ZW50czogYC8vIFRlc3QgbnBtIHBhY2thZ2UgaW1wb3J0cwppbXBvcnQgKiBhcyBzbWFydHByb21pc2UgZnJvbSAnQHB1c2gucm9ja3Mvc21hcnRwcm9taXNlJzsKCi8vIFRoaXMgc2hvdWxkIGhhdmUgSW50ZWxsaVNlbnNlIHNob3dpbmcgZGVmZXIoKSBtZXRob2QKY29uc3QgZGVmZXJyZWQgPSBzbWFydHByb21pc2UuZGVmZXI8c3RyaW5nPigpOwoKLy8gVGVzdCB1c2luZyB0aGUgZGVmZXJyZWQgcHJvbWlzZQphc3luYyBmdW5jdGlvbiB0ZXN0U21hcnRQcm9taXNlKCkgewogIHNldFRpbWVvdXQoKCkgPT4gewogICAgZGVmZXJyZWQucmVzb2x2ZSgnSGVsbG8gZnJvbSBzbWFydHByb21pc2UhJyk7CiAgfSwgMTAwKTsKCiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmZXJyZWQucHJvbWlzZTsKICBjb25zb2xlLmxvZyhyZXN1bHQpOwp9Cgp0ZXN0U21hcnRQcm9taXNlKCk7CmAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGF3YWl0IGVudjIubW91bnQoZmlsZVRyZWUpOwogICAgICB9KSgpOwogICAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgIGNvbnRhaW5lckVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9ICJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJTsgb3ZlcmZsb3c6IGhpZGRlbjsiOwogICAgICBjb25zdCB3b3Jrc3BhY2VFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGVlcy13b3Jrc3BhY2UiKTsKICAgICAgd29ya3NwYWNlRWxlbWVudC5leGVjdXRpb25FbnZpcm9ubWVudCA9IGVudjI7CiAgICAgIHdvcmtzcGFjZUVsZW1lbnQuaW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbW91bnRQcm9taXNlOwogICAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHdvcmtzcGFjZUVsZW1lbnQpOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkZWVzLWRlbW93cmFwcGVyPgogICAgICAgICR7Y29udGFpbmVyRWxlbWVudH0KICAgICAgPC9kZWVzLWRlbW93cmFwcGVyPgogICAgYDsKICAgIH07CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiV29ya3NwYWNlIl07CiAgICAjZXhlY3V0aW9uRW52aXJvbm1lbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX2V4ZWN1dGlvbkVudmlyb25tZW50X2luaXRpYWxpemVycywgbnVsbCk7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IGV4ZWN1dGlvbkVudmlyb25tZW50KCkgewogICAgICByZXR1cm4gdGhpcy4jZXhlY3V0aW9uRW52aXJvbm1lbnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBleGVjdXRpb25FbnZpcm9ubWVudCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZXhlY3V0aW9uRW52aXJvbm1lbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpbml0aWFsaXphdGlvblByb21pc2VfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk3KHRoaXMsIF9leGVjdXRpb25FbnZpcm9ubWVudF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX2luaXRpYWxpemF0aW9uUHJvbWlzZV9pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIGdldCBpbml0aWFsaXphdGlvblByb21pc2UoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpbml0aWFsaXphdGlvblByb21pc2VfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpbml0aWFsaXphdGlvblByb21pc2UodmFsdWUyKSB7CiAgICAgIHRoaXMuI2luaXRpYWxpemF0aW9uUHJvbWlzZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dGaWxlVHJlZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX2luaXRpYWxpemF0aW9uUHJvbWlzZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX3Nob3dGaWxlVHJlZV9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93RmlsZVRyZWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93RmlsZVRyZWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93RmlsZVRyZWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dGaWxlVHJlZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dUZXJtaW5hbF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX3Nob3dGaWxlVHJlZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX3Nob3dUZXJtaW5hbF9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93VGVybWluYWwoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93VGVybWluYWxfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93VGVybWluYWwodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dUZXJtaW5hbF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2ZpbGVUcmVlV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk3KHRoaXMsIF9zaG93VGVybWluYWxfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk3KHRoaXMsIF9maWxlVHJlZVdpZHRoX2luaXRpYWxpemVycywgMjUwKSk7CiAgICBnZXQgZmlsZVRyZWVXaWR0aCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2ZpbGVUcmVlV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBmaWxlVHJlZVdpZHRoKHZhbHVlMikgewogICAgICB0aGlzLiNmaWxlVHJlZVdpZHRoX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdGVybWluYWxIZWlnaHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk3KHRoaXMsIF9maWxlVHJlZVdpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5Nyh0aGlzLCBfdGVybWluYWxIZWlnaHRfaW5pdGlhbGl6ZXJzLCAyMDApKTsKICAgIGdldCB0ZXJtaW5hbEhlaWdodCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Rlcm1pbmFsSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdGVybWluYWxIZWlnaHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Rlcm1pbmFsSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjb3BlbkZpbGVzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5Nyh0aGlzLCBfdGVybWluYWxIZWlnaHRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk3KHRoaXMsIF9vcGVuRmlsZXNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IG9wZW5GaWxlcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI29wZW5GaWxlc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG9wZW5GaWxlcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jb3BlbkZpbGVzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYWN0aXZlRmlsZVBhdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk3KHRoaXMsIF9vcGVuRmlsZXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk3KHRoaXMsIF9hY3RpdmVGaWxlUGF0aF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgYWN0aXZlRmlsZVBhdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhY3RpdmVGaWxlUGF0aF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFjdGl2ZUZpbGVQYXRoKHZhbHVlMikgewogICAgICB0aGlzLiNhY3RpdmVGaWxlUGF0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzVGVybWluYWxDb2xsYXBzZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk3KHRoaXMsIF9hY3RpdmVGaWxlUGF0aF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX2lzVGVybWluYWxDb2xsYXBzZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGlzVGVybWluYWxDb2xsYXBzZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc1Rlcm1pbmFsQ29sbGFwc2VkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaXNUZXJtaW5hbENvbGxhcHNlZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXNUZXJtaW5hbENvbGxhcHNlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzRmlsZVRyZWVDb2xsYXBzZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk3KHRoaXMsIF9pc1Rlcm1pbmFsQ29sbGFwc2VkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5Nyh0aGlzLCBfaXNGaWxlVHJlZUNvbGxhcHNlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaXNGaWxlVHJlZUNvbGxhcHNlZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzRmlsZVRyZWVDb2xsYXBzZWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc0ZpbGVUcmVlQ29sbGFwc2VkKHZhbHVlMikgewogICAgICB0aGlzLiNpc0ZpbGVUcmVlQ29sbGFwc2VkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNJbml0aWFsaXppbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk3KHRoaXMsIF9pc0ZpbGVUcmVlQ29sbGFwc2VkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5Nyh0aGlzLCBfaXNJbml0aWFsaXppbmdfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgaXNJbml0aWFsaXppbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc0luaXRpYWxpemluZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzSW5pdGlhbGl6aW5nKHZhbHVlMikgewogICAgICB0aGlzLiNpc0luaXRpYWxpemluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2FjdGl2ZUJvdHRvbVBhbmVsX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5Nyh0aGlzLCBfaXNJbml0aWFsaXppbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk3KHRoaXMsIF9hY3RpdmVCb3R0b21QYW5lbF9pbml0aWFsaXplcnMsICJ0ZXJtaW5hbCIpKTsKICAgIGdldCBhY3RpdmVCb3R0b21QYW5lbCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FjdGl2ZUJvdHRvbVBhbmVsX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYWN0aXZlQm90dG9tUGFuZWwodmFsdWUyKSB7CiAgICAgIHRoaXMuI2FjdGl2ZUJvdHRvbVBhbmVsX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZGlhZ25vc3RpY01hcmtlcnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk3KHRoaXMsIF9hY3RpdmVCb3R0b21QYW5lbF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX2RpYWdub3N0aWNNYXJrZXJzX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBkaWFnbm9zdGljTWFya2VycygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2RpYWdub3N0aWNNYXJrZXJzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZGlhZ25vc3RpY01hcmtlcnModmFsdWUyKSB7CiAgICAgIHRoaXMuI2RpYWdub3N0aWNNYXJrZXJzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBlZGl0b3JFbGVtZW50ID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX2RpYWdub3N0aWNNYXJrZXJzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgbnVsbCk7CiAgICBpbml0aWFsaXphdGlvblN0YXJ0ZWQgPSBmYWxzZTsKICAgIGludGVsbGlTZW5zZU1hbmFnZXIgPSBudWxsOwogICAgaW50ZWxsaVNlbnNlSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgIC8vIG5vZGVfbW9kdWxlcyB3YXRjaGVyIGZvciBhdXRvLWxvYWRpbmcgdHlwZXMKICAgIG5vZGVNb2R1bGVzV2F0Y2hlciA9IG51bGw7CiAgICBub2RlTW9kdWxlc0RlYm91bmNlVGltZW91dCA9IG51bGw7CiAgICBpbnRlbGxpU2Vuc2VEZWJvdW5jZVRpbWVvdXQgPSBudWxsOwogICAgLy8gT3BlbiBmaWxlIHdhdGNoZXJzIGZvciBleHRlcm5hbCBjaGFuZ2UgZGV0ZWN0aW9uCiAgICBvcGVuRmlsZVdhdGNoZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIGZpbGVDaGFuZ2VEZWJvdW5jZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBhY3Rpb25iYXJFbGVtZW50ID0gbnVsbDsKICAgICNhdXRvU2F2ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM5Nyh0aGlzLCBfYXV0b1NhdmVfaW5pdGlhbGl6ZXJzLCBmYWxzZSk7CiAgICAvLyBBdXRvLXNhdmUgZnVuY3Rpb25hbGl0eQogICAgZ2V0IGF1dG9TYXZlKCkgewogICAgICByZXR1cm4gdGhpcy4jYXV0b1NhdmVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhdXRvU2F2ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYXV0b1NhdmVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGF1dG9TYXZlSW50ZXJ2YWwgPSAoX19ydW5Jbml0aWFsaXplcnM5Nyh0aGlzLCBfYXV0b1NhdmVfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgICNpbml0Q29tbWFuZF9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM5Nyh0aGlzLCBfaW5pdENvbW1hbmRfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICAvLyBJbml0IHRlcm1pbmFsIHByZXZpZXcgc3RhdGUKICAgIGdldCBpbml0Q29tbWFuZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2luaXRDb21tYW5kX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaW5pdENvbW1hbmQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2luaXRDb21tYW5kX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaW5pdE91dHB1dF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX2luaXRDb21tYW5kX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5Nyh0aGlzLCBfaW5pdE91dHB1dF9pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgaW5pdE91dHB1dCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2luaXRPdXRwdXRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpbml0T3V0cHV0KHZhbHVlMikgewogICAgICB0aGlzLiNpbml0T3V0cHV0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY3VycmVudEZpbGVUcmVlV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk3KHRoaXMsIF9pbml0T3V0cHV0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5Nyh0aGlzLCBfY3VycmVudEZpbGVUcmVlV2lkdGhfaW5pdGlhbGl6ZXJzLCAyNTApKTsKICAgIC8vIFJlc2l6ZSBzdGF0ZQogICAgZ2V0IGN1cnJlbnRGaWxlVHJlZVdpZHRoKCkgewogICAgICByZXR1cm4gdGhpcy4jY3VycmVudEZpbGVUcmVlV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjdXJyZW50RmlsZVRyZWVXaWR0aCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY3VycmVudEZpbGVUcmVlV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjdXJyZW50VGVybWluYWxIZWlnaHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk3KHRoaXMsIF9jdXJyZW50RmlsZVRyZWVXaWR0aF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX2N1cnJlbnRUZXJtaW5hbEhlaWdodF9pbml0aWFsaXplcnMsIDIwMCkpOwogICAgZ2V0IGN1cnJlbnRUZXJtaW5hbEhlaWdodCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRUZXJtaW5hbEhlaWdodF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGN1cnJlbnRUZXJtaW5hbEhlaWdodCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY3VycmVudFRlcm1pbmFsSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNEcmFnZ2luZ0ZpbGVUcmVlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5Nyh0aGlzLCBfY3VycmVudFRlcm1pbmFsSGVpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5Nyh0aGlzLCBfaXNEcmFnZ2luZ0ZpbGVUcmVlX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc0RyYWdnaW5nRmlsZVRyZWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc0RyYWdnaW5nRmlsZVRyZWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc0RyYWdnaW5nRmlsZVRyZWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzRHJhZ2dpbmdGaWxlVHJlZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzRHJhZ2dpbmdUZXJtaW5hbF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX2lzRHJhZ2dpbmdGaWxlVHJlZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX2lzRHJhZ2dpbmdUZXJtaW5hbF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaXNEcmFnZ2luZ1Rlcm1pbmFsKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNEcmFnZ2luZ1Rlcm1pbmFsX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaXNEcmFnZ2luZ1Rlcm1pbmFsKHZhbHVlMikgewogICAgICB0aGlzLiNpc0RyYWdnaW5nVGVybWluYWxfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93RGlmZlZpZXdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk3KHRoaXMsIF9pc0RyYWdnaW5nVGVybWluYWxfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk3KHRoaXMsIF9zaG93RGlmZlZpZXdfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgLy8gRGlmZiB2aWV3IHN0YXRlCiAgICBnZXQgc2hvd0RpZmZWaWV3KCkgewogICAgICByZXR1cm4gdGhpcy4jc2hvd0RpZmZWaWV3X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd0RpZmZWaWV3KHZhbHVlMikgewogICAgICB0aGlzLiNzaG93RGlmZlZpZXdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNkaWZmVmlld0NvbmZpZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX3Nob3dEaWZmVmlld19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX2RpZmZWaWV3Q29uZmlnX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IGRpZmZWaWV3Q29uZmlnKCkgewogICAgICByZXR1cm4gdGhpcy4jZGlmZlZpZXdDb25maWdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkaWZmVmlld0NvbmZpZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZGlmZlZpZXdDb25maWdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIC8vIEtleWJvYXJkIHNob3J0Y3V0IGhhbmRsZXIgKGJvdW5kIGZvciBwcm9wZXIgY2xlYW51cCkKICAgIGtleWRvd25IYW5kbGVyID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX2RpZmZWaWV3Q29uZmlnX2V4dHJhSW5pdGlhbGl6ZXJzKSwgKGUxMSkgPT4gewogICAgICBpZiAoKGUxMS5tZXRhS2V5IHx8IGUxMS5jdHJsS2V5KSAmJiBlMTEua2V5ID09PSAicyIgJiYgIWUxMS5zaGlmdEtleSkgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMuc2F2ZUFjdGl2ZUZpbGUoKTsKICAgICAgfQogICAgICBpZiAoKGUxMS5tZXRhS2V5IHx8IGUxMS5jdHJsS2V5KSAmJiBlMTEuc2hpZnRLZXkgJiYgZTExLmtleS50b0xvd2VyQ2FzZSgpID09PSAicyIpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICB0aGlzLnNhdmVBbGxGaWxlcygpOwogICAgICB9CiAgICB9KTsKICAgIC8vID09PT09PT09PT0gRmlsZXRyZWUgUmVzaXplIEhhbmRsZXJzID09PT09PT09PT0KICAgIGhhbmRsZUZpbGVUcmVlTW91c2VEb3duID0gKGUxMSkgPT4gewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy5pc0RyYWdnaW5nRmlsZVRyZWUgPSB0cnVlOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCB0aGlzLmhhbmRsZUZpbGVUcmVlTW91c2VNb3ZlKTsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIHRoaXMuaGFuZGxlRmlsZVRyZWVNb3VzZVVwKTsKICAgIH07CiAgICBoYW5kbGVGaWxlVHJlZU1vdXNlTW92ZSA9IChlMTEpID0+IHsKICAgICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmdGaWxlVHJlZSkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBjb25zdCBtb3VzZVggPSBlMTEuY2xpZW50WCAtIGNvbnRhaW5lclJlY3QubGVmdDsKICAgICAgY29uc3QgbWluV2lkdGggPSAxNTA7CiAgICAgIGNvbnN0IG1heFdpZHRoID0gY29udGFpbmVyUmVjdC53aWR0aCAqIDAuNTsKICAgICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1heChtaW5XaWR0aCwgTWF0aC5taW4obWF4V2lkdGgsIG1vdXNlWCkpOwogICAgICB0aGlzLmN1cnJlbnRGaWxlVHJlZVdpZHRoID0gbmV3V2lkdGg7CiAgICB9OwogICAgaGFuZGxlRmlsZVRyZWVNb3VzZVVwID0gKCkgPT4gewogICAgICB0aGlzLmlzRHJhZ2dpbmdGaWxlVHJlZSA9IGZhbHNlOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCB0aGlzLmhhbmRsZUZpbGVUcmVlTW91c2VNb3ZlKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIHRoaXMuaGFuZGxlRmlsZVRyZWVNb3VzZVVwKTsKICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSk7CiAgICB9OwogICAgLy8gPT09PT09PT09PSBUZXJtaW5hbCBSZXNpemUgSGFuZGxlcnMgPT09PT09PT09PQogICAgaGFuZGxlVGVybWluYWxNb3VzZURvd24gPSAoZTExKSA9PiB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB0aGlzLmlzRHJhZ2dpbmdUZXJtaW5hbCA9IHRydWU7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIHRoaXMuaGFuZGxlVGVybWluYWxNb3VzZU1vdmUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5oYW5kbGVUZXJtaW5hbE1vdXNlVXApOwogICAgfTsKICAgIGhhbmRsZVRlcm1pbmFsTW91c2VNb3ZlID0gKGUxMSkgPT4gewogICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ1Rlcm1pbmFsKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IG1vdXNlWSA9IGUxMS5jbGllbnRZIC0gY29udGFpbmVyUmVjdC50b3A7CiAgICAgIGNvbnN0IHRlcm1pbmFsSGVpZ2h0ID0gY29udGFpbmVyUmVjdC5oZWlnaHQgLSBtb3VzZVk7CiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IDEwMDsKICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gY29udGFpbmVyUmVjdC5oZWlnaHQgKiAwLjc7CiAgICAgIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWF4KG1pbkhlaWdodCwgTWF0aC5taW4obWF4SGVpZ2h0LCB0ZXJtaW5hbEhlaWdodCkpOwogICAgICB0aGlzLmN1cnJlbnRUZXJtaW5hbEhlaWdodCA9IG5ld0hlaWdodDsKICAgIH07CiAgICBoYW5kbGVUZXJtaW5hbE1vdXNlVXAgPSAoKSA9PiB7CiAgICAgIHRoaXMuaXNEcmFnZ2luZ1Rlcm1pbmFsID0gZmFsc2U7CiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIHRoaXMuaGFuZGxlVGVybWluYWxNb3VzZU1vdmUpOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5oYW5kbGVUZXJtaW5hbE1vdXNlVXApOwogICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlc2l6ZSIpKTsKICAgIH07CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk2JSkiLCAiaHNsKDAgMCUgNyUpIil9OwogICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgfQoKICAgICAgLndvcmtzcGFjZS1vdXRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLndvcmtzcGFjZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5lZGl0b3ItYXJlYSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5maWxldHJlZS1wYW5lbCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5maWxldHJlZS1wYW5lbC5jb2xsYXBzZWQgewogICAgICAgIHdpZHRoOiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5lZGl0b3ItcGFuZWwgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLXdpZHRoOiAyMDBweDsKICAgICAgfQoKICAgICAgLnRlcm1pbmFsLXBhbmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4NSUpIiwgImhzbCgwIDAlIDE1JSkiKX07CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLnRlcm1pbmFsLXBhbmVsLmNvbGxhcHNlZCB7CiAgICAgICAgaGVpZ2h0OiAzMnB4ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5wYW5lbC1oZWFkZXIgewogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIHBhZGRpbmc6IDAgOHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NSUpIiwgImhzbCgwIDAlIDglKSIpfTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg1JSkiLCAiaHNsKDAgMCUgMTUlKSIpfTsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQwJSkiLCAiaHNsKDAgMCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLnBhbmVsLWhlYWRlci10aXRsZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNnB4OwogICAgICB9CgogICAgICAucGFuZWwtaGVhZGVyLWFjdGlvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDRweDsKICAgICAgfQoKICAgICAgLnBhbmVsLWFjdGlvbiB7CiAgICAgICAgd2lkdGg6IDI0cHg7CiAgICAgICAgaGVpZ2h0OiAyNHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNTAlKSIsICJoc2woMCAwJSA2MCUpIil9OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICB9CgogICAgICAucGFuZWwtYWN0aW9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODglKSIsICJoc2woMCAwJSAxOCUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMzAlKSIsICJoc2woMCAwJSA4MCUpIil9OwogICAgICB9CgogICAgICAudGFicy1iYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICAgICAgaGVpZ2h0OiAzNnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NiUpIiwgImhzbCgwIDAlIDglKSIpfTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg1JSkiLCAiaHNsKDAgMCUgMTUlKSIpfTsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICB9CgogICAgICAudGFiIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA2cHg7CiAgICAgICAgcGFkZGluZzogMCAxMnB4OwogICAgICAgIG1pbi13aWR0aDogMTIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMDBweDsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODglKSIsICJoc2woMCAwJSAxMiUpIil9OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA1MCUpIiwgImhzbCgwIDAlIDYwJSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk0JSkiLCAiaHNsKDAgMCUgMTAlKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnRhYjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDkyJSkiLCAiaHNsKDAgMCUgMTIlKSIpfTsKICAgICAgfQoKICAgICAgLnRhYi5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSA5JSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAyMCUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDEwMCUgNTAlKSIsICJoc2woMjEwIDEwMCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLnRhYi1uYW1lIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLnRhYi1jbG9zZSB7CiAgICAgICAgd2lkdGg6IDE2cHg7CiAgICAgICAgaGVpZ2h0OiAxNnB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnRhYjpob3ZlciAudGFiLWNsb3NlIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAudGFiLWNsb3NlOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODUlKSIsICJoc2woMCAwJSAyNSUpIil9OwogICAgICB9CgogICAgICAudGFiLW1vZGlmaWVkIHsKICAgICAgICB3aWR0aDogOHB4OwogICAgICAgIGhlaWdodDogOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNTAlKSIsICJoc2woMCAwJSA2MCUpIil9OwogICAgICB9CgogICAgICAudGFicy1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleDogMTsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICB9CgogICAgICAuZWRpdG9yLW1lbnUtYnV0dG9uIHsKICAgICAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogNHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgb3BhY2l0eTogMC42OwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMsIGJhY2tncm91bmQgMC4xNXM7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAuZWRpdG9yLW1lbnUtYnV0dG9uOmhvdmVyIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAwJSAvIDAuMDgpIiwgImhzbCgwIDAlIDEwMCUgLyAwLjEpIil9OwogICAgICB9CgogICAgICAuZWRpdG9yLWNvbnRlbnQgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAudGVybWluYWwtY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMzJweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLnByb2JsZW1zLWNvbnRlbnQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDMycHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICB9CgogICAgICAucGFuZWwtdGFicyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMDsKICAgICAgfQoKICAgICAgLnBhbmVsLXRhYiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNnB4OwogICAgICAgIHBhZGRpbmc6IDAgMTJweDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNTAlKSIsICJoc2woMCAwJSA1NSUpIil9OwogICAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnBhbmVsLXRhYjpob3ZlciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAzMCUpIiwgImhzbCgwIDAlIDc1JSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDkwJSkiLCAiaHNsKDAgMCUgMTIlKSIpfTsKICAgICAgfQoKICAgICAgLnBhbmVsLXRhYi5hY3RpdmUgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMjAlKSIsICJoc2woMCAwJSA5MCUpIil9OwogICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDEwMCUgNTAlKSIsICJoc2woMjEwIDEwMCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLnBhbmVsLXRhYi1iYWRnZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBtaW4td2lkdGg6IDE4cHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDlweDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzAlIDUwJSkiLCAiaHNsKDAgNzAlIDQ1JSkiKX07CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAucGFuZWwtdGFiLWJhZGdlLndhcm5pbmcgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woNDAgNzAlIDUwJSkiLCAiaHNsKDQwIDcwJSA0NSUpIil9OwogICAgICB9CgogICAgICAucGFuZWwtdGFiLWJhZGdlLm5vbmUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5wcm9ibGVtcy1saXN0IHsKICAgICAgICBwYWRkaW5nOiA0cHggMDsKICAgICAgfQoKICAgICAgLnByb2JsZW0taXRlbSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAzMCUpIiwgImhzbCgwIDAlIDgwJSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5wcm9ibGVtLWl0ZW06aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NSUpIiwgImhzbCgwIDAlIDE1JSkiKX07CiAgICAgIH0KCiAgICAgIC5wcm9ibGVtLWljb24gewogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIG1hcmdpbi10b3A6IDJweDsKICAgICAgfQoKICAgICAgLnByb2JsZW0taWNvbi5lcnJvciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA3MCUgNTAlKSIsICJoc2woMCA3MCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLnByb2JsZW0taWNvbi53YXJuaW5nIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCg0MCA3MCUgNTAlKSIsICJoc2woNDAgNzAlIDYwJSkiKX07CiAgICAgIH0KCiAgICAgIC5wcm9ibGVtLWRldGFpbHMgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICB9CgogICAgICAucHJvYmxlbS1tZXNzYWdlIHsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgICB9CgogICAgICAucHJvYmxlbS1sb2NhdGlvbiB7CiAgICAgICAgbWFyZ2luLXRvcDogMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDUwJSkiLCAiaHNsKDAgMCUgNTUlKSIpfTsKICAgICAgfQoKICAgICAgLnByb2JsZW1zLWVtcHR5IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA1NSUpIiwgImhzbCgwIDAlIDUwJSkiKX07CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGdhcDogOHB4OwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDUwJSkiLCAiaHNsKDAgMCUgNTAlKSIpfTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZSBkZWVzLWljb24gewogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgc3BpbiB7CiAgICAgICAgZnJvbSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9CiAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9CiAgICAgIH0KCiAgICAgIC5pbml0aWFsaXppbmcgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDUwJSkiLCAiaHNsKDAgMCUgNjAlKSIpfTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZ2FwOiAxMnB4OwogICAgICB9CgogICAgICAuaW5pdGlhbGl6aW5nIGRlZXMtaWNvbiB7CiAgICAgICAgYW5pbWF0aW9uOiBzcGluIDFzIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgLmluaXRpYWxpemluZyBkZWVzLXdvcmtzcGFjZS10ZXJtaW5hbC1wcmV2aWV3IHsKICAgICAgICBtYXJnaW4tdG9wOiAyNHB4OwogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgICAgbWF4LXdpZHRoOiA2MDBweDsKICAgICAgICBoZWlnaHQ6IDIwMHB4OwogICAgICB9CgogICAgICBkZWVzLXdvcmtzcGFjZS1maWxldHJlZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgfQoKICAgICAgZGVlcy13b3Jrc3BhY2UtbW9uYWNvIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICB9CgogICAgICBkZWVzLXdvcmtzcGFjZS10ZXJtaW5hbCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLyogUmVzaXplIGhhbmRsZXMgKi8KICAgICAgLnJlc2l6ZS1oYW5kbGUtdmVydGljYWwgewogICAgICAgIHdpZHRoOiA2cHg7CiAgICAgICAgY3Vyc29yOiBjb2wtcmVzaXplOwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMgZWFzZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgei1pbmRleDogMTA7CiAgICAgIH0KCiAgICAgIC5yZXNpemUtaGFuZGxlLXZlcnRpY2FsOmhvdmVyLAogICAgICAucmVzaXplLWhhbmRsZS12ZXJ0aWNhbC5kcmFnZ2luZyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzU4YTZmZiIpfTsKICAgICAgfQoKICAgICAgLnJlc2l6ZS1oYW5kbGUtdmVydGljYWw6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgICAgIHdpZHRoOiAycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOWNhM2FmIiwgIiM2ZTc2ODEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogMXB4OwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cyBlYXNlOwogICAgICB9CgogICAgICAucmVzaXplLWhhbmRsZS12ZXJ0aWNhbDpob3Zlcjo6YWZ0ZXIsCiAgICAgIC5yZXNpemUtaGFuZGxlLXZlcnRpY2FsLmRyYWdnaW5nOjphZnRlciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjZmZmZmZmIil9OwogICAgICB9CgogICAgICAucmVzaXplLWhhbmRsZS1ob3Jpem9udGFsIHsKICAgICAgICBoZWlnaHQ6IDZweDsKICAgICAgICBjdXJzb3I6IHJvdy1yZXNpemU7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cyBlYXNlOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgfQoKICAgICAgLnJlc2l6ZS1oYW5kbGUtaG9yaXpvbnRhbDpob3ZlciwKICAgICAgLnJlc2l6ZS1oYW5kbGUtaG9yaXpvbnRhbC5kcmFnZ2luZyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzU4YTZmZiIpfTsKICAgICAgfQoKICAgICAgLnJlc2l6ZS1oYW5kbGUtaG9yaXpvbnRhbDo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAycHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5Y2EzYWYiLCAiIzZlNzY4MSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAxcHg7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5yZXNpemUtaGFuZGxlLWhvcml6b250YWw6aG92ZXI6OmFmdGVyLAogICAgICAucmVzaXplLWhhbmRsZS1ob3Jpem9udGFsLmRyYWdnaW5nOjphZnRlciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjZmZmZmZmIil9OwogICAgICB9CgogICAgICAvKiBQcmV2ZW50IHRleHQgc2VsZWN0aW9uIHdoaWxlIGRyYWdnaW5nICovCiAgICAgIC53b3Jrc3BhY2UtY29udGFpbmVyLmRyYWdnaW5nIHsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgLndvcmtzcGFjZS1jb250YWluZXIuZHJhZ2dpbmcgLmZpbGV0cmVlLXBhbmVsLAogICAgICAud29ya3NwYWNlLWNvbnRhaW5lci5kcmFnZ2luZyAuZWRpdG9yLXBhbmVsLAogICAgICAud29ya3NwYWNlLWNvbnRhaW5lci5kcmFnZ2luZyAudGVybWluYWwtcGFuZWwgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgY29uc3QgY29udGFpbmVyQ2xhc3NlcyA9IFsKICAgICAgICAid29ya3NwYWNlLWNvbnRhaW5lciIsCiAgICAgICAgdGhpcy5pc0RyYWdnaW5nRmlsZVRyZWUgfHwgdGhpcy5pc0RyYWdnaW5nVGVybWluYWwgPyAiZHJhZ2dpbmciIDogIiIKICAgICAgXS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpOwogICAgICBpZiAodGhpcy5pc0luaXRpYWxpemluZykgewogICAgICAgIHJldHVybiBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJpbml0aWFsaXppbmciPgogICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6bG9hZGVyMiJ9IGljb25TaXplPSIzMiI+PC9kZWVzLWljb24+CiAgICAgICAgICA8c3Bhbj5Jbml0aWFsaXppbmcgd29ya3NwYWNlLi4uPC9zcGFuPgogICAgICAgICAgPGRlZXMtd29ya3NwYWNlLXRlcm1pbmFsLXByZXZpZXcKICAgICAgICAgICAgLmNvbW1hbmQ9JHt0aGlzLmluaXRDb21tYW5kIHx8ICIifQogICAgICAgICAgICAubGluZXM9JHt0aGlzLmluaXRPdXRwdXR9CiAgICAgICAgICA+PC9kZWVzLXdvcmtzcGFjZS10ZXJtaW5hbC1wcmV2aWV3PgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgICB9CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0id29ya3NwYWNlLW91dGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSIke2NvbnRhaW5lckNsYXNzZXN9Ij4KICAgICAgICAgIDwhLS0gRmlsZXRyZWUgcGFuZWwgKGZ1bGwgaGVpZ2h0KSAtLT4KICAgICAgICAgICR7dGhpcy5zaG93RmlsZVRyZWUgPyBiMmAKICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgIGNsYXNzPSJmaWxldHJlZS1wYW5lbCAke3RoaXMuaXNGaWxlVHJlZUNvbGxhcHNlZCA/ICJjb2xsYXBzZWQiIDogIiJ9IgogICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogJHt0aGlzLmlzRmlsZVRyZWVDb2xsYXBzZWQgPyAwIDogdGhpcy5jdXJyZW50RmlsZVRyZWVXaWR0aH1weCIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxkZWVzLXdvcmtzcGFjZS1maWxldHJlZQogICAgICAgICAgICAgICAgLmV4ZWN1dGlvbkVudmlyb25tZW50PSR7dGhpcy5leGVjdXRpb25FbnZpcm9ubWVudH0KICAgICAgICAgICAgICAgIC5zZWxlY3RlZFBhdGg9JHt0aGlzLmFjdGl2ZUZpbGVQYXRofQogICAgICAgICAgICAgICAgQGZpbGUtc2VsZWN0PSR7dGhpcy5oYW5kbGVGaWxlU2VsZWN0fQogICAgICAgICAgICAgID48L2RlZXMtd29ya3NwYWNlLWZpbGV0cmVlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgJHshdGhpcy5pc0ZpbGVUcmVlQ29sbGFwc2VkID8gYjJgCiAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgY2xhc3M9InJlc2l6ZS1oYW5kbGUtdmVydGljYWwgJHt0aGlzLmlzRHJhZ2dpbmdGaWxlVHJlZSA/ICJkcmFnZ2luZyIgOiAiIn0iCiAgICAgICAgICAgICAgICBAbW91c2Vkb3duPSR7dGhpcy5oYW5kbGVGaWxlVHJlZU1vdXNlRG93bn0KICAgICAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgIGAgOiAiIn0KCiAgICAgICAgICA8IS0tIEVkaXRvciArIFRlcm1pbmFsIGFyZWEgLS0+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJlZGl0b3ItYXJlYSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVkaXRvci1wYW5lbCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFicy1iYXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFicy1jb250YWluZXIiPgogICAgICAgICAgICAgICAgICAke3RoaXMub3BlbkZpbGVzLm1hcCgoZmlsZSkgPT4gYjJgCiAgICAgICAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InRhYiAke2ZpbGUucGF0aCA9PT0gdGhpcy5hY3RpdmVGaWxlUGF0aCA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5hY3RpdmF0ZUZpbGUoZmlsZS5wYXRoKX0KICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICAke2ZpbGUubW9kaWZpZWQgPyBiMmA8c3BhbiBjbGFzcz0idGFiLW1vZGlmaWVkIj48L3NwYW4+YCA6ICIifQogICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhYi1uYW1lIj4ke2ZpbGUubmFtZX08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGFiLWNsb3NlIiBAY2xpY2s9JHsoZTExKSA9PiB0aGlzLmNsb3NlRmlsZShlMTEsIGZpbGUucGF0aCl9PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTp4In0gaWNvblNpemU9IjEyIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgYCl9CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVkaXRvci1tZW51LWJ1dHRvbiIgQGNsaWNrPSR7dGhpcy5zaG93RWRpdG9yTWVudX0gdGl0bGU9IkVkaXRvciBvcHRpb25zIj4KICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6bW9yZVZlcnRpY2FsIn0gaWNvblNpemU9IjE2Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVkaXRvci1jb250ZW50Ij4KICAgICAgICAgICAgICAgICR7dGhpcy5zaG93RGlmZlZpZXcgJiYgdGhpcy5kaWZmVmlld0NvbmZpZyA/IGIyYAogICAgICAgICAgICAgICAgICA8ZGVlcy13b3Jrc3BhY2UtZGlmZi1lZGl0b3IKICAgICAgICAgICAgICAgICAgICAuZmlsZVBhdGg9JHt0aGlzLmRpZmZWaWV3Q29uZmlnLmZpbGVQYXRofQogICAgICAgICAgICAgICAgICAgIC5vcmlnaW5hbENvbnRlbnQ9JHt0aGlzLmRpZmZWaWV3Q29uZmlnLm9yaWdpbmFsQ29udGVudH0KICAgICAgICAgICAgICAgICAgICAubW9kaWZpZWRDb250ZW50PSR7dGhpcy5kaWZmVmlld0NvbmZpZy5tb2RpZmllZENvbnRlbnR9CiAgICAgICAgICAgICAgICAgICAgLmxhbmd1YWdlPSR7dGhpcy5kaWZmVmlld0NvbmZpZy5sYW5ndWFnZX0KICAgICAgICAgICAgICAgICAgICBAZGlmZi1yZXNvbHZlZD0ke3RoaXMuaGFuZGxlRGlmZlJlc29sdmVkfQogICAgICAgICAgICAgICAgICAgIEBkaWZmLWNsb3NlZD0keygpID0+IHsKICAgICAgICB0aGlzLnNob3dEaWZmVmlldyA9IGZhbHNlOwogICAgICAgIHRoaXMuZGlmZlZpZXdDb25maWcgPSBudWxsOwogICAgICB9fQogICAgICAgICAgICAgICAgICA+PC9kZWVzLXdvcmtzcGFjZS1kaWZmLWVkaXRvcj4KICAgICAgICAgICAgICAgIGAgOiB0aGlzLm9wZW5GaWxlcy5sZW5ndGggPT09IDAgPyBiMmAKICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiPgogICAgICAgICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOmZpbGVDb2RlIn0gaWNvblNpemU9IjQ4Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TZWxlY3QgYSBmaWxlIHRvIGVkaXQ8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgYCA6IGIyYAogICAgICAgICAgICAgICAgICA8ZGVlcy13b3Jrc3BhY2UtbW9uYWNvCiAgICAgICAgICAgICAgICAgICAgLmZpbGVQYXRoPSR7dGhpcy5hY3RpdmVGaWxlUGF0aH0KICAgICAgICAgICAgICAgICAgICAuY29udGVudD0ke3RoaXMuZ2V0QWN0aXZlRmlsZUNvbnRlbnQoKX0KICAgICAgICAgICAgICAgICAgICAubGFuZ3VhZ2U9JHt0aGlzLmdldExhbmd1YWdlRnJvbVBhdGgodGhpcy5hY3RpdmVGaWxlUGF0aCl9CiAgICAgICAgICAgICAgICAgICAgQGNvbnRlbnQtY2hhbmdlPSR7dGhpcy5oYW5kbGVDb250ZW50Q2hhbmdlfQogICAgICAgICAgICAgICAgICA+PC9kZWVzLXdvcmtzcGFjZS1tb25hY28+CiAgICAgICAgICAgICAgICBgfQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkZWVzLWFjdGlvbmJhcj48L2RlZXMtYWN0aW9uYmFyPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gSG9yaXpvbnRhbCByZXNpemUgaGFuZGxlIGZvciB0ZXJtaW5hbCAtLT4KICAgICAgICAgICAgJHt0aGlzLnNob3dUZXJtaW5hbCAmJiAhdGhpcy5pc1Rlcm1pbmFsQ29sbGFwc2VkID8gYjJgCiAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgY2xhc3M9InJlc2l6ZS1oYW5kbGUtaG9yaXpvbnRhbCAke3RoaXMuaXNEcmFnZ2luZ1Rlcm1pbmFsID8gImRyYWdnaW5nIiA6ICIifSIKICAgICAgICAgICAgICAgIEBtb3VzZWRvd249JHt0aGlzLmhhbmRsZVRlcm1pbmFsTW91c2VEb3dufQogICAgICAgICAgICAgID48L2Rpdj4KICAgICAgICAgICAgYCA6ICIifQoKICAgICAgICAgICAgPCEtLSBUZXJtaW5hbCBwYW5lbCAtLT4KICAgICAgICAgICAgJHt0aGlzLnNob3dUZXJtaW5hbCA/IGIyYAogICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgIGNsYXNzPSJ0ZXJtaW5hbC1wYW5lbCAke3RoaXMuaXNUZXJtaW5hbENvbGxhcHNlZCA/ICJjb2xsYXBzZWQiIDogIiJ9IgogICAgICAgICAgICAgICAgc3R5bGU9ImhlaWdodDogJHt0aGlzLmlzVGVybWluYWxDb2xsYXBzZWQgPyAzMiA6IHRoaXMuY3VycmVudFRlcm1pbmFsSGVpZ2h0fXB4IgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhbmVsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhbmVsLXRhYnMiPgogICAgICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJwYW5lbC10YWIgJHt0aGlzLmFjdGl2ZUJvdHRvbVBhbmVsID09PSAidGVybWluYWwiID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmFjdGl2ZUJvdHRvbVBhbmVsID0gInRlcm1pbmFsIn0KICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTp0ZXJtaW5hbCJ9IGljb25TaXplPSIxNCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICAgICAgICBUZXJtaW5hbAogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJwYW5lbC10YWIgJHt0aGlzLmFjdGl2ZUJvdHRvbVBhbmVsID09PSAicHJvYmxlbXMiID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmFjdGl2ZUJvdHRvbVBhbmVsID0gInByb2JsZW1zIn0KICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTpjaXJjbGVBbGVydCJ9IGljb25TaXplPSIxNCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICAgICAgICBQcm9ibGVtcwogICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLmRpYWdub3N0aWNNYXJrZXJzLmxlbmd0aCA+IDAgPyBiMmAKICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InBhbmVsLXRhYi1iYWRnZSAke3RoaXMuZ2V0RXJyb3JDb3VudCgpID09PSAwID8gIndhcm5pbmciIDogIiJ9Ij4ke3RoaXMuZGlhZ25vc3RpY01hcmtlcnMubGVuZ3RofTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhbmVsLWhlYWRlci1hY3Rpb25zIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbC1hY3Rpb24iIEBjbGljaz0ke3RoaXMudG9nZ2xlVGVybWluYWx9PgogICAgICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbgogICAgICAgICAgICAgICAgICAgICAgICAuaWNvbj0ke3RoaXMuaXNUZXJtaW5hbENvbGxhcHNlZCA/ICJsdWNpZGU6Y2hldnJvblVwIiA6ICJsdWNpZGU6Y2hldnJvbkRvd24ifQogICAgICAgICAgICAgICAgICAgICAgICBpY29uU2l6ZT0iMTQiCiAgICAgICAgICAgICAgICAgICAgICA+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXJtaW5hbC1jb250ZW50IiBzdHlsZT0iZGlzcGxheTogJHt0aGlzLmFjdGl2ZUJvdHRvbVBhbmVsID09PSAidGVybWluYWwiID8gImJsb2NrIiA6ICJub25lIn0iPgogICAgICAgICAgICAgICAgICA8ZGVlcy13b3Jrc3BhY2UtdGVybWluYWwKICAgICAgICAgICAgICAgICAgICAuZXhlY3V0aW9uRW52aXJvbm1lbnQ9JHt0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50fQogICAgICAgICAgICAgICAgICAgIC5zZXR1cENvbW1hbmQ9JHsiIn0KICAgICAgICAgICAgICAgICAgPjwvZGVlcy13b3Jrc3BhY2UtdGVybWluYWw+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByb2JsZW1zLWNvbnRlbnQiIHN0eWxlPSJkaXNwbGF5OiAke3RoaXMuYWN0aXZlQm90dG9tUGFuZWwgPT09ICJwcm9ibGVtcyIgPyAiYmxvY2siIDogIm5vbmUifSI+CiAgICAgICAgICAgICAgICAgICR7dGhpcy5yZW5kZXJQcm9ibGVtc1BhbmVsKCl9CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYCA6ICIifQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDwhLS0gQm90dG9tIEJhciAoZnVsbCB3aWR0aCkgLS0+CiAgICAgICAgPGRlZXMtd29ya3NwYWNlLWJvdHRvbWJhcgogICAgICAgICAgLmV4ZWN1dGlvbkVudmlyb25tZW50PSR7dGhpcy5leGVjdXRpb25FbnZpcm9ubWVudH0KICAgICAgICAgIEBydW4tcHJvY2Vzcz0ke3RoaXMuaGFuZGxlUnVuUHJvY2Vzc30KICAgICAgICA+PC9kZWVzLXdvcmtzcGFjZS1ib3R0b21iYXI+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgdGhpcy5rZXlkb3duSGFuZGxlcik7CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIHRoaXMua2V5ZG93bkhhbmRsZXIpOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCB0aGlzLmhhbmRsZUZpbGVUcmVlTW91c2VNb3ZlKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIHRoaXMuaGFuZGxlRmlsZVRyZWVNb3VzZVVwKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgdGhpcy5oYW5kbGVUZXJtaW5hbE1vdXNlTW92ZSk7CiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCB0aGlzLmhhbmRsZVRlcm1pbmFsTW91c2VVcCk7CiAgICAgIGlmICh0aGlzLmF1dG9TYXZlSW50ZXJ2YWwpIHsKICAgICAgICBjbGVhckludGVydmFsKHRoaXMuYXV0b1NhdmVJbnRlcnZhbCk7CiAgICAgICAgdGhpcy5hdXRvU2F2ZUludGVydmFsID0gbnVsbDsKICAgICAgfQogICAgICB0aGlzLnN0b3BOb2RlTW9kdWxlc1dhdGNoZXIoKTsKICAgICAgdGhpcy5zdG9wQWxsRmlsZVdhdGNoZXJzKCk7CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIHRoaXMuY3VycmVudEZpbGVUcmVlV2lkdGggPSB0aGlzLmZpbGVUcmVlV2lkdGg7CiAgICAgIHRoaXMuY3VycmVudFRlcm1pbmFsSGVpZ2h0ID0gdGhpcy50ZXJtaW5hbEhlaWdodDsKICAgICAgaWYgKHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVXb3Jrc3BhY2UoKTsKICAgICAgfQogICAgfQogICAgYXN5bmMgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJleGVjdXRpb25FbnZpcm9ubWVudCIpICYmIHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVXb3Jrc3BhY2UoKTsKICAgICAgfQogICAgICBpZiAoIXRoaXMuYWN0aW9uYmFyRWxlbWVudCkgewogICAgICAgIHRoaXMuYWN0aW9uYmFyRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmVkaXRvci1wYW5lbCBkZWVzLWFjdGlvbmJhciIpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBpbml0aWFsaXplV29ya3NwYWNlKCkgewogICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpCiAgICAgICAgcmV0dXJuOwogICAgICBpZiAodGhpcy5pbml0aWFsaXphdGlvblN0YXJ0ZWQpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLmluaXRpYWxpemF0aW9uU3RhcnRlZCA9IHRydWU7CiAgICAgIHRoaXMuaXNJbml0aWFsaXppbmcgPSB0cnVlOwogICAgICB0cnkgewogICAgICAgIGlmICh0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZSkgewogICAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2U7CiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5yZWFkeSkgewogICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5pbml0KCk7CiAgICAgICAgfQogICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZU9uSW5pdENvbW1hbmQoKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB3b3Jrc3BhY2U6IiwgZXJyb3IpOwogICAgICAgIHRoaXMuaW5pdGlhbGl6YXRpb25TdGFydGVkID0gZmFsc2U7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgdGhpcy5pc0luaXRpYWxpemluZyA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEV4ZWN1dGUgb25Jbml0IGNvbW1hbmQgZnJvbSBucG1leHRyYS5qc29uIGlmIHByZXNlbnQKICAgICAqIFRoaXMgYWxsb3dzIGF1dG9tYXRpYyBzZXR1cCBsaWtlIGBwbnBtIGluc3RhbGxgIG9uIHdvcmtzcGFjZSBpbml0aWFsaXphdGlvbgogICAgICovCiAgICBhc3luYyBleGVjdXRlT25Jbml0Q29tbWFuZCgpIHsKICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICAgIHJldHVybjsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5leGlzdHMoIi9ucG1leHRyYS5qc29uIikpIHsKICAgICAgICAgIGNvbnN0IGNvbnRlbnQzID0gYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5yZWFkRmlsZSgiL25wbWV4dHJhLmpzb24iKTsKICAgICAgICAgIGNvbnN0IGNvbmZpZzMgPSBKU09OLnBhcnNlKGNvbnRlbnQzKTsKICAgICAgICAgIGNvbnN0IG9uSW5pdCA9IGNvbmZpZzM/LmRlZXNFZGl0b3JXb3Jrc3BhY2U/Lm9uSW5pdDsKICAgICAgICAgIGlmIChvbkluaXQgJiYgdHlwZW9mIG9uSW5pdCA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coIkV4ZWN1dGluZyBvbkluaXQgY29tbWFuZDoiLCBvbkluaXQpOwogICAgICAgICAgICB0aGlzLmluaXRDb21tYW5kID0gb25Jbml0OwogICAgICAgICAgICB0aGlzLmluaXRPdXRwdXQgPSBbXTsKICAgICAgICAgICAgY29uc3QgW2NtZCwgLi4uYXJnc10gPSBvbkluaXQuc3BsaXQoIiAiKTsKICAgICAgICAgICAgY29uc3QgcHJvY2VzczQgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnNwYXduKGNtZCwgYXJncyk7CiAgICAgICAgICAgIHByb2Nlc3M0Lm91dHB1dC5waXBlVG8obmV3IFdyaXRhYmxlU3RyZWFtKHsKICAgICAgICAgICAgICB3cml0ZTogKGRhdGEpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gZGF0YS5zcGxpdCgiXG4iKTsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykgewogICAgICAgICAgICAgICAgICBpZiAobGluZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdE91dHB1dCA9IFsuLi50aGlzLmluaXRPdXRwdXQsIGxpbmVdOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcHJvY2VzczQuZXhpdDsKICAgICAgICAgICAgY29uc29sZS5sb2coIm9uSW5pdCBjb21tYW5kIGNvbXBsZXRlZCB3aXRoIGV4aXQgY29kZToiLCBleGl0Q29kZSk7CiAgICAgICAgICAgIHRoaXMuaW5pdE91dHB1dCA9IFsuLi50aGlzLmluaXRPdXRwdXQsICIiLCBgQ29tbWFuZCBjb21wbGV0ZWQgd2l0aCBleGl0IGNvZGU6ICR7ZXhpdENvZGV9YF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUud2FybigiRmFpbGVkIHRvIGV4ZWN1dGUgb25Jbml0IGNvbW1hbmQ6IiwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBpbml0aWFsaXplSW50ZWxsaVNlbnNlKCkgewogICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpCiAgICAgICAgcmV0dXJuOwogICAgICBpZiAodGhpcy5pbnRlbGxpU2Vuc2VJbml0aWFsaXplZCkKICAgICAgICByZXR1cm47CiAgICAgIGxldCBtb25hY29JbnN0YW5jZSA9IHdpbmRvdy5tb25hY287CiAgICAgIGlmICghbW9uYWNvSW5zdGFuY2UpIHsKICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHNldFRpbWVvdXQocmVzb2x2ZTIsIDEwMCkpOwogICAgICAgIG1vbmFjb0luc3RhbmNlID0gd2luZG93Lm1vbmFjbzsKICAgICAgfQogICAgICBpZiAoIW1vbmFjb0luc3RhbmNlKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJNb25hY28gbm90IHlldCBsb2FkZWQsIEludGVsbGlTZW5zZSB3aWxsIGJlIGluaXRpYWxpemVkIGxhdGVyIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuaW50ZWxsaVNlbnNlSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICB0aGlzLmludGVsbGlTZW5zZU1hbmFnZXIgPSBuZXcgVHlwZVNjcmlwdEludGVsbGlTZW5zZU1hbmFnZXIoKTsKICAgICAgYXdhaXQgdGhpcy5pbnRlbGxpU2Vuc2VNYW5hZ2VyLmluaXQobW9uYWNvSW5zdGFuY2UsIHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpOwogICAgICB0aGlzLnNldHVwTWFya2VyTGlzdGVuZXIoKTsKICAgICAgdGhpcy5zdGFydE5vZGVNb2R1bGVzV2F0Y2hlcigpOwogICAgICBhd2FpdCB0aGlzLmludGVsbGlTZW5zZU1hbmFnZXIuc2NhbkFuZExvYWROZXdQYWNrYWdlVHlwZXMoKTsKICAgIH0KICAgIC8qKgogICAgICogV2F0Y2ggbm9kZV9tb2R1bGVzIGZvciBjaGFuZ2VzIChlLmcuLCBhZnRlciBwbnBtIGluc3RhbGwpCiAgICAgKiBhbmQgYXV0b21hdGljYWxseSBsb2FkIHR5cGVzIGZvciBuZXcgcGFja2FnZXMKICAgICAqLwogICAgc3RhcnROb2RlTW9kdWxlc1dhdGNoZXIoKSB7CiAgICAgIGlmICghdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCB8fCB0aGlzLm5vZGVNb2R1bGVzV2F0Y2hlcikKICAgICAgICByZXR1cm47CiAgICAgIHRyeSB7CiAgICAgICAgdGhpcy5ub2RlTW9kdWxlc1dhdGNoZXIgPSB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LndhdGNoKCIvbm9kZV9tb2R1bGVzIiwgKF9ldmVudCwgX2ZpbGVuYW1lKSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5ub2RlTW9kdWxlc0RlYm91bmNlVGltZW91dCkgewogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ub2RlTW9kdWxlc0RlYm91bmNlVGltZW91dCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLm5vZGVNb2R1bGVzRGVib3VuY2VUaW1lb3V0ID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGlmICh0aGlzLmludGVsbGlTZW5zZU1hbmFnZXIpIHsKICAgICAgICAgICAgICBhd2FpdCB0aGlzLmludGVsbGlTZW5zZU1hbmFnZXIuc2NhbkFuZExvYWROZXdQYWNrYWdlVHlwZXMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgMmUzKTsKICAgICAgICB9LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLndhcm4oIkNvdWxkIG5vdCB3YXRjaCBub2RlX21vZHVsZXM6IiwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICBzdG9wTm9kZU1vZHVsZXNXYXRjaGVyKCkgewogICAgICBpZiAodGhpcy5ub2RlTW9kdWxlc1dhdGNoZXIpIHsKICAgICAgICB0aGlzLm5vZGVNb2R1bGVzV2F0Y2hlci5zdG9wKCk7CiAgICAgICAgdGhpcy5ub2RlTW9kdWxlc1dhdGNoZXIgPSBudWxsOwogICAgICB9CiAgICAgIGlmICh0aGlzLm5vZGVNb2R1bGVzRGVib3VuY2VUaW1lb3V0KSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubm9kZU1vZHVsZXNEZWJvdW5jZVRpbWVvdXQpOwogICAgICAgIHRoaXMubm9kZU1vZHVsZXNEZWJvdW5jZVRpbWVvdXQgPSBudWxsOwogICAgICB9CiAgICB9CiAgICAvLyA9PT09PT09PT09IE9wZW4gRmlsZSBXYXRjaGluZyBmb3IgRXh0ZXJuYWwgQ2hhbmdlcyA9PT09PT09PT09CiAgICAvKioKICAgICAqIFN0YXJ0IHdhdGNoaW5nIGFuIG9wZW4gZmlsZSBmb3IgZXh0ZXJuYWwgY2hhbmdlcwogICAgICovCiAgICBzdGFydFdhdGNoaW5nRmlsZShwYXRoMikgewogICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQgfHwgdGhpcy5vcGVuRmlsZVdhdGNoZXJzLmhhcyhwYXRoMikpCiAgICAgICAgcmV0dXJuOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IHdhdGNoZXIgPSB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LndhdGNoKHBhdGgyLCAoX2V2ZW50LCBfZmlsZW5hbWUpID0+IHsKICAgICAgICAgIGNvbnN0IGV4aXN0aW5nVGltZW91dCA9IHRoaXMuZmlsZUNoYW5nZURlYm91bmNlLmdldChwYXRoMik7CiAgICAgICAgICBpZiAoZXhpc3RpbmdUaW1lb3V0KSB7CiAgICAgICAgICAgIGNsZWFyVGltZW91dChleGlzdGluZ1RpbWVvdXQpOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgdGltZW91dDIgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgdGhpcy5oYW5kbGVFeHRlcm5hbEZpbGVDaGFuZ2UocGF0aDIpOwogICAgICAgICAgICB0aGlzLmZpbGVDaGFuZ2VEZWJvdW5jZS5kZWxldGUocGF0aDIpOwogICAgICAgICAgfSwgMzAwKTsKICAgICAgICAgIHRoaXMuZmlsZUNoYW5nZURlYm91bmNlLnNldChwYXRoMiwgdGltZW91dDIpOwogICAgICAgIH0pOwogICAgICAgIHRoaXMub3BlbkZpbGVXYXRjaGVycy5zZXQocGF0aDIsIHdhdGNoZXIpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUud2FybihgQ291bGQgbm90IHdhdGNoIGZpbGUgJHtwYXRoMn06YCwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFN0b3Agd2F0Y2hpbmcgYSBmaWxlIHdoZW4gaXQncyBjbG9zZWQKICAgICAqLwogICAgc3RvcFdhdGNoaW5nRmlsZShwYXRoMikgewogICAgICBjb25zdCB3YXRjaGVyID0gdGhpcy5vcGVuRmlsZVdhdGNoZXJzLmdldChwYXRoMik7CiAgICAgIGlmICh3YXRjaGVyKSB7CiAgICAgICAgd2F0Y2hlci5zdG9wKCk7CiAgICAgICAgdGhpcy5vcGVuRmlsZVdhdGNoZXJzLmRlbGV0ZShwYXRoMik7CiAgICAgIH0KICAgICAgY29uc3QgdGltZW91dDIgPSB0aGlzLmZpbGVDaGFuZ2VEZWJvdW5jZS5nZXQocGF0aDIpOwogICAgICBpZiAodGltZW91dDIpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dDIpOwogICAgICAgIHRoaXMuZmlsZUNoYW5nZURlYm91bmNlLmRlbGV0ZShwYXRoMik7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU3RvcCBhbGwgZmlsZSB3YXRjaGVycwogICAgICovCiAgICBzdG9wQWxsRmlsZVdhdGNoZXJzKCkgewogICAgICBmb3IgKGNvbnN0IHdhdGNoZXIgb2YgdGhpcy5vcGVuRmlsZVdhdGNoZXJzLnZhbHVlcygpKSB7CiAgICAgICAgd2F0Y2hlci5zdG9wKCk7CiAgICAgIH0KICAgICAgdGhpcy5vcGVuRmlsZVdhdGNoZXJzLmNsZWFyKCk7CiAgICAgIGZvciAoY29uc3QgdGltZW91dDIgb2YgdGhpcy5maWxlQ2hhbmdlRGVib3VuY2UudmFsdWVzKCkpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dDIpOwogICAgICB9CiAgICAgIHRoaXMuZmlsZUNoYW5nZURlYm91bmNlLmNsZWFyKCk7CiAgICB9CiAgICAvKioKICAgICAqIEhhbmRsZSBleHRlcm5hbCBmaWxlIGNoYW5nZSAtIHNob3cgYWN0aW9uYmFyIGlmIGZpbGUgaGFzIGxvY2FsIGNoYW5nZXMsCiAgICAgKiBvdGhlcndpc2Ugc2lsZW50bHkgdXBkYXRlIHdpdGggY3Vyc29yIHByZXNlcnZhdGlvbgogICAgICovCiAgICBhc3luYyBoYW5kbGVFeHRlcm5hbEZpbGVDaGFuZ2UocGF0aDIpIHsKICAgICAgY29uc3QgZmlsZSA9IHRoaXMub3BlbkZpbGVzLmZpbmQoKGY3KSA9PiBmNy5wYXRoID09PSBwYXRoMik7CiAgICAgIGlmICghZmlsZSB8fCAhdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCkKICAgICAgICByZXR1cm47CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZEZpbGUocGF0aDIpOwogICAgICAgIGlmIChuZXdDb250ZW50ID09PSBmaWxlLmNvbnRlbnQpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYgKGZpbGUubW9kaWZpZWQpIHsKICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWN0aW9uYmFyRWxlbWVudD8uc2hvdyh7CiAgICAgICAgICAgIG1lc3NhZ2U6IGAiJHtmaWxlLm5hbWV9IiBjaGFuZ2VkIG9uIGRpc2suIFdoYXQgZG8geW91IHdhbnQgdG8gZG8/YCwKICAgICAgICAgICAgdHlwZTogInF1ZXN0aW9uIiwKICAgICAgICAgICAgaWNvbjogImx1Y2lkZTpnaXRNZXJnZSIsCiAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICB7IGlkOiAibG9hZC1kaXNrIiwgbGFiZWw6ICJMb2FkIGZyb20gRGlzayIsIHByaW1hcnk6IHRydWUgfSwKICAgICAgICAgICAgICB7IGlkOiAic2F2ZS1sb2NhbCIsIGxhYmVsOiAiU2F2ZSBMb2NhbCB0byBEaXNrIiB9LAogICAgICAgICAgICAgIHsgaWQ6ICJjb21wYXJlIiwgbGFiZWw6ICJDb21wYXJlIiB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIHRpbWVvdXQ6IHsgZHVyYXRpb246IDE1ZTMsIGRlZmF1bHRBY3Rpb25JZDogImxvYWQtZGlzayIgfSwKICAgICAgICAgICAgZGlzbWlzc2libGU6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uSWQgPT09ICJsb2FkLWRpc2siKSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlRmlsZUNvbnRlbnQocGF0aDIsIG5ld0NvbnRlbnQsIGZhbHNlKTsKICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0Py5hY3Rpb25JZCA9PT0gInNhdmUtbG9jYWwiKSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQud3JpdGVGaWxlKHBhdGgyLCBmaWxlLmNvbnRlbnQpOwogICAgICAgICAgICB0aGlzLm9wZW5GaWxlcyA9IHRoaXMub3BlbkZpbGVzLm1hcCgoZjcpID0+IGY3LnBhdGggPT09IHBhdGgyID8geyAuLi5mNywgbW9kaWZpZWQ6IGZhbHNlIH0gOiBmNyk7CiAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdD8uYWN0aW9uSWQgPT09ICJjb21wYXJlIikgewogICAgICAgICAgICB0aGlzLm9wZW5EaWZmVmlldyhwYXRoMiwgZmlsZS5jb250ZW50LCBuZXdDb250ZW50KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVGaWxlQ29udGVudChwYXRoMiwgbmV3Q29udGVudCwgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGhhbmRsZSBleHRlcm5hbCBjaGFuZ2UgZm9yICR7cGF0aDJ9OmAsIGVycm9yKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGUgZmlsZSBjb250ZW50IGluIHN0YXRlIGFuZCBvcHRpb25hbGx5IGluIHRoZSBlZGl0b3IKICAgICAqLwogICAgYXN5bmMgdXBkYXRlRmlsZUNvbnRlbnQocGF0aDIsIG5ld0NvbnRlbnQsIHByZXNlcnZlQ3Vyc29yKSB7CiAgICAgIHRoaXMub3BlbkZpbGVzID0gdGhpcy5vcGVuRmlsZXMubWFwKChmNykgPT4gZjcucGF0aCA9PT0gcGF0aDIgPyB7IC4uLmY3LCBjb250ZW50OiBuZXdDb250ZW50LCBtb2RpZmllZDogZmFsc2UgfSA6IGY3KTsKICAgICAgaWYgKHBhdGgyID09PSB0aGlzLmFjdGl2ZUZpbGVQYXRoKSB7CiAgICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCJkZWVzLXdvcmtzcGFjZS1tb25hY28iKTsKICAgICAgICBpZiAoZWRpdG9yKSB7CiAgICAgICAgICBhd2FpdCBlZGl0b3Iuc2V0Q29udGVudEV4dGVybmFsKG5ld0NvbnRlbnQsIHByZXNlcnZlQ3Vyc29yKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogT3BlbiB0aGUgZGlmZiB2aWV3IHRvIGNvbXBhcmUgbG9jYWwgYW5kIGRpc2sgdmVyc2lvbnMKICAgICAqLwogICAgb3BlbkRpZmZWaWV3KHBhdGgyLCBsb2NhbENvbnRlbnQsIGRpc2tDb250ZW50KSB7CiAgICAgIHRoaXMuZGlmZlZpZXdDb25maWcgPSB7CiAgICAgICAgZmlsZVBhdGg6IHBhdGgyLAogICAgICAgIG9yaWdpbmFsQ29udGVudDogZGlza0NvbnRlbnQsCiAgICAgICAgbW9kaWZpZWRDb250ZW50OiBsb2NhbENvbnRlbnQsCiAgICAgICAgbGFuZ3VhZ2U6IHRoaXMuZ2V0TGFuZ3VhZ2VGcm9tUGF0aChwYXRoMikKICAgICAgfTsKICAgICAgdGhpcy5zaG93RGlmZlZpZXcgPSB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBIYW5kbGUgZGlmZiB2aWV3IHJlc29sdXRpb24KICAgICAqLwogICAgYXN5bmMgaGFuZGxlRGlmZlJlc29sdmVkKGUxMSkgewogICAgICBjb25zdCB7IGFjdGlvbiwgY29udGVudDogY29udGVudDMgfSA9IGUxMS5kZXRhaWw7CiAgICAgIGNvbnN0IHBhdGgyID0gdGhpcy5kaWZmVmlld0NvbmZpZz8uZmlsZVBhdGg7CiAgICAgIGlmICghcGF0aDIgfHwgIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKICAgICAgICB0aGlzLnNob3dEaWZmVmlldyA9IGZhbHNlOwogICAgICAgIHRoaXMuZGlmZlZpZXdDb25maWcgPSBudWxsOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoYWN0aW9uID09PSAidXNlLWxvY2FsIikgewogICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQud3JpdGVGaWxlKHBhdGgyLCBjb250ZW50Myk7CiAgICAgICAgdGhpcy5vcGVuRmlsZXMgPSB0aGlzLm9wZW5GaWxlcy5tYXAoKGY3KSA9PiBmNy5wYXRoID09PSBwYXRoMiA/IHsgLi4uZjcsIGNvbnRlbnQ6IGNvbnRlbnQzLCBtb2RpZmllZDogZmFsc2UgfSA6IGY3KTsKICAgICAgICBpZiAocGF0aDIgPT09IHRoaXMuYWN0aXZlRmlsZVBhdGgpIHsKICAgICAgICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiZGVlcy13b3Jrc3BhY2UtbW9uYWNvIik7CiAgICAgICAgICBpZiAoZWRpdG9yKSB7CiAgICAgICAgICAgIGF3YWl0IGVkaXRvci5zZXRDb250ZW50RXh0ZXJuYWwoY29udGVudDMsIGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAidXNlLWRpc2siKSB7CiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVGaWxlQ29udGVudChwYXRoMiwgY29udGVudDMsIGZhbHNlKTsKICAgICAgfQogICAgICB0aGlzLnNob3dEaWZmVmlldyA9IGZhbHNlOwogICAgICB0aGlzLmRpZmZWaWV3Q29uZmlnID0gbnVsbDsKICAgIH0KICAgIGFzeW5jIGhhbmRsZUZpbGVTZWxlY3QoZTExKSB7CiAgICAgIGNvbnN0IHsgcGF0aDogcGF0aDIsIG5hbWUgfSA9IGUxMS5kZXRhaWw7CiAgICAgIGF3YWl0IHRoaXMub3BlbkZpbGUocGF0aDIsIG5hbWUpOwogICAgfQogICAgYXN5bmMgb3BlbkZpbGUocGF0aDIsIG5hbWUpIHsKICAgICAgY29uc3QgZXhpc3RpbmdGaWxlID0gdGhpcy5vcGVuRmlsZXMuZmluZCgoZjcpID0+IGY3LnBhdGggPT09IHBhdGgyKTsKICAgICAgaWYgKGV4aXN0aW5nRmlsZSkgewogICAgICAgIHRoaXMuYWN0aXZlRmlsZVBhdGggPSBwYXRoMjsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICAgIHJldHVybjsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBjb250ZW50MyA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZEZpbGUocGF0aDIpOwogICAgICAgIHRoaXMub3BlbkZpbGVzID0gWwogICAgICAgICAgLi4udGhpcy5vcGVuRmlsZXMsCiAgICAgICAgICB7IHBhdGg6IHBhdGgyLCBuYW1lLCBjb250ZW50OiBjb250ZW50MywgbW9kaWZpZWQ6IGZhbHNlIH0KICAgICAgICBdOwogICAgICAgIHRoaXMuYWN0aXZlRmlsZVBhdGggPSBwYXRoMjsKICAgICAgICB0aGlzLnN0YXJ0V2F0Y2hpbmdGaWxlKHBhdGgyKTsKICAgICAgICBpZiAoIXRoaXMuaW50ZWxsaVNlbnNlSW5pdGlhbGl6ZWQpIHsKICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7CiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHNldFRpbWVvdXQocmVzb2x2ZTIsIDUwMCkpOwogICAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplSW50ZWxsaVNlbnNlKCk7CiAgICAgICAgICBjb25zdCBsYW5ndWFnZSA9IHRoaXMuZ2V0TGFuZ3VhZ2VGcm9tUGF0aChwYXRoMik7CiAgICAgICAgICBpZiAodGhpcy5pbnRlbGxpU2Vuc2VNYW5hZ2VyICYmIChsYW5ndWFnZSA9PT0gInR5cGVzY3JpcHQiIHx8IGxhbmd1YWdlID09PSAiamF2YXNjcmlwdCIpKSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuaW50ZWxsaVNlbnNlTWFuYWdlci5wcm9jZXNzQ29udGVudENoYW5nZShjb250ZW50Myk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBvcGVuIGZpbGUgJHtwYXRoMn06YCwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICBhY3RpdmF0ZUZpbGUocGF0aDIpIHsKICAgICAgdGhpcy5hY3RpdmVGaWxlUGF0aCA9IHBhdGgyOwogICAgfQogICAgY2xvc2VGaWxlKGUxMSwgcGF0aDIpIHsKICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBjb25zdCBmaWxlSW5kZXggPSB0aGlzLm9wZW5GaWxlcy5maW5kSW5kZXgoKGY3KSA9PiBmNy5wYXRoID09PSBwYXRoMik7CiAgICAgIGlmIChmaWxlSW5kZXggPT09IC0xKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgZmlsZSA9IHRoaXMub3BlbkZpbGVzW2ZpbGVJbmRleF07CiAgICAgIGlmIChmaWxlLm1vZGlmaWVkKSB7CiAgICAgICAgY29uc3QgY29uZmlybWVkID0gY29uZmlybShgJHtmaWxlLm5hbWV9IGhhcyB1bnNhdmVkIGNoYW5nZXMuIENsb3NlIGFueXdheT9gKTsKICAgICAgICBpZiAoIWNvbmZpcm1lZCkKICAgICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLnN0b3BXYXRjaGluZ0ZpbGUocGF0aDIpOwogICAgICB0aGlzLm9wZW5GaWxlcyA9IHRoaXMub3BlbkZpbGVzLmZpbHRlcigoZjcpID0+IGY3LnBhdGggIT09IHBhdGgyKTsKICAgICAgaWYgKHRoaXMuYWN0aXZlRmlsZVBhdGggPT09IHBhdGgyKSB7CiAgICAgICAgaWYgKHRoaXMub3BlbkZpbGVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGNvbnN0IG5ld0luZGV4ID0gTWF0aC5taW4oZmlsZUluZGV4LCB0aGlzLm9wZW5GaWxlcy5sZW5ndGggLSAxKTsKICAgICAgICAgIHRoaXMuYWN0aXZlRmlsZVBhdGggPSB0aGlzLm9wZW5GaWxlc1tuZXdJbmRleF0ucGF0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5hY3RpdmVGaWxlUGF0aCA9ICIiOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZ2V0QWN0aXZlRmlsZUNvbnRlbnQoKSB7CiAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLm9wZW5GaWxlcy5maW5kKChmNykgPT4gZjcucGF0aCA9PT0gdGhpcy5hY3RpdmVGaWxlUGF0aCk7CiAgICAgIHJldHVybiBmaWxlPy5jb250ZW50IHx8ICIiOwogICAgfQogICAgaGFuZGxlQ29udGVudENoYW5nZShlMTEpIHsKICAgICAgY29uc3QgbmV3Q29udGVudCA9IGUxMS5kZXRhaWw7CiAgICAgIGNvbnN0IGZpbGVJbmRleCA9IHRoaXMub3BlbkZpbGVzLmZpbmRJbmRleCgoZjcpID0+IGY3LnBhdGggPT09IHRoaXMuYWN0aXZlRmlsZVBhdGgpOwogICAgICBpZiAoZmlsZUluZGV4ID09PSAtMSkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLm9wZW5GaWxlc1tmaWxlSW5kZXhdOwogICAgICBpZiAoZmlsZS5jb250ZW50ICE9PSBuZXdDb250ZW50KSB7CiAgICAgICAgdGhpcy5vcGVuRmlsZXMgPSBbCiAgICAgICAgICAuLi50aGlzLm9wZW5GaWxlcy5zbGljZSgwLCBmaWxlSW5kZXgpLAogICAgICAgICAgeyAuLi5maWxlLCBjb250ZW50OiBuZXdDb250ZW50LCBtb2RpZmllZDogdHJ1ZSB9LAogICAgICAgICAgLi4udGhpcy5vcGVuRmlsZXMuc2xpY2UoZmlsZUluZGV4ICsgMSkKICAgICAgICBdOwogICAgICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy5nZXRMYW5ndWFnZUZyb21QYXRoKHRoaXMuYWN0aXZlRmlsZVBhdGgpOwogICAgICAgIGlmICh0aGlzLmludGVsbGlTZW5zZU1hbmFnZXIgJiYgKGxhbmd1YWdlID09PSAidHlwZXNjcmlwdCIgfHwgbGFuZ3VhZ2UgPT09ICJqYXZhc2NyaXB0IikpIHsKICAgICAgICAgIGlmICh0aGlzLmludGVsbGlTZW5zZURlYm91bmNlVGltZW91dCkgewogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5pbnRlbGxpU2Vuc2VEZWJvdW5jZVRpbWVvdXQpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5pbnRlbGxpU2Vuc2VEZWJvdW5jZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgdGhpcy5pbnRlbGxpU2Vuc2VNYW5hZ2VyPy5wcm9jZXNzQ29udGVudENoYW5nZShuZXdDb250ZW50KTsKICAgICAgICAgIH0sIDUwMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBnZXRMYW5ndWFnZUZyb21QYXRoKHBhdGgyKSB7CiAgICAgIGNvbnN0IGV4dCA9IHBhdGgyLnNwbGl0KCIuIikucG9wKCk/LnRvTG93ZXJDYXNlKCk7CiAgICAgIGNvbnN0IGxhbmd1YWdlTWFwID0gewogICAgICAgIHRzOiAidHlwZXNjcmlwdCIsCiAgICAgICAgdHN4OiAidHlwZXNjcmlwdCIsCiAgICAgICAganM6ICJqYXZhc2NyaXB0IiwKICAgICAgICBqc3g6ICJqYXZhc2NyaXB0IiwKICAgICAgICBqc29uOiAianNvbiIsCiAgICAgICAgaHRtbDogImh0bWwiLAogICAgICAgIGNzczogImNzcyIsCiAgICAgICAgc2NzczogInNjc3MiLAogICAgICAgIGxlc3M6ICJsZXNzIiwKICAgICAgICBtZDogIm1hcmtkb3duIiwKICAgICAgICB5YW1sOiAieWFtbCIsCiAgICAgICAgeW1sOiAieWFtbCIsCiAgICAgICAgeG1sOiAieG1sIiwKICAgICAgICBzcWw6ICJzcWwiLAogICAgICAgIHB5OiAicHl0aG9uIiwKICAgICAgICBzaDogInNoZWxsIiwKICAgICAgICBiYXNoOiAic2hlbGwiCiAgICAgIH07CiAgICAgIHJldHVybiBsYW5ndWFnZU1hcFtleHQgfHwgIiJdIHx8ICJwbGFpbnRleHQiOwogICAgfQogICAgdG9nZ2xlVGVybWluYWwoKSB7CiAgICAgIHRoaXMuaXNUZXJtaW5hbENvbGxhcHNlZCA9ICF0aGlzLmlzVGVybWluYWxDb2xsYXBzZWQ7CiAgICB9CiAgICAvLyA9PT09PT09PT09IFNhdmUgT3BlcmF0aW9ucyA9PT09PT09PT09CiAgICBhc3luYyBzYXZlQWN0aXZlRmlsZSgpIHsKICAgICAgY29uc3QgZmlsZSA9IHRoaXMub3BlbkZpbGVzLmZpbmQoKGY3KSA9PiBmNy5wYXRoID09PSB0aGlzLmFjdGl2ZUZpbGVQYXRoKTsKICAgICAgaWYgKCFmaWxlIHx8ICF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICAgIHJldHVybjsKICAgICAgdHJ5IHsKICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LndyaXRlRmlsZShmaWxlLnBhdGgsIGZpbGUuY29udGVudCk7CiAgICAgICAgdGhpcy5vcGVuRmlsZXMgPSB0aGlzLm9wZW5GaWxlcy5tYXAoKGY3KSA9PiBmNy5wYXRoID09PSBmaWxlLnBhdGggPyB7IC4uLmY3LCBtb2RpZmllZDogZmFsc2UgfSA6IGY3KTsKICAgICAgICBpZiAodGhpcy5pbnRlbGxpU2Vuc2VNYW5hZ2VyKSB7CiAgICAgICAgICB0aGlzLmludGVsbGlTZW5zZU1hbmFnZXIuYWRkRmlsZU1vZGVsKGZpbGUucGF0aCwgZmlsZS5jb250ZW50KTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHNhdmUgZmlsZToiLCBlcnJvcik7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIHNhdmVBbGxGaWxlcygpIHsKICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICAgIHJldHVybjsKICAgICAgZm9yIChjb25zdCBmaWxlIG9mIHRoaXMub3BlbkZpbGVzLmZpbHRlcigoZjcpID0+IGY3Lm1vZGlmaWVkKSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LndyaXRlRmlsZShmaWxlLnBhdGgsIGZpbGUuY29udGVudCk7CiAgICAgICAgICBpZiAodGhpcy5pbnRlbGxpU2Vuc2VNYW5hZ2VyKSB7CiAgICAgICAgICAgIHRoaXMuaW50ZWxsaVNlbnNlTWFuYWdlci5hZGRGaWxlTW9kZWwoZmlsZS5wYXRoLCBmaWxlLmNvbnRlbnQpOwogICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gc2F2ZSAke2ZpbGUucGF0aH06YCwgZXJyb3IpOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLm9wZW5GaWxlcyA9IHRoaXMub3BlbkZpbGVzLm1hcCgoZjcpID0+ICh7IC4uLmY3LCBtb2RpZmllZDogZmFsc2UgfSkpOwogICAgfQogICAgLy8gPT09PT09PT09PSBFZGl0b3IgTWVudSA9PT09PT09PT09CiAgICBhc3luYyBzaG93RWRpdG9yTWVudShlMTEpIHsKICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBjb25zdCBtZW51SXRlbXMgPSBbCiAgICAgICAgewogICAgICAgICAgbmFtZTogdGhpcy5hdXRvU2F2ZSA/ICJcdTI3MTMgQXV0byBTYXZlIiA6ICJBdXRvIFNhdmUiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6c2F2ZSIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMudG9nZ2xlQXV0b1NhdmUoKQogICAgICAgIH0sCiAgICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIlNhdmUiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6c2F2ZSIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMuc2F2ZUFjdGl2ZUZpbGUoKQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIlNhdmUgQWxsIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOnNhdmUiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB0aGlzLnNhdmVBbGxGaWxlcygpCiAgICAgICAgfQogICAgICBdOwogICAgICBhd2FpdCBEZWVzQ29udGV4dG1lbnUub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZTExLCBtZW51SXRlbXMpOwogICAgfQogICAgdG9nZ2xlQXV0b1NhdmUoKSB7CiAgICAgIHRoaXMuYXV0b1NhdmUgPSAhdGhpcy5hdXRvU2F2ZTsKICAgICAgaWYgKHRoaXMuYXV0b1NhdmUpIHsKICAgICAgICB0aGlzLmF1dG9TYXZlSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICBjb25zdCBoYXNVbnNhdmVkID0gdGhpcy5vcGVuRmlsZXMuc29tZSgoZjcpID0+IGY3Lm1vZGlmaWVkKTsKICAgICAgICAgIGlmIChoYXNVbnNhdmVkKSB7CiAgICAgICAgICAgIHRoaXMuc2F2ZUFsbEZpbGVzKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgMmUzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAodGhpcy5hdXRvU2F2ZUludGVydmFsKSB7CiAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuYXV0b1NhdmVJbnRlcnZhbCk7CiAgICAgICAgICB0aGlzLmF1dG9TYXZlSW50ZXJ2YWwgPSBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZ2V0RXJyb3JDb3VudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuZGlhZ25vc3RpY01hcmtlcnMuZmlsdGVyKChtNikgPT4gbTYuc2V2ZXJpdHkgPT09IDgpLmxlbmd0aDsKICAgIH0KICAgIHJlbmRlclByb2JsZW1zUGFuZWwoKSB7CiAgICAgIGlmICh0aGlzLmRpYWdub3N0aWNNYXJrZXJzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybiBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ibGVtcy1lbXB0eSI+CiAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTpjaGVja0NpcmNsZSJ9IGljb25TaXplPSIyNCI+PC9kZWVzLWljb24+CiAgICAgICAgICA8c3Bhbj5ObyBwcm9ibGVtcyBkZXRlY3RlZDwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgYDsKICAgICAgfQogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InByb2JsZW1zLWxpc3QiPgogICAgICAgICR7dGhpcy5kaWFnbm9zdGljTWFya2Vycy5tYXAoKG1hcmtlcikgPT4gYjJgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ibGVtLWl0ZW0iIEBjbGljaz0keygpID0+IHRoaXMubmF2aWdhdGVUb1Byb2JsZW0obWFya2VyKX0+CiAgICAgICAgICAgIDxkZWVzLWljb24KICAgICAgICAgICAgICBjbGFzcz0icHJvYmxlbS1pY29uICR7bWFya2VyLnNldmVyaXR5ID09PSA4ID8gImVycm9yIiA6ICJ3YXJuaW5nIn0iCiAgICAgICAgICAgICAgLmljb249JHttYXJrZXIuc2V2ZXJpdHkgPT09IDggPyAibHVjaWRlOmNpcmNsZVgiIDogImx1Y2lkZTp0cmlhbmdsZUFsZXJ0In0KICAgICAgICAgICAgICBpY29uU2l6ZT0iMTQiCiAgICAgICAgICAgID48L2RlZXMtaWNvbj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvYmxlbS1kZXRhaWxzIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ibGVtLW1lc3NhZ2UiPiR7bWFya2VyLm1lc3NhZ2V9PC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvYmxlbS1sb2NhdGlvbiI+CiAgICAgICAgICAgICAgICAke21hcmtlci5yZXNvdXJjZS5wYXRoLnNwbGl0KCIvIikucG9wKCl9ICgke21hcmtlci5zdGFydExpbmVOdW1iZXJ9LCAke21hcmtlci5zdGFydENvbHVtbn0pCiAgICAgICAgICAgICAgICAke21hcmtlci5zb3VyY2UgPyBgWyR7bWFya2VyLnNvdXJjZX1dYCA6ICIifQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGApfQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBuYXZpZ2F0ZVRvUHJvYmxlbShtYXJrZXIpIHsKICAgICAgY29uc3QgZmlsZVBhdGggPSBtYXJrZXIucmVzb3VyY2UucGF0aDsKICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlUGF0aC5zcGxpdCgiLyIpLnBvcCgpIHx8ICIiOwogICAgICBjb25zdCBleGlzdGluZ0ZpbGUgPSB0aGlzLm9wZW5GaWxlcy5maW5kKChmNykgPT4gZjcucGF0aCA9PT0gZmlsZVBhdGgpOwogICAgICBpZiAoIWV4aXN0aW5nRmlsZSkgewogICAgICAgIGF3YWl0IHRoaXMub3BlbkZpbGUoZmlsZVBhdGgsIGZpbGVOYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmFjdGl2ZUZpbGVQYXRoID0gZmlsZVBhdGg7CiAgICAgIH0KICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgY29uc3QgZWRpdG9yRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiZGVlcy13b3Jrc3BhY2UtbW9uYWNvIik7CiAgICAgIGlmIChlZGl0b3JFbGVtZW50KSB7CiAgICAgICAgY29uc3QgZWRpdG9yID0gYXdhaXQgZWRpdG9yRWxlbWVudC5lZGl0b3JEZWZlcnJlZC5wcm9taXNlOwogICAgICAgIGVkaXRvci5yZXZlYWxMaW5lSW5DZW50ZXIobWFya2VyLnN0YXJ0TGluZU51bWJlcik7CiAgICAgICAgZWRpdG9yLnNldFBvc2l0aW9uKHsKICAgICAgICAgIGxpbmVOdW1iZXI6IG1hcmtlci5zdGFydExpbmVOdW1iZXIsCiAgICAgICAgICBjb2x1bW46IG1hcmtlci5zdGFydENvbHVtbgogICAgICAgIH0pOwogICAgICAgIGVkaXRvci5mb2N1cygpOwogICAgICB9CiAgICB9CiAgICBzZXR1cE1hcmtlckxpc3RlbmVyKCkgewogICAgICBjb25zdCBtb25hY29JbnN0YW5jZSA9IHdpbmRvdy5tb25hY287CiAgICAgIGlmICghbW9uYWNvSW5zdGFuY2UpCiAgICAgICAgcmV0dXJuOwogICAgICBtb25hY29JbnN0YW5jZS5lZGl0b3Iub25EaWRDaGFuZ2VNYXJrZXJzKCh1cmlzKSA9PiB7CiAgICAgICAgdGhpcy51cGRhdGVEaWFnbm9zdGljTWFya2VycygpOwogICAgICB9KTsKICAgICAgdGhpcy51cGRhdGVEaWFnbm9zdGljTWFya2VycygpOwogICAgfQogICAgdXBkYXRlRGlhZ25vc3RpY01hcmtlcnMoKSB7CiAgICAgIGNvbnN0IG1vbmFjb0luc3RhbmNlID0gd2luZG93Lm1vbmFjbzsKICAgICAgaWYgKCFtb25hY29JbnN0YW5jZSkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGFsbE1hcmtlcnMgPSBtb25hY29JbnN0YW5jZS5lZGl0b3IuZ2V0TW9kZWxNYXJrZXJzKHt9KTsKICAgICAgdGhpcy5kaWFnbm9zdGljTWFya2VycyA9IGFsbE1hcmtlcnMubWFwKChtNikgPT4gKHsKICAgICAgICBtZXNzYWdlOiBtNi5tZXNzYWdlLAogICAgICAgIHNldmVyaXR5OiBtNi5zZXZlcml0eSwKICAgICAgICBzdGFydExpbmVOdW1iZXI6IG02LnN0YXJ0TGluZU51bWJlciwKICAgICAgICBzdGFydENvbHVtbjogbTYuc3RhcnRDb2x1bW4sCiAgICAgICAgZW5kTGluZU51bWJlcjogbTYuZW5kTGluZU51bWJlciwKICAgICAgICBlbmRDb2x1bW46IG02LmVuZENvbHVtbiwKICAgICAgICBzb3VyY2U6IG02LnNvdXJjZSwKICAgICAgICByZXNvdXJjZTogeyBwYXRoOiBtNi5yZXNvdXJjZS5wYXRoIH0KICAgICAgfSkpOwogICAgfQogICAgLy8gPT09PT09PT09PSBCb3R0b20gQmFyIEV2ZW50IEhhbmRsZXJzID09PT09PT09PT0KICAgIC8qKgogICAgICogSGFuZGxlIHJ1bi1wcm9jZXNzIGV2ZW50cyBmcm9tIGJvdHRvbSBiYXIgd2lkZ2V0cwogICAgICogQ3JlYXRlcyBhIG5ldyB0ZXJtaW5hbCB0YWIgZm9yIHRoZSBwcm9jZXNzCiAgICAgKi8KICAgIGFzeW5jIGhhbmRsZVJ1blByb2Nlc3MoZTExKSB7CiAgICAgIGNvbnN0IGRldGFpbCA9IGUxMS5kZXRhaWw7CiAgICAgIGNvbnN0IHRlcm1pbmFsID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCJkZWVzLXdvcmtzcGFjZS10ZXJtaW5hbCIpOwogICAgICBpZiAoIXRlcm1pbmFsKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJUZXJtaW5hbCBjb21wb25lbnQgbm90IGZvdW5kIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLmlzVGVybWluYWxDb2xsYXBzZWQpIHsKICAgICAgICB0aGlzLmlzVGVybWluYWxDb2xsYXBzZWQgPSBmYWxzZTsKICAgICAgfQogICAgICB0aGlzLmFjdGl2ZUJvdHRvbVBhbmVsID0gInRlcm1pbmFsIjsKICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgYXdhaXQgdGVybWluYWwuY3JlYXRlUHJvY2Vzc1RhYih7CiAgICAgICAgdHlwZTogZGV0YWlsLnR5cGUsCiAgICAgICAgbGFiZWw6IGRldGFpbC5sYWJlbCwKICAgICAgICBjb21tYW5kOiBkZXRhaWwuY29tbWFuZCwKICAgICAgICBhcmdzOiBkZXRhaWwuYXJncywKICAgICAgICBtZXRhZGF0YTogZGV0YWlsLm1ldGFkYXRhLAogICAgICAgIHN3aXRjaFRvVGFiOiB0cnVlCiAgICAgIH0pOwogICAgfQogICAgLy8gPT09PT09PT09PSBQdWJsaWMgTGF5b3V0IE1ldGhvZHMgPT09PT09PT09PQogICAgLyoqCiAgICAgKiBQcm9ncmFtbWF0aWNhbGx5IHNldCB0aGUgZmlsZSB0cmVlIHdpZHRoCiAgICAgKi8KICAgIHNldEZpbGVUcmVlV2lkdGgod2lkdGgpIHsKICAgICAgY29uc3QgbWluV2lkdGggPSAxNTA7CiAgICAgIGNvbnN0IG1heFdpZHRoID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAqIDAuNTsKICAgICAgdGhpcy5jdXJyZW50RmlsZVRyZWVXaWR0aCA9IE1hdGgubWF4KG1pbldpZHRoLCBNYXRoLm1pbihtYXhXaWR0aCwgd2lkdGgpKTsKICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSk7CiAgICB9CiAgICAvKioKICAgICAqIFByb2dyYW1tYXRpY2FsbHkgc2V0IHRoZSB0ZXJtaW5hbCBoZWlnaHQKICAgICAqLwogICAgc2V0VGVybWluYWxIZWlnaHQoaGVpZ2h0KSB7CiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IDEwMDsKICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgKiAwLjc7CiAgICAgIHRoaXMuY3VycmVudFRlcm1pbmFsSGVpZ2h0ID0gTWF0aC5tYXgobWluSGVpZ2h0LCBNYXRoLm1pbihtYXhIZWlnaHQsIGhlaWdodCkpOwogICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlc2l6ZSIpKTsKICAgIH0KICAgIC8qKgogICAgICogUmVzZXQgbGF5b3V0IHRvIGluaXRpYWwgcHJvcGVydHkgdmFsdWVzCiAgICAgKi8KICAgIHJlc2V0TGF5b3V0KCkgewogICAgICB0aGlzLmN1cnJlbnRGaWxlVHJlZVdpZHRoID0gdGhpcy5maWxlVHJlZVdpZHRoOwogICAgICB0aGlzLmN1cnJlbnRUZXJtaW5hbEhlaWdodCA9IHRoaXMudGVybWluYWxIZWlnaHQ7CiAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgicmVzaXplIikpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM5NyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1dvcmtzcGFjZTIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXdvcmtzcGFjZS9kZWVzLXdvcmtzcGFjZS10ZXJtaW5hbC9pbmRleC5qcwppbml0X2RlZXNfd29ya3NwYWNlX3Rlcm1pbmFsKCk7CmluaXRfdGVybWluYWxfdGFiX21hbmFnZXIoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC13b3Jrc3BhY2UvZGVlcy13b3Jrc3BhY2UtbWFya2Rvd24vZGVlcy13b3Jrc3BhY2UtbWFya2Rvd24uanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlOTcgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczk4ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBkZWZlcnJlZCA9IGRpc3RfdHNfZXhwb3J0czI1LnBsdWdpbnMuc21hcnRwcm9taXNlLmRlZmVyKCk7CnZhciBEZWVzV29ya3NwYWNlTWFya2Rvd24gPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLXdvcmtzcGFjZS1tYXJrZG93biIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3NwbGl0UmF0aW9fZGVjb3JhdG9yczsKICBsZXQgX3NwbGl0UmF0aW9faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zcGxpdFJhdGlvX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9taW5QYW5lbFNpemVfZGVjb3JhdG9yczsKICBsZXQgX21pblBhbmVsU2l6ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21pblBhbmVsU2l6ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VycmVudFNwbGl0UmF0aW9fZGVjb3JhdG9yczsKICBsZXQgX2N1cnJlbnRTcGxpdFJhdGlvX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VycmVudFNwbGl0UmF0aW9fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzRHJhZ2dpbmdfZGVjb3JhdG9yczsKICBsZXQgX2lzRHJhZ2dpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0RyYWdnaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNXb3Jrc3BhY2VNYXJrZG93bjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9zcGxpdFJhdGlvX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfbWluUGFuZWxTaXplX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfY3VycmVudFNwbGl0UmF0aW9fZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2lzRHJhZ2dpbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlOTcodGhpcywgbnVsbCwgX3NwbGl0UmF0aW9fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic3BsaXRSYXRpbyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic3BsaXRSYXRpbyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zcGxpdFJhdGlvLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zcGxpdFJhdGlvID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NwbGl0UmF0aW9faW5pdGlhbGl6ZXJzLCBfc3BsaXRSYXRpb19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk3KHRoaXMsIG51bGwsIF9taW5QYW5lbFNpemVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWluUGFuZWxTaXplIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtaW5QYW5lbFNpemUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWluUGFuZWxTaXplLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5taW5QYW5lbFNpemUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWluUGFuZWxTaXplX2luaXRpYWxpemVycywgX21pblBhbmVsU2l6ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk3KHRoaXMsIG51bGwsIF9jdXJyZW50U3BsaXRSYXRpb19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjdXJyZW50U3BsaXRSYXRpbyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3VycmVudFNwbGl0UmF0aW8iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3VycmVudFNwbGl0UmF0aW8sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmN1cnJlbnRTcGxpdFJhdGlvID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2N1cnJlbnRTcGxpdFJhdGlvX2luaXRpYWxpemVycywgX2N1cnJlbnRTcGxpdFJhdGlvX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTcodGhpcywgbnVsbCwgX2lzRHJhZ2dpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNEcmFnZ2luZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNEcmFnZ2luZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc0RyYWdnaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc0RyYWdnaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzRHJhZ2dpbmdfaW5pdGlhbGl6ZXJzLCBfaXNEcmFnZ2luZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk3KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1dvcmtzcGFjZU1hcmtkb3duMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9ICgpID0+IGIyYDxkZWVzLXdvcmtzcGFjZS1tYXJrZG93bj48L2RlZXMtd29ya3NwYWNlLW1hcmtkb3duPmA7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiV29ya3NwYWNlIl07CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zcGxpdENvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KCiAgICAgIC5lZGl0b3JDb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgbWluLXdpZHRoOiAxMDBweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAucmVzaXplSGFuZGxlIHsKICAgICAgICB3aWR0aDogNnB4OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzAzNjNkIil9OwogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzIGVhc2U7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAucmVzaXplSGFuZGxlOmhvdmVyLAogICAgICAucmVzaXplSGFuZGxlLmRyYWdnaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjNThhNmZmIil9OwogICAgICB9CgogICAgICAucmVzaXplSGFuZGxlOjphZnRlciB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgICB3aWR0aDogMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzljYTNhZiIsICIjNmU3NjgxIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDFweDsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgIH0KCiAgICAgIC5yZXNpemVIYW5kbGU6aG92ZXI6OmFmdGVyLAogICAgICAucmVzaXplSGFuZGxlLmRyYWdnaW5nOjphZnRlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiI2ZmZmZmZiIpfTsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAub3V0bGV0Q29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG1pbi13aWR0aDogMTAwcHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzBkMTExNyIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyNDI5MmYiLCAiI2U2ZWRmMyIpfTsKICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCAnTm90byBTYW5zJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsKICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQoKICAgICAgLyogUHJldmVudCB0ZXh0IHNlbGVjdGlvbiB3aGlsZSBkcmFnZ2luZyAqLwogICAgICAuc3BsaXRDb250YWluZXIuZHJhZ2dpbmcgewogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICB9CgogICAgICAuc3BsaXRDb250YWluZXIuZHJhZ2dpbmcgLmVkaXRvckNvbnRhaW5lciwKICAgICAgLnNwbGl0Q29udGFpbmVyLmRyYWdnaW5nIC5vdXRsZXRDb250YWluZXIgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICBgCiAgICBdOwogICAgI3NwbGl0UmF0aW9fYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzOTgodGhpcywgX3NwbGl0UmF0aW9faW5pdGlhbGl6ZXJzLCA1MCk7CiAgICAvKioKICAgICAqIEluaXRpYWwgc3BsaXQgcmF0aW8gZm9yIHRoZSBlZGl0b3IgKGxlZnQpIHBhbmVsLgogICAgICogVmFsdWUgZnJvbSAwIHRvIDEwMCByZXByZXNlbnRpbmcgcGVyY2VudGFnZSB3aWR0aC4KICAgICAqIERlZmF1bHQgaXMgNTAgKDUwLzUwIHNwbGl0KS4KICAgICAqLwogICAgZ2V0IHNwbGl0UmF0aW8oKSB7CiAgICAgIHJldHVybiB0aGlzLiNzcGxpdFJhdGlvX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc3BsaXRSYXRpbyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc3BsaXRSYXRpb19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21pblBhbmVsU2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTgodGhpcywgX3NwbGl0UmF0aW9fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk4KHRoaXMsIF9taW5QYW5lbFNpemVfaW5pdGlhbGl6ZXJzLCAxMCkpOwogICAgLyoqCiAgICAgKiBNaW5pbXVtIHdpZHRoIHBlcmNlbnRhZ2UgZm9yIGVpdGhlciBwYW5lbC4KICAgICAqLwogICAgZ2V0IG1pblBhbmVsU2l6ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21pblBhbmVsU2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1pblBhbmVsU2l6ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWluUGFuZWxTaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY3VycmVudFNwbGl0UmF0aW9fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk4KHRoaXMsIF9taW5QYW5lbFNpemVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk4KHRoaXMsIF9jdXJyZW50U3BsaXRSYXRpb19pbml0aWFsaXplcnMsIDUwKSk7CiAgICBnZXQgY3VycmVudFNwbGl0UmF0aW8oKSB7CiAgICAgIHJldHVybiB0aGlzLiNjdXJyZW50U3BsaXRSYXRpb19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGN1cnJlbnRTcGxpdFJhdGlvKHZhbHVlMikgewogICAgICB0aGlzLiNjdXJyZW50U3BsaXRSYXRpb19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzRHJhZ2dpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk4KHRoaXMsIF9jdXJyZW50U3BsaXRSYXRpb19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTgodGhpcywgX2lzRHJhZ2dpbmdfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGlzRHJhZ2dpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc0RyYWdnaW5nX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaXNEcmFnZ2luZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXNEcmFnZ2luZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgcmVzaXplSGFuZGxlRWxlbWVudCA9IF9fcnVuSW5pdGlhbGl6ZXJzOTgodGhpcywgX2lzRHJhZ2dpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgY29udGFpbmVyRWxlbWVudDsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJzcGxpdENvbnRhaW5lciAke3RoaXMuaXNEcmFnZ2luZyA/ICJkcmFnZ2luZyIgOiAiIn0iPgogICAgICAgIDxkaXYgY2xhc3M9ImVkaXRvckNvbnRhaW5lciIgc3R5bGU9IndpZHRoOiAke3RoaXMuY3VycmVudFNwbGl0UmF0aW99JSI+CiAgICAgICAgICA8ZGVlcy13b3Jrc3BhY2UtbW9uYWNvCiAgICAgICAgICAgIC5sYW5ndWFnZT0keyJtYXJrZG93biJ9CiAgICAgICAgICAgIC5jb250ZW50PSR7YCMgYSB0ZXN0IGNvbnRlbnQKClRoaXMgaXMgdGVzdCBjb250ZW50IHRoYXQgaXMgb2YgbG9uZ2VyIGZvcm0gYW4gaG9wZWZ1bGx5IHN0YXJ0cyB0byB3cmFwIHdoZW4gSSBuZWVkIGl0LiBBbmQgeWVzLCBpdCBkb2VzIHBlcmZlY3RseS4gbmljZS4KClRlc3QgfCBIZWxsbwotLS0gfCAtLS0KWWVhaCB8IFNvIGdvb2QKClRoaXMgaXMgcmVhbCBhc3NldCBJIHRoaW5rLiBXaHkgd291bGQgd2Ugd2FudCB0byBsZWF2ZSB0aGF0IG9uIHRoZSB0YWJsZT8gQ2FuIHlvdSB0ZWxsIG15IHRoYXQ/CgpXaHkgYXJlIHdlIGhlcmU/CgpEbyB5b3Uga25vdz8KCj4gbm90ZToKVGhlcmUgaXMgc29tZXRoaW5nIGdvaW5nIG9uLgoKXGBcYFxgdHlwZXNjcmlwdApjb25zdCBoZWxsbyA9ICd5ZXMnClxgXGBcYApgfQogICAgICAgICAgICB3b3JkV3JhcD0iYm91bmRlZCIKICAgICAgICAgID48L2RlZXMtd29ya3NwYWNlLW1vbmFjbz4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2CiAgICAgICAgICBjbGFzcz0icmVzaXplSGFuZGxlICR7dGhpcy5pc0RyYWdnaW5nID8gImRyYWdnaW5nIiA6ICIifSIKICAgICAgICAgIEBtb3VzZWRvd249JHt0aGlzLmhhbmRsZU1vdXNlRG93bn0KICAgICAgICA+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ib3V0bGV0Q29udGFpbmVyIiBzdHlsZT0id2lkdGg6ICR7MTAwIC0gdGhpcy5jdXJyZW50U3BsaXRSYXRpb30lIj4KICAgICAgICAgIDxkZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldD48L2RlZXMtd29ya3NwYWNlLW1hcmtkb3dub3V0bGV0PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzQXJnKSB7CiAgICAgIGF3YWl0IHN1cGVyLmZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXNBcmcpOwogICAgICB0aGlzLmN1cnJlbnRTcGxpdFJhdGlvID0gdGhpcy5zcGxpdFJhdGlvOwogICAgICB0aGlzLmNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLnNwbGl0Q29udGFpbmVyIik7CiAgICAgIHRoaXMucmVzaXplSGFuZGxlRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIucmVzaXplSGFuZGxlIik7CiAgICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCJkZWVzLXdvcmtzcGFjZS1tb25hY28iKTsKICAgICAgY29uc3QgbWFya2Rvd25PdXRsZXQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQiKTsKICAgICAgY29uc3Qgc21hcnRtYXJrZG93bkluc3RhbmNlID0gbmV3IGRpc3RfdHNfZXhwb3J0czI1LnBsdWdpbnMuc21hcnRtYXJrZG93bi5TbWFydE1hcmtkb3duKCk7CiAgICAgIGNvbnN0IG1kUGFyc2VkUmVzdWx0ID0gYXdhaXQgc21hcnRtYXJrZG93bkluc3RhbmNlLmdldE1kUGFyc2VkUmVzdWx0RnJvbU1hcmtkb3duKCJsb2FkaW5nLi4uIik7CiAgICAgIGVkaXRvci5jb250ZW50U3ViamVjdC5zdWJzY3JpYmUoYXN5bmMgKGNvbnRlbnRBcmcpID0+IHsKICAgICAgICBhd2FpdCBtZFBhcnNlZFJlc3VsdC51cGRhdGVGcm9tTWFya2Rvd25TdHJpbmcoY29udGVudEFyZyk7CiAgICAgICAgY29uc3QgaHRtbDE2ID0gbWRQYXJzZWRSZXN1bHQuaHRtbDsKICAgICAgICBtYXJrZG93bk91dGxldC51cGRhdGVIdG1sVGV4dChodG1sMTYpOwogICAgICB9KTsKICAgIH0KICAgIGhhbmRsZU1vdXNlRG93biA9IChlMTEpID0+IHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIHRoaXMuaGFuZGxlTW91c2VNb3ZlKTsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIHRoaXMuaGFuZGxlTW91c2VVcCk7CiAgICB9OwogICAgaGFuZGxlTW91c2VNb3ZlID0gKGUxMSkgPT4gewogICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZyB8fCAhdGhpcy5jb250YWluZXJFbGVtZW50KQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgY29udGFpbmVyV2lkdGggPSBjb250YWluZXJSZWN0LndpZHRoOwogICAgICBjb25zdCBtb3VzZVggPSBlMTEuY2xpZW50WCAtIGNvbnRhaW5lclJlY3QubGVmdDsKICAgICAgbGV0IG5ld1JhdGlvID0gbW91c2VYIC8gY29udGFpbmVyV2lkdGggKiAxMDA7CiAgICAgIG5ld1JhdGlvID0gTWF0aC5tYXgodGhpcy5taW5QYW5lbFNpemUsIE1hdGgubWluKDEwMCAtIHRoaXMubWluUGFuZWxTaXplLCBuZXdSYXRpbykpOwogICAgICB0aGlzLmN1cnJlbnRTcGxpdFJhdGlvID0gbmV3UmF0aW87CiAgICB9OwogICAgaGFuZGxlTW91c2VVcCA9ICgpID0+IHsKICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7CiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIHRoaXMuaGFuZGxlTW91c2VNb3ZlKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIHRoaXMuaGFuZGxlTW91c2VVcCk7CiAgICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCJkZWVzLXdvcmtzcGFjZS1tb25hY28iKTsKICAgICAgaWYgKGVkaXRvcikgewogICAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgicmVzaXplIikpOwogICAgICB9CiAgICB9OwogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIHRoaXMuaGFuZGxlTW91c2VNb3ZlKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIHRoaXMuaGFuZGxlTW91c2VVcCk7CiAgICB9CiAgICAvKioKICAgICAqIFByb2dyYW1tYXRpY2FsbHkgc2V0IHRoZSBzcGxpdCByYXRpbwogICAgICovCiAgICBzZXRTcGxpdFJhdGlvKHJhdGlvKSB7CiAgICAgIHRoaXMuY3VycmVudFNwbGl0UmF0aW8gPSBNYXRoLm1heCh0aGlzLm1pblBhbmVsU2l6ZSwgTWF0aC5taW4oMTAwIC0gdGhpcy5taW5QYW5lbFNpemUsIHJhdGlvKSk7CiAgICB9CiAgICAvKioKICAgICAqIFJlc2V0IHRvIGluaXRpYWwgc3BsaXQgcmF0aW8KICAgICAqLwogICAgcmVzZXRTcGxpdFJhdGlvKCkgewogICAgICB0aGlzLmN1cnJlbnRTcGxpdFJhdGlvID0gdGhpcy5zcGxpdFJhdGlvOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM5OChfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1dvcmtzcGFjZU1hcmtkb3duMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtd29ya3NwYWNlL2RlZXMtd29ya3NwYWNlLW1hcmtkb3dub3V0bGV0L2RlZXMtd29ya3NwYWNlLW1hcmtkb3dub3V0bGV0LmRlbW8uanMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIGRlbW9GdW5jNTYgPSAoKSA9PiBiMmAKICA8ZGVlcy1kZW1vd3JhcHBlcj4KICAgIDxzdHlsZT4KICAgICAgJHtpYAogICAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMjRweDsKICAgICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgICBtYXgtd2lkdGg6IDkwMHB4OwogICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQogICAgICBgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICAgIDwhLS0gRGVtbyAxOiBIZWFkaW5ncyAtLT4KICAgICAgPGRlZXMtcGFuZWwKICAgICAgICAudGl0bGU9JHsiSGVhZGluZ3MifQogICAgICAgIC5zdWJ0aXRsZT0keyJBbGwgaGVhZGluZyBsZXZlbHMgZnJvbSBIMSB0byBINiJ9CiAgICAgICAgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKHBhbmVsRWwpID0+IHsKICBjb25zdCBvdXRsZXQgPSBwYW5lbEVsLnF1ZXJ5U2VsZWN0b3IoImRlZXMtd29ya3NwYWNlLW1hcmtkb3dub3V0bGV0Iik7CiAgYXdhaXQgb3V0bGV0Py51cGRhdGVIdG1sVGV4dChgCiAgICAgICAgICAgIDxoMT5IZWFkaW5nIExldmVsIDE8L2gxPgogICAgICAgICAgICA8aDI+SGVhZGluZyBMZXZlbCAyPC9oMj4KICAgICAgICAgICAgPGgzPkhlYWRpbmcgTGV2ZWwgMzwvaDM+CiAgICAgICAgICAgIDxoND5IZWFkaW5nIExldmVsIDQ8L2g0PgogICAgICAgICAgICA8aDU+SGVhZGluZyBMZXZlbCA1PC9oNT4KICAgICAgICAgICAgPGg2PkhlYWRpbmcgTGV2ZWwgNjwvaDY+CiAgICAgICAgICBgKTsKfX0KICAgICAgPgogICAgICAgIDxkZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldD48L2RlZXMtd29ya3NwYWNlLW1hcmtkb3dub3V0bGV0PgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8IS0tIERlbW8gMjogVGV4dCBGb3JtYXR0aW5nIC0tPgogICAgICA8ZGVlcy1wYW5lbAogICAgICAgIC50aXRsZT0keyJUZXh0IEZvcm1hdHRpbmcifQogICAgICAgIC5zdWJ0aXRsZT0keyJCb2xkLCBpdGFsaWMsIGxpbmtzLCBjb2RlLCBhbmQga2V5Ym9hcmQgaW5wdXQifQogICAgICAgIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChwYW5lbEVsKSA9PiB7CiAgY29uc3Qgb3V0bGV0ID0gcGFuZWxFbC5xdWVyeVNlbGVjdG9yKCJkZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldCIpOwogIGF3YWl0IG91dGxldD8udXBkYXRlSHRtbFRleHQoYAogICAgICAgICAgICA8cD5UaGlzIGlzIGEgcGFyYWdyYXBoIHdpdGggPHN0cm9uZz5ib2xkIHRleHQ8L3N0cm9uZz4gYW5kIDxlbT5pdGFsaWMgdGV4dDwvZW0+LjwvcD4KICAgICAgICAgICAgPHA+WW91IGNhbiBhbHNvIHVzZSA8c3Ryb25nPjxlbT5ib2xkIGl0YWxpYzwvZW0+PC9zdHJvbmc+IGZvciBlbXBoYXNpcy48L3A+CiAgICAgICAgICAgIDxwPkhlcmUncyBhIDxhIGhyZWY9IiMiPmxpbmsgZXhhbXBsZTwvYT4gYW5kIHNvbWUgPGNvZGU+aW5saW5lIGNvZGU8L2NvZGU+LjwvcD4KICAgICAgICAgICAgPHA+UHJlc3MgPGtiZD5DdHJsPC9rYmQ+ICsgPGtiZD5DPC9rYmQ+IHRvIGNvcHkgdGV4dC48L3A+CiAgICAgICAgICAgIDxocj4KICAgICAgICAgICAgPHA+QWJvdmUgaXMgYSBob3Jpem9udGFsIHJ1bGUgc2VwYXJhdG9yLjwvcD4KICAgICAgICAgIGApOwp9fQogICAgICA+CiAgICAgICAgPGRlZXMtd29ya3NwYWNlLW1hcmtkb3dub3V0bGV0PjwvZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQ+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDwhLS0gRGVtbyAzOiBMaXN0cyAtLT4KICAgICAgPGRlZXMtcGFuZWwKICAgICAgICAudGl0bGU9JHsiTGlzdHMifQogICAgICAgIC5zdWJ0aXRsZT0keyJPcmRlcmVkLCB1bm9yZGVyZWQsIGFuZCB0YXNrIGxpc3RzIn0KICAgICAgICAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAocGFuZWxFbCkgPT4gewogIGNvbnN0IG91dGxldCA9IHBhbmVsRWwucXVlcnlTZWxlY3RvcigiZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQiKTsKICBhd2FpdCBvdXRsZXQ/LnVwZGF0ZUh0bWxUZXh0KGAKICAgICAgICAgICAgPGgzPlVub3JkZXJlZCBMaXN0PC9oMz4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5GaXJzdCBpdGVtPC9saT4KICAgICAgICAgICAgICA8bGk+U2Vjb25kIGl0ZW0KICAgICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgPGxpPk5lc3RlZCBpdGVtIDE8L2xpPgogICAgICAgICAgICAgICAgICA8bGk+TmVzdGVkIGl0ZW0gMjwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgPGxpPlRoaXJkIGl0ZW08L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPGgzPk9yZGVyZWQgTGlzdDwvaDM+CiAgICAgICAgICAgIDxvbD4KICAgICAgICAgICAgICA8bGk+U3RlcCBvbmU8L2xpPgogICAgICAgICAgICAgIDxsaT5TdGVwIHR3bzwvbGk+CiAgICAgICAgICAgICAgPGxpPlN0ZXAgdGhyZWU8L2xpPgogICAgICAgICAgICA8L29sPgoKICAgICAgICAgICAgPGgzPlRhc2sgTGlzdDwvaDM+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGkgY2xhc3M9InRhc2stbGlzdC1pdGVtIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGNoZWNrZWQgZGlzYWJsZWQ+IENvbXBsZXRlZCB0YXNrPC9saT4KICAgICAgICAgICAgICA8bGkgY2xhc3M9InRhc2stbGlzdC1pdGVtIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGRpc2FibGVkPiBQZW5kaW5nIHRhc2s8L2xpPgogICAgICAgICAgICAgIDxsaSBjbGFzcz0idGFzay1saXN0LWl0ZW0iPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGlzYWJsZWQ+IEFub3RoZXIgdGFzazwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICBgKTsKfX0KICAgICAgPgogICAgICAgIDxkZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldD48L2RlZXMtd29ya3NwYWNlLW1hcmtkb3dub3V0bGV0PgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8IS0tIERlbW8gNDogQ29kZSBCbG9ja3MgLS0+CiAgICAgIDxkZWVzLXBhbmVsCiAgICAgICAgLnRpdGxlPSR7IkNvZGUgQmxvY2tzIn0KICAgICAgICAuc3VidGl0bGU9JHsiU3ludGF4IGhpZ2hsaWdodGVkIGNvZGUgZXhhbXBsZXMifQogICAgICAgIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChwYW5lbEVsKSA9PiB7CiAgY29uc3Qgb3V0bGV0ID0gcGFuZWxFbC5xdWVyeVNlbGVjdG9yKCJkZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldCIpOwogIGF3YWl0IG91dGxldD8udXBkYXRlSHRtbFRleHQoYAogICAgICAgICAgICA8cD5JbmxpbmUgY29kZTogPGNvZGU+Y29uc3QgZ3JlZXRpbmcgPSAiSGVsbG8sIFdvcmxkISI7PC9jb2RlPjwvcD4KCiAgICAgICAgICAgIDxoMz5UeXBlU2NyaXB0IEV4YW1wbGU8L2gzPgogICAgICAgICAgICA8cHJlPjxjb2RlPjxzcGFuIGNsYXNzPSJobGpzLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4geyBodG1sLCBjc3MgfSA8c3BhbiBjbGFzcz0iaGxqcy1rZXl3b3JkIj5mcm9tPC9zcGFuPiA8c3BhbiBjbGFzcz0iaGxqcy1zdHJpbmciPidAZGVzaWduLmVzdGF0ZS9kZWVzLWVsZW1lbnQnPC9zcGFuPjsKCjxzcGFuIGNsYXNzPSJobGpzLWtleXdvcmQiPmludGVyZmFjZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImhsanMtdGl0bGUiPklVc2VyPC9zcGFuPiB7CiAgPHNwYW4gY2xhc3M9ImhsanMtYXR0ciI+bmFtZTwvc3Bhbj46IDxzcGFuIGNsYXNzPSJobGpzLWJ1aWx0X2luIj5zdHJpbmc8L3NwYW4+OwogIDxzcGFuIGNsYXNzPSJobGpzLWF0dHIiPmVtYWlsPC9zcGFuPjogPHNwYW4gY2xhc3M9ImhsanMtYnVpbHRfaW4iPnN0cmluZzwvc3Bhbj47CiAgPHNwYW4gY2xhc3M9ImhsanMtYXR0ciI+YWdlPC9zcGFuPj86IDxzcGFuIGNsYXNzPSJobGpzLWJ1aWx0X2luIj5udW1iZXI8L3NwYW4+Owp9Cgo8c3BhbiBjbGFzcz0iaGxqcy1rZXl3b3JkIj5jb25zdDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImhsanMtdGl0bGUiPmdldFVzZXI8L3NwYW4+ID0gPHNwYW4gY2xhc3M9ImhsanMta2V5d29yZCI+YXN5bmM8L3NwYW4+ICg8c3BhbiBjbGFzcz0iaGxqcy1hdHRyIj5pZDwvc3Bhbj46IDxzcGFuIGNsYXNzPSJobGpzLWJ1aWx0X2luIj5zdHJpbmc8L3NwYW4+KTogPHNwYW4gY2xhc3M9ImhsanMtYnVpbHRfaW4iPlByb21pc2U8L3NwYW4+Jmx0O0lVc2VyJmd0OyA9Jmd0OyB7CiAgPHNwYW4gY2xhc3M9ImhsanMta2V5d29yZCI+Y29uc3Q8L3NwYW4+IHJlc3BvbnNlID0gPHNwYW4gY2xhc3M9ImhsanMta2V5d29yZCI+YXdhaXQ8L3NwYW4+IGZldGNoKFxgL2FwaS91c2Vycy9cJHtpZH1cYCk7CiAgPHNwYW4gY2xhc3M9ImhsanMta2V5d29yZCI+cmV0dXJuPC9zcGFuPiByZXNwb25zZS5qc29uKCk7Cn07PC9jb2RlPjwvcHJlPgoKICAgICAgICAgICAgPGgzPkpTT04gRXhhbXBsZTwvaDM+CiAgICAgICAgICAgIDxwcmU+PGNvZGU+ewogIDxzcGFuIGNsYXNzPSJobGpzLWF0dHIiPiJuYW1lIjwvc3Bhbj46IDxzcGFuIGNsYXNzPSJobGpzLXN0cmluZyI+ImRlZXMtY2F0YWxvZyI8L3NwYW4+LAogIDxzcGFuIGNsYXNzPSJobGpzLWF0dHIiPiJ2ZXJzaW9uIjwvc3Bhbj46IDxzcGFuIGNsYXNzPSJobGpzLXN0cmluZyI+IjMuMC4wIjwvc3Bhbj4sCiAgPHNwYW4gY2xhc3M9ImhsanMtYXR0ciI+ImRlcGVuZGVuY2llcyI8L3NwYW4+OiB7CiAgICA8c3BhbiBjbGFzcz0iaGxqcy1hdHRyIj4iQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50Ijwvc3Bhbj46IDxzcGFuIGNsYXNzPSJobGpzLXN0cmluZyI+Il4yLjAuMCI8L3NwYW4+CiAgfQp9PC9jb2RlPjwvcHJlPgogICAgICAgICAgYCk7Cn19CiAgICAgID4KICAgICAgICA8ZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQ+PC9kZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldD4KICAgICAgPC9kZWVzLXBhbmVsPgoKICAgICAgPCEtLSBEZW1vIDU6IFRhYmxlcyAtLT4KICAgICAgPGRlZXMtcGFuZWwKICAgICAgICAudGl0bGU9JHsiVGFibGVzIn0KICAgICAgICAuc3VidGl0bGU9JHsiU3R5bGVkIHRhYmxlcyB3aXRoIGFsdGVybmF0aW5nIHJvd3MifQogICAgICAgIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChwYW5lbEVsKSA9PiB7CiAgY29uc3Qgb3V0bGV0ID0gcGFuZWxFbC5xdWVyeVNlbGVjdG9yKCJkZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldCIpOwogIGF3YWl0IG91dGxldD8udXBkYXRlSHRtbFRleHQoYAogICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGg+RmVhdHVyZTwvdGg+CiAgICAgICAgICAgICAgICAgIDx0aD5TdGF0dXM8L3RoPgogICAgICAgICAgICAgICAgICA8dGg+UHJpb3JpdHk8L3RoPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkPkRhcmsgbW9kZSBzdXBwb3J0PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPkNvbXBsZXRlZDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD5IaWdoPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD5SZXNwb25zaXZlIGRlc2lnbjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD5JbiBQcm9ncmVzczwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD5NZWRpdW08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkPkFjY2Vzc2liaWxpdHk8L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+UGxhbm5lZDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD5IaWdoPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD5Eb2N1bWVudGF0aW9uPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPkluIFByb2dyZXNzPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPkxvdzwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICBgKTsKfX0KICAgICAgPgogICAgICAgIDxkZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldD48L2RlZXMtd29ya3NwYWNlLW1hcmtkb3dub3V0bGV0PgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8IS0tIERlbW8gNjogQmxvY2txdW90ZXMgJiBBbGVydHMgLS0+CiAgICAgIDxkZWVzLXBhbmVsCiAgICAgICAgLnRpdGxlPSR7IkJsb2NrcXVvdGVzICYgQWxlcnRzIn0KICAgICAgICAuc3VidGl0bGU9JHsiUXVvdGVzIGFuZCBHaXRIdWItc3R5bGUgYWxlcnRzIn0KICAgICAgICAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAocGFuZWxFbCkgPT4gewogIGNvbnN0IG91dGxldCA9IHBhbmVsRWwucXVlcnlTZWxlY3RvcigiZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQiKTsKICBhd2FpdCBvdXRsZXQ/LnVwZGF0ZUh0bWxUZXh0KGAKICAgICAgICAgICAgPGJsb2NrcXVvdGU+CiAgICAgICAgICAgICAgPHA+VGhpcyBpcyBhIHN0YW5kYXJkIGJsb2NrcXVvdGUuIEl0J3MgZ3JlYXQgZm9yIGhpZ2hsaWdodGluZyBpbXBvcnRhbnQgaW5mb3JtYXRpb24gb3IgcXVvdGVzIGZyb20gb3RoZXIgc291cmNlcy48L3A+CiAgICAgICAgICAgIDwvYmxvY2txdW90ZT4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hcmtkb3duLWFsZXJ0IG1hcmtkb3duLWFsZXJ0LW5vdGUiPgogICAgICAgICAgICAgIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhpcyBpcyBhbiBpbmZvcm1hdGlvbmFsIG5vdGUgdG8gZHJhdyBhdHRlbnRpb24gdG8gaW1wb3J0YW50IGRldGFpbHMuPC9wPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hcmtkb3duLWFsZXJ0IG1hcmtkb3duLWFsZXJ0LXRpcCI+CiAgICAgICAgICAgICAgPHA+PHN0cm9uZz5UaXA6PC9zdHJvbmc+IEhlcmUncyBhIGhlbHBmdWwgdGlwIHRvIGltcHJvdmUgeW91ciB3b3JrZmxvdy48L3A+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWFya2Rvd24tYWxlcnQgbWFya2Rvd24tYWxlcnQtaW1wb3J0YW50Ij4KICAgICAgICAgICAgICA8cD48c3Ryb25nPkltcG9ydGFudDo8L3N0cm9uZz4gVGhpcyBpbmZvcm1hdGlvbiBpcyBjcnVjaWFsIGZvciB1bmRlcnN0YW5kaW5nIHRoZSB0b3BpYy48L3A+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWFya2Rvd24tYWxlcnQgbWFya2Rvd24tYWxlcnQtd2FybmluZyI+CiAgICAgICAgICAgICAgPHA+PHN0cm9uZz5XYXJuaW5nOjwvc3Ryb25nPiBCZSBjYXJlZnVsIHdoZW4gcGVyZm9ybWluZyB0aGlzIGFjdGlvbi48L3A+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWFya2Rvd24tYWxlcnQgbWFya2Rvd24tYWxlcnQtY2F1dGlvbiI+CiAgICAgICAgICAgICAgPHA+PHN0cm9uZz5DYXV0aW9uOjwvc3Ryb25nPiBUaGlzIGFjdGlvbiBtYXkgaGF2ZSB1bmludGVuZGVkIGNvbnNlcXVlbmNlcy48L3A+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYCk7Cn19CiAgICAgID4KICAgICAgICA8ZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQ+PC9kZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldD4KICAgICAgPC9kZWVzLXBhbmVsPgoKICAgICAgPCEtLSBEZW1vIDc6IEZ1bGwgRG9jdW1lbnQgLS0+CiAgICAgIDxkZWVzLXBhbmVsCiAgICAgICAgLnRpdGxlPSR7IkZ1bGwgRG9jdW1lbnQifQogICAgICAgIC5zdWJ0aXRsZT0keyJBIGNvbXBsZXRlIG1hcmtkb3duIGRvY3VtZW50IGV4YW1wbGUifQogICAgICAgIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChwYW5lbEVsKSA9PiB7CiAgY29uc3Qgb3V0bGV0ID0gcGFuZWxFbC5xdWVyeVNlbGVjdG9yKCJkZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldCIpOwogIGF3YWl0IG91dGxldD8udXBkYXRlSHRtbFRleHQoYAogICAgICAgICAgICA8aDE+R2V0dGluZyBTdGFydGVkIEd1aWRlPC9oMT4KICAgICAgICAgICAgPHA+V2VsY29tZSB0byB0aGUgPHN0cm9uZz5kZWVzLWNhdGFsb2c8L3N0cm9uZz4gY29tcG9uZW50IGxpYnJhcnkuIFRoaXMgZ3VpZGUgd2lsbCBoZWxwIHlvdSBnZXQgdXAgYW5kIHJ1bm5pbmcgcXVpY2tseS48L3A+CgogICAgICAgICAgICA8aDI+SW5zdGFsbGF0aW9uPC9oMj4KICAgICAgICAgICAgPHA+SW5zdGFsbCB0aGUgcGFja2FnZSB1c2luZyB5b3VyIHByZWZlcnJlZCBwYWNrYWdlIG1hbmFnZXI6PC9wPgogICAgICAgICAgICA8cHJlPjxjb2RlPjxzcGFuIGNsYXNzPSJobGpzLWNvbW1lbnQiPiMgVXNpbmcgcG5wbSAocmVjb21tZW5kZWQpPC9zcGFuPgpwbnBtIGFkZCBAZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cKCjxzcGFuIGNsYXNzPSJobGpzLWNvbW1lbnQiPiMgVXNpbmcgbnBtPC9zcGFuPgpucG0gaW5zdGFsbCBAZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2c8L2NvZGU+PC9wcmU+CgogICAgICAgICAgICA8aDI+QmFzaWMgVXNhZ2U8L2gyPgogICAgICAgICAgICA8cD5JbXBvcnQgYW5kIHVzZSBjb21wb25lbnRzIGluIHlvdXIgVHlwZVNjcmlwdCBmaWxlczo8L3A+CiAgICAgICAgICAgIDxwcmU+PGNvZGU+PHNwYW4gY2xhc3M9ImhsanMta2V5d29yZCI+aW1wb3J0PC9zcGFuPiB7IERlZXNCdXR0b24gfSA8c3BhbiBjbGFzcz0iaGxqcy1rZXl3b3JkIj5mcm9tPC9zcGFuPiA8c3BhbiBjbGFzcz0iaGxqcy1zdHJpbmciPidAZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cnPC9zcGFuPjsKCjxzcGFuIGNsYXNzPSJobGpzLWNvbW1lbnQiPi8vIFVzZSBpbiB5b3VyIHRlbXBsYXRlczwvc3Bhbj4KaHRtbFxgJmx0O2RlZXMtYnV0dG9uJmd0O0NsaWNrIG1lJmx0Oy9kZWVzLWJ1dHRvbiZndDtcYDwvY29kZT48L3ByZT4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hcmtkb3duLWFsZXJ0IG1hcmtkb3duLWFsZXJ0LXRpcCI+CiAgICAgICAgICAgICAgPHA+PHN0cm9uZz5UaXA6PC9zdHJvbmc+IENoZWNrIHRoZSBkZW1vIHNob3djYXNlIGZvciBsaXZlIGV4YW1wbGVzIG9mIGFsbCBjb21wb25lbnRzLjwvcD4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8aDI+QXZhaWxhYmxlIENvbXBvbmVudHM8L2gyPgogICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGg+Q29tcG9uZW50PC90aD4KICAgICAgICAgICAgICAgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD48Y29kZT5kZWVzLWJ1dHRvbjwvY29kZT48L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+UHJpbWFyeSBidXR0b24gY29tcG9uZW50PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD48Y29kZT5kZWVzLWlucHV0LXRleHQ8L2NvZGU+PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPlRleHQgaW5wdXQgZmllbGQ8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkPjxjb2RlPmRlZXMtdGFibGU8L2NvZGU+PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPkRhdGEgdGFibGUgd2l0aCBzb3J0aW5nPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD48Y29kZT5kZWVzLW1vZGFsPC9jb2RlPjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD5Nb2RhbCBkaWFsb2c8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICA8L3RhYmxlPgoKICAgICAgICAgICAgPGgyPk5leHQgU3RlcHM8L2gyPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPkV4cGxvcmUgdGhlIDxhIGhyZWY9IiMiPmNvbXBvbmVudCBkb2N1bWVudGF0aW9uPC9hPjwvbGk+CiAgICAgICAgICAgICAgPGxpPkNoZWNrIG91dCB0aGUgPGEgaHJlZj0iIyI+dGhlbWluZyBndWlkZTwvYT48L2xpPgogICAgICAgICAgICAgIDxsaT5Kb2luIG91ciA8YSBocmVmPSIjIj5jb21tdW5pdHkgRGlzY29yZDwvYT48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPGJsb2NrcXVvdGU+CiAgICAgICAgICAgICAgPHA+IlRoZSBiZXN0IGNvbXBvbmVudCBsaWJyYXJ5IGlzIG9uZSB0aGF0IGdldHMgb3V0IG9mIHlvdXIgd2F5LiIgXHUyMDE0IERlc2lnbiBTeXN0ZW1zIFRlYW08L3A+CiAgICAgICAgICAgIDwvYmxvY2txdW90ZT4KICAgICAgICAgIGApOwp9fQogICAgICA+CiAgICAgICAgPGRlZXMtd29ya3NwYWNlLW1hcmtkb3dub3V0bGV0PjwvZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQ+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGl2PgogIDwvZGVlcy1kZW1vd3JhcHBlcj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40MS4yX0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC13b3Jrc3BhY2UvZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQvZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQuanMKaW5pdF9kaXN0X3RzMjYoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlOTggPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmNykgewogICAgaWYgKGY3ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY3ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY3OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzQsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwNyBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A3XSA9IHA3ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A3XTsKICAgIGZvciAodmFyIHA3IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twN10gPSBjb250ZXh0SW4uYWNjZXNzW3A3XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjcpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmNyB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzQgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzQ7CiAgICAgIGlmIChfNCA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNDsKICAgICAgaWYgKF80ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzQpOwogICAgfSBlbHNlIGlmIChfNCA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNCk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF80OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczk5ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzV29ya3NwYWNlTWFya2Rvd25vdXRsZXQgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW3Q0KCJkZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICB2YXIgRGVlc1dvcmtzcGFjZU1hcmtkb3dub3V0bGV0MiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX19lc0RlY29yYXRlOTgobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzV29ya3NwYWNlTWFya2Rvd25vdXRsZXQyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIC8vIERFTU8KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmM1NjsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJXb3Jrc3BhY2UiXTsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgJ05vdG8gU2FucycsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMjQyOTJmIiwgIiNlNmVkZjMiKX07CiAgICAgIH0KCiAgICAgIC5vdXRsZXQgewogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQoKICAgICAgLyogSGVhZGluZ3MgKi8KICAgICAgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiB7CiAgICAgICAgbWFyZ2luLXRvcDogMjRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMjU7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMWYyMzI4IiwgIiNmMGY2ZmMiKX07CiAgICAgIH0KCiAgICAgIGgxIHsKICAgICAgICBmb250LXNpemU6IDJlbTsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMC4zZW07CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDFkOWUwIiwgIiMzMDM2M2QiKX07CiAgICAgIH0KCiAgICAgIGgyIHsKICAgICAgICBmb250LXNpemU6IDEuNWVtOwogICAgICAgIHBhZGRpbmctYm90dG9tOiAwLjNlbTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkMWQ5ZTAiLCAiIzMwMzYzZCIpfTsKICAgICAgfQoKICAgICAgaDMgewogICAgICAgIGZvbnQtc2l6ZTogMS4yNWVtOwogICAgICB9CgogICAgICBoNCB7CiAgICAgICAgZm9udC1zaXplOiAxZW07CiAgICAgIH0KCiAgICAgIGg1IHsKICAgICAgICBmb250LXNpemU6IDAuODc1ZW07CiAgICAgIH0KCiAgICAgIGg2IHsKICAgICAgICBmb250LXNpemU6IDAuODVlbTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2NTZkNzYiLCAiIzhiOTQ5ZSIpfTsKICAgICAgfQoKICAgICAgLyogUGFyYWdyYXBocyBhbmQgdGV4dCAqLwogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgIH0KCiAgICAgIC8qIExpbmtzICovCiAgICAgIGEgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5NjlkYSIsICIjNThhNmZmIil9OwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgYTpob3ZlciB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KCiAgICAgIC8qIFN0cm9uZyBhbmQgZW1waGFzaXMgKi8KICAgICAgc3Ryb25nIHsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzFmMjMyOCIsICIjZjBmNmZjIil9OwogICAgICB9CgogICAgICBlbSB7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICB9CgogICAgICAvKiBMaXN0cyAqLwogICAgICB1bCwgb2wgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJlbTsKICAgICAgfQoKICAgICAgbGkgewogICAgICAgIG1hcmdpbi10b3A6IDRweDsKICAgICAgfQoKICAgICAgbGkgKyBsaSB7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICB9CgogICAgICB1bCB1bCwgdWwgb2wsIG9sIHVsLCBvbCBvbCB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICB9CgogICAgICAvKiBCbG9ja3F1b3RlcyAqLwogICAgICBibG9ja3F1b3RlIHsKICAgICAgICBtYXJnaW46IDAgMCAxNnB4IDA7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNjU2ZDc2IiwgIiM4Yjk0OWUiKX07CiAgICAgICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2QxZDllMCIsICIjMzAzNjNkIil9OwogICAgICB9CgogICAgICBibG9ja3F1b3RlID4gOmZpcnN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CgogICAgICBibG9ja3F1b3RlID4gOmxhc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICAgIH0KCiAgICAgIC8qIElubGluZSBjb2RlICovCiAgICAgIGNvZGUgewogICAgICAgIHBhZGRpbmc6IDAuMmVtIDAuNGVtOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXNpemU6IDg1JTsKICAgICAgICBmb250LWZhbWlseTogdWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgJ1NGIE1vbm8nLCBNZW5sbywgQ29uc29sYXMsICdMaWJlcmF0aW9uIE1vbm8nLCBtb25vc3BhY2U7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMTc1LCAxODQsIDE5MywgMC4yKSIsICJyZ2JhKDExMCwgMTE4LCAxMjksIDAuNCkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBicmVhay1zcGFjZXM7CiAgICAgIH0KCiAgICAgIC8qIENvZGUgYmxvY2tzICovCiAgICAgIHByZSB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgZm9udC1zaXplOiA4NSU7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICAgICAgZm9udC1mYW1pbHk6IHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsICdTRiBNb25vJywgTWVubG8sIENvbnNvbGFzLCAnTGliZXJhdGlvbiBNb25vJywgbW9ub3NwYWNlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjZmOGZhIiwgIiMxNjFiMjIiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIHdvcmQtd3JhcDogbm9ybWFsOwogICAgICB9CgogICAgICBwcmUgY29kZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7CiAgICAgICAgd29yZC13cmFwOiBub3JtYWw7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICAgIGZvbnQtc2l6ZTogMTAwJTsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlOwogICAgICB9CgogICAgICAvKiBUYWJsZXMgKi8KICAgICAgdGFibGUgewogICAgICAgIHdpZHRoOiBtYXgtY29udGVudDsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICAgIGJvcmRlci1zcGFjaW5nOiAwOwogICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIHRhYmxlIHRoIHsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIHBhZGRpbmc6IDZweCAxM3B4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDFkOWUwIiwgIiMzMDM2M2QiKX07CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmNmY4ZmEiLCAiIzE2MWIyMiIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxZjIzMjgiLCAiI2U2ZWRmMyIpfTsKICAgICAgfQoKICAgICAgdGFibGUgdGQgewogICAgICAgIHBhZGRpbmc6IDZweCAxM3B4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDFkOWUwIiwgIiMzMDM2M2QiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMWYyMzI4IiwgIiNlNmVkZjMiKX07CiAgICAgIH0KCiAgICAgIHRhYmxlIHRyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMGQxMTE3Iil9OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2QxZDllMCIsICIjMjEyNjJkIil9OwogICAgICB9CgogICAgICB0YWJsZSB0cjpudGgtY2hpbGQoMm4pIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y2ZjhmYSIsICIjMTYxYjIyIil9OwogICAgICB9CgogICAgICAvKiBIb3Jpem9udGFsIHJ1bGVzICovCiAgICAgIGhyIHsKICAgICAgICBoZWlnaHQ6IDRweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbjogMjRweCAwOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDFkOWUwIiwgIiMzMDM2M2QiKX07CiAgICAgICAgYm9yZGVyOiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgfQoKICAgICAgLyogSW1hZ2VzICovCiAgICAgIGltZyB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICB9CgogICAgICAvKiBUYXNrIGxpc3RzICovCiAgICAgIC50YXNrLWxpc3QtaXRlbSB7CiAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogICAgICB9CgogICAgICAudGFzay1saXN0LWl0ZW0gaW5wdXQgewogICAgICAgIG1hcmdpbjogMCAwLjJlbSAwLjI1ZW0gLTEuNGVtOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIC8qIERlZmluaXRpb24gbGlzdHMgKi8KICAgICAgZGwgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIGRsIGR0IHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICAgICAgZm9udC1zaXplOiAxZW07CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIH0KCiAgICAgIGRsIGRkIHsKICAgICAgICBwYWRkaW5nOiAwIDE2cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgfQoKICAgICAgLyogS2V5Ym9hcmQgaW5wdXQgKi8KICAgICAga2JkIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcGFkZGluZzogM3B4IDVweDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgZm9udC1mYW1pbHk6IHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsICdTRiBNb25vJywgTWVubG8sIENvbnNvbGFzLCAnTGliZXJhdGlvbiBNb25vJywgbW9ub3NwYWNlOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxMHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzFmMjMyOCIsICIjZTZlZGYzIil9OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmNmY4ZmEiLCAiIzE2MWIyMiIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2QxZDllMCIsICIjMzAzNjNkIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIC0xcHggMCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2QxZDllMCIsICIjMzAzNjNkIil9OwogICAgICB9CgogICAgICAvKiBGb290bm90ZXMgKi8KICAgICAgLmZvb3Rub3RlcyB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzY1NmQ3NiIsICIjOGI5NDllIil9OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2QxZDllMCIsICIjMzAzNjNkIil9OwogICAgICAgIHBhZGRpbmctdG9wOiAxNnB4OwogICAgICAgIG1hcmdpbi10b3A6IDMycHg7CiAgICAgIH0KCiAgICAgIC8qIEFsZXJ0cy9BZG1vbml0aW9ucyAqLwogICAgICAubWFya2Rvd24tYWxlcnQgewogICAgICAgIHBhZGRpbmc6IDhweCAxNnB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgIH0KCiAgICAgIC5tYXJrZG93bi1hbGVydC1ub3RlIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDk2OWRhIiwgIiM1OGE2ZmYiKX07CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoOSwgMTA1LCAyMTgsIDAuMSkiLCAicmdiYSg1NiwgMTM5LCAyNTMsIDAuMSkiKX07CiAgICAgIH0KCiAgICAgIC5tYXJrZG93bi1hbGVydC13YXJuaW5nIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjYmY4NzAwIiwgIiNkMjk5MjIiKX07CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMTkxLCAxMzUsIDAsIDAuMSkiLCAicmdiYSgxODcsIDEyOCwgOSwgMC4xKSIpfTsKICAgICAgfQoKICAgICAgLm1hcmtkb3duLWFsZXJ0LWltcG9ydGFudCB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzgyNTBkZiIsICIjYTM3MWY3Iil9OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDEzMCwgODAsIDIyMywgMC4xKSIsICJyZ2JhKDE2MywgMTEzLCAyNDcsIDAuMSkiKX07CiAgICAgIH0KCiAgICAgIC5tYXJrZG93bi1hbGVydC1jYXV0aW9uIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjY2YyMjJlIiwgIiNmODUxNDkiKX07CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMjA3LCAzNCwgNDYsIDAuMSkiLCAicmdiYSgyNDgsIDgxLCA3MywgMC4xKSIpfTsKICAgICAgfQoKICAgICAgLm1hcmtkb3duLWFsZXJ0LXRpcCB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzFhN2YzNyIsICIjM2ZiOTUwIil9OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDI2LCAxMjcsIDU1LCAwLjEpIiwgInJnYmEoNDYsIDE2MCwgNjcsIDAuMSkiKX07CiAgICAgIH0KCiAgICAgIC8qIFN5bnRheCBoaWdobGlnaHRpbmcgZm9yIGNvZGUgYmxvY2tzICovCiAgICAgIC5obGpzLWNvbW1lbnQsCiAgICAgIC5obGpzLXF1b3RlIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2YTczN2QiLCAiIzhiOTQ5ZSIpfTsKICAgICAgfQoKICAgICAgLmhsanMta2V5d29yZCwKICAgICAgLmhsanMtc2VsZWN0b3ItdGFnLAogICAgICAuaGxqcy1hZGRpdGlvbiB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDczYTQ5IiwgIiNmZjdiNzIiKX07CiAgICAgIH0KCiAgICAgIC5obGpzLW51bWJlciwKICAgICAgLmhsanMtc3RyaW5nLAogICAgICAuaGxqcy1tZXRhIC5obGpzLW1ldGEtc3RyaW5nLAogICAgICAuaGxqcy1saXRlcmFsLAogICAgICAuaGxqcy1kb2N0YWcsCiAgICAgIC5obGpzLXJlZ2V4cCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDMyZjYyIiwgIiNhNWQ2ZmYiKX07CiAgICAgIH0KCiAgICAgIC5obGpzLXRpdGxlLAogICAgICAuaGxqcy1zZWN0aW9uLAogICAgICAuaGxqcy1uYW1lLAogICAgICAuaGxqcy1zZWxlY3Rvci1pZCwKICAgICAgLmhsanMtc2VsZWN0b3ItY2xhc3MgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzZmNDJjMSIsICIjZDJhOGZmIil9OwogICAgICB9CgogICAgICAuaGxqcy1hdHRyaWJ1dGUsCiAgICAgIC5obGpzLWF0dHIsCiAgICAgIC5obGpzLXZhcmlhYmxlLAogICAgICAuaGxqcy10ZW1wbGF0ZS12YXJpYWJsZSwKICAgICAgLmhsanMtY2xhc3MgLmhsanMtdGl0bGUsCiAgICAgIC5obGpzLXR5cGUgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwNWNjNSIsICIjNzljMGZmIil9OwogICAgICB9CgogICAgICAuaGxqcy1zeW1ib2wsCiAgICAgIC5obGpzLWJ1bGxldCwKICAgICAgLmhsanMtc3Vic3QsCiAgICAgIC5obGpzLW1ldGEsCiAgICAgIC5obGpzLW1ldGEgLmhsanMta2V5d29yZCwKICAgICAgLmhsanMtc2VsZWN0b3ItYXR0ciwKICAgICAgLmhsanMtc2VsZWN0b3ItcHNldWRvLAogICAgICAuaGxqcy1saW5rIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlMzYyMDkiLCAiI2ZmYTY1NyIpfTsKICAgICAgfQoKICAgICAgLmhsanMtYnVpbHRfaW4sCiAgICAgIC5obGpzLWRlbGV0aW9uIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNiMzFkMjgiLCAiI2ZmYTE5OCIpfTsKICAgICAgfQoKICAgICAgLmhsanMtZm9ybXVsYSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmNmY4ZmEiLCAiIzE2MWIyMiIpfTsKICAgICAgfQoKICAgICAgLmhsanMtZW1waGFzaXMgewogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQoKICAgICAgLmhsanMtc3Ryb25nIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgYAogICAgXTsKICAgIC8vIElOU1RBTkNFCiAgICBvdXRsZXQ7CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0ib3V0bGV0Ij4KICAgICAgICA8aDE+TWFya2Rvd24gUHJldmlldzwvaDE+CiAgICAgICAgPHA+Q29udGVudCB3aWxsIGFwcGVhciBoZXJlIHdoZW4gbWFya2Rvd24gaXMgcGFyc2VkLjwvcD4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcykgewogICAgICBhd2FpdCBzdXBlci5maXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgdGhpcy5vdXRsZXQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLm91dGxldCIpOwogICAgfQogICAgYXN5bmMgdXBkYXRlSHRtbFRleHQoaHRtbFRleHRBcmcpIHsKICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgaWYgKCF0aGlzLm91dGxldCkgewogICAgICAgIHRoaXMub3V0bGV0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5vdXRsZXQiKTsKICAgICAgfQogICAgICB0aGlzLm91dGxldC5pbm5lckhUTUwgPSBodG1sVGV4dEFyZzsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzOTkoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNXb3Jrc3BhY2VNYXJrZG93bm91dGxldDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQxLjJfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy9kZWVzLXRvb2x0aXAvZGVlcy10b29sdGlwLmpzCmluaXRfZGlzdF90czI2KCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzL2luZGV4LmpzCmluaXRfdGhlbWUoKTsKaW5pdF9ncm91cF9ydW50aW1lKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDEuMl9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS5qcwp2YXIgY29tbWl0aW5mbyA9IHsKICBuYW1lOiAiQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nIiwKICB2ZXJzaW9uOiAiMy40MS4yIiwKICBkZXNjcmlwdGlvbjogIkEgY29tcHJlaGVuc2l2ZSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgZHluYW1pYyB3ZWIgY29tcG9uZW50cyBmb3IgYnVpbGRpbmcgc29waGlzdGljYXRlZCBhbmQgbW9kZXJuIHdlYiBhcHBsaWNhdGlvbnMgdXNpbmcgSmF2YVNjcmlwdCBhbmQgVHlwZVNjcmlwdC4iCn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGFwaS5nbG9iYWwrdHlwZWRzb2NrZXRANC4xLjBfQHB1c2gucm9ja3Mrc21hcnRzZXJ2ZUAyLjAuMS9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRzb2NrZXQvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMzAgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMzAsIHsKICBUeXBlZFNvY2tldDogKCkgPT4gVHlwZWRTb2NrZXQKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MraXNvaGFzaEAyLjAuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvaXNvaGFzaC9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMyOSA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMyOSwgewogIHNoYTI1NkZyb21TdHJpbmc6ICgpID0+IHNoYTI1NkZyb21TdHJpbmcyCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNocm9ja3Mrc21hcnRlbnZANS4wLjUvbm9kZV9tb2R1bGVzL0BwdXNocm9ja3Mvc21hcnRlbnYvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMjggPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMjgsIHsKICBTbWFydGVudjogKCkgPT4gU21hcnRlbnYyCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNocm9ja3Mrc21hcnRlbnZANS4wLjUvbm9kZV9tb2R1bGVzL0BwdXNocm9ja3Mvc21hcnRlbnYvZGlzdF90cy9zbWFydGVudi5wbHVnaW5zLmpzCnZhciBzbWFydHByb21pc2UgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdF90czMoKSwgMSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2hyb2NrcytzbWFydGVudkA1LjAuNS9ub2RlX21vZHVsZXMvQHB1c2hyb2Nrcy9zbWFydGVudi9kaXN0X3RzL3NtYXJ0ZW52LmNsYXNzZXMuc21hcnRlbnYuanMKdmFyIFNtYXJ0ZW52MiA9IGNsYXNzIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMubG9hZGVkU2NyaXB0cyA9IFtdOwogIH0KICBhc3luYyBnZXRFbnZBd2FyZU1vZHVsZShvcHRpb25zQXJnKSB7CiAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgY29uc3QgbW9kdWxlUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRTYWZlTm9kZU1vZHVsZShvcHRpb25zQXJnLm5vZGVNb2R1bGVOYW1lKTsKICAgICAgcmV0dXJuIG1vZHVsZVJlc3VsdDsKICAgIH0gZWxzZSBpZiAodGhpcy5pc0Jyb3dzZXIpIHsKICAgICAgY29uc3QgbW9kdWxlUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRTYWZlV2ViTW9kdWxlKG9wdGlvbnNBcmcud2ViVXJsQXJnLCBvcHRpb25zQXJnLmdldEZ1bmN0aW9uKTsKICAgICAgcmV0dXJuIG1vZHVsZVJlc3VsdDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoInBsYXRmb3JtIGZvciBsb2FkaW5nIG5vdCBzdXBwb3J0ZWQgYnkgc21hcnRlbnYiKTsKICAgIH0KICB9CiAgYXN5bmMgZ2V0U2FmZU5vZGVNb2R1bGUobW9kdWxlTmFtZUFyZykgewogICAgaWYgKCF0aGlzLmlzTm9kZSkgewogICAgICBjb25zb2xlLmVycm9yKGBZb3UgdHJpZWQgdG8gbG9hZCBhIG5vZGUgbW9kdWxlIGluIGEgd3JvbmcgY29udGV4dDogJHttb2R1bGVOYW1lQXJnfWApOwogICAgICByZXR1cm47CiAgICB9CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKGByZXR1cm4gaW1wb3J0KCcke21vZHVsZU5hbWVBcmd9JylgKSgpOwogIH0KICBhc3luYyBnZXRTYWZlV2ViTW9kdWxlKHVybEFyZywgZ2V0RnVuY3Rpb25BcmcpIHsKICAgIGlmICghdGhpcy5pc0Jyb3dzZXIpIHsKICAgICAgY29uc29sZS5lcnJvcigiWW91IHRyaWVkIHRvIGxvYWQgYSB3ZWIgbW9kdWxlIGluIGEgd3JvbmcgY29udGV4dCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5sb2FkZWRTY3JpcHRzLmluY2x1ZGVzKHVybEFyZykpIHsKICAgICAgcmV0dXJuIGdldEZ1bmN0aW9uQXJnKCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmxvYWRlZFNjcmlwdHMucHVzaCh1cmxBcmcpOwogICAgfQogICAgY29uc3QgZG9uZSA9IHNtYXJ0cHJvbWlzZS5kZWZlcigpOwogICAgaWYgKGdsb2JhbFRoaXMuaW1wb3J0U2NyaXB0cykgewogICAgICBnbG9iYWxUaGlzLmltcG9ydFNjcmlwdHModXJsQXJnKTsKICAgICAgZG9uZS5yZXNvbHZlKCk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHsKICAgICAgICBkb25lLnJlc29sdmUoKTsKICAgICAgfTsKICAgICAgc2NyaXB0LnNyYyA9IHVybEFyZzsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgfQogICAgYXdhaXQgZG9uZS5wcm9taXNlOwogICAgcmV0dXJuIGdldEZ1bmN0aW9uQXJnKCk7CiAgfQogIGdldCBydW50aW1lRW52KCkgewogICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAidW5kZWZpbmVkIikgewogICAgICByZXR1cm4gIm5vZGUiOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICJicm93c2VyIjsKICAgIH0KICB9CiAgZ2V0IGlzQnJvd3NlcigpIHsKICAgIHJldHVybiAhdGhpcy5pc05vZGU7CiAgfQogIGdldCB1c2VyQWdlbnQoKSB7CiAgICBpZiAodGhpcy5pc0Jyb3dzZXIpIHsKICAgICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gInVuZGVmaW5lZCI7CiAgICB9CiAgfQogIGdldCBpc05vZGUoKSB7CiAgICByZXR1cm4gdGhpcy5ydW50aW1lRW52ID09PSAibm9kZSI7CiAgfQogIGdldCBub2RlVmVyc2lvbigpIHsKICAgIHJldHVybiBwcm9jZXNzLnZlcnNpb247CiAgfQogIGdldCBpc0NJKCkgewogICAgaWYgKHRoaXMuaXNOb2RlKSB7CiAgICAgIGlmIChwcm9jZXNzLmVudi5DSSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICBhc3luYyBpc01hY0FzeW5jKCkgewogICAgaWYgKHRoaXMuaXNOb2RlKSB7CiAgICAgIGNvbnN0IG9zID0gYXdhaXQgdGhpcy5nZXRTYWZlTm9kZU1vZHVsZSgib3MiKTsKICAgICAgcmV0dXJuIG9zLnBsYXRmb3JtKCkgPT09ICJkYXJ3aW4iOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICBhc3luYyBpc1dpbmRvd3NBc3luYygpIHsKICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICBjb25zdCBvcyA9IGF3YWl0IHRoaXMuZ2V0U2FmZU5vZGVNb2R1bGUoIm9zIik7CiAgICAgIHJldHVybiBvcy5wbGF0Zm9ybSgpID09PSAid2luMzIiOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICBhc3luYyBpc0xpbnV4QXN5bmMoKSB7CiAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgY29uc3Qgb3MgPSBhd2FpdCB0aGlzLmdldFNhZmVOb2RlTW9kdWxlKCJvcyIpOwogICAgICByZXR1cm4gb3MucGxhdGZvcm0oKSA9PT0gImxpbnV4IjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgLyoqCiAgICogcHJpbnRzIHRoZSBlbnZpcm9ubWVudCB0byBjb25zb2xlCiAgICovCiAgYXN5bmMgcHJpbnRFbnYoKSB7CiAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgY29uc29sZS5sb2coInJ1bm5pbmcgb24gTk9ERSIpOwogICAgICBjb25zb2xlLmxvZygibm9kZSB2ZXJzaW9uIGlzICIgKyB0aGlzLm5vZGVWZXJzaW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUubG9nKCJydW5uaW5nIG9uIEJST1dTRVIiKTsKICAgICAgY29uc29sZS5sb2coImJyb3dzZXIgaXMgIiArIHRoaXMudXNlckFnZW50KTsKICAgIH0KICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MraXNvaGFzaEAyLjAuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvaXNvaGFzaC9kaXN0X3RzL2luZGV4LmpzCnZhciBoZXgyID0gKGJ1ZmZlcjIpID0+IHsKICBjb25zdCBoZXhDb2RlcyA9IFtdOwogIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyMik7CiAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgdmlldy5ieXRlTGVuZ3RoOyBpMTEgKz0gNCkgewogICAgY29uc3QgdmFsdWUyID0gdmlldy5nZXRVaW50MzIoaTExKTsKICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gdmFsdWUyLnRvU3RyaW5nKDE2KTsKICAgIGNvbnN0IHBhZGRpbmcgPSAiMDAwMDAwMDAiOwogICAgY29uc3QgcGFkZGVkVmFsdWUgPSAocGFkZGluZyArIHN0cmluZ1ZhbHVlKS5zbGljZSgtcGFkZGluZy5sZW5ndGgpOwogICAgaGV4Q29kZXMucHVzaChwYWRkZWRWYWx1ZSk7CiAgfQogIHJldHVybiBoZXhDb2Rlcy5qb2luKCIiKTsKfTsKdmFyIHNoYTI1NkZyb21TdHJpbmcyID0gYXN5bmMgKHN0cmluZ0FyZykgPT4gewogIGNvbnN0IHNtYXJ0ZW52ID0gbmV3IGRpc3RfdHNfZXhwb3J0czI4LlNtYXJ0ZW52KCk7CiAgaWYgKHNtYXJ0ZW52LmlzQnJvd3NlcikgewogICAgY29uc3QgYnVmZmVyMiA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHJpbmdBcmcpOwogICAgY29uc3QgaGFzaCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCJTSEEtMjU2IiwgYnVmZmVyMik7CiAgICBjb25zdCByZXN1bHQgPSBoZXgyKGhhc2gpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9IGVsc2UgaWYgKHNtYXJ0ZW52LmlzTm9kZSkgewogICAgY29uc3Qgc21hcnRoYXNoTW9kdWxlID0gYXdhaXQgc21hcnRlbnYuZ2V0U2FmZU5vZGVNb2R1bGUoIkBwdXNocm9ja3Mvc21hcnRoYXNoIik7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzbWFydGhhc2hNb2R1bGUuc2hhMjU2RnJvbVN0cmluZyhzdHJpbmdBcmcpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGFwaS5nbG9iYWwrdHlwZWRzb2NrZXRANC4xLjBfQHB1c2gucm9ja3Mrc21hcnRzZXJ2ZUAyLjAuMS9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRzb2NrZXQvZGlzdF90cy90eXBlZHNvY2tldC5wbHVnaW5zLmpzCmluaXRfZGlzdF90czE1KCk7CmluaXRfZGlzdF90czQoKTsKaW5pdF9kaXN0X3RzMygpOwppbml0X2Rpc3RfdHMxMigpOwppbml0X2Rpc3RfdHMoKTsKaW5pdF9kaXN0X3RzMigpOwppbml0X2Rpc3RfdHMxMSgpOwppbml0X2Rpc3RfdHMyMCgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkc29ja2V0QDQuMS4wX0BwdXNoLnJvY2tzK3NtYXJ0c2VydmVAMi4wLjEvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkc29ja2V0L2Rpc3RfdHMvdHlwZWRzb2NrZXQuY2xhc3Nlcy50eXBlZHNvY2tldC5qcwp2YXIgVEFHX1BSRUZJWCA9ICJfX3R5cGVkc29ja2V0X3RhZ19fIjsKZnVuY3Rpb24gd3JhcFNtYXJ0U2VydmVQZWVyKHBlZXIpIHsKICByZXR1cm4gewogICAgcGVlciwKICAgIGFzeW5jIGdldFRhZ0J5SWQodGFnSWQpIHsKICAgICAgaWYgKCFwZWVyLnRhZ3MuaGFzKHRhZ0lkKSkgewogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH0KICAgICAgY29uc3QgcGF5bG9hZCA9IHBlZXIuZGF0YS5nZXQoYCR7VEFHX1BSRUZJWH0ke3RhZ0lkfWApOwogICAgICByZXR1cm4geyBpZDogdGFnSWQsIHBheWxvYWQgfTsKICAgIH0KICB9Owp9CnZhciBUeXBlZFNvY2tldCA9IGNsYXNzIF9UeXBlZFNvY2tldCB7CiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8vIFNUQVRJQyBNRVRIT0RTCiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8qKgogICAqIENyZWF0ZXMgYSBUeXBlZFNvY2tldCBjbGllbnQgdXNpbmcgbmF0aXZlIFdlYlNvY2tldC4KICAgKiBXb3JrcyBpbiBib3RoIGJyb3dzZXIgYW5kIE5vZGUuanMgZW52aXJvbm1lbnRzLgogICAqCiAgICogQHBhcmFtIHR5cGVkcm91dGVyQXJnIC0gVHlwZWRSb3V0ZXIgZm9yIGhhbmRsaW5nIHNlcnZlci1pbml0aWF0ZWQgcmVxdWVzdHMKICAgKiBAcGFyYW0gc2VydmVyVXJsQXJnIC0gU2VydmVyIFVSTCAoZS5nLiwgJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMCcgb3IgJ3dzczovL2V4YW1wbGUuY29tJykKICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbm5lY3Rpb24gb3B0aW9ucwogICAqCiAgICogQGV4YW1wbGUKICAgKiBgYGB0eXBlc2NyaXB0CiAgICogY29uc3QgdHlwZWRSb3V0ZXIgPSBuZXcgVHlwZWRSb3V0ZXIoKTsKICAgKiBjb25zdCBjbGllbnQgPSBhd2FpdCBUeXBlZFNvY2tldC5jcmVhdGVDbGllbnQoCiAgICogICB0eXBlZFJvdXRlciwKICAgKiAgICdodHRwOi8vbG9jYWxob3N0OjMwMDAnLAogICAqICAgeyBhdXRvUmVjb25uZWN0OiB0cnVlIH0KICAgKiApOwogICAqIGBgYAogICAqLwogIHN0YXRpYyBhc3luYyBjcmVhdGVDbGllbnQodHlwZWRyb3V0ZXJBcmcsIHNlcnZlclVybEFyZywgb3B0aW9ucyA9IHt9KSB7CiAgICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSB7CiAgICAgIGF1dG9SZWNvbm5lY3Q6IHRydWUsCiAgICAgIG1heFJldHJpZXM6IDEwMCwKICAgICAgaW5pdGlhbEJhY2tvZmZNczogMWUzLAogICAgICBtYXhCYWNrb2ZmTXM6IDZlNAogICAgfTsKICAgIGNvbnN0IG9wdHMgPSB7IC4uLmRlZmF1bHRPcHRpb25zMiwgLi4ub3B0aW9ucyB9OwogICAgY29uc3QgdHlwZWRTb2NrZXQgPSBuZXcgX1R5cGVkU29ja2V0KCJjbGllbnQiLCB0eXBlZHJvdXRlckFyZyk7CiAgICB0eXBlZFNvY2tldC5jbGllbnRPcHRpb25zID0gb3B0czsKICAgIHR5cGVkU29ja2V0LnNlcnZlclVybCA9IHNlcnZlclVybEFyZzsKICAgIHR5cGVkU29ja2V0LmN1cnJlbnRCYWNrb2ZmID0gb3B0cy5pbml0aWFsQmFja29mZk1zOwogICAgYXdhaXQgdHlwZWRTb2NrZXQuY29ubmVjdCgpOwogICAgcmV0dXJuIHR5cGVkU29ja2V0OwogIH0KICBzdGF0aWMgewogICAgdGhpcy51c2VXaW5kb3dMb2NhdGlvbk9yaWdpblVybCA9ICgpID0+IHsKICAgICAgcmV0dXJuIGRpc3RfdHNfZXhwb3J0czIwLlNtYXJ0dXJsLmNyZWF0ZUZyb21VcmwoZ2xvYmFsVGhpcy5sb2NhdGlvbi5vcmlnaW4pLnRvU3RyaW5nKCk7CiAgICB9OwogIH0KICAvKioKICAgKiBDcmVhdGVzIGEgVHlwZWRTb2NrZXQgc2VydmVyIGZyb20gYW4gZXhpc3RpbmcgU21hcnRTZXJ2ZSBpbnN0YW5jZS4KICAgKiBUaGlzIGlzIHRoZSBvbmx5IHdheSB0byBjcmVhdGUgYSBzZXJ2ZXItc2lkZSBUeXBlZFNvY2tldC4KICAgKgogICAqIEBwYXJhbSBzbWFydFNlcnZlQXJnIC0gU21hcnRTZXJ2ZSBpbnN0YW5jZSB3aXRoIHR5cGVkUm91dGVyIGNvbmZpZ3VyZWQgaW4gd2Vic29ja2V0IG9wdGlvbnMKICAgKiBAcGFyYW0gdHlwZWRSb3V0ZXJBcmcgLSBUeXBlZFJvdXRlciBmb3IgaGFuZGxpbmcgcmVxdWVzdHMgKG11c3QgbWF0Y2ggU21hcnRTZXJ2ZSdzIHR5cGVkUm91dGVyKQogICAqCiAgICogQGV4YW1wbGUKICAgKiBgYGB0eXBlc2NyaXB0CiAgICogY29uc3QgdHlwZWRSb3V0ZXIgPSBuZXcgVHlwZWRSb3V0ZXIoKTsKICAgKiBjb25zdCBzbWFydFNlcnZlID0gbmV3IFNtYXJ0U2VydmUoewogICAqICAgcG9ydDogMzAwMCwKICAgKiAgIHdlYnNvY2tldDogewogICAqICAgICB0eXBlZFJvdXRlciwKICAgKiAgICAgb25Db25uZWN0aW9uT3BlbjogKHBlZXIpID0+IHBlZXIudGFncy5hZGQoJ2NsaWVudCcpCiAgICogICB9CiAgICogfSk7CiAgICogYXdhaXQgc21hcnRTZXJ2ZS5zdGFydCgpOwogICAqIGNvbnN0IHR5cGVkU29ja2V0ID0gVHlwZWRTb2NrZXQuZnJvbVNtYXJ0U2VydmUoc21hcnRTZXJ2ZSwgdHlwZWRSb3V0ZXIpOwogICAqIGBgYAogICAqLwogIHN0YXRpYyBmcm9tU21hcnRTZXJ2ZShzbWFydFNlcnZlQXJnLCB0eXBlZFJvdXRlckFyZykgewogICAgY29uc3QgY29ubmVjdGlvbldyYXBwZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIF9UeXBlZFNvY2tldC5yZWdpc3RlclRhZ0hhbmRsZXJzKHR5cGVkUm91dGVyQXJnKTsKICAgIGNvbnN0IHR5cGVkU29ja2V0ID0gbmV3IF9UeXBlZFNvY2tldCgic2VydmVyIiwgdHlwZWRSb3V0ZXJBcmcpOwogICAgdHlwZWRTb2NrZXQuc21hcnRTZXJ2ZVJlZiA9IHNtYXJ0U2VydmVBcmc7CiAgICB0eXBlZFNvY2tldC5zbWFydFNlcnZlQ29ubmVjdGlvbldyYXBwZXJzID0gY29ubmVjdGlvbldyYXBwZXJzOwogICAgcmV0dXJuIHR5cGVkU29ja2V0OwogIH0KICAvKioKICAgKiBSZWdpc3RlcnMgYnVpbHQtaW4gVHlwZWRIYW5kbGVycyBmb3IgdGFnIG1hbmFnZW1lbnQKICAgKi8KICBzdGF0aWMgcmVnaXN0ZXJUYWdIYW5kbGVycyh0eXBlZFJvdXRlcikgewogICAgdHlwZWRSb3V0ZXIuYWRkVHlwZWRIYW5kbGVyKG5ldyBkaXN0X3RzX2V4cG9ydHMxNS5UeXBlZEhhbmRsZXIoIl9fdHlwZWRzb2NrZXRfc2V0VGFnIiwgYXN5bmMgKGRhdGEsIG1ldGEpID0+IHsKICAgICAgY29uc3QgcGVlciA9IG1ldGE/LmxvY2FsRGF0YT8ucGVlcjsKICAgICAgaWYgKCFwZWVyKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJzZXRUYWc6IE5vIHBlZXIgZm91bmQgaW4gcmVxdWVzdCBjb250ZXh0Iik7CiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UgfTsKICAgICAgfQogICAgICBwZWVyLnRhZ3MuYWRkKGRhdGEubmFtZSk7CiAgICAgIHBlZXIuZGF0YS5zZXQoYCR7VEFHX1BSRUZJWH0ke2RhdGEubmFtZX1gLCBkYXRhLnBheWxvYWQpOwogICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07CiAgICB9KSk7CiAgICB0eXBlZFJvdXRlci5hZGRUeXBlZEhhbmRsZXIobmV3IGRpc3RfdHNfZXhwb3J0czE1LlR5cGVkSGFuZGxlcigiX190eXBlZHNvY2tldF9yZW1vdmVUYWciLCBhc3luYyAoZGF0YSwgbWV0YSkgPT4gewogICAgICBjb25zdCBwZWVyID0gbWV0YT8ubG9jYWxEYXRhPy5wZWVyOwogICAgICBpZiAoIXBlZXIpIHsKICAgICAgICBjb25zb2xlLndhcm4oInJlbW92ZVRhZzogTm8gcGVlciBmb3VuZCBpbiByZXF1ZXN0IGNvbnRleHQiKTsKICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9OwogICAgICB9CiAgICAgIHBlZXIudGFncy5kZWxldGUoZGF0YS5uYW1lKTsKICAgICAgcGVlci5kYXRhLmRlbGV0ZShgJHtUQUdfUFJFRklYfSR7ZGF0YS5uYW1lfWApOwogICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07CiAgICB9KSk7CiAgfQogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAvLyBDT05TVFJVQ1RPUgogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBjb25zdHJ1Y3RvcihzaWRlQXJnLCB0eXBlZHJvdXRlckFyZykgewogICAgdGhpcy5zdGF0dXNTdWJqZWN0ID0gbmV3IGRpc3RfdHNfZXhwb3J0czIucnhqcy5TdWJqZWN0KCk7CiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMgPSAibmV3IjsKICAgIHRoaXMud2Vic29ja2V0ID0gbnVsbDsKICAgIHRoaXMuY2xpZW50T3B0aW9ucyA9IG51bGw7CiAgICB0aGlzLnNlcnZlclVybCA9ICIiOwogICAgdGhpcy5yZXRyeUNvdW50ID0gMDsKICAgIHRoaXMuY3VycmVudEJhY2tvZmYgPSAxZTM7CiAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICB0aGlzLnNtYXJ0U2VydmVSZWYgPSBudWxsOwogICAgdGhpcy5zbWFydFNlcnZlQ29ubmVjdGlvbldyYXBwZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIHRoaXMuc2lkZSA9IHNpZGVBcmc7CiAgICB0aGlzLnR5cGVkcm91dGVyID0gdHlwZWRyb3V0ZXJBcmc7CiAgfQogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAvLyBDTElFTlQgTUVUSE9EUwogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAvKioKICAgKiBDb25uZWN0cyB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2ZXIgdXNpbmcgbmF0aXZlIFdlYlNvY2tldAogICAqLwogIGFzeW5jIGNvbm5lY3QoKSB7CiAgICBjb25zdCBkb25lID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICB0aGlzLnVwZGF0ZVN0YXR1cygiY29ubmVjdGluZyIpOwogICAgY29uc3Qgd3NVcmwgPSB0aGlzLnRvV2ViU29ja2V0VXJsKHRoaXMuc2VydmVyVXJsKTsKICAgIGNvbnNvbGUubG9nKGBUeXBlZFNvY2tldCBjb25uZWN0aW5nIHRvICR7d3NVcmx9Li4uYCk7CiAgICB0aGlzLndlYnNvY2tldCA9IG5ldyBXZWJTb2NrZXQod3NVcmwpOwogICAgY29uc3QgY29ubmVjdGlvblRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXR1cyAhPT0gImNvbm5lY3RlZCIpIHsKICAgICAgICBjb25zb2xlLndhcm4oIlR5cGVkU29ja2V0IGNvbm5lY3Rpb24gdGltZW91dCIpOwogICAgICAgIHRoaXMud2Vic29ja2V0Py5jbG9zZSgpOwogICAgICAgIGRvbmUucmVqZWN0KG5ldyBFcnJvcigiQ29ubmVjdGlvbiB0aW1lb3V0IikpOwogICAgICB9CiAgICB9LCAxZTQpOwogICAgdGhpcy53ZWJzb2NrZXQub25vcGVuID0gKCkgPT4gewogICAgICBjbGVhclRpbWVvdXQoY29ubmVjdGlvblRpbWVvdXQpOwogICAgICBjb25zb2xlLmxvZygiVHlwZWRTb2NrZXQgY29ubmVjdGVkISIpOwogICAgICB0aGlzLnVwZGF0ZVN0YXR1cygiY29ubmVjdGVkIik7CiAgICAgIHRoaXMucmV0cnlDb3VudCA9IDA7CiAgICAgIHRoaXMuY3VycmVudEJhY2tvZmYgPSB0aGlzLmNsaWVudE9wdGlvbnM/LmluaXRpYWxCYWNrb2ZmTXMgPz8gMWUzOwogICAgICBkb25lLnJlc29sdmUoKTsKICAgIH07CiAgICB0aGlzLndlYnNvY2tldC5vbm1lc3NhZ2UgPSBhc3luYyAoZXZlbnQpID0+IHsKICAgICAgYXdhaXQgdGhpcy5oYW5kbGVNZXNzYWdlKGV2ZW50LmRhdGEpOwogICAgfTsKICAgIHRoaXMud2Vic29ja2V0Lm9uY2xvc2UgPSAoKSA9PiB7CiAgICAgIGNsZWFyVGltZW91dChjb25uZWN0aW9uVGltZW91dCk7CiAgICAgIHRoaXMuaGFuZGxlRGlzY29ubmVjdCgpOwogICAgfTsKICAgIHRoaXMud2Vic29ja2V0Lm9uZXJyb3IgPSAoZXJyb3IpID0+IHsKICAgICAgY29uc29sZS5lcnJvcigiVHlwZWRTb2NrZXQgV2ViU29ja2V0IGVycm9yOiIsIGVycm9yKTsKICAgIH07CiAgICB0cnkgewogICAgICBhd2FpdCBkb25lLnByb21pc2U7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY2xlYXJUaW1lb3V0KGNvbm5lY3Rpb25UaW1lb3V0KTsKICAgICAgaWYgKHRoaXMuY2xpZW50T3B0aW9ucz8uYXV0b1JlY29ubmVjdCkgewogICAgICAgIGF3YWl0IHRoaXMuc2NoZWR1bGVSZWNvbm5lY3QoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBlcnI7CiAgICAgIH0KICAgIH0KICB9CiAgLyoqCiAgICogQ29udmVydHMgYW4gSFRUUChTKSBVUkwgdG8gYSBXZWJTb2NrZXQgVVJMCiAgICovCiAgdG9XZWJTb2NrZXRVcmwodXJsKSB7CiAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHVybCk7CiAgICBjb25zdCB3c1Byb3RvY29sID0gcGFyc2VkLnByb3RvY29sID09PSAiaHR0cHM6IiA/ICJ3c3M6IiA6ICJ3czoiOwogICAgcmV0dXJuIGAke3dzUHJvdG9jb2x9Ly8ke3BhcnNlZC5ob3N0fSR7cGFyc2VkLnBhdGhuYW1lfWA7CiAgfQogIC8qKgogICAqIEhhbmRsZXMgaW5jb21pbmcgV2ViU29ja2V0IG1lc3NhZ2VzCiAgICovCiAgYXN5bmMgaGFuZGxlTWVzc2FnZShkYXRhKSB7CiAgICB0cnkgewogICAgICBjb25zdCBtZXNzYWdlVGV4dCA9IHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiA/IGRhdGEgOiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZGF0YSk7CiAgICAgIGNvbnN0IG1lc3NhZ2UyID0gZGlzdF90c19leHBvcnRzMTIucGFyc2UobWVzc2FnZVRleHQpOwogICAgICBpZiAobWVzc2FnZTIuY29ycmVsYXRpb24/LmlkICYmIHRoaXMucGVuZGluZ1JlcXVlc3RzLmhhcyhtZXNzYWdlMi5jb3JyZWxhdGlvbi5pZCkpIHsKICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nUmVxdWVzdHMuZ2V0KG1lc3NhZ2UyLmNvcnJlbGF0aW9uLmlkKTsKICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5kZWxldGUobWVzc2FnZTIuY29ycmVsYXRpb24uaWQpOwogICAgICAgIHBlbmRpbmcucmVzb2x2ZShtZXNzYWdlMik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy50eXBlZHJvdXRlci5yb3V0ZUFuZEFkZFJlc3BvbnNlKG1lc3NhZ2UyKTsKICAgICAgaWYgKHJlc3BvbnNlICYmIHRoaXMud2Vic29ja2V0Py5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikgewogICAgICAgIHRoaXMud2Vic29ja2V0LnNlbmQoZGlzdF90c19leHBvcnRzMTIuc3RyaW5naWZ5KHJlc3BvbnNlKSk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycikgewogICAgICBjb25zb2xlLmVycm9yKCJUeXBlZFNvY2tldCBmYWlsZWQgdG8gcHJvY2VzcyBtZXNzYWdlOiIsIGVycik7CiAgICB9CiAgfQogIC8qKgogICAqIEhhbmRsZXMgV2ViU29ja2V0IGRpc2Nvbm5lY3Rpb24KICAgKi8KICBoYW5kbGVEaXNjb25uZWN0KCkgewogICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXR1cyA9PT0gImRpc2Nvbm5lY3RlZCIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy51cGRhdGVTdGF0dXMoImRpc2Nvbm5lY3RlZCIpOwogICAgaWYgKHRoaXMuY2xpZW50T3B0aW9ucz8uYXV0b1JlY29ubmVjdCAmJiB0aGlzLnJldHJ5Q291bnQgPCB0aGlzLmNsaWVudE9wdGlvbnMubWF4UmV0cmllcykgewogICAgICB0aGlzLnNjaGVkdWxlUmVjb25uZWN0KCk7CiAgICB9CiAgfQogIC8qKgogICAqIFNjaGVkdWxlcyBhIHJlY29ubmVjdGlvbiBhdHRlbXB0IHdpdGggZXhwb25lbnRpYWwgYmFja29mZgogICAqLwogIGFzeW5jIHNjaGVkdWxlUmVjb25uZWN0KCkgewogICAgaWYgKCF0aGlzLmNsaWVudE9wdGlvbnMpCiAgICAgIHJldHVybjsKICAgIHRoaXMudXBkYXRlU3RhdHVzKCJyZWNvbm5lY3RpbmciKTsKICAgIHRoaXMucmV0cnlDb3VudCsrOwogICAgY29uc3Qgaml0dGVyID0gdGhpcy5jdXJyZW50QmFja29mZiAqIDAuMiAqIChNYXRoLnJhbmRvbSgpICogMiAtIDEpOwogICAgY29uc3QgZGVsYXkyID0gTWF0aC5taW4odGhpcy5jdXJyZW50QmFja29mZiArIGppdHRlciwgdGhpcy5jbGllbnRPcHRpb25zLm1heEJhY2tvZmZNcyk7CiAgICBjb25zb2xlLmxvZyhgVHlwZWRTb2NrZXQgcmVjb25uZWN0aW5nIGluICR7TWF0aC5yb3VuZChkZWxheTIpfW1zIChhdHRlbXB0ICR7dGhpcy5yZXRyeUNvdW50fS8ke3RoaXMuY2xpZW50T3B0aW9ucy5tYXhSZXRyaWVzfSlgKTsKICAgIGF3YWl0IGRpc3RfdHNfZXhwb3J0czMuZGVsYXlGb3IoZGVsYXkyKTsKICAgIHRoaXMuY3VycmVudEJhY2tvZmYgPSBNYXRoLm1pbih0aGlzLmN1cnJlbnRCYWNrb2ZmICogMiwgdGhpcy5jbGllbnRPcHRpb25zLm1heEJhY2tvZmZNcyk7CiAgICB0cnkgewogICAgICBhd2FpdCB0aGlzLmNvbm5lY3QoKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBjb25zb2xlLmVycm9yKCJUeXBlZFNvY2tldCByZWNvbm5lY3Rpb24gZmFpbGVkOiIsIGVycik7CiAgICB9CiAgfQogIC8qKgogICAqIFVwZGF0ZXMgY29ubmVjdGlvbiBzdGF0dXMgYW5kIG5vdGlmaWVzIHN1YnNjcmliZXJzCiAgICovCiAgdXBkYXRlU3RhdHVzKHN0YXR1cykgewogICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXR1cyAhPT0gc3RhdHVzKSB7CiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyA9IHN0YXR1czsKICAgICAgdGhpcy5zdGF0dXNTdWJqZWN0Lm5leHQoc3RhdHVzKTsKICAgIH0KICB9CiAgLyoqCiAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgYW5kIHdhaXRzIGZvciByZXNwb25zZSAoY2xpZW50LXNpZGUpCiAgICovCiAgYXN5bmMgc2VuZFJlcXVlc3QocmVxdWVzdCkgewogICAgaWYgKCF0aGlzLndlYnNvY2tldCB8fCB0aGlzLndlYnNvY2tldC5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuT1BFTikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldlYlNvY2tldCBub3QgY29ubmVjdGVkIik7CiAgICB9CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgICAgY29uc3QgdGltZW91dDIgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5kZWxldGUocmVxdWVzdC5jb3JyZWxhdGlvbi5pZCk7CiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcigiUmVxdWVzdCB0aW1lb3V0IikpOwogICAgICB9LCAzZTQpOwogICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5zZXQocmVxdWVzdC5jb3JyZWxhdGlvbi5pZCwgewogICAgICAgIHJlc29sdmU6IChyZXNwb25zZSkgPT4gewogICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQyKTsKICAgICAgICAgIHJlc29sdmUyKHJlc3BvbnNlKTsKICAgICAgICB9LAogICAgICAgIHJlamVjdDogKGVycm9yKSA9PiB7CiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dDIpOwogICAgICAgICAgcmVqZWN0KGVycm9yKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLndlYnNvY2tldC5zZW5kKGRpc3RfdHNfZXhwb3J0czEyLnN0cmluZ2lmeShyZXF1ZXN0KSk7CiAgICB9KTsKICB9CiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8vIFBVQkxJQyBBUEkgLSBTSEFSRUQKICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLyoqCiAgICogQ3JlYXRlcyBhIFR5cGVkUmVxdWVzdCBmb3IgdGhlIHNwZWNpZmllZCBtZXRob2QuCiAgICogT24gY2xpZW50cywgc2VuZHMgdG8gdGhlIHNlcnZlci4KICAgKiBPbiBzZXJ2ZXJzLCBzZW5kcyB0byB0aGUgc3BlY2lmaWVkIHRhcmdldCBjb25uZWN0aW9uLgogICAqLwogIGNyZWF0ZVR5cGVkUmVxdWVzdChtZXRob2ROYW1lLCB0YXJnZXRDb25uZWN0aW9uKSB7CiAgICBjb25zdCBwb3N0TWV0aG9kID0gYXN5bmMgKHJlcXVlc3REYXRhQXJnKSA9PiB7CiAgICAgIGlmICh0aGlzLnNpZGUgPT09ICJjbGllbnQiKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3QocmVxdWVzdERhdGFBcmcpOwogICAgICB9CiAgICAgIGlmICghdGhpcy5zbWFydFNlcnZlUmVmKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTZXJ2ZXIgbm90IGluaXRpYWxpemVkIik7CiAgICAgIH0KICAgICAgbGV0IHRhcmdldCA9IHRhcmdldENvbm5lY3Rpb247CiAgICAgIGlmICghdGFyZ2V0KSB7CiAgICAgICAgY29uc3QgYWxsQ29ubmVjdGlvbnMgPSB0aGlzLnNtYXJ0U2VydmVSZWYuZ2V0V2ViU29ja2V0Q29ubmVjdGlvbnMoKTsKICAgICAgICBpZiAoYWxsQ29ubmVjdGlvbnMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICBjb25zdCBwZWVyID0gYWxsQ29ubmVjdGlvbnNbMF07CiAgICAgICAgICB0YXJnZXQgPSB0aGlzLmdldE9yQ3JlYXRlV3JhcHBlcihwZWVyKTsKICAgICAgICB9IGVsc2UgaWYgKGFsbENvbm5lY3Rpb25zLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJObyBXZWJTb2NrZXQgY29ubmVjdGlvbnMgYXZhaWxhYmxlIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTXVsdGlwbGUgY29ubmVjdGlvbnMgYXZhaWxhYmxlIC0gc3BlY2lmeSB0YXJnZXRDb25uZWN0aW9uIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IGludGVyZXN0ID0gYXdhaXQgdGhpcy50eXBlZHJvdXRlci5maXJlRXZlbnRJbnRlcmVzdE1hcC5hZGRJbnRlcmVzdChyZXF1ZXN0RGF0YUFyZy5jb3JyZWxhdGlvbi5pZCwgcmVxdWVzdERhdGFBcmcpOwogICAgICB0YXJnZXQucGVlci5zZW5kKGRpc3RfdHNfZXhwb3J0czEyLnN0cmluZ2lmeShyZXF1ZXN0RGF0YUFyZykpOwogICAgICByZXR1cm4gYXdhaXQgaW50ZXJlc3QuaW50ZXJlc3RGdWxsZmlsbGVkOwogICAgfTsKICAgIHJldHVybiBuZXcgZGlzdF90c19leHBvcnRzMTUuVHlwZWRSZXF1ZXN0KG5ldyBkaXN0X3RzX2V4cG9ydHMxNS5UeXBlZFRhcmdldCh7IHBvc3RNZXRob2QgfSksIG1ldGhvZE5hbWUpOwogIH0KICAvKioKICAgKiBHZXRzIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gc3RhdHVzCiAgICovCiAgZ2V0U3RhdHVzKCkgewogICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblN0YXR1czsKICB9CiAgLyoqCiAgICogU3RvcHMgdGhlIFR5cGVkU29ja2V0IGNsaWVudCBvciBjbGVhbnMgdXAgc2VydmVyIHN0YXRlCiAgICovCiAgYXN5bmMgc3RvcCgpIHsKICAgIGlmICh0aGlzLnNpZGUgPT09ICJjbGllbnQiKSB7CiAgICAgIGlmICh0aGlzLmNsaWVudE9wdGlvbnMpIHsKICAgICAgICB0aGlzLmNsaWVudE9wdGlvbnMuYXV0b1JlY29ubmVjdCA9IGZhbHNlOwogICAgICB9CiAgICAgIGlmICh0aGlzLndlYnNvY2tldCkgewogICAgICAgIHRoaXMud2Vic29ja2V0LmNsb3NlKCk7CiAgICAgICAgdGhpcy53ZWJzb2NrZXQgPSBudWxsOwogICAgICB9CiAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzLmNsZWFyKCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnNtYXJ0U2VydmVDb25uZWN0aW9uV3JhcHBlcnMuY2xlYXIoKTsKICAgIH0KICB9CiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8vIENMSUVOVC1PTkxZIE1FVEhPRFMKICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLyoqCiAgICogU2V0cyBhIHRhZyBvbiB0aGlzIGNsaWVudCBjb25uZWN0aW9uLgogICAqIFRhZ3MgYXJlIHN0b3JlZCBvbiB0aGUgc2VydmVyIGFuZCBjYW4gYmUgdXNlZCBmb3IgZmlsdGVyaW5nLgogICAqIEBjbGllbnQtb25seQogICAqLwogIGFzeW5jIHNldFRhZyhuYW1lLCBwYXlsb2FkKSB7CiAgICBpZiAodGhpcy5zaWRlICE9PSAiY2xpZW50IikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoInNldFRhZyBpcyBvbmx5IGF2YWlsYWJsZSBvbiBjbGllbnRzIik7CiAgICB9CiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5jcmVhdGVUeXBlZFJlcXVlc3QoIl9fdHlwZWRzb2NrZXRfc2V0VGFnIik7CiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QuZmlyZSh7IG5hbWUsIHBheWxvYWQgfSk7CiAgICBpZiAoIXJlc3BvbnNlLnN1Y2Nlc3MpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gc2V0IHRhZyBvbiBzZXJ2ZXIiKTsKICAgIH0KICB9CiAgLyoqCiAgICogUmVtb3ZlcyBhIHRhZyBmcm9tIHRoaXMgY2xpZW50IGNvbm5lY3Rpb24uCiAgICogQGNsaWVudC1vbmx5CiAgICovCiAgYXN5bmMgcmVtb3ZlVGFnKG5hbWUpIHsKICAgIGlmICh0aGlzLnNpZGUgIT09ICJjbGllbnQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigicmVtb3ZlVGFnIGlzIG9ubHkgYXZhaWxhYmxlIG9uIGNsaWVudHMiKTsKICAgIH0KICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmNyZWF0ZVR5cGVkUmVxdWVzdCgiX190eXBlZHNvY2tldF9yZW1vdmVUYWciKTsKICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5maXJlKHsgbmFtZSB9KTsKICAgIGlmICghcmVzcG9uc2Uuc3VjY2VzcykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byByZW1vdmUgdGFnIG9uIHNlcnZlciIpOwogICAgfQogIH0KICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLy8gU0VSVkVSLU9OTFkgTUVUSE9EUwogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAvKioKICAgKiBHZXRzIG9yIGNyZWF0ZXMgYSBjb25uZWN0aW9uIHdyYXBwZXIgZm9yIGEgcGVlcgogICAqLwogIGdldE9yQ3JlYXRlV3JhcHBlcihwZWVyKSB7CiAgICBsZXQgd3JhcHBlciA9IHRoaXMuc21hcnRTZXJ2ZUNvbm5lY3Rpb25XcmFwcGVycy5nZXQocGVlci5pZCk7CiAgICBpZiAoIXdyYXBwZXIpIHsKICAgICAgd3JhcHBlciA9IHdyYXBTbWFydFNlcnZlUGVlcihwZWVyKTsKICAgICAgdGhpcy5zbWFydFNlcnZlQ29ubmVjdGlvbldyYXBwZXJzLnNldChwZWVyLmlkLCB3cmFwcGVyKTsKICAgIH0KICAgIHJldHVybiB3cmFwcGVyOwogIH0KICAvKioKICAgKiBGaW5kcyBhbGwgY29ubmVjdGlvbnMgbWF0Y2hpbmcgdGhlIGZpbHRlciBmdW5jdGlvbi4KICAgKiBAc2VydmVyLW9ubHkKICAgKi8KICBhc3luYyBmaW5kQWxsVGFyZ2V0Q29ubmVjdGlvbnMoYXN5bmNGaW5kRnVuY0FyZykgewogICAgaWYgKHRoaXMuc2lkZSAhPT0gInNlcnZlciIgfHwgIXRoaXMuc21hcnRTZXJ2ZVJlZikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoImZpbmRBbGxUYXJnZXRDb25uZWN0aW9ucyBpcyBvbmx5IGF2YWlsYWJsZSBvbiBzZXJ2ZXJzIik7CiAgICB9CiAgICBjb25zdCBtYXRjaGluZ0Nvbm5lY3Rpb25zID0gW107CiAgICBmb3IgKGNvbnN0IHBlZXIgb2YgdGhpcy5zbWFydFNlcnZlUmVmLmdldFdlYlNvY2tldENvbm5lY3Rpb25zKCkpIHsKICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuZ2V0T3JDcmVhdGVXcmFwcGVyKHBlZXIpOwogICAgICBpZiAoYXdhaXQgYXN5bmNGaW5kRnVuY0FyZyh3cmFwcGVyKSkgewogICAgICAgIG1hdGNoaW5nQ29ubmVjdGlvbnMucHVzaCh3cmFwcGVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG1hdGNoaW5nQ29ubmVjdGlvbnM7CiAgfQogIC8qKgogICAqIEZpbmRzIHRoZSBmaXJzdCBjb25uZWN0aW9uIG1hdGNoaW5nIHRoZSBmaWx0ZXIgZnVuY3Rpb24uCiAgICogQHNlcnZlci1vbmx5CiAgICovCiAgYXN5bmMgZmluZFRhcmdldENvbm5lY3Rpb24oYXN5bmNGaW5kRnVuY0FyZykgewogICAgY29uc3QgYWxsTWF0Y2hpbmcgPSBhd2FpdCB0aGlzLmZpbmRBbGxUYXJnZXRDb25uZWN0aW9ucyhhc3luY0ZpbmRGdW5jQXJnKTsKICAgIHJldHVybiBhbGxNYXRjaGluZ1swXTsKICB9CiAgLyoqCiAgICogRmluZHMgYWxsIGNvbm5lY3Rpb25zIHdpdGggdGhlIHNwZWNpZmllZCB0YWcuCiAgICogQHNlcnZlci1vbmx5CiAgICovCiAgYXN5bmMgZmluZEFsbFRhcmdldENvbm5lY3Rpb25zQnlUYWcoa2V5QXJnLCBwYXlsb2FkQXJnKSB7CiAgICBpZiAodGhpcy5zaWRlICE9PSAic2VydmVyIiB8fCAhdGhpcy5zbWFydFNlcnZlUmVmKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiZmluZEFsbFRhcmdldENvbm5lY3Rpb25zQnlUYWcgaXMgb25seSBhdmFpbGFibGUgb24gc2VydmVycyIpOwogICAgfQogICAgY29uc3QgcGVlcnMgPSB0aGlzLnNtYXJ0U2VydmVSZWYuZ2V0V2ViU29ja2V0Q29ubmVjdGlvbnNCeVRhZyhrZXlBcmcpOwogICAgY29uc3QgcmVzdWx0cyA9IFtdOwogICAgZm9yIChjb25zdCBwZWVyIG9mIHBlZXJzKSB7CiAgICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmdldE9yQ3JlYXRlV3JhcHBlcihwZWVyKTsKICAgICAgaWYgKHBheWxvYWRBcmcgIT09IHZvaWQgMCkgewogICAgICAgIGNvbnN0IHRhZyA9IGF3YWl0IHdyYXBwZXIuZ2V0VGFnQnlJZChrZXlBcmcpOwogICAgICAgIGlmIChkaXN0X3RzX2V4cG9ydHMxMi5zdHJpbmdpZnkodGFnPy5wYXlsb2FkKSAhPT0gZGlzdF90c19leHBvcnRzMTIuc3RyaW5naWZ5KHBheWxvYWRBcmcpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmVzdWx0cy5wdXNoKHdyYXBwZXIpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQogIC8qKgogICAqIEZpbmRzIHRoZSBmaXJzdCBjb25uZWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCB0YWcuCiAgICogQHNlcnZlci1vbmx5CiAgICovCiAgYXN5bmMgZmluZFRhcmdldENvbm5lY3Rpb25CeVRhZyhrZXlBcmcsIHBheWxvYWRBcmcpIHsKICAgIGNvbnN0IGFsbFJlc3VsdHMgPSBhd2FpdCB0aGlzLmZpbmRBbGxUYXJnZXRDb25uZWN0aW9uc0J5VGFnKGtleUFyZywgcGF5bG9hZEFyZyk7CiAgICByZXR1cm4gYWxsUmVzdWx0c1swXTsKICB9Cn07CgovLyB0c193ZWIvcGx1Z2lucy50cwppbml0X2Rpc3RfdHMyNigpOwppbml0X2Rpc3RfdHMxNSgpOwppbml0X2Rpc3RfdHMyKCk7CnZhciBodG1sNyA9IGIyOwp2YXIgY3NzMiA9IGk7CnZhciBjc3NNYW5hZ2VyMiA9IGNzc01hbmFnZXI7CnZhciBjdXN0b21FbGVtZW50ID0gdDQ7CnZhciBwcm9wZXJ0eSA9IG41Owp2YXIgc3RhdGUgPSByNTsKdmFyIERlZXNFbGVtZW50MiA9IERlZXNFbGVtZW50OwoKLy8gdHNfd2ViL3NlcnZpY2VzL2FwaS5zZXJ2aWNlLnRzCnZhciBBcGlTZXJ2aWNlID0gY2xhc3MgewogIGJhc2VVcmw7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLmJhc2VVcmwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgIi90eXBlZHJlcXVlc3QiOwogIH0KICAvKioKICAgKiBNYWtlIGEgdHlwZWQgcmVxdWVzdCB0byB0aGUgYmFja2VuZAogICAqLwogIGFzeW5jIHJlcXVlc3QobWV0aG9kLCByZXF1ZXN0RGF0YSkgewogICAgY29uc3QgdHlwZWRSZXF1ZXN0ID0gbmV3IGRpc3RfdHNfZXhwb3J0czE1LlR5cGVkUmVxdWVzdCh0aGlzLmJhc2VVcmwsIG1ldGhvZCk7CiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHR5cGVkUmVxdWVzdC5maXJlKHJlcXVlc3REYXRhKTsKICAgIHJldHVybiByZXNwb25zZTsKICB9CiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8vIFMzIEFQSSBNZXRob2RzCiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIGFzeW5jIGxpc3RCdWNrZXRzKCkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KCJsaXN0QnVja2V0cyIsIHt9KTsKICAgIHJldHVybiByZXN1bHQuYnVja2V0czsKICB9CiAgYXN5bmMgY3JlYXRlQnVja2V0KGJ1Y2tldE5hbWUpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdCgKICAgICAgImNyZWF0ZUJ1Y2tldCIsCiAgICAgIHsgYnVja2V0TmFtZSB9CiAgICApOwogICAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOwogIH0KICBhc3luYyBkZWxldGVCdWNrZXQoYnVja2V0TmFtZSkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KAogICAgICAiZGVsZXRlQnVja2V0IiwKICAgICAgeyBidWNrZXROYW1lIH0KICAgICk7CiAgICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3M7CiAgfQogIGFzeW5jIGxpc3RPYmplY3RzKGJ1Y2tldE5hbWUsIHByZWZpeDQsIGRlbGltaXRlcikgewogICAgcmV0dXJuIHRoaXMucmVxdWVzdCgibGlzdE9iamVjdHMiLCB7IGJ1Y2tldE5hbWUsIHByZWZpeDogcHJlZml4NCwgZGVsaW1pdGVyIH0pOwogIH0KICBhc3luYyBnZXRPYmplY3QoYnVja2V0TmFtZSwga2V5MikgewogICAgcmV0dXJuIHRoaXMucmVxdWVzdCgiZ2V0T2JqZWN0IiwgeyBidWNrZXROYW1lLCBrZXk6IGtleTIgfSk7CiAgfQogIGFzeW5jIGdldE9iamVjdE1ldGFkYXRhKGJ1Y2tldE5hbWUsIGtleTIpIHsKICAgIHJldHVybiB0aGlzLnJlcXVlc3QoImdldE9iamVjdE1ldGFkYXRhIiwgeyBidWNrZXROYW1lLCBrZXk6IGtleTIgfSk7CiAgfQogIGFzeW5jIHB1dE9iamVjdChidWNrZXROYW1lLCBrZXkyLCBjb250ZW50MywgY29udGVudFR5cGUpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdCgicHV0T2JqZWN0IiwgeyBidWNrZXROYW1lLCBrZXk6IGtleTIsIGNvbnRlbnQ6IGNvbnRlbnQzLCBjb250ZW50VHlwZSB9KTsKICAgIHJldHVybiByZXN1bHQuc3VjY2VzczsKICB9CiAgYXN5bmMgZGVsZXRlT2JqZWN0KGJ1Y2tldE5hbWUsIGtleTIpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdCgiZGVsZXRlT2JqZWN0IiwgeyBidWNrZXROYW1lLCBrZXk6IGtleTIgfSk7CiAgICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3M7CiAgfQogIGFzeW5jIGRlbGV0ZVByZWZpeChidWNrZXROYW1lLCBwcmVmaXg0KSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QoImRlbGV0ZVByZWZpeCIsIHsgYnVja2V0TmFtZSwgcHJlZml4OiBwcmVmaXg0IH0pOwogICAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOwogIH0KICBhc3luYyBnZXRPYmplY3RVcmwoYnVja2V0TmFtZSwga2V5MikgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KCJnZXRPYmplY3RVcmwiLCB7IGJ1Y2tldE5hbWUsIGtleToga2V5MiB9KTsKICAgIHJldHVybiByZXN1bHQudXJsOwogIH0KICBhc3luYyBjb3B5T2JqZWN0KHNvdXJjZUJ1Y2tldCwgc291cmNlS2V5LCBkZXN0QnVja2V0LCBkZXN0S2V5KSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QoImNvcHlPYmplY3QiLCB7IHNvdXJjZUJ1Y2tldCwgc291cmNlS2V5LCBkZXN0QnVja2V0LCBkZXN0S2V5IH0pOwogICAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOwogIH0KICBhc3luYyBtb3ZlT2JqZWN0KGJ1Y2tldE5hbWUsIHNvdXJjZUtleSwgZGVzdEtleSkgewogICAgcmV0dXJuIHRoaXMucmVxdWVzdCgibW92ZU9iamVjdCIsIHsgYnVja2V0TmFtZSwgc291cmNlS2V5LCBkZXN0S2V5IH0pOwogIH0KICBhc3luYyBtb3ZlUHJlZml4KGJ1Y2tldE5hbWUsIHNvdXJjZVByZWZpeCwgZGVzdFByZWZpeCkgewogICAgcmV0dXJuIHRoaXMucmVxdWVzdCgibW92ZVByZWZpeCIsIHsgYnVja2V0TmFtZSwgc291cmNlUHJlZml4LCBkZXN0UHJlZml4IH0pOwogIH0KICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLy8gTW9uZ29EQiBBUEkgTWV0aG9kcwogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBhc3luYyBsaXN0RGF0YWJhc2VzKCkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KAogICAgICAibGlzdERhdGFiYXNlcyIsCiAgICAgIHt9CiAgICApOwogICAgcmV0dXJuIHJlc3VsdC5kYXRhYmFzZXM7CiAgfQogIGFzeW5jIGNyZWF0ZURhdGFiYXNlKGRhdGFiYXNlTmFtZSkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KAogICAgICAiY3JlYXRlRGF0YWJhc2UiLAogICAgICB7IGRhdGFiYXNlTmFtZSB9CiAgICApOwogICAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOwogIH0KICBhc3luYyBkcm9wRGF0YWJhc2UoZGF0YWJhc2VOYW1lKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QoCiAgICAgICJkcm9wRGF0YWJhc2UiLAogICAgICB7IGRhdGFiYXNlTmFtZSB9CiAgICApOwogICAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOwogIH0KICBhc3luYyBsaXN0Q29sbGVjdGlvbnMoZGF0YWJhc2VOYW1lKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QoImxpc3RDb2xsZWN0aW9ucyIsIHsgZGF0YWJhc2VOYW1lIH0pOwogICAgcmV0dXJuIHJlc3VsdC5jb2xsZWN0aW9uczsKICB9CiAgYXN5bmMgY3JlYXRlQ29sbGVjdGlvbihkYXRhYmFzZU5hbWUsIGNvbGxlY3Rpb25OYW1lKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QoImNyZWF0ZUNvbGxlY3Rpb24iLCB7IGRhdGFiYXNlTmFtZSwgY29sbGVjdGlvbk5hbWUgfSk7CiAgICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3M7CiAgfQogIGFzeW5jIGRyb3BDb2xsZWN0aW9uKGRhdGFiYXNlTmFtZSwgY29sbGVjdGlvbk5hbWUpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdCgiZHJvcENvbGxlY3Rpb24iLCB7IGRhdGFiYXNlTmFtZSwgY29sbGVjdGlvbk5hbWUgfSk7CiAgICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3M7CiAgfQogIGFzeW5jIGZpbmREb2N1bWVudHMoZGF0YWJhc2VOYW1lLCBjb2xsZWN0aW9uTmFtZSwgb3B0aW9ucykgewogICAgcmV0dXJuIHRoaXMucmVxdWVzdCgiZmluZERvY3VtZW50cyIsIHsKICAgICAgZGF0YWJhc2VOYW1lLAogICAgICBjb2xsZWN0aW9uTmFtZSwKICAgICAgLi4ub3B0aW9ucwogICAgfSk7CiAgfQogIGFzeW5jIGdldERvY3VtZW50KGRhdGFiYXNlTmFtZSwgY29sbGVjdGlvbk5hbWUsIGRvY3VtZW50SWQpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdCgiZ2V0RG9jdW1lbnQiLCB7IGRhdGFiYXNlTmFtZSwgY29sbGVjdGlvbk5hbWUsIGRvY3VtZW50SWQgfSk7CiAgICByZXR1cm4gcmVzdWx0LmRvY3VtZW50OwogIH0KICBhc3luYyBpbnNlcnREb2N1bWVudChkYXRhYmFzZU5hbWUsIGNvbGxlY3Rpb25OYW1lLCBkb2N1bWVudDQpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdCgiaW5zZXJ0RG9jdW1lbnQiLCB7IGRhdGFiYXNlTmFtZSwgY29sbGVjdGlvbk5hbWUsIGRvY3VtZW50OiBkb2N1bWVudDQgfSk7CiAgICByZXR1cm4gcmVzdWx0Lmluc2VydGVkSWQ7CiAgfQogIGFzeW5jIHVwZGF0ZURvY3VtZW50KGRhdGFiYXNlTmFtZSwgY29sbGVjdGlvbk5hbWUsIGRvY3VtZW50SWQsIHVwZGF0ZSkgewogICAgcmV0dXJuIHRoaXMucmVxdWVzdCgidXBkYXRlRG9jdW1lbnQiLCB7CiAgICAgIGRhdGFiYXNlTmFtZSwKICAgICAgY29sbGVjdGlvbk5hbWUsCiAgICAgIGRvY3VtZW50SWQsCiAgICAgIHVwZGF0ZQogICAgfSk7CiAgfQogIGFzeW5jIGRlbGV0ZURvY3VtZW50KGRhdGFiYXNlTmFtZSwgY29sbGVjdGlvbk5hbWUsIGRvY3VtZW50SWQpIHsKICAgIHJldHVybiB0aGlzLnJlcXVlc3QoImRlbGV0ZURvY3VtZW50IiwgeyBkYXRhYmFzZU5hbWUsIGNvbGxlY3Rpb25OYW1lLCBkb2N1bWVudElkIH0pOwogIH0KICBhc3luYyBydW5BZ2dyZWdhdGlvbihkYXRhYmFzZU5hbWUsIGNvbGxlY3Rpb25OYW1lLCBwaXBlbGluZSkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KCJydW5BZ2dyZWdhdGlvbiIsIHsgZGF0YWJhc2VOYW1lLCBjb2xsZWN0aW9uTmFtZSwgcGlwZWxpbmUgfSk7CiAgICByZXR1cm4gcmVzdWx0LnJlc3VsdHM7CiAgfQogIGFzeW5jIGxpc3RJbmRleGVzKGRhdGFiYXNlTmFtZSwgY29sbGVjdGlvbk5hbWUpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdCgibGlzdEluZGV4ZXMiLCB7IGRhdGFiYXNlTmFtZSwgY29sbGVjdGlvbk5hbWUgfSk7CiAgICByZXR1cm4gcmVzdWx0LmluZGV4ZXM7CiAgfQogIGFzeW5jIGNyZWF0ZUluZGV4KGRhdGFiYXNlTmFtZSwgY29sbGVjdGlvbk5hbWUsIGtleXMyLCBvcHRpb25zKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QoImNyZWF0ZUluZGV4IiwgeyBkYXRhYmFzZU5hbWUsIGNvbGxlY3Rpb25OYW1lLCBrZXlzOiBrZXlzMiwgb3B0aW9ucyB9KTsKICAgIHJldHVybiByZXN1bHQuaW5kZXhOYW1lOwogIH0KICBhc3luYyBkcm9wSW5kZXgoZGF0YWJhc2VOYW1lLCBjb2xsZWN0aW9uTmFtZSwgaW5kZXhOYW1lKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QoImRyb3BJbmRleCIsIHsgZGF0YWJhc2VOYW1lLCBjb2xsZWN0aW9uTmFtZSwgaW5kZXhOYW1lIH0pOwogICAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOwogIH0KICBhc3luYyBnZXRDb2xsZWN0aW9uU3RhdHMoZGF0YWJhc2VOYW1lLCBjb2xsZWN0aW9uTmFtZSkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KCJnZXRDb2xsZWN0aW9uU3RhdHMiLCB7IGRhdGFiYXNlTmFtZSwgY29sbGVjdGlvbk5hbWUgfSk7CiAgICByZXR1cm4gcmVzdWx0LnN0YXRzOwogIH0KICBhc3luYyBnZXRTZXJ2ZXJTdGF0dXMoKSB7CiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCJnZXRTZXJ2ZXJTdGF0dXMiLCB7fSk7CiAgfQogIGFzeW5jIGdldERhdGFiYXNlU3RhdHMoZGF0YWJhc2VOYW1lKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QoImdldERhdGFiYXNlU3RhdHMiLCB7IGRhdGFiYXNlTmFtZSB9KTsKICAgIHJldHVybiByZXN1bHQuc3RhdHM7CiAgfQp9OwoKLy8gdHNfd2ViL3NlcnZpY2VzL2NoYW5nZXN0cmVhbS5zZXJ2aWNlLnRzCnZhciBDaGFuZ2VTdHJlYW1TZXJ2aWNlID0gY2xhc3MgX0NoYW5nZVN0cmVhbVNlcnZpY2UgewogIHR5cGVkU29ja2V0ID0gbnVsbDsKICBpc0Nvbm5lY3RlZCA9IGZhbHNlOwogIGlzQ29ubmVjdGluZyA9IGZhbHNlOwogIGNvbm5lY3RQcm9taXNlID0gbnVsbDsKICBzdWJzY3JpcHRpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAvLyBCdWZmZXIgYWN0aXZpdHkgZXZlbnRzIHNvIHRoZXkgc3Vydml2ZSB0YWIgc3dpdGNoZXMKICBhY3Rpdml0eUJ1ZmZlciA9IFtdOwogIHN0YXRpYyBBQ1RJVklUWV9CVUZGRVJfU0laRSA9IDUwMDsKICAvLyBSeEpTIFN1YmplY3RzIGZvciBVSSBjb21wb25lbnRzCiAgbW9uZ29DaGFuZ2VzJCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMyLnJ4anMuU3ViamVjdCgpOwogIHMzQ2hhbmdlcyQgPSBuZXcgZGlzdF90c19leHBvcnRzMi5yeGpzLlN1YmplY3QoKTsKICBhY3Rpdml0eUV2ZW50cyQgPSBuZXcgZGlzdF90c19leHBvcnRzMi5yeGpzLlN1YmplY3QoKTsKICBjb25uZWN0aW9uU3RhdHVzJCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMyLnJ4anMuUmVwbGF5U3ViamVjdCgxKTsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dCgiZGlzY29ubmVjdGVkIik7CiAgfQogIC8qKgogICAqIENvbm5lY3QgdG8gdGhlIFdlYlNvY2tldCBzZXJ2ZXIuCiAgICogSWYgYSBjb25uZWN0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdhaXRzIGZvciBpdCB0byBjb21wbGV0ZS4KICAgKi8KICBhc3luYyBjb25uZWN0KCkgewogICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMuaXNDb25uZWN0aW5nICYmIHRoaXMuY29ubmVjdFByb21pc2UpIHsKICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdFByb21pc2U7CiAgICB9CiAgICB0aGlzLmlzQ29ubmVjdGluZyA9IHRydWU7CiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoImNvbm5lY3RpbmciKTsKICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSAoYXN5bmMgKCkgPT4gewogICAgICB0cnkgewogICAgICAgIGNvbnN0IGNsaWVudFJvdXRlciA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxNS5UeXBlZFJvdXRlcigpOwogICAgICAgIHRoaXMucmVnaXN0ZXJQdXNoSGFuZGxlcnMoY2xpZW50Um91dGVyKTsKICAgICAgICB0aGlzLnR5cGVkU29ja2V0ID0gYXdhaXQgZGlzdF90c19leHBvcnRzMzAuVHlwZWRTb2NrZXQuY3JlYXRlQ2xpZW50KAogICAgICAgICAgY2xpZW50Um91dGVyLAogICAgICAgICAgZGlzdF90c19leHBvcnRzMzAuVHlwZWRTb2NrZXQudXNlV2luZG93TG9jYXRpb25PcmlnaW5VcmwoKQogICAgICAgICk7CiAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IHRydWU7CiAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTsKICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoImNvbm5lY3RlZCIpOwogICAgICAgIGNvbnNvbGUubG9nKCJbQ2hhbmdlU3RyZWFtXSBXZWJTb2NrZXQgY29ubmVjdGVkIik7CiAgICAgICAgdGhpcy50eXBlZFNvY2tldC5zdGF0dXNTdWJqZWN0LnN1YnNjcmliZSgoc3RhdHVzKSA9PiB7CiAgICAgICAgICBpZiAoc3RhdHVzID09PSAiZGlzY29ubmVjdGVkIikgewogICAgICAgICAgICB0aGlzLmhhbmRsZURpc2Nvbm5lY3QoKTsKICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSAiY29ubmVjdGVkIikgewogICAgICAgICAgICB0aGlzLmhhbmRsZVJlY29ubmVjdCgpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9IG51bGw7CiAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KCJkaXNjb25uZWN0ZWQiKTsKICAgICAgICBjb25zb2xlLmVycm9yKCJbQ2hhbmdlU3RyZWFtXSBGYWlsZWQgdG8gY29ubmVjdDoiLCBlcnJvcik7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgIH0KICAgIH0pKCk7CiAgICByZXR1cm4gdGhpcy5jb25uZWN0UHJvbWlzZTsKICB9CiAgLyoqCiAgICogRW5zdXJlIGEgV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuCiAgICogSWYgbm90IGNvbm5lY3RlZCwgdHJpZ2dlcnMgY29ubmVjdCgpIGFuZCByZXR1cm5zIHdoZXRoZXIgY29ubmVjdGlvbiBzdWNjZWVkZWQuCiAgICovCiAgYXN5bmMgZW5zdXJlQ29ubmVjdGVkKCkgewogICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQgJiYgdGhpcy50eXBlZFNvY2tldCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHRyeSB7CiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpOwogICAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZDsKICAgIH0gY2F0Y2ggewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIC8qKgogICAqIERpc2Nvbm5lY3QgZnJvbSB0aGUgV2ViU29ja2V0IHNlcnZlcgogICAqLwogIGFzeW5jIGRpc2Nvbm5lY3QoKSB7CiAgICBpZiAoIXRoaXMudHlwZWRTb2NrZXQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdHJ5IHsKICAgICAgYXdhaXQgdGhpcy50eXBlZFNvY2tldC5zdG9wKCk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLmVycm9yKCJbQ2hhbmdlU3RyZWFtXSBFcnJvciBkdXJpbmcgZGlzY29ubmVjdDoiLCBlcnJvcik7CiAgICB9CiAgICB0aGlzLnR5cGVkU29ja2V0ID0gbnVsbDsKICAgIHRoaXMuaXNDb25uZWN0ZWQgPSBmYWxzZTsKICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSBudWxsOwogICAgdGhpcy5zdWJzY3JpcHRpb25zLmNsZWFyKCk7CiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoImRpc2Nvbm5lY3RlZCIpOwogICAgY29uc29sZS5sb2coIltDaGFuZ2VTdHJlYW1dIFdlYlNvY2tldCBkaXNjb25uZWN0ZWQiKTsKICB9CiAgLyoqCiAgICogUmVnaXN0ZXIgaGFuZGxlcnMgZm9yIHNlcnZlciBwdXNoIGV2ZW50cwogICAqLwogIHJlZ2lzdGVyUHVzaEhhbmRsZXJzKHJvdXRlcikgewogICAgcm91dGVyLmFkZFR5cGVkSGFuZGxlcigKICAgICAgbmV3IGRpc3RfdHNfZXhwb3J0czE1LlR5cGVkSGFuZGxlcigKICAgICAgICAicHVzaE1vbmdvQ2hhbmdlIiwKICAgICAgICBhc3luYyAoZGF0YSkgPT4gewogICAgICAgICAgdGhpcy5tb25nb0NoYW5nZXMkLm5leHQoZGF0YS5ldmVudCk7CiAgICAgICAgICByZXR1cm4geyByZWNlaXZlZDogdHJ1ZSB9OwogICAgICAgIH0KICAgICAgKQogICAgKTsKICAgIHJvdXRlci5hZGRUeXBlZEhhbmRsZXIoCiAgICAgIG5ldyBkaXN0X3RzX2V4cG9ydHMxNS5UeXBlZEhhbmRsZXIoCiAgICAgICAgInB1c2hTM0NoYW5nZSIsCiAgICAgICAgYXN5bmMgKGRhdGEpID0+IHsKICAgICAgICAgIHRoaXMuczNDaGFuZ2VzJC5uZXh0KGRhdGEuZXZlbnQpOwogICAgICAgICAgcmV0dXJuIHsgcmVjZWl2ZWQ6IHRydWUgfTsKICAgICAgICB9CiAgICAgICkKICAgICk7CiAgICByb3V0ZXIuYWRkVHlwZWRIYW5kbGVyKAogICAgICBuZXcgZGlzdF90c19leHBvcnRzMTUuVHlwZWRIYW5kbGVyKAogICAgICAgICJwdXNoQWN0aXZpdHlFdmVudCIsCiAgICAgICAgYXN5bmMgKGRhdGEpID0+IHsKICAgICAgICAgIHRoaXMuYWN0aXZpdHlCdWZmZXIucHVzaChkYXRhLmV2ZW50KTsKICAgICAgICAgIGlmICh0aGlzLmFjdGl2aXR5QnVmZmVyLmxlbmd0aCA+IF9DaGFuZ2VTdHJlYW1TZXJ2aWNlLkFDVElWSVRZX0JVRkZFUl9TSVpFKSB7CiAgICAgICAgICAgIHRoaXMuYWN0aXZpdHlCdWZmZXIgPSB0aGlzLmFjdGl2aXR5QnVmZmVyLnNsaWNlKC1fQ2hhbmdlU3RyZWFtU2VydmljZS5BQ1RJVklUWV9CVUZGRVJfU0laRSk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmFjdGl2aXR5RXZlbnRzJC5uZXh0KGRhdGEuZXZlbnQpOwogICAgICAgICAgcmV0dXJuIHsgcmVjZWl2ZWQ6IHRydWUgfTsKICAgICAgICB9CiAgICAgICkKICAgICk7CiAgfQogIC8qKgogICAqIEhhbmRsZSBXZWJTb2NrZXQgZGlzY29ubmVjdGlvbgogICAqLwogIGhhbmRsZURpc2Nvbm5lY3QoKSB7CiAgICB0aGlzLmlzQ29ubmVjdGVkID0gZmFsc2U7CiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoImRpc2Nvbm5lY3RlZCIpOwogICAgY29uc29sZS5sb2coIltDaGFuZ2VTdHJlYW1dIFdlYlNvY2tldCBkaXNjb25uZWN0ZWQsIHdhaXRpbmcgZm9yIHJlY29ubmVjdC4uLiIpOwogIH0KICAvKioKICAgKiBIYW5kbGUgV2ViU29ja2V0IHJlY29ubmVjdGlvbiAtIHJlc3RvcmUgYWxsIHN1YnNjcmlwdGlvbnMKICAgKi8KICBhc3luYyBoYW5kbGVSZWNvbm5lY3QoKSB7CiAgICB0aGlzLmlzQ29ubmVjdGVkID0gdHJ1ZTsKICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dCgiY29ubmVjdGVkIik7CiAgICBjb25zb2xlLmxvZygiW0NoYW5nZVN0cmVhbV0gV2ViU29ja2V0IHJlY29ubmVjdGVkLCByZXN0b3Jpbmcgc3Vic2NyaXB0aW9ucy4uLiIpOwogICAgY29uc3Qgc3Vic2NyaXB0aW9uc1RvUmVzdG9yZSA9IEFycmF5LmZyb20odGhpcy5zdWJzY3JpcHRpb25zLnZhbHVlcygpKTsKICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5jbGVhcigpOwogICAgZm9yIChjb25zdCBzdWIyIG9mIHN1YnNjcmlwdGlvbnNUb1Jlc3RvcmUpIHsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoc3ViMi50eXBlID09PSAibW9uZ28iKSB7CiAgICAgICAgICBjb25zdCBbZGF0YWJhc2UsIGNvbGxlY3Rpb25dID0gc3ViMi5rZXkuc3BsaXQoIi8iKTsKICAgICAgICAgIGF3YWl0IHRoaXMuc3Vic2NyaWJlVG9Db2xsZWN0aW9uKGRhdGFiYXNlLCBjb2xsZWN0aW9uKTsKICAgICAgICB9IGVsc2UgaWYgKHN1YjIudHlwZSA9PT0gInMzIikgewogICAgICAgICAgY29uc3QgcGFydHMgPSBzdWIyLmtleS5zcGxpdCgiLyIpOwogICAgICAgICAgY29uc3QgYnVja2V0ID0gcGFydHNbMF07CiAgICAgICAgICBjb25zdCBwcmVmaXg0ID0gcGFydHMuc2xpY2UoMSkuam9pbigiLyIpIHx8IHZvaWQgMDsKICAgICAgICAgIGF3YWl0IHRoaXMuc3Vic2NyaWJlVG9CdWNrZXQoYnVja2V0LCBwcmVmaXg0KTsKICAgICAgICB9IGVsc2UgaWYgKHN1YjIudHlwZSA9PT0gImFjdGl2aXR5IikgewogICAgICAgICAgYXdhaXQgdGhpcy5zdWJzY3JpYmVUb0FjdGl2aXR5KCk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoYFtDaGFuZ2VTdHJlYW1dIEZhaWxlZCB0byByZXN0b3JlIHN1YnNjcmlwdGlvbiAke3N1YjIua2V5fTpgLCBlcnJvcik7CiAgICAgIH0KICAgIH0KICB9CiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8vIE1vbmdvREIgU3Vic2NyaXB0aW9ucwogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAvKioKICAgKiBTdWJzY3JpYmUgdG8gY2hhbmdlcyBpbiBhIE1vbmdvREIgY29sbGVjdGlvbgogICAqLwogIGFzeW5jIHN1YnNjcmliZVRvQ29sbGVjdGlvbihkYXRhYmFzZSwgY29sbGVjdGlvbikgewogICAgaWYgKCF0aGlzLnR5cGVkU29ja2V0IHx8ICF0aGlzLmlzQ29ubmVjdGVkKSB7CiAgICAgIGNvbnN0IGNvbm5lY3RlZCA9IGF3YWl0IHRoaXMuZW5zdXJlQ29ubmVjdGVkKCk7CiAgICAgIGlmICghY29ubmVjdGVkKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJbQ2hhbmdlU3RyZWFtXSBOb3QgY29ubmVjdGVkLCBjYW5ub3Qgc3Vic2NyaWJlIik7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICBjb25zdCBrZXkyID0gYCR7ZGF0YWJhc2V9LyR7Y29sbGVjdGlvbn1gOwogICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoYG1vbmdvOiR7a2V5Mn1gKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHRyeSB7CiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnR5cGVkU29ja2V0LmNyZWF0ZVR5cGVkUmVxdWVzdCgic3Vic2NyaWJlTW9uZ28iKTsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0LmZpcmUoeyBkYXRhYmFzZSwgY29sbGVjdGlvbiB9KTsKICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHsKICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuc2V0KGBtb25nbzoke2tleTJ9YCwgewogICAgICAgICAgdHlwZTogIm1vbmdvIiwKICAgICAgICAgIGtleToga2V5MiwKICAgICAgICAgIHN1YnNjcmlwdGlvbklkOiByZXNwb25zZS5zdWJzY3JpcHRpb25JZAogICAgICAgIH0pOwogICAgICAgIGNvbnNvbGUubG9nKGBbQ2hhbmdlU3RyZWFtXSBTdWJzY3JpYmVkIHRvIE1vbmdvREIgJHtrZXkyfWApOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYFtDaGFuZ2VTdHJlYW1dIEZhaWxlZCB0byBzdWJzY3JpYmUgdG8gTW9uZ29EQiAke2tleTJ9OmAsIGVycm9yKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICAvKioKICAgKiBVbnN1YnNjcmliZSBmcm9tIGNoYW5nZXMgaW4gYSBNb25nb0RCIGNvbGxlY3Rpb24KICAgKi8KICBhc3luYyB1bnN1YnNjcmliZUZyb21Db2xsZWN0aW9uKGRhdGFiYXNlLCBjb2xsZWN0aW9uKSB7CiAgICBpZiAoIXRoaXMudHlwZWRTb2NrZXQgfHwgIXRoaXMuaXNDb25uZWN0ZWQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY29uc3Qga2V5MiA9IGAke2RhdGFiYXNlfS8ke2NvbGxlY3Rpb259YDsKICAgIGNvbnN0IHN1YktleSA9IGBtb25nbzoke2tleTJ9YDsKICAgIGlmICghdGhpcy5zdWJzY3JpcHRpb25zLmhhcyhzdWJLZXkpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgdHJ5IHsKICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMudHlwZWRTb2NrZXQuY3JlYXRlVHlwZWRSZXF1ZXN0KCJ1bnN1YnNjcmliZU1vbmdvIik7CiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5maXJlKHsgZGF0YWJhc2UsIGNvbGxlY3Rpb24gfSk7CiAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7CiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmRlbGV0ZShzdWJLZXkpOwogICAgICAgIGNvbnNvbGUubG9nKGBbQ2hhbmdlU3RyZWFtXSBVbnN1YnNjcmliZWQgZnJvbSBNb25nb0RCICR7a2V5Mn1gKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzcG9uc2Uuc3VjY2VzczsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYFtDaGFuZ2VTdHJlYW1dIEZhaWxlZCB0byB1bnN1YnNjcmliZSBmcm9tIE1vbmdvREIgJHtrZXkyfTpgLCBlcnJvcik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgLyoqCiAgICogQ2hlY2sgaWYgc3Vic2NyaWJlZCB0byBhIE1vbmdvREIgY29sbGVjdGlvbgogICAqLwogIGlzU3Vic2NyaWJlZFRvQ29sbGVjdGlvbihkYXRhYmFzZSwgY29sbGVjdGlvbikgewogICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoYG1vbmdvOiR7ZGF0YWJhc2V9LyR7Y29sbGVjdGlvbn1gKTsKICB9CiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8vIFMzIFN1YnNjcmlwdGlvbnMKICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLyoqCiAgICogU3Vic2NyaWJlIHRvIGNoYW5nZXMgaW4gYW4gUzMgYnVja2V0L3ByZWZpeAogICAqLwogIGFzeW5jIHN1YnNjcmliZVRvQnVja2V0KGJ1Y2tldCwgcHJlZml4NCkgewogICAgaWYgKCF0aGlzLnR5cGVkU29ja2V0IHx8ICF0aGlzLmlzQ29ubmVjdGVkKSB7CiAgICAgIGNvbnN0IGNvbm5lY3RlZCA9IGF3YWl0IHRoaXMuZW5zdXJlQ29ubmVjdGVkKCk7CiAgICAgIGlmICghY29ubmVjdGVkKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJbQ2hhbmdlU3RyZWFtXSBOb3QgY29ubmVjdGVkLCBjYW5ub3Qgc3Vic2NyaWJlIik7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICBjb25zdCBrZXkyID0gcHJlZml4NCA/IGAke2J1Y2tldH0vJHtwcmVmaXg0fWAgOiBidWNrZXQ7CiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zLmhhcyhgczM6JHtrZXkyfWApKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgdHJ5IHsKICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMudHlwZWRTb2NrZXQuY3JlYXRlVHlwZWRSZXF1ZXN0KCJzdWJzY3JpYmVTMyIpOwogICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QuZmlyZSh7IGJ1Y2tldCwgcHJlZml4OiBwcmVmaXg0IH0pOwogICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcykgewogICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5zZXQoYHMzOiR7a2V5Mn1gLCB7CiAgICAgICAgICB0eXBlOiAiczMiLAogICAgICAgICAga2V5OiBrZXkyLAogICAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHJlc3BvbnNlLnN1YnNjcmlwdGlvbklkCiAgICAgICAgfSk7CiAgICAgICAgY29uc29sZS5sb2coYFtDaGFuZ2VTdHJlYW1dIFN1YnNjcmliZWQgdG8gUzMgJHtrZXkyfWApOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYFtDaGFuZ2VTdHJlYW1dIEZhaWxlZCB0byBzdWJzY3JpYmUgdG8gUzMgJHtrZXkyfTpgLCBlcnJvcik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgLyoqCiAgICogVW5zdWJzY3JpYmUgZnJvbSBjaGFuZ2VzIGluIGFuIFMzIGJ1Y2tldC9wcmVmaXgKICAgKi8KICBhc3luYyB1bnN1YnNjcmliZUZyb21CdWNrZXQoYnVja2V0LCBwcmVmaXg0KSB7CiAgICBpZiAoIXRoaXMudHlwZWRTb2NrZXQgfHwgIXRoaXMuaXNDb25uZWN0ZWQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY29uc3Qga2V5MiA9IHByZWZpeDQgPyBgJHtidWNrZXR9LyR7cHJlZml4NH1gIDogYnVja2V0OwogICAgY29uc3Qgc3ViS2V5ID0gYHMzOiR7a2V5Mn1gOwogICAgaWYgKCF0aGlzLnN1YnNjcmlwdGlvbnMuaGFzKHN1YktleSkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB0cnkgewogICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy50eXBlZFNvY2tldC5jcmVhdGVUeXBlZFJlcXVlc3QoInVuc3Vic2NyaWJlUzMiKTsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0LmZpcmUoeyBidWNrZXQsIHByZWZpeDogcHJlZml4NCB9KTsKICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHsKICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZGVsZXRlKHN1YktleSk7CiAgICAgICAgY29uc29sZS5sb2coYFtDaGFuZ2VTdHJlYW1dIFVuc3Vic2NyaWJlZCBmcm9tIFMzICR7a2V5Mn1gKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzcG9uc2Uuc3VjY2VzczsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYFtDaGFuZ2VTdHJlYW1dIEZhaWxlZCB0byB1bnN1YnNjcmliZSBmcm9tIFMzICR7a2V5Mn06YCwgZXJyb3IpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIC8qKgogICAqIENoZWNrIGlmIHN1YnNjcmliZWQgdG8gYW4gUzMgYnVja2V0L3ByZWZpeAogICAqLwogIGlzU3Vic2NyaWJlZFRvQnVja2V0KGJ1Y2tldCwgcHJlZml4NCkgewogICAgY29uc3Qga2V5MiA9IHByZWZpeDQgPyBgJHtidWNrZXR9LyR7cHJlZml4NH1gIDogYnVja2V0OwogICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoYHMzOiR7a2V5Mn1gKTsKICB9CiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8vIEFjdGl2aXR5IFN0cmVhbSBTdWJzY3JpcHRpb25zCiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8qKgogICAqIFN1YnNjcmliZSB0byB0aGUgYWN0aXZpdHkgc3RyZWFtCiAgICovCiAgYXN5bmMgc3Vic2NyaWJlVG9BY3Rpdml0eSgpIHsKICAgIGlmICghdGhpcy50eXBlZFNvY2tldCB8fCAhdGhpcy5pc0Nvbm5lY3RlZCkgewogICAgICBjb25zdCBjb25uZWN0ZWQgPSBhd2FpdCB0aGlzLmVuc3VyZUNvbm5lY3RlZCgpOwogICAgICBpZiAoIWNvbm5lY3RlZCkgewogICAgICAgIGNvbnNvbGUud2FybigiW0NoYW5nZVN0cmVhbV0gTm90IGNvbm5lY3RlZCwgY2Fubm90IHN1YnNjcmliZSIpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoImFjdGl2aXR5OmFjdGl2aXR5IikpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB0cnkgewogICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy50eXBlZFNvY2tldC5jcmVhdGVUeXBlZFJlcXVlc3QoInN1YnNjcmliZUFjdGl2aXR5Iik7CiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5maXJlKHt9KTsKICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHsKICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuc2V0KCJhY3Rpdml0eTphY3Rpdml0eSIsIHsKICAgICAgICAgIHR5cGU6ICJhY3Rpdml0eSIsCiAgICAgICAgICBrZXk6ICJhY3Rpdml0eSIsCiAgICAgICAgICBzdWJzY3JpcHRpb25JZDogcmVzcG9uc2Uuc3Vic2NyaXB0aW9uSWQKICAgICAgICB9KTsKICAgICAgICBjb25zb2xlLmxvZygiW0NoYW5nZVN0cmVhbV0gU3Vic2NyaWJlZCB0byBhY3Rpdml0eSBzdHJlYW0iKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLmVycm9yKCJbQ2hhbmdlU3RyZWFtXSBGYWlsZWQgdG8gc3Vic2NyaWJlIHRvIGFjdGl2aXR5IHN0cmVhbToiLCBlcnJvcik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgLyoqCiAgICogVW5zdWJzY3JpYmUgZnJvbSB0aGUgYWN0aXZpdHkgc3RyZWFtCiAgICovCiAgYXN5bmMgdW5zdWJzY3JpYmVGcm9tQWN0aXZpdHkoKSB7CiAgICBpZiAoIXRoaXMudHlwZWRTb2NrZXQgfHwgIXRoaXMuaXNDb25uZWN0ZWQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKCF0aGlzLnN1YnNjcmlwdGlvbnMuaGFzKCJhY3Rpdml0eTphY3Rpdml0eSIpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgdHJ5IHsKICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMudHlwZWRTb2NrZXQuY3JlYXRlVHlwZWRSZXF1ZXN0KCJ1bnN1YnNjcmliZUFjdGl2aXR5Iik7CiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5maXJlKHt9KTsKICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHsKICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZGVsZXRlKCJhY3Rpdml0eTphY3Rpdml0eSIpOwogICAgICAgIGNvbnNvbGUubG9nKCJbQ2hhbmdlU3RyZWFtXSBVbnN1YnNjcmliZWQgZnJvbSBhY3Rpdml0eSBzdHJlYW0iKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzcG9uc2Uuc3VjY2VzczsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIltDaGFuZ2VTdHJlYW1dIEZhaWxlZCB0byB1bnN1YnNjcmliZSBmcm9tIGFjdGl2aXR5IHN0cmVhbToiLCBlcnJvcik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgLyoqCiAgICogR2V0IHJlY2VudCBhY3Rpdml0eSBldmVudHMKICAgKi8KICBhc3luYyBnZXRSZWNlbnRBY3Rpdml0eShsaW1pdCA9IDEwMCkgewogICAgaWYgKCF0aGlzLnR5cGVkU29ja2V0IHx8ICF0aGlzLmlzQ29ubmVjdGVkKSB7CiAgICAgIGNvbnN0IGNvbm5lY3RlZCA9IGF3YWl0IHRoaXMuZW5zdXJlQ29ubmVjdGVkKCk7CiAgICAgIGlmICghY29ubmVjdGVkKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CiAgICB9CiAgICB0cnkgewogICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy50eXBlZFNvY2tldC5jcmVhdGVUeXBlZFJlcXVlc3QoImdldFJlY2VudEFjdGl2aXR5Iik7CiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5maXJlKHsgbGltaXQgfSk7CiAgICAgIHJldHVybiByZXNwb25zZS5ldmVudHMgfHwgW107CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLmVycm9yKCJbQ2hhbmdlU3RyZWFtXSBGYWlsZWQgdG8gZ2V0IHJlY2VudCBhY3Rpdml0eToiLCBlcnJvcik7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICB9CiAgLyoqCiAgICogQ2hlY2sgaWYgc3Vic2NyaWJlZCB0byBhY3Rpdml0eSBzdHJlYW0KICAgKi8KICBpc1N1YnNjcmliZWRUb0FjdGl2aXR5KCkgewogICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoImFjdGl2aXR5OmFjdGl2aXR5Iik7CiAgfQogIC8qKgogICAqIEdldCBidWZmZXJlZCBhY3Rpdml0eSBldmVudHMgKGNhcHR1cmVkIHJlZ2FyZGxlc3Mgb2YgVUkgc3Vic2NyaWJlcikKICAgKi8KICBnZXRCdWZmZXJlZEFjdGl2aXR5KCkgewogICAgcmV0dXJuIFsuLi50aGlzLmFjdGl2aXR5QnVmZmVyXTsKICB9CiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8vIE9ic2VydmFibGVzIGZvciBVSSBDb21wb25lbnRzCiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8qKgogICAqIEdldCBNb25nb0RCIGNoYW5nZXMgYXMgYW4gT2JzZXJ2YWJsZQogICAqLwogIGdldE1vbmdvQ2hhbmdlcygpIHsKICAgIHJldHVybiB0aGlzLm1vbmdvQ2hhbmdlcyQuYXNPYnNlcnZhYmxlKCk7CiAgfQogIC8qKgogICAqIEdldCBTMyBjaGFuZ2VzIGFzIGFuIE9ic2VydmFibGUKICAgKi8KICBnZXRTM0NoYW5nZXMoKSB7CiAgICByZXR1cm4gdGhpcy5zM0NoYW5nZXMkLmFzT2JzZXJ2YWJsZSgpOwogIH0KICAvKioKICAgKiBHZXQgYWN0aXZpdHkgZXZlbnRzIGFzIGFuIE9ic2VydmFibGUKICAgKi8KICBnZXRBY3Rpdml0eVN0cmVhbSgpIHsKICAgIHJldHVybiB0aGlzLmFjdGl2aXR5RXZlbnRzJC5hc09ic2VydmFibGUoKTsKICB9CiAgLyoqCiAgICogR2V0IGZpbHRlcmVkIE1vbmdvREIgY2hhbmdlcyBmb3IgYSBzcGVjaWZpYyBjb2xsZWN0aW9uCiAgICovCiAgZ2V0Q29sbGVjdGlvbkNoYW5nZXMoZGF0YWJhc2UsIGNvbGxlY3Rpb24pIHsKICAgIHJldHVybiB0aGlzLm1vbmdvQ2hhbmdlcyQucGlwZSgKICAgICAgZGlzdF90c19leHBvcnRzMi5yeGpzLm9wcy5maWx0ZXIoCiAgICAgICAgKGV2ZW50KSA9PiBldmVudC5kYXRhYmFzZSA9PT0gZGF0YWJhc2UgJiYgZXZlbnQuY29sbGVjdGlvbiA9PT0gY29sbGVjdGlvbgogICAgICApCiAgICApOwogIH0KICAvKioKICAgKiBHZXQgZmlsdGVyZWQgUzMgY2hhbmdlcyBmb3IgYSBzcGVjaWZpYyBidWNrZXQvcHJlZml4CiAgICovCiAgZ2V0QnVja2V0Q2hhbmdlcyhidWNrZXQsIHByZWZpeDQpIHsKICAgIHJldHVybiB0aGlzLnMzQ2hhbmdlcyQucGlwZSgKICAgICAgZGlzdF90c19leHBvcnRzMi5yeGpzLm9wcy5maWx0ZXIoKGV2ZW50KSA9PiB7CiAgICAgICAgaWYgKGV2ZW50LmJ1Y2tldCAhPT0gYnVja2V0KSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKHByZWZpeDQgJiYgIWV2ZW50LmtleS5zdGFydHNXaXRoKHByZWZpeDQpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0pCiAgICApOwogIH0KfTsKCi8vIHRzX3dlYi9zZXJ2aWNlcy9pbmRleC50cwp2YXIgYXBpU2VydmljZSA9IG5ldyBBcGlTZXJ2aWNlKCk7CnZhciBjaGFuZ2VTdHJlYW1TZXJ2aWNlID0gbmV3IENoYW5nZVN0cmVhbVNlcnZpY2UoKTsKCi8vIHRzX3dlYi9zdHlsZXMvdGhlbWUudHMKaW5pdF9kaXN0X3RzMjYoKTsKdmFyIHRoZW1lU3R5bGVzID0gaWAKICA6aG9zdCB7CiAgICAvKiBCYWNrZ3JvdW5kIGNvbG9ycyAqLwogICAgLS10c3ZpZXctYmctcHJpbWFyeTogIzFhMWExYTsKICAgIC0tdHN2aWV3LWJnLXNlY29uZGFyeTogIzFlMWUxZTsKICAgIC0tdHN2aWV3LWJnLXRlcnRpYXJ5OiAjMTQxNDE0OwogICAgLS10c3ZpZXctYmctb3ZlcmxheTogcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgLS10c3ZpZXctYmctb3ZlcmxheS1kYXJrOiByZ2JhKDAsIDAsIDAsIDAuMyk7CiAgICAtLXRzdmlldy1iZy1kaWFsb2ctb3ZlcmxheTogcmdiYSgwLCAwLCAwLCAwLjcpOwoKICAgIC8qIEJvcmRlciBjb2xvcnMgKi8KICAgIC0tdHN2aWV3LWJvcmRlci1wcmltYXJ5OiAjMzMzOwogICAgLS10c3ZpZXctYm9yZGVyLXNlY29uZGFyeTogIzQ0NDsKICAgIC0tdHN2aWV3LWJvcmRlci10ZXJ0aWFyeTogIzJhMmEzZTsKCiAgICAvKiBUZXh0IGNvbG9ycyAqLwogICAgLS10c3ZpZXctdGV4dC1wcmltYXJ5OiAjZmZmOwogICAgLS10c3ZpZXctdGV4dC1zZWNvbmRhcnk6ICNlMGUwZTA7CiAgICAtLXRzdmlldy10ZXh0LXRlcnRpYXJ5OiAjY2NjOwogICAgLS10c3ZpZXctdGV4dC1tdXRlZDogIzg4ODsKICAgIC0tdHN2aWV3LXRleHQtZGltOiAjNjY2OwoKICAgIC8qIEludGVyYWN0aXZlIHN0YXRlcyAqLwogICAgLS10c3ZpZXctaG92ZXItYmc6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSk7CiAgICAtLXRzdmlldy1ob3Zlci1iZy1zdHJvbmc6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgIC0tdHN2aWV3LXNlbGVjdGVkLWJnOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgLS10c3ZpZXctYWN0aXZlLWJnOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CgogICAgLyogQWNjZW50IGNvbG9ycyAqLwogICAgLS10c3ZpZXctYWNjZW50LWZvbGRlcjogI2ZiYmYyNDsKCiAgICAvKiBEYW5nZXIvZGVzdHJ1Y3RpdmUgYWN0aW9ucyAqLwogICAgLS10c3ZpZXctZGFuZ2VyOiAjZWY0NDQ0OwogICAgLS10c3ZpZXctZGFuZ2VyLXRleHQ6ICNmODcxNzE7CiAgICAtLXRzdmlldy1kYW5nZXItYmc6IHJnYmEoMjM5LCA2OCwgNjgsIDAuMik7CiAgICAtLXRzdmlldy1kYW5nZXItYmctaG92ZXI6IHJnYmEoMjM5LCA2OCwgNjgsIDAuMyk7CgogICAgLyogU3VjY2VzcyBzdGF0ZXMgKi8KICAgIC0tdHN2aWV3LXN1Y2Nlc3M6ICMyMmM1NWU7CiAgICAtLXRzdmlldy1zdWNjZXNzLWJnOiByZ2JhKDM0LCAxOTcsIDk0LCAwLjIpOwoKICAgIC8qIEJvcmRlciByYWRpdXMgKi8KICAgIC0tdHN2aWV3LXJhZGl1cy1zbTogNHB4OwogICAgLS10c3ZpZXctcmFkaXVzLW1kOiA2cHg7CiAgICAtLXRzdmlldy1yYWRpdXMtbGc6IDhweDsKICAgIC0tdHN2aWV3LXJhZGl1cy14bDogMTJweDsKCiAgICAvKiBTcGFjaW5nICovCiAgICAtLXRzdmlldy1zcGFjaW5nLXhzOiA0cHg7CiAgICAtLXRzdmlldy1zcGFjaW5nLXNtOiA4cHg7CiAgICAtLXRzdmlldy1zcGFjaW5nLW1kOiAxMnB4OwogICAgLS10c3ZpZXctc3BhY2luZy1sZzogMTZweDsKICAgIC0tdHN2aWV3LXNwYWNpbmcteGw6IDI0cHg7CiAgfQpgOwoKLy8gdHNfd2ViL2FkYXB0ZXJzL3MzLWRhdGEtcHJvdmlkZXIudHMKdmFyIFRzdmlld1MzRGF0YVByb3ZpZGVyID0gY2xhc3MgewogIGFzeW5jIGxpc3RPYmplY3RzKGJ1Y2tldCwgcHJlZml4NCwgZGVsaW1pdGVyKSB7CiAgICByZXR1cm4gYXBpU2VydmljZS5saXN0T2JqZWN0cyhidWNrZXQsIHByZWZpeDQsIGRlbGltaXRlcik7CiAgfQogIGFzeW5jIGdldE9iamVjdChidWNrZXQsIGtleTIpIHsKICAgIHJldHVybiBhcGlTZXJ2aWNlLmdldE9iamVjdChidWNrZXQsIGtleTIpOwogIH0KICBhc3luYyBwdXRPYmplY3QoYnVja2V0LCBrZXkyLCBiYXNlNjRDb250ZW50LCBjb250ZW50VHlwZSkgewogICAgcmV0dXJuIGFwaVNlcnZpY2UucHV0T2JqZWN0KGJ1Y2tldCwga2V5MiwgYmFzZTY0Q29udGVudCwgY29udGVudFR5cGUpOwogIH0KICBhc3luYyBkZWxldGVPYmplY3QoYnVja2V0LCBrZXkyKSB7CiAgICByZXR1cm4gYXBpU2VydmljZS5kZWxldGVPYmplY3QoYnVja2V0LCBrZXkyKTsKICB9CiAgYXN5bmMgZGVsZXRlUHJlZml4KGJ1Y2tldCwgcHJlZml4NCkgewogICAgcmV0dXJuIGFwaVNlcnZpY2UuZGVsZXRlUHJlZml4KGJ1Y2tldCwgcHJlZml4NCk7CiAgfQogIGFzeW5jIGdldE9iamVjdFVybChidWNrZXQsIGtleTIpIHsKICAgIHJldHVybiBhcGlTZXJ2aWNlLmdldE9iamVjdFVybChidWNrZXQsIGtleTIpOwogIH0KICBhc3luYyBtb3ZlT2JqZWN0KGJ1Y2tldCwgc291cmNlS2V5LCBkZXN0S2V5KSB7CiAgICByZXR1cm4gYXBpU2VydmljZS5tb3ZlT2JqZWN0KGJ1Y2tldCwgc291cmNlS2V5LCBkZXN0S2V5KTsKICB9CiAgYXN5bmMgbW92ZVByZWZpeChidWNrZXQsIHNvdXJjZVByZWZpeCwgZGVzdFByZWZpeCkgewogICAgcmV0dXJuIGFwaVNlcnZpY2UubW92ZVByZWZpeChidWNrZXQsIHNvdXJjZVByZWZpeCwgZGVzdFByZWZpeCk7CiAgfQp9Owp2YXIgczNEYXRhUHJvdmlkZXIgPSBuZXcgVHN2aWV3UzNEYXRhUHJvdmlkZXIoKTsKCi8vIHRzX3dlYi9lbGVtZW50cy90c3ZpZXctYXBwLnRzCnZhciBfaXNSZXNpemluZ1NpZGViYXJfZGVjLCBfc2lkZWJhcldpZHRoX2RlYywgX3MzQ3JlYXRlRGlhbG9nTmFtZV9kZWMsIF9zM0NyZWF0ZURpYWxvZ0J1Y2tldF9kZWMsIF9zM0NyZWF0ZURpYWxvZ1R5cGVfZGVjLCBfc2hvd1MzQ3JlYXRlRGlhbG9nX2RlYywgX3Nob3dTeXN0ZW1EYXRhYmFzZXNfZGVjLCBfbmV3RGF0YWJhc2VOYW1lX2RlYywgX3Nob3dDcmVhdGVEYXRhYmFzZURpYWxvZ19kZWMsIF9uZXdDb2xsZWN0aW9uTmFtZV9kZWMsIF9zaG93Q3JlYXRlQ29sbGVjdGlvbkRpYWxvZ19kZWMsIF9uZXdCdWNrZXROYW1lX2RlYywgX3Nob3dDcmVhdGVCdWNrZXREaWFsb2dfZGVjLCBfZGF0YWJhc2VzX2RlYywgX2J1Y2tldHNfZGVjLCBfc2VsZWN0ZWRDb2xsZWN0aW9uX2RlYywgX3NlbGVjdGVkRGF0YWJhc2VfZGVjLCBfc2VsZWN0ZWRCdWNrZXRfZGVjLCBfdmlld01vZGVfZGVjLCBfYTQsIF9Uc3ZpZXdBcHBfZGVjb3JhdG9ycywgX2luaXQsIF92aWV3TW9kZSwgX3NlbGVjdGVkQnVja2V0LCBfc2VsZWN0ZWREYXRhYmFzZSwgX3NlbGVjdGVkQ29sbGVjdGlvbiwgX2J1Y2tldHMsIF9kYXRhYmFzZXMsIF9zaG93Q3JlYXRlQnVja2V0RGlhbG9nLCBfbmV3QnVja2V0TmFtZSwgX3Nob3dDcmVhdGVDb2xsZWN0aW9uRGlhbG9nLCBfbmV3Q29sbGVjdGlvbk5hbWUsIF9zaG93Q3JlYXRlRGF0YWJhc2VEaWFsb2csIF9uZXdEYXRhYmFzZU5hbWUsIF9zaG93U3lzdGVtRGF0YWJhc2VzLCBfc2hvd1MzQ3JlYXRlRGlhbG9nLCBfczNDcmVhdGVEaWFsb2dUeXBlLCBfczNDcmVhdGVEaWFsb2dCdWNrZXQsIF9zM0NyZWF0ZURpYWxvZ05hbWUsIF9zaWRlYmFyV2lkdGgsIF9pc1Jlc2l6aW5nU2lkZWJhcjsKdmFyIHsgaHRtbDogaHRtbDgsIGNzczogY3NzMywgY3NzTWFuYWdlcjogY3NzTWFuYWdlcjMsIGN1c3RvbUVsZW1lbnQ6IGN1c3RvbUVsZW1lbnQyLCBzdGF0ZTogc3RhdGUyLCBEZWVzRWxlbWVudDogRGVlc0VsZW1lbnQzIH0gPSBwbHVnaW5zX2V4cG9ydHM1Owp2YXIgeyBEZWVzQ29udGV4dG1lbnU6IERlZXNDb250ZXh0bWVudTIgfSA9IGRpc3RfdHNfd2ViX2V4cG9ydHMyOwpfVHN2aWV3QXBwX2RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudDIoInRzdmlldy1hcHAiKV07CnZhciBUc3ZpZXdBcHAgPSBjbGFzcyBleHRlbmRzIChfYTQgPSBEZWVzRWxlbWVudDMsIF92aWV3TW9kZV9kZWMgPSBbc3RhdGUyKCldLCBfc2VsZWN0ZWRCdWNrZXRfZGVjID0gW3N0YXRlMigpXSwgX3NlbGVjdGVkRGF0YWJhc2VfZGVjID0gW3N0YXRlMigpXSwgX3NlbGVjdGVkQ29sbGVjdGlvbl9kZWMgPSBbc3RhdGUyKCldLCBfYnVja2V0c19kZWMgPSBbc3RhdGUyKCldLCBfZGF0YWJhc2VzX2RlYyA9IFtzdGF0ZTIoKV0sIF9zaG93Q3JlYXRlQnVja2V0RGlhbG9nX2RlYyA9IFtzdGF0ZTIoKV0sIF9uZXdCdWNrZXROYW1lX2RlYyA9IFtzdGF0ZTIoKV0sIF9zaG93Q3JlYXRlQ29sbGVjdGlvbkRpYWxvZ19kZWMgPSBbc3RhdGUyKCldLCBfbmV3Q29sbGVjdGlvbk5hbWVfZGVjID0gW3N0YXRlMigpXSwgX3Nob3dDcmVhdGVEYXRhYmFzZURpYWxvZ19kZWMgPSBbc3RhdGUyKCldLCBfbmV3RGF0YWJhc2VOYW1lX2RlYyA9IFtzdGF0ZTIoKV0sIF9zaG93U3lzdGVtRGF0YWJhc2VzX2RlYyA9IFtzdGF0ZTIoKV0sIF9zaG93UzNDcmVhdGVEaWFsb2dfZGVjID0gW3N0YXRlMigpXSwgX3MzQ3JlYXRlRGlhbG9nVHlwZV9kZWMgPSBbc3RhdGUyKCldLCBfczNDcmVhdGVEaWFsb2dCdWNrZXRfZGVjID0gW3N0YXRlMigpXSwgX3MzQ3JlYXRlRGlhbG9nTmFtZV9kZWMgPSBbc3RhdGUyKCldLCBfc2lkZWJhcldpZHRoX2RlYyA9IFtzdGF0ZTIoKV0sIF9pc1Jlc2l6aW5nU2lkZWJhcl9kZWMgPSBbc3RhdGUyKCldLCBfYTQpIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3ZpZXdNb2RlLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgOCwgdGhpcywgInMzIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMTEsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9zZWxlY3RlZEJ1Y2tldCwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDEyLCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMTUsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9zZWxlY3RlZERhdGFiYXNlLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMTYsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAxOSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3NlbGVjdGVkQ29sbGVjdGlvbiwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDIwLCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMjMsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9idWNrZXRzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMjQsIHRoaXMsIFtdKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAyNywgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2RhdGFiYXNlcywgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDI4LCB0aGlzLCBbXSkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMzEsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9zaG93Q3JlYXRlQnVja2V0RGlhbG9nLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMzIsIHRoaXMsIGZhbHNlKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAzNSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX25ld0J1Y2tldE5hbWUsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAzNiwgdGhpcywgIiIpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDM5LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfc2hvd0NyZWF0ZUNvbGxlY3Rpb25EaWFsb2csIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA0MCwgdGhpcywgZmFsc2UpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDQzLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfbmV3Q29sbGVjdGlvbk5hbWUsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA0NCwgdGhpcywgIiIpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDQ3LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfc2hvd0NyZWF0ZURhdGFiYXNlRGlhbG9nLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNDgsIHRoaXMsIGZhbHNlKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA1MSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX25ld0RhdGFiYXNlTmFtZSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDUyLCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNTUsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9zaG93U3lzdGVtRGF0YWJhc2VzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNTYsIHRoaXMsIGZhbHNlKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA1OSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3Nob3dTM0NyZWF0ZURpYWxvZywgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDYwLCB0aGlzLCBmYWxzZSkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNjMsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9zM0NyZWF0ZURpYWxvZ1R5cGUsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA2NCwgdGhpcywgImZvbGRlciIpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDY3LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfczNDcmVhdGVEaWFsb2dCdWNrZXQsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA2OCwgdGhpcywgIiIpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDcxLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfczNDcmVhdGVEaWFsb2dOYW1lLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNzIsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA3NSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3NpZGViYXJXaWR0aCwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDc2LCB0aGlzLCAyNDApKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDc5LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfaXNSZXNpemluZ1NpZGViYXIsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA4MCwgdGhpcywgZmFsc2UpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDgzLCB0aGlzKTsKICAgIF9fcHVibGljRmllbGQodGhpcywgIlNZU1RFTV9EQVRBQkFTRVMiLCBbImFkbWluIiwgImNvbmZpZyIsICJsb2NhbCJdKTsKICAgIF9fcHVibGljRmllbGQodGhpcywgInN0YXJ0U2lkZWJhclJlc2l6ZSIsIChlMTEpID0+IHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHRoaXMuaXNSZXNpemluZ1NpZGViYXIgPSB0cnVlOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCB0aGlzLmhhbmRsZVNpZGViYXJSZXNpemUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5lbmRTaWRlYmFyUmVzaXplKTsKICAgIH0pOwogICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiaGFuZGxlU2lkZWJhclJlc2l6ZSIsIChlMTEpID0+IHsKICAgICAgaWYgKCF0aGlzLmlzUmVzaXppbmdTaWRlYmFyKSByZXR1cm47CiAgICAgIGNvbnN0IG5ld1dpZHRoID0gTWF0aC5taW4oTWF0aC5tYXgoZTExLmNsaWVudFgsIDE1MCksIDUwMCk7CiAgICAgIHRoaXMuc2lkZWJhcldpZHRoID0gbmV3V2lkdGg7CiAgICB9KTsKICAgIF9fcHVibGljRmllbGQodGhpcywgImVuZFNpZGViYXJSZXNpemUiLCAoKSA9PiB7CiAgICAgIHRoaXMuaXNSZXNpemluZ1NpZGViYXIgPSBmYWxzZTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgdGhpcy5oYW5kbGVTaWRlYmFyUmVzaXplKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIHRoaXMuZW5kU2lkZWJhclJlc2l6ZSk7CiAgICB9KTsKICB9CiAgZ2V0IHZpc2libGVEYXRhYmFzZXMoKSB7CiAgICBpZiAodGhpcy5zaG93U3lzdGVtRGF0YWJhc2VzKSB7CiAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlczsKICAgIH0KICAgIHJldHVybiB0aGlzLmRhdGFiYXNlcy5maWx0ZXIoKGRiKSA9PiAhdGhpcy5TWVNURU1fREFUQUJBU0VTLmluY2x1ZGVzKGRiLm5hbWUpKTsKICB9CiAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgdGhpcy5pbml0aWFsaXplQ2hhbmdlU3RyZWFtKCk7CiAgICBhd2FpdCB0aGlzLmxvYWREYXRhKCk7CiAgfQogIGFzeW5jIGluaXRpYWxpemVDaGFuZ2VTdHJlYW0oKSB7CiAgICB0cnkgewogICAgICBhd2FpdCBjaGFuZ2VTdHJlYW1TZXJ2aWNlLmNvbm5lY3QoKTsKICAgICAgY29uc29sZS5sb2coIltUc3ZpZXdBcHBdIENoYW5nZVN0cmVhbSBjb25uZWN0ZWQiKTsKICAgICAgYXdhaXQgY2hhbmdlU3RyZWFtU2VydmljZS5zdWJzY3JpYmVUb0FjdGl2aXR5KCk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLndhcm4oIltUc3ZpZXdBcHBdIEZhaWxlZCB0byBjb25uZWN0IHRvIENoYW5nZVN0cmVhbToiLCBlcnJvcik7CiAgICB9CiAgfQogIGFzeW5jIGxvYWREYXRhKCkgewogICAgdHJ5IHsKICAgICAgdGhpcy5idWNrZXRzID0gYXdhaXQgYXBpU2VydmljZS5saXN0QnVja2V0cygpOwogICAgICB0aGlzLmRhdGFiYXNlcyA9IGF3YWl0IGFwaVNlcnZpY2UubGlzdERhdGFiYXNlcygpOwogICAgICBpZiAodGhpcy52aWV3TW9kZSA9PT0gInMzIiAmJiB0aGlzLmJ1Y2tldHMubGVuZ3RoID4gMCAmJiAhdGhpcy5zZWxlY3RlZEJ1Y2tldCkgewogICAgICAgIHRoaXMuc2VsZWN0ZWRCdWNrZXQgPSB0aGlzLmJ1Y2tldHNbMF07CiAgICAgIH0KICAgICAgaWYgKHRoaXMudmlld01vZGUgPT09ICJtb25nbyIgJiYgdGhpcy5kYXRhYmFzZXMubGVuZ3RoID4gMCAmJiAhdGhpcy5zZWxlY3RlZERhdGFiYXNlKSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGFiYXNlID0gdGhpcy5kYXRhYmFzZXNbMF0ubmFtZTsKICAgICAgfQogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGxvYWRpbmcgZGF0YToiLCBlcnIpOwogICAgfQogIH0KICBzZXRWaWV3TW9kZShtb2RlKSB7CiAgICB0aGlzLnZpZXdNb2RlID0gbW9kZTsKICB9CiAgc2VsZWN0QnVja2V0KGJ1Y2tldCkgewogICAgdGhpcy5zZWxlY3RlZEJ1Y2tldCA9IGJ1Y2tldDsKICB9CiAgc2VsZWN0RGF0YWJhc2UoZGIpIHsKICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0YWJhc2UgPT09IGRiKSB7CiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhYmFzZSA9ICIiOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5zZWxlY3RlZERhdGFiYXNlID0gZGI7CiAgICAgIHRoaXMuc2VsZWN0ZWRDb2xsZWN0aW9uID0gIiI7CiAgICB9CiAgfQogIHNlbGVjdENvbGxlY3Rpb24oY29sbGVjdGlvbikgewogICAgdGhpcy5zZWxlY3RlZENvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwogIH0KICBhc3luYyBjcmVhdGVCdWNrZXQoKSB7CiAgICBpZiAoIXRoaXMubmV3QnVja2V0TmFtZS50cmltKCkpIHJldHVybjsKICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBhcGlTZXJ2aWNlLmNyZWF0ZUJ1Y2tldCh0aGlzLm5ld0J1Y2tldE5hbWUudHJpbSgpKTsKICAgIGlmIChzdWNjZXNzKSB7CiAgICAgIHRoaXMuYnVja2V0cyA9IFsuLi50aGlzLmJ1Y2tldHMsIHRoaXMubmV3QnVja2V0TmFtZS50cmltKCldOwogICAgICB0aGlzLm5ld0J1Y2tldE5hbWUgPSAiIjsKICAgICAgdGhpcy5zaG93Q3JlYXRlQnVja2V0RGlhbG9nID0gZmFsc2U7CiAgICB9CiAgfQogIGFzeW5jIGNyZWF0ZUNvbGxlY3Rpb24oKSB7CiAgICBpZiAoIXRoaXMubmV3Q29sbGVjdGlvbk5hbWUudHJpbSgpIHx8ICF0aGlzLnNlbGVjdGVkRGF0YWJhc2UpIHJldHVybjsKICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBhcGlTZXJ2aWNlLmNyZWF0ZUNvbGxlY3Rpb24odGhpcy5zZWxlY3RlZERhdGFiYXNlLCB0aGlzLm5ld0NvbGxlY3Rpb25OYW1lLnRyaW0oKSk7CiAgICBpZiAoc3VjY2VzcykgewogICAgICB0aGlzLm5ld0NvbGxlY3Rpb25OYW1lID0gIiI7CiAgICAgIHRoaXMuc2hvd0NyZWF0ZUNvbGxlY3Rpb25EaWFsb2cgPSBmYWxzZTsKICAgIH0KICB9CiAgYXN5bmMgY3JlYXRlRGF0YWJhc2UoKSB7CiAgICBpZiAoIXRoaXMubmV3RGF0YWJhc2VOYW1lLnRyaW0oKSkgcmV0dXJuOwogICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGFwaVNlcnZpY2UuY3JlYXRlRGF0YWJhc2UodGhpcy5uZXdEYXRhYmFzZU5hbWUudHJpbSgpKTsKICAgIGlmIChzdWNjZXNzKSB7CiAgICAgIHRoaXMuZGF0YWJhc2VzID0gWy4uLnRoaXMuZGF0YWJhc2VzLCB7IG5hbWU6IHRoaXMubmV3RGF0YWJhc2VOYW1lLnRyaW0oKSB9XTsKICAgICAgdGhpcy5uZXdEYXRhYmFzZU5hbWUgPSAiIjsKICAgICAgdGhpcy5zaG93Q3JlYXRlRGF0YWJhc2VEaWFsb2cgPSBmYWxzZTsKICAgIH0KICB9CiAgYXN5bmMgZGVsZXRlQnVja2V0KGJ1Y2tldCwgZTExKSB7CiAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBpZiAoIWNvbmZpcm0oYERlbGV0ZSBidWNrZXQgIiR7YnVja2V0fSI/IFRoaXMgd2lsbCBkZWxldGUgYWxsIG9iamVjdHMgaW4gdGhlIGJ1Y2tldC5gKSkgcmV0dXJuOwogICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGFwaVNlcnZpY2UuZGVsZXRlQnVja2V0KGJ1Y2tldCk7CiAgICBpZiAoc3VjY2VzcykgewogICAgICB0aGlzLmJ1Y2tldHMgPSB0aGlzLmJ1Y2tldHMuZmlsdGVyKChiNSkgPT4gYjUgIT09IGJ1Y2tldCk7CiAgICAgIGlmICh0aGlzLnNlbGVjdGVkQnVja2V0ID09PSBidWNrZXQpIHsKICAgICAgICB0aGlzLnNlbGVjdGVkQnVja2V0ID0gdGhpcy5idWNrZXRzWzBdIHx8ICIiOwogICAgICB9CiAgICB9CiAgfQogIGFzeW5jIGRlbGV0ZURhdGFiYXNlKGRiTmFtZSwgZTExKSB7CiAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBpZiAoIWNvbmZpcm0oYERlbGV0ZSBkYXRhYmFzZSAiJHtkYk5hbWV9Ij8gVGhpcyB3aWxsIGRlbGV0ZSBhbGwgY29sbGVjdGlvbnMgYW5kIGRvY3VtZW50cy5gKSkgcmV0dXJuOwogICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGFwaVNlcnZpY2UuZHJvcERhdGFiYXNlKGRiTmFtZSk7CiAgICBpZiAoc3VjY2VzcykgewogICAgICB0aGlzLmRhdGFiYXNlcyA9IHRoaXMuZGF0YWJhc2VzLmZpbHRlcigoZDYpID0+IGQ2Lm5hbWUgIT09IGRiTmFtZSk7CiAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0YWJhc2UgPT09IGRiTmFtZSkgewogICAgICAgIHRoaXMuc2VsZWN0ZWREYXRhYmFzZSA9IHRoaXMuZGF0YWJhc2VzWzBdPy5uYW1lIHx8ICIiOwogICAgICAgIHRoaXMuc2VsZWN0ZWRDb2xsZWN0aW9uID0gIiI7CiAgICAgIH0KICAgIH0KICB9CiAgYXN5bmMgZGVsZXRlQ29sbGVjdGlvbihkYk5hbWUsIGNvbGxlY3Rpb25OYW1lKSB7CiAgICBpZiAoIWNvbmZpcm0oYERlbGV0ZSBjb2xsZWN0aW9uICIke2NvbGxlY3Rpb25OYW1lfSI/IFRoaXMgd2lsbCBkZWxldGUgYWxsIGRvY3VtZW50cy5gKSkgcmV0dXJuOwogICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGFwaVNlcnZpY2UuZHJvcENvbGxlY3Rpb24oZGJOYW1lLCBjb2xsZWN0aW9uTmFtZSk7CiAgICBpZiAoc3VjY2VzcykgewogICAgICBpZiAodGhpcy5zZWxlY3RlZENvbGxlY3Rpb24gPT09IGNvbGxlY3Rpb25OYW1lKSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZENvbGxlY3Rpb24gPSAiIjsKICAgICAgfQogICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgIH0KICB9CiAgaGFuZGxlQnVja2V0Q29udGV4dE1lbnUoZXZlbnQsIGJ1Y2tldCkgewogICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgIERlZXNDb250ZXh0bWVudTIub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZXZlbnQsIFsKICAgICAgewogICAgICAgIG5hbWU6ICJWaWV3IENvbnRlbnRzIiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpmb2xkZXJPcGVuIiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIHRoaXMuc2VsZWN0QnVja2V0KGJ1Y2tldCk7CiAgICAgICAgfQogICAgICB9LAogICAgICB7IGRpdmlkZXI6IHRydWUgfSwKICAgICAgewogICAgICAgIG5hbWU6ICJOZXcgRm9sZGVyIiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpmb2xkZXJQbHVzIiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMub3BlblMzQ3JlYXRlRGlhbG9nKGJ1Y2tldCwgImZvbGRlciIpCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBuYW1lOiAiTmV3IEZpbGUiLAogICAgICAgIGljb25OYW1lOiAibHVjaWRlOmZpbGVQbHVzIiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMub3BlblMzQ3JlYXRlRGlhbG9nKGJ1Y2tldCwgImZpbGUiKQogICAgICB9LAogICAgICB7IGRpdmlkZXI6IHRydWUgfSwKICAgICAgewogICAgICAgIG5hbWU6ICJEZWxldGUgQnVja2V0IiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTp0cmFzaDIiLAogICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgaWYgKGNvbmZpcm0oYERlbGV0ZSBidWNrZXQgIiR7YnVja2V0fSI/IFRoaXMgd2lsbCBkZWxldGUgYWxsIG9iamVjdHMgaW4gdGhlIGJ1Y2tldC5gKSkgewogICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgYXBpU2VydmljZS5kZWxldGVCdWNrZXQoYnVja2V0KTsKICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKICAgICAgICAgICAgICB0aGlzLmJ1Y2tldHMgPSB0aGlzLmJ1Y2tldHMuZmlsdGVyKChiNSkgPT4gYjUgIT09IGJ1Y2tldCk7CiAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRCdWNrZXQgPT09IGJ1Y2tldCkgewogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEJ1Y2tldCA9IHRoaXMuYnVja2V0c1swXSB8fCAiIjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIF0pOwogIH0KICBvcGVuUzNDcmVhdGVEaWFsb2coYnVja2V0LCB0eXBlNSkgewogICAgdGhpcy5zM0NyZWF0ZURpYWxvZ0J1Y2tldCA9IGJ1Y2tldDsKICAgIHRoaXMuczNDcmVhdGVEaWFsb2dUeXBlID0gdHlwZTU7CiAgICB0aGlzLnMzQ3JlYXRlRGlhbG9nTmFtZSA9ICIiOwogICAgdGhpcy5zaG93UzNDcmVhdGVEaWFsb2cgPSB0cnVlOwogIH0KICBnZXRDb250ZW50VHlwZShleHQpIHsKICAgIGNvbnN0IGNvbnRlbnRUeXBlcyA9IHsKICAgICAganNvbjogImFwcGxpY2F0aW9uL2pzb24iLAogICAgICB0eHQ6ICJ0ZXh0L3BsYWluIiwKICAgICAgaHRtbDogInRleHQvaHRtbCIsCiAgICAgIGNzczogInRleHQvY3NzIiwKICAgICAganM6ICJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IiwKICAgICAgdHM6ICJ0ZXh0L3R5cGVzY3JpcHQiLAogICAgICBtZDogInRleHQvbWFya2Rvd24iLAogICAgICB4bWw6ICJhcHBsaWNhdGlvbi94bWwiLAogICAgICB5YW1sOiAidGV4dC95YW1sIiwKICAgICAgeW1sOiAidGV4dC95YW1sIiwKICAgICAgY3N2OiAidGV4dC9jc3YiCiAgICB9OwogICAgcmV0dXJuIGNvbnRlbnRUeXBlc1tleHRdIHx8ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOwogIH0KICBnZXREZWZhdWx0Q29udGVudChleHQpIHsKICAgIGNvbnN0IGRlZmF1bHRzID0gewogICAgICBqc29uOiAie1xuICBcbn0iLAogICAgICBodG1sOiAiPCFET0NUWVBFIGh0bWw+XG48aHRtbD5cbjxoZWFkPlxuICA8dGl0bGU+PC90aXRsZT5cbjwvaGVhZD5cbjxib2R5PlxuICBcbjwvYm9keT5cbjwvaHRtbD4iLAogICAgICBtZDogIiMgVGl0bGVcblxuIiwKICAgICAgdHh0OiAiIgogICAgfTsKICAgIHJldHVybiBkZWZhdWx0c1tleHRdIHx8ICIiOwogIH0KICBhc3luYyBoYW5kbGVTM0NyZWF0ZSgpIHsKICAgIGlmICghdGhpcy5zM0NyZWF0ZURpYWxvZ05hbWUudHJpbSgpKSByZXR1cm47CiAgICBjb25zdCBuYW1lID0gdGhpcy5zM0NyZWF0ZURpYWxvZ05hbWUudHJpbSgpOwogICAgbGV0IHBhdGgyOwogICAgaWYgKHRoaXMuczNDcmVhdGVEaWFsb2dUeXBlID09PSAiZm9sZGVyIikgewogICAgICBwYXRoMiA9IG5hbWUgKyAiLy5rZWVwIjsKICAgIH0gZWxzZSB7CiAgICAgIHBhdGgyID0gbmFtZTsKICAgIH0KICAgIGNvbnN0IGV4dCA9IG5hbWUuc3BsaXQoIi4iKS5wb3AoKT8udG9Mb3dlckNhc2UoKSB8fCAiIjsKICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gdGhpcy5zM0NyZWF0ZURpYWxvZ1R5cGUgPT09ICJmaWxlIiA/IHRoaXMuZ2V0Q29udGVudFR5cGUoZXh0KSA6ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOwogICAgY29uc3QgY29udGVudDMgPSB0aGlzLnMzQ3JlYXRlRGlhbG9nVHlwZSA9PT0gImZpbGUiID8gdGhpcy5nZXREZWZhdWx0Q29udGVudChleHQpIDogIiI7CiAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgYXBpU2VydmljZS5wdXRPYmplY3QoCiAgICAgIHRoaXMuczNDcmVhdGVEaWFsb2dCdWNrZXQsCiAgICAgIHBhdGgyLAogICAgICBidG9hKGNvbnRlbnQzKSwKICAgICAgY29udGVudFR5cGUKICAgICk7CiAgICBpZiAoc3VjY2VzcykgewogICAgICB0aGlzLnNob3dTM0NyZWF0ZURpYWxvZyA9IGZhbHNlOwogICAgICB0aGlzLnNlbGVjdGVkQnVja2V0ID0gdGhpcy5zM0NyZWF0ZURpYWxvZ0J1Y2tldDsKICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7CiAgICB9CiAgfQogIGhhbmRsZURhdGFiYXNlQ29udGV4dE1lbnUoZXZlbnQsIGRiTmFtZSkgewogICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgIERlZXNDb250ZXh0bWVudTIub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZXZlbnQsIFsKICAgICAgewogICAgICAgIG5hbWU6ICJOZXcgQ29sbGVjdGlvbiIsCiAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6Zm9sZGVyUGx1cyIsCiAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0YWJhc2UgPSBkYk5hbWU7CiAgICAgICAgICB0aGlzLnNob3dDcmVhdGVDb2xsZWN0aW9uRGlhbG9nID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICB7CiAgICAgICAgbmFtZTogIkRlbGV0ZSBEYXRhYmFzZSIsCiAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6dHJhc2gyIiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIGlmIChjb25maXJtKGBEZWxldGUgZGF0YWJhc2UgIiR7ZGJOYW1lfSI/IFRoaXMgd2lsbCBkZWxldGUgYWxsIGNvbGxlY3Rpb25zIGFuZCBkb2N1bWVudHMuYCkpIHsKICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGFwaVNlcnZpY2UuZHJvcERhdGFiYXNlKGRiTmFtZSk7CiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CiAgICAgICAgICAgICAgdGhpcy5kYXRhYmFzZXMgPSB0aGlzLmRhdGFiYXNlcy5maWx0ZXIoKGQ2KSA9PiBkNi5uYW1lICE9PSBkYk5hbWUpOwogICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0YWJhc2UgPT09IGRiTmFtZSkgewogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGFiYXNlID0gdGhpcy5kYXRhYmFzZXNbMF0/Lm5hbWUgfHwgIiI7CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sbGVjdGlvbiA9ICIiOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgXSk7CiAgfQogIGhhbmRsZVNpZGViYXJDb250ZXh0TWVudShldmVudCkgewogICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgIERlZXNDb250ZXh0bWVudTIub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZXZlbnQsIFsKICAgICAgewogICAgICAgIG5hbWU6IHRoaXMuc2hvd1N5c3RlbURhdGFiYXNlcyA/ICJIaWRlIFN5c3RlbSBEYXRhYmFzZXMiIDogIlNob3cgU3lzdGVtIERhdGFiYXNlcyIsCiAgICAgICAgaWNvbk5hbWU6IHRoaXMuc2hvd1N5c3RlbURhdGFiYXNlcyA/ICJsdWNpZGU6ZXllT2ZmIiA6ICJsdWNpZGU6ZXllIiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIHRoaXMuc2hvd1N5c3RlbURhdGFiYXNlcyA9ICF0aGlzLnNob3dTeXN0ZW1EYXRhYmFzZXM7CiAgICAgICAgfQogICAgICB9CiAgICBdKTsKICB9CiAgcmVuZGVyKCkgewogICAgcmV0dXJuIGh0bWw4YAogICAgICA8ZGl2IGNsYXNzPSJhcHAtY29udGFpbmVyIj4KICAgICAgICA8aGVhZGVyIGNsYXNzPSJhcHAtaGVhZGVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImFwcC10aXRsZSI+CiAgICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMiAzaDZhNCA0IDAgMCAxIDQgNHYxNGEzIDMgMCAwIDAtMy0zSDJ6Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTIyIDNoLTZhNCA0IDAgMCAwLTQgNHYxNGEzIDMgMCAwIDEgMy0zaDd6Ij48L3BhdGg+CiAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICBUc1ZpZXcKICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxuYXYgY2xhc3M9Im5hdi10YWJzIj4KICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgIGNsYXNzPSJuYXYtdGFiICR7dGhpcy52aWV3TW9kZSA9PT0gInMzIiA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuc2V0Vmlld01vZGUoInMzIil9CiAgICAgICAgICAgID4KICAgICAgICAgICAgICBTMyBTdG9yYWdlCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgY2xhc3M9Im5hdi10YWIgJHt0aGlzLnZpZXdNb2RlID09PSAibW9uZ28iID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5zZXRWaWV3TW9kZSgibW9uZ28iKX0KICAgICAgICAgICAgPgogICAgICAgICAgICAgIE1vbmdvREIKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICBjbGFzcz0ibmF2LXRhYiAke3RoaXMudmlld01vZGUgPT09ICJhY3Rpdml0eSIgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNldFZpZXdNb2RlKCJhY3Rpdml0eSIpfQogICAgICAgICAgICA+CiAgICAgICAgICAgICAgQWN0aXZpdHkKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICBjbGFzcz0ibmF2LXRhYiAke3RoaXMudmlld01vZGUgPT09ICJzZXR0aW5ncyIgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNldFZpZXdNb2RlKCJzZXR0aW5ncyIpfQogICAgICAgICAgICA+CiAgICAgICAgICAgICAgU2V0dGluZ3MKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8L25hdj4KICAgICAgICA8L2hlYWRlcj4KCiAgICAgICAgPG1haW4gY2xhc3M9ImFwcC1tYWluIiBzdHlsZT0iLS1zaWRlYmFyLXdpZHRoOiAke3RoaXMuc2lkZWJhcldpZHRofXB4Ij4KICAgICAgICAgICR7dGhpcy5yZW5kZXJTaWRlYmFyKCl9CiAgICAgICAgICA8ZGl2CiAgICAgICAgICAgIGNsYXNzPSJyZXNpemUtZGl2aWRlciAke3RoaXMuaXNSZXNpemluZ1NpZGViYXIgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgICAgQG1vdXNlZG93bj0ke3RoaXMuc3RhcnRTaWRlYmFyUmVzaXplfQogICAgICAgICAgPjwvZGl2PgogICAgICAgICAgJHt0aGlzLnJlbmRlckNvbnRlbnQoKX0KICAgICAgICA8L21haW4+CiAgICAgIDwvZGl2PgogICAgICAke3RoaXMucmVuZGVyQ3JlYXRlQnVja2V0RGlhbG9nKCl9CiAgICAgICR7dGhpcy5yZW5kZXJDcmVhdGVDb2xsZWN0aW9uRGlhbG9nKCl9CiAgICAgICR7dGhpcy5yZW5kZXJDcmVhdGVEYXRhYmFzZURpYWxvZygpfQogICAgICAke3RoaXMucmVuZGVyUzNDcmVhdGVEaWFsb2coKX0KICAgIGA7CiAgfQogIHJlbmRlckNyZWF0ZUJ1Y2tldERpYWxvZygpIHsKICAgIGlmICghdGhpcy5zaG93Q3JlYXRlQnVja2V0RGlhbG9nKSByZXR1cm4gIiI7CiAgICByZXR1cm4gaHRtbDhgCiAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy1vdmVybGF5IiBAY2xpY2s9JHsoKSA9PiB0aGlzLnNob3dDcmVhdGVCdWNrZXREaWFsb2cgPSBmYWxzZX0+CiAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nIiBAY2xpY2s9JHsoZTExKSA9PiBlMTEuc3RvcFByb3BhZ2F0aW9uKCl9PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj5DcmVhdGUgTmV3IEJ1Y2tldDwvZGl2PgogICAgICAgICAgPGlucHV0CiAgICAgICAgICAgIHR5cGU9InRleHQiCiAgICAgICAgICAgIGNsYXNzPSJkaWFsb2ctaW5wdXQiCiAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJCdWNrZXQgbmFtZSIKICAgICAgICAgICAgLnZhbHVlPSR7dGhpcy5uZXdCdWNrZXROYW1lfQogICAgICAgICAgICBAaW5wdXQ9JHsoZTExKSA9PiB0aGlzLm5ld0J1Y2tldE5hbWUgPSBlMTEudGFyZ2V0LnZhbHVlfQogICAgICAgICAgICBAa2V5ZG93bj0keyhlMTEpID0+IGUxMS5rZXkgPT09ICJFbnRlciIgJiYgdGhpcy5jcmVhdGVCdWNrZXQoKX0KICAgICAgICAgIC8+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctYWN0aW9ucyI+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRpYWxvZy1idG4gZGlhbG9nLWJ0bi1jYW5jZWwiIEBjbGljaz0keygpID0+IHRoaXMuc2hvd0NyZWF0ZUJ1Y2tldERpYWxvZyA9IGZhbHNlfT4KICAgICAgICAgICAgICBDYW5jZWwKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICBjbGFzcz0iZGlhbG9nLWJ0biBkaWFsb2ctYnRuLWNyZWF0ZSIKICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHshdGhpcy5uZXdCdWNrZXROYW1lLnRyaW0oKX0KICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmNyZWF0ZUJ1Y2tldCgpfQogICAgICAgICAgICA+CiAgICAgICAgICAgICAgQ3JlYXRlCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICB9CiAgcmVuZGVyQ3JlYXRlQ29sbGVjdGlvbkRpYWxvZygpIHsKICAgIGlmICghdGhpcy5zaG93Q3JlYXRlQ29sbGVjdGlvbkRpYWxvZykgcmV0dXJuICIiOwogICAgcmV0dXJuIGh0bWw4YAogICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctb3ZlcmxheSIgQGNsaWNrPSR7KCkgPT4gdGhpcy5zaG93Q3JlYXRlQ29sbGVjdGlvbkRpYWxvZyA9IGZhbHNlfT4KICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ciIEBjbGljaz0keyhlMTEpID0+IGUxMS5zdG9wUHJvcGFnYXRpb24oKX0+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPkNyZWF0ZSBDb2xsZWN0aW9uIGluICR7dGhpcy5zZWxlY3RlZERhdGFiYXNlfTwvZGl2PgogICAgICAgICAgPGlucHV0CiAgICAgICAgICAgIHR5cGU9InRleHQiCiAgICAgICAgICAgIGNsYXNzPSJkaWFsb2ctaW5wdXQiCiAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJDb2xsZWN0aW9uIG5hbWUiCiAgICAgICAgICAgIC52YWx1ZT0ke3RoaXMubmV3Q29sbGVjdGlvbk5hbWV9CiAgICAgICAgICAgIEBpbnB1dD0keyhlMTEpID0+IHRoaXMubmV3Q29sbGVjdGlvbk5hbWUgPSBlMTEudGFyZ2V0LnZhbHVlfQogICAgICAgICAgICBAa2V5ZG93bj0keyhlMTEpID0+IGUxMS5rZXkgPT09ICJFbnRlciIgJiYgdGhpcy5jcmVhdGVDb2xsZWN0aW9uKCl9CiAgICAgICAgICAvPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLWFjdGlvbnMiPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkaWFsb2ctYnRuIGRpYWxvZy1idG4tY2FuY2VsIiBAY2xpY2s9JHsoKSA9PiB0aGlzLnNob3dDcmVhdGVDb2xsZWN0aW9uRGlhbG9nID0gZmFsc2V9PgogICAgICAgICAgICAgIENhbmNlbAogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgIGNsYXNzPSJkaWFsb2ctYnRuIGRpYWxvZy1idG4tY3JlYXRlIgogICAgICAgICAgICAgID9kaXNhYmxlZD0keyF0aGlzLm5ld0NvbGxlY3Rpb25OYW1lLnRyaW0oKX0KICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmNyZWF0ZUNvbGxlY3Rpb24oKX0KICAgICAgICAgICAgPgogICAgICAgICAgICAgIENyZWF0ZQogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgfQogIHJlbmRlckNyZWF0ZURhdGFiYXNlRGlhbG9nKCkgewogICAgaWYgKCF0aGlzLnNob3dDcmVhdGVEYXRhYmFzZURpYWxvZykgcmV0dXJuICIiOwogICAgcmV0dXJuIGh0bWw4YAogICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctb3ZlcmxheSIgQGNsaWNrPSR7KCkgPT4gdGhpcy5zaG93Q3JlYXRlRGF0YWJhc2VEaWFsb2cgPSBmYWxzZX0+CiAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nIiBAY2xpY2s9JHsoZTExKSA9PiBlMTEuc3RvcFByb3BhZ2F0aW9uKCl9PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj5DcmVhdGUgTmV3IERhdGFiYXNlPC9kaXY+CiAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgdHlwZT0idGV4dCIKICAgICAgICAgICAgY2xhc3M9ImRpYWxvZy1pbnB1dCIKICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkRhdGFiYXNlIG5hbWUiCiAgICAgICAgICAgIC52YWx1ZT0ke3RoaXMubmV3RGF0YWJhc2VOYW1lfQogICAgICAgICAgICBAaW5wdXQ9JHsoZTExKSA9PiB0aGlzLm5ld0RhdGFiYXNlTmFtZSA9IGUxMS50YXJnZXQudmFsdWV9CiAgICAgICAgICAgIEBrZXlkb3duPSR7KGUxMSkgPT4gZTExLmtleSA9PT0gIkVudGVyIiAmJiB0aGlzLmNyZWF0ZURhdGFiYXNlKCl9CiAgICAgICAgICAvPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLWFjdGlvbnMiPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkaWFsb2ctYnRuIGRpYWxvZy1idG4tY2FuY2VsIiBAY2xpY2s9JHsoKSA9PiB0aGlzLnNob3dDcmVhdGVEYXRhYmFzZURpYWxvZyA9IGZhbHNlfT4KICAgICAgICAgICAgICBDYW5jZWwKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICBjbGFzcz0iZGlhbG9nLWJ0biBkaWFsb2ctYnRuLWNyZWF0ZSIKICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHshdGhpcy5uZXdEYXRhYmFzZU5hbWUudHJpbSgpfQogICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuY3JlYXRlRGF0YWJhc2UoKX0KICAgICAgICAgICAgPgogICAgICAgICAgICAgIENyZWF0ZQogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgfQogIHJlbmRlclMzQ3JlYXRlRGlhbG9nKCkgewogICAgaWYgKCF0aGlzLnNob3dTM0NyZWF0ZURpYWxvZykgcmV0dXJuICIiOwogICAgY29uc3QgaXNGb2xkZXIgPSB0aGlzLnMzQ3JlYXRlRGlhbG9nVHlwZSA9PT0gImZvbGRlciI7CiAgICBjb25zdCB0aXRsZSA9IGlzRm9sZGVyID8gIkNyZWF0ZSBOZXcgRm9sZGVyIiA6ICJDcmVhdGUgTmV3IEZpbGUiOwogICAgY29uc3QgcGxhY2Vob2xkZXIgPSBpc0ZvbGRlciA/ICJmb2xkZXItbmFtZSBvciBwYXRoL3RvL2ZvbGRlciIgOiAiZmlsZW5hbWUudHh0IG9yIHBhdGgvdG8vZmlsZS50eHQiOwogICAgcmV0dXJuIGh0bWw4YAogICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctb3ZlcmxheSIgQGNsaWNrPSR7KCkgPT4gdGhpcy5zaG93UzNDcmVhdGVEaWFsb2cgPSBmYWxzZX0+CiAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nIiBAY2xpY2s9JHsoZTExKSA9PiBlMTEuc3RvcFByb3BhZ2F0aW9uKCl9PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj4ke3RpdGxlfTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLWxvY2F0aW9uIj4KICAgICAgICAgICAgTG9jYXRpb246ICR7dGhpcy5zM0NyZWF0ZURpYWxvZ0J1Y2tldH0vCiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICB0eXBlPSJ0ZXh0IgogICAgICAgICAgICBjbGFzcz0iZGlhbG9nLWlucHV0IgogICAgICAgICAgICBwbGFjZWhvbGRlcj0ke3BsYWNlaG9sZGVyfQogICAgICAgICAgICAudmFsdWU9JHt0aGlzLnMzQ3JlYXRlRGlhbG9nTmFtZX0KICAgICAgICAgICAgQGlucHV0PSR7KGUxMSkgPT4gdGhpcy5zM0NyZWF0ZURpYWxvZ05hbWUgPSBlMTEudGFyZ2V0LnZhbHVlfQogICAgICAgICAgICBAa2V5ZG93bj0keyhlMTEpID0+IGUxMS5rZXkgPT09ICJFbnRlciIgJiYgdGhpcy5oYW5kbGVTM0NyZWF0ZSgpfQogICAgICAgICAgLz4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy1oaW50Ij4KICAgICAgICAgICAgVXNlICIvIiB0byBjcmVhdGUgbmVzdGVkICR7aXNGb2xkZXIgPyAiZm9sZGVycyIgOiAicGF0aCJ9IChlLmcuLCAke2lzRm9sZGVyID8gInBhcmVudC9jaGlsZCIgOiAiZm9sZGVyL2ZpbGUudHh0In0pCiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy1hY3Rpb25zIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGlhbG9nLWJ0biBkaWFsb2ctYnRuLWNhbmNlbCIgQGNsaWNrPSR7KCkgPT4gdGhpcy5zaG93UzNDcmVhdGVEaWFsb2cgPSBmYWxzZX0+CiAgICAgICAgICAgICAgQ2FuY2VsCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgY2xhc3M9ImRpYWxvZy1idG4gZGlhbG9nLWJ0bi1jcmVhdGUiCiAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7IXRoaXMuczNDcmVhdGVEaWFsb2dOYW1lLnRyaW0oKX0KICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmhhbmRsZVMzQ3JlYXRlKCl9CiAgICAgICAgICAgID4KICAgICAgICAgICAgICBDcmVhdGUKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICByZW5kZXJTaWRlYmFyKCkgewogICAgaWYgKHRoaXMudmlld01vZGUgPT09ICJzMyIpIHsKICAgICAgcmV0dXJuIGh0bWw4YAogICAgICAgIDxhc2lkZSBjbGFzcz0ic2lkZWJhciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLWhlYWRlciI+QnVja2V0czwvZGl2PgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY3JlYXRlLWJ0biIgQGNsaWNrPSR7KCkgPT4gdGhpcy5zaG93Q3JlYXRlQnVja2V0RGlhbG9nID0gdHJ1ZX0+CiAgICAgICAgICAgIDxzdmcgd2lkdGg9IjE0IiBoZWlnaHQ9IjE0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPgogICAgICAgICAgICAgIDxsaW5lIHgxPSIxMiIgeTE9IjUiIHgyPSIxMiIgeTI9IjE5Ij48L2xpbmU+CiAgICAgICAgICAgICAgPGxpbmUgeDE9IjUiIHkxPSIxMiIgeDI9IjE5IiB5Mj0iMTIiPjwvbGluZT4KICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgIE5ldyBCdWNrZXQKICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1saXN0Ij4KICAgICAgICAgICAgJHt0aGlzLmJ1Y2tldHMubGVuZ3RoID09PSAwID8gaHRtbDhgPGRpdiBjbGFzcz0ic2lkZWJhci1pdGVtIiBzdHlsZT0iY29sb3I6ICM2NjY7IGN1cnNvcjogZGVmYXVsdDsiPk5vIGJ1Y2tldHMgZm91bmQ8L2Rpdj5gIDogdGhpcy5idWNrZXRzLm1hcCgKICAgICAgICAoYnVja2V0KSA9PiBodG1sOGAKICAgICAgICAgICAgICAgICAgICA8ZGl2CiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic2lkZWJhci1pdGVtICR7YnVja2V0ID09PSB0aGlzLnNlbGVjdGVkQnVja2V0ID8gInNlbGVjdGVkIiA6ICIifSIKICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuc2VsZWN0QnVja2V0KGJ1Y2tldCl9CiAgICAgICAgICAgICAgICAgICAgICBAY29udGV4dG1lbnU9JHsoZTExKSA9PiB0aGlzLmhhbmRsZUJ1Y2tldENvbnRleHRNZW51KGUxMSwgYnVja2V0KX0KICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2lkZWJhci1pdGVtLW5hbWUiPiR7YnVja2V0fTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgYAogICAgICApfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9hc2lkZT4KICAgICAgYDsKICAgIH0KICAgIGlmICh0aGlzLnZpZXdNb2RlID09PSAibW9uZ28iKSB7CiAgICAgIHJldHVybiBodG1sOGAKICAgICAgICA8YXNpZGUgY2xhc3M9InNpZGViYXIiIEBjb250ZXh0bWVudT0keyhlMTEpID0+IHRoaXMuaGFuZGxlU2lkZWJhckNvbnRleHRNZW51KGUxMSl9PgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1oZWFkZXIiPkRhdGFiYXNlcyAmIENvbGxlY3Rpb25zPC9kaXY+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjcmVhdGUtYnRuIiBAY2xpY2s9JHsoKSA9PiB0aGlzLnNob3dDcmVhdGVEYXRhYmFzZURpYWxvZyA9IHRydWV9PgogICAgICAgICAgICA8c3ZnIHdpZHRoPSIxNCIgaGVpZ2h0PSIxNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj4KICAgICAgICAgICAgICA8bGluZSB4MT0iMTIiIHkxPSI1IiB4Mj0iMTIiIHkyPSIxOSI+PC9saW5lPgogICAgICAgICAgICAgIDxsaW5lIHgxPSI1IiB5MT0iMTIiIHgyPSIxOSIgeTI9IjEyIj48L2xpbmU+CiAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICBOZXcgRGF0YWJhc2UKICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1saXN0Ij4KICAgICAgICAgICAgJHt0aGlzLnZpc2libGVEYXRhYmFzZXMubGVuZ3RoID09PSAwID8gaHRtbDhgPGRpdiBjbGFzcz0ic2lkZWJhci1pdGVtIiBzdHlsZT0iY29sb3I6ICM2NjY7IGN1cnNvcjogZGVmYXVsdDsiPk5vIGRhdGFiYXNlcyBmb3VuZDwvZGl2PmAgOiB0aGlzLnZpc2libGVEYXRhYmFzZXMubWFwKChkYikgPT4gdGhpcy5yZW5kZXJEYXRhYmFzZUdyb3VwKGRiKSl9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2FzaWRlPgogICAgICBgOwogICAgfQogICAgaWYgKHRoaXMudmlld01vZGUgPT09ICJhY3Rpdml0eSIpIHsKICAgICAgcmV0dXJuIGh0bWw4YAogICAgICAgIDxhc2lkZSBjbGFzcz0ic2lkZWJhciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLWhlYWRlciI+QWN0aXZpdHkgU3RyZWFtPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLWxpc3QiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLWl0ZW0iIHN0eWxlPSJjb2xvcjogIzg4ODsgZm9udC1zaXplOiAxMnB4OyBjdXJzb3I6IGRlZmF1bHQ7Ij4KICAgICAgICAgICAgICBSZWFsLXRpbWUgY2hhbmdlcyBmcm9tIE1vbmdvREIgYW5kIFMzIGFwcGVhciBoZXJlIGF1dG9tYXRpY2FsbHkuCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9hc2lkZT4KICAgICAgYDsKICAgIH0KICAgIHJldHVybiBodG1sOGAKICAgICAgPGFzaWRlIGNsYXNzPSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLWhlYWRlciI+U2V0dGluZ3M8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLWxpc3QiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1pdGVtIj5Db25uZWN0aW9uPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLWl0ZW0iPkRpc3BsYXk8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9hc2lkZT4KICAgIGA7CiAgfQogIHJlbmRlckRhdGFiYXNlR3JvdXAoZGIpIHsKICAgIHJldHVybiBodG1sOGAKICAgICAgPGRpdiBjbGFzcz0iZGItZ3JvdXAiPgogICAgICAgIDxkaXYKICAgICAgICAgIGNsYXNzPSJkYi1ncm91cC1oZWFkZXIgJHt0aGlzLnNlbGVjdGVkRGF0YWJhc2UgPT09IGRiLm5hbWUgPyAic2VsZWN0ZWQiIDogIiJ9IgogICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5zZWxlY3REYXRhYmFzZShkYi5uYW1lKX0KICAgICAgICAgIEBjb250ZXh0bWVudT0keyhlMTEpID0+IHRoaXMuaGFuZGxlRGF0YWJhc2VDb250ZXh0TWVudShlMTEsIGRiLm5hbWUpfQogICAgICAgID4KICAgICAgICAgIDxzdmcgd2lkdGg9IjE0IiBoZWlnaHQ9IjE0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPgogICAgICAgICAgICA8ZWxsaXBzZSBjeD0iMTIiIGN5PSI1IiByeD0iOSIgcnk9IjMiPjwvZWxsaXBzZT4KICAgICAgICAgICAgPHBhdGggZD0iTTIxIDEyYzAgMS42Ni00IDMtOSAzcy05LTEuMzQtOS0zIj48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0zIDV2MTRjMCAxLjY2IDQgMyA5IDNzOS0xLjM0IDktM1Y1Ij48L3BhdGg+CiAgICAgICAgICA8L3N2Zz4KICAgICAgICAgIDxzcGFuIHN0eWxlPSJmbGV4OiAxOyI+JHtkYi5uYW1lfTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICAke3RoaXMuc2VsZWN0ZWREYXRhYmFzZSA9PT0gZGIubmFtZSA/IHRoaXMucmVuZGVyQ29sbGVjdGlvbnNMaXN0KGRiLm5hbWUpIDogIiJ9CiAgICAgIDwvZGl2PgogICAgYDsKICB9CiAgcmVuZGVyQ29sbGVjdGlvbnNMaXN0KGRiTmFtZSkgewogICAgcmV0dXJuIGh0bWw4YAogICAgICA8dHN2aWV3LW1vbmdvLWNvbGxlY3Rpb25zCiAgICAgICAgLmRhdGFiYXNlTmFtZT0ke2RiTmFtZX0KICAgICAgICAuc2VsZWN0ZWRDb2xsZWN0aW9uPSR7dGhpcy5zZWxlY3RlZENvbGxlY3Rpb259CiAgICAgICAgQGNvbGxlY3Rpb24tc2VsZWN0ZWQ9JHsoZTExKSA9PiB0aGlzLnNlbGVjdENvbGxlY3Rpb24oZTExLmRldGFpbCl9CiAgICAgICAgQGNvbGxlY3Rpb24tZGVsZXRlZD0keyhlMTEpID0+IHRoaXMuaGFuZGxlQ29sbGVjdGlvbkRlbGV0ZWQoZTExKX0KICAgICAgPjwvdHN2aWV3LW1vbmdvLWNvbGxlY3Rpb25zPgogICAgYDsKICB9CiAgaGFuZGxlQ29sbGVjdGlvbkRlbGV0ZWQoZTExKSB7CiAgICBjb25zdCB7IGNvbGxlY3Rpb25OYW1lIH0gPSBlMTEuZGV0YWlsOwogICAgaWYgKHRoaXMuc2VsZWN0ZWRDb2xsZWN0aW9uID09PSBjb2xsZWN0aW9uTmFtZSkgewogICAgICB0aGlzLnNlbGVjdGVkQ29sbGVjdGlvbiA9ICIiOwogICAgfQogIH0KICByZW5kZXJDb250ZW50KCkgewogICAgaWYgKHRoaXMudmlld01vZGUgPT09ICJzMyIpIHsKICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkQnVja2V0KSB7CiAgICAgICAgcmV0dXJuIGh0bWw4YAogICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudC1hcmVhIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiPgogICAgICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMiAxOWEyIDIgMCAwIDEtMiAySDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoNWwyIDNoOWEyIDIgMCAwIDEgMiAyeiI+PC9wYXRoPgogICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDxwPlNlbGVjdCBhIGJ1Y2tldCB0byBicm93c2U8L3A+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgYDsKICAgICAgfQogICAgICByZXR1cm4gaHRtbDhgCiAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudC1hcmVhIj4KICAgICAgICAgIDxkZWVzLXMzLWJyb3dzZXIKICAgICAgICAgICAgLmRhdGFQcm92aWRlcj0ke3MzRGF0YVByb3ZpZGVyfQogICAgICAgICAgICAuYnVja2V0TmFtZT0ke3RoaXMuc2VsZWN0ZWRCdWNrZXR9CiAgICAgICAgICAgIC5vbkNoYW5nZUV2ZW50PSR7KGNhbGxiYWNrKSA9PiB7CiAgICAgICAgY29uc3Qgc3ViMiA9IGNoYW5nZVN0cmVhbVNlcnZpY2UuZ2V0QnVja2V0Q2hhbmdlcyh0aGlzLnNlbGVjdGVkQnVja2V0KS5zdWJzY3JpYmUoY2FsbGJhY2spOwogICAgICAgIHJldHVybiAoKSA9PiBzdWIyLnVuc3Vic2NyaWJlKCk7CiAgICAgIH19CiAgICAgICAgICA+PC9kZWVzLXMzLWJyb3dzZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIGA7CiAgICB9CiAgICBpZiAodGhpcy52aWV3TW9kZSA9PT0gIm1vbmdvIikgewogICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2xsZWN0aW9uKSB7CiAgICAgICAgcmV0dXJuIGh0bWw4YAogICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudC1hcmVhIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiPgogICAgICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj4KICAgICAgICAgICAgICAgIDxlbGxpcHNlIGN4PSIxMiIgY3k9IjUiIHJ4PSI5IiByeT0iMyI+PC9lbGxpcHNlPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIxIDEyYzAgMS42Ni00IDMtOSAzcy05LTEuMzQtOS0zIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMyA1djE0YzAgMS42NiA0IDMgOSAzczktMS4zNCA5LTNWNSI+PC9wYXRoPgogICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDxwPlNlbGVjdCBhIGNvbGxlY3Rpb24gdG8gdmlldyBkb2N1bWVudHM8L3A+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgYDsKICAgICAgfQogICAgICBpZiAodGhpcy5zZWxlY3RlZENvbGxlY3Rpb24gPT09ICJfX292ZXJ2aWV3X18iKSB7CiAgICAgICAgcmV0dXJuIGh0bWw4YAogICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudC1hcmVhIj4KICAgICAgICAgICAgPHRzdmlldy1tb25nby1kYi1vdmVydmlldwogICAgICAgICAgICAgIC5kYXRhYmFzZU5hbWU9JHt0aGlzLnNlbGVjdGVkRGF0YWJhc2V9CiAgICAgICAgICAgID48L3Rzdmlldy1tb25nby1kYi1vdmVydmlldz4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGA7CiAgICAgIH0KICAgICAgcmV0dXJuIGh0bWw4YAogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQtYXJlYSI+CiAgICAgICAgICA8dHN2aWV3LW1vbmdvLWJyb3dzZXIKICAgICAgICAgICAgLmRhdGFiYXNlTmFtZT0ke3RoaXMuc2VsZWN0ZWREYXRhYmFzZX0KICAgICAgICAgICAgLmNvbGxlY3Rpb25OYW1lPSR7dGhpcy5zZWxlY3RlZENvbGxlY3Rpb259CiAgICAgICAgICA+PC90c3ZpZXctbW9uZ28tYnJvd3Nlcj4KICAgICAgICA8L2Rpdj4KICAgICAgYDsKICAgIH0KICAgIGlmICh0aGlzLnZpZXdNb2RlID09PSAiYWN0aXZpdHkiKSB7CiAgICAgIHJldHVybiBodG1sOGAKICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50LWFyZWEiIHN0eWxlPSJwYWRkaW5nOiAwOyI+CiAgICAgICAgICA8dHN2aWV3LWFjdGl2aXR5LXN0cmVhbQogICAgICAgICAgICBAbmF2aWdhdGUtdG8tbW9uZ289JHt0aGlzLmhhbmRsZU5hdmlnYXRlVG9Nb25nb30KICAgICAgICAgICAgQG5hdmlnYXRlLXRvLXMzPSR7dGhpcy5oYW5kbGVOYXZpZ2F0ZVRvUzN9CiAgICAgICAgICA+PC90c3ZpZXctYWN0aXZpdHktc3RyZWFtPgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgfQogICAgcmV0dXJuIGh0bWw4YAogICAgICA8ZGl2IGNsYXNzPSJjb250ZW50LWFyZWEiPgogICAgICAgIDxoMj5TZXR0aW5nczwvaDI+CiAgICAgICAgPHA+Q29uZmlndXJhdGlvbiBvcHRpb25zIGNvbWluZyBzb29uLjwvcD4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICBoYW5kbGVOYXZpZ2F0ZVRvTW9uZ28oZTExKSB7CiAgICBjb25zdCB7IGRhdGFiYXNlLCBjb2xsZWN0aW9uLCBkb2N1bWVudElkIH0gPSBlMTEuZGV0YWlsOwogICAgdGhpcy52aWV3TW9kZSA9ICJtb25nbyI7CiAgICB0aGlzLnNlbGVjdGVkRGF0YWJhc2UgPSBkYXRhYmFzZTsKICAgIHRoaXMuc2VsZWN0ZWRDb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKICB9CiAgaGFuZGxlTmF2aWdhdGVUb1MzKGUxMSkgewogICAgY29uc3QgeyBidWNrZXQsIGtleToga2V5MiB9ID0gZTExLmRldGFpbDsKICAgIHRoaXMudmlld01vZGUgPSAiczMiOwogICAgdGhpcy5zZWxlY3RlZEJ1Y2tldCA9IGJ1Y2tldDsKICB9Cn07Cl9pbml0ID0gX19kZWNvcmF0b3JTdGFydChfYTQpOwpfdmlld01vZGUgPSBuZXcgV2Vha01hcCgpOwpfc2VsZWN0ZWRCdWNrZXQgPSBuZXcgV2Vha01hcCgpOwpfc2VsZWN0ZWREYXRhYmFzZSA9IG5ldyBXZWFrTWFwKCk7Cl9zZWxlY3RlZENvbGxlY3Rpb24gPSBuZXcgV2Vha01hcCgpOwpfYnVja2V0cyA9IG5ldyBXZWFrTWFwKCk7Cl9kYXRhYmFzZXMgPSBuZXcgV2Vha01hcCgpOwpfc2hvd0NyZWF0ZUJ1Y2tldERpYWxvZyA9IG5ldyBXZWFrTWFwKCk7Cl9uZXdCdWNrZXROYW1lID0gbmV3IFdlYWtNYXAoKTsKX3Nob3dDcmVhdGVDb2xsZWN0aW9uRGlhbG9nID0gbmV3IFdlYWtNYXAoKTsKX25ld0NvbGxlY3Rpb25OYW1lID0gbmV3IFdlYWtNYXAoKTsKX3Nob3dDcmVhdGVEYXRhYmFzZURpYWxvZyA9IG5ldyBXZWFrTWFwKCk7Cl9uZXdEYXRhYmFzZU5hbWUgPSBuZXcgV2Vha01hcCgpOwpfc2hvd1N5c3RlbURhdGFiYXNlcyA9IG5ldyBXZWFrTWFwKCk7Cl9zaG93UzNDcmVhdGVEaWFsb2cgPSBuZXcgV2Vha01hcCgpOwpfczNDcmVhdGVEaWFsb2dUeXBlID0gbmV3IFdlYWtNYXAoKTsKX3MzQ3JlYXRlRGlhbG9nQnVja2V0ID0gbmV3IFdlYWtNYXAoKTsKX3MzQ3JlYXRlRGlhbG9nTmFtZSA9IG5ldyBXZWFrTWFwKCk7Cl9zaWRlYmFyV2lkdGggPSBuZXcgV2Vha01hcCgpOwpfaXNSZXNpemluZ1NpZGViYXIgPSBuZXcgV2Vha01hcCgpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInZpZXdNb2RlIiwgX3ZpZXdNb2RlX2RlYywgVHN2aWV3QXBwLCBfdmlld01vZGUpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNlbGVjdGVkQnVja2V0IiwgX3NlbGVjdGVkQnVja2V0X2RlYywgVHN2aWV3QXBwLCBfc2VsZWN0ZWRCdWNrZXQpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNlbGVjdGVkRGF0YWJhc2UiLCBfc2VsZWN0ZWREYXRhYmFzZV9kZWMsIFRzdmlld0FwcCwgX3NlbGVjdGVkRGF0YWJhc2UpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNlbGVjdGVkQ29sbGVjdGlvbiIsIF9zZWxlY3RlZENvbGxlY3Rpb25fZGVjLCBUc3ZpZXdBcHAsIF9zZWxlY3RlZENvbGxlY3Rpb24pOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgImJ1Y2tldHMiLCBfYnVja2V0c19kZWMsIFRzdmlld0FwcCwgX2J1Y2tldHMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgImRhdGFiYXNlcyIsIF9kYXRhYmFzZXNfZGVjLCBUc3ZpZXdBcHAsIF9kYXRhYmFzZXMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNob3dDcmVhdGVCdWNrZXREaWFsb2ciLCBfc2hvd0NyZWF0ZUJ1Y2tldERpYWxvZ19kZWMsIFRzdmlld0FwcCwgX3Nob3dDcmVhdGVCdWNrZXREaWFsb2cpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgIm5ld0J1Y2tldE5hbWUiLCBfbmV3QnVja2V0TmFtZV9kZWMsIFRzdmlld0FwcCwgX25ld0J1Y2tldE5hbWUpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNob3dDcmVhdGVDb2xsZWN0aW9uRGlhbG9nIiwgX3Nob3dDcmVhdGVDb2xsZWN0aW9uRGlhbG9nX2RlYywgVHN2aWV3QXBwLCBfc2hvd0NyZWF0ZUNvbGxlY3Rpb25EaWFsb2cpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgIm5ld0NvbGxlY3Rpb25OYW1lIiwgX25ld0NvbGxlY3Rpb25OYW1lX2RlYywgVHN2aWV3QXBwLCBfbmV3Q29sbGVjdGlvbk5hbWUpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNob3dDcmVhdGVEYXRhYmFzZURpYWxvZyIsIF9zaG93Q3JlYXRlRGF0YWJhc2VEaWFsb2dfZGVjLCBUc3ZpZXdBcHAsIF9zaG93Q3JlYXRlRGF0YWJhc2VEaWFsb2cpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgIm5ld0RhdGFiYXNlTmFtZSIsIF9uZXdEYXRhYmFzZU5hbWVfZGVjLCBUc3ZpZXdBcHAsIF9uZXdEYXRhYmFzZU5hbWUpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNob3dTeXN0ZW1EYXRhYmFzZXMiLCBfc2hvd1N5c3RlbURhdGFiYXNlc19kZWMsIFRzdmlld0FwcCwgX3Nob3dTeXN0ZW1EYXRhYmFzZXMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNob3dTM0NyZWF0ZURpYWxvZyIsIF9zaG93UzNDcmVhdGVEaWFsb2dfZGVjLCBUc3ZpZXdBcHAsIF9zaG93UzNDcmVhdGVEaWFsb2cpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInMzQ3JlYXRlRGlhbG9nVHlwZSIsIF9zM0NyZWF0ZURpYWxvZ1R5cGVfZGVjLCBUc3ZpZXdBcHAsIF9zM0NyZWF0ZURpYWxvZ1R5cGUpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInMzQ3JlYXRlRGlhbG9nQnVja2V0IiwgX3MzQ3JlYXRlRGlhbG9nQnVja2V0X2RlYywgVHN2aWV3QXBwLCBfczNDcmVhdGVEaWFsb2dCdWNrZXQpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInMzQ3JlYXRlRGlhbG9nTmFtZSIsIF9zM0NyZWF0ZURpYWxvZ05hbWVfZGVjLCBUc3ZpZXdBcHAsIF9zM0NyZWF0ZURpYWxvZ05hbWUpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNpZGViYXJXaWR0aCIsIF9zaWRlYmFyV2lkdGhfZGVjLCBUc3ZpZXdBcHAsIF9zaWRlYmFyV2lkdGgpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgImlzUmVzaXppbmdTaWRlYmFyIiwgX2lzUmVzaXppbmdTaWRlYmFyX2RlYywgVHN2aWV3QXBwLCBfaXNSZXNpemluZ1NpZGViYXIpOwpUc3ZpZXdBcHAgPSBfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgMCwgIlRzdmlld0FwcCIsIF9Uc3ZpZXdBcHBfZGVjb3JhdG9ycywgVHN2aWV3QXBwKTsKX19wdWJsaWNGaWVsZChUc3ZpZXdBcHAsICJzdHlsZXMiLCBbCiAgY3NzTWFuYWdlcjMuZGVmYXVsdFN0eWxlcywKICB0aGVtZVN0eWxlcywKICBjc3MzYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10c3ZpZXctYmctcHJpbWFyeSwgIzFhMWExYSk7CiAgICAgICAgY29sb3I6ICNlZWU7CiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuYXBwLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDQ4cHggMWZyOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmFwcC1oZWFkZXIgewogICAgICAgIGJhY2tncm91bmQ6ICMxNDE0MTQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMzMzM7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgICBnYXA6IDI0cHg7CiAgICAgIH0KCiAgICAgIC5hcHAtdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgfQoKICAgICAgLmFwcC10aXRsZSBzdmcgewogICAgICAgIHdpZHRoOiAyNHB4OwogICAgICAgIGhlaWdodDogMjRweDsKICAgICAgfQoKICAgICAgLm5hdi10YWJzIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogNHB4OwogICAgICB9CgogICAgICAubmF2LXRhYiB7CiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzOwogICAgICB9CgogICAgICAubmF2LXRhYjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKICAgICAgICBjb2xvcjogI2FhYTsKICAgICAgfQoKICAgICAgLm5hdi10YWIuYWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICAgICAgY29sb3I6ICNlMGUwZTA7CiAgICAgIH0KCiAgICAgIC5hcHAtbWFpbiB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLXNpZGViYXItd2lkdGgsIDI0MHB4KSA0cHggMWZyOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5yZXNpemUtZGl2aWRlciB7CiAgICAgICAgd2lkdGg6IDRweDsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBjdXJzb3I6IGNvbC1yZXNpemU7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzOwogICAgICB9CgogICAgICAucmVzaXplLWRpdmlkZXI6aG92ZXIsCiAgICAgIC5yZXNpemUtZGl2aWRlci5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgICAgfQoKICAgICAgLnNpZGViYXIgewogICAgICAgIGJhY2tncm91bmQ6ICMxZTFlMWU7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzMzMzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICAuc2lkZWJhci1oZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDEycHggMTZweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMzMzOwogICAgICB9CgogICAgICAuc2lkZWJhci1saXN0IHsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLWl0ZW0gewogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1czsKICAgICAgfQoKICAgICAgLnNpZGViYXItaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKICAgICAgfQoKICAgICAgLnNpZGViYXItaXRlbS5zZWxlY3RlZCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgICAgIGNvbG9yOiAjZTBlMGUwOwogICAgICB9CgogICAgICAuc2lkZWJhci1pdGVtIC5jb3VudCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgICAgICBwYWRkaW5nOiAycHggNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5jb250ZW50LWFyZWEgewogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUgc3ZnIHsKICAgICAgICB3aWR0aDogNjRweDsKICAgICAgICBoZWlnaHQ6IDY0cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIC5kYi1ncm91cCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICB9CgogICAgICAuZGItZ3JvdXAtaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICB9CgogICAgICAuZGItZ3JvdXAtaGVhZGVyOmhvdmVyIHsKICAgICAgICBjb2xvcjogI2NjYzsKICAgICAgfQoKICAgICAgLmRiLWdyb3VwLWNvbGxlY3Rpb25zIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDEycHg7CiAgICAgIH0KCiAgICAgIC5jb2xsZWN0aW9uLWl0ZW0gewogICAgICAgIHBhZGRpbmc6IDZweCAxMnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5jb2xsZWN0aW9uLWl0ZW06aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSk7CiAgICAgIH0KCiAgICAgIC5jb2xsZWN0aW9uLWl0ZW0uc2VsZWN0ZWQgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICAgICAgY29sb3I6ICNlMGUwZTA7CiAgICAgIH0KCiAgICAgIC5jcmVhdGUtYnRuIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA2cHg7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgbWFyZ2luOiA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgICAgIGJvcmRlcjogMXB4IGRhc2hlZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGNvbG9yOiAjZTBlMGUwOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7CiAgICAgIH0KCiAgICAgIC5jcmVhdGUtYnRuOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpOwogICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgICB9CgogICAgICAuZGlhbG9nLW92ZXJsYXkgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjcpOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB6LWluZGV4OiAxMDAwOwogICAgICB9CgogICAgICAuZGlhbG9nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMWUxZTFlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICBtaW4td2lkdGg6IDQwMHB4OwogICAgICAgIGJveC1zaGFkb3c6IDAgMjBweCA0MHB4IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgICAgfQoKICAgICAgLmRpYWxvZy10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgLmRpYWxvZy1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6ICMxNDE0MTQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzMzMzsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQoKICAgICAgLmRpYWxvZy1pbnB1dDpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3JkZXItY29sb3I6ICNlMGUwZTA7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctbG9jYXRpb24gewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctaGludCB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgICAgbWFyZ2luLXRvcDogLThweDsKICAgICAgfQoKICAgICAgLmRpYWxvZy1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogMTJweDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAuZGlhbG9nLWJ0biB7CiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctYnRuLWNhbmNlbCB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzQ0NDsKICAgICAgICBjb2xvcjogI2FhYTsKICAgICAgfQoKICAgICAgLmRpYWxvZy1idG4tY2FuY2VsOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAuZGlhbG9nLWJ0bi1jcmVhdGUgewogICAgICAgIGJhY2tncm91bmQ6ICM0MDQwNDA7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAuZGlhbG9nLWJ0bi1jcmVhdGU6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICM1MDUwNTA7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctYnRuLWNyZWF0ZTpkaXNhYmxlZCB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctYnRuLWRlbGV0ZSB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyMzksIDY4LCA2OCwgMC4yKTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZWY0NDQ0OwogICAgICAgIGNvbG9yOiAjZjg3MTcxOwogICAgICB9CgogICAgICAuZGlhbG9nLWJ0bi1kZWxldGU6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjM5LCA2OCwgNjgsIDAuMyk7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLWl0ZW0tY29udGVudCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICB9CgogICAgICAuc2lkZWJhci1pdGVtLW5hbWUgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgYApdKTsKX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDEsIFRzdmlld0FwcCk7CgovLyB0c193ZWIvdXRpbGl0aWVzL2Zvcm1hdHRlcnMudHMKZnVuY3Rpb24gZm9ybWF0U2l6ZShieXRlcykgewogIGlmIChieXRlcyA9PT0gdm9pZCAwIHx8IGJ5dGVzID09PSBudWxsKSByZXR1cm4gIi0iOwogIGlmIChieXRlcyA9PT0gMCkgcmV0dXJuICIwIEIiOwogIGNvbnN0IHVuaXRzMiA9IFsiQiIsICJLQiIsICJNQiIsICJHQiIsICJUQiJdOwogIGxldCBzaXplID0gYnl0ZXM7CiAgbGV0IHVuaXRJbmRleCA9IDA7CiAgd2hpbGUgKHNpemUgPj0gMTAyNCAmJiB1bml0SW5kZXggPCB1bml0czIubGVuZ3RoIC0gMSkgewogICAgc2l6ZSAvPSAxMDI0OwogICAgdW5pdEluZGV4Kys7CiAgfQogIHJldHVybiBgJHtzaXplLnRvRml4ZWQodW5pdEluZGV4ID4gMCA/IDEgOiAwKX0gJHt1bml0czJbdW5pdEluZGV4XX1gOwp9CmZ1bmN0aW9uIGZvcm1hdENvdW50KGNvdW50MikgewogIGlmIChjb3VudDIgPT09IHZvaWQgMCB8fCBjb3VudDIgPT09IG51bGwpIHJldHVybiAiIjsKICBpZiAoY291bnQyID49IDFlNikgcmV0dXJuIGAkeyhjb3VudDIgLyAxZTYpLnRvRml4ZWQoMSl9TWA7CiAgaWYgKGNvdW50MiA+PSAxZTMpIHJldHVybiBgJHsoY291bnQyIC8gMWUzKS50b0ZpeGVkKDEpfUtgOwogIHJldHVybiBjb3VudDIudG9TdHJpbmcoKTsKfQpmdW5jdGlvbiBnZXRGaWxlTmFtZShwYXRoMikgewogIGNvbnN0IHBhcnRzID0gcGF0aDIucmVwbGFjZSgvXC8kLywgIiIpLnNwbGl0KCIvIik7CiAgcmV0dXJuIHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdIHx8IHBhdGgyOwp9CgovLyB0c193ZWIvZWxlbWVudHMvdHN2aWV3LW1vbmdvLWJyb3dzZXIudHMKdmFyIF9pc1N0cmVhbUNvbm5lY3RlZF9kZWMsIF9yZWNlbnRDaGFuZ2VDb3VudF9kZWMsIF9pc1Jlc2l6aW5nRWRpdG9yX2RlYywgX2VkaXRvcldpZHRoX2RlYywgX3N0YXRzX2RlYywgX3NlbGVjdGVkRG9jdW1lbnRJZF9kZWMsIF9hY3RpdmVUYWJfZGVjLCBfY29sbGVjdGlvbk5hbWVfZGVjLCBfZGF0YWJhc2VOYW1lX2RlYywgX2E1LCBfVHN2aWV3TW9uZ29Ccm93c2VyX2RlY29yYXRvcnMsIF9pbml0MiwgX2RhdGFiYXNlTmFtZSwgX2NvbGxlY3Rpb25OYW1lLCBfYWN0aXZlVGFiLCBfc2VsZWN0ZWREb2N1bWVudElkLCBfc3RhdHMsIF9lZGl0b3JXaWR0aCwgX2lzUmVzaXppbmdFZGl0b3IsIF9yZWNlbnRDaGFuZ2VDb3VudCwgX2lzU3RyZWFtQ29ubmVjdGVkOwp2YXIgeyBodG1sOiBodG1sOSwgY3NzOiBjc3M0LCBjc3NNYW5hZ2VyOiBjc3NNYW5hZ2VyNCwgY3VzdG9tRWxlbWVudDogY3VzdG9tRWxlbWVudDMsIHByb3BlcnR5OiBwcm9wZXJ0eTIsIHN0YXRlOiBzdGF0ZTMsIERlZXNFbGVtZW50OiBEZWVzRWxlbWVudDQgfSA9IHBsdWdpbnNfZXhwb3J0czU7Cl9Uc3ZpZXdNb25nb0Jyb3dzZXJfZGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50MygidHN2aWV3LW1vbmdvLWJyb3dzZXIiKV07CnZhciBUc3ZpZXdNb25nb0Jyb3dzZXIgPSBjbGFzcyBleHRlbmRzIChfYTUgPSBEZWVzRWxlbWVudDQsIF9kYXRhYmFzZU5hbWVfZGVjID0gW3Byb3BlcnR5Mih7IHR5cGU6IFN0cmluZyB9KV0sIF9jb2xsZWN0aW9uTmFtZV9kZWMgPSBbcHJvcGVydHkyKHsgdHlwZTogU3RyaW5nIH0pXSwgX2FjdGl2ZVRhYl9kZWMgPSBbc3RhdGUzKCldLCBfc2VsZWN0ZWREb2N1bWVudElkX2RlYyA9IFtzdGF0ZTMoKV0sIF9zdGF0c19kZWMgPSBbc3RhdGUzKCldLCBfZWRpdG9yV2lkdGhfZGVjID0gW3N0YXRlMygpXSwgX2lzUmVzaXppbmdFZGl0b3JfZGVjID0gW3N0YXRlMygpXSwgX3JlY2VudENoYW5nZUNvdW50X2RlYyA9IFtzdGF0ZTMoKV0sIF9pc1N0cmVhbUNvbm5lY3RlZF9kZWMgPSBbc3RhdGUzKCldLCBfYTUpIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2RhdGFiYXNlTmFtZSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQyLCA4LCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDIsIDExLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfY29sbGVjdGlvbk5hbWUsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MiwgMTIsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MiwgMTUsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9hY3RpdmVUYWIsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MiwgMTYsIHRoaXMsICJkb2N1bWVudHMiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MiwgMTksIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9zZWxlY3RlZERvY3VtZW50SWQsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MiwgMjAsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MiwgMjMsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9zdGF0cywgX19ydW5Jbml0aWFsaXplcnMoX2luaXQyLCAyNCwgdGhpcywgbnVsbCkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDIsIDI3LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfZWRpdG9yV2lkdGgsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MiwgMjgsIHRoaXMsIDcwMCkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDIsIDMxLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfaXNSZXNpemluZ0VkaXRvciwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQyLCAzMiwgdGhpcywgZmFsc2UpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQyLCAzNSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3JlY2VudENoYW5nZUNvdW50LCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDIsIDM2LCB0aGlzLCAwKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MiwgMzksIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9pc1N0cmVhbUNvbm5lY3RlZCwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQyLCA0MCwgdGhpcywgZmFsc2UpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQyLCA0MywgdGhpcyk7CiAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJjaGFuZ2VTdWJzY3JpcHRpb24iLCBudWxsKTsKICAgIF9fcHVibGljRmllbGQodGhpcywgImNvbm5lY3Rpb25TdWJzY3JpcHRpb24iLCBudWxsKTsKICAgIF9fcHVibGljRmllbGQodGhpcywgInN0YXJ0RWRpdG9yUmVzaXplIiwgKGUxMSkgPT4gewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy5pc1Jlc2l6aW5nRWRpdG9yID0gdHJ1ZTsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgdGhpcy5oYW5kbGVFZGl0b3JSZXNpemUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5lbmRFZGl0b3JSZXNpemUpOwogICAgfSk7CiAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJoYW5kbGVFZGl0b3JSZXNpemUiLCAoZTExKSA9PiB7CiAgICAgIGlmICghdGhpcy5pc1Jlc2l6aW5nRWRpdG9yKSByZXR1cm47CiAgICAgIGNvbnN0IGNvbnRlbnRFbCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmNvbnRlbnQiKTsKICAgICAgaWYgKCFjb250ZW50RWwpIHJldHVybjsKICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRlbnRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1pbihNYXRoLm1heChjb250YWluZXJSZWN0LnJpZ2h0IC0gZTExLmNsaWVudFgsIDI1MCksIDFlMyk7CiAgICAgIHRoaXMuZWRpdG9yV2lkdGggPSBuZXdXaWR0aDsKICAgIH0pOwogICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiZW5kRWRpdG9yUmVzaXplIiwgKCkgPT4gewogICAgICB0aGlzLmlzUmVzaXppbmdFZGl0b3IgPSBmYWxzZTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgdGhpcy5oYW5kbGVFZGl0b3JSZXNpemUpOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5lbmRFZGl0b3JSZXNpemUpOwogICAgfSk7CiAgfQogIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgIGF3YWl0IHRoaXMubG9hZFN0YXRzKCk7CiAgICB0aGlzLmNvbm5lY3Rpb25TdWJzY3JpcHRpb24gPSBjaGFuZ2VTdHJlYW1TZXJ2aWNlLmNvbm5lY3Rpb25TdGF0dXMkLnN1YnNjcmliZSgoc3RhdHVzKSA9PiB7CiAgICAgIHRoaXMuaXNTdHJlYW1Db25uZWN0ZWQgPSBzdGF0dXMgPT09ICJjb25uZWN0ZWQiOwogICAgfSk7CiAgfQogIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tQ2hhbmdlcygpOwogICAgaWYgKHRoaXMuY29ubmVjdGlvblN1YnNjcmlwdGlvbikgewogICAgICB0aGlzLmNvbm5lY3Rpb25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgdGhpcy5jb25uZWN0aW9uU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgIH0KICB9CiAgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygiZGF0YWJhc2VOYW1lIikgfHwgY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJjb2xsZWN0aW9uTmFtZSIpKSB7CiAgICAgIHRoaXMubG9hZFN0YXRzKCk7CiAgICAgIHRoaXMuc2VsZWN0ZWREb2N1bWVudElkID0gIiI7CiAgICAgIHRoaXMucmVjZW50Q2hhbmdlQ291bnQgPSAwOwogICAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbUNoYW5nZXMoKTsKICAgICAgdGhpcy5zdWJzY3JpYmVUb0NoYW5nZXMoKTsKICAgIH0KICB9CiAgYXN5bmMgc3Vic2NyaWJlVG9DaGFuZ2VzKCkgewogICAgaWYgKCF0aGlzLmRhdGFiYXNlTmFtZSB8fCAhdGhpcy5jb2xsZWN0aW9uTmFtZSkgcmV0dXJuOwogICAgdHJ5IHsKICAgICAgaWYgKCF0aGlzLmNoYW5nZVN1YnNjcmlwdGlvbikgewogICAgICAgIHRoaXMuY2hhbmdlU3Vic2NyaXB0aW9uID0gY2hhbmdlU3RyZWFtU2VydmljZS5nZXRDb2xsZWN0aW9uQ2hhbmdlcyh0aGlzLmRhdGFiYXNlTmFtZSwgdGhpcy5jb2xsZWN0aW9uTmFtZSkuc3Vic2NyaWJlKChldmVudCkgPT4gdGhpcy5oYW5kbGVDaGFuZ2UoZXZlbnQpKTsKICAgICAgfQogICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgY2hhbmdlU3RyZWFtU2VydmljZS5zdWJzY3JpYmVUb0NvbGxlY3Rpb24odGhpcy5kYXRhYmFzZU5hbWUsIHRoaXMuY29sbGVjdGlvbk5hbWUpOwogICAgICB0aGlzLmlzU3RyZWFtQ29ubmVjdGVkID0gc3VjY2VzczsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUud2FybigiW01vbmdvQnJvd3Nlcl0gRmFpbGVkIHRvIHN1YnNjcmliZSB0byBjaGFuZ2VzOiIsIGVycm9yKTsKICAgICAgdGhpcy5pc1N0cmVhbUNvbm5lY3RlZCA9IGZhbHNlOwogICAgfQogIH0KICB1bnN1YnNjcmliZUZyb21DaGFuZ2VzKCkgewogICAgaWYgKHRoaXMuY2hhbmdlU3Vic2NyaXB0aW9uKSB7CiAgICAgIHRoaXMuY2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgIHRoaXMuY2hhbmdlU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgIH0KICAgIGlmICh0aGlzLmRhdGFiYXNlTmFtZSAmJiB0aGlzLmNvbGxlY3Rpb25OYW1lKSB7CiAgICAgIGNoYW5nZVN0cmVhbVNlcnZpY2UudW5zdWJzY3JpYmVGcm9tQ29sbGVjdGlvbih0aGlzLmRhdGFiYXNlTmFtZSwgdGhpcy5jb2xsZWN0aW9uTmFtZSk7CiAgICB9CiAgICB0aGlzLmlzU3RyZWFtQ29ubmVjdGVkID0gZmFsc2U7CiAgfQogIGhhbmRsZUNoYW5nZShldmVudCkgewogICAgY29uc29sZS5sb2coIltNb25nb0Jyb3dzZXJdIFJlY2VpdmVkIGNoYW5nZToiLCBldmVudCk7CiAgICB0aGlzLnJlY2VudENoYW5nZUNvdW50Kys7CiAgICB0aGlzLmxvYWRTdGF0cygpOwogICAgY29uc3QgZG9jdW1lbnRzRWwgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoInRzdmlldy1tb25nby1kb2N1bWVudHMiKTsKICAgIGlmIChkb2N1bWVudHNFbD8ucmVmcmVzaCkgewogICAgICBkb2N1bWVudHNFbC5yZWZyZXNoKCk7CiAgICB9CiAgfQogIGFzeW5jIGxvYWRTdGF0cygpIHsKICAgIGlmICghdGhpcy5kYXRhYmFzZU5hbWUgfHwgIXRoaXMuY29sbGVjdGlvbk5hbWUpIHJldHVybjsKICAgIHRyeSB7CiAgICAgIHRoaXMuc3RhdHMgPSBhd2FpdCBhcGlTZXJ2aWNlLmdldENvbGxlY3Rpb25TdGF0cyh0aGlzLmRhdGFiYXNlTmFtZSwgdGhpcy5jb2xsZWN0aW9uTmFtZSk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgbG9hZGluZyBzdGF0czoiLCBlcnIpOwogICAgICB0aGlzLnN0YXRzID0gbnVsbDsKICAgIH0KICB9CiAgc2V0QWN0aXZlVGFiKHRhYjIpIHsKICAgIHRoaXMuYWN0aXZlVGFiID0gdGFiMjsKICB9CiAgaGFuZGxlRG9jdW1lbnRTZWxlY3RlZChlMTEpIHsKICAgIHRoaXMuc2VsZWN0ZWREb2N1bWVudElkID0gZTExLmRldGFpbC5kb2N1bWVudElkOwogIH0KICByZW5kZXIoKSB7CiAgICByZXR1cm4gaHRtbDlgCiAgICAgIDxkaXYgY2xhc3M9ImJyb3dzZXItY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sbGVjdGlvbi1pbmZvIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbGxlY3Rpb24tdGl0bGUiPiR7dGhpcy5jb2xsZWN0aW9uTmFtZX08L3NwYW4+CiAgICAgICAgICAgICR7dGhpcy5zdGF0cyA/IGh0bWw5YAogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsZWN0aW9uLXN0YXRzIj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC1pdGVtIj4ke2Zvcm1hdENvdW50KHRoaXMuc3RhdHMuY291bnQpfSBkb2NzPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0LWl0ZW0iPiR7Zm9ybWF0U2l6ZSh0aGlzLnN0YXRzLnNpemUpfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC1pdGVtIj4ke3RoaXMuc3RhdHMuaW5kZXhDb3VudH0gaW5kZXhlczwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0cmVhbS1zdGF0dXMiPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdHJlYW0tZG90ICR7dGhpcy5pc1N0cmVhbUNvbm5lY3RlZCA/ICJjb25uZWN0ZWQiIDogIiJ9Ij48L3NwYW4+CiAgICAgICAgICAgICAgJHt0aGlzLmlzU3RyZWFtQ29ubmVjdGVkID8gIkxpdmUiIDogIk9mZmxpbmUifQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgJHt0aGlzLnJlY2VudENoYW5nZUNvdW50ID4gMCA/IGh0bWw5YAogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjaGFuZ2UtaW5kaWNhdG9yIHB1bHNlIj4KICAgICAgICAgICAgICAgICAgICAke3RoaXMucmVjZW50Q2hhbmdlQ291bnR9IGNoYW5nZSR7dGhpcy5yZWNlbnRDaGFuZ2VDb3VudCA+IDEgPyAicyIgOiAiIn0KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJzIj4KICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgIGNsYXNzPSJ0YWIgJHt0aGlzLmFjdGl2ZVRhYiA9PT0gImRvY3VtZW50cyIgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNldEFjdGl2ZVRhYigiZG9jdW1lbnRzIil9CiAgICAgICAgICAgID4KICAgICAgICAgICAgICBEb2N1bWVudHMKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICBjbGFzcz0idGFiICR7dGhpcy5hY3RpdmVUYWIgPT09ICJpbmRleGVzIiA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuc2V0QWN0aXZlVGFiKCJpbmRleGVzIil9CiAgICAgICAgICAgID4KICAgICAgICAgICAgICBJbmRleGVzCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgY2xhc3M9InRhYiAke3RoaXMuYWN0aXZlVGFiID09PSAiYWdncmVnYXRpb24iID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5zZXRBY3RpdmVUYWIoImFnZ3JlZ2F0aW9uIil9CiAgICAgICAgICAgID4KICAgICAgICAgICAgICBBZ2dyZWdhdGlvbgogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50IiBzdHlsZT0iLS1lZGl0b3Itd2lkdGg6ICR7dGhpcy5lZGl0b3JXaWR0aH1weCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtYWluLXBhbmVsIj4KICAgICAgICAgICAgJHt0aGlzLmFjdGl2ZVRhYiA9PT0gImRvY3VtZW50cyIgPyBodG1sOWAKICAgICAgICAgICAgICAgICAgPHRzdmlldy1tb25nby1kb2N1bWVudHMKICAgICAgICAgICAgICAgICAgICAuZGF0YWJhc2VOYW1lPSR7dGhpcy5kYXRhYmFzZU5hbWV9CiAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3Rpb25OYW1lPSR7dGhpcy5jb2xsZWN0aW9uTmFtZX0KICAgICAgICAgICAgICAgICAgICBAZG9jdW1lbnQtc2VsZWN0ZWQ9JHt0aGlzLmhhbmRsZURvY3VtZW50U2VsZWN0ZWR9CiAgICAgICAgICAgICAgICAgID48L3Rzdmlldy1tb25nby1kb2N1bWVudHM+CiAgICAgICAgICAgICAgICBgIDogdGhpcy5hY3RpdmVUYWIgPT09ICJpbmRleGVzIiA/IGh0bWw5YAogICAgICAgICAgICAgICAgICAgIDx0c3ZpZXctbW9uZ28taW5kZXhlcwogICAgICAgICAgICAgICAgICAgICAgLmRhdGFiYXNlTmFtZT0ke3RoaXMuZGF0YWJhc2VOYW1lfQogICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3Rpb25OYW1lPSR7dGhpcy5jb2xsZWN0aW9uTmFtZX0KICAgICAgICAgICAgICAgICAgICA+PC90c3ZpZXctbW9uZ28taW5kZXhlcz4KICAgICAgICAgICAgICAgICAgYCA6IGh0bWw5YAogICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9InBhZGRpbmc6IDI0cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICM2NjY7Ij4KICAgICAgICAgICAgICAgICAgICAgIEFnZ3JlZ2F0aW9uIHBpcGVsaW5lIGJ1aWxkZXIgY29taW5nIHNvb24KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgYH0KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYKICAgICAgICAgICAgY2xhc3M9InJlc2l6ZS1kaXZpZGVyICR7dGhpcy5pc1Jlc2l6aW5nRWRpdG9yID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICAgIEBtb3VzZWRvd249JHt0aGlzLnN0YXJ0RWRpdG9yUmVzaXplfQogICAgICAgICAgPjwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9ImRldGFpbC1wYW5lbCI+CiAgICAgICAgICAgIDx0c3ZpZXctbW9uZ28tZG9jdW1lbnQKICAgICAgICAgICAgICAuZGF0YWJhc2VOYW1lPSR7dGhpcy5kYXRhYmFzZU5hbWV9CiAgICAgICAgICAgICAgLmNvbGxlY3Rpb25OYW1lPSR7dGhpcy5jb2xsZWN0aW9uTmFtZX0KICAgICAgICAgICAgICAuZG9jdW1lbnRJZD0ke3RoaXMuc2VsZWN0ZWREb2N1bWVudElkfQogICAgICAgICAgICA+PC90c3ZpZXctbW9uZ28tZG9jdW1lbnQ+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KfTsKX2luaXQyID0gX19kZWNvcmF0b3JTdGFydChfYTUpOwpfZGF0YWJhc2VOYW1lID0gbmV3IFdlYWtNYXAoKTsKX2NvbGxlY3Rpb25OYW1lID0gbmV3IFdlYWtNYXAoKTsKX2FjdGl2ZVRhYiA9IG5ldyBXZWFrTWFwKCk7Cl9zZWxlY3RlZERvY3VtZW50SWQgPSBuZXcgV2Vha01hcCgpOwpfc3RhdHMgPSBuZXcgV2Vha01hcCgpOwpfZWRpdG9yV2lkdGggPSBuZXcgV2Vha01hcCgpOwpfaXNSZXNpemluZ0VkaXRvciA9IG5ldyBXZWFrTWFwKCk7Cl9yZWNlbnRDaGFuZ2VDb3VudCA9IG5ldyBXZWFrTWFwKCk7Cl9pc1N0cmVhbUNvbm5lY3RlZCA9IG5ldyBXZWFrTWFwKCk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0MiwgNCwgImRhdGFiYXNlTmFtZSIsIF9kYXRhYmFzZU5hbWVfZGVjLCBUc3ZpZXdNb25nb0Jyb3dzZXIsIF9kYXRhYmFzZU5hbWUpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDIsIDQsICJjb2xsZWN0aW9uTmFtZSIsIF9jb2xsZWN0aW9uTmFtZV9kZWMsIFRzdmlld01vbmdvQnJvd3NlciwgX2NvbGxlY3Rpb25OYW1lKTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQyLCA0LCAiYWN0aXZlVGFiIiwgX2FjdGl2ZVRhYl9kZWMsIFRzdmlld01vbmdvQnJvd3NlciwgX2FjdGl2ZVRhYik7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0MiwgNCwgInNlbGVjdGVkRG9jdW1lbnRJZCIsIF9zZWxlY3RlZERvY3VtZW50SWRfZGVjLCBUc3ZpZXdNb25nb0Jyb3dzZXIsIF9zZWxlY3RlZERvY3VtZW50SWQpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDIsIDQsICJzdGF0cyIsIF9zdGF0c19kZWMsIFRzdmlld01vbmdvQnJvd3NlciwgX3N0YXRzKTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQyLCA0LCAiZWRpdG9yV2lkdGgiLCBfZWRpdG9yV2lkdGhfZGVjLCBUc3ZpZXdNb25nb0Jyb3dzZXIsIF9lZGl0b3JXaWR0aCk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0MiwgNCwgImlzUmVzaXppbmdFZGl0b3IiLCBfaXNSZXNpemluZ0VkaXRvcl9kZWMsIFRzdmlld01vbmdvQnJvd3NlciwgX2lzUmVzaXppbmdFZGl0b3IpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDIsIDQsICJyZWNlbnRDaGFuZ2VDb3VudCIsIF9yZWNlbnRDaGFuZ2VDb3VudF9kZWMsIFRzdmlld01vbmdvQnJvd3NlciwgX3JlY2VudENoYW5nZUNvdW50KTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQyLCA0LCAiaXNTdHJlYW1Db25uZWN0ZWQiLCBfaXNTdHJlYW1Db25uZWN0ZWRfZGVjLCBUc3ZpZXdNb25nb0Jyb3dzZXIsIF9pc1N0cmVhbUNvbm5lY3RlZCk7ClRzdmlld01vbmdvQnJvd3NlciA9IF9fZGVjb3JhdGVFbGVtZW50KF9pbml0MiwgMCwgIlRzdmlld01vbmdvQnJvd3NlciIsIF9Uc3ZpZXdNb25nb0Jyb3dzZXJfZGVjb3JhdG9ycywgVHN2aWV3TW9uZ29Ccm93c2VyKTsKX19wdWJsaWNGaWVsZChUc3ZpZXdNb25nb0Jyb3dzZXIsICJzdHlsZXMiLCBbCiAgY3NzTWFuYWdlcjQuZGVmYXVsdFN0eWxlcywKICB0aGVtZVN0eWxlcywKICBjc3M0YAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAuYnJvd3Nlci1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5oZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgIH0KCiAgICAgIC5jb2xsZWN0aW9uLWluZm8gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5jb2xsZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLmNvbGxlY3Rpb24tc3RhdHMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgfQoKICAgICAgLnN0YXQtaXRlbSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNHB4OwogICAgICB9CgogICAgICAudGFicyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDRweDsKICAgICAgfQoKICAgICAgLnRhYiB7CiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1czsKICAgICAgfQoKICAgICAgLnRhYjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKICAgICAgICBjb2xvcjogI2FhYTsKICAgICAgfQoKICAgICAgLnRhYi5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgICAgICBjb2xvcjogI2UwZTBlMDsKICAgICAgfQoKICAgICAgLmNvbnRlbnQgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciA0cHggdmFyKC0tZWRpdG9yLXdpZHRoLCA3MDBweCk7CiAgICAgICAgZ2FwOiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5yZXNpemUtZGl2aWRlciB7CiAgICAgICAgd2lkdGg6IDRweDsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBjdXJzb3I6IGNvbC1yZXNpemU7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzOwogICAgICB9CgogICAgICAucmVzaXplLWRpdmlkZXI6aG92ZXIsCiAgICAgIC5yZXNpemUtZGl2aWRlci5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgICAgfQoKICAgICAgLm1haW4tcGFuZWwgewogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgIH0KCiAgICAgIC5kZXRhaWwtcGFuZWwgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBtYXJnaW4tbGVmdDogMTJweDsKICAgICAgfQoKICAgICAgQG1lZGlhIChtYXgtd2lkdGg6IDEyMDBweCkgewogICAgICAgIC5jb250ZW50IHsKICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgICAgIH0KCiAgICAgICAgLmRldGFpbC1wYW5lbCwKICAgICAgICAucmVzaXplLWRpdmlkZXIgewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5jaGFuZ2UtaW5kaWNhdG9yIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA2cHg7CiAgICAgICAgcGFkZGluZzogNHB4IDhweDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDM0LCAxOTcsIDk0LCAwLjIpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgY29sb3I6ICM0YWRlODA7CiAgICAgIH0KCiAgICAgIC5jaGFuZ2UtaW5kaWNhdG9yLnB1bHNlIHsKICAgICAgICBhbmltYXRpb246IHB1bHNlLWdyZWVuIDFzIGVhc2UtaW4tb3V0OwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIHB1bHNlLWdyZWVuIHsKICAgICAgICAwJSB7IGJhY2tncm91bmQ6IHJnYmEoMzQsIDE5NywgOTQsIDAuNCk7IH0KICAgICAgICAxMDAlIHsgYmFja2dyb3VuZDogcmdiYSgzNCwgMTk3LCA5NCwgMC4yKTsgfQogICAgICB9CgogICAgICAuc3RyZWFtLXN0YXR1cyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgfQoKICAgICAgLnN0cmVhbS1kb3QgewogICAgICAgIHdpZHRoOiA2cHg7CiAgICAgICAgaGVpZ2h0OiA2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJhY2tncm91bmQ6ICM4ODg7CiAgICAgIH0KCiAgICAgIC5zdHJlYW0tZG90LmNvbm5lY3RlZCB7CiAgICAgICAgYmFja2dyb3VuZDogIzIyYzU1ZTsKICAgICAgfQogICAgYApdKTsKX19ydW5Jbml0aWFsaXplcnMoX2luaXQyLCAxLCBUc3ZpZXdNb25nb0Jyb3dzZXIpOwoKLy8gdHNfd2ViL2VsZW1lbnRzL3Rzdmlldy1tb25nby1jb2xsZWN0aW9ucy50cwp2YXIgX2xvYWRpbmdfZGVjLCBfY29sbGVjdGlvbnNfZGVjLCBfc2VsZWN0ZWRDb2xsZWN0aW9uX2RlYzIsIF9kYXRhYmFzZU5hbWVfZGVjMiwgX2E2LCBfVHN2aWV3TW9uZ29Db2xsZWN0aW9uc19kZWNvcmF0b3JzLCBfaW5pdDMsIF9kYXRhYmFzZU5hbWUyLCBfc2VsZWN0ZWRDb2xsZWN0aW9uMiwgX2NvbGxlY3Rpb25zLCBfbG9hZGluZzsKdmFyIHsgaHRtbDogaHRtbDEwLCBjc3M6IGNzczUsIGNzc01hbmFnZXI6IGNzc01hbmFnZXI1LCBjdXN0b21FbGVtZW50OiBjdXN0b21FbGVtZW50NCwgcHJvcGVydHk6IHByb3BlcnR5Mywgc3RhdGU6IHN0YXRlNCwgRGVlc0VsZW1lbnQ6IERlZXNFbGVtZW50NSB9ID0gcGx1Z2luc19leHBvcnRzNTsKdmFyIHsgRGVlc0NvbnRleHRtZW51OiBEZWVzQ29udGV4dG1lbnUzIH0gPSBkaXN0X3RzX3dlYl9leHBvcnRzMjsKX1Rzdmlld01vbmdvQ29sbGVjdGlvbnNfZGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50NCgidHN2aWV3LW1vbmdvLWNvbGxlY3Rpb25zIildOwp2YXIgVHN2aWV3TW9uZ29Db2xsZWN0aW9ucyA9IGNsYXNzIGV4dGVuZHMgKF9hNiA9IERlZXNFbGVtZW50NSwgX2RhdGFiYXNlTmFtZV9kZWMyID0gW3Byb3BlcnR5Myh7IHR5cGU6IFN0cmluZyB9KV0sIF9zZWxlY3RlZENvbGxlY3Rpb25fZGVjMiA9IFtwcm9wZXJ0eTMoeyB0eXBlOiBTdHJpbmcgfSldLCBfY29sbGVjdGlvbnNfZGVjID0gW3N0YXRlNCgpXSwgX2xvYWRpbmdfZGVjID0gW3N0YXRlNCgpXSwgX2E2KSB7CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9kYXRhYmFzZU5hbWUyLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDMsIDgsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MywgMTEsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9zZWxlY3RlZENvbGxlY3Rpb24yLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDMsIDEyLCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDMsIDE1LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfY29sbGVjdGlvbnMsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MywgMTYsIHRoaXMsIFtdKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MywgMTksIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9sb2FkaW5nLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDMsIDIwLCB0aGlzLCBmYWxzZSkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDMsIDIzLCB0aGlzKTsKICB9CiAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgYXdhaXQgdGhpcy5sb2FkQ29sbGVjdGlvbnMoKTsKICB9CiAgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygiZGF0YWJhc2VOYW1lIikpIHsKICAgICAgdGhpcy5sb2FkQ29sbGVjdGlvbnMoKTsKICAgIH0KICB9CiAgYXN5bmMgbG9hZENvbGxlY3Rpb25zKCkgewogICAgaWYgKCF0aGlzLmRhdGFiYXNlTmFtZSkgcmV0dXJuOwogICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTsKICAgIHRyeSB7CiAgICAgIHRoaXMuY29sbGVjdGlvbnMgPSBhd2FpdCBhcGlTZXJ2aWNlLmxpc3RDb2xsZWN0aW9ucyh0aGlzLmRhdGFiYXNlTmFtZSk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgbG9hZGluZyBjb2xsZWN0aW9uczoiLCBlcnIpOwogICAgICB0aGlzLmNvbGxlY3Rpb25zID0gW107CiAgICB9CiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICB9CiAgc2VsZWN0Q29sbGVjdGlvbihuYW1lKSB7CiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoCiAgICAgIG5ldyBDdXN0b21FdmVudCgiY29sbGVjdGlvbi1zZWxlY3RlZCIsIHsKICAgICAgICBkZXRhaWw6IG5hbWUsCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KQogICAgKTsKICB9CiAgYXN5bmMgZGVsZXRlQ29sbGVjdGlvbihuYW1lKSB7CiAgICBpZiAoIWNvbmZpcm0oYERlbGV0ZSBjb2xsZWN0aW9uICIke25hbWV9Ij8gVGhpcyB3aWxsIGRlbGV0ZSBhbGwgZG9jdW1lbnRzLmApKSByZXR1cm47CiAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgYXBpU2VydmljZS5kcm9wQ29sbGVjdGlvbih0aGlzLmRhdGFiYXNlTmFtZSwgbmFtZSk7CiAgICBpZiAoc3VjY2VzcykgewogICAgICB0aGlzLmNvbGxlY3Rpb25zID0gdGhpcy5jb2xsZWN0aW9ucy5maWx0ZXIoKGMxMSkgPT4gYzExLm5hbWUgIT09IG5hbWUpOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoCiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCJjb2xsZWN0aW9uLWRlbGV0ZWQiLCB7CiAgICAgICAgICBkZXRhaWw6IHsgZGF0YWJhc2VOYW1lOiB0aGlzLmRhdGFiYXNlTmFtZSwgY29sbGVjdGlvbk5hbWU6IG5hbWUgfSwKICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgIH0pCiAgICAgICk7CiAgICB9CiAgfQogIGhhbmRsZUNvbGxlY3Rpb25Db250ZXh0TWVudShldmVudCwgY29sbGVjdGlvbikgewogICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgIERlZXNDb250ZXh0bWVudTMub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZXZlbnQsIFsKICAgICAgewogICAgICAgIG5hbWU6ICJWaWV3IERvY3VtZW50cyIsCiAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6ZmlsZVRleHQiLAogICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgdGhpcy5zZWxlY3RDb2xsZWN0aW9uKGNvbGxlY3Rpb24ubmFtZSk7CiAgICAgICAgfQogICAgICB9LAogICAgICB7IGRpdmlkZXI6IHRydWUgfSwKICAgICAgewogICAgICAgIG5hbWU6ICJEZWxldGUgQ29sbGVjdGlvbiIsCiAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6dHJhc2gyIiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQ29sbGVjdGlvbihjb2xsZWN0aW9uLm5hbWUpOwogICAgICAgIH0KICAgICAgfQogICAgXSk7CiAgfQogIGFzeW5jIHJlZnJlc2goKSB7CiAgICBhd2FpdCB0aGlzLmxvYWRDb2xsZWN0aW9ucygpOwogIH0KICBzZWxlY3RPdmVydmlldygpIHsKICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgKICAgICAgbmV3IEN1c3RvbUV2ZW50KCJjb2xsZWN0aW9uLXNlbGVjdGVkIiwgewogICAgICAgIGRldGFpbDogIl9fb3ZlcnZpZXdfXyIsCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KQogICAgKTsKICB9CiAgcmVuZGVyKCkgewogICAgaWYgKHRoaXMubG9hZGluZykgewogICAgICByZXR1cm4gaHRtbDEwYDxkaXYgY2xhc3M9ImxvYWRpbmctc3RhdGUiPkxvYWRpbmcgY29sbGVjdGlvbnMuLi48L2Rpdj5gOwogICAgfQogICAgcmV0dXJuIGh0bWwxMGAKICAgICAgPGRpdiBjbGFzcz0iY29sbGVjdGlvbnMtbGlzdCI+CiAgICAgICAgPGRpdgogICAgICAgICAgY2xhc3M9Im92ZXJ2aWV3LWl0ZW0gJHt0aGlzLnNlbGVjdGVkQ29sbGVjdGlvbiA9PT0gIl9fb3ZlcnZpZXdfXyIgPyAic2VsZWN0ZWQiIDogIiJ9IgogICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5zZWxlY3RPdmVydmlldygpfQogICAgICAgID4KICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj4KICAgICAgICAgICAgPHJlY3QgeD0iMyIgeT0iMyIgd2lkdGg9IjciIGhlaWdodD0iNyI+PC9yZWN0PgogICAgICAgICAgICA8cmVjdCB4PSIxNCIgeT0iMyIgd2lkdGg9IjciIGhlaWdodD0iNyI+PC9yZWN0PgogICAgICAgICAgICA8cmVjdCB4PSIxNCIgeT0iMTQiIHdpZHRoPSI3IiBoZWlnaHQ9IjciPjwvcmVjdD4KICAgICAgICAgICAgPHJlY3QgeD0iMyIgeT0iMTQiIHdpZHRoPSI3IiBoZWlnaHQ9IjciPjwvcmVjdD4KICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgT3ZlcnZpZXcKICAgICAgICA8L2Rpdj4KICAgICAgICAke3RoaXMuY29sbGVjdGlvbnMubGVuZ3RoID09PSAwID8gaHRtbDEwYDxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlIj5ObyBjb2xsZWN0aW9uczwvZGl2PmAgOiB0aGlzLmNvbGxlY3Rpb25zLm1hcCgKICAgICAgKGNvbGwpID0+IGh0bWwxMGAKICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgY2xhc3M9ImNvbGxlY3Rpb24taXRlbSAke3RoaXMuc2VsZWN0ZWRDb2xsZWN0aW9uID09PSBjb2xsLm5hbWUgPyAic2VsZWN0ZWQiIDogIiJ9IgogICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNlbGVjdENvbGxlY3Rpb24oY29sbC5uYW1lKX0KICAgICAgICAgICAgICAgICAgQGNvbnRleHRtZW51PSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVDb2xsZWN0aW9uQ29udGV4dE1lbnUoZTExLCBjb2xsKX0KICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbGxlY3Rpb24tbmFtZSI+CiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz0iY29sbGVjdGlvbi1pY29uIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPgogICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTIyIDE5YTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmg1bDIgM2g5YTIgMiAwIDAgMSAyIDJ6Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgICAgICAgJHtjb2xsLm5hbWV9CiAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgJHtjb2xsLmNvdW50ICE9PSB2b2lkIDAgPyBodG1sMTBgPHNwYW4gY2xhc3M9ImNvbGxlY3Rpb24tY291bnQiPiR7Zm9ybWF0Q291bnQoY29sbC5jb3VudCl9PC9zcGFuPmAgOiAiIn0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIGAKICAgICl9CiAgICAgIDwvZGl2PgogICAgYDsKICB9Cn07Cl9pbml0MyA9IF9fZGVjb3JhdG9yU3RhcnQoX2E2KTsKX2RhdGFiYXNlTmFtZTIgPSBuZXcgV2Vha01hcCgpOwpfc2VsZWN0ZWRDb2xsZWN0aW9uMiA9IG5ldyBXZWFrTWFwKCk7Cl9jb2xsZWN0aW9ucyA9IG5ldyBXZWFrTWFwKCk7Cl9sb2FkaW5nID0gbmV3IFdlYWtNYXAoKTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQzLCA0LCAiZGF0YWJhc2VOYW1lIiwgX2RhdGFiYXNlTmFtZV9kZWMyLCBUc3ZpZXdNb25nb0NvbGxlY3Rpb25zLCBfZGF0YWJhc2VOYW1lMik7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0MywgNCwgInNlbGVjdGVkQ29sbGVjdGlvbiIsIF9zZWxlY3RlZENvbGxlY3Rpb25fZGVjMiwgVHN2aWV3TW9uZ29Db2xsZWN0aW9ucywgX3NlbGVjdGVkQ29sbGVjdGlvbjIpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDMsIDQsICJjb2xsZWN0aW9ucyIsIF9jb2xsZWN0aW9uc19kZWMsIFRzdmlld01vbmdvQ29sbGVjdGlvbnMsIF9jb2xsZWN0aW9ucyk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0MywgNCwgImxvYWRpbmciLCBfbG9hZGluZ19kZWMsIFRzdmlld01vbmdvQ29sbGVjdGlvbnMsIF9sb2FkaW5nKTsKVHN2aWV3TW9uZ29Db2xsZWN0aW9ucyA9IF9fZGVjb3JhdGVFbGVtZW50KF9pbml0MywgMCwgIlRzdmlld01vbmdvQ29sbGVjdGlvbnMiLCBfVHN2aWV3TW9uZ29Db2xsZWN0aW9uc19kZWNvcmF0b3JzLCBUc3ZpZXdNb25nb0NvbGxlY3Rpb25zKTsKX19wdWJsaWNGaWVsZChUc3ZpZXdNb25nb0NvbGxlY3Rpb25zLCAic3R5bGVzIiwgWwogIGNzc01hbmFnZXI1LmRlZmF1bHRTdHlsZXMsCiAgdGhlbWVTdHlsZXMsCiAgY3NzNWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAuY29sbGVjdGlvbnMtbGlzdCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxMnB4OwogICAgICB9CgogICAgICAuY29sbGVjdGlvbi1pdGVtIHsKICAgICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xczsKICAgICAgfQoKICAgICAgLmNvbGxlY3Rpb24taXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKICAgICAgfQoKICAgICAgLmNvbGxlY3Rpb24taXRlbS5zZWxlY3RlZCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgICAgICBjb2xvcjogI2UwZTBlMDsKICAgICAgfQoKICAgICAgLmNvbGxlY3Rpb24tbmFtZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNnB4OwogICAgICB9CgogICAgICAuY29sbGVjdGlvbi1pY29uIHsKICAgICAgICB3aWR0aDogMTRweDsKICAgICAgICBoZWlnaHQ6IDE0cHg7CiAgICAgICAgY29sb3I6ICM4ODg7CiAgICAgIH0KCiAgICAgIC5jb2xsZWN0aW9uLWNvdW50IHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgfQoKICAgICAgLmxvYWRpbmctc3RhdGUgewogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgfQoKICAgICAgLmVtcHR5LXN0YXRlIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICB9CgogICAgICAub3ZlcnZpZXctaXRlbSB7CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNnB4OwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xczsKICAgICAgICBjb2xvcjogI2E1ZDZhNzsKICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICAgIH0KCiAgICAgIC5vdmVydmlldy1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgICB9CgogICAgICAub3ZlcnZpZXctaXRlbS5zZWxlY3RlZCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgxNjUsIDIxNCwgMTY3LCAwLjE1KTsKICAgICAgICBjb2xvcjogI2E1ZDZhNzsKICAgICAgfQoKICAgICAgLm92ZXJ2aWV3LWl0ZW0gc3ZnIHsKICAgICAgICB3aWR0aDogMTRweDsKICAgICAgICBoZWlnaHQ6IDE0cHg7CiAgICAgIH0KICAgIGAKXSk7Cl9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MywgMSwgVHN2aWV3TW9uZ29Db2xsZWN0aW9ucyk7CgovLyB0c193ZWIvZWxlbWVudHMvdHN2aWV3LW1vbmdvLWRvY3VtZW50cy50cwp2YXIgX3NlbGVjdGVkSWRfZGVjLCBfZmlsdGVyVGV4dF9kZWMsIF9sb2FkaW5nX2RlYzIsIF9wYWdlU2l6ZV9kZWMsIF9wYWdlX2RlYywgX3RvdGFsX2RlYywgX2RvY3VtZW50c19kZWMsIF9jb2xsZWN0aW9uTmFtZV9kZWMyLCBfZGF0YWJhc2VOYW1lX2RlYzMsIF9hNywgX1Rzdmlld01vbmdvRG9jdW1lbnRzX2RlY29yYXRvcnMsIF9pbml0NCwgX2RhdGFiYXNlTmFtZTMsIF9jb2xsZWN0aW9uTmFtZTIsIF9kb2N1bWVudHMsIF90b3RhbCwgX3BhZ2UsIF9wYWdlU2l6ZSwgX2xvYWRpbmcyLCBfZmlsdGVyVGV4dCwgX3NlbGVjdGVkSWQ7CnZhciB7IGh0bWw6IGh0bWwxMSwgY3NzOiBjc3M2LCBjc3NNYW5hZ2VyOiBjc3NNYW5hZ2VyNiwgY3VzdG9tRWxlbWVudDogY3VzdG9tRWxlbWVudDUsIHByb3BlcnR5OiBwcm9wZXJ0eTQsIHN0YXRlOiBzdGF0ZTUsIERlZXNFbGVtZW50OiBEZWVzRWxlbWVudDYgfSA9IHBsdWdpbnNfZXhwb3J0czU7CnZhciB7IERlZXNDb250ZXh0bWVudTogRGVlc0NvbnRleHRtZW51NCB9ID0gZGlzdF90c193ZWJfZXhwb3J0czI7Cl9Uc3ZpZXdNb25nb0RvY3VtZW50c19kZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQ1KCJ0c3ZpZXctbW9uZ28tZG9jdW1lbnRzIildOwp2YXIgVHN2aWV3TW9uZ29Eb2N1bWVudHMgPSBjbGFzcyBleHRlbmRzIChfYTcgPSBEZWVzRWxlbWVudDYsIF9kYXRhYmFzZU5hbWVfZGVjMyA9IFtwcm9wZXJ0eTQoeyB0eXBlOiBTdHJpbmcgfSldLCBfY29sbGVjdGlvbk5hbWVfZGVjMiA9IFtwcm9wZXJ0eTQoeyB0eXBlOiBTdHJpbmcgfSldLCBfZG9jdW1lbnRzX2RlYyA9IFtzdGF0ZTUoKV0sIF90b3RhbF9kZWMgPSBbc3RhdGU1KCldLCBfcGFnZV9kZWMgPSBbc3RhdGU1KCldLCBfcGFnZVNpemVfZGVjID0gW3N0YXRlNSgpXSwgX2xvYWRpbmdfZGVjMiA9IFtzdGF0ZTUoKV0sIF9maWx0ZXJUZXh0X2RlYyA9IFtzdGF0ZTUoKV0sIF9zZWxlY3RlZElkX2RlYyA9IFtzdGF0ZTUoKV0sIF9hNykgewogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfZGF0YWJhc2VOYW1lMywgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ0LCA4LCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDQsIDExLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfY29sbGVjdGlvbk5hbWUyLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDQsIDEyLCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDQsIDE1LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfZG9jdW1lbnRzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDQsIDE2LCB0aGlzLCBbXSkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDQsIDE5LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfdG90YWwsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NCwgMjAsIHRoaXMsIDApKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ0LCAyMywgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3BhZ2UsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NCwgMjQsIHRoaXMsIDEpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ0LCAyNywgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3BhZ2VTaXplLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDQsIDI4LCB0aGlzLCA1MCkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDQsIDMxLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfbG9hZGluZzIsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NCwgMzIsIHRoaXMsIGZhbHNlKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NCwgMzUsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9maWx0ZXJUZXh0LCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDQsIDM2LCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDQsIDM5LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfc2VsZWN0ZWRJZCwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ0LCA0MCwgdGhpcywgIiIpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ0LCA0MywgdGhpcyk7CiAgfQogIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgIGF3YWl0IHRoaXMubG9hZERvY3VtZW50cygpOwogIH0KICB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJkYXRhYmFzZU5hbWUiKSB8fCBjaGFuZ2VkUHJvcGVydGllcy5oYXMoImNvbGxlY3Rpb25OYW1lIikpIHsKICAgICAgdGhpcy5wYWdlID0gMTsKICAgICAgdGhpcy5sb2FkRG9jdW1lbnRzKCk7CiAgICB9CiAgfQogIGFzeW5jIGxvYWREb2N1bWVudHMoKSB7CiAgICBpZiAoIXRoaXMuZGF0YWJhc2VOYW1lIHx8ICF0aGlzLmNvbGxlY3Rpb25OYW1lKSByZXR1cm47CiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlOwogICAgdHJ5IHsKICAgICAgbGV0IGZpbHRlcjIgPSB7fTsKICAgICAgaWYgKHRoaXMuZmlsdGVyVGV4dC50cmltKCkpIHsKICAgICAgICB0cnkgewogICAgICAgICAgZmlsdGVyMiA9IEpTT04ucGFyc2UodGhpcy5maWx0ZXJUZXh0KTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBpU2VydmljZS5maW5kRG9jdW1lbnRzKAogICAgICAgIHRoaXMuZGF0YWJhc2VOYW1lLAogICAgICAgIHRoaXMuY29sbGVjdGlvbk5hbWUsCiAgICAgICAgewogICAgICAgICAgZmlsdGVyOiBmaWx0ZXIyLAogICAgICAgICAgc2tpcDogKHRoaXMucGFnZSAtIDEpICogdGhpcy5wYWdlU2l6ZSwKICAgICAgICAgIGxpbWl0OiB0aGlzLnBhZ2VTaXplCiAgICAgICAgfQogICAgICApOwogICAgICB0aGlzLmRvY3VtZW50cyA9IHJlc3VsdC5kb2N1bWVudHM7CiAgICAgIHRoaXMudG90YWwgPSByZXN1bHQudG90YWw7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgbG9hZGluZyBkb2N1bWVudHM6IiwgZXJyKTsKICAgICAgdGhpcy5kb2N1bWVudHMgPSBbXTsKICAgICAgdGhpcy50b3RhbCA9IDA7CiAgICB9CiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICB9CiAgLyoqCiAgICogUHVibGljIG1ldGhvZCB0byByZWZyZXNoIGRvY3VtZW50cyAoY2FsbGVkIGJ5IHBhcmVudCBvbiBjaGFuZ2UgZXZlbnRzKQogICAqLwogIGFzeW5jIHJlZnJlc2goKSB7CiAgICBhd2FpdCB0aGlzLmxvYWREb2N1bWVudHMoKTsKICB9CiAgaGFuZGxlRmlsdGVySW5wdXQoZTExKSB7CiAgICB0aGlzLmZpbHRlclRleHQgPSBlMTEudGFyZ2V0LnZhbHVlOwogIH0KICBoYW5kbGVGaWx0ZXJTdWJtaXQoKSB7CiAgICB0aGlzLnBhZ2UgPSAxOwogICAgdGhpcy5sb2FkRG9jdW1lbnRzKCk7CiAgfQogIGhhbmRsZUtleVByZXNzKGUxMSkgewogICAgaWYgKGUxMS5rZXkgPT09ICJFbnRlciIpIHsKICAgICAgdGhpcy5oYW5kbGVGaWx0ZXJTdWJtaXQoKTsKICAgIH0KICB9CiAgc2VsZWN0RG9jdW1lbnQoZG9jKSB7CiAgICBjb25zdCBpZCA9IGRvYy5faWQgfHwgIiI7CiAgICB0aGlzLnNlbGVjdGVkSWQgPSBpZDsKICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgKICAgICAgbmV3IEN1c3RvbUV2ZW50KCJkb2N1bWVudC1zZWxlY3RlZCIsIHsKICAgICAgICBkZXRhaWw6IHsgZG9jdW1lbnRJZDogaWQsIGRvY3VtZW50OiBkb2MgfSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pCiAgICApOwogIH0KICBnb1RvUGFnZShwYWdlTnVtKSB7CiAgICB0aGlzLnBhZ2UgPSBwYWdlTnVtOwogICAgdGhpcy5sb2FkRG9jdW1lbnRzKCk7CiAgfQogIGdldERvY3VtZW50UHJldmlldyhkb2MpIHsKICAgIGNvbnN0IHByZXZpZXcgPSB7fTsKICAgIGNvbnN0IGtleXMyID0gT2JqZWN0LmtleXMoZG9jKS5maWx0ZXIoKGs0KSA9PiBrNCAhPT0gIl9pZCIpOwogICAgZm9yIChjb25zdCBrZXkyIG9mIGtleXMyLnNsaWNlKDAsIDMpKSB7CiAgICAgIHByZXZpZXdba2V5Ml0gPSBkb2Nba2V5Ml07CiAgICB9CiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocHJldmlldyk7CiAgfQogIGdldCB0b3RhbFBhZ2VzKCkgewogICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLnRvdGFsIC8gdGhpcy5wYWdlU2l6ZSk7CiAgfQogIGFzeW5jIGhhbmRsZUluc2VydE5ldygpIHsKICAgIGNvbnN0IG5ld0RvYyA9IHsKICAgICAgLy8gRGVmYXVsdCBlbXB0eSBkb2N1bWVudAogICAgICBjcmVhdGVkQXQ6ICgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKQogICAgfTsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGluc2VydGVkSWQgPSBhd2FpdCBhcGlTZXJ2aWNlLmluc2VydERvY3VtZW50KAogICAgICAgIHRoaXMuZGF0YWJhc2VOYW1lLAogICAgICAgIHRoaXMuY29sbGVjdGlvbk5hbWUsCiAgICAgICAgbmV3RG9jCiAgICAgICk7CiAgICAgIGF3YWl0IHRoaXMubG9hZERvY3VtZW50cygpOwogICAgICB0aGlzLnNlbGVjdGVkSWQgPSBpbnNlcnRlZElkOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoCiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCJkb2N1bWVudC1zZWxlY3RlZCIsIHsKICAgICAgICAgIGRldGFpbDogeyBkb2N1bWVudElkOiBpbnNlcnRlZElkIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KQogICAgICApOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGluc2VydGluZyBkb2N1bWVudDoiLCBlcnIpOwogICAgfQogIH0KICBoYW5kbGVEb2N1bWVudENvbnRleHRNZW51KGV2ZW50LCBkb2MpIHsKICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICBjb25zdCBkb2NJZCA9IGRvYy5faWQ7CiAgICBEZWVzQ29udGV4dG1lbnU0Lm9wZW5Db250ZXh0TWVudVdpdGhPcHRpb25zKGV2ZW50LCBbCiAgICAgIHsKICAgICAgICBuYW1lOiAiVmlldy9FZGl0IiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTplZGl0IiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIHRoaXMuc2VsZWN0RG9jdW1lbnQoZG9jKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHsKICAgICAgICBuYW1lOiAiQ29weSBhcyBKU09OIiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpjb3B5IiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KEpTT04uc3RyaW5naWZ5KGRvYywgbnVsbCwgMikpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgewogICAgICAgIG5hbWU6ICJEdXBsaWNhdGUiLAogICAgICAgIGljb25OYW1lOiAibHVjaWRlOmNvcHlQbHVzIiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIGNvbnN0IHsgX2lkLCAuLi5kb2NXaXRob3V0SWQgfSA9IGRvYzsKICAgICAgICAgIGNvbnN0IG5ld0RvYyA9IHsgLi4uZG9jV2l0aG91dElkLCBjcmVhdGVkQXQ6ICgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKSB9OwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgaW5zZXJ0ZWRJZCA9IGF3YWl0IGFwaVNlcnZpY2UuaW5zZXJ0RG9jdW1lbnQoCiAgICAgICAgICAgICAgdGhpcy5kYXRhYmFzZU5hbWUsCiAgICAgICAgICAgICAgdGhpcy5jb2xsZWN0aW9uTmFtZSwKICAgICAgICAgICAgICBuZXdEb2MKICAgICAgICAgICAgKTsKICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRG9jdW1lbnRzKCk7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJZCA9IGluc2VydGVkSWQ7CiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgKICAgICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoImRvY3VtZW50LXNlbGVjdGVkIiwgewogICAgICAgICAgICAgICAgZGV0YWlsOiB7IGRvY3VtZW50SWQ6IGluc2VydGVkSWQgfSwKICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICk7CiAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgZHVwbGljYXRpbmcgZG9jdW1lbnQ6IiwgZXJyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICB7CiAgICAgICAgbmFtZTogIkRlbGV0ZSIsCiAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6dHJhc2gyIiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIGlmIChjb25maXJtKGBEZWxldGUgZG9jdW1lbnQgIiR7ZG9jSWR9Ij9gKSkgewogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcGlTZXJ2aWNlLmRlbGV0ZURvY3VtZW50KAogICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2VOYW1lLAogICAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbk5hbWUsCiAgICAgICAgICAgICAgZG9jSWQKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7CiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRG9jdW1lbnRzKCk7CiAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJZCA9PT0gZG9jSWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJZCA9ICIiOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgXSk7CiAgfQogIHJlbmRlcigpIHsKICAgIGNvbnN0IHN0YXJ0UmVjb3JkID0gKHRoaXMucGFnZSAtIDEpICogdGhpcy5wYWdlU2l6ZSArIDE7CiAgICBjb25zdCBlbmRSZWNvcmQgPSBNYXRoLm1pbih0aGlzLnBhZ2UgKiB0aGlzLnBhZ2VTaXplLCB0aGlzLnRvdGFsKTsKICAgIHJldHVybiBodG1sMTFgCiAgICAgIDxkaXYgY2xhc3M9ImRvY3VtZW50cy1jb250YWluZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImZpbHRlci1iYXIiPgogICAgICAgICAgPGlucHV0CiAgICAgICAgICAgIHR5cGU9InRleHQiCiAgICAgICAgICAgIGNsYXNzPSJmaWx0ZXItaW5wdXQiCiAgICAgICAgICAgIHBsYWNlaG9sZGVyPSdGaWx0ZXI6IHsiZmllbGQiOiAidmFsdWUifScKICAgICAgICAgICAgLnZhbHVlPSR7dGhpcy5maWx0ZXJUZXh0fQogICAgICAgICAgICBAaW5wdXQ9JHt0aGlzLmhhbmRsZUZpbHRlcklucHV0fQogICAgICAgICAgICBAa2V5cHJlc3M9JHt0aGlzLmhhbmRsZUtleVByZXNzfQogICAgICAgICAgLz4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZpbHRlci1idG4iIEBjbGljaz0ke3RoaXMuaGFuZGxlRmlsdGVyU3VibWl0fT5BcHBseTwvYnV0dG9uPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJhY3Rpb25zLWJhciI+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhY3Rpb24tYnRuIiBAY2xpY2s9JHt0aGlzLmhhbmRsZUluc2VydE5ld30+KyBJbnNlcnQgRG9jdW1lbnQ8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnRzLWxpc3QiPgogICAgICAgICAgJHt0aGlzLmxvYWRpbmcgPyBodG1sMTFgPGRpdiBjbGFzcz0ibG9hZGluZy1zdGF0ZSI+TG9hZGluZy4uLjwvZGl2PmAgOiB0aGlzLmRvY3VtZW50cy5sZW5ndGggPT09IDAgPyBodG1sMTFgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiPk5vIGRvY3VtZW50cyBmb3VuZDwvZGl2PmAgOiB0aGlzLmRvY3VtZW50cy5tYXAoCiAgICAgIChkb2MpID0+IGh0bWwxMWAKICAgICAgICAgICAgICAgICAgICA8ZGl2CiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZG9jdW1lbnQtcm93ICR7dGhpcy5zZWxlY3RlZElkID09PSBkb2MuX2lkID8gInNlbGVjdGVkIiA6ICIifSIKICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuc2VsZWN0RG9jdW1lbnQoZG9jKX0KICAgICAgICAgICAgICAgICAgICAgIEBjb250ZXh0bWVudT0keyhlMTEpID0+IHRoaXMuaGFuZGxlRG9jdW1lbnRDb250ZXh0TWVudShlMTEsIGRvYyl9CiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnQtaWQiPl9pZDogJHtkb2MuX2lkfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnQtcHJldmlldyI+JHt0aGlzLmdldERvY3VtZW50UHJldmlldyhkb2MpfTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICBgCiAgICApfQogICAgICAgIDwvZGl2PgoKICAgICAgICAke3RoaXMudG90YWwgPiAwID8gaHRtbDExYAogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luYXRpb24iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5hdGlvbi1pbmZvIj4KICAgICAgICAgICAgICAgICAgU2hvd2luZyAke3N0YXJ0UmVjb3JkfS0ke2VuZFJlY29yZH0gb2YgJHt0aGlzLnRvdGFsfQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmF0aW9uLWNvbnRyb2xzIj4KICAgICAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJwYWdlLWJ0biIKICAgICAgICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHt0aGlzLnBhZ2UgPD0gMX0KICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmdvVG9QYWdlKHRoaXMucGFnZSAtIDEpfQogICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgUHJldmlvdXMKICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgICAgICBjbGFzcz0icGFnZS1idG4iCiAgICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7dGhpcy5wYWdlID49IHRoaXMudG90YWxQYWdlc30KICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmdvVG9QYWdlKHRoaXMucGFnZSArIDEpfQogICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgTmV4dAogICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgIDogIiJ9CiAgICAgIDwvZGl2PgogICAgYDsKICB9Cn07Cl9pbml0NCA9IF9fZGVjb3JhdG9yU3RhcnQoX2E3KTsKX2RhdGFiYXNlTmFtZTMgPSBuZXcgV2Vha01hcCgpOwpfY29sbGVjdGlvbk5hbWUyID0gbmV3IFdlYWtNYXAoKTsKX2RvY3VtZW50cyA9IG5ldyBXZWFrTWFwKCk7Cl90b3RhbCA9IG5ldyBXZWFrTWFwKCk7Cl9wYWdlID0gbmV3IFdlYWtNYXAoKTsKX3BhZ2VTaXplID0gbmV3IFdlYWtNYXAoKTsKX2xvYWRpbmcyID0gbmV3IFdlYWtNYXAoKTsKX2ZpbHRlclRleHQgPSBuZXcgV2Vha01hcCgpOwpfc2VsZWN0ZWRJZCA9IG5ldyBXZWFrTWFwKCk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NCwgNCwgImRhdGFiYXNlTmFtZSIsIF9kYXRhYmFzZU5hbWVfZGVjMywgVHN2aWV3TW9uZ29Eb2N1bWVudHMsIF9kYXRhYmFzZU5hbWUzKTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ0LCA0LCAiY29sbGVjdGlvbk5hbWUiLCBfY29sbGVjdGlvbk5hbWVfZGVjMiwgVHN2aWV3TW9uZ29Eb2N1bWVudHMsIF9jb2xsZWN0aW9uTmFtZTIpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDQsIDQsICJkb2N1bWVudHMiLCBfZG9jdW1lbnRzX2RlYywgVHN2aWV3TW9uZ29Eb2N1bWVudHMsIF9kb2N1bWVudHMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDQsIDQsICJ0b3RhbCIsIF90b3RhbF9kZWMsIFRzdmlld01vbmdvRG9jdW1lbnRzLCBfdG90YWwpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDQsIDQsICJwYWdlIiwgX3BhZ2VfZGVjLCBUc3ZpZXdNb25nb0RvY3VtZW50cywgX3BhZ2UpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDQsIDQsICJwYWdlU2l6ZSIsIF9wYWdlU2l6ZV9kZWMsIFRzdmlld01vbmdvRG9jdW1lbnRzLCBfcGFnZVNpemUpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDQsIDQsICJsb2FkaW5nIiwgX2xvYWRpbmdfZGVjMiwgVHN2aWV3TW9uZ29Eb2N1bWVudHMsIF9sb2FkaW5nMik7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NCwgNCwgImZpbHRlclRleHQiLCBfZmlsdGVyVGV4dF9kZWMsIFRzdmlld01vbmdvRG9jdW1lbnRzLCBfZmlsdGVyVGV4dCk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NCwgNCwgInNlbGVjdGVkSWQiLCBfc2VsZWN0ZWRJZF9kZWMsIFRzdmlld01vbmdvRG9jdW1lbnRzLCBfc2VsZWN0ZWRJZCk7ClRzdmlld01vbmdvRG9jdW1lbnRzID0gX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ0LCAwLCAiVHN2aWV3TW9uZ29Eb2N1bWVudHMiLCBfVHN2aWV3TW9uZ29Eb2N1bWVudHNfZGVjb3JhdG9ycywgVHN2aWV3TW9uZ29Eb2N1bWVudHMpOwpfX3B1YmxpY0ZpZWxkKFRzdmlld01vbmdvRG9jdW1lbnRzLCAic3R5bGVzIiwgWwogIGNzc01hbmFnZXI2LmRlZmF1bHRTdHlsZXMsCiAgdGhlbWVTdHlsZXMsCiAgY3NzNmAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuZG9jdW1lbnRzLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmZpbHRlci1iYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMzMzM7CiAgICAgIH0KCiAgICAgIC5maWx0ZXItaW5wdXQgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM0NDQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICB9CgogICAgICAuZmlsdGVyLWlucHV0OmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJvcmRlci1jb2xvcjogIzQwNDA0MDsKICAgICAgfQoKICAgICAgLmZpbHRlci1pbnB1dDo6cGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAuZmlsdGVyLWJ0biB7CiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM0MDQwNDA7CiAgICAgICAgY29sb3I6ICNlMGUwZTA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgIC5maWx0ZXItYnRuOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpOwogICAgICB9CgogICAgICAuZG9jdW1lbnRzLWxpc3QgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgIH0KCiAgICAgIC5kb2N1bWVudC1yb3cgewogICAgICAgIHBhZGRpbmc6IDEwcHggMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzOwogICAgICB9CgogICAgICAuZG9jdW1lbnQtcm93OmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgICB9CgogICAgICAuZG9jdW1lbnQtcm93LnNlbGVjdGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSk7CiAgICAgIH0KCiAgICAgIC5kb2N1bWVudC1pZCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAjZTBlMGUwOwogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNHB4OwogICAgICB9CgogICAgICAuZG9jdW1lbnQtcHJldmlldyB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLnBhZ2luYXRpb24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgIzMzMzsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6ICM4ODg7CiAgICAgIH0KCiAgICAgIC5wYWdpbmF0aW9uLWluZm8gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgfQoKICAgICAgLnBhZ2luYXRpb24tY29udHJvbHMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgIH0KCiAgICAgIC5wYWdlLWJ0biB7CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzQ0NDsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgfQoKICAgICAgLnBhZ2UtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgICAgICBib3JkZXItY29sb3I6ICM2NjY7CiAgICAgICAgY29sb3I6ICNhYWE7CiAgICAgIH0KCiAgICAgIC5wYWdlLWJ0bjpkaXNhYmxlZCB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAyMDBweDsKICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgfQoKICAgICAgLmxvYWRpbmctc3RhdGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBoZWlnaHQ6IDIwMHB4OwogICAgICAgIGNvbG9yOiAjODg4OwogICAgICB9CgogICAgICAuYWN0aW9ucy1iYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzMzMzsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idG4gewogICAgICAgIHBhZGRpbmc6IDZweCAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzQsIDE5NywgOTQsIDAuMik7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzIyYzU1ZTsKICAgICAgICBjb2xvcjogIzRhZGU4MDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idG46aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzQsIDE5NywgOTQsIDAuMyk7CiAgICAgIH0KICAgIGAKXSk7Cl9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NCwgMSwgVHN2aWV3TW9uZ29Eb2N1bWVudHMpOwoKLy8gdHNfd2ViL2VsZW1lbnRzL3Rzdmlldy1tb25nby1kb2N1bWVudC50cwp2YXIgX2Vycm9yX2RlYywgX2hhc0NoYW5nZXNfZGVjLCBfb3JpZ2luYWxDb250ZW50X2RlYywgX2VkaXRpbmdfZGVjLCBfbG9hZGluZ19kZWMzLCBfZG9jdW1lbnRfZGVjLCBfZG9jdW1lbnRJZF9kZWMsIF9jb2xsZWN0aW9uTmFtZV9kZWMzLCBfZGF0YWJhc2VOYW1lX2RlYzQsIF9hOCwgX1Rzdmlld01vbmdvRG9jdW1lbnRfZGVjb3JhdG9ycywgX2luaXQ1LCBfZGF0YWJhc2VOYW1lNCwgX2NvbGxlY3Rpb25OYW1lMywgX2RvY3VtZW50SWQsIF9kb2N1bWVudCwgX2xvYWRpbmczLCBfZWRpdGluZywgX29yaWdpbmFsQ29udGVudCwgX2hhc0NoYW5nZXMsIF9lcnJvcjsKdmFyIHsgaHRtbDogaHRtbDEyLCBjc3M6IGNzczcsIGNzc01hbmFnZXI6IGNzc01hbmFnZXI3LCBjdXN0b21FbGVtZW50OiBjdXN0b21FbGVtZW50NiwgcHJvcGVydHk6IHByb3BlcnR5NSwgc3RhdGU6IHN0YXRlNiwgRGVlc0VsZW1lbnQ6IERlZXNFbGVtZW50NyB9ID0gcGx1Z2luc19leHBvcnRzNTsKX1Rzdmlld01vbmdvRG9jdW1lbnRfZGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50NigidHN2aWV3LW1vbmdvLWRvY3VtZW50IildOwp2YXIgVHN2aWV3TW9uZ29Eb2N1bWVudCA9IGNsYXNzIGV4dGVuZHMgKF9hOCA9IERlZXNFbGVtZW50NywgX2RhdGFiYXNlTmFtZV9kZWM0ID0gW3Byb3BlcnR5NSh7IHR5cGU6IFN0cmluZyB9KV0sIF9jb2xsZWN0aW9uTmFtZV9kZWMzID0gW3Byb3BlcnR5NSh7IHR5cGU6IFN0cmluZyB9KV0sIF9kb2N1bWVudElkX2RlYyA9IFtwcm9wZXJ0eTUoeyB0eXBlOiBTdHJpbmcgfSldLCBfZG9jdW1lbnRfZGVjID0gW3N0YXRlNigpXSwgX2xvYWRpbmdfZGVjMyA9IFtzdGF0ZTYoKV0sIF9lZGl0aW5nX2RlYyA9IFtzdGF0ZTYoKV0sIF9vcmlnaW5hbENvbnRlbnRfZGVjID0gW3N0YXRlNigpXSwgX2hhc0NoYW5nZXNfZGVjID0gW3N0YXRlNigpXSwgX2Vycm9yX2RlYyA9IFtzdGF0ZTYoKV0sIF9hOCkgewogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfZGF0YWJhc2VOYW1lNCwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ1LCA4LCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDUsIDExLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfY29sbGVjdGlvbk5hbWUzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDUsIDEyLCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDUsIDE1LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfZG9jdW1lbnRJZCwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ1LCAxNiwgdGhpcywgIiIpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ1LCAxOSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2RvY3VtZW50LCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDUsIDIwLCB0aGlzLCBudWxsKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NSwgMjMsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9sb2FkaW5nMywgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ1LCAyNCwgdGhpcywgZmFsc2UpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ1LCAyNywgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2VkaXRpbmcsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NSwgMjgsIHRoaXMsIGZhbHNlKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NSwgMzEsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9vcmlnaW5hbENvbnRlbnQsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NSwgMzIsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NSwgMzUsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9oYXNDaGFuZ2VzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDUsIDM2LCB0aGlzLCBmYWxzZSkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDUsIDM5LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfZXJyb3IsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NSwgNDAsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NSwgNDMsIHRoaXMpOwogIH0KICB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJkb2N1bWVudElkIikpIHsKICAgICAgdGhpcy5lZGl0aW5nID0gZmFsc2U7CiAgICAgIHRoaXMuaGFzQ2hhbmdlcyA9IGZhbHNlOwogICAgICBpZiAodGhpcy5kb2N1bWVudElkKSB7CiAgICAgICAgdGhpcy5sb2FkRG9jdW1lbnQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmRvY3VtZW50ID0gbnVsbDsKICAgICAgICB0aGlzLm9yaWdpbmFsQ29udGVudCA9ICIiOwogICAgICB9CiAgICB9CiAgfQogIGFzeW5jIGxvYWREb2N1bWVudCgpIHsKICAgIGlmICghdGhpcy5kb2N1bWVudElkIHx8ICF0aGlzLmRhdGFiYXNlTmFtZSB8fCAhdGhpcy5jb2xsZWN0aW9uTmFtZSkgcmV0dXJuOwogICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTsKICAgIHRoaXMuZXJyb3IgPSAiIjsKICAgIHRyeSB7CiAgICAgIHRoaXMuZG9jdW1lbnQgPSBhd2FpdCBhcGlTZXJ2aWNlLmdldERvY3VtZW50KAogICAgICAgIHRoaXMuZGF0YWJhc2VOYW1lLAogICAgICAgIHRoaXMuY29sbGVjdGlvbk5hbWUsCiAgICAgICAgdGhpcy5kb2N1bWVudElkCiAgICAgICk7CiAgICAgIHRoaXMub3JpZ2luYWxDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkodGhpcy5kb2N1bWVudCwgbnVsbCwgMik7CiAgICAgIHRoaXMuaGFzQ2hhbmdlcyA9IGZhbHNlOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGxvYWRpbmcgZG9jdW1lbnQ6IiwgZXJyKTsKICAgICAgdGhpcy5lcnJvciA9ICJGYWlsZWQgdG8gbG9hZCBkb2N1bWVudCI7CiAgICB9CiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICB9CiAgc3RhcnRFZGl0aW5nKCkgewogICAgdGhpcy5lZGl0aW5nID0gdHJ1ZTsKICB9CiAgY2FuY2VsRWRpdGluZygpIHsKICAgIHRoaXMuZWRpdGluZyA9IGZhbHNlOwogICAgY29uc3QgY29kZUVkaXRvciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC1jb2RlIik7CiAgICBpZiAoY29kZUVkaXRvcikgewogICAgICBjb2RlRWRpdG9yLnZhbHVlID0gdGhpcy5vcmlnaW5hbENvbnRlbnQ7CiAgICB9CiAgICB0aGlzLmhhc0NoYW5nZXMgPSBmYWxzZTsKICB9CiAgaGFuZGxlQ29udGVudENoYW5nZShlMTEpIHsKICAgIGNvbnN0IG5ld1ZhbHVlID0gZTExLmRldGFpbDsKICAgIHRoaXMuaGFzQ2hhbmdlcyA9IG5ld1ZhbHVlICE9PSB0aGlzLm9yaWdpbmFsQ29udGVudDsKICB9CiAgaGFuZGxlRGlzY2FyZCgpIHsKICAgIGNvbnN0IGNvZGVFZGl0b3IgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtY29kZSIpOwogICAgaWYgKGNvZGVFZGl0b3IpIHsKICAgICAgY29kZUVkaXRvci52YWx1ZSA9IHRoaXMub3JpZ2luYWxDb250ZW50OwogICAgfQogICAgdGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7CiAgfQogIGFzeW5jIHNhdmVEb2N1bWVudCgpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGNvZGVFZGl0b3IgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtY29kZSIpOwogICAgICBjb25zdCBjb250ZW50MyA9IGNvZGVFZGl0b3I/LnZhbHVlIHx8IHRoaXMub3JpZ2luYWxDb250ZW50OwogICAgICBjb25zdCB1cGRhdGVkRG9jID0gSlNPTi5wYXJzZShjb250ZW50Myk7CiAgICAgIGNvbnN0IHsgX2lkLCAuLi51cGRhdGVGaWVsZHMgfSA9IHVwZGF0ZWREb2M7CiAgICAgIGF3YWl0IGFwaVNlcnZpY2UudXBkYXRlRG9jdW1lbnQoCiAgICAgICAgdGhpcy5kYXRhYmFzZU5hbWUsCiAgICAgICAgdGhpcy5jb2xsZWN0aW9uTmFtZSwKICAgICAgICB0aGlzLmRvY3VtZW50SWQsCiAgICAgICAgdXBkYXRlRmllbGRzCiAgICAgICk7CiAgICAgIHRoaXMuZWRpdGluZyA9IGZhbHNlOwogICAgICB0aGlzLmhhc0NoYW5nZXMgPSBmYWxzZTsKICAgICAgYXdhaXQgdGhpcy5sb2FkRG9jdW1lbnQoKTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KAogICAgICAgIG5ldyBDdXN0b21FdmVudCgiZG9jdW1lbnQtdXBkYXRlZCIsIHsKICAgICAgICAgIGRldGFpbDogeyBkb2N1bWVudElkOiB0aGlzLmRvY3VtZW50SWQgfSwKICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgIH0pCiAgICAgICk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY29uc29sZS5lcnJvcigiRXJyb3Igc2F2aW5nIGRvY3VtZW50OiIsIGVycik7CiAgICAgIHRoaXMuZXJyb3IgPSAiSW52YWxpZCBKU09OIG9yIHNhdmUgZmFpbGVkIjsKICAgIH0KICB9CiAgYXN5bmMgZGVsZXRlRG9jdW1lbnQoKSB7CiAgICBpZiAoIWNvbmZpcm0oIkRlbGV0ZSB0aGlzIGRvY3VtZW50PyIpKSByZXR1cm47CiAgICB0cnkgewogICAgICBhd2FpdCBhcGlTZXJ2aWNlLmRlbGV0ZURvY3VtZW50KAogICAgICAgIHRoaXMuZGF0YWJhc2VOYW1lLAogICAgICAgIHRoaXMuY29sbGVjdGlvbk5hbWUsCiAgICAgICAgdGhpcy5kb2N1bWVudElkCiAgICAgICk7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgKICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoImRvY3VtZW50LWRlbGV0ZWQiLCB7CiAgICAgICAgICBkZXRhaWw6IHsgZG9jdW1lbnRJZDogdGhpcy5kb2N1bWVudElkIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KQogICAgICApOwogICAgICB0aGlzLmRvY3VtZW50ID0gbnVsbDsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBjb25zb2xlLmVycm9yKCJFcnJvciBkZWxldGluZyBkb2N1bWVudDoiLCBlcnIpOwogICAgICB0aGlzLmVycm9yID0gIkRlbGV0ZSBmYWlsZWQiOwogICAgfQogIH0KICByZW5kZXIoKSB7CiAgICBpZiAoIXRoaXMuZG9jdW1lbnRJZCkgewogICAgICByZXR1cm4gaHRtbDEyYAogICAgICAgIDxkaXYgY2xhc3M9ImRvY3VtZW50LWNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+CiAgICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQgMkg2YTIgMiAwIDAgMC0yIDJ2MTZhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0yVjh6IiAvPgogICAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9IjE0IDIgMTQgOCAyMCA4IiAvPgogICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgPHA+U2VsZWN0IGEgZG9jdW1lbnQgdG8gdmlldzwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgfQogICAgaWYgKHRoaXMubG9hZGluZykgewogICAgICByZXR1cm4gaHRtbDEyYAogICAgICAgIDxkaXYgY2xhc3M9ImRvY3VtZW50LWNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2FkaW5nLXN0YXRlIj5Mb2FkaW5nLi4uPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIGA7CiAgICB9CiAgICBpZiAodGhpcy5lcnJvciAmJiAhdGhpcy5kb2N1bWVudCkgewogICAgICByZXR1cm4gaHRtbDEyYAogICAgICAgIDxkaXYgY2xhc3M9ImRvY3VtZW50LWNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJlcnJvci1zdGF0ZSI+JHt0aGlzLmVycm9yfTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgfQogICAgcmV0dXJuIGh0bWwxMmAKICAgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnQtY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImhlYWRlci10aXRsZSI+RG9jdW1lbnQ8L3NwYW4+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItYWN0aW9ucyI+CiAgICAgICAgICAgICR7dGhpcy5lZGl0aW5nID8gdGhpcy5oYXNDaGFuZ2VzID8gaHRtbDEyYAogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImFjdGlvbi1idG4iIEBjbGljaz0ke3RoaXMuaGFuZGxlRGlzY2FyZH0+RGlzY2FyZDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImFjdGlvbi1idG4gcHJpbWFyeSIgQGNsaWNrPSR7dGhpcy5zYXZlRG9jdW1lbnR9PlNhdmU8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgYCA6IGh0bWwxMmAKICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhY3Rpb24tYnRuIiBAY2xpY2s9JHt0aGlzLmNhbmNlbEVkaXRpbmd9PkNhbmNlbDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICBgIDogaHRtbDEyYAogICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhY3Rpb24tYnRuIiBAY2xpY2s9JHt0aGlzLnN0YXJ0RWRpdGluZ30+RWRpdDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhY3Rpb24tYnRuIGRhbmdlciIgQGNsaWNrPSR7dGhpcy5kZWxldGVEb2N1bWVudH0+RGVsZXRlPC9idXR0b24+CiAgICAgICAgICAgICAgICBgfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgICAgPGRlZXMtaW5wdXQtY29kZQogICAgICAgICAgICAudmFsdWU9JHt0aGlzLm9yaWdpbmFsQ29udGVudH0KICAgICAgICAgICAgLmxhbmd1YWdlPSR7Impzb24ifQogICAgICAgICAgICAuZGlzYWJsZWQ9JHshdGhpcy5lZGl0aW5nfQogICAgICAgICAgICBAY29udGVudC1jaGFuZ2U9JHsoZTExKSA9PiB0aGlzLmhhbmRsZUNvbnRlbnRDaGFuZ2UoZTExKX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtY29kZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KfTsKX2luaXQ1ID0gX19kZWNvcmF0b3JTdGFydChfYTgpOwpfZGF0YWJhc2VOYW1lNCA9IG5ldyBXZWFrTWFwKCk7Cl9jb2xsZWN0aW9uTmFtZTMgPSBuZXcgV2Vha01hcCgpOwpfZG9jdW1lbnRJZCA9IG5ldyBXZWFrTWFwKCk7Cl9kb2N1bWVudCA9IG5ldyBXZWFrTWFwKCk7Cl9sb2FkaW5nMyA9IG5ldyBXZWFrTWFwKCk7Cl9lZGl0aW5nID0gbmV3IFdlYWtNYXAoKTsKX29yaWdpbmFsQ29udGVudCA9IG5ldyBXZWFrTWFwKCk7Cl9oYXNDaGFuZ2VzID0gbmV3IFdlYWtNYXAoKTsKX2Vycm9yID0gbmV3IFdlYWtNYXAoKTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ1LCA0LCAiZGF0YWJhc2VOYW1lIiwgX2RhdGFiYXNlTmFtZV9kZWM0LCBUc3ZpZXdNb25nb0RvY3VtZW50LCBfZGF0YWJhc2VOYW1lNCk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NSwgNCwgImNvbGxlY3Rpb25OYW1lIiwgX2NvbGxlY3Rpb25OYW1lX2RlYzMsIFRzdmlld01vbmdvRG9jdW1lbnQsIF9jb2xsZWN0aW9uTmFtZTMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDUsIDQsICJkb2N1bWVudElkIiwgX2RvY3VtZW50SWRfZGVjLCBUc3ZpZXdNb25nb0RvY3VtZW50LCBfZG9jdW1lbnRJZCk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NSwgNCwgImRvY3VtZW50IiwgX2RvY3VtZW50X2RlYywgVHN2aWV3TW9uZ29Eb2N1bWVudCwgX2RvY3VtZW50KTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ1LCA0LCAibG9hZGluZyIsIF9sb2FkaW5nX2RlYzMsIFRzdmlld01vbmdvRG9jdW1lbnQsIF9sb2FkaW5nMyk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NSwgNCwgImVkaXRpbmciLCBfZWRpdGluZ19kZWMsIFRzdmlld01vbmdvRG9jdW1lbnQsIF9lZGl0aW5nKTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ1LCA0LCAib3JpZ2luYWxDb250ZW50IiwgX29yaWdpbmFsQ29udGVudF9kZWMsIFRzdmlld01vbmdvRG9jdW1lbnQsIF9vcmlnaW5hbENvbnRlbnQpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDUsIDQsICJoYXNDaGFuZ2VzIiwgX2hhc0NoYW5nZXNfZGVjLCBUc3ZpZXdNb25nb0RvY3VtZW50LCBfaGFzQ2hhbmdlcyk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NSwgNCwgImVycm9yIiwgX2Vycm9yX2RlYywgVHN2aWV3TW9uZ29Eb2N1bWVudCwgX2Vycm9yKTsKVHN2aWV3TW9uZ29Eb2N1bWVudCA9IF9fZGVjb3JhdGVFbGVtZW50KF9pbml0NSwgMCwgIlRzdmlld01vbmdvRG9jdW1lbnQiLCBfVHN2aWV3TW9uZ29Eb2N1bWVudF9kZWNvcmF0b3JzLCBUc3ZpZXdNb25nb0RvY3VtZW50KTsKX19wdWJsaWNGaWVsZChUc3ZpZXdNb25nb0RvY3VtZW50LCAic3R5bGVzIiwgWwogIGNzc01hbmFnZXI3LmRlZmF1bHRTdHlsZXMsCiAgdGhlbWVTdHlsZXMsCiAgY3NzN2AKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmRvY3VtZW50LWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmhlYWRlciB7CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzMzMzsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAuaGVhZGVyLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLmhlYWRlci1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogOHB4OwogICAgICB9CgogICAgICAuYWN0aW9uLWJ0biB7CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzQ0NDsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXM7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnRuOmhvdmVyIHsKICAgICAgICBib3JkZXItY29sb3I6ICM2NjY7CiAgICAgICAgY29sb3I6ICNhYWE7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnRuLnByaW1hcnkgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgICAgICBib3JkZXItY29sb3I6ICM0MDQwNDA7CiAgICAgICAgY29sb3I6ICNlMGUwZTA7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnRuLnByaW1hcnk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSk7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnRuLmRhbmdlciB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyMzksIDY4LCA2OCwgMC4yKTsKICAgICAgICBib3JkZXItY29sb3I6ICNlZjQ0NDQ7CiAgICAgICAgY29sb3I6ICNmODcxNzE7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnRuLmRhbmdlcjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyMzksIDY4LCA2OCwgMC4zKTsKICAgICAgfQoKICAgICAgLmNvbnRlbnQgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KCiAgICAgIC5jb250ZW50IGRlZXMtaW5wdXQtY29kZSB7CiAgICAgICAgZmxleDogMTsKICAgICAgfQoKICAgICAgLmVtcHR5LXN0YXRlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZSBzdmcgewogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgfQoKICAgICAgLmxvYWRpbmctc3RhdGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgY29sb3I6ICM4ODg7CiAgICAgIH0KCiAgICAgIC5lcnJvci1zdGF0ZSB7CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICBjb2xvcjogI2Y4NzE3MTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KICAgIGAKXSk7Cl9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NSwgMSwgVHN2aWV3TW9uZ29Eb2N1bWVudCk7CgovLyB0c193ZWIvZWxlbWVudHMvdHN2aWV3LW1vbmdvLWluZGV4ZXMudHMKdmFyIF9uZXdJbmRleFNwYXJzZV9kZWMsIF9uZXdJbmRleFVuaXF1ZV9kZWMsIF9uZXdJbmRleEtleXNfZGVjLCBfc2hvd0NyZWF0ZURpYWxvZ19kZWMsIF9sb2FkaW5nX2RlYzQsIF9pbmRleGVzX2RlYywgX2NvbGxlY3Rpb25OYW1lX2RlYzQsIF9kYXRhYmFzZU5hbWVfZGVjNSwgX2E5LCBfVHN2aWV3TW9uZ29JbmRleGVzX2RlY29yYXRvcnMsIF9pbml0NiwgX2RhdGFiYXNlTmFtZTUsIF9jb2xsZWN0aW9uTmFtZTQsIF9pbmRleGVzLCBfbG9hZGluZzQsIF9zaG93Q3JlYXRlRGlhbG9nLCBfbmV3SW5kZXhLZXlzLCBfbmV3SW5kZXhVbmlxdWUsIF9uZXdJbmRleFNwYXJzZTsKdmFyIHsgaHRtbDogaHRtbDEzLCBjc3M6IGNzczgsIGNzc01hbmFnZXI6IGNzc01hbmFnZXI4LCBjdXN0b21FbGVtZW50OiBjdXN0b21FbGVtZW50NywgcHJvcGVydHk6IHByb3BlcnR5Niwgc3RhdGU6IHN0YXRlNywgRGVlc0VsZW1lbnQ6IERlZXNFbGVtZW50OCB9ID0gcGx1Z2luc19leHBvcnRzNTsKX1Rzdmlld01vbmdvSW5kZXhlc19kZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQ3KCJ0c3ZpZXctbW9uZ28taW5kZXhlcyIpXTsKdmFyIFRzdmlld01vbmdvSW5kZXhlcyA9IGNsYXNzIGV4dGVuZHMgKF9hOSA9IERlZXNFbGVtZW50OCwgX2RhdGFiYXNlTmFtZV9kZWM1ID0gW3Byb3BlcnR5Nih7IHR5cGU6IFN0cmluZyB9KV0sIF9jb2xsZWN0aW9uTmFtZV9kZWM0ID0gW3Byb3BlcnR5Nih7IHR5cGU6IFN0cmluZyB9KV0sIF9pbmRleGVzX2RlYyA9IFtzdGF0ZTcoKV0sIF9sb2FkaW5nX2RlYzQgPSBbc3RhdGU3KCldLCBfc2hvd0NyZWF0ZURpYWxvZ19kZWMgPSBbc3RhdGU3KCldLCBfbmV3SW5kZXhLZXlzX2RlYyA9IFtzdGF0ZTcoKV0sIF9uZXdJbmRleFVuaXF1ZV9kZWMgPSBbc3RhdGU3KCldLCBfbmV3SW5kZXhTcGFyc2VfZGVjID0gW3N0YXRlNygpXSwgX2E5KSB7CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9kYXRhYmFzZU5hbWU1LCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDYsIDgsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NiwgMTEsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9jb2xsZWN0aW9uTmFtZTQsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NiwgMTIsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NiwgMTUsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9pbmRleGVzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDYsIDE2LCB0aGlzLCBbXSkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDYsIDE5LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfbG9hZGluZzQsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NiwgMjAsIHRoaXMsIGZhbHNlKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NiwgMjMsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9zaG93Q3JlYXRlRGlhbG9nLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDYsIDI0LCB0aGlzLCBmYWxzZSkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDYsIDI3LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfbmV3SW5kZXhLZXlzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDYsIDI4LCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDYsIDMxLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfbmV3SW5kZXhVbmlxdWUsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NiwgMzIsIHRoaXMsIGZhbHNlKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NiwgMzUsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9uZXdJbmRleFNwYXJzZSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ2LCAzNiwgdGhpcywgZmFsc2UpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ2LCAzOSwgdGhpcyk7CiAgfQogIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgIGF3YWl0IHRoaXMubG9hZEluZGV4ZXMoKTsKICB9CiAgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygiZGF0YWJhc2VOYW1lIikgfHwgY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJjb2xsZWN0aW9uTmFtZSIpKSB7CiAgICAgIHRoaXMubG9hZEluZGV4ZXMoKTsKICAgIH0KICB9CiAgYXN5bmMgbG9hZEluZGV4ZXMoKSB7CiAgICBpZiAoIXRoaXMuZGF0YWJhc2VOYW1lIHx8ICF0aGlzLmNvbGxlY3Rpb25OYW1lKSByZXR1cm47CiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlOwogICAgdHJ5IHsKICAgICAgdGhpcy5pbmRleGVzID0gYXdhaXQgYXBpU2VydmljZS5saXN0SW5kZXhlcyh0aGlzLmRhdGFiYXNlTmFtZSwgdGhpcy5jb2xsZWN0aW9uTmFtZSk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgbG9hZGluZyBpbmRleGVzOiIsIGVycik7CiAgICAgIHRoaXMuaW5kZXhlcyA9IFtdOwogICAgfQogICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgfQogIG9wZW5DcmVhdGVEaWFsb2coKSB7CiAgICB0aGlzLm5ld0luZGV4S2V5cyA9ICIiOwogICAgdGhpcy5uZXdJbmRleFVuaXF1ZSA9IGZhbHNlOwogICAgdGhpcy5uZXdJbmRleFNwYXJzZSA9IGZhbHNlOwogICAgdGhpcy5zaG93Q3JlYXRlRGlhbG9nID0gdHJ1ZTsKICB9CiAgY2xvc2VDcmVhdGVEaWFsb2coKSB7CiAgICB0aGlzLnNob3dDcmVhdGVEaWFsb2cgPSBmYWxzZTsKICB9CiAgYXN5bmMgY3JlYXRlSW5kZXgoKSB7CiAgICB0cnkgewogICAgICBjb25zdCBrZXlzMiA9IEpTT04ucGFyc2UodGhpcy5uZXdJbmRleEtleXMpOwogICAgICBhd2FpdCBhcGlTZXJ2aWNlLmNyZWF0ZUluZGV4KHRoaXMuZGF0YWJhc2VOYW1lLCB0aGlzLmNvbGxlY3Rpb25OYW1lLCBrZXlzMiwgewogICAgICAgIHVuaXF1ZTogdGhpcy5uZXdJbmRleFVuaXF1ZSwKICAgICAgICBzcGFyc2U6IHRoaXMubmV3SW5kZXhTcGFyc2UKICAgICAgfSk7CiAgICAgIHRoaXMuY2xvc2VDcmVhdGVEaWFsb2coKTsKICAgICAgYXdhaXQgdGhpcy5sb2FkSW5kZXhlcygpOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGNyZWF0aW5nIGluZGV4OiIsIGVycik7CiAgICAgIGFsZXJ0KCJJbnZhbGlkIEpTT04gb3IgaW5kZXggY3JlYXRpb24gZmFpbGVkIik7CiAgICB9CiAgfQogIGFzeW5jIGRyb3BJbmRleChpbmRleE5hbWUpIHsKICAgIGlmIChpbmRleE5hbWUgPT09ICJfaWRfIikgewogICAgICBhbGVydCgiQ2Fubm90IGRyb3AgdGhlIF9pZCBpbmRleCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIWNvbmZpcm0oYERyb3AgaW5kZXggIiR7aW5kZXhOYW1lfSI/YCkpIHJldHVybjsKICAgIHRyeSB7CiAgICAgIGF3YWl0IGFwaVNlcnZpY2UuZHJvcEluZGV4KHRoaXMuZGF0YWJhc2VOYW1lLCB0aGlzLmNvbGxlY3Rpb25OYW1lLCBpbmRleE5hbWUpOwogICAgICBhd2FpdCB0aGlzLmxvYWRJbmRleGVzKCk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgZHJvcHBpbmcgaW5kZXg6IiwgZXJyKTsKICAgIH0KICB9CiAgZm9ybWF0S2V5cyhrZXlzMikgewogICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGtleXMyKTsKICB9CiAgcmVuZGVyKCkgewogICAgcmV0dXJuIGh0bWwxM2AKICAgICAgPGRpdiBjbGFzcz0iaW5kZXhlcy1jb250YWluZXIiPgogICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXIiPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY3JlYXRlLWJ0biIgQGNsaWNrPSR7dGhpcy5vcGVuQ3JlYXRlRGlhbG9nfT4rIENyZWF0ZSBJbmRleDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJpbmRleGVzLWxpc3QiPgogICAgICAgICAgJHt0aGlzLmxvYWRpbmcgPyBodG1sMTNgPGRpdiBjbGFzcz0ibG9hZGluZy1zdGF0ZSI+TG9hZGluZy4uLjwvZGl2PmAgOiB0aGlzLmluZGV4ZXMubGVuZ3RoID09PSAwID8gaHRtbDEzYDxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlIj5ObyBpbmRleGVzIGZvdW5kPC9kaXY+YCA6IHRoaXMuaW5kZXhlcy5tYXAoCiAgICAgIChpZHgpID0+IGh0bWwxM2AKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmRleC1jYXJkIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImluZGV4LWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpbmRleC1uYW1lIj4ke2lkeC5uYW1lfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5kZXgtYmFkZ2VzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAke2lkeC51bmlxdWUgPyBodG1sMTNgPHNwYW4gY2xhc3M9ImJhZGdlIHVuaXF1ZSI+dW5pcXVlPC9zcGFuPmAgOiAiIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAke2lkeC5zcGFyc2UgPyBodG1sMTNgPHNwYW4gY2xhc3M9ImJhZGdlIHNwYXJzZSI+c3BhcnNlPC9zcGFuPmAgOiAiIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImluZGV4LWtleXMiPiR7dGhpcy5mb3JtYXRLZXlzKGlkeC5rZXlzKX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImluZGV4LWFjdGlvbnMiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImRyb3AtYnRuIgogICAgICAgICAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD0ke2lkeC5uYW1lID09PSAiX2lkXyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5kcm9wSW5kZXgoaWR4Lm5hbWUpfQogICAgICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgRHJvcAogICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICBgCiAgICApfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgICR7dGhpcy5zaG93Q3JlYXRlRGlhbG9nID8gaHRtbDEzYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctb3ZlcmxheSIgQGNsaWNrPSR7dGhpcy5jbG9zZUNyZWF0ZURpYWxvZ30+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nIiBAY2xpY2s9JHsoZTExKSA9PiBlMTEuc3RvcFByb3BhZ2F0aW9uKCl9PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj5DcmVhdGUgSW5kZXg8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctZmllbGQiPgogICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImRpYWxvZy1sYWJlbCI+SW5kZXggS2V5cyAoSlNPTik8L2xhYmVsPgogICAgICAgICAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJkaWFsb2ctaW5wdXQiCiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9J3siZmllbGQiOiAxfScKICAgICAgICAgICAgICAgICAgICAudmFsdWU9JHt0aGlzLm5ld0luZGV4S2V5c30KICAgICAgICAgICAgICAgICAgICBAaW5wdXQ9JHsoZTExKSA9PiB0aGlzLm5ld0luZGV4S2V5cyA9IGUxMS50YXJnZXQudmFsdWV9CiAgICAgICAgICAgICAgICAgIC8+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctZmllbGQiPgogICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImRpYWxvZy1jaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICAgIC5jaGVja2VkPSR7dGhpcy5uZXdJbmRleFVuaXF1ZX0KICAgICAgICAgICAgICAgICAgICAgIEBjaGFuZ2U9JHsoZTExKSA9PiB0aGlzLm5ld0luZGV4VW5pcXVlID0gZTExLnRhcmdldC5jaGVja2VkfQogICAgICAgICAgICAgICAgICAgIC8+CiAgICAgICAgICAgICAgICAgICAgVW5pcXVlCiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctZmllbGQiPgogICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImRpYWxvZy1jaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICAgIC5jaGVja2VkPSR7dGhpcy5uZXdJbmRleFNwYXJzZX0KICAgICAgICAgICAgICAgICAgICAgIEBjaGFuZ2U9JHsoZTExKSA9PiB0aGlzLm5ld0luZGV4U3BhcnNlID0gZTExLnRhcmdldC5jaGVja2VkfQogICAgICAgICAgICAgICAgICAgIC8+CiAgICAgICAgICAgICAgICAgICAgU3BhcnNlCiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctYWN0aW9ucyI+CiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRpYWxvZy1idG4gc2Vjb25kYXJ5IiBAY2xpY2s9JHt0aGlzLmNsb3NlQ3JlYXRlRGlhbG9nfT5DYW5jZWw8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGlhbG9nLWJ0biBwcmltYXJ5IiBAY2xpY2s9JHt0aGlzLmNyZWF0ZUluZGV4fT5DcmVhdGU8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGAgOiAiIn0KICAgIGA7CiAgfQp9OwpfaW5pdDYgPSBfX2RlY29yYXRvclN0YXJ0KF9hOSk7Cl9kYXRhYmFzZU5hbWU1ID0gbmV3IFdlYWtNYXAoKTsKX2NvbGxlY3Rpb25OYW1lNCA9IG5ldyBXZWFrTWFwKCk7Cl9pbmRleGVzID0gbmV3IFdlYWtNYXAoKTsKX2xvYWRpbmc0ID0gbmV3IFdlYWtNYXAoKTsKX3Nob3dDcmVhdGVEaWFsb2cgPSBuZXcgV2Vha01hcCgpOwpfbmV3SW5kZXhLZXlzID0gbmV3IFdlYWtNYXAoKTsKX25ld0luZGV4VW5pcXVlID0gbmV3IFdlYWtNYXAoKTsKX25ld0luZGV4U3BhcnNlID0gbmV3IFdlYWtNYXAoKTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ2LCA0LCAiZGF0YWJhc2VOYW1lIiwgX2RhdGFiYXNlTmFtZV9kZWM1LCBUc3ZpZXdNb25nb0luZGV4ZXMsIF9kYXRhYmFzZU5hbWU1KTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ2LCA0LCAiY29sbGVjdGlvbk5hbWUiLCBfY29sbGVjdGlvbk5hbWVfZGVjNCwgVHN2aWV3TW9uZ29JbmRleGVzLCBfY29sbGVjdGlvbk5hbWU0KTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ2LCA0LCAiaW5kZXhlcyIsIF9pbmRleGVzX2RlYywgVHN2aWV3TW9uZ29JbmRleGVzLCBfaW5kZXhlcyk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NiwgNCwgImxvYWRpbmciLCBfbG9hZGluZ19kZWM0LCBUc3ZpZXdNb25nb0luZGV4ZXMsIF9sb2FkaW5nNCk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NiwgNCwgInNob3dDcmVhdGVEaWFsb2ciLCBfc2hvd0NyZWF0ZURpYWxvZ19kZWMsIFRzdmlld01vbmdvSW5kZXhlcywgX3Nob3dDcmVhdGVEaWFsb2cpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDYsIDQsICJuZXdJbmRleEtleXMiLCBfbmV3SW5kZXhLZXlzX2RlYywgVHN2aWV3TW9uZ29JbmRleGVzLCBfbmV3SW5kZXhLZXlzKTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ2LCA0LCAibmV3SW5kZXhVbmlxdWUiLCBfbmV3SW5kZXhVbmlxdWVfZGVjLCBUc3ZpZXdNb25nb0luZGV4ZXMsIF9uZXdJbmRleFVuaXF1ZSk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NiwgNCwgIm5ld0luZGV4U3BhcnNlIiwgX25ld0luZGV4U3BhcnNlX2RlYywgVHN2aWV3TW9uZ29JbmRleGVzLCBfbmV3SW5kZXhTcGFyc2UpOwpUc3ZpZXdNb25nb0luZGV4ZXMgPSBfX2RlY29yYXRlRWxlbWVudChfaW5pdDYsIDAsICJUc3ZpZXdNb25nb0luZGV4ZXMiLCBfVHN2aWV3TW9uZ29JbmRleGVzX2RlY29yYXRvcnMsIFRzdmlld01vbmdvSW5kZXhlcyk7Cl9fcHVibGljRmllbGQoVHN2aWV3TW9uZ29JbmRleGVzLCAic3R5bGVzIiwgWwogIGNzc01hbmFnZXI4LmRlZmF1bHRTdHlsZXMsCiAgdGhlbWVTdHlsZXMsCiAgY3NzOGAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuaW5kZXhlcy1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC50b29sYmFyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzMzMzsKICAgICAgfQoKICAgICAgLmNyZWF0ZS1idG4gewogICAgICAgIHBhZGRpbmc6IDhweCAxNnB4OwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzQsIDE5NywgOTQsIDAuMik7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzIyYzU1ZTsKICAgICAgICBjb2xvcjogIzRhZGU4MDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgLmNyZWF0ZS1idG46aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzQsIDE5NywgOTQsIDAuMyk7CiAgICAgIH0KCiAgICAgIC5pbmRleGVzLWxpc3QgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICB9CgogICAgICAuaW5kZXgtY2FyZCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMzMzM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgICAgfQoKICAgICAgLmluZGV4LWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICB9CgogICAgICAuaW5kZXgtbmFtZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgIC5pbmRleC1iYWRnZXMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgIH0KCiAgICAgIC5iYWRnZSB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICAgICAgY29sb3I6ICM4ODg7CiAgICAgIH0KCiAgICAgIC5iYWRnZS51bmlxdWUgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgICAgICBjb2xvcjogI2UwZTBlMDsKICAgICAgfQoKICAgICAgLmJhZGdlLnNwYXJzZSB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTEsIDE5MSwgMzYsIDAuMik7CiAgICAgICAgY29sb3I6ICNmYmJmMjQ7CiAgICAgIH0KCiAgICAgIC5pbmRleC1rZXlzIHsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDEycHg7CiAgICAgIH0KCiAgICAgIC5pbmRleC1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5kcm9wLWJ0biB7CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2VmNDQ0NDsKICAgICAgICBjb2xvcjogI2Y4NzE3MTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgfQoKICAgICAgLmRyb3AtYnRuOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDIzOSwgNjgsIDY4LCAwLjIpOwogICAgICB9CgogICAgICAuZHJvcC1idG46ZGlzYWJsZWQgewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC5sb2FkaW5nLXN0YXRlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAyMDBweDsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgfQoKICAgICAgLyogRGlhbG9nIHN0eWxlcyAqLwogICAgICAuZGlhbG9nLW92ZXJsYXkgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjcpOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB6LWluZGV4OiAxMDAwOwogICAgICB9CgogICAgICAuZGlhbG9nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMWUxZTFlOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMzMzM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgIHdpZHRoOiA0MDBweDsKICAgICAgICBtYXgtd2lkdGg6IDkwJTsKICAgICAgfQoKICAgICAgLmRpYWxvZy10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgfQoKICAgICAgLmRpYWxvZy1maWVsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgfQoKICAgICAgLmRpYWxvZy1sYWJlbCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDZweDsKICAgICAgfQoKICAgICAgLmRpYWxvZy1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM0NDQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICB9CgogICAgICAuZGlhbG9nLWlucHV0OmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJvcmRlci1jb2xvcjogIzQwNDA0MDsKICAgICAgfQoKICAgICAgLmRpYWxvZy1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgLmRpYWxvZy1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMjRweDsKICAgICAgfQoKICAgICAgLmRpYWxvZy1idG4gewogICAgICAgIHBhZGRpbmc6IDhweCAxNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICB9CgogICAgICAuZGlhbG9nLWJ0bi5zZWNvbmRhcnkgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM0NDQ7CiAgICAgICAgY29sb3I6ICM4ODg7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctYnRuLnNlY29uZGFyeTpob3ZlciB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjNjY2OwogICAgICAgIGNvbG9yOiAjYWFhOwogICAgICB9CgogICAgICAuZGlhbG9nLWJ0bi5wcmltYXJ5IHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzQwNDA0MDsKICAgICAgICBjb2xvcjogI2UwZTBlMDsKICAgICAgfQoKICAgICAgLmRpYWxvZy1idG4ucHJpbWFyeTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTsKICAgICAgfQogICAgYApdKTsKX19ydW5Jbml0aWFsaXplcnMoX2luaXQ2LCAxLCBUc3ZpZXdNb25nb0luZGV4ZXMpOwoKLy8gdHNfd2ViL2VsZW1lbnRzL3Rzdmlldy1tb25nby1kYi1vdmVydmlldy50cwp2YXIgX2Vycm9yX2RlYzIsIF9sb2FkaW5nX2RlYzUsIF9zdGF0c19kZWMyLCBfZGF0YWJhc2VOYW1lX2RlYzYsIF9hMTAsIF9Uc3ZpZXdNb25nb0RiT3ZlcnZpZXdfZGVjb3JhdG9ycywgX2luaXQ3LCBfZGF0YWJhc2VOYW1lNiwgX3N0YXRzMiwgX2xvYWRpbmc1LCBfZXJyb3IyOwp2YXIgeyBodG1sOiBodG1sMTQsIGNzczogY3NzOSwgY3NzTWFuYWdlcjogY3NzTWFuYWdlcjksIGN1c3RvbUVsZW1lbnQ6IGN1c3RvbUVsZW1lbnQ4LCBwcm9wZXJ0eTogcHJvcGVydHk3LCBzdGF0ZTogc3RhdGU4LCBEZWVzRWxlbWVudDogRGVlc0VsZW1lbnQ5IH0gPSBwbHVnaW5zX2V4cG9ydHM1OwpfVHN2aWV3TW9uZ29EYk92ZXJ2aWV3X2RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudDgoInRzdmlldy1tb25nby1kYi1vdmVydmlldyIpXTsKdmFyIFRzdmlld01vbmdvRGJPdmVydmlldyA9IGNsYXNzIGV4dGVuZHMgKF9hMTAgPSBEZWVzRWxlbWVudDksIF9kYXRhYmFzZU5hbWVfZGVjNiA9IFtwcm9wZXJ0eTcoeyB0eXBlOiBTdHJpbmcgfSldLCBfc3RhdHNfZGVjMiA9IFtzdGF0ZTgoKV0sIF9sb2FkaW5nX2RlYzUgPSBbc3RhdGU4KCldLCBfZXJyb3JfZGVjMiA9IFtzdGF0ZTgoKV0sIF9hMTApIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2RhdGFiYXNlTmFtZTYsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NywgOCwgdGhpcywgIiIpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ3LCAxMSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3N0YXRzMiwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ3LCAxMiwgdGhpcywgbnVsbCkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDcsIDE1LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfbG9hZGluZzUsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NywgMTYsIHRoaXMsIGZhbHNlKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NywgMTksIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9lcnJvcjIsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NywgMjAsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NywgMjMsIHRoaXMpOwogIH0KICB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJkYXRhYmFzZU5hbWUiKSAmJiB0aGlzLmRhdGFiYXNlTmFtZSkgewogICAgICB0aGlzLmxvYWRTdGF0cygpOwogICAgfQogIH0KICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICBpZiAodGhpcy5kYXRhYmFzZU5hbWUpIHsKICAgICAgYXdhaXQgdGhpcy5sb2FkU3RhdHMoKTsKICAgIH0KICB9CiAgYXN5bmMgbG9hZFN0YXRzKCkgewogICAgaWYgKCF0aGlzLmRhdGFiYXNlTmFtZSkgcmV0dXJuOwogICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTsKICAgIHRoaXMuZXJyb3IgPSAiIjsKICAgIHRyeSB7CiAgICAgIHRoaXMuc3RhdHMgPSBhd2FpdCBhcGlTZXJ2aWNlLmdldERhdGFiYXNlU3RhdHModGhpcy5kYXRhYmFzZU5hbWUpOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGxvYWRpbmcgZGF0YWJhc2Ugc3RhdHM6IiwgZXJyKTsKICAgICAgdGhpcy5lcnJvciA9ICJGYWlsZWQgdG8gbG9hZCBkYXRhYmFzZSBzdGF0aXN0aWNzIjsKICAgIH0KICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogIH0KICByZW5kZXIoKSB7CiAgICBpZiAoIXRoaXMuZGF0YWJhc2VOYW1lKSB7CiAgICAgIHJldHVybiBodG1sMTRgCiAgICAgICAgPGRpdiBjbGFzcz0ib3ZlcnZpZXctY29udGFpbmVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlIj4KICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPgogICAgICAgICAgICAgIDxlbGxpcHNlIGN4PSIxMiIgY3k9IjUiIHJ4PSI5IiByeT0iMyI+PC9lbGxpcHNlPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMSAxMmMwIDEuNjYtNCAzLTkgM3MtOS0xLjM0LTktMyI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zIDV2MTRjMCAxLjY2IDQgMyA5IDNzOS0xLjM0IDktM1Y1Ij48L3BhdGg+CiAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICA8cD5TZWxlY3QgYSBkYXRhYmFzZSB0byB2aWV3IG92ZXJ2aWV3PC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIGA7CiAgICB9CiAgICBpZiAodGhpcy5sb2FkaW5nKSB7CiAgICAgIHJldHVybiBodG1sMTRgCiAgICAgICAgPGRpdiBjbGFzcz0ib3ZlcnZpZXctY29udGFpbmVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxvYWRpbmctc3RhdGUiPkxvYWRpbmcgZGF0YWJhc2Ugc3RhdGlzdGljcy4uLjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgfQogICAgaWYgKHRoaXMuZXJyb3IpIHsKICAgICAgcmV0dXJuIGh0bWwxNGAKICAgICAgICA8ZGl2IGNsYXNzPSJvdmVydmlldy1jb250YWluZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZXJyb3Itc3RhdGUiPiR7dGhpcy5lcnJvcn08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgYDsKICAgIH0KICAgIGlmICghdGhpcy5zdGF0cykgewogICAgICByZXR1cm4gaHRtbDE0YAogICAgICAgIDxkaXYgY2xhc3M9Im92ZXJ2aWV3LWNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+CiAgICAgICAgICAgIDxwPk5vIHN0YXRpc3RpY3MgYXZhaWxhYmxlPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIGA7CiAgICB9CiAgICByZXR1cm4gaHRtbDE0YAogICAgICA8ZGl2IGNsYXNzPSJvdmVydmlldy1jb250YWluZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICA8aDEgY2xhc3M9ImhlYWRlci10aXRsZSI+CiAgICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj4KICAgICAgICAgICAgICA8ZWxsaXBzZSBjeD0iMTIiIGN5PSI1IiByeD0iOSIgcnk9IjMiPjwvZWxsaXBzZT4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMjEgMTJjMCAxLjY2LTQgMy05IDNzLTktMS4zNC05LTMiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMyA1djE0YzAgMS42NiA0IDMgOSAzczktMS4zNCA5LTNWNSI+PC9wYXRoPgogICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgJHt0aGlzLmRhdGFiYXNlTmFtZX0KICAgICAgICAgIDwvaDE+CiAgICAgICAgICA8cCBjbGFzcz0iaGVhZGVyLXN1YnRpdGxlIj5EYXRhYmFzZSBPdmVydmlldzwvcD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5TdG9yYWdlPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0cy1ncmlkIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1jYXJkIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC1sYWJlbCI+Q29sbGVjdGlvbnM8L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtdmFsdWUiPiR7dGhpcy5zdGF0cy5jb2xsZWN0aW9uc308L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtZGVzY3JpcHRpb24iPlRvdGFsIGNvbGxlY3Rpb25zIGluIGRhdGFiYXNlPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1jYXJkIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC1sYWJlbCI+RG9jdW1lbnRzPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0LXZhbHVlIj4ke2Zvcm1hdENvdW50KHRoaXMuc3RhdHMub2JqZWN0cykgfHwgdGhpcy5zdGF0cy5vYmplY3RzfTwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC1kZXNjcmlwdGlvbiI+VG90YWwgZG9jdW1lbnRzIHN0b3JlZDwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtY2FyZCI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtbGFiZWwiPkF2ZyBEb2N1bWVudCBTaXplPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0LXZhbHVlIHNtYWxsIj4ke2Zvcm1hdFNpemUodGhpcy5zdGF0cy5hdmdPYmpTaXplKX08L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtZGVzY3JpcHRpb24iPkF2ZXJhZ2Ugc2l6ZSBwZXIgZG9jdW1lbnQ8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LWNhcmQiPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0LWxhYmVsIj5EYXRhIFNpemU8L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtdmFsdWUgc21hbGwiPiR7Zm9ybWF0U2l6ZSh0aGlzLnN0YXRzLmRhdGFTaXplKX08L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtZGVzY3JpcHRpb24iPlVuY29tcHJlc3NlZCBkYXRhIHNpemU8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LWNhcmQiPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0LWxhYmVsIj5TdG9yYWdlIFNpemU8L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtdmFsdWUgc21hbGwiPiR7Zm9ybWF0U2l6ZSh0aGlzLnN0YXRzLnN0b3JhZ2VTaXplKX08L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtZGVzY3JpcHRpb24iPkFsbG9jYXRlZCBzdG9yYWdlPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPkluZGV4ZXM8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXRzLWdyaWQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LWNhcmQiPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0LWxhYmVsIj5JbmRleCBDb3VudDwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC12YWx1ZSI+JHt0aGlzLnN0YXRzLmluZGV4ZXN9PC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0LWRlc2NyaXB0aW9uIj5Ub3RhbCBpbmRleGVzIGluIGRhdGFiYXNlPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1jYXJkIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC1sYWJlbCI+SW5kZXggU2l6ZTwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC12YWx1ZSBzbWFsbCI+JHtmb3JtYXRTaXplKHRoaXMuc3RhdHMuaW5kZXhTaXplKX08L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtZGVzY3JpcHRpb24iPlRvdGFsIGluZGV4IHN0b3JhZ2U8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICB9Cn07Cl9pbml0NyA9IF9fZGVjb3JhdG9yU3RhcnQoX2ExMCk7Cl9kYXRhYmFzZU5hbWU2ID0gbmV3IFdlYWtNYXAoKTsKX3N0YXRzMiA9IG5ldyBXZWFrTWFwKCk7Cl9sb2FkaW5nNSA9IG5ldyBXZWFrTWFwKCk7Cl9lcnJvcjIgPSBuZXcgV2Vha01hcCgpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDcsIDQsICJkYXRhYmFzZU5hbWUiLCBfZGF0YWJhc2VOYW1lX2RlYzYsIFRzdmlld01vbmdvRGJPdmVydmlldywgX2RhdGFiYXNlTmFtZTYpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDcsIDQsICJzdGF0cyIsIF9zdGF0c19kZWMyLCBUc3ZpZXdNb25nb0RiT3ZlcnZpZXcsIF9zdGF0czIpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDcsIDQsICJsb2FkaW5nIiwgX2xvYWRpbmdfZGVjNSwgVHN2aWV3TW9uZ29EYk92ZXJ2aWV3LCBfbG9hZGluZzUpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDcsIDQsICJlcnJvciIsIF9lcnJvcl9kZWMyLCBUc3ZpZXdNb25nb0RiT3ZlcnZpZXcsIF9lcnJvcjIpOwpUc3ZpZXdNb25nb0RiT3ZlcnZpZXcgPSBfX2RlY29yYXRlRWxlbWVudChfaW5pdDcsIDAsICJUc3ZpZXdNb25nb0RiT3ZlcnZpZXciLCBfVHN2aWV3TW9uZ29EYk92ZXJ2aWV3X2RlY29yYXRvcnMsIFRzdmlld01vbmdvRGJPdmVydmlldyk7Cl9fcHVibGljRmllbGQoVHN2aWV3TW9uZ29EYk92ZXJ2aWV3LCAic3R5bGVzIiwgWwogIGNzc01hbmFnZXI5LmRlZmF1bHRTdHlsZXMsCiAgdGhlbWVTdHlsZXMsCiAgY3NzOWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLm92ZXJ2aWV3LWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgIC5oZWFkZXIgewogICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgIH0KCiAgICAgIC5oZWFkZXItdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMjRweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIG1hcmdpbjogMCAwIDhweCAwOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEycHg7CiAgICAgIH0KCiAgICAgIC5oZWFkZXItdGl0bGUgc3ZnIHsKICAgICAgICB3aWR0aDogMjhweDsKICAgICAgICBoZWlnaHQ6IDI4cHg7CiAgICAgICAgY29sb3I6ICM4ODg7CiAgICAgIH0KCiAgICAgIC5oZWFkZXItc3VidGl0bGUgewogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQoKICAgICAgLnN0YXRzLWdyaWQgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMDBweCwgMWZyKSk7CiAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDMycHg7CiAgICAgIH0KCiAgICAgIC5zdGF0LWNhcmQgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzMzMzsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgIH0KCiAgICAgIC5zdGF0LWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7CiAgICAgICAgY29sb3I6ICM4ODg7CiAgICAgIH0KCiAgICAgIC5zdGF0LXZhbHVlIHsKICAgICAgICBmb250LXNpemU6IDI0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogI2UwZTBlMDsKICAgICAgfQoKICAgICAgLnN0YXQtdmFsdWUuc21hbGwgewogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgfQoKICAgICAgLnN0YXQtZGVzY3JpcHRpb24gewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgfQoKICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgIH0KCiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICAgIHBhZGRpbmctYm90dG9tOiA4cHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMzMzM7CiAgICAgIH0KCiAgICAgIC5sb2FkaW5nLXN0YXRlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQoKICAgICAgLmVycm9yLXN0YXRlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgY29sb3I6ICNmODcxNzE7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZSBzdmcgewogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgfQogICAgYApdKTsKX19ydW5Jbml0aWFsaXplcnMoX2luaXQ3LCAxLCBUc3ZpZXdNb25nb0RiT3ZlcnZpZXcpOwoKLy8gdHNfd2ViL2VsZW1lbnRzL3Rzdmlldy1hY3Rpdml0eS1zdHJlYW0udHMKdmFyIF9ub3dfZGVjLCBfYXV0b1Njcm9sbF9kZWMsIF9pc0xvYWRpbmdfZGVjLCBfaXNDb25uZWN0ZWRfZGVjLCBfZmlsdGVyTW9kZV9kZWMsIF9ldmVudHNfZGVjLCBfYTExLCBfVHN2aWV3QWN0aXZpdHlTdHJlYW1fZGVjb3JhdG9ycywgX2luaXQ4LCBfZXZlbnRzLCBfZmlsdGVyTW9kZSwgX2lzQ29ubmVjdGVkLCBfaXNMb2FkaW5nLCBfYXV0b1Njcm9sbCwgX25vdzsKdmFyIHsgaHRtbDogaHRtbDE1LCBjc3M6IGNzczEwLCBjc3NNYW5hZ2VyOiBjc3NNYW5hZ2VyMTAsIGN1c3RvbUVsZW1lbnQ6IGN1c3RvbUVsZW1lbnQ5LCBwcm9wZXJ0eTogcHJvcGVydHk4LCBzdGF0ZTogc3RhdGU5LCBEZWVzRWxlbWVudDogRGVlc0VsZW1lbnQxMCB9ID0gcGx1Z2luc19leHBvcnRzNTsKX1Rzdmlld0FjdGl2aXR5U3RyZWFtX2RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudDkoInRzdmlldy1hY3Rpdml0eS1zdHJlYW0iKV07CnZhciBUc3ZpZXdBY3Rpdml0eVN0cmVhbSA9IGNsYXNzIGV4dGVuZHMgKF9hMTEgPSBEZWVzRWxlbWVudDEwLCBfZXZlbnRzX2RlYyA9IFtzdGF0ZTkoKV0sIF9maWx0ZXJNb2RlX2RlYyA9IFtzdGF0ZTkoKV0sIF9pc0Nvbm5lY3RlZF9kZWMgPSBbc3RhdGU5KCldLCBfaXNMb2FkaW5nX2RlYyA9IFtzdGF0ZTkoKV0sIF9hdXRvU2Nyb2xsX2RlYyA9IFtzdGF0ZTkoKV0sIF9ub3dfZGVjID0gW3N0YXRlOSgpXSwgX2ExMSkgewogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfZXZlbnRzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDgsIDgsIHRoaXMsIFtdKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0OCwgMTEsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9maWx0ZXJNb2RlLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDgsIDEyLCB0aGlzLCAiYWxsIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDgsIDE1LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfaXNDb25uZWN0ZWQsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0OCwgMTYsIHRoaXMsIGZhbHNlKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0OCwgMTksIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9pc0xvYWRpbmcsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0OCwgMjAsIHRoaXMsIHRydWUpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ4LCAyMywgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2F1dG9TY3JvbGwsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0OCwgMjQsIHRoaXMsIHRydWUpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ4LCAyNywgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX25vdywgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ4LCAyOCwgdGhpcywgRGF0ZS5ub3coKSkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDgsIDMxLCB0aGlzKTsKICAgIF9fcHVibGljRmllbGQodGhpcywgInN1YnNjcmlwdGlvbiIsIG51bGwpOwogICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiY29ubmVjdGlvblN1YnNjcmlwdGlvbiIsIG51bGwpOwogICAgX19wdWJsaWNGaWVsZCh0aGlzLCAibm93SW50ZXJ2YWwiLCBudWxsKTsKICB9CiAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgdGhpcy5ub3dJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgdGhpcy5ub3cgPSBEYXRlLm5vdygpOwogICAgfSwgMWUzKTsKICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVN0cmVhbWluZygpOwogIH0KICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICBpZiAodGhpcy5ub3dJbnRlcnZhbCkgewogICAgICBjbGVhckludGVydmFsKHRoaXMubm93SW50ZXJ2YWwpOwogICAgICB0aGlzLm5vd0ludGVydmFsID0gbnVsbDsKICAgIH0KICAgIHRoaXMuY2xlYW51cCgpOwogIH0KICBhc3luYyBpbml0aWFsaXplU3RyZWFtaW5nKCkgewogICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlOwogICAgdGhpcy5jb25uZWN0aW9uU3Vic2NyaXB0aW9uID0gY2hhbmdlU3RyZWFtU2VydmljZS5jb25uZWN0aW9uU3RhdHVzJC5zdWJzY3JpYmUoYXN5bmMgKHN0YXR1cykgPT4gewogICAgICBjb25zdCB3YXNDb25uZWN0ZWQgPSB0aGlzLmlzQ29ubmVjdGVkOwogICAgICB0aGlzLmlzQ29ubmVjdGVkID0gc3RhdHVzID09PSAiY29ubmVjdGVkIjsKICAgICAgaWYgKHN0YXR1cyA9PT0gImNvbm5lY3RlZCIgJiYgIXdhc0Nvbm5lY3RlZCkgewogICAgICAgIGF3YWl0IHRoaXMuc2V0dXBTdWJzY3JpcHRpb25zKCk7CiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTsKICAgICAgfQogICAgfSk7CiAgICB0cnkgewogICAgICBhd2FpdCBjaGFuZ2VTdHJlYW1TZXJ2aWNlLmNvbm5lY3QoKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBpbml0aWFsaXplIGFjdGl2aXR5IHN0cmVhbToiLCBlcnJvcik7CiAgICAgIHRoaXMuaXNDb25uZWN0ZWQgPSBmYWxzZTsKICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTsKICAgIH0KICB9CiAgYXN5bmMgc2V0dXBTdWJzY3JpcHRpb25zKCkgewogICAgY29uc3QgYnVmZmVyZWQgPSBjaGFuZ2VTdHJlYW1TZXJ2aWNlLmdldEJ1ZmZlcmVkQWN0aXZpdHkoKTsKICAgIGlmIChidWZmZXJlZC5sZW5ndGggPiAwKSB7CiAgICAgIHRoaXMuZXZlbnRzID0gYnVmZmVyZWQ7CiAgICB9IGVsc2UgewogICAgICBjb25zdCByZWNlbnRFdmVudHMgPSBhd2FpdCBjaGFuZ2VTdHJlYW1TZXJ2aWNlLmdldFJlY2VudEFjdGl2aXR5KDEwMCk7CiAgICAgIGlmIChyZWNlbnRFdmVudHMubGVuZ3RoID4gMCkgewogICAgICAgIHRoaXMuZXZlbnRzID0gcmVjZW50RXZlbnRzOwogICAgICB9CiAgICB9CiAgICBpZiAoIXRoaXMuc3Vic2NyaXB0aW9uKSB7CiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gY2hhbmdlU3RyZWFtU2VydmljZS5nZXRBY3Rpdml0eVN0cmVhbSgpLnN1YnNjcmliZSgoZXZlbnQpID0+IHsKICAgICAgICB0aGlzLmV2ZW50cyA9IFsuLi50aGlzLmV2ZW50cywgZXZlbnRdLnNsaWNlKC01MDApOwogICAgICAgIGlmICh0aGlzLmF1dG9TY3JvbGwpIHsKICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Ub3AoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KICBjbGVhbnVwKCkgewogICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7CiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgIH0KICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TdWJzY3JpcHRpb24pIHsKICAgICAgdGhpcy5jb25uZWN0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgIHRoaXMuY29ubmVjdGlvblN1YnNjcmlwdGlvbiA9IG51bGw7CiAgICB9CiAgfQogIHNjcm9sbFRvVG9wKCkgewogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgY29uc3QgbGlzdDUgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5ldmVudHMtbGlzdCIpOwogICAgICBpZiAobGlzdDUpIHsKICAgICAgICBsaXN0NS5zY3JvbGxUb3AgPSAwOwogICAgICB9CiAgICB9KTsKICB9CiAgc2V0RmlsdGVyTW9kZShtb2RlKSB7CiAgICB0aGlzLmZpbHRlck1vZGUgPSBtb2RlOwogIH0KICB0b2dnbGVBdXRvU2Nyb2xsKCkgewogICAgdGhpcy5hdXRvU2Nyb2xsID0gIXRoaXMuYXV0b1Njcm9sbDsKICB9CiAgZ2V0IGZpbHRlcmVkRXZlbnRzKCkgewogICAgbGV0IGV2ZW50cyA9IHRoaXMuZXZlbnRzOwogICAgaWYgKHRoaXMuZmlsdGVyTW9kZSAhPT0gImFsbCIpIHsKICAgICAgZXZlbnRzID0gZXZlbnRzLmZpbHRlcigoZTExKSA9PiBlMTEuc291cmNlID09PSB0aGlzLmZpbHRlck1vZGUpOwogICAgfQogICAgcmV0dXJuIGV2ZW50cy5zb3J0KChhNSwgYjUpID0+IG5ldyBEYXRlKGI1LnRpbWVzdGFtcCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYTUudGltZXN0YW1wKS5nZXRUaW1lKCkpOwogIH0KICBmb3JtYXRUaW1lKHRpbWVzdGFtcDIpIHsKICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aW1lc3RhbXAyKTsKICAgIHJldHVybiBkYXRlLnRvTG9jYWxlVGltZVN0cmluZygiZW4tVVMiLCB7CiAgICAgIGhvdXI6ICIyLWRpZ2l0IiwKICAgICAgbWludXRlOiAiMi1kaWdpdCIsCiAgICAgIHNlY29uZDogIjItZGlnaXQiCiAgICB9KTsKICB9CiAgZm9ybWF0UmVsYXRpdmVUaW1lKHRpbWVzdGFtcDIpIHsKICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aW1lc3RhbXAyKTsKICAgIGNvbnN0IGRpZmYgPSB0aGlzLm5vdyAtIGRhdGUuZ2V0VGltZSgpOwogICAgaWYgKGRpZmYgPCAxZTMpIHsKICAgICAgcmV0dXJuICJub3ciOwogICAgfSBlbHNlIGlmIChkaWZmIDwgNmU0KSB7CiAgICAgIGNvbnN0IHNlY3MgPSBNYXRoLmZsb29yKGRpZmYgLyAxZTMpOwogICAgICByZXR1cm4gYCR7c2Vjc31zIGFnb2A7CiAgICB9IGVsc2UgaWYgKGRpZmYgPCAzNmU1KSB7CiAgICAgIGNvbnN0IG1pbnMgPSBNYXRoLmZsb29yKGRpZmYgLyA2ZTQpOwogICAgICByZXR1cm4gYCR7bWluc31tIGFnb2A7CiAgICB9IGVsc2UgaWYgKGRpZmYgPCA4NjRlNSkgewogICAgICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IoZGlmZiAvIDM2ZTUpOwogICAgICByZXR1cm4gYCR7aG91cnN9aCBhZ29gOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCk7CiAgICB9CiAgfQogIGdldEV2ZW50VGl0bGUoZXZlbnQpIHsKICAgIGlmIChldmVudC5zb3VyY2UgPT09ICJtb25nb2RiIikgewogICAgICBjb25zdCBtb25nb0V2ZW50ID0gZXZlbnQuZXZlbnQ7CiAgICAgIHJldHVybiBgJHttb25nb0V2ZW50LmRhdGFiYXNlfS4ke21vbmdvRXZlbnQuY29sbGVjdGlvbn1gOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgczNFdmVudCA9IGV2ZW50LmV2ZW50OwogICAgICByZXR1cm4gczNFdmVudC5idWNrZXQ7CiAgICB9CiAgfQogIGdldEV2ZW50RGV0YWlscyhldmVudCkgewogICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gIm1vbmdvZGIiKSB7CiAgICAgIGNvbnN0IG1vbmdvRXZlbnQgPSBldmVudC5ldmVudDsKICAgICAgaWYgKG1vbmdvRXZlbnQuZG9jdW1lbnRJZCkgewogICAgICAgIHJldHVybiBgRG9jdW1lbnQ6ICR7bW9uZ29FdmVudC5kb2N1bWVudElkfWA7CiAgICAgIH0KICAgICAgcmV0dXJuICIiOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgczNFdmVudCA9IGV2ZW50LmV2ZW50OwogICAgICByZXR1cm4gczNFdmVudC5rZXk7CiAgICB9CiAgfQogIGdldEV2ZW50VHlwZShldmVudCkgewogICAgcmV0dXJuIGV2ZW50LmV2ZW50LnR5cGU7CiAgfQogIGhhbmRsZUV2ZW50Q2xpY2soZXZlbnQpIHsKICAgIGlmIChldmVudC5zb3VyY2UgPT09ICJtb25nb2RiIikgewogICAgICBjb25zdCBtb25nb0V2ZW50ID0gZXZlbnQuZXZlbnQ7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgKICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoIm5hdmlnYXRlLXRvLW1vbmdvIiwgewogICAgICAgICAgZGV0YWlsOiB7CiAgICAgICAgICAgIGRhdGFiYXNlOiBtb25nb0V2ZW50LmRhdGFiYXNlLAogICAgICAgICAgICBjb2xsZWN0aW9uOiBtb25nb0V2ZW50LmNvbGxlY3Rpb24sCiAgICAgICAgICAgIGRvY3VtZW50SWQ6IG1vbmdvRXZlbnQuZG9jdW1lbnRJZAogICAgICAgICAgfSwKICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgIH0pCiAgICAgICk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBzM0V2ZW50ID0gZXZlbnQuZXZlbnQ7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgKICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoIm5hdmlnYXRlLXRvLXMzIiwgewogICAgICAgICAgZGV0YWlsOiB7CiAgICAgICAgICAgIGJ1Y2tldDogczNFdmVudC5idWNrZXQsCiAgICAgICAgICAgIGtleTogczNFdmVudC5rZXkKICAgICAgICAgIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KQogICAgICApOwogICAgfQogIH0KICByZW5kZXJNb25nb0ljb24oKSB7CiAgICByZXR1cm4gaHRtbDE1YAogICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+CiAgICAgICAgPGVsbGlwc2UgY3g9IjEyIiBjeT0iNSIgcng9IjkiIHJ5PSIzIj48L2VsbGlwc2U+CiAgICAgICAgPHBhdGggZD0iTTIxIDEyYzAgMS42Ni00IDMtOSAzcy05LTEuMzQtOS0zIj48L3BhdGg+CiAgICAgICAgPHBhdGggZD0iTTMgNXYxNGMwIDEuNjYgNCAzIDkgM3M5LTEuMzQgOS0zVjUiPjwvcGF0aD4KICAgICAgPC9zdmc+CiAgICBgOwogIH0KICByZW5kZXJTM0ljb24oKSB7CiAgICByZXR1cm4gaHRtbDE1YAogICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+CiAgICAgICAgPHBhdGggZD0iTTIyIDE5YTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmg1bDIgM2g5YTIgMiAwIDAgMSAyIDJ6Ij48L3BhdGg+CiAgICAgIDwvc3ZnPgogICAgYDsKICB9CiAgZ2V0Q29ubmVjdGlvblN0YXR1c1RleHQoKSB7CiAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkgewogICAgICByZXR1cm4gIkxpdmUiOwogICAgfQogICAgcmV0dXJuICJEaXNjb25uZWN0ZWQiOwogIH0KICByZW5kZXIoKSB7CiAgICByZXR1cm4gaHRtbDE1YAogICAgICA8ZGl2IGNsYXNzPSJhY3Rpdml0eS1jb250YWluZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItdGl0bGUiPgogICAgICAgICAgICBBY3Rpdml0eSBTdHJlYW0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29ubmVjdGlvbi1zdGF0dXMiPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0dXMtZG90ICR7dGhpcy5pc0Nvbm5lY3RlZCA/ICJjb25uZWN0ZWQiIDogImRpc2Nvbm5lY3RlZCJ9Ij48L3NwYW4+CiAgICAgICAgICAgICAgJHt0aGlzLmdldENvbm5lY3Rpb25TdGF0dXNUZXh0KCl9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItY29udHJvbHMiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmaWx0ZXItdGFicyI+CiAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgY2xhc3M9ImZpbHRlci10YWIgJHt0aGlzLmZpbHRlck1vZGUgPT09ICJhbGwiID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNldEZpbHRlck1vZGUoImFsbCIpfQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIEFsbAogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgIGNsYXNzPSJmaWx0ZXItdGFiICR7dGhpcy5maWx0ZXJNb2RlID09PSAibW9uZ29kYiIgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuc2V0RmlsdGVyTW9kZSgibW9uZ29kYiIpfQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIE1vbmdvREIKICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICBjbGFzcz0iZmlsdGVyLXRhYiAke3RoaXMuZmlsdGVyTW9kZSA9PT0gInMzIiA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5zZXRGaWx0ZXJNb2RlKCJzMyIpfQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIFMzCiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImF1dG8tc2Nyb2xsLXRvZ2dsZSI+CiAgICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgICB0eXBlPSJjaGVja2JveCIKICAgICAgICAgICAgICAgIC5jaGVja2VkPSR7dGhpcy5hdXRvU2Nyb2xsfQogICAgICAgICAgICAgICAgQGNoYW5nZT0ke3RoaXMudG9nZ2xlQXV0b1Njcm9sbH0KICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgIEF1dG8tc2Nyb2xsCiAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iZXZlbnRzLWxpc3QiPgogICAgICAgICAgJHt0aGlzLmlzTG9hZGluZyA/IGh0bWwxNWA8ZGl2IGNsYXNzPSJsb2FkaW5nLXN0YXRlIj5Db25uZWN0aW5nIHRvIGFjdGl2aXR5IHN0cmVhbS4uLjwvZGl2PmAgOiB0aGlzLmZpbHRlcmVkRXZlbnRzLmxlbmd0aCA9PT0gMCA/IGh0bWwxNWAKICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiPgogICAgICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMiAxMmgtNGwtMyA5TDkgM2wtMyA5SDIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgICAgICA8cD5ObyBhY3Rpdml0eSB5ZXQuIENoYW5nZXMgd2lsbCBhcHBlYXIgaGVyZSBpbiByZWFsLXRpbWUuPC9wPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIGAgOiB0aGlzLmZpbHRlcmVkRXZlbnRzLm1hcCgKICAgICAgKGV2ZW50KSA9PiBodG1sMTVgCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZXZlbnQtaXRlbSIgQGNsaWNrPSR7KCkgPT4gdGhpcy5oYW5kbGVFdmVudENsaWNrKGV2ZW50KX0+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJldmVudC10aW1lLWNvbCIgdGl0bGU9JHt0aGlzLmZvcm1hdFRpbWUoZXZlbnQudGltZXN0YW1wKX0+CiAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5mb3JtYXRSZWxhdGl2ZVRpbWUoZXZlbnQudGltZXN0YW1wKX0KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZXZlbnQtaWNvbiAke2V2ZW50LnNvdXJjZX0iPgogICAgICAgICAgICAgICAgICAgICAgICAke2V2ZW50LnNvdXJjZSA9PT0gIm1vbmdvZGIiID8gdGhpcy5yZW5kZXJNb25nb0ljb24oKSA6IHRoaXMucmVuZGVyUzNJY29uKCl9CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV2ZW50LWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJldmVudC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV2ZW50LXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJldmVudC10eXBlICR7dGhpcy5nZXRFdmVudFR5cGUoZXZlbnQpfSI+JHt0aGlzLmdldEV2ZW50VHlwZShldmVudCl9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLmdldEV2ZW50VGl0bGUoZXZlbnQpfQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZXZlbnQtZGV0YWlscyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImV2ZW50LXBhdGgiPiR7dGhpcy5nZXRFdmVudERldGFpbHMoZXZlbnQpfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgYAogICAgKX0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KfTsKX2luaXQ4ID0gX19kZWNvcmF0b3JTdGFydChfYTExKTsKX2V2ZW50cyA9IG5ldyBXZWFrTWFwKCk7Cl9maWx0ZXJNb2RlID0gbmV3IFdlYWtNYXAoKTsKX2lzQ29ubmVjdGVkID0gbmV3IFdlYWtNYXAoKTsKX2lzTG9hZGluZyA9IG5ldyBXZWFrTWFwKCk7Cl9hdXRvU2Nyb2xsID0gbmV3IFdlYWtNYXAoKTsKX25vdyA9IG5ldyBXZWFrTWFwKCk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0OCwgNCwgImV2ZW50cyIsIF9ldmVudHNfZGVjLCBUc3ZpZXdBY3Rpdml0eVN0cmVhbSwgX2V2ZW50cyk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0OCwgNCwgImZpbHRlck1vZGUiLCBfZmlsdGVyTW9kZV9kZWMsIFRzdmlld0FjdGl2aXR5U3RyZWFtLCBfZmlsdGVyTW9kZSk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0OCwgNCwgImlzQ29ubmVjdGVkIiwgX2lzQ29ubmVjdGVkX2RlYywgVHN2aWV3QWN0aXZpdHlTdHJlYW0sIF9pc0Nvbm5lY3RlZCk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0OCwgNCwgImlzTG9hZGluZyIsIF9pc0xvYWRpbmdfZGVjLCBUc3ZpZXdBY3Rpdml0eVN0cmVhbSwgX2lzTG9hZGluZyk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0OCwgNCwgImF1dG9TY3JvbGwiLCBfYXV0b1Njcm9sbF9kZWMsIFRzdmlld0FjdGl2aXR5U3RyZWFtLCBfYXV0b1Njcm9sbCk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0OCwgNCwgIm5vdyIsIF9ub3dfZGVjLCBUc3ZpZXdBY3Rpdml0eVN0cmVhbSwgX25vdyk7ClRzdmlld0FjdGl2aXR5U3RyZWFtID0gX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ4LCAwLCAiVHN2aWV3QWN0aXZpdHlTdHJlYW0iLCBfVHN2aWV3QWN0aXZpdHlTdHJlYW1fZGVjb3JhdG9ycywgVHN2aWV3QWN0aXZpdHlTdHJlYW0pOwpfX3B1YmxpY0ZpZWxkKFRzdmlld0FjdGl2aXR5U3RyZWFtLCAic3R5bGVzIiwgWwogIGNzc01hbmFnZXIxMC5kZWZhdWx0U3R5bGVzLAogIHRoZW1lU3R5bGVzLAogIGNzczEwYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5hY3Rpdml0eS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5oZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzMzMzsKICAgICAgfQoKICAgICAgLmhlYWRlci10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTJweDsKICAgICAgfQoKICAgICAgLmNvbm5lY3Rpb24tc3RhdHVzIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC5zdGF0dXMtZG90IHsKICAgICAgICB3aWR0aDogOHB4OwogICAgICAgIGhlaWdodDogOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgLnN0YXR1cy1kb3QuY29ubmVjdGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMjJjNTVlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMCA2cHggcmdiYSgzNCwgMTk3LCA5NCwgMC41KTsKICAgICAgfQoKICAgICAgLnN0YXR1cy1kb3QuZGlzY29ubmVjdGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZWY0NDQ0OwogICAgICB9CgogICAgICAuc3RhdHVzLWRvdC5jb25uZWN0aW5nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjU5ZTBiOwogICAgICAgIGFuaW1hdGlvbjogcHVsc2UgMXMgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgcHVsc2UgewogICAgICAgIDAlLCAxMDAlIHsgb3BhY2l0eTogMTsgfQogICAgICAgIDUwJSB7IG9wYWNpdHk6IDAuNTsgfQogICAgICB9CgogICAgICAuaGVhZGVyLWNvbnRyb2xzIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiAxMnB4OwogICAgICB9CgogICAgICAuZmlsdGVyLXRhYnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgIH0KCiAgICAgIC5maWx0ZXItdGFiIHsKICAgICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjNDQ0OwogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzOwogICAgICB9CgogICAgICAuZmlsdGVyLXRhYjpob3ZlciB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjNjY2OwogICAgICAgIGNvbG9yOiAjYWFhOwogICAgICB9CgogICAgICAuZmlsdGVyLXRhYi5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgICAgICBib3JkZXItY29sb3I6ICM2NjY7CiAgICAgICAgY29sb3I6ICNlMGUwZTA7CiAgICAgIH0KCiAgICAgIC5hdXRvLXNjcm9sbC10b2dnbGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDZweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICM4ODg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAuYXV0by1zY3JvbGwtdG9nZ2xlIGlucHV0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5ldmVudHMtbGlzdCB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgIH0KCiAgICAgIC5ldmVudC1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogMTJweDsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXM7CiAgICAgIH0KCiAgICAgIC5ldmVudC1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgICB9CgogICAgICAuZXZlbnQtdGltZS1jb2wgewogICAgICAgIHdpZHRoOiA3MHB4OwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgICBwYWRkaW5nLXRvcDogMnB4OwogICAgICB9CgogICAgICAuZXZlbnQtaWNvbiB7CiAgICAgICAgd2lkdGg6IDM2cHg7CiAgICAgICAgaGVpZ2h0OiAzNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5ldmVudC1pY29uLm1vbmdvZGIgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTYsIDE4NSwgMTI5LCAwLjIpOwogICAgICAgIGNvbG9yOiAjMTBiOTgxOwogICAgICB9CgogICAgICAuZXZlbnQtaWNvbi5zMyB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNDUsIDE1OCwgMTEsIDAuMik7CiAgICAgICAgY29sb3I6ICNmNTllMGI7CiAgICAgIH0KCiAgICAgIC5ldmVudC1pY29uIHN2ZyB7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICB9CgogICAgICAuZXZlbnQtY29udGVudCB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC5ldmVudC1oZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICAgIH0KCiAgICAgIC5ldmVudC10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICNlMGUwZTA7CiAgICAgIH0KCiAgICAgIC5ldmVudC1kZXRhaWxzIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICM4ODg7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgfQoKICAgICAgLmV2ZW50LXR5cGUgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwYWRkaW5nOiAycHggNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIG1hcmdpbi1yaWdodDogOHB4OwogICAgICB9CgogICAgICAuZXZlbnQtdHlwZS5pbnNlcnQsIC5ldmVudC10eXBlLmFkZCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgzNCwgMTk3LCA5NCwgMC4yKTsKICAgICAgICBjb2xvcjogIzRhZGU4MDsKICAgICAgfQoKICAgICAgLmV2ZW50LXR5cGUudXBkYXRlLCAuZXZlbnQtdHlwZS5tb2RpZnkgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoNTksIDEzMCwgMjQ2LCAwLjIpOwogICAgICAgIGNvbG9yOiAjNjBhNWZhOwogICAgICB9CgogICAgICAuZXZlbnQtdHlwZS5kZWxldGUgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjM5LCA2OCwgNjgsIDAuMik7CiAgICAgICAgY29sb3I6ICNmODcxNzE7CiAgICAgIH0KCiAgICAgIC5ldmVudC10eXBlLnJlcGxhY2UgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTY4LCA4NSwgMjQ3LCAwLjIpOwogICAgICAgIGNvbG9yOiAjYzA4NGZjOwogICAgICB9CgogICAgICAuZXZlbnQtdHlwZS5kcm9wLCAuZXZlbnQtdHlwZS5pbnZhbGlkYXRlIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDIzOSwgNjgsIDY4LCAwLjMpOwogICAgICAgIGNvbG9yOiAjZjg3MTcxOwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgICBnYXA6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZSBzdmcgewogICAgICAgIHdpZHRoOiA2NHB4OwogICAgICAgIGhlaWdodDogNjRweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZSBwIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIC5sb2FkaW5nLXN0YXRlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGNvbG9yOiAjODg4OwogICAgICB9CgogICAgICAuZXZlbnQtcGF0aCB7CiAgICAgICAgY29sb3I6ICNhYWE7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOwogICAgICB9CiAgICBgCl0pOwpfX3J1bkluaXRpYWxpemVycyhfaW5pdDgsIDEsIFRzdmlld0FjdGl2aXR5U3RyZWFtKTsKCi8vIHRzX3dlYi9pbmRleC50cwp2YXIgaW5pdEFwcCA9IGFzeW5jICgpID0+IHsKICBjb25zb2xlLmxvZygiVHNWaWV3IFVJIGluaXRpYWxpemluZy4uLiIpOwogIGF3YWl0IGN1c3RvbUVsZW1lbnRzLndoZW5EZWZpbmVkKCJ0c3ZpZXctYXBwIik7CiAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJ0c3ZpZXctYXBwIikpIHsKICAgIGNvbnN0IGFwcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRzdmlldy1hcHAiKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYXBwKTsKICB9CiAgY29uc29sZS5sb2coIlRzVmlldyBVSSByZWFkeSIpOwp9OwppZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImxvYWRpbmciKSB7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGluaXRBcHApOwp9IGVsc2UgewogIGluaXRBcHAoKTsKfQovKiEgQnVuZGxlZCBsaWNlbnNlIGluZm9ybWF0aW9uOgoKQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2Nzcy10YWcuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQogICAqKQoKQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3JlYWN0aXZlLWVsZW1lbnQuanM6CmxpdC1odG1sL2xpdC1odG1sLmpzOgpsaXQtZWxlbWVudC9saXQtZWxlbWVudC5qczoKQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvcHJvcGVydHkuanM6CmxpdC1odG1sL2RpcmVjdGl2ZS5qczoKbGl0LWh0bWwvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qczoKQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvY3VzdG9tLWVsZW1lbnQuanM6CkBsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3N0YXRlLmpzOgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9ldmVudC1vcHRpb25zLmpzOgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9iYXNlLmpzOgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS5qczoKQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvcXVlcnktYWxsLmpzOgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS1hc3luYy5qczoKQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvcXVlcnktYXNzaWduZWQtbm9kZXMuanM6CmxpdC1odG1sL2FzeW5jLWRpcmVjdGl2ZS5qczoKbGl0LWh0bWwvZGlyZWN0aXZlcy91bnRpbC5qczoKbGl0LWh0bWwvZGlyZWN0aXZlcy9hc3luYy1yZXBsYWNlLmpzOgpsaXQtaHRtbC9kaXJlY3RpdmVzL2FzeW5jLWFwcGVuZC5qczoKbGl0LWh0bWwvZGlyZWN0aXZlcy9yZXBlYXQuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQogICAqKQoKbGl0LWh0bWwvaXMtc2VydmVyLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQwogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKICAgKikKCnN3ZWV0LXNjcm9sbC9zd2VldC1zY3JvbGwuanM6CiAgKCohIEBwcmVzZXJ2ZSBzd2VldC1zY3JvbGwgdjQuMC4wIC0gdHN1eW9zaGl3YWRhIHwgTUlUIExpY2Vuc2UgKikKICAoKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UKICAgICAgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUKICAgICAgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAKICAgICAgVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQogICAgICBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVECiAgICAgIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsCiAgICAgIE1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuCiAgCiAgICAgIFNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwogICAgICBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICopCgpsaXQtaHRtbC9zdGF0aWMuanM6CmxpdC1odG1sL2RpcmVjdGl2ZS1oZWxwZXJzLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQwogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKICAgKikKCkBsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3F1ZXJ5LWFzc2lnbmVkLWVsZW1lbnRzLmpzOgpsaXQtaHRtbC9kaXJlY3RpdmVzL3ByaXZhdGUtYXN5bmMtaGVscGVycy5qczoKbGl0LWh0bWwvZGlyZWN0aXZlcy9rZXllZC5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMKICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCiAgICopCgpAZm9ydGF3ZXNvbWUvZm9udGF3ZXNvbWUtc3ZnLWNvcmUvaW5kZXgubWpzOgpAZm9ydGF3ZXNvbWUvZnJlZS1icmFuZHMtc3ZnLWljb25zL2luZGV4Lm1qczoKQGZvcnRhd2Vzb21lL2ZyZWUtcmVndWxhci1zdmctaWNvbnMvaW5kZXgubWpzOgpAZm9ydGF3ZXNvbWUvZnJlZS1zb2xpZC1zdmctaWNvbnMvaW5kZXgubWpzOgogICgqIQogICAqIEZvbnQgQXdlc29tZSBGcmVlIDcuMS4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tCiAgICogTGljZW5zZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tL2xpY2Vuc2UvZnJlZSAoSWNvbnM6IENDIEJZIDQuMCwgRm9udHM6IFNJTCBPRkwgMS4xLCBDb2RlOiBNSVQgTGljZW5zZSkKICAgKiBDb3B5cmlnaHQgMjAyNSBGb250aWNvbnMsIEluYy4KICAgKikKCmx1Y2lkZS9kaXN0L2Nqcy9sdWNpZGUuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UgbHVjaWRlIHYwLjU2My4wIC0gSVNDCiAgICoKICAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS4KICAgKiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICAgKikKCmliYW50b29scy9qc25leHQvaWJhbnRvb2xzLmpzOgogICgqIQogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IFNhxaFhIEpvdmFuacSHCiAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMi4wIG9yIHRoZSBNSVQgbGljZW5zZSwKICAgKiBhdCB5b3VyIG9wdGlvbi4gVGhpcyBmaWxlIG1heSBub3QgYmUgY29waWVkLCBtb2RpZmllZCwgb3IgZGlzdHJpYnV0ZWQKICAgKiBleGNlcHQgYWNjb3JkaW5nIHRvIHRob3NlIHRlcm1zLgogICAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IFNhxaFhIEpvdmFuacSHCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVCBvciBNUEwvMi4wCiAgICopCiAgKCoqCiAgICogVmFsaWRhdGlvbiwgZXh0cmFjdGlvbiBhbmQgY3JlYXRpb24gb2YgSUJBTiwgQkJBTiwgQklDL1NXSUZUIG51bWJlcnMgcGx1cyBzb21lIG90aGVyIGhlbHBmdWwgc3R1ZmYKICAgKiBAcGFja2FnZSBEb2N1bWVudGF0aW9uCiAgICogQGF1dGhvciBTYcWhYSBKb3ZhbmnEhwogICAqIEBtb2R1bGUgaWJhbnRvb2xzCiAgICogQHZlcnNpb24gNC41LjEKICAgKiBAbGljZW5zZSBNSVQgb3IgTVBMLTIuMAogICAqIEBwcmVmZXJyZWQKICAgKikKKi8KLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnVuZGxlLTE3NzMzMjg1NjM2MDEuanMubWFwCg==" + "contentBase64": "dmFyIF9fY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTsKdmFyIF9fZnJlZXplID0gT2JqZWN0LmZyZWV6ZTsKdmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKdmFyIF9fZ2V0T3duUHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwp2YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lczsKdmFyIF9fZ2V0UHJvdG9PZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsKdmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CnZhciBfX2tub3duU3ltYm9sID0gKG5hbWUsIHN5bWJvbCkgPT4gKHN5bWJvbCA9IFN5bWJvbFtuYW1lXSkgPyBzeW1ib2wgOiAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcigiU3ltYm9sLiIgKyBuYW1lKTsKdmFyIF9fdHlwZUVycm9yID0gKG1zZykgPT4gewogIHRocm93IFR5cGVFcnJvcihtc2cpOwp9Owp2YXIgX19kZWZOb3JtYWxQcm9wID0gKG9iaiwga2V5MiwgdmFsdWUyKSA9PiBrZXkyIGluIG9iaiA/IF9fZGVmUHJvcChvYmosIGtleTIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlMiB9KSA6IG9ialtrZXkyXSA9IHZhbHVlMjsKdmFyIF9fbmFtZSA9ICh0YXJnZXQsIHZhbHVlMikgPT4gX19kZWZQcm9wKHRhcmdldCwgIm5hbWUiLCB7IHZhbHVlOiB2YWx1ZTIsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKdmFyIF9fcmVxdWlyZSA9IC8qIEBfX1BVUkVfXyAqLyAoKHg0KSA9PiB0eXBlb2YgcmVxdWlyZSAhPT0gInVuZGVmaW5lZCIgPyByZXF1aXJlIDogdHlwZW9mIFByb3h5ICE9PSAidW5kZWZpbmVkIiA/IG5ldyBQcm94eSh4NCwgewogIGdldDogKGE1LCBiNikgPT4gKHR5cGVvZiByZXF1aXJlICE9PSAidW5kZWZpbmVkIiA/IHJlcXVpcmUgOiBhNSlbYjZdCn0pIDogeDQpKGZ1bmN0aW9uKHg0KSB7CiAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAidW5kZWZpbmVkIikgcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB0aHJvdyBFcnJvcignRHluYW1pYyByZXF1aXJlIG9mICInICsgeDQgKyAnIiBpcyBub3Qgc3VwcG9ydGVkJyk7Cn0pOwp2YXIgX19lc20gPSAoZm4sIHJlcykgPT4gZnVuY3Rpb24gX19pbml0KCkgewogIHJldHVybiBmbiAmJiAocmVzID0gKDAsIGZuW19fZ2V0T3duUHJvcE5hbWVzKGZuKVswXV0pKGZuID0gMCkpLCByZXM7Cn07CnZhciBfX2NvbW1vbkpTID0gKGNiLCBtb2QpID0+IGZ1bmN0aW9uIF9fcmVxdWlyZTIoKSB7CiAgcmV0dXJuIG1vZCB8fCAoMCwgY2JbX19nZXRPd25Qcm9wTmFtZXMoY2IpWzBdXSkoKG1vZCA9IHsgZXhwb3J0czoge30gfSkuZXhwb3J0cywgbW9kKSwgbW9kLmV4cG9ydHM7Cn07CnZhciBfX2V4cG9ydCA9ICh0YXJnZXQsIGFsbDMpID0+IHsKICBmb3IgKHZhciBuYW1lIGluIGFsbDMpCiAgICBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7IGdldDogYWxsM1tuYW1lXSwgZW51bWVyYWJsZTogdHJ1ZSB9KTsKfTsKdmFyIF9fY29weVByb3BzID0gKHRvLCBmcm9tMiwgZXhjZXB0LCBkZXNjKSA9PiB7CiAgaWYgKGZyb20yICYmIHR5cGVvZiBmcm9tMiA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIGZyb20yID09PSAiZnVuY3Rpb24iKSB7CiAgICBmb3IgKGxldCBrZXkyIG9mIF9fZ2V0T3duUHJvcE5hbWVzKGZyb20yKSkKICAgICAgaWYgKCFfX2hhc093blByb3AuY2FsbCh0bywga2V5MikgJiYga2V5MiAhPT0gZXhjZXB0KQogICAgICAgIF9fZGVmUHJvcCh0bywga2V5MiwgeyBnZXQ6ICgpID0+IGZyb20yW2tleTJdLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20yLCBrZXkyKSkgfHwgZGVzYy5lbnVtZXJhYmxlIH0pOwogIH0KICByZXR1cm4gdG87Cn07CnZhciBfX3RvRVNNID0gKG1vZCwgaXNOb2RlTW9kZSwgdGFyZ2V0KSA9PiAodGFyZ2V0ID0gbW9kICE9IG51bGwgPyBfX2NyZWF0ZShfX2dldFByb3RvT2YobW9kKSkgOiB7fSwgX19jb3B5UHJvcHMoCiAgLy8gSWYgdGhlIGltcG9ydGVyIGlzIGluIG5vZGUgY29tcGF0aWJpbGl0eSBtb2RlIG9yIHRoaXMgaXMgbm90IGFuIEVTTQogIC8vIGZpbGUgdGhhdCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gYSBDb21tb25KUyBmaWxlIHVzaW5nIGEgQmFiZWwtCiAgLy8gY29tcGF0aWJsZSB0cmFuc2Zvcm0gKGkuZS4gIl9fZXNNb2R1bGUiIGhhcyBub3QgYmVlbiBzZXQpLCB0aGVuIHNldAogIC8vICJkZWZhdWx0IiB0byB0aGUgQ29tbW9uSlMgIm1vZHVsZS5leHBvcnRzIiBmb3Igbm9kZSBjb21wYXRpYmlsaXR5LgogIGlzTm9kZU1vZGUgfHwgIW1vZCB8fCAhbW9kLl9fZXNNb2R1bGUgPyBfX2RlZlByb3AodGFyZ2V0LCAiZGVmYXVsdCIsIHsgdmFsdWU6IG1vZCwgZW51bWVyYWJsZTogdHJ1ZSB9KSA6IHRhcmdldCwKICBtb2QKKSk7CnZhciBfX2RlY29yYXRvclN0YXJ0ID0gKGJhc2UpID0+IFssICwgLCBfX2NyZWF0ZShiYXNlPy5bX19rbm93blN5bWJvbCgibWV0YWRhdGEiKV0gPz8gbnVsbCldOwp2YXIgX19kZWNvcmF0b3JTdHJpbmdzID0gWyJjbGFzcyIsICJtZXRob2QiLCAiZ2V0dGVyIiwgInNldHRlciIsICJhY2Nlc3NvciIsICJmaWVsZCIsICJ2YWx1ZSIsICJnZXQiLCAic2V0Il07CnZhciBfX2V4cGVjdEZuID0gKGZuKSA9PiBmbiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmbiAhPT0gImZ1bmN0aW9uIiA/IF9fdHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpIDogZm47CnZhciBfX2RlY29yYXRvckNvbnRleHQgPSAoa2luZCwgbmFtZSwgZG9uZSwgbWV0YWRhdGEsIGZucykgPT4gKHsga2luZDogX19kZWNvcmF0b3JTdHJpbmdzW2tpbmRdLCBuYW1lLCBtZXRhZGF0YSwgYWRkSW5pdGlhbGl6ZXI6IChmbikgPT4gZG9uZS5fID8gX190eXBlRXJyb3IoIkFscmVhZHkgaW5pdGlhbGl6ZWQiKSA6IGZucy5wdXNoKF9fZXhwZWN0Rm4oZm4gfHwgbnVsbCkpIH0pOwp2YXIgX19kZWNvcmF0b3JNZXRhZGF0YSA9IChhcnJheSwgdGFyZ2V0KSA9PiBfX2RlZk5vcm1hbFByb3AodGFyZ2V0LCBfX2tub3duU3ltYm9sKCJtZXRhZGF0YSIpLCBhcnJheVszXSk7CnZhciBfX3J1bkluaXRpYWxpemVycyA9IChhcnJheSwgZmxhZ3MsIHNlbGYyLCB2YWx1ZTIpID0+IHsKICBmb3IgKHZhciBpMTEgPSAwLCBmbnMgPSBhcnJheVtmbGFncyA+PiAxXSwgbjEzID0gZm5zICYmIGZucy5sZW5ndGg7IGkxMSA8IG4xMzsgaTExKyspIGZsYWdzICYgMSA/IGZuc1tpMTFdLmNhbGwoc2VsZjIpIDogdmFsdWUyID0gZm5zW2kxMV0uY2FsbChzZWxmMiwgdmFsdWUyKTsKICByZXR1cm4gdmFsdWUyOwp9Owp2YXIgX19kZWNvcmF0ZUVsZW1lbnQgPSAoYXJyYXksIGZsYWdzLCBuYW1lLCBkZWNvcmF0b3JzLCB0YXJnZXQsIGV4dHJhKSA9PiB7CiAgdmFyIGZuLCBpdCwgZG9uZSwgY3R4LCBhY2Nlc3MsIGs1ID0gZmxhZ3MgJiA3LCBzMTAgPSAhIShmbGFncyAmIDgpLCBwOCA9ICEhKGZsYWdzICYgMTYpOwogIHZhciBqNCA9IGs1ID4gMyA/IGFycmF5Lmxlbmd0aCArIDEgOiBrNSA/IHMxMCA/IDEgOiAyIDogMCwga2V5MiA9IF9fZGVjb3JhdG9yU3RyaW5nc1trNSArIDVdOwogIHZhciBpbml0aWFsaXplcnMgPSBrNSA+IDMgJiYgKGFycmF5W2o0IC0gMV0gPSBbXSksIGV4dHJhSW5pdGlhbGl6ZXJzID0gYXJyYXlbajRdIHx8IChhcnJheVtqNF0gPSBbXSk7CiAgdmFyIGRlc2MgPSBrNSAmJiAoIXA4ICYmICFzMTAgJiYgKHRhcmdldCA9IHRhcmdldC5wcm90b3R5cGUpLCBrNSA8IDUgJiYgKGs1ID4gMyB8fCAhcDgpICYmIF9fZ2V0T3duUHJvcERlc2MoazUgPCA0ID8gdGFyZ2V0IDogeyBnZXQgW25hbWVdKCkgewogICAgcmV0dXJuIF9fcHJpdmF0ZUdldCh0aGlzLCBleHRyYSk7CiAgfSwgc2V0IFtuYW1lXSh4NCkgewogICAgcmV0dXJuIF9fcHJpdmF0ZVNldCh0aGlzLCBleHRyYSwgeDQpOwogIH0gfSwgbmFtZSkpOwogIGs1ID8gcDggJiYgazUgPCA0ICYmIF9fbmFtZShleHRyYSwgKGs1ID4gMiA/ICJzZXQgIiA6IGs1ID4gMSA/ICJnZXQgIiA6ICIiKSArIG5hbWUpIDogX19uYW1lKHRhcmdldCwgbmFtZSk7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIGN0eCA9IF9fZGVjb3JhdG9yQ29udGV4dChrNSwgbmFtZSwgZG9uZSA9IHt9LCBhcnJheVszXSwgZXh0cmFJbml0aWFsaXplcnMpOwogICAgaWYgKGs1KSB7CiAgICAgIGN0eC5zdGF0aWMgPSBzMTAsIGN0eC5wcml2YXRlID0gcDgsIGFjY2VzcyA9IGN0eC5hY2Nlc3MgPSB7IGhhczogcDggPyAoeDQpID0+IF9fcHJpdmF0ZUluKHRhcmdldCwgeDQpIDogKHg0KSA9PiBuYW1lIGluIHg0IH07CiAgICAgIGlmIChrNSBeIDMpIGFjY2Vzcy5nZXQgPSBwOCA/ICh4NCkgPT4gKGs1IF4gMSA/IF9fcHJpdmF0ZUdldCA6IF9fcHJpdmF0ZU1ldGhvZCkoeDQsIHRhcmdldCwgazUgXiA0ID8gZXh0cmEgOiBkZXNjLmdldCkgOiAoeDQpID0+IHg0W25hbWVdOwogICAgICBpZiAoazUgPiAyKSBhY2Nlc3Muc2V0ID0gcDggPyAoeDQsIHk1KSA9PiBfX3ByaXZhdGVTZXQoeDQsIHRhcmdldCwgeTUsIGs1IF4gNCA/IGV4dHJhIDogZGVzYy5zZXQpIDogKHg0LCB5NSkgPT4geDRbbmFtZV0gPSB5NTsKICAgIH0KICAgIGl0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoazUgPyBrNSA8IDQgPyBwOCA/IGV4dHJhIDogZGVzY1trZXkyXSA6IGs1ID4gNCA/IHZvaWQgMCA6IHsgZ2V0OiBkZXNjLmdldCwgc2V0OiBkZXNjLnNldCB9IDogdGFyZ2V0LCBjdHgpLCBkb25lLl8gPSAxOwogICAgaWYgKGs1IF4gNCB8fCBpdCA9PT0gdm9pZCAwKSBfX2V4cGVjdEZuKGl0KSAmJiAoazUgPiA0ID8gaW5pdGlhbGl6ZXJzLnVuc2hpZnQoaXQpIDogazUgPyBwOCA/IGV4dHJhID0gaXQgOiBkZXNjW2tleTJdID0gaXQgOiB0YXJnZXQgPSBpdCk7CiAgICBlbHNlIGlmICh0eXBlb2YgaXQgIT09ICJvYmplY3QiIHx8IGl0ID09PSBudWxsKSBfX3R5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICBlbHNlIF9fZXhwZWN0Rm4oZm4gPSBpdC5nZXQpICYmIChkZXNjLmdldCA9IGZuKSwgX19leHBlY3RGbihmbiA9IGl0LnNldCkgJiYgKGRlc2Muc2V0ID0gZm4pLCBfX2V4cGVjdEZuKGZuID0gaXQuaW5pdCkgJiYgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoZm4pOwogIH0KICByZXR1cm4gazUgfHwgX19kZWNvcmF0b3JNZXRhZGF0YShhcnJheSwgdGFyZ2V0KSwgZGVzYyAmJiBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCBkZXNjKSwgcDggPyBrNSBeIDQgPyBleHRyYSA6IGRlc2MgOiB0YXJnZXQ7Cn07CnZhciBfX3B1YmxpY0ZpZWxkID0gKG9iaiwga2V5MiwgdmFsdWUyKSA9PiBfX2RlZk5vcm1hbFByb3Aob2JqLCB0eXBlb2Yga2V5MiAhPT0gInN5bWJvbCIgPyBrZXkyICsgIiIgOiBrZXkyLCB2YWx1ZTIpOwp2YXIgX19hY2Nlc3NDaGVjayA9IChvYmosIG1lbWJlciwgbXNnKSA9PiBtZW1iZXIuaGFzKG9iaikgfHwgX190eXBlRXJyb3IoIkNhbm5vdCAiICsgbXNnKTsKdmFyIF9fcHJpdmF0ZUluID0gKG1lbWJlciwgb2JqKSA9PiBPYmplY3Qob2JqKSAhPT0gb2JqID8gX190eXBlRXJyb3IoJ0Nhbm5vdCB1c2UgdGhlICJpbiIgb3BlcmF0b3Igb24gdGhpcyB2YWx1ZScpIDogbWVtYmVyLmhhcyhvYmopOwp2YXIgX19wcml2YXRlR2V0ID0gKG9iaiwgbWVtYmVyLCBnZXR0ZXIpID0+IChfX2FjY2Vzc0NoZWNrKG9iaiwgbWVtYmVyLCAicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSwgZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IG1lbWJlci5nZXQob2JqKSk7CnZhciBfX3ByaXZhdGVBZGQgPSAob2JqLCBtZW1iZXIsIHZhbHVlMikgPT4gbWVtYmVyLmhhcyhvYmopID8gX190eXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKSA6IG1lbWJlciBpbnN0YW5jZW9mIFdlYWtTZXQgPyBtZW1iZXIuYWRkKG9iaikgOiBtZW1iZXIuc2V0KG9iaiwgdmFsdWUyKTsKdmFyIF9fcHJpdmF0ZVNldCA9IChvYmosIG1lbWJlciwgdmFsdWUyLCBzZXR0ZXIpID0+IChfX2FjY2Vzc0NoZWNrKG9iaiwgbWVtYmVyLCAid3JpdGUgdG8gcHJpdmF0ZSBmaWVsZCIpLCBzZXR0ZXIgPyBzZXR0ZXIuY2FsbChvYmosIHZhbHVlMikgOiBtZW1iZXIuc2V0KG9iaiwgdmFsdWUyKSwgdmFsdWUyKTsKdmFyIF9fcHJpdmF0ZU1ldGhvZCA9IChvYmosIG1lbWJlciwgbWV0aG9kKSA9PiAoX19hY2Nlc3NDaGVjayhvYmosIG1lbWJlciwgImFjY2VzcyBwcml2YXRlIG1ldGhvZCIpLCBtZXRob2QpOwp2YXIgX190ZW1wbGF0ZSA9IChjb29rZWQsIHJhdzIpID0+IF9fZnJlZXplKF9fZGVmUHJvcChjb29rZWQsICJyYXciLCB7IHZhbHVlOiBfX2ZyZWV6ZShyYXcyIHx8IGNvb2tlZC5zbGljZSgpKSB9KSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvY3NzLXRhZy5qcwp2YXIgdCwgZSwgcywgbywgbiwgciwgaSwgUywgYzsKdmFyIGluaXRfY3NzX3RhZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2Nzcy10YWcuanMiKCkgewogICAgdCA9IGdsb2JhbFRoaXMsIGUgPSB0LlNoYWRvd1Jvb3QgJiYgKHZvaWQgMCA9PT0gdC5TaGFkeUNTUyB8fCB0LlNoYWR5Q1NTLm5hdGl2ZVNoYWRvdykgJiYgImFkb3B0ZWRTdHlsZVNoZWV0cyIgaW4gRG9jdW1lbnQucHJvdG90eXBlICYmICJyZXBsYWNlIiBpbiBDU1NTdHlsZVNoZWV0LnByb3RvdHlwZSwgcyA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woKSwgbyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogICAgbiA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IodDksIGUxMSwgbzEzKSB7CiAgICAgICAgaWYgKHRoaXMuXyRjc3NSZXN1bHQkID0gdHJ1ZSwgbzEzICE9PSBzKSB0aHJvdyBFcnJvcigiQ1NTUmVzdWx0IGlzIG5vdCBjb25zdHJ1Y3RhYmxlLiBVc2UgYHVuc2FmZUNTU2Agb3IgYGNzc2AgaW5zdGVhZC4iKTsKICAgICAgICB0aGlzLmNzc1RleHQgPSB0OSwgdGhpcy50ID0gZTExOwogICAgICB9CiAgICAgIGdldCBzdHlsZVNoZWV0KCkgewogICAgICAgIGxldCB0OSA9IHRoaXMubzsKICAgICAgICBjb25zdCBzMTAgPSB0aGlzLnQ7CiAgICAgICAgaWYgKGUgJiYgdm9pZCAwID09PSB0OSkgewogICAgICAgICAgY29uc3QgZTExID0gdm9pZCAwICE9PSBzMTAgJiYgMSA9PT0gczEwLmxlbmd0aDsKICAgICAgICAgIGUxMSAmJiAodDkgPSBvLmdldChzMTApKSwgdm9pZCAwID09PSB0OSAmJiAoKHRoaXMubyA9IHQ5ID0gbmV3IENTU1N0eWxlU2hlZXQoKSkucmVwbGFjZVN5bmModGhpcy5jc3NUZXh0KSwgZTExICYmIG8uc2V0KHMxMCwgdDkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHQ5OwogICAgICB9CiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLmNzc1RleHQ7CiAgICAgIH0KICAgIH07CiAgICByID0gKHQ5KSA9PiBuZXcgbigic3RyaW5nIiA9PSB0eXBlb2YgdDkgPyB0OSA6IHQ5ICsgIiIsIHZvaWQgMCwgcyksIGkgPSAodDksIC4uLmUxMSkgPT4gewogICAgICBjb25zdCBvMTMgPSAxID09PSB0OS5sZW5ndGggPyB0OVswXSA6IGUxMS5yZWR1Y2UoKGUxMiwgczEwLCBvMTQpID0+IGUxMiArICgodDEwKSA9PiB7CiAgICAgICAgaWYgKHRydWUgPT09IHQxMC5fJGNzc1Jlc3VsdCQpIHJldHVybiB0MTAuY3NzVGV4dDsKICAgICAgICBpZiAoIm51bWJlciIgPT0gdHlwZW9mIHQxMCkgcmV0dXJuIHQxMDsKICAgICAgICB0aHJvdyBFcnJvcigiVmFsdWUgcGFzc2VkIHRvICdjc3MnIGZ1bmN0aW9uIG11c3QgYmUgYSAnY3NzJyBmdW5jdGlvbiByZXN1bHQ6ICIgKyB0MTAgKyAiLiBVc2UgJ3Vuc2FmZUNTUycgdG8gcGFzcyBub24tbGl0ZXJhbCB2YWx1ZXMsIGJ1dCB0YWtlIGNhcmUgdG8gZW5zdXJlIHBhZ2Ugc2VjdXJpdHkuIik7CiAgICAgIH0pKHMxMCkgKyB0OVtvMTQgKyAxXSwgdDlbMF0pOwogICAgICByZXR1cm4gbmV3IG4obzEzLCB0OSwgcyk7CiAgICB9LCBTID0gKHMxMCwgbzEzKSA9PiB7CiAgICAgIGlmIChlKSBzMTAuYWRvcHRlZFN0eWxlU2hlZXRzID0gbzEzLm1hcCgodDkpID0+IHQ5IGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldCA/IHQ5IDogdDkuc3R5bGVTaGVldCk7CiAgICAgIGVsc2UgZm9yIChjb25zdCBlMTEgb2YgbzEzKSB7CiAgICAgICAgY29uc3QgbzE0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSwgbjEzID0gdC5saXROb25jZTsKICAgICAgICB2b2lkIDAgIT09IG4xMyAmJiBvMTQuc2V0QXR0cmlidXRlKCJub25jZSIsIG4xMyksIG8xNC50ZXh0Q29udGVudCA9IGUxMS5jc3NUZXh0LCBzMTAuYXBwZW5kQ2hpbGQobzE0KTsKICAgICAgfQogICAgfSwgYyA9IGUgPyAodDkpID0+IHQ5IDogKHQ5KSA9PiB0OSBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXQgPyAoKHQxMCkgPT4gewogICAgICBsZXQgZTExID0gIiI7CiAgICAgIGZvciAoY29uc3QgczEwIG9mIHQxMC5jc3NSdWxlcykgZTExICs9IHMxMC5jc3NUZXh0OwogICAgICByZXR1cm4gcihlMTEpOwogICAgfSkodDkpIDogdDk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9yZWFjdGl2ZS1lbGVtZW50LmpzCnZhciBpMiwgZTIsIGgsIHIyLCBvMiwgbjIsIGEsIGMyLCBsLCBwLCBkLCB1LCBmLCBiLCB5Owp2YXIgaW5pdF9yZWFjdGl2ZV9lbGVtZW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvcmVhY3RpdmUtZWxlbWVudC5qcyIoKSB7CiAgICBpbml0X2Nzc190YWcoKTsKICAgIGluaXRfY3NzX3RhZygpOwogICAgKHsgaXM6IGkyLCBkZWZpbmVQcm9wZXJ0eTogZTIsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogaCwgZ2V0T3duUHJvcGVydHlOYW1lczogcjIsIGdldE93blByb3BlcnR5U3ltYm9sczogbzIsIGdldFByb3RvdHlwZU9mOiBuMiB9ID0gT2JqZWN0KSwgYSA9IGdsb2JhbFRoaXMsIGMyID0gYS50cnVzdGVkVHlwZXMsIGwgPSBjMiA/IGMyLmVtcHR5U2NyaXB0IDogIiIsIHAgPSBhLnJlYWN0aXZlRWxlbWVudFBvbHlmaWxsU3VwcG9ydCwgZCA9ICh0OSwgczEwKSA9PiB0OSwgdSA9IHsgdG9BdHRyaWJ1dGUodDksIHMxMCkgewogICAgICBzd2l0Y2ggKHMxMCkgewogICAgICAgIGNhc2UgQm9vbGVhbjoKICAgICAgICAgIHQ5ID0gdDkgPyBsIDogbnVsbDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT2JqZWN0OgogICAgICAgIGNhc2UgQXJyYXk6CiAgICAgICAgICB0OSA9IG51bGwgPT0gdDkgPyB0OSA6IEpTT04uc3RyaW5naWZ5KHQ5KTsKICAgICAgfQogICAgICByZXR1cm4gdDk7CiAgICB9LCBmcm9tQXR0cmlidXRlKHQ5LCBzMTApIHsKICAgICAgbGV0IGkxMSA9IHQ5OwogICAgICBzd2l0Y2ggKHMxMCkgewogICAgICAgIGNhc2UgQm9vbGVhbjoKICAgICAgICAgIGkxMSA9IG51bGwgIT09IHQ5OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBOdW1iZXI6CiAgICAgICAgICBpMTEgPSBudWxsID09PSB0OSA/IG51bGwgOiBOdW1iZXIodDkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBPYmplY3Q6CiAgICAgICAgY2FzZSBBcnJheToKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGkxMSA9IEpTT04ucGFyc2UodDkpOwogICAgICAgICAgfSBjYXRjaCAodDEwKSB7CiAgICAgICAgICAgIGkxMSA9IG51bGw7CiAgICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGkxMTsKICAgIH0gfSwgZiA9ICh0OSwgczEwKSA9PiAhaTIodDksIHMxMCksIGIgPSB7IGF0dHJpYnV0ZTogdHJ1ZSwgdHlwZTogU3RyaW5nLCBjb252ZXJ0ZXI6IHUsIHJlZmxlY3Q6IGZhbHNlLCB1c2VEZWZhdWx0OiBmYWxzZSwgaGFzQ2hhbmdlZDogZiB9OwogICAgU3ltYm9sLm1ldGFkYXRhID8/PSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKCJtZXRhZGF0YSIpLCBhLmxpdFByb3BlcnR5TWV0YWRhdGEgPz89IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogICAgeSA9IGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQgewogICAgICBzdGF0aWMgYWRkSW5pdGlhbGl6ZXIodDkpIHsKICAgICAgICB0aGlzLl8kRWkoKSwgKHRoaXMubCA/Pz0gW10pLnB1c2godDkpOwogICAgICB9CiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgewogICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKCksIHRoaXMuXyRFaCAmJiBbLi4udGhpcy5fJEVoLmtleXMoKV07CiAgICAgIH0KICAgICAgc3RhdGljIGNyZWF0ZVByb3BlcnR5KHQ5LCBzMTAgPSBiKSB7CiAgICAgICAgaWYgKHMxMC5zdGF0ZSAmJiAoczEwLmF0dHJpYnV0ZSA9IGZhbHNlKSwgdGhpcy5fJEVpKCksIHRoaXMucHJvdG90eXBlLmhhc093blByb3BlcnR5KHQ5KSAmJiAoKHMxMCA9IE9iamVjdC5jcmVhdGUoczEwKSkud3JhcHBlZCA9IHRydWUpLCB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzLnNldCh0OSwgczEwKSwgIXMxMC5ub0FjY2Vzc29yKSB7CiAgICAgICAgICBjb25zdCBpMTEgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKCksIGg5ID0gdGhpcy5nZXRQcm9wZXJ0eURlc2NyaXB0b3IodDksIGkxMSwgczEwKTsKICAgICAgICAgIHZvaWQgMCAhPT0gaDkgJiYgZTIodGhpcy5wcm90b3R5cGUsIHQ5LCBoOSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0YXRpYyBnZXRQcm9wZXJ0eURlc2NyaXB0b3IodDksIHMxMCwgaTExKSB7CiAgICAgICAgY29uc3QgeyBnZXQ6IGUxMSwgc2V0OiByMTEgfSA9IGgodGhpcy5wcm90b3R5cGUsIHQ5KSA/PyB7IGdldCgpIHsKICAgICAgICAgIHJldHVybiB0aGlzW3MxMF07CiAgICAgICAgfSwgc2V0KHQxMCkgewogICAgICAgICAgdGhpc1tzMTBdID0gdDEwOwogICAgICAgIH0gfTsKICAgICAgICByZXR1cm4geyBnZXQ6IGUxMSwgc2V0KHMxMSkgewogICAgICAgICAgY29uc3QgaDkgPSBlMTE/LmNhbGwodGhpcyk7CiAgICAgICAgICByMTE/LmNhbGwodGhpcywgczExKSwgdGhpcy5yZXF1ZXN0VXBkYXRlKHQ5LCBoOSwgaTExKTsKICAgICAgICB9LCBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUgfTsKICAgICAgfQogICAgICBzdGF0aWMgZ2V0UHJvcGVydHlPcHRpb25zKHQ5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFByb3BlcnRpZXMuZ2V0KHQ5KSA/PyBiOwogICAgICB9CiAgICAgIHN0YXRpYyBfJEVpKCkgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGQoImVsZW1lbnRQcm9wZXJ0aWVzIikpKSByZXR1cm47CiAgICAgICAgY29uc3QgdDkgPSBuMih0aGlzKTsKICAgICAgICB0OS5maW5hbGl6ZSgpLCB2b2lkIDAgIT09IHQ5LmwgJiYgKHRoaXMubCA9IFsuLi50OS5sXSksIHRoaXMuZWxlbWVudFByb3BlcnRpZXMgPSBuZXcgTWFwKHQ5LmVsZW1lbnRQcm9wZXJ0aWVzKTsKICAgICAgfQogICAgICBzdGF0aWMgZmluYWxpemUoKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZCgiZmluYWxpemVkIikpKSByZXR1cm47CiAgICAgICAgaWYgKHRoaXMuZmluYWxpemVkID0gdHJ1ZSwgdGhpcy5fJEVpKCksIHRoaXMuaGFzT3duUHJvcGVydHkoZCgicHJvcGVydGllcyIpKSkgewogICAgICAgICAgY29uc3QgdDEwID0gdGhpcy5wcm9wZXJ0aWVzLCBzMTAgPSBbLi4ucjIodDEwKSwgLi4ubzIodDEwKV07CiAgICAgICAgICBmb3IgKGNvbnN0IGkxMSBvZiBzMTApIHRoaXMuY3JlYXRlUHJvcGVydHkoaTExLCB0MTBbaTExXSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHQ5ID0gdGhpc1tTeW1ib2wubWV0YWRhdGFdOwogICAgICAgIGlmIChudWxsICE9PSB0OSkgewogICAgICAgICAgY29uc3QgczEwID0gbGl0UHJvcGVydHlNZXRhZGF0YS5nZXQodDkpOwogICAgICAgICAgaWYgKHZvaWQgMCAhPT0gczEwKSBmb3IgKGNvbnN0IFt0MTAsIGkxMV0gb2YgczEwKSB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzLnNldCh0MTAsIGkxMSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuXyRFaCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgICAgZm9yIChjb25zdCBbdDEwLCBzMTBdIG9mIHRoaXMuZWxlbWVudFByb3BlcnRpZXMpIHsKICAgICAgICAgIGNvbnN0IGkxMSA9IHRoaXMuXyRFdSh0MTAsIHMxMCk7CiAgICAgICAgICB2b2lkIDAgIT09IGkxMSAmJiB0aGlzLl8kRWguc2V0KGkxMSwgdDEwKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5lbGVtZW50U3R5bGVzID0gdGhpcy5maW5hbGl6ZVN0eWxlcyh0aGlzLnN0eWxlcyk7CiAgICAgIH0KICAgICAgc3RhdGljIGZpbmFsaXplU3R5bGVzKHMxMCkgewogICAgICAgIGNvbnN0IGkxMSA9IFtdOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHMxMCkpIHsKICAgICAgICAgIGNvbnN0IGUxMSA9IG5ldyBTZXQoczEwLmZsYXQoMSAvIDApLnJldmVyc2UoKSk7CiAgICAgICAgICBmb3IgKGNvbnN0IHMxMSBvZiBlMTEpIGkxMS51bnNoaWZ0KGMoczExKSk7CiAgICAgICAgfSBlbHNlIHZvaWQgMCAhPT0gczEwICYmIGkxMS5wdXNoKGMoczEwKSk7CiAgICAgICAgcmV0dXJuIGkxMTsKICAgICAgfQogICAgICBzdGF0aWMgXyRFdSh0OSwgczEwKSB7CiAgICAgICAgY29uc3QgaTExID0gczEwLmF0dHJpYnV0ZTsKICAgICAgICByZXR1cm4gZmFsc2UgPT09IGkxMSA/IHZvaWQgMCA6ICJzdHJpbmciID09IHR5cGVvZiBpMTEgPyBpMTEgOiAic3RyaW5nIiA9PSB0eXBlb2YgdDkgPyB0OS50b0xvd2VyQ2FzZSgpIDogdm9pZCAwOwogICAgICB9CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCksIHRoaXMuXyRFcCA9IHZvaWQgMCwgdGhpcy5pc1VwZGF0ZVBlbmRpbmcgPSBmYWxzZSwgdGhpcy5oYXNVcGRhdGVkID0gZmFsc2UsIHRoaXMuXyRFbSA9IG51bGwsIHRoaXMuXyRFdigpOwogICAgICB9CiAgICAgIF8kRXYoKSB7CiAgICAgICAgdGhpcy5fJEVTID0gbmV3IFByb21pc2UoKHQ5KSA9PiB0aGlzLmVuYWJsZVVwZGF0aW5nID0gdDkpLCB0aGlzLl8kQUwgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCB0aGlzLl8kRV8oKSwgdGhpcy5yZXF1ZXN0VXBkYXRlKCksIHRoaXMuY29uc3RydWN0b3IubD8uZm9yRWFjaCgodDkpID0+IHQ5KHRoaXMpKTsKICAgICAgfQogICAgICBhZGRDb250cm9sbGVyKHQ5KSB7CiAgICAgICAgKHRoaXMuXyRFTyA/Pz0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSkuYWRkKHQ5KSwgdm9pZCAwICE9PSB0aGlzLnJlbmRlclJvb3QgJiYgdGhpcy5pc0Nvbm5lY3RlZCAmJiB0OS5ob3N0Q29ubmVjdGVkPy4oKTsKICAgICAgfQogICAgICByZW1vdmVDb250cm9sbGVyKHQ5KSB7CiAgICAgICAgdGhpcy5fJEVPPy5kZWxldGUodDkpOwogICAgICB9CiAgICAgIF8kRV8oKSB7CiAgICAgICAgY29uc3QgdDkgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBzMTAgPSB0aGlzLmNvbnN0cnVjdG9yLmVsZW1lbnRQcm9wZXJ0aWVzOwogICAgICAgIGZvciAoY29uc3QgaTExIG9mIHMxMC5rZXlzKCkpIHRoaXMuaGFzT3duUHJvcGVydHkoaTExKSAmJiAodDkuc2V0KGkxMSwgdGhpc1tpMTFdKSwgZGVsZXRlIHRoaXNbaTExXSk7CiAgICAgICAgdDkuc2l6ZSA+IDAgJiYgKHRoaXMuXyRFcCA9IHQ5KTsKICAgICAgfQogICAgICBjcmVhdGVSZW5kZXJSb290KCkgewogICAgICAgIGNvbnN0IHQ5ID0gdGhpcy5zaGFkb3dSb290ID8/IHRoaXMuYXR0YWNoU2hhZG93KHRoaXMuY29uc3RydWN0b3Iuc2hhZG93Um9vdE9wdGlvbnMpOwogICAgICAgIHJldHVybiBTKHQ5LCB0aGlzLmNvbnN0cnVjdG9yLmVsZW1lbnRTdHlsZXMpLCB0OTsKICAgICAgfQogICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICB0aGlzLnJlbmRlclJvb3QgPz89IHRoaXMuY3JlYXRlUmVuZGVyUm9vdCgpLCB0aGlzLmVuYWJsZVVwZGF0aW5nKHRydWUpLCB0aGlzLl8kRU8/LmZvckVhY2goKHQ5KSA9PiB0OS5ob3N0Q29ubmVjdGVkPy4oKSk7CiAgICAgIH0KICAgICAgZW5hYmxlVXBkYXRpbmcodDkpIHsKICAgICAgfQogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICB0aGlzLl8kRU8/LmZvckVhY2goKHQ5KSA9PiB0OS5ob3N0RGlzY29ubmVjdGVkPy4oKSk7CiAgICAgIH0KICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHQ5LCBzMTAsIGkxMSkgewogICAgICAgIHRoaXMuXyRBSyh0OSwgaTExKTsKICAgICAgfQogICAgICBfJEVUKHQ5LCBzMTApIHsKICAgICAgICBjb25zdCBpMTEgPSB0aGlzLmNvbnN0cnVjdG9yLmVsZW1lbnRQcm9wZXJ0aWVzLmdldCh0OSksIGUxMSA9IHRoaXMuY29uc3RydWN0b3IuXyRFdSh0OSwgaTExKTsKICAgICAgICBpZiAodm9pZCAwICE9PSBlMTEgJiYgdHJ1ZSA9PT0gaTExLnJlZmxlY3QpIHsKICAgICAgICAgIGNvbnN0IGg5ID0gKHZvaWQgMCAhPT0gaTExLmNvbnZlcnRlcj8udG9BdHRyaWJ1dGUgPyBpMTEuY29udmVydGVyIDogdSkudG9BdHRyaWJ1dGUoczEwLCBpMTEudHlwZSk7CiAgICAgICAgICB0aGlzLl8kRW0gPSB0OSwgbnVsbCA9PSBoOSA/IHRoaXMucmVtb3ZlQXR0cmlidXRlKGUxMSkgOiB0aGlzLnNldEF0dHJpYnV0ZShlMTEsIGg5KSwgdGhpcy5fJEVtID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgXyRBSyh0OSwgczEwKSB7CiAgICAgICAgY29uc3QgaTExID0gdGhpcy5jb25zdHJ1Y3RvciwgZTExID0gaTExLl8kRWguZ2V0KHQ5KTsKICAgICAgICBpZiAodm9pZCAwICE9PSBlMTEgJiYgdGhpcy5fJEVtICE9PSBlMTEpIHsKICAgICAgICAgIGNvbnN0IHQxMCA9IGkxMS5nZXRQcm9wZXJ0eU9wdGlvbnMoZTExKSwgaDkgPSAiZnVuY3Rpb24iID09IHR5cGVvZiB0MTAuY29udmVydGVyID8geyBmcm9tQXR0cmlidXRlOiB0MTAuY29udmVydGVyIH0gOiB2b2lkIDAgIT09IHQxMC5jb252ZXJ0ZXI/LmZyb21BdHRyaWJ1dGUgPyB0MTAuY29udmVydGVyIDogdTsKICAgICAgICAgIHRoaXMuXyRFbSA9IGUxMTsKICAgICAgICAgIGNvbnN0IHIxMSA9IGg5LmZyb21BdHRyaWJ1dGUoczEwLCB0MTAudHlwZSk7CiAgICAgICAgICB0aGlzW2UxMV0gPSByMTEgPz8gdGhpcy5fJEVqPy5nZXQoZTExKSA/PyByMTEsIHRoaXMuXyRFbSA9IG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlcXVlc3RVcGRhdGUodDksIHMxMCwgaTExLCBlMTEgPSBmYWxzZSwgaDkpIHsKICAgICAgICBpZiAodm9pZCAwICE9PSB0OSkgewogICAgICAgICAgY29uc3QgcjExID0gdGhpcy5jb25zdHJ1Y3RvcjsKICAgICAgICAgIGlmIChmYWxzZSA9PT0gZTExICYmIChoOSA9IHRoaXNbdDldKSwgaTExID8/PSByMTEuZ2V0UHJvcGVydHlPcHRpb25zKHQ5KSwgISgoaTExLmhhc0NoYW5nZWQgPz8gZikoaDksIHMxMCkgfHwgaTExLnVzZURlZmF1bHQgJiYgaTExLnJlZmxlY3QgJiYgaDkgPT09IHRoaXMuXyRFaj8uZ2V0KHQ5KSAmJiAhdGhpcy5oYXNBdHRyaWJ1dGUocjExLl8kRXUodDksIGkxMSkpKSkgcmV0dXJuOwogICAgICAgICAgdGhpcy5DKHQ5LCBzMTAsIGkxMSk7CiAgICAgICAgfQogICAgICAgIGZhbHNlID09PSB0aGlzLmlzVXBkYXRlUGVuZGluZyAmJiAodGhpcy5fJEVTID0gdGhpcy5fJEVQKCkpOwogICAgICB9CiAgICAgIEModDksIHMxMCwgeyB1c2VEZWZhdWx0OiBpMTEsIHJlZmxlY3Q6IGUxMSwgd3JhcHBlZDogaDkgfSwgcjExKSB7CiAgICAgICAgaTExICYmICEodGhpcy5fJEVqID8/PSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKS5oYXModDkpICYmICh0aGlzLl8kRWouc2V0KHQ5LCByMTEgPz8gczEwID8/IHRoaXNbdDldKSwgdHJ1ZSAhPT0gaDkgfHwgdm9pZCAwICE9PSByMTEpIHx8ICh0aGlzLl8kQUwuaGFzKHQ5KSB8fCAodGhpcy5oYXNVcGRhdGVkIHx8IGkxMSB8fCAoczEwID0gdm9pZCAwKSwgdGhpcy5fJEFMLnNldCh0OSwgczEwKSksIHRydWUgPT09IGUxMSAmJiB0aGlzLl8kRW0gIT09IHQ5ICYmICh0aGlzLl8kRXEgPz89IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpLmFkZCh0OSkpOwogICAgICB9CiAgICAgIGFzeW5jIF8kRVAoKSB7CiAgICAgICAgdGhpcy5pc1VwZGF0ZVBlbmRpbmcgPSB0cnVlOwogICAgICAgIHRyeSB7CiAgICAgICAgICBhd2FpdCB0aGlzLl8kRVM7CiAgICAgICAgfSBjYXRjaCAodDEwKSB7CiAgICAgICAgICBQcm9taXNlLnJlamVjdCh0MTApOwogICAgICAgIH0KICAgICAgICBjb25zdCB0OSA9IHRoaXMuc2NoZWR1bGVVcGRhdGUoKTsKICAgICAgICByZXR1cm4gbnVsbCAhPSB0OSAmJiBhd2FpdCB0OSwgIXRoaXMuaXNVcGRhdGVQZW5kaW5nOwogICAgICB9CiAgICAgIHNjaGVkdWxlVXBkYXRlKCkgewogICAgICAgIHJldHVybiB0aGlzLnBlcmZvcm1VcGRhdGUoKTsKICAgICAgfQogICAgICBwZXJmb3JtVXBkYXRlKCkgewogICAgICAgIGlmICghdGhpcy5pc1VwZGF0ZVBlbmRpbmcpIHJldHVybjsKICAgICAgICBpZiAoIXRoaXMuaGFzVXBkYXRlZCkgewogICAgICAgICAgaWYgKHRoaXMucmVuZGVyUm9vdCA/Pz0gdGhpcy5jcmVhdGVSZW5kZXJSb290KCksIHRoaXMuXyRFcCkgewogICAgICAgICAgICBmb3IgKGNvbnN0IFt0MTEsIHMxMV0gb2YgdGhpcy5fJEVwKSB0aGlzW3QxMV0gPSBzMTE7CiAgICAgICAgICAgIHRoaXMuXyRFcCA9IHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHQxMCA9IHRoaXMuY29uc3RydWN0b3IuZWxlbWVudFByb3BlcnRpZXM7CiAgICAgICAgICBpZiAodDEwLnNpemUgPiAwKSBmb3IgKGNvbnN0IFtzMTEsIGkxMV0gb2YgdDEwKSB7CiAgICAgICAgICAgIGNvbnN0IHsgd3JhcHBlZDogdDExIH0gPSBpMTEsIGUxMSA9IHRoaXNbczExXTsKICAgICAgICAgICAgdHJ1ZSAhPT0gdDExIHx8IHRoaXMuXyRBTC5oYXMoczExKSB8fCB2b2lkIDAgPT09IGUxMSB8fCB0aGlzLkMoczExLCB2b2lkIDAsIGkxMSwgZTExKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IHQ5ID0gZmFsc2U7CiAgICAgICAgY29uc3QgczEwID0gdGhpcy5fJEFMOwogICAgICAgIHRyeSB7CiAgICAgICAgICB0OSA9IHRoaXMuc2hvdWxkVXBkYXRlKHMxMCksIHQ5ID8gKHRoaXMud2lsbFVwZGF0ZShzMTApLCB0aGlzLl8kRU8/LmZvckVhY2goKHQxMCkgPT4gdDEwLmhvc3RVcGRhdGU/LigpKSwgdGhpcy51cGRhdGUoczEwKSkgOiB0aGlzLl8kRU0oKTsKICAgICAgICB9IGNhdGNoIChzMTEpIHsKICAgICAgICAgIHRocm93IHQ5ID0gZmFsc2UsIHRoaXMuXyRFTSgpLCBzMTE7CiAgICAgICAgfQogICAgICAgIHQ5ICYmIHRoaXMuXyRBRShzMTApOwogICAgICB9CiAgICAgIHdpbGxVcGRhdGUodDkpIHsKICAgICAgfQogICAgICBfJEFFKHQ5KSB7CiAgICAgICAgdGhpcy5fJEVPPy5mb3JFYWNoKCh0MTApID0+IHQxMC5ob3N0VXBkYXRlZD8uKCkpLCB0aGlzLmhhc1VwZGF0ZWQgfHwgKHRoaXMuaGFzVXBkYXRlZCA9IHRydWUsIHRoaXMuZmlyc3RVcGRhdGVkKHQ5KSksIHRoaXMudXBkYXRlZCh0OSk7CiAgICAgIH0KICAgICAgXyRFTSgpIHsKICAgICAgICB0aGlzLl8kQUwgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCB0aGlzLmlzVXBkYXRlUGVuZGluZyA9IGZhbHNlOwogICAgICB9CiAgICAgIGdldCB1cGRhdGVDb21wbGV0ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRVcGRhdGVDb21wbGV0ZSgpOwogICAgICB9CiAgICAgIGdldFVwZGF0ZUNvbXBsZXRlKCkgewogICAgICAgIHJldHVybiB0aGlzLl8kRVM7CiAgICAgIH0KICAgICAgc2hvdWxkVXBkYXRlKHQ5KSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgdXBkYXRlKHQ5KSB7CiAgICAgICAgdGhpcy5fJEVxICYmPSB0aGlzLl8kRXEuZm9yRWFjaCgodDEwKSA9PiB0aGlzLl8kRVQodDEwLCB0aGlzW3QxMF0pKSwgdGhpcy5fJEVNKCk7CiAgICAgIH0KICAgICAgdXBkYXRlZCh0OSkgewogICAgICB9CiAgICAgIGZpcnN0VXBkYXRlZCh0OSkgewogICAgICB9CiAgICB9OwogICAgeS5lbGVtZW50U3R5bGVzID0gW10sIHkuc2hhZG93Um9vdE9wdGlvbnMgPSB7IG1vZGU6ICJvcGVuIiB9LCB5W2QoImVsZW1lbnRQcm9wZXJ0aWVzIildID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgeVtkKCJmaW5hbGl6ZWQiKV0gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBwPy4oeyBSZWFjdGl2ZUVsZW1lbnQ6IHkgfSksIChhLnJlYWN0aXZlRWxlbWVudFZlcnNpb25zID8/PSBbXSkucHVzaCgiMi4xLjIiKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9saXQtaHRtbC5qcwpmdW5jdGlvbiBWKHQ5LCBpMTEpIHsKICBpZiAoIXUyKHQ5KSB8fCAhdDkuaGFzT3duUHJvcGVydHkoInJhdyIpKSB0aHJvdyBFcnJvcigiaW52YWxpZCB0ZW1wbGF0ZSBzdHJpbmdzIGFycmF5Iik7CiAgcmV0dXJuIHZvaWQgMCAhPT0gZTMgPyBlMy5jcmVhdGVIVE1MKGkxMSkgOiBpMTE7Cn0KZnVuY3Rpb24gTSh0OSwgaTExLCBzMTAgPSB0OSwgZTExKSB7CiAgaWYgKGkxMSA9PT0gRSkgcmV0dXJuIGkxMTsKICBsZXQgaDkgPSB2b2lkIDAgIT09IGUxMSA/IHMxMC5fJENvPy5bZTExXSA6IHMxMC5fJENsOwogIGNvbnN0IG8xMyA9IGEyKGkxMSkgPyB2b2lkIDAgOiBpMTEuXyRsaXREaXJlY3RpdmUkOwogIHJldHVybiBoOT8uY29uc3RydWN0b3IgIT09IG8xMyAmJiAoaDk/Ll8kQU8/LihmYWxzZSksIHZvaWQgMCA9PT0gbzEzID8gaDkgPSB2b2lkIDAgOiAoaDkgPSBuZXcgbzEzKHQ5KSwgaDkuXyRBVCh0OSwgczEwLCBlMTEpKSwgdm9pZCAwICE9PSBlMTEgPyAoczEwLl8kQ28gPz89IFtdKVtlMTFdID0gaDkgOiBzMTAuXyRDbCA9IGg5KSwgdm9pZCAwICE9PSBoOSAmJiAoaTExID0gTSh0OSwgaDkuXyRBUyh0OSwgaTExLnZhbHVlcyksIGg5LCBlMTEpKSwgaTExOwp9CnZhciB0MiwgaTMsIHMyLCBlMywgaDIsIG8zLCBuMywgcjMsIGwyLCBjMywgYTIsIHUyLCBkMiwgZjIsIHYsIF8sIG0sIHAyLCBnLCAkLCB5MiwgeCwgYjIsIHcsIFQsIEUsIEEsIEMsIFAsIE4sIFMyLCBSLCBrLCBILCBJLCBMLCB6LCBaLCBqLCBCLCBEOwp2YXIgaW5pdF9saXRfaHRtbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9saXQtaHRtbC5qcyIoKSB7CiAgICB0MiA9IGdsb2JhbFRoaXMsIGkzID0gKHQ5KSA9PiB0OSwgczIgPSB0Mi50cnVzdGVkVHlwZXMsIGUzID0gczIgPyBzMi5jcmVhdGVQb2xpY3koImxpdC1odG1sIiwgeyBjcmVhdGVIVE1MOiAodDkpID0+IHQ5IH0pIDogdm9pZCAwLCBoMiA9ICIkbGl0JCIsIG8zID0gYGxpdCQke01hdGgucmFuZG9tKCkudG9GaXhlZCg5KS5zbGljZSgyKX0kYCwgbjMgPSAiPyIgKyBvMywgcjMgPSBgPCR7bjN9PmAsIGwyID0gZG9jdW1lbnQsIGMzID0gKCkgPT4gbDIuY3JlYXRlQ29tbWVudCgiIiksIGEyID0gKHQ5KSA9PiBudWxsID09PSB0OSB8fCAib2JqZWN0IiAhPSB0eXBlb2YgdDkgJiYgImZ1bmN0aW9uIiAhPSB0eXBlb2YgdDksIHUyID0gQXJyYXkuaXNBcnJheSwgZDIgPSAodDkpID0+IHUyKHQ5KSB8fCAiZnVuY3Rpb24iID09IHR5cGVvZiB0OT8uW1N5bWJvbC5pdGVyYXRvcl0sIGYyID0gIlsgCVxuXGZccl0iLCB2ID0gLzwoPzooIS0tfFwvW15hLXpBLVpdKXwoXC8/W2EtekEtWl1bXj5cc10qKXwoXC8/JCkpL2csIF8gPSAvLS0+L2csIG0gPSAvPi9nLCBwMiA9IFJlZ0V4cChgPnwke2YyfSg/OihbXlxccyInPj0vXSspKCR7ZjJ9Kj0ke2YyfSooPzpbXiAJClxmXHIiJ1xgPD49XXwoInwnKXwpKXwkKWAsICJnIiksIGcgPSAvJy9nLCAkID0gLyIvZywgeTIgPSAvXig/OnNjcmlwdHxzdHlsZXx0ZXh0YXJlYXx0aXRsZSkkL2ksIHggPSAodDkpID0+IChpMTEsIC4uLnMxMCkgPT4gKHsgXyRsaXRUeXBlJDogdDksIHN0cmluZ3M6IGkxMSwgdmFsdWVzOiBzMTAgfSksIGIyID0geCgxKSwgdyA9IHgoMiksIFQgPSB4KDMpLCBFID0gLyogQF9fUFVSRV9fICovIFN5bWJvbC5mb3IoImxpdC1ub0NoYW5nZSIpLCBBID0gLyogQF9fUFVSRV9fICovIFN5bWJvbC5mb3IoImxpdC1ub3RoaW5nIiksIEMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKSwgUCA9IGwyLmNyZWF0ZVRyZWVXYWxrZXIobDIsIDEyOSk7CiAgICBOID0gKHQ5LCBpMTEpID0+IHsKICAgICAgY29uc3QgczEwID0gdDkubGVuZ3RoIC0gMSwgZTExID0gW107CiAgICAgIGxldCBuMTMsIGw2ID0gMiA9PT0gaTExID8gIjxzdmc+IiA6IDMgPT09IGkxMSA/ICI8bWF0aD4iIDogIiIsIGMxMSA9IHY7CiAgICAgIGZvciAobGV0IGkxMiA9IDA7IGkxMiA8IHMxMDsgaTEyKyspIHsKICAgICAgICBjb25zdCBzMTEgPSB0OVtpMTJdOwogICAgICAgIGxldCBhNSwgdTcsIGQ2ID0gLTEsIGY4ID0gMDsKICAgICAgICBmb3IgKDsgZjggPCBzMTEubGVuZ3RoICYmIChjMTEubGFzdEluZGV4ID0gZjgsIHU3ID0gYzExLmV4ZWMoczExKSwgbnVsbCAhPT0gdTcpOyApIGY4ID0gYzExLmxhc3RJbmRleCwgYzExID09PSB2ID8gIiEtLSIgPT09IHU3WzFdID8gYzExID0gXyA6IHZvaWQgMCAhPT0gdTdbMV0gPyBjMTEgPSBtIDogdm9pZCAwICE9PSB1N1syXSA/ICh5Mi50ZXN0KHU3WzJdKSAmJiAobjEzID0gUmVnRXhwKCI8LyIgKyB1N1syXSwgImciKSksIGMxMSA9IHAyKSA6IHZvaWQgMCAhPT0gdTdbM10gJiYgKGMxMSA9IHAyKSA6IGMxMSA9PT0gcDIgPyAiPiIgPT09IHU3WzBdID8gKGMxMSA9IG4xMyA/PyB2LCBkNiA9IC0xKSA6IHZvaWQgMCA9PT0gdTdbMV0gPyBkNiA9IC0yIDogKGQ2ID0gYzExLmxhc3RJbmRleCAtIHU3WzJdLmxlbmd0aCwgYTUgPSB1N1sxXSwgYzExID0gdm9pZCAwID09PSB1N1szXSA/IHAyIDogJyInID09PSB1N1szXSA/ICQgOiBnKSA6IGMxMSA9PT0gJCB8fCBjMTEgPT09IGcgPyBjMTEgPSBwMiA6IGMxMSA9PT0gXyB8fCBjMTEgPT09IG0gPyBjMTEgPSB2IDogKGMxMSA9IHAyLCBuMTMgPSB2b2lkIDApOwogICAgICAgIGNvbnN0IHg0ID0gYzExID09PSBwMiAmJiB0OVtpMTIgKyAxXS5zdGFydHNXaXRoKCIvPiIpID8gIiAiIDogIiI7CiAgICAgICAgbDYgKz0gYzExID09PSB2ID8gczExICsgcjMgOiBkNiA+PSAwID8gKGUxMS5wdXNoKGE1KSwgczExLnNsaWNlKDAsIGQ2KSArIGgyICsgczExLnNsaWNlKGQ2KSArIG8zICsgeDQpIDogczExICsgbzMgKyAoLTIgPT09IGQ2ID8gaTEyIDogeDQpOwogICAgICB9CiAgICAgIHJldHVybiBbVih0OSwgbDYgKyAodDlbczEwXSB8fCAiPD8+IikgKyAoMiA9PT0gaTExID8gIjwvc3ZnPiIgOiAzID09PSBpMTEgPyAiPC9tYXRoPiIgOiAiIikpLCBlMTFdOwogICAgfTsKICAgIFMyID0gY2xhc3MgX1MgewogICAgICBjb25zdHJ1Y3Rvcih7IHN0cmluZ3M6IHQ5LCBfJGxpdFR5cGUkOiBpMTEgfSwgZTExKSB7CiAgICAgICAgbGV0IHIxMTsKICAgICAgICB0aGlzLnBhcnRzID0gW107CiAgICAgICAgbGV0IGw2ID0gMCwgYTUgPSAwOwogICAgICAgIGNvbnN0IHU3ID0gdDkubGVuZ3RoIC0gMSwgZDYgPSB0aGlzLnBhcnRzLCBbZjgsIHY2XSA9IE4odDksIGkxMSk7CiAgICAgICAgaWYgKHRoaXMuZWwgPSBfUy5jcmVhdGVFbGVtZW50KGY4LCBlMTEpLCBQLmN1cnJlbnROb2RlID0gdGhpcy5lbC5jb250ZW50LCAyID09PSBpMTEgfHwgMyA9PT0gaTExKSB7CiAgICAgICAgICBjb25zdCB0MTAgPSB0aGlzLmVsLmNvbnRlbnQuZmlyc3RDaGlsZDsKICAgICAgICAgIHQxMC5yZXBsYWNlV2l0aCguLi50MTAuY2hpbGROb2Rlcyk7CiAgICAgICAgfQogICAgICAgIGZvciAoOyBudWxsICE9PSAocjExID0gUC5uZXh0Tm9kZSgpKSAmJiBkNi5sZW5ndGggPCB1NzsgKSB7CiAgICAgICAgICBpZiAoMSA9PT0gcjExLm5vZGVUeXBlKSB7CiAgICAgICAgICAgIGlmIChyMTEuaGFzQXR0cmlidXRlcygpKSBmb3IgKGNvbnN0IHQxMCBvZiByMTEuZ2V0QXR0cmlidXRlTmFtZXMoKSkgaWYgKHQxMC5lbmRzV2l0aChoMikpIHsKICAgICAgICAgICAgICBjb25zdCBpMTIgPSB2NlthNSsrXSwgczEwID0gcjExLmdldEF0dHJpYnV0ZSh0MTApLnNwbGl0KG8zKSwgZTEyID0gLyhbLj9AXSk/KC4qKS8uZXhlYyhpMTIpOwogICAgICAgICAgICAgIGQ2LnB1c2goeyB0eXBlOiAxLCBpbmRleDogbDYsIG5hbWU6IGUxMlsyXSwgc3RyaW5nczogczEwLCBjdG9yOiAiLiIgPT09IGUxMlsxXSA/IEkgOiAiPyIgPT09IGUxMlsxXSA/IEwgOiAiQCIgPT09IGUxMlsxXSA/IHogOiBIIH0pLCByMTEucmVtb3ZlQXR0cmlidXRlKHQxMCk7CiAgICAgICAgICAgIH0gZWxzZSB0MTAuc3RhcnRzV2l0aChvMykgJiYgKGQ2LnB1c2goeyB0eXBlOiA2LCBpbmRleDogbDYgfSksIHIxMS5yZW1vdmVBdHRyaWJ1dGUodDEwKSk7CiAgICAgICAgICAgIGlmICh5Mi50ZXN0KHIxMS50YWdOYW1lKSkgewogICAgICAgICAgICAgIGNvbnN0IHQxMCA9IHIxMS50ZXh0Q29udGVudC5zcGxpdChvMyksIGkxMiA9IHQxMC5sZW5ndGggLSAxOwogICAgICAgICAgICAgIGlmIChpMTIgPiAwKSB7CiAgICAgICAgICAgICAgICByMTEudGV4dENvbnRlbnQgPSBzMiA/IHMyLmVtcHR5U2NyaXB0IDogIiI7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBzMTAgPSAwOyBzMTAgPCBpMTI7IHMxMCsrKSByMTEuYXBwZW5kKHQxMFtzMTBdLCBjMygpKSwgUC5uZXh0Tm9kZSgpLCBkNi5wdXNoKHsgdHlwZTogMiwgaW5kZXg6ICsrbDYgfSk7CiAgICAgICAgICAgICAgICByMTEuYXBwZW5kKHQxMFtpMTJdLCBjMygpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoOCA9PT0gcjExLm5vZGVUeXBlKSBpZiAocjExLmRhdGEgPT09IG4zKSBkNi5wdXNoKHsgdHlwZTogMiwgaW5kZXg6IGw2IH0pOwogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGxldCB0MTAgPSAtMTsKICAgICAgICAgICAgZm9yICg7IC0xICE9PSAodDEwID0gcjExLmRhdGEuaW5kZXhPZihvMywgdDEwICsgMSkpOyApIGQ2LnB1c2goeyB0eXBlOiA3LCBpbmRleDogbDYgfSksIHQxMCArPSBvMy5sZW5ndGggLSAxOwogICAgICAgICAgfQogICAgICAgICAgbDYrKzsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhdGljIGNyZWF0ZUVsZW1lbnQodDksIGkxMSkgewogICAgICAgIGNvbnN0IHMxMCA9IGwyLmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7CiAgICAgICAgcmV0dXJuIHMxMC5pbm5lckhUTUwgPSB0OSwgczEwOwogICAgICB9CiAgICB9OwogICAgUiA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IodDksIGkxMSkgewogICAgICAgIHRoaXMuXyRBViA9IFtdLCB0aGlzLl8kQU4gPSB2b2lkIDAsIHRoaXMuXyRBRCA9IHQ5LCB0aGlzLl8kQU0gPSBpMTE7CiAgICAgIH0KICAgICAgZ2V0IHBhcmVudE5vZGUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuXyRBTS5wYXJlbnROb2RlOwogICAgICB9CiAgICAgIGdldCBfJEFVKCkgewogICAgICAgIHJldHVybiB0aGlzLl8kQU0uXyRBVTsKICAgICAgfQogICAgICB1KHQ5KSB7CiAgICAgICAgY29uc3QgeyBlbDogeyBjb250ZW50OiBpMTEgfSwgcGFydHM6IHMxMCB9ID0gdGhpcy5fJEFELCBlMTEgPSAodDk/LmNyZWF0aW9uU2NvcGUgPz8gbDIpLmltcG9ydE5vZGUoaTExLCB0cnVlKTsKICAgICAgICBQLmN1cnJlbnROb2RlID0gZTExOwogICAgICAgIGxldCBoOSA9IFAubmV4dE5vZGUoKSwgbzEzID0gMCwgbjEzID0gMCwgcjExID0gczEwWzBdOwogICAgICAgIGZvciAoOyB2b2lkIDAgIT09IHIxMTsgKSB7CiAgICAgICAgICBpZiAobzEzID09PSByMTEuaW5kZXgpIHsKICAgICAgICAgICAgbGV0IGkxMjsKICAgICAgICAgICAgMiA9PT0gcjExLnR5cGUgPyBpMTIgPSBuZXcgayhoOSwgaDkubmV4dFNpYmxpbmcsIHRoaXMsIHQ5KSA6IDEgPT09IHIxMS50eXBlID8gaTEyID0gbmV3IHIxMS5jdG9yKGg5LCByMTEubmFtZSwgcjExLnN0cmluZ3MsIHRoaXMsIHQ5KSA6IDYgPT09IHIxMS50eXBlICYmIChpMTIgPSBuZXcgWihoOSwgdGhpcywgdDkpKSwgdGhpcy5fJEFWLnB1c2goaTEyKSwgcjExID0gczEwWysrbjEzXTsKICAgICAgICAgIH0KICAgICAgICAgIG8xMyAhPT0gcjExPy5pbmRleCAmJiAoaDkgPSBQLm5leHROb2RlKCksIG8xMysrKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFAuY3VycmVudE5vZGUgPSBsMiwgZTExOwogICAgICB9CiAgICAgIHAodDkpIHsKICAgICAgICBsZXQgaTExID0gMDsKICAgICAgICBmb3IgKGNvbnN0IHMxMCBvZiB0aGlzLl8kQVYpIHZvaWQgMCAhPT0gczEwICYmICh2b2lkIDAgIT09IHMxMC5zdHJpbmdzID8gKHMxMC5fJEFJKHQ5LCBzMTAsIGkxMSksIGkxMSArPSBzMTAuc3RyaW5ncy5sZW5ndGggLSAyKSA6IHMxMC5fJEFJKHQ5W2kxMV0pKSwgaTExKys7CiAgICAgIH0KICAgIH07CiAgICBrID0gY2xhc3MgX2sgewogICAgICBnZXQgXyRBVSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fJEFNPy5fJEFVID8/IHRoaXMuXyRDdjsKICAgICAgfQogICAgICBjb25zdHJ1Y3Rvcih0OSwgaTExLCBzMTAsIGUxMSkgewogICAgICAgIHRoaXMudHlwZSA9IDIsIHRoaXMuXyRBSCA9IEEsIHRoaXMuXyRBTiA9IHZvaWQgMCwgdGhpcy5fJEFBID0gdDksIHRoaXMuXyRBQiA9IGkxMSwgdGhpcy5fJEFNID0gczEwLCB0aGlzLm9wdGlvbnMgPSBlMTEsIHRoaXMuXyRDdiA9IGUxMT8uaXNDb25uZWN0ZWQgPz8gdHJ1ZTsKICAgICAgfQogICAgICBnZXQgcGFyZW50Tm9kZSgpIHsKICAgICAgICBsZXQgdDkgPSB0aGlzLl8kQUEucGFyZW50Tm9kZTsKICAgICAgICBjb25zdCBpMTEgPSB0aGlzLl8kQU07CiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gaTExICYmIDExID09PSB0OT8ubm9kZVR5cGUgJiYgKHQ5ID0gaTExLnBhcmVudE5vZGUpLCB0OTsKICAgICAgfQogICAgICBnZXQgc3RhcnROb2RlKCkgewogICAgICAgIHJldHVybiB0aGlzLl8kQUE7CiAgICAgIH0KICAgICAgZ2V0IGVuZE5vZGUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuXyRBQjsKICAgICAgfQogICAgICBfJEFJKHQ5LCBpMTEgPSB0aGlzKSB7CiAgICAgICAgdDkgPSBNKHRoaXMsIHQ5LCBpMTEpLCBhMih0OSkgPyB0OSA9PT0gQSB8fCBudWxsID09IHQ5IHx8ICIiID09PSB0OSA/ICh0aGlzLl8kQUggIT09IEEgJiYgdGhpcy5fJEFSKCksIHRoaXMuXyRBSCA9IEEpIDogdDkgIT09IHRoaXMuXyRBSCAmJiB0OSAhPT0gRSAmJiB0aGlzLl8odDkpIDogdm9pZCAwICE9PSB0OS5fJGxpdFR5cGUkID8gdGhpcy4kKHQ5KSA6IHZvaWQgMCAhPT0gdDkubm9kZVR5cGUgPyB0aGlzLlQodDkpIDogZDIodDkpID8gdGhpcy5rKHQ5KSA6IHRoaXMuXyh0OSk7CiAgICAgIH0KICAgICAgTyh0OSkgewogICAgICAgIHJldHVybiB0aGlzLl8kQUEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodDksIHRoaXMuXyRBQik7CiAgICAgIH0KICAgICAgVCh0OSkgewogICAgICAgIHRoaXMuXyRBSCAhPT0gdDkgJiYgKHRoaXMuXyRBUigpLCB0aGlzLl8kQUggPSB0aGlzLk8odDkpKTsKICAgICAgfQogICAgICBfKHQ5KSB7CiAgICAgICAgdGhpcy5fJEFIICE9PSBBICYmIGEyKHRoaXMuXyRBSCkgPyB0aGlzLl8kQUEubmV4dFNpYmxpbmcuZGF0YSA9IHQ5IDogdGhpcy5UKGwyLmNyZWF0ZVRleHROb2RlKHQ5KSksIHRoaXMuXyRBSCA9IHQ5OwogICAgICB9CiAgICAgICQodDkpIHsKICAgICAgICBjb25zdCB7IHZhbHVlczogaTExLCBfJGxpdFR5cGUkOiBzMTAgfSA9IHQ5LCBlMTEgPSAibnVtYmVyIiA9PSB0eXBlb2YgczEwID8gdGhpcy5fJEFDKHQ5KSA6ICh2b2lkIDAgPT09IHMxMC5lbCAmJiAoczEwLmVsID0gUzIuY3JlYXRlRWxlbWVudChWKHMxMC5oLCBzMTAuaFswXSksIHRoaXMub3B0aW9ucykpLCBzMTApOwogICAgICAgIGlmICh0aGlzLl8kQUg/Ll8kQUQgPT09IGUxMSkgdGhpcy5fJEFILnAoaTExKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGNvbnN0IHQxMCA9IG5ldyBSKGUxMSwgdGhpcyksIHMxMSA9IHQxMC51KHRoaXMub3B0aW9ucyk7CiAgICAgICAgICB0MTAucChpMTEpLCB0aGlzLlQoczExKSwgdGhpcy5fJEFIID0gdDEwOwogICAgICAgIH0KICAgICAgfQogICAgICBfJEFDKHQ5KSB7CiAgICAgICAgbGV0IGkxMSA9IEMuZ2V0KHQ5LnN0cmluZ3MpOwogICAgICAgIHJldHVybiB2b2lkIDAgPT09IGkxMSAmJiBDLnNldCh0OS5zdHJpbmdzLCBpMTEgPSBuZXcgUzIodDkpKSwgaTExOwogICAgICB9CiAgICAgIGsodDkpIHsKICAgICAgICB1Mih0aGlzLl8kQUgpIHx8ICh0aGlzLl8kQUggPSBbXSwgdGhpcy5fJEFSKCkpOwogICAgICAgIGNvbnN0IGkxMSA9IHRoaXMuXyRBSDsKICAgICAgICBsZXQgczEwLCBlMTEgPSAwOwogICAgICAgIGZvciAoY29uc3QgaDkgb2YgdDkpIGUxMSA9PT0gaTExLmxlbmd0aCA/IGkxMS5wdXNoKHMxMCA9IG5ldyBfayh0aGlzLk8oYzMoKSksIHRoaXMuTyhjMygpKSwgdGhpcywgdGhpcy5vcHRpb25zKSkgOiBzMTAgPSBpMTFbZTExXSwgczEwLl8kQUkoaDkpLCBlMTErKzsKICAgICAgICBlMTEgPCBpMTEubGVuZ3RoICYmICh0aGlzLl8kQVIoczEwICYmIHMxMC5fJEFCLm5leHRTaWJsaW5nLCBlMTEpLCBpMTEubGVuZ3RoID0gZTExKTsKICAgICAgfQogICAgICBfJEFSKHQ5ID0gdGhpcy5fJEFBLm5leHRTaWJsaW5nLCBzMTApIHsKICAgICAgICBmb3IgKHRoaXMuXyRBUD8uKGZhbHNlLCB0cnVlLCBzMTApOyB0OSAhPT0gdGhpcy5fJEFCOyApIHsKICAgICAgICAgIGNvbnN0IHMxMSA9IGkzKHQ5KS5uZXh0U2libGluZzsKICAgICAgICAgIGkzKHQ5KS5yZW1vdmUoKSwgdDkgPSBzMTE7CiAgICAgICAgfQogICAgICB9CiAgICAgIHNldENvbm5lY3RlZCh0OSkgewogICAgICAgIHZvaWQgMCA9PT0gdGhpcy5fJEFNICYmICh0aGlzLl8kQ3YgPSB0OSwgdGhpcy5fJEFQPy4odDkpKTsKICAgICAgfQogICAgfTsKICAgIEggPSBjbGFzcyB7CiAgICAgIGdldCB0YWdOYW1lKCkgewogICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQudGFnTmFtZTsKICAgICAgfQogICAgICBnZXQgXyRBVSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fJEFNLl8kQVU7CiAgICAgIH0KICAgICAgY29uc3RydWN0b3IodDksIGkxMSwgczEwLCBlMTEsIGg5KSB7CiAgICAgICAgdGhpcy50eXBlID0gMSwgdGhpcy5fJEFIID0gQSwgdGhpcy5fJEFOID0gdm9pZCAwLCB0aGlzLmVsZW1lbnQgPSB0OSwgdGhpcy5uYW1lID0gaTExLCB0aGlzLl8kQU0gPSBlMTEsIHRoaXMub3B0aW9ucyA9IGg5LCBzMTAubGVuZ3RoID4gMiB8fCAiIiAhPT0gczEwWzBdIHx8ICIiICE9PSBzMTBbMV0gPyAodGhpcy5fJEFIID0gQXJyYXkoczEwLmxlbmd0aCAtIDEpLmZpbGwobmV3IFN0cmluZygpKSwgdGhpcy5zdHJpbmdzID0gczEwKSA6IHRoaXMuXyRBSCA9IEE7CiAgICAgIH0KICAgICAgXyRBSSh0OSwgaTExID0gdGhpcywgczEwLCBlMTEpIHsKICAgICAgICBjb25zdCBoOSA9IHRoaXMuc3RyaW5nczsKICAgICAgICBsZXQgbzEzID0gZmFsc2U7CiAgICAgICAgaWYgKHZvaWQgMCA9PT0gaDkpIHQ5ID0gTSh0aGlzLCB0OSwgaTExLCAwKSwgbzEzID0gIWEyKHQ5KSB8fCB0OSAhPT0gdGhpcy5fJEFIICYmIHQ5ICE9PSBFLCBvMTMgJiYgKHRoaXMuXyRBSCA9IHQ5KTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGNvbnN0IGUxMiA9IHQ5OwogICAgICAgICAgbGV0IG4xMywgcjExOwogICAgICAgICAgZm9yICh0OSA9IGg5WzBdLCBuMTMgPSAwOyBuMTMgPCBoOS5sZW5ndGggLSAxOyBuMTMrKykgcjExID0gTSh0aGlzLCBlMTJbczEwICsgbjEzXSwgaTExLCBuMTMpLCByMTEgPT09IEUgJiYgKHIxMSA9IHRoaXMuXyRBSFtuMTNdKSwgbzEzIHx8PSAhYTIocjExKSB8fCByMTEgIT09IHRoaXMuXyRBSFtuMTNdLCByMTEgPT09IEEgPyB0OSA9IEEgOiB0OSAhPT0gQSAmJiAodDkgKz0gKHIxMSA/PyAiIikgKyBoOVtuMTMgKyAxXSksIHRoaXMuXyRBSFtuMTNdID0gcjExOwogICAgICAgIH0KICAgICAgICBvMTMgJiYgIWUxMSAmJiB0aGlzLmoodDkpOwogICAgICB9CiAgICAgIGoodDkpIHsKICAgICAgICB0OSA9PT0gQSA/IHRoaXMuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUodGhpcy5uYW1lKSA6IHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUodGhpcy5uYW1lLCB0OSA/PyAiIik7CiAgICAgIH0KICAgIH07CiAgICBJID0gY2xhc3MgZXh0ZW5kcyBIIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy50eXBlID0gMzsKICAgICAgfQogICAgICBqKHQ5KSB7CiAgICAgICAgdGhpcy5lbGVtZW50W3RoaXMubmFtZV0gPSB0OSA9PT0gQSA/IHZvaWQgMCA6IHQ5OwogICAgICB9CiAgICB9OwogICAgTCA9IGNsYXNzIGV4dGVuZHMgSCB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMudHlwZSA9IDQ7CiAgICAgIH0KICAgICAgaih0OSkgewogICAgICAgIHRoaXMuZWxlbWVudC50b2dnbGVBdHRyaWJ1dGUodGhpcy5uYW1lLCAhIXQ5ICYmIHQ5ICE9PSBBKTsKICAgICAgfQogICAgfTsKICAgIHogPSBjbGFzcyBleHRlbmRzIEggewogICAgICBjb25zdHJ1Y3Rvcih0OSwgaTExLCBzMTAsIGUxMSwgaDkpIHsKICAgICAgICBzdXBlcih0OSwgaTExLCBzMTAsIGUxMSwgaDkpLCB0aGlzLnR5cGUgPSA1OwogICAgICB9CiAgICAgIF8kQUkodDksIGkxMSA9IHRoaXMpIHsKICAgICAgICBpZiAoKHQ5ID0gTSh0aGlzLCB0OSwgaTExLCAwKSA/PyBBKSA9PT0gRSkgcmV0dXJuOwogICAgICAgIGNvbnN0IHMxMCA9IHRoaXMuXyRBSCwgZTExID0gdDkgPT09IEEgJiYgczEwICE9PSBBIHx8IHQ5LmNhcHR1cmUgIT09IHMxMC5jYXB0dXJlIHx8IHQ5Lm9uY2UgIT09IHMxMC5vbmNlIHx8IHQ5LnBhc3NpdmUgIT09IHMxMC5wYXNzaXZlLCBoOSA9IHQ5ICE9PSBBICYmIChzMTAgPT09IEEgfHwgZTExKTsKICAgICAgICBlMTEgJiYgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5uYW1lLCB0aGlzLCBzMTApLCBoOSAmJiB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLm5hbWUsIHRoaXMsIHQ5KSwgdGhpcy5fJEFIID0gdDk7CiAgICAgIH0KICAgICAgaGFuZGxlRXZlbnQodDkpIHsKICAgICAgICAiZnVuY3Rpb24iID09IHR5cGVvZiB0aGlzLl8kQUggPyB0aGlzLl8kQUguY2FsbCh0aGlzLm9wdGlvbnM/Lmhvc3QgPz8gdGhpcy5lbGVtZW50LCB0OSkgOiB0aGlzLl8kQUguaGFuZGxlRXZlbnQodDkpOwogICAgICB9CiAgICB9OwogICAgWiA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IodDksIGkxMSwgczEwKSB7CiAgICAgICAgdGhpcy5lbGVtZW50ID0gdDksIHRoaXMudHlwZSA9IDYsIHRoaXMuXyRBTiA9IHZvaWQgMCwgdGhpcy5fJEFNID0gaTExLCB0aGlzLm9wdGlvbnMgPSBzMTA7CiAgICAgIH0KICAgICAgZ2V0IF8kQVUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuXyRBTS5fJEFVOwogICAgICB9CiAgICAgIF8kQUkodDkpIHsKICAgICAgICBNKHRoaXMsIHQ5KTsKICAgICAgfQogICAgfTsKICAgIGogPSB7IE06IGgyLCBQOiBvMywgQTogbjMsIEM6IDEsIEw6IE4sIFIsIEQ6IGQyLCBWOiBNLCBJOiBrLCBILCBOOiBMLCBVOiB6LCBCOiBJLCBGOiBaIH0sIEIgPSB0Mi5saXRIdG1sUG9seWZpbGxTdXBwb3J0OwogICAgQj8uKFMyLCBrKSwgKHQyLmxpdEh0bWxWZXJzaW9ucyA/Pz0gW10pLnB1c2goIjMuMy4yIik7CiAgICBEID0gKHQ5LCBpMTEsIHMxMCkgPT4gewogICAgICBjb25zdCBlMTEgPSBzMTA/LnJlbmRlckJlZm9yZSA/PyBpMTE7CiAgICAgIGxldCBoOSA9IGUxMS5fJGxpdFBhcnQkOwogICAgICBpZiAodm9pZCAwID09PSBoOSkgewogICAgICAgIGNvbnN0IHQxMCA9IHMxMD8ucmVuZGVyQmVmb3JlID8/IG51bGw7CiAgICAgICAgZTExLl8kbGl0UGFydCQgPSBoOSA9IG5ldyBrKGkxMS5pbnNlcnRCZWZvcmUoYzMoKSwgdDEwKSwgdDEwLCB2b2lkIDAsIHMxMCA/PyB7fSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGg5Ll8kQUkodDkpLCBoOTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9saXQtZWxlbWVudEA0LjIuMi9ub2RlX21vZHVsZXMvbGl0LWVsZW1lbnQvbGl0LWVsZW1lbnQuanMKdmFyIHMzLCBpNCwgbzQsIG40Owp2YXIgaW5pdF9saXRfZWxlbWVudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1lbGVtZW50QDQuMi4yL25vZGVfbW9kdWxlcy9saXQtZWxlbWVudC9saXQtZWxlbWVudC5qcyIoKSB7CiAgICBpbml0X3JlYWN0aXZlX2VsZW1lbnQoKTsKICAgIGluaXRfcmVhY3RpdmVfZWxlbWVudCgpOwogICAgaW5pdF9saXRfaHRtbCgpOwogICAgaW5pdF9saXRfaHRtbCgpOwogICAgczMgPSBnbG9iYWxUaGlzOwogICAgaTQgPSBjbGFzcyBleHRlbmRzIHkgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLnJlbmRlck9wdGlvbnMgPSB7IGhvc3Q6IHRoaXMgfSwgdGhpcy5fJERvID0gdm9pZCAwOwogICAgICB9CiAgICAgIGNyZWF0ZVJlbmRlclJvb3QoKSB7CiAgICAgICAgY29uc3QgdDkgPSBzdXBlci5jcmVhdGVSZW5kZXJSb290KCk7CiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyT3B0aW9ucy5yZW5kZXJCZWZvcmUgPz89IHQ5LmZpcnN0Q2hpbGQsIHQ5OwogICAgICB9CiAgICAgIHVwZGF0ZSh0OSkgewogICAgICAgIGNvbnN0IHIxMSA9IHRoaXMucmVuZGVyKCk7CiAgICAgICAgdGhpcy5oYXNVcGRhdGVkIHx8ICh0aGlzLnJlbmRlck9wdGlvbnMuaXNDb25uZWN0ZWQgPSB0aGlzLmlzQ29ubmVjdGVkKSwgc3VwZXIudXBkYXRlKHQ5KSwgdGhpcy5fJERvID0gRChyMTEsIHRoaXMucmVuZGVyUm9vdCwgdGhpcy5yZW5kZXJPcHRpb25zKTsKICAgICAgfQogICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLCB0aGlzLl8kRG8/LnNldENvbm5lY3RlZCh0cnVlKTsKICAgICAgfQogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpLCB0aGlzLl8kRG8/LnNldENvbm5lY3RlZChmYWxzZSk7CiAgICAgIH0KICAgICAgcmVuZGVyKCkgewogICAgICAgIHJldHVybiBFOwogICAgICB9CiAgICB9OwogICAgaTQuXyRsaXRFbGVtZW50JCA9IHRydWUsIGk0WyJmaW5hbGl6ZWQiXSA9IHRydWUsIHMzLmxpdEVsZW1lbnRIeWRyYXRlU3VwcG9ydD8uKHsgTGl0RWxlbWVudDogaTQgfSk7CiAgICBvNCA9IHMzLmxpdEVsZW1lbnRQb2x5ZmlsbFN1cHBvcnQ7CiAgICBvND8uKHsgTGl0RWxlbWVudDogaTQgfSk7CiAgICBuNCA9IHsgXyRBSzogKHQ5LCBlMTEsIHIxMSkgPT4gewogICAgICB0OS5fJEFLKGUxMSwgcjExKTsKICAgIH0sIF8kQUw6ICh0OSkgPT4gdDkuXyRBTCB9OwogICAgKHMzLmxpdEVsZW1lbnRWZXJzaW9ucyA/Pz0gW10pLnB1c2goIjQuMi4yIik7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9saXQtaHRtbEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvaXMtc2VydmVyLmpzCnZhciBvNTsKdmFyIGluaXRfaXNfc2VydmVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2lzLXNlcnZlci5qcyIoKSB7CiAgICBvNSA9IGZhbHNlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0QDMuMy4yL25vZGVfbW9kdWxlcy9saXQvaW5kZXguanMKdmFyIGluaXRfbGl0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbGl0QDMuMy4yL25vZGVfbW9kdWxlcy9saXQvaW5kZXguanMiKCkgewogICAgaW5pdF9yZWFjdGl2ZV9lbGVtZW50KCk7CiAgICBpbml0X2xpdF9odG1sKCk7CiAgICBpbml0X2xpdF9lbGVtZW50KCk7CiAgICBpbml0X2lzX3NlcnZlcigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MraXNvdW5pcXVlQDEuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9pc291bmlxdWUvZGlzdF90cy9pbmRleC5qcwp2YXIgcmVxdWlyZV9kaXN0X3RzID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcytpc291bmlxdWVAMS4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2lzb3VuaXF1ZS9kaXN0X3RzL2luZGV4LmpzIihleHBvcnRzKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgZXhwb3J0cy51bmkgPSB2b2lkIDA7CiAgICB2YXIgdW5pMyA9IChwcmVmaXg0ID0gInVuaSIpID0+IHsKICAgICAgcmV0dXJuIGAke3ByZWZpeDR9XyR7YHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eGAucmVwbGFjZSgvW3h5XS9nLCAoYzExKSA9PiB7CiAgICAgICAgY29uc3QgcjExID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMDsKICAgICAgICBjb25zdCB2NiA9IGMxMSA9PT0gIngiID8gcjExIDogcjExICYgMyB8IDg7CiAgICAgICAgcmV0dXJuIHY2LnRvU3RyaW5nKDE2KTsKICAgICAgfSl9YDsKICAgIH07CiAgICBleHBvcnRzLnVuaSA9IHVuaTM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHByb21pc2VANC4yLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cHJvbWlzZS9kaXN0X3RzL3NtYXJ0cHJvbWlzZS5jbGFzc2VzLmRlZmVycmVkLmpzCnZhciBEZWZlcnJlZCwgZGVmZXI7CnZhciBpbml0X3NtYXJ0cHJvbWlzZV9jbGFzc2VzX2RlZmVycmVkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRwcm9taXNlQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9zbWFydHByb21pc2UuY2xhc3Nlcy5kZWZlcnJlZC5qcyIoKSB7CiAgICBEZWZlcnJlZCA9IGNsYXNzIHsKICAgICAgY2xhaW0oKSB7CiAgICAgICAgaWYgKHRoaXMuY2xhaW1lZCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJEZWZlcnJlZCBhbHJlYWR5IGNsYWltZWQiKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5jbGFpbWVkID0gdHJ1ZTsKICAgICAgfQogICAgICBnZXQgZHVyYXRpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuc3RvcHBlZEF0KSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5zdG9wcGVkQXQgLSB0aGlzLnN0YXJ0ZWRBdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIERhdGUubm93KCkgLSB0aGlzLnN0YXJ0ZWRBdDsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5jbGFpbWVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgICAgICAgIHRoaXMucmVzb2x2ZSA9ICh2YWx1ZUFyZykgPT4gewogICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICJmdWxmaWxsZWQiOwogICAgICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIHJlc29sdmUyKHZhbHVlQXJnKTsKICAgICAgICAgIH07CiAgICAgICAgICB0aGlzLnJlamVjdCA9IChyZWFzb24pID0+IHsKICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAicmVqZWN0ZWQiOwogICAgICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIHJlamVjdChyZWFzb24pOwogICAgICAgICAgfTsKICAgICAgICAgIHRoaXMuc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgIHRoaXMuc3RhdHVzID0gInBlbmRpbmciOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgZGVmZXIgPSAoKSA9PiB7CiAgICAgIHJldHVybiBuZXcgRGVmZXJyZWQoKTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHByb21pc2VANC4yLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cHJvbWlzZS9kaXN0X3RzL3NtYXJ0cHJvbWlzZS5jbGFzc2VzLmN1bXVsYXRpdmVkZWZlcnJlZC5qcwp2YXIgQ3VtdWxhdGl2ZURlZmVycmVkLCBjdW11bGF0aXZlRGVmZXI7CnZhciBpbml0X3NtYXJ0cHJvbWlzZV9jbGFzc2VzX2N1bXVsYXRpdmVkZWZlcnJlZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cHJvbWlzZUA0LjIuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRwcm9taXNlL2Rpc3RfdHMvc21hcnRwcm9taXNlLmNsYXNzZXMuY3VtdWxhdGl2ZWRlZmVycmVkLmpzIigpIHsKICAgIGluaXRfc21hcnRwcm9taXNlX2NsYXNzZXNfZGVmZXJyZWQoKTsKICAgIEN1bXVsYXRpdmVEZWZlcnJlZCA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZFByb21pc2VzID0gW107CiAgICAgICAgdGhpcy5kZWZlcnJlZCA9IGRlZmVyKCk7CiAgICAgICAgdGhpcy5wcm9taXNlID0gdGhpcy5kZWZlcnJlZC5wcm9taXNlOwogICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4gewogICAgICAgICAgd2hpbGUgKHRoaXMuYWNjdW11bGF0ZWRQcm9taXNlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGNvbnN0IHBvcHBlZFByb21pc2UgPSB0aGlzLmFjY3VtdWxhdGVkUHJvbWlzZXMuc2hpZnQoKTsKICAgICAgICAgICAgYXdhaXQgcG9wcGVkUHJvbWlzZTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuZGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgIH0sIDApOwogICAgICB9CiAgICAgIHN1YkRlZmVyKCkgewogICAgICAgIGNvbnN0IGRvbmUgPSBkZWZlcigpOwogICAgICAgIHRoaXMuYWRkUHJvbWlzZShkb25lLnByb21pc2UpOwogICAgICAgIHJldHVybiBkb25lOwogICAgICB9CiAgICAgIGFkZFByb21pc2UocHJvbWlzZUFyZykgewogICAgICAgIHRoaXMuYWNjdW11bGF0ZWRQcm9taXNlcy5wdXNoKHByb21pc2VBcmcpOwogICAgICB9CiAgICB9OwogICAgY3VtdWxhdGl2ZURlZmVyID0gKCkgPT4gewogICAgICByZXR1cm4gbmV3IEN1bXVsYXRpdmVEZWZlcnJlZCgpOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cHJvbWlzZUA0LjIuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRwcm9taXNlL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMsIHsKICBDdW11bGF0aXZlRGVmZXJyZWQ6ICgpID0+IEN1bXVsYXRpdmVEZWZlcnJlZCwKICBEZWZlcnJlZDogKCkgPT4gRGVmZXJyZWQsCiAgY3VtdWxhdGl2ZURlZmVyOiAoKSA9PiBjdW11bGF0aXZlRGVmZXIsCiAgZGVmZXI6ICgpID0+IGRlZmVyLAogIGZyb21DYWxsYmFjazogKCkgPT4gZnJvbUNhbGxiYWNrLAogIGdldEZpcnN0VHJ1ZU9yRmFsc2U6ICgpID0+IGdldEZpcnN0VHJ1ZU9yRmFsc2UsCiAgbWFwOiAoKSA9PiBtYXAsCiAgcmVqZWN0ZWRQcm9taXNlOiAoKSA9PiByZWplY3RlZFByb21pc2UsCiAgcmVzb2x2ZWRQcm9taXNlOiAoKSA9PiByZXNvbHZlZFByb21pc2UsCiAgdGltZW91dEFuZENvbnRpbnVlOiAoKSA9PiB0aW1lb3V0QW5kQ29udGludWUsCiAgdGltZW91dFdyYXA6ICgpID0+IHRpbWVvdXRXcmFwCn0pOwp2YXIgcmVzb2x2ZWRQcm9taXNlLCByZWplY3RlZFByb21pc2UsIG1hcCwgdGltZW91dFdyYXAsIHRpbWVvdXRBbmRDb250aW51ZSwgZ2V0Rmlyc3RUcnVlT3JGYWxzZSwgZnJvbUNhbGxiYWNrOwp2YXIgaW5pdF9kaXN0X3RzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRwcm9taXNlQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9pbmRleC5qcyIoKSB7CiAgICBpbml0X3NtYXJ0cHJvbWlzZV9jbGFzc2VzX2RlZmVycmVkKCk7CiAgICBpbml0X3NtYXJ0cHJvbWlzZV9jbGFzc2VzX2N1bXVsYXRpdmVkZWZlcnJlZCgpOwogICAgaW5pdF9zbWFydHByb21pc2VfY2xhc3Nlc19kZWZlcnJlZCgpOwogICAgcmVzb2x2ZWRQcm9taXNlID0gKHZhbHVlMikgPT4gewogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlMik7CiAgICB9OwogICAgcmVqZWN0ZWRQcm9taXNlID0gKGVycikgPT4gewogICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTsKICAgIH07CiAgICBtYXAgPSBhc3luYyAoaW5wdXRBcmcsIGZ1bmN0aW9uQXJnKSA9PiB7CiAgICAgIGNvbnN0IHByb21pc2VBcnJheSA9IFtdOwogICAgICBjb25zdCByZXN1bHRBcnJheSA9IFtdOwogICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaW5wdXRBcmcpIHsKICAgICAgICBjb25zdCBwcm9taXNlID0gZnVuY3Rpb25BcmcoaXRlbSk7CiAgICAgICAgcHJvbWlzZUFycmF5LnB1c2gocHJvbWlzZSk7CiAgICAgICAgcHJvbWlzZS50aGVuKCh4NCkgPT4gewogICAgICAgICAgcmVzdWx0QXJyYXkucHVzaCh4NCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZUFycmF5KTsKICAgICAgcmV0dXJuIHJlc3VsdEFycmF5OwogICAgfTsKICAgIHRpbWVvdXRXcmFwID0gYXN5bmMgKHByb21pc2VBcmcsIHRpbWVvdXRJbk1zQXJnLCByZWplY3RBcmcgPSB0cnVlKSA9PiB7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdCkgPT4gewogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgaWYgKHJlamVjdEFyZykgewogICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCJ0aW1lb3V0IikpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzb2x2ZTIobnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgdGltZW91dEluTXNBcmcpOwogICAgICAgIHByb21pc2VBcmcudGhlbihyZXNvbHZlMiwgcmVqZWN0KTsKICAgICAgfSk7CiAgICB9OwogICAgdGltZW91dEFuZENvbnRpbnVlID0gYXN5bmMgKHByb21pc2VBcmcsIHRpbWVvdXRJbk1zQXJnID0gNmU0KSA9PiB7CiAgICAgIHJldHVybiB0aW1lb3V0V3JhcChwcm9taXNlQXJnLCB0aW1lb3V0SW5Nc0FyZywgZmFsc2UpOwogICAgfTsKICAgIGdldEZpcnN0VHJ1ZU9yRmFsc2UgPSBhc3luYyAocHJvbWlzZXNBcmcpID0+IHsKICAgICAgY29uc3QgZG9uZSA9IGRlZmVyKCk7CiAgICAgIGZvciAoY29uc3QgcHJvbWlzZUFyZyBvZiBwcm9taXNlc0FyZykgewogICAgICAgIHByb21pc2VBcmcudGhlbigocmVzdWx0QXJnKSA9PiB7CiAgICAgICAgICBpZiAocmVzdWx0QXJnID09PSB0cnVlKSB7CiAgICAgICAgICAgIGRvbmUucmVzb2x2ZSh0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICBQcm9taXNlLmFsbChwcm9taXNlc0FyZykudGhlbigoKSA9PiB7CiAgICAgICAgZG9uZS5yZXNvbHZlKGZhbHNlKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBkb25lLnByb21pc2U7CiAgICB9OwogICAgZnJvbUNhbGxiYWNrID0gKGZuKSA9PiB7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdCkgPT4gewogICAgICAgIGZuKChlcnIsIHJlc3VsdCkgPT4gewogICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc29sdmUyKHJlc3VsdCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cnhAMy4wLjEwL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHJ4L2Rpc3RfdHMvc21hcnRyeC5wbHVnaW5zLmpzCnZhciBpbml0X3NtYXJ0cnhfcGx1Z2lucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cnhAMy4wLjEwL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHJ4L2Rpc3RfdHMvc21hcnRyeC5wbHVnaW5zLmpzIigpIHsKICAgIGluaXRfZGlzdF90cygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdHNsaWJAMi44LjEvbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5tanMKZnVuY3Rpb24gX19leHRlbmRzKGQ2LCBiNikgewogIGlmICh0eXBlb2YgYjYgIT09ICJmdW5jdGlvbiIgJiYgYjYgIT09IG51bGwpCiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDbGFzcyBleHRlbmRzIHZhbHVlICIgKyBTdHJpbmcoYjYpICsgIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsIik7CiAgZXh0ZW5kU3RhdGljcyhkNiwgYjYpOwogIGZ1bmN0aW9uIF9fKCkgewogICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ2OwogIH0KICBkNi5wcm90b3R5cGUgPSBiNiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYjYpIDogKF9fLnByb3RvdHlwZSA9IGI2LnByb3RvdHlwZSwgbmV3IF9fKCkpOwp9CmZ1bmN0aW9uIF9fcmVzdChzMTAsIGUxMSkgewogIHZhciB0OSA9IHt9OwogIGZvciAodmFyIHA4IGluIHMxMCkgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzMTAsIHA4KSAmJiBlMTEuaW5kZXhPZihwOCkgPCAwKQogICAgdDlbcDhdID0gczEwW3A4XTsKICBpZiAoczEwICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICJmdW5jdGlvbiIpCiAgICBmb3IgKHZhciBpMTEgPSAwLCBwOCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoczEwKTsgaTExIDwgcDgubGVuZ3RoOyBpMTErKykgewogICAgICBpZiAoZTExLmluZGV4T2YocDhbaTExXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzMTAsIHA4W2kxMV0pKQogICAgICAgIHQ5W3A4W2kxMV1dID0gczEwW3A4W2kxMV1dOwogICAgfQogIHJldHVybiB0OTsKfQpmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5MiwgZGVzYykgewogIHZhciBjMTEgPSBhcmd1bWVudHMubGVuZ3RoLCByMTEgPSBjMTEgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5MikgOiBkZXNjLCBkNjsKICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJvYmplY3QiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSAiZnVuY3Rpb24iKSByMTEgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5MiwgZGVzYyk7CiAgZWxzZSBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgaWYgKGQ2ID0gZGVjb3JhdG9yc1tpMTFdKSByMTEgPSAoYzExIDwgMyA/IGQ2KHIxMSkgOiBjMTEgPiAzID8gZDYodGFyZ2V0LCBrZXkyLCByMTEpIDogZDYodGFyZ2V0LCBrZXkyKSkgfHwgcjExOwogIHJldHVybiBjMTEgPiAzICYmIHIxMSAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXkyLCByMTEpLCByMTE7Cn0KZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHsKICByZXR1cm4gZnVuY3Rpb24odGFyZ2V0LCBrZXkyKSB7CiAgICBkZWNvcmF0b3IodGFyZ2V0LCBrZXkyLCBwYXJhbUluZGV4KTsKICB9Owp9CmZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn0KZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnMyKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9CmZ1bmN0aW9uIF9fcHJvcEtleSh4NCkgewogIHJldHVybiB0eXBlb2YgeDQgPT09ICJzeW1ib2wiID8geDQgOiAiIi5jb25jYXQoeDQpOwp9CmZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGY4LCBuYW1lLCBwcmVmaXg0KSB7CiAgaWYgKHR5cGVvZiBuYW1lID09PSAic3ltYm9sIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyAiWyIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sICJdIikgOiAiIjsKICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGY4LCAibmFtZSIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4NCA/ICIiLmNvbmNhdChwcmVmaXg0LCAiICIsIG5hbWUpIDogbmFtZSB9KTsKfQpmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7CiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAib2JqZWN0IiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpOwp9CmZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQNSwgZ2VuZXJhdG9yKSB7CiAgZnVuY3Rpb24gYWRvcHQodmFsdWUyKSB7CiAgICByZXR1cm4gdmFsdWUyIGluc3RhbmNlb2YgUDUgPyB2YWx1ZTIgOiBuZXcgUDUoZnVuY3Rpb24ocmVzb2x2ZTIpIHsKICAgICAgcmVzb2x2ZTIodmFsdWUyKTsKICAgIH0pOwogIH0KICByZXR1cm4gbmV3IChQNSB8fCAoUDUgPSBQcm9taXNlKSkoZnVuY3Rpb24ocmVzb2x2ZTIsIHJlamVjdCkgewogICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlMikgewogICAgICB0cnkgewogICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUyKSk7CiAgICAgIH0gY2F0Y2ggKGUxMSkgewogICAgICAgIHJlamVjdChlMTEpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZTIpIHsKICAgICAgdHJ5IHsKICAgICAgICBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZTIpKTsKICAgICAgfSBjYXRjaCAoZTExKSB7CiAgICAgICAgcmVqZWN0KGUxMSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7CiAgICAgIHJlc3VsdC5kb25lID8gcmVzb2x2ZTIocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsKICAgIH0KICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTsKICB9KTsKfQpmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5MykgewogIHZhciBfNSA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKHQ5WzBdICYgMSkgdGhyb3cgdDlbMV07CiAgICByZXR1cm4gdDlbMV07CiAgfSwgdHJ5czogW10sIG9wczogW10gfSwgZjgsIHk1LCB0OSwgZzUgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09ICJmdW5jdGlvbiIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTsKICByZXR1cm4gZzUubmV4dCA9IHZlcmIoMCksIGc1WyJ0aHJvdyJdID0gdmVyYigxKSwgZzVbInJldHVybiJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiAoZzVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSksIGc1OwogIGZ1bmN0aW9uIHZlcmIobjEzKSB7CiAgICByZXR1cm4gZnVuY3Rpb24odjYpIHsKICAgICAgcmV0dXJuIHN0ZXAoW24xMywgdjZdKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHN0ZXAob3ApIHsKICAgIGlmIChmOCkgdGhyb3cgbmV3IFR5cGVFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLiIpOwogICAgd2hpbGUgKGc1ICYmIChnNSA9IDAsIG9wWzBdICYmIChfNSA9IDApKSwgXzUpIHRyeSB7CiAgICAgIGlmIChmOCA9IDEsIHk1ICYmICh0OSA9IG9wWzBdICYgMiA/IHk1WyJyZXR1cm4iXSA6IG9wWzBdID8geTVbInRocm93Il0gfHwgKCh0OSA9IHk1WyJyZXR1cm4iXSkgJiYgdDkuY2FsbCh5NSksIDApIDogeTUubmV4dCkgJiYgISh0OSA9IHQ5LmNhbGwoeTUsIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ5OwogICAgICBpZiAoeTUgPSAwLCB0OSkgb3AgPSBbb3BbMF0gJiAyLCB0OS52YWx1ZV07CiAgICAgIHN3aXRjaCAob3BbMF0pIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgdDkgPSBvcDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgIF81LmxhYmVsKys7CiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07CiAgICAgICAgY2FzZSA1OgogICAgICAgICAgXzUubGFiZWwrKzsKICAgICAgICAgIHk1ID0gb3BbMV07CiAgICAgICAgICBvcCA9IFswXTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNhc2UgNzoKICAgICAgICAgIG9wID0gXzUub3BzLnBvcCgpOwogICAgICAgICAgXzUudHJ5cy5wb3AoKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpZiAoISh0OSA9IF81LnRyeXMsIHQ5ID0gdDkubGVuZ3RoID4gMCAmJiB0OVt0OS5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgewogICAgICAgICAgICBfNSA9IDA7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdDkgfHwgb3BbMV0gPiB0OVswXSAmJiBvcFsxXSA8IHQ5WzNdKSkgewogICAgICAgICAgICBfNS5sYWJlbCA9IG9wWzFdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfNS5sYWJlbCA8IHQ5WzFdKSB7CiAgICAgICAgICAgIF81LmxhYmVsID0gdDlbMV07CiAgICAgICAgICAgIHQ5ID0gb3A7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHQ5ICYmIF81LmxhYmVsIDwgdDlbMl0pIHsKICAgICAgICAgICAgXzUubGFiZWwgPSB0OVsyXTsKICAgICAgICAgICAgXzUub3BzLnB1c2gob3ApOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0OVsyXSkgXzUub3BzLnBvcCgpOwogICAgICAgICAgXzUudHJ5cy5wb3AoKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIG9wID0gYm9keTMuY2FsbCh0aGlzQXJnLCBfNSk7CiAgICB9IGNhdGNoIChlMTEpIHsKICAgICAgb3AgPSBbNiwgZTExXTsKICAgICAgeTUgPSAwOwogICAgfSBmaW5hbGx5IHsKICAgICAgZjggPSB0OSA9IDA7CiAgICB9CiAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsKICAgIHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07CiAgfQp9CmZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtNywgbzEzKSB7CiAgZm9yICh2YXIgcDggaW4gbTcpIGlmIChwOCAhPT0gImRlZmF1bHQiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobzEzLCBwOCkpIF9fY3JlYXRlQmluZGluZyhvMTMsIG03LCBwOCk7Cn0KZnVuY3Rpb24gX192YWx1ZXMobzEzKSB7CiAgdmFyIHMxMCA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtNyA9IHMxMCAmJiBvMTNbczEwXSwgaTExID0gMDsKICBpZiAobTcpIHJldHVybiBtNy5jYWxsKG8xMyk7CiAgaWYgKG8xMyAmJiB0eXBlb2YgbzEzLmxlbmd0aCA9PT0gIm51bWJlciIpIHJldHVybiB7CiAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKG8xMyAmJiBpMTEgPj0gbzEzLmxlbmd0aCkgbzEzID0gdm9pZCAwOwogICAgICByZXR1cm4geyB2YWx1ZTogbzEzICYmIG8xM1tpMTErK10sIGRvbmU6ICFvMTMgfTsKICAgIH0KICB9OwogIHRocm93IG5ldyBUeXBlRXJyb3IoczEwID8gIk9iamVjdCBpcyBub3QgaXRlcmFibGUuIiA6ICJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuIik7Cn0KZnVuY3Rpb24gX19yZWFkKG8xMywgbjEzKSB7CiAgdmFyIG03ID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvMTNbU3ltYm9sLml0ZXJhdG9yXTsKICBpZiAoIW03KSByZXR1cm4gbzEzOwogIHZhciBpMTEgPSBtNy5jYWxsKG8xMyksIHIxMSwgYXIgPSBbXSwgZTExOwogIHRyeSB7CiAgICB3aGlsZSAoKG4xMyA9PT0gdm9pZCAwIHx8IG4xMy0tID4gMCkgJiYgIShyMTEgPSBpMTEubmV4dCgpKS5kb25lKSBhci5wdXNoKHIxMS52YWx1ZSk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIGUxMSA9IHsgZXJyb3IgfTsKICB9IGZpbmFsbHkgewogICAgdHJ5IHsKICAgICAgaWYgKHIxMSAmJiAhcjExLmRvbmUgJiYgKG03ID0gaTExWyJyZXR1cm4iXSkpIG03LmNhbGwoaTExKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGlmIChlMTEpIHRocm93IGUxMS5lcnJvcjsKICAgIH0KICB9CiAgcmV0dXJuIGFyOwp9CmZ1bmN0aW9uIF9fc3ByZWFkKCkgewogIGZvciAodmFyIGFyID0gW10sIGkxMSA9IDA7IGkxMSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkxMSsrKQogICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpMTFdKSk7CiAgcmV0dXJuIGFyOwp9CmZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkgewogIGZvciAodmFyIHMxMCA9IDAsIGkxMSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaTExIDwgaWw7IGkxMSsrKSBzMTAgKz0gYXJndW1lbnRzW2kxMV0ubGVuZ3RoOwogIGZvciAodmFyIHIxMSA9IEFycmF5KHMxMCksIGs1ID0gMCwgaTExID0gMDsgaTExIDwgaWw7IGkxMSsrKQogICAgZm9yICh2YXIgYTUgPSBhcmd1bWVudHNbaTExXSwgajQgPSAwLCBqbCA9IGE1Lmxlbmd0aDsgajQgPCBqbDsgajQrKywgazUrKykKICAgICAgcjExW2s1XSA9IGE1W2o0XTsKICByZXR1cm4gcjExOwp9CmZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20yLCBwYWNrKSB7CiAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaTExID0gMCwgbDYgPSBmcm9tMi5sZW5ndGgsIGFyOyBpMTEgPCBsNjsgaTExKyspIHsKICAgIGlmIChhciB8fCAhKGkxMSBpbiBmcm9tMikpIHsKICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tMiwgMCwgaTExKTsKICAgICAgYXJbaTExXSA9IGZyb20yW2kxMV07CiAgICB9CiAgfQogIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbTIpKTsKfQpmdW5jdGlvbiBfX2F3YWl0KHY2KSB7CiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHY2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHY2KTsKfQpmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikgewogIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpOwogIHZhciBnNSA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaTExLCBxID0gW107CiAgcmV0dXJuIGkxMSA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSAiZnVuY3Rpb24iID8gQXN5bmNJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKSwgdmVyYigibmV4dCIpLCB2ZXJiKCJ0aHJvdyIpLCB2ZXJiKCJyZXR1cm4iLCBhd2FpdFJldHVybiksIGkxMVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzOwogIH0sIGkxMTsKICBmdW5jdGlvbiBhd2FpdFJldHVybihmOCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHY2KSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodjYpLnRoZW4oZjgsIHJlamVjdCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiB2ZXJiKG4xMywgZjgpIHsKICAgIGlmIChnNVtuMTNdKSB7CiAgICAgIGkxMVtuMTNdID0gZnVuY3Rpb24odjYpIHsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oYTUsIGI2KSB7CiAgICAgICAgICBxLnB1c2goW24xMywgdjYsIGE1LCBiNl0pID4gMSB8fCByZXN1bWUobjEzLCB2Nik7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIGlmIChmOCkgaTExW24xM10gPSBmOChpMTFbbjEzXSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHJlc3VtZShuMTMsIHY2KSB7CiAgICB0cnkgewogICAgICBzdGVwKGc1W24xM10odjYpKTsKICAgIH0gY2F0Y2ggKGUxMSkgewogICAgICBzZXR0bGUocVswXVszXSwgZTExKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gc3RlcChyMTEpIHsKICAgIHIxMS52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUocjExLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByMTEpOwogIH0KICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlMikgewogICAgcmVzdW1lKCJuZXh0IiwgdmFsdWUyKTsKICB9CiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlMikgewogICAgcmVzdW1lKCJ0aHJvdyIsIHZhbHVlMik7CiAgfQogIGZ1bmN0aW9uIHNldHRsZShmOCwgdjYpIHsKICAgIGlmIChmOCh2NiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsKICB9Cn0KZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvMTMpIHsKICB2YXIgaTExLCBwODsKICByZXR1cm4gaTExID0ge30sIHZlcmIoIm5leHQiKSwgdmVyYigidGhyb3ciLCBmdW5jdGlvbihlMTEpIHsKICAgIHRocm93IGUxMTsKICB9KSwgdmVyYigicmV0dXJuIiksIGkxMVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpczsKICB9LCBpMTE7CiAgZnVuY3Rpb24gdmVyYihuMTMsIGY4KSB7CiAgICBpMTFbbjEzXSA9IG8xM1tuMTNdID8gZnVuY3Rpb24odjYpIHsKICAgICAgcmV0dXJuIChwOCA9ICFwOCkgPyB7IHZhbHVlOiBfX2F3YWl0KG8xM1tuMTNdKHY2KSksIGRvbmU6IGZhbHNlIH0gOiBmOCA/IGY4KHY2KSA6IHY2OwogICAgfSA6IGY4OwogIH0KfQpmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8xMykgewogIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpOwogIHZhciBtNyA9IG8xM1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGkxMTsKICByZXR1cm4gbTcgPyBtNy5jYWxsKG8xMykgOiAobzEzID0gdHlwZW9mIF9fdmFsdWVzID09PSAiZnVuY3Rpb24iID8gX192YWx1ZXMobzEzKSA6IG8xM1tTeW1ib2wuaXRlcmF0b3JdKCksIGkxMSA9IHt9LCB2ZXJiKCJuZXh0IiksIHZlcmIoInRocm93IiksIHZlcmIoInJldHVybiIpLCBpMTFbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpczsKICB9LCBpMTEpOwogIGZ1bmN0aW9uIHZlcmIobjEzKSB7CiAgICBpMTFbbjEzXSA9IG8xM1tuMTNdICYmIGZ1bmN0aW9uKHY2KSB7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlMiwgcmVqZWN0KSB7CiAgICAgICAgdjYgPSBvMTNbbjEzXSh2NiksIHNldHRsZShyZXNvbHZlMiwgcmVqZWN0LCB2Ni5kb25lLCB2Ni52YWx1ZSk7CiAgICAgIH0pOwogICAgfTsKICB9CiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUyLCByZWplY3QsIGQ2LCB2NikgewogICAgUHJvbWlzZS5yZXNvbHZlKHY2KS50aGVuKGZ1bmN0aW9uKHY3KSB7CiAgICAgIHJlc29sdmUyKHsgdmFsdWU6IHY3LCBkb25lOiBkNiB9KTsKICAgIH0sIHJlamVjdCk7CiAgfQp9CmZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3MikgewogIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsICJyYXciLCB7IHZhbHVlOiByYXcyIH0pOwogIH0gZWxzZSB7CiAgICBjb29rZWQucmF3ID0gcmF3MjsKICB9CiAgcmV0dXJuIGNvb2tlZDsKfQpmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7CiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDsKICB2YXIgcmVzdWx0ID0ge307CiAgaWYgKG1vZCAhPSBudWxsKSB7CiAgICBmb3IgKHZhciBrNSA9IG93bktleXMobW9kKSwgaTExID0gMDsgaTExIDwgazUubGVuZ3RoOyBpMTErKykgaWYgKGs1W2kxMV0gIT09ICJkZWZhdWx0IikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrNVtpMTFdKTsKICB9CiAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTsKICByZXR1cm4gcmVzdWx0Owp9CmZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHsKICByZXR1cm4gbW9kICYmIG1vZC5fX2VzTW9kdWxlID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTsKfQpmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZTEwLCBraW5kLCBmOCkgewogIGlmIChraW5kID09PSAiYSIgJiYgIWY4KSB0aHJvdyBuZXcgVHlwZUVycm9yKCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXIiKTsKICBpZiAodHlwZW9mIHN0YXRlMTAgPT09ICJmdW5jdGlvbiIgPyByZWNlaXZlciAhPT0gc3RhdGUxMCB8fCAhZjggOiAhc3RhdGUxMC5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXQiKTsKICByZXR1cm4ga2luZCA9PT0gIm0iID8gZjggOiBraW5kID09PSAiYSIgPyBmOC5jYWxsKHJlY2VpdmVyKSA6IGY4ID8gZjgudmFsdWUgOiBzdGF0ZTEwLmdldChyZWNlaXZlcik7Cn0KZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUxMCwgdmFsdWUyLCBraW5kLCBmOCkgewogIGlmIChraW5kID09PSAibSIpIHRocm93IG5ldyBUeXBlRXJyb3IoIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZSIpOwogIGlmIChraW5kID09PSAiYSIgJiYgIWY4KSB0aHJvdyBuZXcgVHlwZUVycm9yKCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXIiKTsKICBpZiAodHlwZW9mIHN0YXRlMTAgPT09ICJmdW5jdGlvbiIgPyByZWNlaXZlciAhPT0gc3RhdGUxMCB8fCAhZjggOiAhc3RhdGUxMC5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdCIpOwogIHJldHVybiBraW5kID09PSAiYSIgPyBmOC5jYWxsKHJlY2VpdmVyLCB2YWx1ZTIpIDogZjggPyBmOC52YWx1ZSA9IHZhbHVlMiA6IHN0YXRlMTAuc2V0KHJlY2VpdmVyLCB2YWx1ZTIpLCB2YWx1ZTI7Cn0KZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlMTAsIHJlY2VpdmVyKSB7CiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8IHR5cGVvZiByZWNlaXZlciAhPT0gIm9iamVjdCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdCIpOwogIHJldHVybiB0eXBlb2Ygc3RhdGUxMCA9PT0gImZ1bmN0aW9uIiA/IHJlY2VpdmVyID09PSBzdGF0ZTEwIDogc3RhdGUxMC5oYXMocmVjZWl2ZXIpOwp9CmZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudjIsIHZhbHVlMiwgYXN5bmMyKSB7CiAgaWYgKHZhbHVlMiAhPT0gbnVsbCAmJiB2YWx1ZTIgIT09IHZvaWQgMCkgewogICAgaWYgKHR5cGVvZiB2YWx1ZTIgIT09ICJvYmplY3QiICYmIHR5cGVvZiB2YWx1ZTIgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZC4iKTsKICAgIHZhciBkaXNwb3NlLCBpbm5lcjsKICAgIGlmIChhc3luYzIpIHsKICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLiIpOwogICAgICBkaXNwb3NlID0gdmFsdWUyW1N5bWJvbC5hc3luY0Rpc3Bvc2VdOwogICAgfQogICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkgewogICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC4iKTsKICAgICAgZGlzcG9zZSA9IHZhbHVlMltTeW1ib2wuZGlzcG9zZV07CiAgICAgIGlmIChhc3luYzIpIGlubmVyID0gZGlzcG9zZTsKICAgIH0KICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLiIpOwogICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7CiAgICAgIHRyeSB7CiAgICAgICAgaW5uZXIuY2FsbCh0aGlzKTsKICAgICAgfSBjYXRjaCAoZTExKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUxMSk7CiAgICAgIH0KICAgIH07CiAgICBlbnYyLnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUyLCBkaXNwb3NlLCBhc3luYzogYXN5bmMyIH0pOwogIH0gZWxzZSBpZiAoYXN5bmMyKSB7CiAgICBlbnYyLnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTsKICB9CiAgcmV0dXJuIHZhbHVlMjsKfQpmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52MikgewogIGZ1bmN0aW9uIGZhaWwoZTExKSB7CiAgICBlbnYyLmVycm9yID0gZW52Mi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUxMSwgZW52Mi5lcnJvciwgIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC4iKSA6IGUxMTsKICAgIGVudjIuaGFzRXJyb3IgPSB0cnVlOwogIH0KICB2YXIgcjExLCBzMTAgPSAwOwogIGZ1bmN0aW9uIG5leHQyKCkgewogICAgd2hpbGUgKHIxMSA9IGVudjIuc3RhY2sucG9wKCkpIHsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoIXIxMS5hc3luYyAmJiBzMTAgPT09IDEpIHJldHVybiBzMTAgPSAwLCBlbnYyLnN0YWNrLnB1c2gocjExKSwgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihuZXh0Mik7CiAgICAgICAgaWYgKHIxMS5kaXNwb3NlKSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gcjExLmRpc3Bvc2UuY2FsbChyMTEudmFsdWUpOwogICAgICAgICAgaWYgKHIxMS5hc3luYykgcmV0dXJuIHMxMCB8PSAyLCBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQyLCBmdW5jdGlvbihlMTEpIHsKICAgICAgICAgICAgZmFpbChlMTEpOwogICAgICAgICAgICByZXR1cm4gbmV4dDIoKTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBzMTAgfD0gMTsKICAgICAgfSBjYXRjaCAoZTExKSB7CiAgICAgICAgZmFpbChlMTEpOwogICAgICB9CiAgICB9CiAgICBpZiAoczEwID09PSAxKSByZXR1cm4gZW52Mi5oYXNFcnJvciA/IFByb21pc2UucmVqZWN0KGVudjIuZXJyb3IpIDogUHJvbWlzZS5yZXNvbHZlKCk7CiAgICBpZiAoZW52Mi5oYXNFcnJvcikgdGhyb3cgZW52Mi5lcnJvcjsKICB9CiAgcmV0dXJuIG5leHQyKCk7Cn0KZnVuY3Rpb24gX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24ocGF0aDIsIHByZXNlcnZlSnN4KSB7CiAgaWYgKHR5cGVvZiBwYXRoMiA9PT0gInN0cmluZyIgJiYgL15cLlwuP1wvLy50ZXN0KHBhdGgyKSkgewogICAgcmV0dXJuIHBhdGgyLnJlcGxhY2UoL1wuKHRzeCkkfCgoPzpcLmQpPykoKD86XC5bXi4vXSs/KT8pXC4oW2NtXT8pdHMkL2ksIGZ1bmN0aW9uKG03LCB0c3gsIGQ2LCBleHQsIGNtKSB7CiAgICAgIHJldHVybiB0c3ggPyBwcmVzZXJ2ZUpzeCA/ICIuanN4IiA6ICIuanMiIDogZDYgJiYgKCFleHQgfHwgIWNtKSA/IG03IDogZDYgKyBleHQgKyAiLiIgKyBjbS50b0xvd2VyQ2FzZSgpICsgImpzIjsKICAgIH0pOwogIH0KICByZXR1cm4gcGF0aDI7Cn0KdmFyIGV4dGVuZFN0YXRpY3MsIF9fYXNzaWduLCBfX2NyZWF0ZUJpbmRpbmcsIF9fc2V0TW9kdWxlRGVmYXVsdCwgb3duS2V5cywgX1N1cHByZXNzZWRFcnJvciwgdHNsaWJfZXM2X2RlZmF1bHQ7CnZhciBpbml0X3RzbGliX2VzNiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3RzbGliQDIuOC4xL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIigpIHsKICAgIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkNiwgYjYpIHsKICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQ3LCBiNykgewogICAgICAgIGQ3Ll9fcHJvdG9fXyA9IGI3OwogICAgICB9IHx8IGZ1bmN0aW9uKGQ3LCBiNykgewogICAgICAgIGZvciAodmFyIHA4IGluIGI3KSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGI3LCBwOCkpIGQ3W3A4XSA9IGI3W3A4XTsKICAgICAgfTsKICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZDYsIGI2KTsKICAgIH07CiAgICBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkgewogICAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24yKHQ5KSB7CiAgICAgICAgZm9yICh2YXIgczEwLCBpMTEgPSAxLCBuMTMgPSBhcmd1bWVudHMubGVuZ3RoOyBpMTEgPCBuMTM7IGkxMSsrKSB7CiAgICAgICAgICBzMTAgPSBhcmd1bWVudHNbaTExXTsKICAgICAgICAgIGZvciAodmFyIHA4IGluIHMxMCkgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzMTAsIHA4KSkgdDlbcDhdID0gczEwW3A4XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHQ5OwogICAgICB9OwogICAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CiAgICA7CiAgICA7CiAgICA7CiAgICA7CiAgICBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8xMywgbTcsIGs1LCBrMjIpIHsKICAgICAgaWYgKGsyMiA9PT0gdm9pZCAwKSBrMjIgPSBrNTsKICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG03LCBrNSk7CiAgICAgIGlmICghZGVzYyB8fCAoImdldCIgaW4gZGVzYyA/ICFtNy5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHsKICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIG03W2s1XTsKICAgICAgICB9IH07CiAgICAgIH0KICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8xMywgazIyLCBkZXNjKTsKICAgIH0pIDogKGZ1bmN0aW9uKG8xMywgbTcsIGs1LCBrMjIpIHsKICAgICAgaWYgKGsyMiA9PT0gdm9pZCAwKSBrMjIgPSBrNTsKICAgICAgbzEzW2syMl0gPSBtN1trNV07CiAgICB9KTsKICAgIDsKICAgIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obzEzLCB2NikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobzEzLCAiZGVmYXVsdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHY2IH0pOwogICAgfSkgOiBmdW5jdGlvbihvMTMsIHY2KSB7CiAgICAgIG8xM1siZGVmYXVsdCJdID0gdjY7CiAgICB9OwogICAgb3duS2V5cyA9IGZ1bmN0aW9uKG8xMykgewogICAgICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24obzE0KSB7CiAgICAgICAgdmFyIGFyID0gW107CiAgICAgICAgZm9yICh2YXIgazUgaW4gbzE0KSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8xNCwgazUpKSBhclthci5sZW5ndGhdID0gazU7CiAgICAgICAgcmV0dXJuIGFyOwogICAgICB9OwogICAgICByZXR1cm4gb3duS2V5cyhvMTMpOwogICAgfTsKICAgIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSAiZnVuY3Rpb24iID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24oZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UyKSB7CiAgICAgIHZhciBlMTEgPSBuZXcgRXJyb3IobWVzc2FnZTIpOwogICAgICByZXR1cm4gZTExLm5hbWUgPSAiU3VwcHJlc3NlZEVycm9yIiwgZTExLmVycm9yID0gZXJyb3IsIGUxMS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTExOwogICAgfTsKICAgIHRzbGliX2VzNl9kZWZhdWx0ID0gewogICAgICBfX2V4dGVuZHMsCiAgICAgIF9fYXNzaWduLAogICAgICBfX3Jlc3QsCiAgICAgIF9fZGVjb3JhdGUsCiAgICAgIF9fcGFyYW0sCiAgICAgIF9fZXNEZWNvcmF0ZSwKICAgICAgX19ydW5Jbml0aWFsaXplcnM6IF9fcnVuSW5pdGlhbGl6ZXJzMiwKICAgICAgX19wcm9wS2V5LAogICAgICBfX3NldEZ1bmN0aW9uTmFtZSwKICAgICAgX19tZXRhZGF0YSwKICAgICAgX19hd2FpdGVyLAogICAgICBfX2dlbmVyYXRvciwKICAgICAgX19jcmVhdGVCaW5kaW5nLAogICAgICBfX2V4cG9ydFN0YXIsCiAgICAgIF9fdmFsdWVzLAogICAgICBfX3JlYWQsCiAgICAgIF9fc3ByZWFkLAogICAgICBfX3NwcmVhZEFycmF5cywKICAgICAgX19zcHJlYWRBcnJheSwKICAgICAgX19hd2FpdCwKICAgICAgX19hc3luY0dlbmVyYXRvciwKICAgICAgX19hc3luY0RlbGVnYXRvciwKICAgICAgX19hc3luY1ZhbHVlcywKICAgICAgX19tYWtlVGVtcGxhdGVPYmplY3QsCiAgICAgIF9faW1wb3J0U3RhciwKICAgICAgX19pbXBvcnREZWZhdWx0LAogICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LAogICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LAogICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sCiAgICAgIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLAogICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMsCiAgICAgIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc0Z1bmN0aW9uLmpzCmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUyKSB7CiAgcmV0dXJuIHR5cGVvZiB2YWx1ZTIgPT09ICJmdW5jdGlvbiI7Cn0KdmFyIGluaXRfaXNGdW5jdGlvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNGdW5jdGlvbi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2NyZWF0ZUVycm9yQ2xhc3MuanMKZnVuY3Rpb24gY3JlYXRlRXJyb3JDbGFzcyhjcmVhdGVJbXBsKSB7CiAgdmFyIF9zdXBlciA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7CiAgICBFcnJvci5jYWxsKGluc3RhbmNlKTsKICAgIGluc3RhbmNlLnN0YWNrID0gbmV3IEVycm9yKCkuc3RhY2s7CiAgfTsKICB2YXIgY3RvckZ1bmMgPSBjcmVhdGVJbXBsKF9zdXBlcik7CiAgY3RvckZ1bmMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpOwogIGN0b3JGdW5jLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JGdW5jOwogIHJldHVybiBjdG9yRnVuYzsKfQp2YXIgaW5pdF9jcmVhdGVFcnJvckNsYXNzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9jcmVhdGVFcnJvckNsYXNzLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvVW5zdWJzY3JpcHRpb25FcnJvci5qcwp2YXIgVW5zdWJzY3JpcHRpb25FcnJvcjsKdmFyIGluaXRfVW5zdWJzY3JpcHRpb25FcnJvciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvVW5zdWJzY3JpcHRpb25FcnJvci5qcyIoKSB7CiAgICBpbml0X2NyZWF0ZUVycm9yQ2xhc3MoKTsKICAgIFVuc3Vic2NyaXB0aW9uRXJyb3IgPSBjcmVhdGVFcnJvckNsYXNzKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICByZXR1cm4gZnVuY3Rpb24gVW5zdWJzY3JpcHRpb25FcnJvckltcGwoZXJyb3JzKSB7CiAgICAgICAgX3N1cGVyKHRoaXMpOwogICAgICAgIHRoaXMubWVzc2FnZSA9IGVycm9ycyA/IGVycm9ycy5sZW5ndGggKyAiIGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgdW5zdWJzY3JpcHRpb246XG4iICsgZXJyb3JzLm1hcChmdW5jdGlvbihlcnIsIGkxMSkgewogICAgICAgICAgcmV0dXJuIGkxMSArIDEgKyAiKSAiICsgZXJyLnRvU3RyaW5nKCk7CiAgICAgICAgfSkuam9pbigiXG4gICIpIDogIiI7CiAgICAgICAgdGhpcy5uYW1lID0gIlVuc3Vic2NyaXB0aW9uRXJyb3IiOwogICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzOwogICAgICB9OwogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2FyclJlbW92ZS5qcwpmdW5jdGlvbiBhcnJSZW1vdmUoYXJyLCBpdGVtKSB7CiAgaWYgKGFycikgewogICAgdmFyIGluZGV4MiA9IGFyci5pbmRleE9mKGl0ZW0pOwogICAgMCA8PSBpbmRleDIgJiYgYXJyLnNwbGljZShpbmRleDIsIDEpOwogIH0KfQp2YXIgaW5pdF9hcnJSZW1vdmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2FyclJlbW92ZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9TdWJzY3JpcHRpb24uanMKZnVuY3Rpb24gaXNTdWJzY3JpcHRpb24odmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMiBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbiB8fCB2YWx1ZTIgJiYgImNsb3NlZCIgaW4gdmFsdWUyICYmIGlzRnVuY3Rpb24odmFsdWUyLnJlbW92ZSkgJiYgaXNGdW5jdGlvbih2YWx1ZTIuYWRkKSAmJiBpc0Z1bmN0aW9uKHZhbHVlMi51bnN1YnNjcmliZSk7Cn0KZnVuY3Rpb24gZXhlY0ZpbmFsaXplcihmaW5hbGl6ZXIpIHsKICBpZiAoaXNGdW5jdGlvbihmaW5hbGl6ZXIpKSB7CiAgICBmaW5hbGl6ZXIoKTsKICB9IGVsc2UgewogICAgZmluYWxpemVyLnVuc3Vic2NyaWJlKCk7CiAgfQp9CnZhciBTdWJzY3JpcHRpb24sIEVNUFRZX1NVQlNDUklQVElPTjsKdmFyIGluaXRfU3Vic2NyaXB0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvU3Vic2NyaXB0aW9uLmpzIigpIHsKICAgIGluaXRfdHNsaWJfZXM2KCk7CiAgICBpbml0X2lzRnVuY3Rpb24oKTsKICAgIGluaXRfVW5zdWJzY3JpcHRpb25FcnJvcigpOwogICAgaW5pdF9hcnJSZW1vdmUoKTsKICAgIFN1YnNjcmlwdGlvbiA9IChmdW5jdGlvbigpIHsKICAgICAgZnVuY3Rpb24gU3Vic2NyaXB0aW9uMihpbml0aWFsVGVhcmRvd24pIHsKICAgICAgICB0aGlzLmluaXRpYWxUZWFyZG93biA9IGluaXRpYWxUZWFyZG93bjsKICAgICAgICB0aGlzLmNsb3NlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuX3BhcmVudGFnZSA9IG51bGw7CiAgICAgICAgdGhpcy5fZmluYWxpemVycyA9IG51bGw7CiAgICAgIH0KICAgICAgU3Vic2NyaXB0aW9uMi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZV8xLCBfYTEyLCBlXzIsIF9iOwogICAgICAgIHZhciBlcnJvcnM7CiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCkgewogICAgICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlOwogICAgICAgICAgdmFyIF9wYXJlbnRhZ2UgPSB0aGlzLl9wYXJlbnRhZ2U7CiAgICAgICAgICBpZiAoX3BhcmVudGFnZSkgewogICAgICAgICAgICB0aGlzLl9wYXJlbnRhZ2UgPSBudWxsOwogICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShfcGFyZW50YWdlKSkgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBfcGFyZW50YWdlXzEgPSBfX3ZhbHVlcyhfcGFyZW50YWdlKSwgX3BhcmVudGFnZV8xXzEgPSBfcGFyZW50YWdlXzEubmV4dCgpOyAhX3BhcmVudGFnZV8xXzEuZG9uZTsgX3BhcmVudGFnZV8xXzEgPSBfcGFyZW50YWdlXzEubmV4dCgpKSB7CiAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRfMSA9IF9wYXJlbnRhZ2VfMV8xLnZhbHVlOwogICAgICAgICAgICAgICAgICBwYXJlbnRfMS5yZW1vdmUodGhpcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBjYXRjaCAoZV8xXzEpIHsKICAgICAgICAgICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07CiAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIGlmIChfcGFyZW50YWdlXzFfMSAmJiAhX3BhcmVudGFnZV8xXzEuZG9uZSAmJiAoX2ExMiA9IF9wYXJlbnRhZ2VfMS5yZXR1cm4pKSBfYTEyLmNhbGwoX3BhcmVudGFnZV8xKTsKICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX3BhcmVudGFnZS5yZW1vdmUodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHZhciBpbml0aWFsRmluYWxpemVyID0gdGhpcy5pbml0aWFsVGVhcmRvd247CiAgICAgICAgICBpZiAoaXNGdW5jdGlvbihpbml0aWFsRmluYWxpemVyKSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGluaXRpYWxGaW5hbGl6ZXIoKTsKICAgICAgICAgICAgfSBjYXRjaCAoZTExKSB7CiAgICAgICAgICAgICAgZXJyb3JzID0gZTExIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvciA/IGUxMS5lcnJvcnMgOiBbZTExXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdmFyIF9maW5hbGl6ZXJzID0gdGhpcy5fZmluYWxpemVyczsKICAgICAgICAgIGlmIChfZmluYWxpemVycykgewogICAgICAgICAgICB0aGlzLl9maW5hbGl6ZXJzID0gbnVsbDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBmb3IgKHZhciBfZmluYWxpemVyc18xID0gX192YWx1ZXMoX2ZpbmFsaXplcnMpLCBfZmluYWxpemVyc18xXzEgPSBfZmluYWxpemVyc18xLm5leHQoKTsgIV9maW5hbGl6ZXJzXzFfMS5kb25lOyBfZmluYWxpemVyc18xXzEgPSBfZmluYWxpemVyc18xLm5leHQoKSkgewogICAgICAgICAgICAgICAgdmFyIGZpbmFsaXplciA9IF9maW5hbGl6ZXJzXzFfMS52YWx1ZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIGV4ZWNGaW5hbGl6ZXIoZmluYWxpemVyKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMgIT09IG51bGwgJiYgZXJyb3JzICE9PSB2b2lkIDAgPyBlcnJvcnMgOiBbXTsKICAgICAgICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFVuc3Vic2NyaXB0aW9uRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSBfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChlcnJvcnMpKSwgX19yZWFkKGVyci5lcnJvcnMpKTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChlcnIpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChlXzJfMSkgewogICAgICAgICAgICAgIGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07CiAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmIChfZmluYWxpemVyc18xXzEgJiYgIV9maW5hbGl6ZXJzXzFfMS5kb25lICYmIChfYiA9IF9maW5hbGl6ZXJzXzEucmV0dXJuKSkgX2IuY2FsbChfZmluYWxpemVyc18xKTsKICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGVycm9ycykgewogICAgICAgICAgICB0aHJvdyBuZXcgVW5zdWJzY3JpcHRpb25FcnJvcihlcnJvcnMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgU3Vic2NyaXB0aW9uMi5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24odGVhcmRvd24pIHsKICAgICAgICB2YXIgX2ExMjsKICAgICAgICBpZiAodGVhcmRvd24gJiYgdGVhcmRvd24gIT09IHRoaXMpIHsKICAgICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgICBleGVjRmluYWxpemVyKHRlYXJkb3duKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICh0ZWFyZG93biBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbjIpIHsKICAgICAgICAgICAgICBpZiAodGVhcmRvd24uY2xvc2VkIHx8IHRlYXJkb3duLl9oYXNQYXJlbnQodGhpcykpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGVhcmRvd24uX2FkZFBhcmVudCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAodGhpcy5fZmluYWxpemVycyA9IChfYTEyID0gdGhpcy5fZmluYWxpemVycykgIT09IG51bGwgJiYgX2ExMiAhPT0gdm9pZCAwID8gX2ExMiA6IFtdKS5wdXNoKHRlYXJkb3duKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CiAgICAgIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLl9oYXNQYXJlbnQgPSBmdW5jdGlvbihwYXJlbnQpIHsKICAgICAgICB2YXIgX3BhcmVudGFnZSA9IHRoaXMuX3BhcmVudGFnZTsKICAgICAgICByZXR1cm4gX3BhcmVudGFnZSA9PT0gcGFyZW50IHx8IEFycmF5LmlzQXJyYXkoX3BhcmVudGFnZSkgJiYgX3BhcmVudGFnZS5pbmNsdWRlcyhwYXJlbnQpOwogICAgICB9OwogICAgICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5fYWRkUGFyZW50ID0gZnVuY3Rpb24ocGFyZW50KSB7CiAgICAgICAgdmFyIF9wYXJlbnRhZ2UgPSB0aGlzLl9wYXJlbnRhZ2U7CiAgICAgICAgdGhpcy5fcGFyZW50YWdlID0gQXJyYXkuaXNBcnJheShfcGFyZW50YWdlKSA/IChfcGFyZW50YWdlLnB1c2gocGFyZW50KSwgX3BhcmVudGFnZSkgOiBfcGFyZW50YWdlID8gW19wYXJlbnRhZ2UsIHBhcmVudF0gOiBwYXJlbnQ7CiAgICAgIH07CiAgICAgIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLl9yZW1vdmVQYXJlbnQgPSBmdW5jdGlvbihwYXJlbnQpIHsKICAgICAgICB2YXIgX3BhcmVudGFnZSA9IHRoaXMuX3BhcmVudGFnZTsKICAgICAgICBpZiAoX3BhcmVudGFnZSA9PT0gcGFyZW50KSB7CiAgICAgICAgICB0aGlzLl9wYXJlbnRhZ2UgPSBudWxsOwogICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShfcGFyZW50YWdlKSkgewogICAgICAgICAgYXJyUmVtb3ZlKF9wYXJlbnRhZ2UsIHBhcmVudCk7CiAgICAgICAgfQogICAgICB9OwogICAgICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbih0ZWFyZG93bikgewogICAgICAgIHZhciBfZmluYWxpemVycyA9IHRoaXMuX2ZpbmFsaXplcnM7CiAgICAgICAgX2ZpbmFsaXplcnMgJiYgYXJyUmVtb3ZlKF9maW5hbGl6ZXJzLCB0ZWFyZG93bik7CiAgICAgICAgaWYgKHRlYXJkb3duIGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uMikgewogICAgICAgICAgdGVhcmRvd24uX3JlbW92ZVBhcmVudCh0aGlzKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIFN1YnNjcmlwdGlvbjIuRU1QVFkgPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGVtcHR5NCA9IG5ldyBTdWJzY3JpcHRpb24yKCk7CiAgICAgICAgZW1wdHk0LmNsb3NlZCA9IHRydWU7CiAgICAgICAgcmV0dXJuIGVtcHR5NDsKICAgICAgfSkoKTsKICAgICAgcmV0dXJuIFN1YnNjcmlwdGlvbjI7CiAgICB9KSgpOwogICAgRU1QVFlfU1VCU0NSSVBUSU9OID0gU3Vic2NyaXB0aW9uLkVNUFRZOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvY29uZmlnLmpzCnZhciBjb25maWc7CnZhciBpbml0X2NvbmZpZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL2NvbmZpZy5qcyIoKSB7CiAgICBjb25maWcgPSB7CiAgICAgIG9uVW5oYW5kbGVkRXJyb3I6IG51bGwsCiAgICAgIG9uU3RvcHBlZE5vdGlmaWNhdGlvbjogbnVsbCwKICAgICAgUHJvbWlzZTogdm9pZCAwLAogICAgICB1c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nOiBmYWxzZSwKICAgICAgdXNlRGVwcmVjYXRlZE5leHRDb250ZXh0OiBmYWxzZQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci90aW1lb3V0UHJvdmlkZXIuanMKdmFyIHRpbWVvdXRQcm92aWRlcjsKdmFyIGluaXRfdGltZW91dFByb3ZpZGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL3RpbWVvdXRQcm92aWRlci5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgdGltZW91dFByb3ZpZGVyID0gewogICAgICBzZXRUaW1lb3V0OiBmdW5jdGlvbihoYW5kbGVyMiwgdGltZW91dDIpIHsKICAgICAgICB2YXIgYXJncyA9IFtdOwogICAgICAgIGZvciAodmFyIF9pID0gMjsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICBhcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldOwogICAgICAgIH0KICAgICAgICB2YXIgZGVsZWdhdGUgPSB0aW1lb3V0UHJvdmlkZXIuZGVsZWdhdGU7CiAgICAgICAgaWYgKGRlbGVnYXRlID09PSBudWxsIHx8IGRlbGVnYXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWxlZ2F0ZS5zZXRUaW1lb3V0KSB7CiAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuc2V0VGltZW91dC5hcHBseShkZWxlZ2F0ZSwgX19zcHJlYWRBcnJheShbaGFuZGxlcjIsIHRpbWVvdXQyXSwgX19yZWFkKGFyZ3MpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzZXRUaW1lb3V0LmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbaGFuZGxlcjIsIHRpbWVvdXQyXSwgX19yZWFkKGFyZ3MpKSk7CiAgICAgIH0sCiAgICAgIGNsZWFyVGltZW91dDogZnVuY3Rpb24oaGFuZGxlMykgewogICAgICAgIHZhciBkZWxlZ2F0ZSA9IHRpbWVvdXRQcm92aWRlci5kZWxlZ2F0ZTsKICAgICAgICByZXR1cm4gKChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUuY2xlYXJUaW1lb3V0KSB8fCBjbGVhclRpbWVvdXQpKGhhbmRsZTMpOwogICAgICB9LAogICAgICBkZWxlZ2F0ZTogdm9pZCAwCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9yZXBvcnRVbmhhbmRsZWRFcnJvci5qcwpmdW5jdGlvbiByZXBvcnRVbmhhbmRsZWRFcnJvcihlcnIpIHsKICB0aW1lb3V0UHJvdmlkZXIuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgIHZhciBvblVuaGFuZGxlZEVycm9yID0gY29uZmlnLm9uVW5oYW5kbGVkRXJyb3I7CiAgICBpZiAob25VbmhhbmRsZWRFcnJvcikgewogICAgICBvblVuaGFuZGxlZEVycm9yKGVycik7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBlcnI7CiAgICB9CiAgfSk7Cn0KdmFyIGluaXRfcmVwb3J0VW5oYW5kbGVkRXJyb3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL3JlcG9ydFVuaGFuZGxlZEVycm9yLmpzIigpIHsKICAgIGluaXRfY29uZmlnKCk7CiAgICBpbml0X3RpbWVvdXRQcm92aWRlcigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9ub29wLmpzCmZ1bmN0aW9uIG5vb3AoKSB7Cn0KdmFyIGluaXRfbm9vcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvbm9vcC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9Ob3RpZmljYXRpb25GYWN0b3JpZXMuanMKZnVuY3Rpb24gZXJyb3JOb3RpZmljYXRpb24oZXJyb3IpIHsKICByZXR1cm4gY3JlYXRlTm90aWZpY2F0aW9uKCJFIiwgdm9pZCAwLCBlcnJvcik7Cn0KZnVuY3Rpb24gbmV4dE5vdGlmaWNhdGlvbih2YWx1ZTIpIHsKICByZXR1cm4gY3JlYXRlTm90aWZpY2F0aW9uKCJOIiwgdmFsdWUyLCB2b2lkIDApOwp9CmZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvbihraW5kLCB2YWx1ZTIsIGVycm9yKSB7CiAgcmV0dXJuIHsKICAgIGtpbmQsCiAgICB2YWx1ZTogdmFsdWUyLAogICAgZXJyb3IKICB9Owp9CnZhciBDT01QTEVURV9OT1RJRklDQVRJT047CnZhciBpbml0X05vdGlmaWNhdGlvbkZhY3RvcmllcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL05vdGlmaWNhdGlvbkZhY3Rvcmllcy5qcyIoKSB7CiAgICBDT01QTEVURV9OT1RJRklDQVRJT04gPSAoZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBjcmVhdGVOb3RpZmljYXRpb24oIkMiLCB2b2lkIDAsIHZvaWQgMCk7CiAgICB9KSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9lcnJvckNvbnRleHQuanMKZnVuY3Rpb24gZXJyb3JDb250ZXh0KGNiKSB7CiAgaWYgKGNvbmZpZy51c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nKSB7CiAgICB2YXIgaXNSb290ID0gIWNvbnRleHQ7CiAgICBpZiAoaXNSb290KSB7CiAgICAgIGNvbnRleHQgPSB7IGVycm9yVGhyb3duOiBmYWxzZSwgZXJyb3I6IG51bGwgfTsKICAgIH0KICAgIGNiKCk7CiAgICBpZiAoaXNSb290KSB7CiAgICAgIHZhciBfYTEyID0gY29udGV4dCwgZXJyb3JUaHJvd24gPSBfYTEyLmVycm9yVGhyb3duLCBlcnJvciA9IF9hMTIuZXJyb3I7CiAgICAgIGNvbnRleHQgPSBudWxsOwogICAgICBpZiAoZXJyb3JUaHJvd24pIHsKICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICBjYigpOwogIH0KfQpmdW5jdGlvbiBjYXB0dXJlRXJyb3IoZXJyKSB7CiAgaWYgKGNvbmZpZy51c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nICYmIGNvbnRleHQpIHsKICAgIGNvbnRleHQuZXJyb3JUaHJvd24gPSB0cnVlOwogICAgY29udGV4dC5lcnJvciA9IGVycjsKICB9Cn0KdmFyIGNvbnRleHQ7CnZhciBpbml0X2Vycm9yQ29udGV4dCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvZXJyb3JDb250ZXh0LmpzIigpIHsKICAgIGluaXRfY29uZmlnKCk7CiAgICBjb250ZXh0ID0gbnVsbDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL1N1YnNjcmliZXIuanMKZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykgewogIHJldHVybiBfYmluZC5jYWxsKGZuLCB0aGlzQXJnKTsKfQpmdW5jdGlvbiBoYW5kbGVVbmhhbmRsZWRFcnJvcihlcnJvcikgewogIGlmIChjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykgewogICAgY2FwdHVyZUVycm9yKGVycm9yKTsKICB9IGVsc2UgewogICAgcmVwb3J0VW5oYW5kbGVkRXJyb3IoZXJyb3IpOwogIH0KfQpmdW5jdGlvbiBkZWZhdWx0RXJyb3JIYW5kbGVyKGVycikgewogIHRocm93IGVycjsKfQpmdW5jdGlvbiBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgc3Vic2NyaWJlcikgewogIHZhciBvblN0b3BwZWROb3RpZmljYXRpb24gPSBjb25maWcub25TdG9wcGVkTm90aWZpY2F0aW9uOwogIG9uU3RvcHBlZE5vdGlmaWNhdGlvbiAmJiB0aW1lb3V0UHJvdmlkZXIuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgIHJldHVybiBvblN0b3BwZWROb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBzdWJzY3JpYmVyKTsKICB9KTsKfQp2YXIgU3Vic2NyaWJlciwgX2JpbmQsIENvbnN1bWVyT2JzZXJ2ZXIsIFNhZmVTdWJzY3JpYmVyLCBFTVBUWV9PQlNFUlZFUjsKdmFyIGluaXRfU3Vic2NyaWJlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL1N1YnNjcmliZXIuanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGluaXRfaXNGdW5jdGlvbigpOwogICAgaW5pdF9TdWJzY3JpcHRpb24oKTsKICAgIGluaXRfY29uZmlnKCk7CiAgICBpbml0X3JlcG9ydFVuaGFuZGxlZEVycm9yKCk7CiAgICBpbml0X25vb3AoKTsKICAgIGluaXRfTm90aWZpY2F0aW9uRmFjdG9yaWVzKCk7CiAgICBpbml0X3RpbWVvdXRQcm92aWRlcigpOwogICAgaW5pdF9lcnJvckNvbnRleHQoKTsKICAgIFN1YnNjcmliZXIgPSAoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhTdWJzY3JpYmVyMiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gU3Vic2NyaWJlcjIoZGVzdGluYXRpb24pIHsKICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgIF90aGlzLmlzU3RvcHBlZCA9IGZhbHNlOwogICAgICAgIGlmIChkZXN0aW5hdGlvbikgewogICAgICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKICAgICAgICAgIGlmIChpc1N1YnNjcmlwdGlvbihkZXN0aW5hdGlvbikpIHsKICAgICAgICAgICAgZGVzdGluYXRpb24uYWRkKF90aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBFTVBUWV9PQlNFUlZFUjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIFN1YnNjcmliZXIyLmNyZWF0ZSA9IGZ1bmN0aW9uKG5leHQyLCBlcnJvciwgY29tcGxldGUpIHsKICAgICAgICByZXR1cm4gbmV3IFNhZmVTdWJzY3JpYmVyKG5leHQyLCBlcnJvciwgY29tcGxldGUpOwogICAgICB9OwogICAgICBTdWJzY3JpYmVyMi5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHZhbHVlMikgewogICAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgewogICAgICAgICAgaGFuZGxlU3RvcHBlZE5vdGlmaWNhdGlvbihuZXh0Tm90aWZpY2F0aW9uKHZhbHVlMiksIHRoaXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9uZXh0KHZhbHVlMik7CiAgICAgICAgfQogICAgICB9OwogICAgICBTdWJzY3JpYmVyMi5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbihlcnIpIHsKICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgIGhhbmRsZVN0b3BwZWROb3RpZmljYXRpb24oZXJyb3JOb3RpZmljYXRpb24oZXJyKSwgdGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuX2Vycm9yKGVycik7CiAgICAgICAgfQogICAgICB9OwogICAgICBTdWJzY3JpYmVyMi5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgIGhhbmRsZVN0b3BwZWROb3RpZmljYXRpb24oQ09NUExFVEVfTk9USUZJQ0FUSU9OLCB0aGlzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlOwogICAgICAgICAgdGhpcy5fY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIFN1YnNjcmliZXIyLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghdGhpcy5jbG9zZWQpIHsKICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKTsKICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBudWxsOwogICAgICAgIH0KICAgICAgfTsKICAgICAgU3Vic2NyaWJlcjIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlMik7CiAgICAgIH07CiAgICAgIFN1YnNjcmliZXIyLnByb3RvdHlwZS5fZXJyb3IgPSBmdW5jdGlvbihlcnIpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgICB9OwogICAgICBTdWJzY3JpYmVyMi5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIFN1YnNjcmliZXIyOwogICAgfSkoU3Vic2NyaXB0aW9uKTsKICAgIF9iaW5kID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ7CiAgICBDb25zdW1lck9ic2VydmVyID0gKGZ1bmN0aW9uKCkgewogICAgICBmdW5jdGlvbiBDb25zdW1lck9ic2VydmVyMihwYXJ0aWFsT2JzZXJ2ZXIpIHsKICAgICAgICB0aGlzLnBhcnRpYWxPYnNlcnZlciA9IHBhcnRpYWxPYnNlcnZlcjsKICAgICAgfQogICAgICBDb25zdW1lck9ic2VydmVyMi5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHZhbHVlMikgewogICAgICAgIHZhciBwYXJ0aWFsT2JzZXJ2ZXIgPSB0aGlzLnBhcnRpYWxPYnNlcnZlcjsKICAgICAgICBpZiAocGFydGlhbE9ic2VydmVyLm5leHQpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHBhcnRpYWxPYnNlcnZlci5uZXh0KHZhbHVlMik7CiAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBoYW5kbGVVbmhhbmRsZWRFcnJvcihlcnJvcik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICBDb25zdW1lck9ic2VydmVyMi5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbihlcnIpIHsKICAgICAgICB2YXIgcGFydGlhbE9ic2VydmVyID0gdGhpcy5wYXJ0aWFsT2JzZXJ2ZXI7CiAgICAgICAgaWYgKHBhcnRpYWxPYnNlcnZlci5lcnJvcikgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcGFydGlhbE9ic2VydmVyLmVycm9yKGVycik7CiAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBoYW5kbGVVbmhhbmRsZWRFcnJvcihlcnJvcik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycik7CiAgICAgICAgfQogICAgICB9OwogICAgICBDb25zdW1lck9ic2VydmVyMi5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgcGFydGlhbE9ic2VydmVyID0gdGhpcy5wYXJ0aWFsT2JzZXJ2ZXI7CiAgICAgICAgaWYgKHBhcnRpYWxPYnNlcnZlci5jb21wbGV0ZSkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcGFydGlhbE9ic2VydmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBoYW5kbGVVbmhhbmRsZWRFcnJvcihlcnJvcik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICByZXR1cm4gQ29uc3VtZXJPYnNlcnZlcjI7CiAgICB9KSgpOwogICAgU2FmZVN1YnNjcmliZXIgPSAoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhTYWZlU3Vic2NyaWJlcjIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIFNhZmVTdWJzY3JpYmVyMihvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICB2YXIgcGFydGlhbE9ic2VydmVyOwogICAgICAgIGlmIChpc0Z1bmN0aW9uKG9ic2VydmVyT3JOZXh0KSB8fCAhb2JzZXJ2ZXJPck5leHQpIHsKICAgICAgICAgIHBhcnRpYWxPYnNlcnZlciA9IHsKICAgICAgICAgICAgbmV4dDogb2JzZXJ2ZXJPck5leHQgIT09IG51bGwgJiYgb2JzZXJ2ZXJPck5leHQgIT09IHZvaWQgMCA/IG9ic2VydmVyT3JOZXh0IDogdm9pZCAwLAogICAgICAgICAgICBlcnJvcjogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogdm9pZCAwLAogICAgICAgICAgICBjb21wbGV0ZTogY29tcGxldGUgIT09IG51bGwgJiYgY29tcGxldGUgIT09IHZvaWQgMCA/IGNvbXBsZXRlIDogdm9pZCAwCiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgY29udGV4dF8xOwogICAgICAgICAgaWYgKF90aGlzICYmIGNvbmZpZy51c2VEZXByZWNhdGVkTmV4dENvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dF8xID0gT2JqZWN0LmNyZWF0ZShvYnNlcnZlck9yTmV4dCk7CiAgICAgICAgICAgIGNvbnRleHRfMS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiBfdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIgPSB7CiAgICAgICAgICAgICAgbmV4dDogb2JzZXJ2ZXJPck5leHQubmV4dCAmJiBiaW5kKG9ic2VydmVyT3JOZXh0Lm5leHQsIGNvbnRleHRfMSksCiAgICAgICAgICAgICAgZXJyb3I6IG9ic2VydmVyT3JOZXh0LmVycm9yICYmIGJpbmQob2JzZXJ2ZXJPck5leHQuZXJyb3IsIGNvbnRleHRfMSksCiAgICAgICAgICAgICAgY29tcGxldGU6IG9ic2VydmVyT3JOZXh0LmNvbXBsZXRlICYmIGJpbmQob2JzZXJ2ZXJPck5leHQuY29tcGxldGUsIGNvbnRleHRfMSkKICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHBhcnRpYWxPYnNlcnZlciA9IG9ic2VydmVyT3JOZXh0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfdGhpcy5kZXN0aW5hdGlvbiA9IG5ldyBDb25zdW1lck9ic2VydmVyKHBhcnRpYWxPYnNlcnZlcik7CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIHJldHVybiBTYWZlU3Vic2NyaWJlcjI7CiAgICB9KShTdWJzY3JpYmVyKTsKICAgIEVNUFRZX09CU0VSVkVSID0gewogICAgICBjbG9zZWQ6IHRydWUsCiAgICAgIG5leHQ6IG5vb3AsCiAgICAgIGVycm9yOiBkZWZhdWx0RXJyb3JIYW5kbGVyLAogICAgICBjb21wbGV0ZTogbm9vcAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3N5bWJvbC9vYnNlcnZhYmxlLmpzCnZhciBvYnNlcnZhYmxlOwp2YXIgaW5pdF9vYnNlcnZhYmxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc3ltYm9sL29ic2VydmFibGUuanMiKCkgewogICAgb2JzZXJ2YWJsZSA9IChmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm9ic2VydmFibGUgfHwgIkBAb2JzZXJ2YWJsZSI7CiAgICB9KSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pZGVudGl0eS5qcwpmdW5jdGlvbiBpZGVudGl0eSh4NCkgewogIHJldHVybiB4NDsKfQp2YXIgaW5pdF9pZGVudGl0eSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaWRlbnRpdHkuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9waXBlLmpzCmZ1bmN0aW9uIHBpcGUoKSB7CiAgdmFyIGZucyA9IFtdOwogIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICBmbnNbX2ldID0gYXJndW1lbnRzW19pXTsKICB9CiAgcmV0dXJuIHBpcGVGcm9tQXJyYXkoZm5zKTsKfQpmdW5jdGlvbiBwaXBlRnJvbUFycmF5KGZucykgewogIGlmIChmbnMubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4gaWRlbnRpdHk7CiAgfQogIGlmIChmbnMubGVuZ3RoID09PSAxKSB7CiAgICByZXR1cm4gZm5zWzBdOwogIH0KICByZXR1cm4gZnVuY3Rpb24gcGlwZWQoaW5wdXQpIHsKICAgIHJldHVybiBmbnMucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGZuKSB7CiAgICAgIHJldHVybiBmbihwcmV2KTsKICAgIH0sIGlucHV0KTsKICB9Owp9CnZhciBpbml0X3BpcGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL3BpcGUuanMiKCkgewogICAgaW5pdF9pZGVudGl0eSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvT2JzZXJ2YWJsZS5qcwpmdW5jdGlvbiBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3RvcikgewogIHZhciBfYTEyOwogIHJldHVybiAoX2ExMiA9IHByb21pc2VDdG9yICE9PSBudWxsICYmIHByb21pc2VDdG9yICE9PSB2b2lkIDAgPyBwcm9taXNlQ3RvciA6IGNvbmZpZy5Qcm9taXNlKSAhPT0gbnVsbCAmJiBfYTEyICE9PSB2b2lkIDAgPyBfYTEyIDogUHJvbWlzZTsKfQpmdW5jdGlvbiBpc09ic2VydmVyKHZhbHVlMikgewogIHJldHVybiB2YWx1ZTIgJiYgaXNGdW5jdGlvbih2YWx1ZTIubmV4dCkgJiYgaXNGdW5jdGlvbih2YWx1ZTIuZXJyb3IpICYmIGlzRnVuY3Rpb24odmFsdWUyLmNvbXBsZXRlKTsKfQpmdW5jdGlvbiBpc1N1YnNjcmliZXIodmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMiAmJiB2YWx1ZTIgaW5zdGFuY2VvZiBTdWJzY3JpYmVyIHx8IGlzT2JzZXJ2ZXIodmFsdWUyKSAmJiBpc1N1YnNjcmlwdGlvbih2YWx1ZTIpOwp9CnZhciBPYnNlcnZhYmxlOwp2YXIgaW5pdF9PYnNlcnZhYmxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvT2JzZXJ2YWJsZS5qcyIoKSB7CiAgICBpbml0X1N1YnNjcmliZXIoKTsKICAgIGluaXRfU3Vic2NyaXB0aW9uKCk7CiAgICBpbml0X29ic2VydmFibGUoKTsKICAgIGluaXRfcGlwZSgpOwogICAgaW5pdF9jb25maWcoKTsKICAgIGluaXRfaXNGdW5jdGlvbigpOwogICAgaW5pdF9lcnJvckNvbnRleHQoKTsKICAgIE9ic2VydmFibGUgPSAoZnVuY3Rpb24oKSB7CiAgICAgIGZ1bmN0aW9uIE9ic2VydmFibGUyKHN1YnNjcmliZTIpIHsKICAgICAgICBpZiAoc3Vic2NyaWJlMikgewogICAgICAgICAgdGhpcy5fc3Vic2NyaWJlID0gc3Vic2NyaWJlMjsKICAgICAgICB9CiAgICAgIH0KICAgICAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLmxpZnQgPSBmdW5jdGlvbihvcGVyYXRvcikgewogICAgICAgIHZhciBvYnNlcnZhYmxlMiA9IG5ldyBPYnNlcnZhYmxlMigpOwogICAgICAgIG9ic2VydmFibGUyLnNvdXJjZSA9IHRoaXM7CiAgICAgICAgb2JzZXJ2YWJsZTIub3BlcmF0b3IgPSBvcGVyYXRvcjsKICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZTI7CiAgICAgIH07CiAgICAgIE9ic2VydmFibGUyLnByb3RvdHlwZS5zdWJzY3JpYmUgPSBmdW5jdGlvbihvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB2YXIgc3Vic2NyaWJlciA9IGlzU3Vic2NyaWJlcihvYnNlcnZlck9yTmV4dCkgPyBvYnNlcnZlck9yTmV4dCA6IG5ldyBTYWZlU3Vic2NyaWJlcihvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKTsKICAgICAgICBlcnJvckNvbnRleHQoZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgX2ExMiA9IF90aGlzLCBvcGVyYXRvciA9IF9hMTIub3BlcmF0b3IsIHNvdXJjZSA9IF9hMTIuc291cmNlOwogICAgICAgICAgc3Vic2NyaWJlci5hZGQob3BlcmF0b3IgPyBvcGVyYXRvci5jYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgOiBzb3VyY2UgPyBfdGhpcy5fc3Vic2NyaWJlKHN1YnNjcmliZXIpIDogX3RoaXMuX3RyeVN1YnNjcmliZShzdWJzY3JpYmVyKSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXI7CiAgICAgIH07CiAgICAgIE9ic2VydmFibGUyLnByb3RvdHlwZS5fdHJ5U3Vic2NyaWJlID0gZnVuY3Rpb24oc2luaykgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fc3Vic2NyaWJlKHNpbmspOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgc2luay5lcnJvcihlcnIpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihuZXh0MiwgcHJvbWlzZUN0b3IpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHByb21pc2VDdG9yID0gZ2V0UHJvbWlzZUN0b3IocHJvbWlzZUN0b3IpOwogICAgICAgIHJldHVybiBuZXcgcHJvbWlzZUN0b3IoZnVuY3Rpb24ocmVzb2x2ZTIsIHJlamVjdCkgewogICAgICAgICAgdmFyIHN1YnNjcmliZXIgPSBuZXcgU2FmZVN1YnNjcmliZXIoewogICAgICAgICAgICBuZXh0OiBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgbmV4dDIodmFsdWUyKTsKICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgc3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXJyb3I6IHJlamVjdCwKICAgICAgICAgICAgY29tcGxldGU6IHJlc29sdmUyCiAgICAgICAgICB9KTsKICAgICAgICAgIF90aGlzLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIF9hMTI7CiAgICAgICAgcmV0dXJuIChfYTEyID0gdGhpcy5zb3VyY2UpID09PSBudWxsIHx8IF9hMTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hMTIuc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICB9OwogICAgICBPYnNlcnZhYmxlMi5wcm90b3R5cGVbb2JzZXJ2YWJsZV0gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfTsKICAgICAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgb3BlcmF0aW9ucyA9IFtdOwogICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICBvcGVyYXRpb25zW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBwaXBlRnJvbUFycmF5KG9wZXJhdGlvbnMpKHRoaXMpOwogICAgICB9OwogICAgICBPYnNlcnZhYmxlMi5wcm90b3R5cGUudG9Qcm9taXNlID0gZnVuY3Rpb24ocHJvbWlzZUN0b3IpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHByb21pc2VDdG9yID0gZ2V0UHJvbWlzZUN0b3IocHJvbWlzZUN0b3IpOwogICAgICAgIHJldHVybiBuZXcgcHJvbWlzZUN0b3IoZnVuY3Rpb24ocmVzb2x2ZTIsIHJlamVjdCkgewogICAgICAgICAgdmFyIHZhbHVlMjsKICAgICAgICAgIF90aGlzLnN1YnNjcmliZShmdW5jdGlvbih4NCkgewogICAgICAgICAgICByZXR1cm4gdmFsdWUyID0geDQ7CiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpOwogICAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiByZXNvbHZlMih2YWx1ZTIpOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIE9ic2VydmFibGUyLmNyZWF0ZSA9IGZ1bmN0aW9uKHN1YnNjcmliZTIpIHsKICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUyKHN1YnNjcmliZTIpOwogICAgICB9OwogICAgICByZXR1cm4gT2JzZXJ2YWJsZTI7CiAgICB9KSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9saWZ0LmpzCmZ1bmN0aW9uIGhhc0xpZnQoc291cmNlKSB7CiAgcmV0dXJuIGlzRnVuY3Rpb24oc291cmNlID09PSBudWxsIHx8IHNvdXJjZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc291cmNlLmxpZnQpOwp9CmZ1bmN0aW9uIG9wZXJhdGUoaW5pdCkgewogIHJldHVybiBmdW5jdGlvbihzb3VyY2UpIHsKICAgIGlmIChoYXNMaWZ0KHNvdXJjZSkpIHsKICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KGZ1bmN0aW9uKGxpZnRlZFNvdXJjZSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gaW5pdChsaWZ0ZWRTb3VyY2UsIHRoaXMpOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgdGhpcy5lcnJvcihlcnIpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmFibGUgdG8gbGlmdCB1bmtub3duIE9ic2VydmFibGUgdHlwZSIpOwogIH07Cn0KdmFyIGluaXRfbGlmdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvbGlmdC5qcyIoKSB7CiAgICBpbml0X2lzRnVuY3Rpb24oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9PcGVyYXRvclN1YnNjcmliZXIuanMKZnVuY3Rpb24gY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBvbk5leHQsIG9uQ29tcGxldGUsIG9uRXJyb3IsIG9uRmluYWxpemUpIHsKICByZXR1cm4gbmV3IE9wZXJhdG9yU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgb25OZXh0LCBvbkNvbXBsZXRlLCBvbkVycm9yLCBvbkZpbmFsaXplKTsKfQp2YXIgT3BlcmF0b3JTdWJzY3JpYmVyOwp2YXIgaW5pdF9PcGVyYXRvclN1YnNjcmliZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvT3BlcmF0b3JTdWJzY3JpYmVyLmpzIigpIHsKICAgIGluaXRfdHNsaWJfZXM2KCk7CiAgICBpbml0X1N1YnNjcmliZXIoKTsKICAgIE9wZXJhdG9yU3Vic2NyaWJlciA9IChmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKE9wZXJhdG9yU3Vic2NyaWJlcjIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIE9wZXJhdG9yU3Vic2NyaWJlcjIoZGVzdGluYXRpb24sIG9uTmV4dCwgb25Db21wbGV0ZSwgb25FcnJvciwgb25GaW5hbGl6ZSwgc2hvdWxkVW5zdWJzY3JpYmUpIHsKICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbikgfHwgdGhpczsKICAgICAgICBfdGhpcy5vbkZpbmFsaXplID0gb25GaW5hbGl6ZTsKICAgICAgICBfdGhpcy5zaG91bGRVbnN1YnNjcmliZSA9IHNob3VsZFVuc3Vic2NyaWJlOwogICAgICAgIF90aGlzLl9uZXh0ID0gb25OZXh0ID8gZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBvbk5leHQodmFsdWUyKTsKICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBkZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgfQogICAgICAgIH0gOiBfc3VwZXIucHJvdG90eXBlLl9uZXh0OwogICAgICAgIF90aGlzLl9lcnJvciA9IG9uRXJyb3IgPyBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIG9uRXJyb3IoZXJyKTsKICAgICAgICAgIH0gY2F0Y2ggKGVycjIpIHsKICAgICAgICAgICAgZGVzdGluYXRpb24uZXJyb3IoZXJyMik7CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICB9CiAgICAgICAgfSA6IF9zdXBlci5wcm90b3R5cGUuX2Vycm9yOwogICAgICAgIF90aGlzLl9jb21wbGV0ZSA9IG9uQ29tcGxldGUgPyBmdW5jdGlvbigpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIG9uQ29tcGxldGUoKTsKICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBkZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgICAgfQogICAgICAgIH0gOiBfc3VwZXIucHJvdG90eXBlLl9jb21wbGV0ZTsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgT3BlcmF0b3JTdWJzY3JpYmVyMi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2ExMjsKICAgICAgICBpZiAoIXRoaXMuc2hvdWxkVW5zdWJzY3JpYmUgfHwgdGhpcy5zaG91bGRVbnN1YnNjcmliZSgpKSB7CiAgICAgICAgICB2YXIgY2xvc2VkXzEgPSB0aGlzLmNsb3NlZDsKICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKTsKICAgICAgICAgICFjbG9zZWRfMSAmJiAoKF9hMTIgPSB0aGlzLm9uRmluYWxpemUpID09PSBudWxsIHx8IF9hMTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hMTIuY2FsbCh0aGlzKSk7CiAgICAgICAgfQogICAgICB9OwogICAgICByZXR1cm4gT3BlcmF0b3JTdWJzY3JpYmVyMjsKICAgIH0pKFN1YnNjcmliZXIpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3JlZkNvdW50LmpzCmZ1bmN0aW9uIHJlZkNvdW50KCkgewogIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgdmFyIGNvbm5lY3Rpb24gPSBudWxsOwogICAgc291cmNlLl9yZWZDb3VudCsrOwogICAgdmFyIHJlZkNvdW50ZXIgPSBjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgdm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24oKSB7CiAgICAgIGlmICghc291cmNlIHx8IHNvdXJjZS5fcmVmQ291bnQgPD0gMCB8fCAwIDwgLS1zb3VyY2UuX3JlZkNvdW50KSB7CiAgICAgICAgY29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBzaGFyZWRDb25uZWN0aW9uID0gc291cmNlLl9jb25uZWN0aW9uOwogICAgICB2YXIgY29ubiA9IGNvbm5lY3Rpb247CiAgICAgIGNvbm5lY3Rpb24gPSBudWxsOwogICAgICBpZiAoc2hhcmVkQ29ubmVjdGlvbiAmJiAoIWNvbm4gfHwgc2hhcmVkQ29ubmVjdGlvbiA9PT0gY29ubikpIHsKICAgICAgICBzaGFyZWRDb25uZWN0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgIH0KICAgICAgc3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgfSk7CiAgICBzb3VyY2Uuc3Vic2NyaWJlKHJlZkNvdW50ZXIpOwogICAgaWYgKCFyZWZDb3VudGVyLmNsb3NlZCkgewogICAgICBjb25uZWN0aW9uID0gc291cmNlLmNvbm5lY3QoKTsKICAgIH0KICB9KTsKfQp2YXIgaW5pdF9yZWZDb3VudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9yZWZDb3VudC5qcyIoKSB7CiAgICBpbml0X2xpZnQoKTsKICAgIGluaXRfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL0Nvbm5lY3RhYmxlT2JzZXJ2YWJsZS5qcwp2YXIgQ29ubmVjdGFibGVPYnNlcnZhYmxlOwp2YXIgaW5pdF9Db25uZWN0YWJsZU9ic2VydmFibGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL0Nvbm5lY3RhYmxlT2JzZXJ2YWJsZS5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgaW5pdF9PYnNlcnZhYmxlKCk7CiAgICBpbml0X1N1YnNjcmlwdGlvbigpOwogICAgaW5pdF9yZWZDb3VudCgpOwogICAgaW5pdF9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGluaXRfbGlmdCgpOwogICAgQ29ubmVjdGFibGVPYnNlcnZhYmxlID0gKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoQ29ubmVjdGFibGVPYnNlcnZhYmxlMiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gQ29ubmVjdGFibGVPYnNlcnZhYmxlMihzb3VyY2UsIHN1YmplY3RGYWN0b3J5KSB7CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICBfdGhpcy5zb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgX3RoaXMuc3ViamVjdEZhY3RvcnkgPSBzdWJqZWN0RmFjdG9yeTsKICAgICAgICBfdGhpcy5fc3ViamVjdCA9IG51bGw7CiAgICAgICAgX3RoaXMuX3JlZkNvdW50ID0gMDsKICAgICAgICBfdGhpcy5fY29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgaWYgKGhhc0xpZnQoc291cmNlKSkgewogICAgICAgICAgX3RoaXMubGlmdCA9IHNvdXJjZS5saWZ0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgQ29ubmVjdGFibGVPYnNlcnZhYmxlMi5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICB9OwogICAgICBDb25uZWN0YWJsZU9ic2VydmFibGUyLnByb3RvdHlwZS5nZXRTdWJqZWN0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHN1YmplY3QgPSB0aGlzLl9zdWJqZWN0OwogICAgICAgIGlmICghc3ViamVjdCB8fCBzdWJqZWN0LmlzU3RvcHBlZCkgewogICAgICAgICAgdGhpcy5fc3ViamVjdCA9IHRoaXMuc3ViamVjdEZhY3RvcnkoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX3N1YmplY3Q7CiAgICAgIH07CiAgICAgIENvbm5lY3RhYmxlT2JzZXJ2YWJsZTIucHJvdG90eXBlLl90ZWFyZG93biA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3JlZkNvdW50ID0gMDsKICAgICAgICB2YXIgX2Nvbm5lY3Rpb24gPSB0aGlzLl9jb25uZWN0aW9uOwogICAgICAgIHRoaXMuX3N1YmplY3QgPSB0aGlzLl9jb25uZWN0aW9uID0gbnVsbDsKICAgICAgICBfY29ubmVjdGlvbiA9PT0gbnVsbCB8fCBfY29ubmVjdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Nvbm5lY3Rpb24udW5zdWJzY3JpYmUoKTsKICAgICAgfTsKICAgICAgQ29ubmVjdGFibGVPYnNlcnZhYmxlMi5wcm90b3R5cGUuY29ubmVjdCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdmFyIGNvbm5lY3Rpb24gPSB0aGlzLl9jb25uZWN0aW9uOwogICAgICAgIGlmICghY29ubmVjdGlvbikgewogICAgICAgICAgY29ubmVjdGlvbiA9IHRoaXMuX2Nvbm5lY3Rpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7CiAgICAgICAgICB2YXIgc3ViamVjdF8xID0gdGhpcy5nZXRTdWJqZWN0KCk7CiAgICAgICAgICBjb25uZWN0aW9uLmFkZCh0aGlzLnNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YmplY3RfMSwgdm9pZCAwLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgX3RoaXMuX3RlYXJkb3duKCk7CiAgICAgICAgICAgIHN1YmplY3RfMS5jb21wbGV0ZSgpOwogICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgIF90aGlzLl90ZWFyZG93bigpOwogICAgICAgICAgICBzdWJqZWN0XzEuZXJyb3IoZXJyKTsKICAgICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gX3RoaXMuX3RlYXJkb3duKCk7CiAgICAgICAgICB9KSkpOwogICAgICAgICAgaWYgKGNvbm5lY3Rpb24uY2xvc2VkKSB7CiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3Rpb24gPSBudWxsOwogICAgICAgICAgICBjb25uZWN0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY29ubmVjdGlvbjsKICAgICAgfTsKICAgICAgQ29ubmVjdGFibGVPYnNlcnZhYmxlMi5wcm90b3R5cGUucmVmQ291bnQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcmVmQ291bnQoKSh0aGlzKTsKICAgICAgfTsKICAgICAgcmV0dXJuIENvbm5lY3RhYmxlT2JzZXJ2YWJsZTI7CiAgICB9KShPYnNlcnZhYmxlKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9wZXJmb3JtYW5jZVRpbWVzdGFtcFByb3ZpZGVyLmpzCnZhciBwZXJmb3JtYW5jZVRpbWVzdGFtcFByb3ZpZGVyOwp2YXIgaW5pdF9wZXJmb3JtYW5jZVRpbWVzdGFtcFByb3ZpZGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL3BlcmZvcm1hbmNlVGltZXN0YW1wUHJvdmlkZXIuanMiKCkgewogICAgcGVyZm9ybWFuY2VUaW1lc3RhbXBQcm92aWRlciA9IHsKICAgICAgbm93OiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKHBlcmZvcm1hbmNlVGltZXN0YW1wUHJvdmlkZXIuZGVsZWdhdGUgfHwgcGVyZm9ybWFuY2UpLm5vdygpOwogICAgICB9LAogICAgICBkZWxlZ2F0ZTogdm9pZCAwCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL2FuaW1hdGlvbkZyYW1lUHJvdmlkZXIuanMKdmFyIGFuaW1hdGlvbkZyYW1lUHJvdmlkZXI7CnZhciBpbml0X2FuaW1hdGlvbkZyYW1lUHJvdmlkZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvYW5pbWF0aW9uRnJhbWVQcm92aWRlci5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgaW5pdF9TdWJzY3JpcHRpb24oKTsKICAgIGFuaW1hdGlvbkZyYW1lUHJvdmlkZXIgPSB7CiAgICAgIHNjaGVkdWxlOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgIHZhciByZXF1ZXN0ID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lOwogICAgICAgIHZhciBjYW5jZWwgPSBjYW5jZWxBbmltYXRpb25GcmFtZTsKICAgICAgICB2YXIgZGVsZWdhdGUgPSBhbmltYXRpb25GcmFtZVByb3ZpZGVyLmRlbGVnYXRlOwogICAgICAgIGlmIChkZWxlZ2F0ZSkgewogICAgICAgICAgcmVxdWVzdCA9IGRlbGVnYXRlLnJlcXVlc3RBbmltYXRpb25GcmFtZTsKICAgICAgICAgIGNhbmNlbCA9IGRlbGVnYXRlLmNhbmNlbEFuaW1hdGlvbkZyYW1lOwogICAgICAgIH0KICAgICAgICB2YXIgaGFuZGxlMyA9IHJlcXVlc3QoZnVuY3Rpb24odGltZXN0YW1wMikgewogICAgICAgICAgY2FuY2VsID0gdm9pZCAwOwogICAgICAgICAgY2FsbGJhY2sodGltZXN0YW1wMik7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24oZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gY2FuY2VsID09PSBudWxsIHx8IGNhbmNlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2FuY2VsKGhhbmRsZTMpOwogICAgICAgIH0pOwogICAgICB9LAogICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWU6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhcmdzID0gW107CiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgICB9CiAgICAgICAgdmFyIGRlbGVnYXRlID0gYW5pbWF0aW9uRnJhbWVQcm92aWRlci5kZWxlZ2F0ZTsKICAgICAgICByZXR1cm4gKChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB8fCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUpLmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGFyZ3MpKSk7CiAgICAgIH0sCiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYXJncyA9IFtdOwogICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgICAgfQogICAgICAgIHZhciBkZWxlZ2F0ZSA9IGFuaW1hdGlvbkZyYW1lUHJvdmlkZXIuZGVsZWdhdGU7CiAgICAgICAgcmV0dXJuICgoZGVsZWdhdGUgPT09IG51bGwgfHwgZGVsZWdhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGVnYXRlLmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB8fCBjYW5jZWxBbmltYXRpb25GcmFtZSkuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoYXJncykpKTsKICAgICAgfSwKICAgICAgZGVsZWdhdGU6IHZvaWQgMAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZG9tL2FuaW1hdGlvbkZyYW1lcy5qcwpmdW5jdGlvbiBhbmltYXRpb25GcmFtZXModGltZXN0YW1wUHJvdmlkZXIpIHsKICByZXR1cm4gdGltZXN0YW1wUHJvdmlkZXIgPyBhbmltYXRpb25GcmFtZXNGYWN0b3J5KHRpbWVzdGFtcFByb3ZpZGVyKSA6IERFRkFVTFRfQU5JTUFUSU9OX0ZSQU1FUzsKfQpmdW5jdGlvbiBhbmltYXRpb25GcmFtZXNGYWN0b3J5KHRpbWVzdGFtcFByb3ZpZGVyKSB7CiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgIHZhciBwcm92aWRlciA9IHRpbWVzdGFtcFByb3ZpZGVyIHx8IHBlcmZvcm1hbmNlVGltZXN0YW1wUHJvdmlkZXI7CiAgICB2YXIgc3RhcnQgPSBwcm92aWRlci5ub3coKTsKICAgIHZhciBpZCA9IDA7CiAgICB2YXIgcnVuID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICghc3Vic2NyaWJlci5jbG9zZWQpIHsKICAgICAgICBpZCA9IGFuaW1hdGlvbkZyYW1lUHJvdmlkZXIucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKHRpbWVzdGFtcDIpIHsKICAgICAgICAgIGlkID0gMDsKICAgICAgICAgIHZhciBub3cyID0gcHJvdmlkZXIubm93KCk7CiAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoewogICAgICAgICAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcFByb3ZpZGVyID8gbm93MiA6IHRpbWVzdGFtcDIsCiAgICAgICAgICAgIGVsYXBzZWQ6IG5vdzIgLSBzdGFydAogICAgICAgICAgfSk7CiAgICAgICAgICBydW4oKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIHJ1bigpOwogICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICBpZiAoaWQpIHsKICAgICAgICBhbmltYXRpb25GcmFtZVByb3ZpZGVyLmNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTsKICAgICAgfQogICAgfTsKICB9KTsKfQp2YXIgREVGQVVMVF9BTklNQVRJT05fRlJBTUVTOwp2YXIgaW5pdF9hbmltYXRpb25GcmFtZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2RvbS9hbmltYXRpb25GcmFtZXMuanMiKCkgewogICAgaW5pdF9PYnNlcnZhYmxlKCk7CiAgICBpbml0X3BlcmZvcm1hbmNlVGltZXN0YW1wUHJvdmlkZXIoKTsKICAgIGluaXRfYW5pbWF0aW9uRnJhbWVQcm92aWRlcigpOwogICAgREVGQVVMVF9BTklNQVRJT05fRlJBTUVTID0gYW5pbWF0aW9uRnJhbWVzRmFjdG9yeSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9PYmplY3RVbnN1YnNjcmliZWRFcnJvci5qcwp2YXIgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3I7CnZhciBpbml0X09iamVjdFVuc3Vic2NyaWJlZEVycm9yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9PYmplY3RVbnN1YnNjcmliZWRFcnJvci5qcyIoKSB7CiAgICBpbml0X2NyZWF0ZUVycm9yQ2xhc3MoKTsKICAgIE9iamVjdFVuc3Vic2NyaWJlZEVycm9yID0gY3JlYXRlRXJyb3JDbGFzcyhmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIE9iamVjdFVuc3Vic2NyaWJlZEVycm9ySW1wbCgpIHsKICAgICAgICBfc3VwZXIodGhpcyk7CiAgICAgICAgdGhpcy5uYW1lID0gIk9iamVjdFVuc3Vic2NyaWJlZEVycm9yIjsKICAgICAgICB0aGlzLm1lc3NhZ2UgPSAib2JqZWN0IHVuc3Vic2NyaWJlZCI7CiAgICAgIH07CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL1N1YmplY3QuanMKdmFyIFN1YmplY3QsIEFub255bW91c1N1YmplY3Q7CnZhciBpbml0X1N1YmplY3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9TdWJqZWN0LmpzIigpIHsKICAgIGluaXRfdHNsaWJfZXM2KCk7CiAgICBpbml0X09ic2VydmFibGUoKTsKICAgIGluaXRfU3Vic2NyaXB0aW9uKCk7CiAgICBpbml0X09iamVjdFVuc3Vic2NyaWJlZEVycm9yKCk7CiAgICBpbml0X2FyclJlbW92ZSgpOwogICAgaW5pdF9lcnJvckNvbnRleHQoKTsKICAgIFN1YmplY3QgPSAoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhTdWJqZWN0MiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gU3ViamVjdDIoKSB7CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICBfdGhpcy5jbG9zZWQgPSBmYWxzZTsKICAgICAgICBfdGhpcy5jdXJyZW50T2JzZXJ2ZXJzID0gbnVsbDsKICAgICAgICBfdGhpcy5vYnNlcnZlcnMgPSBbXTsKICAgICAgICBfdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTsKICAgICAgICBfdGhpcy5oYXNFcnJvciA9IGZhbHNlOwogICAgICAgIF90aGlzLnRocm93bkVycm9yID0gbnVsbDsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgU3ViamVjdDIucHJvdG90eXBlLmxpZnQgPSBmdW5jdGlvbihvcGVyYXRvcikgewogICAgICAgIHZhciBzdWJqZWN0ID0gbmV3IEFub255bW91c1N1YmplY3QodGhpcywgdGhpcyk7CiAgICAgICAgc3ViamVjdC5vcGVyYXRvciA9IG9wZXJhdG9yOwogICAgICAgIHJldHVybiBzdWJqZWN0OwogICAgICB9OwogICAgICBTdWJqZWN0Mi5wcm90b3R5cGUuX3Rocm93SWZDbG9zZWQgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgICAgIHRocm93IG5ldyBPYmplY3RVbnN1YnNjcmliZWRFcnJvcigpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgU3ViamVjdDIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIGVycm9yQ29udGV4dChmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBlXzEsIF9hMTI7CiAgICAgICAgICBfdGhpcy5fdGhyb3dJZkNsb3NlZCgpOwogICAgICAgICAgaWYgKCFfdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgaWYgKCFfdGhpcy5jdXJyZW50T2JzZXJ2ZXJzKSB7CiAgICAgICAgICAgICAgX3RoaXMuY3VycmVudE9ic2VydmVycyA9IEFycmF5LmZyb20oX3RoaXMub2JzZXJ2ZXJzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMoX3RoaXMuY3VycmVudE9ic2VydmVycyksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHsKICAgICAgICAgICAgICAgIHZhciBvYnNlcnZlciA9IF9jLnZhbHVlOwogICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh2YWx1ZTIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoZV8xXzEpIHsKICAgICAgICAgICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OwogICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hMTIgPSBfYi5yZXR1cm4pKSBfYTEyLmNhbGwoX2IpOwogICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIFN1YmplY3QyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKGVycikgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgZXJyb3JDb250ZXh0KGZ1bmN0aW9uKCkgewogICAgICAgICAgX3RoaXMuX3Rocm93SWZDbG9zZWQoKTsKICAgICAgICAgIGlmICghX3RoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICAgIF90aGlzLmhhc0Vycm9yID0gX3RoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgICAgICAgX3RoaXMudGhyb3duRXJyb3IgPSBlcnI7CiAgICAgICAgICAgIHZhciBvYnNlcnZlcnMgPSBfdGhpcy5vYnNlcnZlcnM7CiAgICAgICAgICAgIHdoaWxlIChvYnNlcnZlcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgb2JzZXJ2ZXJzLnNoaWZ0KCkuZXJyb3IoZXJyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9OwogICAgICBTdWJqZWN0Mi5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIGVycm9yQ29udGV4dChmdW5jdGlvbigpIHsKICAgICAgICAgIF90aGlzLl90aHJvd0lmQ2xvc2VkKCk7CiAgICAgICAgICBpZiAoIV90aGlzLmlzU3RvcHBlZCkgewogICAgICAgICAgICBfdGhpcy5pc1N0b3BwZWQgPSB0cnVlOwogICAgICAgICAgICB2YXIgb2JzZXJ2ZXJzID0gX3RoaXMub2JzZXJ2ZXJzOwogICAgICAgICAgICB3aGlsZSAob2JzZXJ2ZXJzLmxlbmd0aCkgewogICAgICAgICAgICAgIG9ic2VydmVycy5zaGlmdCgpLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfTsKICAgICAgU3ViamVjdDIucHJvdG90eXBlLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0aGlzLmNsb3NlZCA9IHRydWU7CiAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSB0aGlzLmN1cnJlbnRPYnNlcnZlcnMgPSBudWxsOwogICAgICB9OwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3ViamVjdDIucHJvdG90eXBlLCAib2JzZXJ2ZWQiLCB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBfYTEyOwogICAgICAgICAgcmV0dXJuICgoX2ExMiA9IHRoaXMub2JzZXJ2ZXJzKSA9PT0gbnVsbCB8fCBfYTEyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTEyLmxlbmd0aCkgPiAwOwogICAgICAgIH0sCiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgICBTdWJqZWN0Mi5wcm90b3R5cGUuX3RyeVN1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgICAgICB0aGlzLl90aHJvd0lmQ2xvc2VkKCk7CiAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuX3RyeVN1YnNjcmliZS5jYWxsKHRoaXMsIHN1YnNjcmliZXIpOwogICAgICB9OwogICAgICBTdWJqZWN0Mi5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgICAgICB0aGlzLl90aHJvd0lmQ2xvc2VkKCk7CiAgICAgICAgdGhpcy5fY2hlY2tGaW5hbGl6ZWRTdGF0dXNlcyhzdWJzY3JpYmVyKTsKICAgICAgICByZXR1cm4gdGhpcy5faW5uZXJTdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgIH07CiAgICAgIFN1YmplY3QyLnByb3RvdHlwZS5faW5uZXJTdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB2YXIgX2ExMiA9IHRoaXMsIGhhc0Vycm9yID0gX2ExMi5oYXNFcnJvciwgaXNTdG9wcGVkID0gX2ExMi5pc1N0b3BwZWQsIG9ic2VydmVycyA9IF9hMTIub2JzZXJ2ZXJzOwogICAgICAgIGlmIChoYXNFcnJvciB8fCBpc1N0b3BwZWQpIHsKICAgICAgICAgIHJldHVybiBFTVBUWV9TVUJTQ1JJUFRJT047CiAgICAgICAgfQogICAgICAgIHRoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7CiAgICAgICAgb2JzZXJ2ZXJzLnB1c2goc3Vic2NyaWJlcik7CiAgICAgICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24oZnVuY3Rpb24oKSB7CiAgICAgICAgICBfdGhpcy5jdXJyZW50T2JzZXJ2ZXJzID0gbnVsbDsKICAgICAgICAgIGFyclJlbW92ZShvYnNlcnZlcnMsIHN1YnNjcmliZXIpOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBTdWJqZWN0Mi5wcm90b3R5cGUuX2NoZWNrRmluYWxpemVkU3RhdHVzZXMgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIF9hMTIgPSB0aGlzLCBoYXNFcnJvciA9IF9hMTIuaGFzRXJyb3IsIHRocm93bkVycm9yID0gX2ExMi50aHJvd25FcnJvciwgaXNTdG9wcGVkID0gX2ExMi5pc1N0b3BwZWQ7CiAgICAgICAgaWYgKGhhc0Vycm9yKSB7CiAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKHRocm93bkVycm9yKTsKICAgICAgICB9IGVsc2UgaWYgKGlzU3RvcHBlZCkgewogICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgU3ViamVjdDIucHJvdG90eXBlLmFzT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBvYnNlcnZhYmxlMiA9IG5ldyBPYnNlcnZhYmxlKCk7CiAgICAgICAgb2JzZXJ2YWJsZTIuc291cmNlID0gdGhpczsKICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZTI7CiAgICAgIH07CiAgICAgIFN1YmplY3QyLmNyZWF0ZSA9IGZ1bmN0aW9uKGRlc3RpbmF0aW9uLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gbmV3IEFub255bW91c1N1YmplY3QoZGVzdGluYXRpb24sIHNvdXJjZSk7CiAgICAgIH07CiAgICAgIHJldHVybiBTdWJqZWN0MjsKICAgIH0pKE9ic2VydmFibGUpOwogICAgQW5vbnltb3VzU3ViamVjdCA9IChmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKEFub255bW91c1N1YmplY3QyLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBBbm9ueW1vdXNTdWJqZWN0MihkZXN0aW5hdGlvbiwgc291cmNlKSB7CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICBfdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOwogICAgICAgIF90aGlzLnNvdXJjZSA9IHNvdXJjZTsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgICB2YXIgX2ExMiwgX2I7CiAgICAgICAgKF9iID0gKF9hMTIgPSB0aGlzLmRlc3RpbmF0aW9uKSA9PT0gbnVsbCB8fCBfYTEyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTEyLm5leHQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hMTIsIHZhbHVlMik7CiAgICAgIH07CiAgICAgIEFub255bW91c1N1YmplY3QyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKGVycikgewogICAgICAgIHZhciBfYTEyLCBfYjsKICAgICAgICAoX2IgPSAoX2ExMiA9IHRoaXMuZGVzdGluYXRpb24pID09PSBudWxsIHx8IF9hMTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hMTIuZXJyb3IpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hMTIsIGVycik7CiAgICAgIH07CiAgICAgIEFub255bW91c1N1YmplY3QyLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBfYTEyLCBfYjsKICAgICAgICAoX2IgPSAoX2ExMiA9IHRoaXMuZGVzdGluYXRpb24pID09PSBudWxsIHx8IF9hMTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hMTIuY29tcGxldGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hMTIpOwogICAgICB9OwogICAgICBBbm9ueW1vdXNTdWJqZWN0Mi5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgX2ExMiwgX2I7CiAgICAgICAgcmV0dXJuIChfYiA9IChfYTEyID0gdGhpcy5zb3VyY2UpID09PSBudWxsIHx8IF9hMTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hMTIuc3Vic2NyaWJlKHN1YnNjcmliZXIpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBFTVBUWV9TVUJTQ1JJUFRJT047CiAgICAgIH07CiAgICAgIHJldHVybiBBbm9ueW1vdXNTdWJqZWN0MjsKICAgIH0pKFN1YmplY3QpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvQmVoYXZpb3JTdWJqZWN0LmpzCnZhciBCZWhhdmlvclN1YmplY3Q7CnZhciBpbml0X0JlaGF2aW9yU3ViamVjdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL0JlaGF2aW9yU3ViamVjdC5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgaW5pdF9TdWJqZWN0KCk7CiAgICBCZWhhdmlvclN1YmplY3QgPSAoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhCZWhhdmlvclN1YmplY3QyLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBCZWhhdmlvclN1YmplY3QyKF92YWx1ZSkgewogICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgX3RoaXMuX3ZhbHVlID0gX3ZhbHVlOwogICAgICAgIHJldHVybiBfdGhpczsKICAgICAgfQogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQmVoYXZpb3JTdWJqZWN0Mi5wcm90b3R5cGUsICJ2YWx1ZSIsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICB9LAogICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9KTsKICAgICAgQmVoYXZpb3JTdWJqZWN0Mi5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gX3N1cGVyLnByb3RvdHlwZS5fc3Vic2NyaWJlLmNhbGwodGhpcywgc3Vic2NyaWJlcik7CiAgICAgICAgIXN1YnNjcmlwdGlvbi5jbG9zZWQgJiYgc3Vic2NyaWJlci5uZXh0KHRoaXMuX3ZhbHVlKTsKICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwogICAgICB9OwogICAgICBCZWhhdmlvclN1YmplY3QyLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBfYTEyID0gdGhpcywgaGFzRXJyb3IgPSBfYTEyLmhhc0Vycm9yLCB0aHJvd25FcnJvciA9IF9hMTIudGhyb3duRXJyb3IsIF92YWx1ZSA9IF9hMTIuX3ZhbHVlOwogICAgICAgIGlmIChoYXNFcnJvcikgewogICAgICAgICAgdGhyb3cgdGhyb3duRXJyb3I7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTsKICAgICAgICByZXR1cm4gX3ZhbHVlOwogICAgICB9OwogICAgICBCZWhhdmlvclN1YmplY3QyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5uZXh0LmNhbGwodGhpcywgdGhpcy5fdmFsdWUgPSB2YWx1ZTIpOwogICAgICB9OwogICAgICByZXR1cm4gQmVoYXZpb3JTdWJqZWN0MjsKICAgIH0pKFN1YmplY3QpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL2RhdGVUaW1lc3RhbXBQcm92aWRlci5qcwp2YXIgZGF0ZVRpbWVzdGFtcFByb3ZpZGVyOwp2YXIgaW5pdF9kYXRlVGltZXN0YW1wUHJvdmlkZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvZGF0ZVRpbWVzdGFtcFByb3ZpZGVyLmpzIigpIHsKICAgIGRhdGVUaW1lc3RhbXBQcm92aWRlciA9IHsKICAgICAgbm93OiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKGRhdGVUaW1lc3RhbXBQcm92aWRlci5kZWxlZ2F0ZSB8fCBEYXRlKS5ub3coKTsKICAgICAgfSwKICAgICAgZGVsZWdhdGU6IHZvaWQgMAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL1JlcGxheVN1YmplY3QuanMKdmFyIFJlcGxheVN1YmplY3Q7CnZhciBpbml0X1JlcGxheVN1YmplY3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9SZXBsYXlTdWJqZWN0LmpzIigpIHsKICAgIGluaXRfdHNsaWJfZXM2KCk7CiAgICBpbml0X1N1YmplY3QoKTsKICAgIGluaXRfZGF0ZVRpbWVzdGFtcFByb3ZpZGVyKCk7CiAgICBSZXBsYXlTdWJqZWN0ID0gKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoUmVwbGF5U3ViamVjdDIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIFJlcGxheVN1YmplY3QyKF9idWZmZXJTaXplLCBfd2luZG93VGltZSwgX3RpbWVzdGFtcFByb3ZpZGVyKSB7CiAgICAgICAgaWYgKF9idWZmZXJTaXplID09PSB2b2lkIDApIHsKICAgICAgICAgIF9idWZmZXJTaXplID0gSW5maW5pdHk7CiAgICAgICAgfQogICAgICAgIGlmIChfd2luZG93VGltZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBfd2luZG93VGltZSA9IEluZmluaXR5OwogICAgICAgIH0KICAgICAgICBpZiAoX3RpbWVzdGFtcFByb3ZpZGVyID09PSB2b2lkIDApIHsKICAgICAgICAgIF90aW1lc3RhbXBQcm92aWRlciA9IGRhdGVUaW1lc3RhbXBQcm92aWRlcjsKICAgICAgICB9CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICBfdGhpcy5fYnVmZmVyU2l6ZSA9IF9idWZmZXJTaXplOwogICAgICAgIF90aGlzLl93aW5kb3dUaW1lID0gX3dpbmRvd1RpbWU7CiAgICAgICAgX3RoaXMuX3RpbWVzdGFtcFByb3ZpZGVyID0gX3RpbWVzdGFtcFByb3ZpZGVyOwogICAgICAgIF90aGlzLl9idWZmZXIgPSBbXTsKICAgICAgICBfdGhpcy5faW5maW5pdGVUaW1lV2luZG93ID0gdHJ1ZTsKICAgICAgICBfdGhpcy5faW5maW5pdGVUaW1lV2luZG93ID0gX3dpbmRvd1RpbWUgPT09IEluZmluaXR5OwogICAgICAgIF90aGlzLl9idWZmZXJTaXplID0gTWF0aC5tYXgoMSwgX2J1ZmZlclNpemUpOwogICAgICAgIF90aGlzLl93aW5kb3dUaW1lID0gTWF0aC5tYXgoMSwgX3dpbmRvd1RpbWUpOwogICAgICAgIHJldHVybiBfdGhpczsKICAgICAgfQogICAgICBSZXBsYXlTdWJqZWN0Mi5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHZhbHVlMikgewogICAgICAgIHZhciBfYTEyID0gdGhpcywgaXNTdG9wcGVkID0gX2ExMi5pc1N0b3BwZWQsIF9idWZmZXIgPSBfYTEyLl9idWZmZXIsIF9pbmZpbml0ZVRpbWVXaW5kb3cgPSBfYTEyLl9pbmZpbml0ZVRpbWVXaW5kb3csIF90aW1lc3RhbXBQcm92aWRlciA9IF9hMTIuX3RpbWVzdGFtcFByb3ZpZGVyLCBfd2luZG93VGltZSA9IF9hMTIuX3dpbmRvd1RpbWU7CiAgICAgICAgaWYgKCFpc1N0b3BwZWQpIHsKICAgICAgICAgIF9idWZmZXIucHVzaCh2YWx1ZTIpOwogICAgICAgICAgIV9pbmZpbml0ZVRpbWVXaW5kb3cgJiYgX2J1ZmZlci5wdXNoKF90aW1lc3RhbXBQcm92aWRlci5ub3coKSArIF93aW5kb3dUaW1lKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fdHJpbUJ1ZmZlcigpOwogICAgICAgIF9zdXBlci5wcm90b3R5cGUubmV4dC5jYWxsKHRoaXMsIHZhbHVlMik7CiAgICAgIH07CiAgICAgIFJlcGxheVN1YmplY3QyLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTsKICAgICAgICB0aGlzLl90cmltQnVmZmVyKCk7CiAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoaXMuX2lubmVyU3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICAgIHZhciBfYTEyID0gdGhpcywgX2luZmluaXRlVGltZVdpbmRvdyA9IF9hMTIuX2luZmluaXRlVGltZVdpbmRvdywgX2J1ZmZlciA9IF9hMTIuX2J1ZmZlcjsKICAgICAgICB2YXIgY29weSA9IF9idWZmZXIuc2xpY2UoKTsKICAgICAgICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBjb3B5Lmxlbmd0aCAmJiAhc3Vic2NyaWJlci5jbG9zZWQ7IGkxMSArPSBfaW5maW5pdGVUaW1lV2luZG93ID8gMSA6IDIpIHsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dChjb3B5W2kxMV0pOwogICAgICAgIH0KICAgICAgICB0aGlzLl9jaGVja0ZpbmFsaXplZFN0YXR1c2VzKHN1YnNjcmliZXIpOwogICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247CiAgICAgIH07CiAgICAgIFJlcGxheVN1YmplY3QyLnByb3RvdHlwZS5fdHJpbUJ1ZmZlciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBfYTEyID0gdGhpcywgX2J1ZmZlclNpemUgPSBfYTEyLl9idWZmZXJTaXplLCBfdGltZXN0YW1wUHJvdmlkZXIgPSBfYTEyLl90aW1lc3RhbXBQcm92aWRlciwgX2J1ZmZlciA9IF9hMTIuX2J1ZmZlciwgX2luZmluaXRlVGltZVdpbmRvdyA9IF9hMTIuX2luZmluaXRlVGltZVdpbmRvdzsKICAgICAgICB2YXIgYWRqdXN0ZWRCdWZmZXJTaXplID0gKF9pbmZpbml0ZVRpbWVXaW5kb3cgPyAxIDogMikgKiBfYnVmZmVyU2l6ZTsKICAgICAgICBfYnVmZmVyU2l6ZSA8IEluZmluaXR5ICYmIGFkanVzdGVkQnVmZmVyU2l6ZSA8IF9idWZmZXIubGVuZ3RoICYmIF9idWZmZXIuc3BsaWNlKDAsIF9idWZmZXIubGVuZ3RoIC0gYWRqdXN0ZWRCdWZmZXJTaXplKTsKICAgICAgICBpZiAoIV9pbmZpbml0ZVRpbWVXaW5kb3cpIHsKICAgICAgICAgIHZhciBub3cyID0gX3RpbWVzdGFtcFByb3ZpZGVyLm5vdygpOwogICAgICAgICAgdmFyIGxhc3QzID0gMDsKICAgICAgICAgIGZvciAodmFyIGkxMSA9IDE7IGkxMSA8IF9idWZmZXIubGVuZ3RoICYmIF9idWZmZXJbaTExXSA8PSBub3cyOyBpMTEgKz0gMikgewogICAgICAgICAgICBsYXN0MyA9IGkxMTsKICAgICAgICAgIH0KICAgICAgICAgIGxhc3QzICYmIF9idWZmZXIuc3BsaWNlKDAsIGxhc3QzICsgMSk7CiAgICAgICAgfQogICAgICB9OwogICAgICByZXR1cm4gUmVwbGF5U3ViamVjdDI7CiAgICB9KShTdWJqZWN0KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL0FzeW5jU3ViamVjdC5qcwp2YXIgQXN5bmNTdWJqZWN0Owp2YXIgaW5pdF9Bc3luY1N1YmplY3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9Bc3luY1N1YmplY3QuanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGluaXRfU3ViamVjdCgpOwogICAgQXN5bmNTdWJqZWN0ID0gKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoQXN5bmNTdWJqZWN0MiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gQXN5bmNTdWJqZWN0MigpIHsKICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgICBfdGhpcy5fdmFsdWUgPSBudWxsOwogICAgICAgIF90aGlzLl9oYXNWYWx1ZSA9IGZhbHNlOwogICAgICAgIF90aGlzLl9pc0NvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIEFzeW5jU3ViamVjdDIucHJvdG90eXBlLl9jaGVja0ZpbmFsaXplZFN0YXR1c2VzID0gZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgICAgIHZhciBfYTEyID0gdGhpcywgaGFzRXJyb3IgPSBfYTEyLmhhc0Vycm9yLCBfaGFzVmFsdWUgPSBfYTEyLl9oYXNWYWx1ZSwgX3ZhbHVlID0gX2ExMi5fdmFsdWUsIHRocm93bkVycm9yID0gX2ExMi50aHJvd25FcnJvciwgaXNTdG9wcGVkID0gX2ExMi5pc1N0b3BwZWQsIF9pc0NvbXBsZXRlID0gX2ExMi5faXNDb21wbGV0ZTsKICAgICAgICBpZiAoaGFzRXJyb3IpIHsKICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IodGhyb3duRXJyb3IpOwogICAgICAgIH0gZWxzZSBpZiAoaXNTdG9wcGVkIHx8IF9pc0NvbXBsZXRlKSB7CiAgICAgICAgICBfaGFzVmFsdWUgJiYgc3Vic2NyaWJlci5uZXh0KF92YWx1ZSk7CiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICB9OwogICAgICBBc3luY1N1YmplY3QyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkgewogICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTI7CiAgICAgICAgICB0aGlzLl9oYXNWYWx1ZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9OwogICAgICBBc3luY1N1YmplY3QyLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBfYTEyID0gdGhpcywgX2hhc1ZhbHVlID0gX2ExMi5faGFzVmFsdWUsIF92YWx1ZSA9IF9hMTIuX3ZhbHVlLCBfaXNDb21wbGV0ZSA9IF9hMTIuX2lzQ29tcGxldGU7CiAgICAgICAgaWYgKCFfaXNDb21wbGV0ZSkgewogICAgICAgICAgdGhpcy5faXNDb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICBfaGFzVmFsdWUgJiYgX3N1cGVyLnByb3RvdHlwZS5uZXh0LmNhbGwodGhpcywgX3ZhbHVlKTsKICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuY29tcGxldGUuY2FsbCh0aGlzKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJldHVybiBBc3luY1N1YmplY3QyOwogICAgfSkoU3ViamVjdCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvQWN0aW9uLmpzCnZhciBBY3Rpb247CnZhciBpbml0X0FjdGlvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9BY3Rpb24uanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGluaXRfU3Vic2NyaXB0aW9uKCk7CiAgICBBY3Rpb24gPSAoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhBY3Rpb24yLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBBY3Rpb24yKHNjaGVkdWxlciwgd29yaykgewogICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICB9CiAgICAgIEFjdGlvbjIucHJvdG90eXBlLnNjaGVkdWxlID0gZnVuY3Rpb24oc3RhdGUxMCwgZGVsYXkyKSB7CiAgICAgICAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBkZWxheTIgPSAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfTsKICAgICAgcmV0dXJuIEFjdGlvbjI7CiAgICB9KShTdWJzY3JpcHRpb24pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL2ludGVydmFsUHJvdmlkZXIuanMKdmFyIGludGVydmFsUHJvdmlkZXI7CnZhciBpbml0X2ludGVydmFsUHJvdmlkZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvaW50ZXJ2YWxQcm92aWRlci5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgaW50ZXJ2YWxQcm92aWRlciA9IHsKICAgICAgc2V0SW50ZXJ2YWw6IGZ1bmN0aW9uKGhhbmRsZXIyLCB0aW1lb3V0MikgewogICAgICAgIHZhciBhcmdzID0gW107CiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgIGFyZ3NbX2kgLSAyXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgICAgfQogICAgICAgIHZhciBkZWxlZ2F0ZSA9IGludGVydmFsUHJvdmlkZXIuZGVsZWdhdGU7CiAgICAgICAgaWYgKGRlbGVnYXRlID09PSBudWxsIHx8IGRlbGVnYXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWxlZ2F0ZS5zZXRJbnRlcnZhbCkgewogICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnNldEludGVydmFsLmFwcGx5KGRlbGVnYXRlLCBfX3NwcmVhZEFycmF5KFtoYW5kbGVyMiwgdGltZW91dDJdLCBfX3JlYWQoYXJncykpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNldEludGVydmFsLmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbaGFuZGxlcjIsIHRpbWVvdXQyXSwgX19yZWFkKGFyZ3MpKSk7CiAgICAgIH0sCiAgICAgIGNsZWFySW50ZXJ2YWw6IGZ1bmN0aW9uKGhhbmRsZTMpIHsKICAgICAgICB2YXIgZGVsZWdhdGUgPSBpbnRlcnZhbFByb3ZpZGVyLmRlbGVnYXRlOwogICAgICAgIHJldHVybiAoKGRlbGVnYXRlID09PSBudWxsIHx8IGRlbGVnYXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWxlZ2F0ZS5jbGVhckludGVydmFsKSB8fCBjbGVhckludGVydmFsKShoYW5kbGUzKTsKICAgICAgfSwKICAgICAgZGVsZWdhdGU6IHZvaWQgMAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9Bc3luY0FjdGlvbi5qcwp2YXIgQXN5bmNBY3Rpb247CnZhciBpbml0X0FzeW5jQWN0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL0FzeW5jQWN0aW9uLmpzIigpIHsKICAgIGluaXRfdHNsaWJfZXM2KCk7CiAgICBpbml0X0FjdGlvbigpOwogICAgaW5pdF9pbnRlcnZhbFByb3ZpZGVyKCk7CiAgICBpbml0X2FyclJlbW92ZSgpOwogICAgQXN5bmNBY3Rpb24gPSAoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhBc3luY0FjdGlvbjIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIEFzeW5jQWN0aW9uMihzY2hlZHVsZXIsIHdvcmspIHsKICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzY2hlZHVsZXIsIHdvcmspIHx8IHRoaXM7CiAgICAgICAgX3RoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOwogICAgICAgIF90aGlzLndvcmsgPSB3b3JrOwogICAgICAgIF90aGlzLnBlbmRpbmcgPSBmYWxzZTsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uKHN0YXRlMTAsIGRlbGF5MikgewogICAgICAgIHZhciBfYTEyOwogICAgICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgICAgICAgZGVsYXkyID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlMTA7CiAgICAgICAgdmFyIGlkID0gdGhpcy5pZDsKICAgICAgICB2YXIgc2NoZWR1bGVyID0gdGhpcy5zY2hlZHVsZXI7CiAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLnJlY3ljbGVBc3luY0lkKHNjaGVkdWxlciwgaWQsIGRlbGF5Mik7CiAgICAgICAgfQogICAgICAgIHRoaXMucGVuZGluZyA9IHRydWU7CiAgICAgICAgdGhpcy5kZWxheSA9IGRlbGF5MjsKICAgICAgICB0aGlzLmlkID0gKF9hMTIgPSB0aGlzLmlkKSAhPT0gbnVsbCAmJiBfYTEyICE9PSB2b2lkIDAgPyBfYTEyIDogdGhpcy5yZXF1ZXN0QXN5bmNJZChzY2hlZHVsZXIsIHRoaXMuaWQsIGRlbGF5Mik7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH07CiAgICAgIEFzeW5jQWN0aW9uMi5wcm90b3R5cGUucmVxdWVzdEFzeW5jSWQgPSBmdW5jdGlvbihzY2hlZHVsZXIsIF9pZCwgZGVsYXkyKSB7CiAgICAgICAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBkZWxheTIgPSAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaW50ZXJ2YWxQcm92aWRlci5zZXRJbnRlcnZhbChzY2hlZHVsZXIuZmx1c2guYmluZChzY2hlZHVsZXIsIHRoaXMpLCBkZWxheTIpOwogICAgICB9OwogICAgICBBc3luY0FjdGlvbjIucHJvdG90eXBlLnJlY3ljbGVBc3luY0lkID0gZnVuY3Rpb24oX3NjaGVkdWxlciwgaWQsIGRlbGF5MikgewogICAgICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgICAgICAgZGVsYXkyID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKGRlbGF5MiAhPSBudWxsICYmIHRoaXMuZGVsYXkgPT09IGRlbGF5MiAmJiB0aGlzLnBlbmRpbmcgPT09IGZhbHNlKSB7CiAgICAgICAgICByZXR1cm4gaWQ7CiAgICAgICAgfQogICAgICAgIGlmIChpZCAhPSBudWxsKSB7CiAgICAgICAgICBpbnRlcnZhbFByb3ZpZGVyLmNsZWFySW50ZXJ2YWwoaWQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICB9OwogICAgICBBc3luY0FjdGlvbjIucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbihzdGF0ZTEwLCBkZWxheTIpIHsKICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoImV4ZWN1dGluZyBhIGNhbmNlbGxlZCBhY3Rpb24iKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7CiAgICAgICAgdmFyIGVycm9yID0gdGhpcy5fZXhlY3V0ZShzdGF0ZTEwLCBkZWxheTIpOwogICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgcmV0dXJuIGVycm9yOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5wZW5kaW5nID09PSBmYWxzZSAmJiB0aGlzLmlkICE9IG51bGwpIHsKICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLnJlY3ljbGVBc3luY0lkKHRoaXMuc2NoZWR1bGVyLCB0aGlzLmlkLCBudWxsKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIEFzeW5jQWN0aW9uMi5wcm90b3R5cGUuX2V4ZWN1dGUgPSBmdW5jdGlvbihzdGF0ZTEwLCBfZGVsYXkpIHsKICAgICAgICB2YXIgZXJyb3JlZCA9IGZhbHNlOwogICAgICAgIHZhciBlcnJvclZhbHVlOwogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLndvcmsoc3RhdGUxMCk7CiAgICAgICAgfSBjYXRjaCAoZTExKSB7CiAgICAgICAgICBlcnJvcmVkID0gdHJ1ZTsKICAgICAgICAgIGVycm9yVmFsdWUgPSBlMTEgPyBlMTEgOiBuZXcgRXJyb3IoIlNjaGVkdWxlZCBhY3Rpb24gdGhyZXcgZmFsc3kgZXJyb3IiKTsKICAgICAgICB9CiAgICAgICAgaWYgKGVycm9yZWQpIHsKICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgIHJldHVybiBlcnJvclZhbHVlOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghdGhpcy5jbG9zZWQpIHsKICAgICAgICAgIHZhciBfYTEyID0gdGhpcywgaWQgPSBfYTEyLmlkLCBzY2hlZHVsZXIgPSBfYTEyLnNjaGVkdWxlcjsKICAgICAgICAgIHZhciBhY3Rpb25zID0gc2NoZWR1bGVyLmFjdGlvbnM7CiAgICAgICAgICB0aGlzLndvcmsgPSB0aGlzLnN0YXRlID0gdGhpcy5zY2hlZHVsZXIgPSBudWxsOwogICAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7CiAgICAgICAgICBhcnJSZW1vdmUoYWN0aW9ucywgdGhpcyk7CiAgICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBudWxsKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuZGVsYXkgPSBudWxsOwogICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS51bnN1YnNjcmliZS5jYWxsKHRoaXMpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIEFzeW5jQWN0aW9uMjsKICAgIH0pKEFjdGlvbik7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL0ltbWVkaWF0ZS5qcwpmdW5jdGlvbiBmaW5kQW5kQ2xlYXJIYW5kbGUoaGFuZGxlMykgewogIGlmIChoYW5kbGUzIGluIGFjdGl2ZUhhbmRsZXMpIHsKICAgIGRlbGV0ZSBhY3RpdmVIYW5kbGVzW2hhbmRsZTNdOwogICAgcmV0dXJuIHRydWU7CiAgfQogIHJldHVybiBmYWxzZTsKfQp2YXIgbmV4dEhhbmRsZSwgcmVzb2x2ZWQsIGFjdGl2ZUhhbmRsZXMsIEltbWVkaWF0ZSwgVGVzdFRvb2xzOwp2YXIgaW5pdF9JbW1lZGlhdGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL0ltbWVkaWF0ZS5qcyIoKSB7CiAgICBuZXh0SGFuZGxlID0gMTsKICAgIGFjdGl2ZUhhbmRsZXMgPSB7fTsKICAgIEltbWVkaWF0ZSA9IHsKICAgICAgc2V0SW1tZWRpYXRlOiBmdW5jdGlvbihjYikgewogICAgICAgIHZhciBoYW5kbGUzID0gbmV4dEhhbmRsZSsrOwogICAgICAgIGFjdGl2ZUhhbmRsZXNbaGFuZGxlM10gPSB0cnVlOwogICAgICAgIGlmICghcmVzb2x2ZWQpIHsKICAgICAgICAgIHJlc29sdmVkID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICAgICAgfQogICAgICAgIHJlc29sdmVkLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gZmluZEFuZENsZWFySGFuZGxlKGhhbmRsZTMpICYmIGNiKCk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGhhbmRsZTM7CiAgICAgIH0sCiAgICAgIGNsZWFySW1tZWRpYXRlOiBmdW5jdGlvbihoYW5kbGUzKSB7CiAgICAgICAgZmluZEFuZENsZWFySGFuZGxlKGhhbmRsZTMpOwogICAgICB9CiAgICB9OwogICAgVGVzdFRvb2xzID0gewogICAgICBwZW5kaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoYWN0aXZlSGFuZGxlcykubGVuZ3RoOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL2ltbWVkaWF0ZVByb3ZpZGVyLmpzCnZhciBzZXRJbW1lZGlhdGUsIGNsZWFySW1tZWRpYXRlLCBpbW1lZGlhdGVQcm92aWRlcjsKdmFyIGluaXRfaW1tZWRpYXRlUHJvdmlkZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvaW1tZWRpYXRlUHJvdmlkZXIuanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGluaXRfSW1tZWRpYXRlKCk7CiAgICBzZXRJbW1lZGlhdGUgPSBJbW1lZGlhdGUuc2V0SW1tZWRpYXRlLCBjbGVhckltbWVkaWF0ZSA9IEltbWVkaWF0ZS5jbGVhckltbWVkaWF0ZTsKICAgIGltbWVkaWF0ZVByb3ZpZGVyID0gewogICAgICBzZXRJbW1lZGlhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhcmdzID0gW107CiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgICB9CiAgICAgICAgdmFyIGRlbGVnYXRlID0gaW1tZWRpYXRlUHJvdmlkZXIuZGVsZWdhdGU7CiAgICAgICAgcmV0dXJuICgoZGVsZWdhdGUgPT09IG51bGwgfHwgZGVsZWdhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGVnYXRlLnNldEltbWVkaWF0ZSkgfHwgc2V0SW1tZWRpYXRlKS5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChhcmdzKSkpOwogICAgICB9LAogICAgICBjbGVhckltbWVkaWF0ZTogZnVuY3Rpb24oaGFuZGxlMykgewogICAgICAgIHZhciBkZWxlZ2F0ZSA9IGltbWVkaWF0ZVByb3ZpZGVyLmRlbGVnYXRlOwogICAgICAgIHJldHVybiAoKGRlbGVnYXRlID09PSBudWxsIHx8IGRlbGVnYXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWxlZ2F0ZS5jbGVhckltbWVkaWF0ZSkgfHwgY2xlYXJJbW1lZGlhdGUpKGhhbmRsZTMpOwogICAgICB9LAogICAgICBkZWxlZ2F0ZTogdm9pZCAwCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL0FzYXBBY3Rpb24uanMKdmFyIEFzYXBBY3Rpb247CnZhciBpbml0X0FzYXBBY3Rpb24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvQXNhcEFjdGlvbi5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgaW5pdF9Bc3luY0FjdGlvbigpOwogICAgaW5pdF9pbW1lZGlhdGVQcm92aWRlcigpOwogICAgQXNhcEFjdGlvbiA9IChmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKEFzYXBBY3Rpb24yLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBBc2FwQWN0aW9uMihzY2hlZHVsZXIsIHdvcmspIHsKICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzY2hlZHVsZXIsIHdvcmspIHx8IHRoaXM7CiAgICAgICAgX3RoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOwogICAgICAgIF90aGlzLndvcmsgPSB3b3JrOwogICAgICAgIHJldHVybiBfdGhpczsKICAgICAgfQogICAgICBBc2FwQWN0aW9uMi5wcm90b3R5cGUucmVxdWVzdEFzeW5jSWQgPSBmdW5jdGlvbihzY2hlZHVsZXIsIGlkLCBkZWxheTIpIHsKICAgICAgICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHsKICAgICAgICAgIGRlbGF5MiA9IDA7CiAgICAgICAgfQogICAgICAgIGlmIChkZWxheTIgIT09IG51bGwgJiYgZGVsYXkyID4gMCkgewogICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUucmVxdWVzdEFzeW5jSWQuY2FsbCh0aGlzLCBzY2hlZHVsZXIsIGlkLCBkZWxheTIpOwogICAgICAgIH0KICAgICAgICBzY2hlZHVsZXIuYWN0aW9ucy5wdXNoKHRoaXMpOwogICAgICAgIHJldHVybiBzY2hlZHVsZXIuX3NjaGVkdWxlZCB8fCAoc2NoZWR1bGVyLl9zY2hlZHVsZWQgPSBpbW1lZGlhdGVQcm92aWRlci5zZXRJbW1lZGlhdGUoc2NoZWR1bGVyLmZsdXNoLmJpbmQoc2NoZWR1bGVyLCB2b2lkIDApKSk7CiAgICAgIH07CiAgICAgIEFzYXBBY3Rpb24yLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZCA9IGZ1bmN0aW9uKHNjaGVkdWxlciwgaWQsIGRlbGF5MikgewogICAgICAgIHZhciBfYTEyOwogICAgICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgICAgICAgZGVsYXkyID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKGRlbGF5MiAhPSBudWxsID8gZGVsYXkyID4gMCA6IHRoaXMuZGVsYXkgPiAwKSB7CiAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZC5jYWxsKHRoaXMsIHNjaGVkdWxlciwgaWQsIGRlbGF5Mik7CiAgICAgICAgfQogICAgICAgIHZhciBhY3Rpb25zID0gc2NoZWR1bGVyLmFjdGlvbnM7CiAgICAgICAgaWYgKGlkICE9IG51bGwgJiYgKChfYTEyID0gYWN0aW9uc1thY3Rpb25zLmxlbmd0aCAtIDFdKSA9PT0gbnVsbCB8fCBfYTEyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTEyLmlkKSAhPT0gaWQpIHsKICAgICAgICAgIGltbWVkaWF0ZVByb3ZpZGVyLmNsZWFySW1tZWRpYXRlKGlkKTsKICAgICAgICAgIGlmIChzY2hlZHVsZXIuX3NjaGVkdWxlZCA9PT0gaWQpIHsKICAgICAgICAgICAgc2NoZWR1bGVyLl9zY2hlZHVsZWQgPSB2b2lkIDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH07CiAgICAgIHJldHVybiBBc2FwQWN0aW9uMjsKICAgIH0pKEFzeW5jQWN0aW9uKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL1NjaGVkdWxlci5qcwp2YXIgU2NoZWR1bGVyOwp2YXIgaW5pdF9TY2hlZHVsZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9TY2hlZHVsZXIuanMiKCkgewogICAgaW5pdF9kYXRlVGltZXN0YW1wUHJvdmlkZXIoKTsKICAgIFNjaGVkdWxlciA9IChmdW5jdGlvbigpIHsKICAgICAgZnVuY3Rpb24gU2NoZWR1bGVyMihzY2hlZHVsZXJBY3Rpb25DdG9yLCBub3cyKSB7CiAgICAgICAgaWYgKG5vdzIgPT09IHZvaWQgMCkgewogICAgICAgICAgbm93MiA9IFNjaGVkdWxlcjIubm93OwogICAgICAgIH0KICAgICAgICB0aGlzLnNjaGVkdWxlckFjdGlvbkN0b3IgPSBzY2hlZHVsZXJBY3Rpb25DdG9yOwogICAgICAgIHRoaXMubm93ID0gbm93MjsKICAgICAgfQogICAgICBTY2hlZHVsZXIyLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uKHdvcmssIGRlbGF5Miwgc3RhdGUxMCkgewogICAgICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgICAgICAgZGVsYXkyID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLnNjaGVkdWxlckFjdGlvbkN0b3IodGhpcywgd29yaykuc2NoZWR1bGUoc3RhdGUxMCwgZGVsYXkyKTsKICAgICAgfTsKICAgICAgU2NoZWR1bGVyMi5ub3cgPSBkYXRlVGltZXN0YW1wUHJvdmlkZXIubm93OwogICAgICByZXR1cm4gU2NoZWR1bGVyMjsKICAgIH0pKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvQXN5bmNTY2hlZHVsZXIuanMKdmFyIEFzeW5jU2NoZWR1bGVyOwp2YXIgaW5pdF9Bc3luY1NjaGVkdWxlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9Bc3luY1NjaGVkdWxlci5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgaW5pdF9TY2hlZHVsZXIoKTsKICAgIEFzeW5jU2NoZWR1bGVyID0gKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoQXN5bmNTY2hlZHVsZXIyLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBBc3luY1NjaGVkdWxlcjIoU2NoZWR1bGVyQWN0aW9uLCBub3cyKSB7CiAgICAgICAgaWYgKG5vdzIgPT09IHZvaWQgMCkgewogICAgICAgICAgbm93MiA9IFNjaGVkdWxlci5ub3c7CiAgICAgICAgfQogICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIFNjaGVkdWxlckFjdGlvbiwgbm93MikgfHwgdGhpczsKICAgICAgICBfdGhpcy5hY3Rpb25zID0gW107CiAgICAgICAgX3RoaXMuX2FjdGl2ZSA9IGZhbHNlOwogICAgICAgIHJldHVybiBfdGhpczsKICAgICAgfQogICAgICBBc3luY1NjaGVkdWxlcjIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oYWN0aW9uKSB7CiAgICAgICAgdmFyIGFjdGlvbnMgPSB0aGlzLmFjdGlvbnM7CiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSkgewogICAgICAgICAgYWN0aW9ucy5wdXNoKGFjdGlvbik7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBlcnJvcjsKICAgICAgICB0aGlzLl9hY3RpdmUgPSB0cnVlOwogICAgICAgIGRvIHsKICAgICAgICAgIGlmIChlcnJvciA9IGFjdGlvbi5leGVjdXRlKGFjdGlvbi5zdGF0ZSwgYWN0aW9uLmRlbGF5KSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlIChhY3Rpb24gPSBhY3Rpb25zLnNoaWZ0KCkpOwogICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlOwogICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgd2hpbGUgKGFjdGlvbiA9IGFjdGlvbnMuc2hpZnQoKSkgewogICAgICAgICAgICBhY3Rpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIEFzeW5jU2NoZWR1bGVyMjsKICAgIH0pKFNjaGVkdWxlcik7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvQXNhcFNjaGVkdWxlci5qcwp2YXIgQXNhcFNjaGVkdWxlcjsKdmFyIGluaXRfQXNhcFNjaGVkdWxlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9Bc2FwU2NoZWR1bGVyLmpzIigpIHsKICAgIGluaXRfdHNsaWJfZXM2KCk7CiAgICBpbml0X0FzeW5jU2NoZWR1bGVyKCk7CiAgICBBc2FwU2NoZWR1bGVyID0gKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoQXNhcFNjaGVkdWxlcjIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIEFzYXBTY2hlZHVsZXIyKCkgewogICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgfQogICAgICBBc2FwU2NoZWR1bGVyMi5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbihhY3Rpb24pIHsKICAgICAgICB0aGlzLl9hY3RpdmUgPSB0cnVlOwogICAgICAgIHZhciBmbHVzaElkID0gdGhpcy5fc2NoZWR1bGVkOwogICAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IHZvaWQgMDsKICAgICAgICB2YXIgYWN0aW9ucyA9IHRoaXMuYWN0aW9uczsKICAgICAgICB2YXIgZXJyb3I7CiAgICAgICAgYWN0aW9uID0gYWN0aW9uIHx8IGFjdGlvbnMuc2hpZnQoKTsKICAgICAgICBkbyB7CiAgICAgICAgICBpZiAoZXJyb3IgPSBhY3Rpb24uZXhlY3V0ZShhY3Rpb24uc3RhdGUsIGFjdGlvbi5kZWxheSkpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAoKGFjdGlvbiA9IGFjdGlvbnNbMF0pICYmIGFjdGlvbi5pZCA9PT0gZmx1c2hJZCAmJiBhY3Rpb25zLnNoaWZ0KCkpOwogICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlOwogICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgd2hpbGUgKChhY3Rpb24gPSBhY3Rpb25zWzBdKSAmJiBhY3Rpb24uaWQgPT09IGZsdXNoSWQgJiYgYWN0aW9ucy5zaGlmdCgpKSB7CiAgICAgICAgICAgIGFjdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgfQogICAgICB9OwogICAgICByZXR1cm4gQXNhcFNjaGVkdWxlcjI7CiAgICB9KShBc3luY1NjaGVkdWxlcik7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvYXNhcC5qcwp2YXIgYXNhcFNjaGVkdWxlciwgYXNhcDsKdmFyIGluaXRfYXNhcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9hc2FwLmpzIigpIHsKICAgIGluaXRfQXNhcEFjdGlvbigpOwogICAgaW5pdF9Bc2FwU2NoZWR1bGVyKCk7CiAgICBhc2FwU2NoZWR1bGVyID0gbmV3IEFzYXBTY2hlZHVsZXIoQXNhcEFjdGlvbik7CiAgICBhc2FwID0gYXNhcFNjaGVkdWxlcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9hc3luYy5qcwp2YXIgYXN5bmNTY2hlZHVsZXIsIGFzeW5jOwp2YXIgaW5pdF9hc3luYyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9hc3luYy5qcyIoKSB7CiAgICBpbml0X0FzeW5jQWN0aW9uKCk7CiAgICBpbml0X0FzeW5jU2NoZWR1bGVyKCk7CiAgICBhc3luY1NjaGVkdWxlciA9IG5ldyBBc3luY1NjaGVkdWxlcihBc3luY0FjdGlvbik7CiAgICBhc3luYyA9IGFzeW5jU2NoZWR1bGVyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL1F1ZXVlQWN0aW9uLmpzCnZhciBRdWV1ZUFjdGlvbjsKdmFyIGluaXRfUXVldWVBY3Rpb24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvUXVldWVBY3Rpb24uanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGluaXRfQXN5bmNBY3Rpb24oKTsKICAgIFF1ZXVlQWN0aW9uID0gKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICBfX2V4dGVuZHMoUXVldWVBY3Rpb24yLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBRdWV1ZUFjdGlvbjIoc2NoZWR1bGVyLCB3b3JrKSB7CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc2NoZWR1bGVyLCB3b3JrKSB8fCB0aGlzOwogICAgICAgIF90aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKICAgICAgICBfdGhpcy53b3JrID0gd29yazsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgUXVldWVBY3Rpb24yLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uKHN0YXRlMTAsIGRlbGF5MikgewogICAgICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgICAgICAgZGVsYXkyID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKGRlbGF5MiA+IDApIHsKICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnNjaGVkdWxlLmNhbGwodGhpcywgc3RhdGUxMCwgZGVsYXkyKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5kZWxheSA9IGRlbGF5MjsKICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGUxMDsKICAgICAgICB0aGlzLnNjaGVkdWxlci5mbHVzaCh0aGlzKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfTsKICAgICAgUXVldWVBY3Rpb24yLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24oc3RhdGUxMCwgZGVsYXkyKSB7CiAgICAgICAgcmV0dXJuIGRlbGF5MiA+IDAgfHwgdGhpcy5jbG9zZWQgPyBfc3VwZXIucHJvdG90eXBlLmV4ZWN1dGUuY2FsbCh0aGlzLCBzdGF0ZTEwLCBkZWxheTIpIDogdGhpcy5fZXhlY3V0ZShzdGF0ZTEwLCBkZWxheTIpOwogICAgICB9OwogICAgICBRdWV1ZUFjdGlvbjIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkID0gZnVuY3Rpb24oc2NoZWR1bGVyLCBpZCwgZGVsYXkyKSB7CiAgICAgICAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBkZWxheTIgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoZGVsYXkyICE9IG51bGwgJiYgZGVsYXkyID4gMCB8fCBkZWxheTIgPT0gbnVsbCAmJiB0aGlzLmRlbGF5ID4gMCkgewogICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUucmVxdWVzdEFzeW5jSWQuY2FsbCh0aGlzLCBzY2hlZHVsZXIsIGlkLCBkZWxheTIpOwogICAgICAgIH0KICAgICAgICBzY2hlZHVsZXIuZmx1c2godGhpcyk7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH07CiAgICAgIHJldHVybiBRdWV1ZUFjdGlvbjI7CiAgICB9KShBc3luY0FjdGlvbik7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvUXVldWVTY2hlZHVsZXIuanMKdmFyIFF1ZXVlU2NoZWR1bGVyOwp2YXIgaW5pdF9RdWV1ZVNjaGVkdWxlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9RdWV1ZVNjaGVkdWxlci5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgaW5pdF9Bc3luY1NjaGVkdWxlcigpOwogICAgUXVldWVTY2hlZHVsZXIgPSAoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhRdWV1ZVNjaGVkdWxlcjIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIFF1ZXVlU2NoZWR1bGVyMigpIHsKICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgIH0KICAgICAgcmV0dXJuIFF1ZXVlU2NoZWR1bGVyMjsKICAgIH0pKEFzeW5jU2NoZWR1bGVyKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9xdWV1ZS5qcwp2YXIgcXVldWVTY2hlZHVsZXIsIHF1ZXVlOwp2YXIgaW5pdF9xdWV1ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9xdWV1ZS5qcyIoKSB7CiAgICBpbml0X1F1ZXVlQWN0aW9uKCk7CiAgICBpbml0X1F1ZXVlU2NoZWR1bGVyKCk7CiAgICBxdWV1ZVNjaGVkdWxlciA9IG5ldyBRdWV1ZVNjaGVkdWxlcihRdWV1ZUFjdGlvbik7CiAgICBxdWV1ZSA9IHF1ZXVlU2NoZWR1bGVyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL0FuaW1hdGlvbkZyYW1lQWN0aW9uLmpzCnZhciBBbmltYXRpb25GcmFtZUFjdGlvbjsKdmFyIGluaXRfQW5pbWF0aW9uRnJhbWVBY3Rpb24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvQW5pbWF0aW9uRnJhbWVBY3Rpb24uanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGluaXRfQXN5bmNBY3Rpb24oKTsKICAgIGluaXRfYW5pbWF0aW9uRnJhbWVQcm92aWRlcigpOwogICAgQW5pbWF0aW9uRnJhbWVBY3Rpb24gPSAoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhBbmltYXRpb25GcmFtZUFjdGlvbjIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIEFuaW1hdGlvbkZyYW1lQWN0aW9uMihzY2hlZHVsZXIsIHdvcmspIHsKICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzY2hlZHVsZXIsIHdvcmspIHx8IHRoaXM7CiAgICAgICAgX3RoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOwogICAgICAgIF90aGlzLndvcmsgPSB3b3JrOwogICAgICAgIHJldHVybiBfdGhpczsKICAgICAgfQogICAgICBBbmltYXRpb25GcmFtZUFjdGlvbjIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkID0gZnVuY3Rpb24oc2NoZWR1bGVyLCBpZCwgZGVsYXkyKSB7CiAgICAgICAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBkZWxheTIgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoZGVsYXkyICE9PSBudWxsICYmIGRlbGF5MiA+IDApIHsKICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkLmNhbGwodGhpcywgc2NoZWR1bGVyLCBpZCwgZGVsYXkyKTsKICAgICAgICB9CiAgICAgICAgc2NoZWR1bGVyLmFjdGlvbnMucHVzaCh0aGlzKTsKICAgICAgICByZXR1cm4gc2NoZWR1bGVyLl9zY2hlZHVsZWQgfHwgKHNjaGVkdWxlci5fc2NoZWR1bGVkID0gYW5pbWF0aW9uRnJhbWVQcm92aWRlci5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gc2NoZWR1bGVyLmZsdXNoKHZvaWQgMCk7CiAgICAgICAgfSkpOwogICAgICB9OwogICAgICBBbmltYXRpb25GcmFtZUFjdGlvbjIucHJvdG90eXBlLnJlY3ljbGVBc3luY0lkID0gZnVuY3Rpb24oc2NoZWR1bGVyLCBpZCwgZGVsYXkyKSB7CiAgICAgICAgdmFyIF9hMTI7CiAgICAgICAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBkZWxheTIgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoZGVsYXkyICE9IG51bGwgPyBkZWxheTIgPiAwIDogdGhpcy5kZWxheSA+IDApIHsKICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnJlY3ljbGVBc3luY0lkLmNhbGwodGhpcywgc2NoZWR1bGVyLCBpZCwgZGVsYXkyKTsKICAgICAgICB9CiAgICAgICAgdmFyIGFjdGlvbnMgPSBzY2hlZHVsZXIuYWN0aW9uczsKICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiBpZCA9PT0gc2NoZWR1bGVyLl9zY2hlZHVsZWQgJiYgKChfYTEyID0gYWN0aW9uc1thY3Rpb25zLmxlbmd0aCAtIDFdKSA9PT0gbnVsbCB8fCBfYTEyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTEyLmlkKSAhPT0gaWQpIHsKICAgICAgICAgIGFuaW1hdGlvbkZyYW1lUHJvdmlkZXIuY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpOwogICAgICAgICAgc2NoZWR1bGVyLl9zY2hlZHVsZWQgPSB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH07CiAgICAgIHJldHVybiBBbmltYXRpb25GcmFtZUFjdGlvbjI7CiAgICB9KShBc3luY0FjdGlvbik7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvQW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIuanMKdmFyIEFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyOwp2YXIgaW5pdF9BbmltYXRpb25GcmFtZVNjaGVkdWxlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9BbmltYXRpb25GcmFtZVNjaGVkdWxlci5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgaW5pdF9Bc3luY1NjaGVkdWxlcigpOwogICAgQW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIgPSAoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhBbmltYXRpb25GcmFtZVNjaGVkdWxlcjIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIEFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyMigpIHsKICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgIH0KICAgICAgQW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKGFjdGlvbikgewogICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7CiAgICAgICAgdmFyIGZsdXNoSWQ7CiAgICAgICAgaWYgKGFjdGlvbikgewogICAgICAgICAgZmx1c2hJZCA9IGFjdGlvbi5pZDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZmx1c2hJZCA9IHRoaXMuX3NjaGVkdWxlZDsKICAgICAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgdmFyIGFjdGlvbnMgPSB0aGlzLmFjdGlvbnM7CiAgICAgICAgdmFyIGVycm9yOwogICAgICAgIGFjdGlvbiA9IGFjdGlvbiB8fCBhY3Rpb25zLnNoaWZ0KCk7CiAgICAgICAgZG8gewogICAgICAgICAgaWYgKGVycm9yID0gYWN0aW9uLmV4ZWN1dGUoYWN0aW9uLnN0YXRlLCBhY3Rpb24uZGVsYXkpKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKChhY3Rpb24gPSBhY3Rpb25zWzBdKSAmJiBhY3Rpb24uaWQgPT09IGZsdXNoSWQgJiYgYWN0aW9ucy5zaGlmdCgpKTsKICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTsKICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgIHdoaWxlICgoYWN0aW9uID0gYWN0aW9uc1swXSkgJiYgYWN0aW9uLmlkID09PSBmbHVzaElkICYmIGFjdGlvbnMuc2hpZnQoKSkgewogICAgICAgICAgICBhY3Rpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIEFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyMjsKICAgIH0pKEFzeW5jU2NoZWR1bGVyKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9hbmltYXRpb25GcmFtZS5qcwp2YXIgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIsIGFuaW1hdGlvbkZyYW1lOwp2YXIgaW5pdF9hbmltYXRpb25GcmFtZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9hbmltYXRpb25GcmFtZS5qcyIoKSB7CiAgICBpbml0X0FuaW1hdGlvbkZyYW1lQWN0aW9uKCk7CiAgICBpbml0X0FuaW1hdGlvbkZyYW1lU2NoZWR1bGVyKCk7CiAgICBhbmltYXRpb25GcmFtZVNjaGVkdWxlciA9IG5ldyBBbmltYXRpb25GcmFtZVNjaGVkdWxlcihBbmltYXRpb25GcmFtZUFjdGlvbik7CiAgICBhbmltYXRpb25GcmFtZSA9IGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL1ZpcnR1YWxUaW1lU2NoZWR1bGVyLmpzCnZhciBWaXJ0dWFsVGltZVNjaGVkdWxlciwgVmlydHVhbEFjdGlvbjsKdmFyIGluaXRfVmlydHVhbFRpbWVTY2hlZHVsZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvVmlydHVhbFRpbWVTY2hlZHVsZXIuanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGluaXRfQXN5bmNBY3Rpb24oKTsKICAgIGluaXRfU3Vic2NyaXB0aW9uKCk7CiAgICBpbml0X0FzeW5jU2NoZWR1bGVyKCk7CiAgICBWaXJ0dWFsVGltZVNjaGVkdWxlciA9IChmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKFZpcnR1YWxUaW1lU2NoZWR1bGVyMiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gVmlydHVhbFRpbWVTY2hlZHVsZXIyKHNjaGVkdWxlckFjdGlvbkN0b3IsIG1heEZyYW1lcykgewogICAgICAgIGlmIChzY2hlZHVsZXJBY3Rpb25DdG9yID09PSB2b2lkIDApIHsKICAgICAgICAgIHNjaGVkdWxlckFjdGlvbkN0b3IgPSBWaXJ0dWFsQWN0aW9uOwogICAgICAgIH0KICAgICAgICBpZiAobWF4RnJhbWVzID09PSB2b2lkIDApIHsKICAgICAgICAgIG1heEZyYW1lcyA9IEluZmluaXR5OwogICAgICAgIH0KICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzY2hlZHVsZXJBY3Rpb25DdG9yLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5mcmFtZTsKICAgICAgICB9KSB8fCB0aGlzOwogICAgICAgIF90aGlzLm1heEZyYW1lcyA9IG1heEZyYW1lczsKICAgICAgICBfdGhpcy5mcmFtZSA9IDA7CiAgICAgICAgX3RoaXMuaW5kZXggPSAtMTsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgVmlydHVhbFRpbWVTY2hlZHVsZXIyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBfYTEyID0gdGhpcywgYWN0aW9ucyA9IF9hMTIuYWN0aW9ucywgbWF4RnJhbWVzID0gX2ExMi5tYXhGcmFtZXM7CiAgICAgICAgdmFyIGVycm9yOwogICAgICAgIHZhciBhY3Rpb247CiAgICAgICAgd2hpbGUgKChhY3Rpb24gPSBhY3Rpb25zWzBdKSAmJiBhY3Rpb24uZGVsYXkgPD0gbWF4RnJhbWVzKSB7CiAgICAgICAgICBhY3Rpb25zLnNoaWZ0KCk7CiAgICAgICAgICB0aGlzLmZyYW1lID0gYWN0aW9uLmRlbGF5OwogICAgICAgICAgaWYgKGVycm9yID0gYWN0aW9uLmV4ZWN1dGUoYWN0aW9uLnN0YXRlLCBhY3Rpb24uZGVsYXkpKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgIHdoaWxlIChhY3Rpb24gPSBhY3Rpb25zLnNoaWZ0KCkpIHsKICAgICAgICAgICAgYWN0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9CiAgICAgIH07CiAgICAgIFZpcnR1YWxUaW1lU2NoZWR1bGVyMi5mcmFtZVRpbWVGYWN0b3IgPSAxMDsKICAgICAgcmV0dXJuIFZpcnR1YWxUaW1lU2NoZWR1bGVyMjsKICAgIH0pKEFzeW5jU2NoZWR1bGVyKTsKICAgIFZpcnR1YWxBY3Rpb24gPSAoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhWaXJ0dWFsQWN0aW9uMiwgX3N1cGVyKTsKICAgICAgZnVuY3Rpb24gVmlydHVhbEFjdGlvbjIoc2NoZWR1bGVyLCB3b3JrLCBpbmRleDIpIHsKICAgICAgICBpZiAoaW5kZXgyID09PSB2b2lkIDApIHsKICAgICAgICAgIGluZGV4MiA9IHNjaGVkdWxlci5pbmRleCArPSAxOwogICAgICAgIH0KICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzY2hlZHVsZXIsIHdvcmspIHx8IHRoaXM7CiAgICAgICAgX3RoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOwogICAgICAgIF90aGlzLndvcmsgPSB3b3JrOwogICAgICAgIF90aGlzLmluZGV4ID0gaW5kZXgyOwogICAgICAgIF90aGlzLmFjdGl2ZSA9IHRydWU7CiAgICAgICAgX3RoaXMuaW5kZXggPSBzY2hlZHVsZXIuaW5kZXggPSBpbmRleDI7CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIFZpcnR1YWxBY3Rpb24yLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uKHN0YXRlMTAsIGRlbGF5MikgewogICAgICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgICAgICAgZGVsYXkyID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShkZWxheTIpKSB7CiAgICAgICAgICBpZiAoIXRoaXMuaWQpIHsKICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuc2NoZWR1bGUuY2FsbCh0aGlzLCBzdGF0ZTEwLCBkZWxheTIpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTsKICAgICAgICAgIHZhciBhY3Rpb24gPSBuZXcgVmlydHVhbEFjdGlvbjIodGhpcy5zY2hlZHVsZXIsIHRoaXMud29yayk7CiAgICAgICAgICB0aGlzLmFkZChhY3Rpb24pOwogICAgICAgICAgcmV0dXJuIGFjdGlvbi5zY2hlZHVsZShzdGF0ZTEwLCBkZWxheTIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgIH0KICAgICAgfTsKICAgICAgVmlydHVhbEFjdGlvbjIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkID0gZnVuY3Rpb24oc2NoZWR1bGVyLCBpZCwgZGVsYXkyKSB7CiAgICAgICAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBkZWxheTIgPSAwOwogICAgICAgIH0KICAgICAgICB0aGlzLmRlbGF5ID0gc2NoZWR1bGVyLmZyYW1lICsgZGVsYXkyOwogICAgICAgIHZhciBhY3Rpb25zID0gc2NoZWR1bGVyLmFjdGlvbnM7CiAgICAgICAgYWN0aW9ucy5wdXNoKHRoaXMpOwogICAgICAgIGFjdGlvbnMuc29ydChWaXJ0dWFsQWN0aW9uMi5zb3J0QWN0aW9ucyk7CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH07CiAgICAgIFZpcnR1YWxBY3Rpb24yLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZCA9IGZ1bmN0aW9uKHNjaGVkdWxlciwgaWQsIGRlbGF5MikgewogICAgICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgICAgICAgZGVsYXkyID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgfTsKICAgICAgVmlydHVhbEFjdGlvbjIucHJvdG90eXBlLl9leGVjdXRlID0gZnVuY3Rpb24oc3RhdGUxMCwgZGVsYXkyKSB7CiAgICAgICAgaWYgKHRoaXMuYWN0aXZlID09PSB0cnVlKSB7CiAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5fZXhlY3V0ZS5jYWxsKHRoaXMsIHN0YXRlMTAsIGRlbGF5Mik7CiAgICAgICAgfQogICAgICB9OwogICAgICBWaXJ0dWFsQWN0aW9uMi5zb3J0QWN0aW9ucyA9IGZ1bmN0aW9uKGE1LCBiNikgewogICAgICAgIGlmIChhNS5kZWxheSA9PT0gYjYuZGVsYXkpIHsKICAgICAgICAgIGlmIChhNS5pbmRleCA9PT0gYjYuaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9IGVsc2UgaWYgKGE1LmluZGV4ID4gYjYuaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChhNS5kZWxheSA+IGI2LmRlbGF5KSB7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIFZpcnR1YWxBY3Rpb24yOwogICAgfSkoQXN5bmNBY3Rpb24pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9lbXB0eS5qcwpmdW5jdGlvbiBlbXB0eShzY2hlZHVsZXIpIHsKICByZXR1cm4gc2NoZWR1bGVyID8gZW1wdHlTY2hlZHVsZWQoc2NoZWR1bGVyKSA6IEVNUFRZOwp9CmZ1bmN0aW9uIGVtcHR5U2NoZWR1bGVkKHNjaGVkdWxlcikgewogIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgfSk7CiAgfSk7Cn0KdmFyIEVNUFRZOwp2YXIgaW5pdF9lbXB0eSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZW1wdHkuanMiKCkgewogICAgaW5pdF9PYnNlcnZhYmxlKCk7CiAgICBFTVBUWSA9IG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgICAgcmV0dXJuIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc1NjaGVkdWxlci5qcwpmdW5jdGlvbiBpc1NjaGVkdWxlcih2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyICYmIGlzRnVuY3Rpb24odmFsdWUyLnNjaGVkdWxlKTsKfQp2YXIgaW5pdF9pc1NjaGVkdWxlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNTY2hlZHVsZXIuanMiKCkgewogICAgaW5pdF9pc0Z1bmN0aW9uKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2FyZ3MuanMKZnVuY3Rpb24gbGFzdChhcnIpIHsKICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTsKfQpmdW5jdGlvbiBwb3BSZXN1bHRTZWxlY3RvcihhcmdzKSB7CiAgcmV0dXJuIGlzRnVuY3Rpb24obGFzdChhcmdzKSkgPyBhcmdzLnBvcCgpIDogdm9pZCAwOwp9CmZ1bmN0aW9uIHBvcFNjaGVkdWxlcihhcmdzKSB7CiAgcmV0dXJuIGlzU2NoZWR1bGVyKGxhc3QoYXJncykpID8gYXJncy5wb3AoKSA6IHZvaWQgMDsKfQpmdW5jdGlvbiBwb3BOdW1iZXIoYXJncywgZGVmYXVsdFZhbHVlKSB7CiAgcmV0dXJuIHR5cGVvZiBsYXN0KGFyZ3MpID09PSAibnVtYmVyIiA/IGFyZ3MucG9wKCkgOiBkZWZhdWx0VmFsdWU7Cn0KdmFyIGluaXRfYXJncyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvYXJncy5qcyIoKSB7CiAgICBpbml0X2lzRnVuY3Rpb24oKTsKICAgIGluaXRfaXNTY2hlZHVsZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNBcnJheUxpa2UuanMKdmFyIGlzQXJyYXlMaWtlOwp2YXIgaW5pdF9pc0FycmF5TGlrZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNBcnJheUxpa2UuanMiKCkgewogICAgaXNBcnJheUxpa2UgPSAoZnVuY3Rpb24oeDQpIHsKICAgICAgcmV0dXJuIHg0ICYmIHR5cGVvZiB4NC5sZW5ndGggPT09ICJudW1iZXIiICYmIHR5cGVvZiB4NCAhPT0gImZ1bmN0aW9uIjsKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc1Byb21pc2UuanMKZnVuY3Rpb24gaXNQcm9taXNlKHZhbHVlMikgewogIHJldHVybiBpc0Z1bmN0aW9uKHZhbHVlMiA9PT0gbnVsbCB8fCB2YWx1ZTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZhbHVlMi50aGVuKTsKfQp2YXIgaW5pdF9pc1Byb21pc2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzUHJvbWlzZS5qcyIoKSB7CiAgICBpbml0X2lzRnVuY3Rpb24oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNJbnRlcm9wT2JzZXJ2YWJsZS5qcwpmdW5jdGlvbiBpc0ludGVyb3BPYnNlcnZhYmxlKGlucHV0KSB7CiAgcmV0dXJuIGlzRnVuY3Rpb24oaW5wdXRbb2JzZXJ2YWJsZV0pOwp9CnZhciBpbml0X2lzSW50ZXJvcE9ic2VydmFibGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzSW50ZXJvcE9ic2VydmFibGUuanMiKCkgewogICAgaW5pdF9vYnNlcnZhYmxlKCk7CiAgICBpbml0X2lzRnVuY3Rpb24oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNBc3luY0l0ZXJhYmxlLmpzCmZ1bmN0aW9uIGlzQXN5bmNJdGVyYWJsZShvYmopIHsKICByZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3IgJiYgaXNGdW5jdGlvbihvYmogPT09IG51bGwgfHwgb2JqID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvYmpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKTsKfQp2YXIgaW5pdF9pc0FzeW5jSXRlcmFibGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzQXN5bmNJdGVyYWJsZS5qcyIoKSB7CiAgICBpbml0X2lzRnVuY3Rpb24oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvdGhyb3dVbm9ic2VydmFibGVFcnJvci5qcwpmdW5jdGlvbiBjcmVhdGVJbnZhbGlkT2JzZXJ2YWJsZVR5cGVFcnJvcihpbnB1dCkgewogIHJldHVybiBuZXcgVHlwZUVycm9yKCJZb3UgcHJvdmlkZWQgIiArIChpbnB1dCAhPT0gbnVsbCAmJiB0eXBlb2YgaW5wdXQgPT09ICJvYmplY3QiID8gImFuIGludmFsaWQgb2JqZWN0IiA6ICInIiArIGlucHV0ICsgIiciKSArICIgd2hlcmUgYSBzdHJlYW0gd2FzIGV4cGVjdGVkLiBZb3UgY2FuIHByb3ZpZGUgYW4gT2JzZXJ2YWJsZSwgUHJvbWlzZSwgUmVhZGFibGVTdHJlYW0sIEFycmF5LCBBc3luY0l0ZXJhYmxlLCBvciBJdGVyYWJsZS4iKTsKfQp2YXIgaW5pdF90aHJvd1Vub2JzZXJ2YWJsZUVycm9yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC90aHJvd1Vub2JzZXJ2YWJsZUVycm9yLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3N5bWJvbC9pdGVyYXRvci5qcwpmdW5jdGlvbiBnZXRTeW1ib2xJdGVyYXRvcigpIHsKICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gImZ1bmN0aW9uIiB8fCAhU3ltYm9sLml0ZXJhdG9yKSB7CiAgICByZXR1cm4gIkBAaXRlcmF0b3IiOwogIH0KICByZXR1cm4gU3ltYm9sLml0ZXJhdG9yOwp9CnZhciBpdGVyYXRvcjsKdmFyIGluaXRfaXRlcmF0b3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zeW1ib2wvaXRlcmF0b3IuanMiKCkgewogICAgaXRlcmF0b3IgPSBnZXRTeW1ib2xJdGVyYXRvcigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc0l0ZXJhYmxlLmpzCmZ1bmN0aW9uIGlzSXRlcmFibGUoaW5wdXQpIHsKICByZXR1cm4gaXNGdW5jdGlvbihpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5wdXRbaXRlcmF0b3JdKTsKfQp2YXIgaW5pdF9pc0l0ZXJhYmxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc0l0ZXJhYmxlLmpzIigpIHsKICAgIGluaXRfaXRlcmF0b3IoKTsKICAgIGluaXRfaXNGdW5jdGlvbigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc1JlYWRhYmxlU3RyZWFtTGlrZS5qcwpmdW5jdGlvbiByZWFkYWJsZVN0cmVhbUxpa2VUb0FzeW5jR2VuZXJhdG9yKHJlYWRhYmxlU3RyZWFtKSB7CiAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiByZWFkYWJsZVN0cmVhbUxpa2VUb0FzeW5jR2VuZXJhdG9yXzEoKSB7CiAgICB2YXIgcmVhZGVyLCBfYTEyLCB2YWx1ZTIsIGRvbmU7CiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24oX2IpIHsKICAgICAgc3dpdGNoIChfYi5sYWJlbCkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIHJlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpOwogICAgICAgICAgX2IubGFiZWwgPSAxOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIF9iLnRyeXMucHVzaChbMSwgLCA5LCAxMF0pOwogICAgICAgICAgX2IubGFiZWwgPSAyOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIGlmIChmYWxzZSkgcmV0dXJuIFszLCA4XTsKICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdChyZWFkZXIucmVhZCgpKV07CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgX2ExMiA9IF9iLnNlbnQoKSwgdmFsdWUyID0gX2ExMi52YWx1ZSwgZG9uZSA9IF9hMTIuZG9uZTsKICAgICAgICAgIGlmICghZG9uZSkgcmV0dXJuIFszLCA1XTsKICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdCh2b2lkIDApXTsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICByZXR1cm4gWzIsIF9iLnNlbnQoKV07CiAgICAgICAgY2FzZSA1OgogICAgICAgICAgcmV0dXJuIFs0LCBfX2F3YWl0KHZhbHVlMildOwogICAgICAgIGNhc2UgNjoKICAgICAgICAgIHJldHVybiBbNCwgX2Iuc2VudCgpXTsKICAgICAgICBjYXNlIDc6CiAgICAgICAgICBfYi5zZW50KCk7CiAgICAgICAgICByZXR1cm4gWzMsIDJdOwogICAgICAgIGNhc2UgODoKICAgICAgICAgIHJldHVybiBbMywgMTBdOwogICAgICAgIGNhc2UgOToKICAgICAgICAgIHJlYWRlci5yZWxlYXNlTG9jaygpOwogICAgICAgICAgcmV0dXJuIFs3XTsKICAgICAgICBjYXNlIDEwOgogICAgICAgICAgcmV0dXJuIFsyXTsKICAgICAgfQogICAgfSk7CiAgfSk7Cn0KZnVuY3Rpb24gaXNSZWFkYWJsZVN0cmVhbUxpa2Uob2JqKSB7CiAgcmV0dXJuIGlzRnVuY3Rpb24ob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JqLmdldFJlYWRlcik7Cn0KdmFyIGluaXRfaXNSZWFkYWJsZVN0cmVhbUxpa2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzUmVhZGFibGVTdHJlYW1MaWtlLmpzIigpIHsKICAgIGluaXRfdHNsaWJfZXM2KCk7CiAgICBpbml0X2lzRnVuY3Rpb24oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvaW5uZXJGcm9tLmpzCmZ1bmN0aW9uIGlubmVyRnJvbShpbnB1dCkgewogIGlmIChpbnB1dCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHsKICAgIHJldHVybiBpbnB1dDsKICB9CiAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgIGlmIChpc0ludGVyb3BPYnNlcnZhYmxlKGlucHV0KSkgewogICAgICByZXR1cm4gZnJvbUludGVyb3BPYnNlcnZhYmxlKGlucHV0KTsKICAgIH0KICAgIGlmIChpc0FycmF5TGlrZShpbnB1dCkpIHsKICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UoaW5wdXQpOwogICAgfQogICAgaWYgKGlzUHJvbWlzZShpbnB1dCkpIHsKICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKGlucHV0KTsKICAgIH0KICAgIGlmIChpc0FzeW5jSXRlcmFibGUoaW5wdXQpKSB7CiAgICAgIHJldHVybiBmcm9tQXN5bmNJdGVyYWJsZShpbnB1dCk7CiAgICB9CiAgICBpZiAoaXNJdGVyYWJsZShpbnB1dCkpIHsKICAgICAgcmV0dXJuIGZyb21JdGVyYWJsZShpbnB1dCk7CiAgICB9CiAgICBpZiAoaXNSZWFkYWJsZVN0cmVhbUxpa2UoaW5wdXQpKSB7CiAgICAgIHJldHVybiBmcm9tUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0KTsKICAgIH0KICB9CiAgdGhyb3cgY3JlYXRlSW52YWxpZE9ic2VydmFibGVUeXBlRXJyb3IoaW5wdXQpOwp9CmZ1bmN0aW9uIGZyb21JbnRlcm9wT2JzZXJ2YWJsZShvYmopIHsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgdmFyIG9icyA9IG9ialtvYnNlcnZhYmxlXSgpOwogICAgaWYgKGlzRnVuY3Rpb24ob2JzLnN1YnNjcmliZSkpIHsKICAgICAgcmV0dXJuIG9icy5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICB9CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJQcm92aWRlZCBvYmplY3QgZG9lcyBub3QgY29ycmVjdGx5IGltcGxlbWVudCBTeW1ib2wub2JzZXJ2YWJsZSIpOwogIH0pOwp9CmZ1bmN0aW9uIGZyb21BcnJheUxpa2UoYXJyYXkpIHsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgYXJyYXkubGVuZ3RoICYmICFzdWJzY3JpYmVyLmNsb3NlZDsgaTExKyspIHsKICAgICAgc3Vic2NyaWJlci5uZXh0KGFycmF5W2kxMV0pOwogICAgfQogICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogIH0pOwp9CmZ1bmN0aW9uIGZyb21Qcm9taXNlKHByb21pc2UpIHsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlMikgewogICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlMik7CiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICB9CiAgICB9LCBmdW5jdGlvbihlcnIpIHsKICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsKICAgIH0pLnRoZW4obnVsbCwgcmVwb3J0VW5oYW5kbGVkRXJyb3IpOwogIH0pOwp9CmZ1bmN0aW9uIGZyb21JdGVyYWJsZShpdGVyYWJsZSkgewogIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICB2YXIgZV8xLCBfYTEyOwogICAgdHJ5IHsKICAgICAgZm9yICh2YXIgaXRlcmFibGVfMSA9IF9fdmFsdWVzKGl0ZXJhYmxlKSwgaXRlcmFibGVfMV8xID0gaXRlcmFibGVfMS5uZXh0KCk7ICFpdGVyYWJsZV8xXzEuZG9uZTsgaXRlcmFibGVfMV8xID0gaXRlcmFibGVfMS5uZXh0KCkpIHsKICAgICAgICB2YXIgdmFsdWUyID0gaXRlcmFibGVfMV8xLnZhbHVlOwogICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZTIpOwogICAgICAgIGlmIChzdWJzY3JpYmVyLmNsb3NlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgfSBjYXRjaCAoZV8xXzEpIHsKICAgICAgZV8xID0geyBlcnJvcjogZV8xXzEgfTsKICAgIH0gZmluYWxseSB7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKGl0ZXJhYmxlXzFfMSAmJiAhaXRlcmFibGVfMV8xLmRvbmUgJiYgKF9hMTIgPSBpdGVyYWJsZV8xLnJldHVybikpIF9hMTIuY2FsbChpdGVyYWJsZV8xKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7CiAgICAgIH0KICAgIH0KICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICB9KTsKfQpmdW5jdGlvbiBmcm9tQXN5bmNJdGVyYWJsZShhc3luY0l0ZXJhYmxlKSB7CiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgIHByb2Nlc3MyKGFzeW5jSXRlcmFibGUsIHN1YnNjcmliZXIpLmNhdGNoKGZ1bmN0aW9uKGVycikgewogICAgICByZXR1cm4gc3Vic2NyaWJlci5lcnJvcihlcnIpOwogICAgfSk7CiAgfSk7Cn0KZnVuY3Rpb24gZnJvbVJlYWRhYmxlU3RyZWFtTGlrZShyZWFkYWJsZVN0cmVhbSkgewogIHJldHVybiBmcm9tQXN5bmNJdGVyYWJsZShyZWFkYWJsZVN0cmVhbUxpa2VUb0FzeW5jR2VuZXJhdG9yKHJlYWRhYmxlU3RyZWFtKSk7Cn0KZnVuY3Rpb24gcHJvY2VzczIoYXN5bmNJdGVyYWJsZSwgc3Vic2NyaWJlcikgewogIHZhciBhc3luY0l0ZXJhYmxlXzEsIGFzeW5jSXRlcmFibGVfMV8xOwogIHZhciBlXzIsIF9hMTI7CiAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24oKSB7CiAgICB2YXIgdmFsdWUyLCBlXzJfMTsKICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfYikgewogICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgX2IudHJ5cy5wdXNoKFswLCA1LCA2LCAxMV0pOwogICAgICAgICAgYXN5bmNJdGVyYWJsZV8xID0gX19hc3luY1ZhbHVlcyhhc3luY0l0ZXJhYmxlKTsKICAgICAgICAgIF9iLmxhYmVsID0gMTsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICByZXR1cm4gWzQsIGFzeW5jSXRlcmFibGVfMS5uZXh0KCldOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIGlmICghKGFzeW5jSXRlcmFibGVfMV8xID0gX2Iuc2VudCgpLCAhYXN5bmNJdGVyYWJsZV8xXzEuZG9uZSkpIHJldHVybiBbMywgNF07CiAgICAgICAgICB2YWx1ZTIgPSBhc3luY0l0ZXJhYmxlXzFfMS52YWx1ZTsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZTIpOwogICAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgICAgIHJldHVybiBbMl07CiAgICAgICAgICB9CiAgICAgICAgICBfYi5sYWJlbCA9IDM7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgcmV0dXJuIFszLCAxXTsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICByZXR1cm4gWzMsIDExXTsKICAgICAgICBjYXNlIDU6CiAgICAgICAgICBlXzJfMSA9IF9iLnNlbnQoKTsKICAgICAgICAgIGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07CiAgICAgICAgICByZXR1cm4gWzMsIDExXTsKICAgICAgICBjYXNlIDY6CiAgICAgICAgICBfYi50cnlzLnB1c2goWzYsICwgOSwgMTBdKTsKICAgICAgICAgIGlmICghKGFzeW5jSXRlcmFibGVfMV8xICYmICFhc3luY0l0ZXJhYmxlXzFfMS5kb25lICYmIChfYTEyID0gYXN5bmNJdGVyYWJsZV8xLnJldHVybikpKSByZXR1cm4gWzMsIDhdOwogICAgICAgICAgcmV0dXJuIFs0LCBfYTEyLmNhbGwoYXN5bmNJdGVyYWJsZV8xKV07CiAgICAgICAgY2FzZSA3OgogICAgICAgICAgX2Iuc2VudCgpOwogICAgICAgICAgX2IubGFiZWwgPSA4OwogICAgICAgIGNhc2UgODoKICAgICAgICAgIHJldHVybiBbMywgMTBdOwogICAgICAgIGNhc2UgOToKICAgICAgICAgIGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsKICAgICAgICAgIHJldHVybiBbN107CiAgICAgICAgY2FzZSAxMDoKICAgICAgICAgIHJldHVybiBbN107CiAgICAgICAgY2FzZSAxMToKICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgIHJldHVybiBbMl07CiAgICAgIH0KICAgIH0pOwogIH0pOwp9CnZhciBpbml0X2lubmVyRnJvbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvaW5uZXJGcm9tLmpzIigpIHsKICAgIGluaXRfdHNsaWJfZXM2KCk7CiAgICBpbml0X2lzQXJyYXlMaWtlKCk7CiAgICBpbml0X2lzUHJvbWlzZSgpOwogICAgaW5pdF9PYnNlcnZhYmxlKCk7CiAgICBpbml0X2lzSW50ZXJvcE9ic2VydmFibGUoKTsKICAgIGluaXRfaXNBc3luY0l0ZXJhYmxlKCk7CiAgICBpbml0X3Rocm93VW5vYnNlcnZhYmxlRXJyb3IoKTsKICAgIGluaXRfaXNJdGVyYWJsZSgpOwogICAgaW5pdF9pc1JlYWRhYmxlU3RyZWFtTGlrZSgpOwogICAgaW5pdF9pc0Z1bmN0aW9uKCk7CiAgICBpbml0X3JlcG9ydFVuaGFuZGxlZEVycm9yKCk7CiAgICBpbml0X29ic2VydmFibGUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvZXhlY3V0ZVNjaGVkdWxlLmpzCmZ1bmN0aW9uIGV4ZWN1dGVTY2hlZHVsZShwYXJlbnRTdWJzY3JpcHRpb24sIHNjaGVkdWxlciwgd29yaywgZGVsYXkyLCByZXBlYXQzKSB7CiAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7CiAgICBkZWxheTIgPSAwOwogIH0KICBpZiAocmVwZWF0MyA9PT0gdm9pZCAwKSB7CiAgICByZXBlYXQzID0gZmFsc2U7CiAgfQogIHZhciBzY2hlZHVsZVN1YnNjcmlwdGlvbiA9IHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbigpIHsKICAgIHdvcmsoKTsKICAgIGlmIChyZXBlYXQzKSB7CiAgICAgIHBhcmVudFN1YnNjcmlwdGlvbi5hZGQodGhpcy5zY2hlZHVsZShudWxsLCBkZWxheTIpKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgIH0KICB9LCBkZWxheTIpOwogIHBhcmVudFN1YnNjcmlwdGlvbi5hZGQoc2NoZWR1bGVTdWJzY3JpcHRpb24pOwogIGlmICghcmVwZWF0MykgewogICAgcmV0dXJuIHNjaGVkdWxlU3Vic2NyaXB0aW9uOwogIH0KfQp2YXIgaW5pdF9leGVjdXRlU2NoZWR1bGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2V4ZWN1dGVTY2hlZHVsZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvb2JzZXJ2ZU9uLmpzCmZ1bmN0aW9uIG9ic2VydmVPbihzY2hlZHVsZXIsIGRlbGF5MikgewogIGlmIChkZWxheTIgPT09IHZvaWQgMCkgewogICAgZGVsYXkyID0gMDsKICB9CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgcmV0dXJuIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBzdWJzY3JpYmVyLm5leHQodmFsdWUyKTsKICAgICAgfSwgZGVsYXkyKTsKICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgfSwgZGVsYXkyKTsKICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICByZXR1cm4gZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsKICAgICAgfSwgZGVsYXkyKTsKICAgIH0pKTsKICB9KTsKfQp2YXIgaW5pdF9vYnNlcnZlT24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvb2JzZXJ2ZU9uLmpzIigpIHsKICAgIGluaXRfZXhlY3V0ZVNjaGVkdWxlKCk7CiAgICBpbml0X2xpZnQoKTsKICAgIGluaXRfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc3Vic2NyaWJlT24uanMKZnVuY3Rpb24gc3Vic2NyaWJlT24oc2NoZWR1bGVyLCBkZWxheTIpIHsKICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHsKICAgIGRlbGF5MiA9IDA7CiAgfQogIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgc3Vic2NyaWJlci5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgIH0sIGRlbGF5MikpOwogIH0pOwp9CnZhciBpbml0X3N1YnNjcmliZU9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3N1YnNjcmliZU9uLmpzIigpIHsKICAgIGluaXRfbGlmdCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlT2JzZXJ2YWJsZS5qcwpmdW5jdGlvbiBzY2hlZHVsZU9ic2VydmFibGUoaW5wdXQsIHNjaGVkdWxlcikgewogIHJldHVybiBpbm5lckZyb20oaW5wdXQpLnBpcGUoc3Vic2NyaWJlT24oc2NoZWR1bGVyKSwgb2JzZXJ2ZU9uKHNjaGVkdWxlcikpOwp9CnZhciBpbml0X3NjaGVkdWxlT2JzZXJ2YWJsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZU9ic2VydmFibGUuanMiKCkgewogICAgaW5pdF9pbm5lckZyb20oKTsKICAgIGluaXRfb2JzZXJ2ZU9uKCk7CiAgICBpbml0X3N1YnNjcmliZU9uKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVQcm9taXNlLmpzCmZ1bmN0aW9uIHNjaGVkdWxlUHJvbWlzZShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgcmV0dXJuIGlubmVyRnJvbShpbnB1dCkucGlwZShzdWJzY3JpYmVPbihzY2hlZHVsZXIpLCBvYnNlcnZlT24oc2NoZWR1bGVyKSk7Cn0KdmFyIGluaXRfc2NoZWR1bGVQcm9taXNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlUHJvbWlzZS5qcyIoKSB7CiAgICBpbml0X2lubmVyRnJvbSgpOwogICAgaW5pdF9vYnNlcnZlT24oKTsKICAgIGluaXRfc3Vic2NyaWJlT24oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZUFycmF5LmpzCmZ1bmN0aW9uIHNjaGVkdWxlQXJyYXkoaW5wdXQsIHNjaGVkdWxlcikgewogIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICB2YXIgaTExID0gMDsKICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24oKSB7CiAgICAgIGlmIChpMTEgPT09IGlucHV0Lmxlbmd0aCkgewogICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdWJzY3JpYmVyLm5leHQoaW5wdXRbaTExKytdKTsKICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgICB0aGlzLnNjaGVkdWxlKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9KTsKfQp2YXIgaW5pdF9zY2hlZHVsZUFycmF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlQXJyYXkuanMiKCkgewogICAgaW5pdF9PYnNlcnZhYmxlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVJdGVyYWJsZS5qcwpmdW5jdGlvbiBzY2hlZHVsZUl0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgdmFyIGl0ZXJhdG9yMjsKICAgIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkgewogICAgICBpdGVyYXRvcjIgPSBpbnB1dFtpdGVyYXRvcl0oKTsKICAgICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIF9hMTI7CiAgICAgICAgdmFyIHZhbHVlMjsKICAgICAgICB2YXIgZG9uZTsKICAgICAgICB0cnkgewogICAgICAgICAgX2ExMiA9IGl0ZXJhdG9yMi5uZXh0KCksIHZhbHVlMiA9IF9hMTIudmFsdWUsIGRvbmUgPSBfYTEyLmRvbmU7CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChkb25lKSB7CiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZTIpOwogICAgICAgIH0KICAgICAgfSwgMCwgdHJ1ZSk7CiAgICB9KTsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oaXRlcmF0b3IyID09PSBudWxsIHx8IGl0ZXJhdG9yMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogaXRlcmF0b3IyLnJldHVybikgJiYgaXRlcmF0b3IyLnJldHVybigpOwogICAgfTsKICB9KTsKfQp2YXIgaW5pdF9zY2hlZHVsZUl0ZXJhYmxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlSXRlcmFibGUuanMiKCkgewogICAgaW5pdF9PYnNlcnZhYmxlKCk7CiAgICBpbml0X2l0ZXJhdG9yKCk7CiAgICBpbml0X2lzRnVuY3Rpb24oKTsKICAgIGluaXRfZXhlY3V0ZVNjaGVkdWxlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVBc3luY0l0ZXJhYmxlLmpzCmZ1bmN0aW9uIHNjaGVkdWxlQXN5bmNJdGVyYWJsZShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgaWYgKCFpbnB1dCkgewogICAgdGhyb3cgbmV3IEVycm9yKCJJdGVyYWJsZSBjYW5ub3QgYmUgbnVsbCIpOwogIH0KICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikgewogICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgIHZhciBpdGVyYXRvcjIgPSBpbnB1dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTsKICAgICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgICAgaXRlcmF0b3IyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7CiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChyZXN1bHQudmFsdWUpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9LCAwLCB0cnVlKTsKICAgIH0pOwogIH0pOwp9CnZhciBpbml0X3NjaGVkdWxlQXN5bmNJdGVyYWJsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZUFzeW5jSXRlcmFibGUuanMiKCkgewogICAgaW5pdF9PYnNlcnZhYmxlKCk7CiAgICBpbml0X2V4ZWN1dGVTY2hlZHVsZSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlUmVhZGFibGVTdHJlYW1MaWtlLmpzCmZ1bmN0aW9uIHNjaGVkdWxlUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0LCBzY2hlZHVsZXIpIHsKICByZXR1cm4gc2NoZWR1bGVBc3luY0l0ZXJhYmxlKHJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3IoaW5wdXQpLCBzY2hlZHVsZXIpOwp9CnZhciBpbml0X3NjaGVkdWxlUmVhZGFibGVTdHJlYW1MaWtlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlUmVhZGFibGVTdHJlYW1MaWtlLmpzIigpIHsKICAgIGluaXRfc2NoZWR1bGVBc3luY0l0ZXJhYmxlKCk7CiAgICBpbml0X2lzUmVhZGFibGVTdHJlYW1MaWtlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVkLmpzCmZ1bmN0aW9uIHNjaGVkdWxlZChpbnB1dCwgc2NoZWR1bGVyKSB7CiAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgIGlmIChpc0ludGVyb3BPYnNlcnZhYmxlKGlucHV0KSkgewogICAgICByZXR1cm4gc2NoZWR1bGVPYnNlcnZhYmxlKGlucHV0LCBzY2hlZHVsZXIpOwogICAgfQogICAgaWYgKGlzQXJyYXlMaWtlKGlucHV0KSkgewogICAgICByZXR1cm4gc2NoZWR1bGVBcnJheShpbnB1dCwgc2NoZWR1bGVyKTsKICAgIH0KICAgIGlmIChpc1Byb21pc2UoaW5wdXQpKSB7CiAgICAgIHJldHVybiBzY2hlZHVsZVByb21pc2UoaW5wdXQsIHNjaGVkdWxlcik7CiAgICB9CiAgICBpZiAoaXNBc3luY0l0ZXJhYmxlKGlucHV0KSkgewogICAgICByZXR1cm4gc2NoZWR1bGVBc3luY0l0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpOwogICAgfQogICAgaWYgKGlzSXRlcmFibGUoaW5wdXQpKSB7CiAgICAgIHJldHVybiBzY2hlZHVsZUl0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpOwogICAgfQogICAgaWYgKGlzUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0KSkgewogICAgICByZXR1cm4gc2NoZWR1bGVSZWFkYWJsZVN0cmVhbUxpa2UoaW5wdXQsIHNjaGVkdWxlcik7CiAgICB9CiAgfQogIHRocm93IGNyZWF0ZUludmFsaWRPYnNlcnZhYmxlVHlwZUVycm9yKGlucHV0KTsKfQp2YXIgaW5pdF9zY2hlZHVsZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVkLmpzIigpIHsKICAgIGluaXRfc2NoZWR1bGVPYnNlcnZhYmxlKCk7CiAgICBpbml0X3NjaGVkdWxlUHJvbWlzZSgpOwogICAgaW5pdF9zY2hlZHVsZUFycmF5KCk7CiAgICBpbml0X3NjaGVkdWxlSXRlcmFibGUoKTsKICAgIGluaXRfc2NoZWR1bGVBc3luY0l0ZXJhYmxlKCk7CiAgICBpbml0X2lzSW50ZXJvcE9ic2VydmFibGUoKTsKICAgIGluaXRfaXNQcm9taXNlKCk7CiAgICBpbml0X2lzQXJyYXlMaWtlKCk7CiAgICBpbml0X2lzSXRlcmFibGUoKTsKICAgIGluaXRfaXNBc3luY0l0ZXJhYmxlKCk7CiAgICBpbml0X3Rocm93VW5vYnNlcnZhYmxlRXJyb3IoKTsKICAgIGluaXRfaXNSZWFkYWJsZVN0cmVhbUxpa2UoKTsKICAgIGluaXRfc2NoZWR1bGVSZWFkYWJsZVN0cmVhbUxpa2UoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZnJvbS5qcwpmdW5jdGlvbiBmcm9tKGlucHV0LCBzY2hlZHVsZXIpIHsKICByZXR1cm4gc2NoZWR1bGVyID8gc2NoZWR1bGVkKGlucHV0LCBzY2hlZHVsZXIpIDogaW5uZXJGcm9tKGlucHV0KTsKfQp2YXIgaW5pdF9mcm9tID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mcm9tLmpzIigpIHsKICAgIGluaXRfc2NoZWR1bGVkKCk7CiAgICBpbml0X2lubmVyRnJvbSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9vZi5qcwpmdW5jdGlvbiBvZigpIHsKICB2YXIgYXJncyA9IFtdOwogIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgfQogIHZhciBzY2hlZHVsZXIgPSBwb3BTY2hlZHVsZXIoYXJncyk7CiAgcmV0dXJuIGZyb20oYXJncywgc2NoZWR1bGVyKTsKfQp2YXIgaW5pdF9vZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvb2YuanMiKCkgewogICAgaW5pdF9hcmdzKCk7CiAgICBpbml0X2Zyb20oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvdGhyb3dFcnJvci5qcwpmdW5jdGlvbiB0aHJvd0Vycm9yKGVycm9yT3JFcnJvckZhY3RvcnksIHNjaGVkdWxlcikgewogIHZhciBlcnJvckZhY3RvcnkgPSBpc0Z1bmN0aW9uKGVycm9yT3JFcnJvckZhY3RvcnkpID8gZXJyb3JPckVycm9yRmFjdG9yeSA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGVycm9yT3JFcnJvckZhY3Rvcnk7CiAgfTsKICB2YXIgaW5pdCA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgIHJldHVybiBzdWJzY3JpYmVyLmVycm9yKGVycm9yRmFjdG9yeSgpKTsKICB9OwogIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzY2hlZHVsZXIgPyBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlKGluaXQsIDAsIHN1YnNjcmliZXIpOwogIH0gOiBpbml0KTsKfQp2YXIgaW5pdF90aHJvd0Vycm9yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS90aHJvd0Vycm9yLmpzIigpIHsKICAgIGluaXRfT2JzZXJ2YWJsZSgpOwogICAgaW5pdF9pc0Z1bmN0aW9uKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9Ob3RpZmljYXRpb24uanMKZnVuY3Rpb24gb2JzZXJ2ZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG9ic2VydmVyKSB7CiAgdmFyIF9hMTIsIF9iLCBfYzsKICB2YXIgX2QgPSBub3RpZmljYXRpb24sIGtpbmQgPSBfZC5raW5kLCB2YWx1ZTIgPSBfZC52YWx1ZSwgZXJyb3IgPSBfZC5lcnJvcjsKICBpZiAodHlwZW9mIGtpbmQgIT09ICJzdHJpbmciKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vdGlmaWNhdGlvbiwgbWlzc2luZyAia2luZCInKTsKICB9CiAga2luZCA9PT0gIk4iID8gKF9hMTIgPSBvYnNlcnZlci5uZXh0KSA9PT0gbnVsbCB8fCBfYTEyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTEyLmNhbGwob2JzZXJ2ZXIsIHZhbHVlMikgOiBraW5kID09PSAiRSIgPyAoX2IgPSBvYnNlcnZlci5lcnJvcikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwob2JzZXJ2ZXIsIGVycm9yKSA6IChfYyA9IG9ic2VydmVyLmNvbXBsZXRlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuY2FsbChvYnNlcnZlcik7Cn0KdmFyIE5vdGlmaWNhdGlvbktpbmQsIE5vdGlmaWNhdGlvbjsKdmFyIGluaXRfTm90aWZpY2F0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvTm90aWZpY2F0aW9uLmpzIigpIHsKICAgIGluaXRfZW1wdHkoKTsKICAgIGluaXRfb2YoKTsKICAgIGluaXRfdGhyb3dFcnJvcigpOwogICAgaW5pdF9pc0Z1bmN0aW9uKCk7CiAgICAoZnVuY3Rpb24oTm90aWZpY2F0aW9uS2luZDIpIHsKICAgICAgTm90aWZpY2F0aW9uS2luZDJbIk5FWFQiXSA9ICJOIjsKICAgICAgTm90aWZpY2F0aW9uS2luZDJbIkVSUk9SIl0gPSAiRSI7CiAgICAgIE5vdGlmaWNhdGlvbktpbmQyWyJDT01QTEVURSJdID0gIkMiOwogICAgfSkoTm90aWZpY2F0aW9uS2luZCB8fCAoTm90aWZpY2F0aW9uS2luZCA9IHt9KSk7CiAgICBOb3RpZmljYXRpb24gPSAoZnVuY3Rpb24oKSB7CiAgICAgIGZ1bmN0aW9uIE5vdGlmaWNhdGlvbjIoa2luZCwgdmFsdWUyLCBlcnJvcikgewogICAgICAgIHRoaXMua2luZCA9IGtpbmQ7CiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlMjsKICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7CiAgICAgICAgdGhpcy5oYXNWYWx1ZSA9IGtpbmQgPT09ICJOIjsKICAgICAgfQogICAgICBOb3RpZmljYXRpb24yLnByb3RvdHlwZS5vYnNlcnZlID0gZnVuY3Rpb24ob2JzZXJ2ZXIpIHsKICAgICAgICByZXR1cm4gb2JzZXJ2ZU5vdGlmaWNhdGlvbih0aGlzLCBvYnNlcnZlcik7CiAgICAgIH07CiAgICAgIE5vdGlmaWNhdGlvbjIucHJvdG90eXBlLmRvID0gZnVuY3Rpb24obmV4dEhhbmRsZXIsIGVycm9ySGFuZGxlciwgY29tcGxldGVIYW5kbGVyKSB7CiAgICAgICAgdmFyIF9hMTIgPSB0aGlzLCBraW5kID0gX2ExMi5raW5kLCB2YWx1ZTIgPSBfYTEyLnZhbHVlLCBlcnJvciA9IF9hMTIuZXJyb3I7CiAgICAgICAgcmV0dXJuIGtpbmQgPT09ICJOIiA/IG5leHRIYW5kbGVyID09PSBudWxsIHx8IG5leHRIYW5kbGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuZXh0SGFuZGxlcih2YWx1ZTIpIDoga2luZCA9PT0gIkUiID8gZXJyb3JIYW5kbGVyID09PSBudWxsIHx8IGVycm9ySGFuZGxlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3JIYW5kbGVyKGVycm9yKSA6IGNvbXBsZXRlSGFuZGxlciA9PT0gbnVsbCB8fCBjb21wbGV0ZUhhbmRsZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBsZXRlSGFuZGxlcigpOwogICAgICB9OwogICAgICBOb3RpZmljYXRpb24yLnByb3RvdHlwZS5hY2NlcHQgPSBmdW5jdGlvbihuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICAgICAgdmFyIF9hMTI7CiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oKF9hMTIgPSBuZXh0T3JPYnNlcnZlcikgPT09IG51bGwgfHwgX2ExMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ExMi5uZXh0KSA/IHRoaXMub2JzZXJ2ZShuZXh0T3JPYnNlcnZlcikgOiB0aGlzLmRvKG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGUpOwogICAgICB9OwogICAgICBOb3RpZmljYXRpb24yLnByb3RvdHlwZS50b09ic2VydmFibGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX2ExMiA9IHRoaXMsIGtpbmQgPSBfYTEyLmtpbmQsIHZhbHVlMiA9IF9hMTIudmFsdWUsIGVycm9yID0gX2ExMi5lcnJvcjsKICAgICAgICB2YXIgcmVzdWx0ID0ga2luZCA9PT0gIk4iID8gb2YodmFsdWUyKSA6IGtpbmQgPT09ICJFIiA/IHRocm93RXJyb3IoZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gZXJyb3I7CiAgICAgICAgfSkgOiBraW5kID09PSAiQyIgPyBFTVBUWSA6IDA7CiAgICAgICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlVuZXhwZWN0ZWQgbm90aWZpY2F0aW9uIGtpbmQgIiArIGtpbmQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBOb3RpZmljYXRpb24yLmNyZWF0ZU5leHQgPSBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgICByZXR1cm4gbmV3IE5vdGlmaWNhdGlvbjIoIk4iLCB2YWx1ZTIpOwogICAgICB9OwogICAgICBOb3RpZmljYXRpb24yLmNyZWF0ZUVycm9yID0gZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgcmV0dXJuIG5ldyBOb3RpZmljYXRpb24yKCJFIiwgdm9pZCAwLCBlcnIpOwogICAgICB9OwogICAgICBOb3RpZmljYXRpb24yLmNyZWF0ZUNvbXBsZXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIE5vdGlmaWNhdGlvbjIuY29tcGxldGVOb3RpZmljYXRpb247CiAgICAgIH07CiAgICAgIE5vdGlmaWNhdGlvbjIuY29tcGxldGVOb3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uMigiQyIpOwogICAgICByZXR1cm4gTm90aWZpY2F0aW9uMjsKICAgIH0pKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzT2JzZXJ2YWJsZS5qcwp2YXIgaW5pdF9pc09ic2VydmFibGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzT2JzZXJ2YWJsZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL0VtcHR5RXJyb3IuanMKdmFyIEVtcHR5RXJyb3I7CnZhciBpbml0X0VtcHR5RXJyb3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL0VtcHR5RXJyb3IuanMiKCkgewogICAgaW5pdF9jcmVhdGVFcnJvckNsYXNzKCk7CiAgICBFbXB0eUVycm9yID0gY3JlYXRlRXJyb3JDbGFzcyhmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIEVtcHR5RXJyb3JJbXBsKCkgewogICAgICAgIF9zdXBlcih0aGlzKTsKICAgICAgICB0aGlzLm5hbWUgPSAiRW1wdHlFcnJvciI7CiAgICAgICAgdGhpcy5tZXNzYWdlID0gIm5vIGVsZW1lbnRzIGluIHNlcXVlbmNlIjsKICAgICAgfTsKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvbGFzdFZhbHVlRnJvbS5qcwp2YXIgaW5pdF9sYXN0VmFsdWVGcm9tID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvbGFzdFZhbHVlRnJvbS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9maXJzdFZhbHVlRnJvbS5qcwp2YXIgaW5pdF9maXJzdFZhbHVlRnJvbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL2ZpcnN0VmFsdWVGcm9tLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IuanMKdmFyIEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yOwp2YXIgaW5pdF9Bcmd1bWVudE91dE9mUmFuZ2VFcnJvciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IuanMiKCkgewogICAgaW5pdF9jcmVhdGVFcnJvckNsYXNzKCk7CiAgICBBcmd1bWVudE91dE9mUmFuZ2VFcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3MoZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiBBcmd1bWVudE91dE9mUmFuZ2VFcnJvckltcGwoKSB7CiAgICAgICAgX3N1cGVyKHRoaXMpOwogICAgICAgIHRoaXMubmFtZSA9ICJBcmd1bWVudE91dE9mUmFuZ2VFcnJvciI7CiAgICAgICAgdGhpcy5tZXNzYWdlID0gImFyZ3VtZW50IG91dCBvZiByYW5nZSI7CiAgICAgIH07CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvTm90Rm91bmRFcnJvci5qcwp2YXIgTm90Rm91bmRFcnJvcjsKdmFyIGluaXRfTm90Rm91bmRFcnJvciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvTm90Rm91bmRFcnJvci5qcyIoKSB7CiAgICBpbml0X2NyZWF0ZUVycm9yQ2xhc3MoKTsKICAgIE5vdEZvdW5kRXJyb3IgPSBjcmVhdGVFcnJvckNsYXNzKGZ1bmN0aW9uKF9zdXBlcikgewogICAgICByZXR1cm4gZnVuY3Rpb24gTm90Rm91bmRFcnJvckltcGwobWVzc2FnZTIpIHsKICAgICAgICBfc3VwZXIodGhpcyk7CiAgICAgICAgdGhpcy5uYW1lID0gIk5vdEZvdW5kRXJyb3IiOwogICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UyOwogICAgICB9OwogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL1NlcXVlbmNlRXJyb3IuanMKdmFyIFNlcXVlbmNlRXJyb3I7CnZhciBpbml0X1NlcXVlbmNlRXJyb3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL1NlcXVlbmNlRXJyb3IuanMiKCkgewogICAgaW5pdF9jcmVhdGVFcnJvckNsYXNzKCk7CiAgICBTZXF1ZW5jZUVycm9yID0gY3JlYXRlRXJyb3JDbGFzcyhmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIFNlcXVlbmNlRXJyb3JJbXBsKG1lc3NhZ2UyKSB7CiAgICAgICAgX3N1cGVyKHRoaXMpOwogICAgICAgIHRoaXMubmFtZSA9ICJTZXF1ZW5jZUVycm9yIjsKICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlMjsKICAgICAgfTsKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc0RhdGUuanMKZnVuY3Rpb24gaXNWYWxpZERhdGUodmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMiBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHZhbHVlMik7Cn0KdmFyIGluaXRfaXNEYXRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc0RhdGUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3RpbWVvdXQuanMKZnVuY3Rpb24gdGltZW91dChjb25maWczLCBzY2hlZHVsZXJBcmcpIHsKICB2YXIgX2ExMiA9IGlzVmFsaWREYXRlKGNvbmZpZzMpID8geyBmaXJzdDogY29uZmlnMyB9IDogdHlwZW9mIGNvbmZpZzMgPT09ICJudW1iZXIiID8geyBlYWNoOiBjb25maWczIH0gOiBjb25maWczLCBmaXJzdDIgPSBfYTEyLmZpcnN0LCBlYWNoID0gX2ExMi5lYWNoLCBfYiA9IF9hMTIud2l0aCwgX3dpdGggPSBfYiA9PT0gdm9pZCAwID8gdGltZW91dEVycm9yRmFjdG9yeSA6IF9iLCBfYyA9IF9hMTIuc2NoZWR1bGVyLCBzY2hlZHVsZXIgPSBfYyA9PT0gdm9pZCAwID8gc2NoZWR1bGVyQXJnICE9PSBudWxsICYmIHNjaGVkdWxlckFyZyAhPT0gdm9pZCAwID8gc2NoZWR1bGVyQXJnIDogYXN5bmNTY2hlZHVsZXIgOiBfYywgX2QgPSBfYTEyLm1ldGEsIG1ldGEgPSBfZCA9PT0gdm9pZCAwID8gbnVsbCA6IF9kOwogIGlmIChmaXJzdDIgPT0gbnVsbCAmJiBlYWNoID09IG51bGwpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIk5vIHRpbWVvdXQgcHJvdmlkZWQuIik7CiAgfQogIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgdmFyIG9yaWdpbmFsU291cmNlU3Vic2NyaXB0aW9uOwogICAgdmFyIHRpbWVyU3Vic2NyaXB0aW9uOwogICAgdmFyIGxhc3RWYWx1ZSA9IG51bGw7CiAgICB2YXIgc2VlbiA9IDA7CiAgICB2YXIgc3RhcnRUaW1lciA9IGZ1bmN0aW9uKGRlbGF5MikgewogICAgICB0aW1lclN1YnNjcmlwdGlvbiA9IGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBvcmlnaW5hbFNvdXJjZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgaW5uZXJGcm9tKF93aXRoKHsKICAgICAgICAgICAgbWV0YSwKICAgICAgICAgICAgbGFzdFZhbHVlLAogICAgICAgICAgICBzZWVuCiAgICAgICAgICB9KSkuc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnIpOwogICAgICAgIH0KICAgICAgfSwgZGVsYXkyKTsKICAgIH07CiAgICBvcmlnaW5hbFNvdXJjZVN1YnNjcmlwdGlvbiA9IHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlMikgewogICAgICB0aW1lclN1YnNjcmlwdGlvbiA9PT0gbnVsbCB8fCB0aW1lclN1YnNjcmlwdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgc2VlbisrOwogICAgICBzdWJzY3JpYmVyLm5leHQobGFzdFZhbHVlID0gdmFsdWUyKTsKICAgICAgZWFjaCA+IDAgJiYgc3RhcnRUaW1lcihlYWNoKTsKICAgIH0sIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKCEodGltZXJTdWJzY3JpcHRpb24gPT09IG51bGwgfHwgdGltZXJTdWJzY3JpcHRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRpbWVyU3Vic2NyaXB0aW9uLmNsb3NlZCkpIHsKICAgICAgICB0aW1lclN1YnNjcmlwdGlvbiA9PT0gbnVsbCB8fCB0aW1lclN1YnNjcmlwdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgfQogICAgICBsYXN0VmFsdWUgPSBudWxsOwogICAgfSkpOwogICAgIXNlZW4gJiYgc3RhcnRUaW1lcihmaXJzdDIgIT0gbnVsbCA/IHR5cGVvZiBmaXJzdDIgPT09ICJudW1iZXIiID8gZmlyc3QyIDogK2ZpcnN0MiAtIHNjaGVkdWxlci5ub3coKSA6IGVhY2gpOwogIH0pOwp9CmZ1bmN0aW9uIHRpbWVvdXRFcnJvckZhY3RvcnkoaW5mbykgewogIHRocm93IG5ldyBUaW1lb3V0RXJyb3IoaW5mbyk7Cn0KdmFyIFRpbWVvdXRFcnJvcjsKdmFyIGluaXRfdGltZW91dCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90aW1lb3V0LmpzIigpIHsKICAgIGluaXRfYXN5bmMoKTsKICAgIGluaXRfaXNEYXRlKCk7CiAgICBpbml0X2xpZnQoKTsKICAgIGluaXRfaW5uZXJGcm9tKCk7CiAgICBpbml0X2NyZWF0ZUVycm9yQ2xhc3MoKTsKICAgIGluaXRfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICBpbml0X2V4ZWN1dGVTY2hlZHVsZSgpOwogICAgVGltZW91dEVycm9yID0gY3JlYXRlRXJyb3JDbGFzcyhmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIFRpbWVvdXRFcnJvckltcGwoaW5mbykgewogICAgICAgIGlmIChpbmZvID09PSB2b2lkIDApIHsKICAgICAgICAgIGluZm8gPSBudWxsOwogICAgICAgIH0KICAgICAgICBfc3VwZXIodGhpcyk7CiAgICAgICAgdGhpcy5tZXNzYWdlID0gIlRpbWVvdXQgaGFzIG9jY3VycmVkIjsKICAgICAgICB0aGlzLm5hbWUgPSAiVGltZW91dEVycm9yIjsKICAgICAgICB0aGlzLmluZm8gPSBpbmZvOwogICAgICB9OwogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWFwLmpzCmZ1bmN0aW9uIG1hcDIocHJvamVjdCwgdGhpc0FyZykgewogIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgdmFyIGluZGV4MiA9IDA7CiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgc3Vic2NyaWJlci5uZXh0KHByb2plY3QuY2FsbCh0aGlzQXJnLCB2YWx1ZTIsIGluZGV4MisrKSk7CiAgICB9KSk7CiAgfSk7Cn0KdmFyIGluaXRfbWFwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21hcC5qcyIoKSB7CiAgICBpbml0X2xpZnQoKTsKICAgIGluaXRfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL21hcE9uZU9yTWFueUFyZ3MuanMKZnVuY3Rpb24gY2FsbE9yQXBwbHkoZm4sIGFyZ3MpIHsKICByZXR1cm4gaXNBcnJheShhcmdzKSA/IGZuLmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGFyZ3MpKSkgOiBmbihhcmdzKTsKfQpmdW5jdGlvbiBtYXBPbmVPck1hbnlBcmdzKGZuKSB7CiAgcmV0dXJuIG1hcDIoZnVuY3Rpb24oYXJncykgewogICAgcmV0dXJuIGNhbGxPckFwcGx5KGZuLCBhcmdzKTsKICB9KTsKfQp2YXIgaXNBcnJheTsKdmFyIGluaXRfbWFwT25lT3JNYW55QXJncyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvbWFwT25lT3JNYW55QXJncy5qcyIoKSB7CiAgICBpbml0X3RzbGliX2VzNigpOwogICAgaW5pdF9tYXAoKTsKICAgIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9iaW5kQ2FsbGJhY2suanMKdmFyIGluaXRfYmluZENhbGxiYWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9iaW5kQ2FsbGJhY2suanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9iaW5kTm9kZUNhbGxiYWNrLmpzCnZhciBpbml0X2JpbmROb2RlQ2FsbGJhY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2JpbmROb2RlQ2FsbGJhY2suanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9hcmdzQXJnQXJyYXlPck9iamVjdC5qcwpmdW5jdGlvbiBhcmdzQXJnQXJyYXlPck9iamVjdChhcmdzKSB7CiAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7CiAgICB2YXIgZmlyc3RfMSA9IGFyZ3NbMF07CiAgICBpZiAoaXNBcnJheTIoZmlyc3RfMSkpIHsKICAgICAgcmV0dXJuIHsgYXJnczogZmlyc3RfMSwga2V5czogbnVsbCB9OwogICAgfQogICAgaWYgKGlzUE9KTyhmaXJzdF8xKSkgewogICAgICB2YXIga2V5czIgPSBnZXRLZXlzKGZpcnN0XzEpOwogICAgICByZXR1cm4gewogICAgICAgIGFyZ3M6IGtleXMyLm1hcChmdW5jdGlvbihrZXkyKSB7CiAgICAgICAgICByZXR1cm4gZmlyc3RfMVtrZXkyXTsKICAgICAgICB9KSwKICAgICAgICBrZXlzOiBrZXlzMgogICAgICB9OwogICAgfQogIH0KICByZXR1cm4geyBhcmdzLCBrZXlzOiBudWxsIH07Cn0KZnVuY3Rpb24gaXNQT0pPKG9iaikgewogIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgJiYgZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gb2JqZWN0UHJvdG87Cn0KdmFyIGlzQXJyYXkyLCBnZXRQcm90b3R5cGVPZiwgb2JqZWN0UHJvdG8sIGdldEtleXM7CnZhciBpbml0X2FyZ3NBcmdBcnJheU9yT2JqZWN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9hcmdzQXJnQXJyYXlPck9iamVjdC5qcyIoKSB7CiAgICBpc0FycmF5MiA9IEFycmF5LmlzQXJyYXk7CiAgICBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlLCBnZXRLZXlzID0gT2JqZWN0LmtleXM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2NyZWF0ZU9iamVjdC5qcwpmdW5jdGlvbiBjcmVhdGVPYmplY3Qoa2V5czIsIHZhbHVlcykgewogIHJldHVybiBrZXlzMi5yZWR1Y2UoZnVuY3Rpb24ocmVzdWx0LCBrZXkyLCBpMTEpIHsKICAgIHJldHVybiByZXN1bHRba2V5Ml0gPSB2YWx1ZXNbaTExXSwgcmVzdWx0OwogIH0sIHt9KTsKfQp2YXIgaW5pdF9jcmVhdGVPYmplY3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2NyZWF0ZU9iamVjdC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2NvbWJpbmVMYXRlc3QuanMKZnVuY3Rpb24gY29tYmluZUxhdGVzdCgpIHsKICB2YXIgYXJncyA9IFtdOwogIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgfQogIHZhciBzY2hlZHVsZXIgPSBwb3BTY2hlZHVsZXIoYXJncyk7CiAgdmFyIHJlc3VsdFNlbGVjdG9yID0gcG9wUmVzdWx0U2VsZWN0b3IoYXJncyk7CiAgdmFyIF9hMTIgPSBhcmdzQXJnQXJyYXlPck9iamVjdChhcmdzKSwgb2JzZXJ2YWJsZXMgPSBfYTEyLmFyZ3MsIGtleXMyID0gX2ExMi5rZXlzOwogIGlmIChvYnNlcnZhYmxlcy5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiBmcm9tKFtdLCBzY2hlZHVsZXIpOwogIH0KICB2YXIgcmVzdWx0ID0gbmV3IE9ic2VydmFibGUoY29tYmluZUxhdGVzdEluaXQob2JzZXJ2YWJsZXMsIHNjaGVkdWxlciwga2V5czIgPyBmdW5jdGlvbih2YWx1ZXMpIHsKICAgIHJldHVybiBjcmVhdGVPYmplY3Qoa2V5czIsIHZhbHVlcyk7CiAgfSA6IGlkZW50aXR5KSk7CiAgcmV0dXJuIHJlc3VsdFNlbGVjdG9yID8gcmVzdWx0LnBpcGUobWFwT25lT3JNYW55QXJncyhyZXN1bHRTZWxlY3RvcikpIDogcmVzdWx0Owp9CmZ1bmN0aW9uIGNvbWJpbmVMYXRlc3RJbml0KG9ic2VydmFibGVzLCBzY2hlZHVsZXIsIHZhbHVlVHJhbnNmb3JtKSB7CiAgaWYgKHZhbHVlVHJhbnNmb3JtID09PSB2b2lkIDApIHsKICAgIHZhbHVlVHJhbnNmb3JtID0gaWRlbnRpdHk7CiAgfQogIHJldHVybiBmdW5jdGlvbihzdWJzY3JpYmVyKSB7CiAgICBtYXliZVNjaGVkdWxlKHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7CiAgICAgIHZhciBsZW5ndGggPSBvYnNlcnZhYmxlcy5sZW5ndGg7CiAgICAgIHZhciB2YWx1ZXMgPSBuZXcgQXJyYXkobGVuZ3RoKTsKICAgICAgdmFyIGFjdGl2ZSA9IGxlbmd0aDsKICAgICAgdmFyIHJlbWFpbmluZ0ZpcnN0VmFsdWVzID0gbGVuZ3RoOwogICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uKGkxMikgewogICAgICAgIG1heWJlU2NoZWR1bGUoc2NoZWR1bGVyLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBzb3VyY2UgPSBmcm9tKG9ic2VydmFibGVzW2kxMl0sIHNjaGVkdWxlcik7CiAgICAgICAgICB2YXIgaGFzRmlyc3RWYWx1ZSA9IGZhbHNlOwogICAgICAgICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgICAgICAgIHZhbHVlc1tpMTJdID0gdmFsdWUyOwogICAgICAgICAgICBpZiAoIWhhc0ZpcnN0VmFsdWUpIHsKICAgICAgICAgICAgICBoYXNGaXJzdFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICByZW1haW5pbmdGaXJzdFZhbHVlcy0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghcmVtYWluaW5nRmlyc3RWYWx1ZXMpIHsKICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWVUcmFuc2Zvcm0odmFsdWVzLnNsaWNlKCkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghLS1hY3RpdmUpIHsKICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKTsKICAgICAgICB9LCBzdWJzY3JpYmVyKTsKICAgICAgfTsKICAgICAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgbGVuZ3RoOyBpMTErKykgewogICAgICAgIF9sb29wXzEoaTExKTsKICAgICAgfQogICAgfSwgc3Vic2NyaWJlcik7CiAgfTsKfQpmdW5jdGlvbiBtYXliZVNjaGVkdWxlKHNjaGVkdWxlciwgZXhlY3V0ZSwgc3Vic2NyaXB0aW9uKSB7CiAgaWYgKHNjaGVkdWxlcikgewogICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmlwdGlvbiwgc2NoZWR1bGVyLCBleGVjdXRlKTsKICB9IGVsc2UgewogICAgZXhlY3V0ZSgpOwogIH0KfQp2YXIgaW5pdF9jb21iaW5lTGF0ZXN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9jb21iaW5lTGF0ZXN0LmpzIigpIHsKICAgIGluaXRfT2JzZXJ2YWJsZSgpOwogICAgaW5pdF9hcmdzQXJnQXJyYXlPck9iamVjdCgpOwogICAgaW5pdF9mcm9tKCk7CiAgICBpbml0X2lkZW50aXR5KCk7CiAgICBpbml0X21hcE9uZU9yTWFueUFyZ3MoKTsKICAgIGluaXRfYXJncygpOwogICAgaW5pdF9jcmVhdGVPYmplY3QoKTsKICAgIGluaXRfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICBpbml0X2V4ZWN1dGVTY2hlZHVsZSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlSW50ZXJuYWxzLmpzCmZ1bmN0aW9uIG1lcmdlSW50ZXJuYWxzKHNvdXJjZSwgc3Vic2NyaWJlciwgcHJvamVjdCwgY29uY3VycmVudCwgb25CZWZvcmVOZXh0LCBleHBhbmQyLCBpbm5lclN1YlNjaGVkdWxlciwgYWRkaXRpb25hbEZpbmFsaXplcikgewogIHZhciBidWZmZXIyID0gW107CiAgdmFyIGFjdGl2ZSA9IDA7CiAgdmFyIGluZGV4MiA9IDA7CiAgdmFyIGlzQ29tcGxldGUgPSBmYWxzZTsKICB2YXIgY2hlY2tDb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGlzQ29tcGxldGUgJiYgIWJ1ZmZlcjIubGVuZ3RoICYmICFhY3RpdmUpIHsKICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgfQogIH07CiAgdmFyIG91dGVyTmV4dCA9IGZ1bmN0aW9uKHZhbHVlMikgewogICAgcmV0dXJuIGFjdGl2ZSA8IGNvbmN1cnJlbnQgPyBkb0lubmVyU3ViKHZhbHVlMikgOiBidWZmZXIyLnB1c2godmFsdWUyKTsKICB9OwogIHZhciBkb0lubmVyU3ViID0gZnVuY3Rpb24odmFsdWUyKSB7CiAgICBleHBhbmQyICYmIHN1YnNjcmliZXIubmV4dCh2YWx1ZTIpOwogICAgYWN0aXZlKys7CiAgICB2YXIgaW5uZXJDb21wbGV0ZSA9IGZhbHNlOwogICAgaW5uZXJGcm9tKHByb2plY3QodmFsdWUyLCBpbmRleDIrKykpLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oaW5uZXJWYWx1ZSkgewogICAgICBvbkJlZm9yZU5leHQgPT09IG51bGwgfHwgb25CZWZvcmVOZXh0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJlZm9yZU5leHQoaW5uZXJWYWx1ZSk7CiAgICAgIGlmIChleHBhbmQyKSB7CiAgICAgICAgb3V0ZXJOZXh0KGlubmVyVmFsdWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHN1YnNjcmliZXIubmV4dChpbm5lclZhbHVlKTsKICAgICAgfQogICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgIGlubmVyQ29tcGxldGUgPSB0cnVlOwogICAgfSwgdm9pZCAwLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGlubmVyQ29tcGxldGUpIHsKICAgICAgICB0cnkgewogICAgICAgICAgYWN0aXZlLS07CiAgICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgYnVmZmVyZWRWYWx1ZSA9IGJ1ZmZlcjIuc2hpZnQoKTsKICAgICAgICAgICAgaWYgKGlubmVyU3ViU2NoZWR1bGVyKSB7CiAgICAgICAgICAgICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIGlubmVyU3ViU2NoZWR1bGVyLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkb0lubmVyU3ViKGJ1ZmZlcmVkVmFsdWUpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGRvSW5uZXJTdWIoYnVmZmVyZWRWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICB3aGlsZSAoYnVmZmVyMi5sZW5ndGggJiYgYWN0aXZlIDwgY29uY3VycmVudCkgewogICAgICAgICAgICBfbG9vcF8xKCk7CiAgICAgICAgICB9CiAgICAgICAgICBjaGVja0NvbXBsZXRlKCk7CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7CiAgICAgICAgfQogICAgICB9CiAgICB9KSk7CiAgfTsKICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBvdXRlck5leHQsIGZ1bmN0aW9uKCkgewogICAgaXNDb21wbGV0ZSA9IHRydWU7CiAgICBjaGVja0NvbXBsZXRlKCk7CiAgfSkpOwogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIGFkZGl0aW9uYWxGaW5hbGl6ZXIgPT09IG51bGwgfHwgYWRkaXRpb25hbEZpbmFsaXplciA9PT0gdm9pZCAwID8gdm9pZCAwIDogYWRkaXRpb25hbEZpbmFsaXplcigpOwogIH07Cn0KdmFyIGluaXRfbWVyZ2VJbnRlcm5hbHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWVyZ2VJbnRlcm5hbHMuanMiKCkgewogICAgaW5pdF9pbm5lckZyb20oKTsKICAgIGluaXRfZXhlY3V0ZVNjaGVkdWxlKCk7CiAgICBpbml0X09wZXJhdG9yU3Vic2NyaWJlcigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlTWFwLmpzCmZ1bmN0aW9uIG1lcmdlTWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yLCBjb25jdXJyZW50KSB7CiAgaWYgKGNvbmN1cnJlbnQgPT09IHZvaWQgMCkgewogICAgY29uY3VycmVudCA9IEluZmluaXR5OwogIH0KICBpZiAoaXNGdW5jdGlvbihyZXN1bHRTZWxlY3RvcikpIHsKICAgIHJldHVybiBtZXJnZU1hcChmdW5jdGlvbihhNSwgaTExKSB7CiAgICAgIHJldHVybiBtYXAyKGZ1bmN0aW9uKGI2LCBpaSkgewogICAgICAgIHJldHVybiByZXN1bHRTZWxlY3RvcihhNSwgYjYsIGkxMSwgaWkpOwogICAgICB9KShpbm5lckZyb20ocHJvamVjdChhNSwgaTExKSkpOwogICAgfSwgY29uY3VycmVudCk7CiAgfSBlbHNlIGlmICh0eXBlb2YgcmVzdWx0U2VsZWN0b3IgPT09ICJudW1iZXIiKSB7CiAgICBjb25jdXJyZW50ID0gcmVzdWx0U2VsZWN0b3I7CiAgfQogIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgcmV0dXJuIG1lcmdlSW50ZXJuYWxzKHNvdXJjZSwgc3Vic2NyaWJlciwgcHJvamVjdCwgY29uY3VycmVudCk7CiAgfSk7Cn0KdmFyIGluaXRfbWVyZ2VNYXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWVyZ2VNYXAuanMiKCkgewogICAgaW5pdF9tYXAoKTsKICAgIGluaXRfaW5uZXJGcm9tKCk7CiAgICBpbml0X2xpZnQoKTsKICAgIGluaXRfbWVyZ2VJbnRlcm5hbHMoKTsKICAgIGluaXRfaXNGdW5jdGlvbigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlQWxsLmpzCmZ1bmN0aW9uIG1lcmdlQWxsKGNvbmN1cnJlbnQpIHsKICBpZiAoY29uY3VycmVudCA9PT0gdm9pZCAwKSB7CiAgICBjb25jdXJyZW50ID0gSW5maW5pdHk7CiAgfQogIHJldHVybiBtZXJnZU1hcChpZGVudGl0eSwgY29uY3VycmVudCk7Cn0KdmFyIGluaXRfbWVyZ2VBbGwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWVyZ2VBbGwuanMiKCkgewogICAgaW5pdF9tZXJnZU1hcCgpOwogICAgaW5pdF9pZGVudGl0eSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NvbmNhdEFsbC5qcwpmdW5jdGlvbiBjb25jYXRBbGwoKSB7CiAgcmV0dXJuIG1lcmdlQWxsKDEpOwp9CnZhciBpbml0X2NvbmNhdEFsbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb25jYXRBbGwuanMiKCkgewogICAgaW5pdF9tZXJnZUFsbCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9jb25jYXQuanMKZnVuY3Rpb24gY29uY2F0KCkgewogIHZhciBhcmdzID0gW107CiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTsKICB9CiAgcmV0dXJuIGNvbmNhdEFsbCgpKGZyb20oYXJncywgcG9wU2NoZWR1bGVyKGFyZ3MpKSk7Cn0KdmFyIGluaXRfY29uY2F0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9jb25jYXQuanMiKCkgewogICAgaW5pdF9jb25jYXRBbGwoKTsKICAgIGluaXRfYXJncygpOwogICAgaW5pdF9mcm9tKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2RlZmVyLmpzCnZhciBpbml0X2RlZmVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9kZWZlci5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2Nvbm5lY3RhYmxlLmpzCnZhciBpbml0X2Nvbm5lY3RhYmxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9jb25uZWN0YWJsZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2ZvcmtKb2luLmpzCnZhciBpbml0X2ZvcmtKb2luID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mb3JrSm9pbi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb21FdmVudC5qcwpmdW5jdGlvbiBmcm9tRXZlbnQodGFyZ2V0LCBldmVudE5hbWUsIG9wdGlvbnMsIHJlc3VsdFNlbGVjdG9yKSB7CiAgaWYgKGlzRnVuY3Rpb24ob3B0aW9ucykpIHsKICAgIHJlc3VsdFNlbGVjdG9yID0gb3B0aW9uczsKICAgIG9wdGlvbnMgPSB2b2lkIDA7CiAgfQogIGlmIChyZXN1bHRTZWxlY3RvcikgewogICAgcmV0dXJuIGZyb21FdmVudCh0YXJnZXQsIGV2ZW50TmFtZSwgb3B0aW9ucykucGlwZShtYXBPbmVPck1hbnlBcmdzKHJlc3VsdFNlbGVjdG9yKSk7CiAgfQogIHZhciBfYTEyID0gX19yZWFkKGlzRXZlbnRUYXJnZXQodGFyZ2V0KSA/IGV2ZW50VGFyZ2V0TWV0aG9kcy5tYXAoZnVuY3Rpb24obWV0aG9kTmFtZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKGhhbmRsZXIyKSB7CiAgICAgIHJldHVybiB0YXJnZXRbbWV0aG9kTmFtZV0oZXZlbnROYW1lLCBoYW5kbGVyMiwgb3B0aW9ucyk7CiAgICB9OwogIH0pIDogaXNOb2RlU3R5bGVFdmVudEVtaXR0ZXIodGFyZ2V0KSA/IG5vZGVFdmVudEVtaXR0ZXJNZXRob2RzLm1hcCh0b0NvbW1vbkhhbmRsZXJSZWdpc3RyeSh0YXJnZXQsIGV2ZW50TmFtZSkpIDogaXNKUXVlcnlTdHlsZUV2ZW50RW1pdHRlcih0YXJnZXQpID8ganF1ZXJ5TWV0aG9kcy5tYXAodG9Db21tb25IYW5kbGVyUmVnaXN0cnkodGFyZ2V0LCBldmVudE5hbWUpKSA6IFtdLCAyKSwgYWRkMyA9IF9hMTJbMF0sIHJlbW92ZTIgPSBfYTEyWzFdOwogIGlmICghYWRkMykgewogICAgaWYgKGlzQXJyYXlMaWtlKHRhcmdldCkpIHsKICAgICAgcmV0dXJuIG1lcmdlTWFwKGZ1bmN0aW9uKHN1YlRhcmdldCkgewogICAgICAgIHJldHVybiBmcm9tRXZlbnQoc3ViVGFyZ2V0LCBldmVudE5hbWUsIG9wdGlvbnMpOwogICAgICB9KShpbm5lckZyb20odGFyZ2V0KSk7CiAgICB9CiAgfQogIGlmICghYWRkMykgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBldmVudCB0YXJnZXQiKTsKICB9CiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgIHZhciBoYW5kbGVyMiA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgYXJncyA9IFtdOwogICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgfQogICAgICByZXR1cm4gc3Vic2NyaWJlci5uZXh0KDEgPCBhcmdzLmxlbmd0aCA/IGFyZ3MgOiBhcmdzWzBdKTsKICAgIH07CiAgICBhZGQzKGhhbmRsZXIyKTsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHJlbW92ZTIoaGFuZGxlcjIpOwogICAgfTsKICB9KTsKfQpmdW5jdGlvbiB0b0NvbW1vbkhhbmRsZXJSZWdpc3RyeSh0YXJnZXQsIGV2ZW50TmFtZSkgewogIHJldHVybiBmdW5jdGlvbihtZXRob2ROYW1lKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oaGFuZGxlcjIpIHsKICAgICAgcmV0dXJuIHRhcmdldFttZXRob2ROYW1lXShldmVudE5hbWUsIGhhbmRsZXIyKTsKICAgIH07CiAgfTsKfQpmdW5jdGlvbiBpc05vZGVTdHlsZUV2ZW50RW1pdHRlcih0YXJnZXQpIHsKICByZXR1cm4gaXNGdW5jdGlvbih0YXJnZXQuYWRkTGlzdGVuZXIpICYmIGlzRnVuY3Rpb24odGFyZ2V0LnJlbW92ZUxpc3RlbmVyKTsKfQpmdW5jdGlvbiBpc0pRdWVyeVN0eWxlRXZlbnRFbWl0dGVyKHRhcmdldCkgewogIHJldHVybiBpc0Z1bmN0aW9uKHRhcmdldC5vbikgJiYgaXNGdW5jdGlvbih0YXJnZXQub2ZmKTsKfQpmdW5jdGlvbiBpc0V2ZW50VGFyZ2V0KHRhcmdldCkgewogIHJldHVybiBpc0Z1bmN0aW9uKHRhcmdldC5hZGRFdmVudExpc3RlbmVyKSAmJiBpc0Z1bmN0aW9uKHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKTsKfQp2YXIgbm9kZUV2ZW50RW1pdHRlck1ldGhvZHMsIGV2ZW50VGFyZ2V0TWV0aG9kcywganF1ZXJ5TWV0aG9kczsKdmFyIGluaXRfZnJvbUV2ZW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mcm9tRXZlbnQuanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGluaXRfaW5uZXJGcm9tKCk7CiAgICBpbml0X09ic2VydmFibGUoKTsKICAgIGluaXRfbWVyZ2VNYXAoKTsKICAgIGluaXRfaXNBcnJheUxpa2UoKTsKICAgIGluaXRfaXNGdW5jdGlvbigpOwogICAgaW5pdF9tYXBPbmVPck1hbnlBcmdzKCk7CiAgICBub2RlRXZlbnRFbWl0dGVyTWV0aG9kcyA9IFsiYWRkTGlzdGVuZXIiLCAicmVtb3ZlTGlzdGVuZXIiXTsKICAgIGV2ZW50VGFyZ2V0TWV0aG9kcyA9IFsiYWRkRXZlbnRMaXN0ZW5lciIsICJyZW1vdmVFdmVudExpc3RlbmVyIl07CiAgICBqcXVlcnlNZXRob2RzID0gWyJvbiIsICJvZmYiXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZnJvbUV2ZW50UGF0dGVybi5qcwp2YXIgaW5pdF9mcm9tRXZlbnRQYXR0ZXJuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mcm9tRXZlbnRQYXR0ZXJuLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZ2VuZXJhdGUuanMKdmFyIGluaXRfZ2VuZXJhdGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2dlbmVyYXRlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvaWlmLmpzCnZhciBpbml0X2lpZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvaWlmLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvdGltZXIuanMKZnVuY3Rpb24gdGltZXIoZHVlVGltZSwgaW50ZXJ2YWxPclNjaGVkdWxlciwgc2NoZWR1bGVyKSB7CiAgaWYgKGR1ZVRpbWUgPT09IHZvaWQgMCkgewogICAgZHVlVGltZSA9IDA7CiAgfQogIGlmIChzY2hlZHVsZXIgPT09IHZvaWQgMCkgewogICAgc2NoZWR1bGVyID0gYXN5bmM7CiAgfQogIHZhciBpbnRlcnZhbER1cmF0aW9uID0gLTE7CiAgaWYgKGludGVydmFsT3JTY2hlZHVsZXIgIT0gbnVsbCkgewogICAgaWYgKGlzU2NoZWR1bGVyKGludGVydmFsT3JTY2hlZHVsZXIpKSB7CiAgICAgIHNjaGVkdWxlciA9IGludGVydmFsT3JTY2hlZHVsZXI7CiAgICB9IGVsc2UgewogICAgICBpbnRlcnZhbER1cmF0aW9uID0gaW50ZXJ2YWxPclNjaGVkdWxlcjsKICAgIH0KICB9CiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHsKICAgIHZhciBkdWUgPSBpc1ZhbGlkRGF0ZShkdWVUaW1lKSA/ICtkdWVUaW1lIC0gc2NoZWR1bGVyLm5vdygpIDogZHVlVGltZTsKICAgIGlmIChkdWUgPCAwKSB7CiAgICAgIGR1ZSA9IDA7CiAgICB9CiAgICB2YXIgbjEzID0gMDsKICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24oKSB7CiAgICAgIGlmICghc3Vic2NyaWJlci5jbG9zZWQpIHsKICAgICAgICBzdWJzY3JpYmVyLm5leHQobjEzKyspOwogICAgICAgIGlmICgwIDw9IGludGVydmFsRHVyYXRpb24pIHsKICAgICAgICAgIHRoaXMuc2NoZWR1bGUodm9pZCAwLCBpbnRlcnZhbER1cmF0aW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwgZHVlKTsKICB9KTsKfQp2YXIgaW5pdF90aW1lciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvdGltZXIuanMiKCkgewogICAgaW5pdF9PYnNlcnZhYmxlKCk7CiAgICBpbml0X2FzeW5jKCk7CiAgICBpbml0X2lzU2NoZWR1bGVyKCk7CiAgICBpbml0X2lzRGF0ZSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9pbnRlcnZhbC5qcwp2YXIgaW5pdF9pbnRlcnZhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvaW50ZXJ2YWwuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9tZXJnZS5qcwp2YXIgaW5pdF9tZXJnZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvbWVyZ2UuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9uZXZlci5qcwpmdW5jdGlvbiBuZXZlcigpIHsKICByZXR1cm4gTkVWRVI7Cn0KdmFyIE5FVkVSOwp2YXIgaW5pdF9uZXZlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvbmV2ZXIuanMiKCkgewogICAgaW5pdF9PYnNlcnZhYmxlKCk7CiAgICBpbml0X25vb3AoKTsKICAgIE5FVkVSID0gbmV3IE9ic2VydmFibGUobm9vcCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL29uRXJyb3JSZXN1bWVOZXh0LmpzCnZhciBpbml0X29uRXJyb3JSZXN1bWVOZXh0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9vbkVycm9yUmVzdW1lTmV4dC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3BhaXJzLmpzCnZhciBpbml0X3BhaXJzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9wYWlycy5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZmlsdGVyLmpzCmZ1bmN0aW9uIGZpbHRlcihwcmVkaWNhdGUsIHRoaXNBcmcpIHsKICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHZhciBpbmRleDIgPSAwOwogICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIHJldHVybiBwcmVkaWNhdGUuY2FsbCh0aGlzQXJnLCB2YWx1ZTIsIGluZGV4MisrKSAmJiBzdWJzY3JpYmVyLm5leHQodmFsdWUyKTsKICAgIH0pKTsKICB9KTsKfQp2YXIgaW5pdF9maWx0ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZmlsdGVyLmpzIigpIHsKICAgIGluaXRfbGlmdCgpOwogICAgaW5pdF9PcGVyYXRvclN1YnNjcmliZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvcGFydGl0aW9uLmpzCnZhciBpbml0X3BhcnRpdGlvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvcGFydGl0aW9uLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvcmFjZS5qcwp2YXIgaW5pdF9yYWNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9yYWNlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvcmFuZ2UuanMKdmFyIGluaXRfcmFuZ2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3JhbmdlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvdXNpbmcuanMKdmFyIGluaXRfdXNpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3VzaW5nLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvemlwLmpzCnZhciBpbml0X3ppcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvemlwLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3R5cGVzLmpzCnZhciBpbml0X3R5cGVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdHlwZXMuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2F1ZGl0LmpzCnZhciBpbml0X2F1ZGl0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2F1ZGl0LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9hdWRpdFRpbWUuanMKdmFyIGluaXRfYXVkaXRUaW1lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2F1ZGl0VGltZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvYnVmZmVyLmpzCmZ1bmN0aW9uIGJ1ZmZlcihjbG9zaW5nTm90aWZpZXIpIHsKICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHZhciBjdXJyZW50QnVmZmVyID0gW107CiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgcmV0dXJuIGN1cnJlbnRCdWZmZXIucHVzaCh2YWx1ZTIpOwogICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgIHN1YnNjcmliZXIubmV4dChjdXJyZW50QnVmZmVyKTsKICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgfSkpOwogICAgaW5uZXJGcm9tKGNsb3NpbmdOb3RpZmllcikuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbigpIHsKICAgICAgdmFyIGI2ID0gY3VycmVudEJ1ZmZlcjsKICAgICAgY3VycmVudEJ1ZmZlciA9IFtdOwogICAgICBzdWJzY3JpYmVyLm5leHQoYjYpOwogICAgfSwgbm9vcCkpOwogICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICBjdXJyZW50QnVmZmVyID0gbnVsbDsKICAgIH07CiAgfSk7Cn0KdmFyIGluaXRfYnVmZmVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2J1ZmZlci5qcyIoKSB7CiAgICBpbml0X2xpZnQoKTsKICAgIGluaXRfbm9vcCgpOwogICAgaW5pdF9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGluaXRfaW5uZXJGcm9tKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvYnVmZmVyQ291bnQuanMKZnVuY3Rpb24gYnVmZmVyQ291bnQoYnVmZmVyU2l6ZSwgc3RhcnRCdWZmZXJFdmVyeSkgewogIGlmIChzdGFydEJ1ZmZlckV2ZXJ5ID09PSB2b2lkIDApIHsKICAgIHN0YXJ0QnVmZmVyRXZlcnkgPSBudWxsOwogIH0KICBzdGFydEJ1ZmZlckV2ZXJ5ID0gc3RhcnRCdWZmZXJFdmVyeSAhPT0gbnVsbCAmJiBzdGFydEJ1ZmZlckV2ZXJ5ICE9PSB2b2lkIDAgPyBzdGFydEJ1ZmZlckV2ZXJ5IDogYnVmZmVyU2l6ZTsKICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHZhciBidWZmZXJzID0gW107CiAgICB2YXIgY291bnQyID0gMDsKICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlMikgewogICAgICB2YXIgZV8xLCBfYTEyLCBlXzIsIF9iOwogICAgICB2YXIgdG9FbWl0ID0gbnVsbDsKICAgICAgaWYgKGNvdW50MisrICUgc3RhcnRCdWZmZXJFdmVyeSA9PT0gMCkgewogICAgICAgIGJ1ZmZlcnMucHVzaChbXSk7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBmb3IgKHZhciBidWZmZXJzXzEgPSBfX3ZhbHVlcyhidWZmZXJzKSwgYnVmZmVyc18xXzEgPSBidWZmZXJzXzEubmV4dCgpOyAhYnVmZmVyc18xXzEuZG9uZTsgYnVmZmVyc18xXzEgPSBidWZmZXJzXzEubmV4dCgpKSB7CiAgICAgICAgICB2YXIgYnVmZmVyMiA9IGJ1ZmZlcnNfMV8xLnZhbHVlOwogICAgICAgICAgYnVmZmVyMi5wdXNoKHZhbHVlMik7CiAgICAgICAgICBpZiAoYnVmZmVyU2l6ZSA8PSBidWZmZXIyLmxlbmd0aCkgewogICAgICAgICAgICB0b0VtaXQgPSB0b0VtaXQgIT09IG51bGwgJiYgdG9FbWl0ICE9PSB2b2lkIDAgPyB0b0VtaXQgOiBbXTsKICAgICAgICAgICAgdG9FbWl0LnB1c2goYnVmZmVyMik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlXzFfMSkgewogICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmIChidWZmZXJzXzFfMSAmJiAhYnVmZmVyc18xXzEuZG9uZSAmJiAoX2ExMiA9IGJ1ZmZlcnNfMS5yZXR1cm4pKSBfYTEyLmNhbGwoYnVmZmVyc18xKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodG9FbWl0KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGZvciAodmFyIHRvRW1pdF8xID0gX192YWx1ZXModG9FbWl0KSwgdG9FbWl0XzFfMSA9IHRvRW1pdF8xLm5leHQoKTsgIXRvRW1pdF8xXzEuZG9uZTsgdG9FbWl0XzFfMSA9IHRvRW1pdF8xLm5leHQoKSkgewogICAgICAgICAgICB2YXIgYnVmZmVyMiA9IHRvRW1pdF8xXzEudmFsdWU7CiAgICAgICAgICAgIGFyclJlbW92ZShidWZmZXJzLCBidWZmZXIyKTsKICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGJ1ZmZlcjIpOwogICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGVfMl8xKSB7CiAgICAgICAgICBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAodG9FbWl0XzFfMSAmJiAhdG9FbWl0XzFfMS5kb25lICYmIChfYiA9IHRvRW1pdF8xLnJldHVybikpIF9iLmNhbGwodG9FbWl0XzEpOwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgIHZhciBlXzMsIF9hMTI7CiAgICAgIHRyeSB7CiAgICAgICAgZm9yICh2YXIgYnVmZmVyc18yID0gX192YWx1ZXMoYnVmZmVycyksIGJ1ZmZlcnNfMl8xID0gYnVmZmVyc18yLm5leHQoKTsgIWJ1ZmZlcnNfMl8xLmRvbmU7IGJ1ZmZlcnNfMl8xID0gYnVmZmVyc18yLm5leHQoKSkgewogICAgICAgICAgdmFyIGJ1ZmZlcjIgPSBidWZmZXJzXzJfMS52YWx1ZTsKICAgICAgICAgIHN1YnNjcmliZXIubmV4dChidWZmZXIyKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVfM18xKSB7CiAgICAgICAgZV8zID0geyBlcnJvcjogZV8zXzEgfTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKGJ1ZmZlcnNfMl8xICYmICFidWZmZXJzXzJfMS5kb25lICYmIChfYTEyID0gYnVmZmVyc18yLnJldHVybikpIF9hMTIuY2FsbChidWZmZXJzXzIpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBpZiAoZV8zKSB0aHJvdyBlXzMuZXJyb3I7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgIH0sIHZvaWQgMCwgZnVuY3Rpb24oKSB7CiAgICAgIGJ1ZmZlcnMgPSBudWxsOwogICAgfSkpOwogIH0pOwp9CnZhciBpbml0X2J1ZmZlckNvdW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2J1ZmZlckNvdW50LmpzIigpIHsKICAgIGluaXRfdHNsaWJfZXM2KCk7CiAgICBpbml0X2xpZnQoKTsKICAgIGluaXRfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICBpbml0X2FyclJlbW92ZSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2J1ZmZlclRpbWUuanMKZnVuY3Rpb24gYnVmZmVyVGltZShidWZmZXJUaW1lU3BhbikgewogIHZhciBfYTEyLCBfYjsKICB2YXIgb3RoZXJBcmdzID0gW107CiAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgIG90aGVyQXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTsKICB9CiAgdmFyIHNjaGVkdWxlciA9IChfYTEyID0gcG9wU2NoZWR1bGVyKG90aGVyQXJncykpICE9PSBudWxsICYmIF9hMTIgIT09IHZvaWQgMCA/IF9hMTIgOiBhc3luY1NjaGVkdWxlcjsKICB2YXIgYnVmZmVyQ3JlYXRpb25JbnRlcnZhbCA9IChfYiA9IG90aGVyQXJnc1swXSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbnVsbDsKICB2YXIgbWF4QnVmZmVyU2l6ZSA9IG90aGVyQXJnc1sxXSB8fCBJbmZpbml0eTsKICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIHZhciBidWZmZXJSZWNvcmRzID0gW107CiAgICB2YXIgcmVzdGFydE9uRW1pdCA9IGZhbHNlOwogICAgdmFyIGVtaXQgPSBmdW5jdGlvbihyZWNvcmQpIHsKICAgICAgdmFyIGJ1ZmZlcjIgPSByZWNvcmQuYnVmZmVyLCBzdWJzID0gcmVjb3JkLnN1YnM7CiAgICAgIHN1YnMudW5zdWJzY3JpYmUoKTsKICAgICAgYXJyUmVtb3ZlKGJ1ZmZlclJlY29yZHMsIHJlY29yZCk7CiAgICAgIHN1YnNjcmliZXIubmV4dChidWZmZXIyKTsKICAgICAgcmVzdGFydE9uRW1pdCAmJiBzdGFydEJ1ZmZlcigpOwogICAgfTsKICAgIHZhciBzdGFydEJ1ZmZlciA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAoYnVmZmVyUmVjb3JkcykgewogICAgICAgIHZhciBzdWJzID0gbmV3IFN1YnNjcmlwdGlvbigpOwogICAgICAgIHN1YnNjcmliZXIuYWRkKHN1YnMpOwogICAgICAgIHZhciBidWZmZXIyID0gW107CiAgICAgICAgdmFyIHJlY29yZF8xID0gewogICAgICAgICAgYnVmZmVyOiBidWZmZXIyLAogICAgICAgICAgc3VicwogICAgICAgIH07CiAgICAgICAgYnVmZmVyUmVjb3Jkcy5wdXNoKHJlY29yZF8xKTsKICAgICAgICBleGVjdXRlU2NoZWR1bGUoc3Vicywgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBlbWl0KHJlY29yZF8xKTsKICAgICAgICB9LCBidWZmZXJUaW1lU3Bhbik7CiAgICAgIH0KICAgIH07CiAgICBpZiAoYnVmZmVyQ3JlYXRpb25JbnRlcnZhbCAhPT0gbnVsbCAmJiBidWZmZXJDcmVhdGlvbkludGVydmFsID49IDApIHsKICAgICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgc3RhcnRCdWZmZXIsIGJ1ZmZlckNyZWF0aW9uSW50ZXJ2YWwsIHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdGFydE9uRW1pdCA9IHRydWU7CiAgICB9CiAgICBzdGFydEJ1ZmZlcigpOwogICAgdmFyIGJ1ZmZlclRpbWVTdWJzY3JpYmVyID0gY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlMikgewogICAgICB2YXIgZV8xLCBfYTEzOwogICAgICB2YXIgcmVjb3Jkc0NvcHkgPSBidWZmZXJSZWNvcmRzLnNsaWNlKCk7CiAgICAgIHRyeSB7CiAgICAgICAgZm9yICh2YXIgcmVjb3Jkc0NvcHlfMSA9IF9fdmFsdWVzKHJlY29yZHNDb3B5KSwgcmVjb3Jkc0NvcHlfMV8xID0gcmVjb3Jkc0NvcHlfMS5uZXh0KCk7ICFyZWNvcmRzQ29weV8xXzEuZG9uZTsgcmVjb3Jkc0NvcHlfMV8xID0gcmVjb3Jkc0NvcHlfMS5uZXh0KCkpIHsKICAgICAgICAgIHZhciByZWNvcmQgPSByZWNvcmRzQ29weV8xXzEudmFsdWU7CiAgICAgICAgICB2YXIgYnVmZmVyMiA9IHJlY29yZC5idWZmZXI7CiAgICAgICAgICBidWZmZXIyLnB1c2godmFsdWUyKTsKICAgICAgICAgIG1heEJ1ZmZlclNpemUgPD0gYnVmZmVyMi5sZW5ndGggJiYgZW1pdChyZWNvcmQpOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZV8xXzEpIHsKICAgICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAocmVjb3Jkc0NvcHlfMV8xICYmICFyZWNvcmRzQ29weV8xXzEuZG9uZSAmJiAoX2ExMyA9IHJlY29yZHNDb3B5XzEucmV0dXJuKSkgX2ExMy5jYWxsKHJlY29yZHNDb3B5XzEpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7CiAgICAgICAgfQogICAgICB9CiAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgd2hpbGUgKGJ1ZmZlclJlY29yZHMgPT09IG51bGwgfHwgYnVmZmVyUmVjb3JkcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnVmZmVyUmVjb3Jkcy5sZW5ndGgpIHsKICAgICAgICBzdWJzY3JpYmVyLm5leHQoYnVmZmVyUmVjb3Jkcy5zaGlmdCgpLmJ1ZmZlcik7CiAgICAgIH0KICAgICAgYnVmZmVyVGltZVN1YnNjcmliZXIgPT09IG51bGwgfHwgYnVmZmVyVGltZVN1YnNjcmliZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJ1ZmZlclRpbWVTdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7CiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgc3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgfSwgdm9pZCAwLCBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGJ1ZmZlclJlY29yZHMgPSBudWxsOwogICAgfSk7CiAgICBzb3VyY2Uuc3Vic2NyaWJlKGJ1ZmZlclRpbWVTdWJzY3JpYmVyKTsKICB9KTsKfQp2YXIgaW5pdF9idWZmZXJUaW1lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2J1ZmZlclRpbWUuanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGluaXRfU3Vic2NyaXB0aW9uKCk7CiAgICBpbml0X2xpZnQoKTsKICAgIGluaXRfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICBpbml0X2FyclJlbW92ZSgpOwogICAgaW5pdF9hc3luYygpOwogICAgaW5pdF9hcmdzKCk7CiAgICBpbml0X2V4ZWN1dGVTY2hlZHVsZSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2J1ZmZlclRvZ2dsZS5qcwp2YXIgaW5pdF9idWZmZXJUb2dnbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvYnVmZmVyVG9nZ2xlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9idWZmZXJXaGVuLmpzCnZhciBpbml0X2J1ZmZlcldoZW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvYnVmZmVyV2hlbi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvY2F0Y2hFcnJvci5qcwp2YXIgaW5pdF9jYXRjaEVycm9yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NhdGNoRXJyb3IuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3JlZHVjZS5qcwp2YXIgaW5pdF9yZWR1Y2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcmVkdWNlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90b0FycmF5LmpzCnZhciBpbml0X3RvQXJyYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdG9BcnJheS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvY29tYmluZUxhdGVzdEFsbC5qcwp2YXIgaW5pdF9jb21iaW5lTGF0ZXN0QWxsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NvbWJpbmVMYXRlc3RBbGwuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NvbWJpbmVBbGwuanMKdmFyIGluaXRfY29tYmluZUFsbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb21iaW5lQWxsLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb21iaW5lTGF0ZXN0LmpzCnZhciBpbml0X2NvbWJpbmVMYXRlc3QyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NvbWJpbmVMYXRlc3QuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NvbWJpbmVMYXRlc3RXaXRoLmpzCnZhciBpbml0X2NvbWJpbmVMYXRlc3RXaXRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NvbWJpbmVMYXRlc3RXaXRoLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb25jYXRNYXAuanMKdmFyIGluaXRfY29uY2F0TWFwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NvbmNhdE1hcC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvY29uY2F0TWFwVG8uanMKdmFyIGluaXRfY29uY2F0TWFwVG8gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvY29uY2F0TWFwVG8uanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NvbmNhdC5qcwp2YXIgaW5pdF9jb25jYXQyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NvbmNhdC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvY29uY2F0V2l0aC5qcwp2YXIgaW5pdF9jb25jYXRXaXRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NvbmNhdFdpdGguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2Nvbm5lY3QuanMKdmFyIGluaXRfY29ubmVjdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb25uZWN0LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb3VudC5qcwp2YXIgaW5pdF9jb3VudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb3VudC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGVib3VuY2UuanMKZnVuY3Rpb24gZGVib3VuY2UoZHVyYXRpb25TZWxlY3RvcikgewogIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgdmFyIGhhc1ZhbHVlID0gZmFsc2U7CiAgICB2YXIgbGFzdFZhbHVlID0gbnVsbDsKICAgIHZhciBkdXJhdGlvblN1YnNjcmliZXIgPSBudWxsOwogICAgdmFyIGVtaXQgPSBmdW5jdGlvbigpIHsKICAgICAgZHVyYXRpb25TdWJzY3JpYmVyID09PSBudWxsIHx8IGR1cmF0aW9uU3Vic2NyaWJlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZHVyYXRpb25TdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7CiAgICAgIGR1cmF0aW9uU3Vic2NyaWJlciA9IG51bGw7CiAgICAgIGlmIChoYXNWYWx1ZSkgewogICAgICAgIGhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgdmFyIHZhbHVlMiA9IGxhc3RWYWx1ZTsKICAgICAgICBsYXN0VmFsdWUgPSBudWxsOwogICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZTIpOwogICAgICB9CiAgICB9OwogICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIGR1cmF0aW9uU3Vic2NyaWJlciA9PT0gbnVsbCB8fCBkdXJhdGlvblN1YnNjcmliZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGR1cmF0aW9uU3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgICBoYXNWYWx1ZSA9IHRydWU7CiAgICAgIGxhc3RWYWx1ZSA9IHZhbHVlMjsKICAgICAgZHVyYXRpb25TdWJzY3JpYmVyID0gY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGVtaXQsIG5vb3ApOwogICAgICBpbm5lckZyb20oZHVyYXRpb25TZWxlY3Rvcih2YWx1ZTIpKS5zdWJzY3JpYmUoZHVyYXRpb25TdWJzY3JpYmVyKTsKICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICBlbWl0KCk7CiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgIH0sIHZvaWQgMCwgZnVuY3Rpb24oKSB7CiAgICAgIGxhc3RWYWx1ZSA9IGR1cmF0aW9uU3Vic2NyaWJlciA9IG51bGw7CiAgICB9KSk7CiAgfSk7Cn0KdmFyIGluaXRfZGVib3VuY2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGVib3VuY2UuanMiKCkgewogICAgaW5pdF9saWZ0KCk7CiAgICBpbml0X25vb3AoKTsKICAgIGluaXRfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICBpbml0X2lubmVyRnJvbSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2RlYm91bmNlVGltZS5qcwpmdW5jdGlvbiBkZWJvdW5jZVRpbWUoZHVlVGltZSwgc2NoZWR1bGVyKSB7CiAgaWYgKHNjaGVkdWxlciA9PT0gdm9pZCAwKSB7CiAgICBzY2hlZHVsZXIgPSBhc3luY1NjaGVkdWxlcjsKICB9CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICB2YXIgYWN0aXZlVGFzayA9IG51bGw7CiAgICB2YXIgbGFzdFZhbHVlID0gbnVsbDsKICAgIHZhciBsYXN0VGltZSA9IG51bGw7CiAgICB2YXIgZW1pdCA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAoYWN0aXZlVGFzaykgewogICAgICAgIGFjdGl2ZVRhc2sudW5zdWJzY3JpYmUoKTsKICAgICAgICBhY3RpdmVUYXNrID0gbnVsbDsKICAgICAgICB2YXIgdmFsdWUyID0gbGFzdFZhbHVlOwogICAgICAgIGxhc3RWYWx1ZSA9IG51bGw7CiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlMik7CiAgICAgIH0KICAgIH07CiAgICBmdW5jdGlvbiBlbWl0V2hlbklkbGUoKSB7CiAgICAgIHZhciB0YXJnZXRUaW1lID0gbGFzdFRpbWUgKyBkdWVUaW1lOwogICAgICB2YXIgbm93MiA9IHNjaGVkdWxlci5ub3coKTsKICAgICAgaWYgKG5vdzIgPCB0YXJnZXRUaW1lKSB7CiAgICAgICAgYWN0aXZlVGFzayA9IHRoaXMuc2NoZWR1bGUodm9pZCAwLCB0YXJnZXRUaW1lIC0gbm93Mik7CiAgICAgICAgc3Vic2NyaWJlci5hZGQoYWN0aXZlVGFzayk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGVtaXQoKTsKICAgIH0KICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlMikgewogICAgICBsYXN0VmFsdWUgPSB2YWx1ZTI7CiAgICAgIGxhc3RUaW1lID0gc2NoZWR1bGVyLm5vdygpOwogICAgICBpZiAoIWFjdGl2ZVRhc2spIHsKICAgICAgICBhY3RpdmVUYXNrID0gc2NoZWR1bGVyLnNjaGVkdWxlKGVtaXRXaGVuSWRsZSwgZHVlVGltZSk7CiAgICAgICAgc3Vic2NyaWJlci5hZGQoYWN0aXZlVGFzayk7CiAgICAgIH0KICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICBlbWl0KCk7CiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgIH0sIHZvaWQgMCwgZnVuY3Rpb24oKSB7CiAgICAgIGxhc3RWYWx1ZSA9IGFjdGl2ZVRhc2sgPSBudWxsOwogICAgfSkpOwogIH0pOwp9CnZhciBpbml0X2RlYm91bmNlVGltZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9kZWJvdW5jZVRpbWUuanMiKCkgewogICAgaW5pdF9hc3luYygpOwogICAgaW5pdF9saWZ0KCk7CiAgICBpbml0X09wZXJhdG9yU3Vic2NyaWJlcigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2RlZmF1bHRJZkVtcHR5LmpzCnZhciBpbml0X2RlZmF1bHRJZkVtcHR5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2RlZmF1bHRJZkVtcHR5LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90YWtlLmpzCnZhciBpbml0X3Rha2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGFrZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvaWdub3JlRWxlbWVudHMuanMKdmFyIGluaXRfaWdub3JlRWxlbWVudHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvaWdub3JlRWxlbWVudHMuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21hcFRvLmpzCnZhciBpbml0X21hcFRvID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21hcFRvLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9kZWxheVdoZW4uanMKdmFyIGluaXRfZGVsYXlXaGVuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2RlbGF5V2hlbi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGVsYXkuanMKdmFyIGluaXRfZGVsYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGVsYXkuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2RlbWF0ZXJpYWxpemUuanMKdmFyIGluaXRfZGVtYXRlcmlhbGl6ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9kZW1hdGVyaWFsaXplLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9kaXN0aW5jdC5qcwp2YXIgaW5pdF9kaXN0aW5jdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9kaXN0aW5jdC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGlzdGluY3RVbnRpbENoYW5nZWQuanMKdmFyIGluaXRfZGlzdGluY3RVbnRpbENoYW5nZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGlzdGluY3RVbnRpbENoYW5nZWQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2Rpc3RpbmN0VW50aWxLZXlDaGFuZ2VkLmpzCnZhciBpbml0X2Rpc3RpbmN0VW50aWxLZXlDaGFuZ2VkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2Rpc3RpbmN0VW50aWxLZXlDaGFuZ2VkLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90aHJvd0lmRW1wdHkuanMKdmFyIGluaXRfdGhyb3dJZkVtcHR5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rocm93SWZFbXB0eS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZWxlbWVudEF0LmpzCnZhciBpbml0X2VsZW1lbnRBdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9lbGVtZW50QXQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2VuZFdpdGguanMKdmFyIGluaXRfZW5kV2l0aCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9lbmRXaXRoLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9ldmVyeS5qcwp2YXIgaW5pdF9ldmVyeSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9ldmVyeS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZXhoYXVzdE1hcC5qcwp2YXIgaW5pdF9leGhhdXN0TWFwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2V4aGF1c3RNYXAuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2V4aGF1c3RBbGwuanMKdmFyIGluaXRfZXhoYXVzdEFsbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9leGhhdXN0QWxsLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9leGhhdXN0LmpzCnZhciBpbml0X2V4aGF1c3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZXhoYXVzdC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZXhwYW5kLmpzCnZhciBpbml0X2V4cGFuZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9leHBhbmQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpbmFsaXplLmpzCnZhciBpbml0X2ZpbmFsaXplID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpbmFsaXplLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9maW5kLmpzCnZhciBpbml0X2ZpbmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZmluZC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZmluZEluZGV4LmpzCnZhciBpbml0X2ZpbmRJbmRleCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9maW5kSW5kZXguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpcnN0LmpzCnZhciBpbml0X2ZpcnN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpcnN0LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9ncm91cEJ5LmpzCnZhciBpbml0X2dyb3VwQnkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZ3JvdXBCeS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvaXNFbXB0eS5qcwp2YXIgaW5pdF9pc0VtcHR5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2lzRW1wdHkuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rha2VMYXN0LmpzCnZhciBpbml0X3Rha2VMYXN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rha2VMYXN0LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9sYXN0LmpzCnZhciBpbml0X2xhc3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbGFzdC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWF0ZXJpYWxpemUuanMKdmFyIGluaXRfbWF0ZXJpYWxpemUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWF0ZXJpYWxpemUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21heC5qcwp2YXIgaW5pdF9tYXggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWF4LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9mbGF0TWFwLmpzCnZhciBpbml0X2ZsYXRNYXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZmxhdE1hcC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWVyZ2VNYXBUby5qcwp2YXIgaW5pdF9tZXJnZU1hcFRvID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlTWFwVG8uanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlU2Nhbi5qcwp2YXIgaW5pdF9tZXJnZVNjYW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWVyZ2VTY2FuLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZS5qcwp2YXIgaW5pdF9tZXJnZTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWVyZ2UuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21lcmdlV2l0aC5qcwp2YXIgaW5pdF9tZXJnZVdpdGggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWVyZ2VXaXRoLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9taW4uanMKdmFyIGluaXRfbWluID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL21pbi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbXVsdGljYXN0LmpzCnZhciBpbml0X211bHRpY2FzdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tdWx0aWNhc3QuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL29uRXJyb3JSZXN1bWVOZXh0V2l0aC5qcwp2YXIgaW5pdF9vbkVycm9yUmVzdW1lTmV4dFdpdGggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvb25FcnJvclJlc3VtZU5leHRXaXRoLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9wYWlyd2lzZS5qcwp2YXIgaW5pdF9wYWlyd2lzZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9wYWlyd2lzZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcGx1Y2suanMKdmFyIGluaXRfcGx1Y2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcGx1Y2suanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3B1Ymxpc2guanMKdmFyIGluaXRfcHVibGlzaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9wdWJsaXNoLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9wdWJsaXNoQmVoYXZpb3IuanMKdmFyIGluaXRfcHVibGlzaEJlaGF2aW9yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3B1Ymxpc2hCZWhhdmlvci5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcHVibGlzaExhc3QuanMKdmFyIGluaXRfcHVibGlzaExhc3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcHVibGlzaExhc3QuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3B1Ymxpc2hSZXBsYXkuanMKdmFyIGluaXRfcHVibGlzaFJlcGxheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9wdWJsaXNoUmVwbGF5LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9yYWNlV2l0aC5qcwp2YXIgaW5pdF9yYWNlV2l0aCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9yYWNlV2l0aC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcmVwZWF0LmpzCnZhciBpbml0X3JlcGVhdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9yZXBlYXQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3JlcGVhdFdoZW4uanMKdmFyIGluaXRfcmVwZWF0V2hlbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9yZXBlYXRXaGVuLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9yZXRyeS5qcwp2YXIgaW5pdF9yZXRyeSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9yZXRyeS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcmV0cnlXaGVuLmpzCnZhciBpbml0X3JldHJ5V2hlbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9yZXRyeVdoZW4uanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3NhbXBsZS5qcwp2YXIgaW5pdF9zYW1wbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc2FtcGxlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9zYW1wbGVUaW1lLmpzCnZhciBpbml0X3NhbXBsZVRpbWUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc2FtcGxlVGltZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc2Nhbi5qcwp2YXIgaW5pdF9zY2FuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3NjYW4uanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3NlcXVlbmNlRXF1YWwuanMKdmFyIGluaXRfc2VxdWVuY2VFcXVhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9zZXF1ZW5jZUVxdWFsLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9zaGFyZS5qcwpmdW5jdGlvbiBzaGFyZShvcHRpb25zKSB7CiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgewogICAgb3B0aW9ucyA9IHt9OwogIH0KICB2YXIgX2ExMiA9IG9wdGlvbnMuY29ubmVjdG9yLCBjb25uZWN0b3IgPSBfYTEyID09PSB2b2lkIDAgPyBmdW5jdGlvbigpIHsKICAgIHJldHVybiBuZXcgU3ViamVjdCgpOwogIH0gOiBfYTEyLCBfYiA9IG9wdGlvbnMucmVzZXRPbkVycm9yLCByZXNldE9uRXJyb3IgPSBfYiA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9iLCBfYyA9IG9wdGlvbnMucmVzZXRPbkNvbXBsZXRlLCByZXNldE9uQ29tcGxldGUgPSBfYyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9jLCBfZCA9IG9wdGlvbnMucmVzZXRPblJlZkNvdW50WmVybywgcmVzZXRPblJlZkNvdW50WmVybyA9IF9kID09PSB2b2lkIDAgPyB0cnVlIDogX2Q7CiAgcmV0dXJuIGZ1bmN0aW9uKHdyYXBwZXJTb3VyY2UpIHsKICAgIHZhciBjb25uZWN0aW9uOwogICAgdmFyIHJlc2V0Q29ubmVjdGlvbjsKICAgIHZhciBzdWJqZWN0OwogICAgdmFyIHJlZkNvdW50MiA9IDA7CiAgICB2YXIgaGFzQ29tcGxldGVkID0gZmFsc2U7CiAgICB2YXIgaGFzRXJyb3JlZCA9IGZhbHNlOwogICAgdmFyIGNhbmNlbFJlc2V0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHJlc2V0Q29ubmVjdGlvbiA9PT0gbnVsbCB8fCByZXNldENvbm5lY3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc2V0Q29ubmVjdGlvbi51bnN1YnNjcmliZSgpOwogICAgICByZXNldENvbm5lY3Rpb24gPSB2b2lkIDA7CiAgICB9OwogICAgdmFyIHJlc2V0ID0gZnVuY3Rpb24oKSB7CiAgICAgIGNhbmNlbFJlc2V0KCk7CiAgICAgIGNvbm5lY3Rpb24gPSBzdWJqZWN0ID0gdm9pZCAwOwogICAgICBoYXNDb21wbGV0ZWQgPSBoYXNFcnJvcmVkID0gZmFsc2U7CiAgICB9OwogICAgdmFyIHJlc2V0QW5kVW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIGNvbm4gPSBjb25uZWN0aW9uOwogICAgICByZXNldCgpOwogICAgICBjb25uID09PSBudWxsIHx8IGNvbm4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbm4udW5zdWJzY3JpYmUoKTsKICAgIH07CiAgICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgICAgcmVmQ291bnQyKys7CiAgICAgIGlmICghaGFzRXJyb3JlZCAmJiAhaGFzQ29tcGxldGVkKSB7CiAgICAgICAgY2FuY2VsUmVzZXQoKTsKICAgICAgfQogICAgICB2YXIgZGVzdCA9IHN1YmplY3QgPSBzdWJqZWN0ICE9PSBudWxsICYmIHN1YmplY3QgIT09IHZvaWQgMCA/IHN1YmplY3QgOiBjb25uZWN0b3IoKTsKICAgICAgc3Vic2NyaWJlci5hZGQoZnVuY3Rpb24oKSB7CiAgICAgICAgcmVmQ291bnQyLS07CiAgICAgICAgaWYgKHJlZkNvdW50MiA9PT0gMCAmJiAhaGFzRXJyb3JlZCAmJiAhaGFzQ29tcGxldGVkKSB7CiAgICAgICAgICByZXNldENvbm5lY3Rpb24gPSBoYW5kbGVSZXNldChyZXNldEFuZFVuc3Vic2NyaWJlLCByZXNldE9uUmVmQ291bnRaZXJvKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBkZXN0LnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgICAgaWYgKCFjb25uZWN0aW9uICYmIHJlZkNvdW50MiA+IDApIHsKICAgICAgICBjb25uZWN0aW9uID0gbmV3IFNhZmVTdWJzY3JpYmVyKHsKICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uKHZhbHVlMikgewogICAgICAgICAgICByZXR1cm4gZGVzdC5uZXh0KHZhbHVlMik7CiAgICAgICAgICB9LAogICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICBoYXNFcnJvcmVkID0gdHJ1ZTsKICAgICAgICAgICAgY2FuY2VsUmVzZXQoKTsKICAgICAgICAgICAgcmVzZXRDb25uZWN0aW9uID0gaGFuZGxlUmVzZXQocmVzZXQsIHJlc2V0T25FcnJvciwgZXJyKTsKICAgICAgICAgICAgZGVzdC5lcnJvcihlcnIpOwogICAgICAgICAgfSwKICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaGFzQ29tcGxldGVkID0gdHJ1ZTsKICAgICAgICAgICAgY2FuY2VsUmVzZXQoKTsKICAgICAgICAgICAgcmVzZXRDb25uZWN0aW9uID0gaGFuZGxlUmVzZXQocmVzZXQsIHJlc2V0T25Db21wbGV0ZSk7CiAgICAgICAgICAgIGRlc3QuY29tcGxldGUoKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBpbm5lckZyb20oc291cmNlKS5zdWJzY3JpYmUoY29ubmVjdGlvbik7CiAgICAgIH0KICAgIH0pKHdyYXBwZXJTb3VyY2UpOwogIH07Cn0KZnVuY3Rpb24gaGFuZGxlUmVzZXQocmVzZXQsIG9uKSB7CiAgdmFyIGFyZ3MgPSBbXTsKICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgYXJnc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTsKICB9CiAgaWYgKG9uID09PSB0cnVlKSB7CiAgICByZXNldCgpOwogICAgcmV0dXJuOwogIH0KICBpZiAob24gPT09IGZhbHNlKSB7CiAgICByZXR1cm47CiAgfQogIHZhciBvblN1YnNjcmliZXIgPSBuZXcgU2FmZVN1YnNjcmliZXIoewogICAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICAgIG9uU3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgICByZXNldCgpOwogICAgfQogIH0pOwogIHJldHVybiBpbm5lckZyb20ob24uYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoYXJncykpKSkuc3Vic2NyaWJlKG9uU3Vic2NyaWJlcik7Cn0KdmFyIGluaXRfc2hhcmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc2hhcmUuanMiKCkgewogICAgaW5pdF90c2xpYl9lczYoKTsKICAgIGluaXRfaW5uZXJGcm9tKCk7CiAgICBpbml0X1N1YmplY3QoKTsKICAgIGluaXRfU3Vic2NyaWJlcigpOwogICAgaW5pdF9saWZ0KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc2hhcmVSZXBsYXkuanMKZnVuY3Rpb24gc2hhcmVSZXBsYXkoY29uZmlnT3JCdWZmZXJTaXplLCB3aW5kb3dUaW1lMiwgc2NoZWR1bGVyKSB7CiAgdmFyIF9hMTIsIF9iLCBfYzsKICB2YXIgYnVmZmVyU2l6ZTsKICB2YXIgcmVmQ291bnQyID0gZmFsc2U7CiAgaWYgKGNvbmZpZ09yQnVmZmVyU2l6ZSAmJiB0eXBlb2YgY29uZmlnT3JCdWZmZXJTaXplID09PSAib2JqZWN0IikgewogICAgX2ExMiA9IGNvbmZpZ09yQnVmZmVyU2l6ZS5idWZmZXJTaXplLCBidWZmZXJTaXplID0gX2ExMiA9PT0gdm9pZCAwID8gSW5maW5pdHkgOiBfYTEyLCBfYiA9IGNvbmZpZ09yQnVmZmVyU2l6ZS53aW5kb3dUaW1lLCB3aW5kb3dUaW1lMiA9IF9iID09PSB2b2lkIDAgPyBJbmZpbml0eSA6IF9iLCBfYyA9IGNvbmZpZ09yQnVmZmVyU2l6ZS5yZWZDb3VudCwgcmVmQ291bnQyID0gX2MgPT09IHZvaWQgMCA/IGZhbHNlIDogX2MsIHNjaGVkdWxlciA9IGNvbmZpZ09yQnVmZmVyU2l6ZS5zY2hlZHVsZXI7CiAgfSBlbHNlIHsKICAgIGJ1ZmZlclNpemUgPSBjb25maWdPckJ1ZmZlclNpemUgIT09IG51bGwgJiYgY29uZmlnT3JCdWZmZXJTaXplICE9PSB2b2lkIDAgPyBjb25maWdPckJ1ZmZlclNpemUgOiBJbmZpbml0eTsKICB9CiAgcmV0dXJuIHNoYXJlKHsKICAgIGNvbm5lY3RvcjogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBuZXcgUmVwbGF5U3ViamVjdChidWZmZXJTaXplLCB3aW5kb3dUaW1lMiwgc2NoZWR1bGVyKTsKICAgIH0sCiAgICByZXNldE9uRXJyb3I6IHRydWUsCiAgICByZXNldE9uQ29tcGxldGU6IGZhbHNlLAogICAgcmVzZXRPblJlZkNvdW50WmVybzogcmVmQ291bnQyCiAgfSk7Cn0KdmFyIGluaXRfc2hhcmVSZXBsYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc2hhcmVSZXBsYXkuanMiKCkgewogICAgaW5pdF9SZXBsYXlTdWJqZWN0KCk7CiAgICBpbml0X3NoYXJlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc2luZ2xlLmpzCnZhciBpbml0X3NpbmdsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9zaW5nbGUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3NraXAuanMKdmFyIGluaXRfc2tpcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9za2lwLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9za2lwTGFzdC5qcwp2YXIgaW5pdF9za2lwTGFzdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9za2lwTGFzdC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc2tpcFVudGlsLmpzCnZhciBpbml0X3NraXBVbnRpbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9za2lwVW50aWwuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3NraXBXaGlsZS5qcwp2YXIgaW5pdF9za2lwV2hpbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc2tpcFdoaWxlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9zdGFydFdpdGguanMKZnVuY3Rpb24gc3RhcnRXaXRoKCkgewogIHZhciB2YWx1ZXMgPSBbXTsKICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgdmFsdWVzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgfQogIHZhciBzY2hlZHVsZXIgPSBwb3BTY2hlZHVsZXIodmFsdWVzKTsKICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHsKICAgIChzY2hlZHVsZXIgPyBjb25jYXQodmFsdWVzLCBzb3VyY2UsIHNjaGVkdWxlcikgOiBjb25jYXQodmFsdWVzLCBzb3VyY2UpKS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgfSk7Cn0KdmFyIGluaXRfc3RhcnRXaXRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3N0YXJ0V2l0aC5qcyIoKSB7CiAgICBpbml0X2NvbmNhdCgpOwogICAgaW5pdF9hcmdzKCk7CiAgICBpbml0X2xpZnQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9zd2l0Y2hNYXAuanMKdmFyIGluaXRfc3dpdGNoTWFwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3N3aXRjaE1hcC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc3dpdGNoQWxsLmpzCnZhciBpbml0X3N3aXRjaEFsbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9zd2l0Y2hBbGwuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3N3aXRjaE1hcFRvLmpzCnZhciBpbml0X3N3aXRjaE1hcFRvID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3N3aXRjaE1hcFRvLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9zd2l0Y2hTY2FuLmpzCnZhciBpbml0X3N3aXRjaFNjYW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc3dpdGNoU2Nhbi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGFrZVVudGlsLmpzCmZ1bmN0aW9uIHRha2VVbnRpbChub3RpZmllcikgewogIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikgewogICAgaW5uZXJGcm9tKG5vdGlmaWVyKS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgfSwgbm9vcCkpOwogICAgIXN1YnNjcmliZXIuY2xvc2VkICYmIHNvdXJjZS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgfSk7Cn0KdmFyIGluaXRfdGFrZVVudGlsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rha2VVbnRpbC5qcyIoKSB7CiAgICBpbml0X2xpZnQoKTsKICAgIGluaXRfT3BlcmF0b3JTdWJzY3JpYmVyKCk7CiAgICBpbml0X2lubmVyRnJvbSgpOwogICAgaW5pdF9ub29wKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGFrZVdoaWxlLmpzCnZhciBpbml0X3Rha2VXaGlsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90YWtlV2hpbGUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3RhcC5qcwp2YXIgaW5pdF90YXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGFwLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90aHJvdHRsZS5qcwpmdW5jdGlvbiB0aHJvdHRsZShkdXJhdGlvblNlbGVjdG9yLCBjb25maWczKSB7CiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7CiAgICB2YXIgX2ExMiA9IGNvbmZpZzMgIT09IG51bGwgJiYgY29uZmlnMyAhPT0gdm9pZCAwID8gY29uZmlnMyA6IHt9LCBfYiA9IF9hMTIubGVhZGluZywgbGVhZGluZyA9IF9iID09PSB2b2lkIDAgPyB0cnVlIDogX2IsIF9jID0gX2ExMi50cmFpbGluZywgdHJhaWxpbmcgPSBfYyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYzsKICAgIHZhciBoYXNWYWx1ZSA9IGZhbHNlOwogICAgdmFyIHNlbmRWYWx1ZSA9IG51bGw7CiAgICB2YXIgdGhyb3R0bGVkID0gbnVsbDsKICAgIHZhciBpc0NvbXBsZXRlID0gZmFsc2U7CiAgICB2YXIgZW5kVGhyb3R0bGluZyA9IGZ1bmN0aW9uKCkgewogICAgICB0aHJvdHRsZWQgPT09IG51bGwgfHwgdGhyb3R0bGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0aHJvdHRsZWQudW5zdWJzY3JpYmUoKTsKICAgICAgdGhyb3R0bGVkID0gbnVsbDsKICAgICAgaWYgKHRyYWlsaW5nKSB7CiAgICAgICAgc2VuZCgpOwogICAgICAgIGlzQ29tcGxldGUgJiYgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICB9CiAgICB9OwogICAgdmFyIGNsZWFudXBUaHJvdHRsaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgIHRocm90dGxlZCA9IG51bGw7CiAgICAgIGlzQ29tcGxldGUgJiYgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgfTsKICAgIHZhciBzdGFydFRocm90dGxlID0gZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIHJldHVybiB0aHJvdHRsZWQgPSBpbm5lckZyb20oZHVyYXRpb25TZWxlY3Rvcih2YWx1ZTIpKS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGVuZFRocm90dGxpbmcsIGNsZWFudXBUaHJvdHRsaW5nKSk7CiAgICB9OwogICAgdmFyIHNlbmQgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKGhhc1ZhbHVlKSB7CiAgICAgICAgaGFzVmFsdWUgPSBmYWxzZTsKICAgICAgICB2YXIgdmFsdWUyID0gc2VuZFZhbHVlOwogICAgICAgIHNlbmRWYWx1ZSA9IG51bGw7CiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlMik7CiAgICAgICAgIWlzQ29tcGxldGUgJiYgc3RhcnRUaHJvdHRsZSh2YWx1ZTIpOwogICAgICB9CiAgICB9OwogICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIGhhc1ZhbHVlID0gdHJ1ZTsKICAgICAgc2VuZFZhbHVlID0gdmFsdWUyOwogICAgICAhKHRocm90dGxlZCAmJiAhdGhyb3R0bGVkLmNsb3NlZCkgJiYgKGxlYWRpbmcgPyBzZW5kKCkgOiBzdGFydFRocm90dGxlKHZhbHVlMikpOwogICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgIGlzQ29tcGxldGUgPSB0cnVlOwogICAgICAhKHRyYWlsaW5nICYmIGhhc1ZhbHVlICYmIHRocm90dGxlZCAmJiAhdGhyb3R0bGVkLmNsb3NlZCkgJiYgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgfSkpOwogIH0pOwp9CnZhciBpbml0X3Rocm90dGxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rocm90dGxlLmpzIigpIHsKICAgIGluaXRfbGlmdCgpOwogICAgaW5pdF9PcGVyYXRvclN1YnNjcmliZXIoKTsKICAgIGluaXRfaW5uZXJGcm9tKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGhyb3R0bGVUaW1lLmpzCmZ1bmN0aW9uIHRocm90dGxlVGltZShkdXJhdGlvbiwgc2NoZWR1bGVyLCBjb25maWczKSB7CiAgaWYgKHNjaGVkdWxlciA9PT0gdm9pZCAwKSB7CiAgICBzY2hlZHVsZXIgPSBhc3luY1NjaGVkdWxlcjsKICB9CiAgdmFyIGR1cmF0aW9uJCA9IHRpbWVyKGR1cmF0aW9uLCBzY2hlZHVsZXIpOwogIHJldHVybiB0aHJvdHRsZShmdW5jdGlvbigpIHsKICAgIHJldHVybiBkdXJhdGlvbiQ7CiAgfSwgY29uZmlnMyk7Cn0KdmFyIGluaXRfdGhyb3R0bGVUaW1lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rocm90dGxlVGltZS5qcyIoKSB7CiAgICBpbml0X2FzeW5jKCk7CiAgICBpbml0X3Rocm90dGxlKCk7CiAgICBpbml0X3RpbWVyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGltZUludGVydmFsLmpzCnZhciBpbml0X3RpbWVJbnRlcnZhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90aW1lSW50ZXJ2YWwuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3RpbWVvdXRXaXRoLmpzCnZhciBpbml0X3RpbWVvdXRXaXRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3RpbWVvdXRXaXRoLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90aW1lc3RhbXAuanMKdmFyIGluaXRfdGltZXN0YW1wID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3RpbWVzdGFtcC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvd2luZG93LmpzCnZhciBpbml0X3dpbmRvdyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy93aW5kb3cuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3dpbmRvd0NvdW50LmpzCnZhciBpbml0X3dpbmRvd0NvdW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3dpbmRvd0NvdW50LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy93aW5kb3dUaW1lLmpzCnZhciBpbml0X3dpbmRvd1RpbWUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvd2luZG93VGltZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvd2luZG93VG9nZ2xlLmpzCnZhciBpbml0X3dpbmRvd1RvZ2dsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy93aW5kb3dUb2dnbGUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3dpbmRvd1doZW4uanMKdmFyIGluaXRfd2luZG93V2hlbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy93aW5kb3dXaGVuLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy93aXRoTGF0ZXN0RnJvbS5qcwp2YXIgaW5pdF93aXRoTGF0ZXN0RnJvbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy93aXRoTGF0ZXN0RnJvbS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvemlwQWxsLmpzCnZhciBpbml0X3ppcEFsbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy96aXBBbGwuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3ppcC5qcwp2YXIgaW5pdF96aXAyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3ppcC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvemlwV2l0aC5qcwp2YXIgaW5pdF96aXBXaXRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3ppcFdpdGguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW5kZXguanMKdmFyIGluaXRfZXNtNSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2luZGV4LmpzIigpIHsKICAgIGluaXRfT2JzZXJ2YWJsZSgpOwogICAgaW5pdF9Db25uZWN0YWJsZU9ic2VydmFibGUoKTsKICAgIGluaXRfb2JzZXJ2YWJsZSgpOwogICAgaW5pdF9hbmltYXRpb25GcmFtZXMoKTsKICAgIGluaXRfU3ViamVjdCgpOwogICAgaW5pdF9CZWhhdmlvclN1YmplY3QoKTsKICAgIGluaXRfUmVwbGF5U3ViamVjdCgpOwogICAgaW5pdF9Bc3luY1N1YmplY3QoKTsKICAgIGluaXRfYXNhcCgpOwogICAgaW5pdF9hc3luYygpOwogICAgaW5pdF9xdWV1ZSgpOwogICAgaW5pdF9hbmltYXRpb25GcmFtZSgpOwogICAgaW5pdF9WaXJ0dWFsVGltZVNjaGVkdWxlcigpOwogICAgaW5pdF9TY2hlZHVsZXIoKTsKICAgIGluaXRfU3Vic2NyaXB0aW9uKCk7CiAgICBpbml0X1N1YnNjcmliZXIoKTsKICAgIGluaXRfTm90aWZpY2F0aW9uKCk7CiAgICBpbml0X3BpcGUoKTsKICAgIGluaXRfbm9vcCgpOwogICAgaW5pdF9pZGVudGl0eSgpOwogICAgaW5pdF9pc09ic2VydmFibGUoKTsKICAgIGluaXRfbGFzdFZhbHVlRnJvbSgpOwogICAgaW5pdF9maXJzdFZhbHVlRnJvbSgpOwogICAgaW5pdF9Bcmd1bWVudE91dE9mUmFuZ2VFcnJvcigpOwogICAgaW5pdF9FbXB0eUVycm9yKCk7CiAgICBpbml0X05vdEZvdW5kRXJyb3IoKTsKICAgIGluaXRfT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IoKTsKICAgIGluaXRfU2VxdWVuY2VFcnJvcigpOwogICAgaW5pdF90aW1lb3V0KCk7CiAgICBpbml0X1Vuc3Vic2NyaXB0aW9uRXJyb3IoKTsKICAgIGluaXRfYmluZENhbGxiYWNrKCk7CiAgICBpbml0X2JpbmROb2RlQ2FsbGJhY2soKTsKICAgIGluaXRfY29tYmluZUxhdGVzdCgpOwogICAgaW5pdF9jb25jYXQoKTsKICAgIGluaXRfY29ubmVjdGFibGUoKTsKICAgIGluaXRfZGVmZXIoKTsKICAgIGluaXRfZW1wdHkoKTsKICAgIGluaXRfZm9ya0pvaW4oKTsKICAgIGluaXRfZnJvbSgpOwogICAgaW5pdF9mcm9tRXZlbnQoKTsKICAgIGluaXRfZnJvbUV2ZW50UGF0dGVybigpOwogICAgaW5pdF9nZW5lcmF0ZSgpOwogICAgaW5pdF9paWYoKTsKICAgIGluaXRfaW50ZXJ2YWwoKTsKICAgIGluaXRfbWVyZ2UoKTsKICAgIGluaXRfbmV2ZXIoKTsKICAgIGluaXRfb2YoKTsKICAgIGluaXRfb25FcnJvclJlc3VtZU5leHQoKTsKICAgIGluaXRfcGFpcnMoKTsKICAgIGluaXRfcGFydGl0aW9uKCk7CiAgICBpbml0X3JhY2UoKTsKICAgIGluaXRfcmFuZ2UoKTsKICAgIGluaXRfdGhyb3dFcnJvcigpOwogICAgaW5pdF90aW1lcigpOwogICAgaW5pdF91c2luZygpOwogICAgaW5pdF96aXAoKTsKICAgIGluaXRfc2NoZWR1bGVkKCk7CiAgICBpbml0X2VtcHR5KCk7CiAgICBpbml0X25ldmVyKCk7CiAgICBpbml0X3R5cGVzKCk7CiAgICBpbml0X2NvbmZpZygpOwogICAgaW5pdF9hdWRpdCgpOwogICAgaW5pdF9hdWRpdFRpbWUoKTsKICAgIGluaXRfYnVmZmVyKCk7CiAgICBpbml0X2J1ZmZlckNvdW50KCk7CiAgICBpbml0X2J1ZmZlclRpbWUoKTsKICAgIGluaXRfYnVmZmVyVG9nZ2xlKCk7CiAgICBpbml0X2J1ZmZlcldoZW4oKTsKICAgIGluaXRfY2F0Y2hFcnJvcigpOwogICAgaW5pdF9jb21iaW5lQWxsKCk7CiAgICBpbml0X2NvbWJpbmVMYXRlc3RBbGwoKTsKICAgIGluaXRfY29tYmluZUxhdGVzdFdpdGgoKTsKICAgIGluaXRfY29uY2F0QWxsKCk7CiAgICBpbml0X2NvbmNhdE1hcCgpOwogICAgaW5pdF9jb25jYXRNYXBUbygpOwogICAgaW5pdF9jb25jYXRXaXRoKCk7CiAgICBpbml0X2Nvbm5lY3QoKTsKICAgIGluaXRfY291bnQoKTsKICAgIGluaXRfZGVib3VuY2UoKTsKICAgIGluaXRfZGVib3VuY2VUaW1lKCk7CiAgICBpbml0X2RlZmF1bHRJZkVtcHR5KCk7CiAgICBpbml0X2RlbGF5KCk7CiAgICBpbml0X2RlbGF5V2hlbigpOwogICAgaW5pdF9kZW1hdGVyaWFsaXplKCk7CiAgICBpbml0X2Rpc3RpbmN0KCk7CiAgICBpbml0X2Rpc3RpbmN0VW50aWxDaGFuZ2VkKCk7CiAgICBpbml0X2Rpc3RpbmN0VW50aWxLZXlDaGFuZ2VkKCk7CiAgICBpbml0X2VsZW1lbnRBdCgpOwogICAgaW5pdF9lbmRXaXRoKCk7CiAgICBpbml0X2V2ZXJ5KCk7CiAgICBpbml0X2V4aGF1c3QoKTsKICAgIGluaXRfZXhoYXVzdEFsbCgpOwogICAgaW5pdF9leGhhdXN0TWFwKCk7CiAgICBpbml0X2V4cGFuZCgpOwogICAgaW5pdF9maWx0ZXIoKTsKICAgIGluaXRfZmluYWxpemUoKTsKICAgIGluaXRfZmluZCgpOwogICAgaW5pdF9maW5kSW5kZXgoKTsKICAgIGluaXRfZmlyc3QoKTsKICAgIGluaXRfZ3JvdXBCeSgpOwogICAgaW5pdF9pZ25vcmVFbGVtZW50cygpOwogICAgaW5pdF9pc0VtcHR5KCk7CiAgICBpbml0X2xhc3QoKTsKICAgIGluaXRfbWFwKCk7CiAgICBpbml0X21hcFRvKCk7CiAgICBpbml0X21hdGVyaWFsaXplKCk7CiAgICBpbml0X21heCgpOwogICAgaW5pdF9tZXJnZUFsbCgpOwogICAgaW5pdF9mbGF0TWFwKCk7CiAgICBpbml0X21lcmdlTWFwKCk7CiAgICBpbml0X21lcmdlTWFwVG8oKTsKICAgIGluaXRfbWVyZ2VTY2FuKCk7CiAgICBpbml0X21lcmdlV2l0aCgpOwogICAgaW5pdF9taW4oKTsKICAgIGluaXRfbXVsdGljYXN0KCk7CiAgICBpbml0X29ic2VydmVPbigpOwogICAgaW5pdF9vbkVycm9yUmVzdW1lTmV4dFdpdGgoKTsKICAgIGluaXRfcGFpcndpc2UoKTsKICAgIGluaXRfcGx1Y2soKTsKICAgIGluaXRfcHVibGlzaCgpOwogICAgaW5pdF9wdWJsaXNoQmVoYXZpb3IoKTsKICAgIGluaXRfcHVibGlzaExhc3QoKTsKICAgIGluaXRfcHVibGlzaFJlcGxheSgpOwogICAgaW5pdF9yYWNlV2l0aCgpOwogICAgaW5pdF9yZWR1Y2UoKTsKICAgIGluaXRfcmVwZWF0KCk7CiAgICBpbml0X3JlcGVhdFdoZW4oKTsKICAgIGluaXRfcmV0cnkoKTsKICAgIGluaXRfcmV0cnlXaGVuKCk7CiAgICBpbml0X3JlZkNvdW50KCk7CiAgICBpbml0X3NhbXBsZSgpOwogICAgaW5pdF9zYW1wbGVUaW1lKCk7CiAgICBpbml0X3NjYW4oKTsKICAgIGluaXRfc2VxdWVuY2VFcXVhbCgpOwogICAgaW5pdF9zaGFyZSgpOwogICAgaW5pdF9zaGFyZVJlcGxheSgpOwogICAgaW5pdF9zaW5nbGUoKTsKICAgIGluaXRfc2tpcCgpOwogICAgaW5pdF9za2lwTGFzdCgpOwogICAgaW5pdF9za2lwVW50aWwoKTsKICAgIGluaXRfc2tpcFdoaWxlKCk7CiAgICBpbml0X3N0YXJ0V2l0aCgpOwogICAgaW5pdF9zdWJzY3JpYmVPbigpOwogICAgaW5pdF9zd2l0Y2hBbGwoKTsKICAgIGluaXRfc3dpdGNoTWFwKCk7CiAgICBpbml0X3N3aXRjaE1hcFRvKCk7CiAgICBpbml0X3N3aXRjaFNjYW4oKTsKICAgIGluaXRfdGFrZSgpOwogICAgaW5pdF90YWtlTGFzdCgpOwogICAgaW5pdF90YWtlVW50aWwoKTsKICAgIGluaXRfdGFrZVdoaWxlKCk7CiAgICBpbml0X3RhcCgpOwogICAgaW5pdF90aHJvdHRsZSgpOwogICAgaW5pdF90aHJvdHRsZVRpbWUoKTsKICAgIGluaXRfdGhyb3dJZkVtcHR5KCk7CiAgICBpbml0X3RpbWVJbnRlcnZhbCgpOwogICAgaW5pdF90aW1lb3V0KCk7CiAgICBpbml0X3RpbWVvdXRXaXRoKCk7CiAgICBpbml0X3RpbWVzdGFtcCgpOwogICAgaW5pdF90b0FycmF5KCk7CiAgICBpbml0X3dpbmRvdygpOwogICAgaW5pdF93aW5kb3dDb3VudCgpOwogICAgaW5pdF93aW5kb3dUaW1lKCk7CiAgICBpbml0X3dpbmRvd1RvZ2dsZSgpOwogICAgaW5pdF93aW5kb3dXaGVuKCk7CiAgICBpbml0X3dpdGhMYXRlc3RGcm9tKCk7CiAgICBpbml0X3ppcEFsbCgpOwogICAgaW5pdF96aXBXaXRoKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcGFydGl0aW9uLmpzCnZhciBpbml0X3BhcnRpdGlvbjIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yeGpzQDcuOC4yL25vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcGFydGl0aW9uLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9yYWNlLmpzCnZhciBpbml0X3JhY2UyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3JhY2UuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcnhqc0A3LjguMi9ub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvb3BlcmF0b3JzL2luZGV4LmpzCnZhciBpbml0X29wZXJhdG9ycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3J4anNANy44LjIvbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L29wZXJhdG9ycy9pbmRleC5qcyIoKSB7CiAgICBpbml0X2F1ZGl0KCk7CiAgICBpbml0X2F1ZGl0VGltZSgpOwogICAgaW5pdF9idWZmZXIoKTsKICAgIGluaXRfYnVmZmVyQ291bnQoKTsKICAgIGluaXRfYnVmZmVyVGltZSgpOwogICAgaW5pdF9idWZmZXJUb2dnbGUoKTsKICAgIGluaXRfYnVmZmVyV2hlbigpOwogICAgaW5pdF9jYXRjaEVycm9yKCk7CiAgICBpbml0X2NvbWJpbmVBbGwoKTsKICAgIGluaXRfY29tYmluZUxhdGVzdEFsbCgpOwogICAgaW5pdF9jb21iaW5lTGF0ZXN0MigpOwogICAgaW5pdF9jb21iaW5lTGF0ZXN0V2l0aCgpOwogICAgaW5pdF9jb25jYXQyKCk7CiAgICBpbml0X2NvbmNhdEFsbCgpOwogICAgaW5pdF9jb25jYXRNYXAoKTsKICAgIGluaXRfY29uY2F0TWFwVG8oKTsKICAgIGluaXRfY29uY2F0V2l0aCgpOwogICAgaW5pdF9jb25uZWN0KCk7CiAgICBpbml0X2NvdW50KCk7CiAgICBpbml0X2RlYm91bmNlKCk7CiAgICBpbml0X2RlYm91bmNlVGltZSgpOwogICAgaW5pdF9kZWZhdWx0SWZFbXB0eSgpOwogICAgaW5pdF9kZWxheSgpOwogICAgaW5pdF9kZWxheVdoZW4oKTsKICAgIGluaXRfZGVtYXRlcmlhbGl6ZSgpOwogICAgaW5pdF9kaXN0aW5jdCgpOwogICAgaW5pdF9kaXN0aW5jdFVudGlsQ2hhbmdlZCgpOwogICAgaW5pdF9kaXN0aW5jdFVudGlsS2V5Q2hhbmdlZCgpOwogICAgaW5pdF9lbGVtZW50QXQoKTsKICAgIGluaXRfZW5kV2l0aCgpOwogICAgaW5pdF9ldmVyeSgpOwogICAgaW5pdF9leGhhdXN0KCk7CiAgICBpbml0X2V4aGF1c3RBbGwoKTsKICAgIGluaXRfZXhoYXVzdE1hcCgpOwogICAgaW5pdF9leHBhbmQoKTsKICAgIGluaXRfZmlsdGVyKCk7CiAgICBpbml0X2ZpbmFsaXplKCk7CiAgICBpbml0X2ZpbmQoKTsKICAgIGluaXRfZmluZEluZGV4KCk7CiAgICBpbml0X2ZpcnN0KCk7CiAgICBpbml0X2dyb3VwQnkoKTsKICAgIGluaXRfaWdub3JlRWxlbWVudHMoKTsKICAgIGluaXRfaXNFbXB0eSgpOwogICAgaW5pdF9sYXN0KCk7CiAgICBpbml0X21hcCgpOwogICAgaW5pdF9tYXBUbygpOwogICAgaW5pdF9tYXRlcmlhbGl6ZSgpOwogICAgaW5pdF9tYXgoKTsKICAgIGluaXRfbWVyZ2UyKCk7CiAgICBpbml0X21lcmdlQWxsKCk7CiAgICBpbml0X2ZsYXRNYXAoKTsKICAgIGluaXRfbWVyZ2VNYXAoKTsKICAgIGluaXRfbWVyZ2VNYXBUbygpOwogICAgaW5pdF9tZXJnZVNjYW4oKTsKICAgIGluaXRfbWVyZ2VXaXRoKCk7CiAgICBpbml0X21pbigpOwogICAgaW5pdF9tdWx0aWNhc3QoKTsKICAgIGluaXRfb2JzZXJ2ZU9uKCk7CiAgICBpbml0X29uRXJyb3JSZXN1bWVOZXh0V2l0aCgpOwogICAgaW5pdF9wYWlyd2lzZSgpOwogICAgaW5pdF9wYXJ0aXRpb24yKCk7CiAgICBpbml0X3BsdWNrKCk7CiAgICBpbml0X3B1Ymxpc2goKTsKICAgIGluaXRfcHVibGlzaEJlaGF2aW9yKCk7CiAgICBpbml0X3B1Ymxpc2hMYXN0KCk7CiAgICBpbml0X3B1Ymxpc2hSZXBsYXkoKTsKICAgIGluaXRfcmFjZTIoKTsKICAgIGluaXRfcmFjZVdpdGgoKTsKICAgIGluaXRfcmVkdWNlKCk7CiAgICBpbml0X3JlcGVhdCgpOwogICAgaW5pdF9yZXBlYXRXaGVuKCk7CiAgICBpbml0X3JldHJ5KCk7CiAgICBpbml0X3JldHJ5V2hlbigpOwogICAgaW5pdF9yZWZDb3VudCgpOwogICAgaW5pdF9zYW1wbGUoKTsKICAgIGluaXRfc2FtcGxlVGltZSgpOwogICAgaW5pdF9zY2FuKCk7CiAgICBpbml0X3NlcXVlbmNlRXF1YWwoKTsKICAgIGluaXRfc2hhcmUoKTsKICAgIGluaXRfc2hhcmVSZXBsYXkoKTsKICAgIGluaXRfc2luZ2xlKCk7CiAgICBpbml0X3NraXAoKTsKICAgIGluaXRfc2tpcExhc3QoKTsKICAgIGluaXRfc2tpcFVudGlsKCk7CiAgICBpbml0X3NraXBXaGlsZSgpOwogICAgaW5pdF9zdGFydFdpdGgoKTsKICAgIGluaXRfc3Vic2NyaWJlT24oKTsKICAgIGluaXRfc3dpdGNoQWxsKCk7CiAgICBpbml0X3N3aXRjaE1hcCgpOwogICAgaW5pdF9zd2l0Y2hNYXBUbygpOwogICAgaW5pdF9zd2l0Y2hTY2FuKCk7CiAgICBpbml0X3Rha2UoKTsKICAgIGluaXRfdGFrZUxhc3QoKTsKICAgIGluaXRfdGFrZVVudGlsKCk7CiAgICBpbml0X3Rha2VXaGlsZSgpOwogICAgaW5pdF90YXAoKTsKICAgIGluaXRfdGhyb3R0bGUoKTsKICAgIGluaXRfdGhyb3R0bGVUaW1lKCk7CiAgICBpbml0X3Rocm93SWZFbXB0eSgpOwogICAgaW5pdF90aW1lSW50ZXJ2YWwoKTsKICAgIGluaXRfdGltZW91dCgpOwogICAgaW5pdF90aW1lb3V0V2l0aCgpOwogICAgaW5pdF90aW1lc3RhbXAoKTsKICAgIGluaXRfdG9BcnJheSgpOwogICAgaW5pdF93aW5kb3coKTsKICAgIGluaXRfd2luZG93Q291bnQoKTsKICAgIGluaXRfd2luZG93VGltZSgpOwogICAgaW5pdF93aW5kb3dUb2dnbGUoKTsKICAgIGluaXRfd2luZG93V2hlbigpOwogICAgaW5pdF93aXRoTGF0ZXN0RnJvbSgpOwogICAgaW5pdF96aXAyKCk7CiAgICBpbml0X3ppcEFsbCgpOwogICAgaW5pdF96aXBXaXRoKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJ4QDMuMC4xMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyeC9kaXN0X3RzL3NtYXJ0cngucGx1Z2lucy5yeGpzLmpzCnZhciBzbWFydHJ4X3BsdWdpbnNfcnhqc19leHBvcnRzID0ge307Cl9fZXhwb3J0KHNtYXJ0cnhfcGx1Z2luc19yeGpzX2V4cG9ydHMsIHsKICBPYnNlcnZhYmxlOiAoKSA9PiBPYnNlcnZhYmxlLAogIFJlcGxheVN1YmplY3Q6ICgpID0+IFJlcGxheVN1YmplY3QsCiAgU3ViamVjdDogKCkgPT4gU3ViamVjdCwKICBTdWJzY3JpcHRpb246ICgpID0+IFN1YnNjcmlwdGlvbiwKICBmcm9tOiAoKSA9PiBmcm9tLAogIGZyb21FdmVudDogKCkgPT4gZnJvbUV2ZW50LAogIG9mOiAoKSA9PiBvZiwKICBvcHM6ICgpID0+IG9wcwp9KTsKdmFyIG9wczsKdmFyIGluaXRfc21hcnRyeF9wbHVnaW5zX3J4anMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJ4QDMuMC4xMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyeC9kaXN0X3RzL3NtYXJ0cngucGx1Z2lucy5yeGpzLmpzIigpIHsKICAgIGluaXRfZXNtNSgpOwogICAgaW5pdF9vcGVyYXRvcnMoKTsKICAgIG9wcyA9IHsKICAgICAgYnVmZmVyLAogICAgICBidWZmZXJDb3VudCwKICAgICAgYnVmZmVyVGltZSwKICAgICAgZGVib3VuY2UsCiAgICAgIGRlYm91bmNlVGltZSwKICAgICAgZmlsdGVyLAogICAgICBtYXA6IG1hcDIsCiAgICAgIHN0YXJ0V2l0aCwKICAgICAgdGFrZVVudGlsLAogICAgICB0aHJvdHRsZVRpbWUKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJ4QDMuMC4xMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyeC9kaXN0X3RzL3NtYXJ0cnguY2xhc3Nlcy5vYnNlcnZhYmxlbWFwLmpzCnZhciBPYnNlcnZhYmxlbWFwOwp2YXIgaW5pdF9zbWFydHJ4X2NsYXNzZXNfb2JzZXJ2YWJsZW1hcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cnhAMy4wLjEwL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHJ4L2Rpc3RfdHMvc21hcnRyeC5jbGFzc2VzLm9ic2VydmFibGVtYXAuanMiKCkgewogICAgaW5pdF9zbWFydHJ4X3BsdWdpbnMoKTsKICAgIGluaXRfc21hcnRyeF9wbHVnaW5zX3J4anMoKTsKICAgIE9ic2VydmFibGVtYXAgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMub2JzZXJ2YWJsZUV2ZW50RW1pdHRlckJ1bmRsZUFycmF5ID0gbmV3IEFycmF5KCk7CiAgICAgICAgdGhpcy5vYnNlcnZhYmxlRXZlbnRUYXJnZXRCdW5kbGVBcnJheSA9IG5ldyBBcnJheSgpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBjcmVhdGVzIGEgaG90IHN1YmplY3QgaWYgbm90IHlldCByZWdpc3RlcmVkIGZvciB0aGUgZXZlbnQuCiAgICAgICAqIEluIGNhc2UgZXZlbnQgaGFzIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIHNhbWUgb2JzZXJ2YWJsZSBpcyByZXR1cm5lZC4KICAgICAgICovCiAgICAgIGdldFN1YmplY3RGb3JFbWl0dGVyRXZlbnQoZW1pdHRlckFyZywgZXZlbnRBcmcpIHsKICAgICAgICBjb25zdCBleGlzdGluZ0J1bmRsZSA9IHRoaXMub2JzZXJ2YWJsZUV2ZW50RW1pdHRlckJ1bmRsZUFycmF5LmZpbmQoKGJ1bmRsZUFyZykgPT4gewogICAgICAgICAgcmV0dXJuIGJ1bmRsZUFyZy5ldmVudFJlZiA9PT0gZW1pdHRlckFyZyAmJiBidW5kbGVBcmcuZXZlbnQgPT09IGV2ZW50QXJnOwogICAgICAgIH0pOwogICAgICAgIGlmIChleGlzdGluZ0J1bmRsZSkgewogICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQnVuZGxlLnN1YmplY3Q7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGVtaXR0ZXJPYnNlcnZhYmxlID0gZnJvbUV2ZW50KGVtaXR0ZXJBcmcsIGV2ZW50QXJnKTsKICAgICAgICAgIGNvbnN0IGVtaXR0ZXJTdWJqZWN0ID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgIGVtaXR0ZXJPYnNlcnZhYmxlLnN1YnNjcmliZShlbWl0dGVyU3ViamVjdCk7CiAgICAgICAgICBjb25zdCBuZXdCdW5kbGUgPSB7CiAgICAgICAgICAgIHN1YmplY3Q6IGVtaXR0ZXJTdWJqZWN0LAogICAgICAgICAgICBldmVudFJlZjogZW1pdHRlckFyZywKICAgICAgICAgICAgZXZlbnQ6IGV2ZW50QXJnCiAgICAgICAgICB9OwogICAgICAgICAgdGhpcy5vYnNlcnZhYmxlRXZlbnRFbWl0dGVyQnVuZGxlQXJyYXkucHVzaChuZXdCdW5kbGUpOwogICAgICAgICAgcmV0dXJuIG5ld0J1bmRsZS5zdWJqZWN0OwogICAgICAgIH0KICAgICAgfQogICAgICBnZXRTdWJqZWN0Rm9yRXZlbnRUYXJnZXQoZXZlbnRUYXJnZXRBcmcsIGV2ZW50TmFtZUFyZykgewogICAgICAgIGNvbnN0IGV4aXN0aW5nQnVuZGxlID0gdGhpcy5vYnNlcnZhYmxlRXZlbnRUYXJnZXRCdW5kbGVBcnJheS5maW5kKChidW5kbGVBcmcpID0+IHsKICAgICAgICAgIHJldHVybiBidW5kbGVBcmcuZXZlbnRSZWYgPT09IGV2ZW50VGFyZ2V0QXJnICYmIGJ1bmRsZUFyZy5ldmVudCA9PT0gZXZlbnROYW1lQXJnOwogICAgICAgIH0pOwogICAgICAgIGlmIChleGlzdGluZ0J1bmRsZSkgewogICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQnVuZGxlLnN1YmplY3Q7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGVtaXR0ZXJTdWJqZWN0ID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgIGNvbnN0IG5ld0J1bmRsZSA9IHsKICAgICAgICAgICAgc3ViamVjdDogZW1pdHRlclN1YmplY3QsCiAgICAgICAgICAgIGV2ZW50UmVmOiBldmVudFRhcmdldEFyZywKICAgICAgICAgICAgZXZlbnQ6IGV2ZW50TmFtZUFyZwogICAgICAgICAgfTsKICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZUV2ZW50VGFyZ2V0QnVuZGxlQXJyYXkucHVzaChuZXdCdW5kbGUpOwogICAgICAgICAgcmV0dXJuIG5ld0J1bmRsZS5zdWJqZWN0OwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cnhAMy4wLjEwL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHJ4L2Rpc3RfdHMvc21hcnRyeC5jbGFzc2VzLm9ic2VydmFibGVpbnRha2UuanMKdmFyIE9ic2VydmFibGVJbnRha2U7CnZhciBpbml0X3NtYXJ0cnhfY2xhc3Nlc19vYnNlcnZhYmxlaW50YWtlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyeEAzLjAuMTAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cngvZGlzdF90cy9zbWFydHJ4LmNsYXNzZXMub2JzZXJ2YWJsZWludGFrZS5qcyIoKSB7CiAgICBpbml0X3NtYXJ0cnhfcGx1Z2lucygpOwogICAgaW5pdF9zbWFydHJ4X3BsdWdpbnNfcnhqcygpOwogICAgT2JzZXJ2YWJsZUludGFrZSA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5vYnNlcnZhYmxlRnVuY3Rpb25zID0gewogICAgICAgICAgbmV4dDogKHBheWxvYWRBcmcpID0+IHsKICAgICAgICAgIH0sCiAgICAgICAgICBjb21wbGV0ZTogKHBheWxvYWRBcmcpID0+IHsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHRoaXMuZ2VuZXJhdG9yID0gbnVsbDsKICAgICAgICB0aGlzLmJ1ZmZlcmVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5wYXlsb2FkQnVmZmVyID0gW107CiAgICAgICAgdGhpcy5vYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyQXJnKSA9PiB7CiAgICAgICAgICB0aGlzLm9ic2VydmFibGVGdW5jdGlvbnMubmV4dCA9ICguLi5hcmdzKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBvYnNlcnZlckFyZy5uZXh0KGFyZ3MpOwogICAgICAgICAgfTsKICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZUZ1bmN0aW9ucy5jb21wbGV0ZSA9ICgpID0+IHsKICAgICAgICAgICAgdGhpcy5jb21wbGV0ZWREZWZmZXJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgIHJldHVybiBvYnNlcnZlckFyZy5jb21wbGV0ZSgpOwogICAgICAgICAgfTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLmNvbXBsZXRlZERlZmZlcmVkID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICAgICAgdGhpcy5jb21wbGV0ZWQgPSB0aGlzLmNvbXBsZXRlZERlZmZlcmVkLnByb21pc2U7CiAgICAgIH0KICAgICAgc2V0T2JzZXJ2YWJsZShvYnNlcnZhYmxlRnVuYykgewogICAgICAgIHRoaXMub2JzZXJ2YWJsZSA9IG9ic2VydmFibGVGdW5jOwogICAgICB9CiAgICAgIHB1c2gocGF5bG9hZEFyZykgewogICAgICAgIGlmICh0aGlzLmJ1ZmZlcmVkKSB7CiAgICAgICAgICB0aGlzLnBheWxvYWRCdWZmZXIucHVzaChwYXlsb2FkQXJnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5pbnRlcm5hbFB1c2gocGF5bG9hZEFyZyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBwdXNoZXMgbWFueSBwYXlsb2FkcyBhcyBhcnJheQogICAgICAgKiBAcGFyYW0gcGF5bG9hZEFyZ0FycmF5CiAgICAgICAqLwogICAgICBwdXNoTWFueShwYXlsb2FkQXJnQXJyYXkpIHsKICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGF5bG9hZEFyZ0FycmF5KSB7CiAgICAgICAgICB0aGlzLnB1c2goaXRlbSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBzZXRzIGEgZ2VuZXJhdG9yIHRvIHF1ZXJ5IHRoZSBuZXh0IHB1c2hlZCB2YWx1ZQogICAgICAgKiBAcGFyYW0gZ2VuZXJhdG9yQXJnCiAgICAgICAqLwogICAgICBzZXRHZW5lcmF0b3IoZ2VuZXJhdG9yQXJnKSB7CiAgICAgICAgdGhpcy5nZW5lcmF0b3IgPSBnZW5lcmF0b3JBcmc7CiAgICAgIH0KICAgICAgbWFrZUJ1ZmZlcmVkKCkgewogICAgICAgIHRoaXMuYnVmZmVyZWQgPSB0cnVlOwogICAgICB9CiAgICAgIHN1YnNjcmliZSguLi5hcmdzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2YWJsZS5zdWJzY3JpYmUoLi4uYXJncyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHJlcXVlc3QgdGhlIG5leHQgdmFsdWVzIGluIHRoZSBxdWFudGl0eSBzcGVjaWZpZWQKICAgICAgICogQHBhcmFtIGhvd01hbnlBcmcgaWYgYSBnZW5lcmF0b3IgaXMgc2V0LCBvZiBhIGJ1ZmZlciBleGlzdHMsIHRoaXMgYWxsb3dzIHJldHJpZXZpbmcgdmFsdWVzCiAgICAgICAqLwogICAgICByZXF1ZXN0KGhvd01hbnlBcmcpIHsKICAgICAgICBpZiAoaG93TWFueUFyZyA9PT0gMCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgIT09IGhvd01hbnlBcmc7IGkxMSsrKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnBheWxvYWRCdWZmZXIubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxQdXNoKHRoaXMucGF5bG9hZEJ1ZmZlci5zaGlmdCgpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjb25zdCBuZXh0UGF5bG9hZCA9IHRoaXMuZ2VuZXJhdG9yLm5leHQoKTsKICAgICAgICAgICAgICB0aGlzLmludGVybmFsUHVzaChuZXh0UGF5bG9hZC52YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHNpZ25hbHMgdGhlIGNvbXBsZXRpb24gb2YgdGhpcyBvYnNlcnZhYmxlCiAgICAgICAqLwogICAgICBzaWduYWxDb21wbGV0ZSgpIHsKICAgICAgICB0aGlzLm9ic2VydmFibGVGdW5jdGlvbnMuY29tcGxldGUoKTsKICAgICAgfQogICAgICBpbnRlcm5hbFB1c2gocGF5bG9hZEFyZykgewogICAgICAgIHRoaXMub2JzZXJ2YWJsZUZ1bmN0aW9ucy5uZXh0KHBheWxvYWRBcmcpOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyeEAzLjAuMTAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cngvZGlzdF90cy9zbWFydHJ4LmZ1bmN0aW9ucy5qcwpmdW5jdGlvbiBmcm9tU3RyZWFtV2l0aEJhY2twcmVzc3VyZShzdHJlYW0pIHsKICByZXR1cm4gbmV3IE9ic2VydmFibGUoKHN1YnNjcmliZXIpID0+IHsKICAgIGNvbnN0IHBhdXNlU3RyZWFtID0gKCkgPT4gc3RyZWFtLnBhdXNlKCk7CiAgICBjb25zdCByZXN1bWVTdHJlYW0gPSAoKSA9PiBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHN0cmVhbS5yZXN1bWUoKSk7CiAgICBjb25zdCBvbkRhdGEgPSAoZGF0YSkgPT4gewogICAgICBwYXVzZVN0cmVhbSgpOwogICAgICBzdWJzY3JpYmVyLm5leHQoZGF0YSk7CiAgICAgIHJlc3VtZVN0cmVhbSgpOwogICAgfTsKICAgIHN0cmVhbS5vbigiZGF0YSIsIG9uRGF0YSk7CiAgICBzdHJlYW0ub24oImVycm9yIiwgKGVycm9yKSA9PiBzdWJzY3JpYmVyLmVycm9yKGVycm9yKSk7CiAgICBzdHJlYW0ub24oImVuZCIsICgpID0+IHN1YnNjcmliZXIuY29tcGxldGUoKSk7CiAgICBzdHJlYW0ub24oImNsb3NlIiwgKCkgPT4gc3Vic2NyaWJlci5jb21wbGV0ZSgpKTsKICAgIHJldHVybiAoKSA9PiB7CiAgICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcigiZGF0YSIsIG9uRGF0YSk7CiAgICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLCBzdWJzY3JpYmVyLmVycm9yKTsKICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCJlbmQiLCBzdWJzY3JpYmVyLmNvbXBsZXRlKTsKICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsIHN1YnNjcmliZXIuY29tcGxldGUpOwogICAgfTsKICB9KTsKfQp2YXIgaW5pdF9zbWFydHJ4X2Z1bmN0aW9ucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cnhAMy4wLjEwL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHJ4L2Rpc3RfdHMvc21hcnRyeC5mdW5jdGlvbnMuanMiKCkgewogICAgaW5pdF9lc201KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJ4QDMuMC4xMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyeC9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMyID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czIsIHsKICBPYnNlcnZhYmxlSW50YWtlOiAoKSA9PiBPYnNlcnZhYmxlSW50YWtlLAogIE9ic2VydmFibGVtYXA6ICgpID0+IE9ic2VydmFibGVtYXAsCiAgZnJvbVN0cmVhbVdpdGhCYWNrcHJlc3N1cmU6ICgpID0+IGZyb21TdHJlYW1XaXRoQmFja3ByZXNzdXJlLAogIHJ4anM6ICgpID0+IHNtYXJ0cnhfcGx1Z2luc19yeGpzX2V4cG9ydHMKfSk7CnZhciBpbml0X2Rpc3RfdHMyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyeEAzLjAuMTAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cngvZGlzdF90cy9pbmRleC5qcyIoKSB7CiAgICBpbml0X3NtYXJ0cnhfcGx1Z2lucygpOwogICAgaW5pdF9zbWFydHJ4X2NsYXNzZXNfb2JzZXJ2YWJsZW1hcCgpOwogICAgaW5pdF9zbWFydHJ4X2NsYXNzZXNfb2JzZXJ2YWJsZWludGFrZSgpOwogICAgaW5pdF9zbWFydHJ4X2Z1bmN0aW9ucygpOwogICAgaW5pdF9zbWFydHJ4X3BsdWdpbnNfcnhqcygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9wcm9wZXJ0eS5qcwpmdW5jdGlvbiBuNSh0OSkgewogIHJldHVybiAoZTExLCBvMTMpID0+ICJvYmplY3QiID09IHR5cGVvZiBvMTMgPyByNCh0OSwgZTExLCBvMTMpIDogKCh0MTAsIGUxMiwgbzE0KSA9PiB7CiAgICBjb25zdCByMTEgPSBlMTIuaGFzT3duUHJvcGVydHkobzE0KTsKICAgIHJldHVybiBlMTIuY29uc3RydWN0b3IuY3JlYXRlUHJvcGVydHkobzE0LCB0MTApLCByMTEgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUxMiwgbzE0KSA6IHZvaWQgMDsKICB9KSh0OSwgZTExLCBvMTMpOwp9CnZhciBvNiwgcjQ7CnZhciBpbml0X3Byb3BlcnR5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9wcm9wZXJ0eS5qcyIoKSB7CiAgICBpbml0X3JlYWN0aXZlX2VsZW1lbnQoKTsKICAgIG82ID0geyBhdHRyaWJ1dGU6IHRydWUsIHR5cGU6IFN0cmluZywgY29udmVydGVyOiB1LCByZWZsZWN0OiBmYWxzZSwgaGFzQ2hhbmdlZDogZiB9LCByNCA9ICh0OSA9IG82LCBlMTEsIHIxMSkgPT4gewogICAgICBjb25zdCB7IGtpbmQ6IG4xMywgbWV0YWRhdGE6IGkxMSB9ID0gcjExOwogICAgICBsZXQgczEwID0gZ2xvYmFsVGhpcy5saXRQcm9wZXJ0eU1ldGFkYXRhLmdldChpMTEpOwogICAgICBpZiAodm9pZCAwID09PSBzMTAgJiYgZ2xvYmFsVGhpcy5saXRQcm9wZXJ0eU1ldGFkYXRhLnNldChpMTEsIHMxMCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkpLCAic2V0dGVyIiA9PT0gbjEzICYmICgodDkgPSBPYmplY3QuY3JlYXRlKHQ5KSkud3JhcHBlZCA9IHRydWUpLCBzMTAuc2V0KHIxMS5uYW1lLCB0OSksICJhY2Nlc3NvciIgPT09IG4xMykgewogICAgICAgIGNvbnN0IHsgbmFtZTogbzEzIH0gPSByMTE7CiAgICAgICAgcmV0dXJuIHsgc2V0KHIxMikgewogICAgICAgICAgY29uc3QgbjE0ID0gZTExLmdldC5jYWxsKHRoaXMpOwogICAgICAgICAgZTExLnNldC5jYWxsKHRoaXMsIHIxMiksIHRoaXMucmVxdWVzdFVwZGF0ZShvMTMsIG4xNCwgdDksIHRydWUsIHIxMik7CiAgICAgICAgfSwgaW5pdChlMTIpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IGUxMiAmJiB0aGlzLkMobzEzLCB2b2lkIDAsIHQ5LCBlMTIpLCBlMTI7CiAgICAgICAgfSB9OwogICAgICB9CiAgICAgIGlmICgic2V0dGVyIiA9PT0gbjEzKSB7CiAgICAgICAgY29uc3QgeyBuYW1lOiBvMTMgfSA9IHIxMTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24ocjEyKSB7CiAgICAgICAgICBjb25zdCBuMTQgPSB0aGlzW28xM107CiAgICAgICAgICBlMTEuY2FsbCh0aGlzLCByMTIpLCB0aGlzLnJlcXVlc3RVcGRhdGUobzEzLCBuMTQsIHQ5LCB0cnVlLCByMTIpOwogICAgICAgIH07CiAgICAgIH0KICAgICAgdGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIGRlY29yYXRvciBsb2NhdGlvbjogIiArIG4xMyk7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0QDMuMy4yL25vZGVfbW9kdWxlcy9saXQvZGVjb3JhdG9ycy9wcm9wZXJ0eS5qcwp2YXIgaW5pdF9wcm9wZXJ0eTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXRAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC9kZWNvcmF0b3JzL3Byb3BlcnR5LmpzIigpIHsKICAgIGluaXRfcHJvcGVydHkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi41LjEvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5jb2xvcnMuanMKdmFyIGluaXRfZG9tdG9vbHNfY29sb3JzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjUuMS9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLmNvbG9ycy5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGRlbGF5QDMuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGRlbGF5L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czMgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMywgewogIFRpbWVvdXQ6ICgpID0+IFRpbWVvdXQsCiAgZGVsYXlGb3I6ICgpID0+IGRlbGF5Rm9yLAogIGRlbGF5Rm9yUmFuZG9tOiAoKSA9PiBkZWxheUZvclJhbmRvbQp9KTsKdmFyIGRlbGF5Rm9yLCBkZWxheUZvclJhbmRvbSwgVGltZW91dDsKdmFyIGluaXRfZGlzdF90czMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGRlbGF5QDMuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGRlbGF5L2Rpc3RfdHMvaW5kZXguanMiKCkgewogICAgaW5pdF9kaXN0X3RzKCk7CiAgICBkZWxheUZvciA9IGFzeW5jICh0aW1lSW5NaWxsaXNlY29uZEFyZywgcGFzc09uQXJnLCB1bnJlZmVkQXJnID0gZmFsc2UpID0+IHsKICAgICAgY29uc3QgdGltZW91dDIgPSBuZXcgVGltZW91dCh0aW1lSW5NaWxsaXNlY29uZEFyZywgbnVsbCwgdW5yZWZlZEFyZyk7CiAgICAgIGF3YWl0IHRpbWVvdXQyLnByb21pc2U7CiAgICAgIHJldHVybiBwYXNzT25Bcmc7CiAgICB9OwogICAgZGVsYXlGb3JSYW5kb20gPSBhc3luYyAodGltZU1pbkluTWlsbGlzZWNvbmRBcmcsIHRpbWVNYXhJbk1pbGxpc2Vjb25kQXJnLCBwYXNzT25BcmcsIHVucmVmZWRBcmcgPSBmYWxzZSkgPT4gewogICAgICBhd2FpdCBkZWxheUZvcihNYXRoLnJhbmRvbSgpICogKHRpbWVNYXhJbk1pbGxpc2Vjb25kQXJnIC0gdGltZU1pbkluTWlsbGlzZWNvbmRBcmcpICsgdGltZU1pbkluTWlsbGlzZWNvbmRBcmcsIG51bGwsIHVucmVmZWRBcmcpOwogICAgICByZXR1cm4gcGFzc09uQXJnOwogICAgfTsKICAgIFRpbWVvdXQgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKHRpbWVJbk1pbGxpc2Vjb25kQXJnLCBwYXNzT24sIHVucmVmZWRBcmcgPSBmYWxzZSkgewogICAgICAgIHRoaXMuX2NhbmNlbGxlZCA9IGZhbHNlOwogICAgICAgIHRoaXMudGltZW91dEluTWlsbGlzID0gdGltZUluTWlsbGlzZWNvbmRBcmc7CiAgICAgICAgdGhpcy5fZGVmZXJyZWQgPSBkZWZlcigpOwogICAgICAgIHRoaXMucHJvbWlzZSA9IHRoaXMuX2RlZmVycmVkLnByb21pc2U7CiAgICAgICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgaWYgKCF0aGlzLl9jYW5jZWxsZWQpIHsKICAgICAgICAgICAgdGhpcy5fZGVmZXJyZWQucmVzb2x2ZShwYXNzT24pOwogICAgICAgICAgfQogICAgICAgIH0sIHRpbWVJbk1pbGxpc2Vjb25kQXJnKTsKICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBEYXRlLm5vdygpOwogICAgICAgIGlmICh1bnJlZmVkQXJnKSB7CiAgICAgICAgICB0aGlzLm1ha2VVbnJlZmVkKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiB1bnJlZmZpbmcgYSB0aW1lb3V0IGNhdXNlcyB0aGUgbm9kZSBwcm9jZXNzIHRvIG5vdCB3YWl0IGZvciBjb21wbGV0aW9uIGJlZm9yZSBleGl0CiAgICAgICAqLwogICAgICBtYWtlVW5yZWZlZCgpIHsKICAgICAgICB0aGlzLl90aW1lb3V0LnVucmVmKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNhbmNlbHMgdGhlIHRpbWVyCiAgICAgICAqLwogICAgICBjYW5jZWwoKSB7CiAgICAgICAgdGhpcy5fY2FuY2VsbGVkID0gdHJ1ZTsKICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7CiAgICAgIH0KICAgICAgZ2V0VGltZUxlZnQoKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zdGFydGVkICsgdGhpcy50aW1lb3V0SW5NaWxsaXMgLSBEYXRlLm5vdygpOwogICAgICAgIHJldHVybiByZXN1bHQgPiAwID8gcmVzdWx0IDogMDsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkcmVxdWVzdC1pbnRlcmZhY2VzQDMuMC4xOS9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRyZXF1ZXN0LWludGVyZmFjZXMvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzNCA9IHt9Owp2YXIgaW5pdF9kaXN0X3RzNCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkcmVxdWVzdC1pbnRlcmZhY2VzQDMuMC4xOS9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRyZXF1ZXN0LWludGVyZmFjZXMvZGlzdF90cy9pbmRleC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9lc2NhcGUtc3RyaW5nLXJlZ2V4cEA1LjAuMC9ub2RlX21vZHVsZXMvZXNjYXBlLXN0cmluZy1yZWdleHAvaW5kZXguanMKZnVuY3Rpb24gZXNjYXBlU3RyaW5nUmVnZXhwKHN0cmluZzMpIHsKICBpZiAodHlwZW9mIHN0cmluZzMgIT09ICJzdHJpbmciKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBhIHN0cmluZyIpOwogIH0KICByZXR1cm4gc3RyaW5nMy5yZXBsYWNlKC9bfFxce30oKVtcXV4kKyo/Ll0vZywgIlxcJCYiKS5yZXBsYWNlKC8tL2csICJcXHgyZCIpOwp9CnZhciBpbml0X2VzY2FwZV9zdHJpbmdfcmVnZXhwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZXNjYXBlLXN0cmluZy1yZWdleHBANS4wLjAvbm9kZV9tb2R1bGVzL2VzY2FwZS1zdHJpbmctcmVnZXhwL2luZGV4LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21hdGNoZXJANS4wLjAvbm9kZV9tb2R1bGVzL21hdGNoZXIvaW5kZXguanMKdmFyIG1hdGNoZXJfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChtYXRjaGVyX2V4cG9ydHMsIHsKICBpc01hdGNoOiAoKSA9PiBpc01hdGNoLAogIG1hdGNoZXI6ICgpID0+IG1hdGNoZXIKfSk7CmZ1bmN0aW9uIG1hdGNoZXIoaW5wdXRzLCBwYXR0ZXJuczIsIG9wdGlvbnMpIHsKICByZXR1cm4gYmFzZU1hdGNoZXIoaW5wdXRzLCBwYXR0ZXJuczIsIG9wdGlvbnMsIGZhbHNlKTsKfQpmdW5jdGlvbiBpc01hdGNoKGlucHV0cywgcGF0dGVybnMyLCBvcHRpb25zKSB7CiAgcmV0dXJuIGJhc2VNYXRjaGVyKGlucHV0cywgcGF0dGVybnMyLCBvcHRpb25zLCB0cnVlKS5sZW5ndGggPiAwOwp9CnZhciByZWdleHBDYWNoZSwgc2FuaXRpemVBcnJheSwgbWFrZVJlZ2V4cCwgYmFzZU1hdGNoZXI7CnZhciBpbml0X21hdGNoZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tYXRjaGVyQDUuMC4wL25vZGVfbW9kdWxlcy9tYXRjaGVyL2luZGV4LmpzIigpIHsKICAgIGluaXRfZXNjYXBlX3N0cmluZ19yZWdleHAoKTsKICAgIHJlZ2V4cENhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIHNhbml0aXplQXJyYXkgPSAoaW5wdXQsIGlucHV0TmFtZSkgPT4gewogICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7CiAgICAgICAgc3dpdGNoICh0eXBlb2YgaW5wdXQpIHsKICAgICAgICAgIGNhc2UgInN0cmluZyI6CiAgICAgICAgICAgIGlucHV0ID0gW2lucHV0XTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJ1bmRlZmluZWQiOgogICAgICAgICAgICBpbnB1dCA9IFtdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkICcke2lucHV0TmFtZX0nIHRvIGJlIGEgc3RyaW5nIG9yIGFuIGFycmF5LCBidXQgZ290IGEgdHlwZSBvZiAnJHt0eXBlb2YgaW5wdXR9J2ApOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gaW5wdXQuZmlsdGVyKChzdHJpbmczKSA9PiB7CiAgICAgICAgaWYgKHR5cGVvZiBzdHJpbmczICE9PSAic3RyaW5nIikgewogICAgICAgICAgaWYgKHR5cGVvZiBzdHJpbmczID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAnJHtpbnB1dE5hbWV9JyB0byBiZSBhbiBhcnJheSBvZiBzdHJpbmdzLCBidXQgZm91bmQgYSB0eXBlIG9mICcke3R5cGVvZiBzdHJpbmczfScgaW4gdGhlIGFycmF5YCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9KTsKICAgIH07CiAgICBtYWtlUmVnZXhwID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IHsKICAgICAgb3B0aW9ucyA9IHsKICAgICAgICBjYXNlU2Vuc2l0aXZlOiBmYWxzZSwKICAgICAgICAuLi5vcHRpb25zCiAgICAgIH07CiAgICAgIGNvbnN0IGNhY2hlS2V5ID0gcGF0dGVybiArIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpOwogICAgICBpZiAocmVnZXhwQ2FjaGUuaGFzKGNhY2hlS2V5KSkgewogICAgICAgIHJldHVybiByZWdleHBDYWNoZS5nZXQoY2FjaGVLZXkpOwogICAgICB9CiAgICAgIGNvbnN0IG5lZ2F0ZWQgPSBwYXR0ZXJuWzBdID09PSAiISI7CiAgICAgIGlmIChuZWdhdGVkKSB7CiAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMSk7CiAgICAgIH0KICAgICAgcGF0dGVybiA9IGVzY2FwZVN0cmluZ1JlZ2V4cChwYXR0ZXJuKS5yZXBsYWNlKC9cXFwqL2csICJbXFxzXFxTXSoiKTsKICAgICAgY29uc3QgcmVnZXhwID0gbmV3IFJlZ0V4cChgXiR7cGF0dGVybn0kYCwgb3B0aW9ucy5jYXNlU2Vuc2l0aXZlID8gIiIgOiAiaSIpOwogICAgICByZWdleHAubmVnYXRlZCA9IG5lZ2F0ZWQ7CiAgICAgIHJlZ2V4cENhY2hlLnNldChjYWNoZUtleSwgcmVnZXhwKTsKICAgICAgcmV0dXJuIHJlZ2V4cDsKICAgIH07CiAgICBiYXNlTWF0Y2hlciA9IChpbnB1dHMsIHBhdHRlcm5zMiwgb3B0aW9ucywgZmlyc3RNYXRjaE9ubHkpID0+IHsKICAgICAgaW5wdXRzID0gc2FuaXRpemVBcnJheShpbnB1dHMsICJpbnB1dHMiKTsKICAgICAgcGF0dGVybnMyID0gc2FuaXRpemVBcnJheShwYXR0ZXJuczIsICJwYXR0ZXJucyIpOwogICAgICBpZiAocGF0dGVybnMyLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybiBbXTsKICAgICAgfQogICAgICBwYXR0ZXJuczIgPSBwYXR0ZXJuczIubWFwKChwYXR0ZXJuKSA9PiBtYWtlUmVnZXhwKHBhdHRlcm4sIG9wdGlvbnMpKTsKICAgICAgY29uc3QgeyBhbGxQYXR0ZXJucyB9ID0gb3B0aW9ucyB8fCB7fTsKICAgICAgY29uc3QgcmVzdWx0ID0gW107CiAgICAgIGZvciAoY29uc3QgaW5wdXQgb2YgaW5wdXRzKSB7CiAgICAgICAgbGV0IG1hdGNoZXM7CiAgICAgICAgY29uc3QgZGlkRml0ID0gWy4uLnBhdHRlcm5zMl0uZmlsbChmYWxzZSk7CiAgICAgICAgZm9yIChjb25zdCBbaW5kZXgyLCBwYXR0ZXJuXSBvZiBwYXR0ZXJuczIuZW50cmllcygpKSB7CiAgICAgICAgICBpZiAocGF0dGVybi50ZXN0KGlucHV0KSkgewogICAgICAgICAgICBkaWRGaXRbaW5kZXgyXSA9IHRydWU7CiAgICAgICAgICAgIG1hdGNoZXMgPSAhcGF0dGVybi5uZWdhdGVkOwogICAgICAgICAgICBpZiAoIW1hdGNoZXMpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIShtYXRjaGVzID09PSBmYWxzZSB8fCBtYXRjaGVzID09PSB2b2lkIDAgJiYgcGF0dGVybnMyLnNvbWUoKHBhdHRlcm4pID0+ICFwYXR0ZXJuLm5lZ2F0ZWQpIHx8IGFsbFBhdHRlcm5zICYmIGRpZEZpdC5zb21lKCh5ZXMsIGluZGV4MikgPT4gIXllcyAmJiAhcGF0dGVybnMyW2luZGV4Ml0ubmVnYXRlZCkpKSB7CiAgICAgICAgICByZXN1bHQucHVzaChpbnB1dCk7CiAgICAgICAgICBpZiAoZmlyc3RNYXRjaE9ubHkpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRtYXRjaEAyLjAuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRtYXRjaC9kaXN0X3RzL3NtYXJ0bWF0Y2gucGx1Z2lucy5qcwp2YXIgaW5pdF9zbWFydG1hdGNoX3BsdWdpbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydG1hdGNoQDIuMC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydG1hdGNoL2Rpc3RfdHMvc21hcnRtYXRjaC5wbHVnaW5zLmpzIigpIHsKICAgIGluaXRfbWF0Y2hlcigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRtYXRjaEAyLjAuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRtYXRjaC9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHM1ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czUsIHsKICBTbWFydE1hdGNoOiAoKSA9PiBTbWFydE1hdGNoCn0pOwp2YXIgU21hcnRNYXRjaDsKdmFyIGluaXRfZGlzdF90czUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydG1hdGNoQDIuMC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydG1hdGNoL2Rpc3RfdHMvaW5kZXguanMiKCkgewogICAgaW5pdF9zbWFydG1hdGNoX3BsdWdpbnMoKTsKICAgIFNtYXJ0TWF0Y2ggPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKHdpbGRjYXJkQXJnKSB7CiAgICAgICAgdGhpcy53aWxkY2FyZCA9IHdpbGRjYXJkQXJnOwogICAgICB9CiAgICAgIG1hdGNoKG1hdGNoU3RyaW5nQXJnKSB7CiAgICAgICAgcmV0dXJuIG1hdGNoZXJfZXhwb3J0cy5pc01hdGNoKG1hdGNoU3RyaW5nQXJnLCB0aGlzLndpbGRjYXJkKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Nyb25lckA5LjEuMC9ub2RlX21vZHVsZXMvY3JvbmVyL2Rpc3QvY3JvbmVyLmpzCnZhciBjcm9uZXJfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChjcm9uZXJfZXhwb3J0cywgewogIENyb246ICgpID0+IFIyLAogIENyb25EYXRlOiAoKSA9PiBmMywKICBDcm9uUGF0dGVybjogKCkgPT4gZDMsCiAgc2NoZWR1bGVkSm9iczogKCkgPT4geTMKfSk7CmZ1bmN0aW9uIGgzKG4xMywgdDksIGUxMSwgcjExLCBzMTAsIGkxMSwgYTUsIGw2KSB7CiAgcmV0dXJuIGgzLmZyb21UWihoMy50cChuMTMsIHQ5LCBlMTEsIHIxMSwgczEwLCBpMTEsIGE1KSwgbDYpOwp9CmZ1bmN0aW9uIEQyKG4xMywgdDkgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkgewogIGxldCBlMTEgPSB0OS50b0xvY2FsZVN0cmluZygiZW4tVVMiLCB7IHRpbWVab25lOiBuMTMsIHRpbWVab25lTmFtZTogInNob3J0T2Zmc2V0IiB9KS5zcGxpdCgiICIpLnNsaWNlKC0xKVswXSwgcjExID0gdDkudG9Mb2NhbGVTdHJpbmcoImVuLVVTIikucmVwbGFjZSgvW1x1MjAyZl0vLCAiICIpOwogIHJldHVybiBEYXRlLnBhcnNlKGAke3IxMX0gR01UYCkgLSBEYXRlLnBhcnNlKGAke3IxMX0gJHtlMTF9YCk7Cn0KZnVuY3Rpb24gazIobjEzLCB0OSkgewogIGxldCBlMTEgPSBuZXcgRGF0ZShEYXRlLnBhcnNlKG4xMykpOwogIGlmIChpc05hTihlMTEpKSB0aHJvdyBuZXcgRXJyb3IoIm1pbml0ejogSW52YWxpZCBJU084NjAxIHBhc3NlZCB0byBwYXJzZXIuIik7CiAgbGV0IHIxMSA9IG4xMy5zdWJzdHJpbmcoOSk7CiAgcmV0dXJuIG4xMy5pbmNsdWRlcygiWiIpIHx8IHIxMS5pbmNsdWRlcygiLSIpIHx8IHIxMS5pbmNsdWRlcygiKyIpID8gaDMudHAoZTExLmdldFVUQ0Z1bGxZZWFyKCksIGUxMS5nZXRVVENNb250aCgpICsgMSwgZTExLmdldFVUQ0RhdGUoKSwgZTExLmdldFVUQ0hvdXJzKCksIGUxMS5nZXRVVENNaW51dGVzKCksIGUxMS5nZXRVVENTZWNvbmRzKCksICJFdGMvVVRDIikgOiBoMy50cChlMTEuZ2V0RnVsbFllYXIoKSwgZTExLmdldE1vbnRoKCkgKyAxLCBlMTEuZ2V0RGF0ZSgpLCBlMTEuZ2V0SG91cnMoKSwgZTExLmdldE1pbnV0ZXMoKSwgZTExLmdldFNlY29uZHMoKSwgdDkpOwp9CmZ1bmN0aW9uIE4yKG4xMykgewogIGlmIChuMTMgPT09IHZvaWQgMCAmJiAobjEzID0ge30pLCBkZWxldGUgbjEzLm5hbWUsIG4xMy5sZWdhY3lNb2RlID0gbjEzLmxlZ2FjeU1vZGUgPT09IHZvaWQgMCA/IHRydWUgOiBuMTMubGVnYWN5TW9kZSwgbjEzLnBhdXNlZCA9IG4xMy5wYXVzZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogbjEzLnBhdXNlZCwgbjEzLm1heFJ1bnMgPSBuMTMubWF4UnVucyA9PT0gdm9pZCAwID8gMSAvIDAgOiBuMTMubWF4UnVucywgbjEzLmNhdGNoID0gbjEzLmNhdGNoID09PSB2b2lkIDAgPyBmYWxzZSA6IG4xMy5jYXRjaCwgbjEzLmludGVydmFsID0gbjEzLmludGVydmFsID09PSB2b2lkIDAgPyAwIDogcGFyc2VJbnQobjEzLmludGVydmFsLnRvU3RyaW5nKCksIDEwKSwgbjEzLnV0Y09mZnNldCA9IG4xMy51dGNPZmZzZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcnNlSW50KG4xMy51dGNPZmZzZXQudG9TdHJpbmcoKSwgMTApLCBuMTMudW5yZWYgPSBuMTMudW5yZWYgPT09IHZvaWQgMCA/IGZhbHNlIDogbjEzLnVucmVmLCBuMTMuc3RhcnRBdCAmJiAobjEzLnN0YXJ0QXQgPSBuZXcgZjMobjEzLnN0YXJ0QXQsIG4xMy50aW1lem9uZSkpLCBuMTMuc3RvcEF0ICYmIChuMTMuc3RvcEF0ID0gbmV3IGYzKG4xMy5zdG9wQXQsIG4xMy50aW1lem9uZSkpLCBuMTMuaW50ZXJ2YWwgIT09IG51bGwpIHsKICAgIGlmIChpc05hTihuMTMuaW50ZXJ2YWwpKSB0aHJvdyBuZXcgRXJyb3IoIkNyb25PcHRpb25zOiBTdXBwbGllZCB2YWx1ZSBmb3IgaW50ZXJ2YWwgaXMgbm90IGEgbnVtYmVyIik7CiAgICBpZiAobjEzLmludGVydmFsIDwgMCkgdGhyb3cgbmV3IEVycm9yKCJDcm9uT3B0aW9uczogU3VwcGxpZWQgdmFsdWUgZm9yIGludGVydmFsIGNhbiBub3QgYmUgbmVnYXRpdmUiKTsKICB9CiAgaWYgKG4xMy51dGNPZmZzZXQgIT09IHZvaWQgMCkgewogICAgaWYgKGlzTmFOKG4xMy51dGNPZmZzZXQpKSB0aHJvdyBuZXcgRXJyb3IoIkNyb25PcHRpb25zOiBJbnZhbGlkIHZhbHVlIHBhc3NlZCBmb3IgdXRjT2Zmc2V0LCBzaG91bGQgYmUgbnVtYmVyIHJlcHJlc2VudGluZyBtaW51dGVzIG9mZnNldCBmcm9tIFVUQy4iKTsKICAgIGlmIChuMTMudXRjT2Zmc2V0IDwgLTg3MCB8fCBuMTMudXRjT2Zmc2V0ID4gODcwKSB0aHJvdyBuZXcgRXJyb3IoIkNyb25PcHRpb25zOiB1dGNPZmZzZXQgb3V0IG9mIGJvdW5kcy4iKTsKICAgIGlmIChuMTMudXRjT2Zmc2V0ICE9PSB2b2lkIDAgJiYgbjEzLnRpbWV6b25lKSB0aHJvdyBuZXcgRXJyb3IoIkNyb25PcHRpb25zOiBDb21iaW5pbmcgJ3V0Y09mZnNldCcgd2l0aCAndGltZXpvbmUnIGlzIG5vdCBhbGxvd2VkLiIpOwogIH0KICBpZiAobjEzLnVucmVmICE9PSB0cnVlICYmIG4xMy51bnJlZiAhPT0gZmFsc2UpIHRocm93IG5ldyBFcnJvcigiQ3Jvbk9wdGlvbnM6IFVucmVmIHNob3VsZCBiZSBlaXRoZXIgdHJ1ZSwgZmFsc2Ugb3IgdW5kZWZpbmVkKGZhbHNlKS4iKTsKICByZXR1cm4gbjEzOwp9CmZ1bmN0aW9uIGcyKG4xMykgewogIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobjEzKSA9PT0gIltvYmplY3QgRnVuY3Rpb25dIiB8fCB0eXBlb2YgbjEzID09ICJmdW5jdGlvbiIgfHwgbjEzIGluc3RhbmNlb2YgRnVuY3Rpb247Cn0KZnVuY3Rpb24gUzMobjEzKSB7CiAgcmV0dXJuIGcyKG4xMyk7Cn0KZnVuY3Rpb24gUDIobjEzKSB7CiAgdHlwZW9mIERlbm8gPCAidSIgJiYgdHlwZW9mIERlbm8udW5yZWZUaW1lciA8ICJ1IiA/IERlbm8udW5yZWZUaW1lcihuMTMpIDogbjEzICYmIHR5cGVvZiBuMTMudW5yZWYgPCAidSIgJiYgbjEzLnVucmVmKCk7Cn0KdmFyIGIzLCBwMywgdjIsIGQzLCBPLCBtMiwgZjMsIF8yLCB5MywgUjI7CnZhciBpbml0X2Nyb25lciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2Nyb25lckA5LjEuMC9ub2RlX21vZHVsZXMvY3JvbmVyL2Rpc3QvY3JvbmVyLmpzIigpIHsKICAgIGgzLmZyb21UWklTTyA9IChuMTMsIHQ5LCBlMTEpID0+IGgzLmZyb21UWihrMihuMTMsIHQ5KSwgZTExKTsKICAgIGgzLmZyb21UWiA9IGZ1bmN0aW9uKG4xMywgdDkpIHsKICAgICAgbGV0IGUxMSA9IG5ldyBEYXRlKERhdGUuVVRDKG4xMy55LCBuMTMubSAtIDEsIG4xMy5kLCBuMTMuaCwgbjEzLmksIG4xMy5zKSksIHIxMSA9IEQyKG4xMy50eiwgZTExKSwgczEwID0gbmV3IERhdGUoZTExLmdldFRpbWUoKSAtIHIxMSksIGkxMSA9IEQyKG4xMy50eiwgczEwKTsKICAgICAgaWYgKGkxMSAtIHIxMSA9PT0gMCkgcmV0dXJuIHMxMDsKICAgICAgewogICAgICAgIGxldCBhNSA9IG5ldyBEYXRlKGUxMS5nZXRUaW1lKCkgLSBpMTEpLCBsNiA9IEQyKG4xMy50eiwgYTUpOwogICAgICAgIGlmIChsNiAtIGkxMSA9PT0gMCkgcmV0dXJuIGE1OwogICAgICAgIGlmICghdDkgJiYgbDYgLSBpMTEgPiAwKSByZXR1cm4gYTU7CiAgICAgICAgaWYgKHQ5KSB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZGF0ZSBwYXNzZWQgdG8gZnJvbVRaKCkiKTsKICAgICAgICByZXR1cm4gczEwOwogICAgICB9CiAgICB9OwogICAgaDMudG9UWiA9IGZ1bmN0aW9uKG4xMywgdDkpIHsKICAgICAgbGV0IGUxMSA9IG4xMy50b0xvY2FsZVN0cmluZygiZW4tVVMiLCB7IHRpbWVab25lOiB0OSB9KS5yZXBsYWNlKC9bXHUyMDJmXS8sICIgIiksIHIxMSA9IG5ldyBEYXRlKGUxMSk7CiAgICAgIHJldHVybiB7IHk6IHIxMS5nZXRGdWxsWWVhcigpLCBtOiByMTEuZ2V0TW9udGgoKSArIDEsIGQ6IHIxMS5nZXREYXRlKCksIGg6IHIxMS5nZXRIb3VycygpLCBpOiByMTEuZ2V0TWludXRlcygpLCBzOiByMTEuZ2V0U2Vjb25kcygpLCB0ejogdDkgfTsKICAgIH07CiAgICBoMy50cCA9IChuMTMsIHQ5LCBlMTEsIHIxMSwgczEwLCBpMTEsIGE1KSA9PiAoeyB5OiBuMTMsIG06IHQ5LCBkOiBlMTEsIGg6IHIxMSwgaTogczEwLCBzOiBpMTEsIHR6OiBhNSB9KTsKICAgIGgzLm1pbml0eiA9IGgzOwogICAgYjMgPSAzMiwgcDMgPSAzMSB8IGIzLCB2MiA9IFsxLCAyLCA0LCA4LCAxNl0sIGQzID0gY2xhc3MgewogICAgICBwYXR0ZXJuOwogICAgICB0aW1lem9uZTsKICAgICAgc2Vjb25kOwogICAgICBtaW51dGU7CiAgICAgIGhvdXI7CiAgICAgIGRheTsKICAgICAgbW9udGg7CiAgICAgIGRheU9mV2VlazsKICAgICAgbGFzdERheU9mTW9udGg7CiAgICAgIHN0YXJET007CiAgICAgIHN0YXJET1c7CiAgICAgIGNvbnN0cnVjdG9yKHQ5LCBlMTEpIHsKICAgICAgICB0aGlzLnBhdHRlcm4gPSB0OSwgdGhpcy50aW1lem9uZSA9IGUxMSwgdGhpcy5zZWNvbmQgPSBBcnJheSg2MCkuZmlsbCgwKSwgdGhpcy5taW51dGUgPSBBcnJheSg2MCkuZmlsbCgwKSwgdGhpcy5ob3VyID0gQXJyYXkoMjQpLmZpbGwoMCksIHRoaXMuZGF5ID0gQXJyYXkoMzEpLmZpbGwoMCksIHRoaXMubW9udGggPSBBcnJheSgxMikuZmlsbCgwKSwgdGhpcy5kYXlPZldlZWsgPSBBcnJheSg3KS5maWxsKDApLCB0aGlzLmxhc3REYXlPZk1vbnRoID0gZmFsc2UsIHRoaXMuc3RhckRPTSA9IGZhbHNlLCB0aGlzLnN0YXJET1cgPSBmYWxzZSwgdGhpcy5wYXJzZSgpOwogICAgICB9CiAgICAgIHBhcnNlKCkgewogICAgICAgIGlmICghKHR5cGVvZiB0aGlzLnBhdHRlcm4gPT0gInN0cmluZyIgfHwgdGhpcy5wYXR0ZXJuIGluc3RhbmNlb2YgU3RyaW5nKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFBhdHRlcm4gaGFzIHRvIGJlIG9mIHR5cGUgc3RyaW5nLiIpOwogICAgICAgIHRoaXMucGF0dGVybi5pbmRleE9mKCJAIikgPj0gMCAmJiAodGhpcy5wYXR0ZXJuID0gdGhpcy5oYW5kbGVOaWNrbmFtZXModGhpcy5wYXR0ZXJuKS50cmltKCkpOwogICAgICAgIGxldCB0OSA9IHRoaXMucGF0dGVybi5yZXBsYWNlKC9ccysvZywgIiAiKS5zcGxpdCgiICIpOwogICAgICAgIGlmICh0OS5sZW5ndGggPCA1IHx8IHQ5Lmxlbmd0aCA+IDYpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gZm9ybWF0ICgnIiArIHRoaXMucGF0dGVybiArICInKSwgZXhhY3RseSBmaXZlIG9yIHNpeCBzcGFjZSBzZXBhcmF0ZWQgcGFydHMgYXJlIHJlcXVpcmVkLiIpOwogICAgICAgIGlmICh0OS5sZW5ndGggPT09IDUgJiYgdDkudW5zaGlmdCgiMCIpLCB0OVszXS5pbmRleE9mKCJMIikgPj0gMCAmJiAodDlbM10gPSB0OVszXS5yZXBsYWNlKCJMIiwgIiIpLCB0aGlzLmxhc3REYXlPZk1vbnRoID0gdHJ1ZSksIHQ5WzNdID09ICIqIiAmJiAodGhpcy5zdGFyRE9NID0gdHJ1ZSksIHQ5WzRdLmxlbmd0aCA+PSAzICYmICh0OVs0XSA9IHRoaXMucmVwbGFjZUFscGhhTW9udGhzKHQ5WzRdKSksIHQ5WzVdLmxlbmd0aCA+PSAzICYmICh0OVs1XSA9IHRoaXMucmVwbGFjZUFscGhhRGF5cyh0OVs1XSkpLCB0OVs1XSA9PSAiKiIgJiYgKHRoaXMuc3RhckRPVyA9IHRydWUpLCB0aGlzLnBhdHRlcm4uaW5kZXhPZigiPyIpID49IDApIHsKICAgICAgICAgIGxldCBlMTEgPSBuZXcgZjMoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCksIHRoaXMudGltZXpvbmUpLmdldERhdGUodHJ1ZSk7CiAgICAgICAgICB0OVswXSA9IHQ5WzBdLnJlcGxhY2UoIj8iLCBlMTEuZ2V0U2Vjb25kcygpLnRvU3RyaW5nKCkpLCB0OVsxXSA9IHQ5WzFdLnJlcGxhY2UoIj8iLCBlMTEuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkpLCB0OVsyXSA9IHQ5WzJdLnJlcGxhY2UoIj8iLCBlMTEuZ2V0SG91cnMoKS50b1N0cmluZygpKSwgdGhpcy5zdGFyRE9NIHx8ICh0OVszXSA9IHQ5WzNdLnJlcGxhY2UoIj8iLCBlMTEuZ2V0RGF0ZSgpLnRvU3RyaW5nKCkpKSwgdDlbNF0gPSB0OVs0XS5yZXBsYWNlKCI/IiwgKGUxMS5nZXRNb250aCgpICsgMSkudG9TdHJpbmcoKSksIHRoaXMuc3RhckRPVyB8fCAodDlbNV0gPSB0OVs1XS5yZXBsYWNlKCI/IiwgZTExLmdldERheSgpLnRvU3RyaW5nKCkpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy50aHJvd0F0SWxsZWdhbENoYXJhY3RlcnModDkpLCB0aGlzLnBhcnRUb0FycmF5KCJzZWNvbmQiLCB0OVswXSwgMCwgMSksIHRoaXMucGFydFRvQXJyYXkoIm1pbnV0ZSIsIHQ5WzFdLCAwLCAxKSwgdGhpcy5wYXJ0VG9BcnJheSgiaG91ciIsIHQ5WzJdLCAwLCAxKSwgdGhpcy5wYXJ0VG9BcnJheSgiZGF5IiwgdDlbM10sIC0xLCAxKSwgdGhpcy5wYXJ0VG9BcnJheSgibW9udGgiLCB0OVs0XSwgLTEsIDEpLCB0aGlzLnBhcnRUb0FycmF5KCJkYXlPZldlZWsiLCB0OVs1XSwgMCwgcDMpLCB0aGlzLmRheU9mV2Vla1s3XSAmJiAodGhpcy5kYXlPZldlZWtbMF0gPSB0aGlzLmRheU9mV2Vla1s3XSk7CiAgICAgIH0KICAgICAgcGFydFRvQXJyYXkodDksIGUxMSwgcjExLCBzMTApIHsKICAgICAgICBsZXQgaTExID0gdGhpc1t0OV0sIGE1ID0gdDkgPT09ICJkYXkiICYmIHRoaXMubGFzdERheU9mTW9udGg7CiAgICAgICAgaWYgKGUxMSA9PT0gIiIgJiYgIWE1KSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogY29uZmlndXJhdGlvbiBlbnRyeSAiICsgdDkgKyAiICgiICsgZTExICsgIikgaXMgZW1wdHksIGNoZWNrIGZvciB0cmFpbGluZyBzcGFjZXMuIik7CiAgICAgICAgaWYgKGUxMSA9PT0gIioiKSByZXR1cm4gaTExLmZpbGwoczEwKTsKICAgICAgICBsZXQgbDYgPSBlMTEuc3BsaXQoIiwiKTsKICAgICAgICBpZiAobDYubGVuZ3RoID4gMSkgZm9yIChsZXQgbzEzID0gMDsgbzEzIDwgbDYubGVuZ3RoOyBvMTMrKykgdGhpcy5wYXJ0VG9BcnJheSh0OSwgbDZbbzEzXSwgcjExLCBzMTApOwogICAgICAgIGVsc2UgZTExLmluZGV4T2YoIi0iKSAhPT0gLTEgJiYgZTExLmluZGV4T2YoIi8iKSAhPT0gLTEgPyB0aGlzLmhhbmRsZVJhbmdlV2l0aFN0ZXBwaW5nKGUxMSwgdDksIHIxMSwgczEwKSA6IGUxMS5pbmRleE9mKCItIikgIT09IC0xID8gdGhpcy5oYW5kbGVSYW5nZShlMTEsIHQ5LCByMTEsIHMxMCkgOiBlMTEuaW5kZXhPZigiLyIpICE9PSAtMSA/IHRoaXMuaGFuZGxlU3RlcHBpbmcoZTExLCB0OSwgcjExLCBzMTApIDogZTExICE9PSAiIiAmJiB0aGlzLmhhbmRsZU51bWJlcihlMTEsIHQ5LCByMTEsIHMxMCk7CiAgICAgIH0KICAgICAgdGhyb3dBdElsbGVnYWxDaGFyYWN0ZXJzKHQ5KSB7CiAgICAgICAgZm9yIChsZXQgZTExID0gMDsgZTExIDwgdDkubGVuZ3RoOyBlMTErKykgaWYgKChlMTEgPT09IDUgPyAvW14vKjAtOSxcLSNMXSsvIDogL1teLyowLTksLV0rLykudGVzdCh0OVtlMTFdKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IGNvbmZpZ3VyYXRpb24gZW50cnkgIiArIGUxMSArICIgKCIgKyB0OVtlMTFdICsgIikgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJzLiIpOwogICAgICB9CiAgICAgIGhhbmRsZU51bWJlcih0OSwgZTExLCByMTEsIHMxMCkgewogICAgICAgIGxldCBpMTEgPSB0aGlzLmV4dHJhY3ROdGgodDksIGUxMSksIGE1ID0gcGFyc2VJbnQoaTExWzBdLCAxMCkgKyByMTE7CiAgICAgICAgaWYgKGlzTmFOKGE1KSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46ICIgKyBlMTEgKyAiIGlzIG5vdCBhIG51bWJlcjogJyIgKyB0OSArICInIik7CiAgICAgICAgdGhpcy5zZXRQYXJ0KGUxMSwgYTUsIGkxMVsxXSB8fCBzMTApOwogICAgICB9CiAgICAgIHNldFBhcnQodDksIGUxMSwgcjExKSB7CiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcywgdDkpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogSW52YWxpZCBwYXJ0IHNwZWNpZmllZDogIiArIHQ5KTsKICAgICAgICBpZiAodDkgPT09ICJkYXlPZldlZWsiKSB7CiAgICAgICAgICBpZiAoZTExID09PSA3ICYmIChlMTEgPSAwKSwgZTExIDwgMCB8fCBlMTEgPiA2KSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQ3JvblBhdHRlcm46IEludmFsaWQgdmFsdWUgZm9yIGRheU9mV2VlazogIiArIGUxMSk7CiAgICAgICAgICB0aGlzLnNldE50aFdlZWtkYXlPZk1vbnRoKGUxMSwgcjExKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHQ5ID09PSAic2Vjb25kIiB8fCB0OSA9PT0gIm1pbnV0ZSIpIHsKICAgICAgICAgIGlmIChlMTEgPCAwIHx8IGUxMSA+PSA2MCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNyb25QYXR0ZXJuOiBJbnZhbGlkIHZhbHVlIGZvciAiICsgdDkgKyAiOiAiICsgZTExKTsKICAgICAgICB9IGVsc2UgaWYgKHQ5ID09PSAiaG91ciIpIHsKICAgICAgICAgIGlmIChlMTEgPCAwIHx8IGUxMSA+PSAyNCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNyb25QYXR0ZXJuOiBJbnZhbGlkIHZhbHVlIGZvciAiICsgdDkgKyAiOiAiICsgZTExKTsKICAgICAgICB9IGVsc2UgaWYgKHQ5ID09PSAiZGF5IikgewogICAgICAgICAgaWYgKGUxMSA8IDAgfHwgZTExID49IDMxKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQ3JvblBhdHRlcm46IEludmFsaWQgdmFsdWUgZm9yICIgKyB0OSArICI6ICIgKyBlMTEpOwogICAgICAgIH0gZWxzZSBpZiAodDkgPT09ICJtb250aCIgJiYgKGUxMSA8IDAgfHwgZTExID49IDEyKSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNyb25QYXR0ZXJuOiBJbnZhbGlkIHZhbHVlIGZvciAiICsgdDkgKyAiOiAiICsgZTExKTsKICAgICAgICB0aGlzW3Q5XVtlMTFdID0gcjExOwogICAgICB9CiAgICAgIGhhbmRsZVJhbmdlV2l0aFN0ZXBwaW5nKHQ5LCBlMTEsIHIxMSwgczEwKSB7CiAgICAgICAgbGV0IGkxMSA9IHRoaXMuZXh0cmFjdE50aCh0OSwgZTExKSwgYTUgPSBpMTFbMF0ubWF0Y2goL14oXGQrKS0oXGQrKVwvKFxkKykkLyk7CiAgICAgICAgaWYgKGE1ID09PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIHJhbmdlIHdpdGggc3RlcHBpbmc6ICciICsgdDkgKyAiJyIpOwogICAgICAgIGxldCBbLCBsNiwgbzEzLCB1N10gPSBhNSwgYzExID0gcGFyc2VJbnQobDYsIDEwKSArIHIxMSwgdzQgPSBwYXJzZUludChvMTMsIDEwKSArIHIxMSwgQzQgPSBwYXJzZUludCh1NywgMTApOwogICAgICAgIGlmIChpc05hTihjMTEpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIGxvd2VyIHJhbmdlIChOYU4pIik7CiAgICAgICAgaWYgKGlzTmFOKHc0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgaWxsZWdhbCB1cHBlciByYW5nZSAoTmFOKSIpOwogICAgICAgIGlmIChpc05hTihDNCkpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIGlsbGVnYWwgc3RlcHBpbmc6IChOYU4pIik7CiAgICAgICAgaWYgKEM0ID09PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIHN0ZXBwaW5nOiAwIik7CiAgICAgICAgaWYgKEM0ID4gdGhpc1tlMTFdLmxlbmd0aCkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgc3RlcHMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIHZhbHVlIG9mIHBhcnQgKCIgKyB0aGlzW2UxMV0ubGVuZ3RoICsgIikiKTsKICAgICAgICBpZiAoYzExID4gdzQpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBGcm9tIHZhbHVlIGlzIGxhcmdlciB0aGFuIHRvIHZhbHVlOiAnIiArIHQ5ICsgIiciKTsKICAgICAgICBmb3IgKGxldCBUNCA9IGMxMTsgVDQgPD0gdzQ7IFQ0ICs9IEM0KSB0aGlzLnNldFBhcnQoZTExLCBUNCwgaTExWzFdIHx8IHMxMCk7CiAgICAgIH0KICAgICAgZXh0cmFjdE50aCh0OSwgZTExKSB7CiAgICAgICAgbGV0IHIxMSA9IHQ5LCBzMTA7CiAgICAgICAgaWYgKHIxMS5pbmNsdWRlcygiIyIpKSB7CiAgICAgICAgICBpZiAoZTExICE9PSAiZGF5T2ZXZWVrIikgdGhyb3cgbmV3IEVycm9yKCJDcm9uUGF0dGVybjogbnRoICgjKSBvbmx5IGFsbG93ZWQgaW4gZGF5LW9mLXdlZWsgZmllbGQiKTsKICAgICAgICAgIHMxMCA9IHIxMS5zcGxpdCgiIyIpWzFdLCByMTEgPSByMTEuc3BsaXQoIiMiKVswXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtyMTEsIHMxMF07CiAgICAgIH0KICAgICAgaGFuZGxlUmFuZ2UodDksIGUxMSwgcjExLCBzMTApIHsKICAgICAgICBsZXQgaTExID0gdGhpcy5leHRyYWN0TnRoKHQ5LCBlMTEpLCBhNSA9IGkxMVswXS5zcGxpdCgiLSIpOwogICAgICAgIGlmIChhNS5sZW5ndGggIT09IDIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIGlsbGVnYWwgcmFuZ2U6ICciICsgdDkgKyAiJyIpOwogICAgICAgIGxldCBsNiA9IHBhcnNlSW50KGE1WzBdLCAxMCkgKyByMTEsIG8xMyA9IHBhcnNlSW50KGE1WzFdLCAxMCkgKyByMTE7CiAgICAgICAgaWYgKGlzTmFOKGw2KSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgaWxsZWdhbCBsb3dlciByYW5nZSAoTmFOKSIpOwogICAgICAgIGlmIChpc05hTihvMTMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIHVwcGVyIHJhbmdlIChOYU4pIik7CiAgICAgICAgaWYgKGw2ID4gbzEzKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogRnJvbSB2YWx1ZSBpcyBsYXJnZXIgdGhhbiB0byB2YWx1ZTogJyIgKyB0OSArICInIik7CiAgICAgICAgZm9yIChsZXQgdTcgPSBsNjsgdTcgPD0gbzEzOyB1NysrKSB0aGlzLnNldFBhcnQoZTExLCB1NywgaTExWzFdIHx8IHMxMCk7CiAgICAgIH0KICAgICAgaGFuZGxlU3RlcHBpbmcodDksIGUxMSwgcjExLCBzMTApIHsKICAgICAgICBsZXQgaTExID0gdGhpcy5leHRyYWN0TnRoKHQ5LCBlMTEpLCBhNSA9IGkxMVswXS5zcGxpdCgiLyIpOwogICAgICAgIGlmIChhNS5sZW5ndGggIT09IDIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIGlsbGVnYWwgc3RlcHBpbmc6ICciICsgdDkgKyAiJyIpOwogICAgICAgIGE1WzBdID09PSAiIiAmJiAoYTVbMF0gPSAiKiIpOwogICAgICAgIGxldCBsNiA9IDA7CiAgICAgICAgYTVbMF0gIT09ICIqIiAmJiAobDYgPSBwYXJzZUludChhNVswXSwgMTApICsgcjExKTsKICAgICAgICBsZXQgbzEzID0gcGFyc2VJbnQoYTVbMV0sIDEwKTsKICAgICAgICBpZiAoaXNOYU4obzEzKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgaWxsZWdhbCBzdGVwcGluZzogKE5hTikiKTsKICAgICAgICBpZiAobzEzID09PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIHN0ZXBwaW5nOiAwIik7CiAgICAgICAgaWYgKG8xMyA+IHRoaXNbZTExXS5sZW5ndGgpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIG1heCBzdGVwcyBmb3IgcGFydCBpcyAoIiArIHRoaXNbZTExXS5sZW5ndGggKyAiKSIpOwogICAgICAgIGZvciAobGV0IHU3ID0gbDY7IHU3IDwgdGhpc1tlMTFdLmxlbmd0aDsgdTcgKz0gbzEzKSB0aGlzLnNldFBhcnQoZTExLCB1NywgaTExWzFdIHx8IHMxMCk7CiAgICAgIH0KICAgICAgcmVwbGFjZUFscGhhRGF5cyh0OSkgewogICAgICAgIHJldHVybiB0OS5yZXBsYWNlKC8tc3VuL2dpLCAiLTciKS5yZXBsYWNlKC9zdW4vZ2ksICIwIikucmVwbGFjZSgvbW9uL2dpLCAiMSIpLnJlcGxhY2UoL3R1ZS9naSwgIjIiKS5yZXBsYWNlKC93ZWQvZ2ksICIzIikucmVwbGFjZSgvdGh1L2dpLCAiNCIpLnJlcGxhY2UoL2ZyaS9naSwgIjUiKS5yZXBsYWNlKC9zYXQvZ2ksICI2Iik7CiAgICAgIH0KICAgICAgcmVwbGFjZUFscGhhTW9udGhzKHQ5KSB7CiAgICAgICAgcmV0dXJuIHQ5LnJlcGxhY2UoL2phbi9naSwgIjEiKS5yZXBsYWNlKC9mZWIvZ2ksICIyIikucmVwbGFjZSgvbWFyL2dpLCAiMyIpLnJlcGxhY2UoL2Fwci9naSwgIjQiKS5yZXBsYWNlKC9tYXkvZ2ksICI1IikucmVwbGFjZSgvanVuL2dpLCAiNiIpLnJlcGxhY2UoL2p1bC9naSwgIjciKS5yZXBsYWNlKC9hdWcvZ2ksICI4IikucmVwbGFjZSgvc2VwL2dpLCAiOSIpLnJlcGxhY2UoL29jdC9naSwgIjEwIikucmVwbGFjZSgvbm92L2dpLCAiMTEiKS5yZXBsYWNlKC9kZWMvZ2ksICIxMiIpOwogICAgICB9CiAgICAgIGhhbmRsZU5pY2tuYW1lcyh0OSkgewogICAgICAgIGxldCBlMTEgPSB0OS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgICAgICByZXR1cm4gZTExID09PSAiQHllYXJseSIgfHwgZTExID09PSAiQGFubnVhbGx5IiA/ICIwIDAgMSAxICoiIDogZTExID09PSAiQG1vbnRobHkiID8gIjAgMCAxICogKiIgOiBlMTEgPT09ICJAd2Vla2x5IiA/ICIwIDAgKiAqIDAiIDogZTExID09PSAiQGRhaWx5IiA/ICIwIDAgKiAqICoiIDogZTExID09PSAiQGhvdXJseSIgPyAiMCAqICogKiAqIiA6IHQ5OwogICAgICB9CiAgICAgIHNldE50aFdlZWtkYXlPZk1vbnRoKHQ5LCBlMTEpIHsKICAgICAgICBpZiAodHlwZW9mIGUxMSAhPSAibnVtYmVyIiAmJiBlMTEgPT09ICJMIikgdGhpcy5kYXlPZldlZWtbdDldID0gdGhpcy5kYXlPZldlZWtbdDldIHwgYjM7CiAgICAgICAgZWxzZSBpZiAoZTExID09PSBwMykgdGhpcy5kYXlPZldlZWtbdDldID0gcDM7CiAgICAgICAgZWxzZSBpZiAoZTExIDwgNiAmJiBlMTEgPiAwKSB0aGlzLmRheU9mV2Vla1t0OV0gPSB0aGlzLmRheU9mV2Vla1t0OV0gfCB2MltlMTEgLSAxXTsKICAgICAgICBlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoYENyb25QYXR0ZXJuOiBudGggd2Vla2RheSBvdXQgb2YgcmFuZ2UsIHNob3VsZCBiZSAxLTUgb3IgTC4gVmFsdWU6ICR7ZTExfSwgVHlwZTogJHt0eXBlb2YgZTExfWApOwogICAgICB9CiAgICB9OwogICAgTyA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXSwgbTIgPSBbWyJtb250aCIsICJ5ZWFyIiwgMF0sIFsiZGF5IiwgIm1vbnRoIiwgLTFdLCBbImhvdXIiLCAiZGF5IiwgMF0sIFsibWludXRlIiwgImhvdXIiLCAwXSwgWyJzZWNvbmQiLCAibWludXRlIiwgMF1dLCBmMyA9IGNsYXNzIG42IHsKICAgICAgdHo7CiAgICAgIG1zOwogICAgICBzZWNvbmQ7CiAgICAgIG1pbnV0ZTsKICAgICAgaG91cjsKICAgICAgZGF5OwogICAgICBtb250aDsKICAgICAgeWVhcjsKICAgICAgY29uc3RydWN0b3IodDksIGUxMSkgewogICAgICAgIGlmICh0aGlzLnR6ID0gZTExLCB0OSAmJiB0OSBpbnN0YW5jZW9mIERhdGUpIGlmICghaXNOYU4odDkpKSB0aGlzLmZyb21EYXRlKHQ5KTsKICAgICAgICBlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25EYXRlOiBJbnZhbGlkIGRhdGUgcGFzc2VkIHRvIENyb25EYXRlIGNvbnN0cnVjdG9yIik7CiAgICAgICAgZWxzZSBpZiAodDkgPT09IHZvaWQgMCkgdGhpcy5mcm9tRGF0ZSgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSk7CiAgICAgICAgZWxzZSBpZiAodDkgJiYgdHlwZW9mIHQ5ID09ICJzdHJpbmciKSB0aGlzLmZyb21TdHJpbmcodDkpOwogICAgICAgIGVsc2UgaWYgKHQ5IGluc3RhbmNlb2YgbjYpIHRoaXMuZnJvbUNyb25EYXRlKHQ5KTsKICAgICAgICBlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25EYXRlOiBJbnZhbGlkIHR5cGUgKCIgKyB0eXBlb2YgdDkgKyAiKSBwYXNzZWQgdG8gQ3JvbkRhdGUgY29uc3RydWN0b3IiKTsKICAgICAgfQogICAgICBpc050aFdlZWtkYXlPZk1vbnRoKHQ5LCBlMTEsIHIxMSwgczEwKSB7CiAgICAgICAgbGV0IGE1ID0gbmV3IERhdGUoRGF0ZS5VVEModDksIGUxMSwgcjExKSkuZ2V0VVRDRGF5KCksIGw2ID0gMDsKICAgICAgICBmb3IgKGxldCBvMTMgPSAxOyBvMTMgPD0gcjExOyBvMTMrKykgbmV3IERhdGUoRGF0ZS5VVEModDksIGUxMSwgbzEzKSkuZ2V0VVRDRGF5KCkgPT09IGE1ICYmIGw2Kys7CiAgICAgICAgaWYgKHMxMCAmIHAzICYmIHYyW2w2IC0gMV0gJiBzMTApIHJldHVybiB0cnVlOwogICAgICAgIGlmIChzMTAgJiBiMykgewogICAgICAgICAgbGV0IG8xMyA9IG5ldyBEYXRlKERhdGUuVVRDKHQ5LCBlMTEgKyAxLCAwKSkuZ2V0VVRDRGF0ZSgpOwogICAgICAgICAgZm9yIChsZXQgdTcgPSByMTEgKyAxOyB1NyA8PSBvMTM7IHU3KyspIGlmIChuZXcgRGF0ZShEYXRlLlVUQyh0OSwgZTExLCB1NykpLmdldFVUQ0RheSgpID09PSBhNSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBmcm9tRGF0ZSh0OSkgewogICAgICAgIGlmICh0aGlzLnR6ICE9PSB2b2lkIDApIGlmICh0eXBlb2YgdGhpcy50eiA9PSAibnVtYmVyIikgdGhpcy5tcyA9IHQ5LmdldFVUQ01pbGxpc2Vjb25kcygpLCB0aGlzLnNlY29uZCA9IHQ5LmdldFVUQ1NlY29uZHMoKSwgdGhpcy5taW51dGUgPSB0OS5nZXRVVENNaW51dGVzKCkgKyB0aGlzLnR6LCB0aGlzLmhvdXIgPSB0OS5nZXRVVENIb3VycygpLCB0aGlzLmRheSA9IHQ5LmdldFVUQ0RhdGUoKSwgdGhpcy5tb250aCA9IHQ5LmdldFVUQ01vbnRoKCksIHRoaXMueWVhciA9IHQ5LmdldFVUQ0Z1bGxZZWFyKCksIHRoaXMuYXBwbHkoKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGxldCBlMTEgPSBoMy50b1RaKHQ5LCB0aGlzLnR6KTsKICAgICAgICAgIHRoaXMubXMgPSB0OS5nZXRNaWxsaXNlY29uZHMoKSwgdGhpcy5zZWNvbmQgPSBlMTEucywgdGhpcy5taW51dGUgPSBlMTEuaSwgdGhpcy5ob3VyID0gZTExLmgsIHRoaXMuZGF5ID0gZTExLmQsIHRoaXMubW9udGggPSBlMTEubSAtIDEsIHRoaXMueWVhciA9IGUxMS55OwogICAgICAgIH0KICAgICAgICBlbHNlIHRoaXMubXMgPSB0OS5nZXRNaWxsaXNlY29uZHMoKSwgdGhpcy5zZWNvbmQgPSB0OS5nZXRTZWNvbmRzKCksIHRoaXMubWludXRlID0gdDkuZ2V0TWludXRlcygpLCB0aGlzLmhvdXIgPSB0OS5nZXRIb3VycygpLCB0aGlzLmRheSA9IHQ5LmdldERhdGUoKSwgdGhpcy5tb250aCA9IHQ5LmdldE1vbnRoKCksIHRoaXMueWVhciA9IHQ5LmdldEZ1bGxZZWFyKCk7CiAgICAgIH0KICAgICAgZnJvbUNyb25EYXRlKHQ5KSB7CiAgICAgICAgdGhpcy50eiA9IHQ5LnR6LCB0aGlzLnllYXIgPSB0OS55ZWFyLCB0aGlzLm1vbnRoID0gdDkubW9udGgsIHRoaXMuZGF5ID0gdDkuZGF5LCB0aGlzLmhvdXIgPSB0OS5ob3VyLCB0aGlzLm1pbnV0ZSA9IHQ5Lm1pbnV0ZSwgdGhpcy5zZWNvbmQgPSB0OS5zZWNvbmQsIHRoaXMubXMgPSB0OS5tczsKICAgICAgfQogICAgICBhcHBseSgpIHsKICAgICAgICBpZiAodGhpcy5tb250aCA+IDExIHx8IHRoaXMuZGF5ID4gT1t0aGlzLm1vbnRoXSB8fCB0aGlzLmhvdXIgPiA1OSB8fCB0aGlzLm1pbnV0ZSA+IDU5IHx8IHRoaXMuc2Vjb25kID4gNTkgfHwgdGhpcy5ob3VyIDwgMCB8fCB0aGlzLm1pbnV0ZSA8IDAgfHwgdGhpcy5zZWNvbmQgPCAwKSB7CiAgICAgICAgICBsZXQgdDkgPSBuZXcgRGF0ZShEYXRlLlVUQyh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF5LCB0aGlzLmhvdXIsIHRoaXMubWludXRlLCB0aGlzLnNlY29uZCwgdGhpcy5tcykpOwogICAgICAgICAgcmV0dXJuIHRoaXMubXMgPSB0OS5nZXRVVENNaWxsaXNlY29uZHMoKSwgdGhpcy5zZWNvbmQgPSB0OS5nZXRVVENTZWNvbmRzKCksIHRoaXMubWludXRlID0gdDkuZ2V0VVRDTWludXRlcygpLCB0aGlzLmhvdXIgPSB0OS5nZXRVVENIb3VycygpLCB0aGlzLmRheSA9IHQ5LmdldFVUQ0RhdGUoKSwgdGhpcy5tb250aCA9IHQ5LmdldFVUQ01vbnRoKCksIHRoaXMueWVhciA9IHQ5LmdldFVUQ0Z1bGxZZWFyKCksIHRydWU7CiAgICAgICAgfSBlbHNlIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBmcm9tU3RyaW5nKHQ5KSB7CiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnR6ID09ICJudW1iZXIiKSB7CiAgICAgICAgICBsZXQgZTExID0gaDMuZnJvbVRaSVNPKHQ5KTsKICAgICAgICAgIHRoaXMubXMgPSBlMTEuZ2V0VVRDTWlsbGlzZWNvbmRzKCksIHRoaXMuc2Vjb25kID0gZTExLmdldFVUQ1NlY29uZHMoKSwgdGhpcy5taW51dGUgPSBlMTEuZ2V0VVRDTWludXRlcygpLCB0aGlzLmhvdXIgPSBlMTEuZ2V0VVRDSG91cnMoKSwgdGhpcy5kYXkgPSBlMTEuZ2V0VVRDRGF0ZSgpLCB0aGlzLm1vbnRoID0gZTExLmdldFVUQ01vbnRoKCksIHRoaXMueWVhciA9IGUxMS5nZXRVVENGdWxsWWVhcigpLCB0aGlzLmFwcGx5KCk7CiAgICAgICAgfSBlbHNlIHJldHVybiB0aGlzLmZyb21EYXRlKGgzLmZyb21UWklTTyh0OSwgdGhpcy50eikpOwogICAgICB9CiAgICAgIGZpbmROZXh0KHQ5LCBlMTEsIHIxMSwgczEwKSB7CiAgICAgICAgbGV0IGkxMSA9IHRoaXNbZTExXSwgYTU7CiAgICAgICAgcjExLmxhc3REYXlPZk1vbnRoICYmICh0aGlzLm1vbnRoICE9PSAxID8gYTUgPSBPW3RoaXMubW9udGhdIDogYTUgPSBuZXcgRGF0ZShEYXRlLlVUQyh0aGlzLnllYXIsIHRoaXMubW9udGggKyAxLCAwLCAwLCAwLCAwLCAwKSkuZ2V0VVRDRGF0ZSgpKTsKICAgICAgICBsZXQgbDYgPSAhcjExLnN0YXJET1cgJiYgZTExID09ICJkYXkiID8gbmV3IERhdGUoRGF0ZS5VVEModGhpcy55ZWFyLCB0aGlzLm1vbnRoLCAxLCAwLCAwLCAwLCAwKSkuZ2V0VVRDRGF5KCkgOiB2b2lkIDA7CiAgICAgICAgZm9yIChsZXQgbzEzID0gdGhpc1tlMTFdICsgczEwOyBvMTMgPCByMTFbZTExXS5sZW5ndGg7IG8xMysrKSB7CiAgICAgICAgICBsZXQgdTcgPSByMTFbZTExXVtvMTNdOwogICAgICAgICAgaWYgKGUxMSA9PT0gImRheSIgJiYgcjExLmxhc3REYXlPZk1vbnRoICYmIG8xMyAtIHMxMCA9PSBhNSAmJiAodTcgPSAxKSwgZTExID09PSAiZGF5IiAmJiAhcjExLnN0YXJET1cpIHsKICAgICAgICAgICAgbGV0IGMxMSA9IHIxMS5kYXlPZldlZWtbKGw2ICsgKG8xMyAtIHMxMCAtIDEpKSAlIDddOwogICAgICAgICAgICBpZiAoYzExICYmIGMxMSAmIHAzKSBjMTEgPSB0aGlzLmlzTnRoV2Vla2RheU9mTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoLCBvMTMgLSBzMTAsIGMxMSkgPyAxIDogMDsKICAgICAgICAgICAgZWxzZSBpZiAoYzExKSB0aHJvdyBuZXcgRXJyb3IoYENyb25EYXRlOiBJbnZhbGlkIHZhbHVlIGZvciBkYXlPZldlZWsgZW5jb3VudGVyZWQuICR7YzExfWApOwogICAgICAgICAgICB0OS5sZWdhY3lNb2RlICYmICFyMTEuc3RhckRPTSA/IHU3ID0gdTcgfHwgYzExIDogdTcgPSB1NyAmJiBjMTE7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodTcpIHJldHVybiB0aGlzW2UxMV0gPSBvMTMgLSBzMTAsIGkxMSAhPT0gdGhpc1tlMTFdID8gMiA6IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiAzOwogICAgICB9CiAgICAgIHJlY3Vyc2UodDksIGUxMSwgcjExKSB7CiAgICAgICAgbGV0IHMxMCA9IHRoaXMuZmluZE5leHQoZTExLCBtMltyMTFdWzBdLCB0OSwgbTJbcjExXVsyXSk7CiAgICAgICAgaWYgKHMxMCA+IDEpIHsKICAgICAgICAgIGxldCBpMTEgPSByMTEgKyAxOwogICAgICAgICAgZm9yICg7IGkxMSA8IG0yLmxlbmd0aDsgKSB0aGlzW20yW2kxMV1bMF1dID0gLW0yW2kxMV1bMl0sIGkxMSsrOwogICAgICAgICAgaWYgKHMxMCA9PT0gMykgcmV0dXJuIHRoaXNbbTJbcjExXVsxXV0rKywgdGhpc1ttMltyMTFdWzBdXSA9IC1tMltyMTFdWzJdLCB0aGlzLmFwcGx5KCksIHRoaXMucmVjdXJzZSh0OSwgZTExLCAwKTsKICAgICAgICAgIGlmICh0aGlzLmFwcGx5KCkpIHJldHVybiB0aGlzLnJlY3Vyc2UodDksIGUxMSwgcjExIC0gMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByMTEgKz0gMSwgcjExID49IG0yLmxlbmd0aCA/IHRoaXMgOiB0aGlzLnllYXIgPj0gM2UzID8gbnVsbCA6IHRoaXMucmVjdXJzZSh0OSwgZTExLCByMTEpOwogICAgICB9CiAgICAgIGluY3JlbWVudCh0OSwgZTExLCByMTEpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZWNvbmQgKz0gZTExLmludGVydmFsICE9PSB2b2lkIDAgJiYgZTExLmludGVydmFsID4gMSAmJiByMTEgPyBlMTEuaW50ZXJ2YWwgOiAxLCB0aGlzLm1zID0gMCwgdGhpcy5hcHBseSgpLCB0aGlzLnJlY3Vyc2UodDksIGUxMSwgMCk7CiAgICAgIH0KICAgICAgZ2V0RGF0ZSh0OSkgewogICAgICAgIHJldHVybiB0OSB8fCB0aGlzLnR6ID09PSB2b2lkIDAgPyBuZXcgRGF0ZSh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF5LCB0aGlzLmhvdXIsIHRoaXMubWludXRlLCB0aGlzLnNlY29uZCwgdGhpcy5tcykgOiB0eXBlb2YgdGhpcy50eiA9PSAibnVtYmVyIiA/IG5ldyBEYXRlKERhdGUuVVRDKHRoaXMueWVhciwgdGhpcy5tb250aCwgdGhpcy5kYXksIHRoaXMuaG91ciwgdGhpcy5taW51dGUgLSB0aGlzLnR6LCB0aGlzLnNlY29uZCwgdGhpcy5tcykpIDogaDMuZnJvbVRaKGgzLnRwKHRoaXMueWVhciwgdGhpcy5tb250aCArIDEsIHRoaXMuZGF5LCB0aGlzLmhvdXIsIHRoaXMubWludXRlLCB0aGlzLnNlY29uZCwgdGhpcy50eiksIGZhbHNlKTsKICAgICAgfQogICAgICBnZXRUaW1lKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldERhdGUoZmFsc2UpLmdldFRpbWUoKTsKICAgICAgfQogICAgfTsKICAgIF8yID0gMzAgKiAxZTMsIHkzID0gW10sIFIyID0gY2xhc3MgewogICAgICBuYW1lOwogICAgICBvcHRpb25zOwogICAgICBfc3RhdGVzOwogICAgICBmbjsKICAgICAgY29uc3RydWN0b3IodDksIGUxMSwgcjExKSB7CiAgICAgICAgbGV0IHMxMCwgaTExOwogICAgICAgIGlmIChnMihlMTEpKSBpMTEgPSBlMTE7CiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGUxMSA9PSAib2JqZWN0IikgczEwID0gZTExOwogICAgICAgIGVsc2UgaWYgKGUxMSAhPT0gdm9pZCAwKSB0aHJvdyBuZXcgRXJyb3IoIkNyb246IEludmFsaWQgYXJndW1lbnQgcGFzc2VkIGZvciBvcHRpb25zSW4uIFNob3VsZCBiZSBvbmUgb2YgZnVuY3Rpb24sIG9yIG9iamVjdCAob3B0aW9ucykuIik7CiAgICAgICAgaWYgKGcyKHIxMSkpIGkxMSA9IHIxMTsKICAgICAgICBlbHNlIGlmICh0eXBlb2YgcjExID09ICJvYmplY3QiKSBzMTAgPSByMTE7CiAgICAgICAgZWxzZSBpZiAocjExICE9PSB2b2lkIDApIHRocm93IG5ldyBFcnJvcigiQ3JvbjogSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgZm9yIGZ1bmNJbi4gU2hvdWxkIGJlIG9uZSBvZiBmdW5jdGlvbiwgb3Igb2JqZWN0IChvcHRpb25zKS4iKTsKICAgICAgICBpZiAodGhpcy5uYW1lID0gczEwPy5uYW1lLCB0aGlzLm9wdGlvbnMgPSBOMihzMTApLCB0aGlzLl9zdGF0ZXMgPSB7IGtpbGw6IGZhbHNlLCBibG9ja2luZzogZmFsc2UsIHByZXZpb3VzUnVuOiB2b2lkIDAsIGN1cnJlbnRSdW46IHZvaWQgMCwgb25jZTogdm9pZCAwLCBjdXJyZW50VGltZW91dDogdm9pZCAwLCBtYXhSdW5zOiBzMTAgPyBzMTAubWF4UnVucyA6IHZvaWQgMCwgcGF1c2VkOiBzMTAgPyBzMTAucGF1c2VkIDogZmFsc2UsIHBhdHRlcm46IG5ldyBkMygiKiAqICogKiAqIikgfSwgdDkgJiYgKHQ5IGluc3RhbmNlb2YgRGF0ZSB8fCB0eXBlb2YgdDkgPT0gInN0cmluZyIgJiYgdDkuaW5kZXhPZigiOiIpID4gMCkgPyB0aGlzLl9zdGF0ZXMub25jZSA9IG5ldyBmMyh0OSwgdGhpcy5vcHRpb25zLnRpbWV6b25lIHx8IHRoaXMub3B0aW9ucy51dGNPZmZzZXQpIDogdGhpcy5fc3RhdGVzLnBhdHRlcm4gPSBuZXcgZDModDksIHRoaXMub3B0aW9ucy50aW1lem9uZSksIHRoaXMubmFtZSkgewogICAgICAgICAgaWYgKHkzLmZpbmQoKGw2KSA9PiBsNi5uYW1lID09PSB0aGlzLm5hbWUpKSB0aHJvdyBuZXcgRXJyb3IoIkNyb246IFRyaWVkIHRvIGluaXRpYWxpemUgbmV3IG5hbWVkIGpvYiAnIiArIHRoaXMubmFtZSArICInLCBidXQgbmFtZSBhbHJlYWR5IHRha2VuLiIpOwogICAgICAgICAgeTMucHVzaCh0aGlzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGkxMSAhPT0gdm9pZCAwICYmIFMzKGkxMSkgJiYgKHRoaXMuZm4gPSBpMTEsIHRoaXMuc2NoZWR1bGUoKSksIHRoaXM7CiAgICAgIH0KICAgICAgbmV4dFJ1bih0OSkgewogICAgICAgIGxldCBlMTEgPSB0aGlzLl9uZXh0KHQ5KTsKICAgICAgICByZXR1cm4gZTExID8gZTExLmdldERhdGUoZmFsc2UpIDogbnVsbDsKICAgICAgfQogICAgICBuZXh0UnVucyh0OSwgZTExKSB7CiAgICAgICAgdGhpcy5fc3RhdGVzLm1heFJ1bnMgIT09IHZvaWQgMCAmJiB0OSA+IHRoaXMuX3N0YXRlcy5tYXhSdW5zICYmICh0OSA9IHRoaXMuX3N0YXRlcy5tYXhSdW5zKTsKICAgICAgICBsZXQgcjExID0gW10sIHMxMCA9IGUxMSB8fCB0aGlzLl9zdGF0ZXMuY3VycmVudFJ1biB8fCB2b2lkIDA7CiAgICAgICAgZm9yICg7IHQ5LS0gJiYgKHMxMCA9IHRoaXMubmV4dFJ1bihzMTApKTsgKSByMTEucHVzaChzMTApOwogICAgICAgIHJldHVybiByMTE7CiAgICAgIH0KICAgICAgZ2V0UGF0dGVybigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGVzLnBhdHRlcm4gPyB0aGlzLl9zdGF0ZXMucGF0dGVybi5wYXR0ZXJuIDogdm9pZCAwOwogICAgICB9CiAgICAgIGlzUnVubmluZygpIHsKICAgICAgICBsZXQgdDkgPSB0aGlzLm5leHRSdW4odGhpcy5fc3RhdGVzLmN1cnJlbnRSdW4pLCBlMTEgPSAhdGhpcy5fc3RhdGVzLnBhdXNlZCwgcjExID0gdGhpcy5mbiAhPT0gdm9pZCAwLCBzMTAgPSAhdGhpcy5fc3RhdGVzLmtpbGw7CiAgICAgICAgcmV0dXJuIGUxMSAmJiByMTEgJiYgczEwICYmIHQ5ICE9PSBudWxsOwogICAgICB9CiAgICAgIGlzU3RvcHBlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGVzLmtpbGw7CiAgICAgIH0KICAgICAgaXNCdXN5KCkgewogICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZXMuYmxvY2tpbmc7CiAgICAgIH0KICAgICAgY3VycmVudFJ1bigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGVzLmN1cnJlbnRSdW4gPyB0aGlzLl9zdGF0ZXMuY3VycmVudFJ1bi5nZXREYXRlKCkgOiBudWxsOwogICAgICB9CiAgICAgIHByZXZpb3VzUnVuKCkgewogICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZXMucHJldmlvdXNSdW4gPyB0aGlzLl9zdGF0ZXMucHJldmlvdXNSdW4uZ2V0RGF0ZSgpIDogbnVsbDsKICAgICAgfQogICAgICBtc1RvTmV4dCh0OSkgewogICAgICAgIGxldCBlMTEgPSB0aGlzLl9uZXh0KHQ5KTsKICAgICAgICByZXR1cm4gZTExID8gdDkgaW5zdGFuY2VvZiBmMyB8fCB0OSBpbnN0YW5jZW9mIERhdGUgPyBlMTEuZ2V0VGltZSgpIC0gdDkuZ2V0VGltZSgpIDogZTExLmdldFRpbWUoKSAtIG5ldyBmMyh0OSkuZ2V0VGltZSgpIDogbnVsbDsKICAgICAgfQogICAgICBzdG9wKCkgewogICAgICAgIHRoaXMuX3N0YXRlcy5raWxsID0gdHJ1ZSwgdGhpcy5fc3RhdGVzLmN1cnJlbnRUaW1lb3V0ICYmIGNsZWFyVGltZW91dCh0aGlzLl9zdGF0ZXMuY3VycmVudFRpbWVvdXQpOwogICAgICAgIGxldCB0OSA9IHkzLmluZGV4T2YodGhpcyk7CiAgICAgICAgdDkgPj0gMCAmJiB5My5zcGxpY2UodDksIDEpOwogICAgICB9CiAgICAgIHBhdXNlKCkgewogICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZXMucGF1c2VkID0gdHJ1ZSwgIXRoaXMuX3N0YXRlcy5raWxsOwogICAgICB9CiAgICAgIHJlc3VtZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGVzLnBhdXNlZCA9IGZhbHNlLCAhdGhpcy5fc3RhdGVzLmtpbGw7CiAgICAgIH0KICAgICAgc2NoZWR1bGUodDkpIHsKICAgICAgICBpZiAodDkgJiYgdGhpcy5mbikgdGhyb3cgbmV3IEVycm9yKCJDcm9uOiBJdCBpcyBub3QgYWxsb3dlZCB0byBzY2hlZHVsZSB0d28gZnVuY3Rpb25zIHVzaW5nIHRoZSBzYW1lIENyb25lciBpbnN0YW5jZS4iKTsKICAgICAgICB0OSAmJiAodGhpcy5mbiA9IHQ5KTsKICAgICAgICBsZXQgZTExID0gdGhpcy5tc1RvTmV4dCgpLCByMTEgPSB0aGlzLm5leHRSdW4odGhpcy5fc3RhdGVzLmN1cnJlbnRSdW4pOwogICAgICAgIHJldHVybiBlMTEgPT0gbnVsbCB8fCBpc05hTihlMTEpIHx8IHIxMSA9PT0gbnVsbCA/IHRoaXMgOiAoZTExID4gXzIgJiYgKGUxMSA9IF8yKSwgdGhpcy5fc3RhdGVzLmN1cnJlbnRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9jaGVja1RyaWdnZXIocjExKSwgZTExKSwgdGhpcy5fc3RhdGVzLmN1cnJlbnRUaW1lb3V0ICYmIHRoaXMub3B0aW9ucy51bnJlZiAmJiBQMih0aGlzLl9zdGF0ZXMuY3VycmVudFRpbWVvdXQpLCB0aGlzKTsKICAgICAgfQogICAgICBhc3luYyBfdHJpZ2dlcih0OSkgewogICAgICAgIGlmICh0aGlzLl9zdGF0ZXMuYmxvY2tpbmcgPSB0cnVlLCB0aGlzLl9zdGF0ZXMuY3VycmVudFJ1biA9IG5ldyBmMyh2b2lkIDAsIHRoaXMub3B0aW9ucy50aW1lem9uZSB8fCB0aGlzLm9wdGlvbnMudXRjT2Zmc2V0KSwgdGhpcy5vcHRpb25zLmNhdGNoKSB0cnkgewogICAgICAgICAgdGhpcy5mbiAhPT0gdm9pZCAwICYmIGF3YWl0IHRoaXMuZm4odGhpcywgdGhpcy5vcHRpb25zLmNvbnRleHQpOwogICAgICAgIH0gY2F0Y2ggKGUxMSkgewogICAgICAgICAgZzIodGhpcy5vcHRpb25zLmNhdGNoKSAmJiB0aGlzLm9wdGlvbnMuY2F0Y2goZTExLCB0aGlzKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB0aGlzLmZuICE9PSB2b2lkIDAgJiYgYXdhaXQgdGhpcy5mbih0aGlzLCB0aGlzLm9wdGlvbnMuY29udGV4dCk7CiAgICAgICAgdGhpcy5fc3RhdGVzLnByZXZpb3VzUnVuID0gbmV3IGYzKHQ5LCB0aGlzLm9wdGlvbnMudGltZXpvbmUgfHwgdGhpcy5vcHRpb25zLnV0Y09mZnNldCksIHRoaXMuX3N0YXRlcy5ibG9ja2luZyA9IGZhbHNlOwogICAgICB9CiAgICAgIGFzeW5jIHRyaWdnZXIoKSB7CiAgICAgICAgYXdhaXQgdGhpcy5fdHJpZ2dlcigpOwogICAgICB9CiAgICAgIHJ1bnNMZWZ0KCkgewogICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZXMubWF4UnVuczsKICAgICAgfQogICAgICBfY2hlY2tUcmlnZ2VyKHQ5KSB7CiAgICAgICAgbGV0IGUxMSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLCByMTEgPSAhdGhpcy5fc3RhdGVzLnBhdXNlZCAmJiBlMTEuZ2V0VGltZSgpID49IHQ5LmdldFRpbWUoKSwgczEwID0gdGhpcy5fc3RhdGVzLmJsb2NraW5nICYmIHRoaXMub3B0aW9ucy5wcm90ZWN0OwogICAgICAgIHIxMSAmJiAhczEwID8gKHRoaXMuX3N0YXRlcy5tYXhSdW5zICE9PSB2b2lkIDAgJiYgdGhpcy5fc3RhdGVzLm1heFJ1bnMtLSwgdGhpcy5fdHJpZ2dlcigpKSA6IHIxMSAmJiBzMTAgJiYgZzIodGhpcy5vcHRpb25zLnByb3RlY3QpICYmIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vcHRpb25zLnByb3RlY3QodGhpcyksIDApLCB0aGlzLnNjaGVkdWxlKCk7CiAgICAgIH0KICAgICAgX25leHQodDkpIHsKICAgICAgICBsZXQgZTExID0gISEodDkgfHwgdGhpcy5fc3RhdGVzLmN1cnJlbnRSdW4pLCByMTEgPSBmYWxzZTsKICAgICAgICAhdDkgJiYgdGhpcy5vcHRpb25zLnN0YXJ0QXQgJiYgdGhpcy5vcHRpb25zLmludGVydmFsICYmIChbdDksIGUxMV0gPSB0aGlzLl9jYWxjdWxhdGVQcmV2aW91c1J1bih0OSwgZTExKSwgcjExID0gIXQ5KSwgdDkgPSBuZXcgZjModDksIHRoaXMub3B0aW9ucy50aW1lem9uZSB8fCB0aGlzLm9wdGlvbnMudXRjT2Zmc2V0KSwgdGhpcy5vcHRpb25zLnN0YXJ0QXQgJiYgdDkgJiYgdDkuZ2V0VGltZSgpIDwgdGhpcy5vcHRpb25zLnN0YXJ0QXQuZ2V0VGltZSgpICYmICh0OSA9IHRoaXMub3B0aW9ucy5zdGFydEF0KTsKICAgICAgICBsZXQgczEwID0gdGhpcy5fc3RhdGVzLm9uY2UgfHwgbmV3IGYzKHQ5LCB0aGlzLm9wdGlvbnMudGltZXpvbmUgfHwgdGhpcy5vcHRpb25zLnV0Y09mZnNldCk7CiAgICAgICAgcmV0dXJuICFyMTEgJiYgczEwICE9PSB0aGlzLl9zdGF0ZXMub25jZSAmJiAoczEwID0gczEwLmluY3JlbWVudCh0aGlzLl9zdGF0ZXMucGF0dGVybiwgdGhpcy5vcHRpb25zLCBlMTEpKSwgdGhpcy5fc3RhdGVzLm9uY2UgJiYgdGhpcy5fc3RhdGVzLm9uY2UuZ2V0VGltZSgpIDw9IHQ5LmdldFRpbWUoKSB8fCBzMTAgPT09IG51bGwgfHwgdGhpcy5fc3RhdGVzLm1heFJ1bnMgIT09IHZvaWQgMCAmJiB0aGlzLl9zdGF0ZXMubWF4UnVucyA8PSAwIHx8IHRoaXMuX3N0YXRlcy5raWxsIHx8IHRoaXMub3B0aW9ucy5zdG9wQXQgJiYgczEwLmdldFRpbWUoKSA+PSB0aGlzLm9wdGlvbnMuc3RvcEF0LmdldFRpbWUoKSA/IG51bGwgOiBzMTA7CiAgICAgIH0KICAgICAgX2NhbGN1bGF0ZVByZXZpb3VzUnVuKHQ5LCBlMTEpIHsKICAgICAgICBsZXQgcjExID0gbmV3IGYzKHZvaWQgMCwgdGhpcy5vcHRpb25zLnRpbWV6b25lIHx8IHRoaXMub3B0aW9ucy51dGNPZmZzZXQpLCBzMTAgPSB0OTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLnN0YXJ0QXQuZ2V0VGltZSgpIDw9IHIxMS5nZXRUaW1lKCkpIHsKICAgICAgICAgIHMxMCA9IHRoaXMub3B0aW9ucy5zdGFydEF0OwogICAgICAgICAgbGV0IGkxMSA9IHMxMC5nZXRUaW1lKCkgKyB0aGlzLm9wdGlvbnMuaW50ZXJ2YWwgKiAxZTM7CiAgICAgICAgICBmb3IgKDsgaTExIDw9IHIxMS5nZXRUaW1lKCk7ICkgczEwID0gbmV3IGYzKHMxMCwgdGhpcy5vcHRpb25zLnRpbWV6b25lIHx8IHRoaXMub3B0aW9ucy51dGNPZmZzZXQpLmluY3JlbWVudCh0aGlzLl9zdGF0ZXMucGF0dGVybiwgdGhpcy5vcHRpb25zLCB0cnVlKSwgaTExID0gczEwLmdldFRpbWUoKSArIHRoaXMub3B0aW9ucy5pbnRlcnZhbCAqIDFlMzsKICAgICAgICAgIGUxMSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzMTAgPT09IG51bGwgJiYgKHMxMCA9IHZvaWQgMCksIFtzMTAsIGUxMV07CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29uc3RhbnRzLmpzCnZhciBkYXlzSW5XZWVrLCBkYXlzSW5ZZWFyLCBtYXhUaW1lLCBtaW5UaW1lLCBtaWxsaXNlY29uZHNJbldlZWssIG1pbGxpc2Vjb25kc0luRGF5LCBtaWxsaXNlY29uZHNJbk1pbnV0ZSwgbWlsbGlzZWNvbmRzSW5Ib3VyLCBtaWxsaXNlY29uZHNJblNlY29uZCwgbWludXRlc0luWWVhciwgbWludXRlc0luTW9udGgsIG1pbnV0ZXNJbkRheSwgbWludXRlc0luSG91ciwgbW9udGhzSW5RdWFydGVyLCBtb250aHNJblllYXIsIHF1YXJ0ZXJzSW5ZZWFyLCBzZWNvbmRzSW5Ib3VyLCBzZWNvbmRzSW5NaW51dGUsIHNlY29uZHNJbkRheSwgc2Vjb25kc0luV2Vlaywgc2Vjb25kc0luWWVhciwgc2Vjb25kc0luTW9udGgsIHNlY29uZHNJblF1YXJ0ZXIsIGNvbnN0cnVjdEZyb21TeW1ib2w7CnZhciBpbml0X2NvbnN0YW50cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb25zdGFudHMuanMiKCkgewogICAgZGF5c0luV2VlayA9IDc7CiAgICBkYXlzSW5ZZWFyID0gMzY1LjI0MjU7CiAgICBtYXhUaW1lID0gTWF0aC5wb3coMTAsIDgpICogMjQgKiA2MCAqIDYwICogMWUzOwogICAgbWluVGltZSA9IC1tYXhUaW1lOwogICAgbWlsbGlzZWNvbmRzSW5XZWVrID0gNjA0OGU1OwogICAgbWlsbGlzZWNvbmRzSW5EYXkgPSA4NjRlNTsKICAgIG1pbGxpc2Vjb25kc0luTWludXRlID0gNmU0OwogICAgbWlsbGlzZWNvbmRzSW5Ib3VyID0gMzZlNTsKICAgIG1pbGxpc2Vjb25kc0luU2Vjb25kID0gMWUzOwogICAgbWludXRlc0luWWVhciA9IDUyNTYwMDsKICAgIG1pbnV0ZXNJbk1vbnRoID0gNDMyMDA7CiAgICBtaW51dGVzSW5EYXkgPSAxNDQwOwogICAgbWludXRlc0luSG91ciA9IDYwOwogICAgbW9udGhzSW5RdWFydGVyID0gMzsKICAgIG1vbnRoc0luWWVhciA9IDEyOwogICAgcXVhcnRlcnNJblllYXIgPSA0OwogICAgc2Vjb25kc0luSG91ciA9IDM2MDA7CiAgICBzZWNvbmRzSW5NaW51dGUgPSA2MDsKICAgIHNlY29uZHNJbkRheSA9IHNlY29uZHNJbkhvdXIgKiAyNDsKICAgIHNlY29uZHNJbldlZWsgPSBzZWNvbmRzSW5EYXkgKiA3OwogICAgc2Vjb25kc0luWWVhciA9IHNlY29uZHNJbkRheSAqIGRheXNJblllYXI7CiAgICBzZWNvbmRzSW5Nb250aCA9IHNlY29uZHNJblllYXIgLyAxMjsKICAgIHNlY29uZHNJblF1YXJ0ZXIgPSBzZWNvbmRzSW5Nb250aCAqIDM7CiAgICBjb25zdHJ1Y3RGcm9tU3ltYm9sID0gLyogQF9fUFVSRV9fICovIFN5bWJvbC5mb3IoImNvbnN0cnVjdERhdGVGcm9tIik7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29uc3RydWN0RnJvbS5qcwpmdW5jdGlvbiBjb25zdHJ1Y3RGcm9tKGRhdGUsIHZhbHVlMikgewogIGlmICh0eXBlb2YgZGF0ZSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIGRhdGUodmFsdWUyKTsKICBpZiAoZGF0ZSAmJiB0eXBlb2YgZGF0ZSA9PT0gIm9iamVjdCIgJiYgY29uc3RydWN0RnJvbVN5bWJvbCBpbiBkYXRlKQogICAgcmV0dXJuIGRhdGVbY29uc3RydWN0RnJvbVN5bWJvbF0odmFsdWUyKTsKICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBuZXcgZGF0ZS5jb25zdHJ1Y3Rvcih2YWx1ZTIpOwogIHJldHVybiBuZXcgRGF0ZSh2YWx1ZTIpOwp9CnZhciBjb25zdHJ1Y3RGcm9tX2RlZmF1bHQ7CnZhciBpbml0X2NvbnN0cnVjdEZyb20gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29uc3RydWN0RnJvbS5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgY29uc3RydWN0RnJvbV9kZWZhdWx0ID0gY29uc3RydWN0RnJvbTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy90b0RhdGUuanMKZnVuY3Rpb24gdG9EYXRlKGFyZ3VtZW50LCBjb250ZXh0MikgewogIHJldHVybiBjb25zdHJ1Y3RGcm9tKGNvbnRleHQyIHx8IGFyZ3VtZW50LCBhcmd1bWVudCk7Cn0KdmFyIHRvRGF0ZV9kZWZhdWx0Owp2YXIgaW5pdF90b0RhdGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvdG9EYXRlLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgdG9EYXRlX2RlZmF1bHQgPSB0b0RhdGU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkRGF5cy5qcwpmdW5jdGlvbiBhZGREYXlzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBpZiAoaXNOYU4oYW1vdW50KSkgcmV0dXJuIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgTmFOKTsKICBpZiAoIWFtb3VudCkgcmV0dXJuIF9kYXRlOwogIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpICsgYW1vdW50KTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIGFkZERheXNfZGVmYXVsdDsKdmFyIGluaXRfYWRkRGF5cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGREYXlzLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGFkZERheXNfZGVmYXVsdCA9IGFkZERheXM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkTW9udGhzLmpzCmZ1bmN0aW9uIGFkZE1vbnRocyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgaWYgKGlzTmFOKGFtb3VudCkpIHJldHVybiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIE5hTik7CiAgaWYgKCFhbW91bnQpIHsKICAgIHJldHVybiBfZGF0ZTsKICB9CiAgY29uc3QgZGF5T2ZNb250aCA9IF9kYXRlLmdldERhdGUoKTsKICBjb25zdCBlbmRPZkRlc2lyZWRNb250aCA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgX2RhdGUuZ2V0VGltZSgpKTsKICBlbmRPZkRlc2lyZWRNb250aC5zZXRNb250aChfZGF0ZS5nZXRNb250aCgpICsgYW1vdW50ICsgMSwgMCk7CiAgY29uc3QgZGF5c0luTW9udGggPSBlbmRPZkRlc2lyZWRNb250aC5nZXREYXRlKCk7CiAgaWYgKGRheU9mTW9udGggPj0gZGF5c0luTW9udGgpIHsKICAgIHJldHVybiBlbmRPZkRlc2lyZWRNb250aDsKICB9IGVsc2UgewogICAgX2RhdGUuc2V0RnVsbFllYXIoCiAgICAgIGVuZE9mRGVzaXJlZE1vbnRoLmdldEZ1bGxZZWFyKCksCiAgICAgIGVuZE9mRGVzaXJlZE1vbnRoLmdldE1vbnRoKCksCiAgICAgIGRheU9mTW9udGgKICAgICk7CiAgICByZXR1cm4gX2RhdGU7CiAgfQp9CnZhciBhZGRNb250aHNfZGVmYXVsdDsKdmFyIGluaXRfYWRkTW9udGhzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZE1vbnRocy5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBhZGRNb250aHNfZGVmYXVsdCA9IGFkZE1vbnRoczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGQuanMKZnVuY3Rpb24gYWRkKGRhdGUsIGR1cmF0aW9uLCBvcHRpb25zKSB7CiAgY29uc3QgewogICAgeWVhcnMgPSAwLAogICAgbW9udGhzOiBtb250aHMyID0gMCwKICAgIHdlZWtzID0gMCwKICAgIGRheXM6IGRheXMyID0gMCwKICAgIGhvdXJzID0gMCwKICAgIG1pbnV0ZXMgPSAwLAogICAgc2Vjb25kcyA9IDAKICB9ID0gZHVyYXRpb247CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGRhdGVXaXRoTW9udGhzID0gbW9udGhzMiB8fCB5ZWFycyA/IGFkZE1vbnRocyhfZGF0ZSwgbW9udGhzMiArIHllYXJzICogMTIpIDogX2RhdGU7CiAgY29uc3QgZGF0ZVdpdGhEYXlzID0gZGF5czIgfHwgd2Vla3MgPyBhZGREYXlzKGRhdGVXaXRoTW9udGhzLCBkYXlzMiArIHdlZWtzICogNykgOiBkYXRlV2l0aE1vbnRoczsKICBjb25zdCBtaW51dGVzVG9BZGQgPSBtaW51dGVzICsgaG91cnMgKiA2MDsKICBjb25zdCBzZWNvbmRzVG9BZGQgPSBzZWNvbmRzICsgbWludXRlc1RvQWRkICogNjA7CiAgY29uc3QgbXNUb0FkZCA9IHNlY29uZHNUb0FkZCAqIDFlMzsKICByZXR1cm4gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCArZGF0ZVdpdGhEYXlzICsgbXNUb0FkZCk7Cn0KdmFyIGFkZF9kZWZhdWx0Owp2YXIgaW5pdF9hZGQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkLmpzIigpIHsKICAgIGluaXRfYWRkRGF5cygpOwogICAgaW5pdF9hZGRNb250aHMoKTsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGFkZF9kZWZhdWx0ID0gYWRkOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2F0dXJkYXkuanMKZnVuY3Rpb24gaXNTYXR1cmRheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbikuZ2V0RGF5KCkgPT09IDY7Cn0KdmFyIGlzU2F0dXJkYXlfZGVmYXVsdDsKdmFyIGluaXRfaXNTYXR1cmRheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhdHVyZGF5LmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpc1NhdHVyZGF5X2RlZmF1bHQgPSBpc1NhdHVyZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU3VuZGF5LmpzCmZ1bmN0aW9uIGlzU3VuZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKSA9PT0gMDsKfQp2YXIgaXNTdW5kYXlfZGVmYXVsdDsKdmFyIGluaXRfaXNTdW5kYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTdW5kYXkuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGlzU3VuZGF5X2RlZmF1bHQgPSBpc1N1bmRheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1dlZWtlbmQuanMKZnVuY3Rpb24gaXNXZWVrZW5kKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXkgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldERheSgpOwogIHJldHVybiBkYXkgPT09IDAgfHwgZGF5ID09PSA2Owp9CnZhciBpc1dlZWtlbmRfZGVmYXVsdDsKdmFyIGluaXRfaXNXZWVrZW5kID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzV2Vla2VuZC5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgaXNXZWVrZW5kX2RlZmF1bHQgPSBpc1dlZWtlbmQ7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkQnVzaW5lc3NEYXlzLmpzCmZ1bmN0aW9uIGFkZEJ1c2luZXNzRGF5cyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3Qgc3RhcnRlZE9uV2Vla2VuZCA9IGlzV2Vla2VuZChfZGF0ZSwgb3B0aW9ucyk7CiAgaWYgKGlzTmFOKGFtb3VudCkpIHJldHVybiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluLCBOYU4pOwogIGNvbnN0IGhvdXJzID0gX2RhdGUuZ2V0SG91cnMoKTsKICBjb25zdCBzaWduID0gYW1vdW50IDwgMCA/IC0xIDogMTsKICBjb25zdCBmdWxsV2Vla3MgPSBNYXRoLnRydW5jKGFtb3VudCAvIDUpOwogIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpICsgZnVsbFdlZWtzICogNyk7CiAgbGV0IHJlc3REYXlzID0gTWF0aC5hYnMoYW1vdW50ICUgNSk7CiAgd2hpbGUgKHJlc3REYXlzID4gMCkgewogICAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgKyBzaWduKTsKICAgIGlmICghaXNXZWVrZW5kKF9kYXRlLCBvcHRpb25zKSkgcmVzdERheXMgLT0gMTsKICB9CiAgaWYgKHN0YXJ0ZWRPbldlZWtlbmQgJiYgaXNXZWVrZW5kKF9kYXRlLCBvcHRpb25zKSAmJiBhbW91bnQgIT09IDApIHsKICAgIGlmIChpc1NhdHVyZGF5KF9kYXRlLCBvcHRpb25zKSkKICAgICAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgKyAoc2lnbiA8IDAgPyAyIDogLTEpKTsKICAgIGlmIChpc1N1bmRheShfZGF0ZSwgb3B0aW9ucykpCiAgICAgIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpICsgKHNpZ24gPCAwID8gMSA6IC0yKSk7CiAgfQogIF9kYXRlLnNldEhvdXJzKGhvdXJzKTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIGFkZEJ1c2luZXNzRGF5c19kZWZhdWx0Owp2YXIgaW5pdF9hZGRCdXNpbmVzc0RheXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkQnVzaW5lc3NEYXlzLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF9pc1NhdHVyZGF5KCk7CiAgICBpbml0X2lzU3VuZGF5KCk7CiAgICBpbml0X2lzV2Vla2VuZCgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGFkZEJ1c2luZXNzRGF5c19kZWZhdWx0ID0gYWRkQnVzaW5lc3NEYXlzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZE1pbGxpc2Vjb25kcy5qcwpmdW5jdGlvbiBhZGRNaWxsaXNlY29uZHMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7CiAgcmV0dXJuIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgK3RvRGF0ZShkYXRlKSArIGFtb3VudCk7Cn0KdmFyIGFkZE1pbGxpc2Vjb25kc19kZWZhdWx0Owp2YXIgaW5pdF9hZGRNaWxsaXNlY29uZHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkTWlsbGlzZWNvbmRzLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGFkZE1pbGxpc2Vjb25kc19kZWZhdWx0ID0gYWRkTWlsbGlzZWNvbmRzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZEhvdXJzLmpzCmZ1bmN0aW9uIGFkZEhvdXJzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRNaWxsaXNlY29uZHMoZGF0ZSwgYW1vdW50ICogbWlsbGlzZWNvbmRzSW5Ib3VyLCBvcHRpb25zKTsKfQp2YXIgYWRkSG91cnNfZGVmYXVsdDsKdmFyIGluaXRfYWRkSG91cnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkSG91cnMuanMiKCkgewogICAgaW5pdF9hZGRNaWxsaXNlY29uZHMoKTsKICAgIGluaXRfY29uc3RhbnRzKCk7CiAgICBhZGRIb3Vyc19kZWZhdWx0ID0gYWRkSG91cnM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9kZWZhdWx0T3B0aW9ucy5qcwpmdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9ucygpIHsKICByZXR1cm4gZGVmYXVsdE9wdGlvbnM7Cn0KZnVuY3Rpb24gc2V0RGVmYXVsdE9wdGlvbnMobmV3T3B0aW9ucykgewogIGRlZmF1bHRPcHRpb25zID0gbmV3T3B0aW9uczsKfQp2YXIgZGVmYXVsdE9wdGlvbnM7CnZhciBpbml0X2RlZmF1bHRPcHRpb25zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZGVmYXVsdE9wdGlvbnMuanMiKCkgewogICAgZGVmYXVsdE9wdGlvbnMgPSB7fTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mV2Vlay5qcwpmdW5jdGlvbiBzdGFydE9mV2VlayhkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCB3ZWVrU3RhcnRzT24gPSBvcHRpb25zPy53ZWVrU3RhcnRzT24gPz8gb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz8gZGVmYXVsdE9wdGlvbnMyLndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz8gMDsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgZGF5ID0gX2RhdGUuZ2V0RGF5KCk7CiAgY29uc3QgZGlmZiA9IChkYXkgPCB3ZWVrU3RhcnRzT24gPyA3IDogMCkgKyBkYXkgLSB3ZWVrU3RhcnRzT247CiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgLSBkaWZmKTsKICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIHN0YXJ0T2ZXZWVrX2RlZmF1bHQ7CnZhciBpbml0X3N0YXJ0T2ZXZWVrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZXZWVrLmpzIigpIHsKICAgIGluaXRfZGVmYXVsdE9wdGlvbnMoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzdGFydE9mV2Vla19kZWZhdWx0ID0gc3RhcnRPZldlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZklTT1dlZWsuanMKZnVuY3Rpb24gc3RhcnRPZklTT1dlZWsoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBzdGFydE9mV2VlayhkYXRlLCB7IC4uLm9wdGlvbnMsIHdlZWtTdGFydHNPbjogMSB9KTsKfQp2YXIgc3RhcnRPZklTT1dlZWtfZGVmYXVsdDsKdmFyIGluaXRfc3RhcnRPZklTT1dlZWsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZklTT1dlZWsuanMiKCkgewogICAgaW5pdF9zdGFydE9mV2VlaygpOwogICAgc3RhcnRPZklTT1dlZWtfZGVmYXVsdCA9IHN0YXJ0T2ZJU09XZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT1dlZWtZZWFyLmpzCmZ1bmN0aW9uIGdldElTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhciA9IGNvbnN0cnVjdEZyb20oX2RhdGUsIDApOwogIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDQpOwogIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgY29uc3Qgc3RhcnRPZk5leHRZZWFyID0gc3RhcnRPZklTT1dlZWsoZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhcik7CiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhciA9IGNvbnN0cnVjdEZyb20oX2RhdGUsIDApOwogIGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIuc2V0RnVsbFllYXIoeWVhciwgMCwgNCk7CiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBjb25zdCBzdGFydE9mVGhpc1llYXIgPSBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnlPZlRoaXNZZWFyKTsKICBpZiAoX2RhdGUuZ2V0VGltZSgpID49IHN0YXJ0T2ZOZXh0WWVhci5nZXRUaW1lKCkpIHsKICAgIHJldHVybiB5ZWFyICsgMTsKICB9IGVsc2UgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mVGhpc1llYXIuZ2V0VGltZSgpKSB7CiAgICByZXR1cm4geWVhcjsKICB9IGVsc2UgewogICAgcmV0dXJuIHllYXIgLSAxOwogIH0KfQp2YXIgZ2V0SVNPV2Vla1llYXJfZGVmYXVsdDsKdmFyIGluaXRfZ2V0SVNPV2Vla1llYXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SVNPV2Vla1llYXIuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X3N0YXJ0T2ZJU09XZWVrKCk7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZ2V0SVNPV2Vla1llYXJfZGVmYXVsdCA9IGdldElTT1dlZWtZZWFyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcy5qcwpmdW5jdGlvbiBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGRhdGUpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlKTsKICBjb25zdCB1dGNEYXRlID0gbmV3IERhdGUoCiAgICBEYXRlLlVUQygKICAgICAgX2RhdGUuZ2V0RnVsbFllYXIoKSwKICAgICAgX2RhdGUuZ2V0TW9udGgoKSwKICAgICAgX2RhdGUuZ2V0RGF0ZSgpLAogICAgICBfZGF0ZS5nZXRIb3VycygpLAogICAgICBfZGF0ZS5nZXRNaW51dGVzKCksCiAgICAgIF9kYXRlLmdldFNlY29uZHMoKSwKICAgICAgX2RhdGUuZ2V0TWlsbGlzZWNvbmRzKCkKICAgICkKICApOwogIHV0Y0RhdGUuc2V0VVRDRnVsbFllYXIoX2RhdGUuZ2V0RnVsbFllYXIoKSk7CiAgcmV0dXJuICtkYXRlIC0gK3V0Y0RhdGU7Cn0KdmFyIGluaXRfZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL25vcm1hbGl6ZURhdGVzLmpzCmZ1bmN0aW9uIG5vcm1hbGl6ZURhdGVzKGNvbnRleHQyLCAuLi5kYXRlcykgewogIGNvbnN0IG5vcm1hbGl6ZTQgPSBjb25zdHJ1Y3RGcm9tLmJpbmQoCiAgICBudWxsLAogICAgY29udGV4dDIgfHwgZGF0ZXMuZmluZCgoZGF0ZSkgPT4gdHlwZW9mIGRhdGUgPT09ICJvYmplY3QiKQogICk7CiAgcmV0dXJuIGRhdGVzLm1hcChub3JtYWxpemU0KTsKfQp2YXIgaW5pdF9ub3JtYWxpemVEYXRlcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL25vcm1hbGl6ZURhdGVzLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZEYXkuanMKZnVuY3Rpb24gc3RhcnRPZkRheShkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiBfZGF0ZTsKfQp2YXIgc3RhcnRPZkRheV9kZWZhdWx0Owp2YXIgaW5pdF9zdGFydE9mRGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZEYXkuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIHN0YXJ0T2ZEYXlfZGVmYXVsdCA9IHN0YXJ0T2ZEYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGNvbnN0IGxhdGVyU3RhcnRPZkRheSA9IHN0YXJ0T2ZEYXkobGF0ZXJEYXRlXyk7CiAgY29uc3QgZWFybGllclN0YXJ0T2ZEYXkgPSBzdGFydE9mRGF5KGVhcmxpZXJEYXRlXyk7CiAgY29uc3QgbGF0ZXJUaW1lc3RhbXAgPSArbGF0ZXJTdGFydE9mRGF5IC0gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhsYXRlclN0YXJ0T2ZEYXkpOwogIGNvbnN0IGVhcmxpZXJUaW1lc3RhbXAgPSArZWFybGllclN0YXJ0T2ZEYXkgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGVhcmxpZXJTdGFydE9mRGF5KTsKICByZXR1cm4gTWF0aC5yb3VuZCgobGF0ZXJUaW1lc3RhbXAgLSBlYXJsaWVyVGltZXN0YW1wKSAvIG1pbGxpc2Vjb25kc0luRGF5KTsKfQp2YXIgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzX2RlZmF1bHQ7CnZhciBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMuanMiKCkgewogICAgaW5pdF9nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKCk7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgaW5pdF9zdGFydE9mRGF5KCk7CiAgICBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXNfZGVmYXVsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5czsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mSVNPV2Vla1llYXIuanMKZnVuY3Rpb24gc3RhcnRPZklTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCB5ZWFyID0gZ2V0SVNPV2Vla1llYXIoZGF0ZSwgb3B0aW9ucyk7CiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5ID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTsKICBmb3VydGhPZkphbnVhcnkuc2V0RnVsbFllYXIoeWVhciwgMCwgNCk7CiAgZm91cnRoT2ZKYW51YXJ5LnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnkpOwp9CnZhciBzdGFydE9mSVNPV2Vla1llYXJfZGVmYXVsdDsKdmFyIGluaXRfc3RhcnRPZklTT1dlZWtZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZJU09XZWVrWWVhci5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfZ2V0SVNPV2Vla1llYXIoKTsKICAgIGluaXRfc3RhcnRPZklTT1dlZWsoKTsKICAgIHN0YXJ0T2ZJU09XZWVrWWVhcl9kZWZhdWx0ID0gc3RhcnRPZklTT1dlZWtZZWFyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldElTT1dlZWtZZWFyLmpzCmZ1bmN0aW9uIHNldElTT1dlZWtZZWFyKGRhdGUsIHdlZWtZZWFyLCBvcHRpb25zKSB7CiAgbGV0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKAogICAgX2RhdGUsCiAgICBzdGFydE9mSVNPV2Vla1llYXIoX2RhdGUsIG9wdGlvbnMpCiAgKTsKICBjb25zdCBmb3VydGhPZkphbnVhcnkgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApOwogIGZvdXJ0aE9mSmFudWFyeS5zZXRGdWxsWWVhcih3ZWVrWWVhciwgMCwgNCk7CiAgZm91cnRoT2ZKYW51YXJ5LnNldEhvdXJzKDAsIDAsIDAsIDApOwogIF9kYXRlID0gc3RhcnRPZklTT1dlZWtZZWFyKGZvdXJ0aE9mSmFudWFyeSk7CiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgKyBkaWZmKTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIHNldElTT1dlZWtZZWFyX2RlZmF1bHQ7CnZhciBpbml0X3NldElTT1dlZWtZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldElTT1dlZWtZZWFyLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoKTsKICAgIGluaXRfc3RhcnRPZklTT1dlZWtZZWFyKCk7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgc2V0SVNPV2Vla1llYXJfZGVmYXVsdCA9IHNldElTT1dlZWtZZWFyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZElTT1dlZWtZZWFycy5qcwpmdW5jdGlvbiBhZGRJU09XZWVrWWVhcnMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7CiAgcmV0dXJuIHNldElTT1dlZWtZZWFyKGRhdGUsIGdldElTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpICsgYW1vdW50LCBvcHRpb25zKTsKfQp2YXIgYWRkSVNPV2Vla1llYXJzX2RlZmF1bHQ7CnZhciBpbml0X2FkZElTT1dlZWtZZWFycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRJU09XZWVrWWVhcnMuanMiKCkgewogICAgaW5pdF9nZXRJU09XZWVrWWVhcigpOwogICAgaW5pdF9zZXRJU09XZWVrWWVhcigpOwogICAgYWRkSVNPV2Vla1llYXJzX2RlZmF1bHQgPSBhZGRJU09XZWVrWWVhcnM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkTWludXRlcy5qcwpmdW5jdGlvbiBhZGRNaW51dGVzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRUaW1lKF9kYXRlLmdldFRpbWUoKSArIGFtb3VudCAqIG1pbGxpc2Vjb25kc0luTWludXRlKTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIGFkZE1pbnV0ZXNfZGVmYXVsdDsKdmFyIGluaXRfYWRkTWludXRlcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRNaW51dGVzLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzKCk7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgYWRkTWludXRlc19kZWZhdWx0ID0gYWRkTWludXRlczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRRdWFydGVycy5qcwpmdW5jdGlvbiBhZGRRdWFydGVycyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkTW9udGhzKGRhdGUsIGFtb3VudCAqIDMsIG9wdGlvbnMpOwp9CnZhciBhZGRRdWFydGVyc19kZWZhdWx0Owp2YXIgaW5pdF9hZGRRdWFydGVycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRRdWFydGVycy5qcyIoKSB7CiAgICBpbml0X2FkZE1vbnRocygpOwogICAgYWRkUXVhcnRlcnNfZGVmYXVsdCA9IGFkZFF1YXJ0ZXJzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZFNlY29uZHMuanMKZnVuY3Rpb24gYWRkU2Vjb25kcyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkTWlsbGlzZWNvbmRzKGRhdGUsIGFtb3VudCAqIDFlMywgb3B0aW9ucyk7Cn0KdmFyIGFkZFNlY29uZHNfZGVmYXVsdDsKdmFyIGluaXRfYWRkU2Vjb25kcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRTZWNvbmRzLmpzIigpIHsKICAgIGluaXRfYWRkTWlsbGlzZWNvbmRzKCk7CiAgICBhZGRTZWNvbmRzX2RlZmF1bHQgPSBhZGRTZWNvbmRzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZFdlZWtzLmpzCmZ1bmN0aW9uIGFkZFdlZWtzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGREYXlzKGRhdGUsIGFtb3VudCAqIDcsIG9wdGlvbnMpOwp9CnZhciBhZGRXZWVrc19kZWZhdWx0Owp2YXIgaW5pdF9hZGRXZWVrcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRXZWVrcy5qcyIoKSB7CiAgICBpbml0X2FkZERheXMoKTsKICAgIGFkZFdlZWtzX2RlZmF1bHQgPSBhZGRXZWVrczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRZZWFycy5qcwpmdW5jdGlvbiBhZGRZZWFycyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkTW9udGhzKGRhdGUsIGFtb3VudCAqIDEyLCBvcHRpb25zKTsKfQp2YXIgYWRkWWVhcnNfZGVmYXVsdDsKdmFyIGluaXRfYWRkWWVhcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkWWVhcnMuanMiKCkgewogICAgaW5pdF9hZGRNb250aHMoKTsKICAgIGFkZFllYXJzX2RlZmF1bHQgPSBhZGRZZWFyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hcmVJbnRlcnZhbHNPdmVybGFwcGluZy5qcwpmdW5jdGlvbiBhcmVJbnRlcnZhbHNPdmVybGFwcGluZyhpbnRlcnZhbExlZnQsIGludGVydmFsUmlnaHQsIG9wdGlvbnMpIHsKICBjb25zdCBbbGVmdFN0YXJ0VGltZSwgbGVmdEVuZFRpbWVdID0gWwogICAgK3RvRGF0ZShpbnRlcnZhbExlZnQuc3RhcnQsIG9wdGlvbnM/LmluKSwKICAgICt0b0RhdGUoaW50ZXJ2YWxMZWZ0LmVuZCwgb3B0aW9ucz8uaW4pCiAgXS5zb3J0KChhNSwgYjYpID0+IGE1IC0gYjYpOwogIGNvbnN0IFtyaWdodFN0YXJ0VGltZSwgcmlnaHRFbmRUaW1lXSA9IFsKICAgICt0b0RhdGUoaW50ZXJ2YWxSaWdodC5zdGFydCwgb3B0aW9ucz8uaW4pLAogICAgK3RvRGF0ZShpbnRlcnZhbFJpZ2h0LmVuZCwgb3B0aW9ucz8uaW4pCiAgXS5zb3J0KChhNSwgYjYpID0+IGE1IC0gYjYpOwogIGlmIChvcHRpb25zPy5pbmNsdXNpdmUpCiAgICByZXR1cm4gbGVmdFN0YXJ0VGltZSA8PSByaWdodEVuZFRpbWUgJiYgcmlnaHRTdGFydFRpbWUgPD0gbGVmdEVuZFRpbWU7CiAgcmV0dXJuIGxlZnRTdGFydFRpbWUgPCByaWdodEVuZFRpbWUgJiYgcmlnaHRTdGFydFRpbWUgPCBsZWZ0RW5kVGltZTsKfQp2YXIgYXJlSW50ZXJ2YWxzT3ZlcmxhcHBpbmdfZGVmYXVsdDsKdmFyIGluaXRfYXJlSW50ZXJ2YWxzT3ZlcmxhcHBpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYXJlSW50ZXJ2YWxzT3ZlcmxhcHBpbmcuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGFyZUludGVydmFsc092ZXJsYXBwaW5nX2RlZmF1bHQgPSBhcmVJbnRlcnZhbHNPdmVybGFwcGluZzsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9tYXguanMKZnVuY3Rpb24gbWF4MihkYXRlcywgb3B0aW9ucykgewogIGxldCByZXN1bHQ7CiAgbGV0IGNvbnRleHQyID0gb3B0aW9ucz8uaW47CiAgZGF0ZXMuZm9yRWFjaCgoZGF0ZSkgPT4gewogICAgaWYgKCFjb250ZXh0MiAmJiB0eXBlb2YgZGF0ZSA9PT0gIm9iamVjdCIpCiAgICAgIGNvbnRleHQyID0gY29uc3RydWN0RnJvbS5iaW5kKG51bGwsIGRhdGUpOwogICAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgY29udGV4dDIpOwogICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0IDwgZGF0ZV8gfHwgaXNOYU4oK2RhdGVfKSkgcmVzdWx0ID0gZGF0ZV87CiAgfSk7CiAgcmV0dXJuIGNvbnN0cnVjdEZyb20oY29udGV4dDIsIHJlc3VsdCB8fCBOYU4pOwp9CnZhciBtYXhfZGVmYXVsdDsKdmFyIGluaXRfbWF4MiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9tYXguanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgbWF4X2RlZmF1bHQgPSBtYXgyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21pbi5qcwpmdW5jdGlvbiBtaW4yKGRhdGVzLCBvcHRpb25zKSB7CiAgbGV0IHJlc3VsdDsKICBsZXQgY29udGV4dDIgPSBvcHRpb25zPy5pbjsKICBkYXRlcy5mb3JFYWNoKChkYXRlKSA9PiB7CiAgICBpZiAoIWNvbnRleHQyICYmIHR5cGVvZiBkYXRlID09PSAib2JqZWN0IikKICAgICAgY29udGV4dDIgPSBjb25zdHJ1Y3RGcm9tLmJpbmQobnVsbCwgZGF0ZSk7CiAgICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBjb250ZXh0Mik7CiAgICBpZiAoIXJlc3VsdCB8fCByZXN1bHQgPiBkYXRlXyB8fCBpc05hTigrZGF0ZV8pKSByZXN1bHQgPSBkYXRlXzsKICB9KTsKICByZXR1cm4gY29uc3RydWN0RnJvbShjb250ZXh0MiwgcmVzdWx0IHx8IE5hTik7Cn0KdmFyIG1pbl9kZWZhdWx0Owp2YXIgaW5pdF9taW4yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21pbi5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBtaW5fZGVmYXVsdCA9IG1pbjI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY2xhbXAuanMKZnVuY3Rpb24gY2xhbXAoZGF0ZSwgaW50ZXJ2YWwzLCBvcHRpb25zKSB7CiAgY29uc3QgW2RhdGVfLCBzdGFydCwgZW5kM10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgZGF0ZSwKICAgIGludGVydmFsMy5zdGFydCwKICAgIGludGVydmFsMy5lbmQKICApOwogIHJldHVybiBtaW4yKFttYXgyKFtkYXRlXywgc3RhcnRdLCBvcHRpb25zKSwgZW5kM10sIG9wdGlvbnMpOwp9CnZhciBjbGFtcF9kZWZhdWx0Owp2YXIgaW5pdF9jbGFtcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jbGFtcC5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBpbml0X21heDIoKTsKICAgIGluaXRfbWluMigpOwogICAgY2xhbXBfZGVmYXVsdCA9IGNsYW1wOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Nsb3Nlc3RJbmRleFRvLmpzCmZ1bmN0aW9uIGNsb3Nlc3RJbmRleFRvKGRhdGVUb0NvbXBhcmUsIGRhdGVzKSB7CiAgY29uc3QgdGltZVRvQ29tcGFyZSA9ICt0b0RhdGUoZGF0ZVRvQ29tcGFyZSk7CiAgaWYgKGlzTmFOKHRpbWVUb0NvbXBhcmUpKSByZXR1cm4gTmFOOwogIGxldCByZXN1bHQ7CiAgbGV0IG1pbkRpc3RhbmNlOwogIGRhdGVzLmZvckVhY2goKGRhdGUsIGluZGV4MikgPT4gewogICAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSk7CiAgICBpZiAoaXNOYU4oK2RhdGVfKSkgewogICAgICByZXN1bHQgPSBOYU47CiAgICAgIG1pbkRpc3RhbmNlID0gTmFOOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKHRpbWVUb0NvbXBhcmUgLSArZGF0ZV8pOwogICAgaWYgKHJlc3VsdCA9PSBudWxsIHx8IGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpIHsKICAgICAgcmVzdWx0ID0gaW5kZXgyOwogICAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlOwogICAgfQogIH0pOwogIHJldHVybiByZXN1bHQ7Cn0KdmFyIGNsb3Nlc3RJbmRleFRvX2RlZmF1bHQ7CnZhciBpbml0X2Nsb3Nlc3RJbmRleFRvID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Nsb3Nlc3RJbmRleFRvLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBjbG9zZXN0SW5kZXhUb19kZWZhdWx0ID0gY2xvc2VzdEluZGV4VG87CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY2xvc2VzdFRvLmpzCmZ1bmN0aW9uIGNsb3Nlc3RUbyhkYXRlVG9Db21wYXJlLCBkYXRlcywgb3B0aW9ucykgewogIGNvbnN0IFtkYXRlVG9Db21wYXJlXywgLi4uZGF0ZXNfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBkYXRlVG9Db21wYXJlLAogICAgLi4uZGF0ZXMKICApOwogIGNvbnN0IGluZGV4MiA9IGNsb3Nlc3RJbmRleFRvKGRhdGVUb0NvbXBhcmVfLCBkYXRlc18pOwogIGlmICh0eXBlb2YgaW5kZXgyID09PSAibnVtYmVyIiAmJiBpc05hTihpbmRleDIpKQogICAgcmV0dXJuIGNvbnN0cnVjdEZyb20oZGF0ZVRvQ29tcGFyZV8sIE5hTik7CiAgaWYgKGluZGV4MiAhPT0gdm9pZCAwKSByZXR1cm4gZGF0ZXNfW2luZGV4Ml07Cn0KdmFyIGNsb3Nlc3RUb19kZWZhdWx0Owp2YXIgaW5pdF9jbG9zZXN0VG8gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY2xvc2VzdFRvLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplRGF0ZXMoKTsKICAgIGluaXRfY2xvc2VzdEluZGV4VG8oKTsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgY2xvc2VzdFRvX2RlZmF1bHQgPSBjbG9zZXN0VG87CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29tcGFyZUFzYy5qcwpmdW5jdGlvbiBjb21wYXJlQXNjKGRhdGVMZWZ0LCBkYXRlUmlnaHQpIHsKICBjb25zdCBkaWZmID0gK3RvRGF0ZShkYXRlTGVmdCkgLSArdG9EYXRlKGRhdGVSaWdodCk7CiAgaWYgKGRpZmYgPCAwKSByZXR1cm4gLTE7CiAgZWxzZSBpZiAoZGlmZiA+IDApIHJldHVybiAxOwogIHJldHVybiBkaWZmOwp9CnZhciBjb21wYXJlQXNjX2RlZmF1bHQ7CnZhciBpbml0X2NvbXBhcmVBc2MgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29tcGFyZUFzYy5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgY29tcGFyZUFzY19kZWZhdWx0ID0gY29tcGFyZUFzYzsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb21wYXJlRGVzYy5qcwpmdW5jdGlvbiBjb21wYXJlRGVzYyhkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7CiAgY29uc3QgZGlmZiA9ICt0b0RhdGUoZGF0ZUxlZnQpIC0gK3RvRGF0ZShkYXRlUmlnaHQpOwogIGlmIChkaWZmID4gMCkgcmV0dXJuIC0xOwogIGVsc2UgaWYgKGRpZmYgPCAwKSByZXR1cm4gMTsKICByZXR1cm4gZGlmZjsKfQp2YXIgY29tcGFyZURlc2NfZGVmYXVsdDsKdmFyIGluaXRfY29tcGFyZURlc2MgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29tcGFyZURlc2MuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGNvbXBhcmVEZXNjX2RlZmF1bHQgPSBjb21wYXJlRGVzYzsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb25zdHJ1Y3ROb3cuanMKZnVuY3Rpb24gY29uc3RydWN0Tm93KGRhdGUpIHsKICByZXR1cm4gY29uc3RydWN0RnJvbShkYXRlLCBEYXRlLm5vdygpKTsKfQp2YXIgY29uc3RydWN0Tm93X2RlZmF1bHQ7CnZhciBpbml0X2NvbnN0cnVjdE5vdyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb25zdHJ1Y3ROb3cuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBjb25zdHJ1Y3ROb3dfZGVmYXVsdCA9IGNvbnN0cnVjdE5vdzsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kYXlzVG9XZWVrcy5qcwpmdW5jdGlvbiBkYXlzVG9XZWVrcyhkYXlzMikgewogIGNvbnN0IHJlc3VsdCA9IE1hdGgudHJ1bmMoZGF5czIgLyBkYXlzSW5XZWVrKTsKICByZXR1cm4gcmVzdWx0ID09PSAwID8gMCA6IHJlc3VsdDsKfQp2YXIgZGF5c1RvV2Vla3NfZGVmYXVsdDsKdmFyIGluaXRfZGF5c1RvV2Vla3MgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGF5c1RvV2Vla3MuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIGRheXNUb1dlZWtzX2RlZmF1bHQgPSBkYXlzVG9XZWVrczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVEYXkuanMKZnVuY3Rpb24gaXNTYW1lRGF5KGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbZGF0ZUxlZnRfLCBkYXRlUmlnaHRfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgcmV0dXJuICtzdGFydE9mRGF5KGRhdGVMZWZ0XykgPT09ICtzdGFydE9mRGF5KGRhdGVSaWdodF8pOwp9CnZhciBpc1NhbWVEYXlfZGVmYXVsdDsKdmFyIGluaXRfaXNTYW1lRGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZURheS5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBpbml0X3N0YXJ0T2ZEYXkoKTsKICAgIGlzU2FtZURheV9kZWZhdWx0ID0gaXNTYW1lRGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzRGF0ZS5qcwpmdW5jdGlvbiBpc0RhdGUodmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMiBpbnN0YW5jZW9mIERhdGUgfHwgdHlwZW9mIHZhbHVlMiA9PT0gIm9iamVjdCIgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlMikgPT09ICJbb2JqZWN0IERhdGVdIjsKfQp2YXIgaXNEYXRlX2RlZmF1bHQ7CnZhciBpbml0X2lzRGF0ZTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNEYXRlLmpzIigpIHsKICAgIGlzRGF0ZV9kZWZhdWx0ID0gaXNEYXRlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVmFsaWQuanMKZnVuY3Rpb24gaXNWYWxpZChkYXRlKSB7CiAgcmV0dXJuICEoIWlzRGF0ZShkYXRlKSAmJiB0eXBlb2YgZGF0ZSAhPT0gIm51bWJlciIgfHwgaXNOYU4oK3RvRGF0ZShkYXRlKSkpOwp9CnZhciBpc1ZhbGlkX2RlZmF1bHQ7CnZhciBpbml0X2lzVmFsaWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNWYWxpZC5qcyIoKSB7CiAgICBpbml0X2lzRGF0ZTIoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpc1ZhbGlkX2RlZmF1bHQgPSBpc1ZhbGlkOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkJ1c2luZXNzRGF5cy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5CdXNpbmVzc0RheXMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICBpZiAoIWlzVmFsaWQobGF0ZXJEYXRlXykgfHwgIWlzVmFsaWQoZWFybGllckRhdGVfKSkgcmV0dXJuIE5hTjsKICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgY29uc3Qgc2lnbiA9IGRpZmYgPCAwID8gLTEgOiAxOwogIGNvbnN0IHdlZWtzID0gTWF0aC50cnVuYyhkaWZmIC8gNyk7CiAgbGV0IHJlc3VsdCA9IHdlZWtzICogNTsKICBsZXQgbW92aW5nRGF0ZSA9IGFkZERheXMoZWFybGllckRhdGVfLCB3ZWVrcyAqIDcpOwogIHdoaWxlICghaXNTYW1lRGF5KGxhdGVyRGF0ZV8sIG1vdmluZ0RhdGUpKSB7CiAgICByZXN1bHQgKz0gaXNXZWVrZW5kKG1vdmluZ0RhdGUsIG9wdGlvbnMpID8gMCA6IHNpZ247CiAgICBtb3ZpbmdEYXRlID0gYWRkRGF5cyhtb3ZpbmdEYXRlLCBzaWduKTsKICB9CiAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7Cn0KdmFyIGRpZmZlcmVuY2VJbkJ1c2luZXNzRGF5c19kZWZhdWx0Owp2YXIgaW5pdF9kaWZmZXJlbmNlSW5CdXNpbmVzc0RheXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQnVzaW5lc3NEYXlzLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplRGF0ZXMoKTsKICAgIGluaXRfYWRkRGF5cygpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoKTsKICAgIGluaXRfaXNTYW1lRGF5KCk7CiAgICBpbml0X2lzVmFsaWQoKTsKICAgIGluaXRfaXNXZWVrZW5kKCk7CiAgICBkaWZmZXJlbmNlSW5CdXNpbmVzc0RheXNfZGVmYXVsdCA9IGRpZmZlcmVuY2VJbkJ1c2luZXNzRGF5czsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtZZWFycy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtZZWFycyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIHJldHVybiBnZXRJU09XZWVrWWVhcihsYXRlckRhdGVfLCBvcHRpb25zKSAtIGdldElTT1dlZWtZZWFyKGVhcmxpZXJEYXRlXywgb3B0aW9ucyk7Cn0KdmFyIGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla1llYXJzX2RlZmF1bHQ7CnZhciBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla1llYXJzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla1llYXJzLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplRGF0ZXMoKTsKICAgIGluaXRfZ2V0SVNPV2Vla1llYXIoKTsKICAgIGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla1llYXJzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtZZWFyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla3MobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICBjb25zdCBzdGFydE9mSVNPV2Vla0xlZnQgPSBzdGFydE9mSVNPV2VlayhsYXRlckRhdGVfKTsKICBjb25zdCBzdGFydE9mSVNPV2Vla1JpZ2h0ID0gc3RhcnRPZklTT1dlZWsoZWFybGllckRhdGVfKTsKICBjb25zdCB0aW1lc3RhbXBMZWZ0ID0gK3N0YXJ0T2ZJU09XZWVrTGVmdCAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoc3RhcnRPZklTT1dlZWtMZWZ0KTsKICBjb25zdCB0aW1lc3RhbXBSaWdodCA9ICtzdGFydE9mSVNPV2Vla1JpZ2h0IC0gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhzdGFydE9mSVNPV2Vla1JpZ2h0KTsKICByZXR1cm4gTWF0aC5yb3VuZCgodGltZXN0YW1wTGVmdCAtIHRpbWVzdGFtcFJpZ2h0KSAvIG1pbGxpc2Vjb25kc0luV2Vlayk7Cn0KdmFyIGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla3NfZGVmYXVsdDsKdmFyIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtzLmpzIigpIHsKICAgIGluaXRfZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcygpOwogICAgaW5pdF9ub3JtYWxpemVEYXRlcygpOwogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIGluaXRfc3RhcnRPZklTT1dlZWsoKTsKICAgIGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla3NfZGVmYXVsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla3M7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMuanMKZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICBjb25zdCB5ZWFyc0RpZmYgPSBsYXRlckRhdGVfLmdldEZ1bGxZZWFyKCkgLSBlYXJsaWVyRGF0ZV8uZ2V0RnVsbFllYXIoKTsKICBjb25zdCBtb250aHNEaWZmID0gbGF0ZXJEYXRlXy5nZXRNb250aCgpIC0gZWFybGllckRhdGVfLmdldE1vbnRoKCk7CiAgcmV0dXJuIHllYXJzRGlmZiAqIDEyICsgbW9udGhzRGlmZjsKfQp2YXIgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHNfZGVmYXVsdDsKdmFyIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMuanMiKCkgewogICAgaW5pdF9ub3JtYWxpemVEYXRlcygpOwogICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHNfZGVmYXVsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFF1YXJ0ZXIuanMKZnVuY3Rpb24gZ2V0UXVhcnRlcihkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IHF1YXJ0ZXIgPSBNYXRoLnRydW5jKF9kYXRlLmdldE1vbnRoKCkgLyAzKSArIDE7CiAgcmV0dXJuIHF1YXJ0ZXI7Cn0KdmFyIGdldFF1YXJ0ZXJfZGVmYXVsdDsKdmFyIGluaXRfZ2V0UXVhcnRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRRdWFydGVyLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBnZXRRdWFydGVyX2RlZmF1bHQgPSBnZXRRdWFydGVyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMuanMKZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGNvbnN0IHllYXJzRGlmZiA9IGxhdGVyRGF0ZV8uZ2V0RnVsbFllYXIoKSAtIGVhcmxpZXJEYXRlXy5nZXRGdWxsWWVhcigpOwogIGNvbnN0IHF1YXJ0ZXJzRGlmZiA9IGdldFF1YXJ0ZXIobGF0ZXJEYXRlXykgLSBnZXRRdWFydGVyKGVhcmxpZXJEYXRlXyk7CiAgcmV0dXJuIHllYXJzRGlmZiAqIDQgKyBxdWFydGVyc0RpZmY7Cn0KdmFyIGRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnNfZGVmYXVsdDsKdmFyIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplRGF0ZXMoKTsKICAgIGluaXRfZ2V0UXVhcnRlcigpOwogICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVyc19kZWZhdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICBjb25zdCBsYXRlclN0YXJ0T2ZXZWVrID0gc3RhcnRPZldlZWsobGF0ZXJEYXRlXywgb3B0aW9ucyk7CiAgY29uc3QgZWFybGllclN0YXJ0T2ZXZWVrID0gc3RhcnRPZldlZWsoZWFybGllckRhdGVfLCBvcHRpb25zKTsKICBjb25zdCBsYXRlclRpbWVzdGFtcCA9ICtsYXRlclN0YXJ0T2ZXZWVrIC0gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhsYXRlclN0YXJ0T2ZXZWVrKTsKICBjb25zdCBlYXJsaWVyVGltZXN0YW1wID0gK2VhcmxpZXJTdGFydE9mV2VlayAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoZWFybGllclN0YXJ0T2ZXZWVrKTsKICByZXR1cm4gTWF0aC5yb3VuZCgobGF0ZXJUaW1lc3RhbXAgLSBlYXJsaWVyVGltZXN0YW1wKSAvIG1pbGxpc2Vjb25kc0luV2Vlayk7Cn0KdmFyIGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3NfZGVmYXVsdDsKdmFyIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzLmpzIigpIHsKICAgIGluaXRfZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcygpOwogICAgaW5pdF9ub3JtYWxpemVEYXRlcygpOwogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIGluaXRfc3RhcnRPZldlZWsoKTsKICAgIGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3NfZGVmYXVsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3M7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgcmV0dXJuIGxhdGVyRGF0ZV8uZ2V0RnVsbFllYXIoKSAtIGVhcmxpZXJEYXRlXy5nZXRGdWxsWWVhcigpOwp9CnZhciBkaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzX2RlZmF1bHQ7CnZhciBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycy5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBkaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkRheXMuanMKZnVuY3Rpb24gZGlmZmVyZW5jZUluRGF5cyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGNvbnN0IHNpZ24gPSBjb21wYXJlTG9jYWxBc2MobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoCiAgICBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKQogICk7CiAgbGF0ZXJEYXRlXy5zZXREYXRlKGxhdGVyRGF0ZV8uZ2V0RGF0ZSgpIC0gc2lnbiAqIGRpZmZlcmVuY2UpOwogIGNvbnN0IGlzTGFzdERheU5vdEZ1bGwgPSBOdW1iZXIoCiAgICBjb21wYXJlTG9jYWxBc2MobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKSA9PT0gLXNpZ24KICApOwogIGNvbnN0IHJlc3VsdCA9IHNpZ24gKiAoZGlmZmVyZW5jZSAtIGlzTGFzdERheU5vdEZ1bGwpOwogIHJldHVybiByZXN1bHQgPT09IDAgPyAwIDogcmVzdWx0Owp9CmZ1bmN0aW9uIGNvbXBhcmVMb2NhbEFzYyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlKSB7CiAgY29uc3QgZGlmZiA9IGxhdGVyRGF0ZS5nZXRGdWxsWWVhcigpIC0gZWFybGllckRhdGUuZ2V0RnVsbFllYXIoKSB8fCBsYXRlckRhdGUuZ2V0TW9udGgoKSAtIGVhcmxpZXJEYXRlLmdldE1vbnRoKCkgfHwgbGF0ZXJEYXRlLmdldERhdGUoKSAtIGVhcmxpZXJEYXRlLmdldERhdGUoKSB8fCBsYXRlckRhdGUuZ2V0SG91cnMoKSAtIGVhcmxpZXJEYXRlLmdldEhvdXJzKCkgfHwgbGF0ZXJEYXRlLmdldE1pbnV0ZXMoKSAtIGVhcmxpZXJEYXRlLmdldE1pbnV0ZXMoKSB8fCBsYXRlckRhdGUuZ2V0U2Vjb25kcygpIC0gZWFybGllckRhdGUuZ2V0U2Vjb25kcygpIHx8IGxhdGVyRGF0ZS5nZXRNaWxsaXNlY29uZHMoKSAtIGVhcmxpZXJEYXRlLmdldE1pbGxpc2Vjb25kcygpOwogIGlmIChkaWZmIDwgMCkgcmV0dXJuIC0xOwogIGlmIChkaWZmID4gMCkgcmV0dXJuIDE7CiAgcmV0dXJuIGRpZmY7Cn0KdmFyIGRpZmZlcmVuY2VJbkRheXNfZGVmYXVsdDsKdmFyIGluaXRfZGlmZmVyZW5jZUluRGF5cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5EYXlzLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplRGF0ZXMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKCk7CiAgICBkaWZmZXJlbmNlSW5EYXlzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5EYXlzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZ2V0Um91bmRpbmdNZXRob2QuanMKZnVuY3Rpb24gZ2V0Um91bmRpbmdNZXRob2QobWV0aG9kKSB7CiAgcmV0dXJuIChudW1iZXIyKSA9PiB7CiAgICBjb25zdCByb3VuZCA9IG1ldGhvZCA/IE1hdGhbbWV0aG9kXSA6IE1hdGgudHJ1bmM7CiAgICBjb25zdCByZXN1bHQgPSByb3VuZChudW1iZXIyKTsKICAgIHJldHVybiByZXN1bHQgPT09IDAgPyAwIDogcmVzdWx0OwogIH07Cn0KdmFyIGluaXRfZ2V0Um91bmRpbmdNZXRob2QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9nZXRSb3VuZGluZ01ldGhvZC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluSG91cnMuanMKZnVuY3Rpb24gZGlmZmVyZW5jZUluSG91cnMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICBjb25zdCBkaWZmID0gKCtsYXRlckRhdGVfIC0gK2VhcmxpZXJEYXRlXykgLyBtaWxsaXNlY29uZHNJbkhvdXI7CiAgcmV0dXJuIGdldFJvdW5kaW5nTWV0aG9kKG9wdGlvbnM/LnJvdW5kaW5nTWV0aG9kKShkaWZmKTsKfQp2YXIgZGlmZmVyZW5jZUluSG91cnNfZGVmYXVsdDsKdmFyIGluaXRfZGlmZmVyZW5jZUluSG91cnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluSG91cnMuanMiKCkgewogICAgaW5pdF9nZXRSb3VuZGluZ01ldGhvZCgpOwogICAgaW5pdF9ub3JtYWxpemVEYXRlcygpOwogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIGRpZmZlcmVuY2VJbkhvdXJzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5Ib3VyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJJU09XZWVrWWVhcnMuanMKZnVuY3Rpb24gc3ViSVNPV2Vla1llYXJzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRJU09XZWVrWWVhcnMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1YklTT1dlZWtZZWFyc19kZWZhdWx0Owp2YXIgaW5pdF9zdWJJU09XZWVrWWVhcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViSVNPV2Vla1llYXJzLmpzIigpIHsKICAgIGluaXRfYWRkSVNPV2Vla1llYXJzKCk7CiAgICBzdWJJU09XZWVrWWVhcnNfZGVmYXVsdCA9IHN1YklTT1dlZWtZZWFyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5JU09XZWVrWWVhcnMuanMKZnVuY3Rpb24gZGlmZmVyZW5jZUluSVNPV2Vla1llYXJzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgY29uc3Qgc2lnbiA9IGNvbXBhcmVBc2MobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICBjb25zdCBkaWZmID0gTWF0aC5hYnMoCiAgICBkaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtZZWFycyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8sIG9wdGlvbnMpCiAgKTsKICBjb25zdCBhZGp1c3RlZERhdGUgPSBzdWJJU09XZWVrWWVhcnMobGF0ZXJEYXRlXywgc2lnbiAqIGRpZmYsIG9wdGlvbnMpOwogIGNvbnN0IGlzTGFzdElTT1dlZWtZZWFyTm90RnVsbCA9IE51bWJlcigKICAgIGNvbXBhcmVBc2MoYWRqdXN0ZWREYXRlLCBlYXJsaWVyRGF0ZV8pID09PSAtc2lnbgogICk7CiAgY29uc3QgcmVzdWx0ID0gc2lnbiAqIChkaWZmIC0gaXNMYXN0SVNPV2Vla1llYXJOb3RGdWxsKTsKICByZXR1cm4gcmVzdWx0ID09PSAwID8gMCA6IHJlc3VsdDsKfQp2YXIgZGlmZmVyZW5jZUluSVNPV2Vla1llYXJzX2RlZmF1bHQ7CnZhciBpbml0X2RpZmZlcmVuY2VJbklTT1dlZWtZZWFycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5JU09XZWVrWWVhcnMuanMiKCkgewogICAgaW5pdF9ub3JtYWxpemVEYXRlcygpOwogICAgaW5pdF9jb21wYXJlQXNjKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla1llYXJzKCk7CiAgICBpbml0X3N1YklTT1dlZWtZZWFycygpOwogICAgZGlmZmVyZW5jZUluSVNPV2Vla1llYXJzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5JU09XZWVrWWVhcnM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbk1pbGxpc2Vjb25kcyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlKSB7CiAgcmV0dXJuICt0b0RhdGUobGF0ZXJEYXRlKSAtICt0b0RhdGUoZWFybGllckRhdGUpOwp9CnZhciBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHNfZGVmYXVsdDsKdmFyIGluaXRfZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbk1pbGxpc2Vjb25kcy5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluTWludXRlcy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5NaW51dGVzKGRhdGVMZWZ0LCBkYXRlUmlnaHQsIG9wdGlvbnMpIHsKICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzKGRhdGVMZWZ0LCBkYXRlUmlnaHQpIC8gbWlsbGlzZWNvbmRzSW5NaW51dGU7CiAgcmV0dXJuIGdldFJvdW5kaW5nTWV0aG9kKG9wdGlvbnM/LnJvdW5kaW5nTWV0aG9kKShkaWZmKTsKfQp2YXIgZGlmZmVyZW5jZUluTWludXRlc19kZWZhdWx0Owp2YXIgaW5pdF9kaWZmZXJlbmNlSW5NaW51dGVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbk1pbnV0ZXMuanMiKCkgewogICAgaW5pdF9nZXRSb3VuZGluZ01ldGhvZCgpOwogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzKCk7CiAgICBkaWZmZXJlbmNlSW5NaW51dGVzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5NaW51dGVzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mRGF5LmpzCmZ1bmN0aW9uIGVuZE9mRGF5KGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgX2RhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIGVuZE9mRGF5X2RlZmF1bHQ7CnZhciBpbml0X2VuZE9mRGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mRGF5LmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBlbmRPZkRheV9kZWZhdWx0ID0gZW5kT2ZEYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZNb250aC5qcwpmdW5jdGlvbiBlbmRPZk1vbnRoKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgbW9udGggPSBfZGF0ZS5nZXRNb250aCgpOwogIF9kYXRlLnNldEZ1bGxZZWFyKF9kYXRlLmdldEZ1bGxZZWFyKCksIG1vbnRoICsgMSwgMCk7CiAgX2RhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIGVuZE9mTW9udGhfZGVmYXVsdDsKdmFyIGluaXRfZW5kT2ZNb250aCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZk1vbnRoLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBlbmRPZk1vbnRoX2RlZmF1bHQgPSBlbmRPZk1vbnRoOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzTGFzdERheU9mTW9udGguanMKZnVuY3Rpb24gaXNMYXN0RGF5T2ZNb250aChkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIHJldHVybiArZW5kT2ZEYXkoX2RhdGUsIG9wdGlvbnMpID09PSArZW5kT2ZNb250aChfZGF0ZSwgb3B0aW9ucyk7Cn0KdmFyIGlzTGFzdERheU9mTW9udGhfZGVmYXVsdDsKdmFyIGluaXRfaXNMYXN0RGF5T2ZNb250aCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0xhc3REYXlPZk1vbnRoLmpzIigpIHsKICAgIGluaXRfZW5kT2ZEYXkoKTsKICAgIGluaXRfZW5kT2ZNb250aCgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGlzTGFzdERheU9mTW9udGhfZGVmYXVsdCA9IGlzTGFzdERheU9mTW9udGg7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluTW9udGhzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJbk1vbnRocyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIHdvcmtpbmdMYXRlckRhdGUsIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGNvbnN0IHNpZ24gPSBjb21wYXJlQXNjKHdvcmtpbmdMYXRlckRhdGUsIGVhcmxpZXJEYXRlXyk7CiAgY29uc3QgZGlmZmVyZW5jZSA9IE1hdGguYWJzKAogICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMod29ya2luZ0xhdGVyRGF0ZSwgZWFybGllckRhdGVfKQogICk7CiAgaWYgKGRpZmZlcmVuY2UgPCAxKSByZXR1cm4gMDsKICBpZiAod29ya2luZ0xhdGVyRGF0ZS5nZXRNb250aCgpID09PSAxICYmIHdvcmtpbmdMYXRlckRhdGUuZ2V0RGF0ZSgpID4gMjcpCiAgICB3b3JraW5nTGF0ZXJEYXRlLnNldERhdGUoMzApOwogIHdvcmtpbmdMYXRlckRhdGUuc2V0TW9udGgod29ya2luZ0xhdGVyRGF0ZS5nZXRNb250aCgpIC0gc2lnbiAqIGRpZmZlcmVuY2UpOwogIGxldCBpc0xhc3RNb250aE5vdEZ1bGwgPSBjb21wYXJlQXNjKHdvcmtpbmdMYXRlckRhdGUsIGVhcmxpZXJEYXRlXykgPT09IC1zaWduOwogIGlmIChpc0xhc3REYXlPZk1vbnRoKGxhdGVyRGF0ZV8pICYmIGRpZmZlcmVuY2UgPT09IDEgJiYgY29tcGFyZUFzYyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pID09PSAxKSB7CiAgICBpc0xhc3RNb250aE5vdEZ1bGwgPSBmYWxzZTsKICB9CiAgY29uc3QgcmVzdWx0ID0gc2lnbiAqIChkaWZmZXJlbmNlIC0gK2lzTGFzdE1vbnRoTm90RnVsbCk7CiAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7Cn0KdmFyIGRpZmZlcmVuY2VJbk1vbnRoc19kZWZhdWx0Owp2YXIgaW5pdF9kaWZmZXJlbmNlSW5Nb250aHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluTW9udGhzLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplRGF0ZXMoKTsKICAgIGluaXRfY29tcGFyZUFzYygpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocygpOwogICAgaW5pdF9pc0xhc3REYXlPZk1vbnRoKCk7CiAgICBkaWZmZXJlbmNlSW5Nb250aHNfZGVmYXVsdCA9IGRpZmZlcmVuY2VJbk1vbnRoczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5RdWFydGVycy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5RdWFydGVycyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGlmZiA9IGRpZmZlcmVuY2VJbk1vbnRocyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSAvIDM7CiAgcmV0dXJuIGdldFJvdW5kaW5nTWV0aG9kKG9wdGlvbnM/LnJvdW5kaW5nTWV0aG9kKShkaWZmKTsKfQp2YXIgZGlmZmVyZW5jZUluUXVhcnRlcnNfZGVmYXVsdDsKdmFyIGluaXRfZGlmZmVyZW5jZUluUXVhcnRlcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluUXVhcnRlcnMuanMiKCkgewogICAgaW5pdF9nZXRSb3VuZGluZ01ldGhvZCgpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5Nb250aHMoKTsKICAgIGRpZmZlcmVuY2VJblF1YXJ0ZXJzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5RdWFydGVyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5TZWNvbmRzLmpzCmZ1bmN0aW9uIGRpZmZlcmVuY2VJblNlY29uZHMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRpZmYgPSBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSkgLyAxZTM7CiAgcmV0dXJuIGdldFJvdW5kaW5nTWV0aG9kKG9wdGlvbnM/LnJvdW5kaW5nTWV0aG9kKShkaWZmKTsKfQp2YXIgZGlmZmVyZW5jZUluU2Vjb25kc19kZWZhdWx0Owp2YXIgaW5pdF9kaWZmZXJlbmNlSW5TZWNvbmRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJblNlY29uZHMuanMiKCkgewogICAgaW5pdF9nZXRSb3VuZGluZ01ldGhvZCgpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMoKTsKICAgIGRpZmZlcmVuY2VJblNlY29uZHNfZGVmYXVsdCA9IGRpZmZlcmVuY2VJblNlY29uZHM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluV2Vla3MuanMKZnVuY3Rpb24gZGlmZmVyZW5jZUluV2Vla3MobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRpZmYgPSBkaWZmZXJlbmNlSW5EYXlzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIC8gNzsKICByZXR1cm4gZ2V0Um91bmRpbmdNZXRob2Qob3B0aW9ucz8ucm91bmRpbmdNZXRob2QpKGRpZmYpOwp9CnZhciBkaWZmZXJlbmNlSW5XZWVrc19kZWZhdWx0Owp2YXIgaW5pdF9kaWZmZXJlbmNlSW5XZWVrcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5XZWVrcy5qcyIoKSB7CiAgICBpbml0X2dldFJvdW5kaW5nTWV0aG9kKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkRheXMoKTsKICAgIGRpZmZlcmVuY2VJbldlZWtzX2RlZmF1bHQgPSBkaWZmZXJlbmNlSW5XZWVrczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5ZZWFycy5qcwpmdW5jdGlvbiBkaWZmZXJlbmNlSW5ZZWFycyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGNvbnN0IHNpZ24gPSBjb21wYXJlQXNjKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgY29uc3QgZGlmZiA9IE1hdGguYWJzKGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKSk7CiAgbGF0ZXJEYXRlXy5zZXRGdWxsWWVhcigxNTg0KTsKICBlYXJsaWVyRGF0ZV8uc2V0RnVsbFllYXIoMTU4NCk7CiAgY29uc3QgcGFydGlhbCA9IGNvbXBhcmVBc2MobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKSA9PT0gLXNpZ247CiAgY29uc3QgcmVzdWx0ID0gc2lnbiAqIChkaWZmIC0gK3BhcnRpYWwpOwogIHJldHVybiByZXN1bHQgPT09IDAgPyAwIDogcmVzdWx0Owp9CnZhciBkaWZmZXJlbmNlSW5ZZWFyc19kZWZhdWx0Owp2YXIgaW5pdF9kaWZmZXJlbmNlSW5ZZWFycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5ZZWFycy5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBpbml0X2NvbXBhcmVBc2MoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycygpOwogICAgZGlmZmVyZW5jZUluWWVhcnNfZGVmYXVsdCA9IGRpZmZlcmVuY2VJblllYXJzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvbm9ybWFsaXplSW50ZXJ2YWwuanMKZnVuY3Rpb24gbm9ybWFsaXplSW50ZXJ2YWwoY29udGV4dDIsIGludGVydmFsMykgewogIGNvbnN0IFtzdGFydCwgZW5kM10gPSBub3JtYWxpemVEYXRlcyhjb250ZXh0MiwgaW50ZXJ2YWwzLnN0YXJ0LCBpbnRlcnZhbDMuZW5kKTsKICByZXR1cm4geyBzdGFydCwgZW5kOiBlbmQzIH07Cn0KdmFyIGluaXRfbm9ybWFsaXplSW50ZXJ2YWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9ub3JtYWxpemVJbnRlcnZhbC5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaERheU9mSW50ZXJ2YWwuanMKZnVuY3Rpb24gZWFjaERheU9mSW50ZXJ2YWwoaW50ZXJ2YWwzLCBvcHRpb25zKSB7CiAgY29uc3QgeyBzdGFydCwgZW5kOiBlbmQzIH0gPSBub3JtYWxpemVJbnRlcnZhbChvcHRpb25zPy5pbiwgaW50ZXJ2YWwzKTsKICBsZXQgcmV2ZXJzZWQgPSArc3RhcnQgPiArZW5kMzsKICBjb25zdCBlbmRUaW1lID0gcmV2ZXJzZWQgPyArc3RhcnQgOiArZW5kMzsKICBjb25zdCBkYXRlID0gcmV2ZXJzZWQgPyBlbmQzIDogc3RhcnQ7CiAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBsZXQgc3RlcCA9IG9wdGlvbnM/LnN0ZXAgPz8gMTsKICBpZiAoIXN0ZXApIHJldHVybiBbXTsKICBpZiAoc3RlcCA8IDApIHsKICAgIHN0ZXAgPSAtc3RlcDsKICAgIHJldmVyc2VkID0gIXJldmVyc2VkOwogIH0KICBjb25zdCBkYXRlcyA9IFtdOwogIHdoaWxlICgrZGF0ZSA8PSBlbmRUaW1lKSB7CiAgICBkYXRlcy5wdXNoKGNvbnN0cnVjdEZyb20oc3RhcnQsIGRhdGUpKTsKICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIHN0ZXApOwogICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICB9CiAgcmV0dXJuIHJldmVyc2VkID8gZGF0ZXMucmV2ZXJzZSgpIDogZGF0ZXM7Cn0KdmFyIGVhY2hEYXlPZkludGVydmFsX2RlZmF1bHQ7CnZhciBpbml0X2VhY2hEYXlPZkludGVydmFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VhY2hEYXlPZkludGVydmFsLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplSW50ZXJ2YWwoKTsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgZWFjaERheU9mSW50ZXJ2YWxfZGVmYXVsdCA9IGVhY2hEYXlPZkludGVydmFsOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VhY2hIb3VyT2ZJbnRlcnZhbC5qcwpmdW5jdGlvbiBlYWNoSG91ck9mSW50ZXJ2YWwoaW50ZXJ2YWwzLCBvcHRpb25zKSB7CiAgY29uc3QgeyBzdGFydCwgZW5kOiBlbmQzIH0gPSBub3JtYWxpemVJbnRlcnZhbChvcHRpb25zPy5pbiwgaW50ZXJ2YWwzKTsKICBsZXQgcmV2ZXJzZWQgPSArc3RhcnQgPiArZW5kMzsKICBjb25zdCBlbmRUaW1lID0gcmV2ZXJzZWQgPyArc3RhcnQgOiArZW5kMzsKICBjb25zdCBkYXRlID0gcmV2ZXJzZWQgPyBlbmQzIDogc3RhcnQ7CiAgZGF0ZS5zZXRNaW51dGVzKDAsIDAsIDApOwogIGxldCBzdGVwID0gb3B0aW9ucz8uc3RlcCA/PyAxOwogIGlmICghc3RlcCkgcmV0dXJuIFtdOwogIGlmIChzdGVwIDwgMCkgewogICAgc3RlcCA9IC1zdGVwOwogICAgcmV2ZXJzZWQgPSAhcmV2ZXJzZWQ7CiAgfQogIGNvbnN0IGRhdGVzID0gW107CiAgd2hpbGUgKCtkYXRlIDw9IGVuZFRpbWUpIHsKICAgIGRhdGVzLnB1c2goY29uc3RydWN0RnJvbShzdGFydCwgZGF0ZSkpOwogICAgZGF0ZS5zZXRIb3VycyhkYXRlLmdldEhvdXJzKCkgKyBzdGVwKTsKICB9CiAgcmV0dXJuIHJldmVyc2VkID8gZGF0ZXMucmV2ZXJzZSgpIDogZGF0ZXM7Cn0KdmFyIGVhY2hIb3VyT2ZJbnRlcnZhbF9kZWZhdWx0Owp2YXIgaW5pdF9lYWNoSG91ck9mSW50ZXJ2YWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaEhvdXJPZkludGVydmFsLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplSW50ZXJ2YWwoKTsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgZWFjaEhvdXJPZkludGVydmFsX2RlZmF1bHQgPSBlYWNoSG91ck9mSW50ZXJ2YWw7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaE1pbnV0ZU9mSW50ZXJ2YWwuanMKZnVuY3Rpb24gZWFjaE1pbnV0ZU9mSW50ZXJ2YWwoaW50ZXJ2YWwzLCBvcHRpb25zKSB7CiAgY29uc3QgeyBzdGFydCwgZW5kOiBlbmQzIH0gPSBub3JtYWxpemVJbnRlcnZhbChvcHRpb25zPy5pbiwgaW50ZXJ2YWwzKTsKICBzdGFydC5zZXRTZWNvbmRzKDAsIDApOwogIGxldCByZXZlcnNlZCA9ICtzdGFydCA+ICtlbmQzOwogIGNvbnN0IGVuZFRpbWUgPSByZXZlcnNlZCA/ICtzdGFydCA6ICtlbmQzOwogIGxldCBkYXRlID0gcmV2ZXJzZWQgPyBlbmQzIDogc3RhcnQ7CiAgbGV0IHN0ZXAgPSBvcHRpb25zPy5zdGVwID8/IDE7CiAgaWYgKCFzdGVwKSByZXR1cm4gW107CiAgaWYgKHN0ZXAgPCAwKSB7CiAgICBzdGVwID0gLXN0ZXA7CiAgICByZXZlcnNlZCA9ICFyZXZlcnNlZDsKICB9CiAgY29uc3QgZGF0ZXMgPSBbXTsKICB3aGlsZSAoK2RhdGUgPD0gZW5kVGltZSkgewogICAgZGF0ZXMucHVzaChjb25zdHJ1Y3RGcm9tKHN0YXJ0LCBkYXRlKSk7CiAgICBkYXRlID0gYWRkTWludXRlcyhkYXRlLCBzdGVwKTsKICB9CiAgcmV0dXJuIHJldmVyc2VkID8gZGF0ZXMucmV2ZXJzZSgpIDogZGF0ZXM7Cn0KdmFyIGVhY2hNaW51dGVPZkludGVydmFsX2RlZmF1bHQ7CnZhciBpbml0X2VhY2hNaW51dGVPZkludGVydmFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VhY2hNaW51dGVPZkludGVydmFsLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplSW50ZXJ2YWwoKTsKICAgIGluaXRfYWRkTWludXRlcygpOwogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBlYWNoTWludXRlT2ZJbnRlcnZhbF9kZWZhdWx0ID0gZWFjaE1pbnV0ZU9mSW50ZXJ2YWw7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaE1vbnRoT2ZJbnRlcnZhbC5qcwpmdW5jdGlvbiBlYWNoTW9udGhPZkludGVydmFsKGludGVydmFsMywgb3B0aW9ucykgewogIGNvbnN0IHsgc3RhcnQsIGVuZDogZW5kMyB9ID0gbm9ybWFsaXplSW50ZXJ2YWwob3B0aW9ucz8uaW4sIGludGVydmFsMyk7CiAgbGV0IHJldmVyc2VkID0gK3N0YXJ0ID4gK2VuZDM7CiAgY29uc3QgZW5kVGltZSA9IHJldmVyc2VkID8gK3N0YXJ0IDogK2VuZDM7CiAgY29uc3QgZGF0ZSA9IHJldmVyc2VkID8gZW5kMyA6IHN0YXJ0OwogIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgZGF0ZS5zZXREYXRlKDEpOwogIGxldCBzdGVwID0gb3B0aW9ucz8uc3RlcCA/PyAxOwogIGlmICghc3RlcCkgcmV0dXJuIFtdOwogIGlmIChzdGVwIDwgMCkgewogICAgc3RlcCA9IC1zdGVwOwogICAgcmV2ZXJzZWQgPSAhcmV2ZXJzZWQ7CiAgfQogIGNvbnN0IGRhdGVzID0gW107CiAgd2hpbGUgKCtkYXRlIDw9IGVuZFRpbWUpIHsKICAgIGRhdGVzLnB1c2goY29uc3RydWN0RnJvbShzdGFydCwgZGF0ZSkpOwogICAgZGF0ZS5zZXRNb250aChkYXRlLmdldE1vbnRoKCkgKyBzdGVwKTsKICB9CiAgcmV0dXJuIHJldmVyc2VkID8gZGF0ZXMucmV2ZXJzZSgpIDogZGF0ZXM7Cn0KdmFyIGVhY2hNb250aE9mSW50ZXJ2YWxfZGVmYXVsdDsKdmFyIGluaXRfZWFjaE1vbnRoT2ZJbnRlcnZhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoTW9udGhPZkludGVydmFsLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplSW50ZXJ2YWwoKTsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgZWFjaE1vbnRoT2ZJbnRlcnZhbF9kZWZhdWx0ID0gZWFjaE1vbnRoT2ZJbnRlcnZhbDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mUXVhcnRlci5qcwpmdW5jdGlvbiBzdGFydE9mUXVhcnRlcihkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGN1cnJlbnRNb250aCA9IF9kYXRlLmdldE1vbnRoKCk7CiAgY29uc3QgbW9udGggPSBjdXJyZW50TW9udGggLSBjdXJyZW50TW9udGggJSAzOwogIF9kYXRlLnNldE1vbnRoKG1vbnRoLCAxKTsKICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIHN0YXJ0T2ZRdWFydGVyX2RlZmF1bHQ7CnZhciBpbml0X3N0YXJ0T2ZRdWFydGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZRdWFydGVyLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzdGFydE9mUXVhcnRlcl9kZWZhdWx0ID0gc3RhcnRPZlF1YXJ0ZXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaFF1YXJ0ZXJPZkludGVydmFsLmpzCmZ1bmN0aW9uIGVhY2hRdWFydGVyT2ZJbnRlcnZhbChpbnRlcnZhbDMsIG9wdGlvbnMpIHsKICBjb25zdCB7IHN0YXJ0LCBlbmQ6IGVuZDMgfSA9IG5vcm1hbGl6ZUludGVydmFsKG9wdGlvbnM/LmluLCBpbnRlcnZhbDMpOwogIGxldCByZXZlcnNlZCA9ICtzdGFydCA+ICtlbmQzOwogIGNvbnN0IGVuZFRpbWUgPSByZXZlcnNlZCA/ICtzdGFydE9mUXVhcnRlcihzdGFydCkgOiArc3RhcnRPZlF1YXJ0ZXIoZW5kMyk7CiAgbGV0IGRhdGUgPSByZXZlcnNlZCA/IHN0YXJ0T2ZRdWFydGVyKGVuZDMpIDogc3RhcnRPZlF1YXJ0ZXIoc3RhcnQpOwogIGxldCBzdGVwID0gb3B0aW9ucz8uc3RlcCA/PyAxOwogIGlmICghc3RlcCkgcmV0dXJuIFtdOwogIGlmIChzdGVwIDwgMCkgewogICAgc3RlcCA9IC1zdGVwOwogICAgcmV2ZXJzZWQgPSAhcmV2ZXJzZWQ7CiAgfQogIGNvbnN0IGRhdGVzID0gW107CiAgd2hpbGUgKCtkYXRlIDw9IGVuZFRpbWUpIHsKICAgIGRhdGVzLnB1c2goY29uc3RydWN0RnJvbShzdGFydCwgZGF0ZSkpOwogICAgZGF0ZSA9IGFkZFF1YXJ0ZXJzKGRhdGUsIHN0ZXApOwogIH0KICByZXR1cm4gcmV2ZXJzZWQgPyBkYXRlcy5yZXZlcnNlKCkgOiBkYXRlczsKfQp2YXIgZWFjaFF1YXJ0ZXJPZkludGVydmFsX2RlZmF1bHQ7CnZhciBpbml0X2VhY2hRdWFydGVyT2ZJbnRlcnZhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoUXVhcnRlck9mSW50ZXJ2YWwuanMiKCkgewogICAgaW5pdF9ub3JtYWxpemVJbnRlcnZhbCgpOwogICAgaW5pdF9hZGRRdWFydGVycygpOwogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X3N0YXJ0T2ZRdWFydGVyKCk7CiAgICBlYWNoUXVhcnRlck9mSW50ZXJ2YWxfZGVmYXVsdCA9IGVhY2hRdWFydGVyT2ZJbnRlcnZhbDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoV2Vla09mSW50ZXJ2YWwuanMKZnVuY3Rpb24gZWFjaFdlZWtPZkludGVydmFsKGludGVydmFsMywgb3B0aW9ucykgewogIGNvbnN0IHsgc3RhcnQsIGVuZDogZW5kMyB9ID0gbm9ybWFsaXplSW50ZXJ2YWwob3B0aW9ucz8uaW4sIGludGVydmFsMyk7CiAgbGV0IHJldmVyc2VkID0gK3N0YXJ0ID4gK2VuZDM7CiAgY29uc3Qgc3RhcnREYXRlV2VlayA9IHJldmVyc2VkID8gc3RhcnRPZldlZWsoZW5kMywgb3B0aW9ucykgOiBzdGFydE9mV2VlayhzdGFydCwgb3B0aW9ucyk7CiAgY29uc3QgZW5kRGF0ZVdlZWsgPSByZXZlcnNlZCA/IHN0YXJ0T2ZXZWVrKHN0YXJ0LCBvcHRpb25zKSA6IHN0YXJ0T2ZXZWVrKGVuZDMsIG9wdGlvbnMpOwogIHN0YXJ0RGF0ZVdlZWsuc2V0SG91cnMoMTUpOwogIGVuZERhdGVXZWVrLnNldEhvdXJzKDE1KTsKICBjb25zdCBlbmRUaW1lID0gK2VuZERhdGVXZWVrLmdldFRpbWUoKTsKICBsZXQgY3VycmVudERhdGUgPSBzdGFydERhdGVXZWVrOwogIGxldCBzdGVwID0gb3B0aW9ucz8uc3RlcCA/PyAxOwogIGlmICghc3RlcCkgcmV0dXJuIFtdOwogIGlmIChzdGVwIDwgMCkgewogICAgc3RlcCA9IC1zdGVwOwogICAgcmV2ZXJzZWQgPSAhcmV2ZXJzZWQ7CiAgfQogIGNvbnN0IGRhdGVzID0gW107CiAgd2hpbGUgKCtjdXJyZW50RGF0ZSA8PSBlbmRUaW1lKSB7CiAgICBjdXJyZW50RGF0ZS5zZXRIb3VycygwKTsKICAgIGRhdGVzLnB1c2goY29uc3RydWN0RnJvbShzdGFydCwgY3VycmVudERhdGUpKTsKICAgIGN1cnJlbnREYXRlID0gYWRkV2Vla3MoY3VycmVudERhdGUsIHN0ZXApOwogICAgY3VycmVudERhdGUuc2V0SG91cnMoMTUpOwogIH0KICByZXR1cm4gcmV2ZXJzZWQgPyBkYXRlcy5yZXZlcnNlKCkgOiBkYXRlczsKfQp2YXIgZWFjaFdlZWtPZkludGVydmFsX2RlZmF1bHQ7CnZhciBpbml0X2VhY2hXZWVrT2ZJbnRlcnZhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoV2Vla09mSW50ZXJ2YWwuanMiKCkgewogICAgaW5pdF9ub3JtYWxpemVJbnRlcnZhbCgpOwogICAgaW5pdF9hZGRXZWVrcygpOwogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X3N0YXJ0T2ZXZWVrKCk7CiAgICBlYWNoV2Vla09mSW50ZXJ2YWxfZGVmYXVsdCA9IGVhY2hXZWVrT2ZJbnRlcnZhbDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoV2Vla2VuZE9mSW50ZXJ2YWwuanMKZnVuY3Rpb24gZWFjaFdlZWtlbmRPZkludGVydmFsKGludGVydmFsMywgb3B0aW9ucykgewogIGNvbnN0IHsgc3RhcnQsIGVuZDogZW5kMyB9ID0gbm9ybWFsaXplSW50ZXJ2YWwob3B0aW9ucz8uaW4sIGludGVydmFsMyk7CiAgY29uc3QgZGF0ZUludGVydmFsID0gZWFjaERheU9mSW50ZXJ2YWwoeyBzdGFydCwgZW5kOiBlbmQzIH0sIG9wdGlvbnMpOwogIGNvbnN0IHdlZWtlbmRzID0gW107CiAgbGV0IGluZGV4MiA9IDA7CiAgd2hpbGUgKGluZGV4MiA8IGRhdGVJbnRlcnZhbC5sZW5ndGgpIHsKICAgIGNvbnN0IGRhdGUgPSBkYXRlSW50ZXJ2YWxbaW5kZXgyKytdOwogICAgaWYgKGlzV2Vla2VuZChkYXRlKSkgd2Vla2VuZHMucHVzaChjb25zdHJ1Y3RGcm9tKHN0YXJ0LCBkYXRlKSk7CiAgfQogIHJldHVybiB3ZWVrZW5kczsKfQp2YXIgZWFjaFdlZWtlbmRPZkludGVydmFsX2RlZmF1bHQ7CnZhciBpbml0X2VhY2hXZWVrZW5kT2ZJbnRlcnZhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoV2Vla2VuZE9mSW50ZXJ2YWwuanMiKCkgewogICAgaW5pdF9ub3JtYWxpemVJbnRlcnZhbCgpOwogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X2VhY2hEYXlPZkludGVydmFsKCk7CiAgICBpbml0X2lzV2Vla2VuZCgpOwogICAgZWFjaFdlZWtlbmRPZkludGVydmFsX2RlZmF1bHQgPSBlYWNoV2Vla2VuZE9mSW50ZXJ2YWw7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZk1vbnRoLmpzCmZ1bmN0aW9uIHN0YXJ0T2ZNb250aChkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIF9kYXRlLnNldERhdGUoMSk7CiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBzdGFydE9mTW9udGhfZGVmYXVsdDsKdmFyIGluaXRfc3RhcnRPZk1vbnRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZNb250aC5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgc3RhcnRPZk1vbnRoX2RlZmF1bHQgPSBzdGFydE9mTW9udGg7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaFdlZWtlbmRPZk1vbnRoLmpzCmZ1bmN0aW9uIGVhY2hXZWVrZW5kT2ZNb250aChkYXRlLCBvcHRpb25zKSB7CiAgY29uc3Qgc3RhcnQgPSBzdGFydE9mTW9udGgoZGF0ZSwgb3B0aW9ucyk7CiAgY29uc3QgZW5kMyA9IGVuZE9mTW9udGgoZGF0ZSwgb3B0aW9ucyk7CiAgcmV0dXJuIGVhY2hXZWVrZW5kT2ZJbnRlcnZhbCh7IHN0YXJ0LCBlbmQ6IGVuZDMgfSwgb3B0aW9ucyk7Cn0KdmFyIGVhY2hXZWVrZW5kT2ZNb250aF9kZWZhdWx0Owp2YXIgaW5pdF9lYWNoV2Vla2VuZE9mTW9udGggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaFdlZWtlbmRPZk1vbnRoLmpzIigpIHsKICAgIGluaXRfZWFjaFdlZWtlbmRPZkludGVydmFsKCk7CiAgICBpbml0X2VuZE9mTW9udGgoKTsKICAgIGluaXRfc3RhcnRPZk1vbnRoKCk7CiAgICBlYWNoV2Vla2VuZE9mTW9udGhfZGVmYXVsdCA9IGVhY2hXZWVrZW5kT2ZNb250aDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZlllYXIuanMKZnVuY3Rpb24gZW5kT2ZZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7CiAgX2RhdGUuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDApOwogIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBlbmRPZlllYXJfZGVmYXVsdDsKdmFyIGluaXRfZW5kT2ZZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mWWVhci5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZW5kT2ZZZWFyX2RlZmF1bHQgPSBlbmRPZlllYXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZlllYXIuanMKZnVuY3Rpb24gc3RhcnRPZlllYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBkYXRlXy5zZXRGdWxsWWVhcihkYXRlXy5nZXRGdWxsWWVhcigpLCAwLCAxKTsKICBkYXRlXy5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gZGF0ZV87Cn0KdmFyIHN0YXJ0T2ZZZWFyX2RlZmF1bHQ7CnZhciBpbml0X3N0YXJ0T2ZZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZZZWFyLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzdGFydE9mWWVhcl9kZWZhdWx0ID0gc3RhcnRPZlllYXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaFdlZWtlbmRPZlllYXIuanMKZnVuY3Rpb24gZWFjaFdlZWtlbmRPZlllYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IHN0YXJ0ID0gc3RhcnRPZlllYXIoZGF0ZSwgb3B0aW9ucyk7CiAgY29uc3QgZW5kMyA9IGVuZE9mWWVhcihkYXRlLCBvcHRpb25zKTsKICByZXR1cm4gZWFjaFdlZWtlbmRPZkludGVydmFsKHsgc3RhcnQsIGVuZDogZW5kMyB9LCBvcHRpb25zKTsKfQp2YXIgZWFjaFdlZWtlbmRPZlllYXJfZGVmYXVsdDsKdmFyIGluaXRfZWFjaFdlZWtlbmRPZlllYXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaFdlZWtlbmRPZlllYXIuanMiKCkgewogICAgaW5pdF9lYWNoV2Vla2VuZE9mSW50ZXJ2YWwoKTsKICAgIGluaXRfZW5kT2ZZZWFyKCk7CiAgICBpbml0X3N0YXJ0T2ZZZWFyKCk7CiAgICBlYWNoV2Vla2VuZE9mWWVhcl9kZWZhdWx0ID0gZWFjaFdlZWtlbmRPZlllYXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZWFjaFllYXJPZkludGVydmFsLmpzCmZ1bmN0aW9uIGVhY2hZZWFyT2ZJbnRlcnZhbChpbnRlcnZhbDMsIG9wdGlvbnMpIHsKICBjb25zdCB7IHN0YXJ0LCBlbmQ6IGVuZDMgfSA9IG5vcm1hbGl6ZUludGVydmFsKG9wdGlvbnM/LmluLCBpbnRlcnZhbDMpOwogIGxldCByZXZlcnNlZCA9ICtzdGFydCA+ICtlbmQzOwogIGNvbnN0IGVuZFRpbWUgPSByZXZlcnNlZCA/ICtzdGFydCA6ICtlbmQzOwogIGNvbnN0IGRhdGUgPSByZXZlcnNlZCA/IGVuZDMgOiBzdGFydDsKICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIGRhdGUuc2V0TW9udGgoMCwgMSk7CiAgbGV0IHN0ZXAgPSBvcHRpb25zPy5zdGVwID8/IDE7CiAgaWYgKCFzdGVwKSByZXR1cm4gW107CiAgaWYgKHN0ZXAgPCAwKSB7CiAgICBzdGVwID0gLXN0ZXA7CiAgICByZXZlcnNlZCA9ICFyZXZlcnNlZDsKICB9CiAgY29uc3QgZGF0ZXMgPSBbXTsKICB3aGlsZSAoK2RhdGUgPD0gZW5kVGltZSkgewogICAgZGF0ZXMucHVzaChjb25zdHJ1Y3RGcm9tKHN0YXJ0LCBkYXRlKSk7CiAgICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIHN0ZXApOwogIH0KICByZXR1cm4gcmV2ZXJzZWQgPyBkYXRlcy5yZXZlcnNlKCkgOiBkYXRlczsKfQp2YXIgZWFjaFllYXJPZkludGVydmFsX2RlZmF1bHQ7CnZhciBpbml0X2VhY2hZZWFyT2ZJbnRlcnZhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lYWNoWWVhck9mSW50ZXJ2YWwuanMiKCkgewogICAgaW5pdF9ub3JtYWxpemVJbnRlcnZhbCgpOwogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBlYWNoWWVhck9mSW50ZXJ2YWxfZGVmYXVsdCA9IGVhY2hZZWFyT2ZJbnRlcnZhbDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZkRlY2FkZS5qcwpmdW5jdGlvbiBlbmRPZkRlY2FkZShkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IHllYXIgPSBfZGF0ZS5nZXRGdWxsWWVhcigpOwogIGNvbnN0IGRlY2FkZSA9IDkgKyBNYXRoLmZsb29yKHllYXIgLyAxMCkgKiAxMDsKICBfZGF0ZS5zZXRGdWxsWWVhcihkZWNhZGUsIDExLCAzMSk7CiAgX2RhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIGVuZE9mRGVjYWRlX2RlZmF1bHQ7CnZhciBpbml0X2VuZE9mRGVjYWRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mRGVjYWRlLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBlbmRPZkRlY2FkZV9kZWZhdWx0ID0gZW5kT2ZEZWNhZGU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZIb3VyLmpzCmZ1bmN0aW9uIGVuZE9mSG91cihkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIF9kYXRlLnNldE1pbnV0ZXMoNTksIDU5LCA5OTkpOwogIHJldHVybiBfZGF0ZTsKfQp2YXIgZW5kT2ZIb3VyX2RlZmF1bHQ7CnZhciBpbml0X2VuZE9mSG91ciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZkhvdXIuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGVuZE9mSG91cl9kZWZhdWx0ID0gZW5kT2ZIb3VyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mV2Vlay5qcwpmdW5jdGlvbiBlbmRPZldlZWsoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRlZmF1bHRPcHRpb25zMiA9IGdldERlZmF1bHRPcHRpb25zKCk7CiAgY29uc3Qgd2Vla1N0YXJ0c09uID0gb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi53ZWVrU3RhcnRzT24gPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IDA7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGRheSA9IF9kYXRlLmdldERheSgpOwogIGNvbnN0IGRpZmYgPSAoZGF5IDwgd2Vla1N0YXJ0c09uID8gLTcgOiAwKSArIDYgLSAoZGF5IC0gd2Vla1N0YXJ0c09uKTsKICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSArIGRpZmYpOwogIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBlbmRPZldlZWtfZGVmYXVsdDsKdmFyIGluaXRfZW5kT2ZXZWVrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mV2Vlay5qcyIoKSB7CiAgICBpbml0X2RlZmF1bHRPcHRpb25zKCk7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZW5kT2ZXZWVrX2RlZmF1bHQgPSBlbmRPZldlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZJU09XZWVrLmpzCmZ1bmN0aW9uIGVuZE9mSVNPV2VlayhkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGVuZE9mV2VlayhkYXRlLCB7IC4uLm9wdGlvbnMsIHdlZWtTdGFydHNPbjogMSB9KTsKfQp2YXIgZW5kT2ZJU09XZWVrX2RlZmF1bHQ7CnZhciBpbml0X2VuZE9mSVNPV2VlayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZklTT1dlZWsuanMiKCkgewogICAgaW5pdF9lbmRPZldlZWsoKTsKICAgIGVuZE9mSVNPV2Vla19kZWZhdWx0ID0gZW5kT2ZJU09XZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mSVNPV2Vla1llYXIuanMKZnVuY3Rpb24gZW5kT2ZJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgeWVhciA9IGdldElTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpOwogIGNvbnN0IGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApOwogIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDQpOwogIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgY29uc3QgX2RhdGUgPSBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyLCBvcHRpb25zKTsKICBfZGF0ZS5zZXRNaWxsaXNlY29uZHMoX2RhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgLSAxKTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIGVuZE9mSVNPV2Vla1llYXJfZGVmYXVsdDsKdmFyIGluaXRfZW5kT2ZJU09XZWVrWWVhciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZklTT1dlZWtZZWFyLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF9nZXRJU09XZWVrWWVhcigpOwogICAgaW5pdF9zdGFydE9mSVNPV2VlaygpOwogICAgZW5kT2ZJU09XZWVrWWVhcl9kZWZhdWx0ID0gZW5kT2ZJU09XZWVrWWVhcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZk1pbnV0ZS5qcwpmdW5jdGlvbiBlbmRPZk1pbnV0ZShkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIF9kYXRlLnNldFNlY29uZHMoNTksIDk5OSk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBlbmRPZk1pbnV0ZV9kZWZhdWx0Owp2YXIgaW5pdF9lbmRPZk1pbnV0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZk1pbnV0ZS5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZW5kT2ZNaW51dGVfZGVmYXVsdCA9IGVuZE9mTWludXRlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mUXVhcnRlci5qcwpmdW5jdGlvbiBlbmRPZlF1YXJ0ZXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBjdXJyZW50TW9udGggPSBfZGF0ZS5nZXRNb250aCgpOwogIGNvbnN0IG1vbnRoID0gY3VycmVudE1vbnRoIC0gY3VycmVudE1vbnRoICUgMyArIDM7CiAgX2RhdGUuc2V0TW9udGgobW9udGgsIDApOwogIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBlbmRPZlF1YXJ0ZXJfZGVmYXVsdDsKdmFyIGluaXRfZW5kT2ZRdWFydGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mUXVhcnRlci5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZW5kT2ZRdWFydGVyX2RlZmF1bHQgPSBlbmRPZlF1YXJ0ZXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZTZWNvbmQuanMKZnVuY3Rpb24gZW5kT2ZTZWNvbmQoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRNaWxsaXNlY29uZHMoOTk5KTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIGVuZE9mU2Vjb25kX2RlZmF1bHQ7CnZhciBpbml0X2VuZE9mU2Vjb25kID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mU2Vjb25kLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBlbmRPZlNlY29uZF9kZWZhdWx0ID0gZW5kT2ZTZWNvbmQ7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZUb2RheS5qcwpmdW5jdGlvbiBlbmRPZlRvZGF5KG9wdGlvbnMpIHsKICByZXR1cm4gZW5kT2ZEYXkoRGF0ZS5ub3coKSwgb3B0aW9ucyk7Cn0KdmFyIGVuZE9mVG9kYXlfZGVmYXVsdDsKdmFyIGluaXRfZW5kT2ZUb2RheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZlRvZGF5LmpzIigpIHsKICAgIGluaXRfZW5kT2ZEYXkoKTsKICAgIGVuZE9mVG9kYXlfZGVmYXVsdCA9IGVuZE9mVG9kYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZUb21vcnJvdy5qcwpmdW5jdGlvbiBlbmRPZlRvbW9ycm93KG9wdGlvbnMpIHsKICBjb25zdCBub3cyID0gY29uc3RydWN0Tm93KG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gbm93Mi5nZXRGdWxsWWVhcigpOwogIGNvbnN0IG1vbnRoID0gbm93Mi5nZXRNb250aCgpOwogIGNvbnN0IGRheSA9IG5vdzIuZ2V0RGF0ZSgpOwogIGNvbnN0IGRhdGUgPSBjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4pOwogIGRhdGUuc2V0RnVsbFllYXIoeWVhciwgbW9udGgsIGRheSArIDEpOwogIGRhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTsKICByZXR1cm4gb3B0aW9ucz8uaW4gPyBvcHRpb25zLmluKGRhdGUpIDogZGF0ZTsKfQp2YXIgZW5kT2ZUb21vcnJvd19kZWZhdWx0Owp2YXIgaW5pdF9lbmRPZlRvbW9ycm93ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mVG9tb3Jyb3cuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3ROb3coKTsKICAgIGVuZE9mVG9tb3Jyb3dfZGVmYXVsdCA9IGVuZE9mVG9tb3Jyb3c7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZZZXN0ZXJkYXkuanMKZnVuY3Rpb24gZW5kT2ZZZXN0ZXJkYXkob3B0aW9ucykgewogIGNvbnN0IG5vdzIgPSBjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4pOwogIGNvbnN0IGRhdGUgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluLCAwKTsKICBkYXRlLnNldEZ1bGxZZWFyKG5vdzIuZ2V0RnVsbFllYXIoKSwgbm93Mi5nZXRNb250aCgpLCBub3cyLmdldERhdGUoKSAtIDEpOwogIGRhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTsKICByZXR1cm4gZGF0ZTsKfQp2YXIgZW5kT2ZZZXN0ZXJkYXlfZGVmYXVsdDsKdmFyIGluaXRfZW5kT2ZZZXN0ZXJkYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZZZXN0ZXJkYXkuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X2NvbnN0cnVjdE5vdygpOwogICAgZW5kT2ZZZXN0ZXJkYXlfZGVmYXVsdCA9IGVuZE9mWWVzdGVyZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlLmpzCnZhciBmb3JtYXREaXN0YW5jZUxvY2FsZSwgZm9ybWF0RGlzdGFuY2U7CnZhciBpbml0X2Zvcm1hdERpc3RhbmNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlLmpzIigpIHsKICAgIGZvcm1hdERpc3RhbmNlTG9jYWxlID0gewogICAgICBsZXNzVGhhblhTZWNvbmRzOiB7CiAgICAgICAgb25lOiAibGVzcyB0aGFuIGEgc2Vjb25kIiwKICAgICAgICBvdGhlcjogImxlc3MgdGhhbiB7e2NvdW50fX0gc2Vjb25kcyIKICAgICAgfSwKICAgICAgeFNlY29uZHM6IHsKICAgICAgICBvbmU6ICIxIHNlY29uZCIsCiAgICAgICAgb3RoZXI6ICJ7e2NvdW50fX0gc2Vjb25kcyIKICAgICAgfSwKICAgICAgaGFsZkFNaW51dGU6ICJoYWxmIGEgbWludXRlIiwKICAgICAgbGVzc1RoYW5YTWludXRlczogewogICAgICAgIG9uZTogImxlc3MgdGhhbiBhIG1pbnV0ZSIsCiAgICAgICAgb3RoZXI6ICJsZXNzIHRoYW4ge3tjb3VudH19IG1pbnV0ZXMiCiAgICAgIH0sCiAgICAgIHhNaW51dGVzOiB7CiAgICAgICAgb25lOiAiMSBtaW51dGUiLAogICAgICAgIG90aGVyOiAie3tjb3VudH19IG1pbnV0ZXMiCiAgICAgIH0sCiAgICAgIGFib3V0WEhvdXJzOiB7CiAgICAgICAgb25lOiAiYWJvdXQgMSBob3VyIiwKICAgICAgICBvdGhlcjogImFib3V0IHt7Y291bnR9fSBob3VycyIKICAgICAgfSwKICAgICAgeEhvdXJzOiB7CiAgICAgICAgb25lOiAiMSBob3VyIiwKICAgICAgICBvdGhlcjogInt7Y291bnR9fSBob3VycyIKICAgICAgfSwKICAgICAgeERheXM6IHsKICAgICAgICBvbmU6ICIxIGRheSIsCiAgICAgICAgb3RoZXI6ICJ7e2NvdW50fX0gZGF5cyIKICAgICAgfSwKICAgICAgYWJvdXRYV2Vla3M6IHsKICAgICAgICBvbmU6ICJhYm91dCAxIHdlZWsiLAogICAgICAgIG90aGVyOiAiYWJvdXQge3tjb3VudH19IHdlZWtzIgogICAgICB9LAogICAgICB4V2Vla3M6IHsKICAgICAgICBvbmU6ICIxIHdlZWsiLAogICAgICAgIG90aGVyOiAie3tjb3VudH19IHdlZWtzIgogICAgICB9LAogICAgICBhYm91dFhNb250aHM6IHsKICAgICAgICBvbmU6ICJhYm91dCAxIG1vbnRoIiwKICAgICAgICBvdGhlcjogImFib3V0IHt7Y291bnR9fSBtb250aHMiCiAgICAgIH0sCiAgICAgIHhNb250aHM6IHsKICAgICAgICBvbmU6ICIxIG1vbnRoIiwKICAgICAgICBvdGhlcjogInt7Y291bnR9fSBtb250aHMiCiAgICAgIH0sCiAgICAgIGFib3V0WFllYXJzOiB7CiAgICAgICAgb25lOiAiYWJvdXQgMSB5ZWFyIiwKICAgICAgICBvdGhlcjogImFib3V0IHt7Y291bnR9fSB5ZWFycyIKICAgICAgfSwKICAgICAgeFllYXJzOiB7CiAgICAgICAgb25lOiAiMSB5ZWFyIiwKICAgICAgICBvdGhlcjogInt7Y291bnR9fSB5ZWFycyIKICAgICAgfSwKICAgICAgb3ZlclhZZWFyczogewogICAgICAgIG9uZTogIm92ZXIgMSB5ZWFyIiwKICAgICAgICBvdGhlcjogIm92ZXIge3tjb3VudH19IHllYXJzIgogICAgICB9LAogICAgICBhbG1vc3RYWWVhcnM6IHsKICAgICAgICBvbmU6ICJhbG1vc3QgMSB5ZWFyIiwKICAgICAgICBvdGhlcjogImFsbW9zdCB7e2NvdW50fX0geWVhcnMiCiAgICAgIH0KICAgIH07CiAgICBmb3JtYXREaXN0YW5jZSA9ICh0b2tlbiwgY291bnQyLCBvcHRpb25zKSA9PiB7CiAgICAgIGxldCByZXN1bHQ7CiAgICAgIGNvbnN0IHRva2VuVmFsdWUgPSBmb3JtYXREaXN0YW5jZUxvY2FsZVt0b2tlbl07CiAgICAgIGlmICh0eXBlb2YgdG9rZW5WYWx1ZSA9PT0gInN0cmluZyIpIHsKICAgICAgICByZXN1bHQgPSB0b2tlblZhbHVlOwogICAgICB9IGVsc2UgaWYgKGNvdW50MiA9PT0gMSkgewogICAgICAgIHJlc3VsdCA9IHRva2VuVmFsdWUub25lOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdCA9IHRva2VuVmFsdWUub3RoZXIucmVwbGFjZSgie3tjb3VudH19IiwgY291bnQyLnRvU3RyaW5nKCkpOwogICAgICB9CiAgICAgIGlmIChvcHRpb25zPy5hZGRTdWZmaXgpIHsKICAgICAgICBpZiAob3B0aW9ucy5jb21wYXJpc29uICYmIG9wdGlvbnMuY29tcGFyaXNvbiA+IDApIHsKICAgICAgICAgIHJldHVybiAiaW4gIiArIHJlc3VsdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHJlc3VsdCArICIgYWdvIjsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRGb3JtYXRMb25nRm4uanMKZnVuY3Rpb24gYnVpbGRGb3JtYXRMb25nRm4oYXJncykgewogIHJldHVybiAob3B0aW9ucyA9IHt9KSA9PiB7CiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBhcmdzLmRlZmF1bHRXaWR0aDsKICAgIGNvbnN0IGZvcm1hdDIgPSBhcmdzLmZvcm1hdHNbd2lkdGhdIHx8IGFyZ3MuZm9ybWF0c1thcmdzLmRlZmF1bHRXaWR0aF07CiAgICByZXR1cm4gZm9ybWF0MjsKICB9Owp9CnZhciBpbml0X2J1aWxkRm9ybWF0TG9uZ0ZuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXRMb25nLmpzCnZhciBkYXRlRm9ybWF0cywgdGltZUZvcm1hdHMsIGRhdGVUaW1lRm9ybWF0cywgZm9ybWF0TG9uZzsKdmFyIGluaXRfZm9ybWF0TG9uZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXRMb25nLmpzIigpIHsKICAgIGluaXRfYnVpbGRGb3JtYXRMb25nRm4oKTsKICAgIGRhdGVGb3JtYXRzID0gewogICAgICBmdWxsOiAiRUVFRSwgTU1NTSBkbywgeSIsCiAgICAgIGxvbmc6ICJNTU1NIGRvLCB5IiwKICAgICAgbWVkaXVtOiAiTU1NIGQsIHkiLAogICAgICBzaG9ydDogIk1NL2RkL3l5eXkiCiAgICB9OwogICAgdGltZUZvcm1hdHMgPSB7CiAgICAgIGZ1bGw6ICJoOm1tOnNzIGEgenp6eiIsCiAgICAgIGxvbmc6ICJoOm1tOnNzIGEgeiIsCiAgICAgIG1lZGl1bTogImg6bW06c3MgYSIsCiAgICAgIHNob3J0OiAiaDptbSBhIgogICAgfTsKICAgIGRhdGVUaW1lRm9ybWF0cyA9IHsKICAgICAgZnVsbDogInt7ZGF0ZX19ICdhdCcge3t0aW1lfX0iLAogICAgICBsb25nOiAie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fSIsCiAgICAgIG1lZGl1bTogInt7ZGF0ZX19LCB7e3RpbWV9fSIsCiAgICAgIHNob3J0OiAie3tkYXRlfX0sIHt7dGltZX19IgogICAgfTsKICAgIGZvcm1hdExvbmcgPSB7CiAgICAgIGRhdGU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHsKICAgICAgICBmb3JtYXRzOiBkYXRlRm9ybWF0cywKICAgICAgICBkZWZhdWx0V2lkdGg6ICJmdWxsIgogICAgICB9KSwKICAgICAgdGltZTogYnVpbGRGb3JtYXRMb25nRm4oewogICAgICAgIGZvcm1hdHM6IHRpbWVGb3JtYXRzLAogICAgICAgIGRlZmF1bHRXaWR0aDogImZ1bGwiCiAgICAgIH0pLAogICAgICBkYXRlVGltZTogYnVpbGRGb3JtYXRMb25nRm4oewogICAgICAgIGZvcm1hdHM6IGRhdGVUaW1lRm9ybWF0cywKICAgICAgICBkZWZhdWx0V2lkdGg6ICJmdWxsIgogICAgICB9KQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXRSZWxhdGl2ZS5qcwp2YXIgZm9ybWF0UmVsYXRpdmVMb2NhbGUsIGZvcm1hdFJlbGF0aXZlOwp2YXIgaW5pdF9mb3JtYXRSZWxhdGl2ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXRSZWxhdGl2ZS5qcyIoKSB7CiAgICBmb3JtYXRSZWxhdGl2ZUxvY2FsZSA9IHsKICAgICAgbGFzdFdlZWs6ICInbGFzdCcgZWVlZSAnYXQnIHAiLAogICAgICB5ZXN0ZXJkYXk6ICIneWVzdGVyZGF5IGF0JyBwIiwKICAgICAgdG9kYXk6ICIndG9kYXkgYXQnIHAiLAogICAgICB0b21vcnJvdzogIid0b21vcnJvdyBhdCcgcCIsCiAgICAgIG5leHRXZWVrOiAiZWVlZSAnYXQnIHAiLAogICAgICBvdGhlcjogIlAiCiAgICB9OwogICAgZm9ybWF0UmVsYXRpdmUgPSAodG9rZW4sIF9kYXRlLCBfYmFzZURhdGUsIF9vcHRpb25zKSA9PiBmb3JtYXRSZWxhdGl2ZUxvY2FsZVt0b2tlbl07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRMb2NhbGl6ZUZuLmpzCmZ1bmN0aW9uIGJ1aWxkTG9jYWxpemVGbihhcmdzKSB7CiAgcmV0dXJuICh2YWx1ZTIsIG9wdGlvbnMpID0+IHsKICAgIGNvbnN0IGNvbnRleHQyID0gb3B0aW9ucz8uY29udGV4dCA/IFN0cmluZyhvcHRpb25zLmNvbnRleHQpIDogInN0YW5kYWxvbmUiOwogICAgbGV0IHZhbHVlc0FycmF5OwogICAgaWYgKGNvbnRleHQyID09PSAiZm9ybWF0dGluZyIgJiYgYXJncy5mb3JtYXR0aW5nVmFsdWVzKSB7CiAgICAgIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGFyZ3MuZGVmYXVsdEZvcm1hdHRpbmdXaWR0aCB8fCBhcmdzLmRlZmF1bHRXaWR0aDsKICAgICAgY29uc3Qgd2lkdGggPSBvcHRpb25zPy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGRlZmF1bHRXaWR0aDsKICAgICAgdmFsdWVzQXJyYXkgPSBhcmdzLmZvcm1hdHRpbmdWYWx1ZXNbd2lkdGhdIHx8IGFyZ3MuZm9ybWF0dGluZ1ZhbHVlc1tkZWZhdWx0V2lkdGhdOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gYXJncy5kZWZhdWx0V2lkdGg7CiAgICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucz8ud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBhcmdzLmRlZmF1bHRXaWR0aDsKICAgICAgdmFsdWVzQXJyYXkgPSBhcmdzLnZhbHVlc1t3aWR0aF0gfHwgYXJncy52YWx1ZXNbZGVmYXVsdFdpZHRoXTsKICAgIH0KICAgIGNvbnN0IGluZGV4MiA9IGFyZ3MuYXJndW1lbnRDYWxsYmFjayA/IGFyZ3MuYXJndW1lbnRDYWxsYmFjayh2YWx1ZTIpIDogdmFsdWUyOwogICAgcmV0dXJuIHZhbHVlc0FycmF5W2luZGV4Ml07CiAgfTsKfQp2YXIgaW5pdF9idWlsZExvY2FsaXplRm4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRMb2NhbGl6ZUZuLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9sb2NhbGl6ZS5qcwp2YXIgZXJhVmFsdWVzLCBxdWFydGVyVmFsdWVzLCBtb250aFZhbHVlcywgZGF5VmFsdWVzLCBkYXlQZXJpb2RWYWx1ZXMsIGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMsIG9yZGluYWxOdW1iZXIsIGxvY2FsaXplOwp2YXIgaW5pdF9sb2NhbGl6ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9sb2NhbGl6ZS5qcyIoKSB7CiAgICBpbml0X2J1aWxkTG9jYWxpemVGbigpOwogICAgZXJhVmFsdWVzID0gewogICAgICBuYXJyb3c6IFsiQiIsICJBIl0sCiAgICAgIGFiYnJldmlhdGVkOiBbIkJDIiwgIkFEIl0sCiAgICAgIHdpZGU6IFsiQmVmb3JlIENocmlzdCIsICJBbm5vIERvbWluaSJdCiAgICB9OwogICAgcXVhcnRlclZhbHVlcyA9IHsKICAgICAgbmFycm93OiBbIjEiLCAiMiIsICIzIiwgIjQiXSwKICAgICAgYWJicmV2aWF0ZWQ6IFsiUTEiLCAiUTIiLCAiUTMiLCAiUTQiXSwKICAgICAgd2lkZTogWyIxc3QgcXVhcnRlciIsICIybmQgcXVhcnRlciIsICIzcmQgcXVhcnRlciIsICI0dGggcXVhcnRlciJdCiAgICB9OwogICAgbW9udGhWYWx1ZXMgPSB7CiAgICAgIG5hcnJvdzogWyJKIiwgIkYiLCAiTSIsICJBIiwgIk0iLCAiSiIsICJKIiwgIkEiLCAiUyIsICJPIiwgIk4iLCAiRCJdLAogICAgICBhYmJyZXZpYXRlZDogWwogICAgICAgICJKYW4iLAogICAgICAgICJGZWIiLAogICAgICAgICJNYXIiLAogICAgICAgICJBcHIiLAogICAgICAgICJNYXkiLAogICAgICAgICJKdW4iLAogICAgICAgICJKdWwiLAogICAgICAgICJBdWciLAogICAgICAgICJTZXAiLAogICAgICAgICJPY3QiLAogICAgICAgICJOb3YiLAogICAgICAgICJEZWMiCiAgICAgIF0sCiAgICAgIHdpZGU6IFsKICAgICAgICAiSmFudWFyeSIsCiAgICAgICAgIkZlYnJ1YXJ5IiwKICAgICAgICAiTWFyY2giLAogICAgICAgICJBcHJpbCIsCiAgICAgICAgIk1heSIsCiAgICAgICAgIkp1bmUiLAogICAgICAgICJKdWx5IiwKICAgICAgICAiQXVndXN0IiwKICAgICAgICAiU2VwdGVtYmVyIiwKICAgICAgICAiT2N0b2JlciIsCiAgICAgICAgIk5vdmVtYmVyIiwKICAgICAgICAiRGVjZW1iZXIiCiAgICAgIF0KICAgIH07CiAgICBkYXlWYWx1ZXMgPSB7CiAgICAgIG5hcnJvdzogWyJTIiwgIk0iLCAiVCIsICJXIiwgIlQiLCAiRiIsICJTIl0sCiAgICAgIHNob3J0OiBbIlN1IiwgIk1vIiwgIlR1IiwgIldlIiwgIlRoIiwgIkZyIiwgIlNhIl0sCiAgICAgIGFiYnJldmlhdGVkOiBbIlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCJdLAogICAgICB3aWRlOiBbCiAgICAgICAgIlN1bmRheSIsCiAgICAgICAgIk1vbmRheSIsCiAgICAgICAgIlR1ZXNkYXkiLAogICAgICAgICJXZWRuZXNkYXkiLAogICAgICAgICJUaHVyc2RheSIsCiAgICAgICAgIkZyaWRheSIsCiAgICAgICAgIlNhdHVyZGF5IgogICAgICBdCiAgICB9OwogICAgZGF5UGVyaW9kVmFsdWVzID0gewogICAgICBuYXJyb3c6IHsKICAgICAgICBhbTogImEiLAogICAgICAgIHBtOiAicCIsCiAgICAgICAgbWlkbmlnaHQ6ICJtaSIsCiAgICAgICAgbm9vbjogIm4iLAogICAgICAgIG1vcm5pbmc6ICJtb3JuaW5nIiwKICAgICAgICBhZnRlcm5vb246ICJhZnRlcm5vb24iLAogICAgICAgIGV2ZW5pbmc6ICJldmVuaW5nIiwKICAgICAgICBuaWdodDogIm5pZ2h0IgogICAgICB9LAogICAgICBhYmJyZXZpYXRlZDogewogICAgICAgIGFtOiAiQU0iLAogICAgICAgIHBtOiAiUE0iLAogICAgICAgIG1pZG5pZ2h0OiAibWlkbmlnaHQiLAogICAgICAgIG5vb246ICJub29uIiwKICAgICAgICBtb3JuaW5nOiAibW9ybmluZyIsCiAgICAgICAgYWZ0ZXJub29uOiAiYWZ0ZXJub29uIiwKICAgICAgICBldmVuaW5nOiAiZXZlbmluZyIsCiAgICAgICAgbmlnaHQ6ICJuaWdodCIKICAgICAgfSwKICAgICAgd2lkZTogewogICAgICAgIGFtOiAiYS5tLiIsCiAgICAgICAgcG06ICJwLm0uIiwKICAgICAgICBtaWRuaWdodDogIm1pZG5pZ2h0IiwKICAgICAgICBub29uOiAibm9vbiIsCiAgICAgICAgbW9ybmluZzogIm1vcm5pbmciLAogICAgICAgIGFmdGVybm9vbjogImFmdGVybm9vbiIsCiAgICAgICAgZXZlbmluZzogImV2ZW5pbmciLAogICAgICAgIG5pZ2h0OiAibmlnaHQiCiAgICAgIH0KICAgIH07CiAgICBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzID0gewogICAgICBuYXJyb3c6IHsKICAgICAgICBhbTogImEiLAogICAgICAgIHBtOiAicCIsCiAgICAgICAgbWlkbmlnaHQ6ICJtaSIsCiAgICAgICAgbm9vbjogIm4iLAogICAgICAgIG1vcm5pbmc6ICJpbiB0aGUgbW9ybmluZyIsCiAgICAgICAgYWZ0ZXJub29uOiAiaW4gdGhlIGFmdGVybm9vbiIsCiAgICAgICAgZXZlbmluZzogImluIHRoZSBldmVuaW5nIiwKICAgICAgICBuaWdodDogImF0IG5pZ2h0IgogICAgICB9LAogICAgICBhYmJyZXZpYXRlZDogewogICAgICAgIGFtOiAiQU0iLAogICAgICAgIHBtOiAiUE0iLAogICAgICAgIG1pZG5pZ2h0OiAibWlkbmlnaHQiLAogICAgICAgIG5vb246ICJub29uIiwKICAgICAgICBtb3JuaW5nOiAiaW4gdGhlIG1vcm5pbmciLAogICAgICAgIGFmdGVybm9vbjogImluIHRoZSBhZnRlcm5vb24iLAogICAgICAgIGV2ZW5pbmc6ICJpbiB0aGUgZXZlbmluZyIsCiAgICAgICAgbmlnaHQ6ICJhdCBuaWdodCIKICAgICAgfSwKICAgICAgd2lkZTogewogICAgICAgIGFtOiAiYS5tLiIsCiAgICAgICAgcG06ICJwLm0uIiwKICAgICAgICBtaWRuaWdodDogIm1pZG5pZ2h0IiwKICAgICAgICBub29uOiAibm9vbiIsCiAgICAgICAgbW9ybmluZzogImluIHRoZSBtb3JuaW5nIiwKICAgICAgICBhZnRlcm5vb246ICJpbiB0aGUgYWZ0ZXJub29uIiwKICAgICAgICBldmVuaW5nOiAiaW4gdGhlIGV2ZW5pbmciLAogICAgICAgIG5pZ2h0OiAiYXQgbmlnaHQiCiAgICAgIH0KICAgIH07CiAgICBvcmRpbmFsTnVtYmVyID0gKGRpcnR5TnVtYmVyLCBfb3B0aW9ucykgPT4gewogICAgICBjb25zdCBudW1iZXIyID0gTnVtYmVyKGRpcnR5TnVtYmVyKTsKICAgICAgY29uc3QgcmVtMTAwID0gbnVtYmVyMiAlIDEwMDsKICAgICAgaWYgKHJlbTEwMCA+IDIwIHx8IHJlbTEwMCA8IDEwKSB7CiAgICAgICAgc3dpdGNoIChyZW0xMDAgJSAxMCkgewogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICByZXR1cm4gbnVtYmVyMiArICJzdCI7CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIHJldHVybiBudW1iZXIyICsgIm5kIjsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgcmV0dXJuIG51bWJlcjIgKyAicmQiOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbnVtYmVyMiArICJ0aCI7CiAgICB9OwogICAgbG9jYWxpemUgPSB7CiAgICAgIG9yZGluYWxOdW1iZXIsCiAgICAgIGVyYTogYnVpbGRMb2NhbGl6ZUZuKHsKICAgICAgICB2YWx1ZXM6IGVyYVZhbHVlcywKICAgICAgICBkZWZhdWx0V2lkdGg6ICJ3aWRlIgogICAgICB9KSwKICAgICAgcXVhcnRlcjogYnVpbGRMb2NhbGl6ZUZuKHsKICAgICAgICB2YWx1ZXM6IHF1YXJ0ZXJWYWx1ZXMsCiAgICAgICAgZGVmYXVsdFdpZHRoOiAid2lkZSIsCiAgICAgICAgYXJndW1lbnRDYWxsYmFjazogKHF1YXJ0ZXIpID0+IHF1YXJ0ZXIgLSAxCiAgICAgIH0pLAogICAgICBtb250aDogYnVpbGRMb2NhbGl6ZUZuKHsKICAgICAgICB2YWx1ZXM6IG1vbnRoVmFsdWVzLAogICAgICAgIGRlZmF1bHRXaWR0aDogIndpZGUiCiAgICAgIH0pLAogICAgICBkYXk6IGJ1aWxkTG9jYWxpemVGbih7CiAgICAgICAgdmFsdWVzOiBkYXlWYWx1ZXMsCiAgICAgICAgZGVmYXVsdFdpZHRoOiAid2lkZSIKICAgICAgfSksCiAgICAgIGRheVBlcmlvZDogYnVpbGRMb2NhbGl6ZUZuKHsKICAgICAgICB2YWx1ZXM6IGRheVBlcmlvZFZhbHVlcywKICAgICAgICBkZWZhdWx0V2lkdGg6ICJ3aWRlIiwKICAgICAgICBmb3JtYXR0aW5nVmFsdWVzOiBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzLAogICAgICAgIGRlZmF1bHRGb3JtYXR0aW5nV2lkdGg6ICJ3aWRlIgogICAgICB9KQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZE1hdGNoRm4uanMKZnVuY3Rpb24gYnVpbGRNYXRjaEZuKGFyZ3MpIHsKICByZXR1cm4gKHN0cmluZzMsIG9wdGlvbnMgPSB7fSkgPT4gewogICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoOwogICAgY29uc3QgbWF0Y2hQYXR0ZXJuID0gd2lkdGggJiYgYXJncy5tYXRjaFBhdHRlcm5zW3dpZHRoXSB8fCBhcmdzLm1hdGNoUGF0dGVybnNbYXJncy5kZWZhdWx0TWF0Y2hXaWR0aF07CiAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHN0cmluZzMubWF0Y2gobWF0Y2hQYXR0ZXJuKTsKICAgIGlmICghbWF0Y2hSZXN1bHQpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07CiAgICBjb25zdCBwYXJzZVBhdHRlcm5zID0gd2lkdGggJiYgYXJncy5wYXJzZVBhdHRlcm5zW3dpZHRoXSB8fCBhcmdzLnBhcnNlUGF0dGVybnNbYXJncy5kZWZhdWx0UGFyc2VXaWR0aF07CiAgICBjb25zdCBrZXkyID0gQXJyYXkuaXNBcnJheShwYXJzZVBhdHRlcm5zKSA/IGZpbmRJbmRleDIocGFyc2VQYXR0ZXJucywgKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKSkgOiAoCiAgICAgIC8vIFtUT0RPXSAtLSBJIGNoYWxsZW5nZSB5b3UgdG8gZml4IHRoZSB0eXBlCiAgICAgIGZpbmRLZXkocGFyc2VQYXR0ZXJucywgKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKSkKICAgICk7CiAgICBsZXQgdmFsdWUyOwogICAgdmFsdWUyID0gYXJncy52YWx1ZUNhbGxiYWNrID8gYXJncy52YWx1ZUNhbGxiYWNrKGtleTIpIDoga2V5MjsKICAgIHZhbHVlMiA9IG9wdGlvbnMudmFsdWVDYWxsYmFjayA/ICgKICAgICAgLy8gW1RPRE9dIC0tIEkgY2hhbGxlbmdlIHlvdSB0byBmaXggdGhlIHR5cGUKICAgICAgb3B0aW9ucy52YWx1ZUNhbGxiYWNrKHZhbHVlMikKICAgICkgOiB2YWx1ZTI7CiAgICBjb25zdCByZXN0ID0gc3RyaW5nMy5zbGljZShtYXRjaGVkU3RyaW5nLmxlbmd0aCk7CiAgICByZXR1cm4geyB2YWx1ZTogdmFsdWUyLCByZXN0IH07CiAgfTsKfQpmdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgcHJlZGljYXRlKSB7CiAgZm9yIChjb25zdCBrZXkyIGluIG9iamVjdCkgewogICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleTIpICYmIHByZWRpY2F0ZShvYmplY3Rba2V5Ml0pKSB7CiAgICAgIHJldHVybiBrZXkyOwogICAgfQogIH0KICByZXR1cm4gdm9pZCAwOwp9CmZ1bmN0aW9uIGZpbmRJbmRleDIoYXJyYXksIHByZWRpY2F0ZSkgewogIGZvciAobGV0IGtleTIgPSAwOyBrZXkyIDwgYXJyYXkubGVuZ3RoOyBrZXkyKyspIHsKICAgIGlmIChwcmVkaWNhdGUoYXJyYXlba2V5Ml0pKSB7CiAgICAgIHJldHVybiBrZXkyOwogICAgfQogIH0KICByZXR1cm4gdm9pZCAwOwp9CnZhciBpbml0X2J1aWxkTWF0Y2hGbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZE1hdGNoRm4uanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4uanMKZnVuY3Rpb24gYnVpbGRNYXRjaFBhdHRlcm5GbihhcmdzKSB7CiAgcmV0dXJuIChzdHJpbmczLCBvcHRpb25zID0ge30pID0+IHsKICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gc3RyaW5nMy5tYXRjaChhcmdzLm1hdGNoUGF0dGVybik7CiAgICBpZiAoIW1hdGNoUmVzdWx0KSByZXR1cm4gbnVsbDsKICAgIGNvbnN0IG1hdGNoZWRTdHJpbmcgPSBtYXRjaFJlc3VsdFswXTsKICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gc3RyaW5nMy5tYXRjaChhcmdzLnBhcnNlUGF0dGVybik7CiAgICBpZiAoIXBhcnNlUmVzdWx0KSByZXR1cm4gbnVsbDsKICAgIGxldCB2YWx1ZTIgPSBhcmdzLnZhbHVlQ2FsbGJhY2sgPyBhcmdzLnZhbHVlQ2FsbGJhY2socGFyc2VSZXN1bHRbMF0pIDogcGFyc2VSZXN1bHRbMF07CiAgICB2YWx1ZTIgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2sgPyBvcHRpb25zLnZhbHVlQ2FsbGJhY2sodmFsdWUyKSA6IHZhbHVlMjsKICAgIGNvbnN0IHJlc3QgPSBzdHJpbmczLnNsaWNlKG1hdGNoZWRTdHJpbmcubGVuZ3RoKTsKICAgIHJldHVybiB7IHZhbHVlOiB2YWx1ZTIsIHJlc3QgfTsKICB9Owp9CnZhciBpbml0X2J1aWxkTWF0Y2hQYXR0ZXJuRm4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRNYXRjaFBhdHRlcm5Gbi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvbWF0Y2guanMKdmFyIG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4sIHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4sIG1hdGNoRXJhUGF0dGVybnMsIHBhcnNlRXJhUGF0dGVybnMsIG1hdGNoUXVhcnRlclBhdHRlcm5zLCBwYXJzZVF1YXJ0ZXJQYXR0ZXJucywgbWF0Y2hNb250aFBhdHRlcm5zLCBwYXJzZU1vbnRoUGF0dGVybnMsIG1hdGNoRGF5UGF0dGVybnMsIHBhcnNlRGF5UGF0dGVybnMsIG1hdGNoRGF5UGVyaW9kUGF0dGVybnMsIHBhcnNlRGF5UGVyaW9kUGF0dGVybnMsIG1hdGNoOwp2YXIgaW5pdF9tYXRjaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9tYXRjaC5qcyIoKSB7CiAgICBpbml0X2J1aWxkTWF0Y2hGbigpOwogICAgaW5pdF9idWlsZE1hdGNoUGF0dGVybkZuKCk7CiAgICBtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuID0gL14oXGQrKSh0aHxzdHxuZHxyZCk/L2k7CiAgICBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuID0gL1xkKy9pOwogICAgbWF0Y2hFcmFQYXR0ZXJucyA9IHsKICAgICAgbmFycm93OiAvXihifGEpL2ksCiAgICAgIGFiYnJldmlhdGVkOiAvXihiXC4/XHM/Y1wuP3xiXC4/XHM/Y1wuP1xzP2VcLj98YVwuP1xzP2RcLj98Y1wuP1xzP2VcLj8pL2ksCiAgICAgIHdpZGU6IC9eKGJlZm9yZSBjaHJpc3R8YmVmb3JlIGNvbW1vbiBlcmF8YW5ubyBkb21pbml8Y29tbW9uIGVyYSkvaQogICAgfTsKICAgIHBhcnNlRXJhUGF0dGVybnMgPSB7CiAgICAgIGFueTogWy9eYi9pLCAvXihhfGMpL2ldCiAgICB9OwogICAgbWF0Y2hRdWFydGVyUGF0dGVybnMgPSB7CiAgICAgIG5hcnJvdzogL15bMTIzNF0vaSwKICAgICAgYWJicmV2aWF0ZWQ6IC9ecVsxMjM0XS9pLAogICAgICB3aWRlOiAvXlsxMjM0XSh0aHxzdHxuZHxyZCk/IHF1YXJ0ZXIvaQogICAgfTsKICAgIHBhcnNlUXVhcnRlclBhdHRlcm5zID0gewogICAgICBhbnk6IFsvMS9pLCAvMi9pLCAvMy9pLCAvNC9pXQogICAgfTsKICAgIG1hdGNoTW9udGhQYXR0ZXJucyA9IHsKICAgICAgbmFycm93OiAvXltqZm1hc29uZF0vaSwKICAgICAgYWJicmV2aWF0ZWQ6IC9eKGphbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwfG9jdHxub3Z8ZGVjKS9pLAogICAgICB3aWRlOiAvXihqYW51YXJ5fGZlYnJ1YXJ5fG1hcmNofGFwcmlsfG1heXxqdW5lfGp1bHl8YXVndXN0fHNlcHRlbWJlcnxvY3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyKS9pCiAgICB9OwogICAgcGFyc2VNb250aFBhdHRlcm5zID0gewogICAgICBuYXJyb3c6IFsKICAgICAgICAvXmovaSwKICAgICAgICAvXmYvaSwKICAgICAgICAvXm0vaSwKICAgICAgICAvXmEvaSwKICAgICAgICAvXm0vaSwKICAgICAgICAvXmovaSwKICAgICAgICAvXmovaSwKICAgICAgICAvXmEvaSwKICAgICAgICAvXnMvaSwKICAgICAgICAvXm8vaSwKICAgICAgICAvXm4vaSwKICAgICAgICAvXmQvaQogICAgICBdLAogICAgICBhbnk6IFsKICAgICAgICAvXmphL2ksCiAgICAgICAgL15mL2ksCiAgICAgICAgL15tYXIvaSwKICAgICAgICAvXmFwL2ksCiAgICAgICAgL15tYXkvaSwKICAgICAgICAvXmp1bi9pLAogICAgICAgIC9eanVsL2ksCiAgICAgICAgL15hdS9pLAogICAgICAgIC9ecy9pLAogICAgICAgIC9eby9pLAogICAgICAgIC9ebi9pLAogICAgICAgIC9eZC9pCiAgICAgIF0KICAgIH07CiAgICBtYXRjaERheVBhdHRlcm5zID0gewogICAgICBuYXJyb3c6IC9eW3NtdHdmXS9pLAogICAgICBzaG9ydDogL14oc3V8bW98dHV8d2V8dGh8ZnJ8c2EpL2ksCiAgICAgIGFiYnJldmlhdGVkOiAvXihzdW58bW9ufHR1ZXx3ZWR8dGh1fGZyaXxzYXQpL2ksCiAgICAgIHdpZGU6IC9eKHN1bmRheXxtb25kYXl8dHVlc2RheXx3ZWRuZXNkYXl8dGh1cnNkYXl8ZnJpZGF5fHNhdHVyZGF5KS9pCiAgICB9OwogICAgcGFyc2VEYXlQYXR0ZXJucyA9IHsKICAgICAgbmFycm93OiBbL15zL2ksIC9ebS9pLCAvXnQvaSwgL153L2ksIC9edC9pLCAvXmYvaSwgL15zL2ldLAogICAgICBhbnk6IFsvXnN1L2ksIC9ebS9pLCAvXnR1L2ksIC9edy9pLCAvXnRoL2ksIC9eZi9pLCAvXnNhL2ldCiAgICB9OwogICAgbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyA9IHsKICAgICAgbmFycm93OiAvXihhfHB8bWl8bnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksCiAgICAgIGFueTogL14oW2FwXVwuP1xzP21cLj98bWlkbmlnaHR8bm9vbnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2kKICAgIH07CiAgICBwYXJzZURheVBlcmlvZFBhdHRlcm5zID0gewogICAgICBhbnk6IHsKICAgICAgICBhbTogL15hL2ksCiAgICAgICAgcG06IC9ecC9pLAogICAgICAgIG1pZG5pZ2h0OiAvXm1pL2ksCiAgICAgICAgbm9vbjogL15uby9pLAogICAgICAgIG1vcm5pbmc6IC9tb3JuaW5nL2ksCiAgICAgICAgYWZ0ZXJub29uOiAvYWZ0ZXJub29uL2ksCiAgICAgICAgZXZlbmluZzogL2V2ZW5pbmcvaSwKICAgICAgICBuaWdodDogL25pZ2h0L2kKICAgICAgfQogICAgfTsKICAgIG1hdGNoID0gewogICAgICBvcmRpbmFsTnVtYmVyOiBidWlsZE1hdGNoUGF0dGVybkZuKHsKICAgICAgICBtYXRjaFBhdHRlcm46IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4sCiAgICAgICAgcGFyc2VQYXR0ZXJuOiBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuLAogICAgICAgIHZhbHVlQ2FsbGJhY2s6ICh2YWx1ZTIpID0+IHBhcnNlSW50KHZhbHVlMiwgMTApCiAgICAgIH0pLAogICAgICBlcmE6IGJ1aWxkTWF0Y2hGbih7CiAgICAgICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hFcmFQYXR0ZXJucywKICAgICAgICBkZWZhdWx0TWF0Y2hXaWR0aDogIndpZGUiLAogICAgICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRXJhUGF0dGVybnMsCiAgICAgICAgZGVmYXVsdFBhcnNlV2lkdGg6ICJhbnkiCiAgICAgIH0pLAogICAgICBxdWFydGVyOiBidWlsZE1hdGNoRm4oewogICAgICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoUXVhcnRlclBhdHRlcm5zLAogICAgICAgIGRlZmF1bHRNYXRjaFdpZHRoOiAid2lkZSIsCiAgICAgICAgcGFyc2VQYXR0ZXJuczogcGFyc2VRdWFydGVyUGF0dGVybnMsCiAgICAgICAgZGVmYXVsdFBhcnNlV2lkdGg6ICJhbnkiLAogICAgICAgIHZhbHVlQ2FsbGJhY2s6IChpbmRleDIpID0+IGluZGV4MiArIDEKICAgICAgfSksCiAgICAgIG1vbnRoOiBidWlsZE1hdGNoRm4oewogICAgICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoTW9udGhQYXR0ZXJucywKICAgICAgICBkZWZhdWx0TWF0Y2hXaWR0aDogIndpZGUiLAogICAgICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlTW9udGhQYXR0ZXJucywKICAgICAgICBkZWZhdWx0UGFyc2VXaWR0aDogImFueSIKICAgICAgfSksCiAgICAgIGRheTogYnVpbGRNYXRjaEZuKHsKICAgICAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBhdHRlcm5zLAogICAgICAgIGRlZmF1bHRNYXRjaFdpZHRoOiAid2lkZSIsCiAgICAgICAgcGFyc2VQYXR0ZXJuczogcGFyc2VEYXlQYXR0ZXJucywKICAgICAgICBkZWZhdWx0UGFyc2VXaWR0aDogImFueSIKICAgICAgfSksCiAgICAgIGRheVBlcmlvZDogYnVpbGRNYXRjaEZuKHsKICAgICAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBlcmlvZFBhdHRlcm5zLAogICAgICAgIGRlZmF1bHRNYXRjaFdpZHRoOiAiYW55IiwKICAgICAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBlcmlvZFBhdHRlcm5zLAogICAgICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAiYW55IgogICAgICB9KQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMuanMKdmFyIGVuVVMsIGVuX1VTX2RlZmF1bHQ7CnZhciBpbml0X2VuX1VTID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy5qcyIoKSB7CiAgICBpbml0X2Zvcm1hdERpc3RhbmNlKCk7CiAgICBpbml0X2Zvcm1hdExvbmcoKTsKICAgIGluaXRfZm9ybWF0UmVsYXRpdmUoKTsKICAgIGluaXRfbG9jYWxpemUoKTsKICAgIGluaXRfbWF0Y2goKTsKICAgIGVuVVMgPSB7CiAgICAgIGNvZGU6ICJlbi1VUyIsCiAgICAgIGZvcm1hdERpc3RhbmNlLAogICAgICBmb3JtYXRMb25nLAogICAgICBmb3JtYXRSZWxhdGl2ZSwKICAgICAgbG9jYWxpemUsCiAgICAgIG1hdGNoLAogICAgICBvcHRpb25zOiB7CiAgICAgICAgd2Vla1N0YXJ0c09uOiAwLAogICAgICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogMQogICAgICB9CiAgICB9OwogICAgZW5fVVNfZGVmYXVsdCA9IGVuVVM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9kZWZhdWx0TG9jYWxlLmpzCnZhciBpbml0X2RlZmF1bHRMb2NhbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9kZWZhdWx0TG9jYWxlLmpzIigpIHsKICAgIGluaXRfZW5fVVMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREYXlPZlllYXIuanMKZnVuY3Rpb24gZ2V0RGF5T2ZZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgZGlmZiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhfZGF0ZSwgc3RhcnRPZlllYXIoX2RhdGUpKTsKICBjb25zdCBkYXlPZlllYXIgPSBkaWZmICsgMTsKICByZXR1cm4gZGF5T2ZZZWFyOwp9CnZhciBnZXREYXlPZlllYXJfZGVmYXVsdDsKdmFyIGluaXRfZ2V0RGF5T2ZZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERheU9mWWVhci5qcyIoKSB7CiAgICBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cygpOwogICAgaW5pdF9zdGFydE9mWWVhcigpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGdldERheU9mWWVhcl9kZWZhdWx0ID0gZ2V0RGF5T2ZZZWFyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT1dlZWsuanMKZnVuY3Rpb24gZ2V0SVNPV2VlayhkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGRpZmYgPSArc3RhcnRPZklTT1dlZWsoX2RhdGUpIC0gK3N0YXJ0T2ZJU09XZWVrWWVhcihfZGF0ZSk7CiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIG1pbGxpc2Vjb25kc0luV2VlaykgKyAxOwp9CnZhciBnZXRJU09XZWVrX2RlZmF1bHQ7CnZhciBpbml0X2dldElTT1dlZWsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SVNPV2Vlay5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgaW5pdF9zdGFydE9mSVNPV2VlaygpOwogICAgaW5pdF9zdGFydE9mSVNPV2Vla1llYXIoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBnZXRJU09XZWVrX2RlZmF1bHQgPSBnZXRJU09XZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFdlZWtZZWFyLmpzCmZ1bmN0aW9uIGdldFdlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCBmaXJzdFdlZWtDb250YWluc0RhdGUgPSBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gZGVmYXVsdE9wdGlvbnMyLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gMTsKICBjb25zdCBmaXJzdFdlZWtPZk5leHRZZWFyID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTsKICBmaXJzdFdlZWtPZk5leHRZZWFyLnNldEZ1bGxZZWFyKHllYXIgKyAxLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpOwogIGZpcnN0V2Vla09mTmV4dFllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgY29uc3Qgc3RhcnRPZk5leHRZZWFyID0gc3RhcnRPZldlZWsoZmlyc3RXZWVrT2ZOZXh0WWVhciwgb3B0aW9ucyk7CiAgY29uc3QgZmlyc3RXZWVrT2ZUaGlzWWVhciA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgMCk7CiAgZmlyc3RXZWVrT2ZUaGlzWWVhci5zZXRGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpOwogIGZpcnN0V2Vla09mVGhpc1llYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgY29uc3Qgc3RhcnRPZlRoaXNZZWFyID0gc3RhcnRPZldlZWsoZmlyc3RXZWVrT2ZUaGlzWWVhciwgb3B0aW9ucyk7CiAgaWYgKCtfZGF0ZSA+PSArc3RhcnRPZk5leHRZZWFyKSB7CiAgICByZXR1cm4geWVhciArIDE7CiAgfSBlbHNlIGlmICgrX2RhdGUgPj0gK3N0YXJ0T2ZUaGlzWWVhcikgewogICAgcmV0dXJuIHllYXI7CiAgfSBlbHNlIHsKICAgIHJldHVybiB5ZWFyIC0gMTsKICB9Cn0KdmFyIGdldFdlZWtZZWFyX2RlZmF1bHQ7CnZhciBpbml0X2dldFdlZWtZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFdlZWtZZWFyLmpzIigpIHsKICAgIGluaXRfZGVmYXVsdE9wdGlvbnMoKTsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF9zdGFydE9mV2VlaygpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGdldFdlZWtZZWFyX2RlZmF1bHQgPSBnZXRXZWVrWWVhcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mV2Vla1llYXIuanMKZnVuY3Rpb24gc3RhcnRPZldlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBkZWZhdWx0T3B0aW9uczIuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyAxOwogIGNvbnN0IHllYXIgPSBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKTsKICBjb25zdCBmaXJzdFdlZWsgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApOwogIGZpcnN0V2Vlay5zZXRGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpOwogIGZpcnN0V2Vlay5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBjb25zdCBfZGF0ZSA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vlaywgb3B0aW9ucyk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBzdGFydE9mV2Vla1llYXJfZGVmYXVsdDsKdmFyIGluaXRfc3RhcnRPZldlZWtZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZXZWVrWWVhci5qcyIoKSB7CiAgICBpbml0X2RlZmF1bHRPcHRpb25zKCk7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfZ2V0V2Vla1llYXIoKTsKICAgIGluaXRfc3RhcnRPZldlZWsoKTsKICAgIHN0YXJ0T2ZXZWVrWWVhcl9kZWZhdWx0ID0gc3RhcnRPZldlZWtZZWFyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFdlZWsuanMKZnVuY3Rpb24gZ2V0V2VlayhkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGRpZmYgPSArc3RhcnRPZldlZWsoX2RhdGUsIG9wdGlvbnMpIC0gK3N0YXJ0T2ZXZWVrWWVhcihfZGF0ZSwgb3B0aW9ucyk7CiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIG1pbGxpc2Vjb25kc0luV2VlaykgKyAxOwp9CnZhciBnZXRXZWVrX2RlZmF1bHQ7CnZhciBpbml0X2dldFdlZWsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0V2Vlay5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgaW5pdF9zdGFydE9mV2VlaygpOwogICAgaW5pdF9zdGFydE9mV2Vla1llYXIoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBnZXRXZWVrX2RlZmF1bHQgPSBnZXRXZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvYWRkTGVhZGluZ1plcm9zLmpzCmZ1bmN0aW9uIGFkZExlYWRpbmdaZXJvcyhudW1iZXIyLCB0YXJnZXRMZW5ndGgpIHsKICBjb25zdCBzaWduID0gbnVtYmVyMiA8IDAgPyAiLSIgOiAiIjsKICBjb25zdCBvdXRwdXQgPSBNYXRoLmFicyhudW1iZXIyKS50b1N0cmluZygpLnBhZFN0YXJ0KHRhcmdldExlbmd0aCwgIjAiKTsKICByZXR1cm4gc2lnbiArIG91dHB1dDsKfQp2YXIgaW5pdF9hZGRMZWFkaW5nWmVyb3MgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9hZGRMZWFkaW5nWmVyb3MuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZm9ybWF0L2xpZ2h0Rm9ybWF0dGVycy5qcwp2YXIgbGlnaHRGb3JtYXR0ZXJzOwp2YXIgaW5pdF9saWdodEZvcm1hdHRlcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9mb3JtYXQvbGlnaHRGb3JtYXR0ZXJzLmpzIigpIHsKICAgIGluaXRfYWRkTGVhZGluZ1plcm9zKCk7CiAgICBsaWdodEZvcm1hdHRlcnMgPSB7CiAgICAgIC8vIFllYXIKICAgICAgeShkYXRlLCB0b2tlbikgewogICAgICAgIGNvbnN0IHNpZ25lZFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CiAgICAgICAgY29uc3QgeWVhciA9IHNpZ25lZFllYXIgPiAwID8gc2lnbmVkWWVhciA6IDEgLSBzaWduZWRZZWFyOwogICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3ModG9rZW4gPT09ICJ5eSIgPyB5ZWFyICUgMTAwIDogeWVhciwgdG9rZW4ubGVuZ3RoKTsKICAgICAgfSwKICAgICAgLy8gTW9udGgKICAgICAgTShkYXRlLCB0b2tlbikgewogICAgICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpOwogICAgICAgIHJldHVybiB0b2tlbiA9PT0gIk0iID8gU3RyaW5nKG1vbnRoICsgMSkgOiBhZGRMZWFkaW5nWmVyb3MobW9udGggKyAxLCAyKTsKICAgICAgfSwKICAgICAgLy8gRGF5IG9mIHRoZSBtb250aAogICAgICBkKGRhdGUsIHRva2VuKSB7CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldERhdGUoKSwgdG9rZW4ubGVuZ3RoKTsKICAgICAgfSwKICAgICAgLy8gQU0gb3IgUE0KICAgICAgYShkYXRlLCB0b2tlbikgewogICAgICAgIGNvbnN0IGRheVBlcmlvZEVudW1WYWx1ZSA9IGRhdGUuZ2V0SG91cnMoKSAvIDEyID49IDEgPyAicG0iIDogImFtIjsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICBjYXNlICJhIjoKICAgICAgICAgIGNhc2UgImFhIjoKICAgICAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgY2FzZSAiYWFhIjoKICAgICAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZTsKICAgICAgICAgIGNhc2UgImFhYWFhIjoKICAgICAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZVswXTsKICAgICAgICAgIGNhc2UgImFhYWEiOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZSA9PT0gImFtIiA/ICJhLm0uIiA6ICJwLm0uIjsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIEhvdXIgWzEtMTJdCiAgICAgIGgoZGF0ZSwgdG9rZW4pIHsKICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0SG91cnMoKSAlIDEyIHx8IDEyLCB0b2tlbi5sZW5ndGgpOwogICAgICB9LAogICAgICAvLyBIb3VyIFswLTIzXQogICAgICBIKGRhdGUsIHRva2VuKSB7CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldEhvdXJzKCksIHRva2VuLmxlbmd0aCk7CiAgICAgIH0sCiAgICAgIC8vIE1pbnV0ZQogICAgICBtKGRhdGUsIHRva2VuKSB7CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldE1pbnV0ZXMoKSwgdG9rZW4ubGVuZ3RoKTsKICAgICAgfSwKICAgICAgLy8gU2Vjb25kCiAgICAgIHMoZGF0ZSwgdG9rZW4pIHsKICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0U2Vjb25kcygpLCB0b2tlbi5sZW5ndGgpOwogICAgICB9LAogICAgICAvLyBGcmFjdGlvbiBvZiBzZWNvbmQKICAgICAgUyhkYXRlLCB0b2tlbikgewogICAgICAgIGNvbnN0IG51bWJlck9mRGlnaXRzID0gdG9rZW4ubGVuZ3RoOwogICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kczIgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpOwogICAgICAgIGNvbnN0IGZyYWN0aW9uYWxTZWNvbmRzID0gTWF0aC50cnVuYygKICAgICAgICAgIG1pbGxpc2Vjb25kczIgKiBNYXRoLnBvdygxMCwgbnVtYmVyT2ZEaWdpdHMgLSAzKQogICAgICAgICk7CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhmcmFjdGlvbmFsU2Vjb25kcywgdG9rZW4ubGVuZ3RoKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2Zvcm1hdC9mb3JtYXR0ZXJzLmpzCmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lU2hvcnQob2Zmc2V0LCBkZWxpbWl0ZXIgPSAiIikgewogIGNvbnN0IHNpZ24gPSBvZmZzZXQgPiAwID8gIi0iIDogIisiOwogIGNvbnN0IGFic09mZnNldCA9IE1hdGguYWJzKG9mZnNldCk7CiAgY29uc3QgaG91cnMgPSBNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKTsKICBjb25zdCBtaW51dGVzID0gYWJzT2Zmc2V0ICUgNjA7CiAgaWYgKG1pbnV0ZXMgPT09IDApIHsKICAgIHJldHVybiBzaWduICsgU3RyaW5nKGhvdXJzKTsKICB9CiAgcmV0dXJuIHNpZ24gKyBTdHJpbmcoaG91cnMpICsgZGVsaW1pdGVyICsgYWRkTGVhZGluZ1plcm9zKG1pbnV0ZXMsIDIpOwp9CmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyhvZmZzZXQsIGRlbGltaXRlcikgewogIGlmIChvZmZzZXQgJSA2MCA9PT0gMCkgewogICAgY29uc3Qgc2lnbiA9IG9mZnNldCA+IDAgPyAiLSIgOiAiKyI7CiAgICByZXR1cm4gc2lnbiArIGFkZExlYWRpbmdaZXJvcyhNYXRoLmFicyhvZmZzZXQpIC8gNjAsIDIpOwogIH0KICByZXR1cm4gZm9ybWF0VGltZXpvbmUob2Zmc2V0LCBkZWxpbWl0ZXIpOwp9CmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lKG9mZnNldCwgZGVsaW1pdGVyID0gIiIpIHsKICBjb25zdCBzaWduID0gb2Zmc2V0ID4gMCA/ICItIiA6ICIrIjsKICBjb25zdCBhYnNPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpOwogIGNvbnN0IGhvdXJzID0gYWRkTGVhZGluZ1plcm9zKE1hdGgudHJ1bmMoYWJzT2Zmc2V0IC8gNjApLCAyKTsKICBjb25zdCBtaW51dGVzID0gYWRkTGVhZGluZ1plcm9zKGFic09mZnNldCAlIDYwLCAyKTsKICByZXR1cm4gc2lnbiArIGhvdXJzICsgZGVsaW1pdGVyICsgbWludXRlczsKfQp2YXIgZGF5UGVyaW9kRW51bSwgZm9ybWF0dGVyczsKdmFyIGluaXRfZm9ybWF0dGVycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2Zvcm1hdC9mb3JtYXR0ZXJzLmpzIigpIHsKICAgIGluaXRfZ2V0RGF5T2ZZZWFyKCk7CiAgICBpbml0X2dldElTT1dlZWsoKTsKICAgIGluaXRfZ2V0SVNPV2Vla1llYXIoKTsKICAgIGluaXRfZ2V0V2VlaygpOwogICAgaW5pdF9nZXRXZWVrWWVhcigpOwogICAgaW5pdF9hZGRMZWFkaW5nWmVyb3MoKTsKICAgIGluaXRfbGlnaHRGb3JtYXR0ZXJzKCk7CiAgICBkYXlQZXJpb2RFbnVtID0gewogICAgICBhbTogImFtIiwKICAgICAgcG06ICJwbSIsCiAgICAgIG1pZG5pZ2h0OiAibWlkbmlnaHQiLAogICAgICBub29uOiAibm9vbiIsCiAgICAgIG1vcm5pbmc6ICJtb3JuaW5nIiwKICAgICAgYWZ0ZXJub29uOiAiYWZ0ZXJub29uIiwKICAgICAgZXZlbmluZzogImV2ZW5pbmciLAogICAgICBuaWdodDogIm5pZ2h0IgogICAgfTsKICAgIGZvcm1hdHRlcnMgPSB7CiAgICAgIC8vIEVyYQogICAgICBHOiBmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICAgICAgY29uc3QgZXJhID0gZGF0ZS5nZXRGdWxsWWVhcigpID4gMCA/IDEgOiAwOwogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIC8vIEFELCBCQwogICAgICAgICAgY2FzZSAiRyI6CiAgICAgICAgICBjYXNlICJHRyI6CiAgICAgICAgICBjYXNlICJHR0ciOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmVyYShlcmEsIHsgd2lkdGg6ICJhYmJyZXZpYXRlZCIgfSk7CiAgICAgICAgICAvLyBBLCBCCiAgICAgICAgICBjYXNlICJHR0dHRyI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZXJhKGVyYSwgeyB3aWR0aDogIm5hcnJvdyIgfSk7CiAgICAgICAgICAvLyBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdAogICAgICAgICAgY2FzZSAiR0dHRyI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmVyYShlcmEsIHsgd2lkdGg6ICJ3aWRlIiB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIFllYXIKICAgICAgeTogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgICAgIGlmICh0b2tlbiA9PT0gInlvIikgewogICAgICAgICAgY29uc3Qgc2lnbmVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgICAgICAgIGNvbnN0IHllYXIgPSBzaWduZWRZZWFyID4gMCA/IHNpZ25lZFllYXIgOiAxIC0gc2lnbmVkWWVhcjsKICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcih5ZWFyLCB7IHVuaXQ6ICJ5ZWFyIiB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy55KGRhdGUsIHRva2VuKTsKICAgICAgfSwKICAgICAgLy8gTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhcgogICAgICBZOiBmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyLCBvcHRpb25zKSB7CiAgICAgICAgY29uc3Qgc2lnbmVkV2Vla1llYXIgPSBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKTsKICAgICAgICBjb25zdCB3ZWVrWWVhciA9IHNpZ25lZFdlZWtZZWFyID4gMCA/IHNpZ25lZFdlZWtZZWFyIDogMSAtIHNpZ25lZFdlZWtZZWFyOwogICAgICAgIGlmICh0b2tlbiA9PT0gIllZIikgewogICAgICAgICAgY29uc3QgdHdvRGlnaXRZZWFyID0gd2Vla1llYXIgJSAxMDA7CiAgICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHR3b0RpZ2l0WWVhciwgMik7CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlbiA9PT0gIllvIikgewogICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKHdlZWtZZWFyLCB7IHVuaXQ6ICJ5ZWFyIiB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh3ZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTsKICAgICAgfSwKICAgICAgLy8gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIKICAgICAgUjogZnVuY3Rpb24oZGF0ZSwgdG9rZW4pIHsKICAgICAgICBjb25zdCBpc29XZWVrWWVhciA9IGdldElTT1dlZWtZZWFyKGRhdGUpOwogICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaXNvV2Vla1llYXIsIHRva2VuLmxlbmd0aCk7CiAgICAgIH0sCiAgICAgIC8vIEV4dGVuZGVkIHllYXIuIFRoaXMgaXMgYSBzaW5nbGUgbnVtYmVyIGRlc2lnbmF0aW5nIHRoZSB5ZWFyIG9mIHRoaXMgY2FsZW5kYXIgc3lzdGVtLgogICAgICAvLyBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gYHlgIGFuZCBgdWAgbG9jYWxpemVycyBhcmUgQi5DLiB5ZWFyczoKICAgICAgLy8gfCBZZWFyIHwgYHlgIHwgYHVgIHwKICAgICAgLy8gfC0tLS0tLXwtLS0tLXwtLS0tLXwKICAgICAgLy8gfCBBQyAxIHwgICAxIHwgICAxIHwKICAgICAgLy8gfCBCQyAxIHwgICAxIHwgICAwIHwKICAgICAgLy8gfCBCQyAyIHwgICAyIHwgIC0xIHwKICAgICAgLy8gQWxzbyBgeXlgIGFsd2F5cyByZXR1cm5zIHRoZSBsYXN0IHR3byBkaWdpdHMgb2YgYSB5ZWFyLAogICAgICAvLyB3aGlsZSBgdXVgIHBhZHMgc2luZ2xlIGRpZ2l0IHllYXJzIHRvIDIgY2hhcmFjdGVycyBhbmQgcmV0dXJucyBvdGhlciB5ZWFycyB1bmNoYW5nZWQuCiAgICAgIHU6IGZ1bmN0aW9uKGRhdGUsIHRva2VuKSB7CiAgICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHllYXIsIHRva2VuLmxlbmd0aCk7CiAgICAgIH0sCiAgICAgIC8vIFF1YXJ0ZXIKICAgICAgUTogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgICAgIGNvbnN0IHF1YXJ0ZXIgPSBNYXRoLmNlaWwoKGRhdGUuZ2V0TW9udGgoKSArIDEpIC8gMyk7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgLy8gMSwgMiwgMywgNAogICAgICAgICAgY2FzZSAiUSI6CiAgICAgICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7CiAgICAgICAgICAvLyAwMSwgMDIsIDAzLCAwNAogICAgICAgICAgY2FzZSAiUVEiOgogICAgICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHF1YXJ0ZXIsIDIpOwogICAgICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoCiAgICAgICAgICBjYXNlICJRbyI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihxdWFydGVyLCB7IHVuaXQ6ICJxdWFydGVyIiB9KTsKICAgICAgICAgIC8vIFExLCBRMiwgUTMsIFE0CiAgICAgICAgICBjYXNlICJRUVEiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLnF1YXJ0ZXIocXVhcnRlciwgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKQogICAgICAgICAgY2FzZSAiUVFRUVEiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLnF1YXJ0ZXIocXVhcnRlciwgewogICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLgogICAgICAgICAgY2FzZSAiUVFRUSI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLnF1YXJ0ZXIocXVhcnRlciwgewogICAgICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgLy8gU3RhbmQtYWxvbmUgcXVhcnRlcgogICAgICBxOiBmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICAgICAgY29uc3QgcXVhcnRlciA9IE1hdGguY2VpbCgoZGF0ZS5nZXRNb250aCgpICsgMSkgLyAzKTsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAvLyAxLCAyLCAzLCA0CiAgICAgICAgICBjYXNlICJxIjoKICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhxdWFydGVyKTsKICAgICAgICAgIC8vIDAxLCAwMiwgMDMsIDA0CiAgICAgICAgICBjYXNlICJxcSI6CiAgICAgICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MocXVhcnRlciwgMik7CiAgICAgICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGgKICAgICAgICAgIGNhc2UgInFvIjoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKHF1YXJ0ZXIsIHsgdW5pdDogInF1YXJ0ZXIiIH0pOwogICAgICAgICAgLy8gUTEsIFEyLCBRMywgUTQKICAgICAgICAgIGNhc2UgInFxcSI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIucXVhcnRlcihxdWFydGVyLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgICAgIH0pOwogICAgICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpCiAgICAgICAgICBjYXNlICJxcXFxcSI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIucXVhcnRlcihxdWFydGVyLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uCiAgICAgICAgICBjYXNlICJxcXFxIjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIucXVhcnRlcihxdWFydGVyLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICAvLyBNb250aAogICAgICBNOiBmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICAgICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgY2FzZSAiTSI6CiAgICAgICAgICBjYXNlICJNTSI6CiAgICAgICAgICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuTShkYXRlLCB0b2tlbik7CiAgICAgICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoCiAgICAgICAgICBjYXNlICJNbyI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihtb250aCArIDEsIHsgdW5pdDogIm1vbnRoIiB9KTsKICAgICAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlYwogICAgICAgICAgY2FzZSAiTU1NIjoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5tb250aChtb250aCwgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIEosIEYsIC4uLiwgRAogICAgICAgICAgY2FzZSAiTU1NTU0iOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLm1vbnRoKG1vbnRoLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyCiAgICAgICAgICBjYXNlICJNTU1NIjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIubW9udGgobW9udGgsIHsgd2lkdGg6ICJ3aWRlIiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgLy8gU3RhbmQtYWxvbmUgbW9udGgKICAgICAgTDogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpOwogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIC8vIDEsIDIsIC4uLiwgMTIKICAgICAgICAgIGNhc2UgIkwiOgogICAgICAgICAgICByZXR1cm4gU3RyaW5nKG1vbnRoICsgMSk7CiAgICAgICAgICAvLyAwMSwgMDIsIC4uLiwgMTIKICAgICAgICAgIGNhc2UgIkxMIjoKICAgICAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhtb250aCArIDEsIDIpOwogICAgICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aAogICAgICAgICAgY2FzZSAiTG8iOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6ICJtb250aCIgfSk7CiAgICAgICAgICAvLyBKYW4sIEZlYiwgLi4uLCBEZWMKICAgICAgICAgIGNhc2UgIkxMTCI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIubW9udGgobW9udGgsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyBKLCBGLCAuLi4sIEQKICAgICAgICAgIGNhc2UgIkxMTExMIjoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5tb250aChtb250aCwgewogICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlcgogICAgICAgICAgY2FzZSAiTExMTCI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiAid2lkZSIsIGNvbnRleHQ6ICJzdGFuZGFsb25lIiB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIExvY2FsIHdlZWsgb2YgeWVhcgogICAgICB3OiBmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyLCBvcHRpb25zKSB7CiAgICAgICAgY29uc3Qgd2VlayA9IGdldFdlZWsoZGF0ZSwgb3B0aW9ucyk7CiAgICAgICAgaWYgKHRva2VuID09PSAid28iKSB7CiAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIod2VlaywgeyB1bml0OiAid2VlayIgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3Mod2VlaywgdG9rZW4ubGVuZ3RoKTsKICAgICAgfSwKICAgICAgLy8gSVNPIHdlZWsgb2YgeWVhcgogICAgICBJOiBmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICAgICAgY29uc3QgaXNvV2VlayA9IGdldElTT1dlZWsoZGF0ZSk7CiAgICAgICAgaWYgKHRva2VuID09PSAiSW8iKSB7CiAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIoaXNvV2VlaywgeyB1bml0OiAid2VlayIgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaXNvV2VlaywgdG9rZW4ubGVuZ3RoKTsKICAgICAgfSwKICAgICAgLy8gRGF5IG9mIHRoZSBtb250aAogICAgICBkOiBmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICAgICAgaWYgKHRva2VuID09PSAiZG8iKSB7CiAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXREYXRlKCksIHsgdW5pdDogImRhdGUiIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLmQoZGF0ZSwgdG9rZW4pOwogICAgICB9LAogICAgICAvLyBEYXkgb2YgeWVhcgogICAgICBEOiBmdW5jdGlvbihkYXRlLCB0b2tlbiwgbG9jYWxpemUyKSB7CiAgICAgICAgY29uc3QgZGF5T2ZZZWFyID0gZ2V0RGF5T2ZZZWFyKGRhdGUpOwogICAgICAgIGlmICh0b2tlbiA9PT0gIkRvIikgewogICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGRheU9mWWVhciwgeyB1bml0OiAiZGF5T2ZZZWFyIiB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXlPZlllYXIsIHRva2VuLmxlbmd0aCk7CiAgICAgIH0sCiAgICAgIC8vIERheSBvZiB3ZWVrCiAgICAgIEU6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgICAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpOwogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIC8vIFR1ZQogICAgICAgICAgY2FzZSAiRSI6CiAgICAgICAgICBjYXNlICJFRSI6CiAgICAgICAgICBjYXNlICJFRUUiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyBUCiAgICAgICAgICBjYXNlICJFRUVFRSI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyBUdQogICAgICAgICAgY2FzZSAiRUVFRUVFIjoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXkoZGF5T2ZXZWVrLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJzaG9ydCIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgICAgLy8gVHVlc2RheQogICAgICAgICAgY2FzZSAiRUVFRSI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgICAgICB3aWR0aDogIndpZGUiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIExvY2FsIGRheSBvZiB3ZWVrCiAgICAgIGU6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIsIG9wdGlvbnMpIHsKICAgICAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpOwogICAgICAgIGNvbnN0IGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgLy8gTnVtZXJpY2FsIHZhbHVlIChOdGggZGF5IG9mIHdlZWsgd2l0aCBjdXJyZW50IGxvY2FsZSBvciB3ZWVrU3RhcnRzT24pCiAgICAgICAgICBjYXNlICJlIjoKICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhsb2NhbERheU9mV2Vlayk7CiAgICAgICAgICAvLyBQYWRkZWQgbnVtZXJpY2FsIHZhbHVlCiAgICAgICAgICBjYXNlICJlZSI6CiAgICAgICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MobG9jYWxEYXlPZldlZWssIDIpOwogICAgICAgICAgLy8gMXN0LCAybmQsIC4uLiwgN3RoCiAgICAgICAgICBjYXNlICJlbyI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiAiZGF5IiB9KTsKICAgICAgICAgIGNhc2UgImVlZSI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIFQKICAgICAgICAgIGNhc2UgImVlZWVlIjoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXkoZGF5T2ZXZWVrLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIFR1CiAgICAgICAgICBjYXNlICJlZWVlZWUiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgICAgICB3aWR0aDogInNob3J0IiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyBUdWVzZGF5CiAgICAgICAgICBjYXNlICJlZWVlIjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgLy8gU3RhbmQtYWxvbmUgbG9jYWwgZGF5IG9mIHdlZWsKICAgICAgYzogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMiwgb3B0aW9ucykgewogICAgICAgIGNvbnN0IGRheU9mV2VlayA9IGRhdGUuZ2V0RGF5KCk7CiAgICAgICAgY29uc3QgbG9jYWxEYXlPZldlZWsgPSAoZGF5T2ZXZWVrIC0gb3B0aW9ucy53ZWVrU3RhcnRzT24gKyA4KSAlIDcgfHwgNzsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAvLyBOdW1lcmljYWwgdmFsdWUgKHNhbWUgYXMgaW4gYGVgKQogICAgICAgICAgY2FzZSAiYyI6CiAgICAgICAgICAgIHJldHVybiBTdHJpbmcobG9jYWxEYXlPZldlZWspOwogICAgICAgICAgLy8gUGFkZGVkIG51bWVyaWNhbCB2YWx1ZQogICAgICAgICAgY2FzZSAiY2MiOgogICAgICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGxvY2FsRGF5T2ZXZWVrLCB0b2tlbi5sZW5ndGgpOwogICAgICAgICAgLy8gMXN0LCAybmQsIC4uLiwgN3RoCiAgICAgICAgICBjYXNlICJjbyI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiAiZGF5IiB9KTsKICAgICAgICAgIGNhc2UgImNjYyI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIFQKICAgICAgICAgIGNhc2UgImNjY2NjIjoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXkoZGF5T2ZXZWVrLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIFR1CiAgICAgICAgICBjYXNlICJjY2NjY2MiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgICAgICB3aWR0aDogInNob3J0IiwKICAgICAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyBUdWVzZGF5CiAgICAgICAgICBjYXNlICJjY2NjIjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgLy8gSVNPIGRheSBvZiB3ZWVrCiAgICAgIGk6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgICAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpOwogICAgICAgIGNvbnN0IGlzb0RheU9mV2VlayA9IGRheU9mV2VlayA9PT0gMCA/IDcgOiBkYXlPZldlZWs7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgLy8gMgogICAgICAgICAgY2FzZSAiaSI6CiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoaXNvRGF5T2ZXZWVrKTsKICAgICAgICAgIC8vIDAyCiAgICAgICAgICBjYXNlICJpaSI6CiAgICAgICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaXNvRGF5T2ZXZWVrLCB0b2tlbi5sZW5ndGgpOwogICAgICAgICAgLy8gMm5kCiAgICAgICAgICBjYXNlICJpbyI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIub3JkaW5hbE51bWJlcihpc29EYXlPZldlZWssIHsgdW5pdDogImRheSIgfSk7CiAgICAgICAgICAvLyBUdWUKICAgICAgICAgIGNhc2UgImlpaSI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIFQKICAgICAgICAgIGNhc2UgImlpaWlpIjoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXkoZGF5T2ZXZWVrLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIFR1CiAgICAgICAgICBjYXNlICJpaWlpaWkiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheShkYXlPZldlZWssIHsKICAgICAgICAgICAgICB3aWR0aDogInNob3J0IiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyBUdWVzZGF5CiAgICAgICAgICBjYXNlICJpaWlpIjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5KGRheU9mV2VlaywgewogICAgICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgLy8gQU0gb3IgUE0KICAgICAgYTogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpOwogICAgICAgIGNvbnN0IGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/ICJwbSIgOiAiYW0iOwogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIGNhc2UgImEiOgogICAgICAgICAgY2FzZSAiYWEiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlICJhYWEiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSkudG9Mb3dlckNhc2UoKTsKICAgICAgICAgIGNhc2UgImFhYWFhIjoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIGNhc2UgImFhYWEiOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAogICAgICAvLyBBTSwgUE0sIG1pZG5pZ2h0LCBub29uCiAgICAgIGI6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgICAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTsKICAgICAgICBsZXQgZGF5UGVyaW9kRW51bVZhbHVlOwogICAgICAgIGlmIChob3VycyA9PT0gMTIpIHsKICAgICAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubm9vbjsKICAgICAgICB9IGVsc2UgaWYgKGhvdXJzID09PSAwKSB7CiAgICAgICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm1pZG5pZ2h0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBob3VycyAvIDEyID49IDEgPyAicG0iIDogImFtIjsKICAgICAgICB9CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgY2FzZSAiYiI6CiAgICAgICAgICBjYXNlICJiYiI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIGNhc2UgImJiYiI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGl6ZTIuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgY2FzZSAiYmJiYmIiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAiYmJiYiI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgICAgICB3aWR0aDogIndpZGUiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIGluIHRoZSBtb3JuaW5nLCBpbiB0aGUgYWZ0ZXJub29uLCBpbiB0aGUgZXZlbmluZywgYXQgbmlnaHQKICAgICAgQjogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpOwogICAgICAgIGxldCBkYXlQZXJpb2RFbnVtVmFsdWU7CiAgICAgICAgaWYgKGhvdXJzID49IDE3KSB7CiAgICAgICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmV2ZW5pbmc7CiAgICAgICAgfSBlbHNlIGlmIChob3VycyA+PSAxMikgewogICAgICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5hZnRlcm5vb247CiAgICAgICAgfSBlbHNlIGlmIChob3VycyA+PSA0KSB7CiAgICAgICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm1vcm5pbmc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubmlnaHQ7CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIGNhc2UgIkIiOgogICAgICAgICAgY2FzZSAiQkIiOgogICAgICAgICAgY2FzZSAiQkJCIjoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAiQkJCQkIiOgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAiQkJCQiI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHsKICAgICAgICAgICAgICB3aWR0aDogIndpZGUiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIEhvdXIgWzEtMTJdCiAgICAgIGg6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgICAgICBpZiAodG9rZW4gPT09ICJobyIpIHsKICAgICAgICAgIGxldCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKSAlIDEyOwogICAgICAgICAgaWYgKGhvdXJzID09PSAwKSBob3VycyA9IDEyOwogICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6ICJob3VyIiB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5oKGRhdGUsIHRva2VuKTsKICAgICAgfSwKICAgICAgLy8gSG91ciBbMC0yM10KICAgICAgSDogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgICAgIGlmICh0b2tlbiA9PT0gIkhvIikgewogICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0SG91cnMoKSwgeyB1bml0OiAiaG91ciIgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuSChkYXRlLCB0b2tlbik7CiAgICAgIH0sCiAgICAgIC8vIEhvdXIgWzAtMTFdCiAgICAgIEs6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBsb2NhbGl6ZTIpIHsKICAgICAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKSAlIDEyOwogICAgICAgIGlmICh0b2tlbiA9PT0gIktvIikgewogICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6ICJob3VyIiB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhob3VycywgdG9rZW4ubGVuZ3RoKTsKICAgICAgfSwKICAgICAgLy8gSG91ciBbMS0yNF0KICAgICAgazogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgICAgIGxldCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTsKICAgICAgICBpZiAoaG91cnMgPT09IDApIGhvdXJzID0gMjQ7CiAgICAgICAgaWYgKHRva2VuID09PSAia28iKSB7CiAgICAgICAgICByZXR1cm4gbG9jYWxpemUyLm9yZGluYWxOdW1iZXIoaG91cnMsIHsgdW5pdDogImhvdXIiIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGhvdXJzLCB0b2tlbi5sZW5ndGgpOwogICAgICB9LAogICAgICAvLyBNaW51dGUKICAgICAgbTogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgICAgIGlmICh0b2tlbiA9PT0gIm1vIikgewogICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0TWludXRlcygpLCB7IHVuaXQ6ICJtaW51dGUiIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLm0oZGF0ZSwgdG9rZW4pOwogICAgICB9LAogICAgICAvLyBTZWNvbmQKICAgICAgczogZnVuY3Rpb24oZGF0ZSwgdG9rZW4sIGxvY2FsaXplMikgewogICAgICAgIGlmICh0b2tlbiA9PT0gInNvIikgewogICAgICAgICAgcmV0dXJuIGxvY2FsaXplMi5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0U2Vjb25kcygpLCB7IHVuaXQ6ICJzZWNvbmQiIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLnMoZGF0ZSwgdG9rZW4pOwogICAgICB9LAogICAgICAvLyBGcmFjdGlvbiBvZiBzZWNvbmQKICAgICAgUzogZnVuY3Rpb24oZGF0ZSwgdG9rZW4pIHsKICAgICAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLlMoZGF0ZSwgdG9rZW4pOwogICAgICB9LAogICAgICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYWx3YXlzIGAnWidgKQogICAgICBYOiBmdW5jdGlvbihkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7CiAgICAgICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICAgICAgaWYgKHRpbWV6b25lT2Zmc2V0ID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gIloiOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAvLyBIb3VycyBhbmQgb3B0aW9uYWwgbWludXRlcwogICAgICAgICAgY2FzZSAiWCI6CiAgICAgICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpOwogICAgICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aG91dCBgOmAgZGVsaW1pdGVyCiAgICAgICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0cwogICAgICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgWFhgCiAgICAgICAgICBjYXNlICJYWFhYIjoKICAgICAgICAgIGNhc2UgIlhYIjoKICAgICAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0KTsKICAgICAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlcgogICAgICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHMKICAgICAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYFhYWGAKICAgICAgICAgIGNhc2UgIlhYWFhYIjoKICAgICAgICAgIGNhc2UgIlhYWCI6CiAgICAgICAgICAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXIKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgIjoiKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIFRpbWV6b25lIChJU08tODYwMS4gSWYgb2Zmc2V0IGlzIDAsIG91dHB1dCBpcyBgJyswMDowMCdgIG9yIGVxdWl2YWxlbnQpCiAgICAgIHg6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHsKICAgICAgICBjb25zdCB0aW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAvLyBIb3VycyBhbmQgb3B0aW9uYWwgbWludXRlcwogICAgICAgICAgY2FzZSAieCI6CiAgICAgICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpOwogICAgICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aG91dCBgOmAgZGVsaW1pdGVyCiAgICAgICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0cwogICAgICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgeHhgCiAgICAgICAgICBjYXNlICJ4eHh4IjoKICAgICAgICAgIGNhc2UgInh4IjoKICAgICAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0KTsKICAgICAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlcgogICAgICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHMKICAgICAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYHh4eGAKICAgICAgICAgIGNhc2UgInh4eHh4IjoKICAgICAgICAgIGNhc2UgInh4eCI6CiAgICAgICAgICAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXIKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgIjoiKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIFRpbWV6b25lIChHTVQpCiAgICAgIE86IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHsKICAgICAgICBjb25zdCB0aW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAvLyBTaG9ydAogICAgICAgICAgY2FzZSAiTyI6CiAgICAgICAgICBjYXNlICJPTyI6CiAgICAgICAgICBjYXNlICJPT08iOgogICAgICAgICAgICByZXR1cm4gIkdNVCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCAiOiIpOwogICAgICAgICAgLy8gTG9uZwogICAgICAgICAgY2FzZSAiT09PTyI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gIkdNVCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgIjoiKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXRpb24pCiAgICAgIHo6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHsKICAgICAgICBjb25zdCB0aW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAvLyBTaG9ydAogICAgICAgICAgY2FzZSAieiI6CiAgICAgICAgICBjYXNlICJ6eiI6CiAgICAgICAgICBjYXNlICJ6enoiOgogICAgICAgICAgICByZXR1cm4gIkdNVCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCAiOiIpOwogICAgICAgICAgLy8gTG9uZwogICAgICAgICAgY2FzZSAienp6eiI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gIkdNVCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgIjoiKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIFNlY29uZHMgdGltZXN0YW1wCiAgICAgIHQ6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHsKICAgICAgICBjb25zdCB0aW1lc3RhbXAyID0gTWF0aC50cnVuYygrZGF0ZSAvIDFlMyk7CiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh0aW1lc3RhbXAyLCB0b2tlbi5sZW5ndGgpOwogICAgICB9LAogICAgICAvLyBNaWxsaXNlY29uZHMgdGltZXN0YW1wCiAgICAgIFQ6IGZ1bmN0aW9uKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHsKICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKCtkYXRlLCB0b2tlbi5sZW5ndGgpOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZm9ybWF0L2xvbmdGb3JtYXR0ZXJzLmpzCnZhciBkYXRlTG9uZ0Zvcm1hdHRlciwgdGltZUxvbmdGb3JtYXR0ZXIsIGRhdGVUaW1lTG9uZ0Zvcm1hdHRlciwgbG9uZ0Zvcm1hdHRlcnM7CnZhciBpbml0X2xvbmdGb3JtYXR0ZXJzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZm9ybWF0L2xvbmdGb3JtYXR0ZXJzLmpzIigpIHsKICAgIGRhdGVMb25nRm9ybWF0dGVyID0gKHBhdHRlcm4sIGZvcm1hdExvbmcyKSA9PiB7CiAgICAgIHN3aXRjaCAocGF0dGVybikgewogICAgICAgIGNhc2UgIlAiOgogICAgICAgICAgcmV0dXJuIGZvcm1hdExvbmcyLmRhdGUoeyB3aWR0aDogInNob3J0IiB9KTsKICAgICAgICBjYXNlICJQUCI6CiAgICAgICAgICByZXR1cm4gZm9ybWF0TG9uZzIuZGF0ZSh7IHdpZHRoOiAibWVkaXVtIiB9KTsKICAgICAgICBjYXNlICJQUFAiOgogICAgICAgICAgcmV0dXJuIGZvcm1hdExvbmcyLmRhdGUoeyB3aWR0aDogImxvbmciIH0pOwogICAgICAgIGNhc2UgIlBQUFAiOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gZm9ybWF0TG9uZzIuZGF0ZSh7IHdpZHRoOiAiZnVsbCIgfSk7CiAgICAgIH0KICAgIH07CiAgICB0aW1lTG9uZ0Zvcm1hdHRlciA9IChwYXR0ZXJuLCBmb3JtYXRMb25nMikgPT4gewogICAgICBzd2l0Y2ggKHBhdHRlcm4pIHsKICAgICAgICBjYXNlICJwIjoKICAgICAgICAgIHJldHVybiBmb3JtYXRMb25nMi50aW1lKHsgd2lkdGg6ICJzaG9ydCIgfSk7CiAgICAgICAgY2FzZSAicHAiOgogICAgICAgICAgcmV0dXJuIGZvcm1hdExvbmcyLnRpbWUoeyB3aWR0aDogIm1lZGl1bSIgfSk7CiAgICAgICAgY2FzZSAicHBwIjoKICAgICAgICAgIHJldHVybiBmb3JtYXRMb25nMi50aW1lKHsgd2lkdGg6ICJsb25nIiB9KTsKICAgICAgICBjYXNlICJwcHBwIjoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIGZvcm1hdExvbmcyLnRpbWUoeyB3aWR0aDogImZ1bGwiIH0pOwogICAgICB9CiAgICB9OwogICAgZGF0ZVRpbWVMb25nRm9ybWF0dGVyID0gKHBhdHRlcm4sIGZvcm1hdExvbmcyKSA9PiB7CiAgICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gcGF0dGVybi5tYXRjaCgvKFArKShwKyk/LykgfHwgW107CiAgICAgIGNvbnN0IGRhdGVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMV07CiAgICAgIGNvbnN0IHRpbWVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMl07CiAgICAgIGlmICghdGltZVBhdHRlcm4pIHsKICAgICAgICByZXR1cm4gZGF0ZUxvbmdGb3JtYXR0ZXIocGF0dGVybiwgZm9ybWF0TG9uZzIpOwogICAgICB9CiAgICAgIGxldCBkYXRlVGltZUZvcm1hdDsKICAgICAgc3dpdGNoIChkYXRlUGF0dGVybikgewogICAgICAgIGNhc2UgIlAiOgogICAgICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nMi5kYXRlVGltZSh7IHdpZHRoOiAic2hvcnQiIH0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiUFAiOgogICAgICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nMi5kYXRlVGltZSh7IHdpZHRoOiAibWVkaXVtIiB9KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlBQUCI6CiAgICAgICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcyLmRhdGVUaW1lKHsgd2lkdGg6ICJsb25nIiB9KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlBQUFAiOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcyLmRhdGVUaW1lKHsgd2lkdGg6ICJmdWxsIiB9KTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHJldHVybiBkYXRlVGltZUZvcm1hdC5yZXBsYWNlKCJ7e2RhdGV9fSIsIGRhdGVMb25nRm9ybWF0dGVyKGRhdGVQYXR0ZXJuLCBmb3JtYXRMb25nMikpLnJlcGxhY2UoInt7dGltZX19IiwgdGltZUxvbmdGb3JtYXR0ZXIodGltZVBhdHRlcm4sIGZvcm1hdExvbmcyKSk7CiAgICB9OwogICAgbG9uZ0Zvcm1hdHRlcnMgPSB7CiAgICAgIHA6IHRpbWVMb25nRm9ybWF0dGVyLAogICAgICBQOiBkYXRlVGltZUxvbmdGb3JtYXR0ZXIKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9wcm90ZWN0ZWRUb2tlbnMuanMKZnVuY3Rpb24gaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbih0b2tlbikgewogIHJldHVybiBkYXlPZlllYXJUb2tlblJFLnRlc3QodG9rZW4pOwp9CmZ1bmN0aW9uIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikgewogIHJldHVybiB3ZWVrWWVhclRva2VuUkUudGVzdCh0b2tlbik7Cn0KZnVuY3Rpb24gd2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvcih0b2tlbiwgZm9ybWF0MiwgaW5wdXQpIHsKICBjb25zdCBfbWVzc2FnZSA9IG1lc3NhZ2UodG9rZW4sIGZvcm1hdDIsIGlucHV0KTsKICBjb25zb2xlLndhcm4oX21lc3NhZ2UpOwogIGlmICh0aHJvd1Rva2Vucy5pbmNsdWRlcyh0b2tlbikpIHRocm93IG5ldyBSYW5nZUVycm9yKF9tZXNzYWdlKTsKfQpmdW5jdGlvbiBtZXNzYWdlKHRva2VuLCBmb3JtYXQyLCBpbnB1dCkgewogIGNvbnN0IHN1YmplY3QgPSB0b2tlblswXSA9PT0gIlkiID8gInllYXJzIiA6ICJkYXlzIG9mIHRoZSBtb250aCI7CiAgcmV0dXJuIGBVc2UgXGAke3Rva2VuLnRvTG93ZXJDYXNlKCl9XGAgaW5zdGVhZCBvZiBcYCR7dG9rZW59XGAgKGluIFxgJHtmb3JtYXQyfVxgKSBmb3IgZm9ybWF0dGluZyAke3N1YmplY3R9IHRvIHRoZSBpbnB1dCBcYCR7aW5wdXR9XGA7IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZGA7Cn0KdmFyIGRheU9mWWVhclRva2VuUkUsIHdlZWtZZWFyVG9rZW5SRSwgdGhyb3dUb2tlbnM7CnZhciBpbml0X3Byb3RlY3RlZFRva2VucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL3Byb3RlY3RlZFRva2Vucy5qcyIoKSB7CiAgICBkYXlPZlllYXJUb2tlblJFID0gL15EKyQvOwogICAgd2Vla1llYXJUb2tlblJFID0gL15ZKyQvOwogICAgdGhyb3dUb2tlbnMgPSBbIkQiLCAiREQiLCAiWVkiLCAiWVlZWSJdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdC5qcwpmdW5jdGlvbiBmb3JtYXQoZGF0ZSwgZm9ybWF0U3RyLCBvcHRpb25zKSB7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZSA/PyBlblVTOwogIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBkZWZhdWx0T3B0aW9uczIuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyAxOwogIGNvbnN0IHdlZWtTdGFydHNPbiA9IG9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyAwOwogIGNvbnN0IG9yaWdpbmFsRGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgaWYgKCFpc1ZhbGlkKG9yaWdpbmFsRGF0ZSkpIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHRpbWUgdmFsdWUiKTsKICB9CiAgbGV0IHBhcnRzID0gZm9ybWF0U3RyLm1hdGNoKGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwKS5tYXAoKHN1YnN0cmluZykgPT4gewogICAgY29uc3QgZmlyc3RDaGFyYWN0ZXIgPSBzdWJzdHJpbmdbMF07CiAgICBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09ICJwIiB8fCBmaXJzdENoYXJhY3RlciA9PT0gIlAiKSB7CiAgICAgIGNvbnN0IGxvbmdGb3JtYXR0ZXIgPSBsb25nRm9ybWF0dGVyc1tmaXJzdENoYXJhY3Rlcl07CiAgICAgIHJldHVybiBsb25nRm9ybWF0dGVyKHN1YnN0cmluZywgbG9jYWxlLmZvcm1hdExvbmcpOwogICAgfQogICAgcmV0dXJuIHN1YnN0cmluZzsKICB9KS5qb2luKCIiKS5tYXRjaChmb3JtYXR0aW5nVG9rZW5zUmVnRXhwKS5tYXAoKHN1YnN0cmluZykgPT4gewogICAgaWYgKHN1YnN0cmluZyA9PT0gIicnIikgewogICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6ICInIiB9OwogICAgfQogICAgY29uc3QgZmlyc3RDaGFyYWN0ZXIgPSBzdWJzdHJpbmdbMF07CiAgICBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09ICInIikgewogICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IGNsZWFuRXNjYXBlZFN0cmluZyhzdWJzdHJpbmcpIH07CiAgICB9CiAgICBpZiAoZm9ybWF0dGVyc1tmaXJzdENoYXJhY3Rlcl0pIHsKICAgICAgcmV0dXJuIHsgaXNUb2tlbjogdHJ1ZSwgdmFsdWU6IHN1YnN0cmluZyB9OwogICAgfQogICAgaWYgKGZpcnN0Q2hhcmFjdGVyLm1hdGNoKHVuZXNjYXBlZExhdGluQ2hhcmFjdGVyUmVnRXhwKSkgewogICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigKICAgICAgICAiRm9ybWF0IHN0cmluZyBjb250YWlucyBhbiB1bmVzY2FwZWQgbGF0aW4gYWxwaGFiZXQgY2hhcmFjdGVyIGAiICsgZmlyc3RDaGFyYWN0ZXIgKyAiYCIKICAgICAgKTsKICAgIH0KICAgIHJldHVybiB7IGlzVG9rZW46IGZhbHNlLCB2YWx1ZTogc3Vic3RyaW5nIH07CiAgfSk7CiAgaWYgKGxvY2FsZS5sb2NhbGl6ZS5wcmVwcm9jZXNzb3IpIHsKICAgIHBhcnRzID0gbG9jYWxlLmxvY2FsaXplLnByZXByb2Nlc3NvcihvcmlnaW5hbERhdGUsIHBhcnRzKTsKICB9CiAgY29uc3QgZm9ybWF0dGVyT3B0aW9ucyA9IHsKICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSwKICAgIHdlZWtTdGFydHNPbiwKICAgIGxvY2FsZQogIH07CiAgcmV0dXJuIHBhcnRzLm1hcCgocGFydCkgPT4gewogICAgaWYgKCFwYXJ0LmlzVG9rZW4pIHJldHVybiBwYXJ0LnZhbHVlOwogICAgY29uc3QgdG9rZW4gPSBwYXJ0LnZhbHVlOwogICAgaWYgKCFvcHRpb25zPy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnMgJiYgaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuKHRva2VuKSB8fCAhb3B0aW9ucz8udXNlQWRkaXRpb25hbERheU9mWWVhclRva2VucyAmJiBpc1Byb3RlY3RlZERheU9mWWVhclRva2VuKHRva2VuKSkgewogICAgICB3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yKHRva2VuLCBmb3JtYXRTdHIsIFN0cmluZyhkYXRlKSk7CiAgICB9CiAgICBjb25zdCBmb3JtYXR0ZXIyID0gZm9ybWF0dGVyc1t0b2tlblswXV07CiAgICByZXR1cm4gZm9ybWF0dGVyMihvcmlnaW5hbERhdGUsIHRva2VuLCBsb2NhbGUubG9jYWxpemUsIGZvcm1hdHRlck9wdGlvbnMpOwogIH0pLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIGNsZWFuRXNjYXBlZFN0cmluZyhpbnB1dCkgewogIGNvbnN0IG1hdGNoZWQgPSBpbnB1dC5tYXRjaChlc2NhcGVkU3RyaW5nUmVnRXhwKTsKICBpZiAoIW1hdGNoZWQpIHsKICAgIHJldHVybiBpbnB1dDsKICB9CiAgcmV0dXJuIG1hdGNoZWRbMV0ucmVwbGFjZShkb3VibGVRdW90ZVJlZ0V4cCwgIiciKTsKfQp2YXIgZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCwgbG9uZ0Zvcm1hdHRpbmdUb2tlbnNSZWdFeHAsIGVzY2FwZWRTdHJpbmdSZWdFeHAsIGRvdWJsZVF1b3RlUmVnRXhwLCB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCwgZm9ybWF0X2RlZmF1bHQ7CnZhciBpbml0X2Zvcm1hdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXQuanMiKCkgewogICAgaW5pdF9kZWZhdWx0TG9jYWxlKCk7CiAgICBpbml0X2RlZmF1bHRPcHRpb25zKCk7CiAgICBpbml0X2Zvcm1hdHRlcnMoKTsKICAgIGluaXRfbG9uZ0Zvcm1hdHRlcnMoKTsKICAgIGluaXRfcHJvdGVjdGVkVG9rZW5zKCk7CiAgICBpbml0X2lzVmFsaWQoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBmb3JtYXR0aW5nVG9rZW5zUmVnRXhwID0gL1t5WVFxTUx3SWREZWNpaEhLa21zXW98KFx3KVwxKnwnJ3wnKCcnfFteJ10pKygnfCQpfC4vZzsKICAgIGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwID0gL1ArcCt8UCt8cCt8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7CiAgICBlc2NhcGVkU3RyaW5nUmVnRXhwID0gL14nKFteXSo/KSc/JC87CiAgICBkb3VibGVRdW90ZVJlZ0V4cCA9IC8nJy9nOwogICAgdW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHAgPSAvW2EtekEtWl0vOwogICAgZm9ybWF0X2RlZmF1bHQgPSBmb3JtYXQ7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0RGlzdGFuY2UuanMKZnVuY3Rpb24gZm9ybWF0RGlzdGFuY2UyKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IGxvY2FsZSA9IG9wdGlvbnM/LmxvY2FsZSA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlID8/IGVuVVM7CiAgY29uc3QgbWludXRlc0luQWxtb3N0VHdvRGF5cyA9IDI1MjA7CiAgY29uc3QgY29tcGFyaXNvbiA9IGNvbXBhcmVBc2MobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSk7CiAgaWYgKGlzTmFOKGNvbXBhcmlzb24pKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0aW1lIHZhbHVlIik7CiAgY29uc3QgbG9jYWxpemVPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywgewogICAgYWRkU3VmZml4OiBvcHRpb25zPy5hZGRTdWZmaXgsCiAgICBjb21wYXJpc29uCiAgfSk7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgLi4uY29tcGFyaXNvbiA+IDAgPyBbZWFybGllckRhdGUsIGxhdGVyRGF0ZV0gOiBbbGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZV0KICApOwogIGNvbnN0IHNlY29uZHMgPSBkaWZmZXJlbmNlSW5TZWNvbmRzKGVhcmxpZXJEYXRlXywgbGF0ZXJEYXRlXyk7CiAgY29uc3Qgb2Zmc2V0SW5TZWNvbmRzID0gKGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoZWFybGllckRhdGVfKSAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMobGF0ZXJEYXRlXykpIC8gMWUzOwogIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLnJvdW5kKChzZWNvbmRzIC0gb2Zmc2V0SW5TZWNvbmRzKSAvIDYwKTsKICBsZXQgbW9udGhzMjsKICBpZiAobWludXRlcyA8IDIpIHsKICAgIGlmIChvcHRpb25zPy5pbmNsdWRlU2Vjb25kcykgewogICAgICBpZiAoc2Vjb25kcyA8IDUpIHsKICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJsZXNzVGhhblhTZWNvbmRzIiwgNSwgbG9jYWxpemVPcHRpb25zKTsKICAgICAgfSBlbHNlIGlmIChzZWNvbmRzIDwgMTApIHsKICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJsZXNzVGhhblhTZWNvbmRzIiwgMTAsIGxvY2FsaXplT3B0aW9ucyk7CiAgICAgIH0gZWxzZSBpZiAoc2Vjb25kcyA8IDIwKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgibGVzc1RoYW5YU2Vjb25kcyIsIDIwLCBsb2NhbGl6ZU9wdGlvbnMpOwogICAgICB9IGVsc2UgaWYgKHNlY29uZHMgPCA0MCkgewogICAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoImhhbGZBTWludXRlIiwgMCwgbG9jYWxpemVPcHRpb25zKTsKICAgICAgfSBlbHNlIGlmIChzZWNvbmRzIDwgNjApIHsKICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJsZXNzVGhhblhNaW51dGVzIiwgMSwgbG9jYWxpemVPcHRpb25zKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJ4TWludXRlcyIsIDEsIGxvY2FsaXplT3B0aW9ucyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChtaW51dGVzID09PSAwKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgibGVzc1RoYW5YTWludXRlcyIsIDEsIGxvY2FsaXplT3B0aW9ucyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieE1pbnV0ZXMiLCBtaW51dGVzLCBsb2NhbGl6ZU9wdGlvbnMpOwogICAgICB9CiAgICB9CiAgfSBlbHNlIGlmIChtaW51dGVzIDwgNDUpIHsKICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoInhNaW51dGVzIiwgbWludXRlcywgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKG1pbnV0ZXMgPCA5MCkgewogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgiYWJvdXRYSG91cnMiLCAxLCBsb2NhbGl6ZU9wdGlvbnMpOwogIH0gZWxzZSBpZiAobWludXRlcyA8IG1pbnV0ZXNJbkRheSkgewogICAgY29uc3QgaG91cnMgPSBNYXRoLnJvdW5kKG1pbnV0ZXMgLyA2MCk7CiAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJhYm91dFhIb3VycyIsIGhvdXJzLCBsb2NhbGl6ZU9wdGlvbnMpOwogIH0gZWxzZSBpZiAobWludXRlcyA8IG1pbnV0ZXNJbkFsbW9zdFR3b0RheXMpIHsKICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoInhEYXlzIiwgMSwgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKG1pbnV0ZXMgPCBtaW51dGVzSW5Nb250aCkgewogICAgY29uc3QgZGF5czIgPSBNYXRoLnJvdW5kKG1pbnV0ZXMgLyBtaW51dGVzSW5EYXkpOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieERheXMiLCBkYXlzMiwgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKG1pbnV0ZXMgPCBtaW51dGVzSW5Nb250aCAqIDIpIHsKICAgIG1vbnRoczIgPSBNYXRoLnJvdW5kKG1pbnV0ZXMgLyBtaW51dGVzSW5Nb250aCk7CiAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJhYm91dFhNb250aHMiLCBtb250aHMyLCBsb2NhbGl6ZU9wdGlvbnMpOwogIH0KICBtb250aHMyID0gZGlmZmVyZW5jZUluTW9udGhzKGVhcmxpZXJEYXRlXywgbGF0ZXJEYXRlXyk7CiAgaWYgKG1vbnRoczIgPCAxMikgewogICAgY29uc3QgbmVhcmVzdE1vbnRoID0gTWF0aC5yb3VuZChtaW51dGVzIC8gbWludXRlc0luTW9udGgpOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieE1vbnRocyIsIG5lYXJlc3RNb250aCwgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgewogICAgY29uc3QgbW9udGhzU2luY2VTdGFydE9mWWVhciA9IG1vbnRoczIgJSAxMjsKICAgIGNvbnN0IHllYXJzID0gTWF0aC50cnVuYyhtb250aHMyIC8gMTIpOwogICAgaWYgKG1vbnRoc1NpbmNlU3RhcnRPZlllYXIgPCAzKSB7CiAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoImFib3V0WFllYXJzIiwgeWVhcnMsIGxvY2FsaXplT3B0aW9ucyk7CiAgICB9IGVsc2UgaWYgKG1vbnRoc1NpbmNlU3RhcnRPZlllYXIgPCA5KSB7CiAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoIm92ZXJYWWVhcnMiLCB5ZWFycywgbG9jYWxpemVPcHRpb25zKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoImFsbW9zdFhZZWFycyIsIHllYXJzICsgMSwgbG9jYWxpemVPcHRpb25zKTsKICAgIH0KICB9Cn0KdmFyIGZvcm1hdERpc3RhbmNlX2RlZmF1bHQ7CnZhciBpbml0X2Zvcm1hdERpc3RhbmNlMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXREaXN0YW5jZS5qcyIoKSB7CiAgICBpbml0X2RlZmF1bHRMb2NhbGUoKTsKICAgIGluaXRfZGVmYXVsdE9wdGlvbnMoKTsKICAgIGluaXRfZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcygpOwogICAgaW5pdF9ub3JtYWxpemVEYXRlcygpOwogICAgaW5pdF9jb21wYXJlQXNjKCk7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5Nb250aHMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluU2Vjb25kcygpOwogICAgZm9ybWF0RGlzdGFuY2VfZGVmYXVsdCA9IGZvcm1hdERpc3RhbmNlMjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXREaXN0YW5jZVN0cmljdC5qcwpmdW5jdGlvbiBmb3JtYXREaXN0YW5jZVN0cmljdChsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZSA/PyBlblVTOwogIGNvbnN0IGNvbXBhcmlzb24gPSBjb21wYXJlQXNjKGxhdGVyRGF0ZSwgZWFybGllckRhdGUpOwogIGlmIChpc05hTihjb21wYXJpc29uKSkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdGltZSB2YWx1ZSIpOwogIH0KICBjb25zdCBsb2NhbGl6ZU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7CiAgICBhZGRTdWZmaXg6IG9wdGlvbnM/LmFkZFN1ZmZpeCwKICAgIGNvbXBhcmlzb24KICB9KTsKICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICAuLi5jb21wYXJpc29uID4gMCA/IFtlYXJsaWVyRGF0ZSwgbGF0ZXJEYXRlXSA6IFtsYXRlckRhdGUsIGVhcmxpZXJEYXRlXQogICk7CiAgY29uc3Qgcm91bmRpbmdNZXRob2QgPSBnZXRSb3VuZGluZ01ldGhvZChvcHRpb25zPy5yb3VuZGluZ01ldGhvZCA/PyAicm91bmQiKTsKICBjb25zdCBtaWxsaXNlY29uZHMyID0gZWFybGllckRhdGVfLmdldFRpbWUoKSAtIGxhdGVyRGF0ZV8uZ2V0VGltZSgpOwogIGNvbnN0IG1pbnV0ZXMgPSBtaWxsaXNlY29uZHMyIC8gbWlsbGlzZWNvbmRzSW5NaW51dGU7CiAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGVhcmxpZXJEYXRlXykgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGxhdGVyRGF0ZV8pOwogIGNvbnN0IGRzdE5vcm1hbGl6ZWRNaW51dGVzID0gKG1pbGxpc2Vjb25kczIgLSB0aW1lem9uZU9mZnNldCkgLyBtaWxsaXNlY29uZHNJbk1pbnV0ZTsKICBjb25zdCBkZWZhdWx0VW5pdCA9IG9wdGlvbnM/LnVuaXQ7CiAgbGV0IHVuaXQ7CiAgaWYgKCFkZWZhdWx0VW5pdCkgewogICAgaWYgKG1pbnV0ZXMgPCAxKSB7CiAgICAgIHVuaXQgPSAic2Vjb25kIjsKICAgIH0gZWxzZSBpZiAobWludXRlcyA8IDYwKSB7CiAgICAgIHVuaXQgPSAibWludXRlIjsKICAgIH0gZWxzZSBpZiAobWludXRlcyA8IG1pbnV0ZXNJbkRheSkgewogICAgICB1bml0ID0gImhvdXIiOwogICAgfSBlbHNlIGlmIChkc3ROb3JtYWxpemVkTWludXRlcyA8IG1pbnV0ZXNJbk1vbnRoKSB7CiAgICAgIHVuaXQgPSAiZGF5IjsKICAgIH0gZWxzZSBpZiAoZHN0Tm9ybWFsaXplZE1pbnV0ZXMgPCBtaW51dGVzSW5ZZWFyKSB7CiAgICAgIHVuaXQgPSAibW9udGgiOwogICAgfSBlbHNlIHsKICAgICAgdW5pdCA9ICJ5ZWFyIjsKICAgIH0KICB9IGVsc2UgewogICAgdW5pdCA9IGRlZmF1bHRVbml0OwogIH0KICBpZiAodW5pdCA9PT0gInNlY29uZCIpIHsKICAgIGNvbnN0IHNlY29uZHMgPSByb3VuZGluZ01ldGhvZChtaWxsaXNlY29uZHMyIC8gMWUzKTsKICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoInhTZWNvbmRzIiwgc2Vjb25kcywgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKHVuaXQgPT09ICJtaW51dGUiKSB7CiAgICBjb25zdCByb3VuZGVkTWludXRlcyA9IHJvdW5kaW5nTWV0aG9kKG1pbnV0ZXMpOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieE1pbnV0ZXMiLCByb3VuZGVkTWludXRlcywgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgaWYgKHVuaXQgPT09ICJob3VyIikgewogICAgY29uc3QgaG91cnMgPSByb3VuZGluZ01ldGhvZChtaW51dGVzIC8gNjApOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieEhvdXJzIiwgaG91cnMsIGxvY2FsaXplT3B0aW9ucyk7CiAgfSBlbHNlIGlmICh1bml0ID09PSAiZGF5IikgewogICAgY29uc3QgZGF5czIgPSByb3VuZGluZ01ldGhvZChkc3ROb3JtYWxpemVkTWludXRlcyAvIG1pbnV0ZXNJbkRheSk7CiAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJ4RGF5cyIsIGRheXMyLCBsb2NhbGl6ZU9wdGlvbnMpOwogIH0gZWxzZSBpZiAodW5pdCA9PT0gIm1vbnRoIikgewogICAgY29uc3QgbW9udGhzMiA9IHJvdW5kaW5nTWV0aG9kKGRzdE5vcm1hbGl6ZWRNaW51dGVzIC8gbWludXRlc0luTW9udGgpOwogICAgcmV0dXJuIG1vbnRoczIgPT09IDEyICYmIGRlZmF1bHRVbml0ICE9PSAibW9udGgiID8gbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJ4WWVhcnMiLCAxLCBsb2NhbGl6ZU9wdGlvbnMpIDogbG9jYWxlLmZvcm1hdERpc3RhbmNlKCJ4TW9udGhzIiwgbW9udGhzMiwgbG9jYWxpemVPcHRpb25zKTsKICB9IGVsc2UgewogICAgY29uc3QgeWVhcnMgPSByb3VuZGluZ01ldGhvZChkc3ROb3JtYWxpemVkTWludXRlcyAvIG1pbnV0ZXNJblllYXIpOwogICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZSgieFllYXJzIiwgeWVhcnMsIGxvY2FsaXplT3B0aW9ucyk7CiAgfQp9CnZhciBmb3JtYXREaXN0YW5jZVN0cmljdF9kZWZhdWx0Owp2YXIgaW5pdF9mb3JtYXREaXN0YW5jZVN0cmljdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXREaXN0YW5jZVN0cmljdC5qcyIoKSB7CiAgICBpbml0X2RlZmF1bHRMb2NhbGUoKTsKICAgIGluaXRfZGVmYXVsdE9wdGlvbnMoKTsKICAgIGluaXRfZ2V0Um91bmRpbmdNZXRob2QoKTsKICAgIGluaXRfZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcygpOwogICAgaW5pdF9ub3JtYWxpemVEYXRlcygpOwogICAgaW5pdF9jb21wYXJlQXNjKCk7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgZm9ybWF0RGlzdGFuY2VTdHJpY3RfZGVmYXVsdCA9IGZvcm1hdERpc3RhbmNlU3RyaWN0OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdERpc3RhbmNlVG9Ob3cuanMKZnVuY3Rpb24gZm9ybWF0RGlzdGFuY2VUb05vdyhkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGZvcm1hdERpc3RhbmNlMihkYXRlLCBjb25zdHJ1Y3ROb3coZGF0ZSksIG9wdGlvbnMpOwp9CnZhciBmb3JtYXREaXN0YW5jZVRvTm93X2RlZmF1bHQ7CnZhciBpbml0X2Zvcm1hdERpc3RhbmNlVG9Ob3cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0RGlzdGFuY2VUb05vdy5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdE5vdygpOwogICAgaW5pdF9mb3JtYXREaXN0YW5jZTIoKTsKICAgIGZvcm1hdERpc3RhbmNlVG9Ob3dfZGVmYXVsdCA9IGZvcm1hdERpc3RhbmNlVG9Ob3c7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0RGlzdGFuY2VUb05vd1N0cmljdC5qcwpmdW5jdGlvbiBmb3JtYXREaXN0YW5jZVRvTm93U3RyaWN0KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gZm9ybWF0RGlzdGFuY2VTdHJpY3QoZGF0ZSwgY29uc3RydWN0Tm93KGRhdGUpLCBvcHRpb25zKTsKfQp2YXIgZm9ybWF0RGlzdGFuY2VUb05vd1N0cmljdF9kZWZhdWx0Owp2YXIgaW5pdF9mb3JtYXREaXN0YW5jZVRvTm93U3RyaWN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3QuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3ROb3coKTsKICAgIGluaXRfZm9ybWF0RGlzdGFuY2VTdHJpY3QoKTsKICAgIGZvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3RfZGVmYXVsdCA9IGZvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3Q7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0RHVyYXRpb24uanMKZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24oZHVyYXRpb24sIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IGxvY2FsZSA9IG9wdGlvbnM/LmxvY2FsZSA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlID8/IGVuVVM7CiAgY29uc3QgZm9ybWF0MiA9IG9wdGlvbnM/LmZvcm1hdCA/PyBkZWZhdWx0Rm9ybWF0OwogIGNvbnN0IHplcm8gPSBvcHRpb25zPy56ZXJvID8/IGZhbHNlOwogIGNvbnN0IGRlbGltaXRlciA9IG9wdGlvbnM/LmRlbGltaXRlciA/PyAiICI7CiAgaWYgKCFsb2NhbGUuZm9ybWF0RGlzdGFuY2UpIHsKICAgIHJldHVybiAiIjsKICB9CiAgY29uc3QgcmVzdWx0ID0gZm9ybWF0Mi5yZWR1Y2UoKGFjYywgdW5pdCkgPT4gewogICAgY29uc3QgdG9rZW4gPSBgeCR7dW5pdC5yZXBsYWNlKC8oXi4pLywgKG03KSA9PiBtNy50b1VwcGVyQ2FzZSgpKX1gOwogICAgY29uc3QgdmFsdWUyID0gZHVyYXRpb25bdW5pdF07CiAgICBpZiAodmFsdWUyICE9PSB2b2lkIDAgJiYgKHplcm8gfHwgZHVyYXRpb25bdW5pdF0pKSB7CiAgICAgIHJldHVybiBhY2MuY29uY2F0KGxvY2FsZS5mb3JtYXREaXN0YW5jZSh0b2tlbiwgdmFsdWUyKSk7CiAgICB9CiAgICByZXR1cm4gYWNjOwogIH0sIFtdKS5qb2luKGRlbGltaXRlcik7CiAgcmV0dXJuIHJlc3VsdDsKfQp2YXIgZGVmYXVsdEZvcm1hdCwgZm9ybWF0RHVyYXRpb25fZGVmYXVsdDsKdmFyIGluaXRfZm9ybWF0RHVyYXRpb24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0RHVyYXRpb24uanMiKCkgewogICAgaW5pdF9kZWZhdWx0TG9jYWxlKCk7CiAgICBpbml0X2RlZmF1bHRPcHRpb25zKCk7CiAgICBkZWZhdWx0Rm9ybWF0ID0gWwogICAgICAieWVhcnMiLAogICAgICAibW9udGhzIiwKICAgICAgIndlZWtzIiwKICAgICAgImRheXMiLAogICAgICAiaG91cnMiLAogICAgICAibWludXRlcyIsCiAgICAgICJzZWNvbmRzIgogICAgXTsKICAgIGZvcm1hdER1cmF0aW9uX2RlZmF1bHQgPSBmb3JtYXREdXJhdGlvbjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXRJU08uanMKZnVuY3Rpb24gZm9ybWF0SVNPKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgaWYgKGlzTmFOKCtkYXRlXykpIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHRpbWUgdmFsdWUiKTsKICB9CiAgY29uc3QgZm9ybWF0MiA9IG9wdGlvbnM/LmZvcm1hdCA/PyAiZXh0ZW5kZWQiOwogIGNvbnN0IHJlcHJlc2VudGF0aW9uID0gb3B0aW9ucz8ucmVwcmVzZW50YXRpb24gPz8gImNvbXBsZXRlIjsKICBsZXQgcmVzdWx0ID0gIiI7CiAgbGV0IHR6T2Zmc2V0ID0gIiI7CiAgY29uc3QgZGF0ZURlbGltaXRlciA9IGZvcm1hdDIgPT09ICJleHRlbmRlZCIgPyAiLSIgOiAiIjsKICBjb25zdCB0aW1lRGVsaW1pdGVyID0gZm9ybWF0MiA9PT0gImV4dGVuZGVkIiA/ICI6IiA6ICIiOwogIGlmIChyZXByZXNlbnRhdGlvbiAhPT0gInRpbWUiKSB7CiAgICBjb25zdCBkYXkgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0RGF0ZSgpLCAyKTsKICAgIGNvbnN0IG1vbnRoID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldE1vbnRoKCkgKyAxLCAyKTsKICAgIGNvbnN0IHllYXIgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0RnVsbFllYXIoKSwgNCk7CiAgICByZXN1bHQgPSBgJHt5ZWFyfSR7ZGF0ZURlbGltaXRlcn0ke21vbnRofSR7ZGF0ZURlbGltaXRlcn0ke2RheX1gOwogIH0KICBpZiAocmVwcmVzZW50YXRpb24gIT09ICJkYXRlIikgewogICAgY29uc3Qgb2Zmc2V0ID0gZGF0ZV8uZ2V0VGltZXpvbmVPZmZzZXQoKTsKICAgIGlmIChvZmZzZXQgIT09IDApIHsKICAgICAgY29uc3QgYWJzb2x1dGVPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpOwogICAgICBjb25zdCBob3VyT2Zmc2V0ID0gYWRkTGVhZGluZ1plcm9zKE1hdGgudHJ1bmMoYWJzb2x1dGVPZmZzZXQgLyA2MCksIDIpOwogICAgICBjb25zdCBtaW51dGVPZmZzZXQgPSBhZGRMZWFkaW5nWmVyb3MoYWJzb2x1dGVPZmZzZXQgJSA2MCwgMik7CiAgICAgIGNvbnN0IHNpZ24gPSBvZmZzZXQgPCAwID8gIisiIDogIi0iOwogICAgICB0ek9mZnNldCA9IGAke3NpZ259JHtob3VyT2Zmc2V0fToke21pbnV0ZU9mZnNldH1gOwogICAgfSBlbHNlIHsKICAgICAgdHpPZmZzZXQgPSAiWiI7CiAgICB9CiAgICBjb25zdCBob3VyID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldEhvdXJzKCksIDIpOwogICAgY29uc3QgbWludXRlID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldE1pbnV0ZXMoKSwgMik7CiAgICBjb25zdCBzZWNvbmQgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0U2Vjb25kcygpLCAyKTsKICAgIGNvbnN0IHNlcGFyYXRvciA9IHJlc3VsdCA9PT0gIiIgPyAiIiA6ICJUIjsKICAgIGNvbnN0IHRpbWUgPSBbaG91ciwgbWludXRlLCBzZWNvbmRdLmpvaW4odGltZURlbGltaXRlcik7CiAgICByZXN1bHQgPSBgJHtyZXN1bHR9JHtzZXBhcmF0b3J9JHt0aW1lfSR7dHpPZmZzZXR9YDsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQp2YXIgZm9ybWF0SVNPX2RlZmF1bHQ7CnZhciBpbml0X2Zvcm1hdElTTyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXRJU08uanMiKCkgewogICAgaW5pdF9hZGRMZWFkaW5nWmVyb3MoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBmb3JtYXRJU09fZGVmYXVsdCA9IGZvcm1hdElTTzsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXRJU085MDc1LmpzCmZ1bmN0aW9uIGZvcm1hdElTTzkwNzUoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBpZiAoIWlzVmFsaWQoZGF0ZV8pKSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0aW1lIHZhbHVlIik7CiAgfQogIGNvbnN0IGZvcm1hdDIgPSBvcHRpb25zPy5mb3JtYXQgPz8gImV4dGVuZGVkIjsKICBjb25zdCByZXByZXNlbnRhdGlvbiA9IG9wdGlvbnM/LnJlcHJlc2VudGF0aW9uID8/ICJjb21wbGV0ZSI7CiAgbGV0IHJlc3VsdCA9ICIiOwogIGNvbnN0IGRhdGVEZWxpbWl0ZXIgPSBmb3JtYXQyID09PSAiZXh0ZW5kZWQiID8gIi0iIDogIiI7CiAgY29uc3QgdGltZURlbGltaXRlciA9IGZvcm1hdDIgPT09ICJleHRlbmRlZCIgPyAiOiIgOiAiIjsKICBpZiAocmVwcmVzZW50YXRpb24gIT09ICJ0aW1lIikgewogICAgY29uc3QgZGF5ID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldERhdGUoKSwgMik7CiAgICBjb25zdCBtb250aCA9IGFkZExlYWRpbmdaZXJvcyhkYXRlXy5nZXRNb250aCgpICsgMSwgMik7CiAgICBjb25zdCB5ZWFyID0gYWRkTGVhZGluZ1plcm9zKGRhdGVfLmdldEZ1bGxZZWFyKCksIDQpOwogICAgcmVzdWx0ID0gYCR7eWVhcn0ke2RhdGVEZWxpbWl0ZXJ9JHttb250aH0ke2RhdGVEZWxpbWl0ZXJ9JHtkYXl9YDsKICB9CiAgaWYgKHJlcHJlc2VudGF0aW9uICE9PSAiZGF0ZSIpIHsKICAgIGNvbnN0IGhvdXIgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0SG91cnMoKSwgMik7CiAgICBjb25zdCBtaW51dGUgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0TWludXRlcygpLCAyKTsKICAgIGNvbnN0IHNlY29uZCA9IGFkZExlYWRpbmdaZXJvcyhkYXRlXy5nZXRTZWNvbmRzKCksIDIpOwogICAgY29uc3Qgc2VwYXJhdG9yID0gcmVzdWx0ID09PSAiIiA/ICIiIDogIiAiOwogICAgcmVzdWx0ID0gYCR7cmVzdWx0fSR7c2VwYXJhdG9yfSR7aG91cn0ke3RpbWVEZWxpbWl0ZXJ9JHttaW51dGV9JHt0aW1lRGVsaW1pdGVyfSR7c2Vjb25kfWA7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KdmFyIGZvcm1hdElTTzkwNzVfZGVmYXVsdDsKdmFyIGluaXRfZm9ybWF0SVNPOTA3NSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXRJU085MDc1LmpzIigpIHsKICAgIGluaXRfYWRkTGVhZGluZ1plcm9zKCk7CiAgICBpbml0X2lzVmFsaWQoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBmb3JtYXRJU085MDc1X2RlZmF1bHQgPSBmb3JtYXRJU085MDc1OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdElTT0R1cmF0aW9uLmpzCmZ1bmN0aW9uIGZvcm1hdElTT0R1cmF0aW9uKGR1cmF0aW9uKSB7CiAgY29uc3QgewogICAgeWVhcnMgPSAwLAogICAgbW9udGhzOiBtb250aHMyID0gMCwKICAgIGRheXM6IGRheXMyID0gMCwKICAgIGhvdXJzID0gMCwKICAgIG1pbnV0ZXMgPSAwLAogICAgc2Vjb25kcyA9IDAKICB9ID0gZHVyYXRpb247CiAgcmV0dXJuIGBQJHt5ZWFyc31ZJHttb250aHMyfU0ke2RheXMyfURUJHtob3Vyc31IJHttaW51dGVzfU0ke3NlY29uZHN9U2A7Cn0KdmFyIGZvcm1hdElTT0R1cmF0aW9uX2RlZmF1bHQ7CnZhciBpbml0X2Zvcm1hdElTT0R1cmF0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdElTT0R1cmF0aW9uLmpzIigpIHsKICAgIGZvcm1hdElTT0R1cmF0aW9uX2RlZmF1bHQgPSBmb3JtYXRJU09EdXJhdGlvbjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXRSRkMzMzM5LmpzCmZ1bmN0aW9uIGZvcm1hdFJGQzMzMzkoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBpZiAoIWlzVmFsaWQoZGF0ZV8pKSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0aW1lIHZhbHVlIik7CiAgfQogIGNvbnN0IGZyYWN0aW9uRGlnaXRzID0gb3B0aW9ucz8uZnJhY3Rpb25EaWdpdHMgPz8gMDsKICBjb25zdCBkYXkgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0RGF0ZSgpLCAyKTsKICBjb25zdCBtb250aCA9IGFkZExlYWRpbmdaZXJvcyhkYXRlXy5nZXRNb250aCgpICsgMSwgMik7CiAgY29uc3QgeWVhciA9IGRhdGVfLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgaG91ciA9IGFkZExlYWRpbmdaZXJvcyhkYXRlXy5nZXRIb3VycygpLCAyKTsKICBjb25zdCBtaW51dGUgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0TWludXRlcygpLCAyKTsKICBjb25zdCBzZWNvbmQgPSBhZGRMZWFkaW5nWmVyb3MoZGF0ZV8uZ2V0U2Vjb25kcygpLCAyKTsKICBsZXQgZnJhY3Rpb25hbFNlY29uZCA9ICIiOwogIGlmIChmcmFjdGlvbkRpZ2l0cyA+IDApIHsKICAgIGNvbnN0IG1pbGxpc2Vjb25kczIgPSBkYXRlXy5nZXRNaWxsaXNlY29uZHMoKTsKICAgIGNvbnN0IGZyYWN0aW9uYWxTZWNvbmRzID0gTWF0aC50cnVuYygKICAgICAgbWlsbGlzZWNvbmRzMiAqIE1hdGgucG93KDEwLCBmcmFjdGlvbkRpZ2l0cyAtIDMpCiAgICApOwogICAgZnJhY3Rpb25hbFNlY29uZCA9ICIuIiArIGFkZExlYWRpbmdaZXJvcyhmcmFjdGlvbmFsU2Vjb25kcywgZnJhY3Rpb25EaWdpdHMpOwogIH0KICBsZXQgb2Zmc2V0ID0gIiI7CiAgY29uc3QgdHpPZmZzZXQgPSBkYXRlXy5nZXRUaW1lem9uZU9mZnNldCgpOwogIGlmICh0ek9mZnNldCAhPT0gMCkgewogICAgY29uc3QgYWJzb2x1dGVPZmZzZXQgPSBNYXRoLmFicyh0ek9mZnNldCk7CiAgICBjb25zdCBob3VyT2Zmc2V0ID0gYWRkTGVhZGluZ1plcm9zKE1hdGgudHJ1bmMoYWJzb2x1dGVPZmZzZXQgLyA2MCksIDIpOwogICAgY29uc3QgbWludXRlT2Zmc2V0ID0gYWRkTGVhZGluZ1plcm9zKGFic29sdXRlT2Zmc2V0ICUgNjAsIDIpOwogICAgY29uc3Qgc2lnbiA9IHR6T2Zmc2V0IDwgMCA/ICIrIiA6ICItIjsKICAgIG9mZnNldCA9IGAke3NpZ259JHtob3VyT2Zmc2V0fToke21pbnV0ZU9mZnNldH1gOwogIH0gZWxzZSB7CiAgICBvZmZzZXQgPSAiWiI7CiAgfQogIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1UJHtob3VyfToke21pbnV0ZX06JHtzZWNvbmR9JHtmcmFjdGlvbmFsU2Vjb25kfSR7b2Zmc2V0fWA7Cn0KdmFyIGZvcm1hdFJGQzMzMzlfZGVmYXVsdDsKdmFyIGluaXRfZm9ybWF0UkZDMzMzOSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXRSRkMzMzM5LmpzIigpIHsKICAgIGluaXRfYWRkTGVhZGluZ1plcm9zKCk7CiAgICBpbml0X2lzVmFsaWQoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBmb3JtYXRSRkMzMzM5X2RlZmF1bHQgPSBmb3JtYXRSRkMzMzM5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdFJGQzcyMzEuanMKZnVuY3Rpb24gZm9ybWF0UkZDNzIzMShkYXRlKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSk7CiAgaWYgKCFpc1ZhbGlkKF9kYXRlKSkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdGltZSB2YWx1ZSIpOwogIH0KICBjb25zdCBkYXlOYW1lID0gZGF5c1tfZGF0ZS5nZXRVVENEYXkoKV07CiAgY29uc3QgZGF5T2ZNb250aCA9IGFkZExlYWRpbmdaZXJvcyhfZGF0ZS5nZXRVVENEYXRlKCksIDIpOwogIGNvbnN0IG1vbnRoTmFtZSA9IG1vbnRoc1tfZGF0ZS5nZXRVVENNb250aCgpXTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0VVRDRnVsbFllYXIoKTsKICBjb25zdCBob3VyID0gYWRkTGVhZGluZ1plcm9zKF9kYXRlLmdldFVUQ0hvdXJzKCksIDIpOwogIGNvbnN0IG1pbnV0ZSA9IGFkZExlYWRpbmdaZXJvcyhfZGF0ZS5nZXRVVENNaW51dGVzKCksIDIpOwogIGNvbnN0IHNlY29uZCA9IGFkZExlYWRpbmdaZXJvcyhfZGF0ZS5nZXRVVENTZWNvbmRzKCksIDIpOwogIHJldHVybiBgJHtkYXlOYW1lfSwgJHtkYXlPZk1vbnRofSAke21vbnRoTmFtZX0gJHt5ZWFyfSAke2hvdXJ9OiR7bWludXRlfToke3NlY29uZH0gR01UYDsKfQp2YXIgZGF5cywgbW9udGhzLCBmb3JtYXRSRkM3MjMxX2RlZmF1bHQ7CnZhciBpbml0X2Zvcm1hdFJGQzcyMzEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0UkZDNzIzMS5qcyIoKSB7CiAgICBpbml0X2FkZExlYWRpbmdaZXJvcygpOwogICAgaW5pdF9pc1ZhbGlkKCk7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZGF5cyA9IFsiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0Il07CiAgICBtb250aHMgPSBbCiAgICAgICJKYW4iLAogICAgICAiRmViIiwKICAgICAgIk1hciIsCiAgICAgICJBcHIiLAogICAgICAiTWF5IiwKICAgICAgIkp1biIsCiAgICAgICJKdWwiLAogICAgICAiQXVnIiwKICAgICAgIlNlcCIsCiAgICAgICJPY3QiLAogICAgICAiTm92IiwKICAgICAgIkRlYyIKICAgIF07CiAgICBmb3JtYXRSRkM3MjMxX2RlZmF1bHQgPSBmb3JtYXRSRkM3MjMxOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdFJlbGF0aXZlLmpzCmZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlMihkYXRlLCBiYXNlRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtkYXRlXywgYmFzZURhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKG9wdGlvbnM/LmluLCBkYXRlLCBiYXNlRGF0ZSk7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZSA/PyBlblVTOwogIGNvbnN0IHdlZWtTdGFydHNPbiA9IG9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyAwOwogIGNvbnN0IGRpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZGF0ZV8sIGJhc2VEYXRlXyk7CiAgaWYgKGlzTmFOKGRpZmYpKSB7CiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0aW1lIHZhbHVlIik7CiAgfQogIGxldCB0b2tlbjsKICBpZiAoZGlmZiA8IC02KSB7CiAgICB0b2tlbiA9ICJvdGhlciI7CiAgfSBlbHNlIGlmIChkaWZmIDwgLTEpIHsKICAgIHRva2VuID0gImxhc3RXZWVrIjsKICB9IGVsc2UgaWYgKGRpZmYgPCAwKSB7CiAgICB0b2tlbiA9ICJ5ZXN0ZXJkYXkiOwogIH0gZWxzZSBpZiAoZGlmZiA8IDEpIHsKICAgIHRva2VuID0gInRvZGF5IjsKICB9IGVsc2UgaWYgKGRpZmYgPCAyKSB7CiAgICB0b2tlbiA9ICJ0b21vcnJvdyI7CiAgfSBlbHNlIGlmIChkaWZmIDwgNykgewogICAgdG9rZW4gPSAibmV4dFdlZWsiOwogIH0gZWxzZSB7CiAgICB0b2tlbiA9ICJvdGhlciI7CiAgfQogIGNvbnN0IGZvcm1hdFN0ciA9IGxvY2FsZS5mb3JtYXRSZWxhdGl2ZSh0b2tlbiwgZGF0ZV8sIGJhc2VEYXRlXywgewogICAgbG9jYWxlLAogICAgd2Vla1N0YXJ0c09uCiAgfSk7CiAgcmV0dXJuIGZvcm1hdChkYXRlXywgZm9ybWF0U3RyLCB7IGxvY2FsZSwgd2Vla1N0YXJ0c09uIH0pOwp9CnZhciBmb3JtYXRSZWxhdGl2ZV9kZWZhdWx0Owp2YXIgaW5pdF9mb3JtYXRSZWxhdGl2ZTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0UmVsYXRpdmUuanMiKCkgewogICAgaW5pdF9kZWZhdWx0TG9jYWxlKCk7CiAgICBpbml0X2RlZmF1bHRPcHRpb25zKCk7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cygpOwogICAgaW5pdF9mb3JtYXQoKTsKICAgIGZvcm1hdFJlbGF0aXZlX2RlZmF1bHQgPSBmb3JtYXRSZWxhdGl2ZTI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZnJvbVVuaXhUaW1lLmpzCmZ1bmN0aW9uIGZyb21Vbml4VGltZSh1bml4VGltZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUodW5peFRpbWUgKiAxZTMsIG9wdGlvbnM/LmluKTsKfQp2YXIgZnJvbVVuaXhUaW1lX2RlZmF1bHQ7CnZhciBpbml0X2Zyb21Vbml4VGltZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mcm9tVW5peFRpbWUuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGZyb21Vbml4VGltZV9kZWZhdWx0ID0gZnJvbVVuaXhUaW1lOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERhdGUuanMKZnVuY3Rpb24gZ2V0RGF0ZShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbikuZ2V0RGF0ZSgpOwp9CnZhciBnZXREYXRlX2RlZmF1bHQ7CnZhciBpbml0X2dldERhdGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGF0ZS5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZ2V0RGF0ZV9kZWZhdWx0ID0gZ2V0RGF0ZTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREYXkuanMKZnVuY3Rpb24gZ2V0RGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKTsKfQp2YXIgZ2V0RGF5X2RlZmF1bHQ7CnZhciBpbml0X2dldERheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREYXkuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGdldERheV9kZWZhdWx0ID0gZ2V0RGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERheXNJbk1vbnRoLmpzCmZ1bmN0aW9uIGdldERheXNJbk1vbnRoKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgbW9udGhJbmRleCA9IF9kYXRlLmdldE1vbnRoKCk7CiAgY29uc3QgbGFzdERheU9mTW9udGgyID0gY29uc3RydWN0RnJvbShfZGF0ZSwgMCk7CiAgbGFzdERheU9mTW9udGgyLnNldEZ1bGxZZWFyKHllYXIsIG1vbnRoSW5kZXggKyAxLCAwKTsKICBsYXN0RGF5T2ZNb250aDIuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgcmV0dXJuIGxhc3REYXlPZk1vbnRoMi5nZXREYXRlKCk7Cn0KdmFyIGdldERheXNJbk1vbnRoX2RlZmF1bHQ7CnZhciBpbml0X2dldERheXNJbk1vbnRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERheXNJbk1vbnRoLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGdldERheXNJbk1vbnRoX2RlZmF1bHQgPSBnZXREYXlzSW5Nb250aDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0xlYXBZZWFyLmpzCmZ1bmN0aW9uIGlzTGVhcFllYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTsKICByZXR1cm4geWVhciAlIDQwMCA9PT0gMCB8fCB5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwOwp9CnZhciBpc0xlYXBZZWFyX2RlZmF1bHQ7CnZhciBpbml0X2lzTGVhcFllYXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNMZWFwWWVhci5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgaXNMZWFwWWVhcl9kZWZhdWx0ID0gaXNMZWFwWWVhcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREYXlzSW5ZZWFyLmpzCmZ1bmN0aW9uIGdldERheXNJblllYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBpZiAoTnVtYmVyLmlzTmFOKCtfZGF0ZSkpIHJldHVybiBOYU47CiAgcmV0dXJuIGlzTGVhcFllYXIoX2RhdGUpID8gMzY2IDogMzY1Owp9CnZhciBnZXREYXlzSW5ZZWFyX2RlZmF1bHQ7CnZhciBpbml0X2dldERheXNJblllYXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGF5c0luWWVhci5qcyIoKSB7CiAgICBpbml0X2lzTGVhcFllYXIoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBnZXREYXlzSW5ZZWFyX2RlZmF1bHQgPSBnZXREYXlzSW5ZZWFyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERlY2FkZS5qcwpmdW5jdGlvbiBnZXREZWNhZGUoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTsKICBjb25zdCBkZWNhZGUgPSBNYXRoLmZsb29yKHllYXIgLyAxMCkgKiAxMDsKICByZXR1cm4gZGVjYWRlOwp9CnZhciBnZXREZWNhZGVfZGVmYXVsdDsKdmFyIGluaXRfZ2V0RGVjYWRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERlY2FkZS5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZ2V0RGVjYWRlX2RlZmF1bHQgPSBnZXREZWNhZGU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGVmYXVsdE9wdGlvbnMuanMKZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnMyKCkgewogIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBnZXREZWZhdWx0T3B0aW9ucygpKTsKfQp2YXIgZ2V0RGVmYXVsdE9wdGlvbnNfZGVmYXVsdDsKdmFyIGluaXRfZ2V0RGVmYXVsdE9wdGlvbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGVmYXVsdE9wdGlvbnMuanMiKCkgewogICAgaW5pdF9kZWZhdWx0T3B0aW9ucygpOwogICAgZ2V0RGVmYXVsdE9wdGlvbnNfZGVmYXVsdCA9IGdldERlZmF1bHRPcHRpb25zMjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRIb3Vycy5qcwpmdW5jdGlvbiBnZXRIb3VycyhkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbikuZ2V0SG91cnMoKTsKfQp2YXIgZ2V0SG91cnNfZGVmYXVsdDsKdmFyIGluaXRfZ2V0SG91cnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SG91cnMuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGdldEhvdXJzX2RlZmF1bHQgPSBnZXRIb3VyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRJU09EYXkuanMKZnVuY3Rpb24gZ2V0SVNPRGF5KGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXkgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldERheSgpOwogIHJldHVybiBkYXkgPT09IDAgPyA3IDogZGF5Owp9CnZhciBnZXRJU09EYXlfZGVmYXVsdDsKdmFyIGluaXRfZ2V0SVNPRGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT0RheS5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZ2V0SVNPRGF5X2RlZmF1bHQgPSBnZXRJU09EYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SVNPV2Vla3NJblllYXIuanMKZnVuY3Rpb24gZ2V0SVNPV2Vla3NJblllYXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IHRoaXNZZWFyID0gc3RhcnRPZklTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpOwogIGNvbnN0IG5leHRZZWFyID0gc3RhcnRPZklTT1dlZWtZZWFyKGFkZFdlZWtzKHRoaXNZZWFyLCA2MCkpOwogIGNvbnN0IGRpZmYgPSArbmV4dFllYXIgLSArdGhpc1llYXI7CiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIG1pbGxpc2Vjb25kc0luV2Vlayk7Cn0KdmFyIGdldElTT1dlZWtzSW5ZZWFyX2RlZmF1bHQ7CnZhciBpbml0X2dldElTT1dlZWtzSW5ZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT1dlZWtzSW5ZZWFyLmpzIigpIHsKICAgIGluaXRfYWRkV2Vla3MoKTsKICAgIGluaXRfY29uc3RhbnRzKCk7CiAgICBpbml0X3N0YXJ0T2ZJU09XZWVrWWVhcigpOwogICAgZ2V0SVNPV2Vla3NJblllYXJfZGVmYXVsdCA9IGdldElTT1dlZWtzSW5ZZWFyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldE1pbGxpc2Vjb25kcy5qcwpmdW5jdGlvbiBnZXRNaWxsaXNlY29uZHMoZGF0ZSkgewogIHJldHVybiB0b0RhdGUoZGF0ZSkuZ2V0TWlsbGlzZWNvbmRzKCk7Cn0KdmFyIGdldE1pbGxpc2Vjb25kc19kZWZhdWx0Owp2YXIgaW5pdF9nZXRNaWxsaXNlY29uZHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0TWlsbGlzZWNvbmRzLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBnZXRNaWxsaXNlY29uZHNfZGVmYXVsdCA9IGdldE1pbGxpc2Vjb25kczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRNaW51dGVzLmpzCmZ1bmN0aW9uIGdldE1pbnV0ZXMoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldE1pbnV0ZXMoKTsKfQp2YXIgZ2V0TWludXRlc19kZWZhdWx0Owp2YXIgaW5pdF9nZXRNaW51dGVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldE1pbnV0ZXMuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGdldE1pbnV0ZXNfZGVmYXVsdCA9IGdldE1pbnV0ZXM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0TW9udGguanMKZnVuY3Rpb24gZ2V0TW9udGgoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldE1vbnRoKCk7Cn0KdmFyIGdldE1vbnRoX2RlZmF1bHQ7CnZhciBpbml0X2dldE1vbnRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldE1vbnRoLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBnZXRNb250aF9kZWZhdWx0ID0gZ2V0TW9udGg7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0T3ZlcmxhcHBpbmdEYXlzSW5JbnRlcnZhbHMuanMKZnVuY3Rpb24gZ2V0T3ZlcmxhcHBpbmdEYXlzSW5JbnRlcnZhbHMoaW50ZXJ2YWxMZWZ0LCBpbnRlcnZhbFJpZ2h0KSB7CiAgY29uc3QgW2xlZnRTdGFydCwgbGVmdEVuZF0gPSBbCiAgICArdG9EYXRlKGludGVydmFsTGVmdC5zdGFydCksCiAgICArdG9EYXRlKGludGVydmFsTGVmdC5lbmQpCiAgXS5zb3J0KChhNSwgYjYpID0+IGE1IC0gYjYpOwogIGNvbnN0IFtyaWdodFN0YXJ0LCByaWdodEVuZF0gPSBbCiAgICArdG9EYXRlKGludGVydmFsUmlnaHQuc3RhcnQpLAogICAgK3RvRGF0ZShpbnRlcnZhbFJpZ2h0LmVuZCkKICBdLnNvcnQoKGE1LCBiNikgPT4gYTUgLSBiNik7CiAgY29uc3QgaXNPdmVybGFwcGluZyA9IGxlZnRTdGFydCA8IHJpZ2h0RW5kICYmIHJpZ2h0U3RhcnQgPCBsZWZ0RW5kOwogIGlmICghaXNPdmVybGFwcGluZykgcmV0dXJuIDA7CiAgY29uc3Qgb3ZlcmxhcExlZnQgPSByaWdodFN0YXJ0IDwgbGVmdFN0YXJ0ID8gbGVmdFN0YXJ0IDogcmlnaHRTdGFydDsKICBjb25zdCBsZWZ0ID0gb3ZlcmxhcExlZnQgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKG92ZXJsYXBMZWZ0KTsKICBjb25zdCBvdmVybGFwUmlnaHQgPSByaWdodEVuZCA+IGxlZnRFbmQgPyBsZWZ0RW5kIDogcmlnaHRFbmQ7CiAgY29uc3QgcmlnaHQgPSBvdmVybGFwUmlnaHQgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKG92ZXJsYXBSaWdodCk7CiAgcmV0dXJuIE1hdGguY2VpbCgocmlnaHQgLSBsZWZ0KSAvIG1pbGxpc2Vjb25kc0luRGF5KTsKfQp2YXIgZ2V0T3ZlcmxhcHBpbmdEYXlzSW5JbnRlcnZhbHNfZGVmYXVsdDsKdmFyIGluaXRfZ2V0T3ZlcmxhcHBpbmdEYXlzSW5JbnRlcnZhbHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0T3ZlcmxhcHBpbmdEYXlzSW5JbnRlcnZhbHMuanMiKCkgewogICAgaW5pdF9nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKCk7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGdldE92ZXJsYXBwaW5nRGF5c0luSW50ZXJ2YWxzX2RlZmF1bHQgPSBnZXRPdmVybGFwcGluZ0RheXNJbkludGVydmFsczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRTZWNvbmRzLmpzCmZ1bmN0aW9uIGdldFNlY29uZHMoZGF0ZSkgewogIHJldHVybiB0b0RhdGUoZGF0ZSkuZ2V0U2Vjb25kcygpOwp9CnZhciBnZXRTZWNvbmRzX2RlZmF1bHQ7CnZhciBpbml0X2dldFNlY29uZHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0U2Vjb25kcy5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZ2V0U2Vjb25kc19kZWZhdWx0ID0gZ2V0U2Vjb25kczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRUaW1lLmpzCmZ1bmN0aW9uIGdldFRpbWUoZGF0ZSkgewogIHJldHVybiArdG9EYXRlKGRhdGUpOwp9CnZhciBnZXRUaW1lX2RlZmF1bHQ7CnZhciBpbml0X2dldFRpbWUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0VGltZS5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZ2V0VGltZV9kZWZhdWx0ID0gZ2V0VGltZTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRVbml4VGltZS5qcwpmdW5jdGlvbiBnZXRVbml4VGltZShkYXRlKSB7CiAgcmV0dXJuIE1hdGgudHJ1bmMoK3RvRGF0ZShkYXRlKSAvIDFlMyk7Cn0KdmFyIGdldFVuaXhUaW1lX2RlZmF1bHQ7CnZhciBpbml0X2dldFVuaXhUaW1lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFVuaXhUaW1lLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBnZXRVbml4VGltZV9kZWZhdWx0ID0gZ2V0VW5peFRpbWU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0V2Vla09mTW9udGguanMKZnVuY3Rpb24gZ2V0V2Vla09mTW9udGgoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRlZmF1bHRPcHRpb25zMiA9IGdldERlZmF1bHRPcHRpb25zKCk7CiAgY29uc3Qgd2Vla1N0YXJ0c09uID0gb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi53ZWVrU3RhcnRzT24gPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IDA7CiAgY29uc3QgY3VycmVudERheU9mTW9udGggPSBnZXREYXRlKHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbikpOwogIGlmIChpc05hTihjdXJyZW50RGF5T2ZNb250aCkpIHJldHVybiBOYU47CiAgY29uc3Qgc3RhcnRXZWVrRGF5ID0gZ2V0RGF5KHN0YXJ0T2ZNb250aChkYXRlLCBvcHRpb25zKSk7CiAgbGV0IGxhc3REYXlPZkZpcnN0V2VlayA9IHdlZWtTdGFydHNPbiAtIHN0YXJ0V2Vla0RheTsKICBpZiAobGFzdERheU9mRmlyc3RXZWVrIDw9IDApIGxhc3REYXlPZkZpcnN0V2VlayArPSA3OwogIGNvbnN0IHJlbWFpbmluZ0RheXNBZnRlckZpcnN0V2VlayA9IGN1cnJlbnREYXlPZk1vbnRoIC0gbGFzdERheU9mRmlyc3RXZWVrOwogIHJldHVybiBNYXRoLmNlaWwocmVtYWluaW5nRGF5c0FmdGVyRmlyc3RXZWVrIC8gNykgKyAxOwp9CnZhciBnZXRXZWVrT2ZNb250aF9kZWZhdWx0Owp2YXIgaW5pdF9nZXRXZWVrT2ZNb250aCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRXZWVrT2ZNb250aC5qcyIoKSB7CiAgICBpbml0X2RlZmF1bHRPcHRpb25zKCk7CiAgICBpbml0X2dldERhdGUoKTsKICAgIGluaXRfZ2V0RGF5KCk7CiAgICBpbml0X3N0YXJ0T2ZNb250aCgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGdldFdlZWtPZk1vbnRoX2RlZmF1bHQgPSBnZXRXZWVrT2ZNb250aDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sYXN0RGF5T2ZNb250aC5qcwpmdW5jdGlvbiBsYXN0RGF5T2ZNb250aChkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IG1vbnRoID0gX2RhdGUuZ2V0TW9udGgoKTsKICBfZGF0ZS5zZXRGdWxsWWVhcihfZGF0ZS5nZXRGdWxsWWVhcigpLCBtb250aCArIDEsIDApOwogIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiB0b0RhdGUoX2RhdGUsIG9wdGlvbnM/LmluKTsKfQp2YXIgbGFzdERheU9mTW9udGhfZGVmYXVsdDsKdmFyIGluaXRfbGFzdERheU9mTW9udGggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbGFzdERheU9mTW9udGguanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGxhc3REYXlPZk1vbnRoX2RlZmF1bHQgPSBsYXN0RGF5T2ZNb250aDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRXZWVrc0luTW9udGguanMKZnVuY3Rpb24gZ2V0V2Vla3NJbk1vbnRoKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBjb250ZXh0RGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgcmV0dXJuIGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MoCiAgICBsYXN0RGF5T2ZNb250aChjb250ZXh0RGF0ZSwgb3B0aW9ucyksCiAgICBzdGFydE9mTW9udGgoY29udGV4dERhdGUsIG9wdGlvbnMpLAogICAgb3B0aW9ucwogICkgKyAxOwp9CnZhciBnZXRXZWVrc0luTW9udGhfZGVmYXVsdDsKdmFyIGluaXRfZ2V0V2Vla3NJbk1vbnRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFdlZWtzSW5Nb250aC5qcyIoKSB7CiAgICBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MoKTsKICAgIGluaXRfbGFzdERheU9mTW9udGgoKTsKICAgIGluaXRfc3RhcnRPZk1vbnRoKCk7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZ2V0V2Vla3NJbk1vbnRoX2RlZmF1bHQgPSBnZXRXZWVrc0luTW9udGg7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0WWVhci5qcwpmdW5jdGlvbiBnZXRZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXRGdWxsWWVhcigpOwp9CnZhciBnZXRZZWFyX2RlZmF1bHQ7CnZhciBpbml0X2dldFllYXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0WWVhci5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgZ2V0WWVhcl9kZWZhdWx0ID0gZ2V0WWVhcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9ob3Vyc1RvTWlsbGlzZWNvbmRzLmpzCmZ1bmN0aW9uIGhvdXJzVG9NaWxsaXNlY29uZHMoaG91cnMpIHsKICByZXR1cm4gTWF0aC50cnVuYyhob3VycyAqIG1pbGxpc2Vjb25kc0luSG91cik7Cn0KdmFyIGhvdXJzVG9NaWxsaXNlY29uZHNfZGVmYXVsdDsKdmFyIGluaXRfaG91cnNUb01pbGxpc2Vjb25kcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9ob3Vyc1RvTWlsbGlzZWNvbmRzLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzKCk7CiAgICBob3Vyc1RvTWlsbGlzZWNvbmRzX2RlZmF1bHQgPSBob3Vyc1RvTWlsbGlzZWNvbmRzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2hvdXJzVG9NaW51dGVzLmpzCmZ1bmN0aW9uIGhvdXJzVG9NaW51dGVzKGhvdXJzKSB7CiAgcmV0dXJuIE1hdGgudHJ1bmMoaG91cnMgKiBtaW51dGVzSW5Ib3VyKTsKfQp2YXIgaG91cnNUb01pbnV0ZXNfZGVmYXVsdDsKdmFyIGluaXRfaG91cnNUb01pbnV0ZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaG91cnNUb01pbnV0ZXMuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIGhvdXJzVG9NaW51dGVzX2RlZmF1bHQgPSBob3Vyc1RvTWludXRlczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9ob3Vyc1RvU2Vjb25kcy5qcwpmdW5jdGlvbiBob3Vyc1RvU2Vjb25kcyhob3VycykgewogIHJldHVybiBNYXRoLnRydW5jKGhvdXJzICogc2Vjb25kc0luSG91cik7Cn0KdmFyIGhvdXJzVG9TZWNvbmRzX2RlZmF1bHQ7CnZhciBpbml0X2hvdXJzVG9TZWNvbmRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2hvdXJzVG9TZWNvbmRzLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzKCk7CiAgICBob3Vyc1RvU2Vjb25kc19kZWZhdWx0ID0gaG91cnNUb1NlY29uZHM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaW50ZXJ2YWwuanMKZnVuY3Rpb24gaW50ZXJ2YWwyKHN0YXJ0LCBlbmQzLCBvcHRpb25zKSB7CiAgY29uc3QgW19zdGFydCwgX2VuZF0gPSBub3JtYWxpemVEYXRlcyhvcHRpb25zPy5pbiwgc3RhcnQsIGVuZDMpOwogIGlmIChpc05hTigrX3N0YXJ0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3RhcnQgZGF0ZSBpcyBpbnZhbGlkIik7CiAgaWYgKGlzTmFOKCtfZW5kKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiRW5kIGRhdGUgaXMgaW52YWxpZCIpOwogIGlmIChvcHRpb25zPy5hc3NlcnRQb3NpdGl2ZSAmJiArX3N0YXJ0ID4gK19lbmQpCiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFbmQgZGF0ZSBtdXN0IGJlIGFmdGVyIHN0YXJ0IGRhdGUiKTsKICByZXR1cm4geyBzdGFydDogX3N0YXJ0LCBlbmQ6IF9lbmQgfTsKfQp2YXIgaW50ZXJ2YWxfZGVmYXVsdDsKdmFyIGluaXRfaW50ZXJ2YWwyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2ludGVydmFsLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplRGF0ZXMoKTsKICAgIGludGVydmFsX2RlZmF1bHQgPSBpbnRlcnZhbDI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaW50ZXJ2YWxUb0R1cmF0aW9uLmpzCmZ1bmN0aW9uIGludGVydmFsVG9EdXJhdGlvbihpbnRlcnZhbDMsIG9wdGlvbnMpIHsKICBjb25zdCB7IHN0YXJ0LCBlbmQ6IGVuZDMgfSA9IG5vcm1hbGl6ZUludGVydmFsKG9wdGlvbnM/LmluLCBpbnRlcnZhbDMpOwogIGNvbnN0IGR1cmF0aW9uID0ge307CiAgY29uc3QgeWVhcnMgPSBkaWZmZXJlbmNlSW5ZZWFycyhlbmQzLCBzdGFydCk7CiAgaWYgKHllYXJzKSBkdXJhdGlvbi55ZWFycyA9IHllYXJzOwogIGNvbnN0IHJlbWFpbmluZ01vbnRocyA9IGFkZChzdGFydCwgeyB5ZWFyczogZHVyYXRpb24ueWVhcnMgfSk7CiAgY29uc3QgbW9udGhzMiA9IGRpZmZlcmVuY2VJbk1vbnRocyhlbmQzLCByZW1haW5pbmdNb250aHMpOwogIGlmIChtb250aHMyKSBkdXJhdGlvbi5tb250aHMgPSBtb250aHMyOwogIGNvbnN0IHJlbWFpbmluZ0RheXMgPSBhZGQocmVtYWluaW5nTW9udGhzLCB7IG1vbnRoczogZHVyYXRpb24ubW9udGhzIH0pOwogIGNvbnN0IGRheXMyID0gZGlmZmVyZW5jZUluRGF5cyhlbmQzLCByZW1haW5pbmdEYXlzKTsKICBpZiAoZGF5czIpIGR1cmF0aW9uLmRheXMgPSBkYXlzMjsKICBjb25zdCByZW1haW5pbmdIb3VycyA9IGFkZChyZW1haW5pbmdEYXlzLCB7IGRheXM6IGR1cmF0aW9uLmRheXMgfSk7CiAgY29uc3QgaG91cnMgPSBkaWZmZXJlbmNlSW5Ib3VycyhlbmQzLCByZW1haW5pbmdIb3Vycyk7CiAgaWYgKGhvdXJzKSBkdXJhdGlvbi5ob3VycyA9IGhvdXJzOwogIGNvbnN0IHJlbWFpbmluZ01pbnV0ZXMgPSBhZGQocmVtYWluaW5nSG91cnMsIHsgaG91cnM6IGR1cmF0aW9uLmhvdXJzIH0pOwogIGNvbnN0IG1pbnV0ZXMgPSBkaWZmZXJlbmNlSW5NaW51dGVzKGVuZDMsIHJlbWFpbmluZ01pbnV0ZXMpOwogIGlmIChtaW51dGVzKSBkdXJhdGlvbi5taW51dGVzID0gbWludXRlczsKICBjb25zdCByZW1haW5pbmdTZWNvbmRzID0gYWRkKHJlbWFpbmluZ01pbnV0ZXMsIHsgbWludXRlczogZHVyYXRpb24ubWludXRlcyB9KTsKICBjb25zdCBzZWNvbmRzID0gZGlmZmVyZW5jZUluU2Vjb25kcyhlbmQzLCByZW1haW5pbmdTZWNvbmRzKTsKICBpZiAoc2Vjb25kcykgZHVyYXRpb24uc2Vjb25kcyA9IHNlY29uZHM7CiAgcmV0dXJuIGR1cmF0aW9uOwp9CnZhciBpbnRlcnZhbFRvRHVyYXRpb25fZGVmYXVsdDsKdmFyIGluaXRfaW50ZXJ2YWxUb0R1cmF0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2ludGVydmFsVG9EdXJhdGlvbi5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZUludGVydmFsKCk7CiAgICBpbml0X2FkZCgpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5EYXlzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkhvdXJzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbk1pbnV0ZXMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluTW9udGhzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJblNlY29uZHMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluWWVhcnMoKTsKICAgIGludGVydmFsVG9EdXJhdGlvbl9kZWZhdWx0ID0gaW50ZXJ2YWxUb0R1cmF0aW9uOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2ludGxGb3JtYXQuanMKZnVuY3Rpb24gaW50bEZvcm1hdChkYXRlLCBmb3JtYXRPckxvY2FsZSwgbG9jYWxlT3B0aW9ucykgewogIGxldCBmb3JtYXRPcHRpb25zOwogIGlmIChpc0Zvcm1hdE9wdGlvbnMoZm9ybWF0T3JMb2NhbGUpKSB7CiAgICBmb3JtYXRPcHRpb25zID0gZm9ybWF0T3JMb2NhbGU7CiAgfSBlbHNlIHsKICAgIGxvY2FsZU9wdGlvbnMgPSBmb3JtYXRPckxvY2FsZTsKICB9CiAgcmV0dXJuIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZU9wdGlvbnM/LmxvY2FsZSwgZm9ybWF0T3B0aW9ucykuZm9ybWF0KAogICAgdG9EYXRlKGRhdGUpCiAgKTsKfQpmdW5jdGlvbiBpc0Zvcm1hdE9wdGlvbnMob3B0cykgewogIHJldHVybiBvcHRzICE9PSB2b2lkIDAgJiYgISgibG9jYWxlIiBpbiBvcHRzKTsKfQp2YXIgaW50bEZvcm1hdF9kZWZhdWx0Owp2YXIgaW5pdF9pbnRsRm9ybWF0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2ludGxGb3JtYXQuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGludGxGb3JtYXRfZGVmYXVsdCA9IGludGxGb3JtYXQ7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaW50bEZvcm1hdERpc3RhbmNlLmpzCmZ1bmN0aW9uIGludGxGb3JtYXREaXN0YW5jZShsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgbGV0IHZhbHVlMiA9IDA7CiAgbGV0IHVuaXQ7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIGlmICghb3B0aW9ucz8udW5pdCkgewogICAgY29uc3QgZGlmZkluU2Vjb25kcyA9IGRpZmZlcmVuY2VJblNlY29uZHMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgIGlmIChNYXRoLmFicyhkaWZmSW5TZWNvbmRzKSA8IHNlY29uZHNJbk1pbnV0ZSkgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5TZWNvbmRzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgICAgIHVuaXQgPSAic2Vjb25kIjsKICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoZGlmZkluU2Vjb25kcykgPCBzZWNvbmRzSW5Ib3VyKSB7CiAgICAgIHZhbHVlMiA9IGRpZmZlcmVuY2VJbk1pbnV0ZXMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgICAgdW5pdCA9ICJtaW51dGUiOwogICAgfSBlbHNlIGlmIChNYXRoLmFicyhkaWZmSW5TZWNvbmRzKSA8IHNlY29uZHNJbkRheSAmJiBNYXRoLmFicyhkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKSkgPCAxKSB7CiAgICAgIHZhbHVlMiA9IGRpZmZlcmVuY2VJbkhvdXJzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgICAgIHVuaXQgPSAiaG91ciI7CiAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGRpZmZJblNlY29uZHMpIDwgc2Vjb25kc0luV2VlayAmJiAodmFsdWUyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXykpICYmIE1hdGguYWJzKHZhbHVlMikgPCA3KSB7CiAgICAgIHVuaXQgPSAiZGF5IjsKICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoZGlmZkluU2Vjb25kcykgPCBzZWNvbmRzSW5Nb250aCkgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgICAgIHVuaXQgPSAid2VlayI7CiAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGRpZmZJblNlY29uZHMpIDwgc2Vjb25kc0luUXVhcnRlcikgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgICB1bml0ID0gIm1vbnRoIjsKICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoZGlmZkluU2Vjb25kcykgPCBzZWNvbmRzSW5ZZWFyKSB7CiAgICAgIGlmIChkaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXykgPCA0KSB7CiAgICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgICAgIHVuaXQgPSAicXVhcnRlciI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgICAgIHVuaXQgPSAieWVhciI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlMiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgICAgdW5pdCA9ICJ5ZWFyIjsKICAgIH0KICB9IGVsc2UgewogICAgdW5pdCA9IG9wdGlvbnM/LnVuaXQ7CiAgICBpZiAodW5pdCA9PT0gInNlY29uZCIpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluU2Vjb25kcyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgfSBlbHNlIGlmICh1bml0ID09PSAibWludXRlIikgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5NaW51dGVzKGxhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlXyk7CiAgICB9IGVsc2UgaWYgKHVuaXQgPT09ICJob3VyIikgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5Ib3VycyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgfSBlbHNlIGlmICh1bml0ID09PSAiZGF5IikgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgIH0gZWxzZSBpZiAodW5pdCA9PT0gIndlZWsiKSB7CiAgICAgIHZhbHVlMiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKTsKICAgIH0gZWxzZSBpZiAodW5pdCA9PT0gIm1vbnRoIikgewogICAgICB2YWx1ZTIgPSBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgfSBlbHNlIGlmICh1bml0ID09PSAicXVhcnRlciIpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgfSBlbHNlIGlmICh1bml0ID09PSAieWVhciIpIHsKICAgICAgdmFsdWUyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyhsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV8pOwogICAgfQogIH0KICBjb25zdCBydGYgPSBuZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQob3B0aW9ucz8ubG9jYWxlLCB7CiAgICBudW1lcmljOiAiYXV0byIsCiAgICAuLi5vcHRpb25zCiAgfSk7CiAgcmV0dXJuIHJ0Zi5mb3JtYXQodmFsdWUyLCB1bml0KTsKfQp2YXIgaW50bEZvcm1hdERpc3RhbmNlX2RlZmF1bHQ7CnZhciBpbml0X2ludGxGb3JtYXREaXN0YW5jZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pbnRsRm9ybWF0RGlzdGFuY2UuanMiKCkgewogICAgaW5pdF9ub3JtYWxpemVEYXRlcygpOwogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcygpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkhvdXJzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbk1pbnV0ZXMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluU2Vjb25kcygpOwogICAgaW50bEZvcm1hdERpc3RhbmNlX2RlZmF1bHQgPSBpbnRsRm9ybWF0RGlzdGFuY2U7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNBZnRlci5qcwpmdW5jdGlvbiBpc0FmdGVyKGRhdGUsIGRhdGVUb0NvbXBhcmUpIHsKICByZXR1cm4gK3RvRGF0ZShkYXRlKSA+ICt0b0RhdGUoZGF0ZVRvQ29tcGFyZSk7Cn0KdmFyIGlzQWZ0ZXJfZGVmYXVsdDsKdmFyIGluaXRfaXNBZnRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0FmdGVyLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpc0FmdGVyX2RlZmF1bHQgPSBpc0FmdGVyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzQmVmb3JlLmpzCmZ1bmN0aW9uIGlzQmVmb3JlKGRhdGUsIGRhdGVUb0NvbXBhcmUpIHsKICByZXR1cm4gK3RvRGF0ZShkYXRlKSA8ICt0b0RhdGUoZGF0ZVRvQ29tcGFyZSk7Cn0KdmFyIGlzQmVmb3JlX2RlZmF1bHQ7CnZhciBpbml0X2lzQmVmb3JlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzQmVmb3JlLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpc0JlZm9yZV9kZWZhdWx0ID0gaXNCZWZvcmU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNFcXVhbC5qcwpmdW5jdGlvbiBpc0VxdWFsKGxlZnREYXRlLCByaWdodERhdGUpIHsKICByZXR1cm4gK3RvRGF0ZShsZWZ0RGF0ZSkgPT09ICt0b0RhdGUocmlnaHREYXRlKTsKfQp2YXIgaXNFcXVhbF9kZWZhdWx0Owp2YXIgaW5pdF9pc0VxdWFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzRXF1YWwuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGlzRXF1YWxfZGVmYXVsdCA9IGlzRXF1YWw7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNFeGlzdHMuanMKZnVuY3Rpb24gaXNFeGlzdHMoeWVhciwgbW9udGgsIGRheSkgewogIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5KTsKICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpID09PSB5ZWFyICYmIGRhdGUuZ2V0TW9udGgoKSA9PT0gbW9udGggJiYgZGF0ZS5nZXREYXRlKCkgPT09IGRheTsKfQp2YXIgaXNFeGlzdHNfZGVmYXVsdDsKdmFyIGluaXRfaXNFeGlzdHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNFeGlzdHMuanMiKCkgewogICAgaXNFeGlzdHNfZGVmYXVsdCA9IGlzRXhpc3RzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzRmlyc3REYXlPZk1vbnRoLmpzCmZ1bmN0aW9uIGlzRmlyc3REYXlPZk1vbnRoKGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXRlKCkgPT09IDE7Cn0KdmFyIGlzRmlyc3REYXlPZk1vbnRoX2RlZmF1bHQ7CnZhciBpbml0X2lzRmlyc3REYXlPZk1vbnRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzRmlyc3REYXlPZk1vbnRoLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpc0ZpcnN0RGF5T2ZNb250aF9kZWZhdWx0ID0gaXNGaXJzdERheU9mTW9udGg7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNGcmlkYXkuanMKZnVuY3Rpb24gaXNGcmlkYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldERheSgpID09PSA1Owp9CnZhciBpc0ZyaWRheV9kZWZhdWx0Owp2YXIgaW5pdF9pc0ZyaWRheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0ZyaWRheS5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgaXNGcmlkYXlfZGVmYXVsdCA9IGlzRnJpZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzRnV0dXJlLmpzCmZ1bmN0aW9uIGlzRnV0dXJlKGRhdGUpIHsKICByZXR1cm4gK3RvRGF0ZShkYXRlKSA+IERhdGUubm93KCk7Cn0KdmFyIGlzRnV0dXJlX2RlZmF1bHQ7CnZhciBpbml0X2lzRnV0dXJlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzRnV0dXJlLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpc0Z1dHVyZV9kZWZhdWx0ID0gaXNGdXR1cmU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvdHJhbnNwb3NlLmpzCmZ1bmN0aW9uIHRyYW5zcG9zZShkYXRlLCBjb25zdHJ1Y3RvcikgewogIGNvbnN0IGRhdGVfID0gaXNDb25zdHJ1Y3Rvcihjb25zdHJ1Y3RvcikgPyBuZXcgY29uc3RydWN0b3IoMCkgOiBjb25zdHJ1Y3RGcm9tKGNvbnN0cnVjdG9yLCAwKTsKICBkYXRlXy5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpOwogIGRhdGVfLnNldEhvdXJzKAogICAgZGF0ZS5nZXRIb3VycygpLAogICAgZGF0ZS5nZXRNaW51dGVzKCksCiAgICBkYXRlLmdldFNlY29uZHMoKSwKICAgIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkKICApOwogIHJldHVybiBkYXRlXzsKfQpmdW5jdGlvbiBpc0NvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKSB7CiAgcmV0dXJuIHR5cGVvZiBjb25zdHJ1Y3RvciA9PT0gImZ1bmN0aW9uIiAmJiBjb25zdHJ1Y3Rvci5wcm90b3R5cGU/LmNvbnN0cnVjdG9yID09PSBjb25zdHJ1Y3RvcjsKfQp2YXIgdHJhbnNwb3NlX2RlZmF1bHQ7CnZhciBpbml0X3RyYW5zcG9zZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy90cmFuc3Bvc2UuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICB0cmFuc3Bvc2VfZGVmYXVsdCA9IHRyYW5zcG9zZTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL1NldHRlci5qcwp2YXIgVElNRVpPTkVfVU5JVF9QUklPUklUWSwgU2V0dGVyLCBWYWx1ZVNldHRlciwgRGF0ZVRpbWV6b25lU2V0dGVyOwp2YXIgaW5pdF9TZXR0ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9TZXR0ZXIuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X3RyYW5zcG9zZSgpOwogICAgVElNRVpPTkVfVU5JVF9QUklPUklUWSA9IDEwOwogICAgU2V0dGVyID0gY2xhc3MgewogICAgICBzdWJQcmlvcml0eSA9IDA7CiAgICAgIHZhbGlkYXRlKF91dGNEYXRlLCBfb3B0aW9ucykgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9OwogICAgVmFsdWVTZXR0ZXIgPSBjbGFzcyBleHRlbmRzIFNldHRlciB7CiAgICAgIGNvbnN0cnVjdG9yKHZhbHVlMiwgdmFsaWRhdGVWYWx1ZSwgc2V0VmFsdWUsIHByaW9yaXR5LCBzdWJQcmlvcml0eSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlMjsKICAgICAgICB0aGlzLnZhbGlkYXRlVmFsdWUgPSB2YWxpZGF0ZVZhbHVlOwogICAgICAgIHRoaXMuc2V0VmFsdWUgPSBzZXRWYWx1ZTsKICAgICAgICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7CiAgICAgICAgaWYgKHN1YlByaW9yaXR5KSB7CiAgICAgICAgICB0aGlzLnN1YlByaW9yaXR5ID0gc3ViUHJpb3JpdHk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhbGlkYXRlKGRhdGUsIG9wdGlvbnMpIHsKICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVZhbHVlKGRhdGUsIHRoaXMudmFsdWUsIG9wdGlvbnMpOwogICAgICB9CiAgICAgIHNldChkYXRlLCBmbGFncywgb3B0aW9ucykgewogICAgICAgIHJldHVybiB0aGlzLnNldFZhbHVlKGRhdGUsIGZsYWdzLCB0aGlzLnZhbHVlLCBvcHRpb25zKTsKICAgICAgfQogICAgfTsKICAgIERhdGVUaW1lem9uZVNldHRlciA9IGNsYXNzIGV4dGVuZHMgU2V0dGVyIHsKICAgICAgcHJpb3JpdHkgPSBUSU1FWk9ORV9VTklUX1BSSU9SSVRZOwogICAgICBzdWJQcmlvcml0eSA9IC0xOwogICAgICBjb25zdHJ1Y3Rvcihjb250ZXh0MiwgcmVmZXJlbmNlKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0MiB8fCAoKGRhdGUpID0+IGNvbnN0cnVjdEZyb20ocmVmZXJlbmNlLCBkYXRlKSk7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIGZsYWdzKSB7CiAgICAgICAgaWYgKGZsYWdzLnRpbWVzdGFtcElzU2V0KSByZXR1cm4gZGF0ZTsKICAgICAgICByZXR1cm4gY29uc3RydWN0RnJvbShkYXRlLCB0cmFuc3Bvc2UoZGF0ZSwgdGhpcy5jb250ZXh0KSk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9QYXJzZXIuanMKdmFyIFBhcnNlcjsKdmFyIGluaXRfUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvUGFyc2VyLmpzIigpIHsKICAgIGluaXRfU2V0dGVyKCk7CiAgICBQYXJzZXIgPSBjbGFzcyB7CiAgICAgIHJ1bihkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyLCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyLCBvcHRpb25zKTsKICAgICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICBzZXR0ZXI6IG5ldyBWYWx1ZVNldHRlcigKICAgICAgICAgICAgcmVzdWx0LnZhbHVlLAogICAgICAgICAgICB0aGlzLnZhbGlkYXRlLAogICAgICAgICAgICB0aGlzLnNldCwKICAgICAgICAgICAgdGhpcy5wcmlvcml0eSwKICAgICAgICAgICAgdGhpcy5zdWJQcmlvcml0eQogICAgICAgICAgKSwKICAgICAgICAgIHJlc3Q6IHJlc3VsdC5yZXN0CiAgICAgICAgfTsKICAgICAgfQogICAgICB2YWxpZGF0ZShfdXRjRGF0ZSwgX3ZhbHVlLCBfb3B0aW9ucykgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9FcmFQYXJzZXIuanMKdmFyIEVyYVBhcnNlcjsKdmFyIGluaXRfRXJhUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9FcmFQYXJzZXIuanMiKCkgewogICAgaW5pdF9QYXJzZXIoKTsKICAgIEVyYVBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSAxNDA7CiAgICAgIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAvLyBBRCwgQkMKICAgICAgICAgIGNhc2UgIkciOgogICAgICAgICAgY2FzZSAiR0ciOgogICAgICAgICAgY2FzZSAiR0dHIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5lcmEoZGF0ZVN0cmluZywgeyB3aWR0aDogImFiYnJldmlhdGVkIiB9KSB8fCBtYXRjaDIuZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciIH0pOwogICAgICAgICAgLy8gQSwgQgogICAgICAgICAgY2FzZSAiR0dHR0ciOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmVyYShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiB9KTsKICAgICAgICAgIC8vIEFubm8gRG9taW5pLCBCZWZvcmUgQ2hyaXN0CiAgICAgICAgICBjYXNlICJHR0dHIjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIuZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJ3aWRlIiB9KSB8fCBtYXRjaDIuZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJhYmJyZXZpYXRlZCIgfSkgfHwgbWF0Y2gyLmVyYShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBmbGFncy5lcmEgPSB2YWx1ZTI7CiAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcih2YWx1ZTIsIDAsIDEpOwogICAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICAgICAgcmV0dXJuIGRhdGU7CiAgICAgIH0KICAgICAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJSIiwgInUiLCAidCIsICJUIl07CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvY29uc3RhbnRzLmpzCnZhciBudW1lcmljUGF0dGVybnMsIHRpbWV6b25lUGF0dGVybnM7CnZhciBpbml0X2NvbnN0YW50czIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9jb25zdGFudHMuanMiKCkgewogICAgbnVtZXJpY1BhdHRlcm5zID0gewogICAgICBtb250aDogL14oMVswLTJdfDA/XGQpLywKICAgICAgLy8gMCB0byAxMgogICAgICBkYXRlOiAvXigzWzAtMV18WzAtMl0/XGQpLywKICAgICAgLy8gMCB0byAzMQogICAgICBkYXlPZlllYXI6IC9eKDM2WzAtNl18M1swLTVdXGR8WzAtMl0/XGQ/XGQpLywKICAgICAgLy8gMCB0byAzNjYKICAgICAgd2VlazogL14oNVswLTNdfFswLTRdP1xkKS8sCiAgICAgIC8vIDAgdG8gNTMKICAgICAgaG91cjIzaDogL14oMlswLTNdfFswLTFdP1xkKS8sCiAgICAgIC8vIDAgdG8gMjMKICAgICAgaG91cjI0aDogL14oMlswLTRdfFswLTFdP1xkKS8sCiAgICAgIC8vIDAgdG8gMjQKICAgICAgaG91cjExaDogL14oMVswLTFdfDA/XGQpLywKICAgICAgLy8gMCB0byAxMQogICAgICBob3VyMTJoOiAvXigxWzAtMl18MD9cZCkvLAogICAgICAvLyAwIHRvIDEyCiAgICAgIG1pbnV0ZTogL15bMC01XT9cZC8sCiAgICAgIC8vIDAgdG8gNTkKICAgICAgc2Vjb25kOiAvXlswLTVdP1xkLywKICAgICAgLy8gMCB0byA1OQogICAgICBzaW5nbGVEaWdpdDogL15cZC8sCiAgICAgIC8vIDAgdG8gOQogICAgICB0d29EaWdpdHM6IC9eXGR7MSwyfS8sCiAgICAgIC8vIDAgdG8gOTkKICAgICAgdGhyZWVEaWdpdHM6IC9eXGR7MSwzfS8sCiAgICAgIC8vIDAgdG8gOTk5CiAgICAgIGZvdXJEaWdpdHM6IC9eXGR7MSw0fS8sCiAgICAgIC8vIDAgdG8gOTk5OQogICAgICBhbnlEaWdpdHNTaWduZWQ6IC9eLT9cZCsvLAogICAgICBzaW5nbGVEaWdpdFNpZ25lZDogL14tP1xkLywKICAgICAgLy8gMCB0byA5LCAtMCB0byAtOQogICAgICB0d29EaWdpdHNTaWduZWQ6IC9eLT9cZHsxLDJ9LywKICAgICAgLy8gMCB0byA5OSwgLTAgdG8gLTk5CiAgICAgIHRocmVlRGlnaXRzU2lnbmVkOiAvXi0/XGR7MSwzfS8sCiAgICAgIC8vIDAgdG8gOTk5LCAtMCB0byAtOTk5CiAgICAgIGZvdXJEaWdpdHNTaWduZWQ6IC9eLT9cZHsxLDR9LwogICAgICAvLyAwIHRvIDk5OTksIC0wIHRvIC05OTk5CiAgICB9OwogICAgdGltZXpvbmVQYXR0ZXJucyA9IHsKICAgICAgYmFzaWNPcHRpb25hbE1pbnV0ZXM6IC9eKFsrLV0pKFxkezJ9KShcZHsyfSk/fFovLAogICAgICBiYXNpYzogL14oWystXSkoXGR7Mn0pKFxkezJ9KXxaLywKICAgICAgYmFzaWNPcHRpb25hbFNlY29uZHM6IC9eKFsrLV0pKFxkezJ9KShcZHsyfSkoKFxkezJ9KSk/fFovLAogICAgICBleHRlbmRlZDogL14oWystXSkoXGR7Mn0pOihcZHsyfSl8Wi8sCiAgICAgIGV4dGVuZGVkT3B0aW9uYWxTZWNvbmRzOiAvXihbKy1dKShcZHsyfSk6KFxkezJ9KSg6KFxkezJ9KSk/fFovCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvdXRpbHMuanMKZnVuY3Rpb24gbWFwVmFsdWUocGFyc2VGblJlc3VsdCwgbWFwRm4pIHsKICBpZiAoIXBhcnNlRm5SZXN1bHQpIHsKICAgIHJldHVybiBwYXJzZUZuUmVzdWx0OwogIH0KICByZXR1cm4gewogICAgdmFsdWU6IG1hcEZuKHBhcnNlRm5SZXN1bHQudmFsdWUpLAogICAgcmVzdDogcGFyc2VGblJlc3VsdC5yZXN0CiAgfTsKfQpmdW5jdGlvbiBwYXJzZU51bWVyaWNQYXR0ZXJuKHBhdHRlcm4sIGRhdGVTdHJpbmcpIHsKICBjb25zdCBtYXRjaFJlc3VsdCA9IGRhdGVTdHJpbmcubWF0Y2gocGF0dGVybik7CiAgaWYgKCFtYXRjaFJlc3VsdCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiB7CiAgICB2YWx1ZTogcGFyc2VJbnQobWF0Y2hSZXN1bHRbMF0sIDEwKSwKICAgIHJlc3Q6IGRhdGVTdHJpbmcuc2xpY2UobWF0Y2hSZXN1bHRbMF0ubGVuZ3RoKQogIH07Cn0KZnVuY3Rpb24gcGFyc2VUaW1lem9uZVBhdHRlcm4ocGF0dGVybiwgZGF0ZVN0cmluZykgewogIGNvbnN0IG1hdGNoUmVzdWx0ID0gZGF0ZVN0cmluZy5tYXRjaChwYXR0ZXJuKTsKICBpZiAoIW1hdGNoUmVzdWx0KSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgaWYgKG1hdGNoUmVzdWx0WzBdID09PSAiWiIpIHsKICAgIHJldHVybiB7CiAgICAgIHZhbHVlOiAwLAogICAgICByZXN0OiBkYXRlU3RyaW5nLnNsaWNlKDEpCiAgICB9OwogIH0KICBjb25zdCBzaWduID0gbWF0Y2hSZXN1bHRbMV0gPT09ICIrIiA/IDEgOiAtMTsKICBjb25zdCBob3VycyA9IG1hdGNoUmVzdWx0WzJdID8gcGFyc2VJbnQobWF0Y2hSZXN1bHRbMl0sIDEwKSA6IDA7CiAgY29uc3QgbWludXRlcyA9IG1hdGNoUmVzdWx0WzNdID8gcGFyc2VJbnQobWF0Y2hSZXN1bHRbM10sIDEwKSA6IDA7CiAgY29uc3Qgc2Vjb25kcyA9IG1hdGNoUmVzdWx0WzVdID8gcGFyc2VJbnQobWF0Y2hSZXN1bHRbNV0sIDEwKSA6IDA7CiAgcmV0dXJuIHsKICAgIHZhbHVlOiBzaWduICogKGhvdXJzICogbWlsbGlzZWNvbmRzSW5Ib3VyICsgbWludXRlcyAqIG1pbGxpc2Vjb25kc0luTWludXRlICsgc2Vjb25kcyAqIG1pbGxpc2Vjb25kc0luU2Vjb25kKSwKICAgIHJlc3Q6IGRhdGVTdHJpbmcuc2xpY2UobWF0Y2hSZXN1bHRbMF0ubGVuZ3RoKQogIH07Cn0KZnVuY3Rpb24gcGFyc2VBbnlEaWdpdHNTaWduZWQoZGF0ZVN0cmluZykgewogIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5hbnlEaWdpdHNTaWduZWQsIGRhdGVTdHJpbmcpOwp9CmZ1bmN0aW9uIHBhcnNlTkRpZ2l0cyhuMTMsIGRhdGVTdHJpbmcpIHsKICBzd2l0Y2ggKG4xMykgewogICAgY2FzZSAxOgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuc2luZ2xlRGlnaXQsIGRhdGVTdHJpbmcpOwogICAgY2FzZSAyOgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMudHdvRGlnaXRzLCBkYXRlU3RyaW5nKTsKICAgIGNhc2UgMzoKICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLnRocmVlRGlnaXRzLCBkYXRlU3RyaW5nKTsKICAgIGNhc2UgNDoKICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLmZvdXJEaWdpdHMsIGRhdGVTdHJpbmcpOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obmV3IFJlZ0V4cCgiXlxcZHsxLCIgKyBuMTMgKyAifSIpLCBkYXRlU3RyaW5nKTsKICB9Cn0KZnVuY3Rpb24gcGFyc2VORGlnaXRzU2lnbmVkKG4xMywgZGF0ZVN0cmluZykgewogIHN3aXRjaCAobjEzKSB7CiAgICBjYXNlIDE6CiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5zaW5nbGVEaWdpdFNpZ25lZCwgZGF0ZVN0cmluZyk7CiAgICBjYXNlIDI6CiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy50d29EaWdpdHNTaWduZWQsIGRhdGVTdHJpbmcpOwogICAgY2FzZSAzOgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMudGhyZWVEaWdpdHNTaWduZWQsIGRhdGVTdHJpbmcpOwogICAgY2FzZSA0OgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuZm91ckRpZ2l0c1NpZ25lZCwgZGF0ZVN0cmluZyk7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihuZXcgUmVnRXhwKCJeLT9cXGR7MSwiICsgbjEzICsgIn0iKSwgZGF0ZVN0cmluZyk7CiAgfQp9CmZ1bmN0aW9uIGRheVBlcmlvZEVudW1Ub0hvdXJzKGRheVBlcmlvZCkgewogIHN3aXRjaCAoZGF5UGVyaW9kKSB7CiAgICBjYXNlICJtb3JuaW5nIjoKICAgICAgcmV0dXJuIDQ7CiAgICBjYXNlICJldmVuaW5nIjoKICAgICAgcmV0dXJuIDE3OwogICAgY2FzZSAicG0iOgogICAgY2FzZSAibm9vbiI6CiAgICBjYXNlICJhZnRlcm5vb24iOgogICAgICByZXR1cm4gMTI7CiAgICBjYXNlICJhbSI6CiAgICBjYXNlICJtaWRuaWdodCI6CiAgICBjYXNlICJuaWdodCI6CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gMDsKICB9Cn0KZnVuY3Rpb24gbm9ybWFsaXplVHdvRGlnaXRZZWFyKHR3b0RpZ2l0WWVhciwgY3VycmVudFllYXIpIHsKICBjb25zdCBpc0NvbW1vbkVyYSA9IGN1cnJlbnRZZWFyID4gMDsKICBjb25zdCBhYnNDdXJyZW50WWVhciA9IGlzQ29tbW9uRXJhID8gY3VycmVudFllYXIgOiAxIC0gY3VycmVudFllYXI7CiAgbGV0IHJlc3VsdDsKICBpZiAoYWJzQ3VycmVudFllYXIgPD0gNTApIHsKICAgIHJlc3VsdCA9IHR3b0RpZ2l0WWVhciB8fCAxMDA7CiAgfSBlbHNlIHsKICAgIGNvbnN0IHJhbmdlRW5kID0gYWJzQ3VycmVudFllYXIgKyA1MDsKICAgIGNvbnN0IHJhbmdlRW5kQ2VudHVyeSA9IE1hdGgudHJ1bmMocmFuZ2VFbmQgLyAxMDApICogMTAwOwogICAgY29uc3QgaXNQcmV2aW91c0NlbnR1cnkgPSB0d29EaWdpdFllYXIgPj0gcmFuZ2VFbmQgJSAxMDA7CiAgICByZXN1bHQgPSB0d29EaWdpdFllYXIgKyByYW5nZUVuZENlbnR1cnkgLSAoaXNQcmV2aW91c0NlbnR1cnkgPyAxMDAgOiAwKTsKICB9CiAgcmV0dXJuIGlzQ29tbW9uRXJhID8gcmVzdWx0IDogMSAtIHJlc3VsdDsKfQpmdW5jdGlvbiBpc0xlYXBZZWFySW5kZXgoeWVhcikgewogIHJldHVybiB5ZWFyICUgNDAwID09PSAwIHx8IHllYXIgJSA0ID09PSAwICYmIHllYXIgJSAxMDAgIT09IDA7Cn0KdmFyIGluaXRfdXRpbHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi91dGlscy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgaW5pdF9jb25zdGFudHMyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1llYXJQYXJzZXIuanMKdmFyIFllYXJQYXJzZXI7CnZhciBpbml0X1llYXJQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1llYXJQYXJzZXIuanMiKCkgewogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIFllYXJQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgICAgIHByaW9yaXR5ID0gMTMwOwogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbIlkiLCAiUiIsICJ1IiwgInciLCAiSSIsICJpIiwgImUiLCAiYyIsICJ0IiwgIlQiXTsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAoeWVhcikgPT4gKHsKICAgICAgICAgIHllYXIsCiAgICAgICAgICBpc1R3b0RpZ2l0WWVhcjogdG9rZW4gPT09ICJ5eSIKICAgICAgICB9KTsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICBjYXNlICJ5IjoKICAgICAgICAgICAgcmV0dXJuIG1hcFZhbHVlKHBhcnNlTkRpZ2l0cyg0LCBkYXRlU3RyaW5nKSwgdmFsdWVDYWxsYmFjayk7CiAgICAgICAgICBjYXNlICJ5byI6CiAgICAgICAgICAgIHJldHVybiBtYXBWYWx1ZSgKICAgICAgICAgICAgICBtYXRjaDIub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgICB1bml0OiAieWVhciIKICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgICAgICk7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbWFwVmFsdWUocGFyc2VORGlnaXRzKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyksIHZhbHVlQ2FsbGJhY2spOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMi5pc1R3b0RpZ2l0WWVhciB8fCB2YWx1ZTIueWVhciA+IDA7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBjb25zdCBjdXJyZW50WWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgICAgICBpZiAodmFsdWUyLmlzVHdvRGlnaXRZZWFyKSB7CiAgICAgICAgICBjb25zdCBub3JtYWxpemVkVHdvRGlnaXRZZWFyID0gbm9ybWFsaXplVHdvRGlnaXRZZWFyKAogICAgICAgICAgICB2YWx1ZTIueWVhciwKICAgICAgICAgICAgY3VycmVudFllYXIKICAgICAgICAgICk7CiAgICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKG5vcm1hbGl6ZWRUd29EaWdpdFllYXIsIDAsIDEpOwogICAgICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgICAgICAgIHJldHVybiBkYXRlOwogICAgICAgIH0KICAgICAgICBjb25zdCB5ZWFyID0gISgiZXJhIiBpbiBmbGFncykgfHwgZmxhZ3MuZXJhID09PSAxID8gdmFsdWUyLnllYXIgOiAxIC0gdmFsdWUyLnllYXI7CiAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcih5ZWFyLCAwLCAxKTsKICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Mb2NhbFdlZWtZZWFyUGFyc2VyLmpzCnZhciBMb2NhbFdlZWtZZWFyUGFyc2VyOwp2YXIgaW5pdF9Mb2NhbFdlZWtZZWFyUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Mb2NhbFdlZWtZZWFyUGFyc2VyLmpzIigpIHsKICAgIGluaXRfZ2V0V2Vla1llYXIoKTsKICAgIGluaXRfc3RhcnRPZldlZWsoKTsKICAgIGluaXRfUGFyc2VyKCk7CiAgICBpbml0X3V0aWxzKCk7CiAgICBMb2NhbFdlZWtZZWFyUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDEzMDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAoeWVhcikgPT4gKHsKICAgICAgICAgIHllYXIsCiAgICAgICAgICBpc1R3b0RpZ2l0WWVhcjogdG9rZW4gPT09ICJZWSIKICAgICAgICB9KTsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICBjYXNlICJZIjoKICAgICAgICAgICAgcmV0dXJuIG1hcFZhbHVlKHBhcnNlTkRpZ2l0cyg0LCBkYXRlU3RyaW5nKSwgdmFsdWVDYWxsYmFjayk7CiAgICAgICAgICBjYXNlICJZbyI6CiAgICAgICAgICAgIHJldHVybiBtYXBWYWx1ZSgKICAgICAgICAgICAgICBtYXRjaDIub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgICB1bml0OiAieWVhciIKICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgICAgICk7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbWFwVmFsdWUocGFyc2VORGlnaXRzKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyksIHZhbHVlQ2FsbGJhY2spOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMi5pc1R3b0RpZ2l0WWVhciB8fCB2YWx1ZTIueWVhciA+IDA7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZTIsIG9wdGlvbnMpIHsKICAgICAgICBjb25zdCBjdXJyZW50WWVhciA9IGdldFdlZWtZZWFyKGRhdGUsIG9wdGlvbnMpOwogICAgICAgIGlmICh2YWx1ZTIuaXNUd29EaWdpdFllYXIpIHsKICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUd29EaWdpdFllYXIgPSBub3JtYWxpemVUd29EaWdpdFllYXIoCiAgICAgICAgICAgIHZhbHVlMi55ZWFyLAogICAgICAgICAgICBjdXJyZW50WWVhcgogICAgICAgICAgKTsKICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIoCiAgICAgICAgICAgIG5vcm1hbGl6ZWRUd29EaWdpdFllYXIsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlCiAgICAgICAgICApOwogICAgICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgICAgICAgIHJldHVybiBzdGFydE9mV2VlayhkYXRlLCBvcHRpb25zKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgeWVhciA9ICEoImVyYSIgaW4gZmxhZ3MpIHx8IGZsYWdzLmVyYSA9PT0gMSA/IHZhbHVlMi55ZWFyIDogMSAtIHZhbHVlMi55ZWFyOwogICAgICAgIGRhdGUuc2V0RnVsbFllYXIoeWVhciwgMCwgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUpOwogICAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICAgICAgcmV0dXJuIHN0YXJ0T2ZXZWVrKGRhdGUsIG9wdGlvbnMpOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICAgICAieSIsCiAgICAgICAgIlIiLAogICAgICAgICJ1IiwKICAgICAgICAiUSIsCiAgICAgICAgInEiLAogICAgICAgICJNIiwKICAgICAgICAiTCIsCiAgICAgICAgIkkiLAogICAgICAgICJkIiwKICAgICAgICAiRCIsCiAgICAgICAgImkiLAogICAgICAgICJ0IiwKICAgICAgICAiVCIKICAgICAgXTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT1dlZWtZZWFyUGFyc2VyLmpzCnZhciBJU09XZWVrWWVhclBhcnNlcjsKdmFyIGluaXRfSVNPV2Vla1llYXJQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT1dlZWtZZWFyUGFyc2VyLmpzIigpIHsKICAgIGluaXRfc3RhcnRPZklTT1dlZWsoKTsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIElTT1dlZWtZZWFyUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDEzMDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4pIHsKICAgICAgICBpZiAodG9rZW4gPT09ICJSIikgewogICAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0c1NpZ25lZCg0LCBkYXRlU3RyaW5nKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0c1NpZ25lZCh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgICAgIGNvbnN0IGZpcnN0V2Vla09mWWVhciA9IGNvbnN0cnVjdEZyb20oZGF0ZSwgMCk7CiAgICAgICAgZmlyc3RXZWVrT2ZZZWFyLnNldEZ1bGxZZWFyKHZhbHVlMiwgMCwgNCk7CiAgICAgICAgZmlyc3RXZWVrT2ZZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIHJldHVybiBzdGFydE9mSVNPV2VlayhmaXJzdFdlZWtPZlllYXIpOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICAgICAiRyIsCiAgICAgICAgInkiLAogICAgICAgICJZIiwKICAgICAgICAidSIsCiAgICAgICAgIlEiLAogICAgICAgICJxIiwKICAgICAgICAiTSIsCiAgICAgICAgIkwiLAogICAgICAgICJ3IiwKICAgICAgICAiZCIsCiAgICAgICAgIkQiLAogICAgICAgICJlIiwKICAgICAgICAiYyIsCiAgICAgICAgInQiLAogICAgICAgICJUIgogICAgICBdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRXh0ZW5kZWRZZWFyUGFyc2VyLmpzCnZhciBFeHRlbmRlZFllYXJQYXJzZXI7CnZhciBpbml0X0V4dGVuZGVkWWVhclBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRXh0ZW5kZWRZZWFyUGFyc2VyLmpzIigpIHsKICAgIGluaXRfUGFyc2VyKCk7CiAgICBpbml0X3V0aWxzKCk7CiAgICBFeHRlbmRlZFllYXJQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgICAgIHByaW9yaXR5ID0gMTMwOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbikgewogICAgICAgIGlmICh0b2tlbiA9PT0gInUiKSB7CiAgICAgICAgICByZXR1cm4gcGFyc2VORGlnaXRzU2lnbmVkKDQsIGRhdGVTdHJpbmcpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFyc2VORGlnaXRzU2lnbmVkKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcih2YWx1ZTIsIDAsIDEpOwogICAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICAgICAgcmV0dXJuIGRhdGU7CiAgICAgIH0KICAgICAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJHIiwgInkiLCAiWSIsICJSIiwgInciLCAiSSIsICJpIiwgImUiLCAiYyIsICJ0IiwgIlQiXTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1F1YXJ0ZXJQYXJzZXIuanMKdmFyIFF1YXJ0ZXJQYXJzZXI7CnZhciBpbml0X1F1YXJ0ZXJQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1F1YXJ0ZXJQYXJzZXIuanMiKCkgewogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIFF1YXJ0ZXJQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgICAgIHByaW9yaXR5ID0gMTIwOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgLy8gMSwgMiwgMywgNAogICAgICAgICAgY2FzZSAiUSI6CiAgICAgICAgICBjYXNlICJRUSI6CiAgICAgICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgICAgICAgIC8vIDFzdCwgMm5kLCAzcmQsIDR0aAogICAgICAgICAgY2FzZSAiUW8iOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAicXVhcnRlciIgfSk7CiAgICAgICAgICAvLyBRMSwgUTIsIFEzLCBRNAogICAgICAgICAgY2FzZSAiUVFRIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLnF1YXJ0ZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyAxLCAyLCAzLCA0IChuYXJyb3cgcXVhcnRlcjsgY291bGQgYmUgbm90IG51bWVyaWNhbCkKICAgICAgICAgIGNhc2UgIlFRUVFRIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgICAgLy8gMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4KICAgICAgICAgIGNhc2UgIlFRUVEiOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogIndpZGUiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KSB8fCBtYXRjaDIucXVhcnRlcihkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMiA+PSAxICYmIHZhbHVlMiA8PSA0OwogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgICAgIGRhdGUuc2V0TW9udGgoKHZhbHVlMiAtIDEpICogMywgMSk7CiAgICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbCiAgICAgICAgIlkiLAogICAgICAgICJSIiwKICAgICAgICAicSIsCiAgICAgICAgIk0iLAogICAgICAgICJMIiwKICAgICAgICAidyIsCiAgICAgICAgIkkiLAogICAgICAgICJkIiwKICAgICAgICAiRCIsCiAgICAgICAgImkiLAogICAgICAgICJlIiwKICAgICAgICAiYyIsCiAgICAgICAgInQiLAogICAgICAgICJUIgogICAgICBdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIuanMKdmFyIFN0YW5kQWxvbmVRdWFydGVyUGFyc2VyOwp2YXIgaW5pdF9TdGFuZEFsb25lUXVhcnRlclBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIuanMiKCkgewogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIFN0YW5kQWxvbmVRdWFydGVyUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDEyMDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIC8vIDEsIDIsIDMsIDQKICAgICAgICAgIGNhc2UgInEiOgogICAgICAgICAgY2FzZSAicXEiOgogICAgICAgICAgICByZXR1cm4gcGFyc2VORGlnaXRzKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7CiAgICAgICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGgKICAgICAgICAgIGNhc2UgInFvIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogInF1YXJ0ZXIiIH0pOwogICAgICAgICAgLy8gUTEsIFEyLCBRMywgUTQKICAgICAgICAgIGNhc2UgInFxcSI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIucXVhcnRlcihkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5xdWFydGVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgICAgIH0pOwogICAgICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpCiAgICAgICAgICBjYXNlICJxcXFxcSI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIucXVhcnRlcihkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uCiAgICAgICAgICBjYXNlICJxcXFxIjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIucXVhcnRlcihkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLnF1YXJ0ZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgICAgICB9KSB8fCBtYXRjaDIucXVhcnRlcihkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gNDsKICAgICAgfQogICAgICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBkYXRlLnNldE1vbnRoKCh2YWx1ZTIgLSAxKSAqIDMsIDEpOwogICAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICAgICAgcmV0dXJuIGRhdGU7CiAgICAgIH0KICAgICAgaW5jb21wYXRpYmxlVG9rZW5zID0gWwogICAgICAgICJZIiwKICAgICAgICAiUiIsCiAgICAgICAgIlEiLAogICAgICAgICJNIiwKICAgICAgICAiTCIsCiAgICAgICAgInciLAogICAgICAgICJJIiwKICAgICAgICAiZCIsCiAgICAgICAgIkQiLAogICAgICAgICJpIiwKICAgICAgICAiZSIsCiAgICAgICAgImMiLAogICAgICAgICJ0IiwKICAgICAgICAiVCIKICAgICAgXTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL01vbnRoUGFyc2VyLmpzCnZhciBNb250aFBhcnNlcjsKdmFyIGluaXRfTW9udGhQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL01vbnRoUGFyc2VyLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzMigpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIE1vbnRoUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbCiAgICAgICAgIlkiLAogICAgICAgICJSIiwKICAgICAgICAicSIsCiAgICAgICAgIlEiLAogICAgICAgICJMIiwKICAgICAgICAidyIsCiAgICAgICAgIkkiLAogICAgICAgICJEIiwKICAgICAgICAiaSIsCiAgICAgICAgImUiLAogICAgICAgICJjIiwKICAgICAgICAidCIsCiAgICAgICAgIlQiCiAgICAgIF07CiAgICAgIHByaW9yaXR5ID0gMTEwOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICAgICAgY29uc3QgdmFsdWVDYWxsYmFjayA9ICh2YWx1ZTIpID0+IHZhbHVlMiAtIDE7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgLy8gMSwgMiwgLi4uLCAxMgogICAgICAgICAgY2FzZSAiTSI6CiAgICAgICAgICAgIHJldHVybiBtYXBWYWx1ZSgKICAgICAgICAgICAgICBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5tb250aCwgZGF0ZVN0cmluZyksCiAgICAgICAgICAgICAgdmFsdWVDYWxsYmFjawogICAgICAgICAgICApOwogICAgICAgICAgLy8gMDEsIDAyLCAuLi4sIDEyCiAgICAgICAgICBjYXNlICJNTSI6CiAgICAgICAgICAgIHJldHVybiBtYXBWYWx1ZShwYXJzZU5EaWdpdHMoMiwgZGF0ZVN0cmluZyksIHZhbHVlQ2FsbGJhY2spOwogICAgICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aAogICAgICAgICAgY2FzZSAiTW8iOgogICAgICAgICAgICByZXR1cm4gbWFwVmFsdWUoCiAgICAgICAgICAgICAgbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgICAgdW5pdDogIm1vbnRoIgogICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgIHZhbHVlQ2FsbGJhY2sKICAgICAgICAgICAgKTsKICAgICAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlYwogICAgICAgICAgY2FzZSAiTU1NIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5tb250aChkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5tb250aChkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pOwogICAgICAgICAgLy8gSiwgRiwgLi4uLCBECiAgICAgICAgICBjYXNlICJNTU1NTSI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIubW9udGgoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlcgogICAgICAgICAgY2FzZSAiTU1NTSI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJ3aWRlIiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pIHx8IG1hdGNoMi5tb250aChkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5tb250aChkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSAxMTsKICAgICAgfQogICAgICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBkYXRlLnNldE1vbnRoKHZhbHVlMiwgMSk7CiAgICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZU1vbnRoUGFyc2VyLmpzCnZhciBTdGFuZEFsb25lTW9udGhQYXJzZXI7CnZhciBpbml0X1N0YW5kQWxvbmVNb250aFBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZU1vbnRoUGFyc2VyLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzMigpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIFN0YW5kQWxvbmVNb250aFBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSAxMTA7CiAgICAgIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgICAgICBjb25zdCB2YWx1ZUNhbGxiYWNrID0gKHZhbHVlMikgPT4gdmFsdWUyIC0gMTsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAvLyAxLCAyLCAuLi4sIDEyCiAgICAgICAgICBjYXNlICJMIjoKICAgICAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgICAgIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLm1vbnRoLCBkYXRlU3RyaW5nKSwKICAgICAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgICAgICk7CiAgICAgICAgICAvLyAwMSwgMDIsIC4uLiwgMTIKICAgICAgICAgIGNhc2UgIkxMIjoKICAgICAgICAgICAgcmV0dXJuIG1hcFZhbHVlKHBhcnNlTkRpZ2l0cygyLCBkYXRlU3RyaW5nKSwgdmFsdWVDYWxsYmFjayk7CiAgICAgICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoCiAgICAgICAgICBjYXNlICJMbyI6CiAgICAgICAgICAgIHJldHVybiBtYXBWYWx1ZSgKICAgICAgICAgICAgICBtYXRjaDIub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgICB1bml0OiAibW9udGgiCiAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgdmFsdWVDYWxsYmFjawogICAgICAgICAgICApOwogICAgICAgICAgLy8gSmFuLCBGZWIsIC4uLiwgRGVjCiAgICAgICAgICBjYXNlICJMTEwiOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLm1vbnRoKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciLCBjb250ZXh0OiAic3RhbmRhbG9uZSIgfSk7CiAgICAgICAgICAvLyBKLCBGLCAuLi4sIEQKICAgICAgICAgIGNhc2UgIkxMTExMIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5tb250aChkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJzdGFuZGFsb25lIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyCiAgICAgICAgICBjYXNlICJMTExMIjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIubW9udGgoZGF0ZVN0cmluZywgeyB3aWR0aDogIndpZGUiLCBjb250ZXh0OiAic3RhbmRhbG9uZSIgfSkgfHwgbWF0Y2gyLm1vbnRoKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLm1vbnRoKGRhdGVTdHJpbmcsIHsgd2lkdGg6ICJuYXJyb3ciLCBjb250ZXh0OiAic3RhbmRhbG9uZSIgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgICAgICByZXR1cm4gdmFsdWUyID49IDAgJiYgdmFsdWUyIDw9IDExOwogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgICAgIGRhdGUuc2V0TW9udGgodmFsdWUyLCAxKTsKICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICAgICAiWSIsCiAgICAgICAgIlIiLAogICAgICAgICJxIiwKICAgICAgICAiUSIsCiAgICAgICAgIk0iLAogICAgICAgICJ3IiwKICAgICAgICAiSSIsCiAgICAgICAgIkQiLAogICAgICAgICJpIiwKICAgICAgICAiZSIsCiAgICAgICAgImMiLAogICAgICAgICJ0IiwKICAgICAgICAiVCIKICAgICAgXTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0V2Vlay5qcwpmdW5jdGlvbiBzZXRXZWVrKGRhdGUsIHdlZWssIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgZGlmZiA9IGdldFdlZWsoZGF0ZV8sIG9wdGlvbnMpIC0gd2VlazsKICBkYXRlXy5zZXREYXRlKGRhdGVfLmdldERhdGUoKSAtIGRpZmYgKiA3KTsKICByZXR1cm4gdG9EYXRlKGRhdGVfLCBvcHRpb25zPy5pbik7Cn0KdmFyIHNldFdlZWtfZGVmYXVsdDsKdmFyIGluaXRfc2V0V2VlayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRXZWVrLmpzIigpIHsKICAgIGluaXRfZ2V0V2VlaygpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIHNldFdlZWtfZGVmYXVsdCA9IHNldFdlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0xvY2FsV2Vla1BhcnNlci5qcwp2YXIgTG9jYWxXZWVrUGFyc2VyOwp2YXIgaW5pdF9Mb2NhbFdlZWtQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0xvY2FsV2Vla1BhcnNlci5qcyIoKSB7CiAgICBpbml0X3NldFdlZWsoKTsKICAgIGluaXRfc3RhcnRPZldlZWsoKTsKICAgIGluaXRfY29uc3RhbnRzMigpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIExvY2FsV2Vla1BhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSAxMDA7CiAgICAgIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICBjYXNlICJ3IjoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLndlZWssIGRhdGVTdHJpbmcpOwogICAgICAgICAgY2FzZSAid28iOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAid2VlayIgfSk7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gcGFyc2VORGlnaXRzKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgICAgICByZXR1cm4gdmFsdWUyID49IDEgJiYgdmFsdWUyIDw9IDUzOwogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMiwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBzdGFydE9mV2VlayhzZXRXZWVrKGRhdGUsIHZhbHVlMiwgb3B0aW9ucyksIG9wdGlvbnMpOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICAgICAieSIsCiAgICAgICAgIlIiLAogICAgICAgICJ1IiwKICAgICAgICAicSIsCiAgICAgICAgIlEiLAogICAgICAgICJNIiwKICAgICAgICAiTCIsCiAgICAgICAgIkkiLAogICAgICAgICJkIiwKICAgICAgICAiRCIsCiAgICAgICAgImkiLAogICAgICAgICJ0IiwKICAgICAgICAiVCIKICAgICAgXTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0SVNPV2Vlay5qcwpmdW5jdGlvbiBzZXRJU09XZWVrKGRhdGUsIHdlZWssIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgZGlmZiA9IGdldElTT1dlZWsoX2RhdGUsIG9wdGlvbnMpIC0gd2VlazsKICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSAtIGRpZmYgKiA3KTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIHNldElTT1dlZWtfZGVmYXVsdDsKdmFyIGluaXRfc2V0SVNPV2VlayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRJU09XZWVrLmpzIigpIHsKICAgIGluaXRfZ2V0SVNPV2VlaygpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIHNldElTT1dlZWtfZGVmYXVsdCA9IHNldElTT1dlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT1dlZWtQYXJzZXIuanMKdmFyIElTT1dlZWtQYXJzZXI7CnZhciBpbml0X0lTT1dlZWtQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT1dlZWtQYXJzZXIuanMiKCkgewogICAgaW5pdF9zZXRJU09XZWVrKCk7CiAgICBpbml0X3N0YXJ0T2ZJU09XZWVrKCk7CiAgICBpbml0X2NvbnN0YW50czIoKTsKICAgIGluaXRfUGFyc2VyKCk7CiAgICBpbml0X3V0aWxzKCk7CiAgICBJU09XZWVrUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDEwMDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIGNhc2UgIkkiOgogICAgICAgICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMud2VlaywgZGF0ZVN0cmluZyk7CiAgICAgICAgICBjYXNlICJJbyI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6ICJ3ZWVrIiB9KTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gNTM7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHN0YXJ0T2ZJU09XZWVrKHNldElTT1dlZWsoZGF0ZSwgdmFsdWUyKSk7CiAgICAgIH0KICAgICAgaW5jb21wYXRpYmxlVG9rZW5zID0gWwogICAgICAgICJ5IiwKICAgICAgICAiWSIsCiAgICAgICAgInUiLAogICAgICAgICJxIiwKICAgICAgICAiUSIsCiAgICAgICAgIk0iLAogICAgICAgICJMIiwKICAgICAgICAidyIsCiAgICAgICAgImQiLAogICAgICAgICJEIiwKICAgICAgICAiZSIsCiAgICAgICAgImMiLAogICAgICAgICJ0IiwKICAgICAgICAiVCIKICAgICAgXTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0RhdGVQYXJzZXIuanMKdmFyIERBWVNfSU5fTU9OVEgsIERBWVNfSU5fTU9OVEhfTEVBUF9ZRUFSLCBEYXRlUGFyc2VyOwp2YXIgaW5pdF9EYXRlUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9EYXRlUGFyc2VyLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzMigpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIERBWVNfSU5fTU9OVEggPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07CiAgICBEQVlTX0lOX01PTlRIX0xFQVBfWUVBUiA9IFsKICAgICAgMzEsCiAgICAgIDI5LAogICAgICAzMSwKICAgICAgMzAsCiAgICAgIDMxLAogICAgICAzMCwKICAgICAgMzEsCiAgICAgIDMxLAogICAgICAzMCwKICAgICAgMzEsCiAgICAgIDMwLAogICAgICAzMQogICAgXTsKICAgIERhdGVQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgICAgIHByaW9yaXR5ID0gOTA7CiAgICAgIHN1YlByaW9yaXR5ID0gMTsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIGNhc2UgImQiOgogICAgICAgICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuZGF0ZSwgZGF0ZVN0cmluZyk7CiAgICAgICAgICBjYXNlICJkbyI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6ICJkYXRlIiB9KTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFsaWRhdGUoZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgICAgICBjb25zdCBpc0xlYXBZZWFyMiA9IGlzTGVhcFllYXJJbmRleCh5ZWFyKTsKICAgICAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTsKICAgICAgICBpZiAoaXNMZWFwWWVhcjIpIHsKICAgICAgICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gREFZU19JTl9NT05USF9MRUFQX1lFQVJbbW9udGhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gdmFsdWUyID49IDEgJiYgdmFsdWUyIDw9IERBWVNfSU5fTU9OVEhbbW9udGhdOwogICAgICAgIH0KICAgICAgfQogICAgICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBkYXRlLnNldERhdGUodmFsdWUyKTsKICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICAgICAiWSIsCiAgICAgICAgIlIiLAogICAgICAgICJxIiwKICAgICAgICAiUSIsCiAgICAgICAgInciLAogICAgICAgICJJIiwKICAgICAgICAiRCIsCiAgICAgICAgImkiLAogICAgICAgICJlIiwKICAgICAgICAiYyIsCiAgICAgICAgInQiLAogICAgICAgICJUIgogICAgICBdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF5T2ZZZWFyUGFyc2VyLmpzCnZhciBEYXlPZlllYXJQYXJzZXI7CnZhciBpbml0X0RheU9mWWVhclBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF5T2ZZZWFyUGFyc2VyLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzMigpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIERheU9mWWVhclBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSA5MDsKICAgICAgc3VicHJpb3JpdHkgPSAxOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgY2FzZSAiRCI6CiAgICAgICAgICBjYXNlICJERCI6CiAgICAgICAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5kYXlPZlllYXIsIGRhdGVTdHJpbmcpOwogICAgICAgICAgY2FzZSAiRG8iOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiAiZGF0ZSIgfSk7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gcGFyc2VORGlnaXRzKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhbGlkYXRlKGRhdGUsIHZhbHVlMikgewogICAgICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CiAgICAgICAgY29uc3QgaXNMZWFwWWVhcjIgPSBpc0xlYXBZZWFySW5kZXgoeWVhcik7CiAgICAgICAgaWYgKGlzTGVhcFllYXIyKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWUyID49IDEgJiYgdmFsdWUyIDw9IDM2NjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHZhbHVlMiA+PSAxICYmIHZhbHVlMiA8PSAzNjU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgICAgIGRhdGUuc2V0TW9udGgoMCwgdmFsdWUyKTsKICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICAgICAiWSIsCiAgICAgICAgIlIiLAogICAgICAgICJxIiwKICAgICAgICAiUSIsCiAgICAgICAgIk0iLAogICAgICAgICJMIiwKICAgICAgICAidyIsCiAgICAgICAgIkkiLAogICAgICAgICJkIiwKICAgICAgICAiRSIsCiAgICAgICAgImkiLAogICAgICAgICJlIiwKICAgICAgICAiYyIsCiAgICAgICAgInQiLAogICAgICAgICJUIgogICAgICBdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXREYXkuanMKZnVuY3Rpb24gc2V0RGF5KGRhdGUsIGRheSwgb3B0aW9ucykgewogIGNvbnN0IGRlZmF1bHRPcHRpb25zMiA9IGdldERlZmF1bHRPcHRpb25zKCk7CiAgY29uc3Qgd2Vla1N0YXJ0c09uID0gb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi53ZWVrU3RhcnRzT24gPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/IDA7CiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGN1cnJlbnREYXkgPSBkYXRlXy5nZXREYXkoKTsKICBjb25zdCByZW1haW5kZXIgPSBkYXkgJSA3OwogIGNvbnN0IGRheUluZGV4ID0gKHJlbWFpbmRlciArIDcpICUgNzsKICBjb25zdCBkZWx0YSA9IDcgLSB3ZWVrU3RhcnRzT247CiAgY29uc3QgZGlmZiA9IGRheSA8IDAgfHwgZGF5ID4gNiA/IGRheSAtIChjdXJyZW50RGF5ICsgZGVsdGEpICUgNyA6IChkYXlJbmRleCArIGRlbHRhKSAlIDcgLSAoY3VycmVudERheSArIGRlbHRhKSAlIDc7CiAgcmV0dXJuIGFkZERheXMoZGF0ZV8sIGRpZmYsIG9wdGlvbnMpOwp9CnZhciBzZXREYXlfZGVmYXVsdDsKdmFyIGluaXRfc2V0RGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldERheS5qcyIoKSB7CiAgICBpbml0X2RlZmF1bHRPcHRpb25zKCk7CiAgICBpbml0X2FkZERheXMoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzZXREYXlfZGVmYXVsdCA9IHNldERheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF5UGFyc2VyLmpzCnZhciBEYXlQYXJzZXI7CnZhciBpbml0X0RheVBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF5UGFyc2VyLmpzIigpIHsKICAgIGluaXRfc2V0RGF5KCk7CiAgICBpbml0X1BhcnNlcigpOwogICAgRGF5UGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDkwOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgLy8gVHVlCiAgICAgICAgICBjYXNlICJFIjoKICAgICAgICAgIGNhc2UgIkVFIjoKICAgICAgICAgIGNhc2UgIkVFRSI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAic2hvcnQiLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pOwogICAgICAgICAgLy8gVAogICAgICAgICAgY2FzZSAiRUVFRUUiOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIFR1CiAgICAgICAgICBjYXNlICJFRUVFRUUiOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAic2hvcnQiLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pOwogICAgICAgICAgLy8gVHVlc2RheQogICAgICAgICAgY2FzZSAiRUVFRSI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAid2lkZSIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAic2hvcnQiLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSA2OwogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMiwgb3B0aW9ucykgewogICAgICAgIGRhdGUgPSBzZXREYXkoZGF0ZSwgdmFsdWUyLCBvcHRpb25zKTsKICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsiRCIsICJpIiwgImUiLCAiYyIsICJ0IiwgIlQiXTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0xvY2FsRGF5UGFyc2VyLmpzCnZhciBMb2NhbERheVBhcnNlcjsKdmFyIGluaXRfTG9jYWxEYXlQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0xvY2FsRGF5UGFyc2VyLmpzIigpIHsKICAgIGluaXRfc2V0RGF5KCk7CiAgICBpbml0X1BhcnNlcigpOwogICAgaW5pdF91dGlscygpOwogICAgTG9jYWxEYXlQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgICAgIHByaW9yaXR5ID0gOTA7CiAgICAgIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIsIG9wdGlvbnMpIHsKICAgICAgICBjb25zdCB2YWx1ZUNhbGxiYWNrID0gKHZhbHVlMikgPT4gewogICAgICAgICAgY29uc3Qgd2hvbGVXZWVrRGF5cyA9IE1hdGguZmxvb3IoKHZhbHVlMiAtIDEpIC8gNykgKiA3OwogICAgICAgICAgcmV0dXJuICh2YWx1ZTIgKyBvcHRpb25zLndlZWtTdGFydHNPbiArIDYpICUgNyArIHdob2xlV2Vla0RheXM7CiAgICAgICAgfTsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICAvLyAzCiAgICAgICAgICBjYXNlICJlIjoKICAgICAgICAgIGNhc2UgImVlIjoKICAgICAgICAgICAgcmV0dXJuIG1hcFZhbHVlKHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpLCB2YWx1ZUNhbGxiYWNrKTsKICAgICAgICAgIC8vIDNyZAogICAgICAgICAgY2FzZSAiZW8iOgogICAgICAgICAgICByZXR1cm4gbWFwVmFsdWUoCiAgICAgICAgICAgICAgbWF0Y2gyLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgICAgdW5pdDogImRheSIKICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgICAgICk7CiAgICAgICAgICAvLyBUdWUKICAgICAgICAgIGNhc2UgImVlZSI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAic2hvcnQiLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pOwogICAgICAgICAgLy8gVAogICAgICAgICAgY2FzZSAiZWVlZWUiOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIC8vIFR1CiAgICAgICAgICBjYXNlICJlZWVlZWUiOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAic2hvcnQiLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pOwogICAgICAgICAgLy8gVHVlc2RheQogICAgICAgICAgY2FzZSAiZWVlZSI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAid2lkZSIsIGNvbnRleHQ6ICJmb3JtYXR0aW5nIiB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAic2hvcnQiLCBjb250ZXh0OiAiZm9ybWF0dGluZyIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiAibmFycm93IiwgY29udGV4dDogImZvcm1hdHRpbmciIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSA2OwogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMiwgb3B0aW9ucykgewogICAgICAgIGRhdGUgPSBzZXREYXkoZGF0ZSwgdmFsdWUyLCBvcHRpb25zKTsKICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsKICAgICAgICAieSIsCiAgICAgICAgIlIiLAogICAgICAgICJ1IiwKICAgICAgICAicSIsCiAgICAgICAgIlEiLAogICAgICAgICJNIiwKICAgICAgICAiTCIsCiAgICAgICAgIkkiLAogICAgICAgICJkIiwKICAgICAgICAiRCIsCiAgICAgICAgIkUiLAogICAgICAgICJpIiwKICAgICAgICAiYyIsCiAgICAgICAgInQiLAogICAgICAgICJUIgogICAgICBdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyLmpzCnZhciBTdGFuZEFsb25lTG9jYWxEYXlQYXJzZXI7CnZhciBpbml0X1N0YW5kQWxvbmVMb2NhbERheVBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyLmpzIigpIHsKICAgIGluaXRfc2V0RGF5KCk7CiAgICBpbml0X1BhcnNlcigpOwogICAgaW5pdF91dGlscygpOwogICAgU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDkwOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyLCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgdmFsdWVDYWxsYmFjayA9ICh2YWx1ZTIpID0+IHsKICAgICAgICAgIGNvbnN0IHdob2xlV2Vla0RheXMgPSBNYXRoLmZsb29yKCh2YWx1ZTIgLSAxKSAvIDcpICogNzsKICAgICAgICAgIHJldHVybiAodmFsdWUyICsgb3B0aW9ucy53ZWVrU3RhcnRzT24gKyA2KSAlIDcgKyB3aG9sZVdlZWtEYXlzOwogICAgICAgIH07CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgLy8gMwogICAgICAgICAgY2FzZSAiYyI6CiAgICAgICAgICBjYXNlICJjYyI6CiAgICAgICAgICAgIHJldHVybiBtYXBWYWx1ZShwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKSwgdmFsdWVDYWxsYmFjayk7CiAgICAgICAgICAvLyAzcmQKICAgICAgICAgIGNhc2UgImNvIjoKICAgICAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgICAgIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICAgIHVuaXQ6ICJkYXkiCiAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgdmFsdWVDYWxsYmFjawogICAgICAgICAgICApOwogICAgICAgICAgLy8gVHVlCiAgICAgICAgICBjYXNlICJjY2MiOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogInNob3J0IiwgY29udGV4dDogInN0YW5kYWxvbmUiIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogIm5hcnJvdyIsIGNvbnRleHQ6ICJzdGFuZGFsb25lIiB9KTsKICAgICAgICAgIC8vIFQKICAgICAgICAgIGNhc2UgImNjY2NjIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICBjb250ZXh0OiAic3RhbmRhbG9uZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAvLyBUdQogICAgICAgICAgY2FzZSAiY2NjY2NjIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogInNob3J0IiwgY29udGV4dDogInN0YW5kYWxvbmUiIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogIm5hcnJvdyIsIGNvbnRleHQ6ICJzdGFuZGFsb25lIiB9KTsKICAgICAgICAgIC8vIFR1ZXNkYXkKICAgICAgICAgIGNhc2UgImNjY2MiOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogIndpZGUiLCBjb250ZXh0OiAic3RhbmRhbG9uZSIgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogInN0YW5kYWxvbmUiCiAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogInNob3J0IiwgY29udGV4dDogInN0YW5kYWxvbmUiIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogIm5hcnJvdyIsIGNvbnRleHQ6ICJzdGFuZGFsb25lIiB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgICAgIHJldHVybiB2YWx1ZTIgPj0gMCAmJiB2YWx1ZTIgPD0gNjsKICAgICAgfQogICAgICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIsIG9wdGlvbnMpIHsKICAgICAgICBkYXRlID0gc2V0RGF5KGRhdGUsIHZhbHVlMiwgb3B0aW9ucyk7CiAgICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbCiAgICAgICAgInkiLAogICAgICAgICJSIiwKICAgICAgICAidSIsCiAgICAgICAgInEiLAogICAgICAgICJRIiwKICAgICAgICAiTSIsCiAgICAgICAgIkwiLAogICAgICAgICJJIiwKICAgICAgICAiZCIsCiAgICAgICAgIkQiLAogICAgICAgICJFIiwKICAgICAgICAiaSIsCiAgICAgICAgImUiLAogICAgICAgICJ0IiwKICAgICAgICAiVCIKICAgICAgXTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0SVNPRGF5LmpzCmZ1bmN0aW9uIHNldElTT0RheShkYXRlLCBkYXksIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgY3VycmVudERheSA9IGdldElTT0RheShkYXRlXywgb3B0aW9ucyk7CiAgY29uc3QgZGlmZiA9IGRheSAtIGN1cnJlbnREYXk7CiAgcmV0dXJuIGFkZERheXMoZGF0ZV8sIGRpZmYsIG9wdGlvbnMpOwp9CnZhciBzZXRJU09EYXlfZGVmYXVsdDsKdmFyIGluaXRfc2V0SVNPRGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldElTT0RheS5qcyIoKSB7CiAgICBpbml0X2FkZERheXMoKTsKICAgIGluaXRfZ2V0SVNPRGF5KCk7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgc2V0SVNPRGF5X2RlZmF1bHQgPSBzZXRJU09EYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT0RheVBhcnNlci5qcwp2YXIgSVNPRGF5UGFyc2VyOwp2YXIgaW5pdF9JU09EYXlQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT0RheVBhcnNlci5qcyIoKSB7CiAgICBpbml0X3NldElTT0RheSgpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIElTT0RheVBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSA5MDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAodmFsdWUyKSA9PiB7CiAgICAgICAgICBpZiAodmFsdWUyID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiA3OwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHZhbHVlMjsKICAgICAgICB9OwogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIC8vIDIKICAgICAgICAgIGNhc2UgImkiOgogICAgICAgICAgY2FzZSAiaWkiOgogICAgICAgICAgICByZXR1cm4gcGFyc2VORGlnaXRzKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7CiAgICAgICAgICAvLyAybmQKICAgICAgICAgIGNhc2UgImlvIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogImRheSIgfSk7CiAgICAgICAgICAvLyBUdWUKICAgICAgICAgIGNhc2UgImlpaSI6CiAgICAgICAgICAgIHJldHVybiBtYXBWYWx1ZSgKICAgICAgICAgICAgICBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgICB3aWR0aDogInNob3J0IiwKICAgICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgdmFsdWVDYWxsYmFjawogICAgICAgICAgICApOwogICAgICAgICAgLy8gVAogICAgICAgICAgY2FzZSAiaWlpaWkiOgogICAgICAgICAgICByZXR1cm4gbWFwVmFsdWUoCiAgICAgICAgICAgICAgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgICAgICk7CiAgICAgICAgICAvLyBUdQogICAgICAgICAgY2FzZSAiaWlpaWlpIjoKICAgICAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgICAgIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgICAgd2lkdGg6ICJzaG9ydCIsCiAgICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgICB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgIHZhbHVlQ2FsbGJhY2sKICAgICAgICAgICAgKTsKICAgICAgICAgIC8vIFR1ZXNkYXkKICAgICAgICAgIGNhc2UgImlpaWkiOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIG1hcFZhbHVlKAogICAgICAgICAgICAgIG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5kYXkoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgICB9KSB8fCBtYXRjaDIuZGF5KGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICAgIHdpZHRoOiAic2hvcnQiLAogICAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheShkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICB2YWx1ZUNhbGxiYWNrCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgICAgICByZXR1cm4gdmFsdWUyID49IDEgJiYgdmFsdWUyIDw9IDc7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICAgICAgZGF0ZSA9IHNldElTT0RheShkYXRlLCB2YWx1ZTIpOwogICAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICAgICAgcmV0dXJuIGRhdGU7CiAgICAgIH0KICAgICAgaW5jb21wYXRpYmxlVG9rZW5zID0gWwogICAgICAgICJ5IiwKICAgICAgICAiWSIsCiAgICAgICAgInUiLAogICAgICAgICJxIiwKICAgICAgICAiUSIsCiAgICAgICAgIk0iLAogICAgICAgICJMIiwKICAgICAgICAidyIsCiAgICAgICAgImQiLAogICAgICAgICJEIiwKICAgICAgICAiRSIsCiAgICAgICAgImUiLAogICAgICAgICJjIiwKICAgICAgICAidCIsCiAgICAgICAgIlQiCiAgICAgIF07CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9BTVBNUGFyc2VyLmpzCnZhciBBTVBNUGFyc2VyOwp2YXIgaW5pdF9BTVBNUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9BTVBNUGFyc2VyLmpzIigpIHsKICAgIGluaXRfUGFyc2VyKCk7CiAgICBpbml0X3V0aWxzKCk7CiAgICBBTVBNUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDgwOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgY2FzZSAiYSI6CiAgICAgICAgICBjYXNlICJhYSI6CiAgICAgICAgICBjYXNlICJhYWEiOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlICJhYWFhYSI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAiYWFhYSI6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJ3aWRlIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJhYmJyZXZpYXRlZCIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgICAgIGRhdGUuc2V0SG91cnMoZGF5UGVyaW9kRW51bVRvSG91cnModmFsdWUyKSwgMCwgMCwgMCk7CiAgICAgICAgcmV0dXJuIGRhdGU7CiAgICAgIH0KICAgICAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJiIiwgIkIiLCAiSCIsICJrIiwgInQiLCAiVCJdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvQU1QTU1pZG5pZ2h0UGFyc2VyLmpzCnZhciBBTVBNTWlkbmlnaHRQYXJzZXI7CnZhciBpbml0X0FNUE1NaWRuaWdodFBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvQU1QTU1pZG5pZ2h0UGFyc2VyLmpzIigpIHsKICAgIGluaXRfUGFyc2VyKCk7CiAgICBpbml0X3V0aWxzKCk7CiAgICBBTVBNTWlkbmlnaHRQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgICAgIHByaW9yaXR5ID0gODA7CiAgICAgIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICBjYXNlICJiIjoKICAgICAgICAgIGNhc2UgImJiIjoKICAgICAgICAgIGNhc2UgImJiYiI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIGNhc2UgImJiYmJiIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAibmFycm93IiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlICJiYmJiIjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogIndpZGUiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KSB8fCBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogImFiYnJldmlhdGVkIiwKICAgICAgICAgICAgICBjb250ZXh0OiAiZm9ybWF0dGluZyIKICAgICAgICAgICAgfSkgfHwgbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICAgICAgZGF0ZS5zZXRIb3VycyhkYXlQZXJpb2RFbnVtVG9Ib3Vycyh2YWx1ZTIpLCAwLCAwLCAwKTsKICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbImEiLCAiQiIsICJIIiwgImsiLCAidCIsICJUIl07CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9EYXlQZXJpb2RQYXJzZXIuanMKdmFyIERheVBlcmlvZFBhcnNlcjsKdmFyIGluaXRfRGF5UGVyaW9kUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9EYXlQZXJpb2RQYXJzZXIuanMiKCkgewogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIERheVBlcmlvZFBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSA4MDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIGNhc2UgIkIiOgogICAgICAgICAgY2FzZSAiQkIiOgogICAgICAgICAgY2FzZSAiQkJCIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KSB8fCBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAiQkJCQkIiOgogICAgICAgICAgICByZXR1cm4gbWF0Y2gyLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7CiAgICAgICAgICAgICAgd2lkdGg6ICJuYXJyb3ciLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIGNhc2UgIkJCQkIiOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAid2lkZSIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pIHx8IG1hdGNoMi5kYXlQZXJpb2QoZGF0ZVN0cmluZywgewogICAgICAgICAgICAgIHdpZHRoOiAiYWJicmV2aWF0ZWQiLAogICAgICAgICAgICAgIGNvbnRleHQ6ICJmb3JtYXR0aW5nIgogICAgICAgICAgICB9KSB8fCBtYXRjaDIuZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHsKICAgICAgICAgICAgICB3aWR0aDogIm5hcnJvdyIsCiAgICAgICAgICAgICAgY29udGV4dDogImZvcm1hdHRpbmciCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBkYXRlLnNldEhvdXJzKGRheVBlcmlvZEVudW1Ub0hvdXJzKHZhbHVlMiksIDAsIDAsIDApOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsiYSIsICJiIiwgInQiLCAiVCJdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSG91cjF0bzEyUGFyc2VyLmpzCnZhciBIb3VyMXRvMTJQYXJzZXI7CnZhciBpbml0X0hvdXIxdG8xMlBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSG91cjF0bzEyUGFyc2VyLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzMigpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIEhvdXIxdG8xMlBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSA3MDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIGNhc2UgImgiOgogICAgICAgICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuaG91cjEyaCwgZGF0ZVN0cmluZyk7CiAgICAgICAgICBjYXNlICJobyI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6ICJob3VyIiB9KTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gMTI7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICAgICAgY29uc3QgaXNQTSA9IGRhdGUuZ2V0SG91cnMoKSA+PSAxMjsKICAgICAgICBpZiAoaXNQTSAmJiB2YWx1ZTIgPCAxMikgewogICAgICAgICAgZGF0ZS5zZXRIb3Vycyh2YWx1ZTIgKyAxMiwgMCwgMCwgMCk7CiAgICAgICAgfSBlbHNlIGlmICghaXNQTSAmJiB2YWx1ZTIgPT09IDEyKSB7CiAgICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkYXRlLnNldEhvdXJzKHZhbHVlMiwgMCwgMCwgMCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsiSCIsICJLIiwgImsiLCAidCIsICJUIl07CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Ib3VyMHRvMjNQYXJzZXIuanMKdmFyIEhvdXIwdG8yM1BhcnNlcjsKdmFyIGluaXRfSG91cjB0bzIzUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Ib3VyMHRvMjNQYXJzZXIuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMyKCk7CiAgICBpbml0X1BhcnNlcigpOwogICAgaW5pdF91dGlscygpOwogICAgSG91cjB0bzIzUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDcwOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgY2FzZSAiSCI6CiAgICAgICAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5ob3VyMjNoLCBkYXRlU3RyaW5nKTsKICAgICAgICAgIGNhc2UgIkhvIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogImhvdXIiIH0pOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSAyMzsKICAgICAgfQogICAgICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBkYXRlLnNldEhvdXJzKHZhbHVlMiwgMCwgMCwgMCk7CiAgICAgICAgcmV0dXJuIGRhdGU7CiAgICAgIH0KICAgICAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJhIiwgImIiLCAiaCIsICJLIiwgImsiLCAidCIsICJUIl07CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Ib3VyMFRvMTFQYXJzZXIuanMKdmFyIEhvdXIwVG8xMVBhcnNlcjsKdmFyIGluaXRfSG91cjBUbzExUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Ib3VyMFRvMTFQYXJzZXIuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMyKCk7CiAgICBpbml0X1BhcnNlcigpOwogICAgaW5pdF91dGlscygpOwogICAgSG91cjBUbzExUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDcwOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gyKSB7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgY2FzZSAiSyI6CiAgICAgICAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG51bWVyaWNQYXR0ZXJucy5ob3VyMTFoLCBkYXRlU3RyaW5nKTsKICAgICAgICAgIGNhc2UgIktvIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogImhvdXIiIH0pOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSAxMTsKICAgICAgfQogICAgICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBjb25zdCBpc1BNID0gZGF0ZS5nZXRIb3VycygpID49IDEyOwogICAgICAgIGlmIChpc1BNICYmIHZhbHVlMiA8IDEyKSB7CiAgICAgICAgICBkYXRlLnNldEhvdXJzKHZhbHVlMiArIDEyLCAwLCAwLCAwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGF0ZS5zZXRIb3Vycyh2YWx1ZTIsIDAsIDAsIDApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbImgiLCAiSCIsICJrIiwgInQiLCAiVCJdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSG91cjFUbzI0UGFyc2VyLmpzCnZhciBIb3VyMVRvMjRQYXJzZXI7CnZhciBpbml0X0hvdXIxVG8yNFBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSG91cjFUbzI0UGFyc2VyLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzMigpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIEhvdXIxVG8yNFBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSA3MDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIGNhc2UgImsiOgogICAgICAgICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuaG91cjI0aCwgZGF0ZVN0cmluZyk7CiAgICAgICAgICBjYXNlICJrbyI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6ICJob3VyIiB9KTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlMikgewogICAgICAgIHJldHVybiB2YWx1ZTIgPj0gMSAmJiB2YWx1ZTIgPD0gMjQ7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICAgICAgY29uc3QgaG91cnMgPSB2YWx1ZTIgPD0gMjQgPyB2YWx1ZTIgJSAyNCA6IHZhbHVlMjsKICAgICAgICBkYXRlLnNldEhvdXJzKGhvdXJzLCAwLCAwLCAwKTsKICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbImEiLCAiYiIsICJoIiwgIkgiLCAiSyIsICJ0IiwgIlQiXTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL01pbnV0ZVBhcnNlci5qcwp2YXIgTWludXRlUGFyc2VyOwp2YXIgaW5pdF9NaW51dGVQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL01pbnV0ZVBhcnNlci5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50czIoKTsKICAgIGluaXRfUGFyc2VyKCk7CiAgICBpbml0X3V0aWxzKCk7CiAgICBNaW51dGVQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgICAgIHByaW9yaXR5ID0gNjA7CiAgICAgIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaDIpIHsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICBjYXNlICJtIjoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4obnVtZXJpY1BhdHRlcm5zLm1pbnV0ZSwgZGF0ZVN0cmluZyk7CiAgICAgICAgICBjYXNlICJtbyI6CiAgICAgICAgICAgIHJldHVybiBtYXRjaDIub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6ICJtaW51dGUiIH0pOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlTkRpZ2l0cyh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMiA+PSAwICYmIHZhbHVlMiA8PSA1OTsKICAgICAgfQogICAgICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBkYXRlLnNldE1pbnV0ZXModmFsdWUyLCAwLCAwKTsKICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbInQiLCAiVCJdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU2Vjb25kUGFyc2VyLmpzCnZhciBTZWNvbmRQYXJzZXI7CnZhciBpbml0X1NlY29uZFBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU2Vjb25kUGFyc2VyLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzMigpOwogICAgaW5pdF9QYXJzZXIoKTsKICAgIGluaXRfdXRpbHMoKTsKICAgIFNlY29uZFBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSA1MDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoMikgewogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIGNhc2UgInMiOgogICAgICAgICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihudW1lcmljUGF0dGVybnMuc2Vjb25kLCBkYXRlU3RyaW5nKTsKICAgICAgICAgIGNhc2UgInNvIjoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoMi5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogInNlY29uZCIgfSk7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gcGFyc2VORGlnaXRzKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZTIpIHsKICAgICAgICByZXR1cm4gdmFsdWUyID49IDAgJiYgdmFsdWUyIDw9IDU5OwogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgICAgIGRhdGUuc2V0U2Vjb25kcyh2YWx1ZTIsIDApOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9IFsidCIsICJUIl07CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9GcmFjdGlvbk9mU2Vjb25kUGFyc2VyLmpzCnZhciBGcmFjdGlvbk9mU2Vjb25kUGFyc2VyOwp2YXIgaW5pdF9GcmFjdGlvbk9mU2Vjb25kUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9GcmFjdGlvbk9mU2Vjb25kUGFyc2VyLmpzIigpIHsKICAgIGluaXRfUGFyc2VyKCk7CiAgICBpbml0X3V0aWxzKCk7CiAgICBGcmFjdGlvbk9mU2Vjb25kUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDMwOwogICAgICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbikgewogICAgICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAodmFsdWUyKSA9PiBNYXRoLnRydW5jKHZhbHVlMiAqIE1hdGgucG93KDEwLCAtdG9rZW4ubGVuZ3RoICsgMykpOwogICAgICAgIHJldHVybiBtYXBWYWx1ZShwYXJzZU5EaWdpdHModG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKSwgdmFsdWVDYWxsYmFjayk7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICAgICAgZGF0ZS5zZXRNaWxsaXNlY29uZHModmFsdWUyKTsKICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbInQiLCAiVCJdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSVNPVGltZXpvbmVXaXRoWlBhcnNlci5qcwp2YXIgSVNPVGltZXpvbmVXaXRoWlBhcnNlcjsKdmFyIGluaXRfSVNPVGltZXpvbmVXaXRoWlBhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSVNPVGltZXpvbmVXaXRoWlBhcnNlci5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcygpOwogICAgaW5pdF9jb25zdGFudHMyKCk7CiAgICBpbml0X1BhcnNlcigpOwogICAgaW5pdF91dGlscygpOwogICAgSVNPVGltZXpvbmVXaXRoWlBhcnNlciA9IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHsKICAgICAgcHJpb3JpdHkgPSAxMDsKICAgICAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4pIHsKICAgICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgICBjYXNlICJYIjoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKAogICAgICAgICAgICAgIHRpbWV6b25lUGF0dGVybnMuYmFzaWNPcHRpb25hbE1pbnV0ZXMsCiAgICAgICAgICAgICAgZGF0ZVN0cmluZwogICAgICAgICAgICApOwogICAgICAgICAgY2FzZSAiWFgiOgogICAgICAgICAgICByZXR1cm4gcGFyc2VUaW1lem9uZVBhdHRlcm4odGltZXpvbmVQYXR0ZXJucy5iYXNpYywgZGF0ZVN0cmluZyk7CiAgICAgICAgICBjYXNlICJYWFhYIjoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKAogICAgICAgICAgICAgIHRpbWV6b25lUGF0dGVybnMuYmFzaWNPcHRpb25hbFNlY29uZHMsCiAgICAgICAgICAgICAgZGF0ZVN0cmluZwogICAgICAgICAgICApOwogICAgICAgICAgY2FzZSAiWFhYWFgiOgogICAgICAgICAgICByZXR1cm4gcGFyc2VUaW1lem9uZVBhdHRlcm4oCiAgICAgICAgICAgICAgdGltZXpvbmVQYXR0ZXJucy5leHRlbmRlZE9wdGlvbmFsU2Vjb25kcywKICAgICAgICAgICAgICBkYXRlU3RyaW5nCiAgICAgICAgICAgICk7CiAgICAgICAgICBjYXNlICJYWFgiOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKHRpbWV6b25lUGF0dGVybnMuZXh0ZW5kZWQsIGRhdGVTdHJpbmcpOwogICAgICAgIH0KICAgICAgfQogICAgICBzZXQoZGF0ZSwgZmxhZ3MsIHZhbHVlMikgewogICAgICAgIGlmIChmbGFncy50aW1lc3RhbXBJc1NldCkgcmV0dXJuIGRhdGU7CiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdEZyb20oCiAgICAgICAgICBkYXRlLAogICAgICAgICAgZGF0ZS5nZXRUaW1lKCkgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGRhdGUpIC0gdmFsdWUyCiAgICAgICAgKTsKICAgICAgfQogICAgICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbInQiLCAiVCIsICJ4Il07CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9JU09UaW1lem9uZVBhcnNlci5qcwp2YXIgSVNPVGltZXpvbmVQYXJzZXI7CnZhciBpbml0X0lTT1RpbWV6b25lUGFyc2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9JU09UaW1lem9uZVBhcnNlci5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcygpOwogICAgaW5pdF9jb25zdGFudHMyKCk7CiAgICBpbml0X1BhcnNlcigpOwogICAgaW5pdF91dGlscygpOwogICAgSVNPVGltZXpvbmVQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgICAgIHByaW9yaXR5ID0gMTA7CiAgICAgIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuKSB7CiAgICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgICAgY2FzZSAieCI6CiAgICAgICAgICAgIHJldHVybiBwYXJzZVRpbWV6b25lUGF0dGVybigKICAgICAgICAgICAgICB0aW1lem9uZVBhdHRlcm5zLmJhc2ljT3B0aW9uYWxNaW51dGVzLAogICAgICAgICAgICAgIGRhdGVTdHJpbmcKICAgICAgICAgICAgKTsKICAgICAgICAgIGNhc2UgInh4IjoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKHRpbWV6b25lUGF0dGVybnMuYmFzaWMsIGRhdGVTdHJpbmcpOwogICAgICAgICAgY2FzZSAieHh4eCI6CiAgICAgICAgICAgIHJldHVybiBwYXJzZVRpbWV6b25lUGF0dGVybigKICAgICAgICAgICAgICB0aW1lem9uZVBhdHRlcm5zLmJhc2ljT3B0aW9uYWxTZWNvbmRzLAogICAgICAgICAgICAgIGRhdGVTdHJpbmcKICAgICAgICAgICAgKTsKICAgICAgICAgIGNhc2UgInh4eHh4IjoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlVGltZXpvbmVQYXR0ZXJuKAogICAgICAgICAgICAgIHRpbWV6b25lUGF0dGVybnMuZXh0ZW5kZWRPcHRpb25hbFNlY29uZHMsCiAgICAgICAgICAgICAgZGF0ZVN0cmluZwogICAgICAgICAgICApOwogICAgICAgICAgY2FzZSAieHh4IjoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBwYXJzZVRpbWV6b25lUGF0dGVybih0aW1lem9uZVBhdHRlcm5zLmV4dGVuZGVkLCBkYXRlU3RyaW5nKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZTIpIHsKICAgICAgICBpZiAoZmxhZ3MudGltZXN0YW1wSXNTZXQpIHJldHVybiBkYXRlOwogICAgICAgIHJldHVybiBjb25zdHJ1Y3RGcm9tKAogICAgICAgICAgZGF0ZSwKICAgICAgICAgIGRhdGUuZ2V0VGltZSgpIC0gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhkYXRlKSAtIHZhbHVlMgogICAgICAgICk7CiAgICAgIH0KICAgICAgaW5jb21wYXRpYmxlVG9rZW5zID0gWyJ0IiwgIlQiLCAiWCJdOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvVGltZXN0YW1wU2Vjb25kc1BhcnNlci5qcwp2YXIgVGltZXN0YW1wU2Vjb25kc1BhcnNlcjsKdmFyIGluaXRfVGltZXN0YW1wU2Vjb25kc1BhcnNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvVGltZXN0YW1wU2Vjb25kc1BhcnNlci5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfUGFyc2VyKCk7CiAgICBpbml0X3V0aWxzKCk7CiAgICBUaW1lc3RhbXBTZWNvbmRzUGFyc2VyID0gY2xhc3MgZXh0ZW5kcyBQYXJzZXIgewogICAgICBwcmlvcml0eSA9IDQwOwogICAgICBwYXJzZShkYXRlU3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlQW55RGlnaXRzU2lnbmVkKGRhdGVTdHJpbmcpOwogICAgICB9CiAgICAgIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlMikgewogICAgICAgIHJldHVybiBbY29uc3RydWN0RnJvbShkYXRlLCB2YWx1ZTIgKiAxZTMpLCB7IHRpbWVzdGFtcElzU2V0OiB0cnVlIH1dOwogICAgICB9CiAgICAgIGluY29tcGF0aWJsZVRva2VucyA9ICIqIjsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1RpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlci5qcwp2YXIgVGltZXN0YW1wTWlsbGlzZWNvbmRzUGFyc2VyOwp2YXIgaW5pdF9UaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1RpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlci5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfUGFyc2VyKCk7CiAgICBpbml0X3V0aWxzKCk7CiAgICBUaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIgPSBjbGFzcyBleHRlbmRzIFBhcnNlciB7CiAgICAgIHByaW9yaXR5ID0gMjA7CiAgICAgIHBhcnNlKGRhdGVTdHJpbmcpIHsKICAgICAgICByZXR1cm4gcGFyc2VBbnlEaWdpdHNTaWduZWQoZGF0ZVN0cmluZyk7CiAgICAgIH0KICAgICAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUyKSB7CiAgICAgICAgcmV0dXJuIFtjb25zdHJ1Y3RGcm9tKGRhdGUsIHZhbHVlMiksIHsgdGltZXN0YW1wSXNTZXQ6IHRydWUgfV07CiAgICAgIH0KICAgICAgaW5jb21wYXRpYmxlVG9rZW5zID0gIioiOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMuanMKdmFyIHBhcnNlcnM7CnZhciBpbml0X3BhcnNlcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzLmpzIigpIHsKICAgIGluaXRfRXJhUGFyc2VyKCk7CiAgICBpbml0X1llYXJQYXJzZXIoKTsKICAgIGluaXRfTG9jYWxXZWVrWWVhclBhcnNlcigpOwogICAgaW5pdF9JU09XZWVrWWVhclBhcnNlcigpOwogICAgaW5pdF9FeHRlbmRlZFllYXJQYXJzZXIoKTsKICAgIGluaXRfUXVhcnRlclBhcnNlcigpOwogICAgaW5pdF9TdGFuZEFsb25lUXVhcnRlclBhcnNlcigpOwogICAgaW5pdF9Nb250aFBhcnNlcigpOwogICAgaW5pdF9TdGFuZEFsb25lTW9udGhQYXJzZXIoKTsKICAgIGluaXRfTG9jYWxXZWVrUGFyc2VyKCk7CiAgICBpbml0X0lTT1dlZWtQYXJzZXIoKTsKICAgIGluaXRfRGF0ZVBhcnNlcigpOwogICAgaW5pdF9EYXlPZlllYXJQYXJzZXIoKTsKICAgIGluaXRfRGF5UGFyc2VyKCk7CiAgICBpbml0X0xvY2FsRGF5UGFyc2VyKCk7CiAgICBpbml0X1N0YW5kQWxvbmVMb2NhbERheVBhcnNlcigpOwogICAgaW5pdF9JU09EYXlQYXJzZXIoKTsKICAgIGluaXRfQU1QTVBhcnNlcigpOwogICAgaW5pdF9BTVBNTWlkbmlnaHRQYXJzZXIoKTsKICAgIGluaXRfRGF5UGVyaW9kUGFyc2VyKCk7CiAgICBpbml0X0hvdXIxdG8xMlBhcnNlcigpOwogICAgaW5pdF9Ib3VyMHRvMjNQYXJzZXIoKTsKICAgIGluaXRfSG91cjBUbzExUGFyc2VyKCk7CiAgICBpbml0X0hvdXIxVG8yNFBhcnNlcigpOwogICAgaW5pdF9NaW51dGVQYXJzZXIoKTsKICAgIGluaXRfU2Vjb25kUGFyc2VyKCk7CiAgICBpbml0X0ZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIoKTsKICAgIGluaXRfSVNPVGltZXpvbmVXaXRoWlBhcnNlcigpOwogICAgaW5pdF9JU09UaW1lem9uZVBhcnNlcigpOwogICAgaW5pdF9UaW1lc3RhbXBTZWNvbmRzUGFyc2VyKCk7CiAgICBpbml0X1RpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlcigpOwogICAgcGFyc2VycyA9IHsKICAgICAgRzogbmV3IEVyYVBhcnNlcigpLAogICAgICB5OiBuZXcgWWVhclBhcnNlcigpLAogICAgICBZOiBuZXcgTG9jYWxXZWVrWWVhclBhcnNlcigpLAogICAgICBSOiBuZXcgSVNPV2Vla1llYXJQYXJzZXIoKSwKICAgICAgdTogbmV3IEV4dGVuZGVkWWVhclBhcnNlcigpLAogICAgICBROiBuZXcgUXVhcnRlclBhcnNlcigpLAogICAgICBxOiBuZXcgU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIoKSwKICAgICAgTTogbmV3IE1vbnRoUGFyc2VyKCksCiAgICAgIEw6IG5ldyBTdGFuZEFsb25lTW9udGhQYXJzZXIoKSwKICAgICAgdzogbmV3IExvY2FsV2Vla1BhcnNlcigpLAogICAgICBJOiBuZXcgSVNPV2Vla1BhcnNlcigpLAogICAgICBkOiBuZXcgRGF0ZVBhcnNlcigpLAogICAgICBEOiBuZXcgRGF5T2ZZZWFyUGFyc2VyKCksCiAgICAgIEU6IG5ldyBEYXlQYXJzZXIoKSwKICAgICAgZTogbmV3IExvY2FsRGF5UGFyc2VyKCksCiAgICAgIGM6IG5ldyBTdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIoKSwKICAgICAgaTogbmV3IElTT0RheVBhcnNlcigpLAogICAgICBhOiBuZXcgQU1QTVBhcnNlcigpLAogICAgICBiOiBuZXcgQU1QTU1pZG5pZ2h0UGFyc2VyKCksCiAgICAgIEI6IG5ldyBEYXlQZXJpb2RQYXJzZXIoKSwKICAgICAgaDogbmV3IEhvdXIxdG8xMlBhcnNlcigpLAogICAgICBIOiBuZXcgSG91cjB0bzIzUGFyc2VyKCksCiAgICAgIEs6IG5ldyBIb3VyMFRvMTFQYXJzZXIoKSwKICAgICAgazogbmV3IEhvdXIxVG8yNFBhcnNlcigpLAogICAgICBtOiBuZXcgTWludXRlUGFyc2VyKCksCiAgICAgIHM6IG5ldyBTZWNvbmRQYXJzZXIoKSwKICAgICAgUzogbmV3IEZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIoKSwKICAgICAgWDogbmV3IElTT1RpbWV6b25lV2l0aFpQYXJzZXIoKSwKICAgICAgeDogbmV3IElTT1RpbWV6b25lUGFyc2VyKCksCiAgICAgIHQ6IG5ldyBUaW1lc3RhbXBTZWNvbmRzUGFyc2VyKCksCiAgICAgIFQ6IG5ldyBUaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIoKQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS5qcwpmdW5jdGlvbiBwYXJzZShkYXRlU3RyLCBmb3JtYXRTdHIsIHJlZmVyZW5jZURhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBpbnZhbGlkRGF0ZSA9ICgpID0+IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgcmVmZXJlbmNlRGF0ZSwgTmFOKTsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9uczIoKTsKICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMyLmxvY2FsZSA/PyBlblVTOwogIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBkZWZhdWx0T3B0aW9uczIuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyAxOwogIGNvbnN0IHdlZWtTdGFydHNPbiA9IG9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyAwOwogIGlmICghZm9ybWF0U3RyKQogICAgcmV0dXJuIGRhdGVTdHIgPyBpbnZhbGlkRGF0ZSgpIDogdG9EYXRlKHJlZmVyZW5jZURhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBzdWJGbk9wdGlvbnMgPSB7CiAgICBmaXJzdFdlZWtDb250YWluc0RhdGUsCiAgICB3ZWVrU3RhcnRzT24sCiAgICBsb2NhbGUKICB9OwogIGNvbnN0IHNldHRlcnMgPSBbbmV3IERhdGVUaW1lem9uZVNldHRlcihvcHRpb25zPy5pbiwgcmVmZXJlbmNlRGF0ZSldOwogIGNvbnN0IHRva2VucyA9IGZvcm1hdFN0ci5tYXRjaChsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cDIpLm1hcCgoc3Vic3RyaW5nKSA9PiB7CiAgICBjb25zdCBmaXJzdENoYXJhY3RlciA9IHN1YnN0cmluZ1swXTsKICAgIGlmIChmaXJzdENoYXJhY3RlciBpbiBsb25nRm9ybWF0dGVycykgewogICAgICBjb25zdCBsb25nRm9ybWF0dGVyID0gbG9uZ0Zvcm1hdHRlcnNbZmlyc3RDaGFyYWN0ZXJdOwogICAgICByZXR1cm4gbG9uZ0Zvcm1hdHRlcihzdWJzdHJpbmcsIGxvY2FsZS5mb3JtYXRMb25nKTsKICAgIH0KICAgIHJldHVybiBzdWJzdHJpbmc7CiAgfSkuam9pbigiIikubWF0Y2goZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cDIpOwogIGNvbnN0IHVzZWRUb2tlbnMgPSBbXTsKICBmb3IgKGxldCB0b2tlbiBvZiB0b2tlbnMpIHsKICAgIGlmICghb3B0aW9ucz8udXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zICYmIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikpIHsKICAgICAgd2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvcih0b2tlbiwgZm9ybWF0U3RyLCBkYXRlU3RyKTsKICAgIH0KICAgIGlmICghb3B0aW9ucz8udXNlQWRkaXRpb25hbERheU9mWWVhclRva2VucyAmJiBpc1Byb3RlY3RlZERheU9mWWVhclRva2VuKHRva2VuKSkgewogICAgICB3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yKHRva2VuLCBmb3JtYXRTdHIsIGRhdGVTdHIpOwogICAgfQogICAgY29uc3QgZmlyc3RDaGFyYWN0ZXIgPSB0b2tlblswXTsKICAgIGNvbnN0IHBhcnNlciA9IHBhcnNlcnNbZmlyc3RDaGFyYWN0ZXJdOwogICAgaWYgKHBhcnNlcikgewogICAgICBjb25zdCB7IGluY29tcGF0aWJsZVRva2VucyB9ID0gcGFyc2VyOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShpbmNvbXBhdGlibGVUb2tlbnMpKSB7CiAgICAgICAgY29uc3QgaW5jb21wYXRpYmxlVG9rZW4gPSB1c2VkVG9rZW5zLmZpbmQoCiAgICAgICAgICAodXNlZFRva2VuKSA9PiBpbmNvbXBhdGlibGVUb2tlbnMuaW5jbHVkZXModXNlZFRva2VuLnRva2VuKSB8fCB1c2VkVG9rZW4udG9rZW4gPT09IGZpcnN0Q2hhcmFjdGVyCiAgICAgICAgKTsKICAgICAgICBpZiAoaW5jb21wYXRpYmxlVG9rZW4pIHsKICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKAogICAgICAgICAgICBgVGhlIGZvcm1hdCBzdHJpbmcgbXVzdG4ndCBjb250YWluIFxgJHtpbmNvbXBhdGlibGVUb2tlbi5mdWxsVG9rZW59XGAgYW5kIFxgJHt0b2tlbn1cYCBhdCB0aGUgc2FtZSB0aW1lYAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAocGFyc2VyLmluY29tcGF0aWJsZVRva2VucyA9PT0gIioiICYmIHVzZWRUb2tlbnMubGVuZ3RoID4gMCkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKAogICAgICAgICAgYFRoZSBmb3JtYXQgc3RyaW5nIG11c3RuJ3QgY29udGFpbiBcYCR7dG9rZW59XGAgYW5kIGFueSBvdGhlciB0b2tlbiBhdCB0aGUgc2FtZSB0aW1lYAogICAgICAgICk7CiAgICAgIH0KICAgICAgdXNlZFRva2Vucy5wdXNoKHsgdG9rZW46IGZpcnN0Q2hhcmFjdGVyLCBmdWxsVG9rZW46IHRva2VuIH0pOwogICAgICBjb25zdCBwYXJzZVJlc3VsdCA9IHBhcnNlci5ydW4oCiAgICAgICAgZGF0ZVN0ciwKICAgICAgICB0b2tlbiwKICAgICAgICBsb2NhbGUubWF0Y2gsCiAgICAgICAgc3ViRm5PcHRpb25zCiAgICAgICk7CiAgICAgIGlmICghcGFyc2VSZXN1bHQpIHsKICAgICAgICByZXR1cm4gaW52YWxpZERhdGUoKTsKICAgICAgfQogICAgICBzZXR0ZXJzLnB1c2gocGFyc2VSZXN1bHQuc2V0dGVyKTsKICAgICAgZGF0ZVN0ciA9IHBhcnNlUmVzdWx0LnJlc3Q7CiAgICB9IGVsc2UgewogICAgICBpZiAoZmlyc3RDaGFyYWN0ZXIubWF0Y2godW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHAyKSkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKAogICAgICAgICAgIkZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlciBgIiArIGZpcnN0Q2hhcmFjdGVyICsgImAiCiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAodG9rZW4gPT09ICInJyIpIHsKICAgICAgICB0b2tlbiA9ICInIjsKICAgICAgfSBlbHNlIGlmIChmaXJzdENoYXJhY3RlciA9PT0gIiciKSB7CiAgICAgICAgdG9rZW4gPSBjbGVhbkVzY2FwZWRTdHJpbmcyKHRva2VuKTsKICAgICAgfQogICAgICBpZiAoZGF0ZVN0ci5pbmRleE9mKHRva2VuKSA9PT0gMCkgewogICAgICAgIGRhdGVTdHIgPSBkYXRlU3RyLnNsaWNlKHRva2VuLmxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGludmFsaWREYXRlKCk7CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKGRhdGVTdHIubGVuZ3RoID4gMCAmJiBub3RXaGl0ZXNwYWNlUmVnRXhwLnRlc3QoZGF0ZVN0cikpIHsKICAgIHJldHVybiBpbnZhbGlkRGF0ZSgpOwogIH0KICBjb25zdCB1bmlxdWVQcmlvcml0eVNldHRlcnMgPSBzZXR0ZXJzLm1hcCgoc2V0dGVyKSA9PiBzZXR0ZXIucHJpb3JpdHkpLnNvcnQoKGE1LCBiNikgPT4gYjYgLSBhNSkuZmlsdGVyKChwcmlvcml0eSwgaW5kZXgyLCBhcnJheSkgPT4gYXJyYXkuaW5kZXhPZihwcmlvcml0eSkgPT09IGluZGV4MikubWFwKAogICAgKHByaW9yaXR5KSA9PiBzZXR0ZXJzLmZpbHRlcigoc2V0dGVyKSA9PiBzZXR0ZXIucHJpb3JpdHkgPT09IHByaW9yaXR5KS5zb3J0KChhNSwgYjYpID0+IGI2LnN1YlByaW9yaXR5IC0gYTUuc3ViUHJpb3JpdHkpCiAgKS5tYXAoKHNldHRlckFycmF5KSA9PiBzZXR0ZXJBcnJheVswXSk7CiAgbGV0IGRhdGUgPSB0b0RhdGUocmVmZXJlbmNlRGF0ZSwgb3B0aW9ucz8uaW4pOwogIGlmIChpc05hTigrZGF0ZSkpIHJldHVybiBpbnZhbGlkRGF0ZSgpOwogIGNvbnN0IGZsYWdzID0ge307CiAgZm9yIChjb25zdCBzZXR0ZXIgb2YgdW5pcXVlUHJpb3JpdHlTZXR0ZXJzKSB7CiAgICBpZiAoIXNldHRlci52YWxpZGF0ZShkYXRlLCBzdWJGbk9wdGlvbnMpKSB7CiAgICAgIHJldHVybiBpbnZhbGlkRGF0ZSgpOwogICAgfQogICAgY29uc3QgcmVzdWx0ID0gc2V0dGVyLnNldChkYXRlLCBmbGFncywgc3ViRm5PcHRpb25zKTsKICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHsKICAgICAgZGF0ZSA9IHJlc3VsdFswXTsKICAgICAgT2JqZWN0LmFzc2lnbihmbGFncywgcmVzdWx0WzFdKTsKICAgIH0gZWxzZSB7CiAgICAgIGRhdGUgPSByZXN1bHQ7CiAgICB9CiAgfQogIHJldHVybiBkYXRlOwp9CmZ1bmN0aW9uIGNsZWFuRXNjYXBlZFN0cmluZzIoaW5wdXQpIHsKICByZXR1cm4gaW5wdXQubWF0Y2goZXNjYXBlZFN0cmluZ1JlZ0V4cDIpWzFdLnJlcGxhY2UoZG91YmxlUXVvdGVSZWdFeHAyLCAiJyIpOwp9CnZhciBmb3JtYXR0aW5nVG9rZW5zUmVnRXhwMiwgbG9uZ0Zvcm1hdHRpbmdUb2tlbnNSZWdFeHAyLCBlc2NhcGVkU3RyaW5nUmVnRXhwMiwgZG91YmxlUXVvdGVSZWdFeHAyLCBub3RXaGl0ZXNwYWNlUmVnRXhwLCB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cDIsIHBhcnNlX2RlZmF1bHQ7CnZhciBpbml0X3BhcnNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlLmpzIigpIHsKICAgIGluaXRfZGVmYXVsdExvY2FsZSgpOwogICAgaW5pdF9sb25nRm9ybWF0dGVycygpOwogICAgaW5pdF9wcm90ZWN0ZWRUb2tlbnMoKTsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF9nZXREZWZhdWx0T3B0aW9ucygpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIGluaXRfU2V0dGVyKCk7CiAgICBpbml0X3BhcnNlcnMoKTsKICAgIGZvcm1hdHRpbmdUb2tlbnNSZWdFeHAyID0gL1t5WVFxTUx3SWREZWNpaEhLa21zXW98KFx3KVwxKnwnJ3wnKCcnfFteJ10pKygnfCQpfC4vZzsKICAgIGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwMiA9IC9QK3ArfFArfHArfCcnfCcoJyd8W14nXSkrKCd8JCl8Li9nOwogICAgZXNjYXBlZFN0cmluZ1JlZ0V4cDIgPSAvXicoW15dKj8pJz8kLzsKICAgIGRvdWJsZVF1b3RlUmVnRXhwMiA9IC8nJy9nOwogICAgbm90V2hpdGVzcGFjZVJlZ0V4cCA9IC9cUy87CiAgICB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cDIgPSAvW2EtekEtWl0vOwogICAgcGFyc2VfZGVmYXVsdCA9IHBhcnNlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzTWF0Y2guanMKZnVuY3Rpb24gaXNNYXRjaDIoZGF0ZVN0ciwgZm9ybWF0U3RyLCBvcHRpb25zKSB7CiAgcmV0dXJuIGlzVmFsaWQocGFyc2UoZGF0ZVN0ciwgZm9ybWF0U3RyLCAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSwgb3B0aW9ucykpOwp9CnZhciBpc01hdGNoX2RlZmF1bHQ7CnZhciBpbml0X2lzTWF0Y2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNNYXRjaC5qcyIoKSB7CiAgICBpbml0X2lzVmFsaWQoKTsKICAgIGluaXRfcGFyc2UoKTsKICAgIGlzTWF0Y2hfZGVmYXVsdCA9IGlzTWF0Y2gyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzTW9uZGF5LmpzCmZ1bmN0aW9uIGlzTW9uZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKS5nZXREYXkoKSA9PT0gMTsKfQp2YXIgaXNNb25kYXlfZGVmYXVsdDsKdmFyIGluaXRfaXNNb25kYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNNb25kYXkuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGlzTW9uZGF5X2RlZmF1bHQgPSBpc01vbmRheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1Bhc3QuanMKZnVuY3Rpb24gaXNQYXN0KGRhdGUpIHsKICByZXR1cm4gK3RvRGF0ZShkYXRlKSA8IERhdGUubm93KCk7Cn0KdmFyIGlzUGFzdF9kZWZhdWx0Owp2YXIgaW5pdF9pc1Bhc3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNQYXN0LmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpc1Bhc3RfZGVmYXVsdCA9IGlzUGFzdDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mSG91ci5qcwpmdW5jdGlvbiBzdGFydE9mSG91cihkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIF9kYXRlLnNldE1pbnV0ZXMoMCwgMCwgMCk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBzdGFydE9mSG91cl9kZWZhdWx0Owp2YXIgaW5pdF9zdGFydE9mSG91ciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mSG91ci5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgc3RhcnRPZkhvdXJfZGVmYXVsdCA9IHN0YXJ0T2ZIb3VyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZUhvdXIuanMKZnVuY3Rpb24gaXNTYW1lSG91cihkYXRlTGVmdCwgZGF0ZVJpZ2h0LCBvcHRpb25zKSB7CiAgY29uc3QgW2RhdGVMZWZ0XywgZGF0ZVJpZ2h0X10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgZGF0ZUxlZnQsCiAgICBkYXRlUmlnaHQKICApOwogIHJldHVybiArc3RhcnRPZkhvdXIoZGF0ZUxlZnRfKSA9PT0gK3N0YXJ0T2ZIb3VyKGRhdGVSaWdodF8pOwp9CnZhciBpc1NhbWVIb3VyX2RlZmF1bHQ7CnZhciBpbml0X2lzU2FtZUhvdXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lSG91ci5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBpbml0X3N0YXJ0T2ZIb3VyKCk7CiAgICBpc1NhbWVIb3VyX2RlZmF1bHQgPSBpc1NhbWVIb3VyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZVdlZWsuanMKZnVuY3Rpb24gaXNTYW1lV2VlayhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIHJldHVybiArc3RhcnRPZldlZWsobGF0ZXJEYXRlXywgb3B0aW9ucykgPT09ICtzdGFydE9mV2VlayhlYXJsaWVyRGF0ZV8sIG9wdGlvbnMpOwp9CnZhciBpc1NhbWVXZWVrX2RlZmF1bHQ7CnZhciBpbml0X2lzU2FtZVdlZWsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lV2Vlay5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBpbml0X3N0YXJ0T2ZXZWVrKCk7CiAgICBpc1NhbWVXZWVrX2RlZmF1bHQgPSBpc1NhbWVXZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZUlTT1dlZWsuanMKZnVuY3Rpb24gaXNTYW1lSVNPV2VlayhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGlzU2FtZVdlZWsobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgeyAuLi5vcHRpb25zLCB3ZWVrU3RhcnRzT246IDEgfSk7Cn0KdmFyIGlzU2FtZUlTT1dlZWtfZGVmYXVsdDsKdmFyIGluaXRfaXNTYW1lSVNPV2VlayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVJU09XZWVrLmpzIigpIHsKICAgIGluaXRfaXNTYW1lV2VlaygpOwogICAgaXNTYW1lSVNPV2Vla19kZWZhdWx0ID0gaXNTYW1lSVNPV2VlazsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVJU09XZWVrWWVhci5qcwpmdW5jdGlvbiBpc1NhbWVJU09XZWVrWWVhcihsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcygKICAgIG9wdGlvbnM/LmluLAogICAgbGF0ZXJEYXRlLAogICAgZWFybGllckRhdGUKICApOwogIHJldHVybiArc3RhcnRPZklTT1dlZWtZZWFyKGxhdGVyRGF0ZV8pID09PSArc3RhcnRPZklTT1dlZWtZZWFyKGVhcmxpZXJEYXRlXyk7Cn0KdmFyIGlzU2FtZUlTT1dlZWtZZWFyX2RlZmF1bHQ7CnZhciBpbml0X2lzU2FtZUlTT1dlZWtZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZUlTT1dlZWtZZWFyLmpzIigpIHsKICAgIGluaXRfc3RhcnRPZklTT1dlZWtZZWFyKCk7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBpc1NhbWVJU09XZWVrWWVhcl9kZWZhdWx0ID0gaXNTYW1lSVNPV2Vla1llYXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZk1pbnV0ZS5qcwpmdW5jdGlvbiBzdGFydE9mTWludXRlKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgZGF0ZV8uc2V0U2Vjb25kcygwLCAwKTsKICByZXR1cm4gZGF0ZV87Cn0KdmFyIHN0YXJ0T2ZNaW51dGVfZGVmYXVsdDsKdmFyIGluaXRfc3RhcnRPZk1pbnV0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mTWludXRlLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzdGFydE9mTWludXRlX2RlZmF1bHQgPSBzdGFydE9mTWludXRlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZU1pbnV0ZS5qcwpmdW5jdGlvbiBpc1NhbWVNaW51dGUobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSkgewogIHJldHVybiArc3RhcnRPZk1pbnV0ZShsYXRlckRhdGUpID09PSArc3RhcnRPZk1pbnV0ZShlYXJsaWVyRGF0ZSk7Cn0KdmFyIGlzU2FtZU1pbnV0ZV9kZWZhdWx0Owp2YXIgaW5pdF9pc1NhbWVNaW51dGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lTWludXRlLmpzIigpIHsKICAgIGluaXRfc3RhcnRPZk1pbnV0ZSgpOwogICAgaXNTYW1lTWludXRlX2RlZmF1bHQgPSBpc1NhbWVNaW51dGU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lTW9udGguanMKZnVuY3Rpb24gaXNTYW1lTW9udGgobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICByZXR1cm4gbGF0ZXJEYXRlXy5nZXRGdWxsWWVhcigpID09PSBlYXJsaWVyRGF0ZV8uZ2V0RnVsbFllYXIoKSAmJiBsYXRlckRhdGVfLmdldE1vbnRoKCkgPT09IGVhcmxpZXJEYXRlXy5nZXRNb250aCgpOwp9CnZhciBpc1NhbWVNb250aF9kZWZhdWx0Owp2YXIgaW5pdF9pc1NhbWVNb250aCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVNb250aC5qcyIoKSB7CiAgICBpbml0X25vcm1hbGl6ZURhdGVzKCk7CiAgICBpc1NhbWVNb250aF9kZWZhdWx0ID0gaXNTYW1lTW9udGg7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lUXVhcnRlci5qcwpmdW5jdGlvbiBpc1NhbWVRdWFydGVyKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBbZGF0ZUxlZnRfLCBkYXRlUmlnaHRfXSA9IG5vcm1hbGl6ZURhdGVzKAogICAgb3B0aW9ucz8uaW4sCiAgICBsYXRlckRhdGUsCiAgICBlYXJsaWVyRGF0ZQogICk7CiAgcmV0dXJuICtzdGFydE9mUXVhcnRlcihkYXRlTGVmdF8pID09PSArc3RhcnRPZlF1YXJ0ZXIoZGF0ZVJpZ2h0Xyk7Cn0KdmFyIGlzU2FtZVF1YXJ0ZXJfZGVmYXVsdDsKdmFyIGluaXRfaXNTYW1lUXVhcnRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVRdWFydGVyLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplRGF0ZXMoKTsKICAgIGluaXRfc3RhcnRPZlF1YXJ0ZXIoKTsKICAgIGlzU2FtZVF1YXJ0ZXJfZGVmYXVsdCA9IGlzU2FtZVF1YXJ0ZXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZlNlY29uZC5qcwpmdW5jdGlvbiBzdGFydE9mU2Vjb25kKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgZGF0ZV8uc2V0TWlsbGlzZWNvbmRzKDApOwogIHJldHVybiBkYXRlXzsKfQp2YXIgc3RhcnRPZlNlY29uZF9kZWZhdWx0Owp2YXIgaW5pdF9zdGFydE9mU2Vjb25kID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZTZWNvbmQuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIHN0YXJ0T2ZTZWNvbmRfZGVmYXVsdCA9IHN0YXJ0T2ZTZWNvbmQ7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lU2Vjb25kLmpzCmZ1bmN0aW9uIGlzU2FtZVNlY29uZChsYXRlckRhdGUsIGVhcmxpZXJEYXRlKSB7CiAgcmV0dXJuICtzdGFydE9mU2Vjb25kKGxhdGVyRGF0ZSkgPT09ICtzdGFydE9mU2Vjb25kKGVhcmxpZXJEYXRlKTsKfQp2YXIgaXNTYW1lU2Vjb25kX2RlZmF1bHQ7CnZhciBpbml0X2lzU2FtZVNlY29uZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVTZWNvbmQuanMiKCkgewogICAgaW5pdF9zdGFydE9mU2Vjb25kKCk7CiAgICBpc1NhbWVTZWNvbmRfZGVmYXVsdCA9IGlzU2FtZVNlY29uZDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVZZWFyLmpzCmZ1bmN0aW9uIGlzU2FtZVllYXIobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IFtsYXRlckRhdGVfLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoCiAgICBvcHRpb25zPy5pbiwKICAgIGxhdGVyRGF0ZSwKICAgIGVhcmxpZXJEYXRlCiAgKTsKICByZXR1cm4gbGF0ZXJEYXRlXy5nZXRGdWxsWWVhcigpID09PSBlYXJsaWVyRGF0ZV8uZ2V0RnVsbFllYXIoKTsKfQp2YXIgaXNTYW1lWWVhcl9kZWZhdWx0Owp2YXIgaW5pdF9pc1NhbWVZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZVllYXIuanMiKCkgewogICAgaW5pdF9ub3JtYWxpemVEYXRlcygpOwogICAgaXNTYW1lWWVhcl9kZWZhdWx0ID0gaXNTYW1lWWVhcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNIb3VyLmpzCmZ1bmN0aW9uIGlzVGhpc0hvdXIoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBpc1NhbWVIb3VyKAogICAgdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKSwKICAgIGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbiB8fCBkYXRlKQogICk7Cn0KdmFyIGlzVGhpc0hvdXJfZGVmYXVsdDsKdmFyIGluaXRfaXNUaGlzSG91ciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNIb3VyLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0Tm93KCk7CiAgICBpbml0X2lzU2FtZUhvdXIoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpc1RoaXNIb3VyX2RlZmF1bHQgPSBpc1RoaXNIb3VyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGhpc0lTT1dlZWsuanMKZnVuY3Rpb24gaXNUaGlzSVNPV2VlayhkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGlzU2FtZUlTT1dlZWsoCiAgICBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIGRhdGUpLAogICAgY29uc3RydWN0Tm93KG9wdGlvbnM/LmluIHx8IGRhdGUpCiAgKTsKfQp2YXIgaXNUaGlzSVNPV2Vla19kZWZhdWx0Owp2YXIgaW5pdF9pc1RoaXNJU09XZWVrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGhpc0lTT1dlZWsuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X2NvbnN0cnVjdE5vdygpOwogICAgaW5pdF9pc1NhbWVJU09XZWVrKCk7CiAgICBpc1RoaXNJU09XZWVrX2RlZmF1bHQgPSBpc1RoaXNJU09XZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGhpc01pbnV0ZS5qcwpmdW5jdGlvbiBpc1RoaXNNaW51dGUoZGF0ZSkgewogIHJldHVybiBpc1NhbWVNaW51dGUoZGF0ZSwgY29uc3RydWN0Tm93KGRhdGUpKTsKfQp2YXIgaXNUaGlzTWludXRlX2RlZmF1bHQ7CnZhciBpbml0X2lzVGhpc01pbnV0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNNaW51dGUuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3ROb3coKTsKICAgIGluaXRfaXNTYW1lTWludXRlKCk7CiAgICBpc1RoaXNNaW51dGVfZGVmYXVsdCA9IGlzVGhpc01pbnV0ZTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNNb250aC5qcwpmdW5jdGlvbiBpc1RoaXNNb250aChkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGlzU2FtZU1vbnRoKAogICAgY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBkYXRlKSwKICAgIGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbiB8fCBkYXRlKQogICk7Cn0KdmFyIGlzVGhpc01vbnRoX2RlZmF1bHQ7CnZhciBpbml0X2lzVGhpc01vbnRoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGhpc01vbnRoLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF9jb25zdHJ1Y3ROb3coKTsKICAgIGluaXRfaXNTYW1lTW9udGgoKTsKICAgIGlzVGhpc01vbnRoX2RlZmF1bHQgPSBpc1RoaXNNb250aDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNRdWFydGVyLmpzCmZ1bmN0aW9uIGlzVGhpc1F1YXJ0ZXIoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBpc1NhbWVRdWFydGVyKAogICAgY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBkYXRlKSwKICAgIGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbiB8fCBkYXRlKQogICk7Cn0KdmFyIGlzVGhpc1F1YXJ0ZXJfZGVmYXVsdDsKdmFyIGluaXRfaXNUaGlzUXVhcnRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNRdWFydGVyLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF9jb25zdHJ1Y3ROb3coKTsKICAgIGluaXRfaXNTYW1lUXVhcnRlcigpOwogICAgaXNUaGlzUXVhcnRlcl9kZWZhdWx0ID0gaXNUaGlzUXVhcnRlcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RoaXNTZWNvbmQuanMKZnVuY3Rpb24gaXNUaGlzU2Vjb25kKGRhdGUpIHsKICByZXR1cm4gaXNTYW1lU2Vjb25kKGRhdGUsIGNvbnN0cnVjdE5vdyhkYXRlKSk7Cn0KdmFyIGlzVGhpc1NlY29uZF9kZWZhdWx0Owp2YXIgaW5pdF9pc1RoaXNTZWNvbmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNUaGlzU2Vjb25kLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0Tm93KCk7CiAgICBpbml0X2lzU2FtZVNlY29uZCgpOwogICAgaXNUaGlzU2Vjb25kX2RlZmF1bHQgPSBpc1RoaXNTZWNvbmQ7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNUaGlzV2Vlay5qcwpmdW5jdGlvbiBpc1RoaXNXZWVrKGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gaXNTYW1lV2VlaygKICAgIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgZGF0ZSksCiAgICBjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4gfHwgZGF0ZSksCiAgICBvcHRpb25zCiAgKTsKfQp2YXIgaXNUaGlzV2Vla19kZWZhdWx0Owp2YXIgaW5pdF9pc1RoaXNXZWVrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGhpc1dlZWsuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X2NvbnN0cnVjdE5vdygpOwogICAgaW5pdF9pc1NhbWVXZWVrKCk7CiAgICBpc1RoaXNXZWVrX2RlZmF1bHQgPSBpc1RoaXNXZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGhpc1llYXIuanMKZnVuY3Rpb24gaXNUaGlzWWVhcihkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGlzU2FtZVllYXIoCiAgICBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIGRhdGUpLAogICAgY29uc3RydWN0Tm93KG9wdGlvbnM/LmluIHx8IGRhdGUpCiAgKTsKfQp2YXIgaXNUaGlzWWVhcl9kZWZhdWx0Owp2YXIgaW5pdF9pc1RoaXNZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGhpc1llYXIuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X2NvbnN0cnVjdE5vdygpOwogICAgaW5pdF9pc1NhbWVZZWFyKCk7CiAgICBpc1RoaXNZZWFyX2RlZmF1bHQgPSBpc1RoaXNZZWFyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVGh1cnNkYXkuanMKZnVuY3Rpb24gaXNUaHVyc2RheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbikuZ2V0RGF5KCkgPT09IDQ7Cn0KdmFyIGlzVGh1cnNkYXlfZGVmYXVsdDsKdmFyIGluaXRfaXNUaHVyc2RheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RodXJzZGF5LmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpc1RodXJzZGF5X2RlZmF1bHQgPSBpc1RodXJzZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVG9kYXkuanMKZnVuY3Rpb24gaXNUb2RheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGlzU2FtZURheSgKICAgIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgZGF0ZSksCiAgICBjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4gfHwgZGF0ZSkKICApOwp9CnZhciBpc1RvZGF5X2RlZmF1bHQ7CnZhciBpbml0X2lzVG9kYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNUb2RheS5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfY29uc3RydWN0Tm93KCk7CiAgICBpbml0X2lzU2FtZURheSgpOwogICAgaXNUb2RheV9kZWZhdWx0ID0gaXNUb2RheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RvbW9ycm93LmpzCmZ1bmN0aW9uIGlzVG9tb3Jyb3coZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBpc1NhbWVEYXkoCiAgICBkYXRlLAogICAgYWRkRGF5cyhjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4gfHwgZGF0ZSksIDEpLAogICAgb3B0aW9ucwogICk7Cn0KdmFyIGlzVG9tb3Jyb3dfZGVmYXVsdDsKdmFyIGluaXRfaXNUb21vcnJvdyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1RvbW9ycm93LmpzIigpIHsKICAgIGluaXRfYWRkRGF5cygpOwogICAgaW5pdF9jb25zdHJ1Y3ROb3coKTsKICAgIGluaXRfaXNTYW1lRGF5KCk7CiAgICBpc1RvbW9ycm93X2RlZmF1bHQgPSBpc1RvbW9ycm93OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVHVlc2RheS5qcwpmdW5jdGlvbiBpc1R1ZXNkYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldERheSgpID09PSAyOwp9CnZhciBpc1R1ZXNkYXlfZGVmYXVsdDsKdmFyIGluaXRfaXNUdWVzZGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVHVlc2RheS5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgaXNUdWVzZGF5X2RlZmF1bHQgPSBpc1R1ZXNkYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNXZWRuZXNkYXkuanMKZnVuY3Rpb24gaXNXZWRuZXNkYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pLmdldERheSgpID09PSAzOwp9CnZhciBpc1dlZG5lc2RheV9kZWZhdWx0Owp2YXIgaW5pdF9pc1dlZG5lc2RheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1dlZG5lc2RheS5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgaXNXZWRuZXNkYXlfZGVmYXVsdCA9IGlzV2VkbmVzZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzV2l0aGluSW50ZXJ2YWwuanMKZnVuY3Rpb24gaXNXaXRoaW5JbnRlcnZhbChkYXRlLCBpbnRlcnZhbDMsIG9wdGlvbnMpIHsKICBjb25zdCB0aW1lID0gK3RvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgW3N0YXJ0VGltZSwgZW5kVGltZV0gPSBbCiAgICArdG9EYXRlKGludGVydmFsMy5zdGFydCwgb3B0aW9ucz8uaW4pLAogICAgK3RvRGF0ZShpbnRlcnZhbDMuZW5kLCBvcHRpb25zPy5pbikKICBdLnNvcnQoKGE1LCBiNikgPT4gYTUgLSBiNik7CiAgcmV0dXJuIHRpbWUgPj0gc3RhcnRUaW1lICYmIHRpbWUgPD0gZW5kVGltZTsKfQp2YXIgaXNXaXRoaW5JbnRlcnZhbF9kZWZhdWx0Owp2YXIgaW5pdF9pc1dpdGhpbkludGVydmFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzV2l0aGluSW50ZXJ2YWwuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGlzV2l0aGluSW50ZXJ2YWxfZGVmYXVsdCA9IGlzV2l0aGluSW50ZXJ2YWw7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViRGF5cy5qcwpmdW5jdGlvbiBzdWJEYXlzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGREYXlzKGRhdGUsIC1hbW91bnQsIG9wdGlvbnMpOwp9CnZhciBzdWJEYXlzX2RlZmF1bHQ7CnZhciBpbml0X3N1YkRheXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViRGF5cy5qcyIoKSB7CiAgICBpbml0X2FkZERheXMoKTsKICAgIHN1YkRheXNfZGVmYXVsdCA9IHN1YkRheXM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNZZXN0ZXJkYXkuanMKZnVuY3Rpb24gaXNZZXN0ZXJkYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBpc1NhbWVEYXkoCiAgICBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIGRhdGUpLAogICAgc3ViRGF5cyhjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4gfHwgZGF0ZSksIDEpCiAgKTsKfQp2YXIgaXNZZXN0ZXJkYXlfZGVmYXVsdDsKdmFyIGluaXRfaXNZZXN0ZXJkYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNZZXN0ZXJkYXkuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X2NvbnN0cnVjdE5vdygpOwogICAgaW5pdF9pc1NhbWVEYXkoKTsKICAgIGluaXRfc3ViRGF5cygpOwogICAgaXNZZXN0ZXJkYXlfZGVmYXVsdCA9IGlzWWVzdGVyZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xhc3REYXlPZkRlY2FkZS5qcwpmdW5jdGlvbiBsYXN0RGF5T2ZEZWNhZGUoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTsKICBjb25zdCBkZWNhZGUgPSA5ICsgTWF0aC5mbG9vcih5ZWFyIC8gMTApICogMTA7CiAgX2RhdGUuc2V0RnVsbFllYXIoZGVjYWRlICsgMSwgMCwgMCk7CiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgcmV0dXJuIHRvRGF0ZShfZGF0ZSwgb3B0aW9ucz8uaW4pOwp9CnZhciBsYXN0RGF5T2ZEZWNhZGVfZGVmYXVsdDsKdmFyIGluaXRfbGFzdERheU9mRGVjYWRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xhc3REYXlPZkRlY2FkZS5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgbGFzdERheU9mRGVjYWRlX2RlZmF1bHQgPSBsYXN0RGF5T2ZEZWNhZGU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbGFzdERheU9mV2Vlay5qcwpmdW5jdGlvbiBsYXN0RGF5T2ZXZWVrKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSBnZXREZWZhdWx0T3B0aW9ucygpOwogIGNvbnN0IHdlZWtTdGFydHNPbiA9IG9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyBkZWZhdWx0T3B0aW9uczIud2Vla1N0YXJ0c09uID8/IGRlZmF1bHRPcHRpb25zMi5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/PyAwOwogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBkYXkgPSBfZGF0ZS5nZXREYXkoKTsKICBjb25zdCBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IC03IDogMCkgKyA2IC0gKGRheSAtIHdlZWtTdGFydHNPbik7CiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgKyBkaWZmKTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIGxhc3REYXlPZldlZWtfZGVmYXVsdDsKdmFyIGluaXRfbGFzdERheU9mV2VlayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sYXN0RGF5T2ZXZWVrLmpzIigpIHsKICAgIGluaXRfZGVmYXVsdE9wdGlvbnMoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBsYXN0RGF5T2ZXZWVrX2RlZmF1bHQgPSBsYXN0RGF5T2ZXZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xhc3REYXlPZklTT1dlZWsuanMKZnVuY3Rpb24gbGFzdERheU9mSVNPV2VlayhkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIGxhc3REYXlPZldlZWsoZGF0ZSwgeyAuLi5vcHRpb25zLCB3ZWVrU3RhcnRzT246IDEgfSk7Cn0KdmFyIGxhc3REYXlPZklTT1dlZWtfZGVmYXVsdDsKdmFyIGluaXRfbGFzdERheU9mSVNPV2VlayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sYXN0RGF5T2ZJU09XZWVrLmpzIigpIHsKICAgIGluaXRfbGFzdERheU9mV2VlaygpOwogICAgbGFzdERheU9mSVNPV2Vla19kZWZhdWx0ID0gbGFzdERheU9mSVNPV2VlazsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sYXN0RGF5T2ZJU09XZWVrWWVhci5qcwpmdW5jdGlvbiBsYXN0RGF5T2ZJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7CiAgY29uc3QgeWVhciA9IGdldElTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpOwogIGNvbnN0IGZvdXJ0aE9mSmFudWFyeSA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgMCk7CiAgZm91cnRoT2ZKYW51YXJ5LnNldEZ1bGxZZWFyKHllYXIgKyAxLCAwLCA0KTsKICBmb3VydGhPZkphbnVhcnkuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgY29uc3QgZGF0ZV8gPSBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnksIG9wdGlvbnMpOwogIGRhdGVfLnNldERhdGUoZGF0ZV8uZ2V0RGF0ZSgpIC0gMSk7CiAgcmV0dXJuIGRhdGVfOwp9CnZhciBsYXN0RGF5T2ZJU09XZWVrWWVhcl9kZWZhdWx0Owp2YXIgaW5pdF9sYXN0RGF5T2ZJU09XZWVrWWVhciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sYXN0RGF5T2ZJU09XZWVrWWVhci5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfZ2V0SVNPV2Vla1llYXIoKTsKICAgIGluaXRfc3RhcnRPZklTT1dlZWsoKTsKICAgIGxhc3REYXlPZklTT1dlZWtZZWFyX2RlZmF1bHQgPSBsYXN0RGF5T2ZJU09XZWVrWWVhcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sYXN0RGF5T2ZRdWFydGVyLmpzCmZ1bmN0aW9uIGxhc3REYXlPZlF1YXJ0ZXIoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBjdXJyZW50TW9udGggPSBkYXRlXy5nZXRNb250aCgpOwogIGNvbnN0IG1vbnRoID0gY3VycmVudE1vbnRoIC0gY3VycmVudE1vbnRoICUgMyArIDM7CiAgZGF0ZV8uc2V0TW9udGgobW9udGgsIDApOwogIGRhdGVfLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiBkYXRlXzsKfQp2YXIgbGFzdERheU9mUXVhcnRlcl9kZWZhdWx0Owp2YXIgaW5pdF9sYXN0RGF5T2ZRdWFydGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xhc3REYXlPZlF1YXJ0ZXIuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGxhc3REYXlPZlF1YXJ0ZXJfZGVmYXVsdCA9IGxhc3REYXlPZlF1YXJ0ZXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbGFzdERheU9mWWVhci5qcwpmdW5jdGlvbiBsYXN0RGF5T2ZZZWFyKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IGRhdGVfLmdldEZ1bGxZZWFyKCk7CiAgZGF0ZV8uc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDApOwogIGRhdGVfLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiBkYXRlXzsKfQp2YXIgbGFzdERheU9mWWVhcl9kZWZhdWx0Owp2YXIgaW5pdF9sYXN0RGF5T2ZZZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xhc3REYXlPZlllYXIuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIGxhc3REYXlPZlllYXJfZGVmYXVsdCA9IGxhc3REYXlPZlllYXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbGlnaHRGb3JtYXQuanMKZnVuY3Rpb24gbGlnaHRGb3JtYXQoZGF0ZSwgZm9ybWF0U3RyKSB7CiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSk7CiAgaWYgKCFpc1ZhbGlkKGRhdGVfKSkgewogICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdGltZSB2YWx1ZSIpOwogIH0KICBjb25zdCB0b2tlbnMgPSBmb3JtYXRTdHIubWF0Y2goZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cDMpOwogIGlmICghdG9rZW5zKSByZXR1cm4gIiI7CiAgY29uc3QgcmVzdWx0ID0gdG9rZW5zLm1hcCgoc3Vic3RyaW5nKSA9PiB7CiAgICBpZiAoc3Vic3RyaW5nID09PSAiJyciKSB7CiAgICAgIHJldHVybiAiJyI7CiAgICB9CiAgICBjb25zdCBmaXJzdENoYXJhY3RlciA9IHN1YnN0cmluZ1swXTsKICAgIGlmIChmaXJzdENoYXJhY3RlciA9PT0gIiciKSB7CiAgICAgIHJldHVybiBjbGVhbkVzY2FwZWRTdHJpbmczKHN1YnN0cmluZyk7CiAgICB9CiAgICBjb25zdCBmb3JtYXR0ZXIyID0gbGlnaHRGb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXTsKICAgIGlmIChmb3JtYXR0ZXIyKSB7CiAgICAgIHJldHVybiBmb3JtYXR0ZXIyKGRhdGVfLCBzdWJzdHJpbmcpOwogICAgfQogICAgaWYgKGZpcnN0Q2hhcmFjdGVyLm1hdGNoKHVuZXNjYXBlZExhdGluQ2hhcmFjdGVyUmVnRXhwMykpIHsKICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoCiAgICAgICAgIkZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlciBgIiArIGZpcnN0Q2hhcmFjdGVyICsgImAiCiAgICAgICk7CiAgICB9CiAgICByZXR1cm4gc3Vic3RyaW5nOwogIH0pLmpvaW4oIiIpOwogIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gY2xlYW5Fc2NhcGVkU3RyaW5nMyhpbnB1dCkgewogIGNvbnN0IG1hdGNoZXMgPSBpbnB1dC5tYXRjaChlc2NhcGVkU3RyaW5nUmVnRXhwMyk7CiAgaWYgKCFtYXRjaGVzKSByZXR1cm4gaW5wdXQ7CiAgcmV0dXJuIG1hdGNoZXNbMV0ucmVwbGFjZShkb3VibGVRdW90ZVJlZ0V4cDMsICInIik7Cn0KdmFyIGZvcm1hdHRpbmdUb2tlbnNSZWdFeHAzLCBlc2NhcGVkU3RyaW5nUmVnRXhwMywgZG91YmxlUXVvdGVSZWdFeHAzLCB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cDMsIGxpZ2h0Rm9ybWF0X2RlZmF1bHQ7CnZhciBpbml0X2xpZ2h0Rm9ybWF0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xpZ2h0Rm9ybWF0LmpzIigpIHsKICAgIGluaXRfbGlnaHRGb3JtYXR0ZXJzKCk7CiAgICBpbml0X2lzVmFsaWQoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBmb3JtYXR0aW5nVG9rZW5zUmVnRXhwMyA9IC8oXHcpXDEqfCcnfCcoJyd8W14nXSkrKCd8JCl8Li9nOwogICAgZXNjYXBlZFN0cmluZ1JlZ0V4cDMgPSAvXicoW15dKj8pJz8kLzsKICAgIGRvdWJsZVF1b3RlUmVnRXhwMyA9IC8nJy9nOwogICAgdW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHAzID0gL1thLXpBLVpdLzsKICAgIGxpZ2h0Rm9ybWF0X2RlZmF1bHQgPSBsaWdodEZvcm1hdDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taWxsaXNlY29uZHMuanMKZnVuY3Rpb24gbWlsbGlzZWNvbmRzKHsKICB5ZWFycywKICBtb250aHM6IG1vbnRoczIsCiAgd2Vla3MsCiAgZGF5czogZGF5czIsCiAgaG91cnMsCiAgbWludXRlcywKICBzZWNvbmRzCn0pIHsKICBsZXQgdG90YWxEYXlzID0gMDsKICBpZiAoeWVhcnMpIHRvdGFsRGF5cyArPSB5ZWFycyAqIGRheXNJblllYXI7CiAgaWYgKG1vbnRoczIpIHRvdGFsRGF5cyArPSBtb250aHMyICogKGRheXNJblllYXIgLyAxMik7CiAgaWYgKHdlZWtzKSB0b3RhbERheXMgKz0gd2Vla3MgKiA3OwogIGlmIChkYXlzMikgdG90YWxEYXlzICs9IGRheXMyOwogIGxldCB0b3RhbFNlY29uZHMgPSB0b3RhbERheXMgKiAyNCAqIDYwICogNjA7CiAgaWYgKGhvdXJzKSB0b3RhbFNlY29uZHMgKz0gaG91cnMgKiA2MCAqIDYwOwogIGlmIChtaW51dGVzKSB0b3RhbFNlY29uZHMgKz0gbWludXRlcyAqIDYwOwogIGlmIChzZWNvbmRzKSB0b3RhbFNlY29uZHMgKz0gc2Vjb25kczsKICByZXR1cm4gTWF0aC50cnVuYyh0b3RhbFNlY29uZHMgKiAxZTMpOwp9CnZhciBtaWxsaXNlY29uZHNfZGVmYXVsdDsKdmFyIGluaXRfbWlsbGlzZWNvbmRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21pbGxpc2Vjb25kcy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgbWlsbGlzZWNvbmRzX2RlZmF1bHQgPSBtaWxsaXNlY29uZHM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbWlsbGlzZWNvbmRzVG9Ib3Vycy5qcwpmdW5jdGlvbiBtaWxsaXNlY29uZHNUb0hvdXJzKG1pbGxpc2Vjb25kczIpIHsKICBjb25zdCBob3VycyA9IG1pbGxpc2Vjb25kczIgLyBtaWxsaXNlY29uZHNJbkhvdXI7CiAgcmV0dXJuIE1hdGgudHJ1bmMoaG91cnMpOwp9CnZhciBtaWxsaXNlY29uZHNUb0hvdXJzX2RlZmF1bHQ7CnZhciBpbml0X21pbGxpc2Vjb25kc1RvSG91cnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbWlsbGlzZWNvbmRzVG9Ib3Vycy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgbWlsbGlzZWNvbmRzVG9Ib3Vyc19kZWZhdWx0ID0gbWlsbGlzZWNvbmRzVG9Ib3VyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taWxsaXNlY29uZHNUb01pbnV0ZXMuanMKZnVuY3Rpb24gbWlsbGlzZWNvbmRzVG9NaW51dGVzKG1pbGxpc2Vjb25kczIpIHsKICBjb25zdCBtaW51dGVzID0gbWlsbGlzZWNvbmRzMiAvIG1pbGxpc2Vjb25kc0luTWludXRlOwogIHJldHVybiBNYXRoLnRydW5jKG1pbnV0ZXMpOwp9CnZhciBtaWxsaXNlY29uZHNUb01pbnV0ZXNfZGVmYXVsdDsKdmFyIGluaXRfbWlsbGlzZWNvbmRzVG9NaW51dGVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21pbGxpc2Vjb25kc1RvTWludXRlcy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgbWlsbGlzZWNvbmRzVG9NaW51dGVzX2RlZmF1bHQgPSBtaWxsaXNlY29uZHNUb01pbnV0ZXM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbWlsbGlzZWNvbmRzVG9TZWNvbmRzLmpzCmZ1bmN0aW9uIG1pbGxpc2Vjb25kc1RvU2Vjb25kcyhtaWxsaXNlY29uZHMyKSB7CiAgY29uc3Qgc2Vjb25kcyA9IG1pbGxpc2Vjb25kczIgLyBtaWxsaXNlY29uZHNJblNlY29uZDsKICByZXR1cm4gTWF0aC50cnVuYyhzZWNvbmRzKTsKfQp2YXIgbWlsbGlzZWNvbmRzVG9TZWNvbmRzX2RlZmF1bHQ7CnZhciBpbml0X21pbGxpc2Vjb25kc1RvU2Vjb25kcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taWxsaXNlY29uZHNUb1NlY29uZHMuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIG1pbGxpc2Vjb25kc1RvU2Vjb25kc19kZWZhdWx0ID0gbWlsbGlzZWNvbmRzVG9TZWNvbmRzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21pbnV0ZXNUb0hvdXJzLmpzCmZ1bmN0aW9uIG1pbnV0ZXNUb0hvdXJzKG1pbnV0ZXMpIHsKICBjb25zdCBob3VycyA9IG1pbnV0ZXMgLyBtaW51dGVzSW5Ib3VyOwogIHJldHVybiBNYXRoLnRydW5jKGhvdXJzKTsKfQp2YXIgbWludXRlc1RvSG91cnNfZGVmYXVsdDsKdmFyIGluaXRfbWludXRlc1RvSG91cnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbWludXRlc1RvSG91cnMuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIG1pbnV0ZXNUb0hvdXJzX2RlZmF1bHQgPSBtaW51dGVzVG9Ib3VyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taW51dGVzVG9NaWxsaXNlY29uZHMuanMKZnVuY3Rpb24gbWludXRlc1RvTWlsbGlzZWNvbmRzKG1pbnV0ZXMpIHsKICByZXR1cm4gTWF0aC50cnVuYyhtaW51dGVzICogbWlsbGlzZWNvbmRzSW5NaW51dGUpOwp9CnZhciBtaW51dGVzVG9NaWxsaXNlY29uZHNfZGVmYXVsdDsKdmFyIGluaXRfbWludXRlc1RvTWlsbGlzZWNvbmRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21pbnV0ZXNUb01pbGxpc2Vjb25kcy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgbWludXRlc1RvTWlsbGlzZWNvbmRzX2RlZmF1bHQgPSBtaW51dGVzVG9NaWxsaXNlY29uZHM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbWludXRlc1RvU2Vjb25kcy5qcwpmdW5jdGlvbiBtaW51dGVzVG9TZWNvbmRzKG1pbnV0ZXMpIHsKICByZXR1cm4gTWF0aC50cnVuYyhtaW51dGVzICogc2Vjb25kc0luTWludXRlKTsKfQp2YXIgbWludXRlc1RvU2Vjb25kc19kZWZhdWx0Owp2YXIgaW5pdF9taW51dGVzVG9TZWNvbmRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21pbnV0ZXNUb1NlY29uZHMuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIG1pbnV0ZXNUb1NlY29uZHNfZGVmYXVsdCA9IG1pbnV0ZXNUb1NlY29uZHM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbW9udGhzVG9RdWFydGVycy5qcwpmdW5jdGlvbiBtb250aHNUb1F1YXJ0ZXJzKG1vbnRoczIpIHsKICBjb25zdCBxdWFydGVycyA9IG1vbnRoczIgLyBtb250aHNJblF1YXJ0ZXI7CiAgcmV0dXJuIE1hdGgudHJ1bmMocXVhcnRlcnMpOwp9CnZhciBtb250aHNUb1F1YXJ0ZXJzX2RlZmF1bHQ7CnZhciBpbml0X21vbnRoc1RvUXVhcnRlcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbW9udGhzVG9RdWFydGVycy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgbW9udGhzVG9RdWFydGVyc19kZWZhdWx0ID0gbW9udGhzVG9RdWFydGVyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9tb250aHNUb1llYXJzLmpzCmZ1bmN0aW9uIG1vbnRoc1RvWWVhcnMobW9udGhzMikgewogIGNvbnN0IHllYXJzID0gbW9udGhzMiAvIG1vbnRoc0luWWVhcjsKICByZXR1cm4gTWF0aC50cnVuYyh5ZWFycyk7Cn0KdmFyIG1vbnRoc1RvWWVhcnNfZGVmYXVsdDsKdmFyIGluaXRfbW9udGhzVG9ZZWFycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9tb250aHNUb1llYXJzLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzKCk7CiAgICBtb250aHNUb1llYXJzX2RlZmF1bHQgPSBtb250aHNUb1llYXJzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHREYXkuanMKZnVuY3Rpb24gbmV4dERheShkYXRlLCBkYXksIG9wdGlvbnMpIHsKICBsZXQgZGVsdGEgPSBkYXkgLSBnZXREYXkoZGF0ZSwgb3B0aW9ucyk7CiAgaWYgKGRlbHRhIDw9IDApIGRlbHRhICs9IDc7CiAgcmV0dXJuIGFkZERheXMoZGF0ZSwgZGVsdGEsIG9wdGlvbnMpOwp9CnZhciBuZXh0RGF5X2RlZmF1bHQ7CnZhciBpbml0X25leHREYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dERheS5qcyIoKSB7CiAgICBpbml0X2FkZERheXMoKTsKICAgIGluaXRfZ2V0RGF5KCk7CiAgICBuZXh0RGF5X2RlZmF1bHQgPSBuZXh0RGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHRGcmlkYXkuanMKZnVuY3Rpb24gbmV4dEZyaWRheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIG5leHREYXkoZGF0ZSwgNSwgb3B0aW9ucyk7Cn0KdmFyIG5leHRGcmlkYXlfZGVmYXVsdDsKdmFyIGluaXRfbmV4dEZyaWRheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9uZXh0RnJpZGF5LmpzIigpIHsKICAgIGluaXRfbmV4dERheSgpOwogICAgbmV4dEZyaWRheV9kZWZhdWx0ID0gbmV4dEZyaWRheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9uZXh0TW9uZGF5LmpzCmZ1bmN0aW9uIG5leHRNb25kYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBuZXh0RGF5KGRhdGUsIDEsIG9wdGlvbnMpOwp9CnZhciBuZXh0TW9uZGF5X2RlZmF1bHQ7CnZhciBpbml0X25leHRNb25kYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dE1vbmRheS5qcyIoKSB7CiAgICBpbml0X25leHREYXkoKTsKICAgIG5leHRNb25kYXlfZGVmYXVsdCA9IG5leHRNb25kYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dFNhdHVyZGF5LmpzCmZ1bmN0aW9uIG5leHRTYXR1cmRheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIG5leHREYXkoZGF0ZSwgNiwgb3B0aW9ucyk7Cn0KdmFyIG5leHRTYXR1cmRheV9kZWZhdWx0Owp2YXIgaW5pdF9uZXh0U2F0dXJkYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dFNhdHVyZGF5LmpzIigpIHsKICAgIGluaXRfbmV4dERheSgpOwogICAgbmV4dFNhdHVyZGF5X2RlZmF1bHQgPSBuZXh0U2F0dXJkYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dFN1bmRheS5qcwpmdW5jdGlvbiBuZXh0U3VuZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gbmV4dERheShkYXRlLCAwLCBvcHRpb25zKTsKfQp2YXIgbmV4dFN1bmRheV9kZWZhdWx0Owp2YXIgaW5pdF9uZXh0U3VuZGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHRTdW5kYXkuanMiKCkgewogICAgaW5pdF9uZXh0RGF5KCk7CiAgICBuZXh0U3VuZGF5X2RlZmF1bHQgPSBuZXh0U3VuZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHRUaHVyc2RheS5qcwpmdW5jdGlvbiBuZXh0VGh1cnNkYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBuZXh0RGF5KGRhdGUsIDQsIG9wdGlvbnMpOwp9CnZhciBuZXh0VGh1cnNkYXlfZGVmYXVsdDsKdmFyIGluaXRfbmV4dFRodXJzZGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHRUaHVyc2RheS5qcyIoKSB7CiAgICBpbml0X25leHREYXkoKTsKICAgIG5leHRUaHVyc2RheV9kZWZhdWx0ID0gbmV4dFRodXJzZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHRUdWVzZGF5LmpzCmZ1bmN0aW9uIG5leHRUdWVzZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gbmV4dERheShkYXRlLCAyLCBvcHRpb25zKTsKfQp2YXIgbmV4dFR1ZXNkYXlfZGVmYXVsdDsKdmFyIGluaXRfbmV4dFR1ZXNkYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dFR1ZXNkYXkuanMiKCkgewogICAgaW5pdF9uZXh0RGF5KCk7CiAgICBuZXh0VHVlc2RheV9kZWZhdWx0ID0gbmV4dFR1ZXNkYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbmV4dFdlZG5lc2RheS5qcwpmdW5jdGlvbiBuZXh0V2VkbmVzZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gbmV4dERheShkYXRlLCAzLCBvcHRpb25zKTsKfQp2YXIgbmV4dFdlZG5lc2RheV9kZWZhdWx0Owp2YXIgaW5pdF9uZXh0V2VkbmVzZGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL25leHRXZWRuZXNkYXkuanMiKCkgewogICAgaW5pdF9uZXh0RGF5KCk7CiAgICBuZXh0V2VkbmVzZGF5X2RlZmF1bHQgPSBuZXh0V2VkbmVzZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlSVNPLmpzCmZ1bmN0aW9uIHBhcnNlSVNPKGFyZ3VtZW50LCBvcHRpb25zKSB7CiAgY29uc3QgaW52YWxpZERhdGUgPSAoKSA9PiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluLCBOYU4pOwogIGNvbnN0IGFkZGl0aW9uYWxEaWdpdHMgPSBvcHRpb25zPy5hZGRpdGlvbmFsRGlnaXRzID8/IDI7CiAgY29uc3QgZGF0ZVN0cmluZ3MgPSBzcGxpdERhdGVTdHJpbmcoYXJndW1lbnQpOwogIGxldCBkYXRlOwogIGlmIChkYXRlU3RyaW5ncy5kYXRlKSB7CiAgICBjb25zdCBwYXJzZVllYXJSZXN1bHQgPSBwYXJzZVllYXIoZGF0ZVN0cmluZ3MuZGF0ZSwgYWRkaXRpb25hbERpZ2l0cyk7CiAgICBkYXRlID0gcGFyc2VEYXRlKHBhcnNlWWVhclJlc3VsdC5yZXN0RGF0ZVN0cmluZywgcGFyc2VZZWFyUmVzdWx0LnllYXIpOwogIH0KICBpZiAoIWRhdGUgfHwgaXNOYU4oK2RhdGUpKSByZXR1cm4gaW52YWxpZERhdGUoKTsKICBjb25zdCB0aW1lc3RhbXAyID0gK2RhdGU7CiAgbGV0IHRpbWUgPSAwOwogIGxldCBvZmZzZXQ7CiAgaWYgKGRhdGVTdHJpbmdzLnRpbWUpIHsKICAgIHRpbWUgPSBwYXJzZVRpbWUoZGF0ZVN0cmluZ3MudGltZSk7CiAgICBpZiAoaXNOYU4odGltZSkpIHJldHVybiBpbnZhbGlkRGF0ZSgpOwogIH0KICBpZiAoZGF0ZVN0cmluZ3MudGltZXpvbmUpIHsKICAgIG9mZnNldCA9IHBhcnNlVGltZXpvbmUoZGF0ZVN0cmluZ3MudGltZXpvbmUpOwogICAgaWYgKGlzTmFOKG9mZnNldCkpIHJldHVybiBpbnZhbGlkRGF0ZSgpOwogIH0gZWxzZSB7CiAgICBjb25zdCB0bXBEYXRlID0gbmV3IERhdGUodGltZXN0YW1wMiArIHRpbWUpOwogICAgY29uc3QgcmVzdWx0ID0gdG9EYXRlKDAsIG9wdGlvbnM/LmluKTsKICAgIHJlc3VsdC5zZXRGdWxsWWVhcigKICAgICAgdG1wRGF0ZS5nZXRVVENGdWxsWWVhcigpLAogICAgICB0bXBEYXRlLmdldFVUQ01vbnRoKCksCiAgICAgIHRtcERhdGUuZ2V0VVRDRGF0ZSgpCiAgICApOwogICAgcmVzdWx0LnNldEhvdXJzKAogICAgICB0bXBEYXRlLmdldFVUQ0hvdXJzKCksCiAgICAgIHRtcERhdGUuZ2V0VVRDTWludXRlcygpLAogICAgICB0bXBEYXRlLmdldFVUQ1NlY29uZHMoKSwKICAgICAgdG1wRGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKQogICAgKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIHJldHVybiB0b0RhdGUodGltZXN0YW1wMiArIHRpbWUgKyBvZmZzZXQsIG9wdGlvbnM/LmluKTsKfQpmdW5jdGlvbiBzcGxpdERhdGVTdHJpbmcoZGF0ZVN0cmluZykgewogIGNvbnN0IGRhdGVTdHJpbmdzID0ge307CiAgY29uc3QgYXJyYXkgPSBkYXRlU3RyaW5nLnNwbGl0KHBhdHRlcm5zLmRhdGVUaW1lRGVsaW1pdGVyKTsKICBsZXQgdGltZVN0cmluZzsKICBpZiAoYXJyYXkubGVuZ3RoID4gMikgewogICAgcmV0dXJuIGRhdGVTdHJpbmdzOwogIH0KICBpZiAoLzovLnRlc3QoYXJyYXlbMF0pKSB7CiAgICB0aW1lU3RyaW5nID0gYXJyYXlbMF07CiAgfSBlbHNlIHsKICAgIGRhdGVTdHJpbmdzLmRhdGUgPSBhcnJheVswXTsKICAgIHRpbWVTdHJpbmcgPSBhcnJheVsxXTsKICAgIGlmIChwYXR0ZXJucy50aW1lWm9uZURlbGltaXRlci50ZXN0KGRhdGVTdHJpbmdzLmRhdGUpKSB7CiAgICAgIGRhdGVTdHJpbmdzLmRhdGUgPSBkYXRlU3RyaW5nLnNwbGl0KHBhdHRlcm5zLnRpbWVab25lRGVsaW1pdGVyKVswXTsKICAgICAgdGltZVN0cmluZyA9IGRhdGVTdHJpbmcuc3Vic3RyKAogICAgICAgIGRhdGVTdHJpbmdzLmRhdGUubGVuZ3RoLAogICAgICAgIGRhdGVTdHJpbmcubGVuZ3RoCiAgICAgICk7CiAgICB9CiAgfQogIGlmICh0aW1lU3RyaW5nKSB7CiAgICBjb25zdCB0b2tlbiA9IHBhdHRlcm5zLnRpbWV6b25lLmV4ZWModGltZVN0cmluZyk7CiAgICBpZiAodG9rZW4pIHsKICAgICAgZGF0ZVN0cmluZ3MudGltZSA9IHRpbWVTdHJpbmcucmVwbGFjZSh0b2tlblsxXSwgIiIpOwogICAgICBkYXRlU3RyaW5ncy50aW1lem9uZSA9IHRva2VuWzFdOwogICAgfSBlbHNlIHsKICAgICAgZGF0ZVN0cmluZ3MudGltZSA9IHRpbWVTdHJpbmc7CiAgICB9CiAgfQogIHJldHVybiBkYXRlU3RyaW5nczsKfQpmdW5jdGlvbiBwYXJzZVllYXIoZGF0ZVN0cmluZywgYWRkaXRpb25hbERpZ2l0cykgewogIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCgKICAgICJeKD86KFxcZHs0fXxbKy1dXFxkeyIgKyAoNCArIGFkZGl0aW9uYWxEaWdpdHMpICsgIn0pfChcXGR7Mn18WystXVxcZHsiICsgKDIgKyBhZGRpdGlvbmFsRGlnaXRzKSArICJ9KSQpIgogICk7CiAgY29uc3QgY2FwdHVyZXMgPSBkYXRlU3RyaW5nLm1hdGNoKHJlZ2V4KTsKICBpZiAoIWNhcHR1cmVzKSByZXR1cm4geyB5ZWFyOiBOYU4sIHJlc3REYXRlU3RyaW5nOiAiIiB9OwogIGNvbnN0IHllYXIgPSBjYXB0dXJlc1sxXSA/IHBhcnNlSW50KGNhcHR1cmVzWzFdKSA6IG51bGw7CiAgY29uc3QgY2VudHVyeSA9IGNhcHR1cmVzWzJdID8gcGFyc2VJbnQoY2FwdHVyZXNbMl0pIDogbnVsbDsKICByZXR1cm4gewogICAgeWVhcjogY2VudHVyeSA9PT0gbnVsbCA/IHllYXIgOiBjZW50dXJ5ICogMTAwLAogICAgcmVzdERhdGVTdHJpbmc6IGRhdGVTdHJpbmcuc2xpY2UoKGNhcHR1cmVzWzFdIHx8IGNhcHR1cmVzWzJdKS5sZW5ndGgpCiAgfTsKfQpmdW5jdGlvbiBwYXJzZURhdGUoZGF0ZVN0cmluZywgeWVhcikgewogIGlmICh5ZWFyID09PSBudWxsKSByZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKE5hTik7CiAgY29uc3QgY2FwdHVyZXMgPSBkYXRlU3RyaW5nLm1hdGNoKGRhdGVSZWdleCk7CiAgaWYgKCFjYXB0dXJlcykgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZShOYU4pOwogIGNvbnN0IGlzV2Vla0RhdGUgPSAhIWNhcHR1cmVzWzRdOwogIGNvbnN0IGRheU9mWWVhciA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbMV0pOwogIGNvbnN0IG1vbnRoID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1syXSkgLSAxOwogIGNvbnN0IGRheSA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbM10pOwogIGNvbnN0IHdlZWsgPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzRdKTsKICBjb25zdCBkYXlPZldlZWsgPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzVdKSAtIDE7CiAgaWYgKGlzV2Vla0RhdGUpIHsKICAgIGlmICghdmFsaWRhdGVXZWVrRGF0ZSh5ZWFyLCB3ZWVrLCBkYXlPZldlZWspKSB7CiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoTmFOKTsKICAgIH0KICAgIHJldHVybiBkYXlPZklTT1dlZWtZZWFyKHllYXIsIHdlZWssIGRheU9mV2Vlayk7CiAgfSBlbHNlIHsKICAgIGNvbnN0IGRhdGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoMCk7CiAgICBpZiAoIXZhbGlkYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF5KSB8fCAhdmFsaWRhdGVEYXlPZlllYXJEYXRlKHllYXIsIGRheU9mWWVhcikpIHsKICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZShOYU4pOwogICAgfQogICAgZGF0ZS5zZXRVVENGdWxsWWVhcih5ZWFyLCBtb250aCwgTWF0aC5tYXgoZGF5T2ZZZWFyLCBkYXkpKTsKICAgIHJldHVybiBkYXRlOwogIH0KfQpmdW5jdGlvbiBwYXJzZURhdGVVbml0KHZhbHVlMikgewogIHJldHVybiB2YWx1ZTIgPyBwYXJzZUludCh2YWx1ZTIpIDogMTsKfQpmdW5jdGlvbiBwYXJzZVRpbWUodGltZVN0cmluZykgewogIGNvbnN0IGNhcHR1cmVzID0gdGltZVN0cmluZy5tYXRjaCh0aW1lUmVnZXgpOwogIGlmICghY2FwdHVyZXMpIHJldHVybiBOYU47CiAgY29uc3QgaG91cnMgPSBwYXJzZVRpbWVVbml0KGNhcHR1cmVzWzFdKTsKICBjb25zdCBtaW51dGVzID0gcGFyc2VUaW1lVW5pdChjYXB0dXJlc1syXSk7CiAgY29uc3Qgc2Vjb25kcyA9IHBhcnNlVGltZVVuaXQoY2FwdHVyZXNbM10pOwogIGlmICghdmFsaWRhdGVUaW1lKGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKSkgewogICAgcmV0dXJuIE5hTjsKICB9CiAgcmV0dXJuIGhvdXJzICogbWlsbGlzZWNvbmRzSW5Ib3VyICsgbWludXRlcyAqIG1pbGxpc2Vjb25kc0luTWludXRlICsgc2Vjb25kcyAqIDFlMzsKfQpmdW5jdGlvbiBwYXJzZVRpbWVVbml0KHZhbHVlMikgewogIHJldHVybiB2YWx1ZTIgJiYgcGFyc2VGbG9hdCh2YWx1ZTIucmVwbGFjZSgiLCIsICIuIikpIHx8IDA7Cn0KZnVuY3Rpb24gcGFyc2VUaW1lem9uZSh0aW1lem9uZVN0cmluZykgewogIGlmICh0aW1lem9uZVN0cmluZyA9PT0gIloiKSByZXR1cm4gMDsKICBjb25zdCBjYXB0dXJlcyA9IHRpbWV6b25lU3RyaW5nLm1hdGNoKHRpbWV6b25lUmVnZXgpOwogIGlmICghY2FwdHVyZXMpIHJldHVybiAwOwogIGNvbnN0IHNpZ24gPSBjYXB0dXJlc1sxXSA9PT0gIisiID8gLTEgOiAxOwogIGNvbnN0IGhvdXJzID0gcGFyc2VJbnQoY2FwdHVyZXNbMl0pOwogIGNvbnN0IG1pbnV0ZXMgPSBjYXB0dXJlc1szXSAmJiBwYXJzZUludChjYXB0dXJlc1szXSkgfHwgMDsKICBpZiAoIXZhbGlkYXRlVGltZXpvbmUoaG91cnMsIG1pbnV0ZXMpKSB7CiAgICByZXR1cm4gTmFOOwogIH0KICByZXR1cm4gc2lnbiAqIChob3VycyAqIG1pbGxpc2Vjb25kc0luSG91ciArIG1pbnV0ZXMgKiBtaWxsaXNlY29uZHNJbk1pbnV0ZSk7Cn0KZnVuY3Rpb24gZGF5T2ZJU09XZWVrWWVhcihpc29XZWVrWWVhciwgd2VlaywgZGF5KSB7CiAgY29uc3QgZGF0ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgwKTsKICBkYXRlLnNldFVUQ0Z1bGxZZWFyKGlzb1dlZWtZZWFyLCAwLCA0KTsKICBjb25zdCBmb3VydGhPZkphbnVhcnlEYXkgPSBkYXRlLmdldFVUQ0RheSgpIHx8IDc7CiAgY29uc3QgZGlmZiA9ICh3ZWVrIC0gMSkgKiA3ICsgZGF5ICsgMSAtIGZvdXJ0aE9mSmFudWFyeURheTsKICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBkaWZmKTsKICByZXR1cm4gZGF0ZTsKfQpmdW5jdGlvbiBpc0xlYXBZZWFySW5kZXgyKHllYXIpIHsKICByZXR1cm4geWVhciAlIDQwMCA9PT0gMCB8fCB5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwOwp9CmZ1bmN0aW9uIHZhbGlkYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSkgewogIHJldHVybiBtb250aCA+PSAwICYmIG1vbnRoIDw9IDExICYmIGRhdGUgPj0gMSAmJiBkYXRlIDw9IChkYXlzSW5Nb250aHNbbW9udGhdIHx8IChpc0xlYXBZZWFySW5kZXgyKHllYXIpID8gMjkgOiAyOCkpOwp9CmZ1bmN0aW9uIHZhbGlkYXRlRGF5T2ZZZWFyRGF0ZSh5ZWFyLCBkYXlPZlllYXIpIHsKICByZXR1cm4gZGF5T2ZZZWFyID49IDEgJiYgZGF5T2ZZZWFyIDw9IChpc0xlYXBZZWFySW5kZXgyKHllYXIpID8gMzY2IDogMzY1KTsKfQpmdW5jdGlvbiB2YWxpZGF0ZVdlZWtEYXRlKF95ZWFyLCB3ZWVrLCBkYXkpIHsKICByZXR1cm4gd2VlayA+PSAxICYmIHdlZWsgPD0gNTMgJiYgZGF5ID49IDAgJiYgZGF5IDw9IDY7Cn0KZnVuY3Rpb24gdmFsaWRhdGVUaW1lKGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKSB7CiAgaWYgKGhvdXJzID09PSAyNCkgewogICAgcmV0dXJuIG1pbnV0ZXMgPT09IDAgJiYgc2Vjb25kcyA9PT0gMDsKICB9CiAgcmV0dXJuIHNlY29uZHMgPj0gMCAmJiBzZWNvbmRzIDwgNjAgJiYgbWludXRlcyA+PSAwICYmIG1pbnV0ZXMgPCA2MCAmJiBob3VycyA+PSAwICYmIGhvdXJzIDwgMjU7Cn0KZnVuY3Rpb24gdmFsaWRhdGVUaW1lem9uZShfaG91cnMsIG1pbnV0ZXMpIHsKICByZXR1cm4gbWludXRlcyA+PSAwICYmIG1pbnV0ZXMgPD0gNTk7Cn0KdmFyIHBhdHRlcm5zLCBkYXRlUmVnZXgsIHRpbWVSZWdleCwgdGltZXpvbmVSZWdleCwgZGF5c0luTW9udGhzLCBwYXJzZUlTT19kZWZhdWx0Owp2YXIgaW5pdF9wYXJzZUlTTyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZUlTTy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgcGF0dGVybnMgPSB7CiAgICAgIGRhdGVUaW1lRGVsaW1pdGVyOiAvW1QgXS8sCiAgICAgIHRpbWVab25lRGVsaW1pdGVyOiAvW1ogXS9pLAogICAgICB0aW1lem9uZTogLyhbWistXS4qKSQvCiAgICB9OwogICAgZGF0ZVJlZ2V4ID0gL14tPyg/OihcZHszfSl8KFxkezJ9KSg/Oi0/KFxkezJ9KSk/fFcoXGR7Mn0pKD86LT8oXGR7MX0pKT98KSQvOwogICAgdGltZVJlZ2V4ID0gL14oXGR7Mn0oPzpbLixdXGQqKT8pKD86Oj8oXGR7Mn0oPzpbLixdXGQqKT8pKT8oPzo6PyhcZHsyfSg/OlsuLF1cZCopPykpPyQvOwogICAgdGltZXpvbmVSZWdleCA9IC9eKFsrLV0pKFxkezJ9KSg/Ojo/KFxkezJ9KSk/JC87CiAgICBkYXlzSW5Nb250aHMgPSBbMzEsIG51bGwsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTsKICAgIHBhcnNlSVNPX2RlZmF1bHQgPSBwYXJzZUlTTzsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZUpTT04uanMKZnVuY3Rpb24gcGFyc2VKU09OKGRhdGVTdHIsIG9wdGlvbnMpIHsKICBjb25zdCBwYXJ0cyA9IGRhdGVTdHIubWF0Y2goCiAgICAvKFxkezR9KS0oXGR7Mn0pLShcZHsyfSlbVCBdKFxkezJ9KTooXGR7Mn0pOihcZHsyfSkoPzpcLihcZHswLDd9KSk/KD86WnwoLikoXGR7Mn0pOj8oXGR7Mn0pPyk/LwogICk7CiAgaWYgKCFwYXJ0cykgcmV0dXJuIHRvRGF0ZShOYU4sIG9wdGlvbnM/LmluKTsKICByZXR1cm4gdG9EYXRlKAogICAgRGF0ZS5VVEMoCiAgICAgICtwYXJ0c1sxXSwKICAgICAgK3BhcnRzWzJdIC0gMSwKICAgICAgK3BhcnRzWzNdLAogICAgICArcGFydHNbNF0gLSAoK3BhcnRzWzldIHx8IDApICogKHBhcnRzWzhdID09ICItIiA/IC0xIDogMSksCiAgICAgICtwYXJ0c1s1XSAtICgrcGFydHNbMTBdIHx8IDApICogKHBhcnRzWzhdID09ICItIiA/IC0xIDogMSksCiAgICAgICtwYXJ0c1s2XSwKICAgICAgKygocGFydHNbN10gfHwgIjAiKSArICIwMCIpLnN1YnN0cmluZygwLCAzKQogICAgKSwKICAgIG9wdGlvbnM/LmluCiAgKTsKfQp2YXIgcGFyc2VKU09OX2RlZmF1bHQ7CnZhciBpbml0X3BhcnNlSlNPTiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZUpTT04uanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIHBhcnNlSlNPTl9kZWZhdWx0ID0gcGFyc2VKU09OOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzRGF5LmpzCmZ1bmN0aW9uIHByZXZpb3VzRGF5KGRhdGUsIGRheSwgb3B0aW9ucykgewogIGxldCBkZWx0YSA9IGdldERheShkYXRlLCBvcHRpb25zKSAtIGRheTsKICBpZiAoZGVsdGEgPD0gMCkgZGVsdGEgKz0gNzsKICByZXR1cm4gc3ViRGF5cyhkYXRlLCBkZWx0YSwgb3B0aW9ucyk7Cn0KdmFyIHByZXZpb3VzRGF5X2RlZmF1bHQ7CnZhciBpbml0X3ByZXZpb3VzRGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzRGF5LmpzIigpIHsKICAgIGluaXRfZ2V0RGF5KCk7CiAgICBpbml0X3N1YkRheXMoKTsKICAgIHByZXZpb3VzRGF5X2RlZmF1bHQgPSBwcmV2aW91c0RheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wcmV2aW91c0ZyaWRheS5qcwpmdW5jdGlvbiBwcmV2aW91c0ZyaWRheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHByZXZpb3VzRGF5KGRhdGUsIDUsIG9wdGlvbnMpOwp9CnZhciBwcmV2aW91c0ZyaWRheV9kZWZhdWx0Owp2YXIgaW5pdF9wcmV2aW91c0ZyaWRheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wcmV2aW91c0ZyaWRheS5qcyIoKSB7CiAgICBpbml0X3ByZXZpb3VzRGF5KCk7CiAgICBwcmV2aW91c0ZyaWRheV9kZWZhdWx0ID0gcHJldmlvdXNGcmlkYXk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcHJldmlvdXNNb25kYXkuanMKZnVuY3Rpb24gcHJldmlvdXNNb25kYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBwcmV2aW91c0RheShkYXRlLCAxLCBvcHRpb25zKTsKfQp2YXIgcHJldmlvdXNNb25kYXlfZGVmYXVsdDsKdmFyIGluaXRfcHJldmlvdXNNb25kYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcHJldmlvdXNNb25kYXkuanMiKCkgewogICAgaW5pdF9wcmV2aW91c0RheSgpOwogICAgcHJldmlvdXNNb25kYXlfZGVmYXVsdCA9IHByZXZpb3VzTW9uZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzU2F0dXJkYXkuanMKZnVuY3Rpb24gcHJldmlvdXNTYXR1cmRheShkYXRlLCBvcHRpb25zKSB7CiAgcmV0dXJuIHByZXZpb3VzRGF5KGRhdGUsIDYsIG9wdGlvbnMpOwp9CnZhciBwcmV2aW91c1NhdHVyZGF5X2RlZmF1bHQ7CnZhciBpbml0X3ByZXZpb3VzU2F0dXJkYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcHJldmlvdXNTYXR1cmRheS5qcyIoKSB7CiAgICBpbml0X3ByZXZpb3VzRGF5KCk7CiAgICBwcmV2aW91c1NhdHVyZGF5X2RlZmF1bHQgPSBwcmV2aW91c1NhdHVyZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzU3VuZGF5LmpzCmZ1bmN0aW9uIHByZXZpb3VzU3VuZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gcHJldmlvdXNEYXkoZGF0ZSwgMCwgb3B0aW9ucyk7Cn0KdmFyIHByZXZpb3VzU3VuZGF5X2RlZmF1bHQ7CnZhciBpbml0X3ByZXZpb3VzU3VuZGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzU3VuZGF5LmpzIigpIHsKICAgIGluaXRfcHJldmlvdXNEYXkoKTsKICAgIHByZXZpb3VzU3VuZGF5X2RlZmF1bHQgPSBwcmV2aW91c1N1bmRheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wcmV2aW91c1RodXJzZGF5LmpzCmZ1bmN0aW9uIHByZXZpb3VzVGh1cnNkYXkoZGF0ZSwgb3B0aW9ucykgewogIHJldHVybiBwcmV2aW91c0RheShkYXRlLCA0LCBvcHRpb25zKTsKfQp2YXIgcHJldmlvdXNUaHVyc2RheV9kZWZhdWx0Owp2YXIgaW5pdF9wcmV2aW91c1RodXJzZGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzVGh1cnNkYXkuanMiKCkgewogICAgaW5pdF9wcmV2aW91c0RheSgpOwogICAgcHJldmlvdXNUaHVyc2RheV9kZWZhdWx0ID0gcHJldmlvdXNUaHVyc2RheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wcmV2aW91c1R1ZXNkYXkuanMKZnVuY3Rpb24gcHJldmlvdXNUdWVzZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gcHJldmlvdXNEYXkoZGF0ZSwgMiwgb3B0aW9ucyk7Cn0KdmFyIHByZXZpb3VzVHVlc2RheV9kZWZhdWx0Owp2YXIgaW5pdF9wcmV2aW91c1R1ZXNkYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcHJldmlvdXNUdWVzZGF5LmpzIigpIHsKICAgIGluaXRfcHJldmlvdXNEYXkoKTsKICAgIHByZXZpb3VzVHVlc2RheV9kZWZhdWx0ID0gcHJldmlvdXNUdWVzZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzV2VkbmVzZGF5LmpzCmZ1bmN0aW9uIHByZXZpb3VzV2VkbmVzZGF5KGRhdGUsIG9wdGlvbnMpIHsKICByZXR1cm4gcHJldmlvdXNEYXkoZGF0ZSwgMywgb3B0aW9ucyk7Cn0KdmFyIHByZXZpb3VzV2VkbmVzZGF5X2RlZmF1bHQ7CnZhciBpbml0X3ByZXZpb3VzV2VkbmVzZGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3ByZXZpb3VzV2VkbmVzZGF5LmpzIigpIHsKICAgIGluaXRfcHJldmlvdXNEYXkoKTsKICAgIHByZXZpb3VzV2VkbmVzZGF5X2RlZmF1bHQgPSBwcmV2aW91c1dlZG5lc2RheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9xdWFydGVyc1RvTW9udGhzLmpzCmZ1bmN0aW9uIHF1YXJ0ZXJzVG9Nb250aHMocXVhcnRlcnMpIHsKICByZXR1cm4gTWF0aC50cnVuYyhxdWFydGVycyAqIG1vbnRoc0luUXVhcnRlcik7Cn0KdmFyIHF1YXJ0ZXJzVG9Nb250aHNfZGVmYXVsdDsKdmFyIGluaXRfcXVhcnRlcnNUb01vbnRocyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9xdWFydGVyc1RvTW9udGhzLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzKCk7CiAgICBxdWFydGVyc1RvTW9udGhzX2RlZmF1bHQgPSBxdWFydGVyc1RvTW9udGhzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3F1YXJ0ZXJzVG9ZZWFycy5qcwpmdW5jdGlvbiBxdWFydGVyc1RvWWVhcnMocXVhcnRlcnMpIHsKICBjb25zdCB5ZWFycyA9IHF1YXJ0ZXJzIC8gcXVhcnRlcnNJblllYXI7CiAgcmV0dXJuIE1hdGgudHJ1bmMoeWVhcnMpOwp9CnZhciBxdWFydGVyc1RvWWVhcnNfZGVmYXVsdDsKdmFyIGluaXRfcXVhcnRlcnNUb1llYXJzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3F1YXJ0ZXJzVG9ZZWFycy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgcXVhcnRlcnNUb1llYXJzX2RlZmF1bHQgPSBxdWFydGVyc1RvWWVhcnM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcm91bmRUb05lYXJlc3RIb3Vycy5qcwpmdW5jdGlvbiByb3VuZFRvTmVhcmVzdEhvdXJzKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBuZWFyZXN0VG8gPSBvcHRpb25zPy5uZWFyZXN0VG8gPz8gMTsKICBpZiAobmVhcmVzdFRvIDwgMSB8fCBuZWFyZXN0VG8gPiAxMikKICAgIHJldHVybiBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIE5hTik7CiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IGZyYWN0aW9uYWxNaW51dGVzID0gZGF0ZV8uZ2V0TWludXRlcygpIC8gNjA7CiAgY29uc3QgZnJhY3Rpb25hbFNlY29uZHMgPSBkYXRlXy5nZXRTZWNvbmRzKCkgLyA2MCAvIDYwOwogIGNvbnN0IGZyYWN0aW9uYWxNaWxsaXNlY29uZHMgPSBkYXRlXy5nZXRNaWxsaXNlY29uZHMoKSAvIDFlMyAvIDYwIC8gNjA7CiAgY29uc3QgaG91cnMgPSBkYXRlXy5nZXRIb3VycygpICsgZnJhY3Rpb25hbE1pbnV0ZXMgKyBmcmFjdGlvbmFsU2Vjb25kcyArIGZyYWN0aW9uYWxNaWxsaXNlY29uZHM7CiAgY29uc3QgbWV0aG9kID0gb3B0aW9ucz8ucm91bmRpbmdNZXRob2QgPz8gInJvdW5kIjsKICBjb25zdCByb3VuZGluZ01ldGhvZCA9IGdldFJvdW5kaW5nTWV0aG9kKG1ldGhvZCk7CiAgY29uc3Qgcm91bmRlZEhvdXJzID0gcm91bmRpbmdNZXRob2QoaG91cnMgLyBuZWFyZXN0VG8pICogbmVhcmVzdFRvOwogIGRhdGVfLnNldEhvdXJzKHJvdW5kZWRIb3VycywgMCwgMCwgMCk7CiAgcmV0dXJuIGRhdGVfOwp9CnZhciByb3VuZFRvTmVhcmVzdEhvdXJzX2RlZmF1bHQ7CnZhciBpbml0X3JvdW5kVG9OZWFyZXN0SG91cnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcm91bmRUb05lYXJlc3RIb3Vycy5qcyIoKSB7CiAgICBpbml0X2dldFJvdW5kaW5nTWV0aG9kKCk7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICByb3VuZFRvTmVhcmVzdEhvdXJzX2RlZmF1bHQgPSByb3VuZFRvTmVhcmVzdEhvdXJzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3JvdW5kVG9OZWFyZXN0TWludXRlcy5qcwpmdW5jdGlvbiByb3VuZFRvTmVhcmVzdE1pbnV0ZXMoZGF0ZSwgb3B0aW9ucykgewogIGNvbnN0IG5lYXJlc3RUbyA9IG9wdGlvbnM/Lm5lYXJlc3RUbyA/PyAxOwogIGlmIChuZWFyZXN0VG8gPCAxIHx8IG5lYXJlc3RUbyA+IDMwKSByZXR1cm4gY29uc3RydWN0RnJvbShkYXRlLCBOYU4pOwogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBjb25zdCBmcmFjdGlvbmFsU2Vjb25kcyA9IGRhdGVfLmdldFNlY29uZHMoKSAvIDYwOwogIGNvbnN0IGZyYWN0aW9uYWxNaWxsaXNlY29uZHMgPSBkYXRlXy5nZXRNaWxsaXNlY29uZHMoKSAvIDFlMyAvIDYwOwogIGNvbnN0IG1pbnV0ZXMgPSBkYXRlXy5nZXRNaW51dGVzKCkgKyBmcmFjdGlvbmFsU2Vjb25kcyArIGZyYWN0aW9uYWxNaWxsaXNlY29uZHM7CiAgY29uc3QgbWV0aG9kID0gb3B0aW9ucz8ucm91bmRpbmdNZXRob2QgPz8gInJvdW5kIjsKICBjb25zdCByb3VuZGluZ01ldGhvZCA9IGdldFJvdW5kaW5nTWV0aG9kKG1ldGhvZCk7CiAgY29uc3Qgcm91bmRlZE1pbnV0ZXMgPSByb3VuZGluZ01ldGhvZChtaW51dGVzIC8gbmVhcmVzdFRvKSAqIG5lYXJlc3RUbzsKICBkYXRlXy5zZXRNaW51dGVzKHJvdW5kZWRNaW51dGVzLCAwLCAwKTsKICByZXR1cm4gZGF0ZV87Cn0KdmFyIHJvdW5kVG9OZWFyZXN0TWludXRlc19kZWZhdWx0Owp2YXIgaW5pdF9yb3VuZFRvTmVhcmVzdE1pbnV0ZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcm91bmRUb05lYXJlc3RNaW51dGVzLmpzIigpIHsKICAgIGluaXRfZ2V0Um91bmRpbmdNZXRob2QoKTsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIHJvdW5kVG9OZWFyZXN0TWludXRlc19kZWZhdWx0ID0gcm91bmRUb05lYXJlc3RNaW51dGVzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NlY29uZHNUb0hvdXJzLmpzCmZ1bmN0aW9uIHNlY29uZHNUb0hvdXJzKHNlY29uZHMpIHsKICBjb25zdCBob3VycyA9IHNlY29uZHMgLyBzZWNvbmRzSW5Ib3VyOwogIHJldHVybiBNYXRoLnRydW5jKGhvdXJzKTsKfQp2YXIgc2Vjb25kc1RvSG91cnNfZGVmYXVsdDsKdmFyIGluaXRfc2Vjb25kc1RvSG91cnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2Vjb25kc1RvSG91cnMuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIHNlY29uZHNUb0hvdXJzX2RlZmF1bHQgPSBzZWNvbmRzVG9Ib3VyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZWNvbmRzVG9NaWxsaXNlY29uZHMuanMKZnVuY3Rpb24gc2Vjb25kc1RvTWlsbGlzZWNvbmRzKHNlY29uZHMpIHsKICByZXR1cm4gc2Vjb25kcyAqIG1pbGxpc2Vjb25kc0luU2Vjb25kOwp9CnZhciBzZWNvbmRzVG9NaWxsaXNlY29uZHNfZGVmYXVsdDsKdmFyIGluaXRfc2Vjb25kc1RvTWlsbGlzZWNvbmRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NlY29uZHNUb01pbGxpc2Vjb25kcy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgc2Vjb25kc1RvTWlsbGlzZWNvbmRzX2RlZmF1bHQgPSBzZWNvbmRzVG9NaWxsaXNlY29uZHM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2Vjb25kc1RvTWludXRlcy5qcwpmdW5jdGlvbiBzZWNvbmRzVG9NaW51dGVzKHNlY29uZHMpIHsKICBjb25zdCBtaW51dGVzID0gc2Vjb25kcyAvIHNlY29uZHNJbk1pbnV0ZTsKICByZXR1cm4gTWF0aC50cnVuYyhtaW51dGVzKTsKfQp2YXIgc2Vjb25kc1RvTWludXRlc19kZWZhdWx0Owp2YXIgaW5pdF9zZWNvbmRzVG9NaW51dGVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NlY29uZHNUb01pbnV0ZXMuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIHNlY29uZHNUb01pbnV0ZXNfZGVmYXVsdCA9IHNlY29uZHNUb01pbnV0ZXM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0TW9udGguanMKZnVuY3Rpb24gc2V0TW9udGgoZGF0ZSwgbW9udGgsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgZGF5ID0gX2RhdGUuZ2V0RGF0ZSgpOwogIGNvbnN0IG1pZE1vbnRoID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTsKICBtaWRNb250aC5zZXRGdWxsWWVhcih5ZWFyLCBtb250aCwgMTUpOwogIG1pZE1vbnRoLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIGNvbnN0IGRheXNJbk1vbnRoID0gZ2V0RGF5c0luTW9udGgobWlkTW9udGgpOwogIF9kYXRlLnNldE1vbnRoKG1vbnRoLCBNYXRoLm1pbihkYXksIGRheXNJbk1vbnRoKSk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBzZXRNb250aF9kZWZhdWx0Owp2YXIgaW5pdF9zZXRNb250aCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRNb250aC5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfZ2V0RGF5c0luTW9udGgoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzZXRNb250aF9kZWZhdWx0ID0gc2V0TW9udGg7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0LmpzCmZ1bmN0aW9uIHNldChkYXRlLCB2YWx1ZXMsIG9wdGlvbnMpIHsKICBsZXQgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGlmIChpc05hTigrX2RhdGUpKSByZXR1cm4gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCBOYU4pOwogIGlmICh2YWx1ZXMueWVhciAhPSBudWxsKSBfZGF0ZS5zZXRGdWxsWWVhcih2YWx1ZXMueWVhcik7CiAgaWYgKHZhbHVlcy5tb250aCAhPSBudWxsKSBfZGF0ZSA9IHNldE1vbnRoKF9kYXRlLCB2YWx1ZXMubW9udGgpOwogIGlmICh2YWx1ZXMuZGF0ZSAhPSBudWxsKSBfZGF0ZS5zZXREYXRlKHZhbHVlcy5kYXRlKTsKICBpZiAodmFsdWVzLmhvdXJzICE9IG51bGwpIF9kYXRlLnNldEhvdXJzKHZhbHVlcy5ob3Vycyk7CiAgaWYgKHZhbHVlcy5taW51dGVzICE9IG51bGwpIF9kYXRlLnNldE1pbnV0ZXModmFsdWVzLm1pbnV0ZXMpOwogIGlmICh2YWx1ZXMuc2Vjb25kcyAhPSBudWxsKSBfZGF0ZS5zZXRTZWNvbmRzKHZhbHVlcy5zZWNvbmRzKTsKICBpZiAodmFsdWVzLm1pbGxpc2Vjb25kcyAhPSBudWxsKSBfZGF0ZS5zZXRNaWxsaXNlY29uZHModmFsdWVzLm1pbGxpc2Vjb25kcyk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBzZXRfZGVmYXVsdDsKdmFyIGluaXRfc2V0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldC5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfc2V0TW9udGgoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzZXRfZGVmYXVsdCA9IHNldDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXREYXRlLmpzCmZ1bmN0aW9uIHNldERhdGUoZGF0ZSwgZGF5T2ZNb250aCwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXREYXRlKGRheU9mTW9udGgpOwogIHJldHVybiBfZGF0ZTsKfQp2YXIgc2V0RGF0ZV9kZWZhdWx0Owp2YXIgaW5pdF9zZXREYXRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldERhdGUuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIHNldERhdGVfZGVmYXVsdCA9IHNldERhdGU7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0RGF5T2ZZZWFyLmpzCmZ1bmN0aW9uIHNldERheU9mWWVhcihkYXRlLCBkYXlPZlllYXIsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgZGF0ZV8uc2V0TW9udGgoMCk7CiAgZGF0ZV8uc2V0RGF0ZShkYXlPZlllYXIpOwogIHJldHVybiBkYXRlXzsKfQp2YXIgc2V0RGF5T2ZZZWFyX2RlZmF1bHQ7CnZhciBpbml0X3NldERheU9mWWVhciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXREYXlPZlllYXIuanMiKCkgewogICAgaW5pdF90b0RhdGUoKTsKICAgIHNldERheU9mWWVhcl9kZWZhdWx0ID0gc2V0RGF5T2ZZZWFyOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldERlZmF1bHRPcHRpb25zLmpzCmZ1bmN0aW9uIHNldERlZmF1bHRPcHRpb25zMihvcHRpb25zKSB7CiAgY29uc3QgcmVzdWx0ID0ge307CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBmb3IgKGNvbnN0IHByb3BlcnR5OSBpbiBkZWZhdWx0T3B0aW9uczIpIHsKICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVmYXVsdE9wdGlvbnMyLCBwcm9wZXJ0eTkpKSB7CiAgICAgIHJlc3VsdFtwcm9wZXJ0eTldID0gZGVmYXVsdE9wdGlvbnMyW3Byb3BlcnR5OV07CiAgICB9CiAgfQogIGZvciAoY29uc3QgcHJvcGVydHk5IGluIG9wdGlvbnMpIHsKICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgcHJvcGVydHk5KSkgewogICAgICBpZiAob3B0aW9uc1twcm9wZXJ0eTldID09PSB2b2lkIDApIHsKICAgICAgICBkZWxldGUgcmVzdWx0W3Byb3BlcnR5OV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0W3Byb3BlcnR5OV0gPSBvcHRpb25zW3Byb3BlcnR5OV07CiAgICAgIH0KICAgIH0KICB9CiAgc2V0RGVmYXVsdE9wdGlvbnMocmVzdWx0KTsKfQp2YXIgc2V0RGVmYXVsdE9wdGlvbnNfZGVmYXVsdDsKdmFyIGluaXRfc2V0RGVmYXVsdE9wdGlvbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0RGVmYXVsdE9wdGlvbnMuanMiKCkgewogICAgaW5pdF9kZWZhdWx0T3B0aW9ucygpOwogICAgc2V0RGVmYXVsdE9wdGlvbnNfZGVmYXVsdCA9IHNldERlZmF1bHRPcHRpb25zMjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRIb3Vycy5qcwpmdW5jdGlvbiBzZXRIb3VycyhkYXRlLCBob3Vycywgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRIb3Vycyhob3Vycyk7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBzZXRIb3Vyc19kZWZhdWx0Owp2YXIgaW5pdF9zZXRIb3VycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRIb3Vycy5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgc2V0SG91cnNfZGVmYXVsdCA9IHNldEhvdXJzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldE1pbGxpc2Vjb25kcy5qcwpmdW5jdGlvbiBzZXRNaWxsaXNlY29uZHMoZGF0ZSwgbWlsbGlzZWNvbmRzMiwgb3B0aW9ucykgewogIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBfZGF0ZS5zZXRNaWxsaXNlY29uZHMobWlsbGlzZWNvbmRzMik7CiAgcmV0dXJuIF9kYXRlOwp9CnZhciBzZXRNaWxsaXNlY29uZHNfZGVmYXVsdDsKdmFyIGluaXRfc2V0TWlsbGlzZWNvbmRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldE1pbGxpc2Vjb25kcy5qcyIoKSB7CiAgICBpbml0X3RvRGF0ZSgpOwogICAgc2V0TWlsbGlzZWNvbmRzX2RlZmF1bHQgPSBzZXRNaWxsaXNlY29uZHM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0TWludXRlcy5qcwpmdW5jdGlvbiBzZXRNaW51dGVzKGRhdGUsIG1pbnV0ZXMsIG9wdGlvbnMpIHsKICBjb25zdCBkYXRlXyA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgZGF0ZV8uc2V0TWludXRlcyhtaW51dGVzKTsKICByZXR1cm4gZGF0ZV87Cn0KdmFyIHNldE1pbnV0ZXNfZGVmYXVsdDsKdmFyIGluaXRfc2V0TWludXRlcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRNaW51dGVzLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzZXRNaW51dGVzX2RlZmF1bHQgPSBzZXRNaW51dGVzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldFF1YXJ0ZXIuanMKZnVuY3Rpb24gc2V0UXVhcnRlcihkYXRlLCBxdWFydGVyLCBvcHRpb25zKSB7CiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pOwogIGNvbnN0IG9sZFF1YXJ0ZXIgPSBNYXRoLnRydW5jKGRhdGVfLmdldE1vbnRoKCkgLyAzKSArIDE7CiAgY29uc3QgZGlmZiA9IHF1YXJ0ZXIgLSBvbGRRdWFydGVyOwogIHJldHVybiBzZXRNb250aChkYXRlXywgZGF0ZV8uZ2V0TW9udGgoKSArIGRpZmYgKiAzKTsKfQp2YXIgc2V0UXVhcnRlcl9kZWZhdWx0Owp2YXIgaW5pdF9zZXRRdWFydGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldFF1YXJ0ZXIuanMiKCkgewogICAgaW5pdF9zZXRNb250aCgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIHNldFF1YXJ0ZXJfZGVmYXVsdCA9IHNldFF1YXJ0ZXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0U2Vjb25kcy5qcwpmdW5jdGlvbiBzZXRTZWNvbmRzKGRhdGUsIHNlY29uZHMsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgX2RhdGUuc2V0U2Vjb25kcyhzZWNvbmRzKTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIHNldFNlY29uZHNfZGVmYXVsdDsKdmFyIGluaXRfc2V0U2Vjb25kcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRTZWNvbmRzLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzZXRTZWNvbmRzX2RlZmF1bHQgPSBzZXRTZWNvbmRzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldFdlZWtZZWFyLmpzCmZ1bmN0aW9uIHNldFdlZWtZZWFyKGRhdGUsIHdlZWtZZWFyLCBvcHRpb25zKSB7CiAgY29uc3QgZGVmYXVsdE9wdGlvbnMyID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTsKICBjb25zdCBmaXJzdFdlZWtDb250YWluc0RhdGUgPSBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gZGVmYXVsdE9wdGlvbnMyLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/PyBkZWZhdWx0T3B0aW9uczIubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz8gMTsKICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKAogICAgdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKSwKICAgIHN0YXJ0T2ZXZWVrWWVhcihkYXRlLCBvcHRpb25zKSwKICAgIG9wdGlvbnMKICApOwogIGNvbnN0IGZpcnN0V2VlayA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgMCk7CiAgZmlyc3RXZWVrLnNldEZ1bGxZZWFyKHdlZWtZZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpOwogIGZpcnN0V2Vlay5zZXRIb3VycygwLCAwLCAwLCAwKTsKICBjb25zdCBkYXRlXyA9IHN0YXJ0T2ZXZWVrWWVhcihmaXJzdFdlZWssIG9wdGlvbnMpOwogIGRhdGVfLnNldERhdGUoZGF0ZV8uZ2V0RGF0ZSgpICsgZGlmZik7CiAgcmV0dXJuIGRhdGVfOwp9CnZhciBzZXRXZWVrWWVhcl9kZWZhdWx0Owp2YXIgaW5pdF9zZXRXZWVrWWVhciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRXZWVrWWVhci5qcyIoKSB7CiAgICBpbml0X2RlZmF1bHRPcHRpb25zKCk7CiAgICBpbml0X2NvbnN0cnVjdEZyb20oKTsKICAgIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKCk7CiAgICBpbml0X3N0YXJ0T2ZXZWVrWWVhcigpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIHNldFdlZWtZZWFyX2RlZmF1bHQgPSBzZXRXZWVrWWVhcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRZZWFyLmpzCmZ1bmN0aW9uIHNldFllYXIoZGF0ZSwgeWVhciwgb3B0aW9ucykgewogIGNvbnN0IGRhdGVfID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTsKICBpZiAoaXNOYU4oK2RhdGVfKSkgcmV0dXJuIGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgTmFOKTsKICBkYXRlXy5zZXRGdWxsWWVhcih5ZWFyKTsKICByZXR1cm4gZGF0ZV87Cn0KdmFyIHNldFllYXJfZGVmYXVsdDsKdmFyIGluaXRfc2V0WWVhciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRZZWFyLmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF90b0RhdGUoKTsKICAgIHNldFllYXJfZGVmYXVsdCA9IHNldFllYXI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZkRlY2FkZS5qcwpmdW5jdGlvbiBzdGFydE9mRGVjYWRlKGRhdGUsIG9wdGlvbnMpIHsKICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgZGVjYWRlID0gTWF0aC5mbG9vcih5ZWFyIC8gMTApICogMTA7CiAgX2RhdGUuc2V0RnVsbFllYXIoZGVjYWRlLCAwLCAxKTsKICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICByZXR1cm4gX2RhdGU7Cn0KdmFyIHN0YXJ0T2ZEZWNhZGVfZGVmYXVsdDsKdmFyIGluaXRfc3RhcnRPZkRlY2FkZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mRGVjYWRlLmpzIigpIHsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBzdGFydE9mRGVjYWRlX2RlZmF1bHQgPSBzdGFydE9mRGVjYWRlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZUb2RheS5qcwpmdW5jdGlvbiBzdGFydE9mVG9kYXkob3B0aW9ucykgewogIHJldHVybiBzdGFydE9mRGF5KERhdGUubm93KCksIG9wdGlvbnMpOwp9CnZhciBzdGFydE9mVG9kYXlfZGVmYXVsdDsKdmFyIGluaXRfc3RhcnRPZlRvZGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZUb2RheS5qcyIoKSB7CiAgICBpbml0X3N0YXJ0T2ZEYXkoKTsKICAgIHN0YXJ0T2ZUb2RheV9kZWZhdWx0ID0gc3RhcnRPZlRvZGF5OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZUb21vcnJvdy5qcwpmdW5jdGlvbiBzdGFydE9mVG9tb3Jyb3cob3B0aW9ucykgewogIGNvbnN0IG5vdzIgPSBjb25zdHJ1Y3ROb3cob3B0aW9ucz8uaW4pOwogIGNvbnN0IHllYXIgPSBub3cyLmdldEZ1bGxZZWFyKCk7CiAgY29uc3QgbW9udGggPSBub3cyLmdldE1vbnRoKCk7CiAgY29uc3QgZGF5ID0gbm93Mi5nZXREYXRlKCk7CiAgY29uc3QgZGF0ZSA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4sIDApOwogIGRhdGUuc2V0RnVsbFllYXIoeWVhciwgbW9udGgsIGRheSArIDEpOwogIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgcmV0dXJuIGRhdGU7Cn0KdmFyIHN0YXJ0T2ZUb21vcnJvd19kZWZhdWx0Owp2YXIgaW5pdF9zdGFydE9mVG9tb3Jyb3cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZlRvbW9ycm93LmpzIigpIHsKICAgIGluaXRfY29uc3RydWN0RnJvbSgpOwogICAgaW5pdF9jb25zdHJ1Y3ROb3coKTsKICAgIHN0YXJ0T2ZUb21vcnJvd19kZWZhdWx0ID0gc3RhcnRPZlRvbW9ycm93OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZZZXN0ZXJkYXkuanMKZnVuY3Rpb24gc3RhcnRPZlllc3RlcmRheShvcHRpb25zKSB7CiAgY29uc3Qgbm93MiA9IGNvbnN0cnVjdE5vdyhvcHRpb25zPy5pbik7CiAgY29uc3QgeWVhciA9IG5vdzIuZ2V0RnVsbFllYXIoKTsKICBjb25zdCBtb250aCA9IG5vdzIuZ2V0TW9udGgoKTsKICBjb25zdCBkYXkgPSBub3cyLmdldERhdGUoKTsKICBjb25zdCBkYXRlID0gY29uc3RydWN0Tm93KG9wdGlvbnM/LmluKTsKICBkYXRlLnNldEZ1bGxZZWFyKHllYXIsIG1vbnRoLCBkYXkgLSAxKTsKICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogIHJldHVybiBkYXRlOwp9CnZhciBzdGFydE9mWWVzdGVyZGF5X2RlZmF1bHQ7CnZhciBpbml0X3N0YXJ0T2ZZZXN0ZXJkYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZlllc3RlcmRheS5qcyIoKSB7CiAgICBpbml0X2NvbnN0cnVjdE5vdygpOwogICAgc3RhcnRPZlllc3RlcmRheV9kZWZhdWx0ID0gc3RhcnRPZlllc3RlcmRheTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJNb250aHMuanMKZnVuY3Rpb24gc3ViTW9udGhzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRNb250aHMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1Yk1vbnRoc19kZWZhdWx0Owp2YXIgaW5pdF9zdWJNb250aHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViTW9udGhzLmpzIigpIHsKICAgIGluaXRfYWRkTW9udGhzKCk7CiAgICBzdWJNb250aHNfZGVmYXVsdCA9IHN1Yk1vbnRoczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWIuanMKZnVuY3Rpb24gc3ViKGRhdGUsIGR1cmF0aW9uLCBvcHRpb25zKSB7CiAgY29uc3QgewogICAgeWVhcnMgPSAwLAogICAgbW9udGhzOiBtb250aHMyID0gMCwKICAgIHdlZWtzID0gMCwKICAgIGRheXM6IGRheXMyID0gMCwKICAgIGhvdXJzID0gMCwKICAgIG1pbnV0ZXMgPSAwLAogICAgc2Vjb25kcyA9IDAKICB9ID0gZHVyYXRpb247CiAgY29uc3Qgd2l0aG91dE1vbnRocyA9IHN1Yk1vbnRocyhkYXRlLCBtb250aHMyICsgeWVhcnMgKiAxMiwgb3B0aW9ucyk7CiAgY29uc3Qgd2l0aG91dERheXMgPSBzdWJEYXlzKHdpdGhvdXRNb250aHMsIGRheXMyICsgd2Vla3MgKiA3LCBvcHRpb25zKTsKICBjb25zdCBtaW51dGVzVG9TdWIgPSBtaW51dGVzICsgaG91cnMgKiA2MDsKICBjb25zdCBzZWNvbmRzVG9TdWIgPSBzZWNvbmRzICsgbWludXRlc1RvU3ViICogNjA7CiAgY29uc3QgbXNUb1N1YiA9IHNlY29uZHNUb1N1YiAqIDFlMzsKICByZXR1cm4gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCArd2l0aG91dERheXMgLSBtc1RvU3ViKTsKfQp2YXIgc3ViX2RlZmF1bHQ7CnZhciBpbml0X3N1YiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWIuanMiKCkgewogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X3N1YkRheXMoKTsKICAgIGluaXRfc3ViTW9udGhzKCk7CiAgICBzdWJfZGVmYXVsdCA9IHN1YjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJCdXNpbmVzc0RheXMuanMKZnVuY3Rpb24gc3ViQnVzaW5lc3NEYXlzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRCdXNpbmVzc0RheXMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1YkJ1c2luZXNzRGF5c19kZWZhdWx0Owp2YXIgaW5pdF9zdWJCdXNpbmVzc0RheXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViQnVzaW5lc3NEYXlzLmpzIigpIHsKICAgIGluaXRfYWRkQnVzaW5lc3NEYXlzKCk7CiAgICBzdWJCdXNpbmVzc0RheXNfZGVmYXVsdCA9IHN1YkJ1c2luZXNzRGF5czsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJIb3Vycy5qcwpmdW5jdGlvbiBzdWJIb3VycyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkSG91cnMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1YkhvdXJzX2RlZmF1bHQ7CnZhciBpbml0X3N1YkhvdXJzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YkhvdXJzLmpzIigpIHsKICAgIGluaXRfYWRkSG91cnMoKTsKICAgIHN1YkhvdXJzX2RlZmF1bHQgPSBzdWJIb3VyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJNaWxsaXNlY29uZHMuanMKZnVuY3Rpb24gc3ViTWlsbGlzZWNvbmRzKGRhdGUsIGFtb3VudCwgb3B0aW9ucykgewogIHJldHVybiBhZGRNaWxsaXNlY29uZHMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1Yk1pbGxpc2Vjb25kc19kZWZhdWx0Owp2YXIgaW5pdF9zdWJNaWxsaXNlY29uZHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViTWlsbGlzZWNvbmRzLmpzIigpIHsKICAgIGluaXRfYWRkTWlsbGlzZWNvbmRzKCk7CiAgICBzdWJNaWxsaXNlY29uZHNfZGVmYXVsdCA9IHN1Yk1pbGxpc2Vjb25kczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJNaW51dGVzLmpzCmZ1bmN0aW9uIHN1Yk1pbnV0ZXMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7CiAgcmV0dXJuIGFkZE1pbnV0ZXMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1Yk1pbnV0ZXNfZGVmYXVsdDsKdmFyIGluaXRfc3ViTWludXRlcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJNaW51dGVzLmpzIigpIHsKICAgIGluaXRfYWRkTWludXRlcygpOwogICAgc3ViTWludXRlc19kZWZhdWx0ID0gc3ViTWludXRlczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJRdWFydGVycy5qcwpmdW5jdGlvbiBzdWJRdWFydGVycyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkUXVhcnRlcnMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1YlF1YXJ0ZXJzX2RlZmF1bHQ7CnZhciBpbml0X3N1YlF1YXJ0ZXJzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YlF1YXJ0ZXJzLmpzIigpIHsKICAgIGluaXRfYWRkUXVhcnRlcnMoKTsKICAgIHN1YlF1YXJ0ZXJzX2RlZmF1bHQgPSBzdWJRdWFydGVyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJTZWNvbmRzLmpzCmZ1bmN0aW9uIHN1YlNlY29uZHMoZGF0ZSwgYW1vdW50LCBvcHRpb25zKSB7CiAgcmV0dXJuIGFkZFNlY29uZHMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1YlNlY29uZHNfZGVmYXVsdDsKdmFyIGluaXRfc3ViU2Vjb25kcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJTZWNvbmRzLmpzIigpIHsKICAgIGluaXRfYWRkU2Vjb25kcygpOwogICAgc3ViU2Vjb25kc19kZWZhdWx0ID0gc3ViU2Vjb25kczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJXZWVrcy5qcwpmdW5jdGlvbiBzdWJXZWVrcyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkV2Vla3MoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1YldlZWtzX2RlZmF1bHQ7CnZhciBpbml0X3N1YldlZWtzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YldlZWtzLmpzIigpIHsKICAgIGluaXRfYWRkV2Vla3MoKTsKICAgIHN1YldlZWtzX2RlZmF1bHQgPSBzdWJXZWVrczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJZZWFycy5qcwpmdW5jdGlvbiBzdWJZZWFycyhkYXRlLCBhbW91bnQsIG9wdGlvbnMpIHsKICByZXR1cm4gYWRkWWVhcnMoZGF0ZSwgLWFtb3VudCwgb3B0aW9ucyk7Cn0KdmFyIHN1YlllYXJzX2RlZmF1bHQ7CnZhciBpbml0X3N1YlllYXJzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YlllYXJzLmpzIigpIHsKICAgIGluaXRfYWRkWWVhcnMoKTsKICAgIHN1YlllYXJzX2RlZmF1bHQgPSBzdWJZZWFyczsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy93ZWVrc1RvRGF5cy5qcwpmdW5jdGlvbiB3ZWVrc1RvRGF5cyh3ZWVrcykgewogIHJldHVybiBNYXRoLnRydW5jKHdlZWtzICogZGF5c0luV2Vlayk7Cn0KdmFyIHdlZWtzVG9EYXlzX2RlZmF1bHQ7CnZhciBpbml0X3dlZWtzVG9EYXlzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3dlZWtzVG9EYXlzLmpzIigpIHsKICAgIGluaXRfY29uc3RhbnRzKCk7CiAgICB3ZWVrc1RvRGF5c19kZWZhdWx0ID0gd2Vla3NUb0RheXM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMveWVhcnNUb0RheXMuanMKZnVuY3Rpb24geWVhcnNUb0RheXMoeWVhcnMpIHsKICByZXR1cm4gTWF0aC50cnVuYyh5ZWFycyAqIGRheXNJblllYXIpOwp9CnZhciB5ZWFyc1RvRGF5c19kZWZhdWx0Owp2YXIgaW5pdF95ZWFyc1RvRGF5cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2RhdGUtZm5zQDQuMS4wL25vZGVfbW9kdWxlcy9kYXRlLWZucy95ZWFyc1RvRGF5cy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgeWVhcnNUb0RheXNfZGVmYXVsdCA9IHllYXJzVG9EYXlzOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3llYXJzVG9Nb250aHMuanMKZnVuY3Rpb24geWVhcnNUb01vbnRocyh5ZWFycykgewogIHJldHVybiBNYXRoLnRydW5jKHllYXJzICogbW9udGhzSW5ZZWFyKTsKfQp2YXIgeWVhcnNUb01vbnRoc19kZWZhdWx0Owp2YXIgaW5pdF95ZWFyc1RvTW9udGhzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3llYXJzVG9Nb250aHMuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMoKTsKICAgIHllYXJzVG9Nb250aHNfZGVmYXVsdCA9IHllYXJzVG9Nb250aHM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMveWVhcnNUb1F1YXJ0ZXJzLmpzCmZ1bmN0aW9uIHllYXJzVG9RdWFydGVycyh5ZWFycykgewogIHJldHVybiBNYXRoLnRydW5jKHllYXJzICogcXVhcnRlcnNJblllYXIpOwp9CnZhciB5ZWFyc1RvUXVhcnRlcnNfZGVmYXVsdDsKdmFyIGluaXRfeWVhcnNUb1F1YXJ0ZXJzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3llYXJzVG9RdWFydGVycy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50cygpOwogICAgeWVhcnNUb1F1YXJ0ZXJzX2RlZmF1bHQgPSB5ZWFyc1RvUXVhcnRlcnM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9kYXRlLWZuc0A0LjEuMC9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaW5kZXguanMKdmFyIGRhdGVfZm5zX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoZGF0ZV9mbnNfZXhwb3J0cywgewogIGFkZDogKCkgPT4gYWRkLAogIGFkZEJ1c2luZXNzRGF5czogKCkgPT4gYWRkQnVzaW5lc3NEYXlzLAogIGFkZERheXM6ICgpID0+IGFkZERheXMsCiAgYWRkSG91cnM6ICgpID0+IGFkZEhvdXJzLAogIGFkZElTT1dlZWtZZWFyczogKCkgPT4gYWRkSVNPV2Vla1llYXJzLAogIGFkZE1pbGxpc2Vjb25kczogKCkgPT4gYWRkTWlsbGlzZWNvbmRzLAogIGFkZE1pbnV0ZXM6ICgpID0+IGFkZE1pbnV0ZXMsCiAgYWRkTW9udGhzOiAoKSA9PiBhZGRNb250aHMsCiAgYWRkUXVhcnRlcnM6ICgpID0+IGFkZFF1YXJ0ZXJzLAogIGFkZFNlY29uZHM6ICgpID0+IGFkZFNlY29uZHMsCiAgYWRkV2Vla3M6ICgpID0+IGFkZFdlZWtzLAogIGFkZFllYXJzOiAoKSA9PiBhZGRZZWFycywKICBhcmVJbnRlcnZhbHNPdmVybGFwcGluZzogKCkgPT4gYXJlSW50ZXJ2YWxzT3ZlcmxhcHBpbmcsCiAgY2xhbXA6ICgpID0+IGNsYW1wLAogIGNsb3Nlc3RJbmRleFRvOiAoKSA9PiBjbG9zZXN0SW5kZXhUbywKICBjbG9zZXN0VG86ICgpID0+IGNsb3Nlc3RUbywKICBjb21wYXJlQXNjOiAoKSA9PiBjb21wYXJlQXNjLAogIGNvbXBhcmVEZXNjOiAoKSA9PiBjb21wYXJlRGVzYywKICBjb25zdHJ1Y3RGcm9tOiAoKSA9PiBjb25zdHJ1Y3RGcm9tLAogIGNvbnN0cnVjdE5vdzogKCkgPT4gY29uc3RydWN0Tm93LAogIGRheXNUb1dlZWtzOiAoKSA9PiBkYXlzVG9XZWVrcywKICBkaWZmZXJlbmNlSW5CdXNpbmVzc0RheXM6ICgpID0+IGRpZmZlcmVuY2VJbkJ1c2luZXNzRGF5cywKICBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXM6ICgpID0+IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cywKICBkaWZmZXJlbmNlSW5DYWxlbmRhcklTT1dlZWtZZWFyczogKCkgPT4gZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrWWVhcnMsCiAgZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrczogKCkgPT4gZGlmZmVyZW5jZUluQ2FsZW5kYXJJU09XZWVrcywKICBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRoczogKCkgPT4gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMsCiAgZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVyczogKCkgPT4gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycywKICBkaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzOiAoKSA9PiBkaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzLAogIGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnM6ICgpID0+IGRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMsCiAgZGlmZmVyZW5jZUluRGF5czogKCkgPT4gZGlmZmVyZW5jZUluRGF5cywKICBkaWZmZXJlbmNlSW5Ib3VyczogKCkgPT4gZGlmZmVyZW5jZUluSG91cnMsCiAgZGlmZmVyZW5jZUluSVNPV2Vla1llYXJzOiAoKSA9PiBkaWZmZXJlbmNlSW5JU09XZWVrWWVhcnMsCiAgZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzOiAoKSA9PiBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMsCiAgZGlmZmVyZW5jZUluTWludXRlczogKCkgPT4gZGlmZmVyZW5jZUluTWludXRlcywKICBkaWZmZXJlbmNlSW5Nb250aHM6ICgpID0+IGRpZmZlcmVuY2VJbk1vbnRocywKICBkaWZmZXJlbmNlSW5RdWFydGVyczogKCkgPT4gZGlmZmVyZW5jZUluUXVhcnRlcnMsCiAgZGlmZmVyZW5jZUluU2Vjb25kczogKCkgPT4gZGlmZmVyZW5jZUluU2Vjb25kcywKICBkaWZmZXJlbmNlSW5XZWVrczogKCkgPT4gZGlmZmVyZW5jZUluV2Vla3MsCiAgZGlmZmVyZW5jZUluWWVhcnM6ICgpID0+IGRpZmZlcmVuY2VJblllYXJzLAogIGVhY2hEYXlPZkludGVydmFsOiAoKSA9PiBlYWNoRGF5T2ZJbnRlcnZhbCwKICBlYWNoSG91ck9mSW50ZXJ2YWw6ICgpID0+IGVhY2hIb3VyT2ZJbnRlcnZhbCwKICBlYWNoTWludXRlT2ZJbnRlcnZhbDogKCkgPT4gZWFjaE1pbnV0ZU9mSW50ZXJ2YWwsCiAgZWFjaE1vbnRoT2ZJbnRlcnZhbDogKCkgPT4gZWFjaE1vbnRoT2ZJbnRlcnZhbCwKICBlYWNoUXVhcnRlck9mSW50ZXJ2YWw6ICgpID0+IGVhY2hRdWFydGVyT2ZJbnRlcnZhbCwKICBlYWNoV2Vla09mSW50ZXJ2YWw6ICgpID0+IGVhY2hXZWVrT2ZJbnRlcnZhbCwKICBlYWNoV2Vla2VuZE9mSW50ZXJ2YWw6ICgpID0+IGVhY2hXZWVrZW5kT2ZJbnRlcnZhbCwKICBlYWNoV2Vla2VuZE9mTW9udGg6ICgpID0+IGVhY2hXZWVrZW5kT2ZNb250aCwKICBlYWNoV2Vla2VuZE9mWWVhcjogKCkgPT4gZWFjaFdlZWtlbmRPZlllYXIsCiAgZWFjaFllYXJPZkludGVydmFsOiAoKSA9PiBlYWNoWWVhck9mSW50ZXJ2YWwsCiAgZW5kT2ZEYXk6ICgpID0+IGVuZE9mRGF5LAogIGVuZE9mRGVjYWRlOiAoKSA9PiBlbmRPZkRlY2FkZSwKICBlbmRPZkhvdXI6ICgpID0+IGVuZE9mSG91ciwKICBlbmRPZklTT1dlZWs6ICgpID0+IGVuZE9mSVNPV2VlaywKICBlbmRPZklTT1dlZWtZZWFyOiAoKSA9PiBlbmRPZklTT1dlZWtZZWFyLAogIGVuZE9mTWludXRlOiAoKSA9PiBlbmRPZk1pbnV0ZSwKICBlbmRPZk1vbnRoOiAoKSA9PiBlbmRPZk1vbnRoLAogIGVuZE9mUXVhcnRlcjogKCkgPT4gZW5kT2ZRdWFydGVyLAogIGVuZE9mU2Vjb25kOiAoKSA9PiBlbmRPZlNlY29uZCwKICBlbmRPZlRvZGF5OiAoKSA9PiBlbmRPZlRvZGF5LAogIGVuZE9mVG9tb3Jyb3c6ICgpID0+IGVuZE9mVG9tb3Jyb3csCiAgZW5kT2ZXZWVrOiAoKSA9PiBlbmRPZldlZWssCiAgZW5kT2ZZZWFyOiAoKSA9PiBlbmRPZlllYXIsCiAgZW5kT2ZZZXN0ZXJkYXk6ICgpID0+IGVuZE9mWWVzdGVyZGF5LAogIGZvcm1hdDogKCkgPT4gZm9ybWF0LAogIGZvcm1hdERhdGU6ICgpID0+IGZvcm1hdCwKICBmb3JtYXREaXN0YW5jZTogKCkgPT4gZm9ybWF0RGlzdGFuY2UyLAogIGZvcm1hdERpc3RhbmNlU3RyaWN0OiAoKSA9PiBmb3JtYXREaXN0YW5jZVN0cmljdCwKICBmb3JtYXREaXN0YW5jZVRvTm93OiAoKSA9PiBmb3JtYXREaXN0YW5jZVRvTm93LAogIGZvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3Q6ICgpID0+IGZvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3QsCiAgZm9ybWF0RHVyYXRpb246ICgpID0+IGZvcm1hdER1cmF0aW9uLAogIGZvcm1hdElTTzogKCkgPT4gZm9ybWF0SVNPLAogIGZvcm1hdElTTzkwNzU6ICgpID0+IGZvcm1hdElTTzkwNzUsCiAgZm9ybWF0SVNPRHVyYXRpb246ICgpID0+IGZvcm1hdElTT0R1cmF0aW9uLAogIGZvcm1hdFJGQzMzMzk6ICgpID0+IGZvcm1hdFJGQzMzMzksCiAgZm9ybWF0UkZDNzIzMTogKCkgPT4gZm9ybWF0UkZDNzIzMSwKICBmb3JtYXRSZWxhdGl2ZTogKCkgPT4gZm9ybWF0UmVsYXRpdmUyLAogIGZvcm1hdHRlcnM6ICgpID0+IGZvcm1hdHRlcnMsCiAgZnJvbVVuaXhUaW1lOiAoKSA9PiBmcm9tVW5peFRpbWUsCiAgZ2V0RGF0ZTogKCkgPT4gZ2V0RGF0ZSwKICBnZXREYXk6ICgpID0+IGdldERheSwKICBnZXREYXlPZlllYXI6ICgpID0+IGdldERheU9mWWVhciwKICBnZXREYXlzSW5Nb250aDogKCkgPT4gZ2V0RGF5c0luTW9udGgsCiAgZ2V0RGF5c0luWWVhcjogKCkgPT4gZ2V0RGF5c0luWWVhciwKICBnZXREZWNhZGU6ICgpID0+IGdldERlY2FkZSwKICBnZXREZWZhdWx0T3B0aW9uczogKCkgPT4gZ2V0RGVmYXVsdE9wdGlvbnMyLAogIGdldEhvdXJzOiAoKSA9PiBnZXRIb3VycywKICBnZXRJU09EYXk6ICgpID0+IGdldElTT0RheSwKICBnZXRJU09XZWVrOiAoKSA9PiBnZXRJU09XZWVrLAogIGdldElTT1dlZWtZZWFyOiAoKSA9PiBnZXRJU09XZWVrWWVhciwKICBnZXRJU09XZWVrc0luWWVhcjogKCkgPT4gZ2V0SVNPV2Vla3NJblllYXIsCiAgZ2V0TWlsbGlzZWNvbmRzOiAoKSA9PiBnZXRNaWxsaXNlY29uZHMsCiAgZ2V0TWludXRlczogKCkgPT4gZ2V0TWludXRlcywKICBnZXRNb250aDogKCkgPT4gZ2V0TW9udGgsCiAgZ2V0T3ZlcmxhcHBpbmdEYXlzSW5JbnRlcnZhbHM6ICgpID0+IGdldE92ZXJsYXBwaW5nRGF5c0luSW50ZXJ2YWxzLAogIGdldFF1YXJ0ZXI6ICgpID0+IGdldFF1YXJ0ZXIsCiAgZ2V0U2Vjb25kczogKCkgPT4gZ2V0U2Vjb25kcywKICBnZXRUaW1lOiAoKSA9PiBnZXRUaW1lLAogIGdldFVuaXhUaW1lOiAoKSA9PiBnZXRVbml4VGltZSwKICBnZXRXZWVrOiAoKSA9PiBnZXRXZWVrLAogIGdldFdlZWtPZk1vbnRoOiAoKSA9PiBnZXRXZWVrT2ZNb250aCwKICBnZXRXZWVrWWVhcjogKCkgPT4gZ2V0V2Vla1llYXIsCiAgZ2V0V2Vla3NJbk1vbnRoOiAoKSA9PiBnZXRXZWVrc0luTW9udGgsCiAgZ2V0WWVhcjogKCkgPT4gZ2V0WWVhciwKICBob3Vyc1RvTWlsbGlzZWNvbmRzOiAoKSA9PiBob3Vyc1RvTWlsbGlzZWNvbmRzLAogIGhvdXJzVG9NaW51dGVzOiAoKSA9PiBob3Vyc1RvTWludXRlcywKICBob3Vyc1RvU2Vjb25kczogKCkgPT4gaG91cnNUb1NlY29uZHMsCiAgaW50ZXJ2YWw6ICgpID0+IGludGVydmFsMiwKICBpbnRlcnZhbFRvRHVyYXRpb246ICgpID0+IGludGVydmFsVG9EdXJhdGlvbiwKICBpbnRsRm9ybWF0OiAoKSA9PiBpbnRsRm9ybWF0LAogIGludGxGb3JtYXREaXN0YW5jZTogKCkgPT4gaW50bEZvcm1hdERpc3RhbmNlLAogIGlzQWZ0ZXI6ICgpID0+IGlzQWZ0ZXIsCiAgaXNCZWZvcmU6ICgpID0+IGlzQmVmb3JlLAogIGlzRGF0ZTogKCkgPT4gaXNEYXRlLAogIGlzRXF1YWw6ICgpID0+IGlzRXF1YWwsCiAgaXNFeGlzdHM6ICgpID0+IGlzRXhpc3RzLAogIGlzRmlyc3REYXlPZk1vbnRoOiAoKSA9PiBpc0ZpcnN0RGF5T2ZNb250aCwKICBpc0ZyaWRheTogKCkgPT4gaXNGcmlkYXksCiAgaXNGdXR1cmU6ICgpID0+IGlzRnV0dXJlLAogIGlzTGFzdERheU9mTW9udGg6ICgpID0+IGlzTGFzdERheU9mTW9udGgsCiAgaXNMZWFwWWVhcjogKCkgPT4gaXNMZWFwWWVhciwKICBpc01hdGNoOiAoKSA9PiBpc01hdGNoMiwKICBpc01vbmRheTogKCkgPT4gaXNNb25kYXksCiAgaXNQYXN0OiAoKSA9PiBpc1Bhc3QsCiAgaXNTYW1lRGF5OiAoKSA9PiBpc1NhbWVEYXksCiAgaXNTYW1lSG91cjogKCkgPT4gaXNTYW1lSG91ciwKICBpc1NhbWVJU09XZWVrOiAoKSA9PiBpc1NhbWVJU09XZWVrLAogIGlzU2FtZUlTT1dlZWtZZWFyOiAoKSA9PiBpc1NhbWVJU09XZWVrWWVhciwKICBpc1NhbWVNaW51dGU6ICgpID0+IGlzU2FtZU1pbnV0ZSwKICBpc1NhbWVNb250aDogKCkgPT4gaXNTYW1lTW9udGgsCiAgaXNTYW1lUXVhcnRlcjogKCkgPT4gaXNTYW1lUXVhcnRlciwKICBpc1NhbWVTZWNvbmQ6ICgpID0+IGlzU2FtZVNlY29uZCwKICBpc1NhbWVXZWVrOiAoKSA9PiBpc1NhbWVXZWVrLAogIGlzU2FtZVllYXI6ICgpID0+IGlzU2FtZVllYXIsCiAgaXNTYXR1cmRheTogKCkgPT4gaXNTYXR1cmRheSwKICBpc1N1bmRheTogKCkgPT4gaXNTdW5kYXksCiAgaXNUaGlzSG91cjogKCkgPT4gaXNUaGlzSG91ciwKICBpc1RoaXNJU09XZWVrOiAoKSA9PiBpc1RoaXNJU09XZWVrLAogIGlzVGhpc01pbnV0ZTogKCkgPT4gaXNUaGlzTWludXRlLAogIGlzVGhpc01vbnRoOiAoKSA9PiBpc1RoaXNNb250aCwKICBpc1RoaXNRdWFydGVyOiAoKSA9PiBpc1RoaXNRdWFydGVyLAogIGlzVGhpc1NlY29uZDogKCkgPT4gaXNUaGlzU2Vjb25kLAogIGlzVGhpc1dlZWs6ICgpID0+IGlzVGhpc1dlZWssCiAgaXNUaGlzWWVhcjogKCkgPT4gaXNUaGlzWWVhciwKICBpc1RodXJzZGF5OiAoKSA9PiBpc1RodXJzZGF5LAogIGlzVG9kYXk6ICgpID0+IGlzVG9kYXksCiAgaXNUb21vcnJvdzogKCkgPT4gaXNUb21vcnJvdywKICBpc1R1ZXNkYXk6ICgpID0+IGlzVHVlc2RheSwKICBpc1ZhbGlkOiAoKSA9PiBpc1ZhbGlkLAogIGlzV2VkbmVzZGF5OiAoKSA9PiBpc1dlZG5lc2RheSwKICBpc1dlZWtlbmQ6ICgpID0+IGlzV2Vla2VuZCwKICBpc1dpdGhpbkludGVydmFsOiAoKSA9PiBpc1dpdGhpbkludGVydmFsLAogIGlzWWVzdGVyZGF5OiAoKSA9PiBpc1llc3RlcmRheSwKICBsYXN0RGF5T2ZEZWNhZGU6ICgpID0+IGxhc3REYXlPZkRlY2FkZSwKICBsYXN0RGF5T2ZJU09XZWVrOiAoKSA9PiBsYXN0RGF5T2ZJU09XZWVrLAogIGxhc3REYXlPZklTT1dlZWtZZWFyOiAoKSA9PiBsYXN0RGF5T2ZJU09XZWVrWWVhciwKICBsYXN0RGF5T2ZNb250aDogKCkgPT4gbGFzdERheU9mTW9udGgsCiAgbGFzdERheU9mUXVhcnRlcjogKCkgPT4gbGFzdERheU9mUXVhcnRlciwKICBsYXN0RGF5T2ZXZWVrOiAoKSA9PiBsYXN0RGF5T2ZXZWVrLAogIGxhc3REYXlPZlllYXI6ICgpID0+IGxhc3REYXlPZlllYXIsCiAgbGlnaHRGb3JtYXQ6ICgpID0+IGxpZ2h0Rm9ybWF0LAogIGxpZ2h0Rm9ybWF0dGVyczogKCkgPT4gbGlnaHRGb3JtYXR0ZXJzLAogIGxvbmdGb3JtYXR0ZXJzOiAoKSA9PiBsb25nRm9ybWF0dGVycywKICBtYXg6ICgpID0+IG1heDIsCiAgbWlsbGlzZWNvbmRzOiAoKSA9PiBtaWxsaXNlY29uZHMsCiAgbWlsbGlzZWNvbmRzVG9Ib3VyczogKCkgPT4gbWlsbGlzZWNvbmRzVG9Ib3VycywKICBtaWxsaXNlY29uZHNUb01pbnV0ZXM6ICgpID0+IG1pbGxpc2Vjb25kc1RvTWludXRlcywKICBtaWxsaXNlY29uZHNUb1NlY29uZHM6ICgpID0+IG1pbGxpc2Vjb25kc1RvU2Vjb25kcywKICBtaW46ICgpID0+IG1pbjIsCiAgbWludXRlc1RvSG91cnM6ICgpID0+IG1pbnV0ZXNUb0hvdXJzLAogIG1pbnV0ZXNUb01pbGxpc2Vjb25kczogKCkgPT4gbWludXRlc1RvTWlsbGlzZWNvbmRzLAogIG1pbnV0ZXNUb1NlY29uZHM6ICgpID0+IG1pbnV0ZXNUb1NlY29uZHMsCiAgbW9udGhzVG9RdWFydGVyczogKCkgPT4gbW9udGhzVG9RdWFydGVycywKICBtb250aHNUb1llYXJzOiAoKSA9PiBtb250aHNUb1llYXJzLAogIG5leHREYXk6ICgpID0+IG5leHREYXksCiAgbmV4dEZyaWRheTogKCkgPT4gbmV4dEZyaWRheSwKICBuZXh0TW9uZGF5OiAoKSA9PiBuZXh0TW9uZGF5LAogIG5leHRTYXR1cmRheTogKCkgPT4gbmV4dFNhdHVyZGF5LAogIG5leHRTdW5kYXk6ICgpID0+IG5leHRTdW5kYXksCiAgbmV4dFRodXJzZGF5OiAoKSA9PiBuZXh0VGh1cnNkYXksCiAgbmV4dFR1ZXNkYXk6ICgpID0+IG5leHRUdWVzZGF5LAogIG5leHRXZWRuZXNkYXk6ICgpID0+IG5leHRXZWRuZXNkYXksCiAgcGFyc2U6ICgpID0+IHBhcnNlLAogIHBhcnNlSVNPOiAoKSA9PiBwYXJzZUlTTywKICBwYXJzZUpTT046ICgpID0+IHBhcnNlSlNPTiwKICBwYXJzZXJzOiAoKSA9PiBwYXJzZXJzLAogIHByZXZpb3VzRGF5OiAoKSA9PiBwcmV2aW91c0RheSwKICBwcmV2aW91c0ZyaWRheTogKCkgPT4gcHJldmlvdXNGcmlkYXksCiAgcHJldmlvdXNNb25kYXk6ICgpID0+IHByZXZpb3VzTW9uZGF5LAogIHByZXZpb3VzU2F0dXJkYXk6ICgpID0+IHByZXZpb3VzU2F0dXJkYXksCiAgcHJldmlvdXNTdW5kYXk6ICgpID0+IHByZXZpb3VzU3VuZGF5LAogIHByZXZpb3VzVGh1cnNkYXk6ICgpID0+IHByZXZpb3VzVGh1cnNkYXksCiAgcHJldmlvdXNUdWVzZGF5OiAoKSA9PiBwcmV2aW91c1R1ZXNkYXksCiAgcHJldmlvdXNXZWRuZXNkYXk6ICgpID0+IHByZXZpb3VzV2VkbmVzZGF5LAogIHF1YXJ0ZXJzVG9Nb250aHM6ICgpID0+IHF1YXJ0ZXJzVG9Nb250aHMsCiAgcXVhcnRlcnNUb1llYXJzOiAoKSA9PiBxdWFydGVyc1RvWWVhcnMsCiAgcm91bmRUb05lYXJlc3RIb3VyczogKCkgPT4gcm91bmRUb05lYXJlc3RIb3VycywKICByb3VuZFRvTmVhcmVzdE1pbnV0ZXM6ICgpID0+IHJvdW5kVG9OZWFyZXN0TWludXRlcywKICBzZWNvbmRzVG9Ib3VyczogKCkgPT4gc2Vjb25kc1RvSG91cnMsCiAgc2Vjb25kc1RvTWlsbGlzZWNvbmRzOiAoKSA9PiBzZWNvbmRzVG9NaWxsaXNlY29uZHMsCiAgc2Vjb25kc1RvTWludXRlczogKCkgPT4gc2Vjb25kc1RvTWludXRlcywKICBzZXQ6ICgpID0+IHNldCwKICBzZXREYXRlOiAoKSA9PiBzZXREYXRlLAogIHNldERheTogKCkgPT4gc2V0RGF5LAogIHNldERheU9mWWVhcjogKCkgPT4gc2V0RGF5T2ZZZWFyLAogIHNldERlZmF1bHRPcHRpb25zOiAoKSA9PiBzZXREZWZhdWx0T3B0aW9uczIsCiAgc2V0SG91cnM6ICgpID0+IHNldEhvdXJzLAogIHNldElTT0RheTogKCkgPT4gc2V0SVNPRGF5LAogIHNldElTT1dlZWs6ICgpID0+IHNldElTT1dlZWssCiAgc2V0SVNPV2Vla1llYXI6ICgpID0+IHNldElTT1dlZWtZZWFyLAogIHNldE1pbGxpc2Vjb25kczogKCkgPT4gc2V0TWlsbGlzZWNvbmRzLAogIHNldE1pbnV0ZXM6ICgpID0+IHNldE1pbnV0ZXMsCiAgc2V0TW9udGg6ICgpID0+IHNldE1vbnRoLAogIHNldFF1YXJ0ZXI6ICgpID0+IHNldFF1YXJ0ZXIsCiAgc2V0U2Vjb25kczogKCkgPT4gc2V0U2Vjb25kcywKICBzZXRXZWVrOiAoKSA9PiBzZXRXZWVrLAogIHNldFdlZWtZZWFyOiAoKSA9PiBzZXRXZWVrWWVhciwKICBzZXRZZWFyOiAoKSA9PiBzZXRZZWFyLAogIHN0YXJ0T2ZEYXk6ICgpID0+IHN0YXJ0T2ZEYXksCiAgc3RhcnRPZkRlY2FkZTogKCkgPT4gc3RhcnRPZkRlY2FkZSwKICBzdGFydE9mSG91cjogKCkgPT4gc3RhcnRPZkhvdXIsCiAgc3RhcnRPZklTT1dlZWs6ICgpID0+IHN0YXJ0T2ZJU09XZWVrLAogIHN0YXJ0T2ZJU09XZWVrWWVhcjogKCkgPT4gc3RhcnRPZklTT1dlZWtZZWFyLAogIHN0YXJ0T2ZNaW51dGU6ICgpID0+IHN0YXJ0T2ZNaW51dGUsCiAgc3RhcnRPZk1vbnRoOiAoKSA9PiBzdGFydE9mTW9udGgsCiAgc3RhcnRPZlF1YXJ0ZXI6ICgpID0+IHN0YXJ0T2ZRdWFydGVyLAogIHN0YXJ0T2ZTZWNvbmQ6ICgpID0+IHN0YXJ0T2ZTZWNvbmQsCiAgc3RhcnRPZlRvZGF5OiAoKSA9PiBzdGFydE9mVG9kYXksCiAgc3RhcnRPZlRvbW9ycm93OiAoKSA9PiBzdGFydE9mVG9tb3Jyb3csCiAgc3RhcnRPZldlZWs6ICgpID0+IHN0YXJ0T2ZXZWVrLAogIHN0YXJ0T2ZXZWVrWWVhcjogKCkgPT4gc3RhcnRPZldlZWtZZWFyLAogIHN0YXJ0T2ZZZWFyOiAoKSA9PiBzdGFydE9mWWVhciwKICBzdGFydE9mWWVzdGVyZGF5OiAoKSA9PiBzdGFydE9mWWVzdGVyZGF5LAogIHN1YjogKCkgPT4gc3ViLAogIHN1YkJ1c2luZXNzRGF5czogKCkgPT4gc3ViQnVzaW5lc3NEYXlzLAogIHN1YkRheXM6ICgpID0+IHN1YkRheXMsCiAgc3ViSG91cnM6ICgpID0+IHN1YkhvdXJzLAogIHN1YklTT1dlZWtZZWFyczogKCkgPT4gc3ViSVNPV2Vla1llYXJzLAogIHN1Yk1pbGxpc2Vjb25kczogKCkgPT4gc3ViTWlsbGlzZWNvbmRzLAogIHN1Yk1pbnV0ZXM6ICgpID0+IHN1Yk1pbnV0ZXMsCiAgc3ViTW9udGhzOiAoKSA9PiBzdWJNb250aHMsCiAgc3ViUXVhcnRlcnM6ICgpID0+IHN1YlF1YXJ0ZXJzLAogIHN1YlNlY29uZHM6ICgpID0+IHN1YlNlY29uZHMsCiAgc3ViV2Vla3M6ICgpID0+IHN1YldlZWtzLAogIHN1YlllYXJzOiAoKSA9PiBzdWJZZWFycywKICB0b0RhdGU6ICgpID0+IHRvRGF0ZSwKICB0cmFuc3Bvc2U6ICgpID0+IHRyYW5zcG9zZSwKICB3ZWVrc1RvRGF5czogKCkgPT4gd2Vla3NUb0RheXMsCiAgeWVhcnNUb0RheXM6ICgpID0+IHllYXJzVG9EYXlzLAogIHllYXJzVG9Nb250aHM6ICgpID0+IHllYXJzVG9Nb250aHMsCiAgeWVhcnNUb1F1YXJ0ZXJzOiAoKSA9PiB5ZWFyc1RvUXVhcnRlcnMKfSk7CnZhciBpbml0X2RhdGVfZm5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGF0ZS1mbnNANC4xLjAvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2luZGV4LmpzIigpIHsKICAgIGluaXRfYWRkKCk7CiAgICBpbml0X2FkZEJ1c2luZXNzRGF5cygpOwogICAgaW5pdF9hZGREYXlzKCk7CiAgICBpbml0X2FkZEhvdXJzKCk7CiAgICBpbml0X2FkZElTT1dlZWtZZWFycygpOwogICAgaW5pdF9hZGRNaWxsaXNlY29uZHMoKTsKICAgIGluaXRfYWRkTWludXRlcygpOwogICAgaW5pdF9hZGRNb250aHMoKTsKICAgIGluaXRfYWRkUXVhcnRlcnMoKTsKICAgIGluaXRfYWRkU2Vjb25kcygpOwogICAgaW5pdF9hZGRXZWVrcygpOwogICAgaW5pdF9hZGRZZWFycygpOwogICAgaW5pdF9hcmVJbnRlcnZhbHNPdmVybGFwcGluZygpOwogICAgaW5pdF9jbGFtcCgpOwogICAgaW5pdF9jbG9zZXN0SW5kZXhUbygpOwogICAgaW5pdF9jbG9zZXN0VG8oKTsKICAgIGluaXRfY29tcGFyZUFzYygpOwogICAgaW5pdF9jb21wYXJlRGVzYygpOwogICAgaW5pdF9jb25zdHJ1Y3RGcm9tKCk7CiAgICBpbml0X2NvbnN0cnVjdE5vdygpOwogICAgaW5pdF9kYXlzVG9XZWVrcygpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5CdXNpbmVzc0RheXMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla1llYXJzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFySVNPV2Vla3MoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycygpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5DYWxlbmRhcldlZWtzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluRGF5cygpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5Ib3VycygpOwogICAgaW5pdF9kaWZmZXJlbmNlSW5JU09XZWVrWWVhcnMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJbk1pbnV0ZXMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluTW9udGhzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJblF1YXJ0ZXJzKCk7CiAgICBpbml0X2RpZmZlcmVuY2VJblNlY29uZHMoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluV2Vla3MoKTsKICAgIGluaXRfZGlmZmVyZW5jZUluWWVhcnMoKTsKICAgIGluaXRfZWFjaERheU9mSW50ZXJ2YWwoKTsKICAgIGluaXRfZWFjaEhvdXJPZkludGVydmFsKCk7CiAgICBpbml0X2VhY2hNaW51dGVPZkludGVydmFsKCk7CiAgICBpbml0X2VhY2hNb250aE9mSW50ZXJ2YWwoKTsKICAgIGluaXRfZWFjaFF1YXJ0ZXJPZkludGVydmFsKCk7CiAgICBpbml0X2VhY2hXZWVrT2ZJbnRlcnZhbCgpOwogICAgaW5pdF9lYWNoV2Vla2VuZE9mSW50ZXJ2YWwoKTsKICAgIGluaXRfZWFjaFdlZWtlbmRPZk1vbnRoKCk7CiAgICBpbml0X2VhY2hXZWVrZW5kT2ZZZWFyKCk7CiAgICBpbml0X2VhY2hZZWFyT2ZJbnRlcnZhbCgpOwogICAgaW5pdF9lbmRPZkRheSgpOwogICAgaW5pdF9lbmRPZkRlY2FkZSgpOwogICAgaW5pdF9lbmRPZkhvdXIoKTsKICAgIGluaXRfZW5kT2ZJU09XZWVrKCk7CiAgICBpbml0X2VuZE9mSVNPV2Vla1llYXIoKTsKICAgIGluaXRfZW5kT2ZNaW51dGUoKTsKICAgIGluaXRfZW5kT2ZNb250aCgpOwogICAgaW5pdF9lbmRPZlF1YXJ0ZXIoKTsKICAgIGluaXRfZW5kT2ZTZWNvbmQoKTsKICAgIGluaXRfZW5kT2ZUb2RheSgpOwogICAgaW5pdF9lbmRPZlRvbW9ycm93KCk7CiAgICBpbml0X2VuZE9mV2VlaygpOwogICAgaW5pdF9lbmRPZlllYXIoKTsKICAgIGluaXRfZW5kT2ZZZXN0ZXJkYXkoKTsKICAgIGluaXRfZm9ybWF0KCk7CiAgICBpbml0X2Zvcm1hdERpc3RhbmNlMigpOwogICAgaW5pdF9mb3JtYXREaXN0YW5jZVN0cmljdCgpOwogICAgaW5pdF9mb3JtYXREaXN0YW5jZVRvTm93KCk7CiAgICBpbml0X2Zvcm1hdERpc3RhbmNlVG9Ob3dTdHJpY3QoKTsKICAgIGluaXRfZm9ybWF0RHVyYXRpb24oKTsKICAgIGluaXRfZm9ybWF0SVNPKCk7CiAgICBpbml0X2Zvcm1hdElTTzkwNzUoKTsKICAgIGluaXRfZm9ybWF0SVNPRHVyYXRpb24oKTsKICAgIGluaXRfZm9ybWF0UkZDMzMzOSgpOwogICAgaW5pdF9mb3JtYXRSRkM3MjMxKCk7CiAgICBpbml0X2Zvcm1hdFJlbGF0aXZlMigpOwogICAgaW5pdF9mcm9tVW5peFRpbWUoKTsKICAgIGluaXRfZ2V0RGF0ZSgpOwogICAgaW5pdF9nZXREYXkoKTsKICAgIGluaXRfZ2V0RGF5T2ZZZWFyKCk7CiAgICBpbml0X2dldERheXNJbk1vbnRoKCk7CiAgICBpbml0X2dldERheXNJblllYXIoKTsKICAgIGluaXRfZ2V0RGVjYWRlKCk7CiAgICBpbml0X2dldERlZmF1bHRPcHRpb25zKCk7CiAgICBpbml0X2dldEhvdXJzKCk7CiAgICBpbml0X2dldElTT0RheSgpOwogICAgaW5pdF9nZXRJU09XZWVrKCk7CiAgICBpbml0X2dldElTT1dlZWtZZWFyKCk7CiAgICBpbml0X2dldElTT1dlZWtzSW5ZZWFyKCk7CiAgICBpbml0X2dldE1pbGxpc2Vjb25kcygpOwogICAgaW5pdF9nZXRNaW51dGVzKCk7CiAgICBpbml0X2dldE1vbnRoKCk7CiAgICBpbml0X2dldE92ZXJsYXBwaW5nRGF5c0luSW50ZXJ2YWxzKCk7CiAgICBpbml0X2dldFF1YXJ0ZXIoKTsKICAgIGluaXRfZ2V0U2Vjb25kcygpOwogICAgaW5pdF9nZXRUaW1lKCk7CiAgICBpbml0X2dldFVuaXhUaW1lKCk7CiAgICBpbml0X2dldFdlZWsoKTsKICAgIGluaXRfZ2V0V2Vla09mTW9udGgoKTsKICAgIGluaXRfZ2V0V2Vla1llYXIoKTsKICAgIGluaXRfZ2V0V2Vla3NJbk1vbnRoKCk7CiAgICBpbml0X2dldFllYXIoKTsKICAgIGluaXRfaG91cnNUb01pbGxpc2Vjb25kcygpOwogICAgaW5pdF9ob3Vyc1RvTWludXRlcygpOwogICAgaW5pdF9ob3Vyc1RvU2Vjb25kcygpOwogICAgaW5pdF9pbnRlcnZhbDIoKTsKICAgIGluaXRfaW50ZXJ2YWxUb0R1cmF0aW9uKCk7CiAgICBpbml0X2ludGxGb3JtYXQoKTsKICAgIGluaXRfaW50bEZvcm1hdERpc3RhbmNlKCk7CiAgICBpbml0X2lzQWZ0ZXIoKTsKICAgIGluaXRfaXNCZWZvcmUoKTsKICAgIGluaXRfaXNEYXRlMigpOwogICAgaW5pdF9pc0VxdWFsKCk7CiAgICBpbml0X2lzRXhpc3RzKCk7CiAgICBpbml0X2lzRmlyc3REYXlPZk1vbnRoKCk7CiAgICBpbml0X2lzRnJpZGF5KCk7CiAgICBpbml0X2lzRnV0dXJlKCk7CiAgICBpbml0X2lzTGFzdERheU9mTW9udGgoKTsKICAgIGluaXRfaXNMZWFwWWVhcigpOwogICAgaW5pdF9pc01hdGNoKCk7CiAgICBpbml0X2lzTW9uZGF5KCk7CiAgICBpbml0X2lzUGFzdCgpOwogICAgaW5pdF9pc1NhbWVEYXkoKTsKICAgIGluaXRfaXNTYW1lSG91cigpOwogICAgaW5pdF9pc1NhbWVJU09XZWVrKCk7CiAgICBpbml0X2lzU2FtZUlTT1dlZWtZZWFyKCk7CiAgICBpbml0X2lzU2FtZU1pbnV0ZSgpOwogICAgaW5pdF9pc1NhbWVNb250aCgpOwogICAgaW5pdF9pc1NhbWVRdWFydGVyKCk7CiAgICBpbml0X2lzU2FtZVNlY29uZCgpOwogICAgaW5pdF9pc1NhbWVXZWVrKCk7CiAgICBpbml0X2lzU2FtZVllYXIoKTsKICAgIGluaXRfaXNTYXR1cmRheSgpOwogICAgaW5pdF9pc1N1bmRheSgpOwogICAgaW5pdF9pc1RoaXNIb3VyKCk7CiAgICBpbml0X2lzVGhpc0lTT1dlZWsoKTsKICAgIGluaXRfaXNUaGlzTWludXRlKCk7CiAgICBpbml0X2lzVGhpc01vbnRoKCk7CiAgICBpbml0X2lzVGhpc1F1YXJ0ZXIoKTsKICAgIGluaXRfaXNUaGlzU2Vjb25kKCk7CiAgICBpbml0X2lzVGhpc1dlZWsoKTsKICAgIGluaXRfaXNUaGlzWWVhcigpOwogICAgaW5pdF9pc1RodXJzZGF5KCk7CiAgICBpbml0X2lzVG9kYXkoKTsKICAgIGluaXRfaXNUb21vcnJvdygpOwogICAgaW5pdF9pc1R1ZXNkYXkoKTsKICAgIGluaXRfaXNWYWxpZCgpOwogICAgaW5pdF9pc1dlZG5lc2RheSgpOwogICAgaW5pdF9pc1dlZWtlbmQoKTsKICAgIGluaXRfaXNXaXRoaW5JbnRlcnZhbCgpOwogICAgaW5pdF9pc1llc3RlcmRheSgpOwogICAgaW5pdF9sYXN0RGF5T2ZEZWNhZGUoKTsKICAgIGluaXRfbGFzdERheU9mSVNPV2VlaygpOwogICAgaW5pdF9sYXN0RGF5T2ZJU09XZWVrWWVhcigpOwogICAgaW5pdF9sYXN0RGF5T2ZNb250aCgpOwogICAgaW5pdF9sYXN0RGF5T2ZRdWFydGVyKCk7CiAgICBpbml0X2xhc3REYXlPZldlZWsoKTsKICAgIGluaXRfbGFzdERheU9mWWVhcigpOwogICAgaW5pdF9saWdodEZvcm1hdCgpOwogICAgaW5pdF9tYXgyKCk7CiAgICBpbml0X21pbGxpc2Vjb25kcygpOwogICAgaW5pdF9taWxsaXNlY29uZHNUb0hvdXJzKCk7CiAgICBpbml0X21pbGxpc2Vjb25kc1RvTWludXRlcygpOwogICAgaW5pdF9taWxsaXNlY29uZHNUb1NlY29uZHMoKTsKICAgIGluaXRfbWluMigpOwogICAgaW5pdF9taW51dGVzVG9Ib3VycygpOwogICAgaW5pdF9taW51dGVzVG9NaWxsaXNlY29uZHMoKTsKICAgIGluaXRfbWludXRlc1RvU2Vjb25kcygpOwogICAgaW5pdF9tb250aHNUb1F1YXJ0ZXJzKCk7CiAgICBpbml0X21vbnRoc1RvWWVhcnMoKTsKICAgIGluaXRfbmV4dERheSgpOwogICAgaW5pdF9uZXh0RnJpZGF5KCk7CiAgICBpbml0X25leHRNb25kYXkoKTsKICAgIGluaXRfbmV4dFNhdHVyZGF5KCk7CiAgICBpbml0X25leHRTdW5kYXkoKTsKICAgIGluaXRfbmV4dFRodXJzZGF5KCk7CiAgICBpbml0X25leHRUdWVzZGF5KCk7CiAgICBpbml0X25leHRXZWRuZXNkYXkoKTsKICAgIGluaXRfcGFyc2UoKTsKICAgIGluaXRfcGFyc2VJU08oKTsKICAgIGluaXRfcGFyc2VKU09OKCk7CiAgICBpbml0X3ByZXZpb3VzRGF5KCk7CiAgICBpbml0X3ByZXZpb3VzRnJpZGF5KCk7CiAgICBpbml0X3ByZXZpb3VzTW9uZGF5KCk7CiAgICBpbml0X3ByZXZpb3VzU2F0dXJkYXkoKTsKICAgIGluaXRfcHJldmlvdXNTdW5kYXkoKTsKICAgIGluaXRfcHJldmlvdXNUaHVyc2RheSgpOwogICAgaW5pdF9wcmV2aW91c1R1ZXNkYXkoKTsKICAgIGluaXRfcHJldmlvdXNXZWRuZXNkYXkoKTsKICAgIGluaXRfcXVhcnRlcnNUb01vbnRocygpOwogICAgaW5pdF9xdWFydGVyc1RvWWVhcnMoKTsKICAgIGluaXRfcm91bmRUb05lYXJlc3RIb3VycygpOwogICAgaW5pdF9yb3VuZFRvTmVhcmVzdE1pbnV0ZXMoKTsKICAgIGluaXRfc2Vjb25kc1RvSG91cnMoKTsKICAgIGluaXRfc2Vjb25kc1RvTWlsbGlzZWNvbmRzKCk7CiAgICBpbml0X3NlY29uZHNUb01pbnV0ZXMoKTsKICAgIGluaXRfc2V0KCk7CiAgICBpbml0X3NldERhdGUoKTsKICAgIGluaXRfc2V0RGF5KCk7CiAgICBpbml0X3NldERheU9mWWVhcigpOwogICAgaW5pdF9zZXREZWZhdWx0T3B0aW9ucygpOwogICAgaW5pdF9zZXRIb3VycygpOwogICAgaW5pdF9zZXRJU09EYXkoKTsKICAgIGluaXRfc2V0SVNPV2VlaygpOwogICAgaW5pdF9zZXRJU09XZWVrWWVhcigpOwogICAgaW5pdF9zZXRNaWxsaXNlY29uZHMoKTsKICAgIGluaXRfc2V0TWludXRlcygpOwogICAgaW5pdF9zZXRNb250aCgpOwogICAgaW5pdF9zZXRRdWFydGVyKCk7CiAgICBpbml0X3NldFNlY29uZHMoKTsKICAgIGluaXRfc2V0V2VlaygpOwogICAgaW5pdF9zZXRXZWVrWWVhcigpOwogICAgaW5pdF9zZXRZZWFyKCk7CiAgICBpbml0X3N0YXJ0T2ZEYXkoKTsKICAgIGluaXRfc3RhcnRPZkRlY2FkZSgpOwogICAgaW5pdF9zdGFydE9mSG91cigpOwogICAgaW5pdF9zdGFydE9mSVNPV2VlaygpOwogICAgaW5pdF9zdGFydE9mSVNPV2Vla1llYXIoKTsKICAgIGluaXRfc3RhcnRPZk1pbnV0ZSgpOwogICAgaW5pdF9zdGFydE9mTW9udGgoKTsKICAgIGluaXRfc3RhcnRPZlF1YXJ0ZXIoKTsKICAgIGluaXRfc3RhcnRPZlNlY29uZCgpOwogICAgaW5pdF9zdGFydE9mVG9kYXkoKTsKICAgIGluaXRfc3RhcnRPZlRvbW9ycm93KCk7CiAgICBpbml0X3N0YXJ0T2ZXZWVrKCk7CiAgICBpbml0X3N0YXJ0T2ZXZWVrWWVhcigpOwogICAgaW5pdF9zdGFydE9mWWVhcigpOwogICAgaW5pdF9zdGFydE9mWWVzdGVyZGF5KCk7CiAgICBpbml0X3N1YigpOwogICAgaW5pdF9zdWJCdXNpbmVzc0RheXMoKTsKICAgIGluaXRfc3ViRGF5cygpOwogICAgaW5pdF9zdWJIb3VycygpOwogICAgaW5pdF9zdWJJU09XZWVrWWVhcnMoKTsKICAgIGluaXRfc3ViTWlsbGlzZWNvbmRzKCk7CiAgICBpbml0X3N1Yk1pbnV0ZXMoKTsKICAgIGluaXRfc3ViTW9udGhzKCk7CiAgICBpbml0X3N1YlF1YXJ0ZXJzKCk7CiAgICBpbml0X3N1YlNlY29uZHMoKTsKICAgIGluaXRfc3ViV2Vla3MoKTsKICAgIGluaXRfc3ViWWVhcnMoKTsKICAgIGluaXRfdG9EYXRlKCk7CiAgICBpbml0X3RyYW5zcG9zZSgpOwogICAgaW5pdF93ZWVrc1RvRGF5cygpOwogICAgaW5pdF95ZWFyc1RvRGF5cygpOwogICAgaW5pdF95ZWFyc1RvTW9udGhzKCk7CiAgICBpbml0X3llYXJzVG9RdWFydGVycygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4xOS9ub2RlX21vZHVsZXMvZGF5anMvZGF5anMubWluLmpzCnZhciByZXF1aXJlX2RheWpzX21pbiA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4xOS9ub2RlX21vZHVsZXMvZGF5anMvZGF5anMubWluLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICEoZnVuY3Rpb24odDksIGUxMSkgewogICAgICAib2JqZWN0IiA9PSB0eXBlb2YgZXhwb3J0cyAmJiAidW5kZWZpbmVkIiAhPSB0eXBlb2YgbW9kdWxlID8gbW9kdWxlLmV4cG9ydHMgPSBlMTEoKSA6ICJmdW5jdGlvbiIgPT0gdHlwZW9mIGRlZmluZSAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGUxMSkgOiAodDkgPSAidW5kZWZpbmVkIiAhPSB0eXBlb2YgZ2xvYmFsVGhpcyA/IGdsb2JhbFRoaXMgOiB0OSB8fCBzZWxmKS5kYXlqcyA9IGUxMSgpOwogICAgfSkoZXhwb3J0cywgKGZ1bmN0aW9uKCkgewogICAgICAidXNlIHN0cmljdCI7CiAgICAgIHZhciB0OSA9IDFlMywgZTExID0gNmU0LCBuMTMgPSAzNmU1LCByMTEgPSAibWlsbGlzZWNvbmQiLCBpMTEgPSAic2Vjb25kIiwgczEwID0gIm1pbnV0ZSIsIHU3ID0gImhvdXIiLCBhNSA9ICJkYXkiLCBvMTMgPSAid2VlayIsIGMxMSA9ICJtb250aCIsIGY4ID0gInF1YXJ0ZXIiLCBoOSA9ICJ5ZWFyIiwgZDYgPSAiZGF0ZSIsIGw2ID0gIkludmFsaWQgRGF0ZSIsICQ0ID0gL14oXGR7NH0pWy0vXT8oXGR7MSwyfSk/Wy0vXT8oXGR7MCwyfSlbVHRcc10qKFxkezEsMn0pPzo/KFxkezEsMn0pPzo/KFxkezEsMn0pP1suOl0/KFxkKyk/JC8sIHk1ID0gL1xbKFteXF1dKyldfFl7MSw0fXxNezEsNH18RHsxLDJ9fGR7MSw0fXxIezEsMn18aHsxLDJ9fGF8QXxtezEsMn18c3sxLDJ9fFp7MSwyfXxTU1MvZywgTTQgPSB7IG5hbWU6ICJlbiIsIHdlZWtkYXlzOiAiU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXkiLnNwbGl0KCJfIiksIG1vbnRoczogIkphbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXIiLnNwbGl0KCJfIiksIG9yZGluYWw6IGZ1bmN0aW9uKHQxMCkgewogICAgICAgIHZhciBlMTIgPSBbInRoIiwgInN0IiwgIm5kIiwgInJkIl0sIG4xNCA9IHQxMCAlIDEwMDsKICAgICAgICByZXR1cm4gIlsiICsgdDEwICsgKGUxMlsobjE0IC0gMjApICUgMTBdIHx8IGUxMltuMTRdIHx8IGUxMlswXSkgKyAiXSI7CiAgICAgIH0gfSwgbTcgPSBmdW5jdGlvbih0MTAsIGUxMiwgbjE0KSB7CiAgICAgICAgdmFyIHIxMiA9IFN0cmluZyh0MTApOwogICAgICAgIHJldHVybiAhcjEyIHx8IHIxMi5sZW5ndGggPj0gZTEyID8gdDEwIDogIiIgKyBBcnJheShlMTIgKyAxIC0gcjEyLmxlbmd0aCkuam9pbihuMTQpICsgdDEwOwogICAgICB9LCB2NiA9IHsgczogbTcsIHo6IGZ1bmN0aW9uKHQxMCkgewogICAgICAgIHZhciBlMTIgPSAtdDEwLnV0Y09mZnNldCgpLCBuMTQgPSBNYXRoLmFicyhlMTIpLCByMTIgPSBNYXRoLmZsb29yKG4xNCAvIDYwKSwgaTEyID0gbjE0ICUgNjA7CiAgICAgICAgcmV0dXJuIChlMTIgPD0gMCA/ICIrIiA6ICItIikgKyBtNyhyMTIsIDIsICIwIikgKyAiOiIgKyBtNyhpMTIsIDIsICIwIik7CiAgICAgIH0sIG06IGZ1bmN0aW9uIHQxMChlMTIsIG4xNCkgewogICAgICAgIGlmIChlMTIuZGF0ZSgpIDwgbjE0LmRhdGUoKSkgcmV0dXJuIC10MTAobjE0LCBlMTIpOwogICAgICAgIHZhciByMTIgPSAxMiAqIChuMTQueWVhcigpIC0gZTEyLnllYXIoKSkgKyAobjE0Lm1vbnRoKCkgLSBlMTIubW9udGgoKSksIGkxMiA9IGUxMi5jbG9uZSgpLmFkZChyMTIsIGMxMSksIHMxMSA9IG4xNCAtIGkxMiA8IDAsIHU4ID0gZTEyLmNsb25lKCkuYWRkKHIxMiArIChzMTEgPyAtMSA6IDEpLCBjMTEpOwogICAgICAgIHJldHVybiArKC0ocjEyICsgKG4xNCAtIGkxMikgLyAoczExID8gaTEyIC0gdTggOiB1OCAtIGkxMikpIHx8IDApOwogICAgICB9LCBhOiBmdW5jdGlvbih0MTApIHsKICAgICAgICByZXR1cm4gdDEwIDwgMCA/IE1hdGguY2VpbCh0MTApIHx8IDAgOiBNYXRoLmZsb29yKHQxMCk7CiAgICAgIH0sIHA6IGZ1bmN0aW9uKHQxMCkgewogICAgICAgIHJldHVybiB7IE06IGMxMSwgeTogaDksIHc6IG8xMywgZDogYTUsIEQ6IGQ2LCBoOiB1NywgbTogczEwLCBzOiBpMTEsIG1zOiByMTEsIFE6IGY4IH1bdDEwXSB8fCBTdHJpbmcodDEwIHx8ICIiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL3MkLywgIiIpOwogICAgICB9LCB1OiBmdW5jdGlvbih0MTApIHsKICAgICAgICByZXR1cm4gdm9pZCAwID09PSB0MTA7CiAgICAgIH0gfSwgZzUgPSAiZW4iLCBENSA9IHt9OwogICAgICBENVtnNV0gPSBNNDsKICAgICAgdmFyIHA4ID0gIiRpc0RheWpzT2JqZWN0IiwgUzUgPSBmdW5jdGlvbih0MTApIHsKICAgICAgICByZXR1cm4gdDEwIGluc3RhbmNlb2YgXzUgfHwgISghdDEwIHx8ICF0MTBbcDhdKTsKICAgICAgfSwgdzQgPSBmdW5jdGlvbiB0MTAoZTEyLCBuMTQsIHIxMikgewogICAgICAgIHZhciBpMTI7CiAgICAgICAgaWYgKCFlMTIpIHJldHVybiBnNTsKICAgICAgICBpZiAoInN0cmluZyIgPT0gdHlwZW9mIGUxMikgewogICAgICAgICAgdmFyIHMxMSA9IGUxMi50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgRDVbczExXSAmJiAoaTEyID0gczExKSwgbjE0ICYmIChENVtzMTFdID0gbjE0LCBpMTIgPSBzMTEpOwogICAgICAgICAgdmFyIHU4ID0gZTEyLnNwbGl0KCItIik7CiAgICAgICAgICBpZiAoIWkxMiAmJiB1OC5sZW5ndGggPiAxKSByZXR1cm4gdDEwKHU4WzBdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGE2ID0gZTEyLm5hbWU7CiAgICAgICAgICBENVthNl0gPSBlMTIsIGkxMiA9IGE2OwogICAgICAgIH0KICAgICAgICByZXR1cm4gIXIxMiAmJiBpMTIgJiYgKGc1ID0gaTEyKSwgaTEyIHx8ICFyMTIgJiYgZzU7CiAgICAgIH0sIE80ID0gZnVuY3Rpb24odDEwLCBlMTIpIHsKICAgICAgICBpZiAoUzUodDEwKSkgcmV0dXJuIHQxMC5jbG9uZSgpOwogICAgICAgIHZhciBuMTQgPSAib2JqZWN0IiA9PSB0eXBlb2YgZTEyID8gZTEyIDoge307CiAgICAgICAgcmV0dXJuIG4xNC5kYXRlID0gdDEwLCBuMTQuYXJncyA9IGFyZ3VtZW50cywgbmV3IF81KG4xNCk7CiAgICAgIH0sIGI2ID0gdjY7CiAgICAgIGI2LmwgPSB3NCwgYjYuaSA9IFM1LCBiNi53ID0gZnVuY3Rpb24odDEwLCBlMTIpIHsKICAgICAgICByZXR1cm4gTzQodDEwLCB7IGxvY2FsZTogZTEyLiRMLCB1dGM6IGUxMi4kdSwgeDogZTEyLiR4LCAkb2Zmc2V0OiBlMTIuJG9mZnNldCB9KTsKICAgICAgfTsKICAgICAgdmFyIF81ID0gKGZ1bmN0aW9uKCkgewogICAgICAgIGZ1bmN0aW9uIE01KHQxMCkgewogICAgICAgICAgdGhpcy4kTCA9IHc0KHQxMC5sb2NhbGUsIG51bGwsIHRydWUpLCB0aGlzLnBhcnNlKHQxMCksIHRoaXMuJHggPSB0aGlzLiR4IHx8IHQxMC54IHx8IHt9LCB0aGlzW3A4XSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHZhciBtOCA9IE01LnByb3RvdHlwZTsKICAgICAgICByZXR1cm4gbTgucGFyc2UgPSBmdW5jdGlvbih0MTApIHsKICAgICAgICAgIHRoaXMuJGQgPSAoZnVuY3Rpb24odDExKSB7CiAgICAgICAgICAgIHZhciBlMTIgPSB0MTEuZGF0ZSwgbjE0ID0gdDExLnV0YzsKICAgICAgICAgICAgaWYgKG51bGwgPT09IGUxMikgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZShOYU4pOwogICAgICAgICAgICBpZiAoYjYudShlMTIpKSByZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7CiAgICAgICAgICAgIGlmIChlMTIgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gbmV3IERhdGUoZTEyKTsKICAgICAgICAgICAgaWYgKCJzdHJpbmciID09IHR5cGVvZiBlMTIgJiYgIS9aJC9pLnRlc3QoZTEyKSkgewogICAgICAgICAgICAgIHZhciByMTIgPSBlMTIubWF0Y2goJDQpOwogICAgICAgICAgICAgIGlmIChyMTIpIHsKICAgICAgICAgICAgICAgIHZhciBpMTIgPSByMTJbMl0gLSAxIHx8IDAsIHMxMSA9IChyMTJbN10gfHwgIjAiKS5zdWJzdHJpbmcoMCwgMyk7CiAgICAgICAgICAgICAgICByZXR1cm4gbjE0ID8gbmV3IERhdGUoRGF0ZS5VVEMocjEyWzFdLCBpMTIsIHIxMlszXSB8fCAxLCByMTJbNF0gfHwgMCwgcjEyWzVdIHx8IDAsIHIxMls2XSB8fCAwLCBzMTEpKSA6IG5ldyBEYXRlKHIxMlsxXSwgaTEyLCByMTJbM10gfHwgMSwgcjEyWzRdIHx8IDAsIHIxMls1XSB8fCAwLCByMTJbNl0gfHwgMCwgczExKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGUxMik7CiAgICAgICAgICB9KSh0MTApLCB0aGlzLmluaXQoKTsKICAgICAgICB9LCBtOC5pbml0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgdDEwID0gdGhpcy4kZDsKICAgICAgICAgIHRoaXMuJHkgPSB0MTAuZ2V0RnVsbFllYXIoKSwgdGhpcy4kTSA9IHQxMC5nZXRNb250aCgpLCB0aGlzLiREID0gdDEwLmdldERhdGUoKSwgdGhpcy4kVyA9IHQxMC5nZXREYXkoKSwgdGhpcy4kSCA9IHQxMC5nZXRIb3VycygpLCB0aGlzLiRtID0gdDEwLmdldE1pbnV0ZXMoKSwgdGhpcy4kcyA9IHQxMC5nZXRTZWNvbmRzKCksIHRoaXMuJG1zID0gdDEwLmdldE1pbGxpc2Vjb25kcygpOwogICAgICAgIH0sIG04LiR1dGlscyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGI2OwogICAgICAgIH0sIG04LmlzVmFsaWQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiAhKHRoaXMuJGQudG9TdHJpbmcoKSA9PT0gbDYpOwogICAgICAgIH0sIG04LmlzU2FtZSA9IGZ1bmN0aW9uKHQxMCwgZTEyKSB7CiAgICAgICAgICB2YXIgbjE0ID0gTzQodDEwKTsKICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0T2YoZTEyKSA8PSBuMTQgJiYgbjE0IDw9IHRoaXMuZW5kT2YoZTEyKTsKICAgICAgICB9LCBtOC5pc0FmdGVyID0gZnVuY3Rpb24odDEwLCBlMTIpIHsKICAgICAgICAgIHJldHVybiBPNCh0MTApIDwgdGhpcy5zdGFydE9mKGUxMik7CiAgICAgICAgfSwgbTguaXNCZWZvcmUgPSBmdW5jdGlvbih0MTAsIGUxMikgewogICAgICAgICAgcmV0dXJuIHRoaXMuZW5kT2YoZTEyKSA8IE80KHQxMCk7CiAgICAgICAgfSwgbTguJGcgPSBmdW5jdGlvbih0MTAsIGUxMiwgbjE0KSB7CiAgICAgICAgICByZXR1cm4gYjYudSh0MTApID8gdGhpc1tlMTJdIDogdGhpcy5zZXQobjE0LCB0MTApOwogICAgICAgIH0sIG04LnVuaXggPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMudmFsdWVPZigpIC8gMWUzKTsKICAgICAgICB9LCBtOC52YWx1ZU9mID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4kZC5nZXRUaW1lKCk7CiAgICAgICAgfSwgbTguc3RhcnRPZiA9IGZ1bmN0aW9uKHQxMCwgZTEyKSB7CiAgICAgICAgICB2YXIgbjE0ID0gdGhpcywgcjEyID0gISFiNi51KGUxMikgfHwgZTEyLCBmOSA9IGI2LnAodDEwKSwgbDcgPSBmdW5jdGlvbih0MTEsIGUxMykgewogICAgICAgICAgICB2YXIgaTEyID0gYjYudyhuMTQuJHUgPyBEYXRlLlVUQyhuMTQuJHksIGUxMywgdDExKSA6IG5ldyBEYXRlKG4xNC4keSwgZTEzLCB0MTEpLCBuMTQpOwogICAgICAgICAgICByZXR1cm4gcjEyID8gaTEyIDogaTEyLmVuZE9mKGE1KTsKICAgICAgICAgIH0sICQ1ID0gZnVuY3Rpb24odDExLCBlMTMpIHsKICAgICAgICAgICAgcmV0dXJuIGI2LncobjE0LnRvRGF0ZSgpW3QxMV0uYXBwbHkobjE0LnRvRGF0ZSgicyIpLCAocjEyID8gWzAsIDAsIDAsIDBdIDogWzIzLCA1OSwgNTksIDk5OV0pLnNsaWNlKGUxMykpLCBuMTQpOwogICAgICAgICAgfSwgeTYgPSB0aGlzLiRXLCBNNiA9IHRoaXMuJE0sIG05ID0gdGhpcy4kRCwgdjcgPSAic2V0IiArICh0aGlzLiR1ID8gIlVUQyIgOiAiIik7CiAgICAgICAgICBzd2l0Y2ggKGY5KSB7CiAgICAgICAgICAgIGNhc2UgaDk6CiAgICAgICAgICAgICAgcmV0dXJuIHIxMiA/IGw3KDEsIDApIDogbDcoMzEsIDExKTsKICAgICAgICAgICAgY2FzZSBjMTE6CiAgICAgICAgICAgICAgcmV0dXJuIHIxMiA/IGw3KDEsIE02KSA6IGw3KDAsIE02ICsgMSk7CiAgICAgICAgICAgIGNhc2UgbzEzOgogICAgICAgICAgICAgIHZhciBnNiA9IHRoaXMuJGxvY2FsZSgpLndlZWtTdGFydCB8fCAwLCBENiA9ICh5NiA8IGc2ID8geTYgKyA3IDogeTYpIC0gZzY7CiAgICAgICAgICAgICAgcmV0dXJuIGw3KHIxMiA/IG05IC0gRDYgOiBtOSArICg2IC0gRDYpLCBNNik7CiAgICAgICAgICAgIGNhc2UgYTU6CiAgICAgICAgICAgIGNhc2UgZDY6CiAgICAgICAgICAgICAgcmV0dXJuICQ1KHY3ICsgIkhvdXJzIiwgMCk7CiAgICAgICAgICAgIGNhc2UgdTc6CiAgICAgICAgICAgICAgcmV0dXJuICQ1KHY3ICsgIk1pbnV0ZXMiLCAxKTsKICAgICAgICAgICAgY2FzZSBzMTA6CiAgICAgICAgICAgICAgcmV0dXJuICQ1KHY3ICsgIlNlY29uZHMiLCAyKTsKICAgICAgICAgICAgY2FzZSBpMTE6CiAgICAgICAgICAgICAgcmV0dXJuICQ1KHY3ICsgIk1pbGxpc2Vjb25kcyIsIDMpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb25lKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgbTguZW5kT2YgPSBmdW5jdGlvbih0MTApIHsKICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0T2YodDEwLCBmYWxzZSk7CiAgICAgICAgfSwgbTguJHNldCA9IGZ1bmN0aW9uKHQxMCwgZTEyKSB7CiAgICAgICAgICB2YXIgbjE0LCBvMTQgPSBiNi5wKHQxMCksIGY5ID0gInNldCIgKyAodGhpcy4kdSA/ICJVVEMiIDogIiIpLCBsNyA9IChuMTQgPSB7fSwgbjE0W2E1XSA9IGY5ICsgIkRhdGUiLCBuMTRbZDZdID0gZjkgKyAiRGF0ZSIsIG4xNFtjMTFdID0gZjkgKyAiTW9udGgiLCBuMTRbaDldID0gZjkgKyAiRnVsbFllYXIiLCBuMTRbdTddID0gZjkgKyAiSG91cnMiLCBuMTRbczEwXSA9IGY5ICsgIk1pbnV0ZXMiLCBuMTRbaTExXSA9IGY5ICsgIlNlY29uZHMiLCBuMTRbcjExXSA9IGY5ICsgIk1pbGxpc2Vjb25kcyIsIG4xNClbbzE0XSwgJDUgPSBvMTQgPT09IGE1ID8gdGhpcy4kRCArIChlMTIgLSB0aGlzLiRXKSA6IGUxMjsKICAgICAgICAgIGlmIChvMTQgPT09IGMxMSB8fCBvMTQgPT09IGg5KSB7CiAgICAgICAgICAgIHZhciB5NiA9IHRoaXMuY2xvbmUoKS5zZXQoZDYsIDEpOwogICAgICAgICAgICB5Ni4kZFtsN10oJDUpLCB5Ni5pbml0KCksIHRoaXMuJGQgPSB5Ni5zZXQoZDYsIE1hdGgubWluKHRoaXMuJEQsIHk2LmRheXNJbk1vbnRoKCkpKS4kZDsKICAgICAgICAgIH0gZWxzZSBsNyAmJiB0aGlzLiRkW2w3XSgkNSk7CiAgICAgICAgICByZXR1cm4gdGhpcy5pbml0KCksIHRoaXM7CiAgICAgICAgfSwgbTguc2V0ID0gZnVuY3Rpb24odDEwLCBlMTIpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuJHNldCh0MTAsIGUxMik7CiAgICAgICAgfSwgbTguZ2V0ID0gZnVuY3Rpb24odDEwKSB7CiAgICAgICAgICByZXR1cm4gdGhpc1tiNi5wKHQxMCldKCk7CiAgICAgICAgfSwgbTguYWRkID0gZnVuY3Rpb24ocjEyLCBmOSkgewogICAgICAgICAgdmFyIGQ3LCBsNyA9IHRoaXM7CiAgICAgICAgICByMTIgPSBOdW1iZXIocjEyKTsKICAgICAgICAgIHZhciAkNSA9IGI2LnAoZjkpLCB5NiA9IGZ1bmN0aW9uKHQxMCkgewogICAgICAgICAgICB2YXIgZTEyID0gTzQobDcpOwogICAgICAgICAgICByZXR1cm4gYjYudyhlMTIuZGF0ZShlMTIuZGF0ZSgpICsgTWF0aC5yb3VuZCh0MTAgKiByMTIpKSwgbDcpOwogICAgICAgICAgfTsKICAgICAgICAgIGlmICgkNSA9PT0gYzExKSByZXR1cm4gdGhpcy5zZXQoYzExLCB0aGlzLiRNICsgcjEyKTsKICAgICAgICAgIGlmICgkNSA9PT0gaDkpIHJldHVybiB0aGlzLnNldChoOSwgdGhpcy4keSArIHIxMik7CiAgICAgICAgICBpZiAoJDUgPT09IGE1KSByZXR1cm4geTYoMSk7CiAgICAgICAgICBpZiAoJDUgPT09IG8xMykgcmV0dXJuIHk2KDcpOwogICAgICAgICAgdmFyIE02ID0gKGQ3ID0ge30sIGQ3W3MxMF0gPSBlMTEsIGQ3W3U3XSA9IG4xMywgZDdbaTExXSA9IHQ5LCBkNylbJDVdIHx8IDEsIG05ID0gdGhpcy4kZC5nZXRUaW1lKCkgKyByMTIgKiBNNjsKICAgICAgICAgIHJldHVybiBiNi53KG05LCB0aGlzKTsKICAgICAgICB9LCBtOC5zdWJ0cmFjdCA9IGZ1bmN0aW9uKHQxMCwgZTEyKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5hZGQoLTEgKiB0MTAsIGUxMik7CiAgICAgICAgfSwgbTguZm9ybWF0ID0gZnVuY3Rpb24odDEwKSB7CiAgICAgICAgICB2YXIgZTEyID0gdGhpcywgbjE0ID0gdGhpcy4kbG9jYWxlKCk7CiAgICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSByZXR1cm4gbjE0LmludmFsaWREYXRlIHx8IGw2OwogICAgICAgICAgdmFyIHIxMiA9IHQxMCB8fCAiWVlZWS1NTS1ERFRISDptbTpzc1oiLCBpMTIgPSBiNi56KHRoaXMpLCBzMTEgPSB0aGlzLiRILCB1OCA9IHRoaXMuJG0sIGE2ID0gdGhpcy4kTSwgbzE0ID0gbjE0LndlZWtkYXlzLCBjMTIgPSBuMTQubW9udGhzLCBmOSA9IG4xNC5tZXJpZGllbSwgaDEwID0gZnVuY3Rpb24odDExLCBuMTUsIGkxMywgczEyKSB7CiAgICAgICAgICAgIHJldHVybiB0MTEgJiYgKHQxMVtuMTVdIHx8IHQxMShlMTIsIHIxMikpIHx8IGkxM1tuMTVdLnNsaWNlKDAsIHMxMik7CiAgICAgICAgICB9LCBkNyA9IGZ1bmN0aW9uKHQxMSkgewogICAgICAgICAgICByZXR1cm4gYjYucyhzMTEgJSAxMiB8fCAxMiwgdDExLCAiMCIpOwogICAgICAgICAgfSwgJDUgPSBmOSB8fCBmdW5jdGlvbih0MTEsIGUxMywgbjE1KSB7CiAgICAgICAgICAgIHZhciByMTMgPSB0MTEgPCAxMiA/ICJBTSIgOiAiUE0iOwogICAgICAgICAgICByZXR1cm4gbjE1ID8gcjEzLnRvTG93ZXJDYXNlKCkgOiByMTM7CiAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIHIxMi5yZXBsYWNlKHk1LCAoZnVuY3Rpb24odDExLCByMTMpIHsKICAgICAgICAgICAgcmV0dXJuIHIxMyB8fCAoZnVuY3Rpb24odDEyKSB7CiAgICAgICAgICAgICAgc3dpdGNoICh0MTIpIHsKICAgICAgICAgICAgICAgIGNhc2UgIllZIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhlMTIuJHkpLnNsaWNlKC0yKTsKICAgICAgICAgICAgICAgIGNhc2UgIllZWVkiOgogICAgICAgICAgICAgICAgICByZXR1cm4gYjYucyhlMTIuJHksIDQsICIwIik7CiAgICAgICAgICAgICAgICBjYXNlICJNIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGE2ICsgMTsKICAgICAgICAgICAgICAgIGNhc2UgIk1NIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGI2LnMoYTYgKyAxLCAyLCAiMCIpOwogICAgICAgICAgICAgICAgY2FzZSAiTU1NIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGgxMChuMTQubW9udGhzU2hvcnQsIGE2LCBjMTIsIDMpOwogICAgICAgICAgICAgICAgY2FzZSAiTU1NTSI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBoMTAoYzEyLCBhNik7CiAgICAgICAgICAgICAgICBjYXNlICJEIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGUxMi4kRDsKICAgICAgICAgICAgICAgIGNhc2UgIkREIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGI2LnMoZTEyLiRELCAyLCAiMCIpOwogICAgICAgICAgICAgICAgY2FzZSAiZCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZTEyLiRXKTsKICAgICAgICAgICAgICAgIGNhc2UgImRkIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGgxMChuMTQud2Vla2RheXNNaW4sIGUxMi4kVywgbzE0LCAyKTsKICAgICAgICAgICAgICAgIGNhc2UgImRkZCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBoMTAobjE0LndlZWtkYXlzU2hvcnQsIGUxMi4kVywgbzE0LCAzKTsKICAgICAgICAgICAgICAgIGNhc2UgImRkZGQiOgogICAgICAgICAgICAgICAgICByZXR1cm4gbzE0W2UxMi4kV107CiAgICAgICAgICAgICAgICBjYXNlICJIIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhzMTEpOwogICAgICAgICAgICAgICAgY2FzZSAiSEgiOgogICAgICAgICAgICAgICAgICByZXR1cm4gYjYucyhzMTEsIDIsICIwIik7CiAgICAgICAgICAgICAgICBjYXNlICJoIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ3KDEpOwogICAgICAgICAgICAgICAgY2FzZSAiaGgiOgogICAgICAgICAgICAgICAgICByZXR1cm4gZDcoMik7CiAgICAgICAgICAgICAgICBjYXNlICJhIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuICQ1KHMxMSwgdTgsIHRydWUpOwogICAgICAgICAgICAgICAgY2FzZSAiQSI6CiAgICAgICAgICAgICAgICAgIHJldHVybiAkNShzMTEsIHU4LCBmYWxzZSk7CiAgICAgICAgICAgICAgICBjYXNlICJtIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh1OCk7CiAgICAgICAgICAgICAgICBjYXNlICJtbSI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBiNi5zKHU4LCAyLCAiMCIpOwogICAgICAgICAgICAgICAgY2FzZSAicyI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZTEyLiRzKTsKICAgICAgICAgICAgICAgIGNhc2UgInNzIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGI2LnMoZTEyLiRzLCAyLCAiMCIpOwogICAgICAgICAgICAgICAgY2FzZSAiU1NTIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGI2LnMoZTEyLiRtcywgMywgIjAiKTsKICAgICAgICAgICAgICAgIGNhc2UgIloiOgogICAgICAgICAgICAgICAgICByZXR1cm4gaTEyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfSkodDExKSB8fCBpMTIucmVwbGFjZSgiOiIsICIiKTsKICAgICAgICAgIH0pKTsKICAgICAgICB9LCBtOC51dGNPZmZzZXQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiAxNSAqIC1NYXRoLnJvdW5kKHRoaXMuJGQuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDE1KTsKICAgICAgICB9LCBtOC5kaWZmID0gZnVuY3Rpb24ocjEyLCBkNywgbDcpIHsKICAgICAgICAgIHZhciAkNSwgeTYgPSB0aGlzLCBNNiA9IGI2LnAoZDcpLCBtOSA9IE80KHIxMiksIHY3ID0gKG05LnV0Y09mZnNldCgpIC0gdGhpcy51dGNPZmZzZXQoKSkgKiBlMTEsIGc2ID0gdGhpcyAtIG05LCBENiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gYjYubSh5NiwgbTkpOwogICAgICAgICAgfTsKICAgICAgICAgIHN3aXRjaCAoTTYpIHsKICAgICAgICAgICAgY2FzZSBoOToKICAgICAgICAgICAgICAkNSA9IEQ2KCkgLyAxMjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBjMTE6CiAgICAgICAgICAgICAgJDUgPSBENigpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIGY4OgogICAgICAgICAgICAgICQ1ID0gRDYoKSAvIDM7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgbzEzOgogICAgICAgICAgICAgICQ1ID0gKGc2IC0gdjcpIC8gNjA0OGU1OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIGE1OgogICAgICAgICAgICAgICQ1ID0gKGc2IC0gdjcpIC8gODY0ZTU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdTc6CiAgICAgICAgICAgICAgJDUgPSBnNiAvIG4xMzsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBzMTA6CiAgICAgICAgICAgICAgJDUgPSBnNiAvIGUxMTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBpMTE6CiAgICAgICAgICAgICAgJDUgPSBnNiAvIHQ5OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICQ1ID0gZzY7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbDcgPyAkNSA6IGI2LmEoJDUpOwogICAgICAgIH0sIG04LmRheXNJbk1vbnRoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5lbmRPZihjMTEpLiREOwogICAgICAgIH0sIG04LiRsb2NhbGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBENVt0aGlzLiRMXTsKICAgICAgICB9LCBtOC5sb2NhbGUgPSBmdW5jdGlvbih0MTAsIGUxMikgewogICAgICAgICAgaWYgKCF0MTApIHJldHVybiB0aGlzLiRMOwogICAgICAgICAgdmFyIG4xNCA9IHRoaXMuY2xvbmUoKSwgcjEyID0gdzQodDEwLCBlMTIsIHRydWUpOwogICAgICAgICAgcmV0dXJuIHIxMiAmJiAobjE0LiRMID0gcjEyKSwgbjE0OwogICAgICAgIH0sIG04LmNsb25lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gYjYudyh0aGlzLiRkLCB0aGlzKTsKICAgICAgICB9LCBtOC50b0RhdGUgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSk7CiAgICAgICAgfSwgbTgudG9KU09OID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLnRvSVNPU3RyaW5nKCkgOiBudWxsOwogICAgICAgIH0sIG04LnRvSVNPU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4kZC50b0lTT1N0cmluZygpOwogICAgICAgIH0sIG04LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4kZC50b1VUQ1N0cmluZygpOwogICAgICAgIH0sIE01OwogICAgICB9KSgpLCBrNSA9IF81LnByb3RvdHlwZTsKICAgICAgcmV0dXJuIE80LnByb3RvdHlwZSA9IGs1LCBbWyIkbXMiLCByMTFdLCBbIiRzIiwgaTExXSwgWyIkbSIsIHMxMF0sIFsiJEgiLCB1N10sIFsiJFciLCBhNV0sIFsiJE0iLCBjMTFdLCBbIiR5IiwgaDldLCBbIiREIiwgZDZdXS5mb3JFYWNoKChmdW5jdGlvbih0MTApIHsKICAgICAgICBrNVt0MTBbMV1dID0gZnVuY3Rpb24oZTEyKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4kZyhlMTIsIHQxMFswXSwgdDEwWzFdKTsKICAgICAgICB9OwogICAgICB9KSksIE80LmV4dGVuZCA9IGZ1bmN0aW9uKHQxMCwgZTEyKSB7CiAgICAgICAgcmV0dXJuIHQxMC4kaSB8fCAodDEwKGUxMiwgXzUsIE80KSwgdDEwLiRpID0gdHJ1ZSksIE80OwogICAgICB9LCBPNC5sb2NhbGUgPSB3NCwgTzQuaXNEYXlqcyA9IFM1LCBPNC51bml4ID0gZnVuY3Rpb24odDEwKSB7CiAgICAgICAgcmV0dXJuIE80KDFlMyAqIHQxMCk7CiAgICAgIH0sIE80LmVuID0gRDVbZzVdLCBPNC5McyA9IEQ1LCBPNC5wID0ge30sIE80OwogICAgfSkpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4xOS9ub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL2lzVG9kYXkuanMKdmFyIHJlcXVpcmVfaXNUb2RheSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4xOS9ub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL2lzVG9kYXkuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgIShmdW5jdGlvbihlMTEsIG8xMykgewogICAgICAib2JqZWN0IiA9PSB0eXBlb2YgZXhwb3J0cyAmJiAidW5kZWZpbmVkIiAhPSB0eXBlb2YgbW9kdWxlID8gbW9kdWxlLmV4cG9ydHMgPSBvMTMoKSA6ICJmdW5jdGlvbiIgPT0gdHlwZW9mIGRlZmluZSAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKG8xMykgOiAoZTExID0gInVuZGVmaW5lZCIgIT0gdHlwZW9mIGdsb2JhbFRoaXMgPyBnbG9iYWxUaGlzIDogZTExIHx8IHNlbGYpLmRheWpzX3BsdWdpbl9pc1RvZGF5ID0gbzEzKCk7CiAgICB9KShleHBvcnRzLCAoZnVuY3Rpb24oKSB7CiAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUxMSwgbzEzLCB0OSkgewogICAgICAgIG8xMy5wcm90b3R5cGUuaXNUb2RheSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGUxMiA9ICJZWVlZLU1NLUREIiwgbzE0ID0gdDkoKTsKICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdChlMTIpID09PSBvMTQuZm9ybWF0KGUxMik7CiAgICAgICAgfTsKICAgICAgfTsKICAgIH0pKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3BhcnNlLW1zQDQuMC4wL25vZGVfbW9kdWxlcy9wYXJzZS1tcy9pbmRleC5qcwpmdW5jdGlvbiBwYXJzZU51bWJlcihtaWxsaXNlY29uZHMyKSB7CiAgcmV0dXJuIHsKICAgIGRheXM6IE1hdGgudHJ1bmMobWlsbGlzZWNvbmRzMiAvIDg2NGU1KSwKICAgIGhvdXJzOiBNYXRoLnRydW5jKG1pbGxpc2Vjb25kczIgLyAzNmU1ICUgMjQpLAogICAgbWludXRlczogTWF0aC50cnVuYyhtaWxsaXNlY29uZHMyIC8gNmU0ICUgNjApLAogICAgc2Vjb25kczogTWF0aC50cnVuYyhtaWxsaXNlY29uZHMyIC8gMWUzICUgNjApLAogICAgbWlsbGlzZWNvbmRzOiBNYXRoLnRydW5jKG1pbGxpc2Vjb25kczIgJSAxZTMpLAogICAgbWljcm9zZWNvbmRzOiBNYXRoLnRydW5jKHRvWmVyb0lmSW5maW5pdHkobWlsbGlzZWNvbmRzMiAqIDFlMykgJSAxZTMpLAogICAgbmFub3NlY29uZHM6IE1hdGgudHJ1bmModG9aZXJvSWZJbmZpbml0eShtaWxsaXNlY29uZHMyICogMWU2KSAlIDFlMykKICB9Owp9CmZ1bmN0aW9uIHBhcnNlQmlnaW50KG1pbGxpc2Vjb25kczIpIHsKICByZXR1cm4gewogICAgZGF5czogbWlsbGlzZWNvbmRzMiAvIDg2NDAwMDAwbiwKICAgIGhvdXJzOiBtaWxsaXNlY29uZHMyIC8gMzYwMDAwMG4gJSAyNG4sCiAgICBtaW51dGVzOiBtaWxsaXNlY29uZHMyIC8gNjAwMDBuICUgNjBuLAogICAgc2Vjb25kczogbWlsbGlzZWNvbmRzMiAvIDEwMDBuICUgNjBuLAogICAgbWlsbGlzZWNvbmRzOiBtaWxsaXNlY29uZHMyICUgMTAwMG4sCiAgICBtaWNyb3NlY29uZHM6IDBuLAogICAgbmFub3NlY29uZHM6IDBuCiAgfTsKfQpmdW5jdGlvbiBwYXJzZU1pbGxpc2Vjb25kcyhtaWxsaXNlY29uZHMyKSB7CiAgc3dpdGNoICh0eXBlb2YgbWlsbGlzZWNvbmRzMikgewogICAgY2FzZSAibnVtYmVyIjogewogICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKG1pbGxpc2Vjb25kczIpKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlTnVtYmVyKG1pbGxpc2Vjb25kczIpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgfQogICAgY2FzZSAiYmlnaW50IjogewogICAgICByZXR1cm4gcGFyc2VCaWdpbnQobWlsbGlzZWNvbmRzMik7CiAgICB9CiAgfQogIHRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZmluaXRlIG51bWJlciBvciBiaWdpbnQiKTsKfQp2YXIgdG9aZXJvSWZJbmZpbml0eTsKdmFyIGluaXRfcGFyc2VfbXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9wYXJzZS1tc0A0LjAuMC9ub2RlX21vZHVsZXMvcGFyc2UtbXMvaW5kZXguanMiKCkgewogICAgdG9aZXJvSWZJbmZpbml0eSA9ICh2YWx1ZTIpID0+IE51bWJlci5pc0Zpbml0ZSh2YWx1ZTIpID8gdmFsdWUyIDogMDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3ByZXR0eS1tc0A5LjMuMC9ub2RlX21vZHVsZXMvcHJldHR5LW1zL2luZGV4LmpzCmZ1bmN0aW9uIHByZXR0eU1pbGxpc2Vjb25kcyhtaWxsaXNlY29uZHMyLCBvcHRpb25zKSB7CiAgY29uc3QgaXNCaWdJbnQgPSB0eXBlb2YgbWlsbGlzZWNvbmRzMiA9PT0gImJpZ2ludCI7CiAgaWYgKCFpc0JpZ0ludCAmJiAhTnVtYmVyLmlzRmluaXRlKG1pbGxpc2Vjb25kczIpKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBhIGZpbml0ZSBudW1iZXIgb3IgYmlnaW50Iik7CiAgfQogIG9wdGlvbnMgPSB7IC4uLm9wdGlvbnMgfTsKICBjb25zdCBzaWduID0gbWlsbGlzZWNvbmRzMiA8IDAgPyAiLSIgOiAiIjsKICBtaWxsaXNlY29uZHMyID0gbWlsbGlzZWNvbmRzMiA8IDAgPyAtbWlsbGlzZWNvbmRzMiA6IG1pbGxpc2Vjb25kczI7CiAgaWYgKG9wdGlvbnMuY29sb25Ob3RhdGlvbikgewogICAgb3B0aW9ucy5jb21wYWN0ID0gZmFsc2U7CiAgICBvcHRpb25zLmZvcm1hdFN1Yk1pbGxpc2Vjb25kcyA9IGZhbHNlOwogICAgb3B0aW9ucy5zZXBhcmF0ZU1pbGxpc2Vjb25kcyA9IGZhbHNlOwogICAgb3B0aW9ucy52ZXJib3NlID0gZmFsc2U7CiAgfQogIGlmIChvcHRpb25zLmNvbXBhY3QpIHsKICAgIG9wdGlvbnMudW5pdENvdW50ID0gMTsKICAgIG9wdGlvbnMuc2Vjb25kc0RlY2ltYWxEaWdpdHMgPSAwOwogICAgb3B0aW9ucy5taWxsaXNlY29uZHNEZWNpbWFsRGlnaXRzID0gMDsKICB9CiAgbGV0IHJlc3VsdCA9IFtdOwogIGNvbnN0IGZsb29yRGVjaW1hbHMgPSAodmFsdWUyLCBkZWNpbWFsRGlnaXRzKSA9PiB7CiAgICBjb25zdCBmbG9vcmVkSW50ZXJpbVZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZTIgKiAxMCAqKiBkZWNpbWFsRGlnaXRzICsgU0VDT05EX1JPVU5ESU5HX0VQU0lMT04pOwogICAgY29uc3QgZmxvb3JlZFZhbHVlID0gTWF0aC5yb3VuZChmbG9vcmVkSW50ZXJpbVZhbHVlKSAvIDEwICoqIGRlY2ltYWxEaWdpdHM7CiAgICByZXR1cm4gZmxvb3JlZFZhbHVlLnRvRml4ZWQoZGVjaW1hbERpZ2l0cyk7CiAgfTsKICBjb25zdCBhZGQzID0gKHZhbHVlMiwgbG9uZywgc2hvcnQsIHZhbHVlU3RyaW5nKSA9PiB7CiAgICBpZiAoKHJlc3VsdC5sZW5ndGggPT09IDAgfHwgIW9wdGlvbnMuY29sb25Ob3RhdGlvbikgJiYgaXNaZXJvKHZhbHVlMikgJiYgIShvcHRpb25zLmNvbG9uTm90YXRpb24gJiYgc2hvcnQgPT09ICJtIikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdmFsdWVTdHJpbmcgPz89IFN0cmluZyh2YWx1ZTIpOwogICAgaWYgKG9wdGlvbnMuY29sb25Ob3RhdGlvbikgewogICAgICBjb25zdCB3aG9sZURpZ2l0cyA9IHZhbHVlU3RyaW5nLmluY2x1ZGVzKCIuIikgPyB2YWx1ZVN0cmluZy5zcGxpdCgiLiIpWzBdLmxlbmd0aCA6IHZhbHVlU3RyaW5nLmxlbmd0aDsKICAgICAgY29uc3QgbWluTGVuZ3RoID0gcmVzdWx0Lmxlbmd0aCA+IDAgPyAyIDogMTsKICAgICAgdmFsdWVTdHJpbmcgPSAiMCIucmVwZWF0KE1hdGgubWF4KDAsIG1pbkxlbmd0aCAtIHdob2xlRGlnaXRzKSkgKyB2YWx1ZVN0cmluZzsKICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlU3RyaW5nICs9IG9wdGlvbnMudmVyYm9zZSA/ICIgIiArIHBsdXJhbGl6ZShsb25nLCB2YWx1ZTIpIDogc2hvcnQ7CiAgICB9CiAgICByZXN1bHQucHVzaCh2YWx1ZVN0cmluZyk7CiAgfTsKICBjb25zdCBwYXJzZWQgPSBwYXJzZU1pbGxpc2Vjb25kcyhtaWxsaXNlY29uZHMyKTsKICBjb25zdCBkYXlzMiA9IEJpZ0ludChwYXJzZWQuZGF5cyk7CiAgaWYgKG9wdGlvbnMuaGlkZVllYXJBbmREYXlzKSB7CiAgICBhZGQzKEJpZ0ludChkYXlzMikgKiAyNG4gKyBCaWdJbnQocGFyc2VkLmhvdXJzKSwgImhvdXIiLCAiaCIpOwogIH0gZWxzZSB7CiAgICBpZiAob3B0aW9ucy5oaWRlWWVhcikgewogICAgICBhZGQzKGRheXMyLCAiZGF5IiwgImQiKTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZDMoZGF5czIgLyAzNjVuLCAieWVhciIsICJ5Iik7CiAgICAgIGFkZDMoZGF5czIgJSAzNjVuLCAiZGF5IiwgImQiKTsKICAgIH0KICAgIGFkZDMoTnVtYmVyKHBhcnNlZC5ob3VycyksICJob3VyIiwgImgiKTsKICB9CiAgYWRkMyhOdW1iZXIocGFyc2VkLm1pbnV0ZXMpLCAibWludXRlIiwgIm0iKTsKICBpZiAoIW9wdGlvbnMuaGlkZVNlY29uZHMpIHsKICAgIGlmIChvcHRpb25zLnNlcGFyYXRlTWlsbGlzZWNvbmRzIHx8IG9wdGlvbnMuZm9ybWF0U3ViTWlsbGlzZWNvbmRzIHx8ICFvcHRpb25zLmNvbG9uTm90YXRpb24gJiYgbWlsbGlzZWNvbmRzMiA8IDFlMyAmJiAhb3B0aW9ucy5zdWJTZWNvbmRzQXNEZWNpbWFscykgewogICAgICBjb25zdCBzZWNvbmRzID0gTnVtYmVyKHBhcnNlZC5zZWNvbmRzKTsKICAgICAgY29uc3QgbWlsbGlzZWNvbmRzMyA9IE51bWJlcihwYXJzZWQubWlsbGlzZWNvbmRzKTsKICAgICAgY29uc3QgbWljcm9zZWNvbmRzID0gTnVtYmVyKHBhcnNlZC5taWNyb3NlY29uZHMpOwogICAgICBjb25zdCBuYW5vc2Vjb25kcyA9IE51bWJlcihwYXJzZWQubmFub3NlY29uZHMpOwogICAgICBhZGQzKHNlY29uZHMsICJzZWNvbmQiLCAicyIpOwogICAgICBpZiAob3B0aW9ucy5mb3JtYXRTdWJNaWxsaXNlY29uZHMpIHsKICAgICAgICBhZGQzKG1pbGxpc2Vjb25kczMsICJtaWxsaXNlY29uZCIsICJtcyIpOwogICAgICAgIGFkZDMobWljcm9zZWNvbmRzLCAibWljcm9zZWNvbmQiLCAiXHhCNXMiKTsKICAgICAgICBhZGQzKG5hbm9zZWNvbmRzLCAibmFub3NlY29uZCIsICJucyIpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kc0FuZEJlbG93ID0gbWlsbGlzZWNvbmRzMyArIG1pY3Jvc2Vjb25kcyAvIDFlMyArIG5hbm9zZWNvbmRzIC8gMWU2OwogICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kc0RlY2ltYWxEaWdpdHMgPSB0eXBlb2Ygb3B0aW9ucy5taWxsaXNlY29uZHNEZWNpbWFsRGlnaXRzID09PSAibnVtYmVyIiA/IG9wdGlvbnMubWlsbGlzZWNvbmRzRGVjaW1hbERpZ2l0cyA6IDA7CiAgICAgICAgY29uc3Qgcm91bmRlZE1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kc0FuZEJlbG93ID49IDEgPyBNYXRoLnJvdW5kKG1pbGxpc2Vjb25kc0FuZEJlbG93KSA6IE1hdGguY2VpbChtaWxsaXNlY29uZHNBbmRCZWxvdyk7CiAgICAgICAgY29uc3QgbWlsbGlzZWNvbmRzU3RyaW5nID0gbWlsbGlzZWNvbmRzRGVjaW1hbERpZ2l0cyA/IG1pbGxpc2Vjb25kc0FuZEJlbG93LnRvRml4ZWQobWlsbGlzZWNvbmRzRGVjaW1hbERpZ2l0cykgOiByb3VuZGVkTWlsbGlzZWNvbmRzOwogICAgICAgIGFkZDMoCiAgICAgICAgICBOdW1iZXIucGFyc2VGbG9hdChtaWxsaXNlY29uZHNTdHJpbmcpLAogICAgICAgICAgIm1pbGxpc2Vjb25kIiwKICAgICAgICAgICJtcyIsCiAgICAgICAgICBtaWxsaXNlY29uZHNTdHJpbmcKICAgICAgICApOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCBzZWNvbmRzID0gKGlzQmlnSW50ID8gTnVtYmVyKG1pbGxpc2Vjb25kczIgJSBPTkVfREFZX0lOX01JTExJU0VDT05EUykgOiBtaWxsaXNlY29uZHMyKSAvIDFlMyAlIDYwOwogICAgICBjb25zdCBzZWNvbmRzRGVjaW1hbERpZ2l0cyA9IHR5cGVvZiBvcHRpb25zLnNlY29uZHNEZWNpbWFsRGlnaXRzID09PSAibnVtYmVyIiA/IG9wdGlvbnMuc2Vjb25kc0RlY2ltYWxEaWdpdHMgOiAxOwogICAgICBjb25zdCBzZWNvbmRzRml4ZWQgPSBmbG9vckRlY2ltYWxzKHNlY29uZHMsIHNlY29uZHNEZWNpbWFsRGlnaXRzKTsKICAgICAgY29uc3Qgc2Vjb25kc1N0cmluZyA9IG9wdGlvbnMua2VlcERlY2ltYWxzT25XaG9sZVNlY29uZHMgPyBzZWNvbmRzRml4ZWQgOiBzZWNvbmRzRml4ZWQucmVwbGFjZSgvXC4wKyQvLCAiIik7CiAgICAgIGFkZDMoTnVtYmVyLnBhcnNlRmxvYXQoc2Vjb25kc1N0cmluZyksICJzZWNvbmQiLCAicyIsIHNlY29uZHNTdHJpbmcpOwogICAgfQogIH0KICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIHNpZ24gKyAiMCIgKyAob3B0aW9ucy52ZXJib3NlID8gIiBtaWxsaXNlY29uZHMiIDogIm1zIik7CiAgfQogIGNvbnN0IHNlcGFyYXRvciA9IG9wdGlvbnMuY29sb25Ob3RhdGlvbiA/ICI6IiA6ICIgIjsKICBpZiAodHlwZW9mIG9wdGlvbnMudW5pdENvdW50ID09PSAibnVtYmVyIikgewogICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIE1hdGgubWF4KG9wdGlvbnMudW5pdENvdW50LCAxKSk7CiAgfQogIHJldHVybiBzaWduICsgcmVzdWx0LmpvaW4oc2VwYXJhdG9yKTsKfQp2YXIgaXNaZXJvLCBwbHVyYWxpemUsIFNFQ09ORF9ST1VORElOR19FUFNJTE9OLCBPTkVfREFZX0lOX01JTExJU0VDT05EUzsKdmFyIGluaXRfcHJldHR5X21zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LW1zQDkuMy4wL25vZGVfbW9kdWxlcy9wcmV0dHktbXMvaW5kZXguanMiKCkgewogICAgaW5pdF9wYXJzZV9tcygpOwogICAgaXNaZXJvID0gKHZhbHVlMikgPT4gdmFsdWUyID09PSAwIHx8IHZhbHVlMiA9PT0gMG47CiAgICBwbHVyYWxpemUgPSAod29yZCwgY291bnQyKSA9PiBjb3VudDIgPT09IDEgfHwgY291bnQyID09PSAxbiA/IHdvcmQgOiBgJHt3b3JkfXNgOwogICAgU0VDT05EX1JPVU5ESU5HX0VQU0lMT04gPSAxZS03OwogICAgT05FX0RBWV9JTl9NSUxMSVNFQ09ORFMgPSAyNG4gKiA2MG4gKiA2MG4gKiAxMDAwbjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjEuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLnBsdWdpbnMuanMKdmFyIGltcG9ydF9kYXlqcywgaW1wb3J0X2lzVG9kYXk7CnZhciBpbml0X3NtYXJ0dGltZV9wbHVnaW5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMS4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHM3KCk7CiAgICBpbml0X2Rpc3RfdHMzKCk7CiAgICBpbml0X2Rpc3RfdHMoKTsKICAgIGluaXRfY3JvbmVyKCk7CiAgICBpbml0X2RhdGVfZm5zKCk7CiAgICBpbXBvcnRfZGF5anMgPSBfX3RvRVNNKHJlcXVpcmVfZGF5anNfbWluKCksIDEpOwogICAgaW1wb3J0X2lzVG9kYXkgPSBfX3RvRVNNKHJlcXVpcmVfaXNUb2RheSgpLCAxKTsKICAgIGluaXRfcHJldHR5X21zKCk7CiAgICBpbXBvcnRfZGF5anMuZGVmYXVsdC5leHRlbmQoaW1wb3J0X2lzVG9kYXkuZGVmYXVsdCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4xLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLmNyb25wYXJzZXIuanMKdmFyIENyb25QYXJzZXI7CnZhciBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX2Nyb25wYXJzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4xLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLmNyb25wYXJzZXIuanMiKCkgewogICAgaW5pdF9zbWFydHRpbWVfcGx1Z2lucygpOwogICAgQ3JvblBhcnNlciA9IGNsYXNzIHsKICAgICAgZ2V0IGNyb25BcnJheSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5jcm9uRXhwcmVzc2lvbi5zcGxpdCgiICIpOwogICAgICB9CiAgICAgIGNvbnN0cnVjdG9yKGNyb25FeHByZXNzaW9uQXJnKSB7CiAgICAgICAgdGhpcy5jcm9uRXhwcmVzc2lvbiA9IGNyb25FeHByZXNzaW9uQXJnOwogICAgICAgIGlmICh0aGlzLmNyb25BcnJheS5sZW5ndGggPCA2KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNyb25QYXJzZXIgbmVlZHMgc2Vjb25kIGxldmVsIGFjY3VyYWN5Iik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGdldE5leHRQYXJ0TWF0Y2goY3JvblBhcnQsIHN0YXJ0VmFsdWUsIG1vZHVsb0FyZykgewogICAgICAgIGlmIChjcm9uUGFydCA9PT0gIioiKSB7CiAgICAgICAgICByZXR1cm4gc3RhcnRWYWx1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGNyb25QYXJ0LmluY2x1ZGVzKCIvIikpIHsKICAgICAgICAgIGNvbnN0IGV2ZXJ5MyA9IHBhcnNlSW50KGNyb25QYXJ0LnNwbGl0KCIvIilbMV0sIDEwKTsKICAgICAgICAgIGNvbnN0IGZpbmRFdmVuTWF0Y2ggPSAocmVjdXJzaW9uU3RhcnRBcmcpID0+IHsKICAgICAgICAgICAgaWYgKHJlY3Vyc2lvblN0YXJ0QXJnICUgZXZlcnkzID09PSAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHJlY3Vyc2lvblN0YXJ0QXJnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJldHVybiBmaW5kRXZlbk1hdGNoKHJlY3Vyc2lvblN0YXJ0QXJnICsgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICByZXR1cm4gZmluZEV2ZW5NYXRjaChzdGFydFZhbHVlKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBhcnNlSW50KGNyb25QYXJ0LCAxMCkgfHwgY3JvblBhcnQgPT09ICIwIikgewogICAgICAgICAgY29uc3QgbWF0Y2gyID0gcGFyc2VJbnQoY3JvblBhcnQsIDEwKTsKICAgICAgICAgIHJldHVybiBtYXRjaDI7CiAgICAgICAgfQogICAgICB9CiAgICAgIG1zVG9OZXh0KCkgewogICAgICAgIGNvbnN0IGNyb25BcnJheSA9IHRoaXMuY3JvbkFycmF5OwogICAgICAgIGNvbnN0IHNlY29uZEV4cHJlc3Npb24gPSBjcm9uQXJyYXlbMF07CiAgICAgICAgY29uc3QgbWludXRlRXhwcmVzc2lvbiA9IGNyb25BcnJheVsxXTsKICAgICAgICBjb25zdCBob3VyRXhwcmVzc2lvbiA9IGNyb25BcnJheVsyXTsKICAgICAgICBjb25zdCBkYXlFeHByZXNzaW9uID0gY3JvbkFycmF5WzNdOwogICAgICAgIGNvbnN0IG1vbnRoRXhwcmVzc2lvbiA9IGNyb25BcnJheVs0XTsKICAgICAgICBjb25zdCB5ZWFyRXhwcmVzc2lvbiA9IGNyb25BcnJheVs1XTsKICAgICAgICBsZXQgY3VycmVudERhdGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTsKICAgICAgICBsZXQgY3VycmVudFNlY29uZCA9IGN1cnJlbnREYXRlLmdldFNlY29uZHMoKSArIDE7CiAgICAgICAgbGV0IGN1cnJlbnRNaW51dGUgPSBjdXJyZW50RGF0ZS5nZXRNaW51dGVzKCk7CiAgICAgICAgbGV0IGN1cnJlbnRIb3VyID0gY3VycmVudERhdGUuZ2V0SG91cnMoKTsKICAgICAgICBsZXQgY3VycmVudERheSA9IGN1cnJlbnREYXRlLmdldERhdGUoKTsKICAgICAgICBsZXQgY3VycmVudE1vbnRoID0gY3VycmVudERhdGUuZ2V0TW9udGgoKTsKICAgICAgICBsZXQgY3VycmVudFllYXIgPSBjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpOwogICAgICAgIGNvbnN0IHRhcmdldFNlY29uZCA9IHRoaXMuZ2V0TmV4dFBhcnRNYXRjaChzZWNvbmRFeHByZXNzaW9uLCBjdXJyZW50U2Vjb25kLCA1OSk7CiAgICAgICAgaWYgKHRhcmdldFNlY29uZCA8IGN1cnJlbnRTZWNvbmQpIHsKICAgICAgICAgIGN1cnJlbnRNaW51dGUgPSAoY3VycmVudE1pbnV0ZSArIDEpICUgNTk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHRhcmdldE1pbnV0ZSA9IHRoaXMuZ2V0TmV4dFBhcnRNYXRjaChtaW51dGVFeHByZXNzaW9uLCBjdXJyZW50TWludXRlLCA1OSk7CiAgICAgICAgaWYgKHRhcmdldE1pbnV0ZSA8IGN1cnJlbnRNaW51dGUpIHsKICAgICAgICAgIGN1cnJlbnRIb3VyID0gKGN1cnJlbnRIb3VyICsgMSkgJSAyMzsKICAgICAgICB9CiAgICAgICAgY29uc3QgdGFyZ2V0SG91ciA9IHRoaXMuZ2V0TmV4dFBhcnRNYXRjaChob3VyRXhwcmVzc2lvbiwgY3VycmVudEhvdXIsIDIzKTsKICAgICAgICBpZiAodGFyZ2V0SG91ciA8IGN1cnJlbnRIb3VyKSB7CiAgICAgICAgICBjdXJyZW50RGF5ID0gKGN1cnJlbnREYXkgKyAxKSAlIDMwOwogICAgICAgIH0KICAgICAgICBjb25zdCB0YXJnZXREYXkgPSBjdXJyZW50RGF5OwogICAgICAgIGlmICh0YXJnZXREYXkgPCBjdXJyZW50RGF5KSB7CiAgICAgICAgICBjdXJyZW50TW9udGggPSAoY3VycmVudE1vbnRoICsgMSkgJSAxMTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdGFyZ2V0TW9udGggPSBjdXJyZW50TW9udGg7CiAgICAgICAgaWYgKHRhcmdldE1vbnRoIDwgY3VycmVudE1vbnRoKSB7CiAgICAgICAgICBjdXJyZW50WWVhciA9IGN1cnJlbnRZZWFyICsgMTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdGFyZ2V0WWVhciA9IGN1cnJlbnRZZWFyOwogICAgICAgIGNvbnN0IHRhcmdldERhdGUgPSBuZXcgRGF0ZSh0YXJnZXRZZWFyLCB0YXJnZXRNb250aCwgdGFyZ2V0RGF5LCB0YXJnZXRIb3VyLCB0YXJnZXRNaW51dGUsIHRhcmdldFNlY29uZCk7CiAgICAgICAgY29uc3QgdGFyZ2V0VGltZSA9IHRhcmdldERhdGUuZ2V0VGltZSgpOwogICAgICAgIHJldHVybiB0YXJnZXRUaW1lIC0gRGF0ZS5ub3coKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjEuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuY3JvbmpvYi5qcwp2YXIgQ3JvbkpvYjsKdmFyIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfY3JvbmpvYiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjEuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuY3JvbmpvYi5qcyIoKSB7CiAgICBpbml0X3NtYXJ0dGltZV9wbHVnaW5zKCk7CiAgICBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX2Nyb25tYW5hZ2VyKCk7CiAgICBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX2Nyb25wYXJzZXIoKTsKICAgIENyb25Kb2IgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKGNyb25NYW5hZ2VyLCBjcm9uRXhwcmVzc2lvbkFyZywgam9iRnVuY3Rpb24pIHsKICAgICAgICB0aGlzLnN0YXR1cyA9ICJpbml0aWFsIjsKICAgICAgICB0aGlzLm5leHRFeGVjdXRpb25Vbml4ID0gMDsKICAgICAgICB0aGlzLmNyb25FeHByZXNzaW9uID0gY3JvbkV4cHJlc3Npb25Bcmc7CiAgICAgICAgdGhpcy5qb2JGdW5jdGlvbiA9IGpvYkZ1bmN0aW9uOwogICAgICAgIHRoaXMuY3JvblBhcnNlciA9IG5ldyBjcm9uZXJfZXhwb3J0cy5Dcm9uKGNyb25FeHByZXNzaW9uQXJnKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogY2hlY2tzIHdldGhlciB0aGUgY3JvbmpvYiBuZWVkcyB0byBiZSBleGVjdXRlZAogICAgICAgKi8KICAgICAgY2hlY2tFeGVjdXRpb24oKSB7CiAgICAgICAgaWYgKHRoaXMubmV4dEV4ZWN1dGlvblVuaXggPT09IDApIHsKICAgICAgICAgIHRoaXMuZ2V0TmV4dEV4ZWN1dGlvblRpbWUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKERhdGUubm93KCkgPiB0aGlzLm5leHRFeGVjdXRpb25Vbml4KSB7CiAgICAgICAgICBjb25zdCBtYXliZVByb21pc2UgPSB0aGlzLmpvYkZ1bmN0aW9uKHRoaXMubmV4dEV4ZWN1dGlvblVuaXgpOwogICAgICAgICAgaWYgKG1heWJlUHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2UpIHsKICAgICAgICAgICAgbWF5YmVQcm9taXNlLmNhdGNoKChlMTEpID0+IGNvbnNvbGUubG9nKGUxMSkpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5uZXh0RXhlY3V0aW9uVW5peCA9IHRoaXMuZ2V0TmV4dEV4ZWN1dGlvblRpbWUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMubmV4dEV4ZWN1dGlvblVuaXg7CiAgICAgIH0KICAgICAgZ2V0TmV4dEV4ZWN1dGlvblRpbWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubmV4dEV4ZWN1dGlvblVuaXggPSBEYXRlLm5vdygpICsgdGhpcy5nZXRUaW1lVG9OZXh0RXhlY3V0aW9uKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGdldHMgdGhlIHRpbWUgdG8gbmV4dCBleGVjdXRpb24KICAgICAgICovCiAgICAgIGdldFRpbWVUb05leHRFeGVjdXRpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY3JvblBhcnNlci5tc1RvTmV4dCgpOwogICAgICB9CiAgICAgIHN0YXJ0KCkgewogICAgICAgIHRoaXMuc3RhdHVzID0gInN0YXJ0ZWQiOwogICAgICB9CiAgICAgIHN0b3AoKSB7CiAgICAgICAgdGhpcy5zdGF0dXMgPSAic3RvcHBlZCI7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4xLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS51bml0cy5qcwp2YXIgdW5pdHMsIGdldE1pbGxpU2Vjb25kc0Zyb21Vbml0cywgZ2V0TWlsbGlTZWNvbmRzQXNIdW1hblJlYWRhYmxlU3RyaW5nLCBnZXRNaWxsaVNlY29uZHNBc0h1bWFuUmVhZGFibGVBZ29UaW1lOwp2YXIgaW5pdF9zbWFydHRpbWVfdW5pdHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4xLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS51bml0cy5qcyIoKSB7CiAgICBpbml0X3NtYXJ0dGltZV9wbHVnaW5zKCk7CiAgICB1bml0cyA9IHsKICAgICAgeWVhcnM6ICh0aW1lc0FyZyA9IDEpID0+IHsKICAgICAgICByZXR1cm4gdGltZXNBcmcgKiAzMTU0ZTc7CiAgICAgIH0sCiAgICAgIG1vbnRoczogKHRpbWVzQXJnID0gMSkgPT4gewogICAgICAgIHJldHVybiB0aW1lc0FyZyAqIDI2MjhlNjsKICAgICAgfSwKICAgICAgd2Vla3M6ICh0aW1lc0FyZyA9IDEpID0+IHsKICAgICAgICByZXR1cm4gdGltZXNBcmcgKiA2MDQ4ZTU7CiAgICAgIH0sCiAgICAgIGRheXM6ICh0aW1lc0FyZyA9IDEpID0+IHsKICAgICAgICByZXR1cm4gdGltZXNBcmcgKiA4NjRlNTsKICAgICAgfSwKICAgICAgaG91cnM6ICh0aW1lc0FyZyA9IDEpID0+IHsKICAgICAgICByZXR1cm4gdGltZXNBcmcgKiAzNmU1OwogICAgICB9LAogICAgICBtaW51dGVzOiAodGltZXNBcmcgPSAxKSA9PiB7CiAgICAgICAgcmV0dXJuIHRpbWVzQXJnICogNmU0OwogICAgICB9LAogICAgICBzZWNvbmRzOiAodGltZXNBcmcgPSAxKSA9PiB7CiAgICAgICAgcmV0dXJuIHRpbWVzQXJnICogMWUzOwogICAgICB9CiAgICB9OwogICAgZ2V0TWlsbGlTZWNvbmRzRnJvbVVuaXRzID0gKGNvbWJpbmF0aW9uQXJnKSA9PiB7CiAgICAgIGxldCB0aW1lSW5NaWxsaXNlY29uZHMgPSAwOwogICAgICBsZXQgYWRkTWlsbGlTZWNvbmRzID0gKG1pbGxpU2Vjb25kc0FyZykgPT4gewogICAgICAgIHRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVJbk1pbGxpc2Vjb25kcyArIG1pbGxpU2Vjb25kc0FyZzsKICAgICAgfTsKICAgICAgaWYgKGNvbWJpbmF0aW9uQXJnLnllYXJzKSB7CiAgICAgICAgYWRkTWlsbGlTZWNvbmRzKHVuaXRzLnllYXJzKGNvbWJpbmF0aW9uQXJnLnllYXJzKSk7CiAgICAgIH0KICAgICAgaWYgKGNvbWJpbmF0aW9uQXJnLm1vbnRocykgewogICAgICAgIGFkZE1pbGxpU2Vjb25kcyh1bml0cy5tb250aHMoY29tYmluYXRpb25BcmcubW9udGhzKSk7CiAgICAgIH0KICAgICAgaWYgKGNvbWJpbmF0aW9uQXJnLndlZWtzKSB7CiAgICAgICAgYWRkTWlsbGlTZWNvbmRzKHVuaXRzLndlZWtzKGNvbWJpbmF0aW9uQXJnLndlZWtzKSk7CiAgICAgIH0KICAgICAgaWYgKGNvbWJpbmF0aW9uQXJnLmRheXMpIHsKICAgICAgICBhZGRNaWxsaVNlY29uZHModW5pdHMuZGF5cyhjb21iaW5hdGlvbkFyZy5kYXlzKSk7CiAgICAgIH0KICAgICAgaWYgKGNvbWJpbmF0aW9uQXJnLmhvdXJzKSB7CiAgICAgICAgYWRkTWlsbGlTZWNvbmRzKHVuaXRzLmhvdXJzKGNvbWJpbmF0aW9uQXJnLmhvdXJzKSk7CiAgICAgIH0KICAgICAgaWYgKGNvbWJpbmF0aW9uQXJnLm1pbnV0ZXMpIHsKICAgICAgICBhZGRNaWxsaVNlY29uZHModW5pdHMubWludXRlcyhjb21iaW5hdGlvbkFyZy5taW51dGVzKSk7CiAgICAgIH0KICAgICAgaWYgKGNvbWJpbmF0aW9uQXJnLnNlY29uZHMpIHsKICAgICAgICBhZGRNaWxsaVNlY29uZHModW5pdHMuc2Vjb25kcyhjb21iaW5hdGlvbkFyZy5zZWNvbmRzKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRpbWVJbk1pbGxpc2Vjb25kczsKICAgIH07CiAgICBnZXRNaWxsaVNlY29uZHNBc0h1bWFuUmVhZGFibGVTdHJpbmcgPSAobWlsbGlTZWNvbmRzQXJnKSA9PiB7CiAgICAgIHJldHVybiBwcmV0dHlNaWxsaXNlY29uZHMobWlsbGlTZWNvbmRzQXJnKTsKICAgIH07CiAgICBnZXRNaWxsaVNlY29uZHNBc0h1bWFuUmVhZGFibGVBZ29UaW1lID0gKHRpbWVTdGFtcEFyZykgPT4gewogICAgICByZXR1cm4gZGF0ZV9mbnNfZXhwb3J0cy5mb3JtYXREaXN0YW5jZVRvTm93KG5ldyBEYXRlKHRpbWVTdGFtcEFyZykpOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjEuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuY3Jvbm1hbmFnZXIuanMKdmFyIENyb25NYW5hZ2VyOwp2YXIgaW5pdF9zbWFydHRpbWVfY2xhc3Nlc19jcm9ubWFuYWdlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjEuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuY3Jvbm1hbmFnZXIuanMiKCkgewogICAgaW5pdF9zbWFydHRpbWVfcGx1Z2lucygpOwogICAgaW5pdF9zbWFydHRpbWVfY2xhc3Nlc19jcm9uam9iKCk7CiAgICBpbml0X3NtYXJ0dGltZV91bml0cygpOwogICAgQ3Jvbk1hbmFnZXIgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuc3RhdHVzID0gInN0b3BwZWQiOwogICAgICAgIHRoaXMuY3JvbmpvYnMgPSBuZXcgZGlzdF90c19leHBvcnRzNi5PYmplY3RNYXAoKTsKICAgICAgfQogICAgICBhZGRDcm9uam9iKGNyb25JZGVudGlmaWVyQXJnLCBjcm9uRnVuY3Rpb25BcmcpIHsKICAgICAgICBjb25zdCBuZXdDcm9uSm9iID0gbmV3IENyb25Kb2IodGhpcywgY3JvbklkZW50aWZpZXJBcmcsIGNyb25GdW5jdGlvbkFyZyk7CiAgICAgICAgdGhpcy5jcm9uam9icy5hZGQobmV3Q3JvbkpvYik7CiAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAic3RhcnRlZCIpIHsKICAgICAgICAgIG5ld0Nyb25Kb2Iuc3RhcnQoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ld0Nyb25Kb2I7CiAgICAgIH0KICAgICAgcmVtb3ZlQ3JvbmpvYihjcm9uam9iQXJnKSB7CiAgICAgICAgY3JvbmpvYkFyZy5zdG9wKCk7CiAgICAgICAgdGhpcy5jcm9uam9icy5yZW1vdmUoY3JvbmpvYkFyZyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHN0YXJ0cyB0aGUgY3JvbmpvYgogICAgICAgKi8KICAgICAgc3RhcnQoKSB7CiAgICAgICAgaWYgKHRoaXMuc3RhdHVzICE9PSAic3RhcnRlZCIpIHsKICAgICAgICAgIHRoaXMuc3RhdHVzID0gInN0YXJ0ZWQiOwogICAgICAgICAgZm9yIChjb25zdCBjcm9uSm9iIG9mIHRoaXMuY3JvbmpvYnMuZ2V0QXJyYXkoKSkgewogICAgICAgICAgICBjcm9uSm9iLnN0YXJ0KCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLnJ1bkNyb25DeWNsZSgpOwogICAgICAgIH0KICAgICAgfQogICAgICBhc3luYyBydW5Dcm9uQ3ljbGUoKSB7CiAgICAgICAgdGhpcy5leGVjdXRpb25UaW1lb3V0ID0gbmV3IGRpc3RfdHNfZXhwb3J0czMuVGltZW91dCgwKTsKICAgICAgICBkbyB7CiAgICAgICAgICBsZXQgbmV4dFJ1bm5pbmdDcm9uam9iOwogICAgICAgICAgZm9yIChjb25zdCBjcm9uSm9iIG9mIHRoaXMuY3JvbmpvYnMuZ2V0QXJyYXkoKSkgewogICAgICAgICAgICBjcm9uSm9iLmNoZWNrRXhlY3V0aW9uKCk7CiAgICAgICAgICAgIGlmICghbmV4dFJ1bm5pbmdDcm9uam9iIHx8IGNyb25Kb2IuZ2V0VGltZVRvTmV4dEV4ZWN1dGlvbigpIDwgbmV4dFJ1bm5pbmdDcm9uam9iLmdldFRpbWVUb05leHRFeGVjdXRpb24oKSkgewogICAgICAgICAgICAgIG5leHRSdW5uaW5nQ3JvbmpvYiA9IGNyb25Kb2I7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChuZXh0UnVubmluZ0Nyb25qb2IpIHsKICAgICAgICAgICAgdGhpcy5leGVjdXRpb25UaW1lb3V0ID0gbmV3IGRpc3RfdHNfZXhwb3J0czMuVGltZW91dChuZXh0UnVubmluZ0Nyb25qb2IuZ2V0VGltZVRvTmV4dEV4ZWN1dGlvbigpKTsKICAgICAgICAgICAgY29uc29sZS5sb2coYE5leHQgQ3JvbkpvYiBzY2hlZHVsZWQgaW4gJHtnZXRNaWxsaVNlY29uZHNBc0h1bWFuUmVhZGFibGVTdHJpbmcodGhpcy5leGVjdXRpb25UaW1lb3V0LmdldFRpbWVMZWZ0KCkpfWApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5leGVjdXRpb25UaW1lb3V0ID0gbmV3IGRpc3RfdHNfZXhwb3J0czMuVGltZW91dCgxZTMpOwogICAgICAgICAgICBjb25zb2xlLmxvZygibm8gY3JvbmpvYnMgc3BlY2lmaWVkISBDaGVja2luZyBhZ2FpbiBpbiAxIHNlY29uZCIpOwogICAgICAgICAgfQogICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRpb25UaW1lb3V0LnByb21pc2U7CiAgICAgICAgfSB3aGlsZSAodGhpcy5zdGF0dXMgPT09ICJzdGFydGVkIik7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHN0b3BzIGFsbCBjcm9uam9icwogICAgICAgKi8KICAgICAgc3RvcCgpIHsKICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09ICJzdGFydGVkIikgewogICAgICAgICAgdGhpcy5zdGF0dXMgPSAic3RvcHBlZCI7CiAgICAgICAgICB0aGlzLmV4ZWN1dGlvblRpbWVvdXQuY2FuY2VsKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnNvbGUubG9nKGBZb3UgdHJpZWQgdG8gc3RvcCBhIENyb25NYW5hZ2VyIHRoYXQgd2FzIG5vdCBhY3R1YWxseSBzdGFydGVkLmApOwogICAgICAgIH0KICAgICAgICBmb3IgKGNvbnN0IGNyb24gb2YgdGhpcy5jcm9uam9icy5nZXRBcnJheSgpKSB7CiAgICAgICAgICBjcm9uLnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4xLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLmV4dGVuZGVkZGF0ZS5qcwp2YXIgRXh0ZW5kZWREYXRlOwp2YXIgaW5pdF9zbWFydHRpbWVfY2xhc3Nlc19leHRlbmRlZGRhdGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4xLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLmV4dGVuZGVkZGF0ZS5qcyIoKSB7CiAgICBpbml0X3NtYXJ0dGltZV9wbHVnaW5zKCk7CiAgICBpbml0X3NtYXJ0dGltZV91bml0cygpOwogICAgRXh0ZW5kZWREYXRlID0gY2xhc3MgX0V4dGVuZGVkRGF0ZSBleHRlbmRzIERhdGUgewogICAgICAvLyBTVEFUSUMgZmFjdG9yaWVzCiAgICAgIHN0YXRpYyBmcm9tTWlsbGlzKG1pbGxpU2Vjb25kcykgewogICAgICAgIHJldHVybiBuZXcgX0V4dGVuZGVkRGF0ZShtaWxsaVNlY29uZHMpOwogICAgICB9CiAgICAgIHN0YXRpYyBmcm9tRGF0ZShkYXRlQXJnKSB7CiAgICAgICAgcmV0dXJuIG5ldyBfRXh0ZW5kZWREYXRlKGRhdGVBcmcuZ2V0VGltZSgpKTsKICAgICAgfQogICAgICBzdGF0aWMgZnJvbUV1cm9wZWFuRGF0ZShldXJvcGVhbkRhdGUpIHsKICAgICAgICBjb25zdCBkYXRlQXJyYXkgPSAvKC4qKVwuKC4qKVwuKC4qKS8uZXhlYyhldXJvcGVhbkRhdGUpOwogICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgKICAgICAgICAgIHBhcnNlRmxvYXQoZGF0ZUFycmF5WzNdKSwKICAgICAgICAgIC8vIHllYXIKICAgICAgICAgIHBhcnNlRmxvYXQoZGF0ZUFycmF5WzJdKSAtIDEsCiAgICAgICAgICAvLyBtb250aAogICAgICAgICAgcGFyc2VGbG9hdChkYXRlQXJyYXlbMV0pCiAgICAgICAgICAvLyBkYXkKICAgICAgICApOwogICAgICAgIGNvbnN0IHVuaXhNaWxsaSA9IGRhdGUuZ2V0VGltZSgpOwogICAgICAgIHJldHVybiBuZXcgX0V4dGVuZGVkRGF0ZSh1bml4TWlsbGkpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBjcmVhdGVzIGFuIEV4dGVuZGVkIGRhdGUgZnJvbSBhIGh5cGVkRGF0ZSBsaWtlICIyMDE4LTAzLTI4IgogICAgICAgKiBAcGFyYW0gZGF0ZVN0cmluZwogICAgICAgKi8KICAgICAgc3RhdGljIGZyb21IeXBoZWREYXRlKGRhdGVTdHJpbmcpIHsKICAgICAgICBjb25zdCBkYXRlTWlsbGlzID0gbmV3IERhdGUoZGF0ZVN0cmluZykuZ2V0VGltZSgpOwogICAgICAgIHJldHVybiBuZXcgX0V4dGVuZGVkRGF0ZShkYXRlTWlsbGlzKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogU2FtZSBhcyAuZnJvbUV1cm9wZWFuRGF0ZSgpLCBidXQgYWNjZXB0cyBhZGRpdGlvbmFsIHRpbWVBcmcgYW5kIHpvbmVBcmcKICAgICAgICovCiAgICAgIHN0YXRpYyBmcm9tRXVyb3BlYW5EYXRlQW5kVGltZShldXJvcGVhbkRhdGVBcmcsIHRpbWVBcmcgPSAiMTI6MDA6MDAiLCB6b25lQXJnID0gIkV1cm9wZS9CZXJsaW4iKSB7CiAgICAgICAgY29uc3QgZGF0ZUFycmF5ID0gLyguKilcLiguKilcLiguKikvLmV4ZWMoZXVyb3BlYW5EYXRlQXJnKTsKICAgICAgICBjb25zdCBzbGljZURhdGUgPSAoZGF0ZVN0cmluZykgPT4gewogICAgICAgICAgcmV0dXJuIGAwJHtkYXRlU3RyaW5nfWAuc2xpY2UoLTIpOwogICAgICAgIH07CiAgICAgICAgY29uc3QgZGF0ZVRpbWVTdHJpbmcgPSBgJHtkYXRlQXJyYXlbM119LSR7c2xpY2VEYXRlKGRhdGVBcnJheVsyXSl9LSR7c2xpY2VEYXRlKGRhdGVBcnJheVsxXSl9VCR7dGltZUFyZ31gOwogICAgICAgIGNvbnN0IGRhdGUgPSBpbXBvcnRfZGF5anMuZGVmYXVsdChkYXRlVGltZVN0cmluZyk7CiAgICAgICAgY29uc3QgdW5peE1pbGxpID0gZGF0ZS50b0RhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgcmV0dXJuIG5ldyBfRXh0ZW5kZWREYXRlKHVuaXhNaWxsaSk7CiAgICAgIH0KICAgICAgY29uc3RydWN0b3IodW5peE1pbGxpID0gRGF0ZS5ub3coKSkgewogICAgICAgIHN1cGVyKHVuaXhNaWxsaSk7CiAgICAgIH0KICAgICAgLy8KICAgICAgZXhwb3J0VG9FdXJvcGVhbkRhdGUoKSB7CiAgICAgICAgY29uc3QgdW5pdHMzID0gdGhpcy5leHBvcnRUb1VuaXRzKCk7CiAgICAgICAgcmV0dXJuIGAke3VuaXRzMy5kYXlTdHJpbmd9LiR7dW5pdHMzLm1vbnRoU3RyaW5nfS4ke3VuaXRzMy55ZWFyU3RyaW5nfWA7CiAgICAgIH0KICAgICAgZXhwb3J0VG9IeXBoZWRTb3J0YWJsZURhdGUoKSB7CiAgICAgICAgY29uc3QgdW5pdHMzID0gdGhpcy5leHBvcnRUb1VuaXRzKCk7CiAgICAgICAgcmV0dXJuIGAke3VuaXRzMy55ZWFyU3RyaW5nfS0ke3VuaXRzMy5tb250aFN0cmluZ30tJHt1bml0czMuZGF5U3RyaW5nfWA7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGV4cG9ydHMgdW5pdHMKICAgICAgICovCiAgICAgIGV4cG9ydFRvVW5pdHMoKSB7CiAgICAgICAgY29uc3QgbW9udGhzQXJyYXkgPSBbCiAgICAgICAgICAiSmFudWFyeSIsCiAgICAgICAgICAiRmVicnVhcnkiLAogICAgICAgICAgIk1hcmNoIiwKICAgICAgICAgICJBcHJpbCIsCiAgICAgICAgICAiTWF5IiwKICAgICAgICAgICJKdW5lIiwKICAgICAgICAgICJKdWx5IiwKICAgICAgICAgICJBdWd1c3QiLAogICAgICAgICAgIlNlcHRlbWJlciIsCiAgICAgICAgICAiT2N0b2JlciIsCiAgICAgICAgICAiTm92ZW1iZXIiLAogICAgICAgICAgIkRlY2VtYmVyIgogICAgICAgIF07CiAgICAgICAgY29uc3QgZGF5c0FycmF5ID0gWwogICAgICAgICAgIk1vbmRheSIsCiAgICAgICAgICAiVHVlc2RheSIsCiAgICAgICAgICAiV2VkbmVzZGF5IiwKICAgICAgICAgICJUaHVyc2RheSIsCiAgICAgICAgICAiRnJpZGF5IiwKICAgICAgICAgICJTYXR1cmRheSIsCiAgICAgICAgICAiU3VuZGF5IgogICAgICAgIF07CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHllYXI6IHRoaXMuZ2V0RnVsbFllYXIoKSwKICAgICAgICAgIHllYXJTdHJpbmc6IGAke3RoaXMuZ2V0RnVsbFllYXIoKX1gLAogICAgICAgICAgbW9udGg6IHRoaXMuZ2V0TW9udGgoKSArIDEsCiAgICAgICAgICBtb250aFN0cmluZzogKCIwIiArICh0aGlzLmdldE1vbnRoKCkgKyAxKSkuc2xpY2UoLTIpLAogICAgICAgICAgbW9udGhOYW1lOiBtb250aHNBcnJheVt0aGlzLmdldE1vbnRoKCldLAogICAgICAgICAgZGF5OiB0aGlzLmdldERhdGUoKSwKICAgICAgICAgIGRheVN0cmluZzogKCIwIiArIHRoaXMuZ2V0RGF0ZSgpKS5zbGljZSgtMiksCiAgICAgICAgICBkYXlPZlRoZVdlZWs6IHRoaXMuZ2V0RGF5KCksCiAgICAgICAgICBkYXlPZlRoZVdlZWtOYW1lOiBkYXlzQXJyYXlbdGhpcy5nZXREYXkoKV0KICAgICAgICB9OwogICAgICB9CiAgICAgIGZvcm1hdChmb3JtYXRBcmcpIHsKICAgICAgICByZXR1cm4gaW1wb3J0X2RheWpzLmRlZmF1bHQodGhpcy5nZXRUaW1lKCkpLmZvcm1hdChmb3JtYXRBcmcpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBib29sZWFuIGNoZWNrcwogICAgICAgKi8KICAgICAgaXNUb2RheSgpIHsKICAgICAgICByZXR1cm4gaW1wb3J0X2RheWpzLmRlZmF1bHQodGhpcy5nZXRUaW1lKCkpLmlzVG9kYXkoKTsKICAgICAgfQogICAgICBsZXNzVGltZVBhc3NlZFRvTm93KHVuaXRBcmdzKSB7CiAgICAgICAgY29uc3QgbWF4UGFzc2VkVW5peFRpbWUgPSBnZXRNaWxsaVNlY29uZHNGcm9tVW5pdHModW5pdEFyZ3MpOwogICAgICAgIGNvbnN0IGFjdHVhbFBhc3NlZFVuaXhUaW1lID0gRGF0ZS5ub3coKSAtIHRoaXMuZ2V0VGltZSgpOwogICAgICAgIHJldHVybiBhY3R1YWxQYXNzZWRVbml4VGltZSA8IG1heFBhc3NlZFVuaXhUaW1lOwogICAgICB9CiAgICAgIG1vcmVUaW1lUGFzc2VkVG9Ob3codW5pdEFyZ3MpIHsKICAgICAgICByZXR1cm4gIXRoaXMubGVzc1RpbWVQYXNzZWRUb05vdyh1bml0QXJncyk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4xLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLmhydG1lYXN1cmVtZW50LmpzCnZhciBIcnRNZWFzdXJlbWVudDsKdmFyIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfaHJ0bWVhc3VyZW1lbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4xLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLmhydG1lYXN1cmVtZW50LmpzIigpIHsKICAgIEhydE1lYXN1cmVtZW50ID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLm5hbm9TZWNvbmRzID0gbnVsbDsKICAgICAgICB0aGlzLm1pbGxpU2Vjb25kcyA9IG51bGw7CiAgICAgICAgdGhpcy5fbWlsbGlTdGFydCA9IG51bGw7CiAgICAgICAgdGhpcy5fbWlsbGlEaWZmID0gbnVsbDsKICAgICAgICB0aGlzLl9zdGFydGVkID0gZmFsc2U7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHN0YXJ0IHRoZSBtZWFzdXJlbWVudAogICAgICAgKi8KICAgICAgc3RhcnQoKSB7CiAgICAgICAgdGhpcy5fc3RhcnRlZCA9IHRydWU7CiAgICAgICAgdGhpcy5fbWlsbGlTdGFydCA9IERhdGUubm93KCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHN0b3AgdGhlIG1lYXN1cmVtZW50CiAgICAgICAqLwogICAgICBzdG9wKCkgewogICAgICAgIGlmICh0aGlzLl9zdGFydGVkID09PSBmYWxzZSkgewogICAgICAgICAgY29uc29sZS5sb2coIkhhc24ndCBzdGFydGVkIHlldCIpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLl9taWxsaURpZmYgPSBEYXRlLm5vdygpIC0gdGhpcy5fbWlsbGlTdGFydDsKICAgICAgICB0aGlzLm5hbm9TZWNvbmRzID0gdGhpcy5fbWlsbGlEaWZmICogMWUzOwogICAgICAgIHRoaXMubWlsbGlTZWNvbmRzID0gdGhpcy5fbWlsbGlEaWZmOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiByZXNldCB0aGUgbWVhc3VyZW1lbnQKICAgICAgICovCiAgICAgIHJlc2V0KCkgewogICAgICAgIHRoaXMubmFub1NlY29uZHMgPSBudWxsOwogICAgICAgIHRoaXMubWlsbGlTZWNvbmRzID0gbnVsbDsKICAgICAgICB0aGlzLl9taWxsaVN0YXJ0ID0gbnVsbDsKICAgICAgICB0aGlzLl9taWxsaURpZmYgPSBudWxsOwogICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjEuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuaW50ZXJ2YWwuanMKdmFyIEludGVydmFsOwp2YXIgaW5pdF9zbWFydHRpbWVfY2xhc3Nlc19pbnRlcnZhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjEuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuaW50ZXJ2YWwuanMiKCkgewogICAgaW5pdF9zbWFydHRpbWVfcGx1Z2lucygpOwogICAgSW50ZXJ2YWwgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKGludGVydmFsTWlsbGlzZW5jb25kc0FyZykgewogICAgICAgIHRoaXMuc3RhdHVzID0gImluaXRpYWwiOwogICAgICAgIHRoaXMuc3RhdHVzQXV0aG9yaXphdGlvbiA9IG51bGw7CiAgICAgICAgdGhpcy5pbnRlcnZhbEpvYnMgPSBbXTsKICAgICAgICB0aGlzLmludGVydmFsTWlsbGlzZWNvbmRzID0gaW50ZXJ2YWxNaWxsaXNlbmNvbmRzQXJnOwogICAgICB9CiAgICAgIHN0YXJ0KCkgewogICAgICAgIHRoaXMuc3RhdHVzID0gInN0YXJ0ZWQiOwogICAgICAgIGNvbnN0IHN0YXR1c0F1dGggPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTsKICAgICAgICB0aGlzLnN0YXR1c0F1dGhvcml6YXRpb24gPSBzdGF0dXNBdXRoOwogICAgICAgIGNvbnN0IHJ1bkludGVydmFsID0gYXN5bmMgKCkgPT4gewogICAgICAgICAgd2hpbGUgKHRoaXMuc3RhdHVzID09PSAic3RhcnRlZCIgJiYgdGhpcy5zdGF0dXNBdXRob3JpemF0aW9uID09PSBzdGF0dXNBdXRoKSB7CiAgICAgICAgICAgIGF3YWl0IGRpc3RfdHNfZXhwb3J0czMuZGVsYXlGb3IodGhpcy5pbnRlcnZhbE1pbGxpc2Vjb25kcyk7CiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUludGVydmFsSm9icygpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcnVuSW50ZXJ2YWwoKTsKICAgICAgfQogICAgICBzdG9wKCkgewogICAgICAgIHRoaXMuc3RhdHVzID0gInN0b3BwZWQiOwogICAgICAgIHRoaXMuc3RhdHVzQXV0aG9yaXphdGlvbiA9IG51bGw7CiAgICAgIH0KICAgICAgYWRkSW50ZXJ2YWxKb2IoZnVuY0FyZykgewogICAgICAgIHRoaXMuaW50ZXJ2YWxKb2JzLnB1c2goZnVuY0FyZyk7CiAgICAgIH0KICAgICAgZXhlY3V0ZUludGVydmFsSm9icygpIHsKICAgICAgICBmb3IgKGNvbnN0IGZ1bmNBcmcgb2YgdGhpcy5pbnRlcnZhbEpvYnMpIHsKICAgICAgICAgIGZ1bmNBcmcoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4xLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLnRpbWVzdGFtcC5qcwp2YXIgVGltZVN0YW1wOwp2YXIgaW5pdF9zbWFydHRpbWVfY2xhc3Nlc190aW1lc3RhbXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4xLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLnRpbWVzdGFtcC5qcyIoKSB7CiAgICBpbml0X3NtYXJ0dGltZV9wbHVnaW5zKCk7CiAgICBUaW1lU3RhbXAgPSBjbGFzcyBfVGltZVN0YW1wIHsKICAgICAgLyoqCiAgICAgICAqIHJldHVybnMgbmV3IFRpbWVTdGFtcCBmcm9tIG1pbGxpc2Vjb25kcwogICAgICAgKi8KICAgICAgc3RhdGljIGZyb21NaWxsaVNlY29uZHMobWlsbGlTZWNvbmRzQXJnKSB7CiAgICAgICAgcmV0dXJuIG5ldyBfVGltZVN0YW1wKG1pbGxpU2Vjb25kc0FyZyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHJldHVybnMgbmV3IFRpbWVTdGFtcCBmb3Igbm93IHdpdGggY2hhbmdlIHNldAogICAgICAgKiBAcGFyYW0gdGltZVN0YW1wQXJnCiAgICAgICAqLwogICAgICBzdGF0aWMgZnJvbVRpbWVTdGFtcCh0aW1lU3RhbXBBcmcpIHsKICAgICAgICBjb25zdCBsb2NhbFRpbWVTdGFtcCA9IG5ldyBfVGltZVN0YW1wKCk7CiAgICAgICAgbG9jYWxUaW1lU3RhbXAuY2hhbmdlID0gbG9jYWxUaW1lU3RhbXAubWlsbGlTZWNvbmRzIC0gdGltZVN0YW1wQXJnLm1pbGxpU2Vjb25kczsKICAgICAgICByZXR1cm4gbG9jYWxUaW1lU3RhbXA7CiAgICAgIH0KICAgICAgY29uc3RydWN0b3IoY3JlYXRvckFyZykgewogICAgICAgIHRoaXMuY2hhbmdlID0gbnVsbDsKICAgICAgICBpZiAoIWNyZWF0b3JBcmcpIHsKICAgICAgICAgIHRoaXMuZGF0ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNyZWF0b3JBcmcgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICB0aGlzLmRhdGUgPSBuZXcgRGF0ZShjcmVhdG9yQXJnKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5taWxsaVNlY29uZHMgPSB0aGlzLmRhdGUuZ2V0VGltZSgpOwogICAgICAgIHRoaXMuZXBvY2h0aW1lID0gTWF0aC5mbG9vcih0aGlzLm1pbGxpU2Vjb25kcyAvIDFlMyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHJldHVybnMgYSBib29sZWFuIGZvciB3ZXRoZXIgdGhlIHRpbWVzdGFtcCBpcyBvbGRlciB0aGFuIGFub3RoZXIgdGltZXN0YW1wCiAgICAgICAqIEBwYXJhbSBUaW1lU3RhbXBBcmcKICAgICAgICogQHBhcmFtIHRyZXNob2xkVGltZUFyZwogICAgICAgKi8KICAgICAgaXNPbGRlclRoYW5PdGhlclRpbWVTdGFtcChUaW1lU3RhbXBBcmcsIHRyZXNob2xkVGltZUFyZyA9IDApIHsKICAgICAgICBpZiAodGhpcy5taWxsaVNlY29uZHMgPCBUaW1lU3RhbXBBcmcubWlsbGlTZWNvbmRzIC0gdHJlc2hvbGRUaW1lQXJnKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogSXMgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2xkZXIgdGhhbiB0aGUgYXJndW1lbnQKICAgICAgICogQHBhcmFtIFRpbWVTdGFtcEFyZwogICAgICAgKi8KICAgICAgaXNPbGRlclRoYW4oVGltZVN0YW1wQXJnLCB0cmVzaG9sZFRpbWVBcmcgPSAwKSB7CiAgICAgICAgaWYgKHRoaXMubWlsbGlTZWNvbmRzICsgdHJlc2hvbGRUaW1lQXJnIDwgVGltZVN0YW1wQXJnLm1pbGxpU2Vjb25kcykgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHJldHVybnMgYSBib29sZWFuIGZvciB3ZXRoZXIgdGhlIHRpbWVzdGFtcCBpcyB5b3VuZ2VyIHRoYW4gYW5vdGhlciB0aW1lc3RhbXAKICAgICAgICogQHBhcmFtIFRpbWVTdGFtcEFyZwogICAgICAgKiBAcGFyYW0gdHJlc2hvbGRUaW1lQXJnCiAgICAgICAqLwogICAgICBpc1lvdW5nZXJUaGFuT3RoZXJUaW1lU3RhbXAoVGltZVN0YW1wQXJnLCB0cmVzaG9sZFRpbWVBcmcgPSAwKSB7CiAgICAgICAgaWYgKHRoaXMubWlsbGlTZWNvbmRzID4gVGltZVN0YW1wQXJnLm1pbGxpU2Vjb25kcyArIHRyZXNob2xkVGltZUFyZykgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaXNZb3VuZ2VyVGhhbk1pbGxpU2Vjb25kcyhtaWxsaXNlY29uZEFyZykgewogICAgICAgIGNvbnN0IG5vd1RpbWVTdGFtcCA9IG5ldyBfVGltZVN0YW1wKCk7CiAgICAgICAgY29uc3QgY29tcGFyZUVwb2NoVGltZSA9IG5vd1RpbWVTdGFtcC5lcG9jaHRpbWUgLSBtaWxsaXNlY29uZEFyZzsKICAgICAgICBjb25zdCBjb21wYXJlVGltZVN0YW1wID0gbmV3IF9UaW1lU3RhbXAoY29tcGFyZUVwb2NoVGltZSk7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNZb3VuZ2VyVGhhbk90aGVyVGltZVN0YW1wKGNvbXBhcmVUaW1lU3RhbXApOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMS4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUuY2xhc3Nlcy50aW1lci5qcwp2YXIgVGltZXI7CnZhciBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX3RpbWVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMS4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUuY2xhc3Nlcy50aW1lci5qcyIoKSB7CiAgICBpbml0X3NtYXJ0dGltZV9wbHVnaW5zKCk7CiAgICBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX3RpbWVzdGFtcCgpOwogICAgVGltZXIgPSBjbGFzcyB7CiAgICAgIGdldCB0aW1lTGVmdCgpIHsKICAgICAgICByZXR1cm4gdGhpcy50aW1lSW5NaWxsaXNlY29uZHMgLSB0aGlzLnBhdXNlZEF0LmNoYW5nZTsKICAgICAgfQogICAgICBjb25zdHJ1Y3Rvcih0aW1lSW5NaWxsaXNlY29uZHNBcmcpIHsKICAgICAgICB0aGlzLnN0YXRlID0gImluaXRpYXRlZCI7CiAgICAgICAgdGhpcy5jb21wbGV0ZWREZWZlcnJlZCA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgICAgIHRoaXMudGltZUluTWlsbGlzZWNvbmRzID0gdGltZUluTWlsbGlzZWNvbmRzQXJnOwogICAgICAgIHRoaXMuY29tcGxldGVkID0gdGhpcy5jb21wbGV0ZWREZWZlcnJlZC5wcm9taXNlOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBzdGFydHMgdGhlIHRpbWVyCiAgICAgICAqLwogICAgICBzdGFydCgpIHsKICAgICAgICBpZiAoIXRoaXMuc3RhcnRlZEF0KSB7CiAgICAgICAgICB0aGlzLmN1cnJlbnRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIHRoaXMuY29tcGxldGVkRGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgfSwgdGhpcy50aW1lSW5NaWxsaXNlY29uZHMpOwogICAgICAgICAgdGhpcy5zdGFydGVkQXQgPSBuZXcgVGltZVN0YW1wKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigidGltZXIgaGFzIGJlZW4gc3RhcnRlZCBiZWZvcmUuIFBsZWFzZSB1c2UgcmVzdW1lIGluc3RlYWQiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcGF1c2UoKSB7CiAgICAgICAgaWYgKHRoaXMuc3RhcnRlZEF0KSB7CiAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jdXJyZW50VGltZW91dCk7CiAgICAgICAgICB0aGlzLmN1cnJlbnRUaW1lb3V0ID0gbnVsbDsKICAgICAgICAgIHRoaXMucGF1c2VkQXQgPSBUaW1lU3RhbXAuZnJvbVRpbWVTdGFtcCh0aGlzLnN0YXJ0ZWRBdCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlc3VtZSgpIHsKICAgICAgICBpZiAodGhpcy5zdGFydGVkQXQpIHsKICAgICAgICAgIHRoaXMuY3VycmVudFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgdGhpcy5jb21wbGV0ZWREZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICB9LCB0aGlzLnRpbWVMZWZ0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ0aW1lciBoYXMgTk9UIGJlZW4gc3RhcnRlZCBiZWZvcmUuIFBsZWFzZSB1c2UgLnN0YXJ0KCkgaW5zdGVhZCIpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXNldCgpIHsKICAgICAgICB0aGlzLnBhdXNlKCk7CiAgICAgICAgdGhpcy5zdGFydGVkQXQgPSBudWxsOwogICAgICAgIHRoaXMucGF1c2VkQXQgPSBudWxsOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMS4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzNyA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHM3LCB7CiAgQ3JvbkpvYjogKCkgPT4gQ3JvbkpvYiwKICBDcm9uTWFuYWdlcjogKCkgPT4gQ3Jvbk1hbmFnZXIsCiAgRXh0ZW5kZWREYXRlOiAoKSA9PiBFeHRlbmRlZERhdGUsCiAgSHJ0TWVhc3VyZW1lbnQ6ICgpID0+IEhydE1lYXN1cmVtZW50LAogIEludGVydmFsOiAoKSA9PiBJbnRlcnZhbCwKICBUaW1lU3RhbXA6ICgpID0+IFRpbWVTdGFtcCwKICBUaW1lcjogKCkgPT4gVGltZXIsCiAgZ2V0TWlsbGlTZWNvbmRzQXNIdW1hblJlYWRhYmxlQWdvVGltZTogKCkgPT4gZ2V0TWlsbGlTZWNvbmRzQXNIdW1hblJlYWRhYmxlQWdvVGltZSwKICBnZXRNaWxsaVNlY29uZHNBc0h1bWFuUmVhZGFibGVTdHJpbmc6ICgpID0+IGdldE1pbGxpU2Vjb25kc0FzSHVtYW5SZWFkYWJsZVN0cmluZywKICBnZXRNaWxsaVNlY29uZHNGcm9tVW5pdHM6ICgpID0+IGdldE1pbGxpU2Vjb25kc0Zyb21Vbml0cywKICB1bml0czogKCkgPT4gdW5pdHMKfSk7CnZhciBpbml0X2Rpc3RfdHM2ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMS4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9pbmRleC5qcyIoKSB7CiAgICBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX2Nyb25tYW5hZ2VyKCk7CiAgICBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX2Nyb25qb2IoKTsKICAgIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfZXh0ZW5kZWRkYXRlKCk7CiAgICBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX2hydG1lYXN1cmVtZW50KCk7CiAgICBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX2ludGVydmFsKCk7CiAgICBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX3RpbWVyKCk7CiAgICBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX3RpbWVzdGFtcCgpOwogICAgaW5pdF9zbWFydHRpbWVfdW5pdHMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N5bWJvbC10cmVlQDMuMi40L25vZGVfbW9kdWxlcy9zeW1ib2wtdHJlZS9saWIvU3ltYm9sVHJlZU5vZGUuanMKdmFyIHJlcXVpcmVfU3ltYm9sVHJlZU5vZGUgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3N5bWJvbC10cmVlQDMuMi40L25vZGVfbW9kdWxlcy9zeW1ib2wtdHJlZS9saWIvU3ltYm9sVHJlZU5vZGUuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgbW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBTeW1ib2xUcmVlTm9kZSB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDsKICAgICAgICB0aGlzLnByZXZpb3VzU2libGluZyA9IG51bGw7CiAgICAgICAgdGhpcy5uZXh0U2libGluZyA9IG51bGw7CiAgICAgICAgdGhpcy5maXJzdENoaWxkID0gbnVsbDsKICAgICAgICB0aGlzLmxhc3RDaGlsZCA9IG51bGw7CiAgICAgICAgdGhpcy5jaGlsZHJlblZlcnNpb24gPSAwOwogICAgICAgIHRoaXMuY2hpbGRJbmRleENhY2hlZFVwVG8gPSBudWxsOwogICAgICAgIHRoaXMuY2FjaGVkSW5kZXggPSAtMTsKICAgICAgICB0aGlzLmNhY2hlZEluZGV4VmVyc2lvbiA9IE5hTjsKICAgICAgfQogICAgICBnZXQgaXNBdHRhY2hlZCgpIHsKICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLnBhcmVudCB8fCB0aGlzLnByZXZpb3VzU2libGluZyB8fCB0aGlzLm5leHRTaWJsaW5nKTsKICAgICAgfQogICAgICBnZXQgaGFzQ2hpbGRyZW4oKSB7CiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5maXJzdENoaWxkKTsKICAgICAgfQogICAgICBjaGlsZHJlbkNoYW5nZWQoKSB7CiAgICAgICAgdGhpcy5jaGlsZHJlblZlcnNpb24gPSB0aGlzLmNoaWxkcmVuVmVyc2lvbiArIDEgJiA0Mjk0OTY3Mjk1OwogICAgICAgIHRoaXMuY2hpbGRJbmRleENhY2hlZFVwVG8gPSBudWxsOwogICAgICB9CiAgICAgIGdldENhY2hlZEluZGV4KHBhcmVudE5vZGUpIHsKICAgICAgICBpZiAodGhpcy5jYWNoZWRJbmRleFZlcnNpb24gIT09IHBhcmVudE5vZGUuY2hpbGRyZW5WZXJzaW9uKSB7CiAgICAgICAgICB0aGlzLmNhY2hlZEluZGV4VmVyc2lvbiA9IE5hTjsKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkSW5kZXg7CiAgICAgIH0KICAgICAgc2V0Q2FjaGVkSW5kZXgocGFyZW50Tm9kZSwgaW5kZXgyKSB7CiAgICAgICAgdGhpcy5jYWNoZWRJbmRleFZlcnNpb24gPSBwYXJlbnROb2RlLmNoaWxkcmVuVmVyc2lvbjsKICAgICAgICB0aGlzLmNhY2hlZEluZGV4ID0gaW5kZXgyOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vc3ltYm9sLXRyZWVAMy4yLjQvbm9kZV9tb2R1bGVzL3N5bWJvbC10cmVlL2xpYi9UcmVlUG9zaXRpb24uanMKdmFyIHJlcXVpcmVfVHJlZVBvc2l0aW9uID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9zeW1ib2wtdHJlZUAzLjIuNC9ub2RlX21vZHVsZXMvc3ltYm9sLXRyZWUvbGliL1RyZWVQb3NpdGlvbi5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICBtb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5mcmVlemUoewogICAgICAvLyBzYW1lIGFzIERPTSBET0NVTUVOVF9QT1NJVElPTl8KICAgICAgRElTQ09OTkVDVEVEOiAxLAogICAgICBQUkVDRURJTkc6IDIsCiAgICAgIEZPTExPV0lORzogNCwKICAgICAgQ09OVEFJTlM6IDgsCiAgICAgIENPTlRBSU5FRF9CWTogMTYKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vc3ltYm9sLXRyZWVAMy4yLjQvbm9kZV9tb2R1bGVzL3N5bWJvbC10cmVlL2xpYi9UcmVlSXRlcmF0b3IuanMKdmFyIHJlcXVpcmVfVHJlZUl0ZXJhdG9yID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9zeW1ib2wtdHJlZUAzLjIuNC9ub2RlX21vZHVsZXMvc3ltYm9sLXRyZWUvbGliL1RyZWVJdGVyYXRvci5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgVFJFRSA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woKTsKICAgIHZhciBST09UID0gLyogQF9fUFVSRV9fICovIFN5bWJvbCgpOwogICAgdmFyIE5FWFQgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKCk7CiAgICB2YXIgSVRFUkFURV9GVU5DID0gLyogQF9fUFVSRV9fICovIFN5bWJvbCgpOwogICAgdmFyIFRyZWVJdGVyYXRvciA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IodHJlZSwgcm9vdDYsIGZpcnN0UmVzdWx0LCBpdGVyYXRlRnVuY3Rpb24pIHsKICAgICAgICB0aGlzW1RSRUVdID0gdHJlZTsKICAgICAgICB0aGlzW1JPT1RdID0gcm9vdDY7CiAgICAgICAgdGhpc1tORVhUXSA9IGZpcnN0UmVzdWx0OwogICAgICAgIHRoaXNbSVRFUkFURV9GVU5DXSA9IGl0ZXJhdGVGdW5jdGlvbjsKICAgICAgfQogICAgICBuZXh0KCkgewogICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzW1RSRUVdOwogICAgICAgIGNvbnN0IGl0ZXJhdGVGdW5jID0gdGhpc1tJVEVSQVRFX0ZVTkNdOwogICAgICAgIGNvbnN0IHJvb3Q2ID0gdGhpc1tST09UXTsKICAgICAgICBpZiAoIXRoaXNbTkVYVF0pIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGRvbmU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiByb290NgogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdmFsdWUyID0gdGhpc1tORVhUXTsKICAgICAgICBpZiAoaXRlcmF0ZUZ1bmMgPT09IDEpIHsKICAgICAgICAgIHRoaXNbTkVYVF0gPSB0cmVlLl9ub2RlKHZhbHVlMikucHJldmlvdXNTaWJsaW5nOwogICAgICAgIH0gZWxzZSBpZiAoaXRlcmF0ZUZ1bmMgPT09IDIpIHsKICAgICAgICAgIHRoaXNbTkVYVF0gPSB0cmVlLl9ub2RlKHZhbHVlMikubmV4dFNpYmxpbmc7CiAgICAgICAgfSBlbHNlIGlmIChpdGVyYXRlRnVuYyA9PT0gMykgewogICAgICAgICAgdGhpc1tORVhUXSA9IHRyZWUuX25vZGUodmFsdWUyKS5wYXJlbnQ7CiAgICAgICAgfSBlbHNlIGlmIChpdGVyYXRlRnVuYyA9PT0gNCkgewogICAgICAgICAgdGhpc1tORVhUXSA9IHRyZWUucHJlY2VkaW5nKHZhbHVlMiwgeyByb290OiByb290NiB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpc1tORVhUXSA9IHRyZWUuZm9sbG93aW5nKHZhbHVlMiwgeyByb290OiByb290NiB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGRvbmU6IGZhbHNlLAogICAgICAgICAgdmFsdWU6IHZhbHVlMgogICAgICAgIH07CiAgICAgIH0KICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVHJlZUl0ZXJhdG9yLnByb3RvdHlwZSwgU3ltYm9sLml0ZXJhdG9yLCB7CiAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwKICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICB9KTsKICAgIFRyZWVJdGVyYXRvci5QUkVWID0gMTsKICAgIFRyZWVJdGVyYXRvci5ORVhUID0gMjsKICAgIFRyZWVJdGVyYXRvci5QQVJFTlQgPSAzOwogICAgVHJlZUl0ZXJhdG9yLlBSRUNFRElORyA9IDQ7CiAgICBUcmVlSXRlcmF0b3IuRk9MTE9XSU5HID0gNTsKICAgIE9iamVjdC5mcmVlemUoVHJlZUl0ZXJhdG9yKTsKICAgIE9iamVjdC5mcmVlemUoVHJlZUl0ZXJhdG9yLnByb3RvdHlwZSk7CiAgICBtb2R1bGUuZXhwb3J0cyA9IFRyZWVJdGVyYXRvcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N5bWJvbC10cmVlQDMuMi40L25vZGVfbW9kdWxlcy9zeW1ib2wtdHJlZS9saWIvU3ltYm9sVHJlZS5qcwp2YXIgcmVxdWlyZV9TeW1ib2xUcmVlID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9zeW1ib2wtdHJlZUAzLjIuNC9ub2RlX21vZHVsZXMvc3ltYm9sLXRyZWUvbGliL1N5bWJvbFRyZWUuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFN5bWJvbFRyZWVOb2RlID0gcmVxdWlyZV9TeW1ib2xUcmVlTm9kZSgpOwogICAgdmFyIFRyZWVQb3NpdGlvbiA9IHJlcXVpcmVfVHJlZVBvc2l0aW9uKCk7CiAgICB2YXIgVHJlZUl0ZXJhdG9yID0gcmVxdWlyZV9UcmVlSXRlcmF0b3IoKTsKICAgIGZ1bmN0aW9uIHJldHVyblRydWUoKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gcmV2ZXJzZUFycmF5SW5kZXgoYXJyYXksIHJldmVyc2VJbmRleCkgewogICAgICByZXR1cm4gYXJyYXlbYXJyYXkubGVuZ3RoIC0gMSAtIHJldmVyc2VJbmRleF07CiAgICB9CiAgICB2YXIgU3ltYm9sVHJlZSA9IGNsYXNzIHsKICAgICAgLyoqCiAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgKiBAYWxpYXMgbW9kdWxlOnN5bWJvbC10cmVlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb249J1N5bWJvbFRyZWUgZGF0YSddIERlc2NyaXB0aW9uIHVzZWQgZm9yIHRoZSBTeW1ib2wKICAgICAgICovCiAgICAgIGNvbnN0cnVjdG9yKGRlc2NyaXB0aW9uKSB7CiAgICAgICAgdGhpcy5zeW1ib2wgPSBTeW1ib2woZGVzY3JpcHRpb24gfHwgIlN5bWJvbFRyZWUgZGF0YSIpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBZb3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIChvcHRpb25hbGx5KSBpbml0aWFsaXplIGFuIG9iamVjdCByaWdodCBhZnRlciBpdHMgY3JlYXRpb24sCiAgICAgICAqIHRvIHRha2UgYWR2YW50YWdlIG9mIFY4J3MgZmFzdCBwcm9wZXJ0aWVzLiBBbHNvIHVzZWZ1bCBpZiB5b3Ugd291bGQgbGlrZSB0bwogICAgICAgKiBmcmVlemUgeW91ciBvYmplY3QuCiAgICAgICAqCiAgICAgICAqIGBPKDEpYAogICAgICAgKgogICAgICAgKiBAbWV0aG9kCiAgICAgICAqIEBhbGlhcyBtb2R1bGU6c3ltYm9sLXRyZWUjaW5pdGlhbGl6ZQogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gb2JqZWN0CiAgICAgICAqLwogICAgICBpbml0aWFsaXplKG9iamVjdCkgewogICAgICAgIHRoaXMuX25vZGUob2JqZWN0KTsKICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgICB9CiAgICAgIF9ub2RlKG9iamVjdCkgewogICAgICAgIGlmICghb2JqZWN0KSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgY29uc3Qgbm9kZTIgPSBvYmplY3RbdGhpcy5zeW1ib2xdOwogICAgICAgIGlmIChub2RlMikgewogICAgICAgICAgcmV0dXJuIG5vZGUyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb2JqZWN0W3RoaXMuc3ltYm9sXSA9IG5ldyBTeW1ib2xUcmVlTm9kZSgpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0IGhhcyBhbnkgY2hpbGRyZW4uIE90aGVyd2lzZSBpdCByZXR1cm5zIGBmYWxzZWAuCiAgICAgICAqCiAgICAgICAqICogYE8oMSlgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgaGFzQ2hpbGRyZW4KICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdAogICAgICAgKiBAcmV0dXJuIHtCb29sZWFufQogICAgICAgKi8KICAgICAgaGFzQ2hpbGRyZW4ob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX25vZGUob2JqZWN0KS5oYXNDaGlsZHJlbjsKICAgICAgfQogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGdpdmVuIG9iamVjdC4KICAgICAgICoKICAgICAgICogKiBgTygxKWAKICAgICAgICoKICAgICAgICogQG1ldGhvZCBmaXJzdENoaWxkCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHJldHVybiB7T2JqZWN0fQogICAgICAgKi8KICAgICAgZmlyc3RDaGlsZChvYmplY3QpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbm9kZShvYmplY3QpLmZpcnN0Q2hpbGQ7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGxhc3QgY2hpbGQgb2YgdGhlIGdpdmVuIG9iamVjdC4KICAgICAgICoKICAgICAgICogKiBgTygxKWAKICAgICAgICoKICAgICAgICogQG1ldGhvZCBsYXN0Q2hpbGQKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdAogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgICAqLwogICAgICBsYXN0Q2hpbGQob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX25vZGUob2JqZWN0KS5sYXN0Q2hpbGQ7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIHByZXZpb3VzIHNpYmxpbmcgb2YgdGhlIGdpdmVuIG9iamVjdC4KICAgICAgICoKICAgICAgICogKiBgTygxKWAKICAgICAgICoKICAgICAgICogQG1ldGhvZCBwcmV2aW91c1NpYmxpbmcKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdAogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgICAqLwogICAgICBwcmV2aW91c1NpYmxpbmcob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX25vZGUob2JqZWN0KS5wcmV2aW91c1NpYmxpbmc7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIG5leHQgc2libGluZyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgogICAgICAgKgogICAgICAgKiAqIGBPKDEpYAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIG5leHRTaWJsaW5nCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHJldHVybiB7T2JqZWN0fQogICAgICAgKi8KICAgICAgbmV4dFNpYmxpbmcob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX25vZGUob2JqZWN0KS5uZXh0U2libGluZzsKICAgICAgfQogICAgICAvKioKICAgICAgICogUmV0dXJuIHRoZSBwYXJlbnQgb2YgdGhlIGdpdmVuIG9iamVjdC4KICAgICAgICoKICAgICAgICogKiBgTygxKWAKICAgICAgICoKICAgICAgICogQG1ldGhvZCBwYXJlbnQKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdAogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgICAqLwogICAgICBwYXJlbnQob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX25vZGUob2JqZWN0KS5wYXJlbnQ7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEZpbmQgdGhlIGluY2x1c2l2ZSBkZXNjZW5kYW50IHRoYXQgaXMgbGFzdCBpbiB0cmVlIG9yZGVyIG9mIHRoZSBnaXZlbiBvYmplY3QuCiAgICAgICAqCiAgICAgICAqICogYE8obilgICh3b3JzdCBjYXNlKSB3aGVyZSBgbmAgaXMgdGhlIGRlcHRoIG9mIHRoZSBzdWJ0cmVlIG9mIGBvYmplY3RgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgbGFzdEluY2x1c2l2ZURlc2NlbmRhbnQKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdAogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICAgICAqLwogICAgICBsYXN0SW5jbHVzaXZlRGVzY2VuZGFudChvYmplY3QpIHsKICAgICAgICBsZXQgbGFzdENoaWxkOwogICAgICAgIGxldCBjdXJyZW50ID0gb2JqZWN0OwogICAgICAgIHdoaWxlIChsYXN0Q2hpbGQgPSB0aGlzLl9ub2RlKGN1cnJlbnQpLmxhc3RDaGlsZCkgewogICAgICAgICAgY3VycmVudCA9IGxhc3RDaGlsZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEZpbmQgdGhlIHByZWNlZGluZyBvYmplY3QgKEEpIG9mIHRoZSBnaXZlbiBvYmplY3QgKEIpLgogICAgICAgKiBBbiBvYmplY3QgQSBpcyBwcmVjZWRpbmcgYW4gb2JqZWN0IEIgaWYgQSBhbmQgQiBhcmUgaW4gdGhlIHNhbWUgdHJlZQogICAgICAgKiBhbmQgQSBjb21lcyBiZWZvcmUgQiBpbiB0cmVlIG9yZGVyLgogICAgICAgKgogICAgICAgKiAqIGBPKG4pYCAod29yc3QgY2FzZSkKICAgICAgICogKiBgTygxKWAgKGFtb3J0aXplZCB3aGVuIHdhbGtpbmcgdGhlIGVudGlyZSB0cmVlKQogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHByZWNlZGluZwogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnJvb3RdIElmIHNldCwgYHJvb3RgIG11c3QgYmUgYW4gaW5jbHVzaXZlIGFuY2VzdG9yCiAgICAgICAqICAgICAgICBvZiB0aGUgcmV0dXJuIHZhbHVlIChvciBlbHNlIG51bGwgaXMgcmV0dXJuZWQpLiBUaGlzIGNoZWNrIF9hc3N1bWVzXwogICAgICAgKiAgICAgICAgdGhhdCBgcm9vdGAgaXMgYWxzbyBhbiBpbmNsdXNpdmUgYW5jZXN0b3Igb2YgdGhlIGdpdmVuIGBvYmplY3RgCiAgICAgICAqIEByZXR1cm4gez9PYmplY3R9CiAgICAgICAqLwogICAgICBwcmVjZWRpbmcob2JqZWN0LCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgdHJlZVJvb3QgPSBvcHRpb25zICYmIG9wdGlvbnMucm9vdDsKICAgICAgICBpZiAob2JqZWN0ID09PSB0cmVlUm9vdCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHByZXZpb3VzU2libGluZyA9IHRoaXMuX25vZGUob2JqZWN0KS5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgaWYgKHByZXZpb3VzU2libGluZykgewogICAgICAgICAgcmV0dXJuIHRoaXMubGFzdEluY2x1c2l2ZURlc2NlbmRhbnQocHJldmlvdXNTaWJsaW5nKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX25vZGUob2JqZWN0KS5wYXJlbnQ7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEZpbmQgdGhlIGZvbGxvd2luZyBvYmplY3QgKEEpIG9mIHRoZSBnaXZlbiBvYmplY3QgKEIpLgogICAgICAgKiBBbiBvYmplY3QgQSBpcyBmb2xsb3dpbmcgYW4gb2JqZWN0IEIgaWYgQSBhbmQgQiBhcmUgaW4gdGhlIHNhbWUgdHJlZQogICAgICAgKiBhbmQgQSBjb21lcyBhZnRlciBCIGluIHRyZWUgb3JkZXIuCiAgICAgICAqCiAgICAgICAqICogYE8obilgICh3b3JzdCBjYXNlKSB3aGVyZSBgbmAgaXMgdGhlIGFtb3VudCBvZiBvYmplY3RzIGluIHRoZSBlbnRpcmUgdHJlZQogICAgICAgKiAqIGBPKDEpYCAoYW1vcnRpemVkIHdoZW4gd2Fsa2luZyB0aGUgZW50aXJlIHRyZWUpCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgZm9sbG93aW5nCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gb2JqZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnJvb3RdIElmIHNldCwgYHJvb3RgIG11c3QgYmUgYW4gaW5jbHVzaXZlIGFuY2VzdG9yCiAgICAgICAqICAgICAgICBvZiB0aGUgcmV0dXJuIHZhbHVlIChvciBlbHNlIG51bGwgaXMgcmV0dXJuZWQpLiBUaGlzIGNoZWNrIF9hc3N1bWVzXwogICAgICAgKiAgICAgICAgdGhhdCBgcm9vdGAgaXMgYWxzbyBhbiBpbmNsdXNpdmUgYW5jZXN0b3Igb2YgdGhlIGdpdmVuIGBvYmplY3RgCiAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2tpcENoaWxkcmVuPWZhbHNlXSBJZiBzZXQsIGlnbm9yZSB0aGUgY2hpbGRyZW4gb2YgYG9iamVjdGAKICAgICAgICogQHJldHVybiB7P09iamVjdH0KICAgICAgICovCiAgICAgIGZvbGxvd2luZyhvYmplY3QsIG9wdGlvbnMpIHsKICAgICAgICBjb25zdCB0cmVlUm9vdCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5yb290OwogICAgICAgIGNvbnN0IHNraXBDaGlsZHJlbiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5za2lwQ2hpbGRyZW47CiAgICAgICAgY29uc3QgZmlyc3RDaGlsZCA9ICFza2lwQ2hpbGRyZW4gJiYgdGhpcy5fbm9kZShvYmplY3QpLmZpcnN0Q2hpbGQ7CiAgICAgICAgaWYgKGZpcnN0Q2hpbGQpIHsKICAgICAgICAgIHJldHVybiBmaXJzdENoaWxkOwogICAgICAgIH0KICAgICAgICBsZXQgY3VycmVudCA9IG9iamVjdDsKICAgICAgICBkbyB7CiAgICAgICAgICBpZiAoY3VycmVudCA9PT0gdHJlZVJvb3QpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IHRoaXMuX25vZGUoY3VycmVudCkubmV4dFNpYmxpbmc7CiAgICAgICAgICBpZiAobmV4dFNpYmxpbmcpIHsKICAgICAgICAgICAgcmV0dXJuIG5leHRTaWJsaW5nOwogICAgICAgICAgfQogICAgICAgICAgY3VycmVudCA9IHRoaXMuX25vZGUoY3VycmVudCkucGFyZW50OwogICAgICAgIH0gd2hpbGUgKGN1cnJlbnQpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBBcHBlbmQgYWxsIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBvYmplY3QgdG8gYW4gYXJyYXkuCiAgICAgICAqCiAgICAgICAqICogYE8obilgIHdoZXJlIGBuYCBpcyB0aGUgYW1vdW50IG9mIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBgcGFyZW50YAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGNoaWxkcmVuVG9BcnJheQogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgICAgICogQHBhcmFtIHtPYmplY3RbXX0gW29wdGlvbnMuYXJyYXk9W11dCiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmZpbHRlcl0gRnVuY3Rpb24gdG8gdGVzdCBlYWNoIG9iamVjdCBiZWZvcmUgaXQgaXMgYWRkZWQgdG8gdGhlIGFycmF5LgogICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZva2VkIHdpdGggYXJndW1lbnRzIChvYmplY3QpLiBTaG91bGQgcmV0dXJuIGB0cnVlYCBpZiBhbiBvYmplY3QKICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdG8gYmUgaW5jbHVkZWQuCiAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnMudGhpc0FyZ10gVmFsdWUgdG8gdXNlIGFzIGB0aGlzYCB3aGVuIGV4ZWN1dGluZyBgZmlsdGVyYC4KICAgICAgICogQHJldHVybiB7T2JqZWN0W119CiAgICAgICAqLwogICAgICBjaGlsZHJlblRvQXJyYXkocGFyZW50LCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgYXJyYXkgPSBvcHRpb25zICYmIG9wdGlvbnMuYXJyYXkgfHwgW107CiAgICAgICAgY29uc3QgZmlsdGVyMiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5maWx0ZXIgfHwgcmV0dXJuVHJ1ZTsKICAgICAgICBjb25zdCB0aGlzQXJnID0gb3B0aW9ucyAmJiBvcHRpb25zLnRoaXNBcmcgfHwgdm9pZCAwOwogICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9ub2RlKHBhcmVudCk7CiAgICAgICAgbGV0IG9iamVjdCA9IHBhcmVudE5vZGUuZmlyc3RDaGlsZDsKICAgICAgICBsZXQgaW5kZXgyID0gMDsKICAgICAgICB3aGlsZSAob2JqZWN0KSB7CiAgICAgICAgICBjb25zdCBub2RlMiA9IHRoaXMuX25vZGUob2JqZWN0KTsKICAgICAgICAgIG5vZGUyLnNldENhY2hlZEluZGV4KHBhcmVudE5vZGUsIGluZGV4Mik7CiAgICAgICAgICBpZiAoZmlsdGVyMi5jYWxsKHRoaXNBcmcsIG9iamVjdCkpIHsKICAgICAgICAgICAgYXJyYXkucHVzaChvYmplY3QpOwogICAgICAgICAgfQogICAgICAgICAgb2JqZWN0ID0gbm9kZTIubmV4dFNpYmxpbmc7CiAgICAgICAgICArK2luZGV4MjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBBcHBlbmQgYWxsIGluY2x1c2l2ZSBhbmNlc3RvcnMgb2YgdGhlIGdpdmVuIG9iamVjdCB0byBhbiBhcnJheS4KICAgICAgICoKICAgICAgICogKiBgTyhuKWAgd2hlcmUgYG5gIGlzIHRoZSBhbW91bnQgb2YgYW5jZXN0b3JzIG9mIHRoZSBnaXZlbiBgb2JqZWN0YAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGFuY2VzdG9yc1RvQXJyYXkKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0W119IFtvcHRpb25zLmFycmF5PVtdXQogICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5maWx0ZXJdIEZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBvYmplY3QgYmVmb3JlIGl0IGlzIGFkZGVkIHRvIHRoZSBhcnJheS4KICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52b2tlZCB3aXRoIGFyZ3VtZW50cyAob2JqZWN0KS4gU2hvdWxkIHJldHVybiBgdHJ1ZWAgaWYgYW4gb2JqZWN0CiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRvIGJlIGluY2x1ZGVkLgogICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zLnRoaXNBcmddIFZhbHVlIHRvIHVzZSBhcyBgdGhpc2Agd2hlbiBleGVjdXRpbmcgYGZpbHRlcmAuCiAgICAgICAqIEByZXR1cm4ge09iamVjdFtdfQogICAgICAgKi8KICAgICAgYW5jZXN0b3JzVG9BcnJheShvYmplY3QsIG9wdGlvbnMpIHsKICAgICAgICBjb25zdCBhcnJheSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5hcnJheSB8fCBbXTsKICAgICAgICBjb25zdCBmaWx0ZXIyID0gb3B0aW9ucyAmJiBvcHRpb25zLmZpbHRlciB8fCByZXR1cm5UcnVlOwogICAgICAgIGNvbnN0IHRoaXNBcmcgPSBvcHRpb25zICYmIG9wdGlvbnMudGhpc0FyZyB8fCB2b2lkIDA7CiAgICAgICAgbGV0IGFuY2VzdG9yID0gb2JqZWN0OwogICAgICAgIHdoaWxlIChhbmNlc3RvcikgewogICAgICAgICAgaWYgKGZpbHRlcjIuY2FsbCh0aGlzQXJnLCBhbmNlc3RvcikpIHsKICAgICAgICAgICAgYXJyYXkucHVzaChhbmNlc3Rvcik7CiAgICAgICAgICB9CiAgICAgICAgICBhbmNlc3RvciA9IHRoaXMuX25vZGUoYW5jZXN0b3IpLnBhcmVudDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBBcHBlbmQgYWxsIGRlc2NlbmRhbnRzIG9mIHRoZSBnaXZlbiBvYmplY3QgdG8gYW4gYXJyYXkgKGluIHRyZWUgb3JkZXIpLgogICAgICAgKgogICAgICAgKiAqIGBPKG4pYCB3aGVyZSBgbmAgaXMgdGhlIGFtb3VudCBvZiBvYmplY3RzIGluIHRoZSBzdWItdHJlZSBvZiB0aGUgZ2l2ZW4gYG9iamVjdGAKICAgICAgICoKICAgICAgICogQG1ldGhvZCB0cmVlVG9BcnJheQogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcm9vdAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0W119IFtvcHRpb25zLmFycmF5PVtdXQogICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5maWx0ZXJdIEZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBvYmplY3QgYmVmb3JlIGl0IGlzIGFkZGVkIHRvIHRoZSBhcnJheS4KICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52b2tlZCB3aXRoIGFyZ3VtZW50cyAob2JqZWN0KS4gU2hvdWxkIHJldHVybiBgdHJ1ZWAgaWYgYW4gb2JqZWN0CiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRvIGJlIGluY2x1ZGVkLgogICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zLnRoaXNBcmddIFZhbHVlIHRvIHVzZSBhcyBgdGhpc2Agd2hlbiBleGVjdXRpbmcgYGZpbHRlcmAuCiAgICAgICAqIEByZXR1cm4ge09iamVjdFtdfQogICAgICAgKi8KICAgICAgdHJlZVRvQXJyYXkocm9vdDYsIG9wdGlvbnMpIHsKICAgICAgICBjb25zdCBhcnJheSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5hcnJheSB8fCBbXTsKICAgICAgICBjb25zdCBmaWx0ZXIyID0gb3B0aW9ucyAmJiBvcHRpb25zLmZpbHRlciB8fCByZXR1cm5UcnVlOwogICAgICAgIGNvbnN0IHRoaXNBcmcgPSBvcHRpb25zICYmIG9wdGlvbnMudGhpc0FyZyB8fCB2b2lkIDA7CiAgICAgICAgbGV0IG9iamVjdCA9IHJvb3Q2OwogICAgICAgIHdoaWxlIChvYmplY3QpIHsKICAgICAgICAgIGlmIChmaWx0ZXIyLmNhbGwodGhpc0FyZywgb2JqZWN0KSkgewogICAgICAgICAgICBhcnJheS5wdXNoKG9iamVjdCk7CiAgICAgICAgICB9CiAgICAgICAgICBvYmplY3QgPSB0aGlzLmZvbGxvd2luZyhvYmplY3QsIHsgcm9vdDogcm9vdDYgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfQogICAgICAvKioKICAgICAgICogSXRlcmF0ZSBvdmVyIGFsbCBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gb2JqZWN0CiAgICAgICAqCiAgICAgICAqICogYE8oMSlgIGZvciBhIHNpbmdsZSBpdGVyYXRpb24KICAgICAgICoKICAgICAgICogQG1ldGhvZCBjaGlsZHJlbkl0ZXJhdG9yCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnQKICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJldmVyc2U9ZmFsc2VdCiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gQW4gaXRlcmFibGUgaXRlcmF0b3IgKEVTNikKICAgICAgICovCiAgICAgIGNoaWxkcmVuSXRlcmF0b3IocGFyZW50LCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgcmV2ZXJzZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5yZXZlcnNlOwogICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9ub2RlKHBhcmVudCk7CiAgICAgICAgcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3IoCiAgICAgICAgICB0aGlzLAogICAgICAgICAgcGFyZW50LAogICAgICAgICAgcmV2ZXJzZSA/IHBhcmVudE5vZGUubGFzdENoaWxkIDogcGFyZW50Tm9kZS5maXJzdENoaWxkLAogICAgICAgICAgcmV2ZXJzZSA/IFRyZWVJdGVyYXRvci5QUkVWIDogVHJlZUl0ZXJhdG9yLk5FWFQKICAgICAgICApOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSBwcmV2aW91cyBzaWJsaW5ncyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LiAoaW4gcmV2ZXJzZSB0cmVlIG9yZGVyKQogICAgICAgKgogICAgICAgKiAqIGBPKDEpYCBmb3IgYSBzaW5nbGUgaXRlcmF0aW9uCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgcHJldmlvdXNTaWJsaW5nc0l0ZXJhdG9yCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHJldHVybiB7T2JqZWN0fSBBbiBpdGVyYWJsZSBpdGVyYXRvciAoRVM2KQogICAgICAgKi8KICAgICAgcHJldmlvdXNTaWJsaW5nc0l0ZXJhdG9yKG9iamVjdCkgewogICAgICAgIHJldHVybiBuZXcgVHJlZUl0ZXJhdG9yKAogICAgICAgICAgdGhpcywKICAgICAgICAgIG9iamVjdCwKICAgICAgICAgIHRoaXMuX25vZGUob2JqZWN0KS5wcmV2aW91c1NpYmxpbmcsCiAgICAgICAgICBUcmVlSXRlcmF0b3IuUFJFVgogICAgICAgICk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIG5leHQgc2libGluZ3Mgb2YgdGhlIGdpdmVuIG9iamVjdC4gKGluIHRyZWUgb3JkZXIpCiAgICAgICAqCiAgICAgICAqICogYE8oMSlgIGZvciBhIHNpbmdsZSBpdGVyYXRpb24KICAgICAgICoKICAgICAgICogQG1ldGhvZCBuZXh0U2libGluZ3NJdGVyYXRvcgogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gQW4gaXRlcmFibGUgaXRlcmF0b3IgKEVTNikKICAgICAgICovCiAgICAgIG5leHRTaWJsaW5nc0l0ZXJhdG9yKG9iamVjdCkgewogICAgICAgIHJldHVybiBuZXcgVHJlZUl0ZXJhdG9yKAogICAgICAgICAgdGhpcywKICAgICAgICAgIG9iamVjdCwKICAgICAgICAgIHRoaXMuX25vZGUob2JqZWN0KS5uZXh0U2libGluZywKICAgICAgICAgIFRyZWVJdGVyYXRvci5ORVhUCiAgICAgICAgKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogSXRlcmF0ZSBvdmVyIGFsbCBpbmNsdXNpdmUgYW5jZXN0b3JzIG9mIHRoZSBnaXZlbiBvYmplY3QKICAgICAgICoKICAgICAgICogKiBgTygxKWAgZm9yIGEgc2luZ2xlIGl0ZXJhdGlvbgogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGFuY2VzdG9yc0l0ZXJhdG9yCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICAgICAgICogQHJldHVybiB7T2JqZWN0fSBBbiBpdGVyYWJsZSBpdGVyYXRvciAoRVM2KQogICAgICAgKi8KICAgICAgYW5jZXN0b3JzSXRlcmF0b3Iob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3IoCiAgICAgICAgICB0aGlzLAogICAgICAgICAgb2JqZWN0LAogICAgICAgICAgb2JqZWN0LAogICAgICAgICAgVHJlZUl0ZXJhdG9yLlBBUkVOVAogICAgICAgICk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEl0ZXJhdGUgb3ZlciBhbGwgZGVzY2VuZGFudHMgb2YgdGhlIGdpdmVuIG9iamVjdCAoaW4gdHJlZSBvcmRlcikuCiAgICAgICAqCiAgICAgICAqIFdoZXJlIGBuYCBpcyB0aGUgYW1vdW50IG9mIG9iamVjdHMgaW4gdGhlIHN1Yi10cmVlIG9mIHRoZSBnaXZlbiBgcm9vdGA6CiAgICAgICAqCiAgICAgICAqICogYE8obilgICh3b3JzdCBjYXNlIGZvciBhIHNpbmdsZSBpdGVyYXRpb24pCiAgICAgICAqICogYE8obilgIChhbW9ydGl6ZWQsIHdoZW4gY29tcGxldGluZyB0aGUgaXRlcmF0b3IpCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgdHJlZUl0ZXJhdG9yCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByb290CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmV2ZXJzZT1mYWxzZV0KICAgICAgICogQHJldHVybiB7T2JqZWN0fSBBbiBpdGVyYWJsZSBpdGVyYXRvciAoRVM2KQogICAgICAgKi8KICAgICAgdHJlZUl0ZXJhdG9yKHJvb3Q2LCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgcmV2ZXJzZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5yZXZlcnNlOwogICAgICAgIHJldHVybiBuZXcgVHJlZUl0ZXJhdG9yKAogICAgICAgICAgdGhpcywKICAgICAgICAgIHJvb3Q2LAogICAgICAgICAgcmV2ZXJzZSA/IHRoaXMubGFzdEluY2x1c2l2ZURlc2NlbmRhbnQocm9vdDYpIDogcm9vdDYsCiAgICAgICAgICByZXZlcnNlID8gVHJlZUl0ZXJhdG9yLlBSRUNFRElORyA6IFRyZWVJdGVyYXRvci5GT0xMT1dJTkcKICAgICAgICApOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBGaW5kIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gb2JqZWN0ICh0aGUgbnVtYmVyIG9mIHByZWNlZGluZyBzaWJsaW5ncykuCiAgICAgICAqCiAgICAgICAqICogYE8obilgIHdoZXJlIGBuYCBpcyB0aGUgYW1vdW50IG9mIHByZWNlZGluZyBzaWJsaW5ncwogICAgICAgKiAqIGBPKDEpYCAoYW1vcnRpemVkLCBpZiB0aGUgdHJlZSBpcyBub3QgbW9kaWZpZWQpCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgaW5kZXgKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNoaWxkCiAgICAgICAqIEByZXR1cm4ge051bWJlcn0gVGhlIG51bWJlciBvZiBwcmVjZWRpbmcgc2libGluZ3MsIG9yIC0xIGlmIHRoZSBvYmplY3QgaGFzIG5vIHBhcmVudAogICAgICAgKi8KICAgICAgaW5kZXgoY2hpbGQpIHsKICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSB0aGlzLl9ub2RlKGNoaWxkKTsKICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fbm9kZShjaGlsZE5vZGUucGFyZW50KTsKICAgICAgICBpZiAoIXBhcmVudE5vZGUpIHsKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgbGV0IGN1cnJlbnRJbmRleCA9IGNoaWxkTm9kZS5nZXRDYWNoZWRJbmRleChwYXJlbnROb2RlKTsKICAgICAgICBpZiAoY3VycmVudEluZGV4ID49IDApIHsKICAgICAgICAgIHJldHVybiBjdXJyZW50SW5kZXg7CiAgICAgICAgfQogICAgICAgIGN1cnJlbnRJbmRleCA9IDA7CiAgICAgICAgbGV0IG9iamVjdCA9IHBhcmVudE5vZGUuZmlyc3RDaGlsZDsKICAgICAgICBpZiAocGFyZW50Tm9kZS5jaGlsZEluZGV4Q2FjaGVkVXBUbykgewogICAgICAgICAgY29uc3QgY2FjaGVkVXBUb05vZGUgPSB0aGlzLl9ub2RlKHBhcmVudE5vZGUuY2hpbGRJbmRleENhY2hlZFVwVG8pOwogICAgICAgICAgb2JqZWN0ID0gY2FjaGVkVXBUb05vZGUubmV4dFNpYmxpbmc7CiAgICAgICAgICBjdXJyZW50SW5kZXggPSBjYWNoZWRVcFRvTm9kZS5nZXRDYWNoZWRJbmRleChwYXJlbnROb2RlKSArIDE7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChvYmplY3QpIHsKICAgICAgICAgIGNvbnN0IG5vZGUyID0gdGhpcy5fbm9kZShvYmplY3QpOwogICAgICAgICAgbm9kZTIuc2V0Q2FjaGVkSW5kZXgocGFyZW50Tm9kZSwgY3VycmVudEluZGV4KTsKICAgICAgICAgIGlmIChvYmplY3QgPT09IGNoaWxkKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgKytjdXJyZW50SW5kZXg7CiAgICAgICAgICBvYmplY3QgPSBub2RlMi5uZXh0U2libGluZzsKICAgICAgICB9CiAgICAgICAgcGFyZW50Tm9kZS5jaGlsZEluZGV4Q2FjaGVkVXBUbyA9IGNoaWxkOwogICAgICAgIHJldHVybiBjdXJyZW50SW5kZXg7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuLgogICAgICAgKgogICAgICAgKiAqIGBPKG4pYCB3aGVyZSBgbmAgaXMgdGhlIGFtb3VudCBvZiBjaGlsZHJlbgogICAgICAgKiAqIGBPKDEpYCAoYW1vcnRpemVkLCBpZiB0aGUgdHJlZSBpcyBub3QgbW9kaWZpZWQpCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgY2hpbGRyZW5Db3VudAogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50CiAgICAgICAqIEByZXR1cm4ge051bWJlcn0KICAgICAgICovCiAgICAgIGNoaWxkcmVuQ291bnQocGFyZW50KSB7CiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX25vZGUocGFyZW50KTsKICAgICAgICBpZiAoIXBhcmVudE5vZGUubGFzdENoaWxkKSB7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXgocGFyZW50Tm9kZS5sYXN0Q2hpbGQpICsgMTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQ29tcGFyZSB0aGUgcG9zaXRpb24gb2YgYW4gb2JqZWN0IHJlbGF0aXZlIHRvIGFub3RoZXIgb2JqZWN0LiBBIGJpdCBzZXQgaXMgcmV0dXJuZWQ6CiAgICAgICAqCiAgICAgICAqIDx1bD4KICAgICAgICogICAgIDxsaT5ESVNDT05ORUNURUQgOiAxPC9saT4KICAgICAgICogICAgIDxsaT5QUkVDRURJTkcgOiAyPC9saT4KICAgICAgICogICAgIDxsaT5GT0xMT1dJTkcgOiA0PC9saT4KICAgICAgICogICAgIDxsaT5DT05UQUlOUyA6IDg8L2xpPgogICAgICAgKiAgICAgPGxpPkNPTlRBSU5FRF9CWSA6IDE2PC9saT4KICAgICAgICogPC91bD4KICAgICAgICoKICAgICAgICogVGhlIHNlbWFudGljcyBhcmUgdGhlIHNhbWUgYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb24gaW4gRE9NLCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdAogICAgICAgKiBESVNDT05ORUNURUQgbmV2ZXIgb2NjdXJzIHdpdGggYW55IG90aGVyIGJpdC4KICAgICAgICoKICAgICAgICogd2hlcmUgYG5gIGFuZCBgbWAgYXJlIHRoZSBhbW91bnQgb2YgYW5jZXN0b3JzIG9mIGBsZWZ0YCBhbmQgYHJpZ2h0YDsKICAgICAgICogd2hlcmUgYG9gIGlzIHRoZSBhbW91bnQgb2YgY2hpbGRyZW4gb2YgdGhlIGxvd2VzdCBjb21tb24gYW5jZXN0b3Igb2YgYGxlZnRgIGFuZCBgcmlnaHRgOgogICAgICAgKgogICAgICAgKiAqIGBPKG4gKyBtICsgbylgICh3b3JzdCBjYXNlKQogICAgICAgKiAqIGBPKG4gKyBtKWAgKGFtb3J0aXplZCwgaWYgdGhlIHRyZWUgaXMgbm90IG1vZGlmaWVkKQogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGNvbXBhcmVUcmVlUG9zaXRpb24KICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IGxlZnQKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJpZ2h0CiAgICAgICAqIEByZXR1cm4ge051bWJlcn0KICAgICAgICovCiAgICAgIGNvbXBhcmVUcmVlUG9zaXRpb24obGVmdCwgcmlnaHQpIHsKICAgICAgICBpZiAobGVmdCA9PT0gcmlnaHQpIHsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBjb25zdCBsZWZ0QW5jZXN0b3JzID0gW107CiAgICAgICAgewogICAgICAgICAgbGV0IGxlZnRBbmNlc3RvciA9IGxlZnQ7CiAgICAgICAgICB3aGlsZSAobGVmdEFuY2VzdG9yKSB7CiAgICAgICAgICAgIGlmIChsZWZ0QW5jZXN0b3IgPT09IHJpZ2h0KSB7CiAgICAgICAgICAgICAgcmV0dXJuIFRyZWVQb3NpdGlvbi5DT05UQUlOUyB8IFRyZWVQb3NpdGlvbi5QUkVDRURJTkc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGVmdEFuY2VzdG9ycy5wdXNoKGxlZnRBbmNlc3Rvcik7CiAgICAgICAgICAgIGxlZnRBbmNlc3RvciA9IHRoaXMucGFyZW50KGxlZnRBbmNlc3Rvcik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJpZ2h0QW5jZXN0b3JzID0gW107CiAgICAgICAgewogICAgICAgICAgbGV0IHJpZ2h0QW5jZXN0b3IgPSByaWdodDsKICAgICAgICAgIHdoaWxlIChyaWdodEFuY2VzdG9yKSB7CiAgICAgICAgICAgIGlmIChyaWdodEFuY2VzdG9yID09PSBsZWZ0KSB7CiAgICAgICAgICAgICAgcmV0dXJuIFRyZWVQb3NpdGlvbi5DT05UQUlORURfQlkgfCBUcmVlUG9zaXRpb24uRk9MTE9XSU5HOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJpZ2h0QW5jZXN0b3JzLnB1c2gocmlnaHRBbmNlc3Rvcik7CiAgICAgICAgICAgIHJpZ2h0QW5jZXN0b3IgPSB0aGlzLnBhcmVudChyaWdodEFuY2VzdG9yKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3Qgcm9vdDYgPSByZXZlcnNlQXJyYXlJbmRleChsZWZ0QW5jZXN0b3JzLCAwKTsKICAgICAgICBpZiAoIXJvb3Q2IHx8IHJvb3Q2ICE9PSByZXZlcnNlQXJyYXlJbmRleChyaWdodEFuY2VzdG9ycywgMCkpIHsKICAgICAgICAgIHJldHVybiBUcmVlUG9zaXRpb24uRElTQ09OTkVDVEVEOwogICAgICAgIH0KICAgICAgICBsZXQgY29tbW9uQW5jZXN0b3JJbmRleCA9IDA7CiAgICAgICAgY29uc3QgYW5jZXN0b3JzTWluTGVuZ3RoID0gTWF0aC5taW4obGVmdEFuY2VzdG9ycy5sZW5ndGgsIHJpZ2h0QW5jZXN0b3JzLmxlbmd0aCk7CiAgICAgICAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgYW5jZXN0b3JzTWluTGVuZ3RoOyArK2kxMSkgewogICAgICAgICAgY29uc3QgbGVmdEFuY2VzdG9yID0gcmV2ZXJzZUFycmF5SW5kZXgobGVmdEFuY2VzdG9ycywgaTExKTsKICAgICAgICAgIGNvbnN0IHJpZ2h0QW5jZXN0b3IgPSByZXZlcnNlQXJyYXlJbmRleChyaWdodEFuY2VzdG9ycywgaTExKTsKICAgICAgICAgIGlmIChsZWZ0QW5jZXN0b3IgIT09IHJpZ2h0QW5jZXN0b3IpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjb21tb25BbmNlc3RvckluZGV4ID0gaTExOwogICAgICAgIH0KICAgICAgICBjb25zdCBsZWZ0SW5kZXggPSB0aGlzLmluZGV4KHJldmVyc2VBcnJheUluZGV4KGxlZnRBbmNlc3RvcnMsIGNvbW1vbkFuY2VzdG9ySW5kZXggKyAxKSk7CiAgICAgICAgY29uc3QgcmlnaHRJbmRleCA9IHRoaXMuaW5kZXgocmV2ZXJzZUFycmF5SW5kZXgocmlnaHRBbmNlc3RvcnMsIGNvbW1vbkFuY2VzdG9ySW5kZXggKyAxKSk7CiAgICAgICAgcmV0dXJuIHJpZ2h0SW5kZXggPCBsZWZ0SW5kZXggPyBUcmVlUG9zaXRpb24uUFJFQ0VESU5HIDogVHJlZVBvc2l0aW9uLkZPTExPV0lORzsKICAgICAgfQogICAgICAvKioKICAgICAgICogUmVtb3ZlIHRoZSBvYmplY3QgZnJvbSB0aGlzIHRyZWUuCiAgICAgICAqIEhhcyBubyBlZmZlY3QgaWYgYWxyZWFkeSByZW1vdmVkLgogICAgICAgKgogICAgICAgKiAqIGBPKDEpYAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHJlbW92ZQogICAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOnN5bWJvbC10cmVlIwogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVtb3ZlT2JqZWN0CiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gcmVtb3ZlT2JqZWN0CiAgICAgICAqLwogICAgICByZW1vdmUocmVtb3ZlT2JqZWN0KSB7CiAgICAgICAgY29uc3QgcmVtb3ZlTm9kZSA9IHRoaXMuX25vZGUocmVtb3ZlT2JqZWN0KTsKICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fbm9kZShyZW1vdmVOb2RlLnBhcmVudCk7CiAgICAgICAgY29uc3QgcHJldk5vZGUgPSB0aGlzLl9ub2RlKHJlbW92ZU5vZGUucHJldmlvdXNTaWJsaW5nKTsKICAgICAgICBjb25zdCBuZXh0Tm9kZSA9IHRoaXMuX25vZGUocmVtb3ZlTm9kZS5uZXh0U2libGluZyk7CiAgICAgICAgaWYgKHBhcmVudE5vZGUpIHsKICAgICAgICAgIGlmIChwYXJlbnROb2RlLmZpcnN0Q2hpbGQgPT09IHJlbW92ZU9iamVjdCkgewogICAgICAgICAgICBwYXJlbnROb2RlLmZpcnN0Q2hpbGQgPSByZW1vdmVOb2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHBhcmVudE5vZGUubGFzdENoaWxkID09PSByZW1vdmVPYmplY3QpIHsKICAgICAgICAgICAgcGFyZW50Tm9kZS5sYXN0Q2hpbGQgPSByZW1vdmVOb2RlLnByZXZpb3VzU2libGluZzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHByZXZOb2RlKSB7CiAgICAgICAgICBwcmV2Tm9kZS5uZXh0U2libGluZyA9IHJlbW92ZU5vZGUubmV4dFNpYmxpbmc7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0Tm9kZSkgewogICAgICAgICAgbmV4dE5vZGUucHJldmlvdXNTaWJsaW5nID0gcmVtb3ZlTm9kZS5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgfQogICAgICAgIHJlbW92ZU5vZGUucGFyZW50ID0gbnVsbDsKICAgICAgICByZW1vdmVOb2RlLnByZXZpb3VzU2libGluZyA9IG51bGw7CiAgICAgICAgcmVtb3ZlTm9kZS5uZXh0U2libGluZyA9IG51bGw7CiAgICAgICAgcmVtb3ZlTm9kZS5jYWNoZWRJbmRleCA9IC0xOwogICAgICAgIHJlbW92ZU5vZGUuY2FjaGVkSW5kZXhWZXJzaW9uID0gTmFOOwogICAgICAgIGlmIChwYXJlbnROb2RlKSB7CiAgICAgICAgICBwYXJlbnROb2RlLmNoaWxkcmVuQ2hhbmdlZCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVtb3ZlT2JqZWN0OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJbnNlcnQgdGhlIGdpdmVuIG9iamVjdCBiZWZvcmUgdGhlIHJlZmVyZW5jZSBvYmplY3QuCiAgICAgICAqIGBuZXdPYmplY3RgIGlzIG5vdyB0aGUgcHJldmlvdXMgc2libGluZyBvZiBgcmVmZXJlbmNlT2JqZWN0YC4KICAgICAgICoKICAgICAgICogKiBgTygxKWAKICAgICAgICoKICAgICAgICogQG1ldGhvZCBpbnNlcnRCZWZvcmUKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlZmVyZW5jZU9iamVjdAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmV3T2JqZWN0CiAgICAgICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgbmV3T2JqZWN0IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIFN5bWJvbFRyZWUKICAgICAgICogQHJldHVybiB7T2JqZWN0fSBuZXdPYmplY3QKICAgICAgICovCiAgICAgIGluc2VydEJlZm9yZShyZWZlcmVuY2VPYmplY3QsIG5ld09iamVjdCkgewogICAgICAgIGNvbnN0IHJlZmVyZW5jZU5vZGUgPSB0aGlzLl9ub2RlKHJlZmVyZW5jZU9iamVjdCk7CiAgICAgICAgY29uc3QgcHJldk5vZGUgPSB0aGlzLl9ub2RlKHJlZmVyZW5jZU5vZGUucHJldmlvdXNTaWJsaW5nKTsKICAgICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy5fbm9kZShuZXdPYmplY3QpOwogICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9ub2RlKHJlZmVyZW5jZU5vZGUucGFyZW50KTsKICAgICAgICBpZiAobmV3Tm9kZS5pc0F0dGFjaGVkKSB7CiAgICAgICAgICB0aHJvdyBFcnJvcigiR2l2ZW4gb2JqZWN0IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIFN5bWJvbFRyZWUsIHJlbW92ZSBpdCBmaXJzdCIpOwogICAgICAgIH0KICAgICAgICBuZXdOb2RlLnBhcmVudCA9IHJlZmVyZW5jZU5vZGUucGFyZW50OwogICAgICAgIG5ld05vZGUucHJldmlvdXNTaWJsaW5nID0gcmVmZXJlbmNlTm9kZS5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgbmV3Tm9kZS5uZXh0U2libGluZyA9IHJlZmVyZW5jZU9iamVjdDsKICAgICAgICByZWZlcmVuY2VOb2RlLnByZXZpb3VzU2libGluZyA9IG5ld09iamVjdDsKICAgICAgICBpZiAocHJldk5vZGUpIHsKICAgICAgICAgIHByZXZOb2RlLm5leHRTaWJsaW5nID0gbmV3T2JqZWN0OwogICAgICAgIH0KICAgICAgICBpZiAocGFyZW50Tm9kZSAmJiBwYXJlbnROb2RlLmZpcnN0Q2hpbGQgPT09IHJlZmVyZW5jZU9iamVjdCkgewogICAgICAgICAgcGFyZW50Tm9kZS5maXJzdENoaWxkID0gbmV3T2JqZWN0OwogICAgICAgIH0KICAgICAgICBpZiAocGFyZW50Tm9kZSkgewogICAgICAgICAgcGFyZW50Tm9kZS5jaGlsZHJlbkNoYW5nZWQoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ld09iamVjdDsKICAgICAgfQogICAgICAvKioKICAgICAgICogSW5zZXJ0IHRoZSBnaXZlbiBvYmplY3QgYWZ0ZXIgdGhlIHJlZmVyZW5jZSBvYmplY3QuCiAgICAgICAqIGBuZXdPYmplY3RgIGlzIG5vdyB0aGUgbmV4dCBzaWJsaW5nIG9mIGByZWZlcmVuY2VPYmplY3RgLgogICAgICAgKgogICAgICAgKiAqIGBPKDEpYAogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGluc2VydEFmdGVyCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWZlcmVuY2VPYmplY3QKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5ld09iamVjdAogICAgICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIG5ld09iamVjdCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBTeW1ib2xUcmVlCiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gbmV3T2JqZWN0CiAgICAgICAqLwogICAgICBpbnNlcnRBZnRlcihyZWZlcmVuY2VPYmplY3QsIG5ld09iamVjdCkgewogICAgICAgIGNvbnN0IHJlZmVyZW5jZU5vZGUgPSB0aGlzLl9ub2RlKHJlZmVyZW5jZU9iamVjdCk7CiAgICAgICAgY29uc3QgbmV4dE5vZGUgPSB0aGlzLl9ub2RlKHJlZmVyZW5jZU5vZGUubmV4dFNpYmxpbmcpOwogICAgICAgIGNvbnN0IG5ld05vZGUgPSB0aGlzLl9ub2RlKG5ld09iamVjdCk7CiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX25vZGUocmVmZXJlbmNlTm9kZS5wYXJlbnQpOwogICAgICAgIGlmIChuZXdOb2RlLmlzQXR0YWNoZWQpIHsKICAgICAgICAgIHRocm93IEVycm9yKCJHaXZlbiBvYmplY3QgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgU3ltYm9sVHJlZSwgcmVtb3ZlIGl0IGZpcnN0Iik7CiAgICAgICAgfQogICAgICAgIG5ld05vZGUucGFyZW50ID0gcmVmZXJlbmNlTm9kZS5wYXJlbnQ7CiAgICAgICAgbmV3Tm9kZS5wcmV2aW91c1NpYmxpbmcgPSByZWZlcmVuY2VPYmplY3Q7CiAgICAgICAgbmV3Tm9kZS5uZXh0U2libGluZyA9IHJlZmVyZW5jZU5vZGUubmV4dFNpYmxpbmc7CiAgICAgICAgcmVmZXJlbmNlTm9kZS5uZXh0U2libGluZyA9IG5ld09iamVjdDsKICAgICAgICBpZiAobmV4dE5vZGUpIHsKICAgICAgICAgIG5leHROb2RlLnByZXZpb3VzU2libGluZyA9IG5ld09iamVjdDsKICAgICAgICB9CiAgICAgICAgaWYgKHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS5sYXN0Q2hpbGQgPT09IHJlZmVyZW5jZU9iamVjdCkgewogICAgICAgICAgcGFyZW50Tm9kZS5sYXN0Q2hpbGQgPSBuZXdPYmplY3Q7CiAgICAgICAgfQogICAgICAgIGlmIChwYXJlbnROb2RlKSB7CiAgICAgICAgICBwYXJlbnROb2RlLmNoaWxkcmVuQ2hhbmdlZCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3T2JqZWN0OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJbnNlcnQgdGhlIGdpdmVuIG9iamVjdCBhcyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGdpdmVuIHJlZmVyZW5jZSBvYmplY3QuCiAgICAgICAqIGBuZXdPYmplY3RgIGlzIG5vdyB0aGUgZmlyc3QgY2hpbGQgb2YgYHJlZmVyZW5jZU9iamVjdGAuCiAgICAgICAqCiAgICAgICAqICogYE8oMSlgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgcHJlcGVuZENoaWxkCiAgICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6c3ltYm9sLXRyZWUjCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWZlcmVuY2VPYmplY3QKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG5ld09iamVjdAogICAgICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIG5ld09iamVjdCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBTeW1ib2xUcmVlCiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gbmV3T2JqZWN0CiAgICAgICAqLwogICAgICBwcmVwZW5kQ2hpbGQocmVmZXJlbmNlT2JqZWN0LCBuZXdPYmplY3QpIHsKICAgICAgICBjb25zdCByZWZlcmVuY2VOb2RlID0gdGhpcy5fbm9kZShyZWZlcmVuY2VPYmplY3QpOwogICAgICAgIGNvbnN0IG5ld05vZGUgPSB0aGlzLl9ub2RlKG5ld09iamVjdCk7CiAgICAgICAgaWYgKG5ld05vZGUuaXNBdHRhY2hlZCkgewogICAgICAgICAgdGhyb3cgRXJyb3IoIkdpdmVuIG9iamVjdCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBTeW1ib2xUcmVlLCByZW1vdmUgaXQgZmlyc3QiKTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlZmVyZW5jZU5vZGUuaGFzQ2hpbGRyZW4pIHsKICAgICAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKHJlZmVyZW5jZU5vZGUuZmlyc3RDaGlsZCwgbmV3T2JqZWN0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV3Tm9kZS5wYXJlbnQgPSByZWZlcmVuY2VPYmplY3Q7CiAgICAgICAgICByZWZlcmVuY2VOb2RlLmZpcnN0Q2hpbGQgPSBuZXdPYmplY3Q7CiAgICAgICAgICByZWZlcmVuY2VOb2RlLmxhc3RDaGlsZCA9IG5ld09iamVjdDsKICAgICAgICAgIHJlZmVyZW5jZU5vZGUuY2hpbGRyZW5DaGFuZ2VkKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdPYmplY3Q7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEluc2VydCB0aGUgZ2l2ZW4gb2JqZWN0IGFzIHRoZSBsYXN0IGNoaWxkIG9mIHRoZSBnaXZlbiByZWZlcmVuY2Ugb2JqZWN0LgogICAgICAgKiBgbmV3T2JqZWN0YCBpcyBub3cgdGhlIGxhc3QgY2hpbGQgb2YgYHJlZmVyZW5jZU9iamVjdGAuCiAgICAgICAqCiAgICAgICAqICogYE8oMSlgCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgYXBwZW5kQ2hpbGQKICAgICAgICogQG1lbWJlck9mIG1vZHVsZTpzeW1ib2wtdHJlZSMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlZmVyZW5jZU9iamVjdAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmV3T2JqZWN0CiAgICAgICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgbmV3T2JqZWN0IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIFN5bWJvbFRyZWUKICAgICAgICogQHJldHVybiB7T2JqZWN0fSBuZXdPYmplY3QKICAgICAgICovCiAgICAgIGFwcGVuZENoaWxkKHJlZmVyZW5jZU9iamVjdCwgbmV3T2JqZWN0KSB7CiAgICAgICAgY29uc3QgcmVmZXJlbmNlTm9kZSA9IHRoaXMuX25vZGUocmVmZXJlbmNlT2JqZWN0KTsKICAgICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy5fbm9kZShuZXdPYmplY3QpOwogICAgICAgIGlmIChuZXdOb2RlLmlzQXR0YWNoZWQpIHsKICAgICAgICAgIHRocm93IEVycm9yKCJHaXZlbiBvYmplY3QgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgU3ltYm9sVHJlZSwgcmVtb3ZlIGl0IGZpcnN0Iik7CiAgICAgICAgfQogICAgICAgIGlmIChyZWZlcmVuY2VOb2RlLmhhc0NoaWxkcmVuKSB7CiAgICAgICAgICB0aGlzLmluc2VydEFmdGVyKHJlZmVyZW5jZU5vZGUubGFzdENoaWxkLCBuZXdPYmplY3QpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXdOb2RlLnBhcmVudCA9IHJlZmVyZW5jZU9iamVjdDsKICAgICAgICAgIHJlZmVyZW5jZU5vZGUuZmlyc3RDaGlsZCA9IG5ld09iamVjdDsKICAgICAgICAgIHJlZmVyZW5jZU5vZGUubGFzdENoaWxkID0gbmV3T2JqZWN0OwogICAgICAgICAgcmVmZXJlbmNlTm9kZS5jaGlsZHJlbkNoYW5nZWQoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ld09iamVjdDsKICAgICAgfQogICAgfTsKICAgIG1vZHVsZS5leHBvcnRzID0gU3ltYm9sVHJlZTsKICAgIFN5bWJvbFRyZWUuVHJlZVBvc2l0aW9uID0gVHJlZVBvc2l0aW9uOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMi4yL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLnBsdWdpbnMuanMKdmFyIGltcG9ydF9zeW1ib2xfdHJlZTsKdmFyIGluaXRfY2xhc3Nlc19wbHVnaW5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMi4yL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLnBsdWdpbnMuanMiKCkgewogICAgaW5pdF9kaXN0X3RzMygpOwogICAgaW5pdF9kaXN0X3RzNSgpOwogICAgaW5pdF9kaXN0X3RzKCk7CiAgICBpbml0X2Rpc3RfdHMyKCk7CiAgICBpbml0X2Rpc3RfdHM2KCk7CiAgICBpbXBvcnRfc3ltYm9sX3RyZWUgPSBfX3RvRVNNKHJlcXVpcmVfU3ltYm9sVHJlZSgpLCAxKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5hc3luY2V4ZWN1dGlvbnN0YWNrLmpzCnZhciBBc3luY0V4ZWN1dGlvblN0YWNrOwp2YXIgaW5pdF9jbGFzc2VzX2FzeW5jZXhlY3V0aW9uc3RhY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMuYXN5bmNleGVjdXRpb25zdGFjay5qcyIoKSB7CiAgICBpbml0X2NsYXNzZXNfcGx1Z2lucygpOwogICAgQXN5bmNFeGVjdXRpb25TdGFjayA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5leGVjdXRpb25TbG90cyA9IFtdOwogICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5ub25FeGNsdXNpdmVNYXhDb25jdXJyZW5jeSA9IEluZmluaXR5OwogICAgICAgIHRoaXMubm9uRXhjbHVzaXZlQ3VycmVudENvdW50ID0gMDsKICAgICAgICB0aGlzLm5vbkV4Y2x1c2l2ZVBlbmRpbmdRdWV1ZSA9IFtdOwogICAgICB9CiAgICAgIGFzeW5jIGdldEV4Y2x1c2l2ZUV4ZWN1dGlvblNsb3QoZnVuY0FyZywgdGltZW91dEFyZykgewogICAgICAgIGNvbnN0IGV4ZWN1dGlvbkRlZmVycmVkID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICAgICAgY29uc3QgZXhlY3V0aW9uU2xvdCA9IHsKICAgICAgICAgIGZ1bmNUb0V4ZWN1dGU6IGZ1bmNBcmcsCiAgICAgICAgICBleGVjdXRpb25EZWZlcnJlZCwKICAgICAgICAgIHRpbWVvdXQ6IHRpbWVvdXRBcmcsCiAgICAgICAgICBtb2RlOiAiZXhjbHVzaXZlIgogICAgICAgIH07CiAgICAgICAgdGhpcy5leGVjdXRpb25TbG90cy5wdXNoKGV4ZWN1dGlvblNsb3QpOwogICAgICAgIHRoaXMucHJvY2Vzc0V4ZWN1dGlvblNsb3RzKCk7CiAgICAgICAgcmV0dXJuIGV4ZWN1dGlvbkRlZmVycmVkLnByb21pc2U7CiAgICAgIH0KICAgICAgYXN5bmMgZ2V0Tm9uRXhjbHVzaXZlRXhlY3V0aW9uU2xvdChmdW5jQXJnLCB0aW1lb3V0QXJnKSB7CiAgICAgICAgY29uc3QgZXhlY3V0aW9uRGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgICAgICBjb25zdCBleGVjdXRpb25TbG90ID0gewogICAgICAgICAgZnVuY1RvRXhlY3V0ZTogZnVuY0FyZywKICAgICAgICAgIGV4ZWN1dGlvbkRlZmVycmVkLAogICAgICAgICAgdGltZW91dDogdGltZW91dEFyZywKICAgICAgICAgIG1vZGU6ICJub25leGNsdXNpdmUiCiAgICAgICAgfTsKICAgICAgICB0aGlzLmV4ZWN1dGlvblNsb3RzLnB1c2goZXhlY3V0aW9uU2xvdCk7CiAgICAgICAgdGhpcy5wcm9jZXNzRXhlY3V0aW9uU2xvdHMoKTsKICAgICAgICByZXR1cm4gZXhlY3V0aW9uRGVmZXJyZWQucHJvbWlzZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IG5vbi1leGNsdXNpdmUgdGFza3MuCiAgICAgICAqIEBwYXJhbSBjb25jdXJyZW5jeSBtaW5pbXVtIDEgKEluZmluaXR5IG1lYW5zIHVubGltaXRlZCkKICAgICAgICovCiAgICAgIHNldE5vbkV4Y2x1c2l2ZU1heENvbmN1cnJlbmN5KGNvbmN1cnJlbmN5KSB7CiAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoY29uY3VycmVuY3kpIHx8IGNvbmN1cnJlbmN5IDwgMSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJub25FeGNsdXNpdmVNYXhDb25jdXJyZW5jeSBtdXN0IGJlIGEgZmluaXRlIG51bWJlciA+PSAxIik7CiAgICAgICAgfQogICAgICAgIHRoaXMubm9uRXhjbHVzaXZlTWF4Q29uY3VycmVuY3kgPSBjb25jdXJyZW5jeTsKICAgICAgfQogICAgICAvKiogR2V0IHRoZSBjb25maWd1cmVkIG1heCBjb25jdXJyZW5jeSBmb3Igbm9uLWV4Y2x1c2l2ZSB0YXNrcyAqLwogICAgICBnZXROb25FeGNsdXNpdmVNYXhDb25jdXJyZW5jeSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub25FeGNsdXNpdmVNYXhDb25jdXJyZW5jeTsKICAgICAgfQogICAgICAvKiogTnVtYmVyIG9mIG5vbi1leGNsdXNpdmUgdGFza3MgY3VycmVudGx5IHJ1bm5pbmcgKi8KICAgICAgZ2V0QWN0aXZlTm9uRXhjbHVzaXZlQ291bnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubm9uRXhjbHVzaXZlQ3VycmVudENvdW50OwogICAgICB9CiAgICAgIC8qKiBOdW1iZXIgb2Ygbm9uLWV4Y2x1c2l2ZSB0YXNrcyB3YWl0aW5nIGZvciBhIGZyZWUgc2xvdCAqLwogICAgICBnZXRQZW5kaW5nTm9uRXhjbHVzaXZlQ291bnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubm9uRXhjbHVzaXZlUGVuZGluZ1F1ZXVlLmxlbmd0aDsKICAgICAgfQogICAgICBhc3luYyBwcm9jZXNzRXhlY3V0aW9uU2xvdHMoKSB7CiAgICAgICAgaWYgKHRoaXMuaXNQcm9jZXNzaW5nKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gdHJ1ZTsKICAgICAgICB3aGlsZSAodGhpcy5leGVjdXRpb25TbG90cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICBjb25zdCBjdXJyZW50U2xvdCA9IHRoaXMuZXhlY3V0aW9uU2xvdHNbMF07CiAgICAgICAgICBpZiAoY3VycmVudFNsb3QubW9kZSA9PT0gImV4Y2x1c2l2ZSIpIHsKICAgICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlRXhjbHVzaXZlU2xvdChjdXJyZW50U2xvdCk7CiAgICAgICAgICAgIHRoaXMuZXhlY3V0aW9uU2xvdHMuc2hpZnQoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IG5vbkV4Y2x1c2l2ZVNsb3RzID0gW107CiAgICAgICAgICAgIHdoaWxlICh0aGlzLmV4ZWN1dGlvblNsb3RzLmxlbmd0aCA+IDAgJiYgdGhpcy5leGVjdXRpb25TbG90c1swXS5tb2RlID09PSAibm9uZXhjbHVzaXZlIikgewogICAgICAgICAgICAgIG5vbkV4Y2x1c2l2ZVNsb3RzLnB1c2godGhpcy5leGVjdXRpb25TbG90cy5zaGlmdCgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVOb25FeGNsdXNpdmVTbG90cyhub25FeGNsdXNpdmVTbG90cyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7CiAgICAgIH0KICAgICAgYXN5bmMgZXhlY3V0ZUV4Y2x1c2l2ZVNsb3Qoc2xvdCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAoc2xvdC50aW1lb3V0KSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbCiAgICAgICAgICAgICAgc2xvdC5mdW5jVG9FeGVjdXRlKCksCiAgICAgICAgICAgICAgZGlzdF90c19leHBvcnRzMy5kZWxheUZvcihzbG90LnRpbWVvdXQpLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaW1lb3V0IHJlYWNoZWQiKTsKICAgICAgICAgICAgICB9KQogICAgICAgICAgICBdKTsKICAgICAgICAgICAgc2xvdC5leGVjdXRpb25EZWZlcnJlZC5yZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzbG90LmZ1bmNUb0V4ZWN1dGUoKTsKICAgICAgICAgICAgc2xvdC5leGVjdXRpb25EZWZlcnJlZC5yZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgIHNsb3QuZXhlY3V0aW9uRGVmZXJyZWQucmVqZWN0KGVycm9yKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYXN5bmMgZXhlY3V0ZU5vbkV4Y2x1c2l2ZVNsb3RzKHNsb3RzKSB7CiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBzbG90cy5tYXAoYXN5bmMgKHNsb3QpID0+IHsKICAgICAgICAgIGF3YWl0IHRoaXMud2FpdEZvck5vbkV4Y2x1c2l2ZVNsb3QoKTsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChzbG90LnRpbWVvdXQpIHsKICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoWwogICAgICAgICAgICAgICAgc2xvdC5mdW5jVG9FeGVjdXRlKCksCiAgICAgICAgICAgICAgICBkaXN0X3RzX2V4cG9ydHMzLmRlbGF5Rm9yKHNsb3QudGltZW91dCkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVGltZW91dCByZWFjaGVkIik7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgIHNsb3QuZXhlY3V0aW9uRGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNsb3QuZnVuY1RvRXhlY3V0ZSgpOwogICAgICAgICAgICAgIHNsb3QuZXhlY3V0aW9uRGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBzbG90LmV4ZWN1dGlvbkRlZmVycmVkLnJlamVjdChlcnJvcik7CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICB0aGlzLnJlbGVhc2VOb25FeGNsdXNpdmVTbG90KCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBXYWl0IHVudGlsIGEgbm9uLWV4Y2x1c2l2ZSBzbG90IGlzIGF2YWlsYWJsZSAocmVzcGVjdHMgbWF4IGNvbmN1cnJlbmN5KS4KICAgICAgICovCiAgICAgIHdhaXRGb3JOb25FeGNsdXNpdmVTbG90KCkgewogICAgICAgIGlmICh0aGlzLm5vbkV4Y2x1c2l2ZUN1cnJlbnRDb3VudCA8IHRoaXMubm9uRXhjbHVzaXZlTWF4Q29uY3VycmVuY3kpIHsKICAgICAgICAgIHRoaXMubm9uRXhjbHVzaXZlQ3VycmVudENvdW50Kys7CiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHsKICAgICAgICAgIHRoaXMubm9uRXhjbHVzaXZlUGVuZGluZ1F1ZXVlLnB1c2goKCkgPT4gewogICAgICAgICAgICB0aGlzLm5vbkV4Y2x1c2l2ZUN1cnJlbnRDb3VudCsrOwogICAgICAgICAgICByZXNvbHZlMigpOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgLyoqIFJlbGVhc2UgYSBub24tZXhjbHVzaXZlIHNsb3QgYW5kIHdha2UgdGhlIG5leHQgd2FpdGVyLCBpZiBhbnkuICovCiAgICAgIHJlbGVhc2VOb25FeGNsdXNpdmVTbG90KCkgewogICAgICAgIHRoaXMubm9uRXhjbHVzaXZlQ3VycmVudENvdW50LS07CiAgICAgICAgY29uc3QgbmV4dDIgPSB0aGlzLm5vbkV4Y2x1c2l2ZVBlbmRpbmdRdWV1ZS5zaGlmdCgpOwogICAgICAgIGlmIChuZXh0MikgewogICAgICAgICAgbmV4dDIoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMuYmFja3ByZXNzdXJlZGFycmF5LmpzCnZhciBCYWNrcHJlc3N1cmVkQXJyYXk7CnZhciBpbml0X2NsYXNzZXNfYmFja3ByZXNzdXJlZGFycmF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMi4yL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLmJhY2twcmVzc3VyZWRhcnJheS5qcyIoKSB7CiAgICBpbml0X2NsYXNzZXNfcGx1Z2lucygpOwogICAgQmFja3ByZXNzdXJlZEFycmF5ID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcihoaWdoV2F0ZXJNYXJrID0gMTYpIHsKICAgICAgICB0aGlzLmhhc1NwYWNlID0gbmV3IGRpc3RfdHNfZXhwb3J0czIucnhqcy5TdWJqZWN0KCk7CiAgICAgICAgdGhpcy5pdGVtc0F2YWlsYWJsZSA9IG5ldyBkaXN0X3RzX2V4cG9ydHMyLnJ4anMuU3ViamVjdCgpOwogICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgIHRoaXMuaGlnaFdhdGVyTWFyayA9IGhpZ2hXYXRlck1hcms7CiAgICAgIH0KICAgICAgcHVzaChpdGVtKSB7CiAgICAgICAgdGhpcy5kYXRhLnB1c2goaXRlbSk7CiAgICAgICAgdGhpcy5pdGVtc0F2YWlsYWJsZS5uZXh0KCJpdGVtc0F2YWlsYWJsZSIpOwogICAgICAgIGNvbnN0IHNwYWNlQXZhaWxhYmxlID0gdGhpcy5jaGVja1NwYWNlQXZhaWxhYmxlKCk7CiAgICAgICAgaWYgKHNwYWNlQXZhaWxhYmxlKSB7CiAgICAgICAgICB0aGlzLmhhc1NwYWNlLm5leHQoImhhc1NwYWNlIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcGFjZUF2YWlsYWJsZTsKICAgICAgfQogICAgICBzaGlmdCgpIHsKICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5kYXRhLnNoaWZ0KCk7CiAgICAgICAgaWYgKHRoaXMuY2hlY2tTcGFjZUF2YWlsYWJsZSgpKSB7CiAgICAgICAgICB0aGlzLmhhc1NwYWNlLm5leHQoImhhc1NwYWNlIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpdGVtOwogICAgICB9CiAgICAgIGNoZWNrU3BhY2VBdmFpbGFibGUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5sZW5ndGggPCB0aGlzLmhpZ2hXYXRlck1hcms7CiAgICAgIH0KICAgICAgY2hlY2tIYXNJdGVtcygpIHsKICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aCA+IDA7CiAgICAgIH0KICAgICAgd2FpdEZvclNwYWNlKCkgewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHsKICAgICAgICAgIGlmICh0aGlzLmNoZWNrU3BhY2VBdmFpbGFibGUoKSkgewogICAgICAgICAgICByZXNvbHZlMigpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5oYXNTcGFjZS5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgIHJlc29sdmUyKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIHdhaXRGb3JJdGVtcygpIHsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5kYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgcmVzb2x2ZTIoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuaXRlbXNBdmFpbGFibGUuc3Vic2NyaWJlKCgpID0+IHsKICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICByZXNvbHZlMigpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5mYXN0bWFwLmpzCnZhciBGYXN0TWFwOwp2YXIgaW5pdF9jbGFzc2VzX2Zhc3RtYXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMuZmFzdG1hcC5qcyIoKSB7CiAgICBpbml0X2NsYXNzZXNfcGx1Z2lucygpOwogICAgRmFzdE1hcCA9IGNsYXNzIF9GYXN0TWFwIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5tYXBPYmplY3QgPSB7fTsKICAgICAgfQogICAgICBpc1VuaXF1ZUtleShrZXlBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5tYXBPYmplY3Rba2V5QXJnXSA/IGZhbHNlIDogdHJ1ZTsKICAgICAgfQogICAgICBhZGRUb01hcChrZXlBcmcsIG9iamVjdEFyZywgb3B0aW9uc0FyZykgewogICAgICAgIGlmICh0aGlzLmlzVW5pcXVlS2V5KGtleUFyZykgfHwgb3B0aW9uc0FyZyAmJiBvcHRpb25zQXJnLmZvcmNlKSB7CiAgICAgICAgICB0aGlzLm1hcE9iamVjdFtrZXlBcmddID0gb2JqZWN0QXJnOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZ2V0QnlLZXkoa2V5QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWFwT2JqZWN0W2tleUFyZ107CiAgICAgIH0KICAgICAgcmVtb3ZlRnJvbU1hcChrZXlBcmcpIHsKICAgICAgICBjb25zdCByZW1vdmVkSXRlbSA9IHRoaXMuZ2V0QnlLZXkoa2V5QXJnKTsKICAgICAgICBkZWxldGUgdGhpcy5tYXBPYmplY3Rba2V5QXJnXTsKICAgICAgICByZXR1cm4gcmVtb3ZlZEl0ZW07CiAgICAgIH0KICAgICAgZ2V0S2V5cygpIHsKICAgICAgICBjb25zdCBrZXlzMiA9IFtdOwogICAgICAgIGZvciAoY29uc3Qga2V5QXJnIGluIHRoaXMubWFwT2JqZWN0KSB7CiAgICAgICAgICBpZiAodGhpcy5tYXBPYmplY3Rba2V5QXJnXSkgewogICAgICAgICAgICBrZXlzMi5wdXNoKGtleUFyZyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBrZXlzMjsKICAgICAgfQogICAgICBjbGVhbigpIHsKICAgICAgICB0aGlzLm1hcE9iamVjdCA9IHt9OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiByZXR1cm5zIGEgbmV3IEZhc3RtYXAgdGhhdCBpbmNsdWRlcyBhbGwgdmFsdWVzIGZyb20gdGhpcyBhbmQgYWxsIGZyb20gdGhlIGZhc3RtYXAgaW4gdGhlIGFyZ3VtZW50CiAgICAgICAqLwogICAgICBjb25jYXQoZmFzdE1hcEFyZykgewogICAgICAgIGNvbnN0IGNvbmNhdGVkRmFzdG1hcCA9IG5ldyBfRmFzdE1hcCgpOwogICAgICAgIGZvciAoY29uc3Qga2V5MiBvZiB0aGlzLmdldEtleXMoKSkgewogICAgICAgICAgY29uY2F0ZWRGYXN0bWFwLmFkZFRvTWFwKGtleTIsIHRoaXMuZ2V0QnlLZXkoa2V5MikpOwogICAgICAgIH0KICAgICAgICBmb3IgKGNvbnN0IGtleTIgb2YgZmFzdE1hcEFyZy5nZXRLZXlzKCkpIHsKICAgICAgICAgIGNvbmNhdGVkRmFzdG1hcC5hZGRUb01hcChrZXkyLCBmYXN0TWFwQXJnLmdldEJ5S2V5KGtleTIpLCB7CiAgICAgICAgICAgIGZvcmNlOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbmNhdGVkRmFzdG1hcDsKICAgICAgfQogICAgICAvKioKICAgICAgICogdHJpZXMgdG8gbWVyZ2UgYW5vdGhlciBGYXN0bWFwCiAgICAgICAqIE5vdGU6IHVuaXF1ZUtleUNvbGxpc2lvbnMgd2lsbCBjYXVzZSBvdmVyd3JpdGUKICAgICAgICogQHBhcmFtIGZhc3RNYXBBcmcKICAgICAgICovCiAgICAgIGFkZEFsbEZyb21PdGhlcihmYXN0TWFwQXJnKSB7CiAgICAgICAgZm9yIChjb25zdCBrZXkyIG9mIGZhc3RNYXBBcmcuZ2V0S2V5cygpKSB7CiAgICAgICAgICB0aGlzLmFkZFRvTWFwKGtleTIsIGZhc3RNYXBBcmcuZ2V0QnlLZXkoa2V5MiksIHsKICAgICAgICAgICAgZm9yY2U6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBhc3luYyBmaW5kKGZpbmRGdW5jdGlvbkFyZykgewogICAgICAgIGZvciAoY29uc3Qga2V5MiBvZiB0aGlzLmdldEtleXMoKSkgewogICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0QnlLZXkoa2V5Mik7CiAgICAgICAgICBjb25zdCBmaW5kRnVuY3Rpb25SZXN1bHQgPSBhd2FpdCBmaW5kRnVuY3Rpb25BcmcoaXRlbSk7CiAgICAgICAgICBpZiAoZmluZEZ1bmN0aW9uUmVzdWx0KSB7CiAgICAgICAgICAgIHJldHVybiBpdGVtOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5vYmplY3RtYXAuanMKdmFyIHVuaSwgT2JqZWN0TWFwOwp2YXIgaW5pdF9jbGFzc2VzX29iamVjdG1hcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5vYmplY3RtYXAuanMiKCkgewogICAgaW5pdF9jbGFzc2VzX3BsdWdpbnMoKTsKICAgIGluaXRfY2xhc3Nlc19mYXN0bWFwKCk7CiAgICB1bmkgPSAocHJlZml4NCA9ICJ1bmkiKSA9PiB7CiAgICAgIHJldHVybiBgJHtwcmVmaXg0fXh4eHh4eHh4eHh4YC5yZXBsYWNlKC9beHldL2csIChjMTEpID0+IHsKICAgICAgICBjb25zdCByMTEgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwOwogICAgICAgIGNvbnN0IHY2ID0gYzExID09PSAieCIgPyByMTEgOiByMTEgJiAzIHwgODsKICAgICAgICByZXR1cm4gdjYudG9TdHJpbmcoMTYpOwogICAgICB9KTsKICAgIH07CiAgICBPYmplY3RNYXAgPSBjbGFzcyBfT2JqZWN0TWFwIHsKICAgICAgLyoqCiAgICAgICAqIHJldHVybnMgYSBuZXcgaW5zdGFuY2UKICAgICAgICovCiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuZmFzdE1hcCA9IG5ldyBGYXN0TWFwKCk7CiAgICAgICAgdGhpcy5ldmVudFN1YmplY3QgPSBuZXcgZGlzdF90c19leHBvcnRzMi5yeGpzLlN1YmplY3QoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogYWRkcyBhbiBvYmplY3QgbWFwcGVkIHRvIGEgc3RyaW5nCiAgICAgICAqIHRoZSBzdHJpbmcgbXVzdCBiZSB1bmlxdWUKICAgICAgICovCiAgICAgIGFkZE1hcHBlZFVuaXF1ZSh1bmlxdWVLZXlBcmcsIG9iamVjdEFyZykgewogICAgICAgIHRoaXMuZmFzdE1hcC5hZGRUb01hcCh1bmlxdWVLZXlBcmcsIG9iamVjdEFyZyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGZhc3Rlc3Qgd2F5IHRvIGdldCBhbiBvYmplY3QgZnJvbSB0aGUgbWFwCiAgICAgICAqIEBwYXJhbSB1bmlxdWVLZXkKICAgICAgICovCiAgICAgIGdldE1hcHBlZFVuaXF1ZSh1bmlxdWVLZXlBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5mYXN0TWFwLmdldEJ5S2V5KHVuaXF1ZUtleUFyZyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHJlbW92ZSBrZXkKICAgICAgICogQHBhcmFtIGZ1bmN0aW9uQXJnCiAgICAgICAqLwogICAgICByZW1vdmVNYXBwZWRVbmlxdWUodW5pcXVlS2V5KSB7CiAgICAgICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5nZXRNYXBwZWRVbmlxdWUodW5pcXVlS2V5KTsKICAgICAgfQogICAgICAvKioKICAgICAgICogYWRkIG9iamVjdCB0byBPYmplY3RtYXAKICAgICAgICogcmV0dXJucyBmYWxzZSBpZiB0aGUgb2JqZWN0IGlzIGFscmVhZHkgaW4gdGhlIG1hcAogICAgICAgKiByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5CiAgICAgICAqLwogICAgICBhZGQob2JqZWN0QXJnKSB7CiAgICAgICAgZm9yIChjb25zdCBrZXlBcmcgb2YgdGhpcy5mYXN0TWFwLmdldEtleXMoKSkgewogICAgICAgICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5mYXN0TWFwLmdldEJ5S2V5KGtleUFyZyk7CiAgICAgICAgICBpZiAob2JqZWN0ID09PSBvYmplY3RBcmcpIHsKICAgICAgICAgICAgcmV0dXJuIGtleUFyZzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgdW5pcXVlS2V5ID0gdW5pKCJrZXkiKTsKICAgICAgICB0aGlzLmFkZE1hcHBlZFVuaXF1ZSh1bmlxdWVLZXksIG9iamVjdEFyZyk7CiAgICAgICAgdGhpcy5ldmVudFN1YmplY3QubmV4dCh7CiAgICAgICAgICBvcGVyYXRpb246ICJhZGQiLAogICAgICAgICAgcGF5bG9hZDogb2JqZWN0QXJnCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHVuaXF1ZUtleTsKICAgICAgfQogICAgICAvKioKICAgICAgICogbGlrZSAuYWRkIGJ1dCBhZGRzIGFuIHdob2xlIGFycmF5IG9mIG9iamVjdHMKICAgICAgICovCiAgICAgIGFkZEFycmF5KG9iamVjdEFycmF5QXJnKSB7CiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9iamVjdEFycmF5QXJnKSB7CiAgICAgICAgICB0aGlzLmFkZChpdGVtKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNoZWNrIGlmIG9iamVjdCBpcyBpbiBPYmplY3RtYXAKICAgICAgICovCiAgICAgIGNoZWNrRm9yT2JqZWN0KG9iamVjdEFyZykgewogICAgICAgIHJldHVybiAhIXRoaXMuZ2V0S2V5Rm9yT2JqZWN0KG9iamVjdEFyZyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGdldCBrZXkgZm9yIG9iamVjdAogICAgICAgKiBAcGFyYW0gZmluZEZ1bmN0aW9uCiAgICAgICAqLwogICAgICBnZXRLZXlGb3JPYmplY3Qob2JqZWN0QXJnKSB7CiAgICAgICAgbGV0IGZvdW5kS2V5ID0gbnVsbDsKICAgICAgICBmb3IgKGNvbnN0IGtleUFyZyBvZiB0aGlzLmZhc3RNYXAuZ2V0S2V5cygpKSB7CiAgICAgICAgICBpZiAoIWZvdW5kS2V5ICYmIHRoaXMuZmFzdE1hcC5nZXRCeUtleShrZXlBcmcpID09PSBvYmplY3RBcmcpIHsKICAgICAgICAgICAgZm91bmRLZXkgPSBrZXlBcmc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZvdW5kS2V5OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBmaW5kIG9iamVjdAogICAgICAgKi8KICAgICAgYXN5bmMgZmluZChmaW5kRnVuY3Rpb24pIHsKICAgICAgICByZXR1cm4gdGhpcy5mYXN0TWFwLmZpbmQoZmluZEZ1bmN0aW9uKTsKICAgICAgfQogICAgICBmaW5kU3luYyhmaW5kRnVuY3Rpb24pIHsKICAgICAgICBmb3IgKGNvbnN0IGtleUFyZyBvZiB0aGlzLmZhc3RNYXAuZ2V0S2V5cygpKSB7CiAgICAgICAgICBpZiAoZmluZEZ1bmN0aW9uKHRoaXMuZmFzdE1hcC5nZXRCeUtleShrZXlBcmcpKSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRNYXBwZWRVbmlxdWUoa2V5QXJnKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGZpbmRzIGEgc3BlY2lmaWMgZWxlbWVudCBhbmQgdGhlbiByZW1vdmVzIGl0CiAgICAgICAqLwogICAgICBhc3luYyBmaW5kT25lQW5kUmVtb3ZlKGZpbmRGdW5jdGlvbikgewogICAgICAgIGNvbnN0IGZvdW5kRWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZChmaW5kRnVuY3Rpb24pOwogICAgICAgIGlmIChmb3VuZEVsZW1lbnQpIHsKICAgICAgICAgIHRoaXMucmVtb3ZlKGZvdW5kRWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmb3VuZEVsZW1lbnQ7CiAgICAgIH0KICAgICAgZmluZE9uZUFuZFJlbW92ZVN5bmMoZmluZEZ1bmN0aW9uKSB7CiAgICAgICAgY29uc3QgZm91bmRFbGVtZW50ID0gdGhpcy5maW5kU3luYyhmaW5kRnVuY3Rpb24pOwogICAgICAgIGlmIChmb3VuZEVsZW1lbnQpIHsKICAgICAgICAgIHRoaXMucmVtb3ZlKGZvdW5kRWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmb3VuZEVsZW1lbnQ7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHJ1biBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtIGluIE9iamVjdG1hcAogICAgICAgKi8KICAgICAgYXN5bmMgZm9yRWFjaChmdW5jdGlvbkFyZykgewogICAgICAgIGZvciAoY29uc3Qga2V5QXJnIG9mIHRoaXMuZmFzdE1hcC5nZXRLZXlzKCkpIHsKICAgICAgICAgIGF3YWl0IGZ1bmN0aW9uQXJnKHRoaXMuZmFzdE1hcC5nZXRCeUtleShrZXlBcmcpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGdldHMgYW4gb2JqZWN0IGluIHRoZSBPYnNlcnZhYmxlbWFwIGFuZCByZW1vdmVzIGl0LCBzbyBpdCBjYW4ndCBiZSByZXRyaWV2ZWQgYWdhaW4KICAgICAgICovCiAgICAgIGdldE9uZUFuZFJlbW92ZSgpIHsKICAgICAgICBjb25zdCBrZXlzMiA9IHRoaXMuZmFzdE1hcC5nZXRLZXlzKCk7CiAgICAgICAgaWYgKGtleXMyLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGtleVRvVXNlID0ga2V5czJbMF07CiAgICAgICAgICBjb25zdCByZW1vdmVkSXRlbSA9IHRoaXMuZmFzdE1hcC5yZW1vdmVGcm9tTWFwKGtleVRvVXNlKTsKICAgICAgICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoewogICAgICAgICAgICBvcGVyYXRpb246ICJyZW1vdmUiLAogICAgICAgICAgICBwYXlsb2FkOiByZW1vdmVkSXRlbQogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gcmVtb3ZlZEl0ZW07CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiByZXR1cm5zIGEgY2xvbmVkIGFycmF5IG9mIGFsbCB0aGUgb2JqZWN0cyBjdXJyZW50bHkgaW4gdGhlIE9iamVjdG1hcAogICAgICAgKi8KICAgICAgZ2V0QXJyYXkoKSB7CiAgICAgICAgY29uc3QgcmV0dXJuQXJyYXkgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGtleUFyZyBvZiB0aGlzLmZhc3RNYXAuZ2V0S2V5cygpKSB7CiAgICAgICAgICByZXR1cm5BcnJheS5wdXNoKHRoaXMuZmFzdE1hcC5nZXRCeUtleShrZXlBcmcpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldHVybkFycmF5OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBjaGVjayBpZiBPYmplY3RtYXAgaXN0IGVtcHR5CiAgICAgICAqLwogICAgICBpc0VtcHR5KCkgewogICAgICAgIHJldHVybiB0aGlzLmZhc3RNYXAuZ2V0S2V5cygpLmxlbmd0aCA9PT0gMDsKICAgICAgfQogICAgICAvKioKICAgICAgICogcmVtb3ZlIG9iamVjdCBmcm9tIE9iamVjdG1hcAogICAgICAgKi8KICAgICAgcmVtb3ZlKG9iamVjdEFyZykgewogICAgICAgIGlmICh0aGlzLmNoZWNrRm9yT2JqZWN0KG9iamVjdEFyZykpIHsKICAgICAgICAgIGNvbnN0IGtleUFyZyA9IHRoaXMuZ2V0S2V5Rm9yT2JqZWN0KG9iamVjdEFyZyk7CiAgICAgICAgICBjb25zdCByZW1vdmVkT2JqZWN0ID0gdGhpcy5mYXN0TWFwLnJlbW92ZUZyb21NYXAoa2V5QXJnKTsKICAgICAgICAgIHRoaXMuZXZlbnRTdWJqZWN0Lm5leHQoewogICAgICAgICAgICBvcGVyYXRpb246ICJyZW1vdmUiLAogICAgICAgICAgICBwYXlsb2FkOiByZW1vdmVkT2JqZWN0CiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybiByZW1vdmVkT2JqZWN0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICAvKioKICAgICAgICogd2lwZSBPYmplY3RtYXAKICAgICAgICovCiAgICAgIHdpcGUoKSB7CiAgICAgICAgZm9yIChjb25zdCBrZXlBcmcgb2YgdGhpcy5mYXN0TWFwLmdldEtleXMoKSkgewogICAgICAgICAgdGhpcy5mYXN0TWFwLnJlbW92ZUZyb21NYXAoa2V5QXJnKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHJldHVybnMgYSBuZXcgT2JqZWN0bWFwIHRoYXQgaW5jbHVkZXMKICAgICAgICovCiAgICAgIGNvbmNhdChvYmplY3RNYXBBcmcpIHsKICAgICAgICBjb25zdCBjb25jYXR0ZWRPYmplY3RNYXAgPSBuZXcgX09iamVjdE1hcCgpOwogICAgICAgIGNvbmNhdHRlZE9iamVjdE1hcC5mYXN0TWFwLmFkZEFsbEZyb21PdGhlcih0aGlzLmZhc3RNYXApOwogICAgICAgIGNvbmNhdHRlZE9iamVjdE1hcC5mYXN0TWFwLmFkZEFsbEZyb21PdGhlcihvYmplY3RNYXBBcmcuZmFzdE1hcCk7CiAgICAgICAgcmV0dXJuIGNvbmNhdHRlZE9iamVjdE1hcDsKICAgICAgfQogICAgICAvKioKICAgICAgICogdHJpZXMgdG8gbWVyZ2UgYW5vdGhlciBPYmplY3RtYXAKICAgICAgICogTm90ZTogdW5pcXVlS2V5Q29sbGlzaW9ucyB3aWxsIGNhdXNlIG92ZXJ3cml0ZQogICAgICAgKiBAcGFyYW0gb2JqZWN0TWFwQXJnCiAgICAgICAqLwogICAgICBhZGRBbGxGcm9tT3RoZXIob2JqZWN0TWFwQXJnKSB7CiAgICAgICAgdGhpcy5mYXN0TWFwLmFkZEFsbEZyb21PdGhlcihvYmplY3RNYXBBcmcuZmFzdE1hcCk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMuaW50ZXJlc3RtYXAuaW50ZXJlc3QuanMKdmFyIEludGVyZXN0Owp2YXIgaW5pdF9jbGFzc2VzX2ludGVyZXN0bWFwX2ludGVyZXN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMi4yL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLmludGVyZXN0bWFwLmludGVyZXN0LmpzIigpIHsKICAgIGluaXRfY2xhc3Nlc19wbHVnaW5zKCk7CiAgICBpbml0X2NsYXNzZXNfaW50ZXJlc3RtYXAoKTsKICAgIEludGVyZXN0ID0gY2xhc3MgewogICAgICAvKioKICAgICAgICogcXVpY2sgYWNjZXNzIHRvIGEgc3RyaW5nIHRoYXQgbWFrZXMgdGhlIGludGVyZXN0IGNvbXBhcmFibGUgZm9yIGNoZWNraW5nIGZvciBzaW1pbGFyIGludGVyZXN0cwogICAgICAgKi8KICAgICAgZ2V0IGNvbXBhcmlzb25TdHJpbmcoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyaXNvbkZ1bmModGhpcy5vcmlnaW5hbEludGVyZXN0KTsKICAgICAgfQogICAgICAvKioKICAgICAgICogZnVsbGZpbGwgdGhlIGludGVyZXN0CiAgICAgICAqLwogICAgICBmdWxsZmlsbEludGVyZXN0KG9iamVjdEFyZykgewogICAgICAgIHRoaXMuaXNGdWxsZmlsbGVkID0gdHJ1ZTsKICAgICAgICB0aGlzLmZ1bGxmaWxsbWVudFN0b3JlID0gW107CiAgICAgICAgdGhpcy5pbnRlcmVzdERlZmVycmVkLnJlc29sdmUob2JqZWN0QXJnKTsKICAgICAgfQogICAgICAvKioKICAgICAgICoKICAgICAgICovCiAgICAgIGNvbnN0cnVjdG9yKGludGVyZXN0TWFwQXJnLCBpbnRlcmVzdEFyZywgY29tcGFyaXNvbkZ1bmNBcmcsIG9wdGlvbnNBcmcpIHsKICAgICAgICB0aGlzLmRlc3RydWN0aW9uVGltZXIgPSBuZXcgZGlzdF90c19leHBvcnRzNy5UaW1lcigxZTQpOwogICAgICAgIHRoaXMuaXNGdWxsZmlsbGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5mdWxsZmlsbG1lbnRTdG9yZSA9IFtdOwogICAgICAgIHRoaXMuaW50ZXJlc3REZWZlcnJlZCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMuRGVmZXJyZWQoKTsKICAgICAgICB0aGlzLmludGVyZXN0RnVsbGZpbGxlZCA9IHRoaXMuaW50ZXJlc3REZWZlcnJlZC5wcm9taXNlOwogICAgICAgIHRoaXMuaW50ZXJlc3RNYXBSZWYgPSBpbnRlcmVzdE1hcEFyZzsKICAgICAgICB0aGlzLm9yaWdpbmFsSW50ZXJlc3QgPSBpbnRlcmVzdEFyZzsKICAgICAgICB0aGlzLmNvbXBhcmlzb25GdW5jID0gY29tcGFyaXNvbkZ1bmNBcmc7CiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc0FyZzsKICAgICAgICB0aGlzLmRlc3RydWN0aW9uVGltZXIuY29tcGxldGVkLnRoZW4oKCkgPT4gewogICAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucz8ubWFya0xvc3RBZnRlckRlZmF1bHQpIHsKICAgICAgICAgIGRpc3RfdHNfZXhwb3J0czMuZGVsYXlGb3IodGhpcy5vcHRpb25zLm1hcmtMb3N0QWZ0ZXJEZWZhdWx0KS50aGVuKHRoaXMubWFya0xvc3QpOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIC8vIExJRkVDWUNMRSBNQU5BR0VNRU5UCiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgLyoqCiAgICAgICAqIHNlbGYgZGVzdHJ1Y3RzIHRoZSBpbnRlcmVzdAogICAgICAgKi8KICAgICAgZGVzdHJveSgpIHsKICAgICAgICB0aGlzLmludGVyZXN0TWFwUmVmLnJlbW92ZUludGVyZXN0KHRoaXMpOwogICAgICAgIGlmICghdGhpcy5pc0Z1bGxmaWxsZWQgJiYgdGhpcy5vcHRpb25zLmRlZmF1bHRGdWxsZmlsbG1lbnQpIHsKICAgICAgICAgIHRoaXMuZnVsbGZpbGxJbnRlcmVzdCh0aGlzLm9wdGlvbnMuZGVmYXVsdEZ1bGxmaWxsbWVudCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBub3RpZmllcyB0aGUgaW50ZXJlc3QgdGhhdCB0aGUgaW50ZXJlc3QgaW4gaXQgaGFzIGJlZW4gbG9zdAogICAgICAgKi8KICAgICAgbWFya0xvc3QoKSB7CiAgICAgICAgdGhpcy5kZXN0cnVjdGlvblRpbWVyLnN0YXJ0KCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIG5vdGlmaWVzIHRoZSBpbnRlcmVzdCB0aGF0IHRoZSBpbnRlcmVzdCBpbiBpdCBoYXMgYmVlbiByZXN0b3JlZAogICAgICAgKi8KICAgICAgcmVuZXcoKSB7CiAgICAgICAgdGhpcy5kZXN0cnVjdGlvblRpbWVyLnJlc2V0KCk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMuaW50ZXJlc3RtYXAuanMKdmFyIEludGVyZXN0TWFwOwp2YXIgaW5pdF9jbGFzc2VzX2ludGVyZXN0bWFwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMi4yL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLmludGVyZXN0bWFwLmpzIigpIHsKICAgIGluaXRfY2xhc3Nlc19wbHVnaW5zKCk7CiAgICBpbml0X2NsYXNzZXNfb2JqZWN0bWFwKCk7CiAgICBpbml0X2NsYXNzZXNfaW50ZXJlc3RtYXBfaW50ZXJlc3QoKTsKICAgIEludGVyZXN0TWFwID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3Rvcihjb21wYXJpc29uRnVuY0FyZywgb3B0aW9uc0FyZyA9IHt9KSB7CiAgICAgICAgdGhpcy5pbnRlcmVzdE9iamVjdE1hcCA9IG5ldyBPYmplY3RNYXAoKTsKICAgICAgICB0aGlzLmludGVyZXN0T2JzZXJ2YWJsZSA9IG5ldyBkaXN0X3RzX2V4cG9ydHMyLk9ic2VydmFibGVJbnRha2UoKTsKICAgICAgICB0aGlzLmNvbXBhcmlzb25GdW5jID0gY29tcGFyaXNvbkZ1bmNBcmc7CiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc0FyZzsKICAgICAgfQogICAgICAvKioKICAgICAgICogYWRkcyBhbiBpbnRlcmVzdCB0byB0aGUgSW50ZXJlc3RNYXAKICAgICAgICogQHBhcmFtIGludGVyZXN0SWQKICAgICAgICovCiAgICAgIGFzeW5jIGFkZEludGVyZXN0KGludGVyZXN0SWQsIGRlZmF1bHRGdWxsZmlsbG1lbnRBcmcpIHsKICAgICAgICBjb25zdCBjb21wYXJpc29uU3RyaW5nID0gdGhpcy5jb21wYXJpc29uRnVuYyhpbnRlcmVzdElkKTsKICAgICAgICBsZXQgcmV0dXJuSW50ZXJlc3Q7CiAgICAgICAgY29uc3QgbmV3SW50ZXJlc3QgPSBuZXcgSW50ZXJlc3QodGhpcywgaW50ZXJlc3RJZCwgdGhpcy5jb21wYXJpc29uRnVuYywgewogICAgICAgICAgbWFya0xvc3RBZnRlckRlZmF1bHQ6IHRoaXMub3B0aW9ucy5tYXJrTG9zdEFmdGVyRGVmYXVsdCwKICAgICAgICAgIGRlZmF1bHRGdWxsZmlsbG1lbnQ6IGRlZmF1bHRGdWxsZmlsbG1lbnRBcmcKICAgICAgICB9KTsKICAgICAgICBsZXQgaW50ZXJlc3RFeGlzdHMgPSBmYWxzZTsKICAgICAgICBhd2FpdCB0aGlzLmludGVyZXN0T2JqZWN0TWFwLmZvckVhY2goKGludGVyZXN0QXJnKSA9PiB7CiAgICAgICAgICBpZiAoIWludGVyZXN0RXhpc3RzICYmIGludGVyZXN0QXJnLmNvbXBhcmlzb25TdHJpbmcgPT09IG5ld0ludGVyZXN0LmNvbXBhcmlzb25TdHJpbmcpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coImluZm8iLCBgaW50ZXJlc3QgYWxyZWFkeSBleGlzdHMgZm9yICR7bmV3SW50ZXJlc3QuY29tcGFyaXNvblN0cmluZ31gKTsKICAgICAgICAgICAgaW50ZXJlc3RFeGlzdHMgPSB0cnVlOwogICAgICAgICAgICByZXR1cm5JbnRlcmVzdCA9IGludGVyZXN0QXJnOwogICAgICAgICAgICByZXR1cm5JbnRlcmVzdC5yZW5ldygpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmICghcmV0dXJuSW50ZXJlc3QpIHsKICAgICAgICAgIHJldHVybkludGVyZXN0ID0gbmV3SW50ZXJlc3Q7CiAgICAgICAgICB0aGlzLmludGVyZXN0T2JqZWN0TWFwLmFkZChyZXR1cm5JbnRlcmVzdCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuaW50ZXJlc3RPYnNlcnZhYmxlLnB1c2gocmV0dXJuSW50ZXJlc3QpOwogICAgICAgIHJldHVybiByZXR1cm5JbnRlcmVzdDsKICAgICAgfQogICAgICAvKioKICAgICAgICogcmVtb3ZlcyBhbiBpbnRlcmVzdCBmcm9tIHRoZSBpbnRlcmVzdCBtYXAKICAgICAgICovCiAgICAgIHJlbW92ZUludGVyZXN0KGludGVyZXN0QXJnKSB7CiAgICAgICAgY29uc3QgaW50ZXJlc3RUb1JlbW92ZSA9IHRoaXMuaW50ZXJlc3RPYmplY3RNYXAuZmluZE9uZUFuZFJlbW92ZVN5bmMoKGludGVyZXN0QXJnMikgPT4gewogICAgICAgICAgcmV0dXJuIGludGVyZXN0QXJnLmNvbXBhcmlzb25TdHJpbmcgPT09IGludGVyZXN0QXJnMi5jb21wYXJpc29uU3RyaW5nOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBjaGVjayBpbnRlcmVzdAogICAgICAgKi8KICAgICAgY2hlY2tJbnRlcmVzdChvYmplY3RBcmcpIHsKICAgICAgICBjb25zdCBjb21wYXJpc29uU3RyaW5nID0gdGhpcy5jb21wYXJpc29uRnVuYyhvYmplY3RBcmcpOwogICAgICAgIHJldHVybiB0aGlzLmNoZWNrSW50ZXJlc3RCeVN0cmluZyhjb21wYXJpc29uU3RyaW5nKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogY2hlY2tzIGFuIGludGVyZXN0CiAgICAgICAqIEBwYXJhbSBjb21wYXJpc29uU3RyaW5nQXJnCiAgICAgICAqLwogICAgICBjaGVja0ludGVyZXN0QnlTdHJpbmcoY29tcGFyaXNvblN0cmluZ0FyZykgewogICAgICAgIGNvbnN0IGZvdW5kSW50ZXJlc3QgPSB0aGlzLmludGVyZXN0T2JqZWN0TWFwLmZpbmRTeW5jKChpbnRlcmVzdCkgPT4gewogICAgICAgICAgcmV0dXJuIGludGVyZXN0LmNvbXBhcmlzb25TdHJpbmcgPT09IGNvbXBhcmlzb25TdHJpbmdBcmc7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGZvdW5kSW50ZXJlc3QpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBpbmZvcm0gbG9zdCBpbnRlcmVzdAogICAgICAgKiBAcGFyYW0gaW50ZXJlc3RJZAogICAgICAgKi8KICAgICAgaW5mb3JtTG9zdEludGVyZXN0KGludGVyZXN0SWQpIHsKICAgICAgICBjb25zdCB3YW50ZWRJbnRlcmVzdCA9IHRoaXMuZmluZEludGVyZXN0KGludGVyZXN0SWQpOwogICAgICAgIGlmICh3YW50ZWRJbnRlcmVzdCkgewogICAgICAgICAgd2FudGVkSW50ZXJlc3QubWFya0xvc3QoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGZpbmRzIGFuIGludGVyZXN0CiAgICAgICAqIEBwYXJhbSBpbnRlcmVzdElkCiAgICAgICAqLwogICAgICBmaW5kSW50ZXJlc3QoaW50ZXJlc3RJZCkgewogICAgICAgIGNvbnN0IGNvbXBhcmFibGVTdHJpbmcgPSB0aGlzLmNvbXBhcmlzb25GdW5jKGludGVyZXN0SWQpOwogICAgICAgIGNvbnN0IGludGVyZXN0ID0gdGhpcy5pbnRlcmVzdE9iamVjdE1hcC5maW5kU3luYygoaW50ZXJlc3RBcmcpID0+IHsKICAgICAgICAgIHJldHVybiBpbnRlcmVzdEFyZy5jb21wYXJpc29uU3RyaW5nID09PSBjb21wYXJhYmxlU3RyaW5nOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBpbnRlcmVzdDsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5saW1pdGVkYXJyYXkuanMKdmFyIExpbWl0ZWRBcnJheTsKdmFyIGluaXRfY2xhc3Nlc19saW1pdGVkYXJyYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMubGltaXRlZGFycmF5LmpzIigpIHsKICAgIGluaXRfY2xhc3Nlc19wbHVnaW5zKCk7CiAgICBMaW1pdGVkQXJyYXkgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKGxpbWl0QXJnKSB7CiAgICAgICAgdGhpcy5hcnJheSA9IFtdOwogICAgICAgIHRoaXMuYXJyYXlMaW1pdCA9IGxpbWl0QXJnOwogICAgICB9CiAgICAgIGFkZE9uZShvYmplY3RBcmcpIHsKICAgICAgICB0aGlzLmFycmF5LnVuc2hpZnQob2JqZWN0QXJnKTsKICAgICAgICBpZiAodGhpcy5hcnJheS5sZW5ndGggPiB0aGlzLmFycmF5TGltaXQpIHsKICAgICAgICAgIHRoaXMuYXJyYXkubGVuZ3RoID0gdGhpcy5hcnJheUxpbWl0OwogICAgICAgIH0KICAgICAgfQogICAgICBhZGRNYW55KG9iamVjdEFycmF5QXJnKSB7CiAgICAgICAgZm9yIChsZXQgb2JqZWN0QXJnIG9mIG9iamVjdEFycmF5QXJnKSB7CiAgICAgICAgICB0aGlzLmFkZE9uZShvYmplY3RBcmcpOwogICAgICAgIH0KICAgICAgfQogICAgICBzZXRMaW1pdChsaW1pdEFyZykgewogICAgICAgIHRoaXMuYXJyYXlMaW1pdCA9IGxpbWl0QXJnOwogICAgICAgIGlmICh0aGlzLmFycmF5Lmxlbmd0aCA+IHRoaXMuYXJyYXlMaW1pdCkgewogICAgICAgICAgdGhpcy5hcnJheS5sZW5ndGggPSB0aGlzLmFycmF5TGltaXQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGdldEF2ZXJhZ2UoKSB7CiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmFycmF5WzBdID09PSAibnVtYmVyIikgewogICAgICAgICAgbGV0IHN1bSA9IDA7CiAgICAgICAgICBmb3IgKGxldCBsb2NhbE51bWJlciBvZiB0aGlzLmFycmF5KSB7CiAgICAgICAgICAgIGxldCBsb2NhbE51bWJlckFueSA9IGxvY2FsTnVtYmVyOwogICAgICAgICAgICBzdW0gPSBzdW0gKyBsb2NhbE51bWJlckFueTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBzdW0gLyB0aGlzLmFycmF5Lmxlbmd0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMi4yL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLmxvb3B0cmFja2VyLmpzCnZhciBMb29wVHJhY2tlcjsKdmFyIGluaXRfY2xhc3Nlc19sb29wdHJhY2tlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjIuMi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5sb29wdHJhY2tlci5qcyIoKSB7CiAgICBpbml0X2NsYXNzZXNfcGx1Z2lucygpOwogICAgaW5pdF9jbGFzc2VzX29iamVjdG1hcCgpOwogICAgTG9vcFRyYWNrZXIgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMucmVmZXJlbmNlT2JqZWN0TWFwID0gbmV3IE9iamVjdE1hcCgpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBjaGVja3MgYW5kIHRyYWNrcyBhbiBvYmplY3QKICAgICAgICogQHBhcmFtIG9iamVjdEFyZwogICAgICAgKi8KICAgICAgY2hlY2tBbmRUcmFjayhvYmplY3RBcmcpIHsKICAgICAgICBpZiAoIXRoaXMucmVmZXJlbmNlT2JqZWN0TWFwLmNoZWNrRm9yT2JqZWN0KG9iamVjdEFyZykpIHsKICAgICAgICAgIHRoaXMucmVmZXJlbmNlT2JqZWN0TWFwLmFkZChvYmplY3RBcmcpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMuc3RyaW5nbWFwLmpzCnZhciBTdHJpbmdtYXA7CnZhciBpbml0X2NsYXNzZXNfc3RyaW5nbWFwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMi4yL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLnN0cmluZ21hcC5qcyIoKSB7CiAgICBpbml0X2NsYXNzZXNfcGx1Z2lucygpOwogICAgU3RyaW5nbWFwID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLl9zdHJpbmdBcnJheSA9IFtdOwogICAgICAgIHRoaXMuX3RyaWdnZXJVbnRpbFRydWVGdW5jdGlvbkFycmF5ID0gW107CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGFkZCBhIHN0cmluZyB0byB0aGUgU3RyaW5nbWFwCiAgICAgICAqLwogICAgICBhZGRTdHJpbmcoc3RyaW5nQXJnKSB7CiAgICAgICAgdGhpcy5fc3RyaW5nQXJyYXkucHVzaChzdHJpbmdBcmcpOwogICAgICAgIHRoaXMubm90aWZ5VHJpZ2dlcigpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBsaWtlIGFkZFN0cmluZywgYnV0IGFjY2VwdHMgYW4gYXJyYXkgb2Ygc3RyaW5ncwogICAgICAgKi8KICAgICAgYWRkU3RyaW5nQXJyYXkoc3RyaW5nQXJyYXlBcmcpIHsKICAgICAgICBmb3IgKGNvbnN0IHN0cmluZ0l0ZW0gb2Ygc3RyaW5nQXJyYXlBcmcpIHsKICAgICAgICAgIHRoaXMuYWRkU3RyaW5nKHN0cmluZ0l0ZW0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogcmVtb3ZlcyBhIHN0cmluZyBmcm9tIFN0cmluZ21hcAogICAgICAgKi8KICAgICAgcmVtb3ZlU3RyaW5nKHN0cmluZ0FyZykgewogICAgICAgIGZvciAoY29uc3Qga2V5QXJnIGluIHRoaXMuX3N0cmluZ0FycmF5KSB7CiAgICAgICAgICBpZiAodGhpcy5fc3RyaW5nQXJyYXlba2V5QXJnXSA9PT0gc3RyaW5nQXJnKSB7CiAgICAgICAgICAgIHRoaXMuX3N0cmluZ0FycmF5LnNwbGljZShwYXJzZUludChrZXlBcmcpLCAxKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5ub3RpZnlUcmlnZ2VyKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHdpcGVzIHRoZSBTdHJpbmdtYXAKICAgICAgICovCiAgICAgIHdpcGUoKSB7CiAgICAgICAgdGhpcy5fc3RyaW5nQXJyYXkgPSBbXTsKICAgICAgICB0aGlzLm5vdGlmeVRyaWdnZXIoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogY2hlY2sgaWYgc3RyaW5nIGlzIGluIFN0cmluZ21hcAogICAgICAgKi8KICAgICAgY2hlY2tTdHJpbmcoc3RyaW5nQXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmluZ0FycmF5LmluZGV4T2Yoc3RyaW5nQXJnKSAhPT0gLTE7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNoZWNrcyBzdHJpbmdQcmVzZW5jZSB3aXRoIG1pbmltYXRjaAogICAgICAgKi8KICAgICAgY2hlY2tNaW5pbWF0Y2gobWluaU1hdGNoU3RyaW5nQXJnKSB7CiAgICAgICAgY29uc3Qgc21hcnRNYXRjaEluc3RhbmNlID0gbmV3IGRpc3RfdHNfZXhwb3J0czUuU21hcnRNYXRjaChtaW5pTWF0Y2hTdHJpbmdBcmcpOwogICAgICAgIGxldCBmb3VuZE1hdGNoID0gZmFsc2U7CiAgICAgICAgZm9yIChjb25zdCBzdHJpbmdJdGVtIG9mIHRoaXMuX3N0cmluZ0FycmF5KSB7CiAgICAgICAgICBpZiAoc21hcnRNYXRjaEluc3RhbmNlLm1hdGNoKHN0cmluZ0l0ZW0pKSB7CiAgICAgICAgICAgIGZvdW5kTWF0Y2ggPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZm91bmRNYXRjaDsKICAgICAgfQogICAgICAvKioKICAgICAgICogY2hlY2tzIGlmIHRoZSBTdHJpbmdtYXAgaXMgZW1wdHkKICAgICAgICovCiAgICAgIGNoZWNrSXNFbXB0eSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc3RyaW5nQXJyYXkubGVuZ3RoID09PSAwOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBnZXRzIGEgY2xvbmVkIGNvcHkgb2YgdGhlIGN1cnJlbnQgc3RyaW5nIEFycmF5CiAgICAgICAqLwogICAgICBnZXRTdHJpbmdBcnJheSgpIHsKICAgICAgICBjb25zdCByZXR1cm5BcnJheSA9IFtdOwogICAgICAgIGZvciAoY29uc3Qgc3RyaW5nSXRlbSBvZiB0aGlzLl9zdHJpbmdBcnJheSkgewogICAgICAgICAgcmV0dXJuQXJyYXkucHVzaChzdHJpbmdJdGVtKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldHVybkFycmF5OwogICAgICB9CiAgICAgIC8vIHRyaWdnZXIgcmVnaXN0ZXJpbmcKICAgICAgLyoqCiAgICAgICAqIHJlZ2lzdGVyIGEgbmV3IHRyaWdnZXIKICAgICAgICovCiAgICAgIHJlZ2lzdGVyVW50aWxUcnVlKGZ1bmN0aW9uQXJnLCBjYWxsYmFja0FyZykgewogICAgICAgIGNvbnN0IHRydWVEZWZlcnJlZCA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgICAgIHRoaXMuX3RyaWdnZXJVbnRpbFRydWVGdW5jdGlvbkFycmF5LnB1c2goKCkgPT4gewogICAgICAgICAgY29uc3QgcmVzdWx0ID0gZnVuY3Rpb25BcmcodGhpcy5nZXRTdHJpbmdBcnJheSgpKTsKICAgICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHsKICAgICAgICAgICAgaWYgKGNhbGxiYWNrQXJnKSB7CiAgICAgICAgICAgICAgY2FsbGJhY2tBcmcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnVlRGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9KTsKICAgICAgICB0aGlzLm5vdGlmeVRyaWdnZXIoKTsKICAgICAgICByZXR1cm4gdHJ1ZURlZmVycmVkLnByb21pc2U7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIG5vdGlmaWVzIHRyaWdnZXJzCiAgICAgICAqLwogICAgICBub3RpZnlUcmlnZ2VyKCkgewogICAgICAgIGNvbnN0IGZpbHRlcmVkQXJyYXkgPSB0aGlzLl90cmlnZ2VyVW50aWxUcnVlRnVuY3Rpb25BcnJheS5maWx0ZXIoKGZ1bmN0aW9uQXJnKSA9PiB7CiAgICAgICAgICByZXR1cm4gIWZ1bmN0aW9uQXJnKCk7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5fdHJpZ2dlclVudGlsVHJ1ZUZ1bmN0aW9uQXJyYXkgPSBmaWx0ZXJlZEFycmF5OwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMi4yL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLnRpbWVkYWdncmVnYXRvci5qcwp2YXIgVGltZWRBZ2dyZWd0b3I7CnZhciBpbml0X2NsYXNzZXNfdGltZWRhZ2dyZWdhdG9yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMi4yL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLnRpbWVkYWdncmVnYXRvci5qcyIoKSB7CiAgICBpbml0X2NsYXNzZXNfcGx1Z2lucygpOwogICAgVGltZWRBZ2dyZWd0b3IgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKG9wdGlvbnNBcmcpIHsKICAgICAgICB0aGlzLnN0b3JhZ2VBcnJheSA9IFtdOwogICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNBcmc7CiAgICAgIH0KICAgICAgY2hlY2tBZ2dyZWdhdGlvblN0YXR1cygpIHsKICAgICAgICBjb25zdCBhZGRBZ2dyZWdhdGlvblRpbWVyID0gKCkgPT4gewogICAgICAgICAgdGhpcy5hZ2dyZWdhdGlvblRpbWVyID0gbmV3IGRpc3RfdHNfZXhwb3J0czcuVGltZXIodGhpcy5vcHRpb25zLmFnZ3JlZ2F0aW9uSW50ZXJ2YWxJbk1pbGxpcyk7CiAgICAgICAgICB0aGlzLmFnZ3JlZ2F0aW9uVGltZXIuY29tcGxldGVkLnRoZW4oKCkgPT4gewogICAgICAgICAgICBjb25zdCBhZ2dyZWdhdGVGb3JQcm9jZXNzaW5nID0gdGhpcy5zdG9yYWdlQXJyYXk7CiAgICAgICAgICAgIGlmIChhZ2dyZWdhdGVGb3JQcm9jZXNzaW5nLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgIHRoaXMuYWdncmVnYXRpb25UaW1lciA9IG51bGw7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc3RvcmFnZUFycmF5ID0gW107CiAgICAgICAgICAgIGFkZEFnZ3JlZ2F0aW9uVGltZXIoKTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLmZ1bmN0aW9uRm9yQWdncmVnYXRpb24oYWdncmVnYXRlRm9yUHJvY2Vzc2luZyk7CiAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMuYWdncmVnYXRpb25UaW1lci5zdGFydCgpOwogICAgICAgIH07CiAgICAgICAgaWYgKCF0aGlzLmFnZ3JlZ2F0aW9uVGltZXIpIHsKICAgICAgICAgIGFkZEFnZ3JlZ2F0aW9uVGltZXIoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYWRkKGFnZ3JlZ2F0aW9uQXJnKSB7CiAgICAgICAgdGhpcy5zdG9yYWdlQXJyYXkucHVzaChhZ2dyZWdhdGlvbkFyZyk7CiAgICAgICAgdGhpcy5jaGVja0FnZ3JlZ2F0aW9uU3RhdHVzKCk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMudHJlZS5qcwp2YXIgVHJlZTsKdmFyIGluaXRfY2xhc3Nlc190cmVlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMi4yL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLnRyZWUuanMiKCkgewogICAgaW5pdF9jbGFzc2VzX3BsdWdpbnMoKTsKICAgIFRyZWUgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuc3ltYm9sVHJlZSA9IG5ldyBpbXBvcnRfc3ltYm9sX3RyZWUuZGVmYXVsdCgpOwogICAgICB9CiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAvLyBGdW5jdGlvbnMgdGhhdCBtYXAgdG8gdGhlIGZ1bmN0aW9uYWxpdHkgb2Ygc3ltYm9sLXRyZWUKICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIC8qKgogICAgICAgKgogICAgICAgKiBAcGFyYW0gb2JqZWN0QXJnCiAgICAgICAqLwogICAgICBpbml0aWFsaXplKG9iamVjdEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuaW5pdGlhbGl6ZShvYmplY3RBcmcpOwogICAgICB9CiAgICAgIGhhc0NoaWxkcmVuKG9iamVjdEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuaGFzQ2hpbGRyZW4ob2JqZWN0QXJnKTsKICAgICAgfQogICAgICBmaXJzdENoaWxkKG9iamVjdEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuZmlyc3RDaGlsZChvYmplY3RBcmcpOwogICAgICB9CiAgICAgIGxhc3RDaGlsZChvYmplY3RBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmxhc3RDaGlsZChvYmplY3RBcmcpOwogICAgICB9CiAgICAgIHByZXZpb3VzU2libGluZyhvYmplY3RBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLnByZXZpb3VzU2libGluZyhvYmplY3RBcmcpOwogICAgICB9CiAgICAgIG5leHRTaWJsaW5nKG9iamVjdEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUubmV4dFNpYmxpbmcob2JqZWN0QXJnKTsKICAgICAgfQogICAgICBwYXJlbnQob2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5wYXJlbnQob2JqZWN0QXJnKTsKICAgICAgfQogICAgICBsYXN0SW5jbHVzaXZlRGVzY2VuZGFudChvYmplY3RBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmxhc3RJbmNsdXNpdmVEZXNjZW5kYW50KG9iamVjdEFyZyk7CiAgICAgIH0KICAgICAgcHJlY2VkaW5nKG9iamVjdEFyZywgb3B0aW9uc0FyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUucHJlY2VkaW5nKG9iamVjdEFyZywgb3B0aW9uc0FyZyk7CiAgICAgIH0KICAgICAgZm9sbG93aW5nKG9iamVjdCwgb3B0aW9uc0FyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuZm9sbG93aW5nKG9iamVjdCwgb3B0aW9uc0FyZyk7CiAgICAgIH0KICAgICAgY2hpbGRyZW5Ub0FycmF5KHBhcmVudEFyZywgb3B0aW9uc0FyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuY2hpbGRyZW5Ub0FycmF5KHBhcmVudEFyZywgb3B0aW9uc0FyZyk7CiAgICAgIH0KICAgICAgYW5jZXN0b3JzVG9BcnJheShvYmplY3RBcmcsIG9wdGlvbnNBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmFuY2VzdG9yc1RvQXJyYXkob2JqZWN0QXJnLCBvcHRpb25zQXJnKTsKICAgICAgfQogICAgICB0cmVlVG9BcnJheShyb290QXJnLCBvcHRpb25zQXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS50cmVlVG9BcnJheShyb290QXJnLCBvcHRpb25zQXJnKTsKICAgICAgfQogICAgICBjaGlsZHJlbkl0ZXJhdG9yKHBhcmVudEFyZywgb3B0aW9uc0FyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuY2hpbGRyZW5JdGVyYXRvcihwYXJlbnRBcmcsIG9wdGlvbnNBcmcpOwogICAgICB9CiAgICAgIHByZXZpb3VzU2libGluZ3NJdGVyYXRvcihvYmplY3RBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLnByZXZpb3VzU2libGluZ3NJdGVyYXRvcihvYmplY3RBcmcpOwogICAgICB9CiAgICAgIG5leHRTaWJsaW5nc0l0ZXJhdG9yKG9iamVjdEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUubmV4dFNpYmxpbmdzSXRlcmF0b3IoKTsKICAgICAgfQogICAgICBhbmNlc3RvcnNJdGVyYXRvcihvYmplY3RBcmcpIHsKICAgICAgICB0aGlzLnN5bWJvbFRyZWUuYW5jZXN0b3JzSXRlcmF0b3IoKTsKICAgICAgfQogICAgICB0cmVlSXRlcmF0b3Iocm9vdEFyZywgb3B0aW9uc0FyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUudHJlZUl0ZXJhdG9yKHJvb3RBcmcpOwogICAgICB9CiAgICAgIGluZGV4KGNoaWxkQXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5pbmRleChjaGlsZEFyZyk7CiAgICAgIH0KICAgICAgY2hpbGRyZW5Db3VudChwYXJlbnRBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmNoaWxkcmVuQ291bnQocGFyZW50QXJnKTsKICAgICAgfQogICAgICBjb21wYXJlVHJlZVBvc2l0aW9uKGxlZnRBcmcsIHJpZ2h0QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZVRyZWVQb3NpdGlvbihsZWZ0QXJnLCByaWdodEFyZyk7CiAgICAgIH0KICAgICAgcmVtb3ZlKHJlbW92ZU9iamVjdEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUucmVtb3ZlKHJlbW92ZU9iamVjdEFyZyk7CiAgICAgIH0KICAgICAgaW5zZXJ0QmVmb3JlKHJlZmVyZW5jZU9iamVjdEFyZywgbmV3T2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5pbnNlcnRCZWZvcmUocmVmZXJlbmNlT2JqZWN0QXJnLCBuZXdPYmplY3RBcmcpOwogICAgICB9CiAgICAgIGluc2VydEFmdGVyKHJlZmVyZW5jZU9iamVjdCwgbmV3T2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5pbnNlcnRBZnRlcihyZWZlcmVuY2VPYmplY3QsIG5ld09iamVjdEFyZyk7CiAgICAgIH0KICAgICAgcHJlcGVuZENoaWxkKHJlZmVyZW5jZU9iamVjdEFyZywgbmV3T2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5wcmVwZW5kQ2hpbGQocmVmZXJlbmNlT2JqZWN0QXJnLCBuZXdPYmplY3RBcmcpOwogICAgICB9CiAgICAgIGFwcGVuZENoaWxkKHJlZmVyZW5jZU9iamVjdEFyZywgbmV3T2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5hcHBlbmRDaGlsZChyZWZlcmVuY2VPYmplY3RBcmcsIG5ld09iamVjdEFyZyk7CiAgICAgIH0KICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAvLyBGdW5jdGlvbmlvbmFsaXR5IHRoYXQgZXh0ZW5kcyBzeW1ib2wtdHJlZQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIC8qKgogICAgICAgKiByZXR1cm5zIGEgYnJhbmNoIG9mIHRoZSB0cmVlIGFzIEpTT04KICAgICAgICogY2FuIGJlIHVzZXIKICAgICAgICovCiAgICAgIHRvSnNvbldpdGhIaWVyYWNoeShyb290RWxlbWVudCkgewogICAgICAgIGNvbnN0IHRyZWVJdGVyYWJsZSA9IHRoaXMudHJlZUl0ZXJhdG9yKHJvb3RFbGVtZW50LCB7fSk7CiAgICAgICAgZm9yIChjb25zdCB0cmVlSXRlbSBvZiB0cmVlSXRlcmFibGUpIHsKICAgICAgICAgIGNvbnNvbGUubG9nKHRyZWVJdGVtKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGJ1aWxkcyBhIHRyZWUgZnJvbSBhIEpTT04gd2l0aCBoaWVyYWNoeQogICAgICAgKiBAcGFyYW0gcm9vdEVsZW1lbnQKICAgICAgICovCiAgICAgIGZyb21Kc29uV2l0aEhpZXJhY2h5KHJvb3RFbGVtZW50KSB7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4yLjIvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHM2ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czYsIHsKICBBc3luY0V4ZWN1dGlvblN0YWNrOiAoKSA9PiBBc3luY0V4ZWN1dGlvblN0YWNrLAogIEJhY2twcmVzc3VyZWRBcnJheTogKCkgPT4gQmFja3ByZXNzdXJlZEFycmF5LAogIEZhc3RNYXA6ICgpID0+IEZhc3RNYXAsCiAgSW50ZXJlc3Q6ICgpID0+IEludGVyZXN0LAogIEludGVyZXN0TWFwOiAoKSA9PiBJbnRlcmVzdE1hcCwKICBMaW1pdGVkQXJyYXk6ICgpID0+IExpbWl0ZWRBcnJheSwKICBMb29wVHJhY2tlcjogKCkgPT4gTG9vcFRyYWNrZXIsCiAgT2JqZWN0TWFwOiAoKSA9PiBPYmplY3RNYXAsCiAgU3RyaW5nbWFwOiAoKSA9PiBTdHJpbmdtYXAsCiAgVGltZWRBZ2dyZWd0b3I6ICgpID0+IFRpbWVkQWdncmVndG9yLAogIFRyZWU6ICgpID0+IFRyZWUsCiAgdW5pOiAoKSA9PiB1bmkKfSk7CnZhciBpbml0X2Rpc3RfdHM3ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMi4yL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9pbmRleC5qcyIoKSB7CiAgICBpbml0X2NsYXNzZXNfYXN5bmNleGVjdXRpb25zdGFjaygpOwogICAgaW5pdF9jbGFzc2VzX2JhY2twcmVzc3VyZWRhcnJheSgpOwogICAgaW5pdF9jbGFzc2VzX2Zhc3RtYXAoKTsKICAgIGluaXRfY2xhc3Nlc19pbnRlcmVzdG1hcCgpOwogICAgaW5pdF9jbGFzc2VzX2ludGVyZXN0bWFwX2ludGVyZXN0KCk7CiAgICBpbml0X2NsYXNzZXNfbGltaXRlZGFycmF5KCk7CiAgICBpbml0X2NsYXNzZXNfbG9vcHRyYWNrZXIoKTsKICAgIGluaXRfY2xhc3Nlc19vYmplY3RtYXAoKTsKICAgIGluaXRfY2xhc3Nlc19zdHJpbmdtYXAoKTsKICAgIGluaXRfY2xhc3Nlc190aW1lZGFnZ3JlZ2F0b3IoKTsKICAgIGluaXRfY2xhc3Nlc190cmVlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9jcm9uZXJAMTAuMC4xL25vZGVfbW9kdWxlcy9jcm9uZXIvZGlzdC9jcm9uZXIuanMKdmFyIGNyb25lcl9leHBvcnRzMiA9IHt9OwpfX2V4cG9ydChjcm9uZXJfZXhwb3J0czIsIHsKICBDcm9uOiAoKSA9PiBFMiwKICBDcm9uRGF0ZTogKCkgPT4gbTMsCiAgQ3JvblBhdHRlcm46ICgpID0+IEMyLAogIHNjaGVkdWxlZEpvYnM6ICgpID0+IHcyCn0pOwpmdW5jdGlvbiBUMihzMTApIHsKICByZXR1cm4gRGF0ZS5VVEMoczEwLnksIHMxMC5tIC0gMSwgczEwLmQsIHMxMC5oLCBzMTAuaSwgczEwLnMpOwp9CmZ1bmN0aW9uIEQzKHMxMCwgZTExKSB7CiAgcmV0dXJuIHMxMC55ID09PSBlMTEueSAmJiBzMTAubSA9PT0gZTExLm0gJiYgczEwLmQgPT09IGUxMS5kICYmIHMxMC5oID09PSBlMTEuaCAmJiBzMTAuaSA9PT0gZTExLmkgJiYgczEwLnMgPT09IGUxMS5zOwp9CmZ1bmN0aW9uIEEyKHMxMCwgZTExKSB7CiAgbGV0IHQ5ID0gbmV3IERhdGUoRGF0ZS5wYXJzZShzMTApKTsKICBpZiAoaXNOYU4odDkpKSB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgSVNPODYwMSBwYXNzZWQgdG8gdGltZXpvbmUgcGFyc2VyLiIpOwogIGxldCByMTEgPSBzMTAuc3Vic3RyaW5nKDkpOwogIHJldHVybiByMTEuaW5jbHVkZXMoIloiKSB8fCByMTEuaW5jbHVkZXMoIisiKSB8fCByMTEuaW5jbHVkZXMoIi0iKSA/IGI0KHQ5LmdldFVUQ0Z1bGxZZWFyKCksIHQ5LmdldFVUQ01vbnRoKCkgKyAxLCB0OS5nZXRVVENEYXRlKCksIHQ5LmdldFVUQ0hvdXJzKCksIHQ5LmdldFVUQ01pbnV0ZXMoKSwgdDkuZ2V0VVRDU2Vjb25kcygpLCAiRXRjL1VUQyIpIDogYjQodDkuZ2V0RnVsbFllYXIoKSwgdDkuZ2V0TW9udGgoKSArIDEsIHQ5LmdldERhdGUoKSwgdDkuZ2V0SG91cnMoKSwgdDkuZ2V0TWludXRlcygpLCB0OS5nZXRTZWNvbmRzKCksIGUxMSk7Cn0KZnVuY3Rpb24gdjMoczEwLCBlMTEsIHQ5KSB7CiAgcmV0dXJuIGszKEEyKHMxMCwgZTExKSwgdDkpOwp9CmZ1bmN0aW9uIGszKHMxMCwgZTExKSB7CiAgbGV0IHQ5ID0gbmV3IERhdGUoVDIoczEwKSksIHIxMSA9IGczKHQ5LCBzMTAudHopLCBuMTMgPSBUMihzMTApLCBpMTEgPSBUMihyMTEpLCBhNSA9IG4xMyAtIGkxMSwgbzEzID0gbmV3IERhdGUodDkuZ2V0VGltZSgpICsgYTUpLCBoOSA9IGczKG8xMywgczEwLnR6KTsKICBpZiAoRDMoaDksIHMxMCkpIHsKICAgIGxldCB1NyA9IG5ldyBEYXRlKG8xMy5nZXRUaW1lKCkgLSAzNmU1KSwgZDYgPSBnMyh1NywgczEwLnR6KTsKICAgIHJldHVybiBEMyhkNiwgczEwKSA/IHU3IDogbzEzOwogIH0KICBsZXQgbDYgPSBuZXcgRGF0ZShvMTMuZ2V0VGltZSgpICsgVDIoczEwKSAtIFQyKGg5KSksIHk1ID0gZzMobDYsIHMxMC50eik7CiAgaWYgKEQzKHk1LCBzMTApKSByZXR1cm4gbDY7CiAgaWYgKGUxMSkgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGRhdGUgcGFzc2VkIHRvIGZyb21UWigpIik7CiAgcmV0dXJuIG8xMy5nZXRUaW1lKCkgPiBsNi5nZXRUaW1lKCkgPyBvMTMgOiBsNjsKfQpmdW5jdGlvbiBnMyhzMTAsIGUxMSkgewogIGxldCB0OSwgcjExOwogIHRyeSB7CiAgICB0OSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCJlbi1VUyIsIHsgdGltZVpvbmU6IGUxMSwgeWVhcjogIm51bWVyaWMiLCBtb250aDogIm51bWVyaWMiLCBkYXk6ICJudW1lcmljIiwgaG91cjogIm51bWVyaWMiLCBtaW51dGU6ICJudW1lcmljIiwgc2Vjb25kOiAibnVtZXJpYyIsIGhvdXIxMjogZmFsc2UgfSksIHIxMSA9IHQ5LmZvcm1hdFRvUGFydHMoczEwKTsKICB9IGNhdGNoIChpMTEpIHsKICAgIGxldCBhNSA9IGkxMSBpbnN0YW5jZW9mIEVycm9yID8gaTExLm1lc3NhZ2UgOiBTdHJpbmcoaTExKTsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGB0b1RaOiBJbnZhbGlkIHRpbWV6b25lICcke2UxMX0nIG9yIGRhdGUuIFBsZWFzZSBwcm92aWRlIGEgdmFsaWQgSUFOQSB0aW1lem9uZSAoZS5nLiwgJ0FtZXJpY2EvTmV3X1lvcmsnLCAnRXVyb3BlL1N0b2NraG9sbScpLiBPcmlnaW5hbCBlcnJvcjogJHthNX1gKTsKICB9CiAgbGV0IG4xMyA9IHsgeWVhcjogMCwgbW9udGg6IDAsIGRheTogMCwgaG91cjogMCwgbWludXRlOiAwLCBzZWNvbmQ6IDAgfTsKICBmb3IgKGxldCBpMTEgb2YgcjExKSAoaTExLnR5cGUgPT09ICJ5ZWFyIiB8fCBpMTEudHlwZSA9PT0gIm1vbnRoIiB8fCBpMTEudHlwZSA9PT0gImRheSIgfHwgaTExLnR5cGUgPT09ICJob3VyIiB8fCBpMTEudHlwZSA9PT0gIm1pbnV0ZSIgfHwgaTExLnR5cGUgPT09ICJzZWNvbmQiKSAmJiAobjEzW2kxMS50eXBlXSA9IHBhcnNlSW50KGkxMS52YWx1ZSwgMTApKTsKICBpZiAoaXNOYU4objEzLnllYXIpIHx8IGlzTmFOKG4xMy5tb250aCkgfHwgaXNOYU4objEzLmRheSkgfHwgaXNOYU4objEzLmhvdXIpIHx8IGlzTmFOKG4xMy5taW51dGUpIHx8IGlzTmFOKG4xMy5zZWNvbmQpKSB0aHJvdyBuZXcgRXJyb3IoYHRvVFo6IEZhaWxlZCB0byBwYXJzZSBhbGwgZGF0ZSBjb21wb25lbnRzIGZyb20gdGltZXpvbmUgJyR7ZTExfScuIFRoaXMgbWF5IGluZGljYXRlIGFuIGludmFsaWQgZGF0ZSBvciB0aW1lem9uZSBjb25maWd1cmF0aW9uLiBQYXJzZWQgY29tcG9uZW50czogJHtKU09OLnN0cmluZ2lmeShuMTMpfWApOwogIHJldHVybiBuMTMuaG91ciA9PT0gMjQgJiYgKG4xMy5ob3VyID0gMCksIHsgeTogbjEzLnllYXIsIG06IG4xMy5tb250aCwgZDogbjEzLmRheSwgaDogbjEzLmhvdXIsIGk6IG4xMy5taW51dGUsIHM6IG4xMy5zZWNvbmQsIHR6OiBlMTEgfTsKfQpmdW5jdGlvbiBiNChzMTAsIGUxMSwgdDksIHIxMSwgbjEzLCBpMTEsIGE1KSB7CiAgcmV0dXJuIHsgeTogczEwLCBtOiBlMTEsIGQ6IHQ5LCBoOiByMTEsIGk6IG4xMywgczogaTExLCB0ejogYTUgfTsKfQpmdW5jdGlvbiBSMyhzMTApIHsKICBpZiAoczEwID09PSB2b2lkIDAgJiYgKHMxMCA9IHt9KSwgZGVsZXRlIHMxMC5uYW1lLCBzMTAubGVnYWN5TW9kZSAhPT0gdm9pZCAwICYmIHMxMC5kb21BbmREb3cgPT09IHZvaWQgMCA/IHMxMC5kb21BbmREb3cgPSAhczEwLmxlZ2FjeU1vZGUgOiBzMTAuZG9tQW5kRG93ID09PSB2b2lkIDAgJiYgKHMxMC5kb21BbmREb3cgPSBmYWxzZSksIHMxMC5sZWdhY3lNb2RlID0gIXMxMC5kb21BbmREb3csIHMxMC5wYXVzZWQgPSBzMTAucGF1c2VkID09PSB2b2lkIDAgPyBmYWxzZSA6IHMxMC5wYXVzZWQsIHMxMC5tYXhSdW5zID0gczEwLm1heFJ1bnMgPT09IHZvaWQgMCA/IDEgLyAwIDogczEwLm1heFJ1bnMsIHMxMC5jYXRjaCA9IHMxMC5jYXRjaCA9PT0gdm9pZCAwID8gZmFsc2UgOiBzMTAuY2F0Y2gsIHMxMC5pbnRlcnZhbCA9IHMxMC5pbnRlcnZhbCA9PT0gdm9pZCAwID8gMCA6IHBhcnNlSW50KHMxMC5pbnRlcnZhbC50b1N0cmluZygpLCAxMCksIHMxMC51dGNPZmZzZXQgPSBzMTAudXRjT2Zmc2V0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJzZUludChzMTAudXRjT2Zmc2V0LnRvU3RyaW5nKCksIDEwKSwgczEwLmRheU9mZnNldCA9IHMxMC5kYXlPZmZzZXQgPT09IHZvaWQgMCA/IDAgOiBwYXJzZUludChzMTAuZGF5T2Zmc2V0LnRvU3RyaW5nKCksIDEwKSwgczEwLnVucmVmID0gczEwLnVucmVmID09PSB2b2lkIDAgPyBmYWxzZSA6IHMxMC51bnJlZiwgczEwLm1vZGUgPSBzMTAubW9kZSA9PT0gdm9pZCAwID8gImF1dG8iIDogczEwLm1vZGUsIHMxMC5hbHRlcm5hdGl2ZVdlZWtkYXlzID0gczEwLmFsdGVybmF0aXZlV2Vla2RheXMgPT09IHZvaWQgMCA/IGZhbHNlIDogczEwLmFsdGVybmF0aXZlV2Vla2RheXMsIHMxMC5zbG9wcHlSYW5nZXMgPSBzMTAuc2xvcHB5UmFuZ2VzID09PSB2b2lkIDAgPyBmYWxzZSA6IHMxMC5zbG9wcHlSYW5nZXMsICFbImF1dG8iLCAiNS1wYXJ0IiwgIjYtcGFydCIsICI3LXBhcnQiLCAiNS1vci02LXBhcnRzIiwgIjYtb3ItNy1wYXJ0cyJdLmluY2x1ZGVzKHMxMC5tb2RlKSkgdGhyb3cgbmV3IEVycm9yKCJDcm9uT3B0aW9uczogbW9kZSBtdXN0IGJlIG9uZSBvZiAnYXV0bycsICc1LXBhcnQnLCAnNi1wYXJ0JywgJzctcGFydCcsICc1LW9yLTYtcGFydHMnLCBvciAnNi1vci03LXBhcnRzJy4iKTsKICBpZiAoczEwLnN0YXJ0QXQgJiYgKHMxMC5zdGFydEF0ID0gbmV3IG0zKHMxMC5zdGFydEF0LCBzMTAudGltZXpvbmUpKSwgczEwLnN0b3BBdCAmJiAoczEwLnN0b3BBdCA9IG5ldyBtMyhzMTAuc3RvcEF0LCBzMTAudGltZXpvbmUpKSwgczEwLmludGVydmFsICE9PSBudWxsKSB7CiAgICBpZiAoaXNOYU4oczEwLmludGVydmFsKSkgdGhyb3cgbmV3IEVycm9yKCJDcm9uT3B0aW9uczogU3VwcGxpZWQgdmFsdWUgZm9yIGludGVydmFsIGlzIG5vdCBhIG51bWJlciIpOwogICAgaWYgKHMxMC5pbnRlcnZhbCA8IDApIHRocm93IG5ldyBFcnJvcigiQ3Jvbk9wdGlvbnM6IFN1cHBsaWVkIHZhbHVlIGZvciBpbnRlcnZhbCBjYW4gbm90IGJlIG5lZ2F0aXZlIik7CiAgfQogIGlmIChzMTAudXRjT2Zmc2V0ICE9PSB2b2lkIDApIHsKICAgIGlmIChpc05hTihzMTAudXRjT2Zmc2V0KSkgdGhyb3cgbmV3IEVycm9yKCJDcm9uT3B0aW9uczogSW52YWxpZCB2YWx1ZSBwYXNzZWQgZm9yIHV0Y09mZnNldCwgc2hvdWxkIGJlIG51bWJlciByZXByZXNlbnRpbmcgbWludXRlcyBvZmZzZXQgZnJvbSBVVEMuIik7CiAgICBpZiAoczEwLnV0Y09mZnNldCA8IC04NzAgfHwgczEwLnV0Y09mZnNldCA+IDg3MCkgdGhyb3cgbmV3IEVycm9yKCJDcm9uT3B0aW9uczogdXRjT2Zmc2V0IG91dCBvZiBib3VuZHMuIik7CiAgICBpZiAoczEwLnV0Y09mZnNldCAhPT0gdm9pZCAwICYmIHMxMC50aW1lem9uZSkgdGhyb3cgbmV3IEVycm9yKCJDcm9uT3B0aW9uczogQ29tYmluaW5nICd1dGNPZmZzZXQnIHdpdGggJ3RpbWV6b25lJyBpcyBub3QgYWxsb3dlZC4iKTsKICB9CiAgaWYgKHMxMC51bnJlZiAhPT0gdHJ1ZSAmJiBzMTAudW5yZWYgIT09IGZhbHNlKSB0aHJvdyBuZXcgRXJyb3IoIkNyb25PcHRpb25zOiBVbnJlZiBzaG91bGQgYmUgZWl0aGVyIHRydWUsIGZhbHNlIG9yIHVuZGVmaW5lZChmYWxzZSkuIik7CiAgaWYgKHMxMC5kYXlPZmZzZXQgIT09IHZvaWQgMCAmJiBzMTAuZGF5T2Zmc2V0ICE9PSAwICYmIGlzTmFOKHMxMC5kYXlPZmZzZXQpKSB0aHJvdyBuZXcgRXJyb3IoIkNyb25PcHRpb25zOiBJbnZhbGlkIHZhbHVlIHBhc3NlZCBmb3IgZGF5T2Zmc2V0LCBzaG91bGQgYmUgYSBudW1iZXIgcmVwcmVzZW50aW5nIGRheXMgdG8gb2Zmc2V0LiIpOwogIHJldHVybiBzMTA7Cn0KZnVuY3Rpb24gcDQoczEwKSB7CiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzMTApID09PSAiW29iamVjdCBGdW5jdGlvbl0iIHx8IHR5cGVvZiBzMTAgPT0gImZ1bmN0aW9uIiB8fCBzMTAgaW5zdGFuY2VvZiBGdW5jdGlvbjsKfQpmdW5jdGlvbiBfMyhzMTApIHsKICByZXR1cm4gcDQoczEwKTsKfQpmdW5jdGlvbiB4MihzMTApIHsKICB0eXBlb2YgRGVubyA8ICJ1IiAmJiB0eXBlb2YgRGVuby51bnJlZlRpbWVyIDwgInUiID8gRGVuby51bnJlZlRpbWVyKHMxMCkgOiBzMTAgJiYgdHlwZW9mIHMxMC51bnJlZiA8ICJ1IiAmJiBzMTAudW5yZWYoKTsKfQp2YXIgTzIsIEMyLCBQMywgZjQsIG0zLCBXLCB3MiwgRTI7CnZhciBpbml0X2Nyb25lcjIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9jcm9uZXJAMTAuMC4xL25vZGVfbW9kdWxlcy9jcm9uZXIvZGlzdC9jcm9uZXIuanMiKCkgewogICAgTzIgPSBbMSwgMiwgNCwgOCwgMTZdLCBDMiA9IGNsYXNzIHsKICAgICAgcGF0dGVybjsKICAgICAgdGltZXpvbmU7CiAgICAgIG1vZGU7CiAgICAgIGFsdGVybmF0aXZlV2Vla2RheXM7CiAgICAgIHNsb3BweVJhbmdlczsKICAgICAgc2Vjb25kOwogICAgICBtaW51dGU7CiAgICAgIGhvdXI7CiAgICAgIGRheTsKICAgICAgbW9udGg7CiAgICAgIGRheU9mV2VlazsKICAgICAgeWVhcjsKICAgICAgbGFzdERheU9mTW9udGg7CiAgICAgIGxhc3RXZWVrZGF5OwogICAgICBuZWFyZXN0V2Vla2RheXM7CiAgICAgIHN0YXJET007CiAgICAgIHN0YXJET1c7CiAgICAgIHN0YXJZZWFyOwogICAgICB1c2VBbmRMb2dpYzsKICAgICAgY29uc3RydWN0b3IoZTExLCB0OSwgcjExKSB7CiAgICAgICAgdGhpcy5wYXR0ZXJuID0gZTExLCB0aGlzLnRpbWV6b25lID0gdDksIHRoaXMubW9kZSA9IHIxMT8ubW9kZSA/PyAiYXV0byIsIHRoaXMuYWx0ZXJuYXRpdmVXZWVrZGF5cyA9IHIxMT8uYWx0ZXJuYXRpdmVXZWVrZGF5cyA/PyBmYWxzZSwgdGhpcy5zbG9wcHlSYW5nZXMgPSByMTE/LnNsb3BweVJhbmdlcyA/PyBmYWxzZSwgdGhpcy5zZWNvbmQgPSBBcnJheSg2MCkuZmlsbCgwKSwgdGhpcy5taW51dGUgPSBBcnJheSg2MCkuZmlsbCgwKSwgdGhpcy5ob3VyID0gQXJyYXkoMjQpLmZpbGwoMCksIHRoaXMuZGF5ID0gQXJyYXkoMzEpLmZpbGwoMCksIHRoaXMubW9udGggPSBBcnJheSgxMikuZmlsbCgwKSwgdGhpcy5kYXlPZldlZWsgPSBBcnJheSg3KS5maWxsKDApLCB0aGlzLnllYXIgPSBBcnJheSgxZTQpLmZpbGwoMCksIHRoaXMubGFzdERheU9mTW9udGggPSBmYWxzZSwgdGhpcy5sYXN0V2Vla2RheSA9IGZhbHNlLCB0aGlzLm5lYXJlc3RXZWVrZGF5cyA9IEFycmF5KDMxKS5maWxsKDApLCB0aGlzLnN0YXJET00gPSBmYWxzZSwgdGhpcy5zdGFyRE9XID0gZmFsc2UsIHRoaXMuc3RhclllYXIgPSBmYWxzZSwgdGhpcy51c2VBbmRMb2dpYyA9IGZhbHNlLCB0aGlzLnBhcnNlKCk7CiAgICAgIH0KICAgICAgcGFyc2UoKSB7CiAgICAgICAgaWYgKCEodHlwZW9mIHRoaXMucGF0dGVybiA9PSAic3RyaW5nIiB8fCB0aGlzLnBhdHRlcm4gaW5zdGFuY2VvZiBTdHJpbmcpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogUGF0dGVybiBoYXMgdG8gYmUgb2YgdHlwZSBzdHJpbmcuIik7CiAgICAgICAgdGhpcy5wYXR0ZXJuLmluZGV4T2YoIkAiKSA+PSAwICYmICh0aGlzLnBhdHRlcm4gPSB0aGlzLmhhbmRsZU5pY2tuYW1lcyh0aGlzLnBhdHRlcm4pLnRyaW0oKSk7CiAgICAgICAgbGV0IGUxMSA9IHRoaXMucGF0dGVybi5tYXRjaCgvXFMrL2cpIHx8IFsiIl0sIHQ5ID0gZTExLmxlbmd0aDsKICAgICAgICBpZiAoZTExLmxlbmd0aCA8IDUgfHwgZTExLmxlbmd0aCA+IDcpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gZm9ybWF0ICgnIiArIHRoaXMucGF0dGVybiArICInKSwgZXhhY3RseSBmaXZlLCBzaXgsIG9yIHNldmVuIHNwYWNlIHNlcGFyYXRlZCBwYXJ0cyBhcmUgcmVxdWlyZWQuIik7CiAgICAgICAgaWYgKHRoaXMubW9kZSAhPT0gImF1dG8iKSB7CiAgICAgICAgICBsZXQgbjEzOwogICAgICAgICAgc3dpdGNoICh0aGlzLm1vZGUpIHsKICAgICAgICAgICAgY2FzZSAiNS1wYXJ0IjoKICAgICAgICAgICAgICBuMTMgPSA1OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICI2LXBhcnQiOgogICAgICAgICAgICAgIG4xMyA9IDY7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIjctcGFydCI6CiAgICAgICAgICAgICAgbjEzID0gNzsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiNS1vci02LXBhcnRzIjoKICAgICAgICAgICAgICBuMTMgPSBbNSwgNl07CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIjYtb3ItNy1wYXJ0cyI6CiAgICAgICAgICAgICAgbjEzID0gWzYsIDddOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIG4xMyA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIShBcnJheS5pc0FycmF5KG4xMykgPyBuMTMuaW5jbHVkZXModDkpIDogdDkgPT09IG4xMykpIHsKICAgICAgICAgICAgbGV0IGE1ID0gQXJyYXkuaXNBcnJheShuMTMpID8gbjEzLmpvaW4oIiBvciAiKSA6IG4xMy50b1N0cmluZygpOwogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDcm9uUGF0dGVybjogbW9kZSAnJHt0aGlzLm1vZGV9JyByZXF1aXJlcyBleGFjdGx5ICR7YTV9IHBhcnRzLCBidXQgcGF0dGVybiAnJHt0aGlzLnBhdHRlcm59JyBoYXMgJHt0OX0gcGFydHMuYCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChlMTEubGVuZ3RoID09PSA1ICYmIGUxMS51bnNoaWZ0KCIwIiksIGUxMS5sZW5ndGggPT09IDYgJiYgZTExLnB1c2goIioiKSwgZTExWzNdLnRvVXBwZXJDYXNlKCkgPT09ICJMVyIgPyAodGhpcy5sYXN0V2Vla2RheSA9IHRydWUsIGUxMVszXSA9ICIiKSA6IGUxMVszXS50b1VwcGVyQ2FzZSgpLmluZGV4T2YoIkwiKSA+PSAwICYmIChlMTFbM10gPSBlMTFbM10ucmVwbGFjZSgvTC9naSwgIiIpLCB0aGlzLmxhc3REYXlPZk1vbnRoID0gdHJ1ZSksIGUxMVszXSA9PSAiKiIgJiYgKHRoaXMuc3RhckRPTSA9IHRydWUpLCBlMTFbNl0gPT0gIioiICYmICh0aGlzLnN0YXJZZWFyID0gdHJ1ZSksIGUxMVs0XS5sZW5ndGggPj0gMyAmJiAoZTExWzRdID0gdGhpcy5yZXBsYWNlQWxwaGFNb250aHMoZTExWzRdKSksIGUxMVs1XS5sZW5ndGggPj0gMyAmJiAoZTExWzVdID0gdGhpcy5hbHRlcm5hdGl2ZVdlZWtkYXlzID8gdGhpcy5yZXBsYWNlQWxwaGFEYXlzUXVhcnR6KGUxMVs1XSkgOiB0aGlzLnJlcGxhY2VBbHBoYURheXMoZTExWzVdKSksIGUxMVs1XS5zdGFydHNXaXRoKCIrIikgJiYgKHRoaXMudXNlQW5kTG9naWMgPSB0cnVlLCBlMTFbNV0gPSBlMTFbNV0uc3Vic3RyaW5nKDEpLCBlMTFbNV0gPT09ICIiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IERheS1vZi13ZWVrIGZpZWxkIGNhbm5vdCBiZSBlbXB0eSBhZnRlciAnKycgbW9kaWZpZXIuIik7CiAgICAgICAgc3dpdGNoIChlMTFbNV0gPT0gIioiICYmICh0aGlzLnN0YXJET1cgPSB0cnVlKSwgdGhpcy5wYXR0ZXJuLmluZGV4T2YoIj8iKSA+PSAwICYmIChlMTFbMF0gPSBlMTFbMF0ucmVwbGFjZSgvXD8vZywgIioiKSwgZTExWzFdID0gZTExWzFdLnJlcGxhY2UoL1w/L2csICIqIiksIGUxMVsyXSA9IGUxMVsyXS5yZXBsYWNlKC9cPy9nLCAiKiIpLCBlMTFbM10gPSBlMTFbM10ucmVwbGFjZSgvXD8vZywgIioiKSwgZTExWzRdID0gZTExWzRdLnJlcGxhY2UoL1w/L2csICIqIiksIGUxMVs1XSA9IGUxMVs1XS5yZXBsYWNlKC9cPy9nLCAiKiIpLCBlMTFbNl0gJiYgKGUxMVs2XSA9IGUxMVs2XS5yZXBsYWNlKC9cPy9nLCAiKiIpKSksIHRoaXMubW9kZSkgewogICAgICAgICAgY2FzZSAiNS1wYXJ0IjoKICAgICAgICAgICAgZTExWzBdID0gIjAiLCBlMTFbNl0gPSAiKiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiNi1wYXJ0IjoKICAgICAgICAgICAgZTExWzZdID0gIioiOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgIjUtb3ItNi1wYXJ0cyI6CiAgICAgICAgICAgIGUxMVs2XSA9ICIqIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICI2LW9yLTctcGFydHMiOgogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgIjctcGFydCI6CiAgICAgICAgICBjYXNlICJhdXRvIjoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHRoaXMudGhyb3dBdElsbGVnYWxDaGFyYWN0ZXJzKGUxMSksIHRoaXMucGFydFRvQXJyYXkoInNlY29uZCIsIGUxMVswXSwgMCwgMSksIHRoaXMucGFydFRvQXJyYXkoIm1pbnV0ZSIsIGUxMVsxXSwgMCwgMSksIHRoaXMucGFydFRvQXJyYXkoImhvdXIiLCBlMTFbMl0sIDAsIDEpLCB0aGlzLnBhcnRUb0FycmF5KCJkYXkiLCBlMTFbM10sIC0xLCAxKSwgdGhpcy5wYXJ0VG9BcnJheSgibW9udGgiLCBlMTFbNF0sIC0xLCAxKTsKICAgICAgICBsZXQgcjExID0gdGhpcy5hbHRlcm5hdGl2ZVdlZWtkYXlzID8gLTEgOiAwOwogICAgICAgIHRoaXMucGFydFRvQXJyYXkoImRheU9mV2VlayIsIGUxMVs1XSwgcjExLCA2MyksIHRoaXMucGFydFRvQXJyYXkoInllYXIiLCBlMTFbNl0sIDAsIDEpLCAhdGhpcy5hbHRlcm5hdGl2ZVdlZWtkYXlzICYmIHRoaXMuZGF5T2ZXZWVrWzddICYmICh0aGlzLmRheU9mV2Vla1swXSA9IHRoaXMuZGF5T2ZXZWVrWzddKTsKICAgICAgfQogICAgICBwYXJ0VG9BcnJheShlMTEsIHQ5LCByMTEsIG4xMykgewogICAgICAgIGxldCBpMTEgPSB0aGlzW2UxMV0sIGE1ID0gZTExID09PSAiZGF5IiAmJiB0aGlzLmxhc3REYXlPZk1vbnRoLCBvMTMgPSBlMTEgPT09ICJkYXkiICYmIHRoaXMubGFzdFdlZWtkYXk7CiAgICAgICAgaWYgKHQ5ID09PSAiIiAmJiAhYTUgJiYgIW8xMykgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IGNvbmZpZ3VyYXRpb24gZW50cnkgIiArIGUxMSArICIgKCIgKyB0OSArICIpIGlzIGVtcHR5LCBjaGVjayBmb3IgdHJhaWxpbmcgc3BhY2VzLiIpOwogICAgICAgIGlmICh0OSA9PT0gIioiKSByZXR1cm4gaTExLmZpbGwobjEzKTsKICAgICAgICBsZXQgaDkgPSB0OS5zcGxpdCgiLCIpOwogICAgICAgIGlmIChoOS5sZW5ndGggPiAxKSBmb3IgKGxldCBsNiA9IDA7IGw2IDwgaDkubGVuZ3RoOyBsNisrKSB0aGlzLnBhcnRUb0FycmF5KGUxMSwgaDlbbDZdLCByMTEsIG4xMyk7CiAgICAgICAgZWxzZSB0OS5pbmRleE9mKCItIikgIT09IC0xICYmIHQ5LmluZGV4T2YoIi8iKSAhPT0gLTEgPyB0aGlzLmhhbmRsZVJhbmdlV2l0aFN0ZXBwaW5nKHQ5LCBlMTEsIHIxMSwgbjEzKSA6IHQ5LmluZGV4T2YoIi0iKSAhPT0gLTEgPyB0aGlzLmhhbmRsZVJhbmdlKHQ5LCBlMTEsIHIxMSwgbjEzKSA6IHQ5LmluZGV4T2YoIi8iKSAhPT0gLTEgPyB0aGlzLmhhbmRsZVN0ZXBwaW5nKHQ5LCBlMTEsIHIxMSwgbjEzKSA6IHQ5ICE9PSAiIiAmJiB0aGlzLmhhbmRsZU51bWJlcih0OSwgZTExLCByMTEsIG4xMyk7CiAgICAgIH0KICAgICAgdGhyb3dBdElsbGVnYWxDaGFyYWN0ZXJzKGUxMSkgewogICAgICAgIGZvciAobGV0IHQ5ID0gMDsgdDkgPCBlMTEubGVuZ3RoOyB0OSsrKSBpZiAoKHQ5ID09PSAzID8gL1teLyowLTksXC1Xd0xsXSsvIDogdDkgPT09IDUgPyAvW14vKjAtOSxcLSNMbF0rLyA6IC9bXi8qMC05LFwtXSsvKS50ZXN0KGUxMVt0OV0pKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogY29uZmlndXJhdGlvbiBlbnRyeSAiICsgdDkgKyAiICgiICsgZTExW3Q5XSArICIpIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVycy4iKTsKICAgICAgfQogICAgICBoYW5kbGVOdW1iZXIoZTExLCB0OSwgcjExLCBuMTMpIHsKICAgICAgICBsZXQgaTExID0gdGhpcy5leHRyYWN0TnRoKGUxMSwgdDkpLCBhNSA9IGUxMS50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKCJXIik7CiAgICAgICAgaWYgKHQ5ICE9PSAiZGF5IiAmJiBhNSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IE5lYXJlc3Qgd2Vla2RheSBtb2RpZmllciAoVykgb25seSBhbGxvd2VkIGluIGRheS1vZi1tb250aC4iKTsKICAgICAgICBhNSAmJiAodDkgPSAibmVhcmVzdFdlZWtkYXlzIik7CiAgICAgICAgbGV0IG8xMyA9IHBhcnNlSW50KGkxMVswXSwgMTApICsgcjExOwogICAgICAgIGlmIChpc05hTihvMTMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogIiArIHQ5ICsgIiBpcyBub3QgYSBudW1iZXI6ICciICsgZTExICsgIiciKTsKICAgICAgICB0aGlzLnNldFBhcnQodDksIG8xMywgaTExWzFdIHx8IG4xMyk7CiAgICAgIH0KICAgICAgc2V0UGFydChlMTEsIHQ5LCByMTEpIHsKICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCBlMTEpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogSW52YWxpZCBwYXJ0IHNwZWNpZmllZDogIiArIGUxMSk7CiAgICAgICAgaWYgKGUxMSA9PT0gImRheU9mV2VlayIpIHsKICAgICAgICAgIGlmICh0OSA9PT0gNyAmJiAodDkgPSAwKSwgdDkgPCAwIHx8IHQ5ID4gNikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNyb25QYXR0ZXJuOiBJbnZhbGlkIHZhbHVlIGZvciBkYXlPZldlZWs6ICIgKyB0OSk7CiAgICAgICAgICB0aGlzLnNldE50aFdlZWtkYXlPZk1vbnRoKHQ5LCByMTEpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoZTExID09PSAic2Vjb25kIiB8fCBlMTEgPT09ICJtaW51dGUiKSB7CiAgICAgICAgICBpZiAodDkgPCAwIHx8IHQ5ID49IDYwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQ3JvblBhdHRlcm46IEludmFsaWQgdmFsdWUgZm9yICIgKyBlMTEgKyAiOiAiICsgdDkpOwogICAgICAgIH0gZWxzZSBpZiAoZTExID09PSAiaG91ciIpIHsKICAgICAgICAgIGlmICh0OSA8IDAgfHwgdDkgPj0gMjQpIHRocm93IG5ldyBSYW5nZUVycm9yKCJDcm9uUGF0dGVybjogSW52YWxpZCB2YWx1ZSBmb3IgIiArIGUxMSArICI6ICIgKyB0OSk7CiAgICAgICAgfSBlbHNlIGlmIChlMTEgPT09ICJkYXkiIHx8IGUxMSA9PT0gIm5lYXJlc3RXZWVrZGF5cyIpIHsKICAgICAgICAgIGlmICh0OSA8IDAgfHwgdDkgPj0gMzEpIHRocm93IG5ldyBSYW5nZUVycm9yKCJDcm9uUGF0dGVybjogSW52YWxpZCB2YWx1ZSBmb3IgIiArIGUxMSArICI6ICIgKyB0OSk7CiAgICAgICAgfSBlbHNlIGlmIChlMTEgPT09ICJtb250aCIpIHsKICAgICAgICAgIGlmICh0OSA8IDAgfHwgdDkgPj0gMTIpIHRocm93IG5ldyBSYW5nZUVycm9yKCJDcm9uUGF0dGVybjogSW52YWxpZCB2YWx1ZSBmb3IgIiArIGUxMSArICI6ICIgKyB0OSk7CiAgICAgICAgfSBlbHNlIGlmIChlMTEgPT09ICJ5ZWFyIiAmJiAodDkgPCAxIHx8IHQ5ID49IDFlNCkpIHRocm93IG5ldyBSYW5nZUVycm9yKCJDcm9uUGF0dGVybjogSW52YWxpZCB2YWx1ZSBmb3IgIiArIGUxMSArICI6ICIgKyB0OSArICIgKHN1cHBvcnRlZCByYW5nZTogMS05OTk5KSIpOwogICAgICAgIHRoaXNbZTExXVt0OV0gPSByMTE7CiAgICAgIH0KICAgICAgdmFsaWRhdGVOb3ROYU4oZTExLCB0OSkgewogICAgICAgIGlmIChpc05hTihlMTEpKSB0aHJvdyBuZXcgVHlwZUVycm9yKHQ5KTsKICAgICAgfQogICAgICB2YWxpZGF0ZVJhbmdlKGUxMSwgdDksIHIxMSwgbjEzLCBpMTEpIHsKICAgICAgICBpZiAoZTExID4gdDkpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBGcm9tIHZhbHVlIGlzIGxhcmdlciB0aGFuIHRvIHZhbHVlOiAnIiArIGkxMSArICInIik7CiAgICAgICAgaWYgKHIxMSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICBpZiAocjExID09PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uUGF0dGVybjogU3ludGF4IGVycm9yLCBpbGxlZ2FsIHN0ZXBwaW5nOiAwIik7CiAgICAgICAgICBpZiAocjExID4gdGhpc1tuMTNdLmxlbmd0aCkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgc3RlcHMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIHZhbHVlIG9mIHBhcnQgKCIgKyB0aGlzW24xM10ubGVuZ3RoICsgIikiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaGFuZGxlUmFuZ2VXaXRoU3RlcHBpbmcoZTExLCB0OSwgcjExLCBuMTMpIHsKICAgICAgICBpZiAoZTExLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoIlciKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgVyBpcyBub3QgYWxsb3dlZCBpbiByYW5nZXMgd2l0aCBzdGVwcGluZy4iKTsKICAgICAgICBsZXQgaTExID0gdGhpcy5leHRyYWN0TnRoKGUxMSwgdDkpLCBhNSA9IGkxMVswXS5tYXRjaCgvXihcZCspLShcZCspXC8oXGQrKSQvKTsKICAgICAgICBpZiAoYTUgPT09IG51bGwpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIGlsbGVnYWwgcmFuZ2Ugd2l0aCBzdGVwcGluZzogJyIgKyBlMTEgKyAiJyIpOwogICAgICAgIGxldCBbLCBvMTMsIGg5LCBsNl0gPSBhNSwgeTUgPSBwYXJzZUludChvMTMsIDEwKSArIHIxMSwgdTcgPSBwYXJzZUludChoOSwgMTApICsgcjExLCBkNiA9IHBhcnNlSW50KGw2LCAxMCk7CiAgICAgICAgdGhpcy52YWxpZGF0ZU5vdE5hTih5NSwgIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIGlsbGVnYWwgbG93ZXIgcmFuZ2UgKE5hTikiKSwgdGhpcy52YWxpZGF0ZU5vdE5hTih1NywgIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIGlsbGVnYWwgdXBwZXIgcmFuZ2UgKE5hTikiKSwgdGhpcy52YWxpZGF0ZU5vdE5hTihkNiwgIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIGlsbGVnYWwgc3RlcHBpbmc6IChOYU4pIiksIHRoaXMudmFsaWRhdGVSYW5nZSh5NSwgdTcsIGQ2LCB0OSwgZTExKTsKICAgICAgICBmb3IgKGxldCBjMTEgPSB5NTsgYzExIDw9IHU3OyBjMTEgKz0gZDYpIHRoaXMuc2V0UGFydCh0OSwgYzExLCBpMTFbMV0gfHwgbjEzKTsKICAgICAgfQogICAgICBleHRyYWN0TnRoKGUxMSwgdDkpIHsKICAgICAgICBsZXQgcjExID0gZTExLCBuMTM7CiAgICAgICAgaWYgKHIxMS5pbmNsdWRlcygiIyIpKSB7CiAgICAgICAgICBpZiAodDkgIT09ICJkYXlPZldlZWsiKSB0aHJvdyBuZXcgRXJyb3IoIkNyb25QYXR0ZXJuOiBudGggKCMpIG9ubHkgYWxsb3dlZCBpbiBkYXktb2Ytd2VlayBmaWVsZCIpOwogICAgICAgICAgbjEzID0gcjExLnNwbGl0KCIjIilbMV0sIHIxMSA9IHIxMS5zcGxpdCgiIyIpWzBdOwogICAgICAgIH0gZWxzZSBpZiAocjExLnRvVXBwZXJDYXNlKCkuZW5kc1dpdGgoIkwiKSkgewogICAgICAgICAgaWYgKHQ5ICE9PSAiZGF5T2ZXZWVrIikgdGhyb3cgbmV3IEVycm9yKCJDcm9uUGF0dGVybjogTCBtb2RpZmllciBvbmx5IGFsbG93ZWQgaW4gZGF5LW9mLXdlZWsgZmllbGQgKHVzZSBMIGFsb25lIGZvciBkYXktb2YtbW9udGgpIik7CiAgICAgICAgICBuMTMgPSAiTCIsIHIxMSA9IHIxMS5zbGljZSgwLCAtMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBbcjExLCBuMTNdOwogICAgICB9CiAgICAgIGhhbmRsZVJhbmdlKGUxMSwgdDksIHIxMSwgbjEzKSB7CiAgICAgICAgaWYgKGUxMS50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKCJXIikpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIFcgaXMgbm90IGFsbG93ZWQgaW4gYSByYW5nZS4iKTsKICAgICAgICBsZXQgaTExID0gdGhpcy5leHRyYWN0TnRoKGUxMSwgdDkpLCBhNSA9IGkxMVswXS5zcGxpdCgiLSIpOwogICAgICAgIGlmIChhNS5sZW5ndGggIT09IDIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIGlsbGVnYWwgcmFuZ2U6ICciICsgZTExICsgIiciKTsKICAgICAgICBsZXQgbzEzID0gcGFyc2VJbnQoYTVbMF0sIDEwKSArIHIxMSwgaDkgPSBwYXJzZUludChhNVsxXSwgMTApICsgcjExOwogICAgICAgIHRoaXMudmFsaWRhdGVOb3ROYU4obzEzLCAiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgaWxsZWdhbCBsb3dlciByYW5nZSAoTmFOKSIpLCB0aGlzLnZhbGlkYXRlTm90TmFOKGg5LCAiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgaWxsZWdhbCB1cHBlciByYW5nZSAoTmFOKSIpLCB0aGlzLnZhbGlkYXRlUmFuZ2UobzEzLCBoOSwgdm9pZCAwLCB0OSwgZTExKTsKICAgICAgICBmb3IgKGxldCBsNiA9IG8xMzsgbDYgPD0gaDk7IGw2KyspIHRoaXMuc2V0UGFydCh0OSwgbDYsIGkxMVsxXSB8fCBuMTMpOwogICAgICB9CiAgICAgIGhhbmRsZVN0ZXBwaW5nKGUxMSwgdDksIHIxMSwgbjEzKSB7CiAgICAgICAgaWYgKGUxMS50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKCJXIikpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIFcgaXMgbm90IGFsbG93ZWQgaW4gcGFydHMgd2l0aCBzdGVwcGluZy4iKTsKICAgICAgICBsZXQgaTExID0gdGhpcy5leHRyYWN0TnRoKGUxMSwgdDkpLCBhNSA9IGkxMVswXS5zcGxpdCgiLyIpOwogICAgICAgIGlmIChhNS5sZW5ndGggIT09IDIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIGlsbGVnYWwgc3RlcHBpbmc6ICciICsgZTExICsgIiciKTsKICAgICAgICBpZiAodGhpcy5zbG9wcHlSYW5nZXMpIGE1WzBdID09PSAiIiAmJiAoYTVbMF0gPSAiKiIpOwogICAgICAgIGVsc2UgewogICAgICAgICAgaWYgKGE1WzBdID09PSAiIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgc3RlcHBpbmcgd2l0aCBtaXNzaW5nIHByZWZpeCAoJyIgKyBlMTEgKyAiJykgaXMgbm90IGFsbG93ZWQuIFVzZSB3aWxkY2FyZCAoKi9zdGVwKSBvciByYW5nZSAobWluLW1heC9zdGVwKSBpbnN0ZWFkLiIpOwogICAgICAgICAgaWYgKGE1WzBdICE9PSAiKiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNyb25QYXR0ZXJuOiBTeW50YXggZXJyb3IsIHN0ZXBwaW5nIHdpdGggbnVtZXJpYyBwcmVmaXggKCciICsgZTExICsgIicpIGlzIG5vdCBhbGxvd2VkLiBVc2Ugd2lsZGNhcmQgKCovc3RlcCkgb3IgcmFuZ2UgKG1pbi1tYXgvc3RlcCkgaW5zdGVhZC4iKTsKICAgICAgICB9CiAgICAgICAgbGV0IG8xMyA9IDA7CiAgICAgICAgYTVbMF0gIT09ICIqIiAmJiAobzEzID0gcGFyc2VJbnQoYTVbMF0sIDEwKSArIHIxMSk7CiAgICAgICAgbGV0IGg5ID0gcGFyc2VJbnQoYTVbMV0sIDEwKTsKICAgICAgICB0aGlzLnZhbGlkYXRlTm90TmFOKGg5LCAiQ3JvblBhdHRlcm46IFN5bnRheCBlcnJvciwgaWxsZWdhbCBzdGVwcGluZzogKE5hTikiKSwgdGhpcy52YWxpZGF0ZVJhbmdlKDAsIHRoaXNbdDldLmxlbmd0aCAtIDEsIGg5LCB0OSwgZTExKTsKICAgICAgICBmb3IgKGxldCBsNiA9IG8xMzsgbDYgPCB0aGlzW3Q5XS5sZW5ndGg7IGw2ICs9IGg5KSB0aGlzLnNldFBhcnQodDksIGw2LCBpMTFbMV0gfHwgbjEzKTsKICAgICAgfQogICAgICByZXBsYWNlQWxwaGFEYXlzKGUxMSkgewogICAgICAgIHJldHVybiBlMTEucmVwbGFjZSgvLXN1bi9naSwgIi03IikucmVwbGFjZSgvc3VuL2dpLCAiMCIpLnJlcGxhY2UoL21vbi9naSwgIjEiKS5yZXBsYWNlKC90dWUvZ2ksICIyIikucmVwbGFjZSgvd2VkL2dpLCAiMyIpLnJlcGxhY2UoL3RodS9naSwgIjQiKS5yZXBsYWNlKC9mcmkvZ2ksICI1IikucmVwbGFjZSgvc2F0L2dpLCAiNiIpOwogICAgICB9CiAgICAgIHJlcGxhY2VBbHBoYURheXNRdWFydHooZTExKSB7CiAgICAgICAgcmV0dXJuIGUxMS5yZXBsYWNlKC9zdW4vZ2ksICIxIikucmVwbGFjZSgvbW9uL2dpLCAiMiIpLnJlcGxhY2UoL3R1ZS9naSwgIjMiKS5yZXBsYWNlKC93ZWQvZ2ksICI0IikucmVwbGFjZSgvdGh1L2dpLCAiNSIpLnJlcGxhY2UoL2ZyaS9naSwgIjYiKS5yZXBsYWNlKC9zYXQvZ2ksICI3Iik7CiAgICAgIH0KICAgICAgcmVwbGFjZUFscGhhTW9udGhzKGUxMSkgewogICAgICAgIHJldHVybiBlMTEucmVwbGFjZSgvamFuL2dpLCAiMSIpLnJlcGxhY2UoL2ZlYi9naSwgIjIiKS5yZXBsYWNlKC9tYXIvZ2ksICIzIikucmVwbGFjZSgvYXByL2dpLCAiNCIpLnJlcGxhY2UoL21heS9naSwgIjUiKS5yZXBsYWNlKC9qdW4vZ2ksICI2IikucmVwbGFjZSgvanVsL2dpLCAiNyIpLnJlcGxhY2UoL2F1Zy9naSwgIjgiKS5yZXBsYWNlKC9zZXAvZ2ksICI5IikucmVwbGFjZSgvb2N0L2dpLCAiMTAiKS5yZXBsYWNlKC9ub3YvZ2ksICIxMSIpLnJlcGxhY2UoL2RlYy9naSwgIjEyIik7CiAgICAgIH0KICAgICAgaGFuZGxlTmlja25hbWVzKGUxMSkgewogICAgICAgIGxldCB0OSA9IGUxMS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAodDkgPT09ICJAeWVhcmx5IiB8fCB0OSA9PT0gIkBhbm51YWxseSIpIHJldHVybiAiMCAwIDEgMSAqIjsKICAgICAgICBpZiAodDkgPT09ICJAbW9udGhseSIpIHJldHVybiAiMCAwIDEgKiAqIjsKICAgICAgICBpZiAodDkgPT09ICJAd2Vla2x5IikgcmV0dXJuICIwIDAgKiAqIDAiOwogICAgICAgIGlmICh0OSA9PT0gIkBkYWlseSIgfHwgdDkgPT09ICJAbWlkbmlnaHQiKSByZXR1cm4gIjAgMCAqICogKiI7CiAgICAgICAgaWYgKHQ5ID09PSAiQGhvdXJseSIpIHJldHVybiAiMCAqICogKiAqIjsKICAgICAgICBpZiAodDkgPT09ICJAcmVib290IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3JvblBhdHRlcm46IEByZWJvb3QgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50LiBUaGlzIGlzIGFuIGV2ZW50LWJhc2VkIHRyaWdnZXIgdGhhdCByZXF1aXJlcyBzeXN0ZW0gc3RhcnR1cCBkZXRlY3Rpb24uIik7CiAgICAgICAgcmV0dXJuIGUxMTsKICAgICAgfQogICAgICBzZXROdGhXZWVrZGF5T2ZNb250aChlMTEsIHQ5KSB7CiAgICAgICAgaWYgKHR5cGVvZiB0OSAhPSAibnVtYmVyIiAmJiB0OS50b1VwcGVyQ2FzZSgpID09PSAiTCIpIHRoaXMuZGF5T2ZXZWVrW2UxMV0gPSB0aGlzLmRheU9mV2Vla1tlMTFdIHwgMzI7CiAgICAgICAgZWxzZSBpZiAodDkgPT09IDYzKSB0aGlzLmRheU9mV2Vla1tlMTFdID0gNjM7CiAgICAgICAgZWxzZSBpZiAodDkgPCA2ICYmIHQ5ID4gMCkgdGhpcy5kYXlPZldlZWtbZTExXSA9IHRoaXMuZGF5T2ZXZWVrW2UxMV0gfCBPMlt0OSAtIDFdOwogICAgICAgIGVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ3JvblBhdHRlcm46IG50aCB3ZWVrZGF5IG91dCBvZiByYW5nZSwgc2hvdWxkIGJlIDEtNSBvciBMLiBWYWx1ZTogJHt0OX0sIFR5cGU6ICR7dHlwZW9mIHQ5fWApOwogICAgICB9CiAgICB9OwogICAgUDMgPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV0sIGY0ID0gW1sibW9udGgiLCAieWVhciIsIDBdLCBbImRheSIsICJtb250aCIsIC0xXSwgWyJob3VyIiwgImRheSIsIDBdLCBbIm1pbnV0ZSIsICJob3VyIiwgMF0sIFsic2Vjb25kIiwgIm1pbnV0ZSIsIDBdXSwgbTMgPSBjbGFzcyBzNCB7CiAgICAgIHR6OwogICAgICBtczsKICAgICAgc2Vjb25kOwogICAgICBtaW51dGU7CiAgICAgIGhvdXI7CiAgICAgIGRheTsKICAgICAgbW9udGg7CiAgICAgIHllYXI7CiAgICAgIGNvbnN0cnVjdG9yKGUxMSwgdDkpIHsKICAgICAgICBpZiAodGhpcy50eiA9IHQ5LCBlMTEgJiYgZTExIGluc3RhbmNlb2YgRGF0ZSkgaWYgKCFpc05hTihlMTEpKSB0aGlzLmZyb21EYXRlKGUxMSk7CiAgICAgICAgZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uRGF0ZTogSW52YWxpZCBkYXRlIHBhc3NlZCB0byBDcm9uRGF0ZSBjb25zdHJ1Y3RvciIpOwogICAgICAgIGVsc2UgaWYgKGUxMSA9PSBudWxsKSB0aGlzLmZyb21EYXRlKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKTsKICAgICAgICBlbHNlIGlmIChlMTEgJiYgdHlwZW9mIGUxMSA9PSAic3RyaW5nIikgdGhpcy5mcm9tU3RyaW5nKGUxMSk7CiAgICAgICAgZWxzZSBpZiAoZTExIGluc3RhbmNlb2YgczQpIHRoaXMuZnJvbUNyb25EYXRlKGUxMSk7CiAgICAgICAgZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDcm9uRGF0ZTogSW52YWxpZCB0eXBlICgiICsgdHlwZW9mIGUxMSArICIpIHBhc3NlZCB0byBDcm9uRGF0ZSBjb25zdHJ1Y3RvciIpOwogICAgICB9CiAgICAgIGdldExhc3REYXlPZk1vbnRoKGUxMSwgdDkpIHsKICAgICAgICByZXR1cm4gdDkgIT09IDEgPyBQM1t0OV0gOiBuZXcgRGF0ZShEYXRlLlVUQyhlMTEsIHQ5ICsgMSwgMCkpLmdldFVUQ0RhdGUoKTsKICAgICAgfQogICAgICBnZXRMYXN0V2Vla2RheShlMTEsIHQ5KSB7CiAgICAgICAgbGV0IHIxMSA9IHRoaXMuZ2V0TGFzdERheU9mTW9udGgoZTExLCB0OSksIGkxMSA9IG5ldyBEYXRlKERhdGUuVVRDKGUxMSwgdDksIHIxMSkpLmdldFVUQ0RheSgpOwogICAgICAgIHJldHVybiBpMTEgPT09IDAgPyByMTEgLSAyIDogaTExID09PSA2ID8gcjExIC0gMSA6IHIxMTsKICAgICAgfQogICAgICBnZXROZWFyZXN0V2Vla2RheShlMTEsIHQ5LCByMTEpIHsKICAgICAgICBsZXQgbjEzID0gdGhpcy5nZXRMYXN0RGF5T2ZNb250aChlMTEsIHQ5KTsKICAgICAgICBpZiAocjExID4gbjEzKSByZXR1cm4gLTE7CiAgICAgICAgbGV0IGE1ID0gbmV3IERhdGUoRGF0ZS5VVEMoZTExLCB0OSwgcjExKSkuZ2V0VVRDRGF5KCk7CiAgICAgICAgcmV0dXJuIGE1ID09PSAwID8gcjExID09PSBuMTMgPyByMTEgLSAyIDogcjExICsgMSA6IGE1ID09PSA2ID8gcjExID09PSAxID8gcjExICsgMiA6IHIxMSAtIDEgOiByMTE7CiAgICAgIH0KICAgICAgaXNOdGhXZWVrZGF5T2ZNb250aChlMTEsIHQ5LCByMTEsIG4xMykgewogICAgICAgIGxldCBhNSA9IG5ldyBEYXRlKERhdGUuVVRDKGUxMSwgdDksIHIxMSkpLmdldFVUQ0RheSgpLCBvMTMgPSAwOwogICAgICAgIGZvciAobGV0IGg5ID0gMTsgaDkgPD0gcjExOyBoOSsrKSBuZXcgRGF0ZShEYXRlLlVUQyhlMTEsIHQ5LCBoOSkpLmdldFVUQ0RheSgpID09PSBhNSAmJiBvMTMrKzsKICAgICAgICBpZiAobjEzICYgNjMgJiYgTzJbbzEzIC0gMV0gJiBuMTMpIHJldHVybiB0cnVlOwogICAgICAgIGlmIChuMTMgJiAzMikgewogICAgICAgICAgbGV0IGg5ID0gdGhpcy5nZXRMYXN0RGF5T2ZNb250aChlMTEsIHQ5KTsKICAgICAgICAgIGZvciAobGV0IGw2ID0gcjExICsgMTsgbDYgPD0gaDk7IGw2KyspIGlmIChuZXcgRGF0ZShEYXRlLlVUQyhlMTEsIHQ5LCBsNikpLmdldFVUQ0RheSgpID09PSBhNSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBmcm9tRGF0ZShlMTEpIHsKICAgICAgICBpZiAodGhpcy50eiAhPT0gdm9pZCAwKSBpZiAodHlwZW9mIHRoaXMudHogPT0gIm51bWJlciIpIHRoaXMubXMgPSBlMTEuZ2V0VVRDTWlsbGlzZWNvbmRzKCksIHRoaXMuc2Vjb25kID0gZTExLmdldFVUQ1NlY29uZHMoKSwgdGhpcy5taW51dGUgPSBlMTEuZ2V0VVRDTWludXRlcygpICsgdGhpcy50eiwgdGhpcy5ob3VyID0gZTExLmdldFVUQ0hvdXJzKCksIHRoaXMuZGF5ID0gZTExLmdldFVUQ0RhdGUoKSwgdGhpcy5tb250aCA9IGUxMS5nZXRVVENNb250aCgpLCB0aGlzLnllYXIgPSBlMTEuZ2V0VVRDRnVsbFllYXIoKSwgdGhpcy5hcHBseSgpOwogICAgICAgIGVsc2UgdHJ5IHsKICAgICAgICAgIGxldCB0OSA9IGczKGUxMSwgdGhpcy50eik7CiAgICAgICAgICB0aGlzLm1zID0gZTExLmdldE1pbGxpc2Vjb25kcygpLCB0aGlzLnNlY29uZCA9IHQ5LnMsIHRoaXMubWludXRlID0gdDkuaSwgdGhpcy5ob3VyID0gdDkuaCwgdGhpcy5kYXkgPSB0OS5kLCB0aGlzLm1vbnRoID0gdDkubSAtIDEsIHRoaXMueWVhciA9IHQ5Lnk7CiAgICAgICAgfSBjYXRjaCAodDkpIHsKICAgICAgICAgIGxldCByMTEgPSB0OSBpbnN0YW5jZW9mIEVycm9yID8gdDkubWVzc2FnZSA6IFN0cmluZyh0OSk7CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDcm9uRGF0ZTogRmFpbGVkIHRvIGNvbnZlcnQgZGF0ZSB0byB0aW1lem9uZSAnJHt0aGlzLnR6fScuIFRoaXMgbWF5IGhhcHBlbiB3aXRoIGludmFsaWQgdGltZXpvbmUgbmFtZXMgb3IgZGF0ZXMuIE9yaWdpbmFsIGVycm9yOiAke3IxMX1gKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB0aGlzLm1zID0gZTExLmdldE1pbGxpc2Vjb25kcygpLCB0aGlzLnNlY29uZCA9IGUxMS5nZXRTZWNvbmRzKCksIHRoaXMubWludXRlID0gZTExLmdldE1pbnV0ZXMoKSwgdGhpcy5ob3VyID0gZTExLmdldEhvdXJzKCksIHRoaXMuZGF5ID0gZTExLmdldERhdGUoKSwgdGhpcy5tb250aCA9IGUxMS5nZXRNb250aCgpLCB0aGlzLnllYXIgPSBlMTEuZ2V0RnVsbFllYXIoKTsKICAgICAgfQogICAgICBmcm9tQ3JvbkRhdGUoZTExKSB7CiAgICAgICAgdGhpcy50eiA9IGUxMS50eiwgdGhpcy55ZWFyID0gZTExLnllYXIsIHRoaXMubW9udGggPSBlMTEubW9udGgsIHRoaXMuZGF5ID0gZTExLmRheSwgdGhpcy5ob3VyID0gZTExLmhvdXIsIHRoaXMubWludXRlID0gZTExLm1pbnV0ZSwgdGhpcy5zZWNvbmQgPSBlMTEuc2Vjb25kLCB0aGlzLm1zID0gZTExLm1zOwogICAgICB9CiAgICAgIGFwcGx5KCkgewogICAgICAgIGlmICh0aGlzLm1vbnRoID4gMTEgfHwgdGhpcy5tb250aCA8IDAgfHwgdGhpcy5kYXkgPiBQM1t0aGlzLm1vbnRoXSB8fCB0aGlzLmRheSA8IDEgfHwgdGhpcy5ob3VyID4gNTkgfHwgdGhpcy5taW51dGUgPiA1OSB8fCB0aGlzLnNlY29uZCA+IDU5IHx8IHRoaXMuaG91ciA8IDAgfHwgdGhpcy5taW51dGUgPCAwIHx8IHRoaXMuc2Vjb25kIDwgMCkgewogICAgICAgICAgbGV0IGUxMSA9IG5ldyBEYXRlKERhdGUuVVRDKHRoaXMueWVhciwgdGhpcy5tb250aCwgdGhpcy5kYXksIHRoaXMuaG91ciwgdGhpcy5taW51dGUsIHRoaXMuc2Vjb25kLCB0aGlzLm1zKSk7CiAgICAgICAgICByZXR1cm4gdGhpcy5tcyA9IGUxMS5nZXRVVENNaWxsaXNlY29uZHMoKSwgdGhpcy5zZWNvbmQgPSBlMTEuZ2V0VVRDU2Vjb25kcygpLCB0aGlzLm1pbnV0ZSA9IGUxMS5nZXRVVENNaW51dGVzKCksIHRoaXMuaG91ciA9IGUxMS5nZXRVVENIb3VycygpLCB0aGlzLmRheSA9IGUxMS5nZXRVVENEYXRlKCksIHRoaXMubW9udGggPSBlMTEuZ2V0VVRDTW9udGgoKSwgdGhpcy55ZWFyID0gZTExLmdldFVUQ0Z1bGxZZWFyKCksIHRydWU7CiAgICAgICAgfSBlbHNlIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBmcm9tU3RyaW5nKGUxMSkgewogICAgICAgIGlmICh0eXBlb2YgdGhpcy50eiA9PSAibnVtYmVyIikgewogICAgICAgICAgbGV0IHQ5ID0gdjMoZTExKTsKICAgICAgICAgIHRoaXMubXMgPSB0OS5nZXRVVENNaWxsaXNlY29uZHMoKSwgdGhpcy5zZWNvbmQgPSB0OS5nZXRVVENTZWNvbmRzKCksIHRoaXMubWludXRlID0gdDkuZ2V0VVRDTWludXRlcygpLCB0aGlzLmhvdXIgPSB0OS5nZXRVVENIb3VycygpLCB0aGlzLmRheSA9IHQ5LmdldFVUQ0RhdGUoKSwgdGhpcy5tb250aCA9IHQ5LmdldFVUQ01vbnRoKCksIHRoaXMueWVhciA9IHQ5LmdldFVUQ0Z1bGxZZWFyKCksIHRoaXMuYXBwbHkoKTsKICAgICAgICB9IGVsc2UgcmV0dXJuIHRoaXMuZnJvbURhdGUodjMoZTExLCB0aGlzLnR6KSk7CiAgICAgIH0KICAgICAgZmluZE5leHQoZTExLCB0OSwgcjExLCBuMTMpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZmluZE1hdGNoKGUxMSwgdDksIHIxMSwgbjEzLCAxKTsKICAgICAgfQogICAgICBfZmluZE1hdGNoKGUxMSwgdDksIHIxMSwgbjEzLCBpMTEpIHsKICAgICAgICBsZXQgYTUgPSB0aGlzW3Q5XSwgbzEzOwogICAgICAgIHIxMS5sYXN0RGF5T2ZNb250aCAmJiAobzEzID0gdGhpcy5nZXRMYXN0RGF5T2ZNb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgpKTsKICAgICAgICBsZXQgaDkgPSAhcjExLnN0YXJET1cgJiYgdDkgPT0gImRheSIgPyBuZXcgRGF0ZShEYXRlLlVUQyh0aGlzLnllYXIsIHRoaXMubW9udGgsIDEsIDAsIDAsIDAsIDApKS5nZXRVVENEYXkoKSA6IHZvaWQgMCwgbDYgPSB0aGlzW3Q5XSArIG4xMywgeTUgPSBpMTEgPT09IDEgPyAodTcpID0+IHU3IDwgcjExW3Q5XS5sZW5ndGggOiAodTcpID0+IHU3ID49IDA7CiAgICAgICAgZm9yIChsZXQgdTcgPSBsNjsgeTUodTcpOyB1NyArPSBpMTEpIHsKICAgICAgICAgIGxldCBkNiA9IHIxMVt0OV1bdTddOwogICAgICAgICAgaWYgKHQ5ID09PSAiZGF5IiAmJiAhZDYpIHsKICAgICAgICAgICAgZm9yIChsZXQgYzExID0gMDsgYzExIDwgcjExLm5lYXJlc3RXZWVrZGF5cy5sZW5ndGg7IGMxMSsrKSBpZiAocjExLm5lYXJlc3RXZWVrZGF5c1tjMTFdKSB7CiAgICAgICAgICAgICAgbGV0IE00ID0gdGhpcy5nZXROZWFyZXN0V2Vla2RheSh0aGlzLnllYXIsIHRoaXMubW9udGgsIGMxMSAtIG4xMyk7CiAgICAgICAgICAgICAgaWYgKE00ID09PSAtMSkgY29udGludWU7CiAgICAgICAgICAgICAgaWYgKE00ID09PSB1NyAtIG4xMykgewogICAgICAgICAgICAgICAgZDYgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodDkgPT09ICJkYXkiICYmIHIxMS5sYXN0V2Vla2RheSkgewogICAgICAgICAgICBsZXQgYzExID0gdGhpcy5nZXRMYXN0V2Vla2RheSh0aGlzLnllYXIsIHRoaXMubW9udGgpOwogICAgICAgICAgICB1NyAtIG4xMyA9PT0gYzExICYmIChkNiA9IDEpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHQ5ID09PSAiZGF5IiAmJiByMTEubGFzdERheU9mTW9udGggJiYgdTcgLSBuMTMgPT0gbzEzICYmIChkNiA9IDEpLCB0OSA9PT0gImRheSIgJiYgIXIxMS5zdGFyRE9XKSB7CiAgICAgICAgICAgIGxldCBjMTEgPSByMTEuZGF5T2ZXZWVrWyhoOSArICh1NyAtIG4xMyAtIDEpKSAlIDddOwogICAgICAgICAgICBpZiAoYzExICYmIGMxMSAmIDYzKSBjMTEgPSB0aGlzLmlzTnRoV2Vla2RheU9mTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoLCB1NyAtIG4xMywgYzExKSA/IDEgOiAwOwogICAgICAgICAgICBlbHNlIGlmIChjMTEpIHRocm93IG5ldyBFcnJvcihgQ3JvbkRhdGU6IEludmFsaWQgdmFsdWUgZm9yIGRheU9mV2VlayBlbmNvdW50ZXJlZC4gJHtjMTF9YCk7CiAgICAgICAgICAgIHIxMS51c2VBbmRMb2dpYyA/IGQ2ID0gZDYgJiYgYzExIDogIWUxMS5kb21BbmREb3cgJiYgIXIxMS5zdGFyRE9NID8gZDYgPSBkNiB8fCBjMTEgOiBkNiA9IGQ2ICYmIGMxMTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChkNikgcmV0dXJuIHRoaXNbdDldID0gdTcgLSBuMTMsIGE1ICE9PSB0aGlzW3Q5XSA/IDIgOiAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMzsKICAgICAgfQogICAgICByZWN1cnNlKGUxMSwgdDksIHIxMSkgewogICAgICAgIGlmIChyMTEgPT09IDAgJiYgIWUxMS5zdGFyWWVhcikgewogICAgICAgICAgaWYgKHRoaXMueWVhciA+PSAwICYmIHRoaXMueWVhciA8IGUxMS55ZWFyLmxlbmd0aCAmJiBlMTEueWVhclt0aGlzLnllYXJdID09PSAwKSB7CiAgICAgICAgICAgIGxldCBpMTEgPSAtMTsKICAgICAgICAgICAgZm9yIChsZXQgYTUgPSB0aGlzLnllYXIgKyAxOyBhNSA8IGUxMS55ZWFyLmxlbmd0aCAmJiBhNSA8IDFlNDsgYTUrKykgaWYgKGUxMS55ZWFyW2E1XSA9PT0gMSkgewogICAgICAgICAgICAgIGkxMSA9IGE1OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpMTEgPT09IC0xKSByZXR1cm4gbnVsbDsKICAgICAgICAgICAgdGhpcy55ZWFyID0gaTExLCB0aGlzLm1vbnRoID0gMCwgdGhpcy5kYXkgPSAxLCB0aGlzLmhvdXIgPSAwLCB0aGlzLm1pbnV0ZSA9IDAsIHRoaXMuc2Vjb25kID0gMCwgdGhpcy5tcyA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy55ZWFyID49IDFlNCkgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGxldCBuMTMgPSB0aGlzLmZpbmROZXh0KHQ5LCBmNFtyMTFdWzBdLCBlMTEsIGY0W3IxMV1bMl0pOwogICAgICAgIGlmIChuMTMgPiAxKSB7CiAgICAgICAgICBsZXQgaTExID0gcjExICsgMTsKICAgICAgICAgIGZvciAoOyBpMTEgPCBmNC5sZW5ndGg7ICkgdGhpc1tmNFtpMTFdWzBdXSA9IC1mNFtpMTFdWzJdLCBpMTErKzsKICAgICAgICAgIGlmIChuMTMgPT09IDMpIHsKICAgICAgICAgICAgaWYgKHRoaXNbZjRbcjExXVsxXV0rKywgdGhpc1tmNFtyMTFdWzBdXSA9IC1mNFtyMTFdWzJdLCB0aGlzLmFwcGx5KCksIHIxMSA9PT0gMCAmJiAhZTExLnN0YXJZZWFyKSB7CiAgICAgICAgICAgICAgZm9yICg7IHRoaXMueWVhciA+PSAwICYmIHRoaXMueWVhciA8IGUxMS55ZWFyLmxlbmd0aCAmJiBlMTEueWVhclt0aGlzLnllYXJdID09PSAwICYmIHRoaXMueWVhciA8IDFlNDsgKSB0aGlzLnllYXIrKzsKICAgICAgICAgICAgICBpZiAodGhpcy55ZWFyID49IDFlNCB8fCB0aGlzLnllYXIgPj0gZTExLnllYXIubGVuZ3RoKSByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5yZWN1cnNlKGUxMSwgdDksIDApOwogICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFwcGx5KCkpIHJldHVybiB0aGlzLnJlY3Vyc2UoZTExLCB0OSwgcjExIC0gMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByMTEgKz0gMSwgcjExID49IGY0Lmxlbmd0aCA/IHRoaXMgOiAoZTExLnN0YXJZZWFyID8gdGhpcy55ZWFyID49IDNlMyA6IHRoaXMueWVhciA+PSAxZTQpID8gbnVsbCA6IHRoaXMucmVjdXJzZShlMTEsIHQ5LCByMTEpOwogICAgICB9CiAgICAgIGluY3JlbWVudChlMTEsIHQ5LCByMTEpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZWNvbmQgKz0gdDkuaW50ZXJ2YWwgIT09IHZvaWQgMCAmJiB0OS5pbnRlcnZhbCA+IDEgJiYgcjExID8gdDkuaW50ZXJ2YWwgOiAxLCB0aGlzLm1zID0gMCwgdGhpcy5hcHBseSgpLCB0aGlzLnJlY3Vyc2UoZTExLCB0OSwgMCk7CiAgICAgIH0KICAgICAgZGVjcmVtZW50KGUxMSwgdDkpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZWNvbmQgLT0gdDkuaW50ZXJ2YWwgIT09IHZvaWQgMCAmJiB0OS5pbnRlcnZhbCA+IDEgPyB0OS5pbnRlcnZhbCA6IDEsIHRoaXMubXMgPSAwLCB0aGlzLmFwcGx5KCksIHRoaXMucmVjdXJzZUJhY2t3YXJkKGUxMSwgdDksIDAsIDApOwogICAgICB9CiAgICAgIHJlY3Vyc2VCYWNrd2FyZChlMTEsIHQ5LCByMTEsIG4xMyA9IDApIHsKICAgICAgICBpZiAobjEzID4gMWU0KSByZXR1cm4gbnVsbDsKICAgICAgICBpZiAocjExID09PSAwICYmICFlMTEuc3RhclllYXIpIHsKICAgICAgICAgIGlmICh0aGlzLnllYXIgPj0gMCAmJiB0aGlzLnllYXIgPCBlMTEueWVhci5sZW5ndGggJiYgZTExLnllYXJbdGhpcy55ZWFyXSA9PT0gMCkgewogICAgICAgICAgICBsZXQgYTUgPSAtMTsKICAgICAgICAgICAgZm9yIChsZXQgbzEzID0gdGhpcy55ZWFyIC0gMTsgbzEzID49IDA7IG8xMy0tKSBpZiAoZTExLnllYXJbbzEzXSA9PT0gMSkgewogICAgICAgICAgICAgIGE1ID0gbzEzOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhNSA9PT0gLTEpIHJldHVybiBudWxsOwogICAgICAgICAgICB0aGlzLnllYXIgPSBhNSwgdGhpcy5tb250aCA9IDExLCB0aGlzLmRheSA9IDMxLCB0aGlzLmhvdXIgPSAyMywgdGhpcy5taW51dGUgPSA1OSwgdGhpcy5zZWNvbmQgPSA1OSwgdGhpcy5tcyA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy55ZWFyIDwgMCkgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGxldCBpMTEgPSB0aGlzLmZpbmRQcmV2aW91cyh0OSwgZjRbcjExXVswXSwgZTExLCBmNFtyMTFdWzJdKTsKICAgICAgICBpZiAoaTExID4gMSkgewogICAgICAgICAgbGV0IGE1ID0gcjExICsgMTsKICAgICAgICAgIGZvciAoOyBhNSA8IGY0Lmxlbmd0aDsgKSB7CiAgICAgICAgICAgIGxldCBvMTMgPSBmNFthNV1bMF0sIGg5ID0gZjRbYTVdWzJdLCBsNiA9IHRoaXMuZ2V0TWF4UGF0dGVyblZhbHVlKG8xMywgZTExLCBoOSk7CiAgICAgICAgICAgIHRoaXNbbzEzXSA9IGw2LCBhNSsrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGkxMSA9PT0gMykgewogICAgICAgICAgICBpZiAodGhpc1tmNFtyMTFdWzFdXS0tLCByMTEgPT09IDApIHsKICAgICAgICAgICAgICBsZXQgeTUgPSB0aGlzLmdldExhc3REYXlPZk1vbnRoKHRoaXMueWVhciwgdGhpcy5tb250aCk7CiAgICAgICAgICAgICAgdGhpcy5kYXkgPiB5NSAmJiAodGhpcy5kYXkgPSB5NSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHIxMSA9PT0gMSkgaWYgKHRoaXMuZGF5IDw9IDApIHRoaXMuZGF5ID0gMTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgbGV0IHk1ID0gdGhpcy55ZWFyLCB1NyA9IHRoaXMubW9udGg7CiAgICAgICAgICAgICAgZm9yICg7IHU3IDwgMDsgKSB1NyArPSAxMiwgeTUtLTsKICAgICAgICAgICAgICBmb3IgKDsgdTcgPiAxMTsgKSB1NyAtPSAxMiwgeTUrKzsKICAgICAgICAgICAgICBsZXQgZDYgPSB1NyAhPT0gMSA/IFAzW3U3XSA6IG5ldyBEYXRlKERhdGUuVVRDKHk1LCB1NyArIDEsIDApKS5nZXRVVENEYXRlKCk7CiAgICAgICAgICAgICAgdGhpcy5kYXkgPiBkNiAmJiAodGhpcy5kYXkgPSBkNik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5hcHBseSgpOwogICAgICAgICAgICBsZXQgbzEzID0gZjRbcjExXVswXSwgaDkgPSBmNFtyMTFdWzJdLCBsNiA9IHRoaXMuZ2V0TWF4UGF0dGVyblZhbHVlKG8xMywgZTExLCBoOSk7CiAgICAgICAgICAgIGlmIChvMTMgPT09ICJkYXkiKSB7CiAgICAgICAgICAgICAgbGV0IHk1ID0gdGhpcy5nZXRMYXN0RGF5T2ZNb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgpOwogICAgICAgICAgICAgIHRoaXNbbzEzXSA9IE1hdGgubWluKGw2LCB5NSk7CiAgICAgICAgICAgIH0gZWxzZSB0aGlzW28xM10gPSBsNjsKICAgICAgICAgICAgaWYgKHRoaXMuYXBwbHkoKSwgcjExID09PSAwKSB7CiAgICAgICAgICAgICAgbGV0IHk1ID0gZjRbMV1bMl0sIHU3ID0gdGhpcy5nZXRNYXhQYXR0ZXJuVmFsdWUoImRheSIsIGUxMSwgeTUpLCBkNiA9IHRoaXMuZ2V0TGFzdERheU9mTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoKSwgYzExID0gTWF0aC5taW4odTcsIGQ2KTsKICAgICAgICAgICAgICBjMTEgIT09IHRoaXMuZGF5ICYmICh0aGlzLmRheSA9IGMxMSwgdGhpcy5ob3VyID0gdGhpcy5nZXRNYXhQYXR0ZXJuVmFsdWUoImhvdXIiLCBlMTEsIGY0WzJdWzJdKSwgdGhpcy5taW51dGUgPSB0aGlzLmdldE1heFBhdHRlcm5WYWx1ZSgibWludXRlIiwgZTExLCBmNFszXVsyXSksIHRoaXMuc2Vjb25kID0gdGhpcy5nZXRNYXhQYXR0ZXJuVmFsdWUoInNlY29uZCIsIGUxMSwgZjRbNF1bMl0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocjExID09PSAwICYmICFlMTEuc3RhclllYXIpIHsKICAgICAgICAgICAgICBmb3IgKDsgdGhpcy55ZWFyID49IDAgJiYgdGhpcy55ZWFyIDwgZTExLnllYXIubGVuZ3RoICYmIGUxMS55ZWFyW3RoaXMueWVhcl0gPT09IDA7ICkgdGhpcy55ZWFyLS07CiAgICAgICAgICAgICAgaWYgKHRoaXMueWVhciA8IDApIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlY3Vyc2VCYWNrd2FyZChlMTEsIHQ5LCAwLCBuMTMgKyAxKTsKICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5hcHBseSgpKSByZXR1cm4gdGhpcy5yZWN1cnNlQmFja3dhcmQoZTExLCB0OSwgcjExIC0gMSwgbjEzICsgMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByMTEgKz0gMSwgcjExID49IGY0Lmxlbmd0aCA/IHRoaXMgOiB0aGlzLnllYXIgPCAwID8gbnVsbCA6IHRoaXMucmVjdXJzZUJhY2t3YXJkKGUxMSwgdDksIHIxMSwgbjEzICsgMSk7CiAgICAgIH0KICAgICAgZ2V0TWF4UGF0dGVyblZhbHVlKGUxMSwgdDksIHIxMSkgewogICAgICAgIGlmIChlMTEgPT09ICJkYXkiICYmIHQ5Lmxhc3REYXlPZk1vbnRoKSByZXR1cm4gdGhpcy5nZXRMYXN0RGF5T2ZNb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgpOwogICAgICAgIGlmIChlMTEgPT09ICJkYXkiICYmICF0OS5zdGFyRE9XKSByZXR1cm4gdGhpcy5nZXRMYXN0RGF5T2ZNb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgpOwogICAgICAgIGZvciAobGV0IG4xMyA9IHQ5W2UxMV0ubGVuZ3RoIC0gMTsgbjEzID49IDA7IG4xMy0tKSBpZiAodDlbZTExXVtuMTNdKSByZXR1cm4gbjEzIC0gcjExOwogICAgICAgIHJldHVybiB0OVtlMTFdLmxlbmd0aCAtIDEgLSByMTE7CiAgICAgIH0KICAgICAgZmluZFByZXZpb3VzKGUxMSwgdDksIHIxMSwgbjEzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmRNYXRjaChlMTEsIHQ5LCByMTEsIG4xMywgLTEpOwogICAgICB9CiAgICAgIGdldERhdGUoZTExKSB7CiAgICAgICAgcmV0dXJuIGUxMSB8fCB0aGlzLnR6ID09PSB2b2lkIDAgPyBuZXcgRGF0ZSh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF5LCB0aGlzLmhvdXIsIHRoaXMubWludXRlLCB0aGlzLnNlY29uZCwgdGhpcy5tcykgOiB0eXBlb2YgdGhpcy50eiA9PSAibnVtYmVyIiA/IG5ldyBEYXRlKERhdGUuVVRDKHRoaXMueWVhciwgdGhpcy5tb250aCwgdGhpcy5kYXksIHRoaXMuaG91ciwgdGhpcy5taW51dGUgLSB0aGlzLnR6LCB0aGlzLnNlY29uZCwgdGhpcy5tcykpIDogazMoYjQodGhpcy55ZWFyLCB0aGlzLm1vbnRoICsgMSwgdGhpcy5kYXksIHRoaXMuaG91ciwgdGhpcy5taW51dGUsIHRoaXMuc2Vjb25kLCB0aGlzLnR6KSwgZmFsc2UpOwogICAgICB9CiAgICAgIGdldFRpbWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0ZShmYWxzZSkuZ2V0VGltZSgpOwogICAgICB9CiAgICAgIG1hdGNoKGUxMSwgdDkpIHsKICAgICAgICBpZiAoIWUxMS5zdGFyWWVhciAmJiAodGhpcy55ZWFyIDwgMCB8fCB0aGlzLnllYXIgPj0gZTExLnllYXIubGVuZ3RoIHx8IGUxMS55ZWFyW3RoaXMueWVhcl0gPT09IDApKSByZXR1cm4gZmFsc2U7CiAgICAgICAgZm9yIChsZXQgcjExID0gMDsgcjExIDwgZjQubGVuZ3RoOyByMTErKykgewogICAgICAgICAgbGV0IG4xMyA9IGY0W3IxMV1bMF0sIGkxMSA9IGY0W3IxMV1bMl0sIGE1ID0gdGhpc1tuMTNdOwogICAgICAgICAgaWYgKGE1ICsgaTExIDwgMCB8fCBhNSArIGkxMSA+PSBlMTFbbjEzXS5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgICAgICAgIGxldCBvMTMgPSBlMTFbbjEzXVthNSArIGkxMV07CiAgICAgICAgICBpZiAobjEzID09PSAiZGF5IikgewogICAgICAgICAgICBpZiAoIW8xMykgewogICAgICAgICAgICAgIGZvciAobGV0IGg5ID0gMDsgaDkgPCBlMTEubmVhcmVzdFdlZWtkYXlzLmxlbmd0aDsgaDkrKykgaWYgKGUxMS5uZWFyZXN0V2Vla2RheXNbaDldKSB7CiAgICAgICAgICAgICAgICBsZXQgbDYgPSB0aGlzLmdldE5lYXJlc3RXZWVrZGF5KHRoaXMueWVhciwgdGhpcy5tb250aCwgaDkgLSBpMTEpOwogICAgICAgICAgICAgICAgaWYgKGw2ICE9PSAtMSAmJiBsNiA9PT0gYTUpIHsKICAgICAgICAgICAgICAgICAgbzEzID0gMTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlMTEubGFzdFdlZWtkYXkpIHsKICAgICAgICAgICAgICBsZXQgaDkgPSB0aGlzLmdldExhc3RXZWVrZGF5KHRoaXMueWVhciwgdGhpcy5tb250aCk7CiAgICAgICAgICAgICAgYTUgPT09IGg5ICYmIChvMTMgPSAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZTExLmxhc3REYXlPZk1vbnRoKSB7CiAgICAgICAgICAgICAgbGV0IGg5ID0gdGhpcy5nZXRMYXN0RGF5T2ZNb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgpOwogICAgICAgICAgICAgIGE1ID09PSBoOSAmJiAobzEzID0gMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFlMTEuc3RhckRPVykgewogICAgICAgICAgICAgIGxldCBoOSA9IG5ldyBEYXRlKERhdGUuVVRDKHRoaXMueWVhciwgdGhpcy5tb250aCwgMSwgMCwgMCwgMCwgMCkpLmdldFVUQ0RheSgpLCBsNiA9IGUxMS5kYXlPZldlZWtbKGg5ICsgKGE1IC0gMSkpICUgN107CiAgICAgICAgICAgICAgbDYgJiYgbDYgJiA2MyAmJiAobDYgPSB0aGlzLmlzTnRoV2Vla2RheU9mTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoLCBhNSwgbDYpID8gMSA6IDApLCBlMTEudXNlQW5kTG9naWMgPyBvMTMgPSBvMTMgJiYgbDYgOiAhdDkuZG9tQW5kRG93ICYmICFlMTEuc3RhckRPTSA/IG8xMyA9IG8xMyB8fCBsNiA6IG8xMyA9IG8xMyAmJiBsNjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKCFvMTMpIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH07CiAgICBXID0gMzAgKiAxZTMsIHcyID0gW10sIEUyID0gY2xhc3MgewogICAgICBuYW1lOwogICAgICBvcHRpb25zOwogICAgICBfc3RhdGVzOwogICAgICBmbjsKICAgICAgZ2V0VHooKSB7CiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy50aW1lem9uZSB8fCB0aGlzLm9wdGlvbnMudXRjT2Zmc2V0OwogICAgICB9CiAgICAgIGFwcGx5RGF5T2Zmc2V0KGUxMSkgewogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGF5T2Zmc2V0ICE9PSB2b2lkIDAgJiYgdGhpcy5vcHRpb25zLmRheU9mZnNldCAhPT0gMCkgewogICAgICAgICAgbGV0IHQ5ID0gdGhpcy5vcHRpb25zLmRheU9mZnNldCAqIDI0ICogNjAgKiA2MCAqIDFlMzsKICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShlMTEuZ2V0VGltZSgpICsgdDkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZTExOwogICAgICB9CiAgICAgIGNvbnN0cnVjdG9yKGUxMSwgdDksIHIxMSkgewogICAgICAgIGxldCBuMTMsIGkxMTsKICAgICAgICBpZiAocDQodDkpKSBpMTEgPSB0OTsKICAgICAgICBlbHNlIGlmICh0eXBlb2YgdDkgPT0gIm9iamVjdCIpIG4xMyA9IHQ5OwogICAgICAgIGVsc2UgaWYgKHQ5ICE9PSB2b2lkIDApIHRocm93IG5ldyBFcnJvcigiQ3JvbjogSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgZm9yIG9wdGlvbnNJbi4gU2hvdWxkIGJlIG9uZSBvZiBmdW5jdGlvbiwgb3Igb2JqZWN0IChvcHRpb25zKS4iKTsKICAgICAgICBpZiAocDQocjExKSkgaTExID0gcjExOwogICAgICAgIGVsc2UgaWYgKHR5cGVvZiByMTEgPT0gIm9iamVjdCIpIG4xMyA9IHIxMTsKICAgICAgICBlbHNlIGlmIChyMTEgIT09IHZvaWQgMCkgdGhyb3cgbmV3IEVycm9yKCJDcm9uOiBJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCBmb3IgZnVuY0luLiBTaG91bGQgYmUgb25lIG9mIGZ1bmN0aW9uLCBvciBvYmplY3QgKG9wdGlvbnMpLiIpOwogICAgICAgIGlmICh0aGlzLm5hbWUgPSBuMTM/Lm5hbWUsIHRoaXMub3B0aW9ucyA9IFIzKG4xMyksIHRoaXMuX3N0YXRlcyA9IHsga2lsbDogZmFsc2UsIGJsb2NraW5nOiBmYWxzZSwgcHJldmlvdXNSdW46IHZvaWQgMCwgY3VycmVudFJ1bjogdm9pZCAwLCBvbmNlOiB2b2lkIDAsIGN1cnJlbnRUaW1lb3V0OiB2b2lkIDAsIG1heFJ1bnM6IG4xMyA/IG4xMy5tYXhSdW5zIDogdm9pZCAwLCBwYXVzZWQ6IG4xMyA/IG4xMy5wYXVzZWQgOiBmYWxzZSwgcGF0dGVybjogbmV3IEMyKCIqICogKiAqICoiLCB2b2lkIDAsIHsgbW9kZTogImF1dG8iIH0pIH0sIGUxMSAmJiAoZTExIGluc3RhbmNlb2YgRGF0ZSB8fCB0eXBlb2YgZTExID09ICJzdHJpbmciICYmIGUxMS5pbmRleE9mKCI6IikgPiAwKSA/IHRoaXMuX3N0YXRlcy5vbmNlID0gbmV3IG0zKGUxMSwgdGhpcy5nZXRUeigpKSA6IHRoaXMuX3N0YXRlcy5wYXR0ZXJuID0gbmV3IEMyKGUxMSwgdGhpcy5vcHRpb25zLnRpbWV6b25lLCB7IG1vZGU6IHRoaXMub3B0aW9ucy5tb2RlLCBhbHRlcm5hdGl2ZVdlZWtkYXlzOiB0aGlzLm9wdGlvbnMuYWx0ZXJuYXRpdmVXZWVrZGF5cywgc2xvcHB5UmFuZ2VzOiB0aGlzLm9wdGlvbnMuc2xvcHB5UmFuZ2VzIH0pLCB0aGlzLm5hbWUpIHsKICAgICAgICAgIGlmICh3Mi5maW5kKChvMTMpID0+IG8xMy5uYW1lID09PSB0aGlzLm5hbWUpKSB0aHJvdyBuZXcgRXJyb3IoIkNyb246IFRyaWVkIHRvIGluaXRpYWxpemUgbmV3IG5hbWVkIGpvYiAnIiArIHRoaXMubmFtZSArICInLCBidXQgbmFtZSBhbHJlYWR5IHRha2VuLiIpOwogICAgICAgICAgdzIucHVzaCh0aGlzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGkxMSAhPT0gdm9pZCAwICYmIF8zKGkxMSkgJiYgKHRoaXMuZm4gPSBpMTEsIHRoaXMuc2NoZWR1bGUoKSksIHRoaXM7CiAgICAgIH0KICAgICAgbmV4dFJ1bihlMTEpIHsKICAgICAgICBsZXQgdDkgPSB0aGlzLl9uZXh0KGUxMSk7CiAgICAgICAgcmV0dXJuIHQ5ID8gdGhpcy5hcHBseURheU9mZnNldCh0OS5nZXREYXRlKGZhbHNlKSkgOiBudWxsOwogICAgICB9CiAgICAgIG5leHRSdW5zKGUxMSwgdDkpIHsKICAgICAgICB0aGlzLl9zdGF0ZXMubWF4UnVucyAhPT0gdm9pZCAwICYmIGUxMSA+IHRoaXMuX3N0YXRlcy5tYXhSdW5zICYmIChlMTEgPSB0aGlzLl9zdGF0ZXMubWF4UnVucyk7CiAgICAgICAgbGV0IHIxMSA9IHQ5IHx8IHRoaXMuX3N0YXRlcy5jdXJyZW50UnVuIHx8IHZvaWQgMDsKICAgICAgICByZXR1cm4gdGhpcy5fZW51bWVyYXRlUnVucyhlMTEsIHIxMSwgIm5leHQiKTsKICAgICAgfQogICAgICBwcmV2aW91c1J1bnMoZTExLCB0OSkgewogICAgICAgIHJldHVybiB0aGlzLl9lbnVtZXJhdGVSdW5zKGUxMSwgdDkgfHwgdm9pZCAwLCAicHJldmlvdXMiKTsKICAgICAgfQogICAgICBfZW51bWVyYXRlUnVucyhlMTEsIHQ5LCByMTEpIHsKICAgICAgICBsZXQgbjEzID0gW10sIGkxMSA9IHQ5ID8gbmV3IG0zKHQ5LCB0aGlzLmdldFR6KCkpIDogbnVsbCwgYTUgPSByMTEgPT09ICJuZXh0IiA/IHRoaXMuX25leHQgOiB0aGlzLl9wcmV2aW91czsKICAgICAgICBmb3IgKDsgZTExLS07ICkgewogICAgICAgICAgbGV0IG8xMyA9IGE1LmNhbGwodGhpcywgaTExKTsKICAgICAgICAgIGlmICghbzEzKSBicmVhazsKICAgICAgICAgIGxldCBoOSA9IG8xMy5nZXREYXRlKGZhbHNlKTsKICAgICAgICAgIG4xMy5wdXNoKHRoaXMuYXBwbHlEYXlPZmZzZXQoaDkpKSwgaTExID0gbzEzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbjEzOwogICAgICB9CiAgICAgIG1hdGNoKGUxMSkgewogICAgICAgIGlmICh0aGlzLl9zdGF0ZXMub25jZSkgewogICAgICAgICAgbGV0IHIxMSA9IG5ldyBtMyhlMTEsIHRoaXMuZ2V0VHooKSk7CiAgICAgICAgICByMTEubXMgPSAwOwogICAgICAgICAgbGV0IG4xMyA9IG5ldyBtMyh0aGlzLl9zdGF0ZXMub25jZSwgdGhpcy5nZXRUeigpKTsKICAgICAgICAgIHJldHVybiBuMTMubXMgPSAwLCByMTEuZ2V0VGltZSgpID09PSBuMTMuZ2V0VGltZSgpOwogICAgICAgIH0KICAgICAgICBsZXQgdDkgPSBuZXcgbTMoZTExLCB0aGlzLmdldFR6KCkpOwogICAgICAgIHJldHVybiB0OS5tcyA9IDAsIHQ5Lm1hdGNoKHRoaXMuX3N0YXRlcy5wYXR0ZXJuLCB0aGlzLm9wdGlvbnMpOwogICAgICB9CiAgICAgIGdldFBhdHRlcm4oKSB7CiAgICAgICAgaWYgKCF0aGlzLl9zdGF0ZXMub25jZSkgcmV0dXJuIHRoaXMuX3N0YXRlcy5wYXR0ZXJuID8gdGhpcy5fc3RhdGVzLnBhdHRlcm4ucGF0dGVybiA6IHZvaWQgMDsKICAgICAgfQogICAgICBnZXRPbmNlKCkgewogICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZXMub25jZSA/IHRoaXMuX3N0YXRlcy5vbmNlLmdldERhdGUoKSA6IG51bGw7CiAgICAgIH0KICAgICAgaXNSdW5uaW5nKCkgewogICAgICAgIGxldCBlMTEgPSB0aGlzLm5leHRSdW4odGhpcy5fc3RhdGVzLmN1cnJlbnRSdW4pLCB0OSA9ICF0aGlzLl9zdGF0ZXMucGF1c2VkLCByMTEgPSB0aGlzLmZuICE9PSB2b2lkIDAsIG4xMyA9ICF0aGlzLl9zdGF0ZXMua2lsbDsKICAgICAgICByZXR1cm4gdDkgJiYgcjExICYmIG4xMyAmJiBlMTEgIT09IG51bGw7CiAgICAgIH0KICAgICAgaXNTdG9wcGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZXMua2lsbDsKICAgICAgfQogICAgICBpc0J1c3koKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5ibG9ja2luZzsKICAgICAgfQogICAgICBjdXJyZW50UnVuKCkgewogICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZXMuY3VycmVudFJ1biA/IHRoaXMuX3N0YXRlcy5jdXJyZW50UnVuLmdldERhdGUoKSA6IG51bGw7CiAgICAgIH0KICAgICAgcHJldmlvdXNSdW4oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5wcmV2aW91c1J1biA/IHRoaXMuX3N0YXRlcy5wcmV2aW91c1J1bi5nZXREYXRlKCkgOiBudWxsOwogICAgICB9CiAgICAgIG1zVG9OZXh0KGUxMSkgewogICAgICAgIGxldCB0OSA9IHRoaXMuX25leHQoZTExKTsKICAgICAgICByZXR1cm4gdDkgPyBlMTEgaW5zdGFuY2VvZiBtMyB8fCBlMTEgaW5zdGFuY2VvZiBEYXRlID8gdDkuZ2V0VGltZSgpIC0gZTExLmdldFRpbWUoKSA6IHQ5LmdldFRpbWUoKSAtIG5ldyBtMyhlMTEpLmdldFRpbWUoKSA6IG51bGw7CiAgICAgIH0KICAgICAgc3RvcCgpIHsKICAgICAgICB0aGlzLl9zdGF0ZXMua2lsbCA9IHRydWUsIHRoaXMuX3N0YXRlcy5jdXJyZW50VGltZW91dCAmJiBjbGVhclRpbWVvdXQodGhpcy5fc3RhdGVzLmN1cnJlbnRUaW1lb3V0KTsKICAgICAgICBsZXQgZTExID0gdzIuaW5kZXhPZih0aGlzKTsKICAgICAgICBlMTEgPj0gMCAmJiB3Mi5zcGxpY2UoZTExLCAxKTsKICAgICAgfQogICAgICBwYXVzZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGVzLnBhdXNlZCA9IHRydWUsICF0aGlzLl9zdGF0ZXMua2lsbDsKICAgICAgfQogICAgICByZXN1bWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5wYXVzZWQgPSBmYWxzZSwgIXRoaXMuX3N0YXRlcy5raWxsOwogICAgICB9CiAgICAgIHNjaGVkdWxlKGUxMSkgewogICAgICAgIGlmIChlMTEgJiYgdGhpcy5mbikgdGhyb3cgbmV3IEVycm9yKCJDcm9uOiBJdCBpcyBub3QgYWxsb3dlZCB0byBzY2hlZHVsZSB0d28gZnVuY3Rpb25zIHVzaW5nIHRoZSBzYW1lIENyb25lciBpbnN0YW5jZS4iKTsKICAgICAgICBlMTEgJiYgKHRoaXMuZm4gPSBlMTEpOwogICAgICAgIGxldCB0OSA9IHRoaXMubXNUb05leHQoKSwgcjExID0gdGhpcy5uZXh0UnVuKHRoaXMuX3N0YXRlcy5jdXJyZW50UnVuKTsKICAgICAgICByZXR1cm4gdDkgPT0gbnVsbCB8fCBpc05hTih0OSkgfHwgcjExID09PSBudWxsID8gdGhpcyA6ICh0OSA+IFcgJiYgKHQ5ID0gVyksIHRoaXMuX3N0YXRlcy5jdXJyZW50VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fY2hlY2tUcmlnZ2VyKHIxMSksIHQ5KSwgdGhpcy5fc3RhdGVzLmN1cnJlbnRUaW1lb3V0ICYmIHRoaXMub3B0aW9ucy51bnJlZiAmJiB4Mih0aGlzLl9zdGF0ZXMuY3VycmVudFRpbWVvdXQpLCB0aGlzKTsKICAgICAgfQogICAgICBhc3luYyBfdHJpZ2dlcihlMTEpIHsKICAgICAgICB0aGlzLl9zdGF0ZXMuYmxvY2tpbmcgPSB0cnVlLCB0aGlzLl9zdGF0ZXMuY3VycmVudFJ1biA9IG5ldyBtMyh2b2lkIDAsIHRoaXMuZ2V0VHooKSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2F0Y2gpIHRyeSB7CiAgICAgICAgICAgIHRoaXMuZm4gIT09IHZvaWQgMCAmJiBhd2FpdCB0aGlzLmZuKHRoaXMsIHRoaXMub3B0aW9ucy5jb250ZXh0KTsKICAgICAgICAgIH0gY2F0Y2ggKHQ5KSB7CiAgICAgICAgICAgIGlmIChwNCh0aGlzLm9wdGlvbnMuY2F0Y2gpKSB0cnkgewogICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYXRjaCh0OSwgdGhpcyk7CiAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHRoaXMuZm4gIT09IHZvaWQgMCAmJiBhd2FpdCB0aGlzLmZuKHRoaXMsIHRoaXMub3B0aW9ucy5jb250ZXh0KTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgdGhpcy5fc3RhdGVzLnByZXZpb3VzUnVuID0gbmV3IG0zKGUxMSwgdGhpcy5nZXRUeigpKSwgdGhpcy5fc3RhdGVzLmJsb2NraW5nID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIHRyaWdnZXIoKSB7CiAgICAgICAgYXdhaXQgdGhpcy5fdHJpZ2dlcigpOwogICAgICB9CiAgICAgIHJ1bnNMZWZ0KCkgewogICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZXMubWF4UnVuczsKICAgICAgfQogICAgICBfY2hlY2tUcmlnZ2VyKGUxMSkgewogICAgICAgIGxldCB0OSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLCByMTEgPSAhdGhpcy5fc3RhdGVzLnBhdXNlZCAmJiB0OS5nZXRUaW1lKCkgPj0gZTExLmdldFRpbWUoKSwgbjEzID0gdGhpcy5fc3RhdGVzLmJsb2NraW5nICYmIHRoaXMub3B0aW9ucy5wcm90ZWN0OwogICAgICAgIHIxMSAmJiAhbjEzID8gKHRoaXMuX3N0YXRlcy5tYXhSdW5zICE9PSB2b2lkIDAgJiYgdGhpcy5fc3RhdGVzLm1heFJ1bnMtLSwgdGhpcy5fdHJpZ2dlcigpKSA6IHIxMSAmJiBuMTMgJiYgcDQodGhpcy5vcHRpb25zLnByb3RlY3QpICYmIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vcHRpb25zLnByb3RlY3QodGhpcyksIDApLCB0aGlzLnNjaGVkdWxlKCk7CiAgICAgIH0KICAgICAgX25leHQoZTExKSB7CiAgICAgICAgbGV0IHQ5ID0gISEoZTExIHx8IHRoaXMuX3N0YXRlcy5jdXJyZW50UnVuKSwgcjExID0gZmFsc2U7CiAgICAgICAgIWUxMSAmJiB0aGlzLm9wdGlvbnMuc3RhcnRBdCAmJiB0aGlzLm9wdGlvbnMuaW50ZXJ2YWwgJiYgKFtlMTEsIHQ5XSA9IHRoaXMuX2NhbGN1bGF0ZVByZXZpb3VzUnVuKGUxMSwgdDkpLCByMTEgPSAhZTExKSwgZTExID0gbmV3IG0zKGUxMSwgdGhpcy5nZXRUeigpKSwgdGhpcy5vcHRpb25zLnN0YXJ0QXQgJiYgZTExICYmIGUxMS5nZXRUaW1lKCkgPCB0aGlzLm9wdGlvbnMuc3RhcnRBdC5nZXRUaW1lKCkgJiYgKGUxMSA9IHRoaXMub3B0aW9ucy5zdGFydEF0KTsKICAgICAgICBsZXQgbjEzID0gdGhpcy5fc3RhdGVzLm9uY2UgfHwgbmV3IG0zKGUxMSwgdGhpcy5nZXRUeigpKTsKICAgICAgICByZXR1cm4gIXIxMSAmJiBuMTMgIT09IHRoaXMuX3N0YXRlcy5vbmNlICYmIChuMTMgPSBuMTMuaW5jcmVtZW50KHRoaXMuX3N0YXRlcy5wYXR0ZXJuLCB0aGlzLm9wdGlvbnMsIHQ5KSksIHRoaXMuX3N0YXRlcy5vbmNlICYmIHRoaXMuX3N0YXRlcy5vbmNlLmdldFRpbWUoKSA8PSBlMTEuZ2V0VGltZSgpIHx8IG4xMyA9PT0gbnVsbCB8fCB0aGlzLl9zdGF0ZXMubWF4UnVucyAhPT0gdm9pZCAwICYmIHRoaXMuX3N0YXRlcy5tYXhSdW5zIDw9IDAgfHwgdGhpcy5fc3RhdGVzLmtpbGwgfHwgdGhpcy5vcHRpb25zLnN0b3BBdCAmJiBuMTMuZ2V0VGltZSgpID49IHRoaXMub3B0aW9ucy5zdG9wQXQuZ2V0VGltZSgpID8gbnVsbCA6IG4xMzsKICAgICAgfQogICAgICBfcHJldmlvdXMoZTExKSB7CiAgICAgICAgbGV0IHQ5ID0gbmV3IG0zKGUxMSwgdGhpcy5nZXRUeigpKTsKICAgICAgICB0aGlzLm9wdGlvbnMuc3RvcEF0ICYmIHQ5LmdldFRpbWUoKSA+IHRoaXMub3B0aW9ucy5zdG9wQXQuZ2V0VGltZSgpICYmICh0OSA9IHRoaXMub3B0aW9ucy5zdG9wQXQpOwogICAgICAgIGxldCByMTEgPSBuZXcgbTModDksIHRoaXMuZ2V0VHooKSk7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5vbmNlID8gdGhpcy5fc3RhdGVzLm9uY2UuZ2V0VGltZSgpIDwgdDkuZ2V0VGltZSgpID8gdGhpcy5fc3RhdGVzLm9uY2UgOiBudWxsIDogKHIxMSA9IHIxMS5kZWNyZW1lbnQodGhpcy5fc3RhdGVzLnBhdHRlcm4sIHRoaXMub3B0aW9ucyksIHIxMSA9PT0gbnVsbCB8fCB0aGlzLm9wdGlvbnMuc3RhcnRBdCAmJiByMTEuZ2V0VGltZSgpIDwgdGhpcy5vcHRpb25zLnN0YXJ0QXQuZ2V0VGltZSgpID8gbnVsbCA6IHIxMSk7CiAgICAgIH0KICAgICAgX2NhbGN1bGF0ZVByZXZpb3VzUnVuKGUxMSwgdDkpIHsKICAgICAgICBsZXQgcjExID0gbmV3IG0zKHZvaWQgMCwgdGhpcy5nZXRUeigpKSwgbjEzID0gZTExOwogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3RhcnRBdC5nZXRUaW1lKCkgPD0gcjExLmdldFRpbWUoKSkgewogICAgICAgICAgbjEzID0gdGhpcy5vcHRpb25zLnN0YXJ0QXQ7CiAgICAgICAgICBsZXQgaTExID0gbjEzLmdldFRpbWUoKSArIHRoaXMub3B0aW9ucy5pbnRlcnZhbCAqIDFlMzsKICAgICAgICAgIGZvciAoOyBpMTEgPD0gcjExLmdldFRpbWUoKTsgKSBuMTMgPSBuZXcgbTMobjEzLCB0aGlzLmdldFR6KCkpLmluY3JlbWVudCh0aGlzLl9zdGF0ZXMucGF0dGVybiwgdGhpcy5vcHRpb25zLCB0cnVlKSwgaTExID0gbjEzLmdldFRpbWUoKSArIHRoaXMub3B0aW9ucy5pbnRlcnZhbCAqIDFlMzsKICAgICAgICAgIHQ5ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG4xMyA9PT0gbnVsbCAmJiAobjEzID0gdm9pZCAwKSwgW24xMywgdDldOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUucGx1Z2lucy5qcwp2YXIgaW1wb3J0X2RheWpzMiwgaW1wb3J0X2lzVG9kYXkyOwp2YXIgaW5pdF9zbWFydHRpbWVfcGx1Z2luczIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4yLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5wbHVnaW5zLmpzIigpIHsKICAgIGluaXRfZGlzdF90czcoKTsKICAgIGluaXRfZGlzdF90czMoKTsKICAgIGluaXRfZGlzdF90cygpOwogICAgaW5pdF9jcm9uZXIyKCk7CiAgICBpbml0X2RhdGVfZm5zKCk7CiAgICBpbXBvcnRfZGF5anMyID0gX190b0VTTShyZXF1aXJlX2RheWpzX21pbigpLCAxKTsKICAgIGltcG9ydF9pc1RvZGF5MiA9IF9fdG9FU00ocmVxdWlyZV9pc1RvZGF5KCksIDEpOwogICAgaW5pdF9wcmV0dHlfbXMoKTsKICAgIGltcG9ydF9kYXlqczIuZGVmYXVsdC5leHRlbmQoaW1wb3J0X2lzVG9kYXkyLmRlZmF1bHQpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUuY2xhc3Nlcy5jcm9uam9iLmpzCnZhciBDcm9uSm9iMjsKdmFyIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfY3JvbmpvYjIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4yLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLmNyb25qb2IuanMiKCkgewogICAgaW5pdF9zbWFydHRpbWVfcGx1Z2luczIoKTsKICAgIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfY3Jvbm1hbmFnZXIyKCk7CiAgICBDcm9uSm9iMiA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoY3Jvbk1hbmFnZXIsIGNyb25FeHByZXNzaW9uQXJnLCBqb2JGdW5jdGlvbikgewogICAgICAgIHRoaXMuc3RhdHVzID0gImluaXRpYWwiOwogICAgICAgIHRoaXMubmV4dEV4ZWN1dGlvblVuaXggPSAwOwogICAgICAgIHRoaXMuY3JvbkV4cHJlc3Npb24gPSBjcm9uRXhwcmVzc2lvbkFyZzsKICAgICAgICB0aGlzLmpvYkZ1bmN0aW9uID0gam9iRnVuY3Rpb247CiAgICAgICAgdGhpcy5jcm9uUGFyc2VyID0gbmV3IGNyb25lcl9leHBvcnRzMi5Dcm9uKGNyb25FeHByZXNzaW9uQXJnKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogY2hlY2tzIHdldGhlciB0aGUgY3JvbmpvYiBuZWVkcyB0byBiZSBleGVjdXRlZAogICAgICAgKi8KICAgICAgY2hlY2tFeGVjdXRpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAic3RvcHBlZCIpIHsKICAgICAgICAgIHJldHVybiB0aGlzLm5leHRFeGVjdXRpb25Vbml4OwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5uZXh0RXhlY3V0aW9uVW5peCA9PT0gMCkgewogICAgICAgICAgdGhpcy5nZXROZXh0RXhlY3V0aW9uVGltZSgpOwogICAgICAgIH0KICAgICAgICBpZiAoRGF0ZS5ub3coKSA+IHRoaXMubmV4dEV4ZWN1dGlvblVuaXgpIHsKICAgICAgICAgIGNvbnN0IG1heWJlUHJvbWlzZSA9IHRoaXMuam9iRnVuY3Rpb24odGhpcy5uZXh0RXhlY3V0aW9uVW5peCk7CiAgICAgICAgICBpZiAobWF5YmVQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkgewogICAgICAgICAgICBtYXliZVByb21pc2UuY2F0Y2goKGUxMSkgPT4gY29uc29sZS5sb2coZTExKSk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLm5leHRFeGVjdXRpb25Vbml4ID0gdGhpcy5nZXROZXh0RXhlY3V0aW9uVGltZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5uZXh0RXhlY3V0aW9uVW5peDsKICAgICAgfQogICAgICBnZXROZXh0RXhlY3V0aW9uVGltZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5uZXh0RXhlY3V0aW9uVW5peCA9IERhdGUubm93KCkgKyB0aGlzLmdldFRpbWVUb05leHRFeGVjdXRpb24oKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogZ2V0cyB0aGUgdGltZSB0byBuZXh0IGV4ZWN1dGlvbgogICAgICAgKi8KICAgICAgZ2V0VGltZVRvTmV4dEV4ZWN1dGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5jcm9uUGFyc2VyLm1zVG9OZXh0KCk7CiAgICAgIH0KICAgICAgc3RhcnQoKSB7CiAgICAgICAgdGhpcy5zdGF0dXMgPSAic3RhcnRlZCI7CiAgICAgIH0KICAgICAgc3RvcCgpIHsKICAgICAgICB0aGlzLnN0YXR1cyA9ICJzdG9wcGVkIjsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjIuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuY3Jvbm1hbmFnZXIuanMKdmFyIENyb25NYW5hZ2VyMjsKdmFyIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfY3Jvbm1hbmFnZXIyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUuY2xhc3Nlcy5jcm9ubWFuYWdlci5qcyIoKSB7CiAgICBpbml0X3NtYXJ0dGltZV9wbHVnaW5zMigpOwogICAgaW5pdF9zbWFydHRpbWVfY2xhc3Nlc19jcm9uam9iMigpOwogICAgQ3Jvbk1hbmFnZXIyID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLnN0YXR1cyA9ICJzdG9wcGVkIjsKICAgICAgICB0aGlzLmNyb25qb2JzID0gbmV3IGRpc3RfdHNfZXhwb3J0czYuT2JqZWN0TWFwKCk7CiAgICAgICAgdGhpcy5jeWNsZVdha2VEZWZlcnJlZCA9IG51bGw7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJlc29sdmVzIHRoZSBjdXJyZW50IHdha2UgZGVmZXJyZWQsIGNhdXNpbmcgdGhlIHNsZWVwaW5nIGN5Y2xlCiAgICAgICAqIHRvIGltbWVkaWF0ZWx5IHJlY2FsY3VsYXRlIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgaXRzIHRpbWVvdXQuCiAgICAgICAqLwogICAgICB3YWtlQ3ljbGUoKSB7CiAgICAgICAgaWYgKHRoaXMuY3ljbGVXYWtlRGVmZXJyZWQgJiYgdGhpcy5jeWNsZVdha2VEZWZlcnJlZC5zdGF0dXMgPT09ICJwZW5kaW5nIikgewogICAgICAgICAgdGhpcy5jeWNsZVdha2VEZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFkZENyb25qb2IoY3JvbklkZW50aWZpZXJBcmcsIGNyb25GdW5jdGlvbkFyZykgewogICAgICAgIGNvbnN0IG5ld0Nyb25Kb2IgPSBuZXcgQ3JvbkpvYjIodGhpcywgY3JvbklkZW50aWZpZXJBcmcsIGNyb25GdW5jdGlvbkFyZyk7CiAgICAgICAgdGhpcy5jcm9uam9icy5hZGQobmV3Q3JvbkpvYik7CiAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAic3RhcnRlZCIpIHsKICAgICAgICAgIG5ld0Nyb25Kb2Iuc3RhcnQoKTsKICAgICAgICAgIHRoaXMud2FrZUN5Y2xlKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdDcm9uSm9iOwogICAgICB9CiAgICAgIHJlbW92ZUNyb25qb2IoY3JvbmpvYkFyZykgewogICAgICAgIGNyb25qb2JBcmcuc3RvcCgpOwogICAgICAgIHRoaXMuY3JvbmpvYnMucmVtb3ZlKGNyb25qb2JBcmcpOwogICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gInN0YXJ0ZWQiKSB7CiAgICAgICAgICB0aGlzLndha2VDeWNsZSgpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogc3RhcnRzIHRoZSBjcm9uam9iCiAgICAgICAqLwogICAgICBzdGFydCgpIHsKICAgICAgICBpZiAodGhpcy5zdGF0dXMgIT09ICJzdGFydGVkIikgewogICAgICAgICAgdGhpcy5zdGF0dXMgPSAic3RhcnRlZCI7CiAgICAgICAgICBmb3IgKGNvbnN0IGNyb25Kb2Igb2YgdGhpcy5jcm9uam9icy5nZXRBcnJheSgpKSB7CiAgICAgICAgICAgIGNyb25Kb2Iuc3RhcnQoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMucnVuQ3JvbkN5Y2xlKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIHJ1bkNyb25DeWNsZSgpIHsKICAgICAgICB3aGlsZSAodGhpcy5zdGF0dXMgPT09ICJzdGFydGVkIikgewogICAgICAgICAgdGhpcy5jeWNsZVdha2VEZWZlcnJlZCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMuRGVmZXJyZWQoKTsKICAgICAgICAgIGxldCBzb29uZXN0TXMgPSBJbmZpbml0eTsKICAgICAgICAgIGZvciAoY29uc3QgY3JvbkpvYiBvZiB0aGlzLmNyb25qb2JzLmdldEFycmF5KCkpIHsKICAgICAgICAgICAgY3JvbkpvYi5jaGVja0V4ZWN1dGlvbigpOwogICAgICAgICAgICBjb25zdCBtc1RvTmV4dCA9IGNyb25Kb2IuZ2V0VGltZVRvTmV4dEV4ZWN1dGlvbigpOwogICAgICAgICAgICBpZiAobXNUb05leHQgPCBzb29uZXN0TXMpIHsKICAgICAgICAgICAgICBzb29uZXN0TXMgPSBtc1RvTmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHNvb25lc3RNcyA8IEluZmluaXR5ICYmIHNvb25lc3RNcyA+IDApIHsKICAgICAgICAgICAgdGhpcy5leGVjdXRpb25UaW1lb3V0ID0gbmV3IGRpc3RfdHNfZXhwb3J0czMuVGltZW91dChzb29uZXN0TXMpOwogICAgICAgICAgICBhd2FpdCBQcm9taXNlLnJhY2UoWwogICAgICAgICAgICAgIHRoaXMuZXhlY3V0aW9uVGltZW91dC5wcm9taXNlLAogICAgICAgICAgICAgIHRoaXMuY3ljbGVXYWtlRGVmZXJyZWQucHJvbWlzZQogICAgICAgICAgICBdKTsKICAgICAgICAgICAgdGhpcy5leGVjdXRpb25UaW1lb3V0LmNhbmNlbCgpOwogICAgICAgICAgfSBlbHNlIGlmIChzb29uZXN0TXMgPD0gMCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuY3ljbGVXYWtlRGVmZXJyZWQucHJvbWlzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5jeWNsZVdha2VEZWZlcnJlZCA9IG51bGw7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHN0b3BzIGFsbCBjcm9uam9icwogICAgICAgKi8KICAgICAgc3RvcCgpIHsKICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09ICJzdGFydGVkIikgewogICAgICAgICAgdGhpcy5zdGF0dXMgPSAic3RvcHBlZCI7CiAgICAgICAgICBpZiAodGhpcy5leGVjdXRpb25UaW1lb3V0KSB7CiAgICAgICAgICAgIHRoaXMuZXhlY3V0aW9uVGltZW91dC5jYW5jZWwoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMud2FrZUN5Y2xlKCk7CiAgICAgICAgfQogICAgICAgIGZvciAoY29uc3QgY3JvbiBvZiB0aGlzLmNyb25qb2JzLmdldEFycmF5KCkpIHsKICAgICAgICAgIGNyb24uc3RvcCgpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjIuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLnVuaXRzLmpzCnZhciB1bml0czIsIGdldE1pbGxpU2Vjb25kc0Zyb21Vbml0czIsIGdldE1pbGxpU2Vjb25kc0FzSHVtYW5SZWFkYWJsZVN0cmluZzIsIGdldE1pbGxpU2Vjb25kc0FzSHVtYW5SZWFkYWJsZUFnb1RpbWUyOwp2YXIgaW5pdF9zbWFydHRpbWVfdW5pdHMyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUudW5pdHMuanMiKCkgewogICAgaW5pdF9zbWFydHRpbWVfcGx1Z2luczIoKTsKICAgIHVuaXRzMiA9IHsKICAgICAgeWVhcnM6ICh0aW1lc0FyZyA9IDEpID0+IHsKICAgICAgICByZXR1cm4gdGltZXNBcmcgKiAzMTU0ZTc7CiAgICAgIH0sCiAgICAgIG1vbnRoczogKHRpbWVzQXJnID0gMSkgPT4gewogICAgICAgIHJldHVybiB0aW1lc0FyZyAqIDI2MjhlNjsKICAgICAgfSwKICAgICAgd2Vla3M6ICh0aW1lc0FyZyA9IDEpID0+IHsKICAgICAgICByZXR1cm4gdGltZXNBcmcgKiA2MDQ4ZTU7CiAgICAgIH0sCiAgICAgIGRheXM6ICh0aW1lc0FyZyA9IDEpID0+IHsKICAgICAgICByZXR1cm4gdGltZXNBcmcgKiA4NjRlNTsKICAgICAgfSwKICAgICAgaG91cnM6ICh0aW1lc0FyZyA9IDEpID0+IHsKICAgICAgICByZXR1cm4gdGltZXNBcmcgKiAzNmU1OwogICAgICB9LAogICAgICBtaW51dGVzOiAodGltZXNBcmcgPSAxKSA9PiB7CiAgICAgICAgcmV0dXJuIHRpbWVzQXJnICogNmU0OwogICAgICB9LAogICAgICBzZWNvbmRzOiAodGltZXNBcmcgPSAxKSA9PiB7CiAgICAgICAgcmV0dXJuIHRpbWVzQXJnICogMWUzOwogICAgICB9CiAgICB9OwogICAgZ2V0TWlsbGlTZWNvbmRzRnJvbVVuaXRzMiA9IChjb21iaW5hdGlvbkFyZykgPT4gewogICAgICBsZXQgdGltZUluTWlsbGlzZWNvbmRzID0gMDsKICAgICAgbGV0IGFkZE1pbGxpU2Vjb25kcyA9IChtaWxsaVNlY29uZHNBcmcpID0+IHsKICAgICAgICB0aW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lSW5NaWxsaXNlY29uZHMgKyBtaWxsaVNlY29uZHNBcmc7CiAgICAgIH07CiAgICAgIGlmIChjb21iaW5hdGlvbkFyZy55ZWFycykgewogICAgICAgIGFkZE1pbGxpU2Vjb25kcyh1bml0czIueWVhcnMoY29tYmluYXRpb25BcmcueWVhcnMpKTsKICAgICAgfQogICAgICBpZiAoY29tYmluYXRpb25BcmcubW9udGhzKSB7CiAgICAgICAgYWRkTWlsbGlTZWNvbmRzKHVuaXRzMi5tb250aHMoY29tYmluYXRpb25BcmcubW9udGhzKSk7CiAgICAgIH0KICAgICAgaWYgKGNvbWJpbmF0aW9uQXJnLndlZWtzKSB7CiAgICAgICAgYWRkTWlsbGlTZWNvbmRzKHVuaXRzMi53ZWVrcyhjb21iaW5hdGlvbkFyZy53ZWVrcykpOwogICAgICB9CiAgICAgIGlmIChjb21iaW5hdGlvbkFyZy5kYXlzKSB7CiAgICAgICAgYWRkTWlsbGlTZWNvbmRzKHVuaXRzMi5kYXlzKGNvbWJpbmF0aW9uQXJnLmRheXMpKTsKICAgICAgfQogICAgICBpZiAoY29tYmluYXRpb25BcmcuaG91cnMpIHsKICAgICAgICBhZGRNaWxsaVNlY29uZHModW5pdHMyLmhvdXJzKGNvbWJpbmF0aW9uQXJnLmhvdXJzKSk7CiAgICAgIH0KICAgICAgaWYgKGNvbWJpbmF0aW9uQXJnLm1pbnV0ZXMpIHsKICAgICAgICBhZGRNaWxsaVNlY29uZHModW5pdHMyLm1pbnV0ZXMoY29tYmluYXRpb25BcmcubWludXRlcykpOwogICAgICB9CiAgICAgIGlmIChjb21iaW5hdGlvbkFyZy5zZWNvbmRzKSB7CiAgICAgICAgYWRkTWlsbGlTZWNvbmRzKHVuaXRzMi5zZWNvbmRzKGNvbWJpbmF0aW9uQXJnLnNlY29uZHMpKTsKICAgICAgfQogICAgICByZXR1cm4gdGltZUluTWlsbGlzZWNvbmRzOwogICAgfTsKICAgIGdldE1pbGxpU2Vjb25kc0FzSHVtYW5SZWFkYWJsZVN0cmluZzIgPSAobWlsbGlTZWNvbmRzQXJnKSA9PiB7CiAgICAgIHJldHVybiBwcmV0dHlNaWxsaXNlY29uZHMobWlsbGlTZWNvbmRzQXJnKTsKICAgIH07CiAgICBnZXRNaWxsaVNlY29uZHNBc0h1bWFuUmVhZGFibGVBZ29UaW1lMiA9ICh0aW1lU3RhbXBBcmcpID0+IHsKICAgICAgcmV0dXJuIGRhdGVfZm5zX2V4cG9ydHMuZm9ybWF0RGlzdGFuY2VUb05vdyhuZXcgRGF0ZSh0aW1lU3RhbXBBcmcpKTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4yLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLmV4dGVuZGVkZGF0ZS5qcwp2YXIgRXh0ZW5kZWREYXRlMjsKdmFyIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfZXh0ZW5kZWRkYXRlMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjIuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuZXh0ZW5kZWRkYXRlLmpzIigpIHsKICAgIGluaXRfc21hcnR0aW1lX3BsdWdpbnMyKCk7CiAgICBpbml0X3NtYXJ0dGltZV91bml0czIoKTsKICAgIEV4dGVuZGVkRGF0ZTIgPSBjbGFzcyBfRXh0ZW5kZWREYXRlIGV4dGVuZHMgRGF0ZSB7CiAgICAgIC8vIFNUQVRJQyBmYWN0b3JpZXMKICAgICAgc3RhdGljIGZyb21NaWxsaXMobWlsbGlTZWNvbmRzKSB7CiAgICAgICAgcmV0dXJuIG5ldyBfRXh0ZW5kZWREYXRlKG1pbGxpU2Vjb25kcyk7CiAgICAgIH0KICAgICAgc3RhdGljIGZyb21EYXRlKGRhdGVBcmcpIHsKICAgICAgICByZXR1cm4gbmV3IF9FeHRlbmRlZERhdGUoZGF0ZUFyZy5nZXRUaW1lKCkpOwogICAgICB9CiAgICAgIHN0YXRpYyBmcm9tRXVyb3BlYW5EYXRlKGV1cm9wZWFuRGF0ZSkgewogICAgICAgIGNvbnN0IGRhdGVBcnJheSA9IC8oLiopXC4oLiopXC4oLiopLy5leGVjKGV1cm9wZWFuRGF0ZSk7CiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKAogICAgICAgICAgcGFyc2VGbG9hdChkYXRlQXJyYXlbM10pLAogICAgICAgICAgLy8geWVhcgogICAgICAgICAgcGFyc2VGbG9hdChkYXRlQXJyYXlbMl0pIC0gMSwKICAgICAgICAgIC8vIG1vbnRoCiAgICAgICAgICBwYXJzZUZsb2F0KGRhdGVBcnJheVsxXSkKICAgICAgICAgIC8vIGRheQogICAgICAgICk7CiAgICAgICAgY29uc3QgdW5peE1pbGxpID0gZGF0ZS5nZXRUaW1lKCk7CiAgICAgICAgcmV0dXJuIG5ldyBfRXh0ZW5kZWREYXRlKHVuaXhNaWxsaSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNyZWF0ZXMgYW4gRXh0ZW5kZWQgZGF0ZSBmcm9tIGEgaHlwZWREYXRlIGxpa2UgIjIwMTgtMDMtMjgiCiAgICAgICAqIEBwYXJhbSBkYXRlU3RyaW5nCiAgICAgICAqLwogICAgICBzdGF0aWMgZnJvbUh5cGhlZERhdGUoZGF0ZVN0cmluZykgewogICAgICAgIGNvbnN0IGRhdGVNaWxsaXMgPSBuZXcgRGF0ZShkYXRlU3RyaW5nKS5nZXRUaW1lKCk7CiAgICAgICAgcmV0dXJuIG5ldyBfRXh0ZW5kZWREYXRlKGRhdGVNaWxsaXMpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBTYW1lIGFzIC5mcm9tRXVyb3BlYW5EYXRlKCksIGJ1dCBhY2NlcHRzIGFkZGl0aW9uYWwgdGltZUFyZyBhbmQgem9uZUFyZwogICAgICAgKi8KICAgICAgc3RhdGljIGZyb21FdXJvcGVhbkRhdGVBbmRUaW1lKGV1cm9wZWFuRGF0ZUFyZywgdGltZUFyZyA9ICIxMjowMDowMCIsIHpvbmVBcmcgPSAiRXVyb3BlL0JlcmxpbiIpIHsKICAgICAgICBjb25zdCBkYXRlQXJyYXkgPSAvKC4qKVwuKC4qKVwuKC4qKS8uZXhlYyhldXJvcGVhbkRhdGVBcmcpOwogICAgICAgIGNvbnN0IHNsaWNlRGF0ZSA9IChkYXRlU3RyaW5nKSA9PiB7CiAgICAgICAgICByZXR1cm4gYDAke2RhdGVTdHJpbmd9YC5zbGljZSgtMik7CiAgICAgICAgfTsKICAgICAgICBjb25zdCBkYXRlVGltZVN0cmluZyA9IGAke2RhdGVBcnJheVszXX0tJHtzbGljZURhdGUoZGF0ZUFycmF5WzJdKX0tJHtzbGljZURhdGUoZGF0ZUFycmF5WzFdKX1UJHt0aW1lQXJnfWA7CiAgICAgICAgY29uc3QgZGF0ZSA9IGltcG9ydF9kYXlqczIuZGVmYXVsdChkYXRlVGltZVN0cmluZyk7CiAgICAgICAgY29uc3QgdW5peE1pbGxpID0gZGF0ZS50b0RhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgcmV0dXJuIG5ldyBfRXh0ZW5kZWREYXRlKHVuaXhNaWxsaSk7CiAgICAgIH0KICAgICAgY29uc3RydWN0b3IodW5peE1pbGxpID0gRGF0ZS5ub3coKSkgewogICAgICAgIHN1cGVyKHVuaXhNaWxsaSk7CiAgICAgIH0KICAgICAgLy8KICAgICAgZXhwb3J0VG9FdXJvcGVhbkRhdGUoKSB7CiAgICAgICAgY29uc3QgdW5pdHMzID0gdGhpcy5leHBvcnRUb1VuaXRzKCk7CiAgICAgICAgcmV0dXJuIGAke3VuaXRzMy5kYXlTdHJpbmd9LiR7dW5pdHMzLm1vbnRoU3RyaW5nfS4ke3VuaXRzMy55ZWFyU3RyaW5nfWA7CiAgICAgIH0KICAgICAgZXhwb3J0VG9IeXBoZWRTb3J0YWJsZURhdGUoKSB7CiAgICAgICAgY29uc3QgdW5pdHMzID0gdGhpcy5leHBvcnRUb1VuaXRzKCk7CiAgICAgICAgcmV0dXJuIGAke3VuaXRzMy55ZWFyU3RyaW5nfS0ke3VuaXRzMy5tb250aFN0cmluZ30tJHt1bml0czMuZGF5U3RyaW5nfWA7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGV4cG9ydHMgdW5pdHMKICAgICAgICovCiAgICAgIGV4cG9ydFRvVW5pdHMoKSB7CiAgICAgICAgY29uc3QgbW9udGhzQXJyYXkgPSBbCiAgICAgICAgICAiSmFudWFyeSIsCiAgICAgICAgICAiRmVicnVhcnkiLAogICAgICAgICAgIk1hcmNoIiwKICAgICAgICAgICJBcHJpbCIsCiAgICAgICAgICAiTWF5IiwKICAgICAgICAgICJKdW5lIiwKICAgICAgICAgICJKdWx5IiwKICAgICAgICAgICJBdWd1c3QiLAogICAgICAgICAgIlNlcHRlbWJlciIsCiAgICAgICAgICAiT2N0b2JlciIsCiAgICAgICAgICAiTm92ZW1iZXIiLAogICAgICAgICAgIkRlY2VtYmVyIgogICAgICAgIF07CiAgICAgICAgY29uc3QgZGF5c0FycmF5ID0gWwogICAgICAgICAgIk1vbmRheSIsCiAgICAgICAgICAiVHVlc2RheSIsCiAgICAgICAgICAiV2VkbmVzZGF5IiwKICAgICAgICAgICJUaHVyc2RheSIsCiAgICAgICAgICAiRnJpZGF5IiwKICAgICAgICAgICJTYXR1cmRheSIsCiAgICAgICAgICAiU3VuZGF5IgogICAgICAgIF07CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHllYXI6IHRoaXMuZ2V0RnVsbFllYXIoKSwKICAgICAgICAgIHllYXJTdHJpbmc6IGAke3RoaXMuZ2V0RnVsbFllYXIoKX1gLAogICAgICAgICAgbW9udGg6IHRoaXMuZ2V0TW9udGgoKSArIDEsCiAgICAgICAgICBtb250aFN0cmluZzogKCIwIiArICh0aGlzLmdldE1vbnRoKCkgKyAxKSkuc2xpY2UoLTIpLAogICAgICAgICAgbW9udGhOYW1lOiBtb250aHNBcnJheVt0aGlzLmdldE1vbnRoKCldLAogICAgICAgICAgZGF5OiB0aGlzLmdldERhdGUoKSwKICAgICAgICAgIGRheVN0cmluZzogKCIwIiArIHRoaXMuZ2V0RGF0ZSgpKS5zbGljZSgtMiksCiAgICAgICAgICBkYXlPZlRoZVdlZWs6IHRoaXMuZ2V0RGF5KCksCiAgICAgICAgICBkYXlPZlRoZVdlZWtOYW1lOiBkYXlzQXJyYXlbdGhpcy5nZXREYXkoKV0KICAgICAgICB9OwogICAgICB9CiAgICAgIGZvcm1hdChmb3JtYXRBcmcpIHsKICAgICAgICByZXR1cm4gaW1wb3J0X2RheWpzMi5kZWZhdWx0KHRoaXMuZ2V0VGltZSgpKS5mb3JtYXQoZm9ybWF0QXJnKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogYm9vbGVhbiBjaGVja3MKICAgICAgICovCiAgICAgIGlzVG9kYXkoKSB7CiAgICAgICAgcmV0dXJuIGltcG9ydF9kYXlqczIuZGVmYXVsdCh0aGlzLmdldFRpbWUoKSkuaXNUb2RheSgpOwogICAgICB9CiAgICAgIGxlc3NUaW1lUGFzc2VkVG9Ob3codW5pdEFyZ3MpIHsKICAgICAgICBjb25zdCBtYXhQYXNzZWRVbml4VGltZSA9IGdldE1pbGxpU2Vjb25kc0Zyb21Vbml0czIodW5pdEFyZ3MpOwogICAgICAgIGNvbnN0IGFjdHVhbFBhc3NlZFVuaXhUaW1lID0gRGF0ZS5ub3coKSAtIHRoaXMuZ2V0VGltZSgpOwogICAgICAgIHJldHVybiBhY3R1YWxQYXNzZWRVbml4VGltZSA8IG1heFBhc3NlZFVuaXhUaW1lOwogICAgICB9CiAgICAgIG1vcmVUaW1lUGFzc2VkVG9Ob3codW5pdEFyZ3MpIHsKICAgICAgICByZXR1cm4gIXRoaXMubGVzc1RpbWVQYXNzZWRUb05vdyh1bml0QXJncyk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4yLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLmhydG1lYXN1cmVtZW50LmpzCnZhciBIcnRNZWFzdXJlbWVudDI7CnZhciBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX2hydG1lYXN1cmVtZW50MiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjIuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuaHJ0bWVhc3VyZW1lbnQuanMiKCkgewogICAgSHJ0TWVhc3VyZW1lbnQyID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLm5hbm9TZWNvbmRzID0gbnVsbDsKICAgICAgICB0aGlzLm1pbGxpU2Vjb25kcyA9IG51bGw7CiAgICAgICAgdGhpcy5fbWlsbGlTdGFydCA9IG51bGw7CiAgICAgICAgdGhpcy5fbWlsbGlEaWZmID0gbnVsbDsKICAgICAgICB0aGlzLl9zdGFydGVkID0gZmFsc2U7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHN0YXJ0IHRoZSBtZWFzdXJlbWVudAogICAgICAgKi8KICAgICAgc3RhcnQoKSB7CiAgICAgICAgdGhpcy5fc3RhcnRlZCA9IHRydWU7CiAgICAgICAgdGhpcy5fbWlsbGlTdGFydCA9IERhdGUubm93KCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHN0b3AgdGhlIG1lYXN1cmVtZW50CiAgICAgICAqLwogICAgICBzdG9wKCkgewogICAgICAgIGlmICh0aGlzLl9zdGFydGVkID09PSBmYWxzZSkgewogICAgICAgICAgY29uc29sZS5sb2coIkhhc24ndCBzdGFydGVkIHlldCIpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLl9taWxsaURpZmYgPSBEYXRlLm5vdygpIC0gdGhpcy5fbWlsbGlTdGFydDsKICAgICAgICB0aGlzLm5hbm9TZWNvbmRzID0gdGhpcy5fbWlsbGlEaWZmICogMWUzOwogICAgICAgIHRoaXMubWlsbGlTZWNvbmRzID0gdGhpcy5fbWlsbGlEaWZmOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiByZXNldCB0aGUgbWVhc3VyZW1lbnQKICAgICAgICovCiAgICAgIHJlc2V0KCkgewogICAgICAgIHRoaXMubmFub1NlY29uZHMgPSBudWxsOwogICAgICAgIHRoaXMubWlsbGlTZWNvbmRzID0gbnVsbDsKICAgICAgICB0aGlzLl9taWxsaVN0YXJ0ID0gbnVsbDsKICAgICAgICB0aGlzLl9taWxsaURpZmYgPSBudWxsOwogICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjIuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMuaW50ZXJ2YWwuanMKdmFyIEludGVydmFsMjsKdmFyIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfaW50ZXJ2YWwyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUuY2xhc3Nlcy5pbnRlcnZhbC5qcyIoKSB7CiAgICBpbml0X3NtYXJ0dGltZV9wbHVnaW5zMigpOwogICAgSW50ZXJ2YWwyID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcihpbnRlcnZhbE1pbGxpc2VuY29uZHNBcmcpIHsKICAgICAgICB0aGlzLnN0YXR1cyA9ICJpbml0aWFsIjsKICAgICAgICB0aGlzLnN0YXR1c0F1dGhvcml6YXRpb24gPSBudWxsOwogICAgICAgIHRoaXMuaW50ZXJ2YWxKb2JzID0gW107CiAgICAgICAgdGhpcy5pbnRlcnZhbE1pbGxpc2Vjb25kcyA9IGludGVydmFsTWlsbGlzZW5jb25kc0FyZzsKICAgICAgfQogICAgICBzdGFydCgpIHsKICAgICAgICB0aGlzLnN0YXR1cyA9ICJzdGFydGVkIjsKICAgICAgICBjb25zdCBzdGF0dXNBdXRoID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7CiAgICAgICAgdGhpcy5zdGF0dXNBdXRob3JpemF0aW9uID0gc3RhdHVzQXV0aDsKICAgICAgICBjb25zdCBydW5JbnRlcnZhbCA9IGFzeW5jICgpID0+IHsKICAgICAgICAgIHdoaWxlICh0aGlzLnN0YXR1cyA9PT0gInN0YXJ0ZWQiICYmIHRoaXMuc3RhdHVzQXV0aG9yaXphdGlvbiA9PT0gc3RhdHVzQXV0aCkgewogICAgICAgICAgICBhd2FpdCBkaXN0X3RzX2V4cG9ydHMzLmRlbGF5Rm9yKHRoaXMuaW50ZXJ2YWxNaWxsaXNlY29uZHMpOwogICAgICAgICAgICB0aGlzLmV4ZWN1dGVJbnRlcnZhbEpvYnMoKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJ1bkludGVydmFsKCk7CiAgICAgIH0KICAgICAgc3RvcCgpIHsKICAgICAgICB0aGlzLnN0YXR1cyA9ICJzdG9wcGVkIjsKICAgICAgICB0aGlzLnN0YXR1c0F1dGhvcml6YXRpb24gPSBudWxsOwogICAgICB9CiAgICAgIGFkZEludGVydmFsSm9iKGZ1bmNBcmcpIHsKICAgICAgICB0aGlzLmludGVydmFsSm9icy5wdXNoKGZ1bmNBcmcpOwogICAgICB9CiAgICAgIGV4ZWN1dGVJbnRlcnZhbEpvYnMoKSB7CiAgICAgICAgZm9yIChjb25zdCBmdW5jQXJnIG9mIHRoaXMuaW50ZXJ2YWxKb2JzKSB7CiAgICAgICAgICBmdW5jQXJnKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9zbWFydHRpbWUuY2xhc3Nlcy50aW1lc3RhbXAuanMKdmFyIFRpbWVTdGFtcDI7CnZhciBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX3RpbWVzdGFtcDIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4yLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLnRpbWVzdGFtcC5qcyIoKSB7CiAgICBpbml0X3NtYXJ0dGltZV9wbHVnaW5zMigpOwogICAgVGltZVN0YW1wMiA9IGNsYXNzIF9UaW1lU3RhbXAgewogICAgICAvKioKICAgICAgICogcmV0dXJucyBuZXcgVGltZVN0YW1wIGZyb20gbWlsbGlzZWNvbmRzCiAgICAgICAqLwogICAgICBzdGF0aWMgZnJvbU1pbGxpU2Vjb25kcyhtaWxsaVNlY29uZHNBcmcpIHsKICAgICAgICByZXR1cm4gbmV3IF9UaW1lU3RhbXAobWlsbGlTZWNvbmRzQXJnKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogcmV0dXJucyBuZXcgVGltZVN0YW1wIGZvciBub3cgd2l0aCBjaGFuZ2Ugc2V0CiAgICAgICAqIEBwYXJhbSB0aW1lU3RhbXBBcmcKICAgICAgICovCiAgICAgIHN0YXRpYyBmcm9tVGltZVN0YW1wKHRpbWVTdGFtcEFyZykgewogICAgICAgIGNvbnN0IGxvY2FsVGltZVN0YW1wID0gbmV3IF9UaW1lU3RhbXAoKTsKICAgICAgICBsb2NhbFRpbWVTdGFtcC5jaGFuZ2UgPSBsb2NhbFRpbWVTdGFtcC5taWxsaVNlY29uZHMgLSB0aW1lU3RhbXBBcmcubWlsbGlTZWNvbmRzOwogICAgICAgIHJldHVybiBsb2NhbFRpbWVTdGFtcDsKICAgICAgfQogICAgICBjb25zdHJ1Y3RvcihjcmVhdG9yQXJnKSB7CiAgICAgICAgdGhpcy5jaGFuZ2UgPSBudWxsOwogICAgICAgIGlmICghY3JlYXRvckFyZykgewogICAgICAgICAgdGhpcy5kYXRlID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY3JlYXRvckFyZyA9PT0gIm51bWJlciIpIHsKICAgICAgICAgIHRoaXMuZGF0ZSA9IG5ldyBEYXRlKGNyZWF0b3JBcmcpOwogICAgICAgIH0KICAgICAgICB0aGlzLm1pbGxpU2Vjb25kcyA9IHRoaXMuZGF0ZS5nZXRUaW1lKCk7CiAgICAgICAgdGhpcy5lcG9jaHRpbWUgPSBNYXRoLmZsb29yKHRoaXMubWlsbGlTZWNvbmRzIC8gMWUzKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogcmV0dXJucyBhIGJvb2xlYW4gZm9yIHdldGhlciB0aGUgdGltZXN0YW1wIGlzIG9sZGVyIHRoYW4gYW5vdGhlciB0aW1lc3RhbXAKICAgICAgICogQHBhcmFtIFRpbWVTdGFtcEFyZwogICAgICAgKiBAcGFyYW0gdHJlc2hvbGRUaW1lQXJnCiAgICAgICAqLwogICAgICBpc09sZGVyVGhhbk90aGVyVGltZVN0YW1wKFRpbWVTdGFtcEFyZywgdHJlc2hvbGRUaW1lQXJnID0gMCkgewogICAgICAgIGlmICh0aGlzLm1pbGxpU2Vjb25kcyA8IFRpbWVTdGFtcEFyZy5taWxsaVNlY29uZHMgLSB0cmVzaG9sZFRpbWVBcmcpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJcyB0aGUgY3VycmVudCBpbnN0YW5jZSBvbGRlciB0aGFuIHRoZSBhcmd1bWVudAogICAgICAgKiBAcGFyYW0gVGltZVN0YW1wQXJnCiAgICAgICAqLwogICAgICBpc09sZGVyVGhhbihUaW1lU3RhbXBBcmcsIHRyZXNob2xkVGltZUFyZyA9IDApIHsKICAgICAgICBpZiAodGhpcy5taWxsaVNlY29uZHMgKyB0cmVzaG9sZFRpbWVBcmcgPCBUaW1lU3RhbXBBcmcubWlsbGlTZWNvbmRzKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogcmV0dXJucyBhIGJvb2xlYW4gZm9yIHdldGhlciB0aGUgdGltZXN0YW1wIGlzIHlvdW5nZXIgdGhhbiBhbm90aGVyIHRpbWVzdGFtcAogICAgICAgKiBAcGFyYW0gVGltZVN0YW1wQXJnCiAgICAgICAqIEBwYXJhbSB0cmVzaG9sZFRpbWVBcmcKICAgICAgICovCiAgICAgIGlzWW91bmdlclRoYW5PdGhlclRpbWVTdGFtcChUaW1lU3RhbXBBcmcsIHRyZXNob2xkVGltZUFyZyA9IDApIHsKICAgICAgICBpZiAodGhpcy5taWxsaVNlY29uZHMgPiBUaW1lU3RhbXBBcmcubWlsbGlTZWNvbmRzICsgdHJlc2hvbGRUaW1lQXJnKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICBpc1lvdW5nZXJUaGFuTWlsbGlTZWNvbmRzKG1pbGxpc2Vjb25kQXJnKSB7CiAgICAgICAgY29uc3Qgbm93VGltZVN0YW1wID0gbmV3IF9UaW1lU3RhbXAoKTsKICAgICAgICBjb25zdCBjb21wYXJlRXBvY2hUaW1lID0gbm93VGltZVN0YW1wLmVwb2NodGltZSAtIG1pbGxpc2Vjb25kQXJnOwogICAgICAgIGNvbnN0IGNvbXBhcmVUaW1lU3RhbXAgPSBuZXcgX1RpbWVTdGFtcChjb21wYXJlRXBvY2hUaW1lKTsKICAgICAgICByZXR1cm4gdGhpcy5pc1lvdW5nZXJUaGFuT3RoZXJUaW1lU3RhbXAoY29tcGFyZVRpbWVTdGFtcCk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4yLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL3NtYXJ0dGltZS5jbGFzc2VzLnRpbWVyLmpzCnZhciBUaW1lcjI7CnZhciBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX3RpbWVyMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dGltZUA0LjIuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR0aW1lL2Rpc3RfdHMvc21hcnR0aW1lLmNsYXNzZXMudGltZXIuanMiKCkgewogICAgaW5pdF9zbWFydHRpbWVfcGx1Z2luczIoKTsKICAgIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfdGltZXN0YW1wMigpOwogICAgVGltZXIyID0gY2xhc3MgewogICAgICBnZXQgdGltZUxlZnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudGltZUluTWlsbGlzZWNvbmRzIC0gdGhpcy5wYXVzZWRBdC5jaGFuZ2U7CiAgICAgIH0KICAgICAgY29uc3RydWN0b3IodGltZUluTWlsbGlzZWNvbmRzQXJnKSB7CiAgICAgICAgdGhpcy5zdGF0ZSA9ICJpbml0aWF0ZWQiOwogICAgICAgIHRoaXMuY29tcGxldGVkRGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgICAgICB0aGlzLnRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVJbk1pbGxpc2Vjb25kc0FyZzsKICAgICAgICB0aGlzLmNvbXBsZXRlZCA9IHRoaXMuY29tcGxldGVkRGVmZXJyZWQucHJvbWlzZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogc3RhcnRzIHRoZSB0aW1lcgogICAgICAgKi8KICAgICAgc3RhcnQoKSB7CiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWRBdCkgewogICAgICAgICAgdGhpcy5jdXJyZW50VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICB0aGlzLmNvbXBsZXRlZERlZmVycmVkLnJlc29sdmUoKTsKICAgICAgICAgIH0sIHRoaXMudGltZUluTWlsbGlzZWNvbmRzKTsKICAgICAgICAgIHRoaXMuc3RhcnRlZEF0ID0gbmV3IFRpbWVTdGFtcDIoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ0aW1lciBoYXMgYmVlbiBzdGFydGVkIGJlZm9yZS4gUGxlYXNlIHVzZSByZXN1bWUgaW5zdGVhZCIpOwogICAgICAgIH0KICAgICAgfQogICAgICBwYXVzZSgpIHsKICAgICAgICBpZiAodGhpcy5zdGFydGVkQXQpIHsKICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmN1cnJlbnRUaW1lb3V0KTsKICAgICAgICAgIHRoaXMuY3VycmVudFRpbWVvdXQgPSBudWxsOwogICAgICAgICAgdGhpcy5wYXVzZWRBdCA9IFRpbWVTdGFtcDIuZnJvbVRpbWVTdGFtcCh0aGlzLnN0YXJ0ZWRBdCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlc3VtZSgpIHsKICAgICAgICBpZiAodGhpcy5zdGFydGVkQXQpIHsKICAgICAgICAgIHRoaXMuY3VycmVudFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgdGhpcy5jb21wbGV0ZWREZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICB9LCB0aGlzLnRpbWVMZWZ0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ0aW1lciBoYXMgTk9UIGJlZW4gc3RhcnRlZCBiZWZvcmUuIFBsZWFzZSB1c2UgLnN0YXJ0KCkgaW5zdGVhZCIpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXNldCgpIHsKICAgICAgICB0aGlzLnBhdXNlKCk7CiAgICAgICAgdGhpcy5zdGFydGVkQXQgPSBudWxsOwogICAgICAgIHRoaXMucGF1c2VkQXQgPSBudWxsOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR0aW1lQDQuMi4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHRpbWUvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzOCA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHM4LCB7CiAgQ3JvbkpvYjogKCkgPT4gQ3JvbkpvYjIsCiAgQ3Jvbk1hbmFnZXI6ICgpID0+IENyb25NYW5hZ2VyMiwKICBFeHRlbmRlZERhdGU6ICgpID0+IEV4dGVuZGVkRGF0ZTIsCiAgSHJ0TWVhc3VyZW1lbnQ6ICgpID0+IEhydE1lYXN1cmVtZW50MiwKICBJbnRlcnZhbDogKCkgPT4gSW50ZXJ2YWwyLAogIFRpbWVTdGFtcDogKCkgPT4gVGltZVN0YW1wMiwKICBUaW1lcjogKCkgPT4gVGltZXIyLAogIGdldE1pbGxpU2Vjb25kc0FzSHVtYW5SZWFkYWJsZUFnb1RpbWU6ICgpID0+IGdldE1pbGxpU2Vjb25kc0FzSHVtYW5SZWFkYWJsZUFnb1RpbWUyLAogIGdldE1pbGxpU2Vjb25kc0FzSHVtYW5SZWFkYWJsZVN0cmluZzogKCkgPT4gZ2V0TWlsbGlTZWNvbmRzQXNIdW1hblJlYWRhYmxlU3RyaW5nMiwKICBnZXRNaWxsaVNlY29uZHNGcm9tVW5pdHM6ICgpID0+IGdldE1pbGxpU2Vjb25kc0Zyb21Vbml0czIsCiAgdW5pdHM6ICgpID0+IHVuaXRzMgp9KTsKdmFyIGluaXRfZGlzdF90czggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHRpbWVANC4yLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dGltZS9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfY3Jvbm1hbmFnZXIyKCk7CiAgICBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX2Nyb25qb2IyKCk7CiAgICBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX2V4dGVuZGVkZGF0ZTIoKTsKICAgIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfaHJ0bWVhc3VyZW1lbnQyKCk7CiAgICBpbml0X3NtYXJ0dGltZV9jbGFzc2VzX2ludGVydmFsMigpOwogICAgaW5pdF9zbWFydHRpbWVfY2xhc3Nlc190aW1lcjIoKTsKICAgIGluaXRfc21hcnR0aW1lX2NsYXNzZXNfdGltZXN0YW1wMigpOwogICAgaW5pdF9zbWFydHRpbWVfdW5pdHMyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4zLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMucGx1Z2lucy5qcwp2YXIgaW1wb3J0X3N5bWJvbF90cmVlMjsKdmFyIGluaXRfY2xhc3Nlc19wbHVnaW5zMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjMuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5wbHVnaW5zLmpzIigpIHsKICAgIGluaXRfZGlzdF90czMoKTsKICAgIGluaXRfZGlzdF90czUoKTsKICAgIGluaXRfZGlzdF90cygpOwogICAgaW5pdF9kaXN0X3RzMigpOwogICAgaW5pdF9kaXN0X3RzOCgpOwogICAgaW1wb3J0X3N5bWJvbF90cmVlMiA9IF9fdG9FU00ocmVxdWlyZV9TeW1ib2xUcmVlKCksIDEpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMy4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLmFzeW5jZXhlY3V0aW9uc3RhY2suanMKdmFyIEFzeW5jRXhlY3V0aW9uU3RhY2syOwp2YXIgaW5pdF9jbGFzc2VzX2FzeW5jZXhlY3V0aW9uc3RhY2syID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMy4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLmFzeW5jZXhlY3V0aW9uc3RhY2suanMiKCkgewogICAgaW5pdF9jbGFzc2VzX3BsdWdpbnMyKCk7CiAgICBBc3luY0V4ZWN1dGlvblN0YWNrMiA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5leGVjdXRpb25TbG90cyA9IFtdOwogICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5ub25FeGNsdXNpdmVNYXhDb25jdXJyZW5jeSA9IEluZmluaXR5OwogICAgICAgIHRoaXMubm9uRXhjbHVzaXZlQ3VycmVudENvdW50ID0gMDsKICAgICAgICB0aGlzLm5vbkV4Y2x1c2l2ZVBlbmRpbmdRdWV1ZSA9IFtdOwogICAgICB9CiAgICAgIGFzeW5jIGdldEV4Y2x1c2l2ZUV4ZWN1dGlvblNsb3QoZnVuY0FyZywgdGltZW91dEFyZykgewogICAgICAgIGNvbnN0IGV4ZWN1dGlvbkRlZmVycmVkID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICAgICAgY29uc3QgZXhlY3V0aW9uU2xvdCA9IHsKICAgICAgICAgIGZ1bmNUb0V4ZWN1dGU6IGZ1bmNBcmcsCiAgICAgICAgICBleGVjdXRpb25EZWZlcnJlZCwKICAgICAgICAgIHRpbWVvdXQ6IHRpbWVvdXRBcmcsCiAgICAgICAgICBtb2RlOiAiZXhjbHVzaXZlIgogICAgICAgIH07CiAgICAgICAgdGhpcy5leGVjdXRpb25TbG90cy5wdXNoKGV4ZWN1dGlvblNsb3QpOwogICAgICAgIHRoaXMucHJvY2Vzc0V4ZWN1dGlvblNsb3RzKCk7CiAgICAgICAgcmV0dXJuIGV4ZWN1dGlvbkRlZmVycmVkLnByb21pc2U7CiAgICAgIH0KICAgICAgYXN5bmMgZ2V0Tm9uRXhjbHVzaXZlRXhlY3V0aW9uU2xvdChmdW5jQXJnLCB0aW1lb3V0QXJnKSB7CiAgICAgICAgY29uc3QgZXhlY3V0aW9uRGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgICAgICBjb25zdCBleGVjdXRpb25TbG90ID0gewogICAgICAgICAgZnVuY1RvRXhlY3V0ZTogZnVuY0FyZywKICAgICAgICAgIGV4ZWN1dGlvbkRlZmVycmVkLAogICAgICAgICAgdGltZW91dDogdGltZW91dEFyZywKICAgICAgICAgIG1vZGU6ICJub25leGNsdXNpdmUiCiAgICAgICAgfTsKICAgICAgICB0aGlzLmV4ZWN1dGlvblNsb3RzLnB1c2goZXhlY3V0aW9uU2xvdCk7CiAgICAgICAgdGhpcy5wcm9jZXNzRXhlY3V0aW9uU2xvdHMoKTsKICAgICAgICByZXR1cm4gZXhlY3V0aW9uRGVmZXJyZWQucHJvbWlzZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IG5vbi1leGNsdXNpdmUgdGFza3MuCiAgICAgICAqIEBwYXJhbSBjb25jdXJyZW5jeSBtaW5pbXVtIDEgKEluZmluaXR5IG1lYW5zIHVubGltaXRlZCkKICAgICAgICovCiAgICAgIHNldE5vbkV4Y2x1c2l2ZU1heENvbmN1cnJlbmN5KGNvbmN1cnJlbmN5KSB7CiAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoY29uY3VycmVuY3kpIHx8IGNvbmN1cnJlbmN5IDwgMSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJub25FeGNsdXNpdmVNYXhDb25jdXJyZW5jeSBtdXN0IGJlIGEgZmluaXRlIG51bWJlciA+PSAxIik7CiAgICAgICAgfQogICAgICAgIHRoaXMubm9uRXhjbHVzaXZlTWF4Q29uY3VycmVuY3kgPSBjb25jdXJyZW5jeTsKICAgICAgfQogICAgICAvKiogR2V0IHRoZSBjb25maWd1cmVkIG1heCBjb25jdXJyZW5jeSBmb3Igbm9uLWV4Y2x1c2l2ZSB0YXNrcyAqLwogICAgICBnZXROb25FeGNsdXNpdmVNYXhDb25jdXJyZW5jeSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub25FeGNsdXNpdmVNYXhDb25jdXJyZW5jeTsKICAgICAgfQogICAgICAvKiogTnVtYmVyIG9mIG5vbi1leGNsdXNpdmUgdGFza3MgY3VycmVudGx5IHJ1bm5pbmcgKi8KICAgICAgZ2V0QWN0aXZlTm9uRXhjbHVzaXZlQ291bnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubm9uRXhjbHVzaXZlQ3VycmVudENvdW50OwogICAgICB9CiAgICAgIC8qKiBOdW1iZXIgb2Ygbm9uLWV4Y2x1c2l2ZSB0YXNrcyB3YWl0aW5nIGZvciBhIGZyZWUgc2xvdCAqLwogICAgICBnZXRQZW5kaW5nTm9uRXhjbHVzaXZlQ291bnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubm9uRXhjbHVzaXZlUGVuZGluZ1F1ZXVlLmxlbmd0aDsKICAgICAgfQogICAgICBhc3luYyBwcm9jZXNzRXhlY3V0aW9uU2xvdHMoKSB7CiAgICAgICAgaWYgKHRoaXMuaXNQcm9jZXNzaW5nKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gdHJ1ZTsKICAgICAgICB3aGlsZSAodGhpcy5leGVjdXRpb25TbG90cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICBjb25zdCBjdXJyZW50U2xvdCA9IHRoaXMuZXhlY3V0aW9uU2xvdHNbMF07CiAgICAgICAgICBpZiAoY3VycmVudFNsb3QubW9kZSA9PT0gImV4Y2x1c2l2ZSIpIHsKICAgICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlRXhjbHVzaXZlU2xvdChjdXJyZW50U2xvdCk7CiAgICAgICAgICAgIHRoaXMuZXhlY3V0aW9uU2xvdHMuc2hpZnQoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IG5vbkV4Y2x1c2l2ZVNsb3RzID0gW107CiAgICAgICAgICAgIHdoaWxlICh0aGlzLmV4ZWN1dGlvblNsb3RzLmxlbmd0aCA+IDAgJiYgdGhpcy5leGVjdXRpb25TbG90c1swXS5tb2RlID09PSAibm9uZXhjbHVzaXZlIikgewogICAgICAgICAgICAgIG5vbkV4Y2x1c2l2ZVNsb3RzLnB1c2godGhpcy5leGVjdXRpb25TbG90cy5zaGlmdCgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVOb25FeGNsdXNpdmVTbG90cyhub25FeGNsdXNpdmVTbG90cyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7CiAgICAgIH0KICAgICAgYXN5bmMgZXhlY3V0ZUV4Y2x1c2l2ZVNsb3Qoc2xvdCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAoc2xvdC50aW1lb3V0KSB7CiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRJbnN0YW5jZSA9IG5ldyBkaXN0X3RzX2V4cG9ydHMzLlRpbWVvdXQoc2xvdC50aW1lb3V0KTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoWwogICAgICAgICAgICAgICAgc2xvdC5mdW5jVG9FeGVjdXRlKCksCiAgICAgICAgICAgICAgICB0aW1lb3V0SW5zdGFuY2UucHJvbWlzZS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaW1lb3V0IHJlYWNoZWQiKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgdGltZW91dEluc3RhbmNlLmNhbmNlbCgpOwogICAgICAgICAgICAgIHNsb3QuZXhlY3V0aW9uRGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpOwogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgIHRpbWVvdXRJbnN0YW5jZS5jYW5jZWwoKTsKICAgICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2xvdC5mdW5jVG9FeGVjdXRlKCk7CiAgICAgICAgICAgIHNsb3QuZXhlY3V0aW9uRGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICBzbG90LmV4ZWN1dGlvbkRlZmVycmVkLnJlamVjdChlcnJvcik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIGV4ZWN1dGVOb25FeGNsdXNpdmVTbG90cyhzbG90cykgewogICAgICAgIGNvbnN0IHByb21pc2VzID0gc2xvdHMubWFwKGFzeW5jIChzbG90KSA9PiB7CiAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JOb25FeGNsdXNpdmVTbG90KCk7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoc2xvdC50aW1lb3V0KSB7CiAgICAgICAgICAgICAgY29uc3QgdGltZW91dEluc3RhbmNlID0gbmV3IGRpc3RfdHNfZXhwb3J0czMuVGltZW91dChzbG90LnRpbWVvdXQpOwogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoWwogICAgICAgICAgICAgICAgICBzbG90LmZ1bmNUb0V4ZWN1dGUoKSwKICAgICAgICAgICAgICAgICAgdGltZW91dEluc3RhbmNlLnByb21pc2UudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaW1lb3V0IHJlYWNoZWQiKTsKICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgdGltZW91dEluc3RhbmNlLmNhbmNlbCgpOwogICAgICAgICAgICAgICAgc2xvdC5leGVjdXRpb25EZWZlcnJlZC5yZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIHRpbWVvdXRJbnN0YW5jZS5jYW5jZWwoKTsKICAgICAgICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzbG90LmZ1bmNUb0V4ZWN1dGUoKTsKICAgICAgICAgICAgICBzbG90LmV4ZWN1dGlvbkRlZmVycmVkLnJlc29sdmUocmVzdWx0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgc2xvdC5leGVjdXRpb25EZWZlcnJlZC5yZWplY3QoZXJyb3IpOwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgdGhpcy5yZWxlYXNlTm9uRXhjbHVzaXZlU2xvdCgpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogV2FpdCB1bnRpbCBhIG5vbi1leGNsdXNpdmUgc2xvdCBpcyBhdmFpbGFibGUgKHJlc3BlY3RzIG1heCBjb25jdXJyZW5jeSkuCiAgICAgICAqLwogICAgICB3YWl0Rm9yTm9uRXhjbHVzaXZlU2xvdCgpIHsKICAgICAgICBpZiAodGhpcy5ub25FeGNsdXNpdmVDdXJyZW50Q291bnQgPCB0aGlzLm5vbkV4Y2x1c2l2ZU1heENvbmN1cnJlbmN5KSB7CiAgICAgICAgICB0aGlzLm5vbkV4Y2x1c2l2ZUN1cnJlbnRDb3VudCsrOwogICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiB7CiAgICAgICAgICB0aGlzLm5vbkV4Y2x1c2l2ZVBlbmRpbmdRdWV1ZS5wdXNoKCgpID0+IHsKICAgICAgICAgICAgdGhpcy5ub25FeGNsdXNpdmVDdXJyZW50Q291bnQrKzsKICAgICAgICAgICAgcmVzb2x2ZTIoKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIC8qKiBSZWxlYXNlIGEgbm9uLWV4Y2x1c2l2ZSBzbG90IGFuZCB3YWtlIHRoZSBuZXh0IHdhaXRlciwgaWYgYW55LiAqLwogICAgICByZWxlYXNlTm9uRXhjbHVzaXZlU2xvdCgpIHsKICAgICAgICB0aGlzLm5vbkV4Y2x1c2l2ZUN1cnJlbnRDb3VudC0tOwogICAgICAgIGNvbnN0IG5leHQyID0gdGhpcy5ub25FeGNsdXNpdmVQZW5kaW5nUXVldWUuc2hpZnQoKTsKICAgICAgICBpZiAobmV4dDIpIHsKICAgICAgICAgIG5leHQyKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMy4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLmJhY2twcmVzc3VyZWRhcnJheS5qcwp2YXIgQmFja3ByZXNzdXJlZEFycmF5MjsKdmFyIGluaXRfY2xhc3Nlc19iYWNrcHJlc3N1cmVkYXJyYXkyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMy4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLmJhY2twcmVzc3VyZWRhcnJheS5qcyIoKSB7CiAgICBpbml0X2NsYXNzZXNfcGx1Z2luczIoKTsKICAgIEJhY2twcmVzc3VyZWRBcnJheTIgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKGhpZ2hXYXRlck1hcmsgPSAxNikgewogICAgICAgIHRoaXMuaGFzU3BhY2UgPSBuZXcgZGlzdF90c19leHBvcnRzMi5yeGpzLlN1YmplY3QoKTsKICAgICAgICB0aGlzLml0ZW1zQXZhaWxhYmxlID0gbmV3IGRpc3RfdHNfZXhwb3J0czIucnhqcy5TdWJqZWN0KCk7CiAgICAgICAgdGhpcy5pc0Rlc3Ryb3llZCA9IGZhbHNlOwogICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgIHRoaXMuaGlnaFdhdGVyTWFyayA9IGhpZ2hXYXRlck1hcms7CiAgICAgIH0KICAgICAgcHVzaChpdGVtKSB7CiAgICAgICAgdGhpcy5kYXRhLnB1c2goaXRlbSk7CiAgICAgICAgdGhpcy5pdGVtc0F2YWlsYWJsZS5uZXh0KCJpdGVtc0F2YWlsYWJsZSIpOwogICAgICAgIGNvbnN0IHNwYWNlQXZhaWxhYmxlID0gdGhpcy5jaGVja1NwYWNlQXZhaWxhYmxlKCk7CiAgICAgICAgaWYgKHNwYWNlQXZhaWxhYmxlKSB7CiAgICAgICAgICB0aGlzLmhhc1NwYWNlLm5leHQoImhhc1NwYWNlIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcGFjZUF2YWlsYWJsZTsKICAgICAgfQogICAgICBzaGlmdCgpIHsKICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5kYXRhLnNoaWZ0KCk7CiAgICAgICAgaWYgKHRoaXMuY2hlY2tTcGFjZUF2YWlsYWJsZSgpKSB7CiAgICAgICAgICB0aGlzLmhhc1NwYWNlLm5leHQoImhhc1NwYWNlIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpdGVtOwogICAgICB9CiAgICAgIGNoZWNrU3BhY2VBdmFpbGFibGUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5sZW5ndGggPCB0aGlzLmhpZ2hXYXRlck1hcms7CiAgICAgIH0KICAgICAgY2hlY2tIYXNJdGVtcygpIHsKICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aCA+IDA7CiAgICAgIH0KICAgICAgd2FpdEZvclNwYWNlKCkgewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHsKICAgICAgICAgIGlmICh0aGlzLmNoZWNrU3BhY2VBdmFpbGFibGUoKSB8fCB0aGlzLmlzRGVzdHJveWVkKSB7CiAgICAgICAgICAgIHJlc29sdmUyKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLmhhc1NwYWNlLnN1YnNjcmliZSh7CiAgICAgICAgICAgICAgbmV4dDogKCkgPT4gewogICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICByZXNvbHZlMigpOwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHsKICAgICAgICAgICAgICAgIHJlc29sdmUyKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICB3YWl0Rm9ySXRlbXMoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlMikgPT4gewogICAgICAgICAgaWYgKHRoaXMuZGF0YS5sZW5ndGggPiAwIHx8IHRoaXMuaXNEZXN0cm95ZWQpIHsKICAgICAgICAgICAgcmVzb2x2ZTIoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuaXRlbXNBdmFpbGFibGUuc3Vic2NyaWJlKHsKICAgICAgICAgICAgICBuZXh0OiAoKSA9PiB7CiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgIHJlc29sdmUyKCk7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBjb21wbGV0ZTogKCkgPT4gewogICAgICAgICAgICAgICAgcmVzb2x2ZTIoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBkZXN0cm95cyB0aGUgQmFja3ByZXNzdXJlZEFycmF5LCBjb21wbGV0aW5nIGFsbCBzdWJqZWN0cwogICAgICAgKi8KICAgICAgZGVzdHJveSgpIHsKICAgICAgICB0aGlzLmlzRGVzdHJveWVkID0gdHJ1ZTsKICAgICAgICB0aGlzLmhhc1NwYWNlLmNvbXBsZXRlKCk7CiAgICAgICAgdGhpcy5pdGVtc0F2YWlsYWJsZS5jb21wbGV0ZSgpOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMy4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLmZhc3RtYXAuanMKdmFyIEZhc3RNYXAyOwp2YXIgaW5pdF9jbGFzc2VzX2Zhc3RtYXAyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMy4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLmZhc3RtYXAuanMiKCkgewogICAgaW5pdF9jbGFzc2VzX3BsdWdpbnMyKCk7CiAgICBGYXN0TWFwMiA9IGNsYXNzIF9GYXN0TWFwIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5tYXBPYmplY3QgPSB7fTsKICAgICAgfQogICAgICBpc1VuaXF1ZUtleShrZXlBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5tYXBPYmplY3Rba2V5QXJnXSA/IGZhbHNlIDogdHJ1ZTsKICAgICAgfQogICAgICBhZGRUb01hcChrZXlBcmcsIG9iamVjdEFyZywgb3B0aW9uc0FyZykgewogICAgICAgIGlmICh0aGlzLmlzVW5pcXVlS2V5KGtleUFyZykgfHwgb3B0aW9uc0FyZyAmJiBvcHRpb25zQXJnLmZvcmNlKSB7CiAgICAgICAgICB0aGlzLm1hcE9iamVjdFtrZXlBcmddID0gb2JqZWN0QXJnOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZ2V0QnlLZXkoa2V5QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWFwT2JqZWN0W2tleUFyZ107CiAgICAgIH0KICAgICAgcmVtb3ZlRnJvbU1hcChrZXlBcmcpIHsKICAgICAgICBjb25zdCByZW1vdmVkSXRlbSA9IHRoaXMuZ2V0QnlLZXkoa2V5QXJnKTsKICAgICAgICBkZWxldGUgdGhpcy5tYXBPYmplY3Rba2V5QXJnXTsKICAgICAgICByZXR1cm4gcmVtb3ZlZEl0ZW07CiAgICAgIH0KICAgICAgZ2V0S2V5cygpIHsKICAgICAgICBjb25zdCBrZXlzMiA9IFtdOwogICAgICAgIGZvciAoY29uc3Qga2V5QXJnIGluIHRoaXMubWFwT2JqZWN0KSB7CiAgICAgICAgICBpZiAodGhpcy5tYXBPYmplY3Rba2V5QXJnXSkgewogICAgICAgICAgICBrZXlzMi5wdXNoKGtleUFyZyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBrZXlzMjsKICAgICAgfQogICAgICBjbGVhbigpIHsKICAgICAgICB0aGlzLm1hcE9iamVjdCA9IHt9OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiByZXR1cm5zIGEgbmV3IEZhc3RtYXAgdGhhdCBpbmNsdWRlcyBhbGwgdmFsdWVzIGZyb20gdGhpcyBhbmQgYWxsIGZyb20gdGhlIGZhc3RtYXAgaW4gdGhlIGFyZ3VtZW50CiAgICAgICAqLwogICAgICBjb25jYXQoZmFzdE1hcEFyZykgewogICAgICAgIGNvbnN0IGNvbmNhdGVkRmFzdG1hcCA9IG5ldyBfRmFzdE1hcCgpOwogICAgICAgIGZvciAoY29uc3Qga2V5MiBvZiB0aGlzLmdldEtleXMoKSkgewogICAgICAgICAgY29uY2F0ZWRGYXN0bWFwLmFkZFRvTWFwKGtleTIsIHRoaXMuZ2V0QnlLZXkoa2V5MikpOwogICAgICAgIH0KICAgICAgICBmb3IgKGNvbnN0IGtleTIgb2YgZmFzdE1hcEFyZy5nZXRLZXlzKCkpIHsKICAgICAgICAgIGNvbmNhdGVkRmFzdG1hcC5hZGRUb01hcChrZXkyLCBmYXN0TWFwQXJnLmdldEJ5S2V5KGtleTIpLCB7CiAgICAgICAgICAgIGZvcmNlOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbmNhdGVkRmFzdG1hcDsKICAgICAgfQogICAgICAvKioKICAgICAgICogdHJpZXMgdG8gbWVyZ2UgYW5vdGhlciBGYXN0bWFwCiAgICAgICAqIE5vdGU6IHVuaXF1ZUtleUNvbGxpc2lvbnMgd2lsbCBjYXVzZSBvdmVyd3JpdGUKICAgICAgICogQHBhcmFtIGZhc3RNYXBBcmcKICAgICAgICovCiAgICAgIGFkZEFsbEZyb21PdGhlcihmYXN0TWFwQXJnKSB7CiAgICAgICAgZm9yIChjb25zdCBrZXkyIG9mIGZhc3RNYXBBcmcuZ2V0S2V5cygpKSB7CiAgICAgICAgICB0aGlzLmFkZFRvTWFwKGtleTIsIGZhc3RNYXBBcmcuZ2V0QnlLZXkoa2V5MiksIHsKICAgICAgICAgICAgZm9yY2U6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBhc3luYyBmaW5kKGZpbmRGdW5jdGlvbkFyZykgewogICAgICAgIGZvciAoY29uc3Qga2V5MiBvZiB0aGlzLmdldEtleXMoKSkgewogICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0QnlLZXkoa2V5Mik7CiAgICAgICAgICBjb25zdCBmaW5kRnVuY3Rpb25SZXN1bHQgPSBhd2FpdCBmaW5kRnVuY3Rpb25BcmcoaXRlbSk7CiAgICAgICAgICBpZiAoZmluZEZ1bmN0aW9uUmVzdWx0KSB7CiAgICAgICAgICAgIHJldHVybiBpdGVtOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjMuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5vYmplY3RtYXAuanMKdmFyIHVuaTIsIE9iamVjdE1hcDI7CnZhciBpbml0X2NsYXNzZXNfb2JqZWN0bWFwMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjMuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5vYmplY3RtYXAuanMiKCkgewogICAgaW5pdF9jbGFzc2VzX3BsdWdpbnMyKCk7CiAgICBpbml0X2NsYXNzZXNfZmFzdG1hcDIoKTsKICAgIHVuaTIgPSAocHJlZml4NCA9ICJ1bmkiKSA9PiB7CiAgICAgIHJldHVybiBgJHtwcmVmaXg0fXh4eHh4eHh4eHh4YC5yZXBsYWNlKC9beHldL2csIChjMTEpID0+IHsKICAgICAgICBjb25zdCByMTEgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwOwogICAgICAgIGNvbnN0IHY2ID0gYzExID09PSAieCIgPyByMTEgOiByMTEgJiAzIHwgODsKICAgICAgICByZXR1cm4gdjYudG9TdHJpbmcoMTYpOwogICAgICB9KTsKICAgIH07CiAgICBPYmplY3RNYXAyID0gY2xhc3MgX09iamVjdE1hcCB7CiAgICAgIC8qKgogICAgICAgKiByZXR1cm5zIGEgbmV3IGluc3RhbmNlCiAgICAgICAqLwogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLmZhc3RNYXAgPSBuZXcgRmFzdE1hcDIoKTsKICAgICAgICB0aGlzLmV2ZW50U3ViamVjdCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMyLnJ4anMuU3ViamVjdCgpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBhZGRzIGFuIG9iamVjdCBtYXBwZWQgdG8gYSBzdHJpbmcKICAgICAgICogdGhlIHN0cmluZyBtdXN0IGJlIHVuaXF1ZQogICAgICAgKi8KICAgICAgYWRkTWFwcGVkVW5pcXVlKHVuaXF1ZUtleUFyZywgb2JqZWN0QXJnKSB7CiAgICAgICAgdGhpcy5mYXN0TWFwLmFkZFRvTWFwKHVuaXF1ZUtleUFyZywgb2JqZWN0QXJnKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogZmFzdGVzdCB3YXkgdG8gZ2V0IGFuIG9iamVjdCBmcm9tIHRoZSBtYXAKICAgICAgICogQHBhcmFtIHVuaXF1ZUtleQogICAgICAgKi8KICAgICAgZ2V0TWFwcGVkVW5pcXVlKHVuaXF1ZUtleUFyZykgewogICAgICAgIHJldHVybiB0aGlzLmZhc3RNYXAuZ2V0QnlLZXkodW5pcXVlS2V5QXJnKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogcmVtb3ZlIGtleQogICAgICAgKiBAcGFyYW0gZnVuY3Rpb25BcmcKICAgICAgICovCiAgICAgIHJlbW92ZU1hcHBlZFVuaXF1ZSh1bmlxdWVLZXkpIHsKICAgICAgICBjb25zdCBvYmplY3QgPSB0aGlzLmZhc3RNYXAucmVtb3ZlRnJvbU1hcCh1bmlxdWVLZXkpOwogICAgICAgIGlmIChvYmplY3QgIT09IHZvaWQgMCkgewogICAgICAgICAgdGhpcy5ldmVudFN1YmplY3QubmV4dCh7CiAgICAgICAgICAgIG9wZXJhdGlvbjogInJlbW92ZSIsCiAgICAgICAgICAgIHBheWxvYWQ6IG9iamVjdAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGFkZCBvYmplY3QgdG8gT2JqZWN0bWFwCiAgICAgICAqIHJldHVybnMgZmFsc2UgaWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGluIHRoZSBtYXAKICAgICAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3Qgd2FzIGFkZGVkIHN1Y2Nlc3NmdWxseQogICAgICAgKi8KICAgICAgYWRkKG9iamVjdEFyZykgewogICAgICAgIGZvciAoY29uc3Qga2V5QXJnIG9mIHRoaXMuZmFzdE1hcC5nZXRLZXlzKCkpIHsKICAgICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMuZmFzdE1hcC5nZXRCeUtleShrZXlBcmcpOwogICAgICAgICAgaWYgKG9iamVjdCA9PT0gb2JqZWN0QXJnKSB7CiAgICAgICAgICAgIHJldHVybiBrZXlBcmc7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHVuaXF1ZUtleSA9IHVuaTIoImtleSIpOwogICAgICAgIHRoaXMuYWRkTWFwcGVkVW5pcXVlKHVuaXF1ZUtleSwgb2JqZWN0QXJnKTsKICAgICAgICB0aGlzLmV2ZW50U3ViamVjdC5uZXh0KHsKICAgICAgICAgIG9wZXJhdGlvbjogImFkZCIsCiAgICAgICAgICBwYXlsb2FkOiBvYmplY3RBcmcKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdW5pcXVlS2V5OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBsaWtlIC5hZGQgYnV0IGFkZHMgYW4gd2hvbGUgYXJyYXkgb2Ygb2JqZWN0cwogICAgICAgKi8KICAgICAgYWRkQXJyYXkob2JqZWN0QXJyYXlBcmcpIHsKICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygb2JqZWN0QXJyYXlBcmcpIHsKICAgICAgICAgIHRoaXMuYWRkKGl0ZW0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogY2hlY2sgaWYgb2JqZWN0IGlzIGluIE9iamVjdG1hcAogICAgICAgKi8KICAgICAgY2hlY2tGb3JPYmplY3Qob2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuICEhdGhpcy5nZXRLZXlGb3JPYmplY3Qob2JqZWN0QXJnKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogZ2V0IGtleSBmb3Igb2JqZWN0CiAgICAgICAqIEBwYXJhbSBmaW5kRnVuY3Rpb24KICAgICAgICovCiAgICAgIGdldEtleUZvck9iamVjdChvYmplY3RBcmcpIHsKICAgICAgICBsZXQgZm91bmRLZXkgPSBudWxsOwogICAgICAgIGZvciAoY29uc3Qga2V5QXJnIG9mIHRoaXMuZmFzdE1hcC5nZXRLZXlzKCkpIHsKICAgICAgICAgIGlmICghZm91bmRLZXkgJiYgdGhpcy5mYXN0TWFwLmdldEJ5S2V5KGtleUFyZykgPT09IG9iamVjdEFyZykgewogICAgICAgICAgICBmb3VuZEtleSA9IGtleUFyZzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZm91bmRLZXk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGZpbmQgb2JqZWN0CiAgICAgICAqLwogICAgICBhc3luYyBmaW5kKGZpbmRGdW5jdGlvbikgewogICAgICAgIHJldHVybiB0aGlzLmZhc3RNYXAuZmluZChmaW5kRnVuY3Rpb24pOwogICAgICB9CiAgICAgIGZpbmRTeW5jKGZpbmRGdW5jdGlvbikgewogICAgICAgIGZvciAoY29uc3Qga2V5QXJnIG9mIHRoaXMuZmFzdE1hcC5nZXRLZXlzKCkpIHsKICAgICAgICAgIGlmIChmaW5kRnVuY3Rpb24odGhpcy5mYXN0TWFwLmdldEJ5S2V5KGtleUFyZykpKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldE1hcHBlZFVuaXF1ZShrZXlBcmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogZmluZHMgYSBzcGVjaWZpYyBlbGVtZW50IGFuZCB0aGVuIHJlbW92ZXMgaXQKICAgICAgICovCiAgICAgIGFzeW5jIGZpbmRPbmVBbmRSZW1vdmUoZmluZEZ1bmN0aW9uKSB7CiAgICAgICAgY29uc3QgZm91bmRFbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kKGZpbmRGdW5jdGlvbik7CiAgICAgICAgaWYgKGZvdW5kRWxlbWVudCkgewogICAgICAgICAgdGhpcy5yZW1vdmUoZm91bmRFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZvdW5kRWxlbWVudDsKICAgICAgfQogICAgICBmaW5kT25lQW5kUmVtb3ZlU3luYyhmaW5kRnVuY3Rpb24pIHsKICAgICAgICBjb25zdCBmb3VuZEVsZW1lbnQgPSB0aGlzLmZpbmRTeW5jKGZpbmRGdW5jdGlvbik7CiAgICAgICAgaWYgKGZvdW5kRWxlbWVudCkgewogICAgICAgICAgdGhpcy5yZW1vdmUoZm91bmRFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZvdW5kRWxlbWVudDsKICAgICAgfQogICAgICAvKioKICAgICAgICogcnVuIGZ1bmN0aW9uIGZvciBlYWNoIGl0ZW0gaW4gT2JqZWN0bWFwCiAgICAgICAqLwogICAgICBhc3luYyBmb3JFYWNoKGZ1bmN0aW9uQXJnKSB7CiAgICAgICAgZm9yIChjb25zdCBrZXlBcmcgb2YgdGhpcy5mYXN0TWFwLmdldEtleXMoKSkgewogICAgICAgICAgYXdhaXQgZnVuY3Rpb25BcmcodGhpcy5mYXN0TWFwLmdldEJ5S2V5KGtleUFyZykpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogZ2V0cyBhbiBvYmplY3QgaW4gdGhlIE9ic2VydmFibGVtYXAgYW5kIHJlbW92ZXMgaXQsIHNvIGl0IGNhbid0IGJlIHJldHJpZXZlZCBhZ2FpbgogICAgICAgKi8KICAgICAgZ2V0T25lQW5kUmVtb3ZlKCkgewogICAgICAgIGNvbnN0IGtleXMyID0gdGhpcy5mYXN0TWFwLmdldEtleXMoKTsKICAgICAgICBpZiAoa2V5czIubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3Qga2V5VG9Vc2UgPSBrZXlzMlswXTsKICAgICAgICAgIGNvbnN0IHJlbW92ZWRJdGVtID0gdGhpcy5mYXN0TWFwLnJlbW92ZUZyb21NYXAoa2V5VG9Vc2UpOwogICAgICAgICAgdGhpcy5ldmVudFN1YmplY3QubmV4dCh7CiAgICAgICAgICAgIG9wZXJhdGlvbjogInJlbW92ZSIsCiAgICAgICAgICAgIHBheWxvYWQ6IHJlbW92ZWRJdGVtCiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybiByZW1vdmVkSXRlbTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHJldHVybnMgYSBjbG9uZWQgYXJyYXkgb2YgYWxsIHRoZSBvYmplY3RzIGN1cnJlbnRseSBpbiB0aGUgT2JqZWN0bWFwCiAgICAgICAqLwogICAgICBnZXRBcnJheSgpIHsKICAgICAgICBjb25zdCByZXR1cm5BcnJheSA9IFtdOwogICAgICAgIGZvciAoY29uc3Qga2V5QXJnIG9mIHRoaXMuZmFzdE1hcC5nZXRLZXlzKCkpIHsKICAgICAgICAgIHJldHVybkFycmF5LnB1c2godGhpcy5mYXN0TWFwLmdldEJ5S2V5KGtleUFyZykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0dXJuQXJyYXk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNoZWNrIGlmIE9iamVjdG1hcCBpc3QgZW1wdHkKICAgICAgICovCiAgICAgIGlzRW1wdHkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZmFzdE1hcC5nZXRLZXlzKCkubGVuZ3RoID09PSAwOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiByZW1vdmUgb2JqZWN0IGZyb20gT2JqZWN0bWFwCiAgICAgICAqLwogICAgICByZW1vdmUob2JqZWN0QXJnKSB7CiAgICAgICAgaWYgKHRoaXMuY2hlY2tGb3JPYmplY3Qob2JqZWN0QXJnKSkgewogICAgICAgICAgY29uc3Qga2V5QXJnID0gdGhpcy5nZXRLZXlGb3JPYmplY3Qob2JqZWN0QXJnKTsKICAgICAgICAgIGNvbnN0IHJlbW92ZWRPYmplY3QgPSB0aGlzLmZhc3RNYXAucmVtb3ZlRnJvbU1hcChrZXlBcmcpOwogICAgICAgICAgdGhpcy5ldmVudFN1YmplY3QubmV4dCh7CiAgICAgICAgICAgIG9wZXJhdGlvbjogInJlbW92ZSIsCiAgICAgICAgICAgIHBheWxvYWQ6IHJlbW92ZWRPYmplY3QKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIHJlbW92ZWRPYmplY3Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiB3aXBlIE9iamVjdG1hcAogICAgICAgKi8KICAgICAgd2lwZSgpIHsKICAgICAgICBjb25zdCBrZXlzMiA9IHRoaXMuZmFzdE1hcC5nZXRLZXlzKCk7CiAgICAgICAgZm9yIChjb25zdCBrZXlBcmcgb2Yga2V5czIpIHsKICAgICAgICAgIGNvbnN0IHJlbW92ZWRPYmplY3QgPSB0aGlzLmZhc3RNYXAucmVtb3ZlRnJvbU1hcChrZXlBcmcpOwogICAgICAgICAgdGhpcy5ldmVudFN1YmplY3QubmV4dCh7CiAgICAgICAgICAgIG9wZXJhdGlvbjogInJlbW92ZSIsCiAgICAgICAgICAgIHBheWxvYWQ6IHJlbW92ZWRPYmplY3QKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogcmV0dXJucyBhIG5ldyBPYmplY3RtYXAgdGhhdCBpbmNsdWRlcwogICAgICAgKi8KICAgICAgY29uY2F0KG9iamVjdE1hcEFyZykgewogICAgICAgIGNvbnN0IGNvbmNhdHRlZE9iamVjdE1hcCA9IG5ldyBfT2JqZWN0TWFwKCk7CiAgICAgICAgY29uY2F0dGVkT2JqZWN0TWFwLmZhc3RNYXAuYWRkQWxsRnJvbU90aGVyKHRoaXMuZmFzdE1hcCk7CiAgICAgICAgY29uY2F0dGVkT2JqZWN0TWFwLmZhc3RNYXAuYWRkQWxsRnJvbU90aGVyKG9iamVjdE1hcEFyZy5mYXN0TWFwKTsKICAgICAgICByZXR1cm4gY29uY2F0dGVkT2JqZWN0TWFwOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiB0cmllcyB0byBtZXJnZSBhbm90aGVyIE9iamVjdG1hcAogICAgICAgKiBOb3RlOiB1bmlxdWVLZXlDb2xsaXNpb25zIHdpbGwgY2F1c2Ugb3ZlcndyaXRlCiAgICAgICAqIEBwYXJhbSBvYmplY3RNYXBBcmcKICAgICAgICovCiAgICAgIGFkZEFsbEZyb21PdGhlcihvYmplY3RNYXBBcmcpIHsKICAgICAgICB0aGlzLmZhc3RNYXAuYWRkQWxsRnJvbU90aGVyKG9iamVjdE1hcEFyZy5mYXN0TWFwKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogZGVzdHJveXMgdGhlIE9iamVjdE1hcCwgY29tcGxldGluZyB0aGUgZXZlbnRTdWJqZWN0IGFuZCBjbGVhcmluZyBhbGwgZW50cmllcwogICAgICAgKi8KICAgICAgZGVzdHJveSgpIHsKICAgICAgICB0aGlzLndpcGUoKTsKICAgICAgICB0aGlzLmV2ZW50U3ViamVjdC5jb21wbGV0ZSgpOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMy4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLmludGVyZXN0bWFwLmludGVyZXN0LmpzCnZhciBJbnRlcmVzdDI7CnZhciBpbml0X2NsYXNzZXNfaW50ZXJlc3RtYXBfaW50ZXJlc3QyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMy4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9jbGFzc2VzLmludGVyZXN0bWFwLmludGVyZXN0LmpzIigpIHsKICAgIGluaXRfY2xhc3Nlc19wbHVnaW5zMigpOwogICAgaW5pdF9jbGFzc2VzX2ludGVyZXN0bWFwMigpOwogICAgSW50ZXJlc3QyID0gY2xhc3MgewogICAgICAvKioKICAgICAgICogcXVpY2sgYWNjZXNzIHRvIGEgc3RyaW5nIHRoYXQgbWFrZXMgdGhlIGludGVyZXN0IGNvbXBhcmFibGUgZm9yIGNoZWNraW5nIGZvciBzaW1pbGFyIGludGVyZXN0cwogICAgICAgKi8KICAgICAgZ2V0IGNvbXBhcmlzb25TdHJpbmcoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyaXNvbkZ1bmModGhpcy5vcmlnaW5hbEludGVyZXN0KTsKICAgICAgfQogICAgICAvKioKICAgICAgICogZnVsbGZpbGwgdGhlIGludGVyZXN0CiAgICAgICAqLwogICAgICBmdWxsZmlsbEludGVyZXN0KG9iamVjdEFyZykgewogICAgICAgIHRoaXMuaXNGdWxsZmlsbGVkID0gdHJ1ZTsKICAgICAgICB0aGlzLmZ1bGxmaWxsbWVudFN0b3JlID0gW107CiAgICAgICAgdGhpcy5pbnRlcmVzdERlZmVycmVkLnJlc29sdmUob2JqZWN0QXJnKTsKICAgICAgICB0aGlzLmRlc3Ryb3koKTsKICAgICAgfQogICAgICBjb25zdHJ1Y3RvcihpbnRlcmVzdE1hcEFyZywgaW50ZXJlc3RBcmcsIGNvbXBhcmlzb25GdW5jQXJnLCBvcHRpb25zQXJnKSB7CiAgICAgICAgdGhpcy5kZXN0cnVjdGlvblRpbWVyID0gbmV3IGRpc3RfdHNfZXhwb3J0czguVGltZXIoMWU0KTsKICAgICAgICB0aGlzLmlzRnVsbGZpbGxlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuaXNEZXN0cm95ZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLmZ1bGxmaWxsbWVudFN0b3JlID0gW107CiAgICAgICAgdGhpcy5tYXJrTG9zdFRpbWVvdXQgPSBudWxsOwogICAgICAgIHRoaXMuaW50ZXJlc3REZWZlcnJlZCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMuRGVmZXJyZWQoKTsKICAgICAgICB0aGlzLmludGVyZXN0RnVsbGZpbGxlZCA9IHRoaXMuaW50ZXJlc3REZWZlcnJlZC5wcm9taXNlOwogICAgICAgIHRoaXMuaW50ZXJlc3RNYXBSZWYgPSBpbnRlcmVzdE1hcEFyZzsKICAgICAgICB0aGlzLm9yaWdpbmFsSW50ZXJlc3QgPSBpbnRlcmVzdEFyZzsKICAgICAgICB0aGlzLmNvbXBhcmlzb25GdW5jID0gY29tcGFyaXNvbkZ1bmNBcmc7CiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc0FyZzsKICAgICAgICB0aGlzLmRlc3RydWN0aW9uVGltZXIuY29tcGxldGVkLnRoZW4oKCkgPT4gewogICAgICAgICAgaWYgKCF0aGlzLmlzRGVzdHJveWVkKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmICh0aGlzLm9wdGlvbnM/Lm1hcmtMb3N0QWZ0ZXJEZWZhdWx0KSB7CiAgICAgICAgICB0aGlzLm1hcmtMb3N0VGltZW91dCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMzLlRpbWVvdXQodGhpcy5vcHRpb25zLm1hcmtMb3N0QWZ0ZXJEZWZhdWx0KTsKICAgICAgICAgIHRoaXMubWFya0xvc3RUaW1lb3V0LnByb21pc2UudGhlbigoKSA9PiB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc0Rlc3Ryb3llZCkgewogICAgICAgICAgICAgIHRoaXMubWFya0xvc3QoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgLy8gTElGRUNZQ0xFIE1BTkFHRU1FTlQKICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAvKioKICAgICAgICogc2VsZiBkZXN0cnVjdHMgdGhlIGludGVyZXN0CiAgICAgICAqLwogICAgICBkZXN0cm95KCkgewogICAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuaXNEZXN0cm95ZWQgPSB0cnVlOwogICAgICAgIHRoaXMuZGVzdHJ1Y3Rpb25UaW1lci5yZXNldCgpOwogICAgICAgIGlmICh0aGlzLm1hcmtMb3N0VGltZW91dCkgewogICAgICAgICAgdGhpcy5tYXJrTG9zdFRpbWVvdXQuY2FuY2VsKCk7CiAgICAgICAgICB0aGlzLm1hcmtMb3N0VGltZW91dCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHRoaXMuZnVsbGZpbGxtZW50U3RvcmUgPSBbXTsKICAgICAgICB0aGlzLmludGVyZXN0TWFwUmVmLnJlbW92ZUludGVyZXN0KHRoaXMpOwogICAgICAgIGlmICghdGhpcy5pc0Z1bGxmaWxsZWQgJiYgdGhpcy5vcHRpb25zPy5kZWZhdWx0RnVsbGZpbGxtZW50KSB7CiAgICAgICAgICB0aGlzLmlzRnVsbGZpbGxlZCA9IHRydWU7CiAgICAgICAgICB0aGlzLmludGVyZXN0RGVmZXJyZWQucmVzb2x2ZSh0aGlzLm9wdGlvbnMuZGVmYXVsdEZ1bGxmaWxsbWVudCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBub3RpZmllcyB0aGUgaW50ZXJlc3QgdGhhdCB0aGUgaW50ZXJlc3QgaW4gaXQgaGFzIGJlZW4gbG9zdAogICAgICAgKi8KICAgICAgbWFya0xvc3QoKSB7CiAgICAgICAgdGhpcy5kZXN0cnVjdGlvblRpbWVyLnN0YXJ0KCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIG5vdGlmaWVzIHRoZSBpbnRlcmVzdCB0aGF0IHRoZSBpbnRlcmVzdCBpbiBpdCBoYXMgYmVlbiByZXN0b3JlZAogICAgICAgKi8KICAgICAgcmVuZXcoKSB7CiAgICAgICAgdGhpcy5kZXN0cnVjdGlvblRpbWVyLnJlc2V0KCk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4zLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMuaW50ZXJlc3RtYXAuanMKdmFyIEludGVyZXN0TWFwMjsKdmFyIGluaXRfY2xhc3Nlc19pbnRlcmVzdG1hcDIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4zLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMuaW50ZXJlc3RtYXAuanMiKCkgewogICAgaW5pdF9jbGFzc2VzX3BsdWdpbnMyKCk7CiAgICBpbml0X2NsYXNzZXNfb2JqZWN0bWFwMigpOwogICAgaW5pdF9jbGFzc2VzX2ludGVyZXN0bWFwX2ludGVyZXN0MigpOwogICAgSW50ZXJlc3RNYXAyID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3Rvcihjb21wYXJpc29uRnVuY0FyZywgb3B0aW9uc0FyZyA9IHt9KSB7CiAgICAgICAgdGhpcy5pbnRlcmVzdE9iamVjdE1hcCA9IG5ldyBPYmplY3RNYXAyKCk7CiAgICAgICAgdGhpcy5pbnRlcmVzdE9ic2VydmFibGUgPSBuZXcgZGlzdF90c19leHBvcnRzMi5PYnNlcnZhYmxlSW50YWtlKCk7CiAgICAgICAgdGhpcy5jb21wYXJpc29uRnVuYyA9IGNvbXBhcmlzb25GdW5jQXJnOwogICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNBcmc7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGFkZHMgYW4gaW50ZXJlc3QgdG8gdGhlIEludGVyZXN0TWFwCiAgICAgICAqIEBwYXJhbSBpbnRlcmVzdElkCiAgICAgICAqLwogICAgICBhc3luYyBhZGRJbnRlcmVzdChpbnRlcmVzdElkLCBkZWZhdWx0RnVsbGZpbGxtZW50QXJnKSB7CiAgICAgICAgY29uc3QgY29tcGFyaXNvblN0cmluZyA9IHRoaXMuY29tcGFyaXNvbkZ1bmMoaW50ZXJlc3RJZCk7CiAgICAgICAgbGV0IHJldHVybkludGVyZXN0OwogICAgICAgIGNvbnN0IG5ld0ludGVyZXN0ID0gbmV3IEludGVyZXN0Mih0aGlzLCBpbnRlcmVzdElkLCB0aGlzLmNvbXBhcmlzb25GdW5jLCB7CiAgICAgICAgICBtYXJrTG9zdEFmdGVyRGVmYXVsdDogdGhpcy5vcHRpb25zLm1hcmtMb3N0QWZ0ZXJEZWZhdWx0LAogICAgICAgICAgZGVmYXVsdEZ1bGxmaWxsbWVudDogZGVmYXVsdEZ1bGxmaWxsbWVudEFyZwogICAgICAgIH0pOwogICAgICAgIGxldCBpbnRlcmVzdEV4aXN0cyA9IGZhbHNlOwogICAgICAgIGF3YWl0IHRoaXMuaW50ZXJlc3RPYmplY3RNYXAuZm9yRWFjaCgoaW50ZXJlc3RBcmcpID0+IHsKICAgICAgICAgIGlmICghaW50ZXJlc3RFeGlzdHMgJiYgaW50ZXJlc3RBcmcuY29tcGFyaXNvblN0cmluZyA9PT0gbmV3SW50ZXJlc3QuY29tcGFyaXNvblN0cmluZykgewogICAgICAgICAgICBjb25zb2xlLmxvZygiaW5mbyIsIGBpbnRlcmVzdCBhbHJlYWR5IGV4aXN0cyBmb3IgJHtuZXdJbnRlcmVzdC5jb21wYXJpc29uU3RyaW5nfWApOwogICAgICAgICAgICBpbnRlcmVzdEV4aXN0cyA9IHRydWU7CiAgICAgICAgICAgIHJldHVybkludGVyZXN0ID0gaW50ZXJlc3RBcmc7CiAgICAgICAgICAgIHJldHVybkludGVyZXN0LnJlbmV3KCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKCFyZXR1cm5JbnRlcmVzdCkgewogICAgICAgICAgcmV0dXJuSW50ZXJlc3QgPSBuZXdJbnRlcmVzdDsKICAgICAgICAgIHRoaXMuaW50ZXJlc3RPYmplY3RNYXAuYWRkKHJldHVybkludGVyZXN0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV3SW50ZXJlc3QuZGVzdHJveSgpOwogICAgICAgIH0KICAgICAgICB0aGlzLmludGVyZXN0T2JzZXJ2YWJsZS5wdXNoKHJldHVybkludGVyZXN0KTsKICAgICAgICByZXR1cm4gcmV0dXJuSW50ZXJlc3Q7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHJlbW92ZXMgYW4gaW50ZXJlc3QgZnJvbSB0aGUgaW50ZXJlc3QgbWFwCiAgICAgICAqLwogICAgICByZW1vdmVJbnRlcmVzdChpbnRlcmVzdEFyZykgewogICAgICAgIGNvbnN0IGludGVyZXN0VG9SZW1vdmUgPSB0aGlzLmludGVyZXN0T2JqZWN0TWFwLmZpbmRPbmVBbmRSZW1vdmVTeW5jKChpbnRlcmVzdEFyZzIpID0+IHsKICAgICAgICAgIHJldHVybiBpbnRlcmVzdEFyZy5jb21wYXJpc29uU3RyaW5nID09PSBpbnRlcmVzdEFyZzIuY29tcGFyaXNvblN0cmluZzsKICAgICAgICB9KTsKICAgICAgfQogICAgICAvKioKICAgICAgICogY2hlY2sgaW50ZXJlc3QKICAgICAgICovCiAgICAgIGNoZWNrSW50ZXJlc3Qob2JqZWN0QXJnKSB7CiAgICAgICAgY29uc3QgY29tcGFyaXNvblN0cmluZyA9IHRoaXMuY29tcGFyaXNvbkZ1bmMob2JqZWN0QXJnKTsKICAgICAgICByZXR1cm4gdGhpcy5jaGVja0ludGVyZXN0QnlTdHJpbmcoY29tcGFyaXNvblN0cmluZyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNoZWNrcyBhbiBpbnRlcmVzdAogICAgICAgKiBAcGFyYW0gY29tcGFyaXNvblN0cmluZ0FyZwogICAgICAgKi8KICAgICAgY2hlY2tJbnRlcmVzdEJ5U3RyaW5nKGNvbXBhcmlzb25TdHJpbmdBcmcpIHsKICAgICAgICBjb25zdCBmb3VuZEludGVyZXN0ID0gdGhpcy5pbnRlcmVzdE9iamVjdE1hcC5maW5kU3luYygoaW50ZXJlc3QpID0+IHsKICAgICAgICAgIHJldHVybiBpbnRlcmVzdC5jb21wYXJpc29uU3RyaW5nID09PSBjb21wYXJpc29uU3RyaW5nQXJnOwogICAgICAgIH0pOwogICAgICAgIGlmIChmb3VuZEludGVyZXN0KSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogaW5mb3JtIGxvc3QgaW50ZXJlc3QKICAgICAgICogQHBhcmFtIGludGVyZXN0SWQKICAgICAgICovCiAgICAgIGluZm9ybUxvc3RJbnRlcmVzdChpbnRlcmVzdElkKSB7CiAgICAgICAgY29uc3Qgd2FudGVkSW50ZXJlc3QgPSB0aGlzLmZpbmRJbnRlcmVzdChpbnRlcmVzdElkKTsKICAgICAgICBpZiAod2FudGVkSW50ZXJlc3QpIHsKICAgICAgICAgIHdhbnRlZEludGVyZXN0Lm1hcmtMb3N0KCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBmaW5kcyBhbiBpbnRlcmVzdAogICAgICAgKiBAcGFyYW0gaW50ZXJlc3RJZAogICAgICAgKi8KICAgICAgZmluZEludGVyZXN0KGludGVyZXN0SWQpIHsKICAgICAgICBjb25zdCBjb21wYXJhYmxlU3RyaW5nID0gdGhpcy5jb21wYXJpc29uRnVuYyhpbnRlcmVzdElkKTsKICAgICAgICBjb25zdCBpbnRlcmVzdCA9IHRoaXMuaW50ZXJlc3RPYmplY3RNYXAuZmluZFN5bmMoKGludGVyZXN0QXJnKSA9PiB7CiAgICAgICAgICByZXR1cm4gaW50ZXJlc3RBcmcuY29tcGFyaXNvblN0cmluZyA9PT0gY29tcGFyYWJsZVN0cmluZzsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gaW50ZXJlc3Q7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGRlc3Ryb3lzIHRoZSBJbnRlcmVzdE1hcCBhbmQgY2xlYW5zIHVwIGFsbCByZXNvdXJjZXMKICAgICAgICovCiAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgY29uc3QgaW50ZXJlc3RzID0gdGhpcy5pbnRlcmVzdE9iamVjdE1hcC5nZXRBcnJheSgpOwogICAgICAgIGZvciAoY29uc3QgaW50ZXJlc3Qgb2YgaW50ZXJlc3RzKSB7CiAgICAgICAgICBpbnRlcmVzdC5kZXN0cm95KCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuaW50ZXJlc3RPYmplY3RNYXAud2lwZSgpOwogICAgICAgIHRoaXMuaW50ZXJlc3RPYnNlcnZhYmxlLnNpZ25hbENvbXBsZXRlKCk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4zLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMubGltaXRlZGFycmF5LmpzCnZhciBMaW1pdGVkQXJyYXkyOwp2YXIgaW5pdF9jbGFzc2VzX2xpbWl0ZWRhcnJheTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4zLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMubGltaXRlZGFycmF5LmpzIigpIHsKICAgIGluaXRfY2xhc3Nlc19wbHVnaW5zMigpOwogICAgTGltaXRlZEFycmF5MiA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IobGltaXRBcmcpIHsKICAgICAgICB0aGlzLmFycmF5ID0gW107CiAgICAgICAgdGhpcy5hcnJheUxpbWl0ID0gbGltaXRBcmc7CiAgICAgIH0KICAgICAgYWRkT25lKG9iamVjdEFyZykgewogICAgICAgIHRoaXMuYXJyYXkudW5zaGlmdChvYmplY3RBcmcpOwogICAgICAgIGlmICh0aGlzLmFycmF5Lmxlbmd0aCA+IHRoaXMuYXJyYXlMaW1pdCkgewogICAgICAgICAgdGhpcy5hcnJheS5sZW5ndGggPSB0aGlzLmFycmF5TGltaXQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFkZE1hbnkob2JqZWN0QXJyYXlBcmcpIHsKICAgICAgICBmb3IgKGxldCBvYmplY3RBcmcgb2Ygb2JqZWN0QXJyYXlBcmcpIHsKICAgICAgICAgIHRoaXMuYWRkT25lKG9iamVjdEFyZyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHNldExpbWl0KGxpbWl0QXJnKSB7CiAgICAgICAgdGhpcy5hcnJheUxpbWl0ID0gbGltaXRBcmc7CiAgICAgICAgaWYgKHRoaXMuYXJyYXkubGVuZ3RoID4gdGhpcy5hcnJheUxpbWl0KSB7CiAgICAgICAgICB0aGlzLmFycmF5Lmxlbmd0aCA9IHRoaXMuYXJyYXlMaW1pdDsKICAgICAgICB9CiAgICAgIH0KICAgICAgZ2V0QXZlcmFnZSgpIHsKICAgICAgICBpZiAodHlwZW9mIHRoaXMuYXJyYXlbMF0gPT09ICJudW1iZXIiKSB7CiAgICAgICAgICBsZXQgc3VtID0gMDsKICAgICAgICAgIGZvciAobGV0IGxvY2FsTnVtYmVyIG9mIHRoaXMuYXJyYXkpIHsKICAgICAgICAgICAgbGV0IGxvY2FsTnVtYmVyQW55ID0gbG9jYWxOdW1iZXI7CiAgICAgICAgICAgIHN1bSA9IHN1bSArIGxvY2FsTnVtYmVyQW55OwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHN1bSAvIHRoaXMuYXJyYXkubGVuZ3RoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4zLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMubG9vcHRyYWNrZXIuanMKdmFyIExvb3BUcmFja2VyMjsKdmFyIGluaXRfY2xhc3Nlc19sb29wdHJhY2tlcjIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4zLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMubG9vcHRyYWNrZXIuanMiKCkgewogICAgaW5pdF9jbGFzc2VzX3BsdWdpbnMyKCk7CiAgICBpbml0X2NsYXNzZXNfb2JqZWN0bWFwMigpOwogICAgTG9vcFRyYWNrZXIyID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLnJlZmVyZW5jZU9iamVjdE1hcCA9IG5ldyBPYmplY3RNYXAyKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNoZWNrcyBhbmQgdHJhY2tzIGFuIG9iamVjdAogICAgICAgKiBAcGFyYW0gb2JqZWN0QXJnCiAgICAgICAqLwogICAgICBjaGVja0FuZFRyYWNrKG9iamVjdEFyZykgewogICAgICAgIGlmICghdGhpcy5yZWZlcmVuY2VPYmplY3RNYXAuY2hlY2tGb3JPYmplY3Qob2JqZWN0QXJnKSkgewogICAgICAgICAgdGhpcy5yZWZlcmVuY2VPYmplY3RNYXAuYWRkKG9iamVjdEFyZyk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogcmVzZXRzIHRoZSBsb29wIHRyYWNrZXIsIGNsZWFyaW5nIGFsbCB0cmFja2VkIG9iamVjdHMKICAgICAgICovCiAgICAgIHJlc2V0KCkgewogICAgICAgIHRoaXMucmVmZXJlbmNlT2JqZWN0TWFwLndpcGUoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogZGVzdHJveXMgdGhlIGxvb3AgdHJhY2tlciBhbmQgaXRzIHVuZGVybHlpbmcgT2JqZWN0TWFwCiAgICAgICAqLwogICAgICBkZXN0cm95KCkgewogICAgICAgIHRoaXMucmVmZXJlbmNlT2JqZWN0TWFwLmRlc3Ryb3koKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjMuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5zdHJpbmdtYXAuanMKdmFyIFN0cmluZ21hcDI7CnZhciBpbml0X2NsYXNzZXNfc3RyaW5nbWFwMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjMuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy5zdHJpbmdtYXAuanMiKCkgewogICAgaW5pdF9jbGFzc2VzX3BsdWdpbnMyKCk7CiAgICBTdHJpbmdtYXAyID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLl9zdHJpbmdBcnJheSA9IFtdOwogICAgICAgIHRoaXMuX3RyaWdnZXJVbnRpbFRydWVGdW5jdGlvbkFycmF5ID0gW107CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGFkZCBhIHN0cmluZyB0byB0aGUgU3RyaW5nbWFwCiAgICAgICAqLwogICAgICBhZGRTdHJpbmcoc3RyaW5nQXJnKSB7CiAgICAgICAgdGhpcy5fc3RyaW5nQXJyYXkucHVzaChzdHJpbmdBcmcpOwogICAgICAgIHRoaXMubm90aWZ5VHJpZ2dlcigpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBsaWtlIGFkZFN0cmluZywgYnV0IGFjY2VwdHMgYW4gYXJyYXkgb2Ygc3RyaW5ncwogICAgICAgKi8KICAgICAgYWRkU3RyaW5nQXJyYXkoc3RyaW5nQXJyYXlBcmcpIHsKICAgICAgICBmb3IgKGNvbnN0IHN0cmluZ0l0ZW0gb2Ygc3RyaW5nQXJyYXlBcmcpIHsKICAgICAgICAgIHRoaXMuYWRkU3RyaW5nKHN0cmluZ0l0ZW0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogcmVtb3ZlcyBhIHN0cmluZyBmcm9tIFN0cmluZ21hcAogICAgICAgKi8KICAgICAgcmVtb3ZlU3RyaW5nKHN0cmluZ0FyZykgewogICAgICAgIGZvciAoY29uc3Qga2V5QXJnIGluIHRoaXMuX3N0cmluZ0FycmF5KSB7CiAgICAgICAgICBpZiAodGhpcy5fc3RyaW5nQXJyYXlba2V5QXJnXSA9PT0gc3RyaW5nQXJnKSB7CiAgICAgICAgICAgIHRoaXMuX3N0cmluZ0FycmF5LnNwbGljZShwYXJzZUludChrZXlBcmcpLCAxKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5ub3RpZnlUcmlnZ2VyKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHdpcGVzIHRoZSBTdHJpbmdtYXAKICAgICAgICovCiAgICAgIHdpcGUoKSB7CiAgICAgICAgdGhpcy5fc3RyaW5nQXJyYXkgPSBbXTsKICAgICAgICB0aGlzLm5vdGlmeVRyaWdnZXIoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogY2hlY2sgaWYgc3RyaW5nIGlzIGluIFN0cmluZ21hcAogICAgICAgKi8KICAgICAgY2hlY2tTdHJpbmcoc3RyaW5nQXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmluZ0FycmF5LmluZGV4T2Yoc3RyaW5nQXJnKSAhPT0gLTE7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNoZWNrcyBzdHJpbmdQcmVzZW5jZSB3aXRoIG1pbmltYXRjaAogICAgICAgKi8KICAgICAgY2hlY2tNaW5pbWF0Y2gobWluaU1hdGNoU3RyaW5nQXJnKSB7CiAgICAgICAgY29uc3Qgc21hcnRNYXRjaEluc3RhbmNlID0gbmV3IGRpc3RfdHNfZXhwb3J0czUuU21hcnRNYXRjaChtaW5pTWF0Y2hTdHJpbmdBcmcpOwogICAgICAgIGxldCBmb3VuZE1hdGNoID0gZmFsc2U7CiAgICAgICAgZm9yIChjb25zdCBzdHJpbmdJdGVtIG9mIHRoaXMuX3N0cmluZ0FycmF5KSB7CiAgICAgICAgICBpZiAoc21hcnRNYXRjaEluc3RhbmNlLm1hdGNoKHN0cmluZ0l0ZW0pKSB7CiAgICAgICAgICAgIGZvdW5kTWF0Y2ggPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZm91bmRNYXRjaDsKICAgICAgfQogICAgICAvKioKICAgICAgICogY2hlY2tzIGlmIHRoZSBTdHJpbmdtYXAgaXMgZW1wdHkKICAgICAgICovCiAgICAgIGNoZWNrSXNFbXB0eSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc3RyaW5nQXJyYXkubGVuZ3RoID09PSAwOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBnZXRzIGEgY2xvbmVkIGNvcHkgb2YgdGhlIGN1cnJlbnQgc3RyaW5nIEFycmF5CiAgICAgICAqLwogICAgICBnZXRTdHJpbmdBcnJheSgpIHsKICAgICAgICBjb25zdCByZXR1cm5BcnJheSA9IFtdOwogICAgICAgIGZvciAoY29uc3Qgc3RyaW5nSXRlbSBvZiB0aGlzLl9zdHJpbmdBcnJheSkgewogICAgICAgICAgcmV0dXJuQXJyYXkucHVzaChzdHJpbmdJdGVtKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldHVybkFycmF5OwogICAgICB9CiAgICAgIC8vIHRyaWdnZXIgcmVnaXN0ZXJpbmcKICAgICAgLyoqCiAgICAgICAqIHJlZ2lzdGVyIGEgbmV3IHRyaWdnZXIKICAgICAgICovCiAgICAgIHJlZ2lzdGVyVW50aWxUcnVlKGZ1bmN0aW9uQXJnLCBjYWxsYmFja0FyZykgewogICAgICAgIGNvbnN0IHRydWVEZWZlcnJlZCA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgICAgIHRoaXMuX3RyaWdnZXJVbnRpbFRydWVGdW5jdGlvbkFycmF5LnB1c2goKCkgPT4gewogICAgICAgICAgY29uc3QgcmVzdWx0ID0gZnVuY3Rpb25BcmcodGhpcy5nZXRTdHJpbmdBcnJheSgpKTsKICAgICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHsKICAgICAgICAgICAgaWYgKGNhbGxiYWNrQXJnKSB7CiAgICAgICAgICAgICAgY2FsbGJhY2tBcmcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnVlRGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9KTsKICAgICAgICB0aGlzLm5vdGlmeVRyaWdnZXIoKTsKICAgICAgICByZXR1cm4gdHJ1ZURlZmVycmVkLnByb21pc2U7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIG5vdGlmaWVzIHRyaWdnZXJzCiAgICAgICAqLwogICAgICBub3RpZnlUcmlnZ2VyKCkgewogICAgICAgIGNvbnN0IGZpbHRlcmVkQXJyYXkgPSB0aGlzLl90cmlnZ2VyVW50aWxUcnVlRnVuY3Rpb25BcnJheS5maWx0ZXIoKGZ1bmN0aW9uQXJnKSA9PiB7CiAgICAgICAgICByZXR1cm4gIWZ1bmN0aW9uQXJnKCk7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5fdHJpZ2dlclVudGlsVHJ1ZUZ1bmN0aW9uQXJyYXkgPSBmaWx0ZXJlZEFycmF5OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBkZXN0cm95cyB0aGUgU3RyaW5nbWFwLCBjbGVhcmluZyBhbGwgc3RyaW5ncyBhbmQgcGVuZGluZyB0cmlnZ2VycwogICAgICAgKi8KICAgICAgZGVzdHJveSgpIHsKICAgICAgICB0aGlzLl9zdHJpbmdBcnJheSA9IFtdOwogICAgICAgIHRoaXMuX3RyaWdnZXJVbnRpbFRydWVGdW5jdGlvbkFycmF5ID0gW107CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4zLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMudGltZWRhZ2dyZWdhdG9yLmpzCnZhciBUaW1lZEFnZ3JlZ3RvcjI7CnZhciBpbml0X2NsYXNzZXNfdGltZWRhZ2dyZWdhdG9yMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjMuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvY2xhc3Nlcy50aW1lZGFnZ3JlZ2F0b3IuanMiKCkgewogICAgaW5pdF9jbGFzc2VzX3BsdWdpbnMyKCk7CiAgICBUaW1lZEFnZ3JlZ3RvcjIgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKG9wdGlvbnNBcmcpIHsKICAgICAgICB0aGlzLnN0b3JhZ2VBcnJheSA9IFtdOwogICAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc0FyZzsKICAgICAgfQogICAgICBjaGVja0FnZ3JlZ2F0aW9uU3RhdHVzKCkgewogICAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBhZGRBZ2dyZWdhdGlvblRpbWVyID0gKCkgPT4gewogICAgICAgICAgdGhpcy5hZ2dyZWdhdGlvblRpbWVyID0gbmV3IGRpc3RfdHNfZXhwb3J0czguVGltZXIodGhpcy5vcHRpb25zLmFnZ3JlZ2F0aW9uSW50ZXJ2YWxJbk1pbGxpcyk7CiAgICAgICAgICB0aGlzLmFnZ3JlZ2F0aW9uVGltZXIuY29tcGxldGVkLnRoZW4oKCkgPT4gewogICAgICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgICB0aGlzLmFnZ3JlZ2F0aW9uVGltZXIgPSBudWxsOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBhZ2dyZWdhdGVGb3JQcm9jZXNzaW5nID0gdGhpcy5zdG9yYWdlQXJyYXk7CiAgICAgICAgICAgIGlmIChhZ2dyZWdhdGVGb3JQcm9jZXNzaW5nLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgIHRoaXMuYWdncmVnYXRpb25UaW1lciA9IG51bGw7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc3RvcmFnZUFycmF5ID0gW107CiAgICAgICAgICAgIGFkZEFnZ3JlZ2F0aW9uVGltZXIoKTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLmZ1bmN0aW9uRm9yQWdncmVnYXRpb24oYWdncmVnYXRlRm9yUHJvY2Vzc2luZyk7CiAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMuYWdncmVnYXRpb25UaW1lci5zdGFydCgpOwogICAgICAgIH07CiAgICAgICAgaWYgKCF0aGlzLmFnZ3JlZ2F0aW9uVGltZXIpIHsKICAgICAgICAgIGFkZEFnZ3JlZ2F0aW9uVGltZXIoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYWRkKGFnZ3JlZ2F0aW9uQXJnKSB7CiAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuc3RvcmFnZUFycmF5LnB1c2goYWdncmVnYXRpb25BcmcpOwogICAgICAgIHRoaXMuY2hlY2tBZ2dyZWdhdGlvblN0YXR1cygpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBzdG9wcyB0aGUgYWdncmVnYXRpb24gdGltZXIgY2hhaW4KICAgICAgICogQHBhcmFtIGZsdXNoUmVtYWluaW5nIGlmIHRydWUsIGNhbGxzIGZ1bmN0aW9uRm9yQWdncmVnYXRpb24gd2l0aCBhbnkgcmVtYWluaW5nIGl0ZW1zCiAgICAgICAqLwogICAgICBzdG9wKGZsdXNoUmVtYWluaW5nID0gZmFsc2UpIHsKICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICAgICAgaWYgKHRoaXMuYWdncmVnYXRpb25UaW1lcikgewogICAgICAgICAgdGhpcy5hZ2dyZWdhdGlvblRpbWVyLnJlc2V0KCk7CiAgICAgICAgICB0aGlzLmFnZ3JlZ2F0aW9uVGltZXIgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoZmx1c2hSZW1haW5pbmcgJiYgdGhpcy5zdG9yYWdlQXJyYXkubGVuZ3RoID4gMCkgewogICAgICAgICAgY29uc3QgcmVtYWluaW5nID0gdGhpcy5zdG9yYWdlQXJyYXk7CiAgICAgICAgICB0aGlzLnN0b3JhZ2VBcnJheSA9IFtdOwogICAgICAgICAgdGhpcy5vcHRpb25zLmZ1bmN0aW9uRm9yQWdncmVnYXRpb24ocmVtYWluaW5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5zdG9yYWdlQXJyYXkgPSBbXTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4zLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMudHJlZS5qcwp2YXIgVHJlZTI7CnZhciBpbml0X2NsYXNzZXNfdHJlZTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytsaWtANi4zLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL2xpay9kaXN0X3RzL2NsYXNzZXMudHJlZS5qcyIoKSB7CiAgICBpbml0X2NsYXNzZXNfcGx1Z2luczIoKTsKICAgIFRyZWUyID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLnN5bWJvbFRyZWUgPSBuZXcgaW1wb3J0X3N5bWJvbF90cmVlMi5kZWZhdWx0KCk7CiAgICAgIH0KICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIC8vIEZ1bmN0aW9ucyB0aGF0IG1hcCB0byB0aGUgZnVuY3Rpb25hbGl0eSBvZiBzeW1ib2wtdHJlZQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgLyoqCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSBvYmplY3RBcmcKICAgICAgICovCiAgICAgIGluaXRpYWxpemUob2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5pbml0aWFsaXplKG9iamVjdEFyZyk7CiAgICAgIH0KICAgICAgaGFzQ2hpbGRyZW4ob2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5oYXNDaGlsZHJlbihvYmplY3RBcmcpOwogICAgICB9CiAgICAgIGZpcnN0Q2hpbGQob2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5maXJzdENoaWxkKG9iamVjdEFyZyk7CiAgICAgIH0KICAgICAgbGFzdENoaWxkKG9iamVjdEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUubGFzdENoaWxkKG9iamVjdEFyZyk7CiAgICAgIH0KICAgICAgcHJldmlvdXNTaWJsaW5nKG9iamVjdEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUucHJldmlvdXNTaWJsaW5nKG9iamVjdEFyZyk7CiAgICAgIH0KICAgICAgbmV4dFNpYmxpbmcob2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5uZXh0U2libGluZyhvYmplY3RBcmcpOwogICAgICB9CiAgICAgIHBhcmVudChvYmplY3RBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLnBhcmVudChvYmplY3RBcmcpOwogICAgICB9CiAgICAgIGxhc3RJbmNsdXNpdmVEZXNjZW5kYW50KG9iamVjdEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUubGFzdEluY2x1c2l2ZURlc2NlbmRhbnQob2JqZWN0QXJnKTsKICAgICAgfQogICAgICBwcmVjZWRpbmcob2JqZWN0QXJnLCBvcHRpb25zQXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5wcmVjZWRpbmcob2JqZWN0QXJnLCBvcHRpb25zQXJnKTsKICAgICAgfQogICAgICBmb2xsb3dpbmcob2JqZWN0LCBvcHRpb25zQXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5mb2xsb3dpbmcob2JqZWN0LCBvcHRpb25zQXJnKTsKICAgICAgfQogICAgICBjaGlsZHJlblRvQXJyYXkocGFyZW50QXJnLCBvcHRpb25zQXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5jaGlsZHJlblRvQXJyYXkocGFyZW50QXJnLCBvcHRpb25zQXJnKTsKICAgICAgfQogICAgICBhbmNlc3RvcnNUb0FycmF5KG9iamVjdEFyZywgb3B0aW9uc0FyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuYW5jZXN0b3JzVG9BcnJheShvYmplY3RBcmcsIG9wdGlvbnNBcmcpOwogICAgICB9CiAgICAgIHRyZWVUb0FycmF5KHJvb3RBcmcsIG9wdGlvbnNBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLnRyZWVUb0FycmF5KHJvb3RBcmcsIG9wdGlvbnNBcmcpOwogICAgICB9CiAgICAgIGNoaWxkcmVuSXRlcmF0b3IocGFyZW50QXJnLCBvcHRpb25zQXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5jaGlsZHJlbkl0ZXJhdG9yKHBhcmVudEFyZywgb3B0aW9uc0FyZyk7CiAgICAgIH0KICAgICAgcHJldmlvdXNTaWJsaW5nc0l0ZXJhdG9yKG9iamVjdEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUucHJldmlvdXNTaWJsaW5nc0l0ZXJhdG9yKG9iamVjdEFyZyk7CiAgICAgIH0KICAgICAgbmV4dFNpYmxpbmdzSXRlcmF0b3Iob2JqZWN0QXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS5uZXh0U2libGluZ3NJdGVyYXRvcigpOwogICAgICB9CiAgICAgIGFuY2VzdG9yc0l0ZXJhdG9yKG9iamVjdEFyZykgewogICAgICAgIHRoaXMuc3ltYm9sVHJlZS5hbmNlc3RvcnNJdGVyYXRvcigpOwogICAgICB9CiAgICAgIHRyZWVJdGVyYXRvcihyb290QXJnLCBvcHRpb25zQXJnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sVHJlZS50cmVlSXRlcmF0b3Iocm9vdEFyZyk7CiAgICAgIH0KICAgICAgaW5kZXgoY2hpbGRBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmluZGV4KGNoaWxkQXJnKTsKICAgICAgfQogICAgICBjaGlsZHJlbkNvdW50KHBhcmVudEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuY2hpbGRyZW5Db3VudChwYXJlbnRBcmcpOwogICAgICB9CiAgICAgIGNvbXBhcmVUcmVlUG9zaXRpb24obGVmdEFyZywgcmlnaHRBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLmNvbXBhcmVUcmVlUG9zaXRpb24obGVmdEFyZywgcmlnaHRBcmcpOwogICAgICB9CiAgICAgIHJlbW92ZShyZW1vdmVPYmplY3RBcmcpIHsKICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xUcmVlLnJlbW92ZShyZW1vdmVPYmplY3RBcmcpOwogICAgICB9CiAgICAgIGluc2VydEJlZm9yZShyZWZlcmVuY2VPYmplY3RBcmcsIG5ld09iamVjdEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuaW5zZXJ0QmVmb3JlKHJlZmVyZW5jZU9iamVjdEFyZywgbmV3T2JqZWN0QXJnKTsKICAgICAgfQogICAgICBpbnNlcnRBZnRlcihyZWZlcmVuY2VPYmplY3QsIG5ld09iamVjdEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuaW5zZXJ0QWZ0ZXIocmVmZXJlbmNlT2JqZWN0LCBuZXdPYmplY3RBcmcpOwogICAgICB9CiAgICAgIHByZXBlbmRDaGlsZChyZWZlcmVuY2VPYmplY3RBcmcsIG5ld09iamVjdEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUucHJlcGVuZENoaWxkKHJlZmVyZW5jZU9iamVjdEFyZywgbmV3T2JqZWN0QXJnKTsKICAgICAgfQogICAgICBhcHBlbmRDaGlsZChyZWZlcmVuY2VPYmplY3RBcmcsIG5ld09iamVjdEFyZykgewogICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRyZWUuYXBwZW5kQ2hpbGQocmVmZXJlbmNlT2JqZWN0QXJnLCBuZXdPYmplY3RBcmcpOwogICAgICB9CiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgLy8gRnVuY3Rpb25pb25hbGl0eSB0aGF0IGV4dGVuZHMgc3ltYm9sLXRyZWUKICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAvKioKICAgICAgICogcmV0dXJucyBhIGJyYW5jaCBvZiB0aGUgdHJlZSBhcyBKU09OCiAgICAgICAqIGNhbiBiZSB1c2VyCiAgICAgICAqLwogICAgICB0b0pzb25XaXRoSGllcmFjaHkocm9vdEVsZW1lbnQpIHsKICAgICAgICBjb25zdCB0cmVlSXRlcmFibGUgPSB0aGlzLnRyZWVJdGVyYXRvcihyb290RWxlbWVudCwge30pOwogICAgICAgIGZvciAoY29uc3QgdHJlZUl0ZW0gb2YgdHJlZUl0ZXJhYmxlKSB7CiAgICAgICAgICBjb25zb2xlLmxvZyh0cmVlSXRlbSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBidWlsZHMgYSB0cmVlIGZyb20gYSBKU09OIHdpdGggaGllcmFjaHkKICAgICAgICogQHBhcmFtIHJvb3RFbGVtZW50CiAgICAgICAqLwogICAgICBmcm9tSnNvbldpdGhIaWVyYWNoeShyb290RWxlbWVudCkgewogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MrbGlrQDYuMy4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9saWsvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzOSA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHM5LCB7CiAgQXN5bmNFeGVjdXRpb25TdGFjazogKCkgPT4gQXN5bmNFeGVjdXRpb25TdGFjazIsCiAgQmFja3ByZXNzdXJlZEFycmF5OiAoKSA9PiBCYWNrcHJlc3N1cmVkQXJyYXkyLAogIEZhc3RNYXA6ICgpID0+IEZhc3RNYXAyLAogIEludGVyZXN0OiAoKSA9PiBJbnRlcmVzdDIsCiAgSW50ZXJlc3RNYXA6ICgpID0+IEludGVyZXN0TWFwMiwKICBMaW1pdGVkQXJyYXk6ICgpID0+IExpbWl0ZWRBcnJheTIsCiAgTG9vcFRyYWNrZXI6ICgpID0+IExvb3BUcmFja2VyMiwKICBPYmplY3RNYXA6ICgpID0+IE9iamVjdE1hcDIsCiAgU3RyaW5nbWFwOiAoKSA9PiBTdHJpbmdtYXAyLAogIFRpbWVkQWdncmVndG9yOiAoKSA9PiBUaW1lZEFnZ3JlZ3RvcjIsCiAgVHJlZTogKCkgPT4gVHJlZTIsCiAgdW5pOiAoKSA9PiB1bmkyCn0pOwp2YXIgaW5pdF9kaXN0X3RzOSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK2xpa0A2LjMuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvbGlrL2Rpc3RfdHMvaW5kZXguanMiKCkgewogICAgaW5pdF9jbGFzc2VzX2FzeW5jZXhlY3V0aW9uc3RhY2syKCk7CiAgICBpbml0X2NsYXNzZXNfYmFja3ByZXNzdXJlZGFycmF5MigpOwogICAgaW5pdF9jbGFzc2VzX2Zhc3RtYXAyKCk7CiAgICBpbml0X2NsYXNzZXNfaW50ZXJlc3RtYXAyKCk7CiAgICBpbml0X2NsYXNzZXNfaW50ZXJlc3RtYXBfaW50ZXJlc3QyKCk7CiAgICBpbml0X2NsYXNzZXNfbGltaXRlZGFycmF5MigpOwogICAgaW5pdF9jbGFzc2VzX2xvb3B0cmFja2VyMigpOwogICAgaW5pdF9jbGFzc2VzX29iamVjdG1hcDIoKTsKICAgIGluaXRfY2xhc3Nlc19zdHJpbmdtYXAyKCk7CiAgICBpbml0X2NsYXNzZXNfdGltZWRhZ2dyZWdhdG9yMigpOwogICAgaW5pdF9jbGFzc2VzX3RyZWUyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS91aW50OGFycmF5LWV4dHJhc0AxLjUuMC9ub2RlX21vZHVsZXMvdWludDhhcnJheS1leHRyYXMvaW5kZXguanMKdmFyIHVpbnQ4YXJyYXlfZXh0cmFzX2V4cG9ydHMgPSB7fTsKX19leHBvcnQodWludDhhcnJheV9leHRyYXNfZXhwb3J0cywgewogIGFyZVVpbnQ4QXJyYXlzRXF1YWw6ICgpID0+IGFyZVVpbnQ4QXJyYXlzRXF1YWwsCiAgYXNzZXJ0VWludDhBcnJheTogKCkgPT4gYXNzZXJ0VWludDhBcnJheSwKICBhc3NlcnRVaW50OEFycmF5T3JBcnJheUJ1ZmZlcjogKCkgPT4gYXNzZXJ0VWludDhBcnJheU9yQXJyYXlCdWZmZXIsCiAgYmFzZTY0VG9TdHJpbmc6ICgpID0+IGJhc2U2NFRvU3RyaW5nLAogIGJhc2U2NFRvVWludDhBcnJheTogKCkgPT4gYmFzZTY0VG9VaW50OEFycmF5LAogIGNvbXBhcmVVaW50OEFycmF5czogKCkgPT4gY29tcGFyZVVpbnQ4QXJyYXlzLAogIGNvbmNhdFVpbnQ4QXJyYXlzOiAoKSA9PiBjb25jYXRVaW50OEFycmF5cywKICBnZXRVaW50QkU6ICgpID0+IGdldFVpbnRCRSwKICBoZXhUb1VpbnQ4QXJyYXk6ICgpID0+IGhleFRvVWludDhBcnJheSwKICBpbmNsdWRlczogKCkgPT4gaW5jbHVkZXMsCiAgaW5kZXhPZjogKCkgPT4gaW5kZXhPZiwKICBpc1VpbnQ4QXJyYXk6ICgpID0+IGlzVWludDhBcnJheSwKICBzdHJpbmdUb0Jhc2U2NDogKCkgPT4gc3RyaW5nVG9CYXNlNjQsCiAgc3RyaW5nVG9VaW50OEFycmF5OiAoKSA9PiBzdHJpbmdUb1VpbnQ4QXJyYXksCiAgdG9VaW50OEFycmF5OiAoKSA9PiB0b1VpbnQ4QXJyYXksCiAgdWludDhBcnJheVRvQmFzZTY0OiAoKSA9PiB1aW50OEFycmF5VG9CYXNlNjQsCiAgdWludDhBcnJheVRvSGV4OiAoKSA9PiB1aW50OEFycmF5VG9IZXgsCiAgdWludDhBcnJheVRvU3RyaW5nOiAoKSA9PiB1aW50OEFycmF5VG9TdHJpbmcKfSk7CmZ1bmN0aW9uIGlzVHlwZSh2YWx1ZTIsIHR5cGVDb25zdHJ1Y3RvciwgdHlwZVN0cmluZ2lmaWVkKSB7CiAgaWYgKCF2YWx1ZTIpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgaWYgKHZhbHVlMi5jb25zdHJ1Y3RvciA9PT0gdHlwZUNvbnN0cnVjdG9yKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUyKSA9PT0gdHlwZVN0cmluZ2lmaWVkOwp9CmZ1bmN0aW9uIGlzVWludDhBcnJheSh2YWx1ZTIpIHsKICByZXR1cm4gaXNUeXBlKHZhbHVlMiwgVWludDhBcnJheSwgdWludDhBcnJheVN0cmluZ2lmaWVkKTsKfQpmdW5jdGlvbiBpc0FycmF5QnVmZmVyKHZhbHVlMikgewogIHJldHVybiBpc1R5cGUodmFsdWUyLCBBcnJheUJ1ZmZlciwgYXJyYXlCdWZmZXJTdHJpbmdpZmllZCk7Cn0KZnVuY3Rpb24gaXNVaW50OEFycmF5T3JBcnJheUJ1ZmZlcih2YWx1ZTIpIHsKICByZXR1cm4gaXNVaW50OEFycmF5KHZhbHVlMikgfHwgaXNBcnJheUJ1ZmZlcih2YWx1ZTIpOwp9CmZ1bmN0aW9uIGFzc2VydFVpbnQ4QXJyYXkodmFsdWUyKSB7CiAgaWYgKCFpc1VpbnQ4QXJyYXkodmFsdWUyKSkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXGBVaW50OEFycmF5XGAsIGdvdCBcYCR7dHlwZW9mIHZhbHVlMn1cYGApOwogIH0KfQpmdW5jdGlvbiBhc3NlcnRVaW50OEFycmF5T3JBcnJheUJ1ZmZlcih2YWx1ZTIpIHsKICBpZiAoIWlzVWludDhBcnJheU9yQXJyYXlCdWZmZXIodmFsdWUyKSkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXGBVaW50OEFycmF5XGAgb3IgXGBBcnJheUJ1ZmZlclxgLCBnb3QgXGAke3R5cGVvZiB2YWx1ZTJ9XGBgKTsKICB9Cn0KZnVuY3Rpb24gdG9VaW50OEFycmF5KHZhbHVlMikgewogIGlmICh2YWx1ZTIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgewogICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHZhbHVlMik7CiAgfQogIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUyKSkgewogICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHZhbHVlMi5idWZmZXIsIHZhbHVlMi5ieXRlT2Zmc2V0LCB2YWx1ZTIuYnl0ZUxlbmd0aCk7CiAgfQogIHRocm93IG5ldyBUeXBlRXJyb3IoYFVuc3VwcG9ydGVkIHZhbHVlLCBnb3QgXGAke3R5cGVvZiB2YWx1ZTJ9XGAuYCk7Cn0KZnVuY3Rpb24gY29uY2F0VWludDhBcnJheXMoYXJyYXlzLCB0b3RhbExlbmd0aCkgewogIGlmIChhcnJheXMubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7CiAgfQogIHRvdGFsTGVuZ3RoID8/PSBhcnJheXMucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudFZhbHVlKSA9PiBhY2N1bXVsYXRvciArIGN1cnJlbnRWYWx1ZS5sZW5ndGgsIDApOwogIGNvbnN0IHJldHVyblZhbHVlID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGgpOwogIGxldCBvZmZzZXQgPSAwOwogIGZvciAoY29uc3QgYXJyYXkgb2YgYXJyYXlzKSB7CiAgICBhc3NlcnRVaW50OEFycmF5KGFycmF5KTsKICAgIHJldHVyblZhbHVlLnNldChhcnJheSwgb2Zmc2V0KTsKICAgIG9mZnNldCArPSBhcnJheS5sZW5ndGg7CiAgfQogIHJldHVybiByZXR1cm5WYWx1ZTsKfQpmdW5jdGlvbiBhcmVVaW50OEFycmF5c0VxdWFsKGE1LCBiNikgewogIGFzc2VydFVpbnQ4QXJyYXkoYTUpOwogIGFzc2VydFVpbnQ4QXJyYXkoYjYpOwogIGlmIChhNSA9PT0gYjYpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBpZiAoYTUubGVuZ3RoICE9PSBiNi5sZW5ndGgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgZm9yIChsZXQgaW5kZXgyID0gMDsgaW5kZXgyIDwgYTUubGVuZ3RoOyBpbmRleDIrKykgewogICAgaWYgKGE1W2luZGV4Ml0gIT09IGI2W2luZGV4Ml0pIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gdHJ1ZTsKfQpmdW5jdGlvbiBjb21wYXJlVWludDhBcnJheXMoYTUsIGI2KSB7CiAgYXNzZXJ0VWludDhBcnJheShhNSk7CiAgYXNzZXJ0VWludDhBcnJheShiNik7CiAgY29uc3QgbGVuZ3RoID0gTWF0aC5taW4oYTUubGVuZ3RoLCBiNi5sZW5ndGgpOwogIGZvciAobGV0IGluZGV4MiA9IDA7IGluZGV4MiA8IGxlbmd0aDsgaW5kZXgyKyspIHsKICAgIGNvbnN0IGRpZmYgPSBhNVtpbmRleDJdIC0gYjZbaW5kZXgyXTsKICAgIGlmIChkaWZmICE9PSAwKSB7CiAgICAgIHJldHVybiBNYXRoLnNpZ24oZGlmZik7CiAgICB9CiAgfQogIHJldHVybiBNYXRoLnNpZ24oYTUubGVuZ3RoIC0gYjYubGVuZ3RoKTsKfQpmdW5jdGlvbiB1aW50OEFycmF5VG9TdHJpbmcoYXJyYXksIGVuY29kaW5nID0gInV0ZjgiKSB7CiAgYXNzZXJ0VWludDhBcnJheU9yQXJyYXlCdWZmZXIoYXJyYXkpOwogIGNhY2hlZERlY29kZXJzW2VuY29kaW5nXSA/Pz0gbmV3IGdsb2JhbFRoaXMuVGV4dERlY29kZXIoZW5jb2RpbmcpOwogIHJldHVybiBjYWNoZWREZWNvZGVyc1tlbmNvZGluZ10uZGVjb2RlKGFycmF5KTsKfQpmdW5jdGlvbiBhc3NlcnRTdHJpbmcodmFsdWUyKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZTIgIT09ICJzdHJpbmciKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcYHN0cmluZ1xgLCBnb3QgXGAke3R5cGVvZiB2YWx1ZTJ9XGBgKTsKICB9Cn0KZnVuY3Rpb24gc3RyaW5nVG9VaW50OEFycmF5KHN0cmluZzMpIHsKICBhc3NlcnRTdHJpbmcoc3RyaW5nMyk7CiAgcmV0dXJuIGNhY2hlZEVuY29kZXIuZW5jb2RlKHN0cmluZzMpOwp9CmZ1bmN0aW9uIGJhc2U2NFRvQmFzZTY0VXJsKGJhc2U2NDIpIHsKICByZXR1cm4gYmFzZTY0Mi5yZXBsYWNlQWxsKCIrIiwgIi0iKS5yZXBsYWNlQWxsKCIvIiwgIl8iKS5yZXBsYWNlKC89KyQvLCAiIik7Cn0KZnVuY3Rpb24gYmFzZTY0VXJsVG9CYXNlNjQoYmFzZTY0dXJsKSB7CiAgY29uc3QgYmFzZTY0MiA9IGJhc2U2NHVybC5yZXBsYWNlQWxsKCItIiwgIisiKS5yZXBsYWNlQWxsKCJfIiwgIi8iKTsKICBjb25zdCBwYWRkaW5nID0gKDQgLSBiYXNlNjQyLmxlbmd0aCAlIDQpICUgNDsKICByZXR1cm4gYmFzZTY0MiArICI9Ii5yZXBlYXQocGFkZGluZyk7Cn0KZnVuY3Rpb24gdWludDhBcnJheVRvQmFzZTY0KGFycmF5LCB7IHVybFNhZmUgPSBmYWxzZSB9ID0ge30pIHsKICBhc3NlcnRVaW50OEFycmF5KGFycmF5KTsKICBsZXQgYmFzZTY0MiA9ICIiOwogIGZvciAobGV0IGluZGV4MiA9IDA7IGluZGV4MiA8IGFycmF5Lmxlbmd0aDsgaW5kZXgyICs9IE1BWF9CTE9DS19TSVpFKSB7CiAgICBjb25zdCBjaHVuayA9IGFycmF5LnN1YmFycmF5KGluZGV4MiwgaW5kZXgyICsgTUFYX0JMT0NLX1NJWkUpOwogICAgYmFzZTY0MiArPSBnbG9iYWxUaGlzLmJ0b2EoU3RyaW5nLmZyb21Db2RlUG9pbnQuYXBwbHkodm9pZCAwLCBjaHVuaykpOwogIH0KICByZXR1cm4gdXJsU2FmZSA/IGJhc2U2NFRvQmFzZTY0VXJsKGJhc2U2NDIpIDogYmFzZTY0MjsKfQpmdW5jdGlvbiBiYXNlNjRUb1VpbnQ4QXJyYXkoYmFzZTY0U3RyaW5nKSB7CiAgYXNzZXJ0U3RyaW5nKGJhc2U2NFN0cmluZyk7CiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShnbG9iYWxUaGlzLmF0b2IoYmFzZTY0VXJsVG9CYXNlNjQoYmFzZTY0U3RyaW5nKSksICh4NCkgPT4geDQuY29kZVBvaW50QXQoMCkpOwp9CmZ1bmN0aW9uIHN0cmluZ1RvQmFzZTY0KHN0cmluZzMsIHsgdXJsU2FmZSA9IGZhbHNlIH0gPSB7fSkgewogIGFzc2VydFN0cmluZyhzdHJpbmczKTsKICByZXR1cm4gdWludDhBcnJheVRvQmFzZTY0KHN0cmluZ1RvVWludDhBcnJheShzdHJpbmczKSwgeyB1cmxTYWZlIH0pOwp9CmZ1bmN0aW9uIGJhc2U2NFRvU3RyaW5nKGJhc2U2NFN0cmluZykgewogIGFzc2VydFN0cmluZyhiYXNlNjRTdHJpbmcpOwogIHJldHVybiB1aW50OEFycmF5VG9TdHJpbmcoYmFzZTY0VG9VaW50OEFycmF5KGJhc2U2NFN0cmluZykpOwp9CmZ1bmN0aW9uIHVpbnQ4QXJyYXlUb0hleChhcnJheSkgewogIGFzc2VydFVpbnQ4QXJyYXkoYXJyYXkpOwogIGxldCBoZXhTdHJpbmcgPSAiIjsKICBmb3IgKGxldCBpbmRleDIgPSAwOyBpbmRleDIgPCBhcnJheS5sZW5ndGg7IGluZGV4MisrKSB7CiAgICBoZXhTdHJpbmcgKz0gYnl0ZVRvSGV4TG9va3VwVGFibGVbYXJyYXlbaW5kZXgyXV07CiAgfQogIHJldHVybiBoZXhTdHJpbmc7Cn0KZnVuY3Rpb24gaGV4VG9VaW50OEFycmF5KGhleFN0cmluZykgewogIGFzc2VydFN0cmluZyhoZXhTdHJpbmcpOwogIGlmIChoZXhTdHJpbmcubGVuZ3RoICUgMiAhPT0gMCkgewogICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIEhleCBzdHJpbmcgbGVuZ3RoLiIpOwogIH0KICBjb25zdCByZXN1bHRMZW5ndGggPSBoZXhTdHJpbmcubGVuZ3RoIC8gMjsKICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KHJlc3VsdExlbmd0aCk7CiAgZm9yIChsZXQgaW5kZXgyID0gMDsgaW5kZXgyIDwgcmVzdWx0TGVuZ3RoOyBpbmRleDIrKykgewogICAgY29uc3QgaGlnaE5pYmJsZSA9IGhleFRvRGVjaW1hbExvb2t1cFRhYmxlW2hleFN0cmluZ1tpbmRleDIgKiAyXV07CiAgICBjb25zdCBsb3dOaWJibGUgPSBoZXhUb0RlY2ltYWxMb29rdXBUYWJsZVtoZXhTdHJpbmdbaW5kZXgyICogMiArIDFdXTsKICAgIGlmIChoaWdoTmliYmxlID09PSB2b2lkIDAgfHwgbG93TmliYmxlID09PSB2b2lkIDApIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEhleCBjaGFyYWN0ZXIgZW5jb3VudGVyZWQgYXQgcG9zaXRpb24gJHtpbmRleDIgKiAyfWApOwogICAgfQogICAgYnl0ZXNbaW5kZXgyXSA9IGhpZ2hOaWJibGUgPDwgNCB8IGxvd05pYmJsZTsKICB9CiAgcmV0dXJuIGJ5dGVzOwp9CmZ1bmN0aW9uIGdldFVpbnRCRSh2aWV3KSB7CiAgY29uc3QgeyBieXRlTGVuZ3RoIH0gPSB2aWV3OwogIGlmIChieXRlTGVuZ3RoID09PSA2KSB7CiAgICByZXR1cm4gdmlldy5nZXRVaW50MTYoMCkgKiAyICoqIDMyICsgdmlldy5nZXRVaW50MzIoMik7CiAgfQogIGlmIChieXRlTGVuZ3RoID09PSA1KSB7CiAgICByZXR1cm4gdmlldy5nZXRVaW50OCgwKSAqIDIgKiogMzIgKyB2aWV3LmdldFVpbnQzMigxKTsKICB9CiAgaWYgKGJ5dGVMZW5ndGggPT09IDQpIHsKICAgIHJldHVybiB2aWV3LmdldFVpbnQzMigwKTsKICB9CiAgaWYgKGJ5dGVMZW5ndGggPT09IDMpIHsKICAgIHJldHVybiB2aWV3LmdldFVpbnQ4KDApICogMiAqKiAxNiArIHZpZXcuZ2V0VWludDE2KDEpOwogIH0KICBpZiAoYnl0ZUxlbmd0aCA9PT0gMikgewogICAgcmV0dXJuIHZpZXcuZ2V0VWludDE2KDApOwogIH0KICBpZiAoYnl0ZUxlbmd0aCA9PT0gMSkgewogICAgcmV0dXJuIHZpZXcuZ2V0VWludDgoMCk7CiAgfQp9CmZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlMikgewogIGNvbnN0IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogIGNvbnN0IHZhbHVlTGVuZ3RoID0gdmFsdWUyLmxlbmd0aDsKICBpZiAodmFsdWVMZW5ndGggPT09IDApIHsKICAgIHJldHVybiAtMTsKICB9CiAgaWYgKHZhbHVlTGVuZ3RoID4gYXJyYXlMZW5ndGgpIHsKICAgIHJldHVybiAtMTsKICB9CiAgY29uc3QgdmFsaWRPZmZzZXRMZW5ndGggPSBhcnJheUxlbmd0aCAtIHZhbHVlTGVuZ3RoOwogIGZvciAobGV0IGluZGV4MiA9IDA7IGluZGV4MiA8PSB2YWxpZE9mZnNldExlbmd0aDsgaW5kZXgyKyspIHsKICAgIGxldCBpc01hdGNoMyA9IHRydWU7CiAgICBmb3IgKGxldCBpbmRleDIyID0gMDsgaW5kZXgyMiA8IHZhbHVlTGVuZ3RoOyBpbmRleDIyKyspIHsKICAgICAgaWYgKGFycmF5W2luZGV4MiArIGluZGV4MjJdICE9PSB2YWx1ZTJbaW5kZXgyMl0pIHsKICAgICAgICBpc01hdGNoMyA9IGZhbHNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoaXNNYXRjaDMpIHsKICAgICAgcmV0dXJuIGluZGV4MjsKICAgIH0KICB9CiAgcmV0dXJuIC0xOwp9CmZ1bmN0aW9uIGluY2x1ZGVzKGFycmF5LCB2YWx1ZTIpIHsKICByZXR1cm4gaW5kZXhPZihhcnJheSwgdmFsdWUyKSAhPT0gLTE7Cn0KdmFyIG9iamVjdFRvU3RyaW5nLCB1aW50OEFycmF5U3RyaW5naWZpZWQsIGFycmF5QnVmZmVyU3RyaW5naWZpZWQsIGNhY2hlZERlY29kZXJzLCBjYWNoZWRFbmNvZGVyLCBNQVhfQkxPQ0tfU0laRSwgYnl0ZVRvSGV4TG9va3VwVGFibGUsIGhleFRvRGVjaW1hbExvb2t1cFRhYmxlOwp2YXIgaW5pdF91aW50OGFycmF5X2V4dHJhcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3VpbnQ4YXJyYXktZXh0cmFzQDEuNS4wL25vZGVfbW9kdWxlcy91aW50OGFycmF5LWV4dHJhcy9pbmRleC5qcyIoKSB7CiAgICBvYmplY3RUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CiAgICB1aW50OEFycmF5U3RyaW5naWZpZWQgPSAiW29iamVjdCBVaW50OEFycmF5XSI7CiAgICBhcnJheUJ1ZmZlclN0cmluZ2lmaWVkID0gIltvYmplY3QgQXJyYXlCdWZmZXJdIjsKICAgIGNhY2hlZERlY29kZXJzID0gewogICAgICB1dGY4OiBuZXcgZ2xvYmFsVGhpcy5UZXh0RGVjb2RlcigidXRmOCIpCiAgICB9OwogICAgY2FjaGVkRW5jb2RlciA9IG5ldyBnbG9iYWxUaGlzLlRleHRFbmNvZGVyKCk7CiAgICBNQVhfQkxPQ0tfU0laRSA9IDY1NTM1OwogICAgYnl0ZVRvSGV4TG9va3VwVGFibGUgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyNTYgfSwgKF81LCBpbmRleDIpID0+IGluZGV4Mi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgIjAiKSk7CiAgICBoZXhUb0RlY2ltYWxMb29rdXBUYWJsZSA9IHsKICAgICAgMDogMCwKICAgICAgMTogMSwKICAgICAgMjogMiwKICAgICAgMzogMywKICAgICAgNDogNCwKICAgICAgNTogNSwKICAgICAgNjogNiwKICAgICAgNzogNywKICAgICAgODogOCwKICAgICAgOTogOSwKICAgICAgYTogMTAsCiAgICAgIGI6IDExLAogICAgICBjOiAxMiwKICAgICAgZDogMTMsCiAgICAgIGU6IDE0LAogICAgICBmOiAxNSwKICAgICAgQTogMTAsCiAgICAgIEI6IDExLAogICAgICBDOiAxMiwKICAgICAgRDogMTMsCiAgICAgIEU6IDE0LAogICAgICBGOiAxNQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0YnVmZmVyQDMuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGJ1ZmZlci9kaXN0X3RzL3NtYXJ0YnVmZmVyLnBsdWdpbnMuanMKdmFyIGluaXRfc21hcnRidWZmZXJfcGx1Z2lucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0YnVmZmVyQDMuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGJ1ZmZlci9kaXN0X3RzL3NtYXJ0YnVmZmVyLnBsdWdpbnMuanMiKCkgewogICAgaW5pdF91aW50OGFycmF5X2V4dHJhcygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRidWZmZXJAMy4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0YnVmZmVyL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czEwID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czEwLCB7CiAgYmFzZTY0VG9VaW50OEFycmF5OiAoKSA9PiBiYXNlNjRUb1VpbnQ4QXJyYXkyLAogIGVuc3VyZVB1cmVVaW50OEFycmF5OiAoKSA9PiBlbnN1cmVQdXJlVWludDhBcnJheSwKICBpc0J1ZmZlckxpa2U6ICgpID0+IGlzQnVmZmVyTGlrZSwKICBpc1VpbnQ4QXJyYXk6ICgpID0+IGlzVWludDhBcnJheTIsCiAgdUludDhBcnJheUV4dHJhczogKCkgPT4gdUludDhBcnJheUV4dHJhcywKICB1SW50OEFycmF5VG9CYXNlNjQ6ICgpID0+IHVJbnQ4QXJyYXlUb0Jhc2U2NAp9KTsKZnVuY3Rpb24gdUludDhBcnJheVRvQmFzZTY0KHVJbnQ4QXJyYXkpIHsKICByZXR1cm4gdWludDhhcnJheV9leHRyYXNfZXhwb3J0cy51aW50OEFycmF5VG9CYXNlNjQodUludDhBcnJheSk7Cn0KZnVuY3Rpb24gYmFzZTY0VG9VaW50OEFycmF5MihiYXNlNjQyKSB7CiAgcmV0dXJuIHVpbnQ4YXJyYXlfZXh0cmFzX2V4cG9ydHMuYmFzZTY0VG9VaW50OEFycmF5KGJhc2U2NDIpOwp9CmZ1bmN0aW9uIGlzQnVmZmVyTGlrZShvYmopIHsKICBpZiAob2JqICYmIHR5cGVvZiBvYmouYnl0ZUxlbmd0aCA9PT0gIm51bWJlciIpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gInVuZGVmaW5lZCIgJiYgQnVmZmVyLmlzQnVmZmVyKSB7CiAgICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaik7CiAgfQogIHJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBlbnN1cmVQdXJlVWludDhBcnJheShidWZmZXJBcmcpIHsKICBjb25zdCB1aW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyQXJnLmxlbmd0aCk7CiAgdWludDhBcnJheS5zZXQoYnVmZmVyQXJnKTsKICByZXR1cm4gdWludDhBcnJheTsKfQp2YXIgdUludDhBcnJheUV4dHJhcywgaXNVaW50OEFycmF5MjsKdmFyIGluaXRfZGlzdF90czEwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRidWZmZXJAMy4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0YnVmZmVyL2Rpc3RfdHMvaW5kZXguanMiKCkgewogICAgaW5pdF9zbWFydGJ1ZmZlcl9wbHVnaW5zKCk7CiAgICB1SW50OEFycmF5RXh0cmFzID0gdWludDhhcnJheV9leHRyYXNfZXhwb3J0czsKICAgIGlzVWludDhBcnJheTIgPSAob2JqKSA9PiB7CiAgICAgIHJldHVybiB1aW50OGFycmF5X2V4dHJhc19leHBvcnRzLmlzVWludDhBcnJheShvYmopOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0Z3VhcmRAMy4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0Z3VhcmQvZGlzdF90cy9zbWFydGd1YXJkLnBsdWdpbnMuanMKdmFyIGluaXRfc21hcnRndWFyZF9wbHVnaW5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRndWFyZEAzLjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRndWFyZC9kaXN0X3RzL3NtYXJ0Z3VhcmQucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0Z3VhcmRAMy4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0Z3VhcmQvZGlzdF90cy9jbGFzc2VzLmd1YXJkLmpzCnZhciBHdWFyZDsKdmFyIGluaXRfY2xhc3Nlc19ndWFyZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0Z3VhcmRAMy4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0Z3VhcmQvZGlzdF90cy9jbGFzc2VzLmd1YXJkLmpzIigpIHsKICAgIGluaXRfc21hcnRndWFyZF9wbHVnaW5zKCk7CiAgICBHdWFyZCA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoZ3VhcmRGdW5jdGlvbkFyZywgb3B0aW9uc0FyZykgewogICAgICAgIHRoaXMuZ3VhcmRGdW5jdGlvbiA9IGd1YXJkRnVuY3Rpb25Bcmc7CiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc0FyZzsKICAgICAgfQogICAgICAvKioKICAgICAgICogZXhlY3V0ZXMgdGhlIGd1YXJkIGFnYWluc3QgYSBkYXRhIGFyZ3VtZW50OwogICAgICAgKiBAcGFyYW0gZGF0YUFyZwogICAgICAgKi8KICAgICAgYXN5bmMgZXhlYyhkYXRhQXJnKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ndWFyZEZ1bmN0aW9uKGRhdGFBcmcpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgYXN5bmMgZ2V0RmFpbGVkSGludChkYXRhQXJnKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjKGRhdGFBcmcpOwogICAgICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZhaWxlZEhpbnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0Z3VhcmRAMy4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0Z3VhcmQvZGlzdF90cy9jbGFzc2VzLmd1YXJkZXJyb3IuanMKdmFyIEd1YXJkRXJyb3I7CnZhciBpbml0X2NsYXNzZXNfZ3VhcmRlcnJvciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0Z3VhcmRAMy4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0Z3VhcmQvZGlzdF90cy9jbGFzc2VzLmd1YXJkZXJyb3IuanMiKCkgewogICAgaW5pdF9zbWFydGd1YXJkX3BsdWdpbnMoKTsKICAgIEd1YXJkRXJyb3IgPSBjbGFzcyBleHRlbmRzIEVycm9yIHsKICAgICAgY29uc3RydWN0b3IobWVzc2FnZTIpIHsKICAgICAgICBzdXBlcihtZXNzYWdlMik7CiAgICAgICAgdGhpcy5uYW1lID0gIkd1YXJkRXJyb3IiOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRndWFyZEAzLjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRndWFyZC9kaXN0X3RzL2NsYXNzZXMuZ3VhcmRzZXQuanMKdmFyIEd1YXJkU2V0Owp2YXIgaW5pdF9jbGFzc2VzX2d1YXJkc2V0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRndWFyZEAzLjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRndWFyZC9kaXN0X3RzL2NsYXNzZXMuZ3VhcmRzZXQuanMiKCkgewogICAgaW5pdF9zbWFydGd1YXJkX3BsdWdpbnMoKTsKICAgIGluaXRfY2xhc3Nlc19ndWFyZCgpOwogICAgR3VhcmRTZXQgPSBjbGFzcyBleHRlbmRzIEd1YXJkIHsKICAgICAgY29uc3RydWN0b3IoZ3VhcmRBcnJheSA9IFtdKSB7CiAgICAgICAgc3VwZXIoYXN5bmMgKGRhdGFBcmcpID0+IHsKICAgICAgICAgIHJldHVybiB0aGlzLmFsbEd1YXJkc1Bhc3MoZGF0YUFyZyk7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5ndWFyZHMgPSBndWFyZEFycmF5OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBleGVjdXRlcyBhbGwgZ3VhcmRzIGluIGFsbCBndWFyZFNldHMgYWdhaW5zdCBhIGRhdGEgYXJndW1lbnQKICAgICAgICogQHBhcmFtIGRhdGFBcmcKICAgICAgICovCiAgICAgIGFzeW5jIGV4ZWNBbGxXaXRoRGF0YShkYXRhQXJnLCBvcHRpb25zQXJnID0gewogICAgICAgIG1vZGU6ICJwYXJhbGxlbCIsCiAgICAgICAgc3RvcE9uRmFpbDogZmFsc2UKICAgICAgfSkgewogICAgICAgIGNvbnN0IHJlc3VsdFByb21pc2VzID0gW107CiAgICAgICAgZm9yIChjb25zdCBndWFyZCBvZiB0aGlzLmd1YXJkcykgewogICAgICAgICAgY29uc3QgZ3VhcmRSZXN1bHRQcm9taXNlID0gZ3VhcmQuZXhlYyhkYXRhQXJnKTsKICAgICAgICAgIGlmIChvcHRpb25zQXJnLm1vZGUgPT09ICJzZXJpYWwiKSB7CiAgICAgICAgICAgIGF3YWl0IGd1YXJkUmVzdWx0UHJvbWlzZTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdFByb21pc2VzLnB1c2goZ3VhcmRSZXN1bHRQcm9taXNlKTsKICAgICAgICAgIGlmIChvcHRpb25zQXJnLnN0b3BPbkZhaWwpIHsKICAgICAgICAgICAgaWYgKCFhd2FpdCBndWFyZFJlc3VsdFByb21pc2UpIHsKICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwocmVzdWx0UHJvbWlzZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChyZXN1bHRQcm9taXNlcyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNoZWNrcyBpZiBhbGwgZ3VhcmRzIHBhc3MKICAgICAgICogQHBhcmFtIGRhdGFBcmcKICAgICAgICovCiAgICAgIGFzeW5jIGFsbEd1YXJkc1Bhc3MoZGF0YUFyZywgb3B0aW9uc0FyZyA9IHsKICAgICAgICBtb2RlOiAicGFyYWxsZWwiLAogICAgICAgIHN0b3BPbkZhaWw6IGZhbHNlCiAgICAgIH0pIHsKICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5leGVjQWxsV2l0aERhdGEoZGF0YUFyZywgb3B0aW9uc0FyZyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdHMuZXZlcnkoKHJlc3VsdCkgPT4gcmVzdWx0KTsKICAgICAgfQogICAgICAvKioKICAgICAgICogY2hlY2tzIGlmIGFueSBndWFyZCBwYXNzZXMKICAgICAgICogQHBhcmFtIGRhdGFBcmcKICAgICAgICovCiAgICAgIGFzeW5jIGFueUd1YXJkc1Bhc3MoZGF0YUFyZykgewogICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmV4ZWNBbGxXaXRoRGF0YShkYXRhQXJnLCB7CiAgICAgICAgICBtb2RlOiAicGFyYWxsZWwiLAogICAgICAgICAgc3RvcE9uRmFpbDogZmFsc2UKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcmVzdWx0cy5zb21lKChyZXN1bHQpID0+IHJlc3VsdCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHJldHVybnMgdGhlIGZpcnN0IHJlYXNvbiBmb3Igd2h5IHNvbWV0aGluZyBmYWlscwogICAgICAgKiBAcGFyYW0gZGF0YUFyZwogICAgICAgKiBAcmV0dXJucwogICAgICAgKi8KICAgICAgZ2V0RmFpbGVkSGludChkYXRhQXJnKSB7CiAgICAgICAgZm9yIChjb25zdCBndWFyZCBvZiB0aGlzLmd1YXJkcykgewogICAgICAgICAgY29uc3QgZmFpbGVkSGludCA9IGd1YXJkLmdldEZhaWxlZEhpbnQoZGF0YUFyZyk7CiAgICAgICAgICBpZiAoZmFpbGVkSGludCkgewogICAgICAgICAgICByZXR1cm4gZmFpbGVkSGludDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGd1YXJkQDMuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGd1YXJkL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czExID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czExLCB7CiAgR3VhcmQ6ICgpID0+IEd1YXJkLAogIEd1YXJkRXJyb3I6ICgpID0+IEd1YXJkRXJyb3IsCiAgR3VhcmRTZXQ6ICgpID0+IEd1YXJkU2V0LAogIHBhc3NHdWFyZHNPclJlamVjdDogKCkgPT4gcGFzc0d1YXJkc09yUmVqZWN0Cn0pOwp2YXIgcGFzc0d1YXJkc09yUmVqZWN0Owp2YXIgaW5pdF9kaXN0X3RzMTEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGd1YXJkQDMuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGd1YXJkL2Rpc3RfdHMvaW5kZXguanMiKCkgewogICAgaW5pdF9zbWFydGd1YXJkX3BsdWdpbnMoKTsKICAgIGluaXRfY2xhc3Nlc19ndWFyZCgpOwogICAgaW5pdF9jbGFzc2VzX2d1YXJkZXJyb3IoKTsKICAgIGluaXRfY2xhc3Nlc19ndWFyZCgpOwogICAgaW5pdF9jbGFzc2VzX2d1YXJkc2V0KCk7CiAgICBpbml0X2NsYXNzZXNfZ3VhcmRzZXQoKTsKICAgIGluaXRfY2xhc3Nlc19ndWFyZGVycm9yKCk7CiAgICBwYXNzR3VhcmRzT3JSZWplY3QgPSBhc3luYyAoZGF0YUFyZywgZ3VhcmRzKSA9PiB7CiAgICAgIGNvbnN0IGd1YXJkU2V0ID0gbmV3IEd1YXJkU2V0KGd1YXJkcyk7CiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGd1YXJkU2V0LmFsbEd1YXJkc1Bhc3MoZGF0YUFyZyk7CiAgICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgY29uc3QgZmFpbGVkSGludCA9IGF3YWl0IGd1YXJkU2V0LmdldEZhaWxlZEhpbnQoZGF0YUFyZyk7CiAgICAgICAgdGhyb3cgbmV3IEd1YXJkRXJyb3IoYEd1YXJkcyBmYWlsZWQ6CiR7ZmFpbGVkSGludH0KICAgIGApOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvaW50ZXJjZXB0b3JzL2ludGVyY2VwdG9yLm1hbmFnZXIuanMKdmFyIEludGVyY2VwdG9yTWFuYWdlcjsKdmFyIGluaXRfaW50ZXJjZXB0b3JfbWFuYWdlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnJlcXVlc3RANC4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnJlcXVlc3QvZGlzdF90cy9pbnRlcmNlcHRvcnMvaW50ZXJjZXB0b3IubWFuYWdlci5qcyIoKSB7CiAgICBJbnRlcmNlcHRvck1hbmFnZXIgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMucmVxdWVzdEludGVyY2VwdG9ycyA9IFtdOwogICAgICAgIHRoaXMucmVzcG9uc2VJbnRlcmNlcHRvcnMgPSBbXTsKICAgICAgICB0aGlzLmVycm9ySW50ZXJjZXB0b3JzID0gW107CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEFkZCBhIHJlcXVlc3QgaW50ZXJjZXB0b3IKICAgICAgICovCiAgICAgIGFkZFJlcXVlc3RJbnRlcmNlcHRvcihpbnRlcmNlcHRvcikgewogICAgICAgIHRoaXMucmVxdWVzdEludGVyY2VwdG9ycy5wdXNoKGludGVyY2VwdG9yKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQWRkIGEgcmVzcG9uc2UgaW50ZXJjZXB0b3IKICAgICAgICovCiAgICAgIGFkZFJlc3BvbnNlSW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpIHsKICAgICAgICB0aGlzLnJlc3BvbnNlSW50ZXJjZXB0b3JzLnB1c2goaW50ZXJjZXB0b3IpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBBZGQgYW4gZXJyb3IgaW50ZXJjZXB0b3IKICAgICAgICovCiAgICAgIGFkZEVycm9ySW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpIHsKICAgICAgICB0aGlzLmVycm9ySW50ZXJjZXB0b3JzLnB1c2goaW50ZXJjZXB0b3IpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZW1vdmUgYSByZXF1ZXN0IGludGVyY2VwdG9yCiAgICAgICAqLwogICAgICByZW1vdmVSZXF1ZXN0SW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpIHsKICAgICAgICBjb25zdCBpbmRleDIgPSB0aGlzLnJlcXVlc3RJbnRlcmNlcHRvcnMuaW5kZXhPZihpbnRlcmNlcHRvcik7CiAgICAgICAgaWYgKGluZGV4MiA+IC0xKSB7CiAgICAgICAgICB0aGlzLnJlcXVlc3RJbnRlcmNlcHRvcnMuc3BsaWNlKGluZGV4MiwgMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZW1vdmUgYSByZXNwb25zZSBpbnRlcmNlcHRvcgogICAgICAgKi8KICAgICAgcmVtb3ZlUmVzcG9uc2VJbnRlcmNlcHRvcihpbnRlcmNlcHRvcikgewogICAgICAgIGNvbnN0IGluZGV4MiA9IHRoaXMucmVzcG9uc2VJbnRlcmNlcHRvcnMuaW5kZXhPZihpbnRlcmNlcHRvcik7CiAgICAgICAgaWYgKGluZGV4MiA+IC0xKSB7CiAgICAgICAgICB0aGlzLnJlc3BvbnNlSW50ZXJjZXB0b3JzLnNwbGljZShpbmRleDIsIDEpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogUmVtb3ZlIGFuIGVycm9yIGludGVyY2VwdG9yCiAgICAgICAqLwogICAgICByZW1vdmVFcnJvckludGVyY2VwdG9yKGludGVyY2VwdG9yKSB7CiAgICAgICAgY29uc3QgaW5kZXgyID0gdGhpcy5lcnJvckludGVyY2VwdG9ycy5pbmRleE9mKGludGVyY2VwdG9yKTsKICAgICAgICBpZiAoaW5kZXgyID4gLTEpIHsKICAgICAgICAgIHRoaXMuZXJyb3JJbnRlcmNlcHRvcnMuc3BsaWNlKGluZGV4MiwgMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDbGVhciBhbGwgaW50ZXJjZXB0b3JzCiAgICAgICAqLwogICAgICBjbGVhckFsbCgpIHsKICAgICAgICB0aGlzLnJlcXVlc3RJbnRlcmNlcHRvcnMgPSBbXTsKICAgICAgICB0aGlzLnJlc3BvbnNlSW50ZXJjZXB0b3JzID0gW107CiAgICAgICAgdGhpcy5lcnJvckludGVyY2VwdG9ycyA9IFtdOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBQcm9jZXNzIHJlcXVlc3QgdGhyb3VnaCBhbGwgcmVxdWVzdCBpbnRlcmNlcHRvcnMKICAgICAgICovCiAgICAgIGFzeW5jIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3QpIHsKICAgICAgICBsZXQgcHJvY2Vzc2VkUmVxdWVzdCA9IHJlcXVlc3Q7CiAgICAgICAgZm9yIChjb25zdCBpbnRlcmNlcHRvciBvZiB0aGlzLnJlcXVlc3RJbnRlcmNlcHRvcnMpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHByb2Nlc3NlZFJlcXVlc3QgPSBhd2FpdCBpbnRlcmNlcHRvcihwcm9jZXNzZWRSZXF1ZXN0KTsKICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHRocm93IGF3YWl0IHRoaXMucHJvY2Vzc0Vycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm9jZXNzZWRSZXF1ZXN0OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBQcm9jZXNzIHJlc3BvbnNlIHRocm91Z2ggYWxsIHJlc3BvbnNlIGludGVyY2VwdG9ycwogICAgICAgKi8KICAgICAgYXN5bmMgcHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKSB7CiAgICAgICAgbGV0IHByb2Nlc3NlZFJlc3BvbnNlID0gcmVzcG9uc2U7CiAgICAgICAgZm9yIChjb25zdCBpbnRlcmNlcHRvciBvZiB0aGlzLnJlc3BvbnNlSW50ZXJjZXB0b3JzKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBwcm9jZXNzZWRSZXNwb25zZSA9IGF3YWl0IGludGVyY2VwdG9yKHByb2Nlc3NlZFJlc3BvbnNlKTsKICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHRocm93IGF3YWl0IHRoaXMucHJvY2Vzc0Vycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm9jZXNzZWRSZXNwb25zZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogUHJvY2VzcyBlcnJvciB0aHJvdWdoIGFsbCBlcnJvciBpbnRlcmNlcHRvcnMKICAgICAgICovCiAgICAgIGFzeW5jIHByb2Nlc3NFcnJvcihlcnJvcikgewogICAgICAgIGxldCBwcm9jZXNzZWRFcnJvciA9IGVycm9yOwogICAgICAgIGZvciAoY29uc3QgaW50ZXJjZXB0b3Igb2YgdGhpcy5lcnJvckludGVyY2VwdG9ycykgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcHJvY2Vzc2VkRXJyb3IgPSBhd2FpdCBpbnRlcmNlcHRvcihwcm9jZXNzZWRFcnJvcik7CiAgICAgICAgICB9IGNhdGNoIChuZXdFcnJvcikgewogICAgICAgICAgICBwcm9jZXNzZWRFcnJvciA9IG5ld0Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBuZXdFcnJvciA6IG5ldyBFcnJvcihTdHJpbmcobmV3RXJyb3IpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEVycm9yOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBHZXQgY291bnQgb2YgcmVnaXN0ZXJlZCBpbnRlcmNlcHRvcnMKICAgICAgICovCiAgICAgIGdldEludGVyY2VwdG9yQ291bnRzKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3RJbnRlcmNlcHRvcnMubGVuZ3RoLAogICAgICAgICAgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2VJbnRlcmNlcHRvcnMubGVuZ3RoLAogICAgICAgICAgZXJyb3I6IHRoaXMuZXJyb3JJbnRlcmNlcHRvcnMubGVuZ3RoCiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0ZW52QDYuMC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGVudi9kaXN0X3RzL3NtYXJ0ZW52LnBsdWdpbnMuanMKdmFyIGluaXRfc21hcnRlbnZfcGx1Z2lucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0ZW52QDYuMC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGVudi9kaXN0X3RzL3NtYXJ0ZW52LnBsdWdpbnMuanMiKCkgewogICAgaW5pdF9kaXN0X3RzKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGVudkA2LjAuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRlbnYvZGlzdF90cy9pbnRlcmZhY2VzL2luZGV4LmpzCnZhciBpbml0X2ludGVyZmFjZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGVudkA2LjAuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRlbnYvZGlzdF90cy9pbnRlcmZhY2VzL2luZGV4LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0ZW52QDYuMC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGVudi9kaXN0X3RzL3NtYXJ0ZW52LmNsYXNzZXMuc21hcnRlbnYuanMKdmFyIFNtYXJ0ZW52Owp2YXIgaW5pdF9zbWFydGVudl9jbGFzc2VzX3NtYXJ0ZW52ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRlbnZANi4wLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0ZW52L2Rpc3RfdHMvc21hcnRlbnYuY2xhc3Nlcy5zbWFydGVudi5qcyIoKSB7CiAgICBpbml0X3NtYXJ0ZW52X3BsdWdpbnMoKTsKICAgIGluaXRfaW50ZXJmYWNlcygpOwogICAgU21hcnRlbnYgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMubG9hZGVkU2NyaXB0cyA9IFtdOwogICAgICB9CiAgICAgIGFzeW5jIGdldEVudkF3YXJlTW9kdWxlKG9wdGlvbnNBcmcpIHsKICAgICAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgICAgIGNvbnN0IG1vZHVsZVJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0U2FmZU5vZGVNb2R1bGUob3B0aW9uc0FyZy5ub2RlTW9kdWxlTmFtZSk7CiAgICAgICAgICByZXR1cm4gbW9kdWxlUmVzdWx0OwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0Jyb3dzZXIpIHsKICAgICAgICAgIGNvbnN0IG1vZHVsZVJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0U2FmZVdlYk1vZHVsZShvcHRpb25zQXJnLndlYlVybEFyZywgb3B0aW9uc0FyZy5nZXRGdW5jdGlvbik7CiAgICAgICAgICByZXR1cm4gbW9kdWxlUmVzdWx0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCJwbGF0Zm9ybSBmb3IgbG9hZGluZyBub3Qgc3VwcG9ydGVkIGJ5IHNtYXJ0ZW52Iik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIGdldFNhZmVOb2RlTW9kdWxlKG1vZHVsZU5hbWVBcmcsIHJ1bkFmdGVyRnVuYykgewogICAgICAgIGlmICghdGhpcy5pc05vZGUgJiYgIXRoaXMuaXNEZW5vICYmICF0aGlzLmlzQnVuKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKGBZb3UgdHJpZWQgdG8gbG9hZCBhIHNlcnZlciBtb2R1bGUgaW4gYSB3cm9uZyBjb250ZXh0OiAke21vZHVsZU5hbWVBcmd9LiBUaGlzIGRvZXMgbm90IHRocm93LmApOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGF3YWl0IG5ldyBGdW5jdGlvbihgcmV0dXJuIGltcG9ydCgnJHttb2R1bGVOYW1lQXJnfScpYCkoKTsKICAgICAgICBpZiAocnVuQWZ0ZXJGdW5jKSB7CiAgICAgICAgICBhd2FpdCBydW5BZnRlckZ1bmMocmV0dXJuVmFsdWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CiAgICAgIH0KICAgICAgYXN5bmMgZ2V0U2FmZVdlYk1vZHVsZSh1cmxBcmcsIGdldEZ1bmN0aW9uQXJnKSB7CiAgICAgICAgaWYgKCF0aGlzLmlzQnJvd3NlcikgewogICAgICAgICAgY29uc29sZS5lcnJvcigiWW91IHRyaWVkIHRvIGxvYWQgYSB3ZWIgbW9kdWxlIGluIGEgd3JvbmcgY29udGV4dCIpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5sb2FkZWRTY3JpcHRzLmluY2x1ZGVzKHVybEFyZykpIHsKICAgICAgICAgIHJldHVybiBnZXRGdW5jdGlvbkFyZygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmxvYWRlZFNjcmlwdHMucHVzaCh1cmxBcmcpOwogICAgICAgIH0KICAgICAgICBjb25zdCBkb25lID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICAgICAgaWYgKGdsb2JhbFRoaXMuaW1wb3J0U2NyaXB0cykgewogICAgICAgICAgZ2xvYmFsVGhpcy5pbXBvcnRTY3JpcHRzKHVybEFyZyk7CiAgICAgICAgICBkb25lLnJlc29sdmUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4gewogICAgICAgICAgICBkb25lLnJlc29sdmUoKTsKICAgICAgICAgIH07CiAgICAgICAgICBzY3JpcHQuc3JjID0gdXJsQXJnOwogICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgICAgIH0KICAgICAgICBhd2FpdCBkb25lLnByb21pc2U7CiAgICAgICAgcmV0dXJuIGdldEZ1bmN0aW9uQXJnKCk7CiAgICAgIH0KICAgICAgZ2V0IHJ1bnRpbWVFbnYoKSB7CiAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLkRlbm8gIT09ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBnbG9iYWxUaGlzLkRlbm8/LnZlcnNpb24gIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICByZXR1cm4gImRlbm8iOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMuQnVuICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgZ2xvYmFsVGhpcy5CdW4/LnZlcnNpb24gIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICByZXR1cm4gImJ1biI7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy5wcm9jZXNzICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgZ2xvYmFsVGhpcy5wcm9jZXNzPy52ZXJzaW9ucz8ubm9kZSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgIHJldHVybiAibm9kZSI7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy53aW5kb3cgIT09ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBnbG9iYWxUaGlzLmRvY3VtZW50ICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgcmV0dXJuICJicm93c2VyIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJicm93c2VyIjsKICAgICAgfQogICAgICBnZXQgaXNCcm93c2VyKCkgewogICAgICAgIHJldHVybiB0aGlzLnJ1bnRpbWVFbnYgPT09ICJicm93c2VyIjsKICAgICAgfQogICAgICBnZXQgaXNOb2RlKCkgewogICAgICAgIHJldHVybiB0aGlzLnJ1bnRpbWVFbnYgPT09ICJub2RlIjsKICAgICAgfQogICAgICBnZXQgaXNEZW5vKCkgewogICAgICAgIHJldHVybiB0aGlzLnJ1bnRpbWVFbnYgPT09ICJkZW5vIjsKICAgICAgfQogICAgICBnZXQgaXNCdW4oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucnVudGltZUVudiA9PT0gImJ1biI7CiAgICAgIH0KICAgICAgZ2V0IHVzZXJBZ2VudCgpIHsKICAgICAgICBpZiAodGhpcy5pc0Jyb3dzZXIpIHsKICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gInVuZGVmaW5lZCI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGdldCBub2RlVmVyc2lvbigpIHsKICAgICAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgICAgIHJldHVybiBwcm9jZXNzLnZlcnNpb247CiAgICAgICAgfQogICAgICAgIHJldHVybiAidW5kZWZpbmVkIjsKICAgICAgfQogICAgICBnZXQgZGVub1ZlcnNpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuaXNEZW5vKSB7CiAgICAgICAgICByZXR1cm4gZ2xvYmFsVGhpcy5EZW5vLnZlcnNpb24uZGVubzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJ1bmRlZmluZWQiOwogICAgICB9CiAgICAgIGdldCBidW5WZXJzaW9uKCkgewogICAgICAgIGlmICh0aGlzLmlzQnVuKSB7CiAgICAgICAgICByZXR1cm4gZ2xvYmFsVGhpcy5CdW4udmVyc2lvbjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJ1bmRlZmluZWQiOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBMb2FkIGEgbW9kdWxlIG9ubHkgaWYgdGhlIGN1cnJlbnQgcnVudGltZSBtYXRjaGVzIHRoZSB0YXJnZXQgcnVudGltZShzKQogICAgICAgKiBAcGFyYW0gdGFyZ2V0IC0gU2luZ2xlIHJ1bnRpbWUsIGFycmF5IG9mIHJ1bnRpbWVzLCBvciAnc2VydmVyJyBmb3IgYWxsIHNlcnZlci1zaWRlIHJ1bnRpbWVzCiAgICAgICAqIEBwYXJhbSBtb2R1bGVOYW1lT3JVcmwgLSBNb2R1bGUgbmFtZSAoZm9yIE5vZGUvRGVuby9CdW4pIG9yIFVSTCAoZm9yIGJyb3dzZXIpCiAgICAgICAqIEBwYXJhbSBnZXRGdW5jdGlvbiAtIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBtb2R1bGUgaW4gYnJvd3NlciBjb250ZXh0CiAgICAgICAqIEByZXR1cm5zIFRoZSBsb2FkZWQgbW9kdWxlIG9yIHVuZGVmaW5lZCBpZiBydW50aW1lIGRvZXNuJ3QgbWF0Y2gKICAgICAgICovCiAgICAgIGFzeW5jIGdldFNhZmVNb2R1bGVGb3IodGFyZ2V0LCBtb2R1bGVOYW1lT3JVcmwsIGdldEZ1bmN0aW9uKSB7CiAgICAgICAgbGV0IHRhcmdldFJ1bnRpbWVzOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHsKICAgICAgICAgIHRhcmdldFJ1bnRpbWVzID0gdGFyZ2V0LmZsYXRNYXAoKHQ5KSA9PiB0OSA9PT0gInNlcnZlciIgPyBbIm5vZGUiLCAiZGVubyIsICJidW4iXSA6IFt0OV0pOwogICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09PSAic2VydmVyIikgewogICAgICAgICAgdGFyZ2V0UnVudGltZXMgPSBbIm5vZGUiLCAiZGVubyIsICJidW4iXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGFyZ2V0UnVudGltZXMgPSBbdGFyZ2V0XTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0YXJnZXRSdW50aW1lcy5pbmNsdWRlcyh0aGlzLnJ1bnRpbWVFbnYpKSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oYE1vZHVsZSAiJHttb2R1bGVOYW1lT3JVcmx9IiByZXF1ZXN0ZWQgZm9yIHJ1bnRpbWUocykgWyR7dGFyZ2V0UnVudGltZXMuam9pbigiLCAiKX1dIGJ1dCBjdXJyZW50IHJ1bnRpbWUgaXMgIiR7dGhpcy5ydW50aW1lRW52fSIuIFNraXBwaW5nIGxvYWQuYCk7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5pc05vZGUgfHwgdGhpcy5pc0Rlbm8gfHwgdGhpcy5pc0J1bikgewogICAgICAgICAgY29uc3QgbW9kdWxlUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRTYWZlTm9kZU1vZHVsZShtb2R1bGVOYW1lT3JVcmwpOwogICAgICAgICAgcmV0dXJuIG1vZHVsZVJlc3VsdDsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNCcm93c2VyKSB7CiAgICAgICAgICBpZiAoIWdldEZ1bmN0aW9uKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEJyb3dzZXIgbW9kdWxlIGxvYWQgcmVxdWlyZXMgZ2V0RnVuY3Rpb24gcGFyYW1ldGVyIGZvciAiJHttb2R1bGVOYW1lT3JVcmx9ImApOwogICAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgbW9kdWxlUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRTYWZlV2ViTW9kdWxlKG1vZHVsZU5hbWVPclVybCwgZ2V0RnVuY3Rpb24pOwogICAgICAgICAgcmV0dXJuIG1vZHVsZVJlc3VsdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgfQogICAgICBnZXQgaXNDSSgpIHsKICAgICAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5DSSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICBhc3luYyBpc01hY0FzeW5jKCkgewogICAgICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICAgICAgY29uc3Qgb3MgPSBhd2FpdCB0aGlzLmdldFNhZmVOb2RlTW9kdWxlKCJvcyIpOwogICAgICAgICAgcmV0dXJuIG9zLnBsYXRmb3JtKCkgPT09ICJkYXJ3aW4iOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIGlzV2luZG93c0FzeW5jKCkgewogICAgICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICAgICAgY29uc3Qgb3MgPSBhd2FpdCB0aGlzLmdldFNhZmVOb2RlTW9kdWxlKCJvcyIpOwogICAgICAgICAgcmV0dXJuIG9zLnBsYXRmb3JtKCkgPT09ICJ3aW4zMiI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYXN5bmMgaXNMaW51eEFzeW5jKCkgewogICAgICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICAgICAgY29uc3Qgb3MgPSBhd2FpdCB0aGlzLmdldFNhZmVOb2RlTW9kdWxlKCJvcyIpOwogICAgICAgICAgcmV0dXJuIG9zLnBsYXRmb3JtKCkgPT09ICJsaW51eCI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHByaW50cyB0aGUgZW52aXJvbm1lbnQgdG8gY29uc29sZQogICAgICAgKi8KICAgICAgYXN5bmMgcHJpbnRFbnYoKSB7CiAgICAgICAgaWYgKHRoaXMuaXNOb2RlKSB7CiAgICAgICAgICBjb25zb2xlLmxvZygicnVubmluZyBvbiBOT0RFIik7CiAgICAgICAgICBjb25zb2xlLmxvZygibm9kZSB2ZXJzaW9uIGlzICIgKyB0aGlzLm5vZGVWZXJzaW9uKTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNEZW5vKSB7CiAgICAgICAgICBjb25zb2xlLmxvZygicnVubmluZyBvbiBERU5PIik7CiAgICAgICAgICBjb25zb2xlLmxvZygiZGVubyB2ZXJzaW9uIGlzICIgKyB0aGlzLmRlbm9WZXJzaW9uKTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNCdW4pIHsKICAgICAgICAgIGNvbnNvbGUubG9nKCJydW5uaW5nIG9uIEJVTiIpOwogICAgICAgICAgY29uc29sZS5sb2coImJ1biB2ZXJzaW9uIGlzICIgKyB0aGlzLmJ1blZlcnNpb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zb2xlLmxvZygicnVubmluZyBvbiBCUk9XU0VSIik7CiAgICAgICAgICBjb25zb2xlLmxvZygiYnJvd3NlciBpcyAiICsgdGhpcy51c2VyQWdlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0ZW52QDYuMC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGVudi9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMxMiA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMxMiwgewogIFNtYXJ0ZW52OiAoKSA9PiBTbWFydGVudgp9KTsKdmFyIGluaXRfZGlzdF90czEyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRlbnZANi4wLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0ZW52L2Rpc3RfdHMvaW5kZXguanMiKCkgewogICAgaW5pdF9zbWFydGVudl9jbGFzc2VzX3NtYXJ0ZW52KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0cmluZ0A0LjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdHJpbmcvZGlzdF90cy9zbWFydHN0cmluZy5wbHVnaW5zLmpzCnZhciBpc291bmlxdWU7CnZhciBpbml0X3NtYXJ0c3RyaW5nX3BsdWdpbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0cmluZ0A0LjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdHJpbmcvZGlzdF90cy9zbWFydHN0cmluZy5wbHVnaW5zLmpzIigpIHsKICAgIGlzb3VuaXF1ZSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0X3RzKCksIDEpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuY3JlYXRlLmpzCnZhciBzbWFydHN0cmluZ19jcmVhdGVfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChzbWFydHN0cmluZ19jcmVhdGVfZXhwb3J0cywgewogIGNyZWF0ZUNyeXB0b1JhbmRvbVN0cmluZzogKCkgPT4gY3JlYXRlQ3J5cHRvUmFuZG9tU3RyaW5nLAogIGNyZWF0ZVJhbmRvbVN0cmluZzogKCkgPT4gY3JlYXRlUmFuZG9tU3RyaW5nCn0pOwp2YXIgZ2V0UmFuZG9tSW50LCBjdXN0b21SYW5kb21hdGljLCBjcmVhdGVSYW5kb21TdHJpbmcsIGNyZWF0ZUNyeXB0b1JhbmRvbVN0cmluZzsKdmFyIGluaXRfc21hcnRzdHJpbmdfY3JlYXRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuY3JlYXRlLmpzIigpIHsKICAgIGluaXRfc21hcnRzdHJpbmdfcGx1Z2lucygpOwogICAgZ2V0UmFuZG9tSW50ID0gKG1pbjMsIG1heDMpID0+IHsKICAgICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAidW5kZWZpbmVkIiAmJiBnbG9iYWxUaGlzLmNyeXB0byAmJiBnbG9iYWxUaGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHsKICAgICAgICBjb25zdCByYW5nZTIgPSBtYXgzIC0gbWluMzsKICAgICAgICBjb25zdCBhcnJheSA9IG5ldyBVaW50MzJBcnJheSgxKTsKICAgICAgICBnbG9iYWxUaGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpOwogICAgICAgIHJldHVybiBtaW4zICsgYXJyYXlbMF0gJSByYW5nZTI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXgzIC0gbWluMykpICsgbWluMzsKICAgICAgfQogICAgfTsKICAgIGN1c3RvbVJhbmRvbWF0aWMgPSAocGF0dGVybiwgbGVuZ3RoLCBvcHRpb25zKSA9PiB7CiAgICAgIGNvbnN0IGNoYXJTZXRzID0gewogICAgICAgICJBIjogIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIiwKICAgICAgICAiYSI6ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsCiAgICAgICAgIjAiOiAiMDEyMzQ1Njc4OSIsCiAgICAgICAgIiEiOiAiIUAjJCVeJiooKV8rLT1bXXt9fDs6LC48Pj8iLAogICAgICAgICIqIjogIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IUAjJCVeJiooKV8rLT1bXXt9fDs6LC48Pj8iCiAgICAgIH07CiAgICAgIGxldCBhY3R1YWxQYXR0ZXJuID0gcGF0dGVybjsKICAgICAgaWYgKGxlbmd0aCAmJiBsZW5ndGggPiBwYXR0ZXJuLmxlbmd0aCkgewogICAgICAgIGFjdHVhbFBhdHRlcm4gPSBwYXR0ZXJuLnJlcGVhdChNYXRoLmNlaWwobGVuZ3RoIC8gcGF0dGVybi5sZW5ndGgpKS5zbGljZSgwLCBsZW5ndGgpOwogICAgICB9IGVsc2UgaWYgKGxlbmd0aCkgewogICAgICAgIGFjdHVhbFBhdHRlcm4gPSBwYXR0ZXJuLnNsaWNlKDAsIGxlbmd0aCk7CiAgICAgIH0KICAgICAgbGV0IHJlc3VsdCA9ICIiOwogICAgICBmb3IgKGNvbnN0IGNoYXIgb2YgYWN0dWFsUGF0dGVybikgewogICAgICAgIGlmIChjaGFyU2V0c1tjaGFyXSkgewogICAgICAgICAgY29uc3QgY2hhclNldCA9IGNoYXJTZXRzW2NoYXJdOwogICAgICAgICAgY29uc3QgcmFuZG9tSW5kZXggPSBnZXRSYW5kb21JbnQoMCwgY2hhclNldC5sZW5ndGgpOwogICAgICAgICAgcmVzdWx0ICs9IGNoYXJTZXRbcmFuZG9tSW5kZXhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQgKz0gY2hhcjsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CiAgICBjcmVhdGVSYW5kb21TdHJpbmcgPSAocGF0dGVybkFyZywgbGVuZ3RoQXJnLCBvcHRpb25zQXJnKSA9PiB7CiAgICAgIHJldHVybiBjdXN0b21SYW5kb21hdGljKHBhdHRlcm5BcmcsIGxlbmd0aEFyZywgb3B0aW9uc0FyZyk7CiAgICB9OwogICAgY3JlYXRlQ3J5cHRvUmFuZG9tU3RyaW5nID0gKCkgPT4gewogICAgICByZXR1cm4gaXNvdW5pcXVlLnVuaSgpOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL3NtYXJ0c3RyaW5nLmRvY2tlci5qcwp2YXIgc21hcnRzdHJpbmdfZG9ja2VyX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoc21hcnRzdHJpbmdfZG9ja2VyX2V4cG9ydHMsIHsKICBtYWtlRW52T2JqZWN0OiAoKSA9PiBtYWtlRW52T2JqZWN0Cn0pOwp2YXIgbWFrZUVudk9iamVjdDsKdmFyIGluaXRfc21hcnRzdHJpbmdfZG9ja2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuZG9ja2VyLmpzIigpIHsKICAgIGluaXRfc21hcnRzdHJpbmdfcGx1Z2lucygpOwogICAgbWFrZUVudk9iamVjdCA9IGZ1bmN0aW9uKGVudkFycmF5QXJnKSB7CiAgICAgIGxldCByZXR1cm5PYmplY3QgPSB7fTsKICAgICAgbGV0IHJlZ2V4U3RyaW5nID0gLyguKik9KC4qKS87CiAgICAgIGlmICh0eXBlb2YgZW52QXJyYXlBcmcgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgZm9yIChsZXQgZW52S2V5IGluIGVudkFycmF5QXJnKSB7CiAgICAgICAgICBsZXQgcmVnZXhNYXRjaGVzID0gcmVnZXhTdHJpbmcuZXhlYyhlbnZBcnJheUFyZ1tlbnZLZXldKTsKICAgICAgICAgIHJldHVybk9iamVjdFtyZWdleE1hdGNoZXNbMV1dID0gcmVnZXhNYXRjaGVzWzJdOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmV0dXJuT2JqZWN0OwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL3NtYXJ0c3RyaW5nLmluZGVudC5qcwp2YXIgc21hcnRzdHJpbmdfaW5kZW50X2V4cG9ydHMgPSB7fTsKX19leHBvcnQoc21hcnRzdHJpbmdfaW5kZW50X2V4cG9ydHMsIHsKICBpbmRlbnQ6ICgpID0+IGluZGVudCwKICBpbmRlbnRXaXRoUHJlZml4OiAoKSA9PiBpbmRlbnRXaXRoUHJlZml4LAogIG5vcm1hbGl6ZTogKCkgPT4gbm9ybWFsaXplCn0pOwp2YXIgc3BsaXRTdHJpbmdBdExpbmVCcmVhaywgam9pblN0cmluZ1dpdGhMaW5lQnJlYWtzLCBjbGVhblN0cmluZ0FycmF5LCBpbmRlbnQsIGluZGVudFdpdGhQcmVmaXgsIG5vcm1hbGl6ZTsKdmFyIGluaXRfc21hcnRzdHJpbmdfaW5kZW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuaW5kZW50LmpzIigpIHsKICAgIGluaXRfc21hcnRzdHJpbmdfcGx1Z2lucygpOwogICAgc3BsaXRTdHJpbmdBdExpbmVCcmVhayA9IChzdHJpbmdBcmcpID0+IHsKICAgICAgbGV0IHJlc3VsdEFycmF5ID0gc3RyaW5nQXJnLnNwbGl0KCJcbiIpOwogICAgICByZXR1cm4gY2xlYW5TdHJpbmdBcnJheShyZXN1bHRBcnJheSk7CiAgICB9OwogICAgam9pblN0cmluZ1dpdGhMaW5lQnJlYWtzID0gKHN0cmluZ0FycmF5QXJnKSA9PiB7CiAgICAgIGxldCByZXN1bHRTdHJpbmcgPSAiIjsKICAgICAgZm9yIChsZXQgbGluZSBvZiBzdHJpbmdBcnJheUFyZykgewogICAgICAgIHJlc3VsdFN0cmluZyA9IHJlc3VsdFN0cmluZyArIGxpbmUgKyAiXG4iOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHRTdHJpbmc7CiAgICB9OwogICAgY2xlYW5TdHJpbmdBcnJheSA9IChzdHJpbmdBcnJheUFyZykgPT4gewogICAgICBsZXQgdGVzdFJlZ2V4ID0gL15bXHNdKiQvOwogICAgICBpZiAodGVzdFJlZ2V4LnRlc3Qoc3RyaW5nQXJyYXlBcmdbMF0pKSB7CiAgICAgICAgc3RyaW5nQXJyYXlBcmcuc2hpZnQoKTsKICAgICAgfQogICAgICBpZiAodGVzdFJlZ2V4LnRlc3Qoc3RyaW5nQXJyYXlBcmdbc3RyaW5nQXJyYXlBcmcubGVuZ3RoIC0gMV0pKSB7CiAgICAgICAgc3RyaW5nQXJyYXlBcmcucG9wKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0cmluZ0FycmF5QXJnOwogICAgfTsKICAgIGluZGVudCA9IChzdHJpbmdBcmcsIHNwYWNlQW1vdW50KSA9PiB7CiAgICAgIGxldCBsb2NhbFN0cmluZ0FycmF5ID0gc3BsaXRTdHJpbmdBdExpbmVCcmVhayhzdHJpbmdBcmcpOwogICAgICBmb3IgKGxldCBzdHJpbmdBcmcyIG9mIGxvY2FsU3RyaW5nQXJyYXkpIHsKICAgICAgICBzdHJpbmdBcmcyID0gIiAiLnJlcGVhdChzcGFjZUFtb3VudCkgKyBzdHJpbmdBcmcyOwogICAgICB9CiAgICAgIGxldCByZXN1bHRTdHJpbmcgPSBqb2luU3RyaW5nV2l0aExpbmVCcmVha3MobG9jYWxTdHJpbmdBcnJheSk7CiAgICAgIHJldHVybiByZXN1bHRTdHJpbmc7CiAgICB9OwogICAgaW5kZW50V2l0aFByZWZpeCA9IChzdHJpbmdBcmcsIHByZWZpeEFyZykgPT4gewogICAgICBsZXQgcmVzdWx0U3RyaW5nOwogICAgICBsZXQgc3RyaW5nQXJyYXkgPSBzcGxpdFN0cmluZ0F0TGluZUJyZWFrKHN0cmluZ0FyZyk7CiAgICAgIGxldCByZXN1bHRBcnJheSA9IFtdOwogICAgICBmb3IgKGxldCBzdHJpbmdJdGVtIG9mIHN0cmluZ0FycmF5KSB7CiAgICAgICAgcmVzdWx0QXJyYXkucHVzaChwcmVmaXhBcmcgKyBzdHJpbmdJdGVtKTsKICAgICAgfQogICAgICByZXN1bHRTdHJpbmcgPSBqb2luU3RyaW5nV2l0aExpbmVCcmVha3MocmVzdWx0QXJyYXkpOwogICAgICByZXR1cm4gcmVzdWx0U3RyaW5nOwogICAgfTsKICAgIG5vcm1hbGl6ZSA9IChzdHJpbmdBcmcpID0+IHsKICAgICAgbGV0IHJlc3VsdFN0cmluZzsKICAgICAgbGV0IHNwbGl0U3RyaW5nQXJyYXkgPSBzcGxpdFN0cmluZ0F0TGluZUJyZWFrKHN0cmluZ0FyZyk7CiAgICAgIGxldCBtaW5Db21tb25MZWZ0T2Zmc2V0OwogICAgICBjb25zdCBkZUluZGVudFJlZ2V4ID0gL14oXHMqKS87CiAgICAgIGNvbnN0IGVtcHR5TGluZVJlZ2V4ID0gL14oXHMqKSQvOwogICAgICBmb3IgKGxldCBzdHJpbmdJdGVtIG9mIHNwbGl0U3RyaW5nQXJyYXkpIHsKICAgICAgICBsZXQgb2Zmc2V0U3RyaW5nID0gZGVJbmRlbnRSZWdleC5leGVjKHN0cmluZ0l0ZW0pWzFdOwogICAgICAgIGlmICgodHlwZW9mIG1pbkNvbW1vbkxlZnRPZmZzZXQgPT09ICJ1bmRlZmluZWQiIHx8IG9mZnNldFN0cmluZy5sZW5ndGggPCBtaW5Db21tb25MZWZ0T2Zmc2V0KSAmJiAhZW1wdHlMaW5lUmVnZXgudGVzdChzdHJpbmdJdGVtKSkgewogICAgICAgICAgbWluQ29tbW9uTGVmdE9mZnNldCA9IG9mZnNldFN0cmluZy5sZW5ndGg7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxldCByZXN1bHRTcGxpdFN0cmluZ0FycmF5ID0gW107CiAgICAgIGZvciAobGV0IHN0cmluZ0l0ZW0gb2Ygc3BsaXRTdHJpbmdBcnJheSkgewogICAgICAgIHJlc3VsdFNwbGl0U3RyaW5nQXJyYXkucHVzaChzdHJpbmdJdGVtLnN1YnN0cihtaW5Db21tb25MZWZ0T2Zmc2V0KSk7CiAgICAgIH0KICAgICAgcmVzdWx0U3RyaW5nID0gam9pblN0cmluZ1dpdGhMaW5lQnJlYWtzKHJlc3VsdFNwbGl0U3RyaW5nQXJyYXkpOwogICAgICByZXR1cm4gcmVzdWx0U3RyaW5nOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL3NtYXJ0c3RyaW5nLm5vcm1hbGl6ZS5qcwp2YXIgc21hcnRzdHJpbmdfbm9ybWFsaXplX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoc21hcnRzdHJpbmdfbm9ybWFsaXplX2V4cG9ydHMsIHsKICByZXBsYWNlQWxsOiAoKSA9PiByZXBsYWNlQWxsLAogIHN0YW5kYXJkOiAoKSA9PiBzdGFuZGFyZAp9KTsKdmFyIHJlcGxhY2VBbGwsIHN0cmlwSW5kZW50LCBzdGFuZGFyZDsKdmFyIGluaXRfc21hcnRzdHJpbmdfbm9ybWFsaXplID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcubm9ybWFsaXplLmpzIigpIHsKICAgIHJlcGxhY2VBbGwgPSAoc3RyaW5nQXJnLCBzZWFyY2hQYXR0ZXJuLCByZXBsYWNlbWVudFN0cmluZykgPT4gewogICAgICByZXR1cm4gc3RyaW5nQXJnLnJlcGxhY2UobmV3IFJlZ0V4cChzZWFyY2hQYXR0ZXJuLCAiZyIpLCByZXBsYWNlbWVudFN0cmluZyk7CiAgICB9OwogICAgc3RyaXBJbmRlbnQgPSAoc3RyKSA9PiB7CiAgICAgIGNvbnN0IGxpbmVzID0gc3RyLnNwbGl0KCJcbiIpOwogICAgICBsZXQgbWluSW5kZW50ID0gSW5maW5pdHk7CiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykgewogICAgICAgIGlmIChsaW5lLnRyaW0oKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICBjb25zdCBtYXRjaDIgPSBsaW5lLm1hdGNoKC9eKFxzKikvKTsKICAgICAgICAgIGlmIChtYXRjaDIpIHsKICAgICAgICAgICAgbWluSW5kZW50ID0gTWF0aC5taW4obWluSW5kZW50LCBtYXRjaDJbMV0ubGVuZ3RoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG1pbkluZGVudCA9PT0gSW5maW5pdHkgfHwgbWluSW5kZW50ID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgfQogICAgICByZXR1cm4gbGluZXMubWFwKChsaW5lKSA9PiB7CiAgICAgICAgaWYgKGxpbmUubGVuZ3RoID49IG1pbkluZGVudCkgewogICAgICAgICAgcmV0dXJuIGxpbmUuc2xpY2UobWluSW5kZW50KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpbmU7CiAgICAgIH0pLmpvaW4oIlxuIik7CiAgICB9OwogICAgc3RhbmRhcmQgPSAoc3RyaW5nQXJnLCBvcHRpb25zKSA9PiB7CiAgICAgIGxldCByZXN1bHQgPSBzdHJpbmdBcmc7CiAgICAgIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnN0cmlwSW5kZW50KSB7CiAgICAgICAgcmVzdWx0ID0gc3RyaXBJbmRlbnQocmVzdWx0KTsKICAgICAgfQogICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5ub3JtYWxpemVOZXdsaW5lKSB7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1xyXG4vZywgIlxuIik7CiAgICAgIH0KICAgICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMucmVwbGFjZVRhYnMpIHsKICAgICAgICByZXN1bHQgPSByZXBsYWNlQWxsKHJlc3VsdCwgIgkvIiwgIiAiKTsKICAgICAgfQogICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5zdHJpcExlYWRpbmdUcmFpbGluZ0VtcHR5TGluZXMpIHsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxzKltcclxuXS9nbSwgIiIpLnJlcGxhY2UoL1xzKltcclxuXSQvZ20sICIiKTsKICAgICAgfQogICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5zdHJpcEFsbEVtcHR5TGluZXMpIHsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXlxzKltcclxuXS9nbSwgIiIpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuYmFzZTY0LmpzCnZhciB1bml2ZXJzYWxCYXNlNjQsIEJhc2U2NCwgYmFzZTY0Owp2YXIgaW5pdF9zbWFydHN0cmluZ19iYXNlNjQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0cmluZ0A0LjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdHJpbmcvZGlzdF90cy9zbWFydHN0cmluZy5iYXNlNjQuanMiKCkgewogICAgdW5pdmVyc2FsQmFzZTY0ID0gewogICAgICBlbmNvZGU6IChzdHIpID0+IHsKICAgICAgICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShzdHIsICJ1dGY4IikudG9TdHJpbmcoImJhc2U2NCIpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGJ0b2EgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICBjb25zdCB1dGY4Qnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKTsKICAgICAgICAgIGNvbnN0IGJpbmFyeVN0cmluZyA9IEFycmF5LmZyb20odXRmOEJ5dGVzLCAoYnl0ZSkgPT4gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKSkuam9pbigiIik7CiAgICAgICAgICByZXR1cm4gYnRvYShiaW5hcnlTdHJpbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBjaGFycyA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKICAgICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHN0cik7CiAgICAgICAgICBsZXQgcmVzdWx0ID0gIiI7CiAgICAgICAgICBsZXQgaTExID0gMDsKICAgICAgICAgIHdoaWxlIChpMTEgPCBieXRlcy5sZW5ndGgpIHsKICAgICAgICAgICAgY29uc3QgYTUgPSBieXRlc1tpMTErK107CiAgICAgICAgICAgIGNvbnN0IGI2ID0gaTExIDwgYnl0ZXMubGVuZ3RoID8gYnl0ZXNbaTExKytdIDogMDsKICAgICAgICAgICAgY29uc3QgYzExID0gaTExIDwgYnl0ZXMubGVuZ3RoID8gYnl0ZXNbaTExKytdIDogMDsKICAgICAgICAgICAgY29uc3QgYml0bWFwID0gYTUgPDwgMTYgfCBiNiA8PCA4IHwgYzExOwogICAgICAgICAgICByZXN1bHQgKz0gY2hhcnMuY2hhckF0KGJpdG1hcCA+PiAxOCAmIDYzKTsKICAgICAgICAgICAgcmVzdWx0ICs9IGNoYXJzLmNoYXJBdChiaXRtYXAgPj4gMTIgJiA2Myk7CiAgICAgICAgICAgIHJlc3VsdCArPSBpMTEgLSAyIDwgYnl0ZXMubGVuZ3RoID8gY2hhcnMuY2hhckF0KGJpdG1hcCA+PiA2ICYgNjMpIDogIj0iOwogICAgICAgICAgICByZXN1bHQgKz0gaTExIC0gMSA8IGJ5dGVzLmxlbmd0aCA/IGNoYXJzLmNoYXJBdChiaXRtYXAgJiA2MykgOiAiPSI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgfSwKICAgICAgZGVjb2RlOiAoc3RyKSA9PiB7CiAgICAgICAgY29uc3QgYmFzZTY0U3RyaW5nID0gc3RyLnJlcGxhY2UoLy0vZywgIisiKS5yZXBsYWNlKC9fL2csICIvIikucGFkRW5kKHN0ci5sZW5ndGggKyAoNCAtIHN0ci5sZW5ndGggJSA0KSAlIDQsICI9Iik7CiAgICAgICAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYmFzZTY0U3RyaW5nLCAiYmFzZTY0IikudG9TdHJpbmcoInV0ZjgiKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhdG9iICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgY29uc3QgYmluYXJ5U3RyaW5nID0gYXRvYihiYXNlNjRTdHJpbmcpOwogICAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnlTdHJpbmcubGVuZ3RoKTsKICAgICAgICAgIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IGJpbmFyeVN0cmluZy5sZW5ndGg7IGkxMSsrKSB7CiAgICAgICAgICAgIGJ5dGVzW2kxMV0gPSBiaW5hcnlTdHJpbmcuY2hhckNvZGVBdChpMTEpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShieXRlcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGNoYXJzID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwogICAgICAgICAgbGV0IGJ5dGVzID0gW107CiAgICAgICAgICBsZXQgaTExID0gMDsKICAgICAgICAgIHdoaWxlIChpMTEgPCBiYXNlNjRTdHJpbmcubGVuZ3RoKSB7CiAgICAgICAgICAgIGNvbnN0IGVuY29kZWQxID0gY2hhcnMuaW5kZXhPZihiYXNlNjRTdHJpbmcuY2hhckF0KGkxMSsrKSk7CiAgICAgICAgICAgIGNvbnN0IGVuY29kZWQyID0gY2hhcnMuaW5kZXhPZihiYXNlNjRTdHJpbmcuY2hhckF0KGkxMSsrKSk7CiAgICAgICAgICAgIGNvbnN0IGVuY29kZWQzID0gY2hhcnMuaW5kZXhPZihiYXNlNjRTdHJpbmcuY2hhckF0KGkxMSsrKSk7CiAgICAgICAgICAgIGNvbnN0IGVuY29kZWQ0ID0gY2hhcnMuaW5kZXhPZihiYXNlNjRTdHJpbmcuY2hhckF0KGkxMSsrKSk7CiAgICAgICAgICAgIGNvbnN0IGJpdG1hcCA9IGVuY29kZWQxIDw8IDE4IHwgZW5jb2RlZDIgPDwgMTIgfCBlbmNvZGVkMyA8PCA2IHwgZW5jb2RlZDQ7CiAgICAgICAgICAgIGJ5dGVzLnB1c2goYml0bWFwID4+IDE2ICYgMjU1KTsKICAgICAgICAgICAgaWYgKGVuY29kZWQzICE9PSA2NCkKICAgICAgICAgICAgICBieXRlcy5wdXNoKGJpdG1hcCA+PiA4ICYgMjU1KTsKICAgICAgICAgICAgaWYgKGVuY29kZWQ0ICE9PSA2NCkKICAgICAgICAgICAgICBieXRlcy5wdXNoKGJpdG1hcCAmIDI1NSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKG5ldyBVaW50OEFycmF5KGJ5dGVzKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgQmFzZTY0ID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcihpbnB1dFN0cmluZ0FyZywgdHlwZUFyZykgewogICAgICAgIHN3aXRjaCAodHlwZUFyZykgewogICAgICAgICAgY2FzZSAic3RyaW5nIjoKICAgICAgICAgICAgdGhpcy5yZWZTdHJpbmcgPSBpbnB1dFN0cmluZ0FyZzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJiYXNlNjQiOgogICAgICAgICAgICB0aGlzLnJlZlN0cmluZyA9IGJhc2U2NC5kZWNvZGUoaW5wdXRTdHJpbmdBcmcpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImJhc2U2NHVyaSI6CiAgICAgICAgICAgIHRoaXMucmVmU3RyaW5nID0gYmFzZTY0LmRlY29kZShpbnB1dFN0cmluZ0FyZyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiB0aGUgc2ltcGxlIHN0cmluZyAodW5lbmNvZGVkKQogICAgICAgKi8KICAgICAgZ2V0IHNpbXBsZVN0cmluZygpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZWZTdHJpbmc7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHRoZSBiYXNlNjQgZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbCBzdHJpbmcKICAgICAgICovCiAgICAgIGdldCBiYXNlNjRTdHJpbmcoKSB7CiAgICAgICAgcmV0dXJuIGJhc2U2NC5lbmNvZGUodGhpcy5yZWZTdHJpbmcpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiB0aGUgYmFzZTY0dXJpIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgb3JpZ2luYWwgc3RyaW5nCiAgICAgICAqLwogICAgICBnZXQgYmFzZTY0VXJpU3RyaW5nKCkgewogICAgICAgIHJldHVybiBiYXNlNjQuZW5jb2RlVXJpKHRoaXMucmVmU3RyaW5nKTsKICAgICAgfQogICAgfTsKICAgIGJhc2U2NCA9IHsKICAgICAgLyoqCiAgICAgICAqIGVuY29kZXMgdGhlIHN0cmluZwogICAgICAgKi8KICAgICAgZW5jb2RlOiAoc3RyaW5nQXJnKSA9PiB7CiAgICAgICAgcmV0dXJuIHVuaXZlcnNhbEJhc2U2NC5lbmNvZGUoc3RyaW5nQXJnKTsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIGVuY29kZXMgYSBzdHJpbmdBcmcgdG8gYmFzZTY0IHVyaSBzdHlsZQogICAgICAgKi8KICAgICAgZW5jb2RlVXJpOiAoc3RyaW5nQXJnKSA9PiB7CiAgICAgICAgcmV0dXJuIHVuaXZlcnNhbEJhc2U2NC5lbmNvZGUoc3RyaW5nQXJnKS5yZXBsYWNlKC9cKy9nLCAiLSIpLnJlcGxhY2UoL1wvL2csICJfIikucmVwbGFjZSgvPS9nLCAiIik7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBkZWNvZGVzIGEgYmFzZTY0IGVuY29kZWQgc3RyaW5nCiAgICAgICAqLwogICAgICBkZWNvZGU6IChzdHJpbmdBcmcpID0+IHsKICAgICAgICByZXR1cm4gdW5pdmVyc2FsQmFzZTY0LmRlY29kZShzdHJpbmdBcmcpOwogICAgICB9LAogICAgICAvKioKICAgICAgICoKICAgICAgICogQHBhcmFtIHN0cmluZ0FyZwogICAgICAgKiBjaGVja3Mgd2V0aGVyIHRoZSBzdHJpbmcgaXMgYmFzZTY0IGVuY29kZWQKICAgICAgICovCiAgICAgIGlzQmFzZTY0OiAoc3RyaW5nQXJnKSA9PiB7CiAgICAgICAgY29uc3QgcmVnZXggPSAvXihbQS1aYS16MC05Ky9dezR9KSooW0EtWmEtejAtOSsvXXszfT18W0EtWmEtejAtOSsvXXsyfT09KT8kLzsKICAgICAgICByZXR1cm4gcmVnZXgudGVzdChzdHJpbmdBcmcpOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcudHlwZS5qcwp2YXIgc21hcnRzdHJpbmdfdHlwZV9leHBvcnRzID0ge307Cl9fZXhwb3J0KHNtYXJ0c3RyaW5nX3R5cGVfZXhwb3J0cywgewogIGlzQmFzZTY0OiAoKSA9PiBpc0Jhc2U2NCwKICBpc1V0Zjg6ICgpID0+IGlzVXRmOAp9KTsKdmFyIGlzVXRmOCwgaXNCYXNlNjQ7CnZhciBpbml0X3NtYXJ0c3RyaW5nX3R5cGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0cmluZ0A0LjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdHJpbmcvZGlzdF90cy9zbWFydHN0cmluZy50eXBlLmpzIigpIHsKICAgIGluaXRfc21hcnRzdHJpbmdfcGx1Z2lucygpOwogICAgaW5pdF9zbWFydHN0cmluZ19iYXNlNjQoKTsKICAgIGlzVXRmOCA9IChzdHJpbmdBcmcpID0+IHsKICAgICAgY29uc3QgZW5jb2RlcjIgPSBuZXcgVGV4dEVuY29kZXIoKTsKICAgICAgY29uc3QgYnl0ZXMgPSBlbmNvZGVyMi5lbmNvZGUoc3RyaW5nQXJnKTsKICAgICAgbGV0IGkxMSA9IDA7CiAgICAgIHdoaWxlIChpMTEgPCBieXRlcy5sZW5ndGgpIHsKICAgICAgICBpZiAoCiAgICAgICAgICAvLyBBU0NJSQogICAgICAgICAgYnl0ZXNbaTExXSA9PT0gOSB8fCBieXRlc1tpMTFdID09PSAxMCB8fCBieXRlc1tpMTFdID09PSAxMyB8fCAzMiA8PSBieXRlc1tpMTFdICYmIGJ5dGVzW2kxMV0gPD0gMTI2CiAgICAgICAgKSB7CiAgICAgICAgICBpMTEgKz0gMTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoCiAgICAgICAgICAvLyBub24tb3ZlcmxvbmcgMi1ieXRlCiAgICAgICAgICAxOTQgPD0gYnl0ZXNbaTExXSAmJiBieXRlc1tpMTFdIDw9IDIyMyAmJiAxMjggPD0gYnl0ZXNbaTExICsgMV0gJiYgYnl0ZXNbaTExICsgMV0gPD0gMTkxCiAgICAgICAgKSB7CiAgICAgICAgICBpMTEgKz0gMjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoCiAgICAgICAgICAvLyBleGNsdWRpbmcgb3ZlcmxvbmdzCiAgICAgICAgICBieXRlc1tpMTFdID09PSAyMjQgJiYgMTYwIDw9IGJ5dGVzW2kxMSArIDFdICYmIGJ5dGVzW2kxMSArIDFdIDw9IDE5MSAmJiAxMjggPD0gYnl0ZXNbaTExICsgMl0gJiYgYnl0ZXNbaTExICsgMl0gPD0gMTkxIHx8IC8vIHN0cmFpZ2h0IDMtYnl0ZQogICAgICAgICAgKDIyNSA8PSBieXRlc1tpMTFdICYmIGJ5dGVzW2kxMV0gPD0gMjM2IHx8IGJ5dGVzW2kxMV0gPT09IDIzOCB8fCBieXRlc1tpMTFdID09PSAyMzkpICYmIDEyOCA8PSBieXRlc1tpMTEgKyAxXSAmJiBieXRlc1tpMTEgKyAxXSA8PSAxOTEgJiYgMTI4IDw9IGJ5dGVzW2kxMSArIDJdICYmIGJ5dGVzW2kxMSArIDJdIDw9IDE5MSB8fCAvLyBleGNsdWRpbmcgc3Vycm9nYXRlcwogICAgICAgICAgYnl0ZXNbaTExXSA9PT0gMjM3ICYmIDEyOCA8PSBieXRlc1tpMTEgKyAxXSAmJiBieXRlc1tpMTEgKyAxXSA8PSAxNTkgJiYgMTI4IDw9IGJ5dGVzW2kxMSArIDJdICYmIGJ5dGVzW2kxMSArIDJdIDw9IDE5MQogICAgICAgICkgewogICAgICAgICAgaTExICs9IDM7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKAogICAgICAgICAgLy8gcGxhbmVzIDEtMwogICAgICAgICAgYnl0ZXNbaTExXSA9PT0gMjQwICYmIDE0NCA8PSBieXRlc1tpMTEgKyAxXSAmJiBieXRlc1tpMTEgKyAxXSA8PSAxOTEgJiYgMTI4IDw9IGJ5dGVzW2kxMSArIDJdICYmIGJ5dGVzW2kxMSArIDJdIDw9IDE5MSAmJiAxMjggPD0gYnl0ZXNbaTExICsgM10gJiYgYnl0ZXNbaTExICsgM10gPD0gMTkxIHx8IC8vIHBsYW5lcyA0LTE1CiAgICAgICAgICAyNDEgPD0gYnl0ZXNbaTExXSAmJiBieXRlc1tpMTFdIDw9IDI0MyAmJiAxMjggPD0gYnl0ZXNbaTExICsgMV0gJiYgYnl0ZXNbaTExICsgMV0gPD0gMTkxICYmIDEyOCA8PSBieXRlc1tpMTEgKyAyXSAmJiBieXRlc1tpMTEgKyAyXSA8PSAxOTEgJiYgMTI4IDw9IGJ5dGVzW2kxMSArIDNdICYmIGJ5dGVzW2kxMSArIDNdIDw9IDE5MSB8fCAvLyBwbGFuZSAxNgogICAgICAgICAgYnl0ZXNbaTExXSA9PT0gMjQ0ICYmIDEyOCA8PSBieXRlc1tpMTEgKyAxXSAmJiBieXRlc1tpMTEgKyAxXSA8PSAxNDMgJiYgMTI4IDw9IGJ5dGVzW2kxMSArIDJdICYmIGJ5dGVzW2kxMSArIDJdIDw9IDE5MSAmJiAxMjggPD0gYnl0ZXNbaTExICsgM10gJiYgYnl0ZXNbaTExICsgM10gPD0gMTkxCiAgICAgICAgKSB7CiAgICAgICAgICBpMTEgKz0gNDsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9OwogICAgaXNCYXNlNjQgPSAoc3RyaW5nQXJnKSA9PiB7CiAgICAgIGNvbnN0IG5vdEJhc2U2NCA9IC9bXkEtWjAtOStcLz1dL2k7CiAgICAgIGNvbnN0IGxlbiA9IHN0cmluZ0FyZy5sZW5ndGg7CiAgICAgIGlmICghbGVuIHx8IGxlbiAlIDQgIT09IDAgfHwgbm90QmFzZTY0LnRlc3Qoc3RyaW5nQXJnKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBjb25zdCBmaXJzdFBhZGRpbmdDaGFyID0gc3RyaW5nQXJnLmluZGV4T2YoIj0iKTsKICAgICAgcmV0dXJuIGZpcnN0UGFkZGluZ0NoYXIgPT09IC0xIHx8IGZpcnN0UGFkZGluZ0NoYXIgPT09IGxlbiAtIDEgfHwgZmlyc3RQYWRkaW5nQ2hhciA9PT0gbGVuIC0gMiAmJiBzdHJpbmdBcmdbbGVuIC0gMV0gPT09ICI9IjsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0cmluZ0A0LjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdHJpbmcvZGlzdF90cy9zbWFydHN0cmluZy5kb21haW4uanMKdmFyIERvbWFpbjsKdmFyIGluaXRfc21hcnRzdHJpbmdfZG9tYWluID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuZG9tYWluLmpzIigpIHsKICAgIERvbWFpbiA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoZG9tYWluU3RyaW5nQXJnKSB7CiAgICAgICAgdGhpcy5wcm90b2NvbCA9IHRoaXMuX3Byb3RvY29sUmVnZXgoZG9tYWluU3RyaW5nQXJnKTsKICAgICAgICBpZiAoIXRoaXMucHJvdG9jb2wpIHsKICAgICAgICAgIGRvbWFpblN0cmluZ0FyZyA9IGBodHRwczovLyR7ZG9tYWluU3RyaW5nQXJnfWA7CiAgICAgICAgfQogICAgICAgIHRoaXMubm9kZVBhcnNlZFVybCA9IG5ldyBVUkwoZG9tYWluU3RyaW5nQXJnKTsKICAgICAgICB0aGlzLnBvcnQgPSB0aGlzLm5vZGVQYXJzZWRVcmwucG9ydDsKICAgICAgICBjb25zdCByZWdleE1hdGNoZXMgPSB0aGlzLl9kb21haW5SZWdleChkb21haW5TdHJpbmdBcmcucmVwbGFjZSh0aGlzLm5vZGVQYXJzZWRVcmwucGF0aG5hbWUsICIiKSk7CiAgICAgICAgdGhpcy5mdWxsTmFtZSA9ICIiOwogICAgICAgIGZvciAobGV0IGkxMSA9IDE7IGkxMSA8PSA1OyBpMTErKykgewogICAgICAgICAgaWYgKHJlZ2V4TWF0Y2hlc1tpMTEgLSAxXSkgewogICAgICAgICAgICBjb25zdCBsb2NhbE1hdGNoID0gcmVnZXhNYXRjaGVzW2kxMSAtIDFdOwogICAgICAgICAgICB0aGlzWyJsZXZlbCIgKyBpMTEudG9TdHJpbmcoKV0gPSBsb2NhbE1hdGNoOwogICAgICAgICAgICBpZiAodGhpcy5mdWxsTmFtZSA9PT0gIiIpIHsKICAgICAgICAgICAgICB0aGlzLmZ1bGxOYW1lID0gbG9jYWxNYXRjaDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLmZ1bGxOYW1lID0gbG9jYWxNYXRjaCArICIuIiArIHRoaXMuZnVsbE5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXNbImxldmVsIiArIGkxMS50b1N0cmluZygpXSA9IHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy56b25lTmFtZSA9IHRoaXMubGV2ZWwyICsgIi4iICsgdGhpcy5sZXZlbDE7CiAgICAgICAgdGhpcy50b3BMZXZlbCA9IHRoaXMubGV2ZWwxOwogICAgICAgIHRoaXMuZG9tYWluTmFtZSA9IHRoaXMubGV2ZWwyOwogICAgICAgIHRoaXMuc3ViRG9tYWluID0gdGhpcy5sZXZlbDM7CiAgICAgIH0KICAgICAgLy8gaGVscGVyIGZ1bmN0aW9ucwogICAgICAvKiogKi8KICAgICAgX2RvbWFpblJlZ2V4KHN0cmluZ0FyZykgewogICAgICAgIGNvbnN0IHJlZ2V4U3RyaW5nID0gLyhbYS16QS1aMC05XC1cX10qKVwuezAsMX0oW2EtekEtWjAtOVwtXF9dKilcLnswLDF9KFthLXpBLVowLTlcLVxfXSopXC57MCwxfShbYS16QS1aMC05XC1cX10qKVwuezAsMX0oW2EtekEtWjAtOVwtXF9dKilcLnswLDF9JC87CiAgICAgICAgY29uc3QgcmVnZXhNYXRjaGVzID0gcmVnZXhTdHJpbmcuZXhlYyhzdHJpbmdBcmcpOwogICAgICAgIHJlZ2V4TWF0Y2hlcy5yZXZlcnNlKCk7CiAgICAgICAgcmVnZXhNYXRjaGVzLnBvcCgpOwogICAgICAgIGNvbnN0IHJlZ2V4TWF0Y2hlc0ZpbHRlcmVkID0gcmVnZXhNYXRjaGVzLmZpbHRlcihmdW5jdGlvbihzdHJpbmdBcmcyKSB7CiAgICAgICAgICByZXR1cm4gc3RyaW5nQXJnMiAhPT0gIiI7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlZ2V4TWF0Y2hlc0ZpbHRlcmVkOwogICAgICB9CiAgICAgIF9wcm90b2NvbFJlZ2V4KHN0cmluZ0FyZykgewogICAgICAgIGNvbnN0IHJlZ2V4U3RyaW5nID0gL14oW2EtekEtWjAtOV0qKTpcL1wvLzsKICAgICAgICBjb25zdCByZWdleE1hdGNoZXMgPSByZWdleFN0cmluZy5leGVjKHN0cmluZ0FyZyk7CiAgICAgICAgaWYgKHJlZ2V4TWF0Y2hlcykgewogICAgICAgICAgcmV0dXJuIHJlZ2V4TWF0Y2hlc1sxXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgIH0KICAgICAgX3BvcnRSZWdleChzdHJpbmdBcmcpIHsKICAgICAgICBjb25zdCByZWdleFN0cmluZyA9IC9eKFthLXpBLVowLTldKik6XC9cLy87CiAgICAgICAgY29uc3QgcmVnZXhNYXRjaGVzID0gcmVnZXhTdHJpbmcuZXhlYyhzdHJpbmdBcmcpOwogICAgICAgIGlmIChyZWdleE1hdGNoZXMpIHsKICAgICAgICAgIHJldHVybiByZWdleE1hdGNoZXNbMV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuZ2l0LmpzCnZhciBHaXRSZXBvLCBnaXRSZWdleCwgZ2l0TGluazsKdmFyIGluaXRfc21hcnRzdHJpbmdfZ2l0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdHJpbmdANC4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RyaW5nL2Rpc3RfdHMvc21hcnRzdHJpbmcuZ2l0LmpzIigpIHsKICAgIGluaXRfc21hcnRzdHJpbmdfcGx1Z2lucygpOwogICAgR2l0UmVwbyA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3Ioc3RyaW5nQXJnLCB0b2tlbkFyZykgewogICAgICAgIGxldCByZWdleE1hdGNoZXMgPSBnaXRSZWdleChzdHJpbmdBcmcpOwogICAgICAgIHRoaXMuaG9zdCA9IHJlZ2V4TWF0Y2hlc1sxXTsKICAgICAgICB0aGlzLnVzZXIgPSByZWdleE1hdGNoZXNbMl07CiAgICAgICAgdGhpcy5yZXBvID0gcmVnZXhNYXRjaGVzWzNdOwogICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSB0b2tlbkFyZzsKICAgICAgICB0aGlzLnNzaFVybCA9IGdpdExpbmsodGhpcy5ob3N0LCB0aGlzLnVzZXIsIHRoaXMucmVwbywgdGhpcy5hY2Nlc3NUb2tlbiwgInNzaCIpOwogICAgICAgIHRoaXMuaHR0cHNVcmwgPSBnaXRMaW5rKHRoaXMuaG9zdCwgdGhpcy51c2VyLCB0aGlzLnJlcG8sIHRoaXMuYWNjZXNzVG9rZW4sICJodHRwcyIpOwogICAgICB9CiAgICB9OwogICAgZ2l0UmVnZXggPSBmdW5jdGlvbihzdHJpbmdBcmcpIHsKICAgICAgY29uc3QgcmVnZXhTdHJpbmcgPSAvKFthLXpBLVowLTlcLV9cLl0qKSg/OlwvfFw6KShbYS16QS1aMC05XC1fXC5dKikoPzpcLykoW2EtekEtWjAtOVwtX1wuXSopKD86XC5naXQpLzsKICAgICAgbGV0IHJlZ2V4TWF0Y2hlcyA9IHJlZ2V4U3RyaW5nLmV4ZWMoc3RyaW5nQXJnKTsKICAgICAgcmV0dXJuIHJlZ2V4TWF0Y2hlczsKICAgIH07CiAgICBnaXRMaW5rID0gZnVuY3Rpb24oaG9zdEFyZywgdXNlckFyZywgcmVwb0FyZywgdG9rZW5BcmcgPSAiIiwgbGlua1R5cGVBcmcpIHsKICAgICAgbGV0IHJldHVyblN0cmluZzsKICAgICAgaWYgKHRva2VuQXJnICE9PSAiIikgewogICAgICAgIHRva2VuQXJnID0gdG9rZW5BcmcgKyAiQCI7CiAgICAgIH0KICAgICAgc3dpdGNoIChsaW5rVHlwZUFyZykgewogICAgICAgIGNhc2UgImh0dHBzIjoKICAgICAgICAgIHJldHVyblN0cmluZyA9ICJodHRwczovLyIgKyB0b2tlbkFyZyArIGhvc3RBcmcgKyAiLyIgKyB1c2VyQXJnICsgIi8iICsgcmVwb0FyZyArICIuZ2l0IjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInNzaCI6CiAgICAgICAgICByZXR1cm5TdHJpbmcgPSAiZ2l0QCIgKyBob3N0QXJnICsgIjoiICsgdXNlckFyZyArICIvIiArIHJlcG9BcmcgKyAiLmdpdCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgY29uc29sZS5lcnJvcigiTGluayBUeXBlICIgKyBsaW5rVHlwZUFyZyArICIgbm90IGtub3duIik7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICByZXR1cm4gcmV0dXJuU3RyaW5nOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMxMyA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMxMywgewogIEJhc2U2NDogKCkgPT4gQmFzZTY0LAogIERvbWFpbjogKCkgPT4gRG9tYWluLAogIEdpdFJlcG86ICgpID0+IEdpdFJlcG8sCiAgYmFzZTY0OiAoKSA9PiBiYXNlNjQsCiAgY3JlYXRlOiAoKSA9PiBzbWFydHN0cmluZ19jcmVhdGVfZXhwb3J0cywKICBkb2NrZXI6ICgpID0+IHNtYXJ0c3RyaW5nX2RvY2tlcl9leHBvcnRzLAogIGluZGVudDogKCkgPT4gc21hcnRzdHJpbmdfaW5kZW50X2V4cG9ydHMsCiAgbm9ybWFsaXplOiAoKSA9PiBzbWFydHN0cmluZ19ub3JtYWxpemVfZXhwb3J0cywKICB0eXBlOiAoKSA9PiBzbWFydHN0cmluZ190eXBlX2V4cG9ydHMKfSk7CnZhciBpbml0X2Rpc3RfdHMxMyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RyaW5nQDQuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0cmluZy9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfc21hcnRzdHJpbmdfY3JlYXRlKCk7CiAgICBpbml0X3NtYXJ0c3RyaW5nX2RvY2tlcigpOwogICAgaW5pdF9zbWFydHN0cmluZ19pbmRlbnQoKTsKICAgIGluaXRfc21hcnRzdHJpbmdfbm9ybWFsaXplKCk7CiAgICBpbml0X3NtYXJ0c3RyaW5nX3R5cGUoKTsKICAgIGluaXRfc21hcnRzdHJpbmdfYmFzZTY0KCk7CiAgICBpbml0X3NtYXJ0c3RyaW5nX2RvbWFpbigpOwogICAgaW5pdF9zbWFydHN0cmluZ19naXQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xvZGFzaC5jbG9uZWRlZXBANC41LjAvbm9kZV9tb2R1bGVzL2xvZGFzaC5jbG9uZWRlZXAvaW5kZXguanMKdmFyIHJlcXVpcmVfbG9kYXNoID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sb2Rhc2guY2xvbmVkZWVwQDQuNS4wL25vZGVfbW9kdWxlcy9sb2Rhc2guY2xvbmVkZWVwL2luZGV4LmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgIHZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwOwogICAgdmFyIEhBU0hfVU5ERUZJTkVEID0gIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iOwogICAgdmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxOwogICAgdmFyIGFyZ3NUYWcgPSAiW29iamVjdCBBcmd1bWVudHNdIiwgYXJyYXlUYWcgPSAiW29iamVjdCBBcnJheV0iLCBib29sVGFnID0gIltvYmplY3QgQm9vbGVhbl0iLCBkYXRlVGFnID0gIltvYmplY3QgRGF0ZV0iLCBlcnJvclRhZyA9ICJbb2JqZWN0IEVycm9yXSIsIGZ1bmNUYWcgPSAiW29iamVjdCBGdW5jdGlvbl0iLCBnZW5UYWcgPSAiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLCBtYXBUYWcgPSAiW29iamVjdCBNYXBdIiwgbnVtYmVyVGFnID0gIltvYmplY3QgTnVtYmVyXSIsIG9iamVjdFRhZyA9ICJbb2JqZWN0IE9iamVjdF0iLCBwcm9taXNlVGFnID0gIltvYmplY3QgUHJvbWlzZV0iLCByZWdleHBUYWcgPSAiW29iamVjdCBSZWdFeHBdIiwgc2V0VGFnID0gIltvYmplY3QgU2V0XSIsIHN0cmluZ1RhZyA9ICJbb2JqZWN0IFN0cmluZ10iLCBzeW1ib2xUYWcgPSAiW29iamVjdCBTeW1ib2xdIiwgd2Vha01hcFRhZyA9ICJbb2JqZWN0IFdlYWtNYXBdIjsKICAgIHZhciBhcnJheUJ1ZmZlclRhZyA9ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIsIGRhdGFWaWV3VGFnID0gIltvYmplY3QgRGF0YVZpZXddIiwgZmxvYXQzMlRhZyA9ICJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLCBmbG9hdDY0VGFnID0gIltvYmplY3QgRmxvYXQ2NEFycmF5XSIsIGludDhUYWcgPSAiW29iamVjdCBJbnQ4QXJyYXldIiwgaW50MTZUYWcgPSAiW29iamVjdCBJbnQxNkFycmF5XSIsIGludDMyVGFnID0gIltvYmplY3QgSW50MzJBcnJheV0iLCB1aW50OFRhZyA9ICJbb2JqZWN0IFVpbnQ4QXJyYXldIiwgdWludDhDbGFtcGVkVGFnID0gIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIiwgdWludDE2VGFnID0gIltvYmplY3QgVWludDE2QXJyYXldIiwgdWludDMyVGFnID0gIltvYmplY3QgVWludDMyQXJyYXldIjsKICAgIHZhciByZVJlZ0V4cENoYXIgPSAvW1xcXiQuKis/KClbXF17fXxdL2c7CiAgICB2YXIgcmVGbGFncyA9IC9cdyokLzsKICAgIHZhciByZUlzSG9zdEN0b3IgPSAvXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLzsKICAgIHZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxkKikkLzsKICAgIHZhciBjbG9uZWFibGVUYWdzID0ge307CiAgICBjbG9uZWFibGVUYWdzW2FyZ3NUYWddID0gY2xvbmVhYmxlVGFnc1thcnJheVRhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0YVZpZXdUYWddID0gY2xvbmVhYmxlVGFnc1tib29sVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0ZVRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWddID0gY2xvbmVhYmxlVGFnc1tmbG9hdDY0VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW2ludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MzJUYWddID0gY2xvbmVhYmxlVGFnc1ttYXBUYWddID0gY2xvbmVhYmxlVGFnc1tudW1iZXJUYWddID0gY2xvbmVhYmxlVGFnc1tvYmplY3RUYWddID0gY2xvbmVhYmxlVGFnc1tyZWdleHBUYWddID0gY2xvbmVhYmxlVGFnc1tzZXRUYWddID0gY2xvbmVhYmxlVGFnc1tzdHJpbmdUYWddID0gY2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQxNlRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQzMlRhZ10gPSB0cnVlOwogICAgY2xvbmVhYmxlVGFnc1tlcnJvclRhZ10gPSBjbG9uZWFibGVUYWdzW2Z1bmNUYWddID0gY2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlOwogICAgdmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICJvYmplY3QiICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsOwogICAgdmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gIm9iamVjdCIgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7CiAgICB2YXIgcm9vdDYgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCk7CiAgICB2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7CiAgICB2YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlOwogICAgdmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7CiAgICBmdW5jdGlvbiBhZGRNYXBFbnRyeShtYXA3LCBwYWlyKSB7CiAgICAgIG1hcDcuc2V0KHBhaXJbMF0sIHBhaXJbMV0pOwogICAgICByZXR1cm4gbWFwNzsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZFNldEVudHJ5KHNldDMsIHZhbHVlMikgewogICAgICBzZXQzLmFkZCh2YWx1ZTIpOwogICAgICByZXR1cm4gc2V0MzsKICAgIH0KICAgIGZ1bmN0aW9uIGFycmF5RWFjaChhcnJheSwgaXRlcmF0ZWUpIHsKICAgICAgdmFyIGluZGV4MiA9IC0xLCBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7CiAgICAgIHdoaWxlICgrK2luZGV4MiA8IGxlbmd0aCkgewogICAgICAgIGlmIChpdGVyYXRlZShhcnJheVtpbmRleDJdLCBpbmRleDIsIGFycmF5KSA9PT0gZmFsc2UpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYXJyYXk7CiAgICB9CiAgICBmdW5jdGlvbiBhcnJheVB1c2goYXJyYXksIHZhbHVlcykgewogICAgICB2YXIgaW5kZXgyID0gLTEsIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsIG9mZnNldCA9IGFycmF5Lmxlbmd0aDsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbGVuZ3RoKSB7CiAgICAgICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXgyXSA9IHZhbHVlc1tpbmRleDJdOwogICAgICB9CiAgICAgIHJldHVybiBhcnJheTsKICAgIH0KICAgIGZ1bmN0aW9uIGFycmF5UmVkdWNlKGFycmF5LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSkgewogICAgICB2YXIgaW5kZXgyID0gLTEsIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDsKICAgICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHsKICAgICAgICBhY2N1bXVsYXRvciA9IGFycmF5WysraW5kZXgyXTsKICAgICAgfQogICAgICB3aGlsZSAoKytpbmRleDIgPCBsZW5ndGgpIHsKICAgICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleDJdLCBpbmRleDIsIGFycmF5KTsKICAgICAgfQogICAgICByZXR1cm4gYWNjdW11bGF0b3I7CiAgICB9CiAgICBmdW5jdGlvbiBiYXNlVGltZXMobjEzLCBpdGVyYXRlZSkgewogICAgICB2YXIgaW5kZXgyID0gLTEsIHJlc3VsdCA9IEFycmF5KG4xMyk7CiAgICAgIHdoaWxlICgrK2luZGV4MiA8IG4xMykgewogICAgICAgIHJlc3VsdFtpbmRleDJdID0gaXRlcmF0ZWUoaW5kZXgyKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkyKSB7CiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHZvaWQgMCA6IG9iamVjdFtrZXkyXTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzSG9zdE9iamVjdCh2YWx1ZTIpIHsKICAgICAgdmFyIHJlc3VsdCA9IGZhbHNlOwogICAgICBpZiAodmFsdWUyICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlMi50b1N0cmluZyAhPSAiZnVuY3Rpb24iKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJlc3VsdCA9ICEhKHZhbHVlMiArICIiKTsKICAgICAgICB9IGNhdGNoIChlMTEpIHsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwNykgewogICAgICB2YXIgaW5kZXgyID0gLTEsIHJlc3VsdCA9IEFycmF5KG1hcDcuc2l6ZSk7CiAgICAgIG1hcDcuZm9yRWFjaChmdW5jdGlvbih2YWx1ZTIsIGtleTIpIHsKICAgICAgICByZXN1bHRbKytpbmRleDJdID0gW2tleTIsIHZhbHVlMl07CiAgICAgIH0pOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0yKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihhcmcpIHsKICAgICAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0yKGFyZykpOwogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc2V0VG9BcnJheShzZXQzKSB7CiAgICAgIHZhciBpbmRleDIgPSAtMSwgcmVzdWx0ID0gQXJyYXkoc2V0My5zaXplKTsKICAgICAgc2V0My5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlMikgewogICAgICAgIHJlc3VsdFsrK2luZGV4Ml0gPSB2YWx1ZTI7CiAgICAgIH0pOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgdmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSwgb2JqZWN0UHJvdG8yID0gT2JqZWN0LnByb3RvdHlwZTsKICAgIHZhciBjb3JlSnNEYXRhID0gcm9vdDZbIl9fY29yZS1qc19zaGFyZWRfXyJdOwogICAgdmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAiIik7CiAgICAgIHJldHVybiB1aWQgPyAiU3ltYm9sKHNyYylfMS4iICsgdWlkIDogIiI7CiAgICB9KSgpOwogICAgdmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZzsKICAgIHZhciBoYXNPd25Qcm9wZXJ0eTMgPSBvYmplY3RQcm90bzIuaGFzT3duUHJvcGVydHk7CiAgICB2YXIgb2JqZWN0VG9TdHJpbmcyID0gb2JqZWN0UHJvdG8yLnRvU3RyaW5nOwogICAgdmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoCiAgICAgICJeIiArIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5MykucmVwbGFjZShyZVJlZ0V4cENoYXIsICJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywgIiQxLio/IikgKyAiJCIKICAgICk7CiAgICB2YXIgQnVmZmVyMiA9IG1vZHVsZUV4cG9ydHMgPyByb290Ni5CdWZmZXIgOiB2b2lkIDAsIFN5bWJvbDIgPSByb290Ni5TeW1ib2wsIFVpbnQ4QXJyYXkyID0gcm9vdDYuVWludDhBcnJheSwgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCksIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGUsIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8yLnByb3BlcnR5SXNFbnVtZXJhYmxlLCBzcGxpY2UyID0gYXJyYXlQcm90by5zcGxpY2U7CiAgICB2YXIgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsIG5hdGl2ZUlzQnVmZmVyID0gQnVmZmVyMiA/IEJ1ZmZlcjIuaXNCdWZmZXIgOiB2b2lkIDAsIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpOwogICAgdmFyIERhdGFWaWV3MiA9IGdldE5hdGl2ZShyb290NiwgIkRhdGFWaWV3IiksIE1hcDMgPSBnZXROYXRpdmUocm9vdDYsICJNYXAiKSwgUHJvbWlzZTIgPSBnZXROYXRpdmUocm9vdDYsICJQcm9taXNlIiksIFNldDIgPSBnZXROYXRpdmUocm9vdDYsICJTZXQiKSwgV2Vha01hcDIgPSBnZXROYXRpdmUocm9vdDYsICJXZWFrTWFwIiksIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICJjcmVhdGUiKTsKICAgIHZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldzIpLCBtYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoTWFwMyksIHByb21pc2VDdG9yU3RyaW5nID0gdG9Tb3VyY2UoUHJvbWlzZTIpLCBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0MiksIHdlYWtNYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoV2Vha01hcDIpOwogICAgdmFyIHN5bWJvbFByb3RvID0gU3ltYm9sMiA/IFN5bWJvbDIucHJvdG90eXBlIDogdm9pZCAwLCBzeW1ib2xWYWx1ZU9mID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by52YWx1ZU9mIDogdm9pZCAwOwogICAgZnVuY3Rpb24gSGFzaDIoZW50cmllcykgewogICAgICB2YXIgaW5kZXgyID0gLTEsIGxlbmd0aCA9IGVudHJpZXMgPyBlbnRyaWVzLmxlbmd0aCA6IDA7CiAgICAgIHRoaXMuY2xlYXIoKTsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleDJdOwogICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGhhc2hDbGVhcigpIHsKICAgICAgdGhpcy5fX2RhdGFfXyA9IG5hdGl2ZUNyZWF0ZSA/IG5hdGl2ZUNyZWF0ZShudWxsKSA6IHt9OwogICAgfQogICAgZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkyKSB7CiAgICAgIHJldHVybiB0aGlzLmhhcyhrZXkyKSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXkyXTsKICAgIH0KICAgIGZ1bmN0aW9uIGhhc2hHZXQoa2V5MikgewogICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187CiAgICAgIGlmIChuYXRpdmVDcmVhdGUpIHsKICAgICAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXkyXTsKICAgICAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHZvaWQgMCA6IHJlc3VsdDsKICAgICAgfQogICAgICByZXR1cm4gaGFzT3duUHJvcGVydHkzLmNhbGwoZGF0YSwga2V5MikgPyBkYXRhW2tleTJdIDogdm9pZCAwOwogICAgfQogICAgZnVuY3Rpb24gaGFzaEhhcyhrZXkyKSB7CiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXzsKICAgICAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IGRhdGFba2V5Ml0gIT09IHZvaWQgMCA6IGhhc093blByb3BlcnR5My5jYWxsKGRhdGEsIGtleTIpOwogICAgfQogICAgZnVuY3Rpb24gaGFzaFNldChrZXkyLCB2YWx1ZTIpIHsKICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fOwogICAgICBkYXRhW2tleTJdID0gbmF0aXZlQ3JlYXRlICYmIHZhbHVlMiA9PT0gdm9pZCAwID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTI7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgSGFzaDIucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyOwogICAgSGFzaDIucHJvdG90eXBlWyJkZWxldGUiXSA9IGhhc2hEZWxldGU7CiAgICBIYXNoMi5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDsKICAgIEhhc2gyLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzOwogICAgSGFzaDIucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7CiAgICBmdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykgewogICAgICB2YXIgaW5kZXgyID0gLTEsIGxlbmd0aCA9IGVudHJpZXMgPyBlbnRyaWVzLmxlbmd0aCA6IDA7CiAgICAgIHRoaXMuY2xlYXIoKTsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleDJdOwogICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCkgewogICAgICB0aGlzLl9fZGF0YV9fID0gW107CiAgICB9CiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5MikgewogICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sIGluZGV4MiA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkyKTsKICAgICAgaWYgKGluZGV4MiA8IDApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTsKICAgICAgaWYgKGluZGV4MiA9PSBsYXN0SW5kZXgpIHsKICAgICAgICBkYXRhLnBvcCgpOwogICAgICB9IGVsc2UgewogICAgICAgIHNwbGljZTIuY2FsbChkYXRhLCBpbmRleDIsIDEpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleTIpIHsKICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLCBpbmRleDIgPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5Mik7CiAgICAgIHJldHVybiBpbmRleDIgPCAwID8gdm9pZCAwIDogZGF0YVtpbmRleDJdWzFdOwogICAgfQogICAgZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleTIpIHsKICAgICAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkyKSA+IC0xOwogICAgfQogICAgZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleTIsIHZhbHVlMikgewogICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sIGluZGV4MiA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkyKTsKICAgICAgaWYgKGluZGV4MiA8IDApIHsKICAgICAgICBkYXRhLnB1c2goW2tleTIsIHZhbHVlMl0pOwogICAgICB9IGVsc2UgewogICAgICAgIGRhdGFbaW5kZXgyXVsxXSA9IHZhbHVlMjsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIExpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBsaXN0Q2FjaGVDbGVhcjsKICAgIExpc3RDYWNoZS5wcm90b3R5cGVbImRlbGV0ZSJdID0gbGlzdENhY2hlRGVsZXRlOwogICAgTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7CiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IGxpc3RDYWNoZUhhczsKICAgIExpc3RDYWNoZS5wcm90b3R5cGUuc2V0ID0gbGlzdENhY2hlU2V0OwogICAgZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykgewogICAgICB2YXIgaW5kZXgyID0gLTEsIGxlbmd0aCA9IGVudHJpZXMgPyBlbnRyaWVzLmxlbmd0aCA6IDA7CiAgICAgIHRoaXMuY2xlYXIoKTsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleDJdOwogICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7CiAgICAgIHRoaXMuX19kYXRhX18gPSB7CiAgICAgICAgImhhc2giOiBuZXcgSGFzaDIoKSwKICAgICAgICAibWFwIjogbmV3IChNYXAzIHx8IExpc3RDYWNoZSkoKSwKICAgICAgICAic3RyaW5nIjogbmV3IEhhc2gyKCkKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleTIpIHsKICAgICAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5MilbImRlbGV0ZSJdKGtleTIpOwogICAgfQogICAgZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5MikgewogICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkyKS5nZXQoa2V5Mik7CiAgICB9CiAgICBmdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkyKSB7CiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleTIpLmhhcyhrZXkyKTsKICAgIH0KICAgIGZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleTIsIHZhbHVlMikgewogICAgICBnZXRNYXBEYXRhKHRoaXMsIGtleTIpLnNldChrZXkyLCB2YWx1ZTIpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIE1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7CiAgICBNYXBDYWNoZS5wcm90b3R5cGVbImRlbGV0ZSJdID0gbWFwQ2FjaGVEZWxldGU7CiAgICBNYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7CiAgICBNYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7CiAgICBNYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7CiAgICBmdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7CiAgICAgIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlKGVudHJpZXMpOwogICAgfQogICAgZnVuY3Rpb24gc3RhY2tDbGVhcigpIHsKICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoKTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleTIpIHsKICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX19bImRlbGV0ZSJdKGtleTIpOwogICAgfQogICAgZnVuY3Rpb24gc3RhY2tHZXQoa2V5MikgewogICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5Mik7CiAgICB9CiAgICBmdW5jdGlvbiBzdGFja0hhcyhrZXkyKSB7CiAgICAgIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyhrZXkyKTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0YWNrU2V0KGtleTIsIHZhbHVlMikgewogICAgICB2YXIgY2FjaGUgPSB0aGlzLl9fZGF0YV9fOwogICAgICBpZiAoY2FjaGUgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpIHsKICAgICAgICB2YXIgcGFpcnMyID0gY2FjaGUuX19kYXRhX187CiAgICAgICAgaWYgKCFNYXAzIHx8IHBhaXJzMi5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkgewogICAgICAgICAgcGFpcnMyLnB1c2goW2tleTIsIHZhbHVlMl0pOwogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIGNhY2hlID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZShwYWlyczIpOwogICAgICB9CiAgICAgIGNhY2hlLnNldChrZXkyLCB2YWx1ZTIpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIFN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7CiAgICBTdGFjay5wcm90b3R5cGVbImRlbGV0ZSJdID0gc3RhY2tEZWxldGU7CiAgICBTdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7CiAgICBTdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7CiAgICBTdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7CiAgICBmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlMiwgaW5oZXJpdGVkKSB7CiAgICAgIHZhciByZXN1bHQgPSBpc0FycmF5NSh2YWx1ZTIpIHx8IGlzQXJndW1lbnRzKHZhbHVlMikgPyBiYXNlVGltZXModmFsdWUyLmxlbmd0aCwgU3RyaW5nKSA6IFtdOwogICAgICB2YXIgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aCwgc2tpcEluZGV4ZXMgPSAhIWxlbmd0aDsKICAgICAgZm9yICh2YXIga2V5MiBpbiB2YWx1ZTIpIHsKICAgICAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eTMuY2FsbCh2YWx1ZTIsIGtleTIpKSAmJiAhKHNraXBJbmRleGVzICYmIChrZXkyID09ICJsZW5ndGgiIHx8IGlzSW5kZXgoa2V5MiwgbGVuZ3RoKSkpKSB7CiAgICAgICAgICByZXN1bHQucHVzaChrZXkyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCwga2V5MiwgdmFsdWUyKSB7CiAgICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXkyXTsKICAgICAgaWYgKCEoaGFzT3duUHJvcGVydHkzLmNhbGwob2JqZWN0LCBrZXkyKSAmJiBlcShvYmpWYWx1ZSwgdmFsdWUyKSkgfHwgdmFsdWUyID09PSB2b2lkIDAgJiYgIShrZXkyIGluIG9iamVjdCkpIHsKICAgICAgICBvYmplY3Rba2V5Ml0gPSB2YWx1ZTI7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5MikgewogICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKICAgICAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5MikpIHsKICAgICAgICAgIHJldHVybiBsZW5ndGg7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LCBzb3VyY2UpIHsKICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5czIoc291cmNlKSwgb2JqZWN0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZTIsIGlzRGVlcCwgaXNGdWxsLCBjdXN0b21pemVyLCBrZXkyLCBvYmplY3QsIHN0YWNrKSB7CiAgICAgIHZhciByZXN1bHQ7CiAgICAgIGlmIChjdXN0b21pemVyKSB7CiAgICAgICAgcmVzdWx0ID0gb2JqZWN0ID8gY3VzdG9taXplcih2YWx1ZTIsIGtleTIsIG9iamVjdCwgc3RhY2spIDogY3VzdG9taXplcih2YWx1ZTIpOwogICAgICB9CiAgICAgIGlmIChyZXN1bHQgIT09IHZvaWQgMCkgewogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgaWYgKCFpc09iamVjdDQodmFsdWUyKSkgewogICAgICAgIHJldHVybiB2YWx1ZTI7CiAgICAgIH0KICAgICAgdmFyIGlzQXJyID0gaXNBcnJheTUodmFsdWUyKTsKICAgICAgaWYgKGlzQXJyKSB7CiAgICAgICAgcmVzdWx0ID0gaW5pdENsb25lQXJyYXkodmFsdWUyKTsKICAgICAgICBpZiAoIWlzRGVlcCkgewogICAgICAgICAgcmV0dXJuIGNvcHlBcnJheSh2YWx1ZTIsIHJlc3VsdCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUyKSwgaXNGdW5jID0gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZzsKICAgICAgICBpZiAoaXNCdWZmZXIodmFsdWUyKSkgewogICAgICAgICAgcmV0dXJuIGNsb25lQnVmZmVyKHZhbHVlMiwgaXNEZWVwKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRhZyA9PSBvYmplY3RUYWcgfHwgdGFnID09IGFyZ3NUYWcgfHwgaXNGdW5jICYmICFvYmplY3QpIHsKICAgICAgICAgIGlmIChpc0hvc3RPYmplY3QodmFsdWUyKSkgewogICAgICAgICAgICByZXR1cm4gb2JqZWN0ID8gdmFsdWUyIDoge307CiAgICAgICAgICB9CiAgICAgICAgICByZXN1bHQgPSBpbml0Q2xvbmVPYmplY3QoaXNGdW5jID8ge30gOiB2YWx1ZTIpOwogICAgICAgICAgaWYgKCFpc0RlZXApIHsKICAgICAgICAgICAgcmV0dXJuIGNvcHlTeW1ib2xzKHZhbHVlMiwgYmFzZUFzc2lnbihyZXN1bHQsIHZhbHVlMikpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIWNsb25lYWJsZVRhZ3NbdGFnXSkgewogICAgICAgICAgICByZXR1cm4gb2JqZWN0ID8gdmFsdWUyIDoge307CiAgICAgICAgICB9CiAgICAgICAgICByZXN1bHQgPSBpbml0Q2xvbmVCeVRhZyh2YWx1ZTIsIHRhZywgYmFzZUNsb25lLCBpc0RlZXApOwogICAgICAgIH0KICAgICAgfQogICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2soKSk7CiAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KHZhbHVlMik7CiAgICAgIGlmIChzdGFja2VkKSB7CiAgICAgICAgcmV0dXJuIHN0YWNrZWQ7CiAgICAgIH0KICAgICAgc3RhY2suc2V0KHZhbHVlMiwgcmVzdWx0KTsKICAgICAgaWYgKCFpc0FycikgewogICAgICAgIHZhciBwcm9wcyA9IGlzRnVsbCA/IGdldEFsbEtleXModmFsdWUyKSA6IGtleXMyKHZhbHVlMik7CiAgICAgIH0KICAgICAgYXJyYXlFYWNoKHByb3BzIHx8IHZhbHVlMiwgZnVuY3Rpb24oc3ViVmFsdWUsIGtleTMpIHsKICAgICAgICBpZiAocHJvcHMpIHsKICAgICAgICAgIGtleTMgPSBzdWJWYWx1ZTsKICAgICAgICAgIHN1YlZhbHVlID0gdmFsdWUyW2tleTNdOwogICAgICAgIH0KICAgICAgICBhc3NpZ25WYWx1ZShyZXN1bHQsIGtleTMsIGJhc2VDbG9uZShzdWJWYWx1ZSwgaXNEZWVwLCBpc0Z1bGwsIGN1c3RvbWl6ZXIsIGtleTMsIHZhbHVlMiwgc3RhY2spKTsKICAgICAgfSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBiYXNlQ3JlYXRlKHByb3RvKSB7CiAgICAgIHJldHVybiBpc09iamVjdDQocHJvdG8pID8gb2JqZWN0Q3JlYXRlKHByb3RvKSA6IHt9OwogICAgfQogICAgZnVuY3Rpb24gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzRnVuYywgc3ltYm9sc0Z1bmMpIHsKICAgICAgdmFyIHJlc3VsdCA9IGtleXNGdW5jKG9iamVjdCk7CiAgICAgIHJldHVybiBpc0FycmF5NShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7CiAgICB9CiAgICBmdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlMikgewogICAgICByZXR1cm4gb2JqZWN0VG9TdHJpbmcyLmNhbGwodmFsdWUyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZTIpIHsKICAgICAgaWYgKCFpc09iamVjdDQodmFsdWUyKSB8fCBpc01hc2tlZCh2YWx1ZTIpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbjIodmFsdWUyKSB8fCBpc0hvc3RPYmplY3QodmFsdWUyKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7CiAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUyKSk7CiAgICB9CiAgICBmdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHsKICAgICAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7CiAgICAgICAgcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTsKICAgICAgfQogICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgIGZvciAodmFyIGtleTIgaW4gT2JqZWN0KG9iamVjdCkpIHsKICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkzLmNhbGwob2JqZWN0LCBrZXkyKSAmJiBrZXkyICE9ICJjb25zdHJ1Y3RvciIpIHsKICAgICAgICAgIHJlc3VsdC5wdXNoKGtleTIpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyMiwgaXNEZWVwKSB7CiAgICAgIGlmIChpc0RlZXApIHsKICAgICAgICByZXR1cm4gYnVmZmVyMi5zbGljZSgpOwogICAgICB9CiAgICAgIHZhciByZXN1bHQgPSBuZXcgYnVmZmVyMi5jb25zdHJ1Y3RvcihidWZmZXIyLmxlbmd0aCk7CiAgICAgIGJ1ZmZlcjIuY29weShyZXN1bHQpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcikgewogICAgICB2YXIgcmVzdWx0ID0gbmV3IGFycmF5QnVmZmVyLmNvbnN0cnVjdG9yKGFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpOwogICAgICBuZXcgVWludDhBcnJheTIocmVzdWx0KS5zZXQobmV3IFVpbnQ4QXJyYXkyKGFycmF5QnVmZmVyKSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBjbG9uZURhdGFWaWV3KGRhdGFWaWV3LCBpc0RlZXApIHsKICAgICAgdmFyIGJ1ZmZlcjIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKGRhdGFWaWV3LmJ1ZmZlcikgOiBkYXRhVmlldy5idWZmZXI7CiAgICAgIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyMiwgZGF0YVZpZXcuYnl0ZU9mZnNldCwgZGF0YVZpZXcuYnl0ZUxlbmd0aCk7CiAgICB9CiAgICBmdW5jdGlvbiBjbG9uZU1hcChtYXA3LCBpc0RlZXAsIGNsb25lRnVuYykgewogICAgICB2YXIgYXJyYXkgPSBpc0RlZXAgPyBjbG9uZUZ1bmMobWFwVG9BcnJheShtYXA3KSwgdHJ1ZSkgOiBtYXBUb0FycmF5KG1hcDcpOwogICAgICByZXR1cm4gYXJyYXlSZWR1Y2UoYXJyYXksIGFkZE1hcEVudHJ5LCBuZXcgbWFwNy5jb25zdHJ1Y3RvcigpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkgewogICAgICB2YXIgcmVzdWx0ID0gbmV3IHJlZ2V4cC5jb25zdHJ1Y3RvcihyZWdleHAuc291cmNlLCByZUZsYWdzLmV4ZWMocmVnZXhwKSk7CiAgICAgIHJlc3VsdC5sYXN0SW5kZXggPSByZWdleHAubGFzdEluZGV4OwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gY2xvbmVTZXQoc2V0MywgaXNEZWVwLCBjbG9uZUZ1bmMpIHsKICAgICAgdmFyIGFycmF5ID0gaXNEZWVwID8gY2xvbmVGdW5jKHNldFRvQXJyYXkoc2V0MyksIHRydWUpIDogc2V0VG9BcnJheShzZXQzKTsKICAgICAgcmV0dXJuIGFycmF5UmVkdWNlKGFycmF5LCBhZGRTZXRFbnRyeSwgbmV3IHNldDMuY29uc3RydWN0b3IoKSk7CiAgICB9CiAgICBmdW5jdGlvbiBjbG9uZVN5bWJvbChzeW1ib2wpIHsKICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307CiAgICB9CiAgICBmdW5jdGlvbiBjbG9uZVR5cGVkQXJyYXkodHlwZWRBcnJheSwgaXNEZWVwKSB7CiAgICAgIHZhciBidWZmZXIyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcikgOiB0eXBlZEFycmF5LmJ1ZmZlcjsKICAgICAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlcjIsIHR5cGVkQXJyYXkuYnl0ZU9mZnNldCwgdHlwZWRBcnJheS5sZW5ndGgpOwogICAgfQogICAgZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHsKICAgICAgdmFyIGluZGV4MiA9IC0xLCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoOwogICAgICBhcnJheSB8fCAoYXJyYXkgPSBBcnJheShsZW5ndGgpKTsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbGVuZ3RoKSB7CiAgICAgICAgYXJyYXlbaW5kZXgyXSA9IHNvdXJjZVtpbmRleDJdOwogICAgICB9CiAgICAgIHJldHVybiBhcnJheTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLCBwcm9wcywgb2JqZWN0LCBjdXN0b21pemVyKSB7CiAgICAgIG9iamVjdCB8fCAob2JqZWN0ID0ge30pOwogICAgICB2YXIgaW5kZXgyID0gLTEsIGxlbmd0aCA9IHByb3BzLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIGtleTIgPSBwcm9wc1tpbmRleDJdOwogICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKG9iamVjdFtrZXkyXSwgc291cmNlW2tleTJdLCBrZXkyLCBvYmplY3QsIHNvdXJjZSkgOiB2b2lkIDA7CiAgICAgICAgYXNzaWduVmFsdWUob2JqZWN0LCBrZXkyLCBuZXdWYWx1ZSA9PT0gdm9pZCAwID8gc291cmNlW2tleTJdIDogbmV3VmFsdWUpOwogICAgICB9CiAgICAgIHJldHVybiBvYmplY3Q7CiAgICB9CiAgICBmdW5jdGlvbiBjb3B5U3ltYm9scyhzb3VyY2UsIG9iamVjdCkgewogICAgICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHMoc291cmNlKSwgb2JqZWN0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7CiAgICAgIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXMyLCBnZXRTeW1ib2xzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldE1hcERhdGEobWFwNywga2V5MikgewogICAgICB2YXIgZGF0YSA9IG1hcDcuX19kYXRhX187CiAgICAgIHJldHVybiBpc0tleWFibGUoa2V5MikgPyBkYXRhW3R5cGVvZiBrZXkyID09ICJzdHJpbmciID8gInN0cmluZyIgOiAiaGFzaCJdIDogZGF0YS5tYXA7CiAgICB9CiAgICBmdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkyKSB7CiAgICAgIHZhciB2YWx1ZTIgPSBnZXRWYWx1ZShvYmplY3QsIGtleTIpOwogICAgICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlMikgPyB2YWx1ZTIgOiB2b2lkIDA7CiAgICB9CiAgICB2YXIgZ2V0U3ltYm9scyA9IG5hdGl2ZUdldFN5bWJvbHMgPyBvdmVyQXJnKG5hdGl2ZUdldFN5bWJvbHMsIE9iamVjdCkgOiBzdHViQXJyYXk7CiAgICB2YXIgZ2V0VGFnID0gYmFzZUdldFRhZzsKICAgIGlmIChEYXRhVmlldzIgJiYgZ2V0VGFnKG5ldyBEYXRhVmlldzIobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcgfHwgTWFwMyAmJiBnZXRUYWcobmV3IE1hcDMoKSkgIT0gbWFwVGFnIHx8IFByb21pc2UyICYmIGdldFRhZyhQcm9taXNlMi5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcgfHwgU2V0MiAmJiBnZXRUYWcobmV3IFNldDIoKSkgIT0gc2V0VGFnIHx8IFdlYWtNYXAyICYmIGdldFRhZyhuZXcgV2Vha01hcDIoKSkgIT0gd2Vha01hcFRhZykgewogICAgICBnZXRUYWcgPSBmdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgICB2YXIgcmVzdWx0ID0gb2JqZWN0VG9TdHJpbmcyLmNhbGwodmFsdWUyKSwgQ3RvciA9IHJlc3VsdCA9PSBvYmplY3RUYWcgPyB2YWx1ZTIuY29uc3RydWN0b3IgOiB2b2lkIDAsIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiB2b2lkIDA7CiAgICAgICAgaWYgKGN0b3JTdHJpbmcpIHsKICAgICAgICAgIHN3aXRjaCAoY3RvclN0cmluZykgewogICAgICAgICAgICBjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzoKICAgICAgICAgICAgICByZXR1cm4gZGF0YVZpZXdUYWc7CiAgICAgICAgICAgIGNhc2UgbWFwQ3RvclN0cmluZzoKICAgICAgICAgICAgICByZXR1cm4gbWFwVGFnOwogICAgICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOgogICAgICAgICAgICAgIHJldHVybiBwcm9taXNlVGFnOwogICAgICAgICAgICBjYXNlIHNldEN0b3JTdHJpbmc6CiAgICAgICAgICAgICAgcmV0dXJuIHNldFRhZzsKICAgICAgICAgICAgY2FzZSB3ZWFrTWFwQ3RvclN0cmluZzoKICAgICAgICAgICAgICByZXR1cm4gd2Vha01hcFRhZzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7CiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsIHJlc3VsdCA9IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7CiAgICAgIGlmIChsZW5ndGggJiYgdHlwZW9mIGFycmF5WzBdID09ICJzdHJpbmciICYmIGhhc093blByb3BlcnR5My5jYWxsKGFycmF5LCAiaW5kZXgiKSkgewogICAgICAgIHJlc3VsdC5pbmRleCA9IGFycmF5LmluZGV4OwogICAgICAgIHJlc3VsdC5pbnB1dCA9IGFycmF5LmlucHV0OwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qob2JqZWN0KSB7CiAgICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0LmNvbnN0cnVjdG9yID09ICJmdW5jdGlvbiIgJiYgIWlzUHJvdG90eXBlKG9iamVjdCkgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKSA6IHt9OwogICAgfQogICAgZnVuY3Rpb24gaW5pdENsb25lQnlUYWcob2JqZWN0LCB0YWcsIGNsb25lRnVuYywgaXNEZWVwKSB7CiAgICAgIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yOwogICAgICBzd2l0Y2ggKHRhZykgewogICAgICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6CiAgICAgICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpOwogICAgICAgIGNhc2UgYm9vbFRhZzoKICAgICAgICBjYXNlIGRhdGVUYWc6CiAgICAgICAgICByZXR1cm4gbmV3IEN0b3IoK29iamVjdCk7CiAgICAgICAgY2FzZSBkYXRhVmlld1RhZzoKICAgICAgICAgIHJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCwgaXNEZWVwKTsKICAgICAgICBjYXNlIGZsb2F0MzJUYWc6CiAgICAgICAgY2FzZSBmbG9hdDY0VGFnOgogICAgICAgIGNhc2UgaW50OFRhZzoKICAgICAgICBjYXNlIGludDE2VGFnOgogICAgICAgIGNhc2UgaW50MzJUYWc6CiAgICAgICAgY2FzZSB1aW50OFRhZzoKICAgICAgICBjYXNlIHVpbnQ4Q2xhbXBlZFRhZzoKICAgICAgICBjYXNlIHVpbnQxNlRhZzoKICAgICAgICBjYXNlIHVpbnQzMlRhZzoKICAgICAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApOwogICAgICAgIGNhc2UgbWFwVGFnOgogICAgICAgICAgcmV0dXJuIGNsb25lTWFwKG9iamVjdCwgaXNEZWVwLCBjbG9uZUZ1bmMpOwogICAgICAgIGNhc2UgbnVtYmVyVGFnOgogICAgICAgIGNhc2Ugc3RyaW5nVGFnOgogICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7CiAgICAgICAgY2FzZSByZWdleHBUYWc6CiAgICAgICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTsKICAgICAgICBjYXNlIHNldFRhZzoKICAgICAgICAgIHJldHVybiBjbG9uZVNldChvYmplY3QsIGlzRGVlcCwgY2xvbmVGdW5jKTsKICAgICAgICBjYXNlIHN5bWJvbFRhZzoKICAgICAgICAgIHJldHVybiBjbG9uZVN5bWJvbChvYmplY3QpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBpc0luZGV4KHZhbHVlMiwgbGVuZ3RoKSB7CiAgICAgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDsKICAgICAgcmV0dXJuICEhbGVuZ3RoICYmICh0eXBlb2YgdmFsdWUyID09ICJudW1iZXIiIHx8IHJlSXNVaW50LnRlc3QodmFsdWUyKSkgJiYgKHZhbHVlMiA+IC0xICYmIHZhbHVlMiAlIDEgPT0gMCAmJiB2YWx1ZTIgPCBsZW5ndGgpOwogICAgfQogICAgZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlMikgewogICAgICB2YXIgdHlwZTUgPSB0eXBlb2YgdmFsdWUyOwogICAgICByZXR1cm4gdHlwZTUgPT0gInN0cmluZyIgfHwgdHlwZTUgPT0gIm51bWJlciIgfHwgdHlwZTUgPT0gInN5bWJvbCIgfHwgdHlwZTUgPT0gImJvb2xlYW4iID8gdmFsdWUyICE9PSAiX19wcm90b19fIiA6IHZhbHVlMiA9PT0gbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHsKICAgICAgcmV0dXJuICEhbWFza1NyY0tleSAmJiBtYXNrU3JjS2V5IGluIGZ1bmM7CiAgICB9CiAgICBmdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZTIpIHsKICAgICAgdmFyIEN0b3IgPSB2YWx1ZTIgJiYgdmFsdWUyLmNvbnN0cnVjdG9yLCBwcm90byA9IHR5cGVvZiBDdG9yID09ICJmdW5jdGlvbiIgJiYgQ3Rvci5wcm90b3R5cGUgfHwgb2JqZWN0UHJvdG8yOwogICAgICByZXR1cm4gdmFsdWUyID09PSBwcm90bzsKICAgIH0KICAgIGZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpIHsKICAgICAgaWYgKGZ1bmMgIT0gbnVsbCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyk7CiAgICAgICAgfSBjYXRjaCAoZTExKSB7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gZnVuYyArICIiOwogICAgICAgIH0gY2F0Y2ggKGUxMSkgewogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBmdW5jdGlvbiBjbG9uZURlZXAodmFsdWUyKSB7CiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUyLCB0cnVlLCB0cnVlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGVxKHZhbHVlMiwgb3RoZXIpIHsKICAgICAgcmV0dXJuIHZhbHVlMiA9PT0gb3RoZXIgfHwgdmFsdWUyICE9PSB2YWx1ZTIgJiYgb3RoZXIgIT09IG90aGVyOwogICAgfQogICAgZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUyKSB7CiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZTIpICYmIGhhc093blByb3BlcnR5My5jYWxsKHZhbHVlMiwgImNhbGxlZSIpICYmICghcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZTIsICJjYWxsZWUiKSB8fCBvYmplY3RUb1N0cmluZzIuY2FsbCh2YWx1ZTIpID09IGFyZ3NUYWcpOwogICAgfQogICAgdmFyIGlzQXJyYXk1ID0gQXJyYXkuaXNBcnJheTsKICAgIGZ1bmN0aW9uIGlzQXJyYXlMaWtlMih2YWx1ZTIpIHsKICAgICAgcmV0dXJuIHZhbHVlMiAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlMi5sZW5ndGgpICYmICFpc0Z1bmN0aW9uMih2YWx1ZTIpOwogICAgfQogICAgZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUyKSB7CiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUyKSAmJiBpc0FycmF5TGlrZTIodmFsdWUyKTsKICAgIH0KICAgIHZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTsKICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24yKHZhbHVlMikgewogICAgICB2YXIgdGFnID0gaXNPYmplY3Q0KHZhbHVlMikgPyBvYmplY3RUb1N0cmluZzIuY2FsbCh2YWx1ZTIpIDogIiI7CiAgICAgIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnOwogICAgfQogICAgZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUyKSB7CiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUyID09ICJudW1iZXIiICYmIHZhbHVlMiA+IC0xICYmIHZhbHVlMiAlIDEgPT0gMCAmJiB2YWx1ZTIgPD0gTUFYX1NBRkVfSU5URUdFUjsKICAgIH0KICAgIGZ1bmN0aW9uIGlzT2JqZWN0NCh2YWx1ZTIpIHsKICAgICAgdmFyIHR5cGU1ID0gdHlwZW9mIHZhbHVlMjsKICAgICAgcmV0dXJuICEhdmFsdWUyICYmICh0eXBlNSA9PSAib2JqZWN0IiB8fCB0eXBlNSA9PSAiZnVuY3Rpb24iKTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZTIpIHsKICAgICAgcmV0dXJuICEhdmFsdWUyICYmIHR5cGVvZiB2YWx1ZTIgPT0gIm9iamVjdCI7CiAgICB9CiAgICBmdW5jdGlvbiBrZXlzMihvYmplY3QpIHsKICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlMihvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QpIDogYmFzZUtleXMob2JqZWN0KTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0dWJBcnJheSgpIHsKICAgICAgcmV0dXJuIFtdOwogICAgfQogICAgZnVuY3Rpb24gc3R1YkZhbHNlKCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBtb2R1bGUuZXhwb3J0cyA9IGNsb25lRGVlcDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5QDIuMS4wL25vZGVfbW9kdWxlcy9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeS9pbmRleC5qcwp2YXIgcmVxdWlyZV9mYXN0X2pzb25fc3RhYmxlX3N0cmluZ2lmeSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnlAMi4xLjAvbm9kZV9tb2R1bGVzL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5L2luZGV4LmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZGF0YSwgb3B0cykgewogICAgICBpZiAoIW9wdHMpIG9wdHMgPSB7fTsKICAgICAgaWYgKHR5cGVvZiBvcHRzID09PSAiZnVuY3Rpb24iKSBvcHRzID0geyBjbXA6IG9wdHMgfTsKICAgICAgdmFyIGN5Y2xlcyA9IHR5cGVvZiBvcHRzLmN5Y2xlcyA9PT0gImJvb2xlYW4iID8gb3B0cy5jeWNsZXMgOiBmYWxzZTsKICAgICAgdmFyIGNtcCA9IG9wdHMuY21wICYmIC8qIEBfX1BVUkVfXyAqLyAoZnVuY3Rpb24oZjgpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24obm9kZTIpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihhNSwgYjYpIHsKICAgICAgICAgICAgdmFyIGFvYmogPSB7IGtleTogYTUsIHZhbHVlOiBub2RlMlthNV0gfTsKICAgICAgICAgICAgdmFyIGJvYmogPSB7IGtleTogYjYsIHZhbHVlOiBub2RlMltiNl0gfTsKICAgICAgICAgICAgcmV0dXJuIGY4KGFvYmosIGJvYmopOwogICAgICAgICAgfTsKICAgICAgICB9OwogICAgICB9KShvcHRzLmNtcCk7CiAgICAgIHZhciBzZWVuID0gW107CiAgICAgIHJldHVybiAoZnVuY3Rpb24gc3RyaW5naWZ5Nyhub2RlMikgewogICAgICAgIGlmIChub2RlMiAmJiBub2RlMi50b0pTT04gJiYgdHlwZW9mIG5vZGUyLnRvSlNPTiA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgbm9kZTIgPSBub2RlMi50b0pTT04oKTsKICAgICAgICB9CiAgICAgICAgaWYgKG5vZGUyID09PSB2b2lkIDApIHJldHVybjsKICAgICAgICBpZiAodHlwZW9mIG5vZGUyID09ICJudW1iZXIiKSByZXR1cm4gaXNGaW5pdGUobm9kZTIpID8gIiIgKyBub2RlMiA6ICJudWxsIjsKICAgICAgICBpZiAodHlwZW9mIG5vZGUyICE9PSAib2JqZWN0IikgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG5vZGUyKTsKICAgICAgICB2YXIgaTExLCBvdXQ7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobm9kZTIpKSB7CiAgICAgICAgICBvdXQgPSAiWyI7CiAgICAgICAgICBmb3IgKGkxMSA9IDA7IGkxMSA8IG5vZGUyLmxlbmd0aDsgaTExKyspIHsKICAgICAgICAgICAgaWYgKGkxMSkgb3V0ICs9ICIsIjsKICAgICAgICAgICAgb3V0ICs9IHN0cmluZ2lmeTcobm9kZTJbaTExXSkgfHwgIm51bGwiOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG91dCArICJdIjsKICAgICAgICB9CiAgICAgICAgaWYgKG5vZGUyID09PSBudWxsKSByZXR1cm4gIm51bGwiOwogICAgICAgIGlmIChzZWVuLmluZGV4T2Yobm9kZTIpICE9PSAtMSkgewogICAgICAgICAgaWYgKGN5Y2xlcykgcmV0dXJuIEpTT04uc3RyaW5naWZ5KCJfX2N5Y2xlX18iKTsKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNvbnZlcnRpbmcgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEpTT04iKTsKICAgICAgICB9CiAgICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ucHVzaChub2RlMikgLSAxOwogICAgICAgIHZhciBrZXlzMiA9IE9iamVjdC5rZXlzKG5vZGUyKS5zb3J0KGNtcCAmJiBjbXAobm9kZTIpKTsKICAgICAgICBvdXQgPSAiIjsKICAgICAgICBmb3IgKGkxMSA9IDA7IGkxMSA8IGtleXMyLmxlbmd0aDsgaTExKyspIHsKICAgICAgICAgIHZhciBrZXkyID0ga2V5czJbaTExXTsKICAgICAgICAgIHZhciB2YWx1ZTIgPSBzdHJpbmdpZnk3KG5vZGUyW2tleTJdKTsKICAgICAgICAgIGlmICghdmFsdWUyKSBjb250aW51ZTsKICAgICAgICAgIGlmIChvdXQpIG91dCArPSAiLCI7CiAgICAgICAgICBvdXQgKz0gSlNPTi5zdHJpbmdpZnkoa2V5MikgKyAiOiIgKyB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgIHNlZW4uc3BsaWNlKHNlZW5JbmRleCwgMSk7CiAgICAgICAgcmV0dXJuICJ7IiArIG91dCArICJ9IjsKICAgICAgfSkoZGF0YSk7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRqc29uQDYuMC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGpzb24vZGlzdF90cy9zbWFydGpzb24ucGx1Z2lucy5qcwp2YXIgaW1wb3J0X2xvZGFzaCwgaW1wb3J0X2Zhc3RfanNvbl9zdGFibGVfc3RyaW5naWZ5LCBzdGFibGVKc29uOwp2YXIgaW5pdF9zbWFydGpzb25fcGx1Z2lucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA2LjAuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvc21hcnRqc29uLnBsdWdpbnMuanMiKCkgewogICAgaW5pdF9kaXN0X3RzMTIoKTsKICAgIGluaXRfZGlzdF90czEzKCk7CiAgICBpbXBvcnRfbG9kYXNoID0gX190b0VTTShyZXF1aXJlX2xvZGFzaCgpLCAxKTsKICAgIGltcG9ydF9mYXN0X2pzb25fc3RhYmxlX3N0cmluZ2lmeSA9IF9fdG9FU00ocmVxdWlyZV9mYXN0X2pzb25fc3RhYmxlX3N0cmluZ2lmeSgpLCAxKTsKICAgIHN0YWJsZUpzb24gPSBpbXBvcnRfZmFzdF9qc29uX3N0YWJsZV9zdHJpbmdpZnkuZGVmYXVsdDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA2LjAuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvYnVmZmVyaGFuZGxpbmcuanMKZnVuY3Rpb24gYmFzZTY0RW5jb2RlKGRhdGEpIHsKICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gInVuZGVmaW5lZCIpIHsKICAgIHJldHVybiBCdWZmZXIuZnJvbShkYXRhKS50b1N0cmluZygiYmFzZTY0Iik7CiAgfQogIHJldHVybiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uZGF0YSkpOwp9CmZ1bmN0aW9uIGJhc2U2NERlY29kZShzdHIpIHsKICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gInVuZGVmaW5lZCIpIHsKICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5mcm9tKHN0ciwgImJhc2U2NCIpOwogICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1Zi5idWZmZXIsIGJ1Zi5ieXRlT2Zmc2V0LCBidWYuYnl0ZUxlbmd0aCk7CiAgfQogIHJldHVybiBuZXcgVWludDhBcnJheShBcnJheS5mcm9tKGF0b2Ioc3RyKSkubWFwKChjaGFyKSA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpKTsKfQpmdW5jdGlvbiBzdHJpbmdpZnkodmFsdWUyLCBzcGFjZTIpIHsKICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUyLCByZXBsYWNlciwgc3BhY2UyKTsKfQpmdW5jdGlvbiBwYXJzZTIodGV4dDkpIHsKICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0OSwgcmV2aXZlcik7Cn0KZnVuY3Rpb24gaXNFbmNvZGVkQnVmZmVyKHg0KSB7CiAgcmV0dXJuIGlzT2JqZWN0KHg0KSAmJiB4NC50eXBlID09PSAiRW5jb2RlZEJ1ZmZlciIgJiYgaXNTdHJpbmcoeDQuZGF0YSk7Cn0KZnVuY3Rpb24gaXNCdWZmZXJMaWtlMih4NCkgewogIHJldHVybiBpc09iamVjdCh4NCkgJiYgKHg0LnR5cGUgPT09ICJCdWZmZXIiICYmIChpc0FycmF5Myh4NC5kYXRhKSB8fCBpc1N0cmluZyh4NC5kYXRhKSkpIHx8IHg0IGluc3RhbmNlb2YgVWludDhBcnJheTsKfQpmdW5jdGlvbiBpc0FycmF5Myh4NCkgewogIHJldHVybiBBcnJheS5pc0FycmF5KHg0KTsKfQpmdW5jdGlvbiBpc1N0cmluZyh4NCkgewogIHJldHVybiB0eXBlb2YgeDQgPT09ICJzdHJpbmciOwp9CmZ1bmN0aW9uIGlzT2JqZWN0KHg0KSB7CiAgcmV0dXJuIHR5cGVvZiB4NCA9PT0gIm9iamVjdCIgJiYgeDQgIT09IG51bGw7Cn0KdmFyIHJlcGxhY2VyLCByZXZpdmVyOwp2YXIgaW5pdF9idWZmZXJoYW5kbGluZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA2LjAuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvYnVmZmVyaGFuZGxpbmcuanMiKCkgewogICAgaW5pdF9zbWFydGpzb25fcGx1Z2lucygpOwogICAgcmVwbGFjZXIgPSAoa2V5MiwgdmFsdWUyKSA9PiB7CiAgICAgIGlmIChpc0J1ZmZlckxpa2UyKHZhbHVlMikpIHsKICAgICAgICBsZXQgYnVmZmVyRGF0YTsKICAgICAgICBpZiAoImRhdGEiIGluIHZhbHVlMiAmJiBpc0FycmF5Myh2YWx1ZTIuZGF0YSkpIHsKICAgICAgICAgIGJ1ZmZlckRhdGEgPSBuZXcgVWludDhBcnJheSh2YWx1ZTIuZGF0YSk7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZTIgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7CiAgICAgICAgICBidWZmZXJEYXRhID0gdmFsdWUyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gdmFsdWUyOwogICAgICAgIH0KICAgICAgICBjb25zdCBiYXNlNjREYXRhID0gImJhc2U2NDoiICsgYmFzZTY0RW5jb2RlKGJ1ZmZlckRhdGEpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAiRW5jb2RlZEJ1ZmZlciIsCiAgICAgICAgICBkYXRhOiBiYXNlNjREYXRhCiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gdmFsdWUyOwogICAgfTsKICAgIHJldml2ZXIgPSAoa2V5MiwgdmFsdWUyKSA9PiB7CiAgICAgIGlmIChpc0VuY29kZWRCdWZmZXIodmFsdWUyKSkgewogICAgICAgIGlmIChpc1N0cmluZyh2YWx1ZTIuZGF0YSkgJiYgdmFsdWUyLmRhdGEuc3RhcnRzV2l0aCgiYmFzZTY0OiIpKSB7CiAgICAgICAgICBjb25zdCBiYXNlNjREYXRhID0gdmFsdWUyLmRhdGEuc2xpY2UoNyk7CiAgICAgICAgICBjb25zdCBidWZmZXIyID0gYmFzZTY0RGVjb2RlKGJhc2U2NERhdGEpOwogICAgICAgICAgcmV0dXJuIGJ1ZmZlcjI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB2YWx1ZTI7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRqc29uQDYuMC4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGpzb24vZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMTQgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMTQsIHsKICBTbWFydGpzb246ICgpID0+IFNtYXJ0anNvbiwKICBkZWVwRXF1YWxKc29uTFN0cmluZ3M6ICgpID0+IGRlZXBFcXVhbEpzb25MU3RyaW5ncywKICBkZWVwRXF1YWxPYmplY3RzOiAoKSA9PiBkZWVwRXF1YWxPYmplY3RzLAogIGZvbGREZWM6ICgpID0+IGZvbGREZWMsCiAgcGFyc2U6ICgpID0+IHBhcnNlMywKICBwYXJzZUJhc2U2NDogKCkgPT4gcGFyc2VCYXNlNjQsCiAgcGFyc2VKc29uTDogKCkgPT4gcGFyc2VKc29uTCwKICBzdGFibGVPbmVXYXlTdHJpbmdpZnk6ICgpID0+IHN0YWJsZU9uZVdheVN0cmluZ2lmeSwKICBzdHJpbmdpZnk6ICgpID0+IHN0cmluZ2lmeTIsCiAgc3RyaW5naWZ5QmFzZTY0OiAoKSA9PiBzdHJpbmdpZnlCYXNlNjQsCiAgc3RyaW5naWZ5SnNvbkw6ICgpID0+IHN0cmluZ2lmeUpzb25MLAogIHN0cmluZ2lmeVByZXR0eTogKCkgPT4gc3RyaW5naWZ5UHJldHR5Cn0pOwp2YXIgcGFyc2UzLCBwYXJzZUpzb25MLCBzdHJpbmdpZnlKc29uTCwgc3RhYmxlT25lV2F5U3RyaW5naWZ5LCBzdHJpbmdpZnkyLCBzdHJpbmdpZnlQcmV0dHksIHN0cmluZ2lmeUJhc2U2NCwgcGFyc2VCYXNlNjQsIFNtYXJ0anNvbiwgZm9sZERlYywgZGVlcEVxdWFsT2JqZWN0cywgZGVlcEVxdWFsSnNvbkxTdHJpbmdzOwp2YXIgaW5pdF9kaXN0X3RzMTQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGpzb25ANi4wLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0anNvbi9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfc21hcnRqc29uX3BsdWdpbnMoKTsKICAgIGluaXRfYnVmZmVyaGFuZGxpbmcoKTsKICAgIHBhcnNlMyA9IHBhcnNlMjsKICAgIHBhcnNlSnNvbkwgPSAoanNvbmxEYXRhKSA9PiB7CiAgICAgIGNvbnN0IGxpbmVzID0ganNvbmxEYXRhLnNwbGl0KCJcbiIpOwogICAgICBjb25zdCBwYXJzZWREYXRhID0gbGluZXMucmVkdWNlKChhY2MsIGxpbmUpID0+IHsKICAgICAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7CiAgICAgICAgaWYgKHRyaW1tZWQubGVuZ3RoID4gMCkgewogICAgICAgICAgYWNjLnB1c2gocGFyc2UzKHRyaW1tZWQpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFjYzsKICAgICAgfSwgW10pOwogICAgICByZXR1cm4gcGFyc2VkRGF0YTsKICAgIH07CiAgICBzdHJpbmdpZnlKc29uTCA9IChpdGVtcykgPT4gewogICAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtKSA9PiBzdHJpbmdpZnkyKGl0ZW0pKS5qb2luKCJcbiIpOwogICAgfTsKICAgIHN0YWJsZU9uZVdheVN0cmluZ2lmeSA9IChvYmpBcmcsIHNpbXBsZU9yZGVyQXJyYXksIG9wdGlvbnNBcmcgPSB7fSkgPT4gewogICAgICBjb25zdCB2aXNpdGVkID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCk7CiAgICAgIGNvbnN0IHNhbml0aXplMiA9ICh2YWwpID0+IHsKICAgICAgICBpZiAodmFsID09PSBudWxsIHx8IHR5cGVvZiB2YWwgIT09ICJvYmplY3QiKSB7CiAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgIH0KICAgICAgICBjb25zdCByZXBsYWNlZCA9IHJlcGxhY2VyKCIiLCB2YWwpOwogICAgICAgIGlmIChyZXBsYWNlZCAmJiByZXBsYWNlZC50eXBlID09PSAiRW5jb2RlZEJ1ZmZlciIgJiYgdHlwZW9mIHJlcGxhY2VkLmRhdGEgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICByZXR1cm4gcmVwbGFjZWQ7CiAgICAgICAgfQogICAgICAgIGlmICh2aXNpdGVkLmhhcyh2YWwpKSB7CiAgICAgICAgICByZXR1cm4gIl9fY3ljbGVfXyI7CiAgICAgICAgfQogICAgICAgIHZpc2l0ZWQuYWRkKHZhbCk7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgewogICAgICAgICAgcmV0dXJuIHZhbC5tYXAoKGl0ZW0pID0+IHNhbml0aXplMihpdGVtKSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG91dCA9IHt9OwogICAgICAgIGZvciAoY29uc3Qga2V5MiBvZiBPYmplY3Qua2V5cyh2YWwpKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBvdXRba2V5Ml0gPSBzYW5pdGl6ZTIodmFsW2tleTJdKTsKICAgICAgICAgIH0gY2F0Y2ggKGUxMSkgewogICAgICAgICAgICBvdXRba2V5Ml0gPSAiX191bnNlcmlhbGl6YWJsZV9fIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dDsKICAgICAgfTsKICAgICAgY29uc3Qgb2JqID0gc2FuaXRpemUyKG9iakFyZyk7CiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7CiAgICAgICAgLi4ub3B0aW9uc0FyZywKICAgICAgICBjeWNsZXM6IHRydWUKICAgICAgfTsKICAgICAgaWYgKHNpbXBsZU9yZGVyQXJyYXkgJiYgIW9wdGlvbnMuY21wKSB7CiAgICAgICAgY29uc3Qgb3JkZXIyID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgICBzaW1wbGVPcmRlckFycmF5LmZvckVhY2goKGtleTIsIGlkeCkgPT4gb3JkZXIyLnNldChrZXkyLCBpZHgpKTsKICAgICAgICBvcHRpb25zLmNtcCA9IChhNSwgYjYpID0+IHsKICAgICAgICAgIGNvbnN0IGFJZHggPSBvcmRlcjIuaGFzKGE1LmtleSkgPyBvcmRlcjIuZ2V0KGE1LmtleSkgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICAgICAgICBjb25zdCBiSWR4ID0gb3JkZXIyLmhhcyhiNi5rZXkpID8gb3JkZXIyLmdldChiNi5rZXkpIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgICAgICAgaWYgKGFJZHggIT09IGJJZHgpCiAgICAgICAgICAgIHJldHVybiBhSWR4IC0gYklkeDsKICAgICAgICAgIHJldHVybiBhNS5rZXkgPCBiNi5rZXkgPyAtMSA6IGE1LmtleSA+IGI2LmtleSA/IDEgOiAwOwogICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIHN0YWJsZUpzb24ob2JqLCBvcHRpb25zKTsKICAgIH07CiAgICBzdHJpbmdpZnkyID0gKG9iakFyZywgc2ltcGxlT3JkZXJBcnJheSwgb3B0aW9uc0FyZyA9IHt9KSA9PiB7CiAgICAgIGNvbnN0IGJ1ZmZlcmVkSnNvbiA9IHN0cmluZ2lmeShvYmpBcmcpOwogICAgICBvYmpBcmcgPSBKU09OLnBhcnNlKGJ1ZmZlcmVkSnNvbik7CiAgICAgIGxldCBvcHRpb25zID0geyAuLi5vcHRpb25zQXJnIH07CiAgICAgIGlmIChzaW1wbGVPcmRlckFycmF5ICYmICFvcHRpb25zLmNtcCkgewogICAgICAgIGNvbnN0IG9yZGVyMiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgICAgc2ltcGxlT3JkZXJBcnJheS5mb3JFYWNoKChrZXkyLCBpZHgpID0+IG9yZGVyMi5zZXQoa2V5MiwgaWR4KSk7CiAgICAgICAgb3B0aW9ucy5jbXAgPSAoYTUsIGI2KSA9PiB7CiAgICAgICAgICBjb25zdCBhSWR4ID0gb3JkZXIyLmhhcyhhNS5rZXkpID8gb3JkZXIyLmdldChhNS5rZXkpIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgICAgICAgY29uc3QgYklkeCA9IG9yZGVyMi5oYXMoYjYua2V5KSA/IG9yZGVyMi5nZXQoYjYua2V5KSA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgICAgIGlmIChhSWR4ICE9PSBiSWR4KQogICAgICAgICAgICByZXR1cm4gYUlkeCAtIGJJZHg7CiAgICAgICAgICByZXR1cm4gYTUua2V5IDwgYjYua2V5ID8gLTEgOiBhNS5rZXkgPiBiNi5rZXkgPyAxIDogMDsKICAgICAgICB9OwogICAgICB9CiAgICAgIGxldCByZXR1cm5Kc29uID0gc3RhYmxlSnNvbihvYmpBcmcsIG9wdGlvbnMpOwogICAgICByZXR1cm4gcmV0dXJuSnNvbjsKICAgIH07CiAgICBzdHJpbmdpZnlQcmV0dHkgPSAob2JqZWN0QXJnKSA9PiB7CiAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5MihvYmplY3RBcmcpOwogICAgICBjb25zdCBvYmplY3QgPSBKU09OLnBhcnNlKHN0cmluZ2lmaWVkKTsKICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iamVjdCwgbnVsbCwgMik7CiAgICB9OwogICAgc3RyaW5naWZ5QmFzZTY0ID0gKC4uLmFyZ3MpID0+IHsKICAgICAgY29uc3Qgc3RyaW5naWZpZWRSZXN1bHQgPSBzdHJpbmdpZnkyKC4uLmFyZ3MpOwogICAgICByZXR1cm4gZGlzdF90c19leHBvcnRzMTMuYmFzZTY0LmVuY29kZVVyaShzdHJpbmdpZmllZFJlc3VsdCk7CiAgICB9OwogICAgcGFyc2VCYXNlNjQgPSAoYmFzZTY0SnNvblN0cmluZ0FyZykgPT4gewogICAgICBjb25zdCBiYXNlNjQyID0gZGlzdF90c19leHBvcnRzMTMuYmFzZTY0OwogICAgICBjb25zdCBkZWNvZGVGbiA9IGJhc2U2NDIuZGVjb2RlVXJpIHx8IGJhc2U2NDIuZGVjb2RlOwogICAgICBjb25zdCBzaW1wbGVTdHJpbmdpZmllZCA9IGRlY29kZUZuKGJhc2U2NEpzb25TdHJpbmdBcmcpOwogICAgICByZXR1cm4gcGFyc2UzKHNpbXBsZVN0cmluZ2lmaWVkKTsKICAgIH07CiAgICBTbWFydGpzb24gPSBjbGFzcyBfU21hcnRqc29uIHsKICAgICAgLyoqCiAgICAgICAqIGVuZm9sZHMgZGF0YSBmcm9tIGFuIG9iamVjdAogICAgICAgKi8KICAgICAgc3RhdGljIGVuZm9sZEZyb21PYmplY3Qob2JqZWN0QXJnKSB7CiAgICAgICAgY29uc3QgbmV3SW5zdGFuY2UgPSBuZXcgdGhpcygpOwogICAgICAgIGNvbnN0IHNhdmVhYmxlcyA9IG5ld0luc3RhbmNlLnNhdmVhYmxlUHJvcGVydGllcyB8fCBbXTsKICAgICAgICBmb3IgKGNvbnN0IGtleU5hbWUgaW4gb2JqZWN0QXJnKSB7CiAgICAgICAgICBpZiAoc2F2ZWFibGVzLmluZGV4T2Yoa2V5TmFtZSkgIT09IC0xKSB7CiAgICAgICAgICAgIG5ld0luc3RhbmNlW2tleU5hbWVdID0gb2JqZWN0QXJnW2tleU5hbWVdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2U7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGVuZm9sZCBmcm9tIGpzb24KICAgICAgICovCiAgICAgIHN0YXRpYyBlbmZvbGRGcm9tSnNvbihqc29uQXJnKSB7CiAgICAgICAgY29uc3Qgb2JqZWN0RnJvbUpzb24gPSBwYXJzZTMoanNvbkFyZyk7CiAgICAgICAgcmV0dXJuIHRoaXMuZW5mb2xkRnJvbU9iamVjdChvYmplY3RGcm9tSnNvbik7CiAgICAgIH0KICAgICAgLy8gPT09PT09PT0KICAgICAgLy8gSU5TVEFOQ0UKICAgICAgLy8gPT09PT09PT0KICAgICAgc2F2ZWFibGVQcm9wZXJ0aWVzOwogICAgICAvKioKICAgICAgICogZm9sZHMgYSBjbGFzcyBpbnRvIGFuIG9iamVjdAogICAgICAgKi8KICAgICAgZm9sZFRvT2JqZWN0KCkgewogICAgICAgIGNvbnN0IHRyYWNrU2V0ID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgICAgICB0cmFja1NldC5hZGQodGhpcyk7CiAgICAgICAgcmV0dXJuIHRoaXMuZm9sZFRvT2JqZWN0SW50ZXJuYWwodHJhY2tTZXQpOwogICAgICB9CiAgICAgIGZvbGRUb09iamVjdEludGVybmFsKHRyYWNrU2V0KSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307CiAgICAgICAgY29uc3QgZm9sZFZhbHVlID0gKHZhbCkgPT4gewogICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIF9TbWFydGpzb24pIHsKICAgICAgICAgICAgaWYgKHRyYWNrU2V0Lmhhcyh2YWwpKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJjeWNsZSBkZXRlY3RlZCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyYWNrU2V0LmFkZCh2YWwpOwogICAgICAgICAgICByZXR1cm4gdmFsLmZvbGRUb09iamVjdEludGVybmFsKHRyYWNrU2V0KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAoKGl0ZW0pID0+IGZvbGRWYWx1ZShpdGVtKSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gaW1wb3J0X2xvZGFzaC5kZWZhdWx0KHZhbCk7CiAgICAgICAgfTsKICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuc2F2ZWFibGVQcm9wZXJ0aWVzIHx8IFtdOwogICAgICAgIGZvciAoY29uc3Qga2V5TmFtZSBvZiBwcm9wcykgewogICAgICAgICAgY29uc3QgdmFsdWUyID0gdGhpc1trZXlOYW1lXTsKICAgICAgICAgIHJlc3VsdFtrZXlOYW1lXSA9IGZvbGRWYWx1ZSh2YWx1ZTIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBmb2xkcyBhIGNsYXNzIGludG8gYW4gb2JqZWN0CiAgICAgICAqLwogICAgICBmb2xkVG9Kc29uKCkgewogICAgICAgIGNvbnN0IGZvbGRlZE9iamVjdCA9IHRoaXMuZm9sZFRvT2JqZWN0KCk7CiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeTIoZm9sZGVkT2JqZWN0KTsKICAgICAgfQogICAgfTsKICAgIGZvbGREZWMgPSAoKSA9PiB7CiAgICAgIHJldHVybiAoX3ZhbHVlLCBjb250ZXh0MikgPT4gewogICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IFN0cmluZyhjb250ZXh0Mi5uYW1lKTsKICAgICAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplcihmdW5jdGlvbigpIHsKICAgICAgICAgIGlmICghdGhpcy5zYXZlYWJsZVByb3BlcnRpZXMpIHsKICAgICAgICAgICAgdGhpcy5zYXZlYWJsZVByb3BlcnRpZXMgPSBbXTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5zYXZlYWJsZVByb3BlcnRpZXMuaW5jbHVkZXMocHJvcGVydHlOYW1lKSkgewogICAgICAgICAgICB0aGlzLnNhdmVhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5TmFtZSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH07CiAgICB9OwogICAgZGVlcEVxdWFsT2JqZWN0cyA9IChvYmplY3QxLCBvYmplY3QyKSA9PiB7CiAgICAgIGNvbnN0IG9iamVjdDFTdHJpbmcgPSBzdHJpbmdpZnkyKG9iamVjdDEpOwogICAgICBjb25zdCBvYmplY3QyU3RyaW5nID0gc3RyaW5naWZ5MihvYmplY3QyKTsKICAgICAgcmV0dXJuIG9iamVjdDFTdHJpbmcgPT09IG9iamVjdDJTdHJpbmc7CiAgICB9OwogICAgZGVlcEVxdWFsSnNvbkxTdHJpbmdzID0gKGpzb25MU3RyaW5nMSwganNvbkxTdHJpbmcyKSA9PiB7CiAgICAgIGNvbnN0IGZpcnN0QXJyYXkgPSBwYXJzZUpzb25MKGpzb25MU3RyaW5nMSk7CiAgICAgIGNvbnN0IHNlY29uZEFycmF5ID0gcGFyc2VKc29uTChqc29uTFN0cmluZzIpOwogICAgICByZXR1cm4gZGVlcEVxdWFsT2JqZWN0cyhmaXJzdEFycmF5LCBzZWNvbmRBcnJheSk7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRlbnZANS4wLjEzL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGVudi9kaXN0X3RzL3NtYXJ0ZW52LnBsdWdpbnMuanMKdmFyIGluaXRfc21hcnRlbnZfcGx1Z2luczIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGVudkA1LjAuMTMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0ZW52L2Rpc3RfdHMvc21hcnRlbnYucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0ZW52QDUuMC4xMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRlbnYvZGlzdF90cy9pbnRlcmZhY2VzL2luZGV4LmpzCnZhciBpbml0X2ludGVyZmFjZXMyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRlbnZANS4wLjEzL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGVudi9kaXN0X3RzL2ludGVyZmFjZXMvaW5kZXguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRlbnZANS4wLjEzL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGVudi9kaXN0X3RzL3NtYXJ0ZW52LmNsYXNzZXMuc21hcnRlbnYuanMKdmFyIFNtYXJ0ZW52MjsKdmFyIGluaXRfc21hcnRlbnZfY2xhc3Nlc19zbWFydGVudjIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGVudkA1LjAuMTMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0ZW52L2Rpc3RfdHMvc21hcnRlbnYuY2xhc3Nlcy5zbWFydGVudi5qcyIoKSB7CiAgICBpbml0X3NtYXJ0ZW52X3BsdWdpbnMyKCk7CiAgICBpbml0X2ludGVyZmFjZXMyKCk7CiAgICBTbWFydGVudjIgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMubG9hZGVkU2NyaXB0cyA9IFtdOwogICAgICB9CiAgICAgIGFzeW5jIGdldEVudkF3YXJlTW9kdWxlKG9wdGlvbnNBcmcpIHsKICAgICAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgICAgIGNvbnN0IG1vZHVsZVJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0U2FmZU5vZGVNb2R1bGUob3B0aW9uc0FyZy5ub2RlTW9kdWxlTmFtZSk7CiAgICAgICAgICByZXR1cm4gbW9kdWxlUmVzdWx0OwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0Jyb3dzZXIpIHsKICAgICAgICAgIGNvbnN0IG1vZHVsZVJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0U2FmZVdlYk1vZHVsZShvcHRpb25zQXJnLndlYlVybEFyZywgb3B0aW9uc0FyZy5nZXRGdW5jdGlvbik7CiAgICAgICAgICByZXR1cm4gbW9kdWxlUmVzdWx0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCJwbGF0Zm9ybSBmb3IgbG9hZGluZyBub3Qgc3VwcG9ydGVkIGJ5IHNtYXJ0ZW52Iik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIGdldFNhZmVOb2RlTW9kdWxlKG1vZHVsZU5hbWVBcmcsIHJ1bkFmdGVyRnVuYykgewogICAgICAgIGlmICghdGhpcy5pc05vZGUpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFlvdSB0cmllZCB0byBsb2FkIGEgbm9kZSBtb2R1bGUgaW4gYSB3cm9uZyBjb250ZXh0OiAke21vZHVsZU5hbWVBcmd9LiBUaGlzIGRvZXMgbm90IHRocm93LmApOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGF3YWl0IG5ldyBGdW5jdGlvbihgcmV0dXJuIGltcG9ydCgnJHttb2R1bGVOYW1lQXJnfScpYCkoKTsKICAgICAgICBpZiAocnVuQWZ0ZXJGdW5jKSB7CiAgICAgICAgICBhd2FpdCBydW5BZnRlckZ1bmMocmV0dXJuVmFsdWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CiAgICAgIH0KICAgICAgYXN5bmMgZ2V0U2FmZVdlYk1vZHVsZSh1cmxBcmcsIGdldEZ1bmN0aW9uQXJnKSB7CiAgICAgICAgaWYgKCF0aGlzLmlzQnJvd3NlcikgewogICAgICAgICAgY29uc29sZS5lcnJvcigiWW91IHRyaWVkIHRvIGxvYWQgYSB3ZWIgbW9kdWxlIGluIGEgd3JvbmcgY29udGV4dCIpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5sb2FkZWRTY3JpcHRzLmluY2x1ZGVzKHVybEFyZykpIHsKICAgICAgICAgIHJldHVybiBnZXRGdW5jdGlvbkFyZygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmxvYWRlZFNjcmlwdHMucHVzaCh1cmxBcmcpOwogICAgICAgIH0KICAgICAgICBjb25zdCBkb25lID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICAgICAgaWYgKGdsb2JhbFRoaXMuaW1wb3J0U2NyaXB0cykgewogICAgICAgICAgZ2xvYmFsVGhpcy5pbXBvcnRTY3JpcHRzKHVybEFyZyk7CiAgICAgICAgICBkb25lLnJlc29sdmUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4gewogICAgICAgICAgICBkb25lLnJlc29sdmUoKTsKICAgICAgICAgIH07CiAgICAgICAgICBzY3JpcHQuc3JjID0gdXJsQXJnOwogICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgICAgIH0KICAgICAgICBhd2FpdCBkb25lLnByb21pc2U7CiAgICAgICAgcmV0dXJuIGdldEZ1bmN0aW9uQXJnKCk7CiAgICAgIH0KICAgICAgZ2V0IHJ1bnRpbWVFbnYoKSB7CiAgICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgcmV0dXJuICJub2RlIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuICJicm93c2VyIjsKICAgICAgICB9CiAgICAgIH0KICAgICAgZ2V0IGlzQnJvd3NlcigpIHsKICAgICAgICByZXR1cm4gIXRoaXMuaXNOb2RlOwogICAgICB9CiAgICAgIGdldCB1c2VyQWdlbnQoKSB7CiAgICAgICAgaWYgKHRoaXMuaXNCcm93c2VyKSB7CiAgICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuICJ1bmRlZmluZWQiOwogICAgICAgIH0KICAgICAgfQogICAgICBnZXQgaXNOb2RlKCkgewogICAgICAgIHJldHVybiB0aGlzLnJ1bnRpbWVFbnYgPT09ICJub2RlIjsKICAgICAgfQogICAgICBnZXQgbm9kZVZlcnNpb24oKSB7CiAgICAgICAgcmV0dXJuIHByb2Nlc3MudmVyc2lvbjsKICAgICAgfQogICAgICBnZXQgaXNDSSgpIHsKICAgICAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5DSSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICBhc3luYyBpc01hY0FzeW5jKCkgewogICAgICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICAgICAgY29uc3Qgb3MgPSBhd2FpdCB0aGlzLmdldFNhZmVOb2RlTW9kdWxlKCJvcyIpOwogICAgICAgICAgcmV0dXJuIG9zLnBsYXRmb3JtKCkgPT09ICJkYXJ3aW4iOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIGlzV2luZG93c0FzeW5jKCkgewogICAgICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICAgICAgY29uc3Qgb3MgPSBhd2FpdCB0aGlzLmdldFNhZmVOb2RlTW9kdWxlKCJvcyIpOwogICAgICAgICAgcmV0dXJuIG9zLnBsYXRmb3JtKCkgPT09ICJ3aW4zMiI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYXN5bmMgaXNMaW51eEFzeW5jKCkgewogICAgICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICAgICAgY29uc3Qgb3MgPSBhd2FpdCB0aGlzLmdldFNhZmVOb2RlTW9kdWxlKCJvcyIpOwogICAgICAgICAgcmV0dXJuIG9zLnBsYXRmb3JtKCkgPT09ICJsaW51eCI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHByaW50cyB0aGUgZW52aXJvbm1lbnQgdG8gY29uc29sZQogICAgICAgKi8KICAgICAgYXN5bmMgcHJpbnRFbnYoKSB7CiAgICAgICAgaWYgKHRoaXMuaXNOb2RlKSB7CiAgICAgICAgICBjb25zb2xlLmxvZygicnVubmluZyBvbiBOT0RFIik7CiAgICAgICAgICBjb25zb2xlLmxvZygibm9kZSB2ZXJzaW9uIGlzICIgKyB0aGlzLm5vZGVWZXJzaW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc29sZS5sb2coInJ1bm5pbmcgb24gQlJPV1NFUiIpOwogICAgICAgICAgY29uc29sZS5sb2coImJyb3dzZXIgaXMgIiArIHRoaXMudXNlckFnZW50KTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGVudkA1LjAuMTMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0ZW52L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czE1ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czE1LCB7CiAgU21hcnRlbnY6ICgpID0+IFNtYXJ0ZW52Mgp9KTsKdmFyIGluaXRfZGlzdF90czE1ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRlbnZANS4wLjEzL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGVudi9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfc21hcnRlbnZfY2xhc3Nlc19zbWFydGVudjIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA1LjIuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvc21hcnRqc29uLnBsdWdpbnMuanMKdmFyIGltcG9ydF9sb2Rhc2gyLCBpbXBvcnRfZmFzdF9qc29uX3N0YWJsZV9zdHJpbmdpZnkyLCBzdGFibGVKc29uMzsKdmFyIGluaXRfc21hcnRqc29uX3BsdWdpbnMyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRqc29uQDUuMi4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGpzb24vZGlzdF90cy9zbWFydGpzb24ucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMxNSgpOwogICAgaW5pdF9kaXN0X3RzMTMoKTsKICAgIGltcG9ydF9sb2Rhc2gyID0gX190b0VTTShyZXF1aXJlX2xvZGFzaCgpLCAxKTsKICAgIGltcG9ydF9mYXN0X2pzb25fc3RhYmxlX3N0cmluZ2lmeTIgPSBfX3RvRVNNKHJlcXVpcmVfZmFzdF9qc29uX3N0YWJsZV9zdHJpbmdpZnkoKSwgMSk7CiAgICBzdGFibGVKc29uMyA9IGltcG9ydF9mYXN0X2pzb25fc3RhYmxlX3N0cmluZ2lmeTIuZGVmYXVsdDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA1LjIuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvYnVmZmVyaGFuZGxpbmcuanMKZnVuY3Rpb24gYmFzZTY0RW5jb2RlMihkYXRhKSB7CiAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICJ1bmRlZmluZWQiKSB7CiAgICByZXR1cm4gQnVmZmVyLmZyb20oZGF0YSkudG9TdHJpbmcoImJhc2U2NCIpOwogIH0KICByZXR1cm4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmRhdGEpKTsKfQpmdW5jdGlvbiBiYXNlNjREZWNvZGUyKHN0cikgewogIGlmICh0eXBlb2YgQnVmZmVyICE9PSAidW5kZWZpbmVkIikgewogICAgY29uc3QgYnVmID0gQnVmZmVyLmZyb20oc3RyLCAiYmFzZTY0Iik7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ1ZmZlciwgYnVmLmJ5dGVPZmZzZXQsIGJ1Zi5ieXRlTGVuZ3RoKTsKICB9CiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEFycmF5LmZyb20oYXRvYihzdHIpKS5tYXAoKGNoYXIpID0+IGNoYXIuY2hhckNvZGVBdCgwKSkpOwp9CmZ1bmN0aW9uIHN0cmluZ2lmeTModmFsdWUyLCBzcGFjZTIpIHsKICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUyLCByZXBsYWNlcjIsIHNwYWNlMik7Cn0KZnVuY3Rpb24gcGFyc2U0KHRleHQ5KSB7CiAgcmV0dXJuIEpTT04ucGFyc2UodGV4dDksIHJldml2ZXIyKTsKfQpmdW5jdGlvbiBpc0VuY29kZWRCdWZmZXIyKHg0KSB7CiAgcmV0dXJuIGlzT2JqZWN0Mih4NCkgJiYgeDQudHlwZSA9PT0gIkVuY29kZWRCdWZmZXIiICYmIGlzU3RyaW5nMih4NC5kYXRhKTsKfQpmdW5jdGlvbiBpc0J1ZmZlckxpa2UzKHg0KSB7CiAgcmV0dXJuIGlzT2JqZWN0Mih4NCkgJiYgKHg0LnR5cGUgPT09ICJCdWZmZXIiICYmIChpc0FycmF5NCh4NC5kYXRhKSB8fCBpc1N0cmluZzIoeDQuZGF0YSkpKSB8fCB4NCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk7Cn0KZnVuY3Rpb24gaXNBcnJheTQoeDQpIHsKICByZXR1cm4gQXJyYXkuaXNBcnJheSh4NCk7Cn0KZnVuY3Rpb24gaXNTdHJpbmcyKHg0KSB7CiAgcmV0dXJuIHR5cGVvZiB4NCA9PT0gInN0cmluZyI7Cn0KZnVuY3Rpb24gaXNPYmplY3QyKHg0KSB7CiAgcmV0dXJuIHR5cGVvZiB4NCA9PT0gIm9iamVjdCIgJiYgeDQgIT09IG51bGw7Cn0KdmFyIHJlcGxhY2VyMiwgcmV2aXZlcjI7CnZhciBpbml0X2J1ZmZlcmhhbmRsaW5nMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA1LjIuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvYnVmZmVyaGFuZGxpbmcuanMiKCkgewogICAgaW5pdF9zbWFydGpzb25fcGx1Z2luczIoKTsKICAgIHJlcGxhY2VyMiA9IChrZXkyLCB2YWx1ZTIpID0+IHsKICAgICAgaWYgKGlzQnVmZmVyTGlrZTModmFsdWUyKSkgewogICAgICAgIGxldCBidWZmZXJEYXRhOwogICAgICAgIGlmICgiZGF0YSIgaW4gdmFsdWUyICYmIGlzQXJyYXk0KHZhbHVlMi5kYXRhKSkgewogICAgICAgICAgYnVmZmVyRGF0YSA9IG5ldyBVaW50OEFycmF5KHZhbHVlMi5kYXRhKTsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlMiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKICAgICAgICAgIGJ1ZmZlckRhdGEgPSB2YWx1ZTI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGJhc2U2NERhdGEgPSAiYmFzZTY0OiIgKyBiYXNlNjRFbmNvZGUyKGJ1ZmZlckRhdGEpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAiRW5jb2RlZEJ1ZmZlciIsCiAgICAgICAgICBkYXRhOiBiYXNlNjREYXRhCiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gdmFsdWUyOwogICAgfTsKICAgIHJldml2ZXIyID0gKGtleTIsIHZhbHVlMikgPT4gewogICAgICBpZiAoaXNFbmNvZGVkQnVmZmVyMih2YWx1ZTIpKSB7CiAgICAgICAgaWYgKGlzU3RyaW5nMih2YWx1ZTIuZGF0YSkgJiYgdmFsdWUyLmRhdGEuc3RhcnRzV2l0aCgiYmFzZTY0OiIpKSB7CiAgICAgICAgICBjb25zdCBiYXNlNjREYXRhID0gdmFsdWUyLmRhdGEuc2xpY2UoNyk7CiAgICAgICAgICBjb25zdCBidWZmZXIyID0gYmFzZTY0RGVjb2RlMihiYXNlNjREYXRhKTsKICAgICAgICAgIHJldHVybiBidWZmZXIyOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdmFsdWUyOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0anNvbkA1LjIuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRqc29uL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czE2ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czE2LCB7CiAgU21hcnRqc29uOiAoKSA9PiBTbWFydGpzb24yLAogIGRlZXBFcXVhbEpzb25MU3RyaW5nczogKCkgPT4gZGVlcEVxdWFsSnNvbkxTdHJpbmdzMiwKICBkZWVwRXF1YWxPYmplY3RzOiAoKSA9PiBkZWVwRXF1YWxPYmplY3RzMiwKICBmb2xkRGVjOiAoKSA9PiBmb2xkRGVjMiwKICBwYXJzZTogKCkgPT4gcGFyc2U1LAogIHBhcnNlQmFzZTY0OiAoKSA9PiBwYXJzZUJhc2U2NDIsCiAgcGFyc2VKc29uTDogKCkgPT4gcGFyc2VKc29uTDIsCiAgc3RhYmxlT25lV2F5U3RyaW5naWZ5OiAoKSA9PiBzdGFibGVPbmVXYXlTdHJpbmdpZnkyLAogIHN0cmluZ2lmeTogKCkgPT4gc3RyaW5naWZ5NCwKICBzdHJpbmdpZnlCYXNlNjQ6ICgpID0+IHN0cmluZ2lmeUJhc2U2NDIsCiAgc3RyaW5naWZ5SnNvbkw6ICgpID0+IHN0cmluZ2lmeUpzb25MMiwKICBzdHJpbmdpZnlQcmV0dHk6ICgpID0+IHN0cmluZ2lmeVByZXR0eTIKfSk7CnZhciBwYXJzZTUsIHBhcnNlSnNvbkwyLCBzdHJpbmdpZnlKc29uTDIsIHN0YWJsZU9uZVdheVN0cmluZ2lmeTIsIHN0cmluZ2lmeTQsIHN0cmluZ2lmeVByZXR0eTIsIHN0cmluZ2lmeUJhc2U2NDIsIHBhcnNlQmFzZTY0MiwgU21hcnRqc29uMiwgZm9sZERlYzIsIGRlZXBFcXVhbE9iamVjdHMyLCBkZWVwRXF1YWxKc29uTFN0cmluZ3MyOwp2YXIgaW5pdF9kaXN0X3RzMTYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGpzb25ANS4yLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0anNvbi9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfc21hcnRqc29uX3BsdWdpbnMyKCk7CiAgICBpbml0X2J1ZmZlcmhhbmRsaW5nMigpOwogICAgcGFyc2U1ID0gcGFyc2U0OwogICAgcGFyc2VKc29uTDIgPSAoanNvbmxEYXRhKSA9PiB7CiAgICAgIGNvbnN0IGxpbmVzID0ganNvbmxEYXRhLnNwbGl0KCJcbiIpOwogICAgICBjb25zdCBwYXJzZWREYXRhID0gbGluZXMucmVkdWNlKChhY2MsIGxpbmUpID0+IHsKICAgICAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7CiAgICAgICAgaWYgKHRyaW1tZWQubGVuZ3RoID4gMCkgewogICAgICAgICAgYWNjLnB1c2gocGFyc2U1KHRyaW1tZWQpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFjYzsKICAgICAgfSwgW10pOwogICAgICByZXR1cm4gcGFyc2VkRGF0YTsKICAgIH07CiAgICBzdHJpbmdpZnlKc29uTDIgPSAoaXRlbXMpID0+IHsKICAgICAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbSkgPT4gc3RyaW5naWZ5NChpdGVtKSkuam9pbigiXG4iKTsKICAgIH07CiAgICBzdGFibGVPbmVXYXlTdHJpbmdpZnkyID0gKG9iakFyZywgc2ltcGxlT3JkZXJBcnJheSwgb3B0aW9uc0FyZyA9IHt9KSA9PiB7CiAgICAgIGNvbnN0IHZpc2l0ZWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtTZXQoKTsKICAgICAgY29uc3Qgc2FuaXRpemUyID0gKHZhbCkgPT4gewogICAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdHlwZW9mIHZhbCAhPT0gIm9iamVjdCIpIHsKICAgICAgICAgIHJldHVybiB2YWw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlcGxhY2VkID0gcmVwbGFjZXIyKCIiLCB2YWwpOwogICAgICAgIGlmIChyZXBsYWNlZCAmJiByZXBsYWNlZC50eXBlID09PSAiRW5jb2RlZEJ1ZmZlciIgJiYgdHlwZW9mIHJlcGxhY2VkLmRhdGEgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICByZXR1cm4gcmVwbGFjZWQ7CiAgICAgICAgfQogICAgICAgIGlmICh2aXNpdGVkLmhhcyh2YWwpKSB7CiAgICAgICAgICByZXR1cm4gIl9fY3ljbGVfXyI7CiAgICAgICAgfQogICAgICAgIHZpc2l0ZWQuYWRkKHZhbCk7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgewogICAgICAgICAgcmV0dXJuIHZhbC5tYXAoKGl0ZW0pID0+IHNhbml0aXplMihpdGVtKSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG91dCA9IHt9OwogICAgICAgIGZvciAoY29uc3Qga2V5MiBvZiBPYmplY3Qua2V5cyh2YWwpKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBvdXRba2V5Ml0gPSBzYW5pdGl6ZTIodmFsW2tleTJdKTsKICAgICAgICAgIH0gY2F0Y2ggKGUxMSkgewogICAgICAgICAgICBvdXRba2V5Ml0gPSAiX191bnNlcmlhbGl6YWJsZV9fIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dDsKICAgICAgfTsKICAgICAgY29uc3Qgb2JqID0gc2FuaXRpemUyKG9iakFyZyk7CiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7CiAgICAgICAgLi4ub3B0aW9uc0FyZywKICAgICAgICBjeWNsZXM6IHRydWUKICAgICAgfTsKICAgICAgaWYgKHNpbXBsZU9yZGVyQXJyYXkgJiYgIW9wdGlvbnMuY21wKSB7CiAgICAgICAgY29uc3Qgb3JkZXIyID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgICBzaW1wbGVPcmRlckFycmF5LmZvckVhY2goKGtleTIsIGlkeCkgPT4gb3JkZXIyLnNldChrZXkyLCBpZHgpKTsKICAgICAgICBvcHRpb25zLmNtcCA9IChhNSwgYjYpID0+IHsKICAgICAgICAgIGNvbnN0IGFJZHggPSBvcmRlcjIuaGFzKGE1LmtleSkgPyBvcmRlcjIuZ2V0KGE1LmtleSkgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICAgICAgICBjb25zdCBiSWR4ID0gb3JkZXIyLmhhcyhiNi5rZXkpID8gb3JkZXIyLmdldChiNi5rZXkpIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgICAgICAgaWYgKGFJZHggIT09IGJJZHgpCiAgICAgICAgICAgIHJldHVybiBhSWR4IC0gYklkeDsKICAgICAgICAgIHJldHVybiBhNS5rZXkgPCBiNi5rZXkgPyAtMSA6IGE1LmtleSA+IGI2LmtleSA/IDEgOiAwOwogICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIHN0YWJsZUpzb24zKG9iaiwgb3B0aW9ucyk7CiAgICB9OwogICAgc3RyaW5naWZ5NCA9IChvYmpBcmcsIHNpbXBsZU9yZGVyQXJyYXksIG9wdGlvbnNBcmcgPSB7fSkgPT4gewogICAgICBjb25zdCBidWZmZXJlZEpzb24gPSBzdHJpbmdpZnkzKG9iakFyZyk7CiAgICAgIG9iakFyZyA9IEpTT04ucGFyc2UoYnVmZmVyZWRKc29uKTsKICAgICAgbGV0IG9wdGlvbnMgPSB7IC4uLm9wdGlvbnNBcmcgfTsKICAgICAgaWYgKHNpbXBsZU9yZGVyQXJyYXkgJiYgIW9wdGlvbnMuY21wKSB7CiAgICAgICAgY29uc3Qgb3JkZXIyID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgICBzaW1wbGVPcmRlckFycmF5LmZvckVhY2goKGtleTIsIGlkeCkgPT4gb3JkZXIyLnNldChrZXkyLCBpZHgpKTsKICAgICAgICBvcHRpb25zLmNtcCA9IChhNSwgYjYpID0+IHsKICAgICAgICAgIGNvbnN0IGFJZHggPSBvcmRlcjIuaGFzKGE1LmtleSkgPyBvcmRlcjIuZ2V0KGE1LmtleSkgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICAgICAgICBjb25zdCBiSWR4ID0gb3JkZXIyLmhhcyhiNi5rZXkpID8gb3JkZXIyLmdldChiNi5rZXkpIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgICAgICAgaWYgKGFJZHggIT09IGJJZHgpCiAgICAgICAgICAgIHJldHVybiBhSWR4IC0gYklkeDsKICAgICAgICAgIHJldHVybiBhNS5rZXkgPCBiNi5rZXkgPyAtMSA6IGE1LmtleSA+IGI2LmtleSA/IDEgOiAwOwogICAgICAgIH07CiAgICAgIH0KICAgICAgbGV0IHJldHVybkpzb24gPSBzdGFibGVKc29uMyhvYmpBcmcsIG9wdGlvbnMpOwogICAgICByZXR1cm4gcmV0dXJuSnNvbjsKICAgIH07CiAgICBzdHJpbmdpZnlQcmV0dHkyID0gKG9iamVjdEFyZykgPT4gewogICAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeTQob2JqZWN0QXJnKTsKICAgICAgY29uc3Qgb2JqZWN0ID0gSlNPTi5wYXJzZShzdHJpbmdpZmllZCk7CiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmplY3QsIG51bGwsIDIpOwogICAgfTsKICAgIHN0cmluZ2lmeUJhc2U2NDIgPSAoLi4uYXJncykgPT4gewogICAgICBjb25zdCBzdHJpbmdpZmllZFJlc3VsdCA9IHN0cmluZ2lmeTQoLi4uYXJncyk7CiAgICAgIHJldHVybiBkaXN0X3RzX2V4cG9ydHMxMy5iYXNlNjQuZW5jb2RlVXJpKHN0cmluZ2lmaWVkUmVzdWx0KTsKICAgIH07CiAgICBwYXJzZUJhc2U2NDIgPSAoYmFzZTY0SnNvblN0cmluZ0FyZykgPT4gewogICAgICBjb25zdCBiYXNlNjQyID0gZGlzdF90c19leHBvcnRzMTMuYmFzZTY0OwogICAgICBjb25zdCBkZWNvZGVGbiA9IGJhc2U2NDIuZGVjb2RlVXJpIHx8IGJhc2U2NDIuZGVjb2RlOwogICAgICBjb25zdCBzaW1wbGVTdHJpbmdpZmllZCA9IGRlY29kZUZuKGJhc2U2NEpzb25TdHJpbmdBcmcpOwogICAgICByZXR1cm4gcGFyc2U1KHNpbXBsZVN0cmluZ2lmaWVkKTsKICAgIH07CiAgICBTbWFydGpzb24yID0gY2xhc3MgX1NtYXJ0anNvbiB7CiAgICAgIC8qKgogICAgICAgKiBlbmZvbGRzIGRhdGEgZnJvbSBhbiBvYmplY3QKICAgICAgICovCiAgICAgIHN0YXRpYyBlbmZvbGRGcm9tT2JqZWN0KG9iamVjdEFyZykgewogICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IHRoaXMoKTsKICAgICAgICBjb25zdCBzYXZlYWJsZXMgPSBuZXdJbnN0YW5jZS5zYXZlYWJsZVByb3BlcnRpZXMgfHwgW107CiAgICAgICAgZm9yIChjb25zdCBrZXlOYW1lIGluIG9iamVjdEFyZykgewogICAgICAgICAgaWYgKHNhdmVhYmxlcy5pbmRleE9mKGtleU5hbWUpICE9PSAtMSkgewogICAgICAgICAgICBuZXdJbnN0YW5jZVtrZXlOYW1lXSA9IG9iamVjdEFyZ1trZXlOYW1lXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBlbmZvbGQgZnJvbSBqc29uCiAgICAgICAqLwogICAgICBzdGF0aWMgZW5mb2xkRnJvbUpzb24oanNvbkFyZykgewogICAgICAgIGNvbnN0IG9iamVjdEZyb21Kc29uID0gcGFyc2U1KGpzb25BcmcpOwogICAgICAgIHJldHVybiB0aGlzLmVuZm9sZEZyb21PYmplY3Qob2JqZWN0RnJvbUpzb24pOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBmb2xkcyBhIGNsYXNzIGludG8gYW4gb2JqZWN0CiAgICAgICAqLwogICAgICBmb2xkVG9PYmplY3QoKSB7CiAgICAgICAgY29uc3QgdHJhY2tTZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgICAgIHRyYWNrU2V0LmFkZCh0aGlzKTsKICAgICAgICByZXR1cm4gdGhpcy5mb2xkVG9PYmplY3RJbnRlcm5hbCh0cmFja1NldCk7CiAgICAgIH0KICAgICAgZm9sZFRvT2JqZWN0SW50ZXJuYWwodHJhY2tTZXQpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSB7fTsKICAgICAgICBjb25zdCBmb2xkVmFsdWUgPSAodmFsKSA9PiB7CiAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgX1NtYXJ0anNvbikgewogICAgICAgICAgICBpZiAodHJhY2tTZXQuaGFzKHZhbCkpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIGRldGVjdGVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJhY2tTZXQuYWRkKHZhbCk7CiAgICAgICAgICAgIHJldHVybiB2YWwuZm9sZFRvT2JqZWN0SW50ZXJuYWwodHJhY2tTZXQpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgewogICAgICAgICAgICByZXR1cm4gdmFsLm1hcCgoaXRlbSkgPT4gZm9sZFZhbHVlKGl0ZW0pKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBpbXBvcnRfbG9kYXNoMi5kZWZhdWx0KHZhbCk7CiAgICAgICAgfTsKICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuc2F2ZWFibGVQcm9wZXJ0aWVzIHx8IFtdOwogICAgICAgIGZvciAoY29uc3Qga2V5TmFtZSBvZiBwcm9wcykgewogICAgICAgICAgY29uc3QgdmFsdWUyID0gdGhpc1trZXlOYW1lXTsKICAgICAgICAgIHJlc3VsdFtrZXlOYW1lXSA9IGZvbGRWYWx1ZSh2YWx1ZTIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBmb2xkcyBhIGNsYXNzIGludG8gYW4gb2JqZWN0CiAgICAgICAqLwogICAgICBmb2xkVG9Kc29uKCkgewogICAgICAgIGNvbnN0IGZvbGRlZE9iamVjdCA9IHRoaXMuZm9sZFRvT2JqZWN0KCk7CiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeTQoZm9sZGVkT2JqZWN0KTsKICAgICAgfQogICAgfTsKICAgIGZvbGREZWMyID0gKCkgPT4gewogICAgICByZXR1cm4gKHRhcmdldCwga2V5MikgPT4gewogICAgICAgIGlmICghdGFyZ2V0LnNhdmVhYmxlUHJvcGVydGllcykgewogICAgICAgICAgdGFyZ2V0LnNhdmVhYmxlUHJvcGVydGllcyA9IFtdOwogICAgICAgIH0KICAgICAgICB0YXJnZXQuc2F2ZWFibGVQcm9wZXJ0aWVzLnB1c2goa2V5Mik7CiAgICAgIH07CiAgICB9OwogICAgZGVlcEVxdWFsT2JqZWN0czIgPSAob2JqZWN0MSwgb2JqZWN0MikgPT4gewogICAgICBjb25zdCBvYmplY3QxU3RyaW5nID0gc3RyaW5naWZ5NChvYmplY3QxKTsKICAgICAgY29uc3Qgb2JqZWN0MlN0cmluZyA9IHN0cmluZ2lmeTQob2JqZWN0Mik7CiAgICAgIHJldHVybiBvYmplY3QxU3RyaW5nID09PSBvYmplY3QyU3RyaW5nOwogICAgfTsKICAgIGRlZXBFcXVhbEpzb25MU3RyaW5nczIgPSAoanNvbkxTdHJpbmcxLCBqc29uTFN0cmluZzIpID0+IHsKICAgICAgY29uc3QgZmlyc3RBcnJheSA9IHBhcnNlSnNvbkwyKGpzb25MU3RyaW5nMSk7CiAgICAgIGNvbnN0IHNlY29uZEFycmF5ID0gcGFyc2VKc29uTDIoanNvbkxTdHJpbmcyKTsKICAgICAgcmV0dXJuIGRlZXBFcXVhbE9iamVjdHMyKGZpcnN0QXJyYXksIHNlY29uZEFycmF5KTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCtpZGJAOC4wLjMvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L2lkYi9idWlsZC9pbmRleC5qcwp2YXIgYnVpbGRfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChidWlsZF9leHBvcnRzLCB7CiAgZGVsZXRlREI6ICgpID0+IGRlbGV0ZURCLAogIG9wZW5EQjogKCkgPT4gb3BlbkRCLAogIHVud3JhcDogKCkgPT4gdW53cmFwLAogIHdyYXA6ICgpID0+IHdyYXAKfSk7CmZ1bmN0aW9uIGdldElkYlByb3h5YWJsZVR5cGVzKCkgewogIHJldHVybiBpZGJQcm94eWFibGVUeXBlcyB8fCAoaWRiUHJveHlhYmxlVHlwZXMgPSBbCiAgICBJREJEYXRhYmFzZSwKICAgIElEQk9iamVjdFN0b3JlLAogICAgSURCSW5kZXgsCiAgICBJREJDdXJzb3IsCiAgICBJREJUcmFuc2FjdGlvbgogIF0pOwp9CmZ1bmN0aW9uIGdldEN1cnNvckFkdmFuY2VNZXRob2RzKCkgewogIHJldHVybiBjdXJzb3JBZHZhbmNlTWV0aG9kcyB8fCAoY3Vyc29yQWR2YW5jZU1ldGhvZHMgPSBbCiAgICBJREJDdXJzb3IucHJvdG90eXBlLmFkdmFuY2UsCiAgICBJREJDdXJzb3IucHJvdG90eXBlLmNvbnRpbnVlLAogICAgSURCQ3Vyc29yLnByb3RvdHlwZS5jb250aW51ZVByaW1hcnlLZXkKICBdKTsKfQpmdW5jdGlvbiBwcm9taXNpZnlSZXF1ZXN0KHJlcXVlc3QpIHsKICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgIGNvbnN0IHVubGlzdGVuID0gKCkgPT4gewogICAgICByZXF1ZXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInN1Y2Nlc3MiLCBzdWNjZXNzKTsKICAgICAgcmVxdWVzdC5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsIGVycm9yKTsKICAgIH07CiAgICBjb25zdCBzdWNjZXNzID0gKCkgPT4gewogICAgICByZXNvbHZlMih3cmFwKHJlcXVlc3QucmVzdWx0KSk7CiAgICAgIHVubGlzdGVuKCk7CiAgICB9OwogICAgY29uc3QgZXJyb3IgPSAoKSA9PiB7CiAgICAgIHJlamVjdChyZXF1ZXN0LmVycm9yKTsKICAgICAgdW5saXN0ZW4oKTsKICAgIH07CiAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoInN1Y2Nlc3MiLCBzdWNjZXNzKTsKICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBlcnJvcik7CiAgfSk7CiAgcmV2ZXJzZVRyYW5zZm9ybUNhY2hlLnNldChwcm9taXNlLCByZXF1ZXN0KTsKICByZXR1cm4gcHJvbWlzZTsKfQpmdW5jdGlvbiBjYWNoZURvbmVQcm9taXNlRm9yVHJhbnNhY3Rpb24odHgpIHsKICBpZiAodHJhbnNhY3Rpb25Eb25lTWFwLmhhcyh0eCkpCiAgICByZXR1cm47CiAgY29uc3QgZG9uZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0KSA9PiB7CiAgICBjb25zdCB1bmxpc3RlbiA9ICgpID0+IHsKICAgICAgdHgucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLCBjb21wbGV0ZSk7CiAgICAgIHR4LnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIiwgZXJyb3IpOwogICAgICB0eC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsIGVycm9yKTsKICAgIH07CiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHsKICAgICAgcmVzb2x2ZTIoKTsKICAgICAgdW5saXN0ZW4oKTsKICAgIH07CiAgICBjb25zdCBlcnJvciA9ICgpID0+IHsKICAgICAgcmVqZWN0KHR4LmVycm9yIHx8IG5ldyBET01FeGNlcHRpb24oIkFib3J0RXJyb3IiLCAiQWJvcnRFcnJvciIpKTsKICAgICAgdW5saXN0ZW4oKTsKICAgIH07CiAgICB0eC5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsIGNvbXBsZXRlKTsKICAgIHR4LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwgZXJyb3IpOwogICAgdHguYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCBlcnJvcik7CiAgfSk7CiAgdHJhbnNhY3Rpb25Eb25lTWFwLnNldCh0eCwgZG9uZSk7Cn0KZnVuY3Rpb24gcmVwbGFjZVRyYXBzKGNhbGxiYWNrKSB7CiAgaWRiUHJveHlUcmFwcyA9IGNhbGxiYWNrKGlkYlByb3h5VHJhcHMpOwp9CmZ1bmN0aW9uIHdyYXBGdW5jdGlvbihmdW5jKSB7CiAgaWYgKGdldEN1cnNvckFkdmFuY2VNZXRob2RzKCkuaW5jbHVkZXMoZnVuYykpIHsKICAgIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7CiAgICAgIGZ1bmMuYXBwbHkodW53cmFwKHRoaXMpLCBhcmdzKTsKICAgICAgcmV0dXJuIHdyYXAodGhpcy5yZXF1ZXN0KTsKICAgIH07CiAgfQogIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7CiAgICByZXR1cm4gd3JhcChmdW5jLmFwcGx5KHVud3JhcCh0aGlzKSwgYXJncykpOwogIH07Cn0KZnVuY3Rpb24gdHJhbnNmb3JtQ2FjaGFibGVWYWx1ZSh2YWx1ZTIpIHsKICBpZiAodHlwZW9mIHZhbHVlMiA9PT0gImZ1bmN0aW9uIikKICAgIHJldHVybiB3cmFwRnVuY3Rpb24odmFsdWUyKTsKICBpZiAodmFsdWUyIGluc3RhbmNlb2YgSURCVHJhbnNhY3Rpb24pCiAgICBjYWNoZURvbmVQcm9taXNlRm9yVHJhbnNhY3Rpb24odmFsdWUyKTsKICBpZiAoaW5zdGFuY2VPZkFueSh2YWx1ZTIsIGdldElkYlByb3h5YWJsZVR5cGVzKCkpKQogICAgcmV0dXJuIG5ldyBQcm94eSh2YWx1ZTIsIGlkYlByb3h5VHJhcHMpOwogIHJldHVybiB2YWx1ZTI7Cn0KZnVuY3Rpb24gd3JhcCh2YWx1ZTIpIHsKICBpZiAodmFsdWUyIGluc3RhbmNlb2YgSURCUmVxdWVzdCkKICAgIHJldHVybiBwcm9taXNpZnlSZXF1ZXN0KHZhbHVlMik7CiAgaWYgKHRyYW5zZm9ybUNhY2hlLmhhcyh2YWx1ZTIpKQogICAgcmV0dXJuIHRyYW5zZm9ybUNhY2hlLmdldCh2YWx1ZTIpOwogIGNvbnN0IG5ld1ZhbHVlID0gdHJhbnNmb3JtQ2FjaGFibGVWYWx1ZSh2YWx1ZTIpOwogIGlmIChuZXdWYWx1ZSAhPT0gdmFsdWUyKSB7CiAgICB0cmFuc2Zvcm1DYWNoZS5zZXQodmFsdWUyLCBuZXdWYWx1ZSk7CiAgICByZXZlcnNlVHJhbnNmb3JtQ2FjaGUuc2V0KG5ld1ZhbHVlLCB2YWx1ZTIpOwogIH0KICByZXR1cm4gbmV3VmFsdWU7Cn0KZnVuY3Rpb24gb3BlbkRCKG5hbWUsIHZlcnNpb24yLCB7IGJsb2NrZWQsIHVwZ3JhZGUsIGJsb2NraW5nLCB0ZXJtaW5hdGVkIH0gPSB7fSkgewogIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihuYW1lLCB2ZXJzaW9uMik7CiAgY29uc3Qgb3BlblByb21pc2UgPSB3cmFwKHJlcXVlc3QpOwogIGlmICh1cGdyYWRlKSB7CiAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoInVwZ3JhZGVuZWVkZWQiLCAoZXZlbnQpID0+IHsKICAgICAgdXBncmFkZSh3cmFwKHJlcXVlc3QucmVzdWx0KSwgZXZlbnQub2xkVmVyc2lvbiwgZXZlbnQubmV3VmVyc2lvbiwgd3JhcChyZXF1ZXN0LnRyYW5zYWN0aW9uKSwgZXZlbnQpOwogICAgfSk7CiAgfQogIGlmIChibG9ja2VkKSB7CiAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoImJsb2NrZWQiLCAoZXZlbnQpID0+IGJsb2NrZWQoCiAgICAgIC8vIENhc3RpbmcgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC1ET00tbGliLWdlbmVyYXRvci9wdWxsLzE0MDUKICAgICAgZXZlbnQub2xkVmVyc2lvbiwKICAgICAgZXZlbnQubmV3VmVyc2lvbiwKICAgICAgZXZlbnQKICAgICkpOwogIH0KICBvcGVuUHJvbWlzZS50aGVuKChkYikgPT4gewogICAgaWYgKHRlcm1pbmF0ZWQpCiAgICAgIGRiLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwgKCkgPT4gdGVybWluYXRlZCgpKTsKICAgIGlmIChibG9ja2luZykgewogICAgICBkYi5hZGRFdmVudExpc3RlbmVyKCJ2ZXJzaW9uY2hhbmdlIiwgKGV2ZW50KSA9PiBibG9ja2luZyhldmVudC5vbGRWZXJzaW9uLCBldmVudC5uZXdWZXJzaW9uLCBldmVudCkpOwogICAgfQogIH0pLmNhdGNoKCgpID0+IHsKICB9KTsKICByZXR1cm4gb3BlblByb21pc2U7Cn0KZnVuY3Rpb24gZGVsZXRlREIobmFtZSwgeyBibG9ja2VkIH0gPSB7fSkgewogIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIuZGVsZXRlRGF0YWJhc2UobmFtZSk7CiAgaWYgKGJsb2NrZWQpIHsKICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigiYmxvY2tlZCIsIChldmVudCkgPT4gYmxvY2tlZCgKICAgICAgLy8gQ2FzdGluZyBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0LURPTS1saWItZ2VuZXJhdG9yL3B1bGwvMTQwNQogICAgICBldmVudC5vbGRWZXJzaW9uLAogICAgICBldmVudAogICAgKSk7CiAgfQogIHJldHVybiB3cmFwKHJlcXVlc3QpLnRoZW4oKCkgPT4gdm9pZCAwKTsKfQpmdW5jdGlvbiBnZXRNZXRob2QodGFyZ2V0LCBwcm9wKSB7CiAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSURCRGF0YWJhc2UgJiYgIShwcm9wIGluIHRhcmdldCkgJiYgdHlwZW9mIHByb3AgPT09ICJzdHJpbmciKSkgewogICAgcmV0dXJuOwogIH0KICBpZiAoY2FjaGVkTWV0aG9kcy5nZXQocHJvcCkpCiAgICByZXR1cm4gY2FjaGVkTWV0aG9kcy5nZXQocHJvcCk7CiAgY29uc3QgdGFyZ2V0RnVuY05hbWUgPSBwcm9wLnJlcGxhY2UoL0Zyb21JbmRleCQvLCAiIik7CiAgY29uc3QgdXNlSW5kZXggPSBwcm9wICE9PSB0YXJnZXRGdW5jTmFtZTsKICBjb25zdCBpc1dyaXRlID0gd3JpdGVNZXRob2RzLmluY2x1ZGVzKHRhcmdldEZ1bmNOYW1lKTsKICBpZiAoCiAgICAvLyBCYWlsIGlmIHRoZSB0YXJnZXQgZG9lc24ndCBleGlzdCBvbiB0aGUgdGFyZ2V0LiBFZywgZ2V0QWxsIGlzbid0IGluIEVkZ2UuCiAgICAhKHRhcmdldEZ1bmNOYW1lIGluICh1c2VJbmRleCA/IElEQkluZGV4IDogSURCT2JqZWN0U3RvcmUpLnByb3RvdHlwZSkgfHwgIShpc1dyaXRlIHx8IHJlYWRNZXRob2RzLmluY2x1ZGVzKHRhcmdldEZ1bmNOYW1lKSkKICApIHsKICAgIHJldHVybjsKICB9CiAgY29uc3QgbWV0aG9kID0gYXN5bmMgZnVuY3Rpb24oc3RvcmVOYW1lLCAuLi5hcmdzKSB7CiAgICBjb25zdCB0eCA9IHRoaXMudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCBpc1dyaXRlID8gInJlYWR3cml0ZSIgOiAicmVhZG9ubHkiKTsKICAgIGxldCB0YXJnZXQyID0gdHguc3RvcmU7CiAgICBpZiAodXNlSW5kZXgpCiAgICAgIHRhcmdldDIgPSB0YXJnZXQyLmluZGV4KGFyZ3Muc2hpZnQoKSk7CiAgICByZXR1cm4gKGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgdGFyZ2V0Mlt0YXJnZXRGdW5jTmFtZV0oLi4uYXJncyksCiAgICAgIGlzV3JpdGUgJiYgdHguZG9uZQogICAgXSkpWzBdOwogIH07CiAgY2FjaGVkTWV0aG9kcy5zZXQocHJvcCwgbWV0aG9kKTsKICByZXR1cm4gbWV0aG9kOwp9CmFzeW5jIGZ1bmN0aW9uKiBpdGVyYXRlKC4uLmFyZ3MpIHsKICBsZXQgY3Vyc29yID0gdGhpczsKICBpZiAoIShjdXJzb3IgaW5zdGFuY2VvZiBJREJDdXJzb3IpKSB7CiAgICBjdXJzb3IgPSBhd2FpdCBjdXJzb3Iub3BlbkN1cnNvciguLi5hcmdzKTsKICB9CiAgaWYgKCFjdXJzb3IpCiAgICByZXR1cm47CiAgY3Vyc29yID0gY3Vyc29yOwogIGNvbnN0IHByb3hpZWRDdXJzb3IgPSBuZXcgUHJveHkoY3Vyc29yLCBjdXJzb3JJdGVyYXRvclRyYXBzKTsKICBpdHRyUHJveGllZEN1cnNvclRvT3JpZ2luYWxQcm94eS5zZXQocHJveGllZEN1cnNvciwgY3Vyc29yKTsKICByZXZlcnNlVHJhbnNmb3JtQ2FjaGUuc2V0KHByb3hpZWRDdXJzb3IsIHVud3JhcChjdXJzb3IpKTsKICB3aGlsZSAoY3Vyc29yKSB7CiAgICB5aWVsZCBwcm94aWVkQ3Vyc29yOwogICAgY3Vyc29yID0gYXdhaXQgKGFkdmFuY2VSZXN1bHRzLmdldChwcm94aWVkQ3Vyc29yKSB8fCBjdXJzb3IuY29udGludWUoKSk7CiAgICBhZHZhbmNlUmVzdWx0cy5kZWxldGUocHJveGllZEN1cnNvcik7CiAgfQp9CmZ1bmN0aW9uIGlzSXRlcmF0b3JQcm9wKHRhcmdldCwgcHJvcCkgewogIHJldHVybiBwcm9wID09PSBTeW1ib2wuYXN5bmNJdGVyYXRvciAmJiBpbnN0YW5jZU9mQW55KHRhcmdldCwgW0lEQkluZGV4LCBJREJPYmplY3RTdG9yZSwgSURCQ3Vyc29yXSkgfHwgcHJvcCA9PT0gIml0ZXJhdGUiICYmIGluc3RhbmNlT2ZBbnkodGFyZ2V0LCBbSURCSW5kZXgsIElEQk9iamVjdFN0b3JlXSk7Cn0KdmFyIGluc3RhbmNlT2ZBbnksIGlkYlByb3h5YWJsZVR5cGVzLCBjdXJzb3JBZHZhbmNlTWV0aG9kcywgdHJhbnNhY3Rpb25Eb25lTWFwLCB0cmFuc2Zvcm1DYWNoZSwgcmV2ZXJzZVRyYW5zZm9ybUNhY2hlLCBpZGJQcm94eVRyYXBzLCB1bndyYXAsIHJlYWRNZXRob2RzLCB3cml0ZU1ldGhvZHMsIGNhY2hlZE1ldGhvZHMsIGFkdmFuY2VNZXRob2RQcm9wcywgbWV0aG9kTWFwLCBhZHZhbmNlUmVzdWx0cywgaXR0clByb3hpZWRDdXJzb3JUb09yaWdpbmFsUHJveHksIGN1cnNvckl0ZXJhdG9yVHJhcHM7CnZhciBpbml0X2J1aWxkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgraWRiQDguMC4zL25vZGVfbW9kdWxlcy9AdGVtcGZpeC9pZGIvYnVpbGQvaW5kZXguanMiKCkgewogICAgaW5zdGFuY2VPZkFueSA9IChvYmplY3QsIGNvbnN0cnVjdG9ycykgPT4gY29uc3RydWN0b3JzLnNvbWUoKGMxMSkgPT4gb2JqZWN0IGluc3RhbmNlb2YgYzExKTsKICAgIHRyYW5zYWN0aW9uRG9uZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogICAgdHJhbnNmb3JtQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTsKICAgIHJldmVyc2VUcmFuc2Zvcm1DYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogICAgaWRiUHJveHlUcmFwcyA9IHsKICAgICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHsKICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURCVHJhbnNhY3Rpb24pIHsKICAgICAgICAgIGlmIChwcm9wID09PSAiZG9uZSIpCiAgICAgICAgICAgIHJldHVybiB0cmFuc2FjdGlvbkRvbmVNYXAuZ2V0KHRhcmdldCk7CiAgICAgICAgICBpZiAocHJvcCA9PT0gInN0b3JlIikgewogICAgICAgICAgICByZXR1cm4gcmVjZWl2ZXIub2JqZWN0U3RvcmVOYW1lc1sxXSA/IHZvaWQgMCA6IHJlY2VpdmVyLm9iamVjdFN0b3JlKHJlY2VpdmVyLm9iamVjdFN0b3JlTmFtZXNbMF0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gd3JhcCh0YXJnZXRbcHJvcF0pOwogICAgICB9LAogICAgICBzZXQodGFyZ2V0LCBwcm9wLCB2YWx1ZTIpIHsKICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTI7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0sCiAgICAgIGhhcyh0YXJnZXQsIHByb3ApIHsKICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURCVHJhbnNhY3Rpb24gJiYgKHByb3AgPT09ICJkb25lIiB8fCBwcm9wID09PSAic3RvcmUiKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm9wIGluIHRhcmdldDsKICAgICAgfQogICAgfTsKICAgIHVud3JhcCA9ICh2YWx1ZTIpID0+IHJldmVyc2VUcmFuc2Zvcm1DYWNoZS5nZXQodmFsdWUyKTsKICAgIHJlYWRNZXRob2RzID0gWyJnZXQiLCAiZ2V0S2V5IiwgImdldEFsbCIsICJnZXRBbGxLZXlzIiwgImNvdW50Il07CiAgICB3cml0ZU1ldGhvZHMgPSBbInB1dCIsICJhZGQiLCAiZGVsZXRlIiwgImNsZWFyIl07CiAgICBjYWNoZWRNZXRob2RzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIHJlcGxhY2VUcmFwcygob2xkVHJhcHMpID0+ICh7CiAgICAgIC4uLm9sZFRyYXBzLAogICAgICBnZXQ6ICh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSA9PiBnZXRNZXRob2QodGFyZ2V0LCBwcm9wKSB8fCBvbGRUcmFwcy5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlciksCiAgICAgIGhhczogKHRhcmdldCwgcHJvcCkgPT4gISFnZXRNZXRob2QodGFyZ2V0LCBwcm9wKSB8fCBvbGRUcmFwcy5oYXModGFyZ2V0LCBwcm9wKQogICAgfSkpOwogICAgYWR2YW5jZU1ldGhvZFByb3BzID0gWyJjb250aW51ZSIsICJjb250aW51ZVByaW1hcnlLZXkiLCAiYWR2YW5jZSJdOwogICAgbWV0aG9kTWFwID0ge307CiAgICBhZHZhbmNlUmVzdWx0cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogICAgaXR0clByb3hpZWRDdXJzb3JUb09yaWdpbmFsUHJveHkgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTsKICAgIGN1cnNvckl0ZXJhdG9yVHJhcHMgPSB7CiAgICAgIGdldCh0YXJnZXQsIHByb3ApIHsKICAgICAgICBpZiAoIWFkdmFuY2VNZXRob2RQcm9wcy5pbmNsdWRlcyhwcm9wKSkKICAgICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07CiAgICAgICAgbGV0IGNhY2hlZEZ1bmMgPSBtZXRob2RNYXBbcHJvcF07CiAgICAgICAgaWYgKCFjYWNoZWRGdW5jKSB7CiAgICAgICAgICBjYWNoZWRGdW5jID0gbWV0aG9kTWFwW3Byb3BdID0gZnVuY3Rpb24oLi4uYXJncykgewogICAgICAgICAgICBhZHZhbmNlUmVzdWx0cy5zZXQodGhpcywgaXR0clByb3hpZWRDdXJzb3JUb09yaWdpbmFsUHJveHkuZ2V0KHRoaXMpW3Byb3BdKC4uLmFyZ3MpKTsKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBjYWNoZWRGdW5jOwogICAgICB9CiAgICB9OwogICAgcmVwbGFjZVRyYXBzKChvbGRUcmFwcykgPT4gKHsKICAgICAgLi4ub2xkVHJhcHMsCiAgICAgIGdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7CiAgICAgICAgaWYgKGlzSXRlcmF0b3JQcm9wKHRhcmdldCwgcHJvcCkpCiAgICAgICAgICByZXR1cm4gaXRlcmF0ZTsKICAgICAgICByZXR1cm4gb2xkVHJhcHMuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpOwogICAgICB9LAogICAgICBoYXModGFyZ2V0LCBwcm9wKSB7CiAgICAgICAgcmV0dXJuIGlzSXRlcmF0b3JQcm9wKHRhcmdldCwgcHJvcCkgfHwgb2xkVHJhcHMuaGFzKHRhcmdldCwgcHJvcCk7CiAgICAgIH0KICAgIH0pKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnN0b3JlQDIuMC4yMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic3RvcmUvZGlzdF90cy93ZWJzdG9yZS5wbHVnaW5zLmpzCnZhciBpbml0X3dlYnN0b3JlX3BsdWdpbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzdG9yZUAyLjAuMjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnN0b3JlL2Rpc3RfdHMvd2Vic3RvcmUucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHM3KCk7CiAgICBpbml0X2Rpc3RfdHMxNSgpOwogICAgaW5pdF9kaXN0X3RzMTYoKTsKICAgIGluaXRfZGlzdF90cygpOwogICAgaW5pdF9kaXN0X3RzMigpOwogICAgaW5pdF9kaXN0X3RzNCgpOwogICAgaW5pdF9idWlsZCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2Vic3RvcmVAMi4wLjIwL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJzdG9yZS9kaXN0X3RzL3dlYnN0b3JlLmNsYXNzZXMud2Vic3RvcmUuanMKdmFyIFdlYlN0b3JlOwp2YXIgaW5pdF93ZWJzdG9yZV9jbGFzc2VzX3dlYnN0b3JlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2Vic3RvcmVAMi4wLjIwL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJzdG9yZS9kaXN0X3RzL3dlYnN0b3JlLmNsYXNzZXMud2Vic3RvcmUuanMiKCkgewogICAgaW5pdF93ZWJzdG9yZV9wbHVnaW5zKCk7CiAgICBXZWJTdG9yZSA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3Iob3B0aW9uc0FyZykgewogICAgICAgIHRoaXMuaW5pdENhbGxlZCA9IGZhbHNlOwogICAgICAgIHRoaXMucmVhZHlEZWZlcnJlZCA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNBcmc7CiAgICAgIH0KICAgICAgYXN5bmMgaW5pdCgpIHsKICAgICAgICBpZiAodGhpcy5pbml0Q2FsbGVkKSB7CiAgICAgICAgICBhd2FpdCB0aGlzLnJlYWR5RGVmZXJyZWQucHJvbWlzZTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5pbml0Q2FsbGVkID0gdHJ1ZTsKICAgICAgICBjb25zdCBzbWFydGVudiA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxNS5TbWFydGVudigpOwogICAgICAgIGlmICghc21hcnRlbnYuaXNCcm93c2VyICYmICFnbG9iYWxUaGlzLmluZGV4ZWREQikgewogICAgICAgICAgY29uc29sZS5sb2coImhleSIpOwogICAgICAgICAgY29uc29sZS5sb2coZ2xvYmFsVGhpcy5pbmRleGVkREIpOwogICAgICAgICAgYXdhaXQgc21hcnRlbnYuZ2V0U2FmZU5vZGVNb2R1bGUoImZha2UtaW5kZXhlZGRiL2F1dG8iKTsKICAgICAgICAgIGlmICghZ2xvYmFsVGhpcy5pbmRleGVkREIpIHsKICAgICAgICAgICAgY29uc3QgbW9kID0gYXdhaXQgc21hcnRlbnYuZ2V0U2FmZU5vZGVNb2R1bGUoImZha2UtaW5kZXhlZGRiIik7CiAgICAgICAgICAgIGdsb2JhbFRoaXMuaW5kZXhlZERCID0gbmV3IG1vZC5JREJGYWN0b3J5KCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuZGIgPSBhd2FpdCBidWlsZF9leHBvcnRzLm9wZW5EQih0aGlzLm9wdGlvbnMuZGJOYW1lLCAxLCB7CiAgICAgICAgICB1cGdyYWRlOiAoZGIpID0+IHsKICAgICAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUodGhpcy5vcHRpb25zLnN0b3JlTmFtZSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5yZWFkeURlZmVycmVkLnJlc29sdmUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgYXN5bmMgZ2V0KGtleTIpIHsKICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTsKICAgICAgICByZXR1cm4gdGhpcy5kYi5nZXQodGhpcy5vcHRpb25zLnN0b3JlTmFtZSwga2V5Mik7CiAgICAgIH0KICAgICAgYXN5bmMgY2hlY2soa2V5QXJnKSB7CiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQoa2V5QXJnKTsKICAgICAgICByZXR1cm4gISFyZXN1bHQ7CiAgICAgIH0KICAgICAgYXN5bmMgc2V0KGtleTIsIHZhbCkgewogICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpOwogICAgICAgIHJldHVybiB0aGlzLmRiLnB1dCh0aGlzLm9wdGlvbnMuc3RvcmVOYW1lLCB2YWwsIGtleTIpOwogICAgICB9CiAgICAgIGFzeW5jIGRlbGV0ZShrZXkyKSB7CiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7CiAgICAgICAgcmV0dXJuIHRoaXMuZGIuZGVsZXRlKHRoaXMub3B0aW9ucy5zdG9yZU5hbWUsIGtleTIpOwogICAgICB9CiAgICAgIGFzeW5jIGNsZWFyKCkgewogICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpOwogICAgICAgIHJldHVybiB0aGlzLmRiLmNsZWFyKHRoaXMub3B0aW9ucy5zdG9yZU5hbWUpOwogICAgICB9CiAgICAgIGFzeW5jIGtleXMoKSB7CiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7CiAgICAgICAgcmV0dXJuIHRoaXMuZGIuZ2V0QWxsS2V5cyh0aGlzLm9wdGlvbnMuc3RvcmVOYW1lKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnN0b3JlQDIuMC4yMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic3RvcmUvZGlzdF90cy93ZWJzdG9yZS5jbGFzc2VzLnR5cGVkcmVxdWVzdGNhY2hlLmpzCnZhciBUeXBlZHJlcXVlc3RDYWNoZTsKdmFyIGluaXRfd2Vic3RvcmVfY2xhc3Nlc190eXBlZHJlcXVlc3RjYWNoZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnN0b3JlQDIuMC4yMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic3RvcmUvZGlzdF90cy93ZWJzdG9yZS5jbGFzc2VzLnR5cGVkcmVxdWVzdGNhY2hlLmpzIigpIHsKICAgIGluaXRfd2Vic3RvcmVfY2xhc3Nlc193ZWJzdG9yZSgpOwogICAgaW5pdF93ZWJzdG9yZV9wbHVnaW5zKCk7CiAgICBUeXBlZHJlcXVlc3RDYWNoZSA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoZG9tYWluQXJnID0gImRlZmF1bHQiKSB7CiAgICAgICAgdGhpcy53ZWJzdG9yZSA9IG5ldyBXZWJTdG9yZSh7CiAgICAgICAgICBkYk5hbWU6ICJ0clN0b3JlIiwKICAgICAgICAgIHN0b3JlTmFtZTogYHRyU3RvcmUtJHtkb21haW5Bcmd9YAogICAgICAgIH0pOwogICAgICB9CiAgICAgIGJ1aWxkS2V5KHJlcXVlc3RBcmcpIHsKICAgICAgICByZXR1cm4gZGlzdF90c19leHBvcnRzMTYuc3RyaW5naWZ5KHsKICAgICAgICAgIG1ldGhvZDogcmVxdWVzdEFyZy5tZXRob2QsCiAgICAgICAgICByZXF1ZXN0OiByZXF1ZXN0QXJnLnJlcXVlc3QKICAgICAgICB9KTsKICAgICAgfQogICAgICAvKioKICAgICAgICogc3RvcmVzIGJ5IHJlcXVlc3QKICAgICAgICogQHBhcmFtIHR5cGVkcmVxdWVzdGFyZwogICAgICAgKi8KICAgICAgYXN5bmMgc2V0QnlSZXF1ZXN0KHR5cGVkcmVxdWVzdEFyZykgewogICAgICAgIGlmICghdHlwZWRyZXF1ZXN0QXJnLnJlc3BvbnNlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIllvdSBjYW5ub3Qgc3RvcmUgcmVxdWVzdHMgd2l0aG91dCBhIHJlc3BvbnNlIHByZXNlbnQiKTsKICAgICAgICB9CiAgICAgICAgYXdhaXQgdGhpcy53ZWJzdG9yZS5zZXQodGhpcy5idWlsZEtleSh0eXBlZHJlcXVlc3RBcmcpLCB0eXBlZHJlcXVlc3RBcmcpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBnZXQgYnkgZnVsbCB0eW9lZHJlcXVlc3QgYnkgcGFydGlhbCB0eXBlZHJlcXVlc3QKICAgICAgICogQHBhcmFtIHR5cGVkcmVxdWVzdGFyZwogICAgICAgKi8KICAgICAgYXN5bmMgZ2V0QnlSZXF1ZXN0KHR5cGVkcmVxdWVzdEFyZykgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMud2Vic3RvcmUuZ2V0KHRoaXMuYnVpbGRLZXkodHlwZWRyZXF1ZXN0QXJnKSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnN0b3JlQDIuMC4yMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic3RvcmUvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMTcgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMTcsIHsKICBUeXBlZHJlcXVlc3RDYWNoZTogKCkgPT4gVHlwZWRyZXF1ZXN0Q2FjaGUsCiAgV2ViU3RvcmU6ICgpID0+IFdlYlN0b3JlCn0pOwp2YXIgaW5pdF9kaXN0X3RzMTcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzdG9yZUAyLjAuMjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnN0b3JlL2Rpc3RfdHMvaW5kZXguanMiKCkgewogICAgaW5pdF93ZWJzdG9yZV9jbGFzc2VzX3R5cGVkcmVxdWVzdGNhY2hlKCk7CiAgICBpbml0X3dlYnN0b3JlX2NsYXNzZXNfd2Vic3RvcmUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnJlcXVlc3RANC4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnJlcXVlc3QvZGlzdF90cy93ZWJyZXF1ZXN0LnBsdWdpbnMuanMKdmFyIGluaXRfd2VicmVxdWVzdF9wbHVnaW5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2VicmVxdWVzdEA0LjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2VicmVxdWVzdC9kaXN0X3RzL3dlYnJlcXVlc3QucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMzKCk7CiAgICBpbml0X2Rpc3RfdHMxMigpOwogICAgaW5pdF9kaXN0X3RzMTQoKTsKICAgIGluaXRfZGlzdF90cygpOwogICAgaW5pdF9kaXN0X3RzMTcoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnJlcXVlc3RANC4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnJlcXVlc3QvZGlzdF90cy9jYWNoZS9jYWNoZS5zdG9yZS5qcwp2YXIgQ2FjaGVTdG9yZTsKdmFyIGluaXRfY2FjaGVfc3RvcmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvY2FjaGUvY2FjaGUuc3RvcmUuanMiKCkgewogICAgaW5pdF93ZWJyZXF1ZXN0X3BsdWdpbnMoKTsKICAgIENhY2hlU3RvcmUgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKGRiTmFtZSA9ICJ3ZWJyZXF1ZXN0LXY0Iiwgc3RvcmVOYW1lID0gImNhY2hlIikgewogICAgICAgIHRoaXMud2Vic3RvcmUgPSBuZXcgZGlzdF90c19leHBvcnRzMTcuV2ViU3RvcmUoewogICAgICAgICAgZGJOYW1lLAogICAgICAgICAgc3RvcmVOYW1lCiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5pbml0UHJvbWlzZSA9IHRoaXMuaW5pdCgpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJbml0aWFsaXplIHRoZSBzdG9yZQogICAgICAgKi8KICAgICAgYXN5bmMgaW5pdCgpIHsKICAgICAgfQogICAgICAvKioKICAgICAgICogR2VuZXJhdGUgYSBjYWNoZSBrZXkgZnJvbSBhIHJlcXVlc3QKICAgICAgICovCiAgICAgIGdlbmVyYXRlQ2FjaGVLZXkocmVxdWVzdCkgewogICAgICAgIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsOwogICAgICAgIGNvbnN0IG1ldGhvZCA9IHJlcXVlc3QubWV0aG9kOwogICAgICAgIGlmIChtZXRob2QgPT09ICJHRVQiKSB7CiAgICAgICAgICByZXR1cm4gdXJsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYCR7bWV0aG9kfToke3VybH1gOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBTdG9yZSBhIHJlc3BvbnNlIGluIHRoZSBjYWNoZQogICAgICAgKi8KICAgICAgYXN5bmMgc2V0KGNhY2hlS2V5LCBlbnRyeSkgewogICAgICAgIGF3YWl0IHRoaXMuaW5pdFByb21pc2U7CiAgICAgICAgYXdhaXQgdGhpcy53ZWJzdG9yZS5zZXQoY2FjaGVLZXksIGVudHJ5KTsKICAgICAgfQogICAgICAvKioKICAgICAgICogUmV0cmlldmUgYSBjYWNoZWQgcmVzcG9uc2UKICAgICAgICovCiAgICAgIGFzeW5jIGdldChjYWNoZUtleSkgewogICAgICAgIGF3YWl0IHRoaXMuaW5pdFByb21pc2U7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgdGhpcy53ZWJzdG9yZS5nZXQoY2FjaGVLZXkpOwogICAgICAgICAgcmV0dXJuIGVudHJ5IHx8IG51bGw7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogQ2hlY2sgaWYgYSBjYWNoZSBlbnRyeSBleGlzdHMKICAgICAgICovCiAgICAgIGFzeW5jIGhhcyhjYWNoZUtleSkgewogICAgICAgIGF3YWl0IHRoaXMuaW5pdFByb21pc2U7CiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMud2Vic3RvcmUuY2hlY2soY2FjaGVLZXkpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBEZWxldGUgYSBjYWNoZSBlbnRyeQogICAgICAgKi8KICAgICAgYXN5bmMgZGVsZXRlKGNhY2hlS2V5KSB7CiAgICAgICAgYXdhaXQgdGhpcy5pbml0UHJvbWlzZTsKICAgICAgICBhd2FpdCB0aGlzLndlYnN0b3JlLmRlbGV0ZShjYWNoZUtleSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENsZWFyIGFsbCBjYWNoZSBlbnRyaWVzCiAgICAgICAqLwogICAgICBhc3luYyBjbGVhcigpIHsKICAgICAgICBhd2FpdCB0aGlzLmluaXRQcm9taXNlOwogICAgICAgIGF3YWl0IHRoaXMud2Vic3RvcmUuY2xlYXIoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQ3JlYXRlIGEgUmVzcG9uc2Ugb2JqZWN0IGZyb20gYSBjYWNoZSBlbnRyeQogICAgICAgKi8KICAgICAgcmVzcG9uc2VGcm9tQ2FjaGVFbnRyeShlbnRyeSkgewogICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhlbnRyeS5oZWFkZXJzKTsKICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKGVudHJ5LnJlc3BvbnNlLCB7CiAgICAgICAgICBzdGF0dXM6IGVudHJ5LnN0YXR1cywKICAgICAgICAgIHN0YXR1c1RleHQ6IGVudHJ5LnN0YXR1c1RleHQsCiAgICAgICAgICBoZWFkZXJzCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENyZWF0ZSBhIGNhY2hlIGVudHJ5IGZyb20gYSBSZXNwb25zZSBvYmplY3QKICAgICAgICovCiAgICAgIGFzeW5jIGNhY2hlRW50cnlGcm9tUmVzcG9uc2UodXJsLCByZXNwb25zZSwgbWV0YWRhdGEpIHsKICAgICAgICBjb25zdCBjbG9uZWRSZXNwb25zZSA9IHJlc3BvbnNlLmNsb25lKCk7CiAgICAgICAgY29uc3QgYnVmZmVyMiA9IGF3YWl0IGNsb25lZFJlc3BvbnNlLmFycmF5QnVmZmVyKCk7CiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9OwogICAgICAgIGNsb25lZFJlc3BvbnNlLmhlYWRlcnMuZm9yRWFjaCgodmFsdWUyLCBrZXkyKSA9PiB7CiAgICAgICAgICBoZWFkZXJzW2tleTJdID0gdmFsdWUyOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICByZXNwb25zZTogYnVmZmVyMiwKICAgICAgICAgIGhlYWRlcnMsCiAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksCiAgICAgICAgICBldGFnOiBtZXRhZGF0YT8uZXRhZyB8fCBjbG9uZWRSZXNwb25zZS5oZWFkZXJzLmdldCgiZXRhZyIpIHx8IHZvaWQgMCwKICAgICAgICAgIGxhc3RNb2RpZmllZDogbWV0YWRhdGE/Lmxhc3RNb2RpZmllZCB8fCBjbG9uZWRSZXNwb25zZS5oZWFkZXJzLmdldCgibGFzdC1tb2RpZmllZCIpIHx8IHZvaWQgMCwKICAgICAgICAgIG1heEFnZTogbWV0YWRhdGE/Lm1heEFnZSwKICAgICAgICAgIHVybCwKICAgICAgICAgIHN0YXR1czogY2xvbmVkUmVzcG9uc2Uuc3RhdHVzLAogICAgICAgICAgc3RhdHVzVGV4dDogY2xvbmVkUmVzcG9uc2Uuc3RhdHVzVGV4dAogICAgICAgIH07CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFBydW5lIGV4cGlyZWQgZW50cmllcyAoZ2FyYmFnZSBjb2xsZWN0aW9uKQogICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBkZWxldGVkCiAgICAgICAqLwogICAgICBhc3luYyBwcnVuZUV4cGlyZWQoKSB7CiAgICAgICAgYXdhaXQgdGhpcy5pbml0UHJvbWlzZTsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnJlcXVlc3RANC4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnJlcXVlc3QvZGlzdF90cy9jYWNoZS9jYWNoZS5oZWFkZXJzLmpzCmZ1bmN0aW9uIHBhcnNlQ2FjaGVDb250cm9sKGNhY2hlQ29udHJvbEhlYWRlcikgewogIGNvbnN0IG1ldGFkYXRhID0gewogICAgbWF4QWdlOiAwLAogICAgaW1tdXRhYmxlOiBmYWxzZSwKICAgIG5vQ2FjaGU6IGZhbHNlLAogICAgbm9TdG9yZTogZmFsc2UsCiAgICBtdXN0UmV2YWxpZGF0ZTogZmFsc2UKICB9OwogIGlmICghY2FjaGVDb250cm9sSGVhZGVyKSB7CiAgICByZXR1cm4gbWV0YWRhdGE7CiAgfQogIGNvbnN0IGRpcmVjdGl2ZXMgPSBjYWNoZUNvbnRyb2xIZWFkZXIudG9Mb3dlckNhc2UoKS5zcGxpdCgiLCIpLm1hcCgoZDYpID0+IGQ2LnRyaW0oKSk7CiAgZm9yIChjb25zdCBkaXJlY3RpdmUgb2YgZGlyZWN0aXZlcykgewogICAgaWYgKGRpcmVjdGl2ZSA9PT0gIm5vLWNhY2hlIikgewogICAgICBtZXRhZGF0YS5ub0NhY2hlID0gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoZGlyZWN0aXZlID09PSAibm8tc3RvcmUiKSB7CiAgICAgIG1ldGFkYXRhLm5vU3RvcmUgPSB0cnVlOwogICAgfSBlbHNlIGlmIChkaXJlY3RpdmUgPT09ICJpbW11dGFibGUiKSB7CiAgICAgIG1ldGFkYXRhLmltbXV0YWJsZSA9IHRydWU7CiAgICB9IGVsc2UgaWYgKGRpcmVjdGl2ZSA9PT0gIm11c3QtcmV2YWxpZGF0ZSIpIHsKICAgICAgbWV0YWRhdGEubXVzdFJldmFsaWRhdGUgPSB0cnVlOwogICAgfSBlbHNlIGlmIChkaXJlY3RpdmUuc3RhcnRzV2l0aCgibWF4LWFnZT0iKSkgewogICAgICBjb25zdCBtYXhBZ2UgPSBwYXJzZUludChkaXJlY3RpdmUuc3BsaXQoIj0iKVsxXSwgMTApOwogICAgICBpZiAoIWlzTmFOKG1heEFnZSkpIHsKICAgICAgICBtZXRhZGF0YS5tYXhBZ2UgPSBtYXhBZ2UgKiAxZTM7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIG1ldGFkYXRhOwp9CmZ1bmN0aW9uIHBhcnNlRXhwaXJlcyhleHBpcmVzSGVhZGVyKSB7CiAgaWYgKCFleHBpcmVzSGVhZGVyKSB7CiAgICByZXR1cm4gdm9pZCAwOwogIH0KICB0cnkgewogICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGV4cGlyZXNIZWFkZXIpOwogICAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIHZvaWQgMDsKICB9Cn0KZnVuY3Rpb24gZXh0cmFjdENhY2hlTWV0YWRhdGEoaGVhZGVycykgewogIGNvbnN0IGNhY2hlQ29udHJvbCA9IGhlYWRlcnMuZ2V0KCJjYWNoZS1jb250cm9sIik7CiAgY29uc3QgZXhwaXJlcyA9IGhlYWRlcnMuZ2V0KCJleHBpcmVzIik7CiAgY29uc3QgZXRhZyA9IGhlYWRlcnMuZ2V0KCJldGFnIik7CiAgY29uc3QgbGFzdE1vZGlmaWVkID0gaGVhZGVycy5nZXQoImxhc3QtbW9kaWZpZWQiKTsKICBjb25zdCBtZXRhZGF0YSA9IHBhcnNlQ2FjaGVDb250cm9sKGNhY2hlQ29udHJvbCk7CiAgaWYgKG1ldGFkYXRhLm1heEFnZSA9PT0gMCAmJiBleHBpcmVzKSB7CiAgICBjb25zdCBleHBpcmVzVGltZSA9IHBhcnNlRXhwaXJlcyhleHBpcmVzKTsKICAgIGlmIChleHBpcmVzVGltZSkgewogICAgICBtZXRhZGF0YS5tYXhBZ2UgPSBNYXRoLm1heCgwLCBleHBpcmVzVGltZSAtIERhdGUubm93KCkpOwogICAgfQogIH0KICByZXR1cm4gewogICAgbWF4QWdlOiBtZXRhZGF0YS5tYXhBZ2UgfHwgMCwKICAgIGV0YWc6IGV0YWcgfHwgdm9pZCAwLAogICAgbGFzdE1vZGlmaWVkOiBsYXN0TW9kaWZpZWQgfHwgdm9pZCAwLAogICAgaW1tdXRhYmxlOiBtZXRhZGF0YS5pbW11dGFibGUgfHwgZmFsc2UsCiAgICBub0NhY2hlOiBtZXRhZGF0YS5ub0NhY2hlIHx8IGZhbHNlLAogICAgbm9TdG9yZTogbWV0YWRhdGEubm9TdG9yZSB8fCBmYWxzZSwKICAgIG11c3RSZXZhbGlkYXRlOiBtZXRhZGF0YS5tdXN0UmV2YWxpZGF0ZSB8fCBmYWxzZQogIH07Cn0KZnVuY3Rpb24gaXNGcmVzaChjYWNoZUVudHJ5LCBtZXRhZGF0YSkgewogIGlmIChtZXRhZGF0YS5ub1N0b3JlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmIChtZXRhZGF0YS5pbW11dGFibGUpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBjb25zdCBhZ2UgPSBEYXRlLm5vdygpIC0gY2FjaGVFbnRyeS50aW1lc3RhbXA7CiAgY29uc3QgbWF4QWdlID0gY2FjaGVFbnRyeS5tYXhBZ2UgfHwgbWV0YWRhdGEubWF4QWdlIHx8IDA7CiAgaWYgKG1heEFnZSA9PT0gMCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gYWdlIDwgbWF4QWdlOwp9CmZ1bmN0aW9uIHJlcXVpcmVzUmV2YWxpZGF0aW9uKG1ldGFkYXRhKSB7CiAgcmV0dXJuIG1ldGFkYXRhLm5vQ2FjaGUgfHwgbWV0YWRhdGEubXVzdFJldmFsaWRhdGU7Cn0KZnVuY3Rpb24gY3JlYXRlQ29uZGl0aW9uYWxIZWFkZXJzKGNhY2hlRW50cnkpIHsKICBjb25zdCBoZWFkZXJzID0ge307CiAgaWYgKGNhY2hlRW50cnkuZXRhZykgewogICAgaGVhZGVyc1siaWYtbm9uZS1tYXRjaCJdID0gY2FjaGVFbnRyeS5ldGFnOwogIH0KICBpZiAoY2FjaGVFbnRyeS5sYXN0TW9kaWZpZWQpIHsKICAgIGhlYWRlcnNbImlmLW1vZGlmaWVkLXNpbmNlIl0gPSBjYWNoZUVudHJ5Lmxhc3RNb2RpZmllZDsKICB9CiAgcmV0dXJuIGhlYWRlcnM7Cn0KZnVuY3Rpb24gaGVhZGVyc1RvT2JqZWN0KGhlYWRlcnMpIHsKICBjb25zdCBvYmogPSB7fTsKICBoZWFkZXJzLmZvckVhY2goKHZhbHVlMiwga2V5MikgPT4gewogICAgb2JqW2tleTJdID0gdmFsdWUyOwogIH0pOwogIHJldHVybiBvYmo7Cn0KZnVuY3Rpb24gb2JqZWN0VG9IZWFkZXJzKG9iaikgewogIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpOwogIE9iamVjdC5lbnRyaWVzKG9iaikuZm9yRWFjaCgoW2tleTIsIHZhbHVlMl0pID0+IHsKICAgIGhlYWRlcnMuc2V0KGtleTIsIHZhbHVlMik7CiAgfSk7CiAgcmV0dXJuIGhlYWRlcnM7Cn0KdmFyIGluaXRfY2FjaGVfaGVhZGVycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnJlcXVlc3RANC4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnJlcXVlc3QvZGlzdF90cy9jYWNoZS9jYWNoZS5oZWFkZXJzLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnJlcXVlc3RANC4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnJlcXVlc3QvZGlzdF90cy9jYWNoZS9jYWNoZS5zdHJhdGVnaWVzLmpzCmZ1bmN0aW9uIGdldFN0cmF0ZWd5SGFuZGxlcihzdHJhdGVneSkgewogIHN3aXRjaCAoc3RyYXRlZ3kpIHsKICAgIGNhc2UgIm5ldHdvcmstZmlyc3QiOgogICAgICByZXR1cm4gbmV3IE5ldHdvcmtGaXJzdFN0cmF0ZWd5KCk7CiAgICBjYXNlICJjYWNoZS1maXJzdCI6CiAgICAgIHJldHVybiBuZXcgQ2FjaGVGaXJzdFN0cmF0ZWd5KCk7CiAgICBjYXNlICJzdGFsZS13aGlsZS1yZXZhbGlkYXRlIjoKICAgICAgcmV0dXJuIG5ldyBTdGFsZVdoaWxlUmV2YWxpZGF0ZVN0cmF0ZWd5KCk7CiAgICBjYXNlICJuZXR3b3JrLW9ubHkiOgogICAgICByZXR1cm4gbmV3IE5ldHdvcmtPbmx5U3RyYXRlZ3koKTsKICAgIGNhc2UgImNhY2hlLW9ubHkiOgogICAgICByZXR1cm4gbmV3IENhY2hlT25seVN0cmF0ZWd5KCk7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gbmV3IE5ldHdvcmtGaXJzdFN0cmF0ZWd5KCk7CiAgfQp9CnZhciBOZXR3b3JrRmlyc3RTdHJhdGVneSwgQ2FjaGVGaXJzdFN0cmF0ZWd5LCBTdGFsZVdoaWxlUmV2YWxpZGF0ZVN0cmF0ZWd5LCBOZXR3b3JrT25seVN0cmF0ZWd5LCBDYWNoZU9ubHlTdHJhdGVneTsKdmFyIGluaXRfY2FjaGVfc3RyYXRlZ2llcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnJlcXVlc3RANC4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnJlcXVlc3QvZGlzdF90cy9jYWNoZS9jYWNoZS5zdHJhdGVnaWVzLmpzIigpIHsKICAgIGluaXRfY2FjaGVfc3RvcmUoKTsKICAgIGluaXRfY2FjaGVfaGVhZGVycygpOwogICAgTmV0d29ya0ZpcnN0U3RyYXRlZ3kgPSBjbGFzcyB7CiAgICAgIGFzeW5jIGV4ZWN1dGUoY29udGV4dDIpIHsKICAgICAgICB0cnkgewogICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb250ZXh0Mi5mZXRjaEZuKGNvbnRleHQyLnJlcXVlc3QpOwogICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FjaGVSZXNwb25zZShjb250ZXh0MiwgcmVzcG9uc2UpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVzcG9uc2UsCiAgICAgICAgICAgIGZyb21DYWNoZTogZmFsc2UsCiAgICAgICAgICAgIHJldmFsaWRhdGVkOiBmYWxzZQogICAgICAgICAgfTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgaWYgKGNvbnRleHQyLmxvZ2dpbmcpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coIlt3ZWJyZXF1ZXN0XSBOZXR3b3JrIGZhaWxlZCwgdHJ5aW5nIGNhY2hlOiIsIGVycm9yKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGNhY2hlZEVudHJ5ID0gYXdhaXQgY29udGV4dDIuY2FjaGVTdG9yZS5nZXQoY29udGV4dDIuY2FjaGVLZXkpOwogICAgICAgICAgaWYgKGNhY2hlZEVudHJ5KSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgcmVzcG9uc2U6IGNvbnRleHQyLmNhY2hlU3RvcmUucmVzcG9uc2VGcm9tQ2FjaGVFbnRyeShjYWNoZWRFbnRyeSksCiAgICAgICAgICAgICAgZnJvbUNhY2hlOiB0cnVlLAogICAgICAgICAgICAgIHJldmFsaWRhdGVkOiBmYWxzZQogICAgICAgICAgICB9OwogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIGNhY2hlUmVzcG9uc2UoY29udGV4dDIsIHJlc3BvbnNlKSB7CiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBleHRyYWN0Q2FjaGVNZXRhZGF0YShyZXNwb25zZS5oZWFkZXJzKTsKICAgICAgICBpZiAobWV0YWRhdGEubm9TdG9yZSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBlbnRyeSA9IGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuY2FjaGVFbnRyeUZyb21SZXNwb25zZShjb250ZXh0Mi5yZXF1ZXN0LnVybCwgcmVzcG9uc2UsIG1ldGFkYXRhKTsKICAgICAgICBhd2FpdCBjb250ZXh0Mi5jYWNoZVN0b3JlLnNldChjb250ZXh0Mi5jYWNoZUtleSwgZW50cnkpOwogICAgICB9CiAgICB9OwogICAgQ2FjaGVGaXJzdFN0cmF0ZWd5ID0gY2xhc3MgewogICAgICBhc3luYyBleGVjdXRlKGNvbnRleHQyKSB7CiAgICAgICAgY29uc3QgY2FjaGVkRW50cnkgPSBhd2FpdCBjb250ZXh0Mi5jYWNoZVN0b3JlLmdldChjb250ZXh0Mi5jYWNoZUtleSk7CiAgICAgICAgaWYgKGNhY2hlZEVudHJ5KSB7CiAgICAgICAgICBjb25zdCBtZXRhZGF0YTIgPSBleHRyYWN0Q2FjaGVNZXRhZGF0YShuZXcgSGVhZGVycyhjYWNoZWRFbnRyeS5oZWFkZXJzKSk7CiAgICAgICAgICBpZiAoaXNGcmVzaChjYWNoZWRFbnRyeSwgbWV0YWRhdGEyKSkgewogICAgICAgICAgICBpZiAoY29udGV4dDIubG9nZ2luZykgewogICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJbd2VicmVxdWVzdF0gQ2FjaGUgaGl0IChmcmVzaCk6IiwgY29udGV4dDIucmVxdWVzdC51cmwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgcmVzcG9uc2U6IGNvbnRleHQyLmNhY2hlU3RvcmUucmVzcG9uc2VGcm9tQ2FjaGVFbnRyeShjYWNoZWRFbnRyeSksCiAgICAgICAgICAgICAgZnJvbUNhY2hlOiB0cnVlLAogICAgICAgICAgICAgIHJldmFsaWRhdGVkOiBmYWxzZQogICAgICAgICAgICB9OwogICAgICAgICAgfQogICAgICAgICAgaWYgKHJlcXVpcmVzUmV2YWxpZGF0aW9uKG1ldGFkYXRhMikgJiYgKGNhY2hlZEVudHJ5LmV0YWcgfHwgY2FjaGVkRW50cnkubGFzdE1vZGlmaWVkKSkgewogICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXZhbGlkYXRlKGNvbnRleHQyLCBjYWNoZWRFbnRyeSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChjb250ZXh0Mi5sb2dnaW5nKSB7CiAgICAgICAgICBjb25zb2xlLmxvZygiW3dlYnJlcXVlc3RdIENhY2hlIG1pc3MsIGZldGNoaW5nOiIsIGNvbnRleHQyLnJlcXVlc3QudXJsKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb250ZXh0Mi5mZXRjaEZuKGNvbnRleHQyLnJlcXVlc3QpOwogICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZXh0cmFjdENhY2hlTWV0YWRhdGEocmVzcG9uc2UuaGVhZGVycyk7CiAgICAgICAgaWYgKCFtZXRhZGF0YS5ub1N0b3JlKSB7CiAgICAgICAgICBjb25zdCBlbnRyeSA9IGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuY2FjaGVFbnRyeUZyb21SZXNwb25zZShjb250ZXh0Mi5yZXF1ZXN0LnVybCwgcmVzcG9uc2UsIG1ldGFkYXRhKTsKICAgICAgICAgIGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuc2V0KGNvbnRleHQyLmNhY2hlS2V5LCBlbnRyeSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICByZXNwb25zZSwKICAgICAgICAgIGZyb21DYWNoZTogZmFsc2UsCiAgICAgICAgICByZXZhbGlkYXRlZDogZmFsc2UKICAgICAgICB9OwogICAgICB9CiAgICAgIGFzeW5jIHJldmFsaWRhdGUoY29udGV4dDIsIGNhY2hlZEVudHJ5KSB7CiAgICAgICAgY29uc3QgY29uZGl0aW9uYWxIZWFkZXJzID0gY3JlYXRlQ29uZGl0aW9uYWxIZWFkZXJzKGNhY2hlZEVudHJ5KTsKICAgICAgICBjb25zdCByZXZhbGlkYXRlUmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGNvbnRleHQyLnJlcXVlc3QudXJsLCB7CiAgICAgICAgICBtZXRob2Q6IGNvbnRleHQyLnJlcXVlc3QubWV0aG9kLAogICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAuLi5oZWFkZXJzVG9PYmplY3QoY29udGV4dDIucmVxdWVzdC5oZWFkZXJzKSwKICAgICAgICAgICAgLi4uY29uZGl0aW9uYWxIZWFkZXJzCiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29udGV4dDIuZmV0Y2hGbihyZXZhbGlkYXRlUmVxdWVzdCk7CiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAzMDQpIHsKICAgICAgICAgICAgaWYgKGNvbnRleHQyLmxvZ2dpbmcpIHsKICAgICAgICAgICAgICBjb25zb2xlLmxvZygiW3dlYnJlcXVlc3RdIENhY2hlIHJldmFsaWRhdGVkICgzMDQpOiIsIGNvbnRleHQyLnJlcXVlc3QudXJsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYWNoZWRFbnRyeS50aW1lc3RhbXAgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBhd2FpdCBjb250ZXh0Mi5jYWNoZVN0b3JlLnNldChjb250ZXh0Mi5jYWNoZUtleSwgY2FjaGVkRW50cnkpOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHJlc3BvbnNlOiBjb250ZXh0Mi5jYWNoZVN0b3JlLnJlc3BvbnNlRnJvbUNhY2hlRW50cnkoY2FjaGVkRW50cnkpLAogICAgICAgICAgICAgIGZyb21DYWNoZTogdHJ1ZSwKICAgICAgICAgICAgICByZXZhbGlkYXRlZDogdHJ1ZQogICAgICAgICAgICB9OwogICAgICAgICAgfQogICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7CiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZXh0cmFjdENhY2hlTWV0YWRhdGEocmVzcG9uc2UuaGVhZGVycyk7CiAgICAgICAgICAgIGlmICghbWV0YWRhdGEubm9TdG9yZSkgewogICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgY29udGV4dDIuY2FjaGVTdG9yZS5jYWNoZUVudHJ5RnJvbVJlc3BvbnNlKGNvbnRleHQyLnJlcXVlc3QudXJsLCByZXNwb25zZSwgbWV0YWRhdGEpOwogICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuc2V0KGNvbnRleHQyLmNhY2hlS2V5LCBlbnRyeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHJlc3BvbnNlLAogICAgICAgICAgICBmcm9tQ2FjaGU6IGZhbHNlLAogICAgICAgICAgICByZXZhbGlkYXRlZDogdHJ1ZQogICAgICAgICAgfTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgaWYgKGNvbnRleHQyLmxvZ2dpbmcpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coIlt3ZWJyZXF1ZXN0XSBSZXZhbGlkYXRpb24gZmFpbGVkLCB1c2luZyBjYWNoZToiLCBlcnJvcik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICByZXNwb25zZTogY29udGV4dDIuY2FjaGVTdG9yZS5yZXNwb25zZUZyb21DYWNoZUVudHJ5KGNhY2hlZEVudHJ5KSwKICAgICAgICAgICAgZnJvbUNhY2hlOiB0cnVlLAogICAgICAgICAgICByZXZhbGlkYXRlZDogZmFsc2UKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgU3RhbGVXaGlsZVJldmFsaWRhdGVTdHJhdGVneSA9IGNsYXNzIHsKICAgICAgYXN5bmMgZXhlY3V0ZShjb250ZXh0MikgewogICAgICAgIGNvbnN0IGNhY2hlZEVudHJ5ID0gYXdhaXQgY29udGV4dDIuY2FjaGVTdG9yZS5nZXQoY29udGV4dDIuY2FjaGVLZXkpOwogICAgICAgIGlmIChjYWNoZWRFbnRyeSkgewogICAgICAgICAgY29uc3QgY2FjaGVkUmVzcG9uc2UgPSBjb250ZXh0Mi5jYWNoZVN0b3JlLnJlc3BvbnNlRnJvbUNhY2hlRW50cnkoY2FjaGVkRW50cnkpOwogICAgICAgICAgdGhpcy5yZXZhbGlkYXRlSW5CYWNrZ3JvdW5kKGNvbnRleHQyLCBjYWNoZWRFbnRyeSkuY2F0Y2goKGVycm9yKSA9PiB7CiAgICAgICAgICAgIGlmIChjb250ZXh0Mi5sb2dnaW5nKSB7CiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCJbd2VicmVxdWVzdF0gQmFja2dyb3VuZCByZXZhbGlkYXRpb24gZmFpbGVkOiIsIGVycm9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICByZXNwb25zZTogY2FjaGVkUmVzcG9uc2UsCiAgICAgICAgICAgIGZyb21DYWNoZTogdHJ1ZSwKICAgICAgICAgICAgcmV2YWxpZGF0ZWQ6IGZhbHNlCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNvbnRleHQyLmZldGNoRm4oY29udGV4dDIucmVxdWVzdCk7CiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBleHRyYWN0Q2FjaGVNZXRhZGF0YShyZXNwb25zZS5oZWFkZXJzKTsKICAgICAgICBpZiAoIW1ldGFkYXRhLm5vU3RvcmUgJiYgcmVzcG9uc2Uub2spIHsKICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgY29udGV4dDIuY2FjaGVTdG9yZS5jYWNoZUVudHJ5RnJvbVJlc3BvbnNlKGNvbnRleHQyLnJlcXVlc3QudXJsLCByZXNwb25zZSwgbWV0YWRhdGEpOwogICAgICAgICAgYXdhaXQgY29udGV4dDIuY2FjaGVTdG9yZS5zZXQoY29udGV4dDIuY2FjaGVLZXksIGVudHJ5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJlc3BvbnNlLAogICAgICAgICAgZnJvbUNhY2hlOiBmYWxzZSwKICAgICAgICAgIHJldmFsaWRhdGVkOiBmYWxzZQogICAgICAgIH07CiAgICAgIH0KICAgICAgYXN5bmMgcmV2YWxpZGF0ZUluQmFja2dyb3VuZChjb250ZXh0MiwgY2FjaGVkRW50cnkpIHsKICAgICAgICBjb25zdCBtZXRhZGF0YSA9IGV4dHJhY3RDYWNoZU1ldGFkYXRhKG5ldyBIZWFkZXJzKGNhY2hlZEVudHJ5LmhlYWRlcnMpKTsKICAgICAgICBpZiAoaXNGcmVzaChjYWNoZWRFbnRyeSwgbWV0YWRhdGEpICYmICFyZXF1aXJlc1JldmFsaWRhdGlvbihtZXRhZGF0YSkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29udGV4dDIuZmV0Y2hGbihjb250ZXh0Mi5yZXF1ZXN0KTsKICAgICAgICAgIGlmIChyZXNwb25zZS5vaykgewogICAgICAgICAgICBjb25zdCBuZXdNZXRhZGF0YSA9IGV4dHJhY3RDYWNoZU1ldGFkYXRhKHJlc3BvbnNlLmhlYWRlcnMpOwogICAgICAgICAgICBpZiAoIW5ld01ldGFkYXRhLm5vU3RvcmUpIHsKICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuY2FjaGVFbnRyeUZyb21SZXNwb25zZShjb250ZXh0Mi5yZXF1ZXN0LnVybCwgcmVzcG9uc2UsIG5ld01ldGFkYXRhKTsKICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0Mi5jYWNoZVN0b3JlLnNldChjb250ZXh0Mi5jYWNoZUtleSwgZW50cnkpOwogICAgICAgICAgICAgIGlmIChjb250ZXh0Mi5sb2dnaW5nKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiW3dlYnJlcXVlc3RdIEJhY2tncm91bmQgcmV2YWxpZGF0aW9uIGNvbXBsZXRlOiIsIGNvbnRleHQyLnJlcXVlc3QudXJsKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgaWYgKGNvbnRleHQyLmxvZ2dpbmcpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCJbd2VicmVxdWVzdF0gQmFja2dyb3VuZCByZXZhbGlkYXRpb24gZmFpbGVkOiIsIGVycm9yKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBOZXR3b3JrT25seVN0cmF0ZWd5ID0gY2xhc3MgewogICAgICBhc3luYyBleGVjdXRlKGNvbnRleHQyKSB7CiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb250ZXh0Mi5mZXRjaEZuKGNvbnRleHQyLnJlcXVlc3QpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICByZXNwb25zZSwKICAgICAgICAgIGZyb21DYWNoZTogZmFsc2UsCiAgICAgICAgICByZXZhbGlkYXRlZDogZmFsc2UKICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgQ2FjaGVPbmx5U3RyYXRlZ3kgPSBjbGFzcyB7CiAgICAgIGFzeW5jIGV4ZWN1dGUoY29udGV4dDIpIHsKICAgICAgICBjb25zdCBjYWNoZWRFbnRyeSA9IGF3YWl0IGNvbnRleHQyLmNhY2hlU3RvcmUuZ2V0KGNvbnRleHQyLmNhY2hlS2V5KTsKICAgICAgICBpZiAoIWNhY2hlZEVudHJ5KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhY2hlIG1pc3MgZm9yICR7Y29udGV4dDIucmVxdWVzdC51cmx9IChjYWNoZS1vbmx5IG1vZGUpYCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICByZXNwb25zZTogY29udGV4dDIuY2FjaGVTdG9yZS5yZXNwb25zZUZyb21DYWNoZUVudHJ5KGNhY2hlZEVudHJ5KSwKICAgICAgICAgIGZyb21DYWNoZTogdHJ1ZSwKICAgICAgICAgIHJldmFsaWRhdGVkOiBmYWxzZQogICAgICAgIH07CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvY2FjaGUvY2FjaGUubWFuYWdlci5qcwp2YXIgQ2FjaGVNYW5hZ2VyOwp2YXIgaW5pdF9jYWNoZV9tYW5hZ2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2VicmVxdWVzdEA0LjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2VicmVxdWVzdC9kaXN0X3RzL2NhY2hlL2NhY2hlLm1hbmFnZXIuanMiKCkgewogICAgaW5pdF9jYWNoZV9zdG9yZSgpOwogICAgaW5pdF9jYWNoZV9zdHJhdGVnaWVzKCk7CiAgICBpbml0X2NhY2hlX2hlYWRlcnMoKTsKICAgIENhY2hlTWFuYWdlciA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoZGJOYW1lLCBzdG9yZU5hbWUpIHsKICAgICAgICB0aGlzLmNhY2hlU3RvcmUgPSBuZXcgQ2FjaGVTdG9yZShkYk5hbWUsIHN0b3JlTmFtZSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEV4ZWN1dGUgYSByZXF1ZXN0IHdpdGggY2FjaGluZwogICAgICAgKi8KICAgICAgYXN5bmMgZXhlY3V0ZShyZXF1ZXN0LCBvcHRpb25zLCBmZXRjaEZuKSB7CiAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLmRldGVybWluZVN0cmF0ZWd5KHJlcXVlc3QsIG9wdGlvbnMpOwogICAgICAgIGlmIChzdHJhdGVneSA9PT0gIm5ldHdvcmstb25seSIpIHsKICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hGbihyZXF1ZXN0KTsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHJlc3BvbnNlLAogICAgICAgICAgICBmcm9tQ2FjaGU6IGZhbHNlLAogICAgICAgICAgICByZXZhbGlkYXRlZDogZmFsc2UKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gdGhpcy5nZW5lcmF0ZUNhY2hlS2V5KHJlcXVlc3QsIG9wdGlvbnMpOwogICAgICAgIGNvbnN0IGhhbmRsZXIyID0gZ2V0U3RyYXRlZ3lIYW5kbGVyKHN0cmF0ZWd5KTsKICAgICAgICBjb25zdCBjb250ZXh0MiA9IHsKICAgICAgICAgIHJlcXVlc3QsCiAgICAgICAgICBjYWNoZUtleSwKICAgICAgICAgIGNhY2hlU3RvcmU6IHRoaXMuY2FjaGVTdG9yZSwKICAgICAgICAgIGZldGNoRm4sCiAgICAgICAgICBsb2dnaW5nOiBvcHRpb25zLmxvZ2dpbmcKICAgICAgICB9OwogICAgICAgIHJldHVybiBhd2FpdCBoYW5kbGVyMi5leGVjdXRlKGNvbnRleHQyKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogRGV0ZXJtaW5lIHRoZSBjYWNoaW5nIHN0cmF0ZWd5IGJhc2VkIG9uIG9wdGlvbnMgYW5kIHJlcXVlc3QKICAgICAgICovCiAgICAgIGRldGVybWluZVN0cmF0ZWd5KHJlcXVlc3QsIG9wdGlvbnMpIHsKICAgICAgICBpZiAob3B0aW9ucy5jYWNoZVN0cmF0ZWd5KSB7CiAgICAgICAgICByZXR1cm4gb3B0aW9ucy5jYWNoZVN0cmF0ZWd5OwogICAgICAgIH0KICAgICAgICBpZiAob3B0aW9ucy5jYWNoZSkgewogICAgICAgICAgcmV0dXJuIHRoaXMubWFwQ2FjaGVNb2RlVG9TdHJhdGVneShvcHRpb25zLmNhY2hlKTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlcXVlc3QuY2FjaGUpIHsKICAgICAgICAgIHJldHVybiB0aGlzLm1hcENhY2hlTW9kZVRvU3RyYXRlZ3kocmVxdWVzdC5jYWNoZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAibmV0d29yay1maXJzdCI7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIE1hcCBzdGFuZGFyZCBmZXRjaCBjYWNoZSBtb2RlcyB0byBvdXIgc3RyYXRlZ2llcwogICAgICAgKi8KICAgICAgbWFwQ2FjaGVNb2RlVG9TdHJhdGVneShjYWNoZU1vZGUpIHsKICAgICAgICBzd2l0Y2ggKGNhY2hlTW9kZSkgewogICAgICAgICAgY2FzZSAiZGVmYXVsdCI6CiAgICAgICAgICAgIHJldHVybiAibmV0d29yay1maXJzdCI7CiAgICAgICAgICBjYXNlICJuby1zdG9yZSI6CiAgICAgICAgICBjYXNlICJyZWxvYWQiOgogICAgICAgICAgICByZXR1cm4gIm5ldHdvcmstb25seSI7CiAgICAgICAgICBjYXNlICJuby1jYWNoZSI6CiAgICAgICAgICAgIHJldHVybiAibmV0d29yay1maXJzdCI7CiAgICAgICAgICAvLyBXaWxsIHVzZSByZXZhbGlkYXRpb24KICAgICAgICAgIGNhc2UgImZvcmNlLWNhY2hlIjoKICAgICAgICAgICAgcmV0dXJuICJjYWNoZS1maXJzdCI7CiAgICAgICAgICBjYXNlICJvbmx5LWlmLWNhY2hlZCI6CiAgICAgICAgICAgIHJldHVybiAiY2FjaGUtb25seSI7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gIm5ldHdvcmstZmlyc3QiOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogR2VuZXJhdGUgY2FjaGUga2V5CiAgICAgICAqLwogICAgICBnZW5lcmF0ZUNhY2hlS2V5KHJlcXVlc3QsIG9wdGlvbnMpIHsKICAgICAgICBpZiAob3B0aW9ucy5jYWNoZUtleSkgewogICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmNhY2hlS2V5ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmNhY2hlS2V5KHJlcXVlc3QpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG9wdGlvbnMuY2FjaGVLZXk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmNhY2hlU3RvcmUuZ2VuZXJhdGVDYWNoZUtleShyZXF1ZXN0KTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQ2xlYXIgdGhlIGNhY2hlCiAgICAgICAqLwogICAgICBhc3luYyBjbGVhcigpIHsKICAgICAgICBhd2FpdCB0aGlzLmNhY2hlU3RvcmUuY2xlYXIoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogRGVsZXRlIGEgc3BlY2lmaWMgY2FjaGUgZW50cnkKICAgICAgICovCiAgICAgIGFzeW5jIGRlbGV0ZShjYWNoZUtleSkgewogICAgICAgIGF3YWl0IHRoaXMuY2FjaGVTdG9yZS5kZWxldGUoY2FjaGVLZXkpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDaGVjayBpZiBhIGNhY2hlIGVudHJ5IGV4aXN0cwogICAgICAgKi8KICAgICAgYXN5bmMgaGFzKGNhY2hlS2V5KSB7CiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FjaGVTdG9yZS5oYXMoY2FjaGVLZXkpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgY2FjaGUgc3RvcmUKICAgICAgICovCiAgICAgIGdldFN0b3JlKCkgewogICAgICAgIHJldHVybiB0aGlzLmNhY2hlU3RvcmU7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvcmV0cnkvcmV0cnkuc3RyYXRlZ2llcy5qcwpmdW5jdGlvbiBnZXRCYWNrb2ZmQ2FsY3VsYXRvcihzdHJhdGVneSkgewogIHN3aXRjaCAoc3RyYXRlZ3kpIHsKICAgIGNhc2UgImV4cG9uZW50aWFsIjoKICAgICAgcmV0dXJuIG5ldyBFeHBvbmVudGlhbEJhY2tvZmYoKTsKICAgIGNhc2UgImxpbmVhciI6CiAgICAgIHJldHVybiBuZXcgTGluZWFyQmFja29mZigpOwogICAgY2FzZSAiY29uc3RhbnQiOgogICAgICByZXR1cm4gbmV3IENvbnN0YW50QmFja29mZigpOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIG5ldyBFeHBvbmVudGlhbEJhY2tvZmYoKTsKICB9Cn0KZnVuY3Rpb24gYWRkSml0dGVyKGRlbGF5Miwgaml0dGVyRmFjdG9yID0gMC4xKSB7CiAgY29uc3Qgaml0dGVyID0gZGVsYXkyICogaml0dGVyRmFjdG9yICogTWF0aC5yYW5kb20oKTsKICByZXR1cm4gZGVsYXkyICsgaml0dGVyOwp9CnZhciBFeHBvbmVudGlhbEJhY2tvZmYsIExpbmVhckJhY2tvZmYsIENvbnN0YW50QmFja29mZjsKdmFyIGluaXRfcmV0cnlfc3RyYXRlZ2llcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnJlcXVlc3RANC4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnJlcXVlc3QvZGlzdF90cy9yZXRyeS9yZXRyeS5zdHJhdGVnaWVzLmpzIigpIHsKICAgIEV4cG9uZW50aWFsQmFja29mZiA9IGNsYXNzIHsKICAgICAgY2FsY3VsYXRlKGF0dGVtcHQsIGluaXRpYWxEZWxheSwgbWF4RGVsYXkpIHsKICAgICAgICBjb25zdCBkZWxheTIgPSBpbml0aWFsRGVsYXkgKiBNYXRoLnBvdygyLCBhdHRlbXB0IC0gMSk7CiAgICAgICAgcmV0dXJuIE1hdGgubWluKGRlbGF5MiwgbWF4RGVsYXkpOwogICAgICB9CiAgICB9OwogICAgTGluZWFyQmFja29mZiA9IGNsYXNzIHsKICAgICAgY2FsY3VsYXRlKGF0dGVtcHQsIGluaXRpYWxEZWxheSwgbWF4RGVsYXkpIHsKICAgICAgICBjb25zdCBkZWxheTIgPSBpbml0aWFsRGVsYXkgKiBhdHRlbXB0OwogICAgICAgIHJldHVybiBNYXRoLm1pbihkZWxheTIsIG1heERlbGF5KTsKICAgICAgfQogICAgfTsKICAgIENvbnN0YW50QmFja29mZiA9IGNsYXNzIHsKICAgICAgY2FsY3VsYXRlKGF0dGVtcHQsIGluaXRpYWxEZWxheSwgbWF4RGVsYXkpIHsKICAgICAgICByZXR1cm4gTWF0aC5taW4oaW5pdGlhbERlbGF5LCBtYXhEZWxheSk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvcmV0cnkvcmV0cnkubWFuYWdlci5qcwp2YXIgUmV0cnlNYW5hZ2VyOwp2YXIgaW5pdF9yZXRyeV9tYW5hZ2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2VicmVxdWVzdEA0LjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2VicmVxdWVzdC9kaXN0X3RzL3JldHJ5L3JldHJ5Lm1hbmFnZXIuanMiKCkgewogICAgaW5pdF93ZWJyZXF1ZXN0X3BsdWdpbnMoKTsKICAgIGluaXRfcmV0cnlfc3RyYXRlZ2llcygpOwogICAgUmV0cnlNYW5hZ2VyID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHsKICAgICAgICB0aGlzLm9wdGlvbnMgPSB7CiAgICAgICAgICBtYXhBdHRlbXB0czogb3B0aW9ucy5tYXhBdHRlbXB0cyA/PyAzLAogICAgICAgICAgYmFja29mZjogb3B0aW9ucy5iYWNrb2ZmID8/ICJleHBvbmVudGlhbCIsCiAgICAgICAgICBpbml0aWFsRGVsYXk6IG9wdGlvbnMuaW5pdGlhbERlbGF5ID8/IDFlMywKICAgICAgICAgIG1heERlbGF5OiBvcHRpb25zLm1heERlbGF5ID8/IDNlNCwKICAgICAgICAgIHJldHJ5T246IG9wdGlvbnMucmV0cnlPbiA/PyBbNDA4LCA0MjksIDUwMCwgNTAyLCA1MDMsIDUwNF0sCiAgICAgICAgICBvblJldHJ5OiBvcHRpb25zLm9uUmV0cnkgPz8gKCgpID0+IHsKICAgICAgICAgIH0pCiAgICAgICAgfTsKICAgICAgfQogICAgICAvKioKICAgICAgICogRXhlY3V0ZSBhIHJlcXVlc3Qgd2l0aCByZXRyeSBsb2dpYwogICAgICAgKi8KICAgICAgYXN5bmMgZXhlY3V0ZShleGVjdXRlRm4sIHNob3VsZFJldHJ5Rm4pIHsKICAgICAgICBsZXQgbGFzdEVycm9yOwogICAgICAgIGxldCBsYXN0UmVzcG9uc2U7CiAgICAgICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gdGhpcy5vcHRpb25zLm1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVGbigpOwogICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVzcG9uc2UpIHsKICAgICAgICAgICAgICBpZiAodGhpcy5zaG91bGRSZXRyeVJlc3BvbnNlKHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgIGxhc3RSZXNwb25zZSA9IHJlc3VsdDsKICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0ID09PSB0aGlzLm9wdGlvbnMubWF4QXR0ZW1wdHMpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGRlbGF5MiA9IHRoaXMuY2FsY3VsYXRlRGVsYXkoYXR0ZW1wdCk7CiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMub25SZXRyeShhdHRlbXB0LCBuZXcgRXJyb3IoYEhUVFAgJHtyZXN1bHQuc3RhdHVzfWApLCBkZWxheTIpOwogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxheShkZWxheTIpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7CiAgICAgICAgICAgIGNvbnN0IHNob3VsZFJldHJ5ID0gc2hvdWxkUmV0cnlGbiA/IHNob3VsZFJldHJ5Rm4oZXJyb3IsIGF0dGVtcHQpIDogdGhpcy5zaG91bGRSZXRyeUVycm9yKGVycm9yKTsKICAgICAgICAgICAgaWYgKGF0dGVtcHQgPT09IHRoaXMub3B0aW9ucy5tYXhBdHRlbXB0cyB8fCAhc2hvdWxkUmV0cnkpIHsKICAgICAgICAgICAgICB0aHJvdyBsYXN0RXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgZGVsYXkyID0gdGhpcy5jYWxjdWxhdGVEZWxheShhdHRlbXB0KTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9uUmV0cnkoYXR0ZW1wdCwgbGFzdEVycm9yLCBkZWxheTIpOwogICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGF5KGRlbGF5Mik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRocm93IGxhc3RFcnJvciB8fCBuZXcgRXJyb3IoIk1heCByZXRyeSBhdHRlbXB0cyByZWFjaGVkIik7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEV4ZWN1dGUgd2l0aCBtdWx0aXBsZSBmYWxsYmFjayBVUkxzCiAgICAgICAqLwogICAgICBhc3luYyBleGVjdXRlV2l0aEZhbGxiYWNrcyh1cmxzLCByZXF1ZXN0SW5pdCwgZmV0Y2hGbikgewogICAgICAgIGlmICh1cmxzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJObyBVUkxzIHByb3ZpZGVkIGZvciBmYWxsYmFjayBleGVjdXRpb24iKTsKICAgICAgICB9CiAgICAgICAgbGV0IGxhc3RFcnJvcjsKICAgICAgICBjb25zdCBmYWlsZWRVcmxzID0gW107CiAgICAgICAgZm9yIChjb25zdCB1cmwgb2YgdXJscykgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmV4ZWN1dGUoYXN5bmMgKCkgPT4gewogICAgICAgICAgICAgIHJldHVybiBhd2FpdCBmZXRjaEZuKHVybCwgcmVxdWVzdEluaXQpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA8IDQwMCkgewogICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID49IDQwMCAmJiByZXNwb25zZS5zdGF0dXMgPCA1MDAgJiYgcmVzcG9uc2Uuc3RhdHVzICE9PSA0MDgpIHsKICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmFpbGVkVXJscy5wdXNoKHVybCk7CiAgICAgICAgICAgIGxhc3RFcnJvciA9IG5ldyBFcnJvcihgUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtyZXNwb25zZS5zdGF0dXN9YCk7CiAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBmYWlsZWRVcmxzLnB1c2godXJsKTsKICAgICAgICAgICAgbGFzdEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFsbCBVUkxzIGZhaWxlZDogJHtmYWlsZWRVcmxzLmpvaW4oIiwgIil9LiBMYXN0IGVycm9yOiAke2xhc3RFcnJvcj8ubWVzc2FnZSB8fCAiVW5rbm93biBlcnJvciJ9YCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENoZWNrIGlmIHdlIHNob3VsZCByZXRyeSBiYXNlZCBvbiByZXNwb25zZSBzdGF0dXMKICAgICAgICovCiAgICAgIHNob3VsZFJldHJ5UmVzcG9uc2UocmVzcG9uc2UpIHsKICAgICAgICBjb25zdCByZXRyeU9uID0gdGhpcy5vcHRpb25zLnJldHJ5T247CiAgICAgICAgaWYgKHR5cGVvZiByZXRyeU9uID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICByZXR1cm4gcmV0cnlPbihyZXNwb25zZSk7CiAgICAgICAgfQogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJldHJ5T24pKSB7CiAgICAgICAgICByZXR1cm4gcmV0cnlPbi5pbmNsdWRlcyhyZXNwb25zZS5zdGF0dXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENoZWNrIGlmIHdlIHNob3VsZCByZXRyeSBiYXNlZCBvbiBlcnJvcgogICAgICAgKi8KICAgICAgc2hvdWxkUmV0cnlFcnJvcihlcnJvcikgewogICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCJmZXRjaCIpKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICJBYm9ydEVycm9yIiB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCJ0aW1lb3V0IikpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCByZXRyeU9uID0gdGhpcy5vcHRpb25zLnJldHJ5T247CiAgICAgICAgaWYgKHR5cGVvZiByZXRyeU9uID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICByZXR1cm4gcmV0cnlPbih2b2lkIDAsIGVycm9yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDYWxjdWxhdGUgZGVsYXkgZm9yIG5leHQgcmV0cnkKICAgICAgICovCiAgICAgIGNhbGN1bGF0ZURlbGF5KGF0dGVtcHQpIHsKICAgICAgICBjb25zdCBjYWxjdWxhdG9yID0gZ2V0QmFja29mZkNhbGN1bGF0b3IodGhpcy5vcHRpb25zLmJhY2tvZmYpOwogICAgICAgIGNvbnN0IGJhc2VEZWxheSA9IGNhbGN1bGF0b3IuY2FsY3VsYXRlKGF0dGVtcHQsIHRoaXMub3B0aW9ucy5pbml0aWFsRGVsYXksIHRoaXMub3B0aW9ucy5tYXhEZWxheSk7CiAgICAgICAgcmV0dXJuIGFkZEppdHRlcihiYXNlRGVsYXkpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBEZWxheSBleGVjdXRpb24KICAgICAgICovCiAgICAgIGFzeW5jIGRlbGF5KG1zKSB7CiAgICAgICAgYXdhaXQgZGlzdF90c19leHBvcnRzMy5kZWxheUZvcihtcyk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvdXRpbHMvZGVkdXBsaWNhdG9yLmpzCnZhciBSZXF1ZXN0RGVkdXBsaWNhdG9yOwp2YXIgaW5pdF9kZWR1cGxpY2F0b3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvdXRpbHMvZGVkdXBsaWNhdG9yLmpzIigpIHsKICAgIGluaXRfd2VicmVxdWVzdF9wbHVnaW5zKCk7CiAgICBSZXF1ZXN0RGVkdXBsaWNhdG9yID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLmluRmxpZ2h0UmVxdWVzdHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBHZW5lcmF0ZSBhIGRlZHVwbGljYXRpb24ga2V5IGZyb20gYSByZXF1ZXN0CiAgICAgICAqLwogICAgICBnZW5lcmF0ZUtleShyZXF1ZXN0KSB7CiAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7CiAgICAgICAgY29uc3QgbWV0aG9kID0gcmVxdWVzdC5tZXRob2Q7CiAgICAgICAgaWYgKG1ldGhvZCA9PT0gIkdFVCIgfHwgbWV0aG9kID09PSAiSEVBRCIpIHsKICAgICAgICAgIHJldHVybiBgJHttZXRob2R9OiR7dXJsfWA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBgJHttZXRob2R9OiR7dXJsfToke0RhdGUubm93KCl9YDsKICAgICAgfQogICAgICAvKioKICAgICAgICogRXhlY3V0ZSBhIHJlcXVlc3Qgd2l0aCBkZWR1cGxpY2F0aW9uCiAgICAgICAqLwogICAgICBhc3luYyBleGVjdXRlKGtleTIsIGV4ZWN1dGVGbikgewogICAgICAgIGNvbnN0IGV4aXN0aW5nRGVmZXJyZWQgPSB0aGlzLmluRmxpZ2h0UmVxdWVzdHMuZ2V0KGtleTIpOwogICAgICAgIGlmIChleGlzdGluZ0RlZmVycmVkKSB7CiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGV4aXN0aW5nRGVmZXJyZWQucHJvbWlzZTsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHJlc3BvbnNlOiByZXNwb25zZS5jbG9uZSgpLAogICAgICAgICAgICB3YXNEZWR1cGxpY2F0ZWQ6IHRydWUKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGNvbnN0IGRlZmVycmVkMiA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgICAgIHRoaXMuaW5GbGlnaHRSZXF1ZXN0cy5zZXQoa2V5MiwgZGVmZXJyZWQyKTsKICAgICAgICB0cnkgewogICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBleGVjdXRlRm4oKTsKICAgICAgICAgIGRlZmVycmVkMi5yZXNvbHZlKHJlc3BvbnNlKTsKICAgICAgICAgIHRoaXMuaW5GbGlnaHRSZXF1ZXN0cy5kZWxldGUoa2V5Mik7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICByZXNwb25zZSwKICAgICAgICAgICAgd2FzRGVkdXBsaWNhdGVkOiBmYWxzZQogICAgICAgICAgfTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgZGVmZXJyZWQyLnJlamVjdChlcnJvcik7CiAgICAgICAgICB0aGlzLmluRmxpZ2h0UmVxdWVzdHMuZGVsZXRlKGtleTIpOwogICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDaGVjayBpZiBhIHJlcXVlc3QgaXMgY3VycmVudGx5IGluIGZsaWdodAogICAgICAgKi8KICAgICAgaXNJbkZsaWdodChrZXkyKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5GbGlnaHRSZXF1ZXN0cy5oYXMoa2V5Mik7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIGluLWZsaWdodCByZXF1ZXN0cwogICAgICAgKi8KICAgICAgZ2V0SW5GbGlnaHRDb3VudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbkZsaWdodFJlcXVlc3RzLnNpemU7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENsZWFyIGFsbCBpbi1mbGlnaHQgcmVxdWVzdHMKICAgICAgICovCiAgICAgIGNsZWFyKCkgewogICAgICAgIHRoaXMuaW5GbGlnaHRSZXF1ZXN0cy5jbGVhcigpOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2VicmVxdWVzdEA0LjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2VicmVxdWVzdC9kaXN0X3RzL3V0aWxzL3RpbWVvdXQuanMKZnVuY3Rpb24gY3JlYXRlVGltZW91dENvbnRyb2xsZXIodGltZW91dE1zKSB7CiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKICBjb25zdCB0aW1lb3V0MiA9IG5ldyBkaXN0X3RzX2V4cG9ydHMzLlRpbWVvdXQodGltZW91dE1zLCBudWxsKTsKICB0aW1lb3V0Mi5wcm9taXNlLnRoZW4oKCkgPT4gewogICAgY29udHJvbGxlci5hYm9ydCgpOwogIH0pOwogIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7CiAgICB0aW1lb3V0Mi5jYW5jZWwoKTsKICB9OwogIHJldHVybiB7IGNvbnRyb2xsZXIsIGNsZWFudXAgfTsKfQphc3luYyBmdW5jdGlvbiBmZXRjaFdpdGhUaW1lb3V0KHVybCwgaW5pdCwgdGltZW91dE1zKSB7CiAgY29uc3QgeyBjb250cm9sbGVyLCBjbGVhbnVwIH0gPSBjcmVhdGVUaW1lb3V0Q29udHJvbGxlcih0aW1lb3V0TXMpOwogIHRyeSB7CiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgewogICAgICAuLi5pbml0LAogICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsCiAgICB9KTsKICAgIGNsZWFudXAoKTsKICAgIHJldHVybiByZXNwb25zZTsKICB9IGNhdGNoIChlcnJvcikgewogICAgY2xlYW51cCgpOwogICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gIkFib3J0RXJyb3IiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWVzdCB0aW1lb3V0IGFmdGVyICR7dGltZW91dE1zfW1zOiAke3VybH1gKTsKICAgIH0KICAgIHRocm93IGVycm9yOwogIH0KfQp2YXIgaW5pdF90aW1lb3V0MiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnJlcXVlc3RANC4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnJlcXVlc3QvZGlzdF90cy91dGlscy90aW1lb3V0LmpzIigpIHsKICAgIGluaXRfd2VicmVxdWVzdF9wbHVnaW5zKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvd2VicmVxdWVzdC5jbGllbnQuanMKdmFyIFdlYnJlcXVlc3RDbGllbnQ7CnZhciBpbml0X3dlYnJlcXVlc3RfY2xpZW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2VicmVxdWVzdEA0LjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2VicmVxdWVzdC9kaXN0X3RzL3dlYnJlcXVlc3QuY2xpZW50LmpzIigpIHsKICAgIGluaXRfaW50ZXJjZXB0b3JfbWFuYWdlcigpOwogICAgaW5pdF9jYWNoZV9tYW5hZ2VyKCk7CiAgICBpbml0X3JldHJ5X21hbmFnZXIoKTsKICAgIGluaXRfZGVkdXBsaWNhdG9yKCk7CiAgICBpbml0X3RpbWVvdXQyKCk7CiAgICBXZWJyZXF1ZXN0Q2xpZW50ID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHsKICAgICAgICB0aGlzLmRlZmF1bHRPcHRpb25zID0gb3B0aW9uczsKICAgICAgICB0aGlzLmludGVyY2VwdG9yTWFuYWdlciA9IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKTsKICAgICAgICB0aGlzLmNhY2hlTWFuYWdlciA9IG5ldyBDYWNoZU1hbmFnZXIoKTsKICAgICAgICB0aGlzLmRlZHVwbGljYXRvciA9IG5ldyBSZXF1ZXN0RGVkdXBsaWNhdG9yKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEFkZCBhIGdsb2JhbCByZXF1ZXN0IGludGVyY2VwdG9yCiAgICAgICAqLwogICAgICBhZGRSZXF1ZXN0SW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpIHsKICAgICAgICB0aGlzLmludGVyY2VwdG9yTWFuYWdlci5hZGRSZXF1ZXN0SW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBBZGQgYSBnbG9iYWwgcmVzcG9uc2UgaW50ZXJjZXB0b3IKICAgICAgICovCiAgICAgIGFkZFJlc3BvbnNlSW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpIHsKICAgICAgICB0aGlzLmludGVyY2VwdG9yTWFuYWdlci5hZGRSZXNwb25zZUludGVyY2VwdG9yKGludGVyY2VwdG9yKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQWRkIGEgZ2xvYmFsIGVycm9yIGludGVyY2VwdG9yCiAgICAgICAqLwogICAgICBhZGRFcnJvckludGVyY2VwdG9yKGludGVyY2VwdG9yKSB7CiAgICAgICAgdGhpcy5pbnRlcmNlcHRvck1hbmFnZXIuYWRkRXJyb3JJbnRlcmNlcHRvcihpbnRlcmNlcHRvcik7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJlbW92ZSBhIHJlcXVlc3QgaW50ZXJjZXB0b3IKICAgICAgICovCiAgICAgIHJlbW92ZVJlcXVlc3RJbnRlcmNlcHRvcihpbnRlcmNlcHRvcikgewogICAgICAgIHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLnJlbW92ZVJlcXVlc3RJbnRlcmNlcHRvcihpbnRlcmNlcHRvcik7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJlbW92ZSBhIHJlc3BvbnNlIGludGVyY2VwdG9yCiAgICAgICAqLwogICAgICByZW1vdmVSZXNwb25zZUludGVyY2VwdG9yKGludGVyY2VwdG9yKSB7CiAgICAgICAgdGhpcy5pbnRlcmNlcHRvck1hbmFnZXIucmVtb3ZlUmVzcG9uc2VJbnRlcmNlcHRvcihpbnRlcmNlcHRvcik7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJlbW92ZSBhbiBlcnJvciBpbnRlcmNlcHRvcgogICAgICAgKi8KICAgICAgcmVtb3ZlRXJyb3JJbnRlcmNlcHRvcihpbnRlcmNlcHRvcikgewogICAgICAgIHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLnJlbW92ZUVycm9ySW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDbGVhciBhbGwgaW50ZXJjZXB0b3JzCiAgICAgICAqLwogICAgICBjbGVhckludGVyY2VwdG9ycygpIHsKICAgICAgICB0aGlzLmludGVyY2VwdG9yTWFuYWdlci5jbGVhckFsbCgpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDbGVhciB0aGUgY2FjaGUKICAgICAgICovCiAgICAgIGFzeW5jIGNsZWFyQ2FjaGUoKSB7CiAgICAgICAgYXdhaXQgdGhpcy5jYWNoZU1hbmFnZXIuY2xlYXIoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogRXhlY3V0ZSBhIHJlcXVlc3Qgd2l0aCBhbGwgY29uZmlndXJlZCBmZWF0dXJlcwogICAgICAgKi8KICAgICAgYXN5bmMgcmVxdWVzdCh1cmwsIG9wdGlvbnMgPSB7fSkgewogICAgICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7CiAgICAgICAgICAuLi50aGlzLmRlZmF1bHRPcHRpb25zLAogICAgICAgICAgLi4ub3B0aW9ucwogICAgICAgIH07CiAgICAgICAgbGV0IHJlcXVlc3Q7CiAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCBtZXJnZWRPcHRpb25zKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVxdWVzdCA9IHVybDsKICAgICAgICB9CiAgICAgICAgcmVxdWVzdCA9IGF3YWl0IHRoaXMuaW50ZXJjZXB0b3JNYW5hZ2VyLnByb2Nlc3NSZXF1ZXN0KHJlcXVlc3QpOwogICAgICAgIGlmIChtZXJnZWRPcHRpb25zLmludGVyY2VwdG9ycz8ucmVxdWVzdCkgewogICAgICAgICAgZm9yIChjb25zdCBpbnRlcmNlcHRvciBvZiBtZXJnZWRPcHRpb25zLmludGVyY2VwdG9ycy5yZXF1ZXN0KSB7CiAgICAgICAgICAgIHJlcXVlc3QgPSBhd2FpdCBpbnRlcmNlcHRvcihyZXF1ZXN0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgZGVkdXBsaWNhdGUgPSBtZXJnZWRPcHRpb25zLmRlZHVwbGljYXRlID8/IGZhbHNlOwogICAgICAgIGlmIChkZWR1cGxpY2F0ZSkgewogICAgICAgICAgY29uc3QgZGVkdXBlS2V5ID0gdGhpcy5kZWR1cGxpY2F0b3IuZ2VuZXJhdGVLZXkocmVxdWVzdCk7CiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmRlZHVwbGljYXRvci5leGVjdXRlKGRlZHVwZUtleSwgYXN5bmMgKCkgPT4gewogICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlUmVxdWVzdChyZXF1ZXN0LCBtZXJnZWRPcHRpb25zKTsKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXNwb25zZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZVJlcXVlc3QocmVxdWVzdCwgbWVyZ2VkT3B0aW9ucyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEludGVybmFsIHJlcXVlc3QgZXhlY3V0aW9uIHdpdGggY2FjaGluZyBhbmQgcmV0cnkKICAgICAgICovCiAgICAgIGFzeW5jIGV4ZWN1dGVSZXF1ZXN0KHJlcXVlc3QsIG9wdGlvbnMpIHsKICAgICAgICB0cnkgewogICAgICAgICAgY29uc3QgcmV0cnlPcHRpb25zID0gdHlwZW9mIG9wdGlvbnMucmV0cnkgPT09ICJvYmplY3QiID8gb3B0aW9ucy5yZXRyeSA6IG9wdGlvbnMucmV0cnkgPyB7fSA6IHZvaWQgMDsKICAgICAgICAgIGNvbnN0IGZldGNoRm5Gb3JSZXF1ZXN0ID0gYXN5bmMgKHJlcSkgPT4gewogICAgICAgICAgICBjb25zdCB0aW1lb3V0MiA9IG9wdGlvbnMudGltZW91dCA/PyA2ZTQ7CiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmZXRjaFdpdGhUaW1lb3V0KHJlcS51cmwsIHsKICAgICAgICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsCiAgICAgICAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMsCiAgICAgICAgICAgICAgYm9keTogcmVxLmJvZHksCiAgICAgICAgICAgICAgLi4ub3B0aW9ucwogICAgICAgICAgICB9LCB0aW1lb3V0Mik7CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgZmV0Y2hGbkZvckZhbGxiYWNrcyA9IGFzeW5jICh1cmwsIGluaXQpID0+IHsKICAgICAgICAgICAgY29uc3QgdGltZW91dDIgPSBvcHRpb25zLnRpbWVvdXQgPz8gNmU0OwogICAgICAgICAgICByZXR1cm4gYXdhaXQgZmV0Y2hXaXRoVGltZW91dCh1cmwsIGluaXQsIHRpbWVvdXQyKTsKICAgICAgICAgIH07CiAgICAgICAgICBsZXQgcmVzcG9uc2U7CiAgICAgICAgICBpZiAocmV0cnlPcHRpb25zKSB7CiAgICAgICAgICAgIGNvbnN0IHJldHJ5TWFuYWdlciA9IG5ldyBSZXRyeU1hbmFnZXIocmV0cnlPcHRpb25zKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmFsbGJhY2tVcmxzICYmIG9wdGlvbnMuZmFsbGJhY2tVcmxzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICBjb25zdCBhbGxVcmxzID0gW3JlcXVlc3QudXJsLCAuLi5vcHRpb25zLmZhbGxiYWNrVXJsc107CiAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCByZXRyeU1hbmFnZXIuZXhlY3V0ZVdpdGhGYWxsYmFja3MoYWxsVXJscywgewogICAgICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycywKICAgICAgICAgICAgICAgIGJvZHk6IHJlcXVlc3QuYm9keSwKICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMKICAgICAgICAgICAgICB9LCBmZXRjaEZuRm9yRmFsbGJhY2tzKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHJldHJ5TWFuYWdlci5leGVjdXRlKGFzeW5jICgpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY2FjaGVNYW5hZ2VyLmV4ZWN1dGUocmVxdWVzdCwgb3B0aW9ucywgZmV0Y2hGbkZvclJlcXVlc3QpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXNwb25zZTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jYWNoZU1hbmFnZXIuZXhlY3V0ZShyZXF1ZXN0LCBvcHRpb25zLCBmZXRjaEZuRm9yUmVxdWVzdCk7CiAgICAgICAgICAgIHJlc3BvbnNlID0gcmVzdWx0LnJlc3BvbnNlOwogICAgICAgICAgfQogICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmludGVyY2VwdG9yTWFuYWdlci5wcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UpOwogICAgICAgICAgaWYgKG9wdGlvbnMuaW50ZXJjZXB0b3JzPy5yZXNwb25zZSkgewogICAgICAgICAgICBmb3IgKGNvbnN0IGludGVyY2VwdG9yIG9mIG9wdGlvbnMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBpbnRlcmNlcHRvcihyZXNwb25zZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXNwb25zZTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgY29uc3QgcHJvY2Vzc2VkRXJyb3IgPSBhd2FpdCB0aGlzLmludGVyY2VwdG9yTWFuYWdlci5wcm9jZXNzRXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKTsKICAgICAgICAgIHRocm93IHByb2Nlc3NlZEVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kOiBHRVQgcmVxdWVzdCByZXR1cm5pbmcgSlNPTgogICAgICAgKi8KICAgICAgYXN5bmMgZ2V0SnNvbih1cmwsIG9wdGlvbnMgPSB7fSkgewogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybCwgewogICAgICAgICAgLi4ub3B0aW9ucywKICAgICAgICAgIG1ldGhvZDogIkdFVCIsCiAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgIEFjY2VwdDogImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICAgICAuLi5vcHRpb25zLmhlYWRlcnMgfHwge30KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZDogUE9TVCByZXF1ZXN0IHdpdGggSlNPTiBib2R5CiAgICAgICAqLwogICAgICBhc3luYyBwb3N0SnNvbih1cmwsIGRhdGEsIG9wdGlvbnMgPSB7fSkgewogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybCwgewogICAgICAgICAgLi4ub3B0aW9ucywKICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICAgICBBY2NlcHQ6ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgICAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzIHx8IHt9CiAgICAgICAgICB9LAogICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSkKICAgICAgICB9KTsKICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZDogUFVUIHJlcXVlc3Qgd2l0aCBKU09OIGJvZHkKICAgICAgICovCiAgICAgIGFzeW5jIHB1dEpzb24odXJsLCBkYXRhLCBvcHRpb25zID0ge30pIHsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdCh1cmwsIHsKICAgICAgICAgIC4uLm9wdGlvbnMsCiAgICAgICAgICBtZXRob2Q6ICJQVVQiLAogICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICAgICBBY2NlcHQ6ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgICAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzIHx8IHt9CiAgICAgICAgICB9LAogICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSkKICAgICAgICB9KTsKICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZDogREVMRVRFIHJlcXVlc3QKICAgICAgICovCiAgICAgIGFzeW5jIGRlbGV0ZUpzb24odXJsLCBvcHRpb25zID0ge30pIHsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdCh1cmwsIHsKICAgICAgICAgIC4uLm9wdGlvbnMsCiAgICAgICAgICBtZXRob2Q6ICJERUxFVEUiLAogICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICBBY2NlcHQ6ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgICAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzIHx8IHt9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2VicmVxdWVzdEA0LjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2VicmVxdWVzdC9kaXN0X3RzL3dlYnJlcXVlc3QuZnVuY3Rpb24uanMKYXN5bmMgZnVuY3Rpb24gd2VicmVxdWVzdChpbnB1dCwgaW5pdCkgewogIGNvbnN0IHVybCA9IGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCA/IGlucHV0LnVybCA6IFN0cmluZyhpbnB1dCk7CiAgY29uc3QgcmVxdWVzdCA9IGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCA/IGlucHV0IDogbmV3IFJlcXVlc3QodXJsLCBpbml0KTsKICByZXR1cm4gYXdhaXQgZGVmYXVsdENsaWVudC5yZXF1ZXN0KHJlcXVlc3QsIGluaXQpOwp9CnZhciBkZWZhdWx0Q2xpZW50Owp2YXIgaW5pdF93ZWJyZXF1ZXN0X2Z1bmN0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2VicmVxdWVzdEA0LjAuNS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2VicmVxdWVzdC9kaXN0X3RzL3dlYnJlcXVlc3QuZnVuY3Rpb24uanMiKCkgewogICAgaW5pdF93ZWJyZXF1ZXN0X2NsaWVudCgpOwogICAgZGVmYXVsdENsaWVudCA9IG5ldyBXZWJyZXF1ZXN0Q2xpZW50KCk7CiAgICB3ZWJyZXF1ZXN0LmdldEpzb24gPSBhc3luYyBmdW5jdGlvbih1cmwsIG9wdGlvbnMpIHsKICAgICAgcmV0dXJuIGF3YWl0IGRlZmF1bHRDbGllbnQuZ2V0SnNvbih1cmwsIG9wdGlvbnMpOwogICAgfTsKICAgIHdlYnJlcXVlc3QucG9zdEpzb24gPSBhc3luYyBmdW5jdGlvbih1cmwsIGRhdGEsIG9wdGlvbnMpIHsKICAgICAgcmV0dXJuIGF3YWl0IGRlZmF1bHRDbGllbnQucG9zdEpzb24odXJsLCBkYXRhLCBvcHRpb25zKTsKICAgIH07CiAgICB3ZWJyZXF1ZXN0LnB1dEpzb24gPSBhc3luYyBmdW5jdGlvbih1cmwsIGRhdGEsIG9wdGlvbnMpIHsKICAgICAgcmV0dXJuIGF3YWl0IGRlZmF1bHRDbGllbnQucHV0SnNvbih1cmwsIGRhdGEsIG9wdGlvbnMpOwogICAgfTsKICAgIHdlYnJlcXVlc3QuZGVsZXRlSnNvbiA9IGFzeW5jIGZ1bmN0aW9uKHVybCwgb3B0aW9ucykgewogICAgICByZXR1cm4gYXdhaXQgZGVmYXVsdENsaWVudC5kZWxldGVKc29uKHVybCwgb3B0aW9ucyk7CiAgICB9OwogICAgd2VicmVxdWVzdC5hZGRSZXF1ZXN0SW50ZXJjZXB0b3IgPSBmdW5jdGlvbihpbnRlcmNlcHRvcikgewogICAgICBkZWZhdWx0Q2xpZW50LmFkZFJlcXVlc3RJbnRlcmNlcHRvcihpbnRlcmNlcHRvcik7CiAgICB9OwogICAgd2VicmVxdWVzdC5hZGRSZXNwb25zZUludGVyY2VwdG9yID0gZnVuY3Rpb24oaW50ZXJjZXB0b3IpIHsKICAgICAgZGVmYXVsdENsaWVudC5hZGRSZXNwb25zZUludGVyY2VwdG9yKGludGVyY2VwdG9yKTsKICAgIH07CiAgICB3ZWJyZXF1ZXN0LmFkZEVycm9ySW50ZXJjZXB0b3IgPSBmdW5jdGlvbihpbnRlcmNlcHRvcikgewogICAgICBkZWZhdWx0Q2xpZW50LmFkZEVycm9ySW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpOwogICAgfTsKICAgIHdlYnJlcXVlc3QuY2xlYXJJbnRlcmNlcHRvcnMgPSBmdW5jdGlvbigpIHsKICAgICAgZGVmYXVsdENsaWVudC5jbGVhckludGVyY2VwdG9ycygpOwogICAgfTsKICAgIHdlYnJlcXVlc3QuY2xlYXJDYWNoZSA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICBhd2FpdCBkZWZhdWx0Q2xpZW50LmNsZWFyQ2FjaGUoKTsKICAgIH07CiAgICB3ZWJyZXF1ZXN0LmNyZWF0ZUNsaWVudCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgcmV0dXJuIG5ldyBXZWJyZXF1ZXN0Q2xpZW50KG9wdGlvbnMpOwogICAgfTsKICAgIHdlYnJlcXVlc3QuZ2V0RGVmYXVsdENsaWVudCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZGVmYXVsdENsaWVudDsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJyZXF1ZXN0QDQuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJyZXF1ZXN0L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czE4ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czE4LCB7CiAgQ2FjaGVNYW5hZ2VyOiAoKSA9PiBDYWNoZU1hbmFnZXIsCiAgQ2FjaGVTdG9yZTogKCkgPT4gQ2FjaGVTdG9yZSwKICBJbnRlcmNlcHRvck1hbmFnZXI6ICgpID0+IEludGVyY2VwdG9yTWFuYWdlciwKICBSZXF1ZXN0RGVkdXBsaWNhdG9yOiAoKSA9PiBSZXF1ZXN0RGVkdXBsaWNhdG9yLAogIFJldHJ5TWFuYWdlcjogKCkgPT4gUmV0cnlNYW5hZ2VyLAogIFdlYnJlcXVlc3RDbGllbnQ6ICgpID0+IFdlYnJlcXVlc3RDbGllbnQsCiAgY3JlYXRlQ29uZGl0aW9uYWxIZWFkZXJzOiAoKSA9PiBjcmVhdGVDb25kaXRpb25hbEhlYWRlcnMsCiAgZXh0cmFjdENhY2hlTWV0YWRhdGE6ICgpID0+IGV4dHJhY3RDYWNoZU1ldGFkYXRhLAogIGhlYWRlcnNUb09iamVjdDogKCkgPT4gaGVhZGVyc1RvT2JqZWN0LAogIGlzRnJlc2g6ICgpID0+IGlzRnJlc2gsCiAgb2JqZWN0VG9IZWFkZXJzOiAoKSA9PiBvYmplY3RUb0hlYWRlcnMsCiAgcmVxdWlyZXNSZXZhbGlkYXRpb246ICgpID0+IHJlcXVpcmVzUmV2YWxpZGF0aW9uLAogIHdlYnJlcXVlc3Q6ICgpID0+IHdlYnJlcXVlc3QKfSk7CnZhciBpbml0X2Rpc3RfdHMxOCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnJlcXVlc3RANC4wLjUvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnJlcXVlc3QvZGlzdF90cy9pbmRleC5qcyIoKSB7CiAgICBpbml0X3dlYnJlcXVlc3RfZnVuY3Rpb24oKTsKICAgIGluaXRfd2VicmVxdWVzdF9jbGllbnQoKTsKICAgIGluaXRfY2FjaGVfbWFuYWdlcigpOwogICAgaW5pdF9jYWNoZV9zdG9yZSgpOwogICAgaW5pdF9yZXRyeV9tYW5hZ2VyKCk7CiAgICBpbml0X2ludGVyY2VwdG9yX21hbmFnZXIoKTsKICAgIGluaXRfZGVkdXBsaWNhdG9yKCk7CiAgICBpbml0X2NhY2hlX2hlYWRlcnMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkcmVxdWVzdEAzLjMuMC9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRyZXF1ZXN0L2Rpc3RfdHMvcGx1Z2lucy5qcwp2YXIgaXNvdW5pcXVlMjsKdmFyIGluaXRfcGx1Z2lucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkcmVxdWVzdEAzLjMuMC9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRyZXF1ZXN0L2Rpc3RfdHMvcGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHM0KCk7CiAgICBpc291bmlxdWUyID0gX190b0VTTShyZXF1aXJlX2Rpc3RfdHMoKSwgMSk7CiAgICBpbml0X2Rpc3RfdHM5KCk7CiAgICBpbml0X2Rpc3RfdHMxMCgpOwogICAgaW5pdF9kaXN0X3RzMygpOwogICAgaW5pdF9kaXN0X3RzMTEoKTsKICAgIGluaXRfZGlzdF90cygpOwogICAgaW5pdF9kaXN0X3RzMTgoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkcmVxdWVzdEAzLjMuMC9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRyZXF1ZXN0L2Rpc3RfdHMvY2xhc3Nlcy50eXBlZHJlc3BvbnNlZXJyb3IuanMKdmFyIFR5cGVkUmVzcG9uc2VFcnJvcjsKdmFyIGluaXRfY2xhc3Nlc190eXBlZHJlc3BvbnNlZXJyb3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2NsYXNzZXMudHlwZWRyZXNwb25zZWVycm9yLmpzIigpIHsKICAgIGluaXRfcGx1Z2lucygpOwogICAgVHlwZWRSZXNwb25zZUVycm9yID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcihlcnJvclRleHRBcmcsIGVycm9yRGF0YUFyZykgewogICAgICAgIHRoaXMuZXJyb3JUZXh0ID0gZXJyb3JUZXh0QXJnOwogICAgICAgIHRoaXMuZXJyb3JEYXRhID0gZXJyb3JEYXRhQXJnOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGFwaS5nbG9iYWwrdHlwZWRyZXF1ZXN0QDMuMy4wL25vZGVfbW9kdWxlcy9AYXBpLmdsb2JhbC90eXBlZHJlcXVlc3QvZGlzdF90cy9jbGFzc2VzLnR5cGVkdG9vbHMuanMKdmFyIFR5cGVkVG9vbHM7CnZhciBpbml0X2NsYXNzZXNfdHlwZWR0b29scyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkcmVxdWVzdEAzLjMuMC9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRyZXF1ZXN0L2Rpc3RfdHMvY2xhc3Nlcy50eXBlZHRvb2xzLmpzIigpIHsKICAgIGluaXRfY2xhc3Nlc190eXBlZHJlc3BvbnNlZXJyb3IoKTsKICAgIGluaXRfcGx1Z2lucygpOwogICAgVHlwZWRUb29scyA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5sb2NhbERhdGEgPSB7fTsKICAgICAgfQogICAgICBhc3luYyBwYXNzR3VhcmRzKGd1YXJkc0FyZywgZGF0YUFyZykgewogICAgICAgIGNvbnN0IGd1YXJkU2V0ID0gbmV3IGRpc3RfdHNfZXhwb3J0czExLkd1YXJkU2V0KGd1YXJkc0FyZyk7CiAgICAgICAgY29uc3QgZ3VhcmRSZXN1bHQgPSBhd2FpdCBndWFyZFNldC5hbGxHdWFyZHNQYXNzKGRhdGFBcmcpOwogICAgICAgIGlmICghZ3VhcmRSZXN1bHQpIHsKICAgICAgICAgIGNvbnN0IGZhaWxlZEhpbnQgPSBhd2FpdCBndWFyZFNldC5nZXRGYWlsZWRIaW50KGRhdGFBcmcpOwogICAgICAgICAgdGhyb3cgbmV3IFR5cGVkUmVzcG9uc2VFcnJvcihgZ3VhcmQgZmFpbGVkOiAke2ZhaWxlZEhpbnR9YCwgeyBmYWlsZWRIaW50IH0pOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkcmVxdWVzdEAzLjMuMC9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRyZXF1ZXN0L2Rpc3RfdHMvY2xhc3Nlcy50eXBlZGhhbmRsZXIuanMKdmFyIFR5cGVkSGFuZGxlcjsKdmFyIGluaXRfY2xhc3Nlc190eXBlZGhhbmRsZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2NsYXNzZXMudHlwZWRoYW5kbGVyLmpzIigpIHsKICAgIGluaXRfcGx1Z2lucygpOwogICAgaW5pdF9jbGFzc2VzX3R5cGVkcmVzcG9uc2VlcnJvcigpOwogICAgaW5pdF9jbGFzc2VzX3R5cGVkdG9vbHMoKTsKICAgIFR5cGVkSGFuZGxlciA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IobWV0aG9kQXJnLCBoYW5kbGVyRnVuY3Rpb25BcmcpIHsKICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZEFyZzsKICAgICAgICB0aGlzLmhhbmRsZXJGdW5jdGlvbiA9IGhhbmRsZXJGdW5jdGlvbkFyZzsKICAgICAgfQogICAgICAvKioKICAgICAgICogYWRkcyBhIHJlc3BvbnNlIHRvIHRoZSB0eXBlZFJlcXVlc3QKICAgICAgICogQHBhcmFtIHR5cGVkUmVxdWVzdEFyZwogICAgICAgKi8KICAgICAgYXN5bmMgYWRkUmVzcG9uc2UodHlwZWRSZXF1ZXN0QXJnKSB7CiAgICAgICAgaWYgKHR5cGVkUmVxdWVzdEFyZy5tZXRob2QgIT09IHRoaXMubWV0aG9kKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInRoaXMgaGFuZGxlciBoYXMgYmVlbiBnaXZlbiBhIHdyb25nIG1ldGhvZCB0byBhbnN3ZXIgdG8uIFBsZWFzZSB1c2UgYSBUeXBlZFJvdXRlciB0byBmaWx0ZXIgcmVxdWVzdHMiKTsKICAgICAgICB9CiAgICAgICAgbGV0IHR5cGVkUmVzcG9uc2VFcnJvcjsKICAgICAgICBjb25zdCB0eXBlZHRvb2xzSW5zdGFuY2UgPSBuZXcgVHlwZWRUb29scygpOwogICAgICAgIGlmICh0eXBlZFJlcXVlc3RBcmcubG9jYWxEYXRhKSB7CiAgICAgICAgICB0eXBlZHRvb2xzSW5zdGFuY2UubG9jYWxEYXRhID0gdHlwZWRSZXF1ZXN0QXJnLmxvY2FsRGF0YTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmhhbmRsZXJGdW5jdGlvbih0eXBlZFJlcXVlc3RBcmcucmVxdWVzdCwgdHlwZWR0b29sc0luc3RhbmNlKS5jYXRjaCgoZTExKSA9PiB7CiAgICAgICAgICBpZiAoZTExIGluc3RhbmNlb2YgVHlwZWRSZXNwb25zZUVycm9yKSB7CiAgICAgICAgICAgIHR5cGVkUmVzcG9uc2VFcnJvciA9IGUxMTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUxMSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHR5cGVkUmVzcG9uc2VFcnJvcikgewogICAgICAgICAgdHlwZWRSZXF1ZXN0QXJnLmVycm9yID0gewogICAgICAgICAgICB0ZXh0OiB0eXBlZFJlc3BvbnNlRXJyb3IuZXJyb3JUZXh0LAogICAgICAgICAgICBkYXRhOiB0eXBlZFJlc3BvbnNlRXJyb3IuZXJyb3JEYXRhCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBpZiAocmVzcG9uc2UpIHsKICAgICAgICAgIHR5cGVkUmVxdWVzdEFyZy5yZXNwb25zZSA9IHJlc3BvbnNlOwogICAgICAgIH0KICAgICAgICB0eXBlZFJlcXVlc3RBcmc/LmNvcnJlbGF0aW9uPy5waGFzZSA/IHR5cGVkUmVxdWVzdEFyZy5jb3JyZWxhdGlvbi5waGFzZSA9ICJyZXNwb25zZSIgOiBudWxsOwogICAgICAgIHJldHVybiB0eXBlZFJlcXVlc3RBcmc7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2NsYXNzZXMudHlwZWRyb3V0ZXIuanMKdmFyIFR5cGVkUm91dGVyOwp2YXIgaW5pdF9jbGFzc2VzX3R5cGVkcm91dGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGFwaS5nbG9iYWwrdHlwZWRyZXF1ZXN0QDMuMy4wL25vZGVfbW9kdWxlcy9AYXBpLmdsb2JhbC90eXBlZHJlcXVlc3QvZGlzdF90cy9jbGFzc2VzLnR5cGVkcm91dGVyLmpzIigpIHsKICAgIGluaXRfcGx1Z2lucygpOwogICAgaW5pdF9jbGFzc2VzX3ZpcnR1YWxzdHJlYW0oKTsKICAgIGluaXRfY2xhc3Nlc190eXBlZGhhbmRsZXIoKTsKICAgIGluaXRfY2xhc3Nlc190eXBlZHJlcXVlc3QoKTsKICAgIGluaXRfY2xhc3Nlc190eXBlZHJlc3BvbnNlZXJyb3IoKTsKICAgIFR5cGVkUm91dGVyID0gY2xhc3MgX1R5cGVkUm91dGVyIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5ob29rcyA9IHt9OwogICAgICAgIHRoaXMucm91dGVyTWFwID0gbmV3IGRpc3RfdHNfZXhwb3J0czkuT2JqZWN0TWFwKCk7CiAgICAgICAgdGhpcy5oYW5kbGVyTWFwID0gbmV3IGRpc3RfdHNfZXhwb3J0czkuT2JqZWN0TWFwKCk7CiAgICAgICAgdGhpcy5yZWdpc3RlcmVkVmlydHVhbFN0cmVhbXMgPSBuZXcgZGlzdF90c19leHBvcnRzOS5PYmplY3RNYXAoKTsKICAgICAgICB0aGlzLm1pZGRsZXdhcmVzID0gW107CiAgICAgICAgdGhpcy5maXJlRXZlbnRJbnRlcmVzdE1hcCA9IG5ldyBkaXN0X3RzX2V4cG9ydHM5LkludGVyZXN0TWFwKChjb3JyZWxhdGlvbklkKSA9PiBjb3JyZWxhdGlvbklkKTsKICAgICAgfQogICAgICAvLyBVc2UgZ2xvYmFsVGhpcyBmb3IgY3Jvc3MtYnVuZGxlIGhvb2sgc2hhcmluZwogICAgICBzdGF0aWMgZ2V0IGdsb2JhbEhvb2tzKCkgewogICAgICAgIGlmICghZ2xvYmFsVGhpcy5fX3R5cGVkUm91dGVyR2xvYmFsSG9va3MpIHsKICAgICAgICAgIGdsb2JhbFRoaXMuX190eXBlZFJvdXRlckdsb2JhbEhvb2tzID0ge307CiAgICAgICAgfQogICAgICAgIHJldHVybiBnbG9iYWxUaGlzLl9fdHlwZWRSb3V0ZXJHbG9iYWxIb29rczsKICAgICAgfQogICAgICBzdGF0aWMgc2V0IGdsb2JhbEhvb2tzKHZhbHVlMikgewogICAgICAgIGdsb2JhbFRoaXMuX190eXBlZFJvdXRlckdsb2JhbEhvb2tzID0gdmFsdWUyOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBTZXQgZ2xvYmFsIGhvb2tzIGZvciBtb25pdG9yaW5nIGFsbCBUeXBlZFJlcXVlc3QgdHJhZmZpYwogICAgICAgKiBIb29rcyBhcmUgc2hhcmVkIGFjcm9zcyBhbGwgYnVuZGxlcyB2aWEgZ2xvYmFsVGhpcwogICAgICAgKi8KICAgICAgc3RhdGljIHNldEdsb2JhbEhvb2tzKGhvb2tzOCkgewogICAgICAgIGNvbnN0IGN1cnJlbnQgPSBfVHlwZWRSb3V0ZXIuZ2xvYmFsSG9va3M7CiAgICAgICAgX1R5cGVkUm91dGVyLmdsb2JhbEhvb2tzID0geyAuLi5jdXJyZW50LCAuLi5ob29rczggfTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQ2xlYXIgYWxsIGdsb2JhbCBob29rcwogICAgICAgKi8KICAgICAgc3RhdGljIGNsZWFyR2xvYmFsSG9va3MoKSB7CiAgICAgICAgZ2xvYmFsVGhpcy5fX3R5cGVkUm91dGVyR2xvYmFsSG9va3MgPSB7fTsKICAgICAgfQogICAgICAvKioKICAgICAgICogU2V0IGluc3RhbmNlLWxldmVsIGhvb2tzIGZvciBtb25pdG9yaW5nIHRyYWZmaWMgdGhyb3VnaCB0aGlzIHJvdXRlcgogICAgICAgKi8KICAgICAgc2V0SG9va3MoaG9va3M4KSB7CiAgICAgICAgdGhpcy5ob29rcyA9IHsgLi4udGhpcy5ob29rcywgLi4uaG9va3M4IH07CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEhlbHBlciB0byBjYWxsIGJvdGggZ2xvYmFsIGFuZCBpbnN0YW5jZSBob29rcwogICAgICAgKi8KICAgICAgY2FsbEhvb2soaG9va05hbWUsIGVudHJ5KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIF9UeXBlZFJvdXRlci5nbG9iYWxIb29rc1tob29rTmFtZV0/LihlbnRyeSk7CiAgICAgICAgICB0aGlzLmhvb2tzW2hvb2tOYW1lXT8uKGVudHJ5KTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFR5cGVkUm91dGVyIGhvb2sgZXJyb3IgKCR7aG9va05hbWV9KTpgLCBlcnIpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogQWRkcyBhIG1pZGRsZXdhcmUgZnVuY3Rpb24gdGhhdCBydW5zIGJlZm9yZSB0aGUgaGFuZGxlciBvbiB0aGlzIHJvdXRlci4KICAgICAgICogVGhyb3cgVHlwZWRSZXNwb25zZUVycm9yIHRvIHJlamVjdCB0aGUgcmVxdWVzdC4KICAgICAgICovCiAgICAgIGFkZE1pZGRsZXdhcmUoZm4pIHsKICAgICAgICB0aGlzLm1pZGRsZXdhcmVzLnB1c2goZm4pOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBhZGRzIHRoZSBoYW5kbGVyIHRvIHRoZSByb3V0aW5nIG1hcAogICAgICAgKiBAcGFyYW0gdHlwZWRIYW5kbGVyQXJnCiAgICAgICAqLwogICAgICBhZGRUeXBlZEhhbmRsZXIodHlwZWRIYW5kbGVyQXJnKSB7CiAgICAgICAgY29uc3QgZXhpc3RpbmdUeXBlZEhhbmRsZXIgPSB0aGlzLmdldFR5cGVkSGFuZGxlckZvck1ldGhvZCh0eXBlZEhhbmRsZXJBcmcubWV0aG9kKTsKICAgICAgICBpZiAoZXhpc3RpbmdUeXBlZEhhbmRsZXIpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgYSBUeXBlZEhhbmRsZXIgZm9yICR7dHlwZWRIYW5kbGVyQXJnLm1ldGhvZH0gYWxyZWR5IGV4aXN0cyEgQ2FuJ3QgYWRkIGFub3RoZXIgb25lLmApOwogICAgICAgIH0KICAgICAgICB0aGlzLmhhbmRsZXJNYXAuYWRkKHR5cGVkSGFuZGxlckFyZyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGFkZHMgYW5vdGhlciBzdWIgdHlwZWRSb3V0ZXIKICAgICAgICogQHBhcmFtIHR5cGVkUmVxdWVzdAogICAgICAgKi8KICAgICAgYWRkVHlwZWRSb3V0ZXIodHlwZWRSb3V0ZXJBcmcpIHsKICAgICAgICBjb25zdCByb3V0ZXJFeGlzdHMgPSB0aGlzLnJvdXRlck1hcC5maW5kU3luYygocm91dGVyQXJnKSA9PiByb3V0ZXJBcmcgPT09IHR5cGVkUm91dGVyQXJnKTsKICAgICAgICBpZiAoIXJvdXRlckV4aXN0cykgewogICAgICAgICAgdGhpcy5yb3V0ZXJNYXAuYWRkKHR5cGVkUm91dGVyQXJnKTsKICAgICAgICAgIHR5cGVkUm91dGVyQXJnLmFkZFR5cGVkUm91dGVyKHRoaXMpOwogICAgICAgIH0KICAgICAgfQogICAgICBjaGVja0ZvclR5cGVkSGFuZGxlcihtZXRob2RBcmcpIHsKICAgICAgICByZXR1cm4gISF0aGlzLmdldFR5cGVkSGFuZGxlckZvck1ldGhvZChtZXRob2RBcmcpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBnZXRzIGEgdHlwZWQgUm91dGVyIGZyb20gdGhlIHJvdXRlciBjaGFpbiwgdXBzdHJlYW0gYW5kIGRvd25zdHJlYW0KICAgICAgICogQHBhcmFtIG1ldGhvZEFyZwogICAgICAgKiBAcGFyYW0gY2hlY2tVcHN0cmVhbVJvdXRlcgogICAgICAgKi8KICAgICAgZ2V0VHlwZWRIYW5kbGVyRm9yTWV0aG9kKG1ldGhvZEFyZywgY2hlY2tlZFJvdXRlcnMgPSBbXSkgewogICAgICAgIGNoZWNrZWRSb3V0ZXJzLnB1c2godGhpcyk7CiAgICAgICAgbGV0IHR5cGVkSGFuZGxlcjsKICAgICAgICB0eXBlZEhhbmRsZXIgPSB0aGlzLmhhbmRsZXJNYXAuZmluZFN5bmMoKGhhbmRsZXIyKSA9PiB7CiAgICAgICAgICByZXR1cm4gaGFuZGxlcjIubWV0aG9kID09PSBtZXRob2RBcmc7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKCF0eXBlZEhhbmRsZXIpIHsKICAgICAgICAgIHRoaXMucm91dGVyTWFwLmdldEFycmF5KCkuZm9yRWFjaCgodHlwZWRSb3V0ZXJBcmcpID0+IHsKICAgICAgICAgICAgaWYgKCF0eXBlZEhhbmRsZXIgJiYgIWNoZWNrZWRSb3V0ZXJzLmluY2x1ZGVzKHR5cGVkUm91dGVyQXJnKSkgewogICAgICAgICAgICAgIHR5cGVkSGFuZGxlciA9IHR5cGVkUm91dGVyQXJnLmdldFR5cGVkSGFuZGxlckZvck1ldGhvZChtZXRob2RBcmcsIGNoZWNrZWRSb3V0ZXJzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0eXBlZEhhbmRsZXI7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEZpbmRzIHRoZSBoYW5kbGVyIEFORCBpdHMgb3duaW5nIHJvdXRlciBmb3IgYSBnaXZlbiBtZXRob2QuCiAgICAgICAqIE5lZWRlZCB0byBrbm93IHdoaWNoIHJvdXRlcidzIG1pZGRsZXdhcmUgdG8gcnVuLgogICAgICAgKi8KICAgICAgZ2V0VHlwZWRIYW5kbGVyQW5kUm91dGVyKG1ldGhvZEFyZywgY2hlY2tlZFJvdXRlcnMgPSBbXSkgewogICAgICAgIGNoZWNrZWRSb3V0ZXJzLnB1c2godGhpcyk7CiAgICAgICAgY29uc3QgaGFuZGxlcjIgPSB0aGlzLmhhbmRsZXJNYXAuZmluZFN5bmMoKGg5KSA9PiBoOS5tZXRob2QgPT09IG1ldGhvZEFyZyk7CiAgICAgICAgaWYgKGhhbmRsZXIyKQogICAgICAgICAgcmV0dXJuIHsgaGFuZGxlcjogaGFuZGxlcjIsIHJvdXRlcjogdGhpcyB9OwogICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5yb3V0ZXJNYXAuZ2V0QXJyYXkoKSkgewogICAgICAgICAgaWYgKCFjaGVja2VkUm91dGVycy5pbmNsdWRlcyhjaGlsZCkpIHsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2hpbGQuZ2V0VHlwZWRIYW5kbGVyQW5kUm91dGVyKG1ldGhvZEFyZywgY2hlY2tlZFJvdXRlcnMpOwogICAgICAgICAgICBpZiAocmVzdWx0KQogICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHN0YXRpYyB7CiAgICAgICAgdGhpcy5kZWZhdWx0Um91dGVPcHRpb25zID0gewogICAgICAgICAgbG9jYWxSZXF1ZXN0OiBmYWxzZSwKICAgICAgICAgIHNraXBIb29rczogZmFsc2UKICAgICAgICB9OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBpZiB0eXBlZHJlcXVlc3Qgb2JqZWN0IGhhcyBjb3JyZWxhdGlvbi5waGFzZSA9PT0gJ3JlcXVlc3QnIC0+IHJvdXRlcyBhIHR5cGVkIHJlcXVlc3Qgb2JqZWN0IHRvIGEgaGFuZGxlcgogICAgICAgKiBpZiB0eXBlZHJlcXVlc3Qgb2JqZWN0IGhhcyBjb3JyZWxhdGlvbi5waGFzZSA9PT0gJ3Jlc3BvbnNlJyAtPiByb3V0ZXMgYSB0eXBlZCByZXF1ZXN0IG9iamVjdCB0byByZXF1ZXN0IGZpcmUgZXZlbnQKICAgICAgICogQHBhcmFtIHR5cGVkUmVxdWVzdEFyZwogICAgICAgKiBAcGFyYW0gb3B0aW9uc0FyZyAtIE9wdGlvbnMgb2JqZWN0IHdpdGg6CiAgICAgICAqICAgLSBsb2NhbFJlcXVlc3Q6IHRyZWF0IGFzIGxvY2FsIHJlcXVlc3QgKGRlZmF1bHQ6IGZhbHNlKQogICAgICAgKiAgIC0gc2tpcEhvb2tzOiBza2lwIGNhbGxpbmcgaG9va3MgZm9yIHRoaXMgcm91dGluZyAoZGVmYXVsdDogZmFsc2UsIHVzZSBmb3IgYnJvYWRjYXN0LXJlY2VpdmVkIG1lc3NhZ2VzKQogICAgICAgKi8KICAgICAgYXN5bmMgcm91dGVBbmRBZGRSZXNwb25zZSh0eXBlZFJlcXVlc3RBcmcsIG9wdGlvbnNBcmcgPSB7fSkgewogICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLl9UeXBlZFJvdXRlci5kZWZhdWx0Um91dGVPcHRpb25zLCAuLi5vcHRpb25zQXJnIH07CiAgICAgICAgdHlwZWRSZXF1ZXN0QXJnID0gVmlydHVhbFN0cmVhbS5kZWNvZGVQYXlsb2FkRnJvbU5ldHdvcmsodHlwZWRSZXF1ZXN0QXJnLCB7CiAgICAgICAgICB0eXBlZHJvdXRlcjogdGhpcwogICAgICAgIH0pOwogICAgICAgIHR5cGVkUmVxdWVzdEFyZy5sb2NhbERhdGEgPSB0eXBlZFJlcXVlc3RBcmcubG9jYWxEYXRhIHx8IHt9OwogICAgICAgIHR5cGVkUmVxdWVzdEFyZy5sb2NhbERhdGEuZmlyc3RUeXBlZHJvdXRlciA9IHRoaXM7CiAgICAgICAgaWYgKHR5cGVkUmVxdWVzdEFyZy5tZXRob2QgPT09ICIjI1ZpcnR1YWxTdHJlYW0jIyIpIHsKICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaGFuZGxlU3RyZWFtVHlwZWRSZXF1ZXN0KHR5cGVkUmVxdWVzdEFyZyk7CiAgICAgICAgICByZXN1bHQubG9jYWxEYXRhID0gbnVsbDsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlZFJlcXVlc3RBcmc/LmNvcnJlbGF0aW9uPy5waGFzZSA9PT0gInJlcXVlc3QiIHx8IG9wdGlvbnMubG9jYWxSZXF1ZXN0KSB7CiAgICAgICAgICBjb25zdCByZXF1ZXN0U3RhcnRUaW1lID0gRGF0ZS5ub3coKTsKICAgICAgICAgIGlmICghb3B0aW9ucy5za2lwSG9va3MpIHsKICAgICAgICAgICAgdGhpcy5jYWxsSG9vaygib25JbmNvbWluZ1JlcXVlc3QiLCB7CiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogdHlwZWRSZXF1ZXN0QXJnLmNvcnJlbGF0aW9uPy5pZCB8fCAidW5rbm93biIsCiAgICAgICAgICAgICAgbWV0aG9kOiB0eXBlZFJlcXVlc3RBcmcubWV0aG9kLAogICAgICAgICAgICAgIGRpcmVjdGlvbjogImluY29taW5nIiwKICAgICAgICAgICAgICBwaGFzZTogInJlcXVlc3QiLAogICAgICAgICAgICAgIHRpbWVzdGFtcDogcmVxdWVzdFN0YXJ0VGltZSwKICAgICAgICAgICAgICBwYXlsb2FkOiB0eXBlZFJlcXVlc3RBcmcucmVxdWVzdAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0VHlwZWRIYW5kbGVyQW5kUm91dGVyKHR5cGVkUmVxdWVzdEFyZy5tZXRob2QpOwogICAgICAgICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coYENhbm5vdCBmaW5kIGhhbmRsZXIgZm9yIG1ldGhvZG5hbWUgJHt0eXBlZFJlcXVlc3RBcmcubWV0aG9kfWApOwogICAgICAgICAgICB0eXBlZFJlcXVlc3RBcmcuZXJyb3IgPSB7CiAgICAgICAgICAgICAgdGV4dDogIlRoZXJlIGlzIG5vIGF2YWlsYWJsZSBtZXRob2QgZm9yIHRoaXMgY2FsbCBvbiB0aGUgc2VydmVyIHNpZGUiLAogICAgICAgICAgICAgIGRhdGE6IHt9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHR5cGVkUmVxdWVzdEFyZy5jb3JyZWxhdGlvbi5waGFzZSA9ICJyZXNwb25zZSI7CiAgICAgICAgICAgIHR5cGVkUmVxdWVzdEFyZy5sb2NhbERhdGEgPSBudWxsOwogICAgICAgICAgICB0eXBlZFJlcXVlc3RBcmcgPSBWaXJ0dWFsU3RyZWFtLmVuY29kZVBheWxvYWRGb3JOZXR3b3JrKHR5cGVkUmVxdWVzdEFyZywgewogICAgICAgICAgICAgIHR5cGVkcm91dGVyOiB0aGlzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAoIW9wdGlvbnMuc2tpcEhvb2tzKSB7CiAgICAgICAgICAgICAgdGhpcy5jYWxsSG9vaygib25PdXRnb2luZ1Jlc3BvbnNlIiwgewogICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogdHlwZWRSZXF1ZXN0QXJnLmNvcnJlbGF0aW9uPy5pZCB8fCAidW5rbm93biIsCiAgICAgICAgICAgICAgICBtZXRob2Q6IHR5cGVkUmVxdWVzdEFyZy5tZXRob2QsCiAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICJvdXRnb2luZyIsCiAgICAgICAgICAgICAgICBwaGFzZTogInJlc3BvbnNlIiwKICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSwKICAgICAgICAgICAgICAgIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSByZXF1ZXN0U3RhcnRUaW1lLAogICAgICAgICAgICAgICAgcGF5bG9hZDogdHlwZWRSZXF1ZXN0QXJnLnJlc3BvbnNlLAogICAgICAgICAgICAgICAgZXJyb3I6IHR5cGVkUmVxdWVzdEFyZy5lcnJvcj8udGV4dAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0eXBlZFJlcXVlc3RBcmc7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCB7IGhhbmRsZXI6IHR5cGVkSGFuZGxlciwgcm91dGVyOiBvd25pbmdSb3V0ZXIgfSA9IHJlc3VsdDsKICAgICAgICAgIGlmIChvd25pbmdSb3V0ZXIubWlkZGxld2FyZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGZvciAoY29uc3QgbXcgb2Ygb3duaW5nUm91dGVyLm1pZGRsZXdhcmVzKSB7CiAgICAgICAgICAgICAgICBhd2FpdCBtdyh0eXBlZFJlcXVlc3RBcmcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoZTExKSB7CiAgICAgICAgICAgICAgaWYgKGUxMSBpbnN0YW5jZW9mIFR5cGVkUmVzcG9uc2VFcnJvcikgewogICAgICAgICAgICAgICAgdHlwZWRSZXF1ZXN0QXJnLmVycm9yID0geyB0ZXh0OiBlMTEuZXJyb3JUZXh0LCBkYXRhOiBlMTEuZXJyb3JEYXRhIHx8IHt9IH07CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHR5cGVkUmVxdWVzdEFyZy5lcnJvciA9IHsgdGV4dDogZTExLm1lc3NhZ2UgfHwgIk1pZGRsZXdhcmUgZXJyb3IiLCBkYXRhOiB7fSB9OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0eXBlZFJlcXVlc3RBcmcuY29ycmVsYXRpb24ucGhhc2UgPSAicmVzcG9uc2UiOwogICAgICAgICAgICAgIHR5cGVkUmVxdWVzdEFyZy5sb2NhbERhdGEgPSBudWxsOwogICAgICAgICAgICAgIHR5cGVkUmVxdWVzdEFyZyA9IFZpcnR1YWxTdHJlYW0uZW5jb2RlUGF5bG9hZEZvck5ldHdvcmsodHlwZWRSZXF1ZXN0QXJnLCB7CiAgICAgICAgICAgICAgICB0eXBlZHJvdXRlcjogdGhpcwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGlmICghb3B0aW9ucy5za2lwSG9va3MpIHsKICAgICAgICAgICAgICAgIHRoaXMuY2FsbEhvb2soIm9uT3V0Z29pbmdSZXNwb25zZSIsIHsKICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogdHlwZWRSZXF1ZXN0QXJnLmNvcnJlbGF0aW9uPy5pZCB8fCAidW5rbm93biIsCiAgICAgICAgICAgICAgICAgIG1ldGhvZDogdHlwZWRSZXF1ZXN0QXJnLm1ldGhvZCwKICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAib3V0Z29pbmciLAogICAgICAgICAgICAgICAgICBwaGFzZTogInJlc3BvbnNlIiwKICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLAogICAgICAgICAgICAgICAgICBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gcmVxdWVzdFN0YXJ0VGltZSwKICAgICAgICAgICAgICAgICAgcGF5bG9hZDogdHlwZWRSZXF1ZXN0QXJnLnJlc3BvbnNlLAogICAgICAgICAgICAgICAgICBlcnJvcjogdHlwZWRSZXF1ZXN0QXJnLmVycm9yPy50ZXh0CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHR5cGVkUmVxdWVzdEFyZzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdHlwZWRSZXF1ZXN0QXJnID0gYXdhaXQgdHlwZWRIYW5kbGVyLmFkZFJlc3BvbnNlKHR5cGVkUmVxdWVzdEFyZyk7CiAgICAgICAgICB0eXBlZFJlcXVlc3RBcmcubG9jYWxEYXRhID0gbnVsbDsKICAgICAgICAgIHR5cGVkUmVxdWVzdEFyZyA9IFZpcnR1YWxTdHJlYW0uZW5jb2RlUGF5bG9hZEZvck5ldHdvcmsodHlwZWRSZXF1ZXN0QXJnLCB7CiAgICAgICAgICAgIHR5cGVkcm91dGVyOiB0aGlzCiAgICAgICAgICB9KTsKICAgICAgICAgIGlmICghb3B0aW9ucy5za2lwSG9va3MpIHsKICAgICAgICAgICAgdGhpcy5jYWxsSG9vaygib25PdXRnb2luZ1Jlc3BvbnNlIiwgewogICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHR5cGVkUmVxdWVzdEFyZy5jb3JyZWxhdGlvbj8uaWQgfHwgInVua25vd24iLAogICAgICAgICAgICAgIG1ldGhvZDogdHlwZWRSZXF1ZXN0QXJnLm1ldGhvZCwKICAgICAgICAgICAgICBkaXJlY3Rpb246ICJvdXRnb2luZyIsCiAgICAgICAgICAgICAgcGhhc2U6ICJyZXNwb25zZSIsCiAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLAogICAgICAgICAgICAgIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSByZXF1ZXN0U3RhcnRUaW1lLAogICAgICAgICAgICAgIHBheWxvYWQ6IHR5cGVkUmVxdWVzdEFyZy5yZXNwb25zZSwKICAgICAgICAgICAgICBlcnJvcjogdHlwZWRSZXF1ZXN0QXJnLmVycm9yPy50ZXh0CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHR5cGVkUmVxdWVzdEFyZzsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVkUmVxdWVzdEFyZz8uY29ycmVsYXRpb24/LnBoYXNlID09PSAicmVzcG9uc2UiKSB7CiAgICAgICAgICBpZiAoIW9wdGlvbnMuc2tpcEhvb2tzKSB7CiAgICAgICAgICAgIHRoaXMuY2FsbEhvb2soIm9uSW5jb21pbmdSZXNwb25zZSIsIHsKICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB0eXBlZFJlcXVlc3RBcmcuY29ycmVsYXRpb24/LmlkIHx8ICJ1bmtub3duIiwKICAgICAgICAgICAgICBtZXRob2Q6IHR5cGVkUmVxdWVzdEFyZy5tZXRob2QsCiAgICAgICAgICAgICAgZGlyZWN0aW9uOiAiaW5jb21pbmciLAogICAgICAgICAgICAgIHBoYXNlOiAicmVzcG9uc2UiLAogICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSwKICAgICAgICAgICAgICBwYXlsb2FkOiB0eXBlZFJlcXVlc3RBcmcucmVzcG9uc2UsCiAgICAgICAgICAgICAgZXJyb3I6IHR5cGVkUmVxdWVzdEFyZy5lcnJvcj8udGV4dAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuZmlyZUV2ZW50SW50ZXJlc3RNYXAuZmluZEludGVyZXN0KHR5cGVkUmVxdWVzdEFyZy5jb3JyZWxhdGlvbi5pZCk/LmZ1bGxmaWxsSW50ZXJlc3QodHlwZWRSZXF1ZXN0QXJnKTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zb2xlLmxvZygicmVjZWl2ZWQgd2VpcmRseSBzaGFwZWQgcmVxdWVzdCIpOwogICAgICAgICAgY29uc29sZS5sb2codHlwZWRSZXF1ZXN0QXJnKTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogaGFuZGxlIHN0cmVhbWluZwogICAgICAgKiBAcGFyYW0gc3RyZWFtVHJBcmcKICAgICAgICovCiAgICAgIGFzeW5jIGhhbmRsZVN0cmVhbVR5cGVkUmVxdWVzdChzdHJlYW1UckFyZykgewogICAgICAgIGNvbnN0IHJlbGV2YW50VmlydHVhbFN0cmVhbSA9IGF3YWl0IHRoaXMucmVnaXN0ZXJlZFZpcnR1YWxTdHJlYW1zLmZpbmQoYXN5bmMgKHZpcnR1YWxTdHJlYW1BcmcpID0+IHsKICAgICAgICAgIHJldHVybiB2aXJ0dWFsU3RyZWFtQXJnLnN0cmVhbUlkID09PSBzdHJlYW1UckFyZy5yZXF1ZXN0LnN0cmVhbUlkOwogICAgICAgIH0pOwogICAgICAgIGlmICghcmVsZXZhbnRWaXJ0dWFsU3RyZWFtKSB7CiAgICAgICAgICBjb25zb2xlLmxvZyhgbm8gcmVsZXZhbnQgdmlydHVhbCBzdHJlYW0gZm91bmQgZm9yIHN0cmVhbSB3aXRoIGlkICR7c3RyZWFtVHJBcmcucmVxdWVzdC5zdHJlYW1JZH1gKTsKICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMucmVnaXN0ZXJlZFZpcnR1YWxTdHJlYW1zLmdldEFycmF5KCkpOwogICAgICAgICAgcmV0dXJuIHN0cmVhbVRyQXJnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zb2xlLmxvZyhgc3VjY2VzczogZm91bmQgcmVsZXZhbnQgdmlydHVhbCBzdHJlYW0gd2l0aCBpZCAke3N0cmVhbVRyQXJnLnJlcXVlc3Quc3RyZWFtSWR9YCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlbGV2YW50VmlydHVhbFN0cmVhbS5oYW5kbGVTdHJlYW1UcihzdHJlYW1UckFyZyk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkcmVxdWVzdEAzLjMuMC9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRyZXF1ZXN0L2Rpc3RfdHMvY2xhc3Nlcy52aXJ0dWFsc3RyZWFtLmpzCnZhciBjbG9zaW5nQml0LCBWaXJ0dWFsU3RyZWFtOwp2YXIgaW5pdF9jbGFzc2VzX3ZpcnR1YWxzdHJlYW0gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2NsYXNzZXMudmlydHVhbHN0cmVhbS5qcyIoKSB7CiAgICBpbml0X3BsdWdpbnMoKTsKICAgIGluaXRfY2xhc3Nlc190eXBlZHJvdXRlcigpOwogICAgY2xvc2luZ0JpdCA9ICIjIyMjIyMjIyMjIyMjQ0xPU0lORyBCSVQjIyMjIyMjIyMjIyMjIjsKICAgIFZpcnR1YWxTdHJlYW0gPSBjbGFzcyBfVmlydHVhbFN0cmVhbSB7CiAgICAgIC8vIFNUQVRJQwogICAgICBzdGF0aWMgZW5jb2RlUGF5bG9hZEZvck5ldHdvcmsob2JqZWN0UGF5bG9hZCwgY29tbUZ1bmN0aW9ucywgb3JpZ2luYWxQYXlsb2FkLCBwYXRoMiA9IFtdKSB7CiAgICAgICAgaWYgKCFvYmplY3RQYXlsb2FkKSB7CiAgICAgICAgICByZXR1cm4gb2JqZWN0UGF5bG9hZDsKICAgICAgICB9CiAgICAgICAgaWYgKGRpc3RfdHNfZXhwb3J0czEwLmlzQnVmZmVyTGlrZShvYmplY3RQYXlsb2FkKSkgewogICAgICAgICAgcmV0dXJuIG9iamVjdFBheWxvYWQ7CiAgICAgICAgfQogICAgICAgIGlmIChvYmplY3RQYXlsb2FkIGluc3RhbmNlb2YgX1ZpcnR1YWxTdHJlYW0pIHsKICAgICAgICAgIGlmICghb2JqZWN0UGF5bG9hZC5zaWRlICYmIGNvbW1GdW5jdGlvbnMuc2VuZE1ldGhvZCkgewogICAgICAgICAgICBvYmplY3RQYXlsb2FkLnNpZGUgPSAicmVxdWVzdGluZyI7CiAgICAgICAgICAgIG9iamVjdFBheWxvYWQuc2VuZE1ldGhvZCA9IGNvbW1GdW5jdGlvbnMuc2VuZE1ldGhvZDsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghb2JqZWN0UGF5bG9hZC5zaWRlICYmIGNvbW1GdW5jdGlvbnMudHlwZWRyb3V0ZXIpIHsKICAgICAgICAgICAgb2JqZWN0UGF5bG9hZC5zaWRlID0gInJlc3BvbmRpbmciOwogICAgICAgICAgICBvYmplY3RQYXlsb2FkLnR5cGVkcm91dGVyID0gY29tbUZ1bmN0aW9ucy50eXBlZHJvdXRlcjsKICAgICAgICAgICAgY29tbUZ1bmN0aW9ucy50eXBlZHJvdXRlci5yZWdpc3RlcmVkVmlydHVhbFN0cmVhbXMuYWRkKG9iamVjdFBheWxvYWQpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFvcmlnaW5hbFBheWxvYWQucmVzcG9uc2UgfHwgcGF0aDIuaW5jbHVkZXMoInJlc3BvbnNlIikpIHsKICAgICAgICAgICAgb2JqZWN0UGF5bG9hZC5zdGFydEtlZXBBbGl2ZUxvb3AoKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBfaXNWaXJ0dWFsU3RyZWFtOiB0cnVlLAogICAgICAgICAgICAgIHN0cmVhbUlkOiBvYmplY3RQYXlsb2FkLnN0cmVhbUlkCiAgICAgICAgICAgIH07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIF9PQk1JVFRFRF9WSVJUVUFMX1NUUkVBTTogdHJ1ZSwKICAgICAgICAgICAgICByZWFzb246ICJwYXRoIGlzIHVuZGVyIC5yZXF1ZXN0OiBvYm1pdHRlZCBmb3IgZGVkdXBsaWNhdGlvbiByZWFzb25zIGluIHJlc3BvbnNlIGN5Y2xlLiIKICAgICAgICAgICAgfTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0UGF5bG9hZCkpIHsKICAgICAgICAgIHJldHVybiBvYmplY3RQYXlsb2FkLm1hcCgoaXRlbSwgaW5kZXgyKSA9PiBfVmlydHVhbFN0cmVhbS5lbmNvZGVQYXlsb2FkRm9yTmV0d29yaygKICAgICAgICAgICAgaXRlbSwKICAgICAgICAgICAgY29tbUZ1bmN0aW9ucywKICAgICAgICAgICAgb3JpZ2luYWxQYXlsb2FkIHx8IG9iamVjdFBheWxvYWQsCiAgICAgICAgICAgIHBhdGgyLmNvbmNhdChTdHJpbmcoaW5kZXgyKSkKICAgICAgICAgICAgLy8gQ29udmVydCBpbmRleCB0byBzdHJpbmcgYW5kIGNvbmNhdGVuYXRlIHRvIHBhdGgKICAgICAgICAgICkpOwogICAgICAgIH0gZWxzZSBpZiAob2JqZWN0UGF5bG9hZCAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqZWN0UGF5bG9hZCA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyhvYmplY3RQYXlsb2FkKS5yZWR1Y2UoKGFjYywgW2tleTIsIHZhbHVlMl0pID0+IHsKICAgICAgICAgICAgY29uc3QgbmV3UGF0aCA9IHBhdGgyLmNvbmNhdChrZXkyKTsKICAgICAgICAgICAgYWNjW2tleTJdID0gX1ZpcnR1YWxTdHJlYW0uZW5jb2RlUGF5bG9hZEZvck5ldHdvcmsodmFsdWUyLCBjb21tRnVuY3Rpb25zLCBvcmlnaW5hbFBheWxvYWQgfHwgb2JqZWN0UGF5bG9hZCwgbmV3UGF0aCk7CiAgICAgICAgICAgIHJldHVybiBhY2M7CiAgICAgICAgICB9LCB7fSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBvYmplY3RQYXlsb2FkOwogICAgICAgIH0KICAgICAgfQogICAgICBzdGF0aWMgZGVjb2RlUGF5bG9hZEZyb21OZXR3b3JrKG9iamVjdFBheWxvYWQsIGNvbW1GdW5jdGlvbnMpIHsKICAgICAgICBpZiAoZGlzdF90c19leHBvcnRzMTAuaXNCdWZmZXJMaWtlKG9iamVjdFBheWxvYWQpIHx8IG9iamVjdFBheWxvYWQgaW5zdGFuY2VvZiBUeXBlZFJvdXRlcikgewogICAgICAgICAgcmV0dXJuIG9iamVjdFBheWxvYWQ7CiAgICAgICAgfQogICAgICAgIGlmIChvYmplY3RQYXlsb2FkICE9PSBudWxsICYmIHR5cGVvZiBvYmplY3RQYXlsb2FkID09PSAib2JqZWN0IikgewogICAgICAgICAgaWYgKG9iamVjdFBheWxvYWQgaW5zdGFuY2VvZiBTZXQgfHwgb2JqZWN0UGF5bG9hZCBpbnN0YW5jZW9mIE1hcCB8fCBvYmplY3RQYXlsb2FkIGluc3RhbmNlb2YgRGF0ZSB8fCBvYmplY3RQYXlsb2FkIGluc3RhbmNlb2YgUmVnRXhwIHx8IG9iamVjdFBheWxvYWQgaW5zdGFuY2VvZiBFcnJvciB8fCBvYmplY3RQYXlsb2FkIGluc3RhbmNlb2YgUHJvbWlzZSB8fCB0eXBlb2Ygb2JqZWN0UGF5bG9hZC50aGVuID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIHJldHVybiBvYmplY3RQYXlsb2FkOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9iamVjdFBheWxvYWQuX2lzVmlydHVhbFN0cmVhbSkgewogICAgICAgICAgICBjb25zdCB2aXJ0dWFsU3RyZWFtID0gbmV3IF9WaXJ0dWFsU3RyZWFtKCk7CiAgICAgICAgICAgIHZpcnR1YWxTdHJlYW0uc3RyZWFtSWQgPSBvYmplY3RQYXlsb2FkLnN0cmVhbUlkOwogICAgICAgICAgICBpZiAoIXZpcnR1YWxTdHJlYW0uc2lkZSAmJiBjb21tRnVuY3Rpb25zLnNlbmRNZXRob2QpIHsKICAgICAgICAgICAgICB2aXJ0dWFsU3RyZWFtLnNpZGUgPSAicmVxdWVzdGluZyI7CiAgICAgICAgICAgICAgdmlydHVhbFN0cmVhbS5zZW5kTWV0aG9kID0gY29tbUZ1bmN0aW9ucy5zZW5kTWV0aG9kOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdmlydHVhbFN0cmVhbS5zaWRlICYmIGNvbW1GdW5jdGlvbnMudHlwZWRyb3V0ZXIpIHsKICAgICAgICAgICAgICB2aXJ0dWFsU3RyZWFtLnNpZGUgPSAicmVzcG9uZGluZyI7CiAgICAgICAgICAgICAgdmlydHVhbFN0cmVhbS50eXBlZHJvdXRlciA9IGNvbW1GdW5jdGlvbnMudHlwZWRyb3V0ZXI7CiAgICAgICAgICAgICAgY29tbUZ1bmN0aW9ucy50eXBlZHJvdXRlci5yZWdpc3RlcmVkVmlydHVhbFN0cmVhbXMuYWRkKHZpcnR1YWxTdHJlYW0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZpcnR1YWxTdHJlYW0uc3RhcnRLZWVwQWxpdmVMb29wKCk7CiAgICAgICAgICAgIHJldHVybiB2aXJ0dWFsU3RyZWFtOwogICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iamVjdFBheWxvYWQpKSB7CiAgICAgICAgICAgIGNvbnN0IHJldHVybkFycmF5ID0gW107CiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBvYmplY3RQYXlsb2FkKSB7CiAgICAgICAgICAgICAgcmV0dXJuQXJyYXkucHVzaChfVmlydHVhbFN0cmVhbS5kZWNvZGVQYXlsb2FkRnJvbU5ldHdvcmsoaXRlbSwgY29tbUZ1bmN0aW9ucykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXR1cm5BcnJheTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3RQYXlsb2FkKS5yZWR1Y2UoKGFjYywga2V5MikgPT4gewogICAgICAgICAgICAgIGFjY1trZXkyXSA9IF9WaXJ0dWFsU3RyZWFtLmRlY29kZVBheWxvYWRGcm9tTmV0d29yayhvYmplY3RQYXlsb2FkW2tleTJdLCBjb21tRnVuY3Rpb25zKTsKICAgICAgICAgICAgICByZXR1cm4gYWNjOwogICAgICAgICAgICB9LCB7fSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBvYmplY3RQYXlsb2FkOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLnN0cmVhbUlkID0gaXNvdW5pcXVlMi51bmkoKTsKICAgICAgICB0aGlzLmtlZXBBbGl2ZSA9IHRydWU7CiAgICAgICAgdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5ID0gbmV3IGRpc3RfdHNfZXhwb3J0czkuQmFja3ByZXNzdXJlZEFycmF5KDE2KTsKICAgICAgICB0aGlzLnJlY2VpdmVCYWNrcHJlc3N1cmVkQXJyYXkgPSBuZXcgZGlzdF90c19leHBvcnRzOS5CYWNrcHJlc3N1cmVkQXJyYXkoMTYpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZWNvbnN0aXR1dGUgYmluYXJ5IGRhdGEgdGhhdCB3YXMgbG9zdCB0aHJvdWdoIEpTT04gc2VyaWFsaXphdGlvbi4KICAgICAgICogTm9kZS5qcyBCdWZmZXIgYmVjb21lcyB7dHlwZTogIkJ1ZmZlciIsIGRhdGE6IFsuLi5dfSwKICAgICAgICogVWludDhBcnJheSBiZWNvbWVzIHsiMCI6IDEwNCwgIjEiOiAxMDEsIC4uLn0uCiAgICAgICAqLwogICAgICBzdGF0aWMgcmVjb25zdGl0dXRlQmluYXJ5RGF0YShkYXRhKSB7CiAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCB0eXBlb2YgQnVmZmVyICE9PSAidW5kZWZpbmVkIiAmJiBCdWZmZXIuaXNCdWZmZXIoZGF0YSkpIHsKICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAiQnVmZmVyIiAmJiBBcnJheS5pc0FycmF5KGRhdGEuZGF0YSkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRhdGEuZGF0YSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBrZXlzMiA9IE9iamVjdC5rZXlzKGRhdGEpOwogICAgICAgICAgaWYgKGtleXMyLmxlbmd0aCA+IDAgJiYga2V5czIuZXZlcnkoKGs1KSA9PiAvXlxkKyQvLnRlc3QoazUpKSkgewogICAgICAgICAgICBjb25zdCBhcnIgPSBuZXcgQXJyYXkoa2V5czIubGVuZ3RoKTsKICAgICAgICAgICAgZm9yIChjb25zdCBrNSBvZiBrZXlzMikgewogICAgICAgICAgICAgIGFycltOdW1iZXIoazUpXSA9IGRhdGFbazVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnIuZXZlcnkoKHY2KSA9PiB0eXBlb2YgdjYgPT09ICJudW1iZXIiKSkgewogICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShhcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBkYXRhOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiB0YWtlcyBjYXJlIG9mIHNlbmRpbmcKICAgICAgICovCiAgICAgIGFzeW5jIHdvcmtPblF1ZXVlKCkgewogICAgICAgIGlmICh0aGlzLndvcmtpbmdEZWZlcnJlZCkgewogICAgICAgICAgcmV0dXJuIHRoaXMud29ya2luZ0RlZmVycmVkLnByb21pc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMud29ya2luZ0RlZmVycmVkID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnNpZGUgPT09ICJyZXF1ZXN0aW5nIikgewogICAgICAgICAgbGV0IHRoaXNTaWRlSXNCYWNrcHJlc3N1cmVkID0gIXRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheS5jaGVja1NwYWNlQXZhaWxhYmxlKCk7CiAgICAgICAgICBsZXQgb3RoZXJTaWRlSGFzTmV4dCA9IGZhbHNlOwogICAgICAgICAgbGV0IG90aGVyU2lkZUlzQmFja3ByZXNzdXJlZCA9IGZhbHNlOwogICAgICAgICAgY29uc3QgZ2V0RmVlZGJhY2sgPSBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHN0cmVhbVRyID0gYXdhaXQgdGhpcy5zZW5kTWV0aG9kKHsKICAgICAgICAgICAgICBtZXRob2Q6ICIjI1ZpcnR1YWxTdHJlYW0jIyIsCiAgICAgICAgICAgICAgcmVxdWVzdDogewogICAgICAgICAgICAgICAgc3RyZWFtSWQ6IHRoaXMuc3RyZWFtSWQsCiAgICAgICAgICAgICAgICBjeWNsZUlkOiBpc291bmlxdWUyLnVuaSgpLAogICAgICAgICAgICAgICAgY3ljbGU6ICJyZXF1ZXN0IiwKICAgICAgICAgICAgICAgIG1haW5QdXJwb3NlOiAiZmVlZGJhY2siLAogICAgICAgICAgICAgICAgbmV4dDogdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LmRhdGEubGVuZ3RoID4gMCwKICAgICAgICAgICAgICAgIGJhY2twcmVzc3VyZTogIXRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheS5jaGVja1NwYWNlQXZhaWxhYmxlKCkKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHJlc3BvbnNlOiBudWxsCiAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHsKICAgICAgICAgICAgICBjb25zb2xlLmxvZygic3RyZWFtIGVuZGVkIGltbWF0dXJlbHkiKTsKICAgICAgICAgICAgICB0aGlzLmtlZXBBbGl2ZSA9IGZhbHNlOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKHN0cmVhbVRyICYmIHN0cmVhbVRyLnJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgb3RoZXJTaWRlSXNCYWNrcHJlc3N1cmVkID0gc3RyZWFtVHIucmVzcG9uc2UuYmFja3ByZXNzdXJlOwogICAgICAgICAgICAgIG90aGVyU2lkZUhhc05leHQgPSBzdHJlYW1Uci5yZXNwb25zZS5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgYXdhaXQgZ2V0RmVlZGJhY2soKTsKICAgICAgICAgIHdoaWxlICh0aGlzLnNlbmRCYWNrcHJlc3N1cmVkQXJyYXkuZGF0YS5sZW5ndGggPiAwIHx8IG90aGVyU2lkZUhhc05leHQpIHsKICAgICAgICAgICAgaWYgKG90aGVyU2lkZUlzQmFja3ByZXNzdXJlZCkgewogICAgICAgICAgICAgIHdoaWxlIChvdGhlclNpZGVJc0JhY2twcmVzc3VyZWQpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJ3YWl0aW5nIGZvciBmZWVkYmFjayBiZWNhdXNlIG9mIGJhY2twcmVzc3VyZS4uLiIpOwogICAgICAgICAgICAgICAgYXdhaXQgZGlzdF90c19leHBvcnRzMy5kZWxheUZvcig1MCk7CiAgICAgICAgICAgICAgICBhd2FpdCBnZXRGZWVkYmFjaygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgZGF0YUFyZzsKICAgICAgICAgICAgaWYgKHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS5kYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICBkYXRhQXJnID0gdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LnNoaWZ0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHN0cmVhbVRyOwogICAgICAgICAgICBzdHJlYW1UciA9IGF3YWl0IHRoaXMuc2VuZE1ldGhvZCh7CiAgICAgICAgICAgICAgbWV0aG9kOiAiIyNWaXJ0dWFsU3RyZWFtIyMiLAogICAgICAgICAgICAgIHJlcXVlc3Q6IHsKICAgICAgICAgICAgICAgIHN0cmVhbUlkOiB0aGlzLnN0cmVhbUlkLAogICAgICAgICAgICAgICAgY3ljbGVJZDogaXNvdW5pcXVlMi51bmkoKSwKICAgICAgICAgICAgICAgIGN5Y2xlOiAicmVxdWVzdCIsCiAgICAgICAgICAgICAgICBtYWluUHVycG9zZTogZGF0YUFyZyA/ICJjaHVuayIgOiAicmVhZCIsCiAgICAgICAgICAgICAgICBiYWNrcHJlc3N1cmU6IHRoaXNTaWRlSXNCYWNrcHJlc3N1cmVkLAogICAgICAgICAgICAgICAgbmV4dDogdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LmRhdGEubGVuZ3RoID4gMCwKICAgICAgICAgICAgICAgIC4uLmRhdGFBcmcgPyB7IGNodW5rRGF0YTogZGF0YUFyZyB9IDoge30KICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHJlc3BvbnNlOiBudWxsCiAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHsKICAgICAgICAgICAgICBjb25zb2xlLmxvZygic3RyZWFtIGVuZGVkIGltbWF0dXJlbHkiKTsKICAgICAgICAgICAgICB0aGlzLmtlZXBBbGl2ZSA9IGZhbHNlOwogICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKHN0cmVhbVRyICYmIHN0cmVhbVRyLnJlc3BvbnNlICYmIHN0cmVhbVRyLnJlc3BvbnNlLmNodW5rRGF0YSkgewogICAgICAgICAgICAgIHRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheS5wdXNoKF9WaXJ0dWFsU3RyZWFtLnJlY29uc3RpdHV0ZUJpbmFyeURhdGEoc3RyZWFtVHIucmVzcG9uc2UuY2h1bmtEYXRhKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3RoZXJTaWRlSXNCYWNrcHJlc3N1cmVkID0gc3RyZWFtVHIgJiYgc3RyZWFtVHIucmVzcG9uc2UgJiYgc3RyZWFtVHIucmVzcG9uc2UuYmFja3ByZXNzdXJlOwogICAgICAgICAgICB0aGlzU2lkZUlzQmFja3ByZXNzdXJlZCA9ICF0aGlzLnJlY2VpdmVCYWNrcHJlc3N1cmVkQXJyYXkuY2hlY2tTcGFjZUF2YWlsYWJsZSgpOwogICAgICAgICAgICBvdGhlclNpZGVIYXNOZXh0ID0gc3RyZWFtVHIgJiYgc3RyZWFtVHIucmVzcG9uc2UgJiYgc3RyZWFtVHIucmVzcG9uc2UubmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy53b3JraW5nRGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgIHRoaXMud29ya2luZ0RlZmVycmVkID0gbnVsbDsKICAgICAgfQogICAgICAvKioKICAgICAgICogVGhpcyBtZXRob2QgaGFuZGxlcyB0aGUgc3RyZWFtIG9ubHkgb24gdGhlIHJlc3BvbmRpbmcgc2lkZQogICAgICAgKiBAcGFyYW0gc3RyZWFtVHJBcmcKICAgICAgICogQHJldHVybnMKICAgICAgICovCiAgICAgIGFzeW5jIGhhbmRsZVN0cmVhbVRyKHN0cmVhbVRyQXJnKSB7CiAgICAgICAgaWYgKHN0cmVhbVRyQXJnLnJlcXVlc3Qua2VlcEFsaXZlID09PSB0cnVlICYmIHRoaXMua2VlcEFsaXZlID09PSB0cnVlKSB7CiAgICAgICAgICB0aGlzLmxhc3RLZWVwQWxpdmVFdmVudCA9IERhdGUubm93KCk7CiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW1UckFyZy5yZXF1ZXN0LmtlZXBBbGl2ZSA9PT0gZmFsc2UpIHsKICAgICAgICAgIHRoaXMua2VlcEFsaXZlID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1UckFyZy5yZXF1ZXN0Lm1haW5QdXJwb3NlID09PSAia2VlcEFsaXZlIikgewogICAgICAgICAgc3RyZWFtVHJBcmcucmVzcG9uc2UgPSB7CiAgICAgICAgICAgIHN0cmVhbUlkOiB0aGlzLnN0cmVhbUlkLAogICAgICAgICAgICBjeWNsZUlkOiBzdHJlYW1UckFyZy5yZXF1ZXN0LmN5Y2xlSWQsCiAgICAgICAgICAgIGN5Y2xlOiAicmVzcG9uc2UiLAogICAgICAgICAgICBtYWluUHVycG9zZTogImtlZXBBbGl2ZSIsCiAgICAgICAgICAgIGtlZXBBbGl2ZTogdGhpcy5rZWVwQWxpdmUsCiAgICAgICAgICAgIG5leHQ6IHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS5kYXRhLmxlbmd0aCA+IDAsCiAgICAgICAgICAgIGJhY2twcmVzc3VyZTogIXRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheS5jaGVja1NwYWNlQXZhaWxhYmxlKCkKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1UckFyZy5yZXF1ZXN0Lm1haW5QdXJwb3NlID09PSAiZmVlZGJhY2siKSB7CiAgICAgICAgICBzdHJlYW1UckFyZy5yZXNwb25zZSA9IHsKICAgICAgICAgICAgc3RyZWFtSWQ6IHRoaXMuc3RyZWFtSWQsCiAgICAgICAgICAgIGN5Y2xlSWQ6IHN0cmVhbVRyQXJnLnJlcXVlc3QuY3ljbGVJZCwKICAgICAgICAgICAgY3ljbGU6ICJyZXNwb25zZSIsCiAgICAgICAgICAgIG1haW5QdXJwb3NlOiAiZmVlZGJhY2siLAogICAgICAgICAgICBuZXh0OiB0aGlzLnNlbmRCYWNrcHJlc3N1cmVkQXJyYXkuZGF0YS5sZW5ndGggPiAwLAogICAgICAgICAgICBiYWNrcHJlc3N1cmU6ICF0aGlzLnJlY2VpdmVCYWNrcHJlc3N1cmVkQXJyYXkuY2hlY2tTcGFjZUF2YWlsYWJsZSgpCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtVHJBcmcucmVxdWVzdC5tYWluUHVycG9zZSA9PT0gImNodW5rIikgewogICAgICAgICAgdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LnB1c2goX1ZpcnR1YWxTdHJlYW0ucmVjb25zdGl0dXRlQmluYXJ5RGF0YShzdHJlYW1UckFyZy5yZXF1ZXN0LmNodW5rRGF0YSkpOwogICAgICAgICAgaWYgKHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS5kYXRhLmxlbmd0aCA+IDAgJiYgc3RyZWFtVHJBcmcucmVzcG9uc2UuYmFja3ByZXNzdXJlID09PSBmYWxzZSkgewogICAgICAgICAgICBjb25zdCBkYXRhQXJnID0gdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LnNoaWZ0KCk7CiAgICAgICAgICAgIHN0cmVhbVRyQXJnLnJlc3BvbnNlID0gewogICAgICAgICAgICAgIHN0cmVhbUlkOiB0aGlzLnN0cmVhbUlkLAogICAgICAgICAgICAgIGN5Y2xlSWQ6IHN0cmVhbVRyQXJnLnJlcXVlc3QuY3ljbGVJZCwKICAgICAgICAgICAgICBjeWNsZTogInJlc3BvbnNlIiwKICAgICAgICAgICAgICBtYWluUHVycG9zZTogImNodW5rIiwKICAgICAgICAgICAgICBuZXh0OiB0aGlzLnNlbmRCYWNrcHJlc3N1cmVkQXJyYXkuZGF0YS5sZW5ndGggPiAxLAogICAgICAgICAgICAgIC8vIDEgYW5kIG5vdCAwIGJlY2F1c2Ugd2UgY2FsbCBzaGlmdCBhIGZldyBsaW5lcyBkb3duCiAgICAgICAgICAgICAgYmFja3ByZXNzdXJlOiAhdGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5LmNoZWNrU3BhY2VBdmFpbGFibGUoKSwKICAgICAgICAgICAgICBjaHVua0RhdGE6IHRoaXMuc2VuZEJhY2twcmVzc3VyZWRBcnJheS5zaGlmdCgpCiAgICAgICAgICAgIH07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW1UckFyZy5yZXNwb25zZSA9IHsKICAgICAgICAgICAgICBzdHJlYW1JZDogdGhpcy5zdHJlYW1JZCwKICAgICAgICAgICAgICBjeWNsZUlkOiBzdHJlYW1UckFyZy5yZXF1ZXN0LmN5Y2xlSWQsCiAgICAgICAgICAgICAgY3ljbGU6ICJyZXNwb25zZSIsCiAgICAgICAgICAgICAgbWFpblB1cnBvc2U6ICJmZWVkYmFjayIsCiAgICAgICAgICAgICAgbmV4dDogdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LmRhdGEubGVuZ3RoID4gMCwKICAgICAgICAgICAgICBiYWNrcHJlc3N1cmU6ICF0aGlzLnJlY2VpdmVCYWNrcHJlc3N1cmVkQXJyYXkuY2hlY2tTcGFjZUF2YWlsYWJsZSgpCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgICBzdHJlYW1UckFyZy5yZXF1ZXN0ID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0cmVhbVRyQXJnOwogICAgICB9CiAgICAgIC8vIGxpZmVjeWNsZSBtZXRob2RzCiAgICAgIC8qKgogICAgICAgKiBjbG9zZXMgdGhlIHZpcnR1YWwgc3RyZWFtCiAgICAgICAqLwogICAgICBhc3luYyBjbGVhbnVwKCkgewogICAgICAgIGlmICh0aGlzLnR5cGVkcm91dGVyKSB7CiAgICAgICAgICB0aGlzLnR5cGVkcm91dGVyLnJlZ2lzdGVyZWRWaXJ0dWFsU3RyZWFtcy5yZW1vdmUodGhpcyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBhIGtlZXBBbGl2ZSBsb29wIHRoYXQgd29ya3MgYWNyb3NzIHRlY2hub2xvZ2llcwogICAgICAgKi8KICAgICAgYXN5bmMgc3RhcnRLZWVwQWxpdmVMb29wKCkgewogICAgICAgIGlmICh0aGlzLnNpZGUgPT09ICJyZXNwb25kaW5nIikgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBhd2FpdCBkaXN0X3RzX2V4cG9ydHMzLmRlbGF5Rm9yKDApOwogICAgICAgIGNvbnNvbGUubG9nKGBzdGFydGluZyBrZWVwYWxpdmUgbG9vcCBvbiBzaWRlICR7dGhpcy5zaWRlfWApOwogICAgICAgIGxldCBjb3VudGVyMiA9IDA7CiAgICAgICAga2VlcEFsaXZlTG9vcDogd2hpbGUgKHRoaXMua2VlcEFsaXZlKSB7CiAgICAgICAgICBhd2FpdCB0aGlzLnRyaWdnZXJLZWVwQWxpdmUoKTsKICAgICAgICAgIGF3YWl0IGRpc3RfdHNfZXhwb3J0czMuZGVsYXlGb3IoMWUzKTsKICAgICAgICB9CiAgICAgICAgYXdhaXQgZGlzdF90c19leHBvcnRzMy5kZWxheUZvcigxZTMpOwogICAgICAgIGF3YWl0IHRoaXMuY2xlYW51cCgpOwogICAgICAgIGNvbnNvbGUubG9nKGBjbGVhbmVkIHVwIGZvciBzdHJlYW0gJHt0aGlzLnN0cmVhbUlkfWApOwogICAgICB9CiAgICAgIGFzeW5jIHRyaWdnZXJLZWVwQWxpdmUoKSB7CiAgICAgICAgaWYgKHRoaXMuc2lkZSA9PT0gInJlcXVlc3RpbmciKSB7CiAgICAgICAgICBjb25zb2xlLmxvZyhga2VlcGFsaXZlIHNlbnQuYCk7CiAgICAgICAgICBjb25zdCBzdHJlYW1UciA9IGF3YWl0IHRoaXMuc2VuZE1ldGhvZCh7CiAgICAgICAgICAgIG1ldGhvZDogIiMjVmlydHVhbFN0cmVhbSMjIiwKICAgICAgICAgICAgcmVxdWVzdDogewogICAgICAgICAgICAgIHN0cmVhbUlkOiB0aGlzLnN0cmVhbUlkLAogICAgICAgICAgICAgIGN5Y2xlSWQ6IGlzb3VuaXF1ZTIudW5pKCksCiAgICAgICAgICAgICAgY3ljbGU6ICJyZXF1ZXN0IiwKICAgICAgICAgICAgICBtYWluUHVycG9zZTogImtlZXBBbGl2ZSIsCiAgICAgICAgICAgICAga2VlcEFsaXZlOiB0aGlzLmtlZXBBbGl2ZQogICAgICAgICAgICB9LAogICAgICAgICAgICByZXNwb25zZTogbnVsbAogICAgICAgICAgfSkuY2F0Y2goKCkgPT4gewogICAgICAgICAgICB0aGlzLmtlZXBBbGl2ZSA9IGZhbHNlOwogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoc3RyZWFtVHIgJiYgc3RyZWFtVHIucmVzcG9uc2UgJiYgc3RyZWFtVHIucmVzcG9uc2Uua2VlcEFsaXZlID09PSBmYWxzZSkgewogICAgICAgICAgICB0aGlzLmtlZXBBbGl2ZSA9IGZhbHNlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5sYXN0S2VlcEFsaXZlRXZlbnQgPSBEYXRlLm5vdygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0cmVhbVRyICYmIHN0cmVhbVRyLnJlc3BvbnNlICYmIHN0cmVhbVRyLnJlc3BvbnNlLm5leHQpIHsKICAgICAgICAgICAgdGhpcy53b3JrT25RdWV1ZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMubGFzdEtlZXBBbGl2ZUV2ZW50ID4gMWU0KSB7CiAgICAgICAgICBjb25zb2xlLmxvZyhgY2xvc2luZyBzdHJlYW0gZm9yICR7dGhpcy5zdHJlYW1JZH1gKTsKICAgICAgICAgIHRoaXMua2VlcEFsaXZlID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIERhdGEgc2VuZGluZyBhbmQgcmVjZWl2aW5nCiAgICAgIGFzeW5jIHNlbmREYXRhKGRhdGFBcmcpIHsKICAgICAgICB0aGlzLnNlbmRCYWNrcHJlc3N1cmVkQXJyYXkucHVzaChkYXRhQXJnKTsKICAgICAgICB0aGlzLndvcmtPblF1ZXVlKCk7CiAgICAgICAgYXdhaXQgdGhpcy5zZW5kQmFja3ByZXNzdXJlZEFycmF5LndhaXRGb3JTcGFjZSgpOwogICAgICB9CiAgICAgIGFzeW5jIGZldGNoRGF0YSgpIHsKICAgICAgICBpZiAodGhpcy5yZWNlaXZlQmFja3ByZXNzdXJlZEFycmF5Lmhhc1NwYWNlKSB7CiAgICAgICAgfQogICAgICAgIGF3YWl0IHRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheS53YWl0Rm9ySXRlbXMoKTsKICAgICAgICBjb25zdCBkYXRhUGFja2FnZSA9IHRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheS5zaGlmdCgpOwogICAgICAgIHJldHVybiBkYXRhUGFja2FnZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogcmVhZHMgZnJvbSBhIFJlYWRhYmxlIGFuZCBzZW5kcyBpdCB0byB0aGUgb3RoZXIgc2lkZQogICAgICAgKiBAcGFyYW0gcmVhZGFibGVTdHJlYW1BcmcKICAgICAgICovCiAgICAgIGFzeW5jIHJlYWRGcm9tV2Vic3RyZWFtKHJlYWRhYmxlU3RyZWFtQXJnLCBjbG9zZUFmdGVyUmVhZGluZyA9IHRydWUpIHsKICAgICAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZVN0cmVhbUFyZy5nZXRSZWFkZXIoKTsKICAgICAgICBsZXQgc3RyZWFtSXNEb25lID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKCFzdHJlYW1Jc0RvbmUpIHsKICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IHZhbHVlMiwgZG9uZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTsKICAgICAgICAgIGlmICh2YWx1ZTIpIHsKICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kRGF0YSh2YWx1ZTIpOwogICAgICAgICAgfQogICAgICAgICAgc3RyZWFtSXNEb25lID0gZG9uZTsKICAgICAgICB9CiAgICAgICAgaWYgKGNsb3NlQWZ0ZXJSZWFkaW5nKSB7CiAgICAgICAgICBhd2FpdCB0aGlzLmNsb3NlKHRydWUpOwogICAgICAgIH0KICAgICAgfQogICAgICBhc3luYyB3cml0ZVRvV2Vic3RyZWFtKHdyaXRhYmxlU3RyZWFtQXJnKSB7CiAgICAgICAgY29uc3Qgd3JpdGVyID0gd3JpdGFibGVTdHJlYW1BcmcuZ2V0V3JpdGVyKCk7CiAgICAgICAgd2hpbGUgKHRoaXMua2VlcEFsaXZlIHx8IHRoaXMucmVjZWl2ZUJhY2twcmVzc3VyZWRBcnJheS5jaGVja0hhc0l0ZW1zKCkpIHsKICAgICAgICAgIGNvbnN0IHZhbHVlMiA9IGF3YWl0IHRoaXMuZmV0Y2hEYXRhKCk7CiAgICAgICAgICBpZiAodmFsdWUyID09PSBjbG9zaW5nQml0KSB7CiAgICAgICAgICAgIHdyaXRlci5yZWxlYXNlTG9jaygpOwogICAgICAgICAgICBhd2FpdCB3cml0YWJsZVN0cmVhbUFyZy5jbG9zZSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGF3YWl0IHdyaXRlci53cml0ZSh2YWx1ZTIpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogY2xvc2VzIHRoZSBzdHJlYW0KICAgICAgICogaWYgc2VuZENsb3NpbmdCaXRBcmcgaXMgdHJ1ZSwgdGhlIHN0cmVhbSB3aWxsIHNlbmQgYSBjbG9zaW5nIGJpdAogICAgICAgKiBAcGFyYW0gc2VuZENsb3NpbmdCaXRBcmcKICAgICAgICovCiAgICAgIGFzeW5jIGNsb3NlKHNlbmRDbG9zaW5nQml0QXJnID0gZmFsc2UpIHsKICAgICAgICBpZiAoc2VuZENsb3NpbmdCaXRBcmcpIHsKICAgICAgICAgIHRoaXMuc2VuZERhdGEoY2xvc2luZ0JpdCk7CiAgICAgICAgfQogICAgICAgIHRoaXMua2VlcEFsaXZlID0gZmFsc2U7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2NsYXNzZXMudHlwZWR0YXJnZXQuanMKdmFyIFR5cGVkVGFyZ2V0Owp2YXIgaW5pdF9jbGFzc2VzX3R5cGVkdGFyZ2V0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGFwaS5nbG9iYWwrdHlwZWRyZXF1ZXN0QDMuMy4wL25vZGVfbW9kdWxlcy9AYXBpLmdsb2JhbC90eXBlZHJlcXVlc3QvZGlzdF90cy9jbGFzc2VzLnR5cGVkdGFyZ2V0LmpzIigpIHsKICAgIGluaXRfY2xhc3Nlc190eXBlZHJvdXRlcigpOwogICAgaW5pdF9wbHVnaW5zKCk7CiAgICBUeXBlZFRhcmdldCA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3Iob3B0aW9uc0FyZykgewogICAgICAgIGlmIChvcHRpb25zQXJnLnBvc3RNZXRob2RXaXRoVHlwZWRSb3V0ZXIgJiYgIW9wdGlvbnNBcmcudHlwZWRSb3V0ZXJSZWYpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigieW91IGhhdmUgdG8gc3BlY2lmeSBhIHR5cGVkcm91dGVyIHdoZW4gdXNpbmcgcG9zdG1ldGhvZCB3aXRoIHR5cGVkcm91dGVyIik7CiAgICAgICAgfQogICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNBcmc7CiAgICAgIH0KICAgICAgYXN5bmMgcG9zdChwYXlsb2FkQXJnKSB7CiAgICAgICAgbGV0IHJlc3BvbnNlSW50ZXJlc3Q7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50eXBlZFJvdXRlclJlZikgewogICAgICAgICAgcmVzcG9uc2VJbnRlcmVzdCA9IGF3YWl0IHRoaXMub3B0aW9ucy50eXBlZFJvdXRlclJlZi5maXJlRXZlbnRJbnRlcmVzdE1hcC5hZGRJbnRlcmVzdChwYXlsb2FkQXJnLmNvcnJlbGF0aW9uLmlkLCBwYXlsb2FkQXJnKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcG9zdE1ldGhvZCA9IHRoaXMub3B0aW9ucy5wb3N0TWV0aG9kIHx8IHRoaXMub3B0aW9ucy5wb3N0TWV0aG9kV2l0aFR5cGVkUm91dGVyOwogICAgICAgIGNvbnN0IHBvc3RNZXRob2RSZXR1cm5WYWx1ZSA9IGF3YWl0IHBvc3RNZXRob2QocGF5bG9hZEFyZyk7CiAgICAgICAgbGV0IHJlc3BvbnNlQm9keTsKICAgICAgICBpZiAocmVzcG9uc2VJbnRlcmVzdCkgewogICAgICAgICAgcmVzcG9uc2VCb2R5ID0gYXdhaXQgcmVzcG9uc2VJbnRlcmVzdC5pbnRlcmVzdEZ1bGxmaWxsZWQ7CiAgICAgICAgfSBlbHNlIGlmIChwb3N0TWV0aG9kUmV0dXJuVmFsdWUpIHsKICAgICAgICAgIHJlc3BvbnNlQm9keSA9IHBvc3RNZXRob2RSZXR1cm5WYWx1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzcG9uc2VCb2R5ID0gcGF5bG9hZEFyZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3BvbnNlQm9keTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkcmVxdWVzdEAzLjMuMC9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRyZXF1ZXN0L2Rpc3RfdHMvY2xhc3Nlcy50eXBlZHJlcXVlc3QuanMKZnVuY3Rpb24gY2FsbEdsb2JhbEhvb2soaG9va05hbWUsIGVudHJ5KSB7CiAgdHJ5IHsKICAgIFR5cGVkUm91dGVyLmdsb2JhbEhvb2tzW2hvb2tOYW1lXT8uKGVudHJ5KTsKICB9IGNhdGNoIChlcnIpIHsKICAgIGNvbnNvbGUuZXJyb3IoYFR5cGVkUmVxdWVzdCBob29rIGVycm9yICgke2hvb2tOYW1lfSk6YCwgZXJyKTsKICB9Cn0KdmFyIHdlYnJlcXVlc3RJbnN0YW5jZSwgVHlwZWRSZXF1ZXN0Owp2YXIgaW5pdF9jbGFzc2VzX3R5cGVkcmVxdWVzdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkcmVxdWVzdEAzLjMuMC9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRyZXF1ZXN0L2Rpc3RfdHMvY2xhc3Nlcy50eXBlZHJlcXVlc3QuanMiKCkgewogICAgaW5pdF9wbHVnaW5zKCk7CiAgICBpbml0X2NsYXNzZXNfdmlydHVhbHN0cmVhbSgpOwogICAgaW5pdF9jbGFzc2VzX3R5cGVkcmVzcG9uc2VlcnJvcigpOwogICAgaW5pdF9jbGFzc2VzX3R5cGVkcm91dGVyKCk7CiAgICBpbml0X2NsYXNzZXNfdHlwZWR0YXJnZXQoKTsKICAgIHdlYnJlcXVlc3RJbnN0YW5jZSA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxOC5XZWJyZXF1ZXN0Q2xpZW50KCk7CiAgICBUeXBlZFJlcXVlc3QgPSBjbGFzcyB7CiAgICAgIC8qKgogICAgICAgKiBAcGFyYW0gcG9zdEVuZFBvaW50QXJnCiAgICAgICAqIEBwYXJhbSBtZXRob2RBcmcKICAgICAgICovCiAgICAgIGNvbnN0cnVjdG9yKHBvc3RUYXJnZXQsIG1ldGhvZEFyZykgewogICAgICAgIHRoaXMuc2tpcEhvb2tzID0gZmFsc2U7CiAgICAgICAgaWYgKHR5cGVvZiBwb3N0VGFyZ2V0ID09PSAic3RyaW5nIikgewogICAgICAgICAgdGhpcy51cmxFbmRQb2ludCA9IHBvc3RUYXJnZXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMudHlwZWRUYXJnZXQgPSBwb3N0VGFyZ2V0OwogICAgICAgIH0KICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZEFyZzsKICAgICAgfQogICAgICAvKioKICAgICAgICogZmlyZXMgdGhlIHJlcXVlc3QKICAgICAgICovCiAgICAgIGFzeW5jIGZpcmUoZmlyZUFyZywgdXNlQ2FjaGVBcmcgPSBmYWxzZSkgewogICAgICAgIGNvbnN0IHJlcXVlc3RTdGFydFRpbWUgPSBEYXRlLm5vdygpOwogICAgICAgIGxldCBwYXlsb2FkU2VuZGluZyA9IHsKICAgICAgICAgIG1ldGhvZDogdGhpcy5tZXRob2QsCiAgICAgICAgICByZXF1ZXN0OiBmaXJlQXJnLAogICAgICAgICAgcmVzcG9uc2U6IG51bGwsCiAgICAgICAgICBjb3JyZWxhdGlvbjogewogICAgICAgICAgICBpZDogaXNvdW5pcXVlMi51bmkoKSwKICAgICAgICAgICAgcGhhc2U6ICJyZXF1ZXN0IgogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcGF5bG9hZFNlbmRpbmcgPSBWaXJ0dWFsU3RyZWFtLmVuY29kZVBheWxvYWRGb3JOZXR3b3JrKHBheWxvYWRTZW5kaW5nLCB7CiAgICAgICAgICBzZW5kTWV0aG9kOiAocGF5bG9hZEFyZykgPT4gewogICAgICAgICAgICByZXR1cm4gdGhpcy5wb3N0VHJPYmplY3QocGF5bG9hZEFyZyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKCF0aGlzLnNraXBIb29rcykgewogICAgICAgICAgY2FsbEdsb2JhbEhvb2soIm9uT3V0Z29pbmdSZXF1ZXN0IiwgewogICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBwYXlsb2FkU2VuZGluZy5jb3JyZWxhdGlvbi5pZCwKICAgICAgICAgICAgbWV0aG9kOiB0aGlzLm1ldGhvZCwKICAgICAgICAgICAgZGlyZWN0aW9uOiAib3V0Z29pbmciLAogICAgICAgICAgICBwaGFzZTogInJlcXVlc3QiLAogICAgICAgICAgICB0aW1lc3RhbXA6IHJlcXVlc3RTdGFydFRpbWUsCiAgICAgICAgICAgIHBheWxvYWQ6IGZpcmVBcmcKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBsZXQgcGF5bG9hZFJlY2VpdmluZzsKICAgICAgICBwYXlsb2FkUmVjZWl2aW5nID0gYXdhaXQgdGhpcy5wb3N0VHJPYmplY3QocGF5bG9hZFNlbmRpbmcsIHVzZUNhY2hlQXJnKTsKICAgICAgICBwYXlsb2FkUmVjZWl2aW5nID0gVmlydHVhbFN0cmVhbS5kZWNvZGVQYXlsb2FkRnJvbU5ldHdvcmsocGF5bG9hZFJlY2VpdmluZywgewogICAgICAgICAgc2VuZE1ldGhvZDogKHBheWxvYWRBcmcpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zdFRyT2JqZWN0KHBheWxvYWRBcmcpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmICghdGhpcy5za2lwSG9va3MpIHsKICAgICAgICAgIGNhbGxHbG9iYWxIb29rKCJvbkluY29taW5nUmVzcG9uc2UiLCB7CiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHBheWxvYWRTZW5kaW5nLmNvcnJlbGF0aW9uLmlkLAogICAgICAgICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLAogICAgICAgICAgICBkaXJlY3Rpb246ICJpbmNvbWluZyIsCiAgICAgICAgICAgIHBoYXNlOiAicmVzcG9uc2UiLAogICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksCiAgICAgICAgICAgIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSByZXF1ZXN0U3RhcnRUaW1lLAogICAgICAgICAgICBwYXlsb2FkOiBwYXlsb2FkUmVjZWl2aW5nPy5yZXNwb25zZSwKICAgICAgICAgICAgZXJyb3I6IHBheWxvYWRSZWNlaXZpbmc/LmVycm9yPy50ZXh0CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBheWxvYWRSZWNlaXZpbmcucmVzcG9uc2U7CiAgICAgIH0KICAgICAgYXN5bmMgcG9zdFRyT2JqZWN0KHBheWxvYWRTZW5kaW5nQXJnLCB1c2VDYWNoZUFyZyA9IGZhbHNlKSB7CiAgICAgICAgbGV0IHBheWxvYWRSZWNlaXZpbmc7CiAgICAgICAgaWYgKHRoaXMudXJsRW5kUG9pbnQpIHsKICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2VicmVxdWVzdEluc3RhbmNlLnBvc3RKc29uKHRoaXMudXJsRW5kUG9pbnQsIHBheWxvYWRTZW5kaW5nQXJnLCB1c2VDYWNoZUFyZyA/IHsgY2FjaGVTdHJhdGVneTogImNhY2hlLWZpcnN0IiB9IDoge30pOwogICAgICAgICAgcGF5bG9hZFJlY2VpdmluZyA9IHJlc3BvbnNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwYXlsb2FkUmVjZWl2aW5nID0gYXdhaXQgdGhpcy50eXBlZFRhcmdldC5wb3N0KHBheWxvYWRTZW5kaW5nQXJnKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBheWxvYWRSZWNlaXZpbmcuZXJyb3IpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYG1ldGhvZDogPj4ke3RoaXMubWV0aG9kfTw8IGdvdCBhbiBFUlJPUjogIiR7cGF5bG9hZFJlY2VpdmluZy5lcnJvci50ZXh0fSIgd2l0aCBkYXRhICR7SlNPTi5zdHJpbmdpZnkocGF5bG9hZFJlY2VpdmluZy5lcnJvci5kYXRhLCBudWxsLCAyKX1gKTsKICAgICAgICAgIGlmICghcGF5bG9hZFJlY2VpdmluZy5yZXRyeSkgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZWRSZXNwb25zZUVycm9yKHBheWxvYWRSZWNlaXZpbmcuZXJyb3IudGV4dCwgcGF5bG9hZFJlY2VpdmluZy5lcnJvci5kYXRhKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAocGF5bG9hZFJlY2VpdmluZy5yZXRyeSkgewogICAgICAgICAgY29uc29sZS5sb2coYHNlcnZlciByZXF1ZXN0ZWQgcmV0cnkgZm9yIHRoZSBmb2xsb3dpbmcgcmVhc29uOiAke3BheWxvYWRSZWNlaXZpbmcucmV0cnkucmVhc29ufWApOwogICAgICAgICAgYXdhaXQgZGlzdF90c19leHBvcnRzMy5kZWxheUZvcihwYXlsb2FkUmVjZWl2aW5nLnJldHJ5LndhaXRGb3JNcyk7CiAgICAgICAgICBwYXlsb2FkUmVjZWl2aW5nID0gYXdhaXQgdGhpcy5wb3N0VHJPYmplY3QocGF5bG9hZFNlbmRpbmdBcmcsIHVzZUNhY2hlQXJnKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBheWxvYWRSZWNlaXZpbmc7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AYXBpLmdsb2JhbCt0eXBlZHJlcXVlc3RAMy4zLjAvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkcmVxdWVzdC9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMxOSA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMxOSwgewogIFR5cGVkSGFuZGxlcjogKCkgPT4gVHlwZWRIYW5kbGVyLAogIFR5cGVkUmVxdWVzdDogKCkgPT4gVHlwZWRSZXF1ZXN0LAogIFR5cGVkUmVzcG9uc2VFcnJvcjogKCkgPT4gVHlwZWRSZXNwb25zZUVycm9yLAogIFR5cGVkUm91dGVyOiAoKSA9PiBUeXBlZFJvdXRlciwKICBUeXBlZFRhcmdldDogKCkgPT4gVHlwZWRUYXJnZXQsCiAgVmlydHVhbFN0cmVhbTogKCkgPT4gVmlydHVhbFN0cmVhbQp9KTsKdmFyIGluaXRfZGlzdF90czE5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGFwaS5nbG9iYWwrdHlwZWRyZXF1ZXN0QDMuMy4wL25vZGVfbW9kdWxlcy9AYXBpLmdsb2JhbC90eXBlZHJlcXVlc3QvZGlzdF90cy9pbmRleC5qcyIoKSB7CiAgICBpbml0X2NsYXNzZXNfdHlwZWRyZXF1ZXN0KCk7CiAgICBpbml0X2NsYXNzZXNfdHlwZWRoYW5kbGVyKCk7CiAgICBpbml0X2NsYXNzZXNfdHlwZWRyb3V0ZXIoKTsKICAgIGluaXRfY2xhc3Nlc190eXBlZHJlc3BvbnNlZXJyb3IoKTsKICAgIGluaXRfY2xhc3Nlc190eXBlZHRhcmdldCgpOwogICAgaW5pdF9jbGFzc2VzX3ZpcnR1YWxzdHJlYW0oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Jyb2FkY2FzdC1jaGFubmVsQDcuMy4wL25vZGVfbW9kdWxlcy9icm9hZGNhc3QtY2hhbm5lbC9kaXN0L2VzYnJvd3Nlci91dGlsLmpzCmZ1bmN0aW9uIGlzUHJvbWlzZTIob2JqKSB7CiAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqLnRoZW4gPT09ICJmdW5jdGlvbiI7Cn0KZnVuY3Rpb24gc2xlZXAodGltZSwgcmVzb2x2ZVdpdGgpIHsKICBpZiAoIXRpbWUpIHRpbWUgPSAwOwogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMpIHsKICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gcmVzKHJlc29sdmVXaXRoKTsKICAgIH0sIHRpbWUpOwogIH0pOwp9CmZ1bmN0aW9uIHJhbmRvbUludChtaW4zLCBtYXgzKSB7CiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXgzIC0gbWluMyArIDEpICsgbWluMyk7Cn0KZnVuY3Rpb24gcmFuZG9tVG9rZW4oKSB7CiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyKTsKfQpmdW5jdGlvbiBtaWNyb1NlY29uZHMoKSB7CiAgdmFyIHJldCA9IERhdGUubm93KCkgKiAxZTM7CiAgaWYgKHJldCA8PSBsYXN0TXMpIHsKICAgIHJldCA9IGxhc3RNcyArIDE7CiAgfQogIGxhc3RNcyA9IHJldDsKICByZXR1cm4gcmV0Owp9CmZ1bmN0aW9uIHN1cHBvcnRzV2ViTG9ja0FQSSgpIHsKICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gInVuZGVmaW5lZCIgJiYgdHlwZW9mIG5hdmlnYXRvci5sb2NrcyAhPT0gInVuZGVmaW5lZCIgJiYgdHlwZW9mIG5hdmlnYXRvci5sb2Nrcy5yZXF1ZXN0ID09PSAiZnVuY3Rpb24iKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9IGVsc2UgewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQp2YXIgUFJPTUlTRV9SRVNPTFZFRF9GQUxTRSwgUFJPTUlTRV9SRVNPTFZFRF9UUlVFLCBQUk9NSVNFX1JFU09MVkVEX1ZPSUQsIGxhc3RNczsKdmFyIGluaXRfdXRpbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2Jyb2FkY2FzdC1jaGFubmVsQDcuMy4wL25vZGVfbW9kdWxlcy9icm9hZGNhc3QtY2hhbm5lbC9kaXN0L2VzYnJvd3Nlci91dGlsLmpzIigpIHsKICAgIFBST01JU0VfUkVTT0xWRURfRkFMU0UgPSBQcm9taXNlLnJlc29sdmUoZmFsc2UpOwogICAgUFJPTUlTRV9SRVNPTFZFRF9UUlVFID0gUHJvbWlzZS5yZXNvbHZlKHRydWUpOwogICAgUFJPTUlTRV9SRVNPTFZFRF9WT0lEID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICBsYXN0TXMgPSAwOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL21ldGhvZHMvbmF0aXZlLmpzCmZ1bmN0aW9uIGNyZWF0ZShjaGFubmVsTmFtZSkgewogIHZhciBzdGF0ZTEwID0gewogICAgdGltZTogbWljcm9TZWNvbmRzKCksCiAgICBtZXNzYWdlc0NhbGxiYWNrOiBudWxsLAogICAgYmM6IG5ldyBCcm9hZGNhc3RDaGFubmVsKGNoYW5uZWxOYW1lKSwKICAgIHN1YkZuczogW10KICAgIC8vIHN1YnNjcmliZXJGdW5jdGlvbnMKICB9OwogIHN0YXRlMTAuYmMub25tZXNzYWdlID0gZnVuY3Rpb24obXNnRXZlbnQpIHsKICAgIGlmIChzdGF0ZTEwLm1lc3NhZ2VzQ2FsbGJhY2spIHsKICAgICAgc3RhdGUxMC5tZXNzYWdlc0NhbGxiYWNrKG1zZ0V2ZW50LmRhdGEpOwogICAgfQogIH07CiAgcmV0dXJuIHN0YXRlMTA7Cn0KZnVuY3Rpb24gY2xvc2UoY2hhbm5lbFN0YXRlKSB7CiAgY2hhbm5lbFN0YXRlLmJjLmNsb3NlKCk7CiAgY2hhbm5lbFN0YXRlLnN1YkZucyA9IFtdOwp9CmZ1bmN0aW9uIHBvc3RNZXNzYWdlKGNoYW5uZWxTdGF0ZSwgbWVzc2FnZUpzb24pIHsKICB0cnkgewogICAgY2hhbm5lbFN0YXRlLmJjLnBvc3RNZXNzYWdlKG1lc3NhZ2VKc29uLCBmYWxzZSk7CiAgICByZXR1cm4gUFJPTUlTRV9SRVNPTFZFRF9WT0lEOwogIH0gY2F0Y2ggKGVycikgewogICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7CiAgfQp9CmZ1bmN0aW9uIG9uTWVzc2FnZShjaGFubmVsU3RhdGUsIGZuKSB7CiAgY2hhbm5lbFN0YXRlLm1lc3NhZ2VzQ2FsbGJhY2sgPSBmbjsKfQpmdW5jdGlvbiBjYW5CZVVzZWQoKSB7CiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAidW5kZWZpbmVkIiAmJiBnbG9iYWxUaGlzLkRlbm8gJiYgZ2xvYmFsVGhpcy5EZW5vLmFyZ3MpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBpZiAoKHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiIHx8IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIikgJiYgdHlwZW9mIEJyb2FkY2FzdENoYW5uZWwgPT09ICJmdW5jdGlvbiIpIHsKICAgIGlmIChCcm9hZGNhc3RDaGFubmVsLl9wdWJrZXkpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJCcm9hZGNhc3RDaGFubmVsOiBEbyBub3Qgb3ZlcndyaXRlIHdpbmRvdy5Ccm9hZGNhc3RDaGFubmVsIHdpdGggdGhpcyBtb2R1bGUsIHRoaXMgaXMgbm90IGEgcG9seWZpbGwiKTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0gZWxzZSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CmZ1bmN0aW9uIGF2ZXJhZ2VSZXNwb25zZVRpbWUoKSB7CiAgcmV0dXJuIDE1MDsKfQp2YXIgbWljcm9TZWNvbmRzMiwgdHlwZSwgTmF0aXZlTWV0aG9kOwp2YXIgaW5pdF9uYXRpdmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvbWV0aG9kcy9uYXRpdmUuanMiKCkgewogICAgaW5pdF91dGlsKCk7CiAgICBtaWNyb1NlY29uZHMyID0gbWljcm9TZWNvbmRzOwogICAgdHlwZSA9ICJuYXRpdmUiOwogICAgTmF0aXZlTWV0aG9kID0gewogICAgICBjcmVhdGUsCiAgICAgIGNsb3NlLAogICAgICBvbk1lc3NhZ2UsCiAgICAgIHBvc3RNZXNzYWdlLAogICAgICBjYW5CZVVzZWQsCiAgICAgIHR5cGUsCiAgICAgIGF2ZXJhZ2VSZXNwb25zZVRpbWUsCiAgICAgIG1pY3JvU2Vjb25kczogbWljcm9TZWNvbmRzMgogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL29ibGl2aW91cy1zZXRAMi4wLjAvbm9kZV9tb2R1bGVzL29ibGl2aW91cy1zZXQvZGlzdC9lc20vc3JjL2luZGV4LmpzCmZ1bmN0aW9uIHJlbW92ZVRvb09sZFZhbHVlcyhvYmxpdmlvdXNTZXQpIHsKICBjb25zdCBvbGRlclRoZW4gPSBub3coKSAtIG9ibGl2aW91c1NldC50dGw7CiAgY29uc3QgaXRlcmF0b3IyID0gb2JsaXZpb3VzU2V0Lm1hcFtTeW1ib2wuaXRlcmF0b3JdKCk7CiAgd2hpbGUgKHRydWUpIHsKICAgIGNvbnN0IG5leHQyID0gaXRlcmF0b3IyLm5leHQoKS52YWx1ZTsKICAgIGlmICghbmV4dDIpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjb25zdCB2YWx1ZTIgPSBuZXh0MlswXTsKICAgIGNvbnN0IHRpbWUgPSBuZXh0MlsxXTsKICAgIGlmICh0aW1lIDwgb2xkZXJUaGVuKSB7CiAgICAgIG9ibGl2aW91c1NldC5tYXAuZGVsZXRlKHZhbHVlMik7CiAgICB9IGVsc2UgewogICAgICBicmVhazsKICAgIH0KICB9Cn0KZnVuY3Rpb24gbm93KCkgewogIHJldHVybiBEYXRlLm5vdygpOwp9CnZhciBPYmxpdmlvdXNTZXQ7CnZhciBpbml0X3NyYyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL29ibGl2aW91cy1zZXRAMi4wLjAvbm9kZV9tb2R1bGVzL29ibGl2aW91cy1zZXQvZGlzdC9lc20vc3JjL2luZGV4LmpzIigpIHsKICAgIE9ibGl2aW91c1NldCA9IGNsYXNzIHsKICAgICAgdHRsOwogICAgICBtYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICAvKioKICAgICAgICogQ3JlYXRpbmcgY2FsbHMgdG8gc2V0VGltZW91dCgpIGlzIGV4cGVuc2l2ZSwKICAgICAgICogc28gd2Ugb25seSBkbyB0aGF0IGlmIHRoZXJlIGlzIG5vdCB0aW1lb3V0IGFscmVhZHkgb3Blbi4KICAgICAgICovCiAgICAgIF90byA9IGZhbHNlOwogICAgICBjb25zdHJ1Y3Rvcih0dGwpIHsKICAgICAgICB0aGlzLnR0bCA9IHR0bDsKICAgICAgfQogICAgICBoYXModmFsdWUyKSB7CiAgICAgICAgY29uc3QgdmFsdWVUaW1lID0gdGhpcy5tYXAuZ2V0KHZhbHVlMik7CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZVRpbWUgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICh2YWx1ZVRpbWUgPCBub3coKSAtIHRoaXMudHRsKSB7CiAgICAgICAgICB0aGlzLm1hcC5kZWxldGUodmFsdWUyKTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgYWRkKHZhbHVlMikgewogICAgICAgIHRoaXMubWFwLmRlbGV0ZSh2YWx1ZTIpOwogICAgICAgIHRoaXMubWFwLnNldCh2YWx1ZTIsIG5vdygpKTsKICAgICAgICBpZiAoIXRoaXMuX3RvKSB7CiAgICAgICAgICB0aGlzLl90byA9IHRydWU7CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgdGhpcy5fdG8gPSBmYWxzZTsKICAgICAgICAgICAgcmVtb3ZlVG9vT2xkVmFsdWVzKHRoaXMpOwogICAgICAgICAgfSwgMCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNsZWFyKCkgewogICAgICAgIHRoaXMubWFwLmNsZWFyKCk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvb3B0aW9ucy5qcwpmdW5jdGlvbiBmaWxsT3B0aW9uc1dpdGhEZWZhdWx0cygpIHsKICB2YXIgb3JpZ2luYWxPcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB2b2lkIDAgPyBhcmd1bWVudHNbMF0gOiB7fTsKICB2YXIgb3B0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob3JpZ2luYWxPcHRpb25zKSk7CiAgaWYgKHR5cGVvZiBvcHRpb25zLndlYldvcmtlclN1cHBvcnQgPT09ICJ1bmRlZmluZWQiKSBvcHRpb25zLndlYldvcmtlclN1cHBvcnQgPSB0cnVlOwogIGlmICghb3B0aW9ucy5pZGIpIG9wdGlvbnMuaWRiID0ge307CiAgaWYgKCFvcHRpb25zLmlkYi50dGwpIG9wdGlvbnMuaWRiLnR0bCA9IDFlMyAqIDQ1OwogIGlmICghb3B0aW9ucy5pZGIuZmFsbGJhY2tJbnRlcnZhbCkgb3B0aW9ucy5pZGIuZmFsbGJhY2tJbnRlcnZhbCA9IDE1MDsKICBpZiAob3JpZ2luYWxPcHRpb25zLmlkYiAmJiB0eXBlb2Ygb3JpZ2luYWxPcHRpb25zLmlkYi5vbmNsb3NlID09PSAiZnVuY3Rpb24iKSBvcHRpb25zLmlkYi5vbmNsb3NlID0gb3JpZ2luYWxPcHRpb25zLmlkYi5vbmNsb3NlOwogIGlmICghb3B0aW9ucy5sb2NhbHN0b3JhZ2UpIG9wdGlvbnMubG9jYWxzdG9yYWdlID0ge307CiAgaWYgKCFvcHRpb25zLmxvY2Fsc3RvcmFnZS5yZW1vdmVUaW1lb3V0KSBvcHRpb25zLmxvY2Fsc3RvcmFnZS5yZW1vdmVUaW1lb3V0ID0gMWUzICogNjA7CiAgaWYgKG9yaWdpbmFsT3B0aW9ucy5tZXRob2RzKSBvcHRpb25zLm1ldGhvZHMgPSBvcmlnaW5hbE9wdGlvbnMubWV0aG9kczsKICBpZiAoIW9wdGlvbnMubm9kZSkgb3B0aW9ucy5ub2RlID0ge307CiAgaWYgKCFvcHRpb25zLm5vZGUudHRsKSBvcHRpb25zLm5vZGUudHRsID0gMWUzICogNjAgKiAyOwogIGlmICghb3B0aW9ucy5ub2RlLm1heFBhcmFsbGVsV3JpdGVzKSBvcHRpb25zLm5vZGUubWF4UGFyYWxsZWxXcml0ZXMgPSAyMDQ4OwogIGlmICh0eXBlb2Ygb3B0aW9ucy5ub2RlLnVzZUZhc3RQYXRoID09PSAidW5kZWZpbmVkIikgb3B0aW9ucy5ub2RlLnVzZUZhc3RQYXRoID0gdHJ1ZTsKICByZXR1cm4gb3B0aW9uczsKfQp2YXIgaW5pdF9vcHRpb25zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL29wdGlvbnMuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL21ldGhvZHMvaW5kZXhlZC1kYi5qcwpmdW5jdGlvbiBnZXRJZGIoKSB7CiAgaWYgKHR5cGVvZiBpbmRleGVkREIgIT09ICJ1bmRlZmluZWQiKSByZXR1cm4gaW5kZXhlZERCOwogIGlmICh0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIikgewogICAgaWYgKHR5cGVvZiB3aW5kb3cubW96SW5kZXhlZERCICE9PSAidW5kZWZpbmVkIikgcmV0dXJuIHdpbmRvdy5tb3pJbmRleGVkREI7CiAgICBpZiAodHlwZW9mIHdpbmRvdy53ZWJraXRJbmRleGVkREIgIT09ICJ1bmRlZmluZWQiKSByZXR1cm4gd2luZG93LndlYmtpdEluZGV4ZWREQjsKICAgIGlmICh0eXBlb2Ygd2luZG93Lm1zSW5kZXhlZERCICE9PSAidW5kZWZpbmVkIikgcmV0dXJuIHdpbmRvdy5tc0luZGV4ZWREQjsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGNvbW1pdEluZGV4ZWREQlRyYW5zYWN0aW9uKHR4KSB7CiAgaWYgKHR4LmNvbW1pdCkgewogICAgdHguY29tbWl0KCk7CiAgfQp9CmZ1bmN0aW9uIGNyZWF0ZURhdGFiYXNlKGNoYW5uZWxOYW1lKSB7CiAgdmFyIEluZGV4ZWREQiA9IGdldElkYigpOwogIHZhciBkYk5hbWUgPSBEQl9QUkVGSVggKyBjaGFubmVsTmFtZTsKICB2YXIgb3BlblJlcXVlc3QgPSBJbmRleGVkREIub3BlbihkYk5hbWUpOwogIG9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IGZ1bmN0aW9uKGV2KSB7CiAgICB2YXIgZGIgPSBldi50YXJnZXQucmVzdWx0OwogICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoT0JKRUNUX1NUT1JFX0lELCB7CiAgICAgIGtleVBhdGg6ICJpZCIsCiAgICAgIGF1dG9JbmNyZW1lbnQ6IHRydWUKICAgIH0pOwogIH07CiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcywgcmVqKSB7CiAgICBvcGVuUmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24oZXYpIHsKICAgICAgcmV0dXJuIHJlaihldik7CiAgICB9OwogICAgb3BlblJlcXVlc3Qub25zdWNjZXNzID0gZnVuY3Rpb24oKSB7CiAgICAgIHJlcyhvcGVuUmVxdWVzdC5yZXN1bHQpOwogICAgfTsKICB9KTsKfQpmdW5jdGlvbiB3cml0ZU1lc3NhZ2UoZGIsIHJlYWRlclV1aWQsIG1lc3NhZ2VKc29uKSB7CiAgdmFyIHRpbWUgPSBEYXRlLm5vdygpOwogIHZhciB3cml0ZU9iamVjdCA9IHsKICAgIHV1aWQ6IHJlYWRlclV1aWQsCiAgICB0aW1lLAogICAgZGF0YTogbWVzc2FnZUpzb24KICB9OwogIHZhciB0eCA9IGRiLnRyYW5zYWN0aW9uKFtPQkpFQ1RfU1RPUkVfSURdLCAicmVhZHdyaXRlIiwgVFJBTlNBQ1RJT05fU0VUVElOR1MpOwogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMsIHJlaikgewogICAgdHgub25jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gcmVzKCk7CiAgICB9OwogICAgdHgub25lcnJvciA9IGZ1bmN0aW9uKGV2KSB7CiAgICAgIHJldHVybiByZWooZXYpOwogICAgfTsKICAgIHZhciBvYmplY3RTdG9yZSA9IHR4Lm9iamVjdFN0b3JlKE9CSkVDVF9TVE9SRV9JRCk7CiAgICBvYmplY3RTdG9yZS5hZGQod3JpdGVPYmplY3QpOwogICAgY29tbWl0SW5kZXhlZERCVHJhbnNhY3Rpb24odHgpOwogIH0pOwp9CmZ1bmN0aW9uIGdldEFsbE1lc3NhZ2VzKGRiKSB7CiAgdmFyIHR4ID0gZGIudHJhbnNhY3Rpb24oT0JKRUNUX1NUT1JFX0lELCAicmVhZG9ubHkiLCBUUkFOU0FDVElPTl9TRVRUSU5HUyk7CiAgdmFyIG9iamVjdFN0b3JlID0gdHgub2JqZWN0U3RvcmUoT0JKRUNUX1NUT1JFX0lEKTsKICB2YXIgcmV0ID0gW107CiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcykgewogICAgb2JqZWN0U3RvcmUub3BlbkN1cnNvcigpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uKGV2KSB7CiAgICAgIHZhciBjdXJzb3IgPSBldi50YXJnZXQucmVzdWx0OwogICAgICBpZiAoY3Vyc29yKSB7CiAgICAgICAgcmV0LnB1c2goY3Vyc29yLnZhbHVlKTsKICAgICAgICBjdXJzb3JbImNvbnRpbnVlIl0oKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb21taXRJbmRleGVkREJUcmFuc2FjdGlvbih0eCk7CiAgICAgICAgcmVzKHJldCk7CiAgICAgIH0KICAgIH07CiAgfSk7Cn0KZnVuY3Rpb24gZ2V0TWVzc2FnZXNIaWdoZXJUaGFuKGRiLCBsYXN0Q3Vyc29ySWQpIHsKICB2YXIgdHggPSBkYi50cmFuc2FjdGlvbihPQkpFQ1RfU1RPUkVfSUQsICJyZWFkb25seSIsIFRSQU5TQUNUSU9OX1NFVFRJTkdTKTsKICB2YXIgb2JqZWN0U3RvcmUgPSB0eC5vYmplY3RTdG9yZShPQkpFQ1RfU1RPUkVfSUQpOwogIHZhciByZXQgPSBbXTsKICB2YXIga2V5UmFuZ2VWYWx1ZSA9IElEQktleVJhbmdlLmJvdW5kKGxhc3RDdXJzb3JJZCArIDEsIEluZmluaXR5KTsKICBpZiAob2JqZWN0U3RvcmUuZ2V0QWxsKSB7CiAgICB2YXIgZ2V0QWxsUmVxdWVzdCA9IG9iamVjdFN0b3JlLmdldEFsbChrZXlSYW5nZVZhbHVlKTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMsIHJlaikgewogICAgICBnZXRBbGxSZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbihlcnIpIHsKICAgICAgICByZXR1cm4gcmVqKGVycik7CiAgICAgIH07CiAgICAgIGdldEFsbFJlcXVlc3Qub25zdWNjZXNzID0gZnVuY3Rpb24oZTExKSB7CiAgICAgICAgcmVzKGUxMS50YXJnZXQucmVzdWx0KTsKICAgICAgfTsKICAgIH0pOwogIH0KICBmdW5jdGlvbiBvcGVuQ3Vyc29yKCkgewogICAgdHJ5IHsKICAgICAga2V5UmFuZ2VWYWx1ZSA9IElEQktleVJhbmdlLmJvdW5kKGxhc3RDdXJzb3JJZCArIDEsIEluZmluaXR5KTsKICAgICAgcmV0dXJuIG9iamVjdFN0b3JlLm9wZW5DdXJzb3Ioa2V5UmFuZ2VWYWx1ZSk7CiAgICB9IGNhdGNoIChlMTEpIHsKICAgICAgcmV0dXJuIG9iamVjdFN0b3JlLm9wZW5DdXJzb3IoKTsKICAgIH0KICB9CiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcywgcmVqKSB7CiAgICB2YXIgb3BlbkN1cnNvclJlcXVlc3QgPSBvcGVuQ3Vyc29yKCk7CiAgICBvcGVuQ3Vyc29yUmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24oZXJyKSB7CiAgICAgIHJldHVybiByZWooZXJyKTsKICAgIH07CiAgICBvcGVuQ3Vyc29yUmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbihldikgewogICAgICB2YXIgY3Vyc29yID0gZXYudGFyZ2V0LnJlc3VsdDsKICAgICAgaWYgKGN1cnNvcikgewogICAgICAgIGlmIChjdXJzb3IudmFsdWUuaWQgPCBsYXN0Q3Vyc29ySWQgKyAxKSB7CiAgICAgICAgICBjdXJzb3JbImNvbnRpbnVlIl0obGFzdEN1cnNvcklkICsgMSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldC5wdXNoKGN1cnNvci52YWx1ZSk7CiAgICAgICAgICBjdXJzb3JbImNvbnRpbnVlIl0oKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29tbWl0SW5kZXhlZERCVHJhbnNhY3Rpb24odHgpOwogICAgICAgIHJlcyhyZXQpOwogICAgICB9CiAgICB9OwogIH0pOwp9CmZ1bmN0aW9uIHJlbW92ZU1lc3NhZ2VzQnlJZChjaGFubmVsU3RhdGUsIGlkcykgewogIGlmIChjaGFubmVsU3RhdGUuY2xvc2VkKSB7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTsKICB9CiAgdmFyIHR4ID0gY2hhbm5lbFN0YXRlLmRiLnRyYW5zYWN0aW9uKE9CSkVDVF9TVE9SRV9JRCwgInJlYWR3cml0ZSIsIFRSQU5TQUNUSU9OX1NFVFRJTkdTKTsKICB2YXIgb2JqZWN0U3RvcmUgPSB0eC5vYmplY3RTdG9yZShPQkpFQ1RfU1RPUkVfSUQpOwogIHJldHVybiBQcm9taXNlLmFsbChpZHMubWFwKGZ1bmN0aW9uKGlkKSB7CiAgICB2YXIgZGVsZXRlUmVxdWVzdCA9IG9iamVjdFN0b3JlWyJkZWxldGUiXShpZCk7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzKSB7CiAgICAgIGRlbGV0ZVJlcXVlc3Qub25zdWNjZXNzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHJlcygpOwogICAgICB9OwogICAgfSk7CiAgfSkpOwp9CmZ1bmN0aW9uIGdldE9sZE1lc3NhZ2VzKGRiLCB0dGwpIHsKICB2YXIgb2xkZXJUaGVuID0gRGF0ZS5ub3coKSAtIHR0bDsKICB2YXIgdHggPSBkYi50cmFuc2FjdGlvbihPQkpFQ1RfU1RPUkVfSUQsICJyZWFkb25seSIsIFRSQU5TQUNUSU9OX1NFVFRJTkdTKTsKICB2YXIgb2JqZWN0U3RvcmUgPSB0eC5vYmplY3RTdG9yZShPQkpFQ1RfU1RPUkVfSUQpOwogIHZhciByZXQgPSBbXTsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzKSB7CiAgICBvYmplY3RTdG9yZS5vcGVuQ3Vyc29yKCkub25zdWNjZXNzID0gZnVuY3Rpb24oZXYpIHsKICAgICAgdmFyIGN1cnNvciA9IGV2LnRhcmdldC5yZXN1bHQ7CiAgICAgIGlmIChjdXJzb3IpIHsKICAgICAgICB2YXIgbXNnT2JrID0gY3Vyc29yLnZhbHVlOwogICAgICAgIGlmIChtc2dPYmsudGltZSA8IG9sZGVyVGhlbikgewogICAgICAgICAgcmV0LnB1c2gobXNnT2JrKTsKICAgICAgICAgIGN1cnNvclsiY29udGludWUiXSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb21taXRJbmRleGVkREJUcmFuc2FjdGlvbih0eCk7CiAgICAgICAgICByZXMocmV0KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzKHJldCk7CiAgICAgIH0KICAgIH07CiAgfSk7Cn0KZnVuY3Rpb24gY2xlYW5PbGRNZXNzYWdlcyhjaGFubmVsU3RhdGUpIHsKICByZXR1cm4gZ2V0T2xkTWVzc2FnZXMoY2hhbm5lbFN0YXRlLmRiLCBjaGFubmVsU3RhdGUub3B0aW9ucy5pZGIudHRsKS50aGVuKGZ1bmN0aW9uKHRvb09sZCkgewogICAgcmV0dXJuIHJlbW92ZU1lc3NhZ2VzQnlJZChjaGFubmVsU3RhdGUsIHRvb09sZC5tYXAoZnVuY3Rpb24obXNnKSB7CiAgICAgIHJldHVybiBtc2cuaWQ7CiAgICB9KSk7CiAgfSk7Cn0KZnVuY3Rpb24gY3JlYXRlMihjaGFubmVsTmFtZSwgb3B0aW9ucykgewogIG9wdGlvbnMgPSBmaWxsT3B0aW9uc1dpdGhEZWZhdWx0cyhvcHRpb25zKTsKICByZXR1cm4gY3JlYXRlRGF0YWJhc2UoY2hhbm5lbE5hbWUpLnRoZW4oZnVuY3Rpb24oZGIpIHsKICAgIHZhciBzdGF0ZTEwID0gewogICAgICBjbG9zZWQ6IGZhbHNlLAogICAgICBsYXN0Q3Vyc29ySWQ6IDAsCiAgICAgIGNoYW5uZWxOYW1lLAogICAgICBvcHRpb25zLAogICAgICB1dWlkOiByYW5kb21Ub2tlbigpLAogICAgICAvKioKICAgICAgICogZW1pdHRlZE1lc3NhZ2VzSWRzCiAgICAgICAqIGNvbnRhaW5zIGFsbCBtZXNzYWdlcyB0aGF0IGhhdmUgYmVlbiBlbWl0dGVkIGJlZm9yZQogICAgICAgKiBAdHlwZSB7T2JsaXZpb3VzU2V0fQogICAgICAgKi8KICAgICAgZU1JczogbmV3IE9ibGl2aW91c1NldChvcHRpb25zLmlkYi50dGwgKiAyKSwKICAgICAgLy8gZW5zdXJlcyB3ZSBkbyBub3QgcmVhZCBtZXNzYWdlcyBpbiBwYXJhbGxlbAogICAgICB3cml0ZUJsb2NrUHJvbWlzZTogUFJPTUlTRV9SRVNPTFZFRF9WT0lELAogICAgICBtZXNzYWdlc0NhbGxiYWNrOiBudWxsLAogICAgICByZWFkUXVldWVQcm9taXNlczogW10sCiAgICAgIGRiCiAgICB9OwogICAgZGIub25jbG9zZSA9IGZ1bmN0aW9uKCkgewogICAgICBzdGF0ZTEwLmNsb3NlZCA9IHRydWU7CiAgICAgIGlmIChvcHRpb25zLmlkYi5vbmNsb3NlKSBvcHRpb25zLmlkYi5vbmNsb3NlKCk7CiAgICB9OwogICAgX3JlYWRMb29wKHN0YXRlMTApOwogICAgcmV0dXJuIHN0YXRlMTA7CiAgfSk7Cn0KZnVuY3Rpb24gX3JlYWRMb29wKHN0YXRlMTApIHsKICBpZiAoc3RhdGUxMC5jbG9zZWQpIHJldHVybjsKICByZWFkTmV3TWVzc2FnZXMoc3RhdGUxMCkudGhlbihmdW5jdGlvbigpIHsKICAgIHJldHVybiBzbGVlcChzdGF0ZTEwLm9wdGlvbnMuaWRiLmZhbGxiYWNrSW50ZXJ2YWwpOwogIH0pLnRoZW4oZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gX3JlYWRMb29wKHN0YXRlMTApOwogIH0pOwp9CmZ1bmN0aW9uIF9maWx0ZXJNZXNzYWdlKG1zZ09iaiwgc3RhdGUxMCkgewogIGlmIChtc2dPYmoudXVpZCA9PT0gc3RhdGUxMC51dWlkKSByZXR1cm4gZmFsc2U7CiAgaWYgKHN0YXRlMTAuZU1Jcy5oYXMobXNnT2JqLmlkKSkgcmV0dXJuIGZhbHNlOwogIGlmIChtc2dPYmouZGF0YS50aW1lIDwgc3RhdGUxMC5tZXNzYWdlc0NhbGxiYWNrVGltZSkgcmV0dXJuIGZhbHNlOwogIHJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIHJlYWROZXdNZXNzYWdlcyhzdGF0ZTEwKSB7CiAgaWYgKHN0YXRlMTAuY2xvc2VkKSByZXR1cm4gUFJPTUlTRV9SRVNPTFZFRF9WT0lEOwogIGlmICghc3RhdGUxMC5tZXNzYWdlc0NhbGxiYWNrKSByZXR1cm4gUFJPTUlTRV9SRVNPTFZFRF9WT0lEOwogIHJldHVybiBnZXRNZXNzYWdlc0hpZ2hlclRoYW4oc3RhdGUxMC5kYiwgc3RhdGUxMC5sYXN0Q3Vyc29ySWQpLnRoZW4oZnVuY3Rpb24obmV3ZXJNZXNzYWdlcykgewogICAgdmFyIHVzZU1lc3NhZ2VzID0gbmV3ZXJNZXNzYWdlcy5maWx0ZXIoZnVuY3Rpb24obXNnT2JqKSB7CiAgICAgIHJldHVybiAhIW1zZ09iajsKICAgIH0pLm1hcChmdW5jdGlvbihtc2dPYmopIHsKICAgICAgaWYgKG1zZ09iai5pZCA+IHN0YXRlMTAubGFzdEN1cnNvcklkKSB7CiAgICAgICAgc3RhdGUxMC5sYXN0Q3Vyc29ySWQgPSBtc2dPYmouaWQ7CiAgICAgIH0KICAgICAgcmV0dXJuIG1zZ09iajsKICAgIH0pLmZpbHRlcihmdW5jdGlvbihtc2dPYmopIHsKICAgICAgcmV0dXJuIF9maWx0ZXJNZXNzYWdlKG1zZ09iaiwgc3RhdGUxMCk7CiAgICB9KS5zb3J0KGZ1bmN0aW9uKG1zZ09iakEsIG1zZ09iakIpIHsKICAgICAgcmV0dXJuIG1zZ09iakEudGltZSAtIG1zZ09iakIudGltZTsKICAgIH0pOwogICAgdXNlTWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbihtc2dPYmopIHsKICAgICAgaWYgKHN0YXRlMTAubWVzc2FnZXNDYWxsYmFjaykgewogICAgICAgIHN0YXRlMTAuZU1Jcy5hZGQobXNnT2JqLmlkKTsKICAgICAgICBzdGF0ZTEwLm1lc3NhZ2VzQ2FsbGJhY2sobXNnT2JqLmRhdGEpOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiBQUk9NSVNFX1JFU09MVkVEX1ZPSUQ7CiAgfSk7Cn0KZnVuY3Rpb24gY2xvc2UyKGNoYW5uZWxTdGF0ZSkgewogIGNoYW5uZWxTdGF0ZS5jbG9zZWQgPSB0cnVlOwogIGNoYW5uZWxTdGF0ZS5kYi5jbG9zZSgpOwp9CmZ1bmN0aW9uIHBvc3RNZXNzYWdlMihjaGFubmVsU3RhdGUsIG1lc3NhZ2VKc29uKSB7CiAgY2hhbm5lbFN0YXRlLndyaXRlQmxvY2tQcm9taXNlID0gY2hhbm5lbFN0YXRlLndyaXRlQmxvY2tQcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gd3JpdGVNZXNzYWdlKGNoYW5uZWxTdGF0ZS5kYiwgY2hhbm5lbFN0YXRlLnV1aWQsIG1lc3NhZ2VKc29uKTsKICB9KS50aGVuKGZ1bmN0aW9uKCkgewogICAgaWYgKHJhbmRvbUludCgwLCAxMCkgPT09IDApIHsKICAgICAgY2xlYW5PbGRNZXNzYWdlcyhjaGFubmVsU3RhdGUpOwogICAgfQogIH0pOwogIHJldHVybiBjaGFubmVsU3RhdGUud3JpdGVCbG9ja1Byb21pc2U7Cn0KZnVuY3Rpb24gb25NZXNzYWdlMihjaGFubmVsU3RhdGUsIGZuLCB0aW1lKSB7CiAgY2hhbm5lbFN0YXRlLm1lc3NhZ2VzQ2FsbGJhY2tUaW1lID0gdGltZTsKICBjaGFubmVsU3RhdGUubWVzc2FnZXNDYWxsYmFjayA9IGZuOwogIHJlYWROZXdNZXNzYWdlcyhjaGFubmVsU3RhdGUpOwp9CmZ1bmN0aW9uIGNhbkJlVXNlZDIoKSB7CiAgcmV0dXJuICEhZ2V0SWRiKCk7Cn0KZnVuY3Rpb24gYXZlcmFnZVJlc3BvbnNlVGltZTIob3B0aW9ucykgewogIHJldHVybiBvcHRpb25zLmlkYi5mYWxsYmFja0ludGVydmFsICogMjsKfQp2YXIgbWljcm9TZWNvbmRzMywgREJfUFJFRklYLCBPQkpFQ1RfU1RPUkVfSUQsIFRSQU5TQUNUSU9OX1NFVFRJTkdTLCB0eXBlMiwgSW5kZXhlZERCTWV0aG9kOwp2YXIgaW5pdF9pbmRleGVkX2RiID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL21ldGhvZHMvaW5kZXhlZC1kYi5qcyIoKSB7CiAgICBpbml0X3V0aWwoKTsKICAgIGluaXRfc3JjKCk7CiAgICBpbml0X29wdGlvbnMoKTsKICAgIG1pY3JvU2Vjb25kczMgPSBtaWNyb1NlY29uZHM7CiAgICBEQl9QUkVGSVggPSAicHVia2V5LmJyb2FkY2FzdC1jaGFubmVsLTAtIjsKICAgIE9CSkVDVF9TVE9SRV9JRCA9ICJtZXNzYWdlcyI7CiAgICBUUkFOU0FDVElPTl9TRVRUSU5HUyA9IHsKICAgICAgZHVyYWJpbGl0eTogInJlbGF4ZWQiCiAgICB9OwogICAgdHlwZTIgPSAiaWRiIjsKICAgIEluZGV4ZWREQk1ldGhvZCA9IHsKICAgICAgY3JlYXRlOiBjcmVhdGUyLAogICAgICBjbG9zZTogY2xvc2UyLAogICAgICBvbk1lc3NhZ2U6IG9uTWVzc2FnZTIsCiAgICAgIHBvc3RNZXNzYWdlOiBwb3N0TWVzc2FnZTIsCiAgICAgIGNhbkJlVXNlZDogY2FuQmVVc2VkMiwKICAgICAgdHlwZTogdHlwZTIsCiAgICAgIGF2ZXJhZ2VSZXNwb25zZVRpbWU6IGF2ZXJhZ2VSZXNwb25zZVRpbWUyLAogICAgICBtaWNyb1NlY29uZHM6IG1pY3JvU2Vjb25kczMKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvbWV0aG9kcy9sb2NhbHN0b3JhZ2UuanMKZnVuY3Rpb24gZ2V0TG9jYWxTdG9yYWdlKCkgewogIHZhciBsb2NhbFN0b3JhZ2UyOwogIGlmICh0eXBlb2Ygd2luZG93ID09PSAidW5kZWZpbmVkIikgcmV0dXJuIG51bGw7CiAgdHJ5IHsKICAgIGxvY2FsU3RvcmFnZTIgPSB3aW5kb3cubG9jYWxTdG9yYWdlOwogICAgbG9jYWxTdG9yYWdlMiA9IHdpbmRvd1siaWU4LWV2ZW50bGlzdGVuZXIvc3RvcmFnZSJdIHx8IHdpbmRvdy5sb2NhbFN0b3JhZ2U7CiAgfSBjYXRjaCAoZTExKSB7CiAgfQogIHJldHVybiBsb2NhbFN0b3JhZ2UyOwp9CmZ1bmN0aW9uIHN0b3JhZ2VLZXkoY2hhbm5lbE5hbWUpIHsKICByZXR1cm4gS0VZX1BSRUZJWCArIGNoYW5uZWxOYW1lOwp9CmZ1bmN0aW9uIHBvc3RNZXNzYWdlMyhjaGFubmVsU3RhdGUsIG1lc3NhZ2VKc29uKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcykgewogICAgc2xlZXAoKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICB2YXIga2V5MiA9IHN0b3JhZ2VLZXkoY2hhbm5lbFN0YXRlLmNoYW5uZWxOYW1lKTsKICAgICAgdmFyIHdyaXRlT2JqID0gewogICAgICAgIHRva2VuOiByYW5kb21Ub2tlbigpLAogICAgICAgIHRpbWU6IERhdGUubm93KCksCiAgICAgICAgZGF0YTogbWVzc2FnZUpzb24sCiAgICAgICAgdXVpZDogY2hhbm5lbFN0YXRlLnV1aWQKICAgICAgfTsKICAgICAgdmFyIHZhbHVlMiA9IEpTT04uc3RyaW5naWZ5KHdyaXRlT2JqKTsKICAgICAgZ2V0TG9jYWxTdG9yYWdlKCkuc2V0SXRlbShrZXkyLCB2YWx1ZTIpOwogICAgICB2YXIgZXYgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTsKICAgICAgZXYuaW5pdEV2ZW50KCJzdG9yYWdlIiwgdHJ1ZSwgdHJ1ZSk7CiAgICAgIGV2LmtleSA9IGtleTI7CiAgICAgIGV2Lm5ld1ZhbHVlID0gdmFsdWUyOwogICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChldik7CiAgICAgIHJlcygpOwogICAgfSk7CiAgfSk7Cn0KZnVuY3Rpb24gYWRkU3RvcmFnZUV2ZW50TGlzdGVuZXIoY2hhbm5lbE5hbWUsIGZuKSB7CiAgdmFyIGtleTIgPSBzdG9yYWdlS2V5KGNoYW5uZWxOYW1lKTsKICB2YXIgbGlzdGVuZXIyID0gZnVuY3Rpb24gbGlzdGVuZXIzKGV2KSB7CiAgICBpZiAoZXYua2V5ID09PSBrZXkyKSB7CiAgICAgIGZuKEpTT04ucGFyc2UoZXYubmV3VmFsdWUpKTsKICAgIH0KICB9OwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzdG9yYWdlIiwgbGlzdGVuZXIyKTsKICByZXR1cm4gbGlzdGVuZXIyOwp9CmZ1bmN0aW9uIHJlbW92ZVN0b3JhZ2VFdmVudExpc3RlbmVyKGxpc3RlbmVyMikgewogIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJzdG9yYWdlIiwgbGlzdGVuZXIyKTsKfQpmdW5jdGlvbiBjcmVhdGUzKGNoYW5uZWxOYW1lLCBvcHRpb25zKSB7CiAgb3B0aW9ucyA9IGZpbGxPcHRpb25zV2l0aERlZmF1bHRzKG9wdGlvbnMpOwogIGlmICghY2FuQmVVc2VkMygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkJyb2FkY2FzdENoYW5uZWw6IGxvY2Fsc3RvcmFnZSBjYW5ub3QgYmUgdXNlZCIpOwogIH0KICB2YXIgdXVpZCA9IHJhbmRvbVRva2VuKCk7CiAgdmFyIGVNSXMgPSBuZXcgT2JsaXZpb3VzU2V0KG9wdGlvbnMubG9jYWxzdG9yYWdlLnJlbW92ZVRpbWVvdXQpOwogIHZhciBzdGF0ZTEwID0gewogICAgY2hhbm5lbE5hbWUsCiAgICB1dWlkLAogICAgZU1JcwogICAgLy8gZW1pdHRlZE1lc3NhZ2VzSWRzCiAgfTsKICBzdGF0ZTEwLmxpc3RlbmVyID0gYWRkU3RvcmFnZUV2ZW50TGlzdGVuZXIoY2hhbm5lbE5hbWUsIGZ1bmN0aW9uKG1zZ09iaikgewogICAgaWYgKCFzdGF0ZTEwLm1lc3NhZ2VzQ2FsbGJhY2spIHJldHVybjsKICAgIGlmIChtc2dPYmoudXVpZCA9PT0gdXVpZCkgcmV0dXJuOwogICAgaWYgKCFtc2dPYmoudG9rZW4gfHwgZU1Jcy5oYXMobXNnT2JqLnRva2VuKSkgcmV0dXJuOwogICAgaWYgKG1zZ09iai5kYXRhLnRpbWUgJiYgbXNnT2JqLmRhdGEudGltZSA8IHN0YXRlMTAubWVzc2FnZXNDYWxsYmFja1RpbWUpIHJldHVybjsKICAgIGVNSXMuYWRkKG1zZ09iai50b2tlbik7CiAgICBzdGF0ZTEwLm1lc3NhZ2VzQ2FsbGJhY2sobXNnT2JqLmRhdGEpOwogIH0pOwogIHJldHVybiBzdGF0ZTEwOwp9CmZ1bmN0aW9uIGNsb3NlMyhjaGFubmVsU3RhdGUpIHsKICByZW1vdmVTdG9yYWdlRXZlbnRMaXN0ZW5lcihjaGFubmVsU3RhdGUubGlzdGVuZXIpOwp9CmZ1bmN0aW9uIG9uTWVzc2FnZTMoY2hhbm5lbFN0YXRlLCBmbiwgdGltZSkgewogIGNoYW5uZWxTdGF0ZS5tZXNzYWdlc0NhbGxiYWNrVGltZSA9IHRpbWU7CiAgY2hhbm5lbFN0YXRlLm1lc3NhZ2VzQ2FsbGJhY2sgPSBmbjsKfQpmdW5jdGlvbiBjYW5CZVVzZWQzKCkgewogIHZhciBscyA9IGdldExvY2FsU3RvcmFnZSgpOwogIGlmICghbHMpIHJldHVybiBmYWxzZTsKICB0cnkgewogICAgdmFyIGtleTIgPSAiX19icm9hZGNhc3RjaGFubmVsX2NoZWNrIjsKICAgIGxzLnNldEl0ZW0oa2V5MiwgIndvcmtzIik7CiAgICBscy5yZW1vdmVJdGVtKGtleTIpOwogIH0gY2F0Y2ggKGUxMSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gdHJ1ZTsKfQpmdW5jdGlvbiBhdmVyYWdlUmVzcG9uc2VUaW1lMygpIHsKICB2YXIgZGVmYXVsdFRpbWUgPSAxMjA7CiAgdmFyIHVzZXJBZ2VudDIgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7CiAgaWYgKHVzZXJBZ2VudDIuaW5jbHVkZXMoInNhZmFyaSIpICYmICF1c2VyQWdlbnQyLmluY2x1ZGVzKCJjaHJvbWUiKSkgewogICAgcmV0dXJuIGRlZmF1bHRUaW1lICogMjsKICB9CiAgcmV0dXJuIGRlZmF1bHRUaW1lOwp9CnZhciBtaWNyb1NlY29uZHM0LCBLRVlfUFJFRklYLCB0eXBlMywgTG9jYWxzdG9yYWdlTWV0aG9kOwp2YXIgaW5pdF9sb2NhbHN0b3JhZ2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvbWV0aG9kcy9sb2NhbHN0b3JhZ2UuanMiKCkgewogICAgaW5pdF9zcmMoKTsKICAgIGluaXRfb3B0aW9ucygpOwogICAgaW5pdF91dGlsKCk7CiAgICBtaWNyb1NlY29uZHM0ID0gbWljcm9TZWNvbmRzOwogICAgS0VZX1BSRUZJWCA9ICJwdWJrZXkuYnJvYWRjYXN0Q2hhbm5lbC0iOwogICAgdHlwZTMgPSAibG9jYWxzdG9yYWdlIjsKICAgIExvY2Fsc3RvcmFnZU1ldGhvZCA9IHsKICAgICAgY3JlYXRlOiBjcmVhdGUzLAogICAgICBjbG9zZTogY2xvc2UzLAogICAgICBvbk1lc3NhZ2U6IG9uTWVzc2FnZTMsCiAgICAgIHBvc3RNZXNzYWdlOiBwb3N0TWVzc2FnZTMsCiAgICAgIGNhbkJlVXNlZDogY2FuQmVVc2VkMywKICAgICAgdHlwZTogdHlwZTMsCiAgICAgIGF2ZXJhZ2VSZXNwb25zZVRpbWU6IGF2ZXJhZ2VSZXNwb25zZVRpbWUzLAogICAgICBtaWNyb1NlY29uZHM6IG1pY3JvU2Vjb25kczQKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvbWV0aG9kcy9zaW11bGF0ZS5qcwpmdW5jdGlvbiBjcmVhdGU0KGNoYW5uZWxOYW1lKSB7CiAgdmFyIHN0YXRlMTAgPSB7CiAgICB0aW1lOiBtaWNyb1NlY29uZHM1KCksCiAgICBuYW1lOiBjaGFubmVsTmFtZSwKICAgIG1lc3NhZ2VzQ2FsbGJhY2s6IG51bGwKICB9OwogIFNJTVVMQVRFX0NIQU5ORUxTLmFkZChzdGF0ZTEwKTsKICByZXR1cm4gc3RhdGUxMDsKfQpmdW5jdGlvbiBjbG9zZTQoY2hhbm5lbFN0YXRlKSB7CiAgU0lNVUxBVEVfQ0hBTk5FTFNbImRlbGV0ZSJdKGNoYW5uZWxTdGF0ZSk7Cn0KZnVuY3Rpb24gcG9zdE1lc3NhZ2U0KGNoYW5uZWxTdGF0ZSwgbWVzc2FnZUpzb24pIHsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzKSB7CiAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgdmFyIGNoYW5uZWxBcnJheSA9IEFycmF5LmZyb20oU0lNVUxBVEVfQ0hBTk5FTFMpOwogICAgICBjaGFubmVsQXJyYXkuZm9yRWFjaChmdW5jdGlvbihjaGFubmVsKSB7CiAgICAgICAgaWYgKGNoYW5uZWwubmFtZSA9PT0gY2hhbm5lbFN0YXRlLm5hbWUgJiYgLy8gaGFzIHNhbWUgbmFtZQogICAgICAgIGNoYW5uZWwgIT09IGNoYW5uZWxTdGF0ZSAmJiAvLyBub3Qgb3duIGNoYW5uZWwKICAgICAgICAhIWNoYW5uZWwubWVzc2FnZXNDYWxsYmFjayAmJiAvLyBoYXMgc3Vic2NyaWJlcnMKICAgICAgICBjaGFubmVsLnRpbWUgPCBtZXNzYWdlSnNvbi50aW1lKSB7CiAgICAgICAgICBjaGFubmVsLm1lc3NhZ2VzQ2FsbGJhY2sobWVzc2FnZUpzb24pOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJlcygpOwogICAgfSwgU0lNVUxBVEVfREVMQVlfVElNRSk7CiAgfSk7Cn0KZnVuY3Rpb24gb25NZXNzYWdlNChjaGFubmVsU3RhdGUsIGZuKSB7CiAgY2hhbm5lbFN0YXRlLm1lc3NhZ2VzQ2FsbGJhY2sgPSBmbjsKfQpmdW5jdGlvbiBjYW5CZVVzZWQ0KCkgewogIHJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIGF2ZXJhZ2VSZXNwb25zZVRpbWU0KCkgewogIHJldHVybiBTSU1VTEFURV9ERUxBWV9USU1FOwp9CnZhciBtaWNyb1NlY29uZHM1LCB0eXBlNCwgU0lNVUxBVEVfQ0hBTk5FTFMsIFNJTVVMQVRFX0RFTEFZX1RJTUUsIFNpbXVsYXRlTWV0aG9kOwp2YXIgaW5pdF9zaW11bGF0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2Jyb2FkY2FzdC1jaGFubmVsQDcuMy4wL25vZGVfbW9kdWxlcy9icm9hZGNhc3QtY2hhbm5lbC9kaXN0L2VzYnJvd3Nlci9tZXRob2RzL3NpbXVsYXRlLmpzIigpIHsKICAgIGluaXRfdXRpbCgpOwogICAgbWljcm9TZWNvbmRzNSA9IG1pY3JvU2Vjb25kczsKICAgIHR5cGU0ID0gInNpbXVsYXRlIjsKICAgIFNJTVVMQVRFX0NIQU5ORUxTID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgIFNJTVVMQVRFX0RFTEFZX1RJTUUgPSA1OwogICAgU2ltdWxhdGVNZXRob2QgPSB7CiAgICAgIGNyZWF0ZTogY3JlYXRlNCwKICAgICAgY2xvc2U6IGNsb3NlNCwKICAgICAgb25NZXNzYWdlOiBvbk1lc3NhZ2U0LAogICAgICBwb3N0TWVzc2FnZTogcG9zdE1lc3NhZ2U0LAogICAgICBjYW5CZVVzZWQ6IGNhbkJlVXNlZDQsCiAgICAgIHR5cGU6IHR5cGU0LAogICAgICBhdmVyYWdlUmVzcG9uc2VUaW1lOiBhdmVyYWdlUmVzcG9uc2VUaW1lNCwKICAgICAgbWljcm9TZWNvbmRzOiBtaWNyb1NlY29uZHM1CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL21ldGhvZC1jaG9vc2VyLmpzCmZ1bmN0aW9uIGNob29zZU1ldGhvZChvcHRpb25zKSB7CiAgdmFyIGNob29zZU1ldGhvZHMgPSBbXS5jb25jYXQob3B0aW9ucy5tZXRob2RzLCBNRVRIT0RTKS5maWx0ZXIoQm9vbGVhbik7CiAgaWYgKG9wdGlvbnMudHlwZSkgewogICAgaWYgKG9wdGlvbnMudHlwZSA9PT0gInNpbXVsYXRlIikgewogICAgICByZXR1cm4gU2ltdWxhdGVNZXRob2Q7CiAgICB9CiAgICB2YXIgcmV0ID0gY2hvb3NlTWV0aG9kcy5maW5kKGZ1bmN0aW9uKG03KSB7CiAgICAgIHJldHVybiBtNy50eXBlID09PSBvcHRpb25zLnR5cGU7CiAgICB9KTsKICAgIGlmICghcmV0KSB0aHJvdyBuZXcgRXJyb3IoIm1ldGhvZC10eXBlICIgKyBvcHRpb25zLnR5cGUgKyAiIG5vdCBmb3VuZCIpOwogICAgZWxzZSByZXR1cm4gcmV0OwogIH0KICBpZiAoIW9wdGlvbnMud2ViV29ya2VyU3VwcG9ydCkgewogICAgY2hvb3NlTWV0aG9kcyA9IGNob29zZU1ldGhvZHMuZmlsdGVyKGZ1bmN0aW9uKG03KSB7CiAgICAgIHJldHVybiBtNy50eXBlICE9PSAiaWRiIjsKICAgIH0pOwogIH0KICB2YXIgdXNlTWV0aG9kID0gY2hvb3NlTWV0aG9kcy5maW5kKGZ1bmN0aW9uKG1ldGhvZCkgewogICAgcmV0dXJuIG1ldGhvZC5jYW5CZVVzZWQoKTsKICB9KTsKICBpZiAoIXVzZU1ldGhvZCkgewogICAgdGhyb3cgbmV3IEVycm9yKCJObyB1c2FibGUgbWV0aG9kIGZvdW5kIGluICIgKyBKU09OLnN0cmluZ2lmeShNRVRIT0RTLm1hcChmdW5jdGlvbihtNykgewogICAgICByZXR1cm4gbTcudHlwZTsKICAgIH0pKSk7CiAgfSBlbHNlIHsKICAgIHJldHVybiB1c2VNZXRob2Q7CiAgfQp9CnZhciBNRVRIT0RTOwp2YXIgaW5pdF9tZXRob2RfY2hvb3NlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2Jyb2FkY2FzdC1jaGFubmVsQDcuMy4wL25vZGVfbW9kdWxlcy9icm9hZGNhc3QtY2hhbm5lbC9kaXN0L2VzYnJvd3Nlci9tZXRob2QtY2hvb3Nlci5qcyIoKSB7CiAgICBpbml0X25hdGl2ZSgpOwogICAgaW5pdF9pbmRleGVkX2RiKCk7CiAgICBpbml0X2xvY2Fsc3RvcmFnZSgpOwogICAgaW5pdF9zaW11bGF0ZSgpOwogICAgTUVUSE9EUyA9IFsKICAgICAgTmF0aXZlTWV0aG9kLAogICAgICAvLyBmYXN0ZXN0CiAgICAgIEluZGV4ZWREQk1ldGhvZCwKICAgICAgTG9jYWxzdG9yYWdlTWV0aG9kCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL2Jyb2FkY2FzdC1jaGFubmVsLmpzCmZ1bmN0aW9uIGNsZWFyTm9kZUZvbGRlcihvcHRpb25zKSB7CiAgb3B0aW9ucyA9IGZpbGxPcHRpb25zV2l0aERlZmF1bHRzKG9wdGlvbnMpOwogIHZhciBtZXRob2QgPSBjaG9vc2VNZXRob2Qob3B0aW9ucyk7CiAgaWYgKG1ldGhvZC50eXBlID09PSAibm9kZSIpIHsKICAgIHJldHVybiBtZXRob2QuY2xlYXJOb2RlRm9sZGVyKCkudGhlbihmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KTsKICB9IGVsc2UgewogICAgcmV0dXJuIFBST01JU0VfUkVTT0xWRURfRkFMU0U7CiAgfQp9CmZ1bmN0aW9uIGVuZm9yY2VPcHRpb25zKG9wdGlvbnMpIHsKICBFTkZPUkNFRF9PUFRJT05TID0gb3B0aW9uczsKfQpmdW5jdGlvbiBfcG9zdChicm9hZGNhc3RDaGFubmVsLCB0eXBlNSwgbXNnKSB7CiAgdmFyIHRpbWUgPSBicm9hZGNhc3RDaGFubmVsLm1ldGhvZC5taWNyb1NlY29uZHMoKTsKICB2YXIgbXNnT2JqID0gewogICAgdGltZSwKICAgIHR5cGU6IHR5cGU1LAogICAgZGF0YTogbXNnCiAgfTsKICB2YXIgYXdhaXRQcmVwYXJlID0gYnJvYWRjYXN0Q2hhbm5lbC5fcHJlcFAgPyBicm9hZGNhc3RDaGFubmVsLl9wcmVwUCA6IFBST01JU0VfUkVTT0xWRURfVk9JRDsKICByZXR1cm4gYXdhaXRQcmVwYXJlLnRoZW4oZnVuY3Rpb24oKSB7CiAgICB2YXIgc2VuZFByb21pc2UgPSBicm9hZGNhc3RDaGFubmVsLm1ldGhvZC5wb3N0TWVzc2FnZShicm9hZGNhc3RDaGFubmVsLl9zdGF0ZSwgbXNnT2JqKTsKICAgIGJyb2FkY2FzdENoYW5uZWwuX3VNUC5hZGQoc2VuZFByb21pc2UpOwogICAgc2VuZFByb21pc2VbImNhdGNoIl0oKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gYnJvYWRjYXN0Q2hhbm5lbC5fdU1QWyJkZWxldGUiXShzZW5kUHJvbWlzZSk7CiAgICB9KTsKICAgIHJldHVybiBzZW5kUHJvbWlzZTsKICB9KTsKfQpmdW5jdGlvbiBfcHJlcGFyZUNoYW5uZWwoY2hhbm5lbCkgewogIHZhciBtYXliZVByb21pc2UgPSBjaGFubmVsLm1ldGhvZC5jcmVhdGUoY2hhbm5lbC5uYW1lLCBjaGFubmVsLm9wdGlvbnMpOwogIGlmIChpc1Byb21pc2UyKG1heWJlUHJvbWlzZSkpIHsKICAgIGNoYW5uZWwuX3ByZXBQID0gbWF5YmVQcm9taXNlOwogICAgbWF5YmVQcm9taXNlLnRoZW4oZnVuY3Rpb24oczEwKSB7CiAgICAgIGNoYW5uZWwuX3N0YXRlID0gczEwOwogICAgfSk7CiAgfSBlbHNlIHsKICAgIGNoYW5uZWwuX3N0YXRlID0gbWF5YmVQcm9taXNlOwogIH0KfQpmdW5jdGlvbiBfaGFzTWVzc2FnZUxpc3RlbmVycyhjaGFubmVsKSB7CiAgaWYgKGNoYW5uZWwuX2FkZEVMLm1lc3NhZ2UubGVuZ3RoID4gMCkgcmV0dXJuIHRydWU7CiAgaWYgKGNoYW5uZWwuX2FkZEVMLmludGVybmFsLmxlbmd0aCA+IDApIHJldHVybiB0cnVlOwogIHJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBfYWRkTGlzdGVuZXJPYmplY3QoY2hhbm5lbCwgdHlwZTUsIG9iaikgewogIGNoYW5uZWwuX2FkZEVMW3R5cGU1XS5wdXNoKG9iaik7CiAgX3N0YXJ0TGlzdGVuaW5nKGNoYW5uZWwpOwp9CmZ1bmN0aW9uIF9yZW1vdmVMaXN0ZW5lck9iamVjdChjaGFubmVsLCB0eXBlNSwgb2JqKSB7CiAgY2hhbm5lbC5fYWRkRUxbdHlwZTVdID0gY2hhbm5lbC5fYWRkRUxbdHlwZTVdLmZpbHRlcihmdW5jdGlvbihvMTMpIHsKICAgIHJldHVybiBvMTMgIT09IG9iajsKICB9KTsKICBfc3RvcExpc3RlbmluZyhjaGFubmVsKTsKfQpmdW5jdGlvbiBfc3RhcnRMaXN0ZW5pbmcoY2hhbm5lbCkgewogIGlmICghY2hhbm5lbC5faUwgJiYgX2hhc01lc3NhZ2VMaXN0ZW5lcnMoY2hhbm5lbCkpIHsKICAgIHZhciBsaXN0ZW5lckZuID0gZnVuY3Rpb24gbGlzdGVuZXJGbjIobXNnT2JqKSB7CiAgICAgIGNoYW5uZWwuX2FkZEVMW21zZ09iai50eXBlXS5mb3JFYWNoKGZ1bmN0aW9uKGxpc3RlbmVyT2JqZWN0KSB7CiAgICAgICAgaWYgKG1zZ09iai50aW1lID49IGxpc3RlbmVyT2JqZWN0LnRpbWUpIHsKICAgICAgICAgIGxpc3RlbmVyT2JqZWN0LmZuKG1zZ09iai5kYXRhKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfTsKICAgIHZhciB0aW1lID0gY2hhbm5lbC5tZXRob2QubWljcm9TZWNvbmRzKCk7CiAgICBpZiAoY2hhbm5lbC5fcHJlcFApIHsKICAgICAgY2hhbm5lbC5fcHJlcFAudGhlbihmdW5jdGlvbigpIHsKICAgICAgICBjaGFubmVsLl9pTCA9IHRydWU7CiAgICAgICAgY2hhbm5lbC5tZXRob2Qub25NZXNzYWdlKGNoYW5uZWwuX3N0YXRlLCBsaXN0ZW5lckZuLCB0aW1lKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBjaGFubmVsLl9pTCA9IHRydWU7CiAgICAgIGNoYW5uZWwubWV0aG9kLm9uTWVzc2FnZShjaGFubmVsLl9zdGF0ZSwgbGlzdGVuZXJGbiwgdGltZSk7CiAgICB9CiAgfQp9CmZ1bmN0aW9uIF9zdG9wTGlzdGVuaW5nKGNoYW5uZWwpIHsKICBpZiAoY2hhbm5lbC5faUwgJiYgIV9oYXNNZXNzYWdlTGlzdGVuZXJzKGNoYW5uZWwpKSB7CiAgICBjaGFubmVsLl9pTCA9IGZhbHNlOwogICAgdmFyIHRpbWUgPSBjaGFubmVsLm1ldGhvZC5taWNyb1NlY29uZHMoKTsKICAgIGNoYW5uZWwubWV0aG9kLm9uTWVzc2FnZShjaGFubmVsLl9zdGF0ZSwgbnVsbCwgdGltZSk7CiAgfQp9CnZhciBPUEVOX0JST0FEQ0FTVF9DSEFOTkVMUywgbGFzdElkLCBCcm9hZGNhc3RDaGFubmVsMiwgRU5GT1JDRURfT1BUSU9OUzsKdmFyIGluaXRfYnJvYWRjYXN0X2NoYW5uZWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvYnJvYWRjYXN0LWNoYW5uZWwuanMiKCkgewogICAgaW5pdF91dGlsKCk7CiAgICBpbml0X21ldGhvZF9jaG9vc2VyKCk7CiAgICBpbml0X29wdGlvbnMoKTsKICAgIE9QRU5fQlJPQURDQVNUX0NIQU5ORUxTID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgIGxhc3RJZCA9IDA7CiAgICBCcm9hZGNhc3RDaGFubmVsMiA9IGZ1bmN0aW9uIEJyb2FkY2FzdENoYW5uZWwzKG5hbWUsIG9wdGlvbnMpIHsKICAgICAgdGhpcy5pZCA9IGxhc3RJZCsrOwogICAgICBPUEVOX0JST0FEQ0FTVF9DSEFOTkVMUy5hZGQodGhpcyk7CiAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgIGlmIChFTkZPUkNFRF9PUFRJT05TKSB7CiAgICAgICAgb3B0aW9ucyA9IEVORk9SQ0VEX09QVElPTlM7CiAgICAgIH0KICAgICAgdGhpcy5vcHRpb25zID0gZmlsbE9wdGlvbnNXaXRoRGVmYXVsdHMob3B0aW9ucyk7CiAgICAgIHRoaXMubWV0aG9kID0gY2hvb3NlTWV0aG9kKHRoaXMub3B0aW9ucyk7CiAgICAgIHRoaXMuX2lMID0gZmFsc2U7CiAgICAgIHRoaXMuX29uTUwgPSBudWxsOwogICAgICB0aGlzLl9hZGRFTCA9IHsKICAgICAgICBtZXNzYWdlOiBbXSwKICAgICAgICBpbnRlcm5hbDogW10KICAgICAgfTsKICAgICAgdGhpcy5fdU1QID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgICAgdGhpcy5fYmVmQyA9IFtdOwogICAgICB0aGlzLl9wcmVwUCA9IG51bGw7CiAgICAgIF9wcmVwYXJlQ2hhbm5lbCh0aGlzKTsKICAgIH07CiAgICBCcm9hZGNhc3RDaGFubmVsMi5fcHVia2V5ID0gdHJ1ZTsKICAgIEJyb2FkY2FzdENoYW5uZWwyLnByb3RvdHlwZSA9IHsKICAgICAgcG9zdE1lc3NhZ2U6IGZ1bmN0aW9uIHBvc3RNZXNzYWdlNShtc2cpIHsKICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQnJvYWRjYXN0Q2hhbm5lbC5wb3N0TWVzc2FnZSgpOiBDYW5ub3QgcG9zdCBtZXNzYWdlIGFmdGVyIGNoYW5uZWwgaGFzIGNsb3NlZCAiICsgLyoqCiAgICAgICAgICAgKiBJbiB0aGUgcGFzdCB3aGVuIHRoaXMgZXJyb3IgYXBwZWFyZWQsIGl0IHdhcyByZWFsbHkgaGFyZCB0byBkZWJ1Zy4KICAgICAgICAgICAqIFNvIG5vdyB3ZSBsb2cgdGhlIG1zZyB0b2dldGhlciB3aXRoIHRoZSBlcnJvciBzbyBpdCBhdCBsZWFzdAogICAgICAgICAgICogZ2l2ZXMgc29tZSBjbHVlIGFib3V0IHdoZXJlIGluIHlvdXIgYXBwbGljYXRpb24gdGhpcyBoYXBwZW5zLgogICAgICAgICAgICovCiAgICAgICAgICBKU09OLnN0cmluZ2lmeShtc2cpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9wb3N0KHRoaXMsICJtZXNzYWdlIiwgbXNnKTsKICAgICAgfSwKICAgICAgcG9zdEludGVybmFsOiBmdW5jdGlvbiBwb3N0SW50ZXJuYWwobXNnKSB7CiAgICAgICAgcmV0dXJuIF9wb3N0KHRoaXMsICJpbnRlcm5hbCIsIG1zZyk7CiAgICAgIH0sCiAgICAgIHNldCBvbm1lc3NhZ2UoZm4pIHsKICAgICAgICB2YXIgdGltZSA9IHRoaXMubWV0aG9kLm1pY3JvU2Vjb25kcygpOwogICAgICAgIHZhciBsaXN0ZW5PYmogPSB7CiAgICAgICAgICB0aW1lLAogICAgICAgICAgZm4KICAgICAgICB9OwogICAgICAgIF9yZW1vdmVMaXN0ZW5lck9iamVjdCh0aGlzLCAibWVzc2FnZSIsIHRoaXMuX29uTUwpOwogICAgICAgIGlmIChmbiAmJiB0eXBlb2YgZm4gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIHRoaXMuX29uTUwgPSBsaXN0ZW5PYmo7CiAgICAgICAgICBfYWRkTGlzdGVuZXJPYmplY3QodGhpcywgIm1lc3NhZ2UiLCBsaXN0ZW5PYmopOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9vbk1MID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIodHlwZTUsIGZuKSB7CiAgICAgICAgdmFyIHRpbWUgPSB0aGlzLm1ldGhvZC5taWNyb1NlY29uZHMoKTsKICAgICAgICB2YXIgbGlzdGVuT2JqID0gewogICAgICAgICAgdGltZSwKICAgICAgICAgIGZuCiAgICAgICAgfTsKICAgICAgICBfYWRkTGlzdGVuZXJPYmplY3QodGhpcywgdHlwZTUsIGxpc3Rlbk9iaik7CiAgICAgIH0sCiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZTUsIGZuKSB7CiAgICAgICAgdmFyIG9iaiA9IHRoaXMuX2FkZEVMW3R5cGU1XS5maW5kKGZ1bmN0aW9uKG9iajIpIHsKICAgICAgICAgIHJldHVybiBvYmoyLmZuID09PSBmbjsKICAgICAgICB9KTsKICAgICAgICBfcmVtb3ZlTGlzdGVuZXJPYmplY3QodGhpcywgdHlwZTUsIG9iaik7CiAgICAgIH0sCiAgICAgIGNsb3NlOiBmdW5jdGlvbiBjbG9zZTUoKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgT1BFTl9CUk9BRENBU1RfQ0hBTk5FTFNbImRlbGV0ZSJdKHRoaXMpOwogICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTsKICAgICAgICB2YXIgYXdhaXRQcmVwYXJlID0gdGhpcy5fcHJlcFAgPyB0aGlzLl9wcmVwUCA6IFBST01JU0VfUkVTT0xWRURfVk9JRDsKICAgICAgICB0aGlzLl9vbk1MID0gbnVsbDsKICAgICAgICB0aGlzLl9hZGRFTC5tZXNzYWdlID0gW107CiAgICAgICAgcmV0dXJuIGF3YWl0UHJlcGFyZS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKEFycmF5LmZyb20oX3RoaXMuX3VNUCkpOwogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoX3RoaXMuX2JlZkMubWFwKGZ1bmN0aW9uKGZuKSB7CiAgICAgICAgICAgIHJldHVybiBmbigpOwogICAgICAgICAgfSkpOwogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gX3RoaXMubWV0aG9kLmNsb3NlKF90aGlzLl9zdGF0ZSk7CiAgICAgICAgfSk7CiAgICAgIH0sCiAgICAgIGdldCB0eXBlKCkgewogICAgICAgIHJldHVybiB0aGlzLm1ldGhvZC50eXBlOwogICAgICB9LAogICAgICBnZXQgaXNDbG9zZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvc2VkOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdW5sb2FkQDIuNC4xL25vZGVfbW9kdWxlcy91bmxvYWQvZGlzdC9lcy9icm93c2VyLmpzCmZ1bmN0aW9uIGFkZEJyb3dzZXIoZm4pIHsKICBpZiAodHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlID09PSAiZnVuY3Rpb24iICYmIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSkgewogICAgdmFyIG9sZENsb3NlID0gc2VsZi5jbG9zZS5iaW5kKHNlbGYpOwogICAgc2VsZi5jbG9zZSA9IGZ1bmN0aW9uKCkgewogICAgICBmbigpOwogICAgICByZXR1cm4gb2xkQ2xvc2UoKTsKICAgIH07CiAgfSBlbHNlIHsKICAgIGlmICh0eXBlb2Ygd2luZG93LmFkZEV2ZW50TGlzdGVuZXIgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsIGZ1bmN0aW9uKCkgewogICAgICBmbigpOwogICAgfSwgdHJ1ZSk7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIiwgZnVuY3Rpb24oKSB7CiAgICAgIGZuKCk7CiAgICB9LCB0cnVlKTsKICB9Cn0KdmFyIGluaXRfYnJvd3NlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3VubG9hZEAyLjQuMS9ub2RlX21vZHVsZXMvdW5sb2FkL2Rpc3QvZXMvYnJvd3Nlci5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS91bmxvYWRAMi40LjEvbm9kZV9tb2R1bGVzL3VubG9hZC9kaXN0L2VzL25vZGUuanMKZnVuY3Rpb24gYWRkTm9kZShmbikgewogIHByb2Nlc3Mub24oImV4aXQiLCBmdW5jdGlvbigpIHsKICAgIHJldHVybiBmbigpOwogIH0pOwogIHByb2Nlc3Mub24oImJlZm9yZUV4aXQiLCBmdW5jdGlvbigpIHsKICAgIHJldHVybiBmbigpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBwcm9jZXNzLmV4aXQoKTsKICAgIH0pOwogIH0pOwogIHByb2Nlc3Mub24oIlNJR0lOVCIsIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGZuKCkudGhlbihmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHByb2Nlc3MuZXhpdCgpOwogICAgfSk7CiAgfSk7CiAgcHJvY2Vzcy5vbigidW5jYXVnaHRFeGNlcHRpb24iLCBmdW5jdGlvbihlcnIpIHsKICAgIHJldHVybiBmbigpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgIGNvbnNvbGUudHJhY2UoZXJyKTsKICAgICAgcHJvY2Vzcy5leGl0KDEwMSk7CiAgICB9KTsKICB9KTsKfQp2YXIgaW5pdF9ub2RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdW5sb2FkQDIuNC4xL25vZGVfbW9kdWxlcy91bmxvYWQvZGlzdC9lcy9ub2RlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VubG9hZEAyLjQuMS9ub2RlX21vZHVsZXMvdW5sb2FkL2Rpc3QvZXMvaW5kZXguanMKZnVuY3Rpb24gc3RhcnRMaXN0ZW5pbmcoKSB7CiAgaWYgKHN0YXJ0ZWRMaXN0ZW5pbmcpIHsKICAgIHJldHVybjsKICB9CiAgc3RhcnRlZExpc3RlbmluZyA9IHRydWU7CiAgVVNFX01FVEhPRChydW5BbGwpOwp9CmZ1bmN0aW9uIGFkZDIoZm4pIHsKICBzdGFydExpc3RlbmluZygpOwogIGlmICh0eXBlb2YgZm4gIT09ICJmdW5jdGlvbiIpIHsKICAgIHRocm93IG5ldyBFcnJvcigiTGlzdGVuZXIgaXMgbm8gZnVuY3Rpb24iKTsKICB9CiAgTElTVEVORVJTLmFkZChmbik7CiAgdmFyIGFkZFJldHVybiA9IHsKICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlMigpIHsKICAgICAgcmV0dXJuIExJU1RFTkVSU1siZGVsZXRlIl0oZm4pOwogICAgfSwKICAgIHJ1bjogZnVuY3Rpb24gcnVuKCkgewogICAgICBMSVNURU5FUlNbImRlbGV0ZSJdKGZuKTsKICAgICAgcmV0dXJuIGZuKCk7CiAgICB9CiAgfTsKICByZXR1cm4gYWRkUmV0dXJuOwp9CmZ1bmN0aW9uIHJ1bkFsbCgpIHsKICB2YXIgcHJvbWlzZXMgPSBbXTsKICBMSVNURU5FUlMuZm9yRWFjaChmdW5jdGlvbihmbikgewogICAgcHJvbWlzZXMucHVzaChmbigpKTsKICAgIExJU1RFTkVSU1siZGVsZXRlIl0oZm4pOwogIH0pOwogIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7Cn0KZnVuY3Rpb24gcmVtb3ZlQWxsKCkgewogIExJU1RFTkVSUy5jbGVhcigpOwp9CmZ1bmN0aW9uIGdldFNpemUoKSB7CiAgcmV0dXJuIExJU1RFTkVSUy5zaXplOwp9CnZhciBpc05vZGUsIFVTRV9NRVRIT0QsIExJU1RFTkVSUywgc3RhcnRlZExpc3RlbmluZzsKdmFyIGluaXRfZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS91bmxvYWRAMi40LjEvbm9kZV9tb2R1bGVzL3VubG9hZC9kaXN0L2VzL2luZGV4LmpzIigpIHsKICAgIGluaXRfYnJvd3NlcigpOwogICAgaW5pdF9ub2RlKCk7CiAgICBpc05vZGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodHlwZW9mIHByb2Nlc3MgIT09ICJ1bmRlZmluZWQiID8gcHJvY2VzcyA6IDApID09PSAiW29iamVjdCBwcm9jZXNzXSI7CiAgICBVU0VfTUVUSE9EID0gaXNOb2RlID8gYWRkTm9kZSA6IGFkZEJyb3dzZXI7CiAgICBMSVNURU5FUlMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgc3RhcnRlZExpc3RlbmluZyA9IGZhbHNlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL2xlYWRlci1lbGVjdGlvbi11dGlsLmpzCmZ1bmN0aW9uIHNlbmRMZWFkZXJNZXNzYWdlKGxlYWRlckVsZWN0b3IsIGFjdGlvbikgewogIHZhciBtc2dKc29uID0gewogICAgY29udGV4dDogImxlYWRlciIsCiAgICBhY3Rpb24sCiAgICB0b2tlbjogbGVhZGVyRWxlY3Rvci50b2tlbgogIH07CiAgcmV0dXJuIGxlYWRlckVsZWN0b3IuYnJvYWRjYXN0Q2hhbm5lbC5wb3N0SW50ZXJuYWwobXNnSnNvbik7Cn0KZnVuY3Rpb24gYmVMZWFkZXIobGVhZGVyRWxlY3RvcikgewogIGxlYWRlckVsZWN0b3IuaXNMZWFkZXIgPSB0cnVlOwogIGxlYWRlckVsZWN0b3IuX2hhc0xlYWRlciA9IHRydWU7CiAgdmFyIHVubG9hZEZuID0gYWRkMihmdW5jdGlvbigpIHsKICAgIHJldHVybiBsZWFkZXJFbGVjdG9yLmRpZSgpOwogIH0pOwogIGxlYWRlckVsZWN0b3IuX3VubC5wdXNoKHVubG9hZEZuKTsKICB2YXIgaXNMZWFkZXJMaXN0ZW5lciA9IGZ1bmN0aW9uIGlzTGVhZGVyTGlzdGVuZXIyKG1zZykgewogICAgaWYgKG1zZy5jb250ZXh0ID09PSAibGVhZGVyIiAmJiBtc2cuYWN0aW9uID09PSAiYXBwbHkiKSB7CiAgICAgIHNlbmRMZWFkZXJNZXNzYWdlKGxlYWRlckVsZWN0b3IsICJ0ZWxsIik7CiAgICB9CiAgICBpZiAobXNnLmNvbnRleHQgPT09ICJsZWFkZXIiICYmIG1zZy5hY3Rpb24gPT09ICJ0ZWxsIiAmJiAhbGVhZGVyRWxlY3Rvci5fZHBMQykgewogICAgICBsZWFkZXJFbGVjdG9yLl9kcExDID0gdHJ1ZTsKICAgICAgbGVhZGVyRWxlY3Rvci5fZHBMKCk7CiAgICAgIHNlbmRMZWFkZXJNZXNzYWdlKGxlYWRlckVsZWN0b3IsICJ0ZWxsIik7CiAgICB9CiAgfTsKICBsZWFkZXJFbGVjdG9yLmJyb2FkY2FzdENoYW5uZWwuYWRkRXZlbnRMaXN0ZW5lcigiaW50ZXJuYWwiLCBpc0xlYWRlckxpc3RlbmVyKTsKICBsZWFkZXJFbGVjdG9yLl9sc3Rucy5wdXNoKGlzTGVhZGVyTGlzdGVuZXIpOwogIHJldHVybiBzZW5kTGVhZGVyTWVzc2FnZShsZWFkZXJFbGVjdG9yLCAidGVsbCIpOwp9CnZhciBpbml0X2xlYWRlcl9lbGVjdGlvbl91dGlsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL2xlYWRlci1lbGVjdGlvbi11dGlsLmpzIigpIHsKICAgIGluaXRfZXMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Jyb2FkY2FzdC1jaGFubmVsQDcuMy4wL25vZGVfbW9kdWxlcy9icm9hZGNhc3QtY2hhbm5lbC9kaXN0L2VzYnJvd3Nlci9sZWFkZXItZWxlY3Rpb24td2ViLWxvY2suanMKdmFyIExlYWRlckVsZWN0aW9uV2ViTG9jaywgTEVBREVSX0RJRV9BQk9SVF9TSUdOQUxfTUVTU0FHRTsKdmFyIGluaXRfbGVhZGVyX2VsZWN0aW9uX3dlYl9sb2NrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL2xlYWRlci1lbGVjdGlvbi13ZWItbG9jay5qcyIoKSB7CiAgICBpbml0X3V0aWwoKTsKICAgIGluaXRfbGVhZGVyX2VsZWN0aW9uX3V0aWwoKTsKICAgIExlYWRlckVsZWN0aW9uV2ViTG9jayA9IGZ1bmN0aW9uIExlYWRlckVsZWN0aW9uV2ViTG9jazIoYnJvYWRjYXN0Q2hhbm5lbCwgb3B0aW9ucykgewogICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICB0aGlzLmJyb2FkY2FzdENoYW5uZWwgPSBicm9hZGNhc3RDaGFubmVsOwogICAgICBicm9hZGNhc3RDaGFubmVsLl9iZWZDLnB1c2goZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIF90aGlzLmRpZSgpOwogICAgICB9KTsKICAgICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgIHRoaXMuaXNMZWFkZXIgPSBmYWxzZTsKICAgICAgdGhpcy5pc0RlYWQgPSBmYWxzZTsKICAgICAgdGhpcy50b2tlbiA9IHJhbmRvbVRva2VuKCk7CiAgICAgIHRoaXMuX2xzdG5zID0gW107CiAgICAgIHRoaXMuX3VubCA9IFtdOwogICAgICB0aGlzLl9kcEwgPSBmdW5jdGlvbigpIHsKICAgICAgfTsKICAgICAgdGhpcy5fZHBMQyA9IGZhbHNlOwogICAgICB0aGlzLl93S01DID0ge307CiAgICAgIHRoaXMubE4gPSAicHVia2V5LWJjfHwiICsgYnJvYWRjYXN0Q2hhbm5lbC5tZXRob2QudHlwZSArICJ8fCIgKyBicm9hZGNhc3RDaGFubmVsLm5hbWU7CiAgICB9OwogICAgTEVBREVSX0RJRV9BQk9SVF9TSUdOQUxfTUVTU0FHRSA9ICJMZWFkZXJFbGVjdGlvbldlYkxvY2suZGllKCkgY2FsbGVkIjsKICAgIExlYWRlckVsZWN0aW9uV2ViTG9jay5wcm90b3R5cGUgPSB7CiAgICAgIGhhc0xlYWRlcjogZnVuY3Rpb24gaGFzTGVhZGVyKCkgewogICAgICAgIHZhciBfdGhpczIgPSB0aGlzOwogICAgICAgIHJldHVybiBuYXZpZ2F0b3IubG9ja3MucXVlcnkoKS50aGVuKGZ1bmN0aW9uKGxvY2tzKSB7CiAgICAgICAgICB2YXIgcmVsZXZhbnRMb2NrcyA9IGxvY2tzLmhlbGQgPyBsb2Nrcy5oZWxkLmZpbHRlcihmdW5jdGlvbihsb2NrKSB7CiAgICAgICAgICAgIHJldHVybiBsb2NrLm5hbWUgPT09IF90aGlzMi5sTjsKICAgICAgICAgIH0pIDogW107CiAgICAgICAgICBpZiAocmVsZXZhbnRMb2NrcyAmJiByZWxldmFudExvY2tzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0sCiAgICAgIGF3YWl0TGVhZGVyc2hpcDogZnVuY3Rpb24gYXdhaXRMZWFkZXJzaGlwKCkgewogICAgICAgIHZhciBfdGhpczMgPSB0aGlzOwogICAgICAgIGlmICghdGhpcy5fd0xNUCkgewogICAgICAgICAgdGhpcy5fd0tNQy5jID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwogICAgICAgICAgdmFyIHJldHVyblByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMsIHJlaikgewogICAgICAgICAgICBfdGhpczMuX3dLTUMucmVzID0gcmVzOwogICAgICAgICAgICBfdGhpczMuX3dLTUMucmVqID0gcmVqOwogICAgICAgICAgfSk7CiAgICAgICAgICB0aGlzLl93TE1QID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzLCByZWplY3QpIHsKICAgICAgICAgICAgbmF2aWdhdG9yLmxvY2tzLnJlcXVlc3QoX3RoaXMzLmxOLCB7CiAgICAgICAgICAgICAgc2lnbmFsOiBfdGhpczMuX3dLTUMuYy5zaWduYWwKICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgX3RoaXMzLl93S01DLmMgPSB2b2lkIDA7CiAgICAgICAgICAgICAgYmVMZWFkZXIoX3RoaXMzKTsKICAgICAgICAgICAgICByZXMoKTsKICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuUHJvbWlzZTsKICAgICAgICAgICAgfSlbImNhdGNoIl0oZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgaWYgKGVyci5tZXNzYWdlICYmIGVyci5tZXNzYWdlID09PSBMRUFERVJfRElFX0FCT1JUX1NJR05BTF9NRVNTQUdFKSB7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChfdGhpczMuX3dLTUMucmVqKSB7CiAgICAgICAgICAgICAgICAgIF90aGlzMy5fd0tNQy5yZWooZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX3dMTVA7CiAgICAgIH0sCiAgICAgIHNldCBvbmR1cGxpY2F0ZShfZm4pIHsKICAgICAgfSwKICAgICAgZGllOiBmdW5jdGlvbiBkaWUoKSB7CiAgICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CiAgICAgICAgdGhpcy5fbHN0bnMuZm9yRWFjaChmdW5jdGlvbihsaXN0ZW5lcjIpIHsKICAgICAgICAgIHJldHVybiBfdGhpczQuYnJvYWRjYXN0Q2hhbm5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCJpbnRlcm5hbCIsIGxpc3RlbmVyMik7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5fbHN0bnMgPSBbXTsKICAgICAgICB0aGlzLl91bmwuZm9yRWFjaChmdW5jdGlvbih1Rm4pIHsKICAgICAgICAgIHJldHVybiB1Rm4ucmVtb3ZlKCk7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5fdW5sID0gW107CiAgICAgICAgaWYgKHRoaXMuaXNMZWFkZXIpIHsKICAgICAgICAgIHRoaXMuaXNMZWFkZXIgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5pc0RlYWQgPSB0cnVlOwogICAgICAgIGlmICh0aGlzLl93S01DLnJlcykgewogICAgICAgICAgdGhpcy5fd0tNQy5yZXMoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX3dLTUMuYykgewogICAgICAgICAgdGhpcy5fd0tNQy5jLmFib3J0KG5ldyBFcnJvcihMRUFERVJfRElFX0FCT1JUX1NJR05BTF9NRVNTQUdFKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzZW5kTGVhZGVyTWVzc2FnZSh0aGlzLCAiZGVhdGgiKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2Jyb2FkY2FzdC1jaGFubmVsQDcuMy4wL25vZGVfbW9kdWxlcy9icm9hZGNhc3QtY2hhbm5lbC9kaXN0L2VzYnJvd3Nlci9sZWFkZXItZWxlY3Rpb24uanMKZnVuY3Rpb24gX2F3YWl0TGVhZGVyc2hpcE9uY2UobGVhZGVyRWxlY3RvcikgewogIGlmIChsZWFkZXJFbGVjdG9yLmlzTGVhZGVyKSB7CiAgICByZXR1cm4gUFJPTUlTRV9SRVNPTFZFRF9WT0lEOwogIH0KICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzKSB7CiAgICB2YXIgcmVzb2x2ZWQyID0gZmFsc2U7CiAgICBmdW5jdGlvbiBmaW5pc2goKSB7CiAgICAgIGlmIChyZXNvbHZlZDIpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgcmVzb2x2ZWQyID0gdHJ1ZTsKICAgICAgbGVhZGVyRWxlY3Rvci5icm9hZGNhc3RDaGFubmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImludGVybmFsIiwgd2hlbkRlYXRoTGlzdGVuZXIpOwogICAgICByZXModHJ1ZSk7CiAgICB9CiAgICBsZWFkZXJFbGVjdG9yLmFwcGx5T25jZSgpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgIGlmIChsZWFkZXJFbGVjdG9yLmlzTGVhZGVyKSB7CiAgICAgICAgZmluaXNoKCk7CiAgICAgIH0KICAgIH0pOwogICAgdmFyIF90cnlPbkZhbGxCYWNrID0gZnVuY3Rpb24gdHJ5T25GYWxsQmFjaygpIHsKICAgICAgcmV0dXJuIHNsZWVwKGxlYWRlckVsZWN0b3IuX29wdGlvbnMuZmFsbGJhY2tJbnRlcnZhbCkudGhlbihmdW5jdGlvbigpIHsKICAgICAgICBpZiAobGVhZGVyRWxlY3Rvci5pc0RlYWQgfHwgcmVzb2x2ZWQyKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChsZWFkZXJFbGVjdG9yLmlzTGVhZGVyKSB7CiAgICAgICAgICBmaW5pc2goKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGxlYWRlckVsZWN0b3IuYXBwbHlPbmNlKHRydWUpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmIChsZWFkZXJFbGVjdG9yLmlzTGVhZGVyKSB7CiAgICAgICAgICAgICAgZmluaXNoKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX3RyeU9uRmFsbEJhY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH07CiAgICBfdHJ5T25GYWxsQmFjaygpOwogICAgdmFyIHdoZW5EZWF0aExpc3RlbmVyID0gZnVuY3Rpb24gd2hlbkRlYXRoTGlzdGVuZXIyKG1zZykgewogICAgICBpZiAobXNnLmNvbnRleHQgPT09ICJsZWFkZXIiICYmIG1zZy5hY3Rpb24gPT09ICJkZWF0aCIpIHsKICAgICAgICBsZWFkZXJFbGVjdG9yLl9oYXNMZWFkZXIgPSBmYWxzZTsKICAgICAgICBsZWFkZXJFbGVjdG9yLmFwcGx5T25jZSgpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAobGVhZGVyRWxlY3Rvci5pc0xlYWRlcikgewogICAgICAgICAgICBmaW5pc2goKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIGxlYWRlckVsZWN0b3IuYnJvYWRjYXN0Q2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJpbnRlcm5hbCIsIHdoZW5EZWF0aExpc3RlbmVyKTsKICAgIGxlYWRlckVsZWN0b3IuX2xzdG5zLnB1c2god2hlbkRlYXRoTGlzdGVuZXIpOwogIH0pOwp9CmZ1bmN0aW9uIGZpbGxPcHRpb25zV2l0aERlZmF1bHRzMihvcHRpb25zLCBjaGFubmVsKSB7CiAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307CiAgb3B0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob3B0aW9ucykpOwogIGlmICghb3B0aW9ucy5mYWxsYmFja0ludGVydmFsKSB7CiAgICBvcHRpb25zLmZhbGxiYWNrSW50ZXJ2YWwgPSAzZTM7CiAgfQogIGlmICghb3B0aW9ucy5yZXNwb25zZVRpbWUpIHsKICAgIG9wdGlvbnMucmVzcG9uc2VUaW1lID0gY2hhbm5lbC5tZXRob2QuYXZlcmFnZVJlc3BvbnNlVGltZShjaGFubmVsLm9wdGlvbnMpOwogIH0KICByZXR1cm4gb3B0aW9uczsKfQpmdW5jdGlvbiBjcmVhdGVMZWFkZXJFbGVjdGlvbihjaGFubmVsLCBvcHRpb25zKSB7CiAgaWYgKGNoYW5uZWwuX2xlYWRlckVsZWN0b3IpIHsKICAgIHRocm93IG5ldyBFcnJvcigiQnJvYWRjYXN0Q2hhbm5lbCBhbHJlYWR5IGhhcyBhIGxlYWRlci1lbGVjdG9yIik7CiAgfQogIG9wdGlvbnMgPSBmaWxsT3B0aW9uc1dpdGhEZWZhdWx0czIob3B0aW9ucywgY2hhbm5lbCk7CiAgdmFyIGVsZWN0b3IgPSBzdXBwb3J0c1dlYkxvY2tBUEkoKSA/IG5ldyBMZWFkZXJFbGVjdGlvbldlYkxvY2soY2hhbm5lbCwgb3B0aW9ucykgOiBuZXcgTGVhZGVyRWxlY3Rpb24oY2hhbm5lbCwgb3B0aW9ucyk7CiAgY2hhbm5lbC5fYmVmQy5wdXNoKGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGVsZWN0b3IuZGllKCk7CiAgfSk7CiAgY2hhbm5lbC5fbGVhZGVyRWxlY3RvciA9IGVsZWN0b3I7CiAgcmV0dXJuIGVsZWN0b3I7Cn0KdmFyIExlYWRlckVsZWN0aW9uOwp2YXIgaW5pdF9sZWFkZXJfZWxlY3Rpb24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvbGVhZGVyLWVsZWN0aW9uLmpzIigpIHsKICAgIGluaXRfdXRpbCgpOwogICAgaW5pdF9sZWFkZXJfZWxlY3Rpb25fdXRpbCgpOwogICAgaW5pdF9sZWFkZXJfZWxlY3Rpb25fd2ViX2xvY2soKTsKICAgIExlYWRlckVsZWN0aW9uID0gZnVuY3Rpb24gTGVhZGVyRWxlY3Rpb24yKGJyb2FkY2FzdENoYW5uZWwsIG9wdGlvbnMpIHsKICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgdGhpcy5icm9hZGNhc3RDaGFubmVsID0gYnJvYWRjYXN0Q2hhbm5lbDsKICAgICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgIHRoaXMuaXNMZWFkZXIgPSBmYWxzZTsKICAgICAgdGhpcy5faGFzTGVhZGVyID0gZmFsc2U7CiAgICAgIHRoaXMuaXNEZWFkID0gZmFsc2U7CiAgICAgIHRoaXMudG9rZW4gPSByYW5kb21Ub2tlbigpOwogICAgICB0aGlzLl9hcGxRID0gUFJPTUlTRV9SRVNPTFZFRF9WT0lEOwogICAgICB0aGlzLl9hcGxRQyA9IDA7CiAgICAgIHRoaXMuX3VubCA9IFtdOwogICAgICB0aGlzLl9sc3RucyA9IFtdOwogICAgICB0aGlzLl9kcEwgPSBmdW5jdGlvbigpIHsKICAgICAgfTsKICAgICAgdGhpcy5fZHBMQyA9IGZhbHNlOwogICAgICB2YXIgaGFzTGVhZGVyTGlzdGVuZXIgPSBmdW5jdGlvbiBoYXNMZWFkZXJMaXN0ZW5lcjIobXNnKSB7CiAgICAgICAgaWYgKG1zZy5jb250ZXh0ID09PSAibGVhZGVyIikgewogICAgICAgICAgaWYgKG1zZy5hY3Rpb24gPT09ICJkZWF0aCIpIHsKICAgICAgICAgICAgX3RoaXMuX2hhc0xlYWRlciA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG1zZy5hY3Rpb24gPT09ICJ0ZWxsIikgewogICAgICAgICAgICBfdGhpcy5faGFzTGVhZGVyID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CiAgICAgIHRoaXMuYnJvYWRjYXN0Q2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJpbnRlcm5hbCIsIGhhc0xlYWRlckxpc3RlbmVyKTsKICAgICAgdGhpcy5fbHN0bnMucHVzaChoYXNMZWFkZXJMaXN0ZW5lcik7CiAgICB9OwogICAgTGVhZGVyRWxlY3Rpb24ucHJvdG90eXBlID0gewogICAgICBoYXNMZWFkZXI6IGZ1bmN0aW9uIGhhc0xlYWRlcjIoKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9oYXNMZWFkZXIpOwogICAgICB9LAogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBpbnN0YW5jZSBpcyBsZWFkZXIsCiAgICAgICAqIGZhbHNlIGlmIG5vdC4KICAgICAgICogQGFzeW5jCiAgICAgICAqLwogICAgICBhcHBseU9uY2U6IGZ1bmN0aW9uIGFwcGx5T25jZShpc0Zyb21GYWxsYmFja0ludGVydmFsKSB7CiAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CiAgICAgICAgaWYgKHRoaXMuaXNMZWFkZXIpIHsKICAgICAgICAgIHJldHVybiBzbGVlcCgwLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuaXNEZWFkKSB7CiAgICAgICAgICByZXR1cm4gc2xlZXAoMCwgZmFsc2UpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fYXBsUUMgPiAxKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fYXBsUTsKICAgICAgICB9CiAgICAgICAgdmFyIGFwcGx5UnVuID0gZnVuY3Rpb24gYXBwbHlSdW4yKCkgewogICAgICAgICAgaWYgKF90aGlzMi5pc0xlYWRlcikgewogICAgICAgICAgICByZXR1cm4gUFJPTUlTRV9SRVNPTFZFRF9UUlVFOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHN0b3BDcml0ZXJpYSA9IGZhbHNlOwogICAgICAgICAgdmFyIHN0b3BDcml0ZXJpYVByb21pc2VSZXNvbHZlOwogICAgICAgICAgdmFyIHN0b3BDcml0ZXJpYVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXMpIHsKICAgICAgICAgICAgc3RvcENyaXRlcmlhUHJvbWlzZVJlc29sdmUgPSBmdW5jdGlvbiBzdG9wQ3JpdGVyaWFQcm9taXNlUmVzb2x2ZTIoKSB7CiAgICAgICAgICAgICAgc3RvcENyaXRlcmlhID0gdHJ1ZTsKICAgICAgICAgICAgICByZXMoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgIH0pOwogICAgICAgICAgdmFyIGhhbmRsZU1lc3NhZ2UgPSBmdW5jdGlvbiBoYW5kbGVNZXNzYWdlMihtc2cpIHsKICAgICAgICAgICAgaWYgKG1zZy5jb250ZXh0ID09PSAibGVhZGVyIiAmJiBtc2cudG9rZW4gIT0gX3RoaXMyLnRva2VuKSB7CiAgICAgICAgICAgICAgaWYgKG1zZy5hY3Rpb24gPT09ICJhcHBseSIpIHsKICAgICAgICAgICAgICAgIGlmIChtc2cudG9rZW4gPiBfdGhpczIudG9rZW4pIHsKICAgICAgICAgICAgICAgICAgc3RvcENyaXRlcmlhUHJvbWlzZVJlc29sdmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKG1zZy5hY3Rpb24gPT09ICJ0ZWxsIikgewogICAgICAgICAgICAgICAgc3RvcENyaXRlcmlhUHJvbWlzZVJlc29sdmUoKTsKICAgICAgICAgICAgICAgIF90aGlzMi5faGFzTGVhZGVyID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICBfdGhpczIuYnJvYWRjYXN0Q2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJpbnRlcm5hbCIsIGhhbmRsZU1lc3NhZ2UpOwogICAgICAgICAgdmFyIHdhaXRGb3JBbnN3ZXJUaW1lID0gaXNGcm9tRmFsbGJhY2tJbnRlcnZhbCA/IF90aGlzMi5fb3B0aW9ucy5yZXNwb25zZVRpbWUgKiA0IDogX3RoaXMyLl9vcHRpb25zLnJlc3BvbnNlVGltZTsKICAgICAgICAgIHJldHVybiBzZW5kTGVhZGVyTWVzc2FnZShfdGhpczIsICJhcHBseSIpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJhY2UoW3NsZWVwKHdhaXRGb3JBbnN3ZXJUaW1lKSwgc3RvcENyaXRlcmlhUHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoKSk7CiAgICAgICAgICAgIH0pXSk7CiAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gc2VuZExlYWRlck1lc3NhZ2UoX3RoaXMyLCAiYXBwbHkiKTsKICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJhY2UoW3NsZWVwKHdhaXRGb3JBbnN3ZXJUaW1lKSwgc3RvcENyaXRlcmlhUHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoKSk7CiAgICAgICAgICAgIH0pXSk7CiAgICAgICAgICB9KVsiY2F0Y2giXShmdW5jdGlvbigpIHsKICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIF90aGlzMi5icm9hZGNhc3RDaGFubmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImludGVybmFsIiwgaGFuZGxlTWVzc2FnZSk7CiAgICAgICAgICAgIGlmICghc3RvcENyaXRlcmlhKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGJlTGVhZGVyKF90aGlzMikudGhlbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICB0aGlzLl9hcGxRQyA9IHRoaXMuX2FwbFFDICsgMTsKICAgICAgICB0aGlzLl9hcGxRID0gdGhpcy5fYXBsUS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGFwcGx5UnVuKCk7CiAgICAgICAgfSkudGhlbihmdW5jdGlvbigpIHsKICAgICAgICAgIF90aGlzMi5fYXBsUUMgPSBfdGhpczIuX2FwbFFDIC0gMTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdGhpcy5fYXBsUS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIF90aGlzMi5pc0xlYWRlcjsKICAgICAgICB9KTsKICAgICAgfSwKICAgICAgYXdhaXRMZWFkZXJzaGlwOiBmdW5jdGlvbiBhd2FpdExlYWRlcnNoaXAyKCkgewogICAgICAgIGlmICgKICAgICAgICAgIC8qIF9hd2FpdExlYWRlcnNoaXBQcm9taXNlICovCiAgICAgICAgICAhdGhpcy5fYUxQCiAgICAgICAgKSB7CiAgICAgICAgICB0aGlzLl9hTFAgPSBfYXdhaXRMZWFkZXJzaGlwT25jZSh0aGlzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2FMUDsKICAgICAgfSwKICAgICAgc2V0IG9uZHVwbGljYXRlKGZuKSB7CiAgICAgICAgdGhpcy5fZHBMID0gZm47CiAgICAgIH0sCiAgICAgIGRpZTogZnVuY3Rpb24gZGllMigpIHsKICAgICAgICB2YXIgX3RoaXMzID0gdGhpczsKICAgICAgICB0aGlzLl9sc3Rucy5mb3JFYWNoKGZ1bmN0aW9uKGxpc3RlbmVyMikgewogICAgICAgICAgcmV0dXJuIF90aGlzMy5icm9hZGNhc3RDaGFubmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImludGVybmFsIiwgbGlzdGVuZXIyKTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLl9sc3RucyA9IFtdOwogICAgICAgIHRoaXMuX3VubC5mb3JFYWNoKGZ1bmN0aW9uKHVGbikgewogICAgICAgICAgcmV0dXJuIHVGbi5yZW1vdmUoKTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLl91bmwgPSBbXTsKICAgICAgICBpZiAodGhpcy5pc0xlYWRlcikgewogICAgICAgICAgdGhpcy5faGFzTGVhZGVyID0gZmFsc2U7CiAgICAgICAgICB0aGlzLmlzTGVhZGVyID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHRoaXMuaXNEZWFkID0gdHJ1ZTsKICAgICAgICByZXR1cm4gc2VuZExlYWRlck1lc3NhZ2UodGhpcywgImRlYXRoIik7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9icm9hZGNhc3QtY2hhbm5lbEA3LjMuMC9ub2RlX21vZHVsZXMvYnJvYWRjYXN0LWNoYW5uZWwvZGlzdC9lc2Jyb3dzZXIvaW5kZXguanMKdmFyIGluaXRfZXNicm93c2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vYnJvYWRjYXN0LWNoYW5uZWxANy4zLjAvbm9kZV9tb2R1bGVzL2Jyb2FkY2FzdC1jaGFubmVsL2Rpc3QvZXNicm93c2VyL2luZGV4LmpzIigpIHsKICAgIGluaXRfYnJvYWRjYXN0X2NoYW5uZWwoKTsKICAgIGluaXRfbGVhZGVyX2VsZWN0aW9uKCk7CiAgICBpbml0X2xlYWRlcl9lbGVjdGlvbl91dGlsKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNvbW1zQDEuMC4zMC9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jb21tcy9kaXN0X3RzL2RlZXMtY29tbXMucGx1Z2lucy5qcwp2YXIgaW5pdF9kZWVzX2NvbW1zX3BsdWdpbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNvbW1zQDEuMC4zMC9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jb21tcy9kaXN0X3RzL2RlZXMtY29tbXMucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMzKCk7CiAgICBpbml0X2Rpc3RfdHM0KCk7CiAgICBpbml0X2Rpc3RfdHMxOSgpOwogICAgaW5pdF9lc2Jyb3dzZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY29tbXNAMS4wLjMwL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNvbW1zL2Rpc3RfdHMvZGVlcy1jb21tcy5jbGFzc2VzLmRlZXNjb21tcy5qcwp2YXIgQnJvYWRjYXN0Q2hhbm5lbDQsIERlZXNDb21tczsKdmFyIGluaXRfZGVlc19jb21tc19jbGFzc2VzX2RlZXNjb21tcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY29tbXNAMS4wLjMwL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNvbW1zL2Rpc3RfdHMvZGVlcy1jb21tcy5jbGFzc2VzLmRlZXNjb21tcy5qcyIoKSB7CiAgICBpbml0X2RlZXNfY29tbXNfcGx1Z2lucygpOwogICAgQnJvYWRjYXN0Q2hhbm5lbDQgPSBnbG9iYWxUaGlzLkJyb2FkY2FzdENoYW5uZWw7CiAgICBpZiAoIUJyb2FkY2FzdENoYW5uZWw0KSB7CiAgICAgIEJyb2FkY2FzdENoYW5uZWw0ID0gQnJvYWRjYXN0Q2hhbm5lbDI7CiAgICB9CiAgICBEZWVzQ29tbXMgPSBjbGFzcyB7CiAgICAgIC8vIHJlY2VpdmluZyBtZXNzYWdlcwogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLmJyb2FkY2FzdENoYW5uZWwgPSBuZXcgQnJvYWRjYXN0Q2hhbm5lbDQoImRlZXMtY29tbXMiKTsKICAgICAgICB0aGlzLnR5cGVkcm91dGVyID0gbmV3IGRpc3RfdHNfZXhwb3J0czE5LlR5cGVkUm91dGVyKCk7CiAgICAgICAgdGhpcy50eXBlZHRhcmdldCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxOS5UeXBlZFRhcmdldCh7CiAgICAgICAgICBwb3N0TWV0aG9kV2l0aFR5cGVkUm91dGVyOiBhc3luYyAobWVzc2FnZUFyZykgPT4gewogICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKG1lc3NhZ2VBcmcpOwogICAgICAgICAgfSwKICAgICAgICAgIHR5cGVkUm91dGVyUmVmOiB0aGlzLnR5cGVkcm91dGVyCiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5icm9hZGNhc3RDaGFubmVsLm9ubWVzc2FnZSA9IGFzeW5jIChldmVudEFyZykgPT4gewogICAgICAgICAgY29uc3QgbWVzc2FnZTIgPSBldmVudEFyZy5tZXRob2QgPyBldmVudEFyZyA6IGV2ZW50QXJnLmRhdGE7CiAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShtZXNzYWdlMikpOwogICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnR5cGVkcm91dGVyLnJvdXRlQW5kQWRkUmVzcG9uc2UobWVzc2FnZTIsIHsgc2tpcEhvb2tzOiB0cnVlIH0pOwogICAgICAgICAgaWYgKHJlc3BvbnNlICYmICFyZXNwb25zZS5lcnJvcikgewogICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKHJlc3BvbnNlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQogICAgICAvKioKICAgICAgICogY3JlYXRlcyBhIHR5cGVkcmVxdWVzdCB3aXRoIHRoaXMgY2xhc3NlcyBwb3N0TWVzc2FnZSBhcyBwb3N0TWV0aG9kCiAgICAgICAqLwogICAgICBjcmVhdGVUeXBlZFJlcXVlc3QobWV0aG9kTmFtZSkgewogICAgICAgIGNvbnN0IHR5cGVkcmVxdWVzdCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxOS5UeXBlZFJlcXVlc3QodGhpcy50eXBlZHRhcmdldCwgbWV0aG9kTmFtZSk7CiAgICAgICAgcmV0dXJuIHR5cGVkcmVxdWVzdDsKICAgICAgfQogICAgICAvKioKICAgICAgICogcG9zdHMgYSB0eXBlZHJlcXVlc3RtZXNzYWdlCiAgICAgICAqLwogICAgICBhc3luYyBwb3N0TWVzc2FnZShtZXNzYWdlQXJnKSB7CiAgICAgICAgdGhpcy5icm9hZGNhc3RDaGFubmVsLnBvc3RNZXNzYWdlKG1lc3NhZ2VBcmcpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBzdWJzY3JpYmUgdG8gbWVzc2FnZXMKICAgICAgICovCiAgICAgIGFzeW5jIGNyZWF0ZVR5cGVkSGFuZGxlcihtZXRob2RBcmcsIGhhbmRsZXJGdW5jdGlvbikgewogICAgICAgIHRoaXMudHlwZWRyb3V0ZXIuYWRkVHlwZWRIYW5kbGVyKG5ldyBkaXN0X3RzX2V4cG9ydHMxOS5UeXBlZEhhbmRsZXIobWV0aG9kQXJnLCBoYW5kbGVyRnVuY3Rpb24pKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY29tbXNAMS4wLjMwL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNvbW1zL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czIwID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czIwLCB7CiAgRGVlc0NvbW1zOiAoKSA9PiBEZWVzQ29tbXMKfSk7CnZhciBpbml0X2Rpc3RfdHMyMCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY29tbXNAMS4wLjMwL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNvbW1zL2Rpc3RfdHMvaW5kZXguanMiKCkgewogICAgaW5pdF9kZWVzX2NvbW1zX2NsYXNzZXNfZGVlc2NvbW1zKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9jb21tb24uanMKdmFyIHJlcXVpcmVfY29tbW9uID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9jb21tb24uanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgZnVuY3Rpb24gaXNOb3RoaW5nKHN1YmplY3QpIHsKICAgICAgcmV0dXJuIHR5cGVvZiBzdWJqZWN0ID09PSAidW5kZWZpbmVkIiB8fCBzdWJqZWN0ID09PSBudWxsOwogICAgfQogICAgZnVuY3Rpb24gaXNPYmplY3Q0KHN1YmplY3QpIHsKICAgICAgcmV0dXJuIHR5cGVvZiBzdWJqZWN0ID09PSAib2JqZWN0IiAmJiBzdWJqZWN0ICE9PSBudWxsOwogICAgfQogICAgZnVuY3Rpb24gdG9BcnJheTMoc2VxdWVuY2UpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VxdWVuY2UpKSByZXR1cm4gc2VxdWVuY2U7CiAgICAgIGVsc2UgaWYgKGlzTm90aGluZyhzZXF1ZW5jZSkpIHJldHVybiBbXTsKICAgICAgcmV0dXJuIFtzZXF1ZW5jZV07CiAgICB9CiAgICBmdW5jdGlvbiBleHRlbmQzKHRhcmdldCwgc291cmNlKSB7CiAgICAgIHZhciBpbmRleDIsIGxlbmd0aCwga2V5Miwgc291cmNlS2V5czsKICAgICAgaWYgKHNvdXJjZSkgewogICAgICAgIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOwogICAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gc291cmNlS2V5cy5sZW5ndGg7IGluZGV4MiA8IGxlbmd0aDsgaW5kZXgyICs9IDEpIHsKICAgICAgICAgIGtleTIgPSBzb3VyY2VLZXlzW2luZGV4Ml07CiAgICAgICAgICB0YXJnZXRba2V5Ml0gPSBzb3VyY2Vba2V5Ml07CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CiAgICBmdW5jdGlvbiByZXBlYXQzKHN0cmluZzMsIGNvdW50MikgewogICAgICB2YXIgcmVzdWx0ID0gIiIsIGN5Y2xlOwogICAgICBmb3IgKGN5Y2xlID0gMDsgY3ljbGUgPCBjb3VudDI7IGN5Y2xlICs9IDEpIHsKICAgICAgICByZXN1bHQgKz0gc3RyaW5nMzsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gaXNOZWdhdGl2ZVplcm8obnVtYmVyMikgewogICAgICByZXR1cm4gbnVtYmVyMiA9PT0gMCAmJiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPT09IDEgLyBudW1iZXIyOwogICAgfQogICAgbW9kdWxlLmV4cG9ydHMuaXNOb3RoaW5nID0gaXNOb3RoaW5nOwogICAgbW9kdWxlLmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDQ7CiAgICBtb2R1bGUuZXhwb3J0cy50b0FycmF5ID0gdG9BcnJheTM7CiAgICBtb2R1bGUuZXhwb3J0cy5yZXBlYXQgPSByZXBlYXQzOwogICAgbW9kdWxlLmV4cG9ydHMuaXNOZWdhdGl2ZVplcm8gPSBpc05lZ2F0aXZlWmVybzsKICAgIG1vZHVsZS5leHBvcnRzLmV4dGVuZCA9IGV4dGVuZDM7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9leGNlcHRpb24uanMKdmFyIHJlcXVpcmVfZXhjZXB0aW9uID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9leGNlcHRpb24uanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgZnVuY3Rpb24gWUFNTEV4Y2VwdGlvbihyZWFzb24sIG1hcmsyKSB7CiAgICAgIEVycm9yLmNhbGwodGhpcyk7CiAgICAgIHRoaXMubmFtZSA9ICJZQU1MRXhjZXB0aW9uIjsKICAgICAgdGhpcy5yZWFzb24gPSByZWFzb247CiAgICAgIHRoaXMubWFyayA9IG1hcmsyOwogICAgICB0aGlzLm1lc3NhZ2UgPSAodGhpcy5yZWFzb24gfHwgIih1bmtub3duIHJlYXNvbikiKSArICh0aGlzLm1hcmsgPyAiICIgKyB0aGlzLm1hcmsudG9TdHJpbmcoKSA6ICIiKTsKICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7CiAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5zdGFjayA9IG5ldyBFcnJvcigpLnN0YWNrIHx8ICIiOwogICAgICB9CiAgICB9CiAgICBZQU1MRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTsKICAgIFlBTUxFeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gWUFNTEV4Y2VwdGlvbjsKICAgIFlBTUxFeGNlcHRpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmczKGNvbXBhY3QpIHsKICAgICAgdmFyIHJlc3VsdCA9IHRoaXMubmFtZSArICI6ICI7CiAgICAgIHJlc3VsdCArPSB0aGlzLnJlYXNvbiB8fCAiKHVua25vd24gcmVhc29uKSI7CiAgICAgIGlmICghY29tcGFjdCAmJiB0aGlzLm1hcmspIHsKICAgICAgICByZXN1bHQgKz0gIiAiICsgdGhpcy5tYXJrLnRvU3RyaW5nKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CiAgICBtb2R1bGUuZXhwb3J0cyA9IFlBTUxFeGNlcHRpb247CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9tYXJrLmpzCnZhciByZXF1aXJlX21hcmsgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL21hcmsuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGNvbW1vbiA9IHJlcXVpcmVfY29tbW9uKCk7CiAgICBmdW5jdGlvbiBNYXJrKG5hbWUsIGJ1ZmZlcjIsIHBvc2l0aW9uMywgbGluZSwgY29sdW1uKSB7CiAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyMjsKICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uMzsKICAgICAgdGhpcy5saW5lID0gbGluZTsKICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICB9CiAgICBNYXJrLnByb3RvdHlwZS5nZXRTbmlwcGV0ID0gZnVuY3Rpb24gZ2V0U25pcHBldChpbmRlbnQzLCBtYXhMZW5ndGgpIHsKICAgICAgdmFyIGhlYWQyLCBzdGFydCwgdGFpbCwgZW5kMywgc25pcHBldDsKICAgICAgaWYgKCF0aGlzLmJ1ZmZlcikgcmV0dXJuIG51bGw7CiAgICAgIGluZGVudDMgPSBpbmRlbnQzIHx8IDQ7CiAgICAgIG1heExlbmd0aCA9IG1heExlbmd0aCB8fCA3NTsKICAgICAgaGVhZDIgPSAiIjsKICAgICAgc3RhcnQgPSB0aGlzLnBvc2l0aW9uOwogICAgICB3aGlsZSAoc3RhcnQgPiAwICYmICJcMFxyXG5ceDg1XHUyMDI4XHUyMDI5Ii5pbmRleE9mKHRoaXMuYnVmZmVyLmNoYXJBdChzdGFydCAtIDEpKSA9PT0gLTEpIHsKICAgICAgICBzdGFydCAtPSAxOwogICAgICAgIGlmICh0aGlzLnBvc2l0aW9uIC0gc3RhcnQgPiBtYXhMZW5ndGggLyAyIC0gMSkgewogICAgICAgICAgaGVhZDIgPSAiIC4uLiAiOwogICAgICAgICAgc3RhcnQgKz0gNTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICB0YWlsID0gIiI7CiAgICAgIGVuZDMgPSB0aGlzLnBvc2l0aW9uOwogICAgICB3aGlsZSAoZW5kMyA8IHRoaXMuYnVmZmVyLmxlbmd0aCAmJiAiXDBcclxuXHg4NVx1MjAyOFx1MjAyOSIuaW5kZXhPZih0aGlzLmJ1ZmZlci5jaGFyQXQoZW5kMykpID09PSAtMSkgewogICAgICAgIGVuZDMgKz0gMTsKICAgICAgICBpZiAoZW5kMyAtIHRoaXMucG9zaXRpb24gPiBtYXhMZW5ndGggLyAyIC0gMSkgewogICAgICAgICAgdGFpbCA9ICIgLi4uICI7CiAgICAgICAgICBlbmQzIC09IDU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgc25pcHBldCA9IHRoaXMuYnVmZmVyLnNsaWNlKHN0YXJ0LCBlbmQzKTsKICAgICAgcmV0dXJuIGNvbW1vbi5yZXBlYXQoIiAiLCBpbmRlbnQzKSArIGhlYWQyICsgc25pcHBldCArIHRhaWwgKyAiXG4iICsgY29tbW9uLnJlcGVhdCgiICIsIGluZGVudDMgKyB0aGlzLnBvc2l0aW9uIC0gc3RhcnQgKyBoZWFkMi5sZW5ndGgpICsgIl4iOwogICAgfTsKICAgIE1hcmsucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmczKGNvbXBhY3QpIHsKICAgICAgdmFyIHNuaXBwZXQsIHdoZXJlID0gIiI7CiAgICAgIGlmICh0aGlzLm5hbWUpIHsKICAgICAgICB3aGVyZSArPSAnaW4gIicgKyB0aGlzLm5hbWUgKyAnIiAnOwogICAgICB9CiAgICAgIHdoZXJlICs9ICJhdCBsaW5lICIgKyAodGhpcy5saW5lICsgMSkgKyAiLCBjb2x1bW4gIiArICh0aGlzLmNvbHVtbiArIDEpOwogICAgICBpZiAoIWNvbXBhY3QpIHsKICAgICAgICBzbmlwcGV0ID0gdGhpcy5nZXRTbmlwcGV0KCk7CiAgICAgICAgaWYgKHNuaXBwZXQpIHsKICAgICAgICAgIHdoZXJlICs9ICI6XG4iICsgc25pcHBldDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHdoZXJlOwogICAgfTsKICAgIG1vZHVsZS5leHBvcnRzID0gTWFyazsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUuanMKdmFyIHJlcXVpcmVfdHlwZSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgWUFNTEV4Y2VwdGlvbiA9IHJlcXVpcmVfZXhjZXB0aW9uKCk7CiAgICB2YXIgVFlQRV9DT05TVFJVQ1RPUl9PUFRJT05TID0gWwogICAgICAia2luZCIsCiAgICAgICJyZXNvbHZlIiwKICAgICAgImNvbnN0cnVjdCIsCiAgICAgICJpbnN0YW5jZU9mIiwKICAgICAgInByZWRpY2F0ZSIsCiAgICAgICJyZXByZXNlbnQiLAogICAgICAiZGVmYXVsdFN0eWxlIiwKICAgICAgInN0eWxlQWxpYXNlcyIKICAgIF07CiAgICB2YXIgWUFNTF9OT0RFX0tJTkRTID0gWwogICAgICAic2NhbGFyIiwKICAgICAgInNlcXVlbmNlIiwKICAgICAgIm1hcHBpbmciCiAgICBdOwogICAgZnVuY3Rpb24gY29tcGlsZVN0eWxlQWxpYXNlcyhtYXA3KSB7CiAgICAgIHZhciByZXN1bHQgPSB7fTsKICAgICAgaWYgKG1hcDcgIT09IG51bGwpIHsKICAgICAgICBPYmplY3Qua2V5cyhtYXA3KS5mb3JFYWNoKGZ1bmN0aW9uKHN0eWxlKSB7CiAgICAgICAgICBtYXA3W3N0eWxlXS5mb3JFYWNoKGZ1bmN0aW9uKGFsaWFzKSB7CiAgICAgICAgICAgIHJlc3VsdFtTdHJpbmcoYWxpYXMpXSA9IHN0eWxlOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGZ1bmN0aW9uIFR5cGUyKHRhZywgb3B0aW9ucykgewogICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgaWYgKFRZUEVfQ09OU1RSVUNUT1JfT1BUSU9OUy5pbmRleE9mKG5hbWUpID09PSAtMSkgewogICAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1Vua25vd24gb3B0aW9uICInICsgbmFtZSArICciIGlzIG1ldCBpbiBkZWZpbml0aW9uIG9mICInICsgdGFnICsgJyIgWUFNTCB0eXBlLicpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMudGFnID0gdGFnOwogICAgICB0aGlzLmtpbmQgPSBvcHRpb25zWyJraW5kIl0gfHwgbnVsbDsKICAgICAgdGhpcy5yZXNvbHZlID0gb3B0aW9uc1sicmVzb2x2ZSJdIHx8IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9OwogICAgICB0aGlzLmNvbnN0cnVjdCA9IG9wdGlvbnNbImNvbnN0cnVjdCJdIHx8IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgfTsKICAgICAgdGhpcy5pbnN0YW5jZU9mID0gb3B0aW9uc1siaW5zdGFuY2VPZiJdIHx8IG51bGw7CiAgICAgIHRoaXMucHJlZGljYXRlID0gb3B0aW9uc1sicHJlZGljYXRlIl0gfHwgbnVsbDsKICAgICAgdGhpcy5yZXByZXNlbnQgPSBvcHRpb25zWyJyZXByZXNlbnQiXSB8fCBudWxsOwogICAgICB0aGlzLmRlZmF1bHRTdHlsZSA9IG9wdGlvbnNbImRlZmF1bHRTdHlsZSJdIHx8IG51bGw7CiAgICAgIHRoaXMuc3R5bGVBbGlhc2VzID0gY29tcGlsZVN0eWxlQWxpYXNlcyhvcHRpb25zWyJzdHlsZUFsaWFzZXMiXSB8fCBudWxsKTsKICAgICAgaWYgKFlBTUxfTk9ERV9LSU5EUy5pbmRleE9mKHRoaXMua2luZCkgPT09IC0xKSB7CiAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1Vua25vd24ga2luZCAiJyArIHRoaXMua2luZCArICciIGlzIHNwZWNpZmllZCBmb3IgIicgKyB0YWcgKyAnIiBZQU1MIHR5cGUuJyk7CiAgICAgIH0KICAgIH0KICAgIG1vZHVsZS5leHBvcnRzID0gVHlwZTI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEuanMKdmFyIHJlcXVpcmVfc2NoZW1hID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGNvbW1vbiA9IHJlcXVpcmVfY29tbW9uKCk7CiAgICB2YXIgWUFNTEV4Y2VwdGlvbiA9IHJlcXVpcmVfZXhjZXB0aW9uKCk7CiAgICB2YXIgVHlwZTIgPSByZXF1aXJlX3R5cGUoKTsKICAgIGZ1bmN0aW9uIGNvbXBpbGVMaXN0KHNjaGVtYSwgbmFtZSwgcmVzdWx0KSB7CiAgICAgIHZhciBleGNsdWRlID0gW107CiAgICAgIHNjaGVtYS5pbmNsdWRlLmZvckVhY2goZnVuY3Rpb24oaW5jbHVkZWRTY2hlbWEpIHsKICAgICAgICByZXN1bHQgPSBjb21waWxlTGlzdChpbmNsdWRlZFNjaGVtYSwgbmFtZSwgcmVzdWx0KTsKICAgICAgfSk7CiAgICAgIHNjaGVtYVtuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uKGN1cnJlbnRUeXBlKSB7CiAgICAgICAgcmVzdWx0LmZvckVhY2goZnVuY3Rpb24ocHJldmlvdXNUeXBlLCBwcmV2aW91c0luZGV4KSB7CiAgICAgICAgICBpZiAocHJldmlvdXNUeXBlLnRhZyA9PT0gY3VycmVudFR5cGUudGFnICYmIHByZXZpb3VzVHlwZS5raW5kID09PSBjdXJyZW50VHlwZS5raW5kKSB7CiAgICAgICAgICAgIGV4Y2x1ZGUucHVzaChwcmV2aW91c0luZGV4KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXN1bHQucHVzaChjdXJyZW50VHlwZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gcmVzdWx0LmZpbHRlcihmdW5jdGlvbih0eXBlNSwgaW5kZXgyKSB7CiAgICAgICAgcmV0dXJuIGV4Y2x1ZGUuaW5kZXhPZihpbmRleDIpID09PSAtMTsKICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBjb21waWxlTWFwKCkgewogICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgIHNjYWxhcjoge30sCiAgICAgICAgc2VxdWVuY2U6IHt9LAogICAgICAgIG1hcHBpbmc6IHt9LAogICAgICAgIGZhbGxiYWNrOiB7fQogICAgICB9LCBpbmRleDIsIGxlbmd0aDsKICAgICAgZnVuY3Rpb24gY29sbGVjdFR5cGUodHlwZTUpIHsKICAgICAgICByZXN1bHRbdHlwZTUua2luZF1bdHlwZTUudGFnXSA9IHJlc3VsdFsiZmFsbGJhY2siXVt0eXBlNS50YWddID0gdHlwZTU7CiAgICAgIH0KICAgICAgZm9yIChpbmRleDIgPSAwLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgYXJndW1lbnRzW2luZGV4Ml0uZm9yRWFjaChjb2xsZWN0VHlwZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGZ1bmN0aW9uIFNjaGVtYTIoZGVmaW5pdGlvbjMpIHsKICAgICAgdGhpcy5pbmNsdWRlID0gZGVmaW5pdGlvbjMuaW5jbHVkZSB8fCBbXTsKICAgICAgdGhpcy5pbXBsaWNpdCA9IGRlZmluaXRpb24zLmltcGxpY2l0IHx8IFtdOwogICAgICB0aGlzLmV4cGxpY2l0ID0gZGVmaW5pdGlvbjMuZXhwbGljaXQgfHwgW107CiAgICAgIHRoaXMuaW1wbGljaXQuZm9yRWFjaChmdW5jdGlvbih0eXBlNSkgewogICAgICAgIGlmICh0eXBlNS5sb2FkS2luZCAmJiB0eXBlNS5sb2FkS2luZCAhPT0gInNjYWxhciIpIHsKICAgICAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCJUaGVyZSBpcyBhIG5vbi1zY2FsYXIgdHlwZSBpbiB0aGUgaW1wbGljaXQgbGlzdCBvZiBhIHNjaGVtYS4gSW1wbGljaXQgcmVzb2x2aW5nIG9mIHN1Y2ggdHlwZXMgaXMgbm90IHN1cHBvcnRlZC4iKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLmNvbXBpbGVkSW1wbGljaXQgPSBjb21waWxlTGlzdCh0aGlzLCAiaW1wbGljaXQiLCBbXSk7CiAgICAgIHRoaXMuY29tcGlsZWRFeHBsaWNpdCA9IGNvbXBpbGVMaXN0KHRoaXMsICJleHBsaWNpdCIsIFtdKTsKICAgICAgdGhpcy5jb21waWxlZFR5cGVNYXAgPSBjb21waWxlTWFwKHRoaXMuY29tcGlsZWRJbXBsaWNpdCwgdGhpcy5jb21waWxlZEV4cGxpY2l0KTsKICAgIH0KICAgIFNjaGVtYTIuREVGQVVMVCA9IG51bGw7CiAgICBTY2hlbWEyLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZVNjaGVtYSgpIHsKICAgICAgdmFyIHNjaGVtYXMsIHR5cGVzOwogICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICBzY2hlbWFzID0gU2NoZW1hMi5ERUZBVUxUOwogICAgICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMF07CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICBzY2hlbWFzID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMV07CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIFNjaGVtYS5jcmVhdGUgZnVuY3Rpb24iKTsKICAgICAgfQogICAgICBzY2hlbWFzID0gY29tbW9uLnRvQXJyYXkoc2NoZW1hcyk7CiAgICAgIHR5cGVzID0gY29tbW9uLnRvQXJyYXkodHlwZXMpOwogICAgICBpZiAoIXNjaGVtYXMuZXZlcnkoZnVuY3Rpb24oc2NoZW1hKSB7CiAgICAgICAgcmV0dXJuIHNjaGVtYSBpbnN0YW5jZW9mIFNjaGVtYTI7CiAgICAgIH0pKSB7CiAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oIlNwZWNpZmllZCBsaXN0IG9mIHN1cGVyIHNjaGVtYXMgKG9yIGEgc2luZ2xlIFNjaGVtYSBvYmplY3QpIGNvbnRhaW5zIGEgbm9uLVNjaGVtYSBvYmplY3QuIik7CiAgICAgIH0KICAgICAgaWYgKCF0eXBlcy5ldmVyeShmdW5jdGlvbih0eXBlNSkgewogICAgICAgIHJldHVybiB0eXBlNSBpbnN0YW5jZW9mIFR5cGUyOwogICAgICB9KSkgewogICAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCJTcGVjaWZpZWQgbGlzdCBvZiBZQU1MIHR5cGVzIChvciBhIHNpbmdsZSBUeXBlIG9iamVjdCkgY29udGFpbnMgYSBub24tVHlwZSBvYmplY3QuIik7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBTY2hlbWEyKHsKICAgICAgICBpbmNsdWRlOiBzY2hlbWFzLAogICAgICAgIGV4cGxpY2l0OiB0eXBlcwogICAgICB9KTsKICAgIH07CiAgICBtb2R1bGUuZXhwb3J0cyA9IFNjaGVtYTI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3N0ci5qcwp2YXIgcmVxdWlyZV9zdHIgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc3RyLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBUeXBlMiA9IHJlcXVpcmVfdHlwZSgpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZTIoInRhZzp5YW1sLm9yZywyMDAyOnN0ciIsIHsKICAgICAga2luZDogInNjYWxhciIsCiAgICAgIGNvbnN0cnVjdDogZnVuY3Rpb24oZGF0YSkgewogICAgICAgIHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6ICIiOwogICAgICB9CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc2VxLmpzCnZhciByZXF1aXJlX3NlcSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zZXEuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUyID0gcmVxdWlyZV90eXBlKCk7CiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlMigidGFnOnlhbWwub3JnLDIwMDI6c2VxIiwgewogICAgICBraW5kOiAic2VxdWVuY2UiLAogICAgICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiBbXTsKICAgICAgfQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL21hcC5qcwp2YXIgcmVxdWlyZV9tYXAgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbWFwLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBUeXBlMiA9IHJlcXVpcmVfdHlwZSgpOwogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZTIoInRhZzp5YW1sLm9yZywyMDAyOm1hcCIsIHsKICAgICAga2luZDogIm1hcHBpbmciLAogICAgICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiB7fTsKICAgICAgfQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZmFpbHNhZmUuanMKdmFyIHJlcXVpcmVfZmFpbHNhZmUgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9mYWlsc2FmZS5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgU2NoZW1hMiA9IHJlcXVpcmVfc2NoZW1hKCk7CiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEyKHsKICAgICAgZXhwbGljaXQ6IFsKICAgICAgICByZXF1aXJlX3N0cigpLAogICAgICAgIHJlcXVpcmVfc2VxKCksCiAgICAgICAgcmVxdWlyZV9tYXAoKQogICAgICBdCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbnVsbC5qcwp2YXIgcmVxdWlyZV9udWxsID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL251bGwuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUyID0gcmVxdWlyZV90eXBlKCk7CiAgICBmdW5jdGlvbiByZXNvbHZlWWFtbE51bGwoZGF0YSkgewogICAgICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7CiAgICAgIHZhciBtYXgzID0gZGF0YS5sZW5ndGg7CiAgICAgIHJldHVybiBtYXgzID09PSAxICYmIGRhdGEgPT09ICJ+IiB8fCBtYXgzID09PSA0ICYmIChkYXRhID09PSAibnVsbCIgfHwgZGF0YSA9PT0gIk51bGwiIHx8IGRhdGEgPT09ICJOVUxMIik7CiAgICB9CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RZYW1sTnVsbCgpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBmdW5jdGlvbiBpc051bGwob2JqZWN0KSB7CiAgICAgIHJldHVybiBvYmplY3QgPT09IG51bGw7CiAgICB9CiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlMigidGFnOnlhbWwub3JnLDIwMDI6bnVsbCIsIHsKICAgICAga2luZDogInNjYWxhciIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVZYW1sTnVsbCwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sTnVsbCwKICAgICAgcHJlZGljYXRlOiBpc051bGwsCiAgICAgIHJlcHJlc2VudDogewogICAgICAgIGNhbm9uaWNhbDogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gIn4iOwogICAgICAgIH0sCiAgICAgICAgbG93ZXJjYXNlOiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiAibnVsbCI7CiAgICAgICAgfSwKICAgICAgICB1cHBlcmNhc2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuICJOVUxMIjsKICAgICAgICB9LAogICAgICAgIGNhbWVsY2FzZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gIk51bGwiOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZGVmYXVsdFN0eWxlOiAibG93ZXJjYXNlIgogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Jvb2wuanMKdmFyIHJlcXVpcmVfYm9vbCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9ib29sLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBUeXBlMiA9IHJlcXVpcmVfdHlwZSgpOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxCb29sZWFuKGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgdmFyIG1heDMgPSBkYXRhLmxlbmd0aDsKICAgICAgcmV0dXJuIG1heDMgPT09IDQgJiYgKGRhdGEgPT09ICJ0cnVlIiB8fCBkYXRhID09PSAiVHJ1ZSIgfHwgZGF0YSA9PT0gIlRSVUUiKSB8fCBtYXgzID09PSA1ICYmIChkYXRhID09PSAiZmFsc2UiIHx8IGRhdGEgPT09ICJGYWxzZSIgfHwgZGF0YSA9PT0gIkZBTFNFIik7CiAgICB9CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RZYW1sQm9vbGVhbihkYXRhKSB7CiAgICAgIHJldHVybiBkYXRhID09PSAidHJ1ZSIgfHwgZGF0YSA9PT0gIlRydWUiIHx8IGRhdGEgPT09ICJUUlVFIjsKICAgIH0KICAgIGZ1bmN0aW9uIGlzQm9vbGVhbihvYmplY3QpIHsKICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAiW29iamVjdCBCb29sZWFuXSI7CiAgICB9CiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlMigidGFnOnlhbWwub3JnLDIwMDI6Ym9vbCIsIHsKICAgICAga2luZDogInNjYWxhciIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVZYW1sQm9vbGVhbiwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sQm9vbGVhbiwKICAgICAgcHJlZGljYXRlOiBpc0Jvb2xlYW4sCiAgICAgIHJlcHJlc2VudDogewogICAgICAgIGxvd2VyY2FzZTogZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgICByZXR1cm4gb2JqZWN0ID8gInRydWUiIDogImZhbHNlIjsKICAgICAgICB9LAogICAgICAgIHVwcGVyY2FzZTogZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgICByZXR1cm4gb2JqZWN0ID8gIlRSVUUiIDogIkZBTFNFIjsKICAgICAgICB9LAogICAgICAgIGNhbWVsY2FzZTogZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgICByZXR1cm4gb2JqZWN0ID8gIlRydWUiIDogIkZhbHNlIjsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGRlZmF1bHRTdHlsZTogImxvd2VyY2FzZSIKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9pbnQuanMKdmFyIHJlcXVpcmVfaW50ID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2ludC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgY29tbW9uID0gcmVxdWlyZV9jb21tb24oKTsKICAgIHZhciBUeXBlMiA9IHJlcXVpcmVfdHlwZSgpOwogICAgZnVuY3Rpb24gaXNIZXhDb2RlKGMxMSkgewogICAgICByZXR1cm4gNDggPD0gYzExICYmIGMxMSA8PSA1NyB8fCA2NSA8PSBjMTEgJiYgYzExIDw9IDcwIHx8IDk3IDw9IGMxMSAmJiBjMTEgPD0gMTAyOwogICAgfQogICAgZnVuY3Rpb24gaXNPY3RDb2RlKGMxMSkgewogICAgICByZXR1cm4gNDggPD0gYzExICYmIGMxMSA8PSA1NTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzRGVjQ29kZShjMTEpIHsKICAgICAgcmV0dXJuIDQ4IDw9IGMxMSAmJiBjMTEgPD0gNTc7CiAgICB9CiAgICBmdW5jdGlvbiByZXNvbHZlWWFtbEludGVnZXIoZGF0YSkgewogICAgICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICB2YXIgbWF4MyA9IGRhdGEubGVuZ3RoLCBpbmRleDIgPSAwLCBoYXNEaWdpdHMgPSBmYWxzZSwgY2g7CiAgICAgIGlmICghbWF4MykgcmV0dXJuIGZhbHNlOwogICAgICBjaCA9IGRhdGFbaW5kZXgyXTsKICAgICAgaWYgKGNoID09PSAiLSIgfHwgY2ggPT09ICIrIikgewogICAgICAgIGNoID0gZGF0YVsrK2luZGV4Ml07CiAgICAgIH0KICAgICAgaWYgKGNoID09PSAiMCIpIHsKICAgICAgICBpZiAoaW5kZXgyICsgMSA9PT0gbWF4MykgcmV0dXJuIHRydWU7CiAgICAgICAgY2ggPSBkYXRhWysraW5kZXgyXTsKICAgICAgICBpZiAoY2ggPT09ICJiIikgewogICAgICAgICAgaW5kZXgyKys7CiAgICAgICAgICBmb3IgKDsgaW5kZXgyIDwgbWF4MzsgaW5kZXgyKyspIHsKICAgICAgICAgICAgY2ggPSBkYXRhW2luZGV4Ml07CiAgICAgICAgICAgIGlmIChjaCA9PT0gIl8iKSBjb250aW51ZTsKICAgICAgICAgICAgaWYgKGNoICE9PSAiMCIgJiYgY2ggIT09ICIxIikgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICBoYXNEaWdpdHMgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGhhc0RpZ2l0cyAmJiBjaCAhPT0gIl8iOwogICAgICAgIH0KICAgICAgICBpZiAoY2ggPT09ICJ4IikgewogICAgICAgICAgaW5kZXgyKys7CiAgICAgICAgICBmb3IgKDsgaW5kZXgyIDwgbWF4MzsgaW5kZXgyKyspIHsKICAgICAgICAgICAgY2ggPSBkYXRhW2luZGV4Ml07CiAgICAgICAgICAgIGlmIChjaCA9PT0gIl8iKSBjb250aW51ZTsKICAgICAgICAgICAgaWYgKCFpc0hleENvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4MikpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIGhhc0RpZ2l0cyA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gaGFzRGlnaXRzICYmIGNoICE9PSAiXyI7CiAgICAgICAgfQogICAgICAgIGZvciAoOyBpbmRleDIgPCBtYXgzOyBpbmRleDIrKykgewogICAgICAgICAgY2ggPSBkYXRhW2luZGV4Ml07CiAgICAgICAgICBpZiAoY2ggPT09ICJfIikgY29udGludWU7CiAgICAgICAgICBpZiAoIWlzT2N0Q29kZShkYXRhLmNoYXJDb2RlQXQoaW5kZXgyKSkpIHJldHVybiBmYWxzZTsKICAgICAgICAgIGhhc0RpZ2l0cyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBoYXNEaWdpdHMgJiYgY2ggIT09ICJfIjsKICAgICAgfQogICAgICBpZiAoY2ggPT09ICJfIikgcmV0dXJuIGZhbHNlOwogICAgICBmb3IgKDsgaW5kZXgyIDwgbWF4MzsgaW5kZXgyKyspIHsKICAgICAgICBjaCA9IGRhdGFbaW5kZXgyXTsKICAgICAgICBpZiAoY2ggPT09ICJfIikgY29udGludWU7CiAgICAgICAgaWYgKGNoID09PSAiOiIpIGJyZWFrOwogICAgICAgIGlmICghaXNEZWNDb2RlKGRhdGEuY2hhckNvZGVBdChpbmRleDIpKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBoYXNEaWdpdHMgPSB0cnVlOwogICAgICB9CiAgICAgIGlmICghaGFzRGlnaXRzIHx8IGNoID09PSAiXyIpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKGNoICE9PSAiOiIpIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gL14oOlswLTVdP1swLTldKSskLy50ZXN0KGRhdGEuc2xpY2UoaW5kZXgyKSk7CiAgICB9CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RZYW1sSW50ZWdlcihkYXRhKSB7CiAgICAgIHZhciB2YWx1ZTIgPSBkYXRhLCBzaWduID0gMSwgY2gsIGJhc2UsIGRpZ2l0cyA9IFtdOwogICAgICBpZiAodmFsdWUyLmluZGV4T2YoIl8iKSAhPT0gLTEpIHsKICAgICAgICB2YWx1ZTIgPSB2YWx1ZTIucmVwbGFjZSgvXy9nLCAiIik7CiAgICAgIH0KICAgICAgY2ggPSB2YWx1ZTJbMF07CiAgICAgIGlmIChjaCA9PT0gIi0iIHx8IGNoID09PSAiKyIpIHsKICAgICAgICBpZiAoY2ggPT09ICItIikgc2lnbiA9IC0xOwogICAgICAgIHZhbHVlMiA9IHZhbHVlMi5zbGljZSgxKTsKICAgICAgICBjaCA9IHZhbHVlMlswXTsKICAgICAgfQogICAgICBpZiAodmFsdWUyID09PSAiMCIpIHJldHVybiAwOwogICAgICBpZiAoY2ggPT09ICIwIikgewogICAgICAgIGlmICh2YWx1ZTJbMV0gPT09ICJiIikgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZTIuc2xpY2UoMiksIDIpOwogICAgICAgIGlmICh2YWx1ZTJbMV0gPT09ICJ4IikgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZTIsIDE2KTsKICAgICAgICByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlMiwgOCk7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlMi5pbmRleE9mKCI6IikgIT09IC0xKSB7CiAgICAgICAgdmFsdWUyLnNwbGl0KCI6IikuZm9yRWFjaChmdW5jdGlvbih2NikgewogICAgICAgICAgZGlnaXRzLnVuc2hpZnQocGFyc2VJbnQodjYsIDEwKSk7CiAgICAgICAgfSk7CiAgICAgICAgdmFsdWUyID0gMDsKICAgICAgICBiYXNlID0gMTsKICAgICAgICBkaWdpdHMuZm9yRWFjaChmdW5jdGlvbihkNikgewogICAgICAgICAgdmFsdWUyICs9IGQ2ICogYmFzZTsKICAgICAgICAgIGJhc2UgKj0gNjA7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHNpZ24gKiB2YWx1ZTI7CiAgICAgIH0KICAgICAgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZTIsIDEwKTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzSW50ZWdlcihvYmplY3QpIHsKICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAiW29iamVjdCBOdW1iZXJdIiAmJiAob2JqZWN0ICUgMSA9PT0gMCAmJiAhY29tbW9uLmlzTmVnYXRpdmVaZXJvKG9iamVjdCkpOwogICAgfQogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZTIoInRhZzp5YW1sLm9yZywyMDAyOmludCIsIHsKICAgICAga2luZDogInNjYWxhciIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVZYW1sSW50ZWdlciwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sSW50ZWdlciwKICAgICAgcHJlZGljYXRlOiBpc0ludGVnZXIsCiAgICAgIHJlcHJlc2VudDogewogICAgICAgIGJpbmFyeTogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICByZXR1cm4gb2JqID49IDAgPyAiMGIiICsgb2JqLnRvU3RyaW5nKDIpIDogIi0wYiIgKyBvYmoudG9TdHJpbmcoMikuc2xpY2UoMSk7CiAgICAgICAgfSwKICAgICAgICBvY3RhbDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICByZXR1cm4gb2JqID49IDAgPyAiMCIgKyBvYmoudG9TdHJpbmcoOCkgOiAiLTAiICsgb2JqLnRvU3RyaW5nKDgpLnNsaWNlKDEpOwogICAgICAgIH0sCiAgICAgICAgZGVjaW1hbDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICByZXR1cm4gb2JqLnRvU3RyaW5nKDEwKTsKICAgICAgICB9LAogICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi8KICAgICAgICBoZXhhZGVjaW1hbDogZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgICByZXR1cm4gb2JqID49IDAgPyAiMHgiICsgb2JqLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpIDogIi0weCIgKyBvYmoudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkuc2xpY2UoMSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBkZWZhdWx0U3R5bGU6ICJkZWNpbWFsIiwKICAgICAgc3R5bGVBbGlhc2VzOiB7CiAgICAgICAgYmluYXJ5OiBbMiwgImJpbiJdLAogICAgICAgIG9jdGFsOiBbOCwgIm9jdCJdLAogICAgICAgIGRlY2ltYWw6IFsxMCwgImRlYyJdLAogICAgICAgIGhleGFkZWNpbWFsOiBbMTYsICJoZXgiXQogICAgICB9CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvZmxvYXQuanMKdmFyIHJlcXVpcmVfZmxvYXQgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvZmxvYXQuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGNvbW1vbiA9IHJlcXVpcmVfY29tbW9uKCk7CiAgICB2YXIgVHlwZTIgPSByZXF1aXJlX3R5cGUoKTsKICAgIHZhciBZQU1MX0ZMT0FUX1BBVFRFUk4gPSBuZXcgUmVnRXhwKAogICAgICAvLyAyLjVlNCwgMi41IGFuZCBpbnRlZ2VycwogICAgICAiXig/OlstK10/KD86MHxbMS05XVswLTlfXSopKD86XFwuWzAtOV9dKik/KD86W2VFXVstK10/WzAtOV0rKT98XFwuWzAtOV9dKyg/OltlRV1bLStdP1swLTldKyk/fFstK10/WzAtOV1bMC05X10qKD86OlswLTVdP1swLTldKStcXC5bMC05X10qfFstK10/XFwuKD86aW5mfEluZnxJTkYpfFxcLig/Om5hbnxOYU58TkFOKSkkIgogICAgKTsKICAgIGZ1bmN0aW9uIHJlc29sdmVZYW1sRmxvYXQoZGF0YSkgewogICAgICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoIVlBTUxfRkxPQVRfUEFUVEVSTi50ZXN0KGRhdGEpIHx8IC8vIFF1aWNrIGhhY2sgdG8gbm90IGFsbG93IGludGVnZXJzIGVuZCB3aXRoIGBfYAogICAgICAvLyBQcm9iYWJseSBzaG91bGQgdXBkYXRlIHJlZ2V4cCAmIGNoZWNrIHNwZWVkCiAgICAgIGRhdGFbZGF0YS5sZW5ndGggLSAxXSA9PT0gIl8iKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gY29uc3RydWN0WWFtbEZsb2F0KGRhdGEpIHsKICAgICAgdmFyIHZhbHVlMiwgc2lnbiwgYmFzZSwgZGlnaXRzOwogICAgICB2YWx1ZTIgPSBkYXRhLnJlcGxhY2UoL18vZywgIiIpLnRvTG93ZXJDYXNlKCk7CiAgICAgIHNpZ24gPSB2YWx1ZTJbMF0gPT09ICItIiA/IC0xIDogMTsKICAgICAgZGlnaXRzID0gW107CiAgICAgIGlmICgiKy0iLmluZGV4T2YodmFsdWUyWzBdKSA+PSAwKSB7CiAgICAgICAgdmFsdWUyID0gdmFsdWUyLnNsaWNlKDEpOwogICAgICB9CiAgICAgIGlmICh2YWx1ZTIgPT09ICIuaW5mIikgewogICAgICAgIHJldHVybiBzaWduID09PSAxID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOwogICAgICB9IGVsc2UgaWYgKHZhbHVlMiA9PT0gIi5uYW4iKSB7CiAgICAgICAgcmV0dXJuIE5hTjsKICAgICAgfSBlbHNlIGlmICh2YWx1ZTIuaW5kZXhPZigiOiIpID49IDApIHsKICAgICAgICB2YWx1ZTIuc3BsaXQoIjoiKS5mb3JFYWNoKGZ1bmN0aW9uKHY2KSB7CiAgICAgICAgICBkaWdpdHMudW5zaGlmdChwYXJzZUZsb2F0KHY2LCAxMCkpOwogICAgICAgIH0pOwogICAgICAgIHZhbHVlMiA9IDA7CiAgICAgICAgYmFzZSA9IDE7CiAgICAgICAgZGlnaXRzLmZvckVhY2goZnVuY3Rpb24oZDYpIHsKICAgICAgICAgIHZhbHVlMiArPSBkNiAqIGJhc2U7CiAgICAgICAgICBiYXNlICo9IDYwOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBzaWduICogdmFsdWUyOwogICAgICB9CiAgICAgIHJldHVybiBzaWduICogcGFyc2VGbG9hdCh2YWx1ZTIsIDEwKTsKICAgIH0KICAgIHZhciBTQ0lFTlRJRklDX1dJVEhPVVRfRE9UID0gL15bLStdP1swLTldK2UvOwogICAgZnVuY3Rpb24gcmVwcmVzZW50WWFtbEZsb2F0KG9iamVjdCwgc3R5bGUpIHsKICAgICAgdmFyIHJlczsKICAgICAgaWYgKGlzTmFOKG9iamVjdCkpIHsKICAgICAgICBzd2l0Y2ggKHN0eWxlKSB7CiAgICAgICAgICBjYXNlICJsb3dlcmNhc2UiOgogICAgICAgICAgICByZXR1cm4gIi5uYW4iOwogICAgICAgICAgY2FzZSAidXBwZXJjYXNlIjoKICAgICAgICAgICAgcmV0dXJuICIuTkFOIjsKICAgICAgICAgIGNhc2UgImNhbWVsY2FzZSI6CiAgICAgICAgICAgIHJldHVybiAiLk5hTiI7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA9PT0gb2JqZWN0KSB7CiAgICAgICAgc3dpdGNoIChzdHlsZSkgewogICAgICAgICAgY2FzZSAibG93ZXJjYXNlIjoKICAgICAgICAgICAgcmV0dXJuICIuaW5mIjsKICAgICAgICAgIGNhc2UgInVwcGVyY2FzZSI6CiAgICAgICAgICAgIHJldHVybiAiLklORiI7CiAgICAgICAgICBjYXNlICJjYW1lbGNhc2UiOgogICAgICAgICAgICByZXR1cm4gIi5JbmYiOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPT09IG9iamVjdCkgewogICAgICAgIHN3aXRjaCAoc3R5bGUpIHsKICAgICAgICAgIGNhc2UgImxvd2VyY2FzZSI6CiAgICAgICAgICAgIHJldHVybiAiLS5pbmYiOwogICAgICAgICAgY2FzZSAidXBwZXJjYXNlIjoKICAgICAgICAgICAgcmV0dXJuICItLklORiI7CiAgICAgICAgICBjYXNlICJjYW1lbGNhc2UiOgogICAgICAgICAgICByZXR1cm4gIi0uSW5mIjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY29tbW9uLmlzTmVnYXRpdmVaZXJvKG9iamVjdCkpIHsKICAgICAgICByZXR1cm4gIi0wLjAiOwogICAgICB9CiAgICAgIHJlcyA9IG9iamVjdC50b1N0cmluZygxMCk7CiAgICAgIHJldHVybiBTQ0lFTlRJRklDX1dJVEhPVVRfRE9ULnRlc3QocmVzKSA/IHJlcy5yZXBsYWNlKCJlIiwgIi5lIikgOiByZXM7CiAgICB9CiAgICBmdW5jdGlvbiBpc0Zsb2F0KG9iamVjdCkgewogICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICJbb2JqZWN0IE51bWJlcl0iICYmIChvYmplY3QgJSAxICE9PSAwIHx8IGNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKTsKICAgIH0KICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUyKCJ0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCIsIHsKICAgICAga2luZDogInNjYWxhciIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVZYW1sRmxvYXQsCiAgICAgIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEZsb2F0LAogICAgICBwcmVkaWNhdGU6IGlzRmxvYXQsCiAgICAgIHJlcHJlc2VudDogcmVwcmVzZW50WWFtbEZsb2F0LAogICAgICBkZWZhdWx0U3R5bGU6ICJsb3dlcmNhc2UiCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9qc29uLmpzCnZhciByZXF1aXJlX2pzb24gPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9qc29uLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBTY2hlbWEyID0gcmVxdWlyZV9zY2hlbWEoKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYTIoewogICAgICBpbmNsdWRlOiBbCiAgICAgICAgcmVxdWlyZV9mYWlsc2FmZSgpCiAgICAgIF0sCiAgICAgIGltcGxpY2l0OiBbCiAgICAgICAgcmVxdWlyZV9udWxsKCksCiAgICAgICAgcmVxdWlyZV9ib29sKCksCiAgICAgICAgcmVxdWlyZV9pbnQoKSwKICAgICAgICByZXF1aXJlX2Zsb2F0KCkKICAgICAgXQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvY29yZS5qcwp2YXIgcmVxdWlyZV9jb3JlID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvY29yZS5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgU2NoZW1hMiA9IHJlcXVpcmVfc2NoZW1hKCk7CiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEyKHsKICAgICAgaW5jbHVkZTogWwogICAgICAgIHJlcXVpcmVfanNvbigpCiAgICAgIF0KICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS90aW1lc3RhbXAuanMKdmFyIHJlcXVpcmVfdGltZXN0YW1wID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3RpbWVzdGFtcC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgVHlwZTIgPSByZXF1aXJlX3R5cGUoKTsKICAgIHZhciBZQU1MX0RBVEVfUkVHRVhQID0gbmV3IFJlZ0V4cCgKICAgICAgIl4oWzAtOV1bMC05XVswLTldWzAtOV0pLShbMC05XVswLTldKS0oWzAtOV1bMC05XSkkIgogICAgKTsKICAgIHZhciBZQU1MX1RJTUVTVEFNUF9SRUdFWFAgPSBuZXcgUmVnRXhwKAogICAgICAiXihbMC05XVswLTldWzAtOV1bMC05XSktKFswLTldWzAtOV0/KS0oWzAtOV1bMC05XT8pKD86W1R0XXxbIFxcdF0rKShbMC05XVswLTldPyk6KFswLTldWzAtOV0pOihbMC05XVswLTldKSg/OlxcLihbMC05XSopKT8oPzpbIFxcdF0qKFp8KFstK10pKFswLTldWzAtOV0/KSg/OjooWzAtOV1bMC05XSkpPykpPyQiCiAgICApOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxUaW1lc3RhbXAoZGF0YSkgewogICAgICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoWUFNTF9EQVRFX1JFR0VYUC5leGVjKGRhdGEpICE9PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKFlBTUxfVElNRVNUQU1QX1JFR0VYUC5leGVjKGRhdGEpICE9PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gY29uc3RydWN0WWFtbFRpbWVzdGFtcChkYXRhKSB7CiAgICAgIHZhciBtYXRjaDIsIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbiA9IDAsIGRlbHRhID0gbnVsbCwgdHpfaG91ciwgdHpfbWludXRlLCBkYXRlOwogICAgICBtYXRjaDIgPSBZQU1MX0RBVEVfUkVHRVhQLmV4ZWMoZGF0YSk7CiAgICAgIGlmIChtYXRjaDIgPT09IG51bGwpIG1hdGNoMiA9IFlBTUxfVElNRVNUQU1QX1JFR0VYUC5leGVjKGRhdGEpOwogICAgICBpZiAobWF0Y2gyID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoIkRhdGUgcmVzb2x2ZSBlcnJvciIpOwogICAgICB5ZWFyID0gK21hdGNoMlsxXTsKICAgICAgbW9udGggPSArbWF0Y2gyWzJdIC0gMTsKICAgICAgZGF5ID0gK21hdGNoMlszXTsKICAgICAgaWYgKCFtYXRjaDJbNF0pIHsKICAgICAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSkpOwogICAgICB9CiAgICAgIGhvdXIgPSArbWF0Y2gyWzRdOwogICAgICBtaW51dGUgPSArbWF0Y2gyWzVdOwogICAgICBzZWNvbmQgPSArbWF0Y2gyWzZdOwogICAgICBpZiAobWF0Y2gyWzddKSB7CiAgICAgICAgZnJhY3Rpb24gPSBtYXRjaDJbN10uc2xpY2UoMCwgMyk7CiAgICAgICAgd2hpbGUgKGZyYWN0aW9uLmxlbmd0aCA8IDMpIHsKICAgICAgICAgIGZyYWN0aW9uICs9ICIwIjsKICAgICAgICB9CiAgICAgICAgZnJhY3Rpb24gPSArZnJhY3Rpb247CiAgICAgIH0KICAgICAgaWYgKG1hdGNoMls5XSkgewogICAgICAgIHR6X2hvdXIgPSArbWF0Y2gyWzEwXTsKICAgICAgICB0el9taW51dGUgPSArKG1hdGNoMlsxMV0gfHwgMCk7CiAgICAgICAgZGVsdGEgPSAodHpfaG91ciAqIDYwICsgdHpfbWludXRlKSAqIDZlNDsKICAgICAgICBpZiAobWF0Y2gyWzldID09PSAiLSIpIGRlbHRhID0gLWRlbHRhOwogICAgICB9CiAgICAgIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZnJhY3Rpb24pKTsKICAgICAgaWYgKGRlbHRhKSBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgLSBkZWx0YSk7CiAgICAgIHJldHVybiBkYXRlOwogICAgfQogICAgZnVuY3Rpb24gcmVwcmVzZW50WWFtbFRpbWVzdGFtcChvYmplY3QpIHsKICAgICAgcmV0dXJuIG9iamVjdC50b0lTT1N0cmluZygpOwogICAgfQogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZTIoInRhZzp5YW1sLm9yZywyMDAyOnRpbWVzdGFtcCIsIHsKICAgICAga2luZDogInNjYWxhciIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVZYW1sVGltZXN0YW1wLAogICAgICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxUaW1lc3RhbXAsCiAgICAgIGluc3RhbmNlT2Y6IERhdGUsCiAgICAgIHJlcHJlc2VudDogcmVwcmVzZW50WWFtbFRpbWVzdGFtcAogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL21lcmdlLmpzCnZhciByZXF1aXJlX21lcmdlID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL21lcmdlLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBUeXBlMiA9IHJlcXVpcmVfdHlwZSgpOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxNZXJnZShkYXRhKSB7CiAgICAgIHJldHVybiBkYXRhID09PSAiPDwiIHx8IGRhdGEgPT09IG51bGw7CiAgICB9CiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlMigidGFnOnlhbWwub3JnLDIwMDI6bWVyZ2UiLCB7CiAgICAgIGtpbmQ6ICJzY2FsYXIiLAogICAgICByZXNvbHZlOiByZXNvbHZlWWFtbE1lcmdlCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvYmluYXJ5LmpzCnZhciByZXF1aXJlX2JpbmFyeSA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9iaW5hcnkuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIE5vZGVCdWZmZXI7CiAgICB0cnkgewogICAgICBfcmVxdWlyZSA9IF9fcmVxdWlyZTsKICAgICAgTm9kZUJ1ZmZlciA9IF9yZXF1aXJlKCJidWZmZXIiKS5CdWZmZXI7CiAgICB9IGNhdGNoIChfXykgewogICAgfQogICAgdmFyIFR5cGUyID0gcmVxdWlyZV90eXBlKCk7CiAgICB2YXIgQkFTRTY0X01BUCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVxuXHIiOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxCaW5hcnkoZGF0YSkgewogICAgICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICB2YXIgY29kZTQsIGlkeCwgYml0bGVuID0gMCwgbWF4MyA9IGRhdGEubGVuZ3RoLCBtYXA3ID0gQkFTRTY0X01BUDsKICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBtYXgzOyBpZHgrKykgewogICAgICAgIGNvZGU0ID0gbWFwNy5pbmRleE9mKGRhdGEuY2hhckF0KGlkeCkpOwogICAgICAgIGlmIChjb2RlNCA+IDY0KSBjb250aW51ZTsKICAgICAgICBpZiAoY29kZTQgPCAwKSByZXR1cm4gZmFsc2U7CiAgICAgICAgYml0bGVuICs9IDY7CiAgICAgIH0KICAgICAgcmV0dXJuIGJpdGxlbiAlIDggPT09IDA7CiAgICB9CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RZYW1sQmluYXJ5KGRhdGEpIHsKICAgICAgdmFyIGlkeCwgdGFpbGJpdHMsIGlucHV0ID0gZGF0YS5yZXBsYWNlKC9bXHJcbj1dL2csICIiKSwgbWF4MyA9IGlucHV0Lmxlbmd0aCwgbWFwNyA9IEJBU0U2NF9NQVAsIGJpdHMgPSAwLCByZXN1bHQgPSBbXTsKICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBtYXgzOyBpZHgrKykgewogICAgICAgIGlmIChpZHggJSA0ID09PSAwICYmIGlkeCkgewogICAgICAgICAgcmVzdWx0LnB1c2goYml0cyA+PiAxNiAmIDI1NSk7CiAgICAgICAgICByZXN1bHQucHVzaChiaXRzID4+IDggJiAyNTUpOwogICAgICAgICAgcmVzdWx0LnB1c2goYml0cyAmIDI1NSk7CiAgICAgICAgfQogICAgICAgIGJpdHMgPSBiaXRzIDw8IDYgfCBtYXA3LmluZGV4T2YoaW5wdXQuY2hhckF0KGlkeCkpOwogICAgICB9CiAgICAgIHRhaWxiaXRzID0gbWF4MyAlIDQgKiA2OwogICAgICBpZiAodGFpbGJpdHMgPT09IDApIHsKICAgICAgICByZXN1bHQucHVzaChiaXRzID4+IDE2ICYgMjU1KTsKICAgICAgICByZXN1bHQucHVzaChiaXRzID4+IDggJiAyNTUpOwogICAgICAgIHJlc3VsdC5wdXNoKGJpdHMgJiAyNTUpOwogICAgICB9IGVsc2UgaWYgKHRhaWxiaXRzID09PSAxOCkgewogICAgICAgIHJlc3VsdC5wdXNoKGJpdHMgPj4gMTAgJiAyNTUpOwogICAgICAgIHJlc3VsdC5wdXNoKGJpdHMgPj4gMiAmIDI1NSk7CiAgICAgIH0gZWxzZSBpZiAodGFpbGJpdHMgPT09IDEyKSB7CiAgICAgICAgcmVzdWx0LnB1c2goYml0cyA+PiA0ICYgMjU1KTsKICAgICAgfQogICAgICBpZiAoTm9kZUJ1ZmZlcikgewogICAgICAgIHJldHVybiBOb2RlQnVmZmVyLmZyb20gPyBOb2RlQnVmZmVyLmZyb20ocmVzdWx0KSA6IG5ldyBOb2RlQnVmZmVyKHJlc3VsdCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlcHJlc2VudFlhbWxCaW5hcnkob2JqZWN0KSB7CiAgICAgIHZhciByZXN1bHQgPSAiIiwgYml0cyA9IDAsIGlkeCwgdGFpbCwgbWF4MyA9IG9iamVjdC5sZW5ndGgsIG1hcDcgPSBCQVNFNjRfTUFQOwogICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDM7IGlkeCsrKSB7CiAgICAgICAgaWYgKGlkeCAlIDMgPT09IDAgJiYgaWR4KSB7CiAgICAgICAgICByZXN1bHQgKz0gbWFwN1tiaXRzID4+IDE4ICYgNjNdOwogICAgICAgICAgcmVzdWx0ICs9IG1hcDdbYml0cyA+PiAxMiAmIDYzXTsKICAgICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgPj4gNiAmIDYzXTsKICAgICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgJiA2M107CiAgICAgICAgfQogICAgICAgIGJpdHMgPSAoYml0cyA8PCA4KSArIG9iamVjdFtpZHhdOwogICAgICB9CiAgICAgIHRhaWwgPSBtYXgzICUgMzsKICAgICAgaWYgKHRhaWwgPT09IDApIHsKICAgICAgICByZXN1bHQgKz0gbWFwN1tiaXRzID4+IDE4ICYgNjNdOwogICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgPj4gMTIgJiA2M107CiAgICAgICAgcmVzdWx0ICs9IG1hcDdbYml0cyA+PiA2ICYgNjNdOwogICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgJiA2M107CiAgICAgIH0gZWxzZSBpZiAodGFpbCA9PT0gMikgewogICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgPj4gMTAgJiA2M107CiAgICAgICAgcmVzdWx0ICs9IG1hcDdbYml0cyA+PiA0ICYgNjNdOwogICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgPDwgMiAmIDYzXTsKICAgICAgICByZXN1bHQgKz0gbWFwN1s2NF07CiAgICAgIH0gZWxzZSBpZiAodGFpbCA9PT0gMSkgewogICAgICAgIHJlc3VsdCArPSBtYXA3W2JpdHMgPj4gMiAmIDYzXTsKICAgICAgICByZXN1bHQgKz0gbWFwN1tiaXRzIDw8IDQgJiA2M107CiAgICAgICAgcmVzdWx0ICs9IG1hcDdbNjRdOwogICAgICAgIHJlc3VsdCArPSBtYXA3WzY0XTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gaXNCaW5hcnkob2JqZWN0KSB7CiAgICAgIHJldHVybiBOb2RlQnVmZmVyICYmIE5vZGVCdWZmZXIuaXNCdWZmZXIob2JqZWN0KTsKICAgIH0KICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUyKCJ0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnkiLCB7CiAgICAgIGtpbmQ6ICJzY2FsYXIiLAogICAgICByZXNvbHZlOiByZXNvbHZlWWFtbEJpbmFyeSwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sQmluYXJ5LAogICAgICBwcmVkaWNhdGU6IGlzQmluYXJ5LAogICAgICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxCaW5hcnkKICAgIH0pOwogICAgdmFyIF9yZXF1aXJlOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9vbWFwLmpzCnZhciByZXF1aXJlX29tYXAgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvb21hcC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgVHlwZTIgPSByZXF1aXJlX3R5cGUoKTsKICAgIHZhciBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5OwogICAgdmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CiAgICBmdW5jdGlvbiByZXNvbHZlWWFtbE9tYXAoZGF0YSkgewogICAgICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7CiAgICAgIHZhciBvYmplY3RLZXlzID0gW10sIGluZGV4MiwgbGVuZ3RoLCBwYWlyLCBwYWlyS2V5LCBwYWlySGFzS2V5LCBvYmplY3QgPSBkYXRhOwogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4MiA8IGxlbmd0aDsgaW5kZXgyICs9IDEpIHsKICAgICAgICBwYWlyID0gb2JqZWN0W2luZGV4Ml07CiAgICAgICAgcGFpckhhc0tleSA9IGZhbHNlOwogICAgICAgIGlmIChfdG9TdHJpbmcuY2FsbChwYWlyKSAhPT0gIltvYmplY3QgT2JqZWN0XSIpIHJldHVybiBmYWxzZTsKICAgICAgICBmb3IgKHBhaXJLZXkgaW4gcGFpcikgewogICAgICAgICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhaXIsIHBhaXJLZXkpKSB7CiAgICAgICAgICAgIGlmICghcGFpckhhc0tleSkgcGFpckhhc0tleSA9IHRydWU7CiAgICAgICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXBhaXJIYXNLZXkpIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAob2JqZWN0S2V5cy5pbmRleE9mKHBhaXJLZXkpID09PSAtMSkgb2JqZWN0S2V5cy5wdXNoKHBhaXJLZXkpOwogICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gY29uc3RydWN0WWFtbE9tYXAoZGF0YSkgewogICAgICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiBbXTsKICAgIH0KICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUyKCJ0YWc6eWFtbC5vcmcsMjAwMjpvbWFwIiwgewogICAgICBraW5kOiAic2VxdWVuY2UiLAogICAgICByZXNvbHZlOiByZXNvbHZlWWFtbE9tYXAsCiAgICAgIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbE9tYXAKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9wYWlycy5qcwp2YXIgcmVxdWlyZV9wYWlycyA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9wYWlycy5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgVHlwZTIgPSByZXF1aXJlX3R5cGUoKTsKICAgIHZhciBfdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwogICAgZnVuY3Rpb24gcmVzb2x2ZVlhbWxQYWlycyhkYXRhKSB7CiAgICAgIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgdmFyIGluZGV4MiwgbGVuZ3RoLCBwYWlyLCBrZXlzMiwgcmVzdWx0LCBvYmplY3QgPSBkYXRhOwogICAgICByZXN1bHQgPSBuZXcgQXJyYXkob2JqZWN0Lmxlbmd0aCk7CiAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIHBhaXIgPSBvYmplY3RbaW5kZXgyXTsKICAgICAgICBpZiAoX3RvU3RyaW5nLmNhbGwocGFpcikgIT09ICJbb2JqZWN0IE9iamVjdF0iKSByZXR1cm4gZmFsc2U7CiAgICAgICAga2V5czIgPSBPYmplY3Qua2V5cyhwYWlyKTsKICAgICAgICBpZiAoa2V5czIubGVuZ3RoICE9PSAxKSByZXR1cm4gZmFsc2U7CiAgICAgICAgcmVzdWx0W2luZGV4Ml0gPSBba2V5czJbMF0sIHBhaXJba2V5czJbMF1dXTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxQYWlycyhkYXRhKSB7CiAgICAgIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gW107CiAgICAgIHZhciBpbmRleDIsIGxlbmd0aCwgcGFpciwga2V5czIsIHJlc3VsdCwgb2JqZWN0ID0gZGF0YTsKICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KG9iamVjdC5sZW5ndGgpOwogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4MiA8IGxlbmd0aDsgaW5kZXgyICs9IDEpIHsKICAgICAgICBwYWlyID0gb2JqZWN0W2luZGV4Ml07CiAgICAgICAga2V5czIgPSBPYmplY3Qua2V5cyhwYWlyKTsKICAgICAgICByZXN1bHRbaW5kZXgyXSA9IFtrZXlzMlswXSwgcGFpcltrZXlzMlswXV1dOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlMigidGFnOnlhbWwub3JnLDIwMDI6cGFpcnMiLCB7CiAgICAgIGtpbmQ6ICJzZXF1ZW5jZSIsCiAgICAgIHJlc29sdmU6IHJlc29sdmVZYW1sUGFpcnMsCiAgICAgIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbFBhaXJzCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc2V0LmpzCnZhciByZXF1aXJlX3NldCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zZXQuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUyID0gcmVxdWlyZV90eXBlKCk7CiAgICB2YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICAgIGZ1bmN0aW9uIHJlc29sdmVZYW1sU2V0KGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlOwogICAgICB2YXIga2V5Miwgb2JqZWN0ID0gZGF0YTsKICAgICAgZm9yIChrZXkyIGluIG9iamVjdCkgewogICAgICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleTIpKSB7CiAgICAgICAgICBpZiAob2JqZWN0W2tleTJdICE9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gY29uc3RydWN0WWFtbFNldChkYXRhKSB7CiAgICAgIHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IHt9OwogICAgfQogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZTIoInRhZzp5YW1sLm9yZywyMDAyOnNldCIsIHsKICAgICAga2luZDogIm1hcHBpbmciLAogICAgICByZXNvbHZlOiByZXNvbHZlWWFtbFNldCwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sU2V0CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X3NhZmUuanMKdmFyIHJlcXVpcmVfZGVmYXVsdF9zYWZlID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9zYWZlLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBTY2hlbWEyID0gcmVxdWlyZV9zY2hlbWEoKTsKICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYTIoewogICAgICBpbmNsdWRlOiBbCiAgICAgICAgcmVxdWlyZV9jb3JlKCkKICAgICAgXSwKICAgICAgaW1wbGljaXQ6IFsKICAgICAgICByZXF1aXJlX3RpbWVzdGFtcCgpLAogICAgICAgIHJlcXVpcmVfbWVyZ2UoKQogICAgICBdLAogICAgICBleHBsaWNpdDogWwogICAgICAgIHJlcXVpcmVfYmluYXJ5KCksCiAgICAgICAgcmVxdWlyZV9vbWFwKCksCiAgICAgICAgcmVxdWlyZV9wYWlycygpLAogICAgICAgIHJlcXVpcmVfc2V0KCkKICAgICAgXQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL3VuZGVmaW5lZC5qcwp2YXIgcmVxdWlyZV91bmRlZmluZWQgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvdW5kZWZpbmVkLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBUeXBlMiA9IHJlcXVpcmVfdHlwZSgpOwogICAgZnVuY3Rpb24gcmVzb2x2ZUphdmFzY3JpcHRVbmRlZmluZWQoKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gY29uc3RydWN0SmF2YXNjcmlwdFVuZGVmaW5lZCgpIHsKICAgICAgcmV0dXJuIHZvaWQgMDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRVbmRlZmluZWQoKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKG9iamVjdCkgewogICAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gInVuZGVmaW5lZCI7CiAgICB9CiAgICBtb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlMigidGFnOnlhbWwub3JnLDIwMDI6anMvdW5kZWZpbmVkIiwgewogICAgICBraW5kOiAic2NhbGFyIiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRVbmRlZmluZWQsCiAgICAgIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdFVuZGVmaW5lZCwKICAgICAgcHJlZGljYXRlOiBpc1VuZGVmaW5lZCwKICAgICAgcmVwcmVzZW50OiByZXByZXNlbnRKYXZhc2NyaXB0VW5kZWZpbmVkCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvcmVnZXhwLmpzCnZhciByZXF1aXJlX3JlZ2V4cCA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy9yZWdleHAuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFR5cGUyID0gcmVxdWlyZV90eXBlKCk7CiAgICBmdW5jdGlvbiByZXNvbHZlSmF2YXNjcmlwdFJlZ0V4cChkYXRhKSB7CiAgICAgIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlOwogICAgICB2YXIgcmVnZXhwID0gZGF0YSwgdGFpbCA9IC9cLyhbZ2ltXSopJC8uZXhlYyhkYXRhKSwgbW9kaWZpZXJzID0gIiI7CiAgICAgIGlmIChyZWdleHBbMF0gPT09ICIvIikgewogICAgICAgIGlmICh0YWlsKSBtb2RpZmllcnMgPSB0YWlsWzFdOwogICAgICAgIGlmIChtb2RpZmllcnMubGVuZ3RoID4gMykgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChyZWdleHBbcmVnZXhwLmxlbmd0aCAtIG1vZGlmaWVycy5sZW5ndGggLSAxXSAhPT0gIi8iKSByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0UmVnRXhwKGRhdGEpIHsKICAgICAgdmFyIHJlZ2V4cCA9IGRhdGEsIHRhaWwgPSAvXC8oW2dpbV0qKSQvLmV4ZWMoZGF0YSksIG1vZGlmaWVycyA9ICIiOwogICAgICBpZiAocmVnZXhwWzBdID09PSAiLyIpIHsKICAgICAgICBpZiAodGFpbCkgbW9kaWZpZXJzID0gdGFpbFsxXTsKICAgICAgICByZWdleHAgPSByZWdleHAuc2xpY2UoMSwgcmVnZXhwLmxlbmd0aCAtIG1vZGlmaWVycy5sZW5ndGggLSAxKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFJlZ0V4cChyZWdleHAsIG1vZGlmaWVycyk7CiAgICB9CiAgICBmdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0UmVnRXhwKG9iamVjdCkgewogICAgICB2YXIgcmVzdWx0ID0gIi8iICsgb2JqZWN0LnNvdXJjZSArICIvIjsKICAgICAgaWYgKG9iamVjdC5nbG9iYWwpIHJlc3VsdCArPSAiZyI7CiAgICAgIGlmIChvYmplY3QubXVsdGlsaW5lKSByZXN1bHQgKz0gIm0iOwogICAgICBpZiAob2JqZWN0Lmlnbm9yZUNhc2UpIHJlc3VsdCArPSAiaSI7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBpc1JlZ0V4cChvYmplY3QpIHsKICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAiW29iamVjdCBSZWdFeHBdIjsKICAgIH0KICAgIG1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUyKCJ0YWc6eWFtbC5vcmcsMjAwMjpqcy9yZWdleHAiLCB7CiAgICAgIGtpbmQ6ICJzY2FsYXIiLAogICAgICByZXNvbHZlOiByZXNvbHZlSmF2YXNjcmlwdFJlZ0V4cCwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RKYXZhc2NyaXB0UmVnRXhwLAogICAgICBwcmVkaWNhdGU6IGlzUmVnRXhwLAogICAgICByZXByZXNlbnQ6IHJlcHJlc2VudEphdmFzY3JpcHRSZWdFeHAKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy9mdW5jdGlvbi5qcwp2YXIgcmVxdWlyZV9mdW5jdGlvbiA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjIvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy9mdW5jdGlvbi5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgZXNwcmltYTsKICAgIHRyeSB7CiAgICAgIF9yZXF1aXJlID0gX19yZXF1aXJlOwogICAgICBlc3ByaW1hID0gX3JlcXVpcmUoImVzcHJpbWEiKTsKICAgIH0gY2F0Y2ggKF81KSB7CiAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIikgZXNwcmltYSA9IHdpbmRvdy5lc3ByaW1hOwogICAgfQogICAgdmFyIFR5cGUyID0gcmVxdWlyZV90eXBlKCk7CiAgICBmdW5jdGlvbiByZXNvbHZlSmF2YXNjcmlwdEZ1bmN0aW9uKGRhdGEpIHsKICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgc291cmNlID0gIigiICsgZGF0YSArICIpIiwgYXN0ID0gZXNwcmltYS5wYXJzZShzb3VyY2UsIHsgcmFuZ2U6IHRydWUgfSk7CiAgICAgICAgaWYgKGFzdC50eXBlICE9PSAiUHJvZ3JhbSIgfHwgYXN0LmJvZHkubGVuZ3RoICE9PSAxIHx8IGFzdC5ib2R5WzBdLnR5cGUgIT09ICJFeHByZXNzaW9uU3RhdGVtZW50IiB8fCBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgIT09ICJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiIgJiYgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlICE9PSAiRnVuY3Rpb25FeHByZXNzaW9uIikgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0RnVuY3Rpb24oZGF0YSkgewogICAgICB2YXIgc291cmNlID0gIigiICsgZGF0YSArICIpIiwgYXN0ID0gZXNwcmltYS5wYXJzZShzb3VyY2UsIHsgcmFuZ2U6IHRydWUgfSksIHBhcmFtczIgPSBbXSwgYm9keTM7CiAgICAgIGlmIChhc3QudHlwZSAhPT0gIlByb2dyYW0iIHx8IGFzdC5ib2R5Lmxlbmd0aCAhPT0gMSB8fCBhc3QuYm9keVswXS50eXBlICE9PSAiRXhwcmVzc2lvblN0YXRlbWVudCIgfHwgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlICE9PSAiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iICYmIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZSAhPT0gIkZ1bmN0aW9uRXhwcmVzc2lvbiIpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byByZXNvbHZlIGZ1bmN0aW9uIik7CiAgICAgIH0KICAgICAgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi5wYXJhbXMuZm9yRWFjaChmdW5jdGlvbihwYXJhbSkgewogICAgICAgIHBhcmFtczIucHVzaChwYXJhbS5uYW1lKTsKICAgICAgfSk7CiAgICAgIGJvZHkzID0gYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi5ib2R5LnJhbmdlOwogICAgICBpZiAoYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi5ib2R5LnR5cGUgPT09ICJCbG9ja1N0YXRlbWVudCIpIHsKICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKHBhcmFtczIsIHNvdXJjZS5zbGljZShib2R5M1swXSArIDEsIGJvZHkzWzFdIC0gMSkpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24ocGFyYW1zMiwgInJldHVybiAiICsgc291cmNlLnNsaWNlKGJvZHkzWzBdLCBib2R5M1sxXSkpOwogICAgfQogICAgZnVuY3Rpb24gcmVwcmVzZW50SmF2YXNjcmlwdEZ1bmN0aW9uKG9iamVjdCkgewogICAgICByZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7CiAgICB9CiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uMihvYmplY3QpIHsKICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAiW29iamVjdCBGdW5jdGlvbl0iOwogICAgfQogICAgbW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZTIoInRhZzp5YW1sLm9yZywyMDAyOmpzL2Z1bmN0aW9uIiwgewogICAgICBraW5kOiAic2NhbGFyIiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRGdW5jdGlvbiwKICAgICAgY29uc3RydWN0OiBjb25zdHJ1Y3RKYXZhc2NyaXB0RnVuY3Rpb24sCiAgICAgIHByZWRpY2F0ZTogaXNGdW5jdGlvbjIsCiAgICAgIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdEZ1bmN0aW9uCiAgICB9KTsKICAgIHZhciBfcmVxdWlyZTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwuanMKdmFyIHJlcXVpcmVfZGVmYXVsdF9mdWxsID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9mdWxsLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBTY2hlbWEyID0gcmVxdWlyZV9zY2hlbWEoKTsKICAgIG1vZHVsZS5leHBvcnRzID0gU2NoZW1hMi5ERUZBVUxUID0gbmV3IFNjaGVtYTIoewogICAgICBpbmNsdWRlOiBbCiAgICAgICAgcmVxdWlyZV9kZWZhdWx0X3NhZmUoKQogICAgICBdLAogICAgICBleHBsaWNpdDogWwogICAgICAgIHJlcXVpcmVfdW5kZWZpbmVkKCksCiAgICAgICAgcmVxdWlyZV9yZWdleHAoKSwKICAgICAgICByZXF1aXJlX2Z1bmN0aW9uKCkKICAgICAgXQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9sb2FkZXIuanMKdmFyIHJlcXVpcmVfbG9hZGVyID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9sb2FkZXIuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGNvbW1vbiA9IHJlcXVpcmVfY29tbW9uKCk7CiAgICB2YXIgWUFNTEV4Y2VwdGlvbiA9IHJlcXVpcmVfZXhjZXB0aW9uKCk7CiAgICB2YXIgTWFyayA9IHJlcXVpcmVfbWFyaygpOwogICAgdmFyIERFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlX2RlZmF1bHRfc2FmZSgpOwogICAgdmFyIERFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlX2RlZmF1bHRfZnVsbCgpOwogICAgdmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CiAgICB2YXIgQ09OVEVYVF9GTE9XX0lOID0gMTsKICAgIHZhciBDT05URVhUX0ZMT1dfT1VUID0gMjsKICAgIHZhciBDT05URVhUX0JMT0NLX0lOID0gMzsKICAgIHZhciBDT05URVhUX0JMT0NLX09VVCA9IDQ7CiAgICB2YXIgQ0hPTVBJTkdfQ0xJUCA9IDE7CiAgICB2YXIgQ0hPTVBJTkdfU1RSSVAgPSAyOwogICAgdmFyIENIT01QSU5HX0tFRVAgPSAzOwogICAgdmFyIFBBVFRFUk5fTk9OX1BSSU5UQUJMRSA9IC9bXHgwMC1ceDA4XHgwQlx4MENceDBFLVx4MUZceDdGLVx4ODRceDg2LVx4OUZcdUZGRkVcdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXS87CiAgICB2YXIgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MgPSAvW1x4ODVcdTIwMjhcdTIwMjldLzsKICAgIHZhciBQQVRURVJOX0ZMT1dfSU5ESUNBVE9SUyA9IC9bLFxbXF1ce1x9XS87CiAgICB2YXIgUEFUVEVSTl9UQUdfSEFORExFID0gL14oPzohfCEhfCFbYS16XC1dKyEpJC9pOwogICAgdmFyIFBBVFRFUk5fVEFHX1VSSSA9IC9eKD86IXxbXixcW1xdXHtcfV0pKD86JVswLTlhLWZdezJ9fFswLTlhLXpcLSM7XC9cPzpAJj1cK1wkLF9cLiF+XConXChcKVxbXF1dKSokL2k7CiAgICBmdW5jdGlvbiBfY2xhc3Mob2JqKSB7CiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzX0VPTChjMTEpIHsKICAgICAgcmV0dXJuIGMxMSA9PT0gMTAgfHwgYzExID09PSAxMzsKICAgIH0KICAgIGZ1bmN0aW9uIGlzX1dISVRFX1NQQUNFKGMxMSkgewogICAgICByZXR1cm4gYzExID09PSA5IHx8IGMxMSA9PT0gMzI7CiAgICB9CiAgICBmdW5jdGlvbiBpc19XU19PUl9FT0woYzExKSB7CiAgICAgIHJldHVybiBjMTEgPT09IDkgfHwgYzExID09PSAzMiB8fCBjMTEgPT09IDEwIHx8IGMxMSA9PT0gMTM7CiAgICB9CiAgICBmdW5jdGlvbiBpc19GTE9XX0lORElDQVRPUihjMTEpIHsKICAgICAgcmV0dXJuIGMxMSA9PT0gNDQgfHwgYzExID09PSA5MSB8fCBjMTEgPT09IDkzIHx8IGMxMSA9PT0gMTIzIHx8IGMxMSA9PT0gMTI1OwogICAgfQogICAgZnVuY3Rpb24gZnJvbUhleENvZGUoYzExKSB7CiAgICAgIHZhciBsYzsKICAgICAgaWYgKDQ4IDw9IGMxMSAmJiBjMTEgPD0gNTcpIHsKICAgICAgICByZXR1cm4gYzExIC0gNDg7CiAgICAgIH0KICAgICAgbGMgPSBjMTEgfCAzMjsKICAgICAgaWYgKDk3IDw9IGxjICYmIGxjIDw9IDEwMikgewogICAgICAgIHJldHVybiBsYyAtIDk3ICsgMTA7CiAgICAgIH0KICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZnVuY3Rpb24gZXNjYXBlZEhleExlbihjMTEpIHsKICAgICAgaWYgKGMxMSA9PT0gMTIwKSB7CiAgICAgICAgcmV0dXJuIDI7CiAgICAgIH0KICAgICAgaWYgKGMxMSA9PT0gMTE3KSB7CiAgICAgICAgcmV0dXJuIDQ7CiAgICAgIH0KICAgICAgaWYgKGMxMSA9PT0gODUpIHsKICAgICAgICByZXR1cm4gODsKICAgICAgfQogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGZ1bmN0aW9uIGZyb21EZWNpbWFsQ29kZShjMTEpIHsKICAgICAgaWYgKDQ4IDw9IGMxMSAmJiBjMTEgPD0gNTcpIHsKICAgICAgICByZXR1cm4gYzExIC0gNDg7CiAgICAgIH0KICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZnVuY3Rpb24gc2ltcGxlRXNjYXBlU2VxdWVuY2UoYzExKSB7CiAgICAgIHJldHVybiBjMTEgPT09IDQ4ID8gIlwwIiA6IGMxMSA9PT0gOTcgPyAiXHgwNyIgOiBjMTEgPT09IDk4ID8gIlxiIiA6IGMxMSA9PT0gMTE2ID8gIgkiIDogYzExID09PSA5ID8gIgkiIDogYzExID09PSAxMTAgPyAiXG4iIDogYzExID09PSAxMTggPyAiXHYiIDogYzExID09PSAxMDIgPyAiXGYiIDogYzExID09PSAxMTQgPyAiXHIiIDogYzExID09PSAxMDEgPyAiXHgxQiIgOiBjMTEgPT09IDMyID8gIiAiIDogYzExID09PSAzNCA/ICciJyA6IGMxMSA9PT0gNDcgPyAiLyIgOiBjMTEgPT09IDkyID8gIlxcIiA6IGMxMSA9PT0gNzggPyAiXHg4NSIgOiBjMTEgPT09IDk1ID8gIlx4QTAiIDogYzExID09PSA3NiA/ICJcdTIwMjgiIDogYzExID09PSA4MCA/ICJcdTIwMjkiIDogIiI7CiAgICB9CiAgICBmdW5jdGlvbiBjaGFyRnJvbUNvZGVwb2ludChjMTEpIHsKICAgICAgaWYgKGMxMSA8PSA2NTUzNSkgewogICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGMxMSk7CiAgICAgIH0KICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoCiAgICAgICAgKGMxMSAtIDY1NTM2ID4+IDEwKSArIDU1Mjk2LAogICAgICAgIChjMTEgLSA2NTUzNiAmIDEwMjMpICsgNTYzMjAKICAgICAgKTsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFByb3BlcnR5KG9iamVjdCwga2V5MiwgdmFsdWUyKSB7CiAgICAgIGlmIChrZXkyID09PSAiX19wcm90b19fIikgewogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleTIsIHsKICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICAgIHZhbHVlOiB2YWx1ZTIKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvYmplY3Rba2V5Ml0gPSB2YWx1ZTI7CiAgICAgIH0KICAgIH0KICAgIHZhciBzaW1wbGVFc2NhcGVDaGVjayA9IG5ldyBBcnJheSgyNTYpOwogICAgdmFyIHNpbXBsZUVzY2FwZU1hcCA9IG5ldyBBcnJheSgyNTYpOwogICAgZm9yIChpMTEgPSAwOyBpMTEgPCAyNTY7IGkxMSsrKSB7CiAgICAgIHNpbXBsZUVzY2FwZUNoZWNrW2kxMV0gPSBzaW1wbGVFc2NhcGVTZXF1ZW5jZShpMTEpID8gMSA6IDA7CiAgICAgIHNpbXBsZUVzY2FwZU1hcFtpMTFdID0gc2ltcGxlRXNjYXBlU2VxdWVuY2UoaTExKTsKICAgIH0KICAgIGZ1bmN0aW9uIFN0YXRlKGlucHV0LCBvcHRpb25zKSB7CiAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKICAgICAgdGhpcy5maWxlbmFtZSA9IG9wdGlvbnNbImZpbGVuYW1lIl0gfHwgbnVsbDsKICAgICAgdGhpcy5zY2hlbWEgPSBvcHRpb25zWyJzY2hlbWEiXSB8fCBERUZBVUxUX0ZVTExfU0NIRU1BOwogICAgICB0aGlzLm9uV2FybmluZyA9IG9wdGlvbnNbIm9uV2FybmluZyJdIHx8IG51bGw7CiAgICAgIHRoaXMubGVnYWN5ID0gb3B0aW9uc1sibGVnYWN5Il0gfHwgZmFsc2U7CiAgICAgIHRoaXMuanNvbiA9IG9wdGlvbnNbImpzb24iXSB8fCBmYWxzZTsKICAgICAgdGhpcy5saXN0ZW5lciA9IG9wdGlvbnNbImxpc3RlbmVyIl0gfHwgbnVsbDsKICAgICAgdGhpcy5pbXBsaWNpdFR5cGVzID0gdGhpcy5zY2hlbWEuY29tcGlsZWRJbXBsaWNpdDsKICAgICAgdGhpcy50eXBlTWFwID0gdGhpcy5zY2hlbWEuY29tcGlsZWRUeXBlTWFwOwogICAgICB0aGlzLmxlbmd0aCA9IGlucHV0Lmxlbmd0aDsKICAgICAgdGhpcy5wb3NpdGlvbiA9IDA7CiAgICAgIHRoaXMubGluZSA9IDA7CiAgICAgIHRoaXMubGluZVN0YXJ0ID0gMDsKICAgICAgdGhpcy5saW5lSW5kZW50ID0gMDsKICAgICAgdGhpcy5kb2N1bWVudHMgPSBbXTsKICAgIH0KICAgIGZ1bmN0aW9uIGdlbmVyYXRlRXJyb3Ioc3RhdGUxMCwgbWVzc2FnZTIpIHsKICAgICAgcmV0dXJuIG5ldyBZQU1MRXhjZXB0aW9uKAogICAgICAgIG1lc3NhZ2UyLAogICAgICAgIG5ldyBNYXJrKHN0YXRlMTAuZmlsZW5hbWUsIHN0YXRlMTAuaW5wdXQsIHN0YXRlMTAucG9zaXRpb24sIHN0YXRlMTAubGluZSwgc3RhdGUxMC5wb3NpdGlvbiAtIHN0YXRlMTAubGluZVN0YXJ0KQogICAgICApOwogICAgfQogICAgZnVuY3Rpb24gdGhyb3dFcnJvcjIoc3RhdGUxMCwgbWVzc2FnZTIpIHsKICAgICAgdGhyb3cgZ2VuZXJhdGVFcnJvcihzdGF0ZTEwLCBtZXNzYWdlMik7CiAgICB9CiAgICBmdW5jdGlvbiB0aHJvd1dhcm5pbmcoc3RhdGUxMCwgbWVzc2FnZTIpIHsKICAgICAgaWYgKHN0YXRlMTAub25XYXJuaW5nKSB7CiAgICAgICAgc3RhdGUxMC5vbldhcm5pbmcuY2FsbChudWxsLCBnZW5lcmF0ZUVycm9yKHN0YXRlMTAsIG1lc3NhZ2UyKSk7CiAgICAgIH0KICAgIH0KICAgIHZhciBkaXJlY3RpdmVIYW5kbGVycyA9IHsKICAgICAgWUFNTDogZnVuY3Rpb24gaGFuZGxlWWFtbERpcmVjdGl2ZShzdGF0ZTEwLCBuYW1lLCBhcmdzKSB7CiAgICAgICAgdmFyIG1hdGNoMiwgbWFqb3IsIG1pbm9yOwogICAgICAgIGlmIChzdGF0ZTEwLnZlcnNpb24gIT09IG51bGwpIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJkdXBsaWNhdGlvbiBvZiAlWUFNTCBkaXJlY3RpdmUiKTsKICAgICAgICB9CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAxKSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiWUFNTCBkaXJlY3RpdmUgYWNjZXB0cyBleGFjdGx5IG9uZSBhcmd1bWVudCIpOwogICAgICAgIH0KICAgICAgICBtYXRjaDIgPSAvXihbMC05XSspXC4oWzAtOV0rKSQvLmV4ZWMoYXJnc1swXSk7CiAgICAgICAgaWYgKG1hdGNoMiA9PT0gbnVsbCkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgImlsbC1mb3JtZWQgYXJndW1lbnQgb2YgdGhlIFlBTUwgZGlyZWN0aXZlIik7CiAgICAgICAgfQogICAgICAgIG1ham9yID0gcGFyc2VJbnQobWF0Y2gyWzFdLCAxMCk7CiAgICAgICAgbWlub3IgPSBwYXJzZUludChtYXRjaDJbMl0sIDEwKTsKICAgICAgICBpZiAobWFqb3IgIT09IDEpIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJ1bmFjY2VwdGFibGUgWUFNTCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCIpOwogICAgICAgIH0KICAgICAgICBzdGF0ZTEwLnZlcnNpb24gPSBhcmdzWzBdOwogICAgICAgIHN0YXRlMTAuY2hlY2tMaW5lQnJlYWtzID0gbWlub3IgPCAyOwogICAgICAgIGlmIChtaW5vciAhPT0gMSAmJiBtaW5vciAhPT0gMikgewogICAgICAgICAgdGhyb3dXYXJuaW5nKHN0YXRlMTAsICJ1bnN1cHBvcnRlZCBZQU1MIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICBUQUc6IGZ1bmN0aW9uIGhhbmRsZVRhZ0RpcmVjdGl2ZShzdGF0ZTEwLCBuYW1lLCBhcmdzKSB7CiAgICAgICAgdmFyIGhhbmRsZTMsIHByZWZpeDQ7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiVEFHIGRpcmVjdGl2ZSBhY2NlcHRzIGV4YWN0bHkgdHdvIGFyZ3VtZW50cyIpOwogICAgICAgIH0KICAgICAgICBoYW5kbGUzID0gYXJnc1swXTsKICAgICAgICBwcmVmaXg0ID0gYXJnc1sxXTsKICAgICAgICBpZiAoIVBBVFRFUk5fVEFHX0hBTkRMRS50ZXN0KGhhbmRsZTMpKSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiaWxsLWZvcm1lZCB0YWcgaGFuZGxlIChmaXJzdCBhcmd1bWVudCkgb2YgdGhlIFRBRyBkaXJlY3RpdmUiKTsKICAgICAgICB9CiAgICAgICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlMTAudGFnTWFwLCBoYW5kbGUzKSkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgJ3RoZXJlIGlzIGEgcHJldmlvdXNseSBkZWNsYXJlZCBzdWZmaXggZm9yICInICsgaGFuZGxlMyArICciIHRhZyBoYW5kbGUnKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFQQVRURVJOX1RBR19VUkkudGVzdChwcmVmaXg0KSkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgImlsbC1mb3JtZWQgdGFnIHByZWZpeCAoc2Vjb25kIGFyZ3VtZW50KSBvZiB0aGUgVEFHIGRpcmVjdGl2ZSIpOwogICAgICAgIH0KICAgICAgICBzdGF0ZTEwLnRhZ01hcFtoYW5kbGUzXSA9IHByZWZpeDQ7CiAgICAgIH0KICAgIH07CiAgICBmdW5jdGlvbiBjYXB0dXJlU2VnbWVudChzdGF0ZTEwLCBzdGFydCwgZW5kMywgY2hlY2tKc29uKSB7CiAgICAgIHZhciBfcG9zaXRpb24sIF9sZW5ndGgsIF9jaGFyYWN0ZXIsIF9yZXN1bHQ7CiAgICAgIGlmIChzdGFydCA8IGVuZDMpIHsKICAgICAgICBfcmVzdWx0ID0gc3RhdGUxMC5pbnB1dC5zbGljZShzdGFydCwgZW5kMyk7CiAgICAgICAgaWYgKGNoZWNrSnNvbikgewogICAgICAgICAgZm9yIChfcG9zaXRpb24gPSAwLCBfbGVuZ3RoID0gX3Jlc3VsdC5sZW5ndGg7IF9wb3NpdGlvbiA8IF9sZW5ndGg7IF9wb3NpdGlvbiArPSAxKSB7CiAgICAgICAgICAgIF9jaGFyYWN0ZXIgPSBfcmVzdWx0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTsKICAgICAgICAgICAgaWYgKCEoX2NoYXJhY3RlciA9PT0gOSB8fCAzMiA8PSBfY2hhcmFjdGVyICYmIF9jaGFyYWN0ZXIgPD0gMTExNDExMSkpIHsKICAgICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiZXhwZWN0ZWQgdmFsaWQgSlNPTiBjaGFyYWN0ZXIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoUEFUVEVSTl9OT05fUFJJTlRBQkxFLnRlc3QoX3Jlc3VsdCkpIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJ0aGUgc3RyZWFtIGNvbnRhaW5zIG5vbi1wcmludGFibGUgY2hhcmFjdGVycyIpOwogICAgICAgIH0KICAgICAgICBzdGF0ZTEwLnJlc3VsdCArPSBfcmVzdWx0OwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBtZXJnZU1hcHBpbmdzKHN0YXRlMTAsIGRlc3RpbmF0aW9uLCBzb3VyY2UsIG92ZXJyaWRhYmxlS2V5cykgewogICAgICB2YXIgc291cmNlS2V5cywga2V5MiwgaW5kZXgyLCBxdWFudGl0eTsKICAgICAgaWYgKCFjb21tb24uaXNPYmplY3Qoc291cmNlKSkgewogICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJjYW5ub3QgbWVyZ2UgbWFwcGluZ3M7IHRoZSBwcm92aWRlZCBzb3VyY2Ugb2JqZWN0IGlzIHVuYWNjZXB0YWJsZSIpOwogICAgICB9CiAgICAgIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOwogICAgICBmb3IgKGluZGV4MiA9IDAsIHF1YW50aXR5ID0gc291cmNlS2V5cy5sZW5ndGg7IGluZGV4MiA8IHF1YW50aXR5OyBpbmRleDIgKz0gMSkgewogICAgICAgIGtleTIgPSBzb3VyY2VLZXlzW2luZGV4Ml07CiAgICAgICAgaWYgKCFfaGFzT3duUHJvcGVydHkuY2FsbChkZXN0aW5hdGlvbiwga2V5MikpIHsKICAgICAgICAgIHNldFByb3BlcnR5KGRlc3RpbmF0aW9uLCBrZXkyLCBzb3VyY2Vba2V5Ml0pOwogICAgICAgICAgb3ZlcnJpZGFibGVLZXlzW2tleTJdID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUxMCwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSwgc3RhcnRMaW5lLCBzdGFydFBvcykgewogICAgICB2YXIgaW5kZXgyLCBxdWFudGl0eTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5Tm9kZSkpIHsKICAgICAgICBrZXlOb2RlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoa2V5Tm9kZSk7CiAgICAgICAgZm9yIChpbmRleDIgPSAwLCBxdWFudGl0eSA9IGtleU5vZGUubGVuZ3RoOyBpbmRleDIgPCBxdWFudGl0eTsgaW5kZXgyICs9IDEpIHsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleU5vZGVbaW5kZXgyXSkpIHsKICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgIm5lc3RlZCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGtleXMiKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0eXBlb2Yga2V5Tm9kZSA9PT0gIm9iamVjdCIgJiYgX2NsYXNzKGtleU5vZGVbaW5kZXgyXSkgPT09ICJbb2JqZWN0IE9iamVjdF0iKSB7CiAgICAgICAgICAgIGtleU5vZGVbaW5kZXgyXSA9ICJbb2JqZWN0IE9iamVjdF0iOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodHlwZW9mIGtleU5vZGUgPT09ICJvYmplY3QiICYmIF9jbGFzcyhrZXlOb2RlKSA9PT0gIltvYmplY3QgT2JqZWN0XSIpIHsKICAgICAgICBrZXlOb2RlID0gIltvYmplY3QgT2JqZWN0XSI7CiAgICAgIH0KICAgICAga2V5Tm9kZSA9IFN0cmluZyhrZXlOb2RlKTsKICAgICAgaWYgKF9yZXN1bHQgPT09IG51bGwpIHsKICAgICAgICBfcmVzdWx0ID0ge307CiAgICAgIH0KICAgICAgaWYgKGtleVRhZyA9PT0gInRhZzp5YW1sLm9yZywyMDAyOm1lcmdlIikgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlTm9kZSkpIHsKICAgICAgICAgIGZvciAoaW5kZXgyID0gMCwgcXVhbnRpdHkgPSB2YWx1ZU5vZGUubGVuZ3RoOyBpbmRleDIgPCBxdWFudGl0eTsgaW5kZXgyICs9IDEpIHsKICAgICAgICAgICAgbWVyZ2VNYXBwaW5ncyhzdGF0ZTEwLCBfcmVzdWx0LCB2YWx1ZU5vZGVbaW5kZXgyXSwgb3ZlcnJpZGFibGVLZXlzKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWVyZ2VNYXBwaW5ncyhzdGF0ZTEwLCBfcmVzdWx0LCB2YWx1ZU5vZGUsIG92ZXJyaWRhYmxlS2V5cyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmICghc3RhdGUxMC5qc29uICYmICFfaGFzT3duUHJvcGVydHkuY2FsbChvdmVycmlkYWJsZUtleXMsIGtleU5vZGUpICYmIF9oYXNPd25Qcm9wZXJ0eS5jYWxsKF9yZXN1bHQsIGtleU5vZGUpKSB7CiAgICAgICAgICBzdGF0ZTEwLmxpbmUgPSBzdGFydExpbmUgfHwgc3RhdGUxMC5saW5lOwogICAgICAgICAgc3RhdGUxMC5wb3NpdGlvbiA9IHN0YXJ0UG9zIHx8IHN0YXRlMTAucG9zaXRpb247CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiZHVwbGljYXRlZCBtYXBwaW5nIGtleSIpOwogICAgICAgIH0KICAgICAgICBzZXRQcm9wZXJ0eShfcmVzdWx0LCBrZXlOb2RlLCB2YWx1ZU5vZGUpOwogICAgICAgIGRlbGV0ZSBvdmVycmlkYWJsZUtleXNba2V5Tm9kZV07CiAgICAgIH0KICAgICAgcmV0dXJuIF9yZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiByZWFkTGluZUJyZWFrKHN0YXRlMTApIHsKICAgICAgdmFyIGNoOwogICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgaWYgKGNoID09PSAxMCkgewogICAgICAgIHN0YXRlMTAucG9zaXRpb24rKzsKICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMTMpIHsKICAgICAgICBzdGF0ZTEwLnBvc2l0aW9uKys7CiAgICAgICAgaWYgKHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uKSA9PT0gMTApIHsKICAgICAgICAgIHN0YXRlMTAucG9zaXRpb24rKzsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgImEgbGluZSBicmVhayBpcyBleHBlY3RlZCIpOwogICAgICB9CiAgICAgIHN0YXRlMTAubGluZSArPSAxOwogICAgICBzdGF0ZTEwLmxpbmVTdGFydCA9IHN0YXRlMTAucG9zaXRpb247CiAgICB9CiAgICBmdW5jdGlvbiBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlMTAsIGFsbG93Q29tbWVudHMsIGNoZWNrSW5kZW50KSB7CiAgICAgIHZhciBsaW5lQnJlYWtzID0gMCwgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgIHdoaWxlIChjaCAhPT0gMCkgewogICAgICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHsKICAgICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgfQogICAgICAgIGlmIChhbGxvd0NvbW1lbnRzICYmIGNoID09PSAzNSkgewogICAgICAgICAgZG8gewogICAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgICAgfSB3aGlsZSAoY2ggIT09IDEwICYmIGNoICE9PSAxMyAmJiBjaCAhPT0gMCk7CiAgICAgICAgfQogICAgICAgIGlmIChpc19FT0woY2gpKSB7CiAgICAgICAgICByZWFkTGluZUJyZWFrKHN0YXRlMTApOwogICAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgICBsaW5lQnJlYWtzKys7CiAgICAgICAgICBzdGF0ZTEwLmxpbmVJbmRlbnQgPSAwOwogICAgICAgICAgd2hpbGUgKGNoID09PSAzMikgewogICAgICAgICAgICBzdGF0ZTEwLmxpbmVJbmRlbnQrKzsKICAgICAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjaGVja0luZGVudCAhPT0gLTEgJiYgbGluZUJyZWFrcyAhPT0gMCAmJiBzdGF0ZTEwLmxpbmVJbmRlbnQgPCBjaGVja0luZGVudCkgewogICAgICAgIHRocm93V2FybmluZyhzdGF0ZTEwLCAiZGVmaWNpZW50IGluZGVudGF0aW9uIik7CiAgICAgIH0KICAgICAgcmV0dXJuIGxpbmVCcmVha3M7CiAgICB9CiAgICBmdW5jdGlvbiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUxMCkgewogICAgICB2YXIgX3Bvc2l0aW9uID0gc3RhdGUxMC5wb3NpdGlvbiwgY2g7CiAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7CiAgICAgIGlmICgoY2ggPT09IDQ1IHx8IGNoID09PSA0NikgJiYgY2ggPT09IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24gKyAxKSAmJiBjaCA9PT0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbiArIDIpKSB7CiAgICAgICAgX3Bvc2l0aW9uICs9IDM7CiAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTsKICAgICAgICBpZiAoY2ggPT09IDAgfHwgaXNfV1NfT1JfRU9MKGNoKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZ1bmN0aW9uIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUxMCwgY291bnQyKSB7CiAgICAgIGlmIChjb3VudDIgPT09IDEpIHsKICAgICAgICBzdGF0ZTEwLnJlc3VsdCArPSAiICI7CiAgICAgIH0gZWxzZSBpZiAoY291bnQyID4gMSkgewogICAgICAgIHN0YXRlMTAucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoIlxuIiwgY291bnQyIC0gMSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRQbGFpblNjYWxhcihzdGF0ZTEwLCBub2RlSW5kZW50LCB3aXRoaW5GbG93Q29sbGVjdGlvbikgewogICAgICB2YXIgcHJlY2VkaW5nLCBmb2xsb3dpbmcsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgaGFzUGVuZGluZ0NvbnRlbnQsIF9saW5lLCBfbGluZVN0YXJ0LCBfbGluZUluZGVudCwgX2tpbmQgPSBzdGF0ZTEwLmtpbmQsIF9yZXN1bHQgPSBzdGF0ZTEwLnJlc3VsdCwgY2g7CiAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pOwogICAgICBpZiAoaXNfV1NfT1JfRU9MKGNoKSB8fCBpc19GTE9XX0lORElDQVRPUihjaCkgfHwgY2ggPT09IDM1IHx8IGNoID09PSAzOCB8fCBjaCA9PT0gNDIgfHwgY2ggPT09IDMzIHx8IGNoID09PSAxMjQgfHwgY2ggPT09IDYyIHx8IGNoID09PSAzOSB8fCBjaCA9PT0gMzQgfHwgY2ggPT09IDM3IHx8IGNoID09PSA2NCB8fCBjaCA9PT0gOTYpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGNoID09PSA2MyB8fCBjaCA9PT0gNDUpIHsKICAgICAgICBmb2xsb3dpbmcgPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbiArIDEpOwogICAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSB8fCB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihmb2xsb3dpbmcpKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0YXRlMTAua2luZCA9ICJzY2FsYXIiOwogICAgICBzdGF0ZTEwLnJlc3VsdCA9ICIiOwogICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUxMC5wb3NpdGlvbjsKICAgICAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTsKICAgICAgd2hpbGUgKGNoICE9PSAwKSB7CiAgICAgICAgaWYgKGNoID09PSA1OCkgewogICAgICAgICAgZm9sbG93aW5nID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24gKyAxKTsKICAgICAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSB8fCB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihmb2xsb3dpbmcpKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDM1KSB7CiAgICAgICAgICBwcmVjZWRpbmcgPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbiAtIDEpOwogICAgICAgICAgaWYgKGlzX1dTX09SX0VPTChwcmVjZWRpbmcpKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RhdGUxMC5wb3NpdGlvbiA9PT0gc3RhdGUxMC5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlMTApIHx8IHdpdGhpbkZsb3dDb2xsZWN0aW9uICYmIGlzX0ZMT1dfSU5ESUNBVE9SKGNoKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7CiAgICAgICAgICBfbGluZSA9IHN0YXRlMTAubGluZTsKICAgICAgICAgIF9saW5lU3RhcnQgPSBzdGF0ZTEwLmxpbmVTdGFydDsKICAgICAgICAgIF9saW5lSW5kZW50ID0gc3RhdGUxMC5saW5lSW5kZW50OwogICAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZTEwLCBmYWxzZSwgLTEpOwogICAgICAgICAgaWYgKHN0YXRlMTAubGluZUluZGVudCA+PSBub2RlSW5kZW50KSB7CiAgICAgICAgICAgIGhhc1BlbmRpbmdDb250ZW50ID0gdHJ1ZTsKICAgICAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdGUxMC5wb3NpdGlvbiA9IGNhcHR1cmVFbmQ7CiAgICAgICAgICAgIHN0YXRlMTAubGluZSA9IF9saW5lOwogICAgICAgICAgICBzdGF0ZTEwLmxpbmVTdGFydCA9IF9saW5lU3RhcnQ7CiAgICAgICAgICAgIHN0YXRlMTAubGluZUluZGVudCA9IF9saW5lSW5kZW50OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGhhc1BlbmRpbmdDb250ZW50KSB7CiAgICAgICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZTEwLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIGZhbHNlKTsKICAgICAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUxMCwgc3RhdGUxMC5saW5lIC0gX2xpbmUpOwogICAgICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlMTAucG9zaXRpb247CiAgICAgICAgICBoYXNQZW5kaW5nQ29udGVudCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzX1dISVRFX1NQQUNFKGNoKSkgewogICAgICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlMTAucG9zaXRpb24gKyAxOwogICAgICAgIH0KICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICB9CiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlMTAsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgZmFsc2UpOwogICAgICBpZiAoc3RhdGUxMC5yZXN1bHQpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBzdGF0ZTEwLmtpbmQgPSBfa2luZDsKICAgICAgc3RhdGUxMC5yZXN1bHQgPSBfcmVzdWx0OwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBmdW5jdGlvbiByZWFkU2luZ2xlUXVvdGVkU2NhbGFyKHN0YXRlMTAsIG5vZGVJbmRlbnQpIHsKICAgICAgdmFyIGNoLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQ7CiAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pOwogICAgICBpZiAoY2ggIT09IDM5KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHN0YXRlMTAua2luZCA9ICJzY2FsYXIiOwogICAgICBzdGF0ZTEwLnJlc3VsdCA9ICIiOwogICAgICBzdGF0ZTEwLnBvc2l0aW9uKys7CiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZTEwLnBvc2l0aW9uOwogICAgICB3aGlsZSAoKGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pKSAhPT0gMCkgewogICAgICAgIGlmIChjaCA9PT0gMzkpIHsKICAgICAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlMTAsIGNhcHR1cmVTdGFydCwgc3RhdGUxMC5wb3NpdGlvbiwgdHJ1ZSk7CiAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgICAgaWYgKGNoID09PSAzOSkgewogICAgICAgICAgICBjYXB0dXJlU3RhcnQgPSBzdGF0ZTEwLnBvc2l0aW9uOwogICAgICAgICAgICBzdGF0ZTEwLnBvc2l0aW9uKys7CiAgICAgICAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZTEwLnBvc2l0aW9uOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7CiAgICAgICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZTEwLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIHRydWUpOwogICAgICAgICAgd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZTEwLCBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlMTAsIGZhbHNlLCBub2RlSW5kZW50KSk7CiAgICAgICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUxMC5wb3NpdGlvbjsKICAgICAgICB9IGVsc2UgaWYgKHN0YXRlMTAucG9zaXRpb24gPT09IHN0YXRlMTAubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZTEwKSkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgInVuZXhwZWN0ZWQgZW5kIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gYSBzaW5nbGUgcXVvdGVkIHNjYWxhciIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdGF0ZTEwLnBvc2l0aW9uKys7CiAgICAgICAgICBjYXB0dXJlRW5kID0gc3RhdGUxMC5wb3NpdGlvbjsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgInVuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgc2luZ2xlIHF1b3RlZCBzY2FsYXIiKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWREb3VibGVRdW90ZWRTY2FsYXIoc3RhdGUxMCwgbm9kZUluZGVudCkgewogICAgICB2YXIgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBoZXhMZW5ndGgsIGhleFJlc3VsdCwgdG1wLCBjaDsKICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgIGlmIChjaCAhPT0gMzQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgc3RhdGUxMC5raW5kID0gInNjYWxhciI7CiAgICAgIHN0YXRlMTAucmVzdWx0ID0gIiI7CiAgICAgIHN0YXRlMTAucG9zaXRpb24rKzsKICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlMTAucG9zaXRpb247CiAgICAgIHdoaWxlICgoY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbikpICE9PSAwKSB7CiAgICAgICAgaWYgKGNoID09PSAzNCkgewogICAgICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUxMCwgY2FwdHVyZVN0YXJ0LCBzdGF0ZTEwLnBvc2l0aW9uLCB0cnVlKTsKICAgICAgICAgIHN0YXRlMTAucG9zaXRpb24rKzsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDkyKSB7CiAgICAgICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZTEwLCBjYXB0dXJlU3RhcnQsIHN0YXRlMTAucG9zaXRpb24sIHRydWUpOwogICAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgICAgIGlmIChpc19FT0woY2gpKSB7CiAgICAgICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgZmFsc2UsIG5vZGVJbmRlbnQpOwogICAgICAgICAgfSBlbHNlIGlmIChjaCA8IDI1NiAmJiBzaW1wbGVFc2NhcGVDaGVja1tjaF0pIHsKICAgICAgICAgICAgc3RhdGUxMC5yZXN1bHQgKz0gc2ltcGxlRXNjYXBlTWFwW2NoXTsKICAgICAgICAgICAgc3RhdGUxMC5wb3NpdGlvbisrOwogICAgICAgICAgfSBlbHNlIGlmICgodG1wID0gZXNjYXBlZEhleExlbihjaCkpID4gMCkgewogICAgICAgICAgICBoZXhMZW5ndGggPSB0bXA7CiAgICAgICAgICAgIGhleFJlc3VsdCA9IDA7CiAgICAgICAgICAgIGZvciAoOyBoZXhMZW5ndGggPiAwOyBoZXhMZW5ndGgtLSkgewogICAgICAgICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgICAgICAgaWYgKCh0bXAgPSBmcm9tSGV4Q29kZShjaCkpID49IDApIHsKICAgICAgICAgICAgICAgIGhleFJlc3VsdCA9IChoZXhSZXN1bHQgPDwgNCkgKyB0bXA7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJleHBlY3RlZCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUxMC5yZXN1bHQgKz0gY2hhckZyb21Db2RlcG9pbnQoaGV4UmVzdWx0KTsKICAgICAgICAgICAgc3RhdGUxMC5wb3NpdGlvbisrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgInVua25vd24gZXNjYXBlIHNlcXVlbmNlIik7CiAgICAgICAgICB9CiAgICAgICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUxMC5wb3NpdGlvbjsKICAgICAgICB9IGVsc2UgaWYgKGlzX0VPTChjaCkpIHsKICAgICAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlMTAsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgdHJ1ZSk7CiAgICAgICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlMTAsIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgZmFsc2UsIG5vZGVJbmRlbnQpKTsKICAgICAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZTEwLnBvc2l0aW9uOwogICAgICAgIH0gZWxzZSBpZiAoc3RhdGUxMC5wb3NpdGlvbiA9PT0gc3RhdGUxMC5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlMTApKSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAidW5leHBlY3RlZCBlbmQgb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBhIGRvdWJsZSBxdW90ZWQgc2NhbGFyIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0YXRlMTAucG9zaXRpb24rKzsKICAgICAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZTEwLnBvc2l0aW9uOwogICAgICAgIH0KICAgICAgfQogICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAidW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBkb3VibGUgcXVvdGVkIHNjYWxhciIpOwogICAgfQogICAgZnVuY3Rpb24gcmVhZEZsb3dDb2xsZWN0aW9uKHN0YXRlMTAsIG5vZGVJbmRlbnQpIHsKICAgICAgdmFyIHJlYWROZXh0ID0gdHJ1ZSwgX2xpbmUsIF90YWcgPSBzdGF0ZTEwLnRhZywgX3Jlc3VsdCwgX2FuY2hvciA9IHN0YXRlMTAuYW5jaG9yLCBmb2xsb3dpbmcsIHRlcm1pbmF0b3IsIGlzUGFpciwgaXNFeHBsaWNpdFBhaXIsIGlzTWFwcGluZywgb3ZlcnJpZGFibGVLZXlzID0ge30sIGtleU5vZGUsIGtleVRhZywgdmFsdWVOb2RlLCBjaDsKICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgIGlmIChjaCA9PT0gOTEpIHsKICAgICAgICB0ZXJtaW5hdG9yID0gOTM7CiAgICAgICAgaXNNYXBwaW5nID0gZmFsc2U7CiAgICAgICAgX3Jlc3VsdCA9IFtdOwogICAgICB9IGVsc2UgaWYgKGNoID09PSAxMjMpIHsKICAgICAgICB0ZXJtaW5hdG9yID0gMTI1OwogICAgICAgIGlzTWFwcGluZyA9IHRydWU7CiAgICAgICAgX3Jlc3VsdCA9IHt9OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAoc3RhdGUxMC5hbmNob3IgIT09IG51bGwpIHsKICAgICAgICBzdGF0ZTEwLmFuY2hvck1hcFtzdGF0ZTEwLmFuY2hvcl0gPSBfcmVzdWx0OwogICAgICB9CiAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgIHdoaWxlIChjaCAhPT0gMCkgewogICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgbm9kZUluZGVudCk7CiAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgaWYgKGNoID09PSB0ZXJtaW5hdG9yKSB7CiAgICAgICAgICBzdGF0ZTEwLnBvc2l0aW9uKys7CiAgICAgICAgICBzdGF0ZTEwLnRhZyA9IF90YWc7CiAgICAgICAgICBzdGF0ZTEwLmFuY2hvciA9IF9hbmNob3I7CiAgICAgICAgICBzdGF0ZTEwLmtpbmQgPSBpc01hcHBpbmcgPyAibWFwcGluZyIgOiAic2VxdWVuY2UiOwogICAgICAgICAgc3RhdGUxMC5yZXN1bHQgPSBfcmVzdWx0OwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIGlmICghcmVhZE5leHQpIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJtaXNzZWQgY29tbWEgYmV0d2VlbiBmbG93IGNvbGxlY3Rpb24gZW50cmllcyIpOwogICAgICAgIH0KICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDsKICAgICAgICBpc1BhaXIgPSBpc0V4cGxpY2l0UGFpciA9IGZhbHNlOwogICAgICAgIGlmIChjaCA9PT0gNjMpIHsKICAgICAgICAgIGZvbGxvd2luZyA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uICsgMSk7CiAgICAgICAgICBpZiAoaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHsKICAgICAgICAgICAgaXNQYWlyID0gaXNFeHBsaWNpdFBhaXIgPSB0cnVlOwogICAgICAgICAgICBzdGF0ZTEwLnBvc2l0aW9uKys7CiAgICAgICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgbm9kZUluZGVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9saW5lID0gc3RhdGUxMC5saW5lOwogICAgICAgIGNvbXBvc2VOb2RlKHN0YXRlMTAsIG5vZGVJbmRlbnQsIENPTlRFWFRfRkxPV19JTiwgZmFsc2UsIHRydWUpOwogICAgICAgIGtleVRhZyA9IHN0YXRlMTAudGFnOwogICAgICAgIGtleU5vZGUgPSBzdGF0ZTEwLnJlc3VsdDsKICAgICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlMTAsIHRydWUsIG5vZGVJbmRlbnQpOwogICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pOwogICAgICAgIGlmICgoaXNFeHBsaWNpdFBhaXIgfHwgc3RhdGUxMC5saW5lID09PSBfbGluZSkgJiYgY2ggPT09IDU4KSB7CiAgICAgICAgICBpc1BhaXIgPSB0cnVlOwogICAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgbm9kZUluZGVudCk7CiAgICAgICAgICBjb21wb3NlTm9kZShzdGF0ZTEwLCBub2RlSW5kZW50LCBDT05URVhUX0ZMT1dfSU4sIGZhbHNlLCB0cnVlKTsKICAgICAgICAgIHZhbHVlTm9kZSA9IHN0YXRlMTAucmVzdWx0OwogICAgICAgIH0KICAgICAgICBpZiAoaXNNYXBwaW5nKSB7CiAgICAgICAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlMTAsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUpOwogICAgICAgIH0gZWxzZSBpZiAoaXNQYWlyKSB7CiAgICAgICAgICBfcmVzdWx0LnB1c2goc3RvcmVNYXBwaW5nUGFpcihzdGF0ZTEwLCBudWxsLCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF9yZXN1bHQucHVzaChrZXlOb2RlKTsKICAgICAgICB9CiAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZTEwLCB0cnVlLCBub2RlSW5kZW50KTsKICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgICBpZiAoY2ggPT09IDQ0KSB7CiAgICAgICAgICByZWFkTmV4dCA9IHRydWU7CiAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZWFkTmV4dCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAidW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBmbG93IGNvbGxlY3Rpb24iKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRCbG9ja1NjYWxhcihzdGF0ZTEwLCBub2RlSW5kZW50KSB7CiAgICAgIHZhciBjYXB0dXJlU3RhcnQsIGZvbGRpbmcsIGNob21waW5nID0gQ0hPTVBJTkdfQ0xJUCwgZGlkUmVhZENvbnRlbnQgPSBmYWxzZSwgZGV0ZWN0ZWRJbmRlbnQgPSBmYWxzZSwgdGV4dEluZGVudCA9IG5vZGVJbmRlbnQsIGVtcHR5TGluZXMgPSAwLCBhdE1vcmVJbmRlbnRlZCA9IGZhbHNlLCB0bXAsIGNoOwogICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgaWYgKGNoID09PSAxMjQpIHsKICAgICAgICBmb2xkaW5nID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDYyKSB7CiAgICAgICAgZm9sZGluZyA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHN0YXRlMTAua2luZCA9ICJzY2FsYXIiOwogICAgICBzdGF0ZTEwLnJlc3VsdCA9ICIiOwogICAgICB3aGlsZSAoY2ggIT09IDApIHsKICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgIGlmIChjaCA9PT0gNDMgfHwgY2ggPT09IDQ1KSB7CiAgICAgICAgICBpZiAoQ0hPTVBJTkdfQ0xJUCA9PT0gY2hvbXBpbmcpIHsKICAgICAgICAgICAgY2hvbXBpbmcgPSBjaCA9PT0gNDMgPyBDSE9NUElOR19LRUVQIDogQ0hPTVBJTkdfU1RSSVA7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAicmVwZWF0IG9mIGEgY2hvbXBpbmcgbW9kZSBpZGVudGlmaWVyIik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICgodG1wID0gZnJvbURlY2ltYWxDb2RlKGNoKSkgPj0gMCkgewogICAgICAgICAgaWYgKHRtcCA9PT0gMCkgewogICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiYmFkIGV4cGxpY2l0IGluZGVudGF0aW9uIHdpZHRoIG9mIGEgYmxvY2sgc2NhbGFyOyBpdCBjYW5ub3QgYmUgbGVzcyB0aGFuIG9uZSIpOwogICAgICAgICAgfSBlbHNlIGlmICghZGV0ZWN0ZWRJbmRlbnQpIHsKICAgICAgICAgICAgdGV4dEluZGVudCA9IG5vZGVJbmRlbnQgKyB0bXAgLSAxOwogICAgICAgICAgICBkZXRlY3RlZEluZGVudCA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAicmVwZWF0IG9mIGFuIGluZGVudGF0aW9uIHdpZHRoIGlkZW50aWZpZXIiKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpc19XSElURV9TUEFDRShjaCkpIHsKICAgICAgICBkbyB7CiAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgIH0gd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSk7CiAgICAgICAgaWYgKGNoID09PSAzNSkgewogICAgICAgICAgZG8gewogICAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgICAgfSB3aGlsZSAoIWlzX0VPTChjaCkgJiYgY2ggIT09IDApOwogICAgICAgIH0KICAgICAgfQogICAgICB3aGlsZSAoY2ggIT09IDApIHsKICAgICAgICByZWFkTGluZUJyZWFrKHN0YXRlMTApOwogICAgICAgIHN0YXRlMTAubGluZUluZGVudCA9IDA7CiAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgd2hpbGUgKCghZGV0ZWN0ZWRJbmRlbnQgfHwgc3RhdGUxMC5saW5lSW5kZW50IDwgdGV4dEluZGVudCkgJiYgY2ggPT09IDMyKSB7CiAgICAgICAgICBzdGF0ZTEwLmxpbmVJbmRlbnQrKzsKICAgICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgfQogICAgICAgIGlmICghZGV0ZWN0ZWRJbmRlbnQgJiYgc3RhdGUxMC5saW5lSW5kZW50ID4gdGV4dEluZGVudCkgewogICAgICAgICAgdGV4dEluZGVudCA9IHN0YXRlMTAubGluZUluZGVudDsKICAgICAgICB9CiAgICAgICAgaWYgKGlzX0VPTChjaCkpIHsKICAgICAgICAgIGVtcHR5TGluZXMrKzsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoc3RhdGUxMC5saW5lSW5kZW50IDwgdGV4dEluZGVudCkgewogICAgICAgICAgaWYgKGNob21waW5nID09PSBDSE9NUElOR19LRUVQKSB7CiAgICAgICAgICAgIHN0YXRlMTAucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoIlxuIiwgZGlkUmVhZENvbnRlbnQgPyAxICsgZW1wdHlMaW5lcyA6IGVtcHR5TGluZXMpOwogICAgICAgICAgfSBlbHNlIGlmIChjaG9tcGluZyA9PT0gQ0hPTVBJTkdfQ0xJUCkgewogICAgICAgICAgICBpZiAoZGlkUmVhZENvbnRlbnQpIHsKICAgICAgICAgICAgICBzdGF0ZTEwLnJlc3VsdCArPSAiXG4iOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGZvbGRpbmcpIHsKICAgICAgICAgIGlmIChpc19XSElURV9TUEFDRShjaCkpIHsKICAgICAgICAgICAgYXRNb3JlSW5kZW50ZWQgPSB0cnVlOwogICAgICAgICAgICBzdGF0ZTEwLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCJcbiIsIGRpZFJlYWRDb250ZW50ID8gMSArIGVtcHR5TGluZXMgOiBlbXB0eUxpbmVzKTsKICAgICAgICAgIH0gZWxzZSBpZiAoYXRNb3JlSW5kZW50ZWQpIHsKICAgICAgICAgICAgYXRNb3JlSW5kZW50ZWQgPSBmYWxzZTsKICAgICAgICAgICAgc3RhdGUxMC5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgiXG4iLCBlbXB0eUxpbmVzICsgMSk7CiAgICAgICAgICB9IGVsc2UgaWYgKGVtcHR5TGluZXMgPT09IDApIHsKICAgICAgICAgICAgaWYgKGRpZFJlYWRDb250ZW50KSB7CiAgICAgICAgICAgICAgc3RhdGUxMC5yZXN1bHQgKz0gIiAiOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGF0ZTEwLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCJcbiIsIGVtcHR5TGluZXMpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdGF0ZTEwLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCJcbiIsIGRpZFJlYWRDb250ZW50ID8gMSArIGVtcHR5TGluZXMgOiBlbXB0eUxpbmVzKTsKICAgICAgICB9CiAgICAgICAgZGlkUmVhZENvbnRlbnQgPSB0cnVlOwogICAgICAgIGRldGVjdGVkSW5kZW50ID0gdHJ1ZTsKICAgICAgICBlbXB0eUxpbmVzID0gMDsKICAgICAgICBjYXB0dXJlU3RhcnQgPSBzdGF0ZTEwLnBvc2l0aW9uOwogICAgICAgIHdoaWxlICghaXNfRU9MKGNoKSAmJiBjaCAhPT0gMCkgewogICAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgICB9CiAgICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUxMCwgY2FwdHVyZVN0YXJ0LCBzdGF0ZTEwLnBvc2l0aW9uLCBmYWxzZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiByZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZTEwLCBub2RlSW5kZW50KSB7CiAgICAgIHZhciBfbGluZSwgX3RhZyA9IHN0YXRlMTAudGFnLCBfYW5jaG9yID0gc3RhdGUxMC5hbmNob3IsIF9yZXN1bHQgPSBbXSwgZm9sbG93aW5nLCBkZXRlY3RlZCA9IGZhbHNlLCBjaDsKICAgICAgaWYgKHN0YXRlMTAuYW5jaG9yICE9PSBudWxsKSB7CiAgICAgICAgc3RhdGUxMC5hbmNob3JNYXBbc3RhdGUxMC5hbmNob3JdID0gX3Jlc3VsdDsKICAgICAgfQogICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgd2hpbGUgKGNoICE9PSAwKSB7CiAgICAgICAgaWYgKGNoICE9PSA0NSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGZvbGxvd2luZyA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uICsgMSk7CiAgICAgICAgaWYgKCFpc19XU19PUl9FT0woZm9sbG93aW5nKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGRldGVjdGVkID0gdHJ1ZTsKICAgICAgICBzdGF0ZTEwLnBvc2l0aW9uKys7CiAgICAgICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgLTEpKSB7CiAgICAgICAgICBpZiAoc3RhdGUxMC5saW5lSW5kZW50IDw9IG5vZGVJbmRlbnQpIHsKICAgICAgICAgICAgX3Jlc3VsdC5wdXNoKG51bGwpOwogICAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9saW5lID0gc3RhdGUxMC5saW5lOwogICAgICAgIGNvbXBvc2VOb2RlKHN0YXRlMTAsIG5vZGVJbmRlbnQsIENPTlRFWFRfQkxPQ0tfSU4sIGZhbHNlLCB0cnVlKTsKICAgICAgICBfcmVzdWx0LnB1c2goc3RhdGUxMC5yZXN1bHQpOwogICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgLTEpOwogICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pOwogICAgICAgIGlmICgoc3RhdGUxMC5saW5lID09PSBfbGluZSB8fCBzdGF0ZTEwLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50KSAmJiBjaCAhPT0gMCkgewogICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgImJhZCBpbmRlbnRhdGlvbiBvZiBhIHNlcXVlbmNlIGVudHJ5Iik7CiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZTEwLmxpbmVJbmRlbnQgPCBub2RlSW5kZW50KSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRldGVjdGVkKSB7CiAgICAgICAgc3RhdGUxMC50YWcgPSBfdGFnOwogICAgICAgIHN0YXRlMTAuYW5jaG9yID0gX2FuY2hvcjsKICAgICAgICBzdGF0ZTEwLmtpbmQgPSAic2VxdWVuY2UiOwogICAgICAgIHN0YXRlMTAucmVzdWx0ID0gX3Jlc3VsdDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBmdW5jdGlvbiByZWFkQmxvY2tNYXBwaW5nKHN0YXRlMTAsIG5vZGVJbmRlbnQsIGZsb3dJbmRlbnQpIHsKICAgICAgdmFyIGZvbGxvd2luZywgYWxsb3dDb21wYWN0LCBfbGluZSwgX3BvcywgX3RhZyA9IHN0YXRlMTAudGFnLCBfYW5jaG9yID0gc3RhdGUxMC5hbmNob3IsIF9yZXN1bHQgPSB7fSwgb3ZlcnJpZGFibGVLZXlzID0ge30sIGtleVRhZyA9IG51bGwsIGtleU5vZGUgPSBudWxsLCB2YWx1ZU5vZGUgPSBudWxsLCBhdEV4cGxpY2l0S2V5ID0gZmFsc2UsIGRldGVjdGVkID0gZmFsc2UsIGNoOwogICAgICBpZiAoc3RhdGUxMC5hbmNob3IgIT09IG51bGwpIHsKICAgICAgICBzdGF0ZTEwLmFuY2hvck1hcFtzdGF0ZTEwLmFuY2hvcl0gPSBfcmVzdWx0OwogICAgICB9CiAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pOwogICAgICB3aGlsZSAoY2ggIT09IDApIHsKICAgICAgICBmb2xsb3dpbmcgPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbiArIDEpOwogICAgICAgIF9saW5lID0gc3RhdGUxMC5saW5lOwogICAgICAgIF9wb3MgPSBzdGF0ZTEwLnBvc2l0aW9uOwogICAgICAgIGlmICgoY2ggPT09IDYzIHx8IGNoID09PSA1OCkgJiYgaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHsKICAgICAgICAgIGlmIChjaCA9PT0gNjMpIHsKICAgICAgICAgICAgaWYgKGF0RXhwbGljaXRLZXkpIHsKICAgICAgICAgICAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlMTAsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTsKICAgICAgICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXRlY3RlZCA9IHRydWU7CiAgICAgICAgICAgIGF0RXhwbGljaXRLZXkgPSB0cnVlOwogICAgICAgICAgICBhbGxvd0NvbXBhY3QgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIGlmIChhdEV4cGxpY2l0S2V5KSB7CiAgICAgICAgICAgIGF0RXhwbGljaXRLZXkgPSBmYWxzZTsKICAgICAgICAgICAgYWxsb3dDb21wYWN0ID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJpbmNvbXBsZXRlIGV4cGxpY2l0IG1hcHBpbmcgcGFpcjsgYSBrZXkgbm9kZSBpcyBtaXNzZWQ7IG9yIGZvbGxvd2VkIGJ5IGEgbm9uLXRhYnVsYXRlZCBlbXB0eSBsaW5lIik7CiAgICAgICAgICB9CiAgICAgICAgICBzdGF0ZTEwLnBvc2l0aW9uICs9IDE7CiAgICAgICAgICBjaCA9IGZvbGxvd2luZzsKICAgICAgICB9IGVsc2UgaWYgKGNvbXBvc2VOb2RlKHN0YXRlMTAsIGZsb3dJbmRlbnQsIENPTlRFWFRfRkxPV19PVVQsIGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgaWYgKHN0YXRlMTAubGluZSA9PT0gX2xpbmUpIHsKICAgICAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHsKICAgICAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjaCA9PT0gNTgpIHsKICAgICAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgICAgICAgIGlmICghaXNfV1NfT1JfRU9MKGNoKSkgewogICAgICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgImEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgZXhwZWN0ZWQgYWZ0ZXIgdGhlIGtleS12YWx1ZSBzZXBhcmF0b3Igd2l0aGluIGEgYmxvY2sgbWFwcGluZyIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkgewogICAgICAgICAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZTEwLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgbnVsbCk7CiAgICAgICAgICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZGV0ZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgIGF0RXhwbGljaXRLZXkgPSBmYWxzZTsKICAgICAgICAgICAgICBhbGxvd0NvbXBhY3QgPSBmYWxzZTsKICAgICAgICAgICAgICBrZXlUYWcgPSBzdGF0ZTEwLnRhZzsKICAgICAgICAgICAgICBrZXlOb2RlID0gc3RhdGUxMC5yZXN1bHQ7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGV0ZWN0ZWQpIHsKICAgICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiY2FuIG5vdCByZWFkIGFuIGltcGxpY2l0IG1hcHBpbmcgcGFpcjsgYSBjb2xvbiBpcyBtaXNzZWQiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzdGF0ZTEwLnRhZyA9IF90YWc7CiAgICAgICAgICAgICAgc3RhdGUxMC5hbmNob3IgPSBfYW5jaG9yOwogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKGRldGVjdGVkKSB7CiAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJjYW4gbm90IHJlYWQgYSBibG9jayBtYXBwaW5nIGVudHJ5OyBhIG11bHRpbGluZSBrZXkgbWF5IG5vdCBiZSBhbiBpbXBsaWNpdCBrZXkiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YXRlMTAudGFnID0gX3RhZzsKICAgICAgICAgICAgc3RhdGUxMC5hbmNob3IgPSBfYW5jaG9yOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZTEwLmxpbmUgPT09IF9saW5lIHx8IHN0YXRlMTAubGluZUluZGVudCA+IG5vZGVJbmRlbnQpIHsKICAgICAgICAgIGlmIChjb21wb3NlTm9kZShzdGF0ZTEwLCBub2RlSW5kZW50LCBDT05URVhUX0JMT0NLX09VVCwgdHJ1ZSwgYWxsb3dDb21wYWN0KSkgewogICAgICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkgewogICAgICAgICAgICAgIGtleU5vZGUgPSBzdGF0ZTEwLnJlc3VsdDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YWx1ZU5vZGUgPSBzdGF0ZTEwLnJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKCFhdEV4cGxpY2l0S2V5KSB7CiAgICAgICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUxMCwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSwgX2xpbmUsIF9wb3MpOwogICAgICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgLTEpOwogICAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZTEwLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50ICYmIGNoICE9PSAwKSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiYmFkIGluZGVudGF0aW9uIG9mIGEgbWFwcGluZyBlbnRyeSIpOwogICAgICAgIH0gZWxzZSBpZiAoc3RhdGUxMC5saW5lSW5kZW50IDwgbm9kZUluZGVudCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChhdEV4cGxpY2l0S2V5KSB7CiAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZTEwLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgbnVsbCk7CiAgICAgIH0KICAgICAgaWYgKGRldGVjdGVkKSB7CiAgICAgICAgc3RhdGUxMC50YWcgPSBfdGFnOwogICAgICAgIHN0YXRlMTAuYW5jaG9yID0gX2FuY2hvcjsKICAgICAgICBzdGF0ZTEwLmtpbmQgPSAibWFwcGluZyI7CiAgICAgICAgc3RhdGUxMC5yZXN1bHQgPSBfcmVzdWx0OwogICAgICB9CiAgICAgIHJldHVybiBkZXRlY3RlZDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRUYWdQcm9wZXJ0eShzdGF0ZTEwKSB7CiAgICAgIHZhciBfcG9zaXRpb24sIGlzVmVyYmF0aW0gPSBmYWxzZSwgaXNOYW1lZCA9IGZhbHNlLCB0YWdIYW5kbGUsIHRhZ05hbWUsIGNoOwogICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgaWYgKGNoICE9PSAzMykgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoc3RhdGUxMC50YWcgIT09IG51bGwpIHsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiZHVwbGljYXRpb24gb2YgYSB0YWcgcHJvcGVydHkiKTsKICAgICAgfQogICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICBpZiAoY2ggPT09IDYwKSB7CiAgICAgICAgaXNWZXJiYXRpbSA9IHRydWU7CiAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMzMpIHsKICAgICAgICBpc05hbWVkID0gdHJ1ZTsKICAgICAgICB0YWdIYW5kbGUgPSAiISEiOwogICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGFnSGFuZGxlID0gIiEiOwogICAgICB9CiAgICAgIF9wb3NpdGlvbiA9IHN0YXRlMTAucG9zaXRpb247CiAgICAgIGlmIChpc1ZlcmJhdGltKSB7CiAgICAgICAgZG8gewogICAgICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgICB9IHdoaWxlIChjaCAhPT0gMCAmJiBjaCAhPT0gNjIpOwogICAgICAgIGlmIChzdGF0ZTEwLnBvc2l0aW9uIDwgc3RhdGUxMC5sZW5ndGgpIHsKICAgICAgICAgIHRhZ05hbWUgPSBzdGF0ZTEwLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAidW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSB2ZXJiYXRpbSB0YWciKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7CiAgICAgICAgICBpZiAoY2ggPT09IDMzKSB7CiAgICAgICAgICAgIGlmICghaXNOYW1lZCkgewogICAgICAgICAgICAgIHRhZ0hhbmRsZSA9IHN0YXRlMTAuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uIC0gMSwgc3RhdGUxMC5wb3NpdGlvbiArIDEpOwogICAgICAgICAgICAgIGlmICghUEFUVEVSTl9UQUdfSEFORExFLnRlc3QodGFnSGFuZGxlKSkgewogICAgICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgIm5hbWVkIHRhZyBoYW5kbGUgY2Fubm90IGNvbnRhaW4gc3VjaCBjaGFyYWN0ZXJzIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlzTmFtZWQgPSB0cnVlOwogICAgICAgICAgICAgIF9wb3NpdGlvbiA9IHN0YXRlMTAucG9zaXRpb24gKyAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJ0YWcgc3VmZml4IGNhbm5vdCBjb250YWluIGV4Y2xhbWF0aW9uIG1hcmtzIik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgfQogICAgICAgIHRhZ05hbWUgPSBzdGF0ZTEwLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgaWYgKFBBVFRFUk5fRkxPV19JTkRJQ0FUT1JTLnRlc3QodGFnTmFtZSkpIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJ0YWcgc3VmZml4IGNhbm5vdCBjb250YWluIGZsb3cgaW5kaWNhdG9yIGNoYXJhY3RlcnMiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRhZ05hbWUgJiYgIVBBVFRFUk5fVEFHX1VSSS50ZXN0KHRhZ05hbWUpKSB7CiAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgInRhZyBuYW1lIGNhbm5vdCBjb250YWluIHN1Y2ggY2hhcmFjdGVyczogIiArIHRhZ05hbWUpOwogICAgICB9CiAgICAgIGlmIChpc1ZlcmJhdGltKSB7CiAgICAgICAgc3RhdGUxMC50YWcgPSB0YWdOYW1lOwogICAgICB9IGVsc2UgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlMTAudGFnTWFwLCB0YWdIYW5kbGUpKSB7CiAgICAgICAgc3RhdGUxMC50YWcgPSBzdGF0ZTEwLnRhZ01hcFt0YWdIYW5kbGVdICsgdGFnTmFtZTsKICAgICAgfSBlbHNlIGlmICh0YWdIYW5kbGUgPT09ICIhIikgewogICAgICAgIHN0YXRlMTAudGFnID0gIiEiICsgdGFnTmFtZTsKICAgICAgfSBlbHNlIGlmICh0YWdIYW5kbGUgPT09ICIhISIpIHsKICAgICAgICBzdGF0ZTEwLnRhZyA9ICJ0YWc6eWFtbC5vcmcsMjAwMjoiICsgdGFnTmFtZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAndW5kZWNsYXJlZCB0YWcgaGFuZGxlICInICsgdGFnSGFuZGxlICsgJyInKTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRBbmNob3JQcm9wZXJ0eShzdGF0ZTEwKSB7CiAgICAgIHZhciBfcG9zaXRpb24sIGNoOwogICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgaWYgKGNoICE9PSAzOCkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoc3RhdGUxMC5hbmNob3IgIT09IG51bGwpIHsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiZHVwbGljYXRpb24gb2YgYW4gYW5jaG9yIHByb3BlcnR5Iik7CiAgICAgIH0KICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgX3Bvc2l0aW9uID0gc3RhdGUxMC5wb3NpdGlvbjsKICAgICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpICYmICFpc19GTE9XX0lORElDQVRPUihjaCkpIHsKICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICB9CiAgICAgIGlmIChzdGF0ZTEwLnBvc2l0aW9uID09PSBfcG9zaXRpb24pIHsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAibmFtZSBvZiBhbiBhbmNob3Igbm9kZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXJhY3RlciIpOwogICAgICB9CiAgICAgIHN0YXRlMTAuYW5jaG9yID0gc3RhdGUxMC5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlMTAucG9zaXRpb24pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRBbGlhcyhzdGF0ZTEwKSB7CiAgICAgIHZhciBfcG9zaXRpb24sIGFsaWFzLCBjaDsKICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgIGlmIChjaCAhPT0gNDIpIHJldHVybiBmYWxzZTsKICAgICAgY2ggPSBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZTEwLnBvc2l0aW9uKTsKICAgICAgX3Bvc2l0aW9uID0gc3RhdGUxMC5wb3NpdGlvbjsKICAgICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpICYmICFpc19GTE9XX0lORElDQVRPUihjaCkpIHsKICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICB9CiAgICAgIGlmIChzdGF0ZTEwLnBvc2l0aW9uID09PSBfcG9zaXRpb24pIHsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAibmFtZSBvZiBhbiBhbGlhcyBub2RlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIik7CiAgICAgIH0KICAgICAgYWxpYXMgPSBzdGF0ZTEwLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgIGlmICghX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUxMC5hbmNob3JNYXAsIGFsaWFzKSkgewogICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICd1bmlkZW50aWZpZWQgYWxpYXMgIicgKyBhbGlhcyArICciJyk7CiAgICAgIH0KICAgICAgc3RhdGUxMC5yZXN1bHQgPSBzdGF0ZTEwLmFuY2hvck1hcFthbGlhc107CiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgLTEpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbXBvc2VOb2RlKHN0YXRlMTAsIHBhcmVudEluZGVudCwgbm9kZUNvbnRleHQsIGFsbG93VG9TZWVrLCBhbGxvd0NvbXBhY3QpIHsKICAgICAgdmFyIGFsbG93QmxvY2tTdHlsZXMsIGFsbG93QmxvY2tTY2FsYXJzLCBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMsIGluZGVudFN0YXR1cyA9IDEsIGF0TmV3TGluZSA9IGZhbHNlLCBoYXNDb250ZW50ID0gZmFsc2UsIHR5cGVJbmRleCwgdHlwZVF1YW50aXR5LCB0eXBlNSwgZmxvd0luZGVudCwgYmxvY2tJbmRlbnQ7CiAgICAgIGlmIChzdGF0ZTEwLmxpc3RlbmVyICE9PSBudWxsKSB7CiAgICAgICAgc3RhdGUxMC5saXN0ZW5lcigib3BlbiIsIHN0YXRlMTApOwogICAgICB9CiAgICAgIHN0YXRlMTAudGFnID0gbnVsbDsKICAgICAgc3RhdGUxMC5hbmNob3IgPSBudWxsOwogICAgICBzdGF0ZTEwLmtpbmQgPSBudWxsOwogICAgICBzdGF0ZTEwLnJlc3VsdCA9IG51bGw7CiAgICAgIGFsbG93QmxvY2tTdHlsZXMgPSBhbGxvd0Jsb2NrU2NhbGFycyA9IGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IENPTlRFWFRfQkxPQ0tfT1VUID09PSBub2RlQ29udGV4dCB8fCBDT05URVhUX0JMT0NLX0lOID09PSBub2RlQ29udGV4dDsKICAgICAgaWYgKGFsbG93VG9TZWVrKSB7CiAgICAgICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgLTEpKSB7CiAgICAgICAgICBhdE5ld0xpbmUgPSB0cnVlOwogICAgICAgICAgaWYgKHN0YXRlMTAubGluZUluZGVudCA+IHBhcmVudEluZGVudCkgewogICAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAxOwogICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZTEwLmxpbmVJbmRlbnQgPT09IHBhcmVudEluZGVudCkgewogICAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAwOwogICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZTEwLmxpbmVJbmRlbnQgPCBwYXJlbnRJbmRlbnQpIHsKICAgICAgICAgICAgaW5kZW50U3RhdHVzID0gLTE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpbmRlbnRTdGF0dXMgPT09IDEpIHsKICAgICAgICB3aGlsZSAocmVhZFRhZ1Byb3BlcnR5KHN0YXRlMTApIHx8IHJlYWRBbmNob3JQcm9wZXJ0eShzdGF0ZTEwKSkgewogICAgICAgICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgLTEpKSB7CiAgICAgICAgICAgIGF0TmV3TGluZSA9IHRydWU7CiAgICAgICAgICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IGFsbG93QmxvY2tTdHlsZXM7CiAgICAgICAgICAgIGlmIChzdGF0ZTEwLmxpbmVJbmRlbnQgPiBwYXJlbnRJbmRlbnQpIHsKICAgICAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAxOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlMTAubGluZUluZGVudCA9PT0gcGFyZW50SW5kZW50KSB7CiAgICAgICAgICAgICAgaW5kZW50U3RhdHVzID0gMDsKICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZTEwLmxpbmVJbmRlbnQgPCBwYXJlbnRJbmRlbnQpIHsKICAgICAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChhbGxvd0Jsb2NrQ29sbGVjdGlvbnMpIHsKICAgICAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPSBhdE5ld0xpbmUgfHwgYWxsb3dDb21wYWN0OwogICAgICB9CiAgICAgIGlmIChpbmRlbnRTdGF0dXMgPT09IDEgfHwgQ09OVEVYVF9CTE9DS19PVVQgPT09IG5vZGVDb250ZXh0KSB7CiAgICAgICAgaWYgKENPTlRFWFRfRkxPV19JTiA9PT0gbm9kZUNvbnRleHQgfHwgQ09OVEVYVF9GTE9XX09VVCA9PT0gbm9kZUNvbnRleHQpIHsKICAgICAgICAgIGZsb3dJbmRlbnQgPSBwYXJlbnRJbmRlbnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZsb3dJbmRlbnQgPSBwYXJlbnRJbmRlbnQgKyAxOwogICAgICAgIH0KICAgICAgICBibG9ja0luZGVudCA9IHN0YXRlMTAucG9zaXRpb24gLSBzdGF0ZTEwLmxpbmVTdGFydDsKICAgICAgICBpZiAoaW5kZW50U3RhdHVzID09PSAxKSB7CiAgICAgICAgICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmIChyZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZTEwLCBibG9ja0luZGVudCkgfHwgcmVhZEJsb2NrTWFwcGluZyhzdGF0ZTEwLCBibG9ja0luZGVudCwgZmxvd0luZGVudCkpIHx8IHJlYWRGbG93Q29sbGVjdGlvbihzdGF0ZTEwLCBmbG93SW5kZW50KSkgewogICAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChhbGxvd0Jsb2NrU2NhbGFycyAmJiByZWFkQmxvY2tTY2FsYXIoc3RhdGUxMCwgZmxvd0luZGVudCkgfHwgcmVhZFNpbmdsZVF1b3RlZFNjYWxhcihzdGF0ZTEwLCBmbG93SW5kZW50KSB8fCByZWFkRG91YmxlUXVvdGVkU2NhbGFyKHN0YXRlMTAsIGZsb3dJbmRlbnQpKSB7CiAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVhZEFsaWFzKHN0YXRlMTApKSB7CiAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7CiAgICAgICAgICAgICAgaWYgKHN0YXRlMTAudGFnICE9PSBudWxsIHx8IHN0YXRlMTAuYW5jaG9yICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiYWxpYXMgbm9kZSBzaG91bGQgbm90IGhhdmUgYW55IHByb3BlcnRpZXMiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVhZFBsYWluU2NhbGFyKHN0YXRlMTAsIGZsb3dJbmRlbnQsIENPTlRFWFRfRkxPV19JTiA9PT0gbm9kZUNvbnRleHQpKSB7CiAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7CiAgICAgICAgICAgICAgaWYgKHN0YXRlMTAudGFnID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBzdGF0ZTEwLnRhZyA9ICI/IjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0YXRlMTAuYW5jaG9yICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgc3RhdGUxMC5hbmNob3JNYXBbc3RhdGUxMC5hbmNob3JdID0gc3RhdGUxMC5yZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGluZGVudFN0YXR1cyA9PT0gMCkgewogICAgICAgICAgaGFzQ29udGVudCA9IGFsbG93QmxvY2tDb2xsZWN0aW9ucyAmJiByZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZTEwLCBibG9ja0luZGVudCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdGF0ZTEwLnRhZyAhPT0gbnVsbCAmJiBzdGF0ZTEwLnRhZyAhPT0gIiEiKSB7CiAgICAgICAgaWYgKHN0YXRlMTAudGFnID09PSAiPyIpIHsKICAgICAgICAgIGlmIChzdGF0ZTEwLnJlc3VsdCAhPT0gbnVsbCAmJiBzdGF0ZTEwLmtpbmQgIT09ICJzY2FsYXIiKSB7CiAgICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICd1bmFjY2VwdGFibGUgbm9kZSBraW5kIGZvciAhPD8+IHRhZzsgaXQgc2hvdWxkIGJlICJzY2FsYXIiLCBub3QgIicgKyBzdGF0ZTEwLmtpbmQgKyAnIicpOwogICAgICAgICAgfQogICAgICAgICAgZm9yICh0eXBlSW5kZXggPSAwLCB0eXBlUXVhbnRpdHkgPSBzdGF0ZTEwLmltcGxpY2l0VHlwZXMubGVuZ3RoOyB0eXBlSW5kZXggPCB0eXBlUXVhbnRpdHk7IHR5cGVJbmRleCArPSAxKSB7CiAgICAgICAgICAgIHR5cGU1ID0gc3RhdGUxMC5pbXBsaWNpdFR5cGVzW3R5cGVJbmRleF07CiAgICAgICAgICAgIGlmICh0eXBlNS5yZXNvbHZlKHN0YXRlMTAucmVzdWx0KSkgewogICAgICAgICAgICAgIHN0YXRlMTAucmVzdWx0ID0gdHlwZTUuY29uc3RydWN0KHN0YXRlMTAucmVzdWx0KTsKICAgICAgICAgICAgICBzdGF0ZTEwLnRhZyA9IHR5cGU1LnRhZzsKICAgICAgICAgICAgICBpZiAoc3RhdGUxMC5hbmNob3IgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHN0YXRlMTAuYW5jaG9yTWFwW3N0YXRlMTAuYW5jaG9yXSA9IHN0YXRlMTAucmVzdWx0OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUxMC50eXBlTWFwW3N0YXRlMTAua2luZCB8fCAiZmFsbGJhY2siXSwgc3RhdGUxMC50YWcpKSB7CiAgICAgICAgICB0eXBlNSA9IHN0YXRlMTAudHlwZU1hcFtzdGF0ZTEwLmtpbmQgfHwgImZhbGxiYWNrIl1bc3RhdGUxMC50YWddOwogICAgICAgICAgaWYgKHN0YXRlMTAucmVzdWx0ICE9PSBudWxsICYmIHR5cGU1LmtpbmQgIT09IHN0YXRlMTAua2luZCkgewogICAgICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAidW5hY2NlcHRhYmxlIG5vZGUga2luZCBmb3IgITwiICsgc3RhdGUxMC50YWcgKyAnPiB0YWc7IGl0IHNob3VsZCBiZSAiJyArIHR5cGU1LmtpbmQgKyAnIiwgbm90ICInICsgc3RhdGUxMC5raW5kICsgJyInKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdHlwZTUucmVzb2x2ZShzdGF0ZTEwLnJlc3VsdCkpIHsKICAgICAgICAgICAgdGhyb3dFcnJvcjIoc3RhdGUxMCwgImNhbm5vdCByZXNvbHZlIGEgbm9kZSB3aXRoICE8IiArIHN0YXRlMTAudGFnICsgIj4gZXhwbGljaXQgdGFnIik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGF0ZTEwLnJlc3VsdCA9IHR5cGU1LmNvbnN0cnVjdChzdGF0ZTEwLnJlc3VsdCk7CiAgICAgICAgICAgIGlmIChzdGF0ZTEwLmFuY2hvciAhPT0gbnVsbCkgewogICAgICAgICAgICAgIHN0YXRlMTAuYW5jaG9yTWFwW3N0YXRlMTAuYW5jaG9yXSA9IHN0YXRlMTAucmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJ1bmtub3duIHRhZyAhPCIgKyBzdGF0ZTEwLnRhZyArICI+Iik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdGF0ZTEwLmxpc3RlbmVyICE9PSBudWxsKSB7CiAgICAgICAgc3RhdGUxMC5saXN0ZW5lcigiY2xvc2UiLCBzdGF0ZTEwKTsKICAgICAgfQogICAgICByZXR1cm4gc3RhdGUxMC50YWcgIT09IG51bGwgfHwgc3RhdGUxMC5hbmNob3IgIT09IG51bGwgfHwgaGFzQ29udGVudDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWREb2N1bWVudChzdGF0ZTEwKSB7CiAgICAgIHZhciBkb2N1bWVudFN0YXJ0ID0gc3RhdGUxMC5wb3NpdGlvbiwgX3Bvc2l0aW9uLCBkaXJlY3RpdmVOYW1lLCBkaXJlY3RpdmVBcmdzLCBoYXNEaXJlY3RpdmVzID0gZmFsc2UsIGNoOwogICAgICBzdGF0ZTEwLnZlcnNpb24gPSBudWxsOwogICAgICBzdGF0ZTEwLmNoZWNrTGluZUJyZWFrcyA9IHN0YXRlMTAubGVnYWN5OwogICAgICBzdGF0ZTEwLnRhZ01hcCA9IHt9OwogICAgICBzdGF0ZTEwLmFuY2hvck1hcCA9IHt9OwogICAgICB3aGlsZSAoKGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pKSAhPT0gMCkgewogICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgLTEpOwogICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pOwogICAgICAgIGlmIChzdGF0ZTEwLmxpbmVJbmRlbnQgPiAwIHx8IGNoICE9PSAzNykgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGhhc0RpcmVjdGl2ZXMgPSB0cnVlOwogICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgX3Bvc2l0aW9uID0gc3RhdGUxMC5wb3NpdGlvbjsKICAgICAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHsKICAgICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgfQogICAgICAgIGRpcmVjdGl2ZU5hbWUgPSBzdGF0ZTEwLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgZGlyZWN0aXZlQXJncyA9IFtdOwogICAgICAgIGlmIChkaXJlY3RpdmVOYW1lLmxlbmd0aCA8IDEpIHsKICAgICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJkaXJlY3RpdmUgbmFtZSBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gb25lIGNoYXJhY3RlciBpbiBsZW5ndGgiKTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKGNoICE9PSAwKSB7CiAgICAgICAgICB3aGlsZSAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7CiAgICAgICAgICAgIGNoID0gc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUxMC5wb3NpdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY2ggPT09IDM1KSB7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgICAgICB9IHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfRU9MKGNoKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzX0VPTChjaCkpIGJyZWFrOwogICAgICAgICAgX3Bvc2l0aW9uID0gc3RhdGUxMC5wb3NpdGlvbjsKICAgICAgICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSkgewogICAgICAgICAgICBjaCA9IHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlMTAucG9zaXRpb24pOwogICAgICAgICAgfQogICAgICAgICAgZGlyZWN0aXZlQXJncy5wdXNoKHN0YXRlMTAuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZTEwLnBvc2l0aW9uKSk7CiAgICAgICAgfQogICAgICAgIGlmIChjaCAhPT0gMCkgcmVhZExpbmVCcmVhayhzdGF0ZTEwKTsKICAgICAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoZGlyZWN0aXZlSGFuZGxlcnMsIGRpcmVjdGl2ZU5hbWUpKSB7CiAgICAgICAgICBkaXJlY3RpdmVIYW5kbGVyc1tkaXJlY3RpdmVOYW1lXShzdGF0ZTEwLCBkaXJlY3RpdmVOYW1lLCBkaXJlY3RpdmVBcmdzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3dXYXJuaW5nKHN0YXRlMTAsICd1bmtub3duIGRvY3VtZW50IGRpcmVjdGl2ZSAiJyArIGRpcmVjdGl2ZU5hbWUgKyAnIicpOwogICAgICAgIH0KICAgICAgfQogICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlMTAsIHRydWUsIC0xKTsKICAgICAgaWYgKHN0YXRlMTAubGluZUluZGVudCA9PT0gMCAmJiBzdGF0ZTEwLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUxMC5wb3NpdGlvbikgPT09IDQ1ICYmIHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uICsgMSkgPT09IDQ1ICYmIHN0YXRlMTAuaW5wdXQuY2hhckNvZGVBdChzdGF0ZTEwLnBvc2l0aW9uICsgMikgPT09IDQ1KSB7CiAgICAgICAgc3RhdGUxMC5wb3NpdGlvbiArPSAzOwogICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgLTEpOwogICAgICB9IGVsc2UgaWYgKGhhc0RpcmVjdGl2ZXMpIHsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAiZGlyZWN0aXZlcyBlbmQgbWFyayBpcyBleHBlY3RlZCIpOwogICAgICB9CiAgICAgIGNvbXBvc2VOb2RlKHN0YXRlMTAsIHN0YXRlMTAubGluZUluZGVudCAtIDEsIENPTlRFWFRfQkxPQ0tfT1VULCBmYWxzZSwgdHJ1ZSk7CiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUxMCwgdHJ1ZSwgLTEpOwogICAgICBpZiAoc3RhdGUxMC5jaGVja0xpbmVCcmVha3MgJiYgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MudGVzdChzdGF0ZTEwLmlucHV0LnNsaWNlKGRvY3VtZW50U3RhcnQsIHN0YXRlMTAucG9zaXRpb24pKSkgewogICAgICAgIHRocm93V2FybmluZyhzdGF0ZTEwLCAibm9uLUFTQ0lJIGxpbmUgYnJlYWtzIGFyZSBpbnRlcnByZXRlZCBhcyBjb250ZW50Iik7CiAgICAgIH0KICAgICAgc3RhdGUxMC5kb2N1bWVudHMucHVzaChzdGF0ZTEwLnJlc3VsdCk7CiAgICAgIGlmIChzdGF0ZTEwLnBvc2l0aW9uID09PSBzdGF0ZTEwLmxpbmVTdGFydCAmJiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUxMCkpIHsKICAgICAgICBpZiAoc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pID09PSA0NikgewogICAgICAgICAgc3RhdGUxMC5wb3NpdGlvbiArPSAzOwogICAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZTEwLCB0cnVlLCAtMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoc3RhdGUxMC5wb3NpdGlvbiA8IHN0YXRlMTAubGVuZ3RoIC0gMSkgewogICAgICAgIHRocm93RXJyb3IyKHN0YXRlMTAsICJlbmQgb2YgdGhlIHN0cmVhbSBvciBhIGRvY3VtZW50IHNlcGFyYXRvciBpcyBleHBlY3RlZCIpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucykgewogICAgICBpbnB1dCA9IFN0cmluZyhpbnB1dCk7CiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICBpZiAoaW5wdXQubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDEwICYmIGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDEzKSB7CiAgICAgICAgICBpbnB1dCArPSAiXG4iOwogICAgICAgIH0KICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdCgwKSA9PT0gNjUyNzkpIHsKICAgICAgICAgIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBzdGF0ZTEwID0gbmV3IFN0YXRlKGlucHV0LCBvcHRpb25zKTsKICAgICAgdmFyIG51bGxwb3MgPSBpbnB1dC5pbmRleE9mKCJcMCIpOwogICAgICBpZiAobnVsbHBvcyAhPT0gLTEpIHsKICAgICAgICBzdGF0ZTEwLnBvc2l0aW9uID0gbnVsbHBvczsKICAgICAgICB0aHJvd0Vycm9yMihzdGF0ZTEwLCAibnVsbCBieXRlIGlzIG5vdCBhbGxvd2VkIGluIGlucHV0Iik7CiAgICAgIH0KICAgICAgc3RhdGUxMC5pbnB1dCArPSAiXDAiOwogICAgICB3aGlsZSAoc3RhdGUxMC5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlMTAucG9zaXRpb24pID09PSAzMikgewogICAgICAgIHN0YXRlMTAubGluZUluZGVudCArPSAxOwogICAgICAgIHN0YXRlMTAucG9zaXRpb24gKz0gMTsKICAgICAgfQogICAgICB3aGlsZSAoc3RhdGUxMC5wb3NpdGlvbiA8IHN0YXRlMTAubGVuZ3RoIC0gMSkgewogICAgICAgIHJlYWREb2N1bWVudChzdGF0ZTEwKTsKICAgICAgfQogICAgICByZXR1cm4gc3RhdGUxMC5kb2N1bWVudHM7CiAgICB9CiAgICBmdW5jdGlvbiBsb2FkQWxsKGlucHV0LCBpdGVyYXRvcjIsIG9wdGlvbnMpIHsKICAgICAgaWYgKGl0ZXJhdG9yMiAhPT0gbnVsbCAmJiB0eXBlb2YgaXRlcmF0b3IyID09PSAib2JqZWN0IiAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICBvcHRpb25zID0gaXRlcmF0b3IyOwogICAgICAgIGl0ZXJhdG9yMiA9IG51bGw7CiAgICAgIH0KICAgICAgdmFyIGRvY3VtZW50cyA9IGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpOwogICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yMiAhPT0gImZ1bmN0aW9uIikgewogICAgICAgIHJldHVybiBkb2N1bWVudHM7CiAgICAgIH0KICAgICAgZm9yICh2YXIgaW5kZXgyID0gMCwgbGVuZ3RoID0gZG9jdW1lbnRzLmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIGl0ZXJhdG9yMihkb2N1bWVudHNbaW5kZXgyXSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGxvYWQoaW5wdXQsIG9wdGlvbnMpIHsKICAgICAgdmFyIGRvY3VtZW50cyA9IGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpOwogICAgICBpZiAoZG9jdW1lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnRzLmxlbmd0aCA9PT0gMSkgewogICAgICAgIHJldHVybiBkb2N1bWVudHNbMF07CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oImV4cGVjdGVkIGEgc2luZ2xlIGRvY3VtZW50IGluIHRoZSBzdHJlYW0sIGJ1dCBmb3VuZCBtb3JlIik7CiAgICB9CiAgICBmdW5jdGlvbiBzYWZlTG9hZEFsbChpbnB1dCwgaXRlcmF0b3IyLCBvcHRpb25zKSB7CiAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3IyID09PSAib2JqZWN0IiAmJiBpdGVyYXRvcjIgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgb3B0aW9ucyA9IGl0ZXJhdG9yMjsKICAgICAgICBpdGVyYXRvcjIgPSBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBsb2FkQWxsKGlucHV0LCBpdGVyYXRvcjIsIGNvbW1vbi5leHRlbmQoeyBzY2hlbWE6IERFRkFVTFRfU0FGRV9TQ0hFTUEgfSwgb3B0aW9ucykpOwogICAgfQogICAgZnVuY3Rpb24gc2FmZUxvYWQoaW5wdXQsIG9wdGlvbnMpIHsKICAgICAgcmV0dXJuIGxvYWQoaW5wdXQsIGNvbW1vbi5leHRlbmQoeyBzY2hlbWE6IERFRkFVTFRfU0FGRV9TQ0hFTUEgfSwgb3B0aW9ucykpOwogICAgfQogICAgbW9kdWxlLmV4cG9ydHMubG9hZEFsbCA9IGxvYWRBbGw7CiAgICBtb2R1bGUuZXhwb3J0cy5sb2FkID0gbG9hZDsKICAgIG1vZHVsZS5leHBvcnRzLnNhZmVMb2FkQWxsID0gc2FmZUxvYWRBbGw7CiAgICBtb2R1bGUuZXhwb3J0cy5zYWZlTG9hZCA9IHNhZmVMb2FkOwogICAgdmFyIGkxMTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2R1bXBlci5qcwp2YXIgcmVxdWlyZV9kdW1wZXIgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2R1bXBlci5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgY29tbW9uID0gcmVxdWlyZV9jb21tb24oKTsKICAgIHZhciBZQU1MRXhjZXB0aW9uID0gcmVxdWlyZV9leGNlcHRpb24oKTsKICAgIHZhciBERUZBVUxUX0ZVTExfU0NIRU1BID0gcmVxdWlyZV9kZWZhdWx0X2Z1bGwoKTsKICAgIHZhciBERUZBVUxUX1NBRkVfU0NIRU1BID0gcmVxdWlyZV9kZWZhdWx0X3NhZmUoKTsKICAgIHZhciBfdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwogICAgdmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CiAgICB2YXIgQ0hBUl9UQUIgPSA5OwogICAgdmFyIENIQVJfTElORV9GRUVEID0gMTA7CiAgICB2YXIgQ0hBUl9DQVJSSUFHRV9SRVRVUk4gPSAxMzsKICAgIHZhciBDSEFSX1NQQUNFID0gMzI7CiAgICB2YXIgQ0hBUl9FWENMQU1BVElPTiA9IDMzOwogICAgdmFyIENIQVJfRE9VQkxFX1FVT1RFID0gMzQ7CiAgICB2YXIgQ0hBUl9TSEFSUCA9IDM1OwogICAgdmFyIENIQVJfUEVSQ0VOVCA9IDM3OwogICAgdmFyIENIQVJfQU1QRVJTQU5EID0gMzg7CiAgICB2YXIgQ0hBUl9TSU5HTEVfUVVPVEUgPSAzOTsKICAgIHZhciBDSEFSX0FTVEVSSVNLID0gNDI7CiAgICB2YXIgQ0hBUl9DT01NQSA9IDQ0OwogICAgdmFyIENIQVJfTUlOVVMgPSA0NTsKICAgIHZhciBDSEFSX0NPTE9OID0gNTg7CiAgICB2YXIgQ0hBUl9FUVVBTFMgPSA2MTsKICAgIHZhciBDSEFSX0dSRUFURVJfVEhBTiA9IDYyOwogICAgdmFyIENIQVJfUVVFU1RJT04gPSA2MzsKICAgIHZhciBDSEFSX0NPTU1FUkNJQUxfQVQgPSA2NDsKICAgIHZhciBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQgPSA5MTsKICAgIHZhciBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUID0gOTM7CiAgICB2YXIgQ0hBUl9HUkFWRV9BQ0NFTlQgPSA5NjsKICAgIHZhciBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0tFVCA9IDEyMzsKICAgIHZhciBDSEFSX1ZFUlRJQ0FMX0xJTkUgPSAxMjQ7CiAgICB2YXIgQ0hBUl9SSUdIVF9DVVJMWV9CUkFDS0VUID0gMTI1OwogICAgdmFyIEVTQ0FQRV9TRVFVRU5DRVMgPSB7fTsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbMF0gPSAiXFwwIjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbN10gPSAiXFxhIjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbOF0gPSAiXFxiIjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbOV0gPSAiXFx0IjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbMTBdID0gIlxcbiI7CiAgICBFU0NBUEVfU0VRVUVOQ0VTWzExXSA9ICJcXHYiOwogICAgRVNDQVBFX1NFUVVFTkNFU1sxMl0gPSAiXFxmIjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbMTNdID0gIlxcciI7CiAgICBFU0NBUEVfU0VRVUVOQ0VTWzI3XSA9ICJcXGUiOwogICAgRVNDQVBFX1NFUVVFTkNFU1szNF0gPSAnXFwiJzsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbOTJdID0gIlxcXFwiOwogICAgRVNDQVBFX1NFUVVFTkNFU1sxMzNdID0gIlxcTiI7CiAgICBFU0NBUEVfU0VRVUVOQ0VTWzE2MF0gPSAiXFxfIjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbODIzMl0gPSAiXFxMIjsKICAgIEVTQ0FQRV9TRVFVRU5DRVNbODIzM10gPSAiXFxQIjsKICAgIHZhciBERVBSRUNBVEVEX0JPT0xFQU5TX1NZTlRBWCA9IFsKICAgICAgInkiLAogICAgICAiWSIsCiAgICAgICJ5ZXMiLAogICAgICAiWWVzIiwKICAgICAgIllFUyIsCiAgICAgICJvbiIsCiAgICAgICJPbiIsCiAgICAgICJPTiIsCiAgICAgICJuIiwKICAgICAgIk4iLAogICAgICAibm8iLAogICAgICAiTm8iLAogICAgICAiTk8iLAogICAgICAib2ZmIiwKICAgICAgIk9mZiIsCiAgICAgICJPRkYiCiAgICBdOwogICAgZnVuY3Rpb24gY29tcGlsZVN0eWxlTWFwKHNjaGVtYSwgbWFwNykgewogICAgICB2YXIgcmVzdWx0LCBrZXlzMiwgaW5kZXgyLCBsZW5ndGgsIHRhZywgc3R5bGUsIHR5cGU1OwogICAgICBpZiAobWFwNyA9PT0gbnVsbCkgcmV0dXJuIHt9OwogICAgICByZXN1bHQgPSB7fTsKICAgICAga2V5czIgPSBPYmplY3Qua2V5cyhtYXA3KTsKICAgICAgZm9yIChpbmRleDIgPSAwLCBsZW5ndGggPSBrZXlzMi5sZW5ndGg7IGluZGV4MiA8IGxlbmd0aDsgaW5kZXgyICs9IDEpIHsKICAgICAgICB0YWcgPSBrZXlzMltpbmRleDJdOwogICAgICAgIHN0eWxlID0gU3RyaW5nKG1hcDdbdGFnXSk7CiAgICAgICAgaWYgKHRhZy5zbGljZSgwLCAyKSA9PT0gIiEhIikgewogICAgICAgICAgdGFnID0gInRhZzp5YW1sLm9yZywyMDAyOiIgKyB0YWcuc2xpY2UoMik7CiAgICAgICAgfQogICAgICAgIHR5cGU1ID0gc2NoZW1hLmNvbXBpbGVkVHlwZU1hcFsiZmFsbGJhY2siXVt0YWddOwogICAgICAgIGlmICh0eXBlNSAmJiBfaGFzT3duUHJvcGVydHkuY2FsbCh0eXBlNS5zdHlsZUFsaWFzZXMsIHN0eWxlKSkgewogICAgICAgICAgc3R5bGUgPSB0eXBlNS5zdHlsZUFsaWFzZXNbc3R5bGVdOwogICAgICAgIH0KICAgICAgICByZXN1bHRbdGFnXSA9IHN0eWxlOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBlbmNvZGVIZXgoY2hhcmFjdGVyKSB7CiAgICAgIHZhciBzdHJpbmczLCBoYW5kbGUzLCBsZW5ndGg7CiAgICAgIHN0cmluZzMgPSBjaGFyYWN0ZXIudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7CiAgICAgIGlmIChjaGFyYWN0ZXIgPD0gMjU1KSB7CiAgICAgICAgaGFuZGxlMyA9ICJ4IjsKICAgICAgICBsZW5ndGggPSAyOwogICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA8PSA2NTUzNSkgewogICAgICAgIGhhbmRsZTMgPSAidSI7CiAgICAgICAgbGVuZ3RoID0gNDsKICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPD0gNDI5NDk2NzI5NSkgewogICAgICAgIGhhbmRsZTMgPSAiVSI7CiAgICAgICAgbGVuZ3RoID0gODsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbigiY29kZSBwb2ludCB3aXRoaW4gYSBzdHJpbmcgbWF5IG5vdCBiZSBncmVhdGVyIHRoYW4gMHhGRkZGRkZGRiIpOwogICAgICB9CiAgICAgIHJldHVybiAiXFwiICsgaGFuZGxlMyArIGNvbW1vbi5yZXBlYXQoIjAiLCBsZW5ndGggLSBzdHJpbmczLmxlbmd0aCkgKyBzdHJpbmczOwogICAgfQogICAgZnVuY3Rpb24gU3RhdGUob3B0aW9ucykgewogICAgICB0aGlzLnNjaGVtYSA9IG9wdGlvbnNbInNjaGVtYSJdIHx8IERFRkFVTFRfRlVMTF9TQ0hFTUE7CiAgICAgIHRoaXMuaW5kZW50ID0gTWF0aC5tYXgoMSwgb3B0aW9uc1siaW5kZW50Il0gfHwgMik7CiAgICAgIHRoaXMubm9BcnJheUluZGVudCA9IG9wdGlvbnNbIm5vQXJyYXlJbmRlbnQiXSB8fCBmYWxzZTsKICAgICAgdGhpcy5za2lwSW52YWxpZCA9IG9wdGlvbnNbInNraXBJbnZhbGlkIl0gfHwgZmFsc2U7CiAgICAgIHRoaXMuZmxvd0xldmVsID0gY29tbW9uLmlzTm90aGluZyhvcHRpb25zWyJmbG93TGV2ZWwiXSkgPyAtMSA6IG9wdGlvbnNbImZsb3dMZXZlbCJdOwogICAgICB0aGlzLnN0eWxlTWFwID0gY29tcGlsZVN0eWxlTWFwKHRoaXMuc2NoZW1hLCBvcHRpb25zWyJzdHlsZXMiXSB8fCBudWxsKTsKICAgICAgdGhpcy5zb3J0S2V5cyA9IG9wdGlvbnNbInNvcnRLZXlzIl0gfHwgZmFsc2U7CiAgICAgIHRoaXMubGluZVdpZHRoID0gb3B0aW9uc1sibGluZVdpZHRoIl0gfHwgODA7CiAgICAgIHRoaXMubm9SZWZzID0gb3B0aW9uc1sibm9SZWZzIl0gfHwgZmFsc2U7CiAgICAgIHRoaXMubm9Db21wYXRNb2RlID0gb3B0aW9uc1sibm9Db21wYXRNb2RlIl0gfHwgZmFsc2U7CiAgICAgIHRoaXMuY29uZGVuc2VGbG93ID0gb3B0aW9uc1siY29uZGVuc2VGbG93Il0gfHwgZmFsc2U7CiAgICAgIHRoaXMuaW1wbGljaXRUeXBlcyA9IHRoaXMuc2NoZW1hLmNvbXBpbGVkSW1wbGljaXQ7CiAgICAgIHRoaXMuZXhwbGljaXRUeXBlcyA9IHRoaXMuc2NoZW1hLmNvbXBpbGVkRXhwbGljaXQ7CiAgICAgIHRoaXMudGFnID0gbnVsbDsKICAgICAgdGhpcy5yZXN1bHQgPSAiIjsKICAgICAgdGhpcy5kdXBsaWNhdGVzID0gW107CiAgICAgIHRoaXMudXNlZER1cGxpY2F0ZXMgPSBudWxsOwogICAgfQogICAgZnVuY3Rpb24gaW5kZW50U3RyaW5nKHN0cmluZzMsIHNwYWNlcykgewogICAgICB2YXIgaW5kID0gY29tbW9uLnJlcGVhdCgiICIsIHNwYWNlcyksIHBvc2l0aW9uMyA9IDAsIG5leHQyID0gLTEsIHJlc3VsdCA9ICIiLCBsaW5lLCBsZW5ndGggPSBzdHJpbmczLmxlbmd0aDsKICAgICAgd2hpbGUgKHBvc2l0aW9uMyA8IGxlbmd0aCkgewogICAgICAgIG5leHQyID0gc3RyaW5nMy5pbmRleE9mKCJcbiIsIHBvc2l0aW9uMyk7CiAgICAgICAgaWYgKG5leHQyID09PSAtMSkgewogICAgICAgICAgbGluZSA9IHN0cmluZzMuc2xpY2UocG9zaXRpb24zKTsKICAgICAgICAgIHBvc2l0aW9uMyA9IGxlbmd0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGluZSA9IHN0cmluZzMuc2xpY2UocG9zaXRpb24zLCBuZXh0MiArIDEpOwogICAgICAgICAgcG9zaXRpb24zID0gbmV4dDIgKyAxOwogICAgICAgIH0KICAgICAgICBpZiAobGluZS5sZW5ndGggJiYgbGluZSAhPT0gIlxuIikgcmVzdWx0ICs9IGluZDsKICAgICAgICByZXN1bHQgKz0gbGluZTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZTEwLCBsZXZlbCkgewogICAgICByZXR1cm4gIlxuIiArIGNvbW1vbi5yZXBlYXQoIiAiLCBzdGF0ZTEwLmluZGVudCAqIGxldmVsKTsKICAgIH0KICAgIGZ1bmN0aW9uIHRlc3RJbXBsaWNpdFJlc29sdmluZyhzdGF0ZTEwLCBzdHIpIHsKICAgICAgdmFyIGluZGV4MiwgbGVuZ3RoLCB0eXBlNTsKICAgICAgZm9yIChpbmRleDIgPSAwLCBsZW5ndGggPSBzdGF0ZTEwLmltcGxpY2l0VHlwZXMubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgdHlwZTUgPSBzdGF0ZTEwLmltcGxpY2l0VHlwZXNbaW5kZXgyXTsKICAgICAgICBpZiAodHlwZTUucmVzb2x2ZShzdHIpKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKGMxMSkgewogICAgICByZXR1cm4gYzExID09PSBDSEFSX1NQQUNFIHx8IGMxMSA9PT0gQ0hBUl9UQUI7CiAgICB9CiAgICBmdW5jdGlvbiBpc1ByaW50YWJsZShjMTEpIHsKICAgICAgcmV0dXJuIDMyIDw9IGMxMSAmJiBjMTEgPD0gMTI2IHx8IDE2MSA8PSBjMTEgJiYgYzExIDw9IDU1Mjk1ICYmIGMxMSAhPT0gODIzMiAmJiBjMTEgIT09IDgyMzMgfHwgNTczNDQgPD0gYzExICYmIGMxMSA8PSA2NTUzMyAmJiBjMTEgIT09IDY1Mjc5IHx8IDY1NTM2IDw9IGMxMSAmJiBjMTEgPD0gMTExNDExMTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzTnNDaGFyKGMxMSkgewogICAgICByZXR1cm4gaXNQcmludGFibGUoYzExKSAmJiAhaXNXaGl0ZXNwYWNlKGMxMSkgJiYgYzExICE9PSA2NTI3OSAmJiBjMTEgIT09IENIQVJfQ0FSUklBR0VfUkVUVVJOICYmIGMxMSAhPT0gQ0hBUl9MSU5FX0ZFRUQ7CiAgICB9CiAgICBmdW5jdGlvbiBpc1BsYWluU2FmZShjMTEsIHByZXYpIHsKICAgICAgcmV0dXJuIGlzUHJpbnRhYmxlKGMxMSkgJiYgYzExICE9PSA2NTI3OSAmJiBjMTEgIT09IENIQVJfQ09NTUEgJiYgYzExICE9PSBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQgJiYgYzExICE9PSBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUICYmIGMxMSAhPT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNLRVQgJiYgYzExICE9PSBDSEFSX1JJR0hUX0NVUkxZX0JSQUNLRVQgJiYgYzExICE9PSBDSEFSX0NPTE9OICYmIChjMTEgIT09IENIQVJfU0hBUlAgfHwgcHJldiAmJiBpc05zQ2hhcihwcmV2KSk7CiAgICB9CiAgICBmdW5jdGlvbiBpc1BsYWluU2FmZUZpcnN0KGMxMSkgewogICAgICByZXR1cm4gaXNQcmludGFibGUoYzExKSAmJiBjMTEgIT09IDY1Mjc5ICYmICFpc1doaXRlc3BhY2UoYzExKSAmJiBjMTEgIT09IENIQVJfTUlOVVMgJiYgYzExICE9PSBDSEFSX1FVRVNUSU9OICYmIGMxMSAhPT0gQ0hBUl9DT0xPTiAmJiBjMTEgIT09IENIQVJfQ09NTUEgJiYgYzExICE9PSBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQgJiYgYzExICE9PSBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUICYmIGMxMSAhPT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNLRVQgJiYgYzExICE9PSBDSEFSX1JJR0hUX0NVUkxZX0JSQUNLRVQgJiYgYzExICE9PSBDSEFSX1NIQVJQICYmIGMxMSAhPT0gQ0hBUl9BTVBFUlNBTkQgJiYgYzExICE9PSBDSEFSX0FTVEVSSVNLICYmIGMxMSAhPT0gQ0hBUl9FWENMQU1BVElPTiAmJiBjMTEgIT09IENIQVJfVkVSVElDQUxfTElORSAmJiBjMTEgIT09IENIQVJfRVFVQUxTICYmIGMxMSAhPT0gQ0hBUl9HUkVBVEVSX1RIQU4gJiYgYzExICE9PSBDSEFSX1NJTkdMRV9RVU9URSAmJiBjMTEgIT09IENIQVJfRE9VQkxFX1FVT1RFICYmIGMxMSAhPT0gQ0hBUl9QRVJDRU5UICYmIGMxMSAhPT0gQ0hBUl9DT01NRVJDSUFMX0FUICYmIGMxMSAhPT0gQ0hBUl9HUkFWRV9BQ0NFTlQ7CiAgICB9CiAgICBmdW5jdGlvbiBuZWVkSW5kZW50SW5kaWNhdG9yKHN0cmluZzMpIHsKICAgICAgdmFyIGxlYWRpbmdTcGFjZVJlID0gL15cbiogLzsKICAgICAgcmV0dXJuIGxlYWRpbmdTcGFjZVJlLnRlc3Qoc3RyaW5nMyk7CiAgICB9CiAgICB2YXIgU1RZTEVfUExBSU4gPSAxLCBTVFlMRV9TSU5HTEUgPSAyLCBTVFlMRV9MSVRFUkFMID0gMywgU1RZTEVfRk9MREVEID0gNCwgU1RZTEVfRE9VQkxFID0gNTsKICAgIGZ1bmN0aW9uIGNob29zZVNjYWxhclN0eWxlKHN0cmluZzMsIHNpbmdsZUxpbmVPbmx5LCBpbmRlbnRQZXJMZXZlbCwgbGluZVdpZHRoLCB0ZXN0QW1iaWd1b3VzVHlwZSkgewogICAgICB2YXIgaTExOwogICAgICB2YXIgY2hhciwgcHJldl9jaGFyOwogICAgICB2YXIgaGFzTGluZUJyZWFrID0gZmFsc2U7CiAgICAgIHZhciBoYXNGb2xkYWJsZUxpbmUgPSBmYWxzZTsKICAgICAgdmFyIHNob3VsZFRyYWNrV2lkdGggPSBsaW5lV2lkdGggIT09IC0xOwogICAgICB2YXIgcHJldmlvdXNMaW5lQnJlYWsgPSAtMTsKICAgICAgdmFyIHBsYWluID0gaXNQbGFpblNhZmVGaXJzdChzdHJpbmczLmNoYXJDb2RlQXQoMCkpICYmICFpc1doaXRlc3BhY2Uoc3RyaW5nMy5jaGFyQ29kZUF0KHN0cmluZzMubGVuZ3RoIC0gMSkpOwogICAgICBpZiAoc2luZ2xlTGluZU9ubHkpIHsKICAgICAgICBmb3IgKGkxMSA9IDA7IGkxMSA8IHN0cmluZzMubGVuZ3RoOyBpMTErKykgewogICAgICAgICAgY2hhciA9IHN0cmluZzMuY2hhckNvZGVBdChpMTEpOwogICAgICAgICAgaWYgKCFpc1ByaW50YWJsZShjaGFyKSkgewogICAgICAgICAgICByZXR1cm4gU1RZTEVfRE9VQkxFOwogICAgICAgICAgfQogICAgICAgICAgcHJldl9jaGFyID0gaTExID4gMCA/IHN0cmluZzMuY2hhckNvZGVBdChpMTEgLSAxKSA6IG51bGw7CiAgICAgICAgICBwbGFpbiA9IHBsYWluICYmIGlzUGxhaW5TYWZlKGNoYXIsIHByZXZfY2hhcik7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAoaTExID0gMDsgaTExIDwgc3RyaW5nMy5sZW5ndGg7IGkxMSsrKSB7CiAgICAgICAgICBjaGFyID0gc3RyaW5nMy5jaGFyQ29kZUF0KGkxMSk7CiAgICAgICAgICBpZiAoY2hhciA9PT0gQ0hBUl9MSU5FX0ZFRUQpIHsKICAgICAgICAgICAgaGFzTGluZUJyZWFrID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKHNob3VsZFRyYWNrV2lkdGgpIHsKICAgICAgICAgICAgICBoYXNGb2xkYWJsZUxpbmUgPSBoYXNGb2xkYWJsZUxpbmUgfHwgLy8gRm9sZGFibGUgbGluZSA9IHRvbyBsb25nLCBhbmQgbm90IG1vcmUtaW5kZW50ZWQuCiAgICAgICAgICAgICAgaTExIC0gcHJldmlvdXNMaW5lQnJlYWsgLSAxID4gbGluZVdpZHRoICYmIHN0cmluZzNbcHJldmlvdXNMaW5lQnJlYWsgKyAxXSAhPT0gIiAiOwogICAgICAgICAgICAgIHByZXZpb3VzTGluZUJyZWFrID0gaTExOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKCFpc1ByaW50YWJsZShjaGFyKSkgewogICAgICAgICAgICByZXR1cm4gU1RZTEVfRE9VQkxFOwogICAgICAgICAgfQogICAgICAgICAgcHJldl9jaGFyID0gaTExID4gMCA/IHN0cmluZzMuY2hhckNvZGVBdChpMTEgLSAxKSA6IG51bGw7CiAgICAgICAgICBwbGFpbiA9IHBsYWluICYmIGlzUGxhaW5TYWZlKGNoYXIsIHByZXZfY2hhcik7CiAgICAgICAgfQogICAgICAgIGhhc0ZvbGRhYmxlTGluZSA9IGhhc0ZvbGRhYmxlTGluZSB8fCBzaG91bGRUcmFja1dpZHRoICYmIChpMTEgLSBwcmV2aW91c0xpbmVCcmVhayAtIDEgPiBsaW5lV2lkdGggJiYgc3RyaW5nM1twcmV2aW91c0xpbmVCcmVhayArIDFdICE9PSAiICIpOwogICAgICB9CiAgICAgIGlmICghaGFzTGluZUJyZWFrICYmICFoYXNGb2xkYWJsZUxpbmUpIHsKICAgICAgICByZXR1cm4gcGxhaW4gJiYgIXRlc3RBbWJpZ3VvdXNUeXBlKHN0cmluZzMpID8gU1RZTEVfUExBSU4gOiBTVFlMRV9TSU5HTEU7CiAgICAgIH0KICAgICAgaWYgKGluZGVudFBlckxldmVsID4gOSAmJiBuZWVkSW5kZW50SW5kaWNhdG9yKHN0cmluZzMpKSB7CiAgICAgICAgcmV0dXJuIFNUWUxFX0RPVUJMRTsKICAgICAgfQogICAgICByZXR1cm4gaGFzRm9sZGFibGVMaW5lID8gU1RZTEVfRk9MREVEIDogU1RZTEVfTElURVJBTDsKICAgIH0KICAgIGZ1bmN0aW9uIHdyaXRlU2NhbGFyKHN0YXRlMTAsIHN0cmluZzMsIGxldmVsLCBpc2tleSkgewogICAgICBzdGF0ZTEwLmR1bXAgPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHN0cmluZzMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gIicnIjsKICAgICAgICB9CiAgICAgICAgaWYgKCFzdGF0ZTEwLm5vQ29tcGF0TW9kZSAmJiBERVBSRUNBVEVEX0JPT0xFQU5TX1NZTlRBWC5pbmRleE9mKHN0cmluZzMpICE9PSAtMSkgewogICAgICAgICAgcmV0dXJuICInIiArIHN0cmluZzMgKyAiJyI7CiAgICAgICAgfQogICAgICAgIHZhciBpbmRlbnQzID0gc3RhdGUxMC5pbmRlbnQgKiBNYXRoLm1heCgxLCBsZXZlbCk7CiAgICAgICAgdmFyIGxpbmVXaWR0aCA9IHN0YXRlMTAubGluZVdpZHRoID09PSAtMSA/IC0xIDogTWF0aC5tYXgoTWF0aC5taW4oc3RhdGUxMC5saW5lV2lkdGgsIDQwKSwgc3RhdGUxMC5saW5lV2lkdGggLSBpbmRlbnQzKTsKICAgICAgICB2YXIgc2luZ2xlTGluZU9ubHkgPSBpc2tleSB8fCBzdGF0ZTEwLmZsb3dMZXZlbCA+IC0xICYmIGxldmVsID49IHN0YXRlMTAuZmxvd0xldmVsOwogICAgICAgIGZ1bmN0aW9uIHRlc3RBbWJpZ3VpdHkoc3RyaW5nNCkgewogICAgICAgICAgcmV0dXJuIHRlc3RJbXBsaWNpdFJlc29sdmluZyhzdGF0ZTEwLCBzdHJpbmc0KTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoIChjaG9vc2VTY2FsYXJTdHlsZShzdHJpbmczLCBzaW5nbGVMaW5lT25seSwgc3RhdGUxMC5pbmRlbnQsIGxpbmVXaWR0aCwgdGVzdEFtYmlndWl0eSkpIHsKICAgICAgICAgIGNhc2UgU1RZTEVfUExBSU46CiAgICAgICAgICAgIHJldHVybiBzdHJpbmczOwogICAgICAgICAgY2FzZSBTVFlMRV9TSU5HTEU6CiAgICAgICAgICAgIHJldHVybiAiJyIgKyBzdHJpbmczLnJlcGxhY2UoLycvZywgIicnIikgKyAiJyI7CiAgICAgICAgICBjYXNlIFNUWUxFX0xJVEVSQUw6CiAgICAgICAgICAgIHJldHVybiAifCIgKyBibG9ja0hlYWRlcihzdHJpbmczLCBzdGF0ZTEwLmluZGVudCkgKyBkcm9wRW5kaW5nTmV3bGluZShpbmRlbnRTdHJpbmcoc3RyaW5nMywgaW5kZW50MykpOwogICAgICAgICAgY2FzZSBTVFlMRV9GT0xERUQ6CiAgICAgICAgICAgIHJldHVybiAiPiIgKyBibG9ja0hlYWRlcihzdHJpbmczLCBzdGF0ZTEwLmluZGVudCkgKyBkcm9wRW5kaW5nTmV3bGluZShpbmRlbnRTdHJpbmcoZm9sZFN0cmluZyhzdHJpbmczLCBsaW5lV2lkdGgpLCBpbmRlbnQzKSk7CiAgICAgICAgICBjYXNlIFNUWUxFX0RPVUJMRToKICAgICAgICAgICAgcmV0dXJuICciJyArIGVzY2FwZVN0cmluZyhzdHJpbmczLCBsaW5lV2lkdGgpICsgJyInOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oImltcG9zc2libGUgZXJyb3I6IGludmFsaWQgc2NhbGFyIHN0eWxlIik7CiAgICAgICAgfQogICAgICB9KSgpOwogICAgfQogICAgZnVuY3Rpb24gYmxvY2tIZWFkZXIoc3RyaW5nMywgaW5kZW50UGVyTGV2ZWwpIHsKICAgICAgdmFyIGluZGVudEluZGljYXRvciA9IG5lZWRJbmRlbnRJbmRpY2F0b3Ioc3RyaW5nMykgPyBTdHJpbmcoaW5kZW50UGVyTGV2ZWwpIDogIiI7CiAgICAgIHZhciBjbGlwID0gc3RyaW5nM1tzdHJpbmczLmxlbmd0aCAtIDFdID09PSAiXG4iOwogICAgICB2YXIga2VlcCA9IGNsaXAgJiYgKHN0cmluZzNbc3RyaW5nMy5sZW5ndGggLSAyXSA9PT0gIlxuIiB8fCBzdHJpbmczID09PSAiXG4iKTsKICAgICAgdmFyIGNob21wID0ga2VlcCA/ICIrIiA6IGNsaXAgPyAiIiA6ICItIjsKICAgICAgcmV0dXJuIGluZGVudEluZGljYXRvciArIGNob21wICsgIlxuIjsKICAgIH0KICAgIGZ1bmN0aW9uIGRyb3BFbmRpbmdOZXdsaW5lKHN0cmluZzMpIHsKICAgICAgcmV0dXJuIHN0cmluZzNbc3RyaW5nMy5sZW5ndGggLSAxXSA9PT0gIlxuIiA/IHN0cmluZzMuc2xpY2UoMCwgLTEpIDogc3RyaW5nMzsKICAgIH0KICAgIGZ1bmN0aW9uIGZvbGRTdHJpbmcoc3RyaW5nMywgd2lkdGgpIHsKICAgICAgdmFyIGxpbmVSZSA9IC8oXG4rKShbXlxuXSopL2c7CiAgICAgIHZhciByZXN1bHQgPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG5leHRMRiA9IHN0cmluZzMuaW5kZXhPZigiXG4iKTsKICAgICAgICBuZXh0TEYgPSBuZXh0TEYgIT09IC0xID8gbmV4dExGIDogc3RyaW5nMy5sZW5ndGg7CiAgICAgICAgbGluZVJlLmxhc3RJbmRleCA9IG5leHRMRjsKICAgICAgICByZXR1cm4gZm9sZExpbmUoc3RyaW5nMy5zbGljZSgwLCBuZXh0TEYpLCB3aWR0aCk7CiAgICAgIH0pKCk7CiAgICAgIHZhciBwcmV2TW9yZUluZGVudGVkID0gc3RyaW5nM1swXSA9PT0gIlxuIiB8fCBzdHJpbmczWzBdID09PSAiICI7CiAgICAgIHZhciBtb3JlSW5kZW50ZWQ7CiAgICAgIHZhciBtYXRjaDI7CiAgICAgIHdoaWxlIChtYXRjaDIgPSBsaW5lUmUuZXhlYyhzdHJpbmczKSkgewogICAgICAgIHZhciBwcmVmaXg0ID0gbWF0Y2gyWzFdLCBsaW5lID0gbWF0Y2gyWzJdOwogICAgICAgIG1vcmVJbmRlbnRlZCA9IGxpbmVbMF0gPT09ICIgIjsKICAgICAgICByZXN1bHQgKz0gcHJlZml4NCArICghcHJldk1vcmVJbmRlbnRlZCAmJiAhbW9yZUluZGVudGVkICYmIGxpbmUgIT09ICIiID8gIlxuIiA6ICIiKSArIGZvbGRMaW5lKGxpbmUsIHdpZHRoKTsKICAgICAgICBwcmV2TW9yZUluZGVudGVkID0gbW9yZUluZGVudGVkOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBmb2xkTGluZShsaW5lLCB3aWR0aCkgewogICAgICBpZiAobGluZSA9PT0gIiIgfHwgbGluZVswXSA9PT0gIiAiKSByZXR1cm4gbGluZTsKICAgICAgdmFyIGJyZWFrUmUgPSAvIFteIF0vZzsKICAgICAgdmFyIG1hdGNoMjsKICAgICAgdmFyIHN0YXJ0ID0gMCwgZW5kMywgY3VyciA9IDAsIG5leHQyID0gMDsKICAgICAgdmFyIHJlc3VsdCA9ICIiOwogICAgICB3aGlsZSAobWF0Y2gyID0gYnJlYWtSZS5leGVjKGxpbmUpKSB7CiAgICAgICAgbmV4dDIgPSBtYXRjaDIuaW5kZXg7CiAgICAgICAgaWYgKG5leHQyIC0gc3RhcnQgPiB3aWR0aCkgewogICAgICAgICAgZW5kMyA9IGN1cnIgPiBzdGFydCA/IGN1cnIgOiBuZXh0MjsKICAgICAgICAgIHJlc3VsdCArPSAiXG4iICsgbGluZS5zbGljZShzdGFydCwgZW5kMyk7CiAgICAgICAgICBzdGFydCA9IGVuZDMgKyAxOwogICAgICAgIH0KICAgICAgICBjdXJyID0gbmV4dDI7CiAgICAgIH0KICAgICAgcmVzdWx0ICs9ICJcbiI7CiAgICAgIGlmIChsaW5lLmxlbmd0aCAtIHN0YXJ0ID4gd2lkdGggJiYgY3VyciA+IHN0YXJ0KSB7CiAgICAgICAgcmVzdWx0ICs9IGxpbmUuc2xpY2Uoc3RhcnQsIGN1cnIpICsgIlxuIiArIGxpbmUuc2xpY2UoY3VyciArIDEpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdCArPSBsaW5lLnNsaWNlKHN0YXJ0KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0LnNsaWNlKDEpOwogICAgfQogICAgZnVuY3Rpb24gZXNjYXBlU3RyaW5nKHN0cmluZzMpIHsKICAgICAgdmFyIHJlc3VsdCA9ICIiOwogICAgICB2YXIgY2hhciwgbmV4dENoYXI7CiAgICAgIHZhciBlc2NhcGVTZXE7CiAgICAgIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IHN0cmluZzMubGVuZ3RoOyBpMTErKykgewogICAgICAgIGNoYXIgPSBzdHJpbmczLmNoYXJDb2RlQXQoaTExKTsKICAgICAgICBpZiAoY2hhciA+PSA1NTI5NiAmJiBjaGFyIDw9IDU2MzE5KSB7CiAgICAgICAgICBuZXh0Q2hhciA9IHN0cmluZzMuY2hhckNvZGVBdChpMTEgKyAxKTsKICAgICAgICAgIGlmIChuZXh0Q2hhciA+PSA1NjMyMCAmJiBuZXh0Q2hhciA8PSA1NzM0MykgewogICAgICAgICAgICByZXN1bHQgKz0gZW5jb2RlSGV4KChjaGFyIC0gNTUyOTYpICogMTAyNCArIG5leHRDaGFyIC0gNTYzMjAgKyA2NTUzNik7CiAgICAgICAgICAgIGkxMSsrOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXNjYXBlU2VxID0gRVNDQVBFX1NFUVVFTkNFU1tjaGFyXTsKICAgICAgICByZXN1bHQgKz0gIWVzY2FwZVNlcSAmJiBpc1ByaW50YWJsZShjaGFyKSA/IHN0cmluZzNbaTExXSA6IGVzY2FwZVNlcSB8fCBlbmNvZGVIZXgoY2hhcik7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGZ1bmN0aW9uIHdyaXRlRmxvd1NlcXVlbmNlKHN0YXRlMTAsIGxldmVsLCBvYmplY3QpIHsKICAgICAgdmFyIF9yZXN1bHQgPSAiIiwgX3RhZyA9IHN0YXRlMTAudGFnLCBpbmRleDIsIGxlbmd0aDsKICAgICAgZm9yIChpbmRleDIgPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgaWYgKHdyaXRlTm9kZShzdGF0ZTEwLCBsZXZlbCwgb2JqZWN0W2luZGV4Ml0sIGZhbHNlLCBmYWxzZSkpIHsKICAgICAgICAgIGlmIChpbmRleDIgIT09IDApIF9yZXN1bHQgKz0gIiwiICsgKCFzdGF0ZTEwLmNvbmRlbnNlRmxvdyA/ICIgIiA6ICIiKTsKICAgICAgICAgIF9yZXN1bHQgKz0gc3RhdGUxMC5kdW1wOwogICAgICAgIH0KICAgICAgfQogICAgICBzdGF0ZTEwLnRhZyA9IF90YWc7CiAgICAgIHN0YXRlMTAuZHVtcCA9ICJbIiArIF9yZXN1bHQgKyAiXSI7CiAgICB9CiAgICBmdW5jdGlvbiB3cml0ZUJsb2NrU2VxdWVuY2Uoc3RhdGUxMCwgbGV2ZWwsIG9iamVjdCwgY29tcGFjdCkgewogICAgICB2YXIgX3Jlc3VsdCA9ICIiLCBfdGFnID0gc3RhdGUxMC50YWcsIGluZGV4MiwgbGVuZ3RoOwogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4MiA8IGxlbmd0aDsgaW5kZXgyICs9IDEpIHsKICAgICAgICBpZiAod3JpdGVOb2RlKHN0YXRlMTAsIGxldmVsICsgMSwgb2JqZWN0W2luZGV4Ml0sIHRydWUsIHRydWUpKSB7CiAgICAgICAgICBpZiAoIWNvbXBhY3QgfHwgaW5kZXgyICE9PSAwKSB7CiAgICAgICAgICAgIF9yZXN1bHQgKz0gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZTEwLCBsZXZlbCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3RhdGUxMC5kdW1wICYmIENIQVJfTElORV9GRUVEID09PSBzdGF0ZTEwLmR1bXAuY2hhckNvZGVBdCgwKSkgewogICAgICAgICAgICBfcmVzdWx0ICs9ICItIjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9yZXN1bHQgKz0gIi0gIjsKICAgICAgICAgIH0KICAgICAgICAgIF9yZXN1bHQgKz0gc3RhdGUxMC5kdW1wOwogICAgICAgIH0KICAgICAgfQogICAgICBzdGF0ZTEwLnRhZyA9IF90YWc7CiAgICAgIHN0YXRlMTAuZHVtcCA9IF9yZXN1bHQgfHwgIltdIjsKICAgIH0KICAgIGZ1bmN0aW9uIHdyaXRlRmxvd01hcHBpbmcoc3RhdGUxMCwgbGV2ZWwsIG9iamVjdCkgewogICAgICB2YXIgX3Jlc3VsdCA9ICIiLCBfdGFnID0gc3RhdGUxMC50YWcsIG9iamVjdEtleUxpc3QgPSBPYmplY3Qua2V5cyhvYmplY3QpLCBpbmRleDIsIGxlbmd0aCwgb2JqZWN0S2V5LCBvYmplY3RWYWx1ZSwgcGFpckJ1ZmZlcjsKICAgICAgZm9yIChpbmRleDIgPSAwLCBsZW5ndGggPSBvYmplY3RLZXlMaXN0Lmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIHBhaXJCdWZmZXIgPSAiIjsKICAgICAgICBpZiAoaW5kZXgyICE9PSAwKSBwYWlyQnVmZmVyICs9ICIsICI7CiAgICAgICAgaWYgKHN0YXRlMTAuY29uZGVuc2VGbG93KSBwYWlyQnVmZmVyICs9ICciJzsKICAgICAgICBvYmplY3RLZXkgPSBvYmplY3RLZXlMaXN0W2luZGV4Ml07CiAgICAgICAgb2JqZWN0VmFsdWUgPSBvYmplY3Rbb2JqZWN0S2V5XTsKICAgICAgICBpZiAoIXdyaXRlTm9kZShzdGF0ZTEwLCBsZXZlbCwgb2JqZWN0S2V5LCBmYWxzZSwgZmFsc2UpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHN0YXRlMTAuZHVtcC5sZW5ndGggPiAxMDI0KSBwYWlyQnVmZmVyICs9ICI/ICI7CiAgICAgICAgcGFpckJ1ZmZlciArPSBzdGF0ZTEwLmR1bXAgKyAoc3RhdGUxMC5jb25kZW5zZUZsb3cgPyAnIicgOiAiIikgKyAiOiIgKyAoc3RhdGUxMC5jb25kZW5zZUZsb3cgPyAiIiA6ICIgIik7CiAgICAgICAgaWYgKCF3cml0ZU5vZGUoc3RhdGUxMCwgbGV2ZWwsIG9iamVjdFZhbHVlLCBmYWxzZSwgZmFsc2UpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgcGFpckJ1ZmZlciArPSBzdGF0ZTEwLmR1bXA7CiAgICAgICAgX3Jlc3VsdCArPSBwYWlyQnVmZmVyOwogICAgICB9CiAgICAgIHN0YXRlMTAudGFnID0gX3RhZzsKICAgICAgc3RhdGUxMC5kdW1wID0gInsiICsgX3Jlc3VsdCArICJ9IjsKICAgIH0KICAgIGZ1bmN0aW9uIHdyaXRlQmxvY2tNYXBwaW5nKHN0YXRlMTAsIGxldmVsLCBvYmplY3QsIGNvbXBhY3QpIHsKICAgICAgdmFyIF9yZXN1bHQgPSAiIiwgX3RhZyA9IHN0YXRlMTAudGFnLCBvYmplY3RLZXlMaXN0ID0gT2JqZWN0LmtleXMob2JqZWN0KSwgaW5kZXgyLCBsZW5ndGgsIG9iamVjdEtleSwgb2JqZWN0VmFsdWUsIGV4cGxpY2l0UGFpciwgcGFpckJ1ZmZlcjsKICAgICAgaWYgKHN0YXRlMTAuc29ydEtleXMgPT09IHRydWUpIHsKICAgICAgICBvYmplY3RLZXlMaXN0LnNvcnQoKTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3RhdGUxMC5zb3J0S2V5cyA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIG9iamVjdEtleUxpc3Quc29ydChzdGF0ZTEwLnNvcnRLZXlzKTsKICAgICAgfSBlbHNlIGlmIChzdGF0ZTEwLnNvcnRLZXlzKSB7CiAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oInNvcnRLZXlzIG11c3QgYmUgYSBib29sZWFuIG9yIGEgZnVuY3Rpb24iKTsKICAgICAgfQogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IG9iamVjdEtleUxpc3QubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgcGFpckJ1ZmZlciA9ICIiOwogICAgICAgIGlmICghY29tcGFjdCB8fCBpbmRleDIgIT09IDApIHsKICAgICAgICAgIHBhaXJCdWZmZXIgKz0gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZTEwLCBsZXZlbCk7CiAgICAgICAgfQogICAgICAgIG9iamVjdEtleSA9IG9iamVjdEtleUxpc3RbaW5kZXgyXTsKICAgICAgICBvYmplY3RWYWx1ZSA9IG9iamVjdFtvYmplY3RLZXldOwogICAgICAgIGlmICghd3JpdGVOb2RlKHN0YXRlMTAsIGxldmVsICsgMSwgb2JqZWN0S2V5LCB0cnVlLCB0cnVlLCB0cnVlKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGV4cGxpY2l0UGFpciA9IHN0YXRlMTAudGFnICE9PSBudWxsICYmIHN0YXRlMTAudGFnICE9PSAiPyIgfHwgc3RhdGUxMC5kdW1wICYmIHN0YXRlMTAuZHVtcC5sZW5ndGggPiAxMDI0OwogICAgICAgIGlmIChleHBsaWNpdFBhaXIpIHsKICAgICAgICAgIGlmIChzdGF0ZTEwLmR1bXAgJiYgQ0hBUl9MSU5FX0ZFRUQgPT09IHN0YXRlMTAuZHVtcC5jaGFyQ29kZUF0KDApKSB7CiAgICAgICAgICAgIHBhaXJCdWZmZXIgKz0gIj8iOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcGFpckJ1ZmZlciArPSAiPyAiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwYWlyQnVmZmVyICs9IHN0YXRlMTAuZHVtcDsKICAgICAgICBpZiAoZXhwbGljaXRQYWlyKSB7CiAgICAgICAgICBwYWlyQnVmZmVyICs9IGdlbmVyYXRlTmV4dExpbmUoc3RhdGUxMCwgbGV2ZWwpOwogICAgICAgIH0KICAgICAgICBpZiAoIXdyaXRlTm9kZShzdGF0ZTEwLCBsZXZlbCArIDEsIG9iamVjdFZhbHVlLCB0cnVlLCBleHBsaWNpdFBhaXIpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHN0YXRlMTAuZHVtcCAmJiBDSEFSX0xJTkVfRkVFRCA9PT0gc3RhdGUxMC5kdW1wLmNoYXJDb2RlQXQoMCkpIHsKICAgICAgICAgIHBhaXJCdWZmZXIgKz0gIjoiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwYWlyQnVmZmVyICs9ICI6ICI7CiAgICAgICAgfQogICAgICAgIHBhaXJCdWZmZXIgKz0gc3RhdGUxMC5kdW1wOwogICAgICAgIF9yZXN1bHQgKz0gcGFpckJ1ZmZlcjsKICAgICAgfQogICAgICBzdGF0ZTEwLnRhZyA9IF90YWc7CiAgICAgIHN0YXRlMTAuZHVtcCA9IF9yZXN1bHQgfHwgInt9IjsKICAgIH0KICAgIGZ1bmN0aW9uIGRldGVjdFR5cGUoc3RhdGUxMCwgb2JqZWN0LCBleHBsaWNpdCkgewogICAgICB2YXIgX3Jlc3VsdCwgdHlwZUxpc3QsIGluZGV4MiwgbGVuZ3RoLCB0eXBlNSwgc3R5bGU7CiAgICAgIHR5cGVMaXN0ID0gZXhwbGljaXQgPyBzdGF0ZTEwLmV4cGxpY2l0VHlwZXMgOiBzdGF0ZTEwLmltcGxpY2l0VHlwZXM7CiAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gdHlwZUxpc3QubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgdHlwZTUgPSB0eXBlTGlzdFtpbmRleDJdOwogICAgICAgIGlmICgodHlwZTUuaW5zdGFuY2VPZiB8fCB0eXBlNS5wcmVkaWNhdGUpICYmICghdHlwZTUuaW5zdGFuY2VPZiB8fCB0eXBlb2Ygb2JqZWN0ID09PSAib2JqZWN0IiAmJiBvYmplY3QgaW5zdGFuY2VvZiB0eXBlNS5pbnN0YW5jZU9mKSAmJiAoIXR5cGU1LnByZWRpY2F0ZSB8fCB0eXBlNS5wcmVkaWNhdGUob2JqZWN0KSkpIHsKICAgICAgICAgIHN0YXRlMTAudGFnID0gZXhwbGljaXQgPyB0eXBlNS50YWcgOiAiPyI7CiAgICAgICAgICBpZiAodHlwZTUucmVwcmVzZW50KSB7CiAgICAgICAgICAgIHN0eWxlID0gc3RhdGUxMC5zdHlsZU1hcFt0eXBlNS50YWddIHx8IHR5cGU1LmRlZmF1bHRTdHlsZTsKICAgICAgICAgICAgaWYgKF90b1N0cmluZy5jYWxsKHR5cGU1LnJlcHJlc2VudCkgPT09ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKICAgICAgICAgICAgICBfcmVzdWx0ID0gdHlwZTUucmVwcmVzZW50KG9iamVjdCwgc3R5bGUpOwogICAgICAgICAgICB9IGVsc2UgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHR5cGU1LnJlcHJlc2VudCwgc3R5bGUpKSB7CiAgICAgICAgICAgICAgX3Jlc3VsdCA9IHR5cGU1LnJlcHJlc2VudFtzdHlsZV0ob2JqZWN0LCBzdHlsZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oIiE8IiArIHR5cGU1LnRhZyArICc+IHRhZyByZXNvbHZlciBhY2NlcHRzIG5vdCAiJyArIHN0eWxlICsgJyIgc3R5bGUnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZTEwLmR1bXAgPSBfcmVzdWx0OwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZ1bmN0aW9uIHdyaXRlTm9kZShzdGF0ZTEwLCBsZXZlbCwgb2JqZWN0LCBibG9jaywgY29tcGFjdCwgaXNrZXkpIHsKICAgICAgc3RhdGUxMC50YWcgPSBudWxsOwogICAgICBzdGF0ZTEwLmR1bXAgPSBvYmplY3Q7CiAgICAgIGlmICghZGV0ZWN0VHlwZShzdGF0ZTEwLCBvYmplY3QsIGZhbHNlKSkgewogICAgICAgIGRldGVjdFR5cGUoc3RhdGUxMCwgb2JqZWN0LCB0cnVlKTsKICAgICAgfQogICAgICB2YXIgdHlwZTUgPSBfdG9TdHJpbmcuY2FsbChzdGF0ZTEwLmR1bXApOwogICAgICBpZiAoYmxvY2spIHsKICAgICAgICBibG9jayA9IHN0YXRlMTAuZmxvd0xldmVsIDwgMCB8fCBzdGF0ZTEwLmZsb3dMZXZlbCA+IGxldmVsOwogICAgICB9CiAgICAgIHZhciBvYmplY3RPckFycmF5ID0gdHlwZTUgPT09ICJbb2JqZWN0IE9iamVjdF0iIHx8IHR5cGU1ID09PSAiW29iamVjdCBBcnJheV0iLCBkdXBsaWNhdGVJbmRleCwgZHVwbGljYXRlOwogICAgICBpZiAob2JqZWN0T3JBcnJheSkgewogICAgICAgIGR1cGxpY2F0ZUluZGV4ID0gc3RhdGUxMC5kdXBsaWNhdGVzLmluZGV4T2Yob2JqZWN0KTsKICAgICAgICBkdXBsaWNhdGUgPSBkdXBsaWNhdGVJbmRleCAhPT0gLTE7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlMTAudGFnICE9PSBudWxsICYmIHN0YXRlMTAudGFnICE9PSAiPyIgfHwgZHVwbGljYXRlIHx8IHN0YXRlMTAuaW5kZW50ICE9PSAyICYmIGxldmVsID4gMCkgewogICAgICAgIGNvbXBhY3QgPSBmYWxzZTsKICAgICAgfQogICAgICBpZiAoZHVwbGljYXRlICYmIHN0YXRlMTAudXNlZER1cGxpY2F0ZXNbZHVwbGljYXRlSW5kZXhdKSB7CiAgICAgICAgc3RhdGUxMC5kdW1wID0gIipyZWZfIiArIGR1cGxpY2F0ZUluZGV4OwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChvYmplY3RPckFycmF5ICYmIGR1cGxpY2F0ZSAmJiAhc3RhdGUxMC51c2VkRHVwbGljYXRlc1tkdXBsaWNhdGVJbmRleF0pIHsKICAgICAgICAgIHN0YXRlMTAudXNlZER1cGxpY2F0ZXNbZHVwbGljYXRlSW5kZXhdID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGU1ID09PSAiW29iamVjdCBPYmplY3RdIikgewogICAgICAgICAgaWYgKGJsb2NrICYmIE9iamVjdC5rZXlzKHN0YXRlMTAuZHVtcCkubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICAgIHdyaXRlQmxvY2tNYXBwaW5nKHN0YXRlMTAsIGxldmVsLCBzdGF0ZTEwLmR1bXAsIGNvbXBhY3QpOwogICAgICAgICAgICBpZiAoZHVwbGljYXRlKSB7CiAgICAgICAgICAgICAgc3RhdGUxMC5kdW1wID0gIiZyZWZfIiArIGR1cGxpY2F0ZUluZGV4ICsgc3RhdGUxMC5kdW1wOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3cml0ZUZsb3dNYXBwaW5nKHN0YXRlMTAsIGxldmVsLCBzdGF0ZTEwLmR1bXApOwogICAgICAgICAgICBpZiAoZHVwbGljYXRlKSB7CiAgICAgICAgICAgICAgc3RhdGUxMC5kdW1wID0gIiZyZWZfIiArIGR1cGxpY2F0ZUluZGV4ICsgIiAiICsgc3RhdGUxMC5kdW1wOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0eXBlNSA9PT0gIltvYmplY3QgQXJyYXldIikgewogICAgICAgICAgdmFyIGFycmF5TGV2ZWwgPSBzdGF0ZTEwLm5vQXJyYXlJbmRlbnQgJiYgbGV2ZWwgPiAwID8gbGV2ZWwgLSAxIDogbGV2ZWw7CiAgICAgICAgICBpZiAoYmxvY2sgJiYgc3RhdGUxMC5kdW1wLmxlbmd0aCAhPT0gMCkgewogICAgICAgICAgICB3cml0ZUJsb2NrU2VxdWVuY2Uoc3RhdGUxMCwgYXJyYXlMZXZlbCwgc3RhdGUxMC5kdW1wLCBjb21wYWN0KTsKICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSkgewogICAgICAgICAgICAgIHN0YXRlMTAuZHVtcCA9ICImcmVmXyIgKyBkdXBsaWNhdGVJbmRleCArIHN0YXRlMTAuZHVtcDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgd3JpdGVGbG93U2VxdWVuY2Uoc3RhdGUxMCwgYXJyYXlMZXZlbCwgc3RhdGUxMC5kdW1wKTsKICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSkgewogICAgICAgICAgICAgIHN0YXRlMTAuZHVtcCA9ICImcmVmXyIgKyBkdXBsaWNhdGVJbmRleCArICIgIiArIHN0YXRlMTAuZHVtcDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZTUgPT09ICJbb2JqZWN0IFN0cmluZ10iKSB7CiAgICAgICAgICBpZiAoc3RhdGUxMC50YWcgIT09ICI/IikgewogICAgICAgICAgICB3cml0ZVNjYWxhcihzdGF0ZTEwLCBzdGF0ZTEwLmR1bXAsIGxldmVsLCBpc2tleSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChzdGF0ZTEwLnNraXBJbnZhbGlkKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbigidW5hY2NlcHRhYmxlIGtpbmQgb2YgYW4gb2JqZWN0IHRvIGR1bXAgIiArIHR5cGU1KTsKICAgICAgICB9CiAgICAgICAgaWYgKHN0YXRlMTAudGFnICE9PSBudWxsICYmIHN0YXRlMTAudGFnICE9PSAiPyIpIHsKICAgICAgICAgIHN0YXRlMTAuZHVtcCA9ICIhPCIgKyBzdGF0ZTEwLnRhZyArICI+ICIgKyBzdGF0ZTEwLmR1bXA7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gZ2V0RHVwbGljYXRlUmVmZXJlbmNlcyhvYmplY3QsIHN0YXRlMTApIHsKICAgICAgdmFyIG9iamVjdHMgPSBbXSwgZHVwbGljYXRlc0luZGV4ZXMgPSBbXSwgaW5kZXgyLCBsZW5ndGg7CiAgICAgIGluc3BlY3ROb2RlKG9iamVjdCwgb2JqZWN0cywgZHVwbGljYXRlc0luZGV4ZXMpOwogICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IGR1cGxpY2F0ZXNJbmRleGVzLmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgIHN0YXRlMTAuZHVwbGljYXRlcy5wdXNoKG9iamVjdHNbZHVwbGljYXRlc0luZGV4ZXNbaW5kZXgyXV0pOwogICAgICB9CiAgICAgIHN0YXRlMTAudXNlZER1cGxpY2F0ZXMgPSBuZXcgQXJyYXkobGVuZ3RoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGluc3BlY3ROb2RlKG9iamVjdCwgb2JqZWN0cywgZHVwbGljYXRlc0luZGV4ZXMpIHsKICAgICAgdmFyIG9iamVjdEtleUxpc3QsIGluZGV4MiwgbGVuZ3RoOwogICAgICBpZiAob2JqZWN0ICE9PSBudWxsICYmIHR5cGVvZiBvYmplY3QgPT09ICJvYmplY3QiKSB7CiAgICAgICAgaW5kZXgyID0gb2JqZWN0cy5pbmRleE9mKG9iamVjdCk7CiAgICAgICAgaWYgKGluZGV4MiAhPT0gLTEpIHsKICAgICAgICAgIGlmIChkdXBsaWNhdGVzSW5kZXhlcy5pbmRleE9mKGluZGV4MikgPT09IC0xKSB7CiAgICAgICAgICAgIGR1cGxpY2F0ZXNJbmRleGVzLnB1c2goaW5kZXgyKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgb2JqZWN0cy5wdXNoKG9iamVjdCk7CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7CiAgICAgICAgICAgIGZvciAoaW5kZXgyID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXgyIDwgbGVuZ3RoOyBpbmRleDIgKz0gMSkgewogICAgICAgICAgICAgIGluc3BlY3ROb2RlKG9iamVjdFtpbmRleDJdLCBvYmplY3RzLCBkdXBsaWNhdGVzSW5kZXhlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG9iamVjdEtleUxpc3QgPSBPYmplY3Qua2V5cyhvYmplY3QpOwogICAgICAgICAgICBmb3IgKGluZGV4MiA9IDAsIGxlbmd0aCA9IG9iamVjdEtleUxpc3QubGVuZ3RoOyBpbmRleDIgPCBsZW5ndGg7IGluZGV4MiArPSAxKSB7CiAgICAgICAgICAgICAgaW5zcGVjdE5vZGUob2JqZWN0W29iamVjdEtleUxpc3RbaW5kZXgyXV0sIG9iamVjdHMsIGR1cGxpY2F0ZXNJbmRleGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZHVtcChpbnB1dCwgb3B0aW9ucykgewogICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgdmFyIHN0YXRlMTAgPSBuZXcgU3RhdGUob3B0aW9ucyk7CiAgICAgIGlmICghc3RhdGUxMC5ub1JlZnMpIGdldER1cGxpY2F0ZVJlZmVyZW5jZXMoaW5wdXQsIHN0YXRlMTApOwogICAgICBpZiAod3JpdGVOb2RlKHN0YXRlMTAsIDAsIGlucHV0LCB0cnVlLCB0cnVlKSkgcmV0dXJuIHN0YXRlMTAuZHVtcCArICJcbiI7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGZ1bmN0aW9uIHNhZmVEdW1wKGlucHV0LCBvcHRpb25zKSB7CiAgICAgIHJldHVybiBkdW1wKGlucHV0LCBjb21tb24uZXh0ZW5kKHsgc2NoZW1hOiBERUZBVUxUX1NBRkVfU0NIRU1BIH0sIG9wdGlvbnMpKTsKICAgIH0KICAgIG1vZHVsZS5leHBvcnRzLmR1bXAgPSBkdW1wOwogICAgbW9kdWxlLmV4cG9ydHMuc2FmZUR1bXAgPSBzYWZlRHVtcDsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sLmpzCnZhciByZXF1aXJlX2pzX3lhbWwgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sLmpzIihleHBvcnRzLCBtb2R1bGUpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBsb2FkZXIgPSByZXF1aXJlX2xvYWRlcigpOwogICAgdmFyIGR1bXBlciA9IHJlcXVpcmVfZHVtcGVyKCk7CiAgICBmdW5jdGlvbiBkZXByZWNhdGVkKG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiRnVuY3Rpb24gIiArIG5hbWUgKyAiIGlzIGRlcHJlY2F0ZWQgYW5kIGNhbm5vdCBiZSB1c2VkLiIpOwogICAgICB9OwogICAgfQogICAgbW9kdWxlLmV4cG9ydHMuVHlwZSA9IHJlcXVpcmVfdHlwZSgpOwogICAgbW9kdWxlLmV4cG9ydHMuU2NoZW1hID0gcmVxdWlyZV9zY2hlbWEoKTsKICAgIG1vZHVsZS5leHBvcnRzLkZBSUxTQUZFX1NDSEVNQSA9IHJlcXVpcmVfZmFpbHNhZmUoKTsKICAgIG1vZHVsZS5leHBvcnRzLkpTT05fU0NIRU1BID0gcmVxdWlyZV9qc29uKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5DT1JFX1NDSEVNQSA9IHJlcXVpcmVfY29yZSgpOwogICAgbW9kdWxlLmV4cG9ydHMuREVGQVVMVF9TQUZFX1NDSEVNQSA9IHJlcXVpcmVfZGVmYXVsdF9zYWZlKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5ERUZBVUxUX0ZVTExfU0NIRU1BID0gcmVxdWlyZV9kZWZhdWx0X2Z1bGwoKTsKICAgIG1vZHVsZS5leHBvcnRzLmxvYWQgPSBsb2FkZXIubG9hZDsKICAgIG1vZHVsZS5leHBvcnRzLmxvYWRBbGwgPSBsb2FkZXIubG9hZEFsbDsKICAgIG1vZHVsZS5leHBvcnRzLnNhZmVMb2FkID0gbG9hZGVyLnNhZmVMb2FkOwogICAgbW9kdWxlLmV4cG9ydHMuc2FmZUxvYWRBbGwgPSBsb2FkZXIuc2FmZUxvYWRBbGw7CiAgICBtb2R1bGUuZXhwb3J0cy5kdW1wID0gZHVtcGVyLmR1bXA7CiAgICBtb2R1bGUuZXhwb3J0cy5zYWZlRHVtcCA9IGR1bXBlci5zYWZlRHVtcDsKICAgIG1vZHVsZS5leHBvcnRzLllBTUxFeGNlcHRpb24gPSByZXF1aXJlX2V4Y2VwdGlvbigpOwogICAgbW9kdWxlLmV4cG9ydHMuTUlOSU1BTF9TQ0hFTUEgPSByZXF1aXJlX2ZhaWxzYWZlKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5TQUZFX1NDSEVNQSA9IHJlcXVpcmVfZGVmYXVsdF9zYWZlKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5ERUZBVUxUX1NDSEVNQSA9IHJlcXVpcmVfZGVmYXVsdF9mdWxsKCk7CiAgICBtb2R1bGUuZXhwb3J0cy5zY2FuID0gZGVwcmVjYXRlZCgic2NhbiIpOwogICAgbW9kdWxlLmV4cG9ydHMucGFyc2UgPSBkZXByZWNhdGVkKCJwYXJzZSIpOwogICAgbW9kdWxlLmV4cG9ydHMuY29tcG9zZSA9IGRlcHJlY2F0ZWQoImNvbXBvc2UiKTsKICAgIG1vZHVsZS5leHBvcnRzLmFkZENvbnN0cnVjdG9yID0gZGVwcmVjYXRlZCgiYWRkQ29uc3RydWN0b3IiKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4yL25vZGVfbW9kdWxlcy9qcy15YW1sL2luZGV4LmpzCnZhciByZXF1aXJlX2pzX3lhbWwyID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMi9ub2RlX21vZHVsZXMvanMteWFtbC9pbmRleC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgeWFtbCA9IHJlcXVpcmVfanNfeWFtbCgpOwogICAgbW9kdWxlLmV4cG9ydHMgPSB5YW1sOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR5YW1sQDIuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHlhbWwvZGlzdF90cy9zbWFydHlhbWwucGx1Z2lucy5qcwp2YXIgcmVxdWlyZV9zbWFydHlhbWxfcGx1Z2lucyA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR5YW1sQDIuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHlhbWwvZGlzdF90cy9zbWFydHlhbWwucGx1Z2lucy5qcyIoZXhwb3J0cykgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fY3JlYXRlQmluZGluZzIgPSBleHBvcnRzICYmIGV4cG9ydHMuX19jcmVhdGVCaW5kaW5nIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8xMywgbTcsIGs1LCBrMjIpIHsKICAgICAgaWYgKGsyMiA9PT0gdm9pZCAwKSBrMjIgPSBrNTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8xMywgazIyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIG03W2s1XTsKICAgICAgfSB9KTsKICAgIH0pIDogKGZ1bmN0aW9uKG8xMywgbTcsIGs1LCBrMjIpIHsKICAgICAgaWYgKGsyMiA9PT0gdm9pZCAwKSBrMjIgPSBrNTsKICAgICAgbzEzW2syMl0gPSBtN1trNV07CiAgICB9KSk7CiAgICB2YXIgX19zZXRNb2R1bGVEZWZhdWx0MiA9IGV4cG9ydHMgJiYgZXhwb3J0cy5fX3NldE1vZHVsZURlZmF1bHQgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obzEzLCB2NikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobzEzLCAiZGVmYXVsdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHY2IH0pOwogICAgfSkgOiBmdW5jdGlvbihvMTMsIHY2KSB7CiAgICAgIG8xM1siZGVmYXVsdCJdID0gdjY7CiAgICB9KTsKICAgIHZhciBfX2ltcG9ydFN0YXIyID0gZXhwb3J0cyAmJiBleHBvcnRzLl9faW1wb3J0U3RhciB8fCBmdW5jdGlvbihtb2QpIHsKICAgICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDsKICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICBpZiAobW9kICE9IG51bGwpIHsKICAgICAgICBmb3IgKHZhciBrNSBpbiBtb2QpIGlmIChrNSAhPT0gImRlZmF1bHQiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgazUpKSBfX2NyZWF0ZUJpbmRpbmcyKHJlc3VsdCwgbW9kLCBrNSk7CiAgICAgIH0KICAgICAgX19zZXRNb2R1bGVEZWZhdWx0MihyZXN1bHQsIG1vZCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMuanNZYW1sID0gdm9pZCAwOwogICAgdmFyIGpzWWFtbCA9IF9faW1wb3J0U3RhcjIocmVxdWlyZV9qc195YW1sMigpKTsKICAgIGV4cG9ydHMuanNZYW1sID0ganNZYW1sOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR5YW1sQDIuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHlhbWwvZGlzdF90cy9pbmRleC5qcwp2YXIgcmVxdWlyZV9kaXN0X3RzMiA9IF9fY29tbW9uSlMoewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR5YW1sQDIuMC41L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHlhbWwvZGlzdF90cy9pbmRleC5qcyIoZXhwb3J0cykgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIF9fY3JlYXRlQmluZGluZzIgPSBleHBvcnRzICYmIGV4cG9ydHMuX19jcmVhdGVCaW5kaW5nIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8xMywgbTcsIGs1LCBrMjIpIHsKICAgICAgaWYgKGsyMiA9PT0gdm9pZCAwKSBrMjIgPSBrNTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8xMywgazIyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIG03W2s1XTsKICAgICAgfSB9KTsKICAgIH0pIDogKGZ1bmN0aW9uKG8xMywgbTcsIGs1LCBrMjIpIHsKICAgICAgaWYgKGsyMiA9PT0gdm9pZCAwKSBrMjIgPSBrNTsKICAgICAgbzEzW2syMl0gPSBtN1trNV07CiAgICB9KSk7CiAgICB2YXIgX19zZXRNb2R1bGVEZWZhdWx0MiA9IGV4cG9ydHMgJiYgZXhwb3J0cy5fX3NldE1vZHVsZURlZmF1bHQgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obzEzLCB2NikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobzEzLCAiZGVmYXVsdCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHY2IH0pOwogICAgfSkgOiBmdW5jdGlvbihvMTMsIHY2KSB7CiAgICAgIG8xM1siZGVmYXVsdCJdID0gdjY7CiAgICB9KTsKICAgIHZhciBfX2ltcG9ydFN0YXIyID0gZXhwb3J0cyAmJiBleHBvcnRzLl9faW1wb3J0U3RhciB8fCBmdW5jdGlvbihtb2QpIHsKICAgICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDsKICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICBpZiAobW9kICE9IG51bGwpIHsKICAgICAgICBmb3IgKHZhciBrNSBpbiBtb2QpIGlmIChrNSAhPT0gImRlZmF1bHQiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgazUpKSBfX2NyZWF0ZUJpbmRpbmcyKHJlc3VsdCwgbW9kLCBrNSk7CiAgICAgIH0KICAgICAgX19zZXRNb2R1bGVEZWZhdWx0MihyZXN1bHQsIG1vZCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMub2JqZWN0VG9ZYW1sU3RyaW5nID0gZXhwb3J0cy55YW1sU3RyaW5nVG9PYmplY3QgPSB2b2lkIDA7CiAgICB2YXIgcGx1Z2luczMgPSBfX2ltcG9ydFN0YXIyKHJlcXVpcmVfc21hcnR5YW1sX3BsdWdpbnMoKSk7CiAgICBleHBvcnRzLnlhbWxTdHJpbmdUb09iamVjdCA9IGFzeW5jICh5YW1sU3RyaW5nQXJnLCBvcHRpb25zQXJnID0ge30pID0+IHsKICAgICAgcmV0dXJuIHBsdWdpbnMzLmpzWWFtbC5zYWZlTG9hZCh5YW1sU3RyaW5nQXJnKTsKICAgIH07CiAgICBleHBvcnRzLm9iamVjdFRvWWFtbFN0cmluZyA9IGFzeW5jIChvYmplY3RBcmcsIG9wdGlvbnNBcmcgPSB7fSkgPT4gewogICAgICByZXR1cm4gcGx1Z2luczMuanNZYW1sLnNhZmVEdW1wKG9iamVjdEFyZyk7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vYmFpbEAyLjAuMi9ub2RlX21vZHVsZXMvYmFpbC9pbmRleC5qcwpmdW5jdGlvbiBiYWlsKGVycm9yKSB7CiAgaWYgKGVycm9yKSB7CiAgICB0aHJvdyBlcnJvcjsKICB9Cn0KdmFyIGluaXRfYmFpbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2JhaWxAMi4wLjIvbm9kZV9tb2R1bGVzL2JhaWwvaW5kZXguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZXh0ZW5kQDMuMC4yL25vZGVfbW9kdWxlcy9leHRlbmQvaW5kZXguanMKdmFyIHJlcXVpcmVfZXh0ZW5kID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9leHRlbmRAMy4wLjIvbm9kZV9tb2R1bGVzL2V4dGVuZC9pbmRleC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICAgIHZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CiAgICB2YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7CiAgICB2YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICB2YXIgaXNBcnJheTUgPSBmdW5jdGlvbiBpc0FycmF5NihhcnIpIHsKICAgICAgaWYgKHR5cGVvZiBBcnJheS5pc0FycmF5ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyKTsKICAgICAgfQogICAgICByZXR1cm4gdG9TdHIuY2FsbChhcnIpID09PSAiW29iamVjdCBBcnJheV0iOwogICAgfTsKICAgIHZhciBpc1BsYWluT2JqZWN0MiA9IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QzKG9iaikgewogICAgICBpZiAoIW9iaiB8fCB0b1N0ci5jYWxsKG9iaikgIT09ICJbb2JqZWN0IE9iamVjdF0iKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHZhciBoYXNPd25Db25zdHJ1Y3RvciA9IGhhc093bi5jYWxsKG9iaiwgImNvbnN0cnVjdG9yIik7CiAgICAgIHZhciBoYXNJc1Byb3RvdHlwZU9mID0gb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiYgaGFzT3duLmNhbGwob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgImlzUHJvdG90eXBlT2YiKTsKICAgICAgaWYgKG9iai5jb25zdHJ1Y3RvciAmJiAhaGFzT3duQ29uc3RydWN0b3IgJiYgIWhhc0lzUHJvdG90eXBlT2YpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIGtleTI7CiAgICAgIGZvciAoa2V5MiBpbiBvYmopIHsKICAgICAgfQogICAgICByZXR1cm4gdHlwZW9mIGtleTIgPT09ICJ1bmRlZmluZWQiIHx8IGhhc093bi5jYWxsKG9iaiwga2V5Mik7CiAgICB9OwogICAgdmFyIHNldFByb3BlcnR5ID0gZnVuY3Rpb24gc2V0UHJvcGVydHkyKHRhcmdldCwgb3B0aW9ucykgewogICAgICBpZiAoZGVmaW5lUHJvcGVydHkgJiYgb3B0aW9ucy5uYW1lID09PSAiX19wcm90b19fIikgewogICAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwgb3B0aW9ucy5uYW1lLCB7CiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgdmFsdWU6IG9wdGlvbnMubmV3VmFsdWUsCiAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHRhcmdldFtvcHRpb25zLm5hbWVdID0gb3B0aW9ucy5uZXdWYWx1ZTsKICAgICAgfQogICAgfTsKICAgIHZhciBnZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIGdldFByb3BlcnR5MihvYmosIG5hbWUpIHsKICAgICAgaWYgKG5hbWUgPT09ICJfX3Byb3RvX18iKSB7CiAgICAgICAgaWYgKCFoYXNPd24uY2FsbChvYmosIG5hbWUpKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0gZWxzZSBpZiAoZ09QRCkgewogICAgICAgICAgcmV0dXJuIGdPUEQob2JqLCBuYW1lKS52YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG9ialtuYW1lXTsKICAgIH07CiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV4dGVuZDMoKSB7CiAgICAgIHZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZTsKICAgICAgdmFyIHRhcmdldCA9IGFyZ3VtZW50c1swXTsKICAgICAgdmFyIGkxMSA9IDE7CiAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogICAgICB2YXIgZGVlcCA9IGZhbHNlOwogICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgZGVlcCA9IHRhcmdldDsKICAgICAgICB0YXJnZXQgPSBhcmd1bWVudHNbMV0gfHwge307CiAgICAgICAgaTExID0gMjsKICAgICAgfQogICAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgdHlwZW9mIHRhcmdldCAhPT0gIm9iamVjdCIgJiYgdHlwZW9mIHRhcmdldCAhPT0gImZ1bmN0aW9uIikgewogICAgICAgIHRhcmdldCA9IHt9OwogICAgICB9CiAgICAgIGZvciAoOyBpMTEgPCBsZW5ndGg7ICsraTExKSB7CiAgICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50c1tpMTFdOwogICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHsKICAgICAgICAgIGZvciAobmFtZSBpbiBvcHRpb25zKSB7CiAgICAgICAgICAgIHNyYyA9IGdldFByb3BlcnR5KHRhcmdldCwgbmFtZSk7CiAgICAgICAgICAgIGNvcHkgPSBnZXRQcm9wZXJ0eShvcHRpb25zLCBuYW1lKTsKICAgICAgICAgICAgaWYgKHRhcmdldCAhPT0gY29weSkgewogICAgICAgICAgICAgIGlmIChkZWVwICYmIGNvcHkgJiYgKGlzUGxhaW5PYmplY3QyKGNvcHkpIHx8IChjb3B5SXNBcnJheSA9IGlzQXJyYXk1KGNvcHkpKSkpIHsKICAgICAgICAgICAgICAgIGlmIChjb3B5SXNBcnJheSkgewogICAgICAgICAgICAgICAgICBjb3B5SXNBcnJheSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICBjbG9uZSA9IHNyYyAmJiBpc0FycmF5NShzcmMpID8gc3JjIDogW107CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBjbG9uZSA9IHNyYyAmJiBpc1BsYWluT2JqZWN0MihzcmMpID8gc3JjIDoge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eSh0YXJnZXQsIHsgbmFtZSwgbmV3VmFsdWU6IGV4dGVuZDMoZGVlcCwgY2xvbmUsIGNvcHkpIH0pOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvcHkgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eSh0YXJnZXQsIHsgbmFtZSwgbmV3VmFsdWU6IGNvcHkgfSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGV2bG9wQDEuMS4wL25vZGVfbW9kdWxlcy9kZXZsb3AvbGliL2RlZmF1bHQuanMKZnVuY3Rpb24gZGVwcmVjYXRlKGZuKSB7CiAgcmV0dXJuIGZuOwp9CmZ1bmN0aW9uIGVxdWFsKCkgewp9CmZ1bmN0aW9uIG9rKCkgewp9CmZ1bmN0aW9uIHVucmVhY2hhYmxlKCkgewp9CnZhciBpbml0X2RlZmF1bHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9kZXZsb3BAMS4xLjAvbm9kZV9tb2R1bGVzL2RldmxvcC9saWIvZGVmYXVsdC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9pcy1wbGFpbi1vYmpANC4xLjAvbm9kZV9tb2R1bGVzL2lzLXBsYWluLW9iai9pbmRleC5qcwpmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlMikgewogIGlmICh0eXBlb2YgdmFsdWUyICE9PSAib2JqZWN0IiB8fCB2YWx1ZTIgPT09IG51bGwpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlMik7CiAgcmV0dXJuIChwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBudWxsKSAmJiAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZTIpICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIHZhbHVlMik7Cn0KdmFyIGluaXRfaXNfcGxhaW5fb2JqID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vaXMtcGxhaW4tb2JqQDQuMS4wL25vZGVfbW9kdWxlcy9pcy1wbGFpbi1vYmovaW5kZXguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdHJvdWdoQDIuMi4wL25vZGVfbW9kdWxlcy90cm91Z2gvbGliL2luZGV4LmpzCmZ1bmN0aW9uIHRyb3VnaCgpIHsKICBjb25zdCBmbnMgPSBbXTsKICBjb25zdCBwaXBlbGluZSA9IHsgcnVuLCB1c2UgfTsKICByZXR1cm4gcGlwZWxpbmU7CiAgZnVuY3Rpb24gcnVuKC4uLnZhbHVlcykgewogICAgbGV0IG1pZGRsZXdhcmVJbmRleCA9IC0xOwogICAgY29uc3QgY2FsbGJhY2sgPSB2YWx1ZXMucG9wKCk7CiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGZ1bmN0aW9uIGFzIGxhc3QgYXJndW1lbnQsIG5vdCAiICsgY2FsbGJhY2spOwogICAgfQogICAgbmV4dDIobnVsbCwgLi4udmFsdWVzKTsKICAgIGZ1bmN0aW9uIG5leHQyKGVycm9yLCAuLi5vdXRwdXQpIHsKICAgICAgY29uc3QgZm4gPSBmbnNbKyttaWRkbGV3YXJlSW5kZXhdOwogICAgICBsZXQgaW5kZXgyID0gLTE7CiAgICAgIGlmIChlcnJvcikgewogICAgICAgIGNhbGxiYWNrKGVycm9yKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgd2hpbGUgKCsraW5kZXgyIDwgdmFsdWVzLmxlbmd0aCkgewogICAgICAgIGlmIChvdXRwdXRbaW5kZXgyXSA9PT0gbnVsbCB8fCBvdXRwdXRbaW5kZXgyXSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBvdXRwdXRbaW5kZXgyXSA9IHZhbHVlc1tpbmRleDJdOwogICAgICAgIH0KICAgICAgfQogICAgICB2YWx1ZXMgPSBvdXRwdXQ7CiAgICAgIGlmIChmbikgewogICAgICAgIHdyYXAyKGZuLCBuZXh0MikoLi4ub3V0cHV0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjYWxsYmFjayhudWxsLCAuLi5vdXRwdXQpOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIHVzZShtaWRkZWx3YXJlKSB7CiAgICBpZiAodHlwZW9mIG1pZGRlbHdhcmUgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgICAiRXhwZWN0ZWQgYG1pZGRlbHdhcmVgIHRvIGJlIGEgZnVuY3Rpb24sIG5vdCAiICsgbWlkZGVsd2FyZQogICAgICApOwogICAgfQogICAgZm5zLnB1c2gobWlkZGVsd2FyZSk7CiAgICByZXR1cm4gcGlwZWxpbmU7CiAgfQp9CmZ1bmN0aW9uIHdyYXAyKG1pZGRsZXdhcmUsIGNhbGxiYWNrKSB7CiAgbGV0IGNhbGxlZDsKICByZXR1cm4gd3JhcHBlZDsKICBmdW5jdGlvbiB3cmFwcGVkKC4uLnBhcmFtZXRlcnMpIHsKICAgIGNvbnN0IGZuRXhwZWN0c0NhbGxiYWNrID0gbWlkZGxld2FyZS5sZW5ndGggPiBwYXJhbWV0ZXJzLmxlbmd0aDsKICAgIGxldCByZXN1bHQ7CiAgICBpZiAoZm5FeHBlY3RzQ2FsbGJhY2spIHsKICAgICAgcGFyYW1ldGVycy5wdXNoKGRvbmUpOwogICAgfQogICAgdHJ5IHsKICAgICAgcmVzdWx0ID0gbWlkZGxld2FyZS5hcHBseSh0aGlzLCBwYXJhbWV0ZXJzKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9ICgKICAgICAgICAvKiogQHR5cGUge0Vycm9yfSAqLwogICAgICAgIGVycm9yCiAgICAgICk7CiAgICAgIGlmIChmbkV4cGVjdHNDYWxsYmFjayAmJiBjYWxsZWQpIHsKICAgICAgICB0aHJvdyBleGNlcHRpb247CiAgICAgIH0KICAgICAgcmV0dXJuIGRvbmUoZXhjZXB0aW9uKTsKICAgIH0KICAgIGlmICghZm5FeHBlY3RzQ2FsbGJhY2spIHsKICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQudGhlbiAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICByZXN1bHQudGhlbih0aGVuLCBkb25lKTsKICAgICAgfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikgewogICAgICAgIGRvbmUocmVzdWx0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGVuKHJlc3VsdCk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gZG9uZShlcnJvciwgLi4ub3V0cHV0KSB7CiAgICBpZiAoIWNhbGxlZCkgewogICAgICBjYWxsZWQgPSB0cnVlOwogICAgICBjYWxsYmFjayhlcnJvciwgLi4ub3V0cHV0KTsKICAgIH0KICB9CiAgZnVuY3Rpb24gdGhlbih2YWx1ZTIpIHsKICAgIGRvbmUobnVsbCwgdmFsdWUyKTsKICB9Cn0KdmFyIGluaXRfbGliID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdHJvdWdoQDIuMi4wL25vZGVfbW9kdWxlcy90cm91Z2gvbGliL2luZGV4LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Ryb3VnaEAyLjIuMC9ub2RlX21vZHVsZXMvdHJvdWdoL2luZGV4LmpzCnZhciBpbml0X3Ryb3VnaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3Ryb3VnaEAyLjIuMC9ub2RlX21vZHVsZXMvdHJvdWdoL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXN0cmluZ2lmeS1wb3NpdGlvbkA0LjAuMC9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC1zdHJpbmdpZnktcG9zaXRpb24vbGliL2luZGV4LmpzCmZ1bmN0aW9uIHN0cmluZ2lmeVBvc2l0aW9uKHZhbHVlMikgewogIGlmICghdmFsdWUyIHx8IHR5cGVvZiB2YWx1ZTIgIT09ICJvYmplY3QiKSB7CiAgICByZXR1cm4gIiI7CiAgfQogIGlmICgicG9zaXRpb24iIGluIHZhbHVlMiB8fCAidHlwZSIgaW4gdmFsdWUyKSB7CiAgICByZXR1cm4gcG9zaXRpb24odmFsdWUyLnBvc2l0aW9uKTsKICB9CiAgaWYgKCJzdGFydCIgaW4gdmFsdWUyIHx8ICJlbmQiIGluIHZhbHVlMikgewogICAgcmV0dXJuIHBvc2l0aW9uKHZhbHVlMik7CiAgfQogIGlmICgibGluZSIgaW4gdmFsdWUyIHx8ICJjb2x1bW4iIGluIHZhbHVlMikgewogICAgcmV0dXJuIHBvaW50KHZhbHVlMik7CiAgfQogIHJldHVybiAiIjsKfQpmdW5jdGlvbiBwb2ludChwb2ludDQpIHsKICByZXR1cm4gaW5kZXgocG9pbnQ0ICYmIHBvaW50NC5saW5lKSArICI6IiArIGluZGV4KHBvaW50NCAmJiBwb2ludDQuY29sdW1uKTsKfQpmdW5jdGlvbiBwb3NpdGlvbihwb3MpIHsKICByZXR1cm4gcG9pbnQocG9zICYmIHBvcy5zdGFydCkgKyAiLSIgKyBwb2ludChwb3MgJiYgcG9zLmVuZCk7Cn0KZnVuY3Rpb24gaW5kZXgodmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMiAmJiB0eXBlb2YgdmFsdWUyID09PSAibnVtYmVyIiA/IHZhbHVlMiA6IDE7Cn0KdmFyIGluaXRfbGliMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtc3RyaW5naWZ5LXBvc2l0aW9uQDQuMC4wL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXN0cmluZ2lmeS1wb3NpdGlvbi9saWIvaW5kZXguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdW5pc3QtdXRpbC1zdHJpbmdpZnktcG9zaXRpb25ANC4wLjAvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtc3RyaW5naWZ5LXBvc2l0aW9uL2luZGV4LmpzCnZhciBpbml0X3VuaXN0X3V0aWxfc3RyaW5naWZ5X3Bvc2l0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdW5pc3QtdXRpbC1zdHJpbmdpZnktcG9zaXRpb25ANC4wLjAvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtc3RyaW5naWZ5LXBvc2l0aW9uL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliMigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdmZpbGUtbWVzc2FnZUA0LjAuMy9ub2RlX21vZHVsZXMvdmZpbGUtbWVzc2FnZS9saWIvaW5kZXguanMKdmFyIFZGaWxlTWVzc2FnZTsKdmFyIGluaXRfbGliMyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3ZmaWxlLW1lc3NhZ2VANC4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlLW1lc3NhZ2UvbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfdW5pc3RfdXRpbF9zdHJpbmdpZnlfcG9zaXRpb24oKTsKICAgIFZGaWxlTWVzc2FnZSA9IGNsYXNzIGV4dGVuZHMgRXJyb3IgewogICAgICAvKioKICAgICAgICogQ3JlYXRlIGEgbWVzc2FnZSBmb3IgYHJlYXNvbmAuCiAgICAgICAqCiAgICAgICAqID4g8J+qpiAqKk5vdGUqKjogYWxzbyBoYXMgb2Jzb2xldGUgc2lnbmF0dXJlcy4KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgICAgICogQHBhcmFtIHtPcHRpb25zIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29wdGlvbnNdCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICAgICAqIEBwYXJhbSB7Tm9kZSB8IE5vZGVMaWtlIHwgbnVsbCB8IHVuZGVmaW5lZH0gcGFyZW50CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogQHJldHVybnMKICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgICAgICogQHBhcmFtIHtQb2ludCB8IFBvc2l0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZH0gcGxhY2UKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAgICAgKiBAcmV0dXJucwogICAgICAgKgogICAgICAgKiBAb3ZlcmxvYWQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAgICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IHBhcmVudAogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAgICAgKiBAcGFyYW0ge1BvaW50IHwgUG9zaXRpb24gfCBudWxsIHwgdW5kZWZpbmVkfSBwbGFjZQogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7RXJyb3IgfCBWRmlsZU1lc3NhZ2UgfCBzdHJpbmd9IGNhdXNlT3JSZWFzb24KICAgICAgICogICBSZWFzb24gZm9yIG1lc3NhZ2UsIHNob3VsZCB1c2UgbWFya2Rvd24uCiAgICAgICAqIEBwYXJhbSB7Tm9kZSB8IE5vZGVMaWtlIHwgT3B0aW9ucyB8IFBvaW50IHwgUG9zaXRpb24gfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0aW9uc09yUGFyZW50T3JQbGFjZV0KICAgICAgICogICBDb25maWd1cmF0aW9uIChvcHRpb25hbCkuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogICBQbGFjZSBpbiBjb2RlIHdoZXJlIHRoZSBtZXNzYWdlIG9yaWdpbmF0ZXMgKGV4YW1wbGU6CiAgICAgICAqICAgYCdteS1wYWNrYWdlOm15LXJ1bGUnYCBvciBgJ215LXJ1bGUnYCkuCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqICAgSW5zdGFuY2Ugb2YgYFZGaWxlTWVzc2FnZWAuCiAgICAgICAqLwogICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eQogICAgICBjb25zdHJ1Y3RvcihjYXVzZU9yUmVhc29uLCBvcHRpb25zT3JQYXJlbnRPclBsYWNlLCBvcmlnaW4pIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yUGFyZW50T3JQbGFjZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIG9yaWdpbiA9IG9wdGlvbnNPclBhcmVudE9yUGxhY2U7CiAgICAgICAgICBvcHRpb25zT3JQYXJlbnRPclBsYWNlID0gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBsZXQgcmVhc29uID0gIiI7CiAgICAgICAgbGV0IG9wdGlvbnMgPSB7fTsKICAgICAgICBsZXQgbGVnYWN5Q2F1c2UgPSBmYWxzZTsKICAgICAgICBpZiAob3B0aW9uc09yUGFyZW50T3JQbGFjZSkgewogICAgICAgICAgaWYgKCJsaW5lIiBpbiBvcHRpb25zT3JQYXJlbnRPclBsYWNlICYmICJjb2x1bW4iIGluIG9wdGlvbnNPclBhcmVudE9yUGxhY2UpIHsKICAgICAgICAgICAgb3B0aW9ucyA9IHsgcGxhY2U6IG9wdGlvbnNPclBhcmVudE9yUGxhY2UgfTsKICAgICAgICAgIH0gZWxzZSBpZiAoInN0YXJ0IiBpbiBvcHRpb25zT3JQYXJlbnRPclBsYWNlICYmICJlbmQiIGluIG9wdGlvbnNPclBhcmVudE9yUGxhY2UpIHsKICAgICAgICAgICAgb3B0aW9ucyA9IHsgcGxhY2U6IG9wdGlvbnNPclBhcmVudE9yUGxhY2UgfTsKICAgICAgICAgIH0gZWxzZSBpZiAoInR5cGUiIGluIG9wdGlvbnNPclBhcmVudE9yUGxhY2UpIHsKICAgICAgICAgICAgb3B0aW9ucyA9IHsKICAgICAgICAgICAgICBhbmNlc3RvcnM6IFtvcHRpb25zT3JQYXJlbnRPclBsYWNlXSwKICAgICAgICAgICAgICBwbGFjZTogb3B0aW9uc09yUGFyZW50T3JQbGFjZS5wb3NpdGlvbgogICAgICAgICAgICB9OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb3B0aW9ucyA9IHsgLi4ub3B0aW9uc09yUGFyZW50T3JQbGFjZSB9OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIGNhdXNlT3JSZWFzb24gPT09ICJzdHJpbmciKSB7CiAgICAgICAgICByZWFzb24gPSBjYXVzZU9yUmVhc29uOwogICAgICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMuY2F1c2UgJiYgY2F1c2VPclJlYXNvbikgewogICAgICAgICAgbGVnYWN5Q2F1c2UgPSB0cnVlOwogICAgICAgICAgcmVhc29uID0gY2F1c2VPclJlYXNvbi5tZXNzYWdlOwogICAgICAgICAgb3B0aW9ucy5jYXVzZSA9IGNhdXNlT3JSZWFzb247CiAgICAgICAgfQogICAgICAgIGlmICghb3B0aW9ucy5ydWxlSWQgJiYgIW9wdGlvbnMuc291cmNlICYmIHR5cGVvZiBvcmlnaW4gPT09ICJzdHJpbmciKSB7CiAgICAgICAgICBjb25zdCBpbmRleDIgPSBvcmlnaW4uaW5kZXhPZigiOiIpOwogICAgICAgICAgaWYgKGluZGV4MiA9PT0gLTEpIHsKICAgICAgICAgICAgb3B0aW9ucy5ydWxlSWQgPSBvcmlnaW47CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvcHRpb25zLnNvdXJjZSA9IG9yaWdpbi5zbGljZSgwLCBpbmRleDIpOwogICAgICAgICAgICBvcHRpb25zLnJ1bGVJZCA9IG9yaWdpbi5zbGljZShpbmRleDIgKyAxKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFvcHRpb25zLnBsYWNlICYmIG9wdGlvbnMuYW5jZXN0b3JzICYmIG9wdGlvbnMuYW5jZXN0b3JzKSB7CiAgICAgICAgICBjb25zdCBwYXJlbnQgPSBvcHRpb25zLmFuY2VzdG9yc1tvcHRpb25zLmFuY2VzdG9ycy5sZW5ndGggLSAxXTsKICAgICAgICAgIGlmIChwYXJlbnQpIHsKICAgICAgICAgICAgb3B0aW9ucy5wbGFjZSA9IHBhcmVudC5wb3NpdGlvbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3Qgc3RhcnQgPSBvcHRpb25zLnBsYWNlICYmICJzdGFydCIgaW4gb3B0aW9ucy5wbGFjZSA/IG9wdGlvbnMucGxhY2Uuc3RhcnQgOiBvcHRpb25zLnBsYWNlOwogICAgICAgIHRoaXMuYW5jZXN0b3JzID0gb3B0aW9ucy5hbmNlc3RvcnMgfHwgdm9pZCAwOwogICAgICAgIHRoaXMuY2F1c2UgPSBvcHRpb25zLmNhdXNlIHx8IHZvaWQgMDsKICAgICAgICB0aGlzLmNvbHVtbiA9IHN0YXJ0ID8gc3RhcnQuY29sdW1uIDogdm9pZCAwOwogICAgICAgIHRoaXMuZmF0YWwgPSB2b2lkIDA7CiAgICAgICAgdGhpcy5maWxlID0gIiI7CiAgICAgICAgdGhpcy5tZXNzYWdlID0gcmVhc29uOwogICAgICAgIHRoaXMubGluZSA9IHN0YXJ0ID8gc3RhcnQubGluZSA6IHZvaWQgMDsKICAgICAgICB0aGlzLm5hbWUgPSBzdHJpbmdpZnlQb3NpdGlvbihvcHRpb25zLnBsYWNlKSB8fCAiMToxIjsKICAgICAgICB0aGlzLnBsYWNlID0gb3B0aW9ucy5wbGFjZSB8fCB2b2lkIDA7CiAgICAgICAgdGhpcy5yZWFzb24gPSB0aGlzLm1lc3NhZ2U7CiAgICAgICAgdGhpcy5ydWxlSWQgPSBvcHRpb25zLnJ1bGVJZCB8fCB2b2lkIDA7CiAgICAgICAgdGhpcy5zb3VyY2UgPSBvcHRpb25zLnNvdXJjZSB8fCB2b2lkIDA7CiAgICAgICAgdGhpcy5zdGFjayA9IGxlZ2FjeUNhdXNlICYmIG9wdGlvbnMuY2F1c2UgJiYgdHlwZW9mIG9wdGlvbnMuY2F1c2Uuc3RhY2sgPT09ICJzdHJpbmciID8gb3B0aW9ucy5jYXVzZS5zdGFjayA6ICIiOwogICAgICAgIHRoaXMuYWN0dWFsID0gdm9pZCAwOwogICAgICAgIHRoaXMuZXhwZWN0ZWQgPSB2b2lkIDA7CiAgICAgICAgdGhpcy5ub3RlID0gdm9pZCAwOwogICAgICAgIHRoaXMudXJsID0gdm9pZCAwOwogICAgICB9CiAgICB9OwogICAgVkZpbGVNZXNzYWdlLnByb3RvdHlwZS5maWxlID0gIiI7CiAgICBWRmlsZU1lc3NhZ2UucHJvdG90eXBlLm5hbWUgPSAiIjsKICAgIFZGaWxlTWVzc2FnZS5wcm90b3R5cGUucmVhc29uID0gIiI7CiAgICBWRmlsZU1lc3NhZ2UucHJvdG90eXBlLm1lc3NhZ2UgPSAiIjsKICAgIFZGaWxlTWVzc2FnZS5wcm90b3R5cGUuc3RhY2sgPSAiIjsKICAgIFZGaWxlTWVzc2FnZS5wcm90b3R5cGUuY29sdW1uID0gdm9pZCAwOwogICAgVkZpbGVNZXNzYWdlLnByb3RvdHlwZS5saW5lID0gdm9pZCAwOwogICAgVkZpbGVNZXNzYWdlLnByb3RvdHlwZS5hbmNlc3RvcnMgPSB2b2lkIDA7CiAgICBWRmlsZU1lc3NhZ2UucHJvdG90eXBlLmNhdXNlID0gdm9pZCAwOwogICAgVkZpbGVNZXNzYWdlLnByb3RvdHlwZS5mYXRhbCA9IHZvaWQgMDsKICAgIFZGaWxlTWVzc2FnZS5wcm90b3R5cGUucGxhY2UgPSB2b2lkIDA7CiAgICBWRmlsZU1lc3NhZ2UucHJvdG90eXBlLnJ1bGVJZCA9IHZvaWQgMDsKICAgIFZGaWxlTWVzc2FnZS5wcm90b3R5cGUuc291cmNlID0gdm9pZCAwOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdmZpbGUtbWVzc2FnZUA0LjAuMy9ub2RlX21vZHVsZXMvdmZpbGUtbWVzc2FnZS9pbmRleC5qcwp2YXIgaW5pdF92ZmlsZV9tZXNzYWdlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdmZpbGUtbWVzc2FnZUA0LjAuMy9ub2RlX21vZHVsZXMvdmZpbGUtbWVzc2FnZS9pbmRleC5qcyIoKSB7CiAgICBpbml0X2xpYjMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3ZmaWxlQDYuMC4zL25vZGVfbW9kdWxlcy92ZmlsZS9saWIvbWlucGF0aC5icm93c2VyLmpzCmZ1bmN0aW9uIGJhc2VuYW1lKHBhdGgyLCBleHRuYW1lMikgewogIGlmIChleHRuYW1lMiAhPT0gdm9pZCAwICYmIHR5cGVvZiBleHRuYW1lMiAhPT0gInN0cmluZyIpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJyJleHQiIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnKTsKICB9CiAgYXNzZXJ0UGF0aChwYXRoMik7CiAgbGV0IHN0YXJ0ID0gMDsKICBsZXQgZW5kMyA9IC0xOwogIGxldCBpbmRleDIgPSBwYXRoMi5sZW5ndGg7CiAgbGV0IHNlZW5Ob25TbGFzaDsKICBpZiAoZXh0bmFtZTIgPT09IHZvaWQgMCB8fCBleHRuYW1lMi5sZW5ndGggPT09IDAgfHwgZXh0bmFtZTIubGVuZ3RoID4gcGF0aDIubGVuZ3RoKSB7CiAgICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgICAgaWYgKHBhdGgyLmNvZGVQb2ludEF0KGluZGV4MikgPT09IDQ3KSB7CiAgICAgICAgaWYgKHNlZW5Ob25TbGFzaCkgewogICAgICAgICAgc3RhcnQgPSBpbmRleDIgKyAxOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGVuZDMgPCAwKSB7CiAgICAgICAgc2Vlbk5vblNsYXNoID0gdHJ1ZTsKICAgICAgICBlbmQzID0gaW5kZXgyICsgMTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGVuZDMgPCAwID8gIiIgOiBwYXRoMi5zbGljZShzdGFydCwgZW5kMyk7CiAgfQogIGlmIChleHRuYW1lMiA9PT0gcGF0aDIpIHsKICAgIHJldHVybiAiIjsKICB9CiAgbGV0IGZpcnN0Tm9uU2xhc2hFbmQgPSAtMTsKICBsZXQgZXh0bmFtZUluZGV4ID0gZXh0bmFtZTIubGVuZ3RoIC0gMTsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIGlmIChwYXRoMi5jb2RlUG9pbnRBdChpbmRleDIpID09PSA0NykgewogICAgICBpZiAoc2Vlbk5vblNsYXNoKSB7CiAgICAgICAgc3RhcnQgPSBpbmRleDIgKyAxOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAoZmlyc3ROb25TbGFzaEVuZCA8IDApIHsKICAgICAgICBzZWVuTm9uU2xhc2ggPSB0cnVlOwogICAgICAgIGZpcnN0Tm9uU2xhc2hFbmQgPSBpbmRleDIgKyAxOwogICAgICB9CiAgICAgIGlmIChleHRuYW1lSW5kZXggPiAtMSkgewogICAgICAgIGlmIChwYXRoMi5jb2RlUG9pbnRBdChpbmRleDIpID09PSBleHRuYW1lMi5jb2RlUG9pbnRBdChleHRuYW1lSW5kZXgtLSkpIHsKICAgICAgICAgIGlmIChleHRuYW1lSW5kZXggPCAwKSB7CiAgICAgICAgICAgIGVuZDMgPSBpbmRleDI7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGV4dG5hbWVJbmRleCA9IC0xOwogICAgICAgICAgZW5kMyA9IGZpcnN0Tm9uU2xhc2hFbmQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGlmIChzdGFydCA9PT0gZW5kMykgewogICAgZW5kMyA9IGZpcnN0Tm9uU2xhc2hFbmQ7CiAgfSBlbHNlIGlmIChlbmQzIDwgMCkgewogICAgZW5kMyA9IHBhdGgyLmxlbmd0aDsKICB9CiAgcmV0dXJuIHBhdGgyLnNsaWNlKHN0YXJ0LCBlbmQzKTsKfQpmdW5jdGlvbiBkaXJuYW1lKHBhdGgyKSB7CiAgYXNzZXJ0UGF0aChwYXRoMik7CiAgaWYgKHBhdGgyLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuICIuIjsKICB9CiAgbGV0IGVuZDMgPSAtMTsKICBsZXQgaW5kZXgyID0gcGF0aDIubGVuZ3RoOwogIGxldCB1bm1hdGNoZWRTbGFzaDsKICB3aGlsZSAoLS1pbmRleDIpIHsKICAgIGlmIChwYXRoMi5jb2RlUG9pbnRBdChpbmRleDIpID09PSA0NykgewogICAgICBpZiAodW5tYXRjaGVkU2xhc2gpIHsKICAgICAgICBlbmQzID0gaW5kZXgyOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9IGVsc2UgaWYgKCF1bm1hdGNoZWRTbGFzaCkgewogICAgICB1bm1hdGNoZWRTbGFzaCA9IHRydWU7CiAgICB9CiAgfQogIHJldHVybiBlbmQzIDwgMCA/IHBhdGgyLmNvZGVQb2ludEF0KDApID09PSA0NyA/ICIvIiA6ICIuIiA6IGVuZDMgPT09IDEgJiYgcGF0aDIuY29kZVBvaW50QXQoMCkgPT09IDQ3ID8gIi8vIiA6IHBhdGgyLnNsaWNlKDAsIGVuZDMpOwp9CmZ1bmN0aW9uIGV4dG5hbWUocGF0aDIpIHsKICBhc3NlcnRQYXRoKHBhdGgyKTsKICBsZXQgaW5kZXgyID0gcGF0aDIubGVuZ3RoOwogIGxldCBlbmQzID0gLTE7CiAgbGV0IHN0YXJ0UGFydCA9IDA7CiAgbGV0IHN0YXJ0RG90ID0gLTE7CiAgbGV0IHByZURvdFN0YXRlID0gMDsKICBsZXQgdW5tYXRjaGVkU2xhc2g7CiAgd2hpbGUgKGluZGV4Mi0tKSB7CiAgICBjb25zdCBjb2RlNCA9IHBhdGgyLmNvZGVQb2ludEF0KGluZGV4Mik7CiAgICBpZiAoY29kZTQgPT09IDQ3KSB7CiAgICAgIGlmICh1bm1hdGNoZWRTbGFzaCkgewogICAgICAgIHN0YXJ0UGFydCA9IGluZGV4MiArIDE7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAoZW5kMyA8IDApIHsKICAgICAgdW5tYXRjaGVkU2xhc2ggPSB0cnVlOwogICAgICBlbmQzID0gaW5kZXgyICsgMTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDYpIHsKICAgICAgaWYgKHN0YXJ0RG90IDwgMCkgewogICAgICAgIHN0YXJ0RG90ID0gaW5kZXgyOwogICAgICB9IGVsc2UgaWYgKHByZURvdFN0YXRlICE9PSAxKSB7CiAgICAgICAgcHJlRG90U3RhdGUgPSAxOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHN0YXJ0RG90ID4gLTEpIHsKICAgICAgcHJlRG90U3RhdGUgPSAtMTsKICAgIH0KICB9CiAgaWYgKHN0YXJ0RG90IDwgMCB8fCBlbmQzIDwgMCB8fCAvLyBXZSBzYXcgYSBub24tZG90IGNoYXJhY3RlciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGRvdC4KICBwcmVEb3RTdGF0ZSA9PT0gMCB8fCAvLyBUaGUgKHJpZ2h0LW1vc3QpIHRyaW1tZWQgcGF0aCBjb21wb25lbnQgaXMgZXhhY3RseSBgLi5gLgogIHByZURvdFN0YXRlID09PSAxICYmIHN0YXJ0RG90ID09PSBlbmQzIC0gMSAmJiBzdGFydERvdCA9PT0gc3RhcnRQYXJ0ICsgMSkgewogICAgcmV0dXJuICIiOwogIH0KICByZXR1cm4gcGF0aDIuc2xpY2Uoc3RhcnREb3QsIGVuZDMpOwp9CmZ1bmN0aW9uIGpvaW4oLi4uc2VnbWVudHMpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IGpvaW5lZDsKICB3aGlsZSAoKytpbmRleDIgPCBzZWdtZW50cy5sZW5ndGgpIHsKICAgIGFzc2VydFBhdGgoc2VnbWVudHNbaW5kZXgyXSk7CiAgICBpZiAoc2VnbWVudHNbaW5kZXgyXSkgewogICAgICBqb2luZWQgPSBqb2luZWQgPT09IHZvaWQgMCA/IHNlZ21lbnRzW2luZGV4Ml0gOiBqb2luZWQgKyAiLyIgKyBzZWdtZW50c1tpbmRleDJdOwogICAgfQogIH0KICByZXR1cm4gam9pbmVkID09PSB2b2lkIDAgPyAiLiIgOiBub3JtYWxpemUyKGpvaW5lZCk7Cn0KZnVuY3Rpb24gbm9ybWFsaXplMihwYXRoMikgewogIGFzc2VydFBhdGgocGF0aDIpOwogIGNvbnN0IGFic29sdXRlID0gcGF0aDIuY29kZVBvaW50QXQoMCkgPT09IDQ3OwogIGxldCB2YWx1ZTIgPSBub3JtYWxpemVTdHJpbmcocGF0aDIsICFhYnNvbHV0ZSk7CiAgaWYgKHZhbHVlMi5sZW5ndGggPT09IDAgJiYgIWFic29sdXRlKSB7CiAgICB2YWx1ZTIgPSAiLiI7CiAgfQogIGlmICh2YWx1ZTIubGVuZ3RoID4gMCAmJiBwYXRoMi5jb2RlUG9pbnRBdChwYXRoMi5sZW5ndGggLSAxKSA9PT0gNDcpIHsKICAgIHZhbHVlMiArPSAiLyI7CiAgfQogIHJldHVybiBhYnNvbHV0ZSA/ICIvIiArIHZhbHVlMiA6IHZhbHVlMjsKfQpmdW5jdGlvbiBub3JtYWxpemVTdHJpbmcocGF0aDIsIGFsbG93QWJvdmVSb290KSB7CiAgbGV0IHJlc3VsdCA9ICIiOwogIGxldCBsYXN0U2VnbWVudExlbmd0aCA9IDA7CiAgbGV0IGxhc3RTbGFzaCA9IC0xOwogIGxldCBkb3RzID0gMDsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IGNvZGU0OwogIGxldCBsYXN0U2xhc2hJbmRleDsKICB3aGlsZSAoKytpbmRleDIgPD0gcGF0aDIubGVuZ3RoKSB7CiAgICBpZiAoaW5kZXgyIDwgcGF0aDIubGVuZ3RoKSB7CiAgICAgIGNvZGU0ID0gcGF0aDIuY29kZVBvaW50QXQoaW5kZXgyKTsKICAgIH0gZWxzZSBpZiAoY29kZTQgPT09IDQ3KSB7CiAgICAgIGJyZWFrOwogICAgfSBlbHNlIHsKICAgICAgY29kZTQgPSA0NzsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDcpIHsKICAgICAgaWYgKGxhc3RTbGFzaCA9PT0gaW5kZXgyIC0gMSB8fCBkb3RzID09PSAxKSB7CiAgICAgIH0gZWxzZSBpZiAobGFzdFNsYXNoICE9PSBpbmRleDIgLSAxICYmIGRvdHMgPT09IDIpIHsKICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA8IDIgfHwgbGFzdFNlZ21lbnRMZW5ndGggIT09IDIgfHwgcmVzdWx0LmNvZGVQb2ludEF0KHJlc3VsdC5sZW5ndGggLSAxKSAhPT0gNDYgfHwgcmVzdWx0LmNvZGVQb2ludEF0KHJlc3VsdC5sZW5ndGggLSAyKSAhPT0gNDYpIHsKICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMikgewogICAgICAgICAgICBsYXN0U2xhc2hJbmRleCA9IHJlc3VsdC5sYXN0SW5kZXhPZigiLyIpOwogICAgICAgICAgICBpZiAobGFzdFNsYXNoSW5kZXggIT09IHJlc3VsdC5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgaWYgKGxhc3RTbGFzaEluZGV4IDwgMCkgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gIiI7CiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDA7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBsYXN0U2xhc2hJbmRleCk7CiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IHJlc3VsdC5sZW5ndGggLSAxIC0gcmVzdWx0Lmxhc3RJbmRleE9mKCIvIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGxhc3RTbGFzaCA9IGluZGV4MjsKICAgICAgICAgICAgICBkb3RzID0gMDsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQubGVuZ3RoID4gMCkgewogICAgICAgICAgICByZXN1bHQgPSAiIjsKICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwOwogICAgICAgICAgICBsYXN0U2xhc2ggPSBpbmRleDI7CiAgICAgICAgICAgIGRvdHMgPSAwOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGFsbG93QWJvdmVSb290KSB7CiAgICAgICAgICByZXN1bHQgPSByZXN1bHQubGVuZ3RoID4gMCA/IHJlc3VsdCArICIvLi4iIDogIi4uIjsKICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMjsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICByZXN1bHQgKz0gIi8iICsgcGF0aDIuc2xpY2UobGFzdFNsYXNoICsgMSwgaW5kZXgyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0ID0gcGF0aDIuc2xpY2UobGFzdFNsYXNoICsgMSwgaW5kZXgyKTsKICAgICAgICB9CiAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSBpbmRleDIgLSBsYXN0U2xhc2ggLSAxOwogICAgICB9CiAgICAgIGxhc3RTbGFzaCA9IGluZGV4MjsKICAgICAgZG90cyA9IDA7CiAgICB9IGVsc2UgaWYgKGNvZGU0ID09PSA0NiAmJiBkb3RzID4gLTEpIHsKICAgICAgZG90cysrOwogICAgfSBlbHNlIHsKICAgICAgZG90cyA9IC0xOwogICAgfQogIH0KICByZXR1cm4gcmVzdWx0Owp9CmZ1bmN0aW9uIGFzc2VydFBhdGgocGF0aDIpIHsKICBpZiAodHlwZW9mIHBhdGgyICE9PSAic3RyaW5nIikgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgIlBhdGggbXVzdCBiZSBhIHN0cmluZy4gUmVjZWl2ZWQgIiArIEpTT04uc3RyaW5naWZ5KHBhdGgyKQogICAgKTsKICB9Cn0KdmFyIG1pbnBhdGg7CnZhciBpbml0X21pbnBhdGhfYnJvd3NlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3ZmaWxlQDYuMC4zL25vZGVfbW9kdWxlcy92ZmlsZS9saWIvbWlucGF0aC5icm93c2VyLmpzIigpIHsKICAgIG1pbnBhdGggPSB7IGJhc2VuYW1lLCBkaXJuYW1lLCBleHRuYW1lLCBqb2luLCBzZXA6ICIvIiB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdmZpbGVANi4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlL2xpYi9taW5wcm9jLmJyb3dzZXIuanMKZnVuY3Rpb24gY3dkKCkgewogIHJldHVybiAiLyI7Cn0KdmFyIG1pbnByb2M7CnZhciBpbml0X21pbnByb2NfYnJvd3NlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3ZmaWxlQDYuMC4zL25vZGVfbW9kdWxlcy92ZmlsZS9saWIvbWlucHJvYy5icm93c2VyLmpzIigpIHsKICAgIG1pbnByb2MgPSB7IGN3ZCB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdmZpbGVANi4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlL2xpYi9taW51cmwuc2hhcmVkLmpzCmZ1bmN0aW9uIGlzVXJsKGZpbGVVcmxPclBhdGgpIHsKICByZXR1cm4gQm9vbGVhbigKICAgIGZpbGVVcmxPclBhdGggIT09IG51bGwgJiYgdHlwZW9mIGZpbGVVcmxPclBhdGggPT09ICJvYmplY3QiICYmICJocmVmIiBpbiBmaWxlVXJsT3JQYXRoICYmIGZpbGVVcmxPclBhdGguaHJlZiAmJiAicHJvdG9jb2wiIGluIGZpbGVVcmxPclBhdGggJiYgZmlsZVVybE9yUGF0aC5wcm90b2NvbCAmJiAvLyBAdHMtZXhwZWN0LWVycm9yOiBpbmRleGluZyBpcyBmaW5lLgogICAgZmlsZVVybE9yUGF0aC5hdXRoID09PSB2b2lkIDAKICApOwp9CnZhciBpbml0X21pbnVybF9zaGFyZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS92ZmlsZUA2LjAuMy9ub2RlX21vZHVsZXMvdmZpbGUvbGliL21pbnVybC5zaGFyZWQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdmZpbGVANi4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlL2xpYi9taW51cmwuYnJvd3Nlci5qcwpmdW5jdGlvbiB1cmxUb1BhdGgocGF0aDIpIHsKICBpZiAodHlwZW9mIHBhdGgyID09PSAic3RyaW5nIikgewogICAgcGF0aDIgPSBuZXcgVVJMKHBhdGgyKTsKICB9IGVsc2UgaWYgKCFpc1VybChwYXRoMikpIHsKICAgIGNvbnN0IGVycm9yID0gbmV3IFR5cGVFcnJvcigKICAgICAgJ1RoZSAicGF0aCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZyBvciBhbiBpbnN0YW5jZSBvZiBVUkwuIFJlY2VpdmVkIGAnICsgcGF0aDIgKyAiYCIKICAgICk7CiAgICBlcnJvci5jb2RlID0gIkVSUl9JTlZBTElEX0FSR19UWVBFIjsKICAgIHRocm93IGVycm9yOwogIH0KICBpZiAocGF0aDIucHJvdG9jb2wgIT09ICJmaWxlOiIpIHsKICAgIGNvbnN0IGVycm9yID0gbmV3IFR5cGVFcnJvcigiVGhlIFVSTCBtdXN0IGJlIG9mIHNjaGVtZSBmaWxlIik7CiAgICBlcnJvci5jb2RlID0gIkVSUl9JTlZBTElEX1VSTF9TQ0hFTUUiOwogICAgdGhyb3cgZXJyb3I7CiAgfQogIHJldHVybiBnZXRQYXRoRnJvbVVSTFBvc2l4KHBhdGgyKTsKfQpmdW5jdGlvbiBnZXRQYXRoRnJvbVVSTFBvc2l4KHVybCkgewogIGlmICh1cmwuaG9zdG5hbWUgIT09ICIiKSB7CiAgICBjb25zdCBlcnJvciA9IG5ldyBUeXBlRXJyb3IoCiAgICAgICdGaWxlIFVSTCBob3N0IG11c3QgYmUgImxvY2FsaG9zdCIgb3IgZW1wdHkgb24gZGFyd2luJwogICAgKTsKICAgIGVycm9yLmNvZGUgPSAiRVJSX0lOVkFMSURfRklMRV9VUkxfSE9TVCI7CiAgICB0aHJvdyBlcnJvcjsKICB9CiAgY29uc3QgcGF0aG5hbWUgPSB1cmwucGF0aG5hbWU7CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHBhdGhuYW1lLmxlbmd0aCkgewogICAgaWYgKHBhdGhuYW1lLmNvZGVQb2ludEF0KGluZGV4MikgPT09IDM3ICYmIHBhdGhuYW1lLmNvZGVQb2ludEF0KGluZGV4MiArIDEpID09PSA1MCkgewogICAgICBjb25zdCB0aGlyZCA9IHBhdGhuYW1lLmNvZGVQb2ludEF0KGluZGV4MiArIDIpOwogICAgICBpZiAodGhpcmQgPT09IDcwIHx8IHRoaXJkID09PSAxMDIpIHsKICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBUeXBlRXJyb3IoCiAgICAgICAgICAiRmlsZSBVUkwgcGF0aCBtdXN0IG5vdCBpbmNsdWRlIGVuY29kZWQgLyBjaGFyYWN0ZXJzIgogICAgICAgICk7CiAgICAgICAgZXJyb3IuY29kZSA9ICJFUlJfSU5WQUxJRF9GSUxFX1VSTF9QQVRIIjsKICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHBhdGhuYW1lKTsKfQp2YXIgaW5pdF9taW51cmxfYnJvd3NlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3ZmaWxlQDYuMC4zL25vZGVfbW9kdWxlcy92ZmlsZS9saWIvbWludXJsLmJyb3dzZXIuanMiKCkgewogICAgaW5pdF9taW51cmxfc2hhcmVkKCk7CiAgICBpbml0X21pbnVybF9zaGFyZWQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3ZmaWxlQDYuMC4zL25vZGVfbW9kdWxlcy92ZmlsZS9saWIvaW5kZXguanMKZnVuY3Rpb24gYXNzZXJ0UGFydChwYXJ0LCBuYW1lKSB7CiAgaWYgKHBhcnQgJiYgcGFydC5pbmNsdWRlcyhtaW5wYXRoLnNlcCkpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgImAiICsgbmFtZSArICJgIGNhbm5vdCBiZSBhIHBhdGg6IGRpZCBub3QgZXhwZWN0IGAiICsgbWlucGF0aC5zZXAgKyAiYCIKICAgICk7CiAgfQp9CmZ1bmN0aW9uIGFzc2VydE5vbkVtcHR5KHBhcnQsIG5hbWUpIHsKICBpZiAoIXBhcnQpIHsKICAgIHRocm93IG5ldyBFcnJvcigiYCIgKyBuYW1lICsgImAgY2Fubm90IGJlIGVtcHR5Iik7CiAgfQp9CmZ1bmN0aW9uIGFzc2VydFBhdGgyKHBhdGgyLCBuYW1lKSB7CiAgaWYgKCFwYXRoMikgewogICAgdGhyb3cgbmV3IEVycm9yKCJTZXR0aW5nIGAiICsgbmFtZSArICJgIHJlcXVpcmVzIGBwYXRoYCB0byBiZSBzZXQgdG9vIik7CiAgfQp9CmZ1bmN0aW9uIGlzVWludDhBcnJheTModmFsdWUyKSB7CiAgcmV0dXJuIEJvb2xlYW4oCiAgICB2YWx1ZTIgJiYgdHlwZW9mIHZhbHVlMiA9PT0gIm9iamVjdCIgJiYgImJ5dGVMZW5ndGgiIGluIHZhbHVlMiAmJiAiYnl0ZU9mZnNldCIgaW4gdmFsdWUyCiAgKTsKfQp2YXIgb3JkZXIsIFZGaWxlOwp2YXIgaW5pdF9saWI0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdmZpbGVANi4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlL2xpYi9pbmRleC5qcyIoKSB7CiAgICBpbml0X3ZmaWxlX21lc3NhZ2UoKTsKICAgIGluaXRfbWlucGF0aF9icm93c2VyKCk7CiAgICBpbml0X21pbnByb2NfYnJvd3NlcigpOwogICAgaW5pdF9taW51cmxfYnJvd3NlcigpOwogICAgb3JkZXIgPSAvKiogQHR5cGUge2NvbnN0fSAqLwogICAgWwogICAgICAiaGlzdG9yeSIsCiAgICAgICJwYXRoIiwKICAgICAgImJhc2VuYW1lIiwKICAgICAgInN0ZW0iLAogICAgICAiZXh0bmFtZSIsCiAgICAgICJkaXJuYW1lIgogICAgXTsKICAgIFZGaWxlID0gY2xhc3MgewogICAgICAvKioKICAgICAgICogQ3JlYXRlIGEgbmV3IHZpcnR1YWwgZmlsZS4KICAgICAgICoKICAgICAgICogYG9wdGlvbnNgIGlzIHRyZWF0ZWQgYXM6CiAgICAgICAqCiAgICAgICAqICogICBgc3RyaW5nYCBvciBgVWludDhBcnJheWAg4oCUIGB7dmFsdWU6IG9wdGlvbnN9YAogICAgICAgKiAqICAgYFVSTGAg4oCUIGB7cGF0aDogb3B0aW9uc31gCiAgICAgICAqICogICBgVkZpbGVgIOKAlCBzaGFsbG93IGNvcGllcyBpdHMgZGF0YSBvdmVyIHRvIHRoZSBuZXcgZmlsZQogICAgICAgKiAqICAgYG9iamVjdGAg4oCUIGFsbCBmaWVsZHMgYXJlIHNoYWxsb3cgY29waWVkIG92ZXIgdG8gdGhlIG5ldyBmaWxlCiAgICAgICAqCiAgICAgICAqIFBhdGggcmVsYXRlZCBmaWVsZHMgYXJlIHNldCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIChsZWFzdCBzcGVjaWZpYyB0bwogICAgICAgKiBtb3N0IHNwZWNpZmljKTogYGhpc3RvcnlgLCBgcGF0aGAsIGBiYXNlbmFtZWAsIGBzdGVtYCwgYGV4dG5hbWVgLAogICAgICAgKiBgZGlybmFtZWAuCiAgICAgICAqCiAgICAgICAqIFlvdSBjYW5ub3Qgc2V0IGBkaXJuYW1lYCBvciBgZXh0bmFtZWAgd2l0aG91dCBzZXR0aW5nIGVpdGhlciBgaGlzdG9yeWAsCiAgICAgICAqIGBwYXRoYCwgYGJhc2VuYW1lYCwgb3IgYHN0ZW1gIHRvby4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtDb21wYXRpYmxlIHwgbnVsbCB8IHVuZGVmaW5lZH0gW3ZhbHVlXQogICAgICAgKiAgIEZpbGUgdmFsdWUuCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqICAgTmV3IGluc3RhbmNlLgogICAgICAgKi8KICAgICAgY29uc3RydWN0b3IodmFsdWUyKSB7CiAgICAgICAgbGV0IG9wdGlvbnM7CiAgICAgICAgaWYgKCF2YWx1ZTIpIHsKICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICB9IGVsc2UgaWYgKGlzVXJsKHZhbHVlMikpIHsKICAgICAgICAgIG9wdGlvbnMgPSB7IHBhdGg6IHZhbHVlMiB9OwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlMiA9PT0gInN0cmluZyIgfHwgaXNVaW50OEFycmF5Myh2YWx1ZTIpKSB7CiAgICAgICAgICBvcHRpb25zID0geyB2YWx1ZTogdmFsdWUyIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG9wdGlvbnMgPSB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgIHRoaXMuY3dkID0gImN3ZCIgaW4gb3B0aW9ucyA/ICIiIDogbWlucHJvYy5jd2QoKTsKICAgICAgICB0aGlzLmRhdGEgPSB7fTsKICAgICAgICB0aGlzLmhpc3RvcnkgPSBbXTsKICAgICAgICB0aGlzLm1lc3NhZ2VzID0gW107CiAgICAgICAgdGhpcy52YWx1ZTsKICAgICAgICB0aGlzLm1hcDsKICAgICAgICB0aGlzLnJlc3VsdDsKICAgICAgICB0aGlzLnN0b3JlZDsKICAgICAgICBsZXQgaW5kZXgyID0gLTE7CiAgICAgICAgd2hpbGUgKCsraW5kZXgyIDwgb3JkZXIubGVuZ3RoKSB7CiAgICAgICAgICBjb25zdCBmaWVsZDIgPSBvcmRlcltpbmRleDJdOwogICAgICAgICAgaWYgKGZpZWxkMiBpbiBvcHRpb25zICYmIG9wdGlvbnNbZmllbGQyXSAhPT0gdm9pZCAwICYmIG9wdGlvbnNbZmllbGQyXSAhPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzW2ZpZWxkMl0gPSBmaWVsZDIgPT09ICJoaXN0b3J5IiA/IFsuLi5vcHRpb25zW2ZpZWxkMl1dIDogb3B0aW9uc1tmaWVsZDJdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgZmllbGQ7CiAgICAgICAgZm9yIChmaWVsZCBpbiBvcHRpb25zKSB7CiAgICAgICAgICBpZiAoIW9yZGVyLmluY2x1ZGVzKGZpZWxkKSkgewogICAgICAgICAgICB0aGlzW2ZpZWxkXSA9IG9wdGlvbnNbZmllbGRdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogR2V0IHRoZSBiYXNlbmFtZSAoaW5jbHVkaW5nIGV4dG5hbWUpIChleGFtcGxlOiBgJ2luZGV4Lm1pbi5qcydgKS4KICAgICAgICoKICAgICAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0KICAgICAgICogICBCYXNlbmFtZS4KICAgICAgICovCiAgICAgIGdldCBiYXNlbmFtZSgpIHsKICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMucGF0aCA9PT0gInN0cmluZyIgPyBtaW5wYXRoLmJhc2VuYW1lKHRoaXMucGF0aCkgOiB2b2lkIDA7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNldCBiYXNlbmFtZSAoaW5jbHVkaW5nIGV4dG5hbWUpIChgJ2luZGV4Lm1pbi5qcydgKS4KICAgICAgICoKICAgICAgICogQ2Fubm90IGNvbnRhaW4gcGF0aCBzZXBhcmF0b3JzIChgJy8nYCBvbiB1bml4LCBtYWNPUywgYW5kIGJyb3dzZXJzLCBgJ1wnYAogICAgICAgKiBvbiB3aW5kb3dzKS4KICAgICAgICogQ2Fubm90IGJlIG51bGxpZmllZCAodXNlIGBmaWxlLnBhdGggPSBmaWxlLmRpcm5hbWVgIGluc3RlYWQpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZW5hbWUKICAgICAgICogICBCYXNlbmFtZS4KICAgICAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgICAgICogICBOb3RoaW5nLgogICAgICAgKi8KICAgICAgc2V0IGJhc2VuYW1lKGJhc2VuYW1lMikgewogICAgICAgIGFzc2VydE5vbkVtcHR5KGJhc2VuYW1lMiwgImJhc2VuYW1lIik7CiAgICAgICAgYXNzZXJ0UGFydChiYXNlbmFtZTIsICJiYXNlbmFtZSIpOwogICAgICAgIHRoaXMucGF0aCA9IG1pbnBhdGguam9pbih0aGlzLmRpcm5hbWUgfHwgIiIsIGJhc2VuYW1lMik7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEdldCB0aGUgcGFyZW50IHBhdGggKGV4YW1wbGU6IGAnfidgKS4KICAgICAgICoKICAgICAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0KICAgICAgICogICBEaXJuYW1lLgogICAgICAgKi8KICAgICAgZ2V0IGRpcm5hbWUoKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLnBhdGggPT09ICJzdHJpbmciID8gbWlucGF0aC5kaXJuYW1lKHRoaXMucGF0aCkgOiB2b2lkIDA7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNldCB0aGUgcGFyZW50IHBhdGggKGV4YW1wbGU6IGAnfidgKS4KICAgICAgICoKICAgICAgICogQ2Fubm90IGJlIHNldCBpZiB0aGVyZeKAmXMgbm8gYHBhdGhgIHlldC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGRpcm5hbWUKICAgICAgICogICBEaXJuYW1lLgogICAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAgICAgKiAgIE5vdGhpbmcuCiAgICAgICAqLwogICAgICBzZXQgZGlybmFtZShkaXJuYW1lMikgewogICAgICAgIGFzc2VydFBhdGgyKHRoaXMuYmFzZW5hbWUsICJkaXJuYW1lIik7CiAgICAgICAgdGhpcy5wYXRoID0gbWlucGF0aC5qb2luKGRpcm5hbWUyIHx8ICIiLCB0aGlzLmJhc2VuYW1lKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogR2V0IHRoZSBleHRuYW1lIChpbmNsdWRpbmcgZG90KSAoZXhhbXBsZTogYCcuanMnYCkuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9CiAgICAgICAqICAgRXh0bmFtZS4KICAgICAgICovCiAgICAgIGdldCBleHRuYW1lKCkgewogICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5wYXRoID09PSAic3RyaW5nIiA/IG1pbnBhdGguZXh0bmFtZSh0aGlzLnBhdGgpIDogdm9pZCAwOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBTZXQgdGhlIGV4dG5hbWUgKGluY2x1ZGluZyBkb3QpIChleGFtcGxlOiBgJy5qcydgKS4KICAgICAgICoKICAgICAgICogQ2Fubm90IGNvbnRhaW4gcGF0aCBzZXBhcmF0b3JzIChgJy8nYCBvbiB1bml4LCBtYWNPUywgYW5kIGJyb3dzZXJzLCBgJ1wnYAogICAgICAgKiBvbiB3aW5kb3dzKS4KICAgICAgICogQ2Fubm90IGJlIHNldCBpZiB0aGVyZeKAmXMgbm8gYHBhdGhgIHlldC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGV4dG5hbWUKICAgICAgICogICBFeHRuYW1lLgogICAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAgICAgKiAgIE5vdGhpbmcuCiAgICAgICAqLwogICAgICBzZXQgZXh0bmFtZShleHRuYW1lMikgewogICAgICAgIGFzc2VydFBhcnQoZXh0bmFtZTIsICJleHRuYW1lIik7CiAgICAgICAgYXNzZXJ0UGF0aDIodGhpcy5kaXJuYW1lLCAiZXh0bmFtZSIpOwogICAgICAgIGlmIChleHRuYW1lMikgewogICAgICAgICAgaWYgKGV4dG5hbWUyLmNvZGVQb2ludEF0KDApICE9PSA0NikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImBleHRuYW1lYCBtdXN0IHN0YXJ0IHdpdGggYC5gIik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZXh0bmFtZTIuaW5jbHVkZXMoIi4iLCAxKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImBleHRuYW1lYCBjYW5ub3QgY29udGFpbiBtdWx0aXBsZSBkb3RzIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMucGF0aCA9IG1pbnBhdGguam9pbih0aGlzLmRpcm5hbWUsIHRoaXMuc3RlbSArIChleHRuYW1lMiB8fCAiIikpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBHZXQgdGhlIGZ1bGwgcGF0aCAoZXhhbXBsZTogYCd+L2luZGV4Lm1pbi5qcydgKS4KICAgICAgICoKICAgICAgICogQHJldHVybnMge3N0cmluZ30KICAgICAgICogICBQYXRoLgogICAgICAgKi8KICAgICAgZ2V0IHBhdGgoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaGlzdG9yeVt0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMV07CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNldCB0aGUgZnVsbCBwYXRoIChleGFtcGxlOiBgJ34vaW5kZXgubWluLmpzJ2ApLgogICAgICAgKgogICAgICAgKiBDYW5ub3QgYmUgbnVsbGlmaWVkLgogICAgICAgKiBZb3UgY2FuIHNldCBhIGZpbGUgVVJMIChhIGBVUkxgIG9iamVjdCB3aXRoIGEgYGZpbGU6YCBwcm90b2NvbCkgd2hpY2ggd2lsbAogICAgICAgKiBiZSB0dXJuZWQgaW50byBhIHBhdGggd2l0aCBgdXJsLmZpbGVVUkxUb1BhdGhgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge1VSTCB8IHN0cmluZ30gcGF0aAogICAgICAgKiAgIFBhdGguCiAgICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CiAgICAgICAqICAgTm90aGluZy4KICAgICAgICovCiAgICAgIHNldCBwYXRoKHBhdGgyKSB7CiAgICAgICAgaWYgKGlzVXJsKHBhdGgyKSkgewogICAgICAgICAgcGF0aDIgPSB1cmxUb1BhdGgocGF0aDIpOwogICAgICAgIH0KICAgICAgICBhc3NlcnROb25FbXB0eShwYXRoMiwgInBhdGgiKTsKICAgICAgICBpZiAodGhpcy5wYXRoICE9PSBwYXRoMikgewogICAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2gocGF0aDIpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogR2V0IHRoZSBzdGVtIChiYXNlbmFtZSB3L28gZXh0bmFtZSkgKGV4YW1wbGU6IGAnaW5kZXgubWluJ2ApLgogICAgICAgKgogICAgICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfQogICAgICAgKiAgIFN0ZW0uCiAgICAgICAqLwogICAgICBnZXQgc3RlbSgpIHsKICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMucGF0aCA9PT0gInN0cmluZyIgPyBtaW5wYXRoLmJhc2VuYW1lKHRoaXMucGF0aCwgdGhpcy5leHRuYW1lKSA6IHZvaWQgMDsKICAgICAgfQogICAgICAvKioKICAgICAgICogU2V0IHRoZSBzdGVtIChiYXNlbmFtZSB3L28gZXh0bmFtZSkgKGV4YW1wbGU6IGAnaW5kZXgubWluJ2ApLgogICAgICAgKgogICAgICAgKiBDYW5ub3QgY29udGFpbiBwYXRoIHNlcGFyYXRvcnMgKGAnLydgIG9uIHVuaXgsIG1hY09TLCBhbmQgYnJvd3NlcnMsIGAnXCdgCiAgICAgICAqIG9uIHdpbmRvd3MpLgogICAgICAgKiBDYW5ub3QgYmUgbnVsbGlmaWVkICh1c2UgYGZpbGUucGF0aCA9IGZpbGUuZGlybmFtZWAgaW5zdGVhZCkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdGVtCiAgICAgICAqICAgU3RlbS4KICAgICAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgICAgICogICBOb3RoaW5nLgogICAgICAgKi8KICAgICAgc2V0IHN0ZW0oc3RlbSkgewogICAgICAgIGFzc2VydE5vbkVtcHR5KHN0ZW0sICJzdGVtIik7CiAgICAgICAgYXNzZXJ0UGFydChzdGVtLCAic3RlbSIpOwogICAgICAgIHRoaXMucGF0aCA9IG1pbnBhdGguam9pbih0aGlzLmRpcm5hbWUgfHwgIiIsIHN0ZW0gKyAodGhpcy5leHRuYW1lIHx8ICIiKSk7CiAgICAgIH0KICAgICAgLy8gTm9ybWFsIHByb3RvdHlwYWwgbWV0aG9kcy4KICAgICAgLyoqCiAgICAgICAqIENyZWF0ZSBhIGZhdGFsIG1lc3NhZ2UgZm9yIGByZWFzb25gIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZS4KICAgICAgICoKICAgICAgICogVGhlIGBmYXRhbGAgZmllbGQgb2YgdGhlIG1lc3NhZ2UgaXMgc2V0IHRvIGB0cnVlYCAoZXJyb3I7IGZpbGUgbm90IHVzYWJsZSkKICAgICAgICogYW5kIHRoZSBgZmlsZWAgZmllbGQgaXMgc2V0IHRvIHRoZSBjdXJyZW50IGZpbGUgcGF0aC4KICAgICAgICogVGhlIG1lc3NhZ2UgaXMgYWRkZWQgdG8gdGhlIGBtZXNzYWdlc2AgZmllbGQgb24gYGZpbGVgLgogICAgICAgKgogICAgICAgKiA+IPCfqqYgKipOb3RlKio6IGFsc28gaGFzIG9ic29sZXRlIHNpZ25hdHVyZXMuCiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICAgICAqIEBwYXJhbSB7TWVzc2FnZU9wdGlvbnMgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0aW9uc10KICAgICAgICogQHJldHVybnMge25ldmVyfQogICAgICAgKgogICAgICAgKiBAb3ZlcmxvYWQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAgICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IHBhcmVudAogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zIHtuZXZlcn0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgICAgICogQHBhcmFtIHtQb2ludCB8IFBvc2l0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZH0gcGxhY2UKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAgICAgKiBAcmV0dXJucyB7bmV2ZXJ9CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogQHJldHVybnMge25ldmVyfQogICAgICAgKgogICAgICAgKiBAb3ZlcmxvYWQKICAgICAgICogQHBhcmFtIHtFcnJvciB8IFZGaWxlTWVzc2FnZX0gY2F1c2UKICAgICAgICogQHBhcmFtIHtOb2RlIHwgTm9kZUxpa2UgfCBudWxsIHwgdW5kZWZpbmVkfSBwYXJlbnQKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAgICAgKiBAcmV0dXJucyB7bmV2ZXJ9CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAgICAgKiBAcGFyYW0ge1BvaW50IHwgUG9zaXRpb24gfCBudWxsIHwgdW5kZWZpbmVkfSBwbGFjZQogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zIHtuZXZlcn0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7RXJyb3IgfCBWRmlsZU1lc3NhZ2V9IGNhdXNlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogQHJldHVybnMge25ldmVyfQogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlIHwgc3RyaW5nfSBjYXVzZU9yUmVhc29uCiAgICAgICAqICAgUmVhc29uIGZvciBtZXNzYWdlLCBzaG91bGQgdXNlIG1hcmtkb3duLgogICAgICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IE1lc3NhZ2VPcHRpb25zIHwgUG9pbnQgfCBQb3NpdGlvbiB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcHRpb25zT3JQYXJlbnRPclBsYWNlXQogICAgICAgKiAgIENvbmZpZ3VyYXRpb24gKG9wdGlvbmFsKS4KICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAgICAgKiAgIFBsYWNlIGluIGNvZGUgd2hlcmUgdGhlIG1lc3NhZ2Ugb3JpZ2luYXRlcyAoZXhhbXBsZToKICAgICAgICogICBgJ215LXBhY2thZ2U6bXktcnVsZSdgIG9yIGAnbXktcnVsZSdgKS4KICAgICAgICogQHJldHVybnMge25ldmVyfQogICAgICAgKiAgIE5ldmVyLgogICAgICAgKiBAdGhyb3dzIHtWRmlsZU1lc3NhZ2V9CiAgICAgICAqICAgTWVzc2FnZS4KICAgICAgICovCiAgICAgIGZhaWwoY2F1c2VPclJlYXNvbiwgb3B0aW9uc09yUGFyZW50T3JQbGFjZSwgb3JpZ2luKSB7CiAgICAgICAgY29uc3QgbWVzc2FnZTIgPSB0aGlzLm1lc3NhZ2UoY2F1c2VPclJlYXNvbiwgb3B0aW9uc09yUGFyZW50T3JQbGFjZSwgb3JpZ2luKTsKICAgICAgICBtZXNzYWdlMi5mYXRhbCA9IHRydWU7CiAgICAgICAgdGhyb3cgbWVzc2FnZTI7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENyZWF0ZSBhbiBpbmZvIG1lc3NhZ2UgZm9yIGByZWFzb25gIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZS4KICAgICAgICoKICAgICAgICogVGhlIGBmYXRhbGAgZmllbGQgb2YgdGhlIG1lc3NhZ2UgaXMgc2V0IHRvIGB1bmRlZmluZWRgIChpbmZvOyBjaGFuZ2UKICAgICAgICogbGlrZWx5IG5vdCBuZWVkZWQpIGFuZCB0aGUgYGZpbGVgIGZpZWxkIGlzIHNldCB0byB0aGUgY3VycmVudCBmaWxlIHBhdGguCiAgICAgICAqIFRoZSBtZXNzYWdlIGlzIGFkZGVkIHRvIHRoZSBgbWVzc2FnZXNgIGZpZWxkIG9uIGBmaWxlYC4KICAgICAgICoKICAgICAgICogPiDwn6qmICoqTm90ZSoqOiBhbHNvIGhhcyBvYnNvbGV0ZSBzaWduYXR1cmVzLgogICAgICAgKgogICAgICAgKiBAb3ZlcmxvYWQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAgICAgKiBAcGFyYW0ge01lc3NhZ2VPcHRpb25zIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29wdGlvbnNdCiAgICAgICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICAgICAqIEBwYXJhbSB7Tm9kZSB8IE5vZGVMaWtlIHwgbnVsbCB8IHVuZGVmaW5lZH0gcGFyZW50CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgICAgICogQHBhcmFtIHtQb2ludCB8IFBvc2l0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZH0gcGxhY2UKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAgICAgKiBAcmV0dXJucyB7VkZpbGVNZXNzYWdlfQogICAgICAgKgogICAgICAgKiBAb3ZlcmxvYWQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAgICAgKiBAcGFyYW0ge05vZGUgfCBOb2RlTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IHBhcmVudAogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAgICAgKiBAcGFyYW0ge1BvaW50IHwgUG9zaXRpb24gfCBudWxsIHwgdW5kZWZpbmVkfSBwbGFjZQogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge0Vycm9yIHwgVkZpbGVNZXNzYWdlfSBjYXVzZQogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7RXJyb3IgfCBWRmlsZU1lc3NhZ2UgfCBzdHJpbmd9IGNhdXNlT3JSZWFzb24KICAgICAgICogICBSZWFzb24gZm9yIG1lc3NhZ2UsIHNob3VsZCB1c2UgbWFya2Rvd24uCiAgICAgICAqIEBwYXJhbSB7Tm9kZSB8IE5vZGVMaWtlIHwgTWVzc2FnZU9wdGlvbnMgfCBQb2ludCB8IFBvc2l0aW9uIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29wdGlvbnNPclBhcmVudE9yUGxhY2VdCiAgICAgICAqICAgQ29uZmlndXJhdGlvbiAob3B0aW9uYWwpLgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqICAgUGxhY2UgaW4gY29kZSB3aGVyZSB0aGUgbWVzc2FnZSBvcmlnaW5hdGVzIChleGFtcGxlOgogICAgICAgKiAgIGAnbXktcGFja2FnZTpteS1ydWxlJ2Agb3IgYCdteS1ydWxlJ2ApLgogICAgICAgKiBAcmV0dXJucyB7VkZpbGVNZXNzYWdlfQogICAgICAgKiAgIE1lc3NhZ2UuCiAgICAgICAqLwogICAgICBpbmZvKGNhdXNlT3JSZWFzb24sIG9wdGlvbnNPclBhcmVudE9yUGxhY2UsIG9yaWdpbikgewogICAgICAgIGNvbnN0IG1lc3NhZ2UyID0gdGhpcy5tZXNzYWdlKGNhdXNlT3JSZWFzb24sIG9wdGlvbnNPclBhcmVudE9yUGxhY2UsIG9yaWdpbik7CiAgICAgICAgbWVzc2FnZTIuZmF0YWwgPSB2b2lkIDA7CiAgICAgICAgcmV0dXJuIG1lc3NhZ2UyOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDcmVhdGUgYSBtZXNzYWdlIGZvciBgcmVhc29uYCBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUuCiAgICAgICAqCiAgICAgICAqIFRoZSBgZmF0YWxgIGZpZWxkIG9mIHRoZSBtZXNzYWdlIGlzIHNldCB0byBgZmFsc2VgICh3YXJuaW5nOyBjaGFuZ2UgbWF5IGJlCiAgICAgICAqIG5lZWRlZCkgYW5kIHRoZSBgZmlsZWAgZmllbGQgaXMgc2V0IHRvIHRoZSBjdXJyZW50IGZpbGUgcGF0aC4KICAgICAgICogVGhlIG1lc3NhZ2UgaXMgYWRkZWQgdG8gdGhlIGBtZXNzYWdlc2AgZmllbGQgb24gYGZpbGVgLgogICAgICAgKgogICAgICAgKiA+IPCfqqYgKipOb3RlKio6IGFsc28gaGFzIG9ic29sZXRlIHNpZ25hdHVyZXMuCiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICAgICAqIEBwYXJhbSB7TWVzc2FnZU9wdGlvbnMgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0aW9uc10KICAgICAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24KICAgICAgICogQHBhcmFtIHtOb2RlIHwgTm9kZUxpa2UgfCBudWxsIHwgdW5kZWZpbmVkfSBwYXJlbnQKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3JpZ2luXQogICAgICAgKiBAcmV0dXJucyB7VkZpbGVNZXNzYWdlfQogICAgICAgKgogICAgICAgKiBAb3ZlcmxvYWQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogICAgICAgKiBAcGFyYW0ge1BvaW50IHwgUG9zaXRpb24gfCBudWxsIHwgdW5kZWZpbmVkfSBwbGFjZQogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcmlnaW5dCiAgICAgICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7RXJyb3IgfCBWRmlsZU1lc3NhZ2V9IGNhdXNlCiAgICAgICAqIEBwYXJhbSB7Tm9kZSB8IE5vZGVMaWtlIHwgbnVsbCB8IHVuZGVmaW5lZH0gcGFyZW50CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7RXJyb3IgfCBWRmlsZU1lc3NhZ2V9IGNhdXNlCiAgICAgICAqIEBwYXJhbSB7UG9pbnQgfCBQb3NpdGlvbiB8IG51bGwgfCB1bmRlZmluZWR9IHBsYWNlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7RXJyb3IgfCBWRmlsZU1lc3NhZ2V9IGNhdXNlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogQHJldHVybnMge1ZGaWxlTWVzc2FnZX0KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFcnJvciB8IFZGaWxlTWVzc2FnZSB8IHN0cmluZ30gY2F1c2VPclJlYXNvbgogICAgICAgKiAgIFJlYXNvbiBmb3IgbWVzc2FnZSwgc2hvdWxkIHVzZSBtYXJrZG93bi4KICAgICAgICogQHBhcmFtIHtOb2RlIHwgTm9kZUxpa2UgfCBNZXNzYWdlT3B0aW9ucyB8IFBvaW50IHwgUG9zaXRpb24gfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0aW9uc09yUGFyZW50T3JQbGFjZV0KICAgICAgICogICBDb25maWd1cmF0aW9uIChvcHRpb25hbCkuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29yaWdpbl0KICAgICAgICogICBQbGFjZSBpbiBjb2RlIHdoZXJlIHRoZSBtZXNzYWdlIG9yaWdpbmF0ZXMgKGV4YW1wbGU6CiAgICAgICAqICAgYCdteS1wYWNrYWdlOm15LXJ1bGUnYCBvciBgJ215LXJ1bGUnYCkuCiAgICAgICAqIEByZXR1cm5zIHtWRmlsZU1lc3NhZ2V9CiAgICAgICAqICAgTWVzc2FnZS4KICAgICAgICovCiAgICAgIG1lc3NhZ2UoY2F1c2VPclJlYXNvbiwgb3B0aW9uc09yUGFyZW50T3JQbGFjZSwgb3JpZ2luKSB7CiAgICAgICAgY29uc3QgbWVzc2FnZTIgPSBuZXcgVkZpbGVNZXNzYWdlKAogICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogdGhlIG92ZXJsb2FkcyBhcmUgZmluZS4KICAgICAgICAgIGNhdXNlT3JSZWFzb24sCiAgICAgICAgICBvcHRpb25zT3JQYXJlbnRPclBsYWNlLAogICAgICAgICAgb3JpZ2luCiAgICAgICAgKTsKICAgICAgICBpZiAodGhpcy5wYXRoKSB7CiAgICAgICAgICBtZXNzYWdlMi5uYW1lID0gdGhpcy5wYXRoICsgIjoiICsgbWVzc2FnZTIubmFtZTsKICAgICAgICAgIG1lc3NhZ2UyLmZpbGUgPSB0aGlzLnBhdGg7CiAgICAgICAgfQogICAgICAgIG1lc3NhZ2UyLmZhdGFsID0gZmFsc2U7CiAgICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKG1lc3NhZ2UyKTsKICAgICAgICByZXR1cm4gbWVzc2FnZTI7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNlcmlhbGl6ZSB0aGUgZmlsZS4KICAgICAgICoKICAgICAgICogPiAqKk5vdGUqKjogd2hpY2ggZW5jb2RpbmdzIGFyZSBzdXBwb3J0ZWQgZGVwZW5kcyBvbiB0aGUgZW5naW5lLgogICAgICAgKiA+IEZvciBpbmZvIG9uIE5vZGUuanMsIHNlZToKICAgICAgICogPiA8aHR0cHM6Ly9ub2RlanMub3JnL2FwaS91dGlsLmh0bWwjd2hhdHdnLXN1cHBvcnRlZC1lbmNvZGluZ3M+LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtlbmNvZGluZz0ndXRmOCddCiAgICAgICAqICAgQ2hhcmFjdGVyIGVuY29kaW5nIHRvIHVuZGVyc3RhbmQgYHZhbHVlYCBhcyB3aGVuIGl04oCZcyBhIGBVaW50OEFycmF5YAogICAgICAgKiAgIChkZWZhdWx0OiBgJ3V0Zi04J2ApLgogICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfQogICAgICAgKiAgIFNlcmlhbGl6ZWQgZmlsZS4KICAgICAgICovCiAgICAgIHRvU3RyaW5nKGVuY29kaW5nKSB7CiAgICAgICAgaWYgKHRoaXMudmFsdWUgPT09IHZvaWQgMCkgewogICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIHRoaXMudmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZGVjb2RlcjIgPSBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmcgfHwgdm9pZCAwKTsKICAgICAgICByZXR1cm4gZGVjb2RlcjIuZGVjb2RlKHRoaXMudmFsdWUpOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdmZpbGVANi4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlL2luZGV4LmpzCnZhciBpbml0X3ZmaWxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdmZpbGVANi4wLjMvbm9kZV9tb2R1bGVzL3ZmaWxlL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliNCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdW5pZmllZEAxMS4wLjUvbm9kZV9tb2R1bGVzL3VuaWZpZWQvbGliL2NhbGxhYmxlLWluc3RhbmNlLmpzCnZhciBDYWxsYWJsZUluc3RhbmNlOwp2YXIgaW5pdF9jYWxsYWJsZV9pbnN0YW5jZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3VuaWZpZWRAMTEuMC41L25vZGVfbW9kdWxlcy91bmlmaWVkL2xpYi9jYWxsYWJsZS1pbnN0YW5jZS5qcyIoKSB7CiAgICBDYWxsYWJsZUluc3RhbmNlID0gLyoqCiAgICAgKiBAdHlwZSB7bmV3IDxQYXJhbWV0ZXJzIGV4dGVuZHMgQXJyYXk8dW5rbm93bj4sIFJlc3VsdD4ocHJvcGVydHk6IHN0cmluZyB8IHN5bWJvbCkgPT4gKC4uLnBhcmFtZXRlcnM6IFBhcmFtZXRlcnMpID0+IFJlc3VsdH0KICAgICAqLwogICAgLyoqIEB0eXBlIHt1bmtub3dufSAqLwogICAgLyoqCiAgICAgKiBAdGhpcyB7RnVuY3Rpb259CiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IHN5bWJvbH0gcHJvcGVydHkKICAgICAqIEByZXR1cm5zIHsoLi4ucGFyYW1ldGVyczogQXJyYXk8dW5rbm93bj4pID0+IHVua25vd259CiAgICAgKi8KICAgIChmdW5jdGlvbihwcm9wZXJ0eTkpIHsKICAgICAgY29uc3Qgc2VsZjIgPSB0aGlzOwogICAgICBjb25zdCBjb25zdHIgPSBzZWxmMi5jb25zdHJ1Y3RvcjsKICAgICAgY29uc3QgcHJvdG8gPSAoCiAgICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBGdW5jdGlvbj59ICovCiAgICAgICAgLy8gUHJvdG90eXBlcyBkbyBleGlzdC4KICAgICAgICAvLyB0eXBlLWNvdmVyYWdlOmlnbm9yZS1uZXh0LWxpbmUKICAgICAgICBjb25zdHIucHJvdG90eXBlCiAgICAgICk7CiAgICAgIGNvbnN0IHZhbHVlMiA9IHByb3RvW3Byb3BlcnR5OV07CiAgICAgIGNvbnN0IGFwcGx5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlMi5hcHBseShhcHBseSwgYXJndW1lbnRzKTsKICAgICAgfTsKICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGFwcGx5LCBwcm90byk7CiAgICAgIHJldHVybiBhcHBseTsKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdW5pZmllZEAxMS4wLjUvbm9kZV9tb2R1bGVzL3VuaWZpZWQvbGliL2luZGV4LmpzCmZ1bmN0aW9uIGFzc2VydFBhcnNlcihuYW1lLCB2YWx1ZTIpIHsKICBpZiAodHlwZW9mIHZhbHVlMiAhPT0gImZ1bmN0aW9uIikgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGAiICsgbmFtZSArICJgIHdpdGhvdXQgYHBhcnNlcmAiKTsKICB9Cn0KZnVuY3Rpb24gYXNzZXJ0Q29tcGlsZXIobmFtZSwgdmFsdWUyKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZTIgIT09ICJmdW5jdGlvbiIpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBgIiArIG5hbWUgKyAiYCB3aXRob3V0IGBjb21waWxlcmAiKTsKICB9Cn0KZnVuY3Rpb24gYXNzZXJ0VW5mcm96ZW4obmFtZSwgZnJvemVuKSB7CiAgaWYgKGZyb3plbikgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAiQ2Fubm90IGNhbGwgYCIgKyBuYW1lICsgImAgb24gYSBmcm96ZW4gcHJvY2Vzc29yLlxuQ3JlYXRlIGEgbmV3IHByb2Nlc3NvciBmaXJzdCwgYnkgY2FsbGluZyBpdDogdXNlIGBwcm9jZXNzb3IoKWAgaW5zdGVhZCBvZiBgcHJvY2Vzc29yYC4iCiAgICApOwogIH0KfQpmdW5jdGlvbiBhc3NlcnROb2RlKG5vZGUyKSB7CiAgaWYgKCFpc1BsYWluT2JqZWN0KG5vZGUyKSB8fCB0eXBlb2Ygbm9kZTIudHlwZSAhPT0gInN0cmluZyIpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIG5vZGUsIGdvdCBgIiArIG5vZGUyICsgImAiKTsKICB9Cn0KZnVuY3Rpb24gYXNzZXJ0RG9uZShuYW1lLCBhc3luY05hbWUsIGNvbXBsZXRlKSB7CiAgaWYgKCFjb21wbGV0ZSkgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAiYCIgKyBuYW1lICsgImAgZmluaXNoZWQgYXN5bmMuIFVzZSBgIiArIGFzeW5jTmFtZSArICJgIGluc3RlYWQiCiAgICApOwogIH0KfQpmdW5jdGlvbiB2ZmlsZSh2YWx1ZTIpIHsKICByZXR1cm4gbG9va3NMaWtlQVZGaWxlKHZhbHVlMikgPyB2YWx1ZTIgOiBuZXcgVkZpbGUodmFsdWUyKTsKfQpmdW5jdGlvbiBsb29rc0xpa2VBVkZpbGUodmFsdWUyKSB7CiAgcmV0dXJuIEJvb2xlYW4oCiAgICB2YWx1ZTIgJiYgdHlwZW9mIHZhbHVlMiA9PT0gIm9iamVjdCIgJiYgIm1lc3NhZ2UiIGluIHZhbHVlMiAmJiAibWVzc2FnZXMiIGluIHZhbHVlMgogICk7Cn0KZnVuY3Rpb24gbG9va3NMaWtlQVZhbHVlKHZhbHVlMikgewogIHJldHVybiB0eXBlb2YgdmFsdWUyID09PSAic3RyaW5nIiB8fCBpc1VpbnQ4QXJyYXk0KHZhbHVlMik7Cn0KZnVuY3Rpb24gaXNVaW50OEFycmF5NCh2YWx1ZTIpIHsKICByZXR1cm4gQm9vbGVhbigKICAgIHZhbHVlMiAmJiB0eXBlb2YgdmFsdWUyID09PSAib2JqZWN0IiAmJiAiYnl0ZUxlbmd0aCIgaW4gdmFsdWUyICYmICJieXRlT2Zmc2V0IiBpbiB2YWx1ZTIKICApOwp9CnZhciBpbXBvcnRfZXh0ZW5kLCBvd24sIFByb2Nlc3NvciwgdW5pZmllZDsKdmFyIGluaXRfbGliNSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3VuaWZpZWRAMTEuMC41L25vZGVfbW9kdWxlcy91bmlmaWVkL2xpYi9pbmRleC5qcyIoKSB7CiAgICBpbml0X2JhaWwoKTsKICAgIGltcG9ydF9leHRlbmQgPSBfX3RvRVNNKHJlcXVpcmVfZXh0ZW5kKCksIDEpOwogICAgaW5pdF9kZWZhdWx0KCk7CiAgICBpbml0X2lzX3BsYWluX29iaigpOwogICAgaW5pdF90cm91Z2goKTsKICAgIGluaXRfdmZpbGUoKTsKICAgIGluaXRfY2FsbGFibGVfaW5zdGFuY2UoKTsKICAgIG93biA9IHt9Lmhhc093blByb3BlcnR5OwogICAgUHJvY2Vzc29yID0gY2xhc3MgX1Byb2Nlc3NvciBleHRlbmRzIENhbGxhYmxlSW5zdGFuY2UgewogICAgICAvKioKICAgICAgICogQ3JlYXRlIGEgcHJvY2Vzc29yLgogICAgICAgKi8KICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoImNvcHkiKTsKICAgICAgICB0aGlzLkNvbXBpbGVyID0gdm9pZCAwOwogICAgICAgIHRoaXMuUGFyc2VyID0gdm9pZCAwOwogICAgICAgIHRoaXMuYXR0YWNoZXJzID0gW107CiAgICAgICAgdGhpcy5jb21waWxlciA9IHZvaWQgMDsKICAgICAgICB0aGlzLmZyZWV6ZUluZGV4ID0gLTE7CiAgICAgICAgdGhpcy5mcm96ZW4gPSB2b2lkIDA7CiAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSB7fTsKICAgICAgICB0aGlzLnBhcnNlciA9IHZvaWQgMDsKICAgICAgICB0aGlzLnRyYW5zZm9ybWVycyA9IHRyb3VnaCgpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDb3B5IGEgcHJvY2Vzc29yLgogICAgICAgKgogICAgICAgKiBAZGVwcmVjYXRlZAogICAgICAgKiAgIFRoaXMgaXMgYSBwcml2YXRlIGludGVybmFsIG1ldGhvZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLgogICAgICAgKiBAcmV0dXJucyB7UHJvY2Vzc29yPFBhcnNlVHJlZSwgSGVhZFRyZWUsIFRhaWxUcmVlLCBDb21waWxlVHJlZSwgQ29tcGlsZVJlc3VsdD59CiAgICAgICAqICAgTmV3ICp1bmZyb3plbiogcHJvY2Vzc29yICh7QGxpbmtjb2RlIFByb2Nlc3Nvcn0pIHRoYXQgaXMKICAgICAgICogICBjb25maWd1cmVkIHRvIHdvcmsgdGhlIHNhbWUgYXMgaXRzIGFuY2VzdG9yLgogICAgICAgKiAgIFdoZW4gdGhlIGRlc2NlbmRhbnQgcHJvY2Vzc29yIGlzIGNvbmZpZ3VyZWQgaW4gdGhlIGZ1dHVyZSBpdCBkb2VzIG5vdAogICAgICAgKiAgIGFmZmVjdCB0aGUgYW5jZXN0cmFsIHByb2Nlc3Nvci4KICAgICAgICovCiAgICAgIGNvcHkoKSB7CiAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSAoCiAgICAgICAgICAvKiogQHR5cGUge1Byb2Nlc3NvcjxQYXJzZVRyZWUsIEhlYWRUcmVlLCBUYWlsVHJlZSwgQ29tcGlsZVRyZWUsIENvbXBpbGVSZXN1bHQ+fSAqLwogICAgICAgICAgbmV3IF9Qcm9jZXNzb3IoKQogICAgICAgICk7CiAgICAgICAgbGV0IGluZGV4MiA9IC0xOwogICAgICAgIHdoaWxlICgrK2luZGV4MiA8IHRoaXMuYXR0YWNoZXJzLmxlbmd0aCkgewogICAgICAgICAgY29uc3QgYXR0YWNoZXIgPSB0aGlzLmF0dGFjaGVyc1tpbmRleDJdOwogICAgICAgICAgZGVzdGluYXRpb24udXNlKC4uLmF0dGFjaGVyKTsKICAgICAgICB9CiAgICAgICAgZGVzdGluYXRpb24uZGF0YSgoMCwgaW1wb3J0X2V4dGVuZC5kZWZhdWx0KSh0cnVlLCB7fSwgdGhpcy5uYW1lc3BhY2UpKTsKICAgICAgICByZXR1cm4gZGVzdGluYXRpb247CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENvbmZpZ3VyZSB0aGUgcHJvY2Vzc29yIHdpdGggaW5mbyBhdmFpbGFibGUgdG8gYWxsIHBsdWdpbnMuCiAgICAgICAqIEluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBhbiBvYmplY3QuCiAgICAgICAqCiAgICAgICAqIFR5cGljYWxseSwgb3B0aW9ucyBjYW4gYmUgZ2l2ZW4gdG8gYSBzcGVjaWZpYyBwbHVnaW4sIGJ1dCBzb21ldGltZXMgaXQKICAgICAgICogbWFrZXMgc2Vuc2UgdG8gaGF2ZSBpbmZvcm1hdGlvbiBzaGFyZWQgd2l0aCBzZXZlcmFsIHBsdWdpbnMuCiAgICAgICAqIEZvciBleGFtcGxlLCBhIGxpc3Qgb2YgSFRNTCBlbGVtZW50cyB0aGF0IGFyZSBzZWxmLWNsb3NpbmcsIHdoaWNoIGlzCiAgICAgICAqIG5lZWRlZCBkdXJpbmcgYWxsIHBoYXNlcy4KICAgICAgICoKICAgICAgICogPiAqKk5vdGUqKjogc2V0dGluZyBpbmZvcm1hdGlvbiBjYW5ub3Qgb2NjdXIgb24gKmZyb3plbiogcHJvY2Vzc29ycy4KICAgICAgICogPiBDYWxsIHRoZSBwcm9jZXNzb3IgZmlyc3QgdG8gY3JlYXRlIGEgbmV3IHVuZnJvemVuIHByb2Nlc3Nvci4KICAgICAgICoKICAgICAgICogPiAqKk5vdGUqKjogdG8gcmVnaXN0ZXIgY3VzdG9tIGRhdGEgaW4gVHlwZVNjcmlwdCwgYXVnbWVudCB0aGUKICAgICAgICogPiB7QGxpbmtjb2RlIERhdGF9IGludGVyZmFjZS4KICAgICAgICoKICAgICAgICogQGV4YW1wbGUKICAgICAgICogICBUaGlzIGV4YW1wbGUgc2hvdyBob3cgdG8gZ2V0IGFuZCBzZXQgaW5mbzoKICAgICAgICoKICAgICAgICogICBgYGBqcwogICAgICAgKiAgIGltcG9ydCB7dW5pZmllZH0gZnJvbSAndW5pZmllZCcKICAgICAgICoKICAgICAgICogICBjb25zdCBwcm9jZXNzb3IgPSB1bmlmaWVkKCkuZGF0YSgnYWxwaGEnLCAnYnJhdm8nKQogICAgICAgKgogICAgICAgKiAgIHByb2Nlc3Nvci5kYXRhKCdhbHBoYScpIC8vID0+ICdicmF2bycKICAgICAgICoKICAgICAgICogICBwcm9jZXNzb3IuZGF0YSgpIC8vID0+IHthbHBoYTogJ2JyYXZvJ30KICAgICAgICoKICAgICAgICogICBwcm9jZXNzb3IuZGF0YSh7Y2hhcmxpZTogJ2RlbHRhJ30pCiAgICAgICAqCiAgICAgICAqICAgcHJvY2Vzc29yLmRhdGEoKSAvLyA9PiB7Y2hhcmxpZTogJ2RlbHRhJ30KICAgICAgICogICBgYGAKICAgICAgICoKICAgICAgICogQHRlbXBsYXRlIHtrZXlvZiBEYXRhfSBLZXkKICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEByZXR1cm5zIHtEYXRhfQogICAgICAgKgogICAgICAgKiBAb3ZlcmxvYWQKICAgICAgICogQHBhcmFtIHtEYXRhfSBkYXRhc2V0CiAgICAgICAqIEByZXR1cm5zIHtQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0Pn0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7S2V5fSBrZXkKICAgICAgICogQHJldHVybnMge0RhdGFbS2V5XX0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7S2V5fSBrZXkKICAgICAgICogQHBhcmFtIHtEYXRhW0tleV19IHZhbHVlCiAgICAgICAqIEByZXR1cm5zIHtQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0Pn0KICAgICAgICoKICAgICAgICogQHBhcmFtIHtEYXRhIHwgS2V5fSBba2V5XQogICAgICAgKiAgIEtleSB0byBnZXQgb3Igc2V0LCBvciBlbnRpcmUgZGF0YXNldCB0byBzZXQsIG9yIG5vdGhpbmcgdG8gZ2V0IHRoZQogICAgICAgKiAgIGVudGlyZSBkYXRhc2V0IChvcHRpb25hbCkuCiAgICAgICAqIEBwYXJhbSB7RGF0YVtLZXldfSBbdmFsdWVdCiAgICAgICAqICAgVmFsdWUgdG8gc2V0IChvcHRpb25hbCkuCiAgICAgICAqIEByZXR1cm5zIHt1bmtub3dufQogICAgICAgKiAgIFRoZSBjdXJyZW50IHByb2Nlc3NvciB3aGVuIHNldHRpbmcsIHRoZSB2YWx1ZSBhdCBga2V5YCB3aGVuIGdldHRpbmcsIG9yCiAgICAgICAqICAgdGhlIGVudGlyZSBkYXRhc2V0IHdoZW4gZ2V0dGluZyB3aXRob3V0IGtleS4KICAgICAgICovCiAgICAgIGRhdGEoa2V5MiwgdmFsdWUyKSB7CiAgICAgICAgaWYgKHR5cGVvZiBrZXkyID09PSAic3RyaW5nIikgewogICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgICAgICAgICAgYXNzZXJ0VW5mcm96ZW4oImRhdGEiLCB0aGlzLmZyb3plbik7CiAgICAgICAgICAgIHRoaXMubmFtZXNwYWNlW2tleTJdID0gdmFsdWUyOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBvd24uY2FsbCh0aGlzLm5hbWVzcGFjZSwga2V5MikgJiYgdGhpcy5uYW1lc3BhY2Vba2V5Ml0gfHwgdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAoa2V5MikgewogICAgICAgICAgYXNzZXJ0VW5mcm96ZW4oImRhdGEiLCB0aGlzLmZyb3plbik7CiAgICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IGtleTI7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBGcmVlemUgYSBwcm9jZXNzb3IuCiAgICAgICAqCiAgICAgICAqIEZyb3plbiBwcm9jZXNzb3JzIGFyZSBtZWFudCB0byBiZSBleHRlbmRlZCBhbmQgbm90IHRvIGJlIGNvbmZpZ3VyZWQKICAgICAgICogZGlyZWN0bHkuCiAgICAgICAqCiAgICAgICAqIFdoZW4gYSBwcm9jZXNzb3IgaXMgZnJvemVuIGl0IGNhbm5vdCBiZSB1bmZyb3plbi4KICAgICAgICogTmV3IHByb2Nlc3NvcnMgd29ya2luZyB0aGUgc2FtZSB3YXkgY2FuIGJlIGNyZWF0ZWQgYnkgY2FsbGluZyB0aGUKICAgICAgICogcHJvY2Vzc29yLgogICAgICAgKgogICAgICAgKiBJdOKAmXMgcG9zc2libGUgdG8gZnJlZXplIHByb2Nlc3NvcnMgZXhwbGljaXRseSBieSBjYWxsaW5nIGAuZnJlZXplKClgLgogICAgICAgKiBQcm9jZXNzb3JzIGZyZWV6ZSBhdXRvbWF0aWNhbGx5IHdoZW4gYC5wYXJzZSgpYCwgYC5ydW4oKWAsIGAucnVuU3luYygpYCwKICAgICAgICogYC5zdHJpbmdpZnkoKWAsIGAucHJvY2VzcygpYCwgb3IgYC5wcm9jZXNzU3luYygpYCBhcmUgY2FsbGVkLgogICAgICAgKgogICAgICAgKiBAcmV0dXJucyB7UHJvY2Vzc29yPFBhcnNlVHJlZSwgSGVhZFRyZWUsIFRhaWxUcmVlLCBDb21waWxlVHJlZSwgQ29tcGlsZVJlc3VsdD59CiAgICAgICAqICAgVGhlIGN1cnJlbnQgcHJvY2Vzc29yLgogICAgICAgKi8KICAgICAgZnJlZXplKCkgewogICAgICAgIGlmICh0aGlzLmZyb3plbikgewogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHNlbGYyID0gKAogICAgICAgICAgLyoqIEB0eXBlIHtQcm9jZXNzb3J9ICovCiAgICAgICAgICAvKiogQHR5cGUge3Vua25vd259ICovCiAgICAgICAgICB0aGlzCiAgICAgICAgKTsKICAgICAgICB3aGlsZSAoKyt0aGlzLmZyZWV6ZUluZGV4IDwgdGhpcy5hdHRhY2hlcnMubGVuZ3RoKSB7CiAgICAgICAgICBjb25zdCBbYXR0YWNoZXIsIC4uLm9wdGlvbnNdID0gdGhpcy5hdHRhY2hlcnNbdGhpcy5mcmVlemVJbmRleF07CiAgICAgICAgICBpZiAob3B0aW9uc1swXSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAob3B0aW9uc1swXSA9PT0gdHJ1ZSkgewogICAgICAgICAgICBvcHRpb25zWzBdID0gdm9pZCAwOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSBhdHRhY2hlci5jYWxsKHNlbGYyLCAuLi5vcHRpb25zKTsKICAgICAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtZXIgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lcnMudXNlKHRyYW5zZm9ybWVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5mcm96ZW4gPSB0cnVlOwogICAgICAgIHRoaXMuZnJlZXplSW5kZXggPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFBhcnNlIHRleHQgdG8gYSBzeW50YXggdHJlZS4KICAgICAgICoKICAgICAgICogPiAqKk5vdGUqKjogYHBhcnNlYCBmcmVlemVzIHRoZSBwcm9jZXNzb3IgaWYgbm90IGFscmVhZHkgKmZyb3plbiouCiAgICAgICAqCiAgICAgICAqID4gKipOb3RlKio6IGBwYXJzZWAgcGVyZm9ybXMgdGhlIHBhcnNlIHBoYXNlLCBub3QgdGhlIHJ1biBwaGFzZSBvciBvdGhlcgogICAgICAgKiA+IHBoYXNlcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtDb21wYXRpYmxlIHwgdW5kZWZpbmVkfSBbZmlsZV0KICAgICAgICogICBmaWxlIHRvIHBhcnNlIChvcHRpb25hbCk7IHR5cGljYWxseSBgc3RyaW5nYCBvciBgVkZpbGVgOyBhbnkgdmFsdWUKICAgICAgICogICBhY2NlcHRlZCBhcyBgeGAgaW4gYG5ldyBWRmlsZSh4KWAuCiAgICAgICAqIEByZXR1cm5zIHtQYXJzZVRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogUGFyc2VUcmVlfQogICAgICAgKiAgIFN5bnRheCB0cmVlIHJlcHJlc2VudGluZyBgZmlsZWAuCiAgICAgICAqLwogICAgICBwYXJzZShmaWxlKSB7CiAgICAgICAgdGhpcy5mcmVlemUoKTsKICAgICAgICBjb25zdCByZWFsRmlsZSA9IHZmaWxlKGZpbGUpOwogICAgICAgIGNvbnN0IHBhcnNlciA9IHRoaXMucGFyc2VyIHx8IHRoaXMuUGFyc2VyOwogICAgICAgIGFzc2VydFBhcnNlcigicGFyc2UiLCBwYXJzZXIpOwogICAgICAgIHJldHVybiBwYXJzZXIoU3RyaW5nKHJlYWxGaWxlKSwgcmVhbEZpbGUpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBQcm9jZXNzIHRoZSBnaXZlbiBmaWxlIGFzIGNvbmZpZ3VyZWQgb24gdGhlIHByb2Nlc3Nvci4KICAgICAgICoKICAgICAgICogPiAqKk5vdGUqKjogYHByb2Nlc3NgIGZyZWV6ZXMgdGhlIHByb2Nlc3NvciBpZiBub3QgYWxyZWFkeSAqZnJvemVuKi4KICAgICAgICoKICAgICAgICogPiAqKk5vdGUqKjogYHByb2Nlc3NgIHBlcmZvcm1zIHRoZSBwYXJzZSwgcnVuLCBhbmQgc3RyaW5naWZ5IHBoYXNlcy4KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7Q29tcGF0aWJsZSB8IHVuZGVmaW5lZH0gZmlsZQogICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NDYWxsYmFjazxWRmlsZVdpdGhPdXRwdXQ8Q29tcGlsZVJlc3VsdD4+fSBkb25lCiAgICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxWRmlsZVdpdGhPdXRwdXQ8Q29tcGlsZVJlc3VsdD4+fQogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAgICAgKiAgIEZpbGUgKG9wdGlvbmFsKTsgdHlwaWNhbGx5IGBzdHJpbmdgIG9yIGBWRmlsZWBdOyBhbnkgdmFsdWUgYWNjZXB0ZWQgYXMKICAgICAgICogICBgeGAgaW4gYG5ldyBWRmlsZSh4KWAuCiAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc0NhbGxiYWNrPFZGaWxlV2l0aE91dHB1dDxDb21waWxlUmVzdWx0Pj4gfCB1bmRlZmluZWR9IFtkb25lXQogICAgICAgKiAgIENhbGxiYWNrIChvcHRpb25hbCkuCiAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFZGaWxlPiB8IHVuZGVmaW5lZH0KICAgICAgICogICBOb3RoaW5nIGlmIGBkb25lYCBpcyBnaXZlbi4KICAgICAgICogICBPdGhlcndpc2UgYSBwcm9taXNlLCByZWplY3RlZCB3aXRoIGEgZmF0YWwgZXJyb3Igb3IgcmVzb2x2ZWQgd2l0aCB0aGUKICAgICAgICogICBwcm9jZXNzZWQgZmlsZS4KICAgICAgICoKICAgICAgICogICBUaGUgcGFyc2VkLCB0cmFuc2Zvcm1lZCwgYW5kIGNvbXBpbGVkIHZhbHVlIGlzIGF2YWlsYWJsZSBhdAogICAgICAgKiAgIGBmaWxlLnZhbHVlYCAoc2VlIG5vdGUpLgogICAgICAgKgogICAgICAgKiAgID4gKipOb3RlKio6IHVuaWZpZWQgdHlwaWNhbGx5IGNvbXBpbGVzIGJ5IHNlcmlhbGl6aW5nOiBtb3N0CiAgICAgICAqICAgPiBjb21waWxlcnMgcmV0dXJuIGBzdHJpbmdgIChvciBgVWludDhBcnJheWApLgogICAgICAgKiAgID4gU29tZSBjb21waWxlcnMsIHN1Y2ggYXMgdGhlIG9uZSBjb25maWd1cmVkIHdpdGgKICAgICAgICogICA+IFtgcmVoeXBlLXJlYWN0YF1bcmVoeXBlLXJlYWN0XSwgcmV0dXJuIG90aGVyIHZhbHVlcyAoaW4gdGhpcyBjYXNlLCBhCiAgICAgICAqICAgPiBSZWFjdCB0cmVlKS4KICAgICAgICogICA+IElmIHlvdeKAmXJlIHVzaW5nIGEgY29tcGlsZXIgdGhhdCBkb2VzbuKAmXQgc2VyaWFsaXplLCBleHBlY3QgZGlmZmVyZW50CiAgICAgICAqICAgPiByZXN1bHQgdmFsdWVzLgogICAgICAgKiAgID4KICAgICAgICogICA+IFRvIHJlZ2lzdGVyIGN1c3RvbSByZXN1bHRzIGluIFR5cGVTY3JpcHQsIGFkZCB0aGVtIHRvCiAgICAgICAqICAgPiB7QGxpbmtjb2RlIENvbXBpbGVSZXN1bHRNYXB9LgogICAgICAgKgogICAgICAgKiAgIFtyZWh5cGUtcmVhY3RdOiBodHRwczovL2dpdGh1Yi5jb20vcmVoeXBlanMvcmVoeXBlLXJlYWN0CiAgICAgICAqLwogICAgICBwcm9jZXNzKGZpbGUsIGRvbmUpIHsKICAgICAgICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgICAgICAgdGhpcy5mcmVlemUoKTsKICAgICAgICBhc3NlcnRQYXJzZXIoInByb2Nlc3MiLCB0aGlzLnBhcnNlciB8fCB0aGlzLlBhcnNlcik7CiAgICAgICAgYXNzZXJ0Q29tcGlsZXIoInByb2Nlc3MiLCB0aGlzLmNvbXBpbGVyIHx8IHRoaXMuQ29tcGlsZXIpOwogICAgICAgIHJldHVybiBkb25lID8gZXhlY3V0b3Iodm9pZCAwLCBkb25lKSA6IG5ldyBQcm9taXNlKGV4ZWN1dG9yKTsKICAgICAgICBmdW5jdGlvbiBleGVjdXRvcihyZXNvbHZlMiwgcmVqZWN0KSB7CiAgICAgICAgICBjb25zdCByZWFsRmlsZSA9IHZmaWxlKGZpbGUpOwogICAgICAgICAgY29uc3QgcGFyc2VUcmVlID0gKAogICAgICAgICAgICAvKiogQHR5cGUge0hlYWRUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IEhlYWRUcmVlfSAqLwogICAgICAgICAgICAvKiogQHR5cGUge3Vua25vd259ICovCiAgICAgICAgICAgIHNlbGYyLnBhcnNlKHJlYWxGaWxlKQogICAgICAgICAgKTsKICAgICAgICAgIHNlbGYyLnJ1bihwYXJzZVRyZWUsIHJlYWxGaWxlLCBmdW5jdGlvbihlcnJvciwgdHJlZSwgZmlsZTIpIHsKICAgICAgICAgICAgaWYgKGVycm9yIHx8ICF0cmVlIHx8ICFmaWxlMikgewogICAgICAgICAgICAgIHJldHVybiByZWFsRG9uZShlcnJvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgY29tcGlsZVRyZWUgPSAoCiAgICAgICAgICAgICAgLyoqIEB0eXBlIHtDb21waWxlVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBDb21waWxlVHJlZX0gKi8KICAgICAgICAgICAgICAvKiogQHR5cGUge3Vua25vd259ICovCiAgICAgICAgICAgICAgdHJlZQogICAgICAgICAgICApOwogICAgICAgICAgICBjb25zdCBjb21waWxlUmVzdWx0ID0gc2VsZjIuc3RyaW5naWZ5KGNvbXBpbGVUcmVlLCBmaWxlMik7CiAgICAgICAgICAgIGlmIChsb29rc0xpa2VBVmFsdWUoY29tcGlsZVJlc3VsdCkpIHsKICAgICAgICAgICAgICBmaWxlMi52YWx1ZSA9IGNvbXBpbGVSZXN1bHQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZmlsZTIucmVzdWx0ID0gY29tcGlsZVJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZWFsRG9uZSgKICAgICAgICAgICAgICBlcnJvciwKICAgICAgICAgICAgICAvKiogQHR5cGUge1ZGaWxlV2l0aE91dHB1dDxDb21waWxlUmVzdWx0Pn0gKi8KICAgICAgICAgICAgICBmaWxlMgogICAgICAgICAgICApOwogICAgICAgICAgfSk7CiAgICAgICAgICBmdW5jdGlvbiByZWFsRG9uZShlcnJvciwgZmlsZTIpIHsKICAgICAgICAgICAgaWYgKGVycm9yIHx8ICFmaWxlMikgewogICAgICAgICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZTIpIHsKICAgICAgICAgICAgICByZXNvbHZlMihmaWxlMik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgb2soZG9uZSwgImBkb25lYCBpcyBkZWZpbmVkIGlmIGByZXNvbHZlYCBpcyBub3QiKTsKICAgICAgICAgICAgICBkb25lKHZvaWQgMCwgZmlsZTIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBQcm9jZXNzIHRoZSBnaXZlbiBmaWxlIGFzIGNvbmZpZ3VyZWQgb24gdGhlIHByb2Nlc3Nvci4KICAgICAgICoKICAgICAgICogQW4gZXJyb3IgaXMgdGhyb3duIGlmIGFzeW5jaHJvbm91cyB0cmFuc2Zvcm1zIGFyZSBjb25maWd1cmVkLgogICAgICAgKgogICAgICAgKiA+ICoqTm90ZSoqOiBgcHJvY2Vzc1N5bmNgIGZyZWV6ZXMgdGhlIHByb2Nlc3NvciBpZiBub3QgYWxyZWFkeSAqZnJvemVuKi4KICAgICAgICoKICAgICAgICogPiAqKk5vdGUqKjogYHByb2Nlc3NTeW5jYCBwZXJmb3JtcyB0aGUgcGFyc2UsIHJ1biwgYW5kIHN0cmluZ2lmeSBwaGFzZXMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Q29tcGF0aWJsZSB8IHVuZGVmaW5lZH0gW2ZpbGVdCiAgICAgICAqICAgRmlsZSAob3B0aW9uYWwpOyB0eXBpY2FsbHkgYHN0cmluZ2Agb3IgYFZGaWxlYDsgYW55IHZhbHVlIGFjY2VwdGVkIGFzCiAgICAgICAqICAgYHhgIGluIGBuZXcgVkZpbGUoeClgLgogICAgICAgKiBAcmV0dXJucyB7VkZpbGVXaXRoT3V0cHV0PENvbXBpbGVSZXN1bHQ+fQogICAgICAgKiAgIFRoZSBwcm9jZXNzZWQgZmlsZS4KICAgICAgICoKICAgICAgICogICBUaGUgcGFyc2VkLCB0cmFuc2Zvcm1lZCwgYW5kIGNvbXBpbGVkIHZhbHVlIGlzIGF2YWlsYWJsZSBhdAogICAgICAgKiAgIGBmaWxlLnZhbHVlYCAoc2VlIG5vdGUpLgogICAgICAgKgogICAgICAgKiAgID4gKipOb3RlKio6IHVuaWZpZWQgdHlwaWNhbGx5IGNvbXBpbGVzIGJ5IHNlcmlhbGl6aW5nOiBtb3N0CiAgICAgICAqICAgPiBjb21waWxlcnMgcmV0dXJuIGBzdHJpbmdgIChvciBgVWludDhBcnJheWApLgogICAgICAgKiAgID4gU29tZSBjb21waWxlcnMsIHN1Y2ggYXMgdGhlIG9uZSBjb25maWd1cmVkIHdpdGgKICAgICAgICogICA+IFtgcmVoeXBlLXJlYWN0YF1bcmVoeXBlLXJlYWN0XSwgcmV0dXJuIG90aGVyIHZhbHVlcyAoaW4gdGhpcyBjYXNlLCBhCiAgICAgICAqICAgPiBSZWFjdCB0cmVlKS4KICAgICAgICogICA+IElmIHlvdeKAmXJlIHVzaW5nIGEgY29tcGlsZXIgdGhhdCBkb2VzbuKAmXQgc2VyaWFsaXplLCBleHBlY3QgZGlmZmVyZW50CiAgICAgICAqICAgPiByZXN1bHQgdmFsdWVzLgogICAgICAgKiAgID4KICAgICAgICogICA+IFRvIHJlZ2lzdGVyIGN1c3RvbSByZXN1bHRzIGluIFR5cGVTY3JpcHQsIGFkZCB0aGVtIHRvCiAgICAgICAqICAgPiB7QGxpbmtjb2RlIENvbXBpbGVSZXN1bHRNYXB9LgogICAgICAgKgogICAgICAgKiAgIFtyZWh5cGUtcmVhY3RdOiBodHRwczovL2dpdGh1Yi5jb20vcmVoeXBlanMvcmVoeXBlLXJlYWN0CiAgICAgICAqLwogICAgICBwcm9jZXNzU3luYyhmaWxlKSB7CiAgICAgICAgbGV0IGNvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICB0aGlzLmZyZWV6ZSgpOwogICAgICAgIGFzc2VydFBhcnNlcigicHJvY2Vzc1N5bmMiLCB0aGlzLnBhcnNlciB8fCB0aGlzLlBhcnNlcik7CiAgICAgICAgYXNzZXJ0Q29tcGlsZXIoInByb2Nlc3NTeW5jIiwgdGhpcy5jb21waWxlciB8fCB0aGlzLkNvbXBpbGVyKTsKICAgICAgICB0aGlzLnByb2Nlc3MoZmlsZSwgcmVhbERvbmUpOwogICAgICAgIGFzc2VydERvbmUoInByb2Nlc3NTeW5jIiwgInByb2Nlc3MiLCBjb21wbGV0ZSk7CiAgICAgICAgb2socmVzdWx0LCAid2UgZWl0aGVyIGJhaWxlZCBvbiBhbiBlcnJvciBvciBoYXZlIGEgdHJlZSIpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgZnVuY3Rpb24gcmVhbERvbmUoZXJyb3IsIGZpbGUyKSB7CiAgICAgICAgICBjb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICBiYWlsKGVycm9yKTsKICAgICAgICAgIHJlc3VsdCA9IGZpbGUyOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogUnVuICp0cmFuc2Zvcm1lcnMqIG9uIGEgc3ludGF4IHRyZWUuCiAgICAgICAqCiAgICAgICAqID4gKipOb3RlKio6IGBydW5gIGZyZWV6ZXMgdGhlIHByb2Nlc3NvciBpZiBub3QgYWxyZWFkeSAqZnJvemVuKi4KICAgICAgICoKICAgICAgICogPiAqKk5vdGUqKjogYHJ1bmAgcGVyZm9ybXMgdGhlIHJ1biBwaGFzZSwgbm90IG90aGVyIHBoYXNlcy4KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7SGVhZFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogSGVhZFRyZWV9IHRyZWUKICAgICAgICogQHBhcmFtIHtSdW5DYWxsYmFjazxUYWlsVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBUYWlsVHJlZT59IGRvbmUKICAgICAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7SGVhZFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogSGVhZFRyZWV9IHRyZWUKICAgICAgICogQHBhcmFtIHtDb21wYXRpYmxlIHwgdW5kZWZpbmVkfSBmaWxlCiAgICAgICAqIEBwYXJhbSB7UnVuQ2FsbGJhY2s8VGFpbFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogVGFpbFRyZWU+fSBkb25lCiAgICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge0hlYWRUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IEhlYWRUcmVlfSB0cmVlCiAgICAgICAqIEBwYXJhbSB7Q29tcGF0aWJsZSB8IHVuZGVmaW5lZH0gW2ZpbGVdCiAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFRhaWxUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IFRhaWxUcmVlPn0KICAgICAgICoKICAgICAgICogQHBhcmFtIHtIZWFkVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBIZWFkVHJlZX0gdHJlZQogICAgICAgKiAgIFRyZWUgdG8gdHJhbnNmb3JtIGFuZCBpbnNwZWN0LgogICAgICAgKiBAcGFyYW0geygKICAgICAgICogICBSdW5DYWxsYmFjazxUYWlsVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBUYWlsVHJlZT4gfAogICAgICAgKiAgIENvbXBhdGlibGUKICAgICAgICogKX0gW2ZpbGVdCiAgICAgICAqICAgRmlsZSBhc3NvY2lhdGVkIHdpdGggYG5vZGVgIChvcHRpb25hbCk7IGFueSB2YWx1ZSBhY2NlcHRlZCBhcyBgeGAgaW4KICAgICAgICogICBgbmV3IFZGaWxlKHgpYC4KICAgICAgICogQHBhcmFtIHtSdW5DYWxsYmFjazxUYWlsVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBUYWlsVHJlZT59IFtkb25lXQogICAgICAgKiAgIENhbGxiYWNrIChvcHRpb25hbCkuCiAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFRhaWxUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IFRhaWxUcmVlPiB8IHVuZGVmaW5lZH0KICAgICAgICogICBOb3RoaW5nIGlmIGBkb25lYCBpcyBnaXZlbi4KICAgICAgICogICBPdGhlcndpc2UsIGEgcHJvbWlzZSByZWplY3RlZCB3aXRoIGEgZmF0YWwgZXJyb3Igb3IgcmVzb2x2ZWQgd2l0aCB0aGUKICAgICAgICogICB0cmFuc2Zvcm1lZCB0cmVlLgogICAgICAgKi8KICAgICAgcnVuKHRyZWUsIGZpbGUsIGRvbmUpIHsKICAgICAgICBhc3NlcnROb2RlKHRyZWUpOwogICAgICAgIHRoaXMuZnJlZXplKCk7CiAgICAgICAgY29uc3QgdHJhbnNmb3JtZXJzID0gdGhpcy50cmFuc2Zvcm1lcnM7CiAgICAgICAgaWYgKCFkb25lICYmIHR5cGVvZiBmaWxlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICBkb25lID0gZmlsZTsKICAgICAgICAgIGZpbGUgPSB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkb25lID8gZXhlY3V0b3Iodm9pZCAwLCBkb25lKSA6IG5ldyBQcm9taXNlKGV4ZWN1dG9yKTsKICAgICAgICBmdW5jdGlvbiBleGVjdXRvcihyZXNvbHZlMiwgcmVqZWN0KSB7CiAgICAgICAgICBvaygKICAgICAgICAgICAgdHlwZW9mIGZpbGUgIT09ICJmdW5jdGlvbiIsCiAgICAgICAgICAgICJgZmlsZWAgY2FuXHUyMDE5dCBiZSBhIGBkb25lYCBhbnltb3JlLCB3ZSBjaGVja2VkIgogICAgICAgICAgKTsKICAgICAgICAgIGNvbnN0IHJlYWxGaWxlID0gdmZpbGUoZmlsZSk7CiAgICAgICAgICB0cmFuc2Zvcm1lcnMucnVuKHRyZWUsIHJlYWxGaWxlLCByZWFsRG9uZSk7CiAgICAgICAgICBmdW5jdGlvbiByZWFsRG9uZShlcnJvciwgb3V0cHV0VHJlZSwgZmlsZTIpIHsKICAgICAgICAgICAgY29uc3QgcmVzdWx0aW5nVHJlZSA9ICgKICAgICAgICAgICAgICAvKiogQHR5cGUge1RhaWxUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IFRhaWxUcmVlfSAqLwogICAgICAgICAgICAgIG91dHB1dFRyZWUgfHwgdHJlZQogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmUyKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZTIocmVzdWx0aW5nVHJlZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgb2soZG9uZSwgImBkb25lYCBpcyBkZWZpbmVkIGlmIGByZXNvbHZlYCBpcyBub3QiKTsKICAgICAgICAgICAgICBkb25lKHZvaWQgMCwgcmVzdWx0aW5nVHJlZSwgZmlsZTIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSdW4gKnRyYW5zZm9ybWVycyogb24gYSBzeW50YXggdHJlZS4KICAgICAgICoKICAgICAgICogQW4gZXJyb3IgaXMgdGhyb3duIGlmIGFzeW5jaHJvbm91cyB0cmFuc2Zvcm1zIGFyZSBjb25maWd1cmVkLgogICAgICAgKgogICAgICAgKiA+ICoqTm90ZSoqOiBgcnVuU3luY2AgZnJlZXplcyB0aGUgcHJvY2Vzc29yIGlmIG5vdCBhbHJlYWR5ICpmcm96ZW4qLgogICAgICAgKgogICAgICAgKiA+ICoqTm90ZSoqOiBgcnVuU3luY2AgcGVyZm9ybXMgdGhlIHJ1biBwaGFzZSwgbm90IG90aGVyIHBoYXNlcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtIZWFkVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBIZWFkVHJlZX0gdHJlZQogICAgICAgKiAgIFRyZWUgdG8gdHJhbnNmb3JtIGFuZCBpbnNwZWN0LgogICAgICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAgICAgKiAgIEZpbGUgYXNzb2NpYXRlZCB3aXRoIGBub2RlYCAob3B0aW9uYWwpOyBhbnkgdmFsdWUgYWNjZXB0ZWQgYXMgYHhgIGluCiAgICAgICAqICAgYG5ldyBWRmlsZSh4KWAuCiAgICAgICAqIEByZXR1cm5zIHtUYWlsVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBUYWlsVHJlZX0KICAgICAgICogICBUcmFuc2Zvcm1lZCB0cmVlLgogICAgICAgKi8KICAgICAgcnVuU3luYyh0cmVlLCBmaWxlKSB7CiAgICAgICAgbGV0IGNvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICB0aGlzLnJ1bih0cmVlLCBmaWxlLCByZWFsRG9uZSk7CiAgICAgICAgYXNzZXJ0RG9uZSgicnVuU3luYyIsICJydW4iLCBjb21wbGV0ZSk7CiAgICAgICAgb2socmVzdWx0LCAid2UgZWl0aGVyIGJhaWxlZCBvbiBhbiBlcnJvciBvciBoYXZlIGEgdHJlZSIpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgZnVuY3Rpb24gcmVhbERvbmUoZXJyb3IsIHRyZWUyKSB7CiAgICAgICAgICBiYWlsKGVycm9yKTsKICAgICAgICAgIHJlc3VsdCA9IHRyZWUyOwogICAgICAgICAgY29tcGxldGUgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogQ29tcGlsZSBhIHN5bnRheCB0cmVlLgogICAgICAgKgogICAgICAgKiA+ICoqTm90ZSoqOiBgc3RyaW5naWZ5YCBmcmVlemVzIHRoZSBwcm9jZXNzb3IgaWYgbm90IGFscmVhZHkgKmZyb3plbiouCiAgICAgICAqCiAgICAgICAqID4gKipOb3RlKio6IGBzdHJpbmdpZnlgIHBlcmZvcm1zIHRoZSBzdHJpbmdpZnkgcGhhc2UsIG5vdCB0aGUgcnVuIHBoYXNlCiAgICAgICAqID4gb3Igb3RoZXIgcGhhc2VzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0NvbXBpbGVUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IENvbXBpbGVUcmVlfSB0cmVlCiAgICAgICAqICAgVHJlZSB0byBjb21waWxlLgogICAgICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IFtmaWxlXQogICAgICAgKiAgIEZpbGUgYXNzb2NpYXRlZCB3aXRoIGBub2RlYCAob3B0aW9uYWwpOyBhbnkgdmFsdWUgYWNjZXB0ZWQgYXMgYHhgIGluCiAgICAgICAqICAgYG5ldyBWRmlsZSh4KWAuCiAgICAgICAqIEByZXR1cm5zIHtDb21waWxlUmVzdWx0IGV4dGVuZHMgdW5kZWZpbmVkID8gVmFsdWUgOiBDb21waWxlUmVzdWx0fQogICAgICAgKiAgIFRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRyZWUgKHNlZSBub3RlKS4KICAgICAgICoKICAgICAgICogICA+ICoqTm90ZSoqOiB1bmlmaWVkIHR5cGljYWxseSBjb21waWxlcyBieSBzZXJpYWxpemluZzogbW9zdCBjb21waWxlcnMKICAgICAgICogICA+IHJldHVybiBgc3RyaW5nYCAob3IgYFVpbnQ4QXJyYXlgKS4KICAgICAgICogICA+IFNvbWUgY29tcGlsZXJzLCBzdWNoIGFzIHRoZSBvbmUgY29uZmlndXJlZCB3aXRoCiAgICAgICAqICAgPiBbYHJlaHlwZS1yZWFjdGBdW3JlaHlwZS1yZWFjdF0sIHJldHVybiBvdGhlciB2YWx1ZXMgKGluIHRoaXMgY2FzZSwgYQogICAgICAgKiAgID4gUmVhY3QgdHJlZSkuCiAgICAgICAqICAgPiBJZiB5b3XigJlyZSB1c2luZyBhIGNvbXBpbGVyIHRoYXQgZG9lc27igJl0IHNlcmlhbGl6ZSwgZXhwZWN0IGRpZmZlcmVudAogICAgICAgKiAgID4gcmVzdWx0IHZhbHVlcy4KICAgICAgICogICA+CiAgICAgICAqICAgPiBUbyByZWdpc3RlciBjdXN0b20gcmVzdWx0cyBpbiBUeXBlU2NyaXB0LCBhZGQgdGhlbSB0bwogICAgICAgKiAgID4ge0BsaW5rY29kZSBDb21waWxlUmVzdWx0TWFwfS4KICAgICAgICoKICAgICAgICogICBbcmVoeXBlLXJlYWN0XTogaHR0cHM6Ly9naXRodWIuY29tL3JlaHlwZWpzL3JlaHlwZS1yZWFjdAogICAgICAgKi8KICAgICAgc3RyaW5naWZ5KHRyZWUsIGZpbGUpIHsKICAgICAgICB0aGlzLmZyZWV6ZSgpOwogICAgICAgIGNvbnN0IHJlYWxGaWxlID0gdmZpbGUoZmlsZSk7CiAgICAgICAgY29uc3QgY29tcGlsZXIyID0gdGhpcy5jb21waWxlciB8fCB0aGlzLkNvbXBpbGVyOwogICAgICAgIGFzc2VydENvbXBpbGVyKCJzdHJpbmdpZnkiLCBjb21waWxlcjIpOwogICAgICAgIGFzc2VydE5vZGUodHJlZSk7CiAgICAgICAgcmV0dXJuIGNvbXBpbGVyMih0cmVlLCByZWFsRmlsZSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENvbmZpZ3VyZSB0aGUgcHJvY2Vzc29yIHRvIHVzZSBhIHBsdWdpbiwgYSBsaXN0IG9mIHVzYWJsZSB2YWx1ZXMsIG9yIGEKICAgICAgICogcHJlc2V0LgogICAgICAgKgogICAgICAgKiBJZiB0aGUgcHJvY2Vzc29yIGlzIGFscmVhZHkgdXNpbmcgYSBwbHVnaW4sIHRoZSBwcmV2aW91cyBwbHVnaW4KICAgICAgICogY29uZmlndXJhdGlvbiBpcyBjaGFuZ2VkIGJhc2VkIG9uIHRoZSBvcHRpb25zIHRoYXQgYXJlIHBhc3NlZCBpbi4KICAgICAgICogSW4gb3RoZXIgd29yZHMsIHRoZSBwbHVnaW4gaXMgbm90IGFkZGVkIGEgc2Vjb25kIHRpbWUuCiAgICAgICAqCiAgICAgICAqID4gKipOb3RlKio6IGB1c2VgIGNhbm5vdCBiZSBjYWxsZWQgb24gKmZyb3plbiogcHJvY2Vzc29ycy4KICAgICAgICogPiBDYWxsIHRoZSBwcm9jZXNzb3IgZmlyc3QgdG8gY3JlYXRlIGEgbmV3IHVuZnJvemVuIHByb2Nlc3Nvci4KICAgICAgICoKICAgICAgICogQGV4YW1wbGUKICAgICAgICogICBUaGVyZSBhcmUgbWFueSB3YXlzIHRvIHBhc3MgcGx1Z2lucyB0byBgLnVzZSgpYC4KICAgICAgICogICBUaGlzIGV4YW1wbGUgZ2l2ZXMgYW4gb3ZlcnZpZXc6CiAgICAgICAqCiAgICAgICAqICAgYGBganMKICAgICAgICogICBpbXBvcnQge3VuaWZpZWR9IGZyb20gJ3VuaWZpZWQnCiAgICAgICAqCiAgICAgICAqICAgdW5pZmllZCgpCiAgICAgICAqICAgICAvLyBQbHVnaW4gd2l0aCBvcHRpb25zOgogICAgICAgKiAgICAgLnVzZShwbHVnaW5BLCB7eDogdHJ1ZSwgeTogdHJ1ZX0pCiAgICAgICAqICAgICAvLyBQYXNzaW5nIHRoZSBzYW1lIHBsdWdpbiBhZ2FpbiBtZXJnZXMgY29uZmlndXJhdGlvbiAodG8gYHt4OiB0cnVlLCB5OiBmYWxzZSwgejogdHJ1ZX1gKToKICAgICAgICogICAgIC51c2UocGx1Z2luQSwge3k6IGZhbHNlLCB6OiB0cnVlfSkKICAgICAgICogICAgIC8vIFBsdWdpbnM6CiAgICAgICAqICAgICAudXNlKFtwbHVnaW5CLCBwbHVnaW5DXSkKICAgICAgICogICAgIC8vIFR3byBwbHVnaW5zLCB0aGUgc2Vjb25kIHdpdGggb3B0aW9uczoKICAgICAgICogICAgIC51c2UoW3BsdWdpbkQsIFtwbHVnaW5FLCB7fV1dKQogICAgICAgKiAgICAgLy8gUHJlc2V0IHdpdGggcGx1Z2lucyBhbmQgc2V0dGluZ3M6CiAgICAgICAqICAgICAudXNlKHtwbHVnaW5zOiBbcGx1Z2luRiwgW3BsdWdpbkcsIHt9XV0sIHNldHRpbmdzOiB7cG9zaXRpb246IGZhbHNlfX0pCiAgICAgICAqICAgICAvLyBTZXR0aW5ncyBvbmx5OgogICAgICAgKiAgICAgLnVzZSh7c2V0dGluZ3M6IHtwb3NpdGlvbjogZmFsc2V9fSkKICAgICAgICogICBgYGAKICAgICAgICoKICAgICAgICogQHRlbXBsYXRlIHtBcnJheTx1bmtub3duPn0gW1BhcmFtZXRlcnM9W11dCiAgICAgICAqIEB0ZW1wbGF0ZSB7Tm9kZSB8IHN0cmluZyB8IHVuZGVmaW5lZH0gW0lucHV0PXVuZGVmaW5lZF0KICAgICAgICogQHRlbXBsYXRlIFtPdXRwdXQ9SW5wdXRdCiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge1ByZXNldCB8IG51bGwgfCB1bmRlZmluZWR9IFtwcmVzZXRdCiAgICAgICAqIEByZXR1cm5zIHtQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0Pn0KICAgICAgICoKICAgICAgICogQG92ZXJsb2FkCiAgICAgICAqIEBwYXJhbSB7UGx1Z2dhYmxlTGlzdH0gbGlzdAogICAgICAgKiBAcmV0dXJucyB7UHJvY2Vzc29yPFBhcnNlVHJlZSwgSGVhZFRyZWUsIFRhaWxUcmVlLCBDb21waWxlVHJlZSwgQ29tcGlsZVJlc3VsdD59CiAgICAgICAqCiAgICAgICAqIEBvdmVybG9hZAogICAgICAgKiBAcGFyYW0ge1BsdWdpbjxQYXJhbWV0ZXJzLCBJbnB1dCwgT3V0cHV0Pn0gcGx1Z2luCiAgICAgICAqIEBwYXJhbSB7Li4uKFBhcmFtZXRlcnMgfCBbYm9vbGVhbl0pfSBwYXJhbWV0ZXJzCiAgICAgICAqIEByZXR1cm5zIHtVc2VQbHVnaW48UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0LCBJbnB1dCwgT3V0cHV0Pn0KICAgICAgICoKICAgICAgICogQHBhcmFtIHtQbHVnZ2FibGVMaXN0IHwgUGx1Z2luIHwgUHJlc2V0IHwgbnVsbCB8IHVuZGVmaW5lZH0gdmFsdWUKICAgICAgICogICBVc2FibGUgdmFsdWUuCiAgICAgICAqIEBwYXJhbSB7Li4udW5rbm93bn0gcGFyYW1ldGVycwogICAgICAgKiAgIFBhcmFtZXRlcnMsIHdoZW4gYSBwbHVnaW4gaXMgZ2l2ZW4gYXMgYSB1c2FibGUgdmFsdWUuCiAgICAgICAqIEByZXR1cm5zIHtQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0Pn0KICAgICAgICogICBDdXJyZW50IHByb2Nlc3Nvci4KICAgICAgICovCiAgICAgIHVzZSh2YWx1ZTIsIC4uLnBhcmFtZXRlcnMpIHsKICAgICAgICBjb25zdCBhdHRhY2hlcnMgPSB0aGlzLmF0dGFjaGVyczsKICAgICAgICBjb25zdCBuYW1lc3BhY2UyID0gdGhpcy5uYW1lc3BhY2U7CiAgICAgICAgYXNzZXJ0VW5mcm96ZW4oInVzZSIsIHRoaXMuZnJvemVuKTsKICAgICAgICBpZiAodmFsdWUyID09PSBudWxsIHx8IHZhbHVlMiA9PT0gdm9pZCAwKSB7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICBhZGRQbHVnaW4odmFsdWUyLCBwYXJhbWV0ZXJzKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZTIgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZTIpKSB7CiAgICAgICAgICAgIGFkZExpc3QodmFsdWUyKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFkZFByZXNldCh2YWx1ZTIpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCB1c2FibGUgdmFsdWUsIG5vdCBgIiArIHZhbHVlMiArICJgIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIGZ1bmN0aW9uIGFkZDModmFsdWUzKSB7CiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlMyA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBhZGRQbHVnaW4odmFsdWUzLCBbXSk7CiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZTMgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlMykpIHsKICAgICAgICAgICAgICBjb25zdCBbcGx1Z2luLCAuLi5wYXJhbWV0ZXJzMl0gPSAoCiAgICAgICAgICAgICAgICAvKiogQHR5cGUge1BsdWdpblR1cGxlPEFycmF5PHVua25vd24+Pn0gKi8KICAgICAgICAgICAgICAgIHZhbHVlMwogICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgYWRkUGx1Z2luKHBsdWdpbiwgcGFyYW1ldGVyczIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGFkZFByZXNldCh2YWx1ZTMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCB1c2FibGUgdmFsdWUsIG5vdCBgIiArIHZhbHVlMyArICJgIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGFkZFByZXNldChyZXN1bHQpIHsKICAgICAgICAgIGlmICghKCJwbHVnaW5zIiBpbiByZXN1bHQpICYmICEoInNldHRpbmdzIiBpbiByZXN1bHQpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICAgICAiRXhwZWN0ZWQgdXNhYmxlIHZhbHVlIGJ1dCByZWNlaXZlZCBhbiBlbXB0eSBwcmVzZXQsIHdoaWNoIGlzIHByb2JhYmx5IGEgbWlzdGFrZTogcHJlc2V0cyB0eXBpY2FsbHkgY29tZSB3aXRoIGBwbHVnaW5zYCBhbmQgc29tZXRpbWVzIHdpdGggYHNldHRpbmdzYCwgYnV0IHRoaXMgaGFzIG5laXRoZXIiCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgICBhZGRMaXN0KHJlc3VsdC5wbHVnaW5zKTsKICAgICAgICAgIGlmIChyZXN1bHQuc2V0dGluZ3MpIHsKICAgICAgICAgICAgbmFtZXNwYWNlMi5zZXR0aW5ncyA9ICgwLCBpbXBvcnRfZXh0ZW5kLmRlZmF1bHQpKHRydWUsIG5hbWVzcGFjZTIuc2V0dGluZ3MsIHJlc3VsdC5zZXR0aW5ncyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGFkZExpc3QocGx1Z2luczMpIHsKICAgICAgICAgIGxldCBpbmRleDIgPSAtMTsKICAgICAgICAgIGlmIChwbHVnaW5zMyA9PT0gbnVsbCB8fCBwbHVnaW5zMyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocGx1Z2luczMpKSB7CiAgICAgICAgICAgIHdoaWxlICgrK2luZGV4MiA8IHBsdWdpbnMzLmxlbmd0aCkgewogICAgICAgICAgICAgIGNvbnN0IHRoaW5nID0gcGx1Z2luczNbaW5kZXgyXTsKICAgICAgICAgICAgICBhZGQzKHRoaW5nKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBsaXN0IG9mIHBsdWdpbnMsIG5vdCBgIiArIHBsdWdpbnMzICsgImAiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gYWRkUGx1Z2luKHBsdWdpbiwgcGFyYW1ldGVyczIpIHsKICAgICAgICAgIGxldCBpbmRleDIgPSAtMTsKICAgICAgICAgIGxldCBlbnRyeUluZGV4ID0gLTE7CiAgICAgICAgICB3aGlsZSAoKytpbmRleDIgPCBhdHRhY2hlcnMubGVuZ3RoKSB7CiAgICAgICAgICAgIGlmIChhdHRhY2hlcnNbaW5kZXgyXVswXSA9PT0gcGx1Z2luKSB7CiAgICAgICAgICAgICAgZW50cnlJbmRleCA9IGluZGV4MjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGVudHJ5SW5kZXggPT09IC0xKSB7CiAgICAgICAgICAgIGF0dGFjaGVycy5wdXNoKFtwbHVnaW4sIC4uLnBhcmFtZXRlcnMyXSk7CiAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMyLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbGV0IFtwcmltYXJ5LCAuLi5yZXN0XSA9IHBhcmFtZXRlcnMyOwogICAgICAgICAgICBjb25zdCBjdXJyZW50UHJpbWFyeSA9IGF0dGFjaGVyc1tlbnRyeUluZGV4XVsxXTsKICAgICAgICAgICAgaWYgKGlzUGxhaW5PYmplY3QoY3VycmVudFByaW1hcnkpICYmIGlzUGxhaW5PYmplY3QocHJpbWFyeSkpIHsKICAgICAgICAgICAgICBwcmltYXJ5ID0gKDAsIGltcG9ydF9leHRlbmQuZGVmYXVsdCkodHJ1ZSwgY3VycmVudFByaW1hcnksIHByaW1hcnkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF0dGFjaGVyc1tlbnRyeUluZGV4XSA9IFtwbHVnaW4sIHByaW1hcnksIC4uLnJlc3RdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIHVuaWZpZWQgPSBuZXcgUHJvY2Vzc29yKCkuZnJlZXplKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS91bmlmaWVkQDExLjAuNS9ub2RlX21vZHVsZXMvdW5pZmllZC9pbmRleC5qcwp2YXIgaW5pdF91bmlmaWVkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdW5pZmllZEAxMS4wLjUvbm9kZV9tb2R1bGVzL3VuaWZpZWQvaW5kZXguanMiKCkgewogICAgaW5pdF9saWI1KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9jY291bnRAMi4wLjEvbm9kZV9tb2R1bGVzL2Njb3VudC9pbmRleC5qcwpmdW5jdGlvbiBjY291bnQodmFsdWUyLCBjaGFyYWN0ZXIpIHsKICBjb25zdCBzb3VyY2UgPSBTdHJpbmcodmFsdWUyKTsKICBpZiAodHlwZW9mIGNoYXJhY3RlciAhPT0gInN0cmluZyIpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGNoYXJhY3RlciIpOwogIH0KICBsZXQgY291bnQyID0gMDsKICBsZXQgaW5kZXgyID0gc291cmNlLmluZGV4T2YoY2hhcmFjdGVyKTsKICB3aGlsZSAoaW5kZXgyICE9PSAtMSkgewogICAgY291bnQyKys7CiAgICBpbmRleDIgPSBzb3VyY2UuaW5kZXhPZihjaGFyYWN0ZXIsIGluZGV4MiArIGNoYXJhY3Rlci5sZW5ndGgpOwogIH0KICByZXR1cm4gY291bnQyOwp9CnZhciBpbml0X2Njb3VudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2Njb3VudEAyLjAuMS9ub2RlX21vZHVsZXMvY2NvdW50L2luZGV4LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLWNoYXJhY3RlckAyLjEuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtY2hhcmFjdGVyL2luZGV4LmpzCmZ1bmN0aW9uIGFzY2lpQ29udHJvbChjb2RlNCkgewogIHJldHVybiAoCiAgICAvLyBTcGVjaWFsIHdoaXRlc3BhY2UgY29kZXMgKHdoaWNoIGhhdmUgbmVnYXRpdmUgdmFsdWVzKSwgQzAgYW5kIENvbnRyb2wKICAgIC8vIGNoYXJhY3RlciBERUwKICAgIGNvZGU0ICE9PSBudWxsICYmIChjb2RlNCA8IDMyIHx8IGNvZGU0ID09PSAxMjcpCiAgKTsKfQpmdW5jdGlvbiBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpIHsKICByZXR1cm4gY29kZTQgIT09IG51bGwgJiYgY29kZTQgPCAtMjsKfQpmdW5jdGlvbiBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSB7CiAgcmV0dXJuIGNvZGU0ICE9PSBudWxsICYmIChjb2RlNCA8IDAgfHwgY29kZTQgPT09IDMyKTsKfQpmdW5jdGlvbiBtYXJrZG93blNwYWNlKGNvZGU0KSB7CiAgcmV0dXJuIGNvZGU0ID09PSAtMiB8fCBjb2RlNCA9PT0gLTEgfHwgY29kZTQgPT09IDMyOwp9CmZ1bmN0aW9uIHJlZ2V4Q2hlY2socmVnZXgpIHsKICByZXR1cm4gY2hlY2s7CiAgZnVuY3Rpb24gY2hlY2soY29kZTQpIHsKICAgIHJldHVybiBjb2RlNCAhPT0gbnVsbCAmJiBjb2RlNCA+IC0xICYmIHJlZ2V4LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlNCkpOwogIH0KfQp2YXIgYXNjaWlBbHBoYSwgYXNjaWlBbHBoYW51bWVyaWMsIGFzY2lpQXRleHQsIGFzY2lpRGlnaXQsIGFzY2lpSGV4RGlnaXQsIGFzY2lpUHVuY3R1YXRpb24sIHVuaWNvZGVQdW5jdHVhdGlvbiwgdW5pY29kZVdoaXRlc3BhY2U7CnZhciBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLWNoYXJhY3RlckAyLjEuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtY2hhcmFjdGVyL2luZGV4LmpzIigpIHsKICAgIGFzY2lpQWxwaGEgPSByZWdleENoZWNrKC9bQS1aYS16XS8pOwogICAgYXNjaWlBbHBoYW51bWVyaWMgPSByZWdleENoZWNrKC9bXGRBLVphLXpdLyk7CiAgICBhc2NpaUF0ZXh0ID0gcmVnZXhDaGVjaygvWyMtJyorXC0tOT0/QS1aXi1+XS8pOwogICAgYXNjaWlEaWdpdCA9IHJlZ2V4Q2hlY2soL1xkLyk7CiAgICBhc2NpaUhleERpZ2l0ID0gcmVnZXhDaGVjaygvW1xkQS1GYS1mXS8pOwogICAgYXNjaWlQdW5jdHVhdGlvbiA9IHJlZ2V4Q2hlY2soL1shLS86LUBbLWB7LX5dLyk7CiAgICB1bmljb2RlUHVuY3R1YXRpb24gPSByZWdleENoZWNrKC9ccHtQfXxccHtTfS91KTsKICAgIHVuaWNvZGVXaGl0ZXNwYWNlID0gcmVnZXhDaGVjaygvXHMvKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtaXNANi4wLjEvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtaXMvbGliL2luZGV4LmpzCmZ1bmN0aW9uIGFueUZhY3RvcnkodGVzdHMpIHsKICBjb25zdCBjaGVja3MyID0gW107CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHRlc3RzLmxlbmd0aCkgewogICAgY2hlY2tzMltpbmRleDJdID0gY29udmVydCh0ZXN0c1tpbmRleDJdKTsKICB9CiAgcmV0dXJuIGNhc3RGYWN0b3J5KGFueSk7CiAgZnVuY3Rpb24gYW55KC4uLnBhcmFtZXRlcnMpIHsKICAgIGxldCBpbmRleDMgPSAtMTsKICAgIHdoaWxlICgrK2luZGV4MyA8IGNoZWNrczIubGVuZ3RoKSB7CiAgICAgIGlmIChjaGVja3MyW2luZGV4M10uYXBwbHkodGhpcywgcGFyYW1ldGVycykpIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KfQpmdW5jdGlvbiBwcm9wZXJ0aWVzRmFjdG9yeShjaGVjaykgewogIGNvbnN0IGNoZWNrQXNSZWNvcmQgPSAoCiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLwogICAgY2hlY2sKICApOwogIHJldHVybiBjYXN0RmFjdG9yeShhbGwzKTsKICBmdW5jdGlvbiBhbGwzKG5vZGUyKSB7CiAgICBjb25zdCBub2RlQXNSZWNvcmQgPSAoCiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovCiAgICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi8KICAgICAgbm9kZTIKICAgICk7CiAgICBsZXQga2V5MjsKICAgIGZvciAoa2V5MiBpbiBjaGVjaykgewogICAgICBpZiAobm9kZUFzUmVjb3JkW2tleTJdICE9PSBjaGVja0FzUmVjb3JkW2tleTJdKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KZnVuY3Rpb24gdHlwZUZhY3RvcnkoY2hlY2spIHsKICByZXR1cm4gY2FzdEZhY3RvcnkodHlwZTUpOwogIGZ1bmN0aW9uIHR5cGU1KG5vZGUyKSB7CiAgICByZXR1cm4gbm9kZTIgJiYgbm9kZTIudHlwZSA9PT0gY2hlY2s7CiAgfQp9CmZ1bmN0aW9uIGNhc3RGYWN0b3J5KHRlc3RGdW5jdGlvbikgewogIHJldHVybiBjaGVjazsKICBmdW5jdGlvbiBjaGVjayh2YWx1ZTIsIGluZGV4MiwgcGFyZW50KSB7CiAgICByZXR1cm4gQm9vbGVhbigKICAgICAgbG9va3NMaWtlQU5vZGUodmFsdWUyKSAmJiB0ZXN0RnVuY3Rpb24uY2FsbCgKICAgICAgICB0aGlzLAogICAgICAgIHZhbHVlMiwKICAgICAgICB0eXBlb2YgaW5kZXgyID09PSAibnVtYmVyIiA/IGluZGV4MiA6IHZvaWQgMCwKICAgICAgICBwYXJlbnQgfHwgdm9pZCAwCiAgICAgICkKICAgICk7CiAgfQp9CmZ1bmN0aW9uIG9rMigpIHsKICByZXR1cm4gdHJ1ZTsKfQpmdW5jdGlvbiBsb29rc0xpa2VBTm9kZSh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZTIgPT09ICJvYmplY3QiICYmICJ0eXBlIiBpbiB2YWx1ZTI7Cn0KdmFyIGlzLCBjb252ZXJ0Owp2YXIgaW5pdF9saWI2ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdW5pc3QtdXRpbC1pc0A2LjAuMS9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC1pcy9saWIvaW5kZXguanMiKCkgewogICAgaXMgPSAvLyBOb3RlOiBvdmVybG9hZHMgaW4gSlNEb2MgY2Fu4oCZdCB5ZXQgdXNlIGRpZmZlcmVudCBgQHRlbXBsYXRlYHMuCiAgICAvKioKICAgICAqIEB0eXBlIHsoCiAgICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxzdHJpbmc+Pihub2RlOiB1bmtub3duLCB0ZXN0OiBDb25kaXRpb24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIHt0eXBlOiBDb25kaXRpb25bbnVtYmVyXX0pICYKICAgICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBBcnJheTxzdHJpbmc+Pihub2RlOiB1bmtub3duLCB0ZXN0OiBDb25kaXRpb24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSAmIHt0eXBlOiBDb25kaXRpb25bbnVtYmVyXX0pICYKICAgICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBzdHJpbmc+KG5vZGU6IHVua25vd24sIHRlc3Q6IENvbmRpdGlvbiwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYge3R5cGU6IENvbmRpdGlvbn0pICYKICAgICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBQcm9wcz4obm9kZTogdW5rbm93biwgdGVzdDogQ29uZGl0aW9uLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBDb25kaXRpb24pICYKICAgICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBUZXN0RnVuY3Rpb24+KG5vZGU6IHVua25vd24sIHRlc3Q6IENvbmRpdGlvbiwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYgUHJlZGljYXRlPENvbmRpdGlvbiwgTm9kZT4pICYKICAgICAqICAgKChub2RlPzogbnVsbCB8IHVuZGVmaW5lZCkgPT4gZmFsc2UpICYKICAgICAqICAgKChub2RlOiB1bmtub3duLCB0ZXN0PzogbnVsbCB8IHVuZGVmaW5lZCwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlKSAmCiAgICAgKiAgICgobm9kZTogdW5rbm93biwgdGVzdD86IFRlc3QsIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IGJvb2xlYW4pCiAgICAgKiApfQogICAgICovCiAgICAvKioKICAgICAqIEBwYXJhbSB7dW5rbm93bn0gW25vZGVdCiAgICAgKiBAcGFyYW0ge1Rlc3R9IFt0ZXN0XQogICAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBbaW5kZXhdCiAgICAgKiBAcGFyYW0ge1BhcmVudCB8IG51bGwgfCB1bmRlZmluZWR9IFtwYXJlbnRdCiAgICAgKiBAcGFyYW0ge3Vua25vd259IFtjb250ZXh0XQogICAgICogQHJldHVybnMge2Jvb2xlYW59CiAgICAgKi8KICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zCiAgICAoZnVuY3Rpb24obm9kZTIsIHRlc3QsIGluZGV4MiwgcGFyZW50LCBjb250ZXh0MikgewogICAgICBjb25zdCBjaGVjayA9IGNvbnZlcnQodGVzdCk7CiAgICAgIGlmIChpbmRleDIgIT09IHZvaWQgMCAmJiBpbmRleDIgIT09IG51bGwgJiYgKHR5cGVvZiBpbmRleDIgIT09ICJudW1iZXIiIHx8IGluZGV4MiA8IDAgfHwgaW5kZXgyID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBwb3NpdGl2ZSBmaW5pdGUgaW5kZXgiKTsKICAgICAgfQogICAgICBpZiAocGFyZW50ICE9PSB2b2lkIDAgJiYgcGFyZW50ICE9PSBudWxsICYmICghaXMocGFyZW50KSB8fCAhcGFyZW50LmNoaWxkcmVuKSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgcGFyZW50IG5vZGUiKTsKICAgICAgfQogICAgICBpZiAoKHBhcmVudCA9PT0gdm9pZCAwIHx8IHBhcmVudCA9PT0gbnVsbCkgIT09IChpbmRleDIgPT09IHZvaWQgMCB8fCBpbmRleDIgPT09IG51bGwpKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBib3RoIHBhcmVudCBhbmQgaW5kZXgiKTsKICAgICAgfQogICAgICByZXR1cm4gbG9va3NMaWtlQU5vZGUobm9kZTIpID8gY2hlY2suY2FsbChjb250ZXh0Miwgbm9kZTIsIGluZGV4MiwgcGFyZW50KSA6IGZhbHNlOwogICAgfSk7CiAgICBjb252ZXJ0ID0gLy8gTm90ZTogb3ZlcmxvYWRzIGluIEpTRG9jIGNhbuKAmXQgeWV0IHVzZSBkaWZmZXJlbnQgYEB0ZW1wbGF0ZWBzLgogICAgLyoqCiAgICAgKiBAdHlwZSB7KAogICAgICogICAoPENvbmRpdGlvbiBleHRlbmRzIHN0cmluZz4odGVzdDogQ29uZGl0aW9uKSA9PiAobm9kZTogdW5rbm93biwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYge3R5cGU6IENvbmRpdGlvbn0pICYKICAgICAqICAgKDxDb25kaXRpb24gZXh0ZW5kcyBQcm9wcz4odGVzdDogQ29uZGl0aW9uKSA9PiAobm9kZTogdW5rbm93biwgaW5kZXg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJlbnQ/OiBQYXJlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBjb250ZXh0PzogdW5rbm93bikgPT4gbm9kZSBpcyBOb2RlICYgQ29uZGl0aW9uKSAmCiAgICAgKiAgICg8Q29uZGl0aW9uIGV4dGVuZHMgVGVzdEZ1bmN0aW9uPih0ZXN0OiBDb25kaXRpb24pID0+IChub2RlOiB1bmtub3duLCBpbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHBhcmVudD86IFBhcmVudCB8IG51bGwgfCB1bmRlZmluZWQsIGNvbnRleHQ/OiB1bmtub3duKSA9PiBub2RlIGlzIE5vZGUgJiBQcmVkaWNhdGU8Q29uZGl0aW9uLCBOb2RlPikgJgogICAgICogICAoKHRlc3Q/OiBudWxsIHwgdW5kZWZpbmVkKSA9PiAobm9kZT86IHVua25vd24sIGluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcGFyZW50PzogUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZCwgY29udGV4dD86IHVua25vd24pID0+IG5vZGUgaXMgTm9kZSkgJgogICAgICogICAoKHRlc3Q/OiBUZXN0KSA9PiBDaGVjaykKICAgICAqICl9CiAgICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHtUZXN0fSBbdGVzdF0KICAgICAqIEByZXR1cm5zIHtDaGVja30KICAgICAqLwogICAgKGZ1bmN0aW9uKHRlc3QpIHsKICAgICAgaWYgKHRlc3QgPT09IG51bGwgfHwgdGVzdCA9PT0gdm9pZCAwKSB7CiAgICAgICAgcmV0dXJuIG9rMjsKICAgICAgfQogICAgICBpZiAodHlwZW9mIHRlc3QgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICByZXR1cm4gY2FzdEZhY3RvcnkodGVzdCk7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiB0ZXN0ID09PSAib2JqZWN0IikgewogICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRlc3QpID8gYW55RmFjdG9yeSh0ZXN0KSA6ICgKICAgICAgICAgIC8vIENhc3QgYmVjYXVzZSBgUmVhZG9ubHlBcnJheWAgZ29lcyBpbnRvIHRoZSBhYm92ZSBidXQgYGlzQXJyYXlgCiAgICAgICAgICAvLyBuYXJyb3dzIHRvIGBBcnJheWAuCiAgICAgICAgICBwcm9wZXJ0aWVzRmFjdG9yeSgKICAgICAgICAgICAgLyoqIEB0eXBlIHtQcm9wc30gKi8KICAgICAgICAgICAgdGVzdAogICAgICAgICAgKQogICAgICAgICk7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiB0ZXN0ID09PSAic3RyaW5nIikgewogICAgICAgIHJldHVybiB0eXBlRmFjdG9yeSh0ZXN0KTsKICAgICAgfQogICAgICB0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGZ1bmN0aW9uLCBzdHJpbmcsIG9yIG9iamVjdCBhcyB0ZXN0Iik7CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtaXNANi4wLjEvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtaXMvaW5kZXguanMKdmFyIGluaXRfdW5pc3RfdXRpbF9pcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtaXNANi4wLjEvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtaXMvaW5kZXguanMiKCkgewogICAgaW5pdF9saWI2KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXZpc2l0LXBhcmVudHNANi4wLjIvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cy9saWIvY29sb3IuanMKZnVuY3Rpb24gY29sb3IoZDYpIHsKICByZXR1cm4gZDY7Cn0KdmFyIGluaXRfY29sb3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXZpc2l0LXBhcmVudHNANi4wLjIvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cy9saWIvY29sb3IuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzQDYuMC4yL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0LXBhcmVudHMvbGliL2luZGV4LmpzCmZ1bmN0aW9uIHZpc2l0UGFyZW50cyh0cmVlLCB0ZXN0LCB2aXNpdG9yLCByZXZlcnNlKSB7CiAgbGV0IGNoZWNrOwogIGlmICh0eXBlb2YgdGVzdCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgdmlzaXRvciAhPT0gImZ1bmN0aW9uIikgewogICAgcmV2ZXJzZSA9IHZpc2l0b3I7CiAgICB2aXNpdG9yID0gdGVzdDsKICB9IGVsc2UgewogICAgY2hlY2sgPSB0ZXN0OwogIH0KICBjb25zdCBpczMgPSBjb252ZXJ0KGNoZWNrKTsKICBjb25zdCBzdGVwID0gcmV2ZXJzZSA/IC0xIDogMTsKICBmYWN0b3J5KHRyZWUsIHZvaWQgMCwgW10pKCk7CiAgZnVuY3Rpb24gZmFjdG9yeShub2RlMiwgaW5kZXgyLCBwYXJlbnRzKSB7CiAgICBjb25zdCB2YWx1ZTIgPSAoCiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovCiAgICAgIG5vZGUyICYmIHR5cGVvZiBub2RlMiA9PT0gIm9iamVjdCIgPyBub2RlMiA6IHt9CiAgICApOwogICAgaWYgKHR5cGVvZiB2YWx1ZTIudHlwZSA9PT0gInN0cmluZyIpIHsKICAgICAgY29uc3QgbmFtZSA9ICgKICAgICAgICAvLyBgaGFzdGAKICAgICAgICB0eXBlb2YgdmFsdWUyLnRhZ05hbWUgPT09ICJzdHJpbmciID8gdmFsdWUyLnRhZ05hbWUgOiAoCiAgICAgICAgICAvLyBgeGFzdGAKICAgICAgICAgIHR5cGVvZiB2YWx1ZTIubmFtZSA9PT0gInN0cmluZyIgPyB2YWx1ZTIubmFtZSA6IHZvaWQgMAogICAgICAgICkKICAgICAgKTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZpc2l0MiwgIm5hbWUiLCB7CiAgICAgICAgdmFsdWU6ICJub2RlICgiICsgY29sb3Iobm9kZTIudHlwZSArIChuYW1lID8gIjwiICsgbmFtZSArICI+IiA6ICIiKSkgKyAiKSIKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gdmlzaXQyOwogICAgZnVuY3Rpb24gdmlzaXQyKCkgewogICAgICBsZXQgcmVzdWx0ID0gZW1wdHkyOwogICAgICBsZXQgc3VicmVzdWx0OwogICAgICBsZXQgb2Zmc2V0OwogICAgICBsZXQgZ3JhbmRwYXJlbnRzOwogICAgICBpZiAoIXRlc3QgfHwgaXMzKG5vZGUyLCBpbmRleDIsIHBhcmVudHNbcGFyZW50cy5sZW5ndGggLSAxXSB8fCB2b2lkIDApKSB7CiAgICAgICAgcmVzdWx0ID0gdG9SZXN1bHQodmlzaXRvcihub2RlMiwgcGFyZW50cykpOwogICAgICAgIGlmIChyZXN1bHRbMF0gPT09IEVYSVQpIHsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICgiY2hpbGRyZW4iIGluIG5vZGUyICYmIG5vZGUyLmNoaWxkcmVuKSB7CiAgICAgICAgY29uc3Qgbm9kZUFzUGFyZW50ID0gKAogICAgICAgICAgLyoqIEB0eXBlIHtVbmlzdFBhcmVudH0gKi8KICAgICAgICAgIG5vZGUyCiAgICAgICAgKTsKICAgICAgICBpZiAobm9kZUFzUGFyZW50LmNoaWxkcmVuICYmIHJlc3VsdFswXSAhPT0gU0tJUCkgewogICAgICAgICAgb2Zmc2V0ID0gKHJldmVyc2UgPyBub2RlQXNQYXJlbnQuY2hpbGRyZW4ubGVuZ3RoIDogLTEpICsgc3RlcDsKICAgICAgICAgIGdyYW5kcGFyZW50cyA9IHBhcmVudHMuY29uY2F0KG5vZGVBc1BhcmVudCk7CiAgICAgICAgICB3aGlsZSAob2Zmc2V0ID4gLTEgJiYgb2Zmc2V0IDwgbm9kZUFzUGFyZW50LmNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICBjb25zdCBjaGlsZCA9IG5vZGVBc1BhcmVudC5jaGlsZHJlbltvZmZzZXRdOwogICAgICAgICAgICBzdWJyZXN1bHQgPSBmYWN0b3J5KGNoaWxkLCBvZmZzZXQsIGdyYW5kcGFyZW50cykoKTsKICAgICAgICAgICAgaWYgKHN1YnJlc3VsdFswXSA9PT0gRVhJVCkgewogICAgICAgICAgICAgIHJldHVybiBzdWJyZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2Zmc2V0ID0gdHlwZW9mIHN1YnJlc3VsdFsxXSA9PT0gIm51bWJlciIgPyBzdWJyZXN1bHRbMV0gOiBvZmZzZXQgKyBzdGVwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogIH0KfQpmdW5jdGlvbiB0b1Jlc3VsdCh2YWx1ZTIpIHsKICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZTIpKSB7CiAgICByZXR1cm4gdmFsdWUyOwogIH0KICBpZiAodHlwZW9mIHZhbHVlMiA9PT0gIm51bWJlciIpIHsKICAgIHJldHVybiBbQ09OVElOVUUsIHZhbHVlMl07CiAgfQogIHJldHVybiB2YWx1ZTIgPT09IG51bGwgfHwgdmFsdWUyID09PSB2b2lkIDAgPyBlbXB0eTIgOiBbdmFsdWUyXTsKfQp2YXIgZW1wdHkyLCBDT05USU5VRSwgRVhJVCwgU0tJUDsKdmFyIGluaXRfbGliNyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50c0A2LjAuMi9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzL2xpYi9pbmRleC5qcyIoKSB7CiAgICBpbml0X3VuaXN0X3V0aWxfaXMoKTsKICAgIGluaXRfY29sb3IoKTsKICAgIGVtcHR5MiA9IFtdOwogICAgQ09OVElOVUUgPSB0cnVlOwogICAgRVhJVCA9IGZhbHNlOwogICAgU0tJUCA9ICJza2lwIjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50c0A2LjAuMi9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzL2luZGV4LmpzCnZhciBpbml0X3VuaXN0X3V0aWxfdmlzaXRfcGFyZW50cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50c0A2LjAuMi9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliNygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1maW5kLWFuZC1yZXBsYWNlQDMuMC4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWZpbmQtYW5kLXJlcGxhY2UvbGliL2luZGV4LmpzCmZ1bmN0aW9uIGZpbmRBbmRSZXBsYWNlKHRyZWUsIGxpc3Q1LCBvcHRpb25zKSB7CiAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9OwogIGNvbnN0IGlnbm9yZWQgPSBjb252ZXJ0KHNldHRpbmdzLmlnbm9yZSB8fCBbXSk7CiAgY29uc3QgcGFpcnMyID0gdG9QYWlycyhsaXN0NSk7CiAgbGV0IHBhaXJJbmRleCA9IC0xOwogIHdoaWxlICgrK3BhaXJJbmRleCA8IHBhaXJzMi5sZW5ndGgpIHsKICAgIHZpc2l0UGFyZW50cyh0cmVlLCAidGV4dCIsIHZpc2l0b3IpOwogIH0KICBmdW5jdGlvbiB2aXNpdG9yKG5vZGUyLCBwYXJlbnRzKSB7CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICBsZXQgZ3JhbmRwYXJlbnQ7CiAgICB3aGlsZSAoKytpbmRleDIgPCBwYXJlbnRzLmxlbmd0aCkgewogICAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRzW2luZGV4Ml07CiAgICAgIGNvbnN0IHNpYmxpbmdzMiA9IGdyYW5kcGFyZW50ID8gZ3JhbmRwYXJlbnQuY2hpbGRyZW4gOiB2b2lkIDA7CiAgICAgIGlmIChpZ25vcmVkKAogICAgICAgIHBhcmVudCwKICAgICAgICBzaWJsaW5nczIgPyBzaWJsaW5nczIuaW5kZXhPZihwYXJlbnQpIDogdm9pZCAwLAogICAgICAgIGdyYW5kcGFyZW50CiAgICAgICkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZ3JhbmRwYXJlbnQgPSBwYXJlbnQ7CiAgICB9CiAgICBpZiAoZ3JhbmRwYXJlbnQpIHsKICAgICAgcmV0dXJuIGhhbmRsZXIyKG5vZGUyLCBwYXJlbnRzKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gaGFuZGxlcjIobm9kZTIsIHBhcmVudHMpIHsKICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudHNbcGFyZW50cy5sZW5ndGggLSAxXTsKICAgIGNvbnN0IGZpbmQzID0gcGFpcnMyW3BhaXJJbmRleF1bMF07CiAgICBjb25zdCByZXBsYWNlNSA9IHBhaXJzMltwYWlySW5kZXhdWzFdOwogICAgbGV0IHN0YXJ0ID0gMDsKICAgIGNvbnN0IHNpYmxpbmdzMiA9IHBhcmVudC5jaGlsZHJlbjsKICAgIGNvbnN0IGluZGV4MiA9IHNpYmxpbmdzMi5pbmRleE9mKG5vZGUyKTsKICAgIGxldCBjaGFuZ2UgPSBmYWxzZTsKICAgIGxldCBub2RlcyA9IFtdOwogICAgZmluZDMubGFzdEluZGV4ID0gMDsKICAgIGxldCBtYXRjaDIgPSBmaW5kMy5leGVjKG5vZGUyLnZhbHVlKTsKICAgIHdoaWxlIChtYXRjaDIpIHsKICAgICAgY29uc3QgcG9zaXRpb24zID0gbWF0Y2gyLmluZGV4OwogICAgICBjb25zdCBtYXRjaE9iamVjdCA9IHsKICAgICAgICBpbmRleDogbWF0Y2gyLmluZGV4LAogICAgICAgIGlucHV0OiBtYXRjaDIuaW5wdXQsCiAgICAgICAgc3RhY2s6IFsuLi5wYXJlbnRzLCBub2RlMl0KICAgICAgfTsKICAgICAgbGV0IHZhbHVlMiA9IHJlcGxhY2U1KC4uLm1hdGNoMiwgbWF0Y2hPYmplY3QpOwogICAgICBpZiAodHlwZW9mIHZhbHVlMiA9PT0gInN0cmluZyIpIHsKICAgICAgICB2YWx1ZTIgPSB2YWx1ZTIubGVuZ3RoID4gMCA/IHsgdHlwZTogInRleHQiLCB2YWx1ZTogdmFsdWUyIH0gOiB2b2lkIDA7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlMiA9PT0gZmFsc2UpIHsKICAgICAgICBmaW5kMy5sYXN0SW5kZXggPSBwb3NpdGlvbjMgKyAxOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChzdGFydCAhPT0gcG9zaXRpb24zKSB7CiAgICAgICAgICBub2Rlcy5wdXNoKHsKICAgICAgICAgICAgdHlwZTogInRleHQiLAogICAgICAgICAgICB2YWx1ZTogbm9kZTIudmFsdWUuc2xpY2Uoc3RhcnQsIHBvc2l0aW9uMykKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZTIpKSB7CiAgICAgICAgICBub2Rlcy5wdXNoKC4uLnZhbHVlMik7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZTIpIHsKICAgICAgICAgIG5vZGVzLnB1c2godmFsdWUyKTsKICAgICAgICB9CiAgICAgICAgc3RhcnQgPSBwb3NpdGlvbjMgKyBtYXRjaDJbMF0ubGVuZ3RoOwogICAgICAgIGNoYW5nZSA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKCFmaW5kMy5nbG9iYWwpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXRjaDIgPSBmaW5kMy5leGVjKG5vZGUyLnZhbHVlKTsKICAgIH0KICAgIGlmIChjaGFuZ2UpIHsKICAgICAgaWYgKHN0YXJ0IDwgbm9kZTIudmFsdWUubGVuZ3RoKSB7CiAgICAgICAgbm9kZXMucHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IG5vZGUyLnZhbHVlLnNsaWNlKHN0YXJ0KSB9KTsKICAgICAgfQogICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4MiwgMSwgLi4ubm9kZXMpOwogICAgfSBlbHNlIHsKICAgICAgbm9kZXMgPSBbbm9kZTJdOwogICAgfQogICAgcmV0dXJuIGluZGV4MiArIG5vZGVzLmxlbmd0aDsKICB9Cn0KZnVuY3Rpb24gdG9QYWlycyh0dXBsZU9yTGlzdCkgewogIGNvbnN0IHJlc3VsdCA9IFtdOwogIGlmICghQXJyYXkuaXNBcnJheSh0dXBsZU9yTGlzdCkpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGZpbmQgYW5kIHJlcGxhY2UgdHVwbGUgb3IgbGlzdCBvZiB0dXBsZXMiKTsKICB9CiAgY29uc3QgbGlzdDUgPSAhdHVwbGVPckxpc3RbMF0gfHwgQXJyYXkuaXNBcnJheSh0dXBsZU9yTGlzdFswXSkgPyB0dXBsZU9yTGlzdCA6IFt0dXBsZU9yTGlzdF07CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IGxpc3Q1Lmxlbmd0aCkgewogICAgY29uc3QgdHVwbGUgPSBsaXN0NVtpbmRleDJdOwogICAgcmVzdWx0LnB1c2goW3RvRXhwcmVzc2lvbih0dXBsZVswXSksIHRvRnVuY3Rpb24odHVwbGVbMV0pXSk7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gdG9FeHByZXNzaW9uKGZpbmQzKSB7CiAgcmV0dXJuIHR5cGVvZiBmaW5kMyA9PT0gInN0cmluZyIgPyBuZXcgUmVnRXhwKGVzY2FwZVN0cmluZ1JlZ2V4cChmaW5kMyksICJnIikgOiBmaW5kMzsKfQpmdW5jdGlvbiB0b0Z1bmN0aW9uKHJlcGxhY2U1KSB7CiAgcmV0dXJuIHR5cGVvZiByZXBsYWNlNSA9PT0gImZ1bmN0aW9uIiA/IHJlcGxhY2U1IDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gcmVwbGFjZTU7CiAgfTsKfQp2YXIgaW5pdF9saWI4ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1maW5kLWFuZC1yZXBsYWNlQDMuMC4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWZpbmQtYW5kLXJlcGxhY2UvbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfZXNjYXBlX3N0cmluZ19yZWdleHAoKTsKICAgIGluaXRfdW5pc3RfdXRpbF92aXNpdF9wYXJlbnRzKCk7CiAgICBpbml0X3VuaXN0X3V0aWxfaXMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZmluZC1hbmQtcmVwbGFjZUAzLjAuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1maW5kLWFuZC1yZXBsYWNlL2luZGV4LmpzCnZhciBpbml0X21kYXN0X3V0aWxfZmluZF9hbmRfcmVwbGFjZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZmluZC1hbmQtcmVwbGFjZUAzLjAuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1maW5kLWFuZC1yZXBsYWNlL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliOCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1nZm0tYXV0b2xpbmstbGl0ZXJhbEAyLjAuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0tYXV0b2xpbmstbGl0ZXJhbC9saWIvaW5kZXguanMKZnVuY3Rpb24gZ2ZtQXV0b2xpbmtMaXRlcmFsRnJvbU1hcmtkb3duKCkgewogIHJldHVybiB7CiAgICB0cmFuc2Zvcm1zOiBbdHJhbnNmb3JtR2ZtQXV0b2xpbmtMaXRlcmFsc10sCiAgICBlbnRlcjogewogICAgICBsaXRlcmFsQXV0b2xpbms6IGVudGVyTGl0ZXJhbEF1dG9saW5rLAogICAgICBsaXRlcmFsQXV0b2xpbmtFbWFpbDogZW50ZXJMaXRlcmFsQXV0b2xpbmtWYWx1ZSwKICAgICAgbGl0ZXJhbEF1dG9saW5rSHR0cDogZW50ZXJMaXRlcmFsQXV0b2xpbmtWYWx1ZSwKICAgICAgbGl0ZXJhbEF1dG9saW5rV3d3OiBlbnRlckxpdGVyYWxBdXRvbGlua1ZhbHVlCiAgICB9LAogICAgZXhpdDogewogICAgICBsaXRlcmFsQXV0b2xpbms6IGV4aXRMaXRlcmFsQXV0b2xpbmssCiAgICAgIGxpdGVyYWxBdXRvbGlua0VtYWlsOiBleGl0TGl0ZXJhbEF1dG9saW5rRW1haWwsCiAgICAgIGxpdGVyYWxBdXRvbGlua0h0dHA6IGV4aXRMaXRlcmFsQXV0b2xpbmtIdHRwLAogICAgICBsaXRlcmFsQXV0b2xpbmtXd3c6IGV4aXRMaXRlcmFsQXV0b2xpbmtXd3cKICAgIH0KICB9Owp9CmZ1bmN0aW9uIGdmbUF1dG9saW5rTGl0ZXJhbFRvTWFya2Rvd24oKSB7CiAgcmV0dXJuIHsKICAgIHVuc2FmZTogWwogICAgICB7CiAgICAgICAgY2hhcmFjdGVyOiAiQCIsCiAgICAgICAgYmVmb3JlOiAiWytcXC0uXFx3XSIsCiAgICAgICAgYWZ0ZXI6ICJbXFwtLlxcd10iLAogICAgICAgIGluQ29uc3RydWN0LAogICAgICAgIG5vdEluQ29uc3RydWN0CiAgICAgIH0sCiAgICAgIHsKICAgICAgICBjaGFyYWN0ZXI6ICIuIiwKICAgICAgICBiZWZvcmU6ICJbV3ddIiwKICAgICAgICBhZnRlcjogIltcXC0uXFx3XSIsCiAgICAgICAgaW5Db25zdHJ1Y3QsCiAgICAgICAgbm90SW5Db25zdHJ1Y3QKICAgICAgfSwKICAgICAgewogICAgICAgIGNoYXJhY3RlcjogIjoiLAogICAgICAgIGJlZm9yZTogIltwc10iLAogICAgICAgIGFmdGVyOiAiXFwvIiwKICAgICAgICBpbkNvbnN0cnVjdCwKICAgICAgICBub3RJbkNvbnN0cnVjdAogICAgICB9CiAgICBdCiAgfTsKfQpmdW5jdGlvbiBlbnRlckxpdGVyYWxBdXRvbGluayh0b2tlbikgewogIHRoaXMuZW50ZXIoeyB0eXBlOiAibGluayIsIHRpdGxlOiBudWxsLCB1cmw6ICIiLCBjaGlsZHJlbjogW10gfSwgdG9rZW4pOwp9CmZ1bmN0aW9uIGVudGVyTGl0ZXJhbEF1dG9saW5rVmFsdWUodG9rZW4pIHsKICB0aGlzLmNvbmZpZy5lbnRlci5hdXRvbGlua1Byb3RvY29sLmNhbGwodGhpcywgdG9rZW4pOwp9CmZ1bmN0aW9uIGV4aXRMaXRlcmFsQXV0b2xpbmtIdHRwKHRva2VuKSB7CiAgdGhpcy5jb25maWcuZXhpdC5hdXRvbGlua1Byb3RvY29sLmNhbGwodGhpcywgdG9rZW4pOwp9CmZ1bmN0aW9uIGV4aXRMaXRlcmFsQXV0b2xpbmtXd3codG9rZW4pIHsKICB0aGlzLmNvbmZpZy5leGl0LmRhdGEuY2FsbCh0aGlzLCB0b2tlbik7CiAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgb2sobm9kZTIudHlwZSA9PT0gImxpbmsiKTsKICBub2RlMi51cmwgPSAiaHR0cDovLyIgKyB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKfQpmdW5jdGlvbiBleGl0TGl0ZXJhbEF1dG9saW5rRW1haWwodG9rZW4pIHsKICB0aGlzLmNvbmZpZy5leGl0LmF1dG9saW5rRW1haWwuY2FsbCh0aGlzLCB0b2tlbik7Cn0KZnVuY3Rpb24gZXhpdExpdGVyYWxBdXRvbGluayh0b2tlbikgewogIHRoaXMuZXhpdCh0b2tlbik7Cn0KZnVuY3Rpb24gdHJhbnNmb3JtR2ZtQXV0b2xpbmtMaXRlcmFscyh0cmVlKSB7CiAgZmluZEFuZFJlcGxhY2UoCiAgICB0cmVlLAogICAgWwogICAgICBbLyhodHRwcz86XC9cL3x3d3coPz1cLikpKFstLlx3XSspKFteIFx0XHJcbl0qKS9naSwgZmluZFVybF0sCiAgICAgIFsvKD88PV58XHN8XHB7UH18XHB7U30pKFstLlx3K10rKUAoWy1cd10rKD86XC5bLVx3XSspKykvZ3UsIGZpbmRFbWFpbF0KICAgIF0sCiAgICB7IGlnbm9yZTogWyJsaW5rIiwgImxpbmtSZWZlcmVuY2UiXSB9CiAgKTsKfQpmdW5jdGlvbiBmaW5kVXJsKF81LCBwcm90b2NvbCwgZG9tYWluMiwgcGF0aDIsIG1hdGNoMikgewogIGxldCBwcmVmaXg0ID0gIiI7CiAgaWYgKCFwcmV2aW91cyhtYXRjaDIpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmICgvXncvaS50ZXN0KHByb3RvY29sKSkgewogICAgZG9tYWluMiA9IHByb3RvY29sICsgZG9tYWluMjsKICAgIHByb3RvY29sID0gIiI7CiAgICBwcmVmaXg0ID0gImh0dHA6Ly8iOwogIH0KICBpZiAoIWlzQ29ycmVjdERvbWFpbihkb21haW4yKSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjb25zdCBwYXJ0cyA9IHNwbGl0VXJsKGRvbWFpbjIgKyBwYXRoMik7CiAgaWYgKCFwYXJ0c1swXSkgcmV0dXJuIGZhbHNlOwogIGNvbnN0IHJlc3VsdCA9IHsKICAgIHR5cGU6ICJsaW5rIiwKICAgIHRpdGxlOiBudWxsLAogICAgdXJsOiBwcmVmaXg0ICsgcHJvdG9jb2wgKyBwYXJ0c1swXSwKICAgIGNoaWxkcmVuOiBbeyB0eXBlOiAidGV4dCIsIHZhbHVlOiBwcm90b2NvbCArIHBhcnRzWzBdIH1dCiAgfTsKICBpZiAocGFydHNbMV0pIHsKICAgIHJldHVybiBbcmVzdWx0LCB7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IHBhcnRzWzFdIH1dOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CmZ1bmN0aW9uIGZpbmRFbWFpbChfNSwgYXRleHQsIGxhYmVsLCBtYXRjaDIpIHsKICBpZiAoCiAgICAvLyBOb3QgYW4gZXhwZWN0ZWQgcHJldmlvdXMgY2hhcmFjdGVyLgogICAgIXByZXZpb3VzKG1hdGNoMiwgdHJ1ZSkgfHwgLy8gTGFiZWwgZW5kcyBpbiBub3QgYWxsb3dlZCBjaGFyYWN0ZXIuCiAgICAvWy1cZF9dJC8udGVzdChsYWJlbCkKICApIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIHsKICAgIHR5cGU6ICJsaW5rIiwKICAgIHRpdGxlOiBudWxsLAogICAgdXJsOiAibWFpbHRvOiIgKyBhdGV4dCArICJAIiArIGxhYmVsLAogICAgY2hpbGRyZW46IFt7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IGF0ZXh0ICsgIkAiICsgbGFiZWwgfV0KICB9Owp9CmZ1bmN0aW9uIGlzQ29ycmVjdERvbWFpbihkb21haW4yKSB7CiAgY29uc3QgcGFydHMgPSBkb21haW4yLnNwbGl0KCIuIik7CiAgaWYgKHBhcnRzLmxlbmd0aCA8IDIgfHwgcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gJiYgKC9fLy50ZXN0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKSB8fCAhL1thLXpBLVpcZF0vLnRlc3QocGFydHNbcGFydHMubGVuZ3RoIC0gMV0pKSB8fCBwYXJ0c1twYXJ0cy5sZW5ndGggLSAyXSAmJiAoL18vLnRlc3QocGFydHNbcGFydHMubGVuZ3RoIC0gMl0pIHx8ICEvW2EtekEtWlxkXS8udGVzdChwYXJ0c1twYXJ0cy5sZW5ndGggLSAyXSkpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIHNwbGl0VXJsKHVybCkgewogIGNvbnN0IHRyYWlsRXhlYyA9IC9bISImJyksLjo7PD4/XF19XSskLy5leGVjKHVybCk7CiAgaWYgKCF0cmFpbEV4ZWMpIHsKICAgIHJldHVybiBbdXJsLCB2b2lkIDBdOwogIH0KICB1cmwgPSB1cmwuc2xpY2UoMCwgdHJhaWxFeGVjLmluZGV4KTsKICBsZXQgdHJhaWwyID0gdHJhaWxFeGVjWzBdOwogIGxldCBjbG9zaW5nUGFyZW5JbmRleCA9IHRyYWlsMi5pbmRleE9mKCIpIik7CiAgY29uc3Qgb3BlbmluZ1BhcmVucyA9IGNjb3VudCh1cmwsICIoIik7CiAgbGV0IGNsb3NpbmdQYXJlbnMgPSBjY291bnQodXJsLCAiKSIpOwogIHdoaWxlIChjbG9zaW5nUGFyZW5JbmRleCAhPT0gLTEgJiYgb3BlbmluZ1BhcmVucyA+IGNsb3NpbmdQYXJlbnMpIHsKICAgIHVybCArPSB0cmFpbDIuc2xpY2UoMCwgY2xvc2luZ1BhcmVuSW5kZXggKyAxKTsKICAgIHRyYWlsMiA9IHRyYWlsMi5zbGljZShjbG9zaW5nUGFyZW5JbmRleCArIDEpOwogICAgY2xvc2luZ1BhcmVuSW5kZXggPSB0cmFpbDIuaW5kZXhPZigiKSIpOwogICAgY2xvc2luZ1BhcmVucysrOwogIH0KICByZXR1cm4gW3VybCwgdHJhaWwyXTsKfQpmdW5jdGlvbiBwcmV2aW91cyhtYXRjaDIsIGVtYWlsKSB7CiAgY29uc3QgY29kZTQgPSBtYXRjaDIuaW5wdXQuY2hhckNvZGVBdChtYXRjaDIuaW5kZXggLSAxKTsKICByZXR1cm4gKG1hdGNoMi5pbmRleCA9PT0gMCB8fCB1bmljb2RlV2hpdGVzcGFjZShjb2RlNCkgfHwgdW5pY29kZVB1bmN0dWF0aW9uKGNvZGU0KSkgJiYgLy8gSWYgaXTigJlzIGFuIGVtYWlsLCB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIHNob3VsZCBub3QgYmUgYSBzbGFzaC4KICAoIWVtYWlsIHx8IGNvZGU0ICE9PSA0Nyk7Cn0KdmFyIGluQ29uc3RydWN0LCBub3RJbkNvbnN0cnVjdDsKdmFyIGluaXRfbGliOSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLWF1dG9saW5rLWxpdGVyYWxAMi4wLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLWF1dG9saW5rLWxpdGVyYWwvbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfY2NvdW50KCk7CiAgICBpbml0X2RlZmF1bHQoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgICBpbml0X21kYXN0X3V0aWxfZmluZF9hbmRfcmVwbGFjZSgpOwogICAgaW5Db25zdHJ1Y3QgPSAicGhyYXNpbmciOwogICAgbm90SW5Db25zdHJ1Y3QgPSBbImF1dG9saW5rIiwgImxpbmsiLCAiaW1hZ2UiLCAibGFiZWwiXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLWF1dG9saW5rLWxpdGVyYWxAMi4wLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLWF1dG9saW5rLWxpdGVyYWwvaW5kZXguanMKdmFyIGluaXRfbWRhc3RfdXRpbF9nZm1fYXV0b2xpbmtfbGl0ZXJhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLWF1dG9saW5rLWxpdGVyYWxAMi4wLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLWF1dG9saW5rLWxpdGVyYWwvaW5kZXguanMiKCkgewogICAgaW5pdF9saWI5KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1ub3JtYWxpemUtaWRlbnRpZmllckAyLjAuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtbm9ybWFsaXplLWlkZW50aWZpZXIvaW5kZXguanMKZnVuY3Rpb24gbm9ybWFsaXplSWRlbnRpZmllcih2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyLnJlcGxhY2UoL1tcdFxuXHIgXSsvZywgIiAiKS5yZXBsYWNlKC9eIHwgJC9nLCAiIikudG9Mb3dlckNhc2UoKS50b1VwcGVyQ2FzZSgpOwp9CnZhciBpbml0X21pY3JvbWFya191dGlsX25vcm1hbGl6ZV9pZGVudGlmaWVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtbm9ybWFsaXplLWlkZW50aWZpZXJAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLW5vcm1hbGl6ZS1pZGVudGlmaWVyL2luZGV4LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLWZvb3Rub3RlQDIuMS4wL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS1mb290bm90ZS9saWIvaW5kZXguanMKZnVuY3Rpb24gZW50ZXJGb290bm90ZUNhbGxTdHJpbmcoKSB7CiAgdGhpcy5idWZmZXIoKTsKfQpmdW5jdGlvbiBlbnRlckZvb3Rub3RlQ2FsbCh0b2tlbikgewogIHRoaXMuZW50ZXIoeyB0eXBlOiAiZm9vdG5vdGVSZWZlcmVuY2UiLCBpZGVudGlmaWVyOiAiIiwgbGFiZWw6ICIiIH0sIHRva2VuKTsKfQpmdW5jdGlvbiBlbnRlckZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsU3RyaW5nKCkgewogIHRoaXMuYnVmZmVyKCk7Cn0KZnVuY3Rpb24gZW50ZXJGb290bm90ZURlZmluaXRpb24odG9rZW4pIHsKICB0aGlzLmVudGVyKAogICAgeyB0eXBlOiAiZm9vdG5vdGVEZWZpbml0aW9uIiwgaWRlbnRpZmllcjogIiIsIGxhYmVsOiAiIiwgY2hpbGRyZW46IFtdIH0sCiAgICB0b2tlbgogICk7Cn0KZnVuY3Rpb24gZXhpdEZvb3Rub3RlQ2FsbFN0cmluZyh0b2tlbikgewogIGNvbnN0IGxhYmVsID0gdGhpcy5yZXN1bWUoKTsKICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICBvayhub2RlMi50eXBlID09PSAiZm9vdG5vdGVSZWZlcmVuY2UiKTsKICBub2RlMi5pZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcigKICAgIHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pCiAgKS50b0xvd2VyQ2FzZSgpOwogIG5vZGUyLmxhYmVsID0gbGFiZWw7Cn0KZnVuY3Rpb24gZXhpdEZvb3Rub3RlQ2FsbCh0b2tlbikgewogIHRoaXMuZXhpdCh0b2tlbik7Cn0KZnVuY3Rpb24gZXhpdEZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsU3RyaW5nKHRva2VuKSB7CiAgY29uc3QgbGFiZWwgPSB0aGlzLnJlc3VtZSgpOwogIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogIG9rKG5vZGUyLnR5cGUgPT09ICJmb290bm90ZURlZmluaXRpb24iKTsKICBub2RlMi5pZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcigKICAgIHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pCiAgKS50b0xvd2VyQ2FzZSgpOwogIG5vZGUyLmxhYmVsID0gbGFiZWw7Cn0KZnVuY3Rpb24gZXhpdEZvb3Rub3RlRGVmaW5pdGlvbih0b2tlbikgewogIHRoaXMuZXhpdCh0b2tlbik7Cn0KZnVuY3Rpb24gZm9vdG5vdGVSZWZlcmVuY2VQZWVrKCkgewogIHJldHVybiAiWyI7Cn0KZnVuY3Rpb24gZm9vdG5vdGVSZWZlcmVuY2Uobm9kZTIsIF81LCBzdGF0ZTEwLCBpbmZvKSB7CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlMTAuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBsZXQgdmFsdWUyID0gdHJhY2tlci5tb3ZlKCJbXiIpOwogIGNvbnN0IGV4aXQzID0gc3RhdGUxMC5lbnRlcigiZm9vdG5vdGVSZWZlcmVuY2UiKTsKICBjb25zdCBzdWJleGl0ID0gc3RhdGUxMC5lbnRlcigicmVmZXJlbmNlIik7CiAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgKICAgIHN0YXRlMTAuc2FmZShzdGF0ZTEwLmFzc29jaWF0aW9uSWQobm9kZTIpLCB7IGFmdGVyOiAiXSIsIGJlZm9yZTogdmFsdWUyIH0pCiAgKTsKICBzdWJleGl0KCk7CiAgZXhpdDMoKTsKICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCJdIik7CiAgcmV0dXJuIHZhbHVlMjsKfQpmdW5jdGlvbiBnZm1Gb290bm90ZUZyb21NYXJrZG93bigpIHsKICByZXR1cm4gewogICAgZW50ZXI6IHsKICAgICAgZ2ZtRm9vdG5vdGVDYWxsU3RyaW5nOiBlbnRlckZvb3Rub3RlQ2FsbFN0cmluZywKICAgICAgZ2ZtRm9vdG5vdGVDYWxsOiBlbnRlckZvb3Rub3RlQ2FsbCwKICAgICAgZ2ZtRm9vdG5vdGVEZWZpbml0aW9uTGFiZWxTdHJpbmc6IGVudGVyRm9vdG5vdGVEZWZpbml0aW9uTGFiZWxTdHJpbmcsCiAgICAgIGdmbUZvb3Rub3RlRGVmaW5pdGlvbjogZW50ZXJGb290bm90ZURlZmluaXRpb24KICAgIH0sCiAgICBleGl0OiB7CiAgICAgIGdmbUZvb3Rub3RlQ2FsbFN0cmluZzogZXhpdEZvb3Rub3RlQ2FsbFN0cmluZywKICAgICAgZ2ZtRm9vdG5vdGVDYWxsOiBleGl0Rm9vdG5vdGVDYWxsLAogICAgICBnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZzogZXhpdEZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsU3RyaW5nLAogICAgICBnZm1Gb290bm90ZURlZmluaXRpb246IGV4aXRGb290bm90ZURlZmluaXRpb24KICAgIH0KICB9Owp9CmZ1bmN0aW9uIGdmbUZvb3Rub3RlVG9NYXJrZG93bihvcHRpb25zKSB7CiAgbGV0IGZpcnN0TGluZUJsYW5rID0gZmFsc2U7CiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5maXJzdExpbmVCbGFuaykgewogICAgZmlyc3RMaW5lQmxhbmsgPSB0cnVlOwogIH0KICByZXR1cm4gewogICAgaGFuZGxlcnM6IHsgZm9vdG5vdGVEZWZpbml0aW9uLCBmb290bm90ZVJlZmVyZW5jZSB9LAogICAgLy8gVGhpcyBpcyBvbiBieSBkZWZhdWx0IGFscmVhZHkuCiAgICB1bnNhZmU6IFt7IGNoYXJhY3RlcjogIlsiLCBpbkNvbnN0cnVjdDogWyJsYWJlbCIsICJwaHJhc2luZyIsICJyZWZlcmVuY2UiXSB9XQogIH07CiAgZnVuY3Rpb24gZm9vdG5vdGVEZWZpbml0aW9uKG5vZGUyLCBfNSwgc3RhdGUxMCwgaW5mbykgewogICAgY29uc3QgdHJhY2tlciA9IHN0YXRlMTAuY3JlYXRlVHJhY2tlcihpbmZvKTsKICAgIGxldCB2YWx1ZTIgPSB0cmFja2VyLm1vdmUoIlteIik7CiAgICBjb25zdCBleGl0MyA9IHN0YXRlMTAuZW50ZXIoImZvb3Rub3RlRGVmaW5pdGlvbiIpOwogICAgY29uc3Qgc3ViZXhpdCA9IHN0YXRlMTAuZW50ZXIoImxhYmVsIik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZTEwLnNhZmUoc3RhdGUxMC5hc3NvY2lhdGlvbklkKG5vZGUyKSwgeyBiZWZvcmU6IHZhbHVlMiwgYWZ0ZXI6ICJdIiB9KQogICAgKTsKICAgIHN1YmV4aXQoKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIl06Iik7CiAgICBpZiAobm9kZTIuY2hpbGRyZW4gJiYgbm9kZTIuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICB0cmFja2VyLnNoaWZ0KDQpOwogICAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICAgIChmaXJzdExpbmVCbGFuayA/ICJcbiIgOiAiICIpICsgc3RhdGUxMC5pbmRlbnRMaW5lcygKICAgICAgICAgIHN0YXRlMTAuY29udGFpbmVyRmxvdyhub2RlMiwgdHJhY2tlci5jdXJyZW50KCkpLAogICAgICAgICAgZmlyc3RMaW5lQmxhbmsgPyBtYXBBbGwgOiBtYXBFeGNlcHRGaXJzdAogICAgICAgICkKICAgICAgKTsKICAgIH0KICAgIGV4aXQzKCk7CiAgICByZXR1cm4gdmFsdWUyOwogIH0KfQpmdW5jdGlvbiBtYXBFeGNlcHRGaXJzdChsaW5lLCBpbmRleDIsIGJsYW5rKSB7CiAgcmV0dXJuIGluZGV4MiA9PT0gMCA/IGxpbmUgOiBtYXBBbGwobGluZSwgaW5kZXgyLCBibGFuayk7Cn0KZnVuY3Rpb24gbWFwQWxsKGxpbmUsIGluZGV4MiwgYmxhbmspIHsKICByZXR1cm4gKGJsYW5rID8gIiIgOiAiICAgICIpICsgbGluZTsKfQp2YXIgaW5pdF9saWIxMCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLWZvb3Rub3RlQDIuMS4wL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS1mb290bm90ZS9saWIvaW5kZXguanMiKCkgewogICAgaW5pdF9kZWZhdWx0KCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX25vcm1hbGl6ZV9pZGVudGlmaWVyKCk7CiAgICBmb290bm90ZVJlZmVyZW5jZS5wZWVrID0gZm9vdG5vdGVSZWZlcmVuY2VQZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1nZm0tZm9vdG5vdGVAMi4xLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLWZvb3Rub3RlL2luZGV4LmpzCnZhciBpbml0X21kYXN0X3V0aWxfZ2ZtX2Zvb3Rub3RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1nZm0tZm9vdG5vdGVAMi4xLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLWZvb3Rub3RlL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliMTAoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLXN0cmlrZXRocm91Z2hAMi4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXN0cmlrZXRocm91Z2gvbGliL2luZGV4LmpzCmZ1bmN0aW9uIGdmbVN0cmlrZXRocm91Z2hGcm9tTWFya2Rvd24oKSB7CiAgcmV0dXJuIHsKICAgIGNhbkNvbnRhaW5Fb2xzOiBbImRlbGV0ZSJdLAogICAgZW50ZXI6IHsgc3RyaWtldGhyb3VnaDogZW50ZXJTdHJpa2V0aHJvdWdoIH0sCiAgICBleGl0OiB7IHN0cmlrZXRocm91Z2g6IGV4aXRTdHJpa2V0aHJvdWdoIH0KICB9Owp9CmZ1bmN0aW9uIGdmbVN0cmlrZXRocm91Z2hUb01hcmtkb3duKCkgewogIHJldHVybiB7CiAgICB1bnNhZmU6IFsKICAgICAgewogICAgICAgIGNoYXJhY3RlcjogIn4iLAogICAgICAgIGluQ29uc3RydWN0OiAicGhyYXNpbmciLAogICAgICAgIG5vdEluQ29uc3RydWN0OiBjb25zdHJ1Y3RzV2l0aG91dFN0cmlrZXRocm91Z2gKICAgICAgfQogICAgXSwKICAgIGhhbmRsZXJzOiB7IGRlbGV0ZTogaGFuZGxlRGVsZXRlIH0KICB9Owp9CmZ1bmN0aW9uIGVudGVyU3RyaWtldGhyb3VnaCh0b2tlbikgewogIHRoaXMuZW50ZXIoeyB0eXBlOiAiZGVsZXRlIiwgY2hpbGRyZW46IFtdIH0sIHRva2VuKTsKfQpmdW5jdGlvbiBleGl0U3RyaWtldGhyb3VnaCh0b2tlbikgewogIHRoaXMuZXhpdCh0b2tlbik7Cn0KZnVuY3Rpb24gaGFuZGxlRGVsZXRlKG5vZGUyLCBfNSwgc3RhdGUxMCwgaW5mbykgewogIGNvbnN0IHRyYWNrZXIgPSBzdGF0ZTEwLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgY29uc3QgZXhpdDMgPSBzdGF0ZTEwLmVudGVyKCJzdHJpa2V0aHJvdWdoIik7CiAgbGV0IHZhbHVlMiA9IHRyYWNrZXIubW92ZSgifn4iKTsKICB2YWx1ZTIgKz0gc3RhdGUxMC5jb250YWluZXJQaHJhc2luZyhub2RlMiwgewogICAgLi4udHJhY2tlci5jdXJyZW50KCksCiAgICBiZWZvcmU6IHZhbHVlMiwKICAgIGFmdGVyOiAifiIKICB9KTsKICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCJ+fiIpOwogIGV4aXQzKCk7CiAgcmV0dXJuIHZhbHVlMjsKfQpmdW5jdGlvbiBwZWVrRGVsZXRlKCkgewogIHJldHVybiAifiI7Cn0KdmFyIGNvbnN0cnVjdHNXaXRob3V0U3RyaWtldGhyb3VnaDsKdmFyIGluaXRfbGliMTEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWdmbS1zdHJpa2V0aHJvdWdoQDIuMC4wL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS1zdHJpa2V0aHJvdWdoL2xpYi9pbmRleC5qcyIoKSB7CiAgICBjb25zdHJ1Y3RzV2l0aG91dFN0cmlrZXRocm91Z2ggPSBbCiAgICAgICJhdXRvbGluayIsCiAgICAgICJkZXN0aW5hdGlvbkxpdGVyYWwiLAogICAgICAiZGVzdGluYXRpb25SYXciLAogICAgICAicmVmZXJlbmNlIiwKICAgICAgInRpdGxlUXVvdGUiLAogICAgICAidGl0bGVBcG9zdHJvcGhlIgogICAgXTsKICAgIGhhbmRsZURlbGV0ZS5wZWVrID0gcGVla0RlbGV0ZTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLXN0cmlrZXRocm91Z2hAMi4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXN0cmlrZXRocm91Z2gvaW5kZXguanMKdmFyIGluaXRfbWRhc3RfdXRpbF9nZm1fc3RyaWtldGhyb3VnaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtLXN0cmlrZXRocm91Z2hAMi4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXN0cmlrZXRocm91Z2gvaW5kZXguanMiKCkgewogICAgaW5pdF9saWIxMSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWFya2Rvd24tdGFibGVAMy4wLjQvbm9kZV9tb2R1bGVzL21hcmtkb3duLXRhYmxlL2luZGV4LmpzCmZ1bmN0aW9uIGRlZmF1bHRTdHJpbmdMZW5ndGgodmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMi5sZW5ndGg7Cn0KZnVuY3Rpb24gbWFya2Rvd25UYWJsZSh0YWJsZTIsIG9wdGlvbnMpIHsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwge307CiAgY29uc3QgYWxpZ24gPSAoc2V0dGluZ3MuYWxpZ24gfHwgW10pLmNvbmNhdCgpOwogIGNvbnN0IHN0cmluZ0xlbmd0aCA9IHNldHRpbmdzLnN0cmluZ0xlbmd0aCB8fCBkZWZhdWx0U3RyaW5nTGVuZ3RoOwogIGNvbnN0IGFsaWdubWVudHMgPSBbXTsKICBjb25zdCBjZWxsTWF0cml4ID0gW107CiAgY29uc3Qgc2l6ZU1hdHJpeCA9IFtdOwogIGNvbnN0IGxvbmdlc3RDZWxsQnlDb2x1bW4gPSBbXTsKICBsZXQgbW9zdENlbGxzUGVyUm93ID0gMDsKICBsZXQgcm93SW5kZXggPSAtMTsKICB3aGlsZSAoKytyb3dJbmRleCA8IHRhYmxlMi5sZW5ndGgpIHsKICAgIGNvbnN0IHJvdzIgPSBbXTsKICAgIGNvbnN0IHNpemVzMiA9IFtdOwogICAgbGV0IGNvbHVtbkluZGV4MiA9IC0xOwogICAgaWYgKHRhYmxlMltyb3dJbmRleF0ubGVuZ3RoID4gbW9zdENlbGxzUGVyUm93KSB7CiAgICAgIG1vc3RDZWxsc1BlclJvdyA9IHRhYmxlMltyb3dJbmRleF0ubGVuZ3RoOwogICAgfQogICAgd2hpbGUgKCsrY29sdW1uSW5kZXgyIDwgdGFibGUyW3Jvd0luZGV4XS5sZW5ndGgpIHsKICAgICAgY29uc3QgY2VsbDIgPSBzZXJpYWxpemUodGFibGUyW3Jvd0luZGV4XVtjb2x1bW5JbmRleDJdKTsKICAgICAgaWYgKHNldHRpbmdzLmFsaWduRGVsaW1pdGVycyAhPT0gZmFsc2UpIHsKICAgICAgICBjb25zdCBzaXplID0gc3RyaW5nTGVuZ3RoKGNlbGwyKTsKICAgICAgICBzaXplczJbY29sdW1uSW5kZXgyXSA9IHNpemU7CiAgICAgICAgaWYgKGxvbmdlc3RDZWxsQnlDb2x1bW5bY29sdW1uSW5kZXgyXSA9PT0gdm9pZCAwIHx8IHNpemUgPiBsb25nZXN0Q2VsbEJ5Q29sdW1uW2NvbHVtbkluZGV4Ml0pIHsKICAgICAgICAgIGxvbmdlc3RDZWxsQnlDb2x1bW5bY29sdW1uSW5kZXgyXSA9IHNpemU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJvdzIucHVzaChjZWxsMik7CiAgICB9CiAgICBjZWxsTWF0cml4W3Jvd0luZGV4XSA9IHJvdzI7CiAgICBzaXplTWF0cml4W3Jvd0luZGV4XSA9IHNpemVzMjsKICB9CiAgbGV0IGNvbHVtbkluZGV4ID0gLTE7CiAgaWYgKHR5cGVvZiBhbGlnbiA9PT0gIm9iamVjdCIgJiYgImxlbmd0aCIgaW4gYWxpZ24pIHsKICAgIHdoaWxlICgrK2NvbHVtbkluZGV4IDwgbW9zdENlbGxzUGVyUm93KSB7CiAgICAgIGFsaWdubWVudHNbY29sdW1uSW5kZXhdID0gdG9BbGlnbm1lbnQoYWxpZ25bY29sdW1uSW5kZXhdKTsKICAgIH0KICB9IGVsc2UgewogICAgY29uc3QgY29kZTQgPSB0b0FsaWdubWVudChhbGlnbik7CiAgICB3aGlsZSAoKytjb2x1bW5JbmRleCA8IG1vc3RDZWxsc1BlclJvdykgewogICAgICBhbGlnbm1lbnRzW2NvbHVtbkluZGV4XSA9IGNvZGU0OwogICAgfQogIH0KICBjb2x1bW5JbmRleCA9IC0xOwogIGNvbnN0IHJvdyA9IFtdOwogIGNvbnN0IHNpemVzID0gW107CiAgd2hpbGUgKCsrY29sdW1uSW5kZXggPCBtb3N0Q2VsbHNQZXJSb3cpIHsKICAgIGNvbnN0IGNvZGU0ID0gYWxpZ25tZW50c1tjb2x1bW5JbmRleF07CiAgICBsZXQgYmVmb3JlID0gIiI7CiAgICBsZXQgYWZ0ZXIgPSAiIjsKICAgIGlmIChjb2RlNCA9PT0gOTkpIHsKICAgICAgYmVmb3JlID0gIjoiOwogICAgICBhZnRlciA9ICI6IjsKICAgIH0gZWxzZSBpZiAoY29kZTQgPT09IDEwOCkgewogICAgICBiZWZvcmUgPSAiOiI7CiAgICB9IGVsc2UgaWYgKGNvZGU0ID09PSAxMTQpIHsKICAgICAgYWZ0ZXIgPSAiOiI7CiAgICB9CiAgICBsZXQgc2l6ZSA9IHNldHRpbmdzLmFsaWduRGVsaW1pdGVycyA9PT0gZmFsc2UgPyAxIDogTWF0aC5tYXgoCiAgICAgIDEsCiAgICAgIGxvbmdlc3RDZWxsQnlDb2x1bW5bY29sdW1uSW5kZXhdIC0gYmVmb3JlLmxlbmd0aCAtIGFmdGVyLmxlbmd0aAogICAgKTsKICAgIGNvbnN0IGNlbGwyID0gYmVmb3JlICsgIi0iLnJlcGVhdChzaXplKSArIGFmdGVyOwogICAgaWYgKHNldHRpbmdzLmFsaWduRGVsaW1pdGVycyAhPT0gZmFsc2UpIHsKICAgICAgc2l6ZSA9IGJlZm9yZS5sZW5ndGggKyBzaXplICsgYWZ0ZXIubGVuZ3RoOwogICAgICBpZiAoc2l6ZSA+IGxvbmdlc3RDZWxsQnlDb2x1bW5bY29sdW1uSW5kZXhdKSB7CiAgICAgICAgbG9uZ2VzdENlbGxCeUNvbHVtbltjb2x1bW5JbmRleF0gPSBzaXplOwogICAgICB9CiAgICAgIHNpemVzW2NvbHVtbkluZGV4XSA9IHNpemU7CiAgICB9CiAgICByb3dbY29sdW1uSW5kZXhdID0gY2VsbDI7CiAgfQogIGNlbGxNYXRyaXguc3BsaWNlKDEsIDAsIHJvdyk7CiAgc2l6ZU1hdHJpeC5zcGxpY2UoMSwgMCwgc2l6ZXMpOwogIHJvd0luZGV4ID0gLTE7CiAgY29uc3QgbGluZXMgPSBbXTsKICB3aGlsZSAoKytyb3dJbmRleCA8IGNlbGxNYXRyaXgubGVuZ3RoKSB7CiAgICBjb25zdCByb3cyID0gY2VsbE1hdHJpeFtyb3dJbmRleF07CiAgICBjb25zdCBzaXplczIgPSBzaXplTWF0cml4W3Jvd0luZGV4XTsKICAgIGNvbHVtbkluZGV4ID0gLTE7CiAgICBjb25zdCBsaW5lID0gW107CiAgICB3aGlsZSAoKytjb2x1bW5JbmRleCA8IG1vc3RDZWxsc1BlclJvdykgewogICAgICBjb25zdCBjZWxsMiA9IHJvdzJbY29sdW1uSW5kZXhdIHx8ICIiOwogICAgICBsZXQgYmVmb3JlID0gIiI7CiAgICAgIGxldCBhZnRlciA9ICIiOwogICAgICBpZiAoc2V0dGluZ3MuYWxpZ25EZWxpbWl0ZXJzICE9PSBmYWxzZSkgewogICAgICAgIGNvbnN0IHNpemUgPSBsb25nZXN0Q2VsbEJ5Q29sdW1uW2NvbHVtbkluZGV4XSAtIChzaXplczJbY29sdW1uSW5kZXhdIHx8IDApOwogICAgICAgIGNvbnN0IGNvZGU0ID0gYWxpZ25tZW50c1tjb2x1bW5JbmRleF07CiAgICAgICAgaWYgKGNvZGU0ID09PSAxMTQpIHsKICAgICAgICAgIGJlZm9yZSA9ICIgIi5yZXBlYXQoc2l6ZSk7CiAgICAgICAgfSBlbHNlIGlmIChjb2RlNCA9PT0gOTkpIHsKICAgICAgICAgIGlmIChzaXplICUgMikgewogICAgICAgICAgICBiZWZvcmUgPSAiICIucmVwZWF0KHNpemUgLyAyICsgMC41KTsKICAgICAgICAgICAgYWZ0ZXIgPSAiICIucmVwZWF0KHNpemUgLyAyIC0gMC41KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJlZm9yZSA9ICIgIi5yZXBlYXQoc2l6ZSAvIDIpOwogICAgICAgICAgICBhZnRlciA9IGJlZm9yZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgYWZ0ZXIgPSAiICIucmVwZWF0KHNpemUpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc2V0dGluZ3MuZGVsaW1pdGVyU3RhcnQgIT09IGZhbHNlICYmICFjb2x1bW5JbmRleCkgewogICAgICAgIGxpbmUucHVzaCgifCIpOwogICAgICB9CiAgICAgIGlmIChzZXR0aW5ncy5wYWRkaW5nICE9PSBmYWxzZSAmJiAvLyBEb27igJl0IGFkZCB0aGUgb3BlbmluZyBzcGFjZSBpZiB3ZeKAmXJlIG5vdCBhbGlnbmluZyBhbmQgdGhlIGNlbGwgaXMKICAgICAgLy8gZW1wdHk6IHRoZXJlIHdpbGwgYmUgYSBjbG9zaW5nIHNwYWNlLgogICAgICAhKHNldHRpbmdzLmFsaWduRGVsaW1pdGVycyA9PT0gZmFsc2UgJiYgY2VsbDIgPT09ICIiKSAmJiAoc2V0dGluZ3MuZGVsaW1pdGVyU3RhcnQgIT09IGZhbHNlIHx8IGNvbHVtbkluZGV4KSkgewogICAgICAgIGxpbmUucHVzaCgiICIpOwogICAgICB9CiAgICAgIGlmIChzZXR0aW5ncy5hbGlnbkRlbGltaXRlcnMgIT09IGZhbHNlKSB7CiAgICAgICAgbGluZS5wdXNoKGJlZm9yZSk7CiAgICAgIH0KICAgICAgbGluZS5wdXNoKGNlbGwyKTsKICAgICAgaWYgKHNldHRpbmdzLmFsaWduRGVsaW1pdGVycyAhPT0gZmFsc2UpIHsKICAgICAgICBsaW5lLnB1c2goYWZ0ZXIpOwogICAgICB9CiAgICAgIGlmIChzZXR0aW5ncy5wYWRkaW5nICE9PSBmYWxzZSkgewogICAgICAgIGxpbmUucHVzaCgiICIpOwogICAgICB9CiAgICAgIGlmIChzZXR0aW5ncy5kZWxpbWl0ZXJFbmQgIT09IGZhbHNlIHx8IGNvbHVtbkluZGV4ICE9PSBtb3N0Q2VsbHNQZXJSb3cgLSAxKSB7CiAgICAgICAgbGluZS5wdXNoKCJ8Iik7CiAgICAgIH0KICAgIH0KICAgIGxpbmVzLnB1c2goCiAgICAgIHNldHRpbmdzLmRlbGltaXRlckVuZCA9PT0gZmFsc2UgPyBsaW5lLmpvaW4oIiIpLnJlcGxhY2UoLyArJC8sICIiKSA6IGxpbmUuam9pbigiIikKICAgICk7CiAgfQogIHJldHVybiBsaW5lcy5qb2luKCJcbiIpOwp9CmZ1bmN0aW9uIHNlcmlhbGl6ZSh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyID09PSBudWxsIHx8IHZhbHVlMiA9PT0gdm9pZCAwID8gIiIgOiBTdHJpbmcodmFsdWUyKTsKfQpmdW5jdGlvbiB0b0FsaWdubWVudCh2YWx1ZTIpIHsKICBjb25zdCBjb2RlNCA9IHR5cGVvZiB2YWx1ZTIgPT09ICJzdHJpbmciID8gdmFsdWUyLmNvZGVQb2ludEF0KDApIDogMDsKICByZXR1cm4gY29kZTQgPT09IDY3IHx8IGNvZGU0ID09PSA5OSA/IDk5IDogY29kZTQgPT09IDc2IHx8IGNvZGU0ID09PSAxMDggPyAxMDggOiBjb2RlNCA9PT0gODIgfHwgY29kZTQgPT09IDExNCA/IDExNCA6IDA7Cn0KdmFyIGluaXRfbWFya2Rvd25fdGFibGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tYXJrZG93bi10YWJsZUAzLjAuNC9ub2RlX21vZHVsZXMvbWFya2Rvd24tdGFibGUvaW5kZXguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vendpdGNoQDIuMC40L25vZGVfbW9kdWxlcy96d2l0Y2gvaW5kZXguanMKZnVuY3Rpb24gendpdGNoKGtleTIsIG9wdGlvbnMpIHsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwge307CiAgZnVuY3Rpb24gb25lMyh2YWx1ZTIsIC4uLnBhcmFtZXRlcnMpIHsKICAgIGxldCBmbiA9IG9uZTMuaW52YWxpZDsKICAgIGNvbnN0IGhhbmRsZXJzMiA9IG9uZTMuaGFuZGxlcnM7CiAgICBpZiAodmFsdWUyICYmIG93bjIuY2FsbCh2YWx1ZTIsIGtleTIpKSB7CiAgICAgIGNvbnN0IGlkID0gU3RyaW5nKHZhbHVlMltrZXkyXSk7CiAgICAgIGZuID0gb3duMi5jYWxsKGhhbmRsZXJzMiwgaWQpID8gaGFuZGxlcnMyW2lkXSA6IG9uZTMudW5rbm93bjsKICAgIH0KICAgIGlmIChmbikgewogICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCB2YWx1ZTIsIC4uLnBhcmFtZXRlcnMpOwogICAgfQogIH0KICBvbmUzLmhhbmRsZXJzID0gc2V0dGluZ3MuaGFuZGxlcnMgfHwge307CiAgb25lMy5pbnZhbGlkID0gc2V0dGluZ3MuaW52YWxpZDsKICBvbmUzLnVua25vd24gPSBzZXR0aW5ncy51bmtub3duOwogIHJldHVybiBvbmUzOwp9CnZhciBvd24yOwp2YXIgaW5pdF96d2l0Y2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS96d2l0Y2hAMi4wLjQvbm9kZV9tb2R1bGVzL3p3aXRjaC9pbmRleC5qcyIoKSB7CiAgICBvd24yID0ge30uaGFzT3duUHJvcGVydHk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9jb25maWd1cmUuanMKZnVuY3Rpb24gY29uZmlndXJlKGJhc2UsIGV4dGVuc2lvbjIpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IGtleTI7CiAgaWYgKGV4dGVuc2lvbjIuZXh0ZW5zaW9ucykgewogICAgd2hpbGUgKCsraW5kZXgyIDwgZXh0ZW5zaW9uMi5leHRlbnNpb25zLmxlbmd0aCkgewogICAgICBjb25maWd1cmUoYmFzZSwgZXh0ZW5zaW9uMi5leHRlbnNpb25zW2luZGV4Ml0pOwogICAgfQogIH0KICBmb3IgKGtleTIgaW4gZXh0ZW5zaW9uMikgewogICAgaWYgKG93bjMuY2FsbChleHRlbnNpb24yLCBrZXkyKSkgewogICAgICBzd2l0Y2ggKGtleTIpIHsKICAgICAgICBjYXNlICJleHRlbnNpb25zIjogewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qIGM4IGlnbm9yZSBuZXh0IDQgKi8KICAgICAgICBjYXNlICJ1bnNhZmUiOiB7CiAgICAgICAgICBsaXN0KGJhc2Vba2V5Ml0sIGV4dGVuc2lvbjJba2V5Ml0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgImpvaW4iOiB7CiAgICAgICAgICBsaXN0KGJhc2Vba2V5Ml0sIGV4dGVuc2lvbjJba2V5Ml0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgImhhbmRsZXJzIjogewogICAgICAgICAgbWFwMyhiYXNlW2tleTJdLCBleHRlbnNpb24yW2tleTJdKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICBiYXNlLm9wdGlvbnNba2V5Ml0gPSBleHRlbnNpb24yW2tleTJdOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICByZXR1cm4gYmFzZTsKfQpmdW5jdGlvbiBsaXN0KGxlZnQsIHJpZ2h0KSB7CiAgaWYgKHJpZ2h0KSB7CiAgICBsZWZ0LnB1c2goLi4ucmlnaHQpOwogIH0KfQpmdW5jdGlvbiBtYXAzKGxlZnQsIHJpZ2h0KSB7CiAgaWYgKHJpZ2h0KSB7CiAgICBPYmplY3QuYXNzaWduKGxlZnQsIHJpZ2h0KTsKICB9Cn0KdmFyIG93bjM7CnZhciBpbml0X2NvbmZpZ3VyZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2NvbmZpZ3VyZS5qcyIoKSB7CiAgICBvd24zID0ge30uaGFzT3duUHJvcGVydHk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvYmxvY2txdW90ZS5qcwpmdW5jdGlvbiBibG9ja3F1b3RlKG5vZGUyLCBfNSwgc3RhdGUxMCwgaW5mbykgewogIGNvbnN0IGV4aXQzID0gc3RhdGUxMC5lbnRlcigiYmxvY2txdW90ZSIpOwogIGNvbnN0IHRyYWNrZXIgPSBzdGF0ZTEwLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgdHJhY2tlci5tb3ZlKCI+ICIpOwogIHRyYWNrZXIuc2hpZnQoMik7CiAgY29uc3QgdmFsdWUyID0gc3RhdGUxMC5pbmRlbnRMaW5lcygKICAgIHN0YXRlMTAuY29udGFpbmVyRmxvdyhub2RlMiwgdHJhY2tlci5jdXJyZW50KCkpLAogICAgbWFwNAogICk7CiAgZXhpdDMoKTsKICByZXR1cm4gdmFsdWUyOwp9CmZ1bmN0aW9uIG1hcDQobGluZSwgXzUsIGJsYW5rKSB7CiAgcmV0dXJuICI+IiArIChibGFuayA/ICIiIDogIiAiKSArIGxpbmU7Cn0KdmFyIGluaXRfYmxvY2txdW90ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9ibG9ja3F1b3RlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvcGF0dGVybi1pbi1zY29wZS5qcwpmdW5jdGlvbiBwYXR0ZXJuSW5TY29wZShzdGFjaywgcGF0dGVybikgewogIHJldHVybiBsaXN0SW5TY29wZShzdGFjaywgcGF0dGVybi5pbkNvbnN0cnVjdCwgdHJ1ZSkgJiYgIWxpc3RJblNjb3BlKHN0YWNrLCBwYXR0ZXJuLm5vdEluQ29uc3RydWN0LCBmYWxzZSk7Cn0KZnVuY3Rpb24gbGlzdEluU2NvcGUoc3RhY2ssIGxpc3Q1LCBub25lKSB7CiAgaWYgKHR5cGVvZiBsaXN0NSA9PT0gInN0cmluZyIpIHsKICAgIGxpc3Q1ID0gW2xpc3Q1XTsKICB9CiAgaWYgKCFsaXN0NSB8fCBsaXN0NS5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiBub25lOwogIH0KICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgbGlzdDUubGVuZ3RoKSB7CiAgICBpZiAoc3RhY2suaW5jbHVkZXMobGlzdDVbaW5kZXgyXSkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQogIHJldHVybiBmYWxzZTsKfQp2YXIgaW5pdF9wYXR0ZXJuX2luX3Njb3BlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9wYXR0ZXJuLWluLXNjb3BlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9icmVhay5qcwpmdW5jdGlvbiBoYXJkQnJlYWsoXzUsIF8xLCBzdGF0ZTEwLCBpbmZvKSB7CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHN0YXRlMTAudW5zYWZlLmxlbmd0aCkgewogICAgaWYgKHN0YXRlMTAudW5zYWZlW2luZGV4Ml0uY2hhcmFjdGVyID09PSAiXG4iICYmIHBhdHRlcm5JblNjb3BlKHN0YXRlMTAuc3RhY2ssIHN0YXRlMTAudW5zYWZlW2luZGV4Ml0pKSB7CiAgICAgIHJldHVybiAvWyBcdF0vLnRlc3QoaW5mby5iZWZvcmUpID8gIiIgOiAiICI7CiAgICB9CiAgfQogIHJldHVybiAiXFxcbiI7Cn0KdmFyIGluaXRfYnJlYWsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvYnJlYWsuanMiKCkgewogICAgaW5pdF9wYXR0ZXJuX2luX3Njb3BlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sb25nZXN0LXN0cmVha0AzLjEuMC9ub2RlX21vZHVsZXMvbG9uZ2VzdC1zdHJlYWsvaW5kZXguanMKZnVuY3Rpb24gbG9uZ2VzdFN0cmVhayh2YWx1ZTIsIHN1YnN0cmluZykgewogIGNvbnN0IHNvdXJjZSA9IFN0cmluZyh2YWx1ZTIpOwogIGxldCBpbmRleDIgPSBzb3VyY2UuaW5kZXhPZihzdWJzdHJpbmcpOwogIGxldCBleHBlY3RlZCA9IGluZGV4MjsKICBsZXQgY291bnQyID0gMDsKICBsZXQgbWF4MyA9IDA7CiAgaWYgKHR5cGVvZiBzdWJzdHJpbmcgIT09ICJzdHJpbmciKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBzdWJzdHJpbmciKTsKICB9CiAgd2hpbGUgKGluZGV4MiAhPT0gLTEpIHsKICAgIGlmIChpbmRleDIgPT09IGV4cGVjdGVkKSB7CiAgICAgIGlmICgrK2NvdW50MiA+IG1heDMpIHsKICAgICAgICBtYXgzID0gY291bnQyOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb3VudDIgPSAxOwogICAgfQogICAgZXhwZWN0ZWQgPSBpbmRleDIgKyBzdWJzdHJpbmcubGVuZ3RoOwogICAgaW5kZXgyID0gc291cmNlLmluZGV4T2Yoc3Vic3RyaW5nLCBleHBlY3RlZCk7CiAgfQogIHJldHVybiBtYXgzOwp9CnZhciBpbml0X2xvbmdlc3Rfc3RyZWFrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbG9uZ2VzdC1zdHJlYWtAMy4xLjAvbm9kZV9tb2R1bGVzL2xvbmdlc3Qtc3RyZWFrL2luZGV4LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvZm9ybWF0LWNvZGUtYXMtaW5kZW50ZWQuanMKZnVuY3Rpb24gZm9ybWF0Q29kZUFzSW5kZW50ZWQobm9kZTIsIHN0YXRlMTApIHsKICByZXR1cm4gQm9vbGVhbigKICAgIHN0YXRlMTAub3B0aW9ucy5mZW5jZXMgPT09IGZhbHNlICYmIG5vZGUyLnZhbHVlICYmIC8vIElmIHRoZXJl4oCZcyBubyBpbmZv4oCmCiAgICAhbm9kZTIubGFuZyAmJiAvLyBBbmQgdGhlcmXigJlzIGEgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVy4oCmCiAgICAvW14gXHJcbl0vLnRlc3Qobm9kZTIudmFsdWUpICYmIC8vIEFuZCB0aGUgdmFsdWUgZG9lc27igJl0IHN0YXJ0IG9yIGVuZCBpbiBhIGJsYW5r4oCmCiAgICAhL15bXHQgXSooPzpbXHJcbl18JCl8KD86XnxbXHJcbl0pW1x0IF0qJC8udGVzdChub2RlMi52YWx1ZSkKICApOwp9CnZhciBpbml0X2Zvcm1hdF9jb2RlX2FzX2luZGVudGVkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9mb3JtYXQtY29kZS1hcy1pbmRlbnRlZC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLWZlbmNlLmpzCmZ1bmN0aW9uIGNoZWNrRmVuY2Uoc3RhdGUxMCkgewogIGNvbnN0IG1hcmtlciA9IHN0YXRlMTAub3B0aW9ucy5mZW5jZSB8fCAiYCI7CiAgaWYgKG1hcmtlciAhPT0gImAiICYmIG1hcmtlciAhPT0gIn4iKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICJDYW5ub3Qgc2VyaWFsaXplIGNvZGUgd2l0aCBgIiArIG1hcmtlciArICJgIGZvciBgb3B0aW9ucy5mZW5jZWAsIGV4cGVjdGVkIGBgIGAgYGAgb3IgYH5gIgogICAgKTsKICB9CiAgcmV0dXJuIG1hcmtlcjsKfQp2YXIgaW5pdF9jaGVja19mZW5jZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stZmVuY2UuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2NvZGUuanMKZnVuY3Rpb24gY29kZShub2RlMiwgXzUsIHN0YXRlMTAsIGluZm8pIHsKICBjb25zdCBtYXJrZXIgPSBjaGVja0ZlbmNlKHN0YXRlMTApOwogIGNvbnN0IHJhdzIgPSBub2RlMi52YWx1ZSB8fCAiIjsKICBjb25zdCBzdWZmaXggPSBtYXJrZXIgPT09ICJgIiA/ICJHcmF2ZUFjY2VudCIgOiAiVGlsZGUiOwogIGlmIChmb3JtYXRDb2RlQXNJbmRlbnRlZChub2RlMiwgc3RhdGUxMCkpIHsKICAgIGNvbnN0IGV4aXQ0ID0gc3RhdGUxMC5lbnRlcigiY29kZUluZGVudGVkIik7CiAgICBjb25zdCB2YWx1ZTMgPSBzdGF0ZTEwLmluZGVudExpbmVzKHJhdzIsIG1hcDUpOwogICAgZXhpdDQoKTsKICAgIHJldHVybiB2YWx1ZTM7CiAgfQogIGNvbnN0IHRyYWNrZXIgPSBzdGF0ZTEwLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgY29uc3Qgc2VxdWVuY2UgPSBtYXJrZXIucmVwZWF0KE1hdGgubWF4KGxvbmdlc3RTdHJlYWsocmF3MiwgbWFya2VyKSArIDEsIDMpKTsKICBjb25zdCBleGl0MyA9IHN0YXRlMTAuZW50ZXIoImNvZGVGZW5jZWQiKTsKICBsZXQgdmFsdWUyID0gdHJhY2tlci5tb3ZlKHNlcXVlbmNlKTsKICBpZiAobm9kZTIubGFuZykgewogICAgY29uc3Qgc3ViZXhpdCA9IHN0YXRlMTAuZW50ZXIoYGNvZGVGZW5jZWRMYW5nJHtzdWZmaXh9YCk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZTEwLnNhZmUobm9kZTIubGFuZywgewogICAgICAgIGJlZm9yZTogdmFsdWUyLAogICAgICAgIGFmdGVyOiAiICIsCiAgICAgICAgZW5jb2RlOiBbImAiXSwKICAgICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgICB9KQogICAgKTsKICAgIHN1YmV4aXQoKTsKICB9CiAgaWYgKG5vZGUyLmxhbmcgJiYgbm9kZTIubWV0YSkgewogICAgY29uc3Qgc3ViZXhpdCA9IHN0YXRlMTAuZW50ZXIoYGNvZGVGZW5jZWRNZXRhJHtzdWZmaXh9YCk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCIgIik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZTEwLnNhZmUobm9kZTIubWV0YSwgewogICAgICAgIGJlZm9yZTogdmFsdWUyLAogICAgICAgIGFmdGVyOiAiXG4iLAogICAgICAgIGVuY29kZTogWyJgIl0sCiAgICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgICAgfSkKICAgICk7CiAgICBzdWJleGl0KCk7CiAgfQogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIlxuIik7CiAgaWYgKHJhdzIpIHsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUocmF3MiArICJcbiIpOwogIH0KICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKHNlcXVlbmNlKTsKICBleGl0MygpOwogIHJldHVybiB2YWx1ZTI7Cn0KZnVuY3Rpb24gbWFwNShsaW5lLCBfNSwgYmxhbmspIHsKICByZXR1cm4gKGJsYW5rID8gIiIgOiAiICAgICIpICsgbGluZTsKfQp2YXIgaW5pdF9jb2RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2NvZGUuanMiKCkgewogICAgaW5pdF9sb25nZXN0X3N0cmVhaygpOwogICAgaW5pdF9mb3JtYXRfY29kZV9hc19pbmRlbnRlZCgpOwogICAgaW5pdF9jaGVja19mZW5jZSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1xdW90ZS5qcwpmdW5jdGlvbiBjaGVja1F1b3RlKHN0YXRlMTApIHsKICBjb25zdCBtYXJrZXIgPSBzdGF0ZTEwLm9wdGlvbnMucXVvdGUgfHwgJyInOwogIGlmIChtYXJrZXIgIT09ICciJyAmJiBtYXJrZXIgIT09ICInIikgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAiQ2Fubm90IHNlcmlhbGl6ZSB0aXRsZSB3aXRoIGAiICsgbWFya2VyICsgImAgZm9yIGBvcHRpb25zLnF1b3RlYCwgZXhwZWN0ZWQgYFwiYCwgb3IgYCdgIgogICAgKTsKICB9CiAgcmV0dXJuIG1hcmtlcjsKfQp2YXIgaW5pdF9jaGVja19xdW90ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stcXVvdGUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2RlZmluaXRpb24uanMKZnVuY3Rpb24gZGVmaW5pdGlvbihub2RlMiwgXzUsIHN0YXRlMTAsIGluZm8pIHsKICBjb25zdCBxdW90ZSA9IGNoZWNrUXVvdGUoc3RhdGUxMCk7CiAgY29uc3Qgc3VmZml4ID0gcXVvdGUgPT09ICciJyA/ICJRdW90ZSIgOiAiQXBvc3Ryb3BoZSI7CiAgY29uc3QgZXhpdDMgPSBzdGF0ZTEwLmVudGVyKCJkZWZpbml0aW9uIik7CiAgbGV0IHN1YmV4aXQgPSBzdGF0ZTEwLmVudGVyKCJsYWJlbCIpOwogIGNvbnN0IHRyYWNrZXIgPSBzdGF0ZTEwLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgbGV0IHZhbHVlMiA9IHRyYWNrZXIubW92ZSgiWyIpOwogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICBzdGF0ZTEwLnNhZmUoc3RhdGUxMC5hc3NvY2lhdGlvbklkKG5vZGUyKSwgewogICAgICBiZWZvcmU6IHZhbHVlMiwKICAgICAgYWZ0ZXI6ICJdIiwKICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgIH0pCiAgKTsKICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCJdOiAiKTsKICBzdWJleGl0KCk7CiAgaWYgKAogICAgLy8gSWYgdGhlcmXigJlzIG5vIHVybCwgb3LigKYKICAgICFub2RlMi51cmwgfHwgLy8gSWYgdGhlcmUgYXJlIGNvbnRyb2wgY2hhcmFjdGVycyBvciB3aGl0ZXNwYWNlLgogICAgL1tcMC0gXHUwMDdGXS8udGVzdChub2RlMi51cmwpCiAgKSB7CiAgICBzdWJleGl0ID0gc3RhdGUxMC5lbnRlcigiZGVzdGluYXRpb25MaXRlcmFsIik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCI8Iik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZTEwLnNhZmUobm9kZTIudXJsLCB7IGJlZm9yZTogdmFsdWUyLCBhZnRlcjogIj4iLCAuLi50cmFja2VyLmN1cnJlbnQoKSB9KQogICAgKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIj4iKTsKICB9IGVsc2UgewogICAgc3ViZXhpdCA9IHN0YXRlMTAuZW50ZXIoImRlc3RpbmF0aW9uUmF3Iik7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZTEwLnNhZmUobm9kZTIudXJsLCB7CiAgICAgICAgYmVmb3JlOiB2YWx1ZTIsCiAgICAgICAgYWZ0ZXI6IG5vZGUyLnRpdGxlID8gIiAiIDogIlxuIiwKICAgICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgICB9KQogICAgKTsKICB9CiAgc3ViZXhpdCgpOwogIGlmIChub2RlMi50aXRsZSkgewogICAgc3ViZXhpdCA9IHN0YXRlMTAuZW50ZXIoYHRpdGxlJHtzdWZmaXh9YCk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKCIgIiArIHF1b3RlKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICAgIHN0YXRlMTAuc2FmZShub2RlMi50aXRsZSwgewogICAgICAgIGJlZm9yZTogdmFsdWUyLAogICAgICAgIGFmdGVyOiBxdW90ZSwKICAgICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgICB9KQogICAgKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUocXVvdGUpOwogICAgc3ViZXhpdCgpOwogIH0KICBleGl0MygpOwogIHJldHVybiB2YWx1ZTI7Cn0KdmFyIGluaXRfZGVmaW5pdGlvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9kZWZpbml0aW9uLmpzIigpIHsKICAgIGluaXRfY2hlY2tfcXVvdGUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stZW1waGFzaXMuanMKZnVuY3Rpb24gY2hlY2tFbXBoYXNpcyhzdGF0ZTEwKSB7CiAgY29uc3QgbWFya2VyID0gc3RhdGUxMC5vcHRpb25zLmVtcGhhc2lzIHx8ICIqIjsKICBpZiAobWFya2VyICE9PSAiKiIgJiYgbWFya2VyICE9PSAiXyIpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgIkNhbm5vdCBzZXJpYWxpemUgZW1waGFzaXMgd2l0aCBgIiArIG1hcmtlciArICJgIGZvciBgb3B0aW9ucy5lbXBoYXNpc2AsIGV4cGVjdGVkIGAqYCwgb3IgYF9gIgogICAgKTsKICB9CiAgcmV0dXJuIG1hcmtlcjsKfQp2YXIgaW5pdF9jaGVja19lbXBoYXNpcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stZW1waGFzaXMuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9lbmNvZGUtY2hhcmFjdGVyLXJlZmVyZW5jZS5qcwpmdW5jdGlvbiBlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UoY29kZTQpIHsKICByZXR1cm4gIiYjeCIgKyBjb2RlNC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArICI7IjsKfQp2YXIgaW5pdF9lbmNvZGVfY2hhcmFjdGVyX3JlZmVyZW5jZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvZW5jb2RlLWNoYXJhY3Rlci1yZWZlcmVuY2UuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtY2xhc3NpZnktY2hhcmFjdGVyQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1jbGFzc2lmeS1jaGFyYWN0ZXIvaW5kZXguanMKZnVuY3Rpb24gY2xhc3NpZnlDaGFyYWN0ZXIoY29kZTQpIHsKICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkgfHwgdW5pY29kZVdoaXRlc3BhY2UoY29kZTQpKSB7CiAgICByZXR1cm4gMTsKICB9CiAgaWYgKHVuaWNvZGVQdW5jdHVhdGlvbihjb2RlNCkpIHsKICAgIHJldHVybiAyOwogIH0KfQp2YXIgaW5pdF9taWNyb21hcmtfdXRpbF9jbGFzc2lmeV9jaGFyYWN0ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1jbGFzc2lmeS1jaGFyYWN0ZXJAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLWNsYXNzaWZ5LWNoYXJhY3Rlci9pbmRleC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9lbmNvZGUtaW5mby5qcwpmdW5jdGlvbiBlbmNvZGVJbmZvKG91dHNpZGUsIGluc2lkZSwgbWFya2VyKSB7CiAgY29uc3Qgb3V0c2lkZUtpbmQgPSBjbGFzc2lmeUNoYXJhY3RlcihvdXRzaWRlKTsKICBjb25zdCBpbnNpZGVLaW5kID0gY2xhc3NpZnlDaGFyYWN0ZXIoaW5zaWRlKTsKICBpZiAob3V0c2lkZUtpbmQgPT09IHZvaWQgMCkgewogICAgcmV0dXJuIGluc2lkZUtpbmQgPT09IHZvaWQgMCA/ICgKICAgICAgLy8gTGV0dGVyIGluc2lkZToKICAgICAgLy8gd2UgaGF2ZSB0byBlbmNvZGUgKmJvdGgqIGxldHRlcnMgZm9yIGBfYCBhcyBpdCBpcyBsb29zZXIuCiAgICAgIC8vIGl0IGFscmVhZHkgZm9ybXMgZm9yIGAqYCAoYW5kIEdGTXMgYH5gKS4KICAgICAgbWFya2VyID09PSAiXyIgPyB7IGluc2lkZTogdHJ1ZSwgb3V0c2lkZTogdHJ1ZSB9IDogeyBpbnNpZGU6IGZhbHNlLCBvdXRzaWRlOiBmYWxzZSB9CiAgICApIDogaW5zaWRlS2luZCA9PT0gMSA/ICgKICAgICAgLy8gV2hpdGVzcGFjZSBpbnNpZGU6IGVuY29kZSBib3RoIChsZXR0ZXIsIHdoaXRlc3BhY2UpLgogICAgICB7IGluc2lkZTogdHJ1ZSwgb3V0c2lkZTogdHJ1ZSB9CiAgICApIDogKAogICAgICAvLyBQdW5jdHVhdGlvbiBpbnNpZGU6IGVuY29kZSBvdXRlciAobGV0dGVyKQogICAgICB7IGluc2lkZTogZmFsc2UsIG91dHNpZGU6IHRydWUgfQogICAgKTsKICB9CiAgaWYgKG91dHNpZGVLaW5kID09PSAxKSB7CiAgICByZXR1cm4gaW5zaWRlS2luZCA9PT0gdm9pZCAwID8gKAogICAgICAvLyBMZXR0ZXIgaW5zaWRlOiBhbHJlYWR5IGZvcm1zLgogICAgICB7IGluc2lkZTogZmFsc2UsIG91dHNpZGU6IGZhbHNlIH0KICAgICkgOiBpbnNpZGVLaW5kID09PSAxID8gKAogICAgICAvLyBXaGl0ZXNwYWNlIGluc2lkZTogZW5jb2RlIGJvdGggKHdoaXRlc3BhY2UpLgogICAgICB7IGluc2lkZTogdHJ1ZSwgb3V0c2lkZTogdHJ1ZSB9CiAgICApIDogKAogICAgICAvLyBQdW5jdHVhdGlvbiBpbnNpZGU6IGFscmVhZHkgZm9ybXMuCiAgICAgIHsgaW5zaWRlOiBmYWxzZSwgb3V0c2lkZTogZmFsc2UgfQogICAgKTsKICB9CiAgcmV0dXJuIGluc2lkZUtpbmQgPT09IHZvaWQgMCA/ICgKICAgIC8vIExldHRlciBpbnNpZGU6IGFscmVhZHkgZm9ybXMuCiAgICB7IGluc2lkZTogZmFsc2UsIG91dHNpZGU6IGZhbHNlIH0KICApIDogaW5zaWRlS2luZCA9PT0gMSA/ICgKICAgIC8vIFdoaXRlc3BhY2UgaW5zaWRlOiBlbmNvZGUgaW5uZXIgKHdoaXRlc3BhY2UpLgogICAgeyBpbnNpZGU6IHRydWUsIG91dHNpZGU6IGZhbHNlIH0KICApIDogKAogICAgLy8gUHVuY3R1YXRpb24gaW5zaWRlOiBhbHJlYWR5IGZvcm1zLgogICAgeyBpbnNpZGU6IGZhbHNlLCBvdXRzaWRlOiBmYWxzZSB9CiAgKTsKfQp2YXIgaW5pdF9lbmNvZGVfaW5mbyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvZW5jb2RlLWluZm8uanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jbGFzc2lmeV9jaGFyYWN0ZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9lbXBoYXNpcy5qcwpmdW5jdGlvbiBlbXBoYXNpcyhub2RlMiwgXzUsIHN0YXRlMTAsIGluZm8pIHsKICBjb25zdCBtYXJrZXIgPSBjaGVja0VtcGhhc2lzKHN0YXRlMTApOwogIGNvbnN0IGV4aXQzID0gc3RhdGUxMC5lbnRlcigiZW1waGFzaXMiKTsKICBjb25zdCB0cmFja2VyID0gc3RhdGUxMC5jcmVhdGVUcmFja2VyKGluZm8pOwogIGNvbnN0IGJlZm9yZSA9IHRyYWNrZXIubW92ZShtYXJrZXIpOwogIGxldCBiZXR3ZWVuMiA9IHRyYWNrZXIubW92ZSgKICAgIHN0YXRlMTAuY29udGFpbmVyUGhyYXNpbmcobm9kZTIsIHsKICAgICAgYWZ0ZXI6IG1hcmtlciwKICAgICAgYmVmb3JlLAogICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgfSkKICApOwogIGNvbnN0IGJldHdlZW5IZWFkID0gYmV0d2VlbjIuY2hhckNvZGVBdCgwKTsKICBjb25zdCBvcGVuID0gZW5jb2RlSW5mbygKICAgIGluZm8uYmVmb3JlLmNoYXJDb2RlQXQoaW5mby5iZWZvcmUubGVuZ3RoIC0gMSksCiAgICBiZXR3ZWVuSGVhZCwKICAgIG1hcmtlcgogICk7CiAgaWYgKG9wZW4uaW5zaWRlKSB7CiAgICBiZXR3ZWVuMiA9IGVuY29kZUNoYXJhY3RlclJlZmVyZW5jZShiZXR3ZWVuSGVhZCkgKyBiZXR3ZWVuMi5zbGljZSgxKTsKICB9CiAgY29uc3QgYmV0d2VlblRhaWwgPSBiZXR3ZWVuMi5jaGFyQ29kZUF0KGJldHdlZW4yLmxlbmd0aCAtIDEpOwogIGNvbnN0IGNsb3NlNyA9IGVuY29kZUluZm8oaW5mby5hZnRlci5jaGFyQ29kZUF0KDApLCBiZXR3ZWVuVGFpbCwgbWFya2VyKTsKICBpZiAoY2xvc2U3Lmluc2lkZSkgewogICAgYmV0d2VlbjIgPSBiZXR3ZWVuMi5zbGljZSgwLCAtMSkgKyBlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UoYmV0d2VlblRhaWwpOwogIH0KICBjb25zdCBhZnRlciA9IHRyYWNrZXIubW92ZShtYXJrZXIpOwogIGV4aXQzKCk7CiAgc3RhdGUxMC5hdHRlbnRpb25FbmNvZGVTdXJyb3VuZGluZ0luZm8gPSB7CiAgICBhZnRlcjogY2xvc2U3Lm91dHNpZGUsCiAgICBiZWZvcmU6IG9wZW4ub3V0c2lkZQogIH07CiAgcmV0dXJuIGJlZm9yZSArIGJldHdlZW4yICsgYWZ0ZXI7Cn0KZnVuY3Rpb24gZW1waGFzaXNQZWVrKF81LCBfMSwgc3RhdGUxMCkgewogIHJldHVybiBzdGF0ZTEwLm9wdGlvbnMuZW1waGFzaXMgfHwgIioiOwp9CnZhciBpbml0X2VtcGhhc2lzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2VtcGhhc2lzLmpzIigpIHsKICAgIGluaXRfY2hlY2tfZW1waGFzaXMoKTsKICAgIGluaXRfZW5jb2RlX2NoYXJhY3Rlcl9yZWZlcmVuY2UoKTsKICAgIGluaXRfZW5jb2RlX2luZm8oKTsKICAgIGVtcGhhc2lzLnBlZWsgPSBlbXBoYXNpc1BlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXZpc2l0QDUuMS4wL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0L2xpYi9pbmRleC5qcwpmdW5jdGlvbiB2aXNpdCh0cmVlLCB0ZXN0T3JWaXNpdG9yLCB2aXNpdG9yT3JSZXZlcnNlLCBtYXliZVJldmVyc2UpIHsKICBsZXQgcmV2ZXJzZTsKICBsZXQgdGVzdDsKICBsZXQgdmlzaXRvcjsKICBpZiAodHlwZW9mIHRlc3RPclZpc2l0b3IgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIHZpc2l0b3JPclJldmVyc2UgIT09ICJmdW5jdGlvbiIpIHsKICAgIHRlc3QgPSB2b2lkIDA7CiAgICB2aXNpdG9yID0gdGVzdE9yVmlzaXRvcjsKICAgIHJldmVyc2UgPSB2aXNpdG9yT3JSZXZlcnNlOwogIH0gZWxzZSB7CiAgICB0ZXN0ID0gdGVzdE9yVmlzaXRvcjsKICAgIHZpc2l0b3IgPSB2aXNpdG9yT3JSZXZlcnNlOwogICAgcmV2ZXJzZSA9IG1heWJlUmV2ZXJzZTsKICB9CiAgdmlzaXRQYXJlbnRzKHRyZWUsIHRlc3QsIG92ZXJsb2FkLCByZXZlcnNlKTsKICBmdW5jdGlvbiBvdmVybG9hZChub2RlMiwgcGFyZW50cykgewogICAgY29uc3QgcGFyZW50ID0gcGFyZW50c1twYXJlbnRzLmxlbmd0aCAtIDFdOwogICAgY29uc3QgaW5kZXgyID0gcGFyZW50ID8gcGFyZW50LmNoaWxkcmVuLmluZGV4T2Yobm9kZTIpIDogdm9pZCAwOwogICAgcmV0dXJuIHZpc2l0b3Iobm9kZTIsIGluZGV4MiwgcGFyZW50KTsKICB9Cn0KdmFyIGluaXRfbGliMTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXZpc2l0QDUuMS4wL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0L2xpYi9pbmRleC5qcyIoKSB7CiAgICBpbml0X3VuaXN0X3V0aWxfdmlzaXRfcGFyZW50cygpOwogICAgaW5pdF91bmlzdF91dGlsX3Zpc2l0X3BhcmVudHMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtdmlzaXRANS4xLjAvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQvaW5kZXguanMKdmFyIGluaXRfdW5pc3RfdXRpbF92aXNpdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtdmlzaXRANS4xLjAvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQvaW5kZXguanMiKCkgewogICAgaW5pdF9saWIxMigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1zdHJpbmdANC4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tc3RyaW5nL2xpYi9pbmRleC5qcwpmdW5jdGlvbiB0b1N0cmluZyh2YWx1ZTIsIG9wdGlvbnMpIHsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zOwogIGNvbnN0IGluY2x1ZGVJbWFnZUFsdCA9IHR5cGVvZiBzZXR0aW5ncy5pbmNsdWRlSW1hZ2VBbHQgPT09ICJib29sZWFuIiA/IHNldHRpbmdzLmluY2x1ZGVJbWFnZUFsdCA6IHRydWU7CiAgY29uc3QgaW5jbHVkZUh0bWwgPSB0eXBlb2Ygc2V0dGluZ3MuaW5jbHVkZUh0bWwgPT09ICJib29sZWFuIiA/IHNldHRpbmdzLmluY2x1ZGVIdG1sIDogdHJ1ZTsKICByZXR1cm4gb25lKHZhbHVlMiwgaW5jbHVkZUltYWdlQWx0LCBpbmNsdWRlSHRtbCk7Cn0KZnVuY3Rpb24gb25lKHZhbHVlMiwgaW5jbHVkZUltYWdlQWx0LCBpbmNsdWRlSHRtbCkgewogIGlmIChub2RlKHZhbHVlMikpIHsKICAgIGlmICgidmFsdWUiIGluIHZhbHVlMikgewogICAgICByZXR1cm4gdmFsdWUyLnR5cGUgPT09ICJodG1sIiAmJiAhaW5jbHVkZUh0bWwgPyAiIiA6IHZhbHVlMi52YWx1ZTsKICAgIH0KICAgIGlmIChpbmNsdWRlSW1hZ2VBbHQgJiYgImFsdCIgaW4gdmFsdWUyICYmIHZhbHVlMi5hbHQpIHsKICAgICAgcmV0dXJuIHZhbHVlMi5hbHQ7CiAgICB9CiAgICBpZiAoImNoaWxkcmVuIiBpbiB2YWx1ZTIpIHsKICAgICAgcmV0dXJuIGFsbCh2YWx1ZTIuY2hpbGRyZW4sIGluY2x1ZGVJbWFnZUFsdCwgaW5jbHVkZUh0bWwpOwogICAgfQogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZTIpKSB7CiAgICByZXR1cm4gYWxsKHZhbHVlMiwgaW5jbHVkZUltYWdlQWx0LCBpbmNsdWRlSHRtbCk7CiAgfQogIHJldHVybiAiIjsKfQpmdW5jdGlvbiBhbGwodmFsdWVzLCBpbmNsdWRlSW1hZ2VBbHQsIGluY2x1ZGVIdG1sKSB7CiAgY29uc3QgcmVzdWx0ID0gW107CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHZhbHVlcy5sZW5ndGgpIHsKICAgIHJlc3VsdFtpbmRleDJdID0gb25lKHZhbHVlc1tpbmRleDJdLCBpbmNsdWRlSW1hZ2VBbHQsIGluY2x1ZGVIdG1sKTsKICB9CiAgcmV0dXJuIHJlc3VsdC5qb2luKCIiKTsKfQpmdW5jdGlvbiBub2RlKHZhbHVlMikgewogIHJldHVybiBCb29sZWFuKHZhbHVlMiAmJiB0eXBlb2YgdmFsdWUyID09PSAib2JqZWN0Iik7Cn0KdmFyIGVtcHR5T3B0aW9uczsKdmFyIGluaXRfbGliMTMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLXN0cmluZ0A0LjAuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1zdHJpbmcvbGliL2luZGV4LmpzIigpIHsKICAgIGVtcHR5T3B0aW9ucyA9IHt9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1zdHJpbmdANC4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tc3RyaW5nL2luZGV4LmpzCnZhciBpbml0X21kYXN0X3V0aWxfdG9fc3RyaW5nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1zdHJpbmdANC4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tc3RyaW5nL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliMTMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvZm9ybWF0LWhlYWRpbmctYXMtc2V0ZXh0LmpzCmZ1bmN0aW9uIGZvcm1hdEhlYWRpbmdBc1NldGV4dChub2RlMiwgc3RhdGUxMCkgewogIGxldCBsaXRlcmFsV2l0aEJyZWFrID0gZmFsc2U7CiAgdmlzaXQobm9kZTIsIGZ1bmN0aW9uKG5vZGUzKSB7CiAgICBpZiAoInZhbHVlIiBpbiBub2RlMyAmJiAvXHI/XG58XHIvLnRlc3Qobm9kZTMudmFsdWUpIHx8IG5vZGUzLnR5cGUgPT09ICJicmVhayIpIHsKICAgICAgbGl0ZXJhbFdpdGhCcmVhayA9IHRydWU7CiAgICAgIHJldHVybiBFWElUOwogICAgfQogIH0pOwogIHJldHVybiBCb29sZWFuKAogICAgKCFub2RlMi5kZXB0aCB8fCBub2RlMi5kZXB0aCA8IDMpICYmIHRvU3RyaW5nKG5vZGUyKSAmJiAoc3RhdGUxMC5vcHRpb25zLnNldGV4dCB8fCBsaXRlcmFsV2l0aEJyZWFrKQogICk7Cn0KdmFyIGluaXRfZm9ybWF0X2hlYWRpbmdfYXNfc2V0ZXh0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9mb3JtYXQtaGVhZGluZy1hcy1zZXRleHQuanMiKCkgewogICAgaW5pdF91bmlzdF91dGlsX3Zpc2l0KCk7CiAgICBpbml0X21kYXN0X3V0aWxfdG9fc3RyaW5nKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvaGVhZGluZy5qcwpmdW5jdGlvbiBoZWFkaW5nKG5vZGUyLCBfNSwgc3RhdGUxMCwgaW5mbykgewogIGNvbnN0IHJhbmsgPSBNYXRoLm1heChNYXRoLm1pbig2LCBub2RlMi5kZXB0aCB8fCAxKSwgMSk7CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlMTAuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBpZiAoZm9ybWF0SGVhZGluZ0FzU2V0ZXh0KG5vZGUyLCBzdGF0ZTEwKSkgewogICAgY29uc3QgZXhpdDQgPSBzdGF0ZTEwLmVudGVyKCJoZWFkaW5nU2V0ZXh0Iik7CiAgICBjb25zdCBzdWJleGl0MiA9IHN0YXRlMTAuZW50ZXIoInBocmFzaW5nIik7CiAgICBjb25zdCB2YWx1ZTMgPSBzdGF0ZTEwLmNvbnRhaW5lclBocmFzaW5nKG5vZGUyLCB7CiAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpLAogICAgICBiZWZvcmU6ICJcbiIsCiAgICAgIGFmdGVyOiAiXG4iCiAgICB9KTsKICAgIHN1YmV4aXQyKCk7CiAgICBleGl0NCgpOwogICAgcmV0dXJuIHZhbHVlMyArICJcbiIgKyAocmFuayA9PT0gMSA/ICI9IiA6ICItIikucmVwZWF0KAogICAgICAvLyBUaGUgd2hvbGUgc2l6ZeKApgogICAgICB2YWx1ZTMubGVuZ3RoIC0gLy8gTWludXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGxhc3QgRU9MIChvcgogICAgICAvLyAwIGlmIHRoZXJlIGlzIG5vbmUp4oCmCiAgICAgIChNYXRoLm1heCh2YWx1ZTMubGFzdEluZGV4T2YoIlxyIiksIHZhbHVlMy5sYXN0SW5kZXhPZigiXG4iKSkgKyAxKQogICAgKTsKICB9CiAgY29uc3Qgc2VxdWVuY2UgPSAiIyIucmVwZWF0KHJhbmspOwogIGNvbnN0IGV4aXQzID0gc3RhdGUxMC5lbnRlcigiaGVhZGluZ0F0eCIpOwogIGNvbnN0IHN1YmV4aXQgPSBzdGF0ZTEwLmVudGVyKCJwaHJhc2luZyIpOwogIHRyYWNrZXIubW92ZShzZXF1ZW5jZSArICIgIik7CiAgbGV0IHZhbHVlMiA9IHN0YXRlMTAuY29udGFpbmVyUGhyYXNpbmcobm9kZTIsIHsKICAgIGJlZm9yZTogIiMgIiwKICAgIGFmdGVyOiAiXG4iLAogICAgLi4udHJhY2tlci5jdXJyZW50KCkKICB9KTsKICBpZiAoL15bXHQgXS8udGVzdCh2YWx1ZTIpKSB7CiAgICB2YWx1ZTIgPSBlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UodmFsdWUyLmNoYXJDb2RlQXQoMCkpICsgdmFsdWUyLnNsaWNlKDEpOwogIH0KICB2YWx1ZTIgPSB2YWx1ZTIgPyBzZXF1ZW5jZSArICIgIiArIHZhbHVlMiA6IHNlcXVlbmNlOwogIGlmIChzdGF0ZTEwLm9wdGlvbnMuY2xvc2VBdHgpIHsKICAgIHZhbHVlMiArPSAiICIgKyBzZXF1ZW5jZTsKICB9CiAgc3ViZXhpdCgpOwogIGV4aXQzKCk7CiAgcmV0dXJuIHZhbHVlMjsKfQp2YXIgaW5pdF9oZWFkaW5nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2hlYWRpbmcuanMiKCkgewogICAgaW5pdF9lbmNvZGVfY2hhcmFjdGVyX3JlZmVyZW5jZSgpOwogICAgaW5pdF9mb3JtYXRfaGVhZGluZ19hc19zZXRleHQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9odG1sLmpzCmZ1bmN0aW9uIGh0bWwobm9kZTIpIHsKICByZXR1cm4gbm9kZTIudmFsdWUgfHwgIiI7Cn0KZnVuY3Rpb24gaHRtbFBlZWsoKSB7CiAgcmV0dXJuICI8IjsKfQp2YXIgaW5pdF9odG1sID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2h0bWwuanMiKCkgewogICAgaHRtbC5wZWVrID0gaHRtbFBlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvaW1hZ2UuanMKZnVuY3Rpb24gaW1hZ2Uobm9kZTIsIF81LCBzdGF0ZTEwLCBpbmZvKSB7CiAgY29uc3QgcXVvdGUgPSBjaGVja1F1b3RlKHN0YXRlMTApOwogIGNvbnN0IHN1ZmZpeCA9IHF1b3RlID09PSAnIicgPyAiUXVvdGUiIDogIkFwb3N0cm9waGUiOwogIGNvbnN0IGV4aXQzID0gc3RhdGUxMC5lbnRlcigiaW1hZ2UiKTsKICBsZXQgc3ViZXhpdCA9IHN0YXRlMTAuZW50ZXIoImxhYmVsIik7CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlMTAuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBsZXQgdmFsdWUyID0gdHJhY2tlci5tb3ZlKCIhWyIpOwogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICBzdGF0ZTEwLnNhZmUobm9kZTIuYWx0LCB7IGJlZm9yZTogdmFsdWUyLCBhZnRlcjogIl0iLCAuLi50cmFja2VyLmN1cnJlbnQoKSB9KQogICk7CiAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiXSgiKTsKICBzdWJleGl0KCk7CiAgaWYgKAogICAgLy8gSWYgdGhlcmXigJlzIG5vIHVybCBidXQgdGhlcmUgaXMgYSB0aXRsZeKApgogICAgIW5vZGUyLnVybCAmJiBub2RlMi50aXRsZSB8fCAvLyBJZiB0aGVyZSBhcmUgY29udHJvbCBjaGFyYWN0ZXJzIG9yIHdoaXRlc3BhY2UuCiAgICAvW1wwLSBcdTAwN0ZdLy50ZXN0KG5vZGUyLnVybCkKICApIHsKICAgIHN1YmV4aXQgPSBzdGF0ZTEwLmVudGVyKCJkZXN0aW5hdGlvbkxpdGVyYWwiKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIjwiKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICAgIHN0YXRlMTAuc2FmZShub2RlMi51cmwsIHsgYmVmb3JlOiB2YWx1ZTIsIGFmdGVyOiAiPiIsIC4uLnRyYWNrZXIuY3VycmVudCgpIH0pCiAgICApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiPiIpOwogIH0gZWxzZSB7CiAgICBzdWJleGl0ID0gc3RhdGUxMC5lbnRlcigiZGVzdGluYXRpb25SYXciKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICAgIHN0YXRlMTAuc2FmZShub2RlMi51cmwsIHsKICAgICAgICBiZWZvcmU6IHZhbHVlMiwKICAgICAgICBhZnRlcjogbm9kZTIudGl0bGUgPyAiICIgOiAiKSIsCiAgICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgICAgfSkKICAgICk7CiAgfQogIHN1YmV4aXQoKTsKICBpZiAobm9kZTIudGl0bGUpIHsKICAgIHN1YmV4aXQgPSBzdGF0ZTEwLmVudGVyKGB0aXRsZSR7c3VmZml4fWApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiICIgKyBxdW90ZSk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZTEwLnNhZmUobm9kZTIudGl0bGUsIHsKICAgICAgICBiZWZvcmU6IHZhbHVlMiwKICAgICAgICBhZnRlcjogcXVvdGUsCiAgICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgICAgfSkKICAgICk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKHF1b3RlKTsKICAgIHN1YmV4aXQoKTsKICB9CiAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiKSIpOwogIGV4aXQzKCk7CiAgcmV0dXJuIHZhbHVlMjsKfQpmdW5jdGlvbiBpbWFnZVBlZWsoKSB7CiAgcmV0dXJuICIhIjsKfQp2YXIgaW5pdF9pbWFnZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9pbWFnZS5qcyIoKSB7CiAgICBpbml0X2NoZWNrX3F1b3RlKCk7CiAgICBpbWFnZS5wZWVrID0gaW1hZ2VQZWVrOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2ltYWdlLXJlZmVyZW5jZS5qcwpmdW5jdGlvbiBpbWFnZVJlZmVyZW5jZShub2RlMiwgXzUsIHN0YXRlMTAsIGluZm8pIHsKICBjb25zdCB0eXBlNSA9IG5vZGUyLnJlZmVyZW5jZVR5cGU7CiAgY29uc3QgZXhpdDMgPSBzdGF0ZTEwLmVudGVyKCJpbWFnZVJlZmVyZW5jZSIpOwogIGxldCBzdWJleGl0ID0gc3RhdGUxMC5lbnRlcigibGFiZWwiKTsKICBjb25zdCB0cmFja2VyID0gc3RhdGUxMC5jcmVhdGVUcmFja2VyKGluZm8pOwogIGxldCB2YWx1ZTIgPSB0cmFja2VyLm1vdmUoIiFbIik7CiAgY29uc3QgYWx0ID0gc3RhdGUxMC5zYWZlKG5vZGUyLmFsdCwgewogICAgYmVmb3JlOiB2YWx1ZTIsCiAgICBhZnRlcjogIl0iLAogICAgLi4udHJhY2tlci5jdXJyZW50KCkKICB9KTsKICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKGFsdCArICJdWyIpOwogIHN1YmV4aXQoKTsKICBjb25zdCBzdGFjayA9IHN0YXRlMTAuc3RhY2s7CiAgc3RhdGUxMC5zdGFjayA9IFtdOwogIHN1YmV4aXQgPSBzdGF0ZTEwLmVudGVyKCJyZWZlcmVuY2UiKTsKICBjb25zdCByZWZlcmVuY2UgPSBzdGF0ZTEwLnNhZmUoc3RhdGUxMC5hc3NvY2lhdGlvbklkKG5vZGUyKSwgewogICAgYmVmb3JlOiB2YWx1ZTIsCiAgICBhZnRlcjogIl0iLAogICAgLi4udHJhY2tlci5jdXJyZW50KCkKICB9KTsKICBzdWJleGl0KCk7CiAgc3RhdGUxMC5zdGFjayA9IHN0YWNrOwogIGV4aXQzKCk7CiAgaWYgKHR5cGU1ID09PSAiZnVsbCIgfHwgIWFsdCB8fCBhbHQgIT09IHJlZmVyZW5jZSkgewogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZShyZWZlcmVuY2UgKyAiXSIpOwogIH0gZWxzZSBpZiAodHlwZTUgPT09ICJzaG9ydGN1dCIpIHsKICAgIHZhbHVlMiA9IHZhbHVlMi5zbGljZSgwLCAtMSk7CiAgfSBlbHNlIHsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIl0iKTsKICB9CiAgcmV0dXJuIHZhbHVlMjsKfQpmdW5jdGlvbiBpbWFnZVJlZmVyZW5jZVBlZWsoKSB7CiAgcmV0dXJuICIhIjsKfQp2YXIgaW5pdF9pbWFnZV9yZWZlcmVuY2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvaW1hZ2UtcmVmZXJlbmNlLmpzIigpIHsKICAgIGltYWdlUmVmZXJlbmNlLnBlZWsgPSBpbWFnZVJlZmVyZW5jZVBlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvaW5saW5lLWNvZGUuanMKZnVuY3Rpb24gaW5saW5lQ29kZShub2RlMiwgXzUsIHN0YXRlMTApIHsKICBsZXQgdmFsdWUyID0gbm9kZTIudmFsdWUgfHwgIiI7CiAgbGV0IHNlcXVlbmNlID0gImAiOwogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAobmV3IFJlZ0V4cCgiKF58W15gXSkiICsgc2VxdWVuY2UgKyAiKFteYF18JCkiKS50ZXN0KHZhbHVlMikpIHsKICAgIHNlcXVlbmNlICs9ICJgIjsKICB9CiAgaWYgKC9bXiBcclxuXS8udGVzdCh2YWx1ZTIpICYmICgvXlsgXHJcbl0vLnRlc3QodmFsdWUyKSAmJiAvWyBcclxuXSQvLnRlc3QodmFsdWUyKSB8fCAvXmB8YCQvLnRlc3QodmFsdWUyKSkpIHsKICAgIHZhbHVlMiA9ICIgIiArIHZhbHVlMiArICIgIjsKICB9CiAgd2hpbGUgKCsraW5kZXgyIDwgc3RhdGUxMC51bnNhZmUubGVuZ3RoKSB7CiAgICBjb25zdCBwYXR0ZXJuID0gc3RhdGUxMC51bnNhZmVbaW5kZXgyXTsKICAgIGNvbnN0IGV4cHJlc3Npb24gPSBzdGF0ZTEwLmNvbXBpbGVQYXR0ZXJuKHBhdHRlcm4pOwogICAgbGV0IG1hdGNoMjsKICAgIGlmICghcGF0dGVybi5hdEJyZWFrKSBjb250aW51ZTsKICAgIHdoaWxlIChtYXRjaDIgPSBleHByZXNzaW9uLmV4ZWModmFsdWUyKSkgewogICAgICBsZXQgcG9zaXRpb24zID0gbWF0Y2gyLmluZGV4OwogICAgICBpZiAodmFsdWUyLmNoYXJDb2RlQXQocG9zaXRpb24zKSA9PT0gMTAgJiYgdmFsdWUyLmNoYXJDb2RlQXQocG9zaXRpb24zIC0gMSkgPT09IDEzKSB7CiAgICAgICAgcG9zaXRpb24zLS07CiAgICAgIH0KICAgICAgdmFsdWUyID0gdmFsdWUyLnNsaWNlKDAsIHBvc2l0aW9uMykgKyAiICIgKyB2YWx1ZTIuc2xpY2UobWF0Y2gyLmluZGV4ICsgMSk7CiAgICB9CiAgfQogIHJldHVybiBzZXF1ZW5jZSArIHZhbHVlMiArIHNlcXVlbmNlOwp9CmZ1bmN0aW9uIGlubGluZUNvZGVQZWVrKCkgewogIHJldHVybiAiYCI7Cn0KdmFyIGluaXRfaW5saW5lX2NvZGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvaW5saW5lLWNvZGUuanMiKCkgewogICAgaW5saW5lQ29kZS5wZWVrID0gaW5saW5lQ29kZVBlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2Zvcm1hdC1saW5rLWFzLWF1dG9saW5rLmpzCmZ1bmN0aW9uIGZvcm1hdExpbmtBc0F1dG9saW5rKG5vZGUyLCBzdGF0ZTEwKSB7CiAgY29uc3QgcmF3MiA9IHRvU3RyaW5nKG5vZGUyKTsKICByZXR1cm4gQm9vbGVhbigKICAgICFzdGF0ZTEwLm9wdGlvbnMucmVzb3VyY2VMaW5rICYmIC8vIElmIHRoZXJl4oCZcyBhIHVybOKApgogICAgbm9kZTIudXJsICYmIC8vIEFuZCB0aGVyZeKAmXMgYSBubyB0aXRsZeKApgogICAgIW5vZGUyLnRpdGxlICYmIC8vIEFuZCB0aGUgY29udGVudCBvZiBgbm9kZWAgaXMgYSBzaW5nbGUgdGV4dCBub2Rl4oCmCiAgICBub2RlMi5jaGlsZHJlbiAmJiBub2RlMi5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgbm9kZTIuY2hpbGRyZW5bMF0udHlwZSA9PT0gInRleHQiICYmIC8vIEFuZCBpZiB0aGUgdXJsIGlzIHRoZSBzYW1lIGFzIHRoZSBjb250ZW504oCmCiAgICAocmF3MiA9PT0gbm9kZTIudXJsIHx8ICJtYWlsdG86IiArIHJhdzIgPT09IG5vZGUyLnVybCkgJiYgLy8gQW5kIHRoYXQgc3RhcnRzIHcvIGEgcHJvdG9jb2zigKYKICAgIC9eW2Etel1bYS16Ky4tXSs6L2kudGVzdChub2RlMi51cmwpICYmIC8vIEFuZCB0aGF0IGRvZXNu4oCZdCBjb250YWluIEFTQ0lJIGNvbnRyb2wgY29kZXMgKGNoYXJhY3RlciBlc2NhcGVzIGFuZAogICAgLy8gcmVmZXJlbmNlcyBkb27igJl0IHdvcmspLCBzcGFjZSwgb3IgYW5nbGUgYnJhY2tldHPigKYKICAgICEvW1wwLSA8Plx1MDA3Rl0vLnRlc3Qobm9kZTIudXJsKQogICk7Cn0KdmFyIGluaXRfZm9ybWF0X2xpbmtfYXNfYXV0b2xpbmsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2Zvcm1hdC1saW5rLWFzLWF1dG9saW5rLmpzIigpIHsKICAgIGluaXRfbWRhc3RfdXRpbF90b19zdHJpbmcoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9saW5rLmpzCmZ1bmN0aW9uIGxpbmsobm9kZTIsIF81LCBzdGF0ZTEwLCBpbmZvKSB7CiAgY29uc3QgcXVvdGUgPSBjaGVja1F1b3RlKHN0YXRlMTApOwogIGNvbnN0IHN1ZmZpeCA9IHF1b3RlID09PSAnIicgPyAiUXVvdGUiIDogIkFwb3N0cm9waGUiOwogIGNvbnN0IHRyYWNrZXIgPSBzdGF0ZTEwLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgbGV0IGV4aXQzOwogIGxldCBzdWJleGl0OwogIGlmIChmb3JtYXRMaW5rQXNBdXRvbGluayhub2RlMiwgc3RhdGUxMCkpIHsKICAgIGNvbnN0IHN0YWNrID0gc3RhdGUxMC5zdGFjazsKICAgIHN0YXRlMTAuc3RhY2sgPSBbXTsKICAgIGV4aXQzID0gc3RhdGUxMC5lbnRlcigiYXV0b2xpbmsiKTsKICAgIGxldCB2YWx1ZTMgPSB0cmFja2VyLm1vdmUoIjwiKTsKICAgIHZhbHVlMyArPSB0cmFja2VyLm1vdmUoCiAgICAgIHN0YXRlMTAuY29udGFpbmVyUGhyYXNpbmcobm9kZTIsIHsKICAgICAgICBiZWZvcmU6IHZhbHVlMywKICAgICAgICBhZnRlcjogIj4iLAogICAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgICAgIH0pCiAgICApOwogICAgdmFsdWUzICs9IHRyYWNrZXIubW92ZSgiPiIpOwogICAgZXhpdDMoKTsKICAgIHN0YXRlMTAuc3RhY2sgPSBzdGFjazsKICAgIHJldHVybiB2YWx1ZTM7CiAgfQogIGV4aXQzID0gc3RhdGUxMC5lbnRlcigibGluayIpOwogIHN1YmV4aXQgPSBzdGF0ZTEwLmVudGVyKCJsYWJlbCIpOwogIGxldCB2YWx1ZTIgPSB0cmFja2VyLm1vdmUoIlsiKTsKICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgc3RhdGUxMC5jb250YWluZXJQaHJhc2luZyhub2RlMiwgewogICAgICBiZWZvcmU6IHZhbHVlMiwKICAgICAgYWZ0ZXI6ICJdKCIsCiAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgICB9KQogICk7CiAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiXSgiKTsKICBzdWJleGl0KCk7CiAgaWYgKAogICAgLy8gSWYgdGhlcmXigJlzIG5vIHVybCBidXQgdGhlcmUgaXMgYSB0aXRsZeKApgogICAgIW5vZGUyLnVybCAmJiBub2RlMi50aXRsZSB8fCAvLyBJZiB0aGVyZSBhcmUgY29udHJvbCBjaGFyYWN0ZXJzIG9yIHdoaXRlc3BhY2UuCiAgICAvW1wwLSBcdTAwN0ZdLy50ZXN0KG5vZGUyLnVybCkKICApIHsKICAgIHN1YmV4aXQgPSBzdGF0ZTEwLmVudGVyKCJkZXN0aW5hdGlvbkxpdGVyYWwiKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoIjwiKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICAgIHN0YXRlMTAuc2FmZShub2RlMi51cmwsIHsgYmVmb3JlOiB2YWx1ZTIsIGFmdGVyOiAiPiIsIC4uLnRyYWNrZXIuY3VycmVudCgpIH0pCiAgICApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiPiIpOwogIH0gZWxzZSB7CiAgICBzdWJleGl0ID0gc3RhdGUxMC5lbnRlcigiZGVzdGluYXRpb25SYXciKTsKICAgIHZhbHVlMiArPSB0cmFja2VyLm1vdmUoCiAgICAgIHN0YXRlMTAuc2FmZShub2RlMi51cmwsIHsKICAgICAgICBiZWZvcmU6IHZhbHVlMiwKICAgICAgICBhZnRlcjogbm9kZTIudGl0bGUgPyAiICIgOiAiKSIsCiAgICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgICAgfSkKICAgICk7CiAgfQogIHN1YmV4aXQoKTsKICBpZiAobm9kZTIudGl0bGUpIHsKICAgIHN1YmV4aXQgPSBzdGF0ZTEwLmVudGVyKGB0aXRsZSR7c3VmZml4fWApOwogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiICIgKyBxdW90ZSk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKAogICAgICBzdGF0ZTEwLnNhZmUobm9kZTIudGl0bGUsIHsKICAgICAgICBiZWZvcmU6IHZhbHVlMiwKICAgICAgICBhZnRlcjogcXVvdGUsCiAgICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgICAgfSkKICAgICk7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKHF1b3RlKTsKICAgIHN1YmV4aXQoKTsKICB9CiAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiKSIpOwogIGV4aXQzKCk7CiAgcmV0dXJuIHZhbHVlMjsKfQpmdW5jdGlvbiBsaW5rUGVlayhub2RlMiwgXzUsIHN0YXRlMTApIHsKICByZXR1cm4gZm9ybWF0TGlua0FzQXV0b2xpbmsobm9kZTIsIHN0YXRlMTApID8gIjwiIDogIlsiOwp9CnZhciBpbml0X2xpbmsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvbGluay5qcyIoKSB7CiAgICBpbml0X2NoZWNrX3F1b3RlKCk7CiAgICBpbml0X2Zvcm1hdF9saW5rX2FzX2F1dG9saW5rKCk7CiAgICBsaW5rLnBlZWsgPSBsaW5rUGVlazsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9saW5rLXJlZmVyZW5jZS5qcwpmdW5jdGlvbiBsaW5rUmVmZXJlbmNlKG5vZGUyLCBfNSwgc3RhdGUxMCwgaW5mbykgewogIGNvbnN0IHR5cGU1ID0gbm9kZTIucmVmZXJlbmNlVHlwZTsKICBjb25zdCBleGl0MyA9IHN0YXRlMTAuZW50ZXIoImxpbmtSZWZlcmVuY2UiKTsKICBsZXQgc3ViZXhpdCA9IHN0YXRlMTAuZW50ZXIoImxhYmVsIik7CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlMTAuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBsZXQgdmFsdWUyID0gdHJhY2tlci5tb3ZlKCJbIik7CiAgY29uc3QgdGV4dDkgPSBzdGF0ZTEwLmNvbnRhaW5lclBocmFzaW5nKG5vZGUyLCB7CiAgICBiZWZvcmU6IHZhbHVlMiwKICAgIGFmdGVyOiAiXSIsCiAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogIH0pOwogIHZhbHVlMiArPSB0cmFja2VyLm1vdmUodGV4dDkgKyAiXVsiKTsKICBzdWJleGl0KCk7CiAgY29uc3Qgc3RhY2sgPSBzdGF0ZTEwLnN0YWNrOwogIHN0YXRlMTAuc3RhY2sgPSBbXTsKICBzdWJleGl0ID0gc3RhdGUxMC5lbnRlcigicmVmZXJlbmNlIik7CiAgY29uc3QgcmVmZXJlbmNlID0gc3RhdGUxMC5zYWZlKHN0YXRlMTAuYXNzb2NpYXRpb25JZChub2RlMiksIHsKICAgIGJlZm9yZTogdmFsdWUyLAogICAgYWZ0ZXI6ICJdIiwKICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgfSk7CiAgc3ViZXhpdCgpOwogIHN0YXRlMTAuc3RhY2sgPSBzdGFjazsKICBleGl0MygpOwogIGlmICh0eXBlNSA9PT0gImZ1bGwiIHx8ICF0ZXh0OSB8fCB0ZXh0OSAhPT0gcmVmZXJlbmNlKSB7CiAgICB2YWx1ZTIgKz0gdHJhY2tlci5tb3ZlKHJlZmVyZW5jZSArICJdIik7CiAgfSBlbHNlIGlmICh0eXBlNSA9PT0gInNob3J0Y3V0IikgewogICAgdmFsdWUyID0gdmFsdWUyLnNsaWNlKDAsIC0xKTsKICB9IGVsc2UgewogICAgdmFsdWUyICs9IHRyYWNrZXIubW92ZSgiXSIpOwogIH0KICByZXR1cm4gdmFsdWUyOwp9CmZ1bmN0aW9uIGxpbmtSZWZlcmVuY2VQZWVrKCkgewogIHJldHVybiAiWyI7Cn0KdmFyIGluaXRfbGlua19yZWZlcmVuY2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvbGluay1yZWZlcmVuY2UuanMiKCkgewogICAgbGlua1JlZmVyZW5jZS5wZWVrID0gbGlua1JlZmVyZW5jZVBlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLWJ1bGxldC5qcwpmdW5jdGlvbiBjaGVja0J1bGxldChzdGF0ZTEwKSB7CiAgY29uc3QgbWFya2VyID0gc3RhdGUxMC5vcHRpb25zLmJ1bGxldCB8fCAiKiI7CiAgaWYgKG1hcmtlciAhPT0gIioiICYmIG1hcmtlciAhPT0gIisiICYmIG1hcmtlciAhPT0gIi0iKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICJDYW5ub3Qgc2VyaWFsaXplIGl0ZW1zIHdpdGggYCIgKyBtYXJrZXIgKyAiYCBmb3IgYG9wdGlvbnMuYnVsbGV0YCwgZXhwZWN0ZWQgYCpgLCBgK2AsIG9yIGAtYCIKICAgICk7CiAgfQogIHJldHVybiBtYXJrZXI7Cn0KdmFyIGluaXRfY2hlY2tfYnVsbGV0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1idWxsZXQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1idWxsZXQtb3RoZXIuanMKZnVuY3Rpb24gY2hlY2tCdWxsZXRPdGhlcihzdGF0ZTEwKSB7CiAgY29uc3QgYnVsbGV0ID0gY2hlY2tCdWxsZXQoc3RhdGUxMCk7CiAgY29uc3QgYnVsbGV0T3RoZXIgPSBzdGF0ZTEwLm9wdGlvbnMuYnVsbGV0T3RoZXI7CiAgaWYgKCFidWxsZXRPdGhlcikgewogICAgcmV0dXJuIGJ1bGxldCA9PT0gIioiID8gIi0iIDogIioiOwogIH0KICBpZiAoYnVsbGV0T3RoZXIgIT09ICIqIiAmJiBidWxsZXRPdGhlciAhPT0gIisiICYmIGJ1bGxldE90aGVyICE9PSAiLSIpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgIkNhbm5vdCBzZXJpYWxpemUgaXRlbXMgd2l0aCBgIiArIGJ1bGxldE90aGVyICsgImAgZm9yIGBvcHRpb25zLmJ1bGxldE90aGVyYCwgZXhwZWN0ZWQgYCpgLCBgK2AsIG9yIGAtYCIKICAgICk7CiAgfQogIGlmIChidWxsZXRPdGhlciA9PT0gYnVsbGV0KSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICJFeHBlY3RlZCBgYnVsbGV0YCAoYCIgKyBidWxsZXQgKyAiYCkgYW5kIGBidWxsZXRPdGhlcmAgKGAiICsgYnVsbGV0T3RoZXIgKyAiYCkgdG8gYmUgZGlmZmVyZW50IgogICAgKTsKICB9CiAgcmV0dXJuIGJ1bGxldE90aGVyOwp9CnZhciBpbml0X2NoZWNrX2J1bGxldF9vdGhlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stYnVsbGV0LW90aGVyLmpzIigpIHsKICAgIGluaXRfY2hlY2tfYnVsbGV0KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLWJ1bGxldC1vcmRlcmVkLmpzCmZ1bmN0aW9uIGNoZWNrQnVsbGV0T3JkZXJlZChzdGF0ZTEwKSB7CiAgY29uc3QgbWFya2VyID0gc3RhdGUxMC5vcHRpb25zLmJ1bGxldE9yZGVyZWQgfHwgIi4iOwogIGlmIChtYXJrZXIgIT09ICIuIiAmJiBtYXJrZXIgIT09ICIpIikgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAiQ2Fubm90IHNlcmlhbGl6ZSBpdGVtcyB3aXRoIGAiICsgbWFya2VyICsgImAgZm9yIGBvcHRpb25zLmJ1bGxldE9yZGVyZWRgLCBleHBlY3RlZCBgLmAgb3IgYClgIgogICAgKTsKICB9CiAgcmV0dXJuIG1hcmtlcjsKfQp2YXIgaW5pdF9jaGVja19idWxsZXRfb3JkZXJlZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stYnVsbGV0LW9yZGVyZWQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1ydWxlLmpzCmZ1bmN0aW9uIGNoZWNrUnVsZShzdGF0ZTEwKSB7CiAgY29uc3QgbWFya2VyID0gc3RhdGUxMC5vcHRpb25zLnJ1bGUgfHwgIioiOwogIGlmIChtYXJrZXIgIT09ICIqIiAmJiBtYXJrZXIgIT09ICItIiAmJiBtYXJrZXIgIT09ICJfIikgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAiQ2Fubm90IHNlcmlhbGl6ZSBydWxlcyB3aXRoIGAiICsgbWFya2VyICsgImAgZm9yIGBvcHRpb25zLnJ1bGVgLCBleHBlY3RlZCBgKmAsIGAtYCwgb3IgYF9gIgogICAgKTsKICB9CiAgcmV0dXJuIG1hcmtlcjsKfQp2YXIgaW5pdF9jaGVja19ydWxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1ydWxlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9saXN0LmpzCmZ1bmN0aW9uIGxpc3QyKG5vZGUyLCBwYXJlbnQsIHN0YXRlMTAsIGluZm8pIHsKICBjb25zdCBleGl0MyA9IHN0YXRlMTAuZW50ZXIoImxpc3QiKTsKICBjb25zdCBidWxsZXRDdXJyZW50ID0gc3RhdGUxMC5idWxsZXRDdXJyZW50OwogIGxldCBidWxsZXQgPSBub2RlMi5vcmRlcmVkID8gY2hlY2tCdWxsZXRPcmRlcmVkKHN0YXRlMTApIDogY2hlY2tCdWxsZXQoc3RhdGUxMCk7CiAgY29uc3QgYnVsbGV0T3RoZXIgPSBub2RlMi5vcmRlcmVkID8gYnVsbGV0ID09PSAiLiIgPyAiKSIgOiAiLiIgOiBjaGVja0J1bGxldE90aGVyKHN0YXRlMTApOwogIGxldCB1c2VEaWZmZXJlbnRNYXJrZXIgPSBwYXJlbnQgJiYgc3RhdGUxMC5idWxsZXRMYXN0VXNlZCA/IGJ1bGxldCA9PT0gc3RhdGUxMC5idWxsZXRMYXN0VXNlZCA6IGZhbHNlOwogIGlmICghbm9kZTIub3JkZXJlZCkgewogICAgY29uc3QgZmlyc3RMaXN0SXRlbSA9IG5vZGUyLmNoaWxkcmVuID8gbm9kZTIuY2hpbGRyZW5bMF0gOiB2b2lkIDA7CiAgICBpZiAoCiAgICAgIC8vIEJ1bGxldCBjb3VsZCBiZSB1c2VkIGFzIGEgdGhlbWF0aWMgYnJlYWsgbWFya2VyOgogICAgICAoYnVsbGV0ID09PSAiKiIgfHwgYnVsbGV0ID09PSAiLSIpICYmIC8vIEVtcHR5IGZpcnN0IGxpc3QgaXRlbToKICAgICAgZmlyc3RMaXN0SXRlbSAmJiAoIWZpcnN0TGlzdEl0ZW0uY2hpbGRyZW4gfHwgIWZpcnN0TGlzdEl0ZW0uY2hpbGRyZW5bMF0pICYmIC8vIERpcmVjdGx5IGluIHR3byBvdGhlciBsaXN0IGl0ZW1zOgogICAgICBzdGF0ZTEwLnN0YWNrW3N0YXRlMTAuc3RhY2subGVuZ3RoIC0gMV0gPT09ICJsaXN0IiAmJiBzdGF0ZTEwLnN0YWNrW3N0YXRlMTAuc3RhY2subGVuZ3RoIC0gMl0gPT09ICJsaXN0SXRlbSIgJiYgc3RhdGUxMC5zdGFja1tzdGF0ZTEwLnN0YWNrLmxlbmd0aCAtIDNdID09PSAibGlzdCIgJiYgc3RhdGUxMC5zdGFja1tzdGF0ZTEwLnN0YWNrLmxlbmd0aCAtIDRdID09PSAibGlzdEl0ZW0iICYmIC8vIFRoYXQgYXJlIGVhY2ggdGhlIGZpcnN0IGNoaWxkLgogICAgICBzdGF0ZTEwLmluZGV4U3RhY2tbc3RhdGUxMC5pbmRleFN0YWNrLmxlbmd0aCAtIDFdID09PSAwICYmIHN0YXRlMTAuaW5kZXhTdGFja1tzdGF0ZTEwLmluZGV4U3RhY2subGVuZ3RoIC0gMl0gPT09IDAgJiYgc3RhdGUxMC5pbmRleFN0YWNrW3N0YXRlMTAuaW5kZXhTdGFjay5sZW5ndGggLSAzXSA9PT0gMAogICAgKSB7CiAgICAgIHVzZURpZmZlcmVudE1hcmtlciA9IHRydWU7CiAgICB9CiAgICBpZiAoY2hlY2tSdWxlKHN0YXRlMTApID09PSBidWxsZXQgJiYgZmlyc3RMaXN0SXRlbSkgewogICAgICBsZXQgaW5kZXgyID0gLTE7CiAgICAgIHdoaWxlICgrK2luZGV4MiA8IG5vZGUyLmNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgIGNvbnN0IGl0ZW0gPSBub2RlMi5jaGlsZHJlbltpbmRleDJdOwogICAgICAgIGlmIChpdGVtICYmIGl0ZW0udHlwZSA9PT0gImxpc3RJdGVtIiAmJiBpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW5bMF0gJiYgaXRlbS5jaGlsZHJlblswXS50eXBlID09PSAidGhlbWF0aWNCcmVhayIpIHsKICAgICAgICAgIHVzZURpZmZlcmVudE1hcmtlciA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKHVzZURpZmZlcmVudE1hcmtlcikgewogICAgYnVsbGV0ID0gYnVsbGV0T3RoZXI7CiAgfQogIHN0YXRlMTAuYnVsbGV0Q3VycmVudCA9IGJ1bGxldDsKICBjb25zdCB2YWx1ZTIgPSBzdGF0ZTEwLmNvbnRhaW5lckZsb3cobm9kZTIsIGluZm8pOwogIHN0YXRlMTAuYnVsbGV0TGFzdFVzZWQgPSBidWxsZXQ7CiAgc3RhdGUxMC5idWxsZXRDdXJyZW50ID0gYnVsbGV0Q3VycmVudDsKICBleGl0MygpOwogIHJldHVybiB2YWx1ZTI7Cn0KdmFyIGluaXRfbGlzdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9saXN0LmpzIigpIHsKICAgIGluaXRfY2hlY2tfYnVsbGV0KCk7CiAgICBpbml0X2NoZWNrX2J1bGxldF9vdGhlcigpOwogICAgaW5pdF9jaGVja19idWxsZXRfb3JkZXJlZCgpOwogICAgaW5pdF9jaGVja19ydWxlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLWxpc3QtaXRlbS1pbmRlbnQuanMKZnVuY3Rpb24gY2hlY2tMaXN0SXRlbUluZGVudChzdGF0ZTEwKSB7CiAgY29uc3Qgc3R5bGUgPSBzdGF0ZTEwLm9wdGlvbnMubGlzdEl0ZW1JbmRlbnQgfHwgIm9uZSI7CiAgaWYgKHN0eWxlICE9PSAidGFiIiAmJiBzdHlsZSAhPT0gIm9uZSIgJiYgc3R5bGUgIT09ICJtaXhlZCIpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgIkNhbm5vdCBzZXJpYWxpemUgaXRlbXMgd2l0aCBgIiArIHN0eWxlICsgImAgZm9yIGBvcHRpb25zLmxpc3RJdGVtSW5kZW50YCwgZXhwZWN0ZWQgYHRhYmAsIGBvbmVgLCBvciBgbWl4ZWRgIgogICAgKTsKICB9CiAgcmV0dXJuIHN0eWxlOwp9CnZhciBpbml0X2NoZWNrX2xpc3RfaXRlbV9pbmRlbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLWxpc3QtaXRlbS1pbmRlbnQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2xpc3QtaXRlbS5qcwpmdW5jdGlvbiBsaXN0SXRlbShub2RlMiwgcGFyZW50LCBzdGF0ZTEwLCBpbmZvKSB7CiAgY29uc3QgbGlzdEl0ZW1JbmRlbnQgPSBjaGVja0xpc3RJdGVtSW5kZW50KHN0YXRlMTApOwogIGxldCBidWxsZXQgPSBzdGF0ZTEwLmJ1bGxldEN1cnJlbnQgfHwgY2hlY2tCdWxsZXQoc3RhdGUxMCk7CiAgaWYgKHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PT0gImxpc3QiICYmIHBhcmVudC5vcmRlcmVkKSB7CiAgICBidWxsZXQgPSAodHlwZW9mIHBhcmVudC5zdGFydCA9PT0gIm51bWJlciIgJiYgcGFyZW50LnN0YXJ0ID4gLTEgPyBwYXJlbnQuc3RhcnQgOiAxKSArIChzdGF0ZTEwLm9wdGlvbnMuaW5jcmVtZW50TGlzdE1hcmtlciA9PT0gZmFsc2UgPyAwIDogcGFyZW50LmNoaWxkcmVuLmluZGV4T2Yobm9kZTIpKSArIGJ1bGxldDsKICB9CiAgbGV0IHNpemUgPSBidWxsZXQubGVuZ3RoICsgMTsKICBpZiAobGlzdEl0ZW1JbmRlbnQgPT09ICJ0YWIiIHx8IGxpc3RJdGVtSW5kZW50ID09PSAibWl4ZWQiICYmIChwYXJlbnQgJiYgcGFyZW50LnR5cGUgPT09ICJsaXN0IiAmJiBwYXJlbnQuc3ByZWFkIHx8IG5vZGUyLnNwcmVhZCkpIHsKICAgIHNpemUgPSBNYXRoLmNlaWwoc2l6ZSAvIDQpICogNDsKICB9CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlMTAuY3JlYXRlVHJhY2tlcihpbmZvKTsKICB0cmFja2VyLm1vdmUoYnVsbGV0ICsgIiAiLnJlcGVhdChzaXplIC0gYnVsbGV0Lmxlbmd0aCkpOwogIHRyYWNrZXIuc2hpZnQoc2l6ZSk7CiAgY29uc3QgZXhpdDMgPSBzdGF0ZTEwLmVudGVyKCJsaXN0SXRlbSIpOwogIGNvbnN0IHZhbHVlMiA9IHN0YXRlMTAuaW5kZW50TGluZXMoCiAgICBzdGF0ZTEwLmNvbnRhaW5lckZsb3cobm9kZTIsIHRyYWNrZXIuY3VycmVudCgpKSwKICAgIG1hcDcKICApOwogIGV4aXQzKCk7CiAgcmV0dXJuIHZhbHVlMjsKICBmdW5jdGlvbiBtYXA3KGxpbmUsIGluZGV4MiwgYmxhbmspIHsKICAgIGlmIChpbmRleDIpIHsKICAgICAgcmV0dXJuIChibGFuayA/ICIiIDogIiAiLnJlcGVhdChzaXplKSkgKyBsaW5lOwogICAgfQogICAgcmV0dXJuIChibGFuayA/IGJ1bGxldCA6IGJ1bGxldCArICIgIi5yZXBlYXQoc2l6ZSAtIGJ1bGxldC5sZW5ndGgpKSArIGxpbmU7CiAgfQp9CnZhciBpbml0X2xpc3RfaXRlbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9saXN0LWl0ZW0uanMiKCkgewogICAgaW5pdF9jaGVja19idWxsZXQoKTsKICAgIGluaXRfY2hlY2tfbGlzdF9pdGVtX2luZGVudCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL3BhcmFncmFwaC5qcwpmdW5jdGlvbiBwYXJhZ3JhcGgobm9kZTIsIF81LCBzdGF0ZTEwLCBpbmZvKSB7CiAgY29uc3QgZXhpdDMgPSBzdGF0ZTEwLmVudGVyKCJwYXJhZ3JhcGgiKTsKICBjb25zdCBzdWJleGl0ID0gc3RhdGUxMC5lbnRlcigicGhyYXNpbmciKTsKICBjb25zdCB2YWx1ZTIgPSBzdGF0ZTEwLmNvbnRhaW5lclBocmFzaW5nKG5vZGUyLCBpbmZvKTsKICBzdWJleGl0KCk7CiAgZXhpdDMoKTsKICByZXR1cm4gdmFsdWUyOwp9CnZhciBpbml0X3BhcmFncmFwaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9wYXJhZ3JhcGguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1waHJhc2luZ0A0LjEuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1waHJhc2luZy9saWIvaW5kZXguanMKdmFyIHBocmFzaW5nOwp2YXIgaW5pdF9saWIxNCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtcGhyYXNpbmdANC4xLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtcGhyYXNpbmcvbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfdW5pc3RfdXRpbF9pcygpOwogICAgcGhyYXNpbmcgPSAvKiogQHR5cGUgeyhub2RlPzogdW5rbm93bikgPT4gbm9kZSBpcyBFeGNsdWRlPFBocmFzaW5nQ29udGVudCwgSHRtbD59ICovCiAgICBjb252ZXJ0KFsKICAgICAgImJyZWFrIiwKICAgICAgImRlbGV0ZSIsCiAgICAgICJlbXBoYXNpcyIsCiAgICAgIC8vIFRvIGRvOiBuZXh0IG1ham9yOiByZW1vdmVkIHNpbmNlIGZvb3Rub3RlcyB3ZXJlIGFkZGVkIHRvIEdGTS4KICAgICAgImZvb3Rub3RlIiwKICAgICAgImZvb3Rub3RlUmVmZXJlbmNlIiwKICAgICAgImltYWdlIiwKICAgICAgImltYWdlUmVmZXJlbmNlIiwKICAgICAgImlubGluZUNvZGUiLAogICAgICAvLyBFbmFibGVkIGJ5IGBtZGFzdC11dGlsLW1hdGhgOgogICAgICAiaW5saW5lTWF0aCIsCiAgICAgICJsaW5rIiwKICAgICAgImxpbmtSZWZlcmVuY2UiLAogICAgICAvLyBFbmFibGVkIGJ5IGBtZGFzdC11dGlsLW1keGA6CiAgICAgICJtZHhKc3hUZXh0RWxlbWVudCIsCiAgICAgIC8vIEVuYWJsZWQgYnkgYG1kYXN0LXV0aWwtbWR4YDoKICAgICAgIm1keFRleHRFeHByZXNzaW9uIiwKICAgICAgInN0cm9uZyIsCiAgICAgICJ0ZXh0IiwKICAgICAgLy8gRW5hYmxlZCBieSBgbWRhc3QtdXRpbC1kaXJlY3RpdmVgOgogICAgICAidGV4dERpcmVjdGl2ZSIKICAgIF0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1waHJhc2luZ0A0LjEuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1waHJhc2luZy9pbmRleC5qcwp2YXIgaW5pdF9tZGFzdF91dGlsX3BocmFzaW5nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1waHJhc2luZ0A0LjEuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1waHJhc2luZy9pbmRleC5qcyIoKSB7CiAgICBpbml0X2xpYjE0KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvcm9vdC5qcwpmdW5jdGlvbiByb290KG5vZGUyLCBfNSwgc3RhdGUxMCwgaW5mbykgewogIGNvbnN0IGhhc1BocmFzaW5nID0gbm9kZTIuY2hpbGRyZW4uc29tZShmdW5jdGlvbihkNikgewogICAgcmV0dXJuIHBocmFzaW5nKGQ2KTsKICB9KTsKICBjb25zdCBjb250YWluZXIgPSBoYXNQaHJhc2luZyA/IHN0YXRlMTAuY29udGFpbmVyUGhyYXNpbmcgOiBzdGF0ZTEwLmNvbnRhaW5lckZsb3c7CiAgcmV0dXJuIGNvbnRhaW5lci5jYWxsKHN0YXRlMTAsIG5vZGUyLCBpbmZvKTsKfQp2YXIgaW5pdF9yb290ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL3Jvb3QuanMiKCkgewogICAgaW5pdF9tZGFzdF91dGlsX3BocmFzaW5nKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLXN0cm9uZy5qcwpmdW5jdGlvbiBjaGVja1N0cm9uZyhzdGF0ZTEwKSB7CiAgY29uc3QgbWFya2VyID0gc3RhdGUxMC5vcHRpb25zLnN0cm9uZyB8fCAiKiI7CiAgaWYgKG1hcmtlciAhPT0gIioiICYmIG1hcmtlciAhPT0gIl8iKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICJDYW5ub3Qgc2VyaWFsaXplIHN0cm9uZyB3aXRoIGAiICsgbWFya2VyICsgImAgZm9yIGBvcHRpb25zLnN0cm9uZ2AsIGV4cGVjdGVkIGAqYCwgb3IgYF9gIgogICAgKTsKICB9CiAgcmV0dXJuIG1hcmtlcjsKfQp2YXIgaW5pdF9jaGVja19zdHJvbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLXN0cm9uZy5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvc3Ryb25nLmpzCmZ1bmN0aW9uIHN0cm9uZyhub2RlMiwgXzUsIHN0YXRlMTAsIGluZm8pIHsKICBjb25zdCBtYXJrZXIgPSBjaGVja1N0cm9uZyhzdGF0ZTEwKTsKICBjb25zdCBleGl0MyA9IHN0YXRlMTAuZW50ZXIoInN0cm9uZyIpOwogIGNvbnN0IHRyYWNrZXIgPSBzdGF0ZTEwLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgY29uc3QgYmVmb3JlID0gdHJhY2tlci5tb3ZlKG1hcmtlciArIG1hcmtlcik7CiAgbGV0IGJldHdlZW4yID0gdHJhY2tlci5tb3ZlKAogICAgc3RhdGUxMC5jb250YWluZXJQaHJhc2luZyhub2RlMiwgewogICAgICBhZnRlcjogbWFya2VyLAogICAgICBiZWZvcmUsCiAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpCiAgICB9KQogICk7CiAgY29uc3QgYmV0d2VlbkhlYWQgPSBiZXR3ZWVuMi5jaGFyQ29kZUF0KDApOwogIGNvbnN0IG9wZW4gPSBlbmNvZGVJbmZvKAogICAgaW5mby5iZWZvcmUuY2hhckNvZGVBdChpbmZvLmJlZm9yZS5sZW5ndGggLSAxKSwKICAgIGJldHdlZW5IZWFkLAogICAgbWFya2VyCiAgKTsKICBpZiAob3Blbi5pbnNpZGUpIHsKICAgIGJldHdlZW4yID0gZW5jb2RlQ2hhcmFjdGVyUmVmZXJlbmNlKGJldHdlZW5IZWFkKSArIGJldHdlZW4yLnNsaWNlKDEpOwogIH0KICBjb25zdCBiZXR3ZWVuVGFpbCA9IGJldHdlZW4yLmNoYXJDb2RlQXQoYmV0d2VlbjIubGVuZ3RoIC0gMSk7CiAgY29uc3QgY2xvc2U3ID0gZW5jb2RlSW5mbyhpbmZvLmFmdGVyLmNoYXJDb2RlQXQoMCksIGJldHdlZW5UYWlsLCBtYXJrZXIpOwogIGlmIChjbG9zZTcuaW5zaWRlKSB7CiAgICBiZXR3ZWVuMiA9IGJldHdlZW4yLnNsaWNlKDAsIC0xKSArIGVuY29kZUNoYXJhY3RlclJlZmVyZW5jZShiZXR3ZWVuVGFpbCk7CiAgfQogIGNvbnN0IGFmdGVyID0gdHJhY2tlci5tb3ZlKG1hcmtlciArIG1hcmtlcik7CiAgZXhpdDMoKTsKICBzdGF0ZTEwLmF0dGVudGlvbkVuY29kZVN1cnJvdW5kaW5nSW5mbyA9IHsKICAgIGFmdGVyOiBjbG9zZTcub3V0c2lkZSwKICAgIGJlZm9yZTogb3Blbi5vdXRzaWRlCiAgfTsKICByZXR1cm4gYmVmb3JlICsgYmV0d2VlbjIgKyBhZnRlcjsKfQpmdW5jdGlvbiBzdHJvbmdQZWVrKF81LCBfMSwgc3RhdGUxMCkgewogIHJldHVybiBzdGF0ZTEwLm9wdGlvbnMuc3Ryb25nIHx8ICIqIjsKfQp2YXIgaW5pdF9zdHJvbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvc3Ryb25nLmpzIigpIHsKICAgIGluaXRfY2hlY2tfc3Ryb25nKCk7CiAgICBpbml0X2VuY29kZV9jaGFyYWN0ZXJfcmVmZXJlbmNlKCk7CiAgICBpbml0X2VuY29kZV9pbmZvKCk7CiAgICBzdHJvbmcucGVlayA9IHN0cm9uZ1BlZWs7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvdGV4dC5qcwpmdW5jdGlvbiB0ZXh0KG5vZGUyLCBfNSwgc3RhdGUxMCwgaW5mbykgewogIHJldHVybiBzdGF0ZTEwLnNhZmUobm9kZTIudmFsdWUsIGluZm8pOwp9CnZhciBpbml0X3RleHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvdGV4dC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLXJ1bGUtcmVwZXRpdGlvbi5qcwpmdW5jdGlvbiBjaGVja1J1bGVSZXBldGl0aW9uKHN0YXRlMTApIHsKICBjb25zdCByZXBldGl0aW9uID0gc3RhdGUxMC5vcHRpb25zLnJ1bGVSZXBldGl0aW9uIHx8IDM7CiAgaWYgKHJlcGV0aXRpb24gPCAzKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICJDYW5ub3Qgc2VyaWFsaXplIHJ1bGVzIHdpdGggcmVwZXRpdGlvbiBgIiArIHJlcGV0aXRpb24gKyAiYCBmb3IgYG9wdGlvbnMucnVsZVJlcGV0aXRpb25gLCBleHBlY3RlZCBgM2Agb3IgbW9yZSIKICAgICk7CiAgfQogIHJldHVybiByZXBldGl0aW9uOwp9CnZhciBpbml0X2NoZWNrX3J1bGVfcmVwZXRpdGlvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY2hlY2stcnVsZS1yZXBldGl0aW9uLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS90aGVtYXRpYy1icmVhay5qcwpmdW5jdGlvbiB0aGVtYXRpY0JyZWFrKF81LCBfMSwgc3RhdGUxMCkgewogIGNvbnN0IHZhbHVlMiA9IChjaGVja1J1bGUoc3RhdGUxMCkgKyAoc3RhdGUxMC5vcHRpb25zLnJ1bGVTcGFjZXMgPyAiICIgOiAiIikpLnJlcGVhdChjaGVja1J1bGVSZXBldGl0aW9uKHN0YXRlMTApKTsKICByZXR1cm4gc3RhdGUxMC5vcHRpb25zLnJ1bGVTcGFjZXMgPyB2YWx1ZTIuc2xpY2UoMCwgLTEpIDogdmFsdWUyOwp9CnZhciBpbml0X3RoZW1hdGljX2JyZWFrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL3RoZW1hdGljLWJyZWFrLmpzIigpIHsKICAgIGluaXRfY2hlY2tfcnVsZV9yZXBldGl0aW9uKCk7CiAgICBpbml0X2NoZWNrX3J1bGUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9pbmRleC5qcwp2YXIgaGFuZGxlOwp2YXIgaW5pdF9oYW5kbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9oYW5kbGUvaW5kZXguanMiKCkgewogICAgaW5pdF9ibG9ja3F1b3RlKCk7CiAgICBpbml0X2JyZWFrKCk7CiAgICBpbml0X2NvZGUoKTsKICAgIGluaXRfZGVmaW5pdGlvbigpOwogICAgaW5pdF9lbXBoYXNpcygpOwogICAgaW5pdF9oZWFkaW5nKCk7CiAgICBpbml0X2h0bWwoKTsKICAgIGluaXRfaW1hZ2UoKTsKICAgIGluaXRfaW1hZ2VfcmVmZXJlbmNlKCk7CiAgICBpbml0X2lubGluZV9jb2RlKCk7CiAgICBpbml0X2xpbmsoKTsKICAgIGluaXRfbGlua19yZWZlcmVuY2UoKTsKICAgIGluaXRfbGlzdCgpOwogICAgaW5pdF9saXN0X2l0ZW0oKTsKICAgIGluaXRfcGFyYWdyYXBoKCk7CiAgICBpbml0X3Jvb3QoKTsKICAgIGluaXRfc3Ryb25nKCk7CiAgICBpbml0X3RleHQoKTsKICAgIGluaXRfdGhlbWF0aWNfYnJlYWsoKTsKICAgIGhhbmRsZSA9IHsKICAgICAgYmxvY2txdW90ZSwKICAgICAgYnJlYWs6IGhhcmRCcmVhaywKICAgICAgY29kZSwKICAgICAgZGVmaW5pdGlvbiwKICAgICAgZW1waGFzaXMsCiAgICAgIGhhcmRCcmVhaywKICAgICAgaGVhZGluZywKICAgICAgaHRtbCwKICAgICAgaW1hZ2UsCiAgICAgIGltYWdlUmVmZXJlbmNlLAogICAgICBpbmxpbmVDb2RlLAogICAgICBsaW5rLAogICAgICBsaW5rUmVmZXJlbmNlLAogICAgICBsaXN0OiBsaXN0MiwKICAgICAgbGlzdEl0ZW0sCiAgICAgIHBhcmFncmFwaCwKICAgICAgcm9vdCwKICAgICAgc3Ryb25nLAogICAgICB0ZXh0LAogICAgICB0aGVtYXRpY0JyZWFrCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvam9pbi5qcwpmdW5jdGlvbiBqb2luRGVmYXVsdHMobGVmdCwgcmlnaHQsIHBhcmVudCwgc3RhdGUxMCkgewogIGlmIChyaWdodC50eXBlID09PSAiY29kZSIgJiYgZm9ybWF0Q29kZUFzSW5kZW50ZWQocmlnaHQsIHN0YXRlMTApICYmIChsZWZ0LnR5cGUgPT09ICJsaXN0IiB8fCBsZWZ0LnR5cGUgPT09IHJpZ2h0LnR5cGUgJiYgZm9ybWF0Q29kZUFzSW5kZW50ZWQobGVmdCwgc3RhdGUxMCkpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmICgic3ByZWFkIiBpbiBwYXJlbnQgJiYgdHlwZW9mIHBhcmVudC5zcHJlYWQgPT09ICJib29sZWFuIikgewogICAgaWYgKGxlZnQudHlwZSA9PT0gInBhcmFncmFwaCIgJiYgLy8gVHdvIHBhcmFncmFwaHMuCiAgICAobGVmdC50eXBlID09PSByaWdodC50eXBlIHx8IHJpZ2h0LnR5cGUgPT09ICJkZWZpbml0aW9uIiB8fCAvLyBQYXJhZ3JhcGggZm9sbG93ZWQgYnkgYSBzZXRleHQgaGVhZGluZy4KICAgIHJpZ2h0LnR5cGUgPT09ICJoZWFkaW5nIiAmJiBmb3JtYXRIZWFkaW5nQXNTZXRleHQocmlnaHQsIHN0YXRlMTApKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICByZXR1cm4gcGFyZW50LnNwcmVhZCA/IDEgOiAwOwogIH0KfQp2YXIgam9pbjI7CnZhciBpbml0X2pvaW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9qb2luLmpzIigpIHsKICAgIGluaXRfZm9ybWF0X2NvZGVfYXNfaW5kZW50ZWQoKTsKICAgIGluaXRfZm9ybWF0X2hlYWRpbmdfYXNfc2V0ZXh0KCk7CiAgICBqb2luMiA9IFtqb2luRGVmYXVsdHNdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdW5zYWZlLmpzCnZhciBmdWxsUGhyYXNpbmdTcGFucywgdW5zYWZlOwp2YXIgaW5pdF91bnNhZmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91bnNhZmUuanMiKCkgewogICAgZnVsbFBocmFzaW5nU3BhbnMgPSBbCiAgICAgICJhdXRvbGluayIsCiAgICAgICJkZXN0aW5hdGlvbkxpdGVyYWwiLAogICAgICAiZGVzdGluYXRpb25SYXciLAogICAgICAicmVmZXJlbmNlIiwKICAgICAgInRpdGxlUXVvdGUiLAogICAgICAidGl0bGVBcG9zdHJvcGhlIgogICAgXTsKICAgIHVuc2FmZSA9IFsKICAgICAgeyBjaGFyYWN0ZXI6ICIJIiwgYWZ0ZXI6ICJbXFxyXFxuXSIsIGluQ29uc3RydWN0OiAicGhyYXNpbmciIH0sCiAgICAgIHsgY2hhcmFjdGVyOiAiCSIsIGJlZm9yZTogIltcXHJcXG5dIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIgfSwKICAgICAgewogICAgICAgIGNoYXJhY3RlcjogIgkiLAogICAgICAgIGluQ29uc3RydWN0OiBbImNvZGVGZW5jZWRMYW5nR3JhdmVBY2NlbnQiLCAiY29kZUZlbmNlZExhbmdUaWxkZSJdCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBjaGFyYWN0ZXI6ICJcciIsCiAgICAgICAgaW5Db25zdHJ1Y3Q6IFsKICAgICAgICAgICJjb2RlRmVuY2VkTGFuZ0dyYXZlQWNjZW50IiwKICAgICAgICAgICJjb2RlRmVuY2VkTGFuZ1RpbGRlIiwKICAgICAgICAgICJjb2RlRmVuY2VkTWV0YUdyYXZlQWNjZW50IiwKICAgICAgICAgICJjb2RlRmVuY2VkTWV0YVRpbGRlIiwKICAgICAgICAgICJkZXN0aW5hdGlvbkxpdGVyYWwiLAogICAgICAgICAgImhlYWRpbmdBdHgiCiAgICAgICAgXQogICAgICB9LAogICAgICB7CiAgICAgICAgY2hhcmFjdGVyOiAiXG4iLAogICAgICAgIGluQ29uc3RydWN0OiBbCiAgICAgICAgICAiY29kZUZlbmNlZExhbmdHcmF2ZUFjY2VudCIsCiAgICAgICAgICAiY29kZUZlbmNlZExhbmdUaWxkZSIsCiAgICAgICAgICAiY29kZUZlbmNlZE1ldGFHcmF2ZUFjY2VudCIsCiAgICAgICAgICAiY29kZUZlbmNlZE1ldGFUaWxkZSIsCiAgICAgICAgICAiZGVzdGluYXRpb25MaXRlcmFsIiwKICAgICAgICAgICJoZWFkaW5nQXR4IgogICAgICAgIF0KICAgICAgfSwKICAgICAgeyBjaGFyYWN0ZXI6ICIgIiwgYWZ0ZXI6ICJbXFxyXFxuXSIsIGluQ29uc3RydWN0OiAicGhyYXNpbmciIH0sCiAgICAgIHsgY2hhcmFjdGVyOiAiICIsIGJlZm9yZTogIltcXHJcXG5dIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIgfSwKICAgICAgewogICAgICAgIGNoYXJhY3RlcjogIiAiLAogICAgICAgIGluQ29uc3RydWN0OiBbImNvZGVGZW5jZWRMYW5nR3JhdmVBY2NlbnQiLCAiY29kZUZlbmNlZExhbmdUaWxkZSJdCiAgICAgIH0sCiAgICAgIC8vIEFuIGV4Y2xhbWF0aW9uIG1hcmsgY2FuIHN0YXJ0IGFuIGltYWdlLCBpZiBpdCBpcyBmb2xsb3dlZCBieSBhIGxpbmsgb3IKICAgICAgLy8gYSBsaW5rIHJlZmVyZW5jZS4KICAgICAgewogICAgICAgIGNoYXJhY3RlcjogIiEiLAogICAgICAgIGFmdGVyOiAiXFxbIiwKICAgICAgICBpbkNvbnN0cnVjdDogInBocmFzaW5nIiwKICAgICAgICBub3RJbkNvbnN0cnVjdDogZnVsbFBocmFzaW5nU3BhbnMKICAgICAgfSwKICAgICAgLy8gQSBxdW90ZSBjYW4gYnJlYWsgb3V0IG9mIGEgdGl0bGUuCiAgICAgIHsgY2hhcmFjdGVyOiAnIicsIGluQ29uc3RydWN0OiAidGl0bGVRdW90ZSIgfSwKICAgICAgLy8gQSBudW1iZXIgc2lnbiBjb3VsZCBzdGFydCBhbiBBVFggaGVhZGluZyBpZiBpdCBzdGFydHMgYSBsaW5lLgogICAgICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogIiMiIH0sCiAgICAgIHsgY2hhcmFjdGVyOiAiIyIsIGluQ29uc3RydWN0OiAiaGVhZGluZ0F0eCIsIGFmdGVyOiAiKD86W1xyXG5dfCQpIiB9LAogICAgICAvLyBEb2xsYXIgc2lnbiBhbmQgcGVyY2VudGFnZSBhcmUgbm90IHVzZWQgaW4gbWFya2Rvd24uCiAgICAgIC8vIEFuIGFtcGVyc2FuZCBjb3VsZCBzdGFydCBhIGNoYXJhY3RlciByZWZlcmVuY2UuCiAgICAgIHsgY2hhcmFjdGVyOiAiJiIsIGFmdGVyOiAiWyNBLVphLXpdIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIgfSwKICAgICAgLy8gQW4gYXBvc3Ryb3BoZSBjYW4gYnJlYWsgb3V0IG9mIGEgdGl0bGUuCiAgICAgIHsgY2hhcmFjdGVyOiAiJyIsIGluQ29uc3RydWN0OiAidGl0bGVBcG9zdHJvcGhlIiB9LAogICAgICAvLyBBIGxlZnQgcGFyZW4gY291bGQgYnJlYWsgb3V0IG9mIGEgZGVzdGluYXRpb24gcmF3LgogICAgICB7IGNoYXJhY3RlcjogIigiLCBpbkNvbnN0cnVjdDogImRlc3RpbmF0aW9uUmF3IiB9LAogICAgICAvLyBBIGxlZnQgcGFyZW4gZm9sbG93ZWQgYnkgYF1gIGNvdWxkIG1ha2Ugc29tZXRoaW5nIGludG8gYSBsaW5rIG9yIGltYWdlLgogICAgICB7CiAgICAgICAgYmVmb3JlOiAiXFxdIiwKICAgICAgICBjaGFyYWN0ZXI6ICIoIiwKICAgICAgICBpbkNvbnN0cnVjdDogInBocmFzaW5nIiwKICAgICAgICBub3RJbkNvbnN0cnVjdDogZnVsbFBocmFzaW5nU3BhbnMKICAgICAgfSwKICAgICAgLy8gQSByaWdodCBwYXJlbiBjb3VsZCBzdGFydCBhIGxpc3QgaXRlbSBvciBicmVhayBvdXQgb2YgYSBkZXN0aW5hdGlvbgogICAgICAvLyByYXcuCiAgICAgIHsgYXRCcmVhazogdHJ1ZSwgYmVmb3JlOiAiXFxkKyIsIGNoYXJhY3RlcjogIikiIH0sCiAgICAgIHsgY2hhcmFjdGVyOiAiKSIsIGluQ29uc3RydWN0OiAiZGVzdGluYXRpb25SYXciIH0sCiAgICAgIC8vIEFuIGFzdGVyaXNrIGNhbiBzdGFydCB0aGVtYXRpYyBicmVha3MsIGxpc3QgaXRlbXMsIGVtcGhhc2lzLCBzdHJvbmcuCiAgICAgIHsgYXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAiKiIsIGFmdGVyOiAiKD86WyAJXHJcbipdKSIgfSwKICAgICAgeyBjaGFyYWN0ZXI6ICIqIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIsIG5vdEluQ29uc3RydWN0OiBmdWxsUGhyYXNpbmdTcGFucyB9LAogICAgICAvLyBBIHBsdXMgc2lnbiBjb3VsZCBzdGFydCBhIGxpc3QgaXRlbS4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICIrIiwgYWZ0ZXI6ICIoPzpbIAlcclxuXSkiIH0sCiAgICAgIC8vIEEgZGFzaCBjYW4gc3RhcnQgdGhlbWF0aWMgYnJlYWtzLCBsaXN0IGl0ZW1zLCBhbmQgc2V0ZXh0IGhlYWRpbmcKICAgICAgLy8gdW5kZXJsaW5lcy4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICItIiwgYWZ0ZXI6ICIoPzpbIAlcclxuLV0pIiB9LAogICAgICAvLyBBIGRvdCBjb3VsZCBzdGFydCBhIGxpc3QgaXRlbS4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBiZWZvcmU6ICJcXGQrIiwgY2hhcmFjdGVyOiAiLiIsIGFmdGVyOiAiKD86WyAJXHJcbl18JCkiIH0sCiAgICAgIC8vIFNsYXNoLCBjb2xvbiwgYW5kIHNlbWljb2xvbiBhcmUgbm90IHVzZWQgaW4gbWFya2Rvd24gZm9yIGNvbnN0cnVjdHMuCiAgICAgIC8vIEEgbGVzcyB0aGFuIGNhbiBzdGFydCBodG1sIChmbG93IG9yIHRleHQpIG9yIGFuIGF1dG9saW5rLgogICAgICAvLyBIVE1MIGNvdWxkIHN0YXJ0IHdpdGggYW4gZXhjbGFtYXRpb24gbWFyayAoZGVjbGFyYXRpb24sIGNkYXRhLCBjb21tZW50KSwKICAgICAgLy8gc2xhc2ggKGNsb3NpbmcgdGFnKSwgcXVlc3Rpb24gbWFyayAoaW5zdHJ1Y3Rpb24pLCBvciBhIGxldHRlciAodGFnKS4KICAgICAgLy8gQW4gYXV0b2xpbmsgYWxzbyBzdGFydHMgd2l0aCBhIGxldHRlci4KICAgICAgLy8gRmluYWxseSwgaXQgY291bGQgYnJlYWsgb3V0IG9mIGEgZGVzdGluYXRpb24gbGl0ZXJhbC4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICI8IiwgYWZ0ZXI6ICJbIS8/QS1aYS16XSIgfSwKICAgICAgewogICAgICAgIGNoYXJhY3RlcjogIjwiLAogICAgICAgIGFmdGVyOiAiWyEvP0EtWmEtel0iLAogICAgICAgIGluQ29uc3RydWN0OiAicGhyYXNpbmciLAogICAgICAgIG5vdEluQ29uc3RydWN0OiBmdWxsUGhyYXNpbmdTcGFucwogICAgICB9LAogICAgICB7IGNoYXJhY3RlcjogIjwiLCBpbkNvbnN0cnVjdDogImRlc3RpbmF0aW9uTGl0ZXJhbCIgfSwKICAgICAgLy8gQW4gZXF1YWxzIHRvIGNhbiBzdGFydCBzZXRleHQgaGVhZGluZyB1bmRlcmxpbmVzLgogICAgICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogIj0iIH0sCiAgICAgIC8vIEEgZ3JlYXRlciB0aGFuIGNhbiBzdGFydCBibG9jayBxdW90ZXMgYW5kIGl0IGNhbiBicmVhayBvdXQgb2YgYQogICAgICAvLyBkZXN0aW5hdGlvbiBsaXRlcmFsLgogICAgICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogIj4iIH0sCiAgICAgIHsgY2hhcmFjdGVyOiAiPiIsIGluQ29uc3RydWN0OiAiZGVzdGluYXRpb25MaXRlcmFsIiB9LAogICAgICAvLyBRdWVzdGlvbiBtYXJrIGFuZCBhdCBzaWduIGFyZSBub3QgdXNlZCBpbiBtYXJrZG93biBmb3IgY29uc3RydWN0cy4KICAgICAgLy8gQSBsZWZ0IGJyYWNrZXQgY2FuIHN0YXJ0IGRlZmluaXRpb25zLCByZWZlcmVuY2VzLCBsYWJlbHMsCiAgICAgIHsgYXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAiWyIgfSwKICAgICAgeyBjaGFyYWN0ZXI6ICJbIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIsIG5vdEluQ29uc3RydWN0OiBmdWxsUGhyYXNpbmdTcGFucyB9LAogICAgICB7IGNoYXJhY3RlcjogIlsiLCBpbkNvbnN0cnVjdDogWyJsYWJlbCIsICJyZWZlcmVuY2UiXSB9LAogICAgICAvLyBBIGJhY2tzbGFzaCBjYW4gc3RhcnQgYW4gZXNjYXBlICh3aGVuIGZvbGxvd2VkIGJ5IHB1bmN0dWF0aW9uKSBvciBhCiAgICAgIC8vIGhhcmQgYnJlYWsgKHdoZW4gZm9sbG93ZWQgYnkgYW4gZW9sKS4KICAgICAgLy8gTm90ZTogdHlwaWNhbCBlc2NhcGVzIGFyZSBoYW5kbGVkIGluIGBzYWZlYCEKICAgICAgeyBjaGFyYWN0ZXI6ICJcXCIsIGFmdGVyOiAiW1xcclxcbl0iLCBpbkNvbnN0cnVjdDogInBocmFzaW5nIiB9LAogICAgICAvLyBBIHJpZ2h0IGJyYWNrZXQgY2FuIGV4aXQgbGFiZWxzLgogICAgICB7IGNoYXJhY3RlcjogIl0iLCBpbkNvbnN0cnVjdDogWyJsYWJlbCIsICJyZWZlcmVuY2UiXSB9LAogICAgICAvLyBDYXJldCBpcyBub3QgdXNlZCBpbiBtYXJrZG93biBmb3IgY29uc3RydWN0cy4KICAgICAgLy8gQW4gdW5kZXJzY29yZSBjYW4gc3RhcnQgZW1waGFzaXMsIHN0cm9uZywgb3IgYSB0aGVtYXRpYyBicmVhay4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICJfIiB9LAogICAgICB7IGNoYXJhY3RlcjogIl8iLCBpbkNvbnN0cnVjdDogInBocmFzaW5nIiwgbm90SW5Db25zdHJ1Y3Q6IGZ1bGxQaHJhc2luZ1NwYW5zIH0sCiAgICAgIC8vIEEgZ3JhdmUgYWNjZW50IGNhbiBzdGFydCBjb2RlIChmZW5jZWQgb3IgdGV4dCksIG9yIGl0IGNhbiBicmVhayBvdXQgb2YKICAgICAgLy8gYSBncmF2ZSBhY2NlbnQgY29kZSBmZW5jZS4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICJgIiB9LAogICAgICB7CiAgICAgICAgY2hhcmFjdGVyOiAiYCIsCiAgICAgICAgaW5Db25zdHJ1Y3Q6IFsiY29kZUZlbmNlZExhbmdHcmF2ZUFjY2VudCIsICJjb2RlRmVuY2VkTWV0YUdyYXZlQWNjZW50Il0KICAgICAgfSwKICAgICAgeyBjaGFyYWN0ZXI6ICJgIiwgaW5Db25zdHJ1Y3Q6ICJwaHJhc2luZyIsIG5vdEluQ29uc3RydWN0OiBmdWxsUGhyYXNpbmdTcGFucyB9LAogICAgICAvLyBMZWZ0IGJyYWNlLCB2ZXJ0aWNhbCBiYXIsIHJpZ2h0IGJyYWNlIGFyZSBub3QgdXNlZCBpbiBtYXJrZG93biBmb3IKICAgICAgLy8gY29uc3RydWN0cy4KICAgICAgLy8gQSB0aWxkZSBjYW4gc3RhcnQgY29kZSAoZmVuY2VkKS4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICJ+IiB9CiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vZGVjb2RlLW5hbWVkLWNoYXJhY3Rlci1yZWZlcmVuY2VAMS4zLjAvbm9kZV9tb2R1bGVzL2RlY29kZS1uYW1lZC1jaGFyYWN0ZXItcmVmZXJlbmNlL2luZGV4LmRvbS5qcwpmdW5jdGlvbiBkZWNvZGVOYW1lZENoYXJhY3RlclJlZmVyZW5jZSh2YWx1ZTIpIHsKICBjb25zdCBjaGFyYWN0ZXJSZWZlcmVuY2UyID0gIiYiICsgdmFsdWUyICsgIjsiOwogIGVsZW1lbnQuaW5uZXJIVE1MID0gY2hhcmFjdGVyUmVmZXJlbmNlMjsKICBjb25zdCBjaGFyYWN0ZXIgPSBlbGVtZW50LnRleHRDb250ZW50OwogIGlmIChjaGFyYWN0ZXIuY2hhckNvZGVBdChjaGFyYWN0ZXIubGVuZ3RoIC0gMSkgPT09IDU5ICYmIHZhbHVlMiAhPT0gInNlbWkiKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiBjaGFyYWN0ZXIgPT09IGNoYXJhY3RlclJlZmVyZW5jZTIgPyBmYWxzZSA6IGNoYXJhY3RlcjsKfQp2YXIgZWxlbWVudDsKdmFyIGluaXRfaW5kZXhfZG9tID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZGVjb2RlLW5hbWVkLWNoYXJhY3Rlci1yZWZlcmVuY2VAMS4zLjAvbm9kZV9tb2R1bGVzL2RlY29kZS1uYW1lZC1jaGFyYWN0ZXItcmVmZXJlbmNlL2luZGV4LmRvbS5qcyIoKSB7CiAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaSIpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtZGVjb2RlLW51bWVyaWMtY2hhcmFjdGVyLXJlZmVyZW5jZUAyLjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtZGVjb2RlLW51bWVyaWMtY2hhcmFjdGVyLXJlZmVyZW5jZS9pbmRleC5qcwpmdW5jdGlvbiBkZWNvZGVOdW1lcmljQ2hhcmFjdGVyUmVmZXJlbmNlKHZhbHVlMiwgYmFzZSkgewogIGNvbnN0IGNvZGU0ID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlMiwgYmFzZSk7CiAgaWYgKAogICAgLy8gQzAgZXhjZXB0IGZvciBIVCwgTEYsIEZGLCBDUiwgc3BhY2UuCiAgICBjb2RlNCA8IDkgfHwgY29kZTQgPT09IDExIHx8IGNvZGU0ID4gMTMgJiYgY29kZTQgPCAzMiB8fCAvLyBDb250cm9sIGNoYXJhY3RlciAoREVMKSBvZiBDMCwgYW5kIEMxIGNvbnRyb2xzLgogICAgY29kZTQgPiAxMjYgJiYgY29kZTQgPCAxNjAgfHwgLy8gTG9uZSBoaWdoIHN1cnJvZ2F0ZXMgYW5kIGxvdyBzdXJyb2dhdGVzLgogICAgY29kZTQgPiA1NTI5NSAmJiBjb2RlNCA8IDU3MzQ0IHx8IC8vIE5vbmNoYXJhY3RlcnMuCiAgICBjb2RlNCA+IDY0OTc1ICYmIGNvZGU0IDwgNjUwMDggfHwgLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqLwogICAgKGNvZGU0ICYgNjU1MzUpID09PSA2NTUzNSB8fCAoY29kZTQgJiA2NTUzNSkgPT09IDY1NTM0IHx8IC8qIGVzbGludC1lbmFibGUgbm8tYml0d2lzZSAqLwogICAgLy8gT3V0IG9mIHJhbmdlCiAgICBjb2RlNCA+IDExMTQxMTEKICApIHsKICAgIHJldHVybiAiXHVGRkZEIjsKICB9CiAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGU0KTsKfQp2YXIgaW5pdF9taWNyb21hcmtfdXRpbF9kZWNvZGVfbnVtZXJpY19jaGFyYWN0ZXJfcmVmZXJlbmNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtZGVjb2RlLW51bWVyaWMtY2hhcmFjdGVyLXJlZmVyZW5jZUAyLjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtZGVjb2RlLW51bWVyaWMtY2hhcmFjdGVyLXJlZmVyZW5jZS9pbmRleC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1kZWNvZGUtc3RyaW5nQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1kZWNvZGUtc3RyaW5nL2luZGV4LmpzCmZ1bmN0aW9uIGRlY29kZVN0cmluZyh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyLnJlcGxhY2UoY2hhcmFjdGVyRXNjYXBlT3JSZWZlcmVuY2UsIGRlY29kZSk7Cn0KZnVuY3Rpb24gZGVjb2RlKCQwLCAkMSwgJDIyKSB7CiAgaWYgKCQxKSB7CiAgICByZXR1cm4gJDE7CiAgfQogIGNvbnN0IGhlYWQyID0gJDIyLmNoYXJDb2RlQXQoMCk7CiAgaWYgKGhlYWQyID09PSAzNSkgewogICAgY29uc3QgaGVhZDMgPSAkMjIuY2hhckNvZGVBdCgxKTsKICAgIGNvbnN0IGhleDMgPSBoZWFkMyA9PT0gMTIwIHx8IGhlYWQzID09PSA4ODsKICAgIHJldHVybiBkZWNvZGVOdW1lcmljQ2hhcmFjdGVyUmVmZXJlbmNlKCQyMi5zbGljZShoZXgzID8gMiA6IDEpLCBoZXgzID8gMTYgOiAxMCk7CiAgfQogIHJldHVybiBkZWNvZGVOYW1lZENoYXJhY3RlclJlZmVyZW5jZSgkMjIpIHx8ICQwOwp9CnZhciBjaGFyYWN0ZXJFc2NhcGVPclJlZmVyZW5jZTsKdmFyIGluaXRfbWljcm9tYXJrX3V0aWxfZGVjb2RlX3N0cmluZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLWRlY29kZS1zdHJpbmdAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLWRlY29kZS1zdHJpbmcvaW5kZXguanMiKCkgewogICAgaW5pdF9pbmRleF9kb20oKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfZGVjb2RlX251bWVyaWNfY2hhcmFjdGVyX3JlZmVyZW5jZSgpOwogICAgY2hhcmFjdGVyRXNjYXBlT3JSZWZlcmVuY2UgPSAvXFwoWyEtLzotQFstYHstfl0pfCYoIyg/OlxkezEsN318eFtcZGEtZl17MSw2fSl8W1xkYS16XXsxLDMxfSk7L2dpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9hc3NvY2lhdGlvbi5qcwpmdW5jdGlvbiBhc3NvY2lhdGlvbihub2RlMikgewogIGlmIChub2RlMi5sYWJlbCB8fCAhbm9kZTIuaWRlbnRpZmllcikgewogICAgcmV0dXJuIG5vZGUyLmxhYmVsIHx8ICIiOwogIH0KICByZXR1cm4gZGVjb2RlU3RyaW5nKG5vZGUyLmlkZW50aWZpZXIpOwp9CnZhciBpbml0X2Fzc29jaWF0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9hc3NvY2lhdGlvbi5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX2RlY29kZV9zdHJpbmcoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvY29tcGlsZS1wYXR0ZXJuLmpzCmZ1bmN0aW9uIGNvbXBpbGVQYXR0ZXJuKHBhdHRlcm4pIHsKICBpZiAoIXBhdHRlcm4uX2NvbXBpbGVkKSB7CiAgICBjb25zdCBiZWZvcmUgPSAocGF0dGVybi5hdEJyZWFrID8gIltcXHJcXG5dW1xcdCBdKiIgOiAiIikgKyAocGF0dGVybi5iZWZvcmUgPyAiKD86IiArIHBhdHRlcm4uYmVmb3JlICsgIikiIDogIiIpOwogICAgcGF0dGVybi5fY29tcGlsZWQgPSBuZXcgUmVnRXhwKAogICAgICAoYmVmb3JlID8gIigiICsgYmVmb3JlICsgIikiIDogIiIpICsgKC9bfFxce30oKVtcXV4kKyo/Li1dLy50ZXN0KHBhdHRlcm4uY2hhcmFjdGVyKSA/ICJcXCIgOiAiIikgKyBwYXR0ZXJuLmNoYXJhY3RlciArIChwYXR0ZXJuLmFmdGVyID8gIig/OiIgKyBwYXR0ZXJuLmFmdGVyICsgIikiIDogIiIpLAogICAgICAiZyIKICAgICk7CiAgfQogIHJldHVybiBwYXR0ZXJuLl9jb21waWxlZDsKfQp2YXIgaW5pdF9jb21waWxlX3BhdHRlcm4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NvbXBpbGUtcGF0dGVybi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NvbnRhaW5lci1waHJhc2luZy5qcwpmdW5jdGlvbiBjb250YWluZXJQaHJhc2luZyhwYXJlbnQsIHN0YXRlMTAsIGluZm8pIHsKICBjb25zdCBpbmRleFN0YWNrID0gc3RhdGUxMC5pbmRleFN0YWNrOwogIGNvbnN0IGNoaWxkcmVuMiA9IHBhcmVudC5jaGlsZHJlbiB8fCBbXTsKICBjb25zdCByZXN1bHRzID0gW107CiAgbGV0IGluZGV4MiA9IC0xOwogIGxldCBiZWZvcmUgPSBpbmZvLmJlZm9yZTsKICBsZXQgZW5jb2RlQWZ0ZXI7CiAgaW5kZXhTdGFjay5wdXNoKC0xKTsKICBsZXQgdHJhY2tlciA9IHN0YXRlMTAuY3JlYXRlVHJhY2tlcihpbmZvKTsKICB3aGlsZSAoKytpbmRleDIgPCBjaGlsZHJlbjIubGVuZ3RoKSB7CiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuMltpbmRleDJdOwogICAgbGV0IGFmdGVyOwogICAgaW5kZXhTdGFja1tpbmRleFN0YWNrLmxlbmd0aCAtIDFdID0gaW5kZXgyOwogICAgaWYgKGluZGV4MiArIDEgPCBjaGlsZHJlbjIubGVuZ3RoKSB7CiAgICAgIGxldCBoYW5kbGUzID0gc3RhdGUxMC5oYW5kbGUuaGFuZGxlcnNbY2hpbGRyZW4yW2luZGV4MiArIDFdLnR5cGVdOwogICAgICBpZiAoaGFuZGxlMyAmJiBoYW5kbGUzLnBlZWspIGhhbmRsZTMgPSBoYW5kbGUzLnBlZWs7CiAgICAgIGFmdGVyID0gaGFuZGxlMyA/IGhhbmRsZTMoY2hpbGRyZW4yW2luZGV4MiArIDFdLCBwYXJlbnQsIHN0YXRlMTAsIHsKICAgICAgICBiZWZvcmU6ICIiLAogICAgICAgIGFmdGVyOiAiIiwKICAgICAgICAuLi50cmFja2VyLmN1cnJlbnQoKQogICAgICB9KS5jaGFyQXQoMCkgOiAiIjsKICAgIH0gZWxzZSB7CiAgICAgIGFmdGVyID0gaW5mby5hZnRlcjsKICAgIH0KICAgIGlmIChyZXN1bHRzLmxlbmd0aCA+IDAgJiYgKGJlZm9yZSA9PT0gIlxyIiB8fCBiZWZvcmUgPT09ICJcbiIpICYmIGNoaWxkLnR5cGUgPT09ICJodG1sIikgewogICAgICByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0gPSByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0ucmVwbGFjZSgKICAgICAgICAvKFxyP1xufFxyKSQvLAogICAgICAgICIgIgogICAgICApOwogICAgICBiZWZvcmUgPSAiICI7CiAgICAgIHRyYWNrZXIgPSBzdGF0ZTEwLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgICAgIHRyYWNrZXIubW92ZShyZXN1bHRzLmpvaW4oIiIpKTsKICAgIH0KICAgIGxldCB2YWx1ZTIgPSBzdGF0ZTEwLmhhbmRsZShjaGlsZCwgcGFyZW50LCBzdGF0ZTEwLCB7CiAgICAgIC4uLnRyYWNrZXIuY3VycmVudCgpLAogICAgICBhZnRlciwKICAgICAgYmVmb3JlCiAgICB9KTsKICAgIGlmIChlbmNvZGVBZnRlciAmJiBlbmNvZGVBZnRlciA9PT0gdmFsdWUyLnNsaWNlKDAsIDEpKSB7CiAgICAgIHZhbHVlMiA9IGVuY29kZUNoYXJhY3RlclJlZmVyZW5jZShlbmNvZGVBZnRlci5jaGFyQ29kZUF0KDApKSArIHZhbHVlMi5zbGljZSgxKTsKICAgIH0KICAgIGNvbnN0IGVuY29kaW5nSW5mbyA9IHN0YXRlMTAuYXR0ZW50aW9uRW5jb2RlU3Vycm91bmRpbmdJbmZvOwogICAgc3RhdGUxMC5hdHRlbnRpb25FbmNvZGVTdXJyb3VuZGluZ0luZm8gPSB2b2lkIDA7CiAgICBlbmNvZGVBZnRlciA9IHZvaWQgMDsKICAgIGlmIChlbmNvZGluZ0luZm8pIHsKICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCAmJiBlbmNvZGluZ0luZm8uYmVmb3JlICYmIGJlZm9yZSA9PT0gcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdLnNsaWNlKC0xKSkgewogICAgICAgIHJlc3VsdHNbcmVzdWx0cy5sZW5ndGggLSAxXSA9IHJlc3VsdHNbcmVzdWx0cy5sZW5ndGggLSAxXS5zbGljZSgwLCAtMSkgKyBlbmNvZGVDaGFyYWN0ZXJSZWZlcmVuY2UoYmVmb3JlLmNoYXJDb2RlQXQoMCkpOwogICAgICB9CiAgICAgIGlmIChlbmNvZGluZ0luZm8uYWZ0ZXIpIGVuY29kZUFmdGVyID0gYWZ0ZXI7CiAgICB9CiAgICB0cmFja2VyLm1vdmUodmFsdWUyKTsKICAgIHJlc3VsdHMucHVzaCh2YWx1ZTIpOwogICAgYmVmb3JlID0gdmFsdWUyLnNsaWNlKC0xKTsKICB9CiAgaW5kZXhTdGFjay5wb3AoKTsKICByZXR1cm4gcmVzdWx0cy5qb2luKCIiKTsKfQp2YXIgaW5pdF9jb250YWluZXJfcGhyYXNpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NvbnRhaW5lci1waHJhc2luZy5qcyIoKSB7CiAgICBpbml0X2VuY29kZV9jaGFyYWN0ZXJfcmVmZXJlbmNlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NvbnRhaW5lci1mbG93LmpzCmZ1bmN0aW9uIGNvbnRhaW5lckZsb3cocGFyZW50LCBzdGF0ZTEwLCBpbmZvKSB7CiAgY29uc3QgaW5kZXhTdGFjayA9IHN0YXRlMTAuaW5kZXhTdGFjazsKICBjb25zdCBjaGlsZHJlbjIgPSBwYXJlbnQuY2hpbGRyZW4gfHwgW107CiAgY29uc3QgdHJhY2tlciA9IHN0YXRlMTAuY3JlYXRlVHJhY2tlcihpbmZvKTsKICBjb25zdCByZXN1bHRzID0gW107CiAgbGV0IGluZGV4MiA9IC0xOwogIGluZGV4U3RhY2sucHVzaCgtMSk7CiAgd2hpbGUgKCsraW5kZXgyIDwgY2hpbGRyZW4yLmxlbmd0aCkgewogICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbjJbaW5kZXgyXTsKICAgIGluZGV4U3RhY2tbaW5kZXhTdGFjay5sZW5ndGggLSAxXSA9IGluZGV4MjsKICAgIHJlc3VsdHMucHVzaCgKICAgICAgdHJhY2tlci5tb3ZlKAogICAgICAgIHN0YXRlMTAuaGFuZGxlKGNoaWxkLCBwYXJlbnQsIHN0YXRlMTAsIHsKICAgICAgICAgIGJlZm9yZTogIlxuIiwKICAgICAgICAgIGFmdGVyOiAiXG4iLAogICAgICAgICAgLi4udHJhY2tlci5jdXJyZW50KCkKICAgICAgICB9KQogICAgICApCiAgICApOwogICAgaWYgKGNoaWxkLnR5cGUgIT09ICJsaXN0IikgewogICAgICBzdGF0ZTEwLmJ1bGxldExhc3RVc2VkID0gdm9pZCAwOwogICAgfQogICAgaWYgKGluZGV4MiA8IGNoaWxkcmVuMi5sZW5ndGggLSAxKSB7CiAgICAgIHJlc3VsdHMucHVzaCgKICAgICAgICB0cmFja2VyLm1vdmUoYmV0d2VlbihjaGlsZCwgY2hpbGRyZW4yW2luZGV4MiArIDFdLCBwYXJlbnQsIHN0YXRlMTApKQogICAgICApOwogICAgfQogIH0KICBpbmRleFN0YWNrLnBvcCgpOwogIHJldHVybiByZXN1bHRzLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIGJldHdlZW4obGVmdCwgcmlnaHQsIHBhcmVudCwgc3RhdGUxMCkgewogIGxldCBpbmRleDIgPSBzdGF0ZTEwLmpvaW4ubGVuZ3RoOwogIHdoaWxlIChpbmRleDItLSkgewogICAgY29uc3QgcmVzdWx0ID0gc3RhdGUxMC5qb2luW2luZGV4Ml0obGVmdCwgcmlnaHQsIHBhcmVudCwgc3RhdGUxMCk7CiAgICBpZiAocmVzdWx0ID09PSB0cnVlIHx8IHJlc3VsdCA9PT0gMSkgewogICAgICBicmVhazsKICAgIH0KICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAibnVtYmVyIikgewogICAgICByZXR1cm4gIlxuIi5yZXBlYXQoMSArIHJlc3VsdCk7CiAgICB9CiAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkgewogICAgICByZXR1cm4gIlxuXG48IS0tLS0+XG5cbiI7CiAgICB9CiAgfQogIHJldHVybiAiXG5cbiI7Cn0KdmFyIGluaXRfY29udGFpbmVyX2Zsb3cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NvbnRhaW5lci1mbG93LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8tbWFya2Rvd25AMi4xLjIvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL3V0aWwvaW5kZW50LWxpbmVzLmpzCmZ1bmN0aW9uIGluZGVudExpbmVzKHZhbHVlMiwgbWFwNykgewogIGNvbnN0IHJlc3VsdCA9IFtdOwogIGxldCBzdGFydCA9IDA7CiAgbGV0IGxpbmUgPSAwOwogIGxldCBtYXRjaDI7CiAgd2hpbGUgKG1hdGNoMiA9IGVvbC5leGVjKHZhbHVlMikpIHsKICAgIG9uZTModmFsdWUyLnNsaWNlKHN0YXJ0LCBtYXRjaDIuaW5kZXgpKTsKICAgIHJlc3VsdC5wdXNoKG1hdGNoMlswXSk7CiAgICBzdGFydCA9IG1hdGNoMi5pbmRleCArIG1hdGNoMlswXS5sZW5ndGg7CiAgICBsaW5lKys7CiAgfQogIG9uZTModmFsdWUyLnNsaWNlKHN0YXJ0KSk7CiAgcmV0dXJuIHJlc3VsdC5qb2luKCIiKTsKICBmdW5jdGlvbiBvbmUzKHZhbHVlMykgewogICAgcmVzdWx0LnB1c2gobWFwNyh2YWx1ZTMsIGxpbmUsICF2YWx1ZTMpKTsKICB9Cn0KdmFyIGVvbDsKdmFyIGluaXRfaW5kZW50X2xpbmVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9pbmRlbnQtbGluZXMuanMiKCkgewogICAgZW9sID0gL1xyP1xufFxyL2c7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL3NhZmUuanMKZnVuY3Rpb24gc2FmZShzdGF0ZTEwLCBpbnB1dCwgY29uZmlnMykgewogIGNvbnN0IHZhbHVlMiA9IChjb25maWczLmJlZm9yZSB8fCAiIikgKyAoaW5wdXQgfHwgIiIpICsgKGNvbmZpZzMuYWZ0ZXIgfHwgIiIpOwogIGNvbnN0IHBvc2l0aW9ucyA9IFtdOwogIGNvbnN0IHJlc3VsdCA9IFtdOwogIGNvbnN0IGluZm9zID0ge307CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHN0YXRlMTAudW5zYWZlLmxlbmd0aCkgewogICAgY29uc3QgcGF0dGVybiA9IHN0YXRlMTAudW5zYWZlW2luZGV4Ml07CiAgICBpZiAoIXBhdHRlcm5JblNjb3BlKHN0YXRlMTAuc3RhY2ssIHBhdHRlcm4pKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3QgZXhwcmVzc2lvbiA9IHN0YXRlMTAuY29tcGlsZVBhdHRlcm4ocGF0dGVybik7CiAgICBsZXQgbWF0Y2gyOwogICAgd2hpbGUgKG1hdGNoMiA9IGV4cHJlc3Npb24uZXhlYyh2YWx1ZTIpKSB7CiAgICAgIGNvbnN0IGJlZm9yZSA9ICJiZWZvcmUiIGluIHBhdHRlcm4gfHwgQm9vbGVhbihwYXR0ZXJuLmF0QnJlYWspOwogICAgICBjb25zdCBhZnRlciA9ICJhZnRlciIgaW4gcGF0dGVybjsKICAgICAgY29uc3QgcG9zaXRpb24zID0gbWF0Y2gyLmluZGV4ICsgKGJlZm9yZSA/IG1hdGNoMlsxXS5sZW5ndGggOiAwKTsKICAgICAgaWYgKHBvc2l0aW9ucy5pbmNsdWRlcyhwb3NpdGlvbjMpKSB7CiAgICAgICAgaWYgKGluZm9zW3Bvc2l0aW9uM10uYmVmb3JlICYmICFiZWZvcmUpIHsKICAgICAgICAgIGluZm9zW3Bvc2l0aW9uM10uYmVmb3JlID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChpbmZvc1twb3NpdGlvbjNdLmFmdGVyICYmICFhZnRlcikgewogICAgICAgICAgaW5mb3NbcG9zaXRpb24zXS5hZnRlciA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBwb3NpdGlvbnMucHVzaChwb3NpdGlvbjMpOwogICAgICAgIGluZm9zW3Bvc2l0aW9uM10gPSB7IGJlZm9yZSwgYWZ0ZXIgfTsKICAgICAgfQogICAgfQogIH0KICBwb3NpdGlvbnMuc29ydChudW1lcmljYWwpOwogIGxldCBzdGFydCA9IGNvbmZpZzMuYmVmb3JlID8gY29uZmlnMy5iZWZvcmUubGVuZ3RoIDogMDsKICBjb25zdCBlbmQzID0gdmFsdWUyLmxlbmd0aCAtIChjb25maWczLmFmdGVyID8gY29uZmlnMy5hZnRlci5sZW5ndGggOiAwKTsKICBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBwb3NpdGlvbnMubGVuZ3RoKSB7CiAgICBjb25zdCBwb3NpdGlvbjMgPSBwb3NpdGlvbnNbaW5kZXgyXTsKICAgIGlmIChwb3NpdGlvbjMgPCBzdGFydCB8fCBwb3NpdGlvbjMgPj0gZW5kMykgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmIChwb3NpdGlvbjMgKyAxIDwgZW5kMyAmJiBwb3NpdGlvbnNbaW5kZXgyICsgMV0gPT09IHBvc2l0aW9uMyArIDEgJiYgaW5mb3NbcG9zaXRpb24zXS5hZnRlciAmJiAhaW5mb3NbcG9zaXRpb24zICsgMV0uYmVmb3JlICYmICFpbmZvc1twb3NpdGlvbjMgKyAxXS5hZnRlciB8fCBwb3NpdGlvbnNbaW5kZXgyIC0gMV0gPT09IHBvc2l0aW9uMyAtIDEgJiYgaW5mb3NbcG9zaXRpb24zXS5iZWZvcmUgJiYgIWluZm9zW3Bvc2l0aW9uMyAtIDFdLmJlZm9yZSAmJiAhaW5mb3NbcG9zaXRpb24zIC0gMV0uYWZ0ZXIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAoc3RhcnQgIT09IHBvc2l0aW9uMykgewogICAgICByZXN1bHQucHVzaChlc2NhcGVCYWNrc2xhc2hlcyh2YWx1ZTIuc2xpY2Uoc3RhcnQsIHBvc2l0aW9uMyksICJcXCIpKTsKICAgIH0KICAgIHN0YXJ0ID0gcG9zaXRpb24zOwogICAgaWYgKC9bIS0vOi1AWy1gey1+XS8udGVzdCh2YWx1ZTIuY2hhckF0KHBvc2l0aW9uMykpICYmICghY29uZmlnMy5lbmNvZGUgfHwgIWNvbmZpZzMuZW5jb2RlLmluY2x1ZGVzKHZhbHVlMi5jaGFyQXQocG9zaXRpb24zKSkpKSB7CiAgICAgIHJlc3VsdC5wdXNoKCJcXCIpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0LnB1c2goZW5jb2RlQ2hhcmFjdGVyUmVmZXJlbmNlKHZhbHVlMi5jaGFyQ29kZUF0KHBvc2l0aW9uMykpKTsKICAgICAgc3RhcnQrKzsKICAgIH0KICB9CiAgcmVzdWx0LnB1c2goZXNjYXBlQmFja3NsYXNoZXModmFsdWUyLnNsaWNlKHN0YXJ0LCBlbmQzKSwgY29uZmlnMy5hZnRlcikpOwogIHJldHVybiByZXN1bHQuam9pbigiIik7Cn0KZnVuY3Rpb24gbnVtZXJpY2FsKGE1LCBiNikgewogIHJldHVybiBhNSAtIGI2Owp9CmZ1bmN0aW9uIGVzY2FwZUJhY2tzbGFzaGVzKHZhbHVlMiwgYWZ0ZXIpIHsKICBjb25zdCBleHByZXNzaW9uID0gL1xcKD89WyEtLzotQFstYHstfl0pL2c7CiAgY29uc3QgcG9zaXRpb25zID0gW107CiAgY29uc3QgcmVzdWx0cyA9IFtdOwogIGNvbnN0IHdob2xlID0gdmFsdWUyICsgYWZ0ZXI7CiAgbGV0IGluZGV4MiA9IC0xOwogIGxldCBzdGFydCA9IDA7CiAgbGV0IG1hdGNoMjsKICB3aGlsZSAobWF0Y2gyID0gZXhwcmVzc2lvbi5leGVjKHdob2xlKSkgewogICAgcG9zaXRpb25zLnB1c2gobWF0Y2gyLmluZGV4KTsKICB9CiAgd2hpbGUgKCsraW5kZXgyIDwgcG9zaXRpb25zLmxlbmd0aCkgewogICAgaWYgKHN0YXJ0ICE9PSBwb3NpdGlvbnNbaW5kZXgyXSkgewogICAgICByZXN1bHRzLnB1c2godmFsdWUyLnNsaWNlKHN0YXJ0LCBwb3NpdGlvbnNbaW5kZXgyXSkpOwogICAgfQogICAgcmVzdWx0cy5wdXNoKCJcXCIpOwogICAgc3RhcnQgPSBwb3NpdGlvbnNbaW5kZXgyXTsKICB9CiAgcmVzdWx0cy5wdXNoKHZhbHVlMi5zbGljZShzdGFydCkpOwogIHJldHVybiByZXN1bHRzLmpvaW4oIiIpOwp9CnZhciBpbml0X3NhZmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL3NhZmUuanMiKCkgewogICAgaW5pdF9lbmNvZGVfY2hhcmFjdGVyX3JlZmVyZW5jZSgpOwogICAgaW5pdF9wYXR0ZXJuX2luX3Njb3BlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL3RyYWNrLmpzCmZ1bmN0aW9uIHRyYWNrKGNvbmZpZzMpIHsKICBjb25zdCBvcHRpb25zID0gY29uZmlnMyB8fCB7fTsKICBjb25zdCBub3cyID0gb3B0aW9ucy5ub3cgfHwge307CiAgbGV0IGxpbmVTaGlmdCA9IG9wdGlvbnMubGluZVNoaWZ0IHx8IDA7CiAgbGV0IGxpbmUgPSBub3cyLmxpbmUgfHwgMTsKICBsZXQgY29sdW1uID0gbm93Mi5jb2x1bW4gfHwgMTsKICByZXR1cm4geyBtb3ZlLCBjdXJyZW50LCBzaGlmdCB9OwogIGZ1bmN0aW9uIGN1cnJlbnQoKSB7CiAgICByZXR1cm4geyBub3c6IHsgbGluZSwgY29sdW1uIH0sIGxpbmVTaGlmdCB9OwogIH0KICBmdW5jdGlvbiBzaGlmdCh2YWx1ZTIpIHsKICAgIGxpbmVTaGlmdCArPSB2YWx1ZTI7CiAgfQogIGZ1bmN0aW9uIG1vdmUoaW5wdXQpIHsKICAgIGNvbnN0IHZhbHVlMiA9IGlucHV0IHx8ICIiOwogICAgY29uc3QgY2h1bmtzID0gdmFsdWUyLnNwbGl0KC9ccj9cbnxcci9nKTsKICAgIGNvbnN0IHRhaWwgPSBjaHVua3NbY2h1bmtzLmxlbmd0aCAtIDFdOwogICAgbGluZSArPSBjaHVua3MubGVuZ3RoIC0gMTsKICAgIGNvbHVtbiA9IGNodW5rcy5sZW5ndGggPT09IDEgPyBjb2x1bW4gKyB0YWlsLmxlbmd0aCA6IDEgKyB0YWlsLmxlbmd0aCArIGxpbmVTaGlmdDsKICAgIHJldHVybiB2YWx1ZTI7CiAgfQp9CnZhciBpbml0X3RyYWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC90cmFjay5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi9pbmRleC5qcwpmdW5jdGlvbiB0b01hcmtkb3duKHRyZWUsIG9wdGlvbnMpIHsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwge307CiAgY29uc3Qgc3RhdGUxMCA9IHsKICAgIGFzc29jaWF0aW9uSWQ6IGFzc29jaWF0aW9uLAogICAgY29udGFpbmVyUGhyYXNpbmc6IGNvbnRhaW5lclBocmFzaW5nQm91bmQsCiAgICBjb250YWluZXJGbG93OiBjb250YWluZXJGbG93Qm91bmQsCiAgICBjcmVhdGVUcmFja2VyOiB0cmFjaywKICAgIGNvbXBpbGVQYXR0ZXJuLAogICAgZW50ZXIsCiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBHRk0gLyBmcm9udG1hdHRlciBhcmUgdHlwZWQgaW4gYG1kYXN0YCBidXQgbm90IGRlZmluZWQKICAgIC8vIGhlcmUuCiAgICBoYW5kbGVyczogeyAuLi5oYW5kbGUgfSwKICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGFkZCBgaGFuZGxlYCBpbiBhIHNlY29uZC4KICAgIGhhbmRsZTogdm9pZCAwLAogICAgaW5kZW50TGluZXMsCiAgICBpbmRleFN0YWNrOiBbXSwKICAgIGpvaW46IFsuLi5qb2luMl0sCiAgICBvcHRpb25zOiB7fSwKICAgIHNhZmU6IHNhZmVCb3VuZCwKICAgIHN0YWNrOiBbXSwKICAgIHVuc2FmZTogWy4uLnVuc2FmZV0KICB9OwogIGNvbmZpZ3VyZShzdGF0ZTEwLCBzZXR0aW5ncyk7CiAgaWYgKHN0YXRlMTAub3B0aW9ucy50aWdodERlZmluaXRpb25zKSB7CiAgICBzdGF0ZTEwLmpvaW4ucHVzaChqb2luRGVmaW5pdGlvbik7CiAgfQogIHN0YXRlMTAuaGFuZGxlID0gendpdGNoKCJ0eXBlIiwgewogICAgaW52YWxpZCwKICAgIHVua25vd24sCiAgICBoYW5kbGVyczogc3RhdGUxMC5oYW5kbGVycwogIH0pOwogIGxldCByZXN1bHQgPSBzdGF0ZTEwLmhhbmRsZSh0cmVlLCB2b2lkIDAsIHN0YXRlMTAsIHsKICAgIGJlZm9yZTogIlxuIiwKICAgIGFmdGVyOiAiXG4iLAogICAgbm93OiB7IGxpbmU6IDEsIGNvbHVtbjogMSB9LAogICAgbGluZVNoaWZ0OiAwCiAgfSk7CiAgaWYgKHJlc3VsdCAmJiByZXN1bHQuY2hhckNvZGVBdChyZXN1bHQubGVuZ3RoIC0gMSkgIT09IDEwICYmIHJlc3VsdC5jaGFyQ29kZUF0KHJlc3VsdC5sZW5ndGggLSAxKSAhPT0gMTMpIHsKICAgIHJlc3VsdCArPSAiXG4iOwogIH0KICByZXR1cm4gcmVzdWx0OwogIGZ1bmN0aW9uIGVudGVyKG5hbWUpIHsKICAgIHN0YXRlMTAuc3RhY2sucHVzaChuYW1lKTsKICAgIHJldHVybiBleGl0MzsKICAgIGZ1bmN0aW9uIGV4aXQzKCkgewogICAgICBzdGF0ZTEwLnN0YWNrLnBvcCgpOwogICAgfQogIH0KfQpmdW5jdGlvbiBpbnZhbGlkKHZhbHVlMikgewogIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IGhhbmRsZSB2YWx1ZSBgIiArIHZhbHVlMiArICJgLCBleHBlY3RlZCBub2RlIik7Cn0KZnVuY3Rpb24gdW5rbm93bih2YWx1ZTIpIHsKICBjb25zdCBub2RlMiA9ICgKICAgIC8qKiBAdHlwZSB7Tm9kZXN9ICovCiAgICB2YWx1ZTIKICApOwogIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IGhhbmRsZSB1bmtub3duIG5vZGUgYCIgKyBub2RlMi50eXBlICsgImAiKTsKfQpmdW5jdGlvbiBqb2luRGVmaW5pdGlvbihsZWZ0LCByaWdodCkgewogIGlmIChsZWZ0LnR5cGUgPT09ICJkZWZpbml0aW9uIiAmJiBsZWZ0LnR5cGUgPT09IHJpZ2h0LnR5cGUpIHsKICAgIHJldHVybiAwOwogIH0KfQpmdW5jdGlvbiBjb250YWluZXJQaHJhc2luZ0JvdW5kKHBhcmVudCwgaW5mbykgewogIHJldHVybiBjb250YWluZXJQaHJhc2luZyhwYXJlbnQsIHRoaXMsIGluZm8pOwp9CmZ1bmN0aW9uIGNvbnRhaW5lckZsb3dCb3VuZChwYXJlbnQsIGluZm8pIHsKICByZXR1cm4gY29udGFpbmVyRmxvdyhwYXJlbnQsIHRoaXMsIGluZm8pOwp9CmZ1bmN0aW9uIHNhZmVCb3VuZCh2YWx1ZTIsIGNvbmZpZzMpIHsKICByZXR1cm4gc2FmZSh0aGlzLCB2YWx1ZTIsIGNvbmZpZzMpOwp9CnZhciBpbml0X2xpYjE1ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1tYXJrZG93bkAyLjEuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaW5kZXguanMiKCkgewogICAgaW5pdF96d2l0Y2goKTsKICAgIGluaXRfY29uZmlndXJlKCk7CiAgICBpbml0X2hhbmRsZSgpOwogICAgaW5pdF9qb2luKCk7CiAgICBpbml0X3Vuc2FmZSgpOwogICAgaW5pdF9hc3NvY2lhdGlvbigpOwogICAgaW5pdF9jb21waWxlX3BhdHRlcm4oKTsKICAgIGluaXRfY29udGFpbmVyX3BocmFzaW5nKCk7CiAgICBpbml0X2NvbnRhaW5lcl9mbG93KCk7CiAgICBpbml0X2luZGVudF9saW5lcygpOwogICAgaW5pdF9zYWZlKCk7CiAgICBpbml0X3RyYWNrKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2luZGV4LmpzCnZhciBpbml0X21kYXN0X3V0aWxfdG9fbWFya2Rvd24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLW1hcmtkb3duQDIuMS4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliMTUoKTsKICAgIGluaXRfaGFuZGxlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWdmbS10YWJsZUAyLjAuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0tdGFibGUvbGliL2luZGV4LmpzCmZ1bmN0aW9uIGdmbVRhYmxlRnJvbU1hcmtkb3duKCkgewogIHJldHVybiB7CiAgICBlbnRlcjogewogICAgICB0YWJsZTogZW50ZXJUYWJsZSwKICAgICAgdGFibGVEYXRhOiBlbnRlckNlbGwsCiAgICAgIHRhYmxlSGVhZGVyOiBlbnRlckNlbGwsCiAgICAgIHRhYmxlUm93OiBlbnRlclJvdwogICAgfSwKICAgIGV4aXQ6IHsKICAgICAgY29kZVRleHQ6IGV4aXRDb2RlVGV4dCwKICAgICAgdGFibGU6IGV4aXRUYWJsZSwKICAgICAgdGFibGVEYXRhOiBleGl0LAogICAgICB0YWJsZUhlYWRlcjogZXhpdCwKICAgICAgdGFibGVSb3c6IGV4aXQKICAgIH0KICB9Owp9CmZ1bmN0aW9uIGVudGVyVGFibGUodG9rZW4pIHsKICBjb25zdCBhbGlnbiA9IHRva2VuLl9hbGlnbjsKICBvayhhbGlnbiwgImV4cGVjdGVkIGBfYWxpZ25gIG9uIHRhYmxlIik7CiAgdGhpcy5lbnRlcigKICAgIHsKICAgICAgdHlwZTogInRhYmxlIiwKICAgICAgYWxpZ246IGFsaWduLm1hcChmdW5jdGlvbihkNikgewogICAgICAgIHJldHVybiBkNiA9PT0gIm5vbmUiID8gbnVsbCA6IGQ2OwogICAgICB9KSwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9LAogICAgdG9rZW4KICApOwogIHRoaXMuZGF0YS5pblRhYmxlID0gdHJ1ZTsKfQpmdW5jdGlvbiBleGl0VGFibGUodG9rZW4pIHsKICB0aGlzLmV4aXQodG9rZW4pOwogIHRoaXMuZGF0YS5pblRhYmxlID0gdm9pZCAwOwp9CmZ1bmN0aW9uIGVudGVyUm93KHRva2VuKSB7CiAgdGhpcy5lbnRlcih7IHR5cGU6ICJ0YWJsZVJvdyIsIGNoaWxkcmVuOiBbXSB9LCB0b2tlbik7Cn0KZnVuY3Rpb24gZXhpdCh0b2tlbikgewogIHRoaXMuZXhpdCh0b2tlbik7Cn0KZnVuY3Rpb24gZW50ZXJDZWxsKHRva2VuKSB7CiAgdGhpcy5lbnRlcih7IHR5cGU6ICJ0YWJsZUNlbGwiLCBjaGlsZHJlbjogW10gfSwgdG9rZW4pOwp9CmZ1bmN0aW9uIGV4aXRDb2RlVGV4dCh0b2tlbikgewogIGxldCB2YWx1ZTIgPSB0aGlzLnJlc3VtZSgpOwogIGlmICh0aGlzLmRhdGEuaW5UYWJsZSkgewogICAgdmFsdWUyID0gdmFsdWUyLnJlcGxhY2UoL1xcKFtcXHxdKS9nLCByZXBsYWNlKTsKICB9CiAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgb2sobm9kZTIudHlwZSA9PT0gImlubGluZUNvZGUiKTsKICBub2RlMi52YWx1ZSA9IHZhbHVlMjsKICB0aGlzLmV4aXQodG9rZW4pOwp9CmZ1bmN0aW9uIHJlcGxhY2UoJDAsICQxKSB7CiAgcmV0dXJuICQxID09PSAifCIgPyAkMSA6ICQwOwp9CmZ1bmN0aW9uIGdmbVRhYmxlVG9NYXJrZG93bihvcHRpb25zKSB7CiAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9OwogIGNvbnN0IHBhZGRpbmcgPSBzZXR0aW5ncy50YWJsZUNlbGxQYWRkaW5nOwogIGNvbnN0IGFsaWduRGVsaW1pdGVycyA9IHNldHRpbmdzLnRhYmxlUGlwZUFsaWduOwogIGNvbnN0IHN0cmluZ0xlbmd0aCA9IHNldHRpbmdzLnN0cmluZ0xlbmd0aDsKICBjb25zdCBhcm91bmQgPSBwYWRkaW5nID8gIiAiIDogInwiOwogIHJldHVybiB7CiAgICB1bnNhZmU6IFsKICAgICAgeyBjaGFyYWN0ZXI6ICJcciIsIGluQ29uc3RydWN0OiAidGFibGVDZWxsIiB9LAogICAgICB7IGNoYXJhY3RlcjogIlxuIiwgaW5Db25zdHJ1Y3Q6ICJ0YWJsZUNlbGwiIH0sCiAgICAgIC8vIEEgcGlwZSwgd2hlbiBmb2xsb3dlZCBieSBhIHRhYiBvciBzcGFjZSAocGFkZGluZyksIG9yIGEgZGFzaCBvciBjb2xvbgogICAgICAvLyAodW5wYWRkZWQgZGVsaW1pdGVyIHJvdyksIGNvdWxkIHJlc3VsdCBpbiBhIHRhYmxlLgogICAgICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogInwiLCBhZnRlcjogIlsJIDotXSIgfSwKICAgICAgLy8gQSBwaXBlIGluIGEgY2VsbCBtdXN0IGJlIGVuY29kZWQuCiAgICAgIHsgY2hhcmFjdGVyOiAifCIsIGluQ29uc3RydWN0OiAidGFibGVDZWxsIiB9LAogICAgICAvLyBBIGNvbG9uIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBkYXNoLCBpbiB3aGljaCBjYXNlIGl0IGNvdWxkIHN0YXJ0IGEKICAgICAgLy8gZGVsaW1pdGVyIHJvdy4KICAgICAgeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICI6IiwgYWZ0ZXI6ICItIiB9LAogICAgICAvLyBBIGRlbGltaXRlciByb3cgY2FuIGFsc28gc3RhcnQgd2l0aCBhIGRhc2gsIHdoZW4gZm9sbG93ZWQgYnkgbW9yZQogICAgICAvLyBkYXNoZXMsIGEgY29sb24sIG9yIGEgcGlwZS4KICAgICAgLy8gVGhpcyBpcyBhIHN0cmljdGVyIHZlcnNpb24gdGhhbiB0aGUgYnVpbHQgaW4gY2hlY2sgZm9yIGxpc3RzLCB0aGVtYXRpYwogICAgICAvLyBicmVha3MsIGFuZCBzZXRleCBoZWFkaW5nIHVuZGVybGluZXMgdGhvdWdoOgogICAgICAvLyA8aHR0cHM6Ly9naXRodWIuY29tL3N5bnRheC10cmVlL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vYmxvYi81MWEyMDM4L2xpYi91bnNhZmUuanMjTDU3PgogICAgICB7IGF0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogIi0iLCBhZnRlcjogIls6fC1dIiB9CiAgICBdLAogICAgaGFuZGxlcnM6IHsKICAgICAgaW5saW5lQ29kZTogaW5saW5lQ29kZVdpdGhUYWJsZSwKICAgICAgdGFibGU6IGhhbmRsZVRhYmxlLAogICAgICB0YWJsZUNlbGw6IGhhbmRsZVRhYmxlQ2VsbCwKICAgICAgdGFibGVSb3c6IGhhbmRsZVRhYmxlUm93CiAgICB9CiAgfTsKICBmdW5jdGlvbiBoYW5kbGVUYWJsZShub2RlMiwgXzUsIHN0YXRlMTAsIGluZm8pIHsKICAgIHJldHVybiBzZXJpYWxpemVEYXRhKGhhbmRsZVRhYmxlQXNEYXRhKG5vZGUyLCBzdGF0ZTEwLCBpbmZvKSwgbm9kZTIuYWxpZ24pOwogIH0KICBmdW5jdGlvbiBoYW5kbGVUYWJsZVJvdyhub2RlMiwgXzUsIHN0YXRlMTAsIGluZm8pIHsKICAgIGNvbnN0IHJvdyA9IGhhbmRsZVRhYmxlUm93QXNEYXRhKG5vZGUyLCBzdGF0ZTEwLCBpbmZvKTsKICAgIGNvbnN0IHZhbHVlMiA9IHNlcmlhbGl6ZURhdGEoW3Jvd10pOwogICAgcmV0dXJuIHZhbHVlMi5zbGljZSgwLCB2YWx1ZTIuaW5kZXhPZigiXG4iKSk7CiAgfQogIGZ1bmN0aW9uIGhhbmRsZVRhYmxlQ2VsbChub2RlMiwgXzUsIHN0YXRlMTAsIGluZm8pIHsKICAgIGNvbnN0IGV4aXQzID0gc3RhdGUxMC5lbnRlcigidGFibGVDZWxsIik7CiAgICBjb25zdCBzdWJleGl0ID0gc3RhdGUxMC5lbnRlcigicGhyYXNpbmciKTsKICAgIGNvbnN0IHZhbHVlMiA9IHN0YXRlMTAuY29udGFpbmVyUGhyYXNpbmcobm9kZTIsIHsKICAgICAgLi4uaW5mbywKICAgICAgYmVmb3JlOiBhcm91bmQsCiAgICAgIGFmdGVyOiBhcm91bmQKICAgIH0pOwogICAgc3ViZXhpdCgpOwogICAgZXhpdDMoKTsKICAgIHJldHVybiB2YWx1ZTI7CiAgfQogIGZ1bmN0aW9uIHNlcmlhbGl6ZURhdGEobWF0cml4LCBhbGlnbikgewogICAgcmV0dXJuIG1hcmtkb3duVGFibGUobWF0cml4LCB7CiAgICAgIGFsaWduLAogICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBgbWFya2Rvd24tdGFibGVgIHR5cGVzIHNob3VsZCBzdXBwb3J0IGBudWxsYC4KICAgICAgYWxpZ25EZWxpbWl0ZXJzLAogICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBgbWFya2Rvd24tdGFibGVgIHR5cGVzIHNob3VsZCBzdXBwb3J0IGBudWxsYC4KICAgICAgcGFkZGluZywKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogYG1hcmtkb3duLXRhYmxlYCB0eXBlcyBzaG91bGQgc3VwcG9ydCBgbnVsbGAuCiAgICAgIHN0cmluZ0xlbmd0aAogICAgfSk7CiAgfQogIGZ1bmN0aW9uIGhhbmRsZVRhYmxlQXNEYXRhKG5vZGUyLCBzdGF0ZTEwLCBpbmZvKSB7CiAgICBjb25zdCBjaGlsZHJlbjIgPSBub2RlMi5jaGlsZHJlbjsKICAgIGxldCBpbmRleDIgPSAtMTsKICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgY29uc3Qgc3ViZXhpdCA9IHN0YXRlMTAuZW50ZXIoInRhYmxlIik7CiAgICB3aGlsZSAoKytpbmRleDIgPCBjaGlsZHJlbjIubGVuZ3RoKSB7CiAgICAgIHJlc3VsdFtpbmRleDJdID0gaGFuZGxlVGFibGVSb3dBc0RhdGEoY2hpbGRyZW4yW2luZGV4Ml0sIHN0YXRlMTAsIGluZm8pOwogICAgfQogICAgc3ViZXhpdCgpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgZnVuY3Rpb24gaGFuZGxlVGFibGVSb3dBc0RhdGEobm9kZTIsIHN0YXRlMTAsIGluZm8pIHsKICAgIGNvbnN0IGNoaWxkcmVuMiA9IG5vZGUyLmNoaWxkcmVuOwogICAgbGV0IGluZGV4MiA9IC0xOwogICAgY29uc3QgcmVzdWx0ID0gW107CiAgICBjb25zdCBzdWJleGl0ID0gc3RhdGUxMC5lbnRlcigidGFibGVSb3ciKTsKICAgIHdoaWxlICgrK2luZGV4MiA8IGNoaWxkcmVuMi5sZW5ndGgpIHsKICAgICAgcmVzdWx0W2luZGV4Ml0gPSBoYW5kbGVUYWJsZUNlbGwoY2hpbGRyZW4yW2luZGV4Ml0sIG5vZGUyLCBzdGF0ZTEwLCBpbmZvKTsKICAgIH0KICAgIHN1YmV4aXQoKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIGlubGluZUNvZGVXaXRoVGFibGUobm9kZTIsIHBhcmVudCwgc3RhdGUxMCkgewogICAgbGV0IHZhbHVlMiA9IGhhbmRsZS5pbmxpbmVDb2RlKG5vZGUyLCBwYXJlbnQsIHN0YXRlMTApOwogICAgaWYgKHN0YXRlMTAuc3RhY2suaW5jbHVkZXMoInRhYmxlQ2VsbCIpKSB7CiAgICAgIHZhbHVlMiA9IHZhbHVlMi5yZXBsYWNlKC9cfC9nLCAiXFwkJiIpOwogICAgfQogICAgcmV0dXJuIHZhbHVlMjsKICB9Cn0KdmFyIGluaXRfbGliMTYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWdmbS10YWJsZUAyLjAuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0tdGFibGUvbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfZGVmYXVsdCgpOwogICAgaW5pdF9tYXJrZG93bl90YWJsZSgpOwogICAgaW5pdF9tZGFzdF91dGlsX3RvX21hcmtkb3duKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWdmbS10YWJsZUAyLjAuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0tdGFibGUvaW5kZXguanMKdmFyIGluaXRfbWRhc3RfdXRpbF9nZm1fdGFibGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWdmbS10YWJsZUAyLjAuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0tdGFibGUvaW5kZXguanMiKCkgewogICAgaW5pdF9saWIxNigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1nZm0tdGFzay1saXN0LWl0ZW1AMi4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXRhc2stbGlzdC1pdGVtL2xpYi9pbmRleC5qcwpmdW5jdGlvbiBnZm1UYXNrTGlzdEl0ZW1Gcm9tTWFya2Rvd24oKSB7CiAgcmV0dXJuIHsKICAgIGV4aXQ6IHsKICAgICAgdGFza0xpc3RDaGVja1ZhbHVlQ2hlY2tlZDogZXhpdENoZWNrLAogICAgICB0YXNrTGlzdENoZWNrVmFsdWVVbmNoZWNrZWQ6IGV4aXRDaGVjaywKICAgICAgcGFyYWdyYXBoOiBleGl0UGFyYWdyYXBoV2l0aFRhc2tMaXN0SXRlbQogICAgfQogIH07Cn0KZnVuY3Rpb24gZ2ZtVGFza0xpc3RJdGVtVG9NYXJrZG93bigpIHsKICByZXR1cm4gewogICAgdW5zYWZlOiBbeyBhdEJyZWFrOiB0cnVlLCBjaGFyYWN0ZXI6ICItIiwgYWZ0ZXI6ICJbOnwtXSIgfV0sCiAgICBoYW5kbGVyczogeyBsaXN0SXRlbTogbGlzdEl0ZW1XaXRoVGFza0xpc3RJdGVtIH0KICB9Owp9CmZ1bmN0aW9uIGV4aXRDaGVjayh0b2tlbikgewogIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDJdOwogIG9rKG5vZGUyLnR5cGUgPT09ICJsaXN0SXRlbSIpOwogIG5vZGUyLmNoZWNrZWQgPSB0b2tlbi50eXBlID09PSAidGFza0xpc3RDaGVja1ZhbHVlQ2hlY2tlZCI7Cn0KZnVuY3Rpb24gZXhpdFBhcmFncmFwaFdpdGhUYXNrTGlzdEl0ZW0odG9rZW4pIHsKICBjb25zdCBwYXJlbnQgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMl07CiAgaWYgKHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PT0gImxpc3RJdGVtIiAmJiB0eXBlb2YgcGFyZW50LmNoZWNrZWQgPT09ICJib29sZWFuIikgewogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBvayhub2RlMi50eXBlID09PSAicGFyYWdyYXBoIik7CiAgICBjb25zdCBoZWFkMiA9IG5vZGUyLmNoaWxkcmVuWzBdOwogICAgaWYgKGhlYWQyICYmIGhlYWQyLnR5cGUgPT09ICJ0ZXh0IikgewogICAgICBjb25zdCBzaWJsaW5nczIgPSBwYXJlbnQuY2hpbGRyZW47CiAgICAgIGxldCBpbmRleDIgPSAtMTsKICAgICAgbGV0IGZpcnN0UGFyYWdocmFwaDsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgc2libGluZ3MyLmxlbmd0aCkgewogICAgICAgIGNvbnN0IHNpYmxpbmcgPSBzaWJsaW5nczJbaW5kZXgyXTsKICAgICAgICBpZiAoc2libGluZy50eXBlID09PSAicGFyYWdyYXBoIikgewogICAgICAgICAgZmlyc3RQYXJhZ2hyYXBoID0gc2libGluZzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZmlyc3RQYXJhZ2hyYXBoID09PSBub2RlMikgewogICAgICAgIGhlYWQyLnZhbHVlID0gaGVhZDIudmFsdWUuc2xpY2UoMSk7CiAgICAgICAgaWYgKGhlYWQyLnZhbHVlLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgbm9kZTIuY2hpbGRyZW4uc2hpZnQoKTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUyLnBvc2l0aW9uICYmIGhlYWQyLnBvc2l0aW9uICYmIHR5cGVvZiBoZWFkMi5wb3NpdGlvbi5zdGFydC5vZmZzZXQgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICBoZWFkMi5wb3NpdGlvbi5zdGFydC5jb2x1bW4rKzsKICAgICAgICAgIGhlYWQyLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCsrOwogICAgICAgICAgbm9kZTIucG9zaXRpb24uc3RhcnQgPSBPYmplY3QuYXNzaWduKHt9LCBoZWFkMi5wb3NpdGlvbi5zdGFydCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHRoaXMuZXhpdCh0b2tlbik7Cn0KZnVuY3Rpb24gbGlzdEl0ZW1XaXRoVGFza0xpc3RJdGVtKG5vZGUyLCBwYXJlbnQsIHN0YXRlMTAsIGluZm8pIHsKICBjb25zdCBoZWFkMiA9IG5vZGUyLmNoaWxkcmVuWzBdOwogIGNvbnN0IGNoZWNrYWJsZSA9IHR5cGVvZiBub2RlMi5jaGVja2VkID09PSAiYm9vbGVhbiIgJiYgaGVhZDIgJiYgaGVhZDIudHlwZSA9PT0gInBhcmFncmFwaCI7CiAgY29uc3QgY2hlY2tib3ggPSAiWyIgKyAobm9kZTIuY2hlY2tlZCA/ICJ4IiA6ICIgIikgKyAiXSAiOwogIGNvbnN0IHRyYWNrZXIgPSBzdGF0ZTEwLmNyZWF0ZVRyYWNrZXIoaW5mbyk7CiAgaWYgKGNoZWNrYWJsZSkgewogICAgdHJhY2tlci5tb3ZlKGNoZWNrYm94KTsKICB9CiAgbGV0IHZhbHVlMiA9IGhhbmRsZS5saXN0SXRlbShub2RlMiwgcGFyZW50LCBzdGF0ZTEwLCB7CiAgICAuLi5pbmZvLAogICAgLi4udHJhY2tlci5jdXJyZW50KCkKICB9KTsKICBpZiAoY2hlY2thYmxlKSB7CiAgICB2YWx1ZTIgPSB2YWx1ZTIucmVwbGFjZSgvXig/OlsqKy1dfFxkK1wuKShbXHJcbl18IHsxLDN9KS8sIGNoZWNrKTsKICB9CiAgcmV0dXJuIHZhbHVlMjsKICBmdW5jdGlvbiBjaGVjaygkMCkgewogICAgcmV0dXJuICQwICsgY2hlY2tib3g7CiAgfQp9CnZhciBpbml0X2xpYjE3ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1nZm0tdGFzay1saXN0LWl0ZW1AMi4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXRhc2stbGlzdC1pdGVtL2xpYi9pbmRleC5qcyIoKSB7CiAgICBpbml0X2RlZmF1bHQoKTsKICAgIGluaXRfbWRhc3RfdXRpbF90b19tYXJrZG93bigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1nZm0tdGFzay1saXN0LWl0ZW1AMi4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXRhc2stbGlzdC1pdGVtL2luZGV4LmpzCnZhciBpbml0X21kYXN0X3V0aWxfZ2ZtX3Rhc2tfbGlzdF9pdGVtID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1nZm0tdGFzay1saXN0LWl0ZW1AMi4wLjAvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXRhc2stbGlzdC1pdGVtL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliMTcoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZ2ZtQDMuMS4wL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS9saWIvaW5kZXguanMKZnVuY3Rpb24gZ2ZtRnJvbU1hcmtkb3duKCkgewogIHJldHVybiBbCiAgICBnZm1BdXRvbGlua0xpdGVyYWxGcm9tTWFya2Rvd24oKSwKICAgIGdmbUZvb3Rub3RlRnJvbU1hcmtkb3duKCksCiAgICBnZm1TdHJpa2V0aHJvdWdoRnJvbU1hcmtkb3duKCksCiAgICBnZm1UYWJsZUZyb21NYXJrZG93bigpLAogICAgZ2ZtVGFza0xpc3RJdGVtRnJvbU1hcmtkb3duKCkKICBdOwp9CmZ1bmN0aW9uIGdmbVRvTWFya2Rvd24ob3B0aW9ucykgewogIHJldHVybiB7CiAgICBleHRlbnNpb25zOiBbCiAgICAgIGdmbUF1dG9saW5rTGl0ZXJhbFRvTWFya2Rvd24oKSwKICAgICAgZ2ZtRm9vdG5vdGVUb01hcmtkb3duKG9wdGlvbnMpLAogICAgICBnZm1TdHJpa2V0aHJvdWdoVG9NYXJrZG93bigpLAogICAgICBnZm1UYWJsZVRvTWFya2Rvd24ob3B0aW9ucyksCiAgICAgIGdmbVRhc2tMaXN0SXRlbVRvTWFya2Rvd24oKQogICAgXQogIH07Cn0KdmFyIGluaXRfbGliMTggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWdmbUAzLjEuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0vbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfbWRhc3RfdXRpbF9nZm1fYXV0b2xpbmtfbGl0ZXJhbCgpOwogICAgaW5pdF9tZGFzdF91dGlsX2dmbV9mb290bm90ZSgpOwogICAgaW5pdF9tZGFzdF91dGlsX2dmbV9zdHJpa2V0aHJvdWdoKCk7CiAgICBpbml0X21kYXN0X3V0aWxfZ2ZtX3RhYmxlKCk7CiAgICBpbml0X21kYXN0X3V0aWxfZ2ZtX3Rhc2tfbGlzdF9pdGVtKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWdmbUAzLjEuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0vaW5kZXguanMKdmFyIGluaXRfbWRhc3RfdXRpbF9nZm0gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWdmbUAzLjEuMC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0vaW5kZXguanMiKCkgewogICAgaW5pdF9saWIxOCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtY2h1bmtlZEAyLjAuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtY2h1bmtlZC9pbmRleC5qcwpmdW5jdGlvbiBzcGxpY2UobGlzdDUsIHN0YXJ0LCByZW1vdmUyLCBpdGVtcykgewogIGNvbnN0IGVuZDMgPSBsaXN0NS5sZW5ndGg7CiAgbGV0IGNodW5rU3RhcnQgPSAwOwogIGxldCBwYXJhbWV0ZXJzOwogIGlmIChzdGFydCA8IDApIHsKICAgIHN0YXJ0ID0gLXN0YXJ0ID4gZW5kMyA/IDAgOiBlbmQzICsgc3RhcnQ7CiAgfSBlbHNlIHsKICAgIHN0YXJ0ID0gc3RhcnQgPiBlbmQzID8gZW5kMyA6IHN0YXJ0OwogIH0KICByZW1vdmUyID0gcmVtb3ZlMiA+IDAgPyByZW1vdmUyIDogMDsKICBpZiAoaXRlbXMubGVuZ3RoIDwgMWU0KSB7CiAgICBwYXJhbWV0ZXJzID0gQXJyYXkuZnJvbShpdGVtcyk7CiAgICBwYXJhbWV0ZXJzLnVuc2hpZnQoc3RhcnQsIHJlbW92ZTIpOwogICAgbGlzdDUuc3BsaWNlKC4uLnBhcmFtZXRlcnMpOwogIH0gZWxzZSB7CiAgICBpZiAocmVtb3ZlMikgbGlzdDUuc3BsaWNlKHN0YXJ0LCByZW1vdmUyKTsKICAgIHdoaWxlIChjaHVua1N0YXJ0IDwgaXRlbXMubGVuZ3RoKSB7CiAgICAgIHBhcmFtZXRlcnMgPSBpdGVtcy5zbGljZShjaHVua1N0YXJ0LCBjaHVua1N0YXJ0ICsgMWU0KTsKICAgICAgcGFyYW1ldGVycy51bnNoaWZ0KHN0YXJ0LCAwKTsKICAgICAgbGlzdDUuc3BsaWNlKC4uLnBhcmFtZXRlcnMpOwogICAgICBjaHVua1N0YXJ0ICs9IDFlNDsKICAgICAgc3RhcnQgKz0gMWU0OwogICAgfQogIH0KfQpmdW5jdGlvbiBwdXNoKGxpc3Q1LCBpdGVtcykgewogIGlmIChsaXN0NS5sZW5ndGggPiAwKSB7CiAgICBzcGxpY2UobGlzdDUsIGxpc3Q1Lmxlbmd0aCwgMCwgaXRlbXMpOwogICAgcmV0dXJuIGxpc3Q1OwogIH0KICByZXR1cm4gaXRlbXM7Cn0KdmFyIGluaXRfbWljcm9tYXJrX3V0aWxfY2h1bmtlZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLWNodW5rZWRAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLWNodW5rZWQvaW5kZXguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtY29tYmluZS1leHRlbnNpb25zQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1jb21iaW5lLWV4dGVuc2lvbnMvaW5kZXguanMKZnVuY3Rpb24gY29tYmluZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucykgewogIGNvbnN0IGFsbDMgPSB7fTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgZXh0ZW5zaW9ucy5sZW5ndGgpIHsKICAgIHN5bnRheEV4dGVuc2lvbihhbGwzLCBleHRlbnNpb25zW2luZGV4Ml0pOwogIH0KICByZXR1cm4gYWxsMzsKfQpmdW5jdGlvbiBzeW50YXhFeHRlbnNpb24oYWxsMywgZXh0ZW5zaW9uMikgewogIGxldCBob29rOwogIGZvciAoaG9vayBpbiBleHRlbnNpb24yKSB7CiAgICBjb25zdCBtYXliZSA9IGhhc093blByb3BlcnR5LmNhbGwoYWxsMywgaG9vaykgPyBhbGwzW2hvb2tdIDogdm9pZCAwOwogICAgY29uc3QgbGVmdCA9IG1heWJlIHx8IChhbGwzW2hvb2tdID0ge30pOwogICAgY29uc3QgcmlnaHQgPSBleHRlbnNpb24yW2hvb2tdOwogICAgbGV0IGNvZGU0OwogICAgaWYgKHJpZ2h0KSB7CiAgICAgIGZvciAoY29kZTQgaW4gcmlnaHQpIHsKICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwobGVmdCwgY29kZTQpKSBsZWZ0W2NvZGU0XSA9IFtdOwogICAgICAgIGNvbnN0IHZhbHVlMiA9IHJpZ2h0W2NvZGU0XTsKICAgICAgICBjb25zdHJ1Y3RzKAogICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBMb29rcyBsaWtlIGEgbGlzdC4KICAgICAgICAgIGxlZnRbY29kZTRdLAogICAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIpID8gdmFsdWUyIDogdmFsdWUyID8gW3ZhbHVlMl0gOiBbXQogICAgICAgICk7CiAgICAgIH0KICAgIH0KICB9Cn0KZnVuY3Rpb24gY29uc3RydWN0cyhleGlzdGluZywgbGlzdDUpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgY29uc3QgYmVmb3JlID0gW107CiAgd2hpbGUgKCsraW5kZXgyIDwgbGlzdDUubGVuZ3RoKSB7CiAgICA7CiAgICAobGlzdDVbaW5kZXgyXS5hZGQgPT09ICJhZnRlciIgPyBleGlzdGluZyA6IGJlZm9yZSkucHVzaChsaXN0NVtpbmRleDJdKTsKICB9CiAgc3BsaWNlKGV4aXN0aW5nLCAwLCAwLCBiZWZvcmUpOwp9CmZ1bmN0aW9uIGNvbWJpbmVIdG1sRXh0ZW5zaW9ucyhodG1sRXh0ZW5zaW9ucykgewogIGNvbnN0IGhhbmRsZXJzMiA9IHt9OwogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBodG1sRXh0ZW5zaW9ucy5sZW5ndGgpIHsKICAgIGh0bWxFeHRlbnNpb24oaGFuZGxlcnMyLCBodG1sRXh0ZW5zaW9uc1tpbmRleDJdKTsKICB9CiAgcmV0dXJuIGhhbmRsZXJzMjsKfQpmdW5jdGlvbiBodG1sRXh0ZW5zaW9uKGFsbDMsIGV4dGVuc2lvbjIpIHsKICBsZXQgaG9vazsKICBmb3IgKGhvb2sgaW4gZXh0ZW5zaW9uMikgewogICAgY29uc3QgbWF5YmUgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKGFsbDMsIGhvb2spID8gYWxsM1tob29rXSA6IHZvaWQgMDsKICAgIGNvbnN0IGxlZnQgPSBtYXliZSB8fCAoYWxsM1tob29rXSA9IHt9KTsKICAgIGNvbnN0IHJpZ2h0ID0gZXh0ZW5zaW9uMltob29rXTsKICAgIGxldCB0eXBlNTsKICAgIGlmIChyaWdodCkgewogICAgICBmb3IgKHR5cGU1IGluIHJpZ2h0KSB7CiAgICAgICAgbGVmdFt0eXBlNV0gPSByaWdodFt0eXBlNV07CiAgICAgIH0KICAgIH0KICB9Cn0KdmFyIGhhc093blByb3BlcnR5Owp2YXIgaW5pdF9taWNyb21hcmtfdXRpbF9jb21iaW5lX2V4dGVuc2lvbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1jb21iaW5lLWV4dGVuc2lvbnNAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLWNvbWJpbmUtZXh0ZW5zaW9ucy9pbmRleC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NodW5rZWQoKTsKICAgIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1hdXRvbGluay1saXRlcmFsQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1hdXRvbGluay1saXRlcmFsL2xpYi9zeW50YXguanMKZnVuY3Rpb24gZ2ZtQXV0b2xpbmtMaXRlcmFsKCkgewogIHJldHVybiB7CiAgICB0ZXh0OiB0ZXh0MgogIH07Cn0KZnVuY3Rpb24gdG9rZW5pemVFbWFpbEF1dG9saW5rKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGxldCBkb3Q7CiAgbGV0IGRhdGE7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBpZiAoIWdmbUF0ZXh0KGNvZGU0KSB8fCAhcHJldmlvdXNFbWFpbC5jYWxsKHNlbGYyLCBzZWxmMi5wcmV2aW91cykgfHwgcHJldmlvdXNVbmJhbGFuY2VkKHNlbGYyLmV2ZW50cykpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJsaXRlcmFsQXV0b2xpbmsiKTsKICAgIGVmZmVjdHMuZW50ZXIoImxpdGVyYWxBdXRvbGlua0VtYWlsIik7CiAgICByZXR1cm4gYXRleHQoY29kZTQpOwogIH0KICBmdW5jdGlvbiBhdGV4dChjb2RlNCkgewogICAgaWYgKGdmbUF0ZXh0KGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gYXRleHQ7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDY0KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBlbWFpbERvbWFpbjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBlbWFpbERvbWFpbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NikgewogICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhlbWFpbERvbWFpbkRvdFRyYWlsLCBlbWFpbERvbWFpbkFmdGVyLCBlbWFpbERvbWFpbkRvdCkoY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0NSB8fCBjb2RlNCA9PT0gOTUgfHwgYXNjaWlBbHBoYW51bWVyaWMoY29kZTQpKSB7CiAgICAgIGRhdGEgPSB0cnVlOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gZW1haWxEb21haW47CiAgICB9CiAgICByZXR1cm4gZW1haWxEb21haW5BZnRlcihjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGVtYWlsRG9tYWluRG90KGNvZGU0KSB7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZG90ID0gdHJ1ZTsKICAgIHJldHVybiBlbWFpbERvbWFpbjsKICB9CiAgZnVuY3Rpb24gZW1haWxEb21haW5BZnRlcihjb2RlNCkgewogICAgaWYgKGRhdGEgJiYgZG90ICYmIGFzY2lpQWxwaGEoc2VsZjIucHJldmlvdXMpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgibGl0ZXJhbEF1dG9saW5rRW1haWwiKTsKICAgICAgZWZmZWN0cy5leGl0KCJsaXRlcmFsQXV0b2xpbmsiKTsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVXd3dBdXRvbGluayhlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICByZXR1cm4gd3d3U3RhcnQ7CiAgZnVuY3Rpb24gd3d3U3RhcnQoY29kZTQpIHsKICAgIGlmIChjb2RlNCAhPT0gODcgJiYgY29kZTQgIT09IDExOSB8fCAhcHJldmlvdXNXd3cuY2FsbChzZWxmMiwgc2VsZjIucHJldmlvdXMpIHx8IHByZXZpb3VzVW5iYWxhbmNlZChzZWxmMi5ldmVudHMpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigibGl0ZXJhbEF1dG9saW5rIik7CiAgICBlZmZlY3RzLmVudGVyKCJsaXRlcmFsQXV0b2xpbmtXd3ciKTsKICAgIHJldHVybiBlZmZlY3RzLmNoZWNrKHd3d1ByZWZpeCwgZWZmZWN0cy5hdHRlbXB0KGRvbWFpbiwgZWZmZWN0cy5hdHRlbXB0KHBhdGgsIHd3d0FmdGVyKSwgbm9rKSwgbm9rKShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHd3d0FmdGVyKGNvZGU0KSB7CiAgICBlZmZlY3RzLmV4aXQoImxpdGVyYWxBdXRvbGlua1d3dyIpOwogICAgZWZmZWN0cy5leGl0KCJsaXRlcmFsQXV0b2xpbmsiKTsKICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KfQpmdW5jdGlvbiB0b2tlbml6ZVByb3RvY29sQXV0b2xpbmsoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IGJ1ZmZlcjIgPSAiIjsKICBsZXQgc2VlbiA9IGZhbHNlOwogIHJldHVybiBwcm90b2NvbFN0YXJ0OwogIGZ1bmN0aW9uIHByb3RvY29sU3RhcnQoY29kZTQpIHsKICAgIGlmICgoY29kZTQgPT09IDcyIHx8IGNvZGU0ID09PSAxMDQpICYmIHByZXZpb3VzUHJvdG9jb2wuY2FsbChzZWxmMiwgc2VsZjIucHJldmlvdXMpICYmICFwcmV2aW91c1VuYmFsYW5jZWQoc2VsZjIuZXZlbnRzKSkgewogICAgICBlZmZlY3RzLmVudGVyKCJsaXRlcmFsQXV0b2xpbmsiKTsKICAgICAgZWZmZWN0cy5lbnRlcigibGl0ZXJhbEF1dG9saW5rSHR0cCIpOwogICAgICBidWZmZXIyICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGU0KTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHByb3RvY29sUHJlZml4SW5zaWRlOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHByb3RvY29sUHJlZml4SW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoYXNjaWlBbHBoYShjb2RlNCkgJiYgYnVmZmVyMi5sZW5ndGggPCA1KSB7CiAgICAgIGJ1ZmZlcjIgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZTQpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gcHJvdG9jb2xQcmVmaXhJbnNpZGU7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDU4KSB7CiAgICAgIGNvbnN0IHByb3RvY29sID0gYnVmZmVyMi50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAocHJvdG9jb2wgPT09ICJodHRwIiB8fCBwcm90b2NvbCA9PT0gImh0dHBzIikgewogICAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgICAgcmV0dXJuIHByb3RvY29sU2xhc2hlc0luc2lkZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHByb3RvY29sU2xhc2hlc0luc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBpZiAoc2VlbikgewogICAgICAgIHJldHVybiBhZnRlclByb3RvY29sOwogICAgICB9CiAgICAgIHNlZW4gPSB0cnVlOwogICAgICByZXR1cm4gcHJvdG9jb2xTbGFzaGVzSW5zaWRlOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGFmdGVyUHJvdG9jb2woY29kZTQpIHsKICAgIHJldHVybiBjb2RlNCA9PT0gbnVsbCB8fCBhc2NpaUNvbnRyb2woY29kZTQpIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpIHx8IHVuaWNvZGVXaGl0ZXNwYWNlKGNvZGU0KSB8fCB1bmljb2RlUHVuY3R1YXRpb24oY29kZTQpID8gbm9rKGNvZGU0KSA6IGVmZmVjdHMuYXR0ZW1wdChkb21haW4sIGVmZmVjdHMuYXR0ZW1wdChwYXRoLCBwcm90b2NvbEFmdGVyKSwgbm9rKShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHByb3RvY29sQWZ0ZXIoY29kZTQpIHsKICAgIGVmZmVjdHMuZXhpdCgibGl0ZXJhbEF1dG9saW5rSHR0cCIpOwogICAgZWZmZWN0cy5leGl0KCJsaXRlcmFsQXV0b2xpbmsiKTsKICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KfQpmdW5jdGlvbiB0b2tlbml6ZVd3d1ByZWZpeChlZmZlY3RzLCBvazMsIG5vaykgewogIGxldCBzaXplID0gMDsKICByZXR1cm4gd3d3UHJlZml4SW5zaWRlOwogIGZ1bmN0aW9uIHd3d1ByZWZpeEluc2lkZShjb2RlNCkgewogICAgaWYgKChjb2RlNCA9PT0gODcgfHwgY29kZTQgPT09IDExOSkgJiYgc2l6ZSA8IDMpIHsKICAgICAgc2l6ZSsrOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gd3d3UHJlZml4SW5zaWRlOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0NiAmJiBzaXplID09PSAzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB3d3dQcmVmaXhBZnRlcjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiB3d3dQcmVmaXhBZnRlcihjb2RlNCkgewogICAgcmV0dXJuIGNvZGU0ID09PSBudWxsID8gbm9rKGNvZGU0KSA6IG9rMyhjb2RlNCk7CiAgfQp9CmZ1bmN0aW9uIHRva2VuaXplRG9tYWluKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgbGV0IHVuZGVyc2NvcmVJbkxhc3RTZWdtZW50OwogIGxldCB1bmRlcnNjb3JlSW5MYXN0TGFzdFNlZ21lbnQ7CiAgbGV0IHNlZW47CiAgcmV0dXJuIGRvbWFpbkluc2lkZTsKICBmdW5jdGlvbiBkb21haW5JbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDYgfHwgY29kZTQgPT09IDk1KSB7CiAgICAgIHJldHVybiBlZmZlY3RzLmNoZWNrKHRyYWlsLCBkb21haW5BZnRlciwgZG9tYWluQXRQdW5jdHVhdGlvbikoY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpIHx8IHVuaWNvZGVXaGl0ZXNwYWNlKGNvZGU0KSB8fCBjb2RlNCAhPT0gNDUgJiYgdW5pY29kZVB1bmN0dWF0aW9uKGNvZGU0KSkgewogICAgICByZXR1cm4gZG9tYWluQWZ0ZXIoY29kZTQpOwogICAgfQogICAgc2VlbiA9IHRydWU7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGRvbWFpbkluc2lkZTsKICB9CiAgZnVuY3Rpb24gZG9tYWluQXRQdW5jdHVhdGlvbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA5NSkgewogICAgICB1bmRlcnNjb3JlSW5MYXN0U2VnbWVudCA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICB1bmRlcnNjb3JlSW5MYXN0TGFzdFNlZ21lbnQgPSB1bmRlcnNjb3JlSW5MYXN0U2VnbWVudDsKICAgICAgdW5kZXJzY29yZUluTGFzdFNlZ21lbnQgPSB2b2lkIDA7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGRvbWFpbkluc2lkZTsKICB9CiAgZnVuY3Rpb24gZG9tYWluQWZ0ZXIoY29kZTQpIHsKICAgIGlmICh1bmRlcnNjb3JlSW5MYXN0TGFzdFNlZ21lbnQgfHwgdW5kZXJzY29yZUluTGFzdFNlZ21lbnQgfHwgIXNlZW4pIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVQYXRoKGVmZmVjdHMsIG9rMykgewogIGxldCBzaXplT3BlbiA9IDA7CiAgbGV0IHNpemVDbG9zZSA9IDA7CiAgcmV0dXJuIHBhdGhJbnNpZGU7CiAgZnVuY3Rpb24gcGF0aEluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0MCkgewogICAgICBzaXplT3BlbisrOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gcGF0aEluc2lkZTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDEgJiYgc2l6ZUNsb3NlIDwgc2l6ZU9wZW4pIHsKICAgICAgcmV0dXJuIHBhdGhBdFB1bmN0dWF0aW9uKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gMzMgfHwgY29kZTQgPT09IDM0IHx8IGNvZGU0ID09PSAzOCB8fCBjb2RlNCA9PT0gMzkgfHwgY29kZTQgPT09IDQxIHx8IGNvZGU0ID09PSA0MiB8fCBjb2RlNCA9PT0gNDQgfHwgY29kZTQgPT09IDQ2IHx8IGNvZGU0ID09PSA1OCB8fCBjb2RlNCA9PT0gNTkgfHwgY29kZTQgPT09IDYwIHx8IGNvZGU0ID09PSA2MyB8fCBjb2RlNCA9PT0gOTMgfHwgY29kZTQgPT09IDk1IHx8IGNvZGU0ID09PSAxMjYpIHsKICAgICAgcmV0dXJuIGVmZmVjdHMuY2hlY2sodHJhaWwsIG9rMywgcGF0aEF0UHVuY3R1YXRpb24pKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSB8fCB1bmljb2RlV2hpdGVzcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIHBhdGhJbnNpZGU7CiAgfQogIGZ1bmN0aW9uIHBhdGhBdFB1bmN0dWF0aW9uKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQxKSB7CiAgICAgIHNpemVDbG9zZSsrOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBwYXRoSW5zaWRlOwogIH0KfQpmdW5jdGlvbiB0b2tlbml6ZVRyYWlsKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgcmV0dXJuIHRyYWlsMjsKICBmdW5jdGlvbiB0cmFpbDIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gMzMgfHwgY29kZTQgPT09IDM0IHx8IGNvZGU0ID09PSAzOSB8fCBjb2RlNCA9PT0gNDEgfHwgY29kZTQgPT09IDQyIHx8IGNvZGU0ID09PSA0NCB8fCBjb2RlNCA9PT0gNDYgfHwgY29kZTQgPT09IDU4IHx8IGNvZGU0ID09PSA1OSB8fCBjb2RlNCA9PT0gNjMgfHwgY29kZTQgPT09IDk1IHx8IGNvZGU0ID09PSAxMjYpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRyYWlsMjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gMzgpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRyYWlsQ2hhcmFjdGVyUmVmZXJlbmNlU3RhcnQ7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDkzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB0cmFpbEJyYWNrZXRBZnRlcjsKICAgIH0KICAgIGlmICgKICAgICAgLy8gYDxgIGlzIGFuIGVuZC4KICAgICAgY29kZTQgPT09IDYwIHx8IC8vIFNvIGlzIHdoaXRlc3BhY2UuCiAgICAgIGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpIHx8IHVuaWNvZGVXaGl0ZXNwYWNlKGNvZGU0KQogICAgKSB7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHRyYWlsQnJhY2tldEFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDQwIHx8IGNvZGU0ID09PSA5MSB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSB8fCB1bmljb2RlV2hpdGVzcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gdHJhaWwyKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdHJhaWxDaGFyYWN0ZXJSZWZlcmVuY2VTdGFydChjb2RlNCkgewogICAgcmV0dXJuIGFzY2lpQWxwaGEoY29kZTQpID8gdHJhaWxDaGFyYWN0ZXJSZWZlcmVuY2VJbnNpZGUoY29kZTQpIDogbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdHJhaWxDaGFyYWN0ZXJSZWZlcmVuY2VJbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNTkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRyYWlsMjsKICAgIH0KICAgIGlmIChhc2NpaUFscGhhKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdHJhaWxDaGFyYWN0ZXJSZWZlcmVuY2VJbnNpZGU7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVFbWFpbERvbWFpbkRvdFRyYWlsKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGFmdGVyOwogIH0KICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgcmV0dXJuIGFzY2lpQWxwaGFudW1lcmljKGNvZGU0KSA/IG5vayhjb2RlNCkgOiBvazMoY29kZTQpOwogIH0KfQpmdW5jdGlvbiBwcmV2aW91c1d3dyhjb2RlNCkgewogIHJldHVybiBjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gNDAgfHwgY29kZTQgPT09IDQyIHx8IGNvZGU0ID09PSA5NSB8fCBjb2RlNCA9PT0gOTEgfHwgY29kZTQgPT09IDkzIHx8IGNvZGU0ID09PSAxMjYgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCk7Cn0KZnVuY3Rpb24gcHJldmlvdXNQcm90b2NvbChjb2RlNCkgewogIHJldHVybiAhYXNjaWlBbHBoYShjb2RlNCk7Cn0KZnVuY3Rpb24gcHJldmlvdXNFbWFpbChjb2RlNCkgewogIHJldHVybiAhKGNvZGU0ID09PSA0NyB8fCBnZm1BdGV4dChjb2RlNCkpOwp9CmZ1bmN0aW9uIGdmbUF0ZXh0KGNvZGU0KSB7CiAgcmV0dXJuIGNvZGU0ID09PSA0MyB8fCBjb2RlNCA9PT0gNDUgfHwgY29kZTQgPT09IDQ2IHx8IGNvZGU0ID09PSA5NSB8fCBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCk7Cn0KZnVuY3Rpb24gcHJldmlvdXNVbmJhbGFuY2VkKGV2ZW50cykgewogIGxldCBpbmRleDIgPSBldmVudHMubGVuZ3RoOwogIGxldCByZXN1bHQgPSBmYWxzZTsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIGNvbnN0IHRva2VuID0gZXZlbnRzW2luZGV4Ml1bMV07CiAgICBpZiAoKHRva2VuLnR5cGUgPT09ICJsYWJlbExpbmsiIHx8IHRva2VuLnR5cGUgPT09ICJsYWJlbEltYWdlIikgJiYgIXRva2VuLl9iYWxhbmNlZCkgewogICAgICByZXN1bHQgPSB0cnVlOwogICAgICBicmVhazsKICAgIH0KICAgIGlmICh0b2tlbi5fZ2ZtQXV0b2xpbmtMaXRlcmFsV2Fsa2VkSW50bykgewogICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmIChldmVudHMubGVuZ3RoID4gMCAmJiAhcmVzdWx0KSB7CiAgICBldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdWzFdLl9nZm1BdXRvbGlua0xpdGVyYWxXYWxrZWRJbnRvID0gdHJ1ZTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQp2YXIgd3d3UHJlZml4LCBkb21haW4sIHBhdGgsIHRyYWlsLCBlbWFpbERvbWFpbkRvdFRyYWlsLCB3d3dBdXRvbGluaywgcHJvdG9jb2xBdXRvbGluaywgZW1haWxBdXRvbGluaywgdGV4dDIsIGNvZGUyOwp2YXIgaW5pdF9zeW50YXggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1hdXRvbGluay1saXRlcmFsQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1hdXRvbGluay1saXRlcmFsL2xpYi9zeW50YXguanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIHd3d1ByZWZpeCA9IHsKICAgICAgdG9rZW5pemU6IHRva2VuaXplV3d3UHJlZml4LAogICAgICBwYXJ0aWFsOiB0cnVlCiAgICB9OwogICAgZG9tYWluID0gewogICAgICB0b2tlbml6ZTogdG9rZW5pemVEb21haW4sCiAgICAgIHBhcnRpYWw6IHRydWUKICAgIH07CiAgICBwYXRoID0gewogICAgICB0b2tlbml6ZTogdG9rZW5pemVQYXRoLAogICAgICBwYXJ0aWFsOiB0cnVlCiAgICB9OwogICAgdHJhaWwgPSB7CiAgICAgIHRva2VuaXplOiB0b2tlbml6ZVRyYWlsLAogICAgICBwYXJ0aWFsOiB0cnVlCiAgICB9OwogICAgZW1haWxEb21haW5Eb3RUcmFpbCA9IHsKICAgICAgdG9rZW5pemU6IHRva2VuaXplRW1haWxEb21haW5Eb3RUcmFpbCwKICAgICAgcGFydGlhbDogdHJ1ZQogICAgfTsKICAgIHd3d0F1dG9saW5rID0gewogICAgICBuYW1lOiAid3d3QXV0b2xpbmsiLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVXd3dBdXRvbGluaywKICAgICAgcHJldmlvdXM6IHByZXZpb3VzV3d3CiAgICB9OwogICAgcHJvdG9jb2xBdXRvbGluayA9IHsKICAgICAgbmFtZTogInByb3RvY29sQXV0b2xpbmsiLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVQcm90b2NvbEF1dG9saW5rLAogICAgICBwcmV2aW91czogcHJldmlvdXNQcm90b2NvbAogICAgfTsKICAgIGVtYWlsQXV0b2xpbmsgPSB7CiAgICAgIG5hbWU6ICJlbWFpbEF1dG9saW5rIiwKICAgICAgdG9rZW5pemU6IHRva2VuaXplRW1haWxBdXRvbGluaywKICAgICAgcHJldmlvdXM6IHByZXZpb3VzRW1haWwKICAgIH07CiAgICB0ZXh0MiA9IHt9OwogICAgY29kZTIgPSA0ODsKICAgIHdoaWxlIChjb2RlMiA8IDEyMykgewogICAgICB0ZXh0Mltjb2RlMl0gPSBlbWFpbEF1dG9saW5rOwogICAgICBjb2RlMisrOwogICAgICBpZiAoY29kZTIgPT09IDU4KSBjb2RlMiA9IDY1OwogICAgICBlbHNlIGlmIChjb2RlMiA9PT0gOTEpIGNvZGUyID0gOTc7CiAgICB9CiAgICB0ZXh0Mls0M10gPSBlbWFpbEF1dG9saW5rOwogICAgdGV4dDJbNDVdID0gZW1haWxBdXRvbGluazsKICAgIHRleHQyWzQ2XSA9IGVtYWlsQXV0b2xpbms7CiAgICB0ZXh0Mls5NV0gPSBlbWFpbEF1dG9saW5rOwogICAgdGV4dDJbNzJdID0gW2VtYWlsQXV0b2xpbmssIHByb3RvY29sQXV0b2xpbmtdOwogICAgdGV4dDJbMTA0XSA9IFtlbWFpbEF1dG9saW5rLCBwcm90b2NvbEF1dG9saW5rXTsKICAgIHRleHQyWzg3XSA9IFtlbWFpbEF1dG9saW5rLCB3d3dBdXRvbGlua107CiAgICB0ZXh0MlsxMTldID0gW2VtYWlsQXV0b2xpbmssIHd3d0F1dG9saW5rXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLWVuY29kZUAyLjAuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLXV0aWwtZW5jb2RlL2luZGV4LmpzCmZ1bmN0aW9uIGVuY29kZSh2YWx1ZTIpIHsKICByZXR1cm4gdmFsdWUyLnJlcGxhY2UoL1siJjw+XS9nLCByZXBsYWNlNSk7CiAgZnVuY3Rpb24gcmVwbGFjZTUodmFsdWUzKSB7CiAgICByZXR1cm4gIiYiICsgY2hhcmFjdGVyUmVmZXJlbmNlc1sKICAgICAgLyoqIEB0eXBlIHtrZXlvZiB0eXBlb2YgY2hhcmFjdGVyUmVmZXJlbmNlc30gKi8KICAgICAgdmFsdWUzCiAgICBdICsgIjsiOwogIH0KfQp2YXIgY2hhcmFjdGVyUmVmZXJlbmNlczsKdmFyIGluaXRfbWljcm9tYXJrX3V0aWxfZW5jb2RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtZW5jb2RlQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1lbmNvZGUvaW5kZXguanMiKCkgewogICAgY2hhcmFjdGVyUmVmZXJlbmNlcyA9IHsgJyInOiAicXVvdCIsICImIjogImFtcCIsICI8IjogImx0IiwgIj4iOiAiZ3QiIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1zYW5pdGl6ZS11cmlAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLXNhbml0aXplLXVyaS9pbmRleC5qcwpmdW5jdGlvbiBzYW5pdGl6ZVVyaSh1cmwsIHByb3RvY29sKSB7CiAgY29uc3QgdmFsdWUyID0gZW5jb2RlKG5vcm1hbGl6ZVVyaSh1cmwgfHwgIiIpKTsKICBpZiAoIXByb3RvY29sKSB7CiAgICByZXR1cm4gdmFsdWUyOwogIH0KICBjb25zdCBjb2xvbiA9IHZhbHVlMi5pbmRleE9mKCI6Iik7CiAgY29uc3QgcXVlc3Rpb25NYXJrID0gdmFsdWUyLmluZGV4T2YoIj8iKTsKICBjb25zdCBudW1iZXJTaWduID0gdmFsdWUyLmluZGV4T2YoIiMiKTsKICBjb25zdCBzbGFzaCA9IHZhbHVlMi5pbmRleE9mKCIvIik7CiAgaWYgKAogICAgLy8gSWYgdGhlcmUgaXMgbm8gcHJvdG9jb2wsIGl04oCZcyByZWxhdGl2ZS4KICAgIGNvbG9uIDwgMCB8fCAvLyBJZiB0aGUgZmlyc3QgY29sb24gaXMgYWZ0ZXIgYSBgP2AsIGAjYCwgb3IgYC9gLCBpdOKAmXMgbm90IGEgcHJvdG9jb2wuCiAgICBzbGFzaCA+IC0xICYmIGNvbG9uID4gc2xhc2ggfHwgcXVlc3Rpb25NYXJrID4gLTEgJiYgY29sb24gPiBxdWVzdGlvbk1hcmsgfHwgbnVtYmVyU2lnbiA+IC0xICYmIGNvbG9uID4gbnVtYmVyU2lnbiB8fCAvLyBJdCBpcyBhIHByb3RvY29sLCBpdCBzaG91bGQgYmUgYWxsb3dlZC4KICAgIHByb3RvY29sLnRlc3QodmFsdWUyLnNsaWNlKDAsIGNvbG9uKSkKICApIHsKICAgIHJldHVybiB2YWx1ZTI7CiAgfQogIHJldHVybiAiIjsKfQpmdW5jdGlvbiBub3JtYWxpemVVcmkodmFsdWUyKSB7CiAgY29uc3QgcmVzdWx0ID0gW107CiAgbGV0IGluZGV4MiA9IC0xOwogIGxldCBzdGFydCA9IDA7CiAgbGV0IHNraXAyID0gMDsKICB3aGlsZSAoKytpbmRleDIgPCB2YWx1ZTIubGVuZ3RoKSB7CiAgICBjb25zdCBjb2RlNCA9IHZhbHVlMi5jaGFyQ29kZUF0KGluZGV4Mik7CiAgICBsZXQgcmVwbGFjZTUgPSAiIjsKICAgIGlmIChjb2RlNCA9PT0gMzcgJiYgYXNjaWlBbHBoYW51bWVyaWModmFsdWUyLmNoYXJDb2RlQXQoaW5kZXgyICsgMSkpICYmIGFzY2lpQWxwaGFudW1lcmljKHZhbHVlMi5jaGFyQ29kZUF0KGluZGV4MiArIDIpKSkgewogICAgICBza2lwMiA9IDI7CiAgICB9IGVsc2UgaWYgKGNvZGU0IDwgMTI4KSB7CiAgICAgIGlmICghL1shIyQmLTs9Py1aX2Eten5dLy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZTQpKSkgewogICAgICAgIHJlcGxhY2U1ID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlNCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY29kZTQgPiA1NTI5NSAmJiBjb2RlNCA8IDU3MzQ0KSB7CiAgICAgIGNvbnN0IG5leHQyID0gdmFsdWUyLmNoYXJDb2RlQXQoaW5kZXgyICsgMSk7CiAgICAgIGlmIChjb2RlNCA8IDU2MzIwICYmIG5leHQyID4gNTYzMTkgJiYgbmV4dDIgPCA1NzM0NCkgewogICAgICAgIHJlcGxhY2U1ID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlNCwgbmV4dDIpOwogICAgICAgIHNraXAyID0gMTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXBsYWNlNSA9ICJcdUZGRkQiOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXBsYWNlNSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZTQpOwogICAgfQogICAgaWYgKHJlcGxhY2U1KSB7CiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlMi5zbGljZShzdGFydCwgaW5kZXgyKSwgZW5jb2RlVVJJQ29tcG9uZW50KHJlcGxhY2U1KSk7CiAgICAgIHN0YXJ0ID0gaW5kZXgyICsgc2tpcDIgKyAxOwogICAgICByZXBsYWNlNSA9ICIiOwogICAgfQogICAgaWYgKHNraXAyKSB7CiAgICAgIGluZGV4MiArPSBza2lwMjsKICAgICAgc2tpcDIgPSAwOwogICAgfQogIH0KICByZXR1cm4gcmVzdWx0LmpvaW4oIiIpICsgdmFsdWUyLnNsaWNlKHN0YXJ0KTsKfQp2YXIgaW5pdF9taWNyb21hcmtfdXRpbF9zYW5pdGl6ZV91cmkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1zYW5pdGl6ZS11cmlAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLXNhbml0aXplLXVyaS9pbmRleC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9lbmNvZGUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLWF1dG9saW5rLWxpdGVyYWxAMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLWF1dG9saW5rLWxpdGVyYWwvbGliL2h0bWwuanMKZnVuY3Rpb24gZ2ZtQXV0b2xpbmtMaXRlcmFsSHRtbCgpIHsKICByZXR1cm4gewogICAgZXhpdDogewogICAgICBsaXRlcmFsQXV0b2xpbmtFbWFpbCwKICAgICAgbGl0ZXJhbEF1dG9saW5rSHR0cCwKICAgICAgbGl0ZXJhbEF1dG9saW5rV3d3CiAgICB9CiAgfTsKfQpmdW5jdGlvbiBsaXRlcmFsQXV0b2xpbmtXd3codG9rZW4pIHsKICBhbmNob3JGcm9tVG9rZW4uY2FsbCh0aGlzLCB0b2tlbiwgImh0dHA6Ly8iKTsKfQpmdW5jdGlvbiBsaXRlcmFsQXV0b2xpbmtFbWFpbCh0b2tlbikgewogIGFuY2hvckZyb21Ub2tlbi5jYWxsKHRoaXMsIHRva2VuLCAibWFpbHRvOiIpOwp9CmZ1bmN0aW9uIGxpdGVyYWxBdXRvbGlua0h0dHAodG9rZW4pIHsKICBhbmNob3JGcm9tVG9rZW4uY2FsbCh0aGlzLCB0b2tlbik7Cn0KZnVuY3Rpb24gYW5jaG9yRnJvbVRva2VuKHRva2VuLCBwcm90b2NvbCkgewogIGNvbnN0IHVybCA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwogIHRoaXMudGFnKCc8YSBocmVmPSInICsgc2FuaXRpemVVcmkoKHByb3RvY29sIHx8ICIiKSArIHVybCkgKyAnIj4nKTsKICB0aGlzLnJhdyh0aGlzLmVuY29kZSh1cmwpKTsKICB0aGlzLnRhZygiPC9hPiIpOwp9CnZhciBpbml0X2h0bWwyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tYXV0b2xpbmstbGl0ZXJhbEAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tYXV0b2xpbmstbGl0ZXJhbC9saWIvaHRtbC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX3Nhbml0aXplX3VyaSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tYXV0b2xpbmstbGl0ZXJhbEAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tYXV0b2xpbmstbGl0ZXJhbC9pbmRleC5qcwp2YXIgaW5pdF9taWNyb21hcmtfZXh0ZW5zaW9uX2dmbV9hdXRvbGlua19saXRlcmFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tYXV0b2xpbmstbGl0ZXJhbEAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tYXV0b2xpbmstbGl0ZXJhbC9pbmRleC5qcyIoKSB7CiAgICBpbml0X3N5bnRheCgpOwogICAgaW5pdF9odG1sMigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtcmVzb2x2ZS1hbGxAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLXJlc29sdmUtYWxsL2luZGV4LmpzCmZ1bmN0aW9uIHJlc29sdmVBbGwoY29uc3RydWN0czIsIGV2ZW50cywgY29udGV4dDIpIHsKICBjb25zdCBjYWxsZWQgPSBbXTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgY29uc3RydWN0czIubGVuZ3RoKSB7CiAgICBjb25zdCByZXNvbHZlMiA9IGNvbnN0cnVjdHMyW2luZGV4Ml0ucmVzb2x2ZUFsbDsKICAgIGlmIChyZXNvbHZlMiAmJiAhY2FsbGVkLmluY2x1ZGVzKHJlc29sdmUyKSkgewogICAgICBldmVudHMgPSByZXNvbHZlMihldmVudHMsIGNvbnRleHQyKTsKICAgICAgY2FsbGVkLnB1c2gocmVzb2x2ZTIpOwogICAgfQogIH0KICByZXR1cm4gZXZlbnRzOwp9CnZhciBpbml0X21pY3JvbWFya191dGlsX3Jlc29sdmVfYWxsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtcmVzb2x2ZS1hbGxAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLXJlc29sdmUtYWxsL2luZGV4LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2F0dGVudGlvbi5qcwpmdW5jdGlvbiByZXNvbHZlQWxsQXR0ZW50aW9uKGV2ZW50cywgY29udGV4dDIpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IG9wZW47CiAgbGV0IGdyb3VwOwogIGxldCB0ZXh0OTsKICBsZXQgb3BlbmluZ1NlcXVlbmNlOwogIGxldCBjbG9zaW5nU2VxdWVuY2U7CiAgbGV0IHVzZTsKICBsZXQgbmV4dEV2ZW50czsKICBsZXQgb2Zmc2V0OwogIHdoaWxlICgrK2luZGV4MiA8IGV2ZW50cy5sZW5ndGgpIHsKICAgIGlmIChldmVudHNbaW5kZXgyXVswXSA9PT0gImVudGVyIiAmJiBldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAiYXR0ZW50aW9uU2VxdWVuY2UiICYmIGV2ZW50c1tpbmRleDJdWzFdLl9jbG9zZSkgewogICAgICBvcGVuID0gaW5kZXgyOwogICAgICB3aGlsZSAob3Blbi0tKSB7CiAgICAgICAgaWYgKGV2ZW50c1tvcGVuXVswXSA9PT0gImV4aXQiICYmIGV2ZW50c1tvcGVuXVsxXS50eXBlID09PSAiYXR0ZW50aW9uU2VxdWVuY2UiICYmIGV2ZW50c1tvcGVuXVsxXS5fb3BlbiAmJiAvLyBJZiB0aGUgbWFya2VycyBhcmUgdGhlIHNhbWU6CiAgICAgICAgY29udGV4dDIuc2xpY2VTZXJpYWxpemUoZXZlbnRzW29wZW5dWzFdKS5jaGFyQ29kZUF0KDApID09PSBjb250ZXh0Mi5zbGljZVNlcmlhbGl6ZShldmVudHNbaW5kZXgyXVsxXSkuY2hhckNvZGVBdCgwKSkgewogICAgICAgICAgaWYgKChldmVudHNbb3Blbl1bMV0uX2Nsb3NlIHx8IGV2ZW50c1tpbmRleDJdWzFdLl9vcGVuKSAmJiAoZXZlbnRzW2luZGV4Ml1bMV0uZW5kLm9mZnNldCAtIGV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0Lm9mZnNldCkgJSAzICYmICEoKGV2ZW50c1tvcGVuXVsxXS5lbmQub2Zmc2V0IC0gZXZlbnRzW29wZW5dWzFdLnN0YXJ0Lm9mZnNldCArIGV2ZW50c1tpbmRleDJdWzFdLmVuZC5vZmZzZXQgLSBldmVudHNbaW5kZXgyXVsxXS5zdGFydC5vZmZzZXQpICUgMykpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICB1c2UgPSBldmVudHNbb3Blbl1bMV0uZW5kLm9mZnNldCAtIGV2ZW50c1tvcGVuXVsxXS5zdGFydC5vZmZzZXQgPiAxICYmIGV2ZW50c1tpbmRleDJdWzFdLmVuZC5vZmZzZXQgLSBldmVudHNbaW5kZXgyXVsxXS5zdGFydC5vZmZzZXQgPiAxID8gMiA6IDE7CiAgICAgICAgICBjb25zdCBzdGFydCA9IHsKICAgICAgICAgICAgLi4uZXZlbnRzW29wZW5dWzFdLmVuZAogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IGVuZDMgPSB7CiAgICAgICAgICAgIC4uLmV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0CiAgICAgICAgICB9OwogICAgICAgICAgbW92ZVBvaW50KHN0YXJ0LCAtdXNlKTsKICAgICAgICAgIG1vdmVQb2ludChlbmQzLCB1c2UpOwogICAgICAgICAgb3BlbmluZ1NlcXVlbmNlID0gewogICAgICAgICAgICB0eXBlOiB1c2UgPiAxID8gInN0cm9uZ1NlcXVlbmNlIiA6ICJlbXBoYXNpc1NlcXVlbmNlIiwKICAgICAgICAgICAgc3RhcnQsCiAgICAgICAgICAgIGVuZDogewogICAgICAgICAgICAgIC4uLmV2ZW50c1tvcGVuXVsxXS5lbmQKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIGNsb3NpbmdTZXF1ZW5jZSA9IHsKICAgICAgICAgICAgdHlwZTogdXNlID4gMSA/ICJzdHJvbmdTZXF1ZW5jZSIgOiAiZW1waGFzaXNTZXF1ZW5jZSIsCiAgICAgICAgICAgIHN0YXJ0OiB7CiAgICAgICAgICAgICAgLi4uZXZlbnRzW2luZGV4Ml1bMV0uc3RhcnQKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZW5kOiBlbmQzCiAgICAgICAgICB9OwogICAgICAgICAgdGV4dDkgPSB7CiAgICAgICAgICAgIHR5cGU6IHVzZSA+IDEgPyAic3Ryb25nVGV4dCIgOiAiZW1waGFzaXNUZXh0IiwKICAgICAgICAgICAgc3RhcnQ6IHsKICAgICAgICAgICAgICAuLi5ldmVudHNbb3Blbl1bMV0uZW5kCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVuZDogewogICAgICAgICAgICAgIC4uLmV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICBncm91cCA9IHsKICAgICAgICAgICAgdHlwZTogdXNlID4gMSA/ICJzdHJvbmciIDogImVtcGhhc2lzIiwKICAgICAgICAgICAgc3RhcnQ6IHsKICAgICAgICAgICAgICAuLi5vcGVuaW5nU2VxdWVuY2Uuc3RhcnQKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZW5kOiB7CiAgICAgICAgICAgICAgLi4uY2xvc2luZ1NlcXVlbmNlLmVuZAogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgZXZlbnRzW29wZW5dWzFdLmVuZCA9IHsKICAgICAgICAgICAgLi4ub3BlbmluZ1NlcXVlbmNlLnN0YXJ0CiAgICAgICAgICB9OwogICAgICAgICAgZXZlbnRzW2luZGV4Ml1bMV0uc3RhcnQgPSB7CiAgICAgICAgICAgIC4uLmNsb3NpbmdTZXF1ZW5jZS5lbmQKICAgICAgICAgIH07CiAgICAgICAgICBuZXh0RXZlbnRzID0gW107CiAgICAgICAgICBpZiAoZXZlbnRzW29wZW5dWzFdLmVuZC5vZmZzZXQgLSBldmVudHNbb3Blbl1bMV0uc3RhcnQub2Zmc2V0KSB7CiAgICAgICAgICAgIG5leHRFdmVudHMgPSBwdXNoKG5leHRFdmVudHMsIFtbImVudGVyIiwgZXZlbnRzW29wZW5dWzFdLCBjb250ZXh0Ml0sIFsiZXhpdCIsIGV2ZW50c1tvcGVuXVsxXSwgY29udGV4dDJdXSk7CiAgICAgICAgICB9CiAgICAgICAgICBuZXh0RXZlbnRzID0gcHVzaChuZXh0RXZlbnRzLCBbWyJlbnRlciIsIGdyb3VwLCBjb250ZXh0Ml0sIFsiZW50ZXIiLCBvcGVuaW5nU2VxdWVuY2UsIGNvbnRleHQyXSwgWyJleGl0Iiwgb3BlbmluZ1NlcXVlbmNlLCBjb250ZXh0Ml0sIFsiZW50ZXIiLCB0ZXh0OSwgY29udGV4dDJdXSk7CiAgICAgICAgICBuZXh0RXZlbnRzID0gcHVzaChuZXh0RXZlbnRzLCByZXNvbHZlQWxsKGNvbnRleHQyLnBhcnNlci5jb25zdHJ1Y3RzLmluc2lkZVNwYW4ubnVsbCwgZXZlbnRzLnNsaWNlKG9wZW4gKyAxLCBpbmRleDIpLCBjb250ZXh0MikpOwogICAgICAgICAgbmV4dEV2ZW50cyA9IHB1c2gobmV4dEV2ZW50cywgW1siZXhpdCIsIHRleHQ5LCBjb250ZXh0Ml0sIFsiZW50ZXIiLCBjbG9zaW5nU2VxdWVuY2UsIGNvbnRleHQyXSwgWyJleGl0IiwgY2xvc2luZ1NlcXVlbmNlLCBjb250ZXh0Ml0sIFsiZXhpdCIsIGdyb3VwLCBjb250ZXh0Ml1dKTsKICAgICAgICAgIGlmIChldmVudHNbaW5kZXgyXVsxXS5lbmQub2Zmc2V0IC0gZXZlbnRzW2luZGV4Ml1bMV0uc3RhcnQub2Zmc2V0KSB7CiAgICAgICAgICAgIG9mZnNldCA9IDI7CiAgICAgICAgICAgIG5leHRFdmVudHMgPSBwdXNoKG5leHRFdmVudHMsIFtbImVudGVyIiwgZXZlbnRzW2luZGV4Ml1bMV0sIGNvbnRleHQyXSwgWyJleGl0IiwgZXZlbnRzW2luZGV4Ml1bMV0sIGNvbnRleHQyXV0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb2Zmc2V0ID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIHNwbGljZShldmVudHMsIG9wZW4gLSAxLCBpbmRleDIgLSBvcGVuICsgMywgbmV4dEV2ZW50cyk7CiAgICAgICAgICBpbmRleDIgPSBvcGVuICsgbmV4dEV2ZW50cy5sZW5ndGggLSBvZmZzZXQgLSAyOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IGV2ZW50cy5sZW5ndGgpIHsKICAgIGlmIChldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAiYXR0ZW50aW9uU2VxdWVuY2UiKSB7CiAgICAgIGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPSAiZGF0YSI7CiAgICB9CiAgfQogIHJldHVybiBldmVudHM7Cn0KZnVuY3Rpb24gdG9rZW5pemVBdHRlbnRpb24oZWZmZWN0cywgb2szKSB7CiAgY29uc3QgYXR0ZW50aW9uTWFya2VyczIgPSB0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmF0dGVudGlvbk1hcmtlcnMubnVsbDsKICBjb25zdCBwcmV2aW91czMgPSB0aGlzLnByZXZpb3VzOwogIGNvbnN0IGJlZm9yZSA9IGNsYXNzaWZ5Q2hhcmFjdGVyKHByZXZpb3VzMyk7CiAgbGV0IG1hcmtlcjsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIG1hcmtlciA9IGNvZGU0OwogICAgZWZmZWN0cy5lbnRlcigiYXR0ZW50aW9uU2VxdWVuY2UiKTsKICAgIHJldHVybiBpbnNpZGUoY29kZTQpOwogIH0KICBmdW5jdGlvbiBpbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbWFya2VyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBpbnNpZGU7CiAgICB9CiAgICBjb25zdCB0b2tlbiA9IGVmZmVjdHMuZXhpdCgiYXR0ZW50aW9uU2VxdWVuY2UiKTsKICAgIGNvbnN0IGFmdGVyID0gY2xhc3NpZnlDaGFyYWN0ZXIoY29kZTQpOwogICAgY29uc3Qgb3BlbiA9ICFhZnRlciB8fCBhZnRlciA9PT0gMiAmJiBiZWZvcmUgfHwgYXR0ZW50aW9uTWFya2VyczIuaW5jbHVkZXMoY29kZTQpOwogICAgY29uc3QgY2xvc2U3ID0gIWJlZm9yZSB8fCBiZWZvcmUgPT09IDIgJiYgYWZ0ZXIgfHwgYXR0ZW50aW9uTWFya2VyczIuaW5jbHVkZXMocHJldmlvdXMzKTsKICAgIHRva2VuLl9vcGVuID0gQm9vbGVhbihtYXJrZXIgPT09IDQyID8gb3BlbiA6IG9wZW4gJiYgKGJlZm9yZSB8fCAhY2xvc2U3KSk7CiAgICB0b2tlbi5fY2xvc2UgPSBCb29sZWFuKG1hcmtlciA9PT0gNDIgPyBjbG9zZTcgOiBjbG9zZTcgJiYgKGFmdGVyIHx8ICFvcGVuKSk7CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gbW92ZVBvaW50KHBvaW50NCwgb2Zmc2V0KSB7CiAgcG9pbnQ0LmNvbHVtbiArPSBvZmZzZXQ7CiAgcG9pbnQ0Lm9mZnNldCArPSBvZmZzZXQ7CiAgcG9pbnQ0Ll9idWZmZXJJbmRleCArPSBvZmZzZXQ7Cn0KdmFyIGF0dGVudGlvbjsKdmFyIGluaXRfYXR0ZW50aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvYXR0ZW50aW9uLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2h1bmtlZCgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jbGFzc2lmeV9jaGFyYWN0ZXIoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfcmVzb2x2ZV9hbGwoKTsKICAgIGF0dGVudGlvbiA9IHsKICAgICAgbmFtZTogImF0dGVudGlvbiIsCiAgICAgIHJlc29sdmVBbGw6IHJlc29sdmVBbGxBdHRlbnRpb24sCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZUF0dGVudGlvbgogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2F1dG9saW5rLmpzCmZ1bmN0aW9uIHRva2VuaXplQXV0b2xpbmsoZWZmZWN0cywgb2szLCBub2spIHsKICBsZXQgc2l6ZSA9IDA7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJhdXRvbGluayIpOwogICAgZWZmZWN0cy5lbnRlcigiYXV0b2xpbmtNYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImF1dG9saW5rTWFya2VyIik7CiAgICBlZmZlY3RzLmVudGVyKCJhdXRvbGlua1Byb3RvY29sIik7CiAgICByZXR1cm4gb3BlbjsKICB9CiAgZnVuY3Rpb24gb3Blbihjb2RlNCkgewogICAgaWYgKGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBzY2hlbWVPckVtYWlsQXRleHQ7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDY0KSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgcmV0dXJuIGVtYWlsQXRleHQoY29kZTQpOwogIH0KICBmdW5jdGlvbiBzY2hlbWVPckVtYWlsQXRleHQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDMgfHwgY29kZTQgPT09IDQ1IHx8IGNvZGU0ID09PSA0NiB8fCBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCkpIHsKICAgICAgc2l6ZSA9IDE7CiAgICAgIHJldHVybiBzY2hlbWVJbnNpZGVPckVtYWlsQXRleHQoY29kZTQpOwogICAgfQogICAgcmV0dXJuIGVtYWlsQXRleHQoY29kZTQpOwogIH0KICBmdW5jdGlvbiBzY2hlbWVJbnNpZGVPckVtYWlsQXRleHQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNTgpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgc2l6ZSA9IDA7CiAgICAgIHJldHVybiB1cmxJbnNpZGU7CiAgICB9CiAgICBpZiAoKGNvZGU0ID09PSA0MyB8fCBjb2RlNCA9PT0gNDUgfHwgY29kZTQgPT09IDQ2IHx8IGFzY2lpQWxwaGFudW1lcmljKGNvZGU0KSkgJiYgc2l6ZSsrIDwgMzIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHNjaGVtZUluc2lkZU9yRW1haWxBdGV4dDsKICAgIH0KICAgIHNpemUgPSAwOwogICAgcmV0dXJuIGVtYWlsQXRleHQoY29kZTQpOwogIH0KICBmdW5jdGlvbiB1cmxJbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNjIpIHsKICAgICAgZWZmZWN0cy5leGl0KCJhdXRvbGlua1Byb3RvY29sIik7CiAgICAgIGVmZmVjdHMuZW50ZXIoImF1dG9saW5rTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiYXV0b2xpbmtNYXJrZXIiKTsKICAgICAgZWZmZWN0cy5leGl0KCJhdXRvbGluayIpOwogICAgICByZXR1cm4gb2szOwogICAgfQogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSAzMiB8fCBjb2RlNCA9PT0gNjAgfHwgYXNjaWlDb250cm9sKGNvZGU0KSkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gdXJsSW5zaWRlOwogIH0KICBmdW5jdGlvbiBlbWFpbEF0ZXh0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDY0KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBlbWFpbEF0U2lnbk9yRG90OwogICAgfQogICAgaWYgKGFzY2lpQXRleHQoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBlbWFpbEF0ZXh0OwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGVtYWlsQXRTaWduT3JEb3QoY29kZTQpIHsKICAgIHJldHVybiBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCkgPyBlbWFpbExhYmVsKGNvZGU0KSA6IG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGVtYWlsTGFiZWwoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDYpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgc2l6ZSA9IDA7CiAgICAgIHJldHVybiBlbWFpbEF0U2lnbk9yRG90OwogICAgfQogICAgaWYgKGNvZGU0ID09PSA2MikgewogICAgICBlZmZlY3RzLmV4aXQoImF1dG9saW5rUHJvdG9jb2wiKS50eXBlID0gImF1dG9saW5rRW1haWwiOwogICAgICBlZmZlY3RzLmVudGVyKCJhdXRvbGlua01hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImF1dG9saW5rTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiYXV0b2xpbmsiKTsKICAgICAgcmV0dXJuIG9rMzsKICAgIH0KICAgIHJldHVybiBlbWFpbFZhbHVlKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gZW1haWxWYWx1ZShjb2RlNCkgewogICAgaWYgKChjb2RlNCA9PT0gNDUgfHwgYXNjaWlBbHBoYW51bWVyaWMoY29kZTQpKSAmJiBzaXplKysgPCA2MykgewogICAgICBjb25zdCBuZXh0MiA9IGNvZGU0ID09PSA0NSA/IGVtYWlsVmFsdWUgOiBlbWFpbExhYmVsOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gbmV4dDI7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9Cn0KdmFyIGF1dG9saW5rOwp2YXIgaW5pdF9hdXRvbGluayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2F1dG9saW5rLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgICBhdXRvbGluayA9IHsKICAgICAgbmFtZTogImF1dG9saW5rIiwKICAgICAgdG9rZW5pemU6IHRva2VuaXplQXV0b2xpbmsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZmFjdG9yeS1zcGFjZUAyLjAuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWZhY3Rvcnktc3BhY2UvaW5kZXguanMKZnVuY3Rpb24gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIG9rMywgdHlwZTUsIG1heDMpIHsKICBjb25zdCBsaW1pdCA9IG1heDMgPyBtYXgzIC0gMSA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICBsZXQgc2l6ZSA9IDA7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5lbnRlcih0eXBlNSk7CiAgICAgIHJldHVybiBwcmVmaXg0KGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KICBmdW5jdGlvbiBwcmVmaXg0KGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkgJiYgc2l6ZSsrIDwgbGltaXQpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHByZWZpeDQ7CiAgICB9CiAgICBlZmZlY3RzLmV4aXQodHlwZTUpOwogICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgfQp9CnZhciBpbml0X21pY3JvbWFya19mYWN0b3J5X3NwYWNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWZhY3Rvcnktc3BhY2VAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1mYWN0b3J5LXNwYWNlL2luZGV4LmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9ibGFuay1saW5lLmpzCmZ1bmN0aW9uIHRva2VuaXplQmxhbmtMaW5lKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICByZXR1cm4gbWFya2Rvd25TcGFjZShjb2RlNCkgPyBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXIsICJsaW5lUHJlZml4IikoY29kZTQpIDogYWZ0ZXIoY29kZTQpOwogIH0KICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgcmV0dXJuIGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkgPyBvazMoY29kZTQpIDogbm9rKGNvZGU0KTsKICB9Cn0KdmFyIGJsYW5rTGluZTsKdmFyIGluaXRfYmxhbmtfbGluZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2JsYW5rLWxpbmUuanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9zcGFjZSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGJsYW5rTGluZSA9IHsKICAgICAgcGFydGlhbDogdHJ1ZSwKICAgICAgdG9rZW5pemU6IHRva2VuaXplQmxhbmtMaW5lCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvYmxvY2stcXVvdGUuanMKZnVuY3Rpb24gdG9rZW5pemVCbG9ja1F1b3RlU3RhcnQoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIGNvbnN0IHN0YXRlMTAgPSBzZWxmMi5jb250YWluZXJTdGF0ZTsKICAgICAgaWYgKCFzdGF0ZTEwLm9wZW4pIHsKICAgICAgICBlZmZlY3RzLmVudGVyKCJibG9ja1F1b3RlIiwgewogICAgICAgICAgX2NvbnRhaW5lcjogdHJ1ZQogICAgICAgIH0pOwogICAgICAgIHN0YXRlMTAub3BlbiA9IHRydWU7CiAgICAgIH0KICAgICAgZWZmZWN0cy5lbnRlcigiYmxvY2tRdW90ZVByZWZpeCIpOwogICAgICBlZmZlY3RzLmVudGVyKCJibG9ja1F1b3RlTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiYmxvY2tRdW90ZU1hcmtlciIpOwogICAgICByZXR1cm4gYWZ0ZXI7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmVudGVyKCJibG9ja1F1b3RlUHJlZml4V2hpdGVzcGFjZSIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImJsb2NrUXVvdGVQcmVmaXhXaGl0ZXNwYWNlIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiYmxvY2tRdW90ZVByZWZpeCIpOwogICAgICByZXR1cm4gb2szOwogICAgfQogICAgZWZmZWN0cy5leGl0KCJibG9ja1F1b3RlUHJlZml4Iik7CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVCbG9ja1F1b3RlQ29udGludWF0aW9uKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHJldHVybiBjb250U3RhcnQ7CiAgZnVuY3Rpb24gY29udFN0YXJ0KGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBjb250QmVmb3JlLCAibGluZVByZWZpeCIsIHNlbGYyLnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmNsdWRlcygiY29kZUluZGVudGVkIikgPyB2b2lkIDAgOiA0KShjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gY29udEJlZm9yZShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbnRCZWZvcmUoY29kZTQpIHsKICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoYmxvY2tRdW90ZSwgb2szLCBub2spKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gZXhpdDIoZWZmZWN0cykgewogIGVmZmVjdHMuZXhpdCgiYmxvY2tRdW90ZSIpOwp9CnZhciBibG9ja1F1b3RlOwp2YXIgaW5pdF9ibG9ja19xdW90ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2Jsb2NrLXF1b3RlLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX2ZhY3Rvcnlfc3BhY2UoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgICBibG9ja1F1b3RlID0gewogICAgICBjb250aW51YXRpb246IHsKICAgICAgICB0b2tlbml6ZTogdG9rZW5pemVCbG9ja1F1b3RlQ29udGludWF0aW9uCiAgICAgIH0sCiAgICAgIGV4aXQ6IGV4aXQyLAogICAgICBuYW1lOiAiYmxvY2tRdW90ZSIsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZUJsb2NrUXVvdGVTdGFydAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2NoYXJhY3Rlci1lc2NhcGUuanMKZnVuY3Rpb24gdG9rZW5pemVDaGFyYWN0ZXJFc2NhcGUoZWZmZWN0cywgb2szLCBub2spIHsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlckVzY2FwZSIpOwogICAgZWZmZWN0cy5lbnRlcigiZXNjYXBlTWFya2VyIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJlc2NhcGVNYXJrZXIiKTsKICAgIHJldHVybiBpbnNpZGU7CiAgfQogIGZ1bmN0aW9uIGluc2lkZShjb2RlNCkgewogICAgaWYgKGFzY2lpUHVuY3R1YXRpb24oY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlckVzY2FwZVZhbHVlIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2hhcmFjdGVyRXNjYXBlVmFsdWUiKTsKICAgICAgZWZmZWN0cy5leGl0KCJjaGFyYWN0ZXJFc2NhcGUiKTsKICAgICAgcmV0dXJuIG9rMzsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KfQp2YXIgY2hhcmFjdGVyRXNjYXBlOwp2YXIgaW5pdF9jaGFyYWN0ZXJfZXNjYXBlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvY2hhcmFjdGVyLWVzY2FwZS5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogICAgY2hhcmFjdGVyRXNjYXBlID0gewogICAgICBuYW1lOiAiY2hhcmFjdGVyRXNjYXBlIiwKICAgICAgdG9rZW5pemU6IHRva2VuaXplQ2hhcmFjdGVyRXNjYXBlCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvY2hhcmFjdGVyLXJlZmVyZW5jZS5qcwpmdW5jdGlvbiB0b2tlbml6ZUNoYXJhY3RlclJlZmVyZW5jZShlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBsZXQgc2l6ZSA9IDA7CiAgbGV0IG1heDM7CiAgbGV0IHRlc3Q7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJjaGFyYWN0ZXJSZWZlcmVuY2UiKTsKICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlciIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgiY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyIik7CiAgICByZXR1cm4gb3BlbjsKICB9CiAgZnVuY3Rpb24gb3Blbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSAzNSkgewogICAgICBlZmZlY3RzLmVudGVyKCJjaGFyYWN0ZXJSZWZlcmVuY2VNYXJrZXJOdW1lcmljIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyTnVtZXJpYyIpOwogICAgICByZXR1cm4gbnVtZXJpYzsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlclJlZmVyZW5jZVZhbHVlIik7CiAgICBtYXgzID0gMzE7CiAgICB0ZXN0ID0gYXNjaWlBbHBoYW51bWVyaWM7CiAgICByZXR1cm4gdmFsdWUyKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gbnVtZXJpYyhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA4OCB8fCBjb2RlNCA9PT0gMTIwKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlckhleGFkZWNpbWFsIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VySGV4YWRlY2ltYWwiKTsKICAgICAgZWZmZWN0cy5lbnRlcigiY2hhcmFjdGVyUmVmZXJlbmNlVmFsdWUiKTsKICAgICAgbWF4MyA9IDY7CiAgICAgIHRlc3QgPSBhc2NpaUhleERpZ2l0OwogICAgICByZXR1cm4gdmFsdWUyOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigiY2hhcmFjdGVyUmVmZXJlbmNlVmFsdWUiKTsKICAgIG1heDMgPSA3OwogICAgdGVzdCA9IGFzY2lpRGlnaXQ7CiAgICByZXR1cm4gdmFsdWUyKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdmFsdWUyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDU5ICYmIHNpemUpIHsKICAgICAgY29uc3QgdG9rZW4gPSBlZmZlY3RzLmV4aXQoImNoYXJhY3RlclJlZmVyZW5jZVZhbHVlIik7CiAgICAgIGlmICh0ZXN0ID09PSBhc2NpaUFscGhhbnVtZXJpYyAmJiAhZGVjb2RlTmFtZWRDaGFyYWN0ZXJSZWZlcmVuY2Uoc2VsZjIuc2xpY2VTZXJpYWxpemUodG9rZW4pKSkgewogICAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgICB9CiAgICAgIGVmZmVjdHMuZW50ZXIoImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlciIpOwogICAgICBlZmZlY3RzLmV4aXQoImNoYXJhY3RlclJlZmVyZW5jZSIpOwogICAgICByZXR1cm4gb2szOwogICAgfQogICAgaWYgKHRlc3QoY29kZTQpICYmIHNpemUrKyA8IG1heDMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHZhbHVlMjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KfQp2YXIgY2hhcmFjdGVyUmVmZXJlbmNlOwp2YXIgaW5pdF9jaGFyYWN0ZXJfcmVmZXJlbmNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvY2hhcmFjdGVyLXJlZmVyZW5jZS5qcyIoKSB7CiAgICBpbml0X2luZGV4X2RvbSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGNoYXJhY3RlclJlZmVyZW5jZSA9IHsKICAgICAgbmFtZTogImNoYXJhY3RlclJlZmVyZW5jZSIsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZUNoYXJhY3RlclJlZmVyZW5jZQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2NvZGUtZmVuY2VkLmpzCmZ1bmN0aW9uIHRva2VuaXplQ29kZUZlbmNlZChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBjb25zdCBjbG9zZVN0YXJ0ID0gewogICAgcGFydGlhbDogdHJ1ZSwKICAgIHRva2VuaXplOiB0b2tlbml6ZUNsb3NlU3RhcnQKICB9OwogIGxldCBpbml0aWFsUHJlZml4ID0gMDsKICBsZXQgc2l6ZU9wZW4gPSAwOwogIGxldCBtYXJrZXI7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICByZXR1cm4gYmVmb3JlU2VxdWVuY2VPcGVuKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYmVmb3JlU2VxdWVuY2VPcGVuKGNvZGU0KSB7CiAgICBjb25zdCB0YWlsID0gc2VsZjIuZXZlbnRzW3NlbGYyLmV2ZW50cy5sZW5ndGggLSAxXTsKICAgIGluaXRpYWxQcmVmaXggPSB0YWlsICYmIHRhaWxbMV0udHlwZSA9PT0gImxpbmVQcmVmaXgiID8gdGFpbFsyXS5zbGljZVNlcmlhbGl6ZSh0YWlsWzFdLCB0cnVlKS5sZW5ndGggOiAwOwogICAgbWFya2VyID0gY29kZTQ7CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlRmVuY2VkIik7CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlRmVuY2VkRmVuY2UiKTsKICAgIGVmZmVjdHMuZW50ZXIoImNvZGVGZW5jZWRGZW5jZVNlcXVlbmNlIik7CiAgICByZXR1cm4gc2VxdWVuY2VPcGVuKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gc2VxdWVuY2VPcGVuKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG1hcmtlcikgewogICAgICBzaXplT3BlbisrOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gc2VxdWVuY2VPcGVuOwogICAgfQogICAgaWYgKHNpemVPcGVuIDwgMykgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZXhpdCgiY29kZUZlbmNlZEZlbmNlU2VxdWVuY2UiKTsKICAgIHJldHVybiBtYXJrZG93blNwYWNlKGNvZGU0KSA/IGZhY3RvcnlTcGFjZShlZmZlY3RzLCBpbmZvQmVmb3JlLCAid2hpdGVzcGFjZSIpKGNvZGU0KSA6IGluZm9CZWZvcmUoY29kZTQpOwogIH0KICBmdW5jdGlvbiBpbmZvQmVmb3JlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImNvZGVGZW5jZWRGZW5jZSIpOwogICAgICByZXR1cm4gc2VsZjIuaW50ZXJydXB0ID8gb2szKGNvZGU0KSA6IGVmZmVjdHMuY2hlY2sobm9uTGF6eUNvbnRpbnVhdGlvbiwgYXROb25MYXp5QnJlYWssIGFmdGVyKShjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlRmVuY2VkRmVuY2VJbmZvIik7CiAgICBlZmZlY3RzLmVudGVyKCJjaHVua1N0cmluZyIsIHsKICAgICAgY29udGVudFR5cGU6ICJzdHJpbmciCiAgICB9KTsKICAgIHJldHVybiBpbmZvKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gaW5mbyhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJjaHVua1N0cmluZyIpOwogICAgICBlZmZlY3RzLmV4aXQoImNvZGVGZW5jZWRGZW5jZUluZm8iKTsKICAgICAgcmV0dXJuIGluZm9CZWZvcmUoY29kZTQpOwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2h1bmtTdHJpbmciKTsKICAgICAgZWZmZWN0cy5leGl0KCJjb2RlRmVuY2VkRmVuY2VJbmZvIik7CiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgbWV0YUJlZm9yZSwgIndoaXRlc3BhY2UiKShjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDk2ICYmIGNvZGU0ID09PSBtYXJrZXIpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGluZm87CiAgfQogIGZ1bmN0aW9uIG1ldGFCZWZvcmUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBpbmZvQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImNvZGVGZW5jZWRGZW5jZU1ldGEiKTsKICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIiwgewogICAgICBjb250ZW50VHlwZTogInN0cmluZyIKICAgIH0pOwogICAgcmV0dXJuIG1ldGEoY29kZTQpOwogIH0KICBmdW5jdGlvbiBtZXRhKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rU3RyaW5nIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiY29kZUZlbmNlZEZlbmNlTWV0YSIpOwogICAgICByZXR1cm4gaW5mb0JlZm9yZShjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDk2ICYmIGNvZGU0ID09PSBtYXJrZXIpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIG1ldGE7CiAgfQogIGZ1bmN0aW9uIGF0Tm9uTGF6eUJyZWFrKGNvZGU0KSB7CiAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KGNsb3NlU3RhcnQsIGFmdGVyLCBjb250ZW50QmVmb3JlKShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbnRlbnRCZWZvcmUoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgIHJldHVybiBjb250ZW50U3RhcnQ7CiAgfQogIGZ1bmN0aW9uIGNvbnRlbnRTdGFydChjb2RlNCkgewogICAgcmV0dXJuIGluaXRpYWxQcmVmaXggPiAwICYmIG1hcmtkb3duU3BhY2UoY29kZTQpID8gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGJlZm9yZUNvbnRlbnRDaHVuaywgImxpbmVQcmVmaXgiLCBpbml0aWFsUHJlZml4ICsgMSkoY29kZTQpIDogYmVmb3JlQ29udGVudENodW5rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYmVmb3JlQ29udGVudENodW5rKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhub25MYXp5Q29udGludWF0aW9uLCBhdE5vbkxhenlCcmVhaywgYWZ0ZXIpKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImNvZGVGbG93VmFsdWUiKTsKICAgIHJldHVybiBjb250ZW50Q2h1bmsoY29kZTQpOwogIH0KICBmdW5jdGlvbiBjb250ZW50Q2h1bmsoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY29kZUZsb3dWYWx1ZSIpOwogICAgICByZXR1cm4gYmVmb3JlQ29udGVudENodW5rKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29udGVudENodW5rOwogIH0KICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgZWZmZWN0cy5leGl0KCJjb2RlRmVuY2VkIik7CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdG9rZW5pemVDbG9zZVN0YXJ0KGVmZmVjdHMyLCBvazQsIG5vazIpIHsKICAgIGxldCBzaXplID0gMDsKICAgIHJldHVybiBzdGFydEJlZm9yZTsKICAgIGZ1bmN0aW9uIHN0YXJ0QmVmb3JlKGNvZGU0KSB7CiAgICAgIGVmZmVjdHMyLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICAgIGVmZmVjdHMyLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzMi5leGl0KCJsaW5lRW5kaW5nIik7CiAgICAgIHJldHVybiBzdGFydDI7CiAgICB9CiAgICBmdW5jdGlvbiBzdGFydDIoY29kZTQpIHsKICAgICAgZWZmZWN0czIuZW50ZXIoImNvZGVGZW5jZWRGZW5jZSIpOwogICAgICByZXR1cm4gbWFya2Rvd25TcGFjZShjb2RlNCkgPyBmYWN0b3J5U3BhY2UoZWZmZWN0czIsIGJlZm9yZVNlcXVlbmNlQ2xvc2UsICJsaW5lUHJlZml4Iiwgc2VsZjIucGFyc2VyLmNvbnN0cnVjdHMuZGlzYWJsZS5udWxsLmluY2x1ZGVzKCJjb2RlSW5kZW50ZWQiKSA/IHZvaWQgMCA6IDQpKGNvZGU0KSA6IGJlZm9yZVNlcXVlbmNlQ2xvc2UoY29kZTQpOwogICAgfQogICAgZnVuY3Rpb24gYmVmb3JlU2VxdWVuY2VDbG9zZShjb2RlNCkgewogICAgICBpZiAoY29kZTQgPT09IG1hcmtlcikgewogICAgICAgIGVmZmVjdHMyLmVudGVyKCJjb2RlRmVuY2VkRmVuY2VTZXF1ZW5jZSIpOwogICAgICAgIHJldHVybiBzZXF1ZW5jZUNsb3NlKGNvZGU0KTsKICAgICAgfQogICAgICByZXR1cm4gbm9rMihjb2RlNCk7CiAgICB9CiAgICBmdW5jdGlvbiBzZXF1ZW5jZUNsb3NlKGNvZGU0KSB7CiAgICAgIGlmIChjb2RlNCA9PT0gbWFya2VyKSB7CiAgICAgICAgc2l6ZSsrOwogICAgICAgIGVmZmVjdHMyLmNvbnN1bWUoY29kZTQpOwogICAgICAgIHJldHVybiBzZXF1ZW5jZUNsb3NlOwogICAgICB9CiAgICAgIGlmIChzaXplID49IHNpemVPcGVuKSB7CiAgICAgICAgZWZmZWN0czIuZXhpdCgiY29kZUZlbmNlZEZlbmNlU2VxdWVuY2UiKTsKICAgICAgICByZXR1cm4gbWFya2Rvd25TcGFjZShjb2RlNCkgPyBmYWN0b3J5U3BhY2UoZWZmZWN0czIsIHNlcXVlbmNlQ2xvc2VBZnRlciwgIndoaXRlc3BhY2UiKShjb2RlNCkgOiBzZXF1ZW5jZUNsb3NlQWZ0ZXIoY29kZTQpOwogICAgICB9CiAgICAgIHJldHVybiBub2syKGNvZGU0KTsKICAgIH0KICAgIGZ1bmN0aW9uIHNlcXVlbmNlQ2xvc2VBZnRlcihjb2RlNCkgewogICAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICAgIGVmZmVjdHMyLmV4aXQoImNvZGVGZW5jZWRGZW5jZSIpOwogICAgICAgIHJldHVybiBvazQoY29kZTQpOwogICAgICB9CiAgICAgIHJldHVybiBub2syKGNvZGU0KTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVOb25MYXp5Q29udGludWF0aW9uKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZyIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgcmV0dXJuIGxpbmVTdGFydDsKICB9CiAgZnVuY3Rpb24gbGluZVN0YXJ0KGNvZGU0KSB7CiAgICByZXR1cm4gc2VsZjIucGFyc2VyLmxhenlbc2VsZjIubm93KCkubGluZV0gPyBub2soY29kZTQpIDogb2szKGNvZGU0KTsKICB9Cn0KdmFyIG5vbkxhenlDb250aW51YXRpb24sIGNvZGVGZW5jZWQ7CnZhciBpbml0X2NvZGVfZmVuY2VkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvY29kZS1mZW5jZWQuanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9zcGFjZSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIG5vbkxhenlDb250aW51YXRpb24gPSB7CiAgICAgIHBhcnRpYWw6IHRydWUsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZU5vbkxhenlDb250aW51YXRpb24KICAgIH07CiAgICBjb2RlRmVuY2VkID0gewogICAgICBjb25jcmV0ZTogdHJ1ZSwKICAgICAgbmFtZTogImNvZGVGZW5jZWQiLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVDb2RlRmVuY2VkCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvY29kZS1pbmRlbnRlZC5qcwpmdW5jdGlvbiB0b2tlbml6ZUNvZGVJbmRlbnRlZChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImNvZGVJbmRlbnRlZCIpOwogICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlclByZWZpeCwgImxpbmVQcmVmaXgiLCA0ICsgMSkoY29kZTQpOwogIH0KICBmdW5jdGlvbiBhZnRlclByZWZpeChjb2RlNCkgewogICAgY29uc3QgdGFpbCA9IHNlbGYyLmV2ZW50c1tzZWxmMi5ldmVudHMubGVuZ3RoIC0gMV07CiAgICByZXR1cm4gdGFpbCAmJiB0YWlsWzFdLnR5cGUgPT09ICJsaW5lUHJlZml4IiAmJiB0YWlsWzJdLnNsaWNlU2VyaWFsaXplKHRhaWxbMV0sIHRydWUpLmxlbmd0aCA+PSA0ID8gYXRCcmVhayhjb2RlNCkgOiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBhdEJyZWFrKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIGFmdGVyKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoZnVydGhlclN0YXJ0LCBhdEJyZWFrLCBhZnRlcikoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigiY29kZUZsb3dWYWx1ZSIpOwogICAgcmV0dXJuIGluc2lkZShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJjb2RlRmxvd1ZhbHVlIik7CiAgICAgIHJldHVybiBhdEJyZWFrKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gaW5zaWRlOwogIH0KICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgZWZmZWN0cy5leGl0KCJjb2RlSW5kZW50ZWQiKTsKICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KfQpmdW5jdGlvbiB0b2tlbml6ZUZ1cnRoZXJTdGFydChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICByZXR1cm4gZnVydGhlclN0YXJ0MjsKICBmdW5jdGlvbiBmdXJ0aGVyU3RhcnQyKGNvZGU0KSB7CiAgICBpZiAoc2VsZjIucGFyc2VyLmxhenlbc2VsZjIubm93KCkubGluZV0pIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgICByZXR1cm4gZnVydGhlclN0YXJ0MjsKICAgIH0KICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXJQcmVmaXgsICJsaW5lUHJlZml4IiwgNCArIDEpKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYWZ0ZXJQcmVmaXgoY29kZTQpIHsKICAgIGNvbnN0IHRhaWwgPSBzZWxmMi5ldmVudHNbc2VsZjIuZXZlbnRzLmxlbmd0aCAtIDFdOwogICAgcmV0dXJuIHRhaWwgJiYgdGFpbFsxXS50eXBlID09PSAibGluZVByZWZpeCIgJiYgdGFpbFsyXS5zbGljZVNlcmlhbGl6ZSh0YWlsWzFdLCB0cnVlKS5sZW5ndGggPj0gNCA/IG9rMyhjb2RlNCkgOiBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpID8gZnVydGhlclN0YXJ0Mihjb2RlNCkgOiBub2soY29kZTQpOwogIH0KfQp2YXIgY29kZUluZGVudGVkLCBmdXJ0aGVyU3RhcnQ7CnZhciBpbml0X2NvZGVfaW5kZW50ZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9jb2RlLWluZGVudGVkLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX2ZhY3Rvcnlfc3BhY2UoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgICBjb2RlSW5kZW50ZWQgPSB7CiAgICAgIG5hbWU6ICJjb2RlSW5kZW50ZWQiLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVDb2RlSW5kZW50ZWQKICAgIH07CiAgICBmdXJ0aGVyU3RhcnQgPSB7CiAgICAgIHBhcnRpYWw6IHRydWUsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZUZ1cnRoZXJTdGFydAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2NvZGUtdGV4dC5qcwpmdW5jdGlvbiByZXNvbHZlQ29kZVRleHQoZXZlbnRzKSB7CiAgbGV0IHRhaWxFeGl0SW5kZXggPSBldmVudHMubGVuZ3RoIC0gNDsKICBsZXQgaGVhZEVudGVySW5kZXggPSAzOwogIGxldCBpbmRleDI7CiAgbGV0IGVudGVyOwogIGlmICgoZXZlbnRzW2hlYWRFbnRlckluZGV4XVsxXS50eXBlID09PSAibGluZUVuZGluZyIgfHwgZXZlbnRzW2hlYWRFbnRlckluZGV4XVsxXS50eXBlID09PSAic3BhY2UiKSAmJiAoZXZlbnRzW3RhaWxFeGl0SW5kZXhdWzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nIiB8fCBldmVudHNbdGFpbEV4aXRJbmRleF1bMV0udHlwZSA9PT0gInNwYWNlIikpIHsKICAgIGluZGV4MiA9IGhlYWRFbnRlckluZGV4OwogICAgd2hpbGUgKCsraW5kZXgyIDwgdGFpbEV4aXRJbmRleCkgewogICAgICBpZiAoZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImNvZGVUZXh0RGF0YSIpIHsKICAgICAgICBldmVudHNbaGVhZEVudGVySW5kZXhdWzFdLnR5cGUgPSAiY29kZVRleHRQYWRkaW5nIjsKICAgICAgICBldmVudHNbdGFpbEV4aXRJbmRleF1bMV0udHlwZSA9ICJjb2RlVGV4dFBhZGRpbmciOwogICAgICAgIGhlYWRFbnRlckluZGV4ICs9IDI7CiAgICAgICAgdGFpbEV4aXRJbmRleCAtPSAyOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQogIGluZGV4MiA9IGhlYWRFbnRlckluZGV4IC0gMTsKICB0YWlsRXhpdEluZGV4Kys7CiAgd2hpbGUgKCsraW5kZXgyIDw9IHRhaWxFeGl0SW5kZXgpIHsKICAgIGlmIChlbnRlciA9PT0gdm9pZCAwKSB7CiAgICAgIGlmIChpbmRleDIgIT09IHRhaWxFeGl0SW5kZXggJiYgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSAhPT0gImxpbmVFbmRpbmciKSB7CiAgICAgICAgZW50ZXIgPSBpbmRleDI7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoaW5kZXgyID09PSB0YWlsRXhpdEluZGV4IHx8IGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nIikgewogICAgICBldmVudHNbZW50ZXJdWzFdLnR5cGUgPSAiY29kZVRleHREYXRhIjsKICAgICAgaWYgKGluZGV4MiAhPT0gZW50ZXIgKyAyKSB7CiAgICAgICAgZXZlbnRzW2VudGVyXVsxXS5lbmQgPSBldmVudHNbaW5kZXgyIC0gMV1bMV0uZW5kOwogICAgICAgIGV2ZW50cy5zcGxpY2UoZW50ZXIgKyAyLCBpbmRleDIgLSBlbnRlciAtIDIpOwogICAgICAgIHRhaWxFeGl0SW5kZXggLT0gaW5kZXgyIC0gZW50ZXIgLSAyOwogICAgICAgIGluZGV4MiA9IGVudGVyICsgMjsKICAgICAgfQogICAgICBlbnRlciA9IHZvaWQgMDsKICAgIH0KICB9CiAgcmV0dXJuIGV2ZW50czsKfQpmdW5jdGlvbiBwcmV2aW91czIoY29kZTQpIHsKICByZXR1cm4gY29kZTQgIT09IDk2IHx8IHRoaXMuZXZlbnRzW3RoaXMuZXZlbnRzLmxlbmd0aCAtIDFdWzFdLnR5cGUgPT09ICJjaGFyYWN0ZXJFc2NhcGUiOwp9CmZ1bmN0aW9uIHRva2VuaXplQ29kZVRleHQoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IHNpemVPcGVuID0gMDsKICBsZXQgc2l6ZTsKICBsZXQgdG9rZW47CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlVGV4dCIpOwogICAgZWZmZWN0cy5lbnRlcigiY29kZVRleHRTZXF1ZW5jZSIpOwogICAgcmV0dXJuIHNlcXVlbmNlT3Blbihjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHNlcXVlbmNlT3Blbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA5NikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBzaXplT3BlbisrOwogICAgICByZXR1cm4gc2VxdWVuY2VPcGVuOwogICAgfQogICAgZWZmZWN0cy5leGl0KCJjb2RlVGV4dFNlcXVlbmNlIik7CiAgICByZXR1cm4gYmV0d2VlbjIoY29kZTQpOwogIH0KICBmdW5jdGlvbiBiZXR3ZWVuMihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSAzMikgewogICAgICBlZmZlY3RzLmVudGVyKCJzcGFjZSIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInNwYWNlIik7CiAgICAgIHJldHVybiBiZXR3ZWVuMjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gOTYpIHsKICAgICAgdG9rZW4gPSBlZmZlY3RzLmVudGVyKCJjb2RlVGV4dFNlcXVlbmNlIik7CiAgICAgIHNpemUgPSAwOwogICAgICByZXR1cm4gc2VxdWVuY2VDbG9zZShjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgICByZXR1cm4gYmV0d2VlbjI7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJjb2RlVGV4dERhdGEiKTsKICAgIHJldHVybiBkYXRhKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gZGF0YShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSAzMiB8fCBjb2RlNCA9PT0gOTYgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImNvZGVUZXh0RGF0YSIpOwogICAgICByZXR1cm4gYmV0d2VlbjIoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBkYXRhOwogIH0KICBmdW5jdGlvbiBzZXF1ZW5jZUNsb3NlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDk2KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHNpemUrKzsKICAgICAgcmV0dXJuIHNlcXVlbmNlQ2xvc2U7CiAgICB9CiAgICBpZiAoc2l6ZSA9PT0gc2l6ZU9wZW4pIHsKICAgICAgZWZmZWN0cy5leGl0KCJjb2RlVGV4dFNlcXVlbmNlIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiY29kZVRleHQiKTsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICB0b2tlbi50eXBlID0gImNvZGVUZXh0RGF0YSI7CiAgICByZXR1cm4gZGF0YShjb2RlNCk7CiAgfQp9CnZhciBjb2RlVGV4dDsKdmFyIGluaXRfY29kZV90ZXh0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvY29kZS10ZXh0LmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgICBjb2RlVGV4dCA9IHsKICAgICAgbmFtZTogImNvZGVUZXh0IiwKICAgICAgcHJldmlvdXM6IHByZXZpb3VzMiwKICAgICAgcmVzb2x2ZTogcmVzb2x2ZUNvZGVUZXh0LAogICAgICB0b2tlbml6ZTogdG9rZW5pemVDb2RlVGV4dAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLXN1YnRva2VuaXplQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1zdWJ0b2tlbml6ZS9saWIvc3BsaWNlLWJ1ZmZlci5qcwpmdW5jdGlvbiBjaHVua2VkUHVzaChsaXN0NSwgcmlnaHQpIHsKICBsZXQgY2h1bmtTdGFydCA9IDA7CiAgaWYgKHJpZ2h0Lmxlbmd0aCA8IDFlNCkgewogICAgbGlzdDUucHVzaCguLi5yaWdodCk7CiAgfSBlbHNlIHsKICAgIHdoaWxlIChjaHVua1N0YXJ0IDwgcmlnaHQubGVuZ3RoKSB7CiAgICAgIGxpc3Q1LnB1c2goLi4ucmlnaHQuc2xpY2UoY2h1bmtTdGFydCwgY2h1bmtTdGFydCArIDFlNCkpOwogICAgICBjaHVua1N0YXJ0ICs9IDFlNDsKICAgIH0KICB9Cn0KdmFyIFNwbGljZUJ1ZmZlcjsKdmFyIGluaXRfc3BsaWNlX2J1ZmZlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLXN1YnRva2VuaXplQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1zdWJ0b2tlbml6ZS9saWIvc3BsaWNlLWJ1ZmZlci5qcyIoKSB7CiAgICBTcGxpY2VCdWZmZXIgPSBjbGFzcyB7CiAgICAgIC8qKgogICAgICAgKiBAcGFyYW0ge1JlYWRvbmx5QXJyYXk8VD4gfCBudWxsIHwgdW5kZWZpbmVkfSBbaW5pdGlhbF0KICAgICAgICogICBJbml0aWFsIGl0ZW1zIChvcHRpb25hbCkuCiAgICAgICAqIEByZXR1cm5zCiAgICAgICAqICAgU3BsaWNlIGJ1ZmZlci4KICAgICAgICovCiAgICAgIGNvbnN0cnVjdG9yKGluaXRpYWwyKSB7CiAgICAgICAgdGhpcy5sZWZ0ID0gaW5pdGlhbDIgPyBbLi4uaW5pdGlhbDJdIDogW107CiAgICAgICAgdGhpcy5yaWdodCA9IFtdOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBBcnJheSBhY2Nlc3M7CiAgICAgICAqIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvci4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4CiAgICAgICAqICAgSW5kZXguCiAgICAgICAqIEByZXR1cm4ge1R9CiAgICAgICAqICAgSXRlbS4KICAgICAgICovCiAgICAgIGdldChpbmRleDIpIHsKICAgICAgICBpZiAoaW5kZXgyIDwgMCB8fCBpbmRleDIgPj0gdGhpcy5sZWZ0Lmxlbmd0aCArIHRoaXMucmlnaHQubGVuZ3RoKSB7CiAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQ2Fubm90IGFjY2VzcyBpbmRleCBgIiArIGluZGV4MiArICJgIGluIGEgc3BsaWNlIGJ1ZmZlciBvZiBzaXplIGAiICsgKHRoaXMubGVmdC5sZW5ndGggKyB0aGlzLnJpZ2h0Lmxlbmd0aCkgKyAiYCIpOwogICAgICAgIH0KICAgICAgICBpZiAoaW5kZXgyIDwgdGhpcy5sZWZ0Lmxlbmd0aCkgcmV0dXJuIHRoaXMubGVmdFtpbmRleDJdOwogICAgICAgIHJldHVybiB0aGlzLnJpZ2h0W3RoaXMucmlnaHQubGVuZ3RoIC0gaW5kZXgyICsgdGhpcy5sZWZ0Lmxlbmd0aCAtIDFdOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBzcGxpY2UgYnVmZmVyLCBvbmUgZ3JlYXRlciB0aGFuIHRoZSBsYXJnZXN0IGluZGV4IGluIHRoZQogICAgICAgKiBhcnJheS4KICAgICAgICovCiAgICAgIGdldCBsZW5ndGgoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5sZW5ndGggKyB0aGlzLnJpZ2h0Lmxlbmd0aDsKICAgICAgfQogICAgICAvKioKICAgICAgICogUmVtb3ZlIGFuZCByZXR1cm4gYGxpc3RbMF1gOwogICAgICAgKiBtb3ZlcyB0aGUgY3Vyc29yIHRvIGAwYC4KICAgICAgICoKICAgICAgICogQHJldHVybnMge1QgfCB1bmRlZmluZWR9CiAgICAgICAqICAgSXRlbSwgb3B0aW9uYWwuCiAgICAgICAqLwogICAgICBzaGlmdCgpIHsKICAgICAgICB0aGlzLnNldEN1cnNvcigwKTsKICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5wb3AoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogU2xpY2UgdGhlIGJ1ZmZlciB0byBnZXQgYW4gYXJyYXk7CiAgICAgICAqIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvci4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0CiAgICAgICAqICAgU3RhcnQuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gW2VuZF0KICAgICAgICogICBFbmQgKG9wdGlvbmFsKS4KICAgICAgICogQHJldHVybnMge0FycmF5PFQ+fQogICAgICAgKiAgIEFycmF5IG9mIGl0ZW1zLgogICAgICAgKi8KICAgICAgc2xpY2Uoc3RhcnQsIGVuZDMpIHsKICAgICAgICBjb25zdCBzdG9wID0gZW5kMyA9PT0gbnVsbCB8fCBlbmQzID09PSB2b2lkIDAgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiBlbmQzOwogICAgICAgIGlmIChzdG9wIDwgdGhpcy5sZWZ0Lmxlbmd0aCkgewogICAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5zbGljZShzdGFydCwgc3RvcCk7CiAgICAgICAgfQogICAgICAgIGlmIChzdGFydCA+IHRoaXMubGVmdC5sZW5ndGgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LnNsaWNlKHRoaXMucmlnaHQubGVuZ3RoIC0gc3RvcCArIHRoaXMubGVmdC5sZW5ndGgsIHRoaXMucmlnaHQubGVuZ3RoIC0gc3RhcnQgKyB0aGlzLmxlZnQubGVuZ3RoKS5yZXZlcnNlKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmxlZnQuc2xpY2Uoc3RhcnQpLmNvbmNhdCh0aGlzLnJpZ2h0LnNsaWNlKHRoaXMucmlnaHQubGVuZ3RoIC0gc3RvcCArIHRoaXMubGVmdC5sZW5ndGgpLnJldmVyc2UoKSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIE1pbWljcyB0aGUgYmVoYXZpb3Igb2YgQXJyYXkucHJvdG90eXBlLnNwbGljZSgpIGV4Y2VwdCBmb3IgdGhlIGNoYW5nZSBvZgogICAgICAgKiBpbnRlcmZhY2UgbmVjZXNzYXJ5IHRvIGF2b2lkIHNlZ2ZhdWx0cyB3aGVuIHBhdGNoaW5nIGluIHZlcnkgbGFyZ2UgYXJyYXlzLgogICAgICAgKgogICAgICAgKiBUaGlzIG9wZXJhdGlvbiBtb3ZlcyBjdXJzb3IgaXMgbW92ZWQgdG8gYHN0YXJ0YCBhbmQgcmVzdWx0cyBpbiB0aGUgY3Vyc29yCiAgICAgICAqIHBsYWNlZCBhZnRlciBhbnkgaW5zZXJ0ZWQgaXRlbXMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydAogICAgICAgKiAgIFN0YXJ0OwogICAgICAgKiAgIHplcm8tYmFzZWQgaW5kZXggYXQgd2hpY2ggdG8gc3RhcnQgY2hhbmdpbmcgdGhlIGFycmF5OwogICAgICAgKiAgIG5lZ2F0aXZlIG51bWJlcnMgY291bnQgYmFja3dhcmRzIGZyb20gdGhlIGVuZCBvZiB0aGUgYXJyYXkgYW5kIHZhbHVlcwogICAgICAgKiAgIHRoYXQgYXJlIG91dC1vZiBib3VuZHMgYXJlIGNsYW1wZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGVuZCBvZiB0aGUgYXJyYXkuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gW2RlbGV0ZUNvdW50PTBdCiAgICAgICAqICAgRGVsZXRlIGNvdW50IChkZWZhdWx0OiBgMGApOwogICAgICAgKiAgIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRlbGV0ZSwgc3RhcnRpbmcgZnJvbSBzdGFydC4KICAgICAgICogQHBhcmFtIHtBcnJheTxUPiB8IG51bGwgfCB1bmRlZmluZWR9IFtpdGVtcz1bXV0KICAgICAgICogICBJdGVtcyB0byBpbmNsdWRlIGluIHBsYWNlIG9mIHRoZSBkZWxldGVkIGl0ZW1zIChkZWZhdWx0OiBgW11gKS4KICAgICAgICogQHJldHVybiB7QXJyYXk8VD59CiAgICAgICAqICAgQW55IHJlbW92ZWQgaXRlbXMuCiAgICAgICAqLwogICAgICBzcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50LCBpdGVtcykgewogICAgICAgIGNvbnN0IGNvdW50MiA9IGRlbGV0ZUNvdW50IHx8IDA7CiAgICAgICAgdGhpcy5zZXRDdXJzb3IoTWF0aC50cnVuYyhzdGFydCkpOwogICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJpZ2h0LnNwbGljZSh0aGlzLnJpZ2h0Lmxlbmd0aCAtIGNvdW50MiwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTsKICAgICAgICBpZiAoaXRlbXMpIGNodW5rZWRQdXNoKHRoaXMubGVmdCwgaXRlbXMpOwogICAgICAgIHJldHVybiByZW1vdmVkLnJldmVyc2UoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogUmVtb3ZlIGFuZCByZXR1cm4gdGhlIGhpZ2hlc3QtbnVtYmVyZWQgaXRlbSBpbiB0aGUgYXJyYXksIHNvCiAgICAgICAqIGBsaXN0W2xpc3QubGVuZ3RoIC0gMV1gOwogICAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIGBsZW5ndGhgLgogICAgICAgKgogICAgICAgKiBAcmV0dXJucyB7VCB8IHVuZGVmaW5lZH0KICAgICAgICogICBJdGVtLCBvcHRpb25hbC4KICAgICAgICovCiAgICAgIHBvcCgpIHsKICAgICAgICB0aGlzLnNldEN1cnNvcihOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpOwogICAgICAgIHJldHVybiB0aGlzLmxlZnQucG9wKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEluc2VydHMgYSBzaW5nbGUgaXRlbSB0byB0aGUgaGlnaC1udW1iZXJlZCBzaWRlIG9mIHRoZSBhcnJheTsKICAgICAgICogbW92ZXMgdGhlIGN1cnNvciB0byBgbGVuZ3RoYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtUfSBpdGVtCiAgICAgICAqICAgSXRlbS4KICAgICAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgICAgICogICBOb3RoaW5nLgogICAgICAgKi8KICAgICAgcHVzaChpdGVtKSB7CiAgICAgICAgdGhpcy5zZXRDdXJzb3IoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTsKICAgICAgICB0aGlzLmxlZnQucHVzaChpdGVtKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogSW5zZXJ0cyBtYW55IGl0ZW1zIHRvIHRoZSBoaWdoLW51bWJlcmVkIHNpZGUgb2YgdGhlIGFycmF5LgogICAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIGBsZW5ndGhgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0FycmF5PFQ+fSBpdGVtcwogICAgICAgKiAgIEl0ZW1zLgogICAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAgICAgKiAgIE5vdGhpbmcuCiAgICAgICAqLwogICAgICBwdXNoTWFueShpdGVtcykgewogICAgICAgIHRoaXMuc2V0Q3Vyc29yKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7CiAgICAgICAgY2h1bmtlZFB1c2godGhpcy5sZWZ0LCBpdGVtcyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEluc2VydHMgYSBzaW5nbGUgaXRlbSB0byB0aGUgbG93LW51bWJlcmVkIHNpZGUgb2YgdGhlIGFycmF5OwogICAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIGAwYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtUfSBpdGVtCiAgICAgICAqICAgSXRlbS4KICAgICAgICogQHJldHVybnMge3VuZGVmaW5lZH0KICAgICAgICogICBOb3RoaW5nLgogICAgICAgKi8KICAgICAgdW5zaGlmdChpdGVtKSB7CiAgICAgICAgdGhpcy5zZXRDdXJzb3IoMCk7CiAgICAgICAgdGhpcy5yaWdodC5wdXNoKGl0ZW0pOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJbnNlcnRzIG1hbnkgaXRlbXMgdG8gdGhlIGxvdy1udW1iZXJlZCBzaWRlIG9mIHRoZSBhcnJheTsKICAgICAgICogbW92ZXMgdGhlIGN1cnNvciB0byBgMGAuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7QXJyYXk8VD59IGl0ZW1zCiAgICAgICAqICAgSXRlbXMuCiAgICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CiAgICAgICAqICAgTm90aGluZy4KICAgICAgICovCiAgICAgIHVuc2hpZnRNYW55KGl0ZW1zKSB7CiAgICAgICAgdGhpcy5zZXRDdXJzb3IoMCk7CiAgICAgICAgY2h1bmtlZFB1c2godGhpcy5yaWdodCwgaXRlbXMucmV2ZXJzZSgpKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogTW92ZSB0aGUgY3Vyc29yIHRvIGEgc3BlY2lmaWMgcG9zaXRpb24gaW4gdGhlIGFycmF5LiBSZXF1aXJlcwogICAgICAgKiB0aW1lIHByb3BvcnRpb25hbCB0byB0aGUgZGlzdGFuY2UgbW92ZWQuCiAgICAgICAqCiAgICAgICAqIElmIGBuIDwgMGAsIHRoZSBjdXJzb3Igd2lsbCBlbmQgdXAgYXQgdGhlIGJlZ2lubmluZy4KICAgICAgICogSWYgYG4gPiBsZW5ndGhgLCB0aGUgY3Vyc29yIHdpbGwgZW5kIHVwIGF0IHRoZSBlbmQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuCiAgICAgICAqICAgUG9zaXRpb24uCiAgICAgICAqIEByZXR1cm4ge3VuZGVmaW5lZH0KICAgICAgICogICBOb3RoaW5nLgogICAgICAgKi8KICAgICAgc2V0Q3Vyc29yKG4xMykgewogICAgICAgIGlmIChuMTMgPT09IHRoaXMubGVmdC5sZW5ndGggfHwgbjEzID4gdGhpcy5sZWZ0Lmxlbmd0aCAmJiB0aGlzLnJpZ2h0Lmxlbmd0aCA9PT0gMCB8fCBuMTMgPCAwICYmIHRoaXMubGVmdC5sZW5ndGggPT09IDApIHJldHVybjsKICAgICAgICBpZiAobjEzIDwgdGhpcy5sZWZ0Lmxlbmd0aCkgewogICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMubGVmdC5zcGxpY2UobjEzLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpOwogICAgICAgICAgY2h1bmtlZFB1c2godGhpcy5yaWdodCwgcmVtb3ZlZC5yZXZlcnNlKCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yaWdodC5zcGxpY2UodGhpcy5sZWZ0Lmxlbmd0aCArIHRoaXMucmlnaHQubGVuZ3RoIC0gbjEzLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpOwogICAgICAgICAgY2h1bmtlZFB1c2godGhpcy5sZWZ0LCByZW1vdmVkLnJldmVyc2UoKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLXV0aWwtc3VidG9rZW5pemVAMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLXN1YnRva2VuaXplL2luZGV4LmpzCmZ1bmN0aW9uIHN1YnRva2VuaXplKGV2ZW50c0FycmF5KSB7CiAgY29uc3QganVtcHMgPSB7fTsKICBsZXQgaW5kZXgyID0gLTE7CiAgbGV0IGV2ZW50OwogIGxldCBsaW5lSW5kZXg7CiAgbGV0IG90aGVySW5kZXg7CiAgbGV0IG90aGVyRXZlbnQ7CiAgbGV0IHBhcmFtZXRlcnM7CiAgbGV0IHN1YmV2ZW50czsKICBsZXQgbW9yZTsKICBjb25zdCBldmVudHMgPSBuZXcgU3BsaWNlQnVmZmVyKGV2ZW50c0FycmF5KTsKICB3aGlsZSAoKytpbmRleDIgPCBldmVudHMubGVuZ3RoKSB7CiAgICB3aGlsZSAoaW5kZXgyIGluIGp1bXBzKSB7CiAgICAgIGluZGV4MiA9IGp1bXBzW2luZGV4Ml07CiAgICB9CiAgICBldmVudCA9IGV2ZW50cy5nZXQoaW5kZXgyKTsKICAgIGlmIChpbmRleDIgJiYgZXZlbnRbMV0udHlwZSA9PT0gImNodW5rRmxvdyIgJiYgZXZlbnRzLmdldChpbmRleDIgLSAxKVsxXS50eXBlID09PSAibGlzdEl0ZW1QcmVmaXgiKSB7CiAgICAgIHN1YmV2ZW50cyA9IGV2ZW50WzFdLl90b2tlbml6ZXIuZXZlbnRzOwogICAgICBvdGhlckluZGV4ID0gMDsKICAgICAgaWYgKG90aGVySW5kZXggPCBzdWJldmVudHMubGVuZ3RoICYmIHN1YmV2ZW50c1tvdGhlckluZGV4XVsxXS50eXBlID09PSAibGluZUVuZGluZ0JsYW5rIikgewogICAgICAgIG90aGVySW5kZXggKz0gMjsKICAgICAgfQogICAgICBpZiAob3RoZXJJbmRleCA8IHN1YmV2ZW50cy5sZW5ndGggJiYgc3ViZXZlbnRzW290aGVySW5kZXhdWzFdLnR5cGUgPT09ICJjb250ZW50IikgewogICAgICAgIHdoaWxlICgrK290aGVySW5kZXggPCBzdWJldmVudHMubGVuZ3RoKSB7CiAgICAgICAgICBpZiAoc3ViZXZlbnRzW290aGVySW5kZXhdWzFdLnR5cGUgPT09ICJjb250ZW50IikgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdWJldmVudHNbb3RoZXJJbmRleF1bMV0udHlwZSA9PT0gImNodW5rVGV4dCIpIHsKICAgICAgICAgICAgc3ViZXZlbnRzW290aGVySW5kZXhdWzFdLl9pc0luRmlyc3RDb250ZW50T2ZMaXN0SXRlbSA9IHRydWU7CiAgICAgICAgICAgIG90aGVySW5kZXgrKzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChldmVudFswXSA9PT0gImVudGVyIikgewogICAgICBpZiAoZXZlbnRbMV0uY29udGVudFR5cGUpIHsKICAgICAgICBPYmplY3QuYXNzaWduKGp1bXBzLCBzdWJjb250ZW50KGV2ZW50cywgaW5kZXgyKSk7CiAgICAgICAgaW5kZXgyID0ganVtcHNbaW5kZXgyXTsKICAgICAgICBtb3JlID0gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChldmVudFsxXS5fY29udGFpbmVyKSB7CiAgICAgIG90aGVySW5kZXggPSBpbmRleDI7CiAgICAgIGxpbmVJbmRleCA9IHZvaWQgMDsKICAgICAgd2hpbGUgKG90aGVySW5kZXgtLSkgewogICAgICAgIG90aGVyRXZlbnQgPSBldmVudHMuZ2V0KG90aGVySW5kZXgpOwogICAgICAgIGlmIChvdGhlckV2ZW50WzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nIiB8fCBvdGhlckV2ZW50WzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nQmxhbmsiKSB7CiAgICAgICAgICBpZiAob3RoZXJFdmVudFswXSA9PT0gImVudGVyIikgewogICAgICAgICAgICBpZiAobGluZUluZGV4KSB7CiAgICAgICAgICAgICAgZXZlbnRzLmdldChsaW5lSW5kZXgpWzFdLnR5cGUgPSAibGluZUVuZGluZ0JsYW5rIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdGhlckV2ZW50WzFdLnR5cGUgPSAibGluZUVuZGluZyI7CiAgICAgICAgICAgIGxpbmVJbmRleCA9IG90aGVySW5kZXg7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChvdGhlckV2ZW50WzFdLnR5cGUgPT09ICJsaW5lUHJlZml4IiB8fCBvdGhlckV2ZW50WzFdLnR5cGUgPT09ICJsaXN0SXRlbUluZGVudCIpIHsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChsaW5lSW5kZXgpIHsKICAgICAgICBldmVudFsxXS5lbmQgPSB7CiAgICAgICAgICAuLi5ldmVudHMuZ2V0KGxpbmVJbmRleClbMV0uc3RhcnQKICAgICAgICB9OwogICAgICAgIHBhcmFtZXRlcnMgPSBldmVudHMuc2xpY2UobGluZUluZGV4LCBpbmRleDIpOwogICAgICAgIHBhcmFtZXRlcnMudW5zaGlmdChldmVudCk7CiAgICAgICAgZXZlbnRzLnNwbGljZShsaW5lSW5kZXgsIGluZGV4MiAtIGxpbmVJbmRleCArIDEsIHBhcmFtZXRlcnMpOwogICAgICB9CiAgICB9CiAgfQogIHNwbGljZShldmVudHNBcnJheSwgMCwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBldmVudHMuc2xpY2UoMCkpOwogIHJldHVybiAhbW9yZTsKfQpmdW5jdGlvbiBzdWJjb250ZW50KGV2ZW50cywgZXZlbnRJbmRleCkgewogIGNvbnN0IHRva2VuID0gZXZlbnRzLmdldChldmVudEluZGV4KVsxXTsKICBjb25zdCBjb250ZXh0MiA9IGV2ZW50cy5nZXQoZXZlbnRJbmRleClbMl07CiAgbGV0IHN0YXJ0UG9zaXRpb24gPSBldmVudEluZGV4IC0gMTsKICBjb25zdCBzdGFydFBvc2l0aW9ucyA9IFtdOwogIGxldCB0b2tlbml6ZXIgPSB0b2tlbi5fdG9rZW5pemVyOwogIGlmICghdG9rZW5pemVyKSB7CiAgICB0b2tlbml6ZXIgPSBjb250ZXh0Mi5wYXJzZXJbdG9rZW4uY29udGVudFR5cGVdKHRva2VuLnN0YXJ0KTsKICAgIGlmICh0b2tlbi5fY29udGVudFR5cGVUZXh0VHJhaWxpbmcpIHsKICAgICAgdG9rZW5pemVyLl9jb250ZW50VHlwZVRleHRUcmFpbGluZyA9IHRydWU7CiAgICB9CiAgfQogIGNvbnN0IGNoaWxkRXZlbnRzID0gdG9rZW5pemVyLmV2ZW50czsKICBjb25zdCBqdW1wcyA9IFtdOwogIGNvbnN0IGdhcHMgPSB7fTsKICBsZXQgc3RyZWFtOwogIGxldCBwcmV2aW91czM7CiAgbGV0IGluZGV4MiA9IC0xOwogIGxldCBjdXJyZW50ID0gdG9rZW47CiAgbGV0IGFkanVzdCA9IDA7CiAgbGV0IHN0YXJ0ID0gMDsKICBjb25zdCBicmVha3MgPSBbc3RhcnRdOwogIHdoaWxlIChjdXJyZW50KSB7CiAgICB3aGlsZSAoZXZlbnRzLmdldCgrK3N0YXJ0UG9zaXRpb24pWzFdICE9PSBjdXJyZW50KSB7CiAgICB9CiAgICBzdGFydFBvc2l0aW9ucy5wdXNoKHN0YXJ0UG9zaXRpb24pOwogICAgaWYgKCFjdXJyZW50Ll90b2tlbml6ZXIpIHsKICAgICAgc3RyZWFtID0gY29udGV4dDIuc2xpY2VTdHJlYW0oY3VycmVudCk7CiAgICAgIGlmICghY3VycmVudC5uZXh0KSB7CiAgICAgICAgc3RyZWFtLnB1c2gobnVsbCk7CiAgICAgIH0KICAgICAgaWYgKHByZXZpb3VzMykgewogICAgICAgIHRva2VuaXplci5kZWZpbmVTa2lwKGN1cnJlbnQuc3RhcnQpOwogICAgICB9CiAgICAgIGlmIChjdXJyZW50Ll9pc0luRmlyc3RDb250ZW50T2ZMaXN0SXRlbSkgewogICAgICAgIHRva2VuaXplci5fZ2ZtVGFza2xpc3RGaXJzdENvbnRlbnRPZkxpc3RJdGVtID0gdHJ1ZTsKICAgICAgfQogICAgICB0b2tlbml6ZXIud3JpdGUoc3RyZWFtKTsKICAgICAgaWYgKGN1cnJlbnQuX2lzSW5GaXJzdENvbnRlbnRPZkxpc3RJdGVtKSB7CiAgICAgICAgdG9rZW5pemVyLl9nZm1UYXNrbGlzdEZpcnN0Q29udGVudE9mTGlzdEl0ZW0gPSB2b2lkIDA7CiAgICAgIH0KICAgIH0KICAgIHByZXZpb3VzMyA9IGN1cnJlbnQ7CiAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0OwogIH0KICBjdXJyZW50ID0gdG9rZW47CiAgd2hpbGUgKCsraW5kZXgyIDwgY2hpbGRFdmVudHMubGVuZ3RoKSB7CiAgICBpZiAoCiAgICAgIC8vIEZpbmQgYSB2b2lkIHRva2VuIHRoYXQgaW5jbHVkZXMgYSBicmVhay4KICAgICAgY2hpbGRFdmVudHNbaW5kZXgyXVswXSA9PT0gImV4aXQiICYmIGNoaWxkRXZlbnRzW2luZGV4MiAtIDFdWzBdID09PSAiZW50ZXIiICYmIGNoaWxkRXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gY2hpbGRFdmVudHNbaW5kZXgyIC0gMV1bMV0udHlwZSAmJiBjaGlsZEV2ZW50c1tpbmRleDJdWzFdLnN0YXJ0LmxpbmUgIT09IGNoaWxkRXZlbnRzW2luZGV4Ml1bMV0uZW5kLmxpbmUKICAgICkgewogICAgICBzdGFydCA9IGluZGV4MiArIDE7CiAgICAgIGJyZWFrcy5wdXNoKHN0YXJ0KTsKICAgICAgY3VycmVudC5fdG9rZW5pemVyID0gdm9pZCAwOwogICAgICBjdXJyZW50LnByZXZpb3VzID0gdm9pZCAwOwogICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0OwogICAgfQogIH0KICB0b2tlbml6ZXIuZXZlbnRzID0gW107CiAgaWYgKGN1cnJlbnQpIHsKICAgIGN1cnJlbnQuX3Rva2VuaXplciA9IHZvaWQgMDsKICAgIGN1cnJlbnQucHJldmlvdXMgPSB2b2lkIDA7CiAgfSBlbHNlIHsKICAgIGJyZWFrcy5wb3AoKTsKICB9CiAgaW5kZXgyID0gYnJlYWtzLmxlbmd0aDsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIGNvbnN0IHNsaWNlID0gY2hpbGRFdmVudHMuc2xpY2UoYnJlYWtzW2luZGV4Ml0sIGJyZWFrc1tpbmRleDIgKyAxXSk7CiAgICBjb25zdCBzdGFydDIgPSBzdGFydFBvc2l0aW9ucy5wb3AoKTsKICAgIGp1bXBzLnB1c2goW3N0YXJ0Miwgc3RhcnQyICsgc2xpY2UubGVuZ3RoIC0gMV0pOwogICAgZXZlbnRzLnNwbGljZShzdGFydDIsIDIsIHNsaWNlKTsKICB9CiAganVtcHMucmV2ZXJzZSgpOwogIGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IGp1bXBzLmxlbmd0aCkgewogICAgZ2Fwc1thZGp1c3QgKyBqdW1wc1tpbmRleDJdWzBdXSA9IGFkanVzdCArIGp1bXBzW2luZGV4Ml1bMV07CiAgICBhZGp1c3QgKz0ganVtcHNbaW5kZXgyXVsxXSAtIGp1bXBzW2luZGV4Ml1bMF0gLSAxOwogIH0KICByZXR1cm4gZ2FwczsKfQp2YXIgaW5pdF9taWNyb21hcmtfdXRpbF9zdWJ0b2tlbml6ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLXN1YnRva2VuaXplQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1zdWJ0b2tlbml6ZS9pbmRleC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NodW5rZWQoKTsKICAgIGluaXRfc3BsaWNlX2J1ZmZlcigpOwogICAgaW5pdF9zcGxpY2VfYnVmZmVyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9jb250ZW50LmpzCmZ1bmN0aW9uIHJlc29sdmVDb250ZW50KGV2ZW50cykgewogIHN1YnRva2VuaXplKGV2ZW50cyk7CiAgcmV0dXJuIGV2ZW50czsKfQpmdW5jdGlvbiB0b2tlbml6ZUNvbnRlbnQoZWZmZWN0cywgb2szKSB7CiAgbGV0IHByZXZpb3VzMzsKICByZXR1cm4gY2h1bmtTdGFydDsKICBmdW5jdGlvbiBjaHVua1N0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJjb250ZW50Iik7CiAgICBwcmV2aW91czMgPSBlZmZlY3RzLmVudGVyKCJjaHVua0NvbnRlbnQiLCB7CiAgICAgIGNvbnRlbnRUeXBlOiAiY29udGVudCIKICAgIH0pOwogICAgcmV0dXJuIGNodW5rSW5zaWRlKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY2h1bmtJbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gY29udGVudEVuZChjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhjb250aW51YXRpb25Db25zdHJ1Y3QsIGNvbnRlbnRDb250aW51ZSwgY29udGVudEVuZCkoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjaHVua0luc2lkZTsKICB9CiAgZnVuY3Rpb24gY29udGVudEVuZChjb2RlNCkgewogICAgZWZmZWN0cy5leGl0KCJjaHVua0NvbnRlbnQiKTsKICAgIGVmZmVjdHMuZXhpdCgiY29udGVudCIpOwogICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbnRlbnRDb250aW51ZShjb2RlNCkgewogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgiY2h1bmtDb250ZW50Iik7CiAgICBwcmV2aW91czMubmV4dCA9IGVmZmVjdHMuZW50ZXIoImNodW5rQ29udGVudCIsIHsKICAgICAgY29udGVudFR5cGU6ICJjb250ZW50IiwKICAgICAgcHJldmlvdXM6IHByZXZpb3VzMwogICAgfSk7CiAgICBwcmV2aW91czMgPSBwcmV2aW91czMubmV4dDsKICAgIHJldHVybiBjaHVua0luc2lkZTsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVDb250aW51YXRpb24oZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIHN0YXJ0TG9va2FoZWFkOwogIGZ1bmN0aW9uIHN0YXJ0TG9va2FoZWFkKGNvZGU0KSB7CiAgICBlZmZlY3RzLmV4aXQoImNodW5rQ29udGVudCIpOwogICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZyIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBwcmVmaXhlZCwgImxpbmVQcmVmaXgiKTsKICB9CiAgZnVuY3Rpb24gcHJlZml4ZWQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgY29uc3QgdGFpbCA9IHNlbGYyLmV2ZW50c1tzZWxmMi5ldmVudHMubGVuZ3RoIC0gMV07CiAgICBpZiAoIXNlbGYyLnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmNsdWRlcygiY29kZUluZGVudGVkIikgJiYgdGFpbCAmJiB0YWlsWzFdLnR5cGUgPT09ICJsaW5lUHJlZml4IiAmJiB0YWlsWzJdLnNsaWNlU2VyaWFsaXplKHRhaWxbMV0sIHRydWUpLmxlbmd0aCA+PSA0KSB7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgcmV0dXJuIGVmZmVjdHMuaW50ZXJydXB0KHNlbGYyLnBhcnNlci5jb25zdHJ1Y3RzLmZsb3csIG5vaywgb2szKShjb2RlNCk7CiAgfQp9CnZhciBjb250ZW50LCBjb250aW51YXRpb25Db25zdHJ1Y3Q7CnZhciBpbml0X2NvbnRlbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9jb250ZW50LmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX2ZhY3Rvcnlfc3BhY2UoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX3N1YnRva2VuaXplKCk7CiAgICBjb250ZW50ID0gewogICAgICByZXNvbHZlOiByZXNvbHZlQ29udGVudCwKICAgICAgdG9rZW5pemU6IHRva2VuaXplQ29udGVudAogICAgfTsKICAgIGNvbnRpbnVhdGlvbkNvbnN0cnVjdCA9IHsKICAgICAgcGFydGlhbDogdHJ1ZSwKICAgICAgdG9rZW5pemU6IHRva2VuaXplQ29udGludWF0aW9uCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWZhY3RvcnktZGVzdGluYXRpb25AMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1mYWN0b3J5LWRlc3RpbmF0aW9uL2luZGV4LmpzCmZ1bmN0aW9uIGZhY3RvcnlEZXN0aW5hdGlvbihlZmZlY3RzLCBvazMsIG5vaywgdHlwZTUsIGxpdGVyYWxUeXBlLCBsaXRlcmFsTWFya2VyVHlwZSwgcmF3VHlwZSwgc3RyaW5nVHlwZSwgbWF4MykgewogIGNvbnN0IGxpbWl0ID0gbWF4MyB8fCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgbGV0IGJhbGFuY2UgPSAwOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA2MCkgewogICAgICBlZmZlY3RzLmVudGVyKHR5cGU1KTsKICAgICAgZWZmZWN0cy5lbnRlcihsaXRlcmFsVHlwZSk7CiAgICAgIGVmZmVjdHMuZW50ZXIobGl0ZXJhbE1hcmtlclR5cGUpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQobGl0ZXJhbE1hcmtlclR5cGUpOwogICAgICByZXR1cm4gZW5jbG9zZWRCZWZvcmU7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDMyIHx8IGNvZGU0ID09PSA0MSB8fCBhc2NpaUNvbnRyb2woY29kZTQpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcih0eXBlNSk7CiAgICBlZmZlY3RzLmVudGVyKHJhd1R5cGUpOwogICAgZWZmZWN0cy5lbnRlcihzdHJpbmdUeXBlKTsKICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIiwgewogICAgICBjb250ZW50VHlwZTogInN0cmluZyIKICAgIH0pOwogICAgcmV0dXJuIHJhdzIoY29kZTQpOwogIH0KICBmdW5jdGlvbiBlbmNsb3NlZEJlZm9yZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA2MikgewogICAgICBlZmZlY3RzLmVudGVyKGxpdGVyYWxNYXJrZXJUeXBlKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KGxpdGVyYWxNYXJrZXJUeXBlKTsKICAgICAgZWZmZWN0cy5leGl0KGxpdGVyYWxUeXBlKTsKICAgICAgZWZmZWN0cy5leGl0KHR5cGU1KTsKICAgICAgcmV0dXJuIG9rMzsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoc3RyaW5nVHlwZSk7CiAgICBlZmZlY3RzLmVudGVyKCJjaHVua1N0cmluZyIsIHsKICAgICAgY29udGVudFR5cGU6ICJzdHJpbmciCiAgICB9KTsKICAgIHJldHVybiBlbmNsb3NlZChjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGVuY2xvc2VkKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiY2h1bmtTdHJpbmciKTsKICAgICAgZWZmZWN0cy5leGl0KHN0cmluZ1R5cGUpOwogICAgICByZXR1cm4gZW5jbG9zZWRCZWZvcmUoY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA2MCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb2RlNCA9PT0gOTIgPyBlbmNsb3NlZEVzY2FwZSA6IGVuY2xvc2VkOwogIH0KICBmdW5jdGlvbiBlbmNsb3NlZEVzY2FwZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA2MCB8fCBjb2RlNCA9PT0gNjIgfHwgY29kZTQgPT09IDkyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBlbmNsb3NlZDsKICAgIH0KICAgIHJldHVybiBlbmNsb3NlZChjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHJhdzIoY29kZTQpIHsKICAgIGlmICghYmFsYW5jZSAmJiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDQxIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSkgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rU3RyaW5nIik7CiAgICAgIGVmZmVjdHMuZXhpdChzdHJpbmdUeXBlKTsKICAgICAgZWZmZWN0cy5leGl0KHJhd1R5cGUpOwogICAgICBlZmZlY3RzLmV4aXQodHlwZTUpOwogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIGlmIChiYWxhbmNlIDwgbGltaXQgJiYgY29kZTQgPT09IDQwKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGJhbGFuY2UrKzsKICAgICAgcmV0dXJuIHJhdzI7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDQxKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGJhbGFuY2UtLTsKICAgICAgcmV0dXJuIHJhdzI7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDMyIHx8IGNvZGU0ID09PSA0MCB8fCBhc2NpaUNvbnRyb2woY29kZTQpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb2RlNCA9PT0gOTIgPyByYXdFc2NhcGUgOiByYXcyOwogIH0KICBmdW5jdGlvbiByYXdFc2NhcGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDAgfHwgY29kZTQgPT09IDQxIHx8IGNvZGU0ID09PSA5MikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gcmF3MjsKICAgIH0KICAgIHJldHVybiByYXcyKGNvZGU0KTsKICB9Cn0KdmFyIGluaXRfbWljcm9tYXJrX2ZhY3RvcnlfZGVzdGluYXRpb24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZmFjdG9yeS1kZXN0aW5hdGlvbkAyLjAuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWZhY3RvcnktZGVzdGluYXRpb24vaW5kZXguanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1mYWN0b3J5LWxhYmVsQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstZmFjdG9yeS1sYWJlbC9pbmRleC5qcwpmdW5jdGlvbiBmYWN0b3J5TGFiZWwoZWZmZWN0cywgb2szLCBub2ssIHR5cGU1LCBtYXJrZXJUeXBlLCBzdHJpbmdUeXBlKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGxldCBzaXplID0gMDsKICBsZXQgc2VlbjsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIodHlwZTUpOwogICAgZWZmZWN0cy5lbnRlcihtYXJrZXJUeXBlKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQobWFya2VyVHlwZSk7CiAgICBlZmZlY3RzLmVudGVyKHN0cmluZ1R5cGUpOwogICAgcmV0dXJuIGF0QnJlYWs7CiAgfQogIGZ1bmN0aW9uIGF0QnJlYWsoY29kZTQpIHsKICAgIGlmIChzaXplID4gOTk5IHx8IGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA5MSB8fCBjb2RlNCA9PT0gOTMgJiYgIXNlZW4gfHwgLy8gVG8gZG86IHJlbW92ZSBpbiB0aGUgZnV0dXJlIG9uY2Ugd2XigJl2ZSBzd2l0Y2hlZCBmcm9tCiAgICAvLyBgbWljcm9tYXJrLWV4dGVuc2lvbi1mb290bm90ZWAgdG8gYG1pY3JvbWFyay1leHRlbnNpb24tZ2ZtLWZvb3Rub3RlYCwKICAgIC8vIHdoaWNoIGRvZXNu4oCZdCBuZWVkIHRoaXMuCiAgICAvLyBIaWRkZW4gZm9vdG5vdGVzIGhvb2suCiAgICAvKiBjOCBpZ25vcmUgbmV4dCAzICovCiAgICBjb2RlNCA9PT0gOTQgJiYgIXNpemUgJiYgIl9oaWRkZW5Gb290bm90ZVN1cHBvcnQiIGluIHNlbGYyLnBhcnNlci5jb25zdHJ1Y3RzKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmV4aXQoc3RyaW5nVHlwZSk7CiAgICAgIGVmZmVjdHMuZW50ZXIobWFya2VyVHlwZSk7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdChtYXJrZXJUeXBlKTsKICAgICAgZWZmZWN0cy5leGl0KHR5cGU1KTsKICAgICAgcmV0dXJuIG9rMzsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICAgIHJldHVybiBhdEJyZWFrOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigiY2h1bmtTdHJpbmciLCB7CiAgICAgIGNvbnRlbnRUeXBlOiAic3RyaW5nIgogICAgfSk7CiAgICByZXR1cm4gbGFiZWxJbnNpZGUoY29kZTQpOwogIH0KICBmdW5jdGlvbiBsYWJlbEluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA5MSB8fCBjb2RlNCA9PT0gOTMgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSB8fCBzaXplKysgPiA5OTkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJjaHVua1N0cmluZyIpOwogICAgICByZXR1cm4gYXRCcmVhayhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgaWYgKCFzZWVuKSBzZWVuID0gIW1hcmtkb3duU3BhY2UoY29kZTQpOwogICAgcmV0dXJuIGNvZGU0ID09PSA5MiA/IGxhYmVsRXNjYXBlIDogbGFiZWxJbnNpZGU7CiAgfQogIGZ1bmN0aW9uIGxhYmVsRXNjYXBlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDkxIHx8IGNvZGU0ID09PSA5MiB8fCBjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgc2l6ZSsrOwogICAgICByZXR1cm4gbGFiZWxJbnNpZGU7CiAgICB9CiAgICByZXR1cm4gbGFiZWxJbnNpZGUoY29kZTQpOwogIH0KfQp2YXIgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9sYWJlbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1mYWN0b3J5LWxhYmVsQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstZmFjdG9yeS1sYWJlbC9pbmRleC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWZhY3RvcnktdGl0bGVAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1mYWN0b3J5LXRpdGxlL2luZGV4LmpzCmZ1bmN0aW9uIGZhY3RvcnlUaXRsZShlZmZlY3RzLCBvazMsIG5vaywgdHlwZTUsIG1hcmtlclR5cGUsIHN0cmluZ1R5cGUpIHsKICBsZXQgbWFya2VyOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSAzNCB8fCBjb2RlNCA9PT0gMzkgfHwgY29kZTQgPT09IDQwKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIodHlwZTUpOwogICAgICBlZmZlY3RzLmVudGVyKG1hcmtlclR5cGUpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQobWFya2VyVHlwZSk7CiAgICAgIG1hcmtlciA9IGNvZGU0ID09PSA0MCA/IDQxIDogY29kZTQ7CiAgICAgIHJldHVybiBiZWdpbjM7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYmVnaW4zKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG1hcmtlcikgewogICAgICBlZmZlY3RzLmVudGVyKG1hcmtlclR5cGUpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQobWFya2VyVHlwZSk7CiAgICAgIGVmZmVjdHMuZXhpdCh0eXBlNSk7CiAgICAgIHJldHVybiBvazM7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKHN0cmluZ1R5cGUpOwogICAgcmV0dXJuIGF0QnJlYWsoY29kZTQpOwogIH0KICBmdW5jdGlvbiBhdEJyZWFrKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG1hcmtlcikgewogICAgICBlZmZlY3RzLmV4aXQoc3RyaW5nVHlwZSk7CiAgICAgIHJldHVybiBiZWdpbjMobWFya2VyKTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYXRCcmVhaywgImxpbmVQcmVmaXgiKTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIiwgewogICAgICBjb250ZW50VHlwZTogInN0cmluZyIKICAgIH0pOwogICAgcmV0dXJuIGluc2lkZShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBtYXJrZXIgfHwgY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rU3RyaW5nIik7CiAgICAgIHJldHVybiBhdEJyZWFrKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29kZTQgPT09IDkyID8gZXNjYXBlIDogaW5zaWRlOwogIH0KICBmdW5jdGlvbiBlc2NhcGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbWFya2VyIHx8IGNvZGU0ID09PSA5MikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gaW5zaWRlOwogICAgfQogICAgcmV0dXJuIGluc2lkZShjb2RlNCk7CiAgfQp9CnZhciBpbml0X21pY3JvbWFya19mYWN0b3J5X3RpdGxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWZhY3RvcnktdGl0bGVAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1mYWN0b3J5LXRpdGxlL2luZGV4LmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX2ZhY3Rvcnlfc3BhY2UoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZmFjdG9yeS13aGl0ZXNwYWNlQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstZmFjdG9yeS13aGl0ZXNwYWNlL2luZGV4LmpzCmZ1bmN0aW9uIGZhY3RvcnlXaGl0ZXNwYWNlKGVmZmVjdHMsIG9rMykgewogIGxldCBzZWVuOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZyIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgICAgc2VlbiA9IHRydWU7CiAgICAgIHJldHVybiBzdGFydDsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIHN0YXJ0LCBzZWVuID8gImxpbmVQcmVmaXgiIDogImxpbmVTdWZmaXgiKShjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9Cn0KdmFyIGluaXRfbWljcm9tYXJrX2ZhY3Rvcnlfd2hpdGVzcGFjZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1mYWN0b3J5LXdoaXRlc3BhY2VAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1mYWN0b3J5LXdoaXRlc3BhY2UvaW5kZXguanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9zcGFjZSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2RlZmluaXRpb24uanMKZnVuY3Rpb24gdG9rZW5pemVEZWZpbml0aW9uKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGxldCBpZGVudGlmaWVyOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiZGVmaW5pdGlvbiIpOwogICAgcmV0dXJuIGJlZm9yZShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGJlZm9yZShjb2RlNCkgewogICAgcmV0dXJuIGZhY3RvcnlMYWJlbC5jYWxsKAogICAgICBzZWxmMiwKICAgICAgZWZmZWN0cywKICAgICAgbGFiZWxBZnRlciwKICAgICAgLy8gTm90ZTogd2UgZG9u4oCZdCBuZWVkIHRvIHJlc2V0IHRoZSB3YXkgYG1hcmtkb3duLXJzYCBkb2VzLgogICAgICBub2ssCiAgICAgICJkZWZpbml0aW9uTGFiZWwiLAogICAgICAiZGVmaW5pdGlvbkxhYmVsTWFya2VyIiwKICAgICAgImRlZmluaXRpb25MYWJlbFN0cmluZyIKICAgICkoY29kZTQpOwogIH0KICBmdW5jdGlvbiBsYWJlbEFmdGVyKGNvZGU0KSB7CiAgICBpZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcihzZWxmMi5zbGljZVNlcmlhbGl6ZShzZWxmMi5ldmVudHNbc2VsZjIuZXZlbnRzLmxlbmd0aCAtIDFdWzFdKS5zbGljZSgxLCAtMSkpOwogICAgaWYgKGNvZGU0ID09PSA1OCkgewogICAgICBlZmZlY3RzLmVudGVyKCJkZWZpbml0aW9uTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiZGVmaW5pdGlvbk1hcmtlciIpOwogICAgICByZXR1cm4gbWFya2VyQWZ0ZXI7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gbWFya2VyQWZ0ZXIoY29kZTQpIHsKICAgIHJldHVybiBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSA/IGZhY3RvcnlXaGl0ZXNwYWNlKGVmZmVjdHMsIGRlc3RpbmF0aW9uQmVmb3JlKShjb2RlNCkgOiBkZXN0aW5hdGlvbkJlZm9yZShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGRlc3RpbmF0aW9uQmVmb3JlKGNvZGU0KSB7CiAgICByZXR1cm4gZmFjdG9yeURlc3RpbmF0aW9uKAogICAgICBlZmZlY3RzLAogICAgICBkZXN0aW5hdGlvbkFmdGVyLAogICAgICAvLyBOb3RlOiB3ZSBkb27igJl0IG5lZWQgdG8gcmVzZXQgdGhlIHdheSBgbWFya2Rvd24tcnNgIGRvZXMuCiAgICAgIG5vaywKICAgICAgImRlZmluaXRpb25EZXN0aW5hdGlvbiIsCiAgICAgICJkZWZpbml0aW9uRGVzdGluYXRpb25MaXRlcmFsIiwKICAgICAgImRlZmluaXRpb25EZXN0aW5hdGlvbkxpdGVyYWxNYXJrZXIiLAogICAgICAiZGVmaW5pdGlvbkRlc3RpbmF0aW9uUmF3IiwKICAgICAgImRlZmluaXRpb25EZXN0aW5hdGlvblN0cmluZyIKICAgICkoY29kZTQpOwogIH0KICBmdW5jdGlvbiBkZXN0aW5hdGlvbkFmdGVyKGNvZGU0KSB7CiAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KHRpdGxlQmVmb3JlLCBhZnRlciwgYWZ0ZXIpKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgIHJldHVybiBtYXJrZG93blNwYWNlKGNvZGU0KSA/IGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlcldoaXRlc3BhY2UsICJ3aGl0ZXNwYWNlIikoY29kZTQpIDogYWZ0ZXJXaGl0ZXNwYWNlKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYWZ0ZXJXaGl0ZXNwYWNlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImRlZmluaXRpb24iKTsKICAgICAgc2VsZjIucGFyc2VyLmRlZmluZWQucHVzaChpZGVudGlmaWVyKTsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVUaXRsZUJlZm9yZShlZmZlY3RzLCBvazMsIG5vaykgewogIHJldHVybiB0aXRsZUJlZm9yZTI7CiAgZnVuY3Rpb24gdGl0bGVCZWZvcmUyKGNvZGU0KSB7CiAgICByZXR1cm4gbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkgPyBmYWN0b3J5V2hpdGVzcGFjZShlZmZlY3RzLCBiZWZvcmVNYXJrZXIpKGNvZGU0KSA6IG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGJlZm9yZU1hcmtlcihjb2RlNCkgewogICAgcmV0dXJuIGZhY3RvcnlUaXRsZShlZmZlY3RzLCB0aXRsZUFmdGVyLCBub2ssICJkZWZpbml0aW9uVGl0bGUiLCAiZGVmaW5pdGlvblRpdGxlTWFya2VyIiwgImRlZmluaXRpb25UaXRsZVN0cmluZyIpKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdGl0bGVBZnRlcihjb2RlNCkgewogICAgcmV0dXJuIG1hcmtkb3duU3BhY2UoY29kZTQpID8gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIHRpdGxlQWZ0ZXJPcHRpb25hbFdoaXRlc3BhY2UsICJ3aGl0ZXNwYWNlIikoY29kZTQpIDogdGl0bGVBZnRlck9wdGlvbmFsV2hpdGVzcGFjZShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHRpdGxlQWZ0ZXJPcHRpb25hbFdoaXRlc3BhY2UoY29kZTQpIHsKICAgIHJldHVybiBjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpID8gb2szKGNvZGU0KSA6IG5vayhjb2RlNCk7CiAgfQp9CnZhciBkZWZpbml0aW9uMiwgdGl0bGVCZWZvcmU7CnZhciBpbml0X2RlZmluaXRpb24yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvZGVmaW5pdGlvbi5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X2Rlc3RpbmF0aW9uKCk7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X2xhYmVsKCk7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X3NwYWNlKCk7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X3RpdGxlKCk7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X3doaXRlc3BhY2UoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX25vcm1hbGl6ZV9pZGVudGlmaWVyKCk7CiAgICBkZWZpbml0aW9uMiA9IHsKICAgICAgbmFtZTogImRlZmluaXRpb24iLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVEZWZpbml0aW9uCiAgICB9OwogICAgdGl0bGVCZWZvcmUgPSB7CiAgICAgIHBhcnRpYWw6IHRydWUsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZVRpdGxlQmVmb3JlCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvaGFyZC1icmVhay1lc2NhcGUuanMKZnVuY3Rpb24gdG9rZW5pemVIYXJkQnJlYWtFc2NhcGUoZWZmZWN0cywgb2szLCBub2spIHsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImhhcmRCcmVha0VzY2FwZSIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBhZnRlcjsKICB9CiAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZXhpdCgiaGFyZEJyZWFrRXNjYXBlIik7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQp9CnZhciBoYXJkQnJlYWtFc2NhcGU7CnZhciBpbml0X2hhcmRfYnJlYWtfZXNjYXBlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvaGFyZC1icmVhay1lc2NhcGUuanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGhhcmRCcmVha0VzY2FwZSA9IHsKICAgICAgbmFtZTogImhhcmRCcmVha0VzY2FwZSIsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZUhhcmRCcmVha0VzY2FwZQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2hlYWRpbmctYXR4LmpzCmZ1bmN0aW9uIHJlc29sdmVIZWFkaW5nQXR4KGV2ZW50cywgY29udGV4dDIpIHsKICBsZXQgY29udGVudEVuZCA9IGV2ZW50cy5sZW5ndGggLSAyOwogIGxldCBjb250ZW50U3RhcnQgPSAzOwogIGxldCBjb250ZW50MzsKICBsZXQgdGV4dDk7CiAgaWYgKGV2ZW50c1tjb250ZW50U3RhcnRdWzFdLnR5cGUgPT09ICJ3aGl0ZXNwYWNlIikgewogICAgY29udGVudFN0YXJ0ICs9IDI7CiAgfQogIGlmIChjb250ZW50RW5kIC0gMiA+IGNvbnRlbnRTdGFydCAmJiBldmVudHNbY29udGVudEVuZF1bMV0udHlwZSA9PT0gIndoaXRlc3BhY2UiKSB7CiAgICBjb250ZW50RW5kIC09IDI7CiAgfQogIGlmIChldmVudHNbY29udGVudEVuZF1bMV0udHlwZSA9PT0gImF0eEhlYWRpbmdTZXF1ZW5jZSIgJiYgKGNvbnRlbnRTdGFydCA9PT0gY29udGVudEVuZCAtIDEgfHwgY29udGVudEVuZCAtIDQgPiBjb250ZW50U3RhcnQgJiYgZXZlbnRzW2NvbnRlbnRFbmQgLSAyXVsxXS50eXBlID09PSAid2hpdGVzcGFjZSIpKSB7CiAgICBjb250ZW50RW5kIC09IGNvbnRlbnRTdGFydCArIDEgPT09IGNvbnRlbnRFbmQgPyAyIDogNDsKICB9CiAgaWYgKGNvbnRlbnRFbmQgPiBjb250ZW50U3RhcnQpIHsKICAgIGNvbnRlbnQzID0gewogICAgICB0eXBlOiAiYXR4SGVhZGluZ1RleHQiLAogICAgICBzdGFydDogZXZlbnRzW2NvbnRlbnRTdGFydF1bMV0uc3RhcnQsCiAgICAgIGVuZDogZXZlbnRzW2NvbnRlbnRFbmRdWzFdLmVuZAogICAgfTsKICAgIHRleHQ5ID0gewogICAgICB0eXBlOiAiY2h1bmtUZXh0IiwKICAgICAgc3RhcnQ6IGV2ZW50c1tjb250ZW50U3RhcnRdWzFdLnN0YXJ0LAogICAgICBlbmQ6IGV2ZW50c1tjb250ZW50RW5kXVsxXS5lbmQsCiAgICAgIGNvbnRlbnRUeXBlOiAidGV4dCIKICAgIH07CiAgICBzcGxpY2UoZXZlbnRzLCBjb250ZW50U3RhcnQsIGNvbnRlbnRFbmQgLSBjb250ZW50U3RhcnQgKyAxLCBbWyJlbnRlciIsIGNvbnRlbnQzLCBjb250ZXh0Ml0sIFsiZW50ZXIiLCB0ZXh0OSwgY29udGV4dDJdLCBbImV4aXQiLCB0ZXh0OSwgY29udGV4dDJdLCBbImV4aXQiLCBjb250ZW50MywgY29udGV4dDJdXSk7CiAgfQogIHJldHVybiBldmVudHM7Cn0KZnVuY3Rpb24gdG9rZW5pemVIZWFkaW5nQXR4KGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgbGV0IHNpemUgPSAwOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiYXR4SGVhZGluZyIpOwogICAgcmV0dXJuIGJlZm9yZShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGJlZm9yZShjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiYXR4SGVhZGluZ1NlcXVlbmNlIik7CiAgICByZXR1cm4gc2VxdWVuY2VPcGVuKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gc2VxdWVuY2VPcGVuKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDM1ICYmIHNpemUrKyA8IDYpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHNlcXVlbmNlT3BlbjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImF0eEhlYWRpbmdTZXF1ZW5jZSIpOwogICAgICByZXR1cm4gYXRCcmVhayhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYXRCcmVhayhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSAzNSkgewogICAgICBlZmZlY3RzLmVudGVyKCJhdHhIZWFkaW5nU2VxdWVuY2UiKTsKICAgICAgcmV0dXJuIHNlcXVlbmNlRnVydGhlcihjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImF0eEhlYWRpbmciKTsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhdEJyZWFrLCAid2hpdGVzcGFjZSIpKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImF0eEhlYWRpbmdUZXh0Iik7CiAgICByZXR1cm4gZGF0YShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHNlcXVlbmNlRnVydGhlcihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSAzNSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gc2VxdWVuY2VGdXJ0aGVyOwogICAgfQogICAgZWZmZWN0cy5leGl0KCJhdHhIZWFkaW5nU2VxdWVuY2UiKTsKICAgIHJldHVybiBhdEJyZWFrKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gZGF0YShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSAzNSB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImF0eEhlYWRpbmdUZXh0Iik7CiAgICAgIHJldHVybiBhdEJyZWFrKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gZGF0YTsKICB9Cn0KdmFyIGhlYWRpbmdBdHg7CnZhciBpbml0X2hlYWRpbmdfYXR4ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvaGVhZGluZy1hdHguanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9zcGFjZSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2h1bmtlZCgpOwogICAgaGVhZGluZ0F0eCA9IHsKICAgICAgbmFtZTogImhlYWRpbmdBdHgiLAogICAgICByZXNvbHZlOiByZXNvbHZlSGVhZGluZ0F0eCwKICAgICAgdG9rZW5pemU6IHRva2VuaXplSGVhZGluZ0F0eAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay11dGlsLWh0bWwtdGFnLW5hbWVAMi4wLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay11dGlsLWh0bWwtdGFnLW5hbWUvaW5kZXguanMKdmFyIGh0bWxCbG9ja05hbWVzLCBodG1sUmF3TmFtZXM7CnZhciBpbml0X21pY3JvbWFya191dGlsX2h0bWxfdGFnX25hbWUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstdXRpbC1odG1sLXRhZy1uYW1lQDIuMC4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstdXRpbC1odG1sLXRhZy1uYW1lL2luZGV4LmpzIigpIHsKICAgIGh0bWxCbG9ja05hbWVzID0gWwogICAgICAiYWRkcmVzcyIsCiAgICAgICJhcnRpY2xlIiwKICAgICAgImFzaWRlIiwKICAgICAgImJhc2UiLAogICAgICAiYmFzZWZvbnQiLAogICAgICAiYmxvY2txdW90ZSIsCiAgICAgICJib2R5IiwKICAgICAgImNhcHRpb24iLAogICAgICAiY2VudGVyIiwKICAgICAgImNvbCIsCiAgICAgICJjb2xncm91cCIsCiAgICAgICJkZCIsCiAgICAgICJkZXRhaWxzIiwKICAgICAgImRpYWxvZyIsCiAgICAgICJkaXIiLAogICAgICAiZGl2IiwKICAgICAgImRsIiwKICAgICAgImR0IiwKICAgICAgImZpZWxkc2V0IiwKICAgICAgImZpZ2NhcHRpb24iLAogICAgICAiZmlndXJlIiwKICAgICAgImZvb3RlciIsCiAgICAgICJmb3JtIiwKICAgICAgImZyYW1lIiwKICAgICAgImZyYW1lc2V0IiwKICAgICAgImgxIiwKICAgICAgImgyIiwKICAgICAgImgzIiwKICAgICAgImg0IiwKICAgICAgImg1IiwKICAgICAgImg2IiwKICAgICAgImhlYWQiLAogICAgICAiaGVhZGVyIiwKICAgICAgImhyIiwKICAgICAgImh0bWwiLAogICAgICAiaWZyYW1lIiwKICAgICAgImxlZ2VuZCIsCiAgICAgICJsaSIsCiAgICAgICJsaW5rIiwKICAgICAgIm1haW4iLAogICAgICAibWVudSIsCiAgICAgICJtZW51aXRlbSIsCiAgICAgICJuYXYiLAogICAgICAibm9mcmFtZXMiLAogICAgICAib2wiLAogICAgICAib3B0Z3JvdXAiLAogICAgICAib3B0aW9uIiwKICAgICAgInAiLAogICAgICAicGFyYW0iLAogICAgICAic2VhcmNoIiwKICAgICAgInNlY3Rpb24iLAogICAgICAic3VtbWFyeSIsCiAgICAgICJ0YWJsZSIsCiAgICAgICJ0Ym9keSIsCiAgICAgICJ0ZCIsCiAgICAgICJ0Zm9vdCIsCiAgICAgICJ0aCIsCiAgICAgICJ0aGVhZCIsCiAgICAgICJ0aXRsZSIsCiAgICAgICJ0ciIsCiAgICAgICJ0cmFjayIsCiAgICAgICJ1bCIKICAgIF07CiAgICBodG1sUmF3TmFtZXMgPSBbInByZSIsICJzY3JpcHQiLCAic3R5bGUiLCAidGV4dGFyZWEiXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2h0bWwtZmxvdy5qcwpmdW5jdGlvbiByZXNvbHZlVG9IdG1sRmxvdyhldmVudHMpIHsKICBsZXQgaW5kZXgyID0gZXZlbnRzLmxlbmd0aDsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIGlmIChldmVudHNbaW5kZXgyXVswXSA9PT0gImVudGVyIiAmJiBldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAiaHRtbEZsb3ciKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAoaW5kZXgyID4gMSAmJiBldmVudHNbaW5kZXgyIC0gMl1bMV0udHlwZSA9PT0gImxpbmVQcmVmaXgiKSB7CiAgICBldmVudHNbaW5kZXgyXVsxXS5zdGFydCA9IGV2ZW50c1tpbmRleDIgLSAyXVsxXS5zdGFydDsKICAgIGV2ZW50c1tpbmRleDIgKyAxXVsxXS5zdGFydCA9IGV2ZW50c1tpbmRleDIgLSAyXVsxXS5zdGFydDsKICAgIGV2ZW50cy5zcGxpY2UoaW5kZXgyIC0gMiwgMik7CiAgfQogIHJldHVybiBldmVudHM7Cn0KZnVuY3Rpb24gdG9rZW5pemVIdG1sRmxvdyhlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBsZXQgbWFya2VyOwogIGxldCBjbG9zaW5nVGFnOwogIGxldCBidWZmZXIyOwogIGxldCBpbmRleDI7CiAgbGV0IG1hcmtlckI7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICByZXR1cm4gYmVmb3JlKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYmVmb3JlKGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJodG1sRmxvdyIpOwogICAgZWZmZWN0cy5lbnRlcigiaHRtbEZsb3dEYXRhIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIG9wZW47CiAgfQogIGZ1bmN0aW9uIG9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gMzMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uT3BlbjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDcpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgY2xvc2luZ1RhZyA9IHRydWU7CiAgICAgIHJldHVybiB0YWdDbG9zZVN0YXJ0OwogICAgfQogICAgaWYgKGNvZGU0ID09PSA2MykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBtYXJrZXIgPSAzOwogICAgICByZXR1cm4gc2VsZjIuaW50ZXJydXB0ID8gb2szIDogY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGU7CiAgICB9CiAgICBpZiAoYXNjaWlBbHBoYShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgYnVmZmVyMiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZTQpOwogICAgICByZXR1cm4gdGFnTmFtZTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBkZWNsYXJhdGlvbk9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDUpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgbWFya2VyID0gMjsKICAgICAgcmV0dXJuIGNvbW1lbnRPcGVuSW5zaWRlOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBtYXJrZXIgPSA1OwogICAgICBpbmRleDIgPSAwOwogICAgICByZXR1cm4gY2RhdGFPcGVuSW5zaWRlOwogICAgfQogICAgaWYgKGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIG1hcmtlciA9IDQ7CiAgICAgIHJldHVybiBzZWxmMi5pbnRlcnJ1cHQgPyBvazMgOiBjb250aW51YXRpb25EZWNsYXJhdGlvbkluc2lkZTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBjb21tZW50T3Blbkluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gc2VsZjIuaW50ZXJydXB0ID8gb2szIDogY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGU7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY2RhdGFPcGVuSW5zaWRlKGNvZGU0KSB7CiAgICBjb25zdCB2YWx1ZTIgPSAiQ0RBVEFbIjsKICAgIGlmIChjb2RlNCA9PT0gdmFsdWUyLmNoYXJDb2RlQXQoaW5kZXgyKyspKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGlmIChpbmRleDIgPT09IHZhbHVlMi5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gc2VsZjIuaW50ZXJydXB0ID8gb2szIDogY29udGludWF0aW9uOwogICAgICB9CiAgICAgIHJldHVybiBjZGF0YU9wZW5JbnNpZGU7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdGFnQ2xvc2VTdGFydChjb2RlNCkgewogICAgaWYgKGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGJ1ZmZlcjIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGU0KTsKICAgICAgcmV0dXJuIHRhZ05hbWU7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdGFnTmFtZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA0NyB8fCBjb2RlNCA9PT0gNjIgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpIHsKICAgICAgY29uc3Qgc2xhc2ggPSBjb2RlNCA9PT0gNDc7CiAgICAgIGNvbnN0IG5hbWUgPSBidWZmZXIyLnRvTG93ZXJDYXNlKCk7CiAgICAgIGlmICghc2xhc2ggJiYgIWNsb3NpbmdUYWcgJiYgaHRtbFJhd05hbWVzLmluY2x1ZGVzKG5hbWUpKSB7CiAgICAgICAgbWFya2VyID0gMTsKICAgICAgICByZXR1cm4gc2VsZjIuaW50ZXJydXB0ID8gb2szKGNvZGU0KSA6IGNvbnRpbnVhdGlvbihjb2RlNCk7CiAgICAgIH0KICAgICAgaWYgKGh0bWxCbG9ja05hbWVzLmluY2x1ZGVzKGJ1ZmZlcjIudG9Mb3dlckNhc2UoKSkpIHsKICAgICAgICBtYXJrZXIgPSA2OwogICAgICAgIGlmIChzbGFzaCkgewogICAgICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgICAgIHJldHVybiBiYXNpY1NlbGZDbG9zaW5nOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2VsZjIuaW50ZXJydXB0ID8gb2szKGNvZGU0KSA6IGNvbnRpbnVhdGlvbihjb2RlNCk7CiAgICAgIH0KICAgICAgbWFya2VyID0gNzsKICAgICAgcmV0dXJuIHNlbGYyLmludGVycnVwdCAmJiAhc2VsZjIucGFyc2VyLmxhenlbc2VsZjIubm93KCkubGluZV0gPyBub2soY29kZTQpIDogY2xvc2luZ1RhZyA/IGNvbXBsZXRlQ2xvc2luZ1RhZ0FmdGVyKGNvZGU0KSA6IGNvbXBsZXRlQXR0cmlidXRlTmFtZUJlZm9yZShjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDQ1IHx8IGFzY2lpQWxwaGFudW1lcmljKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBidWZmZXIyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZTQpOwogICAgICByZXR1cm4gdGFnTmFtZTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBiYXNpY1NlbGZDbG9zaW5nKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBzZWxmMi5pbnRlcnJ1cHQgPyBvazMgOiBjb250aW51YXRpb247CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY29tcGxldGVDbG9zaW5nVGFnQWZ0ZXIoY29kZTQpIHsKICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tcGxldGVDbG9zaW5nVGFnQWZ0ZXI7CiAgICB9CiAgICByZXR1cm4gY29tcGxldGVFbmQoY29kZTQpOwogIH0KICBmdW5jdGlvbiBjb21wbGV0ZUF0dHJpYnV0ZU5hbWVCZWZvcmUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDcpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbXBsZXRlRW5kOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA1OCB8fCBjb2RlNCA9PT0gOTUgfHwgYXNjaWlBbHBoYShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlTmFtZTsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVOYW1lQmVmb3JlOwogICAgfQogICAgcmV0dXJuIGNvbXBsZXRlRW5kKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY29tcGxldGVBdHRyaWJ1dGVOYW1lKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ1IHx8IGNvZGU0ID09PSA0NiB8fCBjb2RlNCA9PT0gNTggfHwgY29kZTQgPT09IDk1IHx8IGFzY2lpQWxwaGFudW1lcmljKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVOYW1lOwogICAgfQogICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlTmFtZUFmdGVyKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY29tcGxldGVBdHRyaWJ1dGVOYW1lQWZ0ZXIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNjEpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVCZWZvcmU7CiAgICB9CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlTmFtZUFmdGVyOwogICAgfQogICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlTmFtZUJlZm9yZShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVCZWZvcmUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gNjAgfHwgY29kZTQgPT09IDYxIHx8IGNvZGU0ID09PSA2MiB8fCBjb2RlNCA9PT0gOTYpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDM0IHx8IGNvZGU0ID09PSAzOSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBtYXJrZXJCID0gY29kZTQ7CiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlUXVvdGVkOwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlQmVmb3JlOwogICAgfQogICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVVbnF1b3RlZChjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVRdW90ZWQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbWFya2VyQikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBtYXJrZXJCID0gbnVsbDsKICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVRdW90ZWRBZnRlcjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlUXVvdGVkOwogIH0KICBmdW5jdGlvbiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlVW5xdW90ZWQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gMzQgfHwgY29kZTQgPT09IDM5IHx8IGNvZGU0ID09PSA0NyB8fCBjb2RlNCA9PT0gNjAgfHwgY29kZTQgPT09IDYxIHx8IGNvZGU0ID09PSA2MiB8fCBjb2RlNCA9PT0gOTYgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlTmFtZUFmdGVyKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVVucXVvdGVkOwogIH0KICBmdW5jdGlvbiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlUXVvdGVkQWZ0ZXIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDcgfHwgY29kZTQgPT09IDYyIHx8IG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZU5hbWVCZWZvcmUoY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbXBsZXRlRW5kKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb21wbGV0ZUFmdGVyOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbXBsZXRlQWZ0ZXIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBjb250aW51YXRpb24oY29kZTQpOwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb21wbGV0ZUFmdGVyOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbnRpbnVhdGlvbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSAmJiBtYXJrZXIgPT09IDIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkNvbW1lbnRJbnNpZGU7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDYwICYmIG1hcmtlciA9PT0gMSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29udGludWF0aW9uUmF3VGFnT3BlbjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNjIgJiYgbWFya2VyID09PSA0KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb250aW51YXRpb25DbG9zZTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNjMgJiYgbWFya2VyID09PSAzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb250aW51YXRpb25EZWNsYXJhdGlvbkluc2lkZTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gOTMgJiYgbWFya2VyID09PSA1KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb250aW51YXRpb25DZGF0YUluc2lkZTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpICYmIChtYXJrZXIgPT09IDYgfHwgbWFya2VyID09PSA3KSkgewogICAgICBlZmZlY3RzLmV4aXQoImh0bWxGbG93RGF0YSIpOwogICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhibGFua0xpbmVCZWZvcmUsIGNvbnRpbnVhdGlvbkFmdGVyLCBjb250aW51YXRpb25TdGFydCkoY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJodG1sRmxvd0RhdGEiKTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvblN0YXJ0KGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY29udGludWF0aW9uOwogIH0KICBmdW5jdGlvbiBjb250aW51YXRpb25TdGFydChjb2RlNCkgewogICAgcmV0dXJuIGVmZmVjdHMuY2hlY2sobm9uTGF6eUNvbnRpbnVhdGlvblN0YXJ0LCBjb250aW51YXRpb25TdGFydE5vbkxhenksIGNvbnRpbnVhdGlvbkFmdGVyKShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbnRpbnVhdGlvblN0YXJ0Tm9uTGF6eShjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZyIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgcmV0dXJuIGNvbnRpbnVhdGlvbkJlZm9yZTsKICB9CiAgZnVuY3Rpb24gY29udGludWF0aW9uQmVmb3JlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm4gY29udGludWF0aW9uU3RhcnQoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigiaHRtbEZsb3dEYXRhIik7CiAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY29udGludWF0aW9uQ29tbWVudEluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGU7CiAgICB9CiAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY29udGludWF0aW9uUmF3VGFnT3Blbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBidWZmZXIyID0gIiI7CiAgICAgIHJldHVybiBjb250aW51YXRpb25SYXdFbmRUYWc7CiAgICB9CiAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY29udGludWF0aW9uUmF3RW5kVGFnKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYyKSB7CiAgICAgIGNvbnN0IG5hbWUgPSBidWZmZXIyLnRvTG93ZXJDYXNlKCk7CiAgICAgIGlmIChodG1sUmF3TmFtZXMuaW5jbHVkZXMobmFtZSkpIHsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIHJldHVybiBjb250aW51YXRpb25DbG9zZTsKICAgICAgfQogICAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGU0KTsKICAgIH0KICAgIGlmIChhc2NpaUFscGhhKGNvZGU0KSAmJiBidWZmZXIyLmxlbmd0aCA8IDgpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgYnVmZmVyMiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvblJhd0VuZFRhZzsKICAgIH0KICAgIHJldHVybiBjb250aW51YXRpb24oY29kZTQpOwogIH0KICBmdW5jdGlvbiBjb250aW51YXRpb25DZGF0YUluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGU7CiAgICB9CiAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNjIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkNsb3NlOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0NSAmJiBtYXJrZXIgPT09IDIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkRlY2xhcmF0aW9uSW5zaWRlOwogICAgfQogICAgcmV0dXJuIGNvbnRpbnVhdGlvbihjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbnRpbnVhdGlvbkNsb3NlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImh0bWxGbG93RGF0YSIpOwogICAgICByZXR1cm4gY29udGludWF0aW9uQWZ0ZXIoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb250aW51YXRpb25DbG9zZTsKICB9CiAgZnVuY3Rpb24gY29udGludWF0aW9uQWZ0ZXIoY29kZTQpIHsKICAgIGVmZmVjdHMuZXhpdCgiaHRtbEZsb3ciKTsKICAgIHJldHVybiBvazMoY29kZTQpOwogIH0KfQpmdW5jdGlvbiB0b2tlbml6ZU5vbkxhenlDb250aW51YXRpb25TdGFydChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICAgIHJldHVybiBhZnRlcjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgcmV0dXJuIHNlbGYyLnBhcnNlci5sYXp5W3NlbGYyLm5vdygpLmxpbmVdID8gbm9rKGNvZGU0KSA6IG9rMyhjb2RlNCk7CiAgfQp9CmZ1bmN0aW9uIHRva2VuaXplQmxhbmtMaW5lQmVmb3JlKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KGJsYW5rTGluZSwgb2szLCBub2spOwogIH0KfQp2YXIgaHRtbEZsb3csIGJsYW5rTGluZUJlZm9yZSwgbm9uTGF6eUNvbnRpbnVhdGlvblN0YXJ0Owp2YXIgaW5pdF9odG1sX2Zsb3cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9odG1sLWZsb3cuanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfaHRtbF90YWdfbmFtZSgpOwogICAgaW5pdF9ibGFua19saW5lKCk7CiAgICBodG1sRmxvdyA9IHsKICAgICAgY29uY3JldGU6IHRydWUsCiAgICAgIG5hbWU6ICJodG1sRmxvdyIsCiAgICAgIHJlc29sdmVUbzogcmVzb2x2ZVRvSHRtbEZsb3csCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZUh0bWxGbG93CiAgICB9OwogICAgYmxhbmtMaW5lQmVmb3JlID0gewogICAgICBwYXJ0aWFsOiB0cnVlLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVCbGFua0xpbmVCZWZvcmUKICAgIH07CiAgICBub25MYXp5Q29udGludWF0aW9uU3RhcnQgPSB7CiAgICAgIHBhcnRpYWw6IHRydWUsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZU5vbkxhenlDb250aW51YXRpb25TdGFydAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2h0bWwtdGV4dC5qcwpmdW5jdGlvbiB0b2tlbml6ZUh0bWxUZXh0KGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGxldCBtYXJrZXI7CiAgbGV0IGluZGV4MjsKICBsZXQgcmV0dXJuU3RhdGU7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJodG1sVGV4dCIpOwogICAgZWZmZWN0cy5lbnRlcigiaHRtbFRleHREYXRhIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIG9wZW47CiAgfQogIGZ1bmN0aW9uIG9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gMzMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uT3BlbjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDcpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRhZ0Nsb3NlU3RhcnQ7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDYzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBpbnN0cnVjdGlvbjsKICAgIH0KICAgIGlmIChhc2NpaUFscGhhKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnT3BlbjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBkZWNsYXJhdGlvbk9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDUpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNvbW1lbnRPcGVuSW5zaWRlOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBpbmRleDIgPSAwOwogICAgICByZXR1cm4gY2RhdGFPcGVuSW5zaWRlOwogICAgfQogICAgaWYgKGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBkZWNsYXJhdGlvbjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBjb21tZW50T3Blbkluc2lkZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tbWVudEVuZDsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBjb21tZW50Myhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29tbWVudENsb3NlOwogICAgfQogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuU3RhdGUgPSBjb21tZW50MzsKICAgICAgcmV0dXJuIGxpbmVFbmRpbmdCZWZvcmUoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb21tZW50MzsKICB9CiAgZnVuY3Rpb24gY29tbWVudENsb3NlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ1KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBjb21tZW50RW5kOwogICAgfQogICAgcmV0dXJuIGNvbW1lbnQzKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY29tbWVudEVuZChjb2RlNCkgewogICAgcmV0dXJuIGNvZGU0ID09PSA2MiA/IGVuZDMoY29kZTQpIDogY29kZTQgPT09IDQ1ID8gY29tbWVudENsb3NlKGNvZGU0KSA6IGNvbW1lbnQzKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY2RhdGFPcGVuSW5zaWRlKGNvZGU0KSB7CiAgICBjb25zdCB2YWx1ZTIgPSAiQ0RBVEFbIjsKICAgIGlmIChjb2RlNCA9PT0gdmFsdWUyLmNoYXJDb2RlQXQoaW5kZXgyKyspKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBpbmRleDIgPT09IHZhbHVlMi5sZW5ndGggPyBjZGF0YSA6IGNkYXRhT3Blbkluc2lkZTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBjZGF0YShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY2RhdGFDbG9zZTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVyblN0YXRlID0gY2RhdGE7CiAgICAgIHJldHVybiBsaW5lRW5kaW5nQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gY2RhdGE7CiAgfQogIGZ1bmN0aW9uIGNkYXRhQ2xvc2UoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGNkYXRhRW5kOwogICAgfQogICAgcmV0dXJuIGNkYXRhKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gY2RhdGFFbmQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNjIpIHsKICAgICAgcmV0dXJuIGVuZDMoY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY2RhdGFFbmQ7CiAgICB9CiAgICByZXR1cm4gY2RhdGEoY29kZTQpOwogIH0KICBmdW5jdGlvbiBkZWNsYXJhdGlvbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA2MikgewogICAgICByZXR1cm4gZW5kMyhjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm5TdGF0ZSA9IGRlY2xhcmF0aW9uOwogICAgICByZXR1cm4gbGluZUVuZGluZ0JlZm9yZShjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGRlY2xhcmF0aW9uOwogIH0KICBmdW5jdGlvbiBpbnN0cnVjdGlvbihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA2MykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25DbG9zZTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVyblN0YXRlID0gaW5zdHJ1Y3Rpb247CiAgICAgIHJldHVybiBsaW5lRW5kaW5nQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb247CiAgfQogIGZ1bmN0aW9uIGluc3RydWN0aW9uQ2xvc2UoY29kZTQpIHsKICAgIHJldHVybiBjb2RlNCA9PT0gNjIgPyBlbmQzKGNvZGU0KSA6IGluc3RydWN0aW9uKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdGFnQ2xvc2VTdGFydChjb2RlNCkgewogICAgaWYgKGFzY2lpQWxwaGEoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB0YWdDbG9zZTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiB0YWdDbG9zZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSB8fCBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRhZ0Nsb3NlOwogICAgfQogICAgcmV0dXJuIHRhZ0Nsb3NlQmV0d2Vlbihjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHRhZ0Nsb3NlQmV0d2Vlbihjb2RlNCkgewogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuU3RhdGUgPSB0YWdDbG9zZUJldHdlZW47CiAgICAgIHJldHVybiBsaW5lRW5kaW5nQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnQ2xvc2VCZXR3ZWVuOwogICAgfQogICAgcmV0dXJuIGVuZDMoY29kZTQpOwogIH0KICBmdW5jdGlvbiB0YWdPcGVuKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ1IHx8IGFzY2lpQWxwaGFudW1lcmljKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnT3BlbjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gNDcgfHwgY29kZTQgPT09IDYyIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIHJldHVybiB0YWdPcGVuQmV0d2Vlbihjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdGFnT3BlbkJldHdlZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDcpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGVuZDM7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDU4IHx8IGNvZGU0ID09PSA5NSB8fCBhc2NpaUFscGhhKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnT3BlbkF0dHJpYnV0ZU5hbWU7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm5TdGF0ZSA9IHRhZ09wZW5CZXR3ZWVuOwogICAgICByZXR1cm4gbGluZUVuZGluZ0JlZm9yZShjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRhZ09wZW5CZXR3ZWVuOwogICAgfQogICAgcmV0dXJuIGVuZDMoY29kZTQpOwogIH0KICBmdW5jdGlvbiB0YWdPcGVuQXR0cmlidXRlTmFtZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSB8fCBjb2RlNCA9PT0gNDYgfHwgY29kZTQgPT09IDU4IHx8IGNvZGU0ID09PSA5NSB8fCBhc2NpaUFscGhhbnVtZXJpYyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVOYW1lOwogICAgfQogICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVOYW1lQWZ0ZXIoY29kZTQpOwogIH0KICBmdW5jdGlvbiB0YWdPcGVuQXR0cmlidXRlTmFtZUFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDYxKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlVmFsdWVCZWZvcmU7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICByZXR1cm5TdGF0ZSA9IHRhZ09wZW5BdHRyaWJ1dGVOYW1lQWZ0ZXI7CiAgICAgIHJldHVybiBsaW5lRW5kaW5nQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnT3BlbkF0dHJpYnV0ZU5hbWVBZnRlcjsKICAgIH0KICAgIHJldHVybiB0YWdPcGVuQmV0d2Vlbihjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZUJlZm9yZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA2MCB8fCBjb2RlNCA9PT0gNjEgfHwgY29kZTQgPT09IDYyIHx8IGNvZGU0ID09PSA5NikgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gMzQgfHwgY29kZTQgPT09IDM5KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIG1hcmtlciA9IGNvZGU0OwogICAgICByZXR1cm4gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlUXVvdGVkOwogICAgfQogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuU3RhdGUgPSB0YWdPcGVuQXR0cmlidXRlVmFsdWVCZWZvcmU7CiAgICAgIHJldHVybiBsaW5lRW5kaW5nQmVmb3JlKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlQmVmb3JlOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlVmFsdWVVbnF1b3RlZDsKICB9CiAgZnVuY3Rpb24gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlUXVvdGVkKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG1hcmtlcikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBtYXJrZXIgPSB2b2lkIDA7CiAgICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlVmFsdWVRdW90ZWRBZnRlcjsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVyblN0YXRlID0gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlUXVvdGVkOwogICAgICByZXR1cm4gbGluZUVuZGluZ0JlZm9yZShjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVF1b3RlZDsKICB9CiAgZnVuY3Rpb24gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlVW5xdW90ZWQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBjb2RlNCA9PT0gMzQgfHwgY29kZTQgPT09IDM5IHx8IGNvZGU0ID09PSA2MCB8fCBjb2RlNCA9PT0gNjEgfHwgY29kZTQgPT09IDk2KSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA0NyB8fCBjb2RlNCA9PT0gNjIgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIHRhZ09wZW5CZXR3ZWVuKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlVW5xdW90ZWQ7CiAgfQogIGZ1bmN0aW9uIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVF1b3RlZEFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQ3IHx8IGNvZGU0ID09PSA2MiB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gdGFnT3BlbkJldHdlZW4oY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGVuZDMoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNjIpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJodG1sVGV4dERhdGEiKTsKICAgICAgZWZmZWN0cy5leGl0KCJodG1sVGV4dCIpOwogICAgICByZXR1cm4gb2szOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGxpbmVFbmRpbmdCZWZvcmUoY29kZTQpIHsKICAgIGVmZmVjdHMuZXhpdCgiaHRtbFRleHREYXRhIik7CiAgICBlZmZlY3RzLmVudGVyKCJsaW5lRW5kaW5nIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nIik7CiAgICByZXR1cm4gbGluZUVuZGluZ0FmdGVyOwogIH0KICBmdW5jdGlvbiBsaW5lRW5kaW5nQWZ0ZXIoY29kZTQpIHsKICAgIHJldHVybiBtYXJrZG93blNwYWNlKGNvZGU0KSA/IGZhY3RvcnlTcGFjZShlZmZlY3RzLCBsaW5lRW5kaW5nQWZ0ZXJQcmVmaXgsICJsaW5lUHJlZml4Iiwgc2VsZjIucGFyc2VyLmNvbnN0cnVjdHMuZGlzYWJsZS5udWxsLmluY2x1ZGVzKCJjb2RlSW5kZW50ZWQiKSA/IHZvaWQgMCA6IDQpKGNvZGU0KSA6IGxpbmVFbmRpbmdBZnRlclByZWZpeChjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGxpbmVFbmRpbmdBZnRlclByZWZpeChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiaHRtbFRleHREYXRhIik7CiAgICByZXR1cm4gcmV0dXJuU3RhdGUoY29kZTQpOwogIH0KfQp2YXIgaHRtbFRleHQ7CnZhciBpbml0X2h0bWxfdGV4dCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2h0bWwtdGV4dC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X3NwYWNlKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogICAgaHRtbFRleHQgPSB7CiAgICAgIG5hbWU6ICJodG1sVGV4dCIsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZUh0bWxUZXh0CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvbGFiZWwtZW5kLmpzCmZ1bmN0aW9uIHJlc29sdmVBbGxMYWJlbEVuZChldmVudHMpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgY29uc3QgbmV3RXZlbnRzID0gW107CiAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgY29uc3QgdG9rZW4gPSBldmVudHNbaW5kZXgyXVsxXTsKICAgIG5ld0V2ZW50cy5wdXNoKGV2ZW50c1tpbmRleDJdKTsKICAgIGlmICh0b2tlbi50eXBlID09PSAibGFiZWxJbWFnZSIgfHwgdG9rZW4udHlwZSA9PT0gImxhYmVsTGluayIgfHwgdG9rZW4udHlwZSA9PT0gImxhYmVsRW5kIikgewogICAgICBjb25zdCBvZmZzZXQgPSB0b2tlbi50eXBlID09PSAibGFiZWxJbWFnZSIgPyA0IDogMjsKICAgICAgdG9rZW4udHlwZSA9ICJkYXRhIjsKICAgICAgaW5kZXgyICs9IG9mZnNldDsKICAgIH0KICB9CiAgaWYgKGV2ZW50cy5sZW5ndGggIT09IG5ld0V2ZW50cy5sZW5ndGgpIHsKICAgIHNwbGljZShldmVudHMsIDAsIGV2ZW50cy5sZW5ndGgsIG5ld0V2ZW50cyk7CiAgfQogIHJldHVybiBldmVudHM7Cn0KZnVuY3Rpb24gcmVzb2x2ZVRvTGFiZWxFbmQoZXZlbnRzLCBjb250ZXh0MikgewogIGxldCBpbmRleDIgPSBldmVudHMubGVuZ3RoOwogIGxldCBvZmZzZXQgPSAwOwogIGxldCB0b2tlbjsKICBsZXQgb3BlbjsKICBsZXQgY2xvc2U3OwogIGxldCBtZWRpYTsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIHRva2VuID0gZXZlbnRzW2luZGV4Ml1bMV07CiAgICBpZiAob3BlbikgewogICAgICBpZiAodG9rZW4udHlwZSA9PT0gImxpbmsiIHx8IHRva2VuLnR5cGUgPT09ICJsYWJlbExpbmsiICYmIHRva2VuLl9pbmFjdGl2ZSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChldmVudHNbaW5kZXgyXVswXSA9PT0gImVudGVyIiAmJiB0b2tlbi50eXBlID09PSAibGFiZWxMaW5rIikgewogICAgICAgIHRva2VuLl9pbmFjdGl2ZSA9IHRydWU7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY2xvc2U3KSB7CiAgICAgIGlmIChldmVudHNbaW5kZXgyXVswXSA9PT0gImVudGVyIiAmJiAodG9rZW4udHlwZSA9PT0gImxhYmVsSW1hZ2UiIHx8IHRva2VuLnR5cGUgPT09ICJsYWJlbExpbmsiKSAmJiAhdG9rZW4uX2JhbGFuY2VkKSB7CiAgICAgICAgb3BlbiA9IGluZGV4MjsKICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gImxhYmVsTGluayIpIHsKICAgICAgICAgIG9mZnNldCA9IDI7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gImxhYmVsRW5kIikgewogICAgICBjbG9zZTcgPSBpbmRleDI7CiAgICB9CiAgfQogIGNvbnN0IGdyb3VwID0gewogICAgdHlwZTogZXZlbnRzW29wZW5dWzFdLnR5cGUgPT09ICJsYWJlbExpbmsiID8gImxpbmsiIDogImltYWdlIiwKICAgIHN0YXJ0OiB7CiAgICAgIC4uLmV2ZW50c1tvcGVuXVsxXS5zdGFydAogICAgfSwKICAgIGVuZDogewogICAgICAuLi5ldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdWzFdLmVuZAogICAgfQogIH07CiAgY29uc3QgbGFiZWwgPSB7CiAgICB0eXBlOiAibGFiZWwiLAogICAgc3RhcnQ6IHsKICAgICAgLi4uZXZlbnRzW29wZW5dWzFdLnN0YXJ0CiAgICB9LAogICAgZW5kOiB7CiAgICAgIC4uLmV2ZW50c1tjbG9zZTddWzFdLmVuZAogICAgfQogIH07CiAgY29uc3QgdGV4dDkgPSB7CiAgICB0eXBlOiAibGFiZWxUZXh0IiwKICAgIHN0YXJ0OiB7CiAgICAgIC4uLmV2ZW50c1tvcGVuICsgb2Zmc2V0ICsgMl1bMV0uZW5kCiAgICB9LAogICAgZW5kOiB7CiAgICAgIC4uLmV2ZW50c1tjbG9zZTcgLSAyXVsxXS5zdGFydAogICAgfQogIH07CiAgbWVkaWEgPSBbWyJlbnRlciIsIGdyb3VwLCBjb250ZXh0Ml0sIFsiZW50ZXIiLCBsYWJlbCwgY29udGV4dDJdXTsKICBtZWRpYSA9IHB1c2gobWVkaWEsIGV2ZW50cy5zbGljZShvcGVuICsgMSwgb3BlbiArIG9mZnNldCArIDMpKTsKICBtZWRpYSA9IHB1c2gobWVkaWEsIFtbImVudGVyIiwgdGV4dDksIGNvbnRleHQyXV0pOwogIG1lZGlhID0gcHVzaChtZWRpYSwgcmVzb2x2ZUFsbChjb250ZXh0Mi5wYXJzZXIuY29uc3RydWN0cy5pbnNpZGVTcGFuLm51bGwsIGV2ZW50cy5zbGljZShvcGVuICsgb2Zmc2V0ICsgNCwgY2xvc2U3IC0gMyksIGNvbnRleHQyKSk7CiAgbWVkaWEgPSBwdXNoKG1lZGlhLCBbWyJleGl0IiwgdGV4dDksIGNvbnRleHQyXSwgZXZlbnRzW2Nsb3NlNyAtIDJdLCBldmVudHNbY2xvc2U3IC0gMV0sIFsiZXhpdCIsIGxhYmVsLCBjb250ZXh0Ml1dKTsKICBtZWRpYSA9IHB1c2gobWVkaWEsIGV2ZW50cy5zbGljZShjbG9zZTcgKyAxKSk7CiAgbWVkaWEgPSBwdXNoKG1lZGlhLCBbWyJleGl0IiwgZ3JvdXAsIGNvbnRleHQyXV0pOwogIHNwbGljZShldmVudHMsIG9wZW4sIGV2ZW50cy5sZW5ndGgsIG1lZGlhKTsKICByZXR1cm4gZXZlbnRzOwp9CmZ1bmN0aW9uIHRva2VuaXplTGFiZWxFbmQoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IGluZGV4MiA9IHNlbGYyLmV2ZW50cy5sZW5ndGg7CiAgbGV0IGxhYmVsU3RhcnQ7CiAgbGV0IGRlZmluZWQ7CiAgd2hpbGUgKGluZGV4Mi0tKSB7CiAgICBpZiAoKHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJsYWJlbEltYWdlIiB8fCBzZWxmMi5ldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAibGFiZWxMaW5rIikgJiYgIXNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLl9iYWxhbmNlZCkgewogICAgICBsYWJlbFN0YXJ0ID0gc2VsZjIuZXZlbnRzW2luZGV4Ml1bMV07CiAgICAgIGJyZWFrOwogICAgfQogIH0KICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGlmICghbGFiZWxTdGFydCkgewogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGlmIChsYWJlbFN0YXJ0Ll9pbmFjdGl2ZSkgewogICAgICByZXR1cm4gbGFiZWxFbmROb2soY29kZTQpOwogICAgfQogICAgZGVmaW5lZCA9IHNlbGYyLnBhcnNlci5kZWZpbmVkLmluY2x1ZGVzKG5vcm1hbGl6ZUlkZW50aWZpZXIoc2VsZjIuc2xpY2VTZXJpYWxpemUoewogICAgICBzdGFydDogbGFiZWxTdGFydC5lbmQsCiAgICAgIGVuZDogc2VsZjIubm93KCkKICAgIH0pKSk7CiAgICBlZmZlY3RzLmVudGVyKCJsYWJlbEVuZCIpOwogICAgZWZmZWN0cy5lbnRlcigibGFiZWxNYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxhYmVsTWFya2VyIik7CiAgICBlZmZlY3RzLmV4aXQoImxhYmVsRW5kIik7CiAgICByZXR1cm4gYWZ0ZXI7CiAgfQogIGZ1bmN0aW9uIGFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQwKSB7CiAgICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQocmVzb3VyY2VDb25zdHJ1Y3QsIGxhYmVsRW5kT2ssIGRlZmluZWQgPyBsYWJlbEVuZE9rIDogbGFiZWxFbmROb2spKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gOTEpIHsKICAgICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChyZWZlcmVuY2VGdWxsQ29uc3RydWN0LCBsYWJlbEVuZE9rLCBkZWZpbmVkID8gcmVmZXJlbmNlTm90RnVsbCA6IGxhYmVsRW5kTm9rKShjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gZGVmaW5lZCA/IGxhYmVsRW5kT2soY29kZTQpIDogbGFiZWxFbmROb2soY29kZTQpOwogIH0KICBmdW5jdGlvbiByZWZlcmVuY2VOb3RGdWxsKGNvZGU0KSB7CiAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KHJlZmVyZW5jZUNvbGxhcHNlZENvbnN0cnVjdCwgbGFiZWxFbmRPaywgbGFiZWxFbmROb2spKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gbGFiZWxFbmRPayhjb2RlNCkgewogICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGxhYmVsRW5kTm9rKGNvZGU0KSB7CiAgICBsYWJlbFN0YXJ0Ll9iYWxhbmNlZCA9IHRydWU7CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVSZXNvdXJjZShlZmZlY3RzLCBvazMsIG5vaykgewogIHJldHVybiByZXNvdXJjZVN0YXJ0OwogIGZ1bmN0aW9uIHJlc291cmNlU3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoInJlc291cmNlIik7CiAgICBlZmZlY3RzLmVudGVyKCJyZXNvdXJjZU1hcmtlciIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgicmVzb3VyY2VNYXJrZXIiKTsKICAgIHJldHVybiByZXNvdXJjZUJlZm9yZTsKICB9CiAgZnVuY3Rpb24gcmVzb3VyY2VCZWZvcmUoY29kZTQpIHsKICAgIHJldHVybiBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSA/IGZhY3RvcnlXaGl0ZXNwYWNlKGVmZmVjdHMsIHJlc291cmNlT3BlbikoY29kZTQpIDogcmVzb3VyY2VPcGVuKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gcmVzb3VyY2VPcGVuKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDQxKSB7CiAgICAgIHJldHVybiByZXNvdXJjZUVuZChjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gZmFjdG9yeURlc3RpbmF0aW9uKGVmZmVjdHMsIHJlc291cmNlRGVzdGluYXRpb25BZnRlciwgcmVzb3VyY2VEZXN0aW5hdGlvbk1pc3NpbmcsICJyZXNvdXJjZURlc3RpbmF0aW9uIiwgInJlc291cmNlRGVzdGluYXRpb25MaXRlcmFsIiwgInJlc291cmNlRGVzdGluYXRpb25MaXRlcmFsTWFya2VyIiwgInJlc291cmNlRGVzdGluYXRpb25SYXciLCAicmVzb3VyY2VEZXN0aW5hdGlvblN0cmluZyIsIDMyKShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHJlc291cmNlRGVzdGluYXRpb25BZnRlcihjb2RlNCkgewogICAgcmV0dXJuIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpID8gZmFjdG9yeVdoaXRlc3BhY2UoZWZmZWN0cywgcmVzb3VyY2VCZXR3ZWVuKShjb2RlNCkgOiByZXNvdXJjZUVuZChjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHJlc291cmNlRGVzdGluYXRpb25NaXNzaW5nKGNvZGU0KSB7CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gcmVzb3VyY2VCZXR3ZWVuKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDM0IHx8IGNvZGU0ID09PSAzOSB8fCBjb2RlNCA9PT0gNDApIHsKICAgICAgcmV0dXJuIGZhY3RvcnlUaXRsZShlZmZlY3RzLCByZXNvdXJjZVRpdGxlQWZ0ZXIsIG5vaywgInJlc291cmNlVGl0bGUiLCAicmVzb3VyY2VUaXRsZU1hcmtlciIsICJyZXNvdXJjZVRpdGxlU3RyaW5nIikoY29kZTQpOwogICAgfQogICAgcmV0dXJuIHJlc291cmNlRW5kKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gcmVzb3VyY2VUaXRsZUFmdGVyKGNvZGU0KSB7CiAgICByZXR1cm4gbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkgPyBmYWN0b3J5V2hpdGVzcGFjZShlZmZlY3RzLCByZXNvdXJjZUVuZCkoY29kZTQpIDogcmVzb3VyY2VFbmQoY29kZTQpOwogIH0KICBmdW5jdGlvbiByZXNvdXJjZUVuZChjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0MSkgewogICAgICBlZmZlY3RzLmVudGVyKCJyZXNvdXJjZU1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInJlc291cmNlTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZXhpdCgicmVzb3VyY2UiKTsKICAgICAgcmV0dXJuIG9rMzsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KfQpmdW5jdGlvbiB0b2tlbml6ZVJlZmVyZW5jZUZ1bGwoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIHJlZmVyZW5jZUZ1bGw7CiAgZnVuY3Rpb24gcmVmZXJlbmNlRnVsbChjb2RlNCkgewogICAgcmV0dXJuIGZhY3RvcnlMYWJlbC5jYWxsKHNlbGYyLCBlZmZlY3RzLCByZWZlcmVuY2VGdWxsQWZ0ZXIsIHJlZmVyZW5jZUZ1bGxNaXNzaW5nLCAicmVmZXJlbmNlIiwgInJlZmVyZW5jZU1hcmtlciIsICJyZWZlcmVuY2VTdHJpbmciKShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHJlZmVyZW5jZUZ1bGxBZnRlcihjb2RlNCkgewogICAgcmV0dXJuIHNlbGYyLnBhcnNlci5kZWZpbmVkLmluY2x1ZGVzKG5vcm1hbGl6ZUlkZW50aWZpZXIoc2VsZjIuc2xpY2VTZXJpYWxpemUoc2VsZjIuZXZlbnRzW3NlbGYyLmV2ZW50cy5sZW5ndGggLSAxXVsxXSkuc2xpY2UoMSwgLTEpKSkgPyBvazMoY29kZTQpIDogbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gcmVmZXJlbmNlRnVsbE1pc3NpbmcoY29kZTQpIHsKICAgIHJldHVybiBub2soY29kZTQpOwogIH0KfQpmdW5jdGlvbiB0b2tlbml6ZVJlZmVyZW5jZUNvbGxhcHNlZChlZmZlY3RzLCBvazMsIG5vaykgewogIHJldHVybiByZWZlcmVuY2VDb2xsYXBzZWRTdGFydDsKICBmdW5jdGlvbiByZWZlcmVuY2VDb2xsYXBzZWRTdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigicmVmZXJlbmNlIik7CiAgICBlZmZlY3RzLmVudGVyKCJyZWZlcmVuY2VNYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoInJlZmVyZW5jZU1hcmtlciIpOwogICAgcmV0dXJuIHJlZmVyZW5jZUNvbGxhcHNlZE9wZW47CiAgfQogIGZ1bmN0aW9uIHJlZmVyZW5jZUNvbGxhcHNlZE9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5lbnRlcigicmVmZXJlbmNlTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgicmVmZXJlbmNlTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZXhpdCgicmVmZXJlbmNlIik7CiAgICAgIHJldHVybiBvazM7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9Cn0KdmFyIGxhYmVsRW5kLCByZXNvdXJjZUNvbnN0cnVjdCwgcmVmZXJlbmNlRnVsbENvbnN0cnVjdCwgcmVmZXJlbmNlQ29sbGFwc2VkQ29uc3RydWN0Owp2YXIgaW5pdF9sYWJlbF9lbmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9sYWJlbC1lbmQuanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9kZXN0aW5hdGlvbigpOwogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9sYWJlbCgpOwogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV90aXRsZSgpOwogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV93aGl0ZXNwYWNlKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaHVua2VkKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX25vcm1hbGl6ZV9pZGVudGlmaWVyKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX3Jlc29sdmVfYWxsKCk7CiAgICBsYWJlbEVuZCA9IHsKICAgICAgbmFtZTogImxhYmVsRW5kIiwKICAgICAgcmVzb2x2ZUFsbDogcmVzb2x2ZUFsbExhYmVsRW5kLAogICAgICByZXNvbHZlVG86IHJlc29sdmVUb0xhYmVsRW5kLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVMYWJlbEVuZAogICAgfTsKICAgIHJlc291cmNlQ29uc3RydWN0ID0gewogICAgICB0b2tlbml6ZTogdG9rZW5pemVSZXNvdXJjZQogICAgfTsKICAgIHJlZmVyZW5jZUZ1bGxDb25zdHJ1Y3QgPSB7CiAgICAgIHRva2VuaXplOiB0b2tlbml6ZVJlZmVyZW5jZUZ1bGwKICAgIH07CiAgICByZWZlcmVuY2VDb2xsYXBzZWRDb25zdHJ1Y3QgPSB7CiAgICAgIHRva2VuaXplOiB0b2tlbml6ZVJlZmVyZW5jZUNvbGxhcHNlZAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2xhYmVsLXN0YXJ0LWltYWdlLmpzCmZ1bmN0aW9uIHRva2VuaXplTGFiZWxTdGFydEltYWdlKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigibGFiZWxJbWFnZSIpOwogICAgZWZmZWN0cy5lbnRlcigibGFiZWxJbWFnZU1hcmtlciIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGFiZWxJbWFnZU1hcmtlciIpOwogICAgcmV0dXJuIG9wZW47CiAgfQogIGZ1bmN0aW9uIG9wZW4oY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTEpIHsKICAgICAgZWZmZWN0cy5lbnRlcigibGFiZWxNYXJrZXIiKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJsYWJlbE1hcmtlciIpOwogICAgICBlZmZlY3RzLmV4aXQoImxhYmVsSW1hZ2UiKTsKICAgICAgcmV0dXJuIGFmdGVyOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGFmdGVyKGNvZGU0KSB7CiAgICByZXR1cm4gY29kZTQgPT09IDk0ICYmICJfaGlkZGVuRm9vdG5vdGVTdXBwb3J0IiBpbiBzZWxmMi5wYXJzZXIuY29uc3RydWN0cyA/IG5vayhjb2RlNCkgOiBvazMoY29kZTQpOwogIH0KfQp2YXIgbGFiZWxTdGFydEltYWdlOwp2YXIgaW5pdF9sYWJlbF9zdGFydF9pbWFnZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2xhYmVsLXN0YXJ0LWltYWdlLmpzIigpIHsKICAgIGluaXRfbGFiZWxfZW5kKCk7CiAgICBsYWJlbFN0YXJ0SW1hZ2UgPSB7CiAgICAgIG5hbWU6ICJsYWJlbFN0YXJ0SW1hZ2UiLAogICAgICByZXNvbHZlQWxsOiBsYWJlbEVuZC5yZXNvbHZlQWxsLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVMYWJlbFN0YXJ0SW1hZ2UKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9sYWJlbC1zdGFydC1saW5rLmpzCmZ1bmN0aW9uIHRva2VuaXplTGFiZWxTdGFydExpbmsoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJsYWJlbExpbmsiKTsKICAgIGVmZmVjdHMuZW50ZXIoImxhYmVsTWFya2VyIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJsYWJlbE1hcmtlciIpOwogICAgZWZmZWN0cy5leGl0KCJsYWJlbExpbmsiKTsKICAgIHJldHVybiBhZnRlcjsKICB9CiAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgIHJldHVybiBjb2RlNCA9PT0gOTQgJiYgIl9oaWRkZW5Gb290bm90ZVN1cHBvcnQiIGluIHNlbGYyLnBhcnNlci5jb25zdHJ1Y3RzID8gbm9rKGNvZGU0KSA6IG9rMyhjb2RlNCk7CiAgfQp9CnZhciBsYWJlbFN0YXJ0TGluazsKdmFyIGluaXRfbGFiZWxfc3RhcnRfbGluayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2xhYmVsLXN0YXJ0LWxpbmsuanMiKCkgewogICAgaW5pdF9sYWJlbF9lbmQoKTsKICAgIGxhYmVsU3RhcnRMaW5rID0gewogICAgICBuYW1lOiAibGFiZWxTdGFydExpbmsiLAogICAgICByZXNvbHZlQWxsOiBsYWJlbEVuZC5yZXNvbHZlQWxsLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVMYWJlbFN0YXJ0TGluawogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL2xpbmUtZW5kaW5nLmpzCmZ1bmN0aW9uIHRva2VuaXplTGluZUVuZGluZyhlZmZlY3RzLCBvazMpIHsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgb2szLCAibGluZVByZWZpeCIpOwogIH0KfQp2YXIgbGluZUVuZGluZzsKdmFyIGluaXRfbGluZV9lbmRpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9saW5lLWVuZGluZy5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X3NwYWNlKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogICAgbGluZUVuZGluZyA9IHsKICAgICAgbmFtZTogImxpbmVFbmRpbmciLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVMaW5lRW5kaW5nCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvdGhlbWF0aWMtYnJlYWsuanMKZnVuY3Rpb24gdG9rZW5pemVUaGVtYXRpY0JyZWFrKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgbGV0IHNpemUgPSAwOwogIGxldCBtYXJrZXI7CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJ0aGVtYXRpY0JyZWFrIik7CiAgICByZXR1cm4gYmVmb3JlKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYmVmb3JlKGNvZGU0KSB7CiAgICBtYXJrZXIgPSBjb2RlNDsKICAgIHJldHVybiBhdEJyZWFrKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYXRCcmVhayhjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBtYXJrZXIpIHsKICAgICAgZWZmZWN0cy5lbnRlcigidGhlbWF0aWNCcmVha1NlcXVlbmNlIik7CiAgICAgIHJldHVybiBzZXF1ZW5jZShjb2RlNCk7CiAgICB9CiAgICBpZiAoc2l6ZSA+PSAzICYmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSkgewogICAgICBlZmZlY3RzLmV4aXQoInRoZW1hdGljQnJlYWsiKTsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gc2VxdWVuY2UoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbWFya2VyKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHNpemUrKzsKICAgICAgcmV0dXJuIHNlcXVlbmNlOwogICAgfQogICAgZWZmZWN0cy5leGl0KCJ0aGVtYXRpY0JyZWFrU2VxdWVuY2UiKTsKICAgIHJldHVybiBtYXJrZG93blNwYWNlKGNvZGU0KSA/IGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhdEJyZWFrLCAid2hpdGVzcGFjZSIpKGNvZGU0KSA6IGF0QnJlYWsoY29kZTQpOwogIH0KfQp2YXIgdGhlbWF0aWNCcmVhazI7CnZhciBpbml0X3RoZW1hdGljX2JyZWFrMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvbGliL3RoZW1hdGljLWJyZWFrLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX2ZhY3Rvcnlfc3BhY2UoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgICB0aGVtYXRpY0JyZWFrMiA9IHsKICAgICAgbmFtZTogInRoZW1hdGljQnJlYWsiLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVUaGVtYXRpY0JyZWFrCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvbGlzdC5qcwpmdW5jdGlvbiB0b2tlbml6ZUxpc3RTdGFydChlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBjb25zdCB0YWlsID0gc2VsZjIuZXZlbnRzW3NlbGYyLmV2ZW50cy5sZW5ndGggLSAxXTsKICBsZXQgaW5pdGlhbFNpemUgPSB0YWlsICYmIHRhaWxbMV0udHlwZSA9PT0gImxpbmVQcmVmaXgiID8gdGFpbFsyXS5zbGljZVNlcmlhbGl6ZSh0YWlsWzFdLCB0cnVlKS5sZW5ndGggOiAwOwogIGxldCBzaXplID0gMDsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGNvbnN0IGtpbmQgPSBzZWxmMi5jb250YWluZXJTdGF0ZS50eXBlIHx8IChjb2RlNCA9PT0gNDIgfHwgY29kZTQgPT09IDQzIHx8IGNvZGU0ID09PSA0NSA/ICJsaXN0VW5vcmRlcmVkIiA6ICJsaXN0T3JkZXJlZCIpOwogICAgaWYgKGtpbmQgPT09ICJsaXN0VW5vcmRlcmVkIiA/ICFzZWxmMi5jb250YWluZXJTdGF0ZS5tYXJrZXIgfHwgY29kZTQgPT09IHNlbGYyLmNvbnRhaW5lclN0YXRlLm1hcmtlciA6IGFzY2lpRGlnaXQoY29kZTQpKSB7CiAgICAgIGlmICghc2VsZjIuY29udGFpbmVyU3RhdGUudHlwZSkgewogICAgICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlLnR5cGUgPSBraW5kOwogICAgICAgIGVmZmVjdHMuZW50ZXIoa2luZCwgewogICAgICAgICAgX2NvbnRhaW5lcjogdHJ1ZQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGlmIChraW5kID09PSAibGlzdFVub3JkZXJlZCIpIHsKICAgICAgICBlZmZlY3RzLmVudGVyKCJsaXN0SXRlbVByZWZpeCIpOwogICAgICAgIHJldHVybiBjb2RlNCA9PT0gNDIgfHwgY29kZTQgPT09IDQ1ID8gZWZmZWN0cy5jaGVjayh0aGVtYXRpY0JyZWFrMiwgbm9rLCBhdE1hcmtlcikoY29kZTQpIDogYXRNYXJrZXIoY29kZTQpOwogICAgICB9CiAgICAgIGlmICghc2VsZjIuaW50ZXJydXB0IHx8IGNvZGU0ID09PSA0OSkgewogICAgICAgIGVmZmVjdHMuZW50ZXIoImxpc3RJdGVtUHJlZml4Iik7CiAgICAgICAgZWZmZWN0cy5lbnRlcigibGlzdEl0ZW1WYWx1ZSIpOwogICAgICAgIHJldHVybiBpbnNpZGUoY29kZTQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gaW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoYXNjaWlEaWdpdChjb2RlNCkgJiYgKytzaXplIDwgMTApIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGluc2lkZTsKICAgIH0KICAgIGlmICgoIXNlbGYyLmludGVycnVwdCB8fCBzaXplIDwgMikgJiYgKHNlbGYyLmNvbnRhaW5lclN0YXRlLm1hcmtlciA/IGNvZGU0ID09PSBzZWxmMi5jb250YWluZXJTdGF0ZS5tYXJrZXIgOiBjb2RlNCA9PT0gNDEgfHwgY29kZTQgPT09IDQ2KSkgewogICAgICBlZmZlY3RzLmV4aXQoImxpc3RJdGVtVmFsdWUiKTsKICAgICAgcmV0dXJuIGF0TWFya2VyKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBhdE1hcmtlcihjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigibGlzdEl0ZW1NYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpc3RJdGVtTWFya2VyIik7CiAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5tYXJrZXIgPSBzZWxmMi5jb250YWluZXJTdGF0ZS5tYXJrZXIgfHwgY29kZTQ7CiAgICByZXR1cm4gZWZmZWN0cy5jaGVjaygKICAgICAgYmxhbmtMaW5lLAogICAgICAvLyBDYW7igJl0IGJlIGVtcHR5IHdoZW4gaW50ZXJydXB0aW5nLgogICAgICBzZWxmMi5pbnRlcnJ1cHQgPyBub2sgOiBvbkJsYW5rLAogICAgICBlZmZlY3RzLmF0dGVtcHQobGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlQ29uc3RydWN0LCBlbmRPZlByZWZpeCwgb3RoZXJQcmVmaXgpCiAgICApOwogIH0KICBmdW5jdGlvbiBvbkJsYW5rKGNvZGU0KSB7CiAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5pbml0aWFsQmxhbmtMaW5lID0gdHJ1ZTsKICAgIGluaXRpYWxTaXplKys7CiAgICByZXR1cm4gZW5kT2ZQcmVmaXgoY29kZTQpOwogIH0KICBmdW5jdGlvbiBvdGhlclByZWZpeChjb2RlNCkgewogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoImxpc3RJdGVtUHJlZml4V2hpdGVzcGFjZSIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImxpc3RJdGVtUHJlZml4V2hpdGVzcGFjZSIpOwogICAgICByZXR1cm4gZW5kT2ZQcmVmaXg7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gZW5kT2ZQcmVmaXgoY29kZTQpIHsKICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlLnNpemUgPSBpbml0aWFsU2l6ZSArIHNlbGYyLnNsaWNlU2VyaWFsaXplKGVmZmVjdHMuZXhpdCgibGlzdEl0ZW1QcmVmaXgiKSwgdHJ1ZSkubGVuZ3RoOwogICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgfQp9CmZ1bmN0aW9uIHRva2VuaXplTGlzdENvbnRpbnVhdGlvbihlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBzZWxmMi5jb250YWluZXJTdGF0ZS5fY2xvc2VGbG93ID0gdm9pZCAwOwogIHJldHVybiBlZmZlY3RzLmNoZWNrKGJsYW5rTGluZSwgb25CbGFuaywgbm90QmxhbmspOwogIGZ1bmN0aW9uIG9uQmxhbmsoY29kZTQpIHsKICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlLmZ1cnRoZXJCbGFua0xpbmVzID0gc2VsZjIuY29udGFpbmVyU3RhdGUuZnVydGhlckJsYW5rTGluZXMgfHwgc2VsZjIuY29udGFpbmVyU3RhdGUuaW5pdGlhbEJsYW5rTGluZTsKICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgb2szLCAibGlzdEl0ZW1JbmRlbnQiLCBzZWxmMi5jb250YWluZXJTdGF0ZS5zaXplICsgMSkoY29kZTQpOwogIH0KICBmdW5jdGlvbiBub3RCbGFuayhjb2RlNCkgewogICAgaWYgKHNlbGYyLmNvbnRhaW5lclN0YXRlLmZ1cnRoZXJCbGFua0xpbmVzIHx8ICFtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5mdXJ0aGVyQmxhbmtMaW5lcyA9IHZvaWQgMDsKICAgICAgc2VsZjIuY29udGFpbmVyU3RhdGUuaW5pdGlhbEJsYW5rTGluZSA9IHZvaWQgMDsKICAgICAgcmV0dXJuIG5vdEluQ3VycmVudEl0ZW0oY29kZTQpOwogICAgfQogICAgc2VsZjIuY29udGFpbmVyU3RhdGUuZnVydGhlckJsYW5rTGluZXMgPSB2b2lkIDA7CiAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5pbml0aWFsQmxhbmtMaW5lID0gdm9pZCAwOwogICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChpbmRlbnRDb25zdHJ1Y3QsIG9rMywgbm90SW5DdXJyZW50SXRlbSkoY29kZTQpOwogIH0KICBmdW5jdGlvbiBub3RJbkN1cnJlbnRJdGVtKGNvZGU0KSB7CiAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5fY2xvc2VGbG93ID0gdHJ1ZTsKICAgIHNlbGYyLmludGVycnVwdCA9IHZvaWQgMDsKICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgZWZmZWN0cy5hdHRlbXB0KGxpc3QzLCBvazMsIG5vayksICJsaW5lUHJlZml4Iiwgc2VsZjIucGFyc2VyLmNvbnN0cnVjdHMuZGlzYWJsZS5udWxsLmluY2x1ZGVzKCJjb2RlSW5kZW50ZWQiKSA/IHZvaWQgMCA6IDQpKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVJbmRlbnQoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlclByZWZpeCwgImxpc3RJdGVtSW5kZW50Iiwgc2VsZjIuY29udGFpbmVyU3RhdGUuc2l6ZSArIDEpOwogIGZ1bmN0aW9uIGFmdGVyUHJlZml4KGNvZGU0KSB7CiAgICBjb25zdCB0YWlsID0gc2VsZjIuZXZlbnRzW3NlbGYyLmV2ZW50cy5sZW5ndGggLSAxXTsKICAgIHJldHVybiB0YWlsICYmIHRhaWxbMV0udHlwZSA9PT0gImxpc3RJdGVtSW5kZW50IiAmJiB0YWlsWzJdLnNsaWNlU2VyaWFsaXplKHRhaWxbMV0sIHRydWUpLmxlbmd0aCA9PT0gc2VsZjIuY29udGFpbmVyU3RhdGUuc2l6ZSA/IG9rMyhjb2RlNCkgOiBub2soY29kZTQpOwogIH0KfQpmdW5jdGlvbiB0b2tlbml6ZUxpc3RFbmQoZWZmZWN0cykgewogIGVmZmVjdHMuZXhpdCh0aGlzLmNvbnRhaW5lclN0YXRlLnR5cGUpOwp9CmZ1bmN0aW9uIHRva2VuaXplTGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXJQcmVmaXgsICJsaXN0SXRlbVByZWZpeFdoaXRlc3BhY2UiLCBzZWxmMi5wYXJzZXIuY29uc3RydWN0cy5kaXNhYmxlLm51bGwuaW5jbHVkZXMoImNvZGVJbmRlbnRlZCIpID8gdm9pZCAwIDogNCArIDEpOwogIGZ1bmN0aW9uIGFmdGVyUHJlZml4KGNvZGU0KSB7CiAgICBjb25zdCB0YWlsID0gc2VsZjIuZXZlbnRzW3NlbGYyLmV2ZW50cy5sZW5ndGggLSAxXTsKICAgIHJldHVybiAhbWFya2Rvd25TcGFjZShjb2RlNCkgJiYgdGFpbCAmJiB0YWlsWzFdLnR5cGUgPT09ICJsaXN0SXRlbVByZWZpeFdoaXRlc3BhY2UiID8gb2szKGNvZGU0KSA6IG5vayhjb2RlNCk7CiAgfQp9CnZhciBsaXN0MywgbGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlQ29uc3RydWN0LCBpbmRlbnRDb25zdHJ1Y3Q7CnZhciBpbml0X2xpc3QyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvbGlzdC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X3NwYWNlKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogICAgaW5pdF9ibGFua19saW5lKCk7CiAgICBpbml0X3RoZW1hdGljX2JyZWFrMigpOwogICAgbGlzdDMgPSB7CiAgICAgIGNvbnRpbnVhdGlvbjogewogICAgICAgIHRva2VuaXplOiB0b2tlbml6ZUxpc3RDb250aW51YXRpb24KICAgICAgfSwKICAgICAgZXhpdDogdG9rZW5pemVMaXN0RW5kLAogICAgICBuYW1lOiAibGlzdCIsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZUxpc3RTdGFydAogICAgfTsKICAgIGxpc3RJdGVtUHJlZml4V2hpdGVzcGFjZUNvbnN0cnVjdCA9IHsKICAgICAgcGFydGlhbDogdHJ1ZSwKICAgICAgdG9rZW5pemU6IHRva2VuaXplTGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlCiAgICB9OwogICAgaW5kZW50Q29uc3RydWN0ID0gewogICAgICBwYXJ0aWFsOiB0cnVlLAogICAgICB0b2tlbml6ZTogdG9rZW5pemVJbmRlbnQKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstY29yZS1jb21tb25tYXJrQDIuMC4zL25vZGVfbW9kdWxlcy9taWNyb21hcmstY29yZS1jb21tb25tYXJrL2xpYi9zZXRleHQtdW5kZXJsaW5lLmpzCmZ1bmN0aW9uIHJlc29sdmVUb1NldGV4dFVuZGVybGluZShldmVudHMsIGNvbnRleHQyKSB7CiAgbGV0IGluZGV4MiA9IGV2ZW50cy5sZW5ndGg7CiAgbGV0IGNvbnRlbnQzOwogIGxldCB0ZXh0OTsKICBsZXQgZGVmaW5pdGlvbjM7CiAgd2hpbGUgKGluZGV4Mi0tKSB7CiAgICBpZiAoZXZlbnRzW2luZGV4Ml1bMF0gPT09ICJlbnRlciIpIHsKICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJjb250ZW50IikgewogICAgICAgIGNvbnRlbnQzID0gaW5kZXgyOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAicGFyYWdyYXBoIikgewogICAgICAgIHRleHQ5ID0gaW5kZXgyOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAoZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImNvbnRlbnQiKSB7CiAgICAgICAgZXZlbnRzLnNwbGljZShpbmRleDIsIDEpOwogICAgICB9CiAgICAgIGlmICghZGVmaW5pdGlvbjMgJiYgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImRlZmluaXRpb24iKSB7CiAgICAgICAgZGVmaW5pdGlvbjMgPSBpbmRleDI7CiAgICAgIH0KICAgIH0KICB9CiAgY29uc3QgaGVhZGluZzMgPSB7CiAgICB0eXBlOiAic2V0ZXh0SGVhZGluZyIsCiAgICBzdGFydDogewogICAgICAuLi5ldmVudHNbY29udGVudDNdWzFdLnN0YXJ0CiAgICB9LAogICAgZW5kOiB7CiAgICAgIC4uLmV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV1bMV0uZW5kCiAgICB9CiAgfTsKICBldmVudHNbdGV4dDldWzFdLnR5cGUgPSAic2V0ZXh0SGVhZGluZ1RleHQiOwogIGlmIChkZWZpbml0aW9uMykgewogICAgZXZlbnRzLnNwbGljZSh0ZXh0OSwgMCwgWyJlbnRlciIsIGhlYWRpbmczLCBjb250ZXh0Ml0pOwogICAgZXZlbnRzLnNwbGljZShkZWZpbml0aW9uMyArIDEsIDAsIFsiZXhpdCIsIGV2ZW50c1tjb250ZW50M11bMV0sIGNvbnRleHQyXSk7CiAgICBldmVudHNbY29udGVudDNdWzFdLmVuZCA9IHsKICAgICAgLi4uZXZlbnRzW2RlZmluaXRpb24zXVsxXS5lbmQKICAgIH07CiAgfSBlbHNlIHsKICAgIGV2ZW50c1tjb250ZW50M11bMV0gPSBoZWFkaW5nMzsKICB9CiAgZXZlbnRzLnB1c2goWyJleGl0IiwgaGVhZGluZzMsIGNvbnRleHQyXSk7CiAgcmV0dXJuIGV2ZW50czsKfQpmdW5jdGlvbiB0b2tlbml6ZVNldGV4dFVuZGVybGluZShlZmZlY3RzLCBvazMsIG5vaykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBsZXQgbWFya2VyOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgbGV0IGluZGV4MiA9IHNlbGYyLmV2ZW50cy5sZW5ndGg7CiAgICBsZXQgcGFyYWdyYXBoMzsKICAgIHdoaWxlIChpbmRleDItLSkgewogICAgICBpZiAoc2VsZjIuZXZlbnRzW2luZGV4Ml1bMV0udHlwZSAhPT0gImxpbmVFbmRpbmciICYmIHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLnR5cGUgIT09ICJsaW5lUHJlZml4IiAmJiBzZWxmMi5ldmVudHNbaW5kZXgyXVsxXS50eXBlICE9PSAiY29udGVudCIpIHsKICAgICAgICBwYXJhZ3JhcGgzID0gc2VsZjIuZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gInBhcmFncmFwaCI7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmICghc2VsZjIucGFyc2VyLmxhenlbc2VsZjIubm93KCkubGluZV0gJiYgKHNlbGYyLmludGVycnVwdCB8fCBwYXJhZ3JhcGgzKSkgewogICAgICBlZmZlY3RzLmVudGVyKCJzZXRleHRIZWFkaW5nTGluZSIpOwogICAgICBtYXJrZXIgPSBjb2RlNDsKICAgICAgcmV0dXJuIGJlZm9yZShjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gYmVmb3JlKGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJzZXRleHRIZWFkaW5nTGluZVNlcXVlbmNlIik7CiAgICByZXR1cm4gaW5zaWRlKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gaW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG1hcmtlcikgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gaW5zaWRlOwogICAgfQogICAgZWZmZWN0cy5leGl0KCJzZXRleHRIZWFkaW5nTGluZVNlcXVlbmNlIik7CiAgICByZXR1cm4gbWFya2Rvd25TcGFjZShjb2RlNCkgPyBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXIsICJsaW5lU3VmZml4IikoY29kZTQpIDogYWZ0ZXIoY29kZTQpOwogIH0KICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJzZXRleHRIZWFkaW5nTGluZSIpOwogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KfQp2YXIgc2V0ZXh0VW5kZXJsaW5lOwp2YXIgaW5pdF9zZXRleHRfdW5kZXJsaW5lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWNvcmUtY29tbW9ubWFya0AyLjAuMy9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWNvcmUtY29tbW9ubWFyay9saWIvc2V0ZXh0LXVuZGVybGluZS5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X3NwYWNlKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogICAgc2V0ZXh0VW5kZXJsaW5lID0gewogICAgICBuYW1lOiAic2V0ZXh0VW5kZXJsaW5lIiwKICAgICAgcmVzb2x2ZVRvOiByZXNvbHZlVG9TZXRleHRVbmRlcmxpbmUsCiAgICAgIHRva2VuaXplOiB0b2tlbml6ZVNldGV4dFVuZGVybGluZQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvaW5kZXguanMKdmFyIGluaXRfbWljcm9tYXJrX2NvcmVfY29tbW9ubWFyayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmtAMi4wLjMvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1jb3JlLWNvbW1vbm1hcmsvaW5kZXguanMiKCkgewogICAgaW5pdF9hdHRlbnRpb24oKTsKICAgIGluaXRfYXV0b2xpbmsoKTsKICAgIGluaXRfYmxhbmtfbGluZSgpOwogICAgaW5pdF9ibG9ja19xdW90ZSgpOwogICAgaW5pdF9jaGFyYWN0ZXJfZXNjYXBlKCk7CiAgICBpbml0X2NoYXJhY3Rlcl9yZWZlcmVuY2UoKTsKICAgIGluaXRfY29kZV9mZW5jZWQoKTsKICAgIGluaXRfY29kZV9pbmRlbnRlZCgpOwogICAgaW5pdF9jb2RlX3RleHQoKTsKICAgIGluaXRfY29udGVudCgpOwogICAgaW5pdF9kZWZpbml0aW9uMigpOwogICAgaW5pdF9oYXJkX2JyZWFrX2VzY2FwZSgpOwogICAgaW5pdF9oZWFkaW5nX2F0eCgpOwogICAgaW5pdF9odG1sX2Zsb3coKTsKICAgIGluaXRfaHRtbF90ZXh0KCk7CiAgICBpbml0X2xhYmVsX2VuZCgpOwogICAgaW5pdF9sYWJlbF9zdGFydF9pbWFnZSgpOwogICAgaW5pdF9sYWJlbF9zdGFydF9saW5rKCk7CiAgICBpbml0X2xpbmVfZW5kaW5nKCk7CiAgICBpbml0X2xpc3QyKCk7CiAgICBpbml0X3NldGV4dF91bmRlcmxpbmUoKTsKICAgIGluaXRfdGhlbWF0aWNfYnJlYWsyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1mb290bm90ZUAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tZm9vdG5vdGUvbGliL3N5bnRheC5qcwpmdW5jdGlvbiBnZm1Gb290bm90ZSgpIHsKICByZXR1cm4gewogICAgZG9jdW1lbnQ6IHsKICAgICAgWzkxXTogewogICAgICAgIG5hbWU6ICJnZm1Gb290bm90ZURlZmluaXRpb24iLAogICAgICAgIHRva2VuaXplOiB0b2tlbml6ZURlZmluaXRpb25TdGFydCwKICAgICAgICBjb250aW51YXRpb246IHsKICAgICAgICAgIHRva2VuaXplOiB0b2tlbml6ZURlZmluaXRpb25Db250aW51YXRpb24KICAgICAgICB9LAogICAgICAgIGV4aXQ6IGdmbUZvb3Rub3RlRGVmaW5pdGlvbkVuZAogICAgICB9CiAgICB9LAogICAgdGV4dDogewogICAgICBbOTFdOiB7CiAgICAgICAgbmFtZTogImdmbUZvb3Rub3RlQ2FsbCIsCiAgICAgICAgdG9rZW5pemU6IHRva2VuaXplR2ZtRm9vdG5vdGVDYWxsCiAgICAgIH0sCiAgICAgIFs5M106IHsKICAgICAgICBuYW1lOiAiZ2ZtUG90ZW50aWFsRm9vdG5vdGVDYWxsIiwKICAgICAgICBhZGQ6ICJhZnRlciIsCiAgICAgICAgdG9rZW5pemU6IHRva2VuaXplUG90ZW50aWFsR2ZtRm9vdG5vdGVDYWxsLAogICAgICAgIHJlc29sdmVUbzogcmVzb2x2ZVRvUG90ZW50aWFsR2ZtRm9vdG5vdGVDYWxsCiAgICAgIH0KICAgIH0KICB9Owp9CmZ1bmN0aW9uIHRva2VuaXplUG90ZW50aWFsR2ZtRm9vdG5vdGVDYWxsKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGxldCBpbmRleDIgPSBzZWxmMi5ldmVudHMubGVuZ3RoOwogIGNvbnN0IGRlZmluZWQgPSBzZWxmMi5wYXJzZXIuZ2ZtRm9vdG5vdGVzIHx8IChzZWxmMi5wYXJzZXIuZ2ZtRm9vdG5vdGVzID0gW10pOwogIGxldCBsYWJlbFN0YXJ0OwogIHdoaWxlIChpbmRleDItLSkgewogICAgY29uc3QgdG9rZW4gPSBzZWxmMi5ldmVudHNbaW5kZXgyXVsxXTsKICAgIGlmICh0b2tlbi50eXBlID09PSAibGFiZWxJbWFnZSIpIHsKICAgICAgbGFiZWxTdGFydCA9IHRva2VuOwogICAgICBicmVhazsKICAgIH0KICAgIGlmICh0b2tlbi50eXBlID09PSAiZ2ZtRm9vdG5vdGVDYWxsIiB8fCB0b2tlbi50eXBlID09PSAibGFiZWxMaW5rIiB8fCB0b2tlbi50eXBlID09PSAibGFiZWwiIHx8IHRva2VuLnR5cGUgPT09ICJpbWFnZSIgfHwgdG9rZW4udHlwZSA9PT0gImxpbmsiKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGlmICghbGFiZWxTdGFydCB8fCAhbGFiZWxTdGFydC5fYmFsYW5jZWQpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBjb25zdCBpZCA9IG5vcm1hbGl6ZUlkZW50aWZpZXIoc2VsZjIuc2xpY2VTZXJpYWxpemUoewogICAgICBzdGFydDogbGFiZWxTdGFydC5lbmQsCiAgICAgIGVuZDogc2VsZjIubm93KCkKICAgIH0pKTsKICAgIGlmIChpZC5jb2RlUG9pbnRBdCgwKSAhPT0gOTQgfHwgIWRlZmluZWQuaW5jbHVkZXMoaWQuc2xpY2UoMSkpKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigiZ2ZtRm9vdG5vdGVDYWxsTGFiZWxNYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImdmbUZvb3Rub3RlQ2FsbExhYmVsTWFya2VyIik7CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gcmVzb2x2ZVRvUG90ZW50aWFsR2ZtRm9vdG5vdGVDYWxsKGV2ZW50cywgY29udGV4dDIpIHsKICBsZXQgaW5kZXgyID0gZXZlbnRzLmxlbmd0aDsKICBsZXQgbGFiZWxTdGFydDsKICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgIGlmIChldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAibGFiZWxJbWFnZSIgJiYgZXZlbnRzW2luZGV4Ml1bMF0gPT09ICJlbnRlciIpIHsKICAgICAgbGFiZWxTdGFydCA9IGV2ZW50c1tpbmRleDJdWzFdOwogICAgICBicmVhazsKICAgIH0KICB9CiAgZXZlbnRzW2luZGV4MiArIDFdWzFdLnR5cGUgPSAiZGF0YSI7CiAgZXZlbnRzW2luZGV4MiArIDNdWzFdLnR5cGUgPSAiZ2ZtRm9vdG5vdGVDYWxsTGFiZWxNYXJrZXIiOwogIGNvbnN0IGNhbGwgPSB7CiAgICB0eXBlOiAiZ2ZtRm9vdG5vdGVDYWxsIiwKICAgIHN0YXJ0OiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbaW5kZXgyICsgM11bMV0uc3RhcnQpLAogICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdWzFdLmVuZCkKICB9OwogIGNvbnN0IG1hcmtlciA9IHsKICAgIHR5cGU6ICJnZm1Gb290bm90ZUNhbGxNYXJrZXIiLAogICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50c1tpbmRleDIgKyAzXVsxXS5lbmQpLAogICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbaW5kZXgyICsgM11bMV0uZW5kKQogIH07CiAgbWFya2VyLmVuZC5jb2x1bW4rKzsKICBtYXJrZXIuZW5kLm9mZnNldCsrOwogIG1hcmtlci5lbmQuX2J1ZmZlckluZGV4Kys7CiAgY29uc3Qgc3RyaW5nMyA9IHsKICAgIHR5cGU6ICJnZm1Gb290bm90ZUNhbGxTdHJpbmciLAogICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIG1hcmtlci5lbmQpLAogICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdWzFdLnN0YXJ0KQogIH07CiAgY29uc3QgY2h1bmsgPSB7CiAgICB0eXBlOiAiY2h1bmtTdHJpbmciLAogICAgY29udGVudFR5cGU6ICJzdHJpbmciLAogICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIHN0cmluZzMuc3RhcnQpLAogICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBzdHJpbmczLmVuZCkKICB9OwogIGNvbnN0IHJlcGxhY2VtZW50ID0gWwogICAgLy8gVGFrZSB0aGUgYGxhYmVsSW1hZ2VNYXJrZXJgIChub3cgYGRhdGFgLCB0aGUgYCFgKQogICAgZXZlbnRzW2luZGV4MiArIDFdLAogICAgZXZlbnRzW2luZGV4MiArIDJdLAogICAgWyJlbnRlciIsIGNhbGwsIGNvbnRleHQyXSwKICAgIC8vIFRoZSBgW2AKICAgIGV2ZW50c1tpbmRleDIgKyAzXSwKICAgIGV2ZW50c1tpbmRleDIgKyA0XSwKICAgIC8vIFRoZSBgXmAuCiAgICBbImVudGVyIiwgbWFya2VyLCBjb250ZXh0Ml0sCiAgICBbImV4aXQiLCBtYXJrZXIsIGNvbnRleHQyXSwKICAgIC8vIEV2ZXJ5dGhpbmcgaW4gYmV0d2Vlbi4KICAgIFsiZW50ZXIiLCBzdHJpbmczLCBjb250ZXh0Ml0sCiAgICBbImVudGVyIiwgY2h1bmssIGNvbnRleHQyXSwKICAgIFsiZXhpdCIsIGNodW5rLCBjb250ZXh0Ml0sCiAgICBbImV4aXQiLCBzdHJpbmczLCBjb250ZXh0Ml0sCiAgICAvLyBUaGUgZW5kaW5nIChgXWAsIHByb3Blcmx5IHBhcnNlZCBhbmQgbGFiZWxsZWQpLgogICAgZXZlbnRzW2V2ZW50cy5sZW5ndGggLSAyXSwKICAgIGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV0sCiAgICBbImV4aXQiLCBjYWxsLCBjb250ZXh0Ml0KICBdOwogIGV2ZW50cy5zcGxpY2UoaW5kZXgyLCBldmVudHMubGVuZ3RoIC0gaW5kZXgyICsgMSwgLi4ucmVwbGFjZW1lbnQpOwogIHJldHVybiBldmVudHM7Cn0KZnVuY3Rpb24gdG9rZW5pemVHZm1Gb290bm90ZUNhbGwoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgY29uc3QgZGVmaW5lZCA9IHNlbGYyLnBhcnNlci5nZm1Gb290bm90ZXMgfHwgKHNlbGYyLnBhcnNlci5nZm1Gb290bm90ZXMgPSBbXSk7CiAgbGV0IHNpemUgPSAwOwogIGxldCBkYXRhOwogIHJldHVybiBzdGFydDsKICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigiZ2ZtRm9vdG5vdGVDYWxsIik7CiAgICBlZmZlY3RzLmVudGVyKCJnZm1Gb290bm90ZUNhbGxMYWJlbE1hcmtlciIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgiZ2ZtRm9vdG5vdGVDYWxsTGFiZWxNYXJrZXIiKTsKICAgIHJldHVybiBjYWxsU3RhcnQ7CiAgfQogIGZ1bmN0aW9uIGNhbGxTdGFydChjb2RlNCkgewogICAgaWYgKGNvZGU0ICE9PSA5NCkgcmV0dXJuIG5vayhjb2RlNCk7CiAgICBlZmZlY3RzLmVudGVyKCJnZm1Gb290bm90ZUNhbGxNYXJrZXIiKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImdmbUZvb3Rub3RlQ2FsbE1hcmtlciIpOwogICAgZWZmZWN0cy5lbnRlcigiZ2ZtRm9vdG5vdGVDYWxsU3RyaW5nIik7CiAgICBlZmZlY3RzLmVudGVyKCJjaHVua1N0cmluZyIpLmNvbnRlbnRUeXBlID0gInN0cmluZyI7CiAgICByZXR1cm4gY2FsbERhdGE7CiAgfQogIGZ1bmN0aW9uIGNhbGxEYXRhKGNvZGU0KSB7CiAgICBpZiAoCiAgICAgIC8vIFRvbyBsb25nLgogICAgICBzaXplID4gOTk5IHx8IC8vIENsb3NpbmcgYnJhY2Ugd2l0aCBub3RoaW5nLgogICAgICBjb2RlNCA9PT0gOTMgJiYgIWRhdGEgfHwgLy8gU3BhY2Ugb3IgdGFiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgR0ZNIGZvciBzb21lIHJlYXNvbi4KICAgICAgLy8gYFxuYCBhbmQgYFtgIG5vdCBiZWluZyBzdXBwb3J0ZWQgbWFrZXMgc2Vuc2UuCiAgICAgIGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA5MSB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KQogICAgKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rU3RyaW5nIik7CiAgICAgIGNvbnN0IHRva2VuID0gZWZmZWN0cy5leGl0KCJnZm1Gb290bm90ZUNhbGxTdHJpbmciKTsKICAgICAgaWYgKCFkZWZpbmVkLmluY2x1ZGVzKG5vcm1hbGl6ZUlkZW50aWZpZXIoc2VsZjIuc2xpY2VTZXJpYWxpemUodG9rZW4pKSkpIHsKICAgICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgICAgfQogICAgICBlZmZlY3RzLmVudGVyKCJnZm1Gb290bm90ZUNhbGxMYWJlbE1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImdmbUZvb3Rub3RlQ2FsbExhYmVsTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiZ2ZtRm9vdG5vdGVDYWxsIik7CiAgICAgIHJldHVybiBvazM7CiAgICB9CiAgICBpZiAoIW1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIGRhdGEgPSB0cnVlOwogICAgfQogICAgc2l6ZSsrOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb2RlNCA9PT0gOTIgPyBjYWxsRXNjYXBlIDogY2FsbERhdGE7CiAgfQogIGZ1bmN0aW9uIGNhbGxFc2NhcGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTEgfHwgY29kZTQgPT09IDkyIHx8IGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBzaXplKys7CiAgICAgIHJldHVybiBjYWxsRGF0YTsKICAgIH0KICAgIHJldHVybiBjYWxsRGF0YShjb2RlNCk7CiAgfQp9CmZ1bmN0aW9uIHRva2VuaXplRGVmaW5pdGlvblN0YXJ0KGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGNvbnN0IGRlZmluZWQgPSBzZWxmMi5wYXJzZXIuZ2ZtRm9vdG5vdGVzIHx8IChzZWxmMi5wYXJzZXIuZ2ZtRm9vdG5vdGVzID0gW10pOwogIGxldCBpZGVudGlmaWVyOwogIGxldCBzaXplID0gMDsKICBsZXQgZGF0YTsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGVmZmVjdHMuZW50ZXIoImdmbUZvb3Rub3RlRGVmaW5pdGlvbiIpLl9jb250YWluZXIgPSB0cnVlOwogICAgZWZmZWN0cy5lbnRlcigiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uTGFiZWwiKTsKICAgIGVmZmVjdHMuZW50ZXIoImdmbUZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsTWFya2VyIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbE1hcmtlciIpOwogICAgcmV0dXJuIGxhYmVsQXRNYXJrZXI7CiAgfQogIGZ1bmN0aW9uIGxhYmVsQXRNYXJrZXIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTQpIHsKICAgICAgZWZmZWN0cy5lbnRlcigiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZW50ZXIoImdmbUZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsU3RyaW5nIik7CiAgICAgIGVmZmVjdHMuZW50ZXIoImNodW5rU3RyaW5nIikuY29udGVudFR5cGUgPSAic3RyaW5nIjsKICAgICAgcmV0dXJuIGxhYmVsSW5zaWRlOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGxhYmVsSW5zaWRlKGNvZGU0KSB7CiAgICBpZiAoCiAgICAgIC8vIFRvbyBsb25nLgogICAgICBzaXplID4gOTk5IHx8IC8vIENsb3NpbmcgYnJhY2Ugd2l0aCBub3RoaW5nLgogICAgICBjb2RlNCA9PT0gOTMgJiYgIWRhdGEgfHwgLy8gU3BhY2Ugb3IgdGFiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgR0ZNIGZvciBzb21lIHJlYXNvbi4KICAgICAgLy8gYFxuYCBhbmQgYFtgIG5vdCBiZWluZyBzdXBwb3J0ZWQgbWFrZXMgc2Vuc2UuCiAgICAgIGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSA5MSB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KQogICAgKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgaWYgKGNvZGU0ID09PSA5MykgewogICAgICBlZmZlY3RzLmV4aXQoImNodW5rU3RyaW5nIik7CiAgICAgIGNvbnN0IHRva2VuID0gZWZmZWN0cy5leGl0KCJnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZyIpOwogICAgICBpZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcihzZWxmMi5zbGljZVNlcmlhbGl6ZSh0b2tlbikpOwogICAgICBlZmZlY3RzLmVudGVyKCJnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbE1hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImdmbUZvb3Rub3RlRGVmaW5pdGlvbkxhYmVsTWFya2VyIik7CiAgICAgIGVmZmVjdHMuZXhpdCgiZ2ZtRm9vdG5vdGVEZWZpbml0aW9uTGFiZWwiKTsKICAgICAgcmV0dXJuIGxhYmVsQWZ0ZXI7CiAgICB9CiAgICBpZiAoIW1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZTQpKSB7CiAgICAgIGRhdGEgPSB0cnVlOwogICAgfQogICAgc2l6ZSsrOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb2RlNCA9PT0gOTIgPyBsYWJlbEVzY2FwZSA6IGxhYmVsSW5zaWRlOwogIH0KICBmdW5jdGlvbiBsYWJlbEVzY2FwZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA5MSB8fCBjb2RlNCA9PT0gOTIgfHwgY29kZTQgPT09IDkzKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHNpemUrKzsKICAgICAgcmV0dXJuIGxhYmVsSW5zaWRlOwogICAgfQogICAgcmV0dXJuIGxhYmVsSW5zaWRlKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gbGFiZWxBZnRlcihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA1OCkgewogICAgICBlZmZlY3RzLmVudGVyKCJkZWZpbml0aW9uTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgiZGVmaW5pdGlvbk1hcmtlciIpOwogICAgICBpZiAoIWRlZmluZWQuaW5jbHVkZXMoaWRlbnRpZmllcikpIHsKICAgICAgICBkZWZpbmVkLnB1c2goaWRlbnRpZmllcik7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCB3aGl0ZXNwYWNlQWZ0ZXIsICJnZm1Gb290bm90ZURlZmluaXRpb25XaGl0ZXNwYWNlIik7CiAgICB9CiAgICByZXR1cm4gbm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gd2hpdGVzcGFjZUFmdGVyKGNvZGU0KSB7CiAgICByZXR1cm4gb2szKGNvZGU0KTsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVEZWZpbml0aW9uQ29udGludWF0aW9uKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgcmV0dXJuIGVmZmVjdHMuY2hlY2soYmxhbmtMaW5lLCBvazMsIGVmZmVjdHMuYXR0ZW1wdChpbmRlbnQyLCBvazMsIG5vaykpOwp9CmZ1bmN0aW9uIGdmbUZvb3Rub3RlRGVmaW5pdGlvbkVuZChlZmZlY3RzKSB7CiAgZWZmZWN0cy5leGl0KCJnZm1Gb290bm90ZURlZmluaXRpb24iKTsKfQpmdW5jdGlvbiB0b2tlbml6ZUluZGVudDIoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlclByZWZpeCwgImdmbUZvb3Rub3RlRGVmaW5pdGlvbkluZGVudCIsIDQgKyAxKTsKICBmdW5jdGlvbiBhZnRlclByZWZpeChjb2RlNCkgewogICAgY29uc3QgdGFpbCA9IHNlbGYyLmV2ZW50c1tzZWxmMi5ldmVudHMubGVuZ3RoIC0gMV07CiAgICByZXR1cm4gdGFpbCAmJiB0YWlsWzFdLnR5cGUgPT09ICJnZm1Gb290bm90ZURlZmluaXRpb25JbmRlbnQiICYmIHRhaWxbMl0uc2xpY2VTZXJpYWxpemUodGFpbFsxXSwgdHJ1ZSkubGVuZ3RoID09PSA0ID8gb2szKGNvZGU0KSA6IG5vayhjb2RlNCk7CiAgfQp9CnZhciBpbmRlbnQyOwp2YXIgaW5pdF9zeW50YXgyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tZm9vdG5vdGVAMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLWZvb3Rub3RlL2xpYi9zeW50YXguanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfY29yZV9jb21tb25tYXJrKCk7CiAgICBpbml0X21pY3JvbWFya19mYWN0b3J5X3NwYWNlKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NoYXJhY3RlcigpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9ub3JtYWxpemVfaWRlbnRpZmllcigpOwogICAgaW5kZW50MiA9IHsKICAgICAgdG9rZW5pemU6IHRva2VuaXplSW5kZW50MiwKICAgICAgcGFydGlhbDogdHJ1ZQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLWZvb3Rub3RlQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1mb290bm90ZS9saWIvaHRtbC5qcwpmdW5jdGlvbiBkZWZhdWx0QmFja0xhYmVsKHJlZmVyZW5jZUluZGV4LCByZXJlZmVyZW5jZUluZGV4KSB7CiAgcmV0dXJuICJCYWNrIHRvIHJlZmVyZW5jZSAiICsgKHJlZmVyZW5jZUluZGV4ICsgMSkgKyAocmVyZWZlcmVuY2VJbmRleCA+IDEgPyAiLSIgKyByZXJlZmVyZW5jZUluZGV4IDogIiIpOwp9CmZ1bmN0aW9uIGdmbUZvb3Rub3RlSHRtbChvcHRpb25zKSB7CiAgY29uc3QgY29uZmlnMyA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zMjsKICBjb25zdCBsYWJlbCA9IGNvbmZpZzMubGFiZWwgfHwgIkZvb3Rub3RlcyI7CiAgY29uc3QgbGFiZWxUYWdOYW1lID0gY29uZmlnMy5sYWJlbFRhZ05hbWUgfHwgImgyIjsKICBjb25zdCBsYWJlbEF0dHJpYnV0ZXMgPSBjb25maWczLmxhYmVsQXR0cmlidXRlcyA9PT0gbnVsbCB8fCBjb25maWczLmxhYmVsQXR0cmlidXRlcyA9PT0gdm9pZCAwID8gJ2NsYXNzPSJzci1vbmx5IicgOiBjb25maWczLmxhYmVsQXR0cmlidXRlczsKICBjb25zdCBiYWNrTGFiZWwgPSBjb25maWczLmJhY2tMYWJlbCB8fCBkZWZhdWx0QmFja0xhYmVsOwogIGNvbnN0IGNsb2JiZXJQcmVmaXggPSBjb25maWczLmNsb2JiZXJQcmVmaXggPT09IG51bGwgfHwgY29uZmlnMy5jbG9iYmVyUHJlZml4ID09PSB2b2lkIDAgPyAidXNlci1jb250ZW50LSIgOiBjb25maWczLmNsb2JiZXJQcmVmaXg7CiAgcmV0dXJuIHsKICAgIGVudGVyOiB7CiAgICAgIGdmbUZvb3Rub3RlRGVmaW5pdGlvbigpIHsKICAgICAgICBjb25zdCBzdGFjayA9IHRoaXMuZ2V0RGF0YSgidGlnaHRTdGFjayIpOwogICAgICAgIHN0YWNrLnB1c2goZmFsc2UpOwogICAgICB9LAogICAgICBnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZygpIHsKICAgICAgICB0aGlzLmJ1ZmZlcigpOwogICAgICB9LAogICAgICBnZm1Gb290bm90ZUNhbGxTdHJpbmcoKSB7CiAgICAgICAgdGhpcy5idWZmZXIoKTsKICAgICAgfQogICAgfSwKICAgIGV4aXQ6IHsKICAgICAgZ2ZtRm9vdG5vdGVEZWZpbml0aW9uKCkgewogICAgICAgIGxldCBkZWZpbml0aW9ucyA9IHRoaXMuZ2V0RGF0YSgiZ2ZtRm9vdG5vdGVEZWZpbml0aW9ucyIpOwogICAgICAgIGNvbnN0IGZvb3Rub3RlU3RhY2sgPSB0aGlzLmdldERhdGEoImdmbUZvb3Rub3RlRGVmaW5pdGlvblN0YWNrIik7CiAgICAgICAgY29uc3QgdGlnaHRTdGFjayA9IHRoaXMuZ2V0RGF0YSgidGlnaHRTdGFjayIpOwogICAgICAgIGNvbnN0IGN1cnJlbnQgPSBmb290bm90ZVN0YWNrLnBvcCgpOwogICAgICAgIGNvbnN0IHZhbHVlMiA9IHRoaXMucmVzdW1lKCk7CiAgICAgICAgaWYgKCFkZWZpbml0aW9ucykgewogICAgICAgICAgdGhpcy5zZXREYXRhKCJnZm1Gb290bm90ZURlZmluaXRpb25zIiwgZGVmaW5pdGlvbnMgPSB7fSk7CiAgICAgICAgfQogICAgICAgIGlmICghb3duNC5jYWxsKGRlZmluaXRpb25zLCBjdXJyZW50KSkgZGVmaW5pdGlvbnNbY3VycmVudF0gPSB2YWx1ZTI7CiAgICAgICAgdGlnaHRTdGFjay5wb3AoKTsKICAgICAgICB0aGlzLnNldERhdGEoInNsdXJwT25lTGluZUVuZGluZyIsIHRydWUpOwogICAgICAgIHRoaXMuc2V0RGF0YSgibGFzdFdhc1RhZyIpOwogICAgICB9LAogICAgICBnZm1Gb290bm90ZURlZmluaXRpb25MYWJlbFN0cmluZyh0b2tlbikgewogICAgICAgIGxldCBmb290bm90ZVN0YWNrID0gdGhpcy5nZXREYXRhKCJnZm1Gb290bm90ZURlZmluaXRpb25TdGFjayIpOwogICAgICAgIGlmICghZm9vdG5vdGVTdGFjaykgewogICAgICAgICAgdGhpcy5zZXREYXRhKCJnZm1Gb290bm90ZURlZmluaXRpb25TdGFjayIsIGZvb3Rub3RlU3RhY2sgPSBbXSk7CiAgICAgICAgfQogICAgICAgIGZvb3Rub3RlU3RhY2sucHVzaChub3JtYWxpemVJZGVudGlmaWVyKHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pKSk7CiAgICAgICAgdGhpcy5yZXN1bWUoKTsKICAgICAgICB0aGlzLmJ1ZmZlcigpOwogICAgICB9LAogICAgICBnZm1Gb290bm90ZUNhbGxTdHJpbmcodG9rZW4pIHsKICAgICAgICBsZXQgY2FsbHMgPSB0aGlzLmdldERhdGEoImdmbUZvb3Rub3RlQ2FsbE9yZGVyIik7CiAgICAgICAgbGV0IGNvdW50cyA9IHRoaXMuZ2V0RGF0YSgiZ2ZtRm9vdG5vdGVDYWxsQ291bnRzIik7CiAgICAgICAgY29uc3QgaWQgPSBub3JtYWxpemVJZGVudGlmaWVyKHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pKTsKICAgICAgICBsZXQgY291bnRlcjI7CiAgICAgICAgdGhpcy5yZXN1bWUoKTsKICAgICAgICBpZiAoIWNhbGxzKSB0aGlzLnNldERhdGEoImdmbUZvb3Rub3RlQ2FsbE9yZGVyIiwgY2FsbHMgPSBbXSk7CiAgICAgICAgaWYgKCFjb3VudHMpIHRoaXMuc2V0RGF0YSgiZ2ZtRm9vdG5vdGVDYWxsQ291bnRzIiwgY291bnRzID0ge30pOwogICAgICAgIGNvbnN0IGluZGV4MiA9IGNhbGxzLmluZGV4T2YoaWQpOwogICAgICAgIGNvbnN0IHNhZmVJZCA9IHNhbml0aXplVXJpKGlkLnRvTG93ZXJDYXNlKCkpOwogICAgICAgIGlmIChpbmRleDIgPT09IC0xKSB7CiAgICAgICAgICBjYWxscy5wdXNoKGlkKTsKICAgICAgICAgIGNvdW50c1tpZF0gPSAxOwogICAgICAgICAgY291bnRlcjIgPSBjYWxscy5sZW5ndGg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvdW50c1tpZF0rKzsKICAgICAgICAgIGNvdW50ZXIyID0gaW5kZXgyICsgMTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmV1c2VDb3VudGVyID0gY291bnRzW2lkXTsKICAgICAgICB0aGlzLnRhZygnPHN1cD48YSBocmVmPSIjJyArIGNsb2JiZXJQcmVmaXggKyAiZm4tIiArIHNhZmVJZCArICciIGlkPSInICsgY2xvYmJlclByZWZpeCArICJmbnJlZi0iICsgc2FmZUlkICsgKHJldXNlQ291bnRlciA+IDEgPyAiLSIgKyByZXVzZUNvdW50ZXIgOiAiIikgKyAnIiBkYXRhLWZvb3Rub3RlLXJlZj0iIiBhcmlhLWRlc2NyaWJlZGJ5PSJmb290bm90ZS1sYWJlbCI+JyArIFN0cmluZyhjb3VudGVyMikgKyAiPC9hPjwvc3VwPiIpOwogICAgICB9LAogICAgICBudWxsKCkgewogICAgICAgIGNvbnN0IGNhbGxzID0gdGhpcy5nZXREYXRhKCJnZm1Gb290bm90ZUNhbGxPcmRlciIpIHx8IFtdOwogICAgICAgIGNvbnN0IGNvdW50cyA9IHRoaXMuZ2V0RGF0YSgiZ2ZtRm9vdG5vdGVDYWxsQ291bnRzIikgfHwge307CiAgICAgICAgY29uc3QgZGVmaW5pdGlvbnMgPSB0aGlzLmdldERhdGEoImdmbUZvb3Rub3RlRGVmaW5pdGlvbnMiKSB8fCB7fTsKICAgICAgICBsZXQgaW5kZXgyID0gLTE7CiAgICAgICAgaWYgKGNhbGxzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgICB0aGlzLnRhZygnPHNlY3Rpb24gZGF0YS1mb290bm90ZXM9IiIgY2xhc3M9ImZvb3Rub3RlcyI+PCcgKyBsYWJlbFRhZ05hbWUgKyAnIGlkPSJmb290bm90ZS1sYWJlbCInICsgKGxhYmVsQXR0cmlidXRlcyA/ICIgIiArIGxhYmVsQXR0cmlidXRlcyA6ICIiKSArICI+Iik7CiAgICAgICAgICB0aGlzLnJhdyh0aGlzLmVuY29kZShsYWJlbCkpOwogICAgICAgICAgdGhpcy50YWcoIjwvIiArIGxhYmVsVGFnTmFtZSArICI+Iik7CiAgICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgICAgdGhpcy50YWcoIjxvbD4iKTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKCsraW5kZXgyIDwgY2FsbHMubGVuZ3RoKSB7CiAgICAgICAgICBjb25zdCBpZCA9IGNhbGxzW2luZGV4Ml07CiAgICAgICAgICBjb25zdCBzYWZlSWQgPSBzYW5pdGl6ZVVyaShpZC50b0xvd2VyQ2FzZSgpKTsKICAgICAgICAgIGxldCByZWZlcmVuY2VJbmRleCA9IDA7CiAgICAgICAgICBjb25zdCByZWZlcmVuY2VzID0gW107CiAgICAgICAgICB3aGlsZSAoKytyZWZlcmVuY2VJbmRleCA8PSBjb3VudHNbaWRdKSB7CiAgICAgICAgICAgIHJlZmVyZW5jZXMucHVzaCgnPGEgaHJlZj0iIycgKyBjbG9iYmVyUHJlZml4ICsgImZucmVmLSIgKyBzYWZlSWQgKyAocmVmZXJlbmNlSW5kZXggPiAxID8gIi0iICsgcmVmZXJlbmNlSW5kZXggOiAiIikgKyAnIiBkYXRhLWZvb3Rub3RlLWJhY2tyZWY9IiIgYXJpYS1sYWJlbD0iJyArIHRoaXMuZW5jb2RlKHR5cGVvZiBiYWNrTGFiZWwgPT09ICJzdHJpbmciID8gYmFja0xhYmVsIDogYmFja0xhYmVsKGluZGV4MiwgcmVmZXJlbmNlSW5kZXgpKSArICciIGNsYXNzPSJkYXRhLWZvb3Rub3RlLWJhY2tyZWYiPlx1MjFBOScgKyAocmVmZXJlbmNlSW5kZXggPiAxID8gIjxzdXA+IiArIHJlZmVyZW5jZUluZGV4ICsgIjwvc3VwPiIgOiAiIikgKyAiPC9hPiIpOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gcmVmZXJlbmNlcy5qb2luKCIgIik7CiAgICAgICAgICBsZXQgaW5qZWN0ZWQgPSBmYWxzZTsKICAgICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgICB0aGlzLnRhZygnPGxpIGlkPSInICsgY2xvYmJlclByZWZpeCArICJmbi0iICsgc2FmZUlkICsgJyI+Jyk7CiAgICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgICAgdGhpcy50YWcoZGVmaW5pdGlvbnNbaWRdLnJlcGxhY2UoLzxcL3A+KD86XHI/XG58XHIpPyQvLCBmdW5jdGlvbigkMCkgewogICAgICAgICAgICBpbmplY3RlZCA9IHRydWU7CiAgICAgICAgICAgIHJldHVybiAiICIgKyByZWZlcmVuY2UgKyAkMDsKICAgICAgICAgIH0pKTsKICAgICAgICAgIGlmICghaW5qZWN0ZWQpIHsKICAgICAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICAgICAgdGhpcy50YWcocmVmZXJlbmNlKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgICB0aGlzLnRhZygiPC9saT4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNhbGxzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgICB0aGlzLnRhZygiPC9vbD4iKTsKICAgICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgICB0aGlzLnRhZygiPC9zZWN0aW9uPiIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07Cn0KdmFyIG93bjQsIGVtcHR5T3B0aW9uczI7CnZhciBpbml0X2h0bWwzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tZm9vdG5vdGVAMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLWZvb3Rub3RlL2xpYi9odG1sLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfbm9ybWFsaXplX2lkZW50aWZpZXIoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfc2FuaXRpemVfdXJpKCk7CiAgICBvd240ID0ge30uaGFzT3duUHJvcGVydHk7CiAgICBlbXB0eU9wdGlvbnMyID0ge307CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1mb290bm90ZUAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tZm9vdG5vdGUvaW5kZXguanMKdmFyIGluaXRfbWljcm9tYXJrX2V4dGVuc2lvbl9nZm1fZm9vdG5vdGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1mb290bm90ZUAyLjEuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tZm9vdG5vdGUvaW5kZXguanMiKCkgewogICAgaW5pdF9zeW50YXgyKCk7CiAgICBpbml0X2h0bWwzKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1zdHJpa2V0aHJvdWdoQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1zdHJpa2V0aHJvdWdoL2xpYi9odG1sLmpzCmZ1bmN0aW9uIGdmbVN0cmlrZXRocm91Z2hIdG1sKCkgewogIHJldHVybiB7CiAgICBlbnRlcjogewogICAgICBzdHJpa2V0aHJvdWdoKCkgewogICAgICAgIHRoaXMudGFnKCI8ZGVsPiIpOwogICAgICB9CiAgICB9LAogICAgZXhpdDogewogICAgICBzdHJpa2V0aHJvdWdoKCkgewogICAgICAgIHRoaXMudGFnKCI8L2RlbD4iKTsKICAgICAgfQogICAgfQogIH07Cn0KdmFyIGluaXRfaHRtbDQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1zdHJpa2V0aHJvdWdoQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1zdHJpa2V0aHJvdWdoL2xpYi9odG1sLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXN0cmlrZXRocm91Z2hAMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXN0cmlrZXRocm91Z2gvbGliL3N5bnRheC5qcwpmdW5jdGlvbiBnZm1TdHJpa2V0aHJvdWdoKG9wdGlvbnMpIHsKICBjb25zdCBvcHRpb25zXyA9IG9wdGlvbnMgfHwge307CiAgbGV0IHNpbmdsZTIgPSBvcHRpb25zXy5zaW5nbGVUaWxkZTsKICBjb25zdCB0b2tlbml6ZXIgPSB7CiAgICBuYW1lOiAic3RyaWtldGhyb3VnaCIsCiAgICB0b2tlbml6ZTogdG9rZW5pemVTdHJpa2V0aHJvdWdoLAogICAgcmVzb2x2ZUFsbDogcmVzb2x2ZUFsbFN0cmlrZXRocm91Z2gKICB9OwogIGlmIChzaW5nbGUyID09PSBudWxsIHx8IHNpbmdsZTIgPT09IHZvaWQgMCkgewogICAgc2luZ2xlMiA9IHRydWU7CiAgfQogIHJldHVybiB7CiAgICB0ZXh0OiB7CiAgICAgIFsxMjZdOiB0b2tlbml6ZXIKICAgIH0sCiAgICBpbnNpZGVTcGFuOiB7CiAgICAgIG51bGw6IFt0b2tlbml6ZXJdCiAgICB9LAogICAgYXR0ZW50aW9uTWFya2VyczogewogICAgICBudWxsOiBbMTI2XQogICAgfQogIH07CiAgZnVuY3Rpb24gcmVzb2x2ZUFsbFN0cmlrZXRocm91Z2goZXZlbnRzLCBjb250ZXh0MikgewogICAgbGV0IGluZGV4MiA9IC0xOwogICAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgICBpZiAoZXZlbnRzW2luZGV4Ml1bMF0gPT09ICJlbnRlciIgJiYgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gInN0cmlrZXRocm91Z2hTZXF1ZW5jZVRlbXBvcmFyeSIgJiYgZXZlbnRzW2luZGV4Ml1bMV0uX2Nsb3NlKSB7CiAgICAgICAgbGV0IG9wZW4gPSBpbmRleDI7CiAgICAgICAgd2hpbGUgKG9wZW4tLSkgewogICAgICAgICAgaWYgKGV2ZW50c1tvcGVuXVswXSA9PT0gImV4aXQiICYmIGV2ZW50c1tvcGVuXVsxXS50eXBlID09PSAic3RyaWtldGhyb3VnaFNlcXVlbmNlVGVtcG9yYXJ5IiAmJiBldmVudHNbb3Blbl1bMV0uX29wZW4gJiYgLy8gSWYgdGhlIHNpemVzIGFyZSB0aGUgc2FtZToKICAgICAgICAgIGV2ZW50c1tpbmRleDJdWzFdLmVuZC5vZmZzZXQgLSBldmVudHNbaW5kZXgyXVsxXS5zdGFydC5vZmZzZXQgPT09IGV2ZW50c1tvcGVuXVsxXS5lbmQub2Zmc2V0IC0gZXZlbnRzW29wZW5dWzFdLnN0YXJ0Lm9mZnNldCkgewogICAgICAgICAgICBldmVudHNbaW5kZXgyXVsxXS50eXBlID0gInN0cmlrZXRocm91Z2hTZXF1ZW5jZSI7CiAgICAgICAgICAgIGV2ZW50c1tvcGVuXVsxXS50eXBlID0gInN0cmlrZXRocm91Z2hTZXF1ZW5jZSI7CiAgICAgICAgICAgIGNvbnN0IHN0cmlrZXRocm91Z2gzID0gewogICAgICAgICAgICAgIHR5cGU6ICJzdHJpa2V0aHJvdWdoIiwKICAgICAgICAgICAgICBzdGFydDogT2JqZWN0LmFzc2lnbih7fSwgZXZlbnRzW29wZW5dWzFdLnN0YXJ0KSwKICAgICAgICAgICAgICBlbmQ6IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50c1tpbmRleDJdWzFdLmVuZCkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY29uc3QgdGV4dDkgPSB7CiAgICAgICAgICAgICAgdHlwZTogInN0cmlrZXRocm91Z2hUZXh0IiwKICAgICAgICAgICAgICBzdGFydDogT2JqZWN0LmFzc2lnbih7fSwgZXZlbnRzW29wZW5dWzFdLmVuZCksCiAgICAgICAgICAgICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCBldmVudHNbaW5kZXgyXVsxXS5zdGFydCkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY29uc3QgbmV4dEV2ZW50cyA9IFtbImVudGVyIiwgc3RyaWtldGhyb3VnaDMsIGNvbnRleHQyXSwgWyJlbnRlciIsIGV2ZW50c1tvcGVuXVsxXSwgY29udGV4dDJdLCBbImV4aXQiLCBldmVudHNbb3Blbl1bMV0sIGNvbnRleHQyXSwgWyJlbnRlciIsIHRleHQ5LCBjb250ZXh0Ml1dOwogICAgICAgICAgICBjb25zdCBpbnNpZGVTcGFuMiA9IGNvbnRleHQyLnBhcnNlci5jb25zdHJ1Y3RzLmluc2lkZVNwYW4ubnVsbDsKICAgICAgICAgICAgaWYgKGluc2lkZVNwYW4yKSB7CiAgICAgICAgICAgICAgc3BsaWNlKG5leHRFdmVudHMsIG5leHRFdmVudHMubGVuZ3RoLCAwLCByZXNvbHZlQWxsKGluc2lkZVNwYW4yLCBldmVudHMuc2xpY2Uob3BlbiArIDEsIGluZGV4MiksIGNvbnRleHQyKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3BsaWNlKG5leHRFdmVudHMsIG5leHRFdmVudHMubGVuZ3RoLCAwLCBbWyJleGl0IiwgdGV4dDksIGNvbnRleHQyXSwgWyJlbnRlciIsIGV2ZW50c1tpbmRleDJdWzFdLCBjb250ZXh0Ml0sIFsiZXhpdCIsIGV2ZW50c1tpbmRleDJdWzFdLCBjb250ZXh0Ml0sIFsiZXhpdCIsIHN0cmlrZXRocm91Z2gzLCBjb250ZXh0Ml1dKTsKICAgICAgICAgICAgc3BsaWNlKGV2ZW50cywgb3BlbiAtIDEsIGluZGV4MiAtIG9wZW4gKyAzLCBuZXh0RXZlbnRzKTsKICAgICAgICAgICAgaW5kZXgyID0gb3BlbiArIG5leHRFdmVudHMubGVuZ3RoIC0gMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpbmRleDIgPSAtMTsKICAgIHdoaWxlICgrK2luZGV4MiA8IGV2ZW50cy5sZW5ndGgpIHsKICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJzdHJpa2V0aHJvdWdoU2VxdWVuY2VUZW1wb3JhcnkiKSB7CiAgICAgICAgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9ICJkYXRhIjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGV2ZW50czsKICB9CiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpa2V0aHJvdWdoKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgICBjb25zdCBwcmV2aW91czMgPSB0aGlzLnByZXZpb3VzOwogICAgY29uc3QgZXZlbnRzID0gdGhpcy5ldmVudHM7CiAgICBsZXQgc2l6ZSA9IDA7CiAgICByZXR1cm4gc3RhcnQ7CiAgICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgICBpZiAocHJldmlvdXMzID09PSAxMjYgJiYgZXZlbnRzW2V2ZW50cy5sZW5ndGggLSAxXVsxXS50eXBlICE9PSAiY2hhcmFjdGVyRXNjYXBlIikgewogICAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgICB9CiAgICAgIGVmZmVjdHMuZW50ZXIoInN0cmlrZXRocm91Z2hTZXF1ZW5jZVRlbXBvcmFyeSIpOwogICAgICByZXR1cm4gbW9yZShjb2RlNCk7CiAgICB9CiAgICBmdW5jdGlvbiBtb3JlKGNvZGU0KSB7CiAgICAgIGNvbnN0IGJlZm9yZSA9IGNsYXNzaWZ5Q2hhcmFjdGVyKHByZXZpb3VzMyk7CiAgICAgIGlmIChjb2RlNCA9PT0gMTI2KSB7CiAgICAgICAgaWYgKHNpemUgPiAxKSByZXR1cm4gbm9rKGNvZGU0KTsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIHNpemUrKzsKICAgICAgICByZXR1cm4gbW9yZTsKICAgICAgfQogICAgICBpZiAoc2l6ZSA8IDIgJiYgIXNpbmdsZTIpIHJldHVybiBub2soY29kZTQpOwogICAgICBjb25zdCB0b2tlbiA9IGVmZmVjdHMuZXhpdCgic3RyaWtldGhyb3VnaFNlcXVlbmNlVGVtcG9yYXJ5Iik7CiAgICAgIGNvbnN0IGFmdGVyID0gY2xhc3NpZnlDaGFyYWN0ZXIoY29kZTQpOwogICAgICB0b2tlbi5fb3BlbiA9ICFhZnRlciB8fCBhZnRlciA9PT0gMiAmJiBCb29sZWFuKGJlZm9yZSk7CiAgICAgIHRva2VuLl9jbG9zZSA9ICFiZWZvcmUgfHwgYmVmb3JlID09PSAyICYmIEJvb2xlYW4oYWZ0ZXIpOwogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICB9Cn0KdmFyIGluaXRfc3ludGF4MyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXN0cmlrZXRocm91Z2hAMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXN0cmlrZXRocm91Z2gvbGliL3N5bnRheC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NodW5rZWQoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2xhc3NpZnlfY2hhcmFjdGVyKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX3Jlc29sdmVfYWxsKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1zdHJpa2V0aHJvdWdoQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1zdHJpa2V0aHJvdWdoL2luZGV4LmpzCnZhciBpbml0X21pY3JvbWFya19leHRlbnNpb25fZ2ZtX3N0cmlrZXRocm91Z2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1zdHJpa2V0aHJvdWdoQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1zdHJpa2V0aHJvdWdoL2luZGV4LmpzIigpIHsKICAgIGluaXRfaHRtbDQoKTsKICAgIGluaXRfc3ludGF4MygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGVAMi4xLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlL2xpYi9odG1sLmpzCmZ1bmN0aW9uIGdmbVRhYmxlSHRtbCgpIHsKICByZXR1cm4gewogICAgZW50ZXI6IHsKICAgICAgdGFibGUodG9rZW4pIHsKICAgICAgICBjb25zdCB0YWJsZUFsaWduID0gdG9rZW4uX2FsaWduOwogICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgdGhpcy50YWcoIjx0YWJsZT4iKTsKICAgICAgICB0aGlzLnNldERhdGEoInRhYmxlQWxpZ24iLCB0YWJsZUFsaWduKTsKICAgICAgfSwKICAgICAgdGFibGVCb2R5KCkgewogICAgICAgIHRoaXMudGFnKCI8dGJvZHk+Iik7CiAgICAgIH0sCiAgICAgIHRhYmxlRGF0YSgpIHsKICAgICAgICBjb25zdCB0YWJsZUFsaWduID0gdGhpcy5nZXREYXRhKCJ0YWJsZUFsaWduIik7CiAgICAgICAgY29uc3QgdGFibGVDb2x1bW4gPSB0aGlzLmdldERhdGEoInRhYmxlQ29sdW1uIik7CiAgICAgICAgY29uc3QgYWxpZ24gPSBhbGlnbm1lbnRbdGFibGVBbGlnblt0YWJsZUNvbHVtbl1dOwogICAgICAgIGlmIChhbGlnbiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICB0aGlzLmJ1ZmZlcigpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgICAgdGhpcy50YWcoIjx0ZCIgKyBhbGlnbiArICI+Iik7CiAgICAgICAgfQogICAgICB9LAogICAgICB0YWJsZUhlYWQoKSB7CiAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICB0aGlzLnRhZygiPHRoZWFkPiIpOwogICAgICB9LAogICAgICB0YWJsZUhlYWRlcigpIHsKICAgICAgICBjb25zdCB0YWJsZUFsaWduID0gdGhpcy5nZXREYXRhKCJ0YWJsZUFsaWduIik7CiAgICAgICAgY29uc3QgdGFibGVDb2x1bW4gPSB0aGlzLmdldERhdGEoInRhYmxlQ29sdW1uIik7CiAgICAgICAgY29uc3QgYWxpZ24gPSBhbGlnbm1lbnRbdGFibGVBbGlnblt0YWJsZUNvbHVtbl1dOwogICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgdGhpcy50YWcoIjx0aCIgKyBhbGlnbiArICI+Iik7CiAgICAgIH0sCiAgICAgIHRhYmxlUm93KCkgewogICAgICAgIHRoaXMuc2V0RGF0YSgidGFibGVDb2x1bW4iLCAwKTsKICAgICAgICB0aGlzLmxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICAgIHRoaXMudGFnKCI8dHI+Iik7CiAgICAgIH0KICAgIH0sCiAgICBleGl0OiB7CiAgICAgIC8vIE92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBjb2RlIHRleHQgZGF0YSBoYW5kbGVyIHRvIHVuZXNjYXBlIGVzY2FwZWQgcGlwZXMgd2hlbgogICAgICAvLyB0aGV5IGFyZSBpbiB0YWJsZXMuCiAgICAgIGNvZGVUZXh0RGF0YSh0b2tlbikgewogICAgICAgIGxldCB2YWx1ZTIgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICAgICAgICBpZiAodGhpcy5nZXREYXRhKCJ0YWJsZUFsaWduIikpIHsKICAgICAgICAgIHZhbHVlMiA9IHZhbHVlMi5yZXBsYWNlKC9cXChbXFx8XSkvZywgcmVwbGFjZTIpOwogICAgICAgIH0KICAgICAgICB0aGlzLnJhdyh0aGlzLmVuY29kZSh2YWx1ZTIpKTsKICAgICAgfSwKICAgICAgdGFibGUoKSB7CiAgICAgICAgdGhpcy5zZXREYXRhKCJ0YWJsZUFsaWduIik7CiAgICAgICAgdGhpcy5zZXREYXRhKCJzbHVycEFsbExpbmVFbmRpbmdzIik7CiAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICB0aGlzLnRhZygiPC90YWJsZT4iKTsKICAgICAgfSwKICAgICAgdGFibGVCb2R5KCkgewogICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgdGhpcy50YWcoIjwvdGJvZHk+Iik7CiAgICAgIH0sCiAgICAgIHRhYmxlRGF0YSgpIHsKICAgICAgICBjb25zdCB0YWJsZUFsaWduID0gdGhpcy5nZXREYXRhKCJ0YWJsZUFsaWduIik7CiAgICAgICAgY29uc3QgdGFibGVDb2x1bW4gPSB0aGlzLmdldERhdGEoInRhYmxlQ29sdW1uIik7CiAgICAgICAgaWYgKHRhYmxlQ29sdW1uIGluIHRhYmxlQWxpZ24pIHsKICAgICAgICAgIHRoaXMudGFnKCI8L3RkPiIpOwogICAgICAgICAgdGhpcy5zZXREYXRhKCJ0YWJsZUNvbHVtbiIsIHRhYmxlQ29sdW1uICsgMSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMucmVzdW1lKCk7CiAgICAgICAgfQogICAgICB9LAogICAgICB0YWJsZUhlYWQoKSB7CiAgICAgICAgdGhpcy5saW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgICAgICB0aGlzLnRhZygiPC90aGVhZD4iKTsKICAgICAgfSwKICAgICAgdGFibGVIZWFkZXIoKSB7CiAgICAgICAgY29uc3QgdGFibGVDb2x1bW4gPSB0aGlzLmdldERhdGEoInRhYmxlQ29sdW1uIik7CiAgICAgICAgdGhpcy50YWcoIjwvdGg+Iik7CiAgICAgICAgdGhpcy5zZXREYXRhKCJ0YWJsZUNvbHVtbiIsIHRhYmxlQ29sdW1uICsgMSk7CiAgICAgIH0sCiAgICAgIHRhYmxlUm93KCkgewogICAgICAgIGNvbnN0IHRhYmxlQWxpZ24gPSB0aGlzLmdldERhdGEoInRhYmxlQWxpZ24iKTsKICAgICAgICBsZXQgdGFibGVDb2x1bW4gPSB0aGlzLmdldERhdGEoInRhYmxlQ29sdW1uIik7CiAgICAgICAgd2hpbGUgKHRhYmxlQ29sdW1uIDwgdGFibGVBbGlnbi5sZW5ndGgpIHsKICAgICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgICB0aGlzLnRhZygiPHRkIiArIGFsaWdubWVudFt0YWJsZUFsaWduW3RhYmxlQ29sdW1uXV0gKyAiPjwvdGQ+Iik7CiAgICAgICAgICB0YWJsZUNvbHVtbisrOwogICAgICAgIH0KICAgICAgICB0aGlzLnNldERhdGEoInRhYmxlQ29sdW1uIiwgdGFibGVDb2x1bW4pOwogICAgICAgIHRoaXMubGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICAgICAgdGhpcy50YWcoIjwvdHI+Iik7CiAgICAgIH0KICAgIH0KICB9Owp9CmZ1bmN0aW9uIHJlcGxhY2UyKCQwLCAkMSkgewogIHJldHVybiAkMSA9PT0gInwiID8gJDEgOiAkMDsKfQp2YXIgYWxpZ25tZW50Owp2YXIgaW5pdF9odG1sNSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlQDIuMS4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWJsZS9saWIvaHRtbC5qcyIoKSB7CiAgICBhbGlnbm1lbnQgPSB7CiAgICAgIG5vbmU6ICIiLAogICAgICBsZWZ0OiAnIGFsaWduPSJsZWZ0IicsCiAgICAgIHJpZ2h0OiAnIGFsaWduPSJyaWdodCInLAogICAgICBjZW50ZXI6ICcgYWxpZ249ImNlbnRlciInCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGVAMi4xLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlL2xpYi9lZGl0LW1hcC5qcwpmdW5jdGlvbiBhZGRJbXBsZW1lbnRhdGlvbihlZGl0TWFwLCBhdCwgcmVtb3ZlMiwgYWRkMykgewogIGxldCBpbmRleDIgPSAwOwogIGlmIChyZW1vdmUyID09PSAwICYmIGFkZDMubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm47CiAgfQogIHdoaWxlIChpbmRleDIgPCBlZGl0TWFwLm1hcC5sZW5ndGgpIHsKICAgIGlmIChlZGl0TWFwLm1hcFtpbmRleDJdWzBdID09PSBhdCkgewogICAgICBlZGl0TWFwLm1hcFtpbmRleDJdWzFdICs9IHJlbW92ZTI7CiAgICAgIGVkaXRNYXAubWFwW2luZGV4Ml1bMl0ucHVzaCguLi5hZGQzKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaW5kZXgyICs9IDE7CiAgfQogIGVkaXRNYXAubWFwLnB1c2goW2F0LCByZW1vdmUyLCBhZGQzXSk7Cn0KdmFyIEVkaXRNYXA7CnZhciBpbml0X2VkaXRfbWFwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGVAMi4xLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlL2xpYi9lZGl0LW1hcC5qcyIoKSB7CiAgICBFZGl0TWFwID0gY2xhc3MgewogICAgICAvKioKICAgICAgICogQ3JlYXRlIGEgbmV3IGVkaXQgbWFwLgogICAgICAgKi8KICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5tYXAgPSBbXTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQ3JlYXRlIGFuIGVkaXQ6IGEgcmVtb3ZlIGFuZC9vciBhZGQgYXQgYSBjZXJ0YWluIHBsYWNlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXgKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHJlbW92ZQogICAgICAgKiBAcGFyYW0ge0FycmF5PEV2ZW50Pn0gYWRkCiAgICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CiAgICAgICAqLwogICAgICBhZGQoaW5kZXgyLCByZW1vdmUyLCBhZGQzKSB7CiAgICAgICAgYWRkSW1wbGVtZW50YXRpb24odGhpcywgaW5kZXgyLCByZW1vdmUyLCBhZGQzKTsKICAgICAgfQogICAgICAvLyBUbyBkbzogYWRkIHRoaXMgd2hlbiBtb3ZpbmcgdG8gYG1pY3JvbWFya2AuCiAgICAgIC8vIC8qKgogICAgICAvLyAgKiBDcmVhdGUgYW4gZWRpdDogYnV0IGluc2VydCBgYWRkYCBiZWZvcmUgZXhpc3RpbmcgYWRkaXRpb25zLgogICAgICAvLyAgKgogICAgICAvLyAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXgKICAgICAgLy8gICogQHBhcmFtIHtudW1iZXJ9IHJlbW92ZQogICAgICAvLyAgKiBAcGFyYW0ge0FycmF5PEV2ZW50Pn0gYWRkCiAgICAgIC8vICAqIEByZXR1cm5zIHt1bmRlZmluZWR9CiAgICAgIC8vICAqLwogICAgICAvLyBhZGRCZWZvcmUoaW5kZXgsIHJlbW92ZSwgYWRkKSB7CiAgICAgIC8vICAgYWRkSW1wbGVtZW50YXRpb24odGhpcywgaW5kZXgsIHJlbW92ZSwgYWRkLCB0cnVlKQogICAgICAvLyB9CiAgICAgIC8qKgogICAgICAgKiBEb25lLCBjaGFuZ2UgdGhlIGV2ZW50cy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtBcnJheTxFdmVudD59IGV2ZW50cwogICAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfQogICAgICAgKi8KICAgICAgY29uc3VtZShldmVudHMpIHsKICAgICAgICB0aGlzLm1hcC5zb3J0KGZ1bmN0aW9uKGE1LCBiNikgewogICAgICAgICAgcmV0dXJuIGE1WzBdIC0gYjZbMF07CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHRoaXMubWFwLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsZXQgaW5kZXgyID0gdGhpcy5tYXAubGVuZ3RoOwogICAgICAgIGNvbnN0IHZlY3MgPSBbXTsKICAgICAgICB3aGlsZSAoaW5kZXgyID4gMCkgewogICAgICAgICAgaW5kZXgyIC09IDE7CiAgICAgICAgICB2ZWNzLnB1c2goZXZlbnRzLnNsaWNlKHRoaXMubWFwW2luZGV4Ml1bMF0gKyB0aGlzLm1hcFtpbmRleDJdWzFdKSwgdGhpcy5tYXBbaW5kZXgyXVsyXSk7CiAgICAgICAgICBldmVudHMubGVuZ3RoID0gdGhpcy5tYXBbaW5kZXgyXVswXTsKICAgICAgICB9CiAgICAgICAgdmVjcy5wdXNoKGV2ZW50cy5zbGljZSgpKTsKICAgICAgICBldmVudHMubGVuZ3RoID0gMDsKICAgICAgICBsZXQgc2xpY2UgPSB2ZWNzLnBvcCgpOwogICAgICAgIHdoaWxlIChzbGljZSkgewogICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50NCBvZiBzbGljZSkgewogICAgICAgICAgICBldmVudHMucHVzaChlbGVtZW50NCk7CiAgICAgICAgICB9CiAgICAgICAgICBzbGljZSA9IHZlY3MucG9wKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMubWFwLmxlbmd0aCA9IDA7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWJsZUAyLjEuMS9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGUvbGliL2luZmVyLmpzCmZ1bmN0aW9uIGdmbVRhYmxlQWxpZ24oZXZlbnRzLCBpbmRleDIpIHsKICBsZXQgaW5EZWxpbWl0ZXJSb3cgPSBmYWxzZTsKICBjb25zdCBhbGlnbiA9IFtdOwogIHdoaWxlIChpbmRleDIgPCBldmVudHMubGVuZ3RoKSB7CiAgICBjb25zdCBldmVudCA9IGV2ZW50c1tpbmRleDJdOwogICAgaWYgKGluRGVsaW1pdGVyUm93KSB7CiAgICAgIGlmIChldmVudFswXSA9PT0gImVudGVyIikgewogICAgICAgIGlmIChldmVudFsxXS50eXBlID09PSAidGFibGVDb250ZW50IikgewogICAgICAgICAgYWxpZ24ucHVzaChldmVudHNbaW5kZXgyICsgMV1bMV0udHlwZSA9PT0gInRhYmxlRGVsaW1pdGVyTWFya2VyIiA/ICJsZWZ0IiA6ICJub25lIik7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGV2ZW50WzFdLnR5cGUgPT09ICJ0YWJsZUNvbnRlbnQiKSB7CiAgICAgICAgaWYgKGV2ZW50c1tpbmRleDIgLSAxXVsxXS50eXBlID09PSAidGFibGVEZWxpbWl0ZXJNYXJrZXIiKSB7CiAgICAgICAgICBjb25zdCBhbGlnbkluZGV4ID0gYWxpZ24ubGVuZ3RoIC0gMTsKICAgICAgICAgIGFsaWduW2FsaWduSW5kZXhdID0gYWxpZ25bYWxpZ25JbmRleF0gPT09ICJsZWZ0IiA/ICJjZW50ZXIiIDogInJpZ2h0IjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZXZlbnRbMV0udHlwZSA9PT0gInRhYmxlRGVsaW1pdGVyUm93IikgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGV2ZW50WzBdID09PSAiZW50ZXIiICYmIGV2ZW50WzFdLnR5cGUgPT09ICJ0YWJsZURlbGltaXRlclJvdyIpIHsKICAgICAgaW5EZWxpbWl0ZXJSb3cgPSB0cnVlOwogICAgfQogICAgaW5kZXgyICs9IDE7CiAgfQogIHJldHVybiBhbGlnbjsKfQp2YXIgaW5pdF9pbmZlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlQDIuMS4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWJsZS9saWIvaW5mZXIuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGVAMi4xLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlL2xpYi9zeW50YXguanMKZnVuY3Rpb24gZ2ZtVGFibGUoKSB7CiAgcmV0dXJuIHsKICAgIGZsb3c6IHsKICAgICAgbnVsbDogewogICAgICAgIG5hbWU6ICJ0YWJsZSIsCiAgICAgICAgdG9rZW5pemU6IHRva2VuaXplVGFibGUsCiAgICAgICAgcmVzb2x2ZUFsbDogcmVzb2x2ZVRhYmxlCiAgICAgIH0KICAgIH0KICB9Owp9CmZ1bmN0aW9uIHRva2VuaXplVGFibGUoZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgbGV0IHNpemUgPSAwOwogIGxldCBzaXplQiA9IDA7CiAgbGV0IHNlZW47CiAgcmV0dXJuIHN0YXJ0OwogIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICBsZXQgaW5kZXgyID0gc2VsZjIuZXZlbnRzLmxlbmd0aCAtIDE7CiAgICB3aGlsZSAoaW5kZXgyID4gLTEpIHsKICAgICAgY29uc3QgdHlwZTUgPSBzZWxmMi5ldmVudHNbaW5kZXgyXVsxXS50eXBlOwogICAgICBpZiAodHlwZTUgPT09ICJsaW5lRW5kaW5nIiB8fCAvLyBOb3RlOiBtYXJrZG93bi1ycyB1c2VzIGB3aGl0ZXNwYWNlYCBpbnN0ZWFkIG9mIGBsaW5lUHJlZml4YAogICAgICB0eXBlNSA9PT0gImxpbmVQcmVmaXgiKSBpbmRleDItLTsKICAgICAgZWxzZSBicmVhazsKICAgIH0KICAgIGNvbnN0IHRhaWwgPSBpbmRleDIgPiAtMSA/IHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLnR5cGUgOiBudWxsOwogICAgY29uc3QgbmV4dDIgPSB0YWlsID09PSAidGFibGVIZWFkIiB8fCB0YWlsID09PSAidGFibGVSb3ciID8gYm9keVJvd1N0YXJ0IDogaGVhZFJvd0JlZm9yZTsKICAgIGlmIChuZXh0MiA9PT0gYm9keVJvd1N0YXJ0ICYmIHNlbGYyLnBhcnNlci5sYXp5W3NlbGYyLm5vdygpLmxpbmVdKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5leHQyKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gaGVhZFJvd0JlZm9yZShjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigidGFibGVIZWFkIik7CiAgICBlZmZlY3RzLmVudGVyKCJ0YWJsZVJvdyIpOwogICAgcmV0dXJuIGhlYWRSb3dTdGFydChjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGhlYWRSb3dTdGFydChjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSAxMjQpIHsKICAgICAgcmV0dXJuIGhlYWRSb3dCcmVhayhjb2RlNCk7CiAgICB9CiAgICBzZWVuID0gdHJ1ZTsKICAgIHNpemVCICs9IDE7CiAgICByZXR1cm4gaGVhZFJvd0JyZWFrKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gaGVhZFJvd0JyZWFrKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBpZiAoc2l6ZUIgPiAxKSB7CiAgICAgICAgc2l6ZUIgPSAwOwogICAgICAgIHNlbGYyLmludGVycnVwdCA9IHRydWU7CiAgICAgICAgZWZmZWN0cy5leGl0KCJ0YWJsZVJvdyIpOwogICAgICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyU3RhcnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBoZWFkUm93QnJlYWssICJ3aGl0ZXNwYWNlIikoY29kZTQpOwogICAgfQogICAgc2l6ZUIgKz0gMTsKICAgIGlmIChzZWVuKSB7CiAgICAgIHNlZW4gPSBmYWxzZTsKICAgICAgc2l6ZSArPSAxOwogICAgfQogICAgaWYgKGNvZGU0ID09PSAxMjQpIHsKICAgICAgZWZmZWN0cy5lbnRlcigidGFibGVDZWxsRGl2aWRlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInRhYmxlQ2VsbERpdmlkZXIiKTsKICAgICAgc2VlbiA9IHRydWU7CiAgICAgIHJldHVybiBoZWFkUm93QnJlYWs7CiAgICB9CiAgICBlZmZlY3RzLmVudGVyKCJkYXRhIik7CiAgICByZXR1cm4gaGVhZFJvd0RhdGEoY29kZTQpOwogIH0KICBmdW5jdGlvbiBoZWFkUm93RGF0YShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsIHx8IGNvZGU0ID09PSAxMjQgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5leGl0KCJkYXRhIik7CiAgICAgIHJldHVybiBoZWFkUm93QnJlYWsoY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIHJldHVybiBjb2RlNCA9PT0gOTIgPyBoZWFkUm93RXNjYXBlIDogaGVhZFJvd0RhdGE7CiAgfQogIGZ1bmN0aW9uIGhlYWRSb3dFc2NhcGUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTIgfHwgY29kZTQgPT09IDEyNCkgewogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gaGVhZFJvd0RhdGE7CiAgICB9CiAgICByZXR1cm4gaGVhZFJvd0RhdGEoY29kZTQpOwogIH0KICBmdW5jdGlvbiBoZWFkRGVsaW1pdGVyU3RhcnQoY29kZTQpIHsKICAgIHNlbGYyLmludGVycnVwdCA9IGZhbHNlOwogICAgaWYgKHNlbGYyLnBhcnNlci5sYXp5W3NlbGYyLm5vdygpLmxpbmVdKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigidGFibGVEZWxpbWl0ZXJSb3ciKTsKICAgIHNlZW4gPSBmYWxzZTsKICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGhlYWREZWxpbWl0ZXJCZWZvcmUsICJsaW5lUHJlZml4Iiwgc2VsZjIucGFyc2VyLmNvbnN0cnVjdHMuZGlzYWJsZS5udWxsLmluY2x1ZGVzKCJjb2RlSW5kZW50ZWQiKSA/IHZvaWQgMCA6IDQpKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBoZWFkRGVsaW1pdGVyQmVmb3JlKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gaGVhZERlbGltaXRlckJlZm9yZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSB8fCBjb2RlNCA9PT0gNTgpIHsKICAgICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJWYWx1ZUJlZm9yZShjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDEyNCkgewogICAgICBzZWVuID0gdHJ1ZTsKICAgICAgZWZmZWN0cy5lbnRlcigidGFibGVDZWxsRGl2aWRlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInRhYmxlQ2VsbERpdmlkZXIiKTsKICAgICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJDZWxsQmVmb3JlOwogICAgfQogICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJOb2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBoZWFkRGVsaW1pdGVyQ2VsbEJlZm9yZShjb2RlNCkgewogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgaGVhZERlbGltaXRlclZhbHVlQmVmb3JlLCAid2hpdGVzcGFjZSIpKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBoZWFkRGVsaW1pdGVyVmFsdWVCZWZvcmUoY29kZTQpOwogIH0KICBmdW5jdGlvbiBoZWFkRGVsaW1pdGVyVmFsdWVCZWZvcmUoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNTgpIHsKICAgICAgc2l6ZUIgKz0gMTsKICAgICAgc2VlbiA9IHRydWU7CiAgICAgIGVmZmVjdHMuZW50ZXIoInRhYmxlRGVsaW1pdGVyTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgidGFibGVEZWxpbWl0ZXJNYXJrZXIiKTsKICAgICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJMZWZ0QWxpZ25tZW50QWZ0ZXI7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDQ1KSB7CiAgICAgIHNpemVCICs9IDE7CiAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyTGVmdEFsaWdubWVudEFmdGVyKGNvZGU0KTsKICAgIH0KICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIHJldHVybiBoZWFkRGVsaW1pdGVyQ2VsbEFmdGVyKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBoZWFkRGVsaW1pdGVyTm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gaGVhZERlbGltaXRlckxlZnRBbGlnbm1lbnRBZnRlcihjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA0NSkgewogICAgICBlZmZlY3RzLmVudGVyKCJ0YWJsZURlbGltaXRlckZpbGxlciIpOwogICAgICByZXR1cm4gaGVhZERlbGltaXRlckZpbGxlcihjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gaGVhZERlbGltaXRlck5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGhlYWREZWxpbWl0ZXJGaWxsZXIoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gNDUpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJGaWxsZXI7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDU4KSB7CiAgICAgIHNlZW4gPSB0cnVlOwogICAgICBlZmZlY3RzLmV4aXQoInRhYmxlRGVsaW1pdGVyRmlsbGVyIik7CiAgICAgIGVmZmVjdHMuZW50ZXIoInRhYmxlRGVsaW1pdGVyTWFya2VyIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgidGFibGVEZWxpbWl0ZXJNYXJrZXIiKTsKICAgICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJSaWdodEFsaWdubWVudEFmdGVyOwogICAgfQogICAgZWZmZWN0cy5leGl0KCJ0YWJsZURlbGltaXRlckZpbGxlciIpOwogICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJSaWdodEFsaWdubWVudEFmdGVyKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gaGVhZERlbGltaXRlclJpZ2h0QWxpZ25tZW50QWZ0ZXIoY29kZTQpIHsKICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGhlYWREZWxpbWl0ZXJDZWxsQWZ0ZXIsICJ3aGl0ZXNwYWNlIikoY29kZTQpOwogICAgfQogICAgcmV0dXJuIGhlYWREZWxpbWl0ZXJDZWxsQWZ0ZXIoY29kZTQpOwogIH0KICBmdW5jdGlvbiBoZWFkRGVsaW1pdGVyQ2VsbEFmdGVyKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IDEyNCkgewogICAgICByZXR1cm4gaGVhZERlbGltaXRlckJlZm9yZShjb2RlNCk7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBpZiAoIXNlZW4gfHwgc2l6ZSAhPT0gc2l6ZUIpIHsKICAgICAgICByZXR1cm4gaGVhZERlbGltaXRlck5vayhjb2RlNCk7CiAgICAgIH0KICAgICAgZWZmZWN0cy5leGl0KCJ0YWJsZURlbGltaXRlclJvdyIpOwogICAgICBlZmZlY3RzLmV4aXQoInRhYmxlSGVhZCIpOwogICAgICByZXR1cm4gb2szKGNvZGU0KTsKICAgIH0KICAgIHJldHVybiBoZWFkRGVsaW1pdGVyTm9rKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gaGVhZERlbGltaXRlck5vayhjb2RlNCkgewogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGJvZHlSb3dTdGFydChjb2RlNCkgewogICAgZWZmZWN0cy5lbnRlcigidGFibGVSb3ciKTsKICAgIHJldHVybiBib2R5Um93QnJlYWsoY29kZTQpOwogIH0KICBmdW5jdGlvbiBib2R5Um93QnJlYWsoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gMTI0KSB7CiAgICAgIGVmZmVjdHMuZW50ZXIoInRhYmxlQ2VsbERpdmlkZXIiKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJ0YWJsZUNlbGxEaXZpZGVyIik7CiAgICAgIHJldHVybiBib2R5Um93QnJlYWs7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoInRhYmxlUm93Iik7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYm9keVJvd0JyZWFrLCAid2hpdGVzcGFjZSIpKGNvZGU0KTsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImRhdGEiKTsKICAgIHJldHVybiBib2R5Um93RGF0YShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGJvZHlSb3dEYXRhKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgY29kZTQgPT09IDEyNCB8fCBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGU0KSkgewogICAgICBlZmZlY3RzLmV4aXQoImRhdGEiKTsKICAgICAgcmV0dXJuIGJvZHlSb3dCcmVhayhjb2RlNCk7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGNvZGU0ID09PSA5MiA/IGJvZHlSb3dFc2NhcGUgOiBib2R5Um93RGF0YTsKICB9CiAgZnVuY3Rpb24gYm9keVJvd0VzY2FwZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSA5MiB8fCBjb2RlNCA9PT0gMTI0KSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBib2R5Um93RGF0YTsKICAgIH0KICAgIHJldHVybiBib2R5Um93RGF0YShjb2RlNCk7CiAgfQp9CmZ1bmN0aW9uIHJlc29sdmVUYWJsZShldmVudHMsIGNvbnRleHQyKSB7CiAgbGV0IGluZGV4MiA9IC0xOwogIGxldCBpbkZpcnN0Q2VsbEF3YWl0aW5nUGlwZSA9IHRydWU7CiAgbGV0IHJvd0tpbmQgPSAwOwogIGxldCBsYXN0Q2VsbCA9IFswLCAwLCAwLCAwXTsKICBsZXQgY2VsbDIgPSBbMCwgMCwgMCwgMF07CiAgbGV0IGFmdGVySGVhZEF3YWl0aW5nRmlyc3RCb2R5Um93ID0gZmFsc2U7CiAgbGV0IGxhc3RUYWJsZUVuZCA9IDA7CiAgbGV0IGN1cnJlbnRUYWJsZTsKICBsZXQgY3VycmVudEJvZHk7CiAgbGV0IGN1cnJlbnRDZWxsOwogIGNvbnN0IG1hcDcgPSBuZXcgRWRpdE1hcCgpOwogIHdoaWxlICgrK2luZGV4MiA8IGV2ZW50cy5sZW5ndGgpIHsKICAgIGNvbnN0IGV2ZW50ID0gZXZlbnRzW2luZGV4Ml07CiAgICBjb25zdCB0b2tlbiA9IGV2ZW50WzFdOwogICAgaWYgKGV2ZW50WzBdID09PSAiZW50ZXIiKSB7CiAgICAgIGlmICh0b2tlbi50eXBlID09PSAidGFibGVIZWFkIikgewogICAgICAgIGFmdGVySGVhZEF3YWl0aW5nRmlyc3RCb2R5Um93ID0gZmFsc2U7CiAgICAgICAgaWYgKGxhc3RUYWJsZUVuZCAhPT0gMCkgewogICAgICAgICAgZmx1c2hUYWJsZUVuZChtYXA3LCBjb250ZXh0MiwgbGFzdFRhYmxlRW5kLCBjdXJyZW50VGFibGUsIGN1cnJlbnRCb2R5KTsKICAgICAgICAgIGN1cnJlbnRCb2R5ID0gdm9pZCAwOwogICAgICAgICAgbGFzdFRhYmxlRW5kID0gMDsKICAgICAgICB9CiAgICAgICAgY3VycmVudFRhYmxlID0gewogICAgICAgICAgdHlwZTogInRhYmxlIiwKICAgICAgICAgIHN0YXJ0OiBPYmplY3QuYXNzaWduKHt9LCB0b2tlbi5zdGFydCksCiAgICAgICAgICAvLyBOb3RlOiBjb3JyZWN0IGVuZCBpcyBzZXQgbGF0ZXIuCiAgICAgICAgICBlbmQ6IE9iamVjdC5hc3NpZ24oe30sIHRva2VuLmVuZCkKICAgICAgICB9OwogICAgICAgIG1hcDcuYWRkKGluZGV4MiwgMCwgW1siZW50ZXIiLCBjdXJyZW50VGFibGUsIGNvbnRleHQyXV0pOwogICAgICB9IGVsc2UgaWYgKHRva2VuLnR5cGUgPT09ICJ0YWJsZVJvdyIgfHwgdG9rZW4udHlwZSA9PT0gInRhYmxlRGVsaW1pdGVyUm93IikgewogICAgICAgIGluRmlyc3RDZWxsQXdhaXRpbmdQaXBlID0gdHJ1ZTsKICAgICAgICBjdXJyZW50Q2VsbCA9IHZvaWQgMDsKICAgICAgICBsYXN0Q2VsbCA9IFswLCAwLCAwLCAwXTsKICAgICAgICBjZWxsMiA9IFswLCBpbmRleDIgKyAxLCAwLCAwXTsKICAgICAgICBpZiAoYWZ0ZXJIZWFkQXdhaXRpbmdGaXJzdEJvZHlSb3cpIHsKICAgICAgICAgIGFmdGVySGVhZEF3YWl0aW5nRmlyc3RCb2R5Um93ID0gZmFsc2U7CiAgICAgICAgICBjdXJyZW50Qm9keSA9IHsKICAgICAgICAgICAgdHlwZTogInRhYmxlQm9keSIsCiAgICAgICAgICAgIHN0YXJ0OiBPYmplY3QuYXNzaWduKHt9LCB0b2tlbi5zdGFydCksCiAgICAgICAgICAgIC8vIE5vdGU6IGNvcnJlY3QgZW5kIGlzIHNldCBsYXRlci4KICAgICAgICAgICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCB0b2tlbi5lbmQpCiAgICAgICAgICB9OwogICAgICAgICAgbWFwNy5hZGQoaW5kZXgyLCAwLCBbWyJlbnRlciIsIGN1cnJlbnRCb2R5LCBjb250ZXh0Ml1dKTsKICAgICAgICB9CiAgICAgICAgcm93S2luZCA9IHRva2VuLnR5cGUgPT09ICJ0YWJsZURlbGltaXRlclJvdyIgPyAyIDogY3VycmVudEJvZHkgPyAzIDogMTsKICAgICAgfSBlbHNlIGlmIChyb3dLaW5kICYmICh0b2tlbi50eXBlID09PSAiZGF0YSIgfHwgdG9rZW4udHlwZSA9PT0gInRhYmxlRGVsaW1pdGVyTWFya2VyIiB8fCB0b2tlbi50eXBlID09PSAidGFibGVEZWxpbWl0ZXJGaWxsZXIiKSkgewogICAgICAgIGluRmlyc3RDZWxsQXdhaXRpbmdQaXBlID0gZmFsc2U7CiAgICAgICAgaWYgKGNlbGwyWzJdID09PSAwKSB7CiAgICAgICAgICBpZiAobGFzdENlbGxbMV0gIT09IDApIHsKICAgICAgICAgICAgY2VsbDJbMF0gPSBjZWxsMlsxXTsKICAgICAgICAgICAgY3VycmVudENlbGwgPSBmbHVzaENlbGwobWFwNywgY29udGV4dDIsIGxhc3RDZWxsLCByb3dLaW5kLCB2b2lkIDAsIGN1cnJlbnRDZWxsKTsKICAgICAgICAgICAgbGFzdENlbGwgPSBbMCwgMCwgMCwgMF07CiAgICAgICAgICB9CiAgICAgICAgICBjZWxsMlsyXSA9IGluZGV4MjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gInRhYmxlQ2VsbERpdmlkZXIiKSB7CiAgICAgICAgaWYgKGluRmlyc3RDZWxsQXdhaXRpbmdQaXBlKSB7CiAgICAgICAgICBpbkZpcnN0Q2VsbEF3YWl0aW5nUGlwZSA9IGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAobGFzdENlbGxbMV0gIT09IDApIHsKICAgICAgICAgICAgY2VsbDJbMF0gPSBjZWxsMlsxXTsKICAgICAgICAgICAgY3VycmVudENlbGwgPSBmbHVzaENlbGwobWFwNywgY29udGV4dDIsIGxhc3RDZWxsLCByb3dLaW5kLCB2b2lkIDAsIGN1cnJlbnRDZWxsKTsKICAgICAgICAgIH0KICAgICAgICAgIGxhc3RDZWxsID0gY2VsbDI7CiAgICAgICAgICBjZWxsMiA9IFtsYXN0Q2VsbFsxXSwgaW5kZXgyLCAwLCAwXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gInRhYmxlSGVhZCIpIHsKICAgICAgYWZ0ZXJIZWFkQXdhaXRpbmdGaXJzdEJvZHlSb3cgPSB0cnVlOwogICAgICBsYXN0VGFibGVFbmQgPSBpbmRleDI7CiAgICB9IGVsc2UgaWYgKHRva2VuLnR5cGUgPT09ICJ0YWJsZVJvdyIgfHwgdG9rZW4udHlwZSA9PT0gInRhYmxlRGVsaW1pdGVyUm93IikgewogICAgICBsYXN0VGFibGVFbmQgPSBpbmRleDI7CiAgICAgIGlmIChsYXN0Q2VsbFsxXSAhPT0gMCkgewogICAgICAgIGNlbGwyWzBdID0gY2VsbDJbMV07CiAgICAgICAgY3VycmVudENlbGwgPSBmbHVzaENlbGwobWFwNywgY29udGV4dDIsIGxhc3RDZWxsLCByb3dLaW5kLCBpbmRleDIsIGN1cnJlbnRDZWxsKTsKICAgICAgfSBlbHNlIGlmIChjZWxsMlsxXSAhPT0gMCkgewogICAgICAgIGN1cnJlbnRDZWxsID0gZmx1c2hDZWxsKG1hcDcsIGNvbnRleHQyLCBjZWxsMiwgcm93S2luZCwgaW5kZXgyLCBjdXJyZW50Q2VsbCk7CiAgICAgIH0KICAgICAgcm93S2luZCA9IDA7CiAgICB9IGVsc2UgaWYgKHJvd0tpbmQgJiYgKHRva2VuLnR5cGUgPT09ICJkYXRhIiB8fCB0b2tlbi50eXBlID09PSAidGFibGVEZWxpbWl0ZXJNYXJrZXIiIHx8IHRva2VuLnR5cGUgPT09ICJ0YWJsZURlbGltaXRlckZpbGxlciIpKSB7CiAgICAgIGNlbGwyWzNdID0gaW5kZXgyOwogICAgfQogIH0KICBpZiAobGFzdFRhYmxlRW5kICE9PSAwKSB7CiAgICBmbHVzaFRhYmxlRW5kKG1hcDcsIGNvbnRleHQyLCBsYXN0VGFibGVFbmQsIGN1cnJlbnRUYWJsZSwgY3VycmVudEJvZHkpOwogIH0KICBtYXA3LmNvbnN1bWUoY29udGV4dDIuZXZlbnRzKTsKICBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBjb250ZXh0Mi5ldmVudHMubGVuZ3RoKSB7CiAgICBjb25zdCBldmVudCA9IGNvbnRleHQyLmV2ZW50c1tpbmRleDJdOwogICAgaWYgKGV2ZW50WzBdID09PSAiZW50ZXIiICYmIGV2ZW50WzFdLnR5cGUgPT09ICJ0YWJsZSIpIHsKICAgICAgZXZlbnRbMV0uX2FsaWduID0gZ2ZtVGFibGVBbGlnbihjb250ZXh0Mi5ldmVudHMsIGluZGV4Mik7CiAgICB9CiAgfQogIHJldHVybiBldmVudHM7Cn0KZnVuY3Rpb24gZmx1c2hDZWxsKG1hcDcsIGNvbnRleHQyLCByYW5nZTIsIHJvd0tpbmQsIHJvd0VuZCwgcHJldmlvdXNDZWxsKSB7CiAgY29uc3QgZ3JvdXBOYW1lID0gcm93S2luZCA9PT0gMSA/ICJ0YWJsZUhlYWRlciIgOiByb3dLaW5kID09PSAyID8gInRhYmxlRGVsaW1pdGVyIiA6ICJ0YWJsZURhdGEiOwogIGNvbnN0IHZhbHVlTmFtZSA9ICJ0YWJsZUNvbnRlbnQiOwogIGlmIChyYW5nZTJbMF0gIT09IDApIHsKICAgIHByZXZpb3VzQ2VsbC5lbmQgPSBPYmplY3QuYXNzaWduKHt9LCBnZXRQb2ludChjb250ZXh0Mi5ldmVudHMsIHJhbmdlMlswXSkpOwogICAgbWFwNy5hZGQocmFuZ2UyWzBdLCAwLCBbWyJleGl0IiwgcHJldmlvdXNDZWxsLCBjb250ZXh0Ml1dKTsKICB9CiAgY29uc3Qgbm93MiA9IGdldFBvaW50KGNvbnRleHQyLmV2ZW50cywgcmFuZ2UyWzFdKTsKICBwcmV2aW91c0NlbGwgPSB7CiAgICB0eXBlOiBncm91cE5hbWUsCiAgICBzdGFydDogT2JqZWN0LmFzc2lnbih7fSwgbm93MiksCiAgICAvLyBOb3RlOiBjb3JyZWN0IGVuZCBpcyBzZXQgbGF0ZXIuCiAgICBlbmQ6IE9iamVjdC5hc3NpZ24oe30sIG5vdzIpCiAgfTsKICBtYXA3LmFkZChyYW5nZTJbMV0sIDAsIFtbImVudGVyIiwgcHJldmlvdXNDZWxsLCBjb250ZXh0Ml1dKTsKICBpZiAocmFuZ2UyWzJdICE9PSAwKSB7CiAgICBjb25zdCByZWxhdGVkU3RhcnQgPSBnZXRQb2ludChjb250ZXh0Mi5ldmVudHMsIHJhbmdlMlsyXSk7CiAgICBjb25zdCByZWxhdGVkRW5kID0gZ2V0UG9pbnQoY29udGV4dDIuZXZlbnRzLCByYW5nZTJbM10pOwogICAgY29uc3QgdmFsdWVUb2tlbiA9IHsKICAgICAgdHlwZTogdmFsdWVOYW1lLAogICAgICBzdGFydDogT2JqZWN0LmFzc2lnbih7fSwgcmVsYXRlZFN0YXJ0KSwKICAgICAgZW5kOiBPYmplY3QuYXNzaWduKHt9LCByZWxhdGVkRW5kKQogICAgfTsKICAgIG1hcDcuYWRkKHJhbmdlMlsyXSwgMCwgW1siZW50ZXIiLCB2YWx1ZVRva2VuLCBjb250ZXh0Ml1dKTsKICAgIGlmIChyb3dLaW5kICE9PSAyKSB7CiAgICAgIGNvbnN0IHN0YXJ0ID0gY29udGV4dDIuZXZlbnRzW3JhbmdlMlsyXV07CiAgICAgIGNvbnN0IGVuZDMgPSBjb250ZXh0Mi5ldmVudHNbcmFuZ2UyWzNdXTsKICAgICAgc3RhcnRbMV0uZW5kID0gT2JqZWN0LmFzc2lnbih7fSwgZW5kM1sxXS5lbmQpOwogICAgICBzdGFydFsxXS50eXBlID0gImNodW5rVGV4dCI7CiAgICAgIHN0YXJ0WzFdLmNvbnRlbnRUeXBlID0gInRleHQiOwogICAgICBpZiAocmFuZ2UyWzNdID4gcmFuZ2UyWzJdICsgMSkgewogICAgICAgIGNvbnN0IGE1ID0gcmFuZ2UyWzJdICsgMTsKICAgICAgICBjb25zdCBiNiA9IHJhbmdlMlszXSAtIHJhbmdlMlsyXSAtIDE7CiAgICAgICAgbWFwNy5hZGQoYTUsIGI2LCBbXSk7CiAgICAgIH0KICAgIH0KICAgIG1hcDcuYWRkKHJhbmdlMlszXSArIDEsIDAsIFtbImV4aXQiLCB2YWx1ZVRva2VuLCBjb250ZXh0Ml1dKTsKICB9CiAgaWYgKHJvd0VuZCAhPT0gdm9pZCAwKSB7CiAgICBwcmV2aW91c0NlbGwuZW5kID0gT2JqZWN0LmFzc2lnbih7fSwgZ2V0UG9pbnQoY29udGV4dDIuZXZlbnRzLCByb3dFbmQpKTsKICAgIG1hcDcuYWRkKHJvd0VuZCwgMCwgW1siZXhpdCIsIHByZXZpb3VzQ2VsbCwgY29udGV4dDJdXSk7CiAgICBwcmV2aW91c0NlbGwgPSB2b2lkIDA7CiAgfQogIHJldHVybiBwcmV2aW91c0NlbGw7Cn0KZnVuY3Rpb24gZmx1c2hUYWJsZUVuZChtYXA3LCBjb250ZXh0MiwgaW5kZXgyLCB0YWJsZTIsIHRhYmxlQm9keSkgewogIGNvbnN0IGV4aXRzID0gW107CiAgY29uc3QgcmVsYXRlZCA9IGdldFBvaW50KGNvbnRleHQyLmV2ZW50cywgaW5kZXgyKTsKICBpZiAodGFibGVCb2R5KSB7CiAgICB0YWJsZUJvZHkuZW5kID0gT2JqZWN0LmFzc2lnbih7fSwgcmVsYXRlZCk7CiAgICBleGl0cy5wdXNoKFsiZXhpdCIsIHRhYmxlQm9keSwgY29udGV4dDJdKTsKICB9CiAgdGFibGUyLmVuZCA9IE9iamVjdC5hc3NpZ24oe30sIHJlbGF0ZWQpOwogIGV4aXRzLnB1c2goWyJleGl0IiwgdGFibGUyLCBjb250ZXh0Ml0pOwogIG1hcDcuYWRkKGluZGV4MiArIDEsIDAsIGV4aXRzKTsKfQpmdW5jdGlvbiBnZXRQb2ludChldmVudHMsIGluZGV4MikgewogIGNvbnN0IGV2ZW50ID0gZXZlbnRzW2luZGV4Ml07CiAgY29uc3Qgc2lkZSA9IGV2ZW50WzBdID09PSAiZW50ZXIiID8gInN0YXJ0IiA6ICJlbmQiOwogIHJldHVybiBldmVudFsxXVtzaWRlXTsKfQp2YXIgaW5pdF9zeW50YXg0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGVAMi4xLjEvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlL2xpYi9zeW50YXguanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9zcGFjZSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGluaXRfZWRpdF9tYXAoKTsKICAgIGluaXRfaW5mZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlQDIuMS4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWJsZS9pbmRleC5qcwp2YXIgaW5pdF9taWNyb21hcmtfZXh0ZW5zaW9uX2dmbV90YWJsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhYmxlQDIuMS4xL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWJsZS9pbmRleC5qcyIoKSB7CiAgICBpbml0X2h0bWw1KCk7CiAgICBpbml0X3N5bnRheDQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhZ2ZpbHRlckAyLjAuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFnZmlsdGVyL2xpYi9pbmRleC5qcwpmdW5jdGlvbiBnZm1UYWdmaWx0ZXJIdG1sKCkgewogIHJldHVybiB7CiAgICBleGl0OiB7CiAgICAgIGh0bWxGbG93RGF0YSh0b2tlbikgewogICAgICAgIGV4aXRIdG1sRGF0YS5jYWxsKHRoaXMsIHRva2VuLCByZUZsb3cpOwogICAgICB9LAogICAgICBodG1sVGV4dERhdGEodG9rZW4pIHsKICAgICAgICBleGl0SHRtbERhdGEuY2FsbCh0aGlzLCB0b2tlbiwgcmVUZXh0KTsKICAgICAgfQogICAgfQogIH07Cn0KZnVuY3Rpb24gZXhpdEh0bWxEYXRhKHRva2VuLCBmaWx0ZXIyKSB7CiAgbGV0IHZhbHVlMiA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwogIGlmICh0aGlzLm9wdGlvbnMuYWxsb3dEYW5nZXJvdXNIdG1sKSB7CiAgICB2YWx1ZTIgPSB2YWx1ZTIucmVwbGFjZShmaWx0ZXIyLCAiJmx0OyQxJDIiKTsKICB9CiAgdGhpcy5yYXcodGhpcy5lbmNvZGUodmFsdWUyKSk7Cn0KdmFyIHJlRmxvdywgcmVUZXh0Owp2YXIgaW5pdF9saWIxOSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhZ2ZpbHRlckAyLjAuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFnZmlsdGVyL2xpYi9pbmRleC5qcyIoKSB7CiAgICByZUZsb3cgPSAvPChcLz8pKGlmcmFtZXxub2VtYmVkfG5vZnJhbWVzfHBsYWludGV4dHxzY3JpcHR8c3R5bGV8dGl0bGV8dGV4dGFyZWF8eG1wKSg/PVtcdFxuXGZcciAvPl0pL2dpOwogICAgcmVUZXh0ID0gbmV3IFJlZ0V4cCgiXiIgKyByZUZsb3cuc291cmNlLCAiaSIpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFnZmlsdGVyQDIuMC4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWdmaWx0ZXIvaW5kZXguanMKdmFyIGluaXRfbWljcm9tYXJrX2V4dGVuc2lvbl9nZm1fdGFnZmlsdGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFnZmlsdGVyQDIuMC4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWdmaWx0ZXIvaW5kZXguanMiKCkgewogICAgaW5pdF9saWIxOSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFzay1saXN0LWl0ZW1AMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhc2stbGlzdC1pdGVtL2xpYi9odG1sLmpzCmZ1bmN0aW9uIGdmbVRhc2tMaXN0SXRlbUh0bWwoKSB7CiAgcmV0dXJuIHsKICAgIGVudGVyOiB7CiAgICAgIHRhc2tMaXN0Q2hlY2soKSB7CiAgICAgICAgdGhpcy50YWcoJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGlzYWJsZWQ9IiIgJyk7CiAgICAgIH0KICAgIH0sCiAgICBleGl0OiB7CiAgICAgIHRhc2tMaXN0Q2hlY2soKSB7CiAgICAgICAgdGhpcy50YWcoIi8+Iik7CiAgICAgIH0sCiAgICAgIHRhc2tMaXN0Q2hlY2tWYWx1ZUNoZWNrZWQoKSB7CiAgICAgICAgdGhpcy50YWcoJ2NoZWNrZWQ9IiIgJyk7CiAgICAgIH0KICAgIH0KICB9Owp9CnZhciBpbml0X2h0bWw2ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFzay1saXN0LWl0ZW1AMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhc2stbGlzdC1pdGVtL2xpYi9odG1sLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhc2stbGlzdC1pdGVtQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YXNrLWxpc3QtaXRlbS9saWIvc3ludGF4LmpzCmZ1bmN0aW9uIGdmbVRhc2tMaXN0SXRlbSgpIHsKICByZXR1cm4gewogICAgdGV4dDogewogICAgICBbOTFdOiB0YXNrbGlzdENoZWNrCiAgICB9CiAgfTsKfQpmdW5jdGlvbiB0b2tlbml6ZVRhc2tsaXN0Q2hlY2soZWZmZWN0cywgb2szLCBub2spIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgcmV0dXJuIG9wZW47CiAgZnVuY3Rpb24gb3Blbihjb2RlNCkgewogICAgaWYgKAogICAgICAvLyBFeGl0IGlmIHRoZXJl4oCZcyBzdHVmZiBiZWZvcmUuCiAgICAgIHNlbGYyLnByZXZpb3VzICE9PSBudWxsIHx8IC8vIEV4aXQgaWYgbm90IGluIHRoZSBmaXJzdCBjb250ZW50IHRoYXQgaXMgdGhlIGZpcnN0IGNoaWxkIG9mIGEgbGlzdAogICAgICAvLyBpdGVtLgogICAgICAhc2VsZjIuX2dmbVRhc2tsaXN0Rmlyc3RDb250ZW50T2ZMaXN0SXRlbQogICAgKSB7CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigidGFza0xpc3RDaGVjayIpOwogICAgZWZmZWN0cy5lbnRlcigidGFza0xpc3RDaGVja01hcmtlciIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgidGFza0xpc3RDaGVja01hcmtlciIpOwogICAgcmV0dXJuIGluc2lkZTsKICB9CiAgZnVuY3Rpb24gaW5zaWRlKGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5lbnRlcigidGFza0xpc3RDaGVja1ZhbHVlVW5jaGVja2VkIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIGVmZmVjdHMuZXhpdCgidGFza0xpc3RDaGVja1ZhbHVlVW5jaGVja2VkIik7CiAgICAgIHJldHVybiBjbG9zZTc7CiAgICB9CiAgICBpZiAoY29kZTQgPT09IDg4IHx8IGNvZGU0ID09PSAxMjApIHsKICAgICAgZWZmZWN0cy5lbnRlcigidGFza0xpc3RDaGVja1ZhbHVlQ2hlY2tlZCIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInRhc2tMaXN0Q2hlY2tWYWx1ZUNoZWNrZWQiKTsKICAgICAgcmV0dXJuIGNsb3NlNzsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBjbG9zZTcoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gOTMpIHsKICAgICAgZWZmZWN0cy5lbnRlcigidGFza0xpc3RDaGVja01hcmtlciIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoInRhc2tMaXN0Q2hlY2tNYXJrZXIiKTsKICAgICAgZWZmZWN0cy5leGl0KCJ0YXNrTGlzdENoZWNrIik7CiAgICAgIHJldHVybiBhZnRlcjsKICAgIH0KICAgIHJldHVybiBub2soY29kZTQpOwogIH0KICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgcmV0dXJuIG9rMyhjb2RlNCk7CiAgICB9CiAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgcmV0dXJuIGVmZmVjdHMuY2hlY2soewogICAgICAgIHRva2VuaXplOiBzcGFjZVRoZW5Ob25TcGFjZQogICAgICB9LCBvazMsIG5vaykoY29kZTQpOwogICAgfQogICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgfQp9CmZ1bmN0aW9uIHNwYWNlVGhlbk5vblNwYWNlKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlciwgIndoaXRlc3BhY2UiKTsKICBmdW5jdGlvbiBhZnRlcihjb2RlNCkgewogICAgcmV0dXJuIGNvZGU0ID09PSBudWxsID8gbm9rKGNvZGU0KSA6IG9rMyhjb2RlNCk7CiAgfQp9CnZhciB0YXNrbGlzdENoZWNrOwp2YXIgaW5pdF9zeW50YXg1ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFzay1saXN0LWl0ZW1AMi4xLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhc2stbGlzdC1pdGVtL2xpYi9zeW50YXguanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9zcGFjZSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIHRhc2tsaXN0Q2hlY2sgPSB7CiAgICAgIG5hbWU6ICJ0YXNrbGlzdENoZWNrIiwKICAgICAgdG9rZW5pemU6IHRva2VuaXplVGFza2xpc3RDaGVjawogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhc2stbGlzdC1pdGVtQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YXNrLWxpc3QtaXRlbS9pbmRleC5qcwp2YXIgaW5pdF9taWNyb21hcmtfZXh0ZW5zaW9uX2dmbV90YXNrX2xpc3RfaXRlbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXRhc2stbGlzdC1pdGVtQDIuMS4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YXNrLWxpc3QtaXRlbS9pbmRleC5qcyIoKSB7CiAgICBpbml0X2h0bWw2KCk7CiAgICBpbml0X3N5bnRheDUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtQDMuMC4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS9pbmRleC5qcwpmdW5jdGlvbiBnZm0ob3B0aW9ucykgewogIHJldHVybiBjb21iaW5lRXh0ZW5zaW9ucyhbCiAgICBnZm1BdXRvbGlua0xpdGVyYWwoKSwKICAgIGdmbUZvb3Rub3RlKCksCiAgICBnZm1TdHJpa2V0aHJvdWdoKG9wdGlvbnMpLAogICAgZ2ZtVGFibGUoKSwKICAgIGdmbVRhc2tMaXN0SXRlbSgpCiAgXSk7Cn0KZnVuY3Rpb24gZ2ZtSHRtbChvcHRpb25zKSB7CiAgcmV0dXJuIGNvbWJpbmVIdG1sRXh0ZW5zaW9ucyhbCiAgICBnZm1BdXRvbGlua0xpdGVyYWxIdG1sKCksCiAgICBnZm1Gb290bm90ZUh0bWwob3B0aW9ucyksCiAgICBnZm1TdHJpa2V0aHJvdWdoSHRtbCgpLAogICAgZ2ZtVGFibGVIdG1sKCksCiAgICBnZm1UYWdmaWx0ZXJIdG1sKCksCiAgICBnZm1UYXNrTGlzdEl0ZW1IdG1sKCkKICBdKTsKfQp2YXIgaW5pdF9taWNyb21hcmtfZXh0ZW5zaW9uX2dmbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZ2ZtQDMuMC4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS9pbmRleC5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NvbWJpbmVfZXh0ZW5zaW9ucygpOwogICAgaW5pdF9taWNyb21hcmtfZXh0ZW5zaW9uX2dmbV9hdXRvbGlua19saXRlcmFsKCk7CiAgICBpbml0X21pY3JvbWFya19leHRlbnNpb25fZ2ZtX2Zvb3Rub3RlKCk7CiAgICBpbml0X21pY3JvbWFya19leHRlbnNpb25fZ2ZtX3N0cmlrZXRocm91Z2goKTsKICAgIGluaXRfbWljcm9tYXJrX2V4dGVuc2lvbl9nZm1fdGFibGUoKTsKICAgIGluaXRfbWljcm9tYXJrX2V4dGVuc2lvbl9nZm1fdGFnZmlsdGVyKCk7CiAgICBpbml0X21pY3JvbWFya19leHRlbnNpb25fZ2ZtX3Rhc2tfbGlzdF9pdGVtKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstZ2ZtQDQuMC4xL25vZGVfbW9kdWxlcy9yZW1hcmstZ2ZtL2xpYi9pbmRleC5qcwpmdW5jdGlvbiByZW1hcmtHZm0ob3B0aW9ucykgewogIGNvbnN0IHNlbGYyID0gKAogICAgLyoqIEB0eXBlIHtQcm9jZXNzb3I8Um9vdD59ICovCiAgICB0aGlzCiAgKTsKICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zMzsKICBjb25zdCBkYXRhID0gc2VsZjIuZGF0YSgpOwogIGNvbnN0IG1pY3JvbWFya0V4dGVuc2lvbnMgPSBkYXRhLm1pY3JvbWFya0V4dGVuc2lvbnMgfHwgKGRhdGEubWljcm9tYXJrRXh0ZW5zaW9ucyA9IFtdKTsKICBjb25zdCBmcm9tTWFya2Rvd25FeHRlbnNpb25zID0gZGF0YS5mcm9tTWFya2Rvd25FeHRlbnNpb25zIHx8IChkYXRhLmZyb21NYXJrZG93bkV4dGVuc2lvbnMgPSBbXSk7CiAgY29uc3QgdG9NYXJrZG93bkV4dGVuc2lvbnMgPSBkYXRhLnRvTWFya2Rvd25FeHRlbnNpb25zIHx8IChkYXRhLnRvTWFya2Rvd25FeHRlbnNpb25zID0gW10pOwogIG1pY3JvbWFya0V4dGVuc2lvbnMucHVzaChnZm0oc2V0dGluZ3MpKTsKICBmcm9tTWFya2Rvd25FeHRlbnNpb25zLnB1c2goZ2ZtRnJvbU1hcmtkb3duKCkpOwogIHRvTWFya2Rvd25FeHRlbnNpb25zLnB1c2goZ2ZtVG9NYXJrZG93bihzZXR0aW5ncykpOwp9CnZhciBlbXB0eU9wdGlvbnMzOwp2YXIgaW5pdF9saWIyMCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1nZm1ANC4wLjEvbm9kZV9tb2R1bGVzL3JlbWFyay1nZm0vbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfbWRhc3RfdXRpbF9nZm0oKTsKICAgIGluaXRfbWljcm9tYXJrX2V4dGVuc2lvbl9nZm0oKTsKICAgIGVtcHR5T3B0aW9uczMgPSB7fTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1nZm1ANC4wLjEvbm9kZV9tb2R1bGVzL3JlbWFyay1nZm0vaW5kZXguanMKdmFyIGluaXRfcmVtYXJrX2dmbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1nZm1ANC4wLjEvbm9kZV9tb2R1bGVzL3JlbWFyay1nZm0vaW5kZXguanMiKCkgewogICAgaW5pdF9saWIyMCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL2NvbXBpbGUuanMKZnVuY3Rpb24gY29tcGlsZShvcHRpb25zKSB7CiAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9OwogIGxldCB0YWdzID0gdHJ1ZTsKICBjb25zdCBkZWZpbml0aW9ucyA9IHt9OwogIGNvbnN0IGJ1ZmZlcnMgPSBbW11dOwogIGNvbnN0IG1lZGlhU3RhY2sgPSBbXTsKICBjb25zdCB0aWdodFN0YWNrID0gW107CiAgY29uc3QgZGVmYXVsdEhhbmRsZXJzID0gewogICAgZW50ZXI6IHsKICAgICAgYmxvY2tRdW90ZTogb25lbnRlcmJsb2NrcXVvdGUsCiAgICAgIGNvZGVGZW5jZWQ6IG9uZW50ZXJjb2RlZmVuY2VkLAogICAgICBjb2RlRmVuY2VkRmVuY2VJbmZvOiBidWZmZXIyLAogICAgICBjb2RlRmVuY2VkRmVuY2VNZXRhOiBidWZmZXIyLAogICAgICBjb2RlSW5kZW50ZWQ6IG9uZW50ZXJjb2RlaW5kZW50ZWQsCiAgICAgIGNvZGVUZXh0OiBvbmVudGVyY29kZXRleHQsCiAgICAgIGNvbnRlbnQ6IG9uZW50ZXJjb250ZW50LAogICAgICBkZWZpbml0aW9uOiBvbmVudGVyZGVmaW5pdGlvbiwKICAgICAgZGVmaW5pdGlvbkRlc3RpbmF0aW9uU3RyaW5nOiBvbmVudGVyZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nLAogICAgICBkZWZpbml0aW9uTGFiZWxTdHJpbmc6IGJ1ZmZlcjIsCiAgICAgIGRlZmluaXRpb25UaXRsZVN0cmluZzogYnVmZmVyMiwKICAgICAgZW1waGFzaXM6IG9uZW50ZXJlbXBoYXNpcywKICAgICAgaHRtbEZsb3c6IG9uZW50ZXJodG1sZmxvdywKICAgICAgaHRtbFRleHQ6IG9uZW50ZXJodG1sLAogICAgICBpbWFnZTogb25lbnRlcmltYWdlLAogICAgICBsYWJlbDogYnVmZmVyMiwKICAgICAgbGluazogb25lbnRlcmxpbmssCiAgICAgIGxpc3RJdGVtTWFya2VyOiBvbmVudGVybGlzdGl0ZW1tYXJrZXIsCiAgICAgIGxpc3RJdGVtVmFsdWU6IG9uZW50ZXJsaXN0aXRlbXZhbHVlLAogICAgICBsaXN0T3JkZXJlZDogb25lbnRlcmxpc3RvcmRlcmVkLAogICAgICBsaXN0VW5vcmRlcmVkOiBvbmVudGVybGlzdHVub3JkZXJlZCwKICAgICAgcGFyYWdyYXBoOiBvbmVudGVycGFyYWdyYXBoLAogICAgICByZWZlcmVuY2U6IGJ1ZmZlcjIsCiAgICAgIHJlc291cmNlOiBvbmVudGVycmVzb3VyY2UsCiAgICAgIHJlc291cmNlRGVzdGluYXRpb25TdHJpbmc6IG9uZW50ZXJyZXNvdXJjZWRlc3RpbmF0aW9uc3RyaW5nLAogICAgICByZXNvdXJjZVRpdGxlU3RyaW5nOiBidWZmZXIyLAogICAgICBzZXRleHRIZWFkaW5nOiBvbmVudGVyc2V0ZXh0aGVhZGluZywKICAgICAgc3Ryb25nOiBvbmVudGVyc3Ryb25nCiAgICB9LAogICAgZXhpdDogewogICAgICBhdHhIZWFkaW5nOiBvbmV4aXRhdHhoZWFkaW5nLAogICAgICBhdHhIZWFkaW5nU2VxdWVuY2U6IG9uZXhpdGF0eGhlYWRpbmdzZXF1ZW5jZSwKICAgICAgYXV0b2xpbmtFbWFpbDogb25leGl0YXV0b2xpbmtlbWFpbCwKICAgICAgYXV0b2xpbmtQcm90b2NvbDogb25leGl0YXV0b2xpbmtwcm90b2NvbCwKICAgICAgYmxvY2tRdW90ZTogb25leGl0YmxvY2txdW90ZSwKICAgICAgY2hhcmFjdGVyRXNjYXBlVmFsdWU6IG9uZXhpdGRhdGEsCiAgICAgIGNoYXJhY3RlclJlZmVyZW5jZU1hcmtlckhleGFkZWNpbWFsOiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2VtYXJrZXIsCiAgICAgIGNoYXJhY3RlclJlZmVyZW5jZU1hcmtlck51bWVyaWM6IG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZW1hcmtlciwKICAgICAgY2hhcmFjdGVyUmVmZXJlbmNlVmFsdWU6IG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZXZhbHVlLAogICAgICBjb2RlRmVuY2VkOiBvbmV4aXRmbG93Y29kZSwKICAgICAgY29kZUZlbmNlZEZlbmNlOiBvbmV4aXRjb2RlZmVuY2VkZmVuY2UsCiAgICAgIGNvZGVGZW5jZWRGZW5jZUluZm86IG9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8sCiAgICAgIGNvZGVGZW5jZWRGZW5jZU1ldGE6IG9ucmVzdW1lZHJvcCwKICAgICAgY29kZUZsb3dWYWx1ZTogb25leGl0Y29kZWZsb3d2YWx1ZSwKICAgICAgY29kZUluZGVudGVkOiBvbmV4aXRmbG93Y29kZSwKICAgICAgY29kZVRleHQ6IG9uZXhpdGNvZGV0ZXh0LAogICAgICBjb2RlVGV4dERhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGRhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGRlZmluaXRpb246IG9uZXhpdGRlZmluaXRpb24sCiAgICAgIGRlZmluaXRpb25EZXN0aW5hdGlvblN0cmluZzogb25leGl0ZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nLAogICAgICBkZWZpbml0aW9uTGFiZWxTdHJpbmc6IG9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZywKICAgICAgZGVmaW5pdGlvblRpdGxlU3RyaW5nOiBvbmV4aXRkZWZpbml0aW9udGl0bGVzdHJpbmcsCiAgICAgIGVtcGhhc2lzOiBvbmV4aXRlbXBoYXNpcywKICAgICAgaGFyZEJyZWFrRXNjYXBlOiBvbmV4aXRoYXJkYnJlYWssCiAgICAgIGhhcmRCcmVha1RyYWlsaW5nOiBvbmV4aXRoYXJkYnJlYWssCiAgICAgIGh0bWxGbG93OiBvbmV4aXRodG1sLAogICAgICBodG1sRmxvd0RhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGh0bWxUZXh0OiBvbmV4aXRodG1sLAogICAgICBodG1sVGV4dERhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGltYWdlOiBvbmV4aXRtZWRpYSwKICAgICAgbGFiZWw6IG9uZXhpdGxhYmVsLAogICAgICBsYWJlbFRleHQ6IG9uZXhpdGxhYmVsdGV4dCwKICAgICAgbGluZUVuZGluZzogb25leGl0bGluZWVuZGluZywKICAgICAgbGluazogb25leGl0bWVkaWEsCiAgICAgIGxpc3RPcmRlcmVkOiBvbmV4aXRsaXN0b3JkZXJlZCwKICAgICAgbGlzdFVub3JkZXJlZDogb25leGl0bGlzdHVub3JkZXJlZCwKICAgICAgcGFyYWdyYXBoOiBvbmV4aXRwYXJhZ3JhcGgsCiAgICAgIHJlZmVyZW5jZTogb25yZXN1bWVkcm9wLAogICAgICByZWZlcmVuY2VTdHJpbmc6IG9uZXhpdHJlZmVyZW5jZXN0cmluZywKICAgICAgcmVzb3VyY2U6IG9ucmVzdW1lZHJvcCwKICAgICAgcmVzb3VyY2VEZXN0aW5hdGlvblN0cmluZzogb25leGl0cmVzb3VyY2VkZXN0aW5hdGlvbnN0cmluZywKICAgICAgcmVzb3VyY2VUaXRsZVN0cmluZzogb25leGl0cmVzb3VyY2V0aXRsZXN0cmluZywKICAgICAgc2V0ZXh0SGVhZGluZzogb25leGl0c2V0ZXh0aGVhZGluZywKICAgICAgc2V0ZXh0SGVhZGluZ0xpbmVTZXF1ZW5jZTogb25leGl0c2V0ZXh0aGVhZGluZ2xpbmVzZXF1ZW5jZSwKICAgICAgc2V0ZXh0SGVhZGluZ1RleHQ6IG9uZXhpdHNldGV4dGhlYWRpbmd0ZXh0LAogICAgICBzdHJvbmc6IG9uZXhpdHN0cm9uZywKICAgICAgdGhlbWF0aWNCcmVhazogb25leGl0dGhlbWF0aWNicmVhawogICAgfQogIH07CiAgY29uc3QgaGFuZGxlcnMyID0gKAogICAgLyoqIEB0eXBlIHtOb3JtYWxpemVkSHRtbEV4dGVuc2lvbn0gKi8KICAgIGNvbWJpbmVIdG1sRXh0ZW5zaW9ucyhbZGVmYXVsdEhhbmRsZXJzLCAuLi5zZXR0aW5ncy5odG1sRXh0ZW5zaW9ucyB8fCBbXV0pCiAgKTsKICBjb25zdCBkYXRhID0gewogICAgZGVmaW5pdGlvbnMsCiAgICB0aWdodFN0YWNrCiAgfTsKICBjb25zdCBjb250ZXh0MiA9IHsKICAgIGJ1ZmZlcjogYnVmZmVyMiwKICAgIGVuY29kZTogZW5jb2RlMiwKICAgIGdldERhdGEsCiAgICBsaW5lRW5kaW5nSWZOZWVkZWQsCiAgICBvcHRpb25zOiBzZXR0aW5ncywKICAgIHJhdzogcmF3MiwKICAgIHJlc3VtZSwKICAgIHNldERhdGEsCiAgICB0YWcKICB9OwogIGxldCBsaW5lRW5kaW5nU3R5bGUgPSBzZXR0aW5ncy5kZWZhdWx0TGluZUVuZGluZzsKICByZXR1cm4gY29tcGlsZTI7CiAgZnVuY3Rpb24gY29tcGlsZTIoZXZlbnRzKSB7CiAgICBsZXQgaW5kZXgyID0gLTE7CiAgICBsZXQgc3RhcnQgPSAwOwogICAgY29uc3QgbGlzdFN0YWNrID0gW107CiAgICBsZXQgaGVhZDIgPSBbXTsKICAgIGxldCBib2R5MyA9IFtdOwogICAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgICBpZiAoIWxpbmVFbmRpbmdTdHlsZSAmJiAoZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImxpbmVFbmRpbmciIHx8IGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nQmxhbmsiKSkgewogICAgICAgIGxpbmVFbmRpbmdTdHlsZSA9IC8qKiBAdHlwZSB7TGluZUVuZGluZ30gKi8KICAgICAgICBldmVudHNbaW5kZXgyXVsyXS5zbGljZVNlcmlhbGl6ZShldmVudHNbaW5kZXgyXVsxXSk7CiAgICAgIH0KICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJsaXN0T3JkZXJlZCIgfHwgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImxpc3RVbm9yZGVyZWQiKSB7CiAgICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzBdID09PSAiZW50ZXIiKSB7CiAgICAgICAgICBsaXN0U3RhY2sucHVzaChpbmRleDIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcmVwYXJlTGlzdChldmVudHMuc2xpY2UobGlzdFN0YWNrLnBvcCgpLCBpbmRleDIpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGV2ZW50c1tpbmRleDJdWzFdLnR5cGUgPT09ICJkZWZpbml0aW9uIikgewogICAgICAgIGlmIChldmVudHNbaW5kZXgyXVswXSA9PT0gImVudGVyIikgewogICAgICAgICAgYm9keTMgPSBwdXNoKGJvZHkzLCBldmVudHMuc2xpY2Uoc3RhcnQsIGluZGV4MikpOwogICAgICAgICAgc3RhcnQgPSBpbmRleDI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhlYWQyID0gcHVzaChoZWFkMiwgZXZlbnRzLnNsaWNlKHN0YXJ0LCBpbmRleDIgKyAxKSk7CiAgICAgICAgICBzdGFydCA9IGluZGV4MiArIDE7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBoZWFkMiA9IHB1c2goaGVhZDIsIGJvZHkzKTsKICAgIGhlYWQyID0gcHVzaChoZWFkMiwgZXZlbnRzLnNsaWNlKHN0YXJ0KSk7CiAgICBpbmRleDIgPSAtMTsKICAgIGNvbnN0IHJlc3VsdCA9IGhlYWQyOwogICAgaWYgKGhhbmRsZXJzMi5lbnRlci5udWxsKSB7CiAgICAgIGhhbmRsZXJzMi5lbnRlci5udWxsLmNhbGwoY29udGV4dDIpOwogICAgfQogICAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgICBjb25zdCBoYW5kbGVzID0gaGFuZGxlcnMyW3Jlc3VsdFtpbmRleDJdWzBdXTsKICAgICAgY29uc3Qga2luZCA9IHJlc3VsdFtpbmRleDJdWzFdLnR5cGU7CiAgICAgIGNvbnN0IGhhbmRsZTMgPSBoYW5kbGVzW2tpbmRdOwogICAgICBpZiAoaGFzT3duUHJvcGVydHkyLmNhbGwoaGFuZGxlcywga2luZCkgJiYgaGFuZGxlMykgewogICAgICAgIGhhbmRsZTMuY2FsbCh7CiAgICAgICAgICBzbGljZVNlcmlhbGl6ZTogcmVzdWx0W2luZGV4Ml1bMl0uc2xpY2VTZXJpYWxpemUsCiAgICAgICAgICAuLi5jb250ZXh0MgogICAgICAgIH0sIHJlc3VsdFtpbmRleDJdWzFdKTsKICAgICAgfQogICAgfQogICAgaWYgKGhhbmRsZXJzMi5leGl0Lm51bGwpIHsKICAgICAgaGFuZGxlcnMyLmV4aXQubnVsbC5jYWxsKGNvbnRleHQyKTsKICAgIH0KICAgIHJldHVybiBidWZmZXJzWzBdLmpvaW4oIiIpOwogIH0KICBmdW5jdGlvbiBwcmVwYXJlTGlzdChzbGljZSkgewogICAgY29uc3QgbGVuZ3RoID0gc2xpY2UubGVuZ3RoOwogICAgbGV0IGluZGV4MiA9IDA7CiAgICBsZXQgY29udGFpbmVyQmFsYW5jZSA9IDA7CiAgICBsZXQgbG9vc2UgPSBmYWxzZTsKICAgIGxldCBhdE1hcmtlcjsKICAgIHdoaWxlICgrK2luZGV4MiA8IGxlbmd0aCkgewogICAgICBjb25zdCBldmVudCA9IHNsaWNlW2luZGV4Ml07CiAgICAgIGlmIChldmVudFsxXS5fY29udGFpbmVyKSB7CiAgICAgICAgYXRNYXJrZXIgPSB2b2lkIDA7CiAgICAgICAgaWYgKGV2ZW50WzBdID09PSAiZW50ZXIiKSB7CiAgICAgICAgICBjb250YWluZXJCYWxhbmNlKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnRhaW5lckJhbGFuY2UtLTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBzd2l0Y2ggKGV2ZW50WzFdLnR5cGUpIHsKICAgICAgICBjYXNlICJsaXN0SXRlbVByZWZpeCI6IHsKICAgICAgICAgIGlmIChldmVudFswXSA9PT0gImV4aXQiKSB7CiAgICAgICAgICAgIGF0TWFya2VyID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICJsaW5lUHJlZml4IjogewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgImxpbmVFbmRpbmdCbGFuayI6IHsKICAgICAgICAgIGlmIChldmVudFswXSA9PT0gImVudGVyIiAmJiAhY29udGFpbmVyQmFsYW5jZSkgewogICAgICAgICAgICBpZiAoYXRNYXJrZXIpIHsKICAgICAgICAgICAgICBhdE1hcmtlciA9IHZvaWQgMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBsb29zZSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICBhdE1hcmtlciA9IHZvaWQgMDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHNsaWNlWzBdWzFdLl9sb29zZSA9IGxvb3NlOwogIH0KICBmdW5jdGlvbiBzZXREYXRhKGtleTIsIHZhbHVlMikgewogICAgZGF0YVtrZXkyXSA9IHZhbHVlMjsKICB9CiAgZnVuY3Rpb24gZ2V0RGF0YShrZXkyKSB7CiAgICByZXR1cm4gZGF0YVtrZXkyXTsKICB9CiAgZnVuY3Rpb24gYnVmZmVyMigpIHsKICAgIGJ1ZmZlcnMucHVzaChbXSk7CiAgfQogIGZ1bmN0aW9uIHJlc3VtZSgpIHsKICAgIGNvbnN0IGJ1ZiA9IGJ1ZmZlcnMucG9wKCk7CiAgICByZXR1cm4gYnVmLmpvaW4oIiIpOwogIH0KICBmdW5jdGlvbiB0YWcodmFsdWUyKSB7CiAgICBpZiAoIXRhZ3MpIHJldHVybjsKICAgIHNldERhdGEoImxhc3RXYXNUYWciLCB0cnVlKTsKICAgIGJ1ZmZlcnNbYnVmZmVycy5sZW5ndGggLSAxXS5wdXNoKHZhbHVlMik7CiAgfQogIGZ1bmN0aW9uIHJhdzIodmFsdWUyKSB7CiAgICBzZXREYXRhKCJsYXN0V2FzVGFnIik7CiAgICBidWZmZXJzW2J1ZmZlcnMubGVuZ3RoIC0gMV0ucHVzaCh2YWx1ZTIpOwogIH0KICBmdW5jdGlvbiBsaW5lRW5kaW5nMigpIHsKICAgIHJhdzIobGluZUVuZGluZ1N0eWxlIHx8ICJcbiIpOwogIH0KICBmdW5jdGlvbiBsaW5lRW5kaW5nSWZOZWVkZWQoKSB7CiAgICBjb25zdCBidWZmZXIzID0gYnVmZmVyc1tidWZmZXJzLmxlbmd0aCAtIDFdOwogICAgY29uc3Qgc2xpY2UgPSBidWZmZXIzW2J1ZmZlcjMubGVuZ3RoIC0gMV07CiAgICBjb25zdCBwcmV2aW91czMgPSBzbGljZSA/IHNsaWNlLmNoYXJDb2RlQXQoc2xpY2UubGVuZ3RoIC0gMSkgOiBudWxsOwogICAgaWYgKHByZXZpb3VzMyA9PT0gMTAgfHwgcHJldmlvdXMzID09PSAxMyB8fCBwcmV2aW91czMgPT09IG51bGwpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGluZUVuZGluZzIoKTsKICB9CiAgZnVuY3Rpb24gZW5jb2RlMih2YWx1ZTIpIHsKICAgIHJldHVybiBnZXREYXRhKCJpZ25vcmVFbmNvZGUiKSA/IHZhbHVlMiA6IGVuY29kZSh2YWx1ZTIpOwogIH0KICBmdW5jdGlvbiBvbnJlc3VtZWRyb3AoKSB7CiAgICByZXN1bWUoKTsKICB9CiAgZnVuY3Rpb24gb25lbnRlcmxpc3RvcmRlcmVkKHRva2VuKSB7CiAgICB0aWdodFN0YWNrLnB1c2goIXRva2VuLl9sb29zZSk7CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIHRhZygiPG9sIik7CiAgICBzZXREYXRhKCJleHBlY3RGaXJzdEl0ZW0iLCB0cnVlKTsKICB9CiAgZnVuY3Rpb24gb25lbnRlcmxpc3R1bm9yZGVyZWQodG9rZW4pIHsKICAgIHRpZ2h0U3RhY2sucHVzaCghdG9rZW4uX2xvb3NlKTsKICAgIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgdGFnKCI8dWwiKTsKICAgIHNldERhdGEoImV4cGVjdEZpcnN0SXRlbSIsIHRydWUpOwogIH0KICBmdW5jdGlvbiBvbmVudGVybGlzdGl0ZW12YWx1ZSh0b2tlbikgewogICAgaWYgKGdldERhdGEoImV4cGVjdEZpcnN0SXRlbSIpKSB7CiAgICAgIGNvbnN0IHZhbHVlMiA9IE51bWJlci5wYXJzZUludCh0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKSwgMTApOwogICAgICBpZiAodmFsdWUyICE9PSAxKSB7CiAgICAgICAgdGFnKCcgc3RhcnQ9IicgKyBlbmNvZGUyKFN0cmluZyh2YWx1ZTIpKSArICciJyk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gb25lbnRlcmxpc3RpdGVtbWFya2VyKCkgewogICAgaWYgKGdldERhdGEoImV4cGVjdEZpcnN0SXRlbSIpKSB7CiAgICAgIHRhZygiPiIpOwogICAgfSBlbHNlIHsKICAgICAgb25leGl0bGlzdGl0ZW0oKTsKICAgIH0KICAgIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgdGFnKCI8bGk+Iik7CiAgICBzZXREYXRhKCJleHBlY3RGaXJzdEl0ZW0iKTsKICAgIHNldERhdGEoImxhc3RXYXNUYWciKTsKICB9CiAgZnVuY3Rpb24gb25leGl0bGlzdG9yZGVyZWQoKSB7CiAgICBvbmV4aXRsaXN0aXRlbSgpOwogICAgdGlnaHRTdGFjay5wb3AoKTsKICAgIGxpbmVFbmRpbmcyKCk7CiAgICB0YWcoIjwvb2w+Iik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGxpc3R1bm9yZGVyZWQoKSB7CiAgICBvbmV4aXRsaXN0aXRlbSgpOwogICAgdGlnaHRTdGFjay5wb3AoKTsKICAgIGxpbmVFbmRpbmcyKCk7CiAgICB0YWcoIjwvdWw+Iik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGxpc3RpdGVtKCkgewogICAgaWYgKGdldERhdGEoImxhc3RXYXNUYWciKSAmJiAhZ2V0RGF0YSgic2x1cnBBbGxMaW5lRW5kaW5ncyIpKSB7CiAgICAgIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgfQogICAgdGFnKCI8L2xpPiIpOwogICAgc2V0RGF0YSgic2x1cnBBbGxMaW5lRW5kaW5ncyIpOwogIH0KICBmdW5jdGlvbiBvbmVudGVyYmxvY2txdW90ZSgpIHsKICAgIHRpZ2h0U3RhY2sucHVzaChmYWxzZSk7CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIHRhZygiPGJsb2NrcXVvdGU+Iik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGJsb2NrcXVvdGUoKSB7CiAgICB0aWdodFN0YWNrLnBvcCgpOwogICAgbGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICB0YWcoIjwvYmxvY2txdW90ZT4iKTsKICAgIHNldERhdGEoInNsdXJwQWxsTGluZUVuZGluZ3MiKTsKICB9CiAgZnVuY3Rpb24gb25lbnRlcnBhcmFncmFwaCgpIHsKICAgIGlmICghdGlnaHRTdGFja1t0aWdodFN0YWNrLmxlbmd0aCAtIDFdKSB7CiAgICAgIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgICB0YWcoIjxwPiIpOwogICAgfQogICAgc2V0RGF0YSgic2x1cnBBbGxMaW5lRW5kaW5ncyIpOwogIH0KICBmdW5jdGlvbiBvbmV4aXRwYXJhZ3JhcGgoKSB7CiAgICBpZiAodGlnaHRTdGFja1t0aWdodFN0YWNrLmxlbmd0aCAtIDFdKSB7CiAgICAgIHNldERhdGEoInNsdXJwQWxsTGluZUVuZGluZ3MiLCB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRhZygiPC9wPiIpOwogICAgfQogIH0KICBmdW5jdGlvbiBvbmVudGVyY29kZWZlbmNlZCgpIHsKICAgIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgdGFnKCI8cHJlPjxjb2RlIik7CiAgICBzZXREYXRhKCJmZW5jZXNDb3VudCIsIDApOwogIH0KICBmdW5jdGlvbiBvbmV4aXRjb2RlZmVuY2VkZmVuY2VpbmZvKCkgewogICAgY29uc3QgdmFsdWUyID0gcmVzdW1lKCk7CiAgICB0YWcoJyBjbGFzcz0ibGFuZ3VhZ2UtJyArIHZhbHVlMiArICciJyk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGNvZGVmZW5jZWRmZW5jZSgpIHsKICAgIGNvbnN0IGNvdW50MiA9IGdldERhdGEoImZlbmNlc0NvdW50IikgfHwgMDsKICAgIGlmICghY291bnQyKSB7CiAgICAgIHRhZygiPiIpOwogICAgICBzZXREYXRhKCJzbHVycE9uZUxpbmVFbmRpbmciLCB0cnVlKTsKICAgIH0KICAgIHNldERhdGEoImZlbmNlc0NvdW50IiwgY291bnQyICsgMSk7CiAgfQogIGZ1bmN0aW9uIG9uZW50ZXJjb2RlaW5kZW50ZWQoKSB7CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIHRhZygiPHByZT48Y29kZT4iKTsKICB9CiAgZnVuY3Rpb24gb25leGl0Zmxvd2NvZGUoKSB7CiAgICBjb25zdCBjb3VudDIgPSBnZXREYXRhKCJmZW5jZXNDb3VudCIpOwogICAgaWYgKGNvdW50MiAhPT0gdm9pZCAwICYmIGNvdW50MiA8IDIgJiYgZGF0YS50aWdodFN0YWNrLmxlbmd0aCA+IDAgJiYgIWdldERhdGEoImxhc3RXYXNUYWciKSkgewogICAgICBsaW5lRW5kaW5nMigpOwogICAgfQogICAgaWYgKGdldERhdGEoImZsb3dDb2RlU2VlbkRhdGEiKSkgewogICAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIH0KICAgIHRhZygiPC9jb2RlPjwvcHJlPiIpOwogICAgaWYgKGNvdW50MiAhPT0gdm9pZCAwICYmIGNvdW50MiA8IDIpIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgc2V0RGF0YSgiZmxvd0NvZGVTZWVuRGF0YSIpOwogICAgc2V0RGF0YSgiZmVuY2VzQ291bnQiKTsKICAgIHNldERhdGEoInNsdXJwT25lTGluZUVuZGluZyIpOwogIH0KICBmdW5jdGlvbiBvbmVudGVyaW1hZ2UoKSB7CiAgICBtZWRpYVN0YWNrLnB1c2goewogICAgICBpbWFnZTogdHJ1ZQogICAgfSk7CiAgICB0YWdzID0gdm9pZCAwOwogIH0KICBmdW5jdGlvbiBvbmVudGVybGluaygpIHsKICAgIG1lZGlhU3RhY2sucHVzaCh7fSk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGxhYmVsdGV4dCh0b2tlbikgewogICAgbWVkaWFTdGFja1ttZWRpYVN0YWNrLmxlbmd0aCAtIDFdLmxhYmVsSWQgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICB9CiAgZnVuY3Rpb24gb25leGl0bGFiZWwoKSB7CiAgICBtZWRpYVN0YWNrW21lZGlhU3RhY2subGVuZ3RoIC0gMV0ubGFiZWwgPSByZXN1bWUoKTsKICB9CiAgZnVuY3Rpb24gb25leGl0cmVmZXJlbmNlc3RyaW5nKHRva2VuKSB7CiAgICBtZWRpYVN0YWNrW21lZGlhU3RhY2subGVuZ3RoIC0gMV0ucmVmZXJlbmNlSWQgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICB9CiAgZnVuY3Rpb24gb25lbnRlcnJlc291cmNlKCkgewogICAgYnVmZmVyMigpOwogICAgbWVkaWFTdGFja1ttZWRpYVN0YWNrLmxlbmd0aCAtIDFdLmRlc3RpbmF0aW9uID0gIiI7CiAgfQogIGZ1bmN0aW9uIG9uZW50ZXJyZXNvdXJjZWRlc3RpbmF0aW9uc3RyaW5nKCkgewogICAgYnVmZmVyMigpOwogICAgc2V0RGF0YSgiaWdub3JlRW5jb2RlIiwgdHJ1ZSk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdHJlc291cmNlZGVzdGluYXRpb25zdHJpbmcoKSB7CiAgICBtZWRpYVN0YWNrW21lZGlhU3RhY2subGVuZ3RoIC0gMV0uZGVzdGluYXRpb24gPSByZXN1bWUoKTsKICAgIHNldERhdGEoImlnbm9yZUVuY29kZSIpOwogIH0KICBmdW5jdGlvbiBvbmV4aXRyZXNvdXJjZXRpdGxlc3RyaW5nKCkgewogICAgbWVkaWFTdGFja1ttZWRpYVN0YWNrLmxlbmd0aCAtIDFdLnRpdGxlID0gcmVzdW1lKCk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdG1lZGlhKCkgewogICAgbGV0IGluZGV4MiA9IG1lZGlhU3RhY2subGVuZ3RoIC0gMTsKICAgIGNvbnN0IG1lZGlhID0gbWVkaWFTdGFja1tpbmRleDJdOwogICAgY29uc3QgaWQgPSBtZWRpYS5yZWZlcmVuY2VJZCB8fCBtZWRpYS5sYWJlbElkOwogICAgY29uc3QgY29udGV4dDMgPSBtZWRpYS5kZXN0aW5hdGlvbiA9PT0gdm9pZCAwID8gZGVmaW5pdGlvbnNbbm9ybWFsaXplSWRlbnRpZmllcihpZCldIDogbWVkaWE7CiAgICB0YWdzID0gdHJ1ZTsKICAgIHdoaWxlIChpbmRleDItLSkgewogICAgICBpZiAobWVkaWFTdGFja1tpbmRleDJdLmltYWdlKSB7CiAgICAgICAgdGFncyA9IHZvaWQgMDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKG1lZGlhLmltYWdlKSB7CiAgICAgIHRhZygnPGltZyBzcmM9IicgKyBzYW5pdGl6ZVVyaShjb250ZXh0My5kZXN0aW5hdGlvbiwgc2V0dGluZ3MuYWxsb3dEYW5nZXJvdXNQcm90b2NvbCA/IHZvaWQgMCA6IHByb3RvY29sU291cmNlKSArICciIGFsdD0iJyk7CiAgICAgIHJhdzIobWVkaWEubGFiZWwpOwogICAgICB0YWcoJyInKTsKICAgIH0gZWxzZSB7CiAgICAgIHRhZygnPGEgaHJlZj0iJyArIHNhbml0aXplVXJpKGNvbnRleHQzLmRlc3RpbmF0aW9uLCBzZXR0aW5ncy5hbGxvd0Rhbmdlcm91c1Byb3RvY29sID8gdm9pZCAwIDogcHJvdG9jb2xIcmVmKSArICciJyk7CiAgICB9CiAgICB0YWcoY29udGV4dDMudGl0bGUgPyAnIHRpdGxlPSInICsgY29udGV4dDMudGl0bGUgKyAnIicgOiAiIik7CiAgICBpZiAobWVkaWEuaW1hZ2UpIHsKICAgICAgdGFnKCIgLz4iKTsKICAgIH0gZWxzZSB7CiAgICAgIHRhZygiPiIpOwogICAgICByYXcyKG1lZGlhLmxhYmVsKTsKICAgICAgdGFnKCI8L2E+Iik7CiAgICB9CiAgICBtZWRpYVN0YWNrLnBvcCgpOwogIH0KICBmdW5jdGlvbiBvbmVudGVyZGVmaW5pdGlvbigpIHsKICAgIGJ1ZmZlcjIoKTsKICAgIG1lZGlhU3RhY2sucHVzaCh7fSk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZyh0b2tlbikgewogICAgcmVzdW1lKCk7CiAgICBtZWRpYVN0YWNrW21lZGlhU3RhY2subGVuZ3RoIC0gMV0ubGFiZWxJZCA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwogIH0KICBmdW5jdGlvbiBvbmVudGVyZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nKCkgewogICAgYnVmZmVyMigpOwogICAgc2V0RGF0YSgiaWdub3JlRW5jb2RlIiwgdHJ1ZSk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGRlZmluaXRpb25kZXN0aW5hdGlvbnN0cmluZygpIHsKICAgIG1lZGlhU3RhY2tbbWVkaWFTdGFjay5sZW5ndGggLSAxXS5kZXN0aW5hdGlvbiA9IHJlc3VtZSgpOwogICAgc2V0RGF0YSgiaWdub3JlRW5jb2RlIik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGRlZmluaXRpb250aXRsZXN0cmluZygpIHsKICAgIG1lZGlhU3RhY2tbbWVkaWFTdGFjay5sZW5ndGggLSAxXS50aXRsZSA9IHJlc3VtZSgpOwogIH0KICBmdW5jdGlvbiBvbmV4aXRkZWZpbml0aW9uKCkgewogICAgY29uc3QgbWVkaWEgPSBtZWRpYVN0YWNrW21lZGlhU3RhY2subGVuZ3RoIC0gMV07CiAgICBjb25zdCBpZCA9IG5vcm1hbGl6ZUlkZW50aWZpZXIobWVkaWEubGFiZWxJZCk7CiAgICByZXN1bWUoKTsKICAgIGlmICghaGFzT3duUHJvcGVydHkyLmNhbGwoZGVmaW5pdGlvbnMsIGlkKSkgewogICAgICBkZWZpbml0aW9uc1tpZF0gPSBtZWRpYVN0YWNrW21lZGlhU3RhY2subGVuZ3RoIC0gMV07CiAgICB9CiAgICBtZWRpYVN0YWNrLnBvcCgpOwogIH0KICBmdW5jdGlvbiBvbmVudGVyY29udGVudCgpIHsKICAgIHNldERhdGEoInNsdXJwQWxsTGluZUVuZGluZ3MiLCB0cnVlKTsKICB9CiAgZnVuY3Rpb24gb25leGl0YXR4aGVhZGluZ3NlcXVlbmNlKHRva2VuKSB7CiAgICBpZiAoZ2V0RGF0YSgiaGVhZGluZ1JhbmsiKSkgcmV0dXJuOwogICAgc2V0RGF0YSgiaGVhZGluZ1JhbmsiLCB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKS5sZW5ndGgpOwogICAgbGluZUVuZGluZ0lmTmVlZGVkKCk7CiAgICB0YWcoIjxoIiArIGdldERhdGEoImhlYWRpbmdSYW5rIikgKyAiPiIpOwogIH0KICBmdW5jdGlvbiBvbmVudGVyc2V0ZXh0aGVhZGluZygpIHsKICAgIGJ1ZmZlcjIoKTsKICAgIHNldERhdGEoInNsdXJwQWxsTGluZUVuZGluZ3MiKTsKICB9CiAgZnVuY3Rpb24gb25leGl0c2V0ZXh0aGVhZGluZ3RleHQoKSB7CiAgICBzZXREYXRhKCJzbHVycEFsbExpbmVFbmRpbmdzIiwgdHJ1ZSk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGF0eGhlYWRpbmcoKSB7CiAgICB0YWcoIjwvaCIgKyBnZXREYXRhKCJoZWFkaW5nUmFuayIpICsgIj4iKTsKICAgIHNldERhdGEoImhlYWRpbmdSYW5rIik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdHNldGV4dGhlYWRpbmdsaW5lc2VxdWVuY2UodG9rZW4pIHsKICAgIHNldERhdGEoImhlYWRpbmdSYW5rIiwgdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbikuY2hhckNvZGVBdCgwKSA9PT0gNjEgPyAxIDogMik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdHNldGV4dGhlYWRpbmcoKSB7CiAgICBjb25zdCB2YWx1ZTIgPSByZXN1bWUoKTsKICAgIGxpbmVFbmRpbmdJZk5lZWRlZCgpOwogICAgdGFnKCI8aCIgKyBnZXREYXRhKCJoZWFkaW5nUmFuayIpICsgIj4iKTsKICAgIHJhdzIodmFsdWUyKTsKICAgIHRhZygiPC9oIiArIGdldERhdGEoImhlYWRpbmdSYW5rIikgKyAiPiIpOwogICAgc2V0RGF0YSgic2x1cnBBbGxMaW5lRW5kaW5ncyIpOwogICAgc2V0RGF0YSgiaGVhZGluZ1JhbmsiKTsKICB9CiAgZnVuY3Rpb24gb25leGl0ZGF0YSh0b2tlbikgewogICAgcmF3MihlbmNvZGUyKHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pKSk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGxpbmVlbmRpbmcodG9rZW4pIHsKICAgIGlmIChnZXREYXRhKCJzbHVycEFsbExpbmVFbmRpbmdzIikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGdldERhdGEoInNsdXJwT25lTGluZUVuZGluZyIpKSB7CiAgICAgIHNldERhdGEoInNsdXJwT25lTGluZUVuZGluZyIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZ2V0RGF0YSgiaW5Db2RlVGV4dCIpKSB7CiAgICAgIHJhdzIoIiAiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgcmF3MihlbmNvZGUyKHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pKSk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGNvZGVmbG93dmFsdWUodG9rZW4pIHsKICAgIHJhdzIoZW5jb2RlMih0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKSkpOwogICAgc2V0RGF0YSgiZmxvd0NvZGVTZWVuRGF0YSIsIHRydWUpOwogIH0KICBmdW5jdGlvbiBvbmV4aXRoYXJkYnJlYWsoKSB7CiAgICB0YWcoIjxiciAvPiIpOwogIH0KICBmdW5jdGlvbiBvbmVudGVyaHRtbGZsb3coKSB7CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIG9uZW50ZXJodG1sKCk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGh0bWwoKSB7CiAgICBzZXREYXRhKCJpZ25vcmVFbmNvZGUiKTsKICB9CiAgZnVuY3Rpb24gb25lbnRlcmh0bWwoKSB7CiAgICBpZiAoc2V0dGluZ3MuYWxsb3dEYW5nZXJvdXNIdG1sKSB7CiAgICAgIHNldERhdGEoImlnbm9yZUVuY29kZSIsIHRydWUpOwogICAgfQogIH0KICBmdW5jdGlvbiBvbmVudGVyZW1waGFzaXMoKSB7CiAgICB0YWcoIjxlbT4iKTsKICB9CiAgZnVuY3Rpb24gb25lbnRlcnN0cm9uZygpIHsKICAgIHRhZygiPHN0cm9uZz4iKTsKICB9CiAgZnVuY3Rpb24gb25lbnRlcmNvZGV0ZXh0KCkgewogICAgc2V0RGF0YSgiaW5Db2RlVGV4dCIsIHRydWUpOwogICAgdGFnKCI8Y29kZT4iKTsKICB9CiAgZnVuY3Rpb24gb25leGl0Y29kZXRleHQoKSB7CiAgICBzZXREYXRhKCJpbkNvZGVUZXh0Iik7CiAgICB0YWcoIjwvY29kZT4iKTsKICB9CiAgZnVuY3Rpb24gb25leGl0ZW1waGFzaXMoKSB7CiAgICB0YWcoIjwvZW0+Iik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdHN0cm9uZygpIHsKICAgIHRhZygiPC9zdHJvbmc+Iik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdHRoZW1hdGljYnJlYWsoKSB7CiAgICBsaW5lRW5kaW5nSWZOZWVkZWQoKTsKICAgIHRhZygiPGhyIC8+Iik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZW1hcmtlcih0b2tlbikgewogICAgc2V0RGF0YSgiY2hhcmFjdGVyUmVmZXJlbmNlVHlwZSIsIHRva2VuLnR5cGUpOwogIH0KICBmdW5jdGlvbiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2V2YWx1ZSh0b2tlbikgewogICAgY29uc3QgdmFsdWUyID0gdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbik7CiAgICBjb25zdCBkZWNvZGVkID0gZ2V0RGF0YSgiY2hhcmFjdGVyUmVmZXJlbmNlVHlwZSIpID8gZGVjb2RlTnVtZXJpY0NoYXJhY3RlclJlZmVyZW5jZSh2YWx1ZTIsIGdldERhdGEoImNoYXJhY3RlclJlZmVyZW5jZVR5cGUiKSA9PT0gImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlck51bWVyaWMiID8gMTAgOiAxNikgOiBkZWNvZGVOYW1lZENoYXJhY3RlclJlZmVyZW5jZSh2YWx1ZTIpOwogICAgcmF3MihlbmNvZGUyKAogICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgZGVjb2RlZAogICAgKSk7CiAgICBzZXREYXRhKCJjaGFyYWN0ZXJSZWZlcmVuY2VUeXBlIik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGF1dG9saW5rcHJvdG9jb2wodG9rZW4pIHsKICAgIGNvbnN0IHVyaSA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwogICAgdGFnKCc8YSBocmVmPSInICsgc2FuaXRpemVVcmkodXJpLCBzZXR0aW5ncy5hbGxvd0Rhbmdlcm91c1Byb3RvY29sID8gdm9pZCAwIDogcHJvdG9jb2xIcmVmKSArICciPicpOwogICAgcmF3MihlbmNvZGUyKHVyaSkpOwogICAgdGFnKCI8L2E+Iik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGF1dG9saW5rZW1haWwodG9rZW4pIHsKICAgIGNvbnN0IHVyaSA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pOwogICAgdGFnKCc8YSBocmVmPSInICsgc2FuaXRpemVVcmkoIm1haWx0bzoiICsgdXJpKSArICciPicpOwogICAgcmF3MihlbmNvZGUyKHVyaSkpOwogICAgdGFnKCI8L2E+Iik7CiAgfQp9CnZhciBoYXNPd25Qcm9wZXJ0eTIsIHByb3RvY29sSHJlZiwgcHJvdG9jb2xTb3VyY2U7CnZhciBpbml0X2NvbXBpbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvY29tcGlsZS5qcyIoKSB7CiAgICBpbml0X2luZGV4X2RvbSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaHVua2VkKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NvbWJpbmVfZXh0ZW5zaW9ucygpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9kZWNvZGVfbnVtZXJpY19jaGFyYWN0ZXJfcmVmZXJlbmNlKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2VuY29kZSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9ub3JtYWxpemVfaWRlbnRpZmllcigpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9zYW5pdGl6ZV91cmkoKTsKICAgIGhhc093blByb3BlcnR5MiA9IHt9Lmhhc093blByb3BlcnR5OwogICAgcHJvdG9jb2xIcmVmID0gL14oaHR0cHM/fGlyY3M/fG1haWx0b3x4bXBwKSQvaTsKICAgIHByb3RvY29sU291cmNlID0gL15odHRwcz8kL2k7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvaW5pdGlhbGl6ZS9jb250ZW50LmpzCmZ1bmN0aW9uIGluaXRpYWxpemVDb250ZW50KGVmZmVjdHMpIHsKICBjb25zdCBjb250ZW50U3RhcnQgPSBlZmZlY3RzLmF0dGVtcHQodGhpcy5wYXJzZXIuY29uc3RydWN0cy5jb250ZW50SW5pdGlhbCwgYWZ0ZXJDb250ZW50U3RhcnRDb25zdHJ1Y3QsIHBhcmFncmFwaEluaXRpYWwpOwogIGxldCBwcmV2aW91czM7CiAgcmV0dXJuIGNvbnRlbnRTdGFydDsKICBmdW5jdGlvbiBhZnRlckNvbnRlbnRTdGFydENvbnN0cnVjdChjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgY29udGVudFN0YXJ0LCAibGluZVByZWZpeCIpOwogIH0KICBmdW5jdGlvbiBwYXJhZ3JhcGhJbml0aWFsKGNvZGU0KSB7CiAgICBlZmZlY3RzLmVudGVyKCJwYXJhZ3JhcGgiKTsKICAgIHJldHVybiBsaW5lU3RhcnQoY29kZTQpOwogIH0KICBmdW5jdGlvbiBsaW5lU3RhcnQoY29kZTQpIHsKICAgIGNvbnN0IHRva2VuID0gZWZmZWN0cy5lbnRlcigiY2h1bmtUZXh0IiwgewogICAgICBjb250ZW50VHlwZTogInRleHQiLAogICAgICBwcmV2aW91czogcHJldmlvdXMzCiAgICB9KTsKICAgIGlmIChwcmV2aW91czMpIHsKICAgICAgcHJldmlvdXMzLm5leHQgPSB0b2tlbjsKICAgIH0KICAgIHByZXZpb3VzMyA9IHRva2VuOwogICAgcmV0dXJuIGRhdGEoY29kZTQpOwogIH0KICBmdW5jdGlvbiBkYXRhKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgZWZmZWN0cy5leGl0KCJjaHVua1RleHQiKTsKICAgICAgZWZmZWN0cy5leGl0KCJwYXJhZ3JhcGgiKTsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlNCkpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgZWZmZWN0cy5leGl0KCJjaHVua1RleHQiKTsKICAgICAgcmV0dXJuIGxpbmVTdGFydDsKICAgIH0KICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICByZXR1cm4gZGF0YTsKICB9Cn0KdmFyIGNvbnRlbnQyOwp2YXIgaW5pdF9jb250ZW50MiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFya0A0LjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrL2xpYi9pbml0aWFsaXplL2NvbnRlbnQuanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9zcGFjZSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGNvbnRlbnQyID0gewogICAgICB0b2tlbml6ZTogaW5pdGlhbGl6ZUNvbnRlbnQKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvaW5pdGlhbGl6ZS9kb2N1bWVudC5qcwpmdW5jdGlvbiBpbml0aWFsaXplRG9jdW1lbnQoZWZmZWN0cykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBjb25zdCBzdGFjayA9IFtdOwogIGxldCBjb250aW51ZWQgPSAwOwogIGxldCBjaGlsZEZsb3c7CiAgbGV0IGNoaWxkVG9rZW47CiAgbGV0IGxpbmVTdGFydE9mZnNldDsKICByZXR1cm4gc3RhcnQ7CiAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgIGlmIChjb250aW51ZWQgPCBzdGFjay5sZW5ndGgpIHsKICAgICAgY29uc3QgaXRlbSA9IHN0YWNrW2NvbnRpbnVlZF07CiAgICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlID0gaXRlbVsxXTsKICAgICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChpdGVtWzBdLmNvbnRpbnVhdGlvbiwgZG9jdW1lbnRDb250aW51ZSwgY2hlY2tOZXdDb250YWluZXJzKShjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gY2hlY2tOZXdDb250YWluZXJzKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gZG9jdW1lbnRDb250aW51ZShjb2RlNCkgewogICAgY29udGludWVkKys7CiAgICBpZiAoc2VsZjIuY29udGFpbmVyU3RhdGUuX2Nsb3NlRmxvdykgewogICAgICBzZWxmMi5jb250YWluZXJTdGF0ZS5fY2xvc2VGbG93ID0gdm9pZCAwOwogICAgICBpZiAoY2hpbGRGbG93KSB7CiAgICAgICAgY2xvc2VGbG93KCk7CiAgICAgIH0KICAgICAgY29uc3QgaW5kZXhCZWZvcmVFeGl0cyA9IHNlbGYyLmV2ZW50cy5sZW5ndGg7CiAgICAgIGxldCBpbmRleEJlZm9yZUZsb3cgPSBpbmRleEJlZm9yZUV4aXRzOwogICAgICBsZXQgcG9pbnQ0OwogICAgICB3aGlsZSAoaW5kZXhCZWZvcmVGbG93LS0pIHsKICAgICAgICBpZiAoc2VsZjIuZXZlbnRzW2luZGV4QmVmb3JlRmxvd11bMF0gPT09ICJleGl0IiAmJiBzZWxmMi5ldmVudHNbaW5kZXhCZWZvcmVGbG93XVsxXS50eXBlID09PSAiY2h1bmtGbG93IikgewogICAgICAgICAgcG9pbnQ0ID0gc2VsZjIuZXZlbnRzW2luZGV4QmVmb3JlRmxvd11bMV0uZW5kOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGV4aXRDb250YWluZXJzKGNvbnRpbnVlZCk7CiAgICAgIGxldCBpbmRleDIgPSBpbmRleEJlZm9yZUV4aXRzOwogICAgICB3aGlsZSAoaW5kZXgyIDwgc2VsZjIuZXZlbnRzLmxlbmd0aCkgewogICAgICAgIHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLmVuZCA9IHsKICAgICAgICAgIC4uLnBvaW50NAogICAgICAgIH07CiAgICAgICAgaW5kZXgyKys7CiAgICAgIH0KICAgICAgc3BsaWNlKHNlbGYyLmV2ZW50cywgaW5kZXhCZWZvcmVGbG93ICsgMSwgMCwgc2VsZjIuZXZlbnRzLnNsaWNlKGluZGV4QmVmb3JlRXhpdHMpKTsKICAgICAgc2VsZjIuZXZlbnRzLmxlbmd0aCA9IGluZGV4MjsKICAgICAgcmV0dXJuIGNoZWNrTmV3Q29udGFpbmVycyhjb2RlNCk7CiAgICB9CiAgICByZXR1cm4gc3RhcnQoY29kZTQpOwogIH0KICBmdW5jdGlvbiBjaGVja05ld0NvbnRhaW5lcnMoY29kZTQpIHsKICAgIGlmIChjb250aW51ZWQgPT09IHN0YWNrLmxlbmd0aCkgewogICAgICBpZiAoIWNoaWxkRmxvdykgewogICAgICAgIHJldHVybiBkb2N1bWVudENvbnRpbnVlZChjb2RlNCk7CiAgICAgIH0KICAgICAgaWYgKGNoaWxkRmxvdy5jdXJyZW50Q29uc3RydWN0ICYmIGNoaWxkRmxvdy5jdXJyZW50Q29uc3RydWN0LmNvbmNyZXRlKSB7CiAgICAgICAgcmV0dXJuIGZsb3dTdGFydChjb2RlNCk7CiAgICAgIH0KICAgICAgc2VsZjIuaW50ZXJydXB0ID0gQm9vbGVhbihjaGlsZEZsb3cuY3VycmVudENvbnN0cnVjdCAmJiAhY2hpbGRGbG93Ll9nZm1UYWJsZUR5bmFtaWNJbnRlcnJ1cHRIYWNrKTsKICAgIH0KICAgIHNlbGYyLmNvbnRhaW5lclN0YXRlID0ge307CiAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhjb250YWluZXJDb25zdHJ1Y3QsIHRoZXJlSXNBTmV3Q29udGFpbmVyLCB0aGVyZUlzTm9OZXdDb250YWluZXIpKGNvZGU0KTsKICB9CiAgZnVuY3Rpb24gdGhlcmVJc0FOZXdDb250YWluZXIoY29kZTQpIHsKICAgIGlmIChjaGlsZEZsb3cpIGNsb3NlRmxvdygpOwogICAgZXhpdENvbnRhaW5lcnMoY29udGludWVkKTsKICAgIHJldHVybiBkb2N1bWVudENvbnRpbnVlZChjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIHRoZXJlSXNOb05ld0NvbnRhaW5lcihjb2RlNCkgewogICAgc2VsZjIucGFyc2VyLmxhenlbc2VsZjIubm93KCkubGluZV0gPSBjb250aW51ZWQgIT09IHN0YWNrLmxlbmd0aDsKICAgIGxpbmVTdGFydE9mZnNldCA9IHNlbGYyLm5vdygpLm9mZnNldDsKICAgIHJldHVybiBmbG93U3RhcnQoY29kZTQpOwogIH0KICBmdW5jdGlvbiBkb2N1bWVudENvbnRpbnVlZChjb2RlNCkgewogICAgc2VsZjIuY29udGFpbmVyU3RhdGUgPSB7fTsKICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoY29udGFpbmVyQ29uc3RydWN0LCBjb250YWluZXJDb250aW51ZSwgZmxvd1N0YXJ0KShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGNvbnRhaW5lckNvbnRpbnVlKGNvZGU0KSB7CiAgICBjb250aW51ZWQrKzsKICAgIHN0YWNrLnB1c2goW3NlbGYyLmN1cnJlbnRDb25zdHJ1Y3QsIHNlbGYyLmNvbnRhaW5lclN0YXRlXSk7CiAgICByZXR1cm4gZG9jdW1lbnRDb250aW51ZWQoY29kZTQpOwogIH0KICBmdW5jdGlvbiBmbG93U3RhcnQoY29kZTQpIHsKICAgIGlmIChjb2RlNCA9PT0gbnVsbCkgewogICAgICBpZiAoY2hpbGRGbG93KSBjbG9zZUZsb3coKTsKICAgICAgZXhpdENvbnRhaW5lcnMoMCk7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNoaWxkRmxvdyA9IGNoaWxkRmxvdyB8fCBzZWxmMi5wYXJzZXIuZmxvdyhzZWxmMi5ub3coKSk7CiAgICBlZmZlY3RzLmVudGVyKCJjaHVua0Zsb3ciLCB7CiAgICAgIF90b2tlbml6ZXI6IGNoaWxkRmxvdywKICAgICAgY29udGVudFR5cGU6ICJmbG93IiwKICAgICAgcHJldmlvdXM6IGNoaWxkVG9rZW4KICAgIH0pOwogICAgcmV0dXJuIGZsb3dDb250aW51ZShjb2RlNCk7CiAgfQogIGZ1bmN0aW9uIGZsb3dDb250aW51ZShjb2RlNCkgewogICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgIHdyaXRlVG9DaGlsZChlZmZlY3RzLmV4aXQoImNodW5rRmxvdyIpLCB0cnVlKTsKICAgICAgZXhpdENvbnRhaW5lcnMoMCk7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHdyaXRlVG9DaGlsZChlZmZlY3RzLmV4aXQoImNodW5rRmxvdyIpKTsKICAgICAgY29udGludWVkID0gMDsKICAgICAgc2VsZjIuaW50ZXJydXB0ID0gdm9pZCAwOwogICAgICByZXR1cm4gc3RhcnQ7CiAgICB9CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgcmV0dXJuIGZsb3dDb250aW51ZTsKICB9CiAgZnVuY3Rpb24gd3JpdGVUb0NoaWxkKHRva2VuLCBlbmRPZkZpbGUpIHsKICAgIGNvbnN0IHN0cmVhbSA9IHNlbGYyLnNsaWNlU3RyZWFtKHRva2VuKTsKICAgIGlmIChlbmRPZkZpbGUpIHN0cmVhbS5wdXNoKG51bGwpOwogICAgdG9rZW4ucHJldmlvdXMgPSBjaGlsZFRva2VuOwogICAgaWYgKGNoaWxkVG9rZW4pIGNoaWxkVG9rZW4ubmV4dCA9IHRva2VuOwogICAgY2hpbGRUb2tlbiA9IHRva2VuOwogICAgY2hpbGRGbG93LmRlZmluZVNraXAodG9rZW4uc3RhcnQpOwogICAgY2hpbGRGbG93LndyaXRlKHN0cmVhbSk7CiAgICBpZiAoc2VsZjIucGFyc2VyLmxhenlbdG9rZW4uc3RhcnQubGluZV0pIHsKICAgICAgbGV0IGluZGV4MiA9IGNoaWxkRmxvdy5ldmVudHMubGVuZ3RoOwogICAgICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgICAgICBpZiAoCiAgICAgICAgICAvLyBUaGUgdG9rZW4gc3RhcnRzIGJlZm9yZSB0aGUgbGluZSBlbmRpbmfigKYKICAgICAgICAgIGNoaWxkRmxvdy5ldmVudHNbaW5kZXgyXVsxXS5zdGFydC5vZmZzZXQgPCBsaW5lU3RhcnRPZmZzZXQgJiYgLy8g4oCmYW5kIGVpdGhlciBpcyBub3QgZW5kZWQgeWV04oCmCiAgICAgICAgICAoIWNoaWxkRmxvdy5ldmVudHNbaW5kZXgyXVsxXS5lbmQgfHwgLy8g4oCmb3IgZW5kcyBhZnRlciBpdC4KICAgICAgICAgIGNoaWxkRmxvdy5ldmVudHNbaW5kZXgyXVsxXS5lbmQub2Zmc2V0ID4gbGluZVN0YXJ0T2Zmc2V0KQogICAgICAgICkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBpbmRleEJlZm9yZUV4aXRzID0gc2VsZjIuZXZlbnRzLmxlbmd0aDsKICAgICAgbGV0IGluZGV4QmVmb3JlRmxvdyA9IGluZGV4QmVmb3JlRXhpdHM7CiAgICAgIGxldCBzZWVuOwogICAgICBsZXQgcG9pbnQ0OwogICAgICB3aGlsZSAoaW5kZXhCZWZvcmVGbG93LS0pIHsKICAgICAgICBpZiAoc2VsZjIuZXZlbnRzW2luZGV4QmVmb3JlRmxvd11bMF0gPT09ICJleGl0IiAmJiBzZWxmMi5ldmVudHNbaW5kZXhCZWZvcmVGbG93XVsxXS50eXBlID09PSAiY2h1bmtGbG93IikgewogICAgICAgICAgaWYgKHNlZW4pIHsKICAgICAgICAgICAgcG9pbnQ0ID0gc2VsZjIuZXZlbnRzW2luZGV4QmVmb3JlRmxvd11bMV0uZW5kOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHNlZW4gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBleGl0Q29udGFpbmVycyhjb250aW51ZWQpOwogICAgICBpbmRleDIgPSBpbmRleEJlZm9yZUV4aXRzOwogICAgICB3aGlsZSAoaW5kZXgyIDwgc2VsZjIuZXZlbnRzLmxlbmd0aCkgewogICAgICAgIHNlbGYyLmV2ZW50c1tpbmRleDJdWzFdLmVuZCA9IHsKICAgICAgICAgIC4uLnBvaW50NAogICAgICAgIH07CiAgICAgICAgaW5kZXgyKys7CiAgICAgIH0KICAgICAgc3BsaWNlKHNlbGYyLmV2ZW50cywgaW5kZXhCZWZvcmVGbG93ICsgMSwgMCwgc2VsZjIuZXZlbnRzLnNsaWNlKGluZGV4QmVmb3JlRXhpdHMpKTsKICAgICAgc2VsZjIuZXZlbnRzLmxlbmd0aCA9IGluZGV4MjsKICAgIH0KICB9CiAgZnVuY3Rpb24gZXhpdENvbnRhaW5lcnMoc2l6ZSkgewogICAgbGV0IGluZGV4MiA9IHN0YWNrLmxlbmd0aDsKICAgIHdoaWxlIChpbmRleDItLSA+IHNpemUpIHsKICAgICAgY29uc3QgZW50cnkgPSBzdGFja1tpbmRleDJdOwogICAgICBzZWxmMi5jb250YWluZXJTdGF0ZSA9IGVudHJ5WzFdOwogICAgICBlbnRyeVswXS5leGl0LmNhbGwoc2VsZjIsIGVmZmVjdHMpOwogICAgfQogICAgc3RhY2subGVuZ3RoID0gc2l6ZTsKICB9CiAgZnVuY3Rpb24gY2xvc2VGbG93KCkgewogICAgY2hpbGRGbG93LndyaXRlKFtudWxsXSk7CiAgICBjaGlsZFRva2VuID0gdm9pZCAwOwogICAgY2hpbGRGbG93ID0gdm9pZCAwOwogICAgc2VsZjIuY29udGFpbmVyU3RhdGUuX2Nsb3NlRmxvdyA9IHZvaWQgMDsKICB9Cn0KZnVuY3Rpb24gdG9rZW5pemVDb250YWluZXIoZWZmZWN0cywgb2szLCBub2spIHsKICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGVmZmVjdHMuYXR0ZW1wdCh0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmRvY3VtZW50LCBvazMsIG5vayksICJsaW5lUHJlZml4IiwgdGhpcy5wYXJzZXIuY29uc3RydWN0cy5kaXNhYmxlLm51bGwuaW5jbHVkZXMoImNvZGVJbmRlbnRlZCIpID8gdm9pZCAwIDogNCk7Cn0KdmFyIGRvY3VtZW50MiwgY29udGFpbmVyQ29uc3RydWN0Owp2YXIgaW5pdF9kb2N1bWVudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFya0A0LjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrL2xpYi9pbml0aWFsaXplL2RvY3VtZW50LmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX2ZhY3Rvcnlfc3BhY2UoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2hhcmFjdGVyKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2NodW5rZWQoKTsKICAgIGRvY3VtZW50MiA9IHsKICAgICAgdG9rZW5pemU6IGluaXRpYWxpemVEb2N1bWVudAogICAgfTsKICAgIGNvbnRhaW5lckNvbnN0cnVjdCA9IHsKICAgICAgdG9rZW5pemU6IHRva2VuaXplQ29udGFpbmVyCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL2luaXRpYWxpemUvZmxvdy5qcwpmdW5jdGlvbiBpbml0aWFsaXplRmxvdyhlZmZlY3RzKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGNvbnN0IGluaXRpYWwyID0gZWZmZWN0cy5hdHRlbXB0KAogICAgLy8gVHJ5IHRvIHBhcnNlIGEgYmxhbmsgbGluZS4KICAgIGJsYW5rTGluZSwKICAgIGF0QmxhbmtFbmRpbmcsCiAgICAvLyBUcnkgdG8gcGFyc2UgaW5pdGlhbCBmbG93IChlc3NlbnRpYWxseSwgb25seSBjb2RlKS4KICAgIGVmZmVjdHMuYXR0ZW1wdCh0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmZsb3dJbml0aWFsLCBhZnRlckNvbnN0cnVjdCwgZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGVmZmVjdHMuYXR0ZW1wdCh0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmZsb3csIGFmdGVyQ29uc3RydWN0LCBlZmZlY3RzLmF0dGVtcHQoY29udGVudCwgYWZ0ZXJDb25zdHJ1Y3QpKSwgImxpbmVQcmVmaXgiKSkKICApOwogIHJldHVybiBpbml0aWFsMjsKICBmdW5jdGlvbiBhdEJsYW5rRW5kaW5nKGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZ0JsYW5rIik7CiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgZWZmZWN0cy5leGl0KCJsaW5lRW5kaW5nQmxhbmsiKTsKICAgIHNlbGYyLmN1cnJlbnRDb25zdHJ1Y3QgPSB2b2lkIDA7CiAgICByZXR1cm4gaW5pdGlhbDI7CiAgfQogIGZ1bmN0aW9uIGFmdGVyQ29uc3RydWN0KGNvZGU0KSB7CiAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZyIpOwogICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgc2VsZjIuY3VycmVudENvbnN0cnVjdCA9IHZvaWQgMDsKICAgIHJldHVybiBpbml0aWFsMjsKICB9Cn0KdmFyIGZsb3c7CnZhciBpbml0X2Zsb3cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvaW5pdGlhbGl6ZS9mbG93LmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX2NvcmVfY29tbW9ubWFyaygpOwogICAgaW5pdF9taWNyb21hcmtfZmFjdG9yeV9zcGFjZSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGZsb3cgPSB7CiAgICAgIHRva2VuaXplOiBpbml0aWFsaXplRmxvdwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFya0A0LjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrL2xpYi9pbml0aWFsaXplL3RleHQuanMKZnVuY3Rpb24gaW5pdGlhbGl6ZUZhY3RvcnkoZmllbGQpIHsKICByZXR1cm4gewogICAgcmVzb2x2ZUFsbDogY3JlYXRlUmVzb2x2ZXIoZmllbGQgPT09ICJ0ZXh0IiA/IHJlc29sdmVBbGxMaW5lU3VmZml4ZXMgOiB2b2lkIDApLAogICAgdG9rZW5pemU6IGluaXRpYWxpemVUZXh0CiAgfTsKICBmdW5jdGlvbiBpbml0aWFsaXplVGV4dChlZmZlY3RzKSB7CiAgICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgICBjb25zdCBjb25zdHJ1Y3RzMiA9IHRoaXMucGFyc2VyLmNvbnN0cnVjdHNbZmllbGRdOwogICAgY29uc3QgdGV4dDkgPSBlZmZlY3RzLmF0dGVtcHQoY29uc3RydWN0czIsIHN0YXJ0LCBub3RUZXh0KTsKICAgIHJldHVybiBzdGFydDsKICAgIGZ1bmN0aW9uIHN0YXJ0KGNvZGU0KSB7CiAgICAgIHJldHVybiBhdEJyZWFrKGNvZGU0KSA/IHRleHQ5KGNvZGU0KSA6IG5vdFRleHQoY29kZTQpOwogICAgfQogICAgZnVuY3Rpb24gbm90VGV4dChjb2RlNCkgewogICAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlZmZlY3RzLmVudGVyKCJkYXRhIik7CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgZnVuY3Rpb24gZGF0YShjb2RlNCkgewogICAgICBpZiAoYXRCcmVhayhjb2RlNCkpIHsKICAgICAgICBlZmZlY3RzLmV4aXQoImRhdGEiKTsKICAgICAgICByZXR1cm4gdGV4dDkoY29kZTQpOwogICAgICB9CiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgZnVuY3Rpb24gYXRCcmVhayhjb2RlNCkgewogICAgICBpZiAoY29kZTQgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBjb25zdCBsaXN0NSA9IGNvbnN0cnVjdHMyW2NvZGU0XTsKICAgICAgbGV0IGluZGV4MiA9IC0xOwogICAgICBpZiAobGlzdDUpIHsKICAgICAgICB3aGlsZSAoKytpbmRleDIgPCBsaXN0NS5sZW5ndGgpIHsKICAgICAgICAgIGNvbnN0IGl0ZW0gPSBsaXN0NVtpbmRleDJdOwogICAgICAgICAgaWYgKCFpdGVtLnByZXZpb3VzIHx8IGl0ZW0ucHJldmlvdXMuY2FsbChzZWxmMiwgc2VsZjIucHJldmlvdXMpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGNyZWF0ZVJlc29sdmVyKGV4dHJhUmVzb2x2ZXIpIHsKICByZXR1cm4gcmVzb2x2ZUFsbFRleHQ7CiAgZnVuY3Rpb24gcmVzb2x2ZUFsbFRleHQoZXZlbnRzLCBjb250ZXh0MikgewogICAgbGV0IGluZGV4MiA9IC0xOwogICAgbGV0IGVudGVyOwogICAgd2hpbGUgKCsraW5kZXgyIDw9IGV2ZW50cy5sZW5ndGgpIHsKICAgICAgaWYgKGVudGVyID09PSB2b2lkIDApIHsKICAgICAgICBpZiAoZXZlbnRzW2luZGV4Ml0gJiYgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImRhdGEiKSB7CiAgICAgICAgICBlbnRlciA9IGluZGV4MjsKICAgICAgICAgIGluZGV4MisrOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICghZXZlbnRzW2luZGV4Ml0gfHwgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSAhPT0gImRhdGEiKSB7CiAgICAgICAgaWYgKGluZGV4MiAhPT0gZW50ZXIgKyAyKSB7CiAgICAgICAgICBldmVudHNbZW50ZXJdWzFdLmVuZCA9IGV2ZW50c1tpbmRleDIgLSAxXVsxXS5lbmQ7CiAgICAgICAgICBldmVudHMuc3BsaWNlKGVudGVyICsgMiwgaW5kZXgyIC0gZW50ZXIgLSAyKTsKICAgICAgICAgIGluZGV4MiA9IGVudGVyICsgMjsKICAgICAgICB9CiAgICAgICAgZW50ZXIgPSB2b2lkIDA7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBleHRyYVJlc29sdmVyID8gZXh0cmFSZXNvbHZlcihldmVudHMsIGNvbnRleHQyKSA6IGV2ZW50czsKICB9Cn0KZnVuY3Rpb24gcmVzb2x2ZUFsbExpbmVTdWZmaXhlcyhldmVudHMsIGNvbnRleHQyKSB7CiAgbGV0IGV2ZW50SW5kZXggPSAwOwogIHdoaWxlICgrK2V2ZW50SW5kZXggPD0gZXZlbnRzLmxlbmd0aCkgewogICAgaWYgKChldmVudEluZGV4ID09PSBldmVudHMubGVuZ3RoIHx8IGV2ZW50c1tldmVudEluZGV4XVsxXS50eXBlID09PSAibGluZUVuZGluZyIpICYmIGV2ZW50c1tldmVudEluZGV4IC0gMV1bMV0udHlwZSA9PT0gImRhdGEiKSB7CiAgICAgIGNvbnN0IGRhdGEgPSBldmVudHNbZXZlbnRJbmRleCAtIDFdWzFdOwogICAgICBjb25zdCBjaHVua3MgPSBjb250ZXh0Mi5zbGljZVN0cmVhbShkYXRhKTsKICAgICAgbGV0IGluZGV4MiA9IGNodW5rcy5sZW5ndGg7CiAgICAgIGxldCBidWZmZXJJbmRleCA9IC0xOwogICAgICBsZXQgc2l6ZSA9IDA7CiAgICAgIGxldCB0YWJzOwogICAgICB3aGlsZSAoaW5kZXgyLS0pIHsKICAgICAgICBjb25zdCBjaHVuayA9IGNodW5rc1tpbmRleDJdOwogICAgICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICBidWZmZXJJbmRleCA9IGNodW5rLmxlbmd0aDsKICAgICAgICAgIHdoaWxlIChjaHVuay5jaGFyQ29kZUF0KGJ1ZmZlckluZGV4IC0gMSkgPT09IDMyKSB7CiAgICAgICAgICAgIHNpemUrKzsKICAgICAgICAgICAgYnVmZmVySW5kZXgtLTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChidWZmZXJJbmRleCkgYnJlYWs7CiAgICAgICAgICBidWZmZXJJbmRleCA9IC0xOwogICAgICAgIH0gZWxzZSBpZiAoY2h1bmsgPT09IC0yKSB7CiAgICAgICAgICB0YWJzID0gdHJ1ZTsKICAgICAgICAgIHNpemUrKzsKICAgICAgICB9IGVsc2UgaWYgKGNodW5rID09PSAtMSkgewogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbmRleDIrKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY29udGV4dDIuX2NvbnRlbnRUeXBlVGV4dFRyYWlsaW5nICYmIGV2ZW50SW5kZXggPT09IGV2ZW50cy5sZW5ndGgpIHsKICAgICAgICBzaXplID0gMDsKICAgICAgfQogICAgICBpZiAoc2l6ZSkgewogICAgICAgIGNvbnN0IHRva2VuID0gewogICAgICAgICAgdHlwZTogZXZlbnRJbmRleCA9PT0gZXZlbnRzLmxlbmd0aCB8fCB0YWJzIHx8IHNpemUgPCAyID8gImxpbmVTdWZmaXgiIDogImhhcmRCcmVha1RyYWlsaW5nIiwKICAgICAgICAgIHN0YXJ0OiB7CiAgICAgICAgICAgIF9idWZmZXJJbmRleDogaW5kZXgyID8gYnVmZmVySW5kZXggOiBkYXRhLnN0YXJ0Ll9idWZmZXJJbmRleCArIGJ1ZmZlckluZGV4LAogICAgICAgICAgICBfaW5kZXg6IGRhdGEuc3RhcnQuX2luZGV4ICsgaW5kZXgyLAogICAgICAgICAgICBsaW5lOiBkYXRhLmVuZC5saW5lLAogICAgICAgICAgICBjb2x1bW46IGRhdGEuZW5kLmNvbHVtbiAtIHNpemUsCiAgICAgICAgICAgIG9mZnNldDogZGF0YS5lbmQub2Zmc2V0IC0gc2l6ZQogICAgICAgICAgfSwKICAgICAgICAgIGVuZDogewogICAgICAgICAgICAuLi5kYXRhLmVuZAogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgZGF0YS5lbmQgPSB7CiAgICAgICAgICAuLi50b2tlbi5zdGFydAogICAgICAgIH07CiAgICAgICAgaWYgKGRhdGEuc3RhcnQub2Zmc2V0ID09PSBkYXRhLmVuZC5vZmZzZXQpIHsKICAgICAgICAgIE9iamVjdC5hc3NpZ24oZGF0YSwgdG9rZW4pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBldmVudHMuc3BsaWNlKGV2ZW50SW5kZXgsIDAsIFsiZW50ZXIiLCB0b2tlbiwgY29udGV4dDJdLCBbImV4aXQiLCB0b2tlbiwgY29udGV4dDJdKTsKICAgICAgICAgIGV2ZW50SW5kZXggKz0gMjsKICAgICAgICB9CiAgICAgIH0KICAgICAgZXZlbnRJbmRleCsrOwogICAgfQogIH0KICByZXR1cm4gZXZlbnRzOwp9CnZhciByZXNvbHZlciwgc3RyaW5nLCB0ZXh0MzsKdmFyIGluaXRfdGV4dDIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvaW5pdGlhbGl6ZS90ZXh0LmpzIigpIHsKICAgIHJlc29sdmVyID0gewogICAgICByZXNvbHZlQWxsOiBjcmVhdGVSZXNvbHZlcigpCiAgICB9OwogICAgc3RyaW5nID0gaW5pdGlhbGl6ZUZhY3RvcnkoInN0cmluZyIpOwogICAgdGV4dDMgPSBpbml0aWFsaXplRmFjdG9yeSgidGV4dCIpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL2NvbnN0cnVjdHMuanMKdmFyIGNvbnN0cnVjdHNfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChjb25zdHJ1Y3RzX2V4cG9ydHMsIHsKICBhdHRlbnRpb25NYXJrZXJzOiAoKSA9PiBhdHRlbnRpb25NYXJrZXJzLAogIGNvbnRlbnRJbml0aWFsOiAoKSA9PiBjb250ZW50SW5pdGlhbCwKICBkaXNhYmxlOiAoKSA9PiBkaXNhYmxlLAogIGRvY3VtZW50OiAoKSA9PiBkb2N1bWVudDMsCiAgZmxvdzogKCkgPT4gZmxvdzIsCiAgZmxvd0luaXRpYWw6ICgpID0+IGZsb3dJbml0aWFsLAogIGluc2lkZVNwYW46ICgpID0+IGluc2lkZVNwYW4sCiAgc3RyaW5nOiAoKSA9PiBzdHJpbmcyLAogIHRleHQ6ICgpID0+IHRleHQ0Cn0pOwp2YXIgZG9jdW1lbnQzLCBjb250ZW50SW5pdGlhbCwgZmxvd0luaXRpYWwsIGZsb3cyLCBzdHJpbmcyLCB0ZXh0NCwgaW5zaWRlU3BhbiwgYXR0ZW50aW9uTWFya2VycywgZGlzYWJsZTsKdmFyIGluaXRfY29uc3RydWN0cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFya0A0LjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrL2xpYi9jb25zdHJ1Y3RzLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX2NvcmVfY29tbW9ubWFyaygpOwogICAgaW5pdF90ZXh0MigpOwogICAgZG9jdW1lbnQzID0gewogICAgICBbNDJdOiBsaXN0MywKICAgICAgWzQzXTogbGlzdDMsCiAgICAgIFs0NV06IGxpc3QzLAogICAgICBbNDhdOiBsaXN0MywKICAgICAgWzQ5XTogbGlzdDMsCiAgICAgIFs1MF06IGxpc3QzLAogICAgICBbNTFdOiBsaXN0MywKICAgICAgWzUyXTogbGlzdDMsCiAgICAgIFs1M106IGxpc3QzLAogICAgICBbNTRdOiBsaXN0MywKICAgICAgWzU1XTogbGlzdDMsCiAgICAgIFs1Nl06IGxpc3QzLAogICAgICBbNTddOiBsaXN0MywKICAgICAgWzYyXTogYmxvY2tRdW90ZQogICAgfTsKICAgIGNvbnRlbnRJbml0aWFsID0gewogICAgICBbOTFdOiBkZWZpbml0aW9uMgogICAgfTsKICAgIGZsb3dJbml0aWFsID0gewogICAgICBbLTJdOiBjb2RlSW5kZW50ZWQsCiAgICAgIFstMV06IGNvZGVJbmRlbnRlZCwKICAgICAgWzMyXTogY29kZUluZGVudGVkCiAgICB9OwogICAgZmxvdzIgPSB7CiAgICAgIFszNV06IGhlYWRpbmdBdHgsCiAgICAgIFs0Ml06IHRoZW1hdGljQnJlYWsyLAogICAgICBbNDVdOiBbc2V0ZXh0VW5kZXJsaW5lLCB0aGVtYXRpY0JyZWFrMl0sCiAgICAgIFs2MF06IGh0bWxGbG93LAogICAgICBbNjFdOiBzZXRleHRVbmRlcmxpbmUsCiAgICAgIFs5NV06IHRoZW1hdGljQnJlYWsyLAogICAgICBbOTZdOiBjb2RlRmVuY2VkLAogICAgICBbMTI2XTogY29kZUZlbmNlZAogICAgfTsKICAgIHN0cmluZzIgPSB7CiAgICAgIFszOF06IGNoYXJhY3RlclJlZmVyZW5jZSwKICAgICAgWzkyXTogY2hhcmFjdGVyRXNjYXBlCiAgICB9OwogICAgdGV4dDQgPSB7CiAgICAgIFstNV06IGxpbmVFbmRpbmcsCiAgICAgIFstNF06IGxpbmVFbmRpbmcsCiAgICAgIFstM106IGxpbmVFbmRpbmcsCiAgICAgIFszM106IGxhYmVsU3RhcnRJbWFnZSwKICAgICAgWzM4XTogY2hhcmFjdGVyUmVmZXJlbmNlLAogICAgICBbNDJdOiBhdHRlbnRpb24sCiAgICAgIFs2MF06IFthdXRvbGluaywgaHRtbFRleHRdLAogICAgICBbOTFdOiBsYWJlbFN0YXJ0TGluaywKICAgICAgWzkyXTogW2hhcmRCcmVha0VzY2FwZSwgY2hhcmFjdGVyRXNjYXBlXSwKICAgICAgWzkzXTogbGFiZWxFbmQsCiAgICAgIFs5NV06IGF0dGVudGlvbiwKICAgICAgWzk2XTogY29kZVRleHQKICAgIH07CiAgICBpbnNpZGVTcGFuID0gewogICAgICBudWxsOiBbYXR0ZW50aW9uLCByZXNvbHZlcl0KICAgIH07CiAgICBhdHRlbnRpb25NYXJrZXJzID0gewogICAgICBudWxsOiBbNDIsIDk1XQogICAgfTsKICAgIGRpc2FibGUgPSB7CiAgICAgIG51bGw6IFtdCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL2NyZWF0ZS10b2tlbml6ZXIuanMKZnVuY3Rpb24gY3JlYXRlVG9rZW5pemVyKHBhcnNlciwgaW5pdGlhbGl6ZSwgZnJvbTIpIHsKICBsZXQgcG9pbnQ0ID0gewogICAgX2J1ZmZlckluZGV4OiAtMSwKICAgIF9pbmRleDogMCwKICAgIGxpbmU6IGZyb20yICYmIGZyb20yLmxpbmUgfHwgMSwKICAgIGNvbHVtbjogZnJvbTIgJiYgZnJvbTIuY29sdW1uIHx8IDEsCiAgICBvZmZzZXQ6IGZyb20yICYmIGZyb20yLm9mZnNldCB8fCAwCiAgfTsKICBjb25zdCBjb2x1bW5TdGFydCA9IHt9OwogIGNvbnN0IHJlc29sdmVBbGxDb25zdHJ1Y3RzID0gW107CiAgbGV0IGNodW5rcyA9IFtdOwogIGxldCBzdGFjayA9IFtdOwogIGxldCBjb25zdW1lZCA9IHRydWU7CiAgY29uc3QgZWZmZWN0cyA9IHsKICAgIGF0dGVtcHQ6IGNvbnN0cnVjdEZhY3Rvcnkob25zdWNjZXNzZnVsY29uc3RydWN0KSwKICAgIGNoZWNrOiBjb25zdHJ1Y3RGYWN0b3J5KG9uc3VjY2Vzc2Z1bGNoZWNrKSwKICAgIGNvbnN1bWUsCiAgICBlbnRlciwKICAgIGV4aXQ6IGV4aXQzLAogICAgaW50ZXJydXB0OiBjb25zdHJ1Y3RGYWN0b3J5KG9uc3VjY2Vzc2Z1bGNoZWNrLCB7CiAgICAgIGludGVycnVwdDogdHJ1ZQogICAgfSkKICB9OwogIGNvbnN0IGNvbnRleHQyID0gewogICAgY29kZTogbnVsbCwKICAgIGNvbnRhaW5lclN0YXRlOiB7fSwKICAgIGRlZmluZVNraXAsCiAgICBldmVudHM6IFtdLAogICAgbm93OiBub3cyLAogICAgcGFyc2VyLAogICAgcHJldmlvdXM6IG51bGwsCiAgICBzbGljZVNlcmlhbGl6ZSwKICAgIHNsaWNlU3RyZWFtLAogICAgd3JpdGUKICB9OwogIGxldCBzdGF0ZTEwID0gaW5pdGlhbGl6ZS50b2tlbml6ZS5jYWxsKGNvbnRleHQyLCBlZmZlY3RzKTsKICBsZXQgZXhwZWN0ZWRDb2RlOwogIGlmIChpbml0aWFsaXplLnJlc29sdmVBbGwpIHsKICAgIHJlc29sdmVBbGxDb25zdHJ1Y3RzLnB1c2goaW5pdGlhbGl6ZSk7CiAgfQogIHJldHVybiBjb250ZXh0MjsKICBmdW5jdGlvbiB3cml0ZShzbGljZSkgewogICAgY2h1bmtzID0gcHVzaChjaHVua3MsIHNsaWNlKTsKICAgIG1haW4oKTsKICAgIGlmIChjaHVua3NbY2h1bmtzLmxlbmd0aCAtIDFdICE9PSBudWxsKSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIGFkZFJlc3VsdChpbml0aWFsaXplLCAwKTsKICAgIGNvbnRleHQyLmV2ZW50cyA9IHJlc29sdmVBbGwocmVzb2x2ZUFsbENvbnN0cnVjdHMsIGNvbnRleHQyLmV2ZW50cywgY29udGV4dDIpOwogICAgcmV0dXJuIGNvbnRleHQyLmV2ZW50czsKICB9CiAgZnVuY3Rpb24gc2xpY2VTZXJpYWxpemUodG9rZW4sIGV4cGFuZFRhYnMpIHsKICAgIHJldHVybiBzZXJpYWxpemVDaHVua3Moc2xpY2VTdHJlYW0odG9rZW4pLCBleHBhbmRUYWJzKTsKICB9CiAgZnVuY3Rpb24gc2xpY2VTdHJlYW0odG9rZW4pIHsKICAgIHJldHVybiBzbGljZUNodW5rcyhjaHVua3MsIHRva2VuKTsKICB9CiAgZnVuY3Rpb24gbm93MigpIHsKICAgIGNvbnN0IHsKICAgICAgX2J1ZmZlckluZGV4LAogICAgICBfaW5kZXgsCiAgICAgIGxpbmUsCiAgICAgIGNvbHVtbiwKICAgICAgb2Zmc2V0CiAgICB9ID0gcG9pbnQ0OwogICAgcmV0dXJuIHsKICAgICAgX2J1ZmZlckluZGV4LAogICAgICBfaW5kZXgsCiAgICAgIGxpbmUsCiAgICAgIGNvbHVtbiwKICAgICAgb2Zmc2V0CiAgICB9OwogIH0KICBmdW5jdGlvbiBkZWZpbmVTa2lwKHZhbHVlMikgewogICAgY29sdW1uU3RhcnRbdmFsdWUyLmxpbmVdID0gdmFsdWUyLmNvbHVtbjsKICAgIGFjY291bnRGb3JQb3RlbnRpYWxTa2lwKCk7CiAgfQogIGZ1bmN0aW9uIG1haW4oKSB7CiAgICBsZXQgY2h1bmtJbmRleDsKICAgIHdoaWxlIChwb2ludDQuX2luZGV4IDwgY2h1bmtzLmxlbmd0aCkgewogICAgICBjb25zdCBjaHVuayA9IGNodW5rc1twb2ludDQuX2luZGV4XTsKICAgICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gInN0cmluZyIpIHsKICAgICAgICBjaHVua0luZGV4ID0gcG9pbnQ0Ll9pbmRleDsKICAgICAgICBpZiAocG9pbnQ0Ll9idWZmZXJJbmRleCA8IDApIHsKICAgICAgICAgIHBvaW50NC5fYnVmZmVySW5kZXggPSAwOwogICAgICAgIH0KICAgICAgICB3aGlsZSAocG9pbnQ0Ll9pbmRleCA9PT0gY2h1bmtJbmRleCAmJiBwb2ludDQuX2J1ZmZlckluZGV4IDwgY2h1bmsubGVuZ3RoKSB7CiAgICAgICAgICBnbyhjaHVuay5jaGFyQ29kZUF0KHBvaW50NC5fYnVmZmVySW5kZXgpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZ28oY2h1bmspOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGdvKGNvZGU0KSB7CiAgICBjb25zdW1lZCA9IHZvaWQgMDsKICAgIGV4cGVjdGVkQ29kZSA9IGNvZGU0OwogICAgc3RhdGUxMCA9IHN0YXRlMTAoY29kZTQpOwogIH0KICBmdW5jdGlvbiBjb25zdW1lKGNvZGU0KSB7CiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICBwb2ludDQubGluZSsrOwogICAgICBwb2ludDQuY29sdW1uID0gMTsKICAgICAgcG9pbnQ0Lm9mZnNldCArPSBjb2RlNCA9PT0gLTMgPyAyIDogMTsKICAgICAgYWNjb3VudEZvclBvdGVudGlhbFNraXAoKTsKICAgIH0gZWxzZSBpZiAoY29kZTQgIT09IC0xKSB7CiAgICAgIHBvaW50NC5jb2x1bW4rKzsKICAgICAgcG9pbnQ0Lm9mZnNldCsrOwogICAgfQogICAgaWYgKHBvaW50NC5fYnVmZmVySW5kZXggPCAwKSB7CiAgICAgIHBvaW50NC5faW5kZXgrKzsKICAgIH0gZWxzZSB7CiAgICAgIHBvaW50NC5fYnVmZmVySW5kZXgrKzsKICAgICAgaWYgKHBvaW50NC5fYnVmZmVySW5kZXggPT09IC8vIFBvaW50cyB3LyBub24tbmVnYXRpdmUgYF9idWZmZXJJbmRleGAgcmVmZXJlbmNlCiAgICAgIC8vIHN0cmluZ3MuCiAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICBjaHVua3NbcG9pbnQ0Ll9pbmRleF0ubGVuZ3RoKSB7CiAgICAgICAgcG9pbnQ0Ll9idWZmZXJJbmRleCA9IC0xOwogICAgICAgIHBvaW50NC5faW5kZXgrKzsKICAgICAgfQogICAgfQogICAgY29udGV4dDIucHJldmlvdXMgPSBjb2RlNDsKICAgIGNvbnN1bWVkID0gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gZW50ZXIodHlwZTUsIGZpZWxkcykgewogICAgY29uc3QgdG9rZW4gPSBmaWVsZHMgfHwge307CiAgICB0b2tlbi50eXBlID0gdHlwZTU7CiAgICB0b2tlbi5zdGFydCA9IG5vdzIoKTsKICAgIGNvbnRleHQyLmV2ZW50cy5wdXNoKFsiZW50ZXIiLCB0b2tlbiwgY29udGV4dDJdKTsKICAgIHN0YWNrLnB1c2godG9rZW4pOwogICAgcmV0dXJuIHRva2VuOwogIH0KICBmdW5jdGlvbiBleGl0Myh0eXBlNSkgewogICAgY29uc3QgdG9rZW4gPSBzdGFjay5wb3AoKTsKICAgIHRva2VuLmVuZCA9IG5vdzIoKTsKICAgIGNvbnRleHQyLmV2ZW50cy5wdXNoKFsiZXhpdCIsIHRva2VuLCBjb250ZXh0Ml0pOwogICAgcmV0dXJuIHRva2VuOwogIH0KICBmdW5jdGlvbiBvbnN1Y2Nlc3NmdWxjb25zdHJ1Y3QoY29uc3RydWN0LCBpbmZvKSB7CiAgICBhZGRSZXN1bHQoY29uc3RydWN0LCBpbmZvLmZyb20pOwogIH0KICBmdW5jdGlvbiBvbnN1Y2Nlc3NmdWxjaGVjayhfNSwgaW5mbykgewogICAgaW5mby5yZXN0b3JlKCk7CiAgfQogIGZ1bmN0aW9uIGNvbnN0cnVjdEZhY3Rvcnkob25yZXR1cm4sIGZpZWxkcykgewogICAgcmV0dXJuIGhvb2s7CiAgICBmdW5jdGlvbiBob29rKGNvbnN0cnVjdHMyLCByZXR1cm5TdGF0ZSwgYm9ndXNTdGF0ZSkgewogICAgICBsZXQgbGlzdE9mQ29uc3RydWN0czsKICAgICAgbGV0IGNvbnN0cnVjdEluZGV4OwogICAgICBsZXQgY3VycmVudENvbnN0cnVjdDsKICAgICAgbGV0IGluZm87CiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNvbnN0cnVjdHMyKSA/ICgKICAgICAgICAvKiBjOCBpZ25vcmUgbmV4dCAxICovCiAgICAgICAgaGFuZGxlTGlzdE9mQ29uc3RydWN0cyhjb25zdHJ1Y3RzMikKICAgICAgKSA6ICJ0b2tlbml6ZSIgaW4gY29uc3RydWN0czIgPyAoCiAgICAgICAgLy8gTG9va3MgbGlrZSBhIGNvbnN0cnVjdC4KICAgICAgICBoYW5kbGVMaXN0T2ZDb25zdHJ1Y3RzKFsKICAgICAgICAgIC8qKiBAdHlwZSB7Q29uc3RydWN0fSAqLwogICAgICAgICAgY29uc3RydWN0czIKICAgICAgICBdKQogICAgICApIDogaGFuZGxlTWFwT2ZDb25zdHJ1Y3RzKGNvbnN0cnVjdHMyKTsKICAgICAgZnVuY3Rpb24gaGFuZGxlTWFwT2ZDb25zdHJ1Y3RzKG1hcDcpIHsKICAgICAgICByZXR1cm4gc3RhcnQ7CiAgICAgICAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgICAgICAgIGNvbnN0IGxlZnQgPSBjb2RlNCAhPT0gbnVsbCAmJiBtYXA3W2NvZGU0XTsKICAgICAgICAgIGNvbnN0IGFsbDMgPSBjb2RlNCAhPT0gbnVsbCAmJiBtYXA3Lm51bGw7CiAgICAgICAgICBjb25zdCBsaXN0NSA9IFsKICAgICAgICAgICAgLy8gVG8gZG86IGFkZCBtb3JlIGV4dGVuc2lvbiB0ZXN0cy4KICAgICAgICAgICAgLyogYzggaWdub3JlIG5leHQgMiAqLwogICAgICAgICAgICAuLi5BcnJheS5pc0FycmF5KGxlZnQpID8gbGVmdCA6IGxlZnQgPyBbbGVmdF0gOiBbXSwKICAgICAgICAgICAgLi4uQXJyYXkuaXNBcnJheShhbGwzKSA/IGFsbDMgOiBhbGwzID8gW2FsbDNdIDogW10KICAgICAgICAgIF07CiAgICAgICAgICByZXR1cm4gaGFuZGxlTGlzdE9mQ29uc3RydWN0cyhsaXN0NSkoY29kZTQpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBoYW5kbGVMaXN0T2ZDb25zdHJ1Y3RzKGxpc3Q1KSB7CiAgICAgICAgbGlzdE9mQ29uc3RydWN0cyA9IGxpc3Q1OwogICAgICAgIGNvbnN0cnVjdEluZGV4ID0gMDsKICAgICAgICBpZiAobGlzdDUubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gYm9ndXNTdGF0ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGhhbmRsZUNvbnN0cnVjdChsaXN0NVtjb25zdHJ1Y3RJbmRleF0pOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGhhbmRsZUNvbnN0cnVjdChjb25zdHJ1Y3QpIHsKICAgICAgICByZXR1cm4gc3RhcnQ7CiAgICAgICAgZnVuY3Rpb24gc3RhcnQoY29kZTQpIHsKICAgICAgICAgIGluZm8gPSBzdG9yZSgpOwogICAgICAgICAgY3VycmVudENvbnN0cnVjdCA9IGNvbnN0cnVjdDsKICAgICAgICAgIGlmICghY29uc3RydWN0LnBhcnRpYWwpIHsKICAgICAgICAgICAgY29udGV4dDIuY3VycmVudENvbnN0cnVjdCA9IGNvbnN0cnVjdDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjb25zdHJ1Y3QubmFtZSAmJiBjb250ZXh0Mi5wYXJzZXIuY29uc3RydWN0cy5kaXNhYmxlLm51bGwuaW5jbHVkZXMoY29uc3RydWN0Lm5hbWUpKSB7CiAgICAgICAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdC50b2tlbml6ZS5jYWxsKAogICAgICAgICAgICAvLyBJZiB3ZSBkbyBoYXZlIGZpZWxkcywgY3JlYXRlIGFuIG9iamVjdCB3LyBgY29udGV4dGAgYXMgaXRzCiAgICAgICAgICAgIC8vIHByb3RvdHlwZS4KICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgYSDigJxsaXZlIGJpbmRpbmfigJ0sIHdoaWNoIGlzIG5lZWRlZCBmb3IgYGludGVycnVwdGAuCiAgICAgICAgICAgIGZpZWxkcyA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShjb250ZXh0MiksIGZpZWxkcykgOiBjb250ZXh0MiwKICAgICAgICAgICAgZWZmZWN0cywKICAgICAgICAgICAgb2szLAogICAgICAgICAgICBub2sKICAgICAgICAgICkoY29kZTQpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBvazMoY29kZTQpIHsKICAgICAgICBjb25zdW1lZCA9IHRydWU7CiAgICAgICAgb25yZXR1cm4oY3VycmVudENvbnN0cnVjdCwgaW5mbyk7CiAgICAgICAgcmV0dXJuIHJldHVyblN0YXRlOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIG5vayhjb2RlNCkgewogICAgICAgIGNvbnN1bWVkID0gdHJ1ZTsKICAgICAgICBpbmZvLnJlc3RvcmUoKTsKICAgICAgICBpZiAoKytjb25zdHJ1Y3RJbmRleCA8IGxpc3RPZkNvbnN0cnVjdHMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gaGFuZGxlQ29uc3RydWN0KGxpc3RPZkNvbnN0cnVjdHNbY29uc3RydWN0SW5kZXhdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJvZ3VzU3RhdGU7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gYWRkUmVzdWx0KGNvbnN0cnVjdCwgZnJvbTMpIHsKICAgIGlmIChjb25zdHJ1Y3QucmVzb2x2ZUFsbCAmJiAhcmVzb2x2ZUFsbENvbnN0cnVjdHMuaW5jbHVkZXMoY29uc3RydWN0KSkgewogICAgICByZXNvbHZlQWxsQ29uc3RydWN0cy5wdXNoKGNvbnN0cnVjdCk7CiAgICB9CiAgICBpZiAoY29uc3RydWN0LnJlc29sdmUpIHsKICAgICAgc3BsaWNlKGNvbnRleHQyLmV2ZW50cywgZnJvbTMsIGNvbnRleHQyLmV2ZW50cy5sZW5ndGggLSBmcm9tMywgY29uc3RydWN0LnJlc29sdmUoY29udGV4dDIuZXZlbnRzLnNsaWNlKGZyb20zKSwgY29udGV4dDIpKTsKICAgIH0KICAgIGlmIChjb25zdHJ1Y3QucmVzb2x2ZVRvKSB7CiAgICAgIGNvbnRleHQyLmV2ZW50cyA9IGNvbnN0cnVjdC5yZXNvbHZlVG8oY29udGV4dDIuZXZlbnRzLCBjb250ZXh0Mik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHN0b3JlKCkgewogICAgY29uc3Qgc3RhcnRQb2ludCA9IG5vdzIoKTsKICAgIGNvbnN0IHN0YXJ0UHJldmlvdXMgPSBjb250ZXh0Mi5wcmV2aW91czsKICAgIGNvbnN0IHN0YXJ0Q3VycmVudENvbnN0cnVjdCA9IGNvbnRleHQyLmN1cnJlbnRDb25zdHJ1Y3Q7CiAgICBjb25zdCBzdGFydEV2ZW50c0luZGV4ID0gY29udGV4dDIuZXZlbnRzLmxlbmd0aDsKICAgIGNvbnN0IHN0YXJ0U3RhY2sgPSBBcnJheS5mcm9tKHN0YWNrKTsKICAgIHJldHVybiB7CiAgICAgIGZyb206IHN0YXJ0RXZlbnRzSW5kZXgsCiAgICAgIHJlc3RvcmUKICAgIH07CiAgICBmdW5jdGlvbiByZXN0b3JlKCkgewogICAgICBwb2ludDQgPSBzdGFydFBvaW50OwogICAgICBjb250ZXh0Mi5wcmV2aW91cyA9IHN0YXJ0UHJldmlvdXM7CiAgICAgIGNvbnRleHQyLmN1cnJlbnRDb25zdHJ1Y3QgPSBzdGFydEN1cnJlbnRDb25zdHJ1Y3Q7CiAgICAgIGNvbnRleHQyLmV2ZW50cy5sZW5ndGggPSBzdGFydEV2ZW50c0luZGV4OwogICAgICBzdGFjayA9IHN0YXJ0U3RhY2s7CiAgICAgIGFjY291bnRGb3JQb3RlbnRpYWxTa2lwKCk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGFjY291bnRGb3JQb3RlbnRpYWxTa2lwKCkgewogICAgaWYgKHBvaW50NC5saW5lIGluIGNvbHVtblN0YXJ0ICYmIHBvaW50NC5jb2x1bW4gPCAyKSB7CiAgICAgIHBvaW50NC5jb2x1bW4gPSBjb2x1bW5TdGFydFtwb2ludDQubGluZV07CiAgICAgIHBvaW50NC5vZmZzZXQgKz0gY29sdW1uU3RhcnRbcG9pbnQ0LmxpbmVdIC0gMTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gc2xpY2VDaHVua3MoY2h1bmtzLCB0b2tlbikgewogIGNvbnN0IHN0YXJ0SW5kZXggPSB0b2tlbi5zdGFydC5faW5kZXg7CiAgY29uc3Qgc3RhcnRCdWZmZXJJbmRleCA9IHRva2VuLnN0YXJ0Ll9idWZmZXJJbmRleDsKICBjb25zdCBlbmRJbmRleCA9IHRva2VuLmVuZC5faW5kZXg7CiAgY29uc3QgZW5kQnVmZmVySW5kZXggPSB0b2tlbi5lbmQuX2J1ZmZlckluZGV4OwogIGxldCB2aWV3OwogIGlmIChzdGFydEluZGV4ID09PSBlbmRJbmRleCkgewogICAgdmlldyA9IFtjaHVua3Nbc3RhcnRJbmRleF0uc2xpY2Uoc3RhcnRCdWZmZXJJbmRleCwgZW5kQnVmZmVySW5kZXgpXTsKICB9IGVsc2UgewogICAgdmlldyA9IGNodW5rcy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7CiAgICBpZiAoc3RhcnRCdWZmZXJJbmRleCA+IC0xKSB7CiAgICAgIGNvbnN0IGhlYWQyID0gdmlld1swXTsKICAgICAgaWYgKHR5cGVvZiBoZWFkMiA9PT0gInN0cmluZyIpIHsKICAgICAgICB2aWV3WzBdID0gaGVhZDIuc2xpY2Uoc3RhcnRCdWZmZXJJbmRleCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmlldy5zaGlmdCgpOwogICAgICB9CiAgICB9CiAgICBpZiAoZW5kQnVmZmVySW5kZXggPiAwKSB7CiAgICAgIHZpZXcucHVzaChjaHVua3NbZW5kSW5kZXhdLnNsaWNlKDAsIGVuZEJ1ZmZlckluZGV4KSk7CiAgICB9CiAgfQogIHJldHVybiB2aWV3Owp9CmZ1bmN0aW9uIHNlcmlhbGl6ZUNodW5rcyhjaHVua3MsIGV4cGFuZFRhYnMpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgY29uc3QgcmVzdWx0ID0gW107CiAgbGV0IGF0VGFiOwogIHdoaWxlICgrK2luZGV4MiA8IGNodW5rcy5sZW5ndGgpIHsKICAgIGNvbnN0IGNodW5rID0gY2h1bmtzW2luZGV4Ml07CiAgICBsZXQgdmFsdWUyOwogICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gInN0cmluZyIpIHsKICAgICAgdmFsdWUyID0gY2h1bms7CiAgICB9IGVsc2Ugc3dpdGNoIChjaHVuaykgewogICAgICBjYXNlIC01OiB7CiAgICAgICAgdmFsdWUyID0gIlxyIjsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlIC00OiB7CiAgICAgICAgdmFsdWUyID0gIlxuIjsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlIC0zOiB7CiAgICAgICAgdmFsdWUyID0gIlxyXG4iOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgLTI6IHsKICAgICAgICB2YWx1ZTIgPSBleHBhbmRUYWJzID8gIiAiIDogIgkiOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgLTE6IHsKICAgICAgICBpZiAoIWV4cGFuZFRhYnMgJiYgYXRUYWIpIGNvbnRpbnVlOwogICAgICAgIHZhbHVlMiA9ICIgIjsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBkZWZhdWx0OiB7CiAgICAgICAgdmFsdWUyID0gU3RyaW5nLmZyb21DaGFyQ29kZShjaHVuayk7CiAgICAgIH0KICAgIH0KICAgIGF0VGFiID0gY2h1bmsgPT09IC0yOwogICAgcmVzdWx0LnB1c2godmFsdWUyKTsKICB9CiAgcmV0dXJuIHJlc3VsdC5qb2luKCIiKTsKfQp2YXIgaW5pdF9jcmVhdGVfdG9rZW5pemVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL2NyZWF0ZS10b2tlbml6ZXIuanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfY2h1bmtlZCgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9yZXNvbHZlX2FsbCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL3BhcnNlLmpzCmZ1bmN0aW9uIHBhcnNlNihvcHRpb25zKSB7CiAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9OwogIGNvbnN0IGNvbnN0cnVjdHMyID0gKAogICAgLyoqIEB0eXBlIHtGdWxsTm9ybWFsaXplZEV4dGVuc2lvbn0gKi8KICAgIGNvbWJpbmVFeHRlbnNpb25zKFtjb25zdHJ1Y3RzX2V4cG9ydHMsIC4uLnNldHRpbmdzLmV4dGVuc2lvbnMgfHwgW11dKQogICk7CiAgY29uc3QgcGFyc2VyID0gewogICAgY29uc3RydWN0czogY29uc3RydWN0czIsCiAgICBjb250ZW50OiBjcmVhdGU3KGNvbnRlbnQyKSwKICAgIGRlZmluZWQ6IFtdLAogICAgZG9jdW1lbnQ6IGNyZWF0ZTcoZG9jdW1lbnQyKSwKICAgIGZsb3c6IGNyZWF0ZTcoZmxvdyksCiAgICBsYXp5OiB7fSwKICAgIHN0cmluZzogY3JlYXRlNyhzdHJpbmcpLAogICAgdGV4dDogY3JlYXRlNyh0ZXh0MykKICB9OwogIHJldHVybiBwYXJzZXI7CiAgZnVuY3Rpb24gY3JlYXRlNyhpbml0aWFsMikgewogICAgcmV0dXJuIGNyZWF0b3I7CiAgICBmdW5jdGlvbiBjcmVhdG9yKGZyb20yKSB7CiAgICAgIHJldHVybiBjcmVhdGVUb2tlbml6ZXIocGFyc2VyLCBpbml0aWFsMiwgZnJvbTIpOwogICAgfQogIH0KfQp2YXIgaW5pdF9wYXJzZTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvcGFyc2UuanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jb21iaW5lX2V4dGVuc2lvbnMoKTsKICAgIGluaXRfY29udGVudDIoKTsKICAgIGluaXRfZG9jdW1lbnQoKTsKICAgIGluaXRfZmxvdygpOwogICAgaW5pdF90ZXh0MigpOwogICAgaW5pdF9jb25zdHJ1Y3RzKCk7CiAgICBpbml0X2NyZWF0ZV90b2tlbml6ZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFya0A0LjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrL2xpYi9wb3N0cHJvY2Vzcy5qcwpmdW5jdGlvbiBwb3N0cHJvY2VzcyhldmVudHMpIHsKICB3aGlsZSAoIXN1YnRva2VuaXplKGV2ZW50cykpIHsKICB9CiAgcmV0dXJuIGV2ZW50czsKfQp2YXIgaW5pdF9wb3N0cHJvY2VzcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFya0A0LjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrL2xpYi9wb3N0cHJvY2Vzcy5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX3N1YnRva2VuaXplKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmtANC4wLjIvbm9kZV9tb2R1bGVzL21pY3JvbWFyay9saWIvcHJlcHJvY2Vzcy5qcwpmdW5jdGlvbiBwcmVwcm9jZXNzKCkgewogIGxldCBjb2x1bW4gPSAxOwogIGxldCBidWZmZXIyID0gIiI7CiAgbGV0IHN0YXJ0ID0gdHJ1ZTsKICBsZXQgYXRDYXJyaWFnZVJldHVybjsKICByZXR1cm4gcHJlcHJvY2Vzc29yOwogIGZ1bmN0aW9uIHByZXByb2Nlc3Nvcih2YWx1ZTIsIGVuY29kaW5nLCBlbmQzKSB7CiAgICBjb25zdCBjaHVua3MgPSBbXTsKICAgIGxldCBtYXRjaDI7CiAgICBsZXQgbmV4dDI7CiAgICBsZXQgc3RhcnRQb3NpdGlvbjsKICAgIGxldCBlbmRQb3NpdGlvbjsKICAgIGxldCBjb2RlNDsKICAgIHZhbHVlMiA9IGJ1ZmZlcjIgKyAodHlwZW9mIHZhbHVlMiA9PT0gInN0cmluZyIgPyB2YWx1ZTIudG9TdHJpbmcoKSA6IG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZyB8fCB2b2lkIDApLmRlY29kZSh2YWx1ZTIpKTsKICAgIHN0YXJ0UG9zaXRpb24gPSAwOwogICAgYnVmZmVyMiA9ICIiOwogICAgaWYgKHN0YXJ0KSB7CiAgICAgIGlmICh2YWx1ZTIuY2hhckNvZGVBdCgwKSA9PT0gNjUyNzkpIHsKICAgICAgICBzdGFydFBvc2l0aW9uKys7CiAgICAgIH0KICAgICAgc3RhcnQgPSB2b2lkIDA7CiAgICB9CiAgICB3aGlsZSAoc3RhcnRQb3NpdGlvbiA8IHZhbHVlMi5sZW5ndGgpIHsKICAgICAgc2VhcmNoLmxhc3RJbmRleCA9IHN0YXJ0UG9zaXRpb247CiAgICAgIG1hdGNoMiA9IHNlYXJjaC5leGVjKHZhbHVlMik7CiAgICAgIGVuZFBvc2l0aW9uID0gbWF0Y2gyICYmIG1hdGNoMi5pbmRleCAhPT0gdm9pZCAwID8gbWF0Y2gyLmluZGV4IDogdmFsdWUyLmxlbmd0aDsKICAgICAgY29kZTQgPSB2YWx1ZTIuY2hhckNvZGVBdChlbmRQb3NpdGlvbik7CiAgICAgIGlmICghbWF0Y2gyKSB7CiAgICAgICAgYnVmZmVyMiA9IHZhbHVlMi5zbGljZShzdGFydFBvc2l0aW9uKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAoY29kZTQgPT09IDEwICYmIHN0YXJ0UG9zaXRpb24gPT09IGVuZFBvc2l0aW9uICYmIGF0Q2FycmlhZ2VSZXR1cm4pIHsKICAgICAgICBjaHVua3MucHVzaCgtMyk7CiAgICAgICAgYXRDYXJyaWFnZVJldHVybiA9IHZvaWQgMDsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoYXRDYXJyaWFnZVJldHVybikgewogICAgICAgICAgY2h1bmtzLnB1c2goLTUpOwogICAgICAgICAgYXRDYXJyaWFnZVJldHVybiA9IHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgaWYgKHN0YXJ0UG9zaXRpb24gPCBlbmRQb3NpdGlvbikgewogICAgICAgICAgY2h1bmtzLnB1c2godmFsdWUyLnNsaWNlKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKSk7CiAgICAgICAgICBjb2x1bW4gKz0gZW5kUG9zaXRpb24gLSBzdGFydFBvc2l0aW9uOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKGNvZGU0KSB7CiAgICAgICAgICBjYXNlIDA6IHsKICAgICAgICAgICAgY2h1bmtzLnB1c2goNjU1MzMpOwogICAgICAgICAgICBjb2x1bW4rKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDk6IHsKICAgICAgICAgICAgbmV4dDIgPSBNYXRoLmNlaWwoY29sdW1uIC8gNCkgKiA0OwogICAgICAgICAgICBjaHVua3MucHVzaCgtMik7CiAgICAgICAgICAgIHdoaWxlIChjb2x1bW4rKyA8IG5leHQyKSBjaHVua3MucHVzaCgtMSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAxMDogewogICAgICAgICAgICBjaHVua3MucHVzaCgtNCk7CiAgICAgICAgICAgIGNvbHVtbiA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICBhdENhcnJpYWdlUmV0dXJuID0gdHJ1ZTsKICAgICAgICAgICAgY29sdW1uID0gMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhcnRQb3NpdGlvbiA9IGVuZFBvc2l0aW9uICsgMTsKICAgIH0KICAgIGlmIChlbmQzKSB7CiAgICAgIGlmIChhdENhcnJpYWdlUmV0dXJuKSBjaHVua3MucHVzaCgtNSk7CiAgICAgIGlmIChidWZmZXIyKSBjaHVua3MucHVzaChidWZmZXIyKTsKICAgICAgY2h1bmtzLnB1c2gobnVsbCk7CiAgICB9CiAgICByZXR1cm4gY2h1bmtzOwogIH0KfQp2YXIgc2VhcmNoOwp2YXIgaW5pdF9wcmVwcm9jZXNzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvbGliL3ByZXByb2Nlc3MuanMiKCkgewogICAgc2VhcmNoID0gL1tcMFx0XG5ccl0vZzsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFya0A0LjAuMi9ub2RlX21vZHVsZXMvbWljcm9tYXJrL2luZGV4LmpzCmZ1bmN0aW9uIG1pY3JvbWFyayh2YWx1ZTIsIGVuY29kaW5nLCBvcHRpb25zKSB7CiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gInN0cmluZyIpIHsKICAgIG9wdGlvbnMgPSBlbmNvZGluZzsKICAgIGVuY29kaW5nID0gdm9pZCAwOwogIH0KICByZXR1cm4gY29tcGlsZShvcHRpb25zKShwb3N0cHJvY2VzcyhwYXJzZTYob3B0aW9ucykuZG9jdW1lbnQoKS53cml0ZShwcmVwcm9jZXNzKCkodmFsdWUyLCBlbmNvZGluZywgdHJ1ZSkpKSk7Cn0KdmFyIGluaXRfbWljcm9tYXJrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrQDQuMC4yL25vZGVfbW9kdWxlcy9taWNyb21hcmsvaW5kZXguanMiKCkgewogICAgaW5pdF9jb21waWxlKCk7CiAgICBpbml0X3BhcnNlMigpOwogICAgaW5pdF9wb3N0cHJvY2VzcygpOwogICAgaW5pdF9wcmVwcm9jZXNzKCk7CiAgICBpbml0X2NvbXBpbGUoKTsKICAgIGluaXRfcGFyc2UyKCk7CiAgICBpbml0X3Bvc3Rwcm9jZXNzKCk7CiAgICBpbml0X3ByZXByb2Nlc3MoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZnJvbS1tYXJrZG93bkAyLjAuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duL2xpYi9pbmRleC5qcwpmdW5jdGlvbiBmcm9tTWFya2Rvd24odmFsdWUyLCBlbmNvZGluZywgb3B0aW9ucykgewogIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICJzdHJpbmciKSB7CiAgICBvcHRpb25zID0gZW5jb2Rpbmc7CiAgICBlbmNvZGluZyA9IHZvaWQgMDsKICB9CiAgcmV0dXJuIGNvbXBpbGVyKG9wdGlvbnMpKHBvc3Rwcm9jZXNzKHBhcnNlNihvcHRpb25zKS5kb2N1bWVudCgpLndyaXRlKHByZXByb2Nlc3MoKSh2YWx1ZTIsIGVuY29kaW5nLCB0cnVlKSkpKTsKfQpmdW5jdGlvbiBjb21waWxlcihvcHRpb25zKSB7CiAgY29uc3QgY29uZmlnMyA9IHsKICAgIHRyYW5zZm9ybXM6IFtdLAogICAgY2FuQ29udGFpbkVvbHM6IFsiZW1waGFzaXMiLCAiZnJhZ21lbnQiLCAiaGVhZGluZyIsICJwYXJhZ3JhcGgiLCAic3Ryb25nIl0sCiAgICBlbnRlcjogewogICAgICBhdXRvbGluazogb3BlbmVyMihsaW5rMyksCiAgICAgIGF1dG9saW5rUHJvdG9jb2w6IG9uZW50ZXJkYXRhLAogICAgICBhdXRvbGlua0VtYWlsOiBvbmVudGVyZGF0YSwKICAgICAgYXR4SGVhZGluZzogb3BlbmVyMihoZWFkaW5nMyksCiAgICAgIGJsb2NrUXVvdGU6IG9wZW5lcjIoYmxvY2tRdW90ZTIpLAogICAgICBjaGFyYWN0ZXJFc2NhcGU6IG9uZW50ZXJkYXRhLAogICAgICBjaGFyYWN0ZXJSZWZlcmVuY2U6IG9uZW50ZXJkYXRhLAogICAgICBjb2RlRmVuY2VkOiBvcGVuZXIyKGNvZGVGbG93KSwKICAgICAgY29kZUZlbmNlZEZlbmNlSW5mbzogYnVmZmVyMiwKICAgICAgY29kZUZlbmNlZEZlbmNlTWV0YTogYnVmZmVyMiwKICAgICAgY29kZUluZGVudGVkOiBvcGVuZXIyKGNvZGVGbG93LCBidWZmZXIyKSwKICAgICAgY29kZVRleHQ6IG9wZW5lcjIoY29kZVRleHQyLCBidWZmZXIyKSwKICAgICAgY29kZVRleHREYXRhOiBvbmVudGVyZGF0YSwKICAgICAgZGF0YTogb25lbnRlcmRhdGEsCiAgICAgIGNvZGVGbG93VmFsdWU6IG9uZW50ZXJkYXRhLAogICAgICBkZWZpbml0aW9uOiBvcGVuZXIyKGRlZmluaXRpb24zKSwKICAgICAgZGVmaW5pdGlvbkRlc3RpbmF0aW9uU3RyaW5nOiBidWZmZXIyLAogICAgICBkZWZpbml0aW9uTGFiZWxTdHJpbmc6IGJ1ZmZlcjIsCiAgICAgIGRlZmluaXRpb25UaXRsZVN0cmluZzogYnVmZmVyMiwKICAgICAgZW1waGFzaXM6IG9wZW5lcjIoZW1waGFzaXMzKSwKICAgICAgaGFyZEJyZWFrRXNjYXBlOiBvcGVuZXIyKGhhcmRCcmVhazMpLAogICAgICBoYXJkQnJlYWtUcmFpbGluZzogb3BlbmVyMihoYXJkQnJlYWszKSwKICAgICAgaHRtbEZsb3c6IG9wZW5lcjIoaHRtbDE2LCBidWZmZXIyKSwKICAgICAgaHRtbEZsb3dEYXRhOiBvbmVudGVyZGF0YSwKICAgICAgaHRtbFRleHQ6IG9wZW5lcjIoaHRtbDE2LCBidWZmZXIyKSwKICAgICAgaHRtbFRleHREYXRhOiBvbmVudGVyZGF0YSwKICAgICAgaW1hZ2U6IG9wZW5lcjIoaW1hZ2UzKSwKICAgICAgbGFiZWw6IGJ1ZmZlcjIsCiAgICAgIGxpbms6IG9wZW5lcjIobGluazMpLAogICAgICBsaXN0SXRlbTogb3BlbmVyMihsaXN0SXRlbTMpLAogICAgICBsaXN0SXRlbVZhbHVlOiBvbmVudGVybGlzdGl0ZW12YWx1ZSwKICAgICAgbGlzdE9yZGVyZWQ6IG9wZW5lcjIobGlzdDUsIG9uZW50ZXJsaXN0b3JkZXJlZCksCiAgICAgIGxpc3RVbm9yZGVyZWQ6IG9wZW5lcjIobGlzdDUpLAogICAgICBwYXJhZ3JhcGg6IG9wZW5lcjIocGFyYWdyYXBoMyksCiAgICAgIHJlZmVyZW5jZTogb25lbnRlcnJlZmVyZW5jZSwKICAgICAgcmVmZXJlbmNlU3RyaW5nOiBidWZmZXIyLAogICAgICByZXNvdXJjZURlc3RpbmF0aW9uU3RyaW5nOiBidWZmZXIyLAogICAgICByZXNvdXJjZVRpdGxlU3RyaW5nOiBidWZmZXIyLAogICAgICBzZXRleHRIZWFkaW5nOiBvcGVuZXIyKGhlYWRpbmczKSwKICAgICAgc3Ryb25nOiBvcGVuZXIyKHN0cm9uZzMpLAogICAgICB0aGVtYXRpY0JyZWFrOiBvcGVuZXIyKHRoZW1hdGljQnJlYWs0KQogICAgfSwKICAgIGV4aXQ6IHsKICAgICAgYXR4SGVhZGluZzogY2xvc2VyKCksCiAgICAgIGF0eEhlYWRpbmdTZXF1ZW5jZTogb25leGl0YXR4aGVhZGluZ3NlcXVlbmNlLAogICAgICBhdXRvbGluazogY2xvc2VyKCksCiAgICAgIGF1dG9saW5rRW1haWw6IG9uZXhpdGF1dG9saW5rZW1haWwsCiAgICAgIGF1dG9saW5rUHJvdG9jb2w6IG9uZXhpdGF1dG9saW5rcHJvdG9jb2wsCiAgICAgIGJsb2NrUXVvdGU6IGNsb3NlcigpLAogICAgICBjaGFyYWN0ZXJFc2NhcGVWYWx1ZTogb25leGl0ZGF0YSwKICAgICAgY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VySGV4YWRlY2ltYWw6IG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZW1hcmtlciwKICAgICAgY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyTnVtZXJpYzogb25leGl0Y2hhcmFjdGVycmVmZXJlbmNlbWFya2VyLAogICAgICBjaGFyYWN0ZXJSZWZlcmVuY2VWYWx1ZTogb25leGl0Y2hhcmFjdGVycmVmZXJlbmNldmFsdWUsCiAgICAgIGNoYXJhY3RlclJlZmVyZW5jZTogb25leGl0Y2hhcmFjdGVycmVmZXJlbmNlLAogICAgICBjb2RlRmVuY2VkOiBjbG9zZXIob25leGl0Y29kZWZlbmNlZCksCiAgICAgIGNvZGVGZW5jZWRGZW5jZTogb25leGl0Y29kZWZlbmNlZGZlbmNlLAogICAgICBjb2RlRmVuY2VkRmVuY2VJbmZvOiBvbmV4aXRjb2RlZmVuY2VkZmVuY2VpbmZvLAogICAgICBjb2RlRmVuY2VkRmVuY2VNZXRhOiBvbmV4aXRjb2RlZmVuY2VkZmVuY2VtZXRhLAogICAgICBjb2RlRmxvd1ZhbHVlOiBvbmV4aXRkYXRhLAogICAgICBjb2RlSW5kZW50ZWQ6IGNsb3NlcihvbmV4aXRjb2RlaW5kZW50ZWQpLAogICAgICBjb2RlVGV4dDogY2xvc2VyKG9uZXhpdGNvZGV0ZXh0KSwKICAgICAgY29kZVRleHREYXRhOiBvbmV4aXRkYXRhLAogICAgICBkYXRhOiBvbmV4aXRkYXRhLAogICAgICBkZWZpbml0aW9uOiBjbG9zZXIoKSwKICAgICAgZGVmaW5pdGlvbkRlc3RpbmF0aW9uU3RyaW5nOiBvbmV4aXRkZWZpbml0aW9uZGVzdGluYXRpb25zdHJpbmcsCiAgICAgIGRlZmluaXRpb25MYWJlbFN0cmluZzogb25leGl0ZGVmaW5pdGlvbmxhYmVsc3RyaW5nLAogICAgICBkZWZpbml0aW9uVGl0bGVTdHJpbmc6IG9uZXhpdGRlZmluaXRpb250aXRsZXN0cmluZywKICAgICAgZW1waGFzaXM6IGNsb3NlcigpLAogICAgICBoYXJkQnJlYWtFc2NhcGU6IGNsb3NlcihvbmV4aXRoYXJkYnJlYWspLAogICAgICBoYXJkQnJlYWtUcmFpbGluZzogY2xvc2VyKG9uZXhpdGhhcmRicmVhayksCiAgICAgIGh0bWxGbG93OiBjbG9zZXIob25leGl0aHRtbGZsb3cpLAogICAgICBodG1sRmxvd0RhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGh0bWxUZXh0OiBjbG9zZXIob25leGl0aHRtbHRleHQpLAogICAgICBodG1sVGV4dERhdGE6IG9uZXhpdGRhdGEsCiAgICAgIGltYWdlOiBjbG9zZXIob25leGl0aW1hZ2UpLAogICAgICBsYWJlbDogb25leGl0bGFiZWwsCiAgICAgIGxhYmVsVGV4dDogb25leGl0bGFiZWx0ZXh0LAogICAgICBsaW5lRW5kaW5nOiBvbmV4aXRsaW5lZW5kaW5nLAogICAgICBsaW5rOiBjbG9zZXIob25leGl0bGluayksCiAgICAgIGxpc3RJdGVtOiBjbG9zZXIoKSwKICAgICAgbGlzdE9yZGVyZWQ6IGNsb3NlcigpLAogICAgICBsaXN0VW5vcmRlcmVkOiBjbG9zZXIoKSwKICAgICAgcGFyYWdyYXBoOiBjbG9zZXIoKSwKICAgICAgcmVmZXJlbmNlU3RyaW5nOiBvbmV4aXRyZWZlcmVuY2VzdHJpbmcsCiAgICAgIHJlc291cmNlRGVzdGluYXRpb25TdHJpbmc6IG9uZXhpdHJlc291cmNlZGVzdGluYXRpb25zdHJpbmcsCiAgICAgIHJlc291cmNlVGl0bGVTdHJpbmc6IG9uZXhpdHJlc291cmNldGl0bGVzdHJpbmcsCiAgICAgIHJlc291cmNlOiBvbmV4aXRyZXNvdXJjZSwKICAgICAgc2V0ZXh0SGVhZGluZzogY2xvc2VyKG9uZXhpdHNldGV4dGhlYWRpbmcpLAogICAgICBzZXRleHRIZWFkaW5nTGluZVNlcXVlbmNlOiBvbmV4aXRzZXRleHRoZWFkaW5nbGluZXNlcXVlbmNlLAogICAgICBzZXRleHRIZWFkaW5nVGV4dDogb25leGl0c2V0ZXh0aGVhZGluZ3RleHQsCiAgICAgIHN0cm9uZzogY2xvc2VyKCksCiAgICAgIHRoZW1hdGljQnJlYWs6IGNsb3NlcigpCiAgICB9CiAgfTsKICBjb25maWd1cmUyKGNvbmZpZzMsIChvcHRpb25zIHx8IHt9KS5tZGFzdEV4dGVuc2lvbnMgfHwgW10pOwogIGNvbnN0IGRhdGEgPSB7fTsKICByZXR1cm4gY29tcGlsZTI7CiAgZnVuY3Rpb24gY29tcGlsZTIoZXZlbnRzKSB7CiAgICBsZXQgdHJlZSA9IHsKICAgICAgdHlwZTogInJvb3QiLAogICAgICBjaGlsZHJlbjogW10KICAgIH07CiAgICBjb25zdCBjb250ZXh0MiA9IHsKICAgICAgc3RhY2s6IFt0cmVlXSwKICAgICAgdG9rZW5TdGFjazogW10sCiAgICAgIGNvbmZpZzogY29uZmlnMywKICAgICAgZW50ZXIsCiAgICAgIGV4aXQ6IGV4aXQzLAogICAgICBidWZmZXI6IGJ1ZmZlcjIsCiAgICAgIHJlc3VtZSwKICAgICAgZGF0YQogICAgfTsKICAgIGNvbnN0IGxpc3RTdGFjayA9IFtdOwogICAgbGV0IGluZGV4MiA9IC0xOwogICAgd2hpbGUgKCsraW5kZXgyIDwgZXZlbnRzLmxlbmd0aCkgewogICAgICBpZiAoZXZlbnRzW2luZGV4Ml1bMV0udHlwZSA9PT0gImxpc3RPcmRlcmVkIiB8fCBldmVudHNbaW5kZXgyXVsxXS50eXBlID09PSAibGlzdFVub3JkZXJlZCIpIHsKICAgICAgICBpZiAoZXZlbnRzW2luZGV4Ml1bMF0gPT09ICJlbnRlciIpIHsKICAgICAgICAgIGxpc3RTdGFjay5wdXNoKGluZGV4Mik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IHRhaWwgPSBsaXN0U3RhY2sucG9wKCk7CiAgICAgICAgICBpbmRleDIgPSBwcmVwYXJlTGlzdChldmVudHMsIHRhaWwsIGluZGV4Mik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpbmRleDIgPSAtMTsKICAgIHdoaWxlICgrK2luZGV4MiA8IGV2ZW50cy5sZW5ndGgpIHsKICAgICAgY29uc3QgaGFuZGxlcjIgPSBjb25maWczW2V2ZW50c1tpbmRleDJdWzBdXTsKICAgICAgaWYgKG93bjUuY2FsbChoYW5kbGVyMiwgZXZlbnRzW2luZGV4Ml1bMV0udHlwZSkpIHsKICAgICAgICBoYW5kbGVyMltldmVudHNbaW5kZXgyXVsxXS50eXBlXS5jYWxsKE9iamVjdC5hc3NpZ24oewogICAgICAgICAgc2xpY2VTZXJpYWxpemU6IGV2ZW50c1tpbmRleDJdWzJdLnNsaWNlU2VyaWFsaXplCiAgICAgICAgfSwgY29udGV4dDIpLCBldmVudHNbaW5kZXgyXVsxXSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChjb250ZXh0Mi50b2tlblN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgY29uc3QgdGFpbCA9IGNvbnRleHQyLnRva2VuU3RhY2tbY29udGV4dDIudG9rZW5TdGFjay5sZW5ndGggLSAxXTsKICAgICAgY29uc3QgaGFuZGxlcjIgPSB0YWlsWzFdIHx8IGRlZmF1bHRPbkVycm9yOwogICAgICBoYW5kbGVyMi5jYWxsKGNvbnRleHQyLCB2b2lkIDAsIHRhaWxbMF0pOwogICAgfQogICAgdHJlZS5wb3NpdGlvbiA9IHsKICAgICAgc3RhcnQ6IHBvaW50MihldmVudHMubGVuZ3RoID4gMCA/IGV2ZW50c1swXVsxXS5zdGFydCA6IHsKICAgICAgICBsaW5lOiAxLAogICAgICAgIGNvbHVtbjogMSwKICAgICAgICBvZmZzZXQ6IDAKICAgICAgfSksCiAgICAgIGVuZDogcG9pbnQyKGV2ZW50cy5sZW5ndGggPiAwID8gZXZlbnRzW2V2ZW50cy5sZW5ndGggLSAyXVsxXS5lbmQgOiB7CiAgICAgICAgbGluZTogMSwKICAgICAgICBjb2x1bW46IDEsCiAgICAgICAgb2Zmc2V0OiAwCiAgICAgIH0pCiAgICB9OwogICAgaW5kZXgyID0gLTE7CiAgICB3aGlsZSAoKytpbmRleDIgPCBjb25maWczLnRyYW5zZm9ybXMubGVuZ3RoKSB7CiAgICAgIHRyZWUgPSBjb25maWczLnRyYW5zZm9ybXNbaW5kZXgyXSh0cmVlKSB8fCB0cmVlOwogICAgfQogICAgcmV0dXJuIHRyZWU7CiAgfQogIGZ1bmN0aW9uIHByZXBhcmVMaXN0KGV2ZW50cywgc3RhcnQsIGxlbmd0aCkgewogICAgbGV0IGluZGV4MiA9IHN0YXJ0IC0gMTsKICAgIGxldCBjb250YWluZXJCYWxhbmNlID0gLTE7CiAgICBsZXQgbGlzdFNwcmVhZCA9IGZhbHNlOwogICAgbGV0IGxpc3RJdGVtNDsKICAgIGxldCBsaW5lSW5kZXg7CiAgICBsZXQgZmlyc3RCbGFua0xpbmVJbmRleDsKICAgIGxldCBhdE1hcmtlcjsKICAgIHdoaWxlICgrK2luZGV4MiA8PSBsZW5ndGgpIHsKICAgICAgY29uc3QgZXZlbnQgPSBldmVudHNbaW5kZXgyXTsKICAgICAgc3dpdGNoIChldmVudFsxXS50eXBlKSB7CiAgICAgICAgY2FzZSAibGlzdFVub3JkZXJlZCI6CiAgICAgICAgY2FzZSAibGlzdE9yZGVyZWQiOgogICAgICAgIGNhc2UgImJsb2NrUXVvdGUiOiB7CiAgICAgICAgICBpZiAoZXZlbnRbMF0gPT09ICJlbnRlciIpIHsKICAgICAgICAgICAgY29udGFpbmVyQmFsYW5jZSsrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29udGFpbmVyQmFsYW5jZS0tOwogICAgICAgICAgfQogICAgICAgICAgYXRNYXJrZXIgPSB2b2lkIDA7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAibGluZUVuZGluZ0JsYW5rIjogewogICAgICAgICAgaWYgKGV2ZW50WzBdID09PSAiZW50ZXIiKSB7CiAgICAgICAgICAgIGlmIChsaXN0SXRlbTQgJiYgIWF0TWFya2VyICYmICFjb250YWluZXJCYWxhbmNlICYmICFmaXJzdEJsYW5rTGluZUluZGV4KSB7CiAgICAgICAgICAgICAgZmlyc3RCbGFua0xpbmVJbmRleCA9IGluZGV4MjsKICAgICAgICAgICAgfQogICAgICAgICAgICBhdE1hcmtlciA9IHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICJsaW5lUHJlZml4IjoKICAgICAgICBjYXNlICJsaXN0SXRlbVZhbHVlIjoKICAgICAgICBjYXNlICJsaXN0SXRlbU1hcmtlciI6CiAgICAgICAgY2FzZSAibGlzdEl0ZW1QcmVmaXgiOgogICAgICAgIGNhc2UgImxpc3RJdGVtUHJlZml4V2hpdGVzcGFjZSI6IHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICBhdE1hcmtlciA9IHZvaWQgMDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFjb250YWluZXJCYWxhbmNlICYmIGV2ZW50WzBdID09PSAiZW50ZXIiICYmIGV2ZW50WzFdLnR5cGUgPT09ICJsaXN0SXRlbVByZWZpeCIgfHwgY29udGFpbmVyQmFsYW5jZSA9PT0gLTEgJiYgZXZlbnRbMF0gPT09ICJleGl0IiAmJiAoZXZlbnRbMV0udHlwZSA9PT0gImxpc3RVbm9yZGVyZWQiIHx8IGV2ZW50WzFdLnR5cGUgPT09ICJsaXN0T3JkZXJlZCIpKSB7CiAgICAgICAgaWYgKGxpc3RJdGVtNCkgewogICAgICAgICAgbGV0IHRhaWxJbmRleCA9IGluZGV4MjsKICAgICAgICAgIGxpbmVJbmRleCA9IHZvaWQgMDsKICAgICAgICAgIHdoaWxlICh0YWlsSW5kZXgtLSkgewogICAgICAgICAgICBjb25zdCB0YWlsRXZlbnQgPSBldmVudHNbdGFpbEluZGV4XTsKICAgICAgICAgICAgaWYgKHRhaWxFdmVudFsxXS50eXBlID09PSAibGluZUVuZGluZyIgfHwgdGFpbEV2ZW50WzFdLnR5cGUgPT09ICJsaW5lRW5kaW5nQmxhbmsiKSB7CiAgICAgICAgICAgICAgaWYgKHRhaWxFdmVudFswXSA9PT0gImV4aXQiKSBjb250aW51ZTsKICAgICAgICAgICAgICBpZiAobGluZUluZGV4KSB7CiAgICAgICAgICAgICAgICBldmVudHNbbGluZUluZGV4XVsxXS50eXBlID0gImxpbmVFbmRpbmdCbGFuayI7CiAgICAgICAgICAgICAgICBsaXN0U3ByZWFkID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGFpbEV2ZW50WzFdLnR5cGUgPSAibGluZUVuZGluZyI7CiAgICAgICAgICAgICAgbGluZUluZGV4ID0gdGFpbEluZGV4OwogICAgICAgICAgICB9IGVsc2UgaWYgKHRhaWxFdmVudFsxXS50eXBlID09PSAibGluZVByZWZpeCIgfHwgdGFpbEV2ZW50WzFdLnR5cGUgPT09ICJibG9ja1F1b3RlUHJlZml4IiB8fCB0YWlsRXZlbnRbMV0udHlwZSA9PT0gImJsb2NrUXVvdGVQcmVmaXhXaGl0ZXNwYWNlIiB8fCB0YWlsRXZlbnRbMV0udHlwZSA9PT0gImJsb2NrUXVvdGVNYXJrZXIiIHx8IHRhaWxFdmVudFsxXS50eXBlID09PSAibGlzdEl0ZW1JbmRlbnQiKSB7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChmaXJzdEJsYW5rTGluZUluZGV4ICYmICghbGluZUluZGV4IHx8IGZpcnN0QmxhbmtMaW5lSW5kZXggPCBsaW5lSW5kZXgpKSB7CiAgICAgICAgICAgIGxpc3RJdGVtNC5fc3ByZWFkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGxpc3RJdGVtNC5lbmQgPSBPYmplY3QuYXNzaWduKHt9LCBsaW5lSW5kZXggPyBldmVudHNbbGluZUluZGV4XVsxXS5zdGFydCA6IGV2ZW50WzFdLmVuZCk7CiAgICAgICAgICBldmVudHMuc3BsaWNlKGxpbmVJbmRleCB8fCBpbmRleDIsIDAsIFsiZXhpdCIsIGxpc3RJdGVtNCwgZXZlbnRbMl1dKTsKICAgICAgICAgIGluZGV4MisrOwogICAgICAgICAgbGVuZ3RoKys7CiAgICAgICAgfQogICAgICAgIGlmIChldmVudFsxXS50eXBlID09PSAibGlzdEl0ZW1QcmVmaXgiKSB7CiAgICAgICAgICBjb25zdCBpdGVtID0gewogICAgICAgICAgICB0eXBlOiAibGlzdEl0ZW0iLAogICAgICAgICAgICBfc3ByZWFkOiBmYWxzZSwKICAgICAgICAgICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50WzFdLnN0YXJ0KSwKICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogd2XigJlsbCBhZGQgYGVuZGAgaW4gYSBzZWNvbmQuCiAgICAgICAgICAgIGVuZDogdm9pZCAwCiAgICAgICAgICB9OwogICAgICAgICAgbGlzdEl0ZW00ID0gaXRlbTsKICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaW5kZXgyLCAwLCBbImVudGVyIiwgaXRlbSwgZXZlbnRbMl1dKTsKICAgICAgICAgIGluZGV4MisrOwogICAgICAgICAgbGVuZ3RoKys7CiAgICAgICAgICBmaXJzdEJsYW5rTGluZUluZGV4ID0gdm9pZCAwOwogICAgICAgICAgYXRNYXJrZXIgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZXZlbnRzW3N0YXJ0XVsxXS5fc3ByZWFkID0gbGlzdFNwcmVhZDsKICAgIHJldHVybiBsZW5ndGg7CiAgfQogIGZ1bmN0aW9uIG9wZW5lcjIoY3JlYXRlNywgYW5kKSB7CiAgICByZXR1cm4gb3BlbjsKICAgIGZ1bmN0aW9uIG9wZW4odG9rZW4pIHsKICAgICAgZW50ZXIuY2FsbCh0aGlzLCBjcmVhdGU3KHRva2VuKSwgdG9rZW4pOwogICAgICBpZiAoYW5kKSBhbmQuY2FsbCh0aGlzLCB0b2tlbik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGJ1ZmZlcjIoKSB7CiAgICB0aGlzLnN0YWNrLnB1c2goewogICAgICB0eXBlOiAiZnJhZ21lbnQiLAogICAgICBjaGlsZHJlbjogW10KICAgIH0pOwogIH0KICBmdW5jdGlvbiBlbnRlcihub2RlMiwgdG9rZW4sIGVycm9ySGFuZGxlcikgewogICAgY29uc3QgcGFyZW50ID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgY29uc3Qgc2libGluZ3MyID0gcGFyZW50LmNoaWxkcmVuOwogICAgc2libGluZ3MyLnB1c2gobm9kZTIpOwogICAgdGhpcy5zdGFjay5wdXNoKG5vZGUyKTsKICAgIHRoaXMudG9rZW5TdGFjay5wdXNoKFt0b2tlbiwgZXJyb3JIYW5kbGVyIHx8IHZvaWQgMF0pOwogICAgbm9kZTIucG9zaXRpb24gPSB7CiAgICAgIHN0YXJ0OiBwb2ludDIodG9rZW4uc3RhcnQpLAogICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBgZW5kYCB3aWxsIGJlIHBhdGNoZWQgbGF0ZXIuCiAgICAgIGVuZDogdm9pZCAwCiAgICB9OwogIH0KICBmdW5jdGlvbiBjbG9zZXIoYW5kKSB7CiAgICByZXR1cm4gY2xvc2U3OwogICAgZnVuY3Rpb24gY2xvc2U3KHRva2VuKSB7CiAgICAgIGlmIChhbmQpIGFuZC5jYWxsKHRoaXMsIHRva2VuKTsKICAgICAgZXhpdDMuY2FsbCh0aGlzLCB0b2tlbik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGV4aXQzKHRva2VuLCBvbkV4aXRFcnJvcikgewogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrLnBvcCgpOwogICAgY29uc3Qgb3BlbiA9IHRoaXMudG9rZW5TdGFjay5wb3AoKTsKICAgIGlmICghb3BlbikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjbG9zZSBgIiArIHRva2VuLnR5cGUgKyAiYCAoIiArIHN0cmluZ2lmeVBvc2l0aW9uKHsKICAgICAgICBzdGFydDogdG9rZW4uc3RhcnQsCiAgICAgICAgZW5kOiB0b2tlbi5lbmQKICAgICAgfSkgKyAiKTogaXRcdTIwMTlzIG5vdCBvcGVuIik7CiAgICB9IGVsc2UgaWYgKG9wZW5bMF0udHlwZSAhPT0gdG9rZW4udHlwZSkgewogICAgICBpZiAob25FeGl0RXJyb3IpIHsKICAgICAgICBvbkV4aXRFcnJvci5jYWxsKHRoaXMsIHRva2VuLCBvcGVuWzBdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBoYW5kbGVyMiA9IG9wZW5bMV0gfHwgZGVmYXVsdE9uRXJyb3I7CiAgICAgICAgaGFuZGxlcjIuY2FsbCh0aGlzLCB0b2tlbiwgb3BlblswXSk7CiAgICAgIH0KICAgIH0KICAgIG5vZGUyLnBvc2l0aW9uLmVuZCA9IHBvaW50Mih0b2tlbi5lbmQpOwogIH0KICBmdW5jdGlvbiByZXN1bWUoKSB7CiAgICByZXR1cm4gdG9TdHJpbmcodGhpcy5zdGFjay5wb3AoKSk7CiAgfQogIGZ1bmN0aW9uIG9uZW50ZXJsaXN0b3JkZXJlZCgpIHsKICAgIHRoaXMuZGF0YS5leHBlY3RpbmdGaXJzdExpc3RJdGVtVmFsdWUgPSB0cnVlOwogIH0KICBmdW5jdGlvbiBvbmVudGVybGlzdGl0ZW12YWx1ZSh0b2tlbikgewogICAgaWYgKHRoaXMuZGF0YS5leHBlY3RpbmdGaXJzdExpc3RJdGVtVmFsdWUpIHsKICAgICAgY29uc3QgYW5jZXN0b3IgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMl07CiAgICAgIGFuY2VzdG9yLnN0YXJ0ID0gTnVtYmVyLnBhcnNlSW50KHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pLCAxMCk7CiAgICAgIHRoaXMuZGF0YS5leHBlY3RpbmdGaXJzdExpc3RJdGVtVmFsdWUgPSB2b2lkIDA7CiAgICB9CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8oKSB7CiAgICBjb25zdCBkYXRhMiA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLmxhbmcgPSBkYXRhMjsKICB9CiAgZnVuY3Rpb24gb25leGl0Y29kZWZlbmNlZGZlbmNlbWV0YSgpIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIubWV0YSA9IGRhdGEyOwogIH0KICBmdW5jdGlvbiBvbmV4aXRjb2RlZmVuY2VkZmVuY2UoKSB7CiAgICBpZiAodGhpcy5kYXRhLmZsb3dDb2RlSW5zaWRlKSByZXR1cm47CiAgICB0aGlzLmJ1ZmZlcigpOwogICAgdGhpcy5kYXRhLmZsb3dDb2RlSW5zaWRlID0gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gb25leGl0Y29kZWZlbmNlZCgpIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIudmFsdWUgPSBkYXRhMi5yZXBsYWNlKC9eKFxyP1xufFxyKXwoXHI/XG58XHIpJC9nLCAiIik7CiAgICB0aGlzLmRhdGEuZmxvd0NvZGVJbnNpZGUgPSB2b2lkIDA7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGNvZGVpbmRlbnRlZCgpIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIudmFsdWUgPSBkYXRhMi5yZXBsYWNlKC8oXHI/XG58XHIpJC9nLCAiIik7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZyh0b2tlbikgewogICAgY29uc3QgbGFiZWwgPSB0aGlzLnJlc3VtZSgpOwogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBub2RlMi5sYWJlbCA9IGxhYmVsOwogICAgbm9kZTIuaWRlbnRpZmllciA9IG5vcm1hbGl6ZUlkZW50aWZpZXIodGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbikpLnRvTG93ZXJDYXNlKCk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGRlZmluaXRpb250aXRsZXN0cmluZygpIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIudGl0bGUgPSBkYXRhMjsKICB9CiAgZnVuY3Rpb24gb25leGl0ZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nKCkgewogICAgY29uc3QgZGF0YTIgPSB0aGlzLnJlc3VtZSgpOwogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBub2RlMi51cmwgPSBkYXRhMjsKICB9CiAgZnVuY3Rpb24gb25leGl0YXR4aGVhZGluZ3NlcXVlbmNlKHRva2VuKSB7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIGlmICghbm9kZTIuZGVwdGgpIHsKICAgICAgY29uc3QgZGVwdGggPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKS5sZW5ndGg7CiAgICAgIG5vZGUyLmRlcHRoID0gZGVwdGg7CiAgICB9CiAgfQogIGZ1bmN0aW9uIG9uZXhpdHNldGV4dGhlYWRpbmd0ZXh0KCkgewogICAgdGhpcy5kYXRhLnNldGV4dEhlYWRpbmdTbHVycExpbmVFbmRpbmcgPSB0cnVlOwogIH0KICBmdW5jdGlvbiBvbmV4aXRzZXRleHRoZWFkaW5nbGluZXNlcXVlbmNlKHRva2VuKSB7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLmRlcHRoID0gdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbikuY29kZVBvaW50QXQoMCkgPT09IDYxID8gMSA6IDI7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdHNldGV4dGhlYWRpbmcoKSB7CiAgICB0aGlzLmRhdGEuc2V0ZXh0SGVhZGluZ1NsdXJwTGluZUVuZGluZyA9IHZvaWQgMDsKICB9CiAgZnVuY3Rpb24gb25lbnRlcmRhdGEodG9rZW4pIHsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgY29uc3Qgc2libGluZ3MyID0gbm9kZTIuY2hpbGRyZW47CiAgICBsZXQgdGFpbCA9IHNpYmxpbmdzMltzaWJsaW5nczIubGVuZ3RoIC0gMV07CiAgICBpZiAoIXRhaWwgfHwgdGFpbC50eXBlICE9PSAidGV4dCIpIHsKICAgICAgdGFpbCA9IHRleHQ5KCk7CiAgICAgIHRhaWwucG9zaXRpb24gPSB7CiAgICAgICAgc3RhcnQ6IHBvaW50Mih0b2tlbi5zdGFydCksCiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogd2XigJlsbCBhZGQgYGVuZGAgbGF0ZXIuCiAgICAgICAgZW5kOiB2b2lkIDAKICAgICAgfTsKICAgICAgc2libGluZ3MyLnB1c2godGFpbCk7CiAgICB9CiAgICB0aGlzLnN0YWNrLnB1c2godGFpbCk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGRhdGEodG9rZW4pIHsKICAgIGNvbnN0IHRhaWwgPSB0aGlzLnN0YWNrLnBvcCgpOwogICAgdGFpbC52YWx1ZSArPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICAgIHRhaWwucG9zaXRpb24uZW5kID0gcG9pbnQyKHRva2VuLmVuZCk7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGxpbmVlbmRpbmcodG9rZW4pIHsKICAgIGNvbnN0IGNvbnRleHQyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgaWYgKHRoaXMuZGF0YS5hdEhhcmRCcmVhaykgewogICAgICBjb25zdCB0YWlsID0gY29udGV4dDIuY2hpbGRyZW5bY29udGV4dDIuY2hpbGRyZW4ubGVuZ3RoIC0gMV07CiAgICAgIHRhaWwucG9zaXRpb24uZW5kID0gcG9pbnQyKHRva2VuLmVuZCk7CiAgICAgIHRoaXMuZGF0YS5hdEhhcmRCcmVhayA9IHZvaWQgMDsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCF0aGlzLmRhdGEuc2V0ZXh0SGVhZGluZ1NsdXJwTGluZUVuZGluZyAmJiBjb25maWczLmNhbkNvbnRhaW5Fb2xzLmluY2x1ZGVzKGNvbnRleHQyLnR5cGUpKSB7CiAgICAgIG9uZW50ZXJkYXRhLmNhbGwodGhpcywgdG9rZW4pOwogICAgICBvbmV4aXRkYXRhLmNhbGwodGhpcywgdG9rZW4pOwogICAgfQogIH0KICBmdW5jdGlvbiBvbmV4aXRoYXJkYnJlYWsoKSB7CiAgICB0aGlzLmRhdGEuYXRIYXJkQnJlYWsgPSB0cnVlOwogIH0KICBmdW5jdGlvbiBvbmV4aXRodG1sZmxvdygpIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIudmFsdWUgPSBkYXRhMjsKICB9CiAgZnVuY3Rpb24gb25leGl0aHRtbHRleHQoKSB7CiAgICBjb25zdCBkYXRhMiA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLnZhbHVlID0gZGF0YTI7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGNvZGV0ZXh0KCkgewogICAgY29uc3QgZGF0YTIgPSB0aGlzLnJlc3VtZSgpOwogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBub2RlMi52YWx1ZSA9IGRhdGEyOwogIH0KICBmdW5jdGlvbiBvbmV4aXRsaW5rKCkgewogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBpZiAodGhpcy5kYXRhLmluUmVmZXJlbmNlKSB7CiAgICAgIGNvbnN0IHJlZmVyZW5jZVR5cGUgPSB0aGlzLmRhdGEucmVmZXJlbmNlVHlwZSB8fCAic2hvcnRjdXQiOwogICAgICBub2RlMi50eXBlICs9ICJSZWZlcmVuY2UiOwogICAgICBub2RlMi5yZWZlcmVuY2VUeXBlID0gcmVmZXJlbmNlVHlwZTsKICAgICAgZGVsZXRlIG5vZGUyLnVybDsKICAgICAgZGVsZXRlIG5vZGUyLnRpdGxlOwogICAgfSBlbHNlIHsKICAgICAgZGVsZXRlIG5vZGUyLmlkZW50aWZpZXI7CiAgICAgIGRlbGV0ZSBub2RlMi5sYWJlbDsKICAgIH0KICAgIHRoaXMuZGF0YS5yZWZlcmVuY2VUeXBlID0gdm9pZCAwOwogIH0KICBmdW5jdGlvbiBvbmV4aXRpbWFnZSgpIHsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgaWYgKHRoaXMuZGF0YS5pblJlZmVyZW5jZSkgewogICAgICBjb25zdCByZWZlcmVuY2VUeXBlID0gdGhpcy5kYXRhLnJlZmVyZW5jZVR5cGUgfHwgInNob3J0Y3V0IjsKICAgICAgbm9kZTIudHlwZSArPSAiUmVmZXJlbmNlIjsKICAgICAgbm9kZTIucmVmZXJlbmNlVHlwZSA9IHJlZmVyZW5jZVR5cGU7CiAgICAgIGRlbGV0ZSBub2RlMi51cmw7CiAgICAgIGRlbGV0ZSBub2RlMi50aXRsZTsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGV0ZSBub2RlMi5pZGVudGlmaWVyOwogICAgICBkZWxldGUgbm9kZTIubGFiZWw7CiAgICB9CiAgICB0aGlzLmRhdGEucmVmZXJlbmNlVHlwZSA9IHZvaWQgMDsKICB9CiAgZnVuY3Rpb24gb25leGl0bGFiZWx0ZXh0KHRva2VuKSB7CiAgICBjb25zdCBzdHJpbmczID0gdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbik7CiAgICBjb25zdCBhbmNlc3RvciA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAyXTsKICAgIGFuY2VzdG9yLmxhYmVsID0gZGVjb2RlU3RyaW5nKHN0cmluZzMpOwogICAgYW5jZXN0b3IuaWRlbnRpZmllciA9IG5vcm1hbGl6ZUlkZW50aWZpZXIoc3RyaW5nMykudG9Mb3dlckNhc2UoKTsKICB9CiAgZnVuY3Rpb24gb25leGl0bGFiZWwoKSB7CiAgICBjb25zdCBmcmFnbWVudCA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIGNvbnN0IHZhbHVlMiA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIHRoaXMuZGF0YS5pblJlZmVyZW5jZSA9IHRydWU7CiAgICBpZiAobm9kZTIudHlwZSA9PT0gImxpbmsiKSB7CiAgICAgIGNvbnN0IGNoaWxkcmVuMiA9IGZyYWdtZW50LmNoaWxkcmVuOwogICAgICBub2RlMi5jaGlsZHJlbiA9IGNoaWxkcmVuMjsKICAgIH0gZWxzZSB7CiAgICAgIG5vZGUyLmFsdCA9IHZhbHVlMjsKICAgIH0KICB9CiAgZnVuY3Rpb24gb25leGl0cmVzb3VyY2VkZXN0aW5hdGlvbnN0cmluZygpIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5yZXN1bWUoKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIudXJsID0gZGF0YTI7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdHJlc291cmNldGl0bGVzdHJpbmcoKSB7CiAgICBjb25zdCBkYXRhMiA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLnRpdGxlID0gZGF0YTI7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdHJlc291cmNlKCkgewogICAgdGhpcy5kYXRhLmluUmVmZXJlbmNlID0gdm9pZCAwOwogIH0KICBmdW5jdGlvbiBvbmVudGVycmVmZXJlbmNlKCkgewogICAgdGhpcy5kYXRhLnJlZmVyZW5jZVR5cGUgPSAiY29sbGFwc2VkIjsKICB9CiAgZnVuY3Rpb24gb25leGl0cmVmZXJlbmNlc3RyaW5nKHRva2VuKSB7CiAgICBjb25zdCBsYWJlbCA9IHRoaXMucmVzdW1lKCk7CiAgICBjb25zdCBub2RlMiA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTsKICAgIG5vZGUyLmxhYmVsID0gbGFiZWw7CiAgICBub2RlMi5pZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcih0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKSkudG9Mb3dlckNhc2UoKTsKICAgIHRoaXMuZGF0YS5yZWZlcmVuY2VUeXBlID0gImZ1bGwiOwogIH0KICBmdW5jdGlvbiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2VtYXJrZXIodG9rZW4pIHsKICAgIHRoaXMuZGF0YS5jaGFyYWN0ZXJSZWZlcmVuY2VUeXBlID0gdG9rZW4udHlwZTsKICB9CiAgZnVuY3Rpb24gb25leGl0Y2hhcmFjdGVycmVmZXJlbmNldmFsdWUodG9rZW4pIHsKICAgIGNvbnN0IGRhdGEyID0gdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbik7CiAgICBjb25zdCB0eXBlNSA9IHRoaXMuZGF0YS5jaGFyYWN0ZXJSZWZlcmVuY2VUeXBlOwogICAgbGV0IHZhbHVlMjsKICAgIGlmICh0eXBlNSkgewogICAgICB2YWx1ZTIgPSBkZWNvZGVOdW1lcmljQ2hhcmFjdGVyUmVmZXJlbmNlKGRhdGEyLCB0eXBlNSA9PT0gImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlck51bWVyaWMiID8gMTAgOiAxNik7CiAgICAgIHRoaXMuZGF0YS5jaGFyYWN0ZXJSZWZlcmVuY2VUeXBlID0gdm9pZCAwOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgcmVzdWx0ID0gZGVjb2RlTmFtZWRDaGFyYWN0ZXJSZWZlcmVuY2UoZGF0YTIpOwogICAgICB2YWx1ZTIgPSByZXN1bHQ7CiAgICB9CiAgICBjb25zdCB0YWlsID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgdGFpbC52YWx1ZSArPSB2YWx1ZTI7CiAgfQogIGZ1bmN0aW9uIG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZSh0b2tlbikgewogICAgY29uc3QgdGFpbCA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICB0YWlsLnBvc2l0aW9uLmVuZCA9IHBvaW50Mih0b2tlbi5lbmQpOwogIH0KICBmdW5jdGlvbiBvbmV4aXRhdXRvbGlua3Byb3RvY29sKHRva2VuKSB7CiAgICBvbmV4aXRkYXRhLmNhbGwodGhpcywgdG9rZW4pOwogICAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgICBub2RlMi51cmwgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKTsKICB9CiAgZnVuY3Rpb24gb25leGl0YXV0b2xpbmtlbWFpbCh0b2tlbikgewogICAgb25leGl0ZGF0YS5jYWxsKHRoaXMsIHRva2VuKTsKICAgIGNvbnN0IG5vZGUyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdOwogICAgbm9kZTIudXJsID0gIm1haWx0bzoiICsgdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbik7CiAgfQogIGZ1bmN0aW9uIGJsb2NrUXVvdGUyKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImJsb2NrcXVvdGUiLAogICAgICBjaGlsZHJlbjogW10KICAgIH07CiAgfQogIGZ1bmN0aW9uIGNvZGVGbG93KCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImNvZGUiLAogICAgICBsYW5nOiBudWxsLAogICAgICBtZXRhOiBudWxsLAogICAgICB2YWx1ZTogIiIKICAgIH07CiAgfQogIGZ1bmN0aW9uIGNvZGVUZXh0MigpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJpbmxpbmVDb2RlIiwKICAgICAgdmFsdWU6ICIiCiAgICB9OwogIH0KICBmdW5jdGlvbiBkZWZpbml0aW9uMygpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJkZWZpbml0aW9uIiwKICAgICAgaWRlbnRpZmllcjogIiIsCiAgICAgIGxhYmVsOiBudWxsLAogICAgICB0aXRsZTogbnVsbCwKICAgICAgdXJsOiAiIgogICAgfTsKICB9CiAgZnVuY3Rpb24gZW1waGFzaXMzKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImVtcGhhc2lzIiwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogIH0KICBmdW5jdGlvbiBoZWFkaW5nMygpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJoZWFkaW5nIiwKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgZGVwdGhgIHdpbGwgYmUgc2V0IGxhdGVyLgogICAgICBkZXB0aDogMCwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogIH0KICBmdW5jdGlvbiBoYXJkQnJlYWszKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImJyZWFrIgogICAgfTsKICB9CiAgZnVuY3Rpb24gaHRtbDE2KCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImh0bWwiLAogICAgICB2YWx1ZTogIiIKICAgIH07CiAgfQogIGZ1bmN0aW9uIGltYWdlMygpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJpbWFnZSIsCiAgICAgIHRpdGxlOiBudWxsLAogICAgICB1cmw6ICIiLAogICAgICBhbHQ6IG51bGwKICAgIH07CiAgfQogIGZ1bmN0aW9uIGxpbmszKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImxpbmsiLAogICAgICB0aXRsZTogbnVsbCwKICAgICAgdXJsOiAiIiwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogIH0KICBmdW5jdGlvbiBsaXN0NSh0b2tlbikgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImxpc3QiLAogICAgICBvcmRlcmVkOiB0b2tlbi50eXBlID09PSAibGlzdE9yZGVyZWQiLAogICAgICBzdGFydDogbnVsbCwKICAgICAgc3ByZWFkOiB0b2tlbi5fc3ByZWFkLAogICAgICBjaGlsZHJlbjogW10KICAgIH07CiAgfQogIGZ1bmN0aW9uIGxpc3RJdGVtMyh0b2tlbikgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogImxpc3RJdGVtIiwKICAgICAgc3ByZWFkOiB0b2tlbi5fc3ByZWFkLAogICAgICBjaGVja2VkOiBudWxsLAogICAgICBjaGlsZHJlbjogW10KICAgIH07CiAgfQogIGZ1bmN0aW9uIHBhcmFncmFwaDMoKSB7CiAgICByZXR1cm4gewogICAgICB0eXBlOiAicGFyYWdyYXBoIiwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHJvbmczKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogInN0cm9uZyIsCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfTsKICB9CiAgZnVuY3Rpb24gdGV4dDkoKSB7CiAgICByZXR1cm4gewogICAgICB0eXBlOiAidGV4dCIsCiAgICAgIHZhbHVlOiAiIgogICAgfTsKICB9CiAgZnVuY3Rpb24gdGhlbWF0aWNCcmVhazQoKSB7CiAgICByZXR1cm4gewogICAgICB0eXBlOiAidGhlbWF0aWNCcmVhayIKICAgIH07CiAgfQp9CmZ1bmN0aW9uIHBvaW50MihkNikgewogIHJldHVybiB7CiAgICBsaW5lOiBkNi5saW5lLAogICAgY29sdW1uOiBkNi5jb2x1bW4sCiAgICBvZmZzZXQ6IGQ2Lm9mZnNldAogIH07Cn0KZnVuY3Rpb24gY29uZmlndXJlMihjb21iaW5lZCwgZXh0ZW5zaW9ucykgewogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBleHRlbnNpb25zLmxlbmd0aCkgewogICAgY29uc3QgdmFsdWUyID0gZXh0ZW5zaW9uc1tpbmRleDJdOwogICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUyKSkgewogICAgICBjb25maWd1cmUyKGNvbWJpbmVkLCB2YWx1ZTIpOwogICAgfSBlbHNlIHsKICAgICAgZXh0ZW5zaW9uKGNvbWJpbmVkLCB2YWx1ZTIpOwogICAgfQogIH0KfQpmdW5jdGlvbiBleHRlbnNpb24oY29tYmluZWQsIGV4dGVuc2lvbjIpIHsKICBsZXQga2V5MjsKICBmb3IgKGtleTIgaW4gZXh0ZW5zaW9uMikgewogICAgaWYgKG93bjUuY2FsbChleHRlbnNpb24yLCBrZXkyKSkgewogICAgICBzd2l0Y2ggKGtleTIpIHsKICAgICAgICBjYXNlICJjYW5Db250YWluRW9scyI6IHsKICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gZXh0ZW5zaW9uMltrZXkyXTsKICAgICAgICAgIGlmIChyaWdodCkgewogICAgICAgICAgICBjb21iaW5lZFtrZXkyXS5wdXNoKC4uLnJpZ2h0KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICJ0cmFuc2Zvcm1zIjogewogICAgICAgICAgY29uc3QgcmlnaHQgPSBleHRlbnNpb24yW2tleTJdOwogICAgICAgICAgaWYgKHJpZ2h0KSB7CiAgICAgICAgICAgIGNvbWJpbmVkW2tleTJdLnB1c2goLi4ucmlnaHQpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgImVudGVyIjoKICAgICAgICBjYXNlICJleGl0IjogewogICAgICAgICAgY29uc3QgcmlnaHQgPSBleHRlbnNpb24yW2tleTJdOwogICAgICAgICAgaWYgKHJpZ2h0KSB7CiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29tYmluZWRba2V5Ml0sIHJpZ2h0KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQpmdW5jdGlvbiBkZWZhdWx0T25FcnJvcihsZWZ0LCByaWdodCkgewogIGlmIChsZWZ0KSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjbG9zZSBgIiArIGxlZnQudHlwZSArICJgICgiICsgc3RyaW5naWZ5UG9zaXRpb24oewogICAgICBzdGFydDogbGVmdC5zdGFydCwKICAgICAgZW5kOiBsZWZ0LmVuZAogICAgfSkgKyAiKTogYSBkaWZmZXJlbnQgdG9rZW4gKGAiICsgcmlnaHQudHlwZSArICJgLCAiICsgc3RyaW5naWZ5UG9zaXRpb24oewogICAgICBzdGFydDogcmlnaHQuc3RhcnQsCiAgICAgIGVuZDogcmlnaHQuZW5kCiAgICB9KSArICIpIGlzIG9wZW4iKTsKICB9IGVsc2UgewogICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY2xvc2UgZG9jdW1lbnQsIGEgdG9rZW4gKGAiICsgcmlnaHQudHlwZSArICJgLCAiICsgc3RyaW5naWZ5UG9zaXRpb24oewogICAgICBzdGFydDogcmlnaHQuc3RhcnQsCiAgICAgIGVuZDogcmlnaHQuZW5kCiAgICB9KSArICIpIGlzIHN0aWxsIG9wZW4iKTsKICB9Cn0KdmFyIG93bjU7CnZhciBpbml0X2xpYjIxID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duQDIuMC4yL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWZyb20tbWFya2Rvd24vbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfbWRhc3RfdXRpbF90b19zdHJpbmcoKTsKICAgIGluaXRfbWljcm9tYXJrKCk7CiAgICBpbml0X21pY3JvbWFya191dGlsX2RlY29kZV9udW1lcmljX2NoYXJhY3Rlcl9yZWZlcmVuY2UoKTsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfZGVjb2RlX3N0cmluZygpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9ub3JtYWxpemVfaWRlbnRpZmllcigpOwogICAgaW5pdF9pbmRleF9kb20oKTsKICAgIGluaXRfdW5pc3RfdXRpbF9zdHJpbmdpZnlfcG9zaXRpb24oKTsKICAgIG93bjUgPSB7fS5oYXNPd25Qcm9wZXJ0eTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZnJvbS1tYXJrZG93bkAyLjAuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duL2luZGV4LmpzCnZhciBpbml0X21kYXN0X3V0aWxfZnJvbV9tYXJrZG93biA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZnJvbS1tYXJrZG93bkAyLjAuMi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliMjEoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1wYXJzZUAxMS4wLjAvbm9kZV9tb2R1bGVzL3JlbWFyay1wYXJzZS9saWIvaW5kZXguanMKZnVuY3Rpb24gcmVtYXJrUGFyc2Uob3B0aW9ucykgewogIGNvbnN0IHNlbGYyID0gdGhpczsKICBzZWxmMi5wYXJzZXIgPSBwYXJzZXI7CiAgZnVuY3Rpb24gcGFyc2VyKGRvYykgewogICAgcmV0dXJuIGZyb21NYXJrZG93bihkb2MsIHsKICAgICAgLi4uc2VsZjIuZGF0YSgic2V0dGluZ3MiKSwKICAgICAgLi4ub3B0aW9ucywKICAgICAgLy8gTm90ZTogdGhlc2Ugb3B0aW9ucyBhcmUgbm90IGluIHRoZSByZWFkbWUuCiAgICAgIC8vIFRoZSBnb2FsIGlzIGZvciB0aGVtIHRvIGJlIHNldCBieSBwbHVnaW5zIG9uIGBkYXRhYCBpbnN0ZWFkIG9mIGJlaW5nCiAgICAgIC8vIHBhc3NlZCBieSB1c2Vycy4KICAgICAgZXh0ZW5zaW9uczogc2VsZjIuZGF0YSgibWljcm9tYXJrRXh0ZW5zaW9ucyIpIHx8IFtdLAogICAgICBtZGFzdEV4dGVuc2lvbnM6IHNlbGYyLmRhdGEoImZyb21NYXJrZG93bkV4dGVuc2lvbnMiKSB8fCBbXQogICAgfSk7CiAgfQp9CnZhciBpbml0X2xpYjIyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcmVtYXJrLXBhcnNlQDExLjAuMC9ub2RlX21vZHVsZXMvcmVtYXJrLXBhcnNlL2xpYi9pbmRleC5qcyIoKSB7CiAgICBpbml0X21kYXN0X3V0aWxfZnJvbV9tYXJrZG93bigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcmVtYXJrLXBhcnNlQDExLjAuMC9ub2RlX21vZHVsZXMvcmVtYXJrLXBhcnNlL2luZGV4LmpzCnZhciBpbml0X3JlbWFya19wYXJzZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1wYXJzZUAxMS4wLjAvbm9kZV9tb2R1bGVzL3JlbWFyay1wYXJzZS9pbmRleC5qcyIoKSB7CiAgICBpbml0X2xpYjIyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mb3JtYXRAMC4yLjIvbm9kZV9tb2R1bGVzL2Zvcm1hdC9mb3JtYXQuanMKdmFyIHJlcXVpcmVfZm9ybWF0ID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9mb3JtYXRAMC4yLjIvbm9kZV9tb2R1bGVzL2Zvcm1hdC9mb3JtYXQuanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgOwogICAgKGZ1bmN0aW9uKCkgewogICAgICB2YXIgbmFtZXNwYWNlMjsKICAgICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgbmFtZXNwYWNlMiA9IG1vZHVsZS5leHBvcnRzID0gZm9ybWF0MjsKICAgICAgfSBlbHNlIHsKICAgICAgICBuYW1lc3BhY2UyID0gKGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMgfHwgKDEsIGV2YWwpKCJ0aGlzIik7CiAgICAgICAgfSkoKTsKICAgICAgfQogICAgICBuYW1lc3BhY2UyLmZvcm1hdCA9IGZvcm1hdDI7CiAgICAgIG5hbWVzcGFjZTIudnNwcmludGYgPSB2c3ByaW50ZjsKICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgY29uc29sZS5sb2cgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICBuYW1lc3BhY2UyLnByaW50ZiA9IHByaW50ZjsKICAgICAgfQogICAgICBmdW5jdGlvbiBwcmludGYoKSB7CiAgICAgICAgY29uc29sZS5sb2coZm9ybWF0Mi5hcHBseShudWxsLCBhcmd1bWVudHMpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiB2c3ByaW50ZihmbXQsIHJlcGxhY2VtZW50cykgewogICAgICAgIHJldHVybiBmb3JtYXQyLmFwcGx5KG51bGwsIFtmbXRdLmNvbmNhdChyZXBsYWNlbWVudHMpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBmb3JtYXQyKGZtdCkgewogICAgICAgIHZhciBhcmdJbmRleCA9IDEsIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyksIGkxMSA9IDAsIG4xMyA9IGZtdC5sZW5ndGgsIHJlc3VsdCA9ICIiLCBjMTEsIGVzY2FwZWQgPSBmYWxzZSwgYXJnLCB0bXAsIGxlYWRpbmdaZXJvID0gZmFsc2UsIHByZWNpc2lvbiwgbmV4dEFyZyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107CiAgICAgICAgfSwgc2x1cnBOdW1iZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBkaWdpdHMgPSAiIjsKICAgICAgICAgIHdoaWxlICgvXGQvLnRlc3QoZm10W2kxMV0pKSB7CiAgICAgICAgICAgIGRpZ2l0cyArPSBmbXRbaTExKytdOwogICAgICAgICAgICBjMTEgPSBmbXRbaTExXTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBkaWdpdHMubGVuZ3RoID4gMCA/IHBhcnNlSW50KGRpZ2l0cykgOiBudWxsOwogICAgICAgIH07CiAgICAgICAgZm9yICg7IGkxMSA8IG4xMzsgKytpMTEpIHsKICAgICAgICAgIGMxMSA9IGZtdFtpMTFdOwogICAgICAgICAgaWYgKGVzY2FwZWQpIHsKICAgICAgICAgICAgZXNjYXBlZCA9IGZhbHNlOwogICAgICAgICAgICBpZiAoYzExID09ICIuIikgewogICAgICAgICAgICAgIGxlYWRpbmdaZXJvID0gZmFsc2U7CiAgICAgICAgICAgICAgYzExID0gZm10WysraTExXTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjMTEgPT0gIjAiICYmIGZtdFtpMTEgKyAxXSA9PSAiLiIpIHsKICAgICAgICAgICAgICBsZWFkaW5nWmVybyA9IHRydWU7CiAgICAgICAgICAgICAgaTExICs9IDI7CiAgICAgICAgICAgICAgYzExID0gZm10W2kxMV07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbGVhZGluZ1plcm8gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByZWNpc2lvbiA9IHNsdXJwTnVtYmVyKCk7CiAgICAgICAgICAgIHN3aXRjaCAoYzExKSB7CiAgICAgICAgICAgICAgY2FzZSAiYiI6CiAgICAgICAgICAgICAgICByZXN1bHQgKz0gcGFyc2VJbnQobmV4dEFyZygpLCAxMCkudG9TdHJpbmcoMik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICJjIjoKICAgICAgICAgICAgICAgIGFyZyA9IG5leHRBcmcoKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAic3RyaW5nIiB8fCBhcmcgaW5zdGFuY2VvZiBTdHJpbmcpCiAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhcmc7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGFyZywgMTApKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgImQiOgogICAgICAgICAgICAgICAgcmVzdWx0ICs9IHBhcnNlSW50KG5leHRBcmcoKSwgMTApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAiZiI6CiAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmcocGFyc2VGbG9hdChuZXh0QXJnKCkpLnRvRml4ZWQocHJlY2lzaW9uIHx8IDYpKTsKICAgICAgICAgICAgICAgIHJlc3VsdCArPSBsZWFkaW5nWmVybyA/IHRtcCA6IHRtcC5yZXBsYWNlKC9eMC8sICIiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgImoiOgogICAgICAgICAgICAgICAgcmVzdWx0ICs9IEpTT04uc3RyaW5naWZ5KG5leHRBcmcoKSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICJvIjoKICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiMCIgKyBwYXJzZUludChuZXh0QXJnKCksIDEwKS50b1N0cmluZyg4KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgInMiOgogICAgICAgICAgICAgICAgcmVzdWx0ICs9IG5leHRBcmcoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgIngiOgogICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIweCIgKyBwYXJzZUludChuZXh0QXJnKCksIDEwKS50b1N0cmluZygxNik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICJYIjoKICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiMHgiICsgcGFyc2VJbnQobmV4dEFyZygpLCAxMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmVzdWx0ICs9IGMxMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKGMxMSA9PT0gIiUiKSB7CiAgICAgICAgICAgIGVzY2FwZWQgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0ICs9IGMxMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgfSkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZhdWx0QDIuMC4xL25vZGVfbW9kdWxlcy9mYXVsdC9pbmRleC5qcwpmdW5jdGlvbiBjcmVhdGU1KENvbnN0cnVjdG9yKSB7CiAgRm9ybWF0dGVkRXJyb3IuZGlzcGxheU5hbWUgPSBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCBDb25zdHJ1Y3Rvci5uYW1lOwogIHJldHVybiBGb3JtYXR0ZWRFcnJvcjsKICBmdW5jdGlvbiBGb3JtYXR0ZWRFcnJvcihmb3JtYXQyLCAuLi52YWx1ZXMpIHsKICAgIGNvbnN0IHJlYXNvbiA9IGZvcm1hdDIgPyAoMCwgaW1wb3J0X2Zvcm1hdDIuZGVmYXVsdCkoZm9ybWF0MiwgLi4udmFsdWVzKSA6IGZvcm1hdDI7CiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHJlYXNvbik7CiAgfQp9CnZhciBpbXBvcnRfZm9ybWF0MiwgZmF1bHQ7CnZhciBpbml0X2ZhdWx0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vZmF1bHRAMi4wLjEvbm9kZV9tb2R1bGVzL2ZhdWx0L2luZGV4LmpzIigpIHsKICAgIGltcG9ydF9mb3JtYXQyID0gX190b0VTTShyZXF1aXJlX2Zvcm1hdCgpLCAxKTsKICAgIGZhdWx0ID0gT2JqZWN0LmFzc2lnbihjcmVhdGU1KEVycm9yKSwgewogICAgICBldmFsOiBjcmVhdGU1KEV2YWxFcnJvciksCiAgICAgIHJhbmdlOiBjcmVhdGU1KFJhbmdlRXJyb3IpLAogICAgICByZWZlcmVuY2U6IGNyZWF0ZTUoUmVmZXJlbmNlRXJyb3IpLAogICAgICBzeW50YXg6IGNyZWF0ZTUoU3ludGF4RXJyb3IpLAogICAgICB0eXBlOiBjcmVhdGU1KFR5cGVFcnJvciksCiAgICAgIHVyaTogY3JlYXRlNShVUklFcnJvcikKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlckAyLjAuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlci9saWIvdG8tbWF0dGVycy5qcwpmdW5jdGlvbiB0b01hdHRlcnMob3B0aW9ucykgewogIGNvbnN0IHJlc3VsdCA9IFtdOwogIGxldCBpbmRleDIgPSAtMTsKICBjb25zdCBwcmVzZXRzT3JNYXR0ZXJzID0gQXJyYXkuaXNBcnJheShvcHRpb25zKSA/IG9wdGlvbnMgOiBvcHRpb25zID8gW29wdGlvbnNdIDogWyJ5YW1sIl07CiAgd2hpbGUgKCsraW5kZXgyIDwgcHJlc2V0c09yTWF0dGVycy5sZW5ndGgpIHsKICAgIHJlc3VsdFtpbmRleDJdID0gbWF0dGVyKHByZXNldHNPck1hdHRlcnNbaW5kZXgyXSk7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gbWF0dGVyKG9wdGlvbjIpIHsKICBsZXQgcmVzdWx0ID0gb3B0aW9uMjsKICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gInN0cmluZyIpIHsKICAgIGlmICghb3duNi5jYWxsKG1hcmtlcnMsIHJlc3VsdCkpIHsKICAgICAgdGhyb3cgZmF1bHQoIk1pc3NpbmcgbWF0dGVyIGRlZmluaXRpb24gZm9yIGAlc2AiLCByZXN1bHQpOwogICAgfQogICAgcmVzdWx0ID0gewogICAgICB0eXBlOiByZXN1bHQsCiAgICAgIG1hcmtlcjogbWFya2Vyc1tyZXN1bHRdCiAgICB9OwogIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHsKICAgIHRocm93IGZhdWx0KCJFeHBlY3RlZCBtYXR0ZXIgdG8gYmUgYW4gb2JqZWN0LCBub3QgYCVqYCIsIHJlc3VsdCk7CiAgfQogIGlmICghb3duNi5jYWxsKHJlc3VsdCwgInR5cGUiKSkgewogICAgdGhyb3cgZmF1bHQoIk1pc3NpbmcgYHR5cGVgIGluIG1hdHRlciBgJWpgIiwgcmVzdWx0KTsKICB9CiAgaWYgKCFvd242LmNhbGwocmVzdWx0LCAiZmVuY2UiKSAmJiAhb3duNi5jYWxsKHJlc3VsdCwgIm1hcmtlciIpKSB7CiAgICB0aHJvdyBmYXVsdCgiTWlzc2luZyBgbWFya2VyYCBvciBgZmVuY2VgIGluIG1hdHRlciBgJWpgIiwgcmVzdWx0KTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQp2YXIgb3duNiwgbWFya2VyczsKdmFyIGluaXRfdG9fbWF0dGVycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZnJvbnRtYXR0ZXJAMi4wLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZnJvbnRtYXR0ZXIvbGliL3RvLW1hdHRlcnMuanMiKCkgewogICAgaW5pdF9mYXVsdCgpOwogICAgb3duNiA9IHt9Lmhhc093blByb3BlcnR5OwogICAgbWFya2VycyA9IHsKICAgICAgeWFtbDogIi0iLAogICAgICB0b21sOiAiKyIKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWZyb250bWF0dGVyQDIuMC4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWZyb250bWF0dGVyL2xpYi9zeW50YXguanMKZnVuY3Rpb24gZnJvbnRtYXR0ZXIob3B0aW9ucykgewogIGNvbnN0IG1hdHRlcnMgPSB0b01hdHRlcnMob3B0aW9ucyk7CiAgY29uc3QgZmxvdzMgPSB7fTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgbWF0dGVycy5sZW5ndGgpIHsKICAgIGNvbnN0IG1hdHRlcjIgPSBtYXR0ZXJzW2luZGV4Ml07CiAgICBjb25zdCBjb2RlNCA9IGZlbmNlKG1hdHRlcjIsICJvcGVuIikuY2hhckNvZGVBdCgwKTsKICAgIGNvbnN0IGNvbnN0cnVjdCA9IGNyZWF0ZUNvbnN0cnVjdChtYXR0ZXIyKTsKICAgIGNvbnN0IGV4aXN0aW5nID0gZmxvdzNbY29kZTRdOwogICAgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmcpKSB7CiAgICAgIGV4aXN0aW5nLnB1c2goY29uc3RydWN0KTsKICAgIH0gZWxzZSB7CiAgICAgIGZsb3czW2NvZGU0XSA9IFtjb25zdHJ1Y3RdOwogICAgfQogIH0KICByZXR1cm4gewogICAgZmxvdzogZmxvdzMKICB9Owp9CmZ1bmN0aW9uIGNyZWF0ZUNvbnN0cnVjdChtYXR0ZXIyKSB7CiAgY29uc3QgYW55d2hlcmUgPSBtYXR0ZXIyLmFueXdoZXJlOwogIGNvbnN0IGZyb250bWF0dGVyVHlwZSA9ICgKICAgIC8qKiBAdHlwZSB7VG9rZW5UeXBlfSAqLwogICAgbWF0dGVyMi50eXBlCiAgKTsKICBjb25zdCBmZW5jZVR5cGUgPSAoCiAgICAvKiogQHR5cGUge1Rva2VuVHlwZX0gKi8KICAgIGZyb250bWF0dGVyVHlwZSArICJGZW5jZSIKICApOwogIGNvbnN0IHNlcXVlbmNlVHlwZSA9ICgKICAgIC8qKiBAdHlwZSB7VG9rZW5UeXBlfSAqLwogICAgZmVuY2VUeXBlICsgIlNlcXVlbmNlIgogICk7CiAgY29uc3QgdmFsdWVUeXBlID0gKAogICAgLyoqIEB0eXBlIHtUb2tlblR5cGV9ICovCiAgICBmcm9udG1hdHRlclR5cGUgKyAiVmFsdWUiCiAgKTsKICBjb25zdCBjbG9zaW5nRmVuY2VDb25zdHJ1Y3QgPSB7CiAgICB0b2tlbml6ZTogdG9rZW5pemVDbG9zaW5nRmVuY2UsCiAgICBwYXJ0aWFsOiB0cnVlCiAgfTsKICBsZXQgYnVmZmVyMjsKICBsZXQgYnVmZmVySW5kZXggPSAwOwogIHJldHVybiB7CiAgICB0b2tlbml6ZTogdG9rZW5pemVGcm9udG1hdHRlciwKICAgIGNvbmNyZXRlOiB0cnVlCiAgfTsKICBmdW5jdGlvbiB0b2tlbml6ZUZyb250bWF0dGVyKGVmZmVjdHMsIG9rMywgbm9rKSB7CiAgICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgICByZXR1cm4gc3RhcnQ7CiAgICBmdW5jdGlvbiBzdGFydChjb2RlNCkgewogICAgICBjb25zdCBwb3NpdGlvbjMgPSBzZWxmMi5ub3coKTsKICAgICAgaWYgKAogICAgICAgIC8vIEluZGVudCBub3QgYWxsb3dlZC4KICAgICAgICBwb3NpdGlvbjMuY29sdW1uID09PSAxICYmIC8vIE5vcm1hbGx5LCBvbmx5IGFsbG93ZWQgaW4gZmlyc3QgbGluZS4KICAgICAgICAocG9zaXRpb24zLmxpbmUgPT09IDEgfHwgYW55d2hlcmUpCiAgICAgICkgewogICAgICAgIGJ1ZmZlcjIgPSBmZW5jZShtYXR0ZXIyLCAib3BlbiIpOwogICAgICAgIGJ1ZmZlckluZGV4ID0gMDsKICAgICAgICBpZiAoY29kZTQgPT09IGJ1ZmZlcjIuY2hhckNvZGVBdChidWZmZXJJbmRleCkpIHsKICAgICAgICAgIGVmZmVjdHMuZW50ZXIoZnJvbnRtYXR0ZXJUeXBlKTsKICAgICAgICAgIGVmZmVjdHMuZW50ZXIoZmVuY2VUeXBlKTsKICAgICAgICAgIGVmZmVjdHMuZW50ZXIoc2VxdWVuY2VUeXBlKTsKICAgICAgICAgIHJldHVybiBvcGVuU2VxdWVuY2UoY29kZTQpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbm9rKGNvZGU0KTsKICAgIH0KICAgIGZ1bmN0aW9uIG9wZW5TZXF1ZW5jZShjb2RlNCkgewogICAgICBpZiAoYnVmZmVySW5kZXggPT09IGJ1ZmZlcjIubGVuZ3RoKSB7CiAgICAgICAgZWZmZWN0cy5leGl0KHNlcXVlbmNlVHlwZSk7CiAgICAgICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZTQpKSB7CiAgICAgICAgICBlZmZlY3RzLmVudGVyKCJ3aGl0ZXNwYWNlIik7CiAgICAgICAgICByZXR1cm4gb3BlblNlcXVlbmNlV2hpdGVzcGFjZShjb2RlNCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvcGVuQWZ0ZXIoY29kZTQpOwogICAgICB9CiAgICAgIGlmIChjb2RlNCA9PT0gYnVmZmVyMi5jaGFyQ29kZUF0KGJ1ZmZlckluZGV4KyspKSB7CiAgICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGU0KTsKICAgICAgICByZXR1cm4gb3BlblNlcXVlbmNlOwogICAgICB9CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZnVuY3Rpb24gb3BlblNlcXVlbmNlV2hpdGVzcGFjZShjb2RlNCkgewogICAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIHJldHVybiBvcGVuU2VxdWVuY2VXaGl0ZXNwYWNlOwogICAgICB9CiAgICAgIGVmZmVjdHMuZXhpdCgid2hpdGVzcGFjZSIpOwogICAgICByZXR1cm4gb3BlbkFmdGVyKGNvZGU0KTsKICAgIH0KICAgIGZ1bmN0aW9uIG9wZW5BZnRlcihjb2RlNCkgewogICAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICAgIGVmZmVjdHMuZXhpdChmZW5jZVR5cGUpOwogICAgICAgIGVmZmVjdHMuZW50ZXIoImxpbmVFbmRpbmciKTsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIGVmZmVjdHMuZXhpdCgibGluZUVuZGluZyIpOwogICAgICAgIGJ1ZmZlcjIgPSBmZW5jZShtYXR0ZXIyLCAiY2xvc2UiKTsKICAgICAgICBidWZmZXJJbmRleCA9IDA7CiAgICAgICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChjbG9zaW5nRmVuY2VDb25zdHJ1Y3QsIGFmdGVyLCBjb250ZW50U3RhcnQpOwogICAgICB9CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZnVuY3Rpb24gY29udGVudFN0YXJ0KGNvZGU0KSB7CiAgICAgIGlmIChjb2RlNCA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZTQpKSB7CiAgICAgICAgcmV0dXJuIGNvbnRlbnRFbmQoY29kZTQpOwogICAgICB9CiAgICAgIGVmZmVjdHMuZW50ZXIodmFsdWVUeXBlKTsKICAgICAgcmV0dXJuIGNvbnRlbnRJbnNpZGUoY29kZTQpOwogICAgfQogICAgZnVuY3Rpb24gY29udGVudEluc2lkZShjb2RlNCkgewogICAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICAgIGVmZmVjdHMuZXhpdCh2YWx1ZVR5cGUpOwogICAgICAgIHJldHVybiBjb250ZW50RW5kKGNvZGU0KTsKICAgICAgfQogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICByZXR1cm4gY29udGVudEluc2lkZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnRlbnRFbmQoY29kZTQpIHsKICAgICAgaWYgKGNvZGU0ID09PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICAgIH0KICAgICAgZWZmZWN0cy5lbnRlcigibGluZUVuZGluZyIpOwogICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICBlZmZlY3RzLmV4aXQoImxpbmVFbmRpbmciKTsKICAgICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChjbG9zaW5nRmVuY2VDb25zdHJ1Y3QsIGFmdGVyLCBjb250ZW50U3RhcnQpOwogICAgfQogICAgZnVuY3Rpb24gYWZ0ZXIoY29kZTQpIHsKICAgICAgZWZmZWN0cy5leGl0KGZyb250bWF0dGVyVHlwZSk7CiAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgfQogIH0KICBmdW5jdGlvbiB0b2tlbml6ZUNsb3NpbmdGZW5jZShlZmZlY3RzLCBvazMsIG5vaykgewogICAgbGV0IGJ1ZmZlckluZGV4MiA9IDA7CiAgICByZXR1cm4gY2xvc2VTdGFydDsKICAgIGZ1bmN0aW9uIGNsb3NlU3RhcnQoY29kZTQpIHsKICAgICAgaWYgKGNvZGU0ID09PSBidWZmZXIyLmNoYXJDb2RlQXQoYnVmZmVySW5kZXgyKSkgewogICAgICAgIGVmZmVjdHMuZW50ZXIoZmVuY2VUeXBlKTsKICAgICAgICBlZmZlY3RzLmVudGVyKHNlcXVlbmNlVHlwZSk7CiAgICAgICAgcmV0dXJuIGNsb3NlU2VxdWVuY2UoY29kZTQpOwogICAgICB9CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogICAgZnVuY3Rpb24gY2xvc2VTZXF1ZW5jZShjb2RlNCkgewogICAgICBpZiAoYnVmZmVySW5kZXgyID09PSBidWZmZXIyLmxlbmd0aCkgewogICAgICAgIGVmZmVjdHMuZXhpdChzZXF1ZW5jZVR5cGUpOwogICAgICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGU0KSkgewogICAgICAgICAgZWZmZWN0cy5lbnRlcigid2hpdGVzcGFjZSIpOwogICAgICAgICAgcmV0dXJuIGNsb3NlU2VxdWVuY2VXaGl0ZXNwYWNlKGNvZGU0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNsb3NlQWZ0ZXIoY29kZTQpOwogICAgICB9CiAgICAgIGlmIChjb2RlNCA9PT0gYnVmZmVyMi5jaGFyQ29kZUF0KGJ1ZmZlckluZGV4MisrKSkgewogICAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlNCk7CiAgICAgICAgcmV0dXJuIGNsb3NlU2VxdWVuY2U7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vayhjb2RlNCk7CiAgICB9CiAgICBmdW5jdGlvbiBjbG9zZVNlcXVlbmNlV2hpdGVzcGFjZShjb2RlNCkgewogICAgICBpZiAobWFya2Rvd25TcGFjZShjb2RlNCkpIHsKICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZTQpOwogICAgICAgIHJldHVybiBjbG9zZVNlcXVlbmNlV2hpdGVzcGFjZTsKICAgICAgfQogICAgICBlZmZlY3RzLmV4aXQoIndoaXRlc3BhY2UiKTsKICAgICAgcmV0dXJuIGNsb3NlQWZ0ZXIoY29kZTQpOwogICAgfQogICAgZnVuY3Rpb24gY2xvc2VBZnRlcihjb2RlNCkgewogICAgICBpZiAoY29kZTQgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGU0KSkgewogICAgICAgIGVmZmVjdHMuZXhpdChmZW5jZVR5cGUpOwogICAgICAgIHJldHVybiBvazMoY29kZTQpOwogICAgICB9CiAgICAgIHJldHVybiBub2soY29kZTQpOwogICAgfQogIH0KfQpmdW5jdGlvbiBmZW5jZShtYXR0ZXIyLCBwcm9wKSB7CiAgcmV0dXJuIG1hdHRlcjIubWFya2VyID8gcGljayhtYXR0ZXIyLm1hcmtlciwgcHJvcCkucmVwZWF0KDMpIDogKAogICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogVGhleeKAmXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KICAgIHBpY2sobWF0dGVyMi5mZW5jZSwgcHJvcCkKICApOwp9CmZ1bmN0aW9uIHBpY2soc2NoZW1hLCBwcm9wKSB7CiAgcmV0dXJuIHR5cGVvZiBzY2hlbWEgPT09ICJzdHJpbmciID8gc2NoZW1hIDogc2NoZW1hW3Byb3BdOwp9CnZhciBpbml0X3N5bnRheDYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9taWNyb21hcmstZXh0ZW5zaW9uLWZyb250bWF0dGVyQDIuMC4wL25vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWZyb250bWF0dGVyL2xpYi9zeW50YXguanMiKCkgewogICAgaW5pdF9taWNyb21hcmtfdXRpbF9jaGFyYWN0ZXIoKTsKICAgIGluaXRfdG9fbWF0dGVycygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlckAyLjAuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlci9saWIvaHRtbC5qcwp2YXIgaW5pdF9odG1sNyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21pY3JvbWFyay1leHRlbnNpb24tZnJvbnRtYXR0ZXJAMi4wLjAvbm9kZV9tb2R1bGVzL21pY3JvbWFyay1leHRlbnNpb24tZnJvbnRtYXR0ZXIvbGliL2h0bWwuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlckAyLjAuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlci9pbmRleC5qcwp2YXIgaW5pdF9taWNyb21hcmtfZXh0ZW5zaW9uX2Zyb250bWF0dGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlckAyLjAuMC9ub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1mcm9udG1hdHRlci9pbmRleC5qcyIoKSB7CiAgICBpbml0X3N5bnRheDYoKTsKICAgIGluaXRfaHRtbDcoKTsKICAgIGluaXRfdG9fbWF0dGVycygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC1mcm9udG1hdHRlckAyLjAuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1mcm9udG1hdHRlci9saWIvaW5kZXguanMKZnVuY3Rpb24gZnJvbnRtYXR0ZXJGcm9tTWFya2Rvd24ob3B0aW9ucykgewogIGNvbnN0IG1hdHRlcnMgPSB0b01hdHRlcnMob3B0aW9ucyk7CiAgY29uc3QgZW50ZXIgPSB7fTsKICBjb25zdCBleGl0MyA9IHt9OwogIGxldCBpbmRleDIgPSAtMTsKICB3aGlsZSAoKytpbmRleDIgPCBtYXR0ZXJzLmxlbmd0aCkgewogICAgY29uc3QgbWF0dGVyMiA9IG1hdHRlcnNbaW5kZXgyXTsKICAgIGVudGVyW21hdHRlcjIudHlwZV0gPSBvcGVuZXIobWF0dGVyMik7CiAgICBleGl0M1ttYXR0ZXIyLnR5cGVdID0gY2xvc2U2OwogICAgZXhpdDNbbWF0dGVyMi50eXBlICsgIlZhbHVlIl0gPSB2YWx1ZTsKICB9CiAgcmV0dXJuIHsgZW50ZXIsIGV4aXQ6IGV4aXQzIH07Cn0KZnVuY3Rpb24gb3BlbmVyKG1hdHRlcjIpIHsKICByZXR1cm4gb3BlbjsKICBmdW5jdGlvbiBvcGVuKHRva2VuKSB7CiAgICB0aGlzLmVudGVyKHsgdHlwZTogbWF0dGVyMi50eXBlLCB2YWx1ZTogIiIgfSwgdG9rZW4pOwogICAgdGhpcy5idWZmZXIoKTsKICB9Cn0KZnVuY3Rpb24gY2xvc2U2KHRva2VuKSB7CiAgY29uc3QgZGF0YSA9IHRoaXMucmVzdW1lKCk7CiAgY29uc3Qgbm9kZTIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07CiAgb2soInZhbHVlIiBpbiBub2RlMik7CiAgdGhpcy5leGl0KHRva2VuKTsKICBub2RlMi52YWx1ZSA9IGRhdGEucmVwbGFjZSgvXihccj9cbnxccil8KFxyP1xufFxyKSQvZywgIiIpOwp9CmZ1bmN0aW9uIHZhbHVlKHRva2VuKSB7CiAgdGhpcy5jb25maWcuZW50ZXIuZGF0YS5jYWxsKHRoaXMsIHRva2VuKTsKICB0aGlzLmNvbmZpZy5leGl0LmRhdGEuY2FsbCh0aGlzLCB0b2tlbik7Cn0KZnVuY3Rpb24gZnJvbnRtYXR0ZXJUb01hcmtkb3duKG9wdGlvbnMpIHsKICBjb25zdCB1bnNhZmUyID0gW107CiAgY29uc3QgaGFuZGxlcnMyID0ge307CiAgY29uc3QgbWF0dGVycyA9IHRvTWF0dGVycyhvcHRpb25zKTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgbWF0dGVycy5sZW5ndGgpIHsKICAgIGNvbnN0IG1hdHRlcjIgPSBtYXR0ZXJzW2luZGV4Ml07CiAgICBoYW5kbGVyczJbbWF0dGVyMi50eXBlXSA9IGhhbmRsZXIobWF0dGVyMik7CiAgICBjb25zdCBvcGVuID0gZmVuY2UyKG1hdHRlcjIsICJvcGVuIik7CiAgICB1bnNhZmUyLnB1c2goewogICAgICBhdEJyZWFrOiB0cnVlLAogICAgICBjaGFyYWN0ZXI6IG9wZW4uY2hhckF0KDApLAogICAgICBhZnRlcjogZXNjYXBlU3RyaW5nUmVnZXhwKG9wZW4uY2hhckF0KDEpKQogICAgfSk7CiAgfQogIHJldHVybiB7IHVuc2FmZTogdW5zYWZlMiwgaGFuZGxlcnM6IGhhbmRsZXJzMiB9Owp9CmZ1bmN0aW9uIGhhbmRsZXIobWF0dGVyMikgewogIGNvbnN0IG9wZW4gPSBmZW5jZTIobWF0dGVyMiwgIm9wZW4iKTsKICBjb25zdCBjbG9zZTcgPSBmZW5jZTIobWF0dGVyMiwgImNsb3NlIik7CiAgcmV0dXJuIGhhbmRsZTM7CiAgZnVuY3Rpb24gaGFuZGxlMyhub2RlMikgewogICAgcmV0dXJuIG9wZW4gKyAobm9kZTIudmFsdWUgPyAiXG4iICsgbm9kZTIudmFsdWUgOiAiIikgKyAiXG4iICsgY2xvc2U3OwogIH0KfQpmdW5jdGlvbiBmZW5jZTIobWF0dGVyMiwgcHJvcCkgewogIHJldHVybiBtYXR0ZXIyLm1hcmtlciA/IHBpY2syKG1hdHRlcjIubWFya2VyLCBwcm9wKS5yZXBlYXQoMykgOiAoCiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBUaGV54oCZcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgogICAgcGljazIobWF0dGVyMi5mZW5jZSwgcHJvcCkKICApOwp9CmZ1bmN0aW9uIHBpY2syKHNjaGVtYSwgcHJvcCkgewogIHJldHVybiB0eXBlb2Ygc2NoZW1hID09PSAic3RyaW5nIiA/IHNjaGVtYSA6IHNjaGVtYVtwcm9wXTsKfQp2YXIgaW5pdF9saWIyMyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtZnJvbnRtYXR0ZXJAMi4wLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZnJvbnRtYXR0ZXIvbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfZGVmYXVsdCgpOwogICAgaW5pdF9taWNyb21hcmtfZXh0ZW5zaW9uX2Zyb250bWF0dGVyKCk7CiAgICBpbml0X2VzY2FwZV9zdHJpbmdfcmVnZXhwKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWZyb250bWF0dGVyQDIuMC4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWZyb250bWF0dGVyL2luZGV4LmpzCnZhciBpbml0X21kYXN0X3V0aWxfZnJvbnRtYXR0ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLWZyb250bWF0dGVyQDIuMC4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWZyb250bWF0dGVyL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliMjMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1mcm9udG1hdHRlckA1LjAuMC9ub2RlX21vZHVsZXMvcmVtYXJrLWZyb250bWF0dGVyL2xpYi9pbmRleC5qcwpmdW5jdGlvbiByZW1hcmtGcm9udG1hdHRlcihvcHRpb25zKSB7CiAgY29uc3Qgc2VsZjIgPSAoCiAgICAvKiogQHR5cGUge1Byb2Nlc3Nvcn0gKi8KICAgIHRoaXMKICApOwogIGNvbnN0IHNldHRpbmdzID0gb3B0aW9ucyB8fCBlbXB0eU9wdGlvbnM0OwogIGNvbnN0IGRhdGEgPSBzZWxmMi5kYXRhKCk7CiAgY29uc3QgbWljcm9tYXJrRXh0ZW5zaW9ucyA9IGRhdGEubWljcm9tYXJrRXh0ZW5zaW9ucyB8fCAoZGF0YS5taWNyb21hcmtFeHRlbnNpb25zID0gW10pOwogIGNvbnN0IGZyb21NYXJrZG93bkV4dGVuc2lvbnMgPSBkYXRhLmZyb21NYXJrZG93bkV4dGVuc2lvbnMgfHwgKGRhdGEuZnJvbU1hcmtkb3duRXh0ZW5zaW9ucyA9IFtdKTsKICBjb25zdCB0b01hcmtkb3duRXh0ZW5zaW9ucyA9IGRhdGEudG9NYXJrZG93bkV4dGVuc2lvbnMgfHwgKGRhdGEudG9NYXJrZG93bkV4dGVuc2lvbnMgPSBbXSk7CiAgbWljcm9tYXJrRXh0ZW5zaW9ucy5wdXNoKGZyb250bWF0dGVyKHNldHRpbmdzKSk7CiAgZnJvbU1hcmtkb3duRXh0ZW5zaW9ucy5wdXNoKGZyb250bWF0dGVyRnJvbU1hcmtkb3duKHNldHRpbmdzKSk7CiAgdG9NYXJrZG93bkV4dGVuc2lvbnMucHVzaChmcm9udG1hdHRlclRvTWFya2Rvd24oc2V0dGluZ3MpKTsKfQp2YXIgZW1wdHlPcHRpb25zNDsKdmFyIGluaXRfbGliMjQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstZnJvbnRtYXR0ZXJANS4wLjAvbm9kZV9tb2R1bGVzL3JlbWFyay1mcm9udG1hdHRlci9saWIvaW5kZXguanMiKCkgewogICAgaW5pdF9tZGFzdF91dGlsX2Zyb250bWF0dGVyKCk7CiAgICBpbml0X21pY3JvbWFya19leHRlbnNpb25fZnJvbnRtYXR0ZXIoKTsKICAgIGVtcHR5T3B0aW9uczQgPSAieWFtbCI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstZnJvbnRtYXR0ZXJANS4wLjAvbm9kZV9tb2R1bGVzL3JlbWFyay1mcm9udG1hdHRlci9pbmRleC5qcwp2YXIgaW5pdF9yZW1hcmtfZnJvbnRtYXR0ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstZnJvbnRtYXR0ZXJANS4wLjAvbm9kZV9tb2R1bGVzL3JlbWFyay1mcm9udG1hdHRlci9pbmRleC5qcyIoKSB7CiAgICBpbml0X2xpYjI0KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdW5nYXArc3RydWN0dXJlZC1jbG9uZUAxLjMuMC9ub2RlX21vZHVsZXMvQHVuZ2FwL3N0cnVjdHVyZWQtY2xvbmUvZXNtL3R5cGVzLmpzCnZhciBWT0lELCBQUklNSVRJVkUsIEFSUkFZLCBPQkpFQ1QsIERBVEUsIFJFR0VYUCwgTUFQLCBTRVQsIEVSUk9SLCBCSUdJTlQ7CnZhciBpbml0X3R5cGVzMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B1bmdhcCtzdHJ1Y3R1cmVkLWNsb25lQDEuMy4wL25vZGVfbW9kdWxlcy9AdW5nYXAvc3RydWN0dXJlZC1jbG9uZS9lc20vdHlwZXMuanMiKCkgewogICAgVk9JRCA9IC0xOwogICAgUFJJTUlUSVZFID0gMDsKICAgIEFSUkFZID0gMTsKICAgIE9CSkVDVCA9IDI7CiAgICBEQVRFID0gMzsKICAgIFJFR0VYUCA9IDQ7CiAgICBNQVAgPSA1OwogICAgU0VUID0gNjsKICAgIEVSUk9SID0gNzsKICAgIEJJR0lOVCA9IDg7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdW5nYXArc3RydWN0dXJlZC1jbG9uZUAxLjMuMC9ub2RlX21vZHVsZXMvQHVuZ2FwL3N0cnVjdHVyZWQtY2xvbmUvZXNtL2Rlc2VyaWFsaXplLmpzCnZhciBlbnYsIGRlc2VyaWFsaXplciwgZGVzZXJpYWxpemU7CnZhciBpbml0X2Rlc2VyaWFsaXplID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHVuZ2FwK3N0cnVjdHVyZWQtY2xvbmVAMS4zLjAvbm9kZV9tb2R1bGVzL0B1bmdhcC9zdHJ1Y3R1cmVkLWNsb25lL2VzbS9kZXNlcmlhbGl6ZS5qcyIoKSB7CiAgICBpbml0X3R5cGVzMigpOwogICAgZW52ID0gdHlwZW9mIHNlbGYgPT09ICJvYmplY3QiID8gc2VsZiA6IGdsb2JhbFRoaXM7CiAgICBkZXNlcmlhbGl6ZXIgPSAoJDQsIF81KSA9PiB7CiAgICAgIGNvbnN0IGFzID0gKG91dCwgaW5kZXgyKSA9PiB7CiAgICAgICAgJDQuc2V0KGluZGV4Miwgb3V0KTsKICAgICAgICByZXR1cm4gb3V0OwogICAgICB9OwogICAgICBjb25zdCB1bnBhaXIgPSAoaW5kZXgyKSA9PiB7CiAgICAgICAgaWYgKCQ0LmhhcyhpbmRleDIpKQogICAgICAgICAgcmV0dXJuICQ0LmdldChpbmRleDIpOwogICAgICAgIGNvbnN0IFt0eXBlNSwgdmFsdWUyXSA9IF81W2luZGV4Ml07CiAgICAgICAgc3dpdGNoICh0eXBlNSkgewogICAgICAgICAgY2FzZSBQUklNSVRJVkU6CiAgICAgICAgICBjYXNlIFZPSUQ6CiAgICAgICAgICAgIHJldHVybiBhcyh2YWx1ZTIsIGluZGV4Mik7CiAgICAgICAgICBjYXNlIEFSUkFZOiB7CiAgICAgICAgICAgIGNvbnN0IGFyciA9IGFzKFtdLCBpbmRleDIpOwogICAgICAgICAgICBmb3IgKGNvbnN0IGluZGV4MyBvZiB2YWx1ZTIpCiAgICAgICAgICAgICAgYXJyLnB1c2godW5wYWlyKGluZGV4MykpOwogICAgICAgICAgICByZXR1cm4gYXJyOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBPQkpFQ1Q6IHsKICAgICAgICAgICAgY29uc3Qgb2JqZWN0ID0gYXMoe30sIGluZGV4Mik7CiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleTIsIGluZGV4M10gb2YgdmFsdWUyKQogICAgICAgICAgICAgIG9iamVjdFt1bnBhaXIoa2V5MildID0gdW5wYWlyKGluZGV4Myk7CiAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIERBVEU6CiAgICAgICAgICAgIHJldHVybiBhcyhuZXcgRGF0ZSh2YWx1ZTIpLCBpbmRleDIpOwogICAgICAgICAgY2FzZSBSRUdFWFA6IHsKICAgICAgICAgICAgY29uc3QgeyBzb3VyY2UsIGZsYWdzIH0gPSB2YWx1ZTI7CiAgICAgICAgICAgIHJldHVybiBhcyhuZXcgUmVnRXhwKHNvdXJjZSwgZmxhZ3MpLCBpbmRleDIpOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBNQVA6IHsKICAgICAgICAgICAgY29uc3QgbWFwNyA9IGFzKC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksIGluZGV4Mik7CiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleTIsIGluZGV4M10gb2YgdmFsdWUyKQogICAgICAgICAgICAgIG1hcDcuc2V0KHVucGFpcihrZXkyKSwgdW5wYWlyKGluZGV4MykpOwogICAgICAgICAgICByZXR1cm4gbWFwNzsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgU0VUOiB7CiAgICAgICAgICAgIGNvbnN0IHNldDMgPSBhcygvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCBpbmRleDIpOwogICAgICAgICAgICBmb3IgKGNvbnN0IGluZGV4MyBvZiB2YWx1ZTIpCiAgICAgICAgICAgICAgc2V0My5hZGQodW5wYWlyKGluZGV4MykpOwogICAgICAgICAgICByZXR1cm4gc2V0MzsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgRVJST1I6IHsKICAgICAgICAgICAgY29uc3QgeyBuYW1lLCBtZXNzYWdlOiBtZXNzYWdlMiB9ID0gdmFsdWUyOwogICAgICAgICAgICByZXR1cm4gYXMobmV3IGVudltuYW1lXShtZXNzYWdlMiksIGluZGV4Mik7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIEJJR0lOVDoKICAgICAgICAgICAgcmV0dXJuIGFzKEJpZ0ludCh2YWx1ZTIpLCBpbmRleDIpOwogICAgICAgICAgY2FzZSAiQmlnSW50IjoKICAgICAgICAgICAgcmV0dXJuIGFzKE9iamVjdChCaWdJbnQodmFsdWUyKSksIGluZGV4Mik7CiAgICAgICAgICBjYXNlICJBcnJheUJ1ZmZlciI6CiAgICAgICAgICAgIHJldHVybiBhcyhuZXcgVWludDhBcnJheSh2YWx1ZTIpLmJ1ZmZlciwgdmFsdWUyKTsKICAgICAgICAgIGNhc2UgIkRhdGFWaWV3IjogewogICAgICAgICAgICBjb25zdCB7IGJ1ZmZlcjogYnVmZmVyMiB9ID0gbmV3IFVpbnQ4QXJyYXkodmFsdWUyKTsKICAgICAgICAgICAgcmV0dXJuIGFzKG5ldyBEYXRhVmlldyhidWZmZXIyKSwgdmFsdWUyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFzKG5ldyBlbnZbdHlwZTVdKHZhbHVlMiksIGluZGV4Mik7CiAgICAgIH07CiAgICAgIHJldHVybiB1bnBhaXI7CiAgICB9OwogICAgZGVzZXJpYWxpemUgPSAoc2VyaWFsaXplZCkgPT4gZGVzZXJpYWxpemVyKC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksIHNlcmlhbGl6ZWQpKDApOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHVuZ2FwK3N0cnVjdHVyZWQtY2xvbmVAMS4zLjAvbm9kZV9tb2R1bGVzL0B1bmdhcC9zdHJ1Y3R1cmVkLWNsb25lL2VzbS9zZXJpYWxpemUuanMKdmFyIEVNUFRZMiwgdG9TdHJpbmcyLCBrZXlzLCB0eXBlT2YsIHNob3VsZFNraXAsIHNlcmlhbGl6ZXIsIHNlcmlhbGl6ZTI7CnZhciBpbml0X3NlcmlhbGl6ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B1bmdhcCtzdHJ1Y3R1cmVkLWNsb25lQDEuMy4wL25vZGVfbW9kdWxlcy9AdW5nYXAvc3RydWN0dXJlZC1jbG9uZS9lc20vc2VyaWFsaXplLmpzIigpIHsKICAgIGluaXRfdHlwZXMyKCk7CiAgICBFTVBUWTIgPSAiIjsKICAgICh7IHRvU3RyaW5nOiB0b1N0cmluZzIgfSA9IHt9KTsKICAgICh7IGtleXMgfSA9IE9iamVjdCk7CiAgICB0eXBlT2YgPSAodmFsdWUyKSA9PiB7CiAgICAgIGNvbnN0IHR5cGU1ID0gdHlwZW9mIHZhbHVlMjsKICAgICAgaWYgKHR5cGU1ICE9PSAib2JqZWN0IiB8fCAhdmFsdWUyKQogICAgICAgIHJldHVybiBbUFJJTUlUSVZFLCB0eXBlNV07CiAgICAgIGNvbnN0IGFzU3RyaW5nID0gdG9TdHJpbmcyLmNhbGwodmFsdWUyKS5zbGljZSg4LCAtMSk7CiAgICAgIHN3aXRjaCAoYXNTdHJpbmcpIHsKICAgICAgICBjYXNlICJBcnJheSI6CiAgICAgICAgICByZXR1cm4gW0FSUkFZLCBFTVBUWTJdOwogICAgICAgIGNhc2UgIk9iamVjdCI6CiAgICAgICAgICByZXR1cm4gW09CSkVDVCwgRU1QVFkyXTsKICAgICAgICBjYXNlICJEYXRlIjoKICAgICAgICAgIHJldHVybiBbREFURSwgRU1QVFkyXTsKICAgICAgICBjYXNlICJSZWdFeHAiOgogICAgICAgICAgcmV0dXJuIFtSRUdFWFAsIEVNUFRZMl07CiAgICAgICAgY2FzZSAiTWFwIjoKICAgICAgICAgIHJldHVybiBbTUFQLCBFTVBUWTJdOwogICAgICAgIGNhc2UgIlNldCI6CiAgICAgICAgICByZXR1cm4gW1NFVCwgRU1QVFkyXTsKICAgICAgICBjYXNlICJEYXRhVmlldyI6CiAgICAgICAgICByZXR1cm4gW0FSUkFZLCBhc1N0cmluZ107CiAgICAgIH0KICAgICAgaWYgKGFzU3RyaW5nLmluY2x1ZGVzKCJBcnJheSIpKQogICAgICAgIHJldHVybiBbQVJSQVksIGFzU3RyaW5nXTsKICAgICAgaWYgKGFzU3RyaW5nLmluY2x1ZGVzKCJFcnJvciIpKQogICAgICAgIHJldHVybiBbRVJST1IsIGFzU3RyaW5nXTsKICAgICAgcmV0dXJuIFtPQkpFQ1QsIGFzU3RyaW5nXTsKICAgIH07CiAgICBzaG91bGRTa2lwID0gKFtUWVBFLCB0eXBlNV0pID0+IFRZUEUgPT09IFBSSU1JVElWRSAmJiAodHlwZTUgPT09ICJmdW5jdGlvbiIgfHwgdHlwZTUgPT09ICJzeW1ib2wiKTsKICAgIHNlcmlhbGl6ZXIgPSAoc3RyaWN0LCBqc29uLCAkNCwgXzUpID0+IHsKICAgICAgY29uc3QgYXMgPSAob3V0LCB2YWx1ZTIpID0+IHsKICAgICAgICBjb25zdCBpbmRleDIgPSBfNS5wdXNoKG91dCkgLSAxOwogICAgICAgICQ0LnNldCh2YWx1ZTIsIGluZGV4Mik7CiAgICAgICAgcmV0dXJuIGluZGV4MjsKICAgICAgfTsKICAgICAgY29uc3QgcGFpciA9ICh2YWx1ZTIpID0+IHsKICAgICAgICBpZiAoJDQuaGFzKHZhbHVlMikpCiAgICAgICAgICByZXR1cm4gJDQuZ2V0KHZhbHVlMik7CiAgICAgICAgbGV0IFtUWVBFLCB0eXBlNV0gPSB0eXBlT2YodmFsdWUyKTsKICAgICAgICBzd2l0Y2ggKFRZUEUpIHsKICAgICAgICAgIGNhc2UgUFJJTUlUSVZFOiB7CiAgICAgICAgICAgIGxldCBlbnRyeSA9IHZhbHVlMjsKICAgICAgICAgICAgc3dpdGNoICh0eXBlNSkgewogICAgICAgICAgICAgIGNhc2UgImJpZ2ludCI6CiAgICAgICAgICAgICAgICBUWVBFID0gQklHSU5UOwogICAgICAgICAgICAgICAgZW50cnkgPSB2YWx1ZTIudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgImZ1bmN0aW9uIjoKICAgICAgICAgICAgICBjYXNlICJzeW1ib2wiOgogICAgICAgICAgICAgICAgaWYgKHN0cmljdCkKICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigidW5hYmxlIHRvIHNlcmlhbGl6ZSAiICsgdHlwZTUpOwogICAgICAgICAgICAgICAgZW50cnkgPSBudWxsOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAidW5kZWZpbmVkIjoKICAgICAgICAgICAgICAgIHJldHVybiBhcyhbVk9JRF0sIHZhbHVlMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGFzKFtUWVBFLCBlbnRyeV0sIHZhbHVlMik7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIEFSUkFZOiB7CiAgICAgICAgICAgIGlmICh0eXBlNSkgewogICAgICAgICAgICAgIGxldCBzcHJlYWQgPSB2YWx1ZTI7CiAgICAgICAgICAgICAgaWYgKHR5cGU1ID09PSAiRGF0YVZpZXciKSB7CiAgICAgICAgICAgICAgICBzcHJlYWQgPSBuZXcgVWludDhBcnJheSh2YWx1ZTIuYnVmZmVyKTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGU1ID09PSAiQXJyYXlCdWZmZXIiKSB7CiAgICAgICAgICAgICAgICBzcHJlYWQgPSBuZXcgVWludDhBcnJheSh2YWx1ZTIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gYXMoW3R5cGU1LCBbLi4uc3ByZWFkXV0sIHZhbHVlMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgYXJyID0gW107CiAgICAgICAgICAgIGNvbnN0IGluZGV4MiA9IGFzKFtUWVBFLCBhcnJdLCB2YWx1ZTIpOwogICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHZhbHVlMikKICAgICAgICAgICAgICBhcnIucHVzaChwYWlyKGVudHJ5KSk7CiAgICAgICAgICAgIHJldHVybiBpbmRleDI7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIE9CSkVDVDogewogICAgICAgICAgICBpZiAodHlwZTUpIHsKICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGU1KSB7CiAgICAgICAgICAgICAgICBjYXNlICJCaWdJbnQiOgogICAgICAgICAgICAgICAgICByZXR1cm4gYXMoW3R5cGU1LCB2YWx1ZTIudG9TdHJpbmcoKV0sIHZhbHVlMik7CiAgICAgICAgICAgICAgICBjYXNlICJCb29sZWFuIjoKICAgICAgICAgICAgICAgIGNhc2UgIk51bWJlciI6CiAgICAgICAgICAgICAgICBjYXNlICJTdHJpbmciOgogICAgICAgICAgICAgICAgICByZXR1cm4gYXMoW3R5cGU1LCB2YWx1ZTIudmFsdWVPZigpXSwgdmFsdWUyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGpzb24gJiYgInRvSlNPTiIgaW4gdmFsdWUyKQogICAgICAgICAgICAgIHJldHVybiBwYWlyKHZhbHVlMi50b0pTT04oKSk7CiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBbXTsKICAgICAgICAgICAgY29uc3QgaW5kZXgyID0gYXMoW1RZUEUsIGVudHJpZXNdLCB2YWx1ZTIpOwogICAgICAgICAgICBmb3IgKGNvbnN0IGtleTIgb2Yga2V5cyh2YWx1ZTIpKSB7CiAgICAgICAgICAgICAgaWYgKHN0cmljdCB8fCAhc2hvdWxkU2tpcCh0eXBlT2YodmFsdWUyW2tleTJdKSkpCiAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goW3BhaXIoa2V5MiksIHBhaXIodmFsdWUyW2tleTJdKV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpbmRleDI7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIERBVEU6CiAgICAgICAgICAgIHJldHVybiBhcyhbVFlQRSwgdmFsdWUyLnRvSVNPU3RyaW5nKCldLCB2YWx1ZTIpOwogICAgICAgICAgY2FzZSBSRUdFWFA6IHsKICAgICAgICAgICAgY29uc3QgeyBzb3VyY2UsIGZsYWdzIH0gPSB2YWx1ZTI7CiAgICAgICAgICAgIHJldHVybiBhcyhbVFlQRSwgeyBzb3VyY2UsIGZsYWdzIH1dLCB2YWx1ZTIpOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBNQVA6IHsKICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IFtdOwogICAgICAgICAgICBjb25zdCBpbmRleDIgPSBhcyhbVFlQRSwgZW50cmllc10sIHZhbHVlMik7CiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleTIsIGVudHJ5XSBvZiB2YWx1ZTIpIHsKICAgICAgICAgICAgICBpZiAoc3RyaWN0IHx8ICEoc2hvdWxkU2tpcCh0eXBlT2Yoa2V5MikpIHx8IHNob3VsZFNraXAodHlwZU9mKGVudHJ5KSkpKQogICAgICAgICAgICAgICAgZW50cmllcy5wdXNoKFtwYWlyKGtleTIpLCBwYWlyKGVudHJ5KV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpbmRleDI7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIFNFVDogewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gW107CiAgICAgICAgICAgIGNvbnN0IGluZGV4MiA9IGFzKFtUWVBFLCBlbnRyaWVzXSwgdmFsdWUyKTsKICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB2YWx1ZTIpIHsKICAgICAgICAgICAgICBpZiAoc3RyaWN0IHx8ICFzaG91bGRTa2lwKHR5cGVPZihlbnRyeSkpKQogICAgICAgICAgICAgICAgZW50cmllcy5wdXNoKHBhaXIoZW50cnkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaW5kZXgyOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCB7IG1lc3NhZ2U6IG1lc3NhZ2UyIH0gPSB2YWx1ZTI7CiAgICAgICAgcmV0dXJuIGFzKFtUWVBFLCB7IG5hbWU6IHR5cGU1LCBtZXNzYWdlOiBtZXNzYWdlMiB9XSwgdmFsdWUyKTsKICAgICAgfTsKICAgICAgcmV0dXJuIHBhaXI7CiAgICB9OwogICAgc2VyaWFsaXplMiA9ICh2YWx1ZTIsIHsganNvbiwgbG9zc3kgfSA9IHt9KSA9PiB7CiAgICAgIGNvbnN0IF81ID0gW107CiAgICAgIHJldHVybiBzZXJpYWxpemVyKCEoanNvbiB8fCBsb3NzeSksICEhanNvbiwgLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgXzUpKHZhbHVlMiksIF81OwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B1bmdhcCtzdHJ1Y3R1cmVkLWNsb25lQDEuMy4wL25vZGVfbW9kdWxlcy9AdW5nYXAvc3RydWN0dXJlZC1jbG9uZS9lc20vaW5kZXguanMKdmFyIGVzbV9kZWZhdWx0Owp2YXIgaW5pdF9lc20gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdW5nYXArc3RydWN0dXJlZC1jbG9uZUAxLjMuMC9ub2RlX21vZHVsZXMvQHVuZ2FwL3N0cnVjdHVyZWQtY2xvbmUvZXNtL2luZGV4LmpzIigpIHsKICAgIGluaXRfZGVzZXJpYWxpemUoKTsKICAgIGluaXRfc2VyaWFsaXplKCk7CiAgICBlc21fZGVmYXVsdCA9IHR5cGVvZiBzdHJ1Y3R1cmVkQ2xvbmUgPT09ICJmdW5jdGlvbiIgPyAoCiAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqLwogICAgICAoYW55LCBvcHRpb25zKSA9PiBvcHRpb25zICYmICgianNvbiIgaW4gb3B0aW9ucyB8fCAibG9zc3kiIGluIG9wdGlvbnMpID8gZGVzZXJpYWxpemUoc2VyaWFsaXplMihhbnksIG9wdGlvbnMpKSA6IHN0cnVjdHVyZWRDbG9uZShhbnkpCiAgICApIDogKGFueSwgb3B0aW9ucykgPT4gZGVzZXJpYWxpemUoc2VyaWFsaXplMihhbnksIG9wdGlvbnMpKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3VuaXN0LXV0aWwtcG9zaXRpb25ANS4wLjAvbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtcG9zaXRpb24vbGliL2luZGV4LmpzCmZ1bmN0aW9uIHBvaW50Myh0eXBlNSkgewogIHJldHVybiBwb2ludDQ7CiAgZnVuY3Rpb24gcG9pbnQ0KG5vZGUyKSB7CiAgICBjb25zdCBwb2ludDUgPSBub2RlMiAmJiBub2RlMi5wb3NpdGlvbiAmJiBub2RlMi5wb3NpdGlvblt0eXBlNV0gfHwge307CiAgICBpZiAodHlwZW9mIHBvaW50NS5saW5lID09PSAibnVtYmVyIiAmJiBwb2ludDUubGluZSA+IDAgJiYgdHlwZW9mIHBvaW50NS5jb2x1bW4gPT09ICJudW1iZXIiICYmIHBvaW50NS5jb2x1bW4gPiAwKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgbGluZTogcG9pbnQ1LmxpbmUsCiAgICAgICAgY29sdW1uOiBwb2ludDUuY29sdW1uLAogICAgICAgIG9mZnNldDogdHlwZW9mIHBvaW50NS5vZmZzZXQgPT09ICJudW1iZXIiICYmIHBvaW50NS5vZmZzZXQgPiAtMSA/IHBvaW50NS5vZmZzZXQgOiB2b2lkIDAKICAgICAgfTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gcG9zaXRpb24yKG5vZGUyKSB7CiAgY29uc3Qgc3RhcnQgPSBwb2ludFN0YXJ0KG5vZGUyKTsKICBjb25zdCBlbmQzID0gcG9pbnRFbmQobm9kZTIpOwogIGlmIChzdGFydCAmJiBlbmQzKSB7CiAgICByZXR1cm4geyBzdGFydCwgZW5kOiBlbmQzIH07CiAgfQp9CnZhciBwb2ludEVuZCwgcG9pbnRTdGFydDsKdmFyIGluaXRfbGliMjUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS91bmlzdC11dGlsLXBvc2l0aW9uQDUuMC4wL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXBvc2l0aW9uL2xpYi9pbmRleC5qcyIoKSB7CiAgICBwb2ludEVuZCA9IHBvaW50MygiZW5kIik7CiAgICBwb2ludFN0YXJ0ID0gcG9pbnQzKCJzdGFydCIpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vdW5pc3QtdXRpbC1wb3NpdGlvbkA1LjAuMC9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC1wb3NpdGlvbi9pbmRleC5qcwp2YXIgaW5pdF91bmlzdF91dGlsX3Bvc2l0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdW5pc3QtdXRpbC1wb3NpdGlvbkA1LjAuMC9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC1wb3NpdGlvbi9pbmRleC5qcyIoKSB7CiAgICBpbml0X2xpYjI1KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtc2FuaXRpemVANS4wLjIvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC1zYW5pdGl6ZS9saWIvc2NoZW1hLmpzCnZhciBhcmlhLCBkZWZhdWx0U2NoZW1hOwp2YXIgaW5pdF9zY2hlbWEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtc2FuaXRpemVANS4wLjIvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC1zYW5pdGl6ZS9saWIvc2NoZW1hLmpzIigpIHsKICAgIGFyaWEgPSBbImFyaWFEZXNjcmliZWRCeSIsICJhcmlhTGFiZWwiLCAiYXJpYUxhYmVsbGVkQnkiXTsKICAgIGRlZmF1bHRTY2hlbWEgPSB7CiAgICAgIGFuY2VzdG9yczogewogICAgICAgIHRib2R5OiBbInRhYmxlIl0sCiAgICAgICAgdGQ6IFsidGFibGUiXSwKICAgICAgICB0aDogWyJ0YWJsZSJdLAogICAgICAgIHRoZWFkOiBbInRhYmxlIl0sCiAgICAgICAgdGZvb3Q6IFsidGFibGUiXSwKICAgICAgICB0cjogWyJ0YWJsZSJdCiAgICAgIH0sCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBhOiBbCiAgICAgICAgICAuLi5hcmlhLAogICAgICAgICAgLy8gTm90ZTogdGhlc2UgMyBhcmUgdXNlZCBieSBHRk0gZm9vdG5vdGVzLCB0aGV5IGRvIHdvcmsgb24gYWxsIGxpbmtzLgogICAgICAgICAgImRhdGFGb290bm90ZUJhY2tyZWYiLAogICAgICAgICAgImRhdGFGb290bm90ZVJlZiIsCiAgICAgICAgICBbImNsYXNzTmFtZSIsICJkYXRhLWZvb3Rub3RlLWJhY2tyZWYiXSwKICAgICAgICAgICJocmVmIgogICAgICAgIF0sCiAgICAgICAgYmxvY2txdW90ZTogWyJjaXRlIl0sCiAgICAgICAgLy8gTm90ZTogdGhpcyBjbGFzcyBpcyBub3Qgbm9ybWFsbHkgYWxsb3dlZCBieSBHSCwgd2hlbiBtYW51YWxseSB3cml0aW5nCiAgICAgICAgLy8gYGNvZGVgIGFzIEhUTUwgaW4gbWFya2Rvd24sIHRoZXkgYWRkcyBpdCBzb21lIG90aGVyIHdheS4KICAgICAgICAvLyBXZSBjYW7igJl0IGRvIHRoYXQsIHNvIHdlIGhhdmUgdG8gYWxsb3cgaXQuCiAgICAgICAgY29kZTogW1siY2xhc3NOYW1lIiwgL15sYW5ndWFnZS0uL11dLAogICAgICAgIGRlbDogWyJjaXRlIl0sCiAgICAgICAgZGl2OiBbIml0ZW1TY29wZSIsICJpdGVtVHlwZSJdLAogICAgICAgIGRsOiBbLi4uYXJpYV0sCiAgICAgICAgLy8gTm90ZTogdGhpcyBpcyB1c2VkIGJ5IEdGTSBmb290bm90ZXMuCiAgICAgICAgaDI6IFtbImNsYXNzTmFtZSIsICJzci1vbmx5Il1dLAogICAgICAgIGltZzogWy4uLmFyaWEsICJsb25nRGVzYyIsICJzcmMiXSwKICAgICAgICAvLyBOb3RlOiBgaW5wdXRgIGlzIG5vdCBub3JtYWxseSBhbGxvd2VkIGJ5IEdILCB3aGVuIG1hbnVhbGx5IHdyaXRpbmcKICAgICAgICAvLyBpdCBpbiBtYXJrZG93biwgdGhleSBhZGQgaXQgZnJvbSB0YXNrbGlzdHMgc29tZSBvdGhlciB3YXkuCiAgICAgICAgLy8gV2UgY2Fu4oCZdCBkbyB0aGF0LCBzbyB3ZSBoYXZlIHRvIGFsbG93IGl0LgogICAgICAgIGlucHV0OiBbCiAgICAgICAgICBbImRpc2FibGVkIiwgdHJ1ZV0sCiAgICAgICAgICBbInR5cGUiLCAiY2hlY2tib3giXQogICAgICAgIF0sCiAgICAgICAgaW5zOiBbImNpdGUiXSwKICAgICAgICAvLyBOb3RlOiB0aGlzIGNsYXNzIGlzIG5vdCBub3JtYWxseSBhbGxvd2VkIGJ5IEdILCB3aGVuIG1hbnVhbGx5IHdyaXRpbmcKICAgICAgICAvLyBgbGlgIGFzIEhUTUwgaW4gbWFya2Rvd24sIHRoZXkgYWRkcyBpdCBzb21lIG90aGVyIHdheS4KICAgICAgICAvLyBXZSBjYW7igJl0IGRvIHRoYXQsIHNvIHdlIGhhdmUgdG8gYWxsb3cgaXQuCiAgICAgICAgbGk6IFtbImNsYXNzTmFtZSIsICJ0YXNrLWxpc3QtaXRlbSJdXSwKICAgICAgICAvLyBOb3RlOiB0aGlzIGNsYXNzIGlzIG5vdCBub3JtYWxseSBhbGxvd2VkIGJ5IEdILCB3aGVuIG1hbnVhbGx5IHdyaXRpbmcKICAgICAgICAvLyBgb2xgIGFzIEhUTUwgaW4gbWFya2Rvd24sIHRoZXkgYWRkcyBpdCBzb21lIG90aGVyIHdheS4KICAgICAgICAvLyBXZSBjYW7igJl0IGRvIHRoYXQsIHNvIHdlIGhhdmUgdG8gYWxsb3cgaXQuCiAgICAgICAgb2w6IFsuLi5hcmlhLCBbImNsYXNzTmFtZSIsICJjb250YWlucy10YXNrLWxpc3QiXV0sCiAgICAgICAgcTogWyJjaXRlIl0sCiAgICAgICAgc2VjdGlvbjogWyJkYXRhRm9vdG5vdGVzIiwgWyJjbGFzc05hbWUiLCAiZm9vdG5vdGVzIl1dLAogICAgICAgIHNvdXJjZTogWyJzcmNTZXQiXSwKICAgICAgICBzdW1tYXJ5OiBbLi4uYXJpYV0sCiAgICAgICAgdGFibGU6IFsuLi5hcmlhXSwKICAgICAgICAvLyBOb3RlOiB0aGlzIGNsYXNzIGlzIG5vdCBub3JtYWxseSBhbGxvd2VkIGJ5IEdILCB3aGVuIG1hbnVhbGx5IHdyaXRpbmcKICAgICAgICAvLyBgb2xgIGFzIEhUTUwgaW4gbWFya2Rvd24sIHRoZXkgYWRkcyBpdCBzb21lIG90aGVyIHdheS4KICAgICAgICAvLyBXZSBjYW7igJl0IGRvIHRoYXQsIHNvIHdlIGhhdmUgdG8gYWxsb3cgaXQuCiAgICAgICAgdWw6IFsuLi5hcmlhLCBbImNsYXNzTmFtZSIsICJjb250YWlucy10YXNrLWxpc3QiXV0sCiAgICAgICAgIioiOiBbCiAgICAgICAgICAiYWJiciIsCiAgICAgICAgICAiYWNjZXB0IiwKICAgICAgICAgICJhY2NlcHRDaGFyc2V0IiwKICAgICAgICAgICJhY2Nlc3NLZXkiLAogICAgICAgICAgImFjdGlvbiIsCiAgICAgICAgICAiYWxpZ24iLAogICAgICAgICAgImFsdCIsCiAgICAgICAgICAiYXhpcyIsCiAgICAgICAgICAiYm9yZGVyIiwKICAgICAgICAgICJjZWxsUGFkZGluZyIsCiAgICAgICAgICAiY2VsbFNwYWNpbmciLAogICAgICAgICAgImNoYXIiLAogICAgICAgICAgImNoYXJPZmYiLAogICAgICAgICAgImNoYXJTZXQiLAogICAgICAgICAgImNoZWNrZWQiLAogICAgICAgICAgImNsZWFyIiwKICAgICAgICAgICJjb2xTcGFuIiwKICAgICAgICAgICJjb2xvciIsCiAgICAgICAgICAiY29scyIsCiAgICAgICAgICAiY29tcGFjdCIsCiAgICAgICAgICAiY29vcmRzIiwKICAgICAgICAgICJkYXRlVGltZSIsCiAgICAgICAgICAiZGlyIiwKICAgICAgICAgIC8vIE5vdGU6IGBkaXNhYmxlZGAgaXMgdGVjaG5pY2FsbHkgYWxsb3dlZCBvbiBhbGwgZWxlbWVudHMgYnkgR0guCiAgICAgICAgICAvLyBCdXQgaXQgaXMgdXNlbGVzcyBvbiBldmVyeXRoaW5nIGV4Y2VwdCBgaW5wdXRgLgogICAgICAgICAgLy8gQmVjYXVzZSBgaW5wdXRgcyBhcmUgbm9ybWFsbHkgbm90IGFsbG93ZWQsIGJ1dCB3ZSBhbGxvdyB0aGVtIGZvcgogICAgICAgICAgLy8gY2hlY2tib3hlcyBkdWUgdG8gdGFza2xpc3RzLCB3ZSBhbGxvdyBgZGlzYWJsZWRgIG9ubHkgdGhlcmUuCiAgICAgICAgICAiZW5jVHlwZSIsCiAgICAgICAgICAiZnJhbWUiLAogICAgICAgICAgImhTcGFjZSIsCiAgICAgICAgICAiaGVhZGVycyIsCiAgICAgICAgICAiaGVpZ2h0IiwKICAgICAgICAgICJocmVmTGFuZyIsCiAgICAgICAgICAiaHRtbEZvciIsCiAgICAgICAgICAiaWQiLAogICAgICAgICAgImlzTWFwIiwKICAgICAgICAgICJpdGVtUHJvcCIsCiAgICAgICAgICAibGFiZWwiLAogICAgICAgICAgImxhbmciLAogICAgICAgICAgIm1heExlbmd0aCIsCiAgICAgICAgICAibWVkaWEiLAogICAgICAgICAgIm1ldGhvZCIsCiAgICAgICAgICAibXVsdGlwbGUiLAogICAgICAgICAgIm5hbWUiLAogICAgICAgICAgIm5vSHJlZiIsCiAgICAgICAgICAibm9TaGFkZSIsCiAgICAgICAgICAibm9XcmFwIiwKICAgICAgICAgICJvcGVuIiwKICAgICAgICAgICJwcm9tcHQiLAogICAgICAgICAgInJlYWRPbmx5IiwKICAgICAgICAgICJyZXYiLAogICAgICAgICAgInJvd1NwYW4iLAogICAgICAgICAgInJvd3MiLAogICAgICAgICAgInJ1bGVzIiwKICAgICAgICAgICJzY29wZSIsCiAgICAgICAgICAic2VsZWN0ZWQiLAogICAgICAgICAgInNoYXBlIiwKICAgICAgICAgICJzaXplIiwKICAgICAgICAgICJzcGFuIiwKICAgICAgICAgICJzdGFydCIsCiAgICAgICAgICAic3VtbWFyeSIsCiAgICAgICAgICAidGFiSW5kZXgiLAogICAgICAgICAgInRpdGxlIiwKICAgICAgICAgICJ1c2VNYXAiLAogICAgICAgICAgInZBbGlnbiIsCiAgICAgICAgICAidmFsdWUiLAogICAgICAgICAgIndpZHRoIgogICAgICAgIF0KICAgICAgfSwKICAgICAgY2xvYmJlcjogWyJhcmlhRGVzY3JpYmVkQnkiLCAiYXJpYUxhYmVsbGVkQnkiLCAiaWQiLCAibmFtZSJdLAogICAgICBjbG9iYmVyUHJlZml4OiAidXNlci1jb250ZW50LSIsCiAgICAgIHByb3RvY29sczogewogICAgICAgIGNpdGU6IFsiaHR0cCIsICJodHRwcyJdLAogICAgICAgIGhyZWY6IFsiaHR0cCIsICJodHRwcyIsICJpcmMiLCAiaXJjcyIsICJtYWlsdG8iLCAieG1wcCJdLAogICAgICAgIGxvbmdEZXNjOiBbImh0dHAiLCAiaHR0cHMiXSwKICAgICAgICBzcmM6IFsiaHR0cCIsICJodHRwcyJdCiAgICAgIH0sCiAgICAgIHJlcXVpcmVkOiB7CiAgICAgICAgaW5wdXQ6IHsgZGlzYWJsZWQ6IHRydWUsIHR5cGU6ICJjaGVja2JveCIgfQogICAgICB9LAogICAgICBzdHJpcDogWyJzY3JpcHQiXSwKICAgICAgdGFnTmFtZXM6IFsKICAgICAgICAiYSIsCiAgICAgICAgImIiLAogICAgICAgICJibG9ja3F1b3RlIiwKICAgICAgICAiYnIiLAogICAgICAgICJjb2RlIiwKICAgICAgICAiZGQiLAogICAgICAgICJkZWwiLAogICAgICAgICJkZXRhaWxzIiwKICAgICAgICAiZGl2IiwKICAgICAgICAiZGwiLAogICAgICAgICJkdCIsCiAgICAgICAgImVtIiwKICAgICAgICAiaDEiLAogICAgICAgICJoMiIsCiAgICAgICAgImgzIiwKICAgICAgICAiaDQiLAogICAgICAgICJoNSIsCiAgICAgICAgImg2IiwKICAgICAgICAiaHIiLAogICAgICAgICJpIiwKICAgICAgICAiaW1nIiwKICAgICAgICAvLyBOb3RlOiBgaW5wdXRgIGlzIG5vdCBub3JtYWxseSBhbGxvd2VkIGJ5IEdILCB3aGVuIG1hbnVhbGx5IHdyaXRpbmcKICAgICAgICAvLyBpdCBpbiBtYXJrZG93biwgdGhleSBhZGQgaXQgZnJvbSB0YXNrbGlzdHMgc29tZSBvdGhlciB3YXkuCiAgICAgICAgLy8gV2UgY2Fu4oCZdCBkbyB0aGF0LCBzbyB3ZSBoYXZlIHRvIGFsbG93IGl0LgogICAgICAgICJpbnB1dCIsCiAgICAgICAgImlucyIsCiAgICAgICAgImtiZCIsCiAgICAgICAgImxpIiwKICAgICAgICAib2wiLAogICAgICAgICJwIiwKICAgICAgICAicGljdHVyZSIsCiAgICAgICAgInByZSIsCiAgICAgICAgInEiLAogICAgICAgICJycCIsCiAgICAgICAgInJ0IiwKICAgICAgICAicnVieSIsCiAgICAgICAgInMiLAogICAgICAgICJzYW1wIiwKICAgICAgICAic2VjdGlvbiIsCiAgICAgICAgInNvdXJjZSIsCiAgICAgICAgInNwYW4iLAogICAgICAgICJzdHJpa2UiLAogICAgICAgICJzdHJvbmciLAogICAgICAgICJzdWIiLAogICAgICAgICJzdW1tYXJ5IiwKICAgICAgICAic3VwIiwKICAgICAgICAidGFibGUiLAogICAgICAgICJ0Ym9keSIsCiAgICAgICAgInRkIiwKICAgICAgICAidGZvb3QiLAogICAgICAgICJ0aCIsCiAgICAgICAgInRoZWFkIiwKICAgICAgICAidHIiLAogICAgICAgICJ0dCIsCiAgICAgICAgInVsIiwKICAgICAgICAidmFyIgogICAgICBdCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXNhbml0aXplQDUuMC4yL25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtc2FuaXRpemUvbGliL2luZGV4LmpzCmZ1bmN0aW9uIHNhbml0aXplKG5vZGUyLCBvcHRpb25zKSB7CiAgbGV0IHJlc3VsdCA9IHsgdHlwZTogInJvb3QiLCBjaGlsZHJlbjogW10gfTsKICBjb25zdCBzdGF0ZTEwID0gewogICAgc2NoZW1hOiBvcHRpb25zID8geyAuLi5kZWZhdWx0U2NoZW1hLCAuLi5vcHRpb25zIH0gOiBkZWZhdWx0U2NoZW1hLAogICAgc3RhY2s6IFtdCiAgfTsKICBjb25zdCByZXBsYWNlNSA9IHRyYW5zZm9ybShzdGF0ZTEwLCBub2RlMik7CiAgaWYgKHJlcGxhY2U1KSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXBsYWNlNSkpIHsKICAgICAgaWYgKHJlcGxhY2U1Lmxlbmd0aCA9PT0gMSkgewogICAgICAgIHJlc3VsdCA9IHJlcGxhY2U1WzBdOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdC5jaGlsZHJlbiA9IHJlcGxhY2U1OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXN1bHQgPSByZXBsYWNlNTsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpmdW5jdGlvbiB0cmFuc2Zvcm0oc3RhdGUxMCwgbm9kZTIpIHsKICBpZiAobm9kZTIgJiYgdHlwZW9mIG5vZGUyID09PSAib2JqZWN0IikgewogICAgY29uc3QgdW5zYWZlMiA9ICgKICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZWFkb25seTx1bmtub3duPj59ICovCiAgICAgIG5vZGUyCiAgICApOwogICAgY29uc3QgdHlwZTUgPSB0eXBlb2YgdW5zYWZlMi50eXBlID09PSAic3RyaW5nIiA/IHVuc2FmZTIudHlwZSA6ICIiOwogICAgc3dpdGNoICh0eXBlNSkgewogICAgICBjYXNlICJjb21tZW50IjogewogICAgICAgIHJldHVybiBjb21tZW50KHN0YXRlMTAsIHVuc2FmZTIpOwogICAgICB9CiAgICAgIGNhc2UgImRvY3R5cGUiOiB7CiAgICAgICAgcmV0dXJuIGRvY3R5cGUoc3RhdGUxMCwgdW5zYWZlMik7CiAgICAgIH0KICAgICAgY2FzZSAiZWxlbWVudCI6IHsKICAgICAgICByZXR1cm4gZWxlbWVudDIoc3RhdGUxMCwgdW5zYWZlMik7CiAgICAgIH0KICAgICAgY2FzZSAicm9vdCI6IHsKICAgICAgICByZXR1cm4gcm9vdDIoc3RhdGUxMCwgdW5zYWZlMik7CiAgICAgIH0KICAgICAgY2FzZSAidGV4dCI6IHsKICAgICAgICByZXR1cm4gdGV4dDUoc3RhdGUxMCwgdW5zYWZlMik7CiAgICAgIH0KICAgICAgZGVmYXVsdDoKICAgIH0KICB9Cn0KZnVuY3Rpb24gY29tbWVudChzdGF0ZTEwLCB1bnNhZmUyKSB7CiAgaWYgKHN0YXRlMTAuc2NoZW1hLmFsbG93Q29tbWVudHMpIHsKICAgIGNvbnN0IHJlc3VsdCA9IHR5cGVvZiB1bnNhZmUyLnZhbHVlID09PSAic3RyaW5nIiA/IHVuc2FmZTIudmFsdWUgOiAiIjsKICAgIGNvbnN0IGluZGV4MiA9IHJlc3VsdC5pbmRleE9mKCItLT4iKTsKICAgIGNvbnN0IHZhbHVlMiA9IGluZGV4MiA8IDAgPyByZXN1bHQgOiByZXN1bHQuc2xpY2UoMCwgaW5kZXgyKTsKICAgIGNvbnN0IG5vZGUyID0geyB0eXBlOiAiY29tbWVudCIsIHZhbHVlOiB2YWx1ZTIgfTsKICAgIHBhdGNoKG5vZGUyLCB1bnNhZmUyKTsKICAgIHJldHVybiBub2RlMjsKICB9Cn0KZnVuY3Rpb24gZG9jdHlwZShzdGF0ZTEwLCB1bnNhZmUyKSB7CiAgaWYgKHN0YXRlMTAuc2NoZW1hLmFsbG93RG9jdHlwZXMpIHsKICAgIGNvbnN0IG5vZGUyID0geyB0eXBlOiAiZG9jdHlwZSIgfTsKICAgIHBhdGNoKG5vZGUyLCB1bnNhZmUyKTsKICAgIHJldHVybiBub2RlMjsKICB9Cn0KZnVuY3Rpb24gZWxlbWVudDIoc3RhdGUxMCwgdW5zYWZlMikgewogIGNvbnN0IG5hbWUgPSB0eXBlb2YgdW5zYWZlMi50YWdOYW1lID09PSAic3RyaW5nIiA/IHVuc2FmZTIudGFnTmFtZSA6ICIiOwogIHN0YXRlMTAuc3RhY2sucHVzaChuYW1lKTsKICBjb25zdCBjb250ZW50MyA9ICgKICAgIC8qKiBAdHlwZSB7QXJyYXk8RWxlbWVudENvbnRlbnQ+fSAqLwogICAgY2hpbGRyZW4oc3RhdGUxMCwgdW5zYWZlMi5jaGlsZHJlbikKICApOwogIGNvbnN0IHByb3BlcnRpZXNfID0gcHJvcGVydGllcyhzdGF0ZTEwLCB1bnNhZmUyLnByb3BlcnRpZXMpOwogIHN0YXRlMTAuc3RhY2sucG9wKCk7CiAgbGV0IHNhZmVFbGVtZW50ID0gZmFsc2U7CiAgaWYgKG5hbWUgJiYgbmFtZSAhPT0gIioiICYmICghc3RhdGUxMC5zY2hlbWEudGFnTmFtZXMgfHwgc3RhdGUxMC5zY2hlbWEudGFnTmFtZXMuaW5jbHVkZXMobmFtZSkpKSB7CiAgICBzYWZlRWxlbWVudCA9IHRydWU7CiAgICBpZiAoc3RhdGUxMC5zY2hlbWEuYW5jZXN0b3JzICYmIG93bjcuY2FsbChzdGF0ZTEwLnNjaGVtYS5hbmNlc3RvcnMsIG5hbWUpKSB7CiAgICAgIGNvbnN0IGFuY2VzdG9ycyA9IHN0YXRlMTAuc2NoZW1hLmFuY2VzdG9yc1tuYW1lXTsKICAgICAgbGV0IGluZGV4MiA9IC0xOwogICAgICBzYWZlRWxlbWVudCA9IGZhbHNlOwogICAgICB3aGlsZSAoKytpbmRleDIgPCBhbmNlc3RvcnMubGVuZ3RoKSB7CiAgICAgICAgaWYgKHN0YXRlMTAuc3RhY2suaW5jbHVkZXMoYW5jZXN0b3JzW2luZGV4Ml0pKSB7CiAgICAgICAgICBzYWZlRWxlbWVudCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGlmICghc2FmZUVsZW1lbnQpIHsKICAgIHJldHVybiBzdGF0ZTEwLnNjaGVtYS5zdHJpcCAmJiAhc3RhdGUxMC5zY2hlbWEuc3RyaXAuaW5jbHVkZXMobmFtZSkgPyBjb250ZW50MyA6IHZvaWQgMDsKICB9CiAgY29uc3Qgbm9kZTIgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiBuYW1lLAogICAgcHJvcGVydGllczogcHJvcGVydGllc18sCiAgICBjaGlsZHJlbjogY29udGVudDMKICB9OwogIHBhdGNoKG5vZGUyLCB1bnNhZmUyKTsKICByZXR1cm4gbm9kZTI7Cn0KZnVuY3Rpb24gcm9vdDIoc3RhdGUxMCwgdW5zYWZlMikgewogIGNvbnN0IGNvbnRlbnQzID0gKAogICAgLyoqIEB0eXBlIHtBcnJheTxSb290Q29udGVudD59ICovCiAgICBjaGlsZHJlbihzdGF0ZTEwLCB1bnNhZmUyLmNoaWxkcmVuKQogICk7CiAgY29uc3Qgbm9kZTIgPSB7IHR5cGU6ICJyb290IiwgY2hpbGRyZW46IGNvbnRlbnQzIH07CiAgcGF0Y2gobm9kZTIsIHVuc2FmZTIpOwogIHJldHVybiBub2RlMjsKfQpmdW5jdGlvbiB0ZXh0NShfNSwgdW5zYWZlMikgewogIGNvbnN0IHZhbHVlMiA9IHR5cGVvZiB1bnNhZmUyLnZhbHVlID09PSAic3RyaW5nIiA/IHVuc2FmZTIudmFsdWUgOiAiIjsKICBjb25zdCBub2RlMiA9IHsgdHlwZTogInRleHQiLCB2YWx1ZTogdmFsdWUyIH07CiAgcGF0Y2gobm9kZTIsIHVuc2FmZTIpOwogIHJldHVybiBub2RlMjsKfQpmdW5jdGlvbiBjaGlsZHJlbihzdGF0ZTEwLCBjaGlsZHJlbjIpIHsKICBjb25zdCByZXN1bHRzID0gW107CiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4yKSkgewogICAgY29uc3QgY2hpbGRyZW5Vbmtub3duID0gKAogICAgICAvKiogQHR5cGUge0FycmF5PFJlYWRvbmx5PHVua25vd24+Pn0gKi8KICAgICAgY2hpbGRyZW4yCiAgICApOwogICAgbGV0IGluZGV4MiA9IC0xOwogICAgd2hpbGUgKCsraW5kZXgyIDwgY2hpbGRyZW5Vbmtub3duLmxlbmd0aCkgewogICAgICBjb25zdCB2YWx1ZTIgPSB0cmFuc2Zvcm0oc3RhdGUxMCwgY2hpbGRyZW5Vbmtub3duW2luZGV4Ml0pOwogICAgICBpZiAodmFsdWUyKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUyKSkgewogICAgICAgICAgcmVzdWx0cy5wdXNoKC4uLnZhbHVlMik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZTIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICByZXR1cm4gcmVzdWx0czsKfQpmdW5jdGlvbiBwcm9wZXJ0aWVzKHN0YXRlMTAsIHByb3BlcnRpZXMyKSB7CiAgY29uc3QgdGFnTmFtZSA9IHN0YXRlMTAuc3RhY2tbc3RhdGUxMC5zdGFjay5sZW5ndGggLSAxXTsKICBjb25zdCBhdHRyaWJ1dGVzID0gc3RhdGUxMC5zY2hlbWEuYXR0cmlidXRlczsKICBjb25zdCByZXF1aXJlZCA9IHN0YXRlMTAuc2NoZW1hLnJlcXVpcmVkOwogIGNvbnN0IHNwZWNpZmljID0gYXR0cmlidXRlcyAmJiBvd243LmNhbGwoYXR0cmlidXRlcywgdGFnTmFtZSkgPyBhdHRyaWJ1dGVzW3RhZ05hbWVdIDogdm9pZCAwOwogIGNvbnN0IGRlZmF1bHRzID0gYXR0cmlidXRlcyAmJiBvd243LmNhbGwoYXR0cmlidXRlcywgIioiKSA/IGF0dHJpYnV0ZXNbIioiXSA6IHZvaWQgMDsKICBjb25zdCBwcm9wZXJ0aWVzXyA9ICgKICAgIC8qKiBAdHlwZSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUmVhZG9ubHk8dW5rbm93bj4+Pn0gKi8KICAgIHByb3BlcnRpZXMyICYmIHR5cGVvZiBwcm9wZXJ0aWVzMiA9PT0gIm9iamVjdCIgPyBwcm9wZXJ0aWVzMiA6IHt9CiAgKTsKICBjb25zdCByZXN1bHQgPSB7fTsKICBsZXQga2V5MjsKICBmb3IgKGtleTIgaW4gcHJvcGVydGllc18pIHsKICAgIGlmIChvd243LmNhbGwocHJvcGVydGllc18sIGtleTIpKSB7CiAgICAgIGNvbnN0IHVuc2FmZTIgPSBwcm9wZXJ0aWVzX1trZXkyXTsKICAgICAgbGV0IHNhZmUyID0gcHJvcGVydHlWYWx1ZSgKICAgICAgICBzdGF0ZTEwLAogICAgICAgIGZpbmREZWZpbml0aW9uKHNwZWNpZmljLCBrZXkyKSwKICAgICAgICBrZXkyLAogICAgICAgIHVuc2FmZTIKICAgICAgKTsKICAgICAgaWYgKHNhZmUyID09PSBudWxsIHx8IHNhZmUyID09PSB2b2lkIDApIHsKICAgICAgICBzYWZlMiA9IHByb3BlcnR5VmFsdWUoc3RhdGUxMCwgZmluZERlZmluaXRpb24oZGVmYXVsdHMsIGtleTIpLCBrZXkyLCB1bnNhZmUyKTsKICAgICAgfQogICAgICBpZiAoc2FmZTIgIT09IG51bGwgJiYgc2FmZTIgIT09IHZvaWQgMCkgewogICAgICAgIHJlc3VsdFtrZXkyXSA9IHNhZmUyOwogICAgICB9CiAgICB9CiAgfQogIGlmIChyZXF1aXJlZCAmJiBvd243LmNhbGwocmVxdWlyZWQsIHRhZ05hbWUpKSB7CiAgICBjb25zdCBwcm9wZXJ0aWVzMyA9IHJlcXVpcmVkW3RhZ05hbWVdOwogICAgZm9yIChrZXkyIGluIHByb3BlcnRpZXMzKSB7CiAgICAgIGlmIChvd243LmNhbGwocHJvcGVydGllczMsIGtleTIpICYmICFvd243LmNhbGwocmVzdWx0LCBrZXkyKSkgewogICAgICAgIHJlc3VsdFtrZXkyXSA9IHByb3BlcnRpZXMzW2tleTJdOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gcHJvcGVydHlWYWx1ZShzdGF0ZTEwLCBkZWZpbml0aW9uMywga2V5MiwgdmFsdWUyKSB7CiAgcmV0dXJuIGRlZmluaXRpb24zID8gQXJyYXkuaXNBcnJheSh2YWx1ZTIpID8gcHJvcGVydHlWYWx1ZU1hbnkoc3RhdGUxMCwgZGVmaW5pdGlvbjMsIGtleTIsIHZhbHVlMikgOiBwcm9wZXJ0eVZhbHVlUHJpbWl0aXZlKHN0YXRlMTAsIGRlZmluaXRpb24zLCBrZXkyLCB2YWx1ZTIpIDogdm9pZCAwOwp9CmZ1bmN0aW9uIHByb3BlcnR5VmFsdWVNYW55KHN0YXRlMTAsIGRlZmluaXRpb24zLCBrZXkyLCB2YWx1ZXMpIHsKICBsZXQgaW5kZXgyID0gLTE7CiAgY29uc3QgcmVzdWx0ID0gW107CiAgd2hpbGUgKCsraW5kZXgyIDwgdmFsdWVzLmxlbmd0aCkgewogICAgY29uc3QgdmFsdWUyID0gcHJvcGVydHlWYWx1ZVByaW1pdGl2ZShzdGF0ZTEwLCBkZWZpbml0aW9uMywga2V5MiwgdmFsdWVzW2luZGV4Ml0pOwogICAgaWYgKHR5cGVvZiB2YWx1ZTIgPT09ICJudW1iZXIiIHx8IHR5cGVvZiB2YWx1ZTIgPT09ICJzdHJpbmciKSB7CiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlMik7CiAgICB9CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gcHJvcGVydHlWYWx1ZVByaW1pdGl2ZShzdGF0ZTEwLCBkZWZpbml0aW9uMywga2V5MiwgdmFsdWUyKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZTIgIT09ICJib29sZWFuIiAmJiB0eXBlb2YgdmFsdWUyICE9PSAibnVtYmVyIiAmJiB0eXBlb2YgdmFsdWUyICE9PSAic3RyaW5nIikgewogICAgcmV0dXJuOwogIH0KICBpZiAoIXNhZmVQcm90b2NvbChzdGF0ZTEwLCBrZXkyLCB2YWx1ZTIpKSB7CiAgICByZXR1cm47CiAgfQogIGlmICh0eXBlb2YgZGVmaW5pdGlvbjMgPT09ICJvYmplY3QiICYmIGRlZmluaXRpb24zLmxlbmd0aCA+IDEpIHsKICAgIGxldCBvazMgPSBmYWxzZTsKICAgIGxldCBpbmRleDIgPSAwOwogICAgd2hpbGUgKCsraW5kZXgyIDwgZGVmaW5pdGlvbjMubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGFsbG93ZWQgPSBkZWZpbml0aW9uM1tpbmRleDJdOwogICAgICBpZiAoYWxsb3dlZCAmJiB0eXBlb2YgYWxsb3dlZCA9PT0gIm9iamVjdCIgJiYgImZsYWdzIiBpbiBhbGxvd2VkKSB7CiAgICAgICAgaWYgKGFsbG93ZWQudGVzdChTdHJpbmcodmFsdWUyKSkpIHsKICAgICAgICAgIG9rMyA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYWxsb3dlZCA9PT0gdmFsdWUyKSB7CiAgICAgICAgb2szID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKCFvazMpIHJldHVybjsKICB9CiAgcmV0dXJuIHN0YXRlMTAuc2NoZW1hLmNsb2JiZXIgJiYgc3RhdGUxMC5zY2hlbWEuY2xvYmJlclByZWZpeCAmJiBzdGF0ZTEwLnNjaGVtYS5jbG9iYmVyLmluY2x1ZGVzKGtleTIpID8gc3RhdGUxMC5zY2hlbWEuY2xvYmJlclByZWZpeCArIHZhbHVlMiA6IHZhbHVlMjsKfQpmdW5jdGlvbiBzYWZlUHJvdG9jb2woc3RhdGUxMCwga2V5MiwgdmFsdWUyKSB7CiAgY29uc3QgcHJvdG9jb2xzID0gc3RhdGUxMC5zY2hlbWEucHJvdG9jb2xzICYmIG93bjcuY2FsbChzdGF0ZTEwLnNjaGVtYS5wcm90b2NvbHMsIGtleTIpID8gc3RhdGUxMC5zY2hlbWEucHJvdG9jb2xzW2tleTJdIDogdm9pZCAwOwogIGlmICghcHJvdG9jb2xzIHx8IHByb3RvY29scy5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBjb25zdCB1cmwgPSBTdHJpbmcodmFsdWUyKTsKICBjb25zdCBjb2xvbiA9IHVybC5pbmRleE9mKCI6Iik7CiAgY29uc3QgcXVlc3Rpb25NYXJrID0gdXJsLmluZGV4T2YoIj8iKTsKICBjb25zdCBudW1iZXJTaWduID0gdXJsLmluZGV4T2YoIiMiKTsKICBjb25zdCBzbGFzaCA9IHVybC5pbmRleE9mKCIvIik7CiAgaWYgKGNvbG9uIDwgMCB8fCAvLyBJZiB0aGUgZmlyc3QgY29sb24gaXMgYWZ0ZXIgYSBgP2AsIGAjYCwgb3IgYC9gLCBpdOKAmXMgbm90IGEgcHJvdG9jb2wuCiAgc2xhc2ggPiAtMSAmJiBjb2xvbiA+IHNsYXNoIHx8IHF1ZXN0aW9uTWFyayA+IC0xICYmIGNvbG9uID4gcXVlc3Rpb25NYXJrIHx8IG51bWJlclNpZ24gPiAtMSAmJiBjb2xvbiA+IG51bWJlclNpZ24pIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgcHJvdG9jb2xzLmxlbmd0aCkgewogICAgY29uc3QgcHJvdG9jb2wgPSBwcm90b2NvbHNbaW5kZXgyXTsKICAgIGlmIChjb2xvbiA9PT0gcHJvdG9jb2wubGVuZ3RoICYmIHVybC5zbGljZSgwLCBwcm90b2NvbC5sZW5ndGgpID09PSBwcm90b2NvbCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIHBhdGNoKG5vZGUyLCB1bnNhZmUyKSB7CiAgY29uc3QgY2xlYW5Qb3NpdGlvbiA9IHBvc2l0aW9uMigKICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGxvb2tzIGxpa2UgYSBub2RlLgogICAgdW5zYWZlMgogICk7CiAgaWYgKHVuc2FmZTIuZGF0YSkgewogICAgbm9kZTIuZGF0YSA9IGVzbV9kZWZhdWx0KHVuc2FmZTIuZGF0YSk7CiAgfQogIGlmIChjbGVhblBvc2l0aW9uKSBub2RlMi5wb3NpdGlvbiA9IGNsZWFuUG9zaXRpb247Cn0KZnVuY3Rpb24gZmluZERlZmluaXRpb24oZGVmaW5pdGlvbnMsIGtleTIpIHsKICBsZXQgZGF0YURlZmF1bHQ7CiAgbGV0IGluZGV4MiA9IC0xOwogIGlmIChkZWZpbml0aW9ucykgewogICAgd2hpbGUgKCsraW5kZXgyIDwgZGVmaW5pdGlvbnMubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGVudHJ5ID0gZGVmaW5pdGlvbnNbaW5kZXgyXTsKICAgICAgY29uc3QgbmFtZSA9IHR5cGVvZiBlbnRyeSA9PT0gInN0cmluZyIgPyBlbnRyeSA6IGVudHJ5WzBdOwogICAgICBpZiAobmFtZSA9PT0ga2V5MikgewogICAgICAgIHJldHVybiBlbnRyeTsKICAgICAgfQogICAgICBpZiAobmFtZSA9PT0gImRhdGEqIikgZGF0YURlZmF1bHQgPSBlbnRyeTsKICAgIH0KICB9CiAgaWYgKGtleTIubGVuZ3RoID4gNCAmJiBrZXkyLnNsaWNlKDAsIDQpLnRvTG93ZXJDYXNlKCkgPT09ICJkYXRhIikgewogICAgcmV0dXJuIGRhdGFEZWZhdWx0OwogIH0KfQp2YXIgb3duNzsKdmFyIGluaXRfbGliMjYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtc2FuaXRpemVANS4wLjIvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC1zYW5pdGl6ZS9saWIvaW5kZXguanMiKCkgewogICAgaW5pdF9lc20oKTsKICAgIGluaXRfdW5pc3RfdXRpbF9wb3NpdGlvbigpOwogICAgaW5pdF9zY2hlbWEoKTsKICAgIG93bjcgPSB7fS5oYXNPd25Qcm9wZXJ0eTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC1zYW5pdGl6ZUA1LjAuMi9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXNhbml0aXplL2luZGV4LmpzCnZhciBpbml0X2hhc3RfdXRpbF9zYW5pdGl6ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC1zYW5pdGl6ZUA1LjAuMi9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXNhbml0aXplL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGliMjYoKTsKICAgIGluaXRfc2NoZW1hKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2Jsb2NrcXVvdGUuanMKZnVuY3Rpb24gYmxvY2txdW90ZTIoc3RhdGUxMCwgbm9kZTIpIHsKICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiYmxvY2txdW90ZSIsCiAgICBwcm9wZXJ0aWVzOiB7fSwKICAgIGNoaWxkcmVuOiBzdGF0ZTEwLndyYXAoc3RhdGUxMC5hbGwobm9kZTIpLCB0cnVlKQogIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KdmFyIGluaXRfYmxvY2txdW90ZTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2Jsb2NrcXVvdGUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9icmVhay5qcwpmdW5jdGlvbiBoYXJkQnJlYWsyKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0geyB0eXBlOiAiZWxlbWVudCIsIHRhZ05hbWU6ICJiciIsIHByb3BlcnRpZXM6IHt9LCBjaGlsZHJlbjogW10gfTsKICBzdGF0ZTEwLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBbc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCksIHsgdHlwZTogInRleHQiLCB2YWx1ZTogIlxuIiB9XTsKfQp2YXIgaW5pdF9icmVhazIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2JyZWFrLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvY29kZS5qcwpmdW5jdGlvbiBjb2RlMyhzdGF0ZTEwLCBub2RlMikgewogIGNvbnN0IHZhbHVlMiA9IG5vZGUyLnZhbHVlID8gbm9kZTIudmFsdWUgKyAiXG4iIDogIiI7CiAgY29uc3QgcHJvcGVydGllczIgPSB7fTsKICBjb25zdCBsYW5ndWFnZSA9IG5vZGUyLmxhbmcgPyBub2RlMi5sYW5nLnNwbGl0KC9ccysvKSA6IFtdOwogIGlmIChsYW5ndWFnZS5sZW5ndGggPiAwKSB7CiAgICBwcm9wZXJ0aWVzMi5jbGFzc05hbWUgPSBbImxhbmd1YWdlLSIgKyBsYW5ndWFnZVswXV07CiAgfQogIGxldCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiY29kZSIsCiAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzMiwKICAgIGNoaWxkcmVuOiBbeyB0eXBlOiAidGV4dCIsIHZhbHVlOiB2YWx1ZTIgfV0KICB9OwogIGlmIChub2RlMi5tZXRhKSB7CiAgICByZXN1bHQuZGF0YSA9IHsgbWV0YTogbm9kZTIubWV0YSB9OwogIH0KICBzdGF0ZTEwLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJlc3VsdCA9IHN0YXRlMTAuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwogIHJlc3VsdCA9IHsgdHlwZTogImVsZW1lbnQiLCB0YWdOYW1lOiAicHJlIiwgcHJvcGVydGllczoge30sIGNoaWxkcmVuOiBbcmVzdWx0XSB9OwogIHN0YXRlMTAucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHJlc3VsdDsKfQp2YXIgaW5pdF9jb2RlMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvY29kZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2RlbGV0ZS5qcwpmdW5jdGlvbiBzdHJpa2V0aHJvdWdoKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogImRlbCIsCiAgICBwcm9wZXJ0aWVzOiB7fSwKICAgIGNoaWxkcmVuOiBzdGF0ZTEwLmFsbChub2RlMikKICB9OwogIHN0YXRlMTAucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlMTAuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9CnZhciBpbml0X2RlbGV0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvZGVsZXRlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvZW1waGFzaXMuanMKZnVuY3Rpb24gZW1waGFzaXMyKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogImVtIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlMTAuYWxsKG5vZGUyKQogIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KdmFyIGluaXRfZW1waGFzaXMyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9lbXBoYXNpcy5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2Zvb3Rub3RlLXJlZmVyZW5jZS5qcwpmdW5jdGlvbiBmb290bm90ZVJlZmVyZW5jZTIoc3RhdGUxMCwgbm9kZTIpIHsKICBjb25zdCBjbG9iYmVyUHJlZml4ID0gdHlwZW9mIHN0YXRlMTAub3B0aW9ucy5jbG9iYmVyUHJlZml4ID09PSAic3RyaW5nIiA/IHN0YXRlMTAub3B0aW9ucy5jbG9iYmVyUHJlZml4IDogInVzZXItY29udGVudC0iOwogIGNvbnN0IGlkID0gU3RyaW5nKG5vZGUyLmlkZW50aWZpZXIpLnRvVXBwZXJDYXNlKCk7CiAgY29uc3Qgc2FmZUlkID0gbm9ybWFsaXplVXJpKGlkLnRvTG93ZXJDYXNlKCkpOwogIGNvbnN0IGluZGV4MiA9IHN0YXRlMTAuZm9vdG5vdGVPcmRlci5pbmRleE9mKGlkKTsKICBsZXQgY291bnRlcjI7CiAgbGV0IHJldXNlQ291bnRlciA9IHN0YXRlMTAuZm9vdG5vdGVDb3VudHMuZ2V0KGlkKTsKICBpZiAocmV1c2VDb3VudGVyID09PSB2b2lkIDApIHsKICAgIHJldXNlQ291bnRlciA9IDA7CiAgICBzdGF0ZTEwLmZvb3Rub3RlT3JkZXIucHVzaChpZCk7CiAgICBjb3VudGVyMiA9IHN0YXRlMTAuZm9vdG5vdGVPcmRlci5sZW5ndGg7CiAgfSBlbHNlIHsKICAgIGNvdW50ZXIyID0gaW5kZXgyICsgMTsKICB9CiAgcmV1c2VDb3VudGVyICs9IDE7CiAgc3RhdGUxMC5mb290bm90ZUNvdW50cy5zZXQoaWQsIHJldXNlQ291bnRlcik7CiAgY29uc3QgbGluazMgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiYSIsCiAgICBwcm9wZXJ0aWVzOiB7CiAgICAgIGhyZWY6ICIjIiArIGNsb2JiZXJQcmVmaXggKyAiZm4tIiArIHNhZmVJZCwKICAgICAgaWQ6IGNsb2JiZXJQcmVmaXggKyAiZm5yZWYtIiArIHNhZmVJZCArIChyZXVzZUNvdW50ZXIgPiAxID8gIi0iICsgcmV1c2VDb3VudGVyIDogIiIpLAogICAgICBkYXRhRm9vdG5vdGVSZWY6IHRydWUsCiAgICAgIGFyaWFEZXNjcmliZWRCeTogWyJmb290bm90ZS1sYWJlbCJdCiAgICB9LAogICAgY2hpbGRyZW46IFt7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IFN0cmluZyhjb3VudGVyMikgfV0KICB9OwogIHN0YXRlMTAucGF0Y2gobm9kZTIsIGxpbmszKTsKICBjb25zdCBzdXAgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAic3VwIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IFtsaW5rM10KICB9OwogIHN0YXRlMTAucGF0Y2gobm9kZTIsIHN1cCk7CiAgcmV0dXJuIHN0YXRlMTAuYXBwbHlEYXRhKG5vZGUyLCBzdXApOwp9CnZhciBpbml0X2Zvb3Rub3RlX3JlZmVyZW5jZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvZm9vdG5vdGUtcmVmZXJlbmNlLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfc2FuaXRpemVfdXJpKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2hlYWRpbmcuanMKZnVuY3Rpb24gaGVhZGluZzIoc3RhdGUxMCwgbm9kZTIpIHsKICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiaCIgKyBub2RlMi5kZXB0aCwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlMTAuYWxsKG5vZGUyKQogIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KdmFyIGluaXRfaGVhZGluZzIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2hlYWRpbmcuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9odG1sLmpzCmZ1bmN0aW9uIGh0bWwyKHN0YXRlMTAsIG5vZGUyKSB7CiAgaWYgKHN0YXRlMTAub3B0aW9ucy5hbGxvd0Rhbmdlcm91c0h0bWwpIHsKICAgIGNvbnN0IHJlc3VsdCA9IHsgdHlwZTogInJhdyIsIHZhbHVlOiBub2RlMi52YWx1ZSB9OwogICAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICAgIHJldHVybiBzdGF0ZTEwLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKICB9CiAgcmV0dXJuIHZvaWQgMDsKfQp2YXIgaW5pdF9odG1sOCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvaHRtbC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL3JldmVydC5qcwpmdW5jdGlvbiByZXZlcnQoc3RhdGUxMCwgbm9kZTIpIHsKICBjb25zdCBzdWJ0eXBlID0gbm9kZTIucmVmZXJlbmNlVHlwZTsKICBsZXQgc3VmZml4ID0gIl0iOwogIGlmIChzdWJ0eXBlID09PSAiY29sbGFwc2VkIikgewogICAgc3VmZml4ICs9ICJbXSI7CiAgfSBlbHNlIGlmIChzdWJ0eXBlID09PSAiZnVsbCIpIHsKICAgIHN1ZmZpeCArPSAiWyIgKyAobm9kZTIubGFiZWwgfHwgbm9kZTIuaWRlbnRpZmllcikgKyAiXSI7CiAgfQogIGlmIChub2RlMi50eXBlID09PSAiaW1hZ2VSZWZlcmVuY2UiKSB7CiAgICByZXR1cm4gW3sgdHlwZTogInRleHQiLCB2YWx1ZTogIiFbIiArIG5vZGUyLmFsdCArIHN1ZmZpeCB9XTsKICB9CiAgY29uc3QgY29udGVudHMgPSBzdGF0ZTEwLmFsbChub2RlMik7CiAgY29uc3QgaGVhZDIgPSBjb250ZW50c1swXTsKICBpZiAoaGVhZDIgJiYgaGVhZDIudHlwZSA9PT0gInRleHQiKSB7CiAgICBoZWFkMi52YWx1ZSA9ICJbIiArIGhlYWQyLnZhbHVlOwogIH0gZWxzZSB7CiAgICBjb250ZW50cy51bnNoaWZ0KHsgdHlwZTogInRleHQiLCB2YWx1ZTogIlsiIH0pOwogIH0KICBjb25zdCB0YWlsID0gY29udGVudHNbY29udGVudHMubGVuZ3RoIC0gMV07CiAgaWYgKHRhaWwgJiYgdGFpbC50eXBlID09PSAidGV4dCIpIHsKICAgIHRhaWwudmFsdWUgKz0gc3VmZml4OwogIH0gZWxzZSB7CiAgICBjb250ZW50cy5wdXNoKHsgdHlwZTogInRleHQiLCB2YWx1ZTogc3VmZml4IH0pOwogIH0KICByZXR1cm4gY29udGVudHM7Cn0KdmFyIGluaXRfcmV2ZXJ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9yZXZlcnQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9pbWFnZS1yZWZlcmVuY2UuanMKZnVuY3Rpb24gaW1hZ2VSZWZlcmVuY2UyKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgaWQgPSBTdHJpbmcobm9kZTIuaWRlbnRpZmllcikudG9VcHBlckNhc2UoKTsKICBjb25zdCBkZWZpbml0aW9uMyA9IHN0YXRlMTAuZGVmaW5pdGlvbkJ5SWQuZ2V0KGlkKTsKICBpZiAoIWRlZmluaXRpb24zKSB7CiAgICByZXR1cm4gcmV2ZXJ0KHN0YXRlMTAsIG5vZGUyKTsKICB9CiAgY29uc3QgcHJvcGVydGllczIgPSB7IHNyYzogbm9ybWFsaXplVXJpKGRlZmluaXRpb24zLnVybCB8fCAiIiksIGFsdDogbm9kZTIuYWx0IH07CiAgaWYgKGRlZmluaXRpb24zLnRpdGxlICE9PSBudWxsICYmIGRlZmluaXRpb24zLnRpdGxlICE9PSB2b2lkIDApIHsKICAgIHByb3BlcnRpZXMyLnRpdGxlID0gZGVmaW5pdGlvbjMudGl0bGU7CiAgfQogIGNvbnN0IHJlc3VsdCA9IHsgdHlwZTogImVsZW1lbnQiLCB0YWdOYW1lOiAiaW1nIiwgcHJvcGVydGllczogcHJvcGVydGllczIsIGNoaWxkcmVuOiBbXSB9OwogIHN0YXRlMTAucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlMTAuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9CnZhciBpbml0X2ltYWdlX3JlZmVyZW5jZTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2ltYWdlLXJlZmVyZW5jZS5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX3Nhbml0aXplX3VyaSgpOwogICAgaW5pdF9yZXZlcnQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvaW1hZ2UuanMKZnVuY3Rpb24gaW1hZ2UyKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgcHJvcGVydGllczIgPSB7IHNyYzogbm9ybWFsaXplVXJpKG5vZGUyLnVybCkgfTsKICBpZiAobm9kZTIuYWx0ICE9PSBudWxsICYmIG5vZGUyLmFsdCAhPT0gdm9pZCAwKSB7CiAgICBwcm9wZXJ0aWVzMi5hbHQgPSBub2RlMi5hbHQ7CiAgfQogIGlmIChub2RlMi50aXRsZSAhPT0gbnVsbCAmJiBub2RlMi50aXRsZSAhPT0gdm9pZCAwKSB7CiAgICBwcm9wZXJ0aWVzMi50aXRsZSA9IG5vZGUyLnRpdGxlOwogIH0KICBjb25zdCByZXN1bHQgPSB7IHR5cGU6ICJlbGVtZW50IiwgdGFnTmFtZTogImltZyIsIHByb3BlcnRpZXM6IHByb3BlcnRpZXMyLCBjaGlsZHJlbjogW10gfTsKICBzdGF0ZTEwLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZTEwLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQp2YXIgaW5pdF9pbWFnZTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2ltYWdlLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfc2FuaXRpemVfdXJpKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2lubGluZS1jb2RlLmpzCmZ1bmN0aW9uIGlubGluZUNvZGUyKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgdGV4dDkgPSB7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6IG5vZGUyLnZhbHVlLnJlcGxhY2UoL1xyP1xufFxyL2csICIgIikgfTsKICBzdGF0ZTEwLnBhdGNoKG5vZGUyLCB0ZXh0OSk7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogImNvZGUiLAogICAgcHJvcGVydGllczoge30sCiAgICBjaGlsZHJlbjogW3RleHQ5XQogIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KdmFyIGluaXRfaW5saW5lX2NvZGUyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9pbmxpbmUtY29kZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2xpbmstcmVmZXJlbmNlLmpzCmZ1bmN0aW9uIGxpbmtSZWZlcmVuY2UyKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgaWQgPSBTdHJpbmcobm9kZTIuaWRlbnRpZmllcikudG9VcHBlckNhc2UoKTsKICBjb25zdCBkZWZpbml0aW9uMyA9IHN0YXRlMTAuZGVmaW5pdGlvbkJ5SWQuZ2V0KGlkKTsKICBpZiAoIWRlZmluaXRpb24zKSB7CiAgICByZXR1cm4gcmV2ZXJ0KHN0YXRlMTAsIG5vZGUyKTsKICB9CiAgY29uc3QgcHJvcGVydGllczIgPSB7IGhyZWY6IG5vcm1hbGl6ZVVyaShkZWZpbml0aW9uMy51cmwgfHwgIiIpIH07CiAgaWYgKGRlZmluaXRpb24zLnRpdGxlICE9PSBudWxsICYmIGRlZmluaXRpb24zLnRpdGxlICE9PSB2b2lkIDApIHsKICAgIHByb3BlcnRpZXMyLnRpdGxlID0gZGVmaW5pdGlvbjMudGl0bGU7CiAgfQogIGNvbnN0IHJlc3VsdCA9IHsKICAgIHR5cGU6ICJlbGVtZW50IiwKICAgIHRhZ05hbWU6ICJhIiwKICAgIHByb3BlcnRpZXM6IHByb3BlcnRpZXMyLAogICAgY2hpbGRyZW46IHN0YXRlMTAuYWxsKG5vZGUyKQogIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KdmFyIGluaXRfbGlua19yZWZlcmVuY2UyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9saW5rLXJlZmVyZW5jZS5qcyIoKSB7CiAgICBpbml0X21pY3JvbWFya191dGlsX3Nhbml0aXplX3VyaSgpOwogICAgaW5pdF9yZXZlcnQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvbGluay5qcwpmdW5jdGlvbiBsaW5rMihzdGF0ZTEwLCBub2RlMikgewogIGNvbnN0IHByb3BlcnRpZXMyID0geyBocmVmOiBub3JtYWxpemVVcmkobm9kZTIudXJsKSB9OwogIGlmIChub2RlMi50aXRsZSAhPT0gbnVsbCAmJiBub2RlMi50aXRsZSAhPT0gdm9pZCAwKSB7CiAgICBwcm9wZXJ0aWVzMi50aXRsZSA9IG5vZGUyLnRpdGxlOwogIH0KICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAiYSIsCiAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzMiwKICAgIGNoaWxkcmVuOiBzdGF0ZTEwLmFsbChub2RlMikKICB9OwogIHN0YXRlMTAucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlMTAuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9CnZhciBpbml0X2xpbmsyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9saW5rLmpzIigpIHsKICAgIGluaXRfbWljcm9tYXJrX3V0aWxfc2FuaXRpemVfdXJpKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2xpc3QtaXRlbS5qcwpmdW5jdGlvbiBsaXN0SXRlbTIoc3RhdGUxMCwgbm9kZTIsIHBhcmVudCkgewogIGNvbnN0IHJlc3VsdHMgPSBzdGF0ZTEwLmFsbChub2RlMik7CiAgY29uc3QgbG9vc2UgPSBwYXJlbnQgPyBsaXN0TG9vc2UocGFyZW50KSA6IGxpc3RJdGVtTG9vc2Uobm9kZTIpOwogIGNvbnN0IHByb3BlcnRpZXMyID0ge307CiAgY29uc3QgY2hpbGRyZW4yID0gW107CiAgaWYgKHR5cGVvZiBub2RlMi5jaGVja2VkID09PSAiYm9vbGVhbiIpIHsKICAgIGNvbnN0IGhlYWQyID0gcmVzdWx0c1swXTsKICAgIGxldCBwYXJhZ3JhcGgzOwogICAgaWYgKGhlYWQyICYmIGhlYWQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiBoZWFkMi50YWdOYW1lID09PSAicCIpIHsKICAgICAgcGFyYWdyYXBoMyA9IGhlYWQyOwogICAgfSBlbHNlIHsKICAgICAgcGFyYWdyYXBoMyA9IHsgdHlwZTogImVsZW1lbnQiLCB0YWdOYW1lOiAicCIsIHByb3BlcnRpZXM6IHt9LCBjaGlsZHJlbjogW10gfTsKICAgICAgcmVzdWx0cy51bnNoaWZ0KHBhcmFncmFwaDMpOwogICAgfQogICAgaWYgKHBhcmFncmFwaDMuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICBwYXJhZ3JhcGgzLmNoaWxkcmVuLnVuc2hpZnQoeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiICIgfSk7CiAgICB9CiAgICBwYXJhZ3JhcGgzLmNoaWxkcmVuLnVuc2hpZnQoewogICAgICB0eXBlOiAiZWxlbWVudCIsCiAgICAgIHRhZ05hbWU6ICJpbnB1dCIsCiAgICAgIHByb3BlcnRpZXM6IHsgdHlwZTogImNoZWNrYm94IiwgY2hlY2tlZDogbm9kZTIuY2hlY2tlZCwgZGlzYWJsZWQ6IHRydWUgfSwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9KTsKICAgIHByb3BlcnRpZXMyLmNsYXNzTmFtZSA9IFsidGFzay1saXN0LWl0ZW0iXTsKICB9CiAgbGV0IGluZGV4MiA9IC0xOwogIHdoaWxlICgrK2luZGV4MiA8IHJlc3VsdHMubGVuZ3RoKSB7CiAgICBjb25zdCBjaGlsZCA9IHJlc3VsdHNbaW5kZXgyXTsKICAgIGlmIChsb29zZSB8fCBpbmRleDIgIT09IDAgfHwgY2hpbGQudHlwZSAhPT0gImVsZW1lbnQiIHx8IGNoaWxkLnRhZ05hbWUgIT09ICJwIikgewogICAgICBjaGlsZHJlbjIucHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6ICJcbiIgfSk7CiAgICB9CiAgICBpZiAoY2hpbGQudHlwZSA9PT0gImVsZW1lbnQiICYmIGNoaWxkLnRhZ05hbWUgPT09ICJwIiAmJiAhbG9vc2UpIHsKICAgICAgY2hpbGRyZW4yLnB1c2goLi4uY2hpbGQuY2hpbGRyZW4pOwogICAgfSBlbHNlIHsKICAgICAgY2hpbGRyZW4yLnB1c2goY2hpbGQpOwogICAgfQogIH0KICBjb25zdCB0YWlsID0gcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdOwogIGlmICh0YWlsICYmIChsb29zZSB8fCB0YWlsLnR5cGUgIT09ICJlbGVtZW50IiB8fCB0YWlsLnRhZ05hbWUgIT09ICJwIikpIHsKICAgIGNoaWxkcmVuMi5wdXNoKHsgdHlwZTogInRleHQiLCB2YWx1ZTogIlxuIiB9KTsKICB9CiAgY29uc3QgcmVzdWx0ID0geyB0eXBlOiAiZWxlbWVudCIsIHRhZ05hbWU6ICJsaSIsIHByb3BlcnRpZXM6IHByb3BlcnRpZXMyLCBjaGlsZHJlbjogY2hpbGRyZW4yIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KZnVuY3Rpb24gbGlzdExvb3NlKG5vZGUyKSB7CiAgbGV0IGxvb3NlID0gZmFsc2U7CiAgaWYgKG5vZGUyLnR5cGUgPT09ICJsaXN0IikgewogICAgbG9vc2UgPSBub2RlMi5zcHJlYWQgfHwgZmFsc2U7CiAgICBjb25zdCBjaGlsZHJlbjIgPSBub2RlMi5jaGlsZHJlbjsKICAgIGxldCBpbmRleDIgPSAtMTsKICAgIHdoaWxlICghbG9vc2UgJiYgKytpbmRleDIgPCBjaGlsZHJlbjIubGVuZ3RoKSB7CiAgICAgIGxvb3NlID0gbGlzdEl0ZW1Mb29zZShjaGlsZHJlbjJbaW5kZXgyXSk7CiAgICB9CiAgfQogIHJldHVybiBsb29zZTsKfQpmdW5jdGlvbiBsaXN0SXRlbUxvb3NlKG5vZGUyKSB7CiAgY29uc3Qgc3ByZWFkID0gbm9kZTIuc3ByZWFkOwogIHJldHVybiBzcHJlYWQgPT09IG51bGwgfHwgc3ByZWFkID09PSB2b2lkIDAgPyBub2RlMi5jaGlsZHJlbi5sZW5ndGggPiAxIDogc3ByZWFkOwp9CnZhciBpbml0X2xpc3RfaXRlbTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2xpc3QtaXRlbS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2xpc3QuanMKZnVuY3Rpb24gbGlzdDQoc3RhdGUxMCwgbm9kZTIpIHsKICBjb25zdCBwcm9wZXJ0aWVzMiA9IHt9OwogIGNvbnN0IHJlc3VsdHMgPSBzdGF0ZTEwLmFsbChub2RlMik7CiAgbGV0IGluZGV4MiA9IC0xOwogIGlmICh0eXBlb2Ygbm9kZTIuc3RhcnQgPT09ICJudW1iZXIiICYmIG5vZGUyLnN0YXJ0ICE9PSAxKSB7CiAgICBwcm9wZXJ0aWVzMi5zdGFydCA9IG5vZGUyLnN0YXJ0OwogIH0KICB3aGlsZSAoKytpbmRleDIgPCByZXN1bHRzLmxlbmd0aCkgewogICAgY29uc3QgY2hpbGQgPSByZXN1bHRzW2luZGV4Ml07CiAgICBpZiAoY2hpbGQudHlwZSA9PT0gImVsZW1lbnQiICYmIGNoaWxkLnRhZ05hbWUgPT09ICJsaSIgJiYgY2hpbGQucHJvcGVydGllcyAmJiBBcnJheS5pc0FycmF5KGNoaWxkLnByb3BlcnRpZXMuY2xhc3NOYW1lKSAmJiBjaGlsZC5wcm9wZXJ0aWVzLmNsYXNzTmFtZS5pbmNsdWRlcygidGFzay1saXN0LWl0ZW0iKSkgewogICAgICBwcm9wZXJ0aWVzMi5jbGFzc05hbWUgPSBbImNvbnRhaW5zLXRhc2stbGlzdCJdOwogICAgICBicmVhazsKICAgIH0KICB9CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogbm9kZTIub3JkZXJlZCA/ICJvbCIgOiAidWwiLAogICAgcHJvcGVydGllczogcHJvcGVydGllczIsCiAgICBjaGlsZHJlbjogc3RhdGUxMC53cmFwKHJlc3VsdHMsIHRydWUpCiAgfTsKICBzdGF0ZTEwLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZTEwLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQp2YXIgaW5pdF9saXN0MyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvbGlzdC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL3BhcmFncmFwaC5qcwpmdW5jdGlvbiBwYXJhZ3JhcGgyKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogInAiLAogICAgcHJvcGVydGllczoge30sCiAgICBjaGlsZHJlbjogc3RhdGUxMC5hbGwobm9kZTIpCiAgfTsKICBzdGF0ZTEwLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZTEwLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQp2YXIgaW5pdF9wYXJhZ3JhcGgyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9wYXJhZ3JhcGguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9yb290LmpzCmZ1bmN0aW9uIHJvb3QzKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0geyB0eXBlOiAicm9vdCIsIGNoaWxkcmVuOiBzdGF0ZTEwLndyYXAoc3RhdGUxMC5hbGwobm9kZTIpKSB9OwogIHN0YXRlMTAucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlMTAuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9CnZhciBpbml0X3Jvb3QyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9yb290LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvc3Ryb25nLmpzCmZ1bmN0aW9uIHN0cm9uZzIoc3RhdGUxMCwgbm9kZTIpIHsKICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAic3Ryb25nIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlMTAuYWxsKG5vZGUyKQogIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KdmFyIGluaXRfc3Ryb25nMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvc3Ryb25nLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGFibGUuanMKZnVuY3Rpb24gdGFibGUoc3RhdGUxMCwgbm9kZTIpIHsKICBjb25zdCByb3dzID0gc3RhdGUxMC5hbGwobm9kZTIpOwogIGNvbnN0IGZpcnN0Um93ID0gcm93cy5zaGlmdCgpOwogIGNvbnN0IHRhYmxlQ29udGVudCA9IFtdOwogIGlmIChmaXJzdFJvdykgewogICAgY29uc3QgaGVhZDIgPSB7CiAgICAgIHR5cGU6ICJlbGVtZW50IiwKICAgICAgdGFnTmFtZTogInRoZWFkIiwKICAgICAgcHJvcGVydGllczoge30sCiAgICAgIGNoaWxkcmVuOiBzdGF0ZTEwLndyYXAoW2ZpcnN0Um93XSwgdHJ1ZSkKICAgIH07CiAgICBzdGF0ZTEwLnBhdGNoKG5vZGUyLmNoaWxkcmVuWzBdLCBoZWFkMik7CiAgICB0YWJsZUNvbnRlbnQucHVzaChoZWFkMik7CiAgfQogIGlmIChyb3dzLmxlbmd0aCA+IDApIHsKICAgIGNvbnN0IGJvZHkzID0gewogICAgICB0eXBlOiAiZWxlbWVudCIsCiAgICAgIHRhZ05hbWU6ICJ0Ym9keSIsCiAgICAgIHByb3BlcnRpZXM6IHt9LAogICAgICBjaGlsZHJlbjogc3RhdGUxMC53cmFwKHJvd3MsIHRydWUpCiAgICB9OwogICAgY29uc3Qgc3RhcnQgPSBwb2ludFN0YXJ0KG5vZGUyLmNoaWxkcmVuWzFdKTsKICAgIGNvbnN0IGVuZDMgPSBwb2ludEVuZChub2RlMi5jaGlsZHJlbltub2RlMi5jaGlsZHJlbi5sZW5ndGggLSAxXSk7CiAgICBpZiAoc3RhcnQgJiYgZW5kMykgYm9keTMucG9zaXRpb24gPSB7IHN0YXJ0LCBlbmQ6IGVuZDMgfTsKICAgIHRhYmxlQ29udGVudC5wdXNoKGJvZHkzKTsKICB9CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogInRhYmxlIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlMTAud3JhcCh0YWJsZUNvbnRlbnQsIHRydWUpCiAgfTsKICBzdGF0ZTEwLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZTEwLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQp2YXIgaW5pdF90YWJsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGFibGUuanMiKCkgewogICAgaW5pdF91bmlzdF91dGlsX3Bvc2l0aW9uKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL3RhYmxlLXJvdy5qcwpmdW5jdGlvbiB0YWJsZVJvdyhzdGF0ZTEwLCBub2RlMiwgcGFyZW50KSB7CiAgY29uc3Qgc2libGluZ3MyID0gcGFyZW50ID8gcGFyZW50LmNoaWxkcmVuIDogdm9pZCAwOwogIGNvbnN0IHJvd0luZGV4ID0gc2libGluZ3MyID8gc2libGluZ3MyLmluZGV4T2Yobm9kZTIpIDogMTsKICBjb25zdCB0YWdOYW1lID0gcm93SW5kZXggPT09IDAgPyAidGgiIDogInRkIjsKICBjb25zdCBhbGlnbiA9IHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PT0gInRhYmxlIiA/IHBhcmVudC5hbGlnbiA6IHZvaWQgMDsKICBjb25zdCBsZW5ndGggPSBhbGlnbiA/IGFsaWduLmxlbmd0aCA6IG5vZGUyLmNoaWxkcmVuLmxlbmd0aDsKICBsZXQgY2VsbEluZGV4ID0gLTE7CiAgY29uc3QgY2VsbHMyID0gW107CiAgd2hpbGUgKCsrY2VsbEluZGV4IDwgbGVuZ3RoKSB7CiAgICBjb25zdCBjZWxsMiA9IG5vZGUyLmNoaWxkcmVuW2NlbGxJbmRleF07CiAgICBjb25zdCBwcm9wZXJ0aWVzMiA9IHt9OwogICAgY29uc3QgYWxpZ25WYWx1ZSA9IGFsaWduID8gYWxpZ25bY2VsbEluZGV4XSA6IHZvaWQgMDsKICAgIGlmIChhbGlnblZhbHVlKSB7CiAgICAgIHByb3BlcnRpZXMyLmFsaWduID0gYWxpZ25WYWx1ZTsKICAgIH0KICAgIGxldCByZXN1bHQyID0geyB0eXBlOiAiZWxlbWVudCIsIHRhZ05hbWUsIHByb3BlcnRpZXM6IHByb3BlcnRpZXMyLCBjaGlsZHJlbjogW10gfTsKICAgIGlmIChjZWxsMikgewogICAgICByZXN1bHQyLmNoaWxkcmVuID0gc3RhdGUxMC5hbGwoY2VsbDIpOwogICAgICBzdGF0ZTEwLnBhdGNoKGNlbGwyLCByZXN1bHQyKTsKICAgICAgcmVzdWx0MiA9IHN0YXRlMTAuYXBwbHlEYXRhKGNlbGwyLCByZXN1bHQyKTsKICAgIH0KICAgIGNlbGxzMi5wdXNoKHJlc3VsdDIpOwogIH0KICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAidHIiLAogICAgcHJvcGVydGllczoge30sCiAgICBjaGlsZHJlbjogc3RhdGUxMC53cmFwKGNlbGxzMiwgdHJ1ZSkKICB9OwogIHN0YXRlMTAucGF0Y2gobm9kZTIsIHJlc3VsdCk7CiAgcmV0dXJuIHN0YXRlMTAuYXBwbHlEYXRhKG5vZGUyLCByZXN1bHQpOwp9CnZhciBpbml0X3RhYmxlX3JvdyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGFibGUtcm93LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGFibGUtY2VsbC5qcwpmdW5jdGlvbiB0YWJsZUNlbGwoc3RhdGUxMCwgbm9kZTIpIHsKICBjb25zdCByZXN1bHQgPSB7CiAgICB0eXBlOiAiZWxlbWVudCIsCiAgICB0YWdOYW1lOiAidGQiLAogICAgLy8gQXNzdW1lIGJvZHkgY2VsbC4KICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IHN0YXRlMTAuYWxsKG5vZGUyKQogIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KdmFyIGluaXRfdGFibGVfY2VsbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGFibGUtY2VsbC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS90cmltLWxpbmVzQDMuMC4xL25vZGVfbW9kdWxlcy90cmltLWxpbmVzL2luZGV4LmpzCmZ1bmN0aW9uIHRyaW1MaW5lcyh2YWx1ZTIpIHsKICBjb25zdCBzb3VyY2UgPSBTdHJpbmcodmFsdWUyKTsKICBjb25zdCBzZWFyY2gyID0gL1xyP1xufFxyL2c7CiAgbGV0IG1hdGNoMiA9IHNlYXJjaDIuZXhlYyhzb3VyY2UpOwogIGxldCBsYXN0MyA9IDA7CiAgY29uc3QgbGluZXMgPSBbXTsKICB3aGlsZSAobWF0Y2gyKSB7CiAgICBsaW5lcy5wdXNoKAogICAgICB0cmltTGluZShzb3VyY2Uuc2xpY2UobGFzdDMsIG1hdGNoMi5pbmRleCksIGxhc3QzID4gMCwgdHJ1ZSksCiAgICAgIG1hdGNoMlswXQogICAgKTsKICAgIGxhc3QzID0gbWF0Y2gyLmluZGV4ICsgbWF0Y2gyWzBdLmxlbmd0aDsKICAgIG1hdGNoMiA9IHNlYXJjaDIuZXhlYyhzb3VyY2UpOwogIH0KICBsaW5lcy5wdXNoKHRyaW1MaW5lKHNvdXJjZS5zbGljZShsYXN0MyksIGxhc3QzID4gMCwgZmFsc2UpKTsKICByZXR1cm4gbGluZXMuam9pbigiIik7Cn0KZnVuY3Rpb24gdHJpbUxpbmUodmFsdWUyLCBzdGFydCwgZW5kMykgewogIGxldCBzdGFydEluZGV4ID0gMDsKICBsZXQgZW5kSW5kZXggPSB2YWx1ZTIubGVuZ3RoOwogIGlmIChzdGFydCkgewogICAgbGV0IGNvZGU0ID0gdmFsdWUyLmNvZGVQb2ludEF0KHN0YXJ0SW5kZXgpOwogICAgd2hpbGUgKGNvZGU0ID09PSB0YWIgfHwgY29kZTQgPT09IHNwYWNlKSB7CiAgICAgIHN0YXJ0SW5kZXgrKzsKICAgICAgY29kZTQgPSB2YWx1ZTIuY29kZVBvaW50QXQoc3RhcnRJbmRleCk7CiAgICB9CiAgfQogIGlmIChlbmQzKSB7CiAgICBsZXQgY29kZTQgPSB2YWx1ZTIuY29kZVBvaW50QXQoZW5kSW5kZXggLSAxKTsKICAgIHdoaWxlIChjb2RlNCA9PT0gdGFiIHx8IGNvZGU0ID09PSBzcGFjZSkgewogICAgICBlbmRJbmRleC0tOwogICAgICBjb2RlNCA9IHZhbHVlMi5jb2RlUG9pbnRBdChlbmRJbmRleCAtIDEpOwogICAgfQogIH0KICByZXR1cm4gZW5kSW5kZXggPiBzdGFydEluZGV4ID8gdmFsdWUyLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KSA6ICIiOwp9CnZhciB0YWIsIHNwYWNlOwp2YXIgaW5pdF90cmltX2xpbmVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vdHJpbS1saW5lc0AzLjAuMS9ub2RlX21vZHVsZXMvdHJpbS1saW5lcy9pbmRleC5qcyIoKSB7CiAgICB0YWIgPSA5OwogICAgc3BhY2UgPSAzMjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGV4dC5qcwpmdW5jdGlvbiB0ZXh0NihzdGF0ZTEwLCBub2RlMikgewogIGNvbnN0IHJlc3VsdCA9IHsgdHlwZTogInRleHQiLCB2YWx1ZTogdHJpbUxpbmVzKFN0cmluZyhub2RlMi52YWx1ZSkpIH07CiAgc3RhdGUxMC5wYXRjaChub2RlMiwgcmVzdWx0KTsKICByZXR1cm4gc3RhdGUxMC5hcHBseURhdGEobm9kZTIsIHJlc3VsdCk7Cn0KdmFyIGluaXRfdGV4dDMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL3RleHQuanMiKCkgewogICAgaW5pdF90cmltX2xpbmVzKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL3RoZW1hdGljLWJyZWFrLmpzCmZ1bmN0aW9uIHRoZW1hdGljQnJlYWszKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgcmVzdWx0ID0gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogImhyIiwKICAgIHByb3BlcnRpZXM6IHt9LAogICAgY2hpbGRyZW46IFtdCiAgfTsKICBzdGF0ZTEwLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZTEwLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQp2YXIgaW5pdF90aGVtYXRpY19icmVhazMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL3RoZW1hdGljLWJyZWFrLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvaW5kZXguanMKZnVuY3Rpb24gaWdub3JlKCkgewogIHJldHVybiB2b2lkIDA7Cn0KdmFyIGhhbmRsZXJzOwp2YXIgaW5pdF9oYW5kbGVycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvaW5kZXguanMiKCkgewogICAgaW5pdF9ibG9ja3F1b3RlMigpOwogICAgaW5pdF9icmVhazIoKTsKICAgIGluaXRfY29kZTIoKTsKICAgIGluaXRfZGVsZXRlKCk7CiAgICBpbml0X2VtcGhhc2lzMigpOwogICAgaW5pdF9mb290bm90ZV9yZWZlcmVuY2UoKTsKICAgIGluaXRfaGVhZGluZzIoKTsKICAgIGluaXRfaHRtbDgoKTsKICAgIGluaXRfaW1hZ2VfcmVmZXJlbmNlMigpOwogICAgaW5pdF9pbWFnZTIoKTsKICAgIGluaXRfaW5saW5lX2NvZGUyKCk7CiAgICBpbml0X2xpbmtfcmVmZXJlbmNlMigpOwogICAgaW5pdF9saW5rMigpOwogICAgaW5pdF9saXN0X2l0ZW0yKCk7CiAgICBpbml0X2xpc3QzKCk7CiAgICBpbml0X3BhcmFncmFwaDIoKTsKICAgIGluaXRfcm9vdDIoKTsKICAgIGluaXRfc3Ryb25nMigpOwogICAgaW5pdF90YWJsZSgpOwogICAgaW5pdF90YWJsZV9yb3coKTsKICAgIGluaXRfdGFibGVfY2VsbCgpOwogICAgaW5pdF90ZXh0MygpOwogICAgaW5pdF90aGVtYXRpY19icmVhazMoKTsKICAgIGhhbmRsZXJzID0gewogICAgICBibG9ja3F1b3RlOiBibG9ja3F1b3RlMiwKICAgICAgYnJlYWs6IGhhcmRCcmVhazIsCiAgICAgIGNvZGU6IGNvZGUzLAogICAgICBkZWxldGU6IHN0cmlrZXRocm91Z2gsCiAgICAgIGVtcGhhc2lzOiBlbXBoYXNpczIsCiAgICAgIGZvb3Rub3RlUmVmZXJlbmNlOiBmb290bm90ZVJlZmVyZW5jZTIsCiAgICAgIGhlYWRpbmc6IGhlYWRpbmcyLAogICAgICBodG1sOiBodG1sMiwKICAgICAgaW1hZ2VSZWZlcmVuY2U6IGltYWdlUmVmZXJlbmNlMiwKICAgICAgaW1hZ2U6IGltYWdlMiwKICAgICAgaW5saW5lQ29kZTogaW5saW5lQ29kZTIsCiAgICAgIGxpbmtSZWZlcmVuY2U6IGxpbmtSZWZlcmVuY2UyLAogICAgICBsaW5rOiBsaW5rMiwKICAgICAgbGlzdEl0ZW06IGxpc3RJdGVtMiwKICAgICAgbGlzdDogbGlzdDQsCiAgICAgIHBhcmFncmFwaDogcGFyYWdyYXBoMiwKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogcm9vdCBpcyBkaWZmZXJlbnQsIGJ1dCBoYXJkIHRvIHR5cGUuCiAgICAgIHJvb3Q6IHJvb3QzLAogICAgICBzdHJvbmc6IHN0cm9uZzIsCiAgICAgIHRhYmxlLAogICAgICB0YWJsZUNlbGwsCiAgICAgIHRhYmxlUm93LAogICAgICB0ZXh0OiB0ZXh0NiwKICAgICAgdGhlbWF0aWNCcmVhazogdGhlbWF0aWNCcmVhazMsCiAgICAgIHRvbWw6IGlnbm9yZSwKICAgICAgeWFtbDogaWdub3JlLAogICAgICBkZWZpbml0aW9uOiBpZ25vcmUsCiAgICAgIGZvb3Rub3RlRGVmaW5pdGlvbjogaWdub3JlCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9mb290ZXIuanMKZnVuY3Rpb24gZGVmYXVsdEZvb3Rub3RlQmFja0NvbnRlbnQoXzUsIHJlcmVmZXJlbmNlSW5kZXgpIHsKICBjb25zdCByZXN1bHQgPSBbeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiXHUyMUE5IiB9XTsKICBpZiAocmVyZWZlcmVuY2VJbmRleCA+IDEpIHsKICAgIHJlc3VsdC5wdXNoKHsKICAgICAgdHlwZTogImVsZW1lbnQiLAogICAgICB0YWdOYW1lOiAic3VwIiwKICAgICAgcHJvcGVydGllczoge30sCiAgICAgIGNoaWxkcmVuOiBbeyB0eXBlOiAidGV4dCIsIHZhbHVlOiBTdHJpbmcocmVyZWZlcmVuY2VJbmRleCkgfV0KICAgIH0pOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CmZ1bmN0aW9uIGRlZmF1bHRGb290bm90ZUJhY2tMYWJlbChyZWZlcmVuY2VJbmRleCwgcmVyZWZlcmVuY2VJbmRleCkgewogIHJldHVybiAiQmFjayB0byByZWZlcmVuY2UgIiArIChyZWZlcmVuY2VJbmRleCArIDEpICsgKHJlcmVmZXJlbmNlSW5kZXggPiAxID8gIi0iICsgcmVyZWZlcmVuY2VJbmRleCA6ICIiKTsKfQpmdW5jdGlvbiBmb290ZXIoc3RhdGUxMCkgewogIGNvbnN0IGNsb2JiZXJQcmVmaXggPSB0eXBlb2Ygc3RhdGUxMC5vcHRpb25zLmNsb2JiZXJQcmVmaXggPT09ICJzdHJpbmciID8gc3RhdGUxMC5vcHRpb25zLmNsb2JiZXJQcmVmaXggOiAidXNlci1jb250ZW50LSI7CiAgY29uc3QgZm9vdG5vdGVCYWNrQ29udGVudCA9IHN0YXRlMTAub3B0aW9ucy5mb290bm90ZUJhY2tDb250ZW50IHx8IGRlZmF1bHRGb290bm90ZUJhY2tDb250ZW50OwogIGNvbnN0IGZvb3Rub3RlQmFja0xhYmVsID0gc3RhdGUxMC5vcHRpb25zLmZvb3Rub3RlQmFja0xhYmVsIHx8IGRlZmF1bHRGb290bm90ZUJhY2tMYWJlbDsKICBjb25zdCBmb290bm90ZUxhYmVsID0gc3RhdGUxMC5vcHRpb25zLmZvb3Rub3RlTGFiZWwgfHwgIkZvb3Rub3RlcyI7CiAgY29uc3QgZm9vdG5vdGVMYWJlbFRhZ05hbWUgPSBzdGF0ZTEwLm9wdGlvbnMuZm9vdG5vdGVMYWJlbFRhZ05hbWUgfHwgImgyIjsKICBjb25zdCBmb290bm90ZUxhYmVsUHJvcGVydGllcyA9IHN0YXRlMTAub3B0aW9ucy5mb290bm90ZUxhYmVsUHJvcGVydGllcyB8fCB7CiAgICBjbGFzc05hbWU6IFsic3Itb25seSJdCiAgfTsKICBjb25zdCBsaXN0SXRlbXMgPSBbXTsKICBsZXQgcmVmZXJlbmNlSW5kZXggPSAtMTsKICB3aGlsZSAoKytyZWZlcmVuY2VJbmRleCA8IHN0YXRlMTAuZm9vdG5vdGVPcmRlci5sZW5ndGgpIHsKICAgIGNvbnN0IGRlZmluaXRpb24zID0gc3RhdGUxMC5mb290bm90ZUJ5SWQuZ2V0KAogICAgICBzdGF0ZTEwLmZvb3Rub3RlT3JkZXJbcmVmZXJlbmNlSW5kZXhdCiAgICApOwogICAgaWYgKCFkZWZpbml0aW9uMykgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbnN0IGNvbnRlbnQzID0gc3RhdGUxMC5hbGwoZGVmaW5pdGlvbjMpOwogICAgY29uc3QgaWQgPSBTdHJpbmcoZGVmaW5pdGlvbjMuaWRlbnRpZmllcikudG9VcHBlckNhc2UoKTsKICAgIGNvbnN0IHNhZmVJZCA9IG5vcm1hbGl6ZVVyaShpZC50b0xvd2VyQ2FzZSgpKTsKICAgIGxldCByZXJlZmVyZW5jZUluZGV4ID0gMDsKICAgIGNvbnN0IGJhY2tSZWZlcmVuY2VzID0gW107CiAgICBjb25zdCBjb3VudHMgPSBzdGF0ZTEwLmZvb3Rub3RlQ291bnRzLmdldChpZCk7CiAgICB3aGlsZSAoY291bnRzICE9PSB2b2lkIDAgJiYgKytyZXJlZmVyZW5jZUluZGV4IDw9IGNvdW50cykgewogICAgICBpZiAoYmFja1JlZmVyZW5jZXMubGVuZ3RoID4gMCkgewogICAgICAgIGJhY2tSZWZlcmVuY2VzLnB1c2goeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiICIgfSk7CiAgICAgIH0KICAgICAgbGV0IGNoaWxkcmVuMiA9IHR5cGVvZiBmb290bm90ZUJhY2tDb250ZW50ID09PSAic3RyaW5nIiA/IGZvb3Rub3RlQmFja0NvbnRlbnQgOiBmb290bm90ZUJhY2tDb250ZW50KHJlZmVyZW5jZUluZGV4LCByZXJlZmVyZW5jZUluZGV4KTsKICAgICAgaWYgKHR5cGVvZiBjaGlsZHJlbjIgPT09ICJzdHJpbmciKSB7CiAgICAgICAgY2hpbGRyZW4yID0geyB0eXBlOiAidGV4dCIsIHZhbHVlOiBjaGlsZHJlbjIgfTsKICAgICAgfQogICAgICBiYWNrUmVmZXJlbmNlcy5wdXNoKHsKICAgICAgICB0eXBlOiAiZWxlbWVudCIsCiAgICAgICAgdGFnTmFtZTogImEiLAogICAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAgIGhyZWY6ICIjIiArIGNsb2JiZXJQcmVmaXggKyAiZm5yZWYtIiArIHNhZmVJZCArIChyZXJlZmVyZW5jZUluZGV4ID4gMSA/ICItIiArIHJlcmVmZXJlbmNlSW5kZXggOiAiIiksCiAgICAgICAgICBkYXRhRm9vdG5vdGVCYWNrcmVmOiAiIiwKICAgICAgICAgIGFyaWFMYWJlbDogdHlwZW9mIGZvb3Rub3RlQmFja0xhYmVsID09PSAic3RyaW5nIiA/IGZvb3Rub3RlQmFja0xhYmVsIDogZm9vdG5vdGVCYWNrTGFiZWwocmVmZXJlbmNlSW5kZXgsIHJlcmVmZXJlbmNlSW5kZXgpLAogICAgICAgICAgY2xhc3NOYW1lOiBbImRhdGEtZm9vdG5vdGUtYmFja3JlZiJdCiAgICAgICAgfSwKICAgICAgICBjaGlsZHJlbjogQXJyYXkuaXNBcnJheShjaGlsZHJlbjIpID8gY2hpbGRyZW4yIDogW2NoaWxkcmVuMl0KICAgICAgfSk7CiAgICB9CiAgICBjb25zdCB0YWlsID0gY29udGVudDNbY29udGVudDMubGVuZ3RoIC0gMV07CiAgICBpZiAodGFpbCAmJiB0YWlsLnR5cGUgPT09ICJlbGVtZW50IiAmJiB0YWlsLnRhZ05hbWUgPT09ICJwIikgewogICAgICBjb25zdCB0YWlsVGFpbCA9IHRhaWwuY2hpbGRyZW5bdGFpbC5jaGlsZHJlbi5sZW5ndGggLSAxXTsKICAgICAgaWYgKHRhaWxUYWlsICYmIHRhaWxUYWlsLnR5cGUgPT09ICJ0ZXh0IikgewogICAgICAgIHRhaWxUYWlsLnZhbHVlICs9ICIgIjsKICAgICAgfSBlbHNlIHsKICAgICAgICB0YWlsLmNoaWxkcmVuLnB1c2goeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiICIgfSk7CiAgICAgIH0KICAgICAgdGFpbC5jaGlsZHJlbi5wdXNoKC4uLmJhY2tSZWZlcmVuY2VzKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnRlbnQzLnB1c2goLi4uYmFja1JlZmVyZW5jZXMpOwogICAgfQogICAgY29uc3QgbGlzdEl0ZW0zID0gewogICAgICB0eXBlOiAiZWxlbWVudCIsCiAgICAgIHRhZ05hbWU6ICJsaSIsCiAgICAgIHByb3BlcnRpZXM6IHsgaWQ6IGNsb2JiZXJQcmVmaXggKyAiZm4tIiArIHNhZmVJZCB9LAogICAgICBjaGlsZHJlbjogc3RhdGUxMC53cmFwKGNvbnRlbnQzLCB0cnVlKQogICAgfTsKICAgIHN0YXRlMTAucGF0Y2goZGVmaW5pdGlvbjMsIGxpc3RJdGVtMyk7CiAgICBsaXN0SXRlbXMucHVzaChsaXN0SXRlbTMpOwogIH0KICBpZiAobGlzdEl0ZW1zLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuOwogIH0KICByZXR1cm4gewogICAgdHlwZTogImVsZW1lbnQiLAogICAgdGFnTmFtZTogInNlY3Rpb24iLAogICAgcHJvcGVydGllczogeyBkYXRhRm9vdG5vdGVzOiB0cnVlLCBjbGFzc05hbWU6IFsiZm9vdG5vdGVzIl0gfSwKICAgIGNoaWxkcmVuOiBbCiAgICAgIHsKICAgICAgICB0eXBlOiAiZWxlbWVudCIsCiAgICAgICAgdGFnTmFtZTogZm9vdG5vdGVMYWJlbFRhZ05hbWUsCiAgICAgICAgcHJvcGVydGllczogewogICAgICAgICAgLi4uZXNtX2RlZmF1bHQoZm9vdG5vdGVMYWJlbFByb3BlcnRpZXMpLAogICAgICAgICAgaWQ6ICJmb290bm90ZS1sYWJlbCIKICAgICAgICB9LAogICAgICAgIGNoaWxkcmVuOiBbeyB0eXBlOiAidGV4dCIsIHZhbHVlOiBmb290bm90ZUxhYmVsIH1dCiAgICAgIH0sCiAgICAgIHsgdHlwZTogInRleHQiLCB2YWx1ZTogIlxuIiB9LAogICAgICB7CiAgICAgICAgdHlwZTogImVsZW1lbnQiLAogICAgICAgIHRhZ05hbWU6ICJvbCIsCiAgICAgICAgcHJvcGVydGllczoge30sCiAgICAgICAgY2hpbGRyZW46IHN0YXRlMTAud3JhcChsaXN0SXRlbXMsIHRydWUpCiAgICAgIH0sCiAgICAgIHsgdHlwZTogInRleHQiLCB2YWx1ZTogIlxuIiB9CiAgICBdCiAgfTsKfQp2YXIgaW5pdF9mb290ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9tZGFzdC11dGlsLXRvLWhhc3RAMTMuMi4xL25vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2Zvb3Rlci5qcyIoKSB7CiAgICBpbml0X2VzbSgpOwogICAgaW5pdF9taWNyb21hcmtfdXRpbF9zYW5pdGl6ZV91cmkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvc3RhdGUuanMKZnVuY3Rpb24gY3JlYXRlU3RhdGUodHJlZSwgb3B0aW9ucykgewogIGNvbnN0IHNldHRpbmdzID0gb3B0aW9ucyB8fCBlbXB0eU9wdGlvbnM1OwogIGNvbnN0IGRlZmluaXRpb25CeUlkID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBjb25zdCBmb290bm90ZUJ5SWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogIGNvbnN0IGZvb3Rub3RlQ291bnRzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBjb25zdCBoYW5kbGVyczIgPSB7IC4uLmhhbmRsZXJzLCAuLi5zZXR0aW5ncy5oYW5kbGVycyB9OwogIGNvbnN0IHN0YXRlMTAgPSB7CiAgICBhbGw6IGFsbDMsCiAgICBhcHBseURhdGEsCiAgICBkZWZpbml0aW9uQnlJZCwKICAgIGZvb3Rub3RlQnlJZCwKICAgIGZvb3Rub3RlQ291bnRzLAogICAgZm9vdG5vdGVPcmRlcjogW10sCiAgICBoYW5kbGVyczogaGFuZGxlcnMyLAogICAgb25lOiBvbmUzLAogICAgb3B0aW9uczogc2V0dGluZ3MsCiAgICBwYXRjaDogcGF0Y2gyLAogICAgd3JhcDogd3JhcDMKICB9OwogIHZpc2l0KHRyZWUsIGZ1bmN0aW9uKG5vZGUyKSB7CiAgICBpZiAobm9kZTIudHlwZSA9PT0gImRlZmluaXRpb24iIHx8IG5vZGUyLnR5cGUgPT09ICJmb290bm90ZURlZmluaXRpb24iKSB7CiAgICAgIGNvbnN0IG1hcDcgPSBub2RlMi50eXBlID09PSAiZGVmaW5pdGlvbiIgPyBkZWZpbml0aW9uQnlJZCA6IGZvb3Rub3RlQnlJZDsKICAgICAgY29uc3QgaWQgPSBTdHJpbmcobm9kZTIuaWRlbnRpZmllcikudG9VcHBlckNhc2UoKTsKICAgICAgaWYgKCFtYXA3LmhhcyhpZCkpIHsKICAgICAgICBtYXA3LnNldChpZCwgbm9kZTIpOwogICAgICB9CiAgICB9CiAgfSk7CiAgcmV0dXJuIHN0YXRlMTA7CiAgZnVuY3Rpb24gb25lMyhub2RlMiwgcGFyZW50KSB7CiAgICBjb25zdCB0eXBlNSA9IG5vZGUyLnR5cGU7CiAgICBjb25zdCBoYW5kbGUzID0gc3RhdGUxMC5oYW5kbGVyc1t0eXBlNV07CiAgICBpZiAob3duOC5jYWxsKHN0YXRlMTAuaGFuZGxlcnMsIHR5cGU1KSAmJiBoYW5kbGUzKSB7CiAgICAgIHJldHVybiBoYW5kbGUzKHN0YXRlMTAsIG5vZGUyLCBwYXJlbnQpOwogICAgfQogICAgaWYgKHN0YXRlMTAub3B0aW9ucy5wYXNzVGhyb3VnaCAmJiBzdGF0ZTEwLm9wdGlvbnMucGFzc1Rocm91Z2guaW5jbHVkZXModHlwZTUpKSB7CiAgICAgIGlmICgiY2hpbGRyZW4iIGluIG5vZGUyKSB7CiAgICAgICAgY29uc3QgeyBjaGlsZHJlbjogY2hpbGRyZW4yLCAuLi5zaGFsbG93IH0gPSBub2RlMjsKICAgICAgICBjb25zdCByZXN1bHQgPSBlc21fZGVmYXVsdChzaGFsbG93KTsKICAgICAgICByZXN1bHQuY2hpbGRyZW4gPSBzdGF0ZTEwLmFsbChub2RlMik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICByZXR1cm4gZXNtX2RlZmF1bHQobm9kZTIpOwogICAgfQogICAgY29uc3QgdW5rbm93bjMgPSBzdGF0ZTEwLm9wdGlvbnMudW5rbm93bkhhbmRsZXIgfHwgZGVmYXVsdFVua25vd25IYW5kbGVyOwogICAgcmV0dXJuIHVua25vd24zKHN0YXRlMTAsIG5vZGUyLCBwYXJlbnQpOwogIH0KICBmdW5jdGlvbiBhbGwzKHBhcmVudCkgewogICAgY29uc3QgdmFsdWVzID0gW107CiAgICBpZiAoImNoaWxkcmVuIiBpbiBwYXJlbnQpIHsKICAgICAgY29uc3Qgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW47CiAgICAgIGxldCBpbmRleDIgPSAtMTsKICAgICAgd2hpbGUgKCsraW5kZXgyIDwgbm9kZXMubGVuZ3RoKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gc3RhdGUxMC5vbmUobm9kZXNbaW5kZXgyXSwgcGFyZW50KTsKICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICBpZiAoaW5kZXgyICYmIG5vZGVzW2luZGV4MiAtIDFdLnR5cGUgPT09ICJicmVhayIpIHsKICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgcmVzdWx0LnR5cGUgPT09ICJ0ZXh0IikgewogICAgICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHRyaW1NYXJrZG93blNwYWNlU3RhcnQocmVzdWx0LnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiByZXN1bHQudHlwZSA9PT0gImVsZW1lbnQiKSB7CiAgICAgICAgICAgICAgY29uc3QgaGVhZDIgPSByZXN1bHQuY2hpbGRyZW5bMF07CiAgICAgICAgICAgICAgaWYgKGhlYWQyICYmIGhlYWQyLnR5cGUgPT09ICJ0ZXh0IikgewogICAgICAgICAgICAgICAgaGVhZDIudmFsdWUgPSB0cmltTWFya2Rvd25TcGFjZVN0YXJ0KGhlYWQyLnZhbHVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHsKICAgICAgICAgICAgdmFsdWVzLnB1c2goLi4ucmVzdWx0KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHJlc3VsdCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWVzOwogIH0KfQpmdW5jdGlvbiBwYXRjaDIoZnJvbTIsIHRvKSB7CiAgaWYgKGZyb20yLnBvc2l0aW9uKSB0by5wb3NpdGlvbiA9IHBvc2l0aW9uMihmcm9tMik7Cn0KZnVuY3Rpb24gYXBwbHlEYXRhKGZyb20yLCB0bykgewogIGxldCByZXN1bHQgPSB0bzsKICBpZiAoZnJvbTIgJiYgZnJvbTIuZGF0YSkgewogICAgY29uc3QgaE5hbWUgPSBmcm9tMi5kYXRhLmhOYW1lOwogICAgY29uc3QgaENoaWxkcmVuID0gZnJvbTIuZGF0YS5oQ2hpbGRyZW47CiAgICBjb25zdCBoUHJvcGVydGllcyA9IGZyb20yLmRhdGEuaFByb3BlcnRpZXM7CiAgICBpZiAodHlwZW9mIGhOYW1lID09PSAic3RyaW5nIikgewogICAgICBpZiAocmVzdWx0LnR5cGUgPT09ICJlbGVtZW50IikgewogICAgICAgIHJlc3VsdC50YWdOYW1lID0gaE5hbWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgY2hpbGRyZW4yID0gImNoaWxkcmVuIiBpbiByZXN1bHQgPyByZXN1bHQuY2hpbGRyZW4gOiBbcmVzdWx0XTsKICAgICAgICByZXN1bHQgPSB7IHR5cGU6ICJlbGVtZW50IiwgdGFnTmFtZTogaE5hbWUsIHByb3BlcnRpZXM6IHt9LCBjaGlsZHJlbjogY2hpbGRyZW4yIH07CiAgICAgIH0KICAgIH0KICAgIGlmIChyZXN1bHQudHlwZSA9PT0gImVsZW1lbnQiICYmIGhQcm9wZXJ0aWVzKSB7CiAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LnByb3BlcnRpZXMsIGVzbV9kZWZhdWx0KGhQcm9wZXJ0aWVzKSk7CiAgICB9CiAgICBpZiAoImNoaWxkcmVuIiBpbiByZXN1bHQgJiYgcmVzdWx0LmNoaWxkcmVuICYmIGhDaGlsZHJlbiAhPT0gbnVsbCAmJiBoQ2hpbGRyZW4gIT09IHZvaWQgMCkgewogICAgICByZXN1bHQuY2hpbGRyZW4gPSBoQ2hpbGRyZW47CiAgICB9CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gZGVmYXVsdFVua25vd25IYW5kbGVyKHN0YXRlMTAsIG5vZGUyKSB7CiAgY29uc3QgZGF0YSA9IG5vZGUyLmRhdGEgfHwge307CiAgY29uc3QgcmVzdWx0ID0gInZhbHVlIiBpbiBub2RlMiAmJiAhKG93bjguY2FsbChkYXRhLCAiaFByb3BlcnRpZXMiKSB8fCBvd244LmNhbGwoZGF0YSwgImhDaGlsZHJlbiIpKSA/IHsgdHlwZTogInRleHQiLCB2YWx1ZTogbm9kZTIudmFsdWUgfSA6IHsKICAgIHR5cGU6ICJlbGVtZW50IiwKICAgIHRhZ05hbWU6ICJkaXYiLAogICAgcHJvcGVydGllczoge30sCiAgICBjaGlsZHJlbjogc3RhdGUxMC5hbGwobm9kZTIpCiAgfTsKICBzdGF0ZTEwLnBhdGNoKG5vZGUyLCByZXN1bHQpOwogIHJldHVybiBzdGF0ZTEwLmFwcGx5RGF0YShub2RlMiwgcmVzdWx0KTsKfQpmdW5jdGlvbiB3cmFwMyhub2RlcywgbG9vc2UpIHsKICBjb25zdCByZXN1bHQgPSBbXTsKICBsZXQgaW5kZXgyID0gLTE7CiAgaWYgKGxvb3NlKSB7CiAgICByZXN1bHQucHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6ICJcbiIgfSk7CiAgfQogIHdoaWxlICgrK2luZGV4MiA8IG5vZGVzLmxlbmd0aCkgewogICAgaWYgKGluZGV4MikgcmVzdWx0LnB1c2goeyB0eXBlOiAidGV4dCIsIHZhbHVlOiAiXG4iIH0pOwogICAgcmVzdWx0LnB1c2gobm9kZXNbaW5kZXgyXSk7CiAgfQogIGlmIChsb29zZSAmJiBub2Rlcy5sZW5ndGggPiAwKSB7CiAgICByZXN1bHQucHVzaCh7IHR5cGU6ICJ0ZXh0IiwgdmFsdWU6ICJcbiIgfSk7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gdHJpbU1hcmtkb3duU3BhY2VTdGFydCh2YWx1ZTIpIHsKICBsZXQgaW5kZXgyID0gMDsKICBsZXQgY29kZTQgPSB2YWx1ZTIuY2hhckNvZGVBdChpbmRleDIpOwogIHdoaWxlIChjb2RlNCA9PT0gOSB8fCBjb2RlNCA9PT0gMzIpIHsKICAgIGluZGV4MisrOwogICAgY29kZTQgPSB2YWx1ZTIuY2hhckNvZGVBdChpbmRleDIpOwogIH0KICByZXR1cm4gdmFsdWUyLnNsaWNlKGluZGV4Mik7Cn0KdmFyIG93bjgsIGVtcHR5T3B0aW9uczU7CnZhciBpbml0X3N0YXRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9zdGF0ZS5qcyIoKSB7CiAgICBpbml0X2VzbSgpOwogICAgaW5pdF91bmlzdF91dGlsX3Zpc2l0KCk7CiAgICBpbml0X3VuaXN0X3V0aWxfcG9zaXRpb24oKTsKICAgIGluaXRfaGFuZGxlcnMoKTsKICAgIG93bjggPSB7fS5oYXNPd25Qcm9wZXJ0eTsKICAgIGVtcHR5T3B0aW9uczUgPSB7fTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaW5kZXguanMKZnVuY3Rpb24gdG9IYXN0KHRyZWUsIG9wdGlvbnMpIHsKICBjb25zdCBzdGF0ZTEwID0gY3JlYXRlU3RhdGUodHJlZSwgb3B0aW9ucyk7CiAgY29uc3Qgbm9kZTIgPSBzdGF0ZTEwLm9uZSh0cmVlLCB2b2lkIDApOwogIGNvbnN0IGZvb3QgPSBmb290ZXIoc3RhdGUxMCk7CiAgY29uc3QgcmVzdWx0ID0gQXJyYXkuaXNBcnJheShub2RlMikgPyB7IHR5cGU6ICJyb290IiwgY2hpbGRyZW46IG5vZGUyIH0gOiBub2RlMiB8fCB7IHR5cGU6ICJyb290IiwgY2hpbGRyZW46IFtdIH07CiAgaWYgKGZvb3QpIHsKICAgIG9rKCJjaGlsZHJlbiIgaW4gcmVzdWx0KTsKICAgIHJlc3VsdC5jaGlsZHJlbi5wdXNoKHsgdHlwZTogInRleHQiLCB2YWx1ZTogIlxuIiB9LCBmb290KTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQp2YXIgaW5pdF9saWIyNyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaW5kZXguanMiKCkgewogICAgaW5pdF9kZWZhdWx0KCk7CiAgICBpbml0X2Zvb3RlcigpOwogICAgaW5pdF9zdGF0ZSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbWRhc3QtdXRpbC10by1oYXN0QDEzLjIuMS9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2luZGV4LmpzCnZhciBpbml0X21kYXN0X3V0aWxfdG9faGFzdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL21kYXN0LXV0aWwtdG8taGFzdEAxMy4yLjEvbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9pbmRleC5qcyIoKSB7CiAgICBpbml0X2hhbmRsZXJzKCk7CiAgICBpbml0X2xpYjI3KCk7CiAgICBpbml0X2Zvb3RlcigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaHRtbC12b2lkLWVsZW1lbnRzQDMuMC4wL25vZGVfbW9kdWxlcy9odG1sLXZvaWQtZWxlbWVudHMvaW5kZXguanMKdmFyIGh0bWxWb2lkRWxlbWVudHM7CnZhciBpbml0X2h0bWxfdm9pZF9lbGVtZW50cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2h0bWwtdm9pZC1lbGVtZW50c0AzLjAuMC9ub2RlX21vZHVsZXMvaHRtbC12b2lkLWVsZW1lbnRzL2luZGV4LmpzIigpIHsKICAgIGh0bWxWb2lkRWxlbWVudHMgPSBbCiAgICAgICJhcmVhIiwKICAgICAgImJhc2UiLAogICAgICAiYmFzZWZvbnQiLAogICAgICAiYmdzb3VuZCIsCiAgICAgICJiciIsCiAgICAgICJjb2wiLAogICAgICAiY29tbWFuZCIsCiAgICAgICJlbWJlZCIsCiAgICAgICJmcmFtZSIsCiAgICAgICJociIsCiAgICAgICJpbWFnZSIsCiAgICAgICJpbWciLAogICAgICAiaW5wdXQiLAogICAgICAia2V5Z2VuIiwKICAgICAgImxpbmsiLAogICAgICAibWV0YSIsCiAgICAgICJwYXJhbSIsCiAgICAgICJzb3VyY2UiLAogICAgICAidHJhY2siLAogICAgICAid2JyIgogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvdXRpbC9zY2hlbWEuanMKdmFyIFNjaGVtYTsKdmFyIGluaXRfc2NoZW1hMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvdXRpbC9zY2hlbWEuanMiKCkgewogICAgU2NoZW1hID0gY2xhc3MgewogICAgICAvKioKICAgICAgICogQHBhcmFtIHtTY2hlbWFUeXBlWydwcm9wZXJ0eSddfSBwcm9wZXJ0eQogICAgICAgKiAgIFByb3BlcnR5LgogICAgICAgKiBAcGFyYW0ge1NjaGVtYVR5cGVbJ25vcm1hbCddfSBub3JtYWwKICAgICAgICogICBOb3JtYWwuCiAgICAgICAqIEBwYXJhbSB7U3BhY2UgfCB1bmRlZmluZWR9IFtzcGFjZV0KICAgICAgICogICBTcGFjZS4KICAgICAgICogQHJldHVybnMKICAgICAgICogICBTY2hlbWEuCiAgICAgICAqLwogICAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTksIG5vcm1hbCwgc3BhY2UyKSB7CiAgICAgICAgdGhpcy5ub3JtYWwgPSBub3JtYWw7CiAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OTsKICAgICAgICBpZiAoc3BhY2UyKSB7CiAgICAgICAgICB0aGlzLnNwYWNlID0gc3BhY2UyOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIFNjaGVtYS5wcm90b3R5cGUubm9ybWFsID0ge307CiAgICBTY2hlbWEucHJvdG90eXBlLnByb3BlcnR5ID0ge307CiAgICBTY2hlbWEucHJvdG90eXBlLnNwYWNlID0gdm9pZCAwOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi91dGlsL21lcmdlLmpzCmZ1bmN0aW9uIG1lcmdlMyhkZWZpbml0aW9ucywgc3BhY2UyKSB7CiAgY29uc3QgcHJvcGVydHk5ID0ge307CiAgY29uc3Qgbm9ybWFsID0ge307CiAgZm9yIChjb25zdCBkZWZpbml0aW9uMyBvZiBkZWZpbml0aW9ucykgewogICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0eTksIGRlZmluaXRpb24zLnByb3BlcnR5KTsKICAgIE9iamVjdC5hc3NpZ24obm9ybWFsLCBkZWZpbml0aW9uMy5ub3JtYWwpOwogIH0KICByZXR1cm4gbmV3IFNjaGVtYShwcm9wZXJ0eTksIG5vcm1hbCwgc3BhY2UyKTsKfQp2YXIgaW5pdF9tZXJnZTMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvbWVyZ2UuanMiKCkgewogICAgaW5pdF9zY2hlbWEyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL25vcm1hbGl6ZS5qcwpmdW5jdGlvbiBub3JtYWxpemUzKHZhbHVlMikgewogIHJldHVybiB2YWx1ZTIudG9Mb3dlckNhc2UoKTsKfQp2YXIgaW5pdF9ub3JtYWxpemUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL25vcm1hbGl6ZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvaW5mby5qcwp2YXIgSW5mbzsKdmFyIGluaXRfaW5mbyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvdXRpbC9pbmZvLmpzIigpIHsKICAgIEluZm8gPSBjbGFzcyB7CiAgICAgIC8qKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkKICAgICAgICogICBQcm9wZXJ0eS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZQogICAgICAgKiAgIEF0dHJpYnV0ZS4KICAgICAgICogQHJldHVybnMKICAgICAgICogICBJbmZvLgogICAgICAgKi8KICAgICAgY29uc3RydWN0b3IocHJvcGVydHk5LCBhdHRyaWJ1dGUpIHsKICAgICAgICB0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk5OwogICAgICB9CiAgICB9OwogICAgSW5mby5wcm90b3R5cGUuYXR0cmlidXRlID0gIiI7CiAgICBJbmZvLnByb3RvdHlwZS5ib29sZWFuaXNoID0gZmFsc2U7CiAgICBJbmZvLnByb3RvdHlwZS5ib29sZWFuID0gZmFsc2U7CiAgICBJbmZvLnByb3RvdHlwZS5jb21tYU9yU3BhY2VTZXBhcmF0ZWQgPSBmYWxzZTsKICAgIEluZm8ucHJvdG90eXBlLmNvbW1hU2VwYXJhdGVkID0gZmFsc2U7CiAgICBJbmZvLnByb3RvdHlwZS5kZWZpbmVkID0gZmFsc2U7CiAgICBJbmZvLnByb3RvdHlwZS5tdXN0VXNlUHJvcGVydHkgPSBmYWxzZTsKICAgIEluZm8ucHJvdG90eXBlLm51bWJlciA9IGZhbHNlOwogICAgSW5mby5wcm90b3R5cGUub3ZlcmxvYWRlZEJvb2xlYW4gPSBmYWxzZTsKICAgIEluZm8ucHJvdG90eXBlLnByb3BlcnR5ID0gIiI7CiAgICBJbmZvLnByb3RvdHlwZS5zcGFjZVNlcGFyYXRlZCA9IGZhbHNlOwogICAgSW5mby5wcm90b3R5cGUuc3BhY2UgPSB2b2lkIDA7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvdHlwZXMuanMKdmFyIHR5cGVzX2V4cG9ydHMgPSB7fTsKX19leHBvcnQodHlwZXNfZXhwb3J0cywgewogIGJvb2xlYW46ICgpID0+IGJvb2xlYW4sCiAgYm9vbGVhbmlzaDogKCkgPT4gYm9vbGVhbmlzaCwKICBjb21tYU9yU3BhY2VTZXBhcmF0ZWQ6ICgpID0+IGNvbW1hT3JTcGFjZVNlcGFyYXRlZCwKICBjb21tYVNlcGFyYXRlZDogKCkgPT4gY29tbWFTZXBhcmF0ZWQsCiAgbnVtYmVyOiAoKSA9PiBudW1iZXIsCiAgb3ZlcmxvYWRlZEJvb2xlYW46ICgpID0+IG92ZXJsb2FkZWRCb29sZWFuLAogIHNwYWNlU2VwYXJhdGVkOiAoKSA9PiBzcGFjZVNlcGFyYXRlZAp9KTsKZnVuY3Rpb24gaW5jcmVtZW50KCkgewogIHJldHVybiAyICoqICsrcG93ZXJzOwp9CnZhciBwb3dlcnMsIGJvb2xlYW4sIGJvb2xlYW5pc2gsIG92ZXJsb2FkZWRCb29sZWFuLCBudW1iZXIsIHNwYWNlU2VwYXJhdGVkLCBjb21tYVNlcGFyYXRlZCwgY29tbWFPclNwYWNlU2VwYXJhdGVkOwp2YXIgaW5pdF90eXBlczMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvdHlwZXMuanMiKCkgewogICAgcG93ZXJzID0gMDsKICAgIGJvb2xlYW4gPSBpbmNyZW1lbnQoKTsKICAgIGJvb2xlYW5pc2ggPSBpbmNyZW1lbnQoKTsKICAgIG92ZXJsb2FkZWRCb29sZWFuID0gaW5jcmVtZW50KCk7CiAgICBudW1iZXIgPSBpbmNyZW1lbnQoKTsKICAgIHNwYWNlU2VwYXJhdGVkID0gaW5jcmVtZW50KCk7CiAgICBjb21tYVNlcGFyYXRlZCA9IGluY3JlbWVudCgpOwogICAgY29tbWFPclNwYWNlU2VwYXJhdGVkID0gaW5jcmVtZW50KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvZGVmaW5lZC1pbmZvLmpzCmZ1bmN0aW9uIG1hcmsodmFsdWVzLCBrZXkyLCB2YWx1ZTIpIHsKICBpZiAodmFsdWUyKSB7CiAgICB2YWx1ZXNba2V5Ml0gPSB2YWx1ZTI7CiAgfQp9CnZhciBjaGVja3MsIERlZmluZWRJbmZvOwp2YXIgaW5pdF9kZWZpbmVkX2luZm8gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvZGVmaW5lZC1pbmZvLmpzIigpIHsKICAgIGluaXRfaW5mbygpOwogICAgaW5pdF90eXBlczMoKTsKICAgIGNoZWNrcyA9IC8qKiBAdHlwZSB7UmVhZG9ubHlBcnJheTxrZXlvZiB0eXBlb2YgdHlwZXM+fSAqLwogICAgT2JqZWN0LmtleXModHlwZXNfZXhwb3J0cyk7CiAgICBEZWZpbmVkSW5mbyA9IGNsYXNzIGV4dGVuZHMgSW5mbyB7CiAgICAgIC8qKgogICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5CiAgICAgICAqICAgUHJvcGVydHkuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUKICAgICAgICogICBBdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gW21hc2tdCiAgICAgICAqICAgTWFzay4KICAgICAgICogQHBhcmFtIHtTcGFjZSB8IHVuZGVmaW5lZH0gW3NwYWNlXQogICAgICAgKiAgIFNwYWNlLgogICAgICAgKiBAcmV0dXJucwogICAgICAgKiAgIEluZm8uCiAgICAgICAqLwogICAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTksIGF0dHJpYnV0ZSwgbWFzaywgc3BhY2UyKSB7CiAgICAgICAgbGV0IGluZGV4MiA9IC0xOwogICAgICAgIHN1cGVyKHByb3BlcnR5OSwgYXR0cmlidXRlKTsKICAgICAgICBtYXJrKHRoaXMsICJzcGFjZSIsIHNwYWNlMik7CiAgICAgICAgaWYgKHR5cGVvZiBtYXNrID09PSAibnVtYmVyIikgewogICAgICAgICAgd2hpbGUgKCsraW5kZXgyIDwgY2hlY2tzLmxlbmd0aCkgewogICAgICAgICAgICBjb25zdCBjaGVjayA9IGNoZWNrc1tpbmRleDJdOwogICAgICAgICAgICBtYXJrKHRoaXMsIGNoZWNrc1tpbmRleDJdLCAobWFzayAmIHR5cGVzX2V4cG9ydHNbY2hlY2tdKSA9PT0gdHlwZXNfZXhwb3J0c1tjaGVja10pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIERlZmluZWRJbmZvLnByb3RvdHlwZS5kZWZpbmVkID0gdHJ1ZTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvdXRpbC9jcmVhdGUuanMKZnVuY3Rpb24gY3JlYXRlNihkZWZpbml0aW9uMykgewogIGNvbnN0IHByb3BlcnRpZXMyID0ge307CiAgY29uc3Qgbm9ybWFscyA9IHt9OwogIGZvciAoY29uc3QgW3Byb3BlcnR5OSwgdmFsdWUyXSBvZiBPYmplY3QuZW50cmllcyhkZWZpbml0aW9uMy5wcm9wZXJ0aWVzKSkgewogICAgY29uc3QgaW5mbyA9IG5ldyBEZWZpbmVkSW5mbygKICAgICAgcHJvcGVydHk5LAogICAgICBkZWZpbml0aW9uMy50cmFuc2Zvcm0oZGVmaW5pdGlvbjMuYXR0cmlidXRlcyB8fCB7fSwgcHJvcGVydHk5KSwKICAgICAgdmFsdWUyLAogICAgICBkZWZpbml0aW9uMy5zcGFjZQogICAgKTsKICAgIGlmIChkZWZpbml0aW9uMy5tdXN0VXNlUHJvcGVydHkgJiYgZGVmaW5pdGlvbjMubXVzdFVzZVByb3BlcnR5LmluY2x1ZGVzKHByb3BlcnR5OSkpIHsKICAgICAgaW5mby5tdXN0VXNlUHJvcGVydHkgPSB0cnVlOwogICAgfQogICAgcHJvcGVydGllczJbcHJvcGVydHk5XSA9IGluZm87CiAgICBub3JtYWxzW25vcm1hbGl6ZTMocHJvcGVydHk5KV0gPSBwcm9wZXJ0eTk7CiAgICBub3JtYWxzW25vcm1hbGl6ZTMoaW5mby5hdHRyaWJ1dGUpXSA9IHByb3BlcnR5OTsKICB9CiAgcmV0dXJuIG5ldyBTY2hlbWEocHJvcGVydGllczIsIG5vcm1hbHMsIGRlZmluaXRpb24zLnNwYWNlKTsKfQp2YXIgaW5pdF9jcmVhdGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvY3JlYXRlLmpzIigpIHsKICAgIGluaXRfbm9ybWFsaXplKCk7CiAgICBpbml0X2RlZmluZWRfaW5mbygpOwogICAgaW5pdF9zY2hlbWEyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL2FyaWEuanMKdmFyIGFyaWEyOwp2YXIgaW5pdF9hcmlhID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi9hcmlhLmpzIigpIHsKICAgIGluaXRfY3JlYXRlKCk7CiAgICBpbml0X3R5cGVzMygpOwogICAgYXJpYTIgPSBjcmVhdGU2KHsKICAgICAgcHJvcGVydGllczogewogICAgICAgIGFyaWFBY3RpdmVEZXNjZW5kYW50OiBudWxsLAogICAgICAgIGFyaWFBdG9taWM6IGJvb2xlYW5pc2gsCiAgICAgICAgYXJpYUF1dG9Db21wbGV0ZTogbnVsbCwKICAgICAgICBhcmlhQnVzeTogYm9vbGVhbmlzaCwKICAgICAgICBhcmlhQ2hlY2tlZDogYm9vbGVhbmlzaCwKICAgICAgICBhcmlhQ29sQ291bnQ6IG51bWJlciwKICAgICAgICBhcmlhQ29sSW5kZXg6IG51bWJlciwKICAgICAgICBhcmlhQ29sU3BhbjogbnVtYmVyLAogICAgICAgIGFyaWFDb250cm9sczogc3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgYXJpYUN1cnJlbnQ6IG51bGwsCiAgICAgICAgYXJpYURlc2NyaWJlZEJ5OiBzcGFjZVNlcGFyYXRlZCwKICAgICAgICBhcmlhRGV0YWlsczogbnVsbCwKICAgICAgICBhcmlhRGlzYWJsZWQ6IGJvb2xlYW5pc2gsCiAgICAgICAgYXJpYURyb3BFZmZlY3Q6IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIGFyaWFFcnJvck1lc3NhZ2U6IG51bGwsCiAgICAgICAgYXJpYUV4cGFuZGVkOiBib29sZWFuaXNoLAogICAgICAgIGFyaWFGbG93VG86IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIGFyaWFHcmFiYmVkOiBib29sZWFuaXNoLAogICAgICAgIGFyaWFIYXNQb3B1cDogbnVsbCwKICAgICAgICBhcmlhSGlkZGVuOiBib29sZWFuaXNoLAogICAgICAgIGFyaWFJbnZhbGlkOiBudWxsLAogICAgICAgIGFyaWFLZXlTaG9ydGN1dHM6IG51bGwsCiAgICAgICAgYXJpYUxhYmVsOiBudWxsLAogICAgICAgIGFyaWFMYWJlbGxlZEJ5OiBzcGFjZVNlcGFyYXRlZCwKICAgICAgICBhcmlhTGV2ZWw6IG51bWJlciwKICAgICAgICBhcmlhTGl2ZTogbnVsbCwKICAgICAgICBhcmlhTW9kYWw6IGJvb2xlYW5pc2gsCiAgICAgICAgYXJpYU11bHRpTGluZTogYm9vbGVhbmlzaCwKICAgICAgICBhcmlhTXVsdGlTZWxlY3RhYmxlOiBib29sZWFuaXNoLAogICAgICAgIGFyaWFPcmllbnRhdGlvbjogbnVsbCwKICAgICAgICBhcmlhT3duczogc3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgYXJpYVBsYWNlaG9sZGVyOiBudWxsLAogICAgICAgIGFyaWFQb3NJblNldDogbnVtYmVyLAogICAgICAgIGFyaWFQcmVzc2VkOiBib29sZWFuaXNoLAogICAgICAgIGFyaWFSZWFkT25seTogYm9vbGVhbmlzaCwKICAgICAgICBhcmlhUmVsZXZhbnQ6IG51bGwsCiAgICAgICAgYXJpYVJlcXVpcmVkOiBib29sZWFuaXNoLAogICAgICAgIGFyaWFSb2xlRGVzY3JpcHRpb246IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIGFyaWFSb3dDb3VudDogbnVtYmVyLAogICAgICAgIGFyaWFSb3dJbmRleDogbnVtYmVyLAogICAgICAgIGFyaWFSb3dTcGFuOiBudW1iZXIsCiAgICAgICAgYXJpYVNlbGVjdGVkOiBib29sZWFuaXNoLAogICAgICAgIGFyaWFTZXRTaXplOiBudW1iZXIsCiAgICAgICAgYXJpYVNvcnQ6IG51bGwsCiAgICAgICAgYXJpYVZhbHVlTWF4OiBudW1iZXIsCiAgICAgICAgYXJpYVZhbHVlTWluOiBudW1iZXIsCiAgICAgICAgYXJpYVZhbHVlTm93OiBudW1iZXIsCiAgICAgICAgYXJpYVZhbHVlVGV4dDogbnVsbCwKICAgICAgICByb2xlOiBudWxsCiAgICAgIH0sCiAgICAgIHRyYW5zZm9ybShfNSwgcHJvcGVydHk5KSB7CiAgICAgICAgcmV0dXJuIHByb3BlcnR5OSA9PT0gInJvbGUiID8gcHJvcGVydHk5IDogImFyaWEtIiArIHByb3BlcnR5OS5zbGljZSg0KS50b0xvd2VyQ2FzZSgpOwogICAgICB9CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvdXRpbC9jYXNlLXNlbnNpdGl2ZS10cmFuc2Zvcm0uanMKZnVuY3Rpb24gY2FzZVNlbnNpdGl2ZVRyYW5zZm9ybShhdHRyaWJ1dGVzLCBhdHRyaWJ1dGUpIHsKICByZXR1cm4gYXR0cmlidXRlIGluIGF0dHJpYnV0ZXMgPyBhdHRyaWJ1dGVzW2F0dHJpYnV0ZV0gOiBhdHRyaWJ1dGU7Cn0KdmFyIGluaXRfY2FzZV9zZW5zaXRpdmVfdHJhbnNmb3JtID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi91dGlsL2Nhc2Utc2Vuc2l0aXZlLXRyYW5zZm9ybS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3V0aWwvY2FzZS1pbnNlbnNpdGl2ZS10cmFuc2Zvcm0uanMKZnVuY3Rpb24gY2FzZUluc2Vuc2l0aXZlVHJhbnNmb3JtKGF0dHJpYnV0ZXMsIHByb3BlcnR5OSkgewogIHJldHVybiBjYXNlU2Vuc2l0aXZlVHJhbnNmb3JtKGF0dHJpYnV0ZXMsIHByb3BlcnR5OS50b0xvd2VyQ2FzZSgpKTsKfQp2YXIgaW5pdF9jYXNlX2luc2Vuc2l0aXZlX3RyYW5zZm9ybSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvdXRpbC9jYXNlLWluc2Vuc2l0aXZlLXRyYW5zZm9ybS5qcyIoKSB7CiAgICBpbml0X2Nhc2Vfc2Vuc2l0aXZlX3RyYW5zZm9ybSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi9odG1sLmpzCnZhciBodG1sMzsKdmFyIGluaXRfaHRtbDkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL2h0bWwuanMiKCkgewogICAgaW5pdF9jYXNlX2luc2Vuc2l0aXZlX3RyYW5zZm9ybSgpOwogICAgaW5pdF9jcmVhdGUoKTsKICAgIGluaXRfdHlwZXMzKCk7CiAgICBodG1sMyA9IGNyZWF0ZTYoewogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgYWNjZXB0Y2hhcnNldDogImFjY2VwdC1jaGFyc2V0IiwKICAgICAgICBjbGFzc25hbWU6ICJjbGFzcyIsCiAgICAgICAgaHRtbGZvcjogImZvciIsCiAgICAgICAgaHR0cGVxdWl2OiAiaHR0cC1lcXVpdiIKICAgICAgfSwKICAgICAgbXVzdFVzZVByb3BlcnR5OiBbImNoZWNrZWQiLCAibXVsdGlwbGUiLCAibXV0ZWQiLCAic2VsZWN0ZWQiXSwKICAgICAgcHJvcGVydGllczogewogICAgICAgIC8vIFN0YW5kYXJkIFByb3BlcnRpZXMuCiAgICAgICAgYWJicjogbnVsbCwKICAgICAgICBhY2NlcHQ6IGNvbW1hU2VwYXJhdGVkLAogICAgICAgIGFjY2VwdENoYXJzZXQ6IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIGFjY2Vzc0tleTogc3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgYWN0aW9uOiBudWxsLAogICAgICAgIGFsbG93OiBudWxsLAogICAgICAgIGFsbG93RnVsbFNjcmVlbjogYm9vbGVhbiwKICAgICAgICBhbGxvd1BheW1lbnRSZXF1ZXN0OiBib29sZWFuLAogICAgICAgIGFsbG93VXNlck1lZGlhOiBib29sZWFuLAogICAgICAgIGFsdDogbnVsbCwKICAgICAgICBhczogbnVsbCwKICAgICAgICBhc3luYzogYm9vbGVhbiwKICAgICAgICBhdXRvQ2FwaXRhbGl6ZTogbnVsbCwKICAgICAgICBhdXRvQ29tcGxldGU6IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIGF1dG9Gb2N1czogYm9vbGVhbiwKICAgICAgICBhdXRvUGxheTogYm9vbGVhbiwKICAgICAgICBibG9ja2luZzogc3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgY2FwdHVyZTogbnVsbCwKICAgICAgICBjaGFyU2V0OiBudWxsLAogICAgICAgIGNoZWNrZWQ6IGJvb2xlYW4sCiAgICAgICAgY2l0ZTogbnVsbCwKICAgICAgICBjbGFzc05hbWU6IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIGNvbHM6IG51bWJlciwKICAgICAgICBjb2xTcGFuOiBudWxsLAogICAgICAgIGNvbnRlbnQ6IG51bGwsCiAgICAgICAgY29udGVudEVkaXRhYmxlOiBib29sZWFuaXNoLAogICAgICAgIGNvbnRyb2xzOiBib29sZWFuLAogICAgICAgIGNvbnRyb2xzTGlzdDogc3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgY29vcmRzOiBudW1iZXIgfCBjb21tYVNlcGFyYXRlZCwKICAgICAgICBjcm9zc09yaWdpbjogbnVsbCwKICAgICAgICBkYXRhOiBudWxsLAogICAgICAgIGRhdGVUaW1lOiBudWxsLAogICAgICAgIGRlY29kaW5nOiBudWxsLAogICAgICAgIGRlZmF1bHQ6IGJvb2xlYW4sCiAgICAgICAgZGVmZXI6IGJvb2xlYW4sCiAgICAgICAgZGlyOiBudWxsLAogICAgICAgIGRpck5hbWU6IG51bGwsCiAgICAgICAgZGlzYWJsZWQ6IGJvb2xlYW4sCiAgICAgICAgZG93bmxvYWQ6IG92ZXJsb2FkZWRCb29sZWFuLAogICAgICAgIGRyYWdnYWJsZTogYm9vbGVhbmlzaCwKICAgICAgICBlbmNUeXBlOiBudWxsLAogICAgICAgIGVudGVyS2V5SGludDogbnVsbCwKICAgICAgICBmZXRjaFByaW9yaXR5OiBudWxsLAogICAgICAgIGZvcm06IG51bGwsCiAgICAgICAgZm9ybUFjdGlvbjogbnVsbCwKICAgICAgICBmb3JtRW5jVHlwZTogbnVsbCwKICAgICAgICBmb3JtTWV0aG9kOiBudWxsLAogICAgICAgIGZvcm1Ob1ZhbGlkYXRlOiBib29sZWFuLAogICAgICAgIGZvcm1UYXJnZXQ6IG51bGwsCiAgICAgICAgaGVhZGVyczogc3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgaGVpZ2h0OiBudW1iZXIsCiAgICAgICAgaGlkZGVuOiBvdmVybG9hZGVkQm9vbGVhbiwKICAgICAgICBoaWdoOiBudW1iZXIsCiAgICAgICAgaHJlZjogbnVsbCwKICAgICAgICBocmVmTGFuZzogbnVsbCwKICAgICAgICBodG1sRm9yOiBzcGFjZVNlcGFyYXRlZCwKICAgICAgICBodHRwRXF1aXY6IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIGlkOiBudWxsLAogICAgICAgIGltYWdlU2l6ZXM6IG51bGwsCiAgICAgICAgaW1hZ2VTcmNTZXQ6IG51bGwsCiAgICAgICAgaW5lcnQ6IGJvb2xlYW4sCiAgICAgICAgaW5wdXRNb2RlOiBudWxsLAogICAgICAgIGludGVncml0eTogbnVsbCwKICAgICAgICBpczogbnVsbCwKICAgICAgICBpc01hcDogYm9vbGVhbiwKICAgICAgICBpdGVtSWQ6IG51bGwsCiAgICAgICAgaXRlbVByb3A6IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIGl0ZW1SZWY6IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIGl0ZW1TY29wZTogYm9vbGVhbiwKICAgICAgICBpdGVtVHlwZTogc3BhY2VTZXBhcmF0ZWQsCiAgICAgICAga2luZDogbnVsbCwKICAgICAgICBsYWJlbDogbnVsbCwKICAgICAgICBsYW5nOiBudWxsLAogICAgICAgIGxhbmd1YWdlOiBudWxsLAogICAgICAgIGxpc3Q6IG51bGwsCiAgICAgICAgbG9hZGluZzogbnVsbCwKICAgICAgICBsb29wOiBib29sZWFuLAogICAgICAgIGxvdzogbnVtYmVyLAogICAgICAgIG1hbmlmZXN0OiBudWxsLAogICAgICAgIG1heDogbnVsbCwKICAgICAgICBtYXhMZW5ndGg6IG51bWJlciwKICAgICAgICBtZWRpYTogbnVsbCwKICAgICAgICBtZXRob2Q6IG51bGwsCiAgICAgICAgbWluOiBudWxsLAogICAgICAgIG1pbkxlbmd0aDogbnVtYmVyLAogICAgICAgIG11bHRpcGxlOiBib29sZWFuLAogICAgICAgIG11dGVkOiBib29sZWFuLAogICAgICAgIG5hbWU6IG51bGwsCiAgICAgICAgbm9uY2U6IG51bGwsCiAgICAgICAgbm9Nb2R1bGU6IGJvb2xlYW4sCiAgICAgICAgbm9WYWxpZGF0ZTogYm9vbGVhbiwKICAgICAgICBvbkFib3J0OiBudWxsLAogICAgICAgIG9uQWZ0ZXJQcmludDogbnVsbCwKICAgICAgICBvbkF1eENsaWNrOiBudWxsLAogICAgICAgIG9uQmVmb3JlTWF0Y2g6IG51bGwsCiAgICAgICAgb25CZWZvcmVQcmludDogbnVsbCwKICAgICAgICBvbkJlZm9yZVRvZ2dsZTogbnVsbCwKICAgICAgICBvbkJlZm9yZVVubG9hZDogbnVsbCwKICAgICAgICBvbkJsdXI6IG51bGwsCiAgICAgICAgb25DYW5jZWw6IG51bGwsCiAgICAgICAgb25DYW5QbGF5OiBudWxsLAogICAgICAgIG9uQ2FuUGxheVRocm91Z2g6IG51bGwsCiAgICAgICAgb25DaGFuZ2U6IG51bGwsCiAgICAgICAgb25DbGljazogbnVsbCwKICAgICAgICBvbkNsb3NlOiBudWxsLAogICAgICAgIG9uQ29udGV4dExvc3Q6IG51bGwsCiAgICAgICAgb25Db250ZXh0TWVudTogbnVsbCwKICAgICAgICBvbkNvbnRleHRSZXN0b3JlZDogbnVsbCwKICAgICAgICBvbkNvcHk6IG51bGwsCiAgICAgICAgb25DdWVDaGFuZ2U6IG51bGwsCiAgICAgICAgb25DdXQ6IG51bGwsCiAgICAgICAgb25EYmxDbGljazogbnVsbCwKICAgICAgICBvbkRyYWc6IG51bGwsCiAgICAgICAgb25EcmFnRW5kOiBudWxsLAogICAgICAgIG9uRHJhZ0VudGVyOiBudWxsLAogICAgICAgIG9uRHJhZ0V4aXQ6IG51bGwsCiAgICAgICAgb25EcmFnTGVhdmU6IG51bGwsCiAgICAgICAgb25EcmFnT3ZlcjogbnVsbCwKICAgICAgICBvbkRyYWdTdGFydDogbnVsbCwKICAgICAgICBvbkRyb3A6IG51bGwsCiAgICAgICAgb25EdXJhdGlvbkNoYW5nZTogbnVsbCwKICAgICAgICBvbkVtcHRpZWQ6IG51bGwsCiAgICAgICAgb25FbmRlZDogbnVsbCwKICAgICAgICBvbkVycm9yOiBudWxsLAogICAgICAgIG9uRm9jdXM6IG51bGwsCiAgICAgICAgb25Gb3JtRGF0YTogbnVsbCwKICAgICAgICBvbkhhc2hDaGFuZ2U6IG51bGwsCiAgICAgICAgb25JbnB1dDogbnVsbCwKICAgICAgICBvbkludmFsaWQ6IG51bGwsCiAgICAgICAgb25LZXlEb3duOiBudWxsLAogICAgICAgIG9uS2V5UHJlc3M6IG51bGwsCiAgICAgICAgb25LZXlVcDogbnVsbCwKICAgICAgICBvbkxhbmd1YWdlQ2hhbmdlOiBudWxsLAogICAgICAgIG9uTG9hZDogbnVsbCwKICAgICAgICBvbkxvYWRlZERhdGE6IG51bGwsCiAgICAgICAgb25Mb2FkZWRNZXRhZGF0YTogbnVsbCwKICAgICAgICBvbkxvYWRFbmQ6IG51bGwsCiAgICAgICAgb25Mb2FkU3RhcnQ6IG51bGwsCiAgICAgICAgb25NZXNzYWdlOiBudWxsLAogICAgICAgIG9uTWVzc2FnZUVycm9yOiBudWxsLAogICAgICAgIG9uTW91c2VEb3duOiBudWxsLAogICAgICAgIG9uTW91c2VFbnRlcjogbnVsbCwKICAgICAgICBvbk1vdXNlTGVhdmU6IG51bGwsCiAgICAgICAgb25Nb3VzZU1vdmU6IG51bGwsCiAgICAgICAgb25Nb3VzZU91dDogbnVsbCwKICAgICAgICBvbk1vdXNlT3ZlcjogbnVsbCwKICAgICAgICBvbk1vdXNlVXA6IG51bGwsCiAgICAgICAgb25PZmZsaW5lOiBudWxsLAogICAgICAgIG9uT25saW5lOiBudWxsLAogICAgICAgIG9uUGFnZUhpZGU6IG51bGwsCiAgICAgICAgb25QYWdlU2hvdzogbnVsbCwKICAgICAgICBvblBhc3RlOiBudWxsLAogICAgICAgIG9uUGF1c2U6IG51bGwsCiAgICAgICAgb25QbGF5OiBudWxsLAogICAgICAgIG9uUGxheWluZzogbnVsbCwKICAgICAgICBvblBvcFN0YXRlOiBudWxsLAogICAgICAgIG9uUHJvZ3Jlc3M6IG51bGwsCiAgICAgICAgb25SYXRlQ2hhbmdlOiBudWxsLAogICAgICAgIG9uUmVqZWN0aW9uSGFuZGxlZDogbnVsbCwKICAgICAgICBvblJlc2V0OiBudWxsLAogICAgICAgIG9uUmVzaXplOiBudWxsLAogICAgICAgIG9uU2Nyb2xsOiBudWxsLAogICAgICAgIG9uU2Nyb2xsRW5kOiBudWxsLAogICAgICAgIG9uU2VjdXJpdHlQb2xpY3lWaW9sYXRpb246IG51bGwsCiAgICAgICAgb25TZWVrZWQ6IG51bGwsCiAgICAgICAgb25TZWVraW5nOiBudWxsLAogICAgICAgIG9uU2VsZWN0OiBudWxsLAogICAgICAgIG9uU2xvdENoYW5nZTogbnVsbCwKICAgICAgICBvblN0YWxsZWQ6IG51bGwsCiAgICAgICAgb25TdG9yYWdlOiBudWxsLAogICAgICAgIG9uU3VibWl0OiBudWxsLAogICAgICAgIG9uU3VzcGVuZDogbnVsbCwKICAgICAgICBvblRpbWVVcGRhdGU6IG51bGwsCiAgICAgICAgb25Ub2dnbGU6IG51bGwsCiAgICAgICAgb25VbmhhbmRsZWRSZWplY3Rpb246IG51bGwsCiAgICAgICAgb25VbmxvYWQ6IG51bGwsCiAgICAgICAgb25Wb2x1bWVDaGFuZ2U6IG51bGwsCiAgICAgICAgb25XYWl0aW5nOiBudWxsLAogICAgICAgIG9uV2hlZWw6IG51bGwsCiAgICAgICAgb3BlbjogYm9vbGVhbiwKICAgICAgICBvcHRpbXVtOiBudW1iZXIsCiAgICAgICAgcGF0dGVybjogbnVsbCwKICAgICAgICBwaW5nOiBzcGFjZVNlcGFyYXRlZCwKICAgICAgICBwbGFjZWhvbGRlcjogbnVsbCwKICAgICAgICBwbGF5c0lubGluZTogYm9vbGVhbiwKICAgICAgICBwb3BvdmVyOiBudWxsLAogICAgICAgIHBvcG92ZXJUYXJnZXQ6IG51bGwsCiAgICAgICAgcG9wb3ZlclRhcmdldEFjdGlvbjogbnVsbCwKICAgICAgICBwb3N0ZXI6IG51bGwsCiAgICAgICAgcHJlbG9hZDogbnVsbCwKICAgICAgICByZWFkT25seTogYm9vbGVhbiwKICAgICAgICByZWZlcnJlclBvbGljeTogbnVsbCwKICAgICAgICByZWw6IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIHJlcXVpcmVkOiBib29sZWFuLAogICAgICAgIHJldmVyc2VkOiBib29sZWFuLAogICAgICAgIHJvd3M6IG51bWJlciwKICAgICAgICByb3dTcGFuOiBudW1iZXIsCiAgICAgICAgc2FuZGJveDogc3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgc2NvcGU6IG51bGwsCiAgICAgICAgc2NvcGVkOiBib29sZWFuLAogICAgICAgIHNlYW1sZXNzOiBib29sZWFuLAogICAgICAgIHNlbGVjdGVkOiBib29sZWFuLAogICAgICAgIHNoYWRvd1Jvb3RDbG9uYWJsZTogYm9vbGVhbiwKICAgICAgICBzaGFkb3dSb290RGVsZWdhdGVzRm9jdXM6IGJvb2xlYW4sCiAgICAgICAgc2hhZG93Um9vdE1vZGU6IG51bGwsCiAgICAgICAgc2hhcGU6IG51bGwsCiAgICAgICAgc2l6ZTogbnVtYmVyLAogICAgICAgIHNpemVzOiBudWxsLAogICAgICAgIHNsb3Q6IG51bGwsCiAgICAgICAgc3BhbjogbnVtYmVyLAogICAgICAgIHNwZWxsQ2hlY2s6IGJvb2xlYW5pc2gsCiAgICAgICAgc3JjOiBudWxsLAogICAgICAgIHNyY0RvYzogbnVsbCwKICAgICAgICBzcmNMYW5nOiBudWxsLAogICAgICAgIHNyY1NldDogbnVsbCwKICAgICAgICBzdGFydDogbnVtYmVyLAogICAgICAgIHN0ZXA6IG51bGwsCiAgICAgICAgc3R5bGU6IG51bGwsCiAgICAgICAgdGFiSW5kZXg6IG51bWJlciwKICAgICAgICB0YXJnZXQ6IG51bGwsCiAgICAgICAgdGl0bGU6IG51bGwsCiAgICAgICAgdHJhbnNsYXRlOiBudWxsLAogICAgICAgIHR5cGU6IG51bGwsCiAgICAgICAgdHlwZU11c3RNYXRjaDogYm9vbGVhbiwKICAgICAgICB1c2VNYXA6IG51bGwsCiAgICAgICAgdmFsdWU6IGJvb2xlYW5pc2gsCiAgICAgICAgd2lkdGg6IG51bWJlciwKICAgICAgICB3cmFwOiBudWxsLAogICAgICAgIHdyaXRpbmdTdWdnZXN0aW9uczogbnVsbCwKICAgICAgICAvLyBMZWdhY3kuCiAgICAgICAgLy8gU2VlOiBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNvdGhlci1lbGVtZW50cywtYXR0cmlidXRlcy1hbmQtYXBpcwogICAgICAgIGFsaWduOiBudWxsLAogICAgICAgIC8vIFNldmVyYWwuIFVzZSBDU1MgYHRleHQtYWxpZ25gIGluc3RlYWQsCiAgICAgICAgYUxpbms6IG51bGwsCiAgICAgICAgLy8gYDxib2R5PmAuIFVzZSBDU1MgYGE6YWN0aXZlIHtjb2xvcn1gIGluc3RlYWQKICAgICAgICBhcmNoaXZlOiBzcGFjZVNlcGFyYXRlZCwKICAgICAgICAvLyBgPG9iamVjdD5gLiBMaXN0IG9mIFVSSXMgdG8gYXJjaGl2ZXMKICAgICAgICBheGlzOiBudWxsLAogICAgICAgIC8vIGA8dGQ+YCBhbmQgYDx0aD5gLiBVc2UgYHNjb3BlYCBvbiBgPHRoPmAKICAgICAgICBiYWNrZ3JvdW5kOiBudWxsLAogICAgICAgIC8vIGA8Ym9keT5gLiBVc2UgQ1NTIGBiYWNrZ3JvdW5kLWltYWdlYCBpbnN0ZWFkCiAgICAgICAgYmdDb2xvcjogbnVsbCwKICAgICAgICAvLyBgPGJvZHk+YCBhbmQgdGFibGUgZWxlbWVudHMuIFVzZSBDU1MgYGJhY2tncm91bmQtY29sb3JgIGluc3RlYWQKICAgICAgICBib3JkZXI6IG51bWJlciwKICAgICAgICAvLyBgPHRhYmxlPmAuIFVzZSBDU1MgYGJvcmRlci13aWR0aGAgaW5zdGVhZCwKICAgICAgICBib3JkZXJDb2xvcjogbnVsbCwKICAgICAgICAvLyBgPHRhYmxlPmAuIFVzZSBDU1MgYGJvcmRlci1jb2xvcmAgaW5zdGVhZCwKICAgICAgICBib3R0b21NYXJnaW46IG51bWJlciwKICAgICAgICAvLyBgPGJvZHk+YAogICAgICAgIGNlbGxQYWRkaW5nOiBudWxsLAogICAgICAgIC8vIGA8dGFibGU+YAogICAgICAgIGNlbGxTcGFjaW5nOiBudWxsLAogICAgICAgIC8vIGA8dGFibGU+YAogICAgICAgIGNoYXI6IG51bGwsCiAgICAgICAgLy8gU2V2ZXJhbCB0YWJsZSBlbGVtZW50cy4gV2hlbiBgYWxpZ249Y2hhcmAsIHNldHMgdGhlIGNoYXJhY3RlciB0byBhbGlnbiBvbgogICAgICAgIGNoYXJPZmY6IG51bGwsCiAgICAgICAgLy8gU2V2ZXJhbCB0YWJsZSBlbGVtZW50cy4gV2hlbiBgY2hhcmAsIG9mZnNldHMgdGhlIGFsaWdubWVudAogICAgICAgIGNsYXNzSWQ6IG51bGwsCiAgICAgICAgLy8gYDxvYmplY3Q+YAogICAgICAgIGNsZWFyOiBudWxsLAogICAgICAgIC8vIGA8YnI+YC4gVXNlIENTUyBgY2xlYXJgIGluc3RlYWQKICAgICAgICBjb2RlOiBudWxsLAogICAgICAgIC8vIGA8b2JqZWN0PmAKICAgICAgICBjb2RlQmFzZTogbnVsbCwKICAgICAgICAvLyBgPG9iamVjdD5gCiAgICAgICAgY29kZVR5cGU6IG51bGwsCiAgICAgICAgLy8gYDxvYmplY3Q+YAogICAgICAgIGNvbG9yOiBudWxsLAogICAgICAgIC8vIGA8Zm9udD5gIGFuZCBgPGhyPmAuIFVzZSBDU1MgaW5zdGVhZAogICAgICAgIGNvbXBhY3Q6IGJvb2xlYW4sCiAgICAgICAgLy8gTGlzdHMuIFVzZSBDU1MgdG8gcmVkdWNlIHNwYWNlIGJldHdlZW4gaXRlbXMgaW5zdGVhZAogICAgICAgIGRlY2xhcmU6IGJvb2xlYW4sCiAgICAgICAgLy8gYDxvYmplY3Q+YAogICAgICAgIGV2ZW50OiBudWxsLAogICAgICAgIC8vIGA8c2NyaXB0PmAKICAgICAgICBmYWNlOiBudWxsLAogICAgICAgIC8vIGA8Zm9udD5gLiBVc2UgQ1NTIGluc3RlYWQKICAgICAgICBmcmFtZTogbnVsbCwKICAgICAgICAvLyBgPHRhYmxlPmAKICAgICAgICBmcmFtZUJvcmRlcjogbnVsbCwKICAgICAgICAvLyBgPGlmcmFtZT5gLiBVc2UgQ1NTIGBib3JkZXJgIGluc3RlYWQKICAgICAgICBoU3BhY2U6IG51bWJlciwKICAgICAgICAvLyBgPGltZz5gIGFuZCBgPG9iamVjdD5gCiAgICAgICAgbGVmdE1hcmdpbjogbnVtYmVyLAogICAgICAgIC8vIGA8Ym9keT5gCiAgICAgICAgbGluazogbnVsbCwKICAgICAgICAvLyBgPGJvZHk+YC4gVXNlIENTUyBgYTpsaW5rIHtjb2xvcjogKn1gIGluc3RlYWQKICAgICAgICBsb25nRGVzYzogbnVsbCwKICAgICAgICAvLyBgPGZyYW1lPmAsIGA8aWZyYW1lPmAsIGFuZCBgPGltZz5gLiBVc2UgYW4gYDxhPmAKICAgICAgICBsb3dTcmM6IG51bGwsCiAgICAgICAgLy8gYDxpbWc+YC4gVXNlIGEgYDxwaWN0dXJlPmAKICAgICAgICBtYXJnaW5IZWlnaHQ6IG51bWJlciwKICAgICAgICAvLyBgPGJvZHk+YAogICAgICAgIG1hcmdpbldpZHRoOiBudW1iZXIsCiAgICAgICAgLy8gYDxib2R5PmAKICAgICAgICBub1Jlc2l6ZTogYm9vbGVhbiwKICAgICAgICAvLyBgPGZyYW1lPmAKICAgICAgICBub0hyZWY6IGJvb2xlYW4sCiAgICAgICAgLy8gYDxhcmVhPmAuIFVzZSBubyBocmVmIGluc3RlYWQgb2YgYW4gZXhwbGljaXQgYG5vaHJlZmAKICAgICAgICBub1NoYWRlOiBib29sZWFuLAogICAgICAgIC8vIGA8aHI+YC4gVXNlIGJhY2tncm91bmQtY29sb3IgYW5kIGhlaWdodCBpbnN0ZWFkIG9mIGJvcmRlcnMKICAgICAgICBub1dyYXA6IGJvb2xlYW4sCiAgICAgICAgLy8gYDx0ZD5gIGFuZCBgPHRoPmAKICAgICAgICBvYmplY3Q6IG51bGwsCiAgICAgICAgLy8gYDxhcHBsZXQ+YAogICAgICAgIHByb2ZpbGU6IG51bGwsCiAgICAgICAgLy8gYDxoZWFkPmAKICAgICAgICBwcm9tcHQ6IG51bGwsCiAgICAgICAgLy8gYDxpc2luZGV4PmAKICAgICAgICByZXY6IG51bGwsCiAgICAgICAgLy8gYDxsaW5rPmAKICAgICAgICByaWdodE1hcmdpbjogbnVtYmVyLAogICAgICAgIC8vIGA8Ym9keT5gCiAgICAgICAgcnVsZXM6IG51bGwsCiAgICAgICAgLy8gYDx0YWJsZT5gCiAgICAgICAgc2NoZW1lOiBudWxsLAogICAgICAgIC8vIGA8bWV0YT5gCiAgICAgICAgc2Nyb2xsaW5nOiBib29sZWFuaXNoLAogICAgICAgIC8vIGA8ZnJhbWU+YC4gVXNlIG92ZXJmbG93IGluIHRoZSBjaGlsZCBjb250ZXh0CiAgICAgICAgc3RhbmRieTogbnVsbCwKICAgICAgICAvLyBgPG9iamVjdD5gCiAgICAgICAgc3VtbWFyeTogbnVsbCwKICAgICAgICAvLyBgPHRhYmxlPmAKICAgICAgICB0ZXh0OiBudWxsLAogICAgICAgIC8vIGA8Ym9keT5gLiBVc2UgQ1NTIGBjb2xvcmAgaW5zdGVhZAogICAgICAgIHRvcE1hcmdpbjogbnVtYmVyLAogICAgICAgIC8vIGA8Ym9keT5gCiAgICAgICAgdmFsdWVUeXBlOiBudWxsLAogICAgICAgIC8vIGA8cGFyYW0+YAogICAgICAgIHZlcnNpb246IG51bGwsCiAgICAgICAgLy8gYDxodG1sPmAuIFVzZSBhIGRvY3R5cGUuCiAgICAgICAgdkFsaWduOiBudWxsLAogICAgICAgIC8vIFNldmVyYWwuIFVzZSBDU1MgYHZlcnRpY2FsLWFsaWduYCBpbnN0ZWFkCiAgICAgICAgdkxpbms6IG51bGwsCiAgICAgICAgLy8gYDxib2R5PmAuIFVzZSBDU1MgYGE6dmlzaXRlZCB7Y29sb3J9YCBpbnN0ZWFkCiAgICAgICAgdlNwYWNlOiBudW1iZXIsCiAgICAgICAgLy8gYDxpbWc+YCBhbmQgYDxvYmplY3Q+YAogICAgICAgIC8vIE5vbi1zdGFuZGFyZCBQcm9wZXJ0aWVzLgogICAgICAgIGFsbG93VHJhbnNwYXJlbmN5OiBudWxsLAogICAgICAgIGF1dG9Db3JyZWN0OiBudWxsLAogICAgICAgIGF1dG9TYXZlOiBudWxsLAogICAgICAgIGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlOiBib29sZWFuLAogICAgICAgIGRpc2FibGVSZW1vdGVQbGF5YmFjazogYm9vbGVhbiwKICAgICAgICBwcmVmaXg6IG51bGwsCiAgICAgICAgcHJvcGVydHk6IG51bGwsCiAgICAgICAgcmVzdWx0czogbnVtYmVyLAogICAgICAgIHNlY3VyaXR5OiBudWxsLAogICAgICAgIHVuc2VsZWN0YWJsZTogbnVsbAogICAgICB9LAogICAgICBzcGFjZTogImh0bWwiLAogICAgICB0cmFuc2Zvcm06IGNhc2VJbnNlbnNpdGl2ZVRyYW5zZm9ybQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3N2Zy5qcwp2YXIgc3ZnOwp2YXIgaW5pdF9zdmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3N2Zy5qcyIoKSB7CiAgICBpbml0X2Nhc2Vfc2Vuc2l0aXZlX3RyYW5zZm9ybSgpOwogICAgaW5pdF9jcmVhdGUoKTsKICAgIGluaXRfdHlwZXMzKCk7CiAgICBzdmcgPSBjcmVhdGU2KHsKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGFjY2VudEhlaWdodDogImFjY2VudC1oZWlnaHQiLAogICAgICAgIGFsaWdubWVudEJhc2VsaW5lOiAiYWxpZ25tZW50LWJhc2VsaW5lIiwKICAgICAgICBhcmFiaWNGb3JtOiAiYXJhYmljLWZvcm0iLAogICAgICAgIGJhc2VsaW5lU2hpZnQ6ICJiYXNlbGluZS1zaGlmdCIsCiAgICAgICAgY2FwSGVpZ2h0OiAiY2FwLWhlaWdodCIsCiAgICAgICAgY2xhc3NOYW1lOiAiY2xhc3MiLAogICAgICAgIGNsaXBQYXRoOiAiY2xpcC1wYXRoIiwKICAgICAgICBjbGlwUnVsZTogImNsaXAtcnVsZSIsCiAgICAgICAgY29sb3JJbnRlcnBvbGF0aW9uOiAiY29sb3ItaW50ZXJwb2xhdGlvbiIsCiAgICAgICAgY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyczogImNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyIsCiAgICAgICAgY29sb3JQcm9maWxlOiAiY29sb3ItcHJvZmlsZSIsCiAgICAgICAgY29sb3JSZW5kZXJpbmc6ICJjb2xvci1yZW5kZXJpbmciLAogICAgICAgIGNyb3NzT3JpZ2luOiAiY3Jvc3NvcmlnaW4iLAogICAgICAgIGRhdGFUeXBlOiAiZGF0YXR5cGUiLAogICAgICAgIGRvbWluYW50QmFzZWxpbmU6ICJkb21pbmFudC1iYXNlbGluZSIsCiAgICAgICAgZW5hYmxlQmFja2dyb3VuZDogImVuYWJsZS1iYWNrZ3JvdW5kIiwKICAgICAgICBmaWxsT3BhY2l0eTogImZpbGwtb3BhY2l0eSIsCiAgICAgICAgZmlsbFJ1bGU6ICJmaWxsLXJ1bGUiLAogICAgICAgIGZsb29kQ29sb3I6ICJmbG9vZC1jb2xvciIsCiAgICAgICAgZmxvb2RPcGFjaXR5OiAiZmxvb2Qtb3BhY2l0eSIsCiAgICAgICAgZm9udEZhbWlseTogImZvbnQtZmFtaWx5IiwKICAgICAgICBmb250U2l6ZTogImZvbnQtc2l6ZSIsCiAgICAgICAgZm9udFNpemVBZGp1c3Q6ICJmb250LXNpemUtYWRqdXN0IiwKICAgICAgICBmb250U3RyZXRjaDogImZvbnQtc3RyZXRjaCIsCiAgICAgICAgZm9udFN0eWxlOiAiZm9udC1zdHlsZSIsCiAgICAgICAgZm9udFZhcmlhbnQ6ICJmb250LXZhcmlhbnQiLAogICAgICAgIGZvbnRXZWlnaHQ6ICJmb250LXdlaWdodCIsCiAgICAgICAgZ2x5cGhOYW1lOiAiZ2x5cGgtbmFtZSIsCiAgICAgICAgZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWw6ICJnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIiwKICAgICAgICBnbHlwaE9yaWVudGF0aW9uVmVydGljYWw6ICJnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCIsCiAgICAgICAgaHJlZkxhbmc6ICJocmVmbGFuZyIsCiAgICAgICAgaG9yaXpBZHZYOiAiaG9yaXotYWR2LXgiLAogICAgICAgIGhvcml6T3JpZ2luWDogImhvcml6LW9yaWdpbi14IiwKICAgICAgICBob3Jpek9yaWdpblk6ICJob3Jpei1vcmlnaW4teSIsCiAgICAgICAgaW1hZ2VSZW5kZXJpbmc6ICJpbWFnZS1yZW5kZXJpbmciLAogICAgICAgIGxldHRlclNwYWNpbmc6ICJsZXR0ZXItc3BhY2luZyIsCiAgICAgICAgbGlnaHRpbmdDb2xvcjogImxpZ2h0aW5nLWNvbG9yIiwKICAgICAgICBtYXJrZXJFbmQ6ICJtYXJrZXItZW5kIiwKICAgICAgICBtYXJrZXJNaWQ6ICJtYXJrZXItbWlkIiwKICAgICAgICBtYXJrZXJTdGFydDogIm1hcmtlci1zdGFydCIsCiAgICAgICAgbmF2RG93bjogIm5hdi1kb3duIiwKICAgICAgICBuYXZEb3duTGVmdDogIm5hdi1kb3duLWxlZnQiLAogICAgICAgIG5hdkRvd25SaWdodDogIm5hdi1kb3duLXJpZ2h0IiwKICAgICAgICBuYXZMZWZ0OiAibmF2LWxlZnQiLAogICAgICAgIG5hdk5leHQ6ICJuYXYtbmV4dCIsCiAgICAgICAgbmF2UHJldjogIm5hdi1wcmV2IiwKICAgICAgICBuYXZSaWdodDogIm5hdi1yaWdodCIsCiAgICAgICAgbmF2VXA6ICJuYXYtdXAiLAogICAgICAgIG5hdlVwTGVmdDogIm5hdi11cC1sZWZ0IiwKICAgICAgICBuYXZVcFJpZ2h0OiAibmF2LXVwLXJpZ2h0IiwKICAgICAgICBvbkFib3J0OiAib25hYm9ydCIsCiAgICAgICAgb25BY3RpdmF0ZTogIm9uYWN0aXZhdGUiLAogICAgICAgIG9uQWZ0ZXJQcmludDogIm9uYWZ0ZXJwcmludCIsCiAgICAgICAgb25CZWZvcmVQcmludDogIm9uYmVmb3JlcHJpbnQiLAogICAgICAgIG9uQmVnaW46ICJvbmJlZ2luIiwKICAgICAgICBvbkNhbmNlbDogIm9uY2FuY2VsIiwKICAgICAgICBvbkNhblBsYXk6ICJvbmNhbnBsYXkiLAogICAgICAgIG9uQ2FuUGxheVRocm91Z2g6ICJvbmNhbnBsYXl0aHJvdWdoIiwKICAgICAgICBvbkNoYW5nZTogIm9uY2hhbmdlIiwKICAgICAgICBvbkNsaWNrOiAib25jbGljayIsCiAgICAgICAgb25DbG9zZTogIm9uY2xvc2UiLAogICAgICAgIG9uQ29weTogIm9uY29weSIsCiAgICAgICAgb25DdWVDaGFuZ2U6ICJvbmN1ZWNoYW5nZSIsCiAgICAgICAgb25DdXQ6ICJvbmN1dCIsCiAgICAgICAgb25EYmxDbGljazogIm9uZGJsY2xpY2siLAogICAgICAgIG9uRHJhZzogIm9uZHJhZyIsCiAgICAgICAgb25EcmFnRW5kOiAib25kcmFnZW5kIiwKICAgICAgICBvbkRyYWdFbnRlcjogIm9uZHJhZ2VudGVyIiwKICAgICAgICBvbkRyYWdFeGl0OiAib25kcmFnZXhpdCIsCiAgICAgICAgb25EcmFnTGVhdmU6ICJvbmRyYWdsZWF2ZSIsCiAgICAgICAgb25EcmFnT3ZlcjogIm9uZHJhZ292ZXIiLAogICAgICAgIG9uRHJhZ1N0YXJ0OiAib25kcmFnc3RhcnQiLAogICAgICAgIG9uRHJvcDogIm9uZHJvcCIsCiAgICAgICAgb25EdXJhdGlvbkNoYW5nZTogIm9uZHVyYXRpb25jaGFuZ2UiLAogICAgICAgIG9uRW1wdGllZDogIm9uZW1wdGllZCIsCiAgICAgICAgb25FbmQ6ICJvbmVuZCIsCiAgICAgICAgb25FbmRlZDogIm9uZW5kZWQiLAogICAgICAgIG9uRXJyb3I6ICJvbmVycm9yIiwKICAgICAgICBvbkZvY3VzOiAib25mb2N1cyIsCiAgICAgICAgb25Gb2N1c0luOiAib25mb2N1c2luIiwKICAgICAgICBvbkZvY3VzT3V0OiAib25mb2N1c291dCIsCiAgICAgICAgb25IYXNoQ2hhbmdlOiAib25oYXNoY2hhbmdlIiwKICAgICAgICBvbklucHV0OiAib25pbnB1dCIsCiAgICAgICAgb25JbnZhbGlkOiAib25pbnZhbGlkIiwKICAgICAgICBvbktleURvd246ICJvbmtleWRvd24iLAogICAgICAgIG9uS2V5UHJlc3M6ICJvbmtleXByZXNzIiwKICAgICAgICBvbktleVVwOiAib25rZXl1cCIsCiAgICAgICAgb25Mb2FkOiAib25sb2FkIiwKICAgICAgICBvbkxvYWRlZERhdGE6ICJvbmxvYWRlZGRhdGEiLAogICAgICAgIG9uTG9hZGVkTWV0YWRhdGE6ICJvbmxvYWRlZG1ldGFkYXRhIiwKICAgICAgICBvbkxvYWRTdGFydDogIm9ubG9hZHN0YXJ0IiwKICAgICAgICBvbk1lc3NhZ2U6ICJvbm1lc3NhZ2UiLAogICAgICAgIG9uTW91c2VEb3duOiAib25tb3VzZWRvd24iLAogICAgICAgIG9uTW91c2VFbnRlcjogIm9ubW91c2VlbnRlciIsCiAgICAgICAgb25Nb3VzZUxlYXZlOiAib25tb3VzZWxlYXZlIiwKICAgICAgICBvbk1vdXNlTW92ZTogIm9ubW91c2Vtb3ZlIiwKICAgICAgICBvbk1vdXNlT3V0OiAib25tb3VzZW91dCIsCiAgICAgICAgb25Nb3VzZU92ZXI6ICJvbm1vdXNlb3ZlciIsCiAgICAgICAgb25Nb3VzZVVwOiAib25tb3VzZXVwIiwKICAgICAgICBvbk1vdXNlV2hlZWw6ICJvbm1vdXNld2hlZWwiLAogICAgICAgIG9uT2ZmbGluZTogIm9ub2ZmbGluZSIsCiAgICAgICAgb25PbmxpbmU6ICJvbm9ubGluZSIsCiAgICAgICAgb25QYWdlSGlkZTogIm9ucGFnZWhpZGUiLAogICAgICAgIG9uUGFnZVNob3c6ICJvbnBhZ2VzaG93IiwKICAgICAgICBvblBhc3RlOiAib25wYXN0ZSIsCiAgICAgICAgb25QYXVzZTogIm9ucGF1c2UiLAogICAgICAgIG9uUGxheTogIm9ucGxheSIsCiAgICAgICAgb25QbGF5aW5nOiAib25wbGF5aW5nIiwKICAgICAgICBvblBvcFN0YXRlOiAib25wb3BzdGF0ZSIsCiAgICAgICAgb25Qcm9ncmVzczogIm9ucHJvZ3Jlc3MiLAogICAgICAgIG9uUmF0ZUNoYW5nZTogIm9ucmF0ZWNoYW5nZSIsCiAgICAgICAgb25SZXBlYXQ6ICJvbnJlcGVhdCIsCiAgICAgICAgb25SZXNldDogIm9ucmVzZXQiLAogICAgICAgIG9uUmVzaXplOiAib25yZXNpemUiLAogICAgICAgIG9uU2Nyb2xsOiAib25zY3JvbGwiLAogICAgICAgIG9uU2Vla2VkOiAib25zZWVrZWQiLAogICAgICAgIG9uU2Vla2luZzogIm9uc2Vla2luZyIsCiAgICAgICAgb25TZWxlY3Q6ICJvbnNlbGVjdCIsCiAgICAgICAgb25TaG93OiAib25zaG93IiwKICAgICAgICBvblN0YWxsZWQ6ICJvbnN0YWxsZWQiLAogICAgICAgIG9uU3RvcmFnZTogIm9uc3RvcmFnZSIsCiAgICAgICAgb25TdWJtaXQ6ICJvbnN1Ym1pdCIsCiAgICAgICAgb25TdXNwZW5kOiAib25zdXNwZW5kIiwKICAgICAgICBvblRpbWVVcGRhdGU6ICJvbnRpbWV1cGRhdGUiLAogICAgICAgIG9uVG9nZ2xlOiAib250b2dnbGUiLAogICAgICAgIG9uVW5sb2FkOiAib251bmxvYWQiLAogICAgICAgIG9uVm9sdW1lQ2hhbmdlOiAib252b2x1bWVjaGFuZ2UiLAogICAgICAgIG9uV2FpdGluZzogIm9ud2FpdGluZyIsCiAgICAgICAgb25ab29tOiAib256b29tIiwKICAgICAgICBvdmVybGluZVBvc2l0aW9uOiAib3ZlcmxpbmUtcG9zaXRpb24iLAogICAgICAgIG92ZXJsaW5lVGhpY2tuZXNzOiAib3ZlcmxpbmUtdGhpY2tuZXNzIiwKICAgICAgICBwYWludE9yZGVyOiAicGFpbnQtb3JkZXIiLAogICAgICAgIHBhbm9zZTE6ICJwYW5vc2UtMSIsCiAgICAgICAgcG9pbnRlckV2ZW50czogInBvaW50ZXItZXZlbnRzIiwKICAgICAgICByZWZlcnJlclBvbGljeTogInJlZmVycmVycG9saWN5IiwKICAgICAgICByZW5kZXJpbmdJbnRlbnQ6ICJyZW5kZXJpbmctaW50ZW50IiwKICAgICAgICBzaGFwZVJlbmRlcmluZzogInNoYXBlLXJlbmRlcmluZyIsCiAgICAgICAgc3RvcENvbG9yOiAic3RvcC1jb2xvciIsCiAgICAgICAgc3RvcE9wYWNpdHk6ICJzdG9wLW9wYWNpdHkiLAogICAgICAgIHN0cmlrZXRocm91Z2hQb3NpdGlvbjogInN0cmlrZXRocm91Z2gtcG9zaXRpb24iLAogICAgICAgIHN0cmlrZXRocm91Z2hUaGlja25lc3M6ICJzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyIsCiAgICAgICAgc3Ryb2tlRGFzaEFycmF5OiAic3Ryb2tlLWRhc2hhcnJheSIsCiAgICAgICAgc3Ryb2tlRGFzaE9mZnNldDogInN0cm9rZS1kYXNob2Zmc2V0IiwKICAgICAgICBzdHJva2VMaW5lQ2FwOiAic3Ryb2tlLWxpbmVjYXAiLAogICAgICAgIHN0cm9rZUxpbmVKb2luOiAic3Ryb2tlLWxpbmVqb2luIiwKICAgICAgICBzdHJva2VNaXRlckxpbWl0OiAic3Ryb2tlLW1pdGVybGltaXQiLAogICAgICAgIHN0cm9rZU9wYWNpdHk6ICJzdHJva2Utb3BhY2l0eSIsCiAgICAgICAgc3Ryb2tlV2lkdGg6ICJzdHJva2Utd2lkdGgiLAogICAgICAgIHRhYkluZGV4OiAidGFiaW5kZXgiLAogICAgICAgIHRleHRBbmNob3I6ICJ0ZXh0LWFuY2hvciIsCiAgICAgICAgdGV4dERlY29yYXRpb246ICJ0ZXh0LWRlY29yYXRpb24iLAogICAgICAgIHRleHRSZW5kZXJpbmc6ICJ0ZXh0LXJlbmRlcmluZyIsCiAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAidHJhbnNmb3JtLW9yaWdpbiIsCiAgICAgICAgdHlwZU9mOiAidHlwZW9mIiwKICAgICAgICB1bmRlcmxpbmVQb3NpdGlvbjogInVuZGVybGluZS1wb3NpdGlvbiIsCiAgICAgICAgdW5kZXJsaW5lVGhpY2tuZXNzOiAidW5kZXJsaW5lLXRoaWNrbmVzcyIsCiAgICAgICAgdW5pY29kZUJpZGk6ICJ1bmljb2RlLWJpZGkiLAogICAgICAgIHVuaWNvZGVSYW5nZTogInVuaWNvZGUtcmFuZ2UiLAogICAgICAgIHVuaXRzUGVyRW06ICJ1bml0cy1wZXItZW0iLAogICAgICAgIHZBbHBoYWJldGljOiAidi1hbHBoYWJldGljIiwKICAgICAgICB2SGFuZ2luZzogInYtaGFuZ2luZyIsCiAgICAgICAgdklkZW9ncmFwaGljOiAidi1pZGVvZ3JhcGhpYyIsCiAgICAgICAgdk1hdGhlbWF0aWNhbDogInYtbWF0aGVtYXRpY2FsIiwKICAgICAgICB2ZWN0b3JFZmZlY3Q6ICJ2ZWN0b3ItZWZmZWN0IiwKICAgICAgICB2ZXJ0QWR2WTogInZlcnQtYWR2LXkiLAogICAgICAgIHZlcnRPcmlnaW5YOiAidmVydC1vcmlnaW4teCIsCiAgICAgICAgdmVydE9yaWdpblk6ICJ2ZXJ0LW9yaWdpbi15IiwKICAgICAgICB3b3JkU3BhY2luZzogIndvcmQtc3BhY2luZyIsCiAgICAgICAgd3JpdGluZ01vZGU6ICJ3cml0aW5nLW1vZGUiLAogICAgICAgIHhIZWlnaHQ6ICJ4LWhlaWdodCIsCiAgICAgICAgLy8gVGhlc2Ugd2VyZSBjYW1lbGNhc2VkIGluIFRpbnkuIE5vdyBsb3dlcmNhc2VkIGluIFNWRyAyCiAgICAgICAgcGxheWJhY2tPcmRlcjogInBsYXliYWNrb3JkZXIiLAogICAgICAgIHRpbWVsaW5lQmVnaW46ICJ0aW1lbGluZWJlZ2luIgogICAgICB9LAogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgYWJvdXQ6IGNvbW1hT3JTcGFjZVNlcGFyYXRlZCwKICAgICAgICBhY2NlbnRIZWlnaHQ6IG51bWJlciwKICAgICAgICBhY2N1bXVsYXRlOiBudWxsLAogICAgICAgIGFkZGl0aXZlOiBudWxsLAogICAgICAgIGFsaWdubWVudEJhc2VsaW5lOiBudWxsLAogICAgICAgIGFscGhhYmV0aWM6IG51bWJlciwKICAgICAgICBhbXBsaXR1ZGU6IG51bWJlciwKICAgICAgICBhcmFiaWNGb3JtOiBudWxsLAogICAgICAgIGFzY2VudDogbnVtYmVyLAogICAgICAgIGF0dHJpYnV0ZU5hbWU6IG51bGwsCiAgICAgICAgYXR0cmlidXRlVHlwZTogbnVsbCwKICAgICAgICBhemltdXRoOiBudW1iZXIsCiAgICAgICAgYmFuZHdpZHRoOiBudWxsLAogICAgICAgIGJhc2VsaW5lU2hpZnQ6IG51bGwsCiAgICAgICAgYmFzZUZyZXF1ZW5jeTogbnVsbCwKICAgICAgICBiYXNlUHJvZmlsZTogbnVsbCwKICAgICAgICBiYm94OiBudWxsLAogICAgICAgIGJlZ2luOiBudWxsLAogICAgICAgIGJpYXM6IG51bWJlciwKICAgICAgICBieTogbnVsbCwKICAgICAgICBjYWxjTW9kZTogbnVsbCwKICAgICAgICBjYXBIZWlnaHQ6IG51bWJlciwKICAgICAgICBjbGFzc05hbWU6IHNwYWNlU2VwYXJhdGVkLAogICAgICAgIGNsaXA6IG51bGwsCiAgICAgICAgY2xpcFBhdGg6IG51bGwsCiAgICAgICAgY2xpcFBhdGhVbml0czogbnVsbCwKICAgICAgICBjbGlwUnVsZTogbnVsbCwKICAgICAgICBjb2xvcjogbnVsbCwKICAgICAgICBjb2xvckludGVycG9sYXRpb246IG51bGwsCiAgICAgICAgY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyczogbnVsbCwKICAgICAgICBjb2xvclByb2ZpbGU6IG51bGwsCiAgICAgICAgY29sb3JSZW5kZXJpbmc6IG51bGwsCiAgICAgICAgY29udGVudDogbnVsbCwKICAgICAgICBjb250ZW50U2NyaXB0VHlwZTogbnVsbCwKICAgICAgICBjb250ZW50U3R5bGVUeXBlOiBudWxsLAogICAgICAgIGNyb3NzT3JpZ2luOiBudWxsLAogICAgICAgIGN1cnNvcjogbnVsbCwKICAgICAgICBjeDogbnVsbCwKICAgICAgICBjeTogbnVsbCwKICAgICAgICBkOiBudWxsLAogICAgICAgIGRhdGFUeXBlOiBudWxsLAogICAgICAgIGRlZmF1bHRBY3Rpb246IG51bGwsCiAgICAgICAgZGVzY2VudDogbnVtYmVyLAogICAgICAgIGRpZmZ1c2VDb25zdGFudDogbnVtYmVyLAogICAgICAgIGRpcmVjdGlvbjogbnVsbCwKICAgICAgICBkaXNwbGF5OiBudWxsLAogICAgICAgIGR1cjogbnVsbCwKICAgICAgICBkaXZpc29yOiBudW1iZXIsCiAgICAgICAgZG9taW5hbnRCYXNlbGluZTogbnVsbCwKICAgICAgICBkb3dubG9hZDogYm9vbGVhbiwKICAgICAgICBkeDogbnVsbCwKICAgICAgICBkeTogbnVsbCwKICAgICAgICBlZGdlTW9kZTogbnVsbCwKICAgICAgICBlZGl0YWJsZTogbnVsbCwKICAgICAgICBlbGV2YXRpb246IG51bWJlciwKICAgICAgICBlbmFibGVCYWNrZ3JvdW5kOiBudWxsLAogICAgICAgIGVuZDogbnVsbCwKICAgICAgICBldmVudDogbnVsbCwKICAgICAgICBleHBvbmVudDogbnVtYmVyLAogICAgICAgIGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQ6IG51bGwsCiAgICAgICAgZmlsbDogbnVsbCwKICAgICAgICBmaWxsT3BhY2l0eTogbnVtYmVyLAogICAgICAgIGZpbGxSdWxlOiBudWxsLAogICAgICAgIGZpbHRlcjogbnVsbCwKICAgICAgICBmaWx0ZXJSZXM6IG51bGwsCiAgICAgICAgZmlsdGVyVW5pdHM6IG51bGwsCiAgICAgICAgZmxvb2RDb2xvcjogbnVsbCwKICAgICAgICBmbG9vZE9wYWNpdHk6IG51bGwsCiAgICAgICAgZm9jdXNhYmxlOiBudWxsLAogICAgICAgIGZvY3VzSGlnaGxpZ2h0OiBudWxsLAogICAgICAgIGZvbnRGYW1pbHk6IG51bGwsCiAgICAgICAgZm9udFNpemU6IG51bGwsCiAgICAgICAgZm9udFNpemVBZGp1c3Q6IG51bGwsCiAgICAgICAgZm9udFN0cmV0Y2g6IG51bGwsCiAgICAgICAgZm9udFN0eWxlOiBudWxsLAogICAgICAgIGZvbnRWYXJpYW50OiBudWxsLAogICAgICAgIGZvbnRXZWlnaHQ6IG51bGwsCiAgICAgICAgZm9ybWF0OiBudWxsLAogICAgICAgIGZyOiBudWxsLAogICAgICAgIGZyb206IG51bGwsCiAgICAgICAgZng6IG51bGwsCiAgICAgICAgZnk6IG51bGwsCiAgICAgICAgZzE6IGNvbW1hU2VwYXJhdGVkLAogICAgICAgIGcyOiBjb21tYVNlcGFyYXRlZCwKICAgICAgICBnbHlwaE5hbWU6IGNvbW1hU2VwYXJhdGVkLAogICAgICAgIGdseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsOiBudWxsLAogICAgICAgIGdseXBoT3JpZW50YXRpb25WZXJ0aWNhbDogbnVsbCwKICAgICAgICBnbHlwaFJlZjogbnVsbCwKICAgICAgICBncmFkaWVudFRyYW5zZm9ybTogbnVsbCwKICAgICAgICBncmFkaWVudFVuaXRzOiBudWxsLAogICAgICAgIGhhbmRsZXI6IG51bGwsCiAgICAgICAgaGFuZ2luZzogbnVtYmVyLAogICAgICAgIGhhdGNoQ29udGVudFVuaXRzOiBudWxsLAogICAgICAgIGhhdGNoVW5pdHM6IG51bGwsCiAgICAgICAgaGVpZ2h0OiBudWxsLAogICAgICAgIGhyZWY6IG51bGwsCiAgICAgICAgaHJlZkxhbmc6IG51bGwsCiAgICAgICAgaG9yaXpBZHZYOiBudW1iZXIsCiAgICAgICAgaG9yaXpPcmlnaW5YOiBudW1iZXIsCiAgICAgICAgaG9yaXpPcmlnaW5ZOiBudW1iZXIsCiAgICAgICAgaWQ6IG51bGwsCiAgICAgICAgaWRlb2dyYXBoaWM6IG51bWJlciwKICAgICAgICBpbWFnZVJlbmRlcmluZzogbnVsbCwKICAgICAgICBpbml0aWFsVmlzaWJpbGl0eTogbnVsbCwKICAgICAgICBpbjogbnVsbCwKICAgICAgICBpbjI6IG51bGwsCiAgICAgICAgaW50ZXJjZXB0OiBudW1iZXIsCiAgICAgICAgazogbnVtYmVyLAogICAgICAgIGsxOiBudW1iZXIsCiAgICAgICAgazI6IG51bWJlciwKICAgICAgICBrMzogbnVtYmVyLAogICAgICAgIGs0OiBudW1iZXIsCiAgICAgICAga2VybmVsTWF0cml4OiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICAgICAga2VybmVsVW5pdExlbmd0aDogbnVsbCwKICAgICAgICBrZXlQb2ludHM6IG51bGwsCiAgICAgICAgLy8gU0VNSV9DT0xPTl9TRVBBUkFURUQKICAgICAgICBrZXlTcGxpbmVzOiBudWxsLAogICAgICAgIC8vIFNFTUlfQ09MT05fU0VQQVJBVEVECiAgICAgICAga2V5VGltZXM6IG51bGwsCiAgICAgICAgLy8gU0VNSV9DT0xPTl9TRVBBUkFURUQKICAgICAgICBrZXJuaW5nOiBudWxsLAogICAgICAgIGxhbmc6IG51bGwsCiAgICAgICAgbGVuZ3RoQWRqdXN0OiBudWxsLAogICAgICAgIGxldHRlclNwYWNpbmc6IG51bGwsCiAgICAgICAgbGlnaHRpbmdDb2xvcjogbnVsbCwKICAgICAgICBsaW1pdGluZ0NvbmVBbmdsZTogbnVtYmVyLAogICAgICAgIGxvY2FsOiBudWxsLAogICAgICAgIG1hcmtlckVuZDogbnVsbCwKICAgICAgICBtYXJrZXJNaWQ6IG51bGwsCiAgICAgICAgbWFya2VyU3RhcnQ6IG51bGwsCiAgICAgICAgbWFya2VySGVpZ2h0OiBudWxsLAogICAgICAgIG1hcmtlclVuaXRzOiBudWxsLAogICAgICAgIG1hcmtlcldpZHRoOiBudWxsLAogICAgICAgIG1hc2s6IG51bGwsCiAgICAgICAgbWFza0NvbnRlbnRVbml0czogbnVsbCwKICAgICAgICBtYXNrVW5pdHM6IG51bGwsCiAgICAgICAgbWF0aGVtYXRpY2FsOiBudWxsLAogICAgICAgIG1heDogbnVsbCwKICAgICAgICBtZWRpYTogbnVsbCwKICAgICAgICBtZWRpYUNoYXJhY3RlckVuY29kaW5nOiBudWxsLAogICAgICAgIG1lZGlhQ29udGVudEVuY29kaW5nczogbnVsbCwKICAgICAgICBtZWRpYVNpemU6IG51bWJlciwKICAgICAgICBtZWRpYVRpbWU6IG51bGwsCiAgICAgICAgbWV0aG9kOiBudWxsLAogICAgICAgIG1pbjogbnVsbCwKICAgICAgICBtb2RlOiBudWxsLAogICAgICAgIG5hbWU6IG51bGwsCiAgICAgICAgbmF2RG93bjogbnVsbCwKICAgICAgICBuYXZEb3duTGVmdDogbnVsbCwKICAgICAgICBuYXZEb3duUmlnaHQ6IG51bGwsCiAgICAgICAgbmF2TGVmdDogbnVsbCwKICAgICAgICBuYXZOZXh0OiBudWxsLAogICAgICAgIG5hdlByZXY6IG51bGwsCiAgICAgICAgbmF2UmlnaHQ6IG51bGwsCiAgICAgICAgbmF2VXA6IG51bGwsCiAgICAgICAgbmF2VXBMZWZ0OiBudWxsLAogICAgICAgIG5hdlVwUmlnaHQ6IG51bGwsCiAgICAgICAgbnVtT2N0YXZlczogbnVsbCwKICAgICAgICBvYnNlcnZlcjogbnVsbCwKICAgICAgICBvZmZzZXQ6IG51bGwsCiAgICAgICAgb25BYm9ydDogbnVsbCwKICAgICAgICBvbkFjdGl2YXRlOiBudWxsLAogICAgICAgIG9uQWZ0ZXJQcmludDogbnVsbCwKICAgICAgICBvbkJlZm9yZVByaW50OiBudWxsLAogICAgICAgIG9uQmVnaW46IG51bGwsCiAgICAgICAgb25DYW5jZWw6IG51bGwsCiAgICAgICAgb25DYW5QbGF5OiBudWxsLAogICAgICAgIG9uQ2FuUGxheVRocm91Z2g6IG51bGwsCiAgICAgICAgb25DaGFuZ2U6IG51bGwsCiAgICAgICAgb25DbGljazogbnVsbCwKICAgICAgICBvbkNsb3NlOiBudWxsLAogICAgICAgIG9uQ29weTogbnVsbCwKICAgICAgICBvbkN1ZUNoYW5nZTogbnVsbCwKICAgICAgICBvbkN1dDogbnVsbCwKICAgICAgICBvbkRibENsaWNrOiBudWxsLAogICAgICAgIG9uRHJhZzogbnVsbCwKICAgICAgICBvbkRyYWdFbmQ6IG51bGwsCiAgICAgICAgb25EcmFnRW50ZXI6IG51bGwsCiAgICAgICAgb25EcmFnRXhpdDogbnVsbCwKICAgICAgICBvbkRyYWdMZWF2ZTogbnVsbCwKICAgICAgICBvbkRyYWdPdmVyOiBudWxsLAogICAgICAgIG9uRHJhZ1N0YXJ0OiBudWxsLAogICAgICAgIG9uRHJvcDogbnVsbCwKICAgICAgICBvbkR1cmF0aW9uQ2hhbmdlOiBudWxsLAogICAgICAgIG9uRW1wdGllZDogbnVsbCwKICAgICAgICBvbkVuZDogbnVsbCwKICAgICAgICBvbkVuZGVkOiBudWxsLAogICAgICAgIG9uRXJyb3I6IG51bGwsCiAgICAgICAgb25Gb2N1czogbnVsbCwKICAgICAgICBvbkZvY3VzSW46IG51bGwsCiAgICAgICAgb25Gb2N1c091dDogbnVsbCwKICAgICAgICBvbkhhc2hDaGFuZ2U6IG51bGwsCiAgICAgICAgb25JbnB1dDogbnVsbCwKICAgICAgICBvbkludmFsaWQ6IG51bGwsCiAgICAgICAgb25LZXlEb3duOiBudWxsLAogICAgICAgIG9uS2V5UHJlc3M6IG51bGwsCiAgICAgICAgb25LZXlVcDogbnVsbCwKICAgICAgICBvbkxvYWQ6IG51bGwsCiAgICAgICAgb25Mb2FkZWREYXRhOiBudWxsLAogICAgICAgIG9uTG9hZGVkTWV0YWRhdGE6IG51bGwsCiAgICAgICAgb25Mb2FkU3RhcnQ6IG51bGwsCiAgICAgICAgb25NZXNzYWdlOiBudWxsLAogICAgICAgIG9uTW91c2VEb3duOiBudWxsLAogICAgICAgIG9uTW91c2VFbnRlcjogbnVsbCwKICAgICAgICBvbk1vdXNlTGVhdmU6IG51bGwsCiAgICAgICAgb25Nb3VzZU1vdmU6IG51bGwsCiAgICAgICAgb25Nb3VzZU91dDogbnVsbCwKICAgICAgICBvbk1vdXNlT3ZlcjogbnVsbCwKICAgICAgICBvbk1vdXNlVXA6IG51bGwsCiAgICAgICAgb25Nb3VzZVdoZWVsOiBudWxsLAogICAgICAgIG9uT2ZmbGluZTogbnVsbCwKICAgICAgICBvbk9ubGluZTogbnVsbCwKICAgICAgICBvblBhZ2VIaWRlOiBudWxsLAogICAgICAgIG9uUGFnZVNob3c6IG51bGwsCiAgICAgICAgb25QYXN0ZTogbnVsbCwKICAgICAgICBvblBhdXNlOiBudWxsLAogICAgICAgIG9uUGxheTogbnVsbCwKICAgICAgICBvblBsYXlpbmc6IG51bGwsCiAgICAgICAgb25Qb3BTdGF0ZTogbnVsbCwKICAgICAgICBvblByb2dyZXNzOiBudWxsLAogICAgICAgIG9uUmF0ZUNoYW5nZTogbnVsbCwKICAgICAgICBvblJlcGVhdDogbnVsbCwKICAgICAgICBvblJlc2V0OiBudWxsLAogICAgICAgIG9uUmVzaXplOiBudWxsLAogICAgICAgIG9uU2Nyb2xsOiBudWxsLAogICAgICAgIG9uU2Vla2VkOiBudWxsLAogICAgICAgIG9uU2Vla2luZzogbnVsbCwKICAgICAgICBvblNlbGVjdDogbnVsbCwKICAgICAgICBvblNob3c6IG51bGwsCiAgICAgICAgb25TdGFsbGVkOiBudWxsLAogICAgICAgIG9uU3RvcmFnZTogbnVsbCwKICAgICAgICBvblN1Ym1pdDogbnVsbCwKICAgICAgICBvblN1c3BlbmQ6IG51bGwsCiAgICAgICAgb25UaW1lVXBkYXRlOiBudWxsLAogICAgICAgIG9uVG9nZ2xlOiBudWxsLAogICAgICAgIG9uVW5sb2FkOiBudWxsLAogICAgICAgIG9uVm9sdW1lQ2hhbmdlOiBudWxsLAogICAgICAgIG9uV2FpdGluZzogbnVsbCwKICAgICAgICBvblpvb206IG51bGwsCiAgICAgICAgb3BhY2l0eTogbnVsbCwKICAgICAgICBvcGVyYXRvcjogbnVsbCwKICAgICAgICBvcmRlcjogbnVsbCwKICAgICAgICBvcmllbnQ6IG51bGwsCiAgICAgICAgb3JpZW50YXRpb246IG51bGwsCiAgICAgICAgb3JpZ2luOiBudWxsLAogICAgICAgIG92ZXJmbG93OiBudWxsLAogICAgICAgIG92ZXJsYXk6IG51bGwsCiAgICAgICAgb3ZlcmxpbmVQb3NpdGlvbjogbnVtYmVyLAogICAgICAgIG92ZXJsaW5lVGhpY2tuZXNzOiBudW1iZXIsCiAgICAgICAgcGFpbnRPcmRlcjogbnVsbCwKICAgICAgICBwYW5vc2UxOiBudWxsLAogICAgICAgIHBhdGg6IG51bGwsCiAgICAgICAgcGF0aExlbmd0aDogbnVtYmVyLAogICAgICAgIHBhdHRlcm5Db250ZW50VW5pdHM6IG51bGwsCiAgICAgICAgcGF0dGVyblRyYW5zZm9ybTogbnVsbCwKICAgICAgICBwYXR0ZXJuVW5pdHM6IG51bGwsCiAgICAgICAgcGhhc2U6IG51bGwsCiAgICAgICAgcGluZzogc3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgcGl0Y2g6IG51bGwsCiAgICAgICAgcGxheWJhY2tPcmRlcjogbnVsbCwKICAgICAgICBwb2ludGVyRXZlbnRzOiBudWxsLAogICAgICAgIHBvaW50czogbnVsbCwKICAgICAgICBwb2ludHNBdFg6IG51bWJlciwKICAgICAgICBwb2ludHNBdFk6IG51bWJlciwKICAgICAgICBwb2ludHNBdFo6IG51bWJlciwKICAgICAgICBwcmVzZXJ2ZUFscGhhOiBudWxsLAogICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW86IG51bGwsCiAgICAgICAgcHJpbWl0aXZlVW5pdHM6IG51bGwsCiAgICAgICAgcHJvcGFnYXRlOiBudWxsLAogICAgICAgIHByb3BlcnR5OiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgcjogbnVsbCwKICAgICAgICByYWRpdXM6IG51bGwsCiAgICAgICAgcmVmZXJyZXJQb2xpY3k6IG51bGwsCiAgICAgICAgcmVmWDogbnVsbCwKICAgICAgICByZWZZOiBudWxsLAogICAgICAgIHJlbDogY29tbWFPclNwYWNlU2VwYXJhdGVkLAogICAgICAgIHJldjogY29tbWFPclNwYWNlU2VwYXJhdGVkLAogICAgICAgIHJlbmRlcmluZ0ludGVudDogbnVsbCwKICAgICAgICByZXBlYXRDb3VudDogbnVsbCwKICAgICAgICByZXBlYXREdXI6IG51bGwsCiAgICAgICAgcmVxdWlyZWRFeHRlbnNpb25zOiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgcmVxdWlyZWRGZWF0dXJlczogY29tbWFPclNwYWNlU2VwYXJhdGVkLAogICAgICAgIHJlcXVpcmVkRm9udHM6IGNvbW1hT3JTcGFjZVNlcGFyYXRlZCwKICAgICAgICByZXF1aXJlZEZvcm1hdHM6IGNvbW1hT3JTcGFjZVNlcGFyYXRlZCwKICAgICAgICByZXNvdXJjZTogbnVsbCwKICAgICAgICByZXN0YXJ0OiBudWxsLAogICAgICAgIHJlc3VsdDogbnVsbCwKICAgICAgICByb3RhdGU6IG51bGwsCiAgICAgICAgcng6IG51bGwsCiAgICAgICAgcnk6IG51bGwsCiAgICAgICAgc2NhbGU6IG51bGwsCiAgICAgICAgc2VlZDogbnVsbCwKICAgICAgICBzaGFwZVJlbmRlcmluZzogbnVsbCwKICAgICAgICBzaWRlOiBudWxsLAogICAgICAgIHNsb3BlOiBudWxsLAogICAgICAgIHNuYXBzaG90VGltZTogbnVsbCwKICAgICAgICBzcGVjdWxhckNvbnN0YW50OiBudW1iZXIsCiAgICAgICAgc3BlY3VsYXJFeHBvbmVudDogbnVtYmVyLAogICAgICAgIHNwcmVhZE1ldGhvZDogbnVsbCwKICAgICAgICBzcGFjaW5nOiBudWxsLAogICAgICAgIHN0YXJ0T2Zmc2V0OiBudWxsLAogICAgICAgIHN0ZERldmlhdGlvbjogbnVsbCwKICAgICAgICBzdGVtaDogbnVsbCwKICAgICAgICBzdGVtdjogbnVsbCwKICAgICAgICBzdGl0Y2hUaWxlczogbnVsbCwKICAgICAgICBzdG9wQ29sb3I6IG51bGwsCiAgICAgICAgc3RvcE9wYWNpdHk6IG51bGwsCiAgICAgICAgc3RyaWtldGhyb3VnaFBvc2l0aW9uOiBudW1iZXIsCiAgICAgICAgc3RyaWtldGhyb3VnaFRoaWNrbmVzczogbnVtYmVyLAogICAgICAgIHN0cmluZzogbnVsbCwKICAgICAgICBzdHJva2U6IG51bGwsCiAgICAgICAgc3Ryb2tlRGFzaEFycmF5OiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgc3Ryb2tlRGFzaE9mZnNldDogbnVsbCwKICAgICAgICBzdHJva2VMaW5lQ2FwOiBudWxsLAogICAgICAgIHN0cm9rZUxpbmVKb2luOiBudWxsLAogICAgICAgIHN0cm9rZU1pdGVyTGltaXQ6IG51bWJlciwKICAgICAgICBzdHJva2VPcGFjaXR5OiBudW1iZXIsCiAgICAgICAgc3Ryb2tlV2lkdGg6IG51bGwsCiAgICAgICAgc3R5bGU6IG51bGwsCiAgICAgICAgc3VyZmFjZVNjYWxlOiBudW1iZXIsCiAgICAgICAgc3luY0JlaGF2aW9yOiBudWxsLAogICAgICAgIHN5bmNCZWhhdmlvckRlZmF1bHQ6IG51bGwsCiAgICAgICAgc3luY01hc3RlcjogbnVsbCwKICAgICAgICBzeW5jVG9sZXJhbmNlOiBudWxsLAogICAgICAgIHN5bmNUb2xlcmFuY2VEZWZhdWx0OiBudWxsLAogICAgICAgIHN5c3RlbUxhbmd1YWdlOiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgdGFiSW5kZXg6IG51bWJlciwKICAgICAgICB0YWJsZVZhbHVlczogbnVsbCwKICAgICAgICB0YXJnZXQ6IG51bGwsCiAgICAgICAgdGFyZ2V0WDogbnVtYmVyLAogICAgICAgIHRhcmdldFk6IG51bWJlciwKICAgICAgICB0ZXh0QW5jaG9yOiBudWxsLAogICAgICAgIHRleHREZWNvcmF0aW9uOiBudWxsLAogICAgICAgIHRleHRSZW5kZXJpbmc6IG51bGwsCiAgICAgICAgdGV4dExlbmd0aDogbnVsbCwKICAgICAgICB0aW1lbGluZUJlZ2luOiBudWxsLAogICAgICAgIHRpdGxlOiBudWxsLAogICAgICAgIHRyYW5zZm9ybUJlaGF2aW9yOiBudWxsLAogICAgICAgIHR5cGU6IG51bGwsCiAgICAgICAgdHlwZU9mOiBjb21tYU9yU3BhY2VTZXBhcmF0ZWQsCiAgICAgICAgdG86IG51bGwsCiAgICAgICAgdHJhbnNmb3JtOiBudWxsLAogICAgICAgIHRyYW5zZm9ybU9yaWdpbjogbnVsbCwKICAgICAgICB1MTogbnVsbCwKICAgICAgICB1MjogbnVsbCwKICAgICAgICB1bmRlcmxpbmVQb3NpdGlvbjogbnVtYmVyLAogICAgICAgIHVuZGVybGluZVRoaWNrbmVzczogbnVtYmVyLAogICAgICAgIHVuaWNvZGU6IG51bGwsCiAgICAgICAgdW5pY29kZUJpZGk6IG51bGwsCiAgICAgICAgdW5pY29kZVJhbmdlOiBudWxsLAogICAgICAgIHVuaXRzUGVyRW06IG51bWJlciwKICAgICAgICB2YWx1ZXM6IG51bGwsCiAgICAgICAgdkFscGhhYmV0aWM6IG51bWJlciwKICAgICAgICB2TWF0aGVtYXRpY2FsOiBudW1iZXIsCiAgICAgICAgdmVjdG9yRWZmZWN0OiBudWxsLAogICAgICAgIHZIYW5naW5nOiBudW1iZXIsCiAgICAgICAgdklkZW9ncmFwaGljOiBudW1iZXIsCiAgICAgICAgdmVyc2lvbjogbnVsbCwKICAgICAgICB2ZXJ0QWR2WTogbnVtYmVyLAogICAgICAgIHZlcnRPcmlnaW5YOiBudW1iZXIsCiAgICAgICAgdmVydE9yaWdpblk6IG51bWJlciwKICAgICAgICB2aWV3Qm94OiBudWxsLAogICAgICAgIHZpZXdUYXJnZXQ6IG51bGwsCiAgICAgICAgdmlzaWJpbGl0eTogbnVsbCwKICAgICAgICB3aWR0aDogbnVsbCwKICAgICAgICB3aWR0aHM6IG51bGwsCiAgICAgICAgd29yZFNwYWNpbmc6IG51bGwsCiAgICAgICAgd3JpdGluZ01vZGU6IG51bGwsCiAgICAgICAgeDogbnVsbCwKICAgICAgICB4MTogbnVsbCwKICAgICAgICB4MjogbnVsbCwKICAgICAgICB4Q2hhbm5lbFNlbGVjdG9yOiBudWxsLAogICAgICAgIHhIZWlnaHQ6IG51bWJlciwKICAgICAgICB5OiBudWxsLAogICAgICAgIHkxOiBudWxsLAogICAgICAgIHkyOiBudWxsLAogICAgICAgIHlDaGFubmVsU2VsZWN0b3I6IG51bGwsCiAgICAgICAgejogbnVsbCwKICAgICAgICB6b29tQW5kUGFuOiBudWxsCiAgICAgIH0sCiAgICAgIHNwYWNlOiAic3ZnIiwKICAgICAgdHJhbnNmb3JtOiBjYXNlU2Vuc2l0aXZlVHJhbnNmb3JtCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIveGxpbmsuanMKdmFyIHhsaW5rOwp2YXIgaW5pdF94bGluayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIveGxpbmsuanMiKCkgewogICAgaW5pdF9jcmVhdGUoKTsKICAgIHhsaW5rID0gY3JlYXRlNih7CiAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICB4TGlua0FjdHVhdGU6IG51bGwsCiAgICAgICAgeExpbmtBcmNSb2xlOiBudWxsLAogICAgICAgIHhMaW5rSHJlZjogbnVsbCwKICAgICAgICB4TGlua1JvbGU6IG51bGwsCiAgICAgICAgeExpbmtTaG93OiBudWxsLAogICAgICAgIHhMaW5rVGl0bGU6IG51bGwsCiAgICAgICAgeExpbmtUeXBlOiBudWxsCiAgICAgIH0sCiAgICAgIHNwYWNlOiAieGxpbmsiLAogICAgICB0cmFuc2Zvcm0oXzUsIHByb3BlcnR5OSkgewogICAgICAgIHJldHVybiAieGxpbms6IiArIHByb3BlcnR5OS5zbGljZSg1KS50b0xvd2VyQ2FzZSgpOwogICAgICB9CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIveG1sbnMuanMKdmFyIHhtbG5zOwp2YXIgaW5pdF94bWxucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIveG1sbnMuanMiKCkgewogICAgaW5pdF9jcmVhdGUoKTsKICAgIGluaXRfY2FzZV9pbnNlbnNpdGl2ZV90cmFuc2Zvcm0oKTsKICAgIHhtbG5zID0gY3JlYXRlNih7CiAgICAgIGF0dHJpYnV0ZXM6IHsgeG1sbnN4bGluazogInhtbG5zOnhsaW5rIiB9LAogICAgICBwcm9wZXJ0aWVzOiB7IHhtbG5zWExpbms6IG51bGwsIHhtbG5zOiBudWxsIH0sCiAgICAgIHNwYWNlOiAieG1sbnMiLAogICAgICB0cmFuc2Zvcm06IGNhc2VJbnNlbnNpdGl2ZVRyYW5zZm9ybQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3htbC5qcwp2YXIgeG1sOwp2YXIgaW5pdF94bWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL3htbC5qcyIoKSB7CiAgICBpbml0X2NyZWF0ZSgpOwogICAgeG1sID0gY3JlYXRlNih7CiAgICAgIHByb3BlcnRpZXM6IHsgeG1sQmFzZTogbnVsbCwgeG1sTGFuZzogbnVsbCwgeG1sU3BhY2U6IG51bGwgfSwKICAgICAgc3BhY2U6ICJ4bWwiLAogICAgICB0cmFuc2Zvcm0oXzUsIHByb3BlcnR5OSkgewogICAgICAgIHJldHVybiAieG1sOiIgKyBwcm9wZXJ0eTkuc2xpY2UoMykudG9Mb3dlckNhc2UoKTsKICAgICAgfQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL2hhc3QtdG8tcmVhY3QuanMKdmFyIGluaXRfaGFzdF90b19yZWFjdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3Byb3BlcnR5LWluZm9ybWF0aW9uQDcuMS4wL25vZGVfbW9kdWxlcy9wcm9wZXJ0eS1pbmZvcm1hdGlvbi9saWIvaGFzdC10by1yZWFjdC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vbGliL2ZpbmQuanMKZnVuY3Rpb24gZmluZDIoc2NoZW1hLCB2YWx1ZTIpIHsKICBjb25zdCBub3JtYWwgPSBub3JtYWxpemUzKHZhbHVlMik7CiAgbGV0IHByb3BlcnR5OSA9IHZhbHVlMjsKICBsZXQgVHlwZTIgPSBJbmZvOwogIGlmIChub3JtYWwgaW4gc2NoZW1hLm5vcm1hbCkgewogICAgcmV0dXJuIHNjaGVtYS5wcm9wZXJ0eVtzY2hlbWEubm9ybWFsW25vcm1hbF1dOwogIH0KICBpZiAobm9ybWFsLmxlbmd0aCA+IDQgJiYgbm9ybWFsLnNsaWNlKDAsIDQpID09PSAiZGF0YSIgJiYgdmFsaWQudGVzdCh2YWx1ZTIpKSB7CiAgICBpZiAodmFsdWUyLmNoYXJBdCg0KSA9PT0gIi0iKSB7CiAgICAgIGNvbnN0IHJlc3QgPSB2YWx1ZTIuc2xpY2UoNSkucmVwbGFjZShkYXNoLCBjYW1lbGNhc2UpOwogICAgICBwcm9wZXJ0eTkgPSAiZGF0YSIgKyByZXN0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcmVzdC5zbGljZSgxKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHJlc3QgPSB2YWx1ZTIuc2xpY2UoNCk7CiAgICAgIGlmICghZGFzaC50ZXN0KHJlc3QpKSB7CiAgICAgICAgbGV0IGRhc2hlcyA9IHJlc3QucmVwbGFjZShjYXAsIGtlYmFiKTsKICAgICAgICBpZiAoZGFzaGVzLmNoYXJBdCgwKSAhPT0gIi0iKSB7CiAgICAgICAgICBkYXNoZXMgPSAiLSIgKyBkYXNoZXM7CiAgICAgICAgfQogICAgICAgIHZhbHVlMiA9ICJkYXRhIiArIGRhc2hlczsKICAgICAgfQogICAgfQogICAgVHlwZTIgPSBEZWZpbmVkSW5mbzsKICB9CiAgcmV0dXJuIG5ldyBUeXBlMihwcm9wZXJ0eTksIHZhbHVlMik7Cn0KZnVuY3Rpb24ga2ViYWIoJDApIHsKICByZXR1cm4gIi0iICsgJDAudG9Mb3dlckNhc2UoKTsKfQpmdW5jdGlvbiBjYW1lbGNhc2UoJDApIHsKICByZXR1cm4gJDAuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7Cn0KdmFyIGNhcCwgZGFzaCwgdmFsaWQ7CnZhciBpbml0X2ZpbmQyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2xpYi9maW5kLmpzIigpIHsKICAgIGluaXRfZGVmaW5lZF9pbmZvKCk7CiAgICBpbml0X2luZm8oKTsKICAgIGluaXRfbm9ybWFsaXplKCk7CiAgICBjYXAgPSAvW0EtWl0vZzsKICAgIGRhc2ggPSAvLVthLXpdL2c7CiAgICB2YWxpZCA9IC9eZGF0YVstXHcuOl0rJC9pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcHJvcGVydHktaW5mb3JtYXRpb25ANy4xLjAvbm9kZV9tb2R1bGVzL3Byb3BlcnR5LWluZm9ybWF0aW9uL2luZGV4LmpzCnZhciBodG1sNCwgc3ZnMjsKdmFyIGluaXRfcHJvcGVydHlfaW5mb3JtYXRpb24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9wcm9wZXJ0eS1pbmZvcm1hdGlvbkA3LjEuMC9ub2RlX21vZHVsZXMvcHJvcGVydHktaW5mb3JtYXRpb24vaW5kZXguanMiKCkgewogICAgaW5pdF9tZXJnZTMoKTsKICAgIGluaXRfYXJpYSgpOwogICAgaW5pdF9odG1sOSgpOwogICAgaW5pdF9zdmcoKTsKICAgIGluaXRfeGxpbmsoKTsKICAgIGluaXRfeG1sbnMoKTsKICAgIGluaXRfeG1sKCk7CiAgICBpbml0X2hhc3RfdG9fcmVhY3QoKTsKICAgIGluaXRfZmluZDIoKTsKICAgIGluaXRfbm9ybWFsaXplKCk7CiAgICBodG1sNCA9IG1lcmdlMyhbYXJpYTIsIGh0bWwzLCB4bGluaywgeG1sbnMsIHhtbF0sICJodG1sIik7CiAgICBzdmcyID0gbWVyZ2UzKFthcmlhMiwgc3ZnLCB4bGluaywgeG1sbnMsIHhtbF0sICJzdmciKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi9jb3JlLmpzCmZ1bmN0aW9uIGNvcmUodmFsdWUyLCBvcHRpb25zKSB7CiAgdmFsdWUyID0gdmFsdWUyLnJlcGxhY2UoCiAgICBvcHRpb25zLnN1YnNldCA/IGNoYXJhY3RlcnNUb0V4cHJlc3Npb25DYWNoZWQob3B0aW9ucy5zdWJzZXQpIDogZGVmYXVsdFN1YnNldFJlZ2V4LAogICAgYmFzaWMKICApOwogIGlmIChvcHRpb25zLnN1YnNldCB8fCBvcHRpb25zLmVzY2FwZU9ubHkpIHsKICAgIHJldHVybiB2YWx1ZTI7CiAgfQogIHJldHVybiB2YWx1ZTIucmVwbGFjZShzdXJyb2dhdGVQYWlyc1JlZ2V4LCBzdXJyb2dhdGUpLnJlcGxhY2UoY29udHJvbENoYXJhY3RlcnNSZWdleCwgYmFzaWMpOwogIGZ1bmN0aW9uIHN1cnJvZ2F0ZShwYWlyLCBpbmRleDIsIGFsbDMpIHsKICAgIHJldHVybiBvcHRpb25zLmZvcm1hdCgKICAgICAgKHBhaXIuY2hhckNvZGVBdCgwKSAtIDU1Mjk2KSAqIDEwMjQgKyBwYWlyLmNoYXJDb2RlQXQoMSkgLSA1NjMyMCArIDY1NTM2LAogICAgICBhbGwzLmNoYXJDb2RlQXQoaW5kZXgyICsgMiksCiAgICAgIG9wdGlvbnMKICAgICk7CiAgfQogIGZ1bmN0aW9uIGJhc2ljKGNoYXJhY3RlciwgaW5kZXgyLCBhbGwzKSB7CiAgICByZXR1cm4gb3B0aW9ucy5mb3JtYXQoCiAgICAgIGNoYXJhY3Rlci5jaGFyQ29kZUF0KDApLAogICAgICBhbGwzLmNoYXJDb2RlQXQoaW5kZXgyICsgMSksCiAgICAgIG9wdGlvbnMKICAgICk7CiAgfQp9CmZ1bmN0aW9uIGNoYXJhY3RlcnNUb0V4cHJlc3Npb25DYWNoZWQoc3Vic2V0KSB7CiAgbGV0IGNhY2hlZCA9IHN1YnNldFRvUmVnZXhDYWNoZS5nZXQoc3Vic2V0KTsKICBpZiAoIWNhY2hlZCkgewogICAgY2FjaGVkID0gY2hhcmFjdGVyc1RvRXhwcmVzc2lvbihzdWJzZXQpOwogICAgc3Vic2V0VG9SZWdleENhY2hlLnNldChzdWJzZXQsIGNhY2hlZCk7CiAgfQogIHJldHVybiBjYWNoZWQ7Cn0KZnVuY3Rpb24gY2hhcmFjdGVyc1RvRXhwcmVzc2lvbihzdWJzZXQpIHsKICBjb25zdCBncm91cHMgPSBbXTsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgc3Vic2V0Lmxlbmd0aCkgewogICAgZ3JvdXBzLnB1c2goc3Vic2V0W2luZGV4Ml0ucmVwbGFjZShyZWdleEVzY2FwZVJlZ2V4LCAiXFwkJiIpKTsKICB9CiAgcmV0dXJuIG5ldyBSZWdFeHAoIig/OiIgKyBncm91cHMuam9pbigifCIpICsgIikiLCAiZyIpOwp9CnZhciBkZWZhdWx0U3Vic2V0UmVnZXgsIHN1cnJvZ2F0ZVBhaXJzUmVnZXgsIGNvbnRyb2xDaGFyYWN0ZXJzUmVnZXgsIHJlZ2V4RXNjYXBlUmVnZXgsIHN1YnNldFRvUmVnZXhDYWNoZTsKdmFyIGluaXRfY29yZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi9jb3JlLmpzIigpIHsKICAgIGRlZmF1bHRTdWJzZXRSZWdleCA9IC9bIiYnPD5gXS9nOwogICAgc3Vycm9nYXRlUGFpcnNSZWdleCA9IC9bXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl0vZzsKICAgIGNvbnRyb2xDaGFyYWN0ZXJzUmVnZXggPSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCwgdW5pY29ybi9uby1oZXgtZXNjYXBlCiAgICAvW1x4MDEtXHRcdlxmXHgwRS1ceDFGXHg3Rlx4ODFceDhEXHg4Rlx4OTBceDlEXHhBMC1cdUZGRkZdL2c7CiAgICByZWdleEVzY2FwZVJlZ2V4ID0gL1t8XFx7fSgpW1xdXiQrKj8uXS9nOwogICAgc3Vic2V0VG9SZWdleENhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9saWIvdXRpbC90by1oZXhhZGVjaW1hbC5qcwpmdW5jdGlvbiB0b0hleGFkZWNpbWFsKGNvZGU0LCBuZXh0Miwgb21pdCkgewogIGNvbnN0IHZhbHVlMiA9ICImI3giICsgY29kZTQudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7CiAgcmV0dXJuIG9taXQgJiYgbmV4dDIgJiYgIWhleGFkZWNpbWFsUmVnZXgudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHQyKSkgPyB2YWx1ZTIgOiB2YWx1ZTIgKyAiOyI7Cn0KdmFyIGhleGFkZWNpbWFsUmVnZXg7CnZhciBpbml0X3RvX2hleGFkZWNpbWFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vc3RyaW5naWZ5LWVudGl0aWVzQDQuMC40L25vZGVfbW9kdWxlcy9zdHJpbmdpZnktZW50aXRpZXMvbGliL3V0aWwvdG8taGV4YWRlY2ltYWwuanMiKCkgewogICAgaGV4YWRlY2ltYWxSZWdleCA9IC9bXGRBLUZhLWZdLzsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi91dGlsL3RvLWRlY2ltYWwuanMKZnVuY3Rpb24gdG9EZWNpbWFsKGNvZGU0LCBuZXh0Miwgb21pdCkgewogIGNvbnN0IHZhbHVlMiA9ICImIyIgKyBTdHJpbmcoY29kZTQpOwogIHJldHVybiBvbWl0ICYmIG5leHQyICYmICFkZWNpbWFsUmVnZXgudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHQyKSkgPyB2YWx1ZTIgOiB2YWx1ZTIgKyAiOyI7Cn0KdmFyIGRlY2ltYWxSZWdleDsKdmFyIGluaXRfdG9fZGVjaW1hbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi91dGlsL3RvLWRlY2ltYWwuanMiKCkgewogICAgZGVjaW1hbFJlZ2V4ID0gL1xkLzsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJhY3Rlci1lbnRpdGllcy1sZWdhY3lAMy4wLjAvbm9kZV9tb2R1bGVzL2NoYXJhY3Rlci1lbnRpdGllcy1sZWdhY3kvaW5kZXguanMKdmFyIGNoYXJhY3RlckVudGl0aWVzTGVnYWN5Owp2YXIgaW5pdF9jaGFyYWN0ZXJfZW50aXRpZXNfbGVnYWN5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vY2hhcmFjdGVyLWVudGl0aWVzLWxlZ2FjeUAzLjAuMC9ub2RlX21vZHVsZXMvY2hhcmFjdGVyLWVudGl0aWVzLWxlZ2FjeS9pbmRleC5qcyIoKSB7CiAgICBjaGFyYWN0ZXJFbnRpdGllc0xlZ2FjeSA9IFsKICAgICAgIkFFbGlnIiwKICAgICAgIkFNUCIsCiAgICAgICJBYWN1dGUiLAogICAgICAiQWNpcmMiLAogICAgICAiQWdyYXZlIiwKICAgICAgIkFyaW5nIiwKICAgICAgIkF0aWxkZSIsCiAgICAgICJBdW1sIiwKICAgICAgIkNPUFkiLAogICAgICAiQ2NlZGlsIiwKICAgICAgIkVUSCIsCiAgICAgICJFYWN1dGUiLAogICAgICAiRWNpcmMiLAogICAgICAiRWdyYXZlIiwKICAgICAgIkV1bWwiLAogICAgICAiR1QiLAogICAgICAiSWFjdXRlIiwKICAgICAgIkljaXJjIiwKICAgICAgIklncmF2ZSIsCiAgICAgICJJdW1sIiwKICAgICAgIkxUIiwKICAgICAgIk50aWxkZSIsCiAgICAgICJPYWN1dGUiLAogICAgICAiT2NpcmMiLAogICAgICAiT2dyYXZlIiwKICAgICAgIk9zbGFzaCIsCiAgICAgICJPdGlsZGUiLAogICAgICAiT3VtbCIsCiAgICAgICJRVU9UIiwKICAgICAgIlJFRyIsCiAgICAgICJUSE9STiIsCiAgICAgICJVYWN1dGUiLAogICAgICAiVWNpcmMiLAogICAgICAiVWdyYXZlIiwKICAgICAgIlV1bWwiLAogICAgICAiWWFjdXRlIiwKICAgICAgImFhY3V0ZSIsCiAgICAgICJhY2lyYyIsCiAgICAgICJhY3V0ZSIsCiAgICAgICJhZWxpZyIsCiAgICAgICJhZ3JhdmUiLAogICAgICAiYW1wIiwKICAgICAgImFyaW5nIiwKICAgICAgImF0aWxkZSIsCiAgICAgICJhdW1sIiwKICAgICAgImJydmJhciIsCiAgICAgICJjY2VkaWwiLAogICAgICAiY2VkaWwiLAogICAgICAiY2VudCIsCiAgICAgICJjb3B5IiwKICAgICAgImN1cnJlbiIsCiAgICAgICJkZWciLAogICAgICAiZGl2aWRlIiwKICAgICAgImVhY3V0ZSIsCiAgICAgICJlY2lyYyIsCiAgICAgICJlZ3JhdmUiLAogICAgICAiZXRoIiwKICAgICAgImV1bWwiLAogICAgICAiZnJhYzEyIiwKICAgICAgImZyYWMxNCIsCiAgICAgICJmcmFjMzQiLAogICAgICAiZ3QiLAogICAgICAiaWFjdXRlIiwKICAgICAgImljaXJjIiwKICAgICAgImlleGNsIiwKICAgICAgImlncmF2ZSIsCiAgICAgICJpcXVlc3QiLAogICAgICAiaXVtbCIsCiAgICAgICJsYXF1byIsCiAgICAgICJsdCIsCiAgICAgICJtYWNyIiwKICAgICAgIm1pY3JvIiwKICAgICAgIm1pZGRvdCIsCiAgICAgICJuYnNwIiwKICAgICAgIm5vdCIsCiAgICAgICJudGlsZGUiLAogICAgICAib2FjdXRlIiwKICAgICAgIm9jaXJjIiwKICAgICAgIm9ncmF2ZSIsCiAgICAgICJvcmRmIiwKICAgICAgIm9yZG0iLAogICAgICAib3NsYXNoIiwKICAgICAgIm90aWxkZSIsCiAgICAgICJvdW1sIiwKICAgICAgInBhcmEiLAogICAgICAicGx1c21uIiwKICAgICAgInBvdW5kIiwKICAgICAgInF1b3QiLAogICAgICAicmFxdW8iLAogICAgICAicmVnIiwKICAgICAgInNlY3QiLAogICAgICAic2h5IiwKICAgICAgInN1cDEiLAogICAgICAic3VwMiIsCiAgICAgICJzdXAzIiwKICAgICAgInN6bGlnIiwKICAgICAgInRob3JuIiwKICAgICAgInRpbWVzIiwKICAgICAgInVhY3V0ZSIsCiAgICAgICJ1Y2lyYyIsCiAgICAgICJ1Z3JhdmUiLAogICAgICAidW1sIiwKICAgICAgInV1bWwiLAogICAgICAieWFjdXRlIiwKICAgICAgInllbiIsCiAgICAgICJ5dW1sIgogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2NoYXJhY3Rlci1lbnRpdGllcy1odG1sNEAyLjEuMC9ub2RlX21vZHVsZXMvY2hhcmFjdGVyLWVudGl0aWVzLWh0bWw0L2luZGV4LmpzCnZhciBjaGFyYWN0ZXJFbnRpdGllc0h0bWw0Owp2YXIgaW5pdF9jaGFyYWN0ZXJfZW50aXRpZXNfaHRtbDQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9jaGFyYWN0ZXItZW50aXRpZXMtaHRtbDRAMi4xLjAvbm9kZV9tb2R1bGVzL2NoYXJhY3Rlci1lbnRpdGllcy1odG1sNC9pbmRleC5qcyIoKSB7CiAgICBjaGFyYWN0ZXJFbnRpdGllc0h0bWw0ID0gewogICAgICBuYnNwOiAiXHhBMCIsCiAgICAgIGlleGNsOiAiXHhBMSIsCiAgICAgIGNlbnQ6ICJceEEyIiwKICAgICAgcG91bmQ6ICJceEEzIiwKICAgICAgY3VycmVuOiAiXHhBNCIsCiAgICAgIHllbjogIlx4QTUiLAogICAgICBicnZiYXI6ICJceEE2IiwKICAgICAgc2VjdDogIlx4QTciLAogICAgICB1bWw6ICJceEE4IiwKICAgICAgY29weTogIlx4QTkiLAogICAgICBvcmRmOiAiXHhBQSIsCiAgICAgIGxhcXVvOiAiXHhBQiIsCiAgICAgIG5vdDogIlx4QUMiLAogICAgICBzaHk6ICJceEFEIiwKICAgICAgcmVnOiAiXHhBRSIsCiAgICAgIG1hY3I6ICJceEFGIiwKICAgICAgZGVnOiAiXHhCMCIsCiAgICAgIHBsdXNtbjogIlx4QjEiLAogICAgICBzdXAyOiAiXHhCMiIsCiAgICAgIHN1cDM6ICJceEIzIiwKICAgICAgYWN1dGU6ICJceEI0IiwKICAgICAgbWljcm86ICJceEI1IiwKICAgICAgcGFyYTogIlx4QjYiLAogICAgICBtaWRkb3Q6ICJceEI3IiwKICAgICAgY2VkaWw6ICJceEI4IiwKICAgICAgc3VwMTogIlx4QjkiLAogICAgICBvcmRtOiAiXHhCQSIsCiAgICAgIHJhcXVvOiAiXHhCQiIsCiAgICAgIGZyYWMxNDogIlx4QkMiLAogICAgICBmcmFjMTI6ICJceEJEIiwKICAgICAgZnJhYzM0OiAiXHhCRSIsCiAgICAgIGlxdWVzdDogIlx4QkYiLAogICAgICBBZ3JhdmU6ICJceEMwIiwKICAgICAgQWFjdXRlOiAiXHhDMSIsCiAgICAgIEFjaXJjOiAiXHhDMiIsCiAgICAgIEF0aWxkZTogIlx4QzMiLAogICAgICBBdW1sOiAiXHhDNCIsCiAgICAgIEFyaW5nOiAiXHhDNSIsCiAgICAgIEFFbGlnOiAiXHhDNiIsCiAgICAgIENjZWRpbDogIlx4QzciLAogICAgICBFZ3JhdmU6ICJceEM4IiwKICAgICAgRWFjdXRlOiAiXHhDOSIsCiAgICAgIEVjaXJjOiAiXHhDQSIsCiAgICAgIEV1bWw6ICJceENCIiwKICAgICAgSWdyYXZlOiAiXHhDQyIsCiAgICAgIElhY3V0ZTogIlx4Q0QiLAogICAgICBJY2lyYzogIlx4Q0UiLAogICAgICBJdW1sOiAiXHhDRiIsCiAgICAgIEVUSDogIlx4RDAiLAogICAgICBOdGlsZGU6ICJceEQxIiwKICAgICAgT2dyYXZlOiAiXHhEMiIsCiAgICAgIE9hY3V0ZTogIlx4RDMiLAogICAgICBPY2lyYzogIlx4RDQiLAogICAgICBPdGlsZGU6ICJceEQ1IiwKICAgICAgT3VtbDogIlx4RDYiLAogICAgICB0aW1lczogIlx4RDciLAogICAgICBPc2xhc2g6ICJceEQ4IiwKICAgICAgVWdyYXZlOiAiXHhEOSIsCiAgICAgIFVhY3V0ZTogIlx4REEiLAogICAgICBVY2lyYzogIlx4REIiLAogICAgICBVdW1sOiAiXHhEQyIsCiAgICAgIFlhY3V0ZTogIlx4REQiLAogICAgICBUSE9STjogIlx4REUiLAogICAgICBzemxpZzogIlx4REYiLAogICAgICBhZ3JhdmU6ICJceEUwIiwKICAgICAgYWFjdXRlOiAiXHhFMSIsCiAgICAgIGFjaXJjOiAiXHhFMiIsCiAgICAgIGF0aWxkZTogIlx4RTMiLAogICAgICBhdW1sOiAiXHhFNCIsCiAgICAgIGFyaW5nOiAiXHhFNSIsCiAgICAgIGFlbGlnOiAiXHhFNiIsCiAgICAgIGNjZWRpbDogIlx4RTciLAogICAgICBlZ3JhdmU6ICJceEU4IiwKICAgICAgZWFjdXRlOiAiXHhFOSIsCiAgICAgIGVjaXJjOiAiXHhFQSIsCiAgICAgIGV1bWw6ICJceEVCIiwKICAgICAgaWdyYXZlOiAiXHhFQyIsCiAgICAgIGlhY3V0ZTogIlx4RUQiLAogICAgICBpY2lyYzogIlx4RUUiLAogICAgICBpdW1sOiAiXHhFRiIsCiAgICAgIGV0aDogIlx4RjAiLAogICAgICBudGlsZGU6ICJceEYxIiwKICAgICAgb2dyYXZlOiAiXHhGMiIsCiAgICAgIG9hY3V0ZTogIlx4RjMiLAogICAgICBvY2lyYzogIlx4RjQiLAogICAgICBvdGlsZGU6ICJceEY1IiwKICAgICAgb3VtbDogIlx4RjYiLAogICAgICBkaXZpZGU6ICJceEY3IiwKICAgICAgb3NsYXNoOiAiXHhGOCIsCiAgICAgIHVncmF2ZTogIlx4RjkiLAogICAgICB1YWN1dGU6ICJceEZBIiwKICAgICAgdWNpcmM6ICJceEZCIiwKICAgICAgdXVtbDogIlx4RkMiLAogICAgICB5YWN1dGU6ICJceEZEIiwKICAgICAgdGhvcm46ICJceEZFIiwKICAgICAgeXVtbDogIlx4RkYiLAogICAgICBmbm9mOiAiXHUwMTkyIiwKICAgICAgQWxwaGE6ICJcdTAzOTEiLAogICAgICBCZXRhOiAiXHUwMzkyIiwKICAgICAgR2FtbWE6ICJcdTAzOTMiLAogICAgICBEZWx0YTogIlx1MDM5NCIsCiAgICAgIEVwc2lsb246ICJcdTAzOTUiLAogICAgICBaZXRhOiAiXHUwMzk2IiwKICAgICAgRXRhOiAiXHUwMzk3IiwKICAgICAgVGhldGE6ICJcdTAzOTgiLAogICAgICBJb3RhOiAiXHUwMzk5IiwKICAgICAgS2FwcGE6ICJcdTAzOUEiLAogICAgICBMYW1iZGE6ICJcdTAzOUIiLAogICAgICBNdTogIlx1MDM5QyIsCiAgICAgIE51OiAiXHUwMzlEIiwKICAgICAgWGk6ICJcdTAzOUUiLAogICAgICBPbWljcm9uOiAiXHUwMzlGIiwKICAgICAgUGk6ICJcdTAzQTAiLAogICAgICBSaG86ICJcdTAzQTEiLAogICAgICBTaWdtYTogIlx1MDNBMyIsCiAgICAgIFRhdTogIlx1MDNBNCIsCiAgICAgIFVwc2lsb246ICJcdTAzQTUiLAogICAgICBQaGk6ICJcdTAzQTYiLAogICAgICBDaGk6ICJcdTAzQTciLAogICAgICBQc2k6ICJcdTAzQTgiLAogICAgICBPbWVnYTogIlx1MDNBOSIsCiAgICAgIGFscGhhOiAiXHUwM0IxIiwKICAgICAgYmV0YTogIlx1MDNCMiIsCiAgICAgIGdhbW1hOiAiXHUwM0IzIiwKICAgICAgZGVsdGE6ICJcdTAzQjQiLAogICAgICBlcHNpbG9uOiAiXHUwM0I1IiwKICAgICAgemV0YTogIlx1MDNCNiIsCiAgICAgIGV0YTogIlx1MDNCNyIsCiAgICAgIHRoZXRhOiAiXHUwM0I4IiwKICAgICAgaW90YTogIlx1MDNCOSIsCiAgICAgIGthcHBhOiAiXHUwM0JBIiwKICAgICAgbGFtYmRhOiAiXHUwM0JCIiwKICAgICAgbXU6ICJcdTAzQkMiLAogICAgICBudTogIlx1MDNCRCIsCiAgICAgIHhpOiAiXHUwM0JFIiwKICAgICAgb21pY3JvbjogIlx1MDNCRiIsCiAgICAgIHBpOiAiXHUwM0MwIiwKICAgICAgcmhvOiAiXHUwM0MxIiwKICAgICAgc2lnbWFmOiAiXHUwM0MyIiwKICAgICAgc2lnbWE6ICJcdTAzQzMiLAogICAgICB0YXU6ICJcdTAzQzQiLAogICAgICB1cHNpbG9uOiAiXHUwM0M1IiwKICAgICAgcGhpOiAiXHUwM0M2IiwKICAgICAgY2hpOiAiXHUwM0M3IiwKICAgICAgcHNpOiAiXHUwM0M4IiwKICAgICAgb21lZ2E6ICJcdTAzQzkiLAogICAgICB0aGV0YXN5bTogIlx1MDNEMSIsCiAgICAgIHVwc2loOiAiXHUwM0QyIiwKICAgICAgcGl2OiAiXHUwM0Q2IiwKICAgICAgYnVsbDogIlx1MjAyMiIsCiAgICAgIGhlbGxpcDogIlx1MjAyNiIsCiAgICAgIHByaW1lOiAiXHUyMDMyIiwKICAgICAgUHJpbWU6ICJcdTIwMzMiLAogICAgICBvbGluZTogIlx1MjAzRSIsCiAgICAgIGZyYXNsOiAiXHUyMDQ0IiwKICAgICAgd2VpZXJwOiAiXHUyMTE4IiwKICAgICAgaW1hZ2U6ICJcdTIxMTEiLAogICAgICByZWFsOiAiXHUyMTFDIiwKICAgICAgdHJhZGU6ICJcdTIxMjIiLAogICAgICBhbGVmc3ltOiAiXHUyMTM1IiwKICAgICAgbGFycjogIlx1MjE5MCIsCiAgICAgIHVhcnI6ICJcdTIxOTEiLAogICAgICByYXJyOiAiXHUyMTkyIiwKICAgICAgZGFycjogIlx1MjE5MyIsCiAgICAgIGhhcnI6ICJcdTIxOTQiLAogICAgICBjcmFycjogIlx1MjFCNSIsCiAgICAgIGxBcnI6ICJcdTIxRDAiLAogICAgICB1QXJyOiAiXHUyMUQxIiwKICAgICAgckFycjogIlx1MjFEMiIsCiAgICAgIGRBcnI6ICJcdTIxRDMiLAogICAgICBoQXJyOiAiXHUyMUQ0IiwKICAgICAgZm9yYWxsOiAiXHUyMjAwIiwKICAgICAgcGFydDogIlx1MjIwMiIsCiAgICAgIGV4aXN0OiAiXHUyMjAzIiwKICAgICAgZW1wdHk6ICJcdTIyMDUiLAogICAgICBuYWJsYTogIlx1MjIwNyIsCiAgICAgIGlzaW46ICJcdTIyMDgiLAogICAgICBub3RpbjogIlx1MjIwOSIsCiAgICAgIG5pOiAiXHUyMjBCIiwKICAgICAgcHJvZDogIlx1MjIwRiIsCiAgICAgIHN1bTogIlx1MjIxMSIsCiAgICAgIG1pbnVzOiAiXHUyMjEyIiwKICAgICAgbG93YXN0OiAiXHUyMjE3IiwKICAgICAgcmFkaWM6ICJcdTIyMUEiLAogICAgICBwcm9wOiAiXHUyMjFEIiwKICAgICAgaW5maW46ICJcdTIyMUUiLAogICAgICBhbmc6ICJcdTIyMjAiLAogICAgICBhbmQ6ICJcdTIyMjciLAogICAgICBvcjogIlx1MjIyOCIsCiAgICAgIGNhcDogIlx1MjIyOSIsCiAgICAgIGN1cDogIlx1MjIyQSIsCiAgICAgIGludDogIlx1MjIyQiIsCiAgICAgIHRoZXJlNDogIlx1MjIzNCIsCiAgICAgIHNpbTogIlx1MjIzQyIsCiAgICAgIGNvbmc6ICJcdTIyNDUiLAogICAgICBhc3ltcDogIlx1MjI0OCIsCiAgICAgIG5lOiAiXHUyMjYwIiwKICAgICAgZXF1aXY6ICJcdTIyNjEiLAogICAgICBsZTogIlx1MjI2NCIsCiAgICAgIGdlOiAiXHUyMjY1IiwKICAgICAgc3ViOiAiXHUyMjgyIiwKICAgICAgc3VwOiAiXHUyMjgzIiwKICAgICAgbnN1YjogIlx1MjI4NCIsCiAgICAgIHN1YmU6ICJcdTIyODYiLAogICAgICBzdXBlOiAiXHUyMjg3IiwKICAgICAgb3BsdXM6ICJcdTIyOTUiLAogICAgICBvdGltZXM6ICJcdTIyOTciLAogICAgICBwZXJwOiAiXHUyMkE1IiwKICAgICAgc2RvdDogIlx1MjJDNSIsCiAgICAgIGxjZWlsOiAiXHUyMzA4IiwKICAgICAgcmNlaWw6ICJcdTIzMDkiLAogICAgICBsZmxvb3I6ICJcdTIzMEEiLAogICAgICByZmxvb3I6ICJcdTIzMEIiLAogICAgICBsYW5nOiAiXHUyMzI5IiwKICAgICAgcmFuZzogIlx1MjMyQSIsCiAgICAgIGxvejogIlx1MjVDQSIsCiAgICAgIHNwYWRlczogIlx1MjY2MCIsCiAgICAgIGNsdWJzOiAiXHUyNjYzIiwKICAgICAgaGVhcnRzOiAiXHUyNjY1IiwKICAgICAgZGlhbXM6ICJcdTI2NjYiLAogICAgICBxdW90OiAnIicsCiAgICAgIGFtcDogIiYiLAogICAgICBsdDogIjwiLAogICAgICBndDogIj4iLAogICAgICBPRWxpZzogIlx1MDE1MiIsCiAgICAgIG9lbGlnOiAiXHUwMTUzIiwKICAgICAgU2Nhcm9uOiAiXHUwMTYwIiwKICAgICAgc2Nhcm9uOiAiXHUwMTYxIiwKICAgICAgWXVtbDogIlx1MDE3OCIsCiAgICAgIGNpcmM6ICJcdTAyQzYiLAogICAgICB0aWxkZTogIlx1MDJEQyIsCiAgICAgIGVuc3A6ICJcdTIwMDIiLAogICAgICBlbXNwOiAiXHUyMDAzIiwKICAgICAgdGhpbnNwOiAiXHUyMDA5IiwKICAgICAgenduajogIlx1MjAwQyIsCiAgICAgIHp3ajogIlx1MjAwRCIsCiAgICAgIGxybTogIlx1MjAwRSIsCiAgICAgIHJsbTogIlx1MjAwRiIsCiAgICAgIG5kYXNoOiAiXHUyMDEzIiwKICAgICAgbWRhc2g6ICJcdTIwMTQiLAogICAgICBsc3F1bzogIlx1MjAxOCIsCiAgICAgIHJzcXVvOiAiXHUyMDE5IiwKICAgICAgc2JxdW86ICJcdTIwMUEiLAogICAgICBsZHF1bzogIlx1MjAxQyIsCiAgICAgIHJkcXVvOiAiXHUyMDFEIiwKICAgICAgYmRxdW86ICJcdTIwMUUiLAogICAgICBkYWdnZXI6ICJcdTIwMjAiLAogICAgICBEYWdnZXI6ICJcdTIwMjEiLAogICAgICBwZXJtaWw6ICJcdTIwMzAiLAogICAgICBsc2FxdW86ICJcdTIwMzkiLAogICAgICByc2FxdW86ICJcdTIwM0EiLAogICAgICBldXJvOiAiXHUyMEFDIgogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi9jb25zdGFudC9kYW5nZXJvdXMuanMKdmFyIGRhbmdlcm91czsKdmFyIGluaXRfZGFuZ2Vyb3VzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vc3RyaW5naWZ5LWVudGl0aWVzQDQuMC40L25vZGVfbW9kdWxlcy9zdHJpbmdpZnktZW50aXRpZXMvbGliL2NvbnN0YW50L2Rhbmdlcm91cy5qcyIoKSB7CiAgICBkYW5nZXJvdXMgPSBbCiAgICAgICJjZW50IiwKICAgICAgImNvcHkiLAogICAgICAiZGl2aWRlIiwKICAgICAgImd0IiwKICAgICAgImx0IiwKICAgICAgIm5vdCIsCiAgICAgICJwYXJhIiwKICAgICAgInRpbWVzIgogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi91dGlsL3RvLW5hbWVkLmpzCmZ1bmN0aW9uIHRvTmFtZWQoY29kZTQsIG5leHQyLCBvbWl0LCBhdHRyaWJ1dGUpIHsKICBjb25zdCBjaGFyYWN0ZXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGU0KTsKICBpZiAob3duOS5jYWxsKGNoYXJhY3RlcnMsIGNoYXJhY3RlcikpIHsKICAgIGNvbnN0IG5hbWUgPSBjaGFyYWN0ZXJzW2NoYXJhY3Rlcl07CiAgICBjb25zdCB2YWx1ZTIgPSAiJiIgKyBuYW1lOwogICAgaWYgKG9taXQgJiYgY2hhcmFjdGVyRW50aXRpZXNMZWdhY3kuaW5jbHVkZXMobmFtZSkgJiYgIWRhbmdlcm91cy5pbmNsdWRlcyhuYW1lKSAmJiAoIWF0dHJpYnV0ZSB8fCBuZXh0MiAmJiBuZXh0MiAhPT0gNjEgJiYgbm90QWxwaGFudW1lcmljUmVnZXgudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHQyKSkpKSB7CiAgICAgIHJldHVybiB2YWx1ZTI7CiAgICB9CiAgICByZXR1cm4gdmFsdWUyICsgIjsiOwogIH0KICByZXR1cm4gIiI7Cn0KdmFyIG93bjksIGNoYXJhY3RlcnMsIGtleSwgbm90QWxwaGFudW1lcmljUmVnZXg7CnZhciBpbml0X3RvX25hbWVkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vc3RyaW5naWZ5LWVudGl0aWVzQDQuMC40L25vZGVfbW9kdWxlcy9zdHJpbmdpZnktZW50aXRpZXMvbGliL3V0aWwvdG8tbmFtZWQuanMiKCkgewogICAgaW5pdF9jaGFyYWN0ZXJfZW50aXRpZXNfbGVnYWN5KCk7CiAgICBpbml0X2NoYXJhY3Rlcl9lbnRpdGllc19odG1sNCgpOwogICAgaW5pdF9kYW5nZXJvdXMoKTsKICAgIG93bjkgPSB7fS5oYXNPd25Qcm9wZXJ0eTsKICAgIGNoYXJhY3RlcnMgPSB7fTsKICAgIGZvciAoa2V5IGluIGNoYXJhY3RlckVudGl0aWVzSHRtbDQpIHsKICAgICAgaWYgKG93bjkuY2FsbChjaGFyYWN0ZXJFbnRpdGllc0h0bWw0LCBrZXkpKSB7CiAgICAgICAgY2hhcmFjdGVyc1tjaGFyYWN0ZXJFbnRpdGllc0h0bWw0W2tleV1dID0ga2V5OwogICAgICB9CiAgICB9CiAgICBub3RBbHBoYW51bWVyaWNSZWdleCA9IC9bXlxkQS1aYS16XS87CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9saWIvdXRpbC9mb3JtYXQtc21hcnQuanMKZnVuY3Rpb24gZm9ybWF0U21hcnQoY29kZTQsIG5leHQyLCBvcHRpb25zKSB7CiAgbGV0IG51bWVyaWMgPSB0b0hleGFkZWNpbWFsKGNvZGU0LCBuZXh0Miwgb3B0aW9ucy5vbWl0T3B0aW9uYWxTZW1pY29sb25zKTsKICBsZXQgbmFtZWQ7CiAgaWYgKG9wdGlvbnMudXNlTmFtZWRSZWZlcmVuY2VzIHx8IG9wdGlvbnMudXNlU2hvcnRlc3RSZWZlcmVuY2VzKSB7CiAgICBuYW1lZCA9IHRvTmFtZWQoCiAgICAgIGNvZGU0LAogICAgICBuZXh0MiwKICAgICAgb3B0aW9ucy5vbWl0T3B0aW9uYWxTZW1pY29sb25zLAogICAgICBvcHRpb25zLmF0dHJpYnV0ZQogICAgKTsKICB9CiAgaWYgKChvcHRpb25zLnVzZVNob3J0ZXN0UmVmZXJlbmNlcyB8fCAhbmFtZWQpICYmIG9wdGlvbnMudXNlU2hvcnRlc3RSZWZlcmVuY2VzKSB7CiAgICBjb25zdCBkZWNpbWFsID0gdG9EZWNpbWFsKGNvZGU0LCBuZXh0Miwgb3B0aW9ucy5vbWl0T3B0aW9uYWxTZW1pY29sb25zKTsKICAgIGlmIChkZWNpbWFsLmxlbmd0aCA8IG51bWVyaWMubGVuZ3RoKSB7CiAgICAgIG51bWVyaWMgPSBkZWNpbWFsOwogICAgfQogIH0KICByZXR1cm4gbmFtZWQgJiYgKCFvcHRpb25zLnVzZVNob3J0ZXN0UmVmZXJlbmNlcyB8fCBuYW1lZC5sZW5ndGggPCBudW1lcmljLmxlbmd0aCkgPyBuYW1lZCA6IG51bWVyaWM7Cn0KdmFyIGluaXRfZm9ybWF0X3NtYXJ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vc3RyaW5naWZ5LWVudGl0aWVzQDQuMC40L25vZGVfbW9kdWxlcy9zdHJpbmdpZnktZW50aXRpZXMvbGliL3V0aWwvZm9ybWF0LXNtYXJ0LmpzIigpIHsKICAgIGluaXRfdG9faGV4YWRlY2ltYWwoKTsKICAgIGluaXRfdG9fZGVjaW1hbCgpOwogICAgaW5pdF90b19uYW1lZCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vc3RyaW5naWZ5LWVudGl0aWVzQDQuMC40L25vZGVfbW9kdWxlcy9zdHJpbmdpZnktZW50aXRpZXMvbGliL3V0aWwvZm9ybWF0LWJhc2ljLmpzCmZ1bmN0aW9uIGZvcm1hdEJhc2ljKGNvZGU0KSB7CiAgcmV0dXJuICImI3giICsgY29kZTQudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkgKyAiOyI7Cn0KdmFyIGluaXRfZm9ybWF0X2Jhc2ljID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vc3RyaW5naWZ5LWVudGl0aWVzQDQuMC40L25vZGVfbW9kdWxlcy9zdHJpbmdpZnktZW50aXRpZXMvbGliL3V0aWwvZm9ybWF0LWJhc2ljLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N0cmluZ2lmeS1lbnRpdGllc0A0LjAuNC9ub2RlX21vZHVsZXMvc3RyaW5naWZ5LWVudGl0aWVzL2xpYi9pbmRleC5qcwpmdW5jdGlvbiBzdHJpbmdpZnlFbnRpdGllcyh2YWx1ZTIsIG9wdGlvbnMpIHsKICByZXR1cm4gY29yZSh2YWx1ZTIsIE9iamVjdC5hc3NpZ24oeyBmb3JtYXQ6IGZvcm1hdFNtYXJ0IH0sIG9wdGlvbnMpKTsKfQpmdW5jdGlvbiBzdHJpbmdpZnlFbnRpdGllc0xpZ2h0KHZhbHVlMiwgb3B0aW9ucykgewogIHJldHVybiBjb3JlKHZhbHVlMiwgT2JqZWN0LmFzc2lnbih7IGZvcm1hdDogZm9ybWF0QmFzaWMgfSwgb3B0aW9ucykpOwp9CnZhciBpbml0X2xpYjI4ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vc3RyaW5naWZ5LWVudGl0aWVzQDQuMC40L25vZGVfbW9kdWxlcy9zdHJpbmdpZnktZW50aXRpZXMvbGliL2luZGV4LmpzIigpIHsKICAgIGluaXRfY29yZSgpOwogICAgaW5pdF9mb3JtYXRfc21hcnQoKTsKICAgIGluaXRfZm9ybWF0X2Jhc2ljKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9pbmRleC5qcwp2YXIgaW5pdF9zdHJpbmdpZnlfZW50aXRpZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmdpZnktZW50aXRpZXNANC4wLjQvbm9kZV9tb2R1bGVzL3N0cmluZ2lmeS1lbnRpdGllcy9pbmRleC5qcyIoKSB7CiAgICBpbml0X2xpYjI4KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL2hhbmRsZS9jb21tZW50LmpzCmZ1bmN0aW9uIGNvbW1lbnQyKG5vZGUyLCBfMSwgXzIyLCBzdGF0ZTEwKSB7CiAgcmV0dXJuIHN0YXRlMTAuc2V0dGluZ3MuYm9ndXNDb21tZW50cyA/ICI8PyIgKyBzdHJpbmdpZnlFbnRpdGllcygKICAgIG5vZGUyLnZhbHVlLAogICAgT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUxMC5zZXR0aW5ncy5jaGFyYWN0ZXJSZWZlcmVuY2VzLCB7CiAgICAgIHN1YnNldDogYm9ndXNDb21tZW50RW50aXR5U3Vic2V0CiAgICB9KQogICkgKyAiPiIgOiAiPCEtLSIgKyBub2RlMi52YWx1ZS5yZXBsYWNlKGh0bWxDb21tZW50UmVnZXgsIGVuY29kZTIpICsgIi0tPiI7CiAgZnVuY3Rpb24gZW5jb2RlMigkMCkgewogICAgcmV0dXJuIHN0cmluZ2lmeUVudGl0aWVzKAogICAgICAkMCwKICAgICAgT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUxMC5zZXR0aW5ncy5jaGFyYWN0ZXJSZWZlcmVuY2VzLCB7CiAgICAgICAgc3Vic2V0OiBjb21tZW50RW50aXR5U3Vic2V0CiAgICAgIH0pCiAgICApOwogIH0KfQp2YXIgaHRtbENvbW1lbnRSZWdleCwgYm9ndXNDb21tZW50RW50aXR5U3Vic2V0LCBjb21tZW50RW50aXR5U3Vic2V0Owp2YXIgaW5pdF9jb21tZW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9oYW5kbGUvY29tbWVudC5qcyIoKSB7CiAgICBpbml0X3N0cmluZ2lmeV9lbnRpdGllcygpOwogICAgaHRtbENvbW1lbnRSZWdleCA9IC9ePnxeLT58PCEtLXwtLT58LS0hPnw8IS0kL2c7CiAgICBib2d1c0NvbW1lbnRFbnRpdHlTdWJzZXQgPSBbIj4iXTsKICAgIGNvbW1lbnRFbnRpdHlTdWJzZXQgPSBbIjwiLCAiPiJdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9oYW5kbGUvZG9jdHlwZS5qcwpmdW5jdGlvbiBkb2N0eXBlMihfMSwgXzIyLCBfMzIsIHN0YXRlMTApIHsKICByZXR1cm4gIjwhIiArIChzdGF0ZTEwLnNldHRpbmdzLnVwcGVyRG9jdHlwZSA/ICJET0NUWVBFIiA6ICJkb2N0eXBlIikgKyAoc3RhdGUxMC5zZXR0aW5ncy50aWdodERvY3R5cGUgPyAiIiA6ICIgIikgKyAiaHRtbD4iOwp9CnZhciBpbml0X2RvY3R5cGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL2hhbmRsZS9kb2N0eXBlLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2NvbW1hLXNlcGFyYXRlZC10b2tlbnNAMi4wLjMvbm9kZV9tb2R1bGVzL2NvbW1hLXNlcGFyYXRlZC10b2tlbnMvaW5kZXguanMKZnVuY3Rpb24gcGFyc2U3KHZhbHVlMikgewogIGNvbnN0IHRva2VucyA9IFtdOwogIGNvbnN0IGlucHV0ID0gU3RyaW5nKHZhbHVlMiB8fCAiIik7CiAgbGV0IGluZGV4MiA9IGlucHV0LmluZGV4T2YoIiwiKTsKICBsZXQgc3RhcnQgPSAwOwogIGxldCBlbmQzID0gZmFsc2U7CiAgd2hpbGUgKCFlbmQzKSB7CiAgICBpZiAoaW5kZXgyID09PSAtMSkgewogICAgICBpbmRleDIgPSBpbnB1dC5sZW5ndGg7CiAgICAgIGVuZDMgPSB0cnVlOwogICAgfQogICAgY29uc3QgdG9rZW4gPSBpbnB1dC5zbGljZShzdGFydCwgaW5kZXgyKS50cmltKCk7CiAgICBpZiAodG9rZW4gfHwgIWVuZDMpIHsKICAgICAgdG9rZW5zLnB1c2godG9rZW4pOwogICAgfQogICAgc3RhcnQgPSBpbmRleDIgKyAxOwogICAgaW5kZXgyID0gaW5wdXQuaW5kZXhPZigiLCIsIHN0YXJ0KTsKICB9CiAgcmV0dXJuIHRva2VuczsKfQpmdW5jdGlvbiBzdHJpbmdpZnk1KHZhbHVlcywgb3B0aW9ucykgewogIGNvbnN0IHNldHRpbmdzID0gb3B0aW9ucyB8fCB7fTsKICBjb25zdCBpbnB1dCA9IHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV0gPT09ICIiID8gWy4uLnZhbHVlcywgIiJdIDogdmFsdWVzOwogIHJldHVybiBpbnB1dC5qb2luKAogICAgKHNldHRpbmdzLnBhZFJpZ2h0ID8gIiAiIDogIiIpICsgIiwiICsgKHNldHRpbmdzLnBhZExlZnQgPT09IGZhbHNlID8gIiIgOiAiICIpCiAgKS50cmltKCk7Cn0KdmFyIGluaXRfY29tbWFfc2VwYXJhdGVkX3Rva2VucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2NvbW1hLXNlcGFyYXRlZC10b2tlbnNAMi4wLjMvbm9kZV9tb2R1bGVzL2NvbW1hLXNlcGFyYXRlZC10b2tlbnMvaW5kZXguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vc3BhY2Utc2VwYXJhdGVkLXRva2Vuc0AyLjAuMi9ub2RlX21vZHVsZXMvc3BhY2Utc2VwYXJhdGVkLXRva2Vucy9pbmRleC5qcwpmdW5jdGlvbiBwYXJzZTgodmFsdWUyKSB7CiAgY29uc3QgaW5wdXQgPSBTdHJpbmcodmFsdWUyIHx8ICIiKS50cmltKCk7CiAgcmV0dXJuIGlucHV0ID8gaW5wdXQuc3BsaXQoL1sgXHRcblxyXGZdKy9nKSA6IFtdOwp9CmZ1bmN0aW9uIHN0cmluZ2lmeTYodmFsdWVzKSB7CiAgcmV0dXJuIHZhbHVlcy5qb2luKCIgIikudHJpbSgpOwp9CnZhciBpbml0X3NwYWNlX3NlcGFyYXRlZF90b2tlbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9zcGFjZS1zZXBhcmF0ZWQtdG9rZW5zQDIuMC4yL25vZGVfbW9kdWxlcy9zcGFjZS1zZXBhcmF0ZWQtdG9rZW5zL2luZGV4LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC13aGl0ZXNwYWNlQDMuMC4wL25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtd2hpdGVzcGFjZS9saWIvaW5kZXguanMKZnVuY3Rpb24gd2hpdGVzcGFjZSh0aGluZykgewogIHJldHVybiB0eXBlb2YgdGhpbmcgPT09ICJvYmplY3QiID8gdGhpbmcudHlwZSA9PT0gInRleHQiID8gZW1wdHkzKHRoaW5nLnZhbHVlKSA6IGZhbHNlIDogZW1wdHkzKHRoaW5nKTsKfQpmdW5jdGlvbiBlbXB0eTModmFsdWUyKSB7CiAgcmV0dXJuIHZhbHVlMi5yZXBsYWNlKHJlLCAiIikgPT09ICIiOwp9CnZhciByZTsKdmFyIGluaXRfbGliMjkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtd2hpdGVzcGFjZUAzLjAuMC9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXdoaXRlc3BhY2UvbGliL2luZGV4LmpzIigpIHsKICAgIHJlID0gL1sgXHRcblxmXHJdL2c7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtd2hpdGVzcGFjZUAzLjAuMC9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXdoaXRlc3BhY2UvaW5kZXguanMKdmFyIGluaXRfaGFzdF91dGlsX3doaXRlc3BhY2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtd2hpdGVzcGFjZUAzLjAuMC9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXdoaXRlc3BhY2UvaW5kZXguanMiKCkgewogICAgaW5pdF9saWIyOSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9vbWlzc2lvbi91dGlsL3NpYmxpbmdzLmpzCmZ1bmN0aW9uIHNpYmxpbmdzKGluY3JlbWVudDIpIHsKICByZXR1cm4gc2libGluZzsKICBmdW5jdGlvbiBzaWJsaW5nKHBhcmVudCwgaW5kZXgyLCBpbmNsdWRlV2hpdGVzcGFjZSkgewogICAgY29uc3Qgc2libGluZ3MyID0gcGFyZW50ID8gcGFyZW50LmNoaWxkcmVuIDogZW1wdHlDaGlsZHJlbjsKICAgIGxldCBvZmZzZXQgPSAoaW5kZXgyIHx8IDApICsgaW5jcmVtZW50MjsKICAgIGxldCBuZXh0MiA9IHNpYmxpbmdzMltvZmZzZXRdOwogICAgaWYgKCFpbmNsdWRlV2hpdGVzcGFjZSkgewogICAgICB3aGlsZSAobmV4dDIgJiYgd2hpdGVzcGFjZShuZXh0MikpIHsKICAgICAgICBvZmZzZXQgKz0gaW5jcmVtZW50MjsKICAgICAgICBuZXh0MiA9IHNpYmxpbmdzMltvZmZzZXRdOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV4dDI7CiAgfQp9CnZhciBzaWJsaW5nQWZ0ZXIsIHNpYmxpbmdCZWZvcmUsIGVtcHR5Q2hpbGRyZW47CnZhciBpbml0X3NpYmxpbmdzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9vbWlzc2lvbi91dGlsL3NpYmxpbmdzLmpzIigpIHsKICAgIGluaXRfaGFzdF91dGlsX3doaXRlc3BhY2UoKTsKICAgIHNpYmxpbmdBZnRlciA9IHNpYmxpbmdzKDEpOwogICAgc2libGluZ0JlZm9yZSA9IHNpYmxpbmdzKC0xKTsKICAgIGVtcHR5Q2hpbGRyZW4gPSBbXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvb21pc3Npb24vb21pc3Npb24uanMKZnVuY3Rpb24gb21pc3Npb24oaGFuZGxlcnMyKSB7CiAgcmV0dXJuIG9taXQ7CiAgZnVuY3Rpb24gb21pdChub2RlMiwgaW5kZXgyLCBwYXJlbnQpIHsKICAgIHJldHVybiBvd24xMC5jYWxsKGhhbmRsZXJzMiwgbm9kZTIudGFnTmFtZSkgJiYgaGFuZGxlcnMyW25vZGUyLnRhZ05hbWVdKG5vZGUyLCBpbmRleDIsIHBhcmVudCk7CiAgfQp9CnZhciBvd24xMDsKdmFyIGluaXRfb21pc3Npb24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL29taXNzaW9uL29taXNzaW9uLmpzIigpIHsKICAgIG93bjEwID0ge30uaGFzT3duUHJvcGVydHk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL29taXNzaW9uL2Nsb3NpbmcuanMKZnVuY3Rpb24gaGVhZE9yQ29sZ3JvdXBPckNhcHRpb24oXzUsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIsIHRydWUpOwogIHJldHVybiAhbmV4dDIgfHwgbmV4dDIudHlwZSAhPT0gImNvbW1lbnQiICYmICEobmV4dDIudHlwZSA9PT0gInRleHQiICYmIHdoaXRlc3BhY2UobmV4dDIudmFsdWUuY2hhckF0KDApKSk7Cn0KZnVuY3Rpb24gaHRtbDUoXzUsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwogIHJldHVybiAhbmV4dDIgfHwgbmV4dDIudHlwZSAhPT0gImNvbW1lbnQiOwp9CmZ1bmN0aW9uIGJvZHkoXzUsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwogIHJldHVybiAhbmV4dDIgfHwgbmV4dDIudHlwZSAhPT0gImNvbW1lbnQiOwp9CmZ1bmN0aW9uIHA1KF81LCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IG5leHQyID0gc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyKTsKICByZXR1cm4gbmV4dDIgPyBuZXh0Mi50eXBlID09PSAiZWxlbWVudCIgJiYgKG5leHQyLnRhZ05hbWUgPT09ICJhZGRyZXNzIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiYXJ0aWNsZSIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImFzaWRlIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiYmxvY2txdW90ZSIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImRldGFpbHMiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJkaXYiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJkbCIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImZpZWxkc2V0IiB8fCBuZXh0Mi50YWdOYW1lID09PSAiZmlnY2FwdGlvbiIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImZpZ3VyZSIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImZvb3RlciIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImZvcm0iIHx8IG5leHQyLnRhZ05hbWUgPT09ICJoMSIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImgyIiB8fCBuZXh0Mi50YWdOYW1lID09PSAiaDMiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJoNCIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImg1IiB8fCBuZXh0Mi50YWdOYW1lID09PSAiaDYiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJoZWFkZXIiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJoZ3JvdXAiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJociIgfHwgbmV4dDIudGFnTmFtZSA9PT0gIm1haW4iIHx8IG5leHQyLnRhZ05hbWUgPT09ICJtZW51IiB8fCBuZXh0Mi50YWdOYW1lID09PSAibmF2IiB8fCBuZXh0Mi50YWdOYW1lID09PSAib2wiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJwIiB8fCBuZXh0Mi50YWdOYW1lID09PSAicHJlIiB8fCBuZXh0Mi50YWdOYW1lID09PSAic2VjdGlvbiIgfHwgbmV4dDIudGFnTmFtZSA9PT0gInRhYmxlIiB8fCBuZXh0Mi50YWdOYW1lID09PSAidWwiKSA6ICFwYXJlbnQgfHwgLy8gQ29uZnVzaW5nIHBhcmVudC4KICAhKHBhcmVudC50eXBlID09PSAiZWxlbWVudCIgJiYgKHBhcmVudC50YWdOYW1lID09PSAiYSIgfHwgcGFyZW50LnRhZ05hbWUgPT09ICJhdWRpbyIgfHwgcGFyZW50LnRhZ05hbWUgPT09ICJkZWwiIHx8IHBhcmVudC50YWdOYW1lID09PSAiaW5zIiB8fCBwYXJlbnQudGFnTmFtZSA9PT0gIm1hcCIgfHwgcGFyZW50LnRhZ05hbWUgPT09ICJub3NjcmlwdCIgfHwgcGFyZW50LnRhZ05hbWUgPT09ICJ2aWRlbyIpKTsKfQpmdW5jdGlvbiBsaShfNSwgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4Mik7CiAgcmV0dXJuICFuZXh0MiB8fCBuZXh0Mi50eXBlID09PSAiZWxlbWVudCIgJiYgbmV4dDIudGFnTmFtZSA9PT0gImxpIjsKfQpmdW5jdGlvbiBkdChfNSwgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4Mik7CiAgcmV0dXJuIEJvb2xlYW4oCiAgICBuZXh0MiAmJiBuZXh0Mi50eXBlID09PSAiZWxlbWVudCIgJiYgKG5leHQyLnRhZ05hbWUgPT09ICJkdCIgfHwgbmV4dDIudGFnTmFtZSA9PT0gImRkIikKICApOwp9CmZ1bmN0aW9uIGRkKF81LCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IG5leHQyID0gc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyKTsKICByZXR1cm4gIW5leHQyIHx8IG5leHQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiAobmV4dDIudGFnTmFtZSA9PT0gImR0IiB8fCBuZXh0Mi50YWdOYW1lID09PSAiZGQiKTsKfQpmdW5jdGlvbiBydWJ5RWxlbWVudChfNSwgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4Mik7CiAgcmV0dXJuICFuZXh0MiB8fCBuZXh0Mi50eXBlID09PSAiZWxlbWVudCIgJiYgKG5leHQyLnRhZ05hbWUgPT09ICJycCIgfHwgbmV4dDIudGFnTmFtZSA9PT0gInJ0Iik7Cn0KZnVuY3Rpb24gb3B0Z3JvdXAoXzUsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwogIHJldHVybiAhbmV4dDIgfHwgbmV4dDIudHlwZSA9PT0gImVsZW1lbnQiICYmIG5leHQyLnRhZ05hbWUgPT09ICJvcHRncm91cCI7Cn0KZnVuY3Rpb24gb3B0aW9uKF81LCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IG5leHQyID0gc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyKTsKICByZXR1cm4gIW5leHQyIHx8IG5leHQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiAobmV4dDIudGFnTmFtZSA9PT0gIm9wdGlvbiIgfHwgbmV4dDIudGFnTmFtZSA9PT0gIm9wdGdyb3VwIik7Cn0KZnVuY3Rpb24gdGhlYWQoXzUsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgbmV4dDIgPSBzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwogIHJldHVybiBCb29sZWFuKAogICAgbmV4dDIgJiYgbmV4dDIudHlwZSA9PT0gImVsZW1lbnQiICYmIChuZXh0Mi50YWdOYW1lID09PSAidGJvZHkiIHx8IG5leHQyLnRhZ05hbWUgPT09ICJ0Zm9vdCIpCiAgKTsKfQpmdW5jdGlvbiB0Ym9keShfNSwgaW5kZXgyLCBwYXJlbnQpIHsKICBjb25zdCBuZXh0MiA9IHNpYmxpbmdBZnRlcihwYXJlbnQsIGluZGV4Mik7CiAgcmV0dXJuICFuZXh0MiB8fCBuZXh0Mi50eXBlID09PSAiZWxlbWVudCIgJiYgKG5leHQyLnRhZ05hbWUgPT09ICJ0Ym9keSIgfHwgbmV4dDIudGFnTmFtZSA9PT0gInRmb290Iik7Cn0KZnVuY3Rpb24gdGZvb3QoXzUsIGluZGV4MiwgcGFyZW50KSB7CiAgcmV0dXJuICFzaWJsaW5nQWZ0ZXIocGFyZW50LCBpbmRleDIpOwp9CmZ1bmN0aW9uIHRyKF81LCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IG5leHQyID0gc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyKTsKICByZXR1cm4gIW5leHQyIHx8IG5leHQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiBuZXh0Mi50YWdOYW1lID09PSAidHIiOwp9CmZ1bmN0aW9uIGNlbGxzKF81LCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IG5leHQyID0gc2libGluZ0FmdGVyKHBhcmVudCwgaW5kZXgyKTsKICByZXR1cm4gIW5leHQyIHx8IG5leHQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiAobmV4dDIudGFnTmFtZSA9PT0gInRkIiB8fCBuZXh0Mi50YWdOYW1lID09PSAidGgiKTsKfQp2YXIgY2xvc2luZzsKdmFyIGluaXRfY2xvc2luZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvb21pc3Npb24vY2xvc2luZy5qcyIoKSB7CiAgICBpbml0X2hhc3RfdXRpbF93aGl0ZXNwYWNlKCk7CiAgICBpbml0X3NpYmxpbmdzKCk7CiAgICBpbml0X29taXNzaW9uKCk7CiAgICBjbG9zaW5nID0gb21pc3Npb24oewogICAgICBib2R5LAogICAgICBjYXB0aW9uOiBoZWFkT3JDb2xncm91cE9yQ2FwdGlvbiwKICAgICAgY29sZ3JvdXA6IGhlYWRPckNvbGdyb3VwT3JDYXB0aW9uLAogICAgICBkZCwKICAgICAgZHQsCiAgICAgIGhlYWQ6IGhlYWRPckNvbGdyb3VwT3JDYXB0aW9uLAogICAgICBodG1sOiBodG1sNSwKICAgICAgbGksCiAgICAgIG9wdGdyb3VwLAogICAgICBvcHRpb24sCiAgICAgIHA6IHA1LAogICAgICBycDogcnVieUVsZW1lbnQsCiAgICAgIHJ0OiBydWJ5RWxlbWVudCwKICAgICAgdGJvZHksCiAgICAgIHRkOiBjZWxscywKICAgICAgdGZvb3QsCiAgICAgIHRoOiBjZWxscywKICAgICAgdGhlYWQsCiAgICAgIHRyCiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvb21pc3Npb24vb3BlbmluZy5qcwpmdW5jdGlvbiBodG1sNihub2RlMikgewogIGNvbnN0IGhlYWQyID0gc2libGluZ0FmdGVyKG5vZGUyLCAtMSk7CiAgcmV0dXJuICFoZWFkMiB8fCBoZWFkMi50eXBlICE9PSAiY29tbWVudCI7Cn0KZnVuY3Rpb24gaGVhZChub2RlMikgewogIGNvbnN0IHNlZW4gPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogIGZvciAoY29uc3QgY2hpbGQyIG9mIG5vZGUyLmNoaWxkcmVuKSB7CiAgICBpZiAoY2hpbGQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiAoY2hpbGQyLnRhZ05hbWUgPT09ICJiYXNlIiB8fCBjaGlsZDIudGFnTmFtZSA9PT0gInRpdGxlIikpIHsKICAgICAgaWYgKHNlZW4uaGFzKGNoaWxkMi50YWdOYW1lKSkgcmV0dXJuIGZhbHNlOwogICAgICBzZWVuLmFkZChjaGlsZDIudGFnTmFtZSk7CiAgICB9CiAgfQogIGNvbnN0IGNoaWxkID0gbm9kZTIuY2hpbGRyZW5bMF07CiAgcmV0dXJuICFjaGlsZCB8fCBjaGlsZC50eXBlID09PSAiZWxlbWVudCI7Cn0KZnVuY3Rpb24gYm9keTIobm9kZTIpIHsKICBjb25zdCBoZWFkMiA9IHNpYmxpbmdBZnRlcihub2RlMiwgLTEsIHRydWUpOwogIHJldHVybiAhaGVhZDIgfHwgaGVhZDIudHlwZSAhPT0gImNvbW1lbnQiICYmICEoaGVhZDIudHlwZSA9PT0gInRleHQiICYmIHdoaXRlc3BhY2UoaGVhZDIudmFsdWUuY2hhckF0KDApKSkgJiYgIShoZWFkMi50eXBlID09PSAiZWxlbWVudCIgJiYgKGhlYWQyLnRhZ05hbWUgPT09ICJtZXRhIiB8fCBoZWFkMi50YWdOYW1lID09PSAibGluayIgfHwgaGVhZDIudGFnTmFtZSA9PT0gInNjcmlwdCIgfHwgaGVhZDIudGFnTmFtZSA9PT0gInN0eWxlIiB8fCBoZWFkMi50YWdOYW1lID09PSAidGVtcGxhdGUiKSk7Cn0KZnVuY3Rpb24gY29sZ3JvdXAobm9kZTIsIGluZGV4MiwgcGFyZW50KSB7CiAgY29uc3QgcHJldmlvdXMzID0gc2libGluZ0JlZm9yZShwYXJlbnQsIGluZGV4Mik7CiAgY29uc3QgaGVhZDIgPSBzaWJsaW5nQWZ0ZXIobm9kZTIsIC0xLCB0cnVlKTsKICBpZiAocGFyZW50ICYmIHByZXZpb3VzMyAmJiBwcmV2aW91czMudHlwZSA9PT0gImVsZW1lbnQiICYmIHByZXZpb3VzMy50YWdOYW1lID09PSAiY29sZ3JvdXAiICYmIGNsb3NpbmcocHJldmlvdXMzLCBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihwcmV2aW91czMpLCBwYXJlbnQpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiBCb29sZWFuKGhlYWQyICYmIGhlYWQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiBoZWFkMi50YWdOYW1lID09PSAiY29sIik7Cn0KZnVuY3Rpb24gdGJvZHkyKG5vZGUyLCBpbmRleDIsIHBhcmVudCkgewogIGNvbnN0IHByZXZpb3VzMyA9IHNpYmxpbmdCZWZvcmUocGFyZW50LCBpbmRleDIpOwogIGNvbnN0IGhlYWQyID0gc2libGluZ0FmdGVyKG5vZGUyLCAtMSk7CiAgaWYgKHBhcmVudCAmJiBwcmV2aW91czMgJiYgcHJldmlvdXMzLnR5cGUgPT09ICJlbGVtZW50IiAmJiAocHJldmlvdXMzLnRhZ05hbWUgPT09ICJ0aGVhZCIgfHwgcHJldmlvdXMzLnRhZ05hbWUgPT09ICJ0Ym9keSIpICYmIGNsb3NpbmcocHJldmlvdXMzLCBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihwcmV2aW91czMpLCBwYXJlbnQpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiBCb29sZWFuKGhlYWQyICYmIGhlYWQyLnR5cGUgPT09ICJlbGVtZW50IiAmJiBoZWFkMi50YWdOYW1lID09PSAidHIiKTsKfQp2YXIgb3BlbmluZzsKdmFyIGluaXRfb3BlbmluZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvb21pc3Npb24vb3BlbmluZy5qcyIoKSB7CiAgICBpbml0X2hhc3RfdXRpbF93aGl0ZXNwYWNlKCk7CiAgICBpbml0X3NpYmxpbmdzKCk7CiAgICBpbml0X2Nsb3NpbmcoKTsKICAgIGluaXRfb21pc3Npb24oKTsKICAgIG9wZW5pbmcgPSBvbWlzc2lvbih7CiAgICAgIGJvZHk6IGJvZHkyLAogICAgICBjb2xncm91cCwKICAgICAgaGVhZCwKICAgICAgaHRtbDogaHRtbDYsCiAgICAgIHRib2R5OiB0Ym9keTIKICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9oYW5kbGUvZWxlbWVudC5qcwpmdW5jdGlvbiBlbGVtZW50Myhub2RlMiwgaW5kZXgyLCBwYXJlbnQsIHN0YXRlMTApIHsKICBjb25zdCBzY2hlbWEgPSBzdGF0ZTEwLnNjaGVtYTsKICBjb25zdCBvbWl0ID0gc2NoZW1hLnNwYWNlID09PSAic3ZnIiA/IGZhbHNlIDogc3RhdGUxMC5zZXR0aW5ncy5vbWl0T3B0aW9uYWxUYWdzOwogIGxldCBzZWxmQ2xvc2luZyA9IHNjaGVtYS5zcGFjZSA9PT0gInN2ZyIgPyBzdGF0ZTEwLnNldHRpbmdzLmNsb3NlRW1wdHlFbGVtZW50cyA6IHN0YXRlMTAuc2V0dGluZ3Mudm9pZHMuaW5jbHVkZXMobm9kZTIudGFnTmFtZS50b0xvd2VyQ2FzZSgpKTsKICBjb25zdCBwYXJ0cyA9IFtdOwogIGxldCBsYXN0MzsKICBpZiAoc2NoZW1hLnNwYWNlID09PSAiaHRtbCIgJiYgbm9kZTIudGFnTmFtZSA9PT0gInN2ZyIpIHsKICAgIHN0YXRlMTAuc2NoZW1hID0gc3ZnMjsKICB9CiAgY29uc3QgYXR0cmlidXRlcyA9IHNlcmlhbGl6ZUF0dHJpYnV0ZXMoc3RhdGUxMCwgbm9kZTIucHJvcGVydGllcyk7CiAgY29uc3QgY29udGVudDMgPSBzdGF0ZTEwLmFsbCgKICAgIHNjaGVtYS5zcGFjZSA9PT0gImh0bWwiICYmIG5vZGUyLnRhZ05hbWUgPT09ICJ0ZW1wbGF0ZSIgPyBub2RlMi5jb250ZW50IDogbm9kZTIKICApOwogIHN0YXRlMTAuc2NoZW1hID0gc2NoZW1hOwogIGlmIChjb250ZW50Mykgc2VsZkNsb3NpbmcgPSBmYWxzZTsKICBpZiAoYXR0cmlidXRlcyB8fCAhb21pdCB8fCAhb3BlbmluZyhub2RlMiwgaW5kZXgyLCBwYXJlbnQpKSB7CiAgICBwYXJ0cy5wdXNoKCI8Iiwgbm9kZTIudGFnTmFtZSwgYXR0cmlidXRlcyA/ICIgIiArIGF0dHJpYnV0ZXMgOiAiIik7CiAgICBpZiAoc2VsZkNsb3NpbmcgJiYgKHNjaGVtYS5zcGFjZSA9PT0gInN2ZyIgfHwgc3RhdGUxMC5zZXR0aW5ncy5jbG9zZVNlbGZDbG9zaW5nKSkgewogICAgICBsYXN0MyA9IGF0dHJpYnV0ZXMuY2hhckF0KGF0dHJpYnV0ZXMubGVuZ3RoIC0gMSk7CiAgICAgIGlmICghc3RhdGUxMC5zZXR0aW5ncy50aWdodFNlbGZDbG9zaW5nIHx8IGxhc3QzID09PSAiLyIgfHwgbGFzdDMgJiYgbGFzdDMgIT09ICciJyAmJiBsYXN0MyAhPT0gIiciKSB7CiAgICAgICAgcGFydHMucHVzaCgiICIpOwogICAgICB9CiAgICAgIHBhcnRzLnB1c2goIi8iKTsKICAgIH0KICAgIHBhcnRzLnB1c2goIj4iKTsKICB9CiAgcGFydHMucHVzaChjb250ZW50Myk7CiAgaWYgKCFzZWxmQ2xvc2luZyAmJiAoIW9taXQgfHwgIWNsb3Npbmcobm9kZTIsIGluZGV4MiwgcGFyZW50KSkpIHsKICAgIHBhcnRzLnB1c2goIjwvIiArIG5vZGUyLnRhZ05hbWUgKyAiPiIpOwogIH0KICByZXR1cm4gcGFydHMuam9pbigiIik7Cn0KZnVuY3Rpb24gc2VyaWFsaXplQXR0cmlidXRlcyhzdGF0ZTEwLCBwcm9wZXJ0aWVzMikgewogIGNvbnN0IHZhbHVlcyA9IFtdOwogIGxldCBpbmRleDIgPSAtMTsKICBsZXQga2V5MjsKICBpZiAocHJvcGVydGllczIpIHsKICAgIGZvciAoa2V5MiBpbiBwcm9wZXJ0aWVzMikgewogICAgICBpZiAocHJvcGVydGllczJba2V5Ml0gIT09IG51bGwgJiYgcHJvcGVydGllczJba2V5Ml0gIT09IHZvaWQgMCkgewogICAgICAgIGNvbnN0IHZhbHVlMiA9IHNlcmlhbGl6ZUF0dHJpYnV0ZShzdGF0ZTEwLCBrZXkyLCBwcm9wZXJ0aWVzMltrZXkyXSk7CiAgICAgICAgaWYgKHZhbHVlMikgdmFsdWVzLnB1c2godmFsdWUyKTsKICAgICAgfQogICAgfQogIH0KICB3aGlsZSAoKytpbmRleDIgPCB2YWx1ZXMubGVuZ3RoKSB7CiAgICBjb25zdCBsYXN0MyA9IHN0YXRlMTAuc2V0dGluZ3MudGlnaHRBdHRyaWJ1dGVzID8gdmFsdWVzW2luZGV4Ml0uY2hhckF0KHZhbHVlc1tpbmRleDJdLmxlbmd0aCAtIDEpIDogdm9pZCAwOwogICAgaWYgKGluZGV4MiAhPT0gdmFsdWVzLmxlbmd0aCAtIDEgJiYgbGFzdDMgIT09ICciJyAmJiBsYXN0MyAhPT0gIiciKSB7CiAgICAgIHZhbHVlc1tpbmRleDJdICs9ICIgIjsKICAgIH0KICB9CiAgcmV0dXJuIHZhbHVlcy5qb2luKCIiKTsKfQpmdW5jdGlvbiBzZXJpYWxpemVBdHRyaWJ1dGUoc3RhdGUxMCwga2V5MiwgdmFsdWUyKSB7CiAgY29uc3QgaW5mbyA9IGZpbmQyKHN0YXRlMTAuc2NoZW1hLCBrZXkyKTsKICBjb25zdCB4NCA9IHN0YXRlMTAuc2V0dGluZ3MuYWxsb3dQYXJzZUVycm9ycyAmJiBzdGF0ZTEwLnNjaGVtYS5zcGFjZSA9PT0gImh0bWwiID8gMCA6IDE7CiAgY29uc3QgeTUgPSBzdGF0ZTEwLnNldHRpbmdzLmFsbG93RGFuZ2Vyb3VzQ2hhcmFjdGVycyA/IDAgOiAxOwogIGxldCBxdW90ZSA9IHN0YXRlMTAucXVvdGU7CiAgbGV0IHJlc3VsdDsKICBpZiAoaW5mby5vdmVybG9hZGVkQm9vbGVhbiAmJiAodmFsdWUyID09PSBpbmZvLmF0dHJpYnV0ZSB8fCB2YWx1ZTIgPT09ICIiKSkgewogICAgdmFsdWUyID0gdHJ1ZTsKICB9IGVsc2UgaWYgKChpbmZvLmJvb2xlYW4gfHwgaW5mby5vdmVybG9hZGVkQm9vbGVhbikgJiYgKHR5cGVvZiB2YWx1ZTIgIT09ICJzdHJpbmciIHx8IHZhbHVlMiA9PT0gaW5mby5hdHRyaWJ1dGUgfHwgdmFsdWUyID09PSAiIikpIHsKICAgIHZhbHVlMiA9IEJvb2xlYW4odmFsdWUyKTsKICB9CiAgaWYgKHZhbHVlMiA9PT0gbnVsbCB8fCB2YWx1ZTIgPT09IHZvaWQgMCB8fCB2YWx1ZTIgPT09IGZhbHNlIHx8IHR5cGVvZiB2YWx1ZTIgPT09ICJudW1iZXIiICYmIE51bWJlci5pc05hTih2YWx1ZTIpKSB7CiAgICByZXR1cm4gIiI7CiAgfQogIGNvbnN0IG5hbWUgPSBzdHJpbmdpZnlFbnRpdGllcygKICAgIGluZm8uYXR0cmlidXRlLAogICAgT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUxMC5zZXR0aW5ncy5jaGFyYWN0ZXJSZWZlcmVuY2VzLCB7CiAgICAgIC8vIEFsd2F5cyBlbmNvZGUgd2l0aG91dCBwYXJzZSBlcnJvcnMgaW4gbm9uLUhUTUwuCiAgICAgIHN1YnNldDogY29uc3RhbnRzLm5hbWVbeDRdW3k1XQogICAgfSkKICApOwogIGlmICh2YWx1ZTIgPT09IHRydWUpIHJldHVybiBuYW1lOwogIHZhbHVlMiA9IEFycmF5LmlzQXJyYXkodmFsdWUyKSA/IChpbmZvLmNvbW1hU2VwYXJhdGVkID8gc3RyaW5naWZ5NSA6IHN0cmluZ2lmeTYpKHZhbHVlMiwgewogICAgcGFkTGVmdDogIXN0YXRlMTAuc2V0dGluZ3MudGlnaHRDb21tYVNlcGFyYXRlZExpc3RzCiAgfSkgOiBTdHJpbmcodmFsdWUyKTsKICBpZiAoc3RhdGUxMC5zZXR0aW5ncy5jb2xsYXBzZUVtcHR5QXR0cmlidXRlcyAmJiAhdmFsdWUyKSByZXR1cm4gbmFtZTsKICBpZiAoc3RhdGUxMC5zZXR0aW5ncy5wcmVmZXJVbnF1b3RlZCkgewogICAgcmVzdWx0ID0gc3RyaW5naWZ5RW50aXRpZXMoCiAgICAgIHZhbHVlMiwKICAgICAgT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUxMC5zZXR0aW5ncy5jaGFyYWN0ZXJSZWZlcmVuY2VzLCB7CiAgICAgICAgYXR0cmlidXRlOiB0cnVlLAogICAgICAgIHN1YnNldDogY29uc3RhbnRzLnVucXVvdGVkW3g0XVt5NV0KICAgICAgfSkKICAgICk7CiAgfQogIGlmIChyZXN1bHQgIT09IHZhbHVlMikgewogICAgaWYgKHN0YXRlMTAuc2V0dGluZ3MucXVvdGVTbWFydCAmJiBjY291bnQodmFsdWUyLCBxdW90ZSkgPiBjY291bnQodmFsdWUyLCBzdGF0ZTEwLmFsdGVybmF0aXZlKSkgewogICAgICBxdW90ZSA9IHN0YXRlMTAuYWx0ZXJuYXRpdmU7CiAgICB9CiAgICByZXN1bHQgPSBxdW90ZSArIHN0cmluZ2lmeUVudGl0aWVzKAogICAgICB2YWx1ZTIsCiAgICAgIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlMTAuc2V0dGluZ3MuY2hhcmFjdGVyUmVmZXJlbmNlcywgewogICAgICAgIC8vIEFsd2F5cyBlbmNvZGUgd2l0aG91dCBwYXJzZSBlcnJvcnMgaW4gbm9uLUhUTUwuCiAgICAgICAgc3Vic2V0OiAocXVvdGUgPT09ICInIiA/IGNvbnN0YW50cy5zaW5nbGUgOiBjb25zdGFudHMuZG91YmxlKVt4NF1beTVdLAogICAgICAgIGF0dHJpYnV0ZTogdHJ1ZQogICAgICB9KQogICAgKSArIHF1b3RlOwogIH0KICByZXR1cm4gbmFtZSArIChyZXN1bHQgPyAiPSIgKyByZXN1bHQgOiByZXN1bHQpOwp9CnZhciBjb25zdGFudHM7CnZhciBpbml0X2VsZW1lbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL2hhbmRsZS9lbGVtZW50LmpzIigpIHsKICAgIGluaXRfY2NvdW50KCk7CiAgICBpbml0X2NvbW1hX3NlcGFyYXRlZF90b2tlbnMoKTsKICAgIGluaXRfcHJvcGVydHlfaW5mb3JtYXRpb24oKTsKICAgIGluaXRfc3BhY2Vfc2VwYXJhdGVkX3Rva2VucygpOwogICAgaW5pdF9zdHJpbmdpZnlfZW50aXRpZXMoKTsKICAgIGluaXRfY2xvc2luZygpOwogICAgaW5pdF9vcGVuaW5nKCk7CiAgICBjb25zdGFudHMgPSB7CiAgICAgIC8vIFNlZTogPGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2F0dHJpYnV0ZS1uYW1lLXN0YXRlPi4KICAgICAgbmFtZTogWwogICAgICAgIFsiCVxuXGZcciAmLz0+Ii5zcGxpdCgiIiksICIJXG5cZlxyIFwiJicvPT5gIi5zcGxpdCgiIildLAogICAgICAgIFtgXDAJClxmXHIgIiYnLzw9PmAuc3BsaXQoIiIpLCAiXDAJXG5cZlxyIFwiJicvPD0+YCIuc3BsaXQoIiIpXQogICAgICBdLAogICAgICAvLyBTZWU6IDxodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNhdHRyaWJ1dGUtdmFsdWUtKHVucXVvdGVkKS1zdGF0ZT4uCiAgICAgIHVucXVvdGVkOiBbCiAgICAgICAgWyIJXG5cZlxyICY+Ii5zcGxpdCgiIiksICJcMAlcblxmXHIgXCImJzw9PmAiLnNwbGl0KCIiKV0sCiAgICAgICAgWyJcMAlcblxmXHIgXCImJzw9PmAiLnNwbGl0KCIiKSwgIlwwCVxuXGZcciBcIiYnPD0+YCIuc3BsaXQoIiIpXQogICAgICBdLAogICAgICAvLyBTZWU6IDxodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNhdHRyaWJ1dGUtdmFsdWUtKHNpbmdsZS1xdW90ZWQpLXN0YXRlPi4KICAgICAgc2luZ2xlOiBbCiAgICAgICAgWyImJyIuc3BsaXQoIiIpLCAiXCImJ2AiLnNwbGl0KCIiKV0sCiAgICAgICAgWyJcMCYnIi5zcGxpdCgiIiksICJcMFwiJidgIi5zcGxpdCgiIildCiAgICAgIF0sCiAgICAgIC8vIFNlZTogPGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2F0dHJpYnV0ZS12YWx1ZS0oZG91YmxlLXF1b3RlZCktc3RhdGU+LgogICAgICBkb3VibGU6IFsKICAgICAgICBbJyImJy5zcGxpdCgiIiksICJcIiYnYCIuc3BsaXQoIiIpXSwKICAgICAgICBbJ1wwIiYnLnNwbGl0KCIiKSwgIlwwXCImJ2AiLnNwbGl0KCIiKV0KICAgICAgXQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvaGFuZGxlL3RleHQuanMKZnVuY3Rpb24gdGV4dDcobm9kZTIsIF81LCBwYXJlbnQsIHN0YXRlMTApIHsKICByZXR1cm4gcGFyZW50ICYmIHBhcmVudC50eXBlID09PSAiZWxlbWVudCIgJiYgKHBhcmVudC50YWdOYW1lID09PSAic2NyaXB0IiB8fCBwYXJlbnQudGFnTmFtZSA9PT0gInN0eWxlIikgPyBub2RlMi52YWx1ZSA6IHN0cmluZ2lmeUVudGl0aWVzKAogICAgbm9kZTIudmFsdWUsCiAgICBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZTEwLnNldHRpbmdzLmNoYXJhY3RlclJlZmVyZW5jZXMsIHsKICAgICAgc3Vic2V0OiB0ZXh0RW50aXR5U3Vic2V0CiAgICB9KQogICk7Cn0KdmFyIHRleHRFbnRpdHlTdWJzZXQ7CnZhciBpbml0X3RleHQ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9oYW5kbGUvdGV4dC5qcyIoKSB7CiAgICBpbml0X3N0cmluZ2lmeV9lbnRpdGllcygpOwogICAgdGV4dEVudGl0eVN1YnNldCA9IFsiPCIsICImIl07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL2hhbmRsZS9yYXcuanMKZnVuY3Rpb24gcmF3KG5vZGUyLCBpbmRleDIsIHBhcmVudCwgc3RhdGUxMCkgewogIHJldHVybiBzdGF0ZTEwLnNldHRpbmdzLmFsbG93RGFuZ2Vyb3VzSHRtbCA/IG5vZGUyLnZhbHVlIDogdGV4dDcobm9kZTIsIGluZGV4MiwgcGFyZW50LCBzdGF0ZTEwKTsKfQp2YXIgaW5pdF9yYXcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL2hhbmRsZS9yYXcuanMiKCkgewogICAgaW5pdF90ZXh0NCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9oYW5kbGUvcm9vdC5qcwpmdW5jdGlvbiByb290NChub2RlMiwgXzEsIF8yMiwgc3RhdGUxMCkgewogIHJldHVybiBzdGF0ZTEwLmFsbChub2RlMik7Cn0KdmFyIGluaXRfcm9vdDMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvbGliL2hhbmRsZS9yb290LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvaGFuZGxlL2luZGV4LmpzCmZ1bmN0aW9uIGludmFsaWQyKG5vZGUyKSB7CiAgdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBub2RlLCBub3QgYCIgKyBub2RlMiArICJgIik7Cn0KZnVuY3Rpb24gdW5rbm93bjIobm9kZV8pIHsKICBjb25zdCBub2RlMiA9ICgKICAgIC8qKiBAdHlwZSB7Tm9kZXN9ICovCiAgICBub2RlXwogICk7CiAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29tcGlsZSB1bmtub3duIG5vZGUgYCIgKyBub2RlMi50eXBlICsgImAiKTsKfQp2YXIgaGFuZGxlMjsKdmFyIGluaXRfaGFuZGxlMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvaGFuZGxlL2luZGV4LmpzIigpIHsKICAgIGluaXRfendpdGNoKCk7CiAgICBpbml0X2NvbW1lbnQoKTsKICAgIGluaXRfZG9jdHlwZSgpOwogICAgaW5pdF9lbGVtZW50KCk7CiAgICBpbml0X3JhdygpOwogICAgaW5pdF9yb290MygpOwogICAgaW5pdF90ZXh0NCgpOwogICAgaGFuZGxlMiA9IHp3aXRjaCgidHlwZSIsIHsKICAgICAgaW52YWxpZDogaW52YWxpZDIsCiAgICAgIHVua25vd246IHVua25vd24yLAogICAgICBoYW5kbGVyczogeyBjb21tZW50OiBjb21tZW50MiwgZG9jdHlwZTogZG9jdHlwZTIsIGVsZW1lbnQ6IGVsZW1lbnQzLCByYXcsIHJvb3Q6IHJvb3Q0LCB0ZXh0OiB0ZXh0NyB9CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2hhc3QtdXRpbC10by1odG1sQDkuMC41L25vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8taHRtbC9saWIvaW5kZXguanMKZnVuY3Rpb24gdG9IdG1sKHRyZWUsIG9wdGlvbnMpIHsKICBjb25zdCBvcHRpb25zXyA9IG9wdGlvbnMgfHwgZW1wdHlPcHRpb25zNjsKICBjb25zdCBxdW90ZSA9IG9wdGlvbnNfLnF1b3RlIHx8ICciJzsKICBjb25zdCBhbHRlcm5hdGl2ZSA9IHF1b3RlID09PSAnIicgPyAiJyIgOiAnIic7CiAgaWYgKHF1b3RlICE9PSAnIicgJiYgcXVvdGUgIT09ICInIikgewogICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHF1b3RlIGAiICsgcXVvdGUgKyAiYCwgZXhwZWN0ZWQgYCdgIG9yIGBcImAiKTsKICB9CiAgY29uc3Qgc3RhdGUxMCA9IHsKICAgIG9uZTogb25lMiwKICAgIGFsbDogYWxsMiwKICAgIHNldHRpbmdzOiB7CiAgICAgIG9taXRPcHRpb25hbFRhZ3M6IG9wdGlvbnNfLm9taXRPcHRpb25hbFRhZ3MgfHwgZmFsc2UsCiAgICAgIGFsbG93UGFyc2VFcnJvcnM6IG9wdGlvbnNfLmFsbG93UGFyc2VFcnJvcnMgfHwgZmFsc2UsCiAgICAgIGFsbG93RGFuZ2Vyb3VzQ2hhcmFjdGVyczogb3B0aW9uc18uYWxsb3dEYW5nZXJvdXNDaGFyYWN0ZXJzIHx8IGZhbHNlLAogICAgICBxdW90ZVNtYXJ0OiBvcHRpb25zXy5xdW90ZVNtYXJ0IHx8IGZhbHNlLAogICAgICBwcmVmZXJVbnF1b3RlZDogb3B0aW9uc18ucHJlZmVyVW5xdW90ZWQgfHwgZmFsc2UsCiAgICAgIHRpZ2h0QXR0cmlidXRlczogb3B0aW9uc18udGlnaHRBdHRyaWJ1dGVzIHx8IGZhbHNlLAogICAgICB1cHBlckRvY3R5cGU6IG9wdGlvbnNfLnVwcGVyRG9jdHlwZSB8fCBmYWxzZSwKICAgICAgdGlnaHREb2N0eXBlOiBvcHRpb25zXy50aWdodERvY3R5cGUgfHwgZmFsc2UsCiAgICAgIGJvZ3VzQ29tbWVudHM6IG9wdGlvbnNfLmJvZ3VzQ29tbWVudHMgfHwgZmFsc2UsCiAgICAgIHRpZ2h0Q29tbWFTZXBhcmF0ZWRMaXN0czogb3B0aW9uc18udGlnaHRDb21tYVNlcGFyYXRlZExpc3RzIHx8IGZhbHNlLAogICAgICB0aWdodFNlbGZDbG9zaW5nOiBvcHRpb25zXy50aWdodFNlbGZDbG9zaW5nIHx8IGZhbHNlLAogICAgICBjb2xsYXBzZUVtcHR5QXR0cmlidXRlczogb3B0aW9uc18uY29sbGFwc2VFbXB0eUF0dHJpYnV0ZXMgfHwgZmFsc2UsCiAgICAgIGFsbG93RGFuZ2Vyb3VzSHRtbDogb3B0aW9uc18uYWxsb3dEYW5nZXJvdXNIdG1sIHx8IGZhbHNlLAogICAgICB2b2lkczogb3B0aW9uc18udm9pZHMgfHwgaHRtbFZvaWRFbGVtZW50cywKICAgICAgY2hhcmFjdGVyUmVmZXJlbmNlczogb3B0aW9uc18uY2hhcmFjdGVyUmVmZXJlbmNlcyB8fCBlbXB0eUNoYXJhY3RlclJlZmVyZW5jZXMsCiAgICAgIGNsb3NlU2VsZkNsb3Npbmc6IG9wdGlvbnNfLmNsb3NlU2VsZkNsb3NpbmcgfHwgZmFsc2UsCiAgICAgIGNsb3NlRW1wdHlFbGVtZW50czogb3B0aW9uc18uY2xvc2VFbXB0eUVsZW1lbnRzIHx8IGZhbHNlCiAgICB9LAogICAgc2NoZW1hOiBvcHRpb25zXy5zcGFjZSA9PT0gInN2ZyIgPyBzdmcyIDogaHRtbDQsCiAgICBxdW90ZSwKICAgIGFsdGVybmF0aXZlCiAgfTsKICByZXR1cm4gc3RhdGUxMC5vbmUoCiAgICBBcnJheS5pc0FycmF5KHRyZWUpID8geyB0eXBlOiAicm9vdCIsIGNoaWxkcmVuOiB0cmVlIH0gOiB0cmVlLAogICAgdm9pZCAwLAogICAgdm9pZCAwCiAgKTsKfQpmdW5jdGlvbiBvbmUyKG5vZGUyLCBpbmRleDIsIHBhcmVudCkgewogIHJldHVybiBoYW5kbGUyKG5vZGUyLCBpbmRleDIsIHBhcmVudCwgdGhpcyk7Cn0KZnVuY3Rpb24gYWxsMihwYXJlbnQpIHsKICBjb25zdCByZXN1bHRzID0gW107CiAgY29uc3QgY2hpbGRyZW4yID0gcGFyZW50ICYmIHBhcmVudC5jaGlsZHJlbiB8fCBlbXB0eUNoaWxkcmVuMjsKICBsZXQgaW5kZXgyID0gLTE7CiAgd2hpbGUgKCsraW5kZXgyIDwgY2hpbGRyZW4yLmxlbmd0aCkgewogICAgcmVzdWx0c1tpbmRleDJdID0gdGhpcy5vbmUoY2hpbGRyZW4yW2luZGV4Ml0sIGluZGV4MiwgcGFyZW50KTsKICB9CiAgcmV0dXJuIHJlc3VsdHMuam9pbigiIik7Cn0KdmFyIGVtcHR5T3B0aW9uczYsIGVtcHR5Q2hhcmFjdGVyUmVmZXJlbmNlcywgZW1wdHlDaGlsZHJlbjI7CnZhciBpbml0X2xpYjMwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vaGFzdC11dGlsLXRvLWh0bWxAOS4wLjUvbm9kZV9tb2R1bGVzL2hhc3QtdXRpbC10by1odG1sL2xpYi9pbmRleC5qcyIoKSB7CiAgICBpbml0X2h0bWxfdm9pZF9lbGVtZW50cygpOwogICAgaW5pdF9wcm9wZXJ0eV9pbmZvcm1hdGlvbigpOwogICAgaW5pdF9oYW5kbGUyKCk7CiAgICBlbXB0eU9wdGlvbnM2ID0ge307CiAgICBlbXB0eUNoYXJhY3RlclJlZmVyZW5jZXMgPSB7fTsKICAgIGVtcHR5Q2hpbGRyZW4yID0gW107CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvaW5kZXguanMKdmFyIGluaXRfaGFzdF91dGlsX3RvX2h0bWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9oYXN0LXV0aWwtdG8taHRtbEA5LjAuNS9ub2RlX21vZHVsZXMvaGFzdC11dGlsLXRvLWh0bWwvaW5kZXguanMiKCkgewogICAgaW5pdF9saWIzMCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vcmVtYXJrLWh0bWxAMTYuMC4xL25vZGVfbW9kdWxlcy9yZW1hcmstaHRtbC9saWIvaW5kZXguanMKZnVuY3Rpb24gcmVtYXJrSHRtbChvcHRpb25zKSB7CiAgY29uc3Qgc2VsZjIgPSB0aGlzOwogIGNvbnN0IHsgaGFuZGxlcnM6IGhhbmRsZXJzMiwgc2FuaXRpemU6IGNsZWFuLCAuLi50b0h0bWxPcHRpb25zIH0gPSBvcHRpb25zIHx8IGVtcHR5T3B0aW9uczc7CiAgbGV0IGFsbG93RGFuZ2Vyb3VzSHRtbCA9IGZhbHNlOwogIGxldCBzY2hlbWE7CiAgaWYgKHR5cGVvZiBjbGVhbiA9PT0gImJvb2xlYW4iKSB7CiAgICBhbGxvd0Rhbmdlcm91c0h0bWwgPSAhY2xlYW47CiAgfSBlbHNlIGlmIChjbGVhbikgewogICAgc2NoZW1hID0gY2xlYW47CiAgfQogIHNlbGYyLmNvbXBpbGVyID0gY29tcGlsZXIyOwogIGZ1bmN0aW9uIGNvbXBpbGVyMih0cmVlLCBmaWxlKSB7CiAgICBjb25zdCBoYXN0ID0gdG9IYXN0KHRyZWUsIHsgaGFuZGxlcnM6IGhhbmRsZXJzMiwgYWxsb3dEYW5nZXJvdXNIdG1sIH0pOwogICAgY29uc3Qgc2FmZUhhc3QgPSBhbGxvd0Rhbmdlcm91c0h0bWwgPyBoYXN0IDogc2FuaXRpemUoaGFzdCwgc2NoZW1hKTsKICAgIGNvbnN0IHJlc3VsdCA9IHRvSHRtbChzYWZlSGFzdCwgeyAuLi50b0h0bWxPcHRpb25zLCBhbGxvd0Rhbmdlcm91c0h0bWwgfSk7CiAgICBpZiAoZmlsZS5leHRuYW1lKSB7CiAgICAgIGZpbGUuZXh0bmFtZSA9ICIuaHRtbCI7CiAgICB9CiAgICByZXR1cm4gdHJlZSAmJiB0cmVlLnR5cGUgPT09ICJyb290IiAmJiByZXN1bHQgJiYgL1teXHJcbl0vLnRlc3QocmVzdWx0LmNoYXJBdChyZXN1bHQubGVuZ3RoIC0gMSkpID8gcmVzdWx0ICsgIlxuIiA6IHJlc3VsdDsKICB9Cn0KdmFyIGVtcHR5T3B0aW9uczc7CnZhciBpbml0X2xpYjMxID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcmVtYXJrLWh0bWxAMTYuMC4xL25vZGVfbW9kdWxlcy9yZW1hcmstaHRtbC9saWIvaW5kZXguanMiKCkgewogICAgaW5pdF9oYXN0X3V0aWxfc2FuaXRpemUoKTsKICAgIGluaXRfbWRhc3RfdXRpbF90b19oYXN0KCk7CiAgICBpbml0X2hhc3RfdXRpbF90b19odG1sKCk7CiAgICBlbXB0eU9wdGlvbnM3ID0ge307CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstaHRtbEAxNi4wLjEvbm9kZV9tb2R1bGVzL3JlbWFyay1odG1sL2luZGV4LmpzCnZhciBpbml0X3JlbWFya19odG1sID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vcmVtYXJrLWh0bWxAMTYuMC4xL25vZGVfbW9kdWxlcy9yZW1hcmstaHRtbC9pbmRleC5qcyIoKSB7CiAgICBpbml0X2xpYjMxKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstc3RyaW5naWZ5QDExLjAuMC9ub2RlX21vZHVsZXMvcmVtYXJrLXN0cmluZ2lmeS9saWIvaW5kZXguanMKZnVuY3Rpb24gcmVtYXJrU3RyaW5naWZ5KG9wdGlvbnMpIHsKICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgc2VsZjIuY29tcGlsZXIgPSBjb21waWxlcjI7CiAgZnVuY3Rpb24gY29tcGlsZXIyKHRyZWUpIHsKICAgIHJldHVybiB0b01hcmtkb3duKHRyZWUsIHsKICAgICAgLi4uc2VsZjIuZGF0YSgic2V0dGluZ3MiKSwKICAgICAgLi4ub3B0aW9ucywKICAgICAgLy8gTm90ZTogdGhpcyBvcHRpb24gaXMgbm90IGluIHRoZSByZWFkbWUuCiAgICAgIC8vIFRoZSBnb2FsIGlzIGZvciBpdCB0byBiZSBzZXQgYnkgcGx1Z2lucyBvbiBgZGF0YWAgaW5zdGVhZCBvZiBiZWluZwogICAgICAvLyBwYXNzZWQgYnkgdXNlcnMuCiAgICAgIGV4dGVuc2lvbnM6IHNlbGYyLmRhdGEoInRvTWFya2Rvd25FeHRlbnNpb25zIikgfHwgW10KICAgIH0pOwogIH0KfQp2YXIgaW5pdF9saWIzMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1zdHJpbmdpZnlAMTEuMC4wL25vZGVfbW9kdWxlcy9yZW1hcmstc3RyaW5naWZ5L2xpYi9pbmRleC5qcyIoKSB7CiAgICBpbml0X21kYXN0X3V0aWxfdG9fbWFya2Rvd24oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3JlbWFyay1zdHJpbmdpZnlAMTEuMC4wL25vZGVfbW9kdWxlcy9yZW1hcmstc3RyaW5naWZ5L2luZGV4LmpzCnZhciBpbml0X3JlbWFya19zdHJpbmdpZnkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9yZW1hcmstc3RyaW5naWZ5QDExLjAuMC9ub2RlX21vZHVsZXMvcmVtYXJrLXN0cmluZ2lmeS9pbmRleC5qcyIoKSB7CiAgICBpbml0X2xpYjMyKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS90dXJuZG93bkA3LjIuMi9ub2RlX21vZHVsZXMvdHVybmRvd24vbGliL3R1cm5kb3duLmJyb3dzZXIuZXMuanMKZnVuY3Rpb24gZXh0ZW5kMihkZXN0aW5hdGlvbikgewogIGZvciAodmFyIGkxMSA9IDE7IGkxMSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2kxMV07CiAgICBmb3IgKHZhciBrZXkyIGluIHNvdXJjZSkgewogICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KGtleTIpKSBkZXN0aW5hdGlvbltrZXkyXSA9IHNvdXJjZVtrZXkyXTsKICAgIH0KICB9CiAgcmV0dXJuIGRlc3RpbmF0aW9uOwp9CmZ1bmN0aW9uIHJlcGVhdDIoY2hhcmFjdGVyLCBjb3VudDIpIHsKICByZXR1cm4gQXJyYXkoY291bnQyICsgMSkuam9pbihjaGFyYWN0ZXIpOwp9CmZ1bmN0aW9uIHRyaW1MZWFkaW5nTmV3bGluZXMoc3RyaW5nMykgewogIHJldHVybiBzdHJpbmczLnJlcGxhY2UoL15cbiovLCAiIik7Cn0KZnVuY3Rpb24gdHJpbVRyYWlsaW5nTmV3bGluZXMoc3RyaW5nMykgewogIHZhciBpbmRleEVuZCA9IHN0cmluZzMubGVuZ3RoOwogIHdoaWxlIChpbmRleEVuZCA+IDAgJiYgc3RyaW5nM1tpbmRleEVuZCAtIDFdID09PSAiXG4iKSBpbmRleEVuZC0tOwogIHJldHVybiBzdHJpbmczLnN1YnN0cmluZygwLCBpbmRleEVuZCk7Cn0KZnVuY3Rpb24gdHJpbU5ld2xpbmVzKHN0cmluZzMpIHsKICByZXR1cm4gdHJpbVRyYWlsaW5nTmV3bGluZXModHJpbUxlYWRpbmdOZXdsaW5lcyhzdHJpbmczKSk7Cn0KZnVuY3Rpb24gaXNCbG9jayhub2RlMikgewogIHJldHVybiBpczIobm9kZTIsIGJsb2NrRWxlbWVudHMpOwp9CmZ1bmN0aW9uIGlzVm9pZChub2RlMikgewogIHJldHVybiBpczIobm9kZTIsIHZvaWRFbGVtZW50cyk7Cn0KZnVuY3Rpb24gaGFzVm9pZChub2RlMikgewogIHJldHVybiBoYXMobm9kZTIsIHZvaWRFbGVtZW50cyk7Cn0KZnVuY3Rpb24gaXNNZWFuaW5nZnVsV2hlbkJsYW5rKG5vZGUyKSB7CiAgcmV0dXJuIGlzMihub2RlMiwgbWVhbmluZ2Z1bFdoZW5CbGFua0VsZW1lbnRzKTsKfQpmdW5jdGlvbiBoYXNNZWFuaW5nZnVsV2hlbkJsYW5rKG5vZGUyKSB7CiAgcmV0dXJuIGhhcyhub2RlMiwgbWVhbmluZ2Z1bFdoZW5CbGFua0VsZW1lbnRzKTsKfQpmdW5jdGlvbiBpczIobm9kZTIsIHRhZ05hbWVzKSB7CiAgcmV0dXJuIHRhZ05hbWVzLmluZGV4T2Yobm9kZTIubm9kZU5hbWUpID49IDA7Cn0KZnVuY3Rpb24gaGFzKG5vZGUyLCB0YWdOYW1lcykgewogIHJldHVybiBub2RlMi5nZXRFbGVtZW50c0J5VGFnTmFtZSAmJiB0YWdOYW1lcy5zb21lKGZ1bmN0aW9uKHRhZ05hbWUpIHsKICAgIHJldHVybiBub2RlMi5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKS5sZW5ndGg7CiAgfSk7Cn0KZnVuY3Rpb24gY2xlYW5BdHRyaWJ1dGUoYXR0cmlidXRlKSB7CiAgcmV0dXJuIGF0dHJpYnV0ZSA/IGF0dHJpYnV0ZS5yZXBsYWNlKC8oXG4rXHMqKSsvZywgIlxuIikgOiAiIjsKfQpmdW5jdGlvbiBSdWxlcyhvcHRpb25zKSB7CiAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICB0aGlzLl9rZWVwID0gW107CiAgdGhpcy5fcmVtb3ZlID0gW107CiAgdGhpcy5ibGFua1J1bGUgPSB7CiAgICByZXBsYWNlbWVudDogb3B0aW9ucy5ibGFua1JlcGxhY2VtZW50CiAgfTsKICB0aGlzLmtlZXBSZXBsYWNlbWVudCA9IG9wdGlvbnMua2VlcFJlcGxhY2VtZW50OwogIHRoaXMuZGVmYXVsdFJ1bGUgPSB7CiAgICByZXBsYWNlbWVudDogb3B0aW9ucy5kZWZhdWx0UmVwbGFjZW1lbnQKICB9OwogIHRoaXMuYXJyYXkgPSBbXTsKICBmb3IgKHZhciBrZXkyIGluIG9wdGlvbnMucnVsZXMpIHRoaXMuYXJyYXkucHVzaChvcHRpb25zLnJ1bGVzW2tleTJdKTsKfQpmdW5jdGlvbiBmaW5kUnVsZShydWxlczMsIG5vZGUyLCBvcHRpb25zKSB7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgcnVsZXMzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhciBydWxlID0gcnVsZXMzW2kxMV07CiAgICBpZiAoZmlsdGVyVmFsdWUocnVsZSwgbm9kZTIsIG9wdGlvbnMpKSByZXR1cm4gcnVsZTsKICB9CiAgcmV0dXJuIHZvaWQgMDsKfQpmdW5jdGlvbiBmaWx0ZXJWYWx1ZShydWxlLCBub2RlMiwgb3B0aW9ucykgewogIHZhciBmaWx0ZXIyID0gcnVsZS5maWx0ZXI7CiAgaWYgKHR5cGVvZiBmaWx0ZXIyID09PSAic3RyaW5nIikgewogICAgaWYgKGZpbHRlcjIgPT09IG5vZGUyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpIHJldHVybiB0cnVlOwogIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXIyKSkgewogICAgaWYgKGZpbHRlcjIuaW5kZXhPZihub2RlMi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSA+IC0xKSByZXR1cm4gdHJ1ZTsKICB9IGVsc2UgaWYgKHR5cGVvZiBmaWx0ZXIyID09PSAiZnVuY3Rpb24iKSB7CiAgICBpZiAoZmlsdGVyMi5jYWxsKHJ1bGUsIG5vZGUyLCBvcHRpb25zKSkgcmV0dXJuIHRydWU7CiAgfSBlbHNlIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoImBmaWx0ZXJgIG5lZWRzIHRvIGJlIGEgc3RyaW5nLCBhcnJheSwgb3IgZnVuY3Rpb24iKTsKICB9Cn0KZnVuY3Rpb24gY29sbGFwc2VXaGl0ZXNwYWNlKG9wdGlvbnMpIHsKICB2YXIgZWxlbWVudDQgPSBvcHRpb25zLmVsZW1lbnQ7CiAgdmFyIGlzQmxvY2syID0gb3B0aW9ucy5pc0Jsb2NrOwogIHZhciBpc1ZvaWQyID0gb3B0aW9ucy5pc1ZvaWQ7CiAgdmFyIGlzUHJlID0gb3B0aW9ucy5pc1ByZSB8fCBmdW5jdGlvbihub2RlMykgewogICAgcmV0dXJuIG5vZGUzLm5vZGVOYW1lID09PSAiUFJFIjsKICB9OwogIGlmICghZWxlbWVudDQuZmlyc3RDaGlsZCB8fCBpc1ByZShlbGVtZW50NCkpIHJldHVybjsKICB2YXIgcHJldlRleHQgPSBudWxsOwogIHZhciBrZWVwTGVhZGluZ1dzID0gZmFsc2U7CiAgdmFyIHByZXYgPSBudWxsOwogIHZhciBub2RlMiA9IG5leHQocHJldiwgZWxlbWVudDQsIGlzUHJlKTsKICB3aGlsZSAobm9kZTIgIT09IGVsZW1lbnQ0KSB7CiAgICBpZiAobm9kZTIubm9kZVR5cGUgPT09IDMgfHwgbm9kZTIubm9kZVR5cGUgPT09IDQpIHsKICAgICAgdmFyIHRleHQ5ID0gbm9kZTIuZGF0YS5yZXBsYWNlKC9bIFxyXG5cdF0rL2csICIgIik7CiAgICAgIGlmICgoIXByZXZUZXh0IHx8IC8gJC8udGVzdChwcmV2VGV4dC5kYXRhKSkgJiYgIWtlZXBMZWFkaW5nV3MgJiYgdGV4dDlbMF0gPT09ICIgIikgewogICAgICAgIHRleHQ5ID0gdGV4dDkuc3Vic3RyKDEpOwogICAgICB9CiAgICAgIGlmICghdGV4dDkpIHsKICAgICAgICBub2RlMiA9IHJlbW92ZShub2RlMik7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgbm9kZTIuZGF0YSA9IHRleHQ5OwogICAgICBwcmV2VGV4dCA9IG5vZGUyOwogICAgfSBlbHNlIGlmIChub2RlMi5ub2RlVHlwZSA9PT0gMSkgewogICAgICBpZiAoaXNCbG9jazIobm9kZTIpIHx8IG5vZGUyLm5vZGVOYW1lID09PSAiQlIiKSB7CiAgICAgICAgaWYgKHByZXZUZXh0KSB7CiAgICAgICAgICBwcmV2VGV4dC5kYXRhID0gcHJldlRleHQuZGF0YS5yZXBsYWNlKC8gJC8sICIiKTsKICAgICAgICB9CiAgICAgICAgcHJldlRleHQgPSBudWxsOwogICAgICAgIGtlZXBMZWFkaW5nV3MgPSBmYWxzZTsKICAgICAgfSBlbHNlIGlmIChpc1ZvaWQyKG5vZGUyKSB8fCBpc1ByZShub2RlMikpIHsKICAgICAgICBwcmV2VGV4dCA9IG51bGw7CiAgICAgICAga2VlcExlYWRpbmdXcyA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAocHJldlRleHQpIHsKICAgICAgICBrZWVwTGVhZGluZ1dzID0gZmFsc2U7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIG5vZGUyID0gcmVtb3ZlKG5vZGUyKTsKICAgICAgY29udGludWU7CiAgICB9CiAgICB2YXIgbmV4dE5vZGUgPSBuZXh0KHByZXYsIG5vZGUyLCBpc1ByZSk7CiAgICBwcmV2ID0gbm9kZTI7CiAgICBub2RlMiA9IG5leHROb2RlOwogIH0KICBpZiAocHJldlRleHQpIHsKICAgIHByZXZUZXh0LmRhdGEgPSBwcmV2VGV4dC5kYXRhLnJlcGxhY2UoLyAkLywgIiIpOwogICAgaWYgKCFwcmV2VGV4dC5kYXRhKSB7CiAgICAgIHJlbW92ZShwcmV2VGV4dCk7CiAgICB9CiAgfQp9CmZ1bmN0aW9uIHJlbW92ZShub2RlMikgewogIHZhciBuZXh0MiA9IG5vZGUyLm5leHRTaWJsaW5nIHx8IG5vZGUyLnBhcmVudE5vZGU7CiAgbm9kZTIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlMik7CiAgcmV0dXJuIG5leHQyOwp9CmZ1bmN0aW9uIG5leHQocHJldiwgY3VycmVudCwgaXNQcmUpIHsKICBpZiAocHJldiAmJiBwcmV2LnBhcmVudE5vZGUgPT09IGN1cnJlbnQgfHwgaXNQcmUoY3VycmVudCkpIHsKICAgIHJldHVybiBjdXJyZW50Lm5leHRTaWJsaW5nIHx8IGN1cnJlbnQucGFyZW50Tm9kZTsKICB9CiAgcmV0dXJuIGN1cnJlbnQuZmlyc3RDaGlsZCB8fCBjdXJyZW50Lm5leHRTaWJsaW5nIHx8IGN1cnJlbnQucGFyZW50Tm9kZTsKfQpmdW5jdGlvbiBjYW5QYXJzZUhUTUxOYXRpdmVseSgpIHsKICB2YXIgUGFyc2VyMiA9IHJvb3Q1LkRPTVBhcnNlcjsKICB2YXIgY2FuUGFyc2UgPSBmYWxzZTsKICB0cnkgewogICAgaWYgKG5ldyBQYXJzZXIyKCkucGFyc2VGcm9tU3RyaW5nKCIiLCAidGV4dC9odG1sIikpIHsKICAgICAgY2FuUGFyc2UgPSB0cnVlOwogICAgfQogIH0gY2F0Y2ggKGUxMSkgewogIH0KICByZXR1cm4gY2FuUGFyc2U7Cn0KZnVuY3Rpb24gY3JlYXRlSFRNTFBhcnNlcigpIHsKICB2YXIgUGFyc2VyMiA9IGZ1bmN0aW9uKCkgewogIH07CiAgewogICAgaWYgKHNob3VsZFVzZUFjdGl2ZVgoKSkgewogICAgICBQYXJzZXIyLnByb3RvdHlwZS5wYXJzZUZyb21TdHJpbmcgPSBmdW5jdGlvbihzdHJpbmczKSB7CiAgICAgICAgdmFyIGRvYyA9IG5ldyB3aW5kb3cuQWN0aXZlWE9iamVjdCgiaHRtbGZpbGUiKTsKICAgICAgICBkb2MuZGVzaWduTW9kZSA9ICJvbiI7CiAgICAgICAgZG9jLm9wZW4oKTsKICAgICAgICBkb2Mud3JpdGUoc3RyaW5nMyk7CiAgICAgICAgZG9jLmNsb3NlKCk7CiAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIFBhcnNlcjIucHJvdG90eXBlLnBhcnNlRnJvbVN0cmluZyA9IGZ1bmN0aW9uKHN0cmluZzMpIHsKICAgICAgICB2YXIgZG9jID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKTsKICAgICAgICBkb2Mub3BlbigpOwogICAgICAgIGRvYy53cml0ZShzdHJpbmczKTsKICAgICAgICBkb2MuY2xvc2UoKTsKICAgICAgICByZXR1cm4gZG9jOwogICAgICB9OwogICAgfQogIH0KICByZXR1cm4gUGFyc2VyMjsKfQpmdW5jdGlvbiBzaG91bGRVc2VBY3RpdmVYKCkgewogIHZhciB1c2VBY3RpdmVYID0gZmFsc2U7CiAgdHJ5IHsKICAgIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikub3BlbigpOwogIH0gY2F0Y2ggKGUxMSkgewogICAgaWYgKHJvb3Q1LkFjdGl2ZVhPYmplY3QpIHVzZUFjdGl2ZVggPSB0cnVlOwogIH0KICByZXR1cm4gdXNlQWN0aXZlWDsKfQpmdW5jdGlvbiBSb290Tm9kZShpbnB1dCwgb3B0aW9ucykgewogIHZhciByb290NjsKICBpZiAodHlwZW9mIGlucHV0ID09PSAic3RyaW5nIikgewogICAgdmFyIGRvYyA9IGh0bWxQYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoCiAgICAgIC8vIERPTSBwYXJzZXJzIGFycmFuZ2UgZWxlbWVudHMgaW4gdGhlIDxoZWFkPiBhbmQgPGJvZHk+LgogICAgICAvLyBXcmFwcGluZyBpbiBhIGN1c3RvbSBlbGVtZW50IGVuc3VyZXMgZWxlbWVudHMgYXJlIHJlbGlhYmx5IGFycmFuZ2VkIGluCiAgICAgIC8vIGEgc2luZ2xlIGVsZW1lbnQuCiAgICAgICc8eC10dXJuZG93biBpZD0idHVybmRvd24tcm9vdCI+JyArIGlucHV0ICsgIjwveC10dXJuZG93bj4iLAogICAgICAidGV4dC9odG1sIgogICAgKTsKICAgIHJvb3Q2ID0gZG9jLmdldEVsZW1lbnRCeUlkKCJ0dXJuZG93bi1yb290Iik7CiAgfSBlbHNlIHsKICAgIHJvb3Q2ID0gaW5wdXQuY2xvbmVOb2RlKHRydWUpOwogIH0KICBjb2xsYXBzZVdoaXRlc3BhY2UoewogICAgZWxlbWVudDogcm9vdDYsCiAgICBpc0Jsb2NrLAogICAgaXNWb2lkLAogICAgaXNQcmU6IG9wdGlvbnMucHJlZm9ybWF0dGVkQ29kZSA/IGlzUHJlT3JDb2RlIDogbnVsbAogIH0pOwogIHJldHVybiByb290NjsKfQpmdW5jdGlvbiBodG1sUGFyc2VyKCkgewogIF9odG1sUGFyc2VyID0gX2h0bWxQYXJzZXIgfHwgbmV3IEhUTUxQYXJzZXIoKTsKICByZXR1cm4gX2h0bWxQYXJzZXI7Cn0KZnVuY3Rpb24gaXNQcmVPckNvZGUobm9kZTIpIHsKICByZXR1cm4gbm9kZTIubm9kZU5hbWUgPT09ICJQUkUiIHx8IG5vZGUyLm5vZGVOYW1lID09PSAiQ09ERSI7Cn0KZnVuY3Rpb24gTm9kZTIobm9kZTIsIG9wdGlvbnMpIHsKICBub2RlMi5pc0Jsb2NrID0gaXNCbG9jayhub2RlMik7CiAgbm9kZTIuaXNDb2RlID0gbm9kZTIubm9kZU5hbWUgPT09ICJDT0RFIiB8fCBub2RlMi5wYXJlbnROb2RlLmlzQ29kZTsKICBub2RlMi5pc0JsYW5rID0gaXNCbGFuayhub2RlMik7CiAgbm9kZTIuZmxhbmtpbmdXaGl0ZXNwYWNlID0gZmxhbmtpbmdXaGl0ZXNwYWNlKG5vZGUyLCBvcHRpb25zKTsKICByZXR1cm4gbm9kZTI7Cn0KZnVuY3Rpb24gaXNCbGFuayhub2RlMikgewogIHJldHVybiAhaXNWb2lkKG5vZGUyKSAmJiAhaXNNZWFuaW5nZnVsV2hlbkJsYW5rKG5vZGUyKSAmJiAvXlxzKiQvaS50ZXN0KG5vZGUyLnRleHRDb250ZW50KSAmJiAhaGFzVm9pZChub2RlMikgJiYgIWhhc01lYW5pbmdmdWxXaGVuQmxhbmsobm9kZTIpOwp9CmZ1bmN0aW9uIGZsYW5raW5nV2hpdGVzcGFjZShub2RlMiwgb3B0aW9ucykgewogIGlmIChub2RlMi5pc0Jsb2NrIHx8IG9wdGlvbnMucHJlZm9ybWF0dGVkQ29kZSAmJiBub2RlMi5pc0NvZGUpIHsKICAgIHJldHVybiB7IGxlYWRpbmc6ICIiLCB0cmFpbGluZzogIiIgfTsKICB9CiAgdmFyIGVkZ2VzID0gZWRnZVdoaXRlc3BhY2Uobm9kZTIudGV4dENvbnRlbnQpOwogIGlmIChlZGdlcy5sZWFkaW5nQXNjaWkgJiYgaXNGbGFua2VkQnlXaGl0ZXNwYWNlKCJsZWZ0Iiwgbm9kZTIsIG9wdGlvbnMpKSB7CiAgICBlZGdlcy5sZWFkaW5nID0gZWRnZXMubGVhZGluZ05vbkFzY2lpOwogIH0KICBpZiAoZWRnZXMudHJhaWxpbmdBc2NpaSAmJiBpc0ZsYW5rZWRCeVdoaXRlc3BhY2UoInJpZ2h0Iiwgbm9kZTIsIG9wdGlvbnMpKSB7CiAgICBlZGdlcy50cmFpbGluZyA9IGVkZ2VzLnRyYWlsaW5nTm9uQXNjaWk7CiAgfQogIHJldHVybiB7IGxlYWRpbmc6IGVkZ2VzLmxlYWRpbmcsIHRyYWlsaW5nOiBlZGdlcy50cmFpbGluZyB9Owp9CmZ1bmN0aW9uIGVkZ2VXaGl0ZXNwYWNlKHN0cmluZzMpIHsKICB2YXIgbTcgPSBzdHJpbmczLm1hdGNoKC9eKChbIFx0XHJcbl0qKShccyopKSg/Oig/PVxTKVtcc1xTXSpcUyk/KChccyo/KShbIFx0XHJcbl0qKSkkLyk7CiAgcmV0dXJuIHsKICAgIGxlYWRpbmc6IG03WzFdLAogICAgLy8gd2hvbGUgc3RyaW5nIGZvciB3aGl0ZXNwYWNlLW9ubHkgc3RyaW5ncwogICAgbGVhZGluZ0FzY2lpOiBtN1syXSwKICAgIGxlYWRpbmdOb25Bc2NpaTogbTdbM10sCiAgICB0cmFpbGluZzogbTdbNF0sCiAgICAvLyBlbXB0eSBmb3Igd2hpdGVzcGFjZS1vbmx5IHN0cmluZ3MKICAgIHRyYWlsaW5nTm9uQXNjaWk6IG03WzVdLAogICAgdHJhaWxpbmdBc2NpaTogbTdbNl0KICB9Owp9CmZ1bmN0aW9uIGlzRmxhbmtlZEJ5V2hpdGVzcGFjZShzaWRlLCBub2RlMiwgb3B0aW9ucykgewogIHZhciBzaWJsaW5nOwogIHZhciByZWdFeHA7CiAgdmFyIGlzRmxhbmtlZDsKICBpZiAoc2lkZSA9PT0gImxlZnQiKSB7CiAgICBzaWJsaW5nID0gbm9kZTIucHJldmlvdXNTaWJsaW5nOwogICAgcmVnRXhwID0gLyAkLzsKICB9IGVsc2UgewogICAgc2libGluZyA9IG5vZGUyLm5leHRTaWJsaW5nOwogICAgcmVnRXhwID0gL14gLzsKICB9CiAgaWYgKHNpYmxpbmcpIHsKICAgIGlmIChzaWJsaW5nLm5vZGVUeXBlID09PSAzKSB7CiAgICAgIGlzRmxhbmtlZCA9IHJlZ0V4cC50ZXN0KHNpYmxpbmcubm9kZVZhbHVlKTsKICAgIH0gZWxzZSBpZiAob3B0aW9ucy5wcmVmb3JtYXR0ZWRDb2RlICYmIHNpYmxpbmcubm9kZU5hbWUgPT09ICJDT0RFIikgewogICAgICBpc0ZsYW5rZWQgPSBmYWxzZTsKICAgIH0gZWxzZSBpZiAoc2libGluZy5ub2RlVHlwZSA9PT0gMSAmJiAhaXNCbG9jayhzaWJsaW5nKSkgewogICAgICBpc0ZsYW5rZWQgPSByZWdFeHAudGVzdChzaWJsaW5nLnRleHRDb250ZW50KTsKICAgIH0KICB9CiAgcmV0dXJuIGlzRmxhbmtlZDsKfQpmdW5jdGlvbiBUdXJuZG93blNlcnZpY2Uob3B0aW9ucykgewogIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUdXJuZG93blNlcnZpY2UpKSByZXR1cm4gbmV3IFR1cm5kb3duU2VydmljZShvcHRpb25zKTsKICB2YXIgZGVmYXVsdHMgPSB7CiAgICBydWxlcywKICAgIGhlYWRpbmdTdHlsZTogInNldGV4dCIsCiAgICBocjogIiogKiAqIiwKICAgIGJ1bGxldExpc3RNYXJrZXI6ICIqIiwKICAgIGNvZGVCbG9ja1N0eWxlOiAiaW5kZW50ZWQiLAogICAgZmVuY2U6ICJgYGAiLAogICAgZW1EZWxpbWl0ZXI6ICJfIiwKICAgIHN0cm9uZ0RlbGltaXRlcjogIioqIiwKICAgIGxpbmtTdHlsZTogImlubGluZWQiLAogICAgbGlua1JlZmVyZW5jZVN0eWxlOiAiZnVsbCIsCiAgICBicjogIiAgIiwKICAgIHByZWZvcm1hdHRlZENvZGU6IGZhbHNlLAogICAgYmxhbmtSZXBsYWNlbWVudDogZnVuY3Rpb24oY29udGVudDMsIG5vZGUyKSB7CiAgICAgIHJldHVybiBub2RlMi5pc0Jsb2NrID8gIlxuXG4iIDogIiI7CiAgICB9LAogICAga2VlcFJlcGxhY2VtZW50OiBmdW5jdGlvbihjb250ZW50Mywgbm9kZTIpIHsKICAgICAgcmV0dXJuIG5vZGUyLmlzQmxvY2sgPyAiXG5cbiIgKyBub2RlMi5vdXRlckhUTUwgKyAiXG5cbiIgOiBub2RlMi5vdXRlckhUTUw7CiAgICB9LAogICAgZGVmYXVsdFJlcGxhY2VtZW50OiBmdW5jdGlvbihjb250ZW50Mywgbm9kZTIpIHsKICAgICAgcmV0dXJuIG5vZGUyLmlzQmxvY2sgPyAiXG5cbiIgKyBjb250ZW50MyArICJcblxuIiA6IGNvbnRlbnQzOwogICAgfQogIH07CiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kMih7fSwgZGVmYXVsdHMsIG9wdGlvbnMpOwogIHRoaXMucnVsZXMgPSBuZXcgUnVsZXModGhpcy5vcHRpb25zKTsKfQpmdW5jdGlvbiBwcm9jZXNzMyhwYXJlbnROb2RlKSB7CiAgdmFyIHNlbGYyID0gdGhpczsKICByZXR1cm4gcmVkdWNlMi5jYWxsKHBhcmVudE5vZGUuY2hpbGROb2RlcywgZnVuY3Rpb24ob3V0cHV0LCBub2RlMikgewogICAgbm9kZTIgPSBuZXcgTm9kZTIobm9kZTIsIHNlbGYyLm9wdGlvbnMpOwogICAgdmFyIHJlcGxhY2VtZW50ID0gIiI7CiAgICBpZiAobm9kZTIubm9kZVR5cGUgPT09IDMpIHsKICAgICAgcmVwbGFjZW1lbnQgPSBub2RlMi5pc0NvZGUgPyBub2RlMi5ub2RlVmFsdWUgOiBzZWxmMi5lc2NhcGUobm9kZTIubm9kZVZhbHVlKTsKICAgIH0gZWxzZSBpZiAobm9kZTIubm9kZVR5cGUgPT09IDEpIHsKICAgICAgcmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudEZvck5vZGUuY2FsbChzZWxmMiwgbm9kZTIpOwogICAgfQogICAgcmV0dXJuIGpvaW4zKG91dHB1dCwgcmVwbGFjZW1lbnQpOwogIH0sICIiKTsKfQpmdW5jdGlvbiBwb3N0UHJvY2VzcyhvdXRwdXQpIHsKICB2YXIgc2VsZjIgPSB0aGlzOwogIHRoaXMucnVsZXMuZm9yRWFjaChmdW5jdGlvbihydWxlKSB7CiAgICBpZiAodHlwZW9mIHJ1bGUuYXBwZW5kID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIG91dHB1dCA9IGpvaW4zKG91dHB1dCwgcnVsZS5hcHBlbmQoc2VsZjIub3B0aW9ucykpOwogICAgfQogIH0pOwogIHJldHVybiBvdXRwdXQucmVwbGFjZSgvXltcdFxyXG5dKy8sICIiKS5yZXBsYWNlKC9bXHRcclxuXHNdKyQvLCAiIik7Cn0KZnVuY3Rpb24gcmVwbGFjZW1lbnRGb3JOb2RlKG5vZGUyKSB7CiAgdmFyIHJ1bGUgPSB0aGlzLnJ1bGVzLmZvck5vZGUobm9kZTIpOwogIHZhciBjb250ZW50MyA9IHByb2Nlc3MzLmNhbGwodGhpcywgbm9kZTIpOwogIHZhciB3aGl0ZXNwYWNlMiA9IG5vZGUyLmZsYW5raW5nV2hpdGVzcGFjZTsKICBpZiAod2hpdGVzcGFjZTIubGVhZGluZyB8fCB3aGl0ZXNwYWNlMi50cmFpbGluZykgY29udGVudDMgPSBjb250ZW50My50cmltKCk7CiAgcmV0dXJuIHdoaXRlc3BhY2UyLmxlYWRpbmcgKyBydWxlLnJlcGxhY2VtZW50KGNvbnRlbnQzLCBub2RlMiwgdGhpcy5vcHRpb25zKSArIHdoaXRlc3BhY2UyLnRyYWlsaW5nOwp9CmZ1bmN0aW9uIGpvaW4zKG91dHB1dCwgcmVwbGFjZW1lbnQpIHsKICB2YXIgczEgPSB0cmltVHJhaWxpbmdOZXdsaW5lcyhvdXRwdXQpOwogIHZhciBzMjIgPSB0cmltTGVhZGluZ05ld2xpbmVzKHJlcGxhY2VtZW50KTsKICB2YXIgbmxzID0gTWF0aC5tYXgob3V0cHV0Lmxlbmd0aCAtIHMxLmxlbmd0aCwgcmVwbGFjZW1lbnQubGVuZ3RoIC0gczIyLmxlbmd0aCk7CiAgdmFyIHNlcGFyYXRvciA9ICJcblxuIi5zdWJzdHJpbmcoMCwgbmxzKTsKICByZXR1cm4gczEgKyBzZXBhcmF0b3IgKyBzMjI7Cn0KZnVuY3Rpb24gY2FuQ29udmVydChpbnB1dCkgewogIHJldHVybiBpbnB1dCAhPSBudWxsICYmICh0eXBlb2YgaW5wdXQgPT09ICJzdHJpbmciIHx8IGlucHV0Lm5vZGVUeXBlICYmIChpbnB1dC5ub2RlVHlwZSA9PT0gMSB8fCBpbnB1dC5ub2RlVHlwZSA9PT0gOSB8fCBpbnB1dC5ub2RlVHlwZSA9PT0gMTEpKTsKfQp2YXIgYmxvY2tFbGVtZW50cywgdm9pZEVsZW1lbnRzLCBtZWFuaW5nZnVsV2hlbkJsYW5rRWxlbWVudHMsIHJ1bGVzLCByb290NSwgSFRNTFBhcnNlciwgX2h0bWxQYXJzZXIsIHJlZHVjZTIsIGVzY2FwZXMsIHR1cm5kb3duX2Jyb3dzZXJfZXNfZGVmYXVsdDsKdmFyIGluaXRfdHVybmRvd25fYnJvd3Nlcl9lcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3R1cm5kb3duQDcuMi4yL25vZGVfbW9kdWxlcy90dXJuZG93bi9saWIvdHVybmRvd24uYnJvd3Nlci5lcy5qcyIoKSB7CiAgICBibG9ja0VsZW1lbnRzID0gWwogICAgICAiQUREUkVTUyIsCiAgICAgICJBUlRJQ0xFIiwKICAgICAgIkFTSURFIiwKICAgICAgIkFVRElPIiwKICAgICAgIkJMT0NLUVVPVEUiLAogICAgICAiQk9EWSIsCiAgICAgICJDQU5WQVMiLAogICAgICAiQ0VOVEVSIiwKICAgICAgIkREIiwKICAgICAgIkRJUiIsCiAgICAgICJESVYiLAogICAgICAiREwiLAogICAgICAiRFQiLAogICAgICAiRklFTERTRVQiLAogICAgICAiRklHQ0FQVElPTiIsCiAgICAgICJGSUdVUkUiLAogICAgICAiRk9PVEVSIiwKICAgICAgIkZPUk0iLAogICAgICAiRlJBTUVTRVQiLAogICAgICAiSDEiLAogICAgICAiSDIiLAogICAgICAiSDMiLAogICAgICAiSDQiLAogICAgICAiSDUiLAogICAgICAiSDYiLAogICAgICAiSEVBREVSIiwKICAgICAgIkhHUk9VUCIsCiAgICAgICJIUiIsCiAgICAgICJIVE1MIiwKICAgICAgIklTSU5ERVgiLAogICAgICAiTEkiLAogICAgICAiTUFJTiIsCiAgICAgICJNRU5VIiwKICAgICAgIk5BViIsCiAgICAgICJOT0ZSQU1FUyIsCiAgICAgICJOT1NDUklQVCIsCiAgICAgICJPTCIsCiAgICAgICJPVVRQVVQiLAogICAgICAiUCIsCiAgICAgICJQUkUiLAogICAgICAiU0VDVElPTiIsCiAgICAgICJUQUJMRSIsCiAgICAgICJUQk9EWSIsCiAgICAgICJURCIsCiAgICAgICJURk9PVCIsCiAgICAgICJUSCIsCiAgICAgICJUSEVBRCIsCiAgICAgICJUUiIsCiAgICAgICJVTCIKICAgIF07CiAgICB2b2lkRWxlbWVudHMgPSBbCiAgICAgICJBUkVBIiwKICAgICAgIkJBU0UiLAogICAgICAiQlIiLAogICAgICAiQ09MIiwKICAgICAgIkNPTU1BTkQiLAogICAgICAiRU1CRUQiLAogICAgICAiSFIiLAogICAgICAiSU1HIiwKICAgICAgIklOUFVUIiwKICAgICAgIktFWUdFTiIsCiAgICAgICJMSU5LIiwKICAgICAgIk1FVEEiLAogICAgICAiUEFSQU0iLAogICAgICAiU09VUkNFIiwKICAgICAgIlRSQUNLIiwKICAgICAgIldCUiIKICAgIF07CiAgICBtZWFuaW5nZnVsV2hlbkJsYW5rRWxlbWVudHMgPSBbCiAgICAgICJBIiwKICAgICAgIlRBQkxFIiwKICAgICAgIlRIRUFEIiwKICAgICAgIlRCT0RZIiwKICAgICAgIlRGT09UIiwKICAgICAgIlRIIiwKICAgICAgIlREIiwKICAgICAgIklGUkFNRSIsCiAgICAgICJTQ1JJUFQiLAogICAgICAiQVVESU8iLAogICAgICAiVklERU8iCiAgICBdOwogICAgcnVsZXMgPSB7fTsKICAgIHJ1bGVzLnBhcmFncmFwaCA9IHsKICAgICAgZmlsdGVyOiAicCIsCiAgICAgIHJlcGxhY2VtZW50OiBmdW5jdGlvbihjb250ZW50MykgewogICAgICAgIHJldHVybiAiXG5cbiIgKyBjb250ZW50MyArICJcblxuIjsKICAgICAgfQogICAgfTsKICAgIHJ1bGVzLmxpbmVCcmVhayA9IHsKICAgICAgZmlsdGVyOiAiYnIiLAogICAgICByZXBsYWNlbWVudDogZnVuY3Rpb24oY29udGVudDMsIG5vZGUyLCBvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbnMuYnIgKyAiXG4iOwogICAgICB9CiAgICB9OwogICAgcnVsZXMuaGVhZGluZyA9IHsKICAgICAgZmlsdGVyOiBbImgxIiwgImgyIiwgImgzIiwgImg0IiwgImg1IiwgImg2Il0sCiAgICAgIHJlcGxhY2VtZW50OiBmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgICAgICB2YXIgaExldmVsID0gTnVtYmVyKG5vZGUyLm5vZGVOYW1lLmNoYXJBdCgxKSk7CiAgICAgICAgaWYgKG9wdGlvbnMuaGVhZGluZ1N0eWxlID09PSAic2V0ZXh0IiAmJiBoTGV2ZWwgPCAzKSB7CiAgICAgICAgICB2YXIgdW5kZXJsaW5lID0gcmVwZWF0MihoTGV2ZWwgPT09IDEgPyAiPSIgOiAiLSIsIGNvbnRlbnQzLmxlbmd0aCk7CiAgICAgICAgICByZXR1cm4gIlxuXG4iICsgY29udGVudDMgKyAiXG4iICsgdW5kZXJsaW5lICsgIlxuXG4iOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gIlxuXG4iICsgcmVwZWF0MigiIyIsIGhMZXZlbCkgKyAiICIgKyBjb250ZW50MyArICJcblxuIjsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBydWxlcy5ibG9ja3F1b3RlID0gewogICAgICBmaWx0ZXI6ICJibG9ja3F1b3RlIiwKICAgICAgcmVwbGFjZW1lbnQ6IGZ1bmN0aW9uKGNvbnRlbnQzKSB7CiAgICAgICAgY29udGVudDMgPSB0cmltTmV3bGluZXMoY29udGVudDMpLnJlcGxhY2UoL14vZ20sICI+ICIpOwogICAgICAgIHJldHVybiAiXG5cbiIgKyBjb250ZW50MyArICJcblxuIjsKICAgICAgfQogICAgfTsKICAgIHJ1bGVzLmxpc3QgPSB7CiAgICAgIGZpbHRlcjogWyJ1bCIsICJvbCJdLAogICAgICByZXBsYWNlbWVudDogZnVuY3Rpb24oY29udGVudDMsIG5vZGUyKSB7CiAgICAgICAgdmFyIHBhcmVudCA9IG5vZGUyLnBhcmVudE5vZGU7CiAgICAgICAgaWYgKHBhcmVudC5ub2RlTmFtZSA9PT0gIkxJIiAmJiBwYXJlbnQubGFzdEVsZW1lbnRDaGlsZCA9PT0gbm9kZTIpIHsKICAgICAgICAgIHJldHVybiAiXG4iICsgY29udGVudDM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAiXG5cbiIgKyBjb250ZW50MyArICJcblxuIjsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBydWxlcy5saXN0SXRlbSA9IHsKICAgICAgZmlsdGVyOiAibGkiLAogICAgICByZXBsYWNlbWVudDogZnVuY3Rpb24oY29udGVudDMsIG5vZGUyLCBvcHRpb25zKSB7CiAgICAgICAgdmFyIHByZWZpeDQgPSBvcHRpb25zLmJ1bGxldExpc3RNYXJrZXIgKyAiICAgIjsKICAgICAgICB2YXIgcGFyZW50ID0gbm9kZTIucGFyZW50Tm9kZTsKICAgICAgICBpZiAocGFyZW50Lm5vZGVOYW1lID09PSAiT0wiKSB7CiAgICAgICAgICB2YXIgc3RhcnQgPSBwYXJlbnQuZ2V0QXR0cmlidXRlKCJzdGFydCIpOwogICAgICAgICAgdmFyIGluZGV4MiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwocGFyZW50LmNoaWxkcmVuLCBub2RlMik7CiAgICAgICAgICBwcmVmaXg0ID0gKHN0YXJ0ID8gTnVtYmVyKHN0YXJ0KSArIGluZGV4MiA6IGluZGV4MiArIDEpICsgIi4gICI7CiAgICAgICAgfQogICAgICAgIHZhciBpc1BhcmFncmFwaCA9IC9cbiQvLnRlc3QoY29udGVudDMpOwogICAgICAgIGNvbnRlbnQzID0gdHJpbU5ld2xpbmVzKGNvbnRlbnQzKSArIChpc1BhcmFncmFwaCA/ICJcbiIgOiAiIik7CiAgICAgICAgY29udGVudDMgPSBjb250ZW50My5yZXBsYWNlKC9cbi9nbSwgIlxuIiArICIgIi5yZXBlYXQocHJlZml4NC5sZW5ndGgpKTsKICAgICAgICByZXR1cm4gcHJlZml4NCArIGNvbnRlbnQzICsgKG5vZGUyLm5leHRTaWJsaW5nID8gIlxuIiA6ICIiKTsKICAgICAgfQogICAgfTsKICAgIHJ1bGVzLmluZGVudGVkQ29kZUJsb2NrID0gewogICAgICBmaWx0ZXI6IGZ1bmN0aW9uKG5vZGUyLCBvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29kZUJsb2NrU3R5bGUgPT09ICJpbmRlbnRlZCIgJiYgbm9kZTIubm9kZU5hbWUgPT09ICJQUkUiICYmIG5vZGUyLmZpcnN0Q2hpbGQgJiYgbm9kZTIuZmlyc3RDaGlsZC5ub2RlTmFtZSA9PT0gIkNPREUiOwogICAgICB9LAogICAgICByZXBsYWNlbWVudDogZnVuY3Rpb24oY29udGVudDMsIG5vZGUyLCBvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuICJcblxuICAgICIgKyBub2RlMi5maXJzdENoaWxkLnRleHRDb250ZW50LnJlcGxhY2UoL1xuL2csICJcbiAgICAiKSArICJcblxuIjsKICAgICAgfQogICAgfTsKICAgIHJ1bGVzLmZlbmNlZENvZGVCbG9jayA9IHsKICAgICAgZmlsdGVyOiBmdW5jdGlvbihub2RlMiwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBvcHRpb25zLmNvZGVCbG9ja1N0eWxlID09PSAiZmVuY2VkIiAmJiBub2RlMi5ub2RlTmFtZSA9PT0gIlBSRSIgJiYgbm9kZTIuZmlyc3RDaGlsZCAmJiBub2RlMi5maXJzdENoaWxkLm5vZGVOYW1lID09PSAiQ09ERSI7CiAgICAgIH0sCiAgICAgIHJlcGxhY2VtZW50OiBmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgICAgICB2YXIgY2xhc3NOYW1lID0gbm9kZTIuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiI7CiAgICAgICAgdmFyIGxhbmd1YWdlID0gKGNsYXNzTmFtZS5tYXRjaCgvbGFuZ3VhZ2UtKFxTKykvKSB8fCBbbnVsbCwgIiJdKVsxXTsKICAgICAgICB2YXIgY29kZTQgPSBub2RlMi5maXJzdENoaWxkLnRleHRDb250ZW50OwogICAgICAgIHZhciBmZW5jZUNoYXIgPSBvcHRpb25zLmZlbmNlLmNoYXJBdCgwKTsKICAgICAgICB2YXIgZmVuY2VTaXplID0gMzsKICAgICAgICB2YXIgZmVuY2VJbkNvZGVSZWdleCA9IG5ldyBSZWdFeHAoIl4iICsgZmVuY2VDaGFyICsgInszLH0iLCAiZ20iKTsKICAgICAgICB2YXIgbWF0Y2gyOwogICAgICAgIHdoaWxlIChtYXRjaDIgPSBmZW5jZUluQ29kZVJlZ2V4LmV4ZWMoY29kZTQpKSB7CiAgICAgICAgICBpZiAobWF0Y2gyWzBdLmxlbmd0aCA+PSBmZW5jZVNpemUpIHsKICAgICAgICAgICAgZmVuY2VTaXplID0gbWF0Y2gyWzBdLmxlbmd0aCArIDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBmZW5jZTMgPSByZXBlYXQyKGZlbmNlQ2hhciwgZmVuY2VTaXplKTsKICAgICAgICByZXR1cm4gIlxuXG4iICsgZmVuY2UzICsgbGFuZ3VhZ2UgKyAiXG4iICsgY29kZTQucmVwbGFjZSgvXG4kLywgIiIpICsgIlxuIiArIGZlbmNlMyArICJcblxuIjsKICAgICAgfQogICAgfTsKICAgIHJ1bGVzLmhvcml6b250YWxSdWxlID0gewogICAgICBmaWx0ZXI6ICJociIsCiAgICAgIHJlcGxhY2VtZW50OiBmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgICAgICByZXR1cm4gIlxuXG4iICsgb3B0aW9ucy5ociArICJcblxuIjsKICAgICAgfQogICAgfTsKICAgIHJ1bGVzLmlubGluZUxpbmsgPSB7CiAgICAgIGZpbHRlcjogZnVuY3Rpb24obm9kZTIsIG9wdGlvbnMpIHsKICAgICAgICByZXR1cm4gb3B0aW9ucy5saW5rU3R5bGUgPT09ICJpbmxpbmVkIiAmJiBub2RlMi5ub2RlTmFtZSA9PT0gIkEiICYmIG5vZGUyLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwogICAgICB9LAogICAgICByZXBsYWNlbWVudDogZnVuY3Rpb24oY29udGVudDMsIG5vZGUyKSB7CiAgICAgICAgdmFyIGhyZWYgPSBub2RlMi5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICAgICAgICBpZiAoaHJlZikgaHJlZiA9IGhyZWYucmVwbGFjZSgvKFsoKV0pL2csICJcXCQxIik7CiAgICAgICAgdmFyIHRpdGxlID0gY2xlYW5BdHRyaWJ1dGUobm9kZTIuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKTsKICAgICAgICBpZiAodGl0bGUpIHRpdGxlID0gJyAiJyArIHRpdGxlLnJlcGxhY2UoLyIvZywgJ1xcIicpICsgJyInOwogICAgICAgIHJldHVybiAiWyIgKyBjb250ZW50MyArICJdKCIgKyBocmVmICsgdGl0bGUgKyAiKSI7CiAgICAgIH0KICAgIH07CiAgICBydWxlcy5yZWZlcmVuY2VMaW5rID0gewogICAgICBmaWx0ZXI6IGZ1bmN0aW9uKG5vZGUyLCBvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbnMubGlua1N0eWxlID09PSAicmVmZXJlbmNlZCIgJiYgbm9kZTIubm9kZU5hbWUgPT09ICJBIiAmJiBub2RlMi5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICAgICAgfSwKICAgICAgcmVwbGFjZW1lbnQ6IGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMiwgb3B0aW9ucykgewogICAgICAgIHZhciBocmVmID0gbm9kZTIuZ2V0QXR0cmlidXRlKCJocmVmIik7CiAgICAgICAgdmFyIHRpdGxlID0gY2xlYW5BdHRyaWJ1dGUobm9kZTIuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKTsKICAgICAgICBpZiAodGl0bGUpIHRpdGxlID0gJyAiJyArIHRpdGxlICsgJyInOwogICAgICAgIHZhciByZXBsYWNlbWVudDsKICAgICAgICB2YXIgcmVmZXJlbmNlOwogICAgICAgIHN3aXRjaCAob3B0aW9ucy5saW5rUmVmZXJlbmNlU3R5bGUpIHsKICAgICAgICAgIGNhc2UgImNvbGxhcHNlZCI6CiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gIlsiICsgY29udGVudDMgKyAiXVtdIjsKICAgICAgICAgICAgcmVmZXJlbmNlID0gIlsiICsgY29udGVudDMgKyAiXTogIiArIGhyZWYgKyB0aXRsZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJzaG9ydGN1dCI6CiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gIlsiICsgY29udGVudDMgKyAiXSI7CiAgICAgICAgICAgIHJlZmVyZW5jZSA9ICJbIiArIGNvbnRlbnQzICsgIl06ICIgKyBocmVmICsgdGl0bGU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5yZWZlcmVuY2VzLmxlbmd0aCArIDE7CiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gIlsiICsgY29udGVudDMgKyAiXVsiICsgaWQgKyAiXSI7CiAgICAgICAgICAgIHJlZmVyZW5jZSA9ICJbIiArIGlkICsgIl06ICIgKyBocmVmICsgdGl0bGU7CiAgICAgICAgfQogICAgICAgIHRoaXMucmVmZXJlbmNlcy5wdXNoKHJlZmVyZW5jZSk7CiAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OwogICAgICB9LAogICAgICByZWZlcmVuY2VzOiBbXSwKICAgICAgYXBwZW5kOiBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgdmFyIHJlZmVyZW5jZXMgPSAiIjsKICAgICAgICBpZiAodGhpcy5yZWZlcmVuY2VzLmxlbmd0aCkgewogICAgICAgICAgcmVmZXJlbmNlcyA9ICJcblxuIiArIHRoaXMucmVmZXJlbmNlcy5qb2luKCJcbiIpICsgIlxuXG4iOwogICAgICAgICAgdGhpcy5yZWZlcmVuY2VzID0gW107CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWZlcmVuY2VzOwogICAgICB9CiAgICB9OwogICAgcnVsZXMuZW1waGFzaXMgPSB7CiAgICAgIGZpbHRlcjogWyJlbSIsICJpIl0sCiAgICAgIHJlcGxhY2VtZW50OiBmdW5jdGlvbihjb250ZW50Mywgbm9kZTIsIG9wdGlvbnMpIHsKICAgICAgICBpZiAoIWNvbnRlbnQzLnRyaW0oKSkgcmV0dXJuICIiOwogICAgICAgIHJldHVybiBvcHRpb25zLmVtRGVsaW1pdGVyICsgY29udGVudDMgKyBvcHRpb25zLmVtRGVsaW1pdGVyOwogICAgICB9CiAgICB9OwogICAgcnVsZXMuc3Ryb25nID0gewogICAgICBmaWx0ZXI6IFsic3Ryb25nIiwgImIiXSwKICAgICAgcmVwbGFjZW1lbnQ6IGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMiwgb3B0aW9ucykgewogICAgICAgIGlmICghY29udGVudDMudHJpbSgpKSByZXR1cm4gIiI7CiAgICAgICAgcmV0dXJuIG9wdGlvbnMuc3Ryb25nRGVsaW1pdGVyICsgY29udGVudDMgKyBvcHRpb25zLnN0cm9uZ0RlbGltaXRlcjsKICAgICAgfQogICAgfTsKICAgIHJ1bGVzLmNvZGUgPSB7CiAgICAgIGZpbHRlcjogZnVuY3Rpb24obm9kZTIpIHsKICAgICAgICB2YXIgaGFzU2libGluZ3MgPSBub2RlMi5wcmV2aW91c1NpYmxpbmcgfHwgbm9kZTIubmV4dFNpYmxpbmc7CiAgICAgICAgdmFyIGlzQ29kZUJsb2NrID0gbm9kZTIucGFyZW50Tm9kZS5ub2RlTmFtZSA9PT0gIlBSRSIgJiYgIWhhc1NpYmxpbmdzOwogICAgICAgIHJldHVybiBub2RlMi5ub2RlTmFtZSA9PT0gIkNPREUiICYmICFpc0NvZGVCbG9jazsKICAgICAgfSwKICAgICAgcmVwbGFjZW1lbnQ6IGZ1bmN0aW9uKGNvbnRlbnQzKSB7CiAgICAgICAgaWYgKCFjb250ZW50MykgcmV0dXJuICIiOwogICAgICAgIGNvbnRlbnQzID0gY29udGVudDMucmVwbGFjZSgvXHI/XG58XHIvZywgIiAiKTsKICAgICAgICB2YXIgZXh0cmFTcGFjZSA9IC9eYHxeIC4qP1teIF0uKiAkfGAkLy50ZXN0KGNvbnRlbnQzKSA/ICIgIiA6ICIiOwogICAgICAgIHZhciBkZWxpbWl0ZXIgPSAiYCI7CiAgICAgICAgdmFyIG1hdGNoZXMgPSBjb250ZW50My5tYXRjaCgvYCsvZ20pIHx8IFtdOwogICAgICAgIHdoaWxlIChtYXRjaGVzLmluZGV4T2YoZGVsaW1pdGVyKSAhPT0gLTEpIGRlbGltaXRlciA9IGRlbGltaXRlciArICJgIjsKICAgICAgICByZXR1cm4gZGVsaW1pdGVyICsgZXh0cmFTcGFjZSArIGNvbnRlbnQzICsgZXh0cmFTcGFjZSArIGRlbGltaXRlcjsKICAgICAgfQogICAgfTsKICAgIHJ1bGVzLmltYWdlID0gewogICAgICBmaWx0ZXI6ICJpbWciLAogICAgICByZXBsYWNlbWVudDogZnVuY3Rpb24oY29udGVudDMsIG5vZGUyKSB7CiAgICAgICAgdmFyIGFsdCA9IGNsZWFuQXR0cmlidXRlKG5vZGUyLmdldEF0dHJpYnV0ZSgiYWx0IikpOwogICAgICAgIHZhciBzcmMgPSBub2RlMi5nZXRBdHRyaWJ1dGUoInNyYyIpIHx8ICIiOwogICAgICAgIHZhciB0aXRsZSA9IGNsZWFuQXR0cmlidXRlKG5vZGUyLmdldEF0dHJpYnV0ZSgidGl0bGUiKSk7CiAgICAgICAgdmFyIHRpdGxlUGFydCA9IHRpdGxlID8gJyAiJyArIHRpdGxlICsgJyInIDogIiI7CiAgICAgICAgcmV0dXJuIHNyYyA/ICIhWyIgKyBhbHQgKyAiXSgiICsgc3JjICsgdGl0bGVQYXJ0ICsgIikiIDogIiI7CiAgICAgIH0KICAgIH07CiAgICBSdWxlcy5wcm90b3R5cGUgPSB7CiAgICAgIGFkZDogZnVuY3Rpb24oa2V5MiwgcnVsZSkgewogICAgICAgIHRoaXMuYXJyYXkudW5zaGlmdChydWxlKTsKICAgICAgfSwKICAgICAga2VlcDogZnVuY3Rpb24oZmlsdGVyMikgewogICAgICAgIHRoaXMuX2tlZXAudW5zaGlmdCh7CiAgICAgICAgICBmaWx0ZXI6IGZpbHRlcjIsCiAgICAgICAgICByZXBsYWNlbWVudDogdGhpcy5rZWVwUmVwbGFjZW1lbnQKICAgICAgICB9KTsKICAgICAgfSwKICAgICAgcmVtb3ZlOiBmdW5jdGlvbihmaWx0ZXIyKSB7CiAgICAgICAgdGhpcy5fcmVtb3ZlLnVuc2hpZnQoewogICAgICAgICAgZmlsdGVyOiBmaWx0ZXIyLAogICAgICAgICAgcmVwbGFjZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0sCiAgICAgIGZvck5vZGU6IGZ1bmN0aW9uKG5vZGUyKSB7CiAgICAgICAgaWYgKG5vZGUyLmlzQmxhbmspIHJldHVybiB0aGlzLmJsYW5rUnVsZTsKICAgICAgICB2YXIgcnVsZTsKICAgICAgICBpZiAocnVsZSA9IGZpbmRSdWxlKHRoaXMuYXJyYXksIG5vZGUyLCB0aGlzLm9wdGlvbnMpKSByZXR1cm4gcnVsZTsKICAgICAgICBpZiAocnVsZSA9IGZpbmRSdWxlKHRoaXMuX2tlZXAsIG5vZGUyLCB0aGlzLm9wdGlvbnMpKSByZXR1cm4gcnVsZTsKICAgICAgICBpZiAocnVsZSA9IGZpbmRSdWxlKHRoaXMuX3JlbW92ZSwgbm9kZTIsIHRoaXMub3B0aW9ucykpIHJldHVybiBydWxlOwogICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRSdWxlOwogICAgICB9LAogICAgICBmb3JFYWNoOiBmdW5jdGlvbihmbikgewogICAgICAgIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IHRoaXMuYXJyYXkubGVuZ3RoOyBpMTErKykgZm4odGhpcy5hcnJheVtpMTFdLCBpMTEpOwogICAgICB9CiAgICB9OwogICAgcm9vdDUgPSB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHt9OwogICAgSFRNTFBhcnNlciA9IGNhblBhcnNlSFRNTE5hdGl2ZWx5KCkgPyByb290NS5ET01QYXJzZXIgOiBjcmVhdGVIVE1MUGFyc2VyKCk7CiAgICByZWR1Y2UyID0gQXJyYXkucHJvdG90eXBlLnJlZHVjZTsKICAgIGVzY2FwZXMgPSBbCiAgICAgIFsvXFwvZywgIlxcXFwiXSwKICAgICAgWy9cKi9nLCAiXFwqIl0sCiAgICAgIFsvXi0vZywgIlxcLSJdLAogICAgICBbL15cKyAvZywgIlxcKyAiXSwKICAgICAgWy9eKD0rKS9nLCAiXFwkMSJdLAogICAgICBbL14oI3sxLDZ9KSAvZywgIlxcJDEgIl0sCiAgICAgIFsvYC9nLCAiXFxgIl0sCiAgICAgIFsvXn5+fi9nLCAiXFx+fn4iXSwKICAgICAgWy9cWy9nLCAiXFxbIl0sCiAgICAgIFsvXF0vZywgIlxcXSJdLAogICAgICBbL14+L2csICJcXD4iXSwKICAgICAgWy9fL2csICJcXF8iXSwKICAgICAgWy9eKFxkKylcLiAvZywgIiQxXFwuICJdCiAgICBdOwogICAgVHVybmRvd25TZXJ2aWNlLnByb3RvdHlwZSA9IHsKICAgICAgLyoqCiAgICAgICAqIFRoZSBlbnRyeSBwb2ludCBmb3IgY29udmVydGluZyBhIHN0cmluZyBvciBET00gbm9kZSB0byBNYXJrZG93bgogICAgICAgKiBAcHVibGljCiAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSBpbnB1dCBUaGUgc3RyaW5nIG9yIERPTSBub2RlIHRvIGNvbnZlcnQKICAgICAgICogQHJldHVybnMgQSBNYXJrZG93biByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5wdXQKICAgICAgICogQHR5cGUgU3RyaW5nCiAgICAgICAqLwogICAgICB0dXJuZG93bjogZnVuY3Rpb24oaW5wdXQpIHsKICAgICAgICBpZiAoIWNhbkNvbnZlcnQoaW5wdXQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgICAgICBpbnB1dCArICIgaXMgbm90IGEgc3RyaW5nLCBvciBhbiBlbGVtZW50L2RvY3VtZW50L2ZyYWdtZW50IG5vZGUuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlucHV0ID09PSAiIikgcmV0dXJuICIiOwogICAgICAgIHZhciBvdXRwdXQgPSBwcm9jZXNzMy5jYWxsKHRoaXMsIG5ldyBSb290Tm9kZShpbnB1dCwgdGhpcy5vcHRpb25zKSk7CiAgICAgICAgcmV0dXJuIHBvc3RQcm9jZXNzLmNhbGwodGhpcywgb3V0cHV0KTsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIEFkZCBvbmUgb3IgbW9yZSBwbHVnaW5zCiAgICAgICAqIEBwdWJsaWMKICAgICAgICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheX0gcGx1Z2luIFRoZSBwbHVnaW4gb3IgYXJyYXkgb2YgcGx1Z2lucyB0byBhZGQKICAgICAgICogQHJldHVybnMgVGhlIFR1cm5kb3duIGluc3RhbmNlIGZvciBjaGFpbmluZwogICAgICAgKiBAdHlwZSBPYmplY3QKICAgICAgICovCiAgICAgIHVzZTogZnVuY3Rpb24ocGx1Z2luKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGx1Z2luKSkgewogICAgICAgICAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgcGx1Z2luLmxlbmd0aDsgaTExKyspIHRoaXMudXNlKHBsdWdpbltpMTFdKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwbHVnaW4gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIHBsdWdpbih0aGlzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigicGx1Z2luIG11c3QgYmUgYSBGdW5jdGlvbiBvciBhbiBBcnJheSBvZiBGdW5jdGlvbnMiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGEgcnVsZQogICAgICAgKiBAcHVibGljCiAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIHVuaXF1ZSBrZXkgb2YgdGhlIHJ1bGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJ1bGUgVGhlIHJ1bGUKICAgICAgICogQHJldHVybnMgVGhlIFR1cm5kb3duIGluc3RhbmNlIGZvciBjaGFpbmluZwogICAgICAgKiBAdHlwZSBPYmplY3QKICAgICAgICovCiAgICAgIGFkZFJ1bGU6IGZ1bmN0aW9uKGtleTIsIHJ1bGUpIHsKICAgICAgICB0aGlzLnJ1bGVzLmFkZChrZXkyLCBydWxlKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIEtlZXAgYSBub2RlIChhcyBIVE1MKSB0aGF0IG1hdGNoZXMgdGhlIGZpbHRlcgogICAgICAgKiBAcHVibGljCiAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fEZ1bmN0aW9ufSBmaWx0ZXIgVGhlIHVuaXF1ZSBrZXkgb2YgdGhlIHJ1bGUKICAgICAgICogQHJldHVybnMgVGhlIFR1cm5kb3duIGluc3RhbmNlIGZvciBjaGFpbmluZwogICAgICAgKiBAdHlwZSBPYmplY3QKICAgICAgICovCiAgICAgIGtlZXA6IGZ1bmN0aW9uKGZpbHRlcjIpIHsKICAgICAgICB0aGlzLnJ1bGVzLmtlZXAoZmlsdGVyMik7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBSZW1vdmUgYSBub2RlIHRoYXQgbWF0Y2hlcyB0aGUgZmlsdGVyCiAgICAgICAqIEBwdWJsaWMKICAgICAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXl8RnVuY3Rpb259IGZpbHRlciBUaGUgdW5pcXVlIGtleSBvZiB0aGUgcnVsZQogICAgICAgKiBAcmV0dXJucyBUaGUgVHVybmRvd24gaW5zdGFuY2UgZm9yIGNoYWluaW5nCiAgICAgICAqIEB0eXBlIE9iamVjdAogICAgICAgKi8KICAgICAgcmVtb3ZlOiBmdW5jdGlvbihmaWx0ZXIyKSB7CiAgICAgICAgdGhpcy5ydWxlcy5yZW1vdmUoZmlsdGVyMik7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBFc2NhcGVzIE1hcmtkb3duIHN5bnRheAogICAgICAgKiBAcHVibGljCiAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBlc2NhcGUKICAgICAgICogQHJldHVybnMgQSBzdHJpbmcgd2l0aCBNYXJrZG93biBzeW50YXggZXNjYXBlZAogICAgICAgKiBAdHlwZSBTdHJpbmcKICAgICAgICovCiAgICAgIGVzY2FwZTogZnVuY3Rpb24oc3RyaW5nMykgewogICAgICAgIHJldHVybiBlc2NhcGVzLnJlZHVjZShmdW5jdGlvbihhY2N1bXVsYXRvciwgZXNjYXBlKSB7CiAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3IucmVwbGFjZShlc2NhcGVbMF0sIGVzY2FwZVsxXSk7CiAgICAgICAgfSwgc3RyaW5nMyk7CiAgICAgIH0KICAgIH07CiAgICB0dXJuZG93bl9icm93c2VyX2VzX2RlZmF1bHQgPSBUdXJuZG93blNlcnZpY2U7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS90dXJuZG93bi1wbHVnaW4tZ2ZtQDEuMC4yL25vZGVfbW9kdWxlcy90dXJuZG93bi1wbHVnaW4tZ2ZtL2xpYi90dXJuZG93bi1wbHVnaW4tZ2ZtLmVzLmpzCnZhciB0dXJuZG93bl9wbHVnaW5fZ2ZtX2VzX2V4cG9ydHMgPSB7fTsKX19leHBvcnQodHVybmRvd25fcGx1Z2luX2dmbV9lc19leHBvcnRzLCB7CiAgZ2ZtOiAoKSA9PiBnZm0yLAogIGhpZ2hsaWdodGVkQ29kZUJsb2NrOiAoKSA9PiBoaWdobGlnaHRlZENvZGVCbG9jaywKICBzdHJpa2V0aHJvdWdoOiAoKSA9PiBzdHJpa2V0aHJvdWdoMiwKICB0YWJsZXM6ICgpID0+IHRhYmxlcywKICB0YXNrTGlzdEl0ZW1zOiAoKSA9PiB0YXNrTGlzdEl0ZW1zCn0pOwpmdW5jdGlvbiBoaWdobGlnaHRlZENvZGVCbG9jayh0dXJuZG93blNlcnZpY2UpIHsKICB0dXJuZG93blNlcnZpY2UuYWRkUnVsZSgiaGlnaGxpZ2h0ZWRDb2RlQmxvY2siLCB7CiAgICBmaWx0ZXI6IGZ1bmN0aW9uKG5vZGUyKSB7CiAgICAgIHZhciBmaXJzdENoaWxkID0gbm9kZTIuZmlyc3RDaGlsZDsKICAgICAgcmV0dXJuIG5vZGUyLm5vZGVOYW1lID09PSAiRElWIiAmJiBoaWdobGlnaHRSZWdFeHAudGVzdChub2RlMi5jbGFzc05hbWUpICYmIGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlTmFtZSA9PT0gIlBSRSI7CiAgICB9LAogICAgcmVwbGFjZW1lbnQ6IGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMiwgb3B0aW9ucykgewogICAgICB2YXIgY2xhc3NOYW1lID0gbm9kZTIuY2xhc3NOYW1lIHx8ICIiOwogICAgICB2YXIgbGFuZ3VhZ2UgPSAoY2xhc3NOYW1lLm1hdGNoKGhpZ2hsaWdodFJlZ0V4cCkgfHwgW251bGwsICIiXSlbMV07CiAgICAgIHJldHVybiAiXG5cbiIgKyBvcHRpb25zLmZlbmNlICsgbGFuZ3VhZ2UgKyAiXG4iICsgbm9kZTIuZmlyc3RDaGlsZC50ZXh0Q29udGVudCArICJcbiIgKyBvcHRpb25zLmZlbmNlICsgIlxuXG4iOwogICAgfQogIH0pOwp9CmZ1bmN0aW9uIHN0cmlrZXRocm91Z2gyKHR1cm5kb3duU2VydmljZSkgewogIHR1cm5kb3duU2VydmljZS5hZGRSdWxlKCJzdHJpa2V0aHJvdWdoIiwgewogICAgZmlsdGVyOiBbImRlbCIsICJzIiwgInN0cmlrZSJdLAogICAgcmVwbGFjZW1lbnQ6IGZ1bmN0aW9uKGNvbnRlbnQzKSB7CiAgICAgIHJldHVybiAifiIgKyBjb250ZW50MyArICJ+IjsKICAgIH0KICB9KTsKfQpmdW5jdGlvbiBpc0hlYWRpbmdSb3codHIyKSB7CiAgdmFyIHBhcmVudE5vZGUgPSB0cjIucGFyZW50Tm9kZTsKICByZXR1cm4gcGFyZW50Tm9kZS5ub2RlTmFtZSA9PT0gIlRIRUFEIiB8fCBwYXJlbnROb2RlLmZpcnN0Q2hpbGQgPT09IHRyMiAmJiAocGFyZW50Tm9kZS5ub2RlTmFtZSA9PT0gIlRBQkxFIiB8fCBpc0ZpcnN0VGJvZHkocGFyZW50Tm9kZSkpICYmIGV2ZXJ5Mi5jYWxsKHRyMi5jaGlsZE5vZGVzLCBmdW5jdGlvbihuMTMpIHsKICAgIHJldHVybiBuMTMubm9kZU5hbWUgPT09ICJUSCI7CiAgfSk7Cn0KZnVuY3Rpb24gaXNGaXJzdFRib2R5KGVsZW1lbnQ0KSB7CiAgdmFyIHByZXZpb3VzU2libGluZyA9IGVsZW1lbnQ0LnByZXZpb3VzU2libGluZzsKICByZXR1cm4gZWxlbWVudDQubm9kZU5hbWUgPT09ICJUQk9EWSIgJiYgKCFwcmV2aW91c1NpYmxpbmcgfHwgcHJldmlvdXNTaWJsaW5nLm5vZGVOYW1lID09PSAiVEhFQUQiICYmIC9eXHMqJC9pLnRlc3QocHJldmlvdXNTaWJsaW5nLnRleHRDb250ZW50KSk7Cn0KZnVuY3Rpb24gY2VsbChjb250ZW50Mywgbm9kZTIpIHsKICB2YXIgaW5kZXgyID0gaW5kZXhPZjIuY2FsbChub2RlMi5wYXJlbnROb2RlLmNoaWxkTm9kZXMsIG5vZGUyKTsKICB2YXIgcHJlZml4NCA9ICIgIjsKICBpZiAoaW5kZXgyID09PSAwKSBwcmVmaXg0ID0gInwgIjsKICByZXR1cm4gcHJlZml4NCArIGNvbnRlbnQzICsgIiB8IjsKfQpmdW5jdGlvbiB0YWJsZXModHVybmRvd25TZXJ2aWNlKSB7CiAgdHVybmRvd25TZXJ2aWNlLmtlZXAoZnVuY3Rpb24obm9kZTIpIHsKICAgIHJldHVybiBub2RlMi5ub2RlTmFtZSA9PT0gIlRBQkxFIiAmJiAhaXNIZWFkaW5nUm93KG5vZGUyLnJvd3NbMF0pOwogIH0pOwogIGZvciAodmFyIGtleTIgaW4gcnVsZXMyKSB0dXJuZG93blNlcnZpY2UuYWRkUnVsZShrZXkyLCBydWxlczJba2V5Ml0pOwp9CmZ1bmN0aW9uIHRhc2tMaXN0SXRlbXModHVybmRvd25TZXJ2aWNlKSB7CiAgdHVybmRvd25TZXJ2aWNlLmFkZFJ1bGUoInRhc2tMaXN0SXRlbXMiLCB7CiAgICBmaWx0ZXI6IGZ1bmN0aW9uKG5vZGUyKSB7CiAgICAgIHJldHVybiBub2RlMi50eXBlID09PSAiY2hlY2tib3giICYmIG5vZGUyLnBhcmVudE5vZGUubm9kZU5hbWUgPT09ICJMSSI7CiAgICB9LAogICAgcmVwbGFjZW1lbnQ6IGZ1bmN0aW9uKGNvbnRlbnQzLCBub2RlMikgewogICAgICByZXR1cm4gKG5vZGUyLmNoZWNrZWQgPyAiW3hdIiA6ICJbIF0iKSArICIgIjsKICAgIH0KICB9KTsKfQpmdW5jdGlvbiBnZm0yKHR1cm5kb3duU2VydmljZSkgewogIHR1cm5kb3duU2VydmljZS51c2UoWwogICAgaGlnaGxpZ2h0ZWRDb2RlQmxvY2ssCiAgICBzdHJpa2V0aHJvdWdoMiwKICAgIHRhYmxlcywKICAgIHRhc2tMaXN0SXRlbXMKICBdKTsKfQp2YXIgaGlnaGxpZ2h0UmVnRXhwLCBpbmRleE9mMiwgZXZlcnkyLCBydWxlczI7CnZhciBpbml0X3R1cm5kb3duX3BsdWdpbl9nZm1fZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS90dXJuZG93bi1wbHVnaW4tZ2ZtQDEuMC4yL25vZGVfbW9kdWxlcy90dXJuZG93bi1wbHVnaW4tZ2ZtL2xpYi90dXJuZG93bi1wbHVnaW4tZ2ZtLmVzLmpzIigpIHsKICAgIGhpZ2hsaWdodFJlZ0V4cCA9IC9oaWdobGlnaHQtKD86dGV4dHxzb3VyY2UpLShbYS16MC05XSspLzsKICAgIGluZGV4T2YyID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2Y7CiAgICBldmVyeTIgPSBBcnJheS5wcm90b3R5cGUuZXZlcnk7CiAgICBydWxlczIgPSB7fTsKICAgIHJ1bGVzMi50YWJsZUNlbGwgPSB7CiAgICAgIGZpbHRlcjogWyJ0aCIsICJ0ZCJdLAogICAgICByZXBsYWNlbWVudDogZnVuY3Rpb24oY29udGVudDMsIG5vZGUyKSB7CiAgICAgICAgcmV0dXJuIGNlbGwoY29udGVudDMsIG5vZGUyKTsKICAgICAgfQogICAgfTsKICAgIHJ1bGVzMi50YWJsZVJvdyA9IHsKICAgICAgZmlsdGVyOiAidHIiLAogICAgICByZXBsYWNlbWVudDogZnVuY3Rpb24oY29udGVudDMsIG5vZGUyKSB7CiAgICAgICAgdmFyIGJvcmRlckNlbGxzID0gIiI7CiAgICAgICAgdmFyIGFsaWduTWFwID0geyBsZWZ0OiAiOi0tIiwgcmlnaHQ6ICItLToiLCBjZW50ZXI6ICI6LToiIH07CiAgICAgICAgaWYgKGlzSGVhZGluZ1Jvdyhub2RlMikpIHsKICAgICAgICAgIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IG5vZGUyLmNoaWxkTm9kZXMubGVuZ3RoOyBpMTErKykgewogICAgICAgICAgICB2YXIgYm9yZGVyID0gIi0tLSI7CiAgICAgICAgICAgIHZhciBhbGlnbiA9IChub2RlMi5jaGlsZE5vZGVzW2kxMV0uZ2V0QXR0cmlidXRlKCJhbGlnbiIpIHx8ICIiKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICBpZiAoYWxpZ24pIGJvcmRlciA9IGFsaWduTWFwW2FsaWduXSB8fCBib3JkZXI7CiAgICAgICAgICAgIGJvcmRlckNlbGxzICs9IGNlbGwoYm9yZGVyLCBub2RlMi5jaGlsZE5vZGVzW2kxMV0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gIlxuIiArIGNvbnRlbnQzICsgKGJvcmRlckNlbGxzID8gIlxuIiArIGJvcmRlckNlbGxzIDogIiIpOwogICAgICB9CiAgICB9OwogICAgcnVsZXMyLnRhYmxlID0gewogICAgICAvLyBPbmx5IGNvbnZlcnQgdGFibGVzIHdpdGggYSBoZWFkaW5nIHJvdy4KICAgICAgLy8gVGFibGVzIHdpdGggbm8gaGVhZGluZyByb3cgYXJlIGtlcHQgdXNpbmcgYGtlZXBgIChzZWUgYmVsb3cpLgogICAgICBmaWx0ZXI6IGZ1bmN0aW9uKG5vZGUyKSB7CiAgICAgICAgcmV0dXJuIG5vZGUyLm5vZGVOYW1lID09PSAiVEFCTEUiICYmIGlzSGVhZGluZ1Jvdyhub2RlMi5yb3dzWzBdKTsKICAgICAgfSwKICAgICAgcmVwbGFjZW1lbnQ6IGZ1bmN0aW9uKGNvbnRlbnQzKSB7CiAgICAgICAgY29udGVudDMgPSBjb250ZW50My5yZXBsYWNlKCJcblxuIiwgIlxuIik7CiAgICAgICAgcmV0dXJuICJcblxuIiArIGNvbnRlbnQzICsgIlxuXG4iOwogICAgICB9CiAgICB9OwogICAgcnVsZXMyLnRhYmxlU2VjdGlvbiA9IHsKICAgICAgZmlsdGVyOiBbInRoZWFkIiwgInRib2R5IiwgInRmb290Il0sCiAgICAgIHJlcGxhY2VtZW50OiBmdW5jdGlvbihjb250ZW50MykgewogICAgICAgIHJldHVybiBjb250ZW50MzsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0bWFya2Rvd25AMy4wLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0bWFya2Rvd24vZGlzdF90cy9zbWFydG1hcmtkb3duLnBsdWdpbnMuanMKdmFyIHNtYXJ0eWFtbDsKdmFyIGluaXRfc21hcnRtYXJrZG93bl9wbHVnaW5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRtYXJrZG93bkAzLjAuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRtYXJrZG93bi9kaXN0X3RzL3NtYXJ0bWFya2Rvd24ucGx1Z2lucy5qcyIoKSB7CiAgICBzbWFydHlhbWwgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdF90czIoKSwgMSk7CiAgICBpbml0X3VuaWZpZWQoKTsKICAgIGluaXRfcmVtYXJrX2dmbSgpOwogICAgaW5pdF9yZW1hcmtfcGFyc2UoKTsKICAgIGluaXRfcmVtYXJrX2Zyb250bWF0dGVyKCk7CiAgICBpbml0X3JlbWFya19odG1sKCk7CiAgICBpbml0X3JlbWFya19zdHJpbmdpZnkoKTsKICAgIGluaXRfdHVybmRvd25fYnJvd3Nlcl9lcygpOwogICAgaW5pdF90dXJuZG93bl9wbHVnaW5fZ2ZtX2VzKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydG1hcmtkb3duQDMuMC4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydG1hcmtkb3duL2Rpc3RfdHMvc21hcnRtYXJrZG93bi5jbGFzc2VzLm1kcGFyc2VkcmVzdWx0LmpzCnZhciBNZFBhcnNlZFJlc3VsdDsKdmFyIGluaXRfc21hcnRtYXJrZG93bl9jbGFzc2VzX21kcGFyc2VkcmVzdWx0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRtYXJrZG93bkAzLjAuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRtYXJrZG93bi9kaXN0X3RzL3NtYXJ0bWFya2Rvd24uY2xhc3Nlcy5tZHBhcnNlZHJlc3VsdC5qcyIoKSB7CiAgICBpbml0X3NtYXJ0bWFya2Rvd25fcGx1Z2lucygpOwogICAgTWRQYXJzZWRSZXN1bHQgPSBjbGFzcyBfTWRQYXJzZWRSZXN1bHQgewogICAgICBzdGF0aWMgYXN5bmMgY3JlYXRlRnJvbU1hcmtkb3duU3RyaW5nKG1kU3RyaW5nQXJnKSB7CiAgICAgICAgY29uc3QgbWRQYXJzZWRSZXN1bHQgPSBuZXcgX01kUGFyc2VkUmVzdWx0KCk7CiAgICAgICAgYXdhaXQgbWRQYXJzZWRSZXN1bHQudXBkYXRlRnJvbU1hcmtkb3duU3RyaW5nKG1kU3RyaW5nQXJnKTsKICAgICAgICByZXR1cm4gbWRQYXJzZWRSZXN1bHQ7CiAgICAgIH0KICAgICAgYXN5bmMgdXBkYXRlRnJvbU1hcmtkb3duU3RyaW5nKG1kU3RyaW5nQXJnKSB7CiAgICAgICAgbGV0IHlhbWxTdHJpbmc7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdW5pZmllZCgpLnVzZShyZW1hcmtQYXJzZSkudXNlKHJlbWFya0dmbSkudXNlKHJlbWFya0Zyb250bWF0dGVyLCBbInlhbWwiLCAidG9tbCJdKS51c2UocmVtYXJrU3RyaW5naWZ5KS51c2UocmVtYXJrSHRtbCkudXNlKCgpID0+ICh0cmVlKSA9PiB7CiAgICAgICAgICBjb25zb2xlLmRpcih0cmVlKTsKICAgICAgICAgIGNvbnN0IHlhbWxDaGlsZCA9IHRyZWUuY2hpbGRyZW4uZmluZCgob2JqZWN0QXJnKSA9PiBvYmplY3RBcmcudHlwZSA9PT0gInlhbWwiKTsKICAgICAgICAgIGlmICh5YW1sQ2hpbGQpIHsKICAgICAgICAgICAgeWFtbFN0cmluZyA9IHlhbWxDaGlsZC52YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9KS5wcm9jZXNzKG1kU3RyaW5nQXJnKTsKICAgICAgICB0aGlzLmh0bWwgPSByZXN1bHQudG9TdHJpbmcoKTsKICAgICAgICBpZiAoeWFtbFN0cmluZykgewogICAgICAgICAgdGhpcy5mcm9udG1hdHRlckRhdGEgPSBhd2FpdCBzbWFydHlhbWwueWFtbFN0cmluZ1RvT2JqZWN0KHlhbWxTdHJpbmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmZyb250bWF0dGVyRGF0YSA9IHt9OwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0bWFya2Rvd25AMy4wLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0bWFya2Rvd24vZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMjEgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMjEsIHsKICBTbWFydE1hcmtkb3duOiAoKSA9PiBTbWFydE1hcmtkb3duCn0pOwp2YXIgU21hcnRNYXJrZG93bjsKdmFyIGluaXRfZGlzdF90czIxID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRtYXJrZG93bkAzLjAuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRtYXJrZG93bi9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfc21hcnRtYXJrZG93bl9wbHVnaW5zKCk7CiAgICBpbml0X3NtYXJ0bWFya2Rvd25fY2xhc3Nlc19tZHBhcnNlZHJlc3VsdCgpOwogICAgU21hcnRNYXJrZG93biA9IGNsYXNzIF9TbWFydE1hcmtkb3duIHsKICAgICAgc3RhdGljIGFzeW5jIGVhc3lNYXJrZG93blRvSHRtbChtZFN0cmluZ0FyZykgewogICAgICAgIGNvbnN0IHNtYXJ0bWFya2Rvd25JbnN0YW5jZSA9IG5ldyBfU21hcnRNYXJrZG93bigpOwogICAgICAgIGNvbnN0IG1kUGFyc2VkUmVzdWx0ID0gYXdhaXQgc21hcnRtYXJrZG93bkluc3RhbmNlLmdldE1kUGFyc2VkUmVzdWx0RnJvbU1hcmtkb3duKG1kU3RyaW5nQXJnKTsKICAgICAgICByZXR1cm4gbWRQYXJzZWRSZXN1bHQuaHRtbDsKICAgICAgfQogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgfQogICAgICAvKioKICAgICAgICogY3JlYXRlIGEgTWRQYXJzZWRSZXN1bHQgZnJvbSBtYXJrZG93bgogICAgICAgKiBAcGFyYW0gbWRTdHJpbmdBcmcKICAgICAgICovCiAgICAgIGFzeW5jIGdldE1kUGFyc2VkUmVzdWx0RnJvbU1hcmtkb3duKG1kU3RyaW5nQXJnKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgTWRQYXJzZWRSZXN1bHQuY3JlYXRlRnJvbU1hcmtkb3duU3RyaW5nKG1kU3RyaW5nQXJnKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIGh0bWxUb01hcmtkb3duKGh0bWxTdHJpbmcpIHsKICAgICAgICBjb25zdCB0dXJuZG93bkluc3RhbmNlID0gbmV3IHR1cm5kb3duX2Jyb3dzZXJfZXNfZGVmYXVsdCh7CiAgICAgICAgICBoZWFkaW5nU3R5bGU6ICJhdHgiLAogICAgICAgICAgY29kZUJsb2NrU3R5bGU6ICJmZW5jZWQiCiAgICAgICAgfSk7CiAgICAgICAgdHVybmRvd25JbnN0YW5jZS51c2UodHVybmRvd25fcGx1Z2luX2dmbV9lc19leHBvcnRzLmdmbSk7CiAgICAgICAgcmV0dXJuIHR1cm5kb3duSW5zdGFuY2UudHVybmRvd24oaHRtbFN0cmluZyk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9wYXRoLXRvLXJlZ2V4cEA4LjMuMC9ub2RlX21vZHVsZXMvcGF0aC10by1yZWdleHAvZGlzdC9pbmRleC5qcwp2YXIgcmVxdWlyZV9kaXN0ID0gX19jb21tb25KUyh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9wYXRoLXRvLXJlZ2V4cEA4LjMuMC9ub2RlX21vZHVsZXMvcGF0aC10by1yZWdleHAvZGlzdC9pbmRleC5qcyIoZXhwb3J0cykgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMuUGF0aEVycm9yID0gZXhwb3J0cy5Ub2tlbkRhdGEgPSB2b2lkIDA7CiAgICBleHBvcnRzLnBhcnNlID0gcGFyc2UxMDsKICAgIGV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGUyOwogICAgZXhwb3J0cy5tYXRjaCA9IG1hdGNoMjsKICAgIGV4cG9ydHMucGF0aFRvUmVnZXhwID0gcGF0aFRvUmVnZXhwOwogICAgZXhwb3J0cy5zdHJpbmdpZnkgPSBzdHJpbmdpZnk3OwogICAgdmFyIERFRkFVTFRfREVMSU1JVEVSID0gIi8iOwogICAgdmFyIE5PT1BfVkFMVUUgPSAodmFsdWUyKSA9PiB2YWx1ZTI7CiAgICB2YXIgSURfU1RBUlQgPSAvXlskX1xwe0lEX1N0YXJ0fV0kL3U7CiAgICB2YXIgSURfQ09OVElOVUUgPSAvXlskXHUyMDBjXHUyMDBkXHB7SURfQ29udGludWV9XSQvdTsKICAgIHZhciBTSU1QTEVfVE9LRU5TID0gewogICAgICAvLyBHcm91cHMuCiAgICAgICJ7IjogInsiLAogICAgICAifSI6ICJ9IiwKICAgICAgLy8gUmVzZXJ2ZWQuCiAgICAgICIoIjogIigiLAogICAgICAiKSI6ICIpIiwKICAgICAgIlsiOiAiWyIsCiAgICAgICJdIjogIl0iLAogICAgICAiKyI6ICIrIiwKICAgICAgIj8iOiAiPyIsCiAgICAgICIhIjogIiEiCiAgICB9OwogICAgZnVuY3Rpb24gZXNjYXBlVGV4dChzdHIpIHsKICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9be30oKVxbXF0rPyE6KlxcXS9nLCAiXFwkJiIpOwogICAgfQogICAgZnVuY3Rpb24gZXNjYXBlKHN0cikgewogICAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1suKyo/XiR7fSgpW1xdfC9cXF0vZywgIlxcJCYiKTsKICAgIH0KICAgIHZhciBUb2tlbkRhdGEgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKHRva2Vucywgb3JpZ2luYWxQYXRoKSB7CiAgICAgICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7CiAgICAgICAgdGhpcy5vcmlnaW5hbFBhdGggPSBvcmlnaW5hbFBhdGg7CiAgICAgIH0KICAgIH07CiAgICBleHBvcnRzLlRva2VuRGF0YSA9IFRva2VuRGF0YTsKICAgIHZhciBQYXRoRXJyb3IgPSBjbGFzcyBleHRlbmRzIFR5cGVFcnJvciB7CiAgICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UyLCBvcmlnaW5hbFBhdGgpIHsKICAgICAgICBsZXQgdGV4dDkgPSBtZXNzYWdlMjsKICAgICAgICBpZiAob3JpZ2luYWxQYXRoKQogICAgICAgICAgdGV4dDkgKz0gYDogJHtvcmlnaW5hbFBhdGh9YDsKICAgICAgICB0ZXh0OSArPSBgOyB2aXNpdCBodHRwczovL2dpdC5uZXcvcGF0aFRvUmVnZXhwRXJyb3IgZm9yIGluZm9gOwogICAgICAgIHN1cGVyKHRleHQ5KTsKICAgICAgICB0aGlzLm9yaWdpbmFsUGF0aCA9IG9yaWdpbmFsUGF0aDsKICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMuUGF0aEVycm9yID0gUGF0aEVycm9yOwogICAgZnVuY3Rpb24gcGFyc2UxMChzdHIsIG9wdGlvbnMgPSB7fSkgewogICAgICBjb25zdCB7IGVuY29kZVBhdGggPSBOT09QX1ZBTFVFIH0gPSBvcHRpb25zOwogICAgICBjb25zdCBjaGFycyA9IFsuLi5zdHJdOwogICAgICBjb25zdCB0b2tlbnMgPSBbXTsKICAgICAgbGV0IGluZGV4MiA9IDA7CiAgICAgIGxldCBwb3MgPSAwOwogICAgICBmdW5jdGlvbiBuYW1lKCkgewogICAgICAgIGxldCB2YWx1ZTIgPSAiIjsKICAgICAgICBpZiAoSURfU1RBUlQudGVzdChjaGFyc1tpbmRleDJdKSkgewogICAgICAgICAgZG8gewogICAgICAgICAgICB2YWx1ZTIgKz0gY2hhcnNbaW5kZXgyKytdOwogICAgICAgICAgfSB3aGlsZSAoSURfQ09OVElOVUUudGVzdChjaGFyc1tpbmRleDJdKSk7CiAgICAgICAgfSBlbHNlIGlmIChjaGFyc1tpbmRleDJdID09PSAnIicpIHsKICAgICAgICAgIGxldCBxdW90ZVN0YXJ0ID0gaW5kZXgyOwogICAgICAgICAgd2hpbGUgKGluZGV4MisrIDwgY2hhcnMubGVuZ3RoKSB7CiAgICAgICAgICAgIGlmIChjaGFyc1tpbmRleDJdID09PSAnIicpIHsKICAgICAgICAgICAgICBpbmRleDIrKzsKICAgICAgICAgICAgICBxdW90ZVN0YXJ0ID0gMDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hhcnNbaW5kZXgyXSA9PT0gIlxcIikKICAgICAgICAgICAgICBpbmRleDIrKzsKICAgICAgICAgICAgdmFsdWUyICs9IGNoYXJzW2luZGV4Ml07CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocXVvdGVTdGFydCkgewogICAgICAgICAgICB0aHJvdyBuZXcgUGF0aEVycm9yKGBVbnRlcm1pbmF0ZWQgcXVvdGUgYXQgaW5kZXggJHtxdW90ZVN0YXJ0fWAsIHN0cik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghdmFsdWUyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgUGF0aEVycm9yKGBNaXNzaW5nIHBhcmFtZXRlciBuYW1lIGF0IGluZGV4ICR7aW5kZXgyfWAsIHN0cik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZTI7CiAgICAgIH0KICAgICAgd2hpbGUgKGluZGV4MiA8IGNoYXJzLmxlbmd0aCkgewogICAgICAgIGNvbnN0IHZhbHVlMiA9IGNoYXJzW2luZGV4Ml07CiAgICAgICAgY29uc3QgdHlwZTUgPSBTSU1QTEVfVE9LRU5TW3ZhbHVlMl07CiAgICAgICAgaWYgKHR5cGU1KSB7CiAgICAgICAgICB0b2tlbnMucHVzaCh7IHR5cGU6IHR5cGU1LCBpbmRleDogaW5kZXgyKyssIHZhbHVlOiB2YWx1ZTIgfSk7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZTIgPT09ICJcXCIpIHsKICAgICAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogImVzY2FwZSIsIGluZGV4OiBpbmRleDIrKywgdmFsdWU6IGNoYXJzW2luZGV4MisrXSB9KTsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlMiA9PT0gIjoiKSB7CiAgICAgICAgICB0b2tlbnMucHVzaCh7IHR5cGU6ICJwYXJhbSIsIGluZGV4OiBpbmRleDIrKywgdmFsdWU6IG5hbWUoKSB9KTsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlMiA9PT0gIioiKSB7CiAgICAgICAgICB0b2tlbnMucHVzaCh7IHR5cGU6ICJ3aWxkY2FyZCIsIGluZGV4OiBpbmRleDIrKywgdmFsdWU6IG5hbWUoKSB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiAiY2hhciIsIGluZGV4OiBpbmRleDIrKywgdmFsdWU6IHZhbHVlMiB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiAiZW5kIiwgaW5kZXg6IGluZGV4MiwgdmFsdWU6ICIiIH0pOwogICAgICBmdW5jdGlvbiBjb25zdW1lVW50aWwoZW5kVHlwZSkgewogICAgICAgIGNvbnN0IG91dHB1dCA9IFtdOwogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1twb3MrK107CiAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gZW5kVHlwZSkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gImNoYXIiIHx8IHRva2VuLnR5cGUgPT09ICJlc2NhcGUiKSB7CiAgICAgICAgICAgIGxldCBwYXRoMiA9IHRva2VuLnZhbHVlOwogICAgICAgICAgICBsZXQgY3VyID0gdG9rZW5zW3Bvc107CiAgICAgICAgICAgIHdoaWxlIChjdXIudHlwZSA9PT0gImNoYXIiIHx8IGN1ci50eXBlID09PSAiZXNjYXBlIikgewogICAgICAgICAgICAgIHBhdGgyICs9IGN1ci52YWx1ZTsKICAgICAgICAgICAgICBjdXIgPSB0b2tlbnNbKytwb3NdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG91dHB1dC5wdXNoKHsKICAgICAgICAgICAgICB0eXBlOiAidGV4dCIsCiAgICAgICAgICAgICAgdmFsdWU6IGVuY29kZVBhdGgocGF0aDIpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAicGFyYW0iIHx8IHRva2VuLnR5cGUgPT09ICJ3aWxkY2FyZCIpIHsKICAgICAgICAgICAgb3V0cHV0LnB1c2goewogICAgICAgICAgICAgIHR5cGU6IHRva2VuLnR5cGUsCiAgICAgICAgICAgICAgbmFtZTogdG9rZW4udmFsdWUKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJ7IikgewogICAgICAgICAgICBvdXRwdXQucHVzaCh7CiAgICAgICAgICAgICAgdHlwZTogImdyb3VwIiwKICAgICAgICAgICAgICB0b2tlbnM6IGNvbnN1bWVVbnRpbCgifSIpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHRocm93IG5ldyBQYXRoRXJyb3IoYFVuZXhwZWN0ZWQgJHt0b2tlbi50eXBlfSBhdCBpbmRleCAke3Rva2VuLmluZGV4fSwgZXhwZWN0ZWQgJHtlbmRUeXBlfWAsIHN0cik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBUb2tlbkRhdGEoY29uc3VtZVVudGlsKCJlbmQiKSwgc3RyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbXBpbGUyKHBhdGgyLCBvcHRpb25zID0ge30pIHsKICAgICAgY29uc3QgeyBlbmNvZGU6IGVuY29kZTIgPSBlbmNvZGVVUklDb21wb25lbnQsIGRlbGltaXRlciA9IERFRkFVTFRfREVMSU1JVEVSIH0gPSBvcHRpb25zOwogICAgICBjb25zdCBkYXRhID0gdHlwZW9mIHBhdGgyID09PSAib2JqZWN0IiA/IHBhdGgyIDogcGFyc2UxMChwYXRoMiwgb3B0aW9ucyk7CiAgICAgIGNvbnN0IGZuID0gdG9rZW5zVG9GdW5jdGlvbihkYXRhLnRva2VucywgZGVsaW1pdGVyLCBlbmNvZGUyKTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIHBhdGgzKHBhcmFtczIgPSB7fSkgewogICAgICAgIGNvbnN0IFtwYXRoNCwgLi4ubWlzc2luZ10gPSBmbihwYXJhbXMyKTsKICAgICAgICBpZiAobWlzc2luZy5sZW5ndGgpIHsKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE1pc3NpbmcgcGFyYW1ldGVyczogJHttaXNzaW5nLmpvaW4oIiwgIil9YCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXRoNDsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHRva2Vuc1RvRnVuY3Rpb24odG9rZW5zLCBkZWxpbWl0ZXIsIGVuY29kZTIpIHsKICAgICAgY29uc3QgZW5jb2RlcnMgPSB0b2tlbnMubWFwKCh0b2tlbikgPT4gdG9rZW5Ub0Z1bmN0aW9uKHRva2VuLCBkZWxpbWl0ZXIsIGVuY29kZTIpKTsKICAgICAgcmV0dXJuIChkYXRhKSA9PiB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gWyIiXTsKICAgICAgICBmb3IgKGNvbnN0IGVuY29kZXIyIG9mIGVuY29kZXJzKSB7CiAgICAgICAgICBjb25zdCBbdmFsdWUyLCAuLi5leHRyYXNdID0gZW5jb2RlcjIoZGF0YSk7CiAgICAgICAgICByZXN1bHRbMF0gKz0gdmFsdWUyOwogICAgICAgICAgcmVzdWx0LnB1c2goLi4uZXh0cmFzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHRva2VuVG9GdW5jdGlvbih0b2tlbiwgZGVsaW1pdGVyLCBlbmNvZGUyKSB7CiAgICAgIGlmICh0b2tlbi50eXBlID09PSAidGV4dCIpCiAgICAgICAgcmV0dXJuICgpID0+IFt0b2tlbi52YWx1ZV07CiAgICAgIGlmICh0b2tlbi50eXBlID09PSAiZ3JvdXAiKSB7CiAgICAgICAgY29uc3QgZm4gPSB0b2tlbnNUb0Z1bmN0aW9uKHRva2VuLnRva2VucywgZGVsaW1pdGVyLCBlbmNvZGUyKTsKICAgICAgICByZXR1cm4gKGRhdGEpID0+IHsKICAgICAgICAgIGNvbnN0IFt2YWx1ZTIsIC4uLm1pc3NpbmddID0gZm4oZGF0YSk7CiAgICAgICAgICBpZiAoIW1pc3NpbmcubGVuZ3RoKQogICAgICAgICAgICByZXR1cm4gW3ZhbHVlMl07CiAgICAgICAgICByZXR1cm4gWyIiXTsKICAgICAgICB9OwogICAgICB9CiAgICAgIGNvbnN0IGVuY29kZVZhbHVlID0gZW5jb2RlMiB8fCBOT09QX1ZBTFVFOwogICAgICBpZiAodG9rZW4udHlwZSA9PT0gIndpbGRjYXJkIiAmJiBlbmNvZGUyICE9PSBmYWxzZSkgewogICAgICAgIHJldHVybiAoZGF0YSkgPT4gewogICAgICAgICAgY29uc3QgdmFsdWUyID0gZGF0YVt0b2tlbi5uYW1lXTsKICAgICAgICAgIGlmICh2YWx1ZTIgPT0gbnVsbCkKICAgICAgICAgICAgcmV0dXJuIFsiIiwgdG9rZW4ubmFtZV07CiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUyKSB8fCB2YWx1ZTIubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkICIke3Rva2VuLm5hbWV9IiB0byBiZSBhIG5vbi1lbXB0eSBhcnJheWApOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgdmFsdWUyLm1hcCgodmFsdWUzLCBpbmRleDIpID0+IHsKICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlMyAhPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkICIke3Rva2VuLm5hbWV9LyR7aW5kZXgyfSIgdG8gYmUgYSBzdHJpbmdgKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZVZhbHVlKHZhbHVlMyk7CiAgICAgICAgICAgIH0pLmpvaW4oZGVsaW1pdGVyKQogICAgICAgICAgXTsKICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiAoZGF0YSkgPT4gewogICAgICAgIGNvbnN0IHZhbHVlMiA9IGRhdGFbdG9rZW4ubmFtZV07CiAgICAgICAgaWYgKHZhbHVlMiA9PSBudWxsKQogICAgICAgICAgcmV0dXJuIFsiIiwgdG9rZW4ubmFtZV07CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZTIgIT09ICJzdHJpbmciKSB7CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAiJHt0b2tlbi5uYW1lfSIgdG8gYmUgYSBzdHJpbmdgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtlbmNvZGVWYWx1ZSh2YWx1ZTIpXTsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIG1hdGNoMihwYXRoMiwgb3B0aW9ucyA9IHt9KSB7CiAgICAgIGNvbnN0IHsgZGVjb2RlOiBkZWNvZGUyID0gZGVjb2RlVVJJQ29tcG9uZW50LCBkZWxpbWl0ZXIgPSBERUZBVUxUX0RFTElNSVRFUiB9ID0gb3B0aW9uczsKICAgICAgY29uc3QgeyByZWdleHAsIGtleXM6IGtleXMyIH0gPSBwYXRoVG9SZWdleHAocGF0aDIsIG9wdGlvbnMpOwogICAgICBjb25zdCBkZWNvZGVycyA9IGtleXMyLm1hcCgoa2V5MikgPT4gewogICAgICAgIGlmIChkZWNvZGUyID09PSBmYWxzZSkKICAgICAgICAgIHJldHVybiBOT09QX1ZBTFVFOwogICAgICAgIGlmIChrZXkyLnR5cGUgPT09ICJwYXJhbSIpCiAgICAgICAgICByZXR1cm4gZGVjb2RlMjsKICAgICAgICByZXR1cm4gKHZhbHVlMikgPT4gdmFsdWUyLnNwbGl0KGRlbGltaXRlcikubWFwKGRlY29kZTIpOwogICAgICB9KTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIG1hdGNoMyhpbnB1dCkgewogICAgICAgIGNvbnN0IG03ID0gcmVnZXhwLmV4ZWMoaW5wdXQpOwogICAgICAgIGlmICghbTcpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgY29uc3QgcGF0aDMgPSBtN1swXTsKICAgICAgICBjb25zdCBwYXJhbXMyID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgZm9yIChsZXQgaTExID0gMTsgaTExIDwgbTcubGVuZ3RoOyBpMTErKykgewogICAgICAgICAgaWYgKG03W2kxMV0gPT09IHZvaWQgMCkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICBjb25zdCBrZXkyID0ga2V5czJbaTExIC0gMV07CiAgICAgICAgICBjb25zdCBkZWNvZGVyMiA9IGRlY29kZXJzW2kxMSAtIDFdOwogICAgICAgICAgcGFyYW1zMltrZXkyLm5hbWVdID0gZGVjb2RlcjIobTdbaTExXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHBhdGg6IHBhdGgzLCBwYXJhbXM6IHBhcmFtczIgfTsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhdGhUb1JlZ2V4cChwYXRoMiwgb3B0aW9ucyA9IHt9KSB7CiAgICAgIGNvbnN0IHsgZGVsaW1pdGVyID0gREVGQVVMVF9ERUxJTUlURVIsIGVuZDogZW5kMyA9IHRydWUsIHNlbnNpdGl2ZSA9IGZhbHNlLCB0cmFpbGluZyA9IHRydWUgfSA9IG9wdGlvbnM7CiAgICAgIGNvbnN0IGtleXMyID0gW107CiAgICAgIGNvbnN0IGZsYWdzID0gc2Vuc2l0aXZlID8gIiIgOiAiaSI7CiAgICAgIGNvbnN0IHNvdXJjZXMgPSBbXTsKICAgICAgZm9yIChjb25zdCBpbnB1dCBvZiBwYXRoc1RvQXJyYXkocGF0aDIsIFtdKSkgewogICAgICAgIGNvbnN0IGRhdGEgPSB0eXBlb2YgaW5wdXQgPT09ICJvYmplY3QiID8gaW5wdXQgOiBwYXJzZTEwKGlucHV0LCBvcHRpb25zKTsKICAgICAgICBmb3IgKGNvbnN0IHRva2VucyBvZiBmbGF0dGVuKGRhdGEudG9rZW5zLCAwLCBbXSkpIHsKICAgICAgICAgIHNvdXJjZXMucHVzaCh0b1JlZ0V4cFNvdXJjZSh0b2tlbnMsIGRlbGltaXRlciwga2V5czIsIGRhdGEub3JpZ2luYWxQYXRoKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxldCBwYXR0ZXJuID0gYF4oPzoke3NvdXJjZXMuam9pbigifCIpfSlgOwogICAgICBpZiAodHJhaWxpbmcpCiAgICAgICAgcGF0dGVybiArPSBgKD86JHtlc2NhcGUoZGVsaW1pdGVyKX0kKT9gOwogICAgICBwYXR0ZXJuICs9IGVuZDMgPyAiJCIgOiBgKD89JHtlc2NhcGUoZGVsaW1pdGVyKX18JClgOwogICAgICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKHBhdHRlcm4sIGZsYWdzKTsKICAgICAgcmV0dXJuIHsgcmVnZXhwLCBrZXlzOiBrZXlzMiB9OwogICAgfQogICAgZnVuY3Rpb24gcGF0aHNUb0FycmF5KHBhdGhzLCBpbml0KSB7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhdGhzKSkgewogICAgICAgIGZvciAoY29uc3QgcDggb2YgcGF0aHMpCiAgICAgICAgICBwYXRoc1RvQXJyYXkocDgsIGluaXQpOwogICAgICB9IGVsc2UgewogICAgICAgIGluaXQucHVzaChwYXRocyk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluaXQ7CiAgICB9CiAgICBmdW5jdGlvbiogZmxhdHRlbih0b2tlbnMsIGluZGV4MiwgaW5pdCkgewogICAgICBpZiAoaW5kZXgyID09PSB0b2tlbnMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIHlpZWxkIGluaXQ7CiAgICAgIH0KICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXgyXTsKICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJncm91cCIpIHsKICAgICAgICBmb3IgKGNvbnN0IHNlcSBvZiBmbGF0dGVuKHRva2VuLnRva2VucywgMCwgaW5pdC5zbGljZSgpKSkgewogICAgICAgICAgeWllbGQqIGZsYXR0ZW4odG9rZW5zLCBpbmRleDIgKyAxLCBzZXEpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpbml0LnB1c2godG9rZW4pOwogICAgICB9CiAgICAgIHlpZWxkKiBmbGF0dGVuKHRva2VucywgaW5kZXgyICsgMSwgaW5pdCk7CiAgICB9CiAgICBmdW5jdGlvbiB0b1JlZ0V4cFNvdXJjZSh0b2tlbnMsIGRlbGltaXRlciwga2V5czIsIG9yaWdpbmFsUGF0aCkgewogICAgICBsZXQgcmVzdWx0ID0gIiI7CiAgICAgIGxldCBiYWNrdHJhY2sgPSAiIjsKICAgICAgbGV0IGlzU2FmZVNlZ21lbnRQYXJhbSA9IHRydWU7CiAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7CiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJ0ZXh0IikgewogICAgICAgICAgcmVzdWx0ICs9IGVzY2FwZSh0b2tlbi52YWx1ZSk7CiAgICAgICAgICBiYWNrdHJhY2sgKz0gdG9rZW4udmFsdWU7CiAgICAgICAgICBpc1NhZmVTZWdtZW50UGFyYW0gfHwgKGlzU2FmZVNlZ21lbnRQYXJhbSA9IHRva2VuLnZhbHVlLmluY2x1ZGVzKGRlbGltaXRlcikpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlbi50eXBlID09PSAicGFyYW0iIHx8IHRva2VuLnR5cGUgPT09ICJ3aWxkY2FyZCIpIHsKICAgICAgICAgIGlmICghaXNTYWZlU2VnbWVudFBhcmFtICYmICFiYWNrdHJhY2spIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFBhdGhFcnJvcihgTWlzc2luZyB0ZXh0IGJlZm9yZSAiJHt0b2tlbi5uYW1lfSIgJHt0b2tlbi50eXBlfWAsIG9yaWdpbmFsUGF0aCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gInBhcmFtIikgewogICAgICAgICAgICByZXN1bHQgKz0gYCgke25lZ2F0ZShkZWxpbWl0ZXIsIGlzU2FmZVNlZ21lbnRQYXJhbSA/ICIiIDogYmFja3RyYWNrKX0rKWA7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXN1bHQgKz0gYChbXFxzXFxTXSspYDsKICAgICAgICAgIH0KICAgICAgICAgIGtleXMyLnB1c2godG9rZW4pOwogICAgICAgICAgYmFja3RyYWNrID0gIiI7CiAgICAgICAgICBpc1NhZmVTZWdtZW50UGFyYW0gPSBmYWxzZTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gbmVnYXRlKGRlbGltaXRlciwgYmFja3RyYWNrKSB7CiAgICAgIGlmIChiYWNrdHJhY2subGVuZ3RoIDwgMikgewogICAgICAgIGlmIChkZWxpbWl0ZXIubGVuZ3RoIDwgMikKICAgICAgICAgIHJldHVybiBgW14ke2VzY2FwZShkZWxpbWl0ZXIgKyBiYWNrdHJhY2spfV1gOwogICAgICAgIHJldHVybiBgKD86KD8hJHtlc2NhcGUoZGVsaW1pdGVyKX0pW14ke2VzY2FwZShiYWNrdHJhY2spfV0pYDsKICAgICAgfQogICAgICBpZiAoZGVsaW1pdGVyLmxlbmd0aCA8IDIpIHsKICAgICAgICByZXR1cm4gYCg/Oig/ISR7ZXNjYXBlKGJhY2t0cmFjayl9KVteJHtlc2NhcGUoZGVsaW1pdGVyKX1dKWA7CiAgICAgIH0KICAgICAgcmV0dXJuIGAoPzooPyEke2VzY2FwZShiYWNrdHJhY2spfXwke2VzY2FwZShkZWxpbWl0ZXIpfSlbXFxzXFxTXSlgOwogICAgfQogICAgZnVuY3Rpb24gc3RyaW5naWZ5VG9rZW5zKHRva2VucykgewogICAgICBsZXQgdmFsdWUyID0gIiI7CiAgICAgIGxldCBpMTEgPSAwOwogICAgICBmdW5jdGlvbiBuYW1lKHZhbHVlMykgewogICAgICAgIGNvbnN0IGlzU2FmZSA9IGlzTmFtZVNhZmUodmFsdWUzKSAmJiBpc05leHROYW1lU2FmZSh0b2tlbnNbaTExXSk7CiAgICAgICAgcmV0dXJuIGlzU2FmZSA/IHZhbHVlMyA6IEpTT04uc3RyaW5naWZ5KHZhbHVlMyk7CiAgICAgIH0KICAgICAgd2hpbGUgKGkxMSA8IHRva2Vucy5sZW5ndGgpIHsKICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpMTErK107CiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJ0ZXh0IikgewogICAgICAgICAgdmFsdWUyICs9IGVzY2FwZVRleHQodG9rZW4udmFsdWUpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlbi50eXBlID09PSAiZ3JvdXAiKSB7CiAgICAgICAgICB2YWx1ZTIgKz0gYHske3N0cmluZ2lmeVRva2Vucyh0b2tlbi50b2tlbnMpfX1gOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlbi50eXBlID09PSAicGFyYW0iKSB7CiAgICAgICAgICB2YWx1ZTIgKz0gYDoke25hbWUodG9rZW4ubmFtZSl9YDsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gIndpbGRjYXJkIikgewogICAgICAgICAgdmFsdWUyICs9IGAqJHtuYW1lKHRva2VuLm5hbWUpfWA7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5rbm93biB0b2tlbiB0eXBlOiAke3Rva2VuLnR5cGV9YCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlMjsKICAgIH0KICAgIGZ1bmN0aW9uIHN0cmluZ2lmeTcoZGF0YSkgewogICAgICByZXR1cm4gc3RyaW5naWZ5VG9rZW5zKGRhdGEudG9rZW5zKTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzTmFtZVNhZmUobmFtZSkgewogICAgICBjb25zdCBbZmlyc3QyLCAuLi5yZXN0XSA9IG5hbWU7CiAgICAgIHJldHVybiBJRF9TVEFSVC50ZXN0KGZpcnN0MikgJiYgcmVzdC5ldmVyeSgoY2hhcikgPT4gSURfQ09OVElOVUUudGVzdChjaGFyKSk7CiAgICB9CiAgICBmdW5jdGlvbiBpc05leHROYW1lU2FmZSh0b2tlbikgewogICAgICBpZiAodG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gInRleHQiKQogICAgICAgIHJldHVybiAhSURfQ09OVElOVUUudGVzdCh0b2tlbi52YWx1ZVswXSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyb3V0ZXJAMS4zLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cm91dGVyL2Rpc3RfdHMvc21hcnRyb3V0ZXIucGx1Z2lucy5qcwp2YXIgcGF0aFRvUmVnRXhwOwp2YXIgaW5pdF9zbWFydHJvdXRlcl9wbHVnaW5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyb3V0ZXJAMS4zLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cm91dGVyL2Rpc3RfdHMvc21hcnRyb3V0ZXIucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHM5KCk7CiAgICBpbml0X2Rpc3RfdHMyKCk7CiAgICBwYXRoVG9SZWdFeHAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cm91dGVyQDEuMy4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHJvdXRlci9kaXN0X3RzL3NtYXJ0cm91dGVyLmNsYXNzZXMucXVlcnlwYXJhbXMuanMKdmFyIFF1ZXJ5UGFyYW1zOwp2YXIgaW5pdF9zbWFydHJvdXRlcl9jbGFzc2VzX3F1ZXJ5cGFyYW1zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRyb3V0ZXJAMS4zLjMvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0cm91dGVyL2Rpc3RfdHMvc21hcnRyb3V0ZXIuY2xhc3Nlcy5xdWVyeXBhcmFtcy5qcyIoKSB7CiAgICBpbml0X3NtYXJ0cm91dGVyX3BsdWdpbnMoKTsKICAgIFF1ZXJ5UGFyYW1zID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgfQogICAgICBnZXRBbGxBc09iamVjdCgpIHsKICAgICAgICBjb25zdCB1cmxTZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpOwogICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModXJsU2VhcmNoUGFyYW1zLmVudHJpZXMoKSk7CiAgICAgIH0KICAgICAgc2V0UXVlcnlQYXJhbShxdWVyeUtleUFyZywgcXVlcnlDb250ZW50QXJnLCBwdXNoT3JSZXBsYWNlQXJnID0gInJlcGxhY2UiKSB7CiAgICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTsKICAgICAgICBxdWVyeVBhcmFtcy5zZXQocXVlcnlLZXlBcmcsIHF1ZXJ5Q29udGVudEFyZyk7CiAgICAgICAgcHVzaE9yUmVwbGFjZUFyZyA9PT0gInB1c2giID8gaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgbnVsbCwgIj8iICsgcXVlcnlQYXJhbXMudG9TdHJpbmcoKSkgOiBoaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBudWxsLCAiPyIgKyBxdWVyeVBhcmFtcy50b1N0cmluZygpKTsKICAgICAgfQogICAgICBkZWxldGVRdWVyeVBhcmFtKHF1ZXJ5S2V5QXJnLCBwdXNoT3JSZXBsYWNlQXJnID0gInJlcGxhY2UiKSB7CiAgICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTsKICAgICAgICBxdWVyeVBhcmFtcy5kZWxldGUocXVlcnlLZXlBcmcpOwogICAgICAgIHB1c2hPclJlcGxhY2VBcmcgPT09ICJwdXNoIiA/IGhpc3RvcnkucHVzaFN0YXRlKG51bGwsIG51bGwsICI/IiArIHF1ZXJ5UGFyYW1zLnRvU3RyaW5nKCkpIDogaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgbnVsbCwgIj8iICsgcXVlcnlQYXJhbXMudG9TdHJpbmcoKSk7CiAgICAgIH0KICAgICAgZ2V0UXVlcnlQYXJhbShxdWVyeVBhcmFtTmFtZSkgewogICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gdGhpcy5nZXRBbGxBc09iamVjdCgpOwogICAgICAgIHJldHVybiBxdWVyeVBhcmFtc1txdWVyeVBhcmFtTmFtZV07CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJvdXRlckAxLjMuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyb3V0ZXIvZGlzdF90cy9zbWFydHJvdXRlci5jbGFzc2VzLnNtYXJ0cm91dGVyLmpzCnZhciByb3V0ZUxvZywgU21hcnRSb3V0ZXI7CnZhciBpbml0X3NtYXJ0cm91dGVyX2NsYXNzZXNfc21hcnRyb3V0ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJvdXRlckAxLjMuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyb3V0ZXIvZGlzdF90cy9zbWFydHJvdXRlci5jbGFzc2VzLnNtYXJ0cm91dGVyLmpzIigpIHsKICAgIGluaXRfc21hcnRyb3V0ZXJfcGx1Z2lucygpOwogICAgaW5pdF9zbWFydHJvdXRlcl9jbGFzc2VzX3F1ZXJ5cGFyYW1zKCk7CiAgICByb3V0ZUxvZyA9IChtZXNzYWdlMikgPT4gewogICAgICBjb25zb2xlLmxvZyhgJWNbUm91dGVyXSVjICR7bWVzc2FnZTJ9YCwgImNvbG9yOiByZ2IoMjU1LCAxMDUsIDEwMCk7IiwgImNvbG9yOiBpbmhlcml0Iik7CiAgICB9OwogICAgU21hcnRSb3V0ZXIgPSBjbGFzcyBfU21hcnRSb3V0ZXIgewogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSb3V0ZXIuCiAgICAgICAqLwogICAgICBjb25zdHJ1Y3RvcihvcHRpb25zQXJnLCBiYXNlUGF0aCA9ICIiKSB7CiAgICAgICAgdGhpcy5vcHRpb25zID0gewogICAgICAgICAgZGVidWc6IGZhbHNlCiAgICAgICAgfTsKICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zID0gbmV3IFF1ZXJ5UGFyYW1zKCk7CiAgICAgICAgdGhpcy5yb3V0ZXMgPSBbXTsKICAgICAgICB0aGlzLm9wdGlvbnMgPSB7CiAgICAgICAgICAuLi50aGlzLm9wdGlvbnMsCiAgICAgICAgICAuLi5vcHRpb25zQXJnCiAgICAgICAgfTsKICAgICAgICB0aGlzLmJhc2VQYXRoID0gYmFzZVBhdGg7CiAgICAgICAgdGhpcy5wb3BzdGF0ZUxpc3RlbmVyID0gKHBvcFN0YXRlRXZlbnRBcmcpID0+IHsKICAgICAgICAgIHBvcFN0YXRlRXZlbnRBcmcucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuX2hhbmRsZVJvdXRlU3RhdGUoKTsKICAgICAgICB9OwogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb3BzdGF0ZSIsIHRoaXMucG9wc3RhdGVMaXN0ZW5lcik7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIENyZWF0ZSBhIHN1Yi1yb3V0ZXIgd2l0aCBhIHNwZWNpZmljIHByZWZpeAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3ViUGF0aAogICAgICAgKiBAcGFyYW0ge0lSb3V0ZXJPcHRpb25zfSBbb3B0aW9uc10KICAgICAgICovCiAgICAgIGNyZWF0ZVN1YlJvdXRlcihzdWJQYXRoLCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgbmV3QmFzZVBhdGggPSBgJHt0aGlzLmJhc2VQYXRofSR7c3ViUGF0aH1gOwogICAgICAgIHJldHVybiBuZXcgX1NtYXJ0Um91dGVyKHsgLi4udGhpcy5vcHRpb25zLCAuLi5vcHRpb25zIH0sIG5ld0Jhc2VQYXRoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogUHVzaCByb3V0ZSBzdGF0ZSB0byBoaXN0b3J5IHN0YWNrCiAgICAgICAqLwogICAgICBhc3luYyBwdXNoVXJsKHVybCA9ICIvIiwgc3RhdGUxMCA9IHt9KSB7CiAgICAgICAgY29uc3QgZnVsbFVybCA9IGAke3RoaXMuYmFzZVBhdGh9JHt1cmx9YDsKICAgICAgICBpZiAoZnVsbFVybCAhPT0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKSB7CiAgICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoc3RhdGUxMCwgd2luZG93LmRvY3VtZW50LnRpdGxlLCBmdWxsVXJsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHN0YXRlMTAsIHdpbmRvdy5kb2N1bWVudC50aXRsZSwgZnVsbFVybCk7CiAgICAgICAgfQogICAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZVJvdXRlU3RhdGUoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQXR0YWNoIHJvdXRlIHdpdGggaGFuZGxlcgogICAgICAgKiBAcGFyYW0ge3N0cmluZ3xSZWdFeHB9IHJvdXRlQXJnCiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGhhbmRsZXJBcmcKICAgICAgICovCiAgICAgIG9uKHJvdXRlQXJnLCBoYW5kbGVyQXJnKSB7CiAgICAgICAgY29uc3QgZnVsbFJvdXRlID0gYCR7dGhpcy5iYXNlUGF0aH0ke3JvdXRlQXJnfWA7CiAgICAgICAgY29uc3Qgcm91dGVPYmplY3QgPSB7CiAgICAgICAgICBtYXRjaEZ1bmN0aW9uOiBwYXRoVG9SZWdFeHAubWF0Y2goZnVsbFJvdXRlKSwKICAgICAgICAgIGhhbmRsZXI6IGhhbmRsZXJBcmcKICAgICAgICB9OwogICAgICAgIHRoaXMucm91dGVzLnB1c2gocm91dGVPYmplY3QpOwogICAgICAgIGNvbnN0IHJlbW92ZUZ1bmN0aW9uID0gKCkgPT4gewogICAgICAgICAgdGhpcy5yb3V0ZXMuc3BsaWNlKHRoaXMucm91dGVzLmluZGV4T2Yocm91dGVPYmplY3QpLCAxKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiByZW1vdmVGdW5jdGlvbjsKICAgICAgfQogICAgICAvKioKICAgICAgICogQXBwbHkgcm91dGVzIGhhbmRsZXIgdG8gY3VycmVudCByb3V0ZQogICAgICAgKi8KICAgICAgYXN5bmMgX2hhbmRsZVJvdXRlU3RhdGUoKSB7CiAgICAgICAgY29uc3QgY3VycmVudExvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lOwogICAgICAgIGNvbnN0IHdhbnRlZFJvdXRlcyA9IHRoaXMucm91dGVzLmZpbHRlcigocm91dGVBcmcpID0+IHsKICAgICAgICAgIHJldHVybiAhIXJvdXRlQXJnLm1hdGNoRnVuY3Rpb24oY3VycmVudExvY2F0aW9uKTsKICAgICAgICB9KTsKICAgICAgICBmb3IgKGNvbnN0IHdhbnRlZFJvdXRlIG9mIHdhbnRlZFJvdXRlcykgewogICAgICAgICAgY29uc3Qgcm91dGVSZXN1bHQgPSB3YW50ZWRSb3V0ZS5tYXRjaEZ1bmN0aW9uKGN1cnJlbnRMb2NhdGlvbik7CiAgICAgICAgICB3YW50ZWRSb3V0ZS5oYW5kbGVyKHsKICAgICAgICAgICAgLi4ucm91dGVSZXN1bHQudmFsdWVPZigpLAogICAgICAgICAgICBxdWVyeVBhcmFtczogdGhpcy5xdWVyeVBhcmFtcy5nZXRBbGxBc09iamVjdCgpCiAgICAgICAgICAgIC8vIFRPRE8gY2hlY2sgd2V0aGVyIGVudHJpZXMgaXMgc3VwcG9ydGVkIGluIHR5cGluZ3MKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogRGVzdHJveSB0aGUgcm91dGVyIGluc3RhbmNlLCByZW1vdmluZyBhbGwgZXh0ZXJuYWwgcmVmZXJlbmNlcwogICAgICAgKi8KICAgICAgZGVzdHJveSgpIHsKICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLCB0aGlzLnBvcHN0YXRlTGlzdGVuZXIpOwogICAgICAgIHRoaXMucm91dGVzID0gW107CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHJvdXRlckAxLjMuMy9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRyb3V0ZXIvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMjIgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMjIsIHsKICBTbWFydFJvdXRlcjogKCkgPT4gU21hcnRSb3V0ZXIKfSk7CnZhciBpbml0X2Rpc3RfdHMyMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0cm91dGVyQDEuMy4zL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHJvdXRlci9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfc21hcnRyb3V0ZXJfY2xhc3Nlc19zbWFydHJvdXRlcigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRoYXNoQDMuMi42L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGhhc2gvZGlzdF90c193ZWIvcGx1Z2lucy5qcwp2YXIgaW5pdF9wbHVnaW5zMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0aGFzaEAzLjIuNi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRoYXNoL2Rpc3RfdHNfd2ViL3BsdWdpbnMuanMiKCkgewogICAgaW5pdF9kaXN0X3RzMTUoKTsKICAgIGluaXRfZGlzdF90czE2KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydGhhc2hAMy4yLjYvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0aGFzaC9kaXN0X3RzX3dlYi9zaGEyNTYuZmFsbGJhY2suanMKZnVuY3Rpb24gcm90cihuMTMsIGI2KSB7CiAgcmV0dXJuIG4xMyA+Pj4gYjYgfCBuMTMgPDwgMzIgLSBiNjsKfQpmdW5jdGlvbiBzaGEyNTZUcmFuc2Zvcm0oVzMsIEgzKSB7CiAgbGV0IGE1ID0gSDNbMF07CiAgbGV0IGI2ID0gSDNbMV07CiAgbGV0IGMxMSA9IEgzWzJdOwogIGxldCBkNiA9IEgzWzNdOwogIGxldCBlMTEgPSBIM1s0XTsKICBsZXQgZjggPSBIM1s1XTsKICBsZXQgZzUgPSBIM1s2XTsKICBsZXQgaDkgPSBIM1s3XTsKICBmb3IgKGxldCBqNCA9IDA7IGo0IDwgNjQ7IGo0KyspIHsKICAgIGlmIChqNCA+PSAxNikgewogICAgICBjb25zdCBzMCA9IHJvdHIoVzNbajQgLSAxNV0sIDcpIF4gcm90cihXM1tqNCAtIDE1XSwgMTgpIF4gVzNbajQgLSAxNV0gPj4+IDM7CiAgICAgIGNvbnN0IHMxID0gcm90cihXM1tqNCAtIDJdLCAxNykgXiByb3RyKFczW2o0IC0gMl0sIDE5KSBeIFczW2o0IC0gMl0gPj4+IDEwOwogICAgICBXM1tqNF0gPSBXM1tqNCAtIDE2XSArIHMwICsgVzNbajQgLSA3XSArIHMxID4+PiAwOwogICAgfQogICAgY29uc3QgUzEgPSByb3RyKGUxMSwgNikgXiByb3RyKGUxMSwgMTEpIF4gcm90cihlMTEsIDI1KTsKICAgIGNvbnN0IGNoID0gZTExICYgZjggXiB+ZTExICYgZzU7CiAgICBjb25zdCB0ZW1wMSA9IGg5ICsgUzEgKyBjaCArIEtbajRdICsgVzNbajRdID4+PiAwOwogICAgY29uc3QgUzAgPSByb3RyKGE1LCAyKSBeIHJvdHIoYTUsIDEzKSBeIHJvdHIoYTUsIDIyKTsKICAgIGNvbnN0IG1haiA9IGE1ICYgYjYgXiBhNSAmIGMxMSBeIGI2ICYgYzExOwogICAgY29uc3QgdGVtcDIgPSBTMCArIG1haiA+Pj4gMDsKICAgIGg5ID0gZzU7CiAgICBnNSA9IGY4OwogICAgZjggPSBlMTE7CiAgICBlMTEgPSBkNiArIHRlbXAxID4+PiAwOwogICAgZDYgPSBjMTE7CiAgICBjMTEgPSBiNjsKICAgIGI2ID0gYTU7CiAgICBhNSA9IHRlbXAxICsgdGVtcDIgPj4+IDA7CiAgfQogIEgzWzBdID0gSDNbMF0gKyBhNSA+Pj4gMDsKICBIM1sxXSA9IEgzWzFdICsgYjYgPj4+IDA7CiAgSDNbMl0gPSBIM1syXSArIGMxMSA+Pj4gMDsKICBIM1szXSA9IEgzWzNdICsgZDYgPj4+IDA7CiAgSDNbNF0gPSBIM1s0XSArIGUxMSA+Pj4gMDsKICBIM1s1XSA9IEgzWzVdICsgZjggPj4+IDA7CiAgSDNbNl0gPSBIM1s2XSArIGc1ID4+PiAwOwogIEgzWzddID0gSDNbN10gKyBoOSA+Pj4gMDsKfQpmdW5jdGlvbiBzaGEyNTZGYWxsYmFjayhieXRlcykgewogIGNvbnN0IEhfY29weSA9IFsuLi5IMl07CiAgY29uc3QgbXNnTGVuID0gYnl0ZXMubGVuZ3RoOwogIGNvbnN0IG1zZ0JpdExlbiA9IG1zZ0xlbiAqIDg7CiAgY29uc3QgcGFkTGVuID0gbXNnTGVuICUgNjQgPCA1NiA/IDU2IC0gbXNnTGVuICUgNjQgOiAxMjAgLSBtc2dMZW4gJSA2NDsKICBjb25zdCBwYWRkZWQgPSBuZXcgVWludDhBcnJheShtc2dMZW4gKyBwYWRMZW4gKyA4KTsKICBwYWRkZWQuc2V0KGJ5dGVzKTsKICBwYWRkZWRbbXNnTGVuXSA9IDEyODsKICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhwYWRkZWQuYnVmZmVyKTsKICBkYXRhVmlldy5zZXRVaW50MzIocGFkZGVkLmxlbmd0aCAtIDgsIDAsIGZhbHNlKTsKICBkYXRhVmlldy5zZXRVaW50MzIocGFkZGVkLmxlbmd0aCAtIDQsIG1zZ0JpdExlbiA+Pj4gMCwgZmFsc2UpOwogIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IHBhZGRlZC5sZW5ndGg7IG9mZnNldCArPSA2NCkgewogICAgY29uc3QgVzMgPSBuZXcgQXJyYXkoNjQpOwogICAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgMTY7IGkxMSsrKSB7CiAgICAgIFczW2kxMV0gPSBkYXRhVmlldy5nZXRVaW50MzIob2Zmc2V0ICsgaTExICogNCwgZmFsc2UpOwogICAgfQogICAgc2hhMjU2VHJhbnNmb3JtKFczLCBIX2NvcHkpOwogIH0KICBsZXQgaGV4MyA9ICIiOwogIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IDg7IGkxMSsrKSB7CiAgICBoZXgzICs9IEhfY29weVtpMTFdLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCAiMCIpOwogIH0KICByZXR1cm4gaGV4MzsKfQp2YXIgSywgSDI7CnZhciBpbml0X3NoYTI1Nl9mYWxsYmFjayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0aGFzaEAzLjIuNi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRoYXNoL2Rpc3RfdHNfd2ViL3NoYTI1Ni5mYWxsYmFjay5qcyIoKSB7CiAgICBLID0gWwogICAgICAxMTE2MzUyNDA4LAogICAgICAxODk5NDQ3NDQxLAogICAgICAzMDQ5MzIzNDcxLAogICAgICAzOTIxMDA5NTczLAogICAgICA5NjE5ODcxNjMsCiAgICAgIDE1MDg5NzA5OTMsCiAgICAgIDI0NTM2MzU3NDgsCiAgICAgIDI4NzA3NjMyMjEsCiAgICAgIDM2MjQzODEwODAsCiAgICAgIDMxMDU5ODQwMSwKICAgICAgNjA3MjI1Mjc4LAogICAgICAxNDI2ODgxOTg3LAogICAgICAxOTI1MDc4Mzg4LAogICAgICAyMTYyMDc4MjA2LAogICAgICAyNjE0ODg4MTAzLAogICAgICAzMjQ4MjIyNTgwLAogICAgICAzODM1MzkwNDAxLAogICAgICA0MDIyMjI0Nzc0LAogICAgICAyNjQzNDcwNzgsCiAgICAgIDYwNDgwNzYyOCwKICAgICAgNzcwMjU1OTgzLAogICAgICAxMjQ5MTUwMTIyLAogICAgICAxNTU1MDgxNjkyLAogICAgICAxOTk2MDY0OTg2LAogICAgICAyNTU0MjIwODgyLAogICAgICAyODIxODM0MzQ5LAogICAgICAyOTUyOTk2ODA4LAogICAgICAzMjEwMzEzNjcxLAogICAgICAzMzM2NTcxODkxLAogICAgICAzNTg0NTI4NzExLAogICAgICAxMTM5MjY5OTMsCiAgICAgIDMzODI0MTg5NSwKICAgICAgNjY2MzA3MjA1LAogICAgICA3NzM1Mjk5MTIsCiAgICAgIDEyOTQ3NTczNzIsCiAgICAgIDEzOTYxODIyOTEsCiAgICAgIDE2OTUxODM3MDAsCiAgICAgIDE5ODY2NjEwNTEsCiAgICAgIDIxNzcwMjYzNTAsCiAgICAgIDI0NTY5NTYwMzcsCiAgICAgIDI3MzA0ODU5MjEsCiAgICAgIDI4MjAzMDI0MTEsCiAgICAgIDMyNTk3MzA4MDAsCiAgICAgIDMzNDU3NjQ3NzEsCiAgICAgIDM1MTYwNjU4MTcsCiAgICAgIDM2MDAzNTI4MDQsCiAgICAgIDQwOTQ1NzE5MDksCiAgICAgIDI3NTQyMzM0NCwKICAgICAgNDMwMjI3NzM0LAogICAgICA1MDY5NDg2MTYsCiAgICAgIDY1OTA2MDU1NiwKICAgICAgODgzOTk3ODc3LAogICAgICA5NTgxMzk1NzEsCiAgICAgIDEzMjI4MjIyMTgsCiAgICAgIDE1MzcwMDIwNjMsCiAgICAgIDE3NDc4NzM3NzksCiAgICAgIDE5NTU1NjIyMjIsCiAgICAgIDIwMjQxMDQ4MTUsCiAgICAgIDIyMjc3MzA0NTIsCiAgICAgIDIzNjE4NTI0MjQsCiAgICAgIDI0Mjg0MzY0NzQsCiAgICAgIDI3NTY3MzQxODcsCiAgICAgIDMyMDQwMzE0NzksCiAgICAgIDMzMjkzMjUyOTgKICAgIF07CiAgICBIMiA9IFsKICAgICAgMTc3OTAzMzcwMywKICAgICAgMzE0NDEzNDI3NywKICAgICAgMTAxMzkwNDI0MiwKICAgICAgMjc3MzQ4MDc2MiwKICAgICAgMTM1OTg5MzExOSwKICAgICAgMjYwMDgyMjkyNCwKICAgICAgNTI4NzM0NjM1LAogICAgICAxNTQxNDU5MjI1CiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRoYXNoQDMuMi42L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydGhhc2gvZGlzdF90c193ZWIvaW5kZXguanMKdmFyIGRpc3RfdHNfd2ViX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoZGlzdF90c193ZWJfZXhwb3J0cywgewogIG1kNUZyb21TdHJpbmc6ICgpID0+IG1kNUZyb21TdHJpbmcsCiAgc2hhMjU2RnJvbUJ1ZmZlcjogKCkgPT4gc2hhMjU2RnJvbUJ1ZmZlciwKICBzaGEyNTZGcm9tRmlsZTogKCkgPT4gc2hhMjU2RnJvbUZpbGUsCiAgc2hhMjU2RnJvbVN0cmVhbTogKCkgPT4gc2hhMjU2RnJvbVN0cmVhbSwKICBzaGEyNTZGcm9tU3RyaW5nOiAoKSA9PiBzaGEyNTZGcm9tU3RyaW5nLAogIHNoYTI1NkZyb21TdHJpbmdTeW5jOiAoKSA9PiBzaGEyNTZGcm9tU3RyaW5nU3luYywKICBzaGEyNjVGcm9tT2JqZWN0OiAoKSA9PiBzaGEyNjVGcm9tT2JqZWN0Cn0pOwp2YXIgaGV4LCBpc0NyeXB0b1N1YnRsZUF2YWlsYWJsZSwgc2hhMjU2RnJvbVN0cmluZywgc2hhMjU2RnJvbVN0cmluZ1N5bmMsIHNoYTI1NkZyb21CdWZmZXIsIHNoYTI2NUZyb21PYmplY3QsIHNoYTI1NkZyb21TdHJlYW0sIHNoYTI1NkZyb21GaWxlLCBtZDVGcm9tU3RyaW5nOwp2YXIgaW5pdF9kaXN0X3RzX3dlYiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0aGFzaEAzLjIuNi9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRoYXNoL2Rpc3RfdHNfd2ViL2luZGV4LmpzIigpIHsKICAgIGluaXRfcGx1Z2luczIoKTsKICAgIGluaXRfc2hhMjU2X2ZhbGxiYWNrKCk7CiAgICBoZXggPSAoYnVmZmVyMikgPT4gewogICAgICBjb25zdCBoZXhDb2RlcyA9IFtdOwogICAgICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcjIpOwogICAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCB2aWV3LmJ5dGVMZW5ndGg7IGkxMSArPSA0KSB7CiAgICAgICAgY29uc3QgdmFsdWUyID0gdmlldy5nZXRVaW50MzIoaTExKTsKICAgICAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IHZhbHVlMi50b1N0cmluZygxNik7CiAgICAgICAgY29uc3QgcGFkZGluZyA9ICIwMDAwMDAwMCI7CiAgICAgICAgY29uc3QgcGFkZGVkVmFsdWUgPSAocGFkZGluZyArIHN0cmluZ1ZhbHVlKS5zbGljZSgtcGFkZGluZy5sZW5ndGgpOwogICAgICAgIGhleENvZGVzLnB1c2gocGFkZGVkVmFsdWUpOwogICAgICB9CiAgICAgIHJldHVybiBoZXhDb2Rlcy5qb2luKCIiKTsKICAgIH07CiAgICBpc0NyeXB0b1N1YnRsZUF2YWlsYWJsZSA9ICgpID0+IHsKICAgICAgcmV0dXJuIHR5cGVvZiBjcnlwdG8gIT09ICJ1bmRlZmluZWQiICYmIGNyeXB0by5zdWJ0bGUgIT09IHZvaWQgMDsKICAgIH07CiAgICBzaGEyNTZGcm9tU3RyaW5nID0gYXN5bmMgKHN0cmluZ0FyZykgPT4gewogICAgICBjb25zdCBidWZmZXIyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHN0cmluZ0FyZyk7CiAgICAgIGlmIChpc0NyeXB0b1N1YnRsZUF2YWlsYWJsZSgpKSB7CiAgICAgICAgY29uc3QgaGFzaCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCJTSEEtMjU2IiwgYnVmZmVyMik7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gaGV4KGhhc2gpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHNoYTI1NkZhbGxiYWNrKGJ1ZmZlcjIpOwogICAgICB9CiAgICB9OwogICAgc2hhMjU2RnJvbVN0cmluZ1N5bmMgPSAoc3RyaW5nQXJnKSA9PiB7CiAgICAgIGNvbnNvbGUud2Fybigic2hhMjU2RnJvbVN0cmluZ1N5bmMgaXMgbm90IHRydWx5IHN5bmNocm9ub3VzIGluIGJyb3dzZXIgZW52aXJvbm1lbnQiKTsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJzaGEyNTZGcm9tU3RyaW5nU3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGJyb3dzZXIgZW52aXJvbm1lbnQuIFVzZSBzaGEyNTZGcm9tU3RyaW5nIGluc3RlYWQuIik7CiAgICB9OwogICAgc2hhMjU2RnJvbUJ1ZmZlciA9IGFzeW5jIChidWZmZXJBcmcpID0+IHsKICAgICAgaWYgKGlzQ3J5cHRvU3VidGxlQXZhaWxhYmxlKCkpIHsKICAgICAgICBsZXQgaW5wdXRCdWZmZXI7CiAgICAgICAgaWYgKGJ1ZmZlckFyZyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKICAgICAgICAgIGNvbnN0IHZpZXcgPSBidWZmZXJBcmc7CiAgICAgICAgICBpbnB1dEJ1ZmZlciA9IHZpZXcuYnVmZmVyLnNsaWNlKHZpZXcuYnl0ZU9mZnNldCwgdmlldy5ieXRlT2Zmc2V0ICsgdmlldy5ieXRlTGVuZ3RoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5wdXRCdWZmZXIgPSBidWZmZXJBcmc7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGhhc2ggPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdCgiU0hBLTI1NiIsIGlucHV0QnVmZmVyKTsKICAgICAgICBjb25zdCByZXN1bHQgPSBoZXgoaGFzaCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCB1aW50OEFycmF5ID0gYnVmZmVyQXJnIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGJ1ZmZlckFyZyA6IG5ldyBVaW50OEFycmF5KGJ1ZmZlckFyZyk7CiAgICAgICAgcmV0dXJuIHNoYTI1NkZhbGxiYWNrKHVpbnQ4QXJyYXkpOwogICAgICB9CiAgICB9OwogICAgc2hhMjY1RnJvbU9iamVjdCA9IGFzeW5jIChvYmplY3RBcmcpID0+IHsKICAgICAgY29uc3Qgc3RyaW5naWZpZWRPYmplY3QgPSBkaXN0X3RzX2V4cG9ydHMxNi5zdHJpbmdpZnkob2JqZWN0QXJnKTsKICAgICAgY29uc3QgaGFzaFJlc3VsdCA9IGF3YWl0IHNoYTI1NkZyb21TdHJpbmcoc3RyaW5naWZpZWRPYmplY3QpOwogICAgICByZXR1cm4gaGFzaFJlc3VsdDsKICAgIH07CiAgICBzaGEyNTZGcm9tU3RyZWFtID0gKGlucHV0KSA9PiB7CiAgICAgIHRocm93IG5ldyBFcnJvcigic2hhMjU2RnJvbVN0cmVhbSBpcyBub3Qgc3VwcG9ydGVkIGluIGJyb3dzZXIgZW52aXJvbm1lbnQiKTsKICAgIH07CiAgICBzaGEyNTZGcm9tRmlsZSA9IGFzeW5jIChmaWxlUGF0aCkgPT4gewogICAgICB0aHJvdyBuZXcgRXJyb3IoInNoYTI1NkZyb21GaWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlciBlbnZpcm9ubWVudCIpOwogICAgfTsKICAgIG1kNUZyb21TdHJpbmcgPSBhc3luYyAoc3RyaW5nVG9IYXNoKSA9PiB7CiAgICAgIHRocm93IG5ldyBFcnJvcigibWQ1RnJvbVN0cmluZyBpcyBub3Qgc3VwcG9ydGVkIGluIGJyb3dzZXIgZW52aXJvbm1lbnQuIFdlYiBDcnlwdG8gQVBJIGRvZXMgbm90IHN1cHBvcnQgTUQ1LiIpOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RhdGVAMi4yLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RhdGUvZGlzdF90cy9zbWFydHN0YXRlLnBsdWdpbnMuanMKdmFyIGluaXRfc21hcnRzdGF0ZV9wbHVnaW5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdGF0ZUAyLjIuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdGF0ZS9kaXN0X3RzL3NtYXJ0c3RhdGUucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHNfd2ViKCk7CiAgICBpbml0X2Rpc3RfdHMxNCgpOwogICAgaW5pdF9kaXN0X3RzKCk7CiAgICBpbml0X2Rpc3RfdHMyKCk7CiAgICBpbml0X2Rpc3RfdHMxNygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdGF0ZUAyLjIuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdGF0ZS9kaXN0X3RzL3NtYXJ0c3RhdGUuY2xhc3Nlcy5zdGF0ZWFjdGlvbi5qcwp2YXIgU3RhdGVBY3Rpb247CnZhciBpbml0X3NtYXJ0c3RhdGVfY2xhc3Nlc19zdGF0ZWFjdGlvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RhdGVAMi4yLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RhdGUvZGlzdF90cy9zbWFydHN0YXRlLmNsYXNzZXMuc3RhdGVhY3Rpb24uanMiKCkgewogICAgaW5pdF9zbWFydHN0YXRlX2NsYXNzZXNfc3RhdGVwYXJ0KCk7CiAgICBTdGF0ZUFjdGlvbiA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3Ioc3RhdGVQYXJ0UmVmLCBhY3Rpb25EZWYpIHsKICAgICAgICB0aGlzLnN0YXRlUGFydFJlZiA9IHN0YXRlUGFydFJlZjsKICAgICAgICB0aGlzLmFjdGlvbkRlZiA9IGFjdGlvbkRlZjsKICAgICAgfQogICAgICB0cmlnZ2VyKHBheWxvYWQpIHsKICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZVBhcnRSZWYuZGlzcGF0Y2hBY3Rpb24odGhpcywgcGF5bG9hZCk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0YXRlQDIuMi4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0YXRlL2Rpc3RfdHMvc21hcnRzdGF0ZS5jbGFzc2VzLnN0YXRlcGFydC5qcwpmdW5jdGlvbiBmcm9tQWJvcnRTaWduYWwoc2lnbmFsKSB7CiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyKSA9PiB7CiAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHsKICAgICAgc3Vic2NyaWJlci5uZXh0KCk7CiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgaGFuZGxlcjIgPSAoKSA9PiB7CiAgICAgIHN1YnNjcmliZXIubmV4dCgpOwogICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9OwogICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IiwgaGFuZGxlcjIpOwogICAgcmV0dXJuICgpID0+IHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsIGhhbmRsZXIyKTsKICB9KTsKfQp2YXIgU3RhdGVQYXJ0Owp2YXIgaW5pdF9zbWFydHN0YXRlX2NsYXNzZXNfc3RhdGVwYXJ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdGF0ZUAyLjIuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdGF0ZS9kaXN0X3RzL3NtYXJ0c3RhdGUuY2xhc3Nlcy5zdGF0ZXBhcnQuanMiKCkgewogICAgaW5pdF9zbWFydHN0YXRlX3BsdWdpbnMoKTsKICAgIGluaXRfZXNtNSgpOwogICAgaW5pdF9zbWFydHN0YXRlX2NsYXNzZXNfc3RhdGVhY3Rpb24oKTsKICAgIFN0YXRlUGFydCA9IGNsYXNzIF9TdGF0ZVBhcnQgewogICAgICBzdGF0aWMgewogICAgICAgIHRoaXMuTUFYX05FU1RFRF9ESVNQQVRDSF9ERVBUSCA9IDEwOwogICAgICB9CiAgICAgIGNvbnN0cnVjdG9yKG5hbWVBcmcsIHdlYlN0b3JlT3B0aW9uc0FyZykgewogICAgICAgIHRoaXMuc3RhdGUgPSBuZXcgZGlzdF90c19leHBvcnRzMi5yeGpzLlN1YmplY3QoKTsKICAgICAgICB0aGlzLmN1bXVsYXRpdmVEZWZlcnJlZCA9IGRpc3RfdHNfZXhwb3J0cy5jdW11bGF0aXZlRGVmZXIoKTsKICAgICAgICB0aGlzLm11dGF0aW9uUXVldWUgPSBQcm9taXNlLnJlc29sdmUoKTsKICAgICAgICB0aGlzLnBlbmRpbmdDdW11bGF0aXZlTm90aWZpY2F0aW9uID0gbnVsbDsKICAgICAgICB0aGlzLndlYlN0b3JlID0gbnVsbDsKICAgICAgICB0aGlzLm1pZGRsZXdhcmVzID0gW107CiAgICAgICAgdGhpcy5zZWxlY3RvckNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CiAgICAgICAgdGhpcy5kZWZhdWx0U2VsZWN0T2JzZXJ2YWJsZSA9IG51bGw7CiAgICAgICAgdGhpcy5uYW1lID0gbmFtZUFyZzsKICAgICAgICBpZiAod2ViU3RvcmVPcHRpb25zQXJnKSB7CiAgICAgICAgICB0aGlzLndlYlN0b3JlT3B0aW9ucyA9IHdlYlN0b3JlT3B0aW9uc0FyZzsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGluaXRpYWxpemVzIHRoZSB3ZWJzdG9yZQogICAgICAgKi8KICAgICAgYXN5bmMgaW5pdCgpIHsKICAgICAgICBpZiAodGhpcy53ZWJTdG9yZU9wdGlvbnMpIHsKICAgICAgICAgIHRoaXMud2ViU3RvcmUgPSBuZXcgZGlzdF90c19leHBvcnRzMTcuV2ViU3RvcmUodGhpcy53ZWJTdG9yZU9wdGlvbnMpOwogICAgICAgICAgYXdhaXQgdGhpcy53ZWJTdG9yZS5pbml0KCk7CiAgICAgICAgICBjb25zdCBzdG9yZWRTdGF0ZSA9IGF3YWl0IHRoaXMud2ViU3RvcmUuZ2V0KFN0cmluZyh0aGlzLm5hbWUpKTsKICAgICAgICAgIGlmIChzdG9yZWRTdGF0ZSAmJiB0aGlzLnZhbGlkYXRlU3RhdGUoc3RvcmVkU3RhdGUpKSB7CiAgICAgICAgICAgIHRoaXMuc3RhdGVTdG9yZSA9IHN0b3JlZFN0YXRlOwogICAgICAgICAgICBhd2FpdCB0aGlzLm5vdGlmeUNoYW5nZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogZ2V0cyB0aGUgc3RhdGUgZnJvbSB0aGUgc3RhdGUgc3RvcmUKICAgICAgICovCiAgICAgIGdldFN0YXRlKCkgewogICAgICAgIHJldHVybiB0aGlzLnN0YXRlU3RvcmU7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGFkZHMgYSBtaWRkbGV3YXJlIHRoYXQgaW50ZXJjZXB0cyBzZXRTdGF0ZSBjYWxscy4KICAgICAgICogbWlkZGxld2FyZSBjYW4gdHJhbnNmb3JtIHRoZSBzdGF0ZSBvciB0aHJvdyB0byByZWplY3QgaXQuCiAgICAgICAqIHJldHVybnMgYSByZW1vdmFsIGZ1bmN0aW9uLgogICAgICAgKi8KICAgICAgYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlKSB7CiAgICAgICAgdGhpcy5taWRkbGV3YXJlcy5wdXNoKG1pZGRsZXdhcmUpOwogICAgICAgIHJldHVybiAoKSA9PiB7CiAgICAgICAgICBjb25zdCBpZHggPSB0aGlzLm1pZGRsZXdhcmVzLmluZGV4T2YobWlkZGxld2FyZSk7CiAgICAgICAgICBpZiAoaWR4ICE9PSAtMSkgewogICAgICAgICAgICB0aGlzLm1pZGRsZXdhcmVzLnNwbGljZShpZHgsIDEpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHNldHMgdGhlIHN0YXRlU3RvcmUgdG8gdGhlIG5ldyBzdGF0ZSAoc2VyaWFsaXplZCB2aWEgbXV0YXRpb24gcXVldWUpCiAgICAgICAqLwogICAgICBhc3luYyBzZXRTdGF0ZShuZXdTdGF0ZUFyZykgewogICAgICAgIHJldHVybiB0aGlzLm11dGF0aW9uUXVldWUgPSB0aGlzLm11dGF0aW9uUXVldWUudGhlbigoKSA9PiB0aGlzLmFwcGx5U3RhdGUobmV3U3RhdGVBcmcpLCAoKSA9PiB0aGlzLmFwcGx5U3RhdGUobmV3U3RhdGVBcmcpKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogYXBwbGllcyB0aGUgc3RhdGUgY2hhbmdlIChtaWRkbGV3YXJlIOKGkiB2YWxpZGF0ZSDihpIgcGVyc2lzdCDihpIgbm90aWZ5KQogICAgICAgKi8KICAgICAgYXN5bmMgYXBwbHlTdGF0ZShuZXdTdGF0ZUFyZykgewogICAgICAgIGxldCBwcm9jZXNzZWRTdGF0ZSA9IG5ld1N0YXRlQXJnOwogICAgICAgIGZvciAoY29uc3QgbXcgb2YgdGhpcy5taWRkbGV3YXJlcykgewogICAgICAgICAgcHJvY2Vzc2VkU3RhdGUgPSBhd2FpdCBtdyhwcm9jZXNzZWRTdGF0ZSwgdGhpcy5zdGF0ZVN0b3JlKTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlU3RhdGUocHJvY2Vzc2VkU3RhdGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3RhdGUgc3RydWN0dXJlIGZvciBzdGF0ZSBwYXJ0ICcke3RoaXMubmFtZX0nYCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLndlYlN0b3JlKSB7CiAgICAgICAgICBhd2FpdCB0aGlzLndlYlN0b3JlLnNldChTdHJpbmcodGhpcy5uYW1lKSwgcHJvY2Vzc2VkU3RhdGUpOwogICAgICAgIH0KICAgICAgICB0aGlzLnN0YXRlU3RvcmUgPSBwcm9jZXNzZWRTdGF0ZTsKICAgICAgICBhd2FpdCB0aGlzLm5vdGlmeUNoYW5nZSgpOwogICAgICAgIHJldHVybiB0aGlzLnN0YXRlU3RvcmU7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFZhbGlkYXRlcyBzdGF0ZSBzdHJ1Y3R1cmUgLSBjYW4gYmUgb3ZlcnJpZGRlbiBmb3IgY3VzdG9tIHZhbGlkYXRpb24KICAgICAgICovCiAgICAgIHZhbGlkYXRlU3RhdGUoc3RhdGVBcmcpIHsKICAgICAgICByZXR1cm4gc3RhdGVBcmcgIT09IG51bGwgJiYgc3RhdGVBcmcgIT09IHZvaWQgMDsKICAgICAgfQogICAgICAvKioKICAgICAgICogbm90aWZpZXMgb2YgYSBjaGFuZ2Ugb24gdGhlIHN0YXRlCiAgICAgICAqLwogICAgICBhc3luYyBub3RpZnlDaGFuZ2UoKSB7CiAgICAgICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnN0YXRlU3RvcmU7CiAgICAgICAgaWYgKHNuYXBzaG90ID09PSB2b2lkIDApIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuc21hcnRzdGF0ZVJlZj8uaXNCYXRjaGluZykgewogICAgICAgICAgdGhpcy5zbWFydHN0YXRlUmVmLnJlZ2lzdGVyUGVuZGluZ05vdGlmaWNhdGlvbih0aGlzKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgY3JlYXRlU3RhdGVIYXNoID0gYXN5bmMgKHN0YXRlQXJnKSA9PiB7CiAgICAgICAgICByZXR1cm4gYXdhaXQgZGlzdF90c193ZWJfZXhwb3J0cy5zaGEyNTZGcm9tU3RyaW5nKGRpc3RfdHNfZXhwb3J0czE0LnN0YWJsZU9uZVdheVN0cmluZ2lmeShzdGF0ZUFyZykpOwogICAgICAgIH07CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IGN1cnJlbnRIYXNoID0gYXdhaXQgY3JlYXRlU3RhdGVIYXNoKHNuYXBzaG90KTsKICAgICAgICAgIGlmICh0aGlzLmxhc3RTdGF0ZU5vdGlmaWNhdGlvblBheWxvYWRIYXNoICYmIGN1cnJlbnRIYXNoID09PSB0aGlzLmxhc3RTdGF0ZU5vdGlmaWNhdGlvblBheWxvYWRIYXNoKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMubGFzdFN0YXRlTm90aWZpY2F0aW9uUGF5bG9hZEhhc2ggPSBjdXJyZW50SGFzaDsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFN0YXRlIGhhc2ggY29tcHV0YXRpb24gZmFpbGVkIGZvciAnJHt0aGlzLm5hbWV9JzpgLCBlcnIpOwogICAgICAgIH0KICAgICAgICB0aGlzLnN0YXRlLm5leHQoc25hcHNob3QpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBjcmVhdGVzIGEgY3VtdWxhdGl2ZSBub3RpZmljYXRpb24gYnkgYWRkaW5nIGEgY2hhbmdlIG5vdGlmaWNhdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBjYWxsIHN0YWNrCiAgICAgICAqLwogICAgICBub3RpZnlDaGFuZ2VDdW11bGF0aXZlKCkgewogICAgICAgIGlmICh0aGlzLnBlbmRpbmdDdW11bGF0aXZlTm90aWZpY2F0aW9uKSB7CiAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nQ3VtdWxhdGl2ZU5vdGlmaWNhdGlvbik7CiAgICAgICAgfQogICAgICAgIHRoaXMucGVuZGluZ0N1bXVsYXRpdmVOb3RpZmljYXRpb24gPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgIHRoaXMucGVuZGluZ0N1bXVsYXRpdmVOb3RpZmljYXRpb24gPSBudWxsOwogICAgICAgICAgaWYgKHRoaXMuc3RhdGVTdG9yZSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlKCkuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYG5vdGlmeUNoYW5nZUN1bXVsYXRpdmUgZmFpbGVkIGZvciAnJHt0aGlzLm5hbWV9JzpgLCBlcnIpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9LCAwKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogc2VsZWN0cyBhIHN0YXRlIG9yIGEgc3Vic3RhdGUuCiAgICAgICAqIHN1cHBvcnRzIGFuIG9wdGlvbmFsIEFib3J0U2lnbmFsIGZvciBhdXRvbWF0aWMgdW5zdWJzY3JpcHRpb24uCiAgICAgICAqIG1lbW9pemVzIG9ic2VydmFibGVzIGJ5IHNlbGVjdG9yIGZ1bmN0aW9uIHJlZmVyZW5jZS4KICAgICAgICovCiAgICAgIHNlbGVjdChzZWxlY3RvckZuLCBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgaGFzU2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsICE9IG51bGw7CiAgICAgICAgaWYgKCFoYXNTaWduYWwpIHsKICAgICAgICAgIGlmICghc2VsZWN0b3JGbikgewogICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0U2VsZWN0T2JzZXJ2YWJsZSkgewogICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRTZWxlY3RPYnNlcnZhYmxlOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0b3JDYWNoZS5oYXMoc2VsZWN0b3JGbikpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0b3JDYWNoZS5nZXQoc2VsZWN0b3JGbik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGVmZmVjdGl2ZVNlbGVjdG9yRm4gPSBzZWxlY3RvckZuIHx8ICgoc3RhdGUxMCkgPT4gc3RhdGUxMCk7CiAgICAgICAgbGV0IG1hcHBlZCA9IHRoaXMuc3RhdGUucGlwZShkaXN0X3RzX2V4cG9ydHMyLnJ4anMub3BzLnN0YXJ0V2l0aCh0aGlzLmdldFN0YXRlKCkpLCBkaXN0X3RzX2V4cG9ydHMyLnJ4anMub3BzLmZpbHRlcigoc3RhdGVBcmcpID0+IHN0YXRlQXJnICE9PSB2b2lkIDApLCBkaXN0X3RzX2V4cG9ydHMyLnJ4anMub3BzLm1hcCgoc3RhdGVBcmcpID0+IHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiBlZmZlY3RpdmVTZWxlY3RvckZuKHN0YXRlQXJnKTsKICAgICAgICAgIH0gY2F0Y2ggKGUxMSkgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTZWxlY3RvciBlcnJvciBpbiBzdGF0ZSBwYXJ0ICcke3RoaXMubmFtZX0nOmAsIGUxMSk7CiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIGlmIChoYXNTaWduYWwpIHsKICAgICAgICAgIG1hcHBlZCA9IG1hcHBlZC5waXBlKHRha2VVbnRpbChmcm9tQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwpKSk7CiAgICAgICAgICByZXR1cm4gbWFwcGVkOwogICAgICAgIH0KICAgICAgICBjb25zdCBzaGFyZWQgPSBtYXBwZWQucGlwZShzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pKTsKICAgICAgICBpZiAoIXNlbGVjdG9yRm4pIHsKICAgICAgICAgIHRoaXMuZGVmYXVsdFNlbGVjdE9ic2VydmFibGUgPSBzaGFyZWQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuc2VsZWN0b3JDYWNoZS5zZXQoc2VsZWN0b3JGbiwgc2hhcmVkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNoYXJlZDsKICAgICAgfQogICAgICAvKioKICAgICAgICogY3JlYXRlcyBhbiBhY3Rpb24gY2FwYWJsZSBvZiBtb2RpZnlpbmcgdGhlIHN0YXRlCiAgICAgICAqLwogICAgICBjcmVhdGVBY3Rpb24oYWN0aW9uRGVmKSB7CiAgICAgICAgcmV0dXJuIG5ldyBTdGF0ZUFjdGlvbih0aGlzLCBhY3Rpb25EZWYpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBjcmVhdGVzIGEgZGVwdGgtdHJhY2tlZCBhY3Rpb24gY29udGV4dCBmb3Igc2FmZSBuZXN0ZWQgZGlzcGF0Y2guCiAgICAgICAqIFVzaW5nIGNvbnRleHQuZGlzcGF0Y2goKSB3aXRoaW4gYW4gYWN0aW9uRGVmIGJ5cGFzc2VzIHRoZSBtdXRhdGlvbiBxdWV1ZQogICAgICAgKiBhbmQgZXhlY3V0ZXMgdGhlIHN1Yi1hY3Rpb24gaW5saW5lLCBwcmV2ZW50aW5nIGRlYWRsb2Nrcy4KICAgICAgICovCiAgICAgIGNyZWF0ZUFjdGlvbkNvbnRleHQoZGVwdGgpIHsKICAgICAgICBjb25zdCBzZWxmMiA9IHRoaXM7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGRpc3BhdGNoOiBhc3luYyAoYWN0aW9uLCBwYXlsb2FkKSA9PiB7CiAgICAgICAgICAgIGlmIChkZXB0aCA+PSBfU3RhdGVQYXJ0Lk1BWF9ORVNURURfRElTUEFUQ0hfREVQVEgpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1heGltdW0gbmVzdGVkIGFjdGlvbiBkaXNwYXRjaCBkZXB0aCAoJHtfU3RhdGVQYXJ0Lk1BWF9ORVNURURfRElTUEFUQ0hfREVQVEh9KSBleGNlZWRlZC4gQ2hlY2sgZm9yIGNpcmN1bGFyIGFjdGlvbiBkaXNwYXRjaGVzLmApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGlubmVyQ29udGV4dCA9IHNlbGYyLmNyZWF0ZUFjdGlvbkNvbnRleHQoZGVwdGggKyAxKTsKICAgICAgICAgICAgY29uc3QgbmV3U3RhdGUgPSBhd2FpdCBhY3Rpb24uYWN0aW9uRGVmKHNlbGYyLCBwYXlsb2FkLCBpbm5lckNvbnRleHQpOwogICAgICAgICAgICByZXR1cm4gc2VsZjIuYXBwbHlTdGF0ZShuZXdTdGF0ZSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQogICAgICAvKioKICAgICAgICogZGlzcGF0Y2hlcyBhbiBhY3Rpb24gb24gdGhlIHN0YXRlcGFydCBsZXZlbAogICAgICAgKi8KICAgICAgYXN5bmMgZGlzcGF0Y2hBY3Rpb24oc3RhdGVBY3Rpb24sIGFjdGlvblBheWxvYWQpIHsKICAgICAgICBhd2FpdCB0aGlzLmN1bXVsYXRpdmVEZWZlcnJlZC5wcm9taXNlOwogICAgICAgIHJldHVybiB0aGlzLm11dGF0aW9uUXVldWUgPSB0aGlzLm11dGF0aW9uUXVldWUudGhlbihhc3luYyAoKSA9PiB7CiAgICAgICAgICBjb25zdCBjb250ZXh0MiA9IHRoaXMuY3JlYXRlQWN0aW9uQ29udGV4dCgwKTsKICAgICAgICAgIGNvbnN0IG5ld1N0YXRlID0gYXdhaXQgc3RhdGVBY3Rpb24uYWN0aW9uRGVmKHRoaXMsIGFjdGlvblBheWxvYWQsIGNvbnRleHQyKTsKICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5U3RhdGUobmV3U3RhdGUpOwogICAgICAgIH0sIGFzeW5jICgpID0+IHsKICAgICAgICAgIGNvbnN0IGNvbnRleHQyID0gdGhpcy5jcmVhdGVBY3Rpb25Db250ZXh0KDApOwogICAgICAgICAgY29uc3QgbmV3U3RhdGUgPSBhd2FpdCBzdGF0ZUFjdGlvbi5hY3Rpb25EZWYodGhpcywgYWN0aW9uUGF5bG9hZCwgY29udGV4dDIpOwogICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlTdGF0ZShuZXdTdGF0ZSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHdhaXRzIHVudGlsIGEgY2VydGFpbiBwYXJ0IG9mIHRoZSBzdGF0ZSBiZWNvbWVzIGF2YWlsYWJsZS4KICAgICAgICogc3VwcG9ydHMgb3B0aW9uYWwgdGltZW91dCBhbmQgQWJvcnRTaWduYWwuCiAgICAgICAqLwogICAgICBhc3luYyB3YWl0VW50aWxQcmVzZW50KHNlbGVjdG9yRm4sIG9wdGlvbnNPclRpbWVvdXQpIHsKICAgICAgICBsZXQgdGltZW91dE1zOwogICAgICAgIGxldCBzaWduYWw7CiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zT3JUaW1lb3V0ID09PSAibnVtYmVyIikgewogICAgICAgICAgdGltZW91dE1zID0gb3B0aW9uc09yVGltZW91dDsKICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnNPclRpbWVvdXQpIHsKICAgICAgICAgIHRpbWVvdXRNcyA9IG9wdGlvbnNPclRpbWVvdXQudGltZW91dE1zOwogICAgICAgICAgc2lnbmFsID0gb3B0aW9uc09yVGltZW91dC5zaWduYWw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGRvbmUgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgICAgICBjb25zdCBzZWxlY3RlZE9ic2VydmFibGUgPSB0aGlzLnNlbGVjdChzZWxlY3RvckZuKTsKICAgICAgICBsZXQgcmVzb2x2ZWQyID0gZmFsc2U7CiAgICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBYm9ydGVkIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHNlbGVjdGVkT2JzZXJ2YWJsZS5zdWJzY3JpYmUoKHZhbHVlMikgPT4gewogICAgICAgICAgaWYgKHZhbHVlMiAhPT0gdm9pZCAwICYmIHZhbHVlMiAhPT0gbnVsbCAmJiAhcmVzb2x2ZWQyKSB7CiAgICAgICAgICAgIHJlc29sdmVkMiA9IHRydWU7CiAgICAgICAgICAgIGRvbmUucmVzb2x2ZSh2YWx1ZTIpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGxldCB0aW1lb3V0SWQ7CiAgICAgICAgaWYgKHRpbWVvdXRNcykgewogICAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGlmICghcmVzb2x2ZWQyKSB7CiAgICAgICAgICAgICAgcmVzb2x2ZWQyID0gdHJ1ZTsKICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICBkb25lLnJlamVjdChuZXcgRXJyb3IoYHdhaXRVbnRpbFByZXNlbnQgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dE1zfW1zYCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCB0aW1lb3V0TXMpOwogICAgICAgIH0KICAgICAgICBjb25zdCBhYm9ydEhhbmRsZXIgPSBzaWduYWwgPyAoKSA9PiB7CiAgICAgICAgICBpZiAoIXJlc29sdmVkMikgewogICAgICAgICAgICByZXNvbHZlZDIgPSB0cnVlOwogICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgaWYgKHRpbWVvdXRJZCkKICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTsKICAgICAgICAgICAgZG9uZS5yZWplY3QobmV3IEVycm9yKCJBYm9ydGVkIikpOwogICAgICAgICAgfQogICAgICAgIH0gOiB2b2lkIDA7CiAgICAgICAgaWYgKHNpZ25hbCAmJiBhYm9ydEhhbmRsZXIpIHsKICAgICAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsIGFib3J0SGFuZGxlcik7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkb25lLnByb21pc2U7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgIGlmICh0aW1lb3V0SWQpCiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOwogICAgICAgICAgaWYgKHNpZ25hbCAmJiBhYm9ydEhhbmRsZXIpIHsKICAgICAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IiwgYWJvcnRIYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGlzIGV4ZWN1dGVkCiAgICAgICAqLwogICAgICBhc3luYyBzdGF0ZVNldHVwKGZ1bmNBcmcpIHsKICAgICAgICBjb25zdCByZXN1bHRQcm9taXNlID0gZnVuY0FyZyh0aGlzKTsKICAgICAgICB0aGlzLmN1bXVsYXRpdmVEZWZlcnJlZC5hZGRQcm9taXNlKHJlc3VsdFByb21pc2UpOwogICAgICAgIGF3YWl0IHRoaXMuc2V0U3RhdGUoYXdhaXQgcmVzdWx0UHJvbWlzZSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGRpc3Bvc2VzIHRoZSBzdGF0ZSBwYXJ0LCBjb21wbGV0aW5nIHRoZSBTdWJqZWN0IGFuZCBjbGVhbmluZyB1cCByZXNvdXJjZXMKICAgICAgICovCiAgICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgdGhpcy5zdGF0ZS5jb21wbGV0ZSgpOwogICAgICAgIGlmICh0aGlzLnBlbmRpbmdDdW11bGF0aXZlTm90aWZpY2F0aW9uKSB7CiAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nQ3VtdWxhdGl2ZU5vdGlmaWNhdGlvbik7CiAgICAgICAgICB0aGlzLnBlbmRpbmdDdW11bGF0aXZlTm90aWZpY2F0aW9uID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgdGhpcy5taWRkbGV3YXJlcy5sZW5ndGggPSAwOwogICAgICAgIHRoaXMuc2VsZWN0b3JDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogICAgICAgIHRoaXMuZGVmYXVsdFNlbGVjdE9ic2VydmFibGUgPSBudWxsOwogICAgICAgIHRoaXMud2ViU3RvcmUgPSBudWxsOwogICAgICAgIHRoaXMuc21hcnRzdGF0ZVJlZiA9IHZvaWQgMDsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RhdGVAMi4yLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RhdGUvZGlzdF90cy9zbWFydHN0YXRlLmNsYXNzZXMuY29tcHV0ZWQuanMKZnVuY3Rpb24gY29tcHV0ZWQoc291cmNlcywgY29tcHV0ZUZuKSB7CiAgcmV0dXJuIGNvbWJpbmVMYXRlc3Qoc291cmNlcy5tYXAoKHNwKSA9PiBzcC5zZWxlY3QoKSkpLnBpcGUobWFwMigoc3RhdGVzKSA9PiBjb21wdXRlRm4oLi4uc3RhdGVzKSkpOwp9CnZhciBpbml0X3NtYXJ0c3RhdGVfY2xhc3Nlc19jb21wdXRlZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RhdGVAMi4yLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RhdGUvZGlzdF90cy9zbWFydHN0YXRlLmNsYXNzZXMuY29tcHV0ZWQuanMiKCkgewogICAgaW5pdF9zbWFydHN0YXRlX3BsdWdpbnMoKTsKICAgIGluaXRfZXNtNSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnRzdGF0ZUAyLjIuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnRzdGF0ZS9kaXN0X3RzL3NtYXJ0c3RhdGUuY2xhc3Nlcy5zbWFydHN0YXRlLmpzCnZhciBTbWFydHN0YXRlOwp2YXIgaW5pdF9zbWFydHN0YXRlX2NsYXNzZXNfc21hcnRzdGF0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RhdGVAMi4yLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RhdGUvZGlzdF90cy9zbWFydHN0YXRlLmNsYXNzZXMuc21hcnRzdGF0ZS5qcyIoKSB7CiAgICBpbml0X3NtYXJ0c3RhdGVfcGx1Z2lucygpOwogICAgaW5pdF9zbWFydHN0YXRlX2NsYXNzZXNfc3RhdGVwYXJ0KCk7CiAgICBpbml0X3NtYXJ0c3RhdGVfY2xhc3Nlc19jb21wdXRlZCgpOwogICAgU21hcnRzdGF0ZSA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5zdGF0ZVBhcnRNYXAgPSB7fTsKICAgICAgICB0aGlzLnBlbmRpbmdTdGF0ZVBhcnRDcmVhdGlvbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgICAgdGhpcy5iYXRjaERlcHRoID0gMDsKICAgICAgICB0aGlzLmlzRmx1c2hpbmcgPSBmYWxzZTsKICAgICAgICB0aGlzLnBlbmRpbmdOb3RpZmljYXRpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogd2hldGhlciBzdGF0ZSBjaGFuZ2VzIGFyZSBjdXJyZW50bHkgYmVpbmcgYmF0Y2hlZAogICAgICAgKi8KICAgICAgZ2V0IGlzQmF0Y2hpbmcoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYmF0Y2hEZXB0aCA+IDA7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHJlZ2lzdGVycyBhIHN0YXRlIHBhcnQgZm9yIGRlZmVycmVkIG5vdGlmaWNhdGlvbiBkdXJpbmcgYSBiYXRjaAogICAgICAgKi8KICAgICAgcmVnaXN0ZXJQZW5kaW5nTm90aWZpY2F0aW9uKHN0YXRlUGFydCkgewogICAgICAgIHRoaXMucGVuZGluZ05vdGlmaWNhdGlvbnMuYWRkKHN0YXRlUGFydCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGJhdGNoZXMgbXVsdGlwbGUgc3RhdGUgdXBkYXRlcyBzbyBzdWJzY3JpYmVycyBhcmUgb25seSBub3RpZmllZCBvbmNlIGFsbCB1cGRhdGVzIGNvbXBsZXRlCiAgICAgICAqLwogICAgICBhc3luYyBiYXRjaCh1cGRhdGVGbikgewogICAgICAgIHRoaXMuYmF0Y2hEZXB0aCsrOwogICAgICAgIHRyeSB7CiAgICAgICAgICBhd2FpdCB1cGRhdGVGbigpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICB0aGlzLmJhdGNoRGVwdGgtLTsKICAgICAgICAgIGlmICh0aGlzLmJhdGNoRGVwdGggPT09IDAgJiYgIXRoaXMuaXNGbHVzaGluZykgewogICAgICAgICAgICB0aGlzLmlzRmx1c2hpbmcgPSB0cnVlOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIHdoaWxlICh0aGlzLnBlbmRpbmdOb3RpZmljYXRpb25zLnNpemUgPiAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nID0gWy4uLnRoaXMucGVuZGluZ05vdGlmaWNhdGlvbnNdOwogICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nTm90aWZpY2F0aW9ucy5jbGVhcigpOwogICAgICAgICAgICAgICAgZm9yIChjb25zdCBzcCBvZiBwZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgIGF3YWl0IHNwLm5vdGlmeUNoYW5nZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICB0aGlzLmlzRmx1c2hpbmcgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogY3JlYXRlcyBhIGNvbXB1dGVkIG9ic2VydmFibGUgZGVyaXZlZCBmcm9tIG11bHRpcGxlIHN0YXRlIHBhcnRzCiAgICAgICAqLwogICAgICBjb21wdXRlZChzb3VyY2VzLCBjb21wdXRlRm4pIHsKICAgICAgICByZXR1cm4gY29tcHV0ZWQoc291cmNlcywgY29tcHV0ZUZuKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQWxsb3dzIGdldHRpbmcgYW5kIGluaXRpYWxpemluZyBhIG5ldyBzdGF0ZXBhcnQKICAgICAgICovCiAgICAgIGFzeW5jIGdldFN0YXRlUGFydChzdGF0ZVBhcnROYW1lQXJnLCBpbml0aWFsQXJnLCBpbml0TW9kZSA9ICJzb2Z0IikgewogICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdTdGF0ZVBhcnRDcmVhdGlvbi5nZXQoc3RhdGVQYXJ0TmFtZUFyZyk7CiAgICAgICAgaWYgKHBlbmRpbmcpIHsKICAgICAgICAgIHJldHVybiBwZW5kaW5nOwogICAgICAgIH0KICAgICAgICBjb25zdCBleGlzdGluZ1N0YXRlUGFydCA9IHRoaXMuc3RhdGVQYXJ0TWFwW3N0YXRlUGFydE5hbWVBcmddOwogICAgICAgIGlmIChleGlzdGluZ1N0YXRlUGFydCkgewogICAgICAgICAgc3dpdGNoIChpbml0TW9kZSkgewogICAgICAgICAgICBjYXNlICJtYW5kYXRvcnkiOgogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhdGUgcGFydCAnJHtzdGF0ZVBhcnROYW1lQXJnfScgYWxyZWFkeSBleGlzdHMsIGJ1dCBpbml0TW9kZSBpcyAnbWFuZGF0b3J5J2ApOwogICAgICAgICAgICBjYXNlICJmb3JjZSI6CiAgICAgICAgICAgICAgZXhpc3RpbmdTdGF0ZVBhcnQuZGlzcG9zZSgpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJzb2Z0IjoKICAgICAgICAgICAgY2FzZSAicGVyc2lzdGVudCI6CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nU3RhdGVQYXJ0OwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaW5pdGlhbEFyZyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhdGUgcGFydCAnJHtzdGF0ZVBhcnROYW1lQXJnfScgZG9lcyBub3QgZXhpc3QgYW5kIG5vIGluaXRpYWwgc3RhdGUgcHJvdmlkZWRgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgY3JlYXRpb25Qcm9taXNlID0gdGhpcy5jcmVhdGVTdGF0ZVBhcnQoc3RhdGVQYXJ0TmFtZUFyZywgaW5pdGlhbEFyZywgaW5pdE1vZGUpOwogICAgICAgIHRoaXMucGVuZGluZ1N0YXRlUGFydENyZWF0aW9uLnNldChzdGF0ZVBhcnROYW1lQXJnLCBjcmVhdGlvblByb21pc2UpOwogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGlvblByb21pc2U7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICB0aGlzLnBlbmRpbmdTdGF0ZVBhcnRDcmVhdGlvbi5kZWxldGUoc3RhdGVQYXJ0TmFtZUFyZyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgc3RhdGVwYXJ0CiAgICAgICAqLwogICAgICBhc3luYyBjcmVhdGVTdGF0ZVBhcnQoc3RhdGVQYXJ0TmFtZSwgaW5pdGlhbFBheWxvYWRBcmcsIGluaXRNb2RlID0gInNvZnQiKSB7CiAgICAgICAgY29uc3QgbmV3U3RhdGUgPSBuZXcgU3RhdGVQYXJ0KHN0YXRlUGFydE5hbWUsIGluaXRNb2RlID09PSAicGVyc2lzdGVudCIgPyB7CiAgICAgICAgICBkYk5hbWU6ICJzbWFydHN0YXRlIiwKICAgICAgICAgIHN0b3JlTmFtZTogc3RhdGVQYXJ0TmFtZQogICAgICAgIH0gOiBudWxsKTsKICAgICAgICBuZXdTdGF0ZS5zbWFydHN0YXRlUmVmID0gdGhpczsKICAgICAgICBhd2FpdCBuZXdTdGF0ZS5pbml0KCk7CiAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gbmV3U3RhdGUuZ2V0U3RhdGUoKTsKICAgICAgICBpZiAoaW5pdE1vZGUgPT09ICJwZXJzaXN0ZW50IiAmJiBjdXJyZW50U3RhdGUgIT09IHZvaWQgMCkgewogICAgICAgICAgYXdhaXQgbmV3U3RhdGUuc2V0U3RhdGUoewogICAgICAgICAgICAuLi5pbml0aWFsUGF5bG9hZEFyZywKICAgICAgICAgICAgLi4uY3VycmVudFN0YXRlCiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXdhaXQgbmV3U3RhdGUuc2V0U3RhdGUoaW5pdGlhbFBheWxvYWRBcmcpOwogICAgICAgIH0KICAgICAgICB0aGlzLnN0YXRlUGFydE1hcFtzdGF0ZVBhcnROYW1lXSA9IG5ld1N0YXRlOwogICAgICAgIHJldHVybiBuZXdTdGF0ZTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RhdGVAMi4yLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RhdGUvZGlzdF90cy9zbWFydHN0YXRlLmNvbnRleHRwcm92aWRlci5qcwpmdW5jdGlvbiBhdHRhY2hDb250ZXh0UHJvdmlkZXIoZWxlbWVudDQsIG9wdGlvbnMpIHsKICBjb25zdCB7IGNvbnRleHQ6IGNvbnRleHQyLCBzdGF0ZVBhcnQsIHNlbGVjdG9yRm4gfSA9IG9wdGlvbnM7CiAgY29uc3Qgc3Vic2NyaWJlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHN0YXRlUGFydC5zZWxlY3Qoc2VsZWN0b3JGbikuc3Vic2NyaWJlKCh2YWx1ZTIpID0+IHsKICAgIGZvciAoY29uc3QgY2Igb2Ygc3Vic2NyaWJlcnMpIHsKICAgICAgY2IodmFsdWUyKTsKICAgIH0KICB9KTsKICBjb25zdCBnZXRWYWx1ZSA9ICgpID0+IHsKICAgIGNvbnN0IHN0YXRlMTAgPSBzdGF0ZVBhcnQuZ2V0U3RhdGUoKTsKICAgIGlmIChzdGF0ZTEwID09PSB2b2lkIDApCiAgICAgIHJldHVybiB2b2lkIDA7CiAgICByZXR1cm4gc2VsZWN0b3JGbiA/IHNlbGVjdG9yRm4oc3RhdGUxMCkgOiBzdGF0ZTEwOwogIH07CiAgY29uc3QgaGFuZGxlcjIgPSAoZXZlbnQpID0+IHsKICAgIGNvbnN0IGUxMSA9IGV2ZW50OwogICAgY29uc3QgZGV0YWlsID0gZTExLmRldGFpbDsKICAgIGlmICghZGV0YWlsIHx8IGRldGFpbC5jb250ZXh0ICE9PSBjb250ZXh0MikKICAgICAgcmV0dXJuOwogICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgaWYgKGRldGFpbC5zdWJzY3JpYmUpIHsKICAgICAgY29uc3QgY2IgPSBkZXRhaWwuY2FsbGJhY2s7CiAgICAgIHN1YnNjcmliZXJzLmFkZChjYik7CiAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4gc3Vic2NyaWJlcnMuZGVsZXRlKGNiKTsKICAgICAgY2IoZ2V0VmFsdWUoKSwgdW5zdWJzY3JpYmUpOwogICAgfSBlbHNlIHsKICAgICAgZGV0YWlsLmNhbGxiYWNrKGdldFZhbHVlKCkpOwogICAgfQogIH07CiAgZWxlbWVudDQuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dC1yZXF1ZXN0IiwgaGFuZGxlcjIpOwogIHJldHVybiAoKSA9PiB7CiAgICBlbGVtZW50NC5yZW1vdmVFdmVudExpc3RlbmVyKCJjb250ZXh0LXJlcXVlc3QiLCBoYW5kbGVyMik7CiAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgIHN1YnNjcmliZXJzLmNsZWFyKCk7CiAgfTsKfQp2YXIgaW5pdF9zbWFydHN0YXRlX2NvbnRleHRwcm92aWRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0c3RhdGVAMi4yLjEvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0c3RhdGUvZGlzdF90cy9zbWFydHN0YXRlLmNvbnRleHRwcm92aWRlci5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0YXRlQDIuMi4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0YXRlL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czIzID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czIzLCB7CiAgU21hcnRzdGF0ZTogKCkgPT4gU21hcnRzdGF0ZSwKICBTdGF0ZUFjdGlvbjogKCkgPT4gU3RhdGVBY3Rpb24sCiAgU3RhdGVQYXJ0OiAoKSA9PiBTdGF0ZVBhcnQsCiAgYXR0YWNoQ29udGV4dFByb3ZpZGVyOiAoKSA9PiBhdHRhY2hDb250ZXh0UHJvdmlkZXIsCiAgY29tcHV0ZWQ6ICgpID0+IGNvbXB1dGVkCn0pOwp2YXIgaW5pdF9kaXN0X3RzMjMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHN0YXRlQDIuMi4xL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHN0YXRlL2Rpc3RfdHMvaW5kZXguanMiKCkgewogICAgaW5pdF9zbWFydHN0YXRlX2NsYXNzZXNfc21hcnRzdGF0ZSgpOwogICAgaW5pdF9zbWFydHN0YXRlX2NsYXNzZXNfc3RhdGVwYXJ0KCk7CiAgICBpbml0X3NtYXJ0c3RhdGVfY2xhc3Nlc19zdGF0ZWFjdGlvbigpOwogICAgaW5pdF9zbWFydHN0YXRlX2NsYXNzZXNfY29tcHV0ZWQoKTsKICAgIGluaXRfc21hcnRzdGF0ZV9jb250ZXh0cHJvdmlkZXIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dXJsQDMuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHVybC9kaXN0X3RzL3NtYXJ0dXJsLnBsdWdpbnMuanMKdmFyIGluaXRfc21hcnR1cmxfcGx1Z2lucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dXJsQDMuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHVybC9kaXN0X3RzL3NtYXJ0dXJsLnBsdWdpbnMuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrc21hcnR1cmxAMy4xLjAvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3NtYXJ0dXJsL2Rpc3RfdHMvc21hcnR1cmwuY2xhc3Nlcy5zbWFydHVybC5qcwp2YXIgU21hcnR1cmw7CnZhciBpbml0X3NtYXJ0dXJsX2NsYXNzZXNfc21hcnR1cmwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHVybEAzLjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR1cmwvZGlzdF90cy9zbWFydHVybC5jbGFzc2VzLnNtYXJ0dXJsLmpzIigpIHsKICAgIGluaXRfc21hcnR1cmxfcGx1Z2lucygpOwogICAgU21hcnR1cmwgPSBjbGFzcyBfU21hcnR1cmwgewogICAgICAvLyBTdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSBhIFNtYXJ0dXJsIGluc3RhbmNlIGZyb20gYSBVUkwgc3RyaW5nCiAgICAgIHN0YXRpYyBjcmVhdGVGcm9tVXJsKHVybEFyZywgb3B0aW9uc0FyZykgewogICAgICAgIGNvbnN0IHBhcnNlZFVybEluc3RhbmNlID0gbmV3IFVSTCh1cmxBcmcpOwogICAgICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHt9OwogICAgICAgIGNvbnN0IHNlYXJjaFBhcmFtUGFpcnMgPSBbXTsKICAgICAgICBpZiAocGFyc2VkVXJsSW5zdGFuY2Uuc2VhcmNoKSB7CiAgICAgICAgICBwYXJzZWRVcmxJbnN0YW5jZS5zZWFyY2gucmVwbGFjZSgiPyIsICIiKS5zcGxpdCgiJiIpLm1hcCgoc2VhcmNoUGFyYW1QYWlyKSA9PiB7CiAgICAgICAgICAgIHNlYXJjaFBhcmFtUGFpcnMucHVzaCh7CiAgICAgICAgICAgICAga2V5OiBzZWFyY2hQYXJhbVBhaXIuc3BsaXQoIj0iKVswXSwKICAgICAgICAgICAgICB2YWx1ZTogc2VhcmNoUGFyYW1QYWlyLnNwbGl0KCI9IilbMV0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCBzZWFyY2hQYXJhbVBhaXIgb2Ygc2VhcmNoUGFyYW1QYWlycykgewogICAgICAgICAgc2VhcmNoUGFyYW1zW3NlYXJjaFBhcmFtUGFpci5rZXldID0gc2VhcmNoUGFyYW1QYWlyLnZhbHVlOwogICAgICAgIH0KICAgICAgICBpZiAob3B0aW9uc0FyZz8uc2VhcmNoUGFyYW1zKSB7CiAgICAgICAgICBmb3IgKGNvbnN0IGtleTIgb2YgT2JqZWN0LmtleXMob3B0aW9uc0FyZy5zZWFyY2hQYXJhbXMpKSB7CiAgICAgICAgICAgIHNlYXJjaFBhcmFtc1trZXkyXSA9IG9wdGlvbnNBcmcuc2VhcmNoUGFyYW1zW2tleTJdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgcGF0aDIgPSBwYXJzZWRVcmxJbnN0YW5jZS5wYXRobmFtZSB8fCAiIjsKICAgICAgICBpZiAoT2JqZWN0LmtleXMoc2VhcmNoUGFyYW1zKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICBwYXRoMiArPSAiPyI7CiAgICAgICAgICBsZXQgZmlyc3QyID0gdHJ1ZTsKICAgICAgICAgIGZvciAoY29uc3Qga2V5MiBvZiBPYmplY3Qua2V5cyhzZWFyY2hQYXJhbXMpKSB7CiAgICAgICAgICAgIGlmIChmaXJzdDIpIHsKICAgICAgICAgICAgICBmaXJzdDIgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBwYXRoMiArPSAiJiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGF0aDIgKz0gYCR7a2V5Mn09JHtzZWFyY2hQYXJhbXNba2V5Ml19YDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gewogICAgICAgICAgLi4ucGFyc2VkVXJsSW5zdGFuY2UsCiAgICAgICAgICBocmVmOiBwYXJzZWRVcmxJbnN0YW5jZS5ocmVmLAogICAgICAgICAgb3JpZ2luOiBwYXJzZWRVcmxJbnN0YW5jZS5vcmlnaW4sCiAgICAgICAgICBwcm90b2NvbDogcGFyc2VkVXJsSW5zdGFuY2UucHJvdG9jb2wsCiAgICAgICAgICB1c2VybmFtZTogcGFyc2VkVXJsSW5zdGFuY2UudXNlcm5hbWUsCiAgICAgICAgICBwYXNzd29yZDogcGFyc2VkVXJsSW5zdGFuY2UucGFzc3dvcmQsCiAgICAgICAgICBob3N0OiBwYXJzZWRVcmxJbnN0YW5jZS5ob3N0LAogICAgICAgICAgaG9zdG5hbWU6IHBhcnNlZFVybEluc3RhbmNlLmhvc3RuYW1lLAogICAgICAgICAgcG9ydDogcGFyc2VkVXJsSW5zdGFuY2UucG9ydCwKICAgICAgICAgIHBhdGg6IHBhdGgyLAogICAgICAgICAgcGF0aG5hbWU6IHBhcnNlZFVybEluc3RhbmNlLnBhdGhuYW1lLAogICAgICAgICAgc2VhcmNoOiBwYXJzZWRVcmxJbnN0YW5jZS5zZWFyY2gsCiAgICAgICAgICBzZWFyY2hQYXJhbXMsCiAgICAgICAgICBoYXNoOiBwYXJzZWRVcmxJbnN0YW5jZS5oYXNoCiAgICAgICAgfTsKICAgICAgICBpZiAoIXBhcnNlZFVybC5wb3J0ICYmIHBhcnNlZFVybC5wcm90b2NvbCA9PT0gImh0dHBzOiIpIHsKICAgICAgICAgIHBhcnNlZFVybC5wb3J0ID0gIjQ0MyI7CiAgICAgICAgfQogICAgICAgIGlmICghcGFyc2VkVXJsLnBvcnQgJiYgcGFyc2VkVXJsLnByb3RvY29sID09PSAiaHR0cDoiKSB7CiAgICAgICAgICBwYXJzZWRVcmwucG9ydCA9ICI4MCI7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJldHVyblNtYXJ0dXJsID0gbmV3IF9TbWFydHVybCgpOwogICAgICAgIE9iamVjdC5hc3NpZ24ocmV0dXJuU21hcnR1cmwsIHBhcnNlZFVybCk7CiAgICAgICAgcmV0dXJuIHJldHVyblNtYXJ0dXJsOwogICAgICB9CiAgICAgIC8vIFN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIGEgU21hcnR1cmwgaW5zdGFuY2UgZnJvbSBhbiBleGlzdGluZyBJVXJsT2JqZWN0CiAgICAgIHN0YXRpYyBjcmVhdGVGcm9tUGFyc2VkVXJsKHBhcnNlZFVybEFyZykgewogICAgICAgIGNvbnN0IHJldHVyblNtYXJ0dXJsID0gbmV3IF9TbWFydHVybCgpOwogICAgICAgIE9iamVjdC5hc3NpZ24ocmV0dXJuU21hcnR1cmwsIHBhcnNlZFVybEFyZyk7CiAgICAgICAgcmV0dXJuIHJldHVyblNtYXJ0dXJsOwogICAgICB9CiAgICAgIC8vIENvbnN0cnVjdG9yIGluaXRpYWxpemVzIHNlYXJjaFBhcmFtcyBhcyBhbiBlbXB0eSBvYmplY3QKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5zZWFyY2hQYXJhbXMgPSB7fTsKICAgICAgfQogICAgICAvLyBNZXRob2QgdG8gY3JlYXRlIGFuIGluZGVwZW5kZW50IGNsb25lIG9mIHRoZSBjdXJyZW50IFNtYXJ0dXJsIGluc3RhbmNlCiAgICAgIGNsb25lKCkgewogICAgICAgIGNvbnN0IGNsb25lZEluc3RhbmNlID0gbmV3IF9TbWFydHVybCgpOwogICAgICAgIE9iamVjdC5hc3NpZ24oY2xvbmVkSW5zdGFuY2UsIHRoaXMpOwogICAgICAgIGNsb25lZEluc3RhbmNlLnNlYXJjaFBhcmFtcyA9IHsgLi4udGhpcy5zZWFyY2hQYXJhbXMgfTsKICAgICAgICByZXR1cm4gY2xvbmVkSW5zdGFuY2U7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFR5cGVkIG1ldGhvZCB0byBzZXQgYSBwcm9wZXJ0eSBhbmQgcmV0dXJuIHRoZSBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuCiAgICAgICAqIEBwYXJhbSBwcm9wIC0gVGhlIHByb3BlcnR5IG5hbWUgdG8gc2V0IChtdXN0IGJlIGEga2V5IG9mIFNtYXJ0dXJsKQogICAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYXNzaWduIHRvIHRoZSBwcm9wZXJ0eQogICAgICAgKiBAcmV0dXJucyBUaGUgU21hcnR1cmwgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZwogICAgICAgKi8KICAgICAgc2V0KHByb3AsIHZhbHVlMikgewogICAgICAgIHRoaXNbcHJvcF0gPSB2YWx1ZTI7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgLy8gTWV0aG9kIHRvIGNvbnZlcnQgdGhlIFNtYXJ0dXJsIGluc3RhbmNlIGJhY2sgaW50byBhIFVSTCBzdHJpbmcKICAgICAgdG9TdHJpbmcoKSB7CiAgICAgICAgbGV0IHVzZXJwYXJ0ID0gYGA7CiAgICAgICAgaWYgKHRoaXMudXNlcm5hbWUgJiYgIXRoaXMucGFzc3dvcmQpIHsKICAgICAgICAgIHVzZXJwYXJ0ID0gYCR7dGhpcy51c2VybmFtZX1AYDsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMudXNlcm5hbWUgJiYgdGhpcy5wYXNzd29yZCkgewogICAgICAgICAgdXNlcnBhcnQgPSBgJHt0aGlzLnVzZXJuYW1lfToke3RoaXMucGFzc3dvcmR9QGA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBgJHt0aGlzLnByb3RvY29sfS8vJHt1c2VycGFydH0ke3RoaXMuaG9zdG5hbWV9OiR7dGhpcy5wb3J0fSR7dGhpcy5wYXRofWA7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2NrcytzbWFydHVybEAzLjEuMC9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvc21hcnR1cmwvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMjQgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMjQsIHsKICBTbWFydHVybDogKCkgPT4gU21hcnR1cmwKfSk7CnZhciBpbml0X2Rpc3RfdHMyNCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3NtYXJ0dXJsQDMuMS4wL25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy9zbWFydHVybC9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfc21hcnR1cmxfY2xhc3Nlc19zbWFydHVybCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2hyb2NrcytzbWFydHByb21pc2VANC4wLjIvbm9kZV9tb2R1bGVzL0BwdXNocm9ja3Mvc21hcnRwcm9taXNlL2Rpc3RfdHMvc21hcnRwcm9taXNlLmNsYXNzZXMuZGVmZXJyZWQuanMKdmFyIERlZmVycmVkMiwgZGVmZXIzOwp2YXIgaW5pdF9zbWFydHByb21pc2VfY2xhc3Nlc19kZWZlcnJlZDIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaHJvY2tzK3NtYXJ0cHJvbWlzZUA0LjAuMi9ub2RlX21vZHVsZXMvQHB1c2hyb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9zbWFydHByb21pc2UuY2xhc3Nlcy5kZWZlcnJlZC5qcyIoKSB7CiAgICBEZWZlcnJlZDIgPSBjbGFzcyB7CiAgICAgIGNsYWltKCkgewogICAgICAgIGlmICh0aGlzLmNsYWltZWQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiRGVmZXJyZWQgYWxyZWFkeSBjbGFpbWVkIik7CiAgICAgICAgfQogICAgICAgIHRoaXMuY2xhaW1lZCA9IHRydWU7CiAgICAgIH0KICAgICAgZ2V0IGR1cmF0aW9uKCkgewogICAgICAgIGlmICh0aGlzLnN0b3BwZWRBdCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcHBlZEF0IC0gdGhpcy5zdGFydGVkQXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBEYXRlLm5vdygpIC0gdGhpcy5zdGFydGVkQXQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuY2xhaW1lZCA9IGZhbHNlOwogICAgICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0KSA9PiB7CiAgICAgICAgICB0aGlzLnJlc29sdmUgPSAodmFsdWVBcmcpID0+IHsKICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAiZnVsZmlsbGVkIjsKICAgICAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICByZXNvbHZlMih2YWx1ZUFyZyk7CiAgICAgICAgICB9OwogICAgICAgICAgdGhpcy5yZWplY3QgPSAocmVhc29uKSA9PiB7CiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gInJlamVjdGVkIjsKICAgICAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICByZWplY3QocmVhc29uKTsKICAgICAgICAgIH07CiAgICAgICAgICB0aGlzLnN0YXJ0ZWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICB0aGlzLnN0YXR1cyA9ICJwZW5kaW5nIjsKICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIGRlZmVyMyA9ICgpID0+IHsKICAgICAgcmV0dXJuIG5ldyBEZWZlcnJlZDIoKTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaHJvY2tzK3NtYXJ0cHJvbWlzZUA0LjAuMi9ub2RlX21vZHVsZXMvQHB1c2hyb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9zbWFydHByb21pc2UuY2xhc3Nlcy5jdW11bGF0aXZlZGVmZXJyZWQuanMKdmFyIEN1bXVsYXRpdmVEZWZlcnJlZDIsIGN1bXVsYXRpdmVEZWZlcjI7CnZhciBpbml0X3NtYXJ0cHJvbWlzZV9jbGFzc2VzX2N1bXVsYXRpdmVkZWZlcnJlZDIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaHJvY2tzK3NtYXJ0cHJvbWlzZUA0LjAuMi9ub2RlX21vZHVsZXMvQHB1c2hyb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9zbWFydHByb21pc2UuY2xhc3Nlcy5jdW11bGF0aXZlZGVmZXJyZWQuanMiKCkgewogICAgaW5pdF9zbWFydHByb21pc2VfY2xhc3Nlc19kZWZlcnJlZDIoKTsKICAgIEN1bXVsYXRpdmVEZWZlcnJlZDIgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuYWNjdW11bGF0ZWRQcm9taXNlcyA9IFtdOwogICAgICAgIHRoaXMuZGVmZXJyZWQgPSBkZWZlcjMoKTsKICAgICAgICB0aGlzLnByb21pc2UgPSB0aGlzLmRlZmVycmVkLnByb21pc2U7CiAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7CiAgICAgICAgICB3aGlsZSAodGhpcy5hY2N1bXVsYXRlZFByb21pc2VzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgY29uc3QgcG9wcGVkUHJvbWlzZSA9IHRoaXMuYWNjdW11bGF0ZWRQcm9taXNlcy5zaGlmdCgpOwogICAgICAgICAgICBhd2FpdCBwb3BwZWRQcm9taXNlOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5kZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgfSwgMCk7CiAgICAgIH0KICAgICAgYWRkUHJvbWlzZShwcm9taXNlQXJnKSB7CiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZFByb21pc2VzLnB1c2gocHJvbWlzZUFyZyk7CiAgICAgIH0KICAgIH07CiAgICBjdW11bGF0aXZlRGVmZXIyID0gKCkgPT4gewogICAgICByZXR1cm4gbmV3IEN1bXVsYXRpdmVEZWZlcnJlZDIoKTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaHJvY2tzK3NtYXJ0cHJvbWlzZUA0LjAuMi9ub2RlX21vZHVsZXMvQHB1c2hyb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMjUgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMjUsIHsKICBDdW11bGF0aXZlRGVmZXJyZWQ6ICgpID0+IEN1bXVsYXRpdmVEZWZlcnJlZDIsCiAgRGVmZXJyZWQ6ICgpID0+IERlZmVycmVkMiwKICBjdW11bGF0aXZlRGVmZXI6ICgpID0+IGN1bXVsYXRpdmVEZWZlcjIsCiAgZGVmZXI6ICgpID0+IGRlZmVyMywKICBnZXRGaXJzdFRydWVPckZhbHNlOiAoKSA9PiBnZXRGaXJzdFRydWVPckZhbHNlMiwKICBtYXA6ICgpID0+IG1hcDYsCiAgcmVqZWN0ZWRQcm9taXNlOiAoKSA9PiByZWplY3RlZFByb21pc2UyLAogIHJlc29sdmVkUHJvbWlzZTogKCkgPT4gcmVzb2x2ZWRQcm9taXNlMiwKICB0aW1lb3V0QW5kQ29udGludWU6ICgpID0+IHRpbWVvdXRBbmRDb250aW51ZTIsCiAgdGltZW91dFdyYXA6ICgpID0+IHRpbWVvdXRXcmFwMgp9KTsKdmFyIHJlc29sdmVkUHJvbWlzZTIsIHJlamVjdGVkUHJvbWlzZTIsIG1hcDYsIHRpbWVvdXRXcmFwMiwgdGltZW91dEFuZENvbnRpbnVlMiwgZ2V0Rmlyc3RUcnVlT3JGYWxzZTI7CnZhciBpbml0X2Rpc3RfdHMyNSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNocm9ja3Mrc21hcnRwcm9taXNlQDQuMC4yL25vZGVfbW9kdWxlcy9AcHVzaHJvY2tzL3NtYXJ0cHJvbWlzZS9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfc21hcnRwcm9taXNlX2NsYXNzZXNfZGVmZXJyZWQyKCk7CiAgICBpbml0X3NtYXJ0cHJvbWlzZV9jbGFzc2VzX2N1bXVsYXRpdmVkZWZlcnJlZDIoKTsKICAgIGluaXRfc21hcnRwcm9taXNlX2NsYXNzZXNfZGVmZXJyZWQyKCk7CiAgICByZXNvbHZlZFByb21pc2UyID0gKHZhbHVlMikgPT4gewogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlMik7CiAgICB9OwogICAgcmVqZWN0ZWRQcm9taXNlMiA9IChlcnIpID0+IHsKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7CiAgICB9OwogICAgbWFwNiA9IGFzeW5jIChpbnB1dEFyZywgZnVuY3Rpb25BcmcpID0+IHsKICAgICAgY29uc3QgcHJvbWlzZUFycmF5ID0gW107CiAgICAgIGNvbnN0IHJlc3VsdEFycmF5ID0gW107CiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpbnB1dEFyZykgewogICAgICAgIGNvbnN0IHByb21pc2UgPSBmdW5jdGlvbkFyZyhpdGVtKTsKICAgICAgICBwcm9taXNlQXJyYXkucHVzaChwcm9taXNlKTsKICAgICAgICBwcm9taXNlLnRoZW4oKHg0KSA9PiB7CiAgICAgICAgICByZXN1bHRBcnJheS5wdXNoKHg0KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlQXJyYXkpOwogICAgICByZXR1cm4gcmVzdWx0QXJyYXk7CiAgICB9OwogICAgdGltZW91dFdyYXAyID0gYXN5bmMgKHByb21pc2VBcmcsIHRpbWVvdXRJbk1zQXJnLCByZWplY3RBcmcgPSB0cnVlKSA9PiB7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdCkgPT4gewogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgaWYgKHJlamVjdEFyZykgewogICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCJ0aW1lb3V0IikpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzb2x2ZTIobnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgdGltZW91dEluTXNBcmcpOwogICAgICAgIHByb21pc2VBcmcudGhlbihyZXNvbHZlMiwgcmVqZWN0KTsKICAgICAgfSk7CiAgICB9OwogICAgdGltZW91dEFuZENvbnRpbnVlMiA9IGFzeW5jIChwcm9taXNlQXJnLCB0aW1lb3V0SW5Nc0FyZyA9IDZlNCkgPT4gewogICAgICByZXR1cm4gdGltZW91dFdyYXAyKHByb21pc2VBcmcsIHRpbWVvdXRJbk1zQXJnLCBmYWxzZSk7CiAgICB9OwogICAgZ2V0Rmlyc3RUcnVlT3JGYWxzZTIgPSBhc3luYyAocHJvbWlzZXNBcmcpID0+IHsKICAgICAgY29uc3QgZG9uZSA9IGRlZmVyMygpOwogICAgICBmb3IgKGNvbnN0IHByb21pc2VBcmcgb2YgcHJvbWlzZXNBcmcpIHsKICAgICAgICBwcm9taXNlQXJnLnRoZW4oKHJlc3VsdEFyZykgPT4gewogICAgICAgICAgaWYgKHJlc3VsdEFyZyA9PT0gdHJ1ZSkgewogICAgICAgICAgICBkb25lLnJlc29sdmUodHJ1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXNBcmcpLnRoZW4oKCkgPT4gewogICAgICAgIGRvbmUucmVzb2x2ZShmYWxzZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gZG9uZS5wcm9taXNlOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNocm9ja3Mrc21hcnRkZWxheUAzLjAuMS9ub2RlX21vZHVsZXMvQHB1c2hyb2Nrcy9zbWFydGRlbGF5L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czI2ID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czI2LCB7CiAgVGltZW91dDogKCkgPT4gVGltZW91dDIsCiAgZGVsYXlGb3I6ICgpID0+IGRlbGF5Rm9yMiwKICBkZWxheUZvclJhbmRvbTogKCkgPT4gZGVsYXlGb3JSYW5kb20yCn0pOwp2YXIgZGVsYXlGb3IyLCBkZWxheUZvclJhbmRvbTIsIFRpbWVvdXQyOwp2YXIgaW5pdF9kaXN0X3RzMjYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaHJvY2tzK3NtYXJ0ZGVsYXlAMy4wLjEvbm9kZV9tb2R1bGVzL0BwdXNocm9ja3Mvc21hcnRkZWxheS9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfZGlzdF90czI1KCk7CiAgICBkZWxheUZvcjIgPSBhc3luYyAodGltZUluTWlsbGlzZWNvbmRBcmcsIHBhc3NPbkFyZywgdW5yZWZlZEFyZyA9IGZhbHNlKSA9PiB7CiAgICAgIGNvbnN0IHRpbWVvdXQyID0gbmV3IFRpbWVvdXQyKHRpbWVJbk1pbGxpc2Vjb25kQXJnLCBudWxsLCB1bnJlZmVkQXJnKTsKICAgICAgYXdhaXQgdGltZW91dDIucHJvbWlzZTsKICAgICAgcmV0dXJuIHBhc3NPbkFyZzsKICAgIH07CiAgICBkZWxheUZvclJhbmRvbTIgPSBhc3luYyAodGltZU1pbkluTWlsbGlzZWNvbmRBcmcsIHRpbWVNYXhJbk1pbGxpc2Vjb25kQXJnLCBwYXNzT25BcmcsIHVucmVmZWRBcmcgPSBmYWxzZSkgPT4gewogICAgICBhd2FpdCBkZWxheUZvcjIoTWF0aC5yYW5kb20oKSAqICh0aW1lTWF4SW5NaWxsaXNlY29uZEFyZyAtIHRpbWVNaW5Jbk1pbGxpc2Vjb25kQXJnKSArIHRpbWVNaW5Jbk1pbGxpc2Vjb25kQXJnLCBudWxsLCB1bnJlZmVkQXJnKTsKICAgICAgcmV0dXJuIHBhc3NPbkFyZzsKICAgIH07CiAgICBUaW1lb3V0MiA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IodGltZUluTWlsbGlzZWNvbmRBcmcsIHBhc3NPbiwgdW5yZWZlZEFyZyA9IGZhbHNlKSB7CiAgICAgICAgdGhpcy5fY2FuY2VsbGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy50aW1lb3V0SW5NaWxsaXMgPSB0aW1lSW5NaWxsaXNlY29uZEFyZzsKICAgICAgICB0aGlzLl9kZWZlcnJlZCA9IGRlZmVyMygpOwogICAgICAgIHRoaXMucHJvbWlzZSA9IHRoaXMuX2RlZmVycmVkLnByb21pc2U7CiAgICAgICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgaWYgKCF0aGlzLl9jYW5jZWxsZWQpIHsKICAgICAgICAgICAgdGhpcy5fZGVmZXJyZWQucmVzb2x2ZShwYXNzT24pOwogICAgICAgICAgfQogICAgICAgIH0sIHRpbWVJbk1pbGxpc2Vjb25kQXJnKTsKICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBEYXRlLm5vdygpOwogICAgICAgIGlmICh1bnJlZmVkQXJnKSB7CiAgICAgICAgICB0aGlzLm1ha2VVbnJlZmVkKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiB1bnJlZmZpbmcgYSB0aW1lb3V0IGNhdXNlcyB0aGUgbm9kZSBwcm9jZXNzIHRvIG5vdCB3YWl0IGZvciBjb21wbGV0aW9uIGJlZm9yZSBleGl0CiAgICAgICAqLwogICAgICBtYWtlVW5yZWZlZCgpIHsKICAgICAgICB0aGlzLl90aW1lb3V0LnVucmVmKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIGNhbmNlbHMgdGhlIHRpbWVyCiAgICAgICAqLwogICAgICBjYW5jZWwoKSB7CiAgICAgICAgdGhpcy5fY2FuY2VsbGVkID0gdHJ1ZTsKICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7CiAgICAgIH0KICAgICAgZ2V0VGltZUxlZnQoKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zdGFydGVkICsgdGhpcy50aW1lb3V0SW5NaWxsaXMgLSBEYXRlLm5vdygpOwogICAgICAgIHJldHVybiByZXN1bHQgPiAwID8gcmVzdWx0IDogMDsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9idXNpbmVzcy9hZGRyZXNzLmpzCnZhciBpbml0X2FkZHJlc3MgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3MvYWRkcmVzcy5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3MvY29tcGFueS5qcwp2YXIgaW5pdF9jb21wYW55ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2J1c2luZXNzL2NvbXBhbnkuanMiKCkgewogICAgaW5pdF9kaXN0X3RzMjcoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9idXNpbmVzcy9jb250YWN0LmpzCnZhciBpbml0X2NvbnRhY3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3MvY29udGFjdC5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMyNygpOwogICAgaW5pdF9kaXN0X3RzMjcoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9maW5hbmNlL2NoZWNraW5nYWNjb3VudC5qcwp2YXIgaW5pdF9jaGVja2luZ2FjY291bnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZmluYW5jZS9jaGVja2luZ2FjY291bnQuanMiKCkgewogICAgaW5pdF9kaXN0X3RzMjcoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9maW5hbmNlL2N1cnJlbmN5LmpzCnZhciBpbml0X2N1cnJlbmN5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2ZpbmFuY2UvY3VycmVuY3kuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2ZpbmFuY2UvZXhwZW5zZS5qcwp2YXIgaW5pdF9leHBlbnNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2ZpbmFuY2UvZXhwZW5zZS5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMyNygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2ZpbmFuY2UvaW52b2ljZS5qcwp2YXIgaW5pdF9pbnZvaWNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2ZpbmFuY2UvaW52b2ljZS5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMyNygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2ZpbmFuY2UvcGF5bWVudC5qcwp2YXIgaW5pdF9wYXltZW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2ZpbmFuY2UvcGF5bWVudC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZmluYW5jZS90cmFuc2FjdGlvbi5qcwp2YXIgaW5pdF90cmFuc2FjdGlvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9maW5hbmNlL3RyYW5zYWN0aW9uLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9maW5hbmNlL2luZGV4LmpzCnZhciBmaW5hbmNlX2V4cG9ydHMgPSB7fTsKdmFyIGluaXRfZmluYW5jZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9maW5hbmNlL2luZGV4LmpzIigpIHsKICAgIGluaXRfY2hlY2tpbmdhY2NvdW50KCk7CiAgICBpbml0X2N1cnJlbmN5KCk7CiAgICBpbml0X2V4cGVuc2UoKTsKICAgIGluaXRfaW52b2ljZSgpOwogICAgaW5pdF9wYXltZW50KCk7CiAgICBpbml0X3RyYW5zYWN0aW9uKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3Mvam9iLmpzCnZhciBJSm9iOwp2YXIgaW5pdF9qb2IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3Mvam9iLmpzIigpIHsKICAgIGluaXRfZmluYW5jZSgpOwogICAgaW5pdF9jb21wYW55KCk7CiAgICBpbml0X2NvbnRhY3QoKTsKICAgIElKb2IgPSBjbGFzcyB7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2RhdGFiYXNlL21vbmdvZGVzY3JpcHRvci5qcwp2YXIgaW5pdF9tb25nb2Rlc2NyaXB0b3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZGF0YWJhc2UvbW9uZ29kZXNjcmlwdG9yLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9kYXRhYmFzZS9vYmplY3RhY3Rpb24uanMKdmFyIGluaXRfb2JqZWN0YWN0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2RhdGFiYXNlL29iamVjdGFjdGlvbi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZGF0YWJhc2Uvb2JqZWN0c3RhdHVzLmpzCnZhciBpbml0X29iamVjdHN0YXR1cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9kYXRhYmFzZS9vYmplY3RzdGF0dXMuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2RhdGFiYXNlL3dyYXBwZWRkYXRhLmpzCnZhciBpbml0X3dyYXBwZWRkYXRhID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2RhdGFiYXNlL3dyYXBwZWRkYXRhLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9kYXRhYmFzZS9pbmRleC5qcwp2YXIgZGF0YWJhc2VfZXhwb3J0cyA9IHt9Owp2YXIgaW5pdF9kYXRhYmFzZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9kYXRhYmFzZS9pbmRleC5qcyIoKSB7CiAgICBpbml0X21vbmdvZGVzY3JpcHRvcigpOwogICAgaW5pdF9vYmplY3RhY3Rpb24oKTsKICAgIGluaXRfb2JqZWN0c3RhdHVzKCk7CiAgICBpbml0X3dyYXBwZWRkYXRhKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3MvbGV0dGVyLmpzCnZhciBpbml0X2xldHRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9idXNpbmVzcy9sZXR0ZXIuanMiKCkgewogICAgaW5pdF9idXNpbmVzcygpOwogICAgaW5pdF9maW5hbmNlKCk7CiAgICBpbml0X2RhdGFiYXNlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3MvcGRmLmpzCnZhciBpbml0X3BkZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9idXNpbmVzcy9wZGYuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2J1c2luZXNzL3BlcnNvbi5qcwp2YXIgaW5pdF9wZXJzb24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3MvcGVyc29uLmpzIigpIHsKICAgIGluaXRfY29udGFjdCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2J1c2luZXNzL3Byb2plY3QuanMKdmFyIGluaXRfcHJvamVjdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9idXNpbmVzcy9wcm9qZWN0LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9idXNpbmVzcy9pbmRleC5qcwp2YXIgYnVzaW5lc3NfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChidXNpbmVzc19leHBvcnRzLCB7CiAgSUpvYjogKCkgPT4gSUpvYgp9KTsKdmFyIGluaXRfYnVzaW5lc3MgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvYnVzaW5lc3MvaW5kZXguanMiKCkgewogICAgaW5pdF9hZGRyZXNzKCk7CiAgICBpbml0X2NvbXBhbnkoKTsKICAgIGluaXRfY29udGFjdCgpOwogICAgaW5pdF9qb2IoKTsKICAgIGluaXRfbGV0dGVyKCk7CiAgICBpbml0X3BkZigpOwogICAgaW5pdF9wZXJzb24oKTsKICAgIGluaXRfcHJvamVjdCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvZGUvY29tbWl0aW5mby5qcwp2YXIgaW5pdF9jb21taXRpbmZvID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvZGUvY29tbWl0aW5mby5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvY29kZS9zdGF0dXNvYmplY3QuanMKdmFyIGluaXRfc3RhdHVzb2JqZWN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvZGUvc3RhdHVzb2JqZWN0LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9jb2RlL2luZGV4LmpzCnZhciBjb2RlX2V4cG9ydHMgPSB7fTsKdmFyIGluaXRfY29kZTMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvY29kZS9pbmRleC5qcyIoKSB7CiAgICBpbml0X2NvbW1pdGluZm8oKTsKICAgIGluaXRfc3RhdHVzb2JqZWN0KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvY29udGFpbmVyL2NvbnRhaW5lci5qcwp2YXIgaW5pdF9jb250YWluZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvY29udGFpbmVyL2NvbnRhaW5lci5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvY29udGFpbmVyL3ZvbHVtZW1vdW50LmpzCnZhciBpbml0X3ZvbHVtZW1vdW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvbnRhaW5lci92b2x1bWVtb3VudC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvY29udGFpbmVyL2luZGV4LmpzCnZhciBjb250YWluZXJfZXhwb3J0cyA9IHt9Owp2YXIgaW5pdF9jb250YWluZXIyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvbnRhaW5lci9pbmRleC5qcyIoKSB7CiAgICBpbml0X2NvbnRhaW5lcigpOwogICAgaW5pdF92b2x1bWVtb3VudCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvbnRlbnQvYXJ0aWNsZS5qcwp2YXIgaW5pdF9hcnRpY2xlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvbnRlbnQvYXJ0aWNsZS5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMyNygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvbnRlbnQvYXV0aG9yLmpzCnZhciBpbml0X2F1dGhvciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9jb250ZW50L2F1dGhvci5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMyNygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvbnRlbnQvZG9jdW1lbnRhdGlvbnNldC5qcwp2YXIgaW5pdF9kb2N1bWVudGF0aW9uc2V0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvbnRlbnQvZG9jdW1lbnRhdGlvbnNldC5qcyIoKSB7CiAgICBpbml0X2FydGljbGUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9jb250ZW50L2luZGV4LmpzCnZhciBjb250ZW50X2V4cG9ydHMgPSB7fTsKdmFyIGluaXRfY29udGVudDMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvY29udGVudC9pbmRleC5qcyIoKSB7CiAgICBpbml0X2FydGljbGUoKTsKICAgIGluaXRfYXV0aG9yKCk7CiAgICBpbml0X2RvY3VtZW50YXRpb25zZXQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9nZW5lcmFsL2RhdGUuanMKdmFyIGluaXRfZGF0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9nZW5lcmFsL2RhdGUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2dlbmVyYWwvdGltZS5qcwp2YXIgaW5pdF90aW1lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2dlbmVyYWwvdGltZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZ2VuZXJhbC9pbmRleC5qcwp2YXIgZ2VuZXJhbF9leHBvcnRzID0ge307CnZhciBpbml0X2dlbmVyYWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZ2VuZXJhbC9pbmRleC5qcyIoKSB7CiAgICBpbml0X2RhdGUoKTsKICAgIGluaXRfdGltZSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvY2VydC5qcwp2YXIgaW5pdF9jZXJ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvY2VydC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvbmV0d29yay9jbmFtZS5qcwp2YXIgSUNuYW1lRGVzY3JpcHRvcjsKdmFyIGluaXRfY25hbWUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvbmV0d29yay9jbmFtZS5qcyIoKSB7CiAgICBpbml0X2NlcnQoKTsKICAgIElDbmFtZURlc2NyaXB0b3IgPSBjbGFzcyB7CiAgICB9OwogICAgOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvZGV2aWNlLmpzCnZhciBpbml0X2RldmljZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9uZXR3b3JrL2RldmljZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvbmV0d29yay9kbnMuanMKdmFyIGluaXRfZG5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvZG5zLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9uZXR3b3JrL2Ruc2NoYWxsZW5nZS5qcwp2YXIgaW5pdF9kbnNjaGFsbGVuZ2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvbmV0d29yay9kbnNjaGFsbGVuZ2UuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvZG9tYWluZGVsZWdhdGlvbi5qcwp2YXIgaW5pdF9kb21haW5kZWxlZ2F0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvZG9tYWluZGVsZWdhdGlvbi5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvbmV0d29yay9qd3QuanMKdmFyIGluaXRfand0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvand0LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9uZXR3b3JrL25ldHdvcmtub2RlLmpzCnZhciBpbml0X25ldHdvcmtub2RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvbmV0d29ya25vZGUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvcmVxdWVzdC5qcwp2YXIgaW5pdF9yZXF1ZXN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvcmVxdWVzdC5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvbmV0d29yay9yZXZlcnNlcHJveHkuanMKdmFyIGluaXRfcmV2ZXJzZXByb3h5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvcmV2ZXJzZXByb3h5LmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9uZXR3b3JrL3NzaC5qcwp2YXIgaW5pdF9zc2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvbmV0d29yay9zc2guanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvaW5kZXguanMKdmFyIG5ldHdvcmtfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChuZXR3b3JrX2V4cG9ydHMsIHsKICBJQ25hbWVEZXNjcmlwdG9yOiAoKSA9PiBJQ25hbWVEZXNjcmlwdG9yCn0pOwp2YXIgaW5pdF9uZXR3b3JrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL25ldHdvcmsvaW5kZXguanMiKCkgewogICAgaW5pdF9jZXJ0KCk7CiAgICBpbml0X2NuYW1lKCk7CiAgICBpbml0X2RldmljZSgpOwogICAgaW5pdF9kbnMoKTsKICAgIGluaXRfZG5zY2hhbGxlbmdlKCk7CiAgICBpbml0X2RvbWFpbmRlbGVnYXRpb24oKTsKICAgIGluaXRfand0KCk7CiAgICBpbml0X25ldHdvcmtub2RlKCk7CiAgICBpbml0X3JlcXVlc3QoKTsKICAgIGluaXRfcmV2ZXJzZXByb3h5KCk7CiAgICBpbml0X3NzaCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL3NhYXMvcHJvZHVjdC5qcwp2YXIgaW5pdF9wcm9kdWN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL3NhYXMvcHJvZHVjdC5qcyIoKSB7CiAgICBpbml0X2NvbXBhbnkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9zYWFzL3N1YnNjcmlwdGlvbnBsYW4uanMKdmFyIGluaXRfc3Vic2NyaXB0aW9ucGxhbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9zYWFzL3N1YnNjcmlwdGlvbnBsYW4uanMiKCkgewogICAgaW5pdF9wcm9kdWN0KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvc2Fhcy9pbmRleC5qcwp2YXIgc2Fhc19leHBvcnRzID0ge307CnZhciBpbml0X3NhYXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvc2Fhcy9pbmRleC5qcyIoKSB7CiAgICBpbml0X3N1YnNjcmlwdGlvbnBsYW4oKTsKICAgIGluaXRfcHJvZHVjdCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL3N0b3JhZ2UvaW5kZXguanMKdmFyIHN0b3JhZ2VfZXhwb3J0cyA9IHt9Owp2YXIgaW5pdF9zdG9yYWdlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL3N0b3JhZ2UvaW5kZXguanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL3dlYnNpdGUvbGluay5qcwp2YXIgaW5pdF9saW5rMyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy93ZWJzaXRlL2xpbmsuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL3dlYnNpdGUvbWVudWl0ZW0uanMKdmFyIGluaXRfbWVudWl0ZW0gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvd2Vic2l0ZS9tZW51aXRlbS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvd2Vic2l0ZS9saW5rYmxvY2suanMKdmFyIGluaXRfbGlua2Jsb2NrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL3dlYnNpdGUvbGlua2Jsb2NrLmpzIigpIHsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy93ZWJzaXRlL2luZGV4LmpzCnZhciB3ZWJzaXRlX2V4cG9ydHMgPSB7fTsKdmFyIGluaXRfd2Vic2l0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy93ZWJzaXRlL2luZGV4LmpzIigpIHsKICAgIGluaXRfbGluazMoKTsKICAgIGluaXRfbWVudWl0ZW0oKTsKICAgIGluaXRfbGlua2Jsb2NrKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDQuNC40L25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvdHlwZWZlc3Qub3duLmpzCnZhciBpbml0X3R5cGVmZXN0X293biA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NANC40LjQvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy90eXBlZmVzdC5vd24uanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMyNyA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMyNywgewogIGJ1c2luZXNzOiAoKSA9PiBidXNpbmVzc19leHBvcnRzLAogIGNvZGU6ICgpID0+IGNvZGVfZXhwb3J0cywKICBjb250YWluZXI6ICgpID0+IGNvbnRhaW5lcl9leHBvcnRzLAogIGNvbnRlbnQ6ICgpID0+IGNvbnRlbnRfZXhwb3J0cywKICBkYXRhYmFzZTogKCkgPT4gZGF0YWJhc2VfZXhwb3J0cywKICBmaW5hbmNlOiAoKSA9PiBmaW5hbmNlX2V4cG9ydHMsCiAgZ2VuZXJhbDogKCkgPT4gZ2VuZXJhbF9leHBvcnRzLAogIG5ldHdvcms6ICgpID0+IG5ldHdvcmtfZXhwb3J0cywKICBzYWFzOiAoKSA9PiBzYWFzX2V4cG9ydHMsCiAgc3RvcmFnZTogKCkgPT4gc3RvcmFnZV9leHBvcnRzLAogIHdlYnNpdGU6ICgpID0+IHdlYnNpdGVfZXhwb3J0cwp9KTsKdmFyIGluaXRfZGlzdF90czI3ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A0LjQuNC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfYnVzaW5lc3MoKTsKICAgIGluaXRfY29kZTMoKTsKICAgIGluaXRfY29udGFpbmVyMigpOwogICAgaW5pdF9kYXRhYmFzZSgpOwogICAgaW5pdF9maW5hbmNlKCk7CiAgICBpbml0X2NvbnRlbnQzKCk7CiAgICBpbml0X2dlbmVyYWwoKTsKICAgIGluaXRfbmV0d29yaygpOwogICAgaW5pdF9zYWFzKCk7CiAgICBpbml0X3N0b3JhZ2UoKTsKICAgIGluaXRfd2Vic2l0ZSgpOwogICAgaW5pdF90eXBlZmVzdF9vd24oKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy93ZWJzZXR1cC5wbHVnaW5zLmpzCnZhciBpbml0X3dlYnNldHVwX3BsdWdpbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAucGx1Z2lucy5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMyNigpOwogICAgaW5pdF9kaXN0X3RzMjUoKTsKICAgIGluaXRfZGlzdF90czI3KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvaW50ZXJmYWNlcy9pbmRleC5qcwp2YXIgaW5pdF9pbnRlcmZhY2VzMyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy9pbnRlcmZhY2VzL2luZGV4LmpzIigpIHsKICAgIGluaXRfd2Vic2V0dXBfcGx1Z2lucygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2Vic2V0dXBAMy4wLjE5L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJzZXR1cC9kaXN0X3RzL3dlYnNldHVwLmNsYXNzZXMudGFnLmpzCnZhciBUYWc7CnZhciBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGFnID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2Vic2V0dXBAMy4wLjE5L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJzZXR1cC9kaXN0X3RzL3dlYnNldHVwLmNsYXNzZXMudGFnLmpzIigpIHsKICAgIGluaXRfd2Vic2V0dXBfcGx1Z2lucygpOwogICAgVGFnID0gY2xhc3MgewogICAgICBhcHBlbmRUb0RvbSgpIHsKICAgICAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5wYXJlbnRFbGVtZW50ICYmICF0aGlzLmVsZW1lbnRSZWYucGFyZW50Tm9kZSkgewogICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnRSZWYpOwogICAgICAgIH0KICAgICAgfQogICAgICByZW1vdmVGcm9tRG9tKCkgewogICAgICAgIGlmICh0aGlzLmVsZW1lbnRSZWYucGFyZW50RWxlbWVudCkgewogICAgICAgICAgdGhpcy5lbGVtZW50UmVmLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50UmVmKTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudFJlZi5wYXJlbnROb2RlKSB7CiAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnRSZWYpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy93ZWJzZXR1cC5jbGFzc2VzLnRhZy5qc29ubGR0YWcuanMKdmFyIEpzb25MZFRhZzsKdmFyIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWdfanNvbmxkdGFnID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3Mrd2Vic2V0dXBAMy4wLjE5L25vZGVfbW9kdWxlcy9AcHVzaC5yb2Nrcy93ZWJzZXR1cC9kaXN0X3RzL3dlYnNldHVwLmNsYXNzZXMudGFnLmpzb25sZHRhZy5qcyIoKSB7CiAgICBpbml0X3dlYnNldHVwX3BsdWdpbnMoKTsKICAgIGluaXRfaW50ZXJmYWNlczMoKTsKICAgIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWcoKTsKICAgIEpzb25MZFRhZyA9IGNsYXNzIF9Kc29uTGRUYWcgZXh0ZW5kcyBUYWcgewogICAgICBzdGF0aWMgY3JlYXRlQ29tcGFueUpzb25MZChjb21wYW55RGF0YUFyZykgewogICAgICAgIGNvbnN0IGNvbXBhbnlMZCA9IHsKICAgICAgICAgICJAY29udGV4dCI6ICJodHRwczovL3NjaGVtYS5vcmciLAogICAgICAgICAgIkB0eXBlIjogIkNvcnBvcmF0aW9uIiwKICAgICAgICAgIG5hbWU6IGNvbXBhbnlEYXRhQXJnLm5hbWUsCiAgICAgICAgICBhbHRlcm5hdGVOYW1lOiBjb21wYW55RGF0YUFyZy5uYW1lLnJlcGxhY2UoIiBHbWJIIiwgIiIpLAogICAgICAgICAgdXJsOiBjb21wYW55RGF0YUFyZy5jb250YWN0LndlYnNpdGUsCiAgICAgICAgICBsb2dvOiBjb21wYW55RGF0YUFyZy5jb250YWN0LmxvZ29VcmwsCiAgICAgICAgICBjb250YWN0UG9pbnQ6IHsKICAgICAgICAgICAgIkB0eXBlIjogIkNvbnRhY3RQb2ludCIsCiAgICAgICAgICAgIHRlbGVwaG9uZTogY29tcGFueURhdGFBcmcuY29udGFjdC5waG9uZSwKICAgICAgICAgICAgY29udGFjdFR5cGU6ICJjdXN0b21lciBzZXJ2aWNlIiwKICAgICAgICAgICAgYXJlYVNlcnZlZDogIkRFIiwKICAgICAgICAgICAgYXZhaWxhYmxlTGFuZ3VhZ2U6IFsiZW4iLCAiR2VybWFuIl0KICAgICAgICAgIH0sCiAgICAgICAgICBzYW1lQXM6IFtdCiAgICAgICAgfTsKICAgICAgICBpZiAoY29tcGFueURhdGFBcmcuY29udGFjdC5mYWNlYm9va1VybCkgewogICAgICAgICAgY29tcGFueUxkLnNhbWVBcy5wdXNoKGNvbXBhbnlEYXRhQXJnLmNvbnRhY3QuZmFjZWJvb2tVcmwpOwogICAgICAgIH0KICAgICAgICBpZiAoY29tcGFueURhdGFBcmcuY29udGFjdC50d2l0dGVyVXJsKSB7CiAgICAgICAgICBjb21wYW55TGQuc2FtZUFzLnB1c2goY29tcGFueURhdGFBcmcuY29udGFjdC50d2l0dGVyVXJsKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGRUYWcgPSBuZXcgX0pzb25MZFRhZyhjb21wYW55TGQpOwogICAgICAgIHJldHVybiBsZFRhZzsKICAgICAgfQogICAgICBzdGF0aWMgY3JlYXRlTmV3c0FydGljbGVKc29uTGQobmV3c0FydGljbGVBcmcpIHsKICAgICAgICBjb25zdCBuZXdzQXJ0aWNsZUxkID0gewogICAgICAgICAgIkBjb250ZXh0IjogImh0dHBzOi8vc2NoZW1hLm9yZyIsCiAgICAgICAgICAiQHR5cGUiOiAiTmV3c0FydGljbGUiLAogICAgICAgICAgbWFpbkVudGl0eU9mUGFnZTogewogICAgICAgICAgICAiQHR5cGUiOiAiV2ViUGFnZSIsCiAgICAgICAgICAgICJAaWQiOiB3aW5kb3cubG9jYXRpb24uaHJlZgogICAgICAgICAgfSwKICAgICAgICAgIGhlYWRsaW5lOiAiQXJ0aWNsZSBoZWFkbGluZSIsCiAgICAgICAgICBpbWFnZTogW25ld3NBcnRpY2xlQXJnLmZlYXR1cmVkSW1hZ2VVcmxdLAogICAgICAgICAgZGF0ZVB1Ymxpc2hlZDogbmV3IERhdGUobmV3c0FydGljbGVBcmcudGltZXN0YW1wKS50b0lTT1N0cmluZygpLAogICAgICAgICAgZGF0ZU1vZGlmaWVkOiBuZXcgRGF0ZShuZXdzQXJ0aWNsZUFyZy50aW1lc3RhbXApLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICBhdXRob3I6IHsKICAgICAgICAgICAgIkB0eXBlIjogIlBlcnNvbiIsCiAgICAgICAgICAgIG5hbWU6IGAke25ld3NBcnRpY2xlQXJnLmF1dGhvci5maXJzdE5hbWV9ICR7bmV3c0FydGljbGVBcmcuYXV0aG9yLnN1ck5hbWV9YAogICAgICAgICAgfSwKICAgICAgICAgIHB1Ymxpc2hlcjogewogICAgICAgICAgICAiQHR5cGUiOiAiT3JnYW5pemF0aW9uIiwKICAgICAgICAgICAgbmFtZTogbmV3c0FydGljbGVBcmcuYXV0aG9yLnN1ck5hbWUsCiAgICAgICAgICAgIGxvZ286IHsKICAgICAgICAgICAgICAiQHR5cGUiOiAiSW1hZ2VPYmplY3QiLAogICAgICAgICAgICAgIHVybDogbmV3c0FydGljbGVBcmcuYXV0aG9yLnN1ck5hbWUKICAgICAgICAgICAgICAvLyBUT0RPCiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBkZXNjcmlwdGlvbjogbmV3c0FydGljbGVBcmcuYXV0aG9yLmZpcnN0TmFtZQogICAgICAgIH07CiAgICAgICAgY29uc3QgbGRUYWcgPSBuZXcgX0pzb25MZFRhZyhuZXdzQXJ0aWNsZUxkKTsKICAgICAgICByZXR1cm4gbGRUYWc7CiAgICAgIH0KICAgICAgc3RhdGljIGNyZWF0ZVByb2R1Y3RKc29uTGQocHJvZHVjdEFyZywgcHVibGlzaGVyQXJnKSB7CiAgICAgICAgY29uc3QgcHJvZHVjdExkID0gewogICAgICAgICAgIkBjb250ZXh0IjogImh0dHBzOi8vc2NoZW1hLm9yZyIsCiAgICAgICAgICAiQHR5cGUiOiAiU29mdHdhcmVBcHBsaWNhdGlvbiIsCiAgICAgICAgICBuYW1lOiBwcm9kdWN0QXJnLm5hbWUsCiAgICAgICAgICBkZXNjcmlwdGlvbjogcHJvZHVjdEFyZy5kZXNjcmlwdGlvbiwKICAgICAgICAgIG9wZXJhdGluZ1N5c3RlbTogcHJvZHVjdEFyZy5vcywKICAgICAgICAgIGFwcGxpY2F0aW9uQ2F0ZWdvcnk6IHByb2R1Y3RBcmcuY2F0ZWdvcnksCiAgICAgICAgICBvZmZlcnM6IHsKICAgICAgICAgICAgIkB0eXBlIjogIk9mZmVyIiwKICAgICAgICAgICAgbmFtZTogIlVzZXItYmFzZWQgUGxhbiIsCiAgICAgICAgICAgIHByaWNlU3BlY2lmaWNhdGlvbjogewogICAgICAgICAgICAgICJAdHlwZSI6ICJQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbiIsCiAgICAgICAgICAgICAgdmFsdWVOYW1lOiAiTnVtYmVyIG9mIFVzZXJzIiwKICAgICAgICAgICAgICB2YWx1ZVJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgICAgIHByaWNlOiAiNC45OSIsCiAgICAgICAgICAgICAgcHJpY2VDdXJyZW5jeTogIkVVUiIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIHB1Ymxpc2hlcjogdGhpcy5jcmVhdGVDb21wYW55SnNvbkxkKHB1Ymxpc2hlckFyZykuZWxlbWVudFJlZi50ZXh0Q29udGVudCwKICAgICAgICAgIHNjcmVlbnNob3Q6ICJodHRwczovL3d3dy5zb2NpYWwuaW8vc2NyZWVuc2hvdC5wbmciLAogICAgICAgICAgdXJsOiAiaHR0cHM6Ly93d3cuc29jaWFsLmlvLyIKICAgICAgICB9OwogICAgICAgIGNvbnN0IGxkVGFnID0gbmV3IF9Kc29uTGRUYWcocHJvZHVjdExkKTsKICAgICAgICByZXR1cm4gbGRUYWc7CiAgICAgIH0KICAgICAgLy8gSU5TVEFOQ0UKICAgICAgY29uc3RydWN0b3IobGRPYmplY3RBcmcpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIGNvbnN0IGpzb25MZEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgICAgICBqc29uTGRFbGVtZW50LnR5cGUgPSAiYXBwbGljYXRpb24vbGQranNvbiI7CiAgICAgICAganNvbkxkRWxlbWVudC50ZXh0ID0gSlNPTi5zdHJpbmdpZnkobGRPYmplY3RBcmcpOwogICAgICAgIHRoaXMuZWxlbWVudFJlZiA9IGpzb25MZEVsZW1lbnQ7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50YWcub3BlbmdyYXBodGFnLmpzCnZhciBPcGVuZ3JhcGhUYWc7CnZhciBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGFnX29wZW5ncmFwaHRhZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy93ZWJzZXR1cC5jbGFzc2VzLnRhZy5vcGVuZ3JhcGh0YWcuanMiKCkgewogICAgaW5pdF93ZWJzZXR1cF9wbHVnaW5zKCk7CiAgICBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGFnKCk7CiAgICBPcGVuZ3JhcGhUYWcgPSBjbGFzcyBfT3BlbmdyYXBoVGFnIGV4dGVuZHMgVGFnIHsKICAgICAgc3RhdGljIGNyZWF0ZU5ld3NBcnRpY2xlT2dUYWdzKG5ld3NBcnRpY2xlQXJnKSB7CiAgICAgICAgY29uc3QgdGFnQXJyYXkgPSBbXTsKICAgICAgICB0YWdBcnJheS5wdXNoKG5ldyBfT3BlbmdyYXBoVGFnKCJvZzp1cmwiLCBuZXdzQXJ0aWNsZUFyZy51cmwpKTsKICAgICAgICB0YWdBcnJheS5wdXNoKG5ldyBfT3BlbmdyYXBoVGFnKCJvZzp0aXRsZSIsIG5ld3NBcnRpY2xlQXJnLnRpdGxlKSk7CiAgICAgICAgdGFnQXJyYXkucHVzaChuZXcgX09wZW5ncmFwaFRhZygib2c6ZGVzY3JpcHRpb24iLCBuZXdzQXJ0aWNsZUFyZy5jb250ZW50KSk7CiAgICAgICAgdGFnQXJyYXkucHVzaChuZXcgX09wZW5ncmFwaFRhZygib2c6aW1hZ2UiLCBuZXdzQXJ0aWNsZUFyZy5mZWF0dXJlZEltYWdlVXJsKSk7CiAgICAgICAgcmV0dXJuIHRhZ0FycmF5OwogICAgICB9CiAgICAgIHN0YXRpYyBjcmVhdGVQcm9kdWN0T2dUYWdzKHByb2R1Y3RBcmcpIHsKICAgICAgICBjb25zdCB0YWdBcnJheSA9IFtdOwogICAgICAgIHRhZ0FycmF5LnB1c2gobmV3IF9PcGVuZ3JhcGhUYWcoIm9nOnVybCIsIGdsb2JhbFRoaXMubG9jYXRpb24uaHJlZikpOwogICAgICAgIHRhZ0FycmF5LnB1c2gobmV3IF9PcGVuZ3JhcGhUYWcoIm9nOnRpdGxlIiwgYCR7cHJvZHVjdEFyZy5uYW1lfSAtICR7cHJvZHVjdEFyZy5zbG9nYW59YCkpOwogICAgICAgIHRhZ0FycmF5LnB1c2gobmV3IF9PcGVuZ3JhcGhUYWcoIm9nOnNpdGVfbmFtZSIsIHByb2R1Y3RBcmcubmFtZSkpOwogICAgICAgIHRhZ0FycmF5LnB1c2gobmV3IF9PcGVuZ3JhcGhUYWcoIm9nOmRlc2NyaXB0aW9uIiwgcHJvZHVjdEFyZy5kZXNjcmlwdGlvbikpOwogICAgICAgIHRhZ0FycmF5LnB1c2gobmV3IF9PcGVuZ3JhcGhUYWcoIm9nOmltYWdlIiwgcHJvZHVjdEFyZy5sb2dvTGluaykpOwogICAgICAgIHJldHVybiB0YWdBcnJheTsKICAgICAgfQogICAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eU5hbWVBcmcsIGNvbnRlbnRBcmcpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIGNvbnN0IG9wZW5HcmFwaEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJtZXRhIik7CiAgICAgICAgb3BlbkdyYXBoRWxlbWVudC5zZXRBdHRyaWJ1dGUoInByb3BlcnR5IiwgcHJvcGVydHlOYW1lQXJnKTsKICAgICAgICBvcGVuR3JhcGhFbGVtZW50LmNvbnRlbnQgPSBjb250ZW50QXJnOwogICAgICAgIHRoaXMuZWxlbWVudFJlZiA9IG9wZW5HcmFwaEVsZW1lbnQ7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50YWdsZXZlbC5qcwp2YXIgVGFnTGV2ZWw7CnZhciBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGFnbGV2ZWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50YWdsZXZlbC5qcyIoKSB7CiAgICBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGFnKCk7CiAgICBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGFnX2pzb25sZHRhZygpOwogICAgaW5pdF93ZWJzZXR1cF9jbGFzc2VzX3RhZ19vcGVuZ3JhcGh0YWcoKTsKICAgIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWdtYW5hZ2VyKCk7CiAgICBpbml0X3dlYnNldHVwX3BsdWdpbnMoKTsKICAgIFRhZ0xldmVsID0gY2xhc3MgewogICAgICBzZXQgdGl0bGUodGl0bGVBcmcpIHsKICAgICAgICB0aGlzLnRpdGxlU3RvcmUgPSB0aXRsZUFyZzsKICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gImVuYWJsZWQiKSB7CiAgICAgICAgICBkb2N1bWVudC50aXRsZSA9IHRoaXMudGl0bGVTdG9yZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZ2V0IHRpdGxlKCkgewogICAgICAgIHJldHVybiB0aGlzLnRpdGxlU3RvcmU7CiAgICAgIH0KICAgICAgY29uc3RydWN0b3IodGFnTWFuYWdlclJlZkFyZywgbGV2ZWxUeXBlKSB7CiAgICAgICAgdGhpcy50YWdzID0gW107CiAgICAgICAgdGhpcy5zdGF0ZSA9ICJkaXNhYmxlZCI7CiAgICAgICAgdGhpcy50YWdNYW5hZ2VyUmVmID0gdGFnTWFuYWdlclJlZkFyZzsKICAgICAgfQogICAgICBhZGRUYWcodGFnQXJnKSB7CiAgICAgICAgaWYgKHRhZ0FyZyBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgICAgICBmb3IgKGNvbnN0IHRhZ0FyZzIgb2YgdGFnQXJnKSB7CiAgICAgICAgICAgIHRoaXMuYWRkVGFnKHRhZ0FyZzIpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnRhZ3MucHVzaCh0YWdBcmcpOwogICAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICJlbmFibGVkIikgewogICAgICAgICAgICB0YWdBcmcuYXBwZW5kVG9Eb20oKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgYXN5bmMgYWRkQ29tcGFueUluZm8oY29tcGFueURhdGFBcmcpIHsKICAgICAgICB0aGlzLmFkZFRhZyhKc29uTGRUYWcuY3JlYXRlQ29tcGFueUpzb25MZChjb21wYW55RGF0YUFyZykpOwogICAgICAgIHRoaXMuYWRkVGFnKG5ldyBPcGVuZ3JhcGhUYWcoIm9nOnR5cGUiLCAiYnVzaW5lc3MuYnVzaW5lc3MiKSk7CiAgICAgICAgdGhpcy5hZGRUYWcobmV3IE9wZW5ncmFwaFRhZygib2c6dGl0bGUiLCBjb21wYW55RGF0YUFyZy5uYW1lKSk7CiAgICAgICAgdGhpcy5hZGRUYWcobmV3IE9wZW5ncmFwaFRhZygib2c6dXJsIiwgY29tcGFueURhdGFBcmcuY29udGFjdC53ZWJzaXRlKSk7CiAgICAgICAgdGhpcy5hZGRUYWcobmV3IE9wZW5ncmFwaFRhZygib2c6aW1hZ2UiLCBjb21wYW55RGF0YUFyZy5jb250YWN0LmxvZ29VcmwpKTsKICAgICAgICB0aGlzLmFkZFRhZyhuZXcgT3BlbmdyYXBoVGFnKCJidXNpbmVzczpjb250YWN0X2RhdGE6c3RyZWV0X2FkZHJlc3MiLCBgJHtjb21wYW55RGF0YUFyZy5jb250YWN0LmFkZHJlc3Muc3RyZWV0TmFtZX0gJHtjb21wYW55RGF0YUFyZy5jb250YWN0LmFkZHJlc3MuaG91c2VOdW1iZXJ9YCkpOwogICAgICAgIHRoaXMuYWRkVGFnKG5ldyBPcGVuZ3JhcGhUYWcoImJ1c2luZXNzOmNvbnRhY3RfZGF0YTpsb2NhbGl0eSIsIGNvbXBhbnlEYXRhQXJnLmNvbnRhY3QuYWRkcmVzcy5wb3N0YWxDb2RlKSk7CiAgICAgICAgdGhpcy5hZGRUYWcobmV3IE9wZW5ncmFwaFRhZygiYnVzaW5lc3M6Y29udGFjdF9kYXRhOnJlZ2lvbiIsIGNvbXBhbnlEYXRhQXJnLmNvbnRhY3QuYWRkcmVzcy5jaXR5KSk7CiAgICAgICAgdGhpcy5hZGRUYWcobmV3IE9wZW5ncmFwaFRhZygiYnVzaW5lc3M6Y29udGFjdF9kYXRhOnBvc3RhbF9jb2RlIiwgY29tcGFueURhdGFBcmcuY29udGFjdC5hZGRyZXNzLnBvc3RhbENvZGUpKTsKICAgICAgICB0aGlzLmFkZFRhZyhuZXcgT3BlbmdyYXBoVGFnKCJidXNpbmVzczpjb250YWN0X2RhdGE6Y291bnRyeV9uYW1lIiwgY29tcGFueURhdGFBcmcuY29udGFjdC5hZGRyZXNzLmNvdW50cnkpKTsKICAgICAgfQogICAgICBhZGROZXdzQXJ0aWNsZUluZm8oYXJ0aWNsZUFyZykgewogICAgICAgIHRoaXMuYWRkVGFnKEpzb25MZFRhZy5jcmVhdGVOZXdzQXJ0aWNsZUpzb25MZChhcnRpY2xlQXJnKSk7CiAgICAgICAgdGhpcy5hZGRUYWcoT3BlbmdyYXBoVGFnLmNyZWF0ZU5ld3NBcnRpY2xlT2dUYWdzKGFydGljbGVBcmcpKTsKICAgICAgfQogICAgICBhZGRQcm9kdWN0SW5mbyhwcm9kdWN0QXJnLCBjb21wYW55QXJnKSB7CiAgICAgICAgdGhpcy5hZGRUYWcoSnNvbkxkVGFnLmNyZWF0ZVByb2R1Y3RKc29uTGQocHJvZHVjdEFyZywgY29tcGFueUFyZykpOwogICAgICAgIHRoaXMuYWRkVGFnKE9wZW5ncmFwaFRhZy5jcmVhdGVQcm9kdWN0T2dUYWdzKHByb2R1Y3RBcmcpKTsKICAgICAgfQogICAgICBhc3luYyBlbmFibGUoKSB7CiAgICAgICAgaWYgKHRoaXMudGl0bGUpIHsKICAgICAgICAgIGRvY3VtZW50LnRpdGxlID0gdGhpcy50aXRsZTsKICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCB0YWdBcmcgb2YgdGhpcy50YWdzKSB7CiAgICAgICAgICB0YWdBcmcuYXBwZW5kVG9Eb20oKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zdGF0ZSA9ICJlbmFibGVkIjsKICAgICAgfQogICAgICBhc3luYyBkaXNhYmxlKCkgewogICAgICAgIGZvciAoY29uc3QgdGFnQXJnIG9mIHRoaXMudGFncykgewogICAgICAgICAgdGFnQXJnLnJlbW92ZUZyb21Eb20oKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zdGF0ZSA9ICJkaXNhYmxlZCI7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50YWcubWV0YXRhZy5qcwp2YXIgTWV0YVRhZzsKdmFyIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWdfbWV0YXRhZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy93ZWJzZXR1cC5jbGFzc2VzLnRhZy5tZXRhdGFnLmpzIigpIHsKICAgIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWcoKTsKICAgIE1ldGFUYWcgPSBjbGFzcyBleHRlbmRzIFRhZyB7CiAgICAgIGNvbnN0cnVjdG9yKG1ldGFOYW1lQXJnLCBjb250ZW50QXJnKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICBjb25zdCBtZXRhRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm1ldGEiKTsKICAgICAgICBtZXRhRWxlbWVudC5uYW1lID0gbWV0YU5hbWVBcmc7CiAgICAgICAgbWV0YUVsZW1lbnQuY29udGVudCA9IGNvbnRlbnRBcmc7CiAgICAgICAgdGhpcy5lbGVtZW50UmVmID0gbWV0YUVsZW1lbnQ7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50YWdtYW5hZ2VyLmpzCnZhciBUYWdNYW5hZ2VyOwp2YXIgaW5pdF93ZWJzZXR1cF9jbGFzc2VzX3RhZ21hbmFnZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50YWdtYW5hZ2VyLmpzIigpIHsKICAgIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWdsZXZlbCgpOwogICAgaW5pdF93ZWJzZXR1cF9wbHVnaW5zKCk7CiAgICBpbml0X2ludGVyZmFjZXMzKCk7CiAgICBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGFnX21ldGF0YWcoKTsKICAgIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWdfanNvbmxkdGFnKCk7CiAgICBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGFnX29wZW5ncmFwaHRhZygpOwogICAgVGFnTWFuYWdlciA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5nbG9iYWxMZXZlbCA9IG5ldyBUYWdMZXZlbCh0aGlzLCAiZ2xvYmFsIik7CiAgICAgICAgdGhpcy5iYXNlTGV2ZWwgPSBuZXcgVGFnTGV2ZWwodGhpcywgImJhc2UiKTsKICAgICAgfQogICAgICBhc3luYyBzZXR1cChtZXRhT2JqZWN0QXJnKSB7CiAgICAgICAgdGhpcy5nbG9iYWxMZXZlbC5hZGRUYWcobmV3IE1ldGFUYWcoImdvb2dsZSIsICJub3RyYW5zbGF0ZSIpKTsKICAgICAgICB0aGlzLmdsb2JhbExldmVsLmFkZFRhZyhuZXcgTWV0YVRhZygicmV2aXNpdC1hZnRlciIsICIxIGRheXMiKSk7CiAgICAgICAgaWYgKG1ldGFPYmplY3RBcmcudHdpdHRlckhhbmRsZSkgewogICAgICAgICAgdGhpcy5nbG9iYWxMZXZlbC5hZGRUYWcobmV3IE1ldGFUYWcoInR3aXR0ZXI6Y2FyZCIsICJzdW1tYXJ5X2xhcmdlX2ltYWdlIikpOwogICAgICAgICAgdGhpcy5nbG9iYWxMZXZlbC5hZGRUYWcobmV3IE1ldGFUYWcoInR3aXR0ZXI6c2l0ZSIsIG1ldGFPYmplY3RBcmcudHdpdHRlckhhbmRsZSkpOwogICAgICAgICAgdGhpcy5nbG9iYWxMZXZlbC5hZGRUYWcobmV3IE1ldGFUYWcoInR3aXR0ZXI6Y3JlYXRvciIsIG1ldGFPYmplY3RBcmcudHdpdHRlckhhbmRsZSkpOwogICAgICAgIH0KICAgICAgICB0aGlzLmJhc2VMZXZlbC50aXRsZSA9IG1ldGFPYmplY3RBcmcudGl0bGU7CiAgICAgICAgaWYgKG1ldGFPYmplY3RBcmcuZGVzY3JpcHRpb24pIHsKICAgICAgICAgIHRoaXMuYmFzZUxldmVsLmFkZFRhZyhuZXcgTWV0YVRhZygiZGVzY3JpcHRpb24iLCBtZXRhT2JqZWN0QXJnLmRlc2NyaXB0aW9uKSk7CiAgICAgICAgfQogICAgICAgIGlmIChtZXRhT2JqZWN0QXJnLmNhbm9uaWNhbERvbWFpbikgewogICAgICAgICAgdGhpcy5iYXNlTGV2ZWwuYWRkVGFnKG5ldyBNZXRhVGFnKCJjYW5vbmljYWwiLCBtZXRhT2JqZWN0QXJnLmNhbm9uaWNhbERvbWFpbikpOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKHRydWUpIHsKICAgICAgICAgIGNhc2UgKG1ldGFPYmplY3RBcmcubGRDb21wYW55ICYmICFtZXRhT2JqZWN0QXJnLmxkUHJvZHVjdCk6CiAgICAgICAgICAgIHRoaXMuYmFzZUxldmVsLmFkZENvbXBhbnlJbmZvKG1ldGFPYmplY3RBcmcubGRDb21wYW55KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICEhbWV0YU9iamVjdEFyZy5sZFByb2R1Y3Q6CiAgICAgICAgICAgIHRoaXMuYmFzZUxldmVsLmFkZFByb2R1Y3RJbmZvKG1ldGFPYmplY3RBcmcubGRQcm9kdWN0LCBtZXRhT2JqZWN0QXJnLmxkQ29tcGFueSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBhd2FpdCB0aGlzLmdsb2JhbExldmVsLmVuYWJsZSgpOwogICAgICAgIHRoaXMuYWN0aXZlTGV2ZWwgPSB0aGlzLmJhc2VMZXZlbDsKICAgICAgICBhd2FpdCB0aGlzLmFjdGl2ZUxldmVsLmVuYWJsZSgpOwogICAgICB9CiAgICAgIGFzeW5jIHNldFN1YlBhZ2VMZXZlbChtZXRhT2JqZWN0QXJnKSB7CiAgICAgICAgY29uc3Qgc3ViUGFnZUxldmVsID0gbmV3IFRhZ0xldmVsKHRoaXMsICJzdWJwYWdlIik7CiAgICAgICAgc3ViUGFnZUxldmVsLnRpdGxlID0gbWV0YU9iamVjdEFyZy50aXRsZTsKICAgICAgICBpZiAobWV0YU9iamVjdEFyZy5kZXNjcmlwdGlvbikgewogICAgICAgICAgc3ViUGFnZUxldmVsLmFkZFRhZyhuZXcgTWV0YVRhZygiZGVzY3JpcHRpb24iLCBtZXRhT2JqZWN0QXJnLmRlc2NyaXB0aW9uKSk7CiAgICAgICAgfQogICAgICAgIGF3YWl0IHRoaXMuYWN0aXZlTGV2ZWwuZGlzYWJsZSgpOwogICAgICAgIHRoaXMuYWN0aXZlTGV2ZWwgPSBzdWJQYWdlTGV2ZWw7CiAgICAgICAgYXdhaXQgdGhpcy5hY3RpdmVMZXZlbC5lbmFibGUoKTsKICAgICAgICByZXR1cm4gc3ViUGFnZUxldmVsOwogICAgICB9CiAgICAgIGFzeW5jIHJldmVydFRvQmFzZUxldmVsKCkgewogICAgICAgIGlmICh0aGlzLmFjdGl2ZUxldmVsICE9PSB0aGlzLmJhc2VMZXZlbCkgewogICAgICAgICAgYXdhaXQgdGhpcy5hY3RpdmVMZXZlbC5kaXNhYmxlKCk7CiAgICAgICAgICB0aGlzLmFjdGl2ZUxldmVsID0gdGhpcy5iYXNlTGV2ZWw7CiAgICAgICAgICBhd2FpdCB0aGlzLmFjdGl2ZUxldmVsLmVuYWJsZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy93ZWJzZXR1cC5jbGFzc2VzLndlYnNldHVwLmpzCnZhciBXZWJTZXR1cDsKdmFyIGluaXRfd2Vic2V0dXBfY2xhc3Nlc193ZWJzZXR1cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy93ZWJzZXR1cC5jbGFzc2VzLndlYnNldHVwLmpzIigpIHsKICAgIGluaXRfd2Vic2V0dXBfcGx1Z2lucygpOwogICAgaW5pdF9pbnRlcmZhY2VzMygpOwogICAgaW5pdF93ZWJzZXR1cF9jbGFzc2VzX3RhZ21hbmFnZXIoKTsKICAgIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWdsZXZlbCgpOwogICAgV2ViU2V0dXAgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKG9wdGlvbnNBcmcpIHsKICAgICAgICB0aGlzLnRhZ01hbmFnZXIgPSBuZXcgVGFnTWFuYWdlcigpOwogICAgICAgIHRoaXMucmVhZHlEZWZlcnJlZCA9IGRpc3RfdHNfZXhwb3J0czI1LmRlZmVyKCk7CiAgICAgICAgdGhpcy5yZWFkeUZvclNtYXJ0c3NyRGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMyNS5kZWZlcigpOwogICAgICAgIHRoaXMucmVhZHlQcm9taXNlID0gdGhpcy5yZWFkeURlZmVycmVkLnByb21pc2U7CiAgICAgICAgdGhpcy5yZWFkeUZvclNtYXJ0c3NyUHJvbWlzZSA9IHRoaXMucmVhZHlGb3JTbWFydHNzckRlZmVycmVkLnByb21pc2U7CiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc0FyZzsKICAgICAgICB0aGlzLnNldHVwKCkudGhlbigoKSA9PiB7CiAgICAgICAgICB0aGlzLnJlYWR5RGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc21hcnRzc3JXYWl0Rm9yUmVhZHlTaWduYWwpIHsKICAgICAgICAgICAgdGhpcy5yZWFkeUZvclNtYXJ0c3NyRGVmZXJyZWQucmVzb2x2ZSgpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBhbiBhc3luYyBzZXR1cCBjYWxsZWQgYnkgdGhlIGNvbnN0cnVjdG9yCiAgICAgICAqLwogICAgICBhc3luYyBzZXR1cChvcHRpb25zQXJnKSB7CiAgICAgICAgaWYgKG9wdGlvbnNBcmcpIHsKICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNBcmc7CiAgICAgICAgfQogICAgICAgIGF3YWl0IHRoaXMudGFnTWFuYWdlci5zZXR1cCh0aGlzLm9wdGlvbnMubWV0YU9iamVjdCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHJldmVydHMgdGhlIGFjdGl2ZSBsZXZlbCBhbmQgcmV0dXJucyB0byB0aGUgYmFzZSBsZXZlbAogICAgICAgKi8KICAgICAgcmV2ZXJ0VG9CYXNlTGV2ZWwoKSB7CiAgICAgICAgdGhpcy50YWdNYW5hZ2VyLnJldmVydFRvQmFzZUxldmVsKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHNldHMgYSBzdWJwYWdlCiAgICAgICAqIEBwYXJhbSBtZXRhT2JqZWN0QXJnCiAgICAgICAqLwogICAgICBhc3luYyBzZXRTdWJMZXZlbChtZXRhT2JqZWN0QXJnKSB7CiAgICAgICAgY29uc3Qgc3ViTGV2ZWwgPSBhd2FpdCB0aGlzLnRhZ01hbmFnZXIuc2V0U3ViUGFnZUxldmVsKG1ldGFPYmplY3RBcmcpOwogICAgICAgIHJldHVybiBzdWJMZXZlbDsKICAgICAgfQogICAgICAvKioKICAgICAgICogZmxhc2hlcyB0aGUgdGl0bGUgd2l0aCB0aGUgZ2l2ZW4gdGV4dAogICAgICAgKiBAcGFyYW0gZmxhc2hUZXh0QXJnCiAgICAgICAqLwogICAgICBmbGFzaFRpdGxlKGZsYXNoVGV4dEFyZykgewogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBpbmZvcm1zIHNtYXJ0c3NyIHRoYXQgdGhlIHBhZ2UgaXMgcmVhZHkgdG8gYmUgcmVuZGVyZWQKICAgICAgICovCiAgICAgIGluZm9ybVJlYWR5Rm9yU21hcnRzc3IoKSB7CiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc21hcnRzc3JXYWl0Rm9yUmVhZHlTaWduYWwpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFlvdSBoYXZlIG5vdCBpbmRpY2F0ZWQgdGhhdCB5b3UgaW5mb3JtIHNtYXJ0c3NyIGJ5IGEgZGVkaWNhdGVkIHNpZ25hbCEgUGxlYXNlIGNvbnNpZGVyIGRvaW5nIHNvIWApOwogICAgICAgIH0KICAgICAgICB0aGlzLnJlYWR5Rm9yU21hcnRzc3JEZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50aXRsZS5qcwp2YXIgVGl0bGU7CnZhciBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGl0bGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaC5yb2Nrcyt3ZWJzZXR1cEAzLjAuMTkvbm9kZV9tb2R1bGVzL0BwdXNoLnJvY2tzL3dlYnNldHVwL2Rpc3RfdHMvd2Vic2V0dXAuY2xhc3Nlcy50aXRsZS5qcyIoKSB7CiAgICBpbml0X3dlYnNldHVwX3BsdWdpbnMoKTsKICAgIFRpdGxlID0gY2xhc3MgewogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMjggPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMjgsIHsKICBKc29uTGRUYWc6ICgpID0+IEpzb25MZFRhZywKICBNZXRhVGFnOiAoKSA9PiBNZXRhVGFnLAogIE9wZW5ncmFwaFRhZzogKCkgPT4gT3BlbmdyYXBoVGFnLAogIFRpdGxlOiAoKSA9PiBUaXRsZSwKICBXZWJTZXR1cDogKCkgPT4gV2ViU2V0dXAKfSk7CnZhciBpbml0X2Rpc3RfdHMyOCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNoLnJvY2tzK3dlYnNldHVwQDMuMC4xOS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3Mvd2Vic2V0dXAvZGlzdF90cy9pbmRleC5qcyIoKSB7CiAgICBpbml0X3dlYnNldHVwX2NsYXNzZXNfd2Vic2V0dXAoKTsKICAgIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWdfbWV0YXRhZygpOwogICAgaW5pdF93ZWJzZXR1cF9jbGFzc2VzX3RhZ19vcGVuZ3JhcGh0YWcoKTsKICAgIGluaXRfd2Vic2V0dXBfY2xhc3Nlc190YWdfanNvbmxkdGFnKCk7CiAgICBpbml0X3dlYnNldHVwX2NsYXNzZXNfdGl0bGUoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wZml4K2xlbmlzQDEuMy4yMC9ub2RlX21vZHVsZXMvQHRlbXBmaXgvbGVuaXMvZGlzdC9sZW5pcy5tanMKZnVuY3Rpb24gY2xhbXAyKG1pbjMsIGlucHV0LCBtYXgzKSB7CiAgcmV0dXJuIE1hdGgubWF4KG1pbjMsIE1hdGgubWluKGlucHV0LCBtYXgzKSk7Cn0KZnVuY3Rpb24gbGVycCh4NCwgeTUsIHQ5KSB7CiAgcmV0dXJuICgxIC0gdDkpICogeDQgKyB0OSAqIHk1Owp9CmZ1bmN0aW9uIGRhbXAoeDQsIHk1LCBsYW1iZGEsIGRlbHRhVGltZSkgewogIHJldHVybiBsZXJwKHg0LCB5NSwgMSAtIE1hdGguZXhwKC1sYW1iZGEgKiBkZWx0YVRpbWUpKTsKfQpmdW5jdGlvbiBtb2R1bG8objEzLCBkNikgewogIHJldHVybiAobjEzICUgZDYgKyBkNikgJSBkNjsKfQpmdW5jdGlvbiBkZWJvdW5jZTIoY2FsbGJhY2ssIGRlbGF5MikgewogIGxldCB0aW1lcjI7CiAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHsKICAgIGxldCBjb250ZXh0MiA9IHRoaXM7CiAgICBjbGVhclRpbWVvdXQodGltZXIyKTsKICAgIHRpbWVyMiA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICB0aW1lcjIgPSB2b2lkIDA7CiAgICAgIGNhbGxiYWNrLmFwcGx5KGNvbnRleHQyLCBhcmdzKTsKICAgIH0sIGRlbGF5Mik7CiAgfTsKfQp2YXIgdmVyc2lvbiwgQW5pbWF0ZSwgRGltZW5zaW9ucywgRW1pdHRlciwgTElORV9IRUlHSFQsIGxpc3RlbmVyT3B0aW9ucywgVmlydHVhbFNjcm9sbCwgZGVmYXVsdEVhc2luZywgTGVuaXM7CnZhciBpbml0X2xlbmlzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrbGVuaXNAMS4zLjIwL25vZGVfbW9kdWxlcy9AdGVtcGZpeC9sZW5pcy9kaXN0L2xlbmlzLm1qcyIoKSB7CiAgICB2ZXJzaW9uID0gIjEuMy4xNyI7CiAgICBBbmltYXRlID0gY2xhc3MgewogICAgICBpc1J1bm5pbmcgPSBmYWxzZTsKICAgICAgdmFsdWUgPSAwOwogICAgICBmcm9tID0gMDsKICAgICAgdG8gPSAwOwogICAgICBjdXJyZW50VGltZSA9IDA7CiAgICAgIC8vIFRoZXNlIGFyZSBpbnN0YW5jaWF0ZWQgaW4gdGhlIGZyb21UbyBtZXRob2QKICAgICAgbGVycDsKICAgICAgZHVyYXRpb247CiAgICAgIGVhc2luZzsKICAgICAgb25VcGRhdGU7CiAgICAgIC8qKgogICAgICAgKiBBZHZhbmNlIHRoZSBhbmltYXRpb24gYnkgdGhlIGdpdmVuIGRlbHRhIHRpbWUKICAgICAgICoKICAgICAgICogQHBhcmFtIGRlbHRhVGltZSAtIFRoZSB0aW1lIGluIHNlY29uZHMgdG8gYWR2YW5jZSB0aGUgYW5pbWF0aW9uCiAgICAgICAqLwogICAgICBhZHZhbmNlKGRlbHRhVGltZSkgewogICAgICAgIGlmICghdGhpcy5pc1J1bm5pbmcpIHJldHVybjsKICAgICAgICBsZXQgY29tcGxldGVkID0gZmFsc2U7CiAgICAgICAgaWYgKHRoaXMuZHVyYXRpb24gJiYgdGhpcy5lYXNpbmcpIHsKICAgICAgICAgIHRoaXMuY3VycmVudFRpbWUgKz0gZGVsdGFUaW1lOwogICAgICAgICAgY29uc3QgbGluZWFyUHJvZ3Jlc3MgPSBjbGFtcDIoMCwgdGhpcy5jdXJyZW50VGltZSAvIHRoaXMuZHVyYXRpb24sIDEpOwogICAgICAgICAgY29tcGxldGVkID0gbGluZWFyUHJvZ3Jlc3MgPj0gMTsKICAgICAgICAgIGNvbnN0IGVhc2VkUHJvZ3Jlc3MgPSBjb21wbGV0ZWQgPyAxIDogdGhpcy5lYXNpbmcobGluZWFyUHJvZ3Jlc3MpOwogICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuZnJvbSArICh0aGlzLnRvIC0gdGhpcy5mcm9tKSAqIGVhc2VkUHJvZ3Jlc3M7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxlcnApIHsKICAgICAgICAgIHRoaXMudmFsdWUgPSBkYW1wKHRoaXMudmFsdWUsIHRoaXMudG8sIHRoaXMubGVycCAqIDYwLCBkZWx0YVRpbWUpOwogICAgICAgICAgaWYgKE1hdGgucm91bmQodGhpcy52YWx1ZSkgPT09IHRoaXMudG8pIHsKICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudG87CiAgICAgICAgICAgIGNvbXBsZXRlZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnRvOwogICAgICAgICAgY29tcGxldGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbXBsZXRlZCkgewogICAgICAgICAgdGhpcy5zdG9wKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMub25VcGRhdGU/Lih0aGlzLnZhbHVlLCBjb21wbGV0ZWQpOwogICAgICB9CiAgICAgIC8qKiBTdG9wIHRoZSBhbmltYXRpb24gKi8KICAgICAgc3RvcCgpIHsKICAgICAgICB0aGlzLmlzUnVubmluZyA9IGZhbHNlOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBTZXQgdXAgdGhlIGFuaW1hdGlvbiBmcm9tIGEgc3RhcnRpbmcgdmFsdWUgdG8gYW4gZW5kaW5nIHZhbHVlCiAgICAgICAqIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgbGVycGluZywgZHVyYXRpb24sIGVhc2luZywgYW5kIG9uVXBkYXRlIGNhbGxiYWNrCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSBmcm9tIC0gVGhlIHN0YXJ0aW5nIHZhbHVlCiAgICAgICAqIEBwYXJhbSB0byAtIFRoZSBlbmRpbmcgdmFsdWUKICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgYW5pbWF0aW9uCiAgICAgICAqLwogICAgICBmcm9tVG8oZnJvbTIsIHRvLCB7IGxlcnA6IGxlcnAyLCBkdXJhdGlvbiwgZWFzaW5nLCBvblN0YXJ0LCBvblVwZGF0ZSB9KSB7CiAgICAgICAgdGhpcy5mcm9tID0gdGhpcy52YWx1ZSA9IGZyb20yOwogICAgICAgIHRoaXMudG8gPSB0bzsKICAgICAgICB0aGlzLmxlcnAgPSBsZXJwMjsKICAgICAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247CiAgICAgICAgdGhpcy5lYXNpbmcgPSBlYXNpbmc7CiAgICAgICAgdGhpcy5jdXJyZW50VGltZSA9IDA7CiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSB0cnVlOwogICAgICAgIG9uU3RhcnQ/LigpOwogICAgICAgIHRoaXMub25VcGRhdGUgPSBvblVwZGF0ZTsKICAgICAgfQogICAgfTsKICAgIERpbWVuc2lvbnMgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKHdyYXBwZXIsIGNvbnRlbnQzLCB7IGF1dG9SZXNpemUgPSB0cnVlLCBkZWJvdW5jZTogZGVib3VuY2VWYWx1ZSA9IDI1MCB9ID0ge30pIHsKICAgICAgICB0aGlzLndyYXBwZXIgPSB3cmFwcGVyOwogICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQzOwogICAgICAgIGlmIChhdXRvUmVzaXplKSB7CiAgICAgICAgICB0aGlzLmRlYm91bmNlZFJlc2l6ZSA9IGRlYm91bmNlMih0aGlzLnJlc2l6ZSwgZGVib3VuY2VWYWx1ZSk7CiAgICAgICAgICBpZiAodGhpcy53cmFwcGVyIGluc3RhbmNlb2YgV2luZG93KSB7CiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCB0aGlzLmRlYm91bmNlZFJlc2l6ZSwgZmFsc2UpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy53cmFwcGVyUmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIodGhpcy5kZWJvdW5jZWRSZXNpemUpOwogICAgICAgICAgICB0aGlzLndyYXBwZXJSZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMud3JhcHBlcik7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmNvbnRlbnRSZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcih0aGlzLmRlYm91bmNlZFJlc2l6ZSk7CiAgICAgICAgICB0aGlzLmNvbnRlbnRSZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuY29udGVudCk7CiAgICAgICAgfQogICAgICAgIHRoaXMucmVzaXplKCk7CiAgICAgIH0KICAgICAgd2lkdGggPSAwOwogICAgICBoZWlnaHQgPSAwOwogICAgICBzY3JvbGxIZWlnaHQgPSAwOwogICAgICBzY3JvbGxXaWR0aCA9IDA7CiAgICAgIC8vIFRoZXNlIGFyZSBpbnN0YW5jaWF0ZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGFzIHRoZXkgbmVlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcHRpb25zCiAgICAgIGRlYm91bmNlZFJlc2l6ZTsKICAgICAgd3JhcHBlclJlc2l6ZU9ic2VydmVyOwogICAgICBjb250ZW50UmVzaXplT2JzZXJ2ZXI7CiAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgdGhpcy53cmFwcGVyUmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTsKICAgICAgICB0aGlzLmNvbnRlbnRSZXNpemVPYnNlcnZlcj8uZGlzY29ubmVjdCgpOwogICAgICAgIGlmICh0aGlzLndyYXBwZXIgPT09IHdpbmRvdyAmJiB0aGlzLmRlYm91bmNlZFJlc2l6ZSkgewogICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIHRoaXMuZGVib3VuY2VkUmVzaXplLCBmYWxzZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlc2l6ZSA9ICgpID0+IHsKICAgICAgICB0aGlzLm9uV3JhcHBlclJlc2l6ZSgpOwogICAgICAgIHRoaXMub25Db250ZW50UmVzaXplKCk7CiAgICAgIH07CiAgICAgIG9uV3JhcHBlclJlc2l6ZSA9ICgpID0+IHsKICAgICAgICBpZiAodGhpcy53cmFwcGVyIGluc3RhbmNlb2YgV2luZG93KSB7CiAgICAgICAgICB0aGlzLndpZHRoID0gd2luZG93LmlubmVyV2lkdGg7CiAgICAgICAgICB0aGlzLmhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMud3JhcHBlci5jbGllbnRXaWR0aDsKICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy53cmFwcGVyLmNsaWVudEhlaWdodDsKICAgICAgICB9CiAgICAgIH07CiAgICAgIG9uQ29udGVudFJlc2l6ZSA9ICgpID0+IHsKICAgICAgICBpZiAodGhpcy53cmFwcGVyIGluc3RhbmNlb2YgV2luZG93KSB7CiAgICAgICAgICB0aGlzLnNjcm9sbEhlaWdodCA9IHRoaXMuY29udGVudC5zY3JvbGxIZWlnaHQ7CiAgICAgICAgICB0aGlzLnNjcm9sbFdpZHRoID0gdGhpcy5jb250ZW50LnNjcm9sbFdpZHRoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnNjcm9sbEhlaWdodCA9IHRoaXMud3JhcHBlci5zY3JvbGxIZWlnaHQ7CiAgICAgICAgICB0aGlzLnNjcm9sbFdpZHRoID0gdGhpcy53cmFwcGVyLnNjcm9sbFdpZHRoOwogICAgICAgIH0KICAgICAgfTsKICAgICAgZ2V0IGxpbWl0KCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB4OiB0aGlzLnNjcm9sbFdpZHRoIC0gdGhpcy53aWR0aCwKICAgICAgICAgIHk6IHRoaXMuc2Nyb2xsSGVpZ2h0IC0gdGhpcy5oZWlnaHQKICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgRW1pdHRlciA9IGNsYXNzIHsKICAgICAgZXZlbnRzID0ge307CiAgICAgIC8qKgogICAgICAgKiBFbWl0IGFuIGV2ZW50IHdpdGggdGhlIGdpdmVuIGRhdGEKICAgICAgICogQHBhcmFtIGV2ZW50IEV2ZW50IG5hbWUKICAgICAgICogQHBhcmFtIGFyZ3MgRGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBoYW5kbGVycwogICAgICAgKi8KICAgICAgZW1pdChldmVudCwgLi4uYXJncykgewogICAgICAgIGxldCBjYWxsYmFja3MgPSB0aGlzLmV2ZW50c1tldmVudF0gfHwgW107CiAgICAgICAgZm9yIChsZXQgaTExID0gMCwgbGVuZ3RoID0gY2FsbGJhY2tzLmxlbmd0aDsgaTExIDwgbGVuZ3RoOyBpMTErKykgewogICAgICAgICAgY2FsbGJhY2tzW2kxMV0/LiguLi5hcmdzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEFkZCBhIGNhbGxiYWNrIHRvIHRoZSBldmVudAogICAgICAgKiBAcGFyYW0gZXZlbnQgRXZlbnQgbmFtZQogICAgICAgKiBAcGFyYW0gY2IgQ2FsbGJhY2sgZnVuY3Rpb24KICAgICAgICogQHJldHVybnMgVW5zdWJzY3JpYmUgZnVuY3Rpb24KICAgICAgICovCiAgICAgIG9uKGV2ZW50LCBjYikgewogICAgICAgIHRoaXMuZXZlbnRzW2V2ZW50XT8ucHVzaChjYikgfHwgKHRoaXMuZXZlbnRzW2V2ZW50XSA9IFtjYl0pOwogICAgICAgIHJldHVybiAoKSA9PiB7CiAgICAgICAgICB0aGlzLmV2ZW50c1tldmVudF0gPSB0aGlzLmV2ZW50c1tldmVudF0/LmZpbHRlcigoaTExKSA9PiBjYiAhPT0gaTExKTsKICAgICAgICB9OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBldmVudAogICAgICAgKiBAcGFyYW0gZXZlbnQgRXZlbnQgbmFtZQogICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24KICAgICAgICovCiAgICAgIG9mZihldmVudCwgY2FsbGJhY2spIHsKICAgICAgICB0aGlzLmV2ZW50c1tldmVudF0gPSB0aGlzLmV2ZW50c1tldmVudF0/LmZpbHRlcigoaTExKSA9PiBjYWxsYmFjayAhPT0gaTExKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogUmVtb3ZlIGFsbCBldmVudCBsaXN0ZW5lcnMgYW5kIGNsZWFuIHVwCiAgICAgICAqLwogICAgICBkZXN0cm95KCkgewogICAgICAgIHRoaXMuZXZlbnRzID0ge307CiAgICAgIH0KICAgIH07CiAgICBMSU5FX0hFSUdIVCA9IDEwMCAvIDY7CiAgICBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IGZhbHNlIH07CiAgICBWaXJ0dWFsU2Nyb2xsID0gY2xhc3MgewogICAgICBjb25zdHJ1Y3RvcihlbGVtZW50NCwgb3B0aW9ucyA9IHsgd2hlZWxNdWx0aXBsaWVyOiAxLCB0b3VjaE11bHRpcGxpZXI6IDEgfSkgewogICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ0OwogICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIHRoaXMub25XaW5kb3dSZXNpemUsIGZhbHNlKTsKICAgICAgICB0aGlzLm9uV2luZG93UmVzaXplKCk7CiAgICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIiwgdGhpcy5vbldoZWVsLCBsaXN0ZW5lck9wdGlvbnMpOwogICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgICAgICAgInRvdWNoc3RhcnQiLAogICAgICAgICAgdGhpcy5vblRvdWNoU3RhcnQsCiAgICAgICAgICBsaXN0ZW5lck9wdGlvbnMKICAgICAgICApOwogICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgICAgICAgInRvdWNobW92ZSIsCiAgICAgICAgICB0aGlzLm9uVG91Y2hNb3ZlLAogICAgICAgICAgbGlzdGVuZXJPcHRpb25zCiAgICAgICAgKTsKICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCB0aGlzLm9uVG91Y2hFbmQsIGxpc3RlbmVyT3B0aW9ucyk7CiAgICAgIH0KICAgICAgdG91Y2hTdGFydCA9IHsKICAgICAgICB4OiAwLAogICAgICAgIHk6IDAKICAgICAgfTsKICAgICAgbGFzdERlbHRhID0gewogICAgICAgIHg6IDAsCiAgICAgICAgeTogMAogICAgICB9OwogICAgICB3aW5kb3cgPSB7CiAgICAgICAgd2lkdGg6IDAsCiAgICAgICAgaGVpZ2h0OiAwCiAgICAgIH07CiAgICAgIGVtaXR0ZXIgPSBuZXcgRW1pdHRlcigpOwogICAgICAvKioKICAgICAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgZ2l2ZW4gZXZlbnQgYW5kIGNhbGxiYWNrCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSBldmVudCBFdmVudCBuYW1lCiAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsYmFjayBmdW5jdGlvbgogICAgICAgKi8KICAgICAgb24oZXZlbnQsIGNhbGxiYWNrKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdHRlci5vbihldmVudCwgY2FsbGJhY2spOwogICAgICB9CiAgICAgIC8qKiBSZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVycyBhbmQgY2xlYW4gdXAgKi8KICAgICAgZGVzdHJveSgpIHsKICAgICAgICB0aGlzLmVtaXR0ZXIuZGVzdHJveSgpOwogICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLCB0aGlzLm9uV2luZG93UmVzaXplLCBmYWxzZSk7CiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndoZWVsIiwgdGhpcy5vbldoZWVsLCBsaXN0ZW5lck9wdGlvbnMpOwogICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKAogICAgICAgICAgInRvdWNoc3RhcnQiLAogICAgICAgICAgdGhpcy5vblRvdWNoU3RhcnQsCiAgICAgICAgICBsaXN0ZW5lck9wdGlvbnMKICAgICAgICApOwogICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKAogICAgICAgICAgInRvdWNobW92ZSIsCiAgICAgICAgICB0aGlzLm9uVG91Y2hNb3ZlLAogICAgICAgICAgbGlzdGVuZXJPcHRpb25zCiAgICAgICAgKTsKICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgICAgICAgICJ0b3VjaGVuZCIsCiAgICAgICAgICB0aGlzLm9uVG91Y2hFbmQsCiAgICAgICAgICBsaXN0ZW5lck9wdGlvbnMKICAgICAgICApOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBFdmVudCBoYW5kbGVyIGZvciAndG91Y2hzdGFydCcgZXZlbnQKICAgICAgICoKICAgICAgICogQHBhcmFtIGV2ZW50IFRvdWNoIGV2ZW50CiAgICAgICAqLwogICAgICBvblRvdWNoU3RhcnQgPSAoZXZlbnQpID0+IHsKICAgICAgICBjb25zdCB7IGNsaWVudFgsIGNsaWVudFkgfSA9IGV2ZW50LnRhcmdldFRvdWNoZXMgPyBldmVudC50YXJnZXRUb3VjaGVzWzBdIDogZXZlbnQ7CiAgICAgICAgdGhpcy50b3VjaFN0YXJ0LnggPSBjbGllbnRYOwogICAgICAgIHRoaXMudG91Y2hTdGFydC55ID0gY2xpZW50WTsKICAgICAgICB0aGlzLmxhc3REZWx0YSA9IHsKICAgICAgICAgIHg6IDAsCiAgICAgICAgICB5OiAwCiAgICAgICAgfTsKICAgICAgICB0aGlzLmVtaXR0ZXIuZW1pdCgic2Nyb2xsIiwgewogICAgICAgICAgZGVsdGFYOiAwLAogICAgICAgICAgZGVsdGFZOiAwLAogICAgICAgICAgZXZlbnQKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgLyoqIEV2ZW50IGhhbmRsZXIgZm9yICd0b3VjaG1vdmUnIGV2ZW50ICovCiAgICAgIG9uVG91Y2hNb3ZlID0gKGV2ZW50KSA9PiB7CiAgICAgICAgY29uc3QgeyBjbGllbnRYLCBjbGllbnRZIH0gPSBldmVudC50YXJnZXRUb3VjaGVzID8gZXZlbnQudGFyZ2V0VG91Y2hlc1swXSA6IGV2ZW50OwogICAgICAgIGNvbnN0IGRlbHRhWCA9IC0oY2xpZW50WCAtIHRoaXMudG91Y2hTdGFydC54KSAqIHRoaXMub3B0aW9ucy50b3VjaE11bHRpcGxpZXI7CiAgICAgICAgY29uc3QgZGVsdGFZID0gLShjbGllbnRZIC0gdGhpcy50b3VjaFN0YXJ0LnkpICogdGhpcy5vcHRpb25zLnRvdWNoTXVsdGlwbGllcjsKICAgICAgICB0aGlzLnRvdWNoU3RhcnQueCA9IGNsaWVudFg7CiAgICAgICAgdGhpcy50b3VjaFN0YXJ0LnkgPSBjbGllbnRZOwogICAgICAgIHRoaXMubGFzdERlbHRhID0gewogICAgICAgICAgeDogZGVsdGFYLAogICAgICAgICAgeTogZGVsdGFZCiAgICAgICAgfTsKICAgICAgICB0aGlzLmVtaXR0ZXIuZW1pdCgic2Nyb2xsIiwgewogICAgICAgICAgZGVsdGFYLAogICAgICAgICAgZGVsdGFZLAogICAgICAgICAgZXZlbnQKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgb25Ub3VjaEVuZCA9IChldmVudCkgPT4gewogICAgICAgIHRoaXMuZW1pdHRlci5lbWl0KCJzY3JvbGwiLCB7CiAgICAgICAgICBkZWx0YVg6IHRoaXMubGFzdERlbHRhLngsCiAgICAgICAgICBkZWx0YVk6IHRoaXMubGFzdERlbHRhLnksCiAgICAgICAgICBldmVudAogICAgICAgIH0pOwogICAgICB9OwogICAgICAvKiogRXZlbnQgaGFuZGxlciBmb3IgJ3doZWVsJyBldmVudCAqLwogICAgICBvbldoZWVsID0gKGV2ZW50KSA9PiB7CiAgICAgICAgbGV0IHsgZGVsdGFYLCBkZWx0YVksIGRlbHRhTW9kZSB9ID0gZXZlbnQ7CiAgICAgICAgY29uc3QgbXVsdGlwbGllclggPSBkZWx0YU1vZGUgPT09IDEgPyBMSU5FX0hFSUdIVCA6IGRlbHRhTW9kZSA9PT0gMiA/IHRoaXMud2luZG93LndpZHRoIDogMTsKICAgICAgICBjb25zdCBtdWx0aXBsaWVyWSA9IGRlbHRhTW9kZSA9PT0gMSA/IExJTkVfSEVJR0hUIDogZGVsdGFNb2RlID09PSAyID8gdGhpcy53aW5kb3cuaGVpZ2h0IDogMTsKICAgICAgICBkZWx0YVggKj0gbXVsdGlwbGllclg7CiAgICAgICAgZGVsdGFZICo9IG11bHRpcGxpZXJZOwogICAgICAgIGRlbHRhWCAqPSB0aGlzLm9wdGlvbnMud2hlZWxNdWx0aXBsaWVyOwogICAgICAgIGRlbHRhWSAqPSB0aGlzLm9wdGlvbnMud2hlZWxNdWx0aXBsaWVyOwogICAgICAgIHRoaXMuZW1pdHRlci5lbWl0KCJzY3JvbGwiLCB7IGRlbHRhWCwgZGVsdGFZLCBldmVudCB9KTsKICAgICAgfTsKICAgICAgb25XaW5kb3dSZXNpemUgPSAoKSA9PiB7CiAgICAgICAgdGhpcy53aW5kb3cgPSB7CiAgICAgICAgICB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsCiAgICAgICAgICBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodAogICAgICAgIH07CiAgICAgIH07CiAgICB9OwogICAgZGVmYXVsdEVhc2luZyA9ICh0OSkgPT4gTWF0aC5taW4oMSwgMS4wMDEgLSBNYXRoLnBvdygyLCAtMTAgKiB0OSkpOwogICAgTGVuaXMgPSBjbGFzcyB7CiAgICAgIF9pc1Njcm9sbGluZyA9IGZhbHNlOwogICAgICAvLyB0cnVlIHdoZW4gc2Nyb2xsIGlzIGFuaW1hdGluZwogICAgICBfaXNTdG9wcGVkID0gZmFsc2U7CiAgICAgIC8vIHRydWUgaWYgdXNlciBzaG91bGQgbm90IGJlIGFibGUgdG8gc2Nyb2xsIC0gZW5hYmxlL2Rpc2FibGUgcHJvZ3JhbW1hdGljYWxseQogICAgICBfaXNMb2NrZWQgPSBmYWxzZTsKICAgICAgLy8gc2FtZSBhcyBpc1N0b3BwZWQgYnV0IGVuYWJsZWQvZGlzYWJsZWQgd2hlbiBzY3JvbGwgcmVhY2hlcyB0YXJnZXQKICAgICAgX3ByZXZlbnROZXh0TmF0aXZlU2Nyb2xsRXZlbnQgPSBmYWxzZTsKICAgICAgX3Jlc2V0VmVsb2NpdHlUaW1lb3V0ID0gbnVsbDsKICAgICAgX3JhZklkID0gbnVsbDsKICAgICAgLyoqCiAgICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB1c2VyIGlzIHRvdWNoaW5nIHRoZSBzY3JlZW4KICAgICAgICovCiAgICAgIGlzVG91Y2hpbmc7CiAgICAgIC8qKgogICAgICAgKiBUaGUgdGltZSBpbiBtcyBzaW5jZSB0aGUgbGVuaXMgaW5zdGFuY2Ugd2FzIGNyZWF0ZWQKICAgICAgICovCiAgICAgIHRpbWUgPSAwOwogICAgICAvKioKICAgICAgICogVXNlciBkYXRhIHRoYXQgd2lsbCBiZSBmb3J3YXJkZWQgdGhyb3VnaCB0aGUgc2Nyb2xsIGV2ZW50CiAgICAgICAqCiAgICAgICAqIEBleGFtcGxlCiAgICAgICAqIGxlbmlzLnNjcm9sbFRvKDEwMCwgewogICAgICAgKiAgIHVzZXJEYXRhOiB7CiAgICAgICAqICAgICBmb286ICdiYXInCiAgICAgICAqICAgfQogICAgICAgKiB9KQogICAgICAgKi8KICAgICAgdXNlckRhdGEgPSB7fTsKICAgICAgLyoqCiAgICAgICAqIFRoZSBsYXN0IHZlbG9jaXR5IG9mIHRoZSBzY3JvbGwKICAgICAgICovCiAgICAgIGxhc3RWZWxvY2l0eSA9IDA7CiAgICAgIC8qKgogICAgICAgKiBUaGUgY3VycmVudCB2ZWxvY2l0eSBvZiB0aGUgc2Nyb2xsCiAgICAgICAqLwogICAgICB2ZWxvY2l0eSA9IDA7CiAgICAgIC8qKgogICAgICAgKiBUaGUgZGlyZWN0aW9uIG9mIHRoZSBzY3JvbGwKICAgICAgICovCiAgICAgIGRpcmVjdGlvbiA9IDA7CiAgICAgIC8qKgogICAgICAgKiBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIGxlbmlzIGluc3RhbmNlCiAgICAgICAqLwogICAgICBvcHRpb25zOwogICAgICAvKioKICAgICAgICogVGhlIHRhcmdldCBzY3JvbGwgdmFsdWUKICAgICAgICovCiAgICAgIHRhcmdldFNjcm9sbDsKICAgICAgLyoqCiAgICAgICAqIFRoZSBhbmltYXRlZCBzY3JvbGwgdmFsdWUKICAgICAgICovCiAgICAgIGFuaW1hdGVkU2Nyb2xsOwogICAgICAvLyBUaGVzZSBhcmUgaW5zdGFuY2lhdGVkIGhlcmUgYXMgdGhleSBkb24ndCBuZWVkIGluZm9ybWF0aW9uIGZyb20gdGhlIG9wdGlvbnMKICAgICAgYW5pbWF0ZSA9IG5ldyBBbmltYXRlKCk7CiAgICAgIGVtaXR0ZXIgPSBuZXcgRW1pdHRlcigpOwogICAgICAvLyBUaGVzZSBhcmUgaW5zdGFuY2lhdGVkIGluIHRoZSBjb25zdHJ1Y3RvciBhcyB0aGV5IG5lZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3B0aW9ucwogICAgICBkaW1lbnNpb25zOwogICAgICAvLyBUaGlzIGlzIG5vdCBwcml2YXRlIGJlY2F1c2UgaXQncyB1c2VkIGluIHRoZSBTbmFwIGNsYXNzCiAgICAgIHZpcnR1YWxTY3JvbGw7CiAgICAgIGNvbnN0cnVjdG9yKHsKICAgICAgICB3cmFwcGVyID0gd2luZG93LAogICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQzID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAogICAgICAgIGV2ZW50c1RhcmdldCA9IHdyYXBwZXIsCiAgICAgICAgc21vb3RoV2hlZWwgPSB0cnVlLAogICAgICAgIHN5bmNUb3VjaCA9IGZhbHNlLAogICAgICAgIHN5bmNUb3VjaExlcnAgPSAwLjA3NSwKICAgICAgICB0b3VjaEluZXJ0aWFFeHBvbmVudCA9IDEuNywKICAgICAgICBkdXJhdGlvbiwKICAgICAgICAvLyBpbiBzZWNvbmRzCiAgICAgICAgZWFzaW5nLAogICAgICAgIGxlcnA6IGxlcnAyID0gMC4xLAogICAgICAgIGluZmluaXRlID0gZmFsc2UsCiAgICAgICAgb3JpZW50YXRpb24gPSAidmVydGljYWwiLAogICAgICAgIC8vIHZlcnRpY2FsLCBob3Jpem9udGFsCiAgICAgICAgZ2VzdHVyZU9yaWVudGF0aW9uID0gb3JpZW50YXRpb24gPT09ICJob3Jpem9udGFsIiA/ICJib3RoIiA6ICJ2ZXJ0aWNhbCIsCiAgICAgICAgLy8gdmVydGljYWwsIGhvcml6b250YWwsIGJvdGgKICAgICAgICB0b3VjaE11bHRpcGxpZXIgPSAxLAogICAgICAgIHdoZWVsTXVsdGlwbGllciA9IDEsCiAgICAgICAgYXV0b1Jlc2l6ZSA9IHRydWUsCiAgICAgICAgcHJldmVudCwKICAgICAgICB2aXJ0dWFsU2Nyb2xsLAogICAgICAgIG92ZXJzY3JvbGwgPSB0cnVlLAogICAgICAgIGF1dG9SYWYgPSBmYWxzZSwKICAgICAgICBhbmNob3JzID0gZmFsc2UsCiAgICAgICAgYXV0b1RvZ2dsZSA9IGZhbHNlLAogICAgICAgIC8vIGh0dHBzOi8vY2FuaXVzZS5jb20vP3NlYXJjaD10cmFuc2l0aW9uLWJlaGF2aW9yCiAgICAgICAgYWxsb3dOZXN0ZWRTY3JvbGwgPSBmYWxzZSwKICAgICAgICAvLyBAdHMtaWdub3JlOiB0aGlzIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgZnV0dXJlCiAgICAgICAgX19leHBlcmltZW50YWxfX25haXZlRGltZW5zaW9ucyA9IGZhbHNlLAogICAgICAgIG5haXZlRGltZW5zaW9ucyA9IF9fZXhwZXJpbWVudGFsX19uYWl2ZURpbWVuc2lvbnMsCiAgICAgICAgc3RvcEluZXJ0aWFPbk5hdmlnYXRlID0gZmFsc2UKICAgICAgfSA9IHt9KSB7CiAgICAgICAgd2luZG93LmxlbmlzVmVyc2lvbiA9IHZlcnNpb247CiAgICAgICAgaWYgKCF3cmFwcGVyIHx8IHdyYXBwZXIgPT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgewogICAgICAgICAgd3JhcHBlciA9IHdpbmRvdzsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBkdXJhdGlvbiA9PT0gIm51bWJlciIgJiYgdHlwZW9mIGVhc2luZyAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgZWFzaW5nID0gZGVmYXVsdEVhc2luZzsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlYXNpbmcgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIGR1cmF0aW9uICE9PSAibnVtYmVyIikgewogICAgICAgICAgZHVyYXRpb24gPSAxOwogICAgICAgIH0KICAgICAgICB0aGlzLm9wdGlvbnMgPSB7CiAgICAgICAgICB3cmFwcGVyLAogICAgICAgICAgY29udGVudDogY29udGVudDMsCiAgICAgICAgICBldmVudHNUYXJnZXQsCiAgICAgICAgICBzbW9vdGhXaGVlbCwKICAgICAgICAgIHN5bmNUb3VjaCwKICAgICAgICAgIHN5bmNUb3VjaExlcnAsCiAgICAgICAgICB0b3VjaEluZXJ0aWFFeHBvbmVudCwKICAgICAgICAgIGR1cmF0aW9uLAogICAgICAgICAgZWFzaW5nLAogICAgICAgICAgbGVycDogbGVycDIsCiAgICAgICAgICBpbmZpbml0ZSwKICAgICAgICAgIGdlc3R1cmVPcmllbnRhdGlvbiwKICAgICAgICAgIG9yaWVudGF0aW9uLAogICAgICAgICAgdG91Y2hNdWx0aXBsaWVyLAogICAgICAgICAgd2hlZWxNdWx0aXBsaWVyLAogICAgICAgICAgYXV0b1Jlc2l6ZSwKICAgICAgICAgIHByZXZlbnQsCiAgICAgICAgICB2aXJ0dWFsU2Nyb2xsLAogICAgICAgICAgb3ZlcnNjcm9sbCwKICAgICAgICAgIGF1dG9SYWYsCiAgICAgICAgICBhbmNob3JzLAogICAgICAgICAgYXV0b1RvZ2dsZSwKICAgICAgICAgIGFsbG93TmVzdGVkU2Nyb2xsLAogICAgICAgICAgbmFpdmVEaW1lbnNpb25zLAogICAgICAgICAgc3RvcEluZXJ0aWFPbk5hdmlnYXRlCiAgICAgICAgfTsKICAgICAgICB0aGlzLmRpbWVuc2lvbnMgPSBuZXcgRGltZW5zaW9ucyh3cmFwcGVyLCBjb250ZW50MywgeyBhdXRvUmVzaXplIH0pOwogICAgICAgIHRoaXMudXBkYXRlQ2xhc3NOYW1lKCk7CiAgICAgICAgdGhpcy50YXJnZXRTY3JvbGwgPSB0aGlzLmFuaW1hdGVkU2Nyb2xsID0gdGhpcy5hY3R1YWxTY3JvbGw7CiAgICAgICAgdGhpcy5vcHRpb25zLndyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgdGhpcy5vbk5hdGl2ZVNjcm9sbCwgZmFsc2UpOwogICAgICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbGVuZCIsIHRoaXMub25TY3JvbGxFbmQsIHsKICAgICAgICAgIGNhcHR1cmU6IHRydWUKICAgICAgICB9KTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFuY2hvcnMgfHwgdGhpcy5vcHRpb25zLnN0b3BJbmVydGlhT25OYXZpZ2F0ZSkgewogICAgICAgICAgdGhpcy5vcHRpb25zLndyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcigKICAgICAgICAgICAgImNsaWNrIiwKICAgICAgICAgICAgdGhpcy5vbkNsaWNrLAogICAgICAgICAgICBmYWxzZQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5vcHRpb25zLndyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcigKICAgICAgICAgICJwb2ludGVyZG93biIsCiAgICAgICAgICB0aGlzLm9uUG9pbnRlckRvd24sCiAgICAgICAgICBmYWxzZQogICAgICAgICk7CiAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsID0gbmV3IFZpcnR1YWxTY3JvbGwoZXZlbnRzVGFyZ2V0LCB7CiAgICAgICAgICB0b3VjaE11bHRpcGxpZXIsCiAgICAgICAgICB3aGVlbE11bHRpcGxpZXIKICAgICAgICB9KTsKICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGwub24oInNjcm9sbCIsIHRoaXMub25WaXJ0dWFsU2Nyb2xsKTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9Ub2dnbGUpIHsKICAgICAgICAgIHRoaXMuY2hlY2tPdmVyZmxvdygpOwogICAgICAgICAgdGhpcy5yb290RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIiwgdGhpcy5vblRyYW5zaXRpb25FbmQsIHsKICAgICAgICAgICAgcGFzc2l2ZTogdHJ1ZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b1JhZikgewogICAgICAgICAgdGhpcy5fcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yYWYpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogRGVzdHJveSB0aGUgbGVuaXMgaW5zdGFuY2UsIHJlbW92ZSBhbGwgZXZlbnQgbGlzdGVuZXJzIGFuZCBjbGVhbiB1cCB0aGUgY2xhc3MgbmFtZQogICAgICAgKi8KICAgICAgZGVzdHJveSgpIHsKICAgICAgICB0aGlzLmVtaXR0ZXIuZGVzdHJveSgpOwogICAgICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoCiAgICAgICAgICAic2Nyb2xsIiwKICAgICAgICAgIHRoaXMub25OYXRpdmVTY3JvbGwsCiAgICAgICAgICBmYWxzZQogICAgICAgICk7CiAgICAgICAgdGhpcy5vcHRpb25zLndyYXBwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsZW5kIiwgdGhpcy5vblNjcm9sbEVuZCwgewogICAgICAgICAgY2FwdHVyZTogdHJ1ZQogICAgICAgIH0pOwogICAgICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoCiAgICAgICAgICAicG9pbnRlcmRvd24iLAogICAgICAgICAgdGhpcy5vblBvaW50ZXJEb3duLAogICAgICAgICAgZmFsc2UKICAgICAgICApOwogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYW5jaG9ycyB8fCB0aGlzLm9wdGlvbnMuc3RvcEluZXJ0aWFPbk5hdmlnYXRlKSB7CiAgICAgICAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5yZW1vdmVFdmVudExpc3RlbmVyKAogICAgICAgICAgICAiY2xpY2siLAogICAgICAgICAgICB0aGlzLm9uQ2xpY2ssCiAgICAgICAgICAgIGZhbHNlCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGwuZGVzdHJveSgpOwogICAgICAgIHRoaXMuZGltZW5zaW9ucy5kZXN0cm95KCk7CiAgICAgICAgdGhpcy5jbGVhblVwQ2xhc3NOYW1lKCk7CiAgICAgICAgaWYgKHRoaXMuX3JhZklkKSB7CiAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yYWZJZCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIG9uKGV2ZW50LCBjYWxsYmFjaykgewogICAgICAgIHJldHVybiB0aGlzLmVtaXR0ZXIub24oZXZlbnQsIGNhbGxiYWNrKTsKICAgICAgfQogICAgICBvZmYoZXZlbnQsIGNhbGxiYWNrKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdHRlci5vZmYoZXZlbnQsIGNhbGxiYWNrKTsKICAgICAgfQogICAgICBvblNjcm9sbEVuZCA9IChlMTEpID0+IHsKICAgICAgICBpZiAoIShlMTEgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHsKICAgICAgICAgIGlmICh0aGlzLmlzU2Nyb2xsaW5nID09PSAic21vb3RoIiB8fCB0aGlzLmlzU2Nyb2xsaW5nID09PSBmYWxzZSkgewogICAgICAgICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICBkaXNwYXRjaFNjcm9sbGVuZEV2ZW50ID0gKCkgPT4gewogICAgICAgIHRoaXMub3B0aW9ucy53cmFwcGVyLmRpc3BhdGNoRXZlbnQoCiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoInNjcm9sbGVuZCIsIHsKICAgICAgICAgICAgYnViYmxlczogdGhpcy5vcHRpb25zLndyYXBwZXIgPT09IHdpbmRvdywKICAgICAgICAgICAgLy8gY2FuY2VsYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGRldGFpbDogewogICAgICAgICAgICAgIGxlbmlzU2Nyb2xsRW5kOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pCiAgICAgICAgKTsKICAgICAgfTsKICAgICAgZ2V0IG92ZXJmbG93KCkgewogICAgICAgIGNvbnN0IHByb3BlcnR5OSA9IHRoaXMuaXNIb3Jpem9udGFsID8gIm92ZXJmbG93LXgiIDogIm92ZXJmbG93LXkiOwogICAgICAgIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKHRoaXMucm9vdEVsZW1lbnQpW3Byb3BlcnR5OV07CiAgICAgIH0KICAgICAgY2hlY2tPdmVyZmxvdygpIHsKICAgICAgICBpZiAoWyJoaWRkZW4iLCAiY2xpcCJdLmluY2x1ZGVzKHRoaXMub3ZlcmZsb3cpKSB7CiAgICAgICAgICB0aGlzLmludGVybmFsU3RvcCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmludGVybmFsU3RhcnQoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgb25UcmFuc2l0aW9uRW5kID0gKGV2ZW50KSA9PiB7CiAgICAgICAgaWYgKGV2ZW50LnByb3BlcnR5TmFtZS5pbmNsdWRlcygib3ZlcmZsb3ciKSkgewogICAgICAgICAgdGhpcy5jaGVja092ZXJmbG93KCk7CiAgICAgICAgfQogICAgICB9OwogICAgICBzZXRTY3JvbGwoc2Nyb2xsKSB7CiAgICAgICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKSB7CiAgICAgICAgICB0aGlzLm9wdGlvbnMud3JhcHBlci5zY3JvbGxUbyh7IGxlZnQ6IHNjcm9sbCwgYmVoYXZpb3I6ICJpbnN0YW50IiB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5vcHRpb25zLndyYXBwZXIuc2Nyb2xsVG8oeyB0b3A6IHNjcm9sbCwgYmVoYXZpb3I6ICJpbnN0YW50IiB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgb25DbGljayA9IChldmVudCkgPT4gewogICAgICAgIGNvbnN0IHBhdGgyID0gZXZlbnQuY29tcG9zZWRQYXRoKCk7CiAgICAgICAgY29uc3QgYW5jaG9yRWxlbWVudHMgPSBwYXRoMi5maWx0ZXIoCiAgICAgICAgICAobm9kZTIpID0+IG5vZGUyIGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgbm9kZTIuZ2V0QXR0cmlidXRlKCJocmVmIikKICAgICAgICApOwogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYW5jaG9ycykgewogICAgICAgICAgY29uc3QgYW5jaG9yID0gYW5jaG9yRWxlbWVudHMuZmluZCgKICAgICAgICAgICAgKG5vZGUyKSA9PiBub2RlMi5nZXRBdHRyaWJ1dGUoImhyZWYiKT8uaW5jbHVkZXMoIiMiKQogICAgICAgICAgKTsKICAgICAgICAgIGlmIChhbmNob3IpIHsKICAgICAgICAgICAgY29uc3QgaHJlZiA9IGFuY2hvci5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICAgICAgICAgICAgaWYgKGhyZWYpIHsKICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gdHlwZW9mIHRoaXMub3B0aW9ucy5hbmNob3JzID09PSAib2JqZWN0IiAmJiB0aGlzLm9wdGlvbnMuYW5jaG9ycyA/IHRoaXMub3B0aW9ucy5hbmNob3JzIDogdm9pZCAwOwogICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGAjJHtocmVmLnNwbGl0KCIjIilbMV19YDsKICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvKHRhcmdldCwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zdG9wSW5lcnRpYU9uTmF2aWdhdGUpIHsKICAgICAgICAgIGNvbnN0IGludGVybmFsTGluayA9IGFuY2hvckVsZW1lbnRzLmZpbmQoCiAgICAgICAgICAgIChub2RlMikgPT4gbm9kZTIuaG9zdCA9PT0gd2luZG93LmxvY2F0aW9uLmhvc3QKICAgICAgICAgICk7CiAgICAgICAgICBpZiAoaW50ZXJuYWxMaW5rKSB7CiAgICAgICAgICAgIHRoaXMucmVzZXQoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CiAgICAgIG9uUG9pbnRlckRvd24gPSAoZXZlbnQpID0+IHsKICAgICAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAxKSB7CiAgICAgICAgICB0aGlzLnJlc2V0KCk7CiAgICAgICAgfQogICAgICB9OwogICAgICBvblZpcnR1YWxTY3JvbGwgPSAoZGF0YSkgPT4gewogICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnZpcnR1YWxTY3JvbGwgPT09ICJmdW5jdGlvbiIgJiYgdGhpcy5vcHRpb25zLnZpcnR1YWxTY3JvbGwoZGF0YSkgPT09IGZhbHNlKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNvbnN0IHsgZGVsdGFYLCBkZWx0YVksIGV2ZW50IH0gPSBkYXRhOwogICAgICAgIHRoaXMuZW1pdHRlci5lbWl0KCJ2aXJ0dWFsLXNjcm9sbCIsIHsgZGVsdGFYLCBkZWx0YVksIGV2ZW50IH0pOwogICAgICAgIGlmIChldmVudC5jdHJsS2V5KSByZXR1cm47CiAgICAgICAgaWYgKGV2ZW50LmxlbmlzU3RvcFByb3BhZ2F0aW9uKSByZXR1cm47CiAgICAgICAgY29uc3QgaXNUb3VjaCA9IGV2ZW50LnR5cGUuaW5jbHVkZXMoInRvdWNoIik7CiAgICAgICAgY29uc3QgaXNXaGVlbCA9IGV2ZW50LnR5cGUuaW5jbHVkZXMoIndoZWVsIik7CiAgICAgICAgdGhpcy5pc1RvdWNoaW5nID0gZXZlbnQudHlwZSA9PT0gInRvdWNoc3RhcnQiIHx8IGV2ZW50LnR5cGUgPT09ICJ0b3VjaG1vdmUiOwogICAgICAgIGNvbnN0IGlzQ2xpY2tPclRhcCA9IGRlbHRhWCA9PT0gMCAmJiBkZWx0YVkgPT09IDA7CiAgICAgICAgY29uc3QgaXNUYXBUb1N0b3AgPSB0aGlzLm9wdGlvbnMuc3luY1RvdWNoICYmIGlzVG91Y2ggJiYgZXZlbnQudHlwZSA9PT0gInRvdWNoc3RhcnQiICYmIGlzQ2xpY2tPclRhcCAmJiAhdGhpcy5pc1N0b3BwZWQgJiYgIXRoaXMuaXNMb2NrZWQ7CiAgICAgICAgaWYgKGlzVGFwVG9TdG9wKSB7CiAgICAgICAgICB0aGlzLnJlc2V0KCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IGlzVW5rbm93bkdlc3R1cmUgPSB0aGlzLm9wdGlvbnMuZ2VzdHVyZU9yaWVudGF0aW9uID09PSAidmVydGljYWwiICYmIGRlbHRhWSA9PT0gMCB8fCB0aGlzLm9wdGlvbnMuZ2VzdHVyZU9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgJiYgZGVsdGFYID09PSAwOwogICAgICAgIGlmIChpc0NsaWNrT3JUYXAgfHwgaXNVbmtub3duR2VzdHVyZSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsZXQgY29tcG9zZWRQYXRoID0gZXZlbnQuY29tcG9zZWRQYXRoKCk7CiAgICAgICAgY29tcG9zZWRQYXRoID0gY29tcG9zZWRQYXRoLnNsaWNlKDAsIGNvbXBvc2VkUGF0aC5pbmRleE9mKHRoaXMucm9vdEVsZW1lbnQpKTsKICAgICAgICBjb25zdCBwcmV2ZW50ID0gdGhpcy5vcHRpb25zLnByZXZlbnQ7CiAgICAgICAgaWYgKCEhY29tcG9zZWRQYXRoLmZpbmQoCiAgICAgICAgICAobm9kZTIpID0+IG5vZGUyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgKHR5cGVvZiBwcmV2ZW50ID09PSAiZnVuY3Rpb24iICYmIHByZXZlbnQ/Lihub2RlMikgfHwgbm9kZTIuaGFzQXR0cmlidXRlPy4oImRhdGEtbGVuaXMtcHJldmVudCIpIHx8IGlzVG91Y2ggJiYgbm9kZTIuaGFzQXR0cmlidXRlPy4oImRhdGEtbGVuaXMtcHJldmVudC10b3VjaCIpIHx8IGlzV2hlZWwgJiYgbm9kZTIuaGFzQXR0cmlidXRlPy4oImRhdGEtbGVuaXMtcHJldmVudC13aGVlbCIpIHx8IHRoaXMub3B0aW9ucy5hbGxvd05lc3RlZFNjcm9sbCAmJiB0aGlzLmNoZWNrTmVzdGVkU2Nyb2xsKG5vZGUyLCB7IGRlbHRhWCwgZGVsdGFZIH0pKQogICAgICAgICkpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkIHx8IHRoaXMuaXNMb2NrZWQpIHsKICAgICAgICAgIGlmIChldmVudC5jYW5jZWxhYmxlKSB7CiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IGlzU21vb3RoID0gdGhpcy5vcHRpb25zLnN5bmNUb3VjaCAmJiBpc1RvdWNoIHx8IHRoaXMub3B0aW9ucy5zbW9vdGhXaGVlbCAmJiBpc1doZWVsOwogICAgICAgIGlmICghaXNTbW9vdGgpIHsKICAgICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSAibmF0aXZlIjsKICAgICAgICAgIHRoaXMuYW5pbWF0ZS5zdG9wKCk7CiAgICAgICAgICBldmVudC5sZW5pc1N0b3BQcm9wYWdhdGlvbiA9IHRydWU7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCBkZWx0YSA9IGRlbHRhWTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLmdlc3R1cmVPcmllbnRhdGlvbiA9PT0gImJvdGgiKSB7CiAgICAgICAgICBkZWx0YSA9IE1hdGguYWJzKGRlbHRhWSkgPiBNYXRoLmFicyhkZWx0YVgpID8gZGVsdGFZIDogZGVsdGFYOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmdlc3R1cmVPcmllbnRhdGlvbiA9PT0gImhvcml6b250YWwiKSB7CiAgICAgICAgICBkZWx0YSA9IGRlbHRhWDsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMub3ZlcnNjcm9sbCB8fCB0aGlzLm9wdGlvbnMuaW5maW5pdGUgfHwgdGhpcy5vcHRpb25zLndyYXBwZXIgIT09IHdpbmRvdyAmJiB0aGlzLmxpbWl0ID4gMCAmJiAodGhpcy5hbmltYXRlZFNjcm9sbCA+IDAgJiYgdGhpcy5hbmltYXRlZFNjcm9sbCA8IHRoaXMubGltaXQgfHwgdGhpcy5hbmltYXRlZFNjcm9sbCA9PT0gMCAmJiBkZWx0YVkgPiAwIHx8IHRoaXMuYW5pbWF0ZWRTY3JvbGwgPT09IHRoaXMubGltaXQgJiYgZGVsdGFZIDwgMCkpIHsKICAgICAgICAgIGV2ZW50LmxlbmlzU3RvcFByb3BhZ2F0aW9uID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGV2ZW50LmNhbmNlbGFibGUpIHsKICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGlzU3luY1RvdWNoID0gaXNUb3VjaCAmJiB0aGlzLm9wdGlvbnMuc3luY1RvdWNoOwogICAgICAgIGNvbnN0IGlzVG91Y2hFbmQgPSBpc1RvdWNoICYmIGV2ZW50LnR5cGUgPT09ICJ0b3VjaGVuZCI7CiAgICAgICAgY29uc3QgaGFzVG91Y2hJbmVydGlhID0gaXNUb3VjaEVuZDsKICAgICAgICBpZiAoaGFzVG91Y2hJbmVydGlhKSB7CiAgICAgICAgICBkZWx0YSA9IE1hdGguc2lnbih0aGlzLnZlbG9jaXR5KSAqIE1hdGgucG93KE1hdGguYWJzKHRoaXMudmVsb2NpdHkpLCB0aGlzLm9wdGlvbnMudG91Y2hJbmVydGlhRXhwb25lbnQpOwogICAgICAgIH0KICAgICAgICB0aGlzLnNjcm9sbFRvKHRoaXMudGFyZ2V0U2Nyb2xsICsgZGVsdGEsIHsKICAgICAgICAgIHByb2dyYW1tYXRpYzogZmFsc2UsCiAgICAgICAgICAuLi5pc1N5bmNUb3VjaCA/IHsKICAgICAgICAgICAgbGVycDogaGFzVG91Y2hJbmVydGlhID8gdGhpcy5vcHRpb25zLnN5bmNUb3VjaExlcnAgOiAxCiAgICAgICAgICB9IDogewogICAgICAgICAgICBsZXJwOiB0aGlzLm9wdGlvbnMubGVycCwKICAgICAgICAgICAgZHVyYXRpb246IHRoaXMub3B0aW9ucy5kdXJhdGlvbiwKICAgICAgICAgICAgZWFzaW5nOiB0aGlzLm9wdGlvbnMuZWFzaW5nCiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIC8qKgogICAgICAgKiBGb3JjZSBsZW5pcyB0byByZWNhbGN1bGF0ZSB0aGUgZGltZW5zaW9ucwogICAgICAgKi8KICAgICAgcmVzaXplKCkgewogICAgICAgIHRoaXMuZGltZW5zaW9ucy5yZXNpemUoKTsKICAgICAgICB0aGlzLmFuaW1hdGVkU2Nyb2xsID0gdGhpcy50YXJnZXRTY3JvbGwgPSB0aGlzLmFjdHVhbFNjcm9sbDsKICAgICAgICB0aGlzLmVtaXQoKTsKICAgICAgfQogICAgICBlbWl0KCkgewogICAgICAgIHRoaXMuZW1pdHRlci5lbWl0KCJzY3JvbGwiLCB0aGlzKTsKICAgICAgfQogICAgICBvbk5hdGl2ZVNjcm9sbCA9ICgpID0+IHsKICAgICAgICBpZiAodGhpcy5fcmVzZXRWZWxvY2l0eVRpbWVvdXQgIT09IG51bGwpIHsKICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9yZXNldFZlbG9jaXR5VGltZW91dCk7CiAgICAgICAgICB0aGlzLl9yZXNldFZlbG9jaXR5VGltZW91dCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9wcmV2ZW50TmV4dE5hdGl2ZVNjcm9sbEV2ZW50KSB7CiAgICAgICAgICB0aGlzLl9wcmV2ZW50TmV4dE5hdGl2ZVNjcm9sbEV2ZW50ID0gZmFsc2U7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmlzU2Nyb2xsaW5nID09PSBmYWxzZSB8fCB0aGlzLmlzU2Nyb2xsaW5nID09PSAibmF0aXZlIikgewogICAgICAgICAgY29uc3QgbGFzdFNjcm9sbCA9IHRoaXMuYW5pbWF0ZWRTY3JvbGw7CiAgICAgICAgICB0aGlzLmFuaW1hdGVkU2Nyb2xsID0gdGhpcy50YXJnZXRTY3JvbGwgPSB0aGlzLmFjdHVhbFNjcm9sbDsKICAgICAgICAgIHRoaXMubGFzdFZlbG9jaXR5ID0gdGhpcy52ZWxvY2l0eTsKICAgICAgICAgIHRoaXMudmVsb2NpdHkgPSB0aGlzLmFuaW1hdGVkU2Nyb2xsIC0gbGFzdFNjcm9sbDsKICAgICAgICAgIHRoaXMuZGlyZWN0aW9uID0gTWF0aC5zaWduKAogICAgICAgICAgICB0aGlzLmFuaW1hdGVkU2Nyb2xsIC0gbGFzdFNjcm9sbAogICAgICAgICAgKTsKICAgICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgdGhpcy5pc1Njcm9sbGluZyA9ICJuYXRpdmUiOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5lbWl0KCk7CiAgICAgICAgICBpZiAodGhpcy52ZWxvY2l0eSAhPT0gMCkgewogICAgICAgICAgICB0aGlzLl9yZXNldFZlbG9jaXR5VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgIHRoaXMubGFzdFZlbG9jaXR5ID0gdGhpcy52ZWxvY2l0eTsKICAgICAgICAgICAgICB0aGlzLnZlbG9jaXR5ID0gMDsKICAgICAgICAgICAgICB0aGlzLmlzU2Nyb2xsaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgdGhpcy5lbWl0KCk7CiAgICAgICAgICAgIH0sIDQwMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICByZXNldCgpIHsKICAgICAgICB0aGlzLmlzTG9ja2VkID0gZmFsc2U7CiAgICAgICAgdGhpcy5pc1Njcm9sbGluZyA9IGZhbHNlOwogICAgICAgIHRoaXMuYW5pbWF0ZWRTY3JvbGwgPSB0aGlzLnRhcmdldFNjcm9sbCA9IHRoaXMuYWN0dWFsU2Nyb2xsOwogICAgICAgIHRoaXMubGFzdFZlbG9jaXR5ID0gdGhpcy52ZWxvY2l0eSA9IDA7CiAgICAgICAgdGhpcy5hbmltYXRlLnN0b3AoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogU3RhcnQgbGVuaXMgc2Nyb2xsIGFmdGVyIGl0IGhhcyBiZWVuIHN0b3BwZWQKICAgICAgICovCiAgICAgIHN0YXJ0KCkgewogICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHJldHVybjsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9Ub2dnbGUpIHsKICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoIm92ZXJmbG93Iik7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuaW50ZXJuYWxTdGFydCgpOwogICAgICB9CiAgICAgIGludGVybmFsU3RhcnQoKSB7CiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkgcmV0dXJuOwogICAgICAgIHRoaXMucmVzZXQoKTsKICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuZW1pdCgpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBTdG9wIGxlbmlzIHNjcm9sbAogICAgICAgKi8KICAgICAgc3RvcCgpIHsKICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHJldHVybjsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9Ub2dnbGUpIHsKICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoIm92ZXJmbG93IiwgImNsaXAiKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5pbnRlcm5hbFN0b3AoKTsKICAgICAgfQogICAgICBpbnRlcm5hbFN0b3AoKSB7CiAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSByZXR1cm47CiAgICAgICAgdGhpcy5yZXNldCgpOwogICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgICB0aGlzLmVtaXQoKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogUmVxdWVzdEFuaW1hdGlvbkZyYW1lIGZvciBsZW5pcwogICAgICAgKgogICAgICAgKiBAcGFyYW0gdGltZSBUaGUgdGltZSBpbiBtcyBmcm9tIGFuIGV4dGVybmFsIGNsb2NrIGxpa2UgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAgb3IgVGVtcHVzCiAgICAgICAqLwogICAgICByYWYgPSAodGltZSkgPT4gewogICAgICAgIGNvbnN0IGRlbHRhVGltZSA9IHRpbWUgLSAodGhpcy50aW1lIHx8IHRpbWUpOwogICAgICAgIHRoaXMudGltZSA9IHRpbWU7CiAgICAgICAgdGhpcy5hbmltYXRlLmFkdmFuY2UoZGVsdGFUaW1lICogMWUtMyk7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvUmFmKSB7CiAgICAgICAgICB0aGlzLl9yYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnJhZik7CiAgICAgICAgfQogICAgICB9OwogICAgICAvKioKICAgICAgICogU2Nyb2xsIHRvIGEgdGFyZ2V0IHZhbHVlCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCB2YWx1ZSB0byBzY3JvbGwgdG8KICAgICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoZSBzY3JvbGwKICAgICAgICoKICAgICAgICogQGV4YW1wbGUKICAgICAgICogbGVuaXMuc2Nyb2xsVG8oMTAwLCB7CiAgICAgICAqICAgb2Zmc2V0OiAxMDAsCiAgICAgICAqICAgZHVyYXRpb246IDEsCiAgICAgICAqICAgZWFzaW5nOiAodCkgPT4gMSAtIE1hdGguY29zKCh0ICogTWF0aC5QSSkgLyAyKSwKICAgICAgICogICBsZXJwOiAwLjEsCiAgICAgICAqICAgb25TdGFydDogKCkgPT4gewogICAgICAgKiAgICAgY29uc29sZS5sb2coJ29uU3RhcnQnKQogICAgICAgKiAgIH0sCiAgICAgICAqICAgb25Db21wbGV0ZTogKCkgPT4gewogICAgICAgKiAgICAgY29uc29sZS5sb2coJ29uQ29tcGxldGUnKQogICAgICAgKiAgIH0sCiAgICAgICAqIH0pCiAgICAgICAqLwogICAgICBzY3JvbGxUbyh0YXJnZXQsIHsKICAgICAgICBvZmZzZXQgPSAwLAogICAgICAgIGltbWVkaWF0ZSA9IGZhbHNlLAogICAgICAgIGxvY2sgPSBmYWxzZSwKICAgICAgICBwcm9ncmFtbWF0aWMgPSB0cnVlLAogICAgICAgIC8vIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIGNsYXNzCiAgICAgICAgbGVycDogbGVycDIgPSBwcm9ncmFtbWF0aWMgPyB0aGlzLm9wdGlvbnMubGVycCA6IHZvaWQgMCwKICAgICAgICBkdXJhdGlvbiA9IHByb2dyYW1tYXRpYyA/IHRoaXMub3B0aW9ucy5kdXJhdGlvbiA6IHZvaWQgMCwKICAgICAgICBlYXNpbmcgPSBwcm9ncmFtbWF0aWMgPyB0aGlzLm9wdGlvbnMuZWFzaW5nIDogdm9pZCAwLAogICAgICAgIG9uU3RhcnQsCiAgICAgICAgb25Db21wbGV0ZSwKICAgICAgICBmb3JjZSA9IGZhbHNlLAogICAgICAgIC8vIHNjcm9sbCBldmVuIGlmIHN0b3BwZWQKICAgICAgICB1c2VyRGF0YQogICAgICB9ID0ge30pIHsKICAgICAgICBpZiAoKHRoaXMuaXNTdG9wcGVkIHx8IHRoaXMuaXNMb2NrZWQpICYmICFmb3JjZSkgcmV0dXJuOwogICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAic3RyaW5nIiAmJiBbInRvcCIsICJsZWZ0IiwgInN0YXJ0IiwgIiMiXS5pbmNsdWRlcyh0YXJnZXQpKSB7CiAgICAgICAgICB0YXJnZXQgPSAwOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRhcmdldCA9PT0gInN0cmluZyIgJiYgWyJib3R0b20iLCAicmlnaHQiLCAiZW5kIl0uaW5jbHVkZXModGFyZ2V0KSkgewogICAgICAgICAgdGFyZ2V0ID0gdGhpcy5saW1pdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGV0IG5vZGUyOwogICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIG5vZGUyID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpOwogICAgICAgICAgICBpZiAoIW5vZGUyKSB7CiAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PT0gIiN0b3AiKSB7CiAgICAgICAgICAgICAgICB0YXJnZXQgPSAwOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oIkxlbmlzOiBUYXJnZXQgbm90IGZvdW5kIiwgdGFyZ2V0KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0Py5ub2RlVHlwZSkgewogICAgICAgICAgICBub2RlMiA9IHRhcmdldDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChub2RlMikgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLndyYXBwZXIgIT09IHdpbmRvdykgewogICAgICAgICAgICAgIGNvbnN0IHdyYXBwZXJSZWN0ID0gdGhpcy5yb290RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgICBvZmZzZXQgLT0gdGhpcy5pc0hvcml6b250YWwgPyB3cmFwcGVyUmVjdC5sZWZ0IDogd3JhcHBlclJlY3QudG9wOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBub2RlMi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgdGFyZ2V0ID0gKHRoaXMuaXNIb3Jpem9udGFsID8gcmVjdC5sZWZ0IDogcmVjdC50b3ApICsgdGhpcy5hbmltYXRlZFNjcm9sbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXQgIT09ICJudW1iZXIiKSByZXR1cm47CiAgICAgICAgdGFyZ2V0ICs9IG9mZnNldDsKICAgICAgICB0YXJnZXQgPSBNYXRoLnJvdW5kKHRhcmdldCk7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbmZpbml0ZSkgewogICAgICAgICAgaWYgKHByb2dyYW1tYXRpYykgewogICAgICAgICAgICB0aGlzLnRhcmdldFNjcm9sbCA9IHRoaXMuYW5pbWF0ZWRTY3JvbGwgPSB0aGlzLnNjcm9sbDsKICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSB0YXJnZXQgLSB0aGlzLmFuaW1hdGVkU2Nyb2xsOwogICAgICAgICAgICBpZiAoZGlzdGFuY2UgPiB0aGlzLmxpbWl0IC8gMikgewogICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldCAtIHRoaXMubGltaXQ7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlzdGFuY2UgPCAtdGhpcy5saW1pdCAvIDIpIHsKICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQgKyB0aGlzLmxpbWl0OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRhcmdldCA9IGNsYW1wMigwLCB0YXJnZXQsIHRoaXMubGltaXQpOwogICAgICAgIH0KICAgICAgICBpZiAodGFyZ2V0ID09PSB0aGlzLnRhcmdldFNjcm9sbCkgewogICAgICAgICAgb25TdGFydD8uKHRoaXMpOwogICAgICAgICAgb25Db21wbGV0ZT8uKHRoaXMpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLnVzZXJEYXRhID0gdXNlckRhdGEgPz8ge307CiAgICAgICAgaWYgKGltbWVkaWF0ZSkgewogICAgICAgICAgdGhpcy5hbmltYXRlZFNjcm9sbCA9IHRoaXMudGFyZ2V0U2Nyb2xsID0gdGFyZ2V0OwogICAgICAgICAgdGhpcy5zZXRTY3JvbGwodGhpcy5zY3JvbGwpOwogICAgICAgICAgdGhpcy5yZXNldCgpOwogICAgICAgICAgdGhpcy5wcmV2ZW50TmV4dE5hdGl2ZVNjcm9sbEV2ZW50KCk7CiAgICAgICAgICB0aGlzLmVtaXQoKTsKICAgICAgICAgIG9uQ29tcGxldGU/Lih0aGlzKTsKICAgICAgICAgIHRoaXMudXNlckRhdGEgPSB7fTsKICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hTY3JvbGxlbmRFdmVudCgpOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICghcHJvZ3JhbW1hdGljKSB7CiAgICAgICAgICB0aGlzLnRhcmdldFNjcm9sbCA9IHRhcmdldDsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBkdXJhdGlvbiA9PT0gIm51bWJlciIgJiYgdHlwZW9mIGVhc2luZyAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgZWFzaW5nID0gZGVmYXVsdEVhc2luZzsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlYXNpbmcgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIGR1cmF0aW9uICE9PSAibnVtYmVyIikgewogICAgICAgICAgZHVyYXRpb24gPSAxOwogICAgICAgIH0KICAgICAgICB0aGlzLmFuaW1hdGUuZnJvbVRvKHRoaXMuYW5pbWF0ZWRTY3JvbGwsIHRhcmdldCwgewogICAgICAgICAgZHVyYXRpb24sCiAgICAgICAgICBlYXNpbmcsCiAgICAgICAgICBsZXJwOiBsZXJwMiwKICAgICAgICAgIG9uU3RhcnQ6ICgpID0+IHsKICAgICAgICAgICAgaWYgKGxvY2spIHRoaXMuaXNMb2NrZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLmlzU2Nyb2xsaW5nID0gInNtb290aCI7CiAgICAgICAgICAgIG9uU3RhcnQ/Lih0aGlzKTsKICAgICAgICAgIH0sCiAgICAgICAgICBvblVwZGF0ZTogKHZhbHVlMiwgY29tcGxldGVkKSA9PiB7CiAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSAic21vb3RoIjsKICAgICAgICAgICAgdGhpcy5sYXN0VmVsb2NpdHkgPSB0aGlzLnZlbG9jaXR5OwogICAgICAgICAgICB0aGlzLnZlbG9jaXR5ID0gdmFsdWUyIC0gdGhpcy5hbmltYXRlZFNjcm9sbDsKICAgICAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSBNYXRoLnNpZ24odGhpcy52ZWxvY2l0eSk7CiAgICAgICAgICAgIHRoaXMuYW5pbWF0ZWRTY3JvbGwgPSB2YWx1ZTI7CiAgICAgICAgICAgIHRoaXMuc2V0U2Nyb2xsKHRoaXMuc2Nyb2xsKTsKICAgICAgICAgICAgaWYgKHByb2dyYW1tYXRpYykgewogICAgICAgICAgICAgIHRoaXMudGFyZ2V0U2Nyb2xsID0gdmFsdWUyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghY29tcGxldGVkKSB0aGlzLmVtaXQoKTsKICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCkgewogICAgICAgICAgICAgIHRoaXMucmVzZXQoKTsKICAgICAgICAgICAgICB0aGlzLmVtaXQoKTsKICAgICAgICAgICAgICBvbkNvbXBsZXRlPy4odGhpcyk7CiAgICAgICAgICAgICAgdGhpcy51c2VyRGF0YSA9IHt9OwogICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoU2Nyb2xsZW5kRXZlbnQoKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB0aGlzLnByZXZlbnROZXh0TmF0aXZlU2Nyb2xsRXZlbnQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIHByZXZlbnROZXh0TmF0aXZlU2Nyb2xsRXZlbnQoKSB7CiAgICAgICAgdGhpcy5fcHJldmVudE5leHROYXRpdmVTY3JvbGxFdmVudCA9IHRydWU7CiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICAgIHRoaXMuX3ByZXZlbnROZXh0TmF0aXZlU2Nyb2xsRXZlbnQgPSBmYWxzZTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBjaGVja05lc3RlZFNjcm9sbChub2RlMiwgeyBkZWx0YVgsIGRlbHRhWSB9KSB7CiAgICAgICAgY29uc3QgdGltZSA9IERhdGUubm93KCk7CiAgICAgICAgY29uc3QgY2FjaGUgPSBub2RlMi5fbGVuaXMgPz89IHt9OwogICAgICAgIGxldCBoYXNPdmVyZmxvd1gsIGhhc092ZXJmbG93WSwgaXNTY3JvbGxhYmxlWCwgaXNTY3JvbGxhYmxlWSwgc2Nyb2xsV2lkdGgsIHNjcm9sbEhlaWdodCwgY2xpZW50V2lkdGgsIGNsaWVudEhlaWdodDsKICAgICAgICBjb25zdCBnZXN0dXJlT3JpZW50YXRpb24gPSB0aGlzLm9wdGlvbnMuZ2VzdHVyZU9yaWVudGF0aW9uOwogICAgICAgIGlmICh0aW1lIC0gKGNhY2hlLnRpbWUgPz8gMCkgPiAyZTMpIHsKICAgICAgICAgIGNhY2hlLnRpbWUgPSBEYXRlLm5vdygpOwogICAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUyKTsKICAgICAgICAgIGNhY2hlLmNvbXB1dGVkU3R5bGUgPSBjb21wdXRlZFN0eWxlOwogICAgICAgICAgY29uc3Qgb3ZlcmZsb3dYU3RyaW5nID0gY29tcHV0ZWRTdHlsZS5vdmVyZmxvd1g7CiAgICAgICAgICBjb25zdCBvdmVyZmxvd1lTdHJpbmcgPSBjb21wdXRlZFN0eWxlLm92ZXJmbG93WTsKICAgICAgICAgIGhhc092ZXJmbG93WCA9IFsiYXV0byIsICJvdmVybGF5IiwgInNjcm9sbCJdLmluY2x1ZGVzKG92ZXJmbG93WFN0cmluZyk7CiAgICAgICAgICBoYXNPdmVyZmxvd1kgPSBbImF1dG8iLCAib3ZlcmxheSIsICJzY3JvbGwiXS5pbmNsdWRlcyhvdmVyZmxvd1lTdHJpbmcpOwogICAgICAgICAgY2FjaGUuaGFzT3ZlcmZsb3dYID0gaGFzT3ZlcmZsb3dYOwogICAgICAgICAgY2FjaGUuaGFzT3ZlcmZsb3dZID0gaGFzT3ZlcmZsb3dZOwogICAgICAgICAgaWYgKCFoYXNPdmVyZmxvd1ggJiYgIWhhc092ZXJmbG93WSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgaWYgKGdlc3R1cmVPcmllbnRhdGlvbiA9PT0gInZlcnRpY2FsIiAmJiAhaGFzT3ZlcmZsb3dZKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICBpZiAoZ2VzdHVyZU9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgJiYgIWhhc092ZXJmbG93WCkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgc2Nyb2xsV2lkdGggPSBub2RlMi5zY3JvbGxXaWR0aDsKICAgICAgICAgIHNjcm9sbEhlaWdodCA9IG5vZGUyLnNjcm9sbEhlaWdodDsKICAgICAgICAgIGNsaWVudFdpZHRoID0gbm9kZTIuY2xpZW50V2lkdGg7CiAgICAgICAgICBjbGllbnRIZWlnaHQgPSBub2RlMi5jbGllbnRIZWlnaHQ7CiAgICAgICAgICBpc1Njcm9sbGFibGVYID0gc2Nyb2xsV2lkdGggPiBjbGllbnRXaWR0aDsKICAgICAgICAgIGlzU2Nyb2xsYWJsZVkgPSBzY3JvbGxIZWlnaHQgPiBjbGllbnRIZWlnaHQ7CiAgICAgICAgICBjYWNoZS5pc1Njcm9sbGFibGVYID0gaXNTY3JvbGxhYmxlWDsKICAgICAgICAgIGNhY2hlLmlzU2Nyb2xsYWJsZVkgPSBpc1Njcm9sbGFibGVZOwogICAgICAgICAgY2FjaGUuc2Nyb2xsV2lkdGggPSBzY3JvbGxXaWR0aDsKICAgICAgICAgIGNhY2hlLnNjcm9sbEhlaWdodCA9IHNjcm9sbEhlaWdodDsKICAgICAgICAgIGNhY2hlLmNsaWVudFdpZHRoID0gY2xpZW50V2lkdGg7CiAgICAgICAgICBjYWNoZS5jbGllbnRIZWlnaHQgPSBjbGllbnRIZWlnaHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlzU2Nyb2xsYWJsZVggPSBjYWNoZS5pc1Njcm9sbGFibGVYOwogICAgICAgICAgaXNTY3JvbGxhYmxlWSA9IGNhY2hlLmlzU2Nyb2xsYWJsZVk7CiAgICAgICAgICBoYXNPdmVyZmxvd1ggPSBjYWNoZS5oYXNPdmVyZmxvd1g7CiAgICAgICAgICBoYXNPdmVyZmxvd1kgPSBjYWNoZS5oYXNPdmVyZmxvd1k7CiAgICAgICAgICBzY3JvbGxXaWR0aCA9IGNhY2hlLnNjcm9sbFdpZHRoOwogICAgICAgICAgc2Nyb2xsSGVpZ2h0ID0gY2FjaGUuc2Nyb2xsSGVpZ2h0OwogICAgICAgICAgY2xpZW50V2lkdGggPSBjYWNoZS5jbGllbnRXaWR0aDsKICAgICAgICAgIGNsaWVudEhlaWdodCA9IGNhY2hlLmNsaWVudEhlaWdodDsKICAgICAgICB9CiAgICAgICAgaWYgKCFoYXNPdmVyZmxvd1ggJiYgIWhhc092ZXJmbG93WSB8fCAhaXNTY3JvbGxhYmxlWCAmJiAhaXNTY3JvbGxhYmxlWSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoZ2VzdHVyZU9yaWVudGF0aW9uID09PSAidmVydGljYWwiICYmICghaGFzT3ZlcmZsb3dZIHx8ICFpc1Njcm9sbGFibGVZKSkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoZ2VzdHVyZU9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgJiYgKCFoYXNPdmVyZmxvd1ggfHwgIWlzU2Nyb2xsYWJsZVgpKQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIGxldCBvcmllbnRhdGlvbjsKICAgICAgICBpZiAoZ2VzdHVyZU9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIpIHsKICAgICAgICAgIG9yaWVudGF0aW9uID0gIngiOwogICAgICAgIH0gZWxzZSBpZiAoZ2VzdHVyZU9yaWVudGF0aW9uID09PSAidmVydGljYWwiKSB7CiAgICAgICAgICBvcmllbnRhdGlvbiA9ICJ5IjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgaXNTY3JvbGxpbmdYID0gZGVsdGFYICE9PSAwOwogICAgICAgICAgY29uc3QgaXNTY3JvbGxpbmdZID0gZGVsdGFZICE9PSAwOwogICAgICAgICAgaWYgKGlzU2Nyb2xsaW5nWCAmJiBoYXNPdmVyZmxvd1ggJiYgaXNTY3JvbGxhYmxlWCkgewogICAgICAgICAgICBvcmllbnRhdGlvbiA9ICJ4IjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc1Njcm9sbGluZ1kgJiYgaGFzT3ZlcmZsb3dZICYmIGlzU2Nyb2xsYWJsZVkpIHsKICAgICAgICAgICAgb3JpZW50YXRpb24gPSAieSI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghb3JpZW50YXRpb24pIHJldHVybiBmYWxzZTsKICAgICAgICBsZXQgc2Nyb2xsLCBtYXhTY3JvbGwsIGRlbHRhLCBoYXNPdmVyZmxvdywgaXNTY3JvbGxhYmxlOwogICAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gIngiKSB7CiAgICAgICAgICBzY3JvbGwgPSBub2RlMi5zY3JvbGxMZWZ0OwogICAgICAgICAgbWF4U2Nyb2xsID0gc2Nyb2xsV2lkdGggLSBjbGllbnRXaWR0aDsKICAgICAgICAgIGRlbHRhID0gZGVsdGFYOwogICAgICAgICAgaGFzT3ZlcmZsb3cgPSBoYXNPdmVyZmxvd1g7CiAgICAgICAgICBpc1Njcm9sbGFibGUgPSBpc1Njcm9sbGFibGVYOwogICAgICAgIH0gZWxzZSBpZiAob3JpZW50YXRpb24gPT09ICJ5IikgewogICAgICAgICAgc2Nyb2xsID0gbm9kZTIuc2Nyb2xsVG9wOwogICAgICAgICAgbWF4U2Nyb2xsID0gc2Nyb2xsSGVpZ2h0IC0gY2xpZW50SGVpZ2h0OwogICAgICAgICAgZGVsdGEgPSBkZWx0YVk7CiAgICAgICAgICBoYXNPdmVyZmxvdyA9IGhhc092ZXJmbG93WTsKICAgICAgICAgIGlzU2Nyb2xsYWJsZSA9IGlzU2Nyb2xsYWJsZVk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgd2lsbFNjcm9sbCA9IGRlbHRhID4gMCA/IHNjcm9sbCA8IG1heFNjcm9sbCA6IHNjcm9sbCA+IDA7CiAgICAgICAgcmV0dXJuIHdpbGxTY3JvbGwgJiYgaGFzT3ZlcmZsb3cgJiYgaXNTY3JvbGxhYmxlOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBUaGUgcm9vdCBlbGVtZW50IG9uIHdoaWNoIGxlbmlzIGlzIGluc3RhbmNlZAogICAgICAgKi8KICAgICAgZ2V0IHJvb3RFbGVtZW50KCkgewogICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud3JhcHBlciA9PT0gd2luZG93ID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IDogdGhpcy5vcHRpb25zLndyYXBwZXI7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFRoZSBsaW1pdCB3aGljaCBpcyB0aGUgbWF4aW11bSBzY3JvbGwgdmFsdWUKICAgICAgICovCiAgICAgIGdldCBsaW1pdCgpIHsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5haXZlRGltZW5zaW9ucykgewogICAgICAgICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3RFbGVtZW50LnNjcm9sbFdpZHRoIC0gdGhpcy5yb290RWxlbWVudC5jbGllbnRXaWR0aDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3RFbGVtZW50LnNjcm9sbEhlaWdodCAtIHRoaXMucm9vdEVsZW1lbnQuY2xpZW50SGVpZ2h0OwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5kaW1lbnNpb25zLmxpbWl0W3RoaXMuaXNIb3Jpem9udGFsID8gIngiIDogInkiXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBzY3JvbGwgaXMgaG9yaXpvbnRhbAogICAgICAgKi8KICAgICAgZ2V0IGlzSG9yaXpvbnRhbCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCI7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFRoZSBhY3R1YWwgc2Nyb2xsIHZhbHVlCiAgICAgICAqLwogICAgICBnZXQgYWN0dWFsU2Nyb2xsKCkgewogICAgICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLm9wdGlvbnMud3JhcHBlcjsKICAgICAgICByZXR1cm4gdGhpcy5pc0hvcml6b250YWwgPyB3cmFwcGVyLnNjcm9sbFggPz8gd3JhcHBlci5zY3JvbGxMZWZ0IDogd3JhcHBlci5zY3JvbGxZID8/IHdyYXBwZXIuc2Nyb2xsVG9wOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBUaGUgY3VycmVudCBzY3JvbGwgdmFsdWUKICAgICAgICovCiAgICAgIGdldCBzY3JvbGwoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pbmZpbml0ZSA/IG1vZHVsbyh0aGlzLmFuaW1hdGVkU2Nyb2xsLCB0aGlzLmxpbWl0KSA6IHRoaXMuYW5pbWF0ZWRTY3JvbGw7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFRoZSBwcm9ncmVzcyBvZiB0aGUgc2Nyb2xsIHJlbGF0aXZlIHRvIHRoZSBsaW1pdAogICAgICAgKi8KICAgICAgZ2V0IHByb2dyZXNzKCkgewogICAgICAgIHJldHVybiB0aGlzLmxpbWl0ID09PSAwID8gMSA6IHRoaXMuc2Nyb2xsIC8gdGhpcy5saW1pdDsKICAgICAgfQogICAgICAvKioKICAgICAgICogQ3VycmVudCBzY3JvbGwgc3RhdGUKICAgICAgICovCiAgICAgIGdldCBpc1Njcm9sbGluZygpIHsKICAgICAgICByZXR1cm4gdGhpcy5faXNTY3JvbGxpbmc7CiAgICAgIH0KICAgICAgc2V0IGlzU2Nyb2xsaW5nKHZhbHVlMikgewogICAgICAgIGlmICh0aGlzLl9pc1Njcm9sbGluZyAhPT0gdmFsdWUyKSB7CiAgICAgICAgICB0aGlzLl9pc1Njcm9sbGluZyA9IHZhbHVlMjsKICAgICAgICAgIHRoaXMudXBkYXRlQ2xhc3NOYW1lKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDaGVjayBpZiBsZW5pcyBpcyBzdG9wcGVkCiAgICAgICAqLwogICAgICBnZXQgaXNTdG9wcGVkKCkgewogICAgICAgIHJldHVybiB0aGlzLl9pc1N0b3BwZWQ7CiAgICAgIH0KICAgICAgc2V0IGlzU3RvcHBlZCh2YWx1ZTIpIHsKICAgICAgICBpZiAodGhpcy5faXNTdG9wcGVkICE9PSB2YWx1ZTIpIHsKICAgICAgICAgIHRoaXMuX2lzU3RvcHBlZCA9IHZhbHVlMjsKICAgICAgICAgIHRoaXMudXBkYXRlQ2xhc3NOYW1lKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDaGVjayBpZiBsZW5pcyBpcyBsb2NrZWQKICAgICAgICovCiAgICAgIGdldCBpc0xvY2tlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5faXNMb2NrZWQ7CiAgICAgIH0KICAgICAgc2V0IGlzTG9ja2VkKHZhbHVlMikgewogICAgICAgIGlmICh0aGlzLl9pc0xvY2tlZCAhPT0gdmFsdWUyKSB7CiAgICAgICAgICB0aGlzLl9pc0xvY2tlZCA9IHZhbHVlMjsKICAgICAgICAgIHRoaXMudXBkYXRlQ2xhc3NOYW1lKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDaGVjayBpZiBsZW5pcyBpcyBzbW9vdGggc2Nyb2xsaW5nCiAgICAgICAqLwogICAgICBnZXQgaXNTbW9vdGgoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNTY3JvbGxpbmcgPT09ICJzbW9vdGgiOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBUaGUgY2xhc3MgbmFtZSBhcHBsaWVkIHRvIHRoZSB3cmFwcGVyIGVsZW1lbnQKICAgICAgICovCiAgICAgIGdldCBjbGFzc05hbWUoKSB7CiAgICAgICAgbGV0IGNsYXNzTmFtZSA9ICJsZW5pcyI7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvVG9nZ2xlKSBjbGFzc05hbWUgKz0gIiBsZW5pcy1hdXRvVG9nZ2xlIjsKICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIGNsYXNzTmFtZSArPSAiIGxlbmlzLXN0b3BwZWQiOwogICAgICAgIGlmICh0aGlzLmlzTG9ja2VkKSBjbGFzc05hbWUgKz0gIiBsZW5pcy1sb2NrZWQiOwogICAgICAgIGlmICh0aGlzLmlzU2Nyb2xsaW5nKSBjbGFzc05hbWUgKz0gIiBsZW5pcy1zY3JvbGxpbmciOwogICAgICAgIGlmICh0aGlzLmlzU2Nyb2xsaW5nID09PSAic21vb3RoIikgY2xhc3NOYW1lICs9ICIgbGVuaXMtc21vb3RoIjsKICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwogICAgICB9CiAgICAgIHVwZGF0ZUNsYXNzTmFtZSgpIHsKICAgICAgICB0aGlzLmNsZWFuVXBDbGFzc05hbWUoKTsKICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmNsYXNzTmFtZSA9IGAke3RoaXMucm9vdEVsZW1lbnQuY2xhc3NOYW1lfSAke3RoaXMuY2xhc3NOYW1lfWAudHJpbSgpOwogICAgICB9CiAgICAgIGNsZWFuVXBDbGFzc05hbWUoKSB7CiAgICAgICAgdGhpcy5yb290RWxlbWVudC5jbGFzc05hbWUgPSB0aGlzLnJvb3RFbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKC9sZW5pcygtXHcrKT8vZywgIiIpLnRyaW0oKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL3N3ZWV0LXNjcm9sbEA0LjAuMC9ub2RlX21vZHVsZXMvc3dlZXQtc2Nyb2xsL3N3ZWV0LXNjcm9sbC5qcwp2YXIgcmVxdWlyZV9zd2VldF9zY3JvbGwgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL3N3ZWV0LXNjcm9sbEA0LjAuMC9ub2RlX21vZHVsZXMvc3dlZXQtc2Nyb2xsL3N3ZWV0LXNjcm9sbC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAoZnVuY3Rpb24oZ2xvYmFsMiwgZmFjdG9yeSkgewogICAgICB0eXBlb2YgZXhwb3J0cyA9PT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSAhPT0gInVuZGVmaW5lZCIgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6IHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6IChnbG9iYWwyID0gZ2xvYmFsMiB8fCBzZWxmLCBnbG9iYWwyLlN3ZWV0U2Nyb2xsID0gZmFjdG9yeSgpKTsKICAgIH0pKGV4cG9ydHMsIGZ1bmN0aW9uKCkgewogICAgICAidXNlIHN0cmljdCI7CiAgICAgIHZhciBfX2Fzc2lnbjIgPSBmdW5jdGlvbigpIHsKICAgICAgICBfX2Fzc2lnbjIgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduMyh0OSkgewogICAgICAgICAgZm9yICh2YXIgczEwLCBpMTEgPSAxLCBuMTMgPSBhcmd1bWVudHMubGVuZ3RoOyBpMTEgPCBuMTM7IGkxMSsrKSB7CiAgICAgICAgICAgIHMxMCA9IGFyZ3VtZW50c1tpMTFdOwogICAgICAgICAgICBmb3IgKHZhciBwOCBpbiBzMTApIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoczEwLCBwOCkpIHQ5W3A4XSA9IHMxMFtwOF07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdDk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gX19hc3NpZ24yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICAgIHZhciBjYW5Vc2VET00gPSAhISh0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpOwogICAgICB2YXIgY2FuVXNlSGlzdG9yeSA9ICFjYW5Vc2VET00gPyBmYWxzZSA6IHdpbmRvdy5oaXN0b3J5ICYmICJwdXNoU3RhdGUiIGluIHdpbmRvdy5oaXN0b3J5ICYmIHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCAhPT0gImZpbGU6IjsKICAgICAgdmFyIGNhblVzZVBhc3NpdmVPcHRpb24gPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHN1cHBvcnQgPSBmYWxzZTsKICAgICAgICBpZiAoIWNhblVzZURPTSkgewogICAgICAgICAgcmV0dXJuIHN1cHBvcnQ7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICB2YXIgd2luID0gd2luZG93OwogICAgICAgICAgdmFyIG9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICJwYXNzaXZlIiwgewogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHN1cHBvcnQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0IiwgbnVsbCwgb3B0cyk7CiAgICAgICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGVzdCIsIG51bGwsIG9wdHMpOwogICAgICAgIH0gY2F0Y2ggKGUxMSkgewogICAgICAgIH0KICAgICAgICByZXR1cm4gc3VwcG9ydDsKICAgICAgfSkoKTsKICAgICAgdmFyIGlzU3RyaW5nMyA9IGZ1bmN0aW9uKG9iaikgewogICAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAic3RyaW5nIjsKICAgICAgfTsKICAgICAgdmFyIGlzRnVuY3Rpb24yID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICJmdW5jdGlvbiI7CiAgICAgIH07CiAgICAgIHZhciBpc0FycmF5NSA9IGZ1bmN0aW9uKG9iaikgewogICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9iaik7CiAgICAgIH07CiAgICAgIHZhciBpc051bWVyaWMgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICByZXR1cm4gIWlzQXJyYXk1KG9iaikgJiYgb2JqIC0gcGFyc2VGbG9hdChvYmopICsgMSA+PSAwOwogICAgICB9OwogICAgICB2YXIgaGFzUHJvcCA9IGZ1bmN0aW9uKG9iaiwga2V5MikgewogICAgICAgIHJldHVybiBvYmogJiYgb2JqLmhhc093blByb3BlcnR5KGtleTIpOwogICAgICB9OwogICAgICB2YXIgcmFmID0gY2FuVXNlRE9NID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykgOiBudWxsOwogICAgICB2YXIgY2FmID0gY2FuVXNlRE9NID8gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KSA6IG51bGw7CiAgICAgIHZhciBjb3MgPSBNYXRoLmNvcywgc2luID0gTWF0aC5zaW4sIHBvdyA9IE1hdGgucG93LCBzcXJ0ID0gTWF0aC5zcXJ0LCBQSSA9IE1hdGguUEk7CiAgICAgIHZhciBlYXNpbmdzID0gewogICAgICAgIGxpbmVhcjogZnVuY3Rpb24ocDgpIHsKICAgICAgICAgIHJldHVybiBwODsKICAgICAgICB9LAogICAgICAgIGVhc2VJblF1YWQ6IGZ1bmN0aW9uKF81LCB0OSwgYjYsIGMxMSwgZDYpIHsKICAgICAgICAgIHJldHVybiBjMTEgKiAodDkgLz0gZDYpICogdDkgKyBiNjsKICAgICAgICB9LAogICAgICAgIGVhc2VPdXRRdWFkOiBmdW5jdGlvbihfNSwgdDksIGI2LCBjMTEsIGQ2KSB7CiAgICAgICAgICByZXR1cm4gLWMxMSAqICh0OSAvPSBkNikgKiAodDkgLSAyKSArIGI2OwogICAgICAgIH0sCiAgICAgICAgZWFzZUluT3V0UXVhZDogZnVuY3Rpb24oXzUsIHQ5LCBiNiwgYzExLCBkNikgewogICAgICAgICAgcmV0dXJuICh0OSAvPSBkNiAvIDIpIDwgMSA/IGMxMSAvIDIgKiB0OSAqIHQ5ICsgYjYgOiAtYzExIC8gMiAqICgtLXQ5ICogKHQ5IC0gMikgLSAxKSArIGI2OwogICAgICAgIH0sCiAgICAgICAgZWFzZUluQ3ViaWM6IGZ1bmN0aW9uKF81LCB0OSwgYjYsIGMxMSwgZDYpIHsKICAgICAgICAgIHJldHVybiBjMTEgKiAodDkgLz0gZDYpICogdDkgKiB0OSArIGI2OwogICAgICAgIH0sCiAgICAgICAgZWFzZU91dEN1YmljOiBmdW5jdGlvbihfNSwgdDksIGI2LCBjMTEsIGQ2KSB7CiAgICAgICAgICByZXR1cm4gYzExICogKCh0OSA9IHQ5IC8gZDYgLSAxKSAqIHQ5ICogdDkgKyAxKSArIGI2OwogICAgICAgIH0sCiAgICAgICAgZWFzZUluT3V0Q3ViaWM6IGZ1bmN0aW9uKF81LCB0OSwgYjYsIGMxMSwgZDYpIHsKICAgICAgICAgIHJldHVybiAodDkgLz0gZDYgLyAyKSA8IDEgPyBjMTEgLyAyICogdDkgKiB0OSAqIHQ5ICsgYjYgOiBjMTEgLyAyICogKCh0OSAtPSAyKSAqIHQ5ICogdDkgKyAyKSArIGI2OwogICAgICAgIH0sCiAgICAgICAgZWFzZUluUXVhcnQ6IGZ1bmN0aW9uKF81LCB0OSwgYjYsIGMxMSwgZDYpIHsKICAgICAgICAgIHJldHVybiBjMTEgKiAodDkgLz0gZDYpICogdDkgKiB0OSAqIHQ5ICsgYjY7CiAgICAgICAgfSwKICAgICAgICBlYXNlT3V0UXVhcnQ6IGZ1bmN0aW9uKF81LCB0OSwgYjYsIGMxMSwgZDYpIHsKICAgICAgICAgIHJldHVybiAtYzExICogKCh0OSA9IHQ5IC8gZDYgLSAxKSAqIHQ5ICogdDkgKiB0OSAtIDEpICsgYjY7CiAgICAgICAgfSwKICAgICAgICBlYXNlSW5PdXRRdWFydDogZnVuY3Rpb24oXzUsIHQ5LCBiNiwgYzExLCBkNikgewogICAgICAgICAgcmV0dXJuICh0OSAvPSBkNiAvIDIpIDwgMSA/IGMxMSAvIDIgKiB0OSAqIHQ5ICogdDkgKiB0OSArIGI2IDogLWMxMSAvIDIgKiAoKHQ5IC09IDIpICogdDkgKiB0OSAqIHQ5IC0gMikgKyBiNjsKICAgICAgICB9LAogICAgICAgIGVhc2VJblF1aW50OiBmdW5jdGlvbihfNSwgdDksIGI2LCBjMTEsIGQ2KSB7CiAgICAgICAgICByZXR1cm4gYzExICogKHQ5IC89IGQ2KSAqIHQ5ICogdDkgKiB0OSAqIHQ5ICsgYjY7CiAgICAgICAgfSwKICAgICAgICBlYXNlT3V0UXVpbnQ6IGZ1bmN0aW9uKF81LCB0OSwgYjYsIGMxMSwgZDYpIHsKICAgICAgICAgIHJldHVybiBjMTEgKiAoKHQ5ID0gdDkgLyBkNiAtIDEpICogdDkgKiB0OSAqIHQ5ICogdDkgKyAxKSArIGI2OwogICAgICAgIH0sCiAgICAgICAgZWFzZUluT3V0UXVpbnQ6IGZ1bmN0aW9uKF81LCB0OSwgYjYsIGMxMSwgZDYpIHsKICAgICAgICAgIHJldHVybiAodDkgLz0gZDYgLyAyKSA8IDEgPyBjMTEgLyAyICogdDkgKiB0OSAqIHQ5ICogdDkgKiB0OSArIGI2IDogYzExIC8gMiAqICgodDkgLT0gMikgKiB0OSAqIHQ5ICogdDkgKiB0OSArIDIpICsgYjY7CiAgICAgICAgfSwKICAgICAgICBlYXNlSW5TaW5lOiBmdW5jdGlvbihfNSwgdDksIGI2LCBjMTEsIGQ2KSB7CiAgICAgICAgICByZXR1cm4gLWMxMSAqIGNvcyh0OSAvIGQ2ICogKFBJIC8gMikpICsgYzExICsgYjY7CiAgICAgICAgfSwKICAgICAgICBlYXNlT3V0U2luZTogZnVuY3Rpb24oXzUsIHQ5LCBiNiwgYzExLCBkNikgewogICAgICAgICAgcmV0dXJuIGMxMSAqIHNpbih0OSAvIGQ2ICogKFBJIC8gMikpICsgYjY7CiAgICAgICAgfSwKICAgICAgICBlYXNlSW5PdXRTaW5lOiBmdW5jdGlvbihfNSwgdDksIGI2LCBjMTEsIGQ2KSB7CiAgICAgICAgICByZXR1cm4gLWMxMSAvIDIgKiAoY29zKFBJICogdDkgLyBkNikgLSAxKSArIGI2OwogICAgICAgIH0sCiAgICAgICAgZWFzZUluRXhwbzogZnVuY3Rpb24oXzUsIHQ5LCBiNiwgYzExLCBkNikgewogICAgICAgICAgcmV0dXJuIHQ5ID09PSAwID8gYjYgOiBjMTEgKiBwb3coMiwgMTAgKiAodDkgLyBkNiAtIDEpKSArIGI2OwogICAgICAgIH0sCiAgICAgICAgZWFzZU91dEV4cG86IGZ1bmN0aW9uKF81LCB0OSwgYjYsIGMxMSwgZDYpIHsKICAgICAgICAgIHJldHVybiB0OSA9PT0gZDYgPyBiNiArIGMxMSA6IGMxMSAqICgtcG93KDIsIC0xMCAqIHQ5IC8gZDYpICsgMSkgKyBiNjsKICAgICAgICB9LAogICAgICAgIGVhc2VJbk91dEV4cG86IGZ1bmN0aW9uKF81LCB0OSwgYjYsIGMxMSwgZDYpIHsKICAgICAgICAgIGlmICh0OSA9PT0gMCkKICAgICAgICAgICAgcmV0dXJuIGI2OwogICAgICAgICAgaWYgKHQ5ID09PSBkNikKICAgICAgICAgICAgcmV0dXJuIGI2ICsgYzExOwogICAgICAgICAgaWYgKCh0OSAvPSBkNiAvIDIpIDwgMSkKICAgICAgICAgICAgcmV0dXJuIGMxMSAvIDIgKiBwb3coMiwgMTAgKiAodDkgLSAxKSkgKyBiNjsKICAgICAgICAgIHJldHVybiBjMTEgLyAyICogKC1wb3coMiwgLTEwICogLS10OSkgKyAyKSArIGI2OwogICAgICAgIH0sCiAgICAgICAgZWFzZUluQ2lyYzogZnVuY3Rpb24oXzUsIHQ5LCBiNiwgYzExLCBkNikgewogICAgICAgICAgcmV0dXJuIC1jMTEgKiAoc3FydCgxIC0gKHQ5IC89IGQ2KSAqIHQ5KSAtIDEpICsgYjY7CiAgICAgICAgfSwKICAgICAgICBlYXNlT3V0Q2lyYzogZnVuY3Rpb24oXzUsIHQ5LCBiNiwgYzExLCBkNikgewogICAgICAgICAgcmV0dXJuIGMxMSAqIHNxcnQoMSAtICh0OSA9IHQ5IC8gZDYgLSAxKSAqIHQ5KSArIGI2OwogICAgICAgIH0sCiAgICAgICAgZWFzZUluT3V0Q2lyYzogZnVuY3Rpb24oXzUsIHQ5LCBiNiwgYzExLCBkNikgewogICAgICAgICAgcmV0dXJuICh0OSAvPSBkNiAvIDIpIDwgMSA/IC1jMTEgLyAyICogKHNxcnQoMSAtIHQ5ICogdDkpIC0gMSkgKyBiNiA6IGMxMSAvIDIgKiAoc3FydCgxIC0gKHQ5IC09IDIpICogdDkpICsgMSkgKyBiNjsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHZhciAkJCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7CiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCFzZWxlY3RvciA/IFtdIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpOwogICAgICB9OwogICAgICB2YXIgJDQgPSBmdW5jdGlvbihzZWxlY3RvcikgewogICAgICAgIHJldHVybiAkJChzZWxlY3Rvcikuc2hpZnQoKSB8fCBudWxsOwogICAgICB9OwogICAgICB2YXIgaXNFbGVtZW50ID0gZnVuY3Rpb24ob2JqKSB7CiAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEVsZW1lbnQ7CiAgICAgIH07CiAgICAgIHZhciBpc1dpbmRvdyA9IGZ1bmN0aW9uKCRlbCkgewogICAgICAgIHJldHVybiAkZWwgPT09IHdpbmRvdzsKICAgICAgfTsKICAgICAgdmFyIGlzUm9vdENvbnRhaW5lciA9IGZ1bmN0aW9uKCRlbCkgewogICAgICAgIHJldHVybiAkZWwgPT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCAkZWwgPT09IGRvY3VtZW50LmJvZHk7CiAgICAgIH07CiAgICAgIHZhciBtYXRjaGVzID0gZnVuY3Rpb24oJGVsLCBzZWxlY3RvcikgewogICAgICAgIGlmIChpc0VsZW1lbnQoc2VsZWN0b3IpKSB7CiAgICAgICAgICByZXR1cm4gJGVsID09PSBzZWxlY3RvcjsKICAgICAgICB9CiAgICAgICAgdmFyIHJlc3VsdHMgPSAkJChzZWxlY3Rvcik7CiAgICAgICAgdmFyIGkxMSA9IHJlc3VsdHMubGVuZ3RoOwogICAgICAgIHdoaWxlICgtLWkxMSA+PSAwICYmIHJlc3VsdHNbaTExXSAhPT0gJGVsKSB7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpMTEgPiAtMTsKICAgICAgfTsKICAgICAgdmFyIGdldEhlaWdodCA9IGZ1bmN0aW9uKCRlbCkgewogICAgICAgIHJldHVybiBNYXRoLm1heCgkZWwuc2Nyb2xsSGVpZ2h0LCAkZWwuY2xpZW50SGVpZ2h0LCAkZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgfTsKICAgICAgdmFyIGdldFdpZHRoID0gZnVuY3Rpb24oJGVsKSB7CiAgICAgICAgcmV0dXJuIE1hdGgubWF4KCRlbC5zY3JvbGxXaWR0aCwgJGVsLmNsaWVudFdpZHRoLCAkZWwub2Zmc2V0V2lkdGgpOwogICAgICB9OwogICAgICB2YXIgZ2V0U2l6ZTIgPSBmdW5jdGlvbigkZWwpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgd2lkdGg6IGdldFdpZHRoKCRlbCksCiAgICAgICAgICBoZWlnaHQ6IGdldEhlaWdodCgkZWwpCiAgICAgICAgfTsKICAgICAgfTsKICAgICAgdmFyIGdldFZpZXdwb3J0QW5kRWxlbWVudFNpemVzID0gZnVuY3Rpb24oJGVsKSB7CiAgICAgICAgdmFyIGlzUm9vdCA9IGlzV2luZG93KCRlbCkgfHwgaXNSb290Q29udGFpbmVyKCRlbCk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHZpZXdwb3J0OiB7CiAgICAgICAgICAgIHdpZHRoOiBpc1Jvb3QgPyBNYXRoLm1pbih3aW5kb3cuaW5uZXJXaWR0aCwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSA6ICRlbC5jbGllbnRXaWR0aCwKICAgICAgICAgICAgaGVpZ2h0OiBpc1Jvb3QgPyB3aW5kb3cuaW5uZXJIZWlnaHQgOiAkZWwuY2xpZW50SGVpZ2h0CiAgICAgICAgICB9LAogICAgICAgICAgc2l6ZTogaXNSb290ID8gewogICAgICAgICAgICB3aWR0aDogTWF0aC5tYXgoZ2V0V2lkdGgoZG9jdW1lbnQuYm9keSksIGdldFdpZHRoKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpLAogICAgICAgICAgICBoZWlnaHQ6IE1hdGgubWF4KGdldEhlaWdodChkb2N1bWVudC5ib2R5KSwgZ2V0SGVpZ2h0KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpCiAgICAgICAgICB9IDogZ2V0U2l6ZTIoJGVsKQogICAgICAgIH07CiAgICAgIH07CiAgICAgIHZhciBkaXJlY3Rpb25NZXRob2RNYXAgPSB7CiAgICAgICAgeTogInNjcm9sbFRvcCIsCiAgICAgICAgeDogInNjcm9sbExlZnQiCiAgICAgIH07CiAgICAgIHZhciBkaXJlY3Rpb25Qcm9wTWFwID0gewogICAgICAgIHk6ICJwYWdlWU9mZnNldCIsCiAgICAgICAgeDogInBhZ2VYT2Zmc2V0IgogICAgICB9OwogICAgICB2YXIgZ2V0U2Nyb2xsID0gZnVuY3Rpb24oJGVsLCBkaXJlY3Rpb24pIHsKICAgICAgICByZXR1cm4gaXNXaW5kb3coJGVsKSA/ICRlbFtkaXJlY3Rpb25Qcm9wTWFwW2RpcmVjdGlvbl1dIDogJGVsW2RpcmVjdGlvbk1ldGhvZE1hcFtkaXJlY3Rpb25dXTsKICAgICAgfTsKICAgICAgdmFyIHNldFNjcm9sbCA9IGZ1bmN0aW9uKCRlbCwgb2Zmc2V0LCBkaXJlY3Rpb24pIHsKICAgICAgICBpZiAoaXNXaW5kb3coJGVsKSkgewogICAgICAgICAgdmFyIHRvcF8xID0gZGlyZWN0aW9uID09PSAieSI7CiAgICAgICAgICAkZWwuc2Nyb2xsVG8oIXRvcF8xID8gb2Zmc2V0IDogJGVsLnBhZ2VYT2Zmc2V0LCB0b3BfMSA/IG9mZnNldCA6ICRlbC5wYWdlWU9mZnNldCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICRlbFtkaXJlY3Rpb25NZXRob2RNYXBbZGlyZWN0aW9uXV0gPSBvZmZzZXQ7CiAgICAgICAgfQogICAgICB9OwogICAgICB2YXIgZ2V0T2Zmc2V0ID0gZnVuY3Rpb24oJGVsLCAkY29udGV4dCkgewogICAgICAgIHZhciByZWN0ID0gJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGlmIChyZWN0LndpZHRoIHx8IHJlY3QuaGVpZ2h0KSB7CiAgICAgICAgICB2YXIgc2Nyb2xsXzEgPSB7IHRvcDogMCwgbGVmdDogMCB9OwogICAgICAgICAgdmFyICRjdHggPSB2b2lkIDA7CiAgICAgICAgICBpZiAoaXNXaW5kb3coJGNvbnRleHQpIHx8IGlzUm9vdENvbnRhaW5lcigkY29udGV4dCkpIHsKICAgICAgICAgICAgJGN0eCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKICAgICAgICAgICAgc2Nyb2xsXzEudG9wID0gd2luZG93W2RpcmVjdGlvblByb3BNYXAueV07CiAgICAgICAgICAgIHNjcm9sbF8xLmxlZnQgPSB3aW5kb3dbZGlyZWN0aW9uUHJvcE1hcC54XTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRjdHggPSAkY29udGV4dDsKICAgICAgICAgICAgdmFyIGNSZWN0ID0gJGN0eC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgc2Nyb2xsXzEudG9wID0gY1JlY3QudG9wICogLTEgKyAkY3R4W2RpcmVjdGlvbk1ldGhvZE1hcC55XTsKICAgICAgICAgICAgc2Nyb2xsXzEubGVmdCA9IGNSZWN0LmxlZnQgKiAtMSArICRjdHhbZGlyZWN0aW9uTWV0aG9kTWFwLnhdOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdG9wOiByZWN0LnRvcCArIHNjcm9sbF8xLnRvcCAtICRjdHguY2xpZW50VG9wLAogICAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQgKyBzY3JvbGxfMS5sZWZ0IC0gJGN0eC5jbGllbnRMZWZ0CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVjdDsKICAgICAgfTsKICAgICAgdmFyIHdoZWVsRXZlbnROYW1lID0gKGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghY2FuVXNlRE9NKSB7CiAgICAgICAgICByZXR1cm4gIndoZWVsIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJvbndoZWVsIiBpbiBkb2N1bWVudCA/ICJ3aGVlbCIgOiAibW91c2V3aGVlbCI7CiAgICAgIH0pKCk7CiAgICAgIHZhciBldmVudE5hbWUgPSBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgcmV0dXJuIG5hbWUgPT09ICJ3aGVlbCIgPyB3aGVlbEV2ZW50TmFtZSA6IG5hbWU7CiAgICAgIH07CiAgICAgIHZhciBhcHBseSA9IGZ1bmN0aW9uKCRlbCwgbWV0aG9kLCBldmVudCwgbGlzdGVuZXIyLCBwYXNzaXZlKSB7CiAgICAgICAgZXZlbnQuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICAgICRlbFttZXRob2RdKGV2ZW50TmFtZShuYW1lKSwgbGlzdGVuZXIyLCBjYW5Vc2VQYXNzaXZlT3B0aW9uID8geyBwYXNzaXZlIH0gOiBmYWxzZSk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIHZhciBhZGRFdmVudCA9IGZ1bmN0aW9uKCRlbCwgZXZlbnQsIGxpc3RlbmVyMiwgcGFzc2l2ZSkgewogICAgICAgIHJldHVybiBhcHBseSgkZWwsICJhZGRFdmVudExpc3RlbmVyIiwgZXZlbnQsIGxpc3RlbmVyMiwgcGFzc2l2ZSk7CiAgICAgIH07CiAgICAgIHZhciByZW1vdmVFdmVudCA9IGZ1bmN0aW9uKCRlbCwgZXZlbnQsIGxpc3RlbmVyMiwgcGFzc2l2ZSkgewogICAgICAgIHJldHVybiBhcHBseSgkZWwsICJyZW1vdmVFdmVudExpc3RlbmVyIiwgZXZlbnQsIGxpc3RlbmVyMiwgcGFzc2l2ZSk7CiAgICAgIH07CiAgICAgIHZhciByZVJlbGF0aXZlVG9rZW4gPSAvXihcK3wtKT0oXGQrKD86XC5cZCspPykkLzsKICAgICAgdmFyIHBhcnNlQ29vcmRpbmF0ZSA9IGZ1bmN0aW9uKGNvb3JkaW5hdGUsIGVuYWJsZVZlcnRpY2FsKSB7CiAgICAgICAgdmFyIHJlcyA9IHsgdG9wOiAwLCBsZWZ0OiAwLCByZWxhdGl2ZTogZmFsc2UgfTsKICAgICAgICBpZiAoaGFzUHJvcChjb29yZGluYXRlLCAidG9wIikgfHwgaGFzUHJvcChjb29yZGluYXRlLCAibGVmdCIpKSB7CiAgICAgICAgICByZXMgPSBfX2Fzc2lnbjIoe30sIHJlcywgY29vcmRpbmF0ZSk7CiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5NShjb29yZGluYXRlKSkgewogICAgICAgICAgaWYgKGNvb3JkaW5hdGUubGVuZ3RoID4gMSkgewogICAgICAgICAgICByZXMudG9wID0gY29vcmRpbmF0ZVswXTsKICAgICAgICAgICAgcmVzLmxlZnQgPSBjb29yZGluYXRlWzFdOwogICAgICAgICAgfSBlbHNlIGlmIChjb29yZGluYXRlLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICByZXMudG9wID0gZW5hYmxlVmVydGljYWwgPyBjb29yZGluYXRlWzBdIDogMDsKICAgICAgICAgICAgcmVzLmxlZnQgPSAhZW5hYmxlVmVydGljYWwgPyBjb29yZGluYXRlWzBdIDogMDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoaXNOdW1lcmljKGNvb3JkaW5hdGUpKSB7CiAgICAgICAgICBpZiAoZW5hYmxlVmVydGljYWwpIHsKICAgICAgICAgICAgcmVzLnRvcCA9IGNvb3JkaW5hdGU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXMubGVmdCA9IGNvb3JkaW5hdGU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChpc1N0cmluZzMoY29vcmRpbmF0ZSkpIHsKICAgICAgICAgIHZhciBtNyA9IGNvb3JkaW5hdGUudHJpbSgpLm1hdGNoKHJlUmVsYXRpdmVUb2tlbik7CiAgICAgICAgICBpZiAoIW03KSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgdmFyIG9wID0gbTdbMV07CiAgICAgICAgICB2YXIgdmFsID0gcGFyc2VJbnQobTdbMl0sIDEwKTsKICAgICAgICAgIGlmIChvcCA9PT0gIisiKSB7CiAgICAgICAgICAgIHJlcy50b3AgPSBlbmFibGVWZXJ0aWNhbCA/IHZhbCA6IDA7CiAgICAgICAgICAgIHJlcy5sZWZ0ID0gIWVuYWJsZVZlcnRpY2FsID8gdmFsIDogMDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlcy50b3AgPSBlbmFibGVWZXJ0aWNhbCA/IC12YWwgOiAwOwogICAgICAgICAgICByZXMubGVmdCA9ICFlbmFibGVWZXJ0aWNhbCA/IC12YWwgOiAwOwogICAgICAgICAgfQogICAgICAgICAgcmVzLnJlbGF0aXZlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXM7CiAgICAgIH07CiAgICAgIHZhciBkZWZhdWx0T3B0aW9uczIgPSB7CiAgICAgICAgdHJpZ2dlcjogIltkYXRhLXNjcm9sbF0iLAogICAgICAgIGhlYWRlcjogIltkYXRhLXNjcm9sbC1oZWFkZXJdIiwKICAgICAgICBkdXJhdGlvbjogMWUzLAogICAgICAgIGVhc2luZzogImVhc2VPdXRRdWludCIsCiAgICAgICAgb2Zmc2V0OiAwLAogICAgICAgIHZlcnRpY2FsOiB0cnVlLAogICAgICAgIGhvcml6b250YWw6IGZhbHNlLAogICAgICAgIGNhbmNlbGxhYmxlOiB0cnVlLAogICAgICAgIHVwZGF0ZVVSTDogZmFsc2UsCiAgICAgICAgcHJldmVudERlZmF1bHQ6IHRydWUsCiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiB0cnVlLAogICAgICAgIC8vIENhbGxiYWNrcwogICAgICAgIGJlZm9yZTogbnVsbCwKICAgICAgICBhZnRlcjogbnVsbCwKICAgICAgICBjYW5jZWw6IG51bGwsCiAgICAgICAgY29tcGxldGU6IG51bGwsCiAgICAgICAgc3RlcDogbnVsbAogICAgICB9OwogICAgICB2YXIgQ09OVEFJTkVSX0NMSUNLX0VWRU5UID0gImNsaWNrIjsKICAgICAgdmFyIENPTlRBSU5FUl9TVE9QX0VWRU5UID0gIndoZWVsIHRvdWNoc3RhcnQgdG91Y2htb3ZlIjsKICAgICAgdmFyIFN3ZWV0U2Nyb2xsMyA9ICgKICAgICAgICAvKiogQGNsYXNzICovCiAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgZnVuY3Rpb24gU3dlZXRTY3JvbGw0KG9wdGlvbnMsIGNvbnRhaW5lcikgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB0aGlzLiRlbCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuY3R4ID0gewogICAgICAgICAgICAgICR0cmlnZ2VyOiBudWxsLAogICAgICAgICAgICAgIG9wdHM6IG51bGwsCiAgICAgICAgICAgICAgcHJvZ3Jlc3M6IGZhbHNlLAogICAgICAgICAgICAgIHBvczogbnVsbCwKICAgICAgICAgICAgICBzdGFydFBvczogbnVsbCwKICAgICAgICAgICAgICBlYXNpbmc6IG51bGwsCiAgICAgICAgICAgICAgc3RhcnQ6IDAsCiAgICAgICAgICAgICAgaWQ6IDAsCiAgICAgICAgICAgICAgY2FuY2VsOiBmYWxzZSwKICAgICAgICAgICAgICBoYXNoOiBudWxsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMubG9vcCA9IGZ1bmN0aW9uKHRpbWUpIHsKICAgICAgICAgICAgICB2YXIgX2ExMiA9IF90aGlzLCAkZWwgPSBfYTEyLiRlbCwgY3R4ID0gX2ExMi5jdHg7CiAgICAgICAgICAgICAgaWYgKCFjdHguc3RhcnQpIHsKICAgICAgICAgICAgICAgIGN0eC5zdGFydCA9IHRpbWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICghY3R4LnByb2dyZXNzIHx8ICEkZWwpIHsKICAgICAgICAgICAgICAgIF90aGlzLnN0b3AoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIG9wdGlvbnMyID0gY3R4Lm9wdHM7CiAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IGN0eC5wb3M7CiAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gY3R4LnN0YXJ0OwogICAgICAgICAgICAgIHZhciBzdGFydE9mZnNldCA9IGN0eC5zdGFydFBvczsKICAgICAgICAgICAgICB2YXIgZWFzaW5nID0gY3R4LmVhc2luZzsKICAgICAgICAgICAgICB2YXIgZHVyYXRpb24gPSBvcHRpb25zMi5kdXJhdGlvbjsKICAgICAgICAgICAgICB2YXIgZGlyZWN0aW9uTWFwID0geyB0b3A6ICJ5IiwgbGVmdDogIngiIH07CiAgICAgICAgICAgICAgdmFyIHRpbWVFbGFwc2VkID0gdGltZSAtIHN0YXJ0OwogICAgICAgICAgICAgIHZhciB0OSA9IE1hdGgubWluKDEsIE1hdGgubWF4KHRpbWVFbGFwc2VkIC8gZHVyYXRpb24sIDApKTsKICAgICAgICAgICAgICBPYmplY3Qua2V5cyhvZmZzZXQpLmZvckVhY2goZnVuY3Rpb24oa2V5MikgewogICAgICAgICAgICAgICAgdmFyIHZhbHVlMiA9IG9mZnNldFtrZXkyXTsKICAgICAgICAgICAgICAgIHZhciBpbml0aWFsMiA9IHN0YXJ0T2Zmc2V0W2tleTJdOwogICAgICAgICAgICAgICAgdmFyIGRlbHRhID0gdmFsdWUyIC0gaW5pdGlhbDI7CiAgICAgICAgICAgICAgICBpZiAoZGVsdGEgIT09IDApIHsKICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IGVhc2luZyh0OSwgZHVyYXRpb24gKiB0OSwgMCwgMSwgZHVyYXRpb24pOwogICAgICAgICAgICAgICAgICBzZXRTY3JvbGwoJGVsLCBNYXRoLnJvdW5kKGluaXRpYWwyICsgZGVsdGEgKiB2YWwpLCBkaXJlY3Rpb25NYXBba2V5Ml0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGlmICh0aW1lRWxhcHNlZCA8PSBkdXJhdGlvbikgewogICAgICAgICAgICAgICAgX3RoaXMuaG9vayhvcHRpb25zMiwgInN0ZXAiLCB0OSk7CiAgICAgICAgICAgICAgICBjdHguaWQgPSBTd2VldFNjcm9sbDQucmFmKF90aGlzLmxvb3ApOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBfdGhpcy5zdG9wKHRydWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5oYW5kbGVDbGljayA9IGZ1bmN0aW9uKGUxMSkgewogICAgICAgICAgICAgIHZhciBvcHRzID0gX3RoaXMub3B0czsKICAgICAgICAgICAgICB2YXIgJGVsID0gZTExLnRhcmdldDsKICAgICAgICAgICAgICBmb3IgKDsgJGVsICYmICRlbCAhPT0gZG9jdW1lbnQ7ICRlbCA9ICRlbC5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXMoJGVsLCBvcHRzLnRyaWdnZXIpKSB7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGRhdGFPcHRpb25zID0gSlNPTi5wYXJzZSgkZWwuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcm9sbC1vcHRpb25zIikgfHwgInt9Iik7CiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9ICRlbC5nZXRBdHRyaWJ1dGUoImRhdGEtc2Nyb2xsIik7CiAgICAgICAgICAgICAgICB2YXIgdG8gPSBkYXRhIHx8ICRlbC5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICAgICAgICAgICAgICAgIHZhciBvcHRpb25zMiA9IF9fYXNzaWduMih7fSwgb3B0cywgZGF0YU9wdGlvbnMpOwogICAgICAgICAgICAgICAgdmFyIHByZXZlbnREZWZhdWx0ID0gb3B0aW9uczIucHJldmVudERlZmF1bHQsIHN0b3BQcm9wYWdhdGlvbiA9IG9wdGlvbnMyLnN0b3BQcm9wYWdhdGlvbiwgdmVydGljYWwgPSBvcHRpb25zMi52ZXJ0aWNhbCwgaG9yaXpvbnRhbCA9IG9wdGlvbnMyLmhvcml6b250YWw7CiAgICAgICAgICAgICAgICBpZiAocHJldmVudERlZmF1bHQpIHsKICAgICAgICAgICAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3RvcFByb3BhZ2F0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF90aGlzLmN0eC4kdHJpZ2dlciA9ICRlbDsKICAgICAgICAgICAgICAgIGlmIChob3Jpem9udGFsICYmIHZlcnRpY2FsKSB7CiAgICAgICAgICAgICAgICAgIF90aGlzLnRvKHRvLCBvcHRpb25zMik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnRpY2FsKSB7CiAgICAgICAgICAgICAgICAgIF90aGlzLnRvVG9wKHRvLCBvcHRpb25zMik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhvcml6b250YWwpIHsKICAgICAgICAgICAgICAgICAgX3RoaXMudG9MZWZ0KHRvLCBvcHRpb25zMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuaGFuZGxlU3RvcCA9IGZ1bmN0aW9uKGUxMSkgewogICAgICAgICAgICAgIHZhciBjdHggPSBfdGhpcy5jdHg7CiAgICAgICAgICAgICAgdmFyIG9wdHMgPSBjdHgub3B0czsKICAgICAgICAgICAgICBpZiAob3B0cyAmJiBvcHRzLmNhbmNlbGxhYmxlKSB7CiAgICAgICAgICAgICAgICBjdHguY2FuY2VsID0gdHJ1ZTsKICAgICAgICAgICAgICAgIF90aGlzLnN0b3AoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLm9wdHMgPSBfX2Fzc2lnbjIoe30sIGRlZmF1bHRPcHRpb25zMiwgb3B0aW9ucyB8fCB7fSk7CiAgICAgICAgICAgIHZhciAkY29udGFpbmVyID0gbnVsbDsKICAgICAgICAgICAgaWYgKGNhblVzZURPTSkgewogICAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGFpbmVyID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgJGNvbnRhaW5lciA9ICQ0KGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgJGNvbnRhaW5lciA9IGNvbnRhaW5lcjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGNvbnRhaW5lciA9IHdpbmRvdzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy4kZWwgPSAkY29udGFpbmVyOwogICAgICAgICAgICBpZiAoJGNvbnRhaW5lcikgewogICAgICAgICAgICAgIHRoaXMuYmluZCh0cnVlLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5jcmVhdGUgPSBmdW5jdGlvbihvcHRpb25zLCBjb250YWluZXIpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTd2VldFNjcm9sbDQob3B0aW9ucywgY29udGFpbmVyKTsKICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucHJvdG90eXBlLnRvID0gZnVuY3Rpb24oZGlzdGFuY2UsIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKCFjYW5Vc2VET00pIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIF9hMTIgPSB0aGlzLCAkZWwgPSBfYTEyLiRlbCwgY3R4ID0gX2ExMi5jdHgsIGN1cnJlbnRPcHRpb25zID0gX2ExMi5vcHRzOwogICAgICAgICAgICB2YXIgJHRyaWdnZXIgPSBjdHguJHRyaWdnZXI7CiAgICAgICAgICAgIHZhciBvcHRzID0gX19hc3NpZ24yKHt9LCBjdXJyZW50T3B0aW9ucywgb3B0aW9ucyB8fCB7fSk7CiAgICAgICAgICAgIHZhciBvcHRPZmZzZXQgPSBvcHRzLm9mZnNldCwgdmVydGljYWwgPSBvcHRzLnZlcnRpY2FsLCBob3Jpem9udGFsID0gb3B0cy5ob3Jpem9udGFsOwogICAgICAgICAgICB2YXIgJGhlYWRlciA9IGlzRWxlbWVudChvcHRzLmhlYWRlcikgPyBvcHRzLmhlYWRlciA6ICQ0KG9wdHMuaGVhZGVyKTsKICAgICAgICAgICAgdmFyIHJlZyA9IC9eIy87CiAgICAgICAgICAgIHZhciBoYXNoID0gaXNTdHJpbmczKGRpc3RhbmNlKSAmJiByZWcudGVzdChkaXN0YW5jZSkgPyBkaXN0YW5jZSA6IG51bGw7CiAgICAgICAgICAgIGN0eC5vcHRzID0gb3B0czsKICAgICAgICAgICAgY3R4LmNhbmNlbCA9IGZhbHNlOwogICAgICAgICAgICBjdHguaGFzaCA9IGhhc2g7CiAgICAgICAgICAgIHRoaXMuc3RvcCgpOwogICAgICAgICAgICBpZiAoISRlbCkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgb2Zmc2V0ID0gcGFyc2VDb29yZGluYXRlKG9wdE9mZnNldCwgdmVydGljYWwpOwogICAgICAgICAgICB2YXIgY29vcmRpbmF0ZSA9IHBhcnNlQ29vcmRpbmF0ZShkaXN0YW5jZSwgdmVydGljYWwpOwogICAgICAgICAgICB2YXIgc2Nyb2xsID0geyB0b3A6IDAsIGxlZnQ6IDAgfTsKICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGUpIHsKICAgICAgICAgICAgICBpZiAoY29vcmRpbmF0ZS5yZWxhdGl2ZSkgewogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBnZXRTY3JvbGwoJGVsLCB2ZXJ0aWNhbCA/ICJ5IiA6ICJ4Iik7CiAgICAgICAgICAgICAgICBzY3JvbGwudG9wID0gdmVydGljYWwgPyBjdXJyZW50ICsgY29vcmRpbmF0ZS50b3AgOiBjb29yZGluYXRlLnRvcDsKICAgICAgICAgICAgICAgIHNjcm9sbC5sZWZ0ID0gIXZlcnRpY2FsID8gY3VycmVudCArIGNvb3JkaW5hdGUubGVmdCA6IGNvb3JkaW5hdGUubGVmdDsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2Nyb2xsID0gY29vcmRpbmF0ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNTdHJpbmczKGRpc3RhbmNlKSAmJiBkaXN0YW5jZSAhPT0gIiMiKSB7CiAgICAgICAgICAgICAgdmFyICR0YXJnZXQgPSAkNChkaXN0YW5jZSk7CiAgICAgICAgICAgICAgaWYgKCEkdGFyZ2V0KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHNjcm9sbCA9IGdldE9mZnNldCgkdGFyZ2V0LCAkZWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvZmZzZXQpIHsKICAgICAgICAgICAgICBzY3JvbGwudG9wICs9IG9mZnNldC50b3A7CiAgICAgICAgICAgICAgc2Nyb2xsLmxlZnQgKz0gb2Zmc2V0LmxlZnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRoZWFkZXIpIHsKICAgICAgICAgICAgICBzY3JvbGwudG9wID0gTWF0aC5tYXgoMCwgc2Nyb2xsLnRvcCAtIGdldFNpemUyKCRoZWFkZXIpLmhlaWdodCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIF9iID0gZ2V0Vmlld3BvcnRBbmRFbGVtZW50U2l6ZXMoJGVsKSwgdmlld3BvcnQgPSBfYi52aWV3cG9ydCwgc2l6ZSA9IF9iLnNpemU7CiAgICAgICAgICAgIHNjcm9sbC50b3AgPSB2ZXJ0aWNhbCA/IE1hdGgubWF4KDAsIE1hdGgubWluKHNpemUuaGVpZ2h0IC0gdmlld3BvcnQuaGVpZ2h0LCBzY3JvbGwudG9wKSkgOiBnZXRTY3JvbGwoJGVsLCAieSIpOwogICAgICAgICAgICBzY3JvbGwubGVmdCA9IGhvcml6b250YWwgPyBNYXRoLm1heCgwLCBNYXRoLm1pbihzaXplLndpZHRoIC0gdmlld3BvcnQud2lkdGgsIHNjcm9sbC5sZWZ0KSkgOiBnZXRTY3JvbGwoJGVsLCAieCIpOwogICAgICAgICAgICBpZiAodGhpcy5ob29rKG9wdHMsICJiZWZvcmUiLCBzY3JvbGwsICR0cmlnZ2VyKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICBjdHgub3B0cyA9IG51bGw7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN0eC5wb3MgPSBzY3JvbGw7CiAgICAgICAgICAgIHRoaXMuc3RhcnQob3B0cyk7CiAgICAgICAgICAgIHRoaXMuYmluZChmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS50b1RvcCA9IGZ1bmN0aW9uKGRpc3RhbmNlLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHRoaXMudG8oZGlzdGFuY2UsIF9fYXNzaWduMih7fSwgb3B0aW9ucyB8fCB7fSwgeyB2ZXJ0aWNhbDogdHJ1ZSwgaG9yaXpvbnRhbDogZmFsc2UgfSkpOwogICAgICAgICAgfTsKICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5wcm90b3R5cGUudG9MZWZ0ID0gZnVuY3Rpb24oZGlzdGFuY2UsIG9wdGlvbnMpIHsKICAgICAgICAgICAgdGhpcy50byhkaXN0YW5jZSwgX19hc3NpZ24yKHt9LCBvcHRpb25zIHx8IHt9LCB7IHZlcnRpY2FsOiBmYWxzZSwgaG9yaXpvbnRhbDogdHJ1ZSB9KSk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS50b0VsZW1lbnQgPSBmdW5jdGlvbigkZWxlbWVudCwgb3B0aW9ucykgewogICAgICAgICAgICB2YXIgJGVsID0gdGhpcy4kZWw7CiAgICAgICAgICAgIGlmICghY2FuVXNlRE9NIHx8ICEkZWwpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy50byhnZXRPZmZzZXQoJGVsZW1lbnQsICRlbCksIG9wdGlvbnMgfHwge30pOwogICAgICAgICAgfTsKICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKGdvdG9FbmQpIHsKICAgICAgICAgICAgaWYgKGdvdG9FbmQgPT09IHZvaWQgMCkgewogICAgICAgICAgICAgIGdvdG9FbmQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgX2ExMiA9IHRoaXMsICRlbCA9IF9hMTIuJGVsLCBjdHggPSBfYTEyLmN0eDsKICAgICAgICAgICAgdmFyIHBvcyA9IGN0eC5wb3M7CiAgICAgICAgICAgIGlmICghJGVsIHx8ICFjdHgucHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU3dlZXRTY3JvbGw0LmNhZihjdHguaWQpOwogICAgICAgICAgICBjdHgucHJvZ3Jlc3MgPSBmYWxzZTsKICAgICAgICAgICAgY3R4LnN0YXJ0ID0gMDsKICAgICAgICAgICAgY3R4LmlkID0gMDsKICAgICAgICAgICAgaWYgKGdvdG9FbmQgJiYgcG9zKSB7CiAgICAgICAgICAgICAgc2V0U2Nyb2xsKCRlbCwgcG9zLmxlZnQsICJ4Iik7CiAgICAgICAgICAgICAgc2V0U2Nyb2xsKCRlbCwgcG9zLnRvcCwgInkiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICh0aGlzLiRlbCkgewogICAgICAgICAgICAgIHZhciBvcHRzID0gX19hc3NpZ24yKHt9LCB0aGlzLm9wdHMsIG9wdGlvbnMpOwogICAgICAgICAgICAgIHRoaXMuc3RvcCgpOwogICAgICAgICAgICAgIHRoaXMudW5iaW5kKHRydWUsIHRydWUpOwogICAgICAgICAgICAgIHRoaXMub3B0cyA9IG9wdHM7CiAgICAgICAgICAgICAgdGhpcy5iaW5kKHRydWUsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAodGhpcy4kZWwpIHsKICAgICAgICAgICAgICB0aGlzLnN0b3AoKTsKICAgICAgICAgICAgICB0aGlzLnVuYmluZCh0cnVlLCB0cnVlKTsKICAgICAgICAgICAgICB0aGlzLiRlbCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucHJvdG90eXBlLm9uQmVmb3JlID0gZnVuY3Rpb24oXzUsIF9fKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfTsKICAgICAgICAgIFN3ZWV0U2Nyb2xsNC5wcm90b3R5cGUub25TdGVwID0gZnVuY3Rpb24oXzUpIHsKICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucHJvdG90eXBlLm9uQWZ0ZXIgPSBmdW5jdGlvbihfNSwgX18pIHsKICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucHJvdG90eXBlLm9uQ2FuY2VsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS5vbkNvbXBsZXRlID0gZnVuY3Rpb24oXzUpIHsKICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24ob3B0cykgewogICAgICAgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7CiAgICAgICAgICAgIGN0eC5vcHRzID0gb3B0czsKICAgICAgICAgICAgY3R4LnByb2dyZXNzID0gdHJ1ZTsKICAgICAgICAgICAgY3R4LmVhc2luZyA9IGlzRnVuY3Rpb24yKG9wdHMuZWFzaW5nKSA/IG9wdHMuZWFzaW5nIDogZWFzaW5nc1tvcHRzLmVhc2luZ107CiAgICAgICAgICAgIHZhciAkY29udGFpbmVyID0gdGhpcy4kZWw7CiAgICAgICAgICAgIHZhciBzdGFydCA9IHsKICAgICAgICAgICAgICB0b3A6IGdldFNjcm9sbCgkY29udGFpbmVyLCAieSIpLAogICAgICAgICAgICAgIGxlZnQ6IGdldFNjcm9sbCgkY29udGFpbmVyLCAieCIpCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGN0eC5zdGFydFBvcyA9IHN0YXJ0OwogICAgICAgICAgICBjdHguaWQgPSBTd2VldFNjcm9sbDQucmFmKHRoaXMubG9vcCk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgX2ExMiA9IHRoaXMsICRlbCA9IF9hMTIuJGVsLCBjdHggPSBfYTEyLmN0eDsKICAgICAgICAgICAgdmFyIGhhc2ggPSBjdHguaGFzaCwgY2FuY2VsID0gY3R4LmNhbmNlbCwgb3B0cyA9IGN0eC5vcHRzLCBwb3MgPSBjdHgucG9zLCAkdHJpZ2dlciA9IGN0eC4kdHJpZ2dlcjsKICAgICAgICAgICAgaWYgKCEkZWwgfHwgIW9wdHMpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGhhc2ggIT0gbnVsbCAmJiBoYXNoICE9PSB3aW5kb3cubG9jYXRpb24uaGFzaCkgewogICAgICAgICAgICAgIHZhciB1cGRhdGVVUkwgPSBvcHRzLnVwZGF0ZVVSTDsKICAgICAgICAgICAgICBpZiAoY2FuVXNlRE9NICYmIGNhblVzZUhpc3RvcnkgJiYgdXBkYXRlVVJMICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgd2luZG93Lmhpc3RvcnlbdXBkYXRlVVJMID09PSAicmVwbGFjZSIgPyAicmVwbGFjZVN0YXRlIiA6ICJwdXNoU3RhdGUiXShudWxsLCAiIiwgaGFzaCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMudW5iaW5kKGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgY3R4Lm9wdHMgPSBudWxsOwogICAgICAgICAgICBjdHguJHRyaWdnZXIgPSBudWxsOwogICAgICAgICAgICBpZiAoY2FuY2VsKSB7CiAgICAgICAgICAgICAgdGhpcy5ob29rKG9wdHMsICJjYW5jZWwiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLmhvb2sob3B0cywgImFmdGVyIiwgcG9zLCAkdHJpZ2dlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5ob29rKG9wdHMsICJjb21wbGV0ZSIsIGNhbmNlbCk7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS5ob29rID0gZnVuY3Rpb24ob3B0aW9ucywgdHlwZTUpIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgICBhcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfYTEyOwogICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBvcHRpb25zW3R5cGU1XTsKICAgICAgICAgICAgdmFyIGNhbGxiYWNrUmVzdWx0OwogICAgICAgICAgICB2YXIgbWV0aG9kUmVzdWx0OwogICAgICAgICAgICBpZiAoaXNGdW5jdGlvbjIoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmdzLmNvbmNhdChbdGhpc10pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBtZXRob2RSZXN1bHQgPSAoX2ExMiA9IHRoaXMpWyJvbiIgKyAodHlwZTVbMF0udG9VcHBlckNhc2UoKSArIHR5cGU1LnNsaWNlKDEpKV0uYXBwbHkoX2ExMiwgYXJncyk7CiAgICAgICAgICAgIHJldHVybiBjYWxsYmFja1Jlc3VsdCAhPT0gdm9pZCAwID8gY2FsbGJhY2tSZXN1bHQgOiBtZXRob2RSZXN1bHQ7CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24oY2xpY2ssIHN0b3ApIHsKICAgICAgICAgICAgdmFyIF9hMTIgPSB0aGlzLCAkZWwgPSBfYTEyLiRlbCwgb3B0cyA9IF9hMTIuY3R4Lm9wdHM7CiAgICAgICAgICAgIGlmICgkZWwpIHsKICAgICAgICAgICAgICBpZiAoY2xpY2spIHsKICAgICAgICAgICAgICAgIGFkZEV2ZW50KCRlbCwgQ09OVEFJTkVSX0NMSUNLX0VWRU5ULCB0aGlzLmhhbmRsZUNsaWNrLCBmYWxzZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChzdG9wKSB7CiAgICAgICAgICAgICAgICBhZGRFdmVudCgkZWwsIENPTlRBSU5FUl9TVE9QX0VWRU5ULCB0aGlzLmhhbmRsZVN0b3AsIG9wdHMgPyBvcHRzLmNhbmNlbGxhYmxlIDogdHJ1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgU3dlZXRTY3JvbGw0LnByb3RvdHlwZS51bmJpbmQgPSBmdW5jdGlvbihjbGljaywgc3RvcCkgewogICAgICAgICAgICB2YXIgX2ExMiA9IHRoaXMsICRlbCA9IF9hMTIuJGVsLCBvcHRzID0gX2ExMi5jdHgub3B0czsKICAgICAgICAgICAgaWYgKCRlbCkgewogICAgICAgICAgICAgIGlmIChjbGljaykgewogICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoJGVsLCBDT05UQUlORVJfQ0xJQ0tfRVZFTlQsIHRoaXMuaGFuZGxlQ2xpY2ssIGZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHN0b3ApIHsKICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50KCRlbCwgQ09OVEFJTkVSX1NUT1BfRVZFTlQsIHRoaXMuaGFuZGxlU3RvcCwgb3B0cyA/IG9wdHMuY2FuY2VsbGFibGUgOiB0cnVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICBTd2VldFNjcm9sbDQucmFmID0gcmFmOwogICAgICAgICAgU3dlZXRTY3JvbGw0LmNhZiA9IGNhZjsKICAgICAgICAgIHJldHVybiBTd2VldFNjcm9sbDQ7CiAgICAgICAgfSkoKQogICAgICApOwogICAgICByZXR1cm4gU3dlZXRTY3JvbGwzOwogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMucGx1Z2lucy5qcwp2YXIgaW1wb3J0X3N3ZWV0X3Njcm9sbCwgbGlrOwp2YXIgaW5pdF9kb210b29sc19wbHVnaW5zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjUuMS9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLnBsdWdpbnMuanMiKCkgewogICAgaW5pdF9kaXN0X3RzMjAoKTsKICAgIGluaXRfZGlzdF90czE5KCk7CiAgICBpbml0X2Rpc3RfdHMzKCk7CiAgICBpbml0X2Rpc3RfdHMxNCgpOwogICAgaW5pdF9kaXN0X3RzMjEoKTsKICAgIGluaXRfZGlzdF90cygpOwogICAgaW5pdF9kaXN0X3RzMjIoKTsKICAgIGluaXRfZGlzdF90czIoKTsKICAgIGluaXRfZGlzdF90czIzKCk7CiAgICBpbml0X2Rpc3RfdHMxMygpOwogICAgaW5pdF9kaXN0X3RzMjQoKTsKICAgIGluaXRfZGlzdF90czE4KCk7CiAgICBpbml0X2Rpc3RfdHMyOCgpOwogICAgaW5pdF9kaXN0X3RzMTcoKTsKICAgIGluaXRfY2xhc3Nlc19vYmplY3RtYXAyKCk7CiAgICBpbml0X2NsYXNzZXNfc3RyaW5nbWFwMigpOwogICAgaW5pdF9jbGFzc2VzX2Zhc3RtYXAyKCk7CiAgICBpbml0X2xlbmlzKCk7CiAgICBpbXBvcnRfc3dlZXRfc2Nyb2xsID0gX190b0VTTShyZXF1aXJlX3N3ZWV0X3Njcm9sbCgpLCAxKTsKICAgIGxpayA9IHsKICAgICAgT2JqZWN0TWFwOiBPYmplY3RNYXAyLAogICAgICBTdHJpbmdtYXA6IFN0cmluZ21hcDIsCiAgICAgIEZhc3RNYXA6IEZhc3RNYXAyCiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjUuMS9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLmNzcy5icmVha3BvaW50cy5qcwp2YXIgZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMsIHsKICBjb250YWluZXJDb250ZXh0U3R5bGVzOiAoKSA9PiBjb250YWluZXJDb250ZXh0U3R5bGVzLAogIGNzc0ZvckNvbnN0cmFpbnQ6ICgpID0+IGNzc0ZvckNvbnN0cmFpbnQsCiAgY3NzRm9yQ29uc3RyYWludENvbnRhaW5lcjogKCkgPT4gY3NzRm9yQ29uc3RyYWludENvbnRhaW5lciwKICBjc3NGb3JDb250YWluZXI6ICgpID0+IGNzc0ZvckNvbnRhaW5lciwKICBjc3NGb3JEZXNrdG9wOiAoKSA9PiBjc3NGb3JEZXNrdG9wLAogIGNzc0Zvck5vdGVib29rOiAoKSA9PiBjc3NGb3JOb3RlYm9vaywKICBjc3NGb3JQaGFibGV0OiAoKSA9PiBjc3NGb3JQaGFibGV0LAogIGNzc0ZvclBob25lOiAoKSA9PiBjc3NGb3JQaG9uZSwKICBjc3NGb3JUYWJsZXQ6ICgpID0+IGNzc0ZvclRhYmxldCwKICBjc3NGb3JWaWV3cG9ydDogKCkgPT4gY3NzRm9yVmlld3BvcnQsCiAgZGVza3RvcDogKCkgPT4gZGVza3RvcCwKICBub3RlYm9vazogKCkgPT4gbm90ZWJvb2ssCiAgcGhhYmxldDogKCkgPT4gcGhhYmxldCwKICBwaG9uZTogKCkgPT4gcGhvbmUsCiAgdGFibGV0OiAoKSA9PiB0YWJsZXQKfSk7CnZhciBkZXNrdG9wLCBub3RlYm9vaywgdGFibGV0LCBwaGFibGV0LCBwaG9uZSwgYnVpbGRDb25kaXRpb24sIGNzc0ZvclZpZXdwb3J0LCBjc3NGb3JDb250YWluZXIsIGNzc0ZvckNvbnN0cmFpbnQsIGNzc0ZvckNvbnN0cmFpbnRDb250YWluZXIsIGNvbnRhaW5lckNvbnRleHRTdHlsZXMsIGNzc0ZvckRlc2t0b3AsIGNzc0Zvck5vdGVib29rLCBjc3NGb3JUYWJsZXQsIGNzc0ZvclBoYWJsZXQsIGNzc0ZvclBob25lOwp2YXIgaW5pdF9kb210b29sc19jc3NfYnJlYWtwb2ludHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuY3NzLmJyZWFrcG9pbnRzLmpzIigpIHsKICAgIGluaXRfZG9tdG9vbHNfY2xhc3Nlc19kb210b29scygpOwogICAgaW5pdF9saXQoKTsKICAgIGRlc2t0b3AgPSAxNjAwOwogICAgbm90ZWJvb2sgPSAxMjQwOwogICAgdGFibGV0ID0gMTAyNDsKICAgIHBoYWJsZXQgPSA2MDA7CiAgICBwaG9uZSA9IDQwMDsKICAgIGJ1aWxkQ29uZGl0aW9uID0gKGNvbnN0cmFpbnRzKSA9PiB7CiAgICAgIGNvbnN0IHBhcnRzID0gW107CiAgICAgIGlmIChjb25zdHJhaW50cy5taW5XaWR0aCkKICAgICAgICBwYXJ0cy5wdXNoKGAobWluLXdpZHRoOiAke2NvbnN0cmFpbnRzLm1pbldpZHRofXB4KWApOwogICAgICBpZiAoY29uc3RyYWludHMubWF4V2lkdGgpCiAgICAgICAgcGFydHMucHVzaChgKG1heC13aWR0aDogJHtjb25zdHJhaW50cy5tYXhXaWR0aH1weClgKTsKICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oIiBhbmQgIik7CiAgICB9OwogICAgY3NzRm9yVmlld3BvcnQgPSAoY3NzQXJnLCBjb25kaXRpb24pID0+IHsKICAgICAgcmV0dXJuIHIoYAogICAgQGNvbnRhaW5lciB3Y2NUb29sc1ZpZXdwb3J0ICR7Y29uZGl0aW9ufSB7CiAgICAgICR7Y3NzQXJnLmNzc1RleHR9CiAgICB9CiAgICBAbWVkaWEgJHtjb25kaXRpb259IHsKICAgICAgJHtjc3NBcmcuY3NzVGV4dH0KICAgIH0KICBgKTsKICAgIH07CiAgICBjc3NGb3JDb250YWluZXIgPSAoY3NzQXJnLCBjb25kaXRpb24sIGNvbnRhaW5lck5hbWUpID0+IHsKICAgICAgcmV0dXJuIHIoYAogICAgQGNvbnRhaW5lciAke2NvbnRhaW5lck5hbWV9ICR7Y29uZGl0aW9ufSB7CiAgICAgICR7Y3NzQXJnLmNzc1RleHR9CiAgICB9CiAgYCk7CiAgICB9OwogICAgY3NzRm9yQ29uc3RyYWludCA9IChjb25zdHJhaW50cykgPT4gKGNzc0FyZykgPT4gY3NzRm9yVmlld3BvcnQoY3NzQXJnLCBidWlsZENvbmRpdGlvbihjb25zdHJhaW50cykpOwogICAgY3NzRm9yQ29uc3RyYWludENvbnRhaW5lciA9IChjb25zdHJhaW50cywgY29udGFpbmVyTmFtZSkgPT4gKGNzc0FyZykgPT4gY3NzRm9yQ29udGFpbmVyKGNzc0FyZywgYnVpbGRDb25kaXRpb24oY29uc3RyYWludHMpLCBjb250YWluZXJOYW1lKTsKICAgIGNvbnRhaW5lckNvbnRleHRTdHlsZXMgPSAoY29udGFpbmVyTmFtZSkgPT4gaWAKICA6aG9zdCB7CiAgICBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7CiAgICBjb250YWluZXItbmFtZTogJHtyKGNvbnRhaW5lck5hbWUpfTsKICB9CmA7CiAgICBjc3NGb3JEZXNrdG9wID0gKGNzc0FyZykgPT4gewogICAgICByZXR1cm4gY3NzRm9yVmlld3BvcnQoY3NzQXJnLCBgKG1pbi13aWR0aDogJHtkZXNrdG9wfXB4KWApOwogICAgfTsKICAgIGNzc0Zvck5vdGVib29rID0gKGNzc0FyZykgPT4gewogICAgICByZXR1cm4gY3NzRm9yVmlld3BvcnQoY3NzQXJnLCBgKG1heC13aWR0aDogJHtub3RlYm9va31weClgKTsKICAgIH07CiAgICBjc3NGb3JUYWJsZXQgPSAoY3NzQXJnKSA9PiB7CiAgICAgIHJldHVybiBjc3NGb3JWaWV3cG9ydChjc3NBcmcsIGAobWF4LXdpZHRoOiAke3RhYmxldH1weClgKTsKICAgIH07CiAgICBjc3NGb3JQaGFibGV0ID0gKGNzc0FyZykgPT4gewogICAgICByZXR1cm4gY3NzRm9yVmlld3BvcnQoY3NzQXJnLCBgKG1heC13aWR0aDogJHtwaGFibGV0fXB4KWApOwogICAgfTsKICAgIGNzc0ZvclBob25lID0gKGNzc0FyZykgPT4gewogICAgICByZXR1cm4gY3NzRm9yVmlld3BvcnQoY3NzQXJnLCBgKG1heC13aWR0aDogJHtwaG9uZX1weClgKTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuY2xhc3Nlcy5zY3JvbGxlci5qcwp2YXIgU2Nyb2xsZXI7CnZhciBpbml0X2RvbXRvb2xzX2NsYXNzZXNfc2Nyb2xsZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuY2xhc3Nlcy5zY3JvbGxlci5qcyIoKSB7CiAgICBpbml0X2RvbXRvb2xzX3BsdWdpbnMoKTsKICAgIFNjcm9sbGVyID0gY2xhc3MgewogICAgICBkb210b29sc0luc3RhbmNlOwogICAgICAvLyBBcnJheSB0byBzdG9yZSBzY3JvbGwgY2FsbGJhY2sgZnVuY3Rpb25zLgogICAgICBzY3JvbGxDYWxsYmFja3MgPSBbXTsKICAgICAgLy8gTGVuaXMgaW5zdGFuY2UgKGlmIGFjdGl2YXRlZCkgb3IgbnVsbC4KICAgICAgbGVuaXNJbnN0YW5jZSA9IG51bGw7CiAgICAgIC8vIEJvdW5kIGhhbmRsZXJzIHRvIGFsbG93IHJlbW92YWwgZnJvbSBldmVudCBsaXN0ZW5lcnMuCiAgICAgIGhhbmRsZU5hdGl2ZVNjcm9sbCA9IChldmVudCkgPT4gewogICAgICAgIHRoaXMuZXhlY3V0ZVNjcm9sbENhbGxiYWNrcygpOwogICAgICB9OwogICAgICBoYW5kbGVMZW5pc1Njcm9sbCA9IChpbmZvKSA9PiB7CiAgICAgICAgdGhpcy5leGVjdXRlU2Nyb2xsQ2FsbGJhY2tzKCk7CiAgICAgIH07CiAgICAgIGNvbnN0cnVjdG9yKGRvbXRvb2xzSW5zdGFuY2VBcmcpIHsKICAgICAgICB0aGlzLmRvbXRvb2xzSW5zdGFuY2UgPSBkb210b29sc0luc3RhbmNlQXJnOwogICAgICAgIHRoaXMuYXR0YWNoTmF0aXZlU2Nyb2xsTGlzdGVuZXIoKTsKICAgICAgfQogICAgICBzd2VldFNjcm9sbGVyID0gbmV3IGltcG9ydF9zd2VldF9zY3JvbGwuZGVmYXVsdCh7fSk7CiAgICAgIC8qKgogICAgICAgKiBTY3JvbGxzIHRvIGEgZ2l2ZW4gZWxlbWVudCB3aXRoIG9wdGlvbnMuCiAgICAgICAqLwogICAgICBhc3luYyB0b0VsZW1lbnQoZWxlbWVudEFyZywgb3B0aW9uc0FyZykgewogICAgICAgIHRoaXMuc3dlZXRTY3JvbGxlci50b0VsZW1lbnQoZWxlbWVudEFyZywgb3B0aW9uc0FyZyk7CiAgICAgICAgYXdhaXQgZGlzdF90c19leHBvcnRzMy5kZWxheUZvcihvcHRpb25zQXJnLmR1cmF0aW9uKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogRGV0ZWN0cyB3aGV0aGVyIG5hdGl2ZSBzbW9vdGggc2Nyb2xsaW5nIGlzIGVuYWJsZWQuCiAgICAgICAqLwogICAgICBhc3luYyBkZXRlY3ROYXRpdmVTbW9vdGhTY3JvbGwoKSB7CiAgICAgICAgY29uc3QgZG9uZSA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgICAgIGNvbnN0IHNhbXBsZVNpemUgPSAxMDA7CiAgICAgICAgY29uc3QgYWNjZXB0YWJsZURlbHRhRGlmZmVyZW5jZSA9IDM7CiAgICAgICAgY29uc3QgbWluaW11bVNtb290aFJhdGlvID0gMC43NTsKICAgICAgICBjb25zdCBldmVudERlbHRhcyA9IFtdOwogICAgICAgIGZ1bmN0aW9uIG9uV2hlZWwoZXZlbnQpIHsKICAgICAgICAgIGV2ZW50RGVsdGFzLnB1c2goZXZlbnQuZGVsdGFZKTsKICAgICAgICAgIGlmIChldmVudERlbHRhcy5sZW5ndGggPj0gc2FtcGxlU2l6ZSkgewogICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2hlZWwiLCBvbldoZWVsKTsKICAgICAgICAgICAgYW5hbHl6ZUV2ZW50cygpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBhbmFseXplRXZlbnRzKCkgewogICAgICAgICAgY29uc3QgdG90YWxEaWZmcyA9IGV2ZW50RGVsdGFzLmxlbmd0aCAtIDE7CiAgICAgICAgICBsZXQgc21hbGxEaWZmQ291bnQgPSAwOwogICAgICAgICAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgdG90YWxEaWZmczsgaTExKyspIHsKICAgICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKGV2ZW50RGVsdGFzW2kxMSArIDFdIC0gZXZlbnREZWx0YXNbaTExXSk7CiAgICAgICAgICAgIGlmIChkaWZmIDw9IGFjY2VwdGFibGVEZWx0YURpZmZlcmVuY2UpIHsKICAgICAgICAgICAgICBzbWFsbERpZmZDb3VudCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBzbW9vdGhSYXRpbyA9IHNtYWxsRGlmZkNvdW50IC8gdG90YWxEaWZmczsKICAgICAgICAgIGlmIChzbW9vdGhSYXRpbyA+PSBtaW5pbXVtU21vb3RoUmF0aW8pIHsKICAgICAgICAgICAgY29uc29sZS5sb2coIlNtb290aCBzY3JvbGxpbmcgZGV0ZWN0ZWQuIik7CiAgICAgICAgICAgIGRvbmUucmVzb2x2ZSh0cnVlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJTbW9vdGggc2Nyb2xsaW5nIE5PVCBkZXRlY3RlZC4iKTsKICAgICAgICAgICAgZG9uZS5yZXNvbHZlKGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIiwgb25XaGVlbCk7CiAgICAgICAgcmV0dXJuIGRvbmUucHJvbWlzZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogRW5hYmxlcyBMZW5pcyBzY3JvbGxpbmcuCiAgICAgICAqIElmIG9wdGlvbnNBcmcuZGlzYWJsZU9uTmF0aXZlU21vb3RoU2Nyb2xsIGlzIHRydWUgYW5kIG5hdGl2ZSBzbW9vdGggc2Nyb2xsaW5nIGlzIGRldGVjdGVkLAogICAgICAgKiBMZW5pcyB3aWxsIGJlIGRlc3Ryb3llZCBpbW1lZGlhdGVseS4KICAgICAgICovCiAgICAgIGFzeW5jIGVuYWJsZUxlbmlzU2Nyb2xsKG9wdGlvbnNBcmcpIHsKICAgICAgICBjb25zdCBsZW5pcyA9IG5ldyBMZW5pcyh7CiAgICAgICAgICBhdXRvUmFmOiB0cnVlCiAgICAgICAgfSk7CiAgICAgICAgaWYgKG9wdGlvbnNBcmc/LmRpc2FibGVPbk5hdGl2ZVNtb290aFNjcm9sbCkgewogICAgICAgICAgaWYgKGF3YWl0IHRoaXMuZGV0ZWN0TmF0aXZlU21vb3RoU2Nyb2xsKCkpIHsKICAgICAgICAgICAgbGVuaXMuZGVzdHJveSgpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMubGVuaXNJbnN0YW5jZSA9IGxlbmlzOwogICAgICAgIHRoaXMuZGV0YWNoTmF0aXZlU2Nyb2xsTGlzdGVuZXIoKTsKICAgICAgICB0aGlzLmF0dGFjaExlbmlzU2Nyb2xsTGlzdGVuZXIoKTsKICAgICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBsZW5pcy5kZXN0cm95LmJpbmQobGVuaXMpOwogICAgICAgIGxlbmlzLmRlc3Ryb3kgPSAoKSA9PiB7CiAgICAgICAgICBvcmlnaW5hbERlc3Ryb3koKTsKICAgICAgICAgIHRoaXMuZGV0YWNoTGVuaXNTY3JvbGxMaXN0ZW5lcigpOwogICAgICAgICAgdGhpcy5hdHRhY2hOYXRpdmVTY3JvbGxMaXN0ZW5lcigpOwogICAgICAgICAgdGhpcy5sZW5pc0luc3RhbmNlID0gbnVsbDsKICAgICAgICB9OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSBleGVjdXRlZCBvbiBzY3JvbGwuCiAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gZWFjaCBzY3JvbGwgZXZlbnQuCiAgICAgICAqLwogICAgICBvblNjcm9sbChjYWxsYmFjaykgewogICAgICAgIHRoaXMuc2Nyb2xsQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBFeGVjdXRlcyBhbGwgcmVnaXN0ZXJlZCBzY3JvbGwgY2FsbGJhY2tzIGNvbmN1cnJlbnRseS4KICAgICAgICovCiAgICAgIGV4ZWN1dGVTY3JvbGxDYWxsYmFja3MoKSB7CiAgICAgICAgdGhpcy5zY3JvbGxDYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2spID0+IHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCJFcnJvciBpbiBzY3JvbGwgY2FsbGJhY2s6IiwgZXJyb3IpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBBdHRhY2hlcyB0aGUgbmF0aXZlIHNjcm9sbCBldmVudCBsaXN0ZW5lci4KICAgICAgICovCiAgICAgIGF0dGFjaE5hdGl2ZVNjcm9sbExpc3RlbmVyKCkgewogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCB0aGlzLmhhbmRsZU5hdGl2ZVNjcm9sbCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIERldGFjaGVzIHRoZSBuYXRpdmUgc2Nyb2xsIGV2ZW50IGxpc3RlbmVyLgogICAgICAgKi8KICAgICAgZGV0YWNoTmF0aXZlU2Nyb2xsTGlzdGVuZXIoKSB7CiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIHRoaXMuaGFuZGxlTmF0aXZlU2Nyb2xsKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQXR0YWNoZXMgdGhlIExlbmlzIHNjcm9sbCBldmVudCBsaXN0ZW5lci4KICAgICAgICovCiAgICAgIGF0dGFjaExlbmlzU2Nyb2xsTGlzdGVuZXIoKSB7CiAgICAgICAgaWYgKHRoaXMubGVuaXNJbnN0YW5jZSkgewogICAgICAgICAgdGhpcy5sZW5pc0luc3RhbmNlLm9uKCJzY3JvbGwiLCB0aGlzLmhhbmRsZUxlbmlzU2Nyb2xsKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIERldGFjaGVzIHRoZSBMZW5pcyBzY3JvbGwgZXZlbnQgbGlzdGVuZXIuCiAgICAgICAqLwogICAgICBkZXRhY2hMZW5pc1Njcm9sbExpc3RlbmVyKCkgewogICAgICAgIGlmICh0aGlzLmxlbmlzSW5zdGFuY2UpIHsKICAgICAgICAgIHRoaXMubGVuaXNJbnN0YW5jZS5vZmYoInNjcm9sbCIsIHRoaXMuaGFuZGxlTGVuaXNTY3JvbGwpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi41LjEvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5jbGFzc2VzLnRoZW1lbWFuYWdlci5qcwp2YXIgVGhlbWVNYW5hZ2VyOwp2YXIgaW5pdF9kb210b29sc19jbGFzc2VzX3RoZW1lbWFuYWdlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi41LjEvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5jbGFzc2VzLnRoZW1lbWFuYWdlci5qcyIoKSB7CiAgICBpbml0X2RvbXRvb2xzX2NsYXNzZXNfZG9tdG9vbHMoKTsKICAgIGluaXRfZG9tdG9vbHNfcGx1Z2lucygpOwogICAgVGhlbWVNYW5hZ2VyID0gY2xhc3MgewogICAgICBkb210b29sc1JlZjsKICAgICAgZ29CcmlnaHRCb29sZWFuID0gZmFsc2U7CiAgICAgIHByZWZlcnJlZENvbG9yU2NoZW1lTWVkaWFNYXRjaCA9IHdpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KSIpOwogICAgICB0aGVtZU9ic2VydmFibGUgPSBuZXcgZGlzdF90c19leHBvcnRzMi5yeGpzLlJlcGxheVN1YmplY3QoMSk7CiAgICAgIGNvbnN0cnVjdG9yKGRvbXRvb2xzUmVmQXJnKSB7CiAgICAgICAgdGhpcy5kb210b29sc1JlZiA9IGRvbXRvb2xzUmVmQXJnOwogICAgICAgIHRoaXMuZ29CcmlnaHRCb29sZWFuID0gdGhpcy5wcmVmZXJyZWRDb2xvclNjaGVtZU1lZGlhTWF0Y2gubWF0Y2hlczsKICAgICAgICB0aGlzLnByZWZlcnJlZENvbG9yU2NoZW1lTWVkaWFNYXRjaC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCAoZXZlbnRBcmcpID0+IHsKICAgICAgICAgIHRoaXMuZ29CcmlnaHRCb29sZWFuID0gZXZlbnRBcmcubWF0Y2hlczsKICAgICAgICAgIHRoaXMudXBkYXRlQWxsQ29ubmVjdGVkRWxlbWVudHMoKTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLnVwZGF0ZUFsbENvbm5lY3RlZEVsZW1lbnRzKCk7CiAgICAgIH0KICAgICAgYXN5bmMgZW5hYmxlQXV0b21hdGljR2xvYmFsVGhlbWVDaGFuZ2UoKSB7CiAgICAgICAgaWYgKGRvY3VtZW50LmJvZHkgJiYgZG9jdW1lbnQuYm9keS5zdHlsZSkgewogICAgICAgICAgdGhpcy50aGVtZU9ic2VydmFibGUuc3Vic2NyaWJlKHsKICAgICAgICAgICAgbmV4dDogKGdvQnJpZ2h0KSA9PiB7CiAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5iYWNrZ3JvdW5kID0gZ29CcmlnaHQgPyAiI2ZmZiIgOiAiIzAwMCI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBhc3luYyB1cGRhdGVBbGxDb25uZWN0ZWRFbGVtZW50cygpIHsKICAgICAgICB0aGlzLnRoZW1lT2JzZXJ2YWJsZS5uZXh0KHRoaXMuZ29CcmlnaHRCb29sZWFuKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogc2V0IHRoZSB0aGVtZSBvZiB0aGUgd2Vic2l0ZSB0byBicmlnaHQKICAgICAgICovCiAgICAgIGdvQnJpZ2h0KCkgewogICAgICAgIHRoaXMuZ29CcmlnaHRCb29sZWFuID0gdHJ1ZTsKICAgICAgICB0aGlzLnVwZGF0ZUFsbENvbm5lY3RlZEVsZW1lbnRzKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHNldCB0aGUgdGhlbWUgb2YgdGhlIHdlYnNpdGUgdG8gZGFyawogICAgICAgKi8KICAgICAgZ29EYXJrKCkgewogICAgICAgIHRoaXMuZ29CcmlnaHRCb29sZWFuID0gZmFsc2U7CiAgICAgICAgdGhpcy51cGRhdGVBbGxDb25uZWN0ZWRFbGVtZW50cygpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBzaW1wbHkgdG9nZ2xlIGJldHdlZW4gYnJpZ2h0IGFuZCBkYXJrCiAgICAgICAqLwogICAgICB0b2dnbGVEYXJrQnJpZ2h0KCkgewogICAgICAgIHRoaXMuZ29CcmlnaHRCb29sZWFuID0gIXRoaXMuZ29CcmlnaHRCb29sZWFuOwogICAgICAgIHRoaXMudXBkYXRlQWxsQ29ubmVjdGVkRWxlbWVudHMoKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi41LjEvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5jbGFzc2VzLmtleWJvYXJkLmpzCnZhciBLZXksIEtleWJvYXJkOwp2YXIgaW5pdF9kb210b29sc19jbGFzc2VzX2tleWJvYXJkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjUuMS9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLmNsYXNzZXMua2V5Ym9hcmQuanMiKCkgewogICAgaW5pdF9kb210b29sc19wbHVnaW5zKCk7CiAgICAoZnVuY3Rpb24oS2V5MykgewogICAgICBLZXkzW0tleTNbIkJhY2tzcGFjZSJdID0gOF0gPSAiQmFja3NwYWNlIjsKICAgICAgS2V5M1tLZXkzWyJUYWIiXSA9IDldID0gIlRhYiI7CiAgICAgIEtleTNbS2V5M1siRW50ZXIiXSA9IDEzXSA9ICJFbnRlciI7CiAgICAgIEtleTNbS2V5M1siU2hpZnQiXSA9IDE2XSA9ICJTaGlmdCI7CiAgICAgIEtleTNbS2V5M1siQ3RybCJdID0gMTddID0gIkN0cmwiOwogICAgICBLZXkzW0tleTNbIkFsdCJdID0gMThdID0gIkFsdCI7CiAgICAgIEtleTNbS2V5M1siUGF1c2VCcmVhayJdID0gMTldID0gIlBhdXNlQnJlYWsiOwogICAgICBLZXkzW0tleTNbIkNhcHNMb2NrIl0gPSAyMF0gPSAiQ2Fwc0xvY2siOwogICAgICBLZXkzW0tleTNbIkVzY2FwZSJdID0gMjddID0gIkVzY2FwZSI7CiAgICAgIEtleTNbS2V5M1siU3BhY2UiXSA9IDMyXSA9ICJTcGFjZSI7CiAgICAgIEtleTNbS2V5M1siUGFnZVVwIl0gPSAzM10gPSAiUGFnZVVwIjsKICAgICAgS2V5M1tLZXkzWyJQYWdlRG93biJdID0gMzRdID0gIlBhZ2VEb3duIjsKICAgICAgS2V5M1tLZXkzWyJFbmQiXSA9IDM1XSA9ICJFbmQiOwogICAgICBLZXkzW0tleTNbIkhvbWUiXSA9IDM2XSA9ICJIb21lIjsKICAgICAgS2V5M1tLZXkzWyJMZWZ0QXJyb3ciXSA9IDM3XSA9ICJMZWZ0QXJyb3ciOwogICAgICBLZXkzW0tleTNbIlVwQXJyb3ciXSA9IDM4XSA9ICJVcEFycm93IjsKICAgICAgS2V5M1tLZXkzWyJSaWdodEFycm93Il0gPSAzOV0gPSAiUmlnaHRBcnJvdyI7CiAgICAgIEtleTNbS2V5M1siRG93bkFycm93Il0gPSA0MF0gPSAiRG93bkFycm93IjsKICAgICAgS2V5M1tLZXkzWyJJbnNlcnQiXSA9IDQ1XSA9ICJJbnNlcnQiOwogICAgICBLZXkzW0tleTNbIkRlbGV0ZSJdID0gNDZdID0gIkRlbGV0ZSI7CiAgICAgIEtleTNbS2V5M1siWmVybyJdID0gNDhdID0gIlplcm8iOwogICAgICBLZXkzW0tleTNbIkNsb3NlZFBhcmVuIl0gPSA0OF0gPSAiQ2xvc2VkUGFyZW4iOwogICAgICBLZXkzW0tleTNbIk9uZSJdID0gNDldID0gIk9uZSI7CiAgICAgIEtleTNbS2V5M1siRXhjbGFtYXRpb25NYXJrIl0gPSA0OV0gPSAiRXhjbGFtYXRpb25NYXJrIjsKICAgICAgS2V5M1tLZXkzWyJUd28iXSA9IDUwXSA9ICJUd28iOwogICAgICBLZXkzW0tleTNbIkF0U2lnbiJdID0gNTBdID0gIkF0U2lnbiI7CiAgICAgIEtleTNbS2V5M1siVGhyZWUiXSA9IDUxXSA9ICJUaHJlZSI7CiAgICAgIEtleTNbS2V5M1siUG91bmRTaWduIl0gPSA1MV0gPSAiUG91bmRTaWduIjsKICAgICAgS2V5M1tLZXkzWyJIYXNoIl0gPSA1MV0gPSAiSGFzaCI7CiAgICAgIEtleTNbS2V5M1siRm91ciJdID0gNTJdID0gIkZvdXIiOwogICAgICBLZXkzW0tleTNbIkRvbGxhclNpZ24iXSA9IDUyXSA9ICJEb2xsYXJTaWduIjsKICAgICAgS2V5M1tLZXkzWyJGaXZlIl0gPSA1M10gPSAiRml2ZSI7CiAgICAgIEtleTNbS2V5M1siUGVyY2VudFNpZ24iXSA9IDUzXSA9ICJQZXJjZW50U2lnbiI7CiAgICAgIEtleTNbS2V5M1siU2l4Il0gPSA1NF0gPSAiU2l4IjsKICAgICAgS2V5M1tLZXkzWyJDYXJldCJdID0gNTRdID0gIkNhcmV0IjsKICAgICAgS2V5M1tLZXkzWyJIYXQiXSA9IDU0XSA9ICJIYXQiOwogICAgICBLZXkzW0tleTNbIlNldmVuIl0gPSA1NV0gPSAiU2V2ZW4iOwogICAgICBLZXkzW0tleTNbIkFtcGVyc2FuZCJdID0gNTVdID0gIkFtcGVyc2FuZCI7CiAgICAgIEtleTNbS2V5M1siRWlnaHQiXSA9IDU2XSA9ICJFaWdodCI7CiAgICAgIEtleTNbS2V5M1siU3RhciJdID0gNTZdID0gIlN0YXIiOwogICAgICBLZXkzW0tleTNbIkFzdGVyaWsiXSA9IDU2XSA9ICJBc3RlcmlrIjsKICAgICAgS2V5M1tLZXkzWyJOaW5lIl0gPSA1N10gPSAiTmluZSI7CiAgICAgIEtleTNbS2V5M1siT3BlblBhcmVuIl0gPSA1N10gPSAiT3BlblBhcmVuIjsKICAgICAgS2V5M1tLZXkzWyJBIl0gPSA2NV0gPSAiQSI7CiAgICAgIEtleTNbS2V5M1siQiJdID0gNjZdID0gIkIiOwogICAgICBLZXkzW0tleTNbIkMiXSA9IDY3XSA9ICJDIjsKICAgICAgS2V5M1tLZXkzWyJEIl0gPSA2OF0gPSAiRCI7CiAgICAgIEtleTNbS2V5M1siRSJdID0gNjldID0gIkUiOwogICAgICBLZXkzW0tleTNbIkYiXSA9IDcwXSA9ICJGIjsKICAgICAgS2V5M1tLZXkzWyJHIl0gPSA3MV0gPSAiRyI7CiAgICAgIEtleTNbS2V5M1siSCJdID0gNzJdID0gIkgiOwogICAgICBLZXkzW0tleTNbIkkiXSA9IDczXSA9ICJJIjsKICAgICAgS2V5M1tLZXkzWyJKIl0gPSA3NF0gPSAiSiI7CiAgICAgIEtleTNbS2V5M1siSyJdID0gNzVdID0gIksiOwogICAgICBLZXkzW0tleTNbIkwiXSA9IDc2XSA9ICJMIjsKICAgICAgS2V5M1tLZXkzWyJNIl0gPSA3N10gPSAiTSI7CiAgICAgIEtleTNbS2V5M1siTiJdID0gNzhdID0gIk4iOwogICAgICBLZXkzW0tleTNbIk8iXSA9IDc5XSA9ICJPIjsKICAgICAgS2V5M1tLZXkzWyJQIl0gPSA4MF0gPSAiUCI7CiAgICAgIEtleTNbS2V5M1siUSJdID0gODFdID0gIlEiOwogICAgICBLZXkzW0tleTNbIlIiXSA9IDgyXSA9ICJSIjsKICAgICAgS2V5M1tLZXkzWyJTIl0gPSA4M10gPSAiUyI7CiAgICAgIEtleTNbS2V5M1siVCJdID0gODRdID0gIlQiOwogICAgICBLZXkzW0tleTNbIlUiXSA9IDg1XSA9ICJVIjsKICAgICAgS2V5M1tLZXkzWyJWIl0gPSA4Nl0gPSAiViI7CiAgICAgIEtleTNbS2V5M1siVyJdID0gODddID0gIlciOwogICAgICBLZXkzW0tleTNbIlgiXSA9IDg4XSA9ICJYIjsKICAgICAgS2V5M1tLZXkzWyJZIl0gPSA4OV0gPSAiWSI7CiAgICAgIEtleTNbS2V5M1siWiJdID0gOTBdID0gIloiOwogICAgICBLZXkzW0tleTNbIkxlZnRXaW5kb3dLZXkiXSA9IDkxXSA9ICJMZWZ0V2luZG93S2V5IjsKICAgICAgS2V5M1tLZXkzWyJSaWdodFdpbmRvd0tleSJdID0gOTJdID0gIlJpZ2h0V2luZG93S2V5IjsKICAgICAgS2V5M1tLZXkzWyJTZWxlY3RLZXkiXSA9IDkzXSA9ICJTZWxlY3RLZXkiOwogICAgICBLZXkzW0tleTNbIk51bXBhZDAiXSA9IDk2XSA9ICJOdW1wYWQwIjsKICAgICAgS2V5M1tLZXkzWyJOdW1wYWQxIl0gPSA5N10gPSAiTnVtcGFkMSI7CiAgICAgIEtleTNbS2V5M1siTnVtcGFkMiJdID0gOThdID0gIk51bXBhZDIiOwogICAgICBLZXkzW0tleTNbIk51bXBhZDMiXSA9IDk5XSA9ICJOdW1wYWQzIjsKICAgICAgS2V5M1tLZXkzWyJOdW1wYWQ0Il0gPSAxMDBdID0gIk51bXBhZDQiOwogICAgICBLZXkzW0tleTNbIk51bXBhZDUiXSA9IDEwMV0gPSAiTnVtcGFkNSI7CiAgICAgIEtleTNbS2V5M1siTnVtcGFkNiJdID0gMTAyXSA9ICJOdW1wYWQ2IjsKICAgICAgS2V5M1tLZXkzWyJOdW1wYWQ3Il0gPSAxMDNdID0gIk51bXBhZDciOwogICAgICBLZXkzW0tleTNbIk51bXBhZDgiXSA9IDEwNF0gPSAiTnVtcGFkOCI7CiAgICAgIEtleTNbS2V5M1siTnVtcGFkOSJdID0gMTA1XSA9ICJOdW1wYWQ5IjsKICAgICAgS2V5M1tLZXkzWyJNdWx0aXBseSJdID0gMTA2XSA9ICJNdWx0aXBseSI7CiAgICAgIEtleTNbS2V5M1siQWRkIl0gPSAxMDddID0gIkFkZCI7CiAgICAgIEtleTNbS2V5M1siU3VidHJhY3QiXSA9IDEwOV0gPSAiU3VidHJhY3QiOwogICAgICBLZXkzW0tleTNbIkRlY2ltYWxQb2ludCJdID0gMTEwXSA9ICJEZWNpbWFsUG9pbnQiOwogICAgICBLZXkzW0tleTNbIkRpdmlkZSJdID0gMTExXSA9ICJEaXZpZGUiOwogICAgICBLZXkzW0tleTNbIkYxIl0gPSAxMTJdID0gIkYxIjsKICAgICAgS2V5M1tLZXkzWyJGMiJdID0gMTEzXSA9ICJGMiI7CiAgICAgIEtleTNbS2V5M1siRjMiXSA9IDExNF0gPSAiRjMiOwogICAgICBLZXkzW0tleTNbIkY0Il0gPSAxMTVdID0gIkY0IjsKICAgICAgS2V5M1tLZXkzWyJGNSJdID0gMTE2XSA9ICJGNSI7CiAgICAgIEtleTNbS2V5M1siRjYiXSA9IDExN10gPSAiRjYiOwogICAgICBLZXkzW0tleTNbIkY3Il0gPSAxMThdID0gIkY3IjsKICAgICAgS2V5M1tLZXkzWyJGOCJdID0gMTE5XSA9ICJGOCI7CiAgICAgIEtleTNbS2V5M1siRjkiXSA9IDEyMF0gPSAiRjkiOwogICAgICBLZXkzW0tleTNbIkYxMCJdID0gMTIxXSA9ICJGMTAiOwogICAgICBLZXkzW0tleTNbIkYxMSJdID0gMTIyXSA9ICJGMTEiOwogICAgICBLZXkzW0tleTNbIkYxMiJdID0gMTIzXSA9ICJGMTIiOwogICAgICBLZXkzW0tleTNbIk51bUxvY2siXSA9IDE0NF0gPSAiTnVtTG9jayI7CiAgICAgIEtleTNbS2V5M1siU2Nyb2xsTG9jayJdID0gMTQ1XSA9ICJTY3JvbGxMb2NrIjsKICAgICAgS2V5M1tLZXkzWyJTZW1pQ29sb24iXSA9IDE4Nl0gPSAiU2VtaUNvbG9uIjsKICAgICAgS2V5M1tLZXkzWyJFcXVhbHMiXSA9IDE4N10gPSAiRXF1YWxzIjsKICAgICAgS2V5M1tLZXkzWyJDb21tYSJdID0gMTg4XSA9ICJDb21tYSI7CiAgICAgIEtleTNbS2V5M1siRGFzaCJdID0gMTg5XSA9ICJEYXNoIjsKICAgICAgS2V5M1tLZXkzWyJQZXJpb2QiXSA9IDE5MF0gPSAiUGVyaW9kIjsKICAgICAgS2V5M1tLZXkzWyJVbmRlclNjb3JlIl0gPSAxODldID0gIlVuZGVyU2NvcmUiOwogICAgICBLZXkzW0tleTNbIlBsdXNTaWduIl0gPSAxODddID0gIlBsdXNTaWduIjsKICAgICAgS2V5M1tLZXkzWyJGb3J3YXJkU2xhc2giXSA9IDE5MV0gPSAiRm9yd2FyZFNsYXNoIjsKICAgICAgS2V5M1tLZXkzWyJUaWxkZSJdID0gMTkyXSA9ICJUaWxkZSI7CiAgICAgIEtleTNbS2V5M1siR3JhdmVBY2NlbnQiXSA9IDE5Ml0gPSAiR3JhdmVBY2NlbnQiOwogICAgICBLZXkzW0tleTNbIk9wZW5CcmFja2V0Il0gPSAyMTldID0gIk9wZW5CcmFja2V0IjsKICAgICAgS2V5M1tLZXkzWyJDbG9zZWRCcmFja2V0Il0gPSAyMjFdID0gIkNsb3NlZEJyYWNrZXQiOwogICAgICBLZXkzW0tleTNbIlF1b3RlIl0gPSAyMjJdID0gIlF1b3RlIjsKICAgIH0pKEtleSB8fCAoS2V5ID0ge30pKTsKICAgIEtleWJvYXJkID0gY2xhc3MgewogICAgICBkb21Ob2RlOwogICAgICBtYXBDb21ib3NUb0hhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgcHJlc3NlZEtleXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgICBjb25zdHJ1Y3Rvcihkb21Ob2RlKSB7CiAgICAgICAgdGhpcy5kb21Ob2RlID0gZG9tTm9kZTsKICAgICAgICB0aGlzLnN0YXJ0TGlzdGVuaW5nKCk7CiAgICAgIH0KICAgICAga2V5RW51bSA9IEtleTsKICAgICAgb24oa2V5czIpIHsKICAgICAgICBjb25zdCBzdWJqZWN0ID0gbmV3IGRpc3RfdHNfZXhwb3J0czIucnhqcy5TdWJqZWN0KCk7CiAgICAgICAgdGhpcy5yZWdpc3RlcktleXMoa2V5czIsIHN1YmplY3QpOwogICAgICAgIHJldHVybiBzdWJqZWN0OwogICAgICB9CiAgICAgIHRyaWdnZXJLZXlQcmVzcyhrZXlzQXJnKSB7CiAgICAgICAgZm9yIChjb25zdCBrZXkyIG9mIGtleXNBcmcpIHsKICAgICAgICAgIHRoaXMucHJlc3NlZEtleXMuYWRkKGtleTIpOwogICAgICAgIH0KICAgICAgICB0aGlzLmNoZWNrTWF0Y2hpbmdLZXlib2FyZFN1YmplY3RzKCk7CiAgICAgICAgZm9yIChjb25zdCBrZXkyIG9mIGtleXNBcmcpIHsKICAgICAgICAgIHRoaXMucHJlc3NlZEtleXMuZGVsZXRlKGtleTIpOwogICAgICAgIH0KICAgICAgfQogICAgICBzdGFydExpc3RlbmluZygpIHsKICAgICAgICB0aGlzLmRvbU5vZGUuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIHRoaXMuaGFuZGxlS2V5RG93bik7CiAgICAgICAgdGhpcy5kb21Ob2RlLmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIiwgdGhpcy5oYW5kbGVLZXlVcCk7CiAgICAgIH0KICAgICAgc3RvcExpc3RlbmluZygpIHsKICAgICAgICB0aGlzLmRvbU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIHRoaXMuaGFuZGxlS2V5RG93bik7CiAgICAgICAgdGhpcy5kb21Ob2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIiwgdGhpcy5oYW5kbGVLZXlVcCk7CiAgICAgIH0KICAgICAgY2xlYXIoKSB7CiAgICAgICAgdGhpcy5zdG9wTGlzdGVuaW5nKCk7CiAgICAgICAgdGhpcy5tYXBDb21ib3NUb0hhbmRsZXJzLmNsZWFyKCk7CiAgICAgICAgdGhpcy5wcmVzc2VkS2V5cy5jbGVhcigpOwogICAgICB9CiAgICAgIGhhbmRsZUtleURvd24gPSAoZXZlbnQpID0+IHsKICAgICAgICB0aGlzLnByZXNzZWRLZXlzLmFkZChldmVudC5rZXlDb2RlKTsKICAgICAgICB0aGlzLmNoZWNrTWF0Y2hpbmdLZXlib2FyZFN1YmplY3RzKGV2ZW50KTsKICAgICAgfTsKICAgICAgY2hlY2tNYXRjaGluZ0tleWJvYXJkU3ViamVjdHMocGF5bG9hZEFyZykgewogICAgICAgIHRoaXMubWFwQ29tYm9zVG9IYW5kbGVycy5mb3JFYWNoKChzdWJqZWN0QXJnLCBrZXlzQXJnKSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5hcmVBbGxLZXlzUHJlc3NlZChrZXlzQXJnKSkgewogICAgICAgICAgICBzdWJqZWN0QXJnLm5leHQocGF5bG9hZEFyZyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaGFuZGxlS2V5VXAgPSAoZXZlbnQpID0+IHsKICAgICAgICB0aGlzLnByZXNzZWRLZXlzLmRlbGV0ZShldmVudC5rZXlDb2RlKTsKICAgICAgfTsKICAgICAgYXJlQWxsS2V5c1ByZXNzZWQoa2V5c0FyZykgewogICAgICAgIGxldCByZXN1bHQgPSB0cnVlOwogICAgICAgIGtleXNBcmcuZm9yRWFjaCgoa2V5MikgPT4gewogICAgICAgICAgaWYgKCF0aGlzLnByZXNzZWRLZXlzLmhhcyhrZXkyKSkgewogICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIHJlZ2lzdGVyS2V5cyhrZXlzQXJnLCBzdWJqZWN0QXJnKSB7CiAgICAgICAgaWYgKCF0aGlzLm1hcENvbWJvc1RvSGFuZGxlcnMuaGFzKGtleXNBcmcpKSB7CiAgICAgICAgICB0aGlzLm1hcENvbWJvc1RvSGFuZGxlcnMuc2V0KGtleXNBcmcsIHN1YmplY3RBcmcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5tYXBDb21ib3NUb0hhbmRsZXJzLmdldChrZXlzQXJnKTsKICAgICAgICAgIHJldHVybiBzdWJqZWN0OwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi41LjEvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5jbGFzc2VzLmRvbXRvb2xzLmpzCnZhciBEb21Ub29sczsKdmFyIGluaXRfZG9tdG9vbHNfY2xhc3Nlc19kb210b29scyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi41LjEvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5jbGFzc2VzLmRvbXRvb2xzLmpzIigpIHsKICAgIGluaXRfZG9tdG9vbHNfcGx1Z2lucygpOwogICAgaW5pdF9kb210b29sc19jc3NfYnJlYWtwb2ludHMoKTsKICAgIGluaXRfZG9tdG9vbHNfY2xhc3Nlc19zY3JvbGxlcigpOwogICAgaW5pdF9kaXN0X3RzMjgoKTsKICAgIGluaXRfZG9tdG9vbHNfY2xhc3Nlc190aGVtZW1hbmFnZXIoKTsKICAgIGluaXRfZG9tdG9vbHNfY2xhc3Nlc19rZXlib2FyZCgpOwogICAgRG9tVG9vbHMgPSBjbGFzcyBfRG9tVG9vbHMgewogICAgICAvLyA9PT09PT0KICAgICAgLy8gU1RBVElDCiAgICAgIC8vID09PT09PQogICAgICBzdGF0aWMgaW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbnVsbDsKICAgICAgLyoqCiAgICAgICAqIHNldHVwcyBkb210b29scwogICAgICAgKi8KICAgICAgc3RhdGljIGFzeW5jIHNldHVwRG9tVG9vbHMob3B0aW9uc0FyZyA9IHt9KSB7CiAgICAgICAgaWYgKCFvcHRpb25zQXJnLmlnbm9yZUdsb2JhbCAmJiBfRG9tVG9vbHMuaW5pdGlhbGl6YXRpb25Qcm9taXNlKSB7CiAgICAgICAgICByZXR1cm4gYXdhaXQgX0RvbVRvb2xzLmluaXRpYWxpemF0aW9uUHJvbWlzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFvcHRpb25zQXJnLmlnbm9yZUdsb2JhbCkgewogICAgICAgICAgX0RvbVRvb2xzLmluaXRpYWxpemF0aW9uUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGxldCBkb21Ub29sc0luc3RhbmNlOwogICAgICAgICAgICBpZiAoIWdsb2JhbFRoaXMuZGVlc0RvbVRvb2xzKSB7CiAgICAgICAgICAgICAgZ2xvYmFsVGhpcy5kZWVzRG9tVG9vbHMgPSBuZXcgX0RvbVRvb2xzKG9wdGlvbnNBcmcpOwogICAgICAgICAgICAgIGRvbVRvb2xzSW5zdGFuY2UgPSBnbG9iYWxUaGlzLmRlZXNEb21Ub29sczsKICAgICAgICAgICAgICBjb25zdCByZWFkeVN0YXRlQ2hhbmdlZEZ1bmMgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImludGVyYWN0aXZlIiB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiKSB7CiAgICAgICAgICAgICAgICAgIGRvbVRvb2xzSW5zdGFuY2UuZWxlbWVudHMuaGVhZEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJoZWFkIik7CiAgICAgICAgICAgICAgICAgIGRvbVRvb2xzSW5zdGFuY2UuZWxlbWVudHMuYm9keUVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJib2R5Iik7CiAgICAgICAgICAgICAgICAgIGRvbVRvb2xzSW5zdGFuY2Uua2V5Ym9hcmQgPSBuZXcgS2V5Ym9hcmQoZG9jdW1lbnQuYm9keSk7CiAgICAgICAgICAgICAgICAgIGRvbVRvb2xzSW5zdGFuY2UuZG9tUmVhZHkucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJpbnRlcmFjdGl2ZSIgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgewogICAgICAgICAgICAgICAgcmVhZHlTdGF0ZUNoYW5nZWRGdW5jKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLCByZWFkeVN0YXRlQ2hhbmdlZEZ1bmMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBkb21Ub29sc0luc3RhbmNlLmRvbVRvb2xzUmVhZHkucmVzb2x2ZSgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGRvbVRvb2xzSW5zdGFuY2UgPSBnbG9iYWxUaGlzLmRlZXNEb21Ub29sczsKICAgICAgICAgICAgfQogICAgICAgICAgICBhd2FpdCBkb21Ub29sc0luc3RhbmNlLmRvbVRvb2xzUmVhZHkucHJvbWlzZTsKICAgICAgICAgICAgcmV0dXJuIGRvbVRvb2xzSW5zdGFuY2U7CiAgICAgICAgICB9KSgpOwogICAgICAgICAgcmV0dXJuIGF3YWl0IF9Eb21Ub29scy5pbml0aWFsaXphdGlvblByb21pc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGRvbVRvb2xzSW5zdGFuY2UgPSBuZXcgX0RvbVRvb2xzKG9wdGlvbnNBcmcpOwogICAgICAgICAgcmV0dXJuIGRvbVRvb2xzSW5zdGFuY2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBpZiB5b3UgY2FuLCB1c2UgdGhlIHN0YXRpYyBhc3lzbmMgLnNldHVwRG9tVG9vbHMoKSBmdW5jdGlvbiBpbnN0ZWFkIHNpbmNlIGl0IGlzIHNhZmVyIHRvIHVzZS4KICAgICAgICovCiAgICAgIHN0YXRpYyBnZXRHbG9iYWxEb21Ub29sc1N5bmMoKSB7CiAgICAgICAgY29uc3QgZ2xvYmFsRG9tVG9vbHMgPSBnbG9iYWxUaGlzLmRlZXNEb21Ub29sczsKICAgICAgICBpZiAoIWdsb2JhbERvbVRvb2xzKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIllvdSB0cmllZCB0byBhY2Nlc3MgZG9tdG9vbHMgc3luY2hyb25vdXNseSB0b28gZWFybHkiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGdsb2JhbFRoaXMuZGVlc0RvbVRvb2xzOwogICAgICB9CiAgICAgIC8vID09PT09PT09CiAgICAgIC8vIElOU1RBTkNFCiAgICAgIC8vID09PT09PT09CiAgICAgIC8vIGVsZW1lbnRzCiAgICAgIGVsZW1lbnRzID0gewogICAgICAgIGhlYWRFbGVtZW50OiBudWxsLAogICAgICAgIGJvZHlFbGVtZW50OiBudWxsCiAgICAgIH07CiAgICAgIHdlYnNldHVwID0gbmV3IFdlYlNldHVwKHsKICAgICAgICBtZXRhT2JqZWN0OiB7CiAgICAgICAgICB0aXRsZTogIiIKICAgICAgICB9CiAgICAgIH0pOwogICAgICBzbWFydHN0YXRlID0gbmV3IGRpc3RfdHNfZXhwb3J0czIzLlNtYXJ0c3RhdGUoKTsKICAgICAgZG9tVG9vbHNTdGF0ZVBhcnQgPSB0aGlzLnNtYXJ0c3RhdGUuZ2V0U3RhdGVQYXJ0KCJkb210b29scyIsIHsKICAgICAgICB2aXJ0dWFsVmlld3BvcnQ6ICJuYXRpdmUiLAogICAgICAgIGp3dDogbnVsbAogICAgICB9KTsKICAgICAgcm91dGVyID0gbmV3IGRpc3RfdHNfZXhwb3J0czIyLlNtYXJ0Um91dGVyKHsKICAgICAgICBkZWJ1ZzogZmFsc2UKICAgICAgfSk7CiAgICAgIGNvbnZlbmllbmNlID0gewogICAgICAgIHR5cGVkcmVxdWVzdDogZGlzdF90c19leHBvcnRzMTksCiAgICAgICAgc21hcnRkZWxheTogZGlzdF90c19leHBvcnRzMywKICAgICAgICBzbWFydGpzb246IGRpc3RfdHNfZXhwb3J0czE0LAogICAgICAgIHNtYXJ0dXJsOiBkaXN0X3RzX2V4cG9ydHMyNAogICAgICB9OwogICAgICBkZWVzQ29tbXMgPSBuZXcgZGlzdF90c19leHBvcnRzMjAuRGVlc0NvbW1zKCk7CiAgICAgIHNjcm9sbGVyID0gbmV3IFNjcm9sbGVyKHRoaXMpOwogICAgICB0aGVtZU1hbmFnZXIgPSBuZXcgVGhlbWVNYW5hZ2VyKHRoaXMpOwogICAgICBrZXlib2FyZCA9IG51bGw7CiAgICAgIC8vIEluaXRpYWxpemVkIGFmdGVyIERPTSByZWFkeSB0byBhdm9pZCBhY2Nlc3NpbmcgZG9jdW1lbnQuYm9keSBiZWZvcmUgaXQgZXhpc3RzCiAgICAgIGRvbVRvb2xzUmVhZHkgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgICAgZG9tUmVhZHkgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgICAgZ2xvYmFsU3R5bGVzUmVhZHkgPSBkaXN0X3RzX2V4cG9ydHMuZGVmZXIoKTsKICAgICAgY29uc3RydWN0b3Iob3B0aW9uc0FyZykgewogICAgICB9CiAgICAgIHJ1bk9uY2VUcmFja2VyU3RyaW5nTWFwID0gbmV3IGxpay5TdHJpbmdtYXAoKTsKICAgICAgcnVuT25jZVJlc3VsdE1hcCA9IG5ldyBsaWsuRmFzdE1hcCgpOwogICAgICBydW5PbmNlRXJyb3JNYXAgPSBuZXcgbGlrLkZhc3RNYXAoKTsKICAgICAgLyoqCiAgICAgICAqIHJ1biBhIGZ1bmN0aW9uIG9uY2UgYW5kIGFsd2F5cyBnZXQgdGhlIFByb21pc2Ugb2YgdGhlIGZpcnN0IGV4ZWN1dGlvbgogICAgICAgKiBAcGFyYW0gaWRlbnRpZmllckFyZyB0aGUgaW5kZW50aWZpZXIgYXJnIGlkZW50aWZpZXMgZnVuY3Rpb25zLiBmdW5jdGlvbnMgd2l0aCB0aGUgc2FtZSBpZGVudGlmaWVyIGFyZSBjb25zaWRlcmVkIGVxdWFsCiAgICAgICAqIEBwYXJhbSBmdW5jQXJnIHRoZSBhY3R1YWwgZnVuYyBhcmcgdG8gcnVuCiAgICAgICAqLwogICAgICBhc3luYyBydW5PbmNlKGlkZW50aWZpZXJBcmcsIGZ1bmNBcmcpIHsKICAgICAgICBjb25zdCBydW5uaW5nSWQgPSBgJHtpZGVudGlmaWVyQXJnfStydW5uaW5nQ2hlY2tgOwogICAgICAgIGlmICghdGhpcy5ydW5PbmNlVHJhY2tlclN0cmluZ01hcC5jaGVja1N0cmluZyhpZGVudGlmaWVyQXJnKSkgewogICAgICAgICAgdGhpcy5ydW5PbmNlVHJhY2tlclN0cmluZ01hcC5hZGRTdHJpbmcoaWRlbnRpZmllckFyZyk7CiAgICAgICAgICB0aGlzLnJ1bk9uY2VUcmFja2VyU3RyaW5nTWFwLmFkZFN0cmluZyhydW5uaW5nSWQpOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZnVuY0FyZygpOwogICAgICAgICAgICB0aGlzLnJ1bk9uY2VSZXN1bHRNYXAuYWRkVG9NYXAoaWRlbnRpZmllckFyZywgcmVzdWx0KTsKICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHRoaXMucnVuT25jZUVycm9yTWFwLmFkZFRvTWFwKGlkZW50aWZpZXJBcmcsIGVycm9yKTsKICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHRoaXMucnVuT25jZVRyYWNrZXJTdHJpbmdNYXAucmVtb3ZlU3RyaW5nKHJ1bm5pbmdJZCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bk9uY2VUcmFja2VyU3RyaW5nTWFwLnJlZ2lzdGVyVW50aWxUcnVlKChzdHJpbmdNYXApID0+IHsKICAgICAgICAgIHJldHVybiAhc3RyaW5nTWFwLmluY2x1ZGVzKHJ1bm5pbmdJZCk7CiAgICAgICAgfSwgKCkgPT4gewogICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLnJ1bk9uY2VFcnJvck1hcC5nZXRCeUtleShpZGVudGlmaWVyQXJnKTsKICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0aGlzLnJ1bk9uY2VSZXN1bHRNYXAuZ2V0QnlLZXkoaWRlbnRpZmllckFyZyk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgLy8gc2V0U3R1ZmYKICAgICAgLyoqCiAgICAgICAqIGFsbG93cyB0byBzZXQgZ2xvYmFsIHN0eWxlcwogICAgICAgKiBAcGFyYW0gc3R5bGVzVGV4dCB0aGUgY3NzIHRleHQgeW91IHdhbnQgdG8gc2V0CiAgICAgICAqLwogICAgICBhc3luYyBzZXRHbG9iYWxTdHlsZXMoc3R5bGVzVGV4dCkgewogICAgICAgIGF3YWl0IHRoaXMuZG9tUmVhZHkucHJvbWlzZTsKICAgICAgICBjb25zdCBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICAgIHN0eWxlRWxlbWVudC50eXBlID0gInRleHQvY3NzIjsKICAgICAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoc3R5bGVzVGV4dCkpOwogICAgICAgIHRoaXMuZWxlbWVudHMuaGVhZEVsZW1lbnQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTsKICAgICAgfQogICAgICAvKioKICAgICAgICogYWxsb3dzIHRvIHNldCBnbG9iYWwgc3R5bGVzCiAgICAgICAqIEBwYXJhbSBzdHlsZXNUZXh0IHRoZSBjc3MgdGV4dCB5b3Ugd2FudCB0byBzZXQKICAgICAgICovCiAgICAgIGFzeW5jIHNldEV4dGVybmFsU2NyaXB0KHNjcmlwdExpbmtBcmcpIHsKICAgICAgICBhd2FpdCB0aGlzLmRvbVJlYWR5LnByb21pc2U7CiAgICAgICAgY29uc3QgZG9uZSA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwogICAgICAgIHNjcmlwdC5zcmMgPSBzY3JpcHRMaW5rQXJnOwogICAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBkb25lLnJlc29sdmUoKTsKICAgICAgICB9KTsKICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5ib2R5OwogICAgICAgIHBhcmVudE5vZGUuYXBwZW5kKHNjcmlwdCk7CiAgICAgICAgYXdhaXQgZG9uZS5wcm9taXNlOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBhbGxvd3Mgc2V0dGluZyBleHRlcm5hbCBjc3MgZmlsZXMKICAgICAgICogQHBhcmFtIGNzc0xpbmtBcmcgYSB1cmwgdG8gYW4gZXh0ZXJuYWwgc3R5bGVzaGVldAogICAgICAgKi8KICAgICAgYXN5bmMgc2V0RXh0ZXJuYWxDc3MoY3NzTGlua0FyZykgewogICAgICAgIGNvbnN0IGNzc1RhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTsKICAgICAgICBjc3NUYWcucmVsID0gInN0eWxlc2hlZXQiOwogICAgICAgIGNzc1RhZy5jcm9zc09yaWdpbiA9ICJhbm9ueW1vdXMiOwogICAgICAgIGNzc1RhZy5ocmVmID0gY3NzTGlua0FyZzsKICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZChjc3NUYWcpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBhbGxvd3Mgc2V0dGluZyBvZiB3ZWJzaXRlIGluZm9zCiAgICAgICAqIEBwYXJhbSBvcHRpb25zQXJnIHRoZSB3ZWJzaXRlIGluZm8KICAgICAgICovCiAgICAgIGFzeW5jIHNldFdlYnNpdGVJbmZvKG9wdGlvbnNBcmcpIHsKICAgICAgICBhd2FpdCB0aGlzLndlYnNldHVwLnNldHVwKG9wdGlvbnNBcmcpOwogICAgICAgIGF3YWl0IHRoaXMud2Vic2V0dXAucmVhZHlQcm9taXNlOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjUuMS9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLmNzcy5iYXNlc3R5bGVzLmpzCnZhciBzY3JvbGxCYXJTdHlsZXMsIGdsb2JhbEJhc2VTdHlsZXM7CnZhciBpbml0X2RvbXRvb2xzX2Nzc19iYXNlc3R5bGVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjUuMS9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLmNzcy5iYXNlc3R5bGVzLmpzIigpIHsKICAgIGluaXRfZG9tdG9vbHNfY2xhc3Nlc19kb210b29scygpOwogICAgaW5pdF9saXQoKTsKICAgIHNjcm9sbEJhclN0eWxlcyA9ICgoKSA9PiB7CiAgICAgIGNvbnN0IHJldHVyblN0eWxlc09sZCA9IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTWFjIE9TIFgiKSA9PT0gLTEgPyBpYGAuY3NzVGV4dCA6IGBgOwogICAgICBjb25zdCByZXR1cm5TdHlsZXMgPSBpYAogICAgLyogd2lkdGggKi8KICAgIDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICB3aWR0aDogMHB4OwogICAgfQogICAgYm9keSB7CiAgICAgIHNjcm9sbGJhci13aWR0aDogbm9uZTsKICAgIH0KICBgLmNzc1RleHQ7CiAgICAgIHJldHVybiByZXR1cm5TdHlsZXM7CiAgICB9KSgpOwogICAgZ2xvYmFsQmFzZVN0eWxlcyA9IGlgCiAgLyoKICBAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiAnTWF0ZXJpYWwgSWNvbnMnOwogICAgZm9udC1zdHlsZTogbm9ybWFsOwogICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgIHNyYzogdXJsKGh0dHBzOi8vZm9udHMuZ3N0YXRpYy5jb20vcy9tYXRlcmlhbGljb25zL3Y0Mi9mbFVoUnE2dHpaY2xRRUotVmRnLUl1aWFEc05jSWhROHRRLndvZmYyKQogICAgICBmb3JtYXQoJ3dvZmYyJyk7CiAgfSAqLwoKICAvKiBnbG9iYWwgYm9keSBzdHlsZXMgKi8KICBib2R5IHsKICAgIG1hcmdpbjogMHB4OwogICAgZm9udC1mYW1pbHk6ICdHZWlzdCBTYW5zJywgJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgfQoKICAvKiBzY3JvbGwgYmFyIHN0eWxlcyAqLwogICR7cihzY3JvbGxCYXJTdHlsZXMpfQpgLmNzc1RleHQ7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuZWxlbWVudGJhc2ljLmpzCnZhciBkb210b29sc19lbGVtZW50YmFzaWNfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChkb210b29sc19lbGVtZW50YmFzaWNfZXhwb3J0cywgewogIHNldHVwOiAoKSA9PiBzZXR1cCwKICBzdGF0aWNTdHlsZXM6ICgpID0+IHN0YXRpY1N0eWxlcywKICBzdHlsZXM6ICgpID0+IHN0eWxlcwp9KTsKdmFyIHN0YXRpY1N0eWxlcywgc3R5bGVzLCBzZXR1cDsKdmFyIGluaXRfZG9tdG9vbHNfZWxlbWVudGJhc2ljID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjUuMS9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2RvbXRvb2xzLmVsZW1lbnRiYXNpYy5qcyIoKSB7CiAgICBpbml0X2RvbXRvb2xzX3BsdWdpbnMoKTsKICAgIGluaXRfZG9tdG9vbHNfY2xhc3Nlc19kb210b29scygpOwogICAgaW5pdF9kb210b29sc19jc3NfYmFzZXN0eWxlcygpOwogICAgaW5pdF9saXQoKTsKICAgIHN0YXRpY1N0eWxlcyA9IGlgCiAgKiB7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXMsIGNvbG9yIDAuMXM7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIH0KCiAgOmhvc3QgewogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIGZvbnQtZmFtaWx5OiAnR2Vpc3QgU2FucycsICdJbnRlcicsIHNhbnMtc2VyaWY7CiAgfQoKICAke3Ioc2Nyb2xsQmFyU3R5bGVzKX0KYDsKICAgIHN0eWxlcyA9IGIyYAogIDxzdHlsZT4KICAgICogewogICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXMsIGNvbG9yIDAuMXM7CiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICB9CgogICAgOmhvc3QgewogICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCAnSW50ZXInLCBzYW5zLXNlcmlmOwogICAgfQoKICAgICR7c2Nyb2xsQmFyU3R5bGVzfQogIDwvc3R5bGU+CmA7CiAgICBzZXR1cCA9IGFzeW5jIChlbGVtZW50QXJnLCBvcHRpb25zQXJnID0ge30pID0+IHsKICAgICAgY29uc3QgZG9tVG9vbHMgPSBhd2FpdCBEb21Ub29scy5zZXR1cERvbVRvb2xzKG9wdGlvbnNBcmcpOwogICAgICBpZiAoZWxlbWVudEFyZykgewogICAgICB9CiAgICAgIGRvbVRvb2xzLnJ1bk9uY2UoImVsZW1lbnRCYXNpY1NldHVwIiwgYXN5bmMgKCkgPT4gewogICAgICAgIGRvbVRvb2xzLnNldEdsb2JhbFN0eWxlcyhnbG9iYWxCYXNlU3R5bGVzKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBkb21Ub29sczsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuY3NzLmpzCnZhciBkb210b29sc19jc3NfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChkb210b29sc19jc3NfZXhwb3J0cywgewogIGNzc0dyaWRDb2x1bW5zOiAoKSA9PiBjc3NHcmlkQ29sdW1ucwp9KTsKdmFyIGNzc0dyaWRDb2x1bW5zOwp2YXIgaW5pdF9kb210b29sc19jc3MgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWRvbXRvb2xzQDIuNS4xL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWRvbXRvb2xzL2Rpc3RfdHMvZG9tdG9vbHMuY3NzLmpzIigpIHsKICAgIGNzc0dyaWRDb2x1bW5zID0gKGFtb3VudE9mQ29sdW1uc0FyZywgZ2FwU2l6ZUFyZykgPT4gewogICAgICBsZXQgcmV0dXJuU3RyaW5nID0gYGA7CiAgICAgIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IGFtb3VudE9mQ29sdW1uc0FyZzsgaTExKyspIHsKICAgICAgICByZXR1cm5TdHJpbmcgKz0gYCBjYWxjKCgxMDAlLyR7YW1vdW50T2ZDb2x1bW5zQXJnfSkgLSAoJHtnYXBTaXplQXJnICogKGFtb3VudE9mQ29sdW1uc0FyZyAtIDEpfXB4LyR7YW1vdW50T2ZDb2x1bW5zQXJnfSkpYDsKICAgICAgfQogICAgICByZXR1cm4gcmV0dXJuU3RyaW5nOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi41LjEvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5wbHVnaW5leHBvcnRzLmpzCnZhciBkb210b29sc19wbHVnaW5leHBvcnRzX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzLCB7CiAgU3dlZXRTY3JvbGw6ICgpID0+IGltcG9ydF9zd2VldF9zY3JvbGwyLmRlZmF1bHQsCiAgc21hcnRkZWxheTogKCkgPT4gZGlzdF90c19leHBvcnRzMywKICBzbWFydG1hcmtkb3duOiAoKSA9PiBkaXN0X3RzX2V4cG9ydHMyMSwKICBzbWFydHByb21pc2U6ICgpID0+IGRpc3RfdHNfZXhwb3J0cywKICBzbWFydHJvdXRlcjogKCkgPT4gZGlzdF90c19leHBvcnRzMjIsCiAgc21hcnRyeDogKCkgPT4gZGlzdF90c19leHBvcnRzMiwKICBzbWFydHN0YXRlOiAoKSA9PiBkaXN0X3RzX2V4cG9ydHMyMywKICBzbWFydHN0cmluZzogKCkgPT4gZGlzdF90c19leHBvcnRzMTMsCiAgc21hcnR1cmw6ICgpID0+IGRpc3RfdHNfZXhwb3J0czI0LAogIHR5cGVkcmVxdWVzdDogKCkgPT4gZGlzdF90c19leHBvcnRzMTkKfSk7CnZhciBpbXBvcnRfc3dlZXRfc2Nyb2xsMjsKdmFyIGluaXRfZG9tdG9vbHNfcGx1Z2luZXhwb3J0cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZG9tdG9vbHNAMi41LjEvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZG9tdG9vbHMvZGlzdF90cy9kb210b29scy5wbHVnaW5leHBvcnRzLmpzIigpIHsKICAgIGluaXRfZGlzdF90czMoKTsKICAgIGluaXRfZGlzdF90czIxKCk7CiAgICBpbml0X2Rpc3RfdHMoKTsKICAgIGltcG9ydF9zd2VldF9zY3JvbGwyID0gX190b0VTTShyZXF1aXJlX3N3ZWV0X3Njcm9sbCgpLCAxKTsKICAgIGluaXRfZGlzdF90czIzKCk7CiAgICBpbml0X2Rpc3RfdHMyMigpOwogICAgaW5pdF9kaXN0X3RzMigpOwogICAgaW5pdF9kaXN0X3RzMTMoKTsKICAgIGluaXRfZGlzdF90czI0KCk7CiAgICBpbml0X2Rpc3RfdHMxOSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjUuMS9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMyOSA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMyOSwgewogIERvbVRvb2xzOiAoKSA9PiBEb21Ub29scywKICBUeXBlZFJlcXVlc3Q6ICgpID0+IFR5cGVkUmVxdWVzdCwKICBicmVha3BvaW50czogKCkgPT4gZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMsCiAgY3NzOiAoKSA9PiBkb210b29sc19jc3NfZXhwb3J0cywKICBlbGVtZW50QmFzaWM6ICgpID0+IGRvbXRvb2xzX2VsZW1lbnRiYXNpY19leHBvcnRzLAogIHBsdWdpbnM6ICgpID0+IGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cwp9KTsKdmFyIGluaXRfZGlzdF90czI5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1kb210b29sc0AyLjUuMS9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scy9kaXN0X3RzL2luZGV4LmpzIigpIHsKICAgIGluaXRfZG9tdG9vbHNfY29sb3JzKCk7CiAgICBpbml0X2RvbXRvb2xzX2VsZW1lbnRiYXNpYygpOwogICAgaW5pdF9kb210b29sc19jc3NfYnJlYWtwb2ludHMoKTsKICAgIGluaXRfZG9tdG9vbHNfY3NzKCk7CiAgICBpbml0X2RvbXRvb2xzX2NsYXNzZXNfZG9tdG9vbHMoKTsKICAgIGluaXRfZGlzdF90czE5KCk7CiAgICBpbml0X2Rpc3RfdHMyOCgpOwogICAgaW5pdF9kb210b29sc19wbHVnaW5leHBvcnRzKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4yLjMvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL3BsdWdpbnMuanMKdmFyIGlzb3VuaXF1ZTMsIGxpdDsKdmFyIGluaXRfcGx1Z2luczMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4yLjMvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL3BsdWdpbnMuanMiKCkgewogICAgaXNvdW5pcXVlMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0X3RzKCksIDEpOwogICAgaW5pdF9kaXN0X3RzMigpOwogICAgaW5pdF9saXQoKTsKICAgIGluaXRfcHJvcGVydHkyKCk7CiAgICBpbml0X2Rpc3RfdHMyOSgpOwogICAgbGl0ID0gewogICAgICBjc3M6IGksCiAgICAgIHVuc2FmZUNTUzogciwKICAgICAgTGl0RWxlbWVudDogaTQsCiAgICAgIHByb3BlcnR5OiBuNQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvY2xhc3Nlcy5jc3NtYW5hZ2VyLmpzCnZhciBDc3NNYW5hZ2VyOwp2YXIgaW5pdF9jbGFzc2VzX2Nzc21hbmFnZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4yLjMvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL2NsYXNzZXMuY3NzbWFuYWdlci5qcyIoKSB7CiAgICBpbml0X2xpdCgpOwogICAgaW5pdF9wbHVnaW5zMygpOwogICAgaW5pdF9kaXN0X3RzMjkoKTsKICAgIENzc01hbmFnZXIgPSBjbGFzcyBfQ3NzTWFuYWdlciB7CiAgICAgIC8vIFNUQVRJQwogICAgICBzdGF0aWMgaW5zdGFuY2UgPSBudWxsOwogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIENzc01hbmFnZXIKICAgICAgICovCiAgICAgIHN0YXRpYyBnZXRTaW5nbGV0b24oKSB7CiAgICAgICAgaWYgKCFfQ3NzTWFuYWdlci5pbnN0YW5jZSkgewogICAgICAgICAgX0Nzc01hbmFnZXIuaW5zdGFuY2UgPSBuZXcgX0Nzc01hbmFnZXIoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9Dc3NNYW5hZ2VyLmluc3RhbmNlOwogICAgICB9CiAgICAgIC8vIElOU1RBTkNFCiAgICAgIGRvbXRvb2xzUHJvbWlzZSA9IERvbVRvb2xzLnNldHVwRG9tVG9vbHMoKTsKICAgICAgZ29CcmlnaHQgPSBmYWxzZTsKICAgICAgYmRWYXJUcmlwbGV0U3RvcmUgPSBbXTsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5kb210b29sc1Byb21pc2UudGhlbihhc3luYyAoZG9tdG9vbHNBcmcpID0+IHsKICAgICAgICAgIGRvbXRvb2xzQXJnLnRoZW1lTWFuYWdlci50aGVtZU9ic2VydmFibGUuc3Vic2NyaWJlKGFzeW5jIChnb0JyaWdodEFyZykgPT4gewogICAgICAgICAgICB0aGlzLmdvQnJpZ2h0ID0gZ29CcmlnaHRBcmc7CiAgICAgICAgICAgIGF3YWl0IGRvbXRvb2xzQXJnLmRvbVJlYWR5LnByb21pc2U7CiAgICAgICAgICAgIGZvciAoY29uc3QgYmRUcmlwbGV0QXJnIG9mIHRoaXMuYmRWYXJUcmlwbGV0U3RvcmUpIHsKICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnNldFByb3BlcnR5KGJkVHJpcGxldEFyZy5jc3NWYXJOYW1lLCB0aGlzLmdvQnJpZ2h0ID8gYmRUcmlwbGV0QXJnLmJyaWdodFZhbHVlIDogYmRUcmlwbGV0QXJnLmRhcmtWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGdldCBkZWZhdWx0U3R5bGVzKCkgewogICAgICAgIHJldHVybiBkb210b29sc19lbGVtZW50YmFzaWNfZXhwb3J0cy5zdGF0aWNTdHlsZXM7CiAgICAgIH0KICAgICAgZ2V0Q29udGFpbmVyTmFtZUZyb21DbGFzcyhlbGVtZW50Q2xhc3MpIHsKICAgICAgICByZXR1cm4gZWxlbWVudENsYXNzLmlzIHx8IGVsZW1lbnRDbGFzcy5uYW1lLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICIkMS0kMiIpLnRvTG93ZXJDYXNlKCk7CiAgICAgIH0KICAgICAgY3NzRm9yRGVza3RvcChjb250ZW50QXJnLCBlbGVtZW50Q2xhc3MpIHsKICAgICAgICBpZiAoZWxlbWVudENsYXNzKSB7CiAgICAgICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JDb250YWluZXIoY29udGVudEFyZywgYChtaW4td2lkdGg6ICR7ZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMuZGVza3RvcH1weClgLCB0aGlzLmdldENvbnRhaW5lck5hbWVGcm9tQ2xhc3MoZWxlbWVudENsYXNzKSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JEZXNrdG9wKGNvbnRlbnRBcmcpKTsKICAgICAgfQogICAgICBjc3NGb3JOb3RlYm9vayhjb250ZW50QXJnLCBlbGVtZW50Q2xhc3MpIHsKICAgICAgICBpZiAoZWxlbWVudENsYXNzKSB7CiAgICAgICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JDb250YWluZXIoY29udGVudEFyZywgYChtYXgtd2lkdGg6ICR7ZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMubm90ZWJvb2t9cHgpYCwgdGhpcy5nZXRDb250YWluZXJOYW1lRnJvbUNsYXNzKGVsZW1lbnRDbGFzcykpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHIoZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMuY3NzRm9yTm90ZWJvb2soY29udGVudEFyZykpOwogICAgICB9CiAgICAgIGNzc0ZvclRhYmxldChjb250ZW50QXJnLCBlbGVtZW50Q2xhc3MpIHsKICAgICAgICBpZiAoZWxlbWVudENsYXNzKSB7CiAgICAgICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JDb250YWluZXIoY29udGVudEFyZywgYChtYXgtd2lkdGg6ICR7ZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMudGFibGV0fXB4KWAsIHRoaXMuZ2V0Q29udGFpbmVyTmFtZUZyb21DbGFzcyhlbGVtZW50Q2xhc3MpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByKGRvbXRvb2xzX2Nzc19icmVha3BvaW50c19leHBvcnRzLmNzc0ZvclRhYmxldChjb250ZW50QXJnKSk7CiAgICAgIH0KICAgICAgY3NzRm9yUGhhYmxldChjb250ZW50QXJnLCBlbGVtZW50Q2xhc3MpIHsKICAgICAgICBpZiAoZWxlbWVudENsYXNzKSB7CiAgICAgICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JDb250YWluZXIoY29udGVudEFyZywgYChtYXgtd2lkdGg6ICR7ZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMucGhhYmxldH1weClgLCB0aGlzLmdldENvbnRhaW5lck5hbWVGcm9tQ2xhc3MoZWxlbWVudENsYXNzKSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JQaGFibGV0KGNvbnRlbnRBcmcpKTsKICAgICAgfQogICAgICBjc3NGb3JQaG9uZShjb250ZW50QXJnLCBlbGVtZW50Q2xhc3MpIHsKICAgICAgICBpZiAoZWxlbWVudENsYXNzKSB7CiAgICAgICAgICByZXR1cm4gcihkb210b29sc19jc3NfYnJlYWtwb2ludHNfZXhwb3J0cy5jc3NGb3JDb250YWluZXIoY29udGVudEFyZywgYChtYXgtd2lkdGg6ICR7ZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMucGhvbmV9cHgpYCwgdGhpcy5nZXRDb250YWluZXJOYW1lRnJvbUNsYXNzKGVsZW1lbnRDbGFzcykpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHIoZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMuY3NzRm9yUGhvbmUoY29udGVudEFyZykpOwogICAgICB9CiAgICAgIGNzc0ZvckNvbnN0cmFpbnQoY29uc3RyYWludHMpIHsKICAgICAgICByZXR1cm4gKGNvbnRlbnRBcmcpID0+IHIoZG9tdG9vbHNfY3NzX2JyZWFrcG9pbnRzX2V4cG9ydHMuY3NzRm9yQ29uc3RyYWludChjb25zdHJhaW50cykoY29udGVudEFyZykpOwogICAgICB9CiAgICAgIGJkVGhlbWUoYnJpZ2h0VmFsdWVBcmcsIGRhcmtWYWx1ZUFyZykgewogICAgICAgIGxldCByZXR1cm5Dc3NWYXI7CiAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZTsKICAgICAgICBpZiAoRG9tVG9vbHMuZ2V0R2xvYmFsRG9tVG9vbHNTeW5jKCkpIHsKICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IERvbVRvb2xzLmdldEdsb2JhbERvbVRvb2xzU3luYygpLnRoZW1lTWFuYWdlci5nb0JyaWdodEJvb2xlYW4gPyBicmlnaHRWYWx1ZUFyZyA6IGRhcmtWYWx1ZUFyZzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGVmYXVsdFZhbHVlID0gZGFya1ZhbHVlQXJnOwogICAgICAgIH0KICAgICAgICBjb25zdCBleGlzdGluZ1RyaXBsZXQgPSB0aGlzLmJkVmFyVHJpcGxldFN0b3JlLmZpbmQoKHRyaXBsZXRBcmcpID0+IHRyaXBsZXRBcmcuZGFya1ZhbHVlID09PSBkYXJrVmFsdWVBcmcgJiYgdHJpcGxldEFyZy5icmlnaHRWYWx1ZSA9PT0gYnJpZ2h0VmFsdWVBcmcpOwogICAgICAgIGlmIChleGlzdGluZ1RyaXBsZXQpIHsKICAgICAgICAgIHJldHVybkNzc1ZhciA9IGV4aXN0aW5nVHJpcGxldC5jc3NWYXJOYW1lOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBuZXdUcmlwbGV0ID0gewogICAgICAgICAgICBjc3NWYXJOYW1lOiBgLS0ke2lzb3VuaXF1ZTMudW5pKCl9YCwKICAgICAgICAgICAgYnJpZ2h0VmFsdWU6IGJyaWdodFZhbHVlQXJnLAogICAgICAgICAgICBkYXJrVmFsdWU6IGRhcmtWYWx1ZUFyZwogICAgICAgICAgfTsKICAgICAgICAgIHRoaXMuYmRWYXJUcmlwbGV0U3RvcmUucHVzaChuZXdUcmlwbGV0KTsKICAgICAgICAgIHRoaXMuZG9tdG9vbHNQcm9taXNlLnRoZW4oYXN5bmMgKGRvbXRvb2xzQXJnKSA9PiB7CiAgICAgICAgICAgIGF3YWl0IGRvbXRvb2xzQXJnLmRvbVJlYWR5LnByb21pc2U7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkobmV3VHJpcGxldC5jc3NWYXJOYW1lLCBkZWZhdWx0VmFsdWUpOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm5Dc3NWYXIgPSBuZXdUcmlwbGV0LmNzc1Zhck5hbWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaXQudW5zYWZlQ1NTKGB2YXIoJHtyZXR1cm5Dc3NWYXJ9LCAke2RlZmF1bHRWYWx1ZX0pYCk7CiAgICAgIH0KICAgICAgY3NzR3JpZENvbHVtbnMgPSAoYW1vdW50T2ZDb2x1bW5zQXJnLCBnYXBTaXplQXJnKSA9PiB7CiAgICAgICAgbGV0IHJldHVyblN0cmluZyA9IGBgOwogICAgICAgIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IGFtb3VudE9mQ29sdW1uc0FyZzsgaTExKyspIHsKICAgICAgICAgIHJldHVyblN0cmluZyArPSBgIGNhbGMoKDEwMCUvJHthbW91bnRPZkNvbHVtbnNBcmd9KSAtICgke2dhcFNpemVBcmcgKiAoYW1vdW50T2ZDb2x1bW5zQXJnIC0gMSl9cHgvJHthbW91bnRPZkNvbHVtbnNBcmd9KSlgOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGl0LnVuc2FmZUNTUyhyZXR1cm5TdHJpbmcpOwogICAgICB9OwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zdGF0aWMuanMKdmFyIGEzLCBvNywgczUsIGk1LCBsMywgbjcsIHUzLCBjNCwgJDI7CnZhciBpbml0X3N0YXRpYyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zdGF0aWMuanMiKCkgewogICAgaW5pdF9saXRfaHRtbCgpOwogICAgYTMgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcigiIiksIG83ID0gKHQ5KSA9PiB7CiAgICAgIGlmICh0OT8uciA9PT0gYTMpIHJldHVybiB0OT8uXyRsaXRTdGF0aWMkOwogICAgfSwgczUgPSAodDkpID0+ICh7IF8kbGl0U3RhdGljJDogdDksIHI6IGEzIH0pLCBpNSA9ICh0OSwgLi4ucjExKSA9PiAoeyBfJGxpdFN0YXRpYyQ6IHIxMS5yZWR1Y2UoKHIxMiwgZTExLCBhNSkgPT4gcjEyICsgKCh0MTApID0+IHsKICAgICAgaWYgKHZvaWQgMCAhPT0gdDEwLl8kbGl0U3RhdGljJCkgcmV0dXJuIHQxMC5fJGxpdFN0YXRpYyQ7CiAgICAgIHRocm93IEVycm9yKGBWYWx1ZSBwYXNzZWQgdG8gJ2xpdGVyYWwnIGZ1bmN0aW9uIG11c3QgYmUgYSAnbGl0ZXJhbCcgcmVzdWx0OiAke3QxMH0uIFVzZSAndW5zYWZlU3RhdGljJyB0byBwYXNzIG5vbi1saXRlcmFsIHZhbHVlcywgYnV0CiAgICAgICAgICAgIHRha2UgY2FyZSB0byBlbnN1cmUgcGFnZSBzZWN1cml0eS5gKTsKICAgIH0pKGUxMSkgKyB0OVthNSArIDFdLCB0OVswXSksIHI6IGEzIH0pLCBsMyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksIG43ID0gKHQ5KSA9PiAocjExLCAuLi5lMTEpID0+IHsKICAgICAgY29uc3QgYTUgPSBlMTEubGVuZ3RoOwogICAgICBsZXQgczEwLCBpMTE7CiAgICAgIGNvbnN0IG4xMyA9IFtdLCB1NyA9IFtdOwogICAgICBsZXQgYzExLCAkNCA9IDAsIGY4ID0gZmFsc2U7CiAgICAgIGZvciAoOyAkNCA8IGE1OyApIHsKICAgICAgICBmb3IgKGMxMSA9IHIxMVskNF07ICQ0IDwgYTUgJiYgdm9pZCAwICE9PSAoaTExID0gZTExWyQ0XSwgczEwID0gbzcoaTExKSk7ICkgYzExICs9IHMxMCArIHIxMVsrKyQ0XSwgZjggPSB0cnVlOwogICAgICAgICQ0ICE9PSBhNSAmJiB1Ny5wdXNoKGkxMSksIG4xMy5wdXNoKGMxMSksICQ0Kys7CiAgICAgIH0KICAgICAgaWYgKCQ0ID09PSBhNSAmJiBuMTMucHVzaChyMTFbYTVdKSwgZjgpIHsKICAgICAgICBjb25zdCB0MTAgPSBuMTMuam9pbigiJCRsaXQkJCIpOwogICAgICAgIHZvaWQgMCA9PT0gKHIxMSA9IGwzLmdldCh0MTApKSAmJiAobjEzLnJhdyA9IG4xMywgbDMuc2V0KHQxMCwgcjExID0gbjEzKSksIGUxMSA9IHU3OwogICAgICB9CiAgICAgIHJldHVybiB0OShyMTEsIC4uLmUxMSk7CiAgICB9LCB1MyA9IG43KGIyKSwgYzQgPSBuNyh3KSwgJDIgPSBuNyhUKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0L3N0YXRpYy1odG1sLmpzCnZhciBpbml0X3N0YXRpY19odG1sID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbGl0QDMuMy4yL25vZGVfbW9kdWxlcy9saXQvc3RhdGljLWh0bWwuanMiKCkgewogICAgaW5pdF9zdGF0aWMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmUuanMKdmFyIHQzLCBlNCwgaTY7CnZhciBpbml0X2RpcmVjdGl2ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmUuanMiKCkgewogICAgdDMgPSB7IEFUVFJJQlVURTogMSwgQ0hJTEQ6IDIsIFBST1BFUlRZOiAzLCBCT09MRUFOX0FUVFJJQlVURTogNCwgRVZFTlQ6IDUsIEVMRU1FTlQ6IDYgfSwgZTQgPSAodDkpID0+ICguLi5lMTEpID0+ICh7IF8kbGl0RGlyZWN0aXZlJDogdDksIHZhbHVlczogZTExIH0pOwogICAgaTYgPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKHQ5KSB7CiAgICAgIH0KICAgICAgZ2V0IF8kQVUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuXyRBTS5fJEFVOwogICAgICB9CiAgICAgIF8kQVQodDksIGUxMSwgaTExKSB7CiAgICAgICAgdGhpcy5fJEN0ID0gdDksIHRoaXMuXyRBTSA9IGUxMSwgdGhpcy5fJENpID0gaTExOwogICAgICB9CiAgICAgIF8kQVModDksIGUxMSkgewogICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZSh0OSwgZTExKTsKICAgICAgfQogICAgICB1cGRhdGUodDksIGUxMSkgewogICAgICAgIHJldHVybiB0aGlzLnJlbmRlciguLi5lMTEpOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMKdmFyIGU1LCBvODsKdmFyIGluaXRfdW5zYWZlX2h0bWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXQtaHRtbEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyIoKSB7CiAgICBpbml0X2xpdF9odG1sKCk7CiAgICBpbml0X2RpcmVjdGl2ZSgpOwogICAgZTUgPSBjbGFzcyBleHRlbmRzIGk2IHsKICAgICAgY29uc3RydWN0b3IoaTExKSB7CiAgICAgICAgaWYgKHN1cGVyKGkxMSksIHRoaXMuaXQgPSBBLCBpMTEudHlwZSAhPT0gdDMuQ0hJTEQpIHRocm93IEVycm9yKHRoaXMuY29uc3RydWN0b3IuZGlyZWN0aXZlTmFtZSArICIoKSBjYW4gb25seSBiZSB1c2VkIGluIGNoaWxkIGJpbmRpbmdzIik7CiAgICAgIH0KICAgICAgcmVuZGVyKHIxMSkgewogICAgICAgIGlmIChyMTEgPT09IEEgfHwgbnVsbCA9PSByMTEpIHJldHVybiB0aGlzLl90ID0gdm9pZCAwLCB0aGlzLml0ID0gcjExOwogICAgICAgIGlmIChyMTEgPT09IEUpIHJldHVybiByMTE7CiAgICAgICAgaWYgKCJzdHJpbmciICE9IHR5cGVvZiByMTEpIHRocm93IEVycm9yKHRoaXMuY29uc3RydWN0b3IuZGlyZWN0aXZlTmFtZSArICIoKSBjYWxsZWQgd2l0aCBhIG5vbi1zdHJpbmcgdmFsdWUiKTsKICAgICAgICBpZiAocjExID09PSB0aGlzLml0KSByZXR1cm4gdGhpcy5fdDsKICAgICAgICB0aGlzLml0ID0gcjExOwogICAgICAgIGNvbnN0IHMxMCA9IFtyMTFdOwogICAgICAgIHJldHVybiBzMTAucmF3ID0gczEwLCB0aGlzLl90ID0geyBfJGxpdFR5cGUkOiB0aGlzLmNvbnN0cnVjdG9yLnJlc3VsdFR5cGUsIHN0cmluZ3M6IHMxMCwgdmFsdWVzOiBbXSB9OwogICAgICB9CiAgICB9OwogICAgZTUuZGlyZWN0aXZlTmFtZSA9ICJ1bnNhZmVIVE1MIiwgZTUucmVzdWx0VHlwZSA9IDE7CiAgICBvOCA9IGU0KGU1KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMKdmFyIGluaXRfdW5zYWZlX2h0bWwyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbGl0QDMuMy4yL25vZGVfbW9kdWxlcy9saXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyIoKSB7CiAgICBpbml0X3Vuc2FmZV9odG1sKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL2N1c3RvbS1lbGVtZW50LmpzCnZhciB0NDsKdmFyIGluaXRfY3VzdG9tX2VsZW1lbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL2N1c3RvbS1lbGVtZW50LmpzIigpIHsKICAgIHQ0ID0gKHQ5KSA9PiAoZTExLCBvMTMpID0+IHsKICAgICAgdm9pZCAwICE9PSBvMTMgPyBvMTMuYWRkSW5pdGlhbGl6ZXIoKCkgPT4gewogICAgICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZSh0OSwgZTExKTsKICAgICAgfSkgOiBjdXN0b21FbGVtZW50cy5kZWZpbmUodDksIGUxMSk7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0QDMuMy4yL25vZGVfbW9kdWxlcy9saXQvZGVjb3JhdG9ycy9jdXN0b20tZWxlbWVudC5qcwp2YXIgaW5pdF9jdXN0b21fZWxlbWVudDIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXRAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC9kZWNvcmF0b3JzL2N1c3RvbS1lbGVtZW50LmpzIigpIHsKICAgIGluaXRfY3VzdG9tX2VsZW1lbnQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvZGVjb3JhdG9ycy5jdXN0b21lbGVtZW50LmpzCmZ1bmN0aW9uIGN1c3RvbUVsZW1lbnQodGFnTmFtZSkgewogIHJldHVybiAoY2xhc3NPclRhcmdldCwgY29udGV4dDIpID0+IHsKICAgIGNsYXNzT3JUYXJnZXQuaXMgPSB0YWdOYW1lOwogICAgaWYgKGNsYXNzT3JUYXJnZXQubmFtZSkgewogICAgICBjb25zdCBkZXJpdmVkID0gY2FtZWxUb0tlYmFiKGNsYXNzT3JUYXJnZXQubmFtZSk7CiAgICAgIGlmIChkZXJpdmVkICE9PSB0YWdOYW1lKSB7CiAgICAgICAgY29uc29sZS53YXJuKGBbZGVlcy1lbGVtZW50XSBDbGFzcyAiJHtjbGFzc09yVGFyZ2V0Lm5hbWV9IiBrZWJhYi1jYXNlcyB0byAiJHtkZXJpdmVkfSIgYnV0IHRhZyBpcyAiJHt0YWdOYW1lfSIuIENvbnRhaW5lciBxdWVyaWVzIHVzZSAuaXMgKCIke3RhZ05hbWV9IikuYCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0NCh0YWdOYW1lKShjbGFzc09yVGFyZ2V0LCBjb250ZXh0Mik7CiAgfTsKfQp2YXIgY2FtZWxUb0tlYmFiOwp2YXIgaW5pdF9kZWNvcmF0b3JzX2N1c3RvbWVsZW1lbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4yLjMvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL2RlY29yYXRvcnMuY3VzdG9tZWxlbWVudC5qcyIoKSB7CiAgICBpbml0X2N1c3RvbV9lbGVtZW50MigpOwogICAgY2FtZWxUb0tlYmFiID0gKG5hbWUpID0+IG5hbWUucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgIiQxLSQyIikudG9Mb3dlckNhc2UoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvc3RhdGUuanMKZnVuY3Rpb24gcjUocjExKSB7CiAgcmV0dXJuIG41KHsgLi4ucjExLCBzdGF0ZTogdHJ1ZSwgYXR0cmlidXRlOiBmYWxzZSB9KTsKfQp2YXIgaW5pdF9zdGF0ZTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3N0YXRlLmpzIigpIHsKICAgIGluaXRfcHJvcGVydHkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvZXZlbnQtb3B0aW9ucy5qcwpmdW5jdGlvbiB0NSh0OSkgewogIHJldHVybiAobjEzLCBvMTMpID0+IHsKICAgIGNvbnN0IGMxMSA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIG4xMyA/IG4xMyA6IG4xM1tvMTNdOwogICAgT2JqZWN0LmFzc2lnbihjMTEsIHQ5KTsKICB9Owp9CnZhciBpbml0X2V2ZW50X29wdGlvbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL2V2ZW50LW9wdGlvbnMuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9iYXNlLmpzCnZhciBlNjsKdmFyIGluaXRfYmFzZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvYmFzZS5qcyIoKSB7CiAgICBlNiA9IChlMTEsIHQ5LCBjMTEpID0+IChjMTEuY29uZmlndXJhYmxlID0gdHJ1ZSwgYzExLmVudW1lcmFibGUgPSB0cnVlLCBSZWZsZWN0LmRlY29yYXRlICYmICJvYmplY3QiICE9IHR5cGVvZiB0OSAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZTExLCB0OSwgYzExKSwgYzExKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvcXVlcnkuanMKZnVuY3Rpb24gZTcoZTExLCByMTEpIHsKICByZXR1cm4gKG4xMywgczEwLCBpMTEpID0+IHsKICAgIGNvbnN0IG8xMyA9ICh0OSkgPT4gdDkucmVuZGVyUm9vdD8ucXVlcnlTZWxlY3RvcihlMTEpID8/IG51bGw7CiAgICBpZiAocjExKSB7CiAgICAgIGNvbnN0IHsgZ2V0OiBlMTIsIHNldDogcjEyIH0gPSAib2JqZWN0IiA9PSB0eXBlb2YgczEwID8gbjEzIDogaTExID8/IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gewogICAgICAgIGNvbnN0IHQ5ID0gLyogQF9fUFVSRV9fICovIFN5bWJvbCgpOwogICAgICAgIHJldHVybiB7IGdldCgpIHsKICAgICAgICAgIHJldHVybiB0aGlzW3Q5XTsKICAgICAgICB9LCBzZXQoZTEzKSB7CiAgICAgICAgICB0aGlzW3Q5XSA9IGUxMzsKICAgICAgICB9IH07CiAgICAgIH0pKCk7CiAgICAgIHJldHVybiBlNihuMTMsIHMxMCwgeyBnZXQoKSB7CiAgICAgICAgbGV0IHQ5ID0gZTEyLmNhbGwodGhpcyk7CiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdDkgJiYgKHQ5ID0gbzEzKHRoaXMpLCAobnVsbCAhPT0gdDkgfHwgdGhpcy5oYXNVcGRhdGVkKSAmJiByMTIuY2FsbCh0aGlzLCB0OSkpLCB0OTsKICAgICAgfSB9KTsKICAgIH0KICAgIHJldHVybiBlNihuMTMsIHMxMCwgeyBnZXQoKSB7CiAgICAgIHJldHVybiBvMTModGhpcyk7CiAgICB9IH0pOwogIH07Cn0KdmFyIGluaXRfcXVlcnkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3F1ZXJ5LmpzIigpIHsKICAgIGluaXRfYmFzZSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS1hbGwuanMKZnVuY3Rpb24gcjYocjExKSB7CiAgcmV0dXJuIChuMTMsIG8xMykgPT4gZTYobjEzLCBvMTMsIHsgZ2V0KCkgewogICAgcmV0dXJuICh0aGlzLnJlbmRlclJvb3QgPz8gKGU4ID8/PSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpKS5xdWVyeVNlbGVjdG9yQWxsKHIxMSk7CiAgfSB9KTsKfQp2YXIgZTg7CnZhciBpbml0X3F1ZXJ5X2FsbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvcXVlcnktYWxsLmpzIigpIHsKICAgIGluaXRfYmFzZSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS1hc3luYy5qcwpmdW5jdGlvbiByNyhyMTEpIHsKICByZXR1cm4gKG4xMywgZTExKSA9PiBlNihuMTMsIGUxMSwgeyBhc3luYyBnZXQoKSB7CiAgICByZXR1cm4gYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZSwgdGhpcy5yZW5kZXJSb290Py5xdWVyeVNlbGVjdG9yKHIxMSkgPz8gbnVsbDsKICB9IH0pOwp9CnZhciBpbml0X3F1ZXJ5X2FzeW5jID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS1hc3luYy5qcyIoKSB7CiAgICBpbml0X2Jhc2UoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BsaXQrcmVhY3RpdmUtZWxlbWVudEAyLjEuMi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvcXVlcnktYXNzaWduZWQtZWxlbWVudHMuanMKZnVuY3Rpb24gbzkobzEzKSB7CiAgcmV0dXJuIChlMTEsIG4xMykgPT4gewogICAgY29uc3QgeyBzbG90OiByMTEsIHNlbGVjdG9yOiBzMTAgfSA9IG8xMyA/PyB7fSwgYzExID0gInNsb3QiICsgKHIxMSA/IGBbbmFtZT0ke3IxMX1dYCA6ICI6bm90KFtuYW1lXSkiKTsKICAgIHJldHVybiBlNihlMTEsIG4xMywgeyBnZXQoKSB7CiAgICAgIGNvbnN0IHQ5ID0gdGhpcy5yZW5kZXJSb290Py5xdWVyeVNlbGVjdG9yKGMxMSksIGUxMiA9IHQ5Py5hc3NpZ25lZEVsZW1lbnRzKG8xMykgPz8gW107CiAgICAgIHJldHVybiB2b2lkIDAgPT09IHMxMCA/IGUxMiA6IGUxMi5maWx0ZXIoKHQxMCkgPT4gdDEwLm1hdGNoZXMoczEwKSk7CiAgICB9IH0pOwogIH07Cn0KdmFyIGluaXRfcXVlcnlfYXNzaWduZWRfZWxlbWVudHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3F1ZXJ5LWFzc2lnbmVkLWVsZW1lbnRzLmpzIigpIHsKICAgIGluaXRfYmFzZSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGxpdCtyZWFjdGl2ZS1lbGVtZW50QDIuMS4yL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS1hc3NpZ25lZC1ub2Rlcy5qcwpmdW5jdGlvbiBuOChuMTMpIHsKICByZXR1cm4gKG8xMywgcjExKSA9PiB7CiAgICBjb25zdCB7IHNsb3Q6IGUxMSB9ID0gbjEzID8/IHt9LCBzMTAgPSAic2xvdCIgKyAoZTExID8gYFtuYW1lPSR7ZTExfV1gIDogIjpub3QoW25hbWVdKSIpOwogICAgcmV0dXJuIGU2KG8xMywgcjExLCB7IGdldCgpIHsKICAgICAgY29uc3QgdDkgPSB0aGlzLnJlbmRlclJvb3Q/LnF1ZXJ5U2VsZWN0b3IoczEwKTsKICAgICAgcmV0dXJuIHQ5Py5hc3NpZ25lZE5vZGVzKG4xMykgPz8gW107CiAgICB9IH0pOwogIH07Cn0KdmFyIGluaXRfcXVlcnlfYXNzaWduZWRfbm9kZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AbGl0K3JlYWN0aXZlLWVsZW1lbnRAMi4xLjIvbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3F1ZXJ5LWFzc2lnbmVkLW5vZGVzLmpzIigpIHsKICAgIGluaXRfYmFzZSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0QDMuMy4yL25vZGVfbW9kdWxlcy9saXQvZGVjb3JhdG9ycy5qcwp2YXIgaW5pdF9kZWNvcmF0b3JzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbGl0QDMuMy4yL25vZGVfbW9kdWxlcy9saXQvZGVjb3JhdG9ycy5qcyIoKSB7CiAgICBpbml0X2N1c3RvbV9lbGVtZW50KCk7CiAgICBpbml0X3Byb3BlcnR5KCk7CiAgICBpbml0X3N0YXRlMigpOwogICAgaW5pdF9ldmVudF9vcHRpb25zKCk7CiAgICBpbml0X3F1ZXJ5KCk7CiAgICBpbml0X3F1ZXJ5X2FsbCgpOwogICAgaW5pdF9xdWVyeV9hc3luYygpOwogICAgaW5pdF9xdWVyeV9hc3NpZ25lZF9lbGVtZW50cygpOwogICAgaW5pdF9xdWVyeV9hc3NpZ25lZF9ub2RlcygpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1lbGVtZW50QDIuMi4zL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWVsZW1lbnQvZGlzdF90cy9jbGFzc2VzLmRlZXMtZWxlbWVudC5qcwp2YXIgX19lc0RlY29yYXRlMiwgX19ydW5Jbml0aWFsaXplcnMzLCBEZWVzRWxlbWVudDsKdmFyIGluaXRfY2xhc3Nlc19kZWVzX2VsZW1lbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4yLjMvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL2NsYXNzZXMuZGVlcy1lbGVtZW50LmpzIigpIHsKICAgIGluaXRfcGx1Z2luczMoKTsKICAgIGluaXRfbGl0KCk7CiAgICBfX2VzRGVjb3JhdGUyID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICAgICAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICAgICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgICAgIHJldHVybiBmODsKICAgICAgfQogICAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogICAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogICAgICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICAgICAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgICAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgICAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgICAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICAgICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgICAgIH07CiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgICAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgICAgIGRvbmUgPSB0cnVlOwogICAgfTsKICAgIF9fcnVuSW5pdGlhbGl6ZXJzMyA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogICAgICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICAgICAgfQogICAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7CiAgICB9OwogICAgRGVlc0VsZW1lbnQgPSAoKCkgPT4gewogICAgICBsZXQgX2NsYXNzU3VwZXIgPSBsaXQuTGl0RWxlbWVudDsKICAgICAgbGV0IF9nb0JyaWdodF9kZWNvcmF0b3JzOwogICAgICBsZXQgX2dvQnJpZ2h0X2luaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX2dvQnJpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgICAgIGxldCBfZG9tdG9vbHNfZGVjb3JhdG9yczsKICAgICAgbGV0IF9kb210b29sc19pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9kb210b29sc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogICAgICByZXR1cm4gY2xhc3MgRGVlc0VsZW1lbnQgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICAgICAgc3RhdGljIHsKICAgICAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICAgICAgX2dvQnJpZ2h0X2RlY29yYXRvcnMgPSBbbGl0LnByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgICAgICBfZG9tdG9vbHNfZGVjb3JhdG9ycyA9IFtsaXQucHJvcGVydHkoKV07CiAgICAgICAgICBfX2VzRGVjb3JhdGUyKHRoaXMsIG51bGwsIF9nb0JyaWdodF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJnb0JyaWdodCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZ29CcmlnaHQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZ29CcmlnaHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgICAgIG9iai5nb0JyaWdodCA9IHZhbHVlMjsKICAgICAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZ29CcmlnaHRfaW5pdGlhbGl6ZXJzLCBfZ29CcmlnaHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgX19lc0RlY29yYXRlMih0aGlzLCBudWxsLCBfZG9tdG9vbHNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZG9tdG9vbHMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRvbXRvb2xzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRvbXRvb2xzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgICAgICBvYmouZG9tdG9vbHMgPSB2YWx1ZTI7CiAgICAgICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2RvbXRvb2xzX2luaXRpYWxpemVycywgX2RvbXRvb2xzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgICAgICB9CiAgICAgICAgLy8gU1RBVElDIOKAlCBjb21wb25lbnQtbGV2ZWwgY29uc3RyYWludCBoZWxwZXIgKHVzZSBpbiBgc3RhdGljIHN0eWxlcyA9IFsuLi5dYCkKICAgICAgICBzdGF0aWMgZ2V0Q29udGFpbmVyTmFtZSgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmlzIHx8IHRoaXMubmFtZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAiJDEtJDIiKS50b0xvd2VyQ2FzZSgpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgY3NzRm9yQ29uc3RyYWludChjb25zdHJhaW50cykgewogICAgICAgICAgcmV0dXJuIChjc3NBcmcpID0+IGRpc3RfdHNfZXhwb3J0czI5LmJyZWFrcG9pbnRzLmNzc0ZvckNvbnN0cmFpbnRDb250YWluZXIoY29uc3RyYWludHMsIHRoaXMuZ2V0Q29udGFpbmVyTmFtZSgpKShjc3NBcmcpOwogICAgICAgIH0KICAgICAgICAjZ29CcmlnaHRfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMyh0aGlzLCBfZ29CcmlnaHRfaW5pdGlhbGl6ZXJzLCBmYWxzZSk7CiAgICAgICAgLy8gSU5TVEFOQ0UKICAgICAgICBnZXQgZ29CcmlnaHQoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4jZ29CcmlnaHRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgICAgICB9CiAgICAgICAgc2V0IGdvQnJpZ2h0KHZhbHVlMikgewogICAgICAgICAgdGhpcy4jZ29CcmlnaHRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgICAgICB9CiAgICAgICAgLy8gZG9tdG9vbHMKICAgICAgICBkb210b29sc1Byb21pc2UgPSBfX3J1bkluaXRpYWxpemVyczModGhpcywgX2dvQnJpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgICAjZG9tdG9vbHNfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMyh0aGlzLCBfZG9tdG9vbHNfaW5pdGlhbGl6ZXJzLCB2b2lkIDApOwogICAgICAgIGdldCBkb210b29scygpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiNkb210b29sc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgICAgIH0KICAgICAgICBzZXQgZG9tdG9vbHModmFsdWUyKSB7CiAgICAgICAgICB0aGlzLiNkb210b29sc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgICByeFN1YnNjcmlwdGlvbnMgPSAoX19ydW5Jbml0aWFsaXplcnMzKHRoaXMsIF9kb210b29sc19leHRyYUluaXRpYWxpemVycyksIFtdKTsKICAgICAgICB0aGVtZVN1YnNjcmlwdGlvbjsKICAgICAgICBlbGVtZW50RG9tUmVhZHlEZWZlcnJlZCA9IGRpc3RfdHNfZXhwb3J0czI5LnBsdWdpbnMuc21hcnRwcm9taXNlLmRlZmVyKCk7CiAgICAgICAgZWxlbWVudERvbVJlYWR5ID0gdGhpcy5lbGVtZW50RG9tUmVhZHlEZWZlcnJlZC5wcm9taXNlOwogICAgICAgIGNvbnN0cnVjdG9yKG9wdGlvbnNBcmcgPSB7fSkgewogICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgIHRoaXMuZG9tdG9vbHNQcm9taXNlID0gZGlzdF90c19leHBvcnRzMjkuZWxlbWVudEJhc2ljLnNldHVwKHRoaXMsIG9wdGlvbnNBcmcpOwogICAgICAgICAgdGhpcy5kb210b29sc1Byb21pc2UudGhlbigoZG9tdG9vbHNBcmcpID0+IHsKICAgICAgICAgICAgdGhpcy5kb210b29scyA9IGRvbXRvb2xzQXJnOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICAgIGNvbnN0IGRvbXRvb2xzID0gYXdhaXQgdGhpcy5kb210b29sc1Byb21pc2U7CiAgICAgICAgICB0aGlzLnRoZW1lU3Vic2NyaXB0aW9uID0gZG9tdG9vbHMudGhlbWVNYW5hZ2VyLnRoZW1lT2JzZXJ2YWJsZS5zdWJzY3JpYmUoKGdvQnJpZ2h0QXJnKSA9PiB7CiAgICAgICAgICAgIHRoaXMuZ29CcmlnaHQgPSBnb0JyaWdodEFyZzsKICAgICAgICAgICAgaWYgKHRoaXMudGhlbWVDaGFuZ2VkKSB7CiAgICAgICAgICAgICAgdGhpcy50aGVtZUNoYW5nZWQoZ29CcmlnaHRBcmcpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMucnhTdWJzY3JpcHRpb25zLnB1c2godGhpcy50aGVtZVN1YnNjcmlwdGlvbik7CiAgICAgICAgICBmb3IgKGNvbnN0IHN0YXJ0dXBGdW5jdGlvbiBvZiB0aGlzLnN0YXJ0dXBGdW5jdGlvbnMpIHsKICAgICAgICAgICAgYXdhaXQgc3RhcnR1cEZ1bmN0aW9uKCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJkZWVzRWxlbWVudENvbm5lY3RlZCIpKTsKICAgICAgICB9CiAgICAgICAgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcykgewogICAgICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgICAgICB0aGlzLmVsZW1lbnREb21SZWFkeURlZmVycmVkLnJlc29sdmUoKTsKICAgICAgICB9CiAgICAgICAgc3RhcnR1cEZ1bmN0aW9ucyA9IFtdOwogICAgICAgIHJlZ2lzdGVyU3RhcnR1cEZ1bmN0aW9uKHN0YXJ0dXBGdW5jdGlvbkFyZykgewogICAgICAgICAgdGhpcy5zdGFydHVwRnVuY3Rpb25zLnB1c2goc3RhcnR1cEZ1bmN0aW9uQXJnKTsKICAgICAgICB9CiAgICAgICAgZ2FyYmFnZUZ1bmN0aW9ucyA9IFtdOwogICAgICAgIHJlZ2lzdGVyR2FyYmFnZUZ1bmN0aW9uKGdhcmJhZ2VGdW5jdGlvbkFyZykgewogICAgICAgICAgdGhpcy5nYXJiYWdlRnVuY3Rpb25zLnB1c2goZ2FyYmFnZUZ1bmN0aW9uQXJnKTsKICAgICAgICB9CiAgICAgICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgICBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiB0aGlzLnJ4U3Vic2NyaXB0aW9ucykgewogICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAoY29uc3QgZ2FyYmFnZUZ1bmN0aW9uIG9mIHRoaXMuZ2FyYmFnZUZ1bmN0aW9ucykgewogICAgICAgICAgICBhd2FpdCBnYXJiYWdlRnVuY3Rpb24oKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImRlZXNFbGVtZW50RGlzY29ubmVjdGVkIikpOwogICAgICAgIH0KICAgICAgfTsKICAgIH0pKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4yLjMvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL2RlY29yYXRvcnMuY29udGFpbmVycmVzcG9uc2l2ZS5qcwpmdW5jdGlvbiBjb250YWluZXJSZXNwb25zaXZlKCkgewogIHJldHVybiBmdW5jdGlvbih0YXJnZXQpIHsKICAgIGNvbnN0IHRhZ05hbWUgPSB0YXJnZXQuaXMgfHwgdGFyZ2V0Lm5hbWUucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgIiQxLSQyIikudG9Mb3dlckNhc2UoKTsKICAgIGNvbnN0IGRlcml2ZWROYW1lID0gdGFyZ2V0Lm5hbWUgPyBjYW1lbFRvS2ViYWIyKHRhcmdldC5uYW1lKSA6IG51bGw7CiAgICBpZiAoZGVyaXZlZE5hbWUgJiYgZGVyaXZlZE5hbWUgIT09IHRhZ05hbWUpIHsKICAgICAgY29uc3QgZml4U3R5bGUgPSAoc3R5bGUpID0+IHsKICAgICAgICBpZiAoc3R5bGUgJiYgc3R5bGUuY3NzVGV4dCAmJiBzdHlsZS5jc3NUZXh0LmluY2x1ZGVzKGBAY29udGFpbmVyICR7ZGVyaXZlZE5hbWV9YCkpIHsKICAgICAgICAgIHJldHVybiByKHN0eWxlLmNzc1RleHQucmVwbGFjZUFsbChgQGNvbnRhaW5lciAke2Rlcml2ZWROYW1lfWAsIGBAY29udGFpbmVyICR7dGFnTmFtZX1gKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdHlsZTsKICAgICAgfTsKICAgICAgY29uc3Qgb3JpZ2luYWwgPSB0YXJnZXQuc3R5bGVzOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShvcmlnaW5hbCkpIHsKICAgICAgICB0YXJnZXQuc3R5bGVzID0gb3JpZ2luYWwubWFwKGZpeFN0eWxlKTsKICAgICAgfSBlbHNlIGlmIChvcmlnaW5hbCkgewogICAgICAgIHRhcmdldC5zdHlsZXMgPSBmaXhTdHlsZShvcmlnaW5hbCk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGNvbnRhaW5lclN0eWxlcyA9IGRvbXRvb2xzX2Nzc19icmVha3BvaW50c19leHBvcnRzLmNvbnRhaW5lckNvbnRleHRTdHlsZXModGFnTmFtZSk7CiAgICBjb25zdCBjdXJyZW50ID0gdGFyZ2V0LnN0eWxlczsKICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpKSB7CiAgICAgIHRhcmdldC5zdHlsZXMgPSBbLi4uY3VycmVudCwgY29udGFpbmVyU3R5bGVzXTsKICAgIH0gZWxzZSBpZiAoY3VycmVudCkgewogICAgICB0YXJnZXQuc3R5bGVzID0gW2N1cnJlbnQsIGNvbnRhaW5lclN0eWxlc107CiAgICB9IGVsc2UgewogICAgICB0YXJnZXQuc3R5bGVzID0gW2NvbnRhaW5lclN0eWxlc107CiAgICB9CiAgICByZXR1cm4gdGFyZ2V0OwogIH07Cn0KdmFyIGNhbWVsVG9LZWJhYjI7CnZhciBpbml0X2RlY29yYXRvcnNfY29udGFpbmVycmVzcG9uc2l2ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvZGVjb3JhdG9ycy5jb250YWluZXJyZXNwb25zaXZlLmpzIigpIHsKICAgIGluaXRfbGl0KCk7CiAgICBpbml0X2Rpc3RfdHMyOSgpOwogICAgY2FtZWxUb0tlYmFiMiA9IChuYW1lKSA9PiBuYW1lLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICIkMS0kMiIpLnRvTG93ZXJDYXNlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9saXQtaHRtbEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvZGlyZWN0aXZlLWhlbHBlcnMuanMKdmFyIHQ2LCBpNywgbjksIGU5LCBsNCwgZDQsIGM1LCBmNSwgcjgsIHM2LCB2NCwgdTQsIG00LCBwNiwgTTIsIGg0LCBqMjsKdmFyIGluaXRfZGlyZWN0aXZlX2hlbHBlcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXQtaHRtbEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvZGlyZWN0aXZlLWhlbHBlcnMuanMiKCkgewogICAgaW5pdF9saXRfaHRtbCgpOwogICAgKHsgSTogdDYgfSA9IGopLCBpNyA9IChvMTMpID0+IG8xMywgbjkgPSAobzEzKSA9PiBudWxsID09PSBvMTMgfHwgIm9iamVjdCIgIT0gdHlwZW9mIG8xMyAmJiAiZnVuY3Rpb24iICE9IHR5cGVvZiBvMTMsIGU5ID0geyBIVE1MOiAxLCBTVkc6IDIsIE1BVEhNTDogMyB9LCBsNCA9IChvMTMsIHQ5KSA9PiB2b2lkIDAgPT09IHQ5ID8gdm9pZCAwICE9PSBvMTM/Ll8kbGl0VHlwZSQgOiBvMTM/Ll8kbGl0VHlwZSQgPT09IHQ5LCBkNCA9IChvMTMpID0+IG51bGwgIT0gbzEzPy5fJGxpdFR5cGUkPy5oLCBjNSA9IChvMTMpID0+IHZvaWQgMCAhPT0gbzEzPy5fJGxpdERpcmVjdGl2ZSQsIGY1ID0gKG8xMykgPT4gbzEzPy5fJGxpdERpcmVjdGl2ZSQsIHI4ID0gKG8xMykgPT4gdm9pZCAwID09PSBvMTMuc3RyaW5ncywgczYgPSAoKSA9PiBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSwgdjQgPSAobzEzLCBuMTMsIGUxMSkgPT4gewogICAgICBjb25zdCBsNiA9IG8xMy5fJEFBLnBhcmVudE5vZGUsIGQ2ID0gdm9pZCAwID09PSBuMTMgPyBvMTMuXyRBQiA6IG4xMy5fJEFBOwogICAgICBpZiAodm9pZCAwID09PSBlMTEpIHsKICAgICAgICBjb25zdCBpMTEgPSBsNi5pbnNlcnRCZWZvcmUoczYoKSwgZDYpLCBuMTQgPSBsNi5pbnNlcnRCZWZvcmUoczYoKSwgZDYpOwogICAgICAgIGUxMSA9IG5ldyB0NihpMTEsIG4xNCwgbzEzLCBvMTMub3B0aW9ucyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgdDkgPSBlMTEuXyRBQi5uZXh0U2libGluZywgbjE0ID0gZTExLl8kQU0sIGMxMSA9IG4xNCAhPT0gbzEzOwogICAgICAgIGlmIChjMTEpIHsKICAgICAgICAgIGxldCB0MTA7CiAgICAgICAgICBlMTEuXyRBUT8uKG8xMyksIGUxMS5fJEFNID0gbzEzLCB2b2lkIDAgIT09IGUxMS5fJEFQICYmICh0MTAgPSBvMTMuXyRBVSkgIT09IG4xNC5fJEFVICYmIGUxMS5fJEFQKHQxMCk7CiAgICAgICAgfQogICAgICAgIGlmICh0OSAhPT0gZDYgfHwgYzExKSB7CiAgICAgICAgICBsZXQgbzE0ID0gZTExLl8kQUE7CiAgICAgICAgICBmb3IgKDsgbzE0ICE9PSB0OTsgKSB7CiAgICAgICAgICAgIGNvbnN0IHQxMCA9IGk3KG8xNCkubmV4dFNpYmxpbmc7CiAgICAgICAgICAgIGk3KGw2KS5pbnNlcnRCZWZvcmUobzE0LCBkNiksIG8xNCA9IHQxMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGUxMTsKICAgIH0sIHU0ID0gKG8xMywgdDksIGkxMSA9IG8xMykgPT4gKG8xMy5fJEFJKHQ5LCBpMTEpLCBvMTMpLCBtNCA9IHt9LCBwNiA9IChvMTMsIHQ5ID0gbTQpID0+IG8xMy5fJEFIID0gdDksIE0yID0gKG8xMykgPT4gbzEzLl8kQUgsIGg0ID0gKG8xMykgPT4gewogICAgICBvMTMuXyRBUigpLCBvMTMuXyRBQS5yZW1vdmUoKTsKICAgIH0sIGoyID0gKG8xMykgPT4gewogICAgICBvMTMuXyRBUigpOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9hc3luYy1kaXJlY3RpdmUuanMKZnVuY3Rpb24gaDUoaTExKSB7CiAgdm9pZCAwICE9PSB0aGlzLl8kQU4gPyAobzEwKHRoaXMpLCB0aGlzLl8kQU0gPSBpMTEsIHI5KHRoaXMpKSA6IHRoaXMuXyRBTSA9IGkxMTsKfQpmdW5jdGlvbiBuMTAoaTExLCB0OSA9IGZhbHNlLCBlMTEgPSAwKSB7CiAgY29uc3QgcjExID0gdGhpcy5fJEFILCBoOSA9IHRoaXMuXyRBTjsKICBpZiAodm9pZCAwICE9PSBoOSAmJiAwICE9PSBoOS5zaXplKSBpZiAodDkpIGlmIChBcnJheS5pc0FycmF5KHIxMSkpIGZvciAobGV0IGkxMiA9IGUxMTsgaTEyIDwgcjExLmxlbmd0aDsgaTEyKyspIHM3KHIxMVtpMTJdLCBmYWxzZSksIG8xMChyMTFbaTEyXSk7CiAgZWxzZSBudWxsICE9IHIxMSAmJiAoczcocjExLCBmYWxzZSksIG8xMChyMTEpKTsKICBlbHNlIHM3KHRoaXMsIGkxMSk7Cn0KdmFyIHM3LCBvMTAsIHI5LCBjNiwgZjY7CnZhciBpbml0X2FzeW5jX2RpcmVjdGl2ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9hc3luYy1kaXJlY3RpdmUuanMiKCkgewogICAgaW5pdF9kaXJlY3RpdmVfaGVscGVycygpOwogICAgaW5pdF9kaXJlY3RpdmUoKTsKICAgIGluaXRfZGlyZWN0aXZlKCk7CiAgICBzNyA9IChpMTEsIHQ5KSA9PiB7CiAgICAgIGNvbnN0IGUxMSA9IGkxMS5fJEFOOwogICAgICBpZiAodm9pZCAwID09PSBlMTEpIHJldHVybiBmYWxzZTsKICAgICAgZm9yIChjb25zdCBpMTIgb2YgZTExKSBpMTIuXyRBTz8uKHQ5LCBmYWxzZSksIHM3KGkxMiwgdDkpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0sIG8xMCA9IChpMTEpID0+IHsKICAgICAgbGV0IHQ5LCBlMTE7CiAgICAgIGRvIHsKICAgICAgICBpZiAodm9pZCAwID09PSAodDkgPSBpMTEuXyRBTSkpIGJyZWFrOwogICAgICAgIGUxMSA9IHQ5Ll8kQU4sIGUxMS5kZWxldGUoaTExKSwgaTExID0gdDk7CiAgICAgIH0gd2hpbGUgKDAgPT09IGUxMT8uc2l6ZSk7CiAgICB9LCByOSA9IChpMTEpID0+IHsKICAgICAgZm9yIChsZXQgdDk7IHQ5ID0gaTExLl8kQU07IGkxMSA9IHQ5KSB7CiAgICAgICAgbGV0IGUxMSA9IHQ5Ll8kQU47CiAgICAgICAgaWYgKHZvaWQgMCA9PT0gZTExKSB0OS5fJEFOID0gZTExID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgICAgICBlbHNlIGlmIChlMTEuaGFzKGkxMSkpIGJyZWFrOwogICAgICAgIGUxMS5hZGQoaTExKSwgYzYodDkpOwogICAgICB9CiAgICB9OwogICAgYzYgPSAoaTExKSA9PiB7CiAgICAgIGkxMS50eXBlID09IHQzLkNISUxEICYmIChpMTEuXyRBUCA/Pz0gbjEwLCBpMTEuXyRBUSA/Pz0gaDUpOwogICAgfTsKICAgIGY2ID0gY2xhc3MgZXh0ZW5kcyBpNiB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMuXyRBTiA9IHZvaWQgMDsKICAgICAgfQogICAgICBfJEFUKGkxMSwgdDksIGUxMSkgewogICAgICAgIHN1cGVyLl8kQVQoaTExLCB0OSwgZTExKSwgcjkodGhpcyksIHRoaXMuaXNDb25uZWN0ZWQgPSBpMTEuXyRBVTsKICAgICAgfQogICAgICBfJEFPKGkxMSwgdDkgPSB0cnVlKSB7CiAgICAgICAgaTExICE9PSB0aGlzLmlzQ29ubmVjdGVkICYmICh0aGlzLmlzQ29ubmVjdGVkID0gaTExLCBpMTEgPyB0aGlzLnJlY29ubmVjdGVkPy4oKSA6IHRoaXMuZGlzY29ubmVjdGVkPy4oKSksIHQ5ICYmIChzNyh0aGlzLCBpMTEpLCBvMTAodGhpcykpOwogICAgICB9CiAgICAgIHNldFZhbHVlKHQ5KSB7CiAgICAgICAgaWYgKHI4KHRoaXMuXyRDdCkpIHRoaXMuXyRDdC5fJEFJKHQ5LCB0aGlzKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGNvbnN0IGkxMSA9IFsuLi50aGlzLl8kQ3QuXyRBSF07CiAgICAgICAgICBpMTFbdGhpcy5fJENpXSA9IHQ5LCB0aGlzLl8kQ3QuXyRBSShpMTEsIHRoaXMsIDApOwogICAgICAgIH0KICAgICAgfQogICAgICBkaXNjb25uZWN0ZWQoKSB7CiAgICAgIH0KICAgICAgcmVjb25uZWN0ZWQoKSB7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9saXRAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC9hc3luYy1kaXJlY3RpdmUuanMKdmFyIGluaXRfYXN5bmNfZGlyZWN0aXZlMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2xpdEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0L2FzeW5jLWRpcmVjdGl2ZS5qcyIoKSB7CiAgICBpbml0X2FzeW5jX2RpcmVjdGl2ZSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1lbGVtZW50QDIuMi4zL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWVsZW1lbnQvZGlzdF90cy9kaXJlY3RpdmVzL2NsYXNzZXMucmVzb2x2ZWRpcmVjdGl2ZS5qcwp2YXIgUmVzb2x2ZURpcmVjdGl2ZSwgcmVzb2x2ZSwgcmVzb2x2ZUV4ZWM7CnZhciBpbml0X2NsYXNzZXNfcmVzb2x2ZWRpcmVjdGl2ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvZGlyZWN0aXZlcy9jbGFzc2VzLnJlc29sdmVkaXJlY3RpdmUuanMiKCkgewogICAgaW5pdF9saXQoKTsKICAgIGluaXRfYXN5bmNfZGlyZWN0aXZlMigpOwogICAgUmVzb2x2ZURpcmVjdGl2ZSA9IGNsYXNzIGV4dGVuZHMgZjYgewogICAgICBwcm9taXNlOwogICAgICBoYXNQcm9taXNlU2V0dGxlZCA9IGZhbHNlOwogICAgICByZW5kZXIocHJvbWlzZSkgewogICAgICAgIGlmICh0aGlzLnByb21pc2UgIT09IHByb21pc2UpIHsKICAgICAgICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7CiAgICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkgewogICAgICAgICAgICB0aGlzLmhhbmRsZVByb21pc2UocHJvbWlzZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBFOwogICAgICB9CiAgICAgIGhhbmRsZVByb21pc2UocHJvbWlzZSkgewogICAgICAgIHRoaXMuaGFzUHJvbWlzZVNldHRsZWQgPSBmYWxzZTsKICAgICAgICBwcm9taXNlLnRoZW4oKHZhbHVlMikgPT4gewogICAgICAgICAgaWYgKHRoaXMucHJvbWlzZSA9PT0gcHJvbWlzZSAmJiAhdGhpcy5oYXNQcm9taXNlU2V0dGxlZCkgewogICAgICAgICAgICB0aGlzLnNldFZhbHVlKHZhbHVlMik7CiAgICAgICAgICAgIHRoaXMuaGFzUHJvbWlzZVNldHRsZWQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4gewogICAgICAgICAgaWYgKHRoaXMucHJvbWlzZSA9PT0gcHJvbWlzZSAmJiAhdGhpcy5oYXNQcm9taXNlU2V0dGxlZCkgewogICAgICAgICAgICB0aGlzLnNldFZhbHVlKGVycm9yKTsKICAgICAgICAgICAgdGhpcy5oYXNQcm9taXNlU2V0dGxlZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgZGlzY29ubmVjdGVkKCkgewogICAgICAgIHRoaXMuaGFzUHJvbWlzZVNldHRsZWQgPSB0cnVlOwogICAgICB9CiAgICAgIHJlY29ubmVjdGVkKCkgewogICAgICAgIGlmICghdGhpcy5oYXNQcm9taXNlU2V0dGxlZCkgewogICAgICAgICAgdGhpcy5oYW5kbGVQcm9taXNlKHRoaXMucHJvbWlzZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgcmVzb2x2ZSA9IGU0KFJlc29sdmVEaXJlY3RpdmUpOwogICAgcmVzb2x2ZUV4ZWMgPSAoZnVuY0FyZykgPT4gewogICAgICByZXR1cm4gcmVzb2x2ZShmdW5jQXJnKCkpOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvZGlyZWN0aXZlcy9jbGFzc2VzLnN1YnNjcmliZWRpcmVjdGl2ZS5qcwp2YXIgU3Vic2NyaWJlRGlyZWN0aXZlLCBzdWJzY3JpYmU7CnZhciBpbml0X2NsYXNzZXNfc3Vic2NyaWJlZGlyZWN0aXZlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1lbGVtZW50QDIuMi4zL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWVsZW1lbnQvZGlzdF90cy9kaXJlY3RpdmVzL2NsYXNzZXMuc3Vic2NyaWJlZGlyZWN0aXZlLmpzIigpIHsKICAgIGluaXRfbGl0KCk7CiAgICBpbml0X2FzeW5jX2RpcmVjdGl2ZTIoKTsKICAgIGluaXRfZGlzdF90czIoKTsKICAgIFN1YnNjcmliZURpcmVjdGl2ZSA9IGNsYXNzIGV4dGVuZHMgZjYgewogICAgICBvYnNlcnZhYmxlOwogICAgICBzdWIgPSBudWxsOwogICAgICByZW5kZXIob2JzZXJ2YWJsZTIpIHsKICAgICAgICBpZiAodGhpcy5vYnNlcnZhYmxlICE9PSBvYnNlcnZhYmxlMikgewogICAgICAgICAgdGhpcy5zdWI/LnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICB0aGlzLm9ic2VydmFibGUgPSBvYnNlcnZhYmxlMjsKICAgICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7CiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlKG9ic2VydmFibGUyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIEU7CiAgICAgIH0KICAgICAgc3Vic2NyaWJlKG9ic2VydmFibGUyKSB7CiAgICAgICAgdGhpcy5zdWIgPSBvYnNlcnZhYmxlMi5zdWJzY3JpYmUoKHY2KSA9PiB7CiAgICAgICAgICB0aGlzLnNldFZhbHVlKHY2KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBkaXNjb25uZWN0ZWQoKSB7CiAgICAgICAgdGhpcy5zdWI/LnVuc3Vic2NyaWJlKCk7CiAgICAgIH0KICAgICAgcmVjb25uZWN0ZWQoKSB7CiAgICAgICAgdGhpcy5zdWJzY3JpYmUodGhpcy5vYnNlcnZhYmxlKTsKICAgICAgfQogICAgfTsKICAgIHN1YnNjcmliZSA9IGU0KFN1YnNjcmliZURpcmVjdGl2ZSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4yLjMvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL2RpcmVjdGl2ZXMvY2xhc3Nlcy5zdWJzY3JpYmV3aXRodGVtcGxhdGUuanMKdmFyIFN1YnNjcmliZVdpdGhUZW1wbGF0ZURpcmVjdGl2ZSwgc3Vic2NyaWJlV2l0aFRlbXBsYXRlOwp2YXIgaW5pdF9jbGFzc2VzX3N1YnNjcmliZXdpdGh0ZW1wbGF0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvZGlyZWN0aXZlcy9jbGFzc2VzLnN1YnNjcmliZXdpdGh0ZW1wbGF0ZS5qcyIoKSB7CiAgICBpbml0X2xpdCgpOwogICAgaW5pdF9hc3luY19kaXJlY3RpdmUyKCk7CiAgICBpbml0X2Rpc3RfdHMyKCk7CiAgICBTdWJzY3JpYmVXaXRoVGVtcGxhdGVEaXJlY3RpdmUgPSBjbGFzcyBleHRlbmRzIGY2IHsKICAgICAgb2JzZXJ2YWJsZTsKICAgICAgdGVtcGxhdGVGbjsKICAgICAgc3ViID0gbnVsbDsKICAgICAgcmVuZGVyKG9ic2VydmFibGUyLCB0ZW1wbGF0ZUZuKSB7CiAgICAgICAgY29uc3QgY2hhbmdlZCA9IHRoaXMub2JzZXJ2YWJsZSAhPT0gb2JzZXJ2YWJsZTIgfHwgdGhpcy50ZW1wbGF0ZUZuICE9PSB0ZW1wbGF0ZUZuOwogICAgICAgIGlmIChjaGFuZ2VkKSB7CiAgICAgICAgICB0aGlzLnN1Yj8udW5zdWJzY3JpYmUoKTsKICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZSA9IG9ic2VydmFibGUyOwogICAgICAgICAgdGhpcy50ZW1wbGF0ZUZuID0gdGVtcGxhdGVGbjsKICAgICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7CiAgICAgICAgICAgIHRoaXMuc3RhcnRTdWJzY3JpcHRpb24oKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIEU7CiAgICAgIH0KICAgICAgc3RhcnRTdWJzY3JpcHRpb24oKSB7CiAgICAgICAgdGhpcy5zdWIgPSB0aGlzLm9ic2VydmFibGUuc3Vic2NyaWJlKCh2NikgPT4gewogICAgICAgICAgY29uc3Qgb3V0ID0gdGhpcy50ZW1wbGF0ZUZuKHY2KTsKICAgICAgICAgIHRoaXMuc2V0VmFsdWUob3V0KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBkaXNjb25uZWN0ZWQoKSB7CiAgICAgICAgdGhpcy5zdWI/LnVuc3Vic2NyaWJlKCk7CiAgICAgIH0KICAgICAgcmVjb25uZWN0ZWQoKSB7CiAgICAgICAgdGhpcy5zdGFydFN1YnNjcmlwdGlvbigpOwogICAgICB9CiAgICB9OwogICAgc3Vic2NyaWJlV2l0aFRlbXBsYXRlID0gZTQoU3Vic2NyaWJlV2l0aFRlbXBsYXRlRGlyZWN0aXZlKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmVzL3ByaXZhdGUtYXN5bmMtaGVscGVycy5qcwp2YXIgdDcsIHM4LCBpODsKdmFyIGluaXRfcHJpdmF0ZV9hc3luY19oZWxwZXJzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RpcmVjdGl2ZXMvcHJpdmF0ZS1hc3luYy1oZWxwZXJzLmpzIigpIHsKICAgIHQ3ID0gYXN5bmMgKHQ5LCBzMTApID0+IHsKICAgICAgZm9yIGF3YWl0IChjb25zdCBpMTEgb2YgdDkpIGlmIChmYWxzZSA9PT0gYXdhaXQgczEwKGkxMSkpIHJldHVybjsKICAgIH07CiAgICBzOCA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IodDkpIHsKICAgICAgICB0aGlzLkcgPSB0OTsKICAgICAgfQogICAgICBkaXNjb25uZWN0KCkgewogICAgICAgIHRoaXMuRyA9IHZvaWQgMDsKICAgICAgfQogICAgICByZWNvbm5lY3QodDkpIHsKICAgICAgICB0aGlzLkcgPSB0OTsKICAgICAgfQogICAgICBkZXJlZigpIHsKICAgICAgICByZXR1cm4gdGhpcy5HOwogICAgICB9CiAgICB9OwogICAgaTggPSBjbGFzcyB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuWSA9IHZvaWQgMCwgdGhpcy5aID0gdm9pZCAwOwogICAgICB9CiAgICAgIGdldCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5ZOwogICAgICB9CiAgICAgIHBhdXNlKCkgewogICAgICAgIHRoaXMuWSA/Pz0gbmV3IFByb21pc2UoKHQ5KSA9PiB0aGlzLlogPSB0OSk7CiAgICAgIH0KICAgICAgcmVzdW1lKCkgewogICAgICAgIHRoaXMuWj8uKCksIHRoaXMuWSA9IHRoaXMuWiA9IHZvaWQgMDsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmVzL3VudGlsLmpzCnZhciBuMTEsIGg2LCBjNywgbTU7CnZhciBpbml0X3VudGlsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RpcmVjdGl2ZXMvdW50aWwuanMiKCkgewogICAgaW5pdF9saXRfaHRtbCgpOwogICAgaW5pdF9kaXJlY3RpdmVfaGVscGVycygpOwogICAgaW5pdF9hc3luY19kaXJlY3RpdmUoKTsKICAgIGluaXRfcHJpdmF0ZV9hc3luY19oZWxwZXJzKCk7CiAgICBpbml0X2RpcmVjdGl2ZSgpOwogICAgbjExID0gKHQ5KSA9PiAhbjkodDkpICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIHQ5LnRoZW4sIGg2ID0gMTA3Mzc0MTgyMzsKICAgIGM3ID0gY2xhc3MgZXh0ZW5kcyBmNiB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMuXyRDd3QgPSBoNiwgdGhpcy5fJENidCA9IFtdLCB0aGlzLl8kQ0sgPSBuZXcgczgodGhpcyksIHRoaXMuXyRDWCA9IG5ldyBpOCgpOwogICAgICB9CiAgICAgIHJlbmRlciguLi5zMTApIHsKICAgICAgICByZXR1cm4gczEwLmZpbmQoKHQ5KSA9PiAhbjExKHQ5KSkgPz8gRTsKICAgICAgfQogICAgICB1cGRhdGUoczEwLCBpMTEpIHsKICAgICAgICBjb25zdCBlMTEgPSB0aGlzLl8kQ2J0OwogICAgICAgIGxldCByMTEgPSBlMTEubGVuZ3RoOwogICAgICAgIHRoaXMuXyRDYnQgPSBpMTE7CiAgICAgICAgY29uc3QgbzEzID0gdGhpcy5fJENLLCBjMTEgPSB0aGlzLl8kQ1g7CiAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCB8fCB0aGlzLmRpc2Nvbm5lY3RlZCgpOwogICAgICAgIGZvciAobGV0IHQ5ID0gMDsgdDkgPCBpMTEubGVuZ3RoICYmICEodDkgPiB0aGlzLl8kQ3d0KTsgdDkrKykgewogICAgICAgICAgY29uc3QgczExID0gaTExW3Q5XTsKICAgICAgICAgIGlmICghbjExKHMxMSkpIHJldHVybiB0aGlzLl8kQ3d0ID0gdDksIHMxMTsKICAgICAgICAgIHQ5IDwgcjExICYmIHMxMSA9PT0gZTExW3Q5XSB8fCAodGhpcy5fJEN3dCA9IGg2LCByMTEgPSAwLCBQcm9taXNlLnJlc29sdmUoczExKS50aGVuKGFzeW5jICh0MTApID0+IHsKICAgICAgICAgICAgZm9yICg7IGMxMS5nZXQoKTsgKSBhd2FpdCBjMTEuZ2V0KCk7CiAgICAgICAgICAgIGNvbnN0IGkxMiA9IG8xMy5kZXJlZigpOwogICAgICAgICAgICBpZiAodm9pZCAwICE9PSBpMTIpIHsKICAgICAgICAgICAgICBjb25zdCBlMTIgPSBpMTIuXyRDYnQuaW5kZXhPZihzMTEpOwogICAgICAgICAgICAgIGUxMiA+IC0xICYmIGUxMiA8IGkxMi5fJEN3dCAmJiAoaTEyLl8kQ3d0ID0gZTEyLCBpMTIuc2V0VmFsdWUodDEwKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEU7CiAgICAgIH0KICAgICAgZGlzY29ubmVjdGVkKCkgewogICAgICAgIHRoaXMuXyRDSy5kaXNjb25uZWN0KCksIHRoaXMuXyRDWC5wYXVzZSgpOwogICAgICB9CiAgICAgIHJlY29ubmVjdGVkKCkgewogICAgICAgIHRoaXMuXyRDSy5yZWNvbm5lY3QodGhpcyksIHRoaXMuXyRDWC5yZXN1bWUoKTsKICAgICAgfQogICAgfTsKICAgIG01ID0gZTQoYzcpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0QDMuMy4yL25vZGVfbW9kdWxlcy9saXQvZGlyZWN0aXZlcy91bnRpbC5qcwp2YXIgaW5pdF91bnRpbDIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXRAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC9kaXJlY3RpdmVzL3VudGlsLmpzIigpIHsKICAgIGluaXRfdW50aWwoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmVzL2FzeW5jLXJlcGxhY2UuanMKdmFyIG8xMSwgaDc7CnZhciBpbml0X2FzeW5jX3JlcGxhY2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXQtaHRtbEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvZGlyZWN0aXZlcy9hc3luYy1yZXBsYWNlLmpzIigpIHsKICAgIGluaXRfbGl0X2h0bWwoKTsKICAgIGluaXRfYXN5bmNfZGlyZWN0aXZlKCk7CiAgICBpbml0X3ByaXZhdGVfYXN5bmNfaGVscGVycygpOwogICAgaW5pdF9kaXJlY3RpdmUoKTsKICAgIG8xMSA9IGNsYXNzIGV4dGVuZHMgZjYgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLl8kQ0sgPSBuZXcgczgodGhpcyksIHRoaXMuXyRDWCA9IG5ldyBpOCgpOwogICAgICB9CiAgICAgIHJlbmRlcihpMTEsIHMxMCkgewogICAgICAgIHJldHVybiBFOwogICAgICB9CiAgICAgIHVwZGF0ZShpMTEsIFtzMTAsIHIxMV0pIHsKICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCB8fCB0aGlzLmRpc2Nvbm5lY3RlZCgpLCBzMTAgPT09IHRoaXMuXyRDSikgcmV0dXJuIEU7CiAgICAgICAgdGhpcy5fJENKID0gczEwOwogICAgICAgIGxldCBuMTMgPSAwOwogICAgICAgIGNvbnN0IHsgXyRDSzogbzEzLCBfJENYOiBoOSB9ID0gdGhpczsKICAgICAgICByZXR1cm4gdDcoczEwLCBhc3luYyAodDkpID0+IHsKICAgICAgICAgIGZvciAoOyBoOS5nZXQoKTsgKSBhd2FpdCBoOS5nZXQoKTsKICAgICAgICAgIGNvbnN0IGkxMiA9IG8xMy5kZXJlZigpOwogICAgICAgICAgaWYgKHZvaWQgMCAhPT0gaTEyKSB7CiAgICAgICAgICAgIGlmIChpMTIuXyRDSiAhPT0gczEwKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIHZvaWQgMCAhPT0gcjExICYmICh0OSA9IHIxMSh0OSwgbjEzKSksIGkxMi5jb21taXRWYWx1ZSh0OSwgbjEzKSwgbjEzKys7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9KSwgRTsKICAgICAgfQogICAgICBjb21taXRWYWx1ZSh0OSwgaTExKSB7CiAgICAgICAgdGhpcy5zZXRWYWx1ZSh0OSk7CiAgICAgIH0KICAgICAgZGlzY29ubmVjdGVkKCkgewogICAgICAgIHRoaXMuXyRDSy5kaXNjb25uZWN0KCksIHRoaXMuXyRDWC5wYXVzZSgpOwogICAgICB9CiAgICAgIHJlY29ubmVjdGVkKCkgewogICAgICAgIHRoaXMuXyRDSy5yZWNvbm5lY3QodGhpcyksIHRoaXMuXyRDWC5yZXN1bWUoKTsKICAgICAgfQogICAgfTsKICAgIGg3ID0gZTQobzExKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmVzL2FzeW5jLWFwcGVuZC5qcwp2YXIgYzg7CnZhciBpbml0X2FzeW5jX2FwcGVuZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2xpdC1odG1sQDMuMy4yL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kaXJlY3RpdmVzL2FzeW5jLWFwcGVuZC5qcyIoKSB7CiAgICBpbml0X2RpcmVjdGl2ZSgpOwogICAgaW5pdF9hc3luY19yZXBsYWNlKCk7CiAgICBpbml0X2RpcmVjdGl2ZV9oZWxwZXJzKCk7CiAgICBjOCA9IGU0KGNsYXNzIGV4dGVuZHMgbzExIHsKICAgICAgY29uc3RydWN0b3IocjExKSB7CiAgICAgICAgaWYgKHN1cGVyKHIxMSksIHIxMS50eXBlICE9PSB0My5DSElMRCkgdGhyb3cgRXJyb3IoImFzeW5jQXBwZW5kIGNhbiBvbmx5IGJlIHVzZWQgaW4gY2hpbGQgZXhwcmVzc2lvbnMiKTsKICAgICAgfQogICAgICB1cGRhdGUocjExLCBlMTEpIHsKICAgICAgICByZXR1cm4gdGhpcy5fJEN0dCA9IHIxMSwgc3VwZXIudXBkYXRlKHIxMSwgZTExKTsKICAgICAgfQogICAgICBjb21taXRWYWx1ZShyMTEsIGUxMSkgewogICAgICAgIDAgPT09IGUxMSAmJiBqMih0aGlzLl8kQ3R0KTsKICAgICAgICBjb25zdCBzMTAgPSB2NCh0aGlzLl8kQ3R0KTsKICAgICAgICB1NChzMTAsIHIxMSk7CiAgICAgIH0KICAgIH0pOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0QDMuMy4yL25vZGVfbW9kdWxlcy9saXQvZGlyZWN0aXZlcy9hc3luYy1hcHBlbmQuanMKdmFyIGluaXRfYXN5bmNfYXBwZW5kMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2xpdEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0L2RpcmVjdGl2ZXMvYXN5bmMtYXBwZW5kLmpzIigpIHsKICAgIGluaXRfYXN5bmNfYXBwZW5kKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9saXQtaHRtbEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvZGlyZWN0aXZlcy9rZXllZC5qcwp2YXIgaTk7CnZhciBpbml0X2tleWVkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RpcmVjdGl2ZXMva2V5ZWQuanMiKCkgewogICAgaW5pdF9saXRfaHRtbCgpOwogICAgaW5pdF9kaXJlY3RpdmUoKTsKICAgIGluaXRfZGlyZWN0aXZlX2hlbHBlcnMoKTsKICAgIGk5ID0gZTQoY2xhc3MgZXh0ZW5kcyBpNiB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMua2V5ID0gQTsKICAgICAgfQogICAgICByZW5kZXIocjExLCB0OSkgewogICAgICAgIHJldHVybiB0aGlzLmtleSA9IHIxMSwgdDk7CiAgICAgIH0KICAgICAgdXBkYXRlKHIxMSwgW3Q5LCBlMTFdKSB7CiAgICAgICAgcmV0dXJuIHQ5ICE9PSB0aGlzLmtleSAmJiAocDYocjExKSwgdGhpcy5rZXkgPSB0OSksIGUxMTsKICAgICAgfQogICAgfSk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9saXRAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC9kaXJlY3RpdmVzL2tleWVkLmpzCnZhciBpbml0X2tleWVkMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2xpdEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0L2RpcmVjdGl2ZXMva2V5ZWQuanMiKCkgewogICAgaW5pdF9rZXllZCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbGl0LWh0bWxAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RpcmVjdGl2ZXMvcmVwZWF0LmpzCnZhciB1NSwgYzk7CnZhciBpbml0X3JlcGVhdDIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXQtaHRtbEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvZGlyZWN0aXZlcy9yZXBlYXQuanMiKCkgewogICAgaW5pdF9saXRfaHRtbCgpOwogICAgaW5pdF9kaXJlY3RpdmUoKTsKICAgIGluaXRfZGlyZWN0aXZlX2hlbHBlcnMoKTsKICAgIHU1ID0gKGUxMSwgczEwLCB0OSkgPT4gewogICAgICBjb25zdCByMTEgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICBmb3IgKGxldCBsNiA9IHMxMDsgbDYgPD0gdDk7IGw2KyspIHIxMS5zZXQoZTExW2w2XSwgbDYpOwogICAgICByZXR1cm4gcjExOwogICAgfSwgYzkgPSBlNChjbGFzcyBleHRlbmRzIGk2IHsKICAgICAgY29uc3RydWN0b3IoZTExKSB7CiAgICAgICAgaWYgKHN1cGVyKGUxMSksIGUxMS50eXBlICE9PSB0My5DSElMRCkgdGhyb3cgRXJyb3IoInJlcGVhdCgpIGNhbiBvbmx5IGJlIHVzZWQgaW4gdGV4dCBleHByZXNzaW9ucyIpOwogICAgICB9CiAgICAgIGR0KGUxMSwgczEwLCB0OSkgewogICAgICAgIGxldCByMTE7CiAgICAgICAgdm9pZCAwID09PSB0OSA/IHQ5ID0gczEwIDogdm9pZCAwICE9PSBzMTAgJiYgKHIxMSA9IHMxMCk7CiAgICAgICAgY29uc3QgbDYgPSBbXSwgbzEzID0gW107CiAgICAgICAgbGV0IGkxMSA9IDA7CiAgICAgICAgZm9yIChjb25zdCBzMTEgb2YgZTExKSBsNltpMTFdID0gcjExID8gcjExKHMxMSwgaTExKSA6IGkxMSwgbzEzW2kxMV0gPSB0OShzMTEsIGkxMSksIGkxMSsrOwogICAgICAgIHJldHVybiB7IHZhbHVlczogbzEzLCBrZXlzOiBsNiB9OwogICAgICB9CiAgICAgIHJlbmRlcihlMTEsIHMxMCwgdDkpIHsKICAgICAgICByZXR1cm4gdGhpcy5kdChlMTEsIHMxMCwgdDkpLnZhbHVlczsKICAgICAgfQogICAgICB1cGRhdGUoczEwLCBbdDksIHIxMSwgYzExXSkgewogICAgICAgIGNvbnN0IGQ2ID0gTTIoczEwKSwgeyB2YWx1ZXM6IHA4LCBrZXlzOiBhNSB9ID0gdGhpcy5kdCh0OSwgcjExLCBjMTEpOwogICAgICAgIGlmICghQXJyYXkuaXNBcnJheShkNikpIHJldHVybiB0aGlzLnV0ID0gYTUsIHA4OwogICAgICAgIGNvbnN0IGg5ID0gdGhpcy51dCA/Pz0gW10sIHY2ID0gW107CiAgICAgICAgbGV0IG03LCB5NSwgeDQgPSAwLCBqNCA9IGQ2Lmxlbmd0aCAtIDEsIGs1ID0gMCwgdzQgPSBwOC5sZW5ndGggLSAxOwogICAgICAgIGZvciAoOyB4NCA8PSBqNCAmJiBrNSA8PSB3NDsgKSBpZiAobnVsbCA9PT0gZDZbeDRdKSB4NCsrOwogICAgICAgIGVsc2UgaWYgKG51bGwgPT09IGQ2W2o0XSkgajQtLTsKICAgICAgICBlbHNlIGlmIChoOVt4NF0gPT09IGE1W2s1XSkgdjZbazVdID0gdTQoZDZbeDRdLCBwOFtrNV0pLCB4NCsrLCBrNSsrOwogICAgICAgIGVsc2UgaWYgKGg5W2o0XSA9PT0gYTVbdzRdKSB2Nlt3NF0gPSB1NChkNltqNF0sIHA4W3c0XSksIGo0LS0sIHc0LS07CiAgICAgICAgZWxzZSBpZiAoaDlbeDRdID09PSBhNVt3NF0pIHY2W3c0XSA9IHU0KGQ2W3g0XSwgcDhbdzRdKSwgdjQoczEwLCB2Nlt3NCArIDFdLCBkNlt4NF0pLCB4NCsrLCB3NC0tOwogICAgICAgIGVsc2UgaWYgKGg5W2o0XSA9PT0gYTVbazVdKSB2NltrNV0gPSB1NChkNltqNF0sIHA4W2s1XSksIHY0KHMxMCwgZDZbeDRdLCBkNltqNF0pLCBqNC0tLCBrNSsrOwogICAgICAgIGVsc2UgaWYgKHZvaWQgMCA9PT0gbTcgJiYgKG03ID0gdTUoYTUsIGs1LCB3NCksIHk1ID0gdTUoaDksIHg0LCBqNCkpLCBtNy5oYXMoaDlbeDRdKSkgaWYgKG03LmhhcyhoOVtqNF0pKSB7CiAgICAgICAgICBjb25zdCBlMTEgPSB5NS5nZXQoYTVbazVdKSwgdDEwID0gdm9pZCAwICE9PSBlMTEgPyBkNltlMTFdIDogbnVsbDsKICAgICAgICAgIGlmIChudWxsID09PSB0MTApIHsKICAgICAgICAgICAgY29uc3QgZTEyID0gdjQoczEwLCBkNlt4NF0pOwogICAgICAgICAgICB1NChlMTIsIHA4W2s1XSksIHY2W2s1XSA9IGUxMjsKICAgICAgICAgIH0gZWxzZSB2NltrNV0gPSB1NCh0MTAsIHA4W2s1XSksIHY0KHMxMCwgZDZbeDRdLCB0MTApLCBkNltlMTFdID0gbnVsbDsKICAgICAgICAgIGs1Kys7CiAgICAgICAgfSBlbHNlIGg0KGQ2W2o0XSksIGo0LS07CiAgICAgICAgZWxzZSBoNChkNlt4NF0pLCB4NCsrOwogICAgICAgIGZvciAoOyBrNSA8PSB3NDsgKSB7CiAgICAgICAgICBjb25zdCBlMTEgPSB2NChzMTAsIHY2W3c0ICsgMV0pOwogICAgICAgICAgdTQoZTExLCBwOFtrNV0pLCB2NltrNSsrXSA9IGUxMTsKICAgICAgICB9CiAgICAgICAgZm9yICg7IHg0IDw9IGo0OyApIHsKICAgICAgICAgIGNvbnN0IGUxMSA9IGQ2W3g0KytdOwogICAgICAgICAgbnVsbCAhPT0gZTExICYmIGg0KGUxMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnV0ID0gYTUsIHA2KHMxMCwgdjYpLCBFOwogICAgICB9CiAgICB9KTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2xpdEAzLjMuMi9ub2RlX21vZHVsZXMvbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzCnZhciBpbml0X3JlcGVhdDMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9saXRAMy4zLjIvbm9kZV9tb2R1bGVzL2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyIoKSB7CiAgICBpbml0X3JlcGVhdDIoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvZGlyZWN0aXZlcy9pbmRleC5qcwp2YXIgZGlyZWN0aXZlc19leHBvcnRzID0ge307Cl9fZXhwb3J0KGRpcmVjdGl2ZXNfZXhwb3J0cywgewogIGFzeW5jQXBwZW5kOiAoKSA9PiBjOCwKICBrZXllZDogKCkgPT4gaTksCiAgcmVwZWF0OiAoKSA9PiBjOSwKICByZXNvbHZlOiAoKSA9PiByZXNvbHZlLAogIHJlc29sdmVFeGVjOiAoKSA9PiByZXNvbHZlRXhlYywKICBzdWJzY3JpYmU6ICgpID0+IHN1YnNjcmliZSwKICBzdWJzY3JpYmVXaXRoVGVtcGxhdGU6ICgpID0+IHN1YnNjcmliZVdpdGhUZW1wbGF0ZSwKICB1bnRpbDogKCkgPT4gbTUKfSk7CnZhciBpbml0X2RpcmVjdGl2ZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWVsZW1lbnRAMi4yLjMvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudC9kaXN0X3RzL2RpcmVjdGl2ZXMvaW5kZXguanMiKCkgewogICAgaW5pdF9jbGFzc2VzX3Jlc29sdmVkaXJlY3RpdmUoKTsKICAgIGluaXRfY2xhc3Nlc19zdWJzY3JpYmVkaXJlY3RpdmUoKTsKICAgIGluaXRfY2xhc3Nlc19zdWJzY3JpYmV3aXRodGVtcGxhdGUoKTsKICAgIGluaXRfdW50aWwyKCk7CiAgICBpbml0X2FzeW5jX2FwcGVuZDIoKTsKICAgIGluaXRfa2V5ZWQyKCk7CiAgICBpbml0X3JlcGVhdDMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czMwID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czMwLCB7CiAgRGVlc0VsZW1lbnQ6ICgpID0+IERlZXNFbGVtZW50LAogIGNvbnRhaW5lclJlc3BvbnNpdmU6ICgpID0+IGNvbnRhaW5lclJlc3BvbnNpdmUsCiAgY3NzOiAoKSA9PiBpLAogIGNzc01hbmFnZXI6ICgpID0+IGNzc01hbmFnZXIsCiAgY3VzdG9tRWxlbWVudDogKCkgPT4gY3VzdG9tRWxlbWVudCwKICBkaXJlY3RpdmVzOiAoKSA9PiBkaXJlY3RpdmVzX2V4cG9ydHMsCiAgZG9tdG9vbHM6ICgpID0+IGRpc3RfdHNfZXhwb3J0czI5LAogIGh0bWw6ICgpID0+IGIyLAogIHByb3BlcnR5OiAoKSA9PiBuNSwKICBxdWVyeTogKCkgPT4gZTcsCiAgcXVlcnlBbGw6ICgpID0+IHI2LAogIHF1ZXJ5QXN5bmM6ICgpID0+IHI3LAogIHJlbmRlcjogKCkgPT4gRCwKICBzdGF0ZTogKCkgPT4gcjUsCiAgc3RhdGljOiAoKSA9PiB1MywKICB1bnNhZmVDU1M6ICgpID0+IHIsCiAgdW5zYWZlSFRNTDogKCkgPT4gbzgsCiAgdW5zYWZlU3RhdGljOiAoKSA9PiBzNQp9KTsKdmFyIGNzc01hbmFnZXI7CnZhciBpbml0X2Rpc3RfdHMzMCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtZWxlbWVudEAyLjIuMy9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50L2Rpc3RfdHMvaW5kZXguanMiKCkgewogICAgaW5pdF9jbGFzc2VzX2Nzc21hbmFnZXIoKTsKICAgIGluaXRfbGl0KCk7CiAgICBpbml0X3N0YXRpY19odG1sKCk7CiAgICBpbml0X3Vuc2FmZV9odG1sMigpOwogICAgaW5pdF9kZWNvcmF0b3JzX2N1c3RvbWVsZW1lbnQoKTsKICAgIGluaXRfZGVjb3JhdG9ycygpOwogICAgaW5pdF9kaXN0X3RzMjkoKTsKICAgIGluaXRfY2xhc3Nlc19kZWVzX2VsZW1lbnQoKTsKICAgIGluaXRfZGVjb3JhdG9yc19jb250YWluZXJyZXNwb25zaXZlKCk7CiAgICBpbml0X2RpcmVjdGl2ZXMoKTsKICAgIGNzc01hbmFnZXIgPSBDc3NNYW5hZ2VyLmdldFNpbmdsZXRvbigpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwdGhlbWUuanMKdmFyIHRoZW1lRGVmYXVsdHMsIHRoZW1lRGVmYXVsdFN0eWxlczsKdmFyIGluaXRfdGhlbWUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDB0aGVtZS5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMzMCgpOwogICAgdGhlbWVEZWZhdWx0cyA9IHsKICAgICAgY29sb3JzOiB7CiAgICAgICAgbGlnaHQ6IHsKICAgICAgICAgIGJnUHJpbWFyeTogIiNmZmZmZmYiLAogICAgICAgICAgYmdTZWNvbmRhcnk6ICIjZmFmYWZhIiwKICAgICAgICAgIGJnVGVydGlhcnk6ICIjZjRmNGY1IiwKICAgICAgICAgIHRleHRQcmltYXJ5OiAiIzA5MDkwYiIsCiAgICAgICAgICB0ZXh0U2Vjb25kYXJ5OiAiIzM3NDE1MSIsCiAgICAgICAgICB0ZXh0TXV0ZWQ6ICIjNzE3MTdhIiwKICAgICAgICAgIGJvcmRlckRlZmF1bHQ6ICIjZTVlN2ViIiwKICAgICAgICAgIGJvcmRlclN1YnRsZTogIiNmNGY0ZjUiLAogICAgICAgICAgYm9yZGVyU3Ryb25nOiAiI2QxZDVkYiIsCiAgICAgICAgICBhY2NlbnRQcmltYXJ5OiAiIzNiODJmNiIsCiAgICAgICAgICBhY2NlbnRTdWNjZXNzOiAiIzIyYzU1ZSIsCiAgICAgICAgICBhY2NlbnRXYXJuaW5nOiAiI2Y1OWUwYiIsCiAgICAgICAgICBhY2NlbnRFcnJvcjogIiNlZjQ0NDQiCiAgICAgICAgfSwKICAgICAgICBkYXJrOiB7CiAgICAgICAgICBiZ1ByaW1hcnk6ICIjMDkwOTBiIiwKICAgICAgICAgIGJnU2Vjb25kYXJ5OiAiIzBhMGEwYSIsCiAgICAgICAgICBiZ1RlcnRpYXJ5OiAiIzE4MTgxYiIsCiAgICAgICAgICB0ZXh0UHJpbWFyeTogIiNmYWZhZmEiLAogICAgICAgICAgdGV4dFNlY29uZGFyeTogIiNkNGQ0ZDgiLAogICAgICAgICAgdGV4dE11dGVkOiAiI2ExYTFhYSIsCiAgICAgICAgICBib3JkZXJEZWZhdWx0OiAiIzI3MjcyYSIsCiAgICAgICAgICBib3JkZXJTdWJ0bGU6ICIjMWExYTFhIiwKICAgICAgICAgIGJvcmRlclN0cm9uZzogIiMzZjNmNDYiLAogICAgICAgICAgYWNjZW50UHJpbWFyeTogIiMzYjgyZjYiLAogICAgICAgICAgYWNjZW50U3VjY2VzczogIiMyMmM1NWUiLAogICAgICAgICAgYWNjZW50V2FybmluZzogIiNmNTllMGIiLAogICAgICAgICAgYWNjZW50RXJyb3I6ICIjZWY0NDQ0IgogICAgICAgIH0KICAgICAgfSwKICAgICAgc3BhY2luZzogewogICAgICAgIHhzOiAiNHB4IiwKICAgICAgICBzbTogIjhweCIsCiAgICAgICAgbWQ6ICIxMnB4IiwKICAgICAgICBsZzogIjE2cHgiLAogICAgICAgIHhsOiAiMjRweCIsCiAgICAgICAgIjJ4bCI6ICIzMnB4IiwKICAgICAgICAiM3hsIjogIjQ4cHgiCiAgICAgIH0sCiAgICAgIHJhZGl1czogewogICAgICAgIHhzOiAiMnB4IiwKICAgICAgICBzbTogIjRweCIsCiAgICAgICAgbWQ6ICI2cHgiLAogICAgICAgIGxnOiAiOHB4IiwKICAgICAgICB4bDogIjEycHgiLAogICAgICAgIGZ1bGw6ICI5OTlweCIKICAgICAgfSwKICAgICAgc2hhZG93czogewogICAgICAgIHhzOiAiMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gMC4wNSkiLAogICAgICAgIHNtOiAiMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xKSIsCiAgICAgICAgbWQ6ICIwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjE1KSIsCiAgICAgICAgbGc6ICIwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4xNSkiCiAgICAgIH0sCiAgICAgIHRyYW5zaXRpb25zOiB7CiAgICAgICAgZmFzdDogIjAuMXMiLAogICAgICAgIGRlZmF1bHQ6ICIwLjE1cyIsCiAgICAgICAgc2xvdzogIjAuMnMiLAogICAgICAgIHNsb3dlcjogIjAuM3MiCiAgICAgIH0sCiAgICAgIGNvbnRyb2xIZWlnaHRzOiB7CiAgICAgICAgc206ICIzMnB4IiwKICAgICAgICBtZDogIjM2cHgiLAogICAgICAgIGxnOiAiNDBweCIsCiAgICAgICAgeGw6ICI0OHB4IgogICAgICB9CiAgICB9OwogICAgdGhlbWVEZWZhdWx0U3R5bGVzID0gaWAKICA6aG9zdCB7CiAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgKiBTcGFjaW5nIFNjYWxlCiAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAgICAtLWRlZXMtc3BhY2luZy14czogNHB4OwogICAgLS1kZWVzLXNwYWNpbmctc206IDhweDsKICAgIC0tZGVlcy1zcGFjaW5nLW1kOiAxMnB4OwogICAgLS1kZWVzLXNwYWNpbmctbGc6IDE2cHg7CiAgICAtLWRlZXMtc3BhY2luZy14bDogMjRweDsKICAgIC0tZGVlcy1zcGFjaW5nLTJ4bDogMzJweDsKICAgIC0tZGVlcy1zcGFjaW5nLTN4bDogNDhweDsKCiAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgKiBCb3JkZXIgUmFkaXVzIFNjYWxlCiAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAgICAtLWRlZXMtcmFkaXVzLXhzOiAycHg7CiAgICAtLWRlZXMtcmFkaXVzLXNtOiA0cHg7CiAgICAtLWRlZXMtcmFkaXVzLW1kOiA2cHg7CiAgICAtLWRlZXMtcmFkaXVzLWxnOiA4cHg7CiAgICAtLWRlZXMtcmFkaXVzLXhsOiAxMnB4OwogICAgLS1kZWVzLXJhZGl1cy1mdWxsOiA5OTlweDsKCiAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgKiBTaGFkb3cgRWxldmF0aW9uIFNjYWxlCiAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAgICAtLWRlZXMtc2hhZG93LXhzOiAwIDFweCAycHggMCByZ2IoMCAwIDAgLyAwLjA1KTsKICAgIC0tZGVlcy1zaGFkb3ctc206IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSk7CiAgICAtLWRlZXMtc2hhZG93LW1kOiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKICAgIC0tZGVlcy1zaGFkb3ctbGc6IDAgNHB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKCiAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgKiBUcmFuc2l0aW9uIER1cmF0aW9uIFNjYWxlCiAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAgICAtLWRlZXMtdHJhbnNpdGlvbi1mYXN0OiAwLjFzOwogICAgLS1kZWVzLXRyYW5zaXRpb24tZGVmYXVsdDogMC4xNXM7CiAgICAtLWRlZXMtdHJhbnNpdGlvbi1zbG93OiAwLjJzOwogICAgLS1kZWVzLXRyYW5zaXRpb24tc2xvd2VyOiAwLjNzOwoKICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAqIENvbnRyb2wgSGVpZ2h0IFNjYWxlCiAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAgICAtLWRlZXMtY29udHJvbC1oZWlnaHQtc206IDMycHg7CiAgICAtLWRlZXMtY29udHJvbC1oZWlnaHQtbWQ6IDM2cHg7CiAgICAtLWRlZXMtY29udHJvbC1oZWlnaHQtbGc6IDQwcHg7CiAgICAtLWRlZXMtY29udHJvbC1oZWlnaHQteGw6IDQ4cHg7CiAgfQpgOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGZvcnRhd2Vzb21lK2ZvbnRhd2Vzb21lLXN2Zy1jb3JlQDcuMi4wL25vZGVfbW9kdWxlcy9AZm9ydGF3ZXNvbWUvZm9udGF3ZXNvbWUtc3ZnLWNvcmUvaW5kZXgubWpzCmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KHIxMSwgYTUpIHsKICAobnVsbCA9PSBhNSB8fCBhNSA+IHIxMS5sZW5ndGgpICYmIChhNSA9IHIxMS5sZW5ndGgpOwogIGZvciAodmFyIGUxMSA9IDAsIG4xMyA9IEFycmF5KGE1KTsgZTExIDwgYTU7IGUxMSsrKSBuMTNbZTExXSA9IHIxMVtlMTFdOwogIHJldHVybiBuMTM7Cn0KZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKHIxMSkgewogIGlmIChBcnJheS5pc0FycmF5KHIxMSkpIHJldHVybiByMTE7Cn0KZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKHIxMSkgewogIGlmIChBcnJheS5pc0FycmF5KHIxMSkpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShyMTEpOwp9CmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhhNSwgbjEzKSB7CiAgaWYgKCEoYTUgaW5zdGFuY2VvZiBuMTMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsKfQpmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyhlMTEsIHIxMSkgewogIGZvciAodmFyIHQ5ID0gMDsgdDkgPCByMTEubGVuZ3RoOyB0OSsrKSB7CiAgICB2YXIgbzEzID0gcjExW3Q5XTsKICAgIG8xMy5lbnVtZXJhYmxlID0gbzEzLmVudW1lcmFibGUgfHwgZmFsc2UsIG8xMy5jb25maWd1cmFibGUgPSB0cnVlLCAidmFsdWUiIGluIG8xMyAmJiAobzEzLndyaXRhYmxlID0gdHJ1ZSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlMTEsIF90b1Byb3BlcnR5S2V5KG8xMy5rZXkpLCBvMTMpOwogIH0KfQpmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoZTExLCByMTEsIHQ5KSB7CiAgcmV0dXJuIHIxMSAmJiBfZGVmaW5lUHJvcGVydGllcyhlMTEucHJvdG90eXBlLCByMTEpLCB0OSAmJiBfZGVmaW5lUHJvcGVydGllcyhlMTEsIHQ5KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUxMSwgInByb3RvdHlwZSIsIHsKICAgIHdyaXRhYmxlOiBmYWxzZQogIH0pLCBlMTE7Cn0KZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIocjExLCBlMTEpIHsKICB2YXIgdDkgPSAidW5kZWZpbmVkIiAhPSB0eXBlb2YgU3ltYm9sICYmIHIxMVtTeW1ib2wuaXRlcmF0b3JdIHx8IHIxMVsiQEBpdGVyYXRvciJdOwogIGlmICghdDkpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KHIxMSkgfHwgKHQ5ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIxMSkpIHx8IGUxMSAmJiByMTEgJiYgIm51bWJlciIgPT0gdHlwZW9mIHIxMS5sZW5ndGgpIHsKICAgICAgdDkgJiYgKHIxMSA9IHQ5KTsKICAgICAgdmFyIG4xMyA9IDAsIEYyID0gZnVuY3Rpb24oKSB7CiAgICAgIH07CiAgICAgIHJldHVybiB7CiAgICAgICAgczogRjIsCiAgICAgICAgbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gbjEzID49IHIxMS5sZW5ndGggPyB7CiAgICAgICAgICAgIGRvbmU6IHRydWUKICAgICAgICAgIH0gOiB7CiAgICAgICAgICAgIGRvbmU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogcjExW24xMysrXQogICAgICAgICAgfTsKICAgICAgICB9LAogICAgICAgIGU6IGZ1bmN0aW9uKHIxMikgewogICAgICAgICAgdGhyb3cgcjEyOwogICAgICAgIH0sCiAgICAgICAgZjogRjIKICAgICAgfTsKICAgIH0KICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKTsKICB9CiAgdmFyIG8xMywgYTUgPSB0cnVlLCB1NyA9IGZhbHNlOwogIHJldHVybiB7CiAgICBzOiBmdW5jdGlvbigpIHsKICAgICAgdDkgPSB0OS5jYWxsKHIxMSk7CiAgICB9LAogICAgbjogZnVuY3Rpb24oKSB7CiAgICAgIHZhciByMTIgPSB0OS5uZXh0KCk7CiAgICAgIHJldHVybiBhNSA9IHIxMi5kb25lLCByMTI7CiAgICB9LAogICAgZTogZnVuY3Rpb24ocjEyKSB7CiAgICAgIHU3ID0gdHJ1ZSwgbzEzID0gcjEyOwogICAgfSwKICAgIGY6IGZ1bmN0aW9uKCkgewogICAgICB0cnkgewogICAgICAgIGE1IHx8IG51bGwgPT0gdDkucmV0dXJuIHx8IHQ5LnJldHVybigpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGlmICh1NykgdGhyb3cgbzEzOwogICAgICB9CiAgICB9CiAgfTsKfQpmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkoZTExLCByMTEsIHQ5KSB7CiAgcmV0dXJuIChyMTEgPSBfdG9Qcm9wZXJ0eUtleShyMTEpKSBpbiBlMTEgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZTExLCByMTEsIHsKICAgIHZhbHVlOiB0OSwKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICB3cml0YWJsZTogdHJ1ZQogIH0pIDogZTExW3IxMV0gPSB0OSwgZTExOwp9CmZ1bmN0aW9uIF9pbmhlcml0cyh0OSwgZTExKSB7CiAgaWYgKCJmdW5jdGlvbiIgIT0gdHlwZW9mIGUxMSAmJiBudWxsICE9PSBlMTEpIHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7CiAgdDkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlMTEgJiYgZTExLnByb3RvdHlwZSwgewogICAgY29uc3RydWN0b3I6IHsKICAgICAgdmFsdWU6IHQ5LAogICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9CiAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0OSwgInByb3RvdHlwZSIsIHsKICAgIHdyaXRhYmxlOiBmYWxzZQogIH0pLCBlMTEgJiYgX3NldFByb3RvdHlwZU9mKHQ5LCBlMTEpOwp9CmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkocjExKSB7CiAgaWYgKCJ1bmRlZmluZWQiICE9IHR5cGVvZiBTeW1ib2wgJiYgbnVsbCAhPSByMTFbU3ltYm9sLml0ZXJhdG9yXSB8fCBudWxsICE9IHIxMVsiQEBpdGVyYXRvciJdKSByZXR1cm4gQXJyYXkuZnJvbShyMTEpOwp9CmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChyMTEsIGw2KSB7CiAgdmFyIHQ5ID0gbnVsbCA9PSByMTEgPyBudWxsIDogInVuZGVmaW5lZCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByMTFbU3ltYm9sLml0ZXJhdG9yXSB8fCByMTFbIkBAaXRlcmF0b3IiXTsKICBpZiAobnVsbCAhPSB0OSkgewogICAgdmFyIGUxMSwgbjEzLCBpMTEsIHU3LCBhNSA9IFtdLCBmOCA9IHRydWUsIG8xMyA9IGZhbHNlOwogICAgdHJ5IHsKICAgICAgaWYgKGkxMSA9ICh0OSA9IHQ5LmNhbGwocjExKSkubmV4dCwgMCA9PT0gbDYpIHsKICAgICAgICBpZiAoT2JqZWN0KHQ5KSAhPT0gdDkpIHJldHVybjsKICAgICAgICBmOCA9IGZhbHNlOwogICAgICB9IGVsc2UgZm9yICg7ICEoZjggPSAoZTExID0gaTExLmNhbGwodDkpKS5kb25lKSAmJiAoYTUucHVzaChlMTEudmFsdWUpLCBhNS5sZW5ndGggIT09IGw2KTsgZjggPSB0cnVlKSA7CiAgICB9IGNhdGNoIChyMTIpIHsKICAgICAgbzEzID0gdHJ1ZSwgbjEzID0gcjEyOwogICAgfSBmaW5hbGx5IHsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoIWY4ICYmIG51bGwgIT0gdDkucmV0dXJuICYmICh1NyA9IHQ5LnJldHVybigpLCBPYmplY3QodTcpICE9PSB1NykpIHJldHVybjsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBpZiAobzEzKSB0aHJvdyBuMTM7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBhNTsKICB9Cn0KZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsKICB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOwp9CmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsKICB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKTsKfQpmdW5jdGlvbiBvd25LZXlzMihlMTEsIHIxMSkgewogIHZhciB0OSA9IE9iamVjdC5rZXlzKGUxMSk7CiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgIHZhciBvMTMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUxMSk7CiAgICByMTEgJiYgKG8xMyA9IG8xMy5maWx0ZXIoZnVuY3Rpb24ocjEyKSB7CiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUxMSwgcjEyKS5lbnVtZXJhYmxlOwogICAgfSkpLCB0OS5wdXNoLmFwcGx5KHQ5LCBvMTMpOwogIH0KICByZXR1cm4gdDk7Cn0KZnVuY3Rpb24gX29iamVjdFNwcmVhZDIoZTExKSB7CiAgZm9yICh2YXIgcjExID0gMTsgcjExIDwgYXJndW1lbnRzLmxlbmd0aDsgcjExKyspIHsKICAgIHZhciB0OSA9IG51bGwgIT0gYXJndW1lbnRzW3IxMV0gPyBhcmd1bWVudHNbcjExXSA6IHt9OwogICAgcjExICUgMiA/IG93bktleXMyKE9iamVjdCh0OSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24ocjEyKSB7CiAgICAgIF9kZWZpbmVQcm9wZXJ0eShlMTEsIHIxMiwgdDlbcjEyXSk7CiAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZTExLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0OSkpIDogb3duS2V5czIoT2JqZWN0KHQ5KSkuZm9yRWFjaChmdW5jdGlvbihyMTIpIHsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUxMSwgcjEyLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQ5LCByMTIpKTsKICAgIH0pOwogIH0KICByZXR1cm4gZTExOwp9CmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0OSwgZTExKSB7CiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbih0MTAsIGUxMikgewogICAgcmV0dXJuIHQxMC5fX3Byb3RvX18gPSBlMTIsIHQxMDsKICB9LCBfc2V0UHJvdG90eXBlT2YodDksIGUxMSk7Cn0KZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkocjExLCBlMTEpIHsKICByZXR1cm4gX2FycmF5V2l0aEhvbGVzKHIxMSkgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIxMSwgZTExKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkocjExLCBlMTEpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsKfQpmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkocjExKSB7CiAgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhyMTEpIHx8IF9pdGVyYWJsZVRvQXJyYXkocjExKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkocjExKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsKfQpmdW5jdGlvbiBfdG9QcmltaXRpdmUodDksIHIxMSkgewogIGlmICgib2JqZWN0IiAhPSB0eXBlb2YgdDkgfHwgIXQ5KSByZXR1cm4gdDk7CiAgdmFyIGUxMSA9IHQ5W1N5bWJvbC50b1ByaW1pdGl2ZV07CiAgaWYgKHZvaWQgMCAhPT0gZTExKSB7CiAgICB2YXIgaTExID0gZTExLmNhbGwodDksIHIxMSB8fCAiZGVmYXVsdCIpOwogICAgaWYgKCJvYmplY3QiICE9IHR5cGVvZiBpMTEpIHJldHVybiBpMTE7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpOwogIH0KICByZXR1cm4gKCJzdHJpbmciID09PSByMTEgPyBTdHJpbmcgOiBOdW1iZXIpKHQ5KTsKfQpmdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0OSkgewogIHZhciBpMTEgPSBfdG9QcmltaXRpdmUodDksICJzdHJpbmciKTsKICByZXR1cm4gInN5bWJvbCIgPT0gdHlwZW9mIGkxMSA/IGkxMSA6IGkxMSArICIiOwp9CmZ1bmN0aW9uIF90eXBlb2YobzEzKSB7CiAgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsKICByZXR1cm4gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24obzE0KSB7CiAgICByZXR1cm4gdHlwZW9mIG8xNDsKICB9IDogZnVuY3Rpb24obzE0KSB7CiAgICByZXR1cm4gbzE0ICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvMTQuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvMTQgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvMTQ7CiAgfSwgX3R5cGVvZihvMTMpOwp9CmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyMTEsIGE1KSB7CiAgaWYgKHIxMSkgewogICAgaWYgKCJzdHJpbmciID09IHR5cGVvZiByMTEpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShyMTEsIGE1KTsKICAgIHZhciB0OSA9IHt9LnRvU3RyaW5nLmNhbGwocjExKS5zbGljZSg4LCAtMSk7CiAgICByZXR1cm4gIk9iamVjdCIgPT09IHQ5ICYmIHIxMS5jb25zdHJ1Y3RvciAmJiAodDkgPSByMTEuY29uc3RydWN0b3IubmFtZSksICJNYXAiID09PSB0OSB8fCAiU2V0IiA9PT0gdDkgPyBBcnJheS5mcm9tKHIxMSkgOiAiQXJndW1lbnRzIiA9PT0gdDkgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QodDkpID8gX2FycmF5TGlrZVRvQXJyYXkocjExLCBhNSkgOiB2b2lkIDA7CiAgfQp9CmZ1bmN0aW9uIF93cmFwUmVnRXhwKCkgewogIF93cmFwUmVnRXhwID0gZnVuY3Rpb24oZTEyLCByMTIpIHsKICAgIHJldHVybiBuZXcgQmFiZWxSZWdFeHAoZTEyLCB2b2lkIDAsIHIxMik7CiAgfTsKICB2YXIgZTExID0gUmVnRXhwLnByb3RvdHlwZSwgcjExID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CiAgZnVuY3Rpb24gQmFiZWxSZWdFeHAoZTEyLCB0OSwgcDgpIHsKICAgIHZhciBvMTMgPSBSZWdFeHAoZTEyLCB0OSk7CiAgICByZXR1cm4gcjExLnNldChvMTMsIHA4IHx8IHIxMS5nZXQoZTEyKSksIF9zZXRQcm90b3R5cGVPZihvMTMsIEJhYmVsUmVnRXhwLnByb3RvdHlwZSk7CiAgfQogIGZ1bmN0aW9uIGJ1aWxkR3JvdXBzKGUxMiwgdDkpIHsKICAgIHZhciBwOCA9IHIxMS5nZXQodDkpOwogICAgcmV0dXJuIE9iamVjdC5rZXlzKHA4KS5yZWR1Y2UoZnVuY3Rpb24ocjEyLCB0MTApIHsKICAgICAgdmFyIG8xMyA9IHA4W3QxMF07CiAgICAgIGlmICgibnVtYmVyIiA9PSB0eXBlb2YgbzEzKSByMTJbdDEwXSA9IGUxMltvMTNdOwogICAgICBlbHNlIHsKICAgICAgICBmb3IgKHZhciBpMTEgPSAwOyB2b2lkIDAgPT09IGUxMltvMTNbaTExXV0gJiYgaTExICsgMSA8IG8xMy5sZW5ndGg7ICkgaTExKys7CiAgICAgICAgcjEyW3QxMF0gPSBlMTJbbzEzW2kxMV1dOwogICAgICB9CiAgICAgIHJldHVybiByMTI7CiAgICB9LCAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSk7CiAgfQogIHJldHVybiBfaW5oZXJpdHMoQmFiZWxSZWdFeHAsIFJlZ0V4cCksIEJhYmVsUmVnRXhwLnByb3RvdHlwZS5leGVjID0gZnVuY3Rpb24ocjEyKSB7CiAgICB2YXIgdDkgPSBlMTEuZXhlYy5jYWxsKHRoaXMsIHIxMik7CiAgICBpZiAodDkpIHsKICAgICAgdDkuZ3JvdXBzID0gYnVpbGRHcm91cHModDksIHRoaXMpOwogICAgICB2YXIgcDggPSB0OS5pbmRpY2VzOwogICAgICBwOCAmJiAocDguZ3JvdXBzID0gYnVpbGRHcm91cHMocDgsIHRoaXMpKTsKICAgIH0KICAgIHJldHVybiB0OTsKICB9LCBCYWJlbFJlZ0V4cC5wcm90b3R5cGVbU3ltYm9sLnJlcGxhY2VdID0gZnVuY3Rpb24odDksIHA4KSB7CiAgICBpZiAoInN0cmluZyIgPT0gdHlwZW9mIHA4KSB7CiAgICAgIHZhciBvMTMgPSByMTEuZ2V0KHRoaXMpOwogICAgICByZXR1cm4gZTExW1N5bWJvbC5yZXBsYWNlXS5jYWxsKHRoaXMsIHQ5LCBwOC5yZXBsYWNlKC9cJDwoW14+XSspKD58JCkvZywgZnVuY3Rpb24oZTEyLCByMTIsIHQxMCkgewogICAgICAgIGlmICgiIiA9PT0gdDEwKSByZXR1cm4gZTEyOwogICAgICAgIHZhciBwOSA9IG8xM1tyMTJdOwogICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHA5KSA/ICIkIiArIHA5LmpvaW4oIiQiKSA6ICJudW1iZXIiID09IHR5cGVvZiBwOSA/ICIkIiArIHA5IDogIiI7CiAgICAgIH0pKTsKICAgIH0KICAgIGlmICgiZnVuY3Rpb24iID09IHR5cGVvZiBwOCkgewogICAgICB2YXIgaTExID0gdGhpczsKICAgICAgcmV0dXJuIGUxMVtTeW1ib2wucmVwbGFjZV0uY2FsbCh0aGlzLCB0OSwgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGUxMiA9IGFyZ3VtZW50czsKICAgICAgICByZXR1cm4gIm9iamVjdCIgIT0gdHlwZW9mIGUxMltlMTIubGVuZ3RoIC0gMV0gJiYgKGUxMiA9IFtdLnNsaWNlLmNhbGwoZTEyKSkucHVzaChidWlsZEdyb3VwcyhlMTIsIGkxMSkpLCBwOC5hcHBseSh0aGlzLCBlMTIpOwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBlMTFbU3ltYm9sLnJlcGxhY2VdLmNhbGwodGhpcywgdDksIHA4KTsKICB9LCBfd3JhcFJlZ0V4cC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwp9CmZ1bmN0aW9uIGZhbWlseVByb3h5KG9iaikgewogIHJldHVybiBuZXcgUHJveHkob2JqLCB7CiAgICBnZXQ6IGZ1bmN0aW9uIGdldDIodGFyZ2V0LCBwcm9wKSB7CiAgICAgIHJldHVybiBwcm9wIGluIHRhcmdldCA/IHRhcmdldFtwcm9wXSA6IHRhcmdldFtpMTBdOwogICAgfQogIH0pOwp9CmZ1bmN0aW9uIGdldEF0dHJDb25maWcoYXR0cikgewogIHZhciBlbGVtZW50NCA9IERPQ1VNRU5ULnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFsiICsgYXR0ciArICJdIik7CiAgaWYgKGVsZW1lbnQ0KSB7CiAgICByZXR1cm4gZWxlbWVudDQuZ2V0QXR0cmlidXRlKGF0dHIpOwogIH0KfQpmdW5jdGlvbiBjb2VyY2UodmFsKSB7CiAgaWYgKHZhbCA9PT0gIiIpIHJldHVybiB0cnVlOwogIGlmICh2YWwgPT09ICJmYWxzZSIpIHJldHVybiBmYWxzZTsKICBpZiAodmFsID09PSAidHJ1ZSIpIHJldHVybiB0cnVlOwogIHJldHVybiB2YWw7Cn0KZnVuY3Rpb24gb25DaGFuZ2UoY2IpIHsKICBfb25DaGFuZ2VDYi5wdXNoKGNiKTsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICBfb25DaGFuZ2VDYi5zcGxpY2UoX29uQ2hhbmdlQ2IuaW5kZXhPZihjYiksIDEpOwogIH07Cn0KZnVuY3Rpb24gaW5zZXJ0Q3NzKGNzczExKSB7CiAgaWYgKCFjc3MxMSB8fCAhSVNfRE9NKSB7CiAgICByZXR1cm47CiAgfQogIHZhciBzdHlsZSA9IERPQ1VNRU5ULmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgc3R5bGUuc2V0QXR0cmlidXRlKCJ0eXBlIiwgInRleHQvY3NzIik7CiAgc3R5bGUuaW5uZXJIVE1MID0gY3NzMTE7CiAgdmFyIGhlYWRDaGlsZHJlbiA9IERPQ1VNRU5ULmhlYWQuY2hpbGROb2RlczsKICB2YXIgYmVmb3JlQ2hpbGQgPSBudWxsOwogIGZvciAodmFyIGkxMSA9IGhlYWRDaGlsZHJlbi5sZW5ndGggLSAxOyBpMTEgPiAtMTsgaTExLS0pIHsKICAgIHZhciBjaGlsZCA9IGhlYWRDaGlsZHJlbltpMTFdOwogICAgdmFyIHRhZ05hbWUgPSAoY2hpbGQudGFnTmFtZSB8fCAiIikudG9VcHBlckNhc2UoKTsKICAgIGlmIChbIlNUWUxFIiwgIkxJTksiXS5pbmRleE9mKHRhZ05hbWUpID4gLTEpIHsKICAgICAgYmVmb3JlQ2hpbGQgPSBjaGlsZDsKICAgIH0KICB9CiAgRE9DVU1FTlQuaGVhZC5pbnNlcnRCZWZvcmUoc3R5bGUsIGJlZm9yZUNoaWxkKTsKICByZXR1cm4gY3NzMTE7Cn0KZnVuY3Rpb24gbmV4dFVuaXF1ZUlkKCkgewogIHZhciBzaXplID0gMTI7CiAgdmFyIGlkID0gIiI7CiAgd2hpbGUgKHNpemUtLSA+IDApIHsKICAgIGlkICs9IGlkUG9vbFtNYXRoLnJhbmRvbSgpICogNjIgfCAwXTsKICB9CiAgcmV0dXJuIGlkOwp9CmZ1bmN0aW9uIHRvQXJyYXkyKG9iaikgewogIHZhciBhcnJheSA9IFtdOwogIGZvciAodmFyIGkxMSA9IChvYmogfHwgW10pLmxlbmd0aCA+Pj4gMDsgaTExLS07ICkgewogICAgYXJyYXlbaTExXSA9IG9ialtpMTFdOwogIH0KICByZXR1cm4gYXJyYXk7Cn0KZnVuY3Rpb24gY2xhc3NBcnJheShub2RlMikgewogIGlmIChub2RlMi5jbGFzc0xpc3QpIHsKICAgIHJldHVybiB0b0FycmF5Mihub2RlMi5jbGFzc0xpc3QpOwogIH0gZWxzZSB7CiAgICByZXR1cm4gKG5vZGUyLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSB8fCAiIikuc3BsaXQoIiAiKS5maWx0ZXIoZnVuY3Rpb24oaTExKSB7CiAgICAgIHJldHVybiBpMTE7CiAgICB9KTsKICB9Cn0KZnVuY3Rpb24gaHRtbEVzY2FwZShzdHIpIHsKICByZXR1cm4gIiIuY29uY2F0KHN0cikucmVwbGFjZSgvJi9nLCAiJmFtcDsiKS5yZXBsYWNlKC8iL2csICImcXVvdDsiKS5yZXBsYWNlKC8nL2csICImIzM5OyIpLnJlcGxhY2UoLzwvZywgIiZsdDsiKS5yZXBsYWNlKC8+L2csICImZ3Q7Iik7Cn0KZnVuY3Rpb24gam9pbkF0dHJpYnV0ZXMoYXR0cmlidXRlcykgewogIHJldHVybiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzIHx8IHt9KS5yZWR1Y2UoZnVuY3Rpb24oYWNjLCBhdHRyaWJ1dGVOYW1lKSB7CiAgICByZXR1cm4gYWNjICsgIiIuY29uY2F0KGF0dHJpYnV0ZU5hbWUsICc9IicpLmNvbmNhdChodG1sRXNjYXBlKGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0pLCAnIiAnKTsKICB9LCAiIikudHJpbSgpOwp9CmZ1bmN0aW9uIGpvaW5TdHlsZXMoc3R5bGVzMykgewogIHJldHVybiBPYmplY3Qua2V5cyhzdHlsZXMzIHx8IHt9KS5yZWR1Y2UoZnVuY3Rpb24oYWNjLCBzdHlsZU5hbWUpIHsKICAgIHJldHVybiBhY2MgKyAiIi5jb25jYXQoc3R5bGVOYW1lLCAiOiAiKS5jb25jYXQoc3R5bGVzM1tzdHlsZU5hbWVdLnRyaW0oKSwgIjsiKTsKICB9LCAiIik7Cn0KZnVuY3Rpb24gdHJhbnNmb3JtSXNNZWFuaW5nZnVsKHRyYW5zZm9ybTIpIHsKICByZXR1cm4gdHJhbnNmb3JtMi5zaXplICE9PSBtZWFuaW5nbGVzc1RyYW5zZm9ybS5zaXplIHx8IHRyYW5zZm9ybTIueCAhPT0gbWVhbmluZ2xlc3NUcmFuc2Zvcm0ueCB8fCB0cmFuc2Zvcm0yLnkgIT09IG1lYW5pbmdsZXNzVHJhbnNmb3JtLnkgfHwgdHJhbnNmb3JtMi5yb3RhdGUgIT09IG1lYW5pbmdsZXNzVHJhbnNmb3JtLnJvdGF0ZSB8fCB0cmFuc2Zvcm0yLmZsaXBYIHx8IHRyYW5zZm9ybTIuZmxpcFk7Cn0KZnVuY3Rpb24gdHJhbnNmb3JtRm9yU3ZnKF9yZWYyKSB7CiAgdmFyIHRyYW5zZm9ybTIgPSBfcmVmMi50cmFuc2Zvcm0sIGNvbnRhaW5lcldpZHRoID0gX3JlZjIuY29udGFpbmVyV2lkdGgsIGljb25XaWR0aCA9IF9yZWYyLmljb25XaWR0aDsKICB2YXIgb3V0ZXIgPSB7CiAgICB0cmFuc2Zvcm06ICJ0cmFuc2xhdGUoIi5jb25jYXQoY29udGFpbmVyV2lkdGggLyAyLCAiIDI1NikiKQogIH07CiAgdmFyIGlubmVyVHJhbnNsYXRlID0gInRyYW5zbGF0ZSgiLmNvbmNhdCh0cmFuc2Zvcm0yLnggKiAzMiwgIiwgIikuY29uY2F0KHRyYW5zZm9ybTIueSAqIDMyLCAiKSAiKTsKICB2YXIgaW5uZXJTY2FsZSA9ICJzY2FsZSgiLmNvbmNhdCh0cmFuc2Zvcm0yLnNpemUgLyAxNiAqICh0cmFuc2Zvcm0yLmZsaXBYID8gLTEgOiAxKSwgIiwgIikuY29uY2F0KHRyYW5zZm9ybTIuc2l6ZSAvIDE2ICogKHRyYW5zZm9ybTIuZmxpcFkgPyAtMSA6IDEpLCAiKSAiKTsKICB2YXIgaW5uZXJSb3RhdGUgPSAicm90YXRlKCIuY29uY2F0KHRyYW5zZm9ybTIucm90YXRlLCAiIDAgMCkiKTsKICB2YXIgaW5uZXIgPSB7CiAgICB0cmFuc2Zvcm06ICIiLmNvbmNhdChpbm5lclRyYW5zbGF0ZSwgIiAiKS5jb25jYXQoaW5uZXJTY2FsZSwgIiAiKS5jb25jYXQoaW5uZXJSb3RhdGUpCiAgfTsKICB2YXIgcGF0aDIgPSB7CiAgICB0cmFuc2Zvcm06ICJ0cmFuc2xhdGUoIi5jb25jYXQoaWNvbldpZHRoIC8gMiAqIC0xLCAiIC0yNTYpIikKICB9OwogIHJldHVybiB7CiAgICBvdXRlciwKICAgIGlubmVyLAogICAgcGF0aDogcGF0aDIKICB9Owp9CmZ1bmN0aW9uIHRyYW5zZm9ybUZvckNzcyhfcmVmMikgewogIHZhciB0cmFuc2Zvcm0yID0gX3JlZjIudHJhbnNmb3JtLCBfcmVmMiR3aWR0aCA9IF9yZWYyLndpZHRoLCB3aWR0aCA9IF9yZWYyJHdpZHRoID09PSB2b2lkIDAgPyBVTklUU19JTl9HUklEIDogX3JlZjIkd2lkdGgsIF9yZWYyJGhlaWdodCA9IF9yZWYyLmhlaWdodCwgaGVpZ2h0ID0gX3JlZjIkaGVpZ2h0ID09PSB2b2lkIDAgPyBVTklUU19JTl9HUklEIDogX3JlZjIkaGVpZ2h0LCBfcmVmMiRzdGFydENlbnRlcmVkID0gX3JlZjIuc3RhcnRDZW50ZXJlZCwgc3RhcnRDZW50ZXJlZCA9IF9yZWYyJHN0YXJ0Q2VudGVyZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjIkc3RhcnRDZW50ZXJlZDsKICB2YXIgdmFsID0gIiI7CiAgaWYgKHN0YXJ0Q2VudGVyZWQgJiYgSVNfSUUpIHsKICAgIHZhbCArPSAidHJhbnNsYXRlKCIuY29uY2F0KHRyYW5zZm9ybTIueCAvIGQkMiAtIHdpZHRoIC8gMiwgImVtLCAiKS5jb25jYXQodHJhbnNmb3JtMi55IC8gZCQyIC0gaGVpZ2h0IC8gMiwgImVtKSAiKTsKICB9IGVsc2UgaWYgKHN0YXJ0Q2VudGVyZWQpIHsKICAgIHZhbCArPSAidHJhbnNsYXRlKGNhbGMoLTUwJSArICIuY29uY2F0KHRyYW5zZm9ybTIueCAvIGQkMiwgImVtKSwgY2FsYygtNTAlICsgIikuY29uY2F0KHRyYW5zZm9ybTIueSAvIGQkMiwgImVtKSkgIik7CiAgfSBlbHNlIHsKICAgIHZhbCArPSAidHJhbnNsYXRlKCIuY29uY2F0KHRyYW5zZm9ybTIueCAvIGQkMiwgImVtLCAiKS5jb25jYXQodHJhbnNmb3JtMi55IC8gZCQyLCAiZW0pICIpOwogIH0KICB2YWwgKz0gInNjYWxlKCIuY29uY2F0KHRyYW5zZm9ybTIuc2l6ZSAvIGQkMiAqICh0cmFuc2Zvcm0yLmZsaXBYID8gLTEgOiAxKSwgIiwgIikuY29uY2F0KHRyYW5zZm9ybTIuc2l6ZSAvIGQkMiAqICh0cmFuc2Zvcm0yLmZsaXBZID8gLTEgOiAxKSwgIikgIik7CiAgdmFsICs9ICJyb3RhdGUoIi5jb25jYXQodHJhbnNmb3JtMi5yb3RhdGUsICJkZWcpICIpOwogIHJldHVybiB2YWw7Cn0KZnVuY3Rpb24gY3NzKCkgewogIHZhciBkY3AgPSBERUZBVUxUX0NTU19QUkVGSVg7CiAgdmFyIGRyYyA9IERFRkFVTFRfUkVQTEFDRU1FTlRfQ0xBU1M7CiAgdmFyIGZwID0gY29uZmlnMi5jc3NQcmVmaXg7CiAgdmFyIHJjID0gY29uZmlnMi5yZXBsYWNlbWVudENsYXNzOwogIHZhciBzMTAgPSBiYXNlU3R5bGVzOwogIGlmIChmcCAhPT0gZGNwIHx8IHJjICE9PSBkcmMpIHsKICAgIHZhciBkUGF0dCA9IG5ldyBSZWdFeHAoIlxcLiIuY29uY2F0KGRjcCwgIlxcLSIpLCAiZyIpOwogICAgdmFyIGN1c3RvbVByb3BQYXR0ID0gbmV3IFJlZ0V4cCgiXFwtLSIuY29uY2F0KGRjcCwgIlxcLSIpLCAiZyIpOwogICAgdmFyIHJQYXR0ID0gbmV3IFJlZ0V4cCgiXFwuIi5jb25jYXQoZHJjKSwgImciKTsKICAgIHMxMCA9IHMxMC5yZXBsYWNlKGRQYXR0LCAiLiIuY29uY2F0KGZwLCAiLSIpKS5yZXBsYWNlKGN1c3RvbVByb3BQYXR0LCAiLS0iLmNvbmNhdChmcCwgIi0iKSkucmVwbGFjZShyUGF0dCwgIi4iLmNvbmNhdChyYykpOwogIH0KICByZXR1cm4gczEwOwp9CmZ1bmN0aW9uIGVuc3VyZUNzcygpIHsKICBpZiAoY29uZmlnMi5hdXRvQWRkQ3NzICYmICFfY3NzSW5zZXJ0ZWQpIHsKICAgIGluc2VydENzcyhjc3MoKSk7CiAgICBfY3NzSW5zZXJ0ZWQgPSB0cnVlOwogIH0KfQpmdW5jdGlvbiBkb21yZWFkeShmbikgewogIGlmICghSVNfRE9NKSByZXR1cm47CiAgbG9hZGVkID8gc2V0VGltZW91dChmbiwgMCkgOiBmdW5jdGlvbnMucHVzaChmbik7Cn0KZnVuY3Rpb24gdG9IdG1sMihhYnN0cmFjdE5vZGVzKSB7CiAgdmFyIHRhZyA9IGFic3RyYWN0Tm9kZXMudGFnLCBfYWJzdHJhY3ROb2RlcyRhdHRyaWIgPSBhYnN0cmFjdE5vZGVzLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMgPSBfYWJzdHJhY3ROb2RlcyRhdHRyaWIgPT09IHZvaWQgMCA/IHt9IDogX2Fic3RyYWN0Tm9kZXMkYXR0cmliLCBfYWJzdHJhY3ROb2RlcyRjaGlsZHIgPSBhYnN0cmFjdE5vZGVzLmNoaWxkcmVuLCBjaGlsZHJlbjIgPSBfYWJzdHJhY3ROb2RlcyRjaGlsZHIgPT09IHZvaWQgMCA/IFtdIDogX2Fic3RyYWN0Tm9kZXMkY2hpbGRyOwogIGlmICh0eXBlb2YgYWJzdHJhY3ROb2RlcyA9PT0gInN0cmluZyIpIHsKICAgIHJldHVybiBodG1sRXNjYXBlKGFic3RyYWN0Tm9kZXMpOwogIH0gZWxzZSB7CiAgICByZXR1cm4gIjwiLmNvbmNhdCh0YWcsICIgIikuY29uY2F0KGpvaW5BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpLCAiPiIpLmNvbmNhdChjaGlsZHJlbjIubWFwKHRvSHRtbDIpLmpvaW4oIiIpLCAiPC8iKS5jb25jYXQodGFnLCAiPiIpOwogIH0KfQpmdW5jdGlvbiBpY29uRnJvbU1hcHBpbmcobWFwcGluZywgcHJlZml4NCwgaWNvbk5hbWUpIHsKICBpZiAobWFwcGluZyAmJiBtYXBwaW5nW3ByZWZpeDRdICYmIG1hcHBpbmdbcHJlZml4NF1baWNvbk5hbWVdKSB7CiAgICByZXR1cm4gewogICAgICBwcmVmaXg6IHByZWZpeDQsCiAgICAgIGljb25OYW1lLAogICAgICBpY29uOiBtYXBwaW5nW3ByZWZpeDRdW2ljb25OYW1lXQogICAgfTsKICB9Cn0KZnVuY3Rpb24gdG9IZXgodW5pY29kZSkgewogIGlmIChfdG9Db25zdW1hYmxlQXJyYXkodW5pY29kZSkubGVuZ3RoICE9PSAxKSByZXR1cm4gbnVsbDsKICByZXR1cm4gdW5pY29kZS5jb2RlUG9pbnRBdCgwKS50b1N0cmluZygxNik7Cn0KZnVuY3Rpb24gbm9ybWFsaXplSWNvbnMoaWNvbnM1KSB7CiAgcmV0dXJuIE9iamVjdC5rZXlzKGljb25zNSkucmVkdWNlKGZ1bmN0aW9uKGFjYywgaWNvbk5hbWUpIHsKICAgIHZhciBpY29uMyA9IGljb25zNVtpY29uTmFtZV07CiAgICB2YXIgZXhwYW5kZWQgPSAhIWljb24zLmljb247CiAgICBpZiAoZXhwYW5kZWQpIHsKICAgICAgYWNjW2ljb24zLmljb25OYW1lXSA9IGljb24zLmljb247CiAgICB9IGVsc2UgewogICAgICBhY2NbaWNvbk5hbWVdID0gaWNvbjM7CiAgICB9CiAgICByZXR1cm4gYWNjOwogIH0sIHt9KTsKfQpmdW5jdGlvbiBkZWZpbmVJY29ucyhwcmVmaXg0LCBpY29uczUpIHsKICB2YXIgcGFyYW1zMiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdm9pZCAwID8gYXJndW1lbnRzWzJdIDoge307CiAgdmFyIF9wYXJhbXMkc2tpcEhvb2tzID0gcGFyYW1zMi5za2lwSG9va3MsIHNraXBIb29rcyA9IF9wYXJhbXMkc2tpcEhvb2tzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wYXJhbXMkc2tpcEhvb2tzOwogIHZhciBub3JtYWxpemVkID0gbm9ybWFsaXplSWNvbnMoaWNvbnM1KTsKICBpZiAodHlwZW9mIG5hbWVzcGFjZS5ob29rcy5hZGRQYWNrID09PSAiZnVuY3Rpb24iICYmICFza2lwSG9va3MpIHsKICAgIG5hbWVzcGFjZS5ob29rcy5hZGRQYWNrKHByZWZpeDQsIG5vcm1hbGl6ZUljb25zKGljb25zNSkpOwogIH0gZWxzZSB7CiAgICBuYW1lc3BhY2Uuc3R5bGVzW3ByZWZpeDRdID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG5hbWVzcGFjZS5zdHlsZXNbcHJlZml4NF0gfHwge30pLCBub3JtYWxpemVkKTsKICB9CiAgaWYgKHByZWZpeDQgPT09ICJmYXMiKSB7CiAgICBkZWZpbmVJY29ucygiZmEiLCBpY29uczUpOwogIH0KfQpmdW5jdGlvbiBpc1Jlc2VydmVkKG5hbWUpIHsKICByZXR1cm4gflJFU0VSVkVEX0NMQVNTRVMuaW5kZXhPZihuYW1lKTsKfQpmdW5jdGlvbiBnZXRJY29uTmFtZShjc3NQcmVmaXgsIGNscykgewogIHZhciBwYXJ0cyA9IGNscy5zcGxpdCgiLSIpOwogIHZhciBwcmVmaXg0ID0gcGFydHNbMF07CiAgdmFyIGljb25OYW1lID0gcGFydHMuc2xpY2UoMSkuam9pbigiLSIpOwogIGlmIChwcmVmaXg0ID09PSBjc3NQcmVmaXggJiYgaWNvbk5hbWUgIT09ICIiICYmICFpc1Jlc2VydmVkKGljb25OYW1lKSkgewogICAgcmV0dXJuIGljb25OYW1lOwogIH0gZWxzZSB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KZnVuY3Rpb24gYnlVbmljb2RlKHByZWZpeDQsIHVuaWNvZGUpIHsKICByZXR1cm4gKF9ieVVuaWNvZGVbcHJlZml4NF0gfHwge30pW3VuaWNvZGVdOwp9CmZ1bmN0aW9uIGJ5TGlnYXR1cmUocHJlZml4NCwgbGlnYXR1cmUpIHsKICByZXR1cm4gKF9ieUxpZ2F0dXJlW3ByZWZpeDRdIHx8IHt9KVtsaWdhdHVyZV07Cn0KZnVuY3Rpb24gYnlBbGlhcyhwcmVmaXg0LCBhbGlhcykgewogIHJldHVybiAoX2J5QWxpYXNbcHJlZml4NF0gfHwge30pW2FsaWFzXTsKfQpmdW5jdGlvbiBieU9sZE5hbWUobmFtZSkgewogIHJldHVybiBfYnlPbGROYW1lW25hbWVdIHx8IHsKICAgIHByZWZpeDogbnVsbCwKICAgIGljb25OYW1lOiBudWxsCiAgfTsKfQpmdW5jdGlvbiBieU9sZFVuaWNvZGUodW5pY29kZSkgewogIHZhciBvbGRVbmljb2RlID0gX2J5T2xkVW5pY29kZVt1bmljb2RlXTsKICB2YXIgbmV3VW5pY29kZSA9IGJ5VW5pY29kZSgiZmFzIiwgdW5pY29kZSk7CiAgcmV0dXJuIG9sZFVuaWNvZGUgfHwgKG5ld1VuaWNvZGUgPyB7CiAgICBwcmVmaXg6ICJmYXMiLAogICAgaWNvbk5hbWU6IG5ld1VuaWNvZGUKICB9IDogbnVsbCkgfHwgewogICAgcHJlZml4OiBudWxsLAogICAgaWNvbk5hbWU6IG51bGwKICB9Owp9CmZ1bmN0aW9uIGdldERlZmF1bHRVc2FibGVQcmVmaXgoKSB7CiAgcmV0dXJuIF9kZWZhdWx0VXNhYmxlUHJlZml4Owp9CmZ1bmN0aW9uIGdldEZhbWlseUlkKHZhbHVlcykgewogIHZhciBmYW1pbHkgPSBpMTA7CiAgdmFyIGZhbVByb3BzID0gRkFNSUxZX05BTUVTLnJlZHVjZShmdW5jdGlvbihhY2MsIGZhbWlseUlkKSB7CiAgICBhY2NbZmFtaWx5SWRdID0gIiIuY29uY2F0KGNvbmZpZzIuY3NzUHJlZml4LCAiLSIpLmNvbmNhdChmYW1pbHlJZCk7CiAgICByZXR1cm4gYWNjOwogIH0sIHt9KTsKICBkdDIuZm9yRWFjaChmdW5jdGlvbihmYW1pbHlJZCkgewogICAgaWYgKHZhbHVlcy5pbmNsdWRlcyhmYW1Qcm9wc1tmYW1pbHlJZF0pIHx8IHZhbHVlcy5zb21lKGZ1bmN0aW9uKHYkJDEpIHsKICAgICAgcmV0dXJuIFBSRUZJWEVTX0ZPUl9GQU1JTFlbZmFtaWx5SWRdLmluY2x1ZGVzKHYkJDEpOwogICAgfSkpIHsKICAgICAgZmFtaWx5ID0gZmFtaWx5SWQ7CiAgICB9CiAgfSk7CiAgcmV0dXJuIGZhbWlseTsKfQpmdW5jdGlvbiBnZXRDYW5vbmljYWxQcmVmaXgoc3R5bGVPclByZWZpeCkgewogIHZhciBwYXJhbXMyID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB2b2lkIDAgPyBhcmd1bWVudHNbMV0gOiB7fTsKICB2YXIgX3BhcmFtcyRmYW1pbHkgPSBwYXJhbXMyLmZhbWlseSwgZmFtaWx5ID0gX3BhcmFtcyRmYW1pbHkgPT09IHZvaWQgMCA/IGkxMCA6IF9wYXJhbXMkZmFtaWx5OwogIHZhciBzdHlsZSA9IFBSRUZJWF9UT19TVFlMRVtmYW1pbHldW3N0eWxlT3JQcmVmaXhdOwogIGlmIChmYW1pbHkgPT09IHQ4ICYmICFzdHlsZU9yUHJlZml4KSB7CiAgICByZXR1cm4gImZhZCI7CiAgfQogIHZhciBwcmVmaXg0ID0gU1RZTEVfVE9fUFJFRklYW2ZhbWlseV1bc3R5bGVPclByZWZpeF0gfHwgU1RZTEVfVE9fUFJFRklYW2ZhbWlseV1bc3R5bGVdOwogIHZhciBkZWZpbmVkID0gc3R5bGVPclByZWZpeCBpbiBuYW1lc3BhY2Uuc3R5bGVzID8gc3R5bGVPclByZWZpeCA6IG51bGw7CiAgdmFyIHJlc3VsdCA9IHByZWZpeDQgfHwgZGVmaW5lZCB8fCBudWxsOwogIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gbW92ZU5vbkZhQ2xhc3Nlc1RvUmVzdChjbGFzc05hbWVzKSB7CiAgdmFyIHJlc3QgPSBbXTsKICB2YXIgaWNvbk5hbWUgPSBudWxsOwogIGNsYXNzTmFtZXMuZm9yRWFjaChmdW5jdGlvbihjbHMpIHsKICAgIHZhciByZXN1bHQgPSBnZXRJY29uTmFtZShjb25maWcyLmNzc1ByZWZpeCwgY2xzKTsKICAgIGlmIChyZXN1bHQpIHsKICAgICAgaWNvbk5hbWUgPSByZXN1bHQ7CiAgICB9IGVsc2UgaWYgKGNscykgewogICAgICByZXN0LnB1c2goY2xzKTsKICAgIH0KICB9KTsKICByZXR1cm4gewogICAgaWNvbk5hbWUsCiAgICByZXN0CiAgfTsKfQpmdW5jdGlvbiBzb3J0ZWRVbmlxdWVWYWx1ZXMoYXJyKSB7CiAgcmV0dXJuIGFyci5zb3J0KCkuZmlsdGVyKGZ1bmN0aW9uKHZhbHVlMiwgaW5kZXgyLCBhcnIyKSB7CiAgICByZXR1cm4gYXJyMi5pbmRleE9mKHZhbHVlMikgPT09IGluZGV4MjsKICB9KTsKfQpmdW5jdGlvbiBnZXRDYW5vbmljYWxJY29uKHZhbHVlcykgewogIHZhciBwYXJhbXMyID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB2b2lkIDAgPyBhcmd1bWVudHNbMV0gOiB7fTsKICB2YXIgX3BhcmFtcyRza2lwTG9va3VwcyA9IHBhcmFtczIuc2tpcExvb2t1cHMsIHNraXBMb29rdXBzID0gX3BhcmFtcyRza2lwTG9va3VwcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcGFyYW1zJHNraXBMb29rdXBzOwogIHZhciBnaXZlblByZWZpeCA9IG51bGw7CiAgdmFyIGZhU3R5bGVPckZhbWlseUNsYXNzZXMgPSBzb3J0ZWRVbmlxdWVWYWx1ZXModmFsdWVzLmZpbHRlcihmdW5jdGlvbihjbHMpIHsKICAgIHJldHVybiBfZmFDb21iaW5lZENsYXNzZXMuaW5jbHVkZXMoY2xzKTsKICB9KSk7CiAgdmFyIG5vblN0eWxlT3JGYW1pbHlDbGFzc2VzID0gc29ydGVkVW5pcXVlVmFsdWVzKHZhbHVlcy5maWx0ZXIoZnVuY3Rpb24oY2xzKSB7CiAgICByZXR1cm4gIV9mYUNvbWJpbmVkQ2xhc3Nlcy5pbmNsdWRlcyhjbHMpOwogIH0pKTsKICB2YXIgZmFTdHlsZXMgPSBmYVN0eWxlT3JGYW1pbHlDbGFzc2VzLmZpbHRlcihmdW5jdGlvbihjbHMpIHsKICAgIGdpdmVuUHJlZml4ID0gY2xzOwogICAgcmV0dXJuICFaMi5pbmNsdWRlcyhjbHMpOwogIH0pOwogIHZhciBfZmFTdHlsZXMgPSBfc2xpY2VkVG9BcnJheShmYVN0eWxlcywgMSksIF9mYVN0eWxlcyQgPSBfZmFTdHlsZXNbMF0sIHN0eWxlRnJvbVZhbHVlcyA9IF9mYVN0eWxlcyQgPT09IHZvaWQgMCA/IG51bGwgOiBfZmFTdHlsZXMkOwogIHZhciBmYW1pbHkgPSBnZXRGYW1pbHlJZChmYVN0eWxlT3JGYW1pbHlDbGFzc2VzKTsKICB2YXIgY2Fub25pY2FsID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG1vdmVOb25GYUNsYXNzZXNUb1Jlc3Qobm9uU3R5bGVPckZhbWlseUNsYXNzZXMpKSwge30sIHsKICAgIHByZWZpeDogZ2V0Q2Fub25pY2FsUHJlZml4KHN0eWxlRnJvbVZhbHVlcywgewogICAgICBmYW1pbHkKICAgIH0pCiAgfSk7CiAgcmV0dXJuIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBjYW5vbmljYWwpLCBnZXREZWZhdWx0Q2Fub25pY2FsUHJlZml4KHsKICAgIHZhbHVlcywKICAgIGZhbWlseSwKICAgIHN0eWxlczogc3R5bGVzMiwKICAgIGNvbmZpZzogY29uZmlnMiwKICAgIGNhbm9uaWNhbCwKICAgIGdpdmVuUHJlZml4CiAgfSkpLCBhcHBseVNoaW1BbmRBbGlhcyhza2lwTG9va3VwcywgZ2l2ZW5QcmVmaXgsIGNhbm9uaWNhbCkpOwp9CmZ1bmN0aW9uIGFwcGx5U2hpbUFuZEFsaWFzKHNraXBMb29rdXBzLCBnaXZlblByZWZpeCwgY2Fub25pY2FsKSB7CiAgdmFyIHByZWZpeDQgPSBjYW5vbmljYWwucHJlZml4LCBpY29uTmFtZSA9IGNhbm9uaWNhbC5pY29uTmFtZTsKICBpZiAoc2tpcExvb2t1cHMgfHwgIXByZWZpeDQgfHwgIWljb25OYW1lKSB7CiAgICByZXR1cm4gewogICAgICBwcmVmaXg6IHByZWZpeDQsCiAgICAgIGljb25OYW1lCiAgICB9OwogIH0KICB2YXIgc2hpbSA9IGdpdmVuUHJlZml4ID09PSAiZmEiID8gYnlPbGROYW1lKGljb25OYW1lKSA6IHt9OwogIHZhciBhbGlhc0ljb25OYW1lID0gYnlBbGlhcyhwcmVmaXg0LCBpY29uTmFtZSk7CiAgaWNvbk5hbWUgPSBzaGltLmljb25OYW1lIHx8IGFsaWFzSWNvbk5hbWUgfHwgaWNvbk5hbWU7CiAgcHJlZml4NCA9IHNoaW0ucHJlZml4IHx8IHByZWZpeDQ7CiAgaWYgKHByZWZpeDQgPT09ICJmYXIiICYmICFzdHlsZXMyWyJmYXIiXSAmJiBzdHlsZXMyWyJmYXMiXSAmJiAhY29uZmlnMi5hdXRvRmV0Y2hTdmcpIHsKICAgIHByZWZpeDQgPSAiZmFzIjsKICB9CiAgcmV0dXJuIHsKICAgIHByZWZpeDogcHJlZml4NCwKICAgIGljb25OYW1lCiAgfTsKfQpmdW5jdGlvbiBnZXREZWZhdWx0Q2Fub25pY2FsUHJlZml4KHByZWZpeE9wdGlvbnMpIHsKICB2YXIgdmFsdWVzID0gcHJlZml4T3B0aW9ucy52YWx1ZXMsIGZhbWlseSA9IHByZWZpeE9wdGlvbnMuZmFtaWx5LCBjYW5vbmljYWwgPSBwcmVmaXhPcHRpb25zLmNhbm9uaWNhbCwgX3ByZWZpeE9wdGlvbnMkZ2l2ZW5QID0gcHJlZml4T3B0aW9ucy5naXZlblByZWZpeCwgZ2l2ZW5QcmVmaXggPSBfcHJlZml4T3B0aW9ucyRnaXZlblAgPT09IHZvaWQgMCA/ICIiIDogX3ByZWZpeE9wdGlvbnMkZ2l2ZW5QLCBfcHJlZml4T3B0aW9ucyRzdHlsZXMgPSBwcmVmaXhPcHRpb25zLnN0eWxlcywgc3R5bGVzMyA9IF9wcmVmaXhPcHRpb25zJHN0eWxlcyA9PT0gdm9pZCAwID8ge30gOiBfcHJlZml4T3B0aW9ucyRzdHlsZXMsIF9wcmVmaXhPcHRpb25zJGNvbmZpZyA9IHByZWZpeE9wdGlvbnMuY29uZmlnLCBjb25maWckJDEgPSBfcHJlZml4T3B0aW9ucyRjb25maWcgPT09IHZvaWQgMCA/IHt9IDogX3ByZWZpeE9wdGlvbnMkY29uZmlnOwogIHZhciBpc0R1b3RvbmVGYW1pbHkgPSBmYW1pbHkgPT09IHQ4OwogIHZhciB2YWx1ZXNIYXNEdW90b25lID0gdmFsdWVzLmluY2x1ZGVzKCJmYS1kdW90b25lIikgfHwgdmFsdWVzLmluY2x1ZGVzKCJmYWQiKTsKICB2YXIgZGVmYXVsdEZhbWlseUlzRHVvdG9uZSA9IGNvbmZpZyQkMS5mYW1pbHlEZWZhdWx0ID09PSAiZHVvdG9uZSI7CiAgdmFyIGNhbm9uaWNhbFByZWZpeElzRHVvdG9uZSA9IGNhbm9uaWNhbC5wcmVmaXggPT09ICJmYWQiIHx8IGNhbm9uaWNhbC5wcmVmaXggPT09ICJmYS1kdW90b25lIjsKICBpZiAoIWlzRHVvdG9uZUZhbWlseSAmJiAodmFsdWVzSGFzRHVvdG9uZSB8fCBkZWZhdWx0RmFtaWx5SXNEdW90b25lIHx8IGNhbm9uaWNhbFByZWZpeElzRHVvdG9uZSkpIHsKICAgIGNhbm9uaWNhbC5wcmVmaXggPSAiZmFkIjsKICB9CiAgaWYgKHZhbHVlcy5pbmNsdWRlcygiZmEtYnJhbmRzIikgfHwgdmFsdWVzLmluY2x1ZGVzKCJmYWIiKSkgewogICAgY2Fub25pY2FsLnByZWZpeCA9ICJmYWIiOwogIH0KICBpZiAoIWNhbm9uaWNhbC5wcmVmaXggJiYgbmV3Q2Fub25pY2FsRmFtaWxpZXMuaW5jbHVkZXMoZmFtaWx5KSkgewogICAgdmFyIHZhbGlkUHJlZml4ID0gT2JqZWN0LmtleXMoc3R5bGVzMykuZmluZChmdW5jdGlvbihrZXkyKSB7CiAgICAgIHJldHVybiBuZXdDYW5vbmljYWxTdHlsZXMuaW5jbHVkZXMoa2V5Mik7CiAgICB9KTsKICAgIGlmICh2YWxpZFByZWZpeCB8fCBjb25maWckJDEuYXV0b0ZldGNoU3ZnKSB7CiAgICAgIHZhciBkZWZhdWx0UHJlZml4ID0gRXQuZ2V0KGZhbWlseSkuZGVmYXVsdFNob3J0UHJlZml4SWQ7CiAgICAgIGNhbm9uaWNhbC5wcmVmaXggPSBkZWZhdWx0UHJlZml4OwogICAgICBjYW5vbmljYWwuaWNvbk5hbWUgPSBieUFsaWFzKGNhbm9uaWNhbC5wcmVmaXgsIGNhbm9uaWNhbC5pY29uTmFtZSkgfHwgY2Fub25pY2FsLmljb25OYW1lOwogICAgfQogIH0KICBpZiAoY2Fub25pY2FsLnByZWZpeCA9PT0gImZhIiB8fCBnaXZlblByZWZpeCA9PT0gImZhIikgewogICAgY2Fub25pY2FsLnByZWZpeCA9IGdldERlZmF1bHRVc2FibGVQcmVmaXgoKSB8fCAiZmFzIjsKICB9CiAgcmV0dXJuIGNhbm9uaWNhbDsKfQpmdW5jdGlvbiByZWdpc3RlclBsdWdpbnMobmV4dFBsdWdpbnMsIF9yZWYyKSB7CiAgdmFyIG9iaiA9IF9yZWYyLm1peG91dHNUbzsKICBfcGx1Z2lucyA9IG5leHRQbHVnaW5zOwogIF9ob29rcyA9IHt9OwogIE9iamVjdC5rZXlzKHByb3ZpZGVycykuZm9yRWFjaChmdW5jdGlvbihrNSkgewogICAgaWYgKGRlZmF1bHRQcm92aWRlcktleXMuaW5kZXhPZihrNSkgPT09IC0xKSB7CiAgICAgIGRlbGV0ZSBwcm92aWRlcnNbazVdOwogICAgfQogIH0pOwogIF9wbHVnaW5zLmZvckVhY2goZnVuY3Rpb24ocGx1Z2luKSB7CiAgICB2YXIgbWl4b3V0OCA9IHBsdWdpbi5taXhvdXQgPyBwbHVnaW4ubWl4b3V0KCkgOiB7fTsKICAgIE9iamVjdC5rZXlzKG1peG91dDgpLmZvckVhY2goZnVuY3Rpb24odGspIHsKICAgICAgaWYgKHR5cGVvZiBtaXhvdXQ4W3RrXSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIG9ialt0a10gPSBtaXhvdXQ4W3RrXTsKICAgICAgfQogICAgICBpZiAoX3R5cGVvZihtaXhvdXQ4W3RrXSkgPT09ICJvYmplY3QiKSB7CiAgICAgICAgT2JqZWN0LmtleXMobWl4b3V0OFt0a10pLmZvckVhY2goZnVuY3Rpb24oc2spIHsKICAgICAgICAgIGlmICghb2JqW3RrXSkgewogICAgICAgICAgICBvYmpbdGtdID0ge307CiAgICAgICAgICB9CiAgICAgICAgICBvYmpbdGtdW3NrXSA9IG1peG91dDhbdGtdW3NrXTsKICAgICAgICB9KTsKICAgICAgfQogICAgfSk7CiAgICBpZiAocGx1Z2luLmhvb2tzKSB7CiAgICAgIHZhciBob29rczggPSBwbHVnaW4uaG9va3MoKTsKICAgICAgT2JqZWN0LmtleXMoaG9va3M4KS5mb3JFYWNoKGZ1bmN0aW9uKGhvb2spIHsKICAgICAgICBpZiAoIV9ob29rc1tob29rXSkgewogICAgICAgICAgX2hvb2tzW2hvb2tdID0gW107CiAgICAgICAgfQogICAgICAgIF9ob29rc1tob29rXS5wdXNoKGhvb2tzOFtob29rXSk7CiAgICAgIH0pOwogICAgfQogICAgaWYgKHBsdWdpbi5wcm92aWRlcykgewogICAgICBwbHVnaW4ucHJvdmlkZXMocHJvdmlkZXJzKTsKICAgIH0KICB9KTsKICByZXR1cm4gb2JqOwp9CmZ1bmN0aW9uIGNoYWluSG9va3MoaG9vaywgYWNjdW11bGF0b3IpIHsKICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMiA/IF9sZW4gLSAyIDogMCksIF9rZXkgPSAyOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CiAgICBhcmdzW19rZXkgLSAyXSA9IGFyZ3VtZW50c1tfa2V5XTsKICB9CiAgdmFyIGhvb2tGbnMgPSBfaG9va3NbaG9va10gfHwgW107CiAgaG9va0Zucy5mb3JFYWNoKGZ1bmN0aW9uKGhvb2tGbikgewogICAgYWNjdW11bGF0b3IgPSBob29rRm4uYXBwbHkobnVsbCwgW2FjY3VtdWxhdG9yXS5jb25jYXQoYXJncykpOwogIH0pOwogIHJldHVybiBhY2N1bXVsYXRvcjsKfQpmdW5jdGlvbiBjYWxsSG9va3MoaG9vaykgewogIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7CiAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdOwogIH0KICB2YXIgaG9va0ZucyA9IF9ob29rc1tob29rXSB8fCBbXTsKICBob29rRm5zLmZvckVhY2goZnVuY3Rpb24oaG9va0ZuKSB7CiAgICBob29rRm4uYXBwbHkobnVsbCwgYXJncyk7CiAgfSk7CiAgcmV0dXJuIHZvaWQgMDsKfQpmdW5jdGlvbiBjYWxsUHJvdmlkZWQoKSB7CiAgdmFyIGhvb2sgPSBhcmd1bWVudHNbMF07CiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogIHJldHVybiBwcm92aWRlcnNbaG9va10gPyBwcm92aWRlcnNbaG9va10uYXBwbHkobnVsbCwgYXJncykgOiB2b2lkIDA7Cn0KZnVuY3Rpb24gZmluZEljb25EZWZpbml0aW9uKGljb25Mb29rdXApIHsKICBpZiAoaWNvbkxvb2t1cC5wcmVmaXggPT09ICJmYSIpIHsKICAgIGljb25Mb29rdXAucHJlZml4ID0gImZhcyI7CiAgfQogIHZhciBpY29uTmFtZSA9IGljb25Mb29rdXAuaWNvbk5hbWU7CiAgdmFyIHByZWZpeDQgPSBpY29uTG9va3VwLnByZWZpeCB8fCBnZXREZWZhdWx0VXNhYmxlUHJlZml4KCk7CiAgaWYgKCFpY29uTmFtZSkgcmV0dXJuOwogIGljb25OYW1lID0gYnlBbGlhcyhwcmVmaXg0LCBpY29uTmFtZSkgfHwgaWNvbk5hbWU7CiAgcmV0dXJuIGljb25Gcm9tTWFwcGluZyhsaWJyYXJ5LmRlZmluaXRpb25zLCBwcmVmaXg0LCBpY29uTmFtZSkgfHwgaWNvbkZyb21NYXBwaW5nKG5hbWVzcGFjZS5zdHlsZXMsIHByZWZpeDQsIGljb25OYW1lKTsKfQpmdW5jdGlvbiBkb21WYXJpYW50cyh2YWwsIGFic3RyYWN0Q3JlYXRvcikgewogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWwsICJhYnN0cmFjdCIsIHsKICAgIGdldDogYWJzdHJhY3RDcmVhdG9yCiAgfSk7CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZhbCwgImh0bWwiLCB7CiAgICBnZXQ6IGZ1bmN0aW9uIGdldDIoKSB7CiAgICAgIHJldHVybiB2YWwuYWJzdHJhY3QubWFwKGZ1bmN0aW9uKGE1KSB7CiAgICAgICAgcmV0dXJuIHRvSHRtbDIoYTUpOwogICAgICB9KTsKICAgIH0KICB9KTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmFsLCAibm9kZSIsIHsKICAgIGdldDogZnVuY3Rpb24gZ2V0MigpIHsKICAgICAgaWYgKCFJU19ET00pIHJldHVybiB2b2lkIDA7CiAgICAgIHZhciBjb250YWluZXIgPSBET0NVTUVOVC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IHZhbC5odG1sOwogICAgICByZXR1cm4gY29udGFpbmVyLmNoaWxkcmVuOwogICAgfQogIH0pOwogIHJldHVybiB2YWw7Cn0KZnVuY3Rpb24gYXNJY29uKF9yZWYyKSB7CiAgdmFyIGNoaWxkcmVuMiA9IF9yZWYyLmNoaWxkcmVuLCBtYWluID0gX3JlZjIubWFpbiwgbWFzayA9IF9yZWYyLm1hc2ssIGF0dHJpYnV0ZXMgPSBfcmVmMi5hdHRyaWJ1dGVzLCBzdHlsZXMzID0gX3JlZjIuc3R5bGVzLCB0cmFuc2Zvcm0yID0gX3JlZjIudHJhbnNmb3JtOwogIGlmICh0cmFuc2Zvcm1Jc01lYW5pbmdmdWwodHJhbnNmb3JtMikgJiYgbWFpbi5mb3VuZCAmJiAhbWFzay5mb3VuZCkgewogICAgdmFyIHdpZHRoID0gbWFpbi53aWR0aCwgaGVpZ2h0ID0gbWFpbi5oZWlnaHQ7CiAgICB2YXIgb2Zmc2V0ID0gewogICAgICB4OiB3aWR0aCAvIGhlaWdodCAvIDIsCiAgICAgIHk6IDAuNQogICAgfTsKICAgIGF0dHJpYnV0ZXNbInN0eWxlIl0gPSBqb2luU3R5bGVzKF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBzdHlsZXMzKSwge30sIHsKICAgICAgInRyYW5zZm9ybS1vcmlnaW4iOiAiIi5jb25jYXQob2Zmc2V0LnggKyB0cmFuc2Zvcm0yLnggLyAxNiwgImVtICIpLmNvbmNhdChvZmZzZXQueSArIHRyYW5zZm9ybTIueSAvIDE2LCAiZW0iKQogICAgfSkpOwogIH0KICByZXR1cm4gW3sKICAgIHRhZzogInN2ZyIsCiAgICBhdHRyaWJ1dGVzLAogICAgY2hpbGRyZW46IGNoaWxkcmVuMgogIH1dOwp9CmZ1bmN0aW9uIGFzU3ltYm9sKF9yZWYyKSB7CiAgdmFyIHByZWZpeDQgPSBfcmVmMi5wcmVmaXgsIGljb25OYW1lID0gX3JlZjIuaWNvbk5hbWUsIGNoaWxkcmVuMiA9IF9yZWYyLmNoaWxkcmVuLCBhdHRyaWJ1dGVzID0gX3JlZjIuYXR0cmlidXRlcywgc3ltYm9sID0gX3JlZjIuc3ltYm9sOwogIHZhciBpZCA9IHN5bWJvbCA9PT0gdHJ1ZSA/ICIiLmNvbmNhdChwcmVmaXg0LCAiLSIpLmNvbmNhdChjb25maWcyLmNzc1ByZWZpeCwgIi0iKS5jb25jYXQoaWNvbk5hbWUpIDogc3ltYm9sOwogIHJldHVybiBbewogICAgdGFnOiAic3ZnIiwKICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgc3R5bGU6ICJkaXNwbGF5OiBub25lOyIKICAgIH0sCiAgICBjaGlsZHJlbjogW3sKICAgICAgdGFnOiAic3ltYm9sIiwKICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIGF0dHJpYnV0ZXMpLCB7fSwgewogICAgICAgIGlkCiAgICAgIH0pLAogICAgICBjaGlsZHJlbjogY2hpbGRyZW4yCiAgICB9XQogIH1dOwp9CmZ1bmN0aW9uIGlzTGFiZWxlZChhdHRyaWJ1dGVzKSB7CiAgdmFyIGxhYmVscyA9IFsiYXJpYS1sYWJlbCIsICJhcmlhLWxhYmVsbGVkYnkiLCAidGl0bGUiLCAicm9sZSJdOwogIHJldHVybiBsYWJlbHMuc29tZShmdW5jdGlvbihsYWJlbCkgewogICAgcmV0dXJuIGxhYmVsIGluIGF0dHJpYnV0ZXM7CiAgfSk7Cn0KZnVuY3Rpb24gbWFrZUlubGluZVN2Z0Fic3RyYWN0KHBhcmFtczIpIHsKICB2YXIgX3BhcmFtcyRpY29ucyA9IHBhcmFtczIuaWNvbnMsIG1haW4gPSBfcGFyYW1zJGljb25zLm1haW4sIG1hc2sgPSBfcGFyYW1zJGljb25zLm1hc2ssIHByZWZpeDQgPSBwYXJhbXMyLnByZWZpeCwgaWNvbk5hbWUgPSBwYXJhbXMyLmljb25OYW1lLCB0cmFuc2Zvcm0yID0gcGFyYW1zMi50cmFuc2Zvcm0sIHN5bWJvbCA9IHBhcmFtczIuc3ltYm9sLCBtYXNrSWQgPSBwYXJhbXMyLm1hc2tJZCwgZXh0cmEgPSBwYXJhbXMyLmV4dHJhLCBfcGFyYW1zJHdhdGNoYWJsZSA9IHBhcmFtczIud2F0Y2hhYmxlLCB3YXRjaGFibGUgPSBfcGFyYW1zJHdhdGNoYWJsZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcGFyYW1zJHdhdGNoYWJsZTsKICB2YXIgX3JlZjIgPSBtYXNrLmZvdW5kID8gbWFzayA6IG1haW4sIHdpZHRoID0gX3JlZjIud2lkdGgsIGhlaWdodCA9IF9yZWYyLmhlaWdodDsKICB2YXIgYXR0ckNsYXNzID0gW2NvbmZpZzIucmVwbGFjZW1lbnRDbGFzcywgaWNvbk5hbWUgPyAiIi5jb25jYXQoY29uZmlnMi5jc3NQcmVmaXgsICItIikuY29uY2F0KGljb25OYW1lKSA6ICIiXS5maWx0ZXIoZnVuY3Rpb24oYzExKSB7CiAgICByZXR1cm4gZXh0cmEuY2xhc3Nlcy5pbmRleE9mKGMxMSkgPT09IC0xOwogIH0pLmZpbHRlcihmdW5jdGlvbihjMTEpIHsKICAgIHJldHVybiBjMTEgIT09ICIiIHx8ICEhYzExOwogIH0pLmNvbmNhdChleHRyYS5jbGFzc2VzKS5qb2luKCIgIik7CiAgdmFyIGNvbnRlbnQzID0gewogICAgY2hpbGRyZW46IFtdLAogICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIGV4dHJhLmF0dHJpYnV0ZXMpLCB7fSwgewogICAgICAiZGF0YS1wcmVmaXgiOiBwcmVmaXg0LAogICAgICAiZGF0YS1pY29uIjogaWNvbk5hbWUsCiAgICAgICJjbGFzcyI6IGF0dHJDbGFzcywKICAgICAgInJvbGUiOiBleHRyYS5hdHRyaWJ1dGVzLnJvbGUgfHwgImltZyIsCiAgICAgICJ2aWV3Qm94IjogIjAgMCAiLmNvbmNhdCh3aWR0aCwgIiAiKS5jb25jYXQoaGVpZ2h0KQogICAgfSkKICB9OwogIGlmICghaXNMYWJlbGVkKGV4dHJhLmF0dHJpYnV0ZXMpICYmICFleHRyYS5hdHRyaWJ1dGVzWyJhcmlhLWhpZGRlbiJdKSB7CiAgICBjb250ZW50My5hdHRyaWJ1dGVzWyJhcmlhLWhpZGRlbiJdID0gInRydWUiOwogIH0KICBpZiAod2F0Y2hhYmxlKSB7CiAgICBjb250ZW50My5hdHRyaWJ1dGVzW0RBVEFfRkFfSTJTVkddID0gIiI7CiAgfQogIHZhciBhcmdzID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIGNvbnRlbnQzKSwge30sIHsKICAgIHByZWZpeDogcHJlZml4NCwKICAgIGljb25OYW1lLAogICAgbWFpbiwKICAgIG1hc2ssCiAgICBtYXNrSWQsCiAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybTIsCiAgICBzeW1ib2wsCiAgICBzdHlsZXM6IF9vYmplY3RTcHJlYWQyKHt9LCBleHRyYS5zdHlsZXMpCiAgfSk7CiAgdmFyIF9yZWYyMiA9IG1hc2suZm91bmQgJiYgbWFpbi5mb3VuZCA/IGNhbGxQcm92aWRlZCgiZ2VuZXJhdGVBYnN0cmFjdE1hc2siLCBhcmdzKSB8fCB7CiAgICBjaGlsZHJlbjogW10sCiAgICBhdHRyaWJ1dGVzOiB7fQogIH0gOiBjYWxsUHJvdmlkZWQoImdlbmVyYXRlQWJzdHJhY3RJY29uIiwgYXJncykgfHwgewogICAgY2hpbGRyZW46IFtdLAogICAgYXR0cmlidXRlczoge30KICB9LCBjaGlsZHJlbjIgPSBfcmVmMjIuY2hpbGRyZW4sIGF0dHJpYnV0ZXMgPSBfcmVmMjIuYXR0cmlidXRlczsKICBhcmdzLmNoaWxkcmVuID0gY2hpbGRyZW4yOwogIGFyZ3MuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CiAgaWYgKHN5bWJvbCkgewogICAgcmV0dXJuIGFzU3ltYm9sKGFyZ3MpOwogIH0gZWxzZSB7CiAgICByZXR1cm4gYXNJY29uKGFyZ3MpOwogIH0KfQpmdW5jdGlvbiBtYWtlTGF5ZXJzVGV4dEFic3RyYWN0KHBhcmFtczIpIHsKICB2YXIgY29udGVudDMgPSBwYXJhbXMyLmNvbnRlbnQsIHdpZHRoID0gcGFyYW1zMi53aWR0aCwgaGVpZ2h0ID0gcGFyYW1zMi5oZWlnaHQsIHRyYW5zZm9ybTIgPSBwYXJhbXMyLnRyYW5zZm9ybSwgZXh0cmEgPSBwYXJhbXMyLmV4dHJhLCBfcGFyYW1zJHdhdGNoYWJsZTIgPSBwYXJhbXMyLndhdGNoYWJsZSwgd2F0Y2hhYmxlID0gX3BhcmFtcyR3YXRjaGFibGUyID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wYXJhbXMkd2F0Y2hhYmxlMjsKICB2YXIgYXR0cmlidXRlcyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBleHRyYS5hdHRyaWJ1dGVzKSwge30sIHsKICAgIGNsYXNzOiBleHRyYS5jbGFzc2VzLmpvaW4oIiAiKQogIH0pOwogIGlmICh3YXRjaGFibGUpIHsKICAgIGF0dHJpYnV0ZXNbREFUQV9GQV9JMlNWR10gPSAiIjsKICB9CiAgdmFyIHN0eWxlczMgPSBfb2JqZWN0U3ByZWFkMih7fSwgZXh0cmEuc3R5bGVzKTsKICBpZiAodHJhbnNmb3JtSXNNZWFuaW5nZnVsKHRyYW5zZm9ybTIpKSB7CiAgICBzdHlsZXMzWyJ0cmFuc2Zvcm0iXSA9IHRyYW5zZm9ybUZvckNzcyh7CiAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtMiwKICAgICAgc3RhcnRDZW50ZXJlZDogdHJ1ZSwKICAgICAgd2lkdGgsCiAgICAgIGhlaWdodAogICAgfSk7CiAgICBzdHlsZXMzWyItd2Via2l0LXRyYW5zZm9ybSJdID0gc3R5bGVzM1sidHJhbnNmb3JtIl07CiAgfQogIHZhciBzdHlsZVN0cmluZyA9IGpvaW5TdHlsZXMoc3R5bGVzMyk7CiAgaWYgKHN0eWxlU3RyaW5nLmxlbmd0aCA+IDApIHsKICAgIGF0dHJpYnV0ZXNbInN0eWxlIl0gPSBzdHlsZVN0cmluZzsKICB9CiAgdmFyIHZhbCA9IFtdOwogIHZhbC5wdXNoKHsKICAgIHRhZzogInNwYW4iLAogICAgYXR0cmlidXRlcywKICAgIGNoaWxkcmVuOiBbY29udGVudDNdCiAgfSk7CiAgcmV0dXJuIHZhbDsKfQpmdW5jdGlvbiBtYWtlTGF5ZXJzQ291bnRlckFic3RyYWN0KHBhcmFtczIpIHsKICB2YXIgY29udGVudDMgPSBwYXJhbXMyLmNvbnRlbnQsIGV4dHJhID0gcGFyYW1zMi5leHRyYTsKICB2YXIgYXR0cmlidXRlcyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBleHRyYS5hdHRyaWJ1dGVzKSwge30sIHsKICAgIGNsYXNzOiBleHRyYS5jbGFzc2VzLmpvaW4oIiAiKQogIH0pOwogIHZhciBzdHlsZVN0cmluZyA9IGpvaW5TdHlsZXMoZXh0cmEuc3R5bGVzKTsKICBpZiAoc3R5bGVTdHJpbmcubGVuZ3RoID4gMCkgewogICAgYXR0cmlidXRlc1sic3R5bGUiXSA9IHN0eWxlU3RyaW5nOwogIH0KICB2YXIgdmFsID0gW107CiAgdmFsLnB1c2goewogICAgdGFnOiAic3BhbiIsCiAgICBhdHRyaWJ1dGVzLAogICAgY2hpbGRyZW46IFtjb250ZW50M10KICB9KTsKICByZXR1cm4gdmFsOwp9CmZ1bmN0aW9uIGFzRm91bmRJY29uKGljb24zKSB7CiAgdmFyIHdpZHRoID0gaWNvbjNbMF07CiAgdmFyIGhlaWdodCA9IGljb24zWzFdOwogIHZhciBfaWNvbiRzbGljZSA9IGljb24zLnNsaWNlKDQpLCBfaWNvbiRzbGljZTIgPSBfc2xpY2VkVG9BcnJheShfaWNvbiRzbGljZSwgMSksIHZlY3RvckRhdGEgPSBfaWNvbiRzbGljZTJbMF07CiAgdmFyIGVsZW1lbnQ0ID0gbnVsbDsKICBpZiAoQXJyYXkuaXNBcnJheSh2ZWN0b3JEYXRhKSkgewogICAgZWxlbWVudDQgPSB7CiAgICAgIHRhZzogImciLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgY2xhc3M6ICIiLmNvbmNhdChjb25maWcyLmNzc1ByZWZpeCwgIi0iKS5jb25jYXQoRFVPVE9ORV9DTEFTU0VTLkdST1VQKQogICAgICB9LAogICAgICBjaGlsZHJlbjogW3sKICAgICAgICB0YWc6ICJwYXRoIiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBjbGFzczogIiIuY29uY2F0KGNvbmZpZzIuY3NzUHJlZml4LCAiLSIpLmNvbmNhdChEVU9UT05FX0NMQVNTRVMuU0VDT05EQVJZKSwKICAgICAgICAgIGZpbGw6ICJjdXJyZW50Q29sb3IiLAogICAgICAgICAgZDogdmVjdG9yRGF0YVswXQogICAgICAgIH0KICAgICAgfSwgewogICAgICAgIHRhZzogInBhdGgiLAogICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgIGNsYXNzOiAiIi5jb25jYXQoY29uZmlnMi5jc3NQcmVmaXgsICItIikuY29uY2F0KERVT1RPTkVfQ0xBU1NFUy5QUklNQVJZKSwKICAgICAgICAgIGZpbGw6ICJjdXJyZW50Q29sb3IiLAogICAgICAgICAgZDogdmVjdG9yRGF0YVsxXQogICAgICAgIH0KICAgICAgfV0KICAgIH07CiAgfSBlbHNlIHsKICAgIGVsZW1lbnQ0ID0gewogICAgICB0YWc6ICJwYXRoIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGZpbGw6ICJjdXJyZW50Q29sb3IiLAogICAgICAgIGQ6IHZlY3RvckRhdGEKICAgICAgfQogICAgfTsKICB9CiAgcmV0dXJuIHsKICAgIGZvdW5kOiB0cnVlLAogICAgd2lkdGgsCiAgICBoZWlnaHQsCiAgICBpY29uOiBlbGVtZW50NAogIH07Cn0KZnVuY3Rpb24gbWF5YmVOb3RpZnlNaXNzaW5nKGljb25OYW1lLCBwcmVmaXg0KSB7CiAgaWYgKCFQUk9EVUNUSU9OICYmICFjb25maWcyLnNob3dNaXNzaW5nSWNvbnMgJiYgaWNvbk5hbWUpIHsKICAgIGNvbnNvbGUuZXJyb3IoJ0ljb24gd2l0aCBuYW1lICInLmNvbmNhdChpY29uTmFtZSwgJyIgYW5kIHByZWZpeCAiJykuY29uY2F0KHByZWZpeDQsICciIGlzIG1pc3NpbmcuJykpOwogIH0KfQpmdW5jdGlvbiBmaW5kSWNvbihpY29uTmFtZSwgcHJlZml4NCkgewogIHZhciBnaXZlblByZWZpeCA9IHByZWZpeDQ7CiAgaWYgKHByZWZpeDQgPT09ICJmYSIgJiYgY29uZmlnMi5zdHlsZURlZmF1bHQgIT09IG51bGwpIHsKICAgIHByZWZpeDQgPSBnZXREZWZhdWx0VXNhYmxlUHJlZml4KCk7CiAgfQogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlMiwgcmVqZWN0KSB7CiAgICBpZiAoZ2l2ZW5QcmVmaXggPT09ICJmYSIpIHsKICAgICAgdmFyIHNoaW0gPSBieU9sZE5hbWUoaWNvbk5hbWUpIHx8IHt9OwogICAgICBpY29uTmFtZSA9IHNoaW0uaWNvbk5hbWUgfHwgaWNvbk5hbWU7CiAgICAgIHByZWZpeDQgPSBzaGltLnByZWZpeCB8fCBwcmVmaXg0OwogICAgfQogICAgaWYgKGljb25OYW1lICYmIHByZWZpeDQgJiYgc3R5bGVzJDFbcHJlZml4NF0gJiYgc3R5bGVzJDFbcHJlZml4NF1baWNvbk5hbWVdKSB7CiAgICAgIHZhciBpY29uMyA9IHN0eWxlcyQxW3ByZWZpeDRdW2ljb25OYW1lXTsKICAgICAgcmV0dXJuIHJlc29sdmUyKGFzRm91bmRJY29uKGljb24zKSk7CiAgICB9CiAgICBtYXliZU5vdGlmeU1pc3NpbmcoaWNvbk5hbWUsIHByZWZpeDQpOwogICAgcmVzb2x2ZTIoX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG1pc3NpbmdJY29uUmVzb2x1dGlvbk1peGluKSwge30sIHsKICAgICAgaWNvbjogY29uZmlnMi5zaG93TWlzc2luZ0ljb25zICYmIGljb25OYW1lID8gY2FsbFByb3ZpZGVkKCJtaXNzaW5nSWNvbkFic3RyYWN0IikgfHwge30gOiB7fQogICAgfSkpOwogIH0pOwp9CmZ1bmN0aW9uIGlzV2F0Y2hlZChub2RlMikgewogIHZhciBpMnN2ZzIgPSBub2RlMi5nZXRBdHRyaWJ1dGUgPyBub2RlMi5nZXRBdHRyaWJ1dGUoREFUQV9GQV9JMlNWRykgOiBudWxsOwogIHJldHVybiB0eXBlb2YgaTJzdmcyID09PSAic3RyaW5nIjsKfQpmdW5jdGlvbiBoYXNQcmVmaXhBbmRJY29uKG5vZGUyKSB7CiAgdmFyIHByZWZpeDQgPSBub2RlMi5nZXRBdHRyaWJ1dGUgPyBub2RlMi5nZXRBdHRyaWJ1dGUoREFUQV9QUkVGSVgpIDogbnVsbDsKICB2YXIgaWNvbjMgPSBub2RlMi5nZXRBdHRyaWJ1dGUgPyBub2RlMi5nZXRBdHRyaWJ1dGUoREFUQV9JQ09OKSA6IG51bGw7CiAgcmV0dXJuIHByZWZpeDQgJiYgaWNvbjM7Cn0KZnVuY3Rpb24gaGFzQmVlblJlcGxhY2VkKG5vZGUyKSB7CiAgcmV0dXJuIG5vZGUyICYmIG5vZGUyLmNsYXNzTGlzdCAmJiBub2RlMi5jbGFzc0xpc3QuY29udGFpbnMgJiYgbm9kZTIuY2xhc3NMaXN0LmNvbnRhaW5zKGNvbmZpZzIucmVwbGFjZW1lbnRDbGFzcyk7Cn0KZnVuY3Rpb24gZ2V0TXV0YXRvcigpIHsKICBpZiAoY29uZmlnMi5hdXRvUmVwbGFjZVN2ZyA9PT0gdHJ1ZSkgewogICAgcmV0dXJuIG11dGF0b3JzLnJlcGxhY2U7CiAgfQogIHZhciBtdXRhdG9yID0gbXV0YXRvcnNbY29uZmlnMi5hdXRvUmVwbGFjZVN2Z107CiAgcmV0dXJuIG11dGF0b3IgfHwgbXV0YXRvcnMucmVwbGFjZTsKfQpmdW5jdGlvbiBjcmVhdGVFbGVtZW50TlModGFnKSB7CiAgcmV0dXJuIERPQ1VNRU5ULmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCB0YWcpOwp9CmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodGFnKSB7CiAgcmV0dXJuIERPQ1VNRU5ULmNyZWF0ZUVsZW1lbnQodGFnKTsKfQpmdW5jdGlvbiBjb252ZXJ0U1ZHKGFic3RyYWN0T2JqKSB7CiAgdmFyIHBhcmFtczIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1sxXSA6IHt9OwogIHZhciBfcGFyYW1zJGNlRm4gPSBwYXJhbXMyLmNlRm4sIGNlRm4gPSBfcGFyYW1zJGNlRm4gPT09IHZvaWQgMCA/IGFic3RyYWN0T2JqLnRhZyA9PT0gInN2ZyIgPyBjcmVhdGVFbGVtZW50TlMgOiBjcmVhdGVFbGVtZW50IDogX3BhcmFtcyRjZUZuOwogIGlmICh0eXBlb2YgYWJzdHJhY3RPYmogPT09ICJzdHJpbmciKSB7CiAgICByZXR1cm4gRE9DVU1FTlQuY3JlYXRlVGV4dE5vZGUoYWJzdHJhY3RPYmopOwogIH0KICB2YXIgdGFnID0gY2VGbihhYnN0cmFjdE9iai50YWcpOwogIE9iamVjdC5rZXlzKGFic3RyYWN0T2JqLmF0dHJpYnV0ZXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24oa2V5MikgewogICAgdGFnLnNldEF0dHJpYnV0ZShrZXkyLCBhYnN0cmFjdE9iai5hdHRyaWJ1dGVzW2tleTJdKTsKICB9KTsKICB2YXIgY2hpbGRyZW4yID0gYWJzdHJhY3RPYmouY2hpbGRyZW4gfHwgW107CiAgY2hpbGRyZW4yLmZvckVhY2goZnVuY3Rpb24oY2hpbGQpIHsKICAgIHRhZy5hcHBlbmRDaGlsZChjb252ZXJ0U1ZHKGNoaWxkLCB7CiAgICAgIGNlRm4KICAgIH0pKTsKICB9KTsKICByZXR1cm4gdGFnOwp9CmZ1bmN0aW9uIG5vZGVBc0NvbW1lbnQobm9kZTIpIHsKICB2YXIgY29tbWVudDMgPSAiICIuY29uY2F0KG5vZGUyLm91dGVySFRNTCwgIiAiKTsKICBjb21tZW50MyA9ICIiLmNvbmNhdChjb21tZW50MywgIkZvbnQgQXdlc29tZSBmb250YXdlc29tZS5jb20gIik7CiAgcmV0dXJuIGNvbW1lbnQzOwp9CmZ1bmN0aW9uIHBlcmZvcm1PcGVyYXRpb25TeW5jKG9wKSB7CiAgb3AoKTsKfQpmdW5jdGlvbiBwZXJmb3JtKG11dGF0aW9ucywgY2FsbGJhY2spIHsKICB2YXIgY2FsbGJhY2tGdW5jdGlvbiA9IHR5cGVvZiBjYWxsYmFjayA9PT0gImZ1bmN0aW9uIiA/IGNhbGxiYWNrIDogbm9vcCQyOwogIGlmIChtdXRhdGlvbnMubGVuZ3RoID09PSAwKSB7CiAgICBjYWxsYmFja0Z1bmN0aW9uKCk7CiAgfSBlbHNlIHsKICAgIHZhciBmcmFtZSA9IHBlcmZvcm1PcGVyYXRpb25TeW5jOwogICAgaWYgKGNvbmZpZzIubXV0YXRlQXBwcm9hY2ggPT09IE1VVEFUSU9OX0FQUFJPQUNIX0FTWU5DKSB7CiAgICAgIGZyYW1lID0gV0lORE9XLnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBwZXJmb3JtT3BlcmF0aW9uU3luYzsKICAgIH0KICAgIGZyYW1lKGZ1bmN0aW9uKCkgewogICAgICB2YXIgbXV0YXRvciA9IGdldE11dGF0b3IoKTsKICAgICAgdmFyIG1hcmsyID0gcGVyZi5iZWdpbigibXV0YXRlIik7CiAgICAgIG11dGF0aW9ucy5tYXAobXV0YXRvcik7CiAgICAgIG1hcmsyKCk7CiAgICAgIGNhbGxiYWNrRnVuY3Rpb24oKTsKICAgIH0pOwogIH0KfQpmdW5jdGlvbiBkaXNhYmxlT2JzZXJ2YXRpb24oKSB7CiAgZGlzYWJsZWQgPSB0cnVlOwp9CmZ1bmN0aW9uIGVuYWJsZU9ic2VydmF0aW9uKCkgewogIGRpc2FibGVkID0gZmFsc2U7Cn0KZnVuY3Rpb24gb2JzZXJ2ZShvcHRpb25zKSB7CiAgaWYgKCFNVVRBVElPTl9PQlNFUlZFUikgewogICAgcmV0dXJuOwogIH0KICBpZiAoIWNvbmZpZzIub2JzZXJ2ZU11dGF0aW9ucykgewogICAgcmV0dXJuOwogIH0KICB2YXIgX29wdGlvbnMkdHJlZUNhbGxiYWNrID0gb3B0aW9ucy50cmVlQ2FsbGJhY2ssIHRyZWVDYWxsYmFjayA9IF9vcHRpb25zJHRyZWVDYWxsYmFjayA9PT0gdm9pZCAwID8gbm9vcCQyIDogX29wdGlvbnMkdHJlZUNhbGxiYWNrLCBfb3B0aW9ucyRub2RlQ2FsbGJhY2sgPSBvcHRpb25zLm5vZGVDYWxsYmFjaywgbm9kZUNhbGxiYWNrID0gX29wdGlvbnMkbm9kZUNhbGxiYWNrID09PSB2b2lkIDAgPyBub29wJDIgOiBfb3B0aW9ucyRub2RlQ2FsbGJhY2ssIF9vcHRpb25zJHBzZXVkb0VsZW1lbiA9IG9wdGlvbnMucHNldWRvRWxlbWVudHNDYWxsYmFjaywgcHNldWRvRWxlbWVudHNDYWxsYmFjayA9IF9vcHRpb25zJHBzZXVkb0VsZW1lbiA9PT0gdm9pZCAwID8gbm9vcCQyIDogX29wdGlvbnMkcHNldWRvRWxlbWVuLCBfb3B0aW9ucyRvYnNlcnZlTXV0YXQgPSBvcHRpb25zLm9ic2VydmVNdXRhdGlvbnNSb290LCBvYnNlcnZlTXV0YXRpb25zUm9vdCA9IF9vcHRpb25zJG9ic2VydmVNdXRhdCA9PT0gdm9pZCAwID8gRE9DVU1FTlQgOiBfb3B0aW9ucyRvYnNlcnZlTXV0YXQ7CiAgbW8gPSBuZXcgTVVUQVRJT05fT0JTRVJWRVIoZnVuY3Rpb24ob2JqZWN0cykgewogICAgaWYgKGRpc2FibGVkKSByZXR1cm47CiAgICB2YXIgZGVmYXVsdFByZWZpeCA9IGdldERlZmF1bHRVc2FibGVQcmVmaXgoKTsKICAgIHRvQXJyYXkyKG9iamVjdHMpLmZvckVhY2goZnVuY3Rpb24obXV0YXRpb25SZWNvcmQpIHsKICAgICAgaWYgKG11dGF0aW9uUmVjb3JkLnR5cGUgPT09ICJjaGlsZExpc3QiICYmIG11dGF0aW9uUmVjb3JkLmFkZGVkTm9kZXMubGVuZ3RoID4gMCAmJiAhaXNXYXRjaGVkKG11dGF0aW9uUmVjb3JkLmFkZGVkTm9kZXNbMF0pKSB7CiAgICAgICAgaWYgKGNvbmZpZzIuc2VhcmNoUHNldWRvRWxlbWVudHMpIHsKICAgICAgICAgIHBzZXVkb0VsZW1lbnRzQ2FsbGJhY2sobXV0YXRpb25SZWNvcmQudGFyZ2V0KTsKICAgICAgICB9CiAgICAgICAgdHJlZUNhbGxiYWNrKG11dGF0aW9uUmVjb3JkLnRhcmdldCk7CiAgICAgIH0KICAgICAgaWYgKG11dGF0aW9uUmVjb3JkLnR5cGUgPT09ICJhdHRyaWJ1dGVzIiAmJiBtdXRhdGlvblJlY29yZC50YXJnZXQucGFyZW50Tm9kZSAmJiBjb25maWcyLnNlYXJjaFBzZXVkb0VsZW1lbnRzKSB7CiAgICAgICAgcHNldWRvRWxlbWVudHNDYWxsYmFjayhbbXV0YXRpb25SZWNvcmQudGFyZ2V0XSwgdHJ1ZSk7CiAgICAgIH0KICAgICAgaWYgKG11dGF0aW9uUmVjb3JkLnR5cGUgPT09ICJhdHRyaWJ1dGVzIiAmJiBpc1dhdGNoZWQobXV0YXRpb25SZWNvcmQudGFyZ2V0KSAmJiB+QVRUUklCVVRFU19XQVRDSEVEX0ZPUl9NVVRBVElPTi5pbmRleE9mKG11dGF0aW9uUmVjb3JkLmF0dHJpYnV0ZU5hbWUpKSB7CiAgICAgICAgaWYgKG11dGF0aW9uUmVjb3JkLmF0dHJpYnV0ZU5hbWUgPT09ICJjbGFzcyIgJiYgaGFzUHJlZml4QW5kSWNvbihtdXRhdGlvblJlY29yZC50YXJnZXQpKSB7CiAgICAgICAgICB2YXIgX2dldENhbm9uaWNhbEljb24gPSBnZXRDYW5vbmljYWxJY29uKGNsYXNzQXJyYXkobXV0YXRpb25SZWNvcmQudGFyZ2V0KSksIHByZWZpeDQgPSBfZ2V0Q2Fub25pY2FsSWNvbi5wcmVmaXgsIGljb25OYW1lID0gX2dldENhbm9uaWNhbEljb24uaWNvbk5hbWU7CiAgICAgICAgICBtdXRhdGlvblJlY29yZC50YXJnZXQuc2V0QXR0cmlidXRlKERBVEFfUFJFRklYLCBwcmVmaXg0IHx8IGRlZmF1bHRQcmVmaXgpOwogICAgICAgICAgaWYgKGljb25OYW1lKSBtdXRhdGlvblJlY29yZC50YXJnZXQuc2V0QXR0cmlidXRlKERBVEFfSUNPTiwgaWNvbk5hbWUpOwogICAgICAgIH0gZWxzZSBpZiAoaGFzQmVlblJlcGxhY2VkKG11dGF0aW9uUmVjb3JkLnRhcmdldCkpIHsKICAgICAgICAgIG5vZGVDYWxsYmFjayhtdXRhdGlvblJlY29yZC50YXJnZXQpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgfSk7CiAgaWYgKCFJU19ET00pIHJldHVybjsKICBtby5vYnNlcnZlKG9ic2VydmVNdXRhdGlvbnNSb290LCB7CiAgICBjaGlsZExpc3Q6IHRydWUsCiAgICBhdHRyaWJ1dGVzOiB0cnVlLAogICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSwKICAgIHN1YnRyZWU6IHRydWUKICB9KTsKfQpmdW5jdGlvbiBkaXNjb25uZWN0KCkgewogIGlmICghbW8pIHJldHVybjsKICBtby5kaXNjb25uZWN0KCk7Cn0KZnVuY3Rpb24gc3R5bGVQYXJzZXIobm9kZTIpIHsKICB2YXIgc3R5bGUgPSBub2RlMi5nZXRBdHRyaWJ1dGUoInN0eWxlIik7CiAgdmFyIHZhbCA9IFtdOwogIGlmIChzdHlsZSkgewogICAgdmFsID0gc3R5bGUuc3BsaXQoIjsiKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLCBzdHlsZTIpIHsKICAgICAgdmFyIHN0eWxlczMgPSBzdHlsZTIuc3BsaXQoIjoiKTsKICAgICAgdmFyIHByb3AgPSBzdHlsZXMzWzBdOwogICAgICB2YXIgdmFsdWUyID0gc3R5bGVzMy5zbGljZSgxKTsKICAgICAgaWYgKHByb3AgJiYgdmFsdWUyLmxlbmd0aCA+IDApIHsKICAgICAgICBhY2NbcHJvcF0gPSB2YWx1ZTIuam9pbigiOiIpLnRyaW0oKTsKICAgICAgfQogICAgICByZXR1cm4gYWNjOwogICAgfSwge30pOwogIH0KICByZXR1cm4gdmFsOwp9CmZ1bmN0aW9uIGNsYXNzUGFyc2VyKG5vZGUyKSB7CiAgdmFyIGV4aXN0aW5nUHJlZml4ID0gbm9kZTIuZ2V0QXR0cmlidXRlKCJkYXRhLXByZWZpeCIpOwogIHZhciBleGlzdGluZ0ljb25OYW1lID0gbm9kZTIuZ2V0QXR0cmlidXRlKCJkYXRhLWljb24iKTsKICB2YXIgaW5uZXJUZXh0ID0gbm9kZTIuaW5uZXJUZXh0ICE9PSB2b2lkIDAgPyBub2RlMi5pbm5lclRleHQudHJpbSgpIDogIiI7CiAgdmFyIHZhbCA9IGdldENhbm9uaWNhbEljb24oY2xhc3NBcnJheShub2RlMikpOwogIGlmICghdmFsLnByZWZpeCkgewogICAgdmFsLnByZWZpeCA9IGdldERlZmF1bHRVc2FibGVQcmVmaXgoKTsKICB9CiAgaWYgKGV4aXN0aW5nUHJlZml4ICYmIGV4aXN0aW5nSWNvbk5hbWUpIHsKICAgIHZhbC5wcmVmaXggPSBleGlzdGluZ1ByZWZpeDsKICAgIHZhbC5pY29uTmFtZSA9IGV4aXN0aW5nSWNvbk5hbWU7CiAgfQogIGlmICh2YWwuaWNvbk5hbWUgJiYgdmFsLnByZWZpeCkgewogICAgcmV0dXJuIHZhbDsKICB9CiAgaWYgKHZhbC5wcmVmaXggJiYgaW5uZXJUZXh0Lmxlbmd0aCA+IDApIHsKICAgIHZhbC5pY29uTmFtZSA9IGJ5TGlnYXR1cmUodmFsLnByZWZpeCwgbm9kZTIuaW5uZXJUZXh0KSB8fCBieVVuaWNvZGUodmFsLnByZWZpeCwgdG9IZXgobm9kZTIuaW5uZXJUZXh0KSk7CiAgfQogIGlmICghdmFsLmljb25OYW1lICYmIGNvbmZpZzIuYXV0b0ZldGNoU3ZnICYmIG5vZGUyLmZpcnN0Q2hpbGQgJiYgbm9kZTIuZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHsKICAgIHZhbC5pY29uTmFtZSA9IG5vZGUyLmZpcnN0Q2hpbGQuZGF0YTsKICB9CiAgcmV0dXJuIHZhbDsKfQpmdW5jdGlvbiBhdHRyaWJ1dGVzUGFyc2VyKG5vZGUyKSB7CiAgdmFyIGV4dHJhQXR0cmlidXRlcyA9IHRvQXJyYXkyKG5vZGUyLmF0dHJpYnV0ZXMpLnJlZHVjZShmdW5jdGlvbihhY2MsIGF0dHIpIHsKICAgIGlmIChhY2MubmFtZSAhPT0gImNsYXNzIiAmJiBhY2MubmFtZSAhPT0gInN0eWxlIikgewogICAgICBhY2NbYXR0ci5uYW1lXSA9IGF0dHIudmFsdWU7CiAgICB9CiAgICByZXR1cm4gYWNjOwogIH0sIHt9KTsKICByZXR1cm4gZXh0cmFBdHRyaWJ1dGVzOwp9CmZ1bmN0aW9uIGJsYW5rTWV0YSgpIHsKICByZXR1cm4gewogICAgaWNvbk5hbWU6IG51bGwsCiAgICBwcmVmaXg6IG51bGwsCiAgICB0cmFuc2Zvcm06IG1lYW5pbmdsZXNzVHJhbnNmb3JtLAogICAgc3ltYm9sOiBmYWxzZSwKICAgIG1hc2s6IHsKICAgICAgaWNvbk5hbWU6IG51bGwsCiAgICAgIHByZWZpeDogbnVsbCwKICAgICAgcmVzdDogW10KICAgIH0sCiAgICBtYXNrSWQ6IG51bGwsCiAgICBleHRyYTogewogICAgICBjbGFzc2VzOiBbXSwKICAgICAgc3R5bGVzOiB7fSwKICAgICAgYXR0cmlidXRlczoge30KICAgIH0KICB9Owp9CmZ1bmN0aW9uIHBhcnNlTWV0YShub2RlMikgewogIHZhciBwYXJzZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1sxXSA6IHsKICAgIHN0eWxlUGFyc2VyOiB0cnVlCiAgfTsKICB2YXIgX2NsYXNzUGFyc2VyID0gY2xhc3NQYXJzZXIobm9kZTIpLCBpY29uTmFtZSA9IF9jbGFzc1BhcnNlci5pY29uTmFtZSwgcHJlZml4NCA9IF9jbGFzc1BhcnNlci5wcmVmaXgsIGV4dHJhQ2xhc3NlcyA9IF9jbGFzc1BhcnNlci5yZXN0OwogIHZhciBleHRyYUF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzUGFyc2VyKG5vZGUyKTsKICB2YXIgcGx1Z2luTWV0YSA9IGNoYWluSG9va3MoInBhcnNlTm9kZUF0dHJpYnV0ZXMiLCB7fSwgbm9kZTIpOwogIHZhciBleHRyYVN0eWxlcyA9IHBhcnNlci5zdHlsZVBhcnNlciA/IHN0eWxlUGFyc2VyKG5vZGUyKSA6IFtdOwogIHJldHVybiBfb2JqZWN0U3ByZWFkMih7CiAgICBpY29uTmFtZSwKICAgIHByZWZpeDogcHJlZml4NCwKICAgIHRyYW5zZm9ybTogbWVhbmluZ2xlc3NUcmFuc2Zvcm0sCiAgICBtYXNrOiB7CiAgICAgIGljb25OYW1lOiBudWxsLAogICAgICBwcmVmaXg6IG51bGwsCiAgICAgIHJlc3Q6IFtdCiAgICB9LAogICAgbWFza0lkOiBudWxsLAogICAgc3ltYm9sOiBmYWxzZSwKICAgIGV4dHJhOiB7CiAgICAgIGNsYXNzZXM6IGV4dHJhQ2xhc3NlcywKICAgICAgc3R5bGVzOiBleHRyYVN0eWxlcywKICAgICAgYXR0cmlidXRlczogZXh0cmFBdHRyaWJ1dGVzCiAgICB9CiAgfSwgcGx1Z2luTWV0YSk7Cn0KZnVuY3Rpb24gZ2VuZXJhdGVNdXRhdGlvbihub2RlMikgewogIHZhciBub2RlTWV0YSA9IGNvbmZpZzIuYXV0b1JlcGxhY2VTdmcgPT09ICJuZXN0IiA/IHBhcnNlTWV0YShub2RlMiwgewogICAgc3R5bGVQYXJzZXI6IGZhbHNlCiAgfSkgOiBwYXJzZU1ldGEobm9kZTIpOwogIGlmICh+bm9kZU1ldGEuZXh0cmEuY2xhc3Nlcy5pbmRleE9mKExBWUVSU19URVhUX0NMQVNTTkFNRSkpIHsKICAgIHJldHVybiBjYWxsUHJvdmlkZWQoImdlbmVyYXRlTGF5ZXJzVGV4dCIsIG5vZGUyLCBub2RlTWV0YSk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBjYWxsUHJvdmlkZWQoImdlbmVyYXRlU3ZnUmVwbGFjZW1lbnRNdXRhdGlvbiIsIG5vZGUyLCBub2RlTWV0YSk7CiAgfQp9CmZ1bmN0aW9uIGdldEtub3duUHJlZml4ZXMoKSB7CiAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoSHQpLCBfdG9Db25zdW1hYmxlQXJyYXkobG8pKTsKfQpmdW5jdGlvbiBvblRyZWUocm9vdDYpIHsKICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7CiAgaWYgKCFJU19ET00pIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICB2YXIgaHRtbENsYXNzTGlzdCA9IERPQ1VNRU5ULmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3Q7CiAgdmFyIGhjbEFkZCA9IGZ1bmN0aW9uIGhjbEFkZDIoc3VmZml4KSB7CiAgICByZXR1cm4gaHRtbENsYXNzTGlzdC5hZGQoIiIuY29uY2F0KEhUTUxfQ0xBU1NfSTJTVkdfQkFTRV9DTEFTUywgIi0iKS5jb25jYXQoc3VmZml4KSk7CiAgfTsKICB2YXIgaGNsUmVtb3ZlID0gZnVuY3Rpb24gaGNsUmVtb3ZlMihzdWZmaXgpIHsKICAgIHJldHVybiBodG1sQ2xhc3NMaXN0LnJlbW92ZSgiIi5jb25jYXQoSFRNTF9DTEFTU19JMlNWR19CQVNFX0NMQVNTLCAiLSIpLmNvbmNhdChzdWZmaXgpKTsKICB9OwogIHZhciBwcmVmaXhlcyA9IGNvbmZpZzIuYXV0b0ZldGNoU3ZnID8gZ2V0S25vd25QcmVmaXhlcygpIDogWjIuY29uY2F0KE9iamVjdC5rZXlzKHN0eWxlcyQyKSk7CiAgaWYgKCFwcmVmaXhlcy5pbmNsdWRlcygiZmEiKSkgewogICAgcHJlZml4ZXMucHVzaCgiZmEiKTsKICB9CiAgdmFyIHByZWZpeGVzRG9tUXVlcnkgPSBbIi4iLmNvbmNhdChMQVlFUlNfVEVYVF9DTEFTU05BTUUsICI6bm90KFsiKS5jb25jYXQoREFUQV9GQV9JMlNWRywgIl0pIildLmNvbmNhdChwcmVmaXhlcy5tYXAoZnVuY3Rpb24ocCQkMSkgewogICAgcmV0dXJuICIuIi5jb25jYXQocCQkMSwgIjpub3QoWyIpLmNvbmNhdChEQVRBX0ZBX0kyU1ZHLCAiXSkiKTsKICB9KSkuam9pbigiLCAiKTsKICBpZiAocHJlZml4ZXNEb21RdWVyeS5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICB9CiAgdmFyIGNhbmRpZGF0ZXMgPSBbXTsKICB0cnkgewogICAgY2FuZGlkYXRlcyA9IHRvQXJyYXkyKHJvb3Q2LnF1ZXJ5U2VsZWN0b3JBbGwocHJlZml4ZXNEb21RdWVyeSkpOwogIH0gY2F0Y2ggKGUkJDEpIHsKICB9CiAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID4gMCkgewogICAgaGNsQWRkKCJwZW5kaW5nIik7CiAgICBoY2xSZW1vdmUoImNvbXBsZXRlIik7CiAgfSBlbHNlIHsKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICB9CiAgdmFyIG1hcmsyID0gcGVyZi5iZWdpbigib25UcmVlIik7CiAgdmFyIG11dGF0aW9ucyA9IGNhbmRpZGF0ZXMucmVkdWNlKGZ1bmN0aW9uKGFjYywgbm9kZTIpIHsKICAgIHRyeSB7CiAgICAgIHZhciBtdXRhdGlvbiA9IGdlbmVyYXRlTXV0YXRpb24obm9kZTIpOwogICAgICBpZiAobXV0YXRpb24pIHsKICAgICAgICBhY2MucHVzaChtdXRhdGlvbik7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUkJDEpIHsKICAgICAgaWYgKCFQUk9EVUNUSU9OKSB7CiAgICAgICAgaWYgKGUkJDEubmFtZSA9PT0gIk1pc3NpbmdJY29uIikgewogICAgICAgICAgY29uc29sZS5lcnJvcihlJCQxKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBhY2M7CiAgfSwgW10pOwogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlMiwgcmVqZWN0KSB7CiAgICBQcm9taXNlLmFsbChtdXRhdGlvbnMpLnRoZW4oZnVuY3Rpb24ocmVzb2x2ZWRNdXRhdGlvbnMpIHsKICAgICAgcGVyZm9ybShyZXNvbHZlZE11dGF0aW9ucywgZnVuY3Rpb24oKSB7CiAgICAgICAgaGNsQWRkKCJhY3RpdmUiKTsKICAgICAgICBoY2xBZGQoImNvbXBsZXRlIik7CiAgICAgICAgaGNsUmVtb3ZlKCJwZW5kaW5nIik7CiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gImZ1bmN0aW9uIikgY2FsbGJhY2soKTsKICAgICAgICBtYXJrMigpOwogICAgICAgIHJlc29sdmUyKCk7CiAgICAgIH0pOwogICAgfSkuY2F0Y2goZnVuY3Rpb24oZSQkMSkgewogICAgICBtYXJrMigpOwogICAgICByZWplY3QoZSQkMSk7CiAgICB9KTsKICB9KTsKfQpmdW5jdGlvbiBvbk5vZGUobm9kZTIpIHsKICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7CiAgZ2VuZXJhdGVNdXRhdGlvbihub2RlMikudGhlbihmdW5jdGlvbihtdXRhdGlvbikgewogICAgaWYgKG11dGF0aW9uKSB7CiAgICAgIHBlcmZvcm0oW211dGF0aW9uXSwgY2FsbGJhY2spOwogICAgfQogIH0pOwp9CmZ1bmN0aW9uIHJlc29sdmVJY29ucyhuZXh0MikgewogIHJldHVybiBmdW5jdGlvbihtYXliZUljb25EZWZpbml0aW9uKSB7CiAgICB2YXIgcGFyYW1zMiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdm9pZCAwID8gYXJndW1lbnRzWzFdIDoge307CiAgICB2YXIgaWNvbkRlZmluaXRpb24gPSAobWF5YmVJY29uRGVmaW5pdGlvbiB8fCB7fSkuaWNvbiA/IG1heWJlSWNvbkRlZmluaXRpb24gOiBmaW5kSWNvbkRlZmluaXRpb24obWF5YmVJY29uRGVmaW5pdGlvbiB8fCB7fSk7CiAgICB2YXIgbWFzayA9IHBhcmFtczIubWFzazsKICAgIGlmIChtYXNrKSB7CiAgICAgIG1hc2sgPSAobWFzayB8fCB7fSkuaWNvbiA/IG1hc2sgOiBmaW5kSWNvbkRlZmluaXRpb24obWFzayB8fCB7fSk7CiAgICB9CiAgICByZXR1cm4gbmV4dDIoaWNvbkRlZmluaXRpb24sIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBwYXJhbXMyKSwge30sIHsKICAgICAgbWFzawogICAgfSkpOwogIH07Cn0KZnVuY3Rpb24gaGV4VmFsdWVGcm9tQ29udGVudChjb250ZW50MykgewogIHZhciBjbGVhbmVkID0gY29udGVudDMucmVwbGFjZShDTEVBTl9DT05URU5UX1BBVFRFUk4sICIiKTsKICByZXR1cm4gdG9IZXgoX3RvQ29uc3VtYWJsZUFycmF5KGNsZWFuZWQpWzBdIHx8ICIiKTsKfQpmdW5jdGlvbiBpc1NlY29uZGFyeUxheWVyKHN0eWxlczMpIHsKICB2YXIgaGFzU3R5bGlzdGljU2V0ID0gc3R5bGVzMy5nZXRQcm9wZXJ0eVZhbHVlKCJmb250LWZlYXR1cmUtc2V0dGluZ3MiKS5pbmNsdWRlcygic3MwMSIpOwogIHZhciBjb250ZW50MyA9IHN0eWxlczMuZ2V0UHJvcGVydHlWYWx1ZSgiY29udGVudCIpOwogIHZhciBjbGVhbmVkID0gY29udGVudDMucmVwbGFjZShDTEVBTl9DT05URU5UX1BBVFRFUk4sICIiKTsKICB2YXIgY29kZVBvaW50ID0gY2xlYW5lZC5jb2RlUG9pbnRBdCgwKTsKICB2YXIgaXNQcmVwZW5kVGVuID0gY29kZVBvaW50ID49IFNFQ09OREFSWV9VTklDT0RFX1JBTkdFWzBdICYmIGNvZGVQb2ludCA8PSBTRUNPTkRBUllfVU5JQ09ERV9SQU5HRVsxXTsKICB2YXIgaXNEb3VibGVkID0gY2xlYW5lZC5sZW5ndGggPT09IDIgPyBjbGVhbmVkWzBdID09PSBjbGVhbmVkWzFdIDogZmFsc2U7CiAgcmV0dXJuIGlzUHJlcGVuZFRlbiB8fCBpc0RvdWJsZWQgfHwgaGFzU3R5bGlzdGljU2V0Owp9CmZ1bmN0aW9uIGdldFByZWZpeChmb250RmFtaWx5LCBmb250V2VpZ2h0KSB7CiAgdmFyIGZvbnRGYW1pbHlTYW5pdGl6ZWQgPSBmb250RmFtaWx5LnJlcGxhY2UoL15bJyJdfFsnIl0kL2csICIiKS50b0xvd2VyQ2FzZSgpOwogIHZhciBmb250V2VpZ2h0SW50ZWdlciA9IHBhcnNlSW50KGZvbnRXZWlnaHQpOwogIHZhciBmb250V2VpZ2h0U2FuaXRpemVkID0gaXNOYU4oZm9udFdlaWdodEludGVnZXIpID8gIm5vcm1hbCIgOiBmb250V2VpZ2h0SW50ZWdlcjsKICByZXR1cm4gKEZPTlRfRkFNSUxZX1dFSUdIVF9UT19QUkVGSVhbZm9udEZhbWlseVNhbml0aXplZF0gfHwge30pW2ZvbnRXZWlnaHRTYW5pdGl6ZWRdIHx8IEZPTlRfRkFNSUxZX1dFSUdIVF9GQUxMQkFDS1tmb250RmFtaWx5U2FuaXRpemVkXTsKfQpmdW5jdGlvbiByZXBsYWNlRm9yUG9zaXRpb24obm9kZTIsIHBvc2l0aW9uMykgewogIHZhciBwZW5kaW5nQXR0cmlidXRlID0gIiIuY29uY2F0KERBVEFfRkFfUFNFVURPX0VMRU1FTlRfUEVORElORykuY29uY2F0KHBvc2l0aW9uMy5yZXBsYWNlKCI6IiwgIi0iKSk7CiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUyLCByZWplY3QpIHsKICAgIGlmIChub2RlMi5nZXRBdHRyaWJ1dGUocGVuZGluZ0F0dHJpYnV0ZSkgIT09IG51bGwpIHsKICAgICAgcmV0dXJuIHJlc29sdmUyKCk7CiAgICB9CiAgICB2YXIgY2hpbGRyZW4yID0gdG9BcnJheTIobm9kZTIuY2hpbGRyZW4pOwogICAgdmFyIGFscmVhZHlQcm9jZXNzZWRQc2V1ZG9FbGVtZW50ID0gY2hpbGRyZW4yLmZpbHRlcihmdW5jdGlvbihjJCQxKSB7CiAgICAgIHJldHVybiBjJCQxLmdldEF0dHJpYnV0ZShEQVRBX0ZBX1BTRVVET19FTEVNRU5UKSA9PT0gcG9zaXRpb24zOwogICAgfSlbMF07CiAgICB2YXIgc3R5bGVzMyA9IFdJTkRPVy5nZXRDb21wdXRlZFN0eWxlKG5vZGUyLCBwb3NpdGlvbjMpOwogICAgdmFyIGZvbnRGYW1pbHkgPSBzdHlsZXMzLmdldFByb3BlcnR5VmFsdWUoImZvbnQtZmFtaWx5Iik7CiAgICB2YXIgZm9udEZhbWlseU1hdGNoID0gZm9udEZhbWlseS5tYXRjaChGT05UX0ZBTUlMWV9QQVRURVJOKTsKICAgIHZhciBmb250V2VpZ2h0ID0gc3R5bGVzMy5nZXRQcm9wZXJ0eVZhbHVlKCJmb250LXdlaWdodCIpOwogICAgdmFyIGNvbnRlbnQzID0gc3R5bGVzMy5nZXRQcm9wZXJ0eVZhbHVlKCJjb250ZW50Iik7CiAgICBpZiAoYWxyZWFkeVByb2Nlc3NlZFBzZXVkb0VsZW1lbnQgJiYgIWZvbnRGYW1pbHlNYXRjaCkgewogICAgICBub2RlMi5yZW1vdmVDaGlsZChhbHJlYWR5UHJvY2Vzc2VkUHNldWRvRWxlbWVudCk7CiAgICAgIHJldHVybiByZXNvbHZlMigpOwogICAgfSBlbHNlIGlmIChmb250RmFtaWx5TWF0Y2ggJiYgY29udGVudDMgIT09ICJub25lIiAmJiBjb250ZW50MyAhPT0gIiIpIHsKICAgICAgdmFyIF9jb250ZW50ID0gc3R5bGVzMy5nZXRQcm9wZXJ0eVZhbHVlKCJjb250ZW50Iik7CiAgICAgIHZhciBwcmVmaXg0ID0gZ2V0UHJlZml4KGZvbnRGYW1pbHksIGZvbnRXZWlnaHQpOwogICAgICB2YXIgaGV4VmFsdWUgPSBoZXhWYWx1ZUZyb21Db250ZW50KF9jb250ZW50KTsKICAgICAgdmFyIGlzVjQgPSBmb250RmFtaWx5TWF0Y2hbMF0uc3RhcnRzV2l0aCgiRm9udEF3ZXNvbWUiKTsKICAgICAgdmFyIGlzU2Vjb25kYXJ5ID0gaXNTZWNvbmRhcnlMYXllcihzdHlsZXMzKTsKICAgICAgdmFyIGljb25OYW1lID0gYnlVbmljb2RlKHByZWZpeDQsIGhleFZhbHVlKTsKICAgICAgdmFyIGljb25JZGVudGlmaWVyID0gaWNvbk5hbWU7CiAgICAgIGlmIChpc1Y0KSB7CiAgICAgICAgdmFyIGljb25OYW1lNCA9IGJ5T2xkVW5pY29kZShoZXhWYWx1ZSk7CiAgICAgICAgaWYgKGljb25OYW1lNC5pY29uTmFtZSAmJiBpY29uTmFtZTQucHJlZml4KSB7CiAgICAgICAgICBpY29uTmFtZSA9IGljb25OYW1lNC5pY29uTmFtZTsKICAgICAgICAgIHByZWZpeDQgPSBpY29uTmFtZTQucHJlZml4OwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaWNvbk5hbWUgJiYgIWlzU2Vjb25kYXJ5ICYmICghYWxyZWFkeVByb2Nlc3NlZFBzZXVkb0VsZW1lbnQgfHwgYWxyZWFkeVByb2Nlc3NlZFBzZXVkb0VsZW1lbnQuZ2V0QXR0cmlidXRlKERBVEFfUFJFRklYKSAhPT0gcHJlZml4NCB8fCBhbHJlYWR5UHJvY2Vzc2VkUHNldWRvRWxlbWVudC5nZXRBdHRyaWJ1dGUoREFUQV9JQ09OKSAhPT0gaWNvbklkZW50aWZpZXIpKSB7CiAgICAgICAgbm9kZTIuc2V0QXR0cmlidXRlKHBlbmRpbmdBdHRyaWJ1dGUsIGljb25JZGVudGlmaWVyKTsKICAgICAgICBpZiAoYWxyZWFkeVByb2Nlc3NlZFBzZXVkb0VsZW1lbnQpIHsKICAgICAgICAgIG5vZGUyLnJlbW92ZUNoaWxkKGFscmVhZHlQcm9jZXNzZWRQc2V1ZG9FbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgdmFyIG1ldGEgPSBibGFua01ldGEoKTsKICAgICAgICB2YXIgZXh0cmEgPSBtZXRhLmV4dHJhOwogICAgICAgIGV4dHJhLmF0dHJpYnV0ZXNbREFUQV9GQV9QU0VVRE9fRUxFTUVOVF0gPSBwb3NpdGlvbjM7CiAgICAgICAgZmluZEljb24oaWNvbk5hbWUsIHByZWZpeDQpLnRoZW4oZnVuY3Rpb24obWFpbikgewogICAgICAgICAgdmFyIGFic3RyYWN0ID0gbWFrZUlubGluZVN2Z0Fic3RyYWN0KF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBtZXRhKSwge30sIHsKICAgICAgICAgICAgaWNvbnM6IHsKICAgICAgICAgICAgICBtYWluLAogICAgICAgICAgICAgIG1hc2s6IGVtcHR5Q2Fub25pY2FsSWNvbigpCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHByZWZpeDogcHJlZml4NCwKICAgICAgICAgICAgaWNvbk5hbWU6IGljb25JZGVudGlmaWVyLAogICAgICAgICAgICBleHRyYSwKICAgICAgICAgICAgd2F0Y2hhYmxlOiB0cnVlCiAgICAgICAgICB9KSk7CiAgICAgICAgICB2YXIgZWxlbWVudDQgPSBET0NVTUVOVC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwgInN2ZyIpOwogICAgICAgICAgaWYgKHBvc2l0aW9uMyA9PT0gIjo6YmVmb3JlIikgewogICAgICAgICAgICBub2RlMi5pbnNlcnRCZWZvcmUoZWxlbWVudDQsIG5vZGUyLmZpcnN0Q2hpbGQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbm9kZTIuYXBwZW5kQ2hpbGQoZWxlbWVudDQpOwogICAgICAgICAgfQogICAgICAgICAgZWxlbWVudDQub3V0ZXJIVE1MID0gYWJzdHJhY3QubWFwKGZ1bmN0aW9uKGEkJDEpIHsKICAgICAgICAgICAgcmV0dXJuIHRvSHRtbDIoYSQkMSk7CiAgICAgICAgICB9KS5qb2luKCJcbiIpOwogICAgICAgICAgbm9kZTIucmVtb3ZlQXR0cmlidXRlKHBlbmRpbmdBdHRyaWJ1dGUpOwogICAgICAgICAgcmVzb2x2ZTIoKTsKICAgICAgICB9KS5jYXRjaChyZWplY3QpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc29sdmUyKCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc29sdmUyKCk7CiAgICB9CiAgfSk7Cn0KZnVuY3Rpb24gcmVwbGFjZTQobm9kZTIpIHsKICByZXR1cm4gUHJvbWlzZS5hbGwoW3JlcGxhY2VGb3JQb3NpdGlvbihub2RlMiwgIjo6YmVmb3JlIiksIHJlcGxhY2VGb3JQb3NpdGlvbihub2RlMiwgIjo6YWZ0ZXIiKV0pOwp9CmZ1bmN0aW9uIHByb2Nlc3NhYmxlKG5vZGUyKSB7CiAgcmV0dXJuIG5vZGUyLnBhcmVudE5vZGUgIT09IGRvY3VtZW50LmhlYWQgJiYgIX5UQUdOQU1FU19UT19TS0lQX0ZPUl9QU0VVRE9FTEVNRU5UUy5pbmRleE9mKG5vZGUyLnRhZ05hbWUudG9VcHBlckNhc2UoKSkgJiYgIW5vZGUyLmdldEF0dHJpYnV0ZShEQVRBX0ZBX1BTRVVET19FTEVNRU5UKSAmJiAoIW5vZGUyLnBhcmVudE5vZGUgfHwgbm9kZTIucGFyZW50Tm9kZS50YWdOYW1lICE9PSAic3ZnIik7Cn0KZnVuY3Rpb24gc2VhcmNoUHNldWRvRWxlbWVudHMocm9vdDYpIHsKICB2YXIgdXNlQXNOb2RlTGlzdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdm9pZCAwID8gYXJndW1lbnRzWzFdIDogZmFsc2U7CiAgaWYgKCFJU19ET00pIHJldHVybjsKICB2YXIgbm9kZUxpc3Q7CiAgaWYgKHVzZUFzTm9kZUxpc3QpIHsKICAgIG5vZGVMaXN0ID0gcm9vdDY7CiAgfSBlbHNlIGlmIChjb25maWcyLnNlYXJjaFBzZXVkb0VsZW1lbnRzRnVsbFNjYW4pIHsKICAgIG5vZGVMaXN0ID0gcm9vdDYucXVlcnlTZWxlY3RvckFsbCgiKiIpOwogIH0gZWxzZSB7CiAgICB2YXIgc2VsZWN0b3JTZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihkb2N1bWVudC5zdHlsZVNoZWV0cyksIF9zdGVwMjsKICAgIHRyeSB7CiAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7ICkgewogICAgICAgIHZhciBzdHlsZXNoZWV0ID0gX3N0ZXAyLnZhbHVlOwogICAgICAgIHRyeSB7CiAgICAgICAgICB2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHN0eWxlc2hlZXQuY3NzUnVsZXMpLCBfc3RlcDM7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBmb3IgKF9pdGVyYXRvcjMucygpOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMubigpKS5kb25lOyApIHsKICAgICAgICAgICAgICB2YXIgcnVsZSA9IF9zdGVwMy52YWx1ZTsKICAgICAgICAgICAgICB2YXIgcGFyc2VkU2VsZWN0b3JzID0gcGFyc2VDU1NSdWxlRm9yUHNldWRvcyhydWxlLnNlbGVjdG9yVGV4dCk7CiAgICAgICAgICAgICAgdmFyIF9pdGVyYXRvcjQgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihwYXJzZWRTZWxlY3RvcnMpLCBfc3RlcDQ7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yNC5zKCk7ICEoX3N0ZXA0ID0gX2l0ZXJhdG9yNC5uKCkpLmRvbmU7ICkgewogICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBfc3RlcDQudmFsdWU7CiAgICAgICAgICAgICAgICAgIHNlbGVjdG9yU2V0LmFkZChzZWxlY3Rvcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICBfaXRlcmF0b3I0LmUoZXJyKTsKICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgX2l0ZXJhdG9yNC5mKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgX2l0ZXJhdG9yMy5lKGVycik7CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBfaXRlcmF0b3IzLmYoKTsKICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlJCQxKSB7CiAgICAgICAgICBpZiAoY29uZmlnMi5zZWFyY2hQc2V1ZG9FbGVtZW50c1dhcm5pbmdzKSB7CiAgICAgICAgICAgIGNvbnNvbGUud2FybigiRm9udCBBd2Vzb21lOiBjYW5ub3QgcGFyc2Ugc3R5bGVzaGVldDogIi5jb25jYXQoc3R5bGVzaGVldC5ocmVmLCAiICgiKS5jb25jYXQoZSQkMS5tZXNzYWdlLCAnKVxuSWYgaXQgZGVjbGFyZXMgYW55IEZvbnQgQXdlc29tZSBDU1MgcHNldWRvLWVsZW1lbnRzLCB0aGV5IHdpbGwgbm90IGJlIHJlbmRlcmVkIGFzIFNWRyBpY29ucy4gQWRkIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiIHRvIHRoZSA8bGluaz4sIGVuYWJsZSBzZWFyY2hQc2V1ZG9FbGVtZW50c0Z1bGxTY2FuIGZvciBzbG93ZXIgYnV0IG1vcmUgdGhvcm91Z2ggRE9NIHBhcnNpbmcsIG9yIHN1cHByZXNzIHRoaXMgd2FybmluZyBieSBzZXR0aW5nIHNlYXJjaFBzZXVkb0VsZW1lbnRzV2FybmluZ3MgdG8gZmFsc2UuJykpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIF9pdGVyYXRvcjIuZShlcnIpOwogICAgfSBmaW5hbGx5IHsKICAgICAgX2l0ZXJhdG9yMi5mKCk7CiAgICB9CiAgICBpZiAoIXNlbGVjdG9yU2V0LnNpemUpIHJldHVybjsKICAgIHZhciBjbGVhblNlbGVjdG9ycyA9IEFycmF5LmZyb20oc2VsZWN0b3JTZXQpLmpvaW4oIiwgIik7CiAgICB0cnkgewogICAgICBub2RlTGlzdCA9IHJvb3Q2LnF1ZXJ5U2VsZWN0b3JBbGwoY2xlYW5TZWxlY3RvcnMpOwogICAgfSBjYXRjaCAoX3VudXNlZCkgewogICAgfQogIH0KICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZTIsIHJlamVjdCkgewogICAgdmFyIG9wZXJhdGlvbnMgPSB0b0FycmF5Mihub2RlTGlzdCkuZmlsdGVyKHByb2Nlc3NhYmxlKS5tYXAocmVwbGFjZTQpOwogICAgdmFyIGVuZDMgPSBwZXJmLmJlZ2luKCJzZWFyY2hQc2V1ZG9FbGVtZW50cyIpOwogICAgZGlzYWJsZU9ic2VydmF0aW9uKCk7CiAgICBQcm9taXNlLmFsbChvcGVyYXRpb25zKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICBlbmQzKCk7CiAgICAgIGVuYWJsZU9ic2VydmF0aW9uKCk7CiAgICAgIHJlc29sdmUyKCk7CiAgICB9KS5jYXRjaChmdW5jdGlvbigpIHsKICAgICAgZW5kMygpOwogICAgICBlbmFibGVPYnNlcnZhdGlvbigpOwogICAgICByZWplY3QoKTsKICAgIH0pOwogIH0pOwp9CmZ1bmN0aW9uIGZpbGxCbGFjayhhYnN0cmFjdCkgewogIHZhciBmb3JjZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdm9pZCAwID8gYXJndW1lbnRzWzFdIDogdHJ1ZTsKICBpZiAoYWJzdHJhY3QuYXR0cmlidXRlcyAmJiAoYWJzdHJhY3QuYXR0cmlidXRlcy5maWxsIHx8IGZvcmNlKSkgewogICAgYWJzdHJhY3QuYXR0cmlidXRlcy5maWxsID0gImJsYWNrIjsKICB9CiAgcmV0dXJuIGFic3RyYWN0Owp9CmZ1bmN0aW9uIGRlR3JvdXAoYWJzdHJhY3QpIHsKICBpZiAoYWJzdHJhY3QudGFnID09PSAiZyIpIHsKICAgIHJldHVybiBhYnN0cmFjdC5jaGlsZHJlbjsKICB9IGVsc2UgewogICAgcmV0dXJuIFthYnN0cmFjdF07CiAgfQp9CnZhciBub29wMiwgX1dJTkRPVywgX0RPQ1VNRU5ULCBfTVVUQVRJT05fT0JTRVJWRVIsIF9QRVJGT1JNQU5DRSwgX3JlZiwgX3JlZiR1c2VyQWdlbnQsIHVzZXJBZ2VudCwgV0lORE9XLCBET0NVTUVOVCwgTVVUQVRJT05fT0JTRVJWRVIsIFBFUkZPUk1BTkNFLCBJU19CUk9XU0VSLCBJU19ET00sIElTX0lFLCBfaHQsIEcsIE0zLCBRLCBYLCBaMiwgaTEwLCB0OCwgZDUsIGw1LCBmNywgaDgsIG4xMiwgZzQsIG8xMiwgdTYsIG02LCBlMTAsIHk0LCBwNywgczksIHczLCBhNCwgeDMsIGI1LCBjMTAsIEkyLCBGLCB2NSwgUzQsIEEzLCBQNCwgajMsIEIyLCBOMywgazQsIEQ0LCBUMywgQzMsIFcyLCBLMiwgUjQsIEwyLCBVLCBkdDIsIGh0LCB5dCwgS3QsIEV0LCBNdCwgSHQsIFF0LCBYdCwgSiwgcjEwLCBFMywgXzQsIGxsLCBzbCwgaGwsIG5sLCBtbCwgX3d0LCB0JDEsIGYkMSwgaCQxLCBvJDEsIG4kMSwgcyQxLCB1JDEsIGckMSwgeSQxLCBtJDEsIGEkMSwgcCQxLCB3JDEsIGUkMSwgYiQxLCBjJDEsIHIkMSwgeCQxLCBpJDEsIEkkMSwgRiQxLCB2JDEsIFMkMSwgQSQxLCBQJDEsIGokMSwgQiQxLCBOJDEsIGskMSwgRCQxLCBDJDEsIFQkMSwgTCQxLCBXJDEsIFIkMSwgSyQxLCBVJDEsIEokMSwgRSQxLCBfJDEsIHd0JDEsIEckMSwgZCQxLCBNJDEsIE8zLCBkbCQxLCBIbCwgWSQxLCBYbCwgViQxLCBsbywgJDMsIHokMSwgcSQxLCBIJDEsIHNvLCBmbywgTkFNRVNQQUNFX0lERU5USUZJRVIsIFVOSVRTX0lOX0dSSUQsIERFRkFVTFRfQ1NTX1BSRUZJWCwgREVGQVVMVF9SRVBMQUNFTUVOVF9DTEFTUywgREFUQV9GQV9JMlNWRywgREFUQV9GQV9QU0VVRE9fRUxFTUVOVCwgREFUQV9GQV9QU0VVRE9fRUxFTUVOVF9QRU5ESU5HLCBEQVRBX1BSRUZJWCwgREFUQV9JQ09OLCBIVE1MX0NMQVNTX0kyU1ZHX0JBU0VfQ0xBU1MsIE1VVEFUSU9OX0FQUFJPQUNIX0FTWU5DLCBUQUdOQU1FU19UT19TS0lQX0ZPUl9QU0VVRE9FTEVNRU5UUywgUFNFVURPX0VMRU1FTlRTLCBQUk9EVUNUSU9OLCBfUFJFRklYX1RPX1NUWUxFLCBQUkVGSVhfVE9fU1RZTEUsIF9TVFlMRV9UT19QUkVGSVgsIFNUWUxFX1RPX1BSRUZJWCwgX1BSRUZJWF9UT19MT05HX1NUWUxFLCBQUkVGSVhfVE9fTE9OR19TVFlMRSwgX0xPTkdfU1RZTEVfVE9fUFJFRklYLCBMT05HX1NUWUxFX1RPX1BSRUZJWCwgSUNPTl9TRUxFQ1RJT05fU1lOVEFYX1BBVFRFUk4sIExBWUVSU19URVhUX0NMQVNTTkFNRSwgRk9OVF9GQU1JTFlfUEFUVEVSTiwgX0ZPTlRfV0VJR0hUX1RPX1BSRUZJWCwgRk9OVF9XRUlHSFRfVE9fUFJFRklYLCBBVFRSSUJVVEVTX1dBVENIRURfRk9SX01VVEFUSU9OLCBEVU9UT05FX0NMQVNTRVMsIFJFU0VSVkVEX0NMQVNTRVMsIGluaXRpYWwsIF9kZWZhdWx0LCBfY29uZmlnLCBjb25maWcyLCBfb25DaGFuZ2VDYiwgZCQyLCBtZWFuaW5nbGVzc1RyYW5zZm9ybSwgaWRQb29sLCBiYXNlU3R5bGVzLCBfY3NzSW5zZXJ0ZWQsIEluamVjdENTUywgdyQyLCBuYW1lc3BhY2UsIGZ1bmN0aW9ucywgX2xpc3RlbmVyLCBsb2FkZWQsIGJpbmRJbnRlcm5hbDQsIHJlZHVjZTMsIE1PTk8sIERVTywgbW9kZXJuTWF0Y2hlcywgbGVnYWN5TWF0Y2hlcywgc3R5bGVzMiwgc2hpbXMsIEZBTUlMWV9OQU1FUywgUFJFRklYRVNfRk9SX0ZBTUlMWSwgX2RlZmF1bHRVc2FibGVQcmVmaXgsIF9ieVVuaWNvZGUsIF9ieUxpZ2F0dXJlLCBfYnlPbGROYW1lLCBfYnlPbGRVbmljb2RlLCBfYnlBbGlhcywgYnVpbGQsIGVtcHR5Q2Fub25pY2FsSWNvbiwgX2ZhQ29tYmluZWRDbGFzc2VzLCBuZXdDYW5vbmljYWxGYW1pbGllcywgbmV3Q2Fub25pY2FsU3R5bGVzLCBMaWJyYXJ5LCBfcGx1Z2lucywgX2hvb2tzLCBwcm92aWRlcnMsIGRlZmF1bHRQcm92aWRlcktleXMsIGxpYnJhcnksIG5vQXV0bywgZG9tLCBwYXJzZTksIGFwaSwgYXV0b1JlcGxhY2UsIHN0eWxlcyQxLCBtaXNzaW5nSWNvblJlc29sdXRpb25NaXhpbiwgbm9vcCQxLCBwJDIsIHByZWFtYmxlLCBiZWdpbiwgZW5kLCBwZXJmLCBub29wJDIsIG11dGF0b3JzLCBkaXNhYmxlZCwgbW8sIHN0eWxlcyQyLCByZW5kZXIsIFJlcGxhY2VFbGVtZW50cywgTGF5ZXJzLCBMYXllcnNDb3VudGVyLCBMYXllcnNUZXh0LCBDTEVBTl9DT05URU5UX1BBVFRFUk4sIFNFQ09OREFSWV9VTklDT0RFX1JBTkdFLCBfRk9OVF9GQU1JTFlfV0VJR0hUX1RPX1BSRUZJWCwgRk9OVF9GQU1JTFlfV0VJR0hUX1RPX1BSRUZJWCwgRk9OVF9GQU1JTFlfV0VJR0hUX0ZBTExCQUNLLCBoYXNQc2V1ZG9FbGVtZW50LCBwYXJzZUNTU1J1bGVGb3JQc2V1ZG9zLCBQc2V1ZG9FbGVtZW50cywgX3Vud2F0Y2hlZCwgTXV0YXRpb25PYnNlcnZlciQxLCBwYXJzZVRyYW5zZm9ybVN0cmluZywgUG93ZXJUcmFuc2Zvcm1zLCBBTExfU1BBQ0UsIE1hc2tzLCBNaXNzaW5nSWNvbkluZGljYXRvciwgU3ZnU3ltYm9scywgcGx1Z2lucywgbm9BdXRvJDEsIGNvbmZpZyQxLCBsaWJyYXJ5JDEsIGRvbSQxLCBwYXJzZSQxLCBmaW5kSWNvbkRlZmluaXRpb24kMSwgdG9IdG1sJDEsIGljb24yLCBsYXllciwgdGV4dDgsIGNvdW50ZXIsIGF0dHJzOwp2YXIgaW5pdF9mb250YXdlc29tZV9zdmdfY29yZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0Bmb3J0YXdlc29tZStmb250YXdlc29tZS1zdmctY29yZUA3LjIuMC9ub2RlX21vZHVsZXMvQGZvcnRhd2Vzb21lL2ZvbnRhd2Vzb21lLXN2Zy1jb3JlL2luZGV4Lm1qcyIoKSB7CiAgICBub29wMiA9IGZ1bmN0aW9uIG5vb3AzKCkgewogICAgfTsKICAgIF9XSU5ET1cgPSB7fTsKICAgIF9ET0NVTUVOVCA9IHt9OwogICAgX01VVEFUSU9OX09CU0VSVkVSID0gbnVsbDsKICAgIF9QRVJGT1JNQU5DRSA9IHsKICAgICAgbWFyazogbm9vcDIsCiAgICAgIG1lYXN1cmU6IG5vb3AyCiAgICB9OwogICAgdHJ5IHsKICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiKSBfV0lORE9XID0gd2luZG93OwogICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIikgX0RPQ1VNRU5UID0gZG9jdW1lbnQ7CiAgICAgIGlmICh0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gInVuZGVmaW5lZCIpIF9NVVRBVElPTl9PQlNFUlZFUiA9IE11dGF0aW9uT2JzZXJ2ZXI7CiAgICAgIGlmICh0eXBlb2YgcGVyZm9ybWFuY2UgIT09ICJ1bmRlZmluZWQiKSBfUEVSRk9STUFOQ0UgPSBwZXJmb3JtYW5jZTsKICAgIH0gY2F0Y2ggKGUxMSkgewogICAgfQogICAgX3JlZiA9IF9XSU5ET1cubmF2aWdhdG9yIHx8IHt9LCBfcmVmJHVzZXJBZ2VudCA9IF9yZWYudXNlckFnZW50LCB1c2VyQWdlbnQgPSBfcmVmJHVzZXJBZ2VudCA9PT0gdm9pZCAwID8gIiIgOiBfcmVmJHVzZXJBZ2VudDsKICAgIFdJTkRPVyA9IF9XSU5ET1c7CiAgICBET0NVTUVOVCA9IF9ET0NVTUVOVDsKICAgIE1VVEFUSU9OX09CU0VSVkVSID0gX01VVEFUSU9OX09CU0VSVkVSOwogICAgUEVSRk9STUFOQ0UgPSBfUEVSRk9STUFOQ0U7CiAgICBJU19CUk9XU0VSID0gISFXSU5ET1cuZG9jdW1lbnQ7CiAgICBJU19ET00gPSAhIURPQ1VNRU5ULmRvY3VtZW50RWxlbWVudCAmJiAhIURPQ1VNRU5ULmhlYWQgJiYgdHlwZW9mIERPQ1VNRU5ULmFkZEV2ZW50TGlzdGVuZXIgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIERPQ1VNRU5ULmNyZWF0ZUVsZW1lbnQgPT09ICJmdW5jdGlvbiI7CiAgICBJU19JRSA9IH51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpIHx8IH51c2VyQWdlbnQuaW5kZXhPZigiVHJpZGVudC8iKTsKICAgIEcgPSAvZmEoa3xrZHxzfHJ8bHx0fGR8ZHJ8ZGx8ZHR8YnxzbHJ8c2xwcnx3c2J8dGx8bnN8bmRzfGVzfGd0fGpyfGpmcnxqZHJ8dXNifHVmc2J8dWRzYnxjcnxzc3xzcnxzbHxzdHxzZHN8c2RyfHNkbHxzZHQpP1tcLVwgXS8sIE0zID0gL0ZvbnQgP0F3ZXNvbWUgPyhbNTY3IF0qKShTb2xpZHxSZWd1bGFyfExpZ2h0fFRoaW58RHVvdG9uZXxCcmFuZHN8RnJlZXxQcm98U2hhcnAgRHVvdG9uZXxTaGFycHxLaXR8Tm90ZG9nIER1b3xOb3Rkb2d8Q2hpc2VsfEV0Y2h8R3JhcGhpdGV8VGh1bWJwcmludHxKZWxseSBGaWxsfEplbGx5IER1b3xKZWxseXxVdGlsaXR5fFV0aWxpdHkgRmlsbHxVdGlsaXR5IER1b3xTbGFiIFByZXNzfFNsYWJ8V2hpdGVib2FyZCk/LiovaTsKICAgIFEgPSB7CiAgICAgIGNsYXNzaWM6IHsKICAgICAgICBmYTogInNvbGlkIiwKICAgICAgICBmYXM6ICJzb2xpZCIsCiAgICAgICAgImZhLXNvbGlkIjogInNvbGlkIiwKICAgICAgICBmYXI6ICJyZWd1bGFyIiwKICAgICAgICAiZmEtcmVndWxhciI6ICJyZWd1bGFyIiwKICAgICAgICBmYWw6ICJsaWdodCIsCiAgICAgICAgImZhLWxpZ2h0IjogImxpZ2h0IiwKICAgICAgICBmYXQ6ICJ0aGluIiwKICAgICAgICAiZmEtdGhpbiI6ICJ0aGluIiwKICAgICAgICBmYWI6ICJicmFuZHMiLAogICAgICAgICJmYS1icmFuZHMiOiAiYnJhbmRzIgogICAgICB9LAogICAgICBkdW90b25lOiB7CiAgICAgICAgZmE6ICJzb2xpZCIsCiAgICAgICAgZmFkOiAic29saWQiLAogICAgICAgICJmYS1zb2xpZCI6ICJzb2xpZCIsCiAgICAgICAgImZhLWR1b3RvbmUiOiAic29saWQiLAogICAgICAgIGZhZHI6ICJyZWd1bGFyIiwKICAgICAgICAiZmEtcmVndWxhciI6ICJyZWd1bGFyIiwKICAgICAgICBmYWRsOiAibGlnaHQiLAogICAgICAgICJmYS1saWdodCI6ICJsaWdodCIsCiAgICAgICAgZmFkdDogInRoaW4iLAogICAgICAgICJmYS10aGluIjogInRoaW4iCiAgICAgIH0sCiAgICAgIHNoYXJwOiB7CiAgICAgICAgZmE6ICJzb2xpZCIsCiAgICAgICAgZmFzczogInNvbGlkIiwKICAgICAgICAiZmEtc29saWQiOiAic29saWQiLAogICAgICAgIGZhc3I6ICJyZWd1bGFyIiwKICAgICAgICAiZmEtcmVndWxhciI6ICJyZWd1bGFyIiwKICAgICAgICBmYXNsOiAibGlnaHQiLAogICAgICAgICJmYS1saWdodCI6ICJsaWdodCIsCiAgICAgICAgZmFzdDogInRoaW4iLAogICAgICAgICJmYS10aGluIjogInRoaW4iCiAgICAgIH0sCiAgICAgICJzaGFycC1kdW90b25lIjogewogICAgICAgIGZhOiAic29saWQiLAogICAgICAgIGZhc2RzOiAic29saWQiLAogICAgICAgICJmYS1zb2xpZCI6ICJzb2xpZCIsCiAgICAgICAgZmFzZHI6ICJyZWd1bGFyIiwKICAgICAgICAiZmEtcmVndWxhciI6ICJyZWd1bGFyIiwKICAgICAgICBmYXNkbDogImxpZ2h0IiwKICAgICAgICAiZmEtbGlnaHQiOiAibGlnaHQiLAogICAgICAgIGZhc2R0OiAidGhpbiIsCiAgICAgICAgImZhLXRoaW4iOiAidGhpbiIKICAgICAgfSwKICAgICAgc2xhYjogewogICAgICAgICJmYS1yZWd1bGFyIjogInJlZ3VsYXIiLAogICAgICAgIGZhc2xyOiAicmVndWxhciIKICAgICAgfSwKICAgICAgInNsYWItcHJlc3MiOiB7CiAgICAgICAgImZhLXJlZ3VsYXIiOiAicmVndWxhciIsCiAgICAgICAgZmFzbHByOiAicmVndWxhciIKICAgICAgfSwKICAgICAgdGh1bWJwcmludDogewogICAgICAgICJmYS1saWdodCI6ICJsaWdodCIsCiAgICAgICAgZmF0bDogImxpZ2h0IgogICAgICB9LAogICAgICB3aGl0ZWJvYXJkOiB7CiAgICAgICAgImZhLXNlbWlib2xkIjogInNlbWlib2xkIiwKICAgICAgICBmYXdzYjogInNlbWlib2xkIgogICAgICB9LAogICAgICBub3Rkb2c6IHsKICAgICAgICAiZmEtc29saWQiOiAic29saWQiLAogICAgICAgIGZhbnM6ICJzb2xpZCIKICAgICAgfSwKICAgICAgIm5vdGRvZy1kdW8iOiB7CiAgICAgICAgImZhLXNvbGlkIjogInNvbGlkIiwKICAgICAgICBmYW5kczogInNvbGlkIgogICAgICB9LAogICAgICBldGNoOiB7CiAgICAgICAgImZhLXNvbGlkIjogInNvbGlkIiwKICAgICAgICBmYWVzOiAic29saWQiCiAgICAgIH0sCiAgICAgIGdyYXBoaXRlOiB7CiAgICAgICAgImZhLXRoaW4iOiAidGhpbiIsCiAgICAgICAgZmFndDogInRoaW4iCiAgICAgIH0sCiAgICAgIGplbGx5OiB7CiAgICAgICAgImZhLXJlZ3VsYXIiOiAicmVndWxhciIsCiAgICAgICAgZmFqcjogInJlZ3VsYXIiCiAgICAgIH0sCiAgICAgICJqZWxseS1maWxsIjogewogICAgICAgICJmYS1yZWd1bGFyIjogInJlZ3VsYXIiLAogICAgICAgIGZhamZyOiAicmVndWxhciIKICAgICAgfSwKICAgICAgImplbGx5LWR1byI6IHsKICAgICAgICAiZmEtcmVndWxhciI6ICJyZWd1bGFyIiwKICAgICAgICBmYWpkcjogInJlZ3VsYXIiCiAgICAgIH0sCiAgICAgIGNoaXNlbDogewogICAgICAgICJmYS1yZWd1bGFyIjogInJlZ3VsYXIiLAogICAgICAgIGZhY3I6ICJyZWd1bGFyIgogICAgICB9LAogICAgICB1dGlsaXR5OiB7CiAgICAgICAgImZhLXNlbWlib2xkIjogInNlbWlib2xkIiwKICAgICAgICBmYXVzYjogInNlbWlib2xkIgogICAgICB9LAogICAgICAidXRpbGl0eS1kdW8iOiB7CiAgICAgICAgImZhLXNlbWlib2xkIjogInNlbWlib2xkIiwKICAgICAgICBmYXVkc2I6ICJzZW1pYm9sZCIKICAgICAgfSwKICAgICAgInV0aWxpdHktZmlsbCI6IHsKICAgICAgICAiZmEtc2VtaWJvbGQiOiAic2VtaWJvbGQiLAogICAgICAgIGZhdWZzYjogInNlbWlib2xkIgogICAgICB9CiAgICB9LCBYID0gewogICAgICBHUk9VUDogImR1b3RvbmUtZ3JvdXAiLAogICAgICBTV0FQX09QQUNJVFk6ICJzd2FwLW9wYWNpdHkiLAogICAgICBQUklNQVJZOiAicHJpbWFyeSIsCiAgICAgIFNFQ09OREFSWTogInNlY29uZGFyeSIKICAgIH0sIFoyID0gWyJmYS1jbGFzc2ljIiwgImZhLWR1b3RvbmUiLCAiZmEtc2hhcnAiLCAiZmEtc2hhcnAtZHVvdG9uZSIsICJmYS10aHVtYnByaW50IiwgImZhLXdoaXRlYm9hcmQiLCAiZmEtbm90ZG9nIiwgImZhLW5vdGRvZy1kdW8iLCAiZmEtY2hpc2VsIiwgImZhLWV0Y2giLCAiZmEtZ3JhcGhpdGUiLCAiZmEtamVsbHkiLCAiZmEtamVsbHktZmlsbCIsICJmYS1qZWxseS1kdW8iLCAiZmEtc2xhYiIsICJmYS1zbGFiLXByZXNzIiwgImZhLXV0aWxpdHkiLCAiZmEtdXRpbGl0eS1kdW8iLCAiZmEtdXRpbGl0eS1maWxsIl07CiAgICBpMTAgPSAiY2xhc3NpYyIsIHQ4ID0gImR1b3RvbmUiLCBkNSA9ICJzaGFycCIsIGw1ID0gInNoYXJwLWR1b3RvbmUiLCBmNyA9ICJjaGlzZWwiLCBoOCA9ICJldGNoIiwgbjEyID0gImdyYXBoaXRlIiwgZzQgPSAiamVsbHkiLCBvMTIgPSAiamVsbHktZHVvIiwgdTYgPSAiamVsbHktZmlsbCIsIG02ID0gIm5vdGRvZyIsIGUxMCA9ICJub3Rkb2ctZHVvIiwgeTQgPSAic2xhYiIsIHA3ID0gInNsYWItcHJlc3MiLCBzOSA9ICJ0aHVtYnByaW50IiwgdzMgPSAidXRpbGl0eSIsIGE0ID0gInV0aWxpdHktZHVvIiwgeDMgPSAidXRpbGl0eS1maWxsIiwgYjUgPSAid2hpdGVib2FyZCIsIGMxMCA9ICJDbGFzc2ljIiwgSTIgPSAiRHVvdG9uZSIsIEYgPSAiU2hhcnAiLCB2NSA9ICJTaGFycCBEdW90b25lIiwgUzQgPSAiQ2hpc2VsIiwgQTMgPSAiRXRjaCIsIFA0ID0gIkdyYXBoaXRlIiwgajMgPSAiSmVsbHkiLCBCMiA9ICJKZWxseSBEdW8iLCBOMyA9ICJKZWxseSBGaWxsIiwgazQgPSAiTm90ZG9nIiwgRDQgPSAiTm90ZG9nIER1byIsIFQzID0gIlNsYWIiLCBDMyA9ICJTbGFiIFByZXNzIiwgVzIgPSAiVGh1bWJwcmludCIsIEsyID0gIlV0aWxpdHkiLCBSNCA9ICJVdGlsaXR5IER1byIsIEwyID0gIlV0aWxpdHkgRmlsbCIsIFUgPSAiV2hpdGVib2FyZCIsIGR0MiA9IFtpMTAsIHQ4LCBkNSwgbDUsIGY3LCBoOCwgbjEyLCBnNCwgbzEyLCB1NiwgbTYsIGUxMCwgeTQsIHA3LCBzOSwgdzMsIGE0LCB4MywgYjVdLCBodCA9IChfaHQgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9odCwgaTEwLCBjMTApLCB0OCwgSTIpLCBkNSwgRiksIGw1LCB2NSksIGY3LCBTNCksIGg4LCBBMyksIG4xMiwgUDQpLCBnNCwgajMpLCBvMTIsIEIyKSwgdTYsIE4zKSwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2h0LCBtNiwgazQpLCBlMTAsIEQ0KSwgeTQsIFQzKSwgcDcsIEMzKSwgczksIFcyKSwgdzMsIEsyKSwgYTQsIFI0KSwgeDMsIEwyKSwgYjUsIFUpKTsKICAgIHl0ID0gewogICAgICBjbGFzc2ljOiB7CiAgICAgICAgOTAwOiAiZmFzIiwKICAgICAgICA0MDA6ICJmYXIiLAogICAgICAgIG5vcm1hbDogImZhciIsCiAgICAgICAgMzAwOiAiZmFsIiwKICAgICAgICAxMDA6ICJmYXQiCiAgICAgIH0sCiAgICAgIGR1b3RvbmU6IHsKICAgICAgICA5MDA6ICJmYWQiLAogICAgICAgIDQwMDogImZhZHIiLAogICAgICAgIDMwMDogImZhZGwiLAogICAgICAgIDEwMDogImZhZHQiCiAgICAgIH0sCiAgICAgIHNoYXJwOiB7CiAgICAgICAgOTAwOiAiZmFzcyIsCiAgICAgICAgNDAwOiAiZmFzciIsCiAgICAgICAgMzAwOiAiZmFzbCIsCiAgICAgICAgMTAwOiAiZmFzdCIKICAgICAgfSwKICAgICAgInNoYXJwLWR1b3RvbmUiOiB7CiAgICAgICAgOTAwOiAiZmFzZHMiLAogICAgICAgIDQwMDogImZhc2RyIiwKICAgICAgICAzMDA6ICJmYXNkbCIsCiAgICAgICAgMTAwOiAiZmFzZHQiCiAgICAgIH0sCiAgICAgIHNsYWI6IHsKICAgICAgICA0MDA6ICJmYXNsciIKICAgICAgfSwKICAgICAgInNsYWItcHJlc3MiOiB7CiAgICAgICAgNDAwOiAiZmFzbHByIgogICAgICB9LAogICAgICB3aGl0ZWJvYXJkOiB7CiAgICAgICAgNjAwOiAiZmF3c2IiCiAgICAgIH0sCiAgICAgIHRodW1icHJpbnQ6IHsKICAgICAgICAzMDA6ICJmYXRsIgogICAgICB9LAogICAgICBub3Rkb2c6IHsKICAgICAgICA5MDA6ICJmYW5zIgogICAgICB9LAogICAgICAibm90ZG9nLWR1byI6IHsKICAgICAgICA5MDA6ICJmYW5kcyIKICAgICAgfSwKICAgICAgZXRjaDogewogICAgICAgIDkwMDogImZhZXMiCiAgICAgIH0sCiAgICAgIGdyYXBoaXRlOiB7CiAgICAgICAgMTAwOiAiZmFndCIKICAgICAgfSwKICAgICAgY2hpc2VsOiB7CiAgICAgICAgNDAwOiAiZmFjciIKICAgICAgfSwKICAgICAgamVsbHk6IHsKICAgICAgICA0MDA6ICJmYWpyIgogICAgICB9LAogICAgICAiamVsbHktZmlsbCI6IHsKICAgICAgICA0MDA6ICJmYWpmciIKICAgICAgfSwKICAgICAgImplbGx5LWR1byI6IHsKICAgICAgICA0MDA6ICJmYWpkciIKICAgICAgfSwKICAgICAgdXRpbGl0eTogewogICAgICAgIDYwMDogImZhdXNiIgogICAgICB9LAogICAgICAidXRpbGl0eS1kdW8iOiB7CiAgICAgICAgNjAwOiAiZmF1ZHNiIgogICAgICB9LAogICAgICAidXRpbGl0eS1maWxsIjogewogICAgICAgIDYwMDogImZhdWZzYiIKICAgICAgfQogICAgfTsKICAgIEt0ID0gewogICAgICAiRm9udCBBd2Vzb21lIDcgRnJlZSI6IHsKICAgICAgICA5MDA6ICJmYXMiLAogICAgICAgIDQwMDogImZhciIKICAgICAgfSwKICAgICAgIkZvbnQgQXdlc29tZSA3IFBybyI6IHsKICAgICAgICA5MDA6ICJmYXMiLAogICAgICAgIDQwMDogImZhciIsCiAgICAgICAgbm9ybWFsOiAiZmFyIiwKICAgICAgICAzMDA6ICJmYWwiLAogICAgICAgIDEwMDogImZhdCIKICAgICAgfSwKICAgICAgIkZvbnQgQXdlc29tZSA3IEJyYW5kcyI6IHsKICAgICAgICA0MDA6ICJmYWIiLAogICAgICAgIG5vcm1hbDogImZhYiIKICAgICAgfSwKICAgICAgIkZvbnQgQXdlc29tZSA3IER1b3RvbmUiOiB7CiAgICAgICAgOTAwOiAiZmFkIiwKICAgICAgICA0MDA6ICJmYWRyIiwKICAgICAgICBub3JtYWw6ICJmYWRyIiwKICAgICAgICAzMDA6ICJmYWRsIiwKICAgICAgICAxMDA6ICJmYWR0IgogICAgICB9LAogICAgICAiRm9udCBBd2Vzb21lIDcgU2hhcnAiOiB7CiAgICAgICAgOTAwOiAiZmFzcyIsCiAgICAgICAgNDAwOiAiZmFzciIsCiAgICAgICAgbm9ybWFsOiAiZmFzciIsCiAgICAgICAgMzAwOiAiZmFzbCIsCiAgICAgICAgMTAwOiAiZmFzdCIKICAgICAgfSwKICAgICAgIkZvbnQgQXdlc29tZSA3IFNoYXJwIER1b3RvbmUiOiB7CiAgICAgICAgOTAwOiAiZmFzZHMiLAogICAgICAgIDQwMDogImZhc2RyIiwKICAgICAgICBub3JtYWw6ICJmYXNkciIsCiAgICAgICAgMzAwOiAiZmFzZGwiLAogICAgICAgIDEwMDogImZhc2R0IgogICAgICB9LAogICAgICAiRm9udCBBd2Vzb21lIDcgSmVsbHkiOiB7CiAgICAgICAgNDAwOiAiZmFqciIsCiAgICAgICAgbm9ybWFsOiAiZmFqciIKICAgICAgfSwKICAgICAgIkZvbnQgQXdlc29tZSA3IEplbGx5IEZpbGwiOiB7CiAgICAgICAgNDAwOiAiZmFqZnIiLAogICAgICAgIG5vcm1hbDogImZhamZyIgogICAgICB9LAogICAgICAiRm9udCBBd2Vzb21lIDcgSmVsbHkgRHVvIjogewogICAgICAgIDQwMDogImZhamRyIiwKICAgICAgICBub3JtYWw6ICJmYWpkciIKICAgICAgfSwKICAgICAgIkZvbnQgQXdlc29tZSA3IFNsYWIiOiB7CiAgICAgICAgNDAwOiAiZmFzbHIiLAogICAgICAgIG5vcm1hbDogImZhc2xyIgogICAgICB9LAogICAgICAiRm9udCBBd2Vzb21lIDcgU2xhYiBQcmVzcyI6IHsKICAgICAgICA0MDA6ICJmYXNscHIiLAogICAgICAgIG5vcm1hbDogImZhc2xwciIKICAgICAgfSwKICAgICAgIkZvbnQgQXdlc29tZSA3IFRodW1icHJpbnQiOiB7CiAgICAgICAgMzAwOiAiZmF0bCIsCiAgICAgICAgbm9ybWFsOiAiZmF0bCIKICAgICAgfSwKICAgICAgIkZvbnQgQXdlc29tZSA3IE5vdGRvZyI6IHsKICAgICAgICA5MDA6ICJmYW5zIiwKICAgICAgICBub3JtYWw6ICJmYW5zIgogICAgICB9LAogICAgICAiRm9udCBBd2Vzb21lIDcgTm90ZG9nIER1byI6IHsKICAgICAgICA5MDA6ICJmYW5kcyIsCiAgICAgICAgbm9ybWFsOiAiZmFuZHMiCiAgICAgIH0sCiAgICAgICJGb250IEF3ZXNvbWUgNyBFdGNoIjogewogICAgICAgIDkwMDogImZhZXMiLAogICAgICAgIG5vcm1hbDogImZhZXMiCiAgICAgIH0sCiAgICAgICJGb250IEF3ZXNvbWUgNyBHcmFwaGl0ZSI6IHsKICAgICAgICAxMDA6ICJmYWd0IiwKICAgICAgICBub3JtYWw6ICJmYWd0IgogICAgICB9LAogICAgICAiRm9udCBBd2Vzb21lIDcgQ2hpc2VsIjogewogICAgICAgIDQwMDogImZhY3IiLAogICAgICAgIG5vcm1hbDogImZhY3IiCiAgICAgIH0sCiAgICAgICJGb250IEF3ZXNvbWUgNyBXaGl0ZWJvYXJkIjogewogICAgICAgIDYwMDogImZhd3NiIiwKICAgICAgICBub3JtYWw6ICJmYXdzYiIKICAgICAgfSwKICAgICAgIkZvbnQgQXdlc29tZSA3IFV0aWxpdHkiOiB7CiAgICAgICAgNjAwOiAiZmF1c2IiLAogICAgICAgIG5vcm1hbDogImZhdXNiIgogICAgICB9LAogICAgICAiRm9udCBBd2Vzb21lIDcgVXRpbGl0eSBEdW8iOiB7CiAgICAgICAgNjAwOiAiZmF1ZHNiIiwKICAgICAgICBub3JtYWw6ICJmYXVkc2IiCiAgICAgIH0sCiAgICAgICJGb250IEF3ZXNvbWUgNyBVdGlsaXR5IEZpbGwiOiB7CiAgICAgICAgNjAwOiAiZmF1ZnNiIiwKICAgICAgICBub3JtYWw6ICJmYXVmc2IiCiAgICAgIH0KICAgIH07CiAgICBFdCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKFtbImNsYXNzaWMiLCB7CiAgICAgIGRlZmF1bHRTaG9ydFByZWZpeElkOiAiZmFzIiwKICAgICAgZGVmYXVsdFN0eWxlSWQ6ICJzb2xpZCIsCiAgICAgIHN0eWxlSWRzOiBbInNvbGlkIiwgInJlZ3VsYXIiLCAibGlnaHQiLCAidGhpbiIsICJicmFuZHMiXSwKICAgICAgZnV0dXJlU3R5bGVJZHM6IFtdLAogICAgICBkZWZhdWx0Rm9udFdlaWdodDogOTAwCiAgICB9XSwgWyJkdW90b25lIiwgewogICAgICBkZWZhdWx0U2hvcnRQcmVmaXhJZDogImZhZCIsCiAgICAgIGRlZmF1bHRTdHlsZUlkOiAic29saWQiLAogICAgICBzdHlsZUlkczogWyJzb2xpZCIsICJyZWd1bGFyIiwgImxpZ2h0IiwgInRoaW4iXSwKICAgICAgZnV0dXJlU3R5bGVJZHM6IFtdLAogICAgICBkZWZhdWx0Rm9udFdlaWdodDogOTAwCiAgICB9XSwgWyJzaGFycCIsIHsKICAgICAgZGVmYXVsdFNob3J0UHJlZml4SWQ6ICJmYXNzIiwKICAgICAgZGVmYXVsdFN0eWxlSWQ6ICJzb2xpZCIsCiAgICAgIHN0eWxlSWRzOiBbInNvbGlkIiwgInJlZ3VsYXIiLCAibGlnaHQiLCAidGhpbiJdLAogICAgICBmdXR1cmVTdHlsZUlkczogW10sCiAgICAgIGRlZmF1bHRGb250V2VpZ2h0OiA5MDAKICAgIH1dLCBbInNoYXJwLWR1b3RvbmUiLCB7CiAgICAgIGRlZmF1bHRTaG9ydFByZWZpeElkOiAiZmFzZHMiLAogICAgICBkZWZhdWx0U3R5bGVJZDogInNvbGlkIiwKICAgICAgc3R5bGVJZHM6IFsic29saWQiLCAicmVndWxhciIsICJsaWdodCIsICJ0aGluIl0sCiAgICAgIGZ1dHVyZVN0eWxlSWRzOiBbXSwKICAgICAgZGVmYXVsdEZvbnRXZWlnaHQ6IDkwMAogICAgfV0sIFsiY2hpc2VsIiwgewogICAgICBkZWZhdWx0U2hvcnRQcmVmaXhJZDogImZhY3IiLAogICAgICBkZWZhdWx0U3R5bGVJZDogInJlZ3VsYXIiLAogICAgICBzdHlsZUlkczogWyJyZWd1bGFyIl0sCiAgICAgIGZ1dHVyZVN0eWxlSWRzOiBbXSwKICAgICAgZGVmYXVsdEZvbnRXZWlnaHQ6IDQwMAogICAgfV0sIFsiZXRjaCIsIHsKICAgICAgZGVmYXVsdFNob3J0UHJlZml4SWQ6ICJmYWVzIiwKICAgICAgZGVmYXVsdFN0eWxlSWQ6ICJzb2xpZCIsCiAgICAgIHN0eWxlSWRzOiBbInNvbGlkIl0sCiAgICAgIGZ1dHVyZVN0eWxlSWRzOiBbXSwKICAgICAgZGVmYXVsdEZvbnRXZWlnaHQ6IDkwMAogICAgfV0sIFsiZ3JhcGhpdGUiLCB7CiAgICAgIGRlZmF1bHRTaG9ydFByZWZpeElkOiAiZmFndCIsCiAgICAgIGRlZmF1bHRTdHlsZUlkOiAidGhpbiIsCiAgICAgIHN0eWxlSWRzOiBbInRoaW4iXSwKICAgICAgZnV0dXJlU3R5bGVJZHM6IFtdLAogICAgICBkZWZhdWx0Rm9udFdlaWdodDogMTAwCiAgICB9XSwgWyJqZWxseSIsIHsKICAgICAgZGVmYXVsdFNob3J0UHJlZml4SWQ6ICJmYWpyIiwKICAgICAgZGVmYXVsdFN0eWxlSWQ6ICJyZWd1bGFyIiwKICAgICAgc3R5bGVJZHM6IFsicmVndWxhciJdLAogICAgICBmdXR1cmVTdHlsZUlkczogW10sCiAgICAgIGRlZmF1bHRGb250V2VpZ2h0OiA0MDAKICAgIH1dLCBbImplbGx5LWR1byIsIHsKICAgICAgZGVmYXVsdFNob3J0UHJlZml4SWQ6ICJmYWpkciIsCiAgICAgIGRlZmF1bHRTdHlsZUlkOiAicmVndWxhciIsCiAgICAgIHN0eWxlSWRzOiBbInJlZ3VsYXIiXSwKICAgICAgZnV0dXJlU3R5bGVJZHM6IFtdLAogICAgICBkZWZhdWx0Rm9udFdlaWdodDogNDAwCiAgICB9XSwgWyJqZWxseS1maWxsIiwgewogICAgICBkZWZhdWx0U2hvcnRQcmVmaXhJZDogImZhamZyIiwKICAgICAgZGVmYXVsdFN0eWxlSWQ6ICJyZWd1bGFyIiwKICAgICAgc3R5bGVJZHM6IFsicmVndWxhciJdLAogICAgICBmdXR1cmVTdHlsZUlkczogW10sCiAgICAgIGRlZmF1bHRGb250V2VpZ2h0OiA0MDAKICAgIH1dLCBbIm5vdGRvZyIsIHsKICAgICAgZGVmYXVsdFNob3J0UHJlZml4SWQ6ICJmYW5zIiwKICAgICAgZGVmYXVsdFN0eWxlSWQ6ICJzb2xpZCIsCiAgICAgIHN0eWxlSWRzOiBbInNvbGlkIl0sCiAgICAgIGZ1dHVyZVN0eWxlSWRzOiBbXSwKICAgICAgZGVmYXVsdEZvbnRXZWlnaHQ6IDkwMAogICAgfV0sIFsibm90ZG9nLWR1byIsIHsKICAgICAgZGVmYXVsdFNob3J0UHJlZml4SWQ6ICJmYW5kcyIsCiAgICAgIGRlZmF1bHRTdHlsZUlkOiAic29saWQiLAogICAgICBzdHlsZUlkczogWyJzb2xpZCJdLAogICAgICBmdXR1cmVTdHlsZUlkczogW10sCiAgICAgIGRlZmF1bHRGb250V2VpZ2h0OiA5MDAKICAgIH1dLCBbInNsYWIiLCB7CiAgICAgIGRlZmF1bHRTaG9ydFByZWZpeElkOiAiZmFzbHIiLAogICAgICBkZWZhdWx0U3R5bGVJZDogInJlZ3VsYXIiLAogICAgICBzdHlsZUlkczogWyJyZWd1bGFyIl0sCiAgICAgIGZ1dHVyZVN0eWxlSWRzOiBbXSwKICAgICAgZGVmYXVsdEZvbnRXZWlnaHQ6IDQwMAogICAgfV0sIFsic2xhYi1wcmVzcyIsIHsKICAgICAgZGVmYXVsdFNob3J0UHJlZml4SWQ6ICJmYXNscHIiLAogICAgICBkZWZhdWx0U3R5bGVJZDogInJlZ3VsYXIiLAogICAgICBzdHlsZUlkczogWyJyZWd1bGFyIl0sCiAgICAgIGZ1dHVyZVN0eWxlSWRzOiBbXSwKICAgICAgZGVmYXVsdEZvbnRXZWlnaHQ6IDQwMAogICAgfV0sIFsidGh1bWJwcmludCIsIHsKICAgICAgZGVmYXVsdFNob3J0UHJlZml4SWQ6ICJmYXRsIiwKICAgICAgZGVmYXVsdFN0eWxlSWQ6ICJsaWdodCIsCiAgICAgIHN0eWxlSWRzOiBbImxpZ2h0Il0sCiAgICAgIGZ1dHVyZVN0eWxlSWRzOiBbXSwKICAgICAgZGVmYXVsdEZvbnRXZWlnaHQ6IDMwMAogICAgfV0sIFsidXRpbGl0eSIsIHsKICAgICAgZGVmYXVsdFNob3J0UHJlZml4SWQ6ICJmYXVzYiIsCiAgICAgIGRlZmF1bHRTdHlsZUlkOiAic2VtaWJvbGQiLAogICAgICBzdHlsZUlkczogWyJzZW1pYm9sZCJdLAogICAgICBmdXR1cmVTdHlsZUlkczogW10sCiAgICAgIGRlZmF1bHRGb250V2VpZ2h0OiA2MDAKICAgIH1dLCBbInV0aWxpdHktZHVvIiwgewogICAgICBkZWZhdWx0U2hvcnRQcmVmaXhJZDogImZhdWRzYiIsCiAgICAgIGRlZmF1bHRTdHlsZUlkOiAic2VtaWJvbGQiLAogICAgICBzdHlsZUlkczogWyJzZW1pYm9sZCJdLAogICAgICBmdXR1cmVTdHlsZUlkczogW10sCiAgICAgIGRlZmF1bHRGb250V2VpZ2h0OiA2MDAKICAgIH1dLCBbInV0aWxpdHktZmlsbCIsIHsKICAgICAgZGVmYXVsdFNob3J0UHJlZml4SWQ6ICJmYXVmc2IiLAogICAgICBkZWZhdWx0U3R5bGVJZDogInNlbWlib2xkIiwKICAgICAgc3R5bGVJZHM6IFsic2VtaWJvbGQiXSwKICAgICAgZnV0dXJlU3R5bGVJZHM6IFtdLAogICAgICBkZWZhdWx0Rm9udFdlaWdodDogNjAwCiAgICB9XSwgWyJ3aGl0ZWJvYXJkIiwgewogICAgICBkZWZhdWx0U2hvcnRQcmVmaXhJZDogImZhd3NiIiwKICAgICAgZGVmYXVsdFN0eWxlSWQ6ICJzZW1pYm9sZCIsCiAgICAgIHN0eWxlSWRzOiBbInNlbWlib2xkIl0sCiAgICAgIGZ1dHVyZVN0eWxlSWRzOiBbXSwKICAgICAgZGVmYXVsdEZvbnRXZWlnaHQ6IDYwMAogICAgfV1dKSwgTXQgPSB7CiAgICAgIGNoaXNlbDogewogICAgICAgIHJlZ3VsYXI6ICJmYWNyIgogICAgICB9LAogICAgICBjbGFzc2ljOiB7CiAgICAgICAgYnJhbmRzOiAiZmFiIiwKICAgICAgICBsaWdodDogImZhbCIsCiAgICAgICAgcmVndWxhcjogImZhciIsCiAgICAgICAgc29saWQ6ICJmYXMiLAogICAgICAgIHRoaW46ICJmYXQiCiAgICAgIH0sCiAgICAgIGR1b3RvbmU6IHsKICAgICAgICBsaWdodDogImZhZGwiLAogICAgICAgIHJlZ3VsYXI6ICJmYWRyIiwKICAgICAgICBzb2xpZDogImZhZCIsCiAgICAgICAgdGhpbjogImZhZHQiCiAgICAgIH0sCiAgICAgIGV0Y2g6IHsKICAgICAgICBzb2xpZDogImZhZXMiCiAgICAgIH0sCiAgICAgIGdyYXBoaXRlOiB7CiAgICAgICAgdGhpbjogImZhZ3QiCiAgICAgIH0sCiAgICAgIGplbGx5OiB7CiAgICAgICAgcmVndWxhcjogImZhanIiCiAgICAgIH0sCiAgICAgICJqZWxseS1kdW8iOiB7CiAgICAgICAgcmVndWxhcjogImZhamRyIgogICAgICB9LAogICAgICAiamVsbHktZmlsbCI6IHsKICAgICAgICByZWd1bGFyOiAiZmFqZnIiCiAgICAgIH0sCiAgICAgIG5vdGRvZzogewogICAgICAgIHNvbGlkOiAiZmFucyIKICAgICAgfSwKICAgICAgIm5vdGRvZy1kdW8iOiB7CiAgICAgICAgc29saWQ6ICJmYW5kcyIKICAgICAgfSwKICAgICAgc2hhcnA6IHsKICAgICAgICBsaWdodDogImZhc2wiLAogICAgICAgIHJlZ3VsYXI6ICJmYXNyIiwKICAgICAgICBzb2xpZDogImZhc3MiLAogICAgICAgIHRoaW46ICJmYXN0IgogICAgICB9LAogICAgICAic2hhcnAtZHVvdG9uZSI6IHsKICAgICAgICBsaWdodDogImZhc2RsIiwKICAgICAgICByZWd1bGFyOiAiZmFzZHIiLAogICAgICAgIHNvbGlkOiAiZmFzZHMiLAogICAgICAgIHRoaW46ICJmYXNkdCIKICAgICAgfSwKICAgICAgc2xhYjogewogICAgICAgIHJlZ3VsYXI6ICJmYXNsciIKICAgICAgfSwKICAgICAgInNsYWItcHJlc3MiOiB7CiAgICAgICAgcmVndWxhcjogImZhc2xwciIKICAgICAgfSwKICAgICAgdGh1bWJwcmludDogewogICAgICAgIGxpZ2h0OiAiZmF0bCIKICAgICAgfSwKICAgICAgdXRpbGl0eTogewogICAgICAgIHNlbWlib2xkOiAiZmF1c2IiCiAgICAgIH0sCiAgICAgICJ1dGlsaXR5LWR1byI6IHsKICAgICAgICBzZW1pYm9sZDogImZhdWRzYiIKICAgICAgfSwKICAgICAgInV0aWxpdHktZmlsbCI6IHsKICAgICAgICBzZW1pYm9sZDogImZhdWZzYiIKICAgICAgfSwKICAgICAgd2hpdGVib2FyZDogewogICAgICAgIHNlbWlib2xkOiAiZmF3c2IiCiAgICAgIH0KICAgIH07CiAgICBIdCA9IFsiZmFrIiwgImZhLWtpdCIsICJmYWtkIiwgImZhLWtpdC1kdW90b25lIl0sIFF0ID0gewogICAgICBraXQ6IHsKICAgICAgICBmYWs6ICJraXQiLAogICAgICAgICJmYS1raXQiOiAia2l0IgogICAgICB9LAogICAgICAia2l0LWR1b3RvbmUiOiB7CiAgICAgICAgZmFrZDogImtpdC1kdW90b25lIiwKICAgICAgICAiZmEta2l0LWR1b3RvbmUiOiAia2l0LWR1b3RvbmUiCiAgICAgIH0KICAgIH0sIFh0ID0gWyJraXQiXTsKICAgIEogPSAia2l0IiwgcjEwID0gImtpdC1kdW90b25lIiwgRTMgPSAiS2l0IiwgXzQgPSAiS2l0IER1b3RvbmUiLCBsbCA9IF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIEosIEUzKSwgcjEwLCBfNCk7CiAgICBzbCA9IHsKICAgICAga2l0OiB7CiAgICAgICAgImZhLWtpdCI6ICJmYWsiCiAgICAgIH0sCiAgICAgICJraXQtZHVvdG9uZSI6IHsKICAgICAgICAiZmEta2l0LWR1b3RvbmUiOiAiZmFrZCIKICAgICAgfQogICAgfTsKICAgIGhsID0gewogICAgICAiRm9udCBBd2Vzb21lIEtpdCI6IHsKICAgICAgICA0MDA6ICJmYWsiLAogICAgICAgIG5vcm1hbDogImZhayIKICAgICAgfSwKICAgICAgIkZvbnQgQXdlc29tZSBLaXQgRHVvdG9uZSI6IHsKICAgICAgICA0MDA6ICJmYWtkIiwKICAgICAgICBub3JtYWw6ICJmYWtkIgogICAgICB9CiAgICB9LCBubCA9IHsKICAgICAga2l0OiB7CiAgICAgICAgZmFrOiAiZmEta2l0IgogICAgICB9LAogICAgICAia2l0LWR1b3RvbmUiOiB7CiAgICAgICAgZmFrZDogImZhLWtpdC1kdW90b25lIgogICAgICB9CiAgICB9OwogICAgbWwgPSB7CiAgICAgIGtpdDogewogICAgICAgIGtpdDogImZhayIKICAgICAgfSwKICAgICAgImtpdC1kdW90b25lIjogewogICAgICAgICJraXQtZHVvdG9uZSI6ICJmYWtkIgogICAgICB9CiAgICB9OwogICAgdCQxID0gewogICAgICBHUk9VUDogImR1b3RvbmUtZ3JvdXAiLAogICAgICBTV0FQX09QQUNJVFk6ICJzd2FwLW9wYWNpdHkiLAogICAgICBQUklNQVJZOiAicHJpbWFyeSIsCiAgICAgIFNFQ09OREFSWTogInNlY29uZGFyeSIKICAgIH0sIGYkMSA9IFsiZmEtY2xhc3NpYyIsICJmYS1kdW90b25lIiwgImZhLXNoYXJwIiwgImZhLXNoYXJwLWR1b3RvbmUiLCAiZmEtdGh1bWJwcmludCIsICJmYS13aGl0ZWJvYXJkIiwgImZhLW5vdGRvZyIsICJmYS1ub3Rkb2ctZHVvIiwgImZhLWNoaXNlbCIsICJmYS1ldGNoIiwgImZhLWdyYXBoaXRlIiwgImZhLWplbGx5IiwgImZhLWplbGx5LWZpbGwiLCAiZmEtamVsbHktZHVvIiwgImZhLXNsYWIiLCAiZmEtc2xhYi1wcmVzcyIsICJmYS11dGlsaXR5IiwgImZhLXV0aWxpdHktZHVvIiwgImZhLXV0aWxpdHktZmlsbCJdOwogICAgaCQxID0gImNsYXNzaWMiLCBvJDEgPSAiZHVvdG9uZSIsIG4kMSA9ICJzaGFycCIsIHMkMSA9ICJzaGFycC1kdW90b25lIiwgdSQxID0gImNoaXNlbCIsIGckMSA9ICJldGNoIiwgeSQxID0gImdyYXBoaXRlIiwgbSQxID0gImplbGx5IiwgYSQxID0gImplbGx5LWR1byIsIHAkMSA9ICJqZWxseS1maWxsIiwgdyQxID0gIm5vdGRvZyIsIGUkMSA9ICJub3Rkb2ctZHVvIiwgYiQxID0gInNsYWIiLCBjJDEgPSAic2xhYi1wcmVzcyIsIHIkMSA9ICJ0aHVtYnByaW50IiwgeCQxID0gInV0aWxpdHkiLCBpJDEgPSAidXRpbGl0eS1kdW8iLCBJJDEgPSAidXRpbGl0eS1maWxsIiwgRiQxID0gIndoaXRlYm9hcmQiLCB2JDEgPSAiQ2xhc3NpYyIsIFMkMSA9ICJEdW90b25lIiwgQSQxID0gIlNoYXJwIiwgUCQxID0gIlNoYXJwIER1b3RvbmUiLCBqJDEgPSAiQ2hpc2VsIiwgQiQxID0gIkV0Y2giLCBOJDEgPSAiR3JhcGhpdGUiLCBrJDEgPSAiSmVsbHkiLCBEJDEgPSAiSmVsbHkgRHVvIiwgQyQxID0gIkplbGx5IEZpbGwiLCBUJDEgPSAiTm90ZG9nIiwgTCQxID0gIk5vdGRvZyBEdW8iLCBXJDEgPSAiU2xhYiIsIFIkMSA9ICJTbGFiIFByZXNzIiwgSyQxID0gIlRodW1icHJpbnQiLCBVJDEgPSAiVXRpbGl0eSIsIEokMSA9ICJVdGlsaXR5IER1byIsIEUkMSA9ICJVdGlsaXR5IEZpbGwiLCBfJDEgPSAiV2hpdGVib2FyZCIsIHd0JDEgPSAoX3d0ID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfd3QsIGgkMSwgdiQxKSwgbyQxLCBTJDEpLCBuJDEsIEEkMSksIHMkMSwgUCQxKSwgdSQxLCBqJDEpLCBnJDEsIEIkMSksIHkkMSwgTiQxKSwgbSQxLCBrJDEpLCBhJDEsIEQkMSksIHAkMSwgQyQxKSwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX3d0LCB3JDEsIFQkMSksIGUkMSwgTCQxKSwgYiQxLCBXJDEpLCBjJDEsIFIkMSksIHIkMSwgSyQxKSwgeCQxLCBVJDEpLCBpJDEsIEokMSksIEkkMSwgRSQxKSwgRiQxLCBfJDEpKTsKICAgIEckMSA9ICJraXQiLCBkJDEgPSAia2l0LWR1b3RvbmUiLCBNJDEgPSAiS2l0IiwgTzMgPSAiS2l0IER1b3RvbmUiLCBkbCQxID0gX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgRyQxLCBNJDEpLCBkJDEsIE8zKTsKICAgIEhsID0gewogICAgICBjbGFzc2ljOiB7CiAgICAgICAgImZhLWJyYW5kcyI6ICJmYWIiLAogICAgICAgICJmYS1kdW90b25lIjogImZhZCIsCiAgICAgICAgImZhLWxpZ2h0IjogImZhbCIsCiAgICAgICAgImZhLXJlZ3VsYXIiOiAiZmFyIiwKICAgICAgICAiZmEtc29saWQiOiAiZmFzIiwKICAgICAgICAiZmEtdGhpbiI6ICJmYXQiCiAgICAgIH0sCiAgICAgIGR1b3RvbmU6IHsKICAgICAgICAiZmEtcmVndWxhciI6ICJmYWRyIiwKICAgICAgICAiZmEtbGlnaHQiOiAiZmFkbCIsCiAgICAgICAgImZhLXRoaW4iOiAiZmFkdCIKICAgICAgfSwKICAgICAgc2hhcnA6IHsKICAgICAgICAiZmEtc29saWQiOiAiZmFzcyIsCiAgICAgICAgImZhLXJlZ3VsYXIiOiAiZmFzciIsCiAgICAgICAgImZhLWxpZ2h0IjogImZhc2wiLAogICAgICAgICJmYS10aGluIjogImZhc3QiCiAgICAgIH0sCiAgICAgICJzaGFycC1kdW90b25lIjogewogICAgICAgICJmYS1zb2xpZCI6ICJmYXNkcyIsCiAgICAgICAgImZhLXJlZ3VsYXIiOiAiZmFzZHIiLAogICAgICAgICJmYS1saWdodCI6ICJmYXNkbCIsCiAgICAgICAgImZhLXRoaW4iOiAiZmFzZHQiCiAgICAgIH0sCiAgICAgIHNsYWI6IHsKICAgICAgICAiZmEtcmVndWxhciI6ICJmYXNsciIKICAgICAgfSwKICAgICAgInNsYWItcHJlc3MiOiB7CiAgICAgICAgImZhLXJlZ3VsYXIiOiAiZmFzbHByIgogICAgICB9LAogICAgICB3aGl0ZWJvYXJkOiB7CiAgICAgICAgImZhLXNlbWlib2xkIjogImZhd3NiIgogICAgICB9LAogICAgICB0aHVtYnByaW50OiB7CiAgICAgICAgImZhLWxpZ2h0IjogImZhdGwiCiAgICAgIH0sCiAgICAgIG5vdGRvZzogewogICAgICAgICJmYS1zb2xpZCI6ICJmYW5zIgogICAgICB9LAogICAgICAibm90ZG9nLWR1byI6IHsKICAgICAgICAiZmEtc29saWQiOiAiZmFuZHMiCiAgICAgIH0sCiAgICAgIGV0Y2g6IHsKICAgICAgICAiZmEtc29saWQiOiAiZmFlcyIKICAgICAgfSwKICAgICAgZ3JhcGhpdGU6IHsKICAgICAgICAiZmEtdGhpbiI6ICJmYWd0IgogICAgICB9LAogICAgICBqZWxseTogewogICAgICAgICJmYS1yZWd1bGFyIjogImZhanIiCiAgICAgIH0sCiAgICAgICJqZWxseS1maWxsIjogewogICAgICAgICJmYS1yZWd1bGFyIjogImZhamZyIgogICAgICB9LAogICAgICAiamVsbHktZHVvIjogewogICAgICAgICJmYS1yZWd1bGFyIjogImZhamRyIgogICAgICB9LAogICAgICBjaGlzZWw6IHsKICAgICAgICAiZmEtcmVndWxhciI6ICJmYWNyIgogICAgICB9LAogICAgICB1dGlsaXR5OiB7CiAgICAgICAgImZhLXNlbWlib2xkIjogImZhdXNiIgogICAgICB9LAogICAgICAidXRpbGl0eS1kdW8iOiB7CiAgICAgICAgImZhLXNlbWlib2xkIjogImZhdWRzYiIKICAgICAgfSwKICAgICAgInV0aWxpdHktZmlsbCI6IHsKICAgICAgICAiZmEtc2VtaWJvbGQiOiAiZmF1ZnNiIgogICAgICB9CiAgICB9LCBZJDEgPSB7CiAgICAgIGNsYXNzaWM6IFsiZmFzIiwgImZhciIsICJmYWwiLCAiZmF0IiwgImZhZCJdLAogICAgICBkdW90b25lOiBbImZhZHIiLCAiZmFkbCIsICJmYWR0Il0sCiAgICAgIHNoYXJwOiBbImZhc3MiLCAiZmFzciIsICJmYXNsIiwgImZhc3QiXSwKICAgICAgInNoYXJwLWR1b3RvbmUiOiBbImZhc2RzIiwgImZhc2RyIiwgImZhc2RsIiwgImZhc2R0Il0sCiAgICAgIHNsYWI6IFsiZmFzbHIiXSwKICAgICAgInNsYWItcHJlc3MiOiBbImZhc2xwciJdLAogICAgICB3aGl0ZWJvYXJkOiBbImZhd3NiIl0sCiAgICAgIHRodW1icHJpbnQ6IFsiZmF0bCJdLAogICAgICBub3Rkb2c6IFsiZmFucyJdLAogICAgICAibm90ZG9nLWR1byI6IFsiZmFuZHMiXSwKICAgICAgZXRjaDogWyJmYWVzIl0sCiAgICAgIGdyYXBoaXRlOiBbImZhZ3QiXSwKICAgICAgamVsbHk6IFsiZmFqciJdLAogICAgICAiamVsbHktZmlsbCI6IFsiZmFqZnIiXSwKICAgICAgImplbGx5LWR1byI6IFsiZmFqZHIiXSwKICAgICAgY2hpc2VsOiBbImZhY3IiXSwKICAgICAgdXRpbGl0eTogWyJmYXVzYiJdLAogICAgICAidXRpbGl0eS1kdW8iOiBbImZhdWRzYiJdLAogICAgICAidXRpbGl0eS1maWxsIjogWyJmYXVmc2IiXQogICAgfSwgWGwgPSB7CiAgICAgIGNsYXNzaWM6IHsKICAgICAgICBmYWI6ICJmYS1icmFuZHMiLAogICAgICAgIGZhZDogImZhLWR1b3RvbmUiLAogICAgICAgIGZhbDogImZhLWxpZ2h0IiwKICAgICAgICBmYXI6ICJmYS1yZWd1bGFyIiwKICAgICAgICBmYXM6ICJmYS1zb2xpZCIsCiAgICAgICAgZmF0OiAiZmEtdGhpbiIKICAgICAgfSwKICAgICAgZHVvdG9uZTogewogICAgICAgIGZhZHI6ICJmYS1yZWd1bGFyIiwKICAgICAgICBmYWRsOiAiZmEtbGlnaHQiLAogICAgICAgIGZhZHQ6ICJmYS10aGluIgogICAgICB9LAogICAgICBzaGFycDogewogICAgICAgIGZhc3M6ICJmYS1zb2xpZCIsCiAgICAgICAgZmFzcjogImZhLXJlZ3VsYXIiLAogICAgICAgIGZhc2w6ICJmYS1saWdodCIsCiAgICAgICAgZmFzdDogImZhLXRoaW4iCiAgICAgIH0sCiAgICAgICJzaGFycC1kdW90b25lIjogewogICAgICAgIGZhc2RzOiAiZmEtc29saWQiLAogICAgICAgIGZhc2RyOiAiZmEtcmVndWxhciIsCiAgICAgICAgZmFzZGw6ICJmYS1saWdodCIsCiAgICAgICAgZmFzZHQ6ICJmYS10aGluIgogICAgICB9LAogICAgICBzbGFiOiB7CiAgICAgICAgZmFzbHI6ICJmYS1yZWd1bGFyIgogICAgICB9LAogICAgICAic2xhYi1wcmVzcyI6IHsKICAgICAgICBmYXNscHI6ICJmYS1yZWd1bGFyIgogICAgICB9LAogICAgICB3aGl0ZWJvYXJkOiB7CiAgICAgICAgZmF3c2I6ICJmYS1zZW1pYm9sZCIKICAgICAgfSwKICAgICAgdGh1bWJwcmludDogewogICAgICAgIGZhdGw6ICJmYS1saWdodCIKICAgICAgfSwKICAgICAgbm90ZG9nOiB7CiAgICAgICAgZmFuczogImZhLXNvbGlkIgogICAgICB9LAogICAgICAibm90ZG9nLWR1byI6IHsKICAgICAgICBmYW5kczogImZhLXNvbGlkIgogICAgICB9LAogICAgICBldGNoOiB7CiAgICAgICAgZmFlczogImZhLXNvbGlkIgogICAgICB9LAogICAgICBncmFwaGl0ZTogewogICAgICAgIGZhZ3Q6ICJmYS10aGluIgogICAgICB9LAogICAgICBqZWxseTogewogICAgICAgIGZhanI6ICJmYS1yZWd1bGFyIgogICAgICB9LAogICAgICAiamVsbHktZmlsbCI6IHsKICAgICAgICBmYWpmcjogImZhLXJlZ3VsYXIiCiAgICAgIH0sCiAgICAgICJqZWxseS1kdW8iOiB7CiAgICAgICAgZmFqZHI6ICJmYS1yZWd1bGFyIgogICAgICB9LAogICAgICBjaGlzZWw6IHsKICAgICAgICBmYWNyOiAiZmEtcmVndWxhciIKICAgICAgfSwKICAgICAgdXRpbGl0eTogewogICAgICAgIGZhdXNiOiAiZmEtc2VtaWJvbGQiCiAgICAgIH0sCiAgICAgICJ1dGlsaXR5LWR1byI6IHsKICAgICAgICBmYXVkc2I6ICJmYS1zZW1pYm9sZCIKICAgICAgfSwKICAgICAgInV0aWxpdHktZmlsbCI6IHsKICAgICAgICBmYXVmc2I6ICJmYS1zZW1pYm9sZCIKICAgICAgfQogICAgfSwgViQxID0gWyJmYS1zb2xpZCIsICJmYS1yZWd1bGFyIiwgImZhLWxpZ2h0IiwgImZhLXRoaW4iLCAiZmEtZHVvdG9uZSIsICJmYS1icmFuZHMiLCAiZmEtc2VtaWJvbGQiXSwgbG8gPSBbImZhIiwgImZhcyIsICJmYXIiLCAiZmFsIiwgImZhdCIsICJmYWQiLCAiZmFkciIsICJmYWRsIiwgImZhZHQiLCAiZmFiIiwgImZhc3MiLCAiZmFzciIsICJmYXNsIiwgImZhc3QiLCAiZmFzZHMiLCAiZmFzZHIiLCAiZmFzZGwiLCAiZmFzZHQiLCAiZmFzbHIiLCAiZmFzbHByIiwgImZhd3NiIiwgImZhdGwiLCAiZmFucyIsICJmYW5kcyIsICJmYWVzIiwgImZhZ3QiLCAiZmFqciIsICJmYWpmciIsICJmYWpkciIsICJmYWNyIiwgImZhdXNiIiwgImZhdWRzYiIsICJmYXVmc2IiXS5jb25jYXQoZiQxLCBWJDEpLCAkMyA9IFsic29saWQiLCAicmVndWxhciIsICJsaWdodCIsICJ0aGluIiwgImR1b3RvbmUiLCAiYnJhbmRzIiwgInNlbWlib2xkIl0sIHokMSA9IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF0sIHEkMSA9IHokMS5jb25jYXQoWzExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwXSksIEgkMSA9IFsiYXciLCAiZnciLCAicHVsbC1sZWZ0IiwgInB1bGwtcmlnaHQiXSwgc28gPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KE9iamVjdC5rZXlzKFkkMSkpLCAkMywgSCQxLCBbIjJ4cyIsICJ4cyIsICJzbSIsICJsZyIsICJ4bCIsICIyeGwiLCAiYmVhdCIsICJib3JkZXIiLCAiZmFkZSIsICJiZWF0LWZhZGUiLCAiYm91bmNlIiwgImZsaXAtYm90aCIsICJmbGlwLWhvcml6b250YWwiLCAiZmxpcC12ZXJ0aWNhbCIsICJmbGlwIiwgImludmVyc2UiLCAibGF5ZXJzIiwgImxheWVycy1ib3R0b20tbGVmdCIsICJsYXllcnMtYm90dG9tLXJpZ2h0IiwgImxheWVycy1jb3VudGVyIiwgImxheWVycy10ZXh0IiwgImxheWVycy10b3AtbGVmdCIsICJsYXllcnMtdG9wLXJpZ2h0IiwgImxpIiwgInB1bGwtZW5kIiwgInB1bGwtc3RhcnQiLCAicHVsc2UiLCAicm90YXRlLTE4MCIsICJyb3RhdGUtMjcwIiwgInJvdGF0ZS05MCIsICJyb3RhdGUtYnkiLCAic2hha2UiLCAic3Bpbi1wdWxzZSIsICJzcGluLXJldmVyc2UiLCAic3BpbiIsICJzdGFjay0xeCIsICJzdGFjay0yeCIsICJzdGFjayIsICJ1bCIsICJ3aWR0aC1hdXRvIiwgIndpZHRoLWZpeGVkIiwgdCQxLkdST1VQLCB0JDEuU1dBUF9PUEFDSVRZLCB0JDEuUFJJTUFSWSwgdCQxLlNFQ09OREFSWV0pLmNvbmNhdCh6JDEubWFwKGZ1bmN0aW9uKGw2KSB7CiAgICAgIHJldHVybiAiIi5jb25jYXQobDYsICJ4Iik7CiAgICB9KSkuY29uY2F0KHEkMS5tYXAoZnVuY3Rpb24obDYpIHsKICAgICAgcmV0dXJuICJ3LSIuY29uY2F0KGw2KTsKICAgIH0pKTsKICAgIGZvID0gewogICAgICAiRm9udCBBd2Vzb21lIDUgRnJlZSI6IHsKICAgICAgICA5MDA6ICJmYXMiLAogICAgICAgIDQwMDogImZhciIKICAgICAgfSwKICAgICAgIkZvbnQgQXdlc29tZSA1IFBybyI6IHsKICAgICAgICA5MDA6ICJmYXMiLAogICAgICAgIDQwMDogImZhciIsCiAgICAgICAgbm9ybWFsOiAiZmFyIiwKICAgICAgICAzMDA6ICJmYWwiCiAgICAgIH0sCiAgICAgICJGb250IEF3ZXNvbWUgNSBCcmFuZHMiOiB7CiAgICAgICAgNDAwOiAiZmFiIiwKICAgICAgICBub3JtYWw6ICJmYWIiCiAgICAgIH0sCiAgICAgICJGb250IEF3ZXNvbWUgNSBEdW90b25lIjogewogICAgICAgIDkwMDogImZhZCIKICAgICAgfQogICAgfTsKICAgIE5BTUVTUEFDRV9JREVOVElGSUVSID0gIl9fX0ZPTlRfQVdFU09NRV9fXyI7CiAgICBVTklUU19JTl9HUklEID0gMTY7CiAgICBERUZBVUxUX0NTU19QUkVGSVggPSAiZmEiOwogICAgREVGQVVMVF9SRVBMQUNFTUVOVF9DTEFTUyA9ICJzdmctaW5saW5lLS1mYSI7CiAgICBEQVRBX0ZBX0kyU1ZHID0gImRhdGEtZmEtaTJzdmciOwogICAgREFUQV9GQV9QU0VVRE9fRUxFTUVOVCA9ICJkYXRhLWZhLXBzZXVkby1lbGVtZW50IjsKICAgIERBVEFfRkFfUFNFVURPX0VMRU1FTlRfUEVORElORyA9ICJkYXRhLWZhLXBzZXVkby1lbGVtZW50LXBlbmRpbmciOwogICAgREFUQV9QUkVGSVggPSAiZGF0YS1wcmVmaXgiOwogICAgREFUQV9JQ09OID0gImRhdGEtaWNvbiI7CiAgICBIVE1MX0NMQVNTX0kyU1ZHX0JBU0VfQ0xBU1MgPSAiZm9udGF3ZXNvbWUtaTJzdmciOwogICAgTVVUQVRJT05fQVBQUk9BQ0hfQVNZTkMgPSAiYXN5bmMiOwogICAgVEFHTkFNRVNfVE9fU0tJUF9GT1JfUFNFVURPRUxFTUVOVFMgPSBbIkhUTUwiLCAiSEVBRCIsICJTVFlMRSIsICJTQ1JJUFQiXTsKICAgIFBTRVVET19FTEVNRU5UUyA9IFsiOjpiZWZvcmUiLCAiOjphZnRlciIsICI6YmVmb3JlIiwgIjphZnRlciJdOwogICAgUFJPRFVDVElPTiA9IChmdW5jdGlvbigpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0gY2F0Y2ggKGUkJDEpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0pKCk7CiAgICBfUFJFRklYX1RPX1NUWUxFID0gX29iamVjdFNwcmVhZDIoe30sIFEpOwogICAgX1BSRUZJWF9UT19TVFlMRVtpMTBdID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIHsKICAgICAgImZhLWR1b3RvbmUiOiAiZHVvdG9uZSIKICAgIH0pLCBRW2kxMF0pLCBRdFsia2l0Il0pLCBRdFsia2l0LWR1b3RvbmUiXSk7CiAgICBQUkVGSVhfVE9fU1RZTEUgPSBmYW1pbHlQcm94eShfUFJFRklYX1RPX1NUWUxFKTsKICAgIF9TVFlMRV9UT19QUkVGSVggPSBfb2JqZWN0U3ByZWFkMih7fSwgTXQpOwogICAgX1NUWUxFX1RPX1BSRUZJWFtpMTBdID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIHsKICAgICAgZHVvdG9uZTogImZhZCIKICAgIH0pLCBfU1RZTEVfVE9fUFJFRklYW2kxMF0pLCBtbFsia2l0Il0pLCBtbFsia2l0LWR1b3RvbmUiXSk7CiAgICBTVFlMRV9UT19QUkVGSVggPSBmYW1pbHlQcm94eShfU1RZTEVfVE9fUFJFRklYKTsKICAgIF9QUkVGSVhfVE9fTE9OR19TVFlMRSA9IF9vYmplY3RTcHJlYWQyKHt9LCBYbCk7CiAgICBfUFJFRklYX1RPX0xPTkdfU1RZTEVbaTEwXSA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBfUFJFRklYX1RPX0xPTkdfU1RZTEVbaTEwXSksIG5sWyJraXQiXSk7CiAgICBQUkVGSVhfVE9fTE9OR19TVFlMRSA9IGZhbWlseVByb3h5KF9QUkVGSVhfVE9fTE9OR19TVFlMRSk7CiAgICBfTE9OR19TVFlMRV9UT19QUkVGSVggPSBfb2JqZWN0U3ByZWFkMih7fSwgSGwpOwogICAgX0xPTkdfU1RZTEVfVE9fUFJFRklYW2kxMF0gPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgX0xPTkdfU1RZTEVfVE9fUFJFRklYW2kxMF0pLCBzbFsia2l0Il0pOwogICAgTE9OR19TVFlMRV9UT19QUkVGSVggPSBmYW1pbHlQcm94eShfTE9OR19TVFlMRV9UT19QUkVGSVgpOwogICAgSUNPTl9TRUxFQ1RJT05fU1lOVEFYX1BBVFRFUk4gPSBHOwogICAgTEFZRVJTX1RFWFRfQ0xBU1NOQU1FID0gImZhLWxheWVycy10ZXh0IjsKICAgIEZPTlRfRkFNSUxZX1BBVFRFUk4gPSBNMzsKICAgIF9GT05UX1dFSUdIVF9UT19QUkVGSVggPSBfb2JqZWN0U3ByZWFkMih7fSwgeXQpOwogICAgRk9OVF9XRUlHSFRfVE9fUFJFRklYID0gZmFtaWx5UHJveHkoX0ZPTlRfV0VJR0hUX1RPX1BSRUZJWCk7CiAgICBBVFRSSUJVVEVTX1dBVENIRURfRk9SX01VVEFUSU9OID0gWyJjbGFzcyIsICJkYXRhLXByZWZpeCIsICJkYXRhLWljb24iLCAiZGF0YS1mYS10cmFuc2Zvcm0iLCAiZGF0YS1mYS1tYXNrIl07CiAgICBEVU9UT05FX0NMQVNTRVMgPSBYOwogICAgUkVTRVJWRURfQ0xBU1NFUyA9IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoWHQpLCBfdG9Db25zdW1hYmxlQXJyYXkoc28pKTsKICAgIGluaXRpYWwgPSBXSU5ET1cuRm9udEF3ZXNvbWVDb25maWcgfHwge307CiAgICBpZiAoRE9DVU1FTlQgJiYgdHlwZW9mIERPQ1VNRU5ULnF1ZXJ5U2VsZWN0b3IgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgYXR0cnMgPSBbWyJkYXRhLWZhbWlseS1wcmVmaXgiLCAiZmFtaWx5UHJlZml4Il0sIFsiZGF0YS1jc3MtcHJlZml4IiwgImNzc1ByZWZpeCJdLCBbImRhdGEtZmFtaWx5LWRlZmF1bHQiLCAiZmFtaWx5RGVmYXVsdCJdLCBbImRhdGEtc3R5bGUtZGVmYXVsdCIsICJzdHlsZURlZmF1bHQiXSwgWyJkYXRhLXJlcGxhY2VtZW50LWNsYXNzIiwgInJlcGxhY2VtZW50Q2xhc3MiXSwgWyJkYXRhLWF1dG8tcmVwbGFjZS1zdmciLCAiYXV0b1JlcGxhY2VTdmciXSwgWyJkYXRhLWF1dG8tYWRkLWNzcyIsICJhdXRvQWRkQ3NzIl0sIFsiZGF0YS1zZWFyY2gtcHNldWRvLWVsZW1lbnRzIiwgInNlYXJjaFBzZXVkb0VsZW1lbnRzIl0sIFsiZGF0YS1zZWFyY2gtcHNldWRvLWVsZW1lbnRzLXdhcm5pbmdzIiwgInNlYXJjaFBzZXVkb0VsZW1lbnRzV2FybmluZ3MiXSwgWyJkYXRhLXNlYXJjaC1wc2V1ZG8tZWxlbWVudHMtZnVsbC1zY2FuIiwgInNlYXJjaFBzZXVkb0VsZW1lbnRzRnVsbFNjYW4iXSwgWyJkYXRhLW9ic2VydmUtbXV0YXRpb25zIiwgIm9ic2VydmVNdXRhdGlvbnMiXSwgWyJkYXRhLW11dGF0ZS1hcHByb2FjaCIsICJtdXRhdGVBcHByb2FjaCJdLCBbImRhdGEta2VlcC1vcmlnaW5hbC1zb3VyY2UiLCAia2VlcE9yaWdpbmFsU291cmNlIl0sIFsiZGF0YS1tZWFzdXJlLXBlcmZvcm1hbmNlIiwgIm1lYXN1cmVQZXJmb3JtYW5jZSJdLCBbImRhdGEtc2hvdy1taXNzaW5nLWljb25zIiwgInNob3dNaXNzaW5nSWNvbnMiXV07CiAgICAgIGF0dHJzLmZvckVhY2goZnVuY3Rpb24oX3JlZjIpIHsKICAgICAgICB2YXIgX3JlZjIyID0gX3NsaWNlZFRvQXJyYXkoX3JlZjIsIDIpLCBhdHRyID0gX3JlZjIyWzBdLCBrZXkyID0gX3JlZjIyWzFdOwogICAgICAgIHZhciB2YWwgPSBjb2VyY2UoZ2V0QXR0ckNvbmZpZyhhdHRyKSk7CiAgICAgICAgaWYgKHZhbCAhPT0gdm9pZCAwICYmIHZhbCAhPT0gbnVsbCkgewogICAgICAgICAgaW5pdGlhbFtrZXkyXSA9IHZhbDsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgX2RlZmF1bHQgPSB7CiAgICAgIHN0eWxlRGVmYXVsdDogInNvbGlkIiwKICAgICAgZmFtaWx5RGVmYXVsdDogaTEwLAogICAgICBjc3NQcmVmaXg6IERFRkFVTFRfQ1NTX1BSRUZJWCwKICAgICAgcmVwbGFjZW1lbnRDbGFzczogREVGQVVMVF9SRVBMQUNFTUVOVF9DTEFTUywKICAgICAgYXV0b1JlcGxhY2VTdmc6IHRydWUsCiAgICAgIGF1dG9BZGRDc3M6IHRydWUsCiAgICAgIHNlYXJjaFBzZXVkb0VsZW1lbnRzOiBmYWxzZSwKICAgICAgc2VhcmNoUHNldWRvRWxlbWVudHNXYXJuaW5nczogdHJ1ZSwKICAgICAgc2VhcmNoUHNldWRvRWxlbWVudHNGdWxsU2NhbjogZmFsc2UsCiAgICAgIG9ic2VydmVNdXRhdGlvbnM6IHRydWUsCiAgICAgIG11dGF0ZUFwcHJvYWNoOiAiYXN5bmMiLAogICAgICBrZWVwT3JpZ2luYWxTb3VyY2U6IHRydWUsCiAgICAgIG1lYXN1cmVQZXJmb3JtYW5jZTogZmFsc2UsCiAgICAgIHNob3dNaXNzaW5nSWNvbnM6IHRydWUKICAgIH07CiAgICBpZiAoaW5pdGlhbC5mYW1pbHlQcmVmaXgpIHsKICAgICAgaW5pdGlhbC5jc3NQcmVmaXggPSBpbml0aWFsLmZhbWlseVByZWZpeDsKICAgIH0KICAgIF9jb25maWcgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgX2RlZmF1bHQpLCBpbml0aWFsKTsKICAgIGlmICghX2NvbmZpZy5hdXRvUmVwbGFjZVN2ZykgX2NvbmZpZy5vYnNlcnZlTXV0YXRpb25zID0gZmFsc2U7CiAgICBjb25maWcyID0ge307CiAgICBPYmplY3Qua2V5cyhfZGVmYXVsdCkuZm9yRWFjaChmdW5jdGlvbihrZXkyKSB7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb25maWcyLCBrZXkyLCB7CiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldDModmFsKSB7CiAgICAgICAgICBfY29uZmlnW2tleTJdID0gdmFsOwogICAgICAgICAgX29uQ2hhbmdlQ2IuZm9yRWFjaChmdW5jdGlvbihjYikgewogICAgICAgICAgICByZXR1cm4gY2IoY29uZmlnMik7CiAgICAgICAgICB9KTsKICAgICAgICB9LAogICAgICAgIGdldDogZnVuY3Rpb24gZ2V0MigpIHsKICAgICAgICAgIHJldHVybiBfY29uZmlnW2tleTJdOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb25maWcyLCAiZmFtaWx5UHJlZml4IiwgewogICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICBzZXQ6IGZ1bmN0aW9uIHNldDIodmFsKSB7CiAgICAgICAgX2NvbmZpZy5jc3NQcmVmaXggPSB2YWw7CiAgICAgICAgX29uQ2hhbmdlQ2IuZm9yRWFjaChmdW5jdGlvbihjYikgewogICAgICAgICAgcmV0dXJuIGNiKGNvbmZpZzIpOwogICAgICAgIH0pOwogICAgICB9LAogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICByZXR1cm4gX2NvbmZpZy5jc3NQcmVmaXg7CiAgICAgIH0KICAgIH0pOwogICAgV0lORE9XLkZvbnRBd2Vzb21lQ29uZmlnID0gY29uZmlnMjsKICAgIF9vbkNoYW5nZUNiID0gW107CiAgICBkJDIgPSBVTklUU19JTl9HUklEOwogICAgbWVhbmluZ2xlc3NUcmFuc2Zvcm0gPSB7CiAgICAgIHNpemU6IDE2LAogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICByb3RhdGU6IDAsCiAgICAgIGZsaXBYOiBmYWxzZSwKICAgICAgZmxpcFk6IGZhbHNlCiAgICB9OwogICAgaWRQb29sID0gIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsKICAgIGJhc2VTdHlsZXMgPSAiOnJvb3QsIDpob3N0IHtcbiAgLS1mYS1mb250LXNvbGlkOiBub3JtYWwgOTAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBGcmVlJztcbiAgLS1mYS1mb250LXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IEZyZWUnO1xuICAtLWZhLWZvbnQtbGlnaHQ6IG5vcm1hbCAzMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFBybyc7XG4gIC0tZmEtZm9udC10aGluOiBub3JtYWwgMTAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBQcm8nO1xuICAtLWZhLWZvbnQtZHVvdG9uZTogbm9ybWFsIDkwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgRHVvdG9uZSc7XG4gIC0tZmEtZm9udC1kdW90b25lLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IER1b3RvbmUnO1xuICAtLWZhLWZvbnQtZHVvdG9uZS1saWdodDogbm9ybWFsIDMwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgRHVvdG9uZSc7XG4gIC0tZmEtZm9udC1kdW90b25lLXRoaW46IG5vcm1hbCAxMDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IER1b3RvbmUnO1xuICAtLWZhLWZvbnQtYnJhbmRzOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBCcmFuZHMnO1xuICAtLWZhLWZvbnQtc2hhcnAtc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNoYXJwJztcbiAgLS1mYS1mb250LXNoYXJwLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNoYXJwJztcbiAgLS1mYS1mb250LXNoYXJwLWxpZ2h0OiBub3JtYWwgMzAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBTaGFycCc7XG4gIC0tZmEtZm9udC1zaGFycC10aGluOiBub3JtYWwgMTAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBTaGFycCc7XG4gIC0tZmEtZm9udC1zaGFycC1kdW90b25lLXNvbGlkOiBub3JtYWwgOTAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBTaGFycCBEdW90b25lJztcbiAgLS1mYS1mb250LXNoYXJwLWR1b3RvbmUtcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgU2hhcnAgRHVvdG9uZSc7XG4gIC0tZmEtZm9udC1zaGFycC1kdW90b25lLWxpZ2h0OiBub3JtYWwgMzAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBTaGFycCBEdW90b25lJztcbiAgLS1mYS1mb250LXNoYXJwLWR1b3RvbmUtdGhpbjogbm9ybWFsIDEwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgU2hhcnAgRHVvdG9uZSc7XG4gIC0tZmEtZm9udC1zbGFiLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFNsYWInO1xuICAtLWZhLWZvbnQtc2xhYi1wcmVzcy1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBTbGFiIFByZXNzJztcbiAgLS1mYS1mb250LXdoaXRlYm9hcmQtc2VtaWJvbGQ6IG5vcm1hbCA2MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFdoaXRlYm9hcmQnO1xuICAtLWZhLWZvbnQtdGh1bWJwcmludC1saWdodDogbm9ybWFsIDMwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgVGh1bWJwcmludCc7XG4gIC0tZmEtZm9udC1ub3Rkb2ctc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IE5vdGRvZyc7XG4gIC0tZmEtZm9udC1ub3Rkb2ctZHVvLXNvbGlkOiBub3JtYWwgOTAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBOb3Rkb2cgRHVvJztcbiAgLS1mYS1mb250LWV0Y2gtc29saWQ6IG5vcm1hbCA5MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IEV0Y2gnO1xuICAtLWZhLWZvbnQtZ3JhcGhpdGUtdGhpbjogbm9ybWFsIDEwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgR3JhcGhpdGUnO1xuICAtLWZhLWZvbnQtamVsbHktcmVndWxhcjogbm9ybWFsIDQwMCAxZW0vMSAnRm9udCBBd2Vzb21lIDcgSmVsbHknO1xuICAtLWZhLWZvbnQtamVsbHktZmlsbC1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBKZWxseSBGaWxsJztcbiAgLS1mYS1mb250LWplbGx5LWR1by1yZWd1bGFyOiBub3JtYWwgNDAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBKZWxseSBEdW8nO1xuICAtLWZhLWZvbnQtY2hpc2VsLXJlZ3VsYXI6IG5vcm1hbCA0MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IENoaXNlbCc7XG4gIC0tZmEtZm9udC11dGlsaXR5LXNlbWlib2xkOiBub3JtYWwgNjAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBVdGlsaXR5JztcbiAgLS1mYS1mb250LXV0aWxpdHktZHVvLXNlbWlib2xkOiBub3JtYWwgNjAwIDFlbS8xICdGb250IEF3ZXNvbWUgNyBVdGlsaXR5IER1byc7XG4gIC0tZmEtZm9udC11dGlsaXR5LWZpbGwtc2VtaWJvbGQ6IG5vcm1hbCA2MDAgMWVtLzEgJ0ZvbnQgQXdlc29tZSA3IFV0aWxpdHkgRmlsbCc7XG59XG5cbi5zdmctaW5saW5lLS1mYSB7XG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICBkaXNwbGF5OiB2YXIoLS1mYS1kaXNwbGF5LCBpbmxpbmUtYmxvY2spO1xuICBoZWlnaHQ6IDFlbTtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG4gIHZlcnRpY2FsLWFsaWduOiAtMC4xMjVlbTtcbiAgd2lkdGg6IHZhcigtLWZhLXdpZHRoLCAxLjI1ZW0pO1xufVxuLnN2Zy1pbmxpbmUtLWZhLmZhLTJ4cyB7XG4gIHZlcnRpY2FsLWFsaWduOiAwLjFlbTtcbn1cbi5zdmctaW5saW5lLS1mYS5mYS14cyB7XG4gIHZlcnRpY2FsLWFsaWduOiAwZW07XG59XG4uc3ZnLWlubGluZS0tZmEuZmEtc20ge1xuICB2ZXJ0aWNhbC1hbGlnbjogLTAuMDcxNDI4NTcxNGVtO1xufVxuLnN2Zy1pbmxpbmUtLWZhLmZhLWxnIHtcbiAgdmVydGljYWwtYWxpZ246IC0wLjJlbTtcbn1cbi5zdmctaW5saW5lLS1mYS5mYS14bCB7XG4gIHZlcnRpY2FsLWFsaWduOiAtMC4yNWVtO1xufVxuLnN2Zy1pbmxpbmUtLWZhLmZhLTJ4bCB7XG4gIHZlcnRpY2FsLWFsaWduOiAtMC4zMTI1ZW07XG59XG4uc3ZnLWlubGluZS0tZmEuZmEtcHVsbC1sZWZ0LFxuLnN2Zy1pbmxpbmUtLWZhIC5mYS1wdWxsLXN0YXJ0IHtcbiAgZmxvYXQ6IGlubGluZS1zdGFydDtcbiAgbWFyZ2luLWlubGluZS1lbmQ6IHZhcigtLWZhLXB1bGwtbWFyZ2luLCAwLjNlbSk7XG59XG4uc3ZnLWlubGluZS0tZmEuZmEtcHVsbC1yaWdodCxcbi5zdmctaW5saW5lLS1mYSAuZmEtcHVsbC1lbmQge1xuICBmbG9hdDogaW5saW5lLWVuZDtcbiAgbWFyZ2luLWlubGluZS1zdGFydDogdmFyKC0tZmEtcHVsbC1tYXJnaW4sIDAuM2VtKTtcbn1cbi5zdmctaW5saW5lLS1mYS5mYS1saSB7XG4gIHdpZHRoOiB2YXIoLS1mYS1saS13aWR0aCwgMmVtKTtcbiAgaW5zZXQtaW5saW5lLXN0YXJ0OiBjYWxjKC0xICogdmFyKC0tZmEtbGktd2lkdGgsIDJlbSkpO1xuICBpbnNldC1ibG9jay1zdGFydDogMC4yNWVtOyAvKiBzeW5jaW5nIHZlcnRpY2FsIGFsaWdubWVudCB3aXRoIFdlYiBGb250IHJlbmRlcmluZyAqL1xufVxuXG4uZmEtbGF5ZXJzLWNvdW50ZXIsIC5mYS1sYXllcnMtdGV4dCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi5mYS1sYXllcnMge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGhlaWdodDogMWVtO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdmVydGljYWwtYWxpZ246IC0wLjEyNWVtO1xuICB3aWR0aDogdmFyKC0tZmEtd2lkdGgsIDEuMjVlbSk7XG59XG4uZmEtbGF5ZXJzIC5zdmctaW5saW5lLS1mYSB7XG4gIGluc2V0OiAwO1xuICBtYXJnaW46IGF1dG87XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjtcbn1cblxuLmZhLWxheWVycy10ZXh0IHtcbiAgbGVmdDogNTAlO1xuICB0b3A6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7XG59XG5cbi5mYS1sYXllcnMtY291bnRlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhLWNvdW50ZXItYmFja2dyb3VuZC1jb2xvciwgI2ZmMjUzYSk7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLWZhLWNvdW50ZXItYm9yZGVyLXJhZGl1cywgMWVtKTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgY29sb3I6IHZhcigtLWZhLWludmVyc2UsICNmZmYpO1xuICBsaW5lLWhlaWdodDogdmFyKC0tZmEtY291bnRlci1saW5lLWhlaWdodCwgMSk7XG4gIG1heC13aWR0aDogdmFyKC0tZmEtY291bnRlci1tYXgtd2lkdGgsIDVlbSk7XG4gIG1pbi13aWR0aDogdmFyKC0tZmEtY291bnRlci1taW4td2lkdGgsIDEuNWVtKTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcGFkZGluZzogdmFyKC0tZmEtY291bnRlci1wYWRkaW5nLCAwLjI1ZW0gMC41ZW0pO1xuICByaWdodDogdmFyKC0tZmEtcmlnaHQsIDApO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgdG9wOiB2YXIoLS1mYS10b3AsIDApO1xuICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWNvdW50ZXItc2NhbGUsIDAuMjUpKTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIHJpZ2h0O1xufVxuXG4uZmEtbGF5ZXJzLWJvdHRvbS1yaWdodCB7XG4gIGJvdHRvbTogdmFyKC0tZmEtYm90dG9tLCAwKTtcbiAgcmlnaHQ6IHZhcigtLWZhLXJpZ2h0LCAwKTtcbiAgdG9wOiBhdXRvO1xuICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWxheWVycy1zY2FsZSwgMC4yNSkpO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiBib3R0b20gcmlnaHQ7XG59XG5cbi5mYS1sYXllcnMtYm90dG9tLWxlZnQge1xuICBib3R0b206IHZhcigtLWZhLWJvdHRvbSwgMCk7XG4gIGxlZnQ6IHZhcigtLWZhLWxlZnQsIDApO1xuICByaWdodDogYXV0bztcbiAgdG9wOiBhdXRvO1xuICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWxheWVycy1zY2FsZSwgMC4yNSkpO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiBib3R0b20gbGVmdDtcbn1cblxuLmZhLWxheWVycy10b3AtcmlnaHQge1xuICB0b3A6IHZhcigtLWZhLXRvcCwgMCk7XG4gIHJpZ2h0OiB2YXIoLS1mYS1yaWdodCwgMCk7XG4gIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtbGF5ZXJzLXNjYWxlLCAwLjI1KSk7XG4gIHRyYW5zZm9ybS1vcmlnaW46IHRvcCByaWdodDtcbn1cblxuLmZhLWxheWVycy10b3AtbGVmdCB7XG4gIGxlZnQ6IHZhcigtLWZhLWxlZnQsIDApO1xuICByaWdodDogYXV0bztcbiAgdG9wOiB2YXIoLS1mYS10b3AsIDApO1xuICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWxheWVycy1zY2FsZSwgMC4yNSkpO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDtcbn1cblxuLmZhLTF4IHtcbiAgZm9udC1zaXplOiAxZW07XG59XG5cbi5mYS0yeCB7XG4gIGZvbnQtc2l6ZTogMmVtO1xufVxuXG4uZmEtM3gge1xuICBmb250LXNpemU6IDNlbTtcbn1cblxuLmZhLTR4IHtcbiAgZm9udC1zaXplOiA0ZW07XG59XG5cbi5mYS01eCB7XG4gIGZvbnQtc2l6ZTogNWVtO1xufVxuXG4uZmEtNngge1xuICBmb250LXNpemU6IDZlbTtcbn1cblxuLmZhLTd4IHtcbiAgZm9udC1zaXplOiA3ZW07XG59XG5cbi5mYS04eCB7XG4gIGZvbnQtc2l6ZTogOGVtO1xufVxuXG4uZmEtOXgge1xuICBmb250LXNpemU6IDllbTtcbn1cblxuLmZhLTEweCB7XG4gIGZvbnQtc2l6ZTogMTBlbTtcbn1cblxuLmZhLTJ4cyB7XG4gIGZvbnQtc2l6ZTogY2FsYygxMCAvIDE2ICogMWVtKTsgLyogY29udmVydHMgYSAxMHB4IHNpemUgaW50byBhbiBlbS1iYXNlZCB2YWx1ZSB0aGF0J3MgcmVsYXRpdmUgdG8gdGhlIHNjYWxlJ3MgMTZweCBiYXNlICovXG4gIGxpbmUtaGVpZ2h0OiBjYWxjKDEgLyAxMCAqIDFlbSk7IC8qIHNldHMgdGhlIGxpbmUtaGVpZ2h0IG9mIHRoZSBpY29uIGJhY2sgdG8gdGhhdCBvZiBpdCdzIHBhcmVudCAqL1xuICB2ZXJ0aWNhbC1hbGlnbjogY2FsYygoNiAvIDEwIC0gMC4zNzUpICogMWVtKTsgLyogdmVydGljYWxseSBjZW50ZXJzIHRoZSBpY29uIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHN1cnJvdW5kaW5nIHRleHQncyBkZXNjZW5kZXIgKi9cbn1cblxuLmZhLXhzIHtcbiAgZm9udC1zaXplOiBjYWxjKDEyIC8gMTYgKiAxZW0pOyAvKiBjb252ZXJ0cyBhIDEycHggc2l6ZSBpbnRvIGFuIGVtLWJhc2VkIHZhbHVlIHRoYXQncyByZWxhdGl2ZSB0byB0aGUgc2NhbGUncyAxNnB4IGJhc2UgKi9cbiAgbGluZS1oZWlnaHQ6IGNhbGMoMSAvIDEyICogMWVtKTsgLyogc2V0cyB0aGUgbGluZS1oZWlnaHQgb2YgdGhlIGljb24gYmFjayB0byB0aGF0IG9mIGl0J3MgcGFyZW50ICovXG4gIHZlcnRpY2FsLWFsaWduOiBjYWxjKCg2IC8gMTIgLSAwLjM3NSkgKiAxZW0pOyAvKiB2ZXJ0aWNhbGx5IGNlbnRlcnMgdGhlIGljb24gdGFraW5nIGludG8gYWNjb3VudCB0aGUgc3Vycm91bmRpbmcgdGV4dCdzIGRlc2NlbmRlciAqL1xufVxuXG4uZmEtc20ge1xuICBmb250LXNpemU6IGNhbGMoMTQgLyAxNiAqIDFlbSk7IC8qIGNvbnZlcnRzIGEgMTRweCBzaXplIGludG8gYW4gZW0tYmFzZWQgdmFsdWUgdGhhdCdzIHJlbGF0aXZlIHRvIHRoZSBzY2FsZSdzIDE2cHggYmFzZSAqL1xuICBsaW5lLWhlaWdodDogY2FsYygxIC8gMTQgKiAxZW0pOyAvKiBzZXRzIHRoZSBsaW5lLWhlaWdodCBvZiB0aGUgaWNvbiBiYWNrIHRvIHRoYXQgb2YgaXQncyBwYXJlbnQgKi9cbiAgdmVydGljYWwtYWxpZ246IGNhbGMoKDYgLyAxNCAtIDAuMzc1KSAqIDFlbSk7IC8qIHZlcnRpY2FsbHkgY2VudGVycyB0aGUgaWNvbiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzdXJyb3VuZGluZyB0ZXh0J3MgZGVzY2VuZGVyICovXG59XG5cbi5mYS1sZyB7XG4gIGZvbnQtc2l6ZTogY2FsYygyMCAvIDE2ICogMWVtKTsgLyogY29udmVydHMgYSAyMHB4IHNpemUgaW50byBhbiBlbS1iYXNlZCB2YWx1ZSB0aGF0J3MgcmVsYXRpdmUgdG8gdGhlIHNjYWxlJ3MgMTZweCBiYXNlICovXG4gIGxpbmUtaGVpZ2h0OiBjYWxjKDEgLyAyMCAqIDFlbSk7IC8qIHNldHMgdGhlIGxpbmUtaGVpZ2h0IG9mIHRoZSBpY29uIGJhY2sgdG8gdGhhdCBvZiBpdCdzIHBhcmVudCAqL1xuICB2ZXJ0aWNhbC1hbGlnbjogY2FsYygoNiAvIDIwIC0gMC4zNzUpICogMWVtKTsgLyogdmVydGljYWxseSBjZW50ZXJzIHRoZSBpY29uIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHN1cnJvdW5kaW5nIHRleHQncyBkZXNjZW5kZXIgKi9cbn1cblxuLmZhLXhsIHtcbiAgZm9udC1zaXplOiBjYWxjKDI0IC8gMTYgKiAxZW0pOyAvKiBjb252ZXJ0cyBhIDI0cHggc2l6ZSBpbnRvIGFuIGVtLWJhc2VkIHZhbHVlIHRoYXQncyByZWxhdGl2ZSB0byB0aGUgc2NhbGUncyAxNnB4IGJhc2UgKi9cbiAgbGluZS1oZWlnaHQ6IGNhbGMoMSAvIDI0ICogMWVtKTsgLyogc2V0cyB0aGUgbGluZS1oZWlnaHQgb2YgdGhlIGljb24gYmFjayB0byB0aGF0IG9mIGl0J3MgcGFyZW50ICovXG4gIHZlcnRpY2FsLWFsaWduOiBjYWxjKCg2IC8gMjQgLSAwLjM3NSkgKiAxZW0pOyAvKiB2ZXJ0aWNhbGx5IGNlbnRlcnMgdGhlIGljb24gdGFraW5nIGludG8gYWNjb3VudCB0aGUgc3Vycm91bmRpbmcgdGV4dCdzIGRlc2NlbmRlciAqL1xufVxuXG4uZmEtMnhsIHtcbiAgZm9udC1zaXplOiBjYWxjKDMyIC8gMTYgKiAxZW0pOyAvKiBjb252ZXJ0cyBhIDMycHggc2l6ZSBpbnRvIGFuIGVtLWJhc2VkIHZhbHVlIHRoYXQncyByZWxhdGl2ZSB0byB0aGUgc2NhbGUncyAxNnB4IGJhc2UgKi9cbiAgbGluZS1oZWlnaHQ6IGNhbGMoMSAvIDMyICogMWVtKTsgLyogc2V0cyB0aGUgbGluZS1oZWlnaHQgb2YgdGhlIGljb24gYmFjayB0byB0aGF0IG9mIGl0J3MgcGFyZW50ICovXG4gIHZlcnRpY2FsLWFsaWduOiBjYWxjKCg2IC8gMzIgLSAwLjM3NSkgKiAxZW0pOyAvKiB2ZXJ0aWNhbGx5IGNlbnRlcnMgdGhlIGljb24gdGFraW5nIGludG8gYWNjb3VudCB0aGUgc3Vycm91bmRpbmcgdGV4dCdzIGRlc2NlbmRlciAqL1xufVxuXG4uZmEtd2lkdGgtYXV0byB7XG4gIC0tZmEtd2lkdGg6IGF1dG87XG59XG5cbi5mYS1mdyxcbi5mYS13aWR0aC1maXhlZCB7XG4gIC0tZmEtd2lkdGg6IDEuMjVlbTtcbn1cblxuLmZhLXVsIHtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICBtYXJnaW4taW5saW5lLXN0YXJ0OiB2YXIoLS1mYS1saS1tYXJnaW4sIDIuNWVtKTtcbiAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IDA7XG59XG4uZmEtdWwgPiBsaSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmZhLWxpIHtcbiAgaW5zZXQtaW5saW5lLXN0YXJ0OiBjYWxjKC0xICogdmFyKC0tZmEtbGktd2lkdGgsIDJlbSkpO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgd2lkdGg6IHZhcigtLWZhLWxpLXdpZHRoLCAyZW0pO1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbn1cblxuLyogSGVhZHMgVXA6IEJvcmRlcmVkIEljb25zIHdpbGwgbm90IGJlIHN1cHBvcnRlZCBpbiB0aGUgZnV0dXJlIVxuICAtIFRoaXMgZmVhdHVyZSB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZSBvZiBGb250IEF3ZXNvbWUgKHY4KSFcbiAgLSBZb3UgbWF5IGNvbnRpbnVlIHRvIHVzZSBpdCBpbiB0aGlzIHZlcnNpb24gKnY3KSwgYnV0IGl0IHdpbGwgbm90IGJlIHN1cHBvcnRlZCBpbiBGb250IEF3ZXNvbWUgdjguXG4qL1xuLyogTm90ZXM6XG4qIC0tQHt2LiRjc3MtcHJlZml4fS1ib3JkZXItd2lkdGggPSAxLzE2IGJ5IGRlZmF1bHQgKHRvIHJlbmRlciBhcyB+MXB4IGJhc2VkIG9uIGEgMTZweCBkZWZhdWx0IGZvbnQtc2l6ZSlcbiogLS1Ae3YuJGNzcy1wcmVmaXh9LWJvcmRlci1wYWRkaW5nID1cbiAgKiogMy8xNiBmb3IgdmVydGljYWwgcGFkZGluZyAodG8gZ2l2ZSB+MnB4IG9mIHZlcnRpY2FsIHdoaXRlc3BhY2UgYXJvdW5kIGFuIGljb24gY29uc2lkZXJpbmcgaXQncyB2ZXJ0aWNhbCBhbGlnbm1lbnQpXG4gICoqIDQvMTYgZm9yIGhvcml6b250YWwgcGFkZGluZyAodG8gZ2l2ZSB+NHB4IG9mIGhvcml6b250YWwgd2hpdGVzcGFjZSBhcm91bmQgYW4gaWNvbilcbiovXG4uZmEtYm9yZGVyIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYS1ib3JkZXItY29sb3IsICNlZWUpO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1mYS1ib3JkZXItcmFkaXVzLCAwLjFlbSk7XG4gIGJvcmRlci1zdHlsZTogdmFyKC0tZmEtYm9yZGVyLXN0eWxlLCBzb2xpZCk7XG4gIGJvcmRlci13aWR0aDogdmFyKC0tZmEtYm9yZGVyLXdpZHRoLCAwLjA2MjVlbSk7XG4gIGJveC1zaXppbmc6IHZhcigtLWZhLWJvcmRlci1ib3gtc2l6aW5nLCBjb250ZW50LWJveCk7XG4gIHBhZGRpbmc6IHZhcigtLWZhLWJvcmRlci1wYWRkaW5nLCAwLjE4NzVlbSAwLjI1ZW0pO1xufVxuXG4uZmEtcHVsbC1sZWZ0LFxuLmZhLXB1bGwtc3RhcnQge1xuICBmbG9hdDogaW5saW5lLXN0YXJ0O1xuICBtYXJnaW4taW5saW5lLWVuZDogdmFyKC0tZmEtcHVsbC1tYXJnaW4sIDAuM2VtKTtcbn1cblxuLmZhLXB1bGwtcmlnaHQsXG4uZmEtcHVsbC1lbmQge1xuICBmbG9hdDogaW5saW5lLWVuZDtcbiAgbWFyZ2luLWlubGluZS1zdGFydDogdmFyKC0tZmEtcHVsbC1tYXJnaW4sIDAuM2VtKTtcbn1cblxuLmZhLWJlYXQge1xuICBhbmltYXRpb24tbmFtZTogZmEtYmVhdDtcbiAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1mYS1hbmltYXRpb24tZGVsYXksIDBzKTtcbiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTtcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTtcbiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpO1xuICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBlYXNlLWluLW91dCk7XG59XG5cbi5mYS1ib3VuY2Uge1xuICBhbmltYXRpb24tbmFtZTogZmEtYm91bmNlO1xuICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpO1xuICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpO1xuICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpO1xuICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7XG4gIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGN1YmljLWJlemllcigwLjI4LCAwLjg0LCAwLjQyLCAxKSk7XG59XG5cbi5mYS1mYWRlIHtcbiAgYW5pbWF0aW9uLW5hbWU6IGZhLWZhZGU7XG4gIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7XG4gIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7XG4gIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAxcyk7XG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTtcbiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKSk7XG59XG5cbi5mYS1iZWF0LWZhZGUge1xuICBhbmltYXRpb24tbmFtZTogZmEtYmVhdC1mYWRlO1xuICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpO1xuICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpO1xuICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpO1xuICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7XG4gIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGN1YmljLWJlemllcigwLjQsIDAsIDAuNiwgMSkpO1xufVxuXG4uZmEtZmxpcCB7XG4gIGFuaW1hdGlvbi1uYW1lOiBmYS1mbGlwO1xuICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpO1xuICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpO1xuICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpO1xuICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7XG4gIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGVhc2UtaW4tb3V0KTtcbn1cblxuLmZhLXNoYWtlIHtcbiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNoYWtlO1xuICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWZhLWFuaW1hdGlvbi1kZWxheSwgMHMpO1xuICBhbmltYXRpb24tZGlyZWN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZGlyZWN0aW9uLCBub3JtYWwpO1xuICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kdXJhdGlvbiwgMXMpO1xuICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiB2YXIoLS1mYS1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50LCBpbmZpbml0ZSk7XG4gIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi10aW1pbmcsIGxpbmVhcik7XG59XG5cbi5mYS1zcGluIHtcbiAgYW5pbWF0aW9uLW5hbWU6IGZhLXNwaW47XG4gIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tZmEtYW5pbWF0aW9uLWRlbGF5LCAwcyk7XG4gIGFuaW1hdGlvbi1kaXJlY3Rpb246IHZhcigtLWZhLWFuaW1hdGlvbi1kaXJlY3Rpb24sIG5vcm1hbCk7XG4gIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWR1cmF0aW9uLCAycyk7XG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IHZhcigtLWZhLWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQsIGluZmluaXRlKTtcbiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLXRpbWluZywgbGluZWFyKTtcbn1cblxuLmZhLXNwaW4tcmV2ZXJzZSB7XG4gIC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbjogcmV2ZXJzZTtcbn1cblxuLmZhLXB1bHNlLFxuLmZhLXNwaW4tcHVsc2Uge1xuICBhbmltYXRpb24tbmFtZTogZmEtc3BpbjtcbiAgYW5pbWF0aW9uLWRpcmVjdGlvbjogdmFyKC0tZmEtYW5pbWF0aW9uLWRpcmVjdGlvbiwgbm9ybWFsKTtcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tZHVyYXRpb24sIDFzKTtcbiAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogdmFyKC0tZmEtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCwgaW5maW5pdGUpO1xuICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1mYS1hbmltYXRpb24tdGltaW5nLCBzdGVwcyg4KSk7XG59XG5cbkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7XG4gIC5mYS1iZWF0LFxuICAuZmEtYm91bmNlLFxuICAuZmEtZmFkZSxcbiAgLmZhLWJlYXQtZmFkZSxcbiAgLmZhLWZsaXAsXG4gIC5mYS1wdWxzZSxcbiAgLmZhLXNoYWtlLFxuICAuZmEtc3BpbixcbiAgLmZhLXNwaW4tcHVsc2Uge1xuICAgIGFuaW1hdGlvbjogbm9uZSAhaW1wb3J0YW50O1xuICAgIHRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDtcbiAgfVxufVxuQGtleWZyYW1lcyBmYS1iZWF0IHtcbiAgMCUsIDkwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgfVxuICA0NSUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYmVhdC1zY2FsZSwgMS4yNSkpO1xuICB9XG59XG5Aa2V5ZnJhbWVzIGZhLWJvdW5jZSB7XG4gIDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEsIDEpIHRyYW5zbGF0ZVkoMCk7XG4gIH1cbiAgMTAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWZhLWJvdW5jZS1zdGFydC1zY2FsZS14LCAxLjEpLCB2YXIoLS1mYS1ib3VuY2Utc3RhcnQtc2NhbGUteSwgMC45KSkgdHJhbnNsYXRlWSgwKTtcbiAgfVxuICAzMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYm91bmNlLWp1bXAtc2NhbGUteCwgMC45KSwgdmFyKC0tZmEtYm91bmNlLWp1bXAtc2NhbGUteSwgMS4xKSkgdHJhbnNsYXRlWSh2YXIoLS1mYS1ib3VuY2UtaGVpZ2h0LCAtMC41ZW0pKTtcbiAgfVxuICA1MCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYm91bmNlLWxhbmQtc2NhbGUteCwgMS4wNSksIHZhcigtLWZhLWJvdW5jZS1sYW5kLXNjYWxlLXksIDAuOTUpKSB0cmFuc2xhdGVZKDApO1xuICB9XG4gIDU3JSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLCAxKSB0cmFuc2xhdGVZKHZhcigtLWZhLWJvdW5jZS1yZWJvdW5kLCAtMC4xMjVlbSkpO1xuICB9XG4gIDY0JSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLCAxKSB0cmFuc2xhdGVZKDApO1xuICB9XG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgdHJhbnNsYXRlWSgwKTtcbiAgfVxufVxuQGtleWZyYW1lcyBmYS1mYWRlIHtcbiAgNTAlIHtcbiAgICBvcGFjaXR5OiB2YXIoLS1mYS1mYWRlLW9wYWNpdHksIDAuNCk7XG4gIH1cbn1cbkBrZXlmcmFtZXMgZmEtYmVhdC1mYWRlIHtcbiAgMCUsIDEwMCUge1xuICAgIG9wYWNpdHk6IHZhcigtLWZhLWJlYXQtZmFkZS1vcGFjaXR5LCAwLjQpO1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gIH1cbiAgNTAlIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tZmEtYmVhdC1mYWRlLXNjYWxlLCAxLjEyNSkpO1xuICB9XG59XG5Aa2V5ZnJhbWVzIGZhLWZsaXAge1xuICA1MCUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlM2QodmFyKC0tZmEtZmxpcC14LCAwKSwgdmFyKC0tZmEtZmxpcC15LCAxKSwgdmFyKC0tZmEtZmxpcC16LCAwKSwgdmFyKC0tZmEtZmxpcC1hbmdsZSwgLTE4MGRlZykpO1xuICB9XG59XG5Aa2V5ZnJhbWVzIGZhLXNoYWtlIHtcbiAgMCUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKC0xNWRlZyk7XG4gIH1cbiAgNCUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDE1ZGVnKTtcbiAgfVxuICA4JSwgMjQlIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMThkZWcpO1xuICB9XG4gIDEyJSwgMjglIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxOGRlZyk7XG4gIH1cbiAgMTYlIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMjJkZWcpO1xuICB9XG4gIDIwJSB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMjJkZWcpO1xuICB9XG4gIDMyJSB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoLTEyZGVnKTtcbiAgfVxuICAzNiUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDEyZGVnKTtcbiAgfVxuICA0MCUsIDEwMCUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICB9XG59XG5Aa2V5ZnJhbWVzIGZhLXNwaW4ge1xuICAwJSB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gIH1cbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgfVxufVxuLmZhLXJvdGF0ZS05MCB7XG4gIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcbn1cblxuLmZhLXJvdGF0ZS0xODAge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xufVxuXG4uZmEtcm90YXRlLTI3MCB7XG4gIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7XG59XG5cbi5mYS1mbGlwLWhvcml6b250YWwge1xuICB0cmFuc2Zvcm06IHNjYWxlKC0xLCAxKTtcbn1cblxuLmZhLWZsaXAtdmVydGljYWwge1xuICB0cmFuc2Zvcm06IHNjYWxlKDEsIC0xKTtcbn1cblxuLmZhLWZsaXAtYm90aCxcbi5mYS1mbGlwLWhvcml6b250YWwuZmEtZmxpcC12ZXJ0aWNhbCB7XG4gIHRyYW5zZm9ybTogc2NhbGUoLTEsIC0xKTtcbn1cblxuLmZhLXJvdGF0ZS1ieSB7XG4gIHRyYW5zZm9ybTogcm90YXRlKHZhcigtLWZhLXJvdGF0ZS1hbmdsZSwgMCkpO1xufVxuXG4uc3ZnLWlubGluZS0tZmEgLmZhLXByaW1hcnkge1xuICBmaWxsOiB2YXIoLS1mYS1wcmltYXJ5LWNvbG9yLCBjdXJyZW50Q29sb3IpO1xuICBvcGFjaXR5OiB2YXIoLS1mYS1wcmltYXJ5LW9wYWNpdHksIDEpO1xufVxuXG4uc3ZnLWlubGluZS0tZmEgLmZhLXNlY29uZGFyeSB7XG4gIGZpbGw6IHZhcigtLWZhLXNlY29uZGFyeS1jb2xvciwgY3VycmVudENvbG9yKTtcbiAgb3BhY2l0eTogdmFyKC0tZmEtc2Vjb25kYXJ5LW9wYWNpdHksIDAuNCk7XG59XG5cbi5zdmctaW5saW5lLS1mYS5mYS1zd2FwLW9wYWNpdHkgLmZhLXByaW1hcnkge1xuICBvcGFjaXR5OiB2YXIoLS1mYS1zZWNvbmRhcnktb3BhY2l0eSwgMC40KTtcbn1cblxuLnN2Zy1pbmxpbmUtLWZhLmZhLXN3YXAtb3BhY2l0eSAuZmEtc2Vjb25kYXJ5IHtcbiAgb3BhY2l0eTogdmFyKC0tZmEtcHJpbWFyeS1vcGFjaXR5LCAxKTtcbn1cblxuLnN2Zy1pbmxpbmUtLWZhIG1hc2sgLmZhLXByaW1hcnksXG4uc3ZnLWlubGluZS0tZmEgbWFzayAuZmEtc2Vjb25kYXJ5IHtcbiAgZmlsbDogYmxhY2s7XG59XG5cbi5zdmctaW5saW5lLS1mYS5mYS1pbnZlcnNlIHtcbiAgZmlsbDogdmFyKC0tZmEtaW52ZXJzZSwgI2ZmZik7XG59XG5cbi5mYS1zdGFjayB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgaGVpZ2h0OiAyZW07XG4gIGxpbmUtaGVpZ2h0OiAyZW07XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgd2lkdGg6IDIuNWVtO1xufVxuXG4uZmEtaW52ZXJzZSB7XG4gIGNvbG9yOiB2YXIoLS1mYS1pbnZlcnNlLCAjZmZmKTtcbn1cblxuLnN2Zy1pbmxpbmUtLWZhLmZhLXN0YWNrLTF4IHtcbiAgLS1mYS13aWR0aDogMS4yNWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgd2lkdGg6IHZhcigtLWZhLXdpZHRoKTtcbn1cbi5zdmctaW5saW5lLS1mYS5mYS1zdGFjay0yeCB7XG4gIC0tZmEtd2lkdGg6IDIuNWVtO1xuICBoZWlnaHQ6IDJlbTtcbiAgd2lkdGg6IHZhcigtLWZhLXdpZHRoKTtcbn1cblxuLmZhLXN0YWNrLTF4LFxuLmZhLXN0YWNrLTJ4IHtcbiAgaW5zZXQ6IDA7XG4gIG1hcmdpbjogYXV0bztcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiB2YXIoLS1mYS1zdGFjay16LWluZGV4LCBhdXRvKTtcbn0iOwogICAgX2Nzc0luc2VydGVkID0gZmFsc2U7CiAgICBJbmplY3RDU1MgPSB7CiAgICAgIG1peG91dDogZnVuY3Rpb24gbWl4b3V0KCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBkb206IHsKICAgICAgICAgICAgY3NzLAogICAgICAgICAgICBpbnNlcnRDc3M6IGVuc3VyZUNzcwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIGhvb2tzOiBmdW5jdGlvbiBob29rcygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgYmVmb3JlRE9NRWxlbWVudENyZWF0aW9uOiBmdW5jdGlvbiBiZWZvcmVET01FbGVtZW50Q3JlYXRpb24oKSB7CiAgICAgICAgICAgIGVuc3VyZUNzcygpOwogICAgICAgICAgfSwKICAgICAgICAgIGJlZm9yZUkyc3ZnOiBmdW5jdGlvbiBiZWZvcmVJMnN2ZygpIHsKICAgICAgICAgICAgZW5zdXJlQ3NzKCk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIHckMiA9IFdJTkRPVyB8fCB7fTsKICAgIGlmICghdyQyW05BTUVTUEFDRV9JREVOVElGSUVSXSkgdyQyW05BTUVTUEFDRV9JREVOVElGSUVSXSA9IHt9OwogICAgaWYgKCF3JDJbTkFNRVNQQUNFX0lERU5USUZJRVJdLnN0eWxlcykgdyQyW05BTUVTUEFDRV9JREVOVElGSUVSXS5zdHlsZXMgPSB7fTsKICAgIGlmICghdyQyW05BTUVTUEFDRV9JREVOVElGSUVSXS5ob29rcykgdyQyW05BTUVTUEFDRV9JREVOVElGSUVSXS5ob29rcyA9IHt9OwogICAgaWYgKCF3JDJbTkFNRVNQQUNFX0lERU5USUZJRVJdLnNoaW1zKSB3JDJbTkFNRVNQQUNFX0lERU5USUZJRVJdLnNoaW1zID0gW107CiAgICBuYW1lc3BhY2UgPSB3JDJbTkFNRVNQQUNFX0lERU5USUZJRVJdOwogICAgZnVuY3Rpb25zID0gW107CiAgICBfbGlzdGVuZXIgPSBmdW5jdGlvbiBsaXN0ZW5lcigpIHsKICAgICAgRE9DVU1FTlQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIF9saXN0ZW5lcik7CiAgICAgIGxvYWRlZCA9IDE7CiAgICAgIGZ1bmN0aW9ucy5tYXAoZnVuY3Rpb24oZm4pIHsKICAgICAgICByZXR1cm4gZm4oKTsKICAgICAgfSk7CiAgICB9OwogICAgbG9hZGVkID0gZmFsc2U7CiAgICBpZiAoSVNfRE9NKSB7CiAgICAgIGxvYWRlZCA9IChET0NVTUVOVC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgPyAvXmxvYWRlZHxeYy8gOiAvXmxvYWRlZHxeaXxeYy8pLnRlc3QoRE9DVU1FTlQucmVhZHlTdGF0ZSk7CiAgICAgIGlmICghbG9hZGVkKSBET0NVTUVOVC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgX2xpc3RlbmVyKTsKICAgIH0KICAgIGJpbmRJbnRlcm5hbDQgPSBmdW5jdGlvbiBiaW5kSW50ZXJuYWw0MihmdW5jLCB0aGlzQ29udGV4dCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oYTUsIGI2LCBjMTEsIGQ2KSB7CiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQ29udGV4dCwgYTUsIGI2LCBjMTEsIGQ2KTsKICAgICAgfTsKICAgIH07CiAgICByZWR1Y2UzID0gZnVuY3Rpb24gZmFzdFJlZHVjZU9iamVjdChzdWJqZWN0LCBmbiwgaW5pdGlhbFZhbHVlLCB0aGlzQ29udGV4dCkgewogICAgICB2YXIga2V5czIgPSBPYmplY3Qua2V5cyhzdWJqZWN0KSwgbGVuZ3RoID0ga2V5czIubGVuZ3RoLCBpdGVyYXRvcjIgPSB0aGlzQ29udGV4dCAhPT0gdm9pZCAwID8gYmluZEludGVybmFsNChmbiwgdGhpc0NvbnRleHQpIDogZm4sIGkxMSwga2V5MiwgcmVzdWx0OwogICAgICBpZiAoaW5pdGlhbFZhbHVlID09PSB2b2lkIDApIHsKICAgICAgICBpMTEgPSAxOwogICAgICAgIHJlc3VsdCA9IHN1YmplY3Rba2V5czJbMF1dOwogICAgICB9IGVsc2UgewogICAgICAgIGkxMSA9IDA7CiAgICAgICAgcmVzdWx0ID0gaW5pdGlhbFZhbHVlOwogICAgICB9CiAgICAgIGZvciAoOyBpMTEgPCBsZW5ndGg7IGkxMSsrKSB7CiAgICAgICAga2V5MiA9IGtleXMyW2kxMV07CiAgICAgICAgcmVzdWx0ID0gaXRlcmF0b3IyKHJlc3VsdCwgc3ViamVjdFtrZXkyXSwga2V5Miwgc3ViamVjdCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CiAgICBNT05PID0gMTsKICAgIERVTyA9IDI7CiAgICBtb2Rlcm5NYXRjaGVzID0gW1tEVU8sIC8qIEBfX1BVUkVfXyAqLyBfd3JhcFJlZ0V4cCgvcGF0aCBvcGFjaXR5PSIoW14iXSopIi4qZD0iKFteIl0qKSIuKnBhdGguKmQ9IihbXiJdKikiLywgewogICAgICBkMjogMiwKICAgICAgZDE6IDMKICAgIH0pXSwgW0RVTywgLyogQF9fUFVSRV9fICovIF93cmFwUmVnRXhwKC9wYXRoIG9wYWNpdHk9IihbXiJdKikiLipkPSIoW14iXSopIi8sIHsKICAgICAgZDI6IDIKICAgIH0pXSwgW01PTk8sIC8qIEBfX1BVUkVfXyAqLyBfd3JhcFJlZ0V4cCgvcGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiLipkPSIoW14iXSspIi8sIHsKICAgICAgZDE6IDEKICAgIH0pXV07CiAgICBsZWdhY3lNYXRjaGVzID0gW1tEVU8sIC8qIEBfX1BVUkVfXyAqLyBfd3JhcFJlZ0V4cCgvcGF0aCBjbGFzcz0iKFteIl0qc2Vjb25kYXJ5W14iXSopIi4qZD0iKFteIl0rKSIuKnBhdGggY2xhc3M9IihbXiJdKnByaW1hcnlbXiJdKikiLipkPSIoW14iXSspIi8sIHsKICAgICAgYXR0cjI6IDEsCiAgICAgIGQyOiAyLAogICAgICBhdHRyMTogMywKICAgICAgZDE6IDQKICAgIH0pXSwgW0RVTywgLyogQF9fUFVSRV9fICovIF93cmFwUmVnRXhwKC9wYXRoIGNsYXNzPSIoW14iXSpwcmltYXJ5W14iXSopIi4qZD0iKFteIl0rKSIuKnBhdGggY2xhc3M9IihbXiJdKnNlY29uZGFyeVteIl0qKSIuKmQ9IihbXiJdKykiLywgewogICAgICBhdHRyMTogMSwKICAgICAgZDE6IDIsCiAgICAgIGF0dHIyOiAzLAogICAgICBkMjogNAogICAgfSldLCBbRFVPLCAvKiBAX19QVVJFX18gKi8gX3dyYXBSZWdFeHAoL3BhdGggY2xhc3M9IihbXiJdKnByaW1hcnlbXiJdKikiLipkPSIoW14iXSspIi8sIHsKICAgICAgYXR0cjE6IDEsCiAgICAgIGQxOiAyCiAgICB9KV0sIFtEVU8sIC8qIEBfX1BVUkVfXyAqLyBfd3JhcFJlZ0V4cCgvcGF0aCBjbGFzcz0iKFteIl0qc2Vjb25kYXJ5W14iXSopIi4qZD0iKFteIl0rKSIvLCB7CiAgICAgIGF0dHIyOiAxLAogICAgICBkMjogMgogICAgfSldLCBbRFVPLCAvKiBAX19QVVJFX18gKi8gX3dyYXBSZWdFeHAoL3BhdGggZD0iKFteIl0rKSIuKmNsYXNzPSIoW14iXSpzZWNvbmRhcnlbXiJdKikiLipwYXRoIGQ9IihbXiJdKykiLipjbGFzcz0iKFteIl0qcHJpbWFyeVteIl0qKSIvLCB7CiAgICAgIGQyOiAxLAogICAgICBhdHRyMjogMiwKICAgICAgZDE6IDMsCiAgICAgIGF0dHIxOiA0CiAgICB9KV0sIFtEVU8sIC8qIEBfX1BVUkVfXyAqLyBfd3JhcFJlZ0V4cCgvcGF0aCBkPSIoW14iXSspIi4qY2xhc3M9IihbXiJdKnByaW1hcnlbXiJdKikiLipwYXRoIGQ9IihbXiJdKykiLipjbGFzcz0iKFteIl0qc2Vjb25kYXJ5W14iXSopIi8sIHsKICAgICAgZDE6IDEsCiAgICAgIGF0dHIxOiAyLAogICAgICBkMjogMywKICAgICAgYXR0cjI6IDQKICAgIH0pXSwgW0RVTywgLyogQF9fUFVSRV9fICovIF93cmFwUmVnRXhwKC9wYXRoIGQ9IihbXiJdKykiLipjbGFzcz0iKFteIl0qcHJpbWFyeVteIl0qKSIvLCB7CiAgICAgIGQxOiAxLAogICAgICBhdHRyMTogMgogICAgfSldLCBbRFVPLCAvKiBAX19QVVJFX18gKi8gX3dyYXBSZWdFeHAoL3BhdGggZD0iKFteIl0rKSIuKmNsYXNzPSIoW14iXSpzZWNvbmRhcnlbXiJdKikiLywgewogICAgICBkMjogMSwKICAgICAgYXR0cjI6IDIKICAgIH0pXSwgW0RVTywgLyogQF9fUFVSRV9fICovIF93cmFwUmVnRXhwKC9wYXRoIGQ9IihbXiJdKykiLipwYXRoIGQ9IihbXiJdKykiLywgewogICAgICBkMTogMSwKICAgICAgZDI6IDIKICAgIH0pXSwgW01PTk8sIC8qIEBfX1BVUkVfXyAqLyBfd3JhcFJlZ0V4cCgvcGF0aCBkPSIoW14iXSspIi8sIHsKICAgICAgZDE6IDEKICAgIH0pXSwgW01PTk8sIC8qIEBfX1BVUkVfXyAqLyBfd3JhcFJlZ0V4cCgvcGF0aCBzdHlsZT0iKFteIl0rKSIuKmQ9IihbXiJdKykiLywgewogICAgICBhdHRyMTogMSwKICAgICAgZDE6IDIKICAgIH0pXV07CiAgICBzdHlsZXMyID0gbmFtZXNwYWNlLnN0eWxlcywgc2hpbXMgPSBuYW1lc3BhY2Uuc2hpbXM7CiAgICBGQU1JTFlfTkFNRVMgPSBPYmplY3Qua2V5cyhQUkVGSVhfVE9fTE9OR19TVFlMRSk7CiAgICBQUkVGSVhFU19GT1JfRkFNSUxZID0gRkFNSUxZX05BTUVTLnJlZHVjZShmdW5jdGlvbihhY2MsIGZhbWlseUlkKSB7CiAgICAgIGFjY1tmYW1pbHlJZF0gPSBPYmplY3Qua2V5cyhQUkVGSVhfVE9fTE9OR19TVFlMRVtmYW1pbHlJZF0pOwogICAgICByZXR1cm4gYWNjOwogICAgfSwge30pOwogICAgX2RlZmF1bHRVc2FibGVQcmVmaXggPSBudWxsOwogICAgX2J5VW5pY29kZSA9IHt9OwogICAgX2J5TGlnYXR1cmUgPSB7fTsKICAgIF9ieU9sZE5hbWUgPSB7fTsKICAgIF9ieU9sZFVuaWNvZGUgPSB7fTsKICAgIF9ieUFsaWFzID0ge307CiAgICBidWlsZCA9IGZ1bmN0aW9uIGJ1aWxkMigpIHsKICAgICAgdmFyIGxvb2t1cCA9IGZ1bmN0aW9uIGxvb2t1cDIocmVkdWNlcikgewogICAgICAgIHJldHVybiByZWR1Y2UzKHN0eWxlczIsIGZ1bmN0aW9uKG8kJDEsIHN0eWxlLCBwcmVmaXg0KSB7CiAgICAgICAgICBvJCQxW3ByZWZpeDRdID0gcmVkdWNlMyhzdHlsZSwgcmVkdWNlciwge30pOwogICAgICAgICAgcmV0dXJuIG8kJDE7CiAgICAgICAgfSwge30pOwogICAgICB9OwogICAgICBfYnlVbmljb2RlID0gbG9va3VwKGZ1bmN0aW9uKGFjYywgaWNvbjMsIGljb25OYW1lKSB7CiAgICAgICAgaWYgKGljb24zWzNdKSB7CiAgICAgICAgICBhY2NbaWNvbjNbM11dID0gaWNvbk5hbWU7CiAgICAgICAgfQogICAgICAgIGlmIChpY29uM1syXSkgewogICAgICAgICAgdmFyIGFsaWFzZXMgPSBpY29uM1syXS5maWx0ZXIoZnVuY3Rpb24oYSQkMSkgewogICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEkJDEgPT09ICJudW1iZXIiOwogICAgICAgICAgfSk7CiAgICAgICAgICBhbGlhc2VzLmZvckVhY2goZnVuY3Rpb24oYWxpYXMpIHsKICAgICAgICAgICAgYWNjW2FsaWFzLnRvU3RyaW5nKDE2KV0gPSBpY29uTmFtZTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWNjOwogICAgICB9KTsKICAgICAgX2J5TGlnYXR1cmUgPSBsb29rdXAoZnVuY3Rpb24oYWNjLCBpY29uMywgaWNvbk5hbWUpIHsKICAgICAgICBhY2NbaWNvbk5hbWVdID0gaWNvbk5hbWU7CiAgICAgICAgaWYgKGljb24zWzJdKSB7CiAgICAgICAgICB2YXIgYWxpYXNlcyA9IGljb24zWzJdLmZpbHRlcihmdW5jdGlvbihhJCQxKSB7CiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYSQkMSA9PT0gInN0cmluZyI7CiAgICAgICAgICB9KTsKICAgICAgICAgIGFsaWFzZXMuZm9yRWFjaChmdW5jdGlvbihhbGlhcykgewogICAgICAgICAgICBhY2NbYWxpYXNdID0gaWNvbk5hbWU7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFjYzsKICAgICAgfSk7CiAgICAgIF9ieUFsaWFzID0gbG9va3VwKGZ1bmN0aW9uKGFjYywgaWNvbjMsIGljb25OYW1lKSB7CiAgICAgICAgdmFyIGFsaWFzZXMgPSBpY29uM1syXTsKICAgICAgICBhY2NbaWNvbk5hbWVdID0gaWNvbk5hbWU7CiAgICAgICAgYWxpYXNlcy5mb3JFYWNoKGZ1bmN0aW9uKGFsaWFzKSB7CiAgICAgICAgICBhY2NbYWxpYXNdID0gaWNvbk5hbWU7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGFjYzsKICAgICAgfSk7CiAgICAgIHZhciBoYXNSZWd1bGFyID0gImZhciIgaW4gc3R5bGVzMiB8fCBjb25maWcyLmF1dG9GZXRjaFN2ZzsKICAgICAgdmFyIHNoaW1Mb29rdXBzID0gcmVkdWNlMyhzaGltcywgZnVuY3Rpb24oYWNjLCBzaGltKSB7CiAgICAgICAgdmFyIG1heWJlTmFtZU1heWJlVW5pY29kZSA9IHNoaW1bMF07CiAgICAgICAgdmFyIHByZWZpeDQgPSBzaGltWzFdOwogICAgICAgIHZhciBpY29uTmFtZSA9IHNoaW1bMl07CiAgICAgICAgaWYgKHByZWZpeDQgPT09ICJmYXIiICYmICFoYXNSZWd1bGFyKSB7CiAgICAgICAgICBwcmVmaXg0ID0gImZhcyI7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgbWF5YmVOYW1lTWF5YmVVbmljb2RlID09PSAic3RyaW5nIikgewogICAgICAgICAgYWNjLm5hbWVzW21heWJlTmFtZU1heWJlVW5pY29kZV0gPSB7CiAgICAgICAgICAgIHByZWZpeDogcHJlZml4NCwKICAgICAgICAgICAgaWNvbk5hbWUKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgbWF5YmVOYW1lTWF5YmVVbmljb2RlID09PSAibnVtYmVyIikgewogICAgICAgICAgYWNjLnVuaWNvZGVzW21heWJlTmFtZU1heWJlVW5pY29kZS50b1N0cmluZygxNildID0gewogICAgICAgICAgICBwcmVmaXg6IHByZWZpeDQsCiAgICAgICAgICAgIGljb25OYW1lCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWNjOwogICAgICB9LCB7CiAgICAgICAgbmFtZXM6IHt9LAogICAgICAgIHVuaWNvZGVzOiB7fQogICAgICB9KTsKICAgICAgX2J5T2xkTmFtZSA9IHNoaW1Mb29rdXBzLm5hbWVzOwogICAgICBfYnlPbGRVbmljb2RlID0gc2hpbUxvb2t1cHMudW5pY29kZXM7CiAgICAgIF9kZWZhdWx0VXNhYmxlUHJlZml4ID0gZ2V0Q2Fub25pY2FsUHJlZml4KGNvbmZpZzIuc3R5bGVEZWZhdWx0LCB7CiAgICAgICAgZmFtaWx5OiBjb25maWcyLmZhbWlseURlZmF1bHQKICAgICAgfSk7CiAgICB9OwogICAgb25DaGFuZ2UoZnVuY3Rpb24oYyQkMSkgewogICAgICBfZGVmYXVsdFVzYWJsZVByZWZpeCA9IGdldENhbm9uaWNhbFByZWZpeChjJCQxLnN0eWxlRGVmYXVsdCwgewogICAgICAgIGZhbWlseTogY29uZmlnMi5mYW1pbHlEZWZhdWx0CiAgICAgIH0pOwogICAgfSk7CiAgICBidWlsZCgpOwogICAgZW1wdHlDYW5vbmljYWxJY29uID0gZnVuY3Rpb24gZW1wdHlDYW5vbmljYWxJY29uMigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBwcmVmaXg6IG51bGwsCiAgICAgICAgaWNvbk5hbWU6IG51bGwsCiAgICAgICAgcmVzdDogW10KICAgICAgfTsKICAgIH07CiAgICBfZmFDb21iaW5lZENsYXNzZXMgPSBsby5jb25jYXQoSHQpOwogICAgbmV3Q2Fub25pY2FsRmFtaWxpZXMgPSBkdDIuZmlsdGVyKGZ1bmN0aW9uKGZhbWlseUlkKSB7CiAgICAgIHJldHVybiBmYW1pbHlJZCAhPT0gaTEwIHx8IGZhbWlseUlkICE9PSB0ODsKICAgIH0pOwogICAgbmV3Q2Fub25pY2FsU3R5bGVzID0gT2JqZWN0LmtleXMoWGwpLmZpbHRlcihmdW5jdGlvbihrZXkyKSB7CiAgICAgIHJldHVybiBrZXkyICE9PSBpMTA7CiAgICB9KS5tYXAoZnVuY3Rpb24oa2V5MikgewogICAgICByZXR1cm4gT2JqZWN0LmtleXMoWGxba2V5Ml0pOwogICAgfSkuZmxhdCgpOwogICAgTGlicmFyeSA9IC8qIEBfX1BVUkVfXyAqLyAoZnVuY3Rpb24oKSB7CiAgICAgIGZ1bmN0aW9uIExpYnJhcnkzKCkgewogICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMaWJyYXJ5Myk7CiAgICAgICAgdGhpcy5kZWZpbml0aW9ucyA9IHt9OwogICAgICB9CiAgICAgIHJldHVybiBfY3JlYXRlQ2xhc3MoTGlicmFyeTMsIFt7CiAgICAgICAga2V5OiAiYWRkIiwKICAgICAgICB2YWx1ZTogZnVuY3Rpb24gYWRkMygpIHsKICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgZGVmaW5pdGlvbnMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CiAgICAgICAgICAgIGRlZmluaXRpb25zW19rZXldID0gYXJndW1lbnRzW19rZXldOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGFkZGl0aW9ucyA9IGRlZmluaXRpb25zLnJlZHVjZSh0aGlzLl9wdWxsRGVmaW5pdGlvbnMsIHt9KTsKICAgICAgICAgIE9iamVjdC5rZXlzKGFkZGl0aW9ucykuZm9yRWFjaChmdW5jdGlvbihrZXkyKSB7CiAgICAgICAgICAgIF90aGlzLmRlZmluaXRpb25zW2tleTJdID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIF90aGlzLmRlZmluaXRpb25zW2tleTJdIHx8IHt9KSwgYWRkaXRpb25zW2tleTJdKTsKICAgICAgICAgICAgZGVmaW5lSWNvbnMoa2V5MiwgYWRkaXRpb25zW2tleTJdKTsKICAgICAgICAgICAgdmFyIGxvbmdQcmVmaXggPSBQUkVGSVhfVE9fTE9OR19TVFlMRVtpMTBdW2tleTJdOwogICAgICAgICAgICBpZiAobG9uZ1ByZWZpeCkgZGVmaW5lSWNvbnMobG9uZ1ByZWZpeCwgYWRkaXRpb25zW2tleTJdKTsKICAgICAgICAgICAgYnVpbGQoKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwgewogICAgICAgIGtleTogInJlc2V0IiwKICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7CiAgICAgICAgICB0aGlzLmRlZmluaXRpb25zID0ge307CiAgICAgICAgfQogICAgICB9LCB7CiAgICAgICAga2V5OiAiX3B1bGxEZWZpbml0aW9ucyIsCiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9wdWxsRGVmaW5pdGlvbnMoYWRkaXRpb25zLCBkZWZpbml0aW9uMykgewogICAgICAgICAgdmFyIG5vcm1hbGl6ZWQgPSBkZWZpbml0aW9uMy5wcmVmaXggJiYgZGVmaW5pdGlvbjMuaWNvbk5hbWUgJiYgZGVmaW5pdGlvbjMuaWNvbiA/IHsKICAgICAgICAgICAgMDogZGVmaW5pdGlvbjMKICAgICAgICAgIH0gOiBkZWZpbml0aW9uMzsKICAgICAgICAgIE9iamVjdC5rZXlzKG5vcm1hbGl6ZWQpLm1hcChmdW5jdGlvbihrZXkyKSB7CiAgICAgICAgICAgIHZhciBfbm9ybWFsaXplZCRrZXkgPSBub3JtYWxpemVkW2tleTJdLCBwcmVmaXg0ID0gX25vcm1hbGl6ZWQka2V5LnByZWZpeCwgaWNvbk5hbWUgPSBfbm9ybWFsaXplZCRrZXkuaWNvbk5hbWUsIGljb24zID0gX25vcm1hbGl6ZWQka2V5Lmljb247CiAgICAgICAgICAgIHZhciBhbGlhc2VzID0gaWNvbjNbMl07CiAgICAgICAgICAgIGlmICghYWRkaXRpb25zW3ByZWZpeDRdKSBhZGRpdGlvbnNbcHJlZml4NF0gPSB7fTsKICAgICAgICAgICAgaWYgKGFsaWFzZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIGFsaWFzZXMuZm9yRWFjaChmdW5jdGlvbihhbGlhcykgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhbGlhcyA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgYWRkaXRpb25zW3ByZWZpeDRdW2FsaWFzXSA9IGljb24zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFkZGl0aW9uc1twcmVmaXg0XVtpY29uTmFtZV0gPSBpY29uMzsKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIGFkZGl0aW9uczsKICAgICAgICB9CiAgICAgIH1dKTsKICAgIH0pKCk7CiAgICBfcGx1Z2lucyA9IFtdOwogICAgX2hvb2tzID0ge307CiAgICBwcm92aWRlcnMgPSB7fTsKICAgIGRlZmF1bHRQcm92aWRlcktleXMgPSBPYmplY3Qua2V5cyhwcm92aWRlcnMpOwogICAgbGlicmFyeSA9IG5ldyBMaWJyYXJ5KCk7CiAgICBub0F1dG8gPSBmdW5jdGlvbiBub0F1dG8yKCkgewogICAgICBjb25maWcyLmF1dG9SZXBsYWNlU3ZnID0gZmFsc2U7CiAgICAgIGNvbmZpZzIub2JzZXJ2ZU11dGF0aW9ucyA9IGZhbHNlOwogICAgICBjYWxsSG9va3MoIm5vQXV0byIpOwogICAgfTsKICAgIGRvbSA9IHsKICAgICAgaTJzdmc6IGZ1bmN0aW9uIGkyc3ZnKCkgewogICAgICAgIHZhciBwYXJhbXMyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB2b2lkIDAgPyBhcmd1bWVudHNbMF0gOiB7fTsKICAgICAgICBpZiAoSVNfRE9NKSB7CiAgICAgICAgICBjYWxsSG9va3MoImJlZm9yZUkyc3ZnIiwgcGFyYW1zMik7CiAgICAgICAgICBjYWxsUHJvdmlkZWQoInBzZXVkb0VsZW1lbnRzMnN2ZyIsIHBhcmFtczIpOwogICAgICAgICAgcmV0dXJuIGNhbGxQcm92aWRlZCgiaTJzdmciLCBwYXJhbXMyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigiT3BlcmF0aW9uIHJlcXVpcmVzIGEgRE9NIG9mIHNvbWUga2luZC4iKSk7CiAgICAgICAgfQogICAgICB9LAogICAgICB3YXRjaDogZnVuY3Rpb24gd2F0Y2goKSB7CiAgICAgICAgdmFyIHBhcmFtczIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1swXSA6IHt9OwogICAgICAgIHZhciBhdXRvUmVwbGFjZVN2Z1Jvb3QgPSBwYXJhbXMyLmF1dG9SZXBsYWNlU3ZnUm9vdDsKICAgICAgICBpZiAoY29uZmlnMi5hdXRvUmVwbGFjZVN2ZyA9PT0gZmFsc2UpIHsKICAgICAgICAgIGNvbmZpZzIuYXV0b1JlcGxhY2VTdmcgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBjb25maWcyLm9ic2VydmVNdXRhdGlvbnMgPSB0cnVlOwogICAgICAgIGRvbXJlYWR5KGZ1bmN0aW9uKCkgewogICAgICAgICAgYXV0b1JlcGxhY2UoewogICAgICAgICAgICBhdXRvUmVwbGFjZVN2Z1Jvb3QKICAgICAgICAgIH0pOwogICAgICAgICAgY2FsbEhvb2tzKCJ3YXRjaCIsIHBhcmFtczIpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgcGFyc2U5ID0gewogICAgICBpY29uOiBmdW5jdGlvbiBpY29uKF9pY29uKSB7CiAgICAgICAgaWYgKF9pY29uID09PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKF90eXBlb2YoX2ljb24pID09PSAib2JqZWN0IiAmJiBfaWNvbi5wcmVmaXggJiYgX2ljb24uaWNvbk5hbWUpIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHByZWZpeDogX2ljb24ucHJlZml4LAogICAgICAgICAgICBpY29uTmFtZTogYnlBbGlhcyhfaWNvbi5wcmVmaXgsIF9pY29uLmljb25OYW1lKSB8fCBfaWNvbi5pY29uTmFtZQogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoX2ljb24pICYmIF9pY29uLmxlbmd0aCA9PT0gMikgewogICAgICAgICAgdmFyIGljb25OYW1lID0gX2ljb25bMV0uaW5kZXhPZigiZmEtIikgPT09IDAgPyBfaWNvblsxXS5zbGljZSgzKSA6IF9pY29uWzFdOwogICAgICAgICAgdmFyIHByZWZpeDQgPSBnZXRDYW5vbmljYWxQcmVmaXgoX2ljb25bMF0pOwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcHJlZml4OiBwcmVmaXg0LAogICAgICAgICAgICBpY29uTmFtZTogYnlBbGlhcyhwcmVmaXg0LCBpY29uTmFtZSkgfHwgaWNvbk5hbWUKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgX2ljb24gPT09ICJzdHJpbmciICYmIChfaWNvbi5pbmRleE9mKCIiLmNvbmNhdChjb25maWcyLmNzc1ByZWZpeCwgIi0iKSkgPiAtMSB8fCBfaWNvbi5tYXRjaChJQ09OX1NFTEVDVElPTl9TWU5UQVhfUEFUVEVSTikpKSB7CiAgICAgICAgICB2YXIgY2Fub25pY2FsSWNvbiA9IGdldENhbm9uaWNhbEljb24oX2ljb24uc3BsaXQoIiAiKSwgewogICAgICAgICAgICBza2lwTG9va3VwczogdHJ1ZQogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcmVmaXg6IGNhbm9uaWNhbEljb24ucHJlZml4IHx8IGdldERlZmF1bHRVc2FibGVQcmVmaXgoKSwKICAgICAgICAgICAgaWNvbk5hbWU6IGJ5QWxpYXMoY2Fub25pY2FsSWNvbi5wcmVmaXgsIGNhbm9uaWNhbEljb24uaWNvbk5hbWUpIHx8IGNhbm9uaWNhbEljb24uaWNvbk5hbWUKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgX2ljb24gPT09ICJzdHJpbmciKSB7CiAgICAgICAgICB2YXIgX3ByZWZpeCA9IGdldERlZmF1bHRVc2FibGVQcmVmaXgoKTsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHByZWZpeDogX3ByZWZpeCwKICAgICAgICAgICAgaWNvbk5hbWU6IGJ5QWxpYXMoX3ByZWZpeCwgX2ljb24pIHx8IF9pY29uCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGFwaSA9IHsKICAgICAgbm9BdXRvLAogICAgICBjb25maWc6IGNvbmZpZzIsCiAgICAgIGRvbSwKICAgICAgcGFyc2U6IHBhcnNlOSwKICAgICAgbGlicmFyeSwKICAgICAgZmluZEljb25EZWZpbml0aW9uLAogICAgICB0b0h0bWw6IHRvSHRtbDIKICAgIH07CiAgICBhdXRvUmVwbGFjZSA9IGZ1bmN0aW9uIGF1dG9SZXBsYWNlMigpIHsKICAgICAgdmFyIHBhcmFtczIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1swXSA6IHt9OwogICAgICB2YXIgX3BhcmFtcyRhdXRvUmVwbGFjZVN2ID0gcGFyYW1zMi5hdXRvUmVwbGFjZVN2Z1Jvb3QsIGF1dG9SZXBsYWNlU3ZnUm9vdCA9IF9wYXJhbXMkYXV0b1JlcGxhY2VTdiA9PT0gdm9pZCAwID8gRE9DVU1FTlQgOiBfcGFyYW1zJGF1dG9SZXBsYWNlU3Y7CiAgICAgIGlmICgoT2JqZWN0LmtleXMobmFtZXNwYWNlLnN0eWxlcykubGVuZ3RoID4gMCB8fCBjb25maWcyLmF1dG9GZXRjaFN2ZykgJiYgSVNfRE9NICYmIGNvbmZpZzIuYXV0b1JlcGxhY2VTdmcpIGFwaS5kb20uaTJzdmcoewogICAgICAgIG5vZGU6IGF1dG9SZXBsYWNlU3ZnUm9vdAogICAgICB9KTsKICAgIH07CiAgICBzdHlsZXMkMSA9IG5hbWVzcGFjZS5zdHlsZXM7CiAgICBtaXNzaW5nSWNvblJlc29sdXRpb25NaXhpbiA9IHsKICAgICAgZm91bmQ6IGZhbHNlLAogICAgICB3aWR0aDogNTEyLAogICAgICBoZWlnaHQ6IDUxMgogICAgfTsKICAgIG5vb3AkMSA9IGZ1bmN0aW9uIG5vb3A0KCkgewogICAgfTsKICAgIHAkMiA9IGNvbmZpZzIubWVhc3VyZVBlcmZvcm1hbmNlICYmIFBFUkZPUk1BTkNFICYmIFBFUkZPUk1BTkNFLm1hcmsgJiYgUEVSRk9STUFOQ0UubWVhc3VyZSA/IFBFUkZPUk1BTkNFIDogewogICAgICBtYXJrOiBub29wJDEsCiAgICAgIG1lYXN1cmU6IG5vb3AkMQogICAgfTsKICAgIHByZWFtYmxlID0gJ0ZBICI3LjIuMCInOwogICAgYmVnaW4gPSBmdW5jdGlvbiBiZWdpbjIobmFtZSkgewogICAgICBwJDIubWFyaygiIi5jb25jYXQocHJlYW1ibGUsICIgIikuY29uY2F0KG5hbWUsICIgYmVnaW5zIikpOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGVuZChuYW1lKTsKICAgICAgfTsKICAgIH07CiAgICBlbmQgPSBmdW5jdGlvbiBlbmQyKG5hbWUpIHsKICAgICAgcCQyLm1hcmsoIiIuY29uY2F0KHByZWFtYmxlLCAiICIpLmNvbmNhdChuYW1lLCAiIGVuZHMiKSk7CiAgICAgIHAkMi5tZWFzdXJlKCIiLmNvbmNhdChwcmVhbWJsZSwgIiAiKS5jb25jYXQobmFtZSksICIiLmNvbmNhdChwcmVhbWJsZSwgIiAiKS5jb25jYXQobmFtZSwgIiBiZWdpbnMiKSwgIiIuY29uY2F0KHByZWFtYmxlLCAiICIpLmNvbmNhdChuYW1lLCAiIGVuZHMiKSk7CiAgICB9OwogICAgcGVyZiA9IHsKICAgICAgYmVnaW4sCiAgICAgIGVuZAogICAgfTsKICAgIG5vb3AkMiA9IGZ1bmN0aW9uIG5vb3A1KCkgewogICAgfTsKICAgIG11dGF0b3JzID0gewogICAgICByZXBsYWNlOiBmdW5jdGlvbiByZXBsYWNlMyhtdXRhdGlvbikgewogICAgICAgIHZhciBub2RlMiA9IG11dGF0aW9uWzBdOwogICAgICAgIGlmIChub2RlMi5wYXJlbnROb2RlKSB7CiAgICAgICAgICBtdXRhdGlvblsxXS5mb3JFYWNoKGZ1bmN0aW9uKGFic3RyYWN0KSB7CiAgICAgICAgICAgIG5vZGUyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNvbnZlcnRTVkcoYWJzdHJhY3QpLCBub2RlMik7CiAgICAgICAgICB9KTsKICAgICAgICAgIGlmIChub2RlMi5nZXRBdHRyaWJ1dGUoREFUQV9GQV9JMlNWRykgPT09IG51bGwgJiYgY29uZmlnMi5rZWVwT3JpZ2luYWxTb3VyY2UpIHsKICAgICAgICAgICAgdmFyIGNvbW1lbnQzID0gRE9DVU1FTlQuY3JlYXRlQ29tbWVudChub2RlQXNDb21tZW50KG5vZGUyKSk7CiAgICAgICAgICAgIG5vZGUyLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGNvbW1lbnQzLCBub2RlMik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBub2RlMi5yZW1vdmUoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIG5lc3Q6IGZ1bmN0aW9uIG5lc3QobXV0YXRpb24pIHsKICAgICAgICB2YXIgbm9kZTIgPSBtdXRhdGlvblswXTsKICAgICAgICB2YXIgYWJzdHJhY3QgPSBtdXRhdGlvblsxXTsKICAgICAgICBpZiAofmNsYXNzQXJyYXkobm9kZTIpLmluZGV4T2YoY29uZmlnMi5yZXBsYWNlbWVudENsYXNzKSkgewogICAgICAgICAgcmV0dXJuIG11dGF0b3JzLnJlcGxhY2UobXV0YXRpb24pOwogICAgICAgIH0KICAgICAgICB2YXIgZm9yU3ZnID0gbmV3IFJlZ0V4cCgiIi5jb25jYXQoY29uZmlnMi5jc3NQcmVmaXgsICItLioiKSk7CiAgICAgICAgZGVsZXRlIGFic3RyYWN0WzBdLmF0dHJpYnV0ZXMuaWQ7CiAgICAgICAgaWYgKGFic3RyYWN0WzBdLmF0dHJpYnV0ZXMuY2xhc3MpIHsKICAgICAgICAgIHZhciBzcGxpdENsYXNzZXMgPSBhYnN0cmFjdFswXS5hdHRyaWJ1dGVzLmNsYXNzLnNwbGl0KCIgIikucmVkdWNlKGZ1bmN0aW9uKGFjYywgY2xzKSB7CiAgICAgICAgICAgIGlmIChjbHMgPT09IGNvbmZpZzIucmVwbGFjZW1lbnRDbGFzcyB8fCBjbHMubWF0Y2goZm9yU3ZnKSkgewogICAgICAgICAgICAgIGFjYy50b1N2Zy5wdXNoKGNscyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgYWNjLnRvTm9kZS5wdXNoKGNscyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGFjYzsKICAgICAgICAgIH0sIHsKICAgICAgICAgICAgdG9Ob2RlOiBbXSwKICAgICAgICAgICAgdG9Tdmc6IFtdCiAgICAgICAgICB9KTsKICAgICAgICAgIGFic3RyYWN0WzBdLmF0dHJpYnV0ZXMuY2xhc3MgPSBzcGxpdENsYXNzZXMudG9Tdmcuam9pbigiICIpOwogICAgICAgICAgaWYgKHNwbGl0Q2xhc3Nlcy50b05vZGUubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIG5vZGUyLnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5vZGUyLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCBzcGxpdENsYXNzZXMudG9Ob2RlLmpvaW4oIiAiKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBuZXdJbm5lckhUTUwgPSBhYnN0cmFjdC5tYXAoZnVuY3Rpb24oYTUpIHsKICAgICAgICAgIHJldHVybiB0b0h0bWwyKGE1KTsKICAgICAgICB9KS5qb2luKCJcbiIpOwogICAgICAgIG5vZGUyLnNldEF0dHJpYnV0ZShEQVRBX0ZBX0kyU1ZHLCAiIik7CiAgICAgICAgbm9kZTIuaW5uZXJIVE1MID0gbmV3SW5uZXJIVE1MOwogICAgICB9CiAgICB9OwogICAgZGlzYWJsZWQgPSBmYWxzZTsKICAgIG1vID0gbnVsbDsKICAgIHN0eWxlcyQyID0gbmFtZXNwYWNlLnN0eWxlczsKICAgIHJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcjIoaWNvbkRlZmluaXRpb24pIHsKICAgICAgdmFyIHBhcmFtczIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1sxXSA6IHt9OwogICAgICB2YXIgX3BhcmFtcyR0cmFuc2Zvcm0gPSBwYXJhbXMyLnRyYW5zZm9ybSwgdHJhbnNmb3JtMiA9IF9wYXJhbXMkdHJhbnNmb3JtID09PSB2b2lkIDAgPyBtZWFuaW5nbGVzc1RyYW5zZm9ybSA6IF9wYXJhbXMkdHJhbnNmb3JtLCBfcGFyYW1zJHN5bWJvbCA9IHBhcmFtczIuc3ltYm9sLCBzeW1ib2wgPSBfcGFyYW1zJHN5bWJvbCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcGFyYW1zJHN5bWJvbCwgX3BhcmFtcyRtYXNrID0gcGFyYW1zMi5tYXNrLCBtYXNrID0gX3BhcmFtcyRtYXNrID09PSB2b2lkIDAgPyBudWxsIDogX3BhcmFtcyRtYXNrLCBfcGFyYW1zJG1hc2tJZCA9IHBhcmFtczIubWFza0lkLCBtYXNrSWQgPSBfcGFyYW1zJG1hc2tJZCA9PT0gdm9pZCAwID8gbnVsbCA6IF9wYXJhbXMkbWFza0lkLCBfcGFyYW1zJGNsYXNzZXMgPSBwYXJhbXMyLmNsYXNzZXMsIGNsYXNzZXMgPSBfcGFyYW1zJGNsYXNzZXMgPT09IHZvaWQgMCA/IFtdIDogX3BhcmFtcyRjbGFzc2VzLCBfcGFyYW1zJGF0dHJpYnV0ZXMgPSBwYXJhbXMyLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMgPSBfcGFyYW1zJGF0dHJpYnV0ZXMgPT09IHZvaWQgMCA/IHt9IDogX3BhcmFtcyRhdHRyaWJ1dGVzLCBfcGFyYW1zJHN0eWxlcyA9IHBhcmFtczIuc3R5bGVzLCBzdHlsZXMzID0gX3BhcmFtcyRzdHlsZXMgPT09IHZvaWQgMCA/IHt9IDogX3BhcmFtcyRzdHlsZXM7CiAgICAgIGlmICghaWNvbkRlZmluaXRpb24pIHJldHVybjsKICAgICAgdmFyIHByZWZpeDQgPSBpY29uRGVmaW5pdGlvbi5wcmVmaXgsIGljb25OYW1lID0gaWNvbkRlZmluaXRpb24uaWNvbk5hbWUsIGljb24zID0gaWNvbkRlZmluaXRpb24uaWNvbjsKICAgICAgcmV0dXJuIGRvbVZhcmlhbnRzKF9vYmplY3RTcHJlYWQyKHsKICAgICAgICB0eXBlOiAiaWNvbiIKICAgICAgfSwgaWNvbkRlZmluaXRpb24pLCBmdW5jdGlvbigpIHsKICAgICAgICBjYWxsSG9va3MoImJlZm9yZURPTUVsZW1lbnRDcmVhdGlvbiIsIHsKICAgICAgICAgIGljb25EZWZpbml0aW9uLAogICAgICAgICAgcGFyYW1zOiBwYXJhbXMyCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIG1ha2VJbmxpbmVTdmdBYnN0cmFjdCh7CiAgICAgICAgICBpY29uczogewogICAgICAgICAgICBtYWluOiBhc0ZvdW5kSWNvbihpY29uMyksCiAgICAgICAgICAgIG1hc2s6IG1hc2sgPyBhc0ZvdW5kSWNvbihtYXNrLmljb24pIDogewogICAgICAgICAgICAgIGZvdW5kOiBmYWxzZSwKICAgICAgICAgICAgICB3aWR0aDogbnVsbCwKICAgICAgICAgICAgICBoZWlnaHQ6IG51bGwsCiAgICAgICAgICAgICAgaWNvbjoge30KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIHByZWZpeDogcHJlZml4NCwKICAgICAgICAgIGljb25OYW1lLAogICAgICAgICAgdHJhbnNmb3JtOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgbWVhbmluZ2xlc3NUcmFuc2Zvcm0pLCB0cmFuc2Zvcm0yKSwKICAgICAgICAgIHN5bWJvbCwKICAgICAgICAgIG1hc2tJZCwKICAgICAgICAgIGV4dHJhOiB7CiAgICAgICAgICAgIGF0dHJpYnV0ZXMsCiAgICAgICAgICAgIHN0eWxlczogc3R5bGVzMywKICAgICAgICAgICAgY2xhc3NlcwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9KTsKICAgIH07CiAgICBSZXBsYWNlRWxlbWVudHMgPSB7CiAgICAgIG1peG91dDogZnVuY3Rpb24gbWl4b3V0MigpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgaWNvbjogcmVzb2x2ZUljb25zKHJlbmRlcikKICAgICAgICB9OwogICAgICB9LAogICAgICBob29rczogZnVuY3Rpb24gaG9va3MyKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBtdXRhdGlvbk9ic2VydmVyQ2FsbGJhY2tzOiBmdW5jdGlvbiBtdXRhdGlvbk9ic2VydmVyQ2FsbGJhY2tzKGFjY3VtdWxhdG9yKSB7CiAgICAgICAgICAgIGFjY3VtdWxhdG9yLnRyZWVDYWxsYmFjayA9IG9uVHJlZTsKICAgICAgICAgICAgYWNjdW11bGF0b3Iubm9kZUNhbGxiYWNrID0gb25Ob2RlOwogICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfSwKICAgICAgcHJvdmlkZXM6IGZ1bmN0aW9uIHByb3ZpZGVzKHByb3ZpZGVycyQkMSkgewogICAgICAgIHByb3ZpZGVycyQkMS5pMnN2ZyA9IGZ1bmN0aW9uKHBhcmFtczIpIHsKICAgICAgICAgIHZhciBfcGFyYW1zJG5vZGUgPSBwYXJhbXMyLm5vZGUsIG5vZGUyID0gX3BhcmFtcyRub2RlID09PSB2b2lkIDAgPyBET0NVTUVOVCA6IF9wYXJhbXMkbm9kZSwgX3BhcmFtcyRjYWxsYmFjayA9IHBhcmFtczIuY2FsbGJhY2ssIGNhbGxiYWNrID0gX3BhcmFtcyRjYWxsYmFjayA9PT0gdm9pZCAwID8gZnVuY3Rpb24oKSB7CiAgICAgICAgICB9IDogX3BhcmFtcyRjYWxsYmFjazsKICAgICAgICAgIHJldHVybiBvblRyZWUobm9kZTIsIGNhbGxiYWNrKTsKICAgICAgICB9OwogICAgICAgIHByb3ZpZGVycyQkMS5nZW5lcmF0ZVN2Z1JlcGxhY2VtZW50TXV0YXRpb24gPSBmdW5jdGlvbihub2RlMiwgbm9kZU1ldGEpIHsKICAgICAgICAgIHZhciBpY29uTmFtZSA9IG5vZGVNZXRhLmljb25OYW1lLCBwcmVmaXg0ID0gbm9kZU1ldGEucHJlZml4LCB0cmFuc2Zvcm0yID0gbm9kZU1ldGEudHJhbnNmb3JtLCBzeW1ib2wgPSBub2RlTWV0YS5zeW1ib2wsIG1hc2sgPSBub2RlTWV0YS5tYXNrLCBtYXNrSWQgPSBub2RlTWV0YS5tYXNrSWQsIGV4dHJhID0gbm9kZU1ldGEuZXh0cmE7CiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZTIsIHJlamVjdCkgewogICAgICAgICAgICBQcm9taXNlLmFsbChbZmluZEljb24oaWNvbk5hbWUsIHByZWZpeDQpLCBtYXNrLmljb25OYW1lID8gZmluZEljb24obWFzay5pY29uTmFtZSwgbWFzay5wcmVmaXgpIDogUHJvbWlzZS5yZXNvbHZlKHsKICAgICAgICAgICAgICBmb3VuZDogZmFsc2UsCiAgICAgICAgICAgICAgd2lkdGg6IDUxMiwKICAgICAgICAgICAgICBoZWlnaHQ6IDUxMiwKICAgICAgICAgICAgICBpY29uOiB7fQogICAgICAgICAgICB9KV0pLnRoZW4oZnVuY3Rpb24oX3JlZjIpIHsKICAgICAgICAgICAgICB2YXIgX3JlZjIyID0gX3NsaWNlZFRvQXJyYXkoX3JlZjIsIDIpLCBtYWluID0gX3JlZjIyWzBdLCBtYXNrMiA9IF9yZWYyMlsxXTsKICAgICAgICAgICAgICByZXNvbHZlMihbbm9kZTIsIG1ha2VJbmxpbmVTdmdBYnN0cmFjdCh7CiAgICAgICAgICAgICAgICBpY29uczogewogICAgICAgICAgICAgICAgICBtYWluLAogICAgICAgICAgICAgICAgICBtYXNrOiBtYXNrMgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHByZWZpeDogcHJlZml4NCwKICAgICAgICAgICAgICAgIGljb25OYW1lLAogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0yLAogICAgICAgICAgICAgICAgc3ltYm9sLAogICAgICAgICAgICAgICAgbWFza0lkLAogICAgICAgICAgICAgICAgZXh0cmEsCiAgICAgICAgICAgICAgICB3YXRjaGFibGU6IHRydWUKICAgICAgICAgICAgICB9KV0pOwogICAgICAgICAgICB9KS5jYXRjaChyZWplY3QpOwogICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBwcm92aWRlcnMkJDEuZ2VuZXJhdGVBYnN0cmFjdEljb24gPSBmdW5jdGlvbihfcmVmMykgewogICAgICAgICAgdmFyIGNoaWxkcmVuMiA9IF9yZWYzLmNoaWxkcmVuLCBhdHRyaWJ1dGVzID0gX3JlZjMuYXR0cmlidXRlcywgbWFpbiA9IF9yZWYzLm1haW4sIHRyYW5zZm9ybTIgPSBfcmVmMy50cmFuc2Zvcm0sIHN0eWxlczMgPSBfcmVmMy5zdHlsZXM7CiAgICAgICAgICB2YXIgc3R5bGVTdHJpbmcgPSBqb2luU3R5bGVzKHN0eWxlczMpOwogICAgICAgICAgaWYgKHN0eWxlU3RyaW5nLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgYXR0cmlidXRlc1sic3R5bGUiXSA9IHN0eWxlU3RyaW5nOwogICAgICAgICAgfQogICAgICAgICAgdmFyIG5leHRDaGlsZDsKICAgICAgICAgIGlmICh0cmFuc2Zvcm1Jc01lYW5pbmdmdWwodHJhbnNmb3JtMikpIHsKICAgICAgICAgICAgbmV4dENoaWxkID0gY2FsbFByb3ZpZGVkKCJnZW5lcmF0ZUFic3RyYWN0VHJhbnNmb3JtR3JvdXBpbmciLCB7CiAgICAgICAgICAgICAgbWFpbiwKICAgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybTIsCiAgICAgICAgICAgICAgY29udGFpbmVyV2lkdGg6IG1haW4ud2lkdGgsCiAgICAgICAgICAgICAgaWNvbldpZHRoOiBtYWluLndpZHRoCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgY2hpbGRyZW4yLnB1c2gobmV4dENoaWxkIHx8IG1haW4uaWNvbik7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW4yLAogICAgICAgICAgICBhdHRyaWJ1dGVzCiAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgIH0KICAgIH07CiAgICBMYXllcnMgPSB7CiAgICAgIG1peG91dDogZnVuY3Rpb24gbWl4b3V0MygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgbGF5ZXI6IGZ1bmN0aW9uIGxheWVyMihhc3NlbWJsZXIpIHsKICAgICAgICAgICAgdmFyIHBhcmFtczIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1sxXSA6IHt9OwogICAgICAgICAgICB2YXIgX3BhcmFtcyRjbGFzc2VzID0gcGFyYW1zMi5jbGFzc2VzLCBjbGFzc2VzID0gX3BhcmFtcyRjbGFzc2VzID09PSB2b2lkIDAgPyBbXSA6IF9wYXJhbXMkY2xhc3NlczsKICAgICAgICAgICAgcmV0dXJuIGRvbVZhcmlhbnRzKHsKICAgICAgICAgICAgICB0eXBlOiAibGF5ZXIiCiAgICAgICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNhbGxIb29rcygiYmVmb3JlRE9NRWxlbWVudENyZWF0aW9uIiwgewogICAgICAgICAgICAgICAgYXNzZW1ibGVyLAogICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXMyCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgdmFyIGNoaWxkcmVuMiA9IFtdOwogICAgICAgICAgICAgIGFzc2VtYmxlcihmdW5jdGlvbihhcmdzKSB7CiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGFyZ3MpID8gYXJncy5tYXAoZnVuY3Rpb24oYTUpIHsKICAgICAgICAgICAgICAgICAgY2hpbGRyZW4yID0gY2hpbGRyZW4yLmNvbmNhdChhNS5hYnN0cmFjdCk7CiAgICAgICAgICAgICAgICB9KSA6IGNoaWxkcmVuMiA9IGNoaWxkcmVuMi5jb25jYXQoYXJncy5hYnN0cmFjdCk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgcmV0dXJuIFt7CiAgICAgICAgICAgICAgICB0YWc6ICJzcGFuIiwKICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgICAgICAgICAgY2xhc3M6IFsiIi5jb25jYXQoY29uZmlnMi5jc3NQcmVmaXgsICItbGF5ZXJzIildLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoY2xhc3NlcykpLmpvaW4oIiAiKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbjIKICAgICAgICAgICAgICB9XTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIExheWVyc0NvdW50ZXIgPSB7CiAgICAgIG1peG91dDogZnVuY3Rpb24gbWl4b3V0NCgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgY291bnRlcjogZnVuY3Rpb24gY291bnRlcjIoY29udGVudDMpIHsKICAgICAgICAgICAgdmFyIHBhcmFtczIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHZvaWQgMCA/IGFyZ3VtZW50c1sxXSA6IHt9OwogICAgICAgICAgICB2YXIgX3BhcmFtcyR0aXRsZSA9IHBhcmFtczIudGl0bGUsIHRpdGxlID0gX3BhcmFtcyR0aXRsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9wYXJhbXMkdGl0bGUsIF9wYXJhbXMkY2xhc3NlcyA9IHBhcmFtczIuY2xhc3NlcywgY2xhc3NlcyA9IF9wYXJhbXMkY2xhc3NlcyA9PT0gdm9pZCAwID8gW10gOiBfcGFyYW1zJGNsYXNzZXMsIF9wYXJhbXMkYXR0cmlidXRlcyA9IHBhcmFtczIuYXR0cmlidXRlcywgYXR0cmlidXRlcyA9IF9wYXJhbXMkYXR0cmlidXRlcyA9PT0gdm9pZCAwID8ge30gOiBfcGFyYW1zJGF0dHJpYnV0ZXMsIF9wYXJhbXMkc3R5bGVzID0gcGFyYW1zMi5zdHlsZXMsIHN0eWxlczMgPSBfcGFyYW1zJHN0eWxlcyA9PT0gdm9pZCAwID8ge30gOiBfcGFyYW1zJHN0eWxlczsKICAgICAgICAgICAgcmV0dXJuIGRvbVZhcmlhbnRzKHsKICAgICAgICAgICAgICB0eXBlOiAiY291bnRlciIsCiAgICAgICAgICAgICAgY29udGVudDogY29udGVudDMKICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgY2FsbEhvb2tzKCJiZWZvcmVET01FbGVtZW50Q3JlYXRpb24iLCB7CiAgICAgICAgICAgICAgICBjb250ZW50OiBjb250ZW50MywKICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1zMgogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHJldHVybiBtYWtlTGF5ZXJzQ291bnRlckFic3RyYWN0KHsKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQzLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICB0aXRsZSwKICAgICAgICAgICAgICAgIGV4dHJhOiB7CiAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgIHN0eWxlczogc3R5bGVzMywKICAgICAgICAgICAgICAgICAgY2xhc3NlczogWyIiLmNvbmNhdChjb25maWcyLmNzc1ByZWZpeCwgIi1sYXllcnMtY291bnRlciIpXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGNsYXNzZXMpKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgTGF5ZXJzVGV4dCA9IHsKICAgICAgbWl4b3V0OiBmdW5jdGlvbiBtaXhvdXQ1KCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0ZXh0OiBmdW5jdGlvbiB0ZXh0OShjb250ZW50MykgewogICAgICAgICAgICB2YXIgcGFyYW1zMiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdm9pZCAwID8gYXJndW1lbnRzWzFdIDoge307CiAgICAgICAgICAgIHZhciBfcGFyYW1zJHRyYW5zZm9ybSA9IHBhcmFtczIudHJhbnNmb3JtLCB0cmFuc2Zvcm0yID0gX3BhcmFtcyR0cmFuc2Zvcm0gPT09IHZvaWQgMCA/IG1lYW5pbmdsZXNzVHJhbnNmb3JtIDogX3BhcmFtcyR0cmFuc2Zvcm0sIF9wYXJhbXMkY2xhc3NlcyA9IHBhcmFtczIuY2xhc3NlcywgY2xhc3NlcyA9IF9wYXJhbXMkY2xhc3NlcyA9PT0gdm9pZCAwID8gW10gOiBfcGFyYW1zJGNsYXNzZXMsIF9wYXJhbXMkYXR0cmlidXRlcyA9IHBhcmFtczIuYXR0cmlidXRlcywgYXR0cmlidXRlcyA9IF9wYXJhbXMkYXR0cmlidXRlcyA9PT0gdm9pZCAwID8ge30gOiBfcGFyYW1zJGF0dHJpYnV0ZXMsIF9wYXJhbXMkc3R5bGVzID0gcGFyYW1zMi5zdHlsZXMsIHN0eWxlczMgPSBfcGFyYW1zJHN0eWxlcyA9PT0gdm9pZCAwID8ge30gOiBfcGFyYW1zJHN0eWxlczsKICAgICAgICAgICAgcmV0dXJuIGRvbVZhcmlhbnRzKHsKICAgICAgICAgICAgICB0eXBlOiAidGV4dCIsCiAgICAgICAgICAgICAgY29udGVudDogY29udGVudDMKICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgY2FsbEhvb2tzKCJiZWZvcmVET01FbGVtZW50Q3JlYXRpb24iLCB7CiAgICAgICAgICAgICAgICBjb250ZW50OiBjb250ZW50MywKICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1zMgogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHJldHVybiBtYWtlTGF5ZXJzVGV4dEFic3RyYWN0KHsKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQzLAogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgbWVhbmluZ2xlc3NUcmFuc2Zvcm0pLCB0cmFuc2Zvcm0yKSwKICAgICAgICAgICAgICAgIGV4dHJhOiB7CiAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgIHN0eWxlczogc3R5bGVzMywKICAgICAgICAgICAgICAgICAgY2xhc3NlczogWyIiLmNvbmNhdChjb25maWcyLmNzc1ByZWZpeCwgIi1sYXllcnMtdGV4dCIpXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGNsYXNzZXMpKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9LAogICAgICBwcm92aWRlczogZnVuY3Rpb24gcHJvdmlkZXMyKHByb3ZpZGVycyQkMSkgewogICAgICAgIHByb3ZpZGVycyQkMS5nZW5lcmF0ZUxheWVyc1RleHQgPSBmdW5jdGlvbihub2RlMiwgbm9kZU1ldGEpIHsKICAgICAgICAgIHZhciB0cmFuc2Zvcm0yID0gbm9kZU1ldGEudHJhbnNmb3JtLCBleHRyYSA9IG5vZGVNZXRhLmV4dHJhOwogICAgICAgICAgdmFyIHdpZHRoID0gbnVsbDsKICAgICAgICAgIHZhciBoZWlnaHQgPSBudWxsOwogICAgICAgICAgaWYgKElTX0lFKSB7CiAgICAgICAgICAgIHZhciBjb21wdXRlZEZvbnRTaXplID0gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShub2RlMikuZm9udFNpemUsIDEwKTsKICAgICAgICAgICAgdmFyIGJvdW5kaW5nQ2xpZW50UmVjdCA9IG5vZGUyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICB3aWR0aCA9IGJvdW5kaW5nQ2xpZW50UmVjdC53aWR0aCAvIGNvbXB1dGVkRm9udFNpemU7CiAgICAgICAgICAgIGhlaWdodCA9IGJvdW5kaW5nQ2xpZW50UmVjdC5oZWlnaHQgLyBjb21wdXRlZEZvbnRTaXplOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbbm9kZTIsIG1ha2VMYXllcnNUZXh0QWJzdHJhY3QoewogICAgICAgICAgICBjb250ZW50OiBub2RlMi5pbm5lckhUTUwsCiAgICAgICAgICAgIHdpZHRoLAogICAgICAgICAgICBoZWlnaHQsCiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtMiwKICAgICAgICAgICAgZXh0cmEsCiAgICAgICAgICAgIHdhdGNoYWJsZTogdHJ1ZQogICAgICAgICAgfSldKTsKICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgQ0xFQU5fQ09OVEVOVF9QQVRURVJOID0gbmV3IFJlZ0V4cCgnIicsICJ1ZyIpOwogICAgU0VDT05EQVJZX1VOSUNPREVfUkFOR0UgPSBbMTEwNTkyMCwgMTExMjMxOV07CiAgICBfRk9OVF9GQU1JTFlfV0VJR0hUX1RPX1BSRUZJWCA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCB7CiAgICAgIEZvbnRBd2Vzb21lOiB7CiAgICAgICAgbm9ybWFsOiAiZmFzIiwKICAgICAgICA0MDA6ICJmYXMiCiAgICAgIH0KICAgIH0pLCBLdCksIGZvKSwgaGwpOwogICAgRk9OVF9GQU1JTFlfV0VJR0hUX1RPX1BSRUZJWCA9IE9iamVjdC5rZXlzKF9GT05UX0ZBTUlMWV9XRUlHSFRfVE9fUFJFRklYKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLCBrZXkyKSB7CiAgICAgIGFjY1trZXkyLnRvTG93ZXJDYXNlKCldID0gX0ZPTlRfRkFNSUxZX1dFSUdIVF9UT19QUkVGSVhba2V5Ml07CiAgICAgIHJldHVybiBhY2M7CiAgICB9LCB7fSk7CiAgICBGT05UX0ZBTUlMWV9XRUlHSFRfRkFMTEJBQ0sgPSBPYmplY3Qua2V5cyhGT05UX0ZBTUlMWV9XRUlHSFRfVE9fUFJFRklYKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLCBmb250RmFtaWx5KSB7CiAgICAgIHZhciB3ZWlnaHRzID0gRk9OVF9GQU1JTFlfV0VJR0hUX1RPX1BSRUZJWFtmb250RmFtaWx5XTsKICAgICAgYWNjW2ZvbnRGYW1pbHldID0gd2VpZ2h0c1s5MDBdIHx8IF90b0NvbnN1bWFibGVBcnJheShPYmplY3QuZW50cmllcyh3ZWlnaHRzKSlbMF1bMV07CiAgICAgIHJldHVybiBhY2M7CiAgICB9LCB7fSk7CiAgICBoYXNQc2V1ZG9FbGVtZW50ID0gZnVuY3Rpb24gaGFzUHNldWRvRWxlbWVudDIoc2VsZWN0b3IpIHsKICAgICAgcmV0dXJuICEhc2VsZWN0b3IgJiYgUFNFVURPX0VMRU1FTlRTLnNvbWUoZnVuY3Rpb24ocHNldWRvU2VsZWN0b3IpIHsKICAgICAgICByZXR1cm4gc2VsZWN0b3IuaW5jbHVkZXMocHNldWRvU2VsZWN0b3IpOwogICAgICB9KTsKICAgIH07CiAgICBwYXJzZUNTU1J1bGVGb3JQc2V1ZG9zID0gZnVuY3Rpb24gcGFyc2VDU1NSdWxlRm9yUHNldWRvczIoc2VsZWN0b3JUZXh0KSB7CiAgICAgIGlmICghc2VsZWN0b3JUZXh0KSByZXR1cm4gW107CiAgICAgIHZhciBzZWxlY3RvclNldCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICAgIHZhciBzZWxlY3RvcnMgPSBzZWxlY3RvclRleHQuc3BsaXQoLywoPyFbXigpXSpcKSkvKS5tYXAoZnVuY3Rpb24ocyQkMSkgewogICAgICAgIHJldHVybiBzJCQxLnRyaW0oKTsKICAgICAgfSk7CiAgICAgIHNlbGVjdG9ycyA9IHNlbGVjdG9ycy5mbGF0TWFwKGZ1bmN0aW9uKHNlbGVjdG9yMikgewogICAgICAgIHJldHVybiBzZWxlY3RvcjIuaW5jbHVkZXMoIigiKSA/IHNlbGVjdG9yMiA6IHNlbGVjdG9yMi5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihzJCQxKSB7CiAgICAgICAgICByZXR1cm4gcyQkMS50cmltKCk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc2VsZWN0b3JzKSwgX3N0ZXA7CiAgICAgIHRyeSB7CiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTsgKSB7CiAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBfc3RlcC52YWx1ZTsKICAgICAgICAgIGlmIChoYXNQc2V1ZG9FbGVtZW50KHNlbGVjdG9yKSkgewogICAgICAgICAgICB2YXIgc2VsZWN0b3JXaXRob3V0UHNldWRvID0gUFNFVURPX0VMRU1FTlRTLnJlZHVjZShmdW5jdGlvbihhY2MsIHBzZXVkb1NlbGVjdG9yKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGFjYy5yZXBsYWNlKHBzZXVkb1NlbGVjdG9yLCAiIik7CiAgICAgICAgICAgIH0sIHNlbGVjdG9yKTsKICAgICAgICAgICAgaWYgKHNlbGVjdG9yV2l0aG91dFBzZXVkbyAhPT0gIiIgJiYgc2VsZWN0b3JXaXRob3V0UHNldWRvICE9PSAiKiIpIHsKICAgICAgICAgICAgICBzZWxlY3RvclNldC5hZGQoc2VsZWN0b3JXaXRob3V0UHNldWRvKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBfaXRlcmF0b3IuZigpOwogICAgICB9CiAgICAgIHJldHVybiBzZWxlY3RvclNldDsKICAgIH07CiAgICBQc2V1ZG9FbGVtZW50cyA9IHsKICAgICAgaG9va3M6IGZ1bmN0aW9uIGhvb2tzMygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgbXV0YXRpb25PYnNlcnZlckNhbGxiYWNrczogZnVuY3Rpb24gbXV0YXRpb25PYnNlcnZlckNhbGxiYWNrcyhhY2N1bXVsYXRvcikgewogICAgICAgICAgICBhY2N1bXVsYXRvci5wc2V1ZG9FbGVtZW50c0NhbGxiYWNrID0gc2VhcmNoUHNldWRvRWxlbWVudHM7CiAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9LAogICAgICBwcm92aWRlczogZnVuY3Rpb24gcHJvdmlkZXMzKHByb3ZpZGVyczIpIHsKICAgICAgICBwcm92aWRlcnMyLnBzZXVkb0VsZW1lbnRzMnN2ZyA9IGZ1bmN0aW9uKHBhcmFtczIpIHsKICAgICAgICAgIHZhciBfcGFyYW1zJG5vZGUgPSBwYXJhbXMyLm5vZGUsIG5vZGUyID0gX3BhcmFtcyRub2RlID09PSB2b2lkIDAgPyBET0NVTUVOVCA6IF9wYXJhbXMkbm9kZTsKICAgICAgICAgIGlmIChjb25maWcyLnNlYXJjaFBzZXVkb0VsZW1lbnRzKSB7CiAgICAgICAgICAgIHNlYXJjaFBzZXVkb0VsZW1lbnRzKG5vZGUyKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgX3Vud2F0Y2hlZCA9IGZhbHNlOwogICAgTXV0YXRpb25PYnNlcnZlciQxID0gewogICAgICBtaXhvdXQ6IGZ1bmN0aW9uIG1peG91dDYoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGRvbTogewogICAgICAgICAgICB1bndhdGNoOiBmdW5jdGlvbiB1bndhdGNoKCkgewogICAgICAgICAgICAgIGRpc2FibGVPYnNlcnZhdGlvbigpOwogICAgICAgICAgICAgIF91bndhdGNoZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfSwKICAgICAgaG9va3M6IGZ1bmN0aW9uIGhvb2tzNCgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgYm9vdHN0cmFwOiBmdW5jdGlvbiBib290c3RyYXAoKSB7CiAgICAgICAgICAgIG9ic2VydmUoY2hhaW5Ib29rcygibXV0YXRpb25PYnNlcnZlckNhbGxiYWNrcyIsIHt9KSk7CiAgICAgICAgICB9LAogICAgICAgICAgbm9BdXRvOiBmdW5jdGlvbiBub0F1dG8zKCkgewogICAgICAgICAgICBkaXNjb25uZWN0KCk7CiAgICAgICAgICB9LAogICAgICAgICAgd2F0Y2g6IGZ1bmN0aW9uIHdhdGNoMihwYXJhbXMyKSB7CiAgICAgICAgICAgIHZhciBvYnNlcnZlTXV0YXRpb25zUm9vdCA9IHBhcmFtczIub2JzZXJ2ZU11dGF0aW9uc1Jvb3Q7CiAgICAgICAgICAgIGlmIChfdW53YXRjaGVkKSB7CiAgICAgICAgICAgICAgZW5hYmxlT2JzZXJ2YXRpb24oKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBvYnNlcnZlKGNoYWluSG9va3MoIm11dGF0aW9uT2JzZXJ2ZXJDYWxsYmFja3MiLCB7CiAgICAgICAgICAgICAgICBvYnNlcnZlTXV0YXRpb25zUm9vdAogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0KICAgIH07CiAgICBwYXJzZVRyYW5zZm9ybVN0cmluZyA9IGZ1bmN0aW9uIHBhcnNlVHJhbnNmb3JtU3RyaW5nMih0cmFuc2Zvcm1TdHJpbmcpIHsKICAgICAgdmFyIHRyYW5zZm9ybTIgPSB7CiAgICAgICAgc2l6ZTogMTYsCiAgICAgICAgeDogMCwKICAgICAgICB5OiAwLAogICAgICAgIGZsaXBYOiBmYWxzZSwKICAgICAgICBmbGlwWTogZmFsc2UsCiAgICAgICAgcm90YXRlOiAwCiAgICAgIH07CiAgICAgIHJldHVybiB0cmFuc2Zvcm1TdHJpbmcudG9Mb3dlckNhc2UoKS5zcGxpdCgiICIpLnJlZHVjZShmdW5jdGlvbihhY2MsIG4xMykgewogICAgICAgIHZhciBwYXJ0cyA9IG4xMy50b0xvd2VyQ2FzZSgpLnNwbGl0KCItIik7CiAgICAgICAgdmFyIGZpcnN0MiA9IHBhcnRzWzBdOwogICAgICAgIHZhciByZXN0ID0gcGFydHMuc2xpY2UoMSkuam9pbigiLSIpOwogICAgICAgIGlmIChmaXJzdDIgJiYgcmVzdCA9PT0gImgiKSB7CiAgICAgICAgICBhY2MuZmxpcFggPSB0cnVlOwogICAgICAgICAgcmV0dXJuIGFjYzsKICAgICAgICB9CiAgICAgICAgaWYgKGZpcnN0MiAmJiByZXN0ID09PSAidiIpIHsKICAgICAgICAgIGFjYy5mbGlwWSA9IHRydWU7CiAgICAgICAgICByZXR1cm4gYWNjOwogICAgICAgIH0KICAgICAgICByZXN0ID0gcGFyc2VGbG9hdChyZXN0KTsKICAgICAgICBpZiAoaXNOYU4ocmVzdCkpIHsKICAgICAgICAgIHJldHVybiBhY2M7CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAoZmlyc3QyKSB7CiAgICAgICAgICBjYXNlICJncm93IjoKICAgICAgICAgICAgYWNjLnNpemUgPSBhY2Muc2l6ZSArIHJlc3Q7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAic2hyaW5rIjoKICAgICAgICAgICAgYWNjLnNpemUgPSBhY2Muc2l6ZSAtIHJlc3Q7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAibGVmdCI6CiAgICAgICAgICAgIGFjYy54ID0gYWNjLnggLSByZXN0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgInJpZ2h0IjoKICAgICAgICAgICAgYWNjLnggPSBhY2MueCArIHJlc3Q7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAidXAiOgogICAgICAgICAgICBhY2MueSA9IGFjYy55IC0gcmVzdDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJkb3duIjoKICAgICAgICAgICAgYWNjLnkgPSBhY2MueSArIHJlc3Q7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAicm90YXRlIjoKICAgICAgICAgICAgYWNjLnJvdGF0ZSA9IGFjYy5yb3RhdGUgKyByZXN0OwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFjYzsKICAgICAgfSwgdHJhbnNmb3JtMik7CiAgICB9OwogICAgUG93ZXJUcmFuc2Zvcm1zID0gewogICAgICBtaXhvdXQ6IGZ1bmN0aW9uIG1peG91dDcoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHBhcnNlOiB7CiAgICAgICAgICAgIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtMih0cmFuc2Zvcm1TdHJpbmcpIHsKICAgICAgICAgICAgICByZXR1cm4gcGFyc2VUcmFuc2Zvcm1TdHJpbmcodHJhbnNmb3JtU3RyaW5nKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIGhvb2tzOiBmdW5jdGlvbiBob29rczUoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHBhcnNlTm9kZUF0dHJpYnV0ZXM6IGZ1bmN0aW9uIHBhcnNlTm9kZUF0dHJpYnV0ZXMoYWNjdW11bGF0b3IsIG5vZGUyKSB7CiAgICAgICAgICAgIHZhciB0cmFuc2Zvcm1TdHJpbmcgPSBub2RlMi5nZXRBdHRyaWJ1dGUoImRhdGEtZmEtdHJhbnNmb3JtIik7CiAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1TdHJpbmcpIHsKICAgICAgICAgICAgICBhY2N1bXVsYXRvci50cmFuc2Zvcm0gPSBwYXJzZVRyYW5zZm9ybVN0cmluZyh0cmFuc2Zvcm1TdHJpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9LAogICAgICBwcm92aWRlczogZnVuY3Rpb24gcHJvdmlkZXM0KHByb3ZpZGVyczIpIHsKICAgICAgICBwcm92aWRlcnMyLmdlbmVyYXRlQWJzdHJhY3RUcmFuc2Zvcm1Hcm91cGluZyA9IGZ1bmN0aW9uKF9yZWYyKSB7CiAgICAgICAgICB2YXIgbWFpbiA9IF9yZWYyLm1haW4sIHRyYW5zZm9ybTIgPSBfcmVmMi50cmFuc2Zvcm0sIGNvbnRhaW5lcldpZHRoID0gX3JlZjIuY29udGFpbmVyV2lkdGgsIGljb25XaWR0aCA9IF9yZWYyLmljb25XaWR0aDsKICAgICAgICAgIHZhciBvdXRlciA9IHsKICAgICAgICAgICAgdHJhbnNmb3JtOiAidHJhbnNsYXRlKCIuY29uY2F0KGNvbnRhaW5lcldpZHRoIC8gMiwgIiAyNTYpIikKICAgICAgICAgIH07CiAgICAgICAgICB2YXIgaW5uZXJUcmFuc2xhdGUgPSAidHJhbnNsYXRlKCIuY29uY2F0KHRyYW5zZm9ybTIueCAqIDMyLCAiLCAiKS5jb25jYXQodHJhbnNmb3JtMi55ICogMzIsICIpICIpOwogICAgICAgICAgdmFyIGlubmVyU2NhbGUgPSAic2NhbGUoIi5jb25jYXQodHJhbnNmb3JtMi5zaXplIC8gMTYgKiAodHJhbnNmb3JtMi5mbGlwWCA/IC0xIDogMSksICIsICIpLmNvbmNhdCh0cmFuc2Zvcm0yLnNpemUgLyAxNiAqICh0cmFuc2Zvcm0yLmZsaXBZID8gLTEgOiAxKSwgIikgIik7CiAgICAgICAgICB2YXIgaW5uZXJSb3RhdGUgPSAicm90YXRlKCIuY29uY2F0KHRyYW5zZm9ybTIucm90YXRlLCAiIDAgMCkiKTsKICAgICAgICAgIHZhciBpbm5lciA9IHsKICAgICAgICAgICAgdHJhbnNmb3JtOiAiIi5jb25jYXQoaW5uZXJUcmFuc2xhdGUsICIgIikuY29uY2F0KGlubmVyU2NhbGUsICIgIikuY29uY2F0KGlubmVyUm90YXRlKQogICAgICAgICAgfTsKICAgICAgICAgIHZhciBwYXRoMiA9IHsKICAgICAgICAgICAgdHJhbnNmb3JtOiAidHJhbnNsYXRlKCIuY29uY2F0KGljb25XaWR0aCAvIDIgKiAtMSwgIiAtMjU2KSIpCiAgICAgICAgICB9OwogICAgICAgICAgdmFyIG9wZXJhdGlvbnMgPSB7CiAgICAgICAgICAgIG91dGVyLAogICAgICAgICAgICBpbm5lciwKICAgICAgICAgICAgcGF0aDogcGF0aDIKICAgICAgICAgIH07CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0YWc6ICJnIiwKICAgICAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoe30sIG9wZXJhdGlvbnMub3V0ZXIpLAogICAgICAgICAgICBjaGlsZHJlbjogW3sKICAgICAgICAgICAgICB0YWc6ICJnIiwKICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMih7fSwgb3BlcmF0aW9ucy5pbm5lciksCiAgICAgICAgICAgICAgY2hpbGRyZW46IFt7CiAgICAgICAgICAgICAgICB0YWc6IG1haW4uaWNvbi50YWcsCiAgICAgICAgICAgICAgICBjaGlsZHJlbjogbWFpbi5pY29uLmNoaWxkcmVuLAogICAgICAgICAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG1haW4uaWNvbi5hdHRyaWJ1dGVzKSwgb3BlcmF0aW9ucy5wYXRoKQogICAgICAgICAgICAgIH1dCiAgICAgICAgICAgIH1dCiAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgIH0KICAgIH07CiAgICBBTExfU1BBQ0UgPSB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHdpZHRoOiAiMTAwJSIsCiAgICAgIGhlaWdodDogIjEwMCUiCiAgICB9OwogICAgTWFza3MgPSB7CiAgICAgIGhvb2tzOiBmdW5jdGlvbiBob29rczYoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHBhcnNlTm9kZUF0dHJpYnV0ZXM6IGZ1bmN0aW9uIHBhcnNlTm9kZUF0dHJpYnV0ZXMoYWNjdW11bGF0b3IsIG5vZGUyKSB7CiAgICAgICAgICAgIHZhciBtYXNrRGF0YSA9IG5vZGUyLmdldEF0dHJpYnV0ZSgiZGF0YS1mYS1tYXNrIik7CiAgICAgICAgICAgIHZhciBtYXNrID0gIW1hc2tEYXRhID8gZW1wdHlDYW5vbmljYWxJY29uKCkgOiBnZXRDYW5vbmljYWxJY29uKG1hc2tEYXRhLnNwbGl0KCIgIikubWFwKGZ1bmN0aW9uKGkxMSkgewogICAgICAgICAgICAgIHJldHVybiBpMTEudHJpbSgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGlmICghbWFzay5wcmVmaXgpIHsKICAgICAgICAgICAgICBtYXNrLnByZWZpeCA9IGdldERlZmF1bHRVc2FibGVQcmVmaXgoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhY2N1bXVsYXRvci5tYXNrID0gbWFzazsKICAgICAgICAgICAgYWNjdW11bGF0b3IubWFza0lkID0gbm9kZTIuZ2V0QXR0cmlidXRlKCJkYXRhLWZhLW1hc2staWQiKTsKICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIHByb3ZpZGVzOiBmdW5jdGlvbiBwcm92aWRlczUocHJvdmlkZXJzMikgewogICAgICAgIHByb3ZpZGVyczIuZ2VuZXJhdGVBYnN0cmFjdE1hc2sgPSBmdW5jdGlvbihfcmVmMikgewogICAgICAgICAgdmFyIGNoaWxkcmVuMiA9IF9yZWYyLmNoaWxkcmVuLCBhdHRyaWJ1dGVzID0gX3JlZjIuYXR0cmlidXRlcywgbWFpbiA9IF9yZWYyLm1haW4sIG1hc2sgPSBfcmVmMi5tYXNrLCBleHBsaWNpdE1hc2tJZCA9IF9yZWYyLm1hc2tJZCwgdHJhbnNmb3JtMiA9IF9yZWYyLnRyYW5zZm9ybTsKICAgICAgICAgIHZhciBtYWluV2lkdGggPSBtYWluLndpZHRoLCBtYWluUGF0aCA9IG1haW4uaWNvbjsKICAgICAgICAgIHZhciBtYXNrV2lkdGggPSBtYXNrLndpZHRoLCBtYXNrUGF0aCA9IG1hc2suaWNvbjsKICAgICAgICAgIHZhciB0cmFucyA9IHRyYW5zZm9ybUZvclN2Zyh7CiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtMiwKICAgICAgICAgICAgY29udGFpbmVyV2lkdGg6IG1hc2tXaWR0aCwKICAgICAgICAgICAgaWNvbldpZHRoOiBtYWluV2lkdGgKICAgICAgICAgIH0pOwogICAgICAgICAgdmFyIG1hc2tSZWN0ID0gewogICAgICAgICAgICB0YWc6ICJyZWN0IiwKICAgICAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIEFMTF9TUEFDRSksIHt9LCB7CiAgICAgICAgICAgICAgZmlsbDogIndoaXRlIgogICAgICAgICAgICB9KQogICAgICAgICAgfTsKICAgICAgICAgIHZhciBtYXNrSW5uZXJHcm91cENoaWxkcmVuTWl4aW4gPSBtYWluUGF0aC5jaGlsZHJlbiA/IHsKICAgICAgICAgICAgY2hpbGRyZW46IG1haW5QYXRoLmNoaWxkcmVuLm1hcChmaWxsQmxhY2spCiAgICAgICAgICB9IDoge307CiAgICAgICAgICB2YXIgbWFza0lubmVyR3JvdXAgPSB7CiAgICAgICAgICAgIHRhZzogImciLAogICAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMih7fSwgdHJhbnMuaW5uZXIpLAogICAgICAgICAgICBjaGlsZHJlbjogW2ZpbGxCbGFjayhfb2JqZWN0U3ByZWFkMih7CiAgICAgICAgICAgICAgdGFnOiBtYWluUGF0aC50YWcsCiAgICAgICAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG1haW5QYXRoLmF0dHJpYnV0ZXMpLCB0cmFucy5wYXRoKQogICAgICAgICAgICB9LCBtYXNrSW5uZXJHcm91cENoaWxkcmVuTWl4aW4pKV0KICAgICAgICAgIH07CiAgICAgICAgICB2YXIgbWFza091dGVyR3JvdXAgPSB7CiAgICAgICAgICAgIHRhZzogImciLAogICAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMih7fSwgdHJhbnMub3V0ZXIpLAogICAgICAgICAgICBjaGlsZHJlbjogW21hc2tJbm5lckdyb3VwXQogICAgICAgICAgfTsKICAgICAgICAgIHZhciBtYXNrSWQgPSAibWFzay0iLmNvbmNhdChleHBsaWNpdE1hc2tJZCB8fCBuZXh0VW5pcXVlSWQoKSk7CiAgICAgICAgICB2YXIgY2xpcElkID0gImNsaXAtIi5jb25jYXQoZXhwbGljaXRNYXNrSWQgfHwgbmV4dFVuaXF1ZUlkKCkpOwogICAgICAgICAgdmFyIG1hc2tUYWcgPSB7CiAgICAgICAgICAgIHRhZzogIm1hc2siLAogICAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgQUxMX1NQQUNFKSwge30sIHsKICAgICAgICAgICAgICBpZDogbWFza0lkLAogICAgICAgICAgICAgIG1hc2tVbml0czogInVzZXJTcGFjZU9uVXNlIiwKICAgICAgICAgICAgICBtYXNrQ29udGVudFVuaXRzOiAidXNlclNwYWNlT25Vc2UiCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICBjaGlsZHJlbjogW21hc2tSZWN0LCBtYXNrT3V0ZXJHcm91cF0KICAgICAgICAgIH07CiAgICAgICAgICB2YXIgZGVmcyA9IHsKICAgICAgICAgICAgdGFnOiAiZGVmcyIsCiAgICAgICAgICAgIGNoaWxkcmVuOiBbewogICAgICAgICAgICAgIHRhZzogImNsaXBQYXRoIiwKICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICAgICAgICBpZDogY2xpcElkCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBjaGlsZHJlbjogZGVHcm91cChtYXNrUGF0aCkKICAgICAgICAgICAgfSwgbWFza1RhZ10KICAgICAgICAgIH07CiAgICAgICAgICBjaGlsZHJlbjIucHVzaChkZWZzLCB7CiAgICAgICAgICAgIHRhZzogInJlY3QiLAogICAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMih7CiAgICAgICAgICAgICAgImZpbGwiOiAiY3VycmVudENvbG9yIiwKICAgICAgICAgICAgICAiY2xpcC1wYXRoIjogInVybCgjIi5jb25jYXQoY2xpcElkLCAiKSIpLAogICAgICAgICAgICAgICJtYXNrIjogInVybCgjIi5jb25jYXQobWFza0lkLCAiKSIpCiAgICAgICAgICAgIH0sIEFMTF9TUEFDRSkKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuMiwKICAgICAgICAgICAgYXR0cmlidXRlcwogICAgICAgICAgfTsKICAgICAgICB9OwogICAgICB9CiAgICB9OwogICAgTWlzc2luZ0ljb25JbmRpY2F0b3IgPSB7CiAgICAgIHByb3ZpZGVzOiBmdW5jdGlvbiBwcm92aWRlczYocHJvdmlkZXJzMikgewogICAgICAgIHZhciByZWR1Y2VNb3Rpb24gPSBmYWxzZTsKICAgICAgICBpZiAoV0lORE9XLm1hdGNoTWVkaWEpIHsKICAgICAgICAgIHJlZHVjZU1vdGlvbiA9IFdJTkRPVy5tYXRjaE1lZGlhKCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSIpLm1hdGNoZXM7CiAgICAgICAgfQogICAgICAgIHByb3ZpZGVyczIubWlzc2luZ0ljb25BYnN0cmFjdCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGdDaGlsZHJlbiA9IFtdOwogICAgICAgICAgdmFyIEZJTEwgPSB7CiAgICAgICAgICAgIGZpbGw6ICJjdXJyZW50Q29sb3IiCiAgICAgICAgICB9OwogICAgICAgICAgdmFyIEFOSU1BVElPTl9CQVNFID0gewogICAgICAgICAgICBhdHRyaWJ1dGVUeXBlOiAiWE1MIiwKICAgICAgICAgICAgcmVwZWF0Q291bnQ6ICJpbmRlZmluaXRlIiwKICAgICAgICAgICAgZHVyOiAiMnMiCiAgICAgICAgICB9OwogICAgICAgICAgZ0NoaWxkcmVuLnB1c2goewogICAgICAgICAgICB0YWc6ICJwYXRoIiwKICAgICAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIEZJTEwpLCB7fSwgewogICAgICAgICAgICAgIGQ6ICJNMTU2LjUsNDQ3LjdsLTEyLjYsMjkuNWMtMTguNy05LjUtMzUuOS0yMS4yLTUxLjUtMzQuOWwyMi43LTIyLjdDMTI3LjYsNDMwLjUsMTQxLjUsNDQwLDE1Ni41LDQ0Ny43eiBNNDAuNiwyNzJIOC41IGMxLjQsMjEuMiw1LjQsNDEuNywxMS43LDYxLjFMNTAsMzIxLjJDNDUuMSwzMDUuNSw0MS44LDI4OSw0MC42LDI3MnogTTQwLjYsMjQwYzEuNC0xOC44LDUuMi0zNywxMS4xLTU0LjFsLTI5LjUtMTIuNiBDMTQuNywxOTQuMywxMCwyMTYuNyw4LjUsMjQwSDQwLjZ6IE02NC4zLDE1Ni41YzcuOC0xNC45LDE3LjItMjguOCwyOC4xLTQxLjVMNjkuNyw5Mi4zYy0xMy43LDE1LjYtMjUuNSwzMi44LTM0LjksNTEuNSBMNjQuMywxNTYuNXogTTM5Nyw0MTkuNmMtMTMuOSwxMi0yOS40LDIyLjMtNDYuMSwzMC40bDExLjksMjkuOGMyMC43LTkuOSwzOS44LTIyLjYsNTYuOS0zNy42TDM5Nyw0MTkuNnogTTExNSw5Mi40IGMxMy45LTEyLDI5LjQtMjIuMyw0Ni4xLTMwLjRsLTExLjktMjkuOGMtMjAuNyw5LjktMzkuOCwyMi42LTU2LjgsMzcuNkwxMTUsOTIuNHogTTQ0Ny43LDM1NS41Yy03LjgsMTQuOS0xNy4yLDI4LjgtMjguMSw0MS41IGwyMi43LDIyLjdjMTMuNy0xNS42LDI1LjUtMzIuOSwzNC45LTUxLjVMNDQ3LjcsMzU1LjV6IE00NzEuNCwyNzJjLTEuNCwxOC44LTUuMiwzNy0xMS4xLDU0LjFsMjkuNSwxMi42IGM3LjUtMjEuMSwxMi4yLTQzLjUsMTMuNi02Ni44SDQ3MS40eiBNMzIxLjIsNDYyYy0xNS43LDUtMzIuMiw4LjItNDkuMiw5LjR2MzIuMWMyMS4yLTEuNCw0MS43LTUuNCw2MS4xLTExLjdMMzIxLjIsNDYyeiBNMjQwLDQ3MS40Yy0xOC44LTEuNC0zNy01LjItNTQuMS0xMS4xbC0xMi42LDI5LjVjMjEuMSw3LjUsNDMuNSwxMi4yLDY2LjgsMTMuNlY0NzEuNHogTTQ2MiwxOTAuOGM1LDE1LjcsOC4yLDMyLjIsOS40LDQ5LjJoMzIuMSBjLTEuNC0yMS4yLTUuNC00MS43LTExLjctNjEuMUw0NjIsMTkwLjh6IE05Mi40LDM5N2MtMTItMTMuOS0yMi4zLTI5LjQtMzAuNC00Ni4xbC0yOS44LDExLjljOS45LDIwLjcsMjIuNiwzOS44LDM3LjYsNTYuOSBMOTIuNCwzOTd6IE0yNzIsNDAuNmMxOC44LDEuNCwzNi45LDUuMiw1NC4xLDExLjFsMTIuNi0yOS41QzMxNy43LDE0LjcsMjk1LjMsMTAsMjcyLDguNVY0MC42eiBNMTkwLjgsNTAgYzE1LjctNSwzMi4yLTguMiw0OS4yLTkuNFY4LjVjLTIxLjIsMS40LTQxLjcsNS40LTYxLjEsMTEuN0wxOTAuOCw1MHogTTQ0Mi4zLDkyLjNMNDE5LjYsMTE1YzEyLDEzLjksMjIuMywyOS40LDMwLjUsNDYuMSBsMjkuOC0xMS45QzQ3MCwxMjguNSw0NTcuMywxMDkuNCw0NDIuMyw5Mi4zeiBNMzk3LDkyLjRsMjIuNy0yMi43Yy0xNS42LTEzLjctMzIuOC0yNS41LTUxLjUtMzQuOWwtMTIuNiwyOS41IEMzNzAuNCw3Mi4xLDM4NC40LDgxLjUsMzk3LDkyLjR6IgogICAgICAgICAgICB9KQogICAgICAgICAgfSk7CiAgICAgICAgICB2YXIgT1BBQ0lUWV9BTklNQVRFID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIEFOSU1BVElPTl9CQVNFKSwge30sIHsKICAgICAgICAgICAgYXR0cmlidXRlTmFtZTogIm9wYWNpdHkiCiAgICAgICAgICB9KTsKICAgICAgICAgIHZhciBkb3QgPSB7CiAgICAgICAgICAgIHRhZzogImNpcmNsZSIsCiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBGSUxMKSwge30sIHsKICAgICAgICAgICAgICBjeDogIjI1NiIsCiAgICAgICAgICAgICAgY3k6ICIzNjQiLAogICAgICAgICAgICAgIHI6ICIyOCIKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIGNoaWxkcmVuOiBbXQogICAgICAgICAgfTsKICAgICAgICAgIGlmICghcmVkdWNlTW90aW9uKSB7CiAgICAgICAgICAgIGRvdC5jaGlsZHJlbi5wdXNoKHsKICAgICAgICAgICAgICB0YWc6ICJhbmltYXRlIiwKICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgQU5JTUFUSU9OX0JBU0UpLCB7fSwgewogICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZTogInIiLAogICAgICAgICAgICAgICAgdmFsdWVzOiAiMjg7MTQ7Mjg7Mjg7MTQ7Mjg7IgogICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICB0YWc6ICJhbmltYXRlIiwKICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgT1BBQ0lUWV9BTklNQVRFKSwge30sIHsKICAgICAgICAgICAgICAgIHZhbHVlczogIjE7MDsxOzE7MDsxOyIKICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGdDaGlsZHJlbi5wdXNoKGRvdCk7CiAgICAgICAgICBnQ2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgIHRhZzogInBhdGgiLAogICAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgRklMTCksIHt9LCB7CiAgICAgICAgICAgICAgb3BhY2l0eTogIjEiLAogICAgICAgICAgICAgIGQ6ICJNMjYzLjcsMzEyaC0xNmMtNi42LDAtMTItNS40LTEyLTEyYzAtNzEsNzcuNC02My45LDc3LjQtMTA3LjhjMC0yMC0xNy44LTQwLjItNTcuNC00MC4yYy0yOS4xLDAtNDQuMyw5LjYtNTkuMiwyOC43IGMtMy45LDUtMTEuMSw2LTE2LjIsMi40bC0xMy4xLTkuMmMtNS42LTMuOS02LjktMTEuOC0yLjYtMTcuMmMyMS4yLTI3LjIsNDYuNC00NC43LDkxLjItNDQuN2M1Mi4zLDAsOTcuNCwyOS44LDk3LjQsODAuMiBjMCw2Ny42LTc3LjQsNjMuNS03Ny40LDEwNy44QzI3NS43LDMwNi42LDI3MC4zLDMxMiwyNjMuNywzMTJ6IgogICAgICAgICAgICB9KSwKICAgICAgICAgICAgY2hpbGRyZW46IHJlZHVjZU1vdGlvbiA/IFtdIDogW3sKICAgICAgICAgICAgICB0YWc6ICJhbmltYXRlIiwKICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgT1BBQ0lUWV9BTklNQVRFKSwge30sIHsKICAgICAgICAgICAgICAgIHZhbHVlczogIjE7MDswOzA7MDsxOyIKICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9XQogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoIXJlZHVjZU1vdGlvbikgewogICAgICAgICAgICBnQ2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgICAgdGFnOiAicGF0aCIsCiAgICAgICAgICAgICAgYXR0cmlidXRlczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIEZJTEwpLCB7fSwgewogICAgICAgICAgICAgICAgb3BhY2l0eTogIjAiLAogICAgICAgICAgICAgICAgZDogIk0yMzIuNSwxMzQuNWw3LDE2OGMwLjMsNi40LDUuNiwxMS41LDEyLDExLjVoOWM2LjQsMCwxMS43LTUuMSwxMi0xMS41bDctMTY4YzAuMy02LjgtNS4yLTEyLjUtMTItMTIuNWgtMjMgQzIzNy43LDEyMiwyMzIuMiwxMjcuNywyMzIuNSwxMzQuNXoiCiAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgY2hpbGRyZW46IFt7CiAgICAgICAgICAgICAgICB0YWc6ICJhbmltYXRlIiwKICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBPUEFDSVRZX0FOSU1BVEUpLCB7fSwgewogICAgICAgICAgICAgICAgICB2YWx1ZXM6ICIwOzA7MTsxOzA7MDsiCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgIH1dCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdGFnOiAiZyIsCiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgICAgICBjbGFzczogIm1pc3NpbmciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNoaWxkcmVuOiBnQ2hpbGRyZW4KICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIFN2Z1N5bWJvbHMgPSB7CiAgICAgIGhvb2tzOiBmdW5jdGlvbiBob29rczcoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHBhcnNlTm9kZUF0dHJpYnV0ZXM6IGZ1bmN0aW9uIHBhcnNlTm9kZUF0dHJpYnV0ZXMoYWNjdW11bGF0b3IsIG5vZGUyKSB7CiAgICAgICAgICAgIHZhciBzeW1ib2xEYXRhID0gbm9kZTIuZ2V0QXR0cmlidXRlKCJkYXRhLWZhLXN5bWJvbCIpOwogICAgICAgICAgICB2YXIgc3ltYm9sID0gc3ltYm9sRGF0YSA9PT0gbnVsbCA/IGZhbHNlIDogc3ltYm9sRGF0YSA9PT0gIiIgPyB0cnVlIDogc3ltYm9sRGF0YTsKICAgICAgICAgICAgYWNjdW11bGF0b3JbInN5bWJvbCJdID0gc3ltYm9sOwogICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIHBsdWdpbnMgPSBbSW5qZWN0Q1NTLCBSZXBsYWNlRWxlbWVudHMsIExheWVycywgTGF5ZXJzQ291bnRlciwgTGF5ZXJzVGV4dCwgUHNldWRvRWxlbWVudHMsIE11dGF0aW9uT2JzZXJ2ZXIkMSwgUG93ZXJUcmFuc2Zvcm1zLCBNYXNrcywgTWlzc2luZ0ljb25JbmRpY2F0b3IsIFN2Z1N5bWJvbHNdOwogICAgcmVnaXN0ZXJQbHVnaW5zKHBsdWdpbnMsIHsKICAgICAgbWl4b3V0c1RvOiBhcGkKICAgIH0pOwogICAgbm9BdXRvJDEgPSBhcGkubm9BdXRvOwogICAgY29uZmlnJDEgPSBhcGkuY29uZmlnOwogICAgbGlicmFyeSQxID0gYXBpLmxpYnJhcnk7CiAgICBkb20kMSA9IGFwaS5kb207CiAgICBwYXJzZSQxID0gYXBpLnBhcnNlOwogICAgZmluZEljb25EZWZpbml0aW9uJDEgPSBhcGkuZmluZEljb25EZWZpbml0aW9uOwogICAgdG9IdG1sJDEgPSBhcGkudG9IdG1sOwogICAgaWNvbjIgPSBhcGkuaWNvbjsKICAgIGxheWVyID0gYXBpLmxheWVyOwogICAgdGV4dDggPSBhcGkudGV4dDsKICAgIGNvdW50ZXIgPSBhcGkuY291bnRlcjsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0Bmb3J0YXdlc29tZStmcmVlLWJyYW5kcy1zdmctaWNvbnNANy4yLjAvbm9kZV9tb2R1bGVzL0Bmb3J0YXdlc29tZS9mcmVlLWJyYW5kcy1zdmctaWNvbnMvaW5kZXgubWpzCnZhciBwcmVmaXgsIGZhU3F1YXJlR2l0aHViLCBmYUdpdGh1YlNxdWFyZSwgZmFUaGlua1BlYWtzLCBmYUdvb2dsZURyaXZlLCBmYUF1dG9wcmVmaXhlciwgZmFTcXVhcmVWaWFkZW8sIGZhVmlhZGVvU3F1YXJlLCBmYUNwYW5lbCwgZmFNZW5kZWxleSwgZmFEcmFmdDJkaWdpdGFsLCBmYVJlcGx5ZCwgZmFFbXBpcmUsIGZhQWNjZXNzaWJsZUljb24sIGZhUXVvcmEsIGZhQ2NKY2IsIGZhRmVkb3JhLCBmYUR1b2xpbmdvLCBmYUZpcnN0ZHJhZnQsIGZhRnJlZWJzZCwgZmFPZHlzZWUsIGZhR2dDaXJjbGUsIGZhQ2xvdWRmbGFyZSwgZmFIYWNrZXJyYW5rLCBmYVNreWF0bGFzLCBmYURlc2twcm8sIGZhUmVzb2x2aW5nLCBmYUJsYWNrYmVycnksIGZhU3RyaXBlUywgZmFTcXVhcmVCZWhhbmNlLCBmYUJlaGFuY2VTcXVhcmUsIGZhU2VydmljZXN0YWNrLCBmYVJvY2tldGNoYXQsIGZhUmViZWwsIGZhU3F1YXJlV2ViQXdlc29tZSwgZmFMaW5rdHJlZSwgZmFTaW1wbHlidWlsdCwgZmFTdHViYmVyLCBmYUFwcGVyLCBmYUdvb2dsZVNjaG9sYXIsIGZhWWFybiwgZmFTdGFja092ZXJmbG93LCBmYUJsdWV0b290aCwgZmFDcmVhdGl2ZUNvbW1vbnNOY0pwLCBmYVJlZGRpdCwgZmFDb25uZWN0ZGV2ZWxvcCwgZmFSZXNlYXJjaGdhdGUsIGZhU2lnbmFsTWVzc2VuZ2VyLCBmYVhpbmcsIGZhU3F1YXJlSnMsIGZhSnNTcXVhcmUsIGZhRm9udGljb25zLCBmYVVwcywgZmFBbWF6b25QYXksIGZhUGFuZG9yYSwgZmFPcGVuaWQsIGZhVnNjbywgZmFHbG9iYWxlYWtzLCBmYVZlbm1vLCBmYVVidW50dSwgZmFWaWFjb2luLCBmYVpoaWh1LCBmYVlhbmRleCwgZmFQaXhpdiwgZmFPcGVuYWksIGZhU2l0aCwgZmFKdWxpYSwgZmFOZmNEaXJlY3Rpb25hbCwgZmFDcmVhdGl2ZUNvbW1vbnNCeSwgZmFVbWJyYWNvLCBmYUhvb2xpLCBmYVNxdWFyZUdpdCwgZmFHaXRTcXVhcmUsIGZhT2Rub2tsYXNzbmlraSwgZmFEcnVwYWwsIGZhQmxvZ2dlckIsIGZhSW52aXNpb24sIGZhRmFjZWJvb2tGLCBmYUNlbnRvcywgZmFTY2FsZXdheSwgZmFDY0FtYXpvblBheSwgZmFFYmF5LCBmYUNvbnRhbywgZmFFbGxvLCBmYVNpc3RyaXgsIGZhUGVyaXNjb3BlLCBmYUV4cGVkaXRlZHNzbCwgZmFOYXBzdGVyLCBmYURlbGljaW91cywgZmFHdWlsZGVkLCBmYU9ic2lkaWFuLCBmYVhib3gsIGZhVW50YXBwZCwgZmFHb29nbGVQbHVzRywgZmFHaXRodWJBbHQsIGZhR2V0UG9ja2V0LCBmYUdsaWRlLCBmYUJpdHksIGZhV3BleHBsb3JlciwgZmFNZWdhcG9ydCwgZmFMZWV0Y29kZSwgZmFNZGIsIGZhUGFnZTQsIGZhVGhlUmVkWWV0aSwgZmFKaXJhLCBmYUZlZGV4LCBmYUV2ZXJub3RlLCBmYVVzYiwgZmFBbmdyeWNyZWF0aXZlLCBmYU1penVuaSwgZmFJdGNoSW8sIGZhV2luZG93cywgZmFTdHVtYmxldXBvbiwgZmFHb29nbGUsIGZhRGlzY29yZCwgZmFIYWNrZXJOZXdzLCBmYUVsZXZlbnR5LCBmYTExdHksIGZhVGVhbXNwZWFrLCBmYVN1cHBsZSwgZmFTcXVhcmVUd2l0dGVyLCBmYVR3aXR0ZXJTcXVhcmUsIGZhVmltLCBmYUZvbnRBd2Vzb21lLCBmYUZvbnRBd2Vzb21lRmxhZywgZmFGb250QXdlc29tZUxvZ29GdWxsLCBmYVdpcnNpbmRoYW5kd2VyaywgZmFXc2gsIGZhWm9vbSwgZmFDb25mbHVlbmNlLCBmYURpZ2csIGZhVGhyZWFkcywgZmFXcHJlc3NyLCBmYVJlbmRhY3QsIGZhWW9hc3QsIGZhTmltYmxyLCBmYVBpeGVsZmVkLCBmYVlhaG9vLCBmYUJsdWVza3ksIGZhU2NyaWJkLCBmYUNyZWF0aXZlQ29tbW9uc1BkLCBmYUVhcmx5YmlyZHMsIGZhU3ltZm9ueWNhc3RzLCBmYVNxdWFyZU9kbm9rbGFzc25pa2ksIGZhT2Rub2tsYXNzbmlraVNxdWFyZSwgZmFNYXJrZG93biwgZmFUeXBvMywgZmFKb29tbGEsIGZhV2VpeGluLCBmYUdydW50LCBmYVN1cHBvcnRub3csIGZhUm9ja3JtcywgZmFVbnNwbGFzaCwgZmFTcXVhcmVJbnN0YWdyYW0sIGZhSW5zdGFncmFtU3F1YXJlLCBmYUZpcnN0T3JkZXJBbHQsIGZhRnVsY3J1bSwgZmFBcmNoTGludXgsIGZhRmVkaXZlcnNlLCBmYUJyYXZlUmV2ZXJzZSwgZmFBdmlhbmV4LCBmYU5zOCwgZmFTcXVhcmVQaW50ZXJlc3QsIGZhUGludGVyZXN0U3F1YXJlLCBmYUJsdWV0b290aEIsIGZhR3JpcGZpcmUsIGZhU3F1YXJlR29vZ2xlUGx1cywgZmFHb29nbGVQbHVzU3F1YXJlLCBmYUdpdGVlLCBmYVhtcHAsIGZhQXBwU3RvcmUsIGZhV2l4LCBmYUludGVyY29tLCBmYVJlYWN0ZXVyb3BlLCBmYVdhemUsIGZhQ3JlYXRpdmVDb21tb25zUmVtaXgsIGZhQmFuZGNhbXAsIGZhU3F1YXJlV2ViQXdlc29tZVN0cm9rZSwgZmFWaW1lb1YsIGZhU3RyYXZhLCBmYVVuaXJlZ2lzdHJ5LCBmYUNjRGluZXJzQ2x1YiwgZmFLdWJlcm5ldGVzLCBmYVBpbnRlcmVzdCwgZmFBbGdvbGlhLCBmYVN0YWNrcGF0aCwgZmFPY3RvcHVzRGVwbG95LCBmYVlhbW1lciwgZmFNb2R4LCBmYVNxdWFyZVRocmVhZHMsIGZhT2xkUmVwdWJsaWMsIGZhU3VzZSwgZmFBcHBTdG9yZUlvcywgZmFVbHRyYWx5dGljc1lvbG8sIGZhU3F1YXJlRHJpYmJibGUsIGZhRHJpYmJibGVTcXVhcmUsIGZhVWlraXQsIGZhU3VwZXJwb3dlcnMsIGZhWW91dHViZSwgZmFFbWJlciwgZmFCb290c3RyYXAsIGZhSXR1bmVzLCBmYVNxdWFyZVhpbmcsIGZhWGluZ1NxdWFyZSwgZmFDc3MzQWx0LCBmYVNxdWFyZXNwYWNlLCBmYVRyZWxsbywgZmFWaWFkZW8sIGZhU2VhcmNoZW5naW4sIGZhVW5yZWFsRW5naW5lLCBmYVBheXBhbCwgZmFTcXVhcmVCbHVlc2t5LCBmYURBbmREQmV5b25kLCBmYU1pY3Jvc29mdCwgZmFGbHksIGZhQ2NTdHJpcGUsIGZhV29yZHByZXNzU2ltcGxlLCBmYVNlbGxzeSwgZmFEYXNoY3ViZSwgZmFHaXR0ZXIsIGZhV29sZlBhY2tCYXR0YWxpb24sIGZhTGFzdGZtLCBmYVNob3B3YXJlLCBmYUJsb2dnZXIsIGZhRWRnZSwgZmFJb3hob3N0LCBmYVNjaGxpeCwgZmFEQW5kRCwgZmFWdWVqcywgZmFNZXRhLCBmYUNyZWF0aXZlQ29tbW9uc1NoYXJlLCBmYVN0dWRpb3ZpbmFyaSwgZmFCaXRidWNrZXQsIGZhVmssIGZhR2l0aHViLCBmYUNvZGllcGllLCBmYVBpZWRQaXBlciwgZmFSYXNwYmVycnlQaSwgZmFDc3MzLCBmYUh1YnNwb3QsIGZhQ21wbGlkLCBmYUR5YWxvZywgZmFFbGVtZW50b3IsIGZhRmlyc3RPcmRlciwgZmFEcmliYmJsZSwgZmFMaW5rZWRpbiwgZmFDY1BheXBhbCwgZmFEaGwsIGZhVGV4LCBmYUNsYXVkZSwgZmFTaG9waWZ5LCBmYVNxdWFyZVJlZGRpdCwgZmFSZWRkaXRTcXVhcmUsIGZhQ3JlYXRpdmVDb21tb25zTmMsIGZhR2FsYWN0aWNSZXB1YmxpYywgZmFGYWNlYm9vaywgZmFHaXRsYWIsIGZhUXEsIGZhU3RyaXBlLCBmYURhaWx5bW90aW9uLCBmYVN0ZWFtLCBmYVZlbm1vViwgZmFTbmFwY2hhdCwgZmFTbmFwY2hhdEdob3N0LCBmYUdhbGFjdGljU2VuYXRlLCBmYVBob2VuaXhGcmFtZXdvcmssIGZhR2l0LCBmYU9wdGluTW9uc3RlciwgZmFKZW5raW5zLCBmYVNsaWRlc2hhcmUsIGZhVWJlciwgZmFEaWdpdGFsT2NlYW4sIGZhU291bmRjbG91ZCwgZmFTcXVhcmVGaWdtYSwgZmFDcmVhdGl2ZUNvbW1vbnNTYSwgZmFDaHJvbWUsIGZhVHJhZGVGZWRlcmF0aW9uLCBmYVZhYWRpbiwgZmFEZXZpYW50YXJ0LCBmYU1lZGl1bSwgZmFNZWRpdW1NLCBmYU9wZW5jYXJ0LCBmYVlDb21iaW5hdG9yLCBmYUxpbmUsIGZhQW1pbGlhLCBmYUFzeW1tZXRyaWssIGZhUGhhYnJpY2F0b3IsIGZhQm90cywgZmFWaW5lLCBmYU1lZHJ0LCBmYU9zaSwgZmFHZywgZmFCdXlzZWxsYWRzLCBmYUdvb2dsZVBsdXMsIGZhU2NyZWVucGFsLCBmYUJpdGNvaW4sIGZhU3dpZnQsIGZhRmlsZXNQaW53aGVlbCwgZmFMYXJhdmVsLCBmYVdwZm9ybXMsIGZhU3BlYWtlckRlY2ssIGZhRmxpY2tyLCBmYUNjVmlzYSwgZmFVcHdvcmssIGZhS2FrYW9UYWxrLCBmYUZsdXR0ZXIsIGZhQnVmZmVyLCBmYUdyYXRpcGF5LCBmYUdvb2dsZVBheSwgZmFBcHBsZSwgZmFUdW1ibHIsIGZhUGhvZW5peFNxdWFkcm9uLCBmYUNlbnRlcmNvZGUsIGZhRGViaWFuLCBmYU1hc3RvZG9uLCBmYVNrZXRjaCwgZmFXZWJBd2Vzb21lLCBmYVNhc3MsIGZhVGhyZWVtYSwgZmFTcXVhcmVXaGF0c2FwcCwgZmFXaGF0c2FwcFNxdWFyZSwgZmFTa3lwZSwgZmFBbmd1bGFyLCBmYUNpcmNsZVp1bGlwLCBmYU9wZW5zdXNlLCBmYURyb3Bib3gsIGZhRGVlemVyLCBmYUNyZWF0aXZlQ29tbW9uc1NhbXBsaW5nLCBmYUplZGlPcmRlciwgZmFSUHJvamVjdCwgZmFJbnN0YWxvZCwgZmFDYW5hZGlhbk1hcGxlTGVhZiwgZmFFdGhlcmV1bSwgZmFIb3V6eiwgZmFWaWJlciwgZmFLaWNrc3RhcnRlciwgZmFTcXVhcmVLaWNrc3RhcnRlciwgZmFTcG90aWZ5LCBmYUxlYW5wdWIsIGZhSmF2YSwgZmFOZmNTeW1ib2wsIGZhV29kdSwgZmFTcXVhcmVTdGVhbSwgZmFTdGVhbVNxdWFyZSwgZmFDcmVhdGl2ZUNvbW1vbnNOY0V1LCBmYU5wbSwgZmFDbG91ZHNjYWxlLCBmYVRoZW1lY28sIGZhR29vZ2xlUGxheSwgZmFLb3J2dWUsIGZhVzNjLCBmYUdyYXYsIGZhQXdzLCBmYUdsaWRlRywgZmFKc2ZpZGRsZSwgZmFLZXliYXNlLCBmYUx1bW9uRHJvcCwgZmFGb3JnZWpvLCBmYVBvc3RncmVzcWwsIGZhV2VlYmx5LCBmYURvY2tlciwgZmFNYWdlbnRvLCBmYVRvckJyb3dzZXIsIGZhR2l0QWx0LCBmYUZpcmVmb3hCcm93c2VyLCBmYUNsb3Vkc21pdGgsIGZhV2l6YXJkc09mVGhlQ29hc3QsIGZhQ3JlYXRpdmVDb21tb25zTmQsIGZhVXNwcywgZmFTcXVhcmVMZXR0ZXJib3hkLCBmYU1hbmRhbG9yaWFuLCBmYVNsYWNrLCBmYVNsYWNrSGFzaCwgZmFBbmdlbGxpc3QsIGZhQW5kcm9pZCwgZmFNZWV0dXAsIGZhRm9udGljb25zRmksIGZhUGFsZmVkLCBmYVdwYmVnaW5uZXIsIGZhRGlhc3BvcmEsIGZhUHJvZHVjdEh1bnQsIGZhU3F1YXJlVXB3b3JrLCBmYUN1dHRsZWZpc2gsIGZhTWVkYXBwcywgZmFQaXgsIGZhU3F1YXJlVHVtYmxyLCBmYVR1bWJsclNxdWFyZSwgZmFSZWFjdCwgZmFIdWdnaW5nRmFjZSwgZmFKeGwsIGZhU3F1YXJlTGlua2VkaW4sIGZhQ3NzLCBmYUhhc2hub2RlLCBmYVJlZGRpdEFsaWVuLCBmYVRpa3RvaywgZmFXb3JkcHJlc3MsIGZhSWRlYWwsIGZhUGllZFBpcGVyUHAsIGZhVXNzdW5uYWgsIGZhRm9ydEF3ZXNvbWVBbHQsIGZhQnVyb21vYmVsZXhwZXJ0ZSwgZmFCaWxpYmlsaSwgZmFOZW9zLCBmYURldiwgZmFIb3RqYXIsIGZhRG9jaHViLCBmYVZpbWVvLCBmYU1heGNkbiwgZmFTcXVhcmVGb250QXdlc29tZVN0cm9rZSwgZmFGb250QXdlc29tZUFsdCwgZmFTcGVha2FwLCBmYUZhbnRhc3lGbGlnaHRHYW1lcywgZmFMaW51eCwgZmFDb3R0b25CdXJlYXUsIGZhR29vZ2xlV2FsbGV0LCBmYUZvdXJzcXVhcmUsIGZhU2hpcnRzaW5idWxrLCBmYU1pbnRiaXQsIGZhWnVsaXAsIGZhU3RheWxpbmtlZCwgZmFXZWJmbG93LCBmYVJlbnJlbiwgZmFLb0ZpLCBmYVJldiwgZmFLZXljZG4sIGZhSGlyZUFIZWxwZXIsIGZhU3F1YXJlSGFja2VyTmV3cywgZmFIYWNrZXJOZXdzU3F1YXJlLCBmYUNyZWF0aXZlQ29tbW9uc1BkQWx0LCBmYU9yY2lkLCBmYUJvYXJkR2FtZUdlZWssIGZhQmdnLCBmYUJlaGFuY2UsIGZhTW9uZXJvLCBmYUZpZ21hLCBmYUluc3RhZ3JhbSwgZmFQZXJieXRlLCBmYVNxdWFyZVZpbWVvLCBmYVZpbWVvU3F1YXJlLCBmYVB1c2hlZCwgZmFNaXhjbG91ZCwgZmFZYW5kZXhJbnRlcm5hdGlvbmFsLCBmYUhpdmUsIGZhQ3JlYXRpdmVDb21tb25zWmVybywgZmFTcXVhcmVTbmFwY2hhdCwgZmFTbmFwY2hhdFNxdWFyZSwgZmFUaGVtZWlzbGUsIGZhRGFydExhbmcsIGZhRGVwbG95ZG9nLCBmYUZsaXBib2FyZCwgZmFCdXlOTGFyZ2UsIGZhV2F0Y2htYW5Nb25pdG9yaW5nLCBmYUhpcHMsIGZhQ2xvdWR2ZXJzaWZ5LCBmYUdvb2RyZWFkcywgZmFUaWRhbCwgZmFVbml0eSwgZmFUZW5jZW50V2VpYm8sIGZhRnJlZUNvZGVDYW1wLCBmYVhUd2l0dGVyLCBmYVN0aWNrZXJNdWxlLCBmYVR3aXRjaCwgZmFLaWNrc3RhcnRlckssIGZhQ3JpdGljYWxSb2xlLCBmYVN0ZWFtU3ltYm9sLCBmYU1haWxjaGltcCwgZmFMdW1vbiwgZmFOdXRyaXRpb25peCwgZmFDcmVhdGl2ZUNvbW1vbnNTYW1wbGluZ1BsdXMsIGZhUmVkaGF0LCBmYVNxdWFyZVBpZWRQaXBlciwgZmFQaWVkUGlwZXJTcXVhcmUsIGZhV2hhdHNhcHAsIGZhSW1kYiwgZmFQeXRob24sIGZhQ2FzaEFwcCwgZmFQaW50ZXJlc3RQLCBmYVdobWNzLCBmYUpvZ2V0LCBmYVNxdWFyZVlvdXR1YmUsIGZhWW91dHViZVNxdWFyZSwgZmFBdGxhc3NpYW4sIGZhUGllZFBpcGVySGF0LCBmYUludGVybmV0RXhwbG9yZXIsIGZhQWlyYm5iLCBmYUpzLCBmYVF1aW5zY2FwZSwgZmFBZHZlcnNhbCwgZmFDcmVhdGl2ZUNvbW1vbnMsIGZhTm90aW9uLCBmYUNocm9tZWNhc3QsIGZhVWx0cmFseXRpY3NIdWIsIGZhV2lraXBlZGlhVywgZmFTaXRyb3gsIGZhU3F1YXJlR2l0bGFiLCBmYUdpdGxhYlNxdWFyZSwgZmFTaG9lbGFjZSwgZmFPcGVuc3RyZWV0bWFwLCBmYVNlbGxjYXN0LCBmYU1peCwgZmFDY0FwcGxlUGF5LCBmYVNvbGFuYSwgZmFUeXBlc2NyaXB0LCBmYUJyYXZlLCBmYUV0c3ksIGZhQnRjLCBmYUFkbiwgZmFTcXVhcmVYVHdpdHRlciwgZmFTcXVhcmVGb250QXdlc29tZSwgZmFGb3J1bWJlZSwgZmE0Mkdyb3VwLCBmYUlubm9zb2Z0LCBmYVN0dW1ibGV1cG9uQ2lyY2xlLCBmYVN5bWZvbnksIGZhU2FsZXNmb3JjZSwgZmFTb3VyY2V0cmVlLCBmYUxpbmtlZGluSW4sIGZhSHRtbDUsIGZhUnVzdCwgZmFIb3JuYmlsbCwgZmFQaHAsIGZhRGlzcXVzLCBmYTUwMHB4LCBmYUFmZmlsaWF0ZXRoZW1lLCBmYVJlZFJpdmVyLCBmYVR3aXR0ZXIsIGZhRm9ydEF3ZXNvbWUsIGZhTWl4ZXIsIGZhTHlmdCwgZmFBcHBsZVBheSwgZmFBcnRzdGF0aW9uLCBmYU5vZGVKcywgZmFVbmNoYXJ0ZWQsIGZhUGxheXN0YXRpb24sIGZhTWljcm9ibG9nLCBmYUdpdGtyYWtlbiwgZmFUZWxlZ3JhbSwgZmFUZWxlZ3JhbVBsYW5lLCBmYVVsdHJhbHl0aWNzLCBmYUl0dW5lc05vdGUsIGZhTGVzcywgZmFGaXJlZm94LCBmYUthZ2dsZSwgZmFGYWNlYm9va01lc3NlbmdlciwgZmFBdWRpYmxlLCBmYVBhdHJlb24sIGZhVm52LCBmYVBhZ2VsaW5lcywgZmFBbWF6b24sIGZhRW52aXJhLCBmYUxpbm9kZSwgZmFBY2N1c29mdCwgZmFFcmxhbmcsIGZhVW5pc29uLCBmYUNjRGlzY292ZXIsIGZhU2FmYXJpLCBmYVNwYWNlQXdlc29tZSwgZmFOb2RlLCBmYUNvZGVwZW4sIGZhUmF2ZWxyeSwgZmFBbGlwYXksIGZhQ2NBbWV4LCBmYVBpZWRQaXBlckFsdCwgZmFMZXR0ZXJib3hkLCBmYU9wZXJhLCBmYVdlaWJvLCBmYVJlYWRtZSwgZmFHb2xhbmcsIGZhU3RhY2tFeGNoYW5nZSwgZmFHdWxwLCBmYVllbHAsIGZhR29mb3JlLCBmYUF2aWF0bywgZmFQYWRsZXQsIGZhRWRnZUxlZ2FjeSwgZmFTcXVhcmVMYXN0Zm0sIGZhTGFzdGZtU3F1YXJlLCBmYUdvb2RyZWFkc0csIGZhQ2NNYXN0ZXJjYXJkLCBmYURpc2NvdXJzZSwgZmFCbGFja1RpZSwgZmFTcXVhcmVGYWNlYm9vaywgZmFGYWNlYm9va1NxdWFyZSwgZmFCYXR0bGVOZXQsIGZhQmltb2JqZWN0LCBmYVN2ZWx0ZSwgZmFTcXVhcmVEZXNrcHJvLCBmYVRhaWx3aW5kQ3NzLCBpY29uczsKdmFyIGluaXRfZnJlZV9icmFuZHNfc3ZnX2ljb25zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGZvcnRhd2Vzb21lK2ZyZWUtYnJhbmRzLXN2Zy1pY29uc0A3LjIuMC9ub2RlX21vZHVsZXMvQGZvcnRhd2Vzb21lL2ZyZWUtYnJhbmRzLXN2Zy1pY29ucy9pbmRleC5tanMiKCkgewogICAgcHJlZml4ID0gImZhYiI7CiAgICBmYVNxdWFyZUdpdGh1YiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtZ2l0aHViIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImdpdGh1Yi1zcXVhcmUiXSwgImYwOTIiLCAiTTQ0OCA5NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwek0yNjUuOCA0MDcuN2MwLTEuOCAwLTYgLjEtMTEuNiAuMS0xMS40IC4xLTI4LjggLjEtNDMuNyAwLTE1LjYtNS4yLTI1LjUtMTEuMy0zMC43IDM3LTQuMSA3Ni05LjIgNzYtNzMuMSAwLTE4LjItNi41LTI3LjMtMTcuMS0zOSAxLjctNC4zIDcuNC0yMi0xLjctNDUtMTMuOS00LjMtNDUuNyAxNy45LTQ1LjcgMTcuOS0yNi42LTcuNS01Ni42LTcuNS04My4yIDAgMCAwLTMxLjgtMjIuMi00NS43LTE3LjktOS4xIDIyLjktMy41IDQwLjYtMS43IDQ1LTEwLjYgMTEuNy0xNS42IDIwLjgtMTUuNiAzOSAwIDYzLjYgMzcuMyA2OSA3NC4zIDczLjEtNC44IDQuMy05LjEgMTEuNy0xMC42IDIyLjMtOS41IDQuMy0zMy44IDExLjctNDguMy0xMy45LTkuMS0xNS44LTI1LjUtMTcuMS0yNS41LTE3LjEtMTYuMi0uMi0xLjEgMTAuMi0xLjEgMTAuMiAxMC44IDUgMTguNCAyNC4yIDE4LjQgMjQuMiA5LjcgMjkuNyA1Ni4xIDE5LjcgNTYuMSAxOS43IDAgOSAuMSAyMS43IC4xIDMwLjYgMCA0LjggLjEgOC42IC4xIDEwIDAgNC4zLTMgOS41LTExLjUgOC02Ni0yMi4xLTExMi4yLTg0LjktMTEyLjItMTU4LjMgMC05MS44IDcwLjItMTYxLjUgMTYyLTE2MS41UzM4OCAxNjUuNiAzODggMjU3LjRjLjEgNzMuNC00NC43IDEzNi4zLTExMC43IDE1OC4zLTguNCAxLjUtMTEuNS0zLjctMTEuNS04em0tOTAuNS01NC44Yy0uMi0xLjUgMS4xLTIuOCAzLTMuMiAxLjktLjIgMy43IC42IDMuOSAxLjkgLjMgMS4zLTEgMi42LTMgMy0xLjkgLjQtMy43LS40LTMuOS0xLjd6bS05LjEgMy4yYy0yLjIgLjItMy43LS45LTMuNy0yLjQgMC0xLjMgMS41LTIuNCAzLjUtMi40IDEuOS0uMiAzLjcgLjkgMy43IDIuNCAwIDEuMy0xLjUgMi40LTMuNSAyLjR6bS0xNC4zLTIuMmMtMS45LS40LTMuMi0xLjktMi44LTMuMnMyLjQtMS45IDQuMS0xLjVjMiAuNiAzLjMgMi4xIDIuOCAzLjQtLjQgMS4zLTIuNCAxLjktNC4xIDEuM3ptLTEyLjUtNy4zYy0xLjUtMS4zLTEuOS0zLjItLjktNC4xIC45LTEuMSAyLjgtLjkgNC4zIC42IDEuMyAxLjMgMS44IDMuMyAuOSA0LjEtLjkgMS4xLTIuOCAuOS00LjMtLjZ6bS04LjUtMTBjLTEuMS0xLjUtMS4xLTMuMiAwLTMuOSAxLjEtLjkgMi44LS4yIDMuNyAxLjMgMS4xIDEuNSAxLjEgMy4zIDAgNC4xLS45IC42LTIuNiAwLTMuNy0xLjV6bS02LjMtOC44Yy0xLjEtMS4zLTEuMy0yLjgtLjQtMy41IC45LS45IDIuNC0uNCAzLjUgLjYgMS4xIDEuMyAxLjMgMi44IC40IDMuNS0uOSAuOS0yLjQgLjQtMy41LS42em0tNi02LjRjLTEuMy0uNi0xLjktMS43LTEuNS0yLjYgLjQtLjYgMS41LS45IDIuOC0uNCAxLjMgLjcgMS45IDEuOCAxLjUgMi42LS40IC45LTEuNyAxLjEtMi44IC40eiJdCiAgICB9OwogICAgZmFHaXRodWJTcXVhcmUgPSBmYVNxdWFyZUdpdGh1YjsKICAgIGZhVGhpbmtQZWFrcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ0aGluay1wZWFrcyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNzMxIiwgIk00NjUuNCA0MDkuNGw4Ny4xLTE1MC4yLTMyLS4zLTU1LjEgOTUtMjA2LjItMzUzLjktMjM2LjIgNDA3LjQgMzIgLjMgMjA0LjItMzUyLjEgMjA2LjIgMzUzLjh6TTExMC4xIDM2NS4zbDMyLjEgMCAxMTcuNC0yMDIuNSAyMDMuNCAzNDkuMSAzMi41IC4xLTIzNS44LTQwNC42LTE0OS42IDI1Ny45eiJdCiAgICB9OwogICAgZmFHb29nbGVEcml2ZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnb29nbGUtZHJpdmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjNhYSIsICJNMzM5IDMxNC45TDE3NS40IDMyIDMzNi42IDMyIDUwMC4yIDMxNC45IDMzOSAzMTQuOXpNMjAxLjUgMzM4LjVsLTgwLjYgMTQxLjUgMzEwLjUgMCA4MC42LTE0MS41LTMxMC41IDB6TTE1NC4xIDY3LjRMMCAzMzguNSA4MC42IDQ4MCAyMzcgMjA4LjggMTU0LjEgNjcuNHoiXQogICAgfTsKICAgIGZhQXV0b3ByZWZpeGVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImF1dG9wcmVmaXhlciIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNDFjIiwgIk0zMTguNCAxNmwtMTYxIDQ4MCA3Ny41IDAgMjUuNC04MS40IDExOS41IDAgMjUuMiA4MS40IDc3LjUgMC0xNjQuMS00ODB6TTI3OC4xIDM1Ny45bDQxLjItMTMwLjQgMS41IDAgNDAuOSAxMzAuNC04My42IDB6TTY0MCA0MDVMNjMwIDM3My42IDQ2Mi4xIDM1OCA0ODEuNSA0MTQuNSA2NDAgNDA1ek0xNzcuOSAzNThMMTAgMzczLjcgMCA0MDUgMTU4LjUgNDE0LjQgMTc3LjkgMzU4eiJdCiAgICB9OwogICAgZmFTcXVhcmVWaWFkZW8gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXZpYWRlbyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJ2aWFkZW8tc3F1YXJlIl0sICJmMmFhIiwgIk00NDggOTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMHpNMTE4LjMgMzgxLjJjLTY4LTczLjYtMTkuOC0xOTYuMSA4MS4yLTE5Ni4xIDEzLjMgMCAyNi42IDIuMSAzOS4xIDYuNy00LjMgOC40LTcuMyAxNy42LTguNCAyNy4xLTkuNy00LjEtMjAuMi02LTMwLjctNi00OC44IDAtODQuNiA0MS43LTg0LjYgODguOSAwIDQzIDI4LjUgNzguNyA2OS41IDg1LjkgNjEuNS0yNCA3Mi45LTExNy42IDcyLjktMTc1IDAtNy4zIDAtMTQuOC0uNi0yMi4xLTExLjItMzIuOS0yNi42LTY0LjYtNDQuMi05NC41IDI3LjEgMTguMyA0MS45IDYyLjUgNDQuMiA5NC4xbDAgLjRjNy43IDIyLjUgMTEuOCA0Ni4yIDExLjggNzAgMCA1NC4xLTIxLjkgOTktNjguMyAxMjguMmwtMi40IC4yYzUwIDEgODYuMi0zOC42IDg2LjItODcuMiAwLTEyLjItMi4xLTI0LjMtNi45LTM1LjcgOS41LTEuOSAxOC41LTUuNiAyNi40LTEwLjUgMTUuMyAzNi42IDEyLjYgODcuMy0yMi44IDEyNS42LTQyLjQgNDYuMi0xMjAgNDYuNi0xNjIuNCAwek0yNzQuNiAyMTcuNmMyMS45LTEyIDQ5LjYtMzAuNyA2Mi4zLTUzIDEuNS0zIDQuMS04LjYgNC41LTEyLTEyLjUgMjcuOS00NC4yIDQ5LjgtNzMuOSA1Ni43LTQuNy03LjMtNy41LTE1LjUtNy41LTI0LjMgMC0xMC4zIDUuMi0yNC4xIDEyLjktMzEuNiA4LjMtNy45IDE4LTEwLjkgMjcuOS0xNC4xIDE2LTUuMSAzMi41LTEwLjMgNDQuNS0zNS45IDMyLjUgNDYuMiAxMy4xIDEzMC4zLTM2LjMgMTMwLjMtMTMuMyAwLTI1LjEtNy4xLTM0LjQtMTYuMXoiXQogICAgfTsKICAgIGZhVmlhZGVvU3F1YXJlID0gZmFTcXVhcmVWaWFkZW87CiAgICBmYUNwYW5lbCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjcGFuZWwiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjM4OCIsICJNMjEwLjMgMjIwLjJjLTUuNi0yNC44LTI2LjktNDEuMi01MS00MS4ybC0zNyAwYy03LjEgMC0xMi41IDQuNS0xNC4zIDEwLjlMNzMuMSAzMjAgOTcuOCAzMTkuOWM2LjggMCAxMi4zLTQuNSAxNC4yLTEwLjdsMjUuOC05NS43IDE5LjggMGM4LjQgMCAxNi4yIDUuNiAxOC4zIDE0LjggMi41IDEwLjktNS45IDIyLjYtMTguMyAyMi42bC0xMC4zIDBjLTcgMC0xMi41IDQuNi0xNC4zIDEwLjhsLTYuNCAyMy44IDMyIDBjMzcuMiAwIDU4LjMtMzYuMiA1MS43LTY1LjN6bS0xNTYuNSAyOGwxOC42IDBjNi45IDAgMTIuNC00LjQgMTQuMy0xMC45bDYuMi0yMy42LTQwIDBDMzAgMjEzLjcgOSAyMjcuOCAxLjcgMjU0LjgtNyAyODguNiAxOC41IDMyMCA1MiAzMjBsMTIuNCAwIDcuMS0yNi4xYzEuMi00LjQtMi4yLTguMy02LjQtOC4zbC0xMS4zIDBjLTI0LjcgMC0yNC45LTM3LjQgMC0zNy40em0yNDcuNS0zNC44bC03Ny45IDAtMy41IDEzLjRjLTIuNCA5LjYgNC41IDE4LjUgMTQuMiAxOC41bDU3LjUgMGM0IDAgMi40IDQuMyAyLjEgNS4zbC04LjYgMzEuOGMtLjQgMS40LS45IDUuMy01LjUgNS4zbC0zNC45IDBjLTUuMyAwLTUuMy03LjkgMC03LjlsMjEuNiAwYzYuOCAwIDEyLjMtNC42IDE0LjItMTAuOGwzLjUtMTMuMi00OC40IDBjLTM5LjIgMC00My42IDYzLjgtLjcgNjMuOGw1Ny41IC4yYzExLjIgMCAyMC42LTcuMiAyMy40LTE3LjhsMTQtNTEuOGM0LjgtMTkuMi05LjctMzYuOC0yOC41LTM2Ljh6TTYzMy4xIDE3OWwtMTguOSAwYy00LjkgMC05LjIgMy4yLTEwLjQgNy45TDU2OC4yIDMyMGMyMC43IDAgMzkuOC0xMy44IDQ0LjktMzQuNWwyNi41LTk4LjJjMS4yLTQuMy0yLTguMy02LjUtOC4zek0zOTYuOCAyMTMuN2wwIC4xLTQ4LjMgMC0yNi4yIDk4Yy0xLjIgNC40IDIuMiA4LjMgNi40IDguM2wxOC45IDBjNC44IDAgOS4yLTMgMTAuNC03LjhsMTcuMi02NCAxOS44IDBjMTIuNSAwIDIxLjQgMTEuOCAxOC4xIDIzLjRsLTEwLjYgNDBjLTEuMiA0LjMgMS45IDguMyA2LjQgOC4zbDE5LjEgMGM0LjYgMCA5LjEtMi45IDEwLjMtNy44bDguOC0zMy4xYzktMzMuMS0xNS45LTY1LjQtNTAuMy02NS40em05OC4zIDc0LjZjLTMuNiAwLTYtMy40LTUuMS02LjdsOC0zMGMuOS0zLjkgMy43LTYgNy44LTZsMzIuOSAwYzIuNiAwIDQuNiAyLjQgMy45IDUuMWwtLjcgMi42Yy0uNiAyLTEuOSAzLTMuOSAzbC0yMS42IDBjLTcgMC0xMi42IDQuNi0xNC4yIDEwLjhsLTMuNSAxMyA1My40IDBjMTAuNSAwIDIwLjMtNi42IDIzLjItMTcuNmwzLjItMTJjNC45LTE5LjEtOS4zLTM2LjgtMjguMy0zNi44bC00Ny4zIDBjLTE3LjkgMC0zMy44IDEyLTM4LjYgMjkuNmwtMTAuOCA0MGMtNSAxNy43IDguMyAzNi43IDI4LjMgMzYuN2w2Ni43IDBjNi44IDAgMTIuMy00LjUgMTQuMi0xMC43bDUuNy0yMS03My4zIDB6Il0KICAgIH07CiAgICBmYU1lbmRlbGV5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1lbmRlbGV5IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY3YjMiLCAiTTYyNC42IDMyNS4yYy0xMi4zLTEyLjQtMjkuNy0xOS4yLTQ4LjQtMTcuMi00My4zLTEtNDkuNy0zNC45LTM3LjUtOTguOCAyMi44LTU3LjUtMTQuOS0xMzEuNS04Ny40LTEzMC44LTc3LjQgLjctODEuNyA4Mi0xMzAuOSA4Mi00OC4xIDAtNTQtODEuMy0xMzAuOS04Mi03Mi45LS44LTExMC4xIDczLjMtODcuNCAxMzAuOCAxMi4yIDYzLjkgNS44IDk3LjgtMzcuNSA5OC44LTIxLjItMi4zLTM3IDYuNS01MyAyMi41LTE5LjkgMTkuNy0xOS4zIDk0LjggNDIuNiAxMDIuNiA0Ny4xIDUuOSA4MS42LTQyLjkgNjEuMi04Ny44LTQ3LjMtMTAzLjcgMTg1LjktMTA2LjEgMTQ2LjUtOC4yLS4xIC4xLS4yIC4yLS4zIC40LTI2LjggNDIuOCA2LjggOTcuNCA1OC44IDk1LjIgNTIuMSAyLjEgODUuNC01Mi42IDU4LjgtOTUuMi0uMS0uMi0uMi0uMy0uMy0uNC0zOS40LTk3LjkgMTkzLjgtOTUuNSAxNDYuNSA4LjItNC42IDEwLTYuNyAyMS4zLTUuNyAzMyA0LjkgNTMuNCA2OC43IDc0LjEgMTA0LjkgMzUuMiAxNy44LTE0LjggMjMuMS02NS42IDAtODguM3pNMzIwLjcgMzA2LjFsLS42IDBjLTQzLjQgMC02Mi44LTM3LjUtNjIuOC02Mi44IDAtMzQuNyAyOC4yLTYyLjggNjIuOC02Mi44bC42IDBjMzQuNyAwIDYyLjggMjguMSA2Mi44IDYyLjggMCAyNS0xOS4yIDYyLjgtNjIuOCA2Mi44eiJdCiAgICB9OwogICAgZmFEcmFmdDJkaWdpdGFsID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImRyYWZ0MmRpZ2l0YWwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjM5NiIsICJNNDk2IDM5OC4xbC0xNDQtODIuMiAwIDY0LjctOTEuMyAwYzMwLjgtMzUgODEuOC05NS45IDExMS44LTE0OS4zIDM1LjItNjIuNiAxNi4xLTEyMy40LTEyLjgtMTUzLjMtNC40LTQuNi02Mi4yLTYyLjktMTY2LTQxLjItNTkuMSAxMi40LTg5LjQgNDMuNC0xMDQuMyA2Ny4zLTEzLjEgMjAuOS0xNyAzOS44LTE4LjIgNDcuNy01LjUgMzMgMTkuNCA2Ny4xIDU2LjcgNjcuMSAzMS43IDAgNTcuMy0yNS43IDU3LjMtNTcuNCAwLTI3LjEtMTkuNy01Mi4xLTQ4LTU2LjggMS44LTcuMyAxNy43LTIxLjEgMjYuMy0yNC43IDQxLjEtMTcuMyA3OCA1LjIgODMuMyAzMy41IDguMyA0NC4zLTM3LjEgOTAuNC02OS43IDEyNy42LTc2LjYgODctMTQyLjggMTU1LjctMTYxLjEgMTc0LjhsMzM2LS4xIDAgNjQuMiAxNDQtODEuOXpNMzg1LjkgMzcxbDQ3LjEgMjcuMi00Ny4xIDI3LjIgMC01NC40ek0xMDUuNCAxNjEuNGEyMi40IDIyLjQgMCAxIDEgNDQuOCAwIDIyLjQgMjIuNCAwIDEgMSAtNDQuOCAwek05OC41IDM4MC41YzI1LjYtMjcuNCA5Ny43LTEwNC43IDE1MC44LTE2OS45IDM1LjEtNDMuMSA0MC4zLTgyLjQgMjguNC0xMTIuNy03LjQtMTguOC0xNy41LTMwLjItMjQuMy0zNS43IDQ1LjMgMi4xIDY4IDIzLjQgODIuMiAzOC4zIDAgMCA0Mi40IDQ4LjIgNS44IDExMy4zLTM3IDY1LjktMTEwLjkgMTQ3LjUtMTI4LjUgMTY2LjdsLTExNC40IDB6Il0KICAgIH07CiAgICBmYVJlcGx5ZCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJyZXBseWQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjNlNiIsICJNMzIwIDQ4MGwtMTkyIDBDNTcuNiA0ODAgMCA0MjIuNCAwIDM1MkwwIDE2MEMwIDg5LjYgNTcuNiAzMiAxMjggMzJsMTkyIDBjNzAuNCAwIDEyOCA1Ny42IDEyOCAxMjhsMCAxOTJjMCA3MC40LTU3LjYgMTI4LTEyOCAxMjh6TTE5My40IDI3My4yYy02LjEtMi0xMS42LTMuMS0xNi40LTMuMS03LjIgMC0xMy41IDEuOS0xOC45IDUuNnMtOS42IDktMTIuOCAxNS44bC0xLjEgMC00LjItMTguMy0yOCAwIDAgMTM4LjkgMzYuMSAwIDAtODkuN2MxLjUtNS40IDQuNC05LjggOC43LTEzLjJzOS44LTUuMSAxNi4yLTUuMWM0LjYgMCA5LjggMSAxNS42IDMuMWw0LjgtMzR6TTMwOC42IDM3Ni42Yy0zLjIgMi40LTcuNyA0LjgtMTMuNyA3LjFzLTEyLjggMy41LTIwLjQgMy41Yy0xMi4yIDAtMjEuMS0zLTI2LjUtOC45LTUuNS01LjktOC41LTE0LjctOS0yNi40bDgzLjMgMGMuOS00LjggMS42LTkuNCAyLjEtMTMuOSAuNS00LjQgLjctOC42IC43LTEyLjUgMC0xMC43LTEuNi0xOS43LTQuNy0yNi45LTMuMi03LjItNy4zLTEzLTEyLjUtMTcuMi01LjItNC4zLTExLjEtNy4zLTE3LjgtOS4yLTYuNy0xLjgtMTMuNS0yLjgtMjAuNi0yLjgtMjEuMSAwLTM3LjUgNi4xLTQ5LjIgMTguM3MtMTcuNSAzMC41LTE3LjUgNTVjMCAyMi44IDUuMiA0MC43IDE1LjYgNTMuNyAxMC40IDEzLjEgMjYuOCAxOS42IDQ5LjIgMTkuNiAxMC43IDAgMjAuOS0xLjUgMzAuNC00LjZzMTcuMS02LjggMjIuNi0xMS4ybC0xMi0yMy42em0tMjEuOC03MC4zYzMuOCA1LjQgNS4zIDEzLjEgNC42IDIzLjFsLTUxLjcgMGMuOS05LjQgMy43LTE3IDguMi0yMi42czExLjUtOC41IDIxLTguNWM4LjItLjEgMTQuMSAyLjYgMTcuOSA4em03OS45IDIuNWM0LjEgMy45IDkuNCA1LjggMTYuMSA1LjggNyAwIDEyLjYtMS45IDE2LjctNS44czYuMS05LjEgNi4xLTE1LjYtMi0xMS42LTYuMS0xNS40LTkuNi01LjctMTYuNy01LjdjLTYuNyAwLTEyIDEuOS0xNi4xIDUuN3MtNi4xIDguOS02LjEgMTUuNCAyIDExLjcgNi4xIDE1LjZ6bTAgMTAwLjVjNC4xIDMuOSA5LjQgNS44IDE2LjEgNS44IDcgMCAxMi42LTEuOSAxNi43LTUuOHM2LjEtOS4xIDYuMS0xNS42LTItMTEuNi02LjEtMTUuNC05LjYtNS43LTE2LjctNS43Yy02LjcgMC0xMiAxLjktMTYuMSA1LjdzLTYuMSA4LjktNi4xIDE1LjRjMCA2LjYgMiAxMS43IDYuMSAxNS42eiJdCiAgICB9OwogICAgZmFFbXBpcmUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZW1waXJlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxZDEiLCAiTTI5NS42IDU0LjJjLTEwLjgtMi4yLTIyLjEtMy4zLTMzLjUtMy42bDAtMTguMmM3OC4xIDIuMiAxNDYuMSA0NCAxODQuNiAxMDYuNmwtMTUuOCA5LjFjLTYuMS05LjctMTIuNy0xOC44LTIwLjItMjcuMWwtMTggMTUuNWMtMjYtMjkuNi02MS40LTUwLjctMTAxLjktNTguNGw0LjgtMjMuOXpNNjEuNCAzMjIuNGwyMy03LjdjLTYuNC0xOC4zLTEwLTM4LjItMTAtNTguN3MzLjMtNDAuNCA5LjctNTguN2wtMjIuNy03LjdjMy42LTEwLjggOC4zLTIxLjMgMTMuNi0zMWwtMTUuOC05LjFDNDIgMTgxIDMyLjEgMjE3LjUgMzIuMSAyNTZzMTAgNzUgMjcuMSAxMDYuNkw3NSAzNTMuNWMtNS4zLTEwLTkuNy0yMC4zLTEzLjYtMzEuMXpNMjIxLjEgNDM0Yy00MC40LTgtNzUuOC0yOS4xLTEwMS45LTU4LjdsLTE4IDE1LjhjLTcuNS04LjYtMTQuNC0xNy43LTIwLjItMjcuNGwtMTYgOS40YzM4LjUgNjIuMyAxMDYuOCAxMDQuMyAxODQuOSAxMDYuNmwwLTE4LjNjLTExLjMtLjMtMjIuNy0xLjctMzMuNS0zLjZsNC43LTIzLjh6TTEwMS4zIDEyMC45bDE4IDE1LjVjMjYtMjkuNiA2MS40LTUwLjcgMTAxLjktNTguNGwtNC43LTIzLjhjMTAuOC0yLjIgMjIuMS0zLjMgMzMuNS0zLjZsMC0xOC4yQzE3MS45IDM0LjYgMTAzLjkgNzYuNCA2NS40IDEzOWwxNS44IDkuMWM2LTkuNyAxMi42LTE4LjkgMjAuMS0yNy4yek00MTAuNyAzOTEuMWwtMTgtMTUuOGMtMjYgMjkuNi02MS40IDUwLjctMTAxLjkgNTguN2w0LjcgMjMuOGMtMTAuOCAxLjktMjIuMSAzLjMtMzMuNSAzLjZsMCAxOC4zYzc4LjEtMi4yIDE0Ni40LTQ0LjMgMTg0LjktMTA2LjZsLTE2LjEtOS40Yy01LjcgOS43LTEyLjYgMTguOC0yMC4xIDI3LjR6TTggMjU2YTI0OCAyNDggMCAxIDEgNDk2IDAgMjQ4IDI0OCAwIDEgMSAtNDk2IDB6bTQ4My44IDBhMjM1LjggMjM1LjggMCAxIDAgLTQ3MS42IDAgMjM1LjggMjM1LjggMCAxIDAgNDcxLjYgMHptLTM5LTEwNi42TDQzNyAxNTguNWM1LjMgOS43IDEwIDIwLjIgMTMuNiAzMWwtMjIuNyA3LjdjNi40IDE4LjMgOS43IDM4LjIgOS43IDU4LjdzLTMuNiA0MC40LTEwIDU4LjdsMjMgNy43Yy0zLjkgMTAuOC04LjMgMjEtMTMuNiAzMWwxNS44IDkuMUM0NzAgMzMxIDQ3OS45IDI5NC41IDQ3OS45IDI1NnMtOS45LTc1LTI3LjEtMTA2LjZ6bS0xODMgMTc3LjdjMTYuMy0zLjMgMzAuNC0xMS42IDQwLjctMjMuNWw1MS4yIDQ0LjhjMTEuOS0xMy42IDIxLjMtMjkuMyAyNy4xLTQ2LjhsLTY0LjItMjIuMWMyLjUtNy41IDMuOS0xNS4yIDMuOS0yMy41cy0xLjQtMTYuMS0zLjktMjMuNWw2NC41LTIyLjFjLTYuMS0xNy40LTE1LjUtMzMuMi0yNy40LTQ2LjhsLTUxLjIgNDQuOGMtMTAuMi0xMS45LTI0LjQtMjAuNS00MC43LTIzLjhsMTMuMy02Ni40Yy04LjYtMS45LTE3LjctMi44LTI3LjEtMi44cy0xOC41IC44LTI3LjEgMi44bDEzLjMgNjYuNGMtMTYuMyAzLjMtMzAuNCAxMS45LTQwLjcgMjMuOGwtNTEuMi00NC44Yy0xMS45IDEzLjYtMjEuMyAyOS4zLTI3LjQgNDYuOGw2NC41IDIyLjFjLTIuNSA3LjUtMy45IDE1LjItMy45IDIzLjVzMS40IDE2LjEgMy45IDIzLjVsLTY0LjIgMjIuMWM1LjggMTcuNCAxNS4yIDMzLjIgMjcuMSA0Ni44bDUxLjItNDQuOGMxMC4yIDExLjkgMjQuNCAyMC4yIDQwLjcgMjMuNWwtMTMuMyA2Ni43YzguNiAxLjcgMTcuNyAyLjggMjcuMSAyLjhzMTguNS0xLjEgMjcuMS0yLjhsLTEzLjMtNjYuN3oiXQogICAgfTsKICAgIGZhQWNjZXNzaWJsZUljb24gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYWNjZXNzaWJsZS1pY29uIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbNjIxMDddLCAiZjM2OCIsICJNNDIzLjkgMjU1LjhMNDExIDQxMy4xYy0zLjMgNDAuNy02My45IDM1LjEtNjAuNi00LjlsMTAtMTIyLjUtNDEuMSAyLjNjMTAuMSAyMC43IDE1LjggNDMuOSAxNS44IDY4LjUgMCA0MS4yLTE2LjEgNzguNy00Mi4zIDEwNi41bC0zOS4zLTM5LjNjNTcuOS02My43IDEzLjEtMTY3LjItNzQtMTY3LjItMjUuOSAwLTQ5LjUgOS45LTY3LjIgMjZMNzMgMjQzLjJjMjItMjAuNyA1MC4xLTM1LjEgODEuNC00MC4ybDc1LjMtODUuNy00Mi42LTI0LjgtNTEuNiA0NkMxMDUuNSAxNjUuMyA2NC45IDEyMCA5NSA5My4xbDY4LTYwLjdjOS44LTguOCAyNC4xLTEwLjIgMzUuNS0zLjYgMCAwIDEzOS4zIDgwLjkgMTM5LjUgODEuMSAxNi4yIDEwLjEgMjAuNyAzNiA2LjEgNTIuNmwtNTguNCA2Ni41IDEwNi4xLTUuOWMxOC41LTEuMSAzMy42IDE0LjQgMzIuMSAzMi43ek0zNTkgMTAxLjhBNTAuOSA1MC45IDAgMSAwIDM1OSAwIDUwLjkgNTAuOSAwIDEgMCAzNTkgMTAxLjh6TTE3OS42IDQ1Ni41Yy04MC42IDAtMTI3LjQtOTAuNi04Mi43LTE1Ni4xTDU3LjIgMjYwLjdDMzYuNCAyODcgMjQgMzIwLjMgMjQgMzU2LjQgMjQgNDg3LjEgMTc0LjcgNTU3LjggMjc1LjQgNDc4LjlsLTM5LjctMzkuN2MtMTYgMTAuOS0zNS4zIDE3LjMtNTYuMSAxNy4zeiJdCiAgICB9OwogICAgZmFRdW9yYSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJxdW9yYSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMmM0IiwgIk00NDAuNyAzODYuN2wtMjkuMyAwYy0xLjUgMTMuNS0xMC41IDMwLjgtMzMgMzAuOC0yMC41IDAtMzUuMy0xNC4yLTQ5LjUtMzUuOCA0NC4yLTM0LjIgNzQuNy04Ny41IDc0LjctMTUzIC4xLTExNy41LTk2LjYtMTk2LjctMTk4LjQtMTk2LjctOTkuNyAwLTE5Ny43IDc5LjctMTk3LjcgMTk2LjcgMCAxMzQuMSAxMzEuMyAyMjEuNiAyNDkgMTg5IDE5LjcgMzMuNiA0NS43IDYyLjMgOTUuMiA2Mi4zIDgxLjggMCA5MC44LTc1LjMgODktOTMuM3pNMjk3LjIgMzI5LjJjLTE5LjUtMjkuMi00My43LTUyLjItOTEuNS01Mi4yLTMwLjUgMC01NC4zIDEwLTY5IDIyLjhsMTIuMiAyNC4zYzYuMi0zIDEzLTQgMTkuOC00IDM1LjUgMCA1My43IDMwLjggNjkuMiA2MS4zLTEwIDMtMjAuNyA0LjItMzIuNyA0LjItNzUgMC0xMDcuNS01My0xMDcuNS0xNTYuNyAwLTEwNC40IDMyLjUtMTU3LjkgMTA3LjUtMTU3LjkgNzYuMiAwIDEwOC43IDUzLjUgMTA4LjcgMTU3LjcgLjEgNDEuOC01LjQgNzUuNi0xNi43IDEwMC41eiJdCiAgICB9OwogICAgZmFDY0pjYiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjYy1qY2IiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjI0YiIsICJNNDMxLjUgMjQ0LjNsMC0zMi4zYzQxLjIgMCAzOC41IC4yIDM4LjUgLjIgNy4zIDEuMyAxMy4zIDcuMyAxMy4zIDE2IDAgOC44LTYgMTQuNS0xMy4zIDE1LjgtMS4yIC40LTMuMyAuMy0zOC41IC4zem00Mi44IDIwLjJjLTIuOC0uNy0zLjMtLjUtNDIuOC0uNWwwIDM1YzM5LjYgMCA0MCAuMiA0Mi44LS41IDcuNS0xLjUgMTMuNS04IDEzLjUtMTcgMC04LjctNi0xNS41LTEzLjUtMTd6TTU3NiA4MGwwIDM1MmMwIDI2LjUtMjEuNSA0OC00OCA0OEw0OCA0ODBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4TDAgODBDMCA1My41IDIxLjUgMzIgNDggMzJsNDgwIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDh6TTE4MiAxOTIuM2wtNTcgMGMwIDY3LjEgMTAuNyAxMDkuNy0zNS44IDEwOS43LTE5LjUgMC0zOC44LTUuNy01Ny4yLTE0LjhsMCAyOGMzMCA4LjMgNjggOC4zIDY4IDguMyA5Ny45IDAgODItNDcuNyA4Mi0xMzEuMnptMTc4LjUgNC41Yy02My40LTE2LTE2NS0xNC45LTE2NSA1OS4zIDAgNzcuMSAxMDguMiA3My42IDE2NSA1OS4ybDAtMjguM0MzMTIuOSAzMTEuNyAyNTMgMzA5IDI1MyAyNTZzNTkuOC01NS42IDEwNy41LTMxLjJsMC0yOHpNNTQ0IDI4Ni41YzAtMTguNS0xNi41LTMwLjUtMzgtMzJsMC0uOGMxOS41LTIuNyAzMC4zLTE1LjUgMzAuMy0zMC4yIDAtMTktMTUuNy0zMC0zNy0zMSAwIDAgNi4zLS4zLTEyMC4zLS4zbDAgMTI3LjUgMTIyLjcgMGMyNC4zIC4xIDQyLjMtMTIuOSA0Mi4zLTMzLjJ6Il0KICAgIH07CiAgICBmYUZlZG9yYSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmZWRvcmEiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjc5OCIsICJNMCAyNTUuOEMuMSAxMzIuMiAxMDAuMyAzMiAyMjQgMzJTNDQ4IDEzMi4zIDQ0OCAyNTYgMzQ3LjggNDc5LjkgMjI0LjEgNDgwTDUwLjkgNDgwQzIyLjggNDgwIC4xIDQ1Ny4zIDAgNDI5LjJsMCAwIDAtMTczLjQgMCAwem0zNDIuNi02My4xYzAtMzkuNy0zNS42LTY4LjUtNzMuMi02OC41LTM0LjkgMC02NS44IDI2LjMtNzAuMSA1OS45LS4yIDMuOC0uNCA1LS40IDguNS0uMSAyMS4xIDAgNDIuOC0uOCA2NC40IC45IDI2LjEgMSA1Mi4xIDAgNzYuNiAwIDI3LjEtMTkuNCA0NS41LTQ0LjcgNDUuNXMtNDUuOC0yMC4yLTQ1LjgtNDUuNWMuNS0yNy43IDIyLjYtNDUuMyA0OC41LTQ2LjFsLjIgMCAyNi4zLS4yIDAtMzcuMy0yNi4zIC4yYy00Ny4xLS40LTg0LjYgMzYuNS04NS45IDgzLjQgMCA0NS42IDM3LjUgODIuOSA4MyA4Mi45IDQzIDAgNzguNy0zMy42IDgyLjYtNzUuNmwuMi01My41IDMyLjYtLjNjMjUuMyAuMiAyNS0zNy44LS4yLTM3LjNsLTMyLjQgLjNjMC02LjQgLjEtMTIuOCAuMS0xOS4yIC4xLTEyLjcgLjEtMjUuNC0uMS0zOC4yIC4xLTE2LjUgMTUuOC0zMS4yIDMzLjItMzEuMiAxNy41IDAgMzUuOSA4LjcgMzUuOSAzMS4yIDAgMy4yLS4xIDUuMS0uMyA2LjMtMS45IDEwLjUgNS4yIDIwLjQgMTUuNyAyMS45IDEwLjYgMS41IDIwLjItNi4xIDIxLjItMTYuNiAuNi00LjIgLjctNy45IC43LTExLjZ6Il0KICAgIH07CiAgICBmYUR1b2xpbmdvID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImR1b2xpbmdvIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU4MTIiLCAiTTUwNC4zIDIzMC41YzEwLjQgODguNS00My40IDE3Mi4xLTEyOC4yIDE5OXMtMTc2LjYtMTAuMy0yMTguOS04OC43Yy03MiAzLTEzNy40LTM5LjgtMTYzLjItMTA1LjUtMi42LTYuNi0xLjktMTQgMS45LTE5LjlzMTAuMi05LjcgMTcuMi0xMC4xbDk2LjEtNi0yMy44LTc1LjljLTYuMy0yMC0yLjItNDEuOSAxMS01OC4zczMzLjctMjUgNTQuNS0yM2M1Mi4yIDUgODYuOCA0LjggMTA0LS42UzMwMCAxNi43IDMzOS0xNi45YzE1LjktMTMuNyAzNy43LTE4LjUgNTcuOC0xMi43czM2LjEgMjEuMyA0Mi40IDQxLjRMNDYyLjggODcgNTQzLjYgMzcuM2M2LTMuNyAxMy40LTQuMyAxOS45LTEuNnMxMS4zIDguMyAxMi45IDE1LjJjMTYuMiA2OC4yLTEyLjQgMTQwLjMtNzIuMSAxNzkuNXpNMjU4LjUgNDc1LjlsMCAwYzE1LjEgNy41IDIxLjUgMjUuOCAxNC4yIDQxcy0yNS40IDIxLjktNDAuNyAxNC45bC00My45LTIxYy0xNS4xLTcuNS0yMS41LTI1LjgtMTQuMi00MXMyNS40LTIxLjkgNDAuNy0xNC45bDQzLjggMjF6TTU2NC42IDM0NS43YzE0LjggOC40IDIwIDI3LjMgMTEuNiA0Mi4ybC0yMy45IDQyLjRjLTguNyAxNC4zLTI3LjEgMTkuMi00MS42IDEwLjlzLTE5LjktMjYuNi0xMi00MS40bDIzLjktNDIuNGM0LTcuMSAxMC43LTEyLjQgMTguNi0xNC42czE2LjMtMS4yIDIzLjQgMi45eiJdCiAgICB9OwogICAgZmFGaXJzdGRyYWZ0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImZpcnN0ZHJhZnQiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjNhMSIsICJNMzg0IDE5MmwtNjQgMCAwIDEyOC0xMjggMCAwIDEyOC0xOTIgMCAwLTI1LjYgMTY2LjQgMCAwLTEyOCAxMjggMCAwLTEyOCA4OS42IDAgMCAyNS42em0tMjUuNiAzOC40bDAgMTI4LTEyOCAwIDAgMTI4LTE2Ni40IDAgMCAyNS42IDE5MiAwIDAtMTI4IDEyOCAwIDAtMTUzLjYtMjUuNiAwem0yNS42IDE5MmwtODkuNiAwIDAgODkuNiAyNS42IDAgMC02NCA2NCAwIDAtMjUuNnpNMCAwbDAgMzg0IDEyOCAwIDAtMTI4IDEyOCAwIDAtMTI4IDEyOCAwIDAtMTI4LTM4NCAweiJdCiAgICB9OwogICAgZmFGcmVlYnNkID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImZyZWVic2QiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjNhNCIsICJNMzAzLjcgOTYuMmMxMS4xLTExLjEgMTE1LjUtNzcgMTM5LjItNTMuMiAyMy43IDIzLjctNDIuMSAxMjguMS01My4yIDEzOS4ycy0zOS40IC45LTYzLjEtMjIuOWMtMjMuOC0yMy43LTM0LjEtNTItMjIuOS02My4xek0xMDkuOSA2OC4xQzczLjYgNDcuNSAyMiAyNC42IDUuNiA0MS4xLTExIDU3LjcgMTIuNyAxMTAuNSAzMy41IDE0Ni44IDUyIDExNC42IDc4LjMgODcuNSAxMDkuOSA2OC4xek00MDYuNyAxNzRjMy4zIDExLjMgMi43IDIwLjctMi43IDI2LjEtMjAuMyAyMC4zLTg3LjUtMjctMTA5LjMtNzAuMS0xOC0zMi4zLTExLjEtNTMuNCAxNC45LTQ4LjcgNS43LTMuNiAxMi4zLTcuNiAxOS42LTExLjYtMjkuOC0xNS41LTYzLjYtMjQuMy05OS41LTI0LjMtMTE5LjEgMC0yMTUuNiA5Ni41LTIxNS42IDIxNS42IDAgMTE5IDk2LjUgMjE1LjYgMjE1LjYgMjE1LjZTNDQ1LjMgMzgwLjEgNDQ1LjMgMjYxYzAtMzguNC0xMC4xLTc0LjUtMjcuNy0xMDUuOC0zLjkgNy03LjYgMTMuMy0xMC45IDE4Ljh6Il0KICAgIH07CiAgICBmYU9keXNlZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJvZHlzZWUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTVjNiIsICJNNDA2LjcgNDYzYy00Mi4zIDMwLjgtOTQuNCA0OS0xNTAuNyA0OS0xMTEuMSAwLTIwNS43LTcwLjgtMjQxLjEtMTY5LjggMi40IDEuNyA1LjkgMy42IDcuOSA0LjQgMTYuMyA3LjQgNDAuMS01LjQgNjIuOS0yOC43IDYuOS02LjkgMTQuNC0xMi40IDIyLjgtMTcuMyAxOC4zLTExLjkgMzcuNi0yMC44IDU4LjQtMjcuMiAwIDAgMjIuMyAzNC4yIDQzLjEgNzQuOHMtMjIuMyA1NC0yNy4yIDU0Yy0uMyAwLS44IDAtMS41LS4xLTExLS41LTcwLTMtNTYgNTEuMSAxNC45IDU3LjQgOTcuNSAzNi42IDEzOS42IDguOXMzMS43LTExOC4zIDMxLjctMTE4LjNjNDEuMS02LjQgNTQgMzcuMSA1Ny45IDU5LjQgLjggNC42IDEuMSA5LjkgMS40IDE1LjUgMS4xIDIxLjIgMi4zIDQ1LjYgMzUuMyA0Ni40IDUuMyAwIDEwLjYtLjggMTUuNS0ybDAtLjF6bS05NS4zLTIzLjdjLTItLjUtMy41LTIuNS0zLTUgMS0yLjUgMy0zLjUgNS0zczMuNSAzIDMgNS0yLjUgMy41LTUgM3ptLTIwNy05NS42YzEuNS0uNSAzLjUgMSA0IDMgMCAyLTEgNC0zIDQtMS41IC41LTMuNS0xLTQtMy0uNS0xLjUgMS0zLjUgMy00ek00NTEuOCA0MjFjMzcuNS00NC42IDYwLjItMTAyLjIgNjAuMi0xNjUgMC02Ny41LTI2LjEtMTI4LjktNjguOC0xNzQuNy0uMSAyMy41LTYuMSA0OC4yLTE2LjggNjkuMi0xMS45IDIwLjMtNDkgNTguOS02OS44IDc4LjctLjcgLjMtMS4xIC45LTEuNSAxLjQtLjIgLjItLjMgLjQtLjUgLjYtNSA2LjktNCAxNi44IDMgMjEuOCAyMS4zIDE1LjggNTYuNCA0NS42IDU5LjQgNzIuOCAzLjUgMzQuOSAyNy45IDc1LjYgMzQuMiA4Ni4yIC44IDEuMyAxLjMgMi4xIDEuNCAyLjQgMCAyLjItLjQgNC4zLS44IDYuNWwwIC4xek0zOTAuNyAyNTFjLS41IDMgMSA1LjkgNCA2LjRzNS45LTEgNi40LTQtMS01LjktNC02LjRjLTMtMS01LjkgMS02LjQgNHptNjEuNC02MC45bC0xMS40IDUuNC0zIDEyLjktNS40LTExLjQtMTIuOS0zIDExLjQtNS40IDMtMTIuOSA1LjQgMTEuNCAxMi45IDN6TTM5NS41IDQxLjNjLTE2LjIgOC4yLTIyLjEgMzIuOC0yOSA2MS40LS4zIDEuNC0uNyAyLjgtMSA0LjItOS41IDM4LjUtMzAuNiAzNy42LTQxLjcgMzcuMi0xLjEgMC0yLS4xLTIuOS0uMS01LjEgMC02LTQtOC45LTE3LjEtMi42LTEyLjEtNi45LTMyLTE3LjktNjMuNi0yMi43LTY1LjgtODIuNy00OS40LTEyOC4yLTIyLjItNTUuMyAzMy4xLTM0LjQgMTAxLjktMTkuOCAxNDkuNCAuNyAyLjIgMS40IDQuNCAyIDYuNi00IDQtMTMuOCA3LjUtMjYgMTEuOS0xMi4xIDQuMy0yNi42IDkuNS00MC4zIDE2LjktMzMuOSAxOC03MC4zIDQ5LTc5LjggNjIuNi0xLjMtMTAuNy0yLTIxLjUtMi0zMi41IDAtMTQxLjQgMTE0LjYtMjU2IDI1Ni0yNTYgNTEuNCAwIDk5LjQgMTUuMiAxMzkuNSA0MS4zek01OC45IDE4OS42Yy0xLjUtMi00LjUtMy02LjQtMS41cy0zIDQuNS0xLjUgNi40IDQuNSAzIDYuNCAxLjVjMi41LTEuNSAzLTQuNSAxLjUtNi40ek0zMjcuMyA2NC45YzItMS41IDUtLjUgNi40IDEuNSAxLjUgMi41IDEgNS40LTEuNSA2LjQtMiAxLjUtNSAuNS02LjQtMS41cy0uNS01IDEuNS02LjR6TTk1LjEgMTA1Yy0uNSAxLjUgLjUgMyAyIDMgMS41IC41IDMtLjUgMy0yIC41LTEuNS0uNS0zLTItM3MtMyAuNS0zIDJ6bTg0LjctLjVjLTMuNS00My4xIDM3LjEtNTQgMzcuMS01NCA0NC4xLTE1LjQgNTYgNS45IDY2LjQgMzcuNnMzIDQyLjYtMzguNiA1OC45LTYxLjktNC41LTY0LjktNDIuNmwwIC4xem04OS42IDE0LjlsMSAwYzIuNSAwIDUtMiA1LTUgMi02LjkgMS0xNC40LTItMjAuOC0xLjUtMi00LTMuNS02LjQtMi41LTMgMS00LjUgNC0zLjUgNi45IDIgNC41IDMgOS45IDEuNSAxNC45LS41IDMgMS41IDUuOSA0LjUgNi40bC0uMSAuMXptLTkuOS00MS42Yy0yIDAtNC0xLTUtM3MtMi0zLjUtMy01Yy0yLTItMi01LjQgMC03LjRzNS40LTIgNy40IDBjMiAyLjUgMy41IDUgNSA3LjRzLjUgNS45LTIuNSA3LjRjLS42IDAtMSAuMi0xLjMgLjMtLjIgLjEtLjQgLjItLjYgLjJsMCAuMXoiXQogICAgfTsKICAgIGZhR2dDaXJjbGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZ2ctY2lyY2xlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyNjEiLCAiTTI1Ny41IDhhMjQ4IDI0OCAwIDEgMCAwIDQ5NiAyNDggMjQ4IDAgMSAwIDAtNDk2ek0yMDggMzgyLjhsLTEyNS43LTEyNS43IDEyNS43LTEyNS43IDM1LjIgMzUuNC0yNC4yIDI0LjItMTEuMS0xMS4xLTc3LjIgNzcuMiA3Ny4yIDc3LjIgMjYuNi0yNi42LTUzLjEtNTIuOSAyNC40LTI0LjQgNzcuMiA3Ny4yLTc1IDc1LjJ6bTk5LTIuMmwtMzUuMi0zNS4yIDI0LjEtMjQuNCAxMS4xIDExLjEgNzcuMi03Ny4yLTc3LjItNzcuMi0yNi41IDI2LjUgNTMuMSA1Mi45LTI0LjQgMjQuNC03Ny4yLTc3LjIgNzUtNzUgMTI1LjcgMTI1LjctMTI1LjcgMTI1LjZ6Il0KICAgIH07CiAgICBmYUNsb3VkZmxhcmUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY2xvdWRmbGFyZSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlMDdkIiwgIk00MDcuOSAzMTkuOUwxNzcuMSAzMTdjLS43IDAtMS40LS4yLTItLjVzLTEuMi0uOC0xLjYtMS40Yy0uNC0uNi0uNy0xLjMtLjctMnMwLTEuNCAuMi0yLjFjLjQtMS4xIDEuMS0yLjEgMi4xLTIuOHMyLjEtMS4yIDMuMy0xLjJsMjMyLjktMi45YzI3LjYtMS4zIDU3LjUtMjMuNiA2OC01MC44bDEzLjMtMzQuNWMuNC0uOSAuNS0xLjkgLjUtMi45IDAtLjUtLjEtMS4xLS4yLTEuNi03LjQtMzIuMi0yNS02MS4xLTUwLjMtODIuM3MtNTYuNy0zMy43LTg5LjctMzUuNS02NS42IDcuMy05MyAyNS43LTQ4IDQ1LjMtNTguOCA3Ni41Yy0xMS4zLTguNS0yNC45LTEzLjMtMzktMTMuN3MtMjggMy41LTM5LjggMTEuNC0yMC44IDE5LjEtMjUuOSAzMi4zLTUuOSAyNy42LTIuNCA0MS4zYy01Mi4zIDEuNS05NC4yIDQ0LjEtOTQuMiA5Ni41IDAgNC43IC4zIDkuMyAxIDE0IC4yIDEuMSAuNyAyLjEgMS41IDIuOHMxLjkgMS4xIDIuOSAxLjFsNDI2LjEgLjFjMCAwIC4xIDAgLjEgMCAxLjIgMCAyLjMtLjQgMy4zLTEuMXMxLjYtMS43IDItMi45bDMuMy0xMS4zYzMuOS0xMy40IDIuNC0yNS44LTQuMS0zNC45LTYtOC40LTE2LjEtMTMuMy0yOC4yLTEzLjl6bTEwNS45LTk4LjhjLTIuMSAwLTQuMyAuMS02LjQgLjItLjggLjEtMS41IC4zLTIuMSAuOHMtMSAxLjEtMS4zIDEuOGwtOS4xIDMxLjJjLTMuOSAxMy40LTIuNCAyNS44IDQuMSAzNC45IDYgOC40IDE2LjEgMTMuMyAyOC4yIDEzLjlsNDkuMiAyLjljLjcgMCAxLjQgLjIgMiAuNXMxLjEgLjggMS41IDEuNGMuNCAuNiAuNyAxLjMgLjggMnMwIDEuNS0uMiAyLjFjLS40IDEuMS0xLjEgMi4xLTIuMSAyLjhzLTIuMSAxLjItMy4zIDEuMmwtNTEuMSAyLjljLTI3LjggMS4zLTU3LjcgMjMuNi02OC4xIDUwLjhsLTMuNyA5LjZjLS4yIC40LS4yIC44LS4yIDEuM3MuMiAuOCAuNCAxLjIgLjYgLjcgLjkgLjkgLjggLjMgMS4yIC4zYzAgMCAuMSAwIC4xIDBsMTc1LjkgMGMxIDAgMi0uMyAyLjgtLjlzMS40LTEuNSAxLjctMi40YzMuMS0xMS4xIDQuNy0yMi41IDQuNy0zNCAwLTY5LjMtNTYuNS0xMjUuNS0xMjYuMS0xMjUuNXoiXQogICAgfTsKICAgIGZhSGFja2VycmFuayA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJoYWNrZXJyYW5rIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1ZjciLCAiTTQ3Ny45IDEyOEM0NjMuNCAxMDMgMjg1LjUgMCAyNTYuNSAwcy0yMDYuOSAxMDIuOC0yMjEuMyAxMjgtMTQuNSAyMzAuOCAwIDI1NiAxOTIuNCAxMjggMjIxLjMgMTI4IDIwNi44LTEwMi45IDIyMS4zLTEyOCAxNC41LTIzMSAwLTI1NnpNMzE2LjUgNDE0LjJjLTQgMC00MC45LTM1LjgtMzgtMzguNyAuOS0uOSA2LjMtMS41IDE3LjUtMS44IDAtMjYuMiAuNi02OC42IC45LTg2LjMgMC0yLS40LTMuNC0uNC01LjhsLTc5LjkgMGMwIDcuMS0uNSAzNi4yIDEuNCA3Mi45IC4yIDQuNS0xLjYgNi01LjcgNS45LTEwLjEgMC0yMC4zLS4xLTMwLjQtLjEtNC4xIDAtNS45LTEuNS01LjctNi4xIC45LTMzLjQgMy04NC0uMi0yMTIuN2wwLTMuMmMtOS43LS40LTE2LjQtMS0xNy4zLTEuOC0yLjktMi45IDM0LjUtMzguNyAzOC41LTM4LjdzNDEuMiAzNS44IDM4LjMgMzguN2MtLjkgLjktNy45IDEuNS0xNi44IDEuOGwwIDMuMmMtMi40IDI1LjgtMiA3OS42LTIuNiAxMDUuNGw4MC4zIDBjMC00LjYgLjQtMzQuNy0xLjItODMuNi0uMS0zLjQgMS01LjIgNC4yLTUuMiAxMS4xLS4xIDIyLjItLjEgMzMuMi0uMSAzLjUgMCA0LjYgMS43IDQuNSA1LjQtMy43IDE5MS4zLS43IDE3Ny45LS43IDIxMC4zIDguOSAuNCAxNi44IDEgMTcuNyAxLjggMi45IDIuOS0zMy42IDM4LjctMzcuNiAzOC43bDAgMHoiXQogICAgfTsKICAgIGZhU2t5YXRsYXMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2t5YXRsYXMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjIxNiIsICJNNjQwIDMyOS4zYzAgNjUuOS01Mi41IDExNC40LTExNy41IDExNC40LTE2NS45IDAtMTk2LjYtMjQ5LjctMzU5LjctMjQ5LjctMTQ2LjkgMC0xNDcuMSAyMTIuMiA1LjYgMjEyLjIgNDIuNSAwIDkwLjktMTcuOCAxMjUuMy00Mi41IDUuNi00LjEgMTYuOS0xNi4zIDIyLjgtMTYuM3MxMC45IDUgMTAuOSAxMC45YzAgNy44LTEzLjEgMTkuMS0xOC43IDI0LjEtNDAuOSAzNS42LTEwMC4zIDYxLjItMTU0LjcgNjEuMi04My40IC4xLTE1NC01OS0xNTQtMTQ0LjlTNjcuNSAxNDkuNiAxNTIuOCAxNDkuNmMxODUuMyAwIDIyMi41IDI0NS45IDM2MS45IDI0NS45IDk5LjkgMCA5NC44LTEzOS43IDMuNC0xMzkuNy0xNy41IDAtMzUgMTEuNi00Ni45IDExLjYtOC40IDAtMTUuOS03LjItMTUuOS0xNS42IDAtMTEuNiA1LjMtMjMuNyA1LjMtMzYuMyAwLTY2LjYtNTAuOS0xMTQuNy0xMTYuOS0xMTQuNy01My4xIDAtODAgMzYuOS04OC44IDM2LjktNi4yIDAtMTEuMi01LTExLjItMTEuMiAwLTUuNiA0LjEtMTAuMyA3LjgtMTQuNCAyNS4zLTI4LjggNjQuNy00My43IDEwMi44LTQzLjcgNzkuNCAwIDEzOS4xIDU4LjQgMTM5LjEgMTM3LjggMCA2LjktLjMgMTMuNy0xLjIgMjAuNiAxMS45LTMuMSAyNC4xLTQuNyAzNS45LTQuNyA2MC43IDAgMTExLjkgNDUuMyAxMTEuOSAxMDcuMnoiXQogICAgfTsKICAgIGZhRGVza3BybyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJkZXNrcHJvIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzOGYiLCAiTTEyMiA0MDYuMmw4NCAwYzIzLjEgMCA0My45LTMuNSA2Mi42LTEwLjcgMTguNy03LjEgMzQuNy0xNy4xIDQ4LTMwLjEgMTMuMy0xMy40IDIzLjYtMjkuMiAzMC43LTQ3LjUgMy45LTkuNiA2LjgtMTkuOCA4LjYtMzAuNmw3My43IDBjLTIuNSAyMS4zLTcuNyA0MS4zLTE1LjUgNjAtMTEuMSAyNy4yLTI2LjkgNTAuOC00Ny4zIDcwLjktMjAgMTkuNi00NC4yIDM0LjgtNzIuNiA0NS40cy02MCAxNi05NC43IDE2bC0xNDkuOCAuMiAwLTE5Mi40IDcyLjMtLjIgMCAxMTguOHpNMTk5LjQgMzJjMzQuNyAwIDY2LjIgNS40IDk0LjcgMTYgMjguNSAxMC43IDUyLjkgMjYuMSA3My4zIDQ2LjIgMjAuNCAxOS42IDM2LjIgNDMuMiA0Ny4zIDcwLjkgNy41IDE4LjMgMTIuNCAzOC4xIDE0LjkgNTkuM2wtNzMuNy0uMWMtMS45LTEwLjUtNC43LTIwLjUtOC42LTI5LjktNy4xLTE4LjctMTcuMy0zNC41LTMwLjctNDcuNS0xMy4zLTEzLjQtMjkuMy0yMy42LTQ4LTMwLjgtMTguNi03LjEtMzkuNS0xMC43LTYyLjctMTAuN2wtODQgMCAwIDExOC44LTcyLjIgLjIgMC0xOTIuMyAxNDkuNy0uMXoiXQogICAgfTsKICAgIGZhUmVzb2x2aW5nID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInJlc29sdmluZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmM2U3IiwgIk0yODkuMiAyNzguMmM0Ni0xMy4zIDQ5LjYtMjMuNSA0NC00My40TDMyMiAxOTUuNWMtNi4xLTIwLjktMTguNC0yOC4xLTcxLjEtMTIuOGwtMTg4LjIgNTQuMSAyOC42IDk4LjYgMTk3LjktNTcuMnpNMjU2LjUgOEMxMzkuNCA4IDQxLjIgODguNyAxNS4yIDE5Ny41bDIyMS45LTYzLjljMzQuOC0xMC4yIDU0LjItMTEuNyA3OS4zLTguMiAzNi4zIDYuMSA1Mi43IDI1IDYxLjQgNTUuMmwxMC43IDM3LjhjOC4yIDI4LjEgMSA1MC42LTIzLjUgNzMuNi0xOS40IDE3LjQtMzEuMiAyNC41LTYxLjQgMzMuMmwtOTIuNiAyNi42IDIyMC40IDI3LjEgOS43IDM0LjItNDguMSAxMy4zLTI4Ni44LTM3LjMgMjMgODAuMkMxNjYgNDkxLjMgMjA5LjUgNTA0IDI1NS41IDUwNCAzOTIuNSA1MDQgNTA0IDM5Mi42IDUwNCAyNTUuNyA1MDUgMTE5LjQgMzkzLjUgOCAyNTYuNSA4ek00Ni4zIDM4OC42TDggMjU2LjhjMCA0OC41IDE0LjMgOTMuNCAzOC4zIDEzMS44eiJdCiAgICB9OwogICAgZmFCbGFja2JlcnJ5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImJsYWNrYmVycnkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjM3YiIsICJNMTY2IDExNi45YzAgMjMuNC0xNi40IDQ5LjEtNzIuNSA0OS4xbC03MC4xIDAgMjEtODguOCA2Ny44IDBjNDIuMSAwIDUzLjggMjMuMyA1My44IDM5Ljd6TTI5Mi4yIDc3LjJsLTY3LjggMC0xOC43IDg4LjggNzAuMSAwYzUzLjggMCA3MC4xLTI1LjcgNzAuMS00OS4xIC4xLTE2LjQtMTEuNi0zOS43LTUzLjctMzkuN3pNODguOCAyMDguMWwtNjcuOCAwLTIxIDg4LjggNzAuMSAwYzU2LjEgMCA3Mi41LTIzLjQgNzIuNS00OS4xIDAtMTYuMy0xMS43LTM5LjctNTMuOC0zOS43em0xODAuMSAwbC02Ny44IDAtMTguNyA4OC44IDcwLjEgMGM1My44IDAgNzAuMS0yMy40IDcwLjEtNDkuMSAwLTE2LjMtMTEuNy0zOS43LTUzLjctMzkuN3ptMTg5LjMtNTMuOGwtNjcuOCAwLTE4LjcgODguOCA3MC4xIDBjNTMuOCAwIDcwLjEtMjMuNCA3MC4xLTQ5LjEgLjEtMTYuMy0xMS42LTM5LjctNTMuNy0zOS43em0tMjggMTM3LjlsLTY3LjggMC0xOC43IDg4LjggNzAuMSAwYzU2LjEgMCA3MC4xLTIzLjQgNzAuMS00OS4xIDAtMTYuMy0xMS42LTM5LjctNTMuNy0zOS43ek0yNDAuOCAzNDZsLTY3LjggMC0xOC43IDg4LjggNzAuMSAwYzU2LjEgMCA3MC4xLTI1LjcgNzAuMS00OS4xIC4xLTE2LjMtMTEuNi0zOS43LTUzLjctMzkuN3oiXQogICAgfTsKICAgIGZhU3RyaXBlUyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzdHJpcGUtcyIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmNDJhIiwgIk0xNTUuNiAxNTQuNmMwLTIyLjMgMTguNi0zMC45IDQ4LjQtMzAuOSA0My40IDAgOTguNSAxMy4zIDE0MS45IDM2LjdsMC0xMzQuM2MtNDcuMy0xOC45LTk0LjUtMjYuMS0xNDEuOC0yNi4xLTExNS43IDAtMTkyLjggNjAuNC0xOTIuOCAxNjEuNCAwIDE1Ny45IDIxNi44IDEzMi4zIDIxNi44IDIwMC40IDAgMjYuNC0yMi45IDM0LjktNTQuNyAzNC45LTQ3LjIgMC0xMDguMi0xOS41LTE1Ni4xLTQ1LjVsMCAxMjguNWM0OS4zIDIxLjMgMTAyLjMgMzIuMyAxNTYgMzIuNCAxMTguNiAwIDIwMC4zLTUxIDIwMC4zLTE1My42IDAtMTcwLjItMjE4LTEzOS43LTIxOC0yMDMuOXoiXQogICAgfTsKICAgIGZhU3F1YXJlQmVoYW5jZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtYmVoYW5jZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJiZWhhbmNlLXNxdWFyZSJdLCAiZjFiNSIsICJNMTU1LjMgMzE4LjRjMTcuMiAwIDMxLjItNi4xIDMxLjItMjUuNCAwLTE5LjctMTEuNy0yNy40LTMwLjMtMjcuNWwtNDYgMCAwIDUyLjkgNDUuMSAwem0tNS40LTEyOS42bC0zOS42IDAgMCA0NC44IDQyLjcgMGMxNS4xIDAgMjUuOC02LjYgMjUuOC0yMi45IDAtMTcuNy0xMy43LTIxLjktMjguOS0yMS45em0xMjkuNSA3NC44bDYyLjIgMGMtMS43LTE4LjUtMTEuMy0yOS43LTMwLjUtMjkuNy0xOC4zIDAtMzAuNSAxMS40LTMxLjcgMjkuN3pNMzg0IDMyTDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjR6TTM0OS41IDE4NWwtNzcuOCAwIDAtMTguOSA3Ny44IDAgMCAxOC45ek0xOTMuNyAyNDMuN2MyMy42IDYuNyAzNSAyNy41IDM1IDUxLjYgMCAzOS0zMi43IDU1LjctNjcuNiA1NS45bC05My4xIDAgMC0xOTIgOTAuNSAwYzMyLjkgMCA2MS40IDkuMyA2MS40IDQ3LjUgMCAxOS4zLTkgMjguOC0yNi4yIDM3em0xMTguNy0zOC42YzQzLjUgMCA2Ny42IDM0LjMgNjcuNiA3NS40IDAgMS42LS4xIDMuMy0uMiA1IDAgLjgtLjEgMS41LS4xIDIuMmwtMTAwLjIgMGMwIDIyLjIgMTEuNyAzNS4zIDM0LjEgMzUuMyAxMS42IDAgMjYuNS02LjIgMzAuMi0xOC4xbDMzLjcgMGMtMTAuNCAzMS45LTMxLjkgNDYuOC02NS4xIDQ2LjgtNDMuOCAwLTcxLjEtMjkuNy03MS4xLTczIDAtNDEuOCAyOC43LTczLjYgNzEuMS03My42eiJdCiAgICB9OwogICAgZmFCZWhhbmNlU3F1YXJlID0gZmFTcXVhcmVCZWhhbmNlOwogICAgZmFTZXJ2aWNlc3RhY2sgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2VydmljZXN0YWNrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzZWMiLCAiTTk2IDIxNmM4MS43IDEwLjIgMjczLjcgMTAyLjMgMzA0IDIzMkw4IDQ0OGM5OS41LTguMSAxODQuNS0xMzcgODgtMjMyek0xMjggNjRjMzIuMyAzNS42IDQ3LjcgODMuOSA0Ni40IDEzMy42IDgyLjkgMzMuNyAyMDcuMyAxMjMuNyAyMzMuNiAyNTAuNGw5NiAwQzQ2My4zIDIzMS45IDIzMC44IDc5LjUgMTI4IDY0eiJdCiAgICB9OwogICAgZmFSb2NrZXRjaGF0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInJvY2tldGNoYXQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjNlOCIsICJNMjg0LjUgMjI0LjhjLTYuNyAwLTEzLjMgMi4xLTE4LjkgNS44cy05LjkgOS4xLTEyLjUgMTUuNC0zLjIgMTMuMS0xLjkgMTkuNyA0LjYgMTIuNyA5LjQgMTcuNCAxMC45IDggMTcuNSA5LjMgMTMuNSAuNiAxOS43LTIgMTEuNS03IDE1LjMtMTIuNiA1LjctMTIuMiA1LjctMTguOWMwLTkuMS0zLjctMTcuOC0xMC4xLTI0LjJzLTE1LjEtMTAtMjQuMi05Ljl6bS0xMTAuNCAwYy02LjcgMC0xMy4zIDIuMS0xOC45IDUuOHMtOS45IDkuMS0xMi41IDE1LjQtMy4yIDEzLjEtMS45IDE5LjcgNC42IDEyLjcgOS40IDE3LjQgMTAuOSA4IDE3LjUgOS4zIDEzLjUgLjYgMTkuNy0yIDExLjUtNyAxNS4zLTEyLjYgNS43LTEyLjIgNS43LTE4LjljMC05LjEtMy43LTE3LjgtMTAuMS0yNC4ycy0xNS4xLTEwLTI0LjItMTBsMCAwem0yMjAuOSAwYTM0LjEgMzQuMSAwIDEgMCAuNCA2OC4yIDM0LjEgMzQuMSAwIDEgMCAtLjQtNjguMnptMTUzLjgtNTUuM2MtMTUuNS0yNC4yLTM3LjMtNDUuNi02NC43LTYzLjYtNTIuOS0zNC44LTEyMi40LTU0LTE5NS43LTU0LTI0LjIgMC00OC4zIDIuMS03MiA2LjQtMTQuOS0xNC4zLTMxLjUtMjYuNi00OS41LTM2LjYtNjYuOC0zMy4zLTEyNS42LTIwLjktMTU1LjMtMTAuMi0yLjMgLjgtNC4zIDIuMS01LjkgMy45cy0yLjcgMy45LTMuMyA2LjItLjUgNC43IC4xIDcuMSAxLjggNC40IDMuNSA2LjFDMjcgNTYuNSA2MS42IDk5LjMgNTMuMSAxMzguMyAyMCAxNzIuMiAyIDIxMyAyIDI1NS42IDIgMjk5IDIwIDMzOS44IDUzLjEgMzczLjcgNjEuNiA0MTIuNyAyNyA0NTUuNiA2IDQ3Ny4yIDQuMyA0NzkgMy4yIDQ4MS4xIDIuNSA0ODMuNHMtLjcgNC43LS4xIDcgMS43IDQuNSAzLjMgNi4yIDMuNiAzLjEgNS45IDMuOWMyOS43IDEwLjcgODguNSAyMy4xIDE1NS4zLTEwLjIgMTgtMTAgMzQuNy0yMi4zIDQ5LjUtMzYuNiAyMy44IDQuMyA0Ny45IDYuNCA3MiA2LjQgNzMuMyAwIDE0Mi44LTE5LjIgMTk1LjctNTQgMjcuNC0xOCA0OS4xLTM5LjQgNjQuNy02My42IDE3LjMtMjYuOSAyNi4xLTU1LjkgMjYuMS04Ni4xIDAtMzEtOC44LTYwLTI2LjEtODYuOWwwIDB6TTI4NS40IDQwOS45Yy0zMC4yIC4xLTYwLjMtMy44LTg5LjQtMTEuNWwtMjAuMSAxOS40Yy0xMS4yIDEwLjctMjMuNiAyMC0zNy4xIDI3LjYtMTYuNCA4LjItMzQuMiAxMy4zLTUyLjUgMTQuOSAxLTEuOCAxLjktMy42IDIuOC01LjQgMjAuMi0zNy4xIDI1LjYtNzAuNSAxNi4zLTEwMC4xLTMzLTI2LTUyLjgtNTkuMi01Mi44LTk1LjQgMC04My4xIDEwNC4zLTE1MC41IDIzMi44LTE1MC41czIzMi45IDY3LjQgMjMyLjkgMTUwLjVjMCA4My4xLTEwNC4zIDE1MC41LTIzMi45IDE1MC41eiJdCiAgICB9OwogICAgZmFSZWJlbCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJyZWJlbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMWQwIiwgIk0yNTYuOSA1MDRjLTEzOS4zIDAtMjQ3LjUtMTE2LjItMjQzLjMtMjU0LjEgMi44LTc5LjIgNDMuMi0xNTIuMiAxMTYuNS0yMDAuNCAuMyAwIDEuOS0uNiAxLjEgLjgtNS44IDUuNS0xMTEuMyAxMjkuOC0xNC4xIDIyNi40IDQ5LjggNDkuNSA5MCAyLjUgOTAgMi41IDM4LjUtNTAuMS0uNi0xMjUuOS0uNi0xMjUuOS0xMC0yNC45LTQ1LjctNDAuMS00NS43LTQwLjFsMjguOC0zMS44YzI0LjQgMTAuNSA0My4yIDM4LjcgNDMuMiAzOC43IC44LTI5LjYtMjEuOS02MS40LTIxLjktNjEuNEwyNTUuNSA4IDI5OS44IDU4LjFjLTIwLjUgMjguOC0yMS45IDYyLjYtMjEuOSA2Mi42IDEzLjgtMjMgNDMuNS0zOS4zIDQzLjUtMzkuM2wyOC41IDMxLjhjLTI3LjQgOC45LTQ1LjQgMzkuOS00NS40IDM5LjktMTUuOCAyOC41LTI3LjEgODkuNCAuNiAxMjcuMyAzMi40IDQ0LjYgODcuNy0yLjggODcuNy0yLjggMTAyLjctOTEuOS0xMC41LTIyNS0xMC41LTIyNS02LjEtNS41IC44LTIuOCAuOC0yLjggNTAuMSAzNi41IDExNC42IDg0LjQgMTE2LjIgMjA0LjggMiAxNDUuNi05OS45IDI0OS40LTI0Mi40IDI0OS40eiJdCiAgICB9OwogICAgZmFTcXVhcmVXZWJBd2Vzb21lID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS13ZWItYXdlc29tZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNjgzIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyek0yMzUgMTc3LjZsNTMgNDYuNCA1Mi4yLTEwLjRjLTIuNi0zLjktNC4yLTguNS00LjItMTMuNiAwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0YzAgMTMtMTAuMyAyMy42LTIzLjIgMjRMMzA0LjUgMzQ5LjFjLTUuMiAxMS41LTE2LjYgMTguOS0yOS4yIDE4LjlsLTEwMi42IDBjLTEyLjYgMC0yNC03LjQtMjkuMi0xOC45TDg3LjIgMjI0Yy0xMi45LS40LTIzLjItMTEtMjMuMi0yNCAwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0YzAgNS0xLjUgOS43LTQuMiAxMy42TDE2MCAyMjQgMjEzLjEgMTc3LjZjLTguOS00LjEtMTUtMTMuMS0xNS0yMy42IDAtMTQuNCAxMS42LTI2IDI2LTI2czI2IDExLjYgMjYgMjZjMCAxMC41LTYuMiAxOS41LTE1LjEgMjMuNnoiXQogICAgfTsKICAgIGZhTGlua3RyZWUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibGlua3RyZWUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTdkOCIsICJNMTYgMTczLjRsMTI1LjggMC04OS40LTg1LjQgNDkuNS01MSA4NS4yIDg3LjggMC0xMjQuOCA3My45IDAgMCAxMjQuOCA4NS4yLTg3LjYgNDkuNCA1MC44LTg5LjQgODUuMiAxMjUuNyAwIDAgNzAuNS0xMjYuNCAwIDkwIDg3LjYtNDkuMyA0OS44LTEyMi4yLTEyMy0xMjIuMiAxMjMtNDkuNS00OS42IDkwLTg3LjYtMTI2LjQgMCAwLTcwLjV6TTE4Ni45IDM0NC44bDczLjkgMCAwIDE2Ny4yLTczLjkgMCAwLTE2Ny4yeiJdCiAgICB9OwogICAgZmFTaW1wbHlidWlsdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzaW1wbHlidWlsdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjE1IiwgIk00ODEuNiA2NGwtMTA2IDBDMzYxLjEgNjQgMzQ5IDc1LjggMzQ5IDkwLjNsMCAzOS42LTE4NS4zIDAgMC0zOS42YzAtMTQuNS0xMi0yNi4zLTI2LjYtMjYuM2wtMTA2IDBDMTYuNSA2NCA0LjcgNzUuOCA0LjcgOTAuM2wwIDMzMS40YzAgMTQuNSAxMS44IDI2LjMgMjYuNiAyNi4zbDQ1MC40IDBjMTQuOCAwIDI2LjYtMTEuOCAyNi42LTI2LjNsMC0zMzEuNGMtLjItMTQuNS0xMi0yNi4zLTI2LjctMjYuM3pNMTUwLjUgMjIyLjdhNjYuNSA2Ni41IDAgMSAxIC0uMyAxMzMuMSA2Ni41IDY2LjUgMCAxIDEgLjMtMTMzLjF6bTIxMS45IC4xYTY2LjUgNjYuNSAwIDEgMSAuMyAxMzIuOSA2Ni41IDY2LjUgMCAxIDEgLS4zLTEzMi45eiJdCiAgICB9OwogICAgZmFTdHViYmVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInN0dWJiZXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTVjNyIsICJNMTM2LjUgMjk0LjJsNTguOCAyMi45YzkuMS0zNi44IDI1LjQtNjEuMSA1NS02MS4xIDQ5LjQgMCA3MS40IDYzLjYgMTQyLjQgNjMuNiAxNS42IDAgMzUuOS0yLjggNTUuMy0xMy4zbDAgNjEuN2MwIDYxLjgtNTAuNCAxMTItMTEyLjMgMTEyTDAgNDgwIDQxLjggNDI0IDAgMzY4IDQxLjcgMzEyIDAgMjU2LjEgNDEuOCAyMDAuMSAwIDE0NC4xIDQxLjggODggMCAzMiAzMzUuNyAzMkMzOTcuNiAzMiA0NDggODIuMyA0NDggMTQ0LjFsMCA1MS4zYy05LjIgMzYuMy0yNS45IDYwLjYtNTUgNjAuNi00OS42IDAtNzEuNi02My41LTE0Mi40LTYzLjUtMzUuOSAwLTk1LjIgMTQuNi0xMTQuMSAxMDEuNmwwIC4xeiJdCiAgICB9OwogICAgZmFBcHBlciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhcHBlciIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmMzcxIiwgIk00Mi4xIDIzOS4xYzIyLjIgMCAyOSAyLjggMzMuNSAxNC42bC44IDAgMC0yMi45YzAtMTEuMy00LjgtMTUuNC0xNy45LTE1LjQtMTEuMyAwLTE0LjQgMi41LTE1LjEgMTIuOGwtMzguNiAwYy4zLTEzLjkgMS41LTE5LjEgNS44LTI0LjQgNy4zLTguOCAxOC45LTExLjggNDYuMS0xMS44IDMzIDAgNDcuMSA1IDUzLjkgMTguOSAyIDQuMyA0IDE1LjYgNCAyMy43bDAgNzYuMy0zOC4zIDAgMS4zLTE5LjEtMSAwYy01LjMgMTUuNi0xMy42IDIwLjQtMzUuNSAyMC40LTMwLjMgMC00MS4xLTEwLjEtNDEuMS0zNy4zIDAtMjUuMiAxMi4zLTM1LjggNDIuMS0zNS44em0xNy4xIDQ4LjFjMTMuMSAwIDE2LjktMyAxNi45LTEzLjQgMC05LjEtNC4zLTExLjYtMTkuNi0xMS42LTEzLjEgMC0xNy45IDMtMTcuOSAxMi4xLS4xIDEwLjQgMy43IDEyLjkgMjAuNiAxMi45ek0xMzcgMTkyLjNsMzguMyAwLTEuNSAyMC42IC44IDBjOS4xLTE3LjEgMTUuOS0yMC45IDM3LjUtMjAuOSAxNC40IDAgMjQuNyAzIDMxLjUgOS4xIDkuOCA4LjYgMTIuOCAyMC40IDEyLjggNDguMSAwIDMwLTMgNDMuMS0xMi4xIDUyLjktNi44IDcuMy0xNi40IDEwLjEtMzMuMiAxMC4xLTIwLjQgMC0yOS4yLTUuNS0zMy44LTIxLjJsLS44IDAgMCA3MC4zLTM5LjUgMCAwLTE2OXpNMjE3LjkgMjUzYzAtMjcuNS0zLjMtMzIuNS0yMC43LTMyLjUtMTYuOSAwLTIwLjcgNS0yMC43IDI4LjcgMCAyOCAzLjUgMzMuNSAyMS4yIDMzLjUgMTYuNCAwIDIwLjItNS42IDIwLjItMjkuN3ptNTcuOS02MC43bDM4LjMgMC0xLjUgMjAuNiAuOCAwYzkuMS0xNy4xIDE1LjktMjAuOSAzNy41LTIwLjkgMTQuNCAwIDI0LjcgMyAzMS41IDkuMSA5LjggOC42IDEyLjggMjAuNCAxMi44IDQ4LjEgMCAzMC0zIDQzLjEtMTIuMSA1Mi45LTYuOCA3LjMtMTYuNCAxMC4xLTMzLjMgMTAuMS0yMC40IDAtMjkuMi01LjUtMzMuOC0yMS4ybC0uOCAwIDAgNzAuMy0zOS41IDAgMC0xNjkgLjEgMHpNMzU2LjcgMjUzYzAtMjcuNS0zLjMtMzIuNS0yMC43LTMyLjUtMTYuOSAwLTIwLjcgNS0yMC43IDI4LjcgMCAyOCAzLjUgMzMuNSAyMS4yIDMzLjUgMTYuNCAwIDIwLjItNS42IDIwLjItMjkuN3ptNTMuOC0zLjhjMC0yNS40IDMuMy0zNy44IDEyLjMtNDUuOCA4LjgtOC4xIDIyLjItMTEuMyA0NS4xLTExLjMgNDIuOCAwIDU1LjcgMTIuOCA1NS43IDU1LjdsMCAxMS4xLTc1LjMgMGMtLjMgMi0uMyA0LS4zIDQuOCAwIDE2LjkgNC41IDIxLjkgMjAuMSAyMS45IDEzLjkgMCAxNy45LTMgMTcuOS0xMy45bDM3LjUgMCAwIDIuM2MwIDkuOC0yLjUgMTguOS02LjggMjQuNy03LjMgOS44LTE5LjYgMTMuNi00NC4zIDEzLjYtMjcuNSAwLTQxLjYtMy4zLTUwLjYtMTIuMy04LjUtOC41LTExLjMtMjEuMy0xMS4zLTUwLjh6bTc2LjQtMTEuNmMtLjMtMS44LS4zLTMuMy0uMy0zLjggMC0xMi4zLTMuMy0xNC42LTE5LjYtMTQuNi0xNC40IDAtMTcuMSAzLTE4LjEgMTUuMWwtLjMgMy4zIDM4LjMgMHptNTUuNi00NS4zbDM4LjMgMC0xLjggMTkuOSAuNyAwYzYuOC0xNC45IDE0LjQtMjAuMiAyOS43LTIwLjIgMTAuOCAwIDE5LjEgMy4zIDIzLjQgOS4zIDUuMyA3LjMgNi44IDE0LjQgNi44IDM0IDAgMS41IDAgNSAuMiA5LjNsLTM1IDBjLjMtMS44IC4zLTMuMyAuMy00IDAtMTUuNC0yLTE5LjQtMTAuMy0xOS40LTYuMyAwLTEwLjggMy4zLTEzLjEgOS4zLTEgMy0xIDQuMy0xIDEyLjNsMCA2OC0zOC4zIDAgMC0xMTguNSAuMSAweiJdCiAgICB9OwogICAgZmFHb29nbGVTY2hvbGFyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdvb2dsZS1zY2hvbGFyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU2M2IiLCAiTTM5MC45IDI5OC41czAgLjEgLjEgLjFjOS4yIDE5LjQgMTQuNCA0MS4xIDE0LjQgNjQtLjEgODIuNS02Ni45IDE0OS40LTE0OS40IDE0OS40UzEwNi43IDQ0NS4xIDEwNi43IDM2Mi43YzAtMjIuOSA1LjItNDQuNiAxNC40LTY0IDEuNy0zLjYgMy42LTcuMiA1LjYtMTAuNyA0LjQtNy42IDkuNC0xNC43IDE1LTIxLjMgMjcuNC0zMi42IDY4LjUtNTMuMyAxMTQuNC01My4zIDMzLjYgMCA2NC42IDExLjEgODkuNiAyOS45IDkuMSA2LjkgMTcuNCAxNC43IDI0LjggMjMuNSA1LjYgNi42IDEwLjYgMTMuOCAxNSAyMS4zIDIgMy40IDMuOCA3IDUuNSAxMC41bC0uMS0uMXptMjYuNC0xOC44Yy0zMC4xLTU4LjQtOTEtOTguNC0xNjEuMy05OC40cy0xMzEuMiA0MC0xNjEuMyA5OC40bC05NC43LTc3IDI1Ni0yMDIuNyAyNTYgMjAyLjctOTQuNyA3Ny4xIDAtLjF6Il0KICAgIH07CiAgICBmYVlhcm4gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAieWFybiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmN2UzIiwgIk00MDEuOSAzNDUuMmMtMzkgOS4zLTQ4LjQgMzIuMS0xMDQgNDcuNCAwIDAtMi43IDQtMTAuNCA1LjgtMTMuNCAzLjMtNjMuOSA2LTY4LjUgNi4xLTEyLjQgLjEtMTkuOS0zLjItMjItOC4yLTYuNC0xNS4zIDkuMi0yMiA5LjItMjItOC4xLTUtOS05LjktOS44LTguMS0yLjQgNS44LTMuNiAyMC4xLTEwLjEgMjYuNS04LjggOC45LTI1LjUgNS45LTM1LjMgLjgtMTAuOC01LjcgLjgtMTkuMiAuOC0xOS4ycy01LjggMy40LTEwLjUtMy42Yy02LTkuMy0xNy4xLTM3LjMgMTEuNS02Mi0xLjMtMTAuMS00LjYtNTMuNyA0MC42LTg1LjYgMCAwLTIwLjYtMjIuOC0xMi45LTQzLjMgNS0xMy40IDctMTMuMyA4LjYtMTMuOSA1LjctMi4yIDExLjMtNC42IDE1LjQtOS4xIDIwLjYtMjIuMiA0Ni44LTE4IDQ2LjgtMThzMTIuNC0zNy44IDIzLjktMzAuNGMzLjUgMi4zIDE2LjMgMzAuNiAxNi4zIDMwLjZzMTMuNi03LjkgMTUuMS01YzguMiAxNiA5LjIgNDYuNSA1LjYgNjUuMS02LjEgMzAuNi0yMS40IDQ3LjEtMjcuNiA1Ny41LTEuNCAyLjQgMTYuNSAxMCAyNy44IDQxLjMgMTAuNCAyOC42IDEuMSA1Mi43IDIuOCA1NS4zIC44IDEuNCAxMy43IC44IDM2LjQtMTMuMiAxMi44LTcuOSAyOC4xLTE2LjkgNDUuNC0xNyAxNi43LS41IDE3LjYgMTkuMiA0LjkgMjIuMnpNOCAyNTZhMjQ4IDI0OCAwIDEgMSA0OTYgMCAyNDggMjQ4IDAgMSAxIC00OTYgMHptNDE2LjcgNzUuMmMtMS43LTEzLjYtMTMuMi0yMy0yOC0yMi44LTIyIC4zLTQwLjUgMTEuNy01Mi44IDE5LjItNC44IDMtOC45IDUuMi0xMi40IDYuOCAzLjEtNDQuNS0yMi41LTczLjEtMjguNy03OS40IDcuOC0xMS4zIDE4LjQtMjcuOCAyMy40LTUzLjIgNC4zLTIxLjcgMy01NS41LTYuOS03NC41LTEuNi0zLjEtNy40LTExLjItMjEtNy40LTkuNy0yMC0xMy0yMi4xLTE1LjYtMjMuOC0xLjEtLjctMjMuNi0xNi40LTQxLjQgMjgtMTIuMiAuOS0zMS4zIDUuMy00Ny41IDIyLjgtMiAyLjItNS45IDMuOC0xMC4xIDUuNGwuMSAwYy04LjQgMy0xMi4zIDkuOS0xNi45IDIyLjMtNi41IDE3LjQgLjIgMzQuNiA2LjggNDUuNy0xNy44IDE1LjktMzcgMzkuOC0zNS43IDgyLjUtMzQgMzYtMTEuOCA3My01LjYgNzkuNi0xLjYgMTEuMSAzLjcgMTkuNCAxMiAyMy44IDEyLjYgNi43IDMwLjMgOS42IDQzLjkgMi44IDQuOSA1LjIgMTMuOCAxMC4xIDMwIDEwLjEgNi44IDAgNTgtMi45IDcyLjYtNi41IDYuOC0xLjYgMTEuNS00LjUgMTQuNi03LjEgOS44LTMuMSAzNi44LTEyLjMgNjIuMi0yOC43IDE4LTExLjcgMjQuMi0xNC4yIDM3LjYtMTcuNCAxMi45LTMuMiAyMS0xNS4xIDE5LjQtMjguMnoiXQogICAgfTsKICAgIGZhU3RhY2tPdmVyZmxvdyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzdGFjay1vdmVyZmxvdyIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMTZjIiwgIk0yOTEgMzExbC0xOTUuNy00MS4zLTguMiAzOS4zIDE5NS43IDQxIDguMi0zOXptNTEtODdMMTg4LjUgOTUuNyAxNjMgMTI2LjUgMzE2LjUgMjU0LjggMzQyIDIyNHptLTMxLjIgMzkuN0wxMjkuNSAxNzkgMTEyLjggMjE1LjUgMjk0IDMwMCAzMTAuOCAyNjMuN3pNMjYyLjMgMzJsLTMyIDI0IDExOS4zIDE2MC4zIDMyLTI0LTExOS4zLTE2MC4zem0yMC41IDMyOGwtMjAwIDAgMCAzOS43IDIwMCAwIDAtMzkuN3ptMzkuNyA4MGwtMjc5LjUgMCAwLTEyMC00MCAwIDAgMTYwIDM1OS41IDAgMC0xNjAtNDAgMCAwIDEyMHoiXQogICAgfTsKICAgIGZhQmx1ZXRvb3RoID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImJsdWV0b290aCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMjkzIiwgIk0yNjAuNiAxNzEuMWwtNDIuOSA0Mi45LS4zLTg2IDQzLjIgNDMuMXpNMjE3LjQgMzkwLjlsNDMuMS00My4xLTQyLjktNDIuOS0uMiA4NnpNMzg0IDI1OS40QzM4NCA0NjUgMzEyLjEgNTEyIDE5OC45IDUxMlMwIDQ2NSAwIDI1OS40IDgzLjQgMCAxOTYuNiAwIDM4NCA1My45IDM4NCAyNTkuNHptLTE1OC41IDBsNzkuNC04OC42LTEyNS4xLTEzNC4zIDAgMTc2LjktNzMuOC03My44LTI3IDI2LjkgOTIuNyA5My05Mi43IDkzIDI2LjkgMjYuOSA3My44LTczLjggMi4zIDE3MCAxMjcuNC0xMjcuNS04My45LTg4Ljd6Il0KICAgIH07CiAgICBmYUNyZWF0aXZlQ29tbW9uc05jSnAgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY3JlYXRpdmUtY29tbW9ucy1uYy1qcCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNGVhIiwgIk0yNTUuNyA4QzExMS42IDggOCAxMjQuOCA4IDI1NiA4IDM5Mi40IDExOS44IDUwNCAyNTUuNyA1MDQgMzg1LjkgNTA0IDUwNCA0MDMuMiA1MDQgMjU2IDUwNCAxMTcuMiAzOTYuNSA4IDI1NS43IDh6bS42IDQ1MC43Yy0xMTIgMC0yMDMuNi05Mi41LTIwMy42LTIwMi43IDAtMjEuMSAzLTQxLjIgOS02MC4zbDEyNyA1Ni41LTI3LjkgMCAwIDM4LjYgNTguMSAwIDUuNyAxMS44IDAgMTguNy02My44IDAgMCAzOC43IDYzLjggMCAwIDU2IDYxLjcgMCAwLTU2IDY0LjIgMCAwLTM1LjcgODEgMzYuMWMtMS41IDIuMi01Ny4xIDk4LjMtMTc1LjIgOTguM3ptODcuNi0xMzcuM2wtNTcuNiAwIDAtMTguNyAyLjktNS42IDU0LjcgMjQuM3ptNi41LTUxLjRsMC0xNy44LTM4LjYgMCA2My0xMTYtNjUuOCAwLTQzLjQgOTYtMjMtMTAuMi0zOS42LTg1LjctNjUuOCAwIDI3LjMgNTEtODEuOS0zNi41YzI3LjgtNDQuMSA4Mi42LTk4LjEgMTczLjctOTguMSAxMTIuOCAwIDIwMyA5MCAyMDMgMjAzLjQgMCAyMS0yLjcgNDAuNi03LjkgNTlMMzUwLjQgMjcweiJdCiAgICB9OwogICAgZmFSZWRkaXQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicmVkZGl0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxYTEiLCAiTTAgMjU2QzAgMTE0LjYgMTE0LjYgMCAyNTYgMFM1MTIgMTE0LjYgNTEyIDI1NiAzOTcuNCA1MTIgMjU2IDUxMkwzNy4xIDUxMmMtMTMuNyAwLTIwLjUtMTYuNS0xMC45LTI2LjJMNzUgNDM3QzI4LjcgMzkwLjcgMCAzMjYuNyAwIDI1NnpNMzQ5LjYgMTUzLjZjMjMuNiAwIDQyLjctMTkuMSA0Mi43LTQyLjdzLTE5LjEtNDIuNy00Mi43LTQyLjdjLTIwLjYgMC0zNy44IDE0LjYtNDEuOCAzNC0zNC41IDMuNy02MS40IDMzLTYxLjQgNjguNGwwIC4yYy0zNy41IDEuNi03MS44IDEyLjMtOTkgMjkuMS0xMC4xLTcuOC0yMi44LTEyLjUtMzYuNS0xMi41LTMzIDAtNTkuOCAyNi44LTU5LjggNTkuOCAwIDI0IDE0LjEgNDQuNiAzNC40IDU0LjEgMiA2OS40IDc3LjYgMTI1LjIgMTcwLjYgMTI1LjJzMTY4LjctNTUuOSAxNzAuNi0xMjUuM2MyMC4yLTkuNiAzNC4xLTMwLjIgMzQuMS01NCAwLTMzLTI2LjgtNTkuOC01OS44LTU5LjgtMTMuNyAwLTI2LjMgNC42LTM2LjQgMTIuNC0yNy40LTE3LTYyLjEtMjcuNy0xMDAtMjkuMWwwLS4yYzAtMjUuNCAxOC45LTQ2LjUgNDMuNC00OS45IDQuNCAxOC44IDIxLjMgMzIuOCA0MS41IDMyLjhsLjEgLjJ6TTE3Ny4xIDI0Ni45YzE2LjcgMCAyOS41IDE3LjYgMjguNSAzOS4zcy0xMy41IDI5LjYtMzAuMyAyOS42LTMxLjQtOC44LTMwLjQtMzAuNSAxNS40LTM4LjMgMzIuMS0zOC4zbC4xLS4xem0xOTAuMSAzOC4zYzEgMjEuNy0xMy43IDMwLjUtMzAuNCAzMC41cy0yOS4zLTcuOS0zMC4zLTI5LjYgMTEuOC0zOS4zIDI4LjUtMzkuMyAzMS4yIDE2LjYgMzIuMSAzOC4zbC4xIC4xem0tNDguMSA1Ni43Yy0xMC4zIDI0LjYtMzQuNiA0MS45LTYzIDQxLjlzLTUyLjctMTcuMy02My00MS45Yy0xLjItMi45IC44LTYuMiAzLjktNi41IDE4LjQtMS45IDM4LjMtMi45IDU5LjEtMi45czQwLjcgMSA1OS4xIDIuOWMzLjEgLjMgNS4xIDMuNiAzLjkgNi41eiJdCiAgICB9OwogICAgZmFDb25uZWN0ZGV2ZWxvcCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjb25uZWN0ZGV2ZWxvcCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMjBlIiwgIk01NTAuOCAyNDFsLTUwLjEtODYuOGMxLjEtMi4xIDEuOS00LjYgMS45LTcuMiAwLTgtNi43LTE0LjctMTQuNy0xNUw0MzIuNCAzNi4xYy41LTEuNiAxLjEtMy4yIDEuMS00LjggMC04LjYtNy0xNS4zLTE1LjMtMTUuMy00LjggMC04LjggMi4xLTExLjggNS42bC0xMDYuNiAwYy0yLjctMy41LTYuNy01LjYtMTEuNS01LjZzLTguOCAyLjEtMTEuNSA1LjZsLTEwNi4xIDBjLTIuOS0zLjUtNy01LjYtMTEuOC01LjYtOC4zIDAtMTUuMyA2LjctMTUuMyAxNS4zIDAgMS42IC41IDMuNSAxLjEgNC44bC01NiA5Ny4yYy01LjQgMi40LTkuMSA3LjUtOS4xIDEzLjcgMCAuNSAuMyAxLjEgLjMgMS42TDI2LjYgMjQwLjdjLTcuMiAxLjMtMTIuNiA3LjUtMTIuNiAxNSAwIDcuMiA1LjEgMTMuNCAxMi4xIDE1bDU1LjIgOTUuNGMtLjUgMS42LS44IDIuOS0uOCA0LjggMCA3LjIgNS4xIDEzLjQgMTIuMSAxNC43bDUxLjcgODkuN2MtLjUgMS42LTEuMSAzLjUtMS4xIDUuNCAwIDguNiA3IDE1LjMgMTUuMyAxNS4zIDQuOCAwIDguOC0yLjEgMTEuNS01LjRsMTA2LjkgMGMyLjcgMy4yIDcgNS40IDExLjUgNS40czguOC0yLjEgMTEuNS01LjRsMTA3LjEgMGMyLjcgMi45IDYuNyA0LjggMTEgNC44IDguNiAwIDE1LjMtNyAxNS4zLTE1LjMgMC0xLjYtLjMtMi45LS44LTQuM2w1MS43LTkwLjNjNy0xLjMgMTIuMS03LjUgMTIuMS0xNC43IDAtMS42LS4zLTMuMi0uOC00LjhsNTQuOS05NS40YzctMS4zIDEyLjMtNy41IDEyLjMtMTUgMC03LjItNS4xLTEzLjQtMTEuOC0xNC43em0tMzk3IDIwOS43bC00My43LTc1LjggNDMuNyAwIDAgNzUuOHptMC04My44bC00My43IDBjLS4zLTEuMS0uOC0yLjEtMS4zLTMuMmw0NS00Ny40IDAgNTAuNnptMC02Mi40bC01MC40IDUzLjNjLTEuMy0uNS0yLjctMS4zLTQtMS42TDQzLjcgMjU5LjhjLjUtMS4zIC41LTIuNyAuNS00czAtMi40LS4zLTMuNWw1Mi05MGMyLjctLjMgNS40LTEuMSA3LjgtMi43bDUwLjEgNTIgMCA5Mi45em0wLTEwMi4zTDEwOCAxNTQuOGMxLjMtMi4xIDIuMS00LjggMi4xLTcuOCAwLS4zLS4zLS44LS4zLTEuMWw0My45LTE1LjggMCA3Mi4xem0wLTgwLjZsLTQzLjcgMTUuOCA0My43LTc1LjUgMCA1OS43em0zMjYuNSAzOS4xbC44IDEuMy0zNS40IDE2Ny4xLTYzLjgtNjcuMiA5OC0xMDEuNSAuMyAuM3pNMjkyLjEgMzU1LjFsMTEuNSAxMS44LTIyLjggMCAxMS4zLTExLjh6bS0uMy0xMS4zbC04My4zLTg1LjQgNzkuNi04NC40IDgzIDg3LjYtNzkuMyA4Mi4yem01LjQgNS45bDc5LjMtODIuMiA2Ny41IDcxLjMtNS45IDI4LjEtMTI0IDAtMTYuOS0xNy4xek00MTAuNyA0NC40YzEuMSAuNSAyLjEgMS4xIDMuNSAxLjNsNTcuOSAxMDAuNyAwIC41YzAgMi45IC44IDUuNiAyLjEgNy44bC05Ny41IDEwMS4yLTgzLTg3LjYgMTE3LjEtMTI0em0tOS4xLTIuMWwtMTEzLjYgMTIwLjMtNTcuMS02MC4zIDE2Ni4zLTYwIDQuMyAwem0tMTIzLjUgMGMyLjcgMi43IDYuMiA0LjMgMTAuMiA0LjNzNy41LTEuNiAxMC4yLTQuM2w3NSAwLTE0OC40IDUzLjYtNTAuOS01My42IDEwMy45IDB6TTE2MS45IDQ3LjlsMS4xLTIuMWMuOS0uMiAxLjgtLjUgMi43LS44bDUxLjIgNTMuOC01NC45IDE5LjggMC03MC43em0wIDc5LjNsNjAuOC0yMiA1OS43IDYzLjItNzkuNiA4NC4xLTQxLTQyLjEgMC04My4zem0wIDkyLjdsMzYuNCAzNy44LTM2LjQgMzguMyAwLTc2LjF6bTAgODcuOWw0Mi4xLTQ0LjUgODIuOCA4Ni0xNy4xIDE3LjctMTA3LjcgMCAwLTU5LjJ6bTcgMTYyLjFjLTEuNi0xLjYtMy41LTIuNy01LjktMy41bC0xLjEtMS42IDAtODkuNyA5OS45IDAtOTEuNiA5NC44LTEuMyAwem0xMjkuOSAwYy0yLjctMi40LTYuNC00LjMtMTAuNC00LjNzLTcuOCAxLjktMTAuNCA0LjNsLTk2LjQgMCA5MS42LTk0LjggMzguMyAwIDkxLjYgOTQuOC0xMDQuMiAwem0xMjAtMTEuOGwtNC4zIDcuNWMtMS4zIC4zLTIuNCAuOC0zLjUgMS4zbC04OS4yLTkxLjkgMTE0LjQgMC0xNy40IDgzem0xMi45LTIyLjJsMTIuOS02MC44IDIyIDAtMzQuOCA2MC44em0zNC44LTY4LjhsLTIwLjQgMCA0LjYtMjEuMiAxNy4xIDE4LjJjLS41IC44LTEuMSAxLjktMS4zIDIuOXptNjYuMi0xMDcuNGwtNTUuNCA5Ni43Yy0xLjMgLjUtMi43IDEuMS00IDEuOWwtMjAuNi0yMiAzNC42LTE2My45IDQ1LjggNzkuM2MtLjMgMS4zLS44IDIuNy0uOCA0LjMgMCAxLjMgLjMgMi40IC41IDMuN3oiXQogICAgfTsKICAgIGZhUmVzZWFyY2hnYXRlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInJlc2VhcmNoZ2F0ZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNGY4IiwgIk0wIDMybDAgNDQ4IDQ0OCAwIDAtNDQ4LTQ0OCAwek0yNjIuMiAzNjYuNGMtNi42IDMtMzMuMiA2LTUwLTE0LjItOS4yLTEwLjYtMjUuMy0zMy4zLTQyLjItNjMuNi04LjkgMC0xNC43IDAtMjEuNC0uNmwwIDQ2LjRjMCAyMy41IDYgMjEuMiAyNS44IDIzLjlsMCA4LjFjLTYuOS0uMy0yMy4xLS44LTM1LjYtLjgtMTMuMSAwLTI2LjEgLjYtMzMuNiAuOGwwLTguMWMxNS41LTIuOSAyMi0xLjMgMjItMjMuOWwwLTEwOS40YzAtMjIuNi02LjQtMjEtMjItMjMuOWwwLTguMWMyNS44IDEgNTMuMS0uNiA3MC45LS42IDMxLjcgMCA1NS45IDE0LjQgNTUuOSA0NS42IDAgMjEuMS0xNi43IDQyLjItMzkuMiA0Ny41IDEzLjYgMjQuMiAzMCA0NS42IDQyLjIgNTguOSA3LjIgNy44IDE3LjIgMTQuNyAyNy4yIDE0LjdsMCA3LjN6bTIyLjktMTM1Yy0yMy4zIDAtMzIuMi0xNS43LTMyLjItMzIuMmwwLTMyLjJjMC0xMi4yIDguOC0zMC40IDM0LTMwLjRzMzAuNCAxNy45IDMwLjQgMTcuOWwtMTAuNyA3LjJzLTUuNS0xMi41LTE5LjctMTIuNWMtNy45IDAtMTkuNyA3LjMtMTkuNyAxOS43bDAgMjYuOGMwIDEzLjQgNi42IDIzLjMgMTcuOSAyMy4zIDE0LjEgMCAyMS41LTEwLjkgMjEuNS0yNi44bC0xNy45IDAgMC0xMC43IDMwLjQgMGMwIDIwLjUgNC43IDQ5LjktMzQgNDkuOXpNMTY4LjYgMjc2LjFjLTkuNCAwLTEzLjYtLjMtMjAtLjhsMC02OS43YzYuNC0uNiAxNS0uNiAyMi41LS42IDIzLjMgMCAzNy4yIDEyLjIgMzcuMiAzNC41IDAgMjEuOS0xNSAzNi42LTM5LjcgMzYuNnoiXQogICAgfTsKICAgIGZhU2lnbmFsTWVzc2VuZ2VyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNpZ25hbC1tZXNzZW5nZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTY2MyIsICJNMjU2IDBjLTEzLjMgMC0yNi4zIDEtMzkuMSAzbDMuNyAyMy43QzIzMi4xIDI0LjkgMjQ0IDI0IDI1NiAyNHMyMy45IC45IDM1LjQgMi43TDI5NS4xIDNDMjgyLjMgMSAyNjkuMyAwIDI1NiAwem02MC44IDcuM2wtNS43IDIzLjNjMjMuNCA1LjcgNDUuNCAxNC45IDY1LjQgMjcuMWwxMi41LTIwLjVjLTIyLjEtMTMuNC00Ni40LTIzLjYtNzIuMi0yOS45em03Ni40IDYxLjZjMTkuMSAxNCAzNiAzMC45IDUwLjEgNTAuMWwxOS40LTE0LjJDNDQ3IDgzLjYgNDI4LjQgNjUgNDA3LjMgNDkuNUwzOTMuMSA2OC44em04MS43IDU0LjJsLTIwLjUgMTIuNWMxMi4yIDIwIDIxLjQgNDIgMjcuMSA2NS40bDIzLjMtNS43Yy02LjMtMjUuOC0xNi41LTUwLjEtMjkuOS03Mi4yem0xMC41IDk3LjVjMS44IDExLjUgMi43IDIzLjQgMi43IDM1LjRzLS45IDIzLjktMi43IDM1LjRsMjMuNyAzLjdjMS45LTEyLjcgMy0yNS44IDMtMzkuMXMtMS0yNi4zLTMtMzkuMWwtMjMuNyAzLjd6bS0zMSAxNTUuOWwyMC41IDEyLjVjMTMuNC0yMi4xIDIzLjYtNDYuNCAyOS45LTcyLjJsLTIzLjMtNS43Yy01LjcgMjMuNC0xNC45IDQ1LjQtMjcuMSA2NS40em04LjIgMzAuOGwtMTkuNC0xNC4yYy0xNCAxOS4xLTMwLjkgMzYtNTAuMSA1MC4xbDE0LjIgMTkuNGMyMS4xLTE1LjUgMzkuOC0zNC4xIDU1LjItNTUuMnptLTg2LjEgNDdjLTIwIDEyLjItNDIgMjEuNC02NS40IDI3LjFsNS43IDIzLjNjMjUuOC02LjMgNTAuMS0xNi41IDcyLjItMjkuOWwtMTIuNS0yMC41ek0yOTUuMSA1MDlsLTMuNy0yMy43QzI3OS45IDQ4Ny4xIDI2OCA0ODggMjU2IDQ4OHMtMjMuOS0uOS0zNS40LTIuN0wyMTYuOSA1MDljMTIuNyAxLjkgMjUuOCAzIDM5LjEgM3MyNi4zLTEgMzkuMS0zem0tOTQuMS0yNy42Yy0xNy42LTQuMy0zNC40LTEwLjYtNTAuMS0xOC42bC03LjgtNC0zMi44IDcuNyA1LjUgMjMuNCAyNC4zLTUuN2MxNy40IDguOSAzNS45IDE1LjggNTUuMyAyMC41bDUuNy0yMy4zek05NS40IDQ5NC42TDkwIDQ3MS4zIDQ4LjMgNDgxYy0xMC40IDIuNC0xOS43LTYuOS0xNy4zLTE3LjNsOS43LTQxLjYtMjMuNC01LjUtOS43IDQxLjZDMS4yIDQ4NiAyNiA1MTAuOCA1My44IDUwNC40bDQxLjYtOS43em0tNTAtOTIuOWw3LjctMzIuOC00LTcuOGMtOC0xNS43LTE0LjMtMzIuNS0xOC42LTUwLjFMNy4zIDMxNi43QzEyIDMzNi4xIDE4LjkgMzU0LjcgMjcuNyAzNzJsLTUuNyAyNC4zIDIzLjQgNS41ek0zIDI5NS4xbDIzLjctMy43QzI0LjkgMjc5LjkgMjQgMjY4IDI0IDI1NnMuOS0yMy45IDIuNy0zNS40TDMgMjE2LjlDMSAyMjkuNyAwIDI0Mi43IDAgMjU2czEgMjYuMyAzIDM5LjF6bTI3LjYtOTQuMWM1LjctMjMuNCAxNC45LTQ1LjQgMjcuMS02NS40TDM3LjIgMTIzLjFjLTEzLjQgMjIuMS0yMy42IDQ2LjQtMjkuOSA3Mi4ybDIzLjMgNS43em0xOC45LTk2LjJsMTkuNCAxNC4yYzE0LTE5LjEgMzAuOS0zNiA1MC4xLTUwLjFMMTA0LjcgNDkuNUM4My42IDY1IDY1IDgzLjYgNDkuNSAxMDQuN3ptODYuMS00N2MyMC0xMi4yIDQyLTIxLjQgNjUuNC0yNy4xTDE5NS4yIDcuM2MtMjUuOCA2LjMtNTAuMSAxNi41LTcyLjIgMjkuOWwxMi41IDIwLjV6TTI1NiA0NjRjMTE0LjkgMCAyMDgtOTMuMSAyMDgtMjA4UzM3MC45IDQ4IDI1NiA0OCA0OCAxNDEuMSA0OCAyNTZjMCAzNi40IDkuNCA3MC43IDI1LjggMTAwLjUgMS42IDIuOSAyLjEgNi4yIDEuNCA5LjRsLTIxLjYgOTIuNSA5Mi41LTIxLjZjMy4yLS43IDYuNS0uMiA5LjQgMS40IDI5LjggMTYuNSA2NCAyNS44IDEwMC41IDI1Ljh6Il0KICAgIH07CiAgICBmYVhpbmcgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAieGluZyIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMTY4IiwgIk0xNjIuNyAyMTBjLTEuOCAzLjMtMjUuMiA0NC40LTcwLjEgMTIzLjUtNC45IDguMy0xMC44IDEyLjUtMTcuNyAxMi41TDkuOCAzNDZjLTcuNyAwLTEyLjEtNy41LTguNS0xNC40bDY5LTEyMS4zYy4yIDAgLjItLjEgMC0uM0wyNi40IDEzNC40Yy00LjMtNy44IC4zLTE0LjEgOC41LTE0LjFsNjUuMSAwYzcuMyAwIDEzLjMgNC4xIDE4IDEyLjJMMTYyLjcgMjEwek0zODIuNiA0Ni4xbC0xNDQgMjUzIDAgLjMgOTEuNiAxNjYuNmMzLjkgNy4xIC4yIDE0LjEtOC41IDE0LjFsLTY1LjIgMGMtNy42IDAtMTMuNi00LTE4LTEyLjJMMTQ2LjEgMjk5LjRjMy4zLTUuOCA1MS41LTkwLjggMTQ0LjgtMjU1LjIgNC42LTguMSAxMC40LTEyLjIgMTcuNS0xMi4ybDY1LjcgMGM4IDAgMTIuMyA2LjcgOC41IDE0LjF6Il0KICAgIH07CiAgICBmYVNxdWFyZUpzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1qcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJqcy1zcXVhcmUiXSwgImYzYjkiLCAiTTQ0OCA5NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwek0xODAuOSA0NDQuOWMtMzMuNyAwLTUzLjItMTcuNC02My4yLTM4LjVMMTUyIDM4NS43YzYuNiAxMS43IDEyLjYgMjEuNiAyNy4xIDIxLjYgMTMuOCAwIDIyLjYtNS40IDIyLjYtMjYuNWwwLTE0My4xIDQyLjEgMCAwIDE0My43YzAgNDMuNi0yNS42IDYzLjUtNjIuOSA2My41em04NS44LTQzTDMwMSAzODIuMWM5IDE0LjcgMjAuOCAyNS42IDQxLjUgMjUuNiAxNy40IDAgMjguNi04LjcgMjguNi0yMC44IDAtMTQuNC0xMS40LTE5LjUtMzAuNy0yOGwtMTAuNS00LjVjLTMwLjQtMTIuOS01MC41LTI5LjItNTAuNS02My41IDAtMzEuNiAyNC4xLTU1LjYgNjEuNi01NS42IDI2LjggMCA0NiA5LjMgNTkuOCAzMy43TDM2OCAyOTBjLTcuMi0xMi45LTE1LTE4LTI3LjEtMTgtMTIuMyAwLTIwLjEgNy44LTIwLjEgMTggMCAxMi42IDcuOCAxNy43IDI1LjkgMjUuNmwxMC41IDQuNWMzNS44IDE1LjMgNTUuOSAzMSA1NS45IDY2LjIgMCAzNy44LTI5LjggNTguNi02OS43IDU4LjYtMzkuMSAwLTY0LjQtMTguNi03Ni43LTQzeiJdCiAgICB9OwogICAgZmFKc1NxdWFyZSA9IGZhU3F1YXJlSnM7CiAgICBmYUZvbnRpY29ucyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmb250aWNvbnMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjI4MCIsICJNMCAzMmwwIDQ0OCA0NDggMCAwLTQ0OC00NDggMHpNMTg3IDE3Mi45Yy0xOC40IDAtMTkgOS45LTE5IDI3LjRsMCAyMy4zYzAgMi40LTMuNSA0LjQtLjYgNC40bDY3LjQgMC0xMS4xIDM3LjMtNTUuNyAwIDAgMTEyLjljMCA1LjgtMiA2LjcgMy4yIDcuM2w0My41IDQuMSAwIDI1LjEtMTMwLjcgMCAwLTI1LjcgMjEuMy0yYzUuMi0uNiA2LjctMi4zIDYuNy03LjlsMC0xMTEuNGMwLTIuMy0yLjktMi4zLTUuOC0yLjNsLTIyLjIgMCAwLTM3LjQgMjggMCAwLTIxYzAtNDkuNiAyNi41LTcwIDc3LjMtNzAgMzQuMSAwIDY0LjcgOC4yIDY0LjcgNTIuOGwtNTAuNyA2LjFjLjMtMTguNy00LjQtMjMtMTYuMy0yM3ptNzQuMyAyNDEuOGwwLTI1LjEgMjAuNC0yLjZjNS4yLS42IDcuNi0xLjcgNy42LTcuM2wwLTEwNy45YzAtNC4xLTIuOS02LjctNi43LTcuOWwtMjQuMi02LjQgNi43LTI5LjUgODAuMiAwIDAgMTUxLjdjMCA1LjgtMi42IDYuNCAyLjkgNy4zbDE1LjcgMi42IDAgMjUuMS0xMDIuNiAwem04MC44LTI1NS41bDkgMzMuMi03LjMgNy4zLTMxLjItMTYuNi0zMS4yIDE2LjYtNy4zLTcuMyA5LTMzLjItMjEuOC0yNC4yIDMuNS05LjYgMjcuNyAwIDE1LjUtMjggOS4zIDAgMTUuNSAyOCAyNy43IDAgMy41IDkuNi0yMS45IDI0LjJ6Il0KICAgIH07CiAgICBmYVVwcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ1cHMiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjdlMCIsICJNMTAzLjIgMzAzYy01LjIgMy42LTMyLjYgMTMuMS0zMi42LTE5bDAtMTA0LTMyLjcgMCAwIDEwMi42YzAgNzQuOSA4MC4yIDUxLjEgOTcuOSAzOWwwLTE0MS42LTMyLjYgMCAwIDEyM3pNNCA3NC44TDQgMjk1LjdjMCAxMDMuNyA3NC45IDEzNS4yIDE4Ny43IDE4NC4xIDExMi40LTQ4LjkgMTg3LjctODAuMiAxODcuNy0xODQuMWwwLTIyMC45QzI2My4xIDEzLjIgOTcuNiAyNS4yIDQgNzQuOHpNMzYyLjEgMjk1LjdjMCA4Ni42LTUzLjIgMTEzLjYtMTcwLjQgMTY1LjMtMTE3LjUtNTEuOC0xNzAuNS03OC43LTE3MC41LTE2NS4zbDAtMTI2LjRjMTAyLjMtOTMuOCAyMzEuNi0xMDAgMzQwLjktODkuOGwwIDIxNi4yek0xNTIuNSAxODguM2wwIDIxMi44IDMyLjcgMCAwLTY4LjdjMjQuNCA3LjMgNzEuNy0yLjYgNzEuNy03OC41IDAtOTcuNC04MC43LTgwLjktMTA0LjQtNjUuNnptMzIuNyAxMTcuM2wwLTEwMC4zYzguNC00LjIgMzguNC0xMi43IDM4LjQgNDkuMyAwIDY3LjktMzYuNCA1MS44LTM4LjQgNTF6bTc5LjEtODYuNGMuMSA0Ny4zIDUxLjYgNDIuNSA1Mi4yIDcwLjQgLjYgMjMuNS0zMC40IDIzLTUwLjggNC45bDAgMzAuMWMzNi4yIDIxLjUgODEuOSA4LjEgODMuMi0zMy41IDEuNy01MS41LTU0LjEtNDYuNi01My40LTczLjIgLjYtMjAuMyAzMC42LTIwLjUgNDguNS0yLjJsMC0yOC40Yy0yOC41LTIyLTc5LjktOS4yLTc5LjcgMzEuOXoiXQogICAgfTsKICAgIGZhQW1hem9uUGF5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImFtYXpvbi1wYXkiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjQyYyIsICJNMTQgMzI1LjNjMi4zLTQuMiA1LjItNC45IDkuNy0yLjUgMTAuNCA1LjYgMjAuNiAxMS40IDMxLjIgMTYuNyA0MC42IDIwLjIgODMuMyAzNS44IDEyNy40IDQ2LjMgMjAuOCA1IDQxLjkgOSA2My4yIDExLjggMzEuNSA0LjIgNjMuMiA2IDk1IDUuMiAxNy40LS40IDM0LjgtMS44IDUyLjEtMy44IDU2LjItNi42IDExMS4xLTIxIDE2My4zLTQyLjggMi45LTEuMiA1LjktMiA5LjEtMS4yIDYuNyAxLjggOSA5IDQuMSAxMy45LTMgMi43LTYuMiA1LjItOS42IDcuNC0zMC43IDIxLjEtNjQuMiAzNi40LTk5LjYgNDcuOS0yNC41IDcuOS00OS42IDEzLjgtNzUuMSAxNy42LTE3LjYgMi43LTM1LjQgNC4zLTUzLjIgNC44LS44IDAtMS43IC4yLTIuNSAuM2wtMjEuMSAwYy0uOC0uMS0xLjctLjItMi41LS4zLTMuNi0uMi03LjItLjMtMTAuNy0uNC0xNi45LS44LTMzLjctMi41LTUwLjQtNS4zLTI3LjQtNC41LTU0LjMtMTEuNS04MC40LTIwLjktNTMuNy0xOS40LTEwMy4xLTQ4LjktMTQ1LjYtODctMS44LTEuNi0zLTMuOC00LjQtNS43bDAtMnpNMTcyIDY1LjFsLTQuMyAuNmMtMTMuOCAxLjctMjYuOCA2LjktMzggMTUuMS0yLjQgMS43LTQuNiAzLjUtNy4xIDUuNC0uMi0uNC0uMy0uOS0uNC0xLjQtLjQtMi43LS44LTUuNS0xLjMtOC4yLS43LTQuNi0zLTYuNi03LjYtNi42bC0xMS41IDBjLTYuOSAwLTguMiAxLjMtOC4yIDguMmwwIDIwOS4zYzAgMSAwIDIgLjEgMyAuMiAzIDIgNC45IDQuOSA1IDcgLjEgMTQuMSAuMSAyMS4xIDAgMi45IDAgNC43LTIgNS01IC4xLTEgLjEtMiAuMS0zbDAtNzIuNGMxLjEgLjkgMS43IDEuNCAyLjIgMS45IDE3LjkgMTQuOSAzOC41IDE5LjggNjEgMTUuNCAyMC40LTQgMzQuNi0xNi41IDQzLjgtMzQuOSA3LTEzLjkgOS45LTI4LjcgMTAuMy00NC4xIC41LTE3LjEtMS4yLTMzLjktOC4xLTQ5LjgtOC41LTE5LjYtMjIuNi0zMi41LTQzLjktMzYuOS0zLjItLjctNi41LTEtOS44LTEuNS0yLjgtLjEtNS41LS4xLTguMy0uMXpNMTI0LjYgMTA3Yy0uMS0uNyAuMS0xLjMgLjQtMS45cy44LTEuMSAxLjMtMS40YzEzLjctOS41IDI4LjgtMTQuNSA0NS42LTEzLjIgMTQuOSAxLjEgMjcuMSA4LjQgMzMuNSAyNS45IDMuOSAxMC43IDQuOSAyMS44IDQuOSAzMyAwIDEwLjQtLjggMjAuNi00IDMwLjYtNi44IDIxLjMtMjIuNCAyOS40LTQyLjYgMjguNS0xNC0uNi0yNi4yLTYtMzcuNC0xMy45LS42LS4zLTEtLjgtMS4zLTEuNHMtLjQtMS4yLS40LTEuOWMuMS0xNC4xIDAtMjguMSAwLTQyLjJzLjEtMjggMC00Mi4xek0zMzAuMyA2NS4xYy0xIC4xLTIgLjMtMi45IC40LTkuNyAuNC0xOS40IDEuOC0yOC45IDQuMS02LjEgMS42LTEyIDMuOC0xNy45IDUuOC0zLjYgMS4yLTUuNCAzLjgtNS4zIDcuNyAuMSAzLjMtLjEgNi42IDAgOS45IC4xIDQuOCAyLjEgNi4xIDYuOCA0LjkgNy44LTIgMTUuNi00LjIgMjMuNS01LjcgMTIuMy0yLjMgMjQuNy0zLjMgMzcuMi0xLjQgNi41IDEgMTIuNiAyLjkgMTYuOCA4LjQgMy43IDQuOCA1LjEgMTAuNSA1LjMgMTYuNCAuMyA4LjMgLjIgMTYuNiAuMyAyNC45IDAgLjUtLjEgLjktLjIgMS40LS41LS4xLS45IDAtMS4zLS4xLTEwLjUtMi42LTIxLjItNC4yLTMyLTQuOS0xMS4zLS42LTIyLjUgLjEtMzMuMyAzLjktMTIuOSA0LjUtMjMuMyAxMi4zLTI5LjQgMjQuOS00LjcgOS44LTUuNCAyMC4yLTMuOSAzMC43IDIgMTQgOSAyNC44IDIxLjQgMzEuNyAxMS45IDYuNiAyNC44IDcuNCAzNy45IDUuNCAxNS4xLTIuMyAyOC41LTguNyA0MC4zLTE4LjQgLjUtLjQgMS0uOCAxLjYtMS4xIC42IDMuOCAxLjEgNy40IDEuOCAxMSAuNiAzLjEgMi41IDUuMSA1LjQgNS4yIDUuNCAuMSAxMC45IC4xIDE2LjMgMCAxLjMgMCAyLjUtLjUgMy40LTEuNHMxLjQtMi4xIDEuNS0zLjNjLjEtLjkgLjEtMS45IC4xLTIuOGwwLTEwNmMwLTQuMy0uMy04LjYtLjktMTIuOS0xLjktMTIuOS03LjQtMjMuNS0xOS0zMC40LTYuNy00LTE0LjEtNi0yMS44LTcuMS0zLjYtLjUtNy4yLS44LTEwLjgtMS4zLTMuOSAuMS03LjkgLjEtMTEuOSAuMXptMzUgMTI3LjdjMCAuNi0uMSAxLjItLjMgMS43cy0uNyAxLTEuMiAxLjNjLTExLjIgOC4xLTIzLjUgMTMuNS0zNy40IDE0LjktNS43IC42LTExLjQgLjQtMTYuOC0xLjgtMy0xLjEtNS42LTIuOS03LjgtNS4ycy0zLjctNS4xLTQuNi04LjFjLTItNi4zLTItMTMuMS0uMS0xOS40IDIuNS04LjMgOC40LTEzIDE2LjQtMTUuNiA4LTIuNCAxNi41LTMuMiAyNC44LTIuMiA4LjQgLjcgMTYuNiAyLjMgMjUgMy40IDEuNiAuMiAyLjEgMSAyLjEgMi42LS4xIDQuOCAwIDkuNSAwIDE0LjNzLS4yIDkuNC0uMSAxNC4xek02MjUuMiAzMjIuMmMtMS01LTQuOC02LjktOS4xLTguMy02LjgtMi4xLTEzLjktMy41LTIxLTMuOS0xMy4xLTEuMS0yNi4zLS41LTM5LjIgMS45LTE0LjMgMi43LTI3LjkgNy4zLTQwIDE1LjYtMS40IC45LTIuNyAyLjEtMy43IDMuNS0uNCAuNi0uNiAxLjMtLjcgMS45czAgMS40IC4yIDIuMWMuNCAxLjUgMi4xIDEuOSAzLjYgMS44IC43IDAgMS41IDAgMi4yLS4xIDcuOC0uOCAxNS41LTEuNyAyMy4zLTIuNSAxMS40LTEuMSAyMi45LTEuOCAzNC4zLS45IDQuOSAuNCA5LjcgMS4zIDE0LjQgMi43IDUuMSAxLjQgNy40IDUuMiA3LjYgMTAuNCAuNCA4LTEuNCAxNS43LTMuNSAyMy4zLTQuMSAxNS40LTEwIDMwLjMtMTUuOCA0NS4xLS40IDEtLjggMi0xIDMtLjUgMi45IDEuMiA0LjggNC4xIDQuMSAxLjgtLjQgMy40LTEuMyA0LjgtMi41IDQuNS00LjIgOC44LTguNyAxMi43LTEzLjQgMTIuOC0xNi40IDIwLjMtMzUuMyAyNC43LTU1LjYgLjgtMy42IDEuNC03LjMgMi4xLTEwLjlsMC0xNy4zek00OTMuMSAxOTljLTEyLjktMzUuNy0yNS44LTcxLjQtMzguNy0xMDcuMi0yLTUuNy00LjItMTEuMy02LjMtMTYuOS0xLjEtMi45LTMuMi00LjgtNi40LTQuOC03LjYtLjEtMTUuMi0uMi0yMi45LS4xLTIuNSAwLTMuNyAyLTMuMiA0LjUgLjUgMi4xIDEuMSA0LjEgMS45IDYuMSAxOS42IDQ4LjUgMzkuMyA5NyA1OS4xIDE0NS41IDEuNyA0LjEgMi4xIDcuNiAuMiAxMS44LTMuMyA3LjMtNS45IDE1LTkuMyAyMi4zLTMgNi41LTggMTEuNC0xNS4yIDEzLjMtNSAxLjMtMTAuMiAxLjctMTUuNCAxLjEtMi41LS4yLTUtLjgtNy41LTEtMy40LS4yLTUuMSAxLjMtNS4yIDQuOC0uMSAzLjMtLjEgNi42IDAgOS45IC4xIDUuNSAyIDggNy40IDguOSA1LjYgMS4xIDExLjIgMS44IDE2LjkgMiAxNy4xIC40IDMwLjctNi41IDM5LjUtMjEuNCAzLjUtNS45IDYuNi0xMiA5LjItMTguNCAyMy43LTU5LjggNDcuMi0xMTkuNyA3MC42LTE3OS42IC43LTEuOCAxLjMtMy42IDEuNi01LjUgLjQtMi44LS45LTQuNC0zLjctNC40LTYuNi0uMS0xMy4zIDAtMTkuOSAwLTEuNy0uMS0zLjQgLjMtNC43IDEuM3MtMi40IDIuMy0zIDMuOWMtLjUgMS40LTEuMSAyLjctMS42IDQuMWwtMzQuOCAxMDBjLTIuNSA3LjItNS4xIDE0LjUtNy43IDIyLjItLjQtMS4xLS42LTEuNy0uOS0yLjR6Il0KICAgIH07CiAgICBmYVBhbmRvcmEgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicGFuZG9yYSIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlN2RhIiwgIk0yMDEuMyAzMkwwIDMyIDAgNDgwIDEyMC4yIDQ4MGMxMS4yIDAgMjAuMy05LjEgMjAuMy0yMC4zbDAtODYuMSAzMC4xIDBjMTQ3LjEgMCAyMDcuMy04Mi45IDIwNy4zLTE3OS45IDAtMTE5LjctOTAuOS0xNjEuOC0xNzYuNS0xNjEuOHoiXQogICAgfTsKICAgIGZhT3BlbmlkID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm9wZW5pZCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMTliIiwgIk0yNzEuNSA0MzJsLTY4IDMyQzg4LjUgNDUzLjcgMCAzOTIuNSAwIDMxOC4yIDAgMjQ2LjcgODIuNSAxODcuMiAxOTEuNyAxNzMuOWwwIDQzYy03MS41IDEyLjUtMTI0IDUzLTEyNCAxMDEuMyAwIDUxIDU4LjUgOTMuMyAxMzUuNyAxMDNsMC0zNDAgNjgtMzMuMiAwIDM4NCAuMSAwek00NDggMjkxbC0xMzEuMy0yOC41IDM2LjgtMjAuN2MtMTkuNS0xMS41LTQzLjUtMjAtNzAtMjQuOGwwLTQzYzQ2LjIgNS41IDg3LjcgMTkuNSAxMjAuMyAzOS4zbDM1LTE5LjggOS4yIDk3LjV6Il0KICAgIH07CiAgICBmYVZzY28gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidnNjbyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlN2RkIiwgIk0zNTcuNiAyNTZjMC0yNy4xLTEwLjYtNTIuNS0yOS43LTcxLjdzLTQ0LjYtMjkuNy03MS43LTI5LjdsLS4xIDBjLTI3LjEgMC01Mi42IDEwLjYtNzEuNyAyOS43cy0yOS43IDQ0LjYtMjkuNyA3MS43YzAgMjcuMSAxMC42IDUyLjUgMjkuNyA3MS43IDE5LjIgMTkuMiA0NC42IDI5LjcgNzEuNyAyOS43bC4xIDBjMjcuMSAwIDUyLjYtMTAuNiA3MS43LTI5LjcgMTkuMi0xOS4yIDI5LjctNDQuNiAyOS43LTcxLjd6TTE3Ni4zIDQ4Mi4xYzIzIDguMSA0NyAxMi42IDcxLjYgMTMuNGwwLTU5LjFjLTE3LjEtLjctMzMuNS0zLjgtNDktOC45bC0yMi42IDU0LjZ6bTEzNy01NC42Yy0xNS41IDUuMS0zMiA4LjItNDkgOC45bDAgNTkuMWMyNC42LS44IDQ4LjYtNS4zIDcxLjYtMTMuNGwtMjIuNi01NC42ek05Mi41IDQzMS4yYzIwLjIgMTguOSA0My4zIDM0IDY4LjcgNDVsMjIuNS01NC41Yy0xOC4zLTcuOS0zNS4xLTE4LjgtNDkuOC0zMS45TDkyLjUgNDMxLjJ6bTI4NS45LTQxLjRjLTE0LjYgMTMuMi0zMS40IDI0LTQ5LjggMzEuOWwyMi41IDU0LjVjMjUuNC0xMSA0OC40LTI2LjEgNjguNy00NWwtNDEuNC00MS40ek0xNDUuNCAzNzguMmMxMy42IDEyLjEgMjkgMjEuOSA0NS44IDI5IDE4IDcuNiAzNy4xIDEyIDU2LjcgMTIuOWwwLTQ2LjhjLTI2LjQtMS44LTUwLjMtMTIuMy02OS4xLTI4LjZsLTMzLjQgMzMuNHptMTg4LTMzLjRjLTE4LjggMTYuMy00Mi43IDI2LjgtNjkuMSAyOC42bDAgNDYuOGMxOS42LS45IDM4LjctNS4zIDU2LjctMTIuOSAxNi44LTcuMSAzMi4yLTE2LjkgNDUuOC0yOWwtMzMuNC0zMy40ek0zOC41IDM1Ni42YzEwLjcgMjMuMiAyNSA0NC4zIDQyLjUgNjMuMWw0MS4zLTQxLjNjLTEyLjQtMTMuNC0yMi45LTI4LjYtMzAuOS00NS4yTDM4LjUgMzU2LjZ6bTM4Mi40LTIzLjVjLTggMTYuNi0xOC41IDMxLjktMzAuOSA0NS4ybDQxLjMgNDEuM2MxNy41LTE4LjcgMzEuOC0zOS45IDQyLjUtNjMuMWwtNTIuOS0yMy41em0tMzMxLTY5YzEuMSAxOC44IDUuNCAzNy4yIDEyLjggNTQuNSA3LjUgMTcuOCAxOCAzNCAzMS4yIDQ4LjJsMzMuNS0zMy41Yy0xNi40LTE4LjgtMjYuOS00Mi44LTI4LjctNjkuMmwtNDguOCAwem0yODMuNyAwYy0xLjggMjYuNC0xMi4zIDUwLjQtMjguNyA2OS4ybDMzLjUgMzMuNWMxMy4xLTE0LjIgMjMuNi0zMC40IDMxLjItNDguMiA3LjMtMTcuNCAxMS42LTM1LjcgMTIuNy01NC41bC00OC43IDB6bS0zNTcuMSAwYy45IDI2LjcgNi4xIDUyLjcgMTUuNiA3Ny41TDg1IDMxOC4yYy02LjQtMTctMTAuMy0zNS4xLTExLjMtNTRsLTU3LjEgMHptNDIyLjEgMGMtMSAxOC45LTUgMzcuMS0xMS4zIDU0bDUyLjggMjMuNWM5LjUtMjQuOCAxNC43LTUwLjggMTUuNi03Ny41bC01Ny4xIDB6TTMyLjEgMTcwLjRjLTkuNSAyNC44LTE0LjcgNTAuOC0xNS42IDc3LjVsNTcuMSAwYzEtMTguOSA1LTM3LjEgMTEuMy01NEwzMi4xIDE3MC40em0xMDEuNy0yNS4yYy0xMy4xIDE0LjItMjMuNiAzMC40LTMxLjIgNDguMi03LjMgMTcuNC0xMS42IDM1LjctMTIuOCA1NC41bDQ4LjggMGMxLjgtMjYuNCAxMi4zLTUwLjQgMjguNy02OS4ybC0zMy41LTMzLjV6bTIxMS4xIDMzLjVjMTYuNCAxOC44IDI2LjkgNDIuOCAyOC43IDY5LjJsNDguNyAwYy0xLjEtMTguOC01LjQtMzcuMi0xMi43LTU0LjUtNy41LTE3LjgtMTgtMzQtMzEuMi00OC4ybC0zMy41IDMzLjV6bTgyLjQgMTUuMmM2LjQgMTcgMTAuMyAzNS4xIDExLjMgNTRsNTcuMSAwYy0uOS0yNi43LTYuMS01Mi43LTE1LjYtNzcuNWwtNTIuOCAyMy41ek04MSA5Mi4zQzYzLjQgMTExIDQ5LjIgMTMyLjIgMzguNSAxNTUuNGw1Mi45IDIzLjVjOC0xNi42IDE4LjUtMzEuOSAzMC45LTQ1LjJMODEgOTIuM3ptMzA5IDQxLjNjMTIuNCAxMy40IDIyLjkgMjguNiAzMC45IDQ1LjJsNTIuOS0yMy41Yy0xMC43LTIzLjItMjUtNDQuMy00Mi41LTYzLjFMMzkwIDEzMy43ek0yNDggOTEuOGMtMTkuNiAuOS0zOC43IDUuMy01Ni43IDEyLjktMTYuOCA3LjEtMzIuMiAxNi45LTQ1LjggMjlsMzMuNCAzMy40YzE4LjgtMTYuMyA0Mi43LTI2LjggNjkuMS0yOC42bDAtNDYuN3ptMTYuMyA0Ni43YzI2LjQgMS44IDUwLjMgMTIuMyA2OS4xIDI4LjZsMzMuNC0zMy40Yy0xMy42LTEyLjEtMjktMjEuOS00NS44LTI5LTE4LTcuNi0zNy4xLTEyLTU2LjctMTIuOWwwIDQ2Ljd6TTE2MS4yIDM1LjhjLTI1LjQgMTEtNDguNCAyNi4xLTY4LjcgNDVsNDEuNCA0MS40YzE0LjctMTMuMiAzMS40LTI0IDQ5LjgtMzEuOUwxNjEuMiAzNS44ek0zMjguNiA5MC4zYzE4LjMgNy45IDM1LjEgMTguOCA0OS44IDMxLjlsNDEuNC00MS40Yy0yMC4yLTE4LjktNDMuMy0zNC02OC43LTQ1TDMyOC42IDkwLjN6TTI0OCAxNi40Yy0yNC42IC44LTQ4LjYgNS4zLTcxLjYgMTMuNGwyMi42IDU0LjZjMTUuNS01LjEgMzItOC4yIDQ5LTguOWwwLTU5LjF6bTE2LjMgNTkuMWMxNy4xIC43IDMzLjUgMy44IDQ5IDguOWwyMi42LTU0LjZjLTIzLTguMS00Ny0xMi42LTcxLjYtMTMuNGwwIDU5LjF6TTUxMi4yIDI2NC4ybC0uMiAwQzUwNy44IDM5OSAzOTkuMiA1MDcuNyAyNjQuMyA1MTEuOWwwIC4xLTE2LjMgMCAwLS4xQzExMy4xIDUwNy43IDQuNSAzOTkgLjIgMjY0LjFsLS4yIDAgMC0xNi4zIC4yIDBDNC41IDExMyAxMTMuMSA0LjMgMjQ4IC4xbDAtLjEgMTYuMyAwIDAgLjFDMzk5LjIgNC4zIDUwNy44IDExMyA1MTIgMjQ3LjlsLjIgMCAwIDE2LjN6Il0KICAgIH07CiAgICBmYUdsb2JhbGVha3MgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZ2xvYmFsZWFrcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlODVkIiwgIk00MTEuMiAzMi4yYzIwLjIgMCAzNi44IDE2LjYgMzYuOCAzNi45bDAgMzczLjhjMCAyMC4yLTE2LjYgMzYuOS0zNi44IDM2LjlsLTk0LjQgMCAyOC03OS40YzMuMS04LjgtMS42LTE4LjctMTAuNC0yMS44LTEuNi0uNS0yLjYtMS00LjItMXMtMy42IDAtNS4yIC41Yy01LjIgMS05LjkgNS4yLTExLjkgMTAuOWwtNi4yIDE2LjYgMC02Ny41YzAtMTAuOS03LjgtMTkuNy0xOC4yLTIxLjhsLTcuMiAwYy0uNSAwLTEgMC0xLjYgLjUtLjUgMC0xIC41LTEuNiAuNS0yLjYgMS01LjIgMi42LTcuMiA0LjFsMC00LjFjMC01LjctMi42LTEwLjQtNS43LTE0bC0xLTFjLTEtMS0yLjYtMi4xLTQuMi0yLjZsMC0yNi41YzAtNS4yLTQuMS05LjMtOS4zLTkuM2wtMzkuOSAwYy02LjcgMC0xMS40LTcuMy04LjMtMTMuNUwyODMuMSA4NC4xYzE0LjUtMzEuMSA0NS42LTUxLjQgODAuNC01MS45bDQ3LjcgMHptLTE2NiAwYzE3LjYgMCAzMC4xIDE2LjEgMjggMzIuMi0yLjYgMy42LTQuNyA3LjgtNi4yIDEwLjlMMTg2LjYgMjQxLjVjLTguOCAxOC43IDQuMiA0MCAyNC40IDQwbDMwLjYgMCAwIDE2LjFjLTcuOCAzLjEtMTMgMTAuOS0xMyAxOS43bDAgMy42Yy0zLjYtMy42LTguOC01LjctMTQuNS01LjctMTEuOSAwLTIxLjggOS45LTIxLjggMjEuOGwwIDE5LjItMy4xIDBjLTkuMyAwLTE3LjEgNy44LTE3LjEgMTcuMWwwIDEwNS45LTk1LjQgMGMtNDIgMC03Mi42LTQwLjUtNjEuMi04MS41IDEtMy4xIDQuMi01LjIgNy4zLTQuN2wyMS4yIDBjMjQuNCAwIDQ0LjYtMjAuMiA0NC42LTQ1LjJsMC00LjJjMC0yNC45LTE5LjctNDUuMi00NC42LTQ1LjItLjUgMC0xLS41LTEtMWw4LjgtMzIuN2MyLjEtNi4yLTIuNi0xMS45LTguOC0xMS45bC0zMy4yIDBjLTYuNyAwLTExLjQtNy4zLTguMy0xMy41TDc2LjcgODQuN2MxNi4xLTMyLjIgNDguMi01Mi40IDg0LTUyLjRsODQuNSAwek0xMzMuNyAxNDQuNGMtMTAuNCAwLTE4LjcgOC4zLTE4LjcgMTguNyAwIDkuOSA4LjMgMTguNyAxOC43IDE4LjcgMTAuNCAwIDE4LjctOC4zIDE4LjctMTguN3MtOC4zLTE4LjctMTguNy0xOC43em0yMDIuOCAwYTE4LjYgMTguNiAwIDEgMCAtLjIgMzcuMiAxOC42IDE4LjYgMCAxIDAgLjItMzcuMnoiXQogICAgfTsKICAgIGZhVmVubW8gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidmVubW8iLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTg1YSIsICJNNjcuOCAyMDIuN2MyLjQgNSAzLjkgMTEgMy45IDE5LjggMCAxNi4yLTExLjUgMzkuOC0yMC43IDU0LjlsLTkuOS03OS43LTQxIDMuOSAxOC44IDExMiA0Ni45IDBjMjAuNS0yNi45IDQ1LjgtNjUuMyA0NS44LTk0LjggMC05LjMtMS45LTE2LjYtNi4zLTIzLjdsLTM3LjQgNy41em0xMTMtNy4xYy00Mi44IDAtNjMuNSAzNy02My41IDcxLjkgMCAyNi45IDEyLjggNDguNSA0OC40IDQ4LjUgMTQgMCAyOC41LTMgMzcuOC03LjVsNS0zMy42Yy0xMy4yIDYuNy0yMy4zIDkuMy0zMy45IDkuMy05LjcgMC0xNy4xLTUuMi0xNy4xLTE4LjMgMjItLjIgNjAtOS4zIDYwLTM4LjggMC0xOC4zLTEzLjItMzEuNS0zNi43LTMxLjVsMCAwem0tMjIuNSA0OC45YzEuMS0xMi45IDExLTIyIDE4LjYtMjIgNC4zIDAgOCAyLjYgOCA3LjcgMCAxMC44LTE5IDE0LjItMjYuNiAxNC4ybDAgMHptMTUwLjItNDguOWMtMTUuMyAwLTI2LjEgNS44LTM0LjMgMTEuMmwtLjQtOS4zLTM0LjggMC0xOC40IDExNi4xIDQwLjIgMCAxMi43LTgxLjRjMy41LTEuNyA4LjYtNC4xIDEzLjgtNC4xIDMuOSAwIDcuMSAxLjMgNy4xIDYuNSAwIDIuMi0uNyA2LS45IDhsLTExLjIgNzEuMSA0MCAwIDEyLjMtNzcuNWMuNy00LjEgMS4zLTEwLjMgMS4zLTE0LjYgMC0xNS41LTcuMS0yNS45LTI3LjQtMjUuOXptMTgzLjIgMGMtMTQuOSAwLTI1LjcgNC41LTM3LjIgMTIuNy00LjEtNy4zLTEyLjMtMTIuNy0yNC44LTEyLjctMTQuNSAwLTI1LjMgNS44LTMzLjMgMTEuNmwtMS4xLTkuNy0zNC40IDAtMTguNCAxMTYuMSA0MC4yIDAgMTIuOC04MS40YzMuNS0xLjcgOC42LTQuMSAxMy44LTQuMSAzLjkgMCA3LjEgMS4zIDcuMSA3LjEgMCAxLjUtLjQgMy45LS42IDUuOGwtMTEuNCA3Mi42IDQwIDAgMTIuNy04MS40YzMuNy0xLjkgOC42LTQuMSAxMy42LTQuMSAzLjkgMCA3LjEgMS4zIDcuMSA3LjEgMCAxLjUtLjQgMy45LS43IDUuOGwtMTEuNCA3Mi42IDQwIDAgMTIuMy03Ny41Yy43LTQuMSAxLjMtMTAuMyAxLjMtMTQuNiAwLTE1LjUtNy4xLTI1LjktMjcuNy0yNS45bDAgMHptMTAyLjIgMGMtNDQuNyAwLTY0LjIgMzQuMy02NC4yIDcwLjkgMCAyNy44IDExLjIgNTAgNDUuMSA1MCA0NS44IDAgNjUtMzcuNSA2NS03My43IDAtMjcuNC0xMi4zLTQ3LjItNDYtNDcuMnptLTEzLjQgOTBjLTcuMSAwLTEwLjEtNi43LTEwLjEtMTcuNSAwLTE0LjIgMy4yLTQyIDE5LTQyIDcuMSAwIDkuNSA2LjUgOS41IDE1LjkgMCAxNC4yLTMuNSA0My41LTE4LjQgNDMuNXoiXQogICAgfTsKICAgIGZhVWJ1bnR1ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInVidW50dSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmN2RmIiwgIk00NjkuMiA3NWMwLTIwLjEtOC0zOS4zLTIyLjItNTMuNXMtMzMuNC0yMi4yLTUzLjUtMjIuMi0zOS4zIDgtNTMuNSAyMi4yLTIyLjIgMzMuNC0yMi4yIDUzLjVjMCAyMC4xIDggMzkuMyAyMi4xIDUzLjVzMzMuNCAyMi4xIDUzLjUgMjIuMSAzOS4zLTggNTMuNS0yMi4xIDIyLjEtMzMuNCAyMi4xLTUzLjVsLjEgMHptLTMxNSAxNjUuN2E3NS42IDc1LjYgMCAxIDAgLTE1MS4yIDAgNzUuNiA3NS42IDAgMSAwIDE1MS4yIDB6TTU3IDM0NmMxOC42IDQ2LjkgNTEgODcgOTMgMTE1LjFzOTEuNSA0Mi42IDE0MiA0MS43Yy0xNC43LTE4LjYtMjIuOS00MS41LTIzLjItNjUuMi02LjgtLjktMTMuMy0yLjEtMTkuNS0zLjQtMjYuOC01LjctNTEuOS0xNy4zLTczLjYtMzRzLTM5LjMtMzguMS01MS43LTYyLjVjLTIwLjkgOS45LTQ0LjUgMTIuOC02Ny4xIDguMmwuMSAuMXptMzk1LjEgODkuOGE3NS42IDc1LjYgMCAxIDAgLTE1MS4yIDAgNzUuNiA3NS42IDAgMSAwIDE1MS4yIDB6TTQ0NCAzNTEuNmMxOC41IDE0LjggMzEuNiAzNS4yIDM3LjIgNTguMiAzMy4zLTQxLjMgNTIuNi05Mi4yIDU0LjgtMTQ1LjJzLTEyLjUtMTA1LjQtNDIuMi0xNDkuNGMtOC42IDIxLjUtMjQgMzkuNi00My44IDUxLjYgMTUuNCAyOC42IDIyLjkgNjAuOCAyMS45IDkzLjJzLTEwLjcgNjQtMjggOTEuNmwuMSAwek0xMDEuMSAxMzUuNGMxMi40IDIuNyAyNC4zIDcuNSAzNS4xIDE0LjMgMTYuNi0yNC4yIDM4LjktNDQuMSA2NC44LTU4UzI1NS44IDcwLjQgMjg1LjIgNzBjLjItNS45IC45LTExLjkgMi0xNy43IDMuNi0xNi43IDExLjEtMzIuMyAyMS44LTQ1LjUtNDcuNy0zLjgtOTUuNCA2LTEzNy42IDI4LjVTOTQuMyA5MS43IDcwLjggMTMzLjRjMi43LS4yIDUuMy0uMyA4LS4zIDcuNSAwIDE1IC44IDIyLjQgMi4zbC0uMSAweiJdCiAgICB9OwogICAgZmFWaWFjb2luID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInZpYWNvaW4iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjIzNyIsICJNMzg0IDMybC02NCAwLTgwLjcgMTkyLTk0LjUgMC04MC44LTE5Mi02NCAwIDQ4IDExMi00OCAwIDAgNDggNjguNSAwIDEzLjggMzItODIuMyAwIDAgNDggMTAyLjggMCA4OS4yIDIwOCA4OS4yLTIwOCAxMDIuOCAwIDAtNDgtODIuMyAwIDEzLjgtMzIgNjguNSAwIDAtNDgtNDggMCA0OC0xMTJ6TTE5MiAzMzZsLTI3LTY0IDU0IDAtMjcgNjR6Il0KICAgIH07CiAgICBmYVpoaWh1ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInpoaWh1IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY2M2YiLCAiTTE3MC41IDE0OC4xbDAgMjE3LjUgMjMuNCAwIDcuNyAyNi40IDQyLTI2LjQgNDkuNSAwIDAtMjE3LjUtMTIyLjcgMHptOTcuOCAxOTMuOWwtMjcuOSAwLTI3LjkgMTcuNS01LjEtMTcuNS0xMS45IDAgMC0xNzAuMyA3Mi44IDAgMCAxNzAuM3pNMTQ5LjggMjQ3LjdsLTUyLjMgMGMxLjctMjcuMSAyLjItNTEuNiAyLjItNzMuNWw1MS4yIDBzMi0yMi42LTguNi0yMi4zbC04OC41IDBjMy41LTEzLjEgNy45LTI2LjcgMTMuMS00MC43IDAgMC0yNC4xIDAtMzIuMyAyMS42LTMuNCA4LjktMTMuMiA0My4xLTMwLjcgNzguMSA1LjktLjYgMjUuNC0xLjIgMzYuOC0yMi4yIDIuMS01LjkgMi41LTYuNyA1LjEtMTQuNWwyOC45IDBjMCAxMC41LTEuMiA2Ni45LTEuNyA3My40bC01Mi4zIDBjLTExLjcgMC0xNS42IDIzLjYtMTUuNiAyMy42bDY1LjYgMGMtNC40IDQ5LjktMjggOTEuOS03MC44IDEyNS4xIDIwLjUgNS45IDQwLjktLjkgNTEtOS45IDAgMCAyMy0yMC45IDM1LjYtNjkuM2w1NCA2NC45czcuOS0yNi45LTEuMi00MGMtNy42LTguOS0yOC4xLTMzLjEtMzYuOC00MS44TDg3LjkgMzEyYzQuNC0xNCA3LTI3LjYgNy45LTQwLjdsNjEuNiAwcy0uMS0yMy42LTcuNi0yMy42bDAgMHptNDEyLTEuNmMyMC44LTI1LjYgNDUtNTguNiA0NS01OC42cy0xOC42LTE0LjgtMjcuNC00LjFjLTYgOC4yLTM2LjggNDguMi0zNi44IDQ4LjJsMTkuMiAxNC40ek00MTEuOCAxODdjLTktOC4yLTI1LjkgMi4xLTI1LjkgMi4xczM5LjUgNTUgNDEuMSA1Ny40bDE5LjUtMTMuN3MtMjUuNy0zNy42LTM0LjctNDUuOWwwIDAgMCAwek02NDAgMjU4LjRjLTE5LjggMC0xMzAuOSAuOS0xMzEuMSAuOWwwLTEwMWM0LjggMCAxMi40LS40IDIyLjgtMS4yIDQwLjktMi40IDcwLjEtNCA4Ny44LTQuOCAwIDAgMTIuMi0yNy4yLS42LTMzLjQtMy4xLTEuMi0yMy4yIDQuNi0yMy4yIDQuNnMtMTY1LjIgMTYuNS0yMzIuNCAxOGMxLjYgOC44IDcuNiAxNy4xIDE1LjggMTkuNiAxMy4zIDMuNSAyMi43IDEuNyA0OS4yIC45IDI0LjgtMS42IDQzLjctMi40IDU2LjUtMi40bDAgOTkuOC0xMzMuNSAwczIuOCAyMi4zIDI1LjUgMjIuOWwxMDcuOSAwIDAgNzAuOWMwIDE0LTExLjIgMjItMjQuNSAyMS4xLTE0LjEgLjEtMjYuMS0xLjEtNDEuNy0xLjggMiA0IDYuMyAxNC40IDE5LjMgMjEuOCA5LjkgNC44IDE2LjIgNi42IDI2IDYuNiAyOS42IDAgNDUuNy0xNy4zIDQ0LjktNDUuM2wwLTczLjMgMTIyLjQgMGM5LjcgMCA4LjctMjMuOCA4LjctMjMuOGwwIDB6Il0KICAgIH07CiAgICBmYVlhbmRleCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ5YW5kZXgiLAogICAgICBpY29uOiBbMjU2LCA1MTIsIFtdLCAiZjQxMyIsICJNMTUzLjEgMzE1LjhMNjUuNyA1MTIgMiA1MTIgOTggMzAyLjJDNTIuOSAyNzkuMyAyMi44IDIzNy44IDIyLjggMTYxLjEgMjIuNyA1My43IDkwLjggMCAxNzEuNyAwbDgyLjMgMCAwIDUxMi01NS4xIDAgMC0xOTYuMi00NS44IDB6TTE5OC45IDQ2LjVsLTI5LjQgMGMtNDQuNCAwLTg3LjQgMjkuNC04Ny40IDExNC42IDAgODIuMyAzOS40IDEwOC44IDg3LjQgMTA4LjhsMjkuNCAwIDAtMjIzLjR6Il0KICAgIH07CiAgICBmYVBpeGl2ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInBpeGl2IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU2NDAiLCAiTTk2IDMyQzQzIDMyIDAgNzUgMCAxMjhMMCAzODRjMCA1MyA0MyA5NiA5NiA5NmwyNTYgMGM1MyAwIDk2LTQzIDk2LTk2bDAtMjU2YzAtNTMtNDMtOTYtOTYtOTZMOTYgMzJ6bTc3LjcgMjE3LjNhNjAuMSA2MC4xIDAgMSAwIDEyMC4zIDAgNjAuMSA2MC4xIDAgMSAwIC0xMjAuMyAwek0xMTkuMSAzODcuOGMtLjMtLjgtLjUtMS43LS41LTIuNmwwLTI0NC4zYzAtMS44IC43LTMuNiAyLTQuOXMzLTIgNC45LTJsMTYuOSAwYzEuMiAwIDIuMyAuMyAzLjMgLjhzMS45IDEuMyAyLjUgMi4zbDE0IDIxLjhjMTkuNy0xNS42IDQ0LjUtMjUgNzEuNi0yNSA2My42IDAgMTE1LjIgNTEuNiAxMTUuMiAxMTUuMlMyOTcuNSAzNjQuNSAyMzMuOCAzNjQuNWMtMjIgMC00Mi42LTYuMi02MC4xLTE2LjlsMCAzNy42YzAgLjktLjIgMS44LS41IDIuNnMtLjkgMS42LTEuNSAyLjItMS40IDEuMS0yLjIgMS41LTEuNyAuNS0yLjYgLjVsLTQxLjMgMGMtLjkgMC0xLjgtLjItMi42LS41cy0xLjYtLjktMi4yLTEuNS0xLjEtMS40LTEuNS0yLjJ6Il0KICAgIH07CiAgICBmYU9wZW5haSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJvcGVuYWkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTdjZiIsICJNMTk2LjQgMTg1LjhsMC00OC42YzAtNC4xIDEuNS03LjIgNS4xLTkuMmw5Ny44LTU2LjNjMTMuMy03LjcgMjkuMi0xMS4zIDQ1LjYtMTEuMyA2MS40IDAgMTAwLjQgNDcuNiAxMDAuNCA5OC4zIDAgMy42IDAgNy43LS41IDExLjhMMzQzLjMgMTExLjFjLTYuMS0zLjYtMTIuMy0zLjYtMTguNCAwTDE5Ni40IDE4NS44ek00MjQuNyAzNzUuMmwwLTExNi4yYzAtNy4yLTMuMS0xMi4zLTkuMi0xNS45TDI4NyAxNjguNCAzMjkgMTQ0LjNjMy42LTIgNi43LTIgMTAuMiAwTDQzNyAyMDAuN2MyOC4yIDE2LjQgNDcuMSA1MS4yIDQ3LjEgODUgMCAzOC45LTIzIDc0LjgtNTkuNCA4OS42bDAgMHpNMTY2LjIgMjcyLjhsLTQyLTI0LjZjLTMuNi0yLTUuMS01LjEtNS4xLTkuMmwwLTExMi42YzAtNTQuOCA0Mi05Ni4zIDk4LjgtOTYuMyAyMS41IDAgNDEuNSA3LjIgNTguNCAyMEwxNzUuNCAxMDguNWMtNi4xIDMuNi05LjIgOC43LTkuMiAxNS45bDAgMTQ4LjUgMCAwem05MC40IDUyLjJsLTYwLjItMzMuOCAwLTcxLjcgNjAuMi0zMy44IDYwLjIgMzMuOCAwIDcxLjctNjAuMiAzMy44em0zOC43IDE1NS43Yy0yMS41IDAtNDEuNS03LjItNTguNC0yMGwxMDAuOS01OC40YzYuMS0zLjYgOS4yLTguNyA5LjItMTUuOWwwLTE0OC41IDQyLjUgMjQuNmMzLjYgMiA1LjEgNS4xIDUuMSA5LjJsMCAxMTIuNmMwIDU0LjgtNDIuNSA5Ni4zLTk5LjMgOTYuM2wwIDB6TTE3My44IDM2Ni41TDc2LjEgMzEwLjJjLTI4LjItMTYuNC00Ny4xLTUxLjItNDcuMS04NSAwLTM5LjQgMjMuNi03NC44IDU5LjktODkuNmwwIDExNi43YzAgNy4yIDMuMSAxMi4zIDkuMiAxNS45bDEyOCA3NC4yLTQyIDI0LjFjLTMuNiAyLTYuNyAyLTEwLjIgMHptLTUuNiA4NGMtNTcuOSAwLTEwMC40LTQzLjUtMTAwLjQtOTcuMyAwLTQuMSAuNS04LjIgMS0xMi4zbDEwMC45IDU4LjRjNi4xIDMuNiAxMi4zIDMuNiAxOC40IDBsMTI4LjUtNzQuMiAwIDQ4LjZjMCA0LjEtMS41IDcuMi01LjEgOS4ybC05Ny44IDU2LjNjLTEzLjMgNy43LTI5LjIgMTEuMy00NS42IDExLjNsMCAwem0xMjcgNjAuOWM2MiAwIDExMy43LTQ0IDEyNS40LTEwMi40IDU3LjMtMTQuOSA5NC4yLTY4LjYgOTQuMi0xMjMuNCAwLTM1LjgtMTUuNC03MC43LTQzLTk1LjcgMi42LTEwLjggNC4xLTIxLjUgNC4xLTMyLjMgMC03My4yLTU5LjQtMTI4LTEyOC0xMjgtMTMuOCAwLTI3LjEgMi00MC40IDYuNy0yMy0yMi41LTU0LjgtMzYuOS04OS42LTM2LjktNjIgMC0xMTMuNyA0NC0xMjUuNCAxMDIuNC01Ny4zIDE0LjgtOTQuMiA2OC42LTk0LjIgMTIzLjQgMCAzNS44IDE1LjQgNzAuNyA0MyA5NS43LTIuNiAxMC44LTQuMSAyMS41LTQuMSAzMi4zIDAgNzMuMiA1OS40IDEyOCAxMjggMTI4IDEzLjggMCAyNy4xLTIgNDAuNC02LjcgMjMgMjIuNSA1NC44IDM2LjkgODkuNiAzNi45eiJdCiAgICB9OwogICAgZmFTaXRoID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNpdGgiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjUxMiIsICJNMCAzMmw2OS43IDExOC44LTU4LjktMTEuNSA2OS44IDkxYy0zIDE3LTMgMzQuNCAwIDUxLjRsLTY5LjggOTEgNTguOS0xMS41LTY5LjcgMTE4LjggMTE4LjgtNjkuNy0xMS41IDU4LjkgOTEtNjkuOGMxNyAzIDM0LjUgMyA1MS41IDBsOTEgNjkuOC0xMS41LTU4LjkgMTE4LjcgNjkuNy02OS43LTExOC44IDU4LjkgMTEuNS02OS44LTkxYzMtMTcgMy0zNC40IDAtNTEuNGw2OS44LTkxLTU4LjkgMTEuNSA2OS43LTExOC44LTExOC43IDY5LjcgMTEuNS01OC45LTkxLjEgNjkuOWMtOC41LTEuNS0xNy4xLTIuMy0yNS43LTIuM3MtMTcuMiAuOC0yNS43IDIuM0wxMDcuMiA0Mi44IDExOC44IDEwMS43IDAgMzJ6TTIyNCAzODAuMmExMjQuMiAxMjQuMiAwIDEgMSAwLTI0OC40IDEyNC4yIDEyNC4yIDAgMSAxIDAgMjQ4LjR6bTAtMjExLjhhODcuNiA4Ny42IDAgMSAwIDAgMTc1LjEgODcuNiA4Ny42IDAgMSAwIDAtMTc1LjF6Il0KICAgIH07CiAgICBmYUp1bGlhID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImp1bGlhIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU4NTIiLCAiTTEyNCA0MDYuNWMwIDE2LjEtMS44IDI5LjEtNS40IDM5cy04LjggMTcuNi0xNS41IDIzLjEtMTQuNyA5LjEtMjQuMSAxMS0xOS44IDIuOC0zMS4yIDIuOGMtMTUuNSAwLTI3LjMtMi40LTM1LjUtNy4zUzAgNDY0LjUgMCA0NTcuN2MwLTUuNiAyLjMtMTAuNCA2LjktMTQuM3MxMC44LTUuOCAxOC41LTUuOGM1LjggMCAxMC40IDEuNiAxMy45IDQuN3M2LjMgNi4yIDguNiA5LjNjMi42IDMuNCA0LjggNS42IDYuNSA2LjhzMy40IDEuNyA0LjggMS43YzMuMSAwIDUuNC0xLjggNy01LjRzMi40LTEwLjcgMi40LTIxLjJsMC0xOTguNyA1NS40LTE1LjIgMCAxODYuOXptNzguOS0xODEuNmwwIDEyNy45YzAgMy42IC43IDYuOSAyLjEgMTBzMy4zIDUuOCA1LjcgOC4xIDUuMiA0LjEgOC41IDUuNCA2LjcgMi4xIDEwLjQgMi4xYzQuMiAwIDguOS0yLjMgMTQuNy02LjQgOS4yLTYuNCAxNC43LTEwLjkgMTQuNy0xNi4xbDAtMTMxIDU1LjEgMCAwIDE4MS42LTU1LjEgMCAwLTE2LjljLTcuMyA2LjEtMTUgMTEtMjMuMiAxNC43cy0xNi4yIDUuNi0yMy45IDUuNmMtOSAwLTE3LjQtMS41LTI1LjEtNC41cy0xNC41LTctMjAuMy0xMi4yLTEwLjQtMTEuMi0xMy43LTE4LjFjLTMuMy02LjktNS0xNC4zLTUtMjIuMmwwLTEyNy45IDU1LjEgMHpNMzkxLjQgNDA2LjVsLTU0LjkgMCAwLTI1NC42IDU0LjktMTUuMiAwIDI2OS44em0yMi45LTE3MS43bDU1LjEtMTUuMiAwIDE4Ni45LTU1LjEgMCAwLTE3MS43em0xNzAuMyA3Ny45Yy01LjMgMi4zLTEwLjcgNC45LTE2LjEgNy45cy0xMC4zIDYuMi0xNC43IDkuOC04IDcuMy0xMC44IDExLjQtNC4xIDguMi00LjEgMTIuNmMwIDMuNCAuNCA2LjYgMS4zIDkuOHMyLjEgNS44IDMuOCA4LjEgMy40IDQuMSA1LjMgNS40IDQgMi4xIDYuMyAyLjFjNC41IDAgOS4xLTEuNCAxMy43LTQuMXM5LjctNi4yIDE1LjQtMTAuNGwwLTUyLjV6TTY0MCA0MDYuNWwtNTUuNCAwIDAtMTQuNWMtMy4xIDIuNi02IDUtOC45IDcuMXMtNi4yIDQuMS05LjggNS43LTcuNyAyLjktMTIuMiAzLjhjLTQuNSAuOS05LjggMS4zLTE1LjkgMS4zLTguNCAwLTE1LjktMS4yLTIyLjYtMy42LTYuNy0yLjQtMTIuNC01LjctMTctOS45cy04LjMtOS4xLTEwLjgtMTQuOWMtMi41LTUuNy0zLjgtMTItMy44LTE4LjcgMC02LjkgMS4zLTEzLjIgNC0xOC45IDIuNy01LjYgNi4zLTEwLjcgMTAuOS0xNS4yIDQuNi00LjUgOS45LTguNSAxNi4xLTEyLjFzMTIuNy02LjggMTkuNy05LjggMTQuMy01LjcgMjEuOS04LjIgMTUuMS00LjkgMjIuNS03LjFsNi0xLjUgMC0xNy45YzAtMTEuNi0yLjItMTkuOC02LjYtMjQuN3MtMTAuNC03LjMtMTcuOC03LjNjLTguNyAwLTE0LjggMi4xLTE4LjEgNi4zcy01LjEgOS4zLTUuMSAxNS4yYzAgMy40LS40IDYuNy0xLjEgOS45LS43IDMuMi0yIDYtMy43IDguNXMtNC4zIDQuNC03LjYgNS44Yy0zLjMgMS41LTcuNSAyLjItMTIuNSAyLjItNy43IDAtMTQtMi4yLTE4LjktNi42LTQuOC00LjQtNy4zLTEwLTcuMy0xNi44IDAtNi4zIDIuMS0xMi4xIDYuNC0xNy41IDQuMy01LjQgMTAtMTAgMTcuMy0xMy45IDcuMy0zLjkgMTUuNi02LjkgMjUuMS05LjJzMTkuNi0zLjQgMzAuMi0zLjRjMTMuMSAwIDI0LjMgMS4yIDMzLjcgMy41czE3LjIgNS43IDIzLjMgMTAgMTAuNiA5LjYgMTMuNSAxNS43IDQuNCAxMyA0LjQgMjAuNmwwIDEzNi4xek02MCAxNzIuOWEzNy40IDM3LjQgMCAxIDEgNzQuOSAwIDM3LjQgMzcuNCAwIDEgMSAtNzQuOSAwek00NTIuMiA5NWEzNy40IDM3LjQgMCAxIDEgNzQuOSAwIDM3LjQgMzcuNCAwIDEgMSAtNzQuOSAwem00NSA3Ny45YTM3LjQgMzcuNCAwIDEgMSA3NC45IDAgMzcuNCAzNy40IDAgMSAxIC03NC45IDB6bS04OS45IDBhMzcuNCAzNy40IDAgMSAxIDc0LjkgMCAzNy40IDM3LjQgMCAxIDEgLTc0LjkgMHoiXQogICAgfTsKICAgIGZhTmZjRGlyZWN0aW9uYWwgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibmZjLWRpcmVjdGlvbmFsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1MzAiLCAiTTIxMS44IDQ4OC42YzEuNiAyLjUgMi4xIDUuNiAxLjQgOC41LS42IDIuOS0yLjQgNS41LTQuOSA3LjEtMi42IDEuNi01LjYgMi4xLTguNiAxLjUtNjEuNC0xMy45LTExNS42LTQ5LjktMTUyLjItMTAxLjJTLTUuNCAyOTAuMyAxLjYgMjI3LjdjNy02Mi43IDM2LjgtMTIwLjUgODMuNy0xNjIuNSA0Ni45LTQyIDEwNy43LTY1LjIgMTcwLjctNjUuMiAxLjUgMCAyLjEgLjMgNC4zIC45IDEuNCAuNiAxLjggMS40IDMuNyAyLjUgMS4xIDEuMSAxLjkgMi4zIDIuNSAzLjcgLjUgMS40IC44IDIuOCAuOCA0LjNsMCAxMDEgMjQuNS0yNS45YzEtMS4xIDIuMi0yIDMuNi0yLjYgMS4zLS42IDIuOC0uOSA0LjMtMSAxLjUtLjEgMi45IC4yIDQuMyAuN3MyLjcgMS4zIDMuOCAyLjRjMSAxIDEuOSAyLjIgMi41IDMuNiAuNiAxLjMgMSAyLjggMSA0LjNzLS4yIDMtLjcgNC4zYy0uNiAxLjQtMS40IDIuNi0yLjQgMy43bC00NCA0Ni42Yy0xLjEgMS4xLTIuMyAyLTMuNyAyLjYtMS41IC42LTMgLjktNS40IC45LS42IDAtMi4yLS4zLTMuNi0uOXMtMi43LTEuNS0zLjctMi42bC00NC4xLTQ2LjZjLTItMi4yLTMuMS01LjEtMy04LjEgMC0zIDEuMy02LjcgMy41LTcuOSAyLjItMi4xIDUuMS0zLjIgOC4xLTMuMSAzIC4xIDUuOCAxLjMgNy45IDMuNWwyNC41IDI2IDAtODkuNWMtNTYuNCAyLjgtMTA5LjggMjUuOC0xNTAuNSA2NS00MC42IDM5LjEtNjUuNyA5MS43LTcwLjYgMTQ3LjlTMzQuNCAzNDguMSA2Ny43IDM5My43YzMyLjQgNDUuNSA4MiA3Ny41IDEzNyA4OS45IDIuOSAuNyA1LjUgMi41IDcuMSA1ek0xNzEuNCAxMjYuMWMtLjggMS4zLTEuOSAyLjQtMy4xIDMuMi0yMC41IDEzLjktMzcuMiAzMi42LTQ4LjggNTQuNXMtMTcuNyA0Ni4zLTE3LjcgNzEuMSA2LjEgNDkuMiAxNy43IDcwLjJjMTEuNiAyMi44IDI4LjMgNDEuNSA0OC44IDU1LjQgMi41IDEuNyA0LjIgNC4zIDQuNyA3LjMgLjYgMi45LS45IDYtMS43IDguNC0xLjcgMi41LTUuMiA0LjItNy4zIDMuOS0yLjkgMS40LTYgLjgtOC40LS45LTIzLjYtMTYtNDIuOC0zNy41LTU2LjEtNjIuNy0xMy4zLTI1LjEtMjAuMy01My4xLTIwLjMtODEuNiAwLTI4LjQgNy01Ni41IDIwLjMtODEuNiAxMy4zLTI1LjIgMzIuNS00Ni43IDU2LjEtNjIuNyAxLjItLjggMi42LTEuNCA0LTEuOCAxLjUtLjMgMy0uMyA0LjUgMCAxLjQgLjIgMi44IC44IDQuMSAxLjZzMi4zIDEuOSAzLjIgMy4xYy44IDEuMiAxLjQgMi42IDEuNyA0LjFzLjMgMyAwIDQuNGMtLjMgMS41LS44IDIuOS0xLjcgNC4xek0zNDAuOSAzODMuNWMuOC0xLjIgMS45LTIuMyAyLjItMy4xbDAtLjFjMjEuMy0xNCAzOC0zMi43IDQ5LjYtNTQuNiAxMS41LTIxLjggMTcuNS00Ni4yIDE3LjUtNzAuOXMtNi00OS4xLTE3LjUtNzFjLTExLjYtMjIuNy0yOC4zLTQwLjUtNDkuNi01NC41LS4zLS44LTEuNC0xLjktMi4yLTMuMS0uOC0xLjMtMS40LTIuNy0xLjYtNC4xLTEuMi0xLjUtLjMtMyAwLTQuNCAuMy0xLjUgLjktMi45IDEuNy00LjEgLjktMS4yIDEuMS0yLjMgMy4yLTMuMSAxLjItLjggMi42LTEuMyA0LjEtMS42czIuOS0uMyA0LjQgMCAyLjggLjkgNC4xIDEuOGMyMy40IDE2IDQyLjcgMzcuNSA1NS45IDYyLjYgMTMuMyAyNS4xIDE5LjQgNTMuMSAxOS40IDgxLjUgMCAyOC41LTYuMSA1Ni41LTE5LjQgODEuNi0xMy4yIDI1LjEtMzIuNSA0Ni42LTU1LjkgNjIuNi0xLjMgLjktMi42IDEuNS00LjEgMS44cy0yLjkgLjMtNC40IDAtMi45LTEuNy00LjEtMS42Yy0yLjEtLjgtMi4zLTEuOS0zLjItMy4xLS44LTEuMi0xLjQtMi42LTEuNy00LjEtLjMtMS40LTEuMi0yLjkgMC00LjQgLjItMS40IC44LTIuOCAxLjYtNC4xek0zMTIuMyA2LjNjNTYuMiAxMi43IDEwNi40IDQ0IDE0Mi43IDg4LjcgMzAuNCAzNy42IDQ5LjYgODMgNTUuMyAxMzEgNS42IDQ4LTIuNCA5Ni43LTIzLjIgMTQwLjMtMjAuOSA0My42LTUzLjYgODAuNS05NC41IDEwNi4zLTQwLjkgMjUuNy04OC4yIDM5LjQtMTM2LjYgMzkuNC0xLjUgMC0yLjktLjMtNC4zLS45LTEuNC0uNS0yLjYtMS40LTMuNy0yLjQtMS45LTEuMS0xLjktMi4zLTIuNC0zLjctLjYtMS40LS45LTIuOC0uOS00LjNsMC05OS4yLTI0LjUgMjZjLTIuMSAyLjItNC45IDIuNi03LjkgMy42LTMgLjEtNS45LTEuMS04LjEtNC0yLjItMS4yLTMuNS00LTMuNS03LS4xLTMgMS01LjkgMy04LjFsNDQuMS00Ni42YzEuMy0yLjIgNS4xLTMuNCA3LjMtMy40IDQgMCA2LjkgMS4yIDkuMSAzLjRsNDQgNDYuNmMyLjEgMi4yIDMuMiA1LjEgMy4xIDguMXMtMS40IDUuOC0zLjUgN2MtMi4yIDIuOS01LjEgNC4xLTguMSA0LTMtMS01LjktMS40LTcuOS0zLjZsLTI0LjUtMjUuOSAwIDg3LjVjNTYuNC0yLjggMTA5LjgtMjUuOCAxNTAuNS02NSA0MC43LTQwIDY1LjgtOTEuNyA3MC43LTE0Ny45IDQuOC01Ny4xLTEwLjgtMTEyLjMtNDQuMS0xNTcuOS0zMy4zLTQ1LjYtODItNzcuNS0xMzctODkuOS0xLjUtLjMtMi44LS45LTQuMS0xLjgtMS4yLS45LTIuMi0xLjktMy0zLjItLjgtMS4yLTIuMi0yLjYtMS42LTQuMS0uMi0xLjUtLjItMyAuMS00LjQgLjQtMS40IDEtMi44IDEuOC00IC45LTEuMiAyLTIuMiAzLjItMyAxLjMtLjggMi43LTEuMyA0LjEtMS42IDEuNS0uMyAzLS4yIDQuNCAuMXptNDAuOCAyNDkuOGMwIDMxLjQtMTcuNSA2MS4xLTQ5LjMgODMuNS0yLjEgMS41LTQuOCAyLjMtNy40IDItMi43LS4yLTUuMi0xLjMtNy0zLjJsLTcwLjEtNjkuOGMtMi4yLTIuMS00LjItNS0zLjQtOCAwLTMgMS4yLTUuOSAzLjMtOCAyLjItMi4xIDUtMy4zIDgtMy4zczUuOSAxLjIgOCAzLjNsNjMuMSA2Mi44YzIwLjgtMTcuMSAzMi4yLTM3LjkgMzIuMi01OS4zIDAtMjMuOS0xNC4xLTQ3LTM5LjctNjUuMS0yLjUtMS43LTQuMS00LjMtNC42LTcuMy0uNS0yLjkgLjEtNiAxLjktOC40IDEuNy0yLjUgNC4zLTQuMSA3LjMtNC42IDIuOS0uNSA2IC4xIDguNCAxLjkgMzEuOCAyMi40IDQ5LjMgNTIuMSA0OS4zIDgzLjV6TTIxNi43IDM0MS41Yy0zIC41LTYtLjItOC41LTEuOS0zMS43LTIyLjQtNTAuMS01Mi4xLTUwLjEtODMuNXMxOC40LTYxLjEgNTAuMS04My41YzIuMi0xLjYgNC45LTIuMyA3LjUtMi4xIDIuNyAuMyA1LjEgMS40IDcgMy4zbDcwLjEgNjkuOGMyLjEgMi4xIDMuMyA1IDMuMyA4cy0yIDUuOC0zLjMgOGMtMi4xIDIuMS01IDMuMy03LjkgMy4zLTMgMC02LjgtMS4yLTgtMy4zbC02My4xLTYyLjljLTIwLjkgMTcuMy0zMi4yIDM4LTMyLjIgNTkuNCAwIDIzIDE0LjEgNDcgMzkuNyA2NSAyLjQgMS44IDQuMSA0LjQgNC42IDcuNCAuNSAyLjktLjIgNS45LTEuOSA4LjQtMS43IDIuNC00LjQgNC4xLTcuMyA0LjZ6Il0KICAgIH07CiAgICBmYUNyZWF0aXZlQ29tbW9uc0J5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNyZWF0aXZlLWNvbW1vbnMtYnkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjRlNyIsICJNMzIyLjkgMTk0LjRsMCAxMDEuNC0yOC4zIDAgMCAxMjAuNS03Ny4xIDAgMC0xMjAuNC0yOC4zIDAgMC0xMDEuNWMwLTQuNCAxLjYtOC4yIDQuNi0xMS4zIDMuMS0zLjEgNi45LTQuNyAxMS4zLTQuN2wxMDEuOSAwYzQuMSAwIDcuOCAxLjYgMTEuMSA0LjcgMy4xIDMuMiA0LjggNi45IDQuOCAxMS4zem0tMzIuNS02NC41YTM0LjUgMzQuNSAwIDEgMSAtNjkgLjggMzQuNSAzNC41IDAgMSAxIDY5LS44ek0yNTUuNiA4QzM5Ny40IDggNTA0IDExOC4xIDUwNCAyNTYgNTA0IDQwMy4xIDM4NS41IDUwNCAyNTUuNiA1MDQgMTIxLjYgNTA0IDggMzk0LjUgOCAyNTYgOCAxMjMuMSAxMTIuNyA4IDI1NS42IDh6bS44IDQ0LjdjLTExOC4yIDAtMjAzLjcgOTcuOS0yMDMuNyAyMDMuMyAwIDEwOS44IDkxLjIgMjAyLjggMjAzLjcgMjAyLjggMTAzLjIgMCAyMDIuOC04MS4xIDIwMi44LTIwMi44IC4xLTExMy44LTkwLjItMjAzLjMtMjAyLjgtMjAzLjN6Il0KICAgIH07CiAgICBmYVVtYnJhY28gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidW1icmFjbyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmOGU4IiwgIk0yNTYuMyA4YTI0OCAyNDggMCAxIDAgLS43IDQ5NiAyNDggMjQ4IDAgMSAwIC43LTQ5NnptMTQ1IDI2NmMtLjggMjcuMS01LjQgNDguOC0xNCA2NXMtMjMuMSAyNy45LTQzLjUgMzVjLTIwLjQgNy4xLTQ4LjkgMTAuNi04NS40IDEwLjVsLTQuNiAwYy0zNi41IC4xLTY1LTMuMy04NS40LTEwLjVzLTM0LjktMTguOC00My41LTM1Yy04LjYtMTYuMi0xMy4yLTM3LjktMTQtNjUtLjctMTAuMi0uNy0yMC41IDAtMzAuNyAuNC0xNC43IDEuNi0yOS4zIDMuNi00My45IDEuOS0xMy40IDMuNi0yMi42IDUuNC0zMiAxLTQuOSAxLjMtNi40IDEuOC04LjQgLjMtMS4xIC45LTIuMSAxLjgtMi44czItMS4xIDMuMS0xLjFsLjcgMCAzMiA1YzEuMiAuMiAyLjIgLjggMyAxLjdzMS4yIDIuMSAxLjIgMy4zYzAgLjMgMCAuNSAwIC44bC0xLjcgOC44Yy0xLjYgOC44LTMuMiAyMC4xLTQuOCAzMy43LTEuNyAxNC0yLjUgMjguMS0yLjYgNDIuMi0uMiAyNyAyLjUgNDYuOSA4LjEgNTkuOCAyLjggNi40IDcuMiAxMiAxMi42IDE2LjRzMTEuOSA3LjQgMTguNyA4LjhjMTguOCA0IDM4LjEgNS43IDU3LjMgNS4xbDEwLjMgMGMxOS4yIC42IDM4LjUtMS4yIDU3LjMtNS4yIDYuOC0xLjQgMTMuMi00LjUgMTguNi04LjhzOS43LTEwIDEyLjUtMTYuNGM1LjctMTIuOSA4LjQtMzIuOSA4LjEtNTkuOC0uMS0xNC4xLTEtMjguMi0yLjYtNDIuMS0xLjctMTMuNi0zLjMtMjQuOC00LjktMzMuN2wtMS43LTguOGMwLS4zIDAtLjUgMC0uOCAwLTEuMiAuNC0yLjQgMS4yLTMuM3MxLjgtMS41IDMtMS43bDMyLTUgLjggMGMxLjEgMCAyLjIgLjQgMy4xIDEuMXMxLjUgMS43IDEuOCAyLjhjLjYgMiAuOCAzLjYgMS44IDguNCAxLjggOS42IDMuNSAxOC44IDUuNCAzMiAyIDE0LjYgMy4yIDI5LjIgMy42IDQzLjkgLjcgMTAuMiAuNyAyMC41IDAgMzAuN2wwIDB6Il0KICAgIH07CiAgICBmYUhvb2xpID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImhvb2xpIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY0MjciLCAiTTE0NC41IDM1MmwzOC4zIC44Yy0xMy4yLTQuNi0yNi0xMC4yLTM4LjMtMTYuOGwwIDE2em01Ny43LTUuM2wwIDUuMy0xOS40IC44YzM2LjUgMTIuNSA2OS45IDE0LjIgOTQuNyA3LjItMTkuOSAuMi00NS44LTIuNi03NS4zLTEzLjN6TTYxMS4xIDIzMS41YzE1LjkgMCAyOC45LTEyLjkgMjguOS0yOC45cy0xMi45LTI0LjUtMjguOS0yNC41Yy0xNS45IDAtMjguOSA4LjYtMjguOSAyNC41czEyLjkgMjguOSAyOC45IDI4Ljl6TTU4Mi4xIDM1Mmw1Ny45IDAgMC0xMTAuNS01Ny45IDAgMCAxMTAuNXptLTczLjcgMGw1Ny45IDAgMC0xOTUuMy01Ny45IDI3LjMgMCAxNjh6bS0zMS0xMTkuNGMtMTguMi0xOC4yLTUwLjQtMTcuMS01MC40LTE3LjFzLTMyLjMtMS4xLTUwLjQgMTcuMWMtMTguMiAxOC4yLTE2LjggMzMuOS0xNi44IDUyLjZzLTEuNCAzNC4zIDE2LjggNTIuNSA1MC40IDE3LjEgNTAuNCAxNy4xIDMyLjMgMS4xIDUwLjQtMTcuMWMxOC4yLTE4LjIgMTYuOC0zMy44IDE2LjgtNTIuNS0uMS0xOC44IDEuMy0zNC41LTE2LjgtNTIuNnptLTM5LjggNzEuOWMwIDMuNi0xLjggMTIuNS0xMC43IDEyLjVzLTEwLjctOC45LTEwLjctMTIuNWwwLTQwLjRjMC04LjcgNy4zLTEwLjkgMTAuNy0xMC45czEwLjcgMi4xIDEwLjcgMTAuOWwwIDQwLjR6TTMzMS40IDIzMi42Yy0xOC4yLTE4LjItNTAuNC0xNy4xLTUwLjQtMTcuMXMtMzIuMi0xLjEtNTAuNCAxNy4xYy0xLjkgMS45LTMuNyAzLjktNS4zIDYtMzguMi0yOS42LTcyLjUtNDYuNS0xMDIuMS02MS4xbDAtMjAuNy0yMi41IDEwLjZjLTU0LjQtMjIuMS04OS0xOC4yLTk3LjMgLjEgMCAwLTI0LjkgMzIuOCA2MS44IDExMC44bDAgNzMuNyA1Ny45IDAgMC0yOC42Yy02LjUtNC4yLTEzLTguNy0xOS40LTEzLjYtMTQuOC0xMS4yLTI3LjQtMjEuNi0zOC40LTMxLjRsMC0zMWMxMy4xIDE0LjcgMzAuNSAzMS40IDUzLjQgNTAuM2w0LjUgMy42IDAtMjkuOGMwLTYuOSAxLjctMTguMiAxMC44LTE4LjJzMTAuNiA2LjkgMTAuNiAxNWwwIDQ4LjdjMTggMTIuMiAzNy4zIDIyLjEgNTcuNyAyOS42bDAtOTMuOWMwLTE4LjctMTMuNC0zNy40LTQwLjYtMzcuNC0xNS44LS4xLTMwLjUgOC4yLTM4LjUgMjEuOWwwLTU0LjNjNDEuOSAyMC45IDgzLjkgNDYuNSA5OS45IDU4LjMtMTAuMiAxNC42LTkuMyAyOC4xLTkuMyA0My43IDAgMTguNy0xLjQgMzQuMyAxNi44IDUyLjVzNTAuNCAxNy4xIDUwLjQgMTcuMSAzMi4zIDEuMSA1MC40LTE3LjFjMTguMi0xOC4yIDE2LjctMzMuOCAxNi43LTUyLjUgMC0xOC41IDEuNS0zNC4yLTE2LjctNTIuM3pNNjUuMiAxODRsMCA2My4zYy00OC43LTU0LjUtMzguOS03Ni0zNS4yLTc5LjEgMTMuNS0xMS40IDM3LjUtOCA2NC40IDIuMUw2NS4yIDE4NHpNMjkxLjcgMzA0LjVjMCAzLjYtMS44IDEyLjUtMTAuNyAxMi41cy0xMC43LTguOS0xMC43LTEyLjVsMC00MC40YzAtOC43IDcuMy0xMC45IDEwLjctMTAuOXMxMC43IDIuMSAxMC43IDEwLjlsMCA0MC40eiJdCiAgICB9OwogICAgZmFTcXVhcmVHaXQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLWdpdCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJnaXQtc3F1YXJlIl0sICJmMWQyIiwgIk0xMjAuOCAzMzUuNWMtNS45LS40LTEyLjYtLjgtMjAuMi0xLjMtMy4zIDQuMS02LjYgOC40LTYuNiAxMy41IDAgMTguNSA2NS41IDE4LjUgNjUuNS0xLjUgMC04LjMtNy40LTguNy0zOC44LTEwLjdsLjEgMHptNy44LTExNy45Yy0zMi4zIDAtMzMuNyA0NC41LS43IDQ0LjUgMzIuNSAwIDMxLjctNDQuNSAuNy00NC41ek0zODQgMzJMNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NHpNMjQzLjkgMTcyLjJjLTE0LjUgMC0yMi45LTguNC0yMi45LTIyLjlzOC40LTIyLjMgMjIuOS0yMi4zYzE0LjcgMCAyMy4xIDcuOCAyMy4xIDIyLjNzLTguNCAyMi45LTIzLjEgMjIuOXpNMTQ5LjYgMTk1bDQ5LjUgMCAwIDIxLjYtMjMuNCAxLjhjNC42IDUuOCA5LjQgMTQgOS40IDI1LjcgMCA0OC43LTU3LjIgNDcuMi03NC4yIDQyLjRsLTguNCAxMy40YzUgLjMgOS44IC42IDE0LjMgLjggNTYuMyAzLjIgODAuNSA0LjYgODAuNSAzOC41IDAgMjkuMi0yNS43IDQ1LjctNjkuOSA0NS43LTQ2IDAtNjMuNS0xMS42LTYzLjUtMzEuNyAwLTExLjQgNS4xLTE3LjUgMTQtMjUuOS04LjQtMy41LTExLjItOS45LTExLjItMTYuOCAwLTkuNiA3LjQtMTYuMyAyMy0zMC42bC4yLS4yYy0xMi40LTYuMS0yMS44LTE5LjMtMjEuOC0zOC4xIDAtNTEuNiA1Ni42LTUzLjMgODEuNi00Ni44bC0uMSAuMnpNMjcwLjUgMzAzLjFsMTMgMS44IDAgMjAuMS03Mi40IDAgMC0yMC4xYzIuNy0uNCA1LS43IDYuOS0uOSA5LjktMS4yIDEwLjEtMS4zIDEwLjEtNmwwLTc0LjdjMC00LjQtLjktNC43LTEwLjEtNy44LTEuOS0uNy00LjItMS40LTYuOS0yLjRsMi44LTIwLjYgNTIuNiAwIDAgMTA1LjVjMCA0LjEgLjIgNC42IDQuMSA1LjFsLS4xIDB6bTEwNi42LTEwLjRMMzg0IDMxNWMtMTAuOSA1LjQtMjYuOSAxMC4yLTQxLjQgMTAuMi0zMC4yIDAtNDEuNy0xMi4yLTQxLjctNDAuOWwwLTY2LjZjMC0uOCAwLTEuNC0uMi0xLjgtLjgtMS4yLTQuMi0uNy0xOS42LS43bDAtMjIuNmMyMi4zLTIuNSAzMS4yLTEzLjcgMzQtNDEuNGwyNC4yIDBjMCAzMy4zLS42IDM4IC43IDM4LjYgLjMgLjEgLjcgMCAxLjMgMGwzNS44IDAgMCAyNS40LTM3LjggMCAwIDYxLjZjLS4yIDYuMy0uOSAzMC40IDM3LjkgMTUuOWwtLjEgMHoiXQogICAgfTsKICAgIGZhR2l0U3F1YXJlID0gZmFTcXVhcmVHaXQ7CiAgICBmYU9kbm9rbGFzc25pa2kgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAib2Rub2tsYXNzbmlraSIsCiAgICAgIGljb246IFszMjAsIDUxMiwgW10sICJmMjYzIiwgIk0yNzUuMSAzMzRjLTI3LjQgMTcuNC02NS4xIDI0LjMtOTAgMjYuOWwyMC45IDIwLjYgNzYuMyA3Ni4zYzI3LjkgMjguNi0xNy41IDczLjMtNDUuNyA0NS43LTE5LjEtMTkuNC00Ny4xLTQ3LjQtNzYuMy03Ni42TDg0IDUwMy40Yy0yOC4yIDI3LjUtNzMuNi0xNy42LTQ1LjQtNDUuNyAxOS40LTE5LjQgNDcuMS00Ny40IDc2LjMtNzYuM2wyMC42LTIwLjZjLTI0LjYtMi42LTYyLjktOS4xLTkwLjYtMjYuOS0zMi42LTIxLTQ2LjktMzMuMy0zNC4zLTU5IDcuNC0xNC42IDI3LjctMjYuOSA1NC42LTUuNyAwIDAgMzYuMyAyOC45IDk0LjkgMjguOVMyNTUgMjY5LjIgMjU1IDI2OS4yYzI2LjktMjEuMSA0Ny4xLTguOSA1NC42IDUuNyAxMi40IDI1LjctMS45IDM4LTM0LjUgNTkuMXptMTQuNi0yMDQuN2ExMjkuNyAxMjkuNyAwIDEgMSAtMjU5LjQgLjQgMTI5LjcgMTI5LjcgMCAxIDEgMjU5LjQtLjR6bS0xOTMuNCAuNGE2My43IDYzLjcgMCAxIDAgMTI3LjQtLjQgNjMuNyA2My43IDAgMSAwIC0xMjcuNCAuNHoiXQogICAgfTsKICAgIGZhRHJ1cGFsID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImRydXBhbCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMWE5IiwgIk0yNzIuMyAxMDguMUMyMzYuNSA3Mi41IDIwMi41IDM4LjQgMTkyLjQgMCAxODIuNCAzOC40IDE0OC4xIDcyLjUgMTEyLjQgMTA4LjEgNTguOCAxNjEuNy0xLjkgMjIyLjQtMS45IDMxMy40LTQuMyA0MjAuNyA4MC44IDUwOS42IDE4OC4xIDUxMnMxOTYuMi04Mi44IDE5OC41LTE5MC4xYy4xLTIuOCAuMS01LjYgMC04LjUgMC05MS4xLTYwLjgtMTUxLjctMTE0LjMtMjA1LjN6TTk4IDMzMS4xYy01LjkgNy41LTExIDE1LjYtMTUuMiAyNC4yLS4zIC43LS44IDEuMy0xLjMgMS44cy0xLjIgLjgtMiAxbC0xLjcgMGMtNC4zIDAtOS4yLTguNS05LjItOC41LTEuMy0yLTIuNS00LjItMy43LTYuNGwtLjgtMS44Yy0xMS4yLTI1LjctMS41LTYyLjMtMS41LTYyLjMgNC44LTE3LjggMTIuNy0zNC43IDIzLjItNDkuOSA2LjQtOS42IDEzLjUtMTguOSAyMS0yNy43bDkuMiA5LjIgNDMuNSA0NC40Yy44IC45IDEuMyAyLjEgMS4zIDMuM3MtLjUgMi40LTEuMyAzLjNMMTE0LjEgMzEyLjMgOTggMzMxLjF6bTk2LjYgMTI3LjNjLTEyLjktLjEtMjUuNi0zLjktMzYuNC0xMXMtMTkuNC0xNy4xLTI0LjYtMjguOS03LTI0LjktNS0zNy43IDcuNi0yNC43IDE2LjItMzQuNGMxNC4yLTE2LjkgMzEuNS0zMy41IDUwLjMtNTUuMyAyMi4zIDIzLjggMzYuOSA0MC4xIDUxLjIgNTggMS4xIDEuNCAyLjEgMi45IDMgNC40IDcuOCAxMS4xIDEyIDI0LjQgMTIgMzggMCA4LjgtMS43IDE3LjQtNSAyNS41cy04LjIgMTUuNS0xNC40IDIxLjctMTMuNSAxMS4xLTIxLjYgMTQuNS0xNi43IDUuMS0yNS41IDUuMWwtLjIgMHpNMzIwLjcgMzUxLjZjLS40IDEuNC0xLjIgMi42LTIuMyAzLjZzLTIuNCAxLjYtMy44IDEuOGwtMS4zIDBjLTIuNi0uOS00LjktMi43LTYuMy01LjEtMTEuNi0xNy41LTI0LjktMzMuOS0zOS41LTQ5bC0xNy44LTE4LjQtNTkuMS02MS4zYy0xMi40LTExLjUtMjQuMi0yMy42LTM1LjQtMzYuMy0uMy0uNS0uNi0uOS0uOS0xLjQtMi0yLjgtMy42LTUuOS00LjctOS4ybDAtMS44Yy0uOC01LS40LTEwLjEgMS4yLTE1czQuNC05LjIgOC0xMi43YzExLjQtMTEuNCAyMy0yMyAzMy44LTM0LjkgMTIgMTMuMyAyNC44IDI2IDM3LjQgMzguNiAyNS44IDI0IDQ5LjEgNTAuNSA2OS42IDc5LjEgMTcuMyAyNC41IDI2LjcgNTMuOCAyNyA4My44LS4xIDEyLjktMi4yIDI1LjgtNiAzOC4yeiJdCiAgICB9OwogICAgZmFCbG9nZ2VyQiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJibG9nZ2VyLWIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjM3ZCIsICJNNDQ2LjYgMjIyLjdjLTEuOC04LTYuOC0xNS40LTEyLjUtMTguNS0xLjgtMS0xMy0yLjItMjUtMi43LTIwLjEtLjktMjIuMy0xLjMtMjguNy01LTEwLjEtNS45LTEyLjgtMTIuMy0xMi45LTI5LjUtLjEtMzMtMTMuOC02My43LTQwLjktOTEuMy0xOS4zLTE5LjctNDAuOS0zMy02NS41LTQwLjUtNS45LTEuOC0xOS4xLTIuNC02My4zLTIuOS02OS40LS44LTg0LjggLjYtMTA4LjQgMTAtNDMuNSAxNy4yLTc0LjcgNTMuOC04Ni4xIDEwMC42LTIuMSA4LjgtMi42IDIyLjktMy4xIDEwMy45LS42IDEwMS41IC4xIDExNi40IDYuNCAxMzYuNSAxNS42IDQ5LjYgNTkuOSA4Ni4zIDEwNC40IDk0LjMgMTQuOCAyLjcgMTk3LjMgMy4zIDIxNiAuOCAzMi41LTQuNCA1OC0xNy41IDgxLjktNDEuOSAxNy4zLTE3LjcgMjguMS0zNi44IDM1LjItNjIuMSA0LjktMTcuNiA0LjUtMTQyLjggMi41LTE1MS43ek0xMjQuNSAxNTkuMWM3LjgtNy45IDEwLTguMiA1OC44LTguMiA0My45IDAgNDUuNCAuMSA1MS44IDMuNCA5LjMgNC43IDEzLjQgMTEuMyAxMy40IDIxLjkgMCA5LjUtMy44IDE2LjItMTIuMyAyMS42LTQuNiAyLjktNy4zIDMuMS01MC4zIDMuMy0yNi41IC4yLTQ3LjctLjQtNTAuOC0xLjItMTYuNi00LjctMjIuOC0yOC41LTEwLjYtNDAuOHpNMzE2LjMgMzU4LjlsLTE0LjkgMi40LTc3LjUgLjljLTY4LjEgLjgtODcuMy0uNC05MC45LTItNy4xLTMuMS0xMy44LTExLjctMTQuOS0xOS40LTEuMS03LjMgMi42LTE3LjMgOC4yLTIyLjQgNy4xLTYuNCAxMC4yLTYuNiA5Ny4zLTYuNyA4OS42LS4xIDg5LjEtLjEgOTcuNiA3LjggMTIuMSAxMS4zIDkuNSAzMS4yLTQuOSAzOS40eiJdCiAgICB9OwogICAgZmFJbnZpc2lvbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJpbnZpc2lvbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmN2IwIiwgIk00MDcuNCAzMkw0MC42IDMyQzE4LjIgMzIgMCA1MC4yIDAgNzIuNkwwIDQzOS40QzAgNDYxLjggMTguMiA0ODAgNDAuNiA0ODBsMzY2LjggMGMyMi40IDAgNDAuNi0xOC4yIDQwLjYtNDAuNmwwLTM2Ni44QzQ0OCA1MC4yIDQyOS44IDMyIDQwNy40IDMyek0xNzYuMSAxNDUuNmMuNCAyMy40LTIyLjQgMjcuMy0yNi42IDI3LjQtMTQuOSAwLTI3LjEtMTItMjcuMS0yNyAuMS0zNS4yIDUzLjEtMzUuNSA1My43LS40ek0zMzIuOCAzNzdjLTY1LjYgMC0zNC4xLTc0LTI1LTEwNi42IDE0LjEtNDYuNC00NS4yLTU5LTU5LjkgLjdsLTI1LjggMTAzLjMtNDUuMSAwIDguMS0zMi41Yy0zMS41IDUxLjgtOTQuNiA0NC40LTk0LjYtNC4zIC4xLTE0LjMgLjktMTQgMjMtMTA0LjFsLTMxLjggMCA5LjctMzUuNiA3Ni40IDBjLTMzLjYgMTMzLjctMzIuNiAxMjYuOS0zMi45IDEzOC4yIDAgMjAuOSA0MC45IDEzLjUgNTcuNC0yMy4ybDE5LjgtNzkuNC0zMi4zIDAgOS43LTM1LjYgNjguOCAwLTguOSA0MC41YzQwLjUtNzUuNSAxMjcuOS00Ny44IDEwMS44IDM4LTE0LjIgNTEuMS0xNC42IDUwLjctMTQuOSA1OC44IDAgMTUuNSAxNy41IDIyLjYgMzEuOC0xNi45TDM4NiAzMjVjLTEwLjUgMzYuNy0yOS40IDUyLTUzLjIgNTJ6Il0KICAgIH07CiAgICBmYUZhY2Vib29rRiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlYm9vay1mIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbXSwgImYzOWUiLCAiTTgwIDI5OS4zbDAgMjEyLjcgMTE2IDAgMC0yMTIuNyA4Ni41IDAgMTgtOTcuOC0xMDQuNSAwIDAtMzQuNmMwLTUxLjcgMjAuMy03MS41IDcyLjctNzEuNSAxNi4zIDAgMjkuNCAuNCAzNyAxLjJsMC04OC43QzI5MS40IDQgMjU2LjQgMCAyMzYuMiAwIDEyOS4zIDAgODAgNTAuNSA4MCAxNTkuNGwwIDQyLjEtNjYgMCAwIDk3LjggNjYgMHoiXQogICAgfTsKICAgIGZhQ2VudG9zID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNlbnRvcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNzg5IiwgIk0yODkuNiA5Ny41bDMxLjYgMzEuNy03Ni4zIDc2LjUgMC0xMDguMiA0NC43IDB6TTEyNy4yIDEyOS4ybDc2LjMgNzYuNSAwLTEwOC4yLTQ0LjcgMC0zMS42IDMxLjd6bTQxLjUtNDEuNmw0NC43IDAgMCAxMjcuOSAxMC44IDEwLjggMTAuOC0xMC44IDAtMTI3LjkgNDQuNyAwLTU1LjUtNTUuNi01NS41IDU1LjZ6bTI2LjIgMTY4LjFsLTEwLjgtMTAuOC0xMjguNiAwIDAtNDQuOC01NS41IDU1LjYgNTUuNSA1NS42IDAtNDQuOCAxMjguNiAwIDEwLjgtMTAuOHpNMjc0LjIgMjM1bDEwNy45IDAgMC00NC44LTMxLjYtMzEuNy03Ni4zIDc2LjV6bTE3My4zIDIwLjdsLTU1LjUtNTUuNiAwIDQ0LjgtMTI3LjcgMC0xMC44IDEwLjggMTAuOCAxMC44IDEyNy43IDAgMCA0NC44IDU1LjUtNTUuNnpNNjUuNCAxNzYuMmwzMi41LTMxLjcgOTAuMyA5MC41IDE1LjMgMCAwLTE1LjMtOTAuMy05MC41IDMxLjYtMzEuNy03OS40IDAgMCA3OC43ek0zODIuMSA5Ny41bC03OC41IDAgMzEuNiAzMS43LTkwLjMgOTAuNSAwIDE1LjMgMTUuMyAwIDkwLjMtOTAuNSAzMS42IDMxLjcgMC03OC43ek0yMDMuNSA0MTMuOWwwLTEwOC4xLTc2LjMgNzYuNSAzMS42IDMxLjcgNDQuNyAwIDAtLjF6TTY1LjQgMjM1bDEwOC44IDAtNzYuMy03Ni41LTMyLjUgMzEuNyAwIDQ0Ljh6TTM4Mi4xIDMzNS4ybC0zMS42IDMxLjctOTAuMy05MC41LTE1LjMgMCAwIDE1LjMgOTAuMyA5MC41LTMxLjYgMzEuNyA3OC41IDAgMC03OC43em0wLTU4LjhsLTEwNy45IDAgNzYuMyA3Ni41IDMxLjYtMzEuNyAwLTQ0Ljh6TTMyMS4yIDM4Mi4ybC03Ni4zLTc2LjUgMCAxMDguMSA0NC43IDAgMzEuNi0zMS42ek05Ny45IDM1Mi45bDc2LjMtNzYuNS0xMDguOCAwIDAgNDQuOCAzMi41IDMxLjd6bTE4MS44IDcwLjlsLTQ0LjcgMCAwLTEyNy45LTEwLjgtMTAuOC0xMC44IDEwLjggMCAxMjcuOS00NC43IDAgNTUuNSA1NS42IDU1LjUtNTUuNnpNMTEzLjIgMzgyLjJsOTAuMy05MC41IDAtMTUuMy0xNS4zIDAtOTAuMyA5MC41LTMyLjUtMzEuNyAwIDc4LjcgNzkuNCAwLTMxLjYtMzEuN3oiXQogICAgfTsKICAgIGZhU2NhbGV3YXkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2NhbGV3YXkiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTg1OSIsICJNMjQzLjQgMTE3LjNsLTg0LjMgMGMtMTguNSAyLjEtMzIuNyAxNy41LTMzLjQgMzZsMCAxMjEuOWMwIDguMiAzLjIgMTUuMyA4LjUgMjAuN3MxMi41IDguNiAyMC42IDguNmMxNiAwIDI5LjItMTMuMiAyOS4yLTI5LjJsMC03Ny40YzAtMTIuMSAxMC0yMi4xIDIyLjEtMjIuMWwzOC4xIDBjOC4yIDAgMTUuMy0zLjIgMjAuNi04LjZzOC41LTEyLjggOC41LTIxYzAtMTYtMTMuOS0yOC45LTI5LjktMjguOXpNMjA1LjMgMzk1LjRsODQuMyAwYzE4LjUtMi4xIDMyLjctMTcuNSAzMy40LTM2bDAtMTIxLjljMC04LjItMy4yLTE1LjMtOC41LTIwLjdzLTEyLjUtOC42LTIwLjYtOC42Yy0xNiAwLTI5LjIgMTMuMi0yOS4yIDI5LjJsMCA3Ny40YzAgMTIuMS0xMCAyMi4xLTIyLjEgMjIuMWwtMzguMSAwYy04LjIgMC0xNS4zIDMuMi0yMC42IDguNnMtOC41IDEyLjgtOC41IDIxYy40IDE2IDEzLjkgMjguOSAyOS45IDI4Ljl6TTEwNC4zIDBMMjU3LjYgMGMxMDEgMCAxODIuNSA4MS42IDE4Mi4xIDE4Mi45bDAgMjQyLjhjLTQuNiA0Ni00MiA4Mi40LTg4LjIgODYuM0wxOTAgNTEyQzg5LjMgNTEyIDcuNSA0MzAgNy41IDMyOS4xTDcuNSA5N2MwLTUzLjUgNDMuNC05NyA5Ni44LTk3ek0zODEuNyAxODIuOWMwLTY4LjUtNTUuOS0xMjQuNC0xMjQuMi0xMjQuNGwtMTUzIDBDODMuMyA1OC41IDY2LjIgNzUuNiA2Ni4yIDk3bDAgMjMyLjFjMCA2OC44IDU1LjUgMTI0LjQgMTI0LjIgMTI0LjRsMTU4LjcgMGMxNi43LTIuMSAyOS45LTE1IDMyLjctMzEuNGwwLTIzOS4yeiJdCiAgICB9OwogICAgZmFDY0FtYXpvblBheSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjYy1hbWF6b24tcGF5IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY0MmQiLCAiTTEyNC43IDIwMS44Yy4xLTExLjggMC0yMy41IDAtMzUuM2wwLTM1LjNjMC0xLjMgLjQtMiAxLjQtMi43IDExLjUtOCAyNC4xLTEyLjEgMzguMi0xMS4xIDEyLjUgLjkgMjIuNyA3IDI4LjEgMjEuNyAzLjMgOC45IDQuMSAxOC4yIDQuMSAyNy43IDAgOC43LS43IDE3LjMtMy40IDI1LjYtNS43IDE3LjgtMTguNyAyNC43LTM1LjcgMjMuOS0xMS43LS41LTIxLjktNS0zMS40LTExLjctLjktLjgtMS40LTEuNi0xLjMtMi44em0xNTQuOSAxNC42YzQuNiAxLjggOS4zIDIgMTQuMSAxLjUgMTEuNi0xLjIgMjEuOS01LjcgMzEuMy0xMi41IC45LS42IDEuMy0xLjMgMS4zLTIuNS0uMS0zLjkgMC03LjkgMC0xMS44IDAtNC0uMS04IDAtMTIgMC0xLjQtLjQtMi0xLjgtMi4yLTctLjktMTMuOS0yLjItMjAuOS0yLjktNy0uNi0xNC0uMy0yMC44IDEuOS02LjcgMi4yLTExLjcgNi4yLTEzLjcgMTMuMS0xLjYgNS40LTEuNiAxMC44IC4xIDE2LjIgMS42IDUuNSA1LjIgOS4yIDEwLjQgMTEuMnpNNTc2IDgwbDAgMzUyYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDQ4IDQ4MGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCA4MEMwIDUzLjUgMjEuNSAzMiA0OCAzMmw0ODAgMGMyNi41IDAgNDggMjEuNSA0OCA0OHpNMzY4LjUgMTAzLjljLjQgMS43IC45IDMuNCAxLjYgNS4xIDE2LjUgNDAuNiAzMi45IDgxLjMgNDkuNSAxMjEuOSAxLjQgMy41IDEuNyA2LjQgLjIgOS45LTIuOCA2LjItNC45IDEyLjYtNy44IDE4LjctMi42IDUuNS02LjcgOS41LTEyLjcgMTEuMi00LjIgMS4xLTguNSAxLjMtMTIuOSAuOS0yLjEtLjItNC4yLS43LTYuMy0uOC0yLjgtLjItNC4yIDEuMS00LjMgNC0uMSAyLjgtLjEgNS42IDAgOC4zIC4xIDQuNiAxLjYgNi43IDYuMiA3LjUgNC43IC44IDkuNCAxLjYgMTQuMiAxLjcgMTQuMyAuMyAyNS43LTUuNCAzMy4xLTE3LjkgMi45LTQuOSA1LjYtMTAuMSA3LjctMTUuNCAxOS44LTUwLjEgMzkuNS0xMDAuMyA1OS4yLTE1MC41IC42LTEuNSAxLjEtMyAxLjMtNC42IC40LTIuNC0uNy0zLjYtMy4xLTMuNy01LjYtLjEtMTEuMSAwLTE2LjcgMC0zLjEgMC01LjMgMS40LTYuNCA0LjMtLjQgMS4xLS45IDIuMy0xLjMgMy40bC0yOS4xIDgzLjdjLTIuMSA2LjEtNC4yIDEyLjEtNi41IDE4LjYtLjQtLjktLjYtMS40LS44LTEuOS0xMC44LTI5LjktMjEuNi01OS45LTMyLjQtODkuOC0xLjctNC43LTMuNS05LjUtNS4zLTE0LjItLjktMi41LTIuNy00LTUuNC00LTYuNC0uMS0xMi44LS4yLTE5LjItLjEtMi4yIDAtMy4zIDEuNi0yLjggMy43ek0yNDIuNCAyMDZjMS43IDExLjcgNy42IDIwLjggMTggMjYuNiA5LjkgNS41IDIwLjcgNi4yIDMxLjcgNC42IDEyLjctMS45IDIzLjktNy4zIDMzLjgtMTUuNSAuNC0uMyAuOC0uNiAxLjQtMSAuNSAzLjIgLjkgNi4yIDEuNSA5LjIgLjUgMi42IDIuMSA0LjMgNC41IDQuNCA0LjYgLjEgOS4xIC4xIDEzLjcgMCAyLjMtLjEgMy44LTEuNiA0LTMuOSAuMS0uOCAuMS0xLjYgLjEtMi4zbDAtODguOGMwLTMuNi0uMi03LjItLjctMTAuOC0xLjYtMTAuOC02LjItMTkuNy0xNS45LTI1LjQtNS42LTMuMy0xMS44LTUtMTguMi01LjktMy0uNC02LS43LTkuMS0xLjFsLTEwIDBjLS44IC4xLTEuNiAuMy0yLjUgLjMtOC4yIC40LTE2LjMgMS40LTI0LjIgMy41LTUuMSAxLjMtMTAgMy4yLTE1IDQuOS0zIDEtNC41IDMuMi00LjQgNi41IC4xIDIuOC0uMSA1LjYgMCA4LjMgLjEgNC4xIDEuOCA1LjIgNS43IDQuMSA2LjUtMS43IDEzLjEtMy41IDE5LjctNC44IDEwLjMtMS45IDIwLjctMi43IDMxLjEtMS4yIDUuNCAuOCAxMC41IDIuNCAxNC4xIDcgMy4xIDQgNC4yIDguOCA0LjQgMTMuNyAuMyA2LjkgLjIgMTMuOSAuMyAyMC44IDAgLjQtLjEgLjctLjIgMS4yLS40IDAtLjggMC0xLjEtLjEtOC44LTIuMS0xNy43LTMuNi0yNi44LTQuMS05LjUtLjUtMTguOSAuMS0yNy45IDMuMi0xMC44IDMuOC0xOS41IDEwLjMtMjQuNiAyMC44LTQuMSA4LjMtNC42IDE3LTMuNCAyNS44ek05OC43IDEwNi45bDAgMTc1LjNjMCAuOCAwIDEuNyAuMSAyLjUgLjIgMi41IDEuNyA0LjEgNC4xIDQuMiA1LjkgLjEgMTEuOCAuMSAxNy43IDAgMi41IDAgNC0xLjcgNC4xLTQuMSAuMS0uOCAuMS0xLjcgLjEtMi41bDAtNjAuN2MuOSAuNyAxLjQgMS4yIDEuOSAxLjYgMTUgMTIuNSAzMi4yIDE2LjYgNTEuMSAxMi45IDE3LjEtMy40IDI4LjktMTMuOSAzNi43LTI5LjIgNS44LTExLjYgOC4zLTI0LjEgOC43LTM3IC41LTE0LjMtMS0yOC40LTYuOC00MS43LTcuMS0xNi40LTE4LjktMjcuMy0zNi43LTMwLjktMi43LS42LTUuNS0uOC04LjItMS4ybC03IDBjLTEuMiAuMi0yLjQgLjMtMy42IC41LTExLjcgMS40LTIyLjMgNS44LTMxLjggMTIuNy0yIDEuNC0zLjkgMy01LjkgNC41LS4xLS41LS4zLS44LS40LTEuMi0uNC0yLjMtLjctNC42LTEuMS02LjktLjYtMy45LTIuNS01LjUtNi40LTUuNmwtOS43IDBjLTUuOS0uMS02LjkgMS02LjkgNi44ek00OTMuNiAzMzljLTIuNy0uNy01LjEgMC03LjYgMS00My45IDE4LjQtODkuNSAzMC4yLTEzNi44IDM1LjgtMTQuNSAxLjctMjkuMSAyLjgtNDMuNyAzLjItMjYuNiAuNy01My4yLS44LTc5LjYtNC4zLTE3LjgtMi40LTM1LjUtNS43LTUzLTkuOS0zNy04LjktNzIuNy0yMS43LTEwNi43LTM4LjgtOC44LTQuNC0xNy40LTkuMy0yNi4xLTE0LTMuOC0yLjEtNi4yLTEuNS04LjIgMi4xbDAgMS43YzEuMiAxLjYgMi4yIDMuNCAzLjcgNC44IDM2IDMyLjIgNzYuNiA1Ni41IDEyMiA3Mi45IDIxLjkgNy45IDQ0LjQgMTMuNyA2Ny4zIDE3LjUgMTQgMi4zIDI4IDMuOCA0Mi4yIDQuNSAzIC4xIDYgLjIgOSAuNCAuNyAwIDEuNCAuMiAyLjEgLjNsMTcuNyAwYy43LS4xIDEuNC0uMyAyLjEtLjMgMTQuOS0uNCAyOS44LTEuOCA0NC42LTQgMjEuNC0zLjIgNDIuNC04LjEgNjIuOS0xNC43IDI5LjYtOS42IDU3LjctMjIuNCA4My40LTQwLjEgMi44LTEuOSA1LjctMy44IDgtNi4yIDQuMy00LjQgMi4zLTEwLjQtMy4zLTExLjl6TTU0NCAzMTEuM2MtLjgtNC4yLTQtNS44LTcuNi03LTUuNy0xLjktMTEuNi0yLjgtMTcuNi0zLjMtMTEtLjktMjItLjQtMzIuOCAxLjYtMTIgMi4yLTIzLjQgNi4xLTMzLjUgMTMuMS0xLjIgLjgtMi40IDEuOC0zLjEgMy0uNiAuOS0uNyAyLjMtLjUgMy40IC4zIDEuMyAxLjcgMS42IDMgMS41IC42IDAgMS4yIDAgMS44LS4xbDE5LjUtMi4xYzkuNi0uOSAxOS4yLTEuNSAyOC44LS44IDQuMSAuMyA4LjEgMS4yIDEyIDIuMiA0LjMgMS4xIDYuMiA0LjQgNi40IDguNyAuMyA2LjctMS4yIDEzLjEtMi45IDE5LjUtMy41IDEyLjktOC4zIDI1LjQtMTMuMyAzNy44LS4zIC44LS43IDEuNy0uOCAyLjUtLjQgMi41IDEgNCAzLjQgMy41IDEuNC0uMyAzLTEuMSA0LTIuMSAzLjctMy42IDcuNS03LjIgMTAuNi0xMS4yIDEwLjctMTMuOCAxNy0yOS42IDIwLjctNDYuNiAuNy0zIDEuMi02LjEgMS43LTkuMSAuMi00LjcgLjItOS42IC4yLTE0LjV6Il0KICAgIH07CiAgICBmYUViYXkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZWJheSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNGY0IiwgIk02MDYuNSAxODkuNWwtNTQuOCAxMDkuOS01NC45LTEwOS45LTM3LjUgMCAxMC45IDIwLjZjLTExLjUtMTktMzUuOS0yNi02My4zLTI2LTMxLjggMC02Ny45IDguNy03MS41IDQzLjFsMzMuNyAwYzEuNC0xMy44IDE1LjctMjEuOCAzNS0yMS44IDI2IDAgNDEgOS42IDQxIDMzbDAgMy40Yy0xMi43IDAtMjggLjEtNDEuNyAuNC00Mi40IC45LTY5LjYgMTAtNzYuNyAzNC40IDEtNS4yIDEuNS0xMC42IDEuNS0xNi4yIDAtNTIuMS0zOS43LTc2LjItNzUuNC03Ni4yLTIxLjMgMC00MyA1LjUtNTguNyAyNC4ybDAtODAuNi0zMi4xIDAgMCAxNjkuNWMwIDEwLjMtLjYgMjIuOS0xLjEgMzMuMWwzMS41IDBjLjctNi4zIDEuMS0xMi45IDEuMS0xOS41IDEzLjYgMTYuNiAzNS40IDI0LjkgNTguNyAyNC45IDM2LjkgMCA2NC45LTIxLjkgNzMuMy01NC4yLS41IDIuOC0uNyA1LjgtLjcgOSAwIDI0LjEgMjEuMSA0NSA2MC42IDQ1IDI2LjYgMCA0NS44LTUuNyA2MS45LTI1LjUgMCA2LjYgLjMgMTMuMyAxLjEgMjAuMmwyOS44IDBjLS43LTguMi0xLTE3LjUtMS0yNi44bDAtNjUuNmMwLTkuMy0xLjctMTcuMi00LjgtMjMuOGw2MS41IDExNi4xLTI4LjUgNTQuMSAzNS45IDAgOTkuMi0xOTQuOC0zNCAwek0yNDQuMiAzMTMuOGMtMjkuNiAwLTUwLjItMjEuNS01MC4yLTUzLjggMC0zMi40IDIwLjYtNTMuOCA1MC4yLTUzLjggMjkuOCAwIDUwLjIgMjEuNCA1MC4yIDUzLjggMCAzMi4zLTIwLjQgNTMuOC01MC4yIDUzLjh6bTIwMC45LTQ3LjNjMCAzMC0xNy45IDQ4LjQtNTEuNiA0OC40LTI1LjEgMC0zNS0xMy40LTM1LTI1LjggMC0xOS4xIDE4LjEtMjQuNCA0Ny4yLTI1LjMgMTMuMS0uNSAyNy42LS42IDM5LjQtLjZsMCAzLjN6TTMzLjIgMjY4LjFsMTI4LjggMCAwLTguNWMwLTUxLjctMzMuMS03NS40LTc4LjQtNzUuNC01Ni44IDAtODMgMzAuOC04MyA3Ny42IDAgNDIuNSAyNS4zIDc0IDgyLjUgNzQgMzEuNCAwIDY4LTExLjcgNzQuNC00Ni4xbC0zMy4xIDBjLTEyIDM1LjgtODcuNyAzNi43LTkxLjItMjEuNnptOTUtMjEuNGwtOTQuNCAwYzYuOS01Ni42IDkyLjEtNTQuNyA5NC40IDB6Il0KICAgIH07CiAgICBmYUNvbnRhbyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjb250YW8iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjI2ZCIsICJNNDUuNCAzMDVjMTQuNCA2Ny4xIDI2LjQgMTI5IDY4LjIgMTc1TDM0IDQ4MGMtMTguNyAwLTM0LTE1LjItMzQtMzRMMCA2NkMwIDQ3LjMgMTUuMiAzMiAzNCAzMmw1Ny43IDBjLTEzLjggMTIuNi0yNi4xIDI3LjItMzYuOSA0My42LTQ1LjQgNzAtMjcgMTQ2LjgtOS40IDIyOS40ek00NzggMzJsLTkwLjIgMGMyMS40IDIxLjQgMzkuMiA0OS41IDUyLjcgODQuMUwzMDMuNCAxNDUuNGMtMTQuOS0yOS0zNy44LTUzLjMtODIuNi00My45LTI0LjYgNS4zLTQxIDE5LjMtNDguMyAzNC42LTguOCAxOC43LTEzLjIgMzkuOCA4LjIgMTQwLjMgMjEuMSAxMDAuMiAzMy43IDExNy43IDQ5LjUgMTMxLjIgMTIuOSAxMS4xIDMzLjQgMTcgNTguMyAxMS43IDQ0LjUtOS40IDU1LjctNDAuNyA1Ny40LTczLjJsMTM3LjQtMjkuNmMzLjIgNzEuNS0xOC43IDEyNS4yLTU3LjQgMTYzLjZsNTIuMSAwYzE4LjcgMCAzNC0xNS4yIDM0LTM0TDUxMiA2NmMwLTE4LjgtMTUuMi0zNC0zNC0zNHoiXQogICAgfTsKICAgIGZhRWxsbyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJlbGxvIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1ZjEiLCAiTTI1NiA4YTI0OCAyNDggMCAxIDAgMCA0OTYgMjQ4IDI0OCAwIDEgMCAwLTQ5NnpNMzk5LjggMjkzLjJDMzgzLjMgMzU4LjUgMzIzLjggNDA0LjggMjU2IDQwNC44UzEyOC43IDM1OC41IDExMi4yIDI5My4yYy0xLjYtNy40IDIuNS0xNS43IDkuOS0xNy40czE1LjcgMi41IDE3LjQgOS45YzE0IDUyLjkgNjIgOTAuMSAxMTYuNiA5MC4xczEwMi41LTM3LjIgMTE2LjYtOTAuMWMxLjctNy40IDkuOS0xMi40IDE3LjQtOS45IDcuNCAxLjcgMTIuNCA5LjkgOS45IDE3LjR6Il0KICAgIH07CiAgICBmYVNpc3RyaXggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2lzdHJpeCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmM2VlIiwgIk00NDggNDQ5TDMwMS4yIDMwMC4yYzIwLTI3LjkgMzEuOS02Mi4yIDMxLjktOTkuMiAwLTkzLjEtNzQuNy0xNjguOS0xNjYuNS0xNjguOS05MS45LS4xLTE2Ni42IDc1LjctMTY2LjYgMTY4LjhTNzQuNyAzNjkuOCAxNjYuNSAzNjkuOGMzOS44IDAgNzYuMy0xNC4yIDEwNS0zNy45TDQxNy41IDQ4MCA0NDggNDQ5ek0xNjYuNSAzMzAuOGMtNzAuNiAwLTEyOC4xLTU4LjMtMTI4LjEtMTI5LjlTOTUuOSA3MSAxNjYuNSA3MSAyOTQuNiAxMjkuMyAyOTQuNiAyMDAuOSAyMzcuMiAzMzAuOCAxNjYuNSAzMzAuOHoiXQogICAgfTsKICAgIGZhUGVyaXNjb3BlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInBlcmlzY29wZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmM2RhIiwgIk0zNzAgNjMuNmMtMzguNi00MS04OS41LTYzLjYtMTQzLjQtNjMuNi0xMTQuNyAwLTIwOC4xIDk2LjItMjA4LjEgMjE0LjQgMCA3NS4xIDU3LjggMTU5LjggODIuNyAxOTIuNyAzNi42IDQ4LjQgOTEuNCAxMDQuOSAxMjUuNCAxMDQuOSA0MS42IDAgMTEyLjktOTQuMiAxMjAuOS0xMDUgMjQuNi0zMy4xIDgyLTExOC4zIDgyLTE5Mi42IDAtNTYuNS0yMS4xLTExMC4xLTU5LjUtMTUwLjh6TTIyNi42IDQ5My45Yy00Mi41IDAtMTkwLTE2Ny4zLTE5MC0yNzkuNCAwLTEwNy40IDgzLjktMTk2LjMgMTkwLTE5Ni4zIDEwMC44IDAgMTg0LjcgODkgMTg0LjcgMTk2LjMgLjEgMTEyLjEtMTQ3LjQgMjc5LjQtMTg0LjcgMjc5LjR6TTMzOCAyMDYuOGMwIDU5LjEtNTEuMSAxMDkuNy0xMTAuOCAxMDkuNy0xMDAuNiAwLTE1MC43LTEwOC4yLTkyLjktMTgxLjhsMCAuNGMwIDI0LjUgMjAuMSA0NC40IDQ0LjggNDQuNHM0NC44LTE5LjkgNDQuOC00NC40YzAtMTguMi0xMS4xLTMzLjgtMjYuOS00MC43IDc2LjYtMTkuMiAxNDEgMzkuMyAxNDEgMTEyLjR6Il0KICAgIH07CiAgICBmYUV4cGVkaXRlZHNzbCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJleHBlZGl0ZWRzc2wiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjIzZSIsICJNMjU2IDQzLjRhMjEyLjYgMjEyLjYgMCAxIDAgMCA0MjUuMiAyMTIuNiAyMTIuNiAwIDEgMCAwLTQyNS4yek0xNTguNiAxNzYuM2MwLTUzLjcgNDMuNy05Ny40IDk3LjQtOTcuNHM5Ny40IDQzLjcgOTcuNCA5Ny40bDAgMjYuNmMwIDUtMy45IDguOS04LjkgOC45bC0xNy43IDBjLTUgMC04LjktMy45LTguOS04LjlsMC0yNi42YzAtODIuMS0xMjQtODIuMS0xMjQgMGwwIDI2LjZjMCA1LTMuOSA4LjktOC45IDguOWwtMTcuNyAwYy01IDAtOC45LTMuOS04LjktOC45bDAtMjYuNiAuMiAwek0zOTcuNyAzODBjMCA5LjctOCAxNy43LTE3LjcgMTcuN2wtMjQ4IDBjLTkuNyAwLTE3LjctOC0xNy43LTE3LjdsMC0xNDEuN2MwLTkuNyA4LTE3LjcgMTcuNy0xNy43bDI0OCAwYzkuNyAwIDE3LjcgOCAxNy43IDE3LjdsMCAxNDEuN3ptLTI0OC0xMzcuM2wwIDEzMi45YzAgMi41LTEuOSA0LjQtNC40IDQuNGwtOC45IDBjLTIuNSAwLTQuNC0xLjktNC40LTQuNGwwLTEzMi45YzAtMi41IDEuOS00LjQgNC40LTQuNGw4LjkgMGMyLjUgMCA0LjQgMS45IDQuNCA0LjR6bTE0MS43IDQ4LjdjMCAxMy03LjIgMjQuNC0xNy43IDMwLjRsMCAzMS42YzAgNS0zLjkgOC45LTguOSA4LjlsLTE3LjcgMGMtNSAwLTguOS0zLjktOC45LTguOWwwLTMxLjZjLTEwLjUtNi4xLTE3LjctMTcuNC0xNy43LTMwLjQgMC0xOS43IDE1LjgtMzUuNCAzNS40LTM1LjRzMzUuNSAxNS44IDM1LjUgMzUuNHpNMjU2IDhhMjQ4IDI0OCAwIDEgMCAwIDQ5NiAyNDggMjQ4IDAgMSAwIDAtNDk2em0wIDE3LjdhMjMwLjMgMjMwLjMgMCAxIDEgMCA0NjAuNiAyMzAuMyAyMzAuMyAwIDEgMSAwLTQ2MC42eiJdCiAgICB9OwogICAgZmFOYXBzdGVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm5hcHN0ZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjNkMiIsICJNMzA2LjMgMzczLjZjLTE0LjIgMTMuNi0zMS4zIDI0LjEtNTAuNCAzMC41LTE5LTYuNC0zNi4yLTE2LjktNTAuMy0zMC41bDEwMC43IDB6bTQ0LTE5OS42YzIwLTE2LjkgNDMuNi0yOS4yIDY5LjYtMzYuMmwwIDE2MS4yYzAgMjE5LjQtMzI4IDIxNy42LTMyOCAuM2wwLTE2MS42YzI1LjkgNi45IDQ5LjYgMTkuNiA2OS41IDM2LjQgNTYuOC00MCAxMzIuNS0zOS45IDE4OC45LS4xek0xNDEuNSAxMTUuNWM2NC40LTYwIDE2NC4zLTYwLjEgMjI4LjktLjItNy4xIDMuNS0xMy45IDcuMy0yMC42IDExLjUtNTguNy0zMC41LTEyOS4yLTMwLjQtMTg3LjkgLjEtNi4zLTQtMTMuOS04LjItMjAuNC0xMS40ek01MS44IDkzLjJsMCA2OS4zYy01OC40IDM2LjUtNTguNCAxMjEuMSAuMSAxNTguMyAyNi40IDI0NS4xIDM4MS43IDI0MC4zIDQwNy42IDEuNWwuMy0xLjdjNTguNy0zNi4zIDU4LjktMTIxLjcgLjItMTU4LjJsMC02OS4yYy0xNy4zIC41LTM0IDMtNTAuMSA3LjQtODItOTEuNS0yMjUuNS05MS41LTMwNy41IC4xLTE2LjMtNC40LTMzLjEtNy01MC42LTcuNXpNMjY3LjIgMzUyczM2LS4zIDYxLjMtMS41YzEwLjItLjUgMjEuMS00IDI1LjUtNi41IDI2LjMtMTUuMSAyNS40LTM5LjIgMjYuMi00Ny40LTc5LjUtLjYtOTkuOS0zLjktMTEzIDU1LjR6TTEzMS43IDI5Ni43Yy44IDguMi0uMSAzMi4zIDI2LjIgNDcuNCA0LjQgMi41IDE1LjIgNiAyNS41IDYuNSAyNS4zIDEuMSA2MS4zIDEuNSA2MS4zIDEuNS0xMy4yLTU5LjQtMzMuNy01Ni4xLTExMy01NS40ek0zMDAuOCA0MjAuMWMtMy4yLTUuMy02LjktNy4zLTYuOS03LjMtMjQuOCA3LjMtNTIuMiA2LjktNzUuOSAwIDAgMC0yLjkgMS41LTYuNCA2LjYtMi44IDQuMS0zLjcgOS42LTMuNyA5LjYgMjkuMSAxNy42IDY3LjEgMTcuNiA5Ni4yIDAtLjEtLjEtLjMtNC0zLjMtOC45eiJdCiAgICB9OwogICAgZmFEZWxpY2lvdXMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZGVsaWNpb3VzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYxYTUiLCAiTTQ0Ni42IDY4Yy0uNC0xLjUtLjktMy0xLjQtNC41LS45LTIuNS0yLTQuOC0zLjMtNy4xLTEuNC0yLjQtMy00LjgtNC43LTYuOS0yLjEtMi41LTQuNC00LjgtNi45LTYuOC0xLjEtLjktMi4yLTEuNy0zLjMtMi41LTEuMy0uOS0yLjYtMS43LTQtMi40LTEuOC0xLTMuNi0xLjgtNS41LTIuNS0xLjctLjctMy41LTEuMy01LjQtMS43LTMuOC0xLTcuOS0xLjUtMTItMS41bC0zNTIgMEMyMS42IDMyIC4xIDUzLjUgLjEgODBsMCAzNTJjMCA0LjEgLjUgOC4yIDEuNSAxMiAyIDcuNyA1LjggMTQuNiAxMSAyMC4zIDEgMS4xIDIuMSAyLjIgMy4zIDMuMyA1LjcgNS4yIDEyLjYgOSAyMC4zIDExIDMuOCAxIDcuOSAxLjUgMTIgMS41bDM1MiAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMzUyLjFjLS4xLTQuMS0uNi04LjItMS42LTEyek00MTYuMSA0MzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0xNzYgMCAwLTE5Mi0xOTIgMCAwLTE3NmMwLTguOCA3LjItMTYgMTYtMTZsMTc2IDAgMCAxOTIgMTkyIDAgMCAxNzZ6Il0KICAgIH07CiAgICBmYUd1aWxkZWQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZ3VpbGRlZCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlMDdlIiwgIk00NDMuOSA2NEw1IDY0YzAgMTAzLjMgMjIuMiAxODAuMSA0My40IDIyMi40IDY0LjEgMTI3LjggMTc2IDE2MS42IDE3Ny4zIDE2MS42IDU1LjctMjAuNSAxMDQuNS01Ni4zIDE0MC42LTEwMy41IDI1LjktMzMuOSA1My4xLTg3LjIgNjUuOS0xNDUuOGwtMjU5LjkgMGM0LjEgMzYuNCAyMi4yIDY3LjkgNDUuMSA4Ni45bDg4LjYgMGMtMTcgMjguMi00OC4yIDU0LjQtODAuNSA2OS41LTMxLjItMTMuMy02OS4xLTQ2LjUtOTYuNS05OC40LTI2LjctNTMuOC0yNy4xLTEwNS45LTI3LjEtMTA1LjlsMzM2LjEgMGM0LTI4LjggNS45LTU3LjkgNS45LTg2Ljl6Il0KICAgIH07CiAgICBmYU9ic2lkaWFuID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm9ic2lkaWFuIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImU4NzkiLCAiTTE0Mi4zIDMyMC4zYzM2LjEtOC4yIDcwLjMtMTEgMTAxLjMgLjcgMzEuOCAxMS45IDYxLjcgMzkuNiA4Ni43IDk2LTguMSAxNy43LTEyLjQgMzYuOS0xNC43IDUzLjgtMy4xIDIyLjktMjUuNCA0MC43LTQ3LjcgMzQuNi0zMS43LTguNy02OC4zLTIyLjMtMTAxLjMtMjQuOS00LjQtLjMtNTAuNi0zLjgtNTAuNi0zLjgtMS43LS4xLTMuNC0uNC01LjEtLjggMzEuNS02NC4yIDM4LjItMTE1LjEgMzEuMy0xNTUuNHpNNTUgMjE5LjVjMjIuMyAxNC44IDQ5LjUgMzcuOCA2NC4xIDczLjYgMTYuMSAzOS40IDE3LjggOTUuNy0yMS42IDE3Ni4xLTEtLjgtMi4xLTEuNy0zLTIuN0w3LjQgMzc2LjhjLTkuNS05LjgtMTIuMS0yNC40LTYuNS0zNi45IC42LTEuMyA0NC42LTk4LjMgNTQuMS0xMjAuNHptMjY0LjMtOTEuM2M0LjkgNi4yIDcuNCAxNCA3LjQgMjEuOSAuMSAyMC44IDEuOCA2My42IDEzLjMgOTEuMiAxMS4yIDI2LjggMzEuOCA1NS44IDQyLjUgNzAgNC4xIDUuNSA0LjggMTIuOSAxLjMgMTguNy03LjYgMTIuOC0yMi42IDM3LjUtNDMuOCA2OS4yLS4zIC40LS42IC45LS44IDEuMy0yNS4yLTUyLjItNTUuOS04MC43LTkwLjQtOTMuNi05LjYtMy42LTE5LjUtNi0yOS40LTcuMy0xNy44LTQ1LjgtMjMuMi03OS43LTIyLTEwNi40IDEuMi0yNy40IDkuMi00Ny44IDE4LjItNjYuMyA4LjktMTguMSAxOS44LTM1LjkgMjQuOS01NS43IDMuMi0xMi41IDQuMi0yNS44IDEuNy00MC45bDc3LjEgOTh6TTE4NC4yIDE0LjFjMTAuMy05LjIgMjQuNi0xMC44IDM2LjMtNS41IDkuNiAyNC42IDkuNyA0Mi44IDUuNiA1OC44LTQuNiAxNy44LTE0LjEgMzMtMjMuOSA1Mi44LTkuNiAxOS41LTE4LjQgNDItMTkuNyA3Mi4zLTEuMiAyNy45IDQuMSA2MS45IDIwLjQgMTA1LjgtMjEtLjYtNDIuNSAyLjYtNjMuNyA3LjQtMS43LTYuNC0zLjgtMTIuNC02LjEtMTguMi0xNy4zLTQyLjItNDkuOS02Ny45LTc0LjEtODMuMyAzLjEtMTguNyA4LjItNTUuNCAxMS42LTc3LjUgMS4yLTcuNiA0LjktMTQuNiAxMC43LTE5LjhMMTg0LjIgMTQuMXoiXQogICAgfTsKICAgIGZhWGJveCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ4Ym94IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0MTIiLCAiTTM2OS45IDMxOC4yYzQ0LjMgNTQuMyA2NC43IDk4LjggNTQuNCAxMTguNy03LjkgMTUuMS01Ni43IDQ0LjYtOTIuNiA1NS45LTI5LjYgOS4zLTY4LjQgMTMuMy0xMDAuNCAxMC4yLTM4LjItMy43LTc2LjktMTcuNC0xMTAuMS0zOS0yNy45LTE4LjItMzQuMi0yNS43LTM0LjItNDAuNiAwLTI5LjkgMzIuOS04Mi4zIDg5LjItMTQyLjEgMzItMzMuOSA3Ni41LTczLjcgODEuNC03Mi42IDkuNCAyLjEgODQuMyA3NS4xIDExMi4zIDEwOS41ek0xODguNiAxNDMuOGMtMjkuNy0yNi45LTU4LjEtNTMuOS04Ni40LTYzLjQtMTUuMi01LjEtMTYuMy00LjgtMjguNyA4LjEtMjkuMiAzMC40LTUzLjUgNzkuNy02MC4zIDEyMi40LTUuNCAzNC4yLTYuMSA0My44LTQuMiA2MC41IDUuNiA1MC41IDE3LjMgODUuNCA0MC41IDEyMC45IDkuNSAxNC42IDEyLjEgMTcuMyA5LjMgOS45LTQuMi0xMS0uMy0zNy41IDkuNS02NCAxNC4zLTM5IDUzLjktMTEyLjkgMTIwLjMtMTk0LjR6bTMxMS42IDYzLjVjLTE2LjktODAtNjcuNS0xMzAuMy03NC42LTEzMC4zLTcuMyAwLTI0LjIgNi41LTM2IDEzLjktMjMuMyAxNC41LTQxIDMxLjQtNjQuMyA1Mi44IDQyLjQgNTMuMyAxMDIuMiAxMzkuNCAxMjIuOSAyMDIuMyA2LjggMjAuNyA5LjcgNDEuMSA3LjQgNTIuMy0xLjcgOC41LTEuNyA4LjUgMS40IDQuNiA2LjEtNy43IDE5LjktMzEuMyAyNS40LTQzLjUgNy40LTE2LjIgMTUtNDAuMiAxOC42LTU4LjcgNC4zLTIyLjUgMy45LTcwLjgtLjgtOTMuNHpNMTQxLjMgNDNjNDcuNy0yLjUgMTA5LjcgMzQuNSAxMTQuMyAzNS40IC43IC4xIDEwLjQtNC4yIDIxLjYtOS43IDYzLjktMzEuMSA5NC0yNS44IDEwNy40LTI1LjItNjMuOS0zOS4zLTE1Mi43LTUwLTIzMy45LTExLjctMjMuNCAxMS4xLTI0IDExLjktOS40IDExLjJ6Il0KICAgIH07CiAgICBmYVVudGFwcGQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidW50YXBwZCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNDA1IiwgIk00MDEuNSA0OS45QzMyMS43IDIxMCAzMTYuOSAyMDIuNCAzMTMuNiAyMjMuMWwtNS4yIDMyLjhjLTEuOSAxMi02LjYgMjMuNS0xMy43IDMzLjRMMTQ1LjggNDk3LjFjLTcuNiAxMC42LTIwLjQgMTYuMi0zMy40IDE0LjYtNDAuMy01LTc3LjgtMzIuMi05NS4zLTY4LjUtNS43LTExLjgtNC41LTI1LjggMy4xLTM2LjRMMTY5LjEgMTk4LjljNy4xLTkuOSAxNi40LTE4IDI3LjItMjMuN2wyOS4zLTE1LjVjMTguNS05LjggOS43LTExLjkgMTM1LjYtMTM4LjkgMS00LjggMS03LjMgMy42LTggMy0uNyA2LjYtMSA2LjMtNC42bC0uNC00LjZjLS4yLTEuOSAxLjMtMy42IDMuMi0zLjYgNC41LS4xIDEzLjIgMS4yIDI1LjYgMTAgMTIuMyA4LjkgMTYuNCAxNi44IDE3LjcgMjEuMSAuNiAxLjgtLjYgMy43LTIuNCA0LjJsLTQuNSAxLjFjLTMuNCAuOS0yLjUgNC40LTIuMyA3LjQgLjEgMi44LTIuMyAzLjYtNi41IDYuMXpNMjMwLjMgMzYuNGMzLjQgLjkgMi41IDQuNCAyLjMgNy40LS4yIDIuNyAyLjEgMy41IDYuNCA2IDcuOSAxNS45IDE1LjMgMzAuNSAyMi4yIDQ0IC43IDEuMyAyLjMgMS41IDMuMyAuNSAxMS4yLTEyIDI0LjYtMjYuMiA0MC41LTQyLjYgMS4zLTEuNCAxLjQtMy41IC4xLTQuOS04LTguMi0xNi41LTE2LjktMjUuNi0yNi4xLTEtNC43LTEtNy4zLTMuNi04LTMtLjgtNi42LTEtNi4zLTQuNiAuMy0zLjMgMS40LTguMS0yLjgtOC4yLTQuNS0uMS0xMy4yIDEuMS0yNS42IDEwLTEyLjMgOC45LTE2LjQgMTYuOC0xNy43IDIxLjEtMS40IDQuMiAzLjYgNC42IDYuOCA1LjR6TTYyMC4yIDQwNi43TDQ3MS40IDE5OC44Yy0xMy4yLTE4LjUtMjYuNi0yMy40LTU2LjQtMzkuMS0xMS4yLTUuOS0xNC4yLTEwLjktMzAuNS0yOC45LTEtMS4xLTIuOS0uOS0zLjYgLjUtNDYuMyA4OC44LTQ3LjEgODIuOC00OSA5NC44LTEuNyAxMC43LTEuMyAyMCAuMyAyOS44IDEuOSAxMiA2LjYgMjMuNSAxMy43IDMzLjRMNDk0LjggNDk3LjJjNy42IDEwLjYgMjAuMiAxNi4yIDMzLjEgMTQuNyA0MC4zLTQuOSA3OC0zMiA5NS43LTY4LjYgNS40LTExLjkgNC4zLTI1LjktMy40LTM2LjZ6Il0KICAgIH07CiAgICBmYUdvb2dsZVBsdXNHID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdvb2dsZS1wbHVzLWciLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjBkNSIsICJNMzg2LjMgMjI4LjVjMS44IDkuNyAzLjEgMTkuNCAzLjEgMzIgMCAxMDkuOC03My42IDE4Ny41LTE4NC40IDE4Ny41LTEwNi4xIDAtMTkyLTg1LjktMTkyLTE5MlM5OC45IDY0IDIwNSA2NGM1MS45IDAgOTUuMSAxOC45IDEyOC42IDUwLjNsLTUyLjEgNTBjLTE0LjEtMTMuNi0zOS0yOS42LTc2LjUtMjkuNi02NS41IDAtMTE4LjkgNTQuMi0xMTguOSAxMjEuM1MxMzkuNSAzNzcuMyAyMDUgMzc3LjNjNzYgMCAxMDQuNS01NC43IDEwOS04Mi44bC0xMDkgMCAwLTY2IDE4MS4zIDAgMCAwem0xODUuNCA2LjRsMC01NS43LTU2IDAgMCA1NS43LTU1LjcgMCAwIDU2IDU1LjcgMCAwIDU1LjcgNTYgMCAwLTU1LjcgNTUuNyAwIDAtNTYtNTUuNyAweiJdCiAgICB9OwogICAgZmFHaXRodWJBbHQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZ2l0aHViLWFsdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMTEzIiwgIk0yMDIuMSAzMjguN2MwIDIwLjktMTAuOSA1NS4xLTM2LjcgNTUuMXMtMzYuNy0zNC4yLTM2LjctNTUuMSAxMC45LTU1LjEgMzYuNy01NS4xIDM2LjcgMzQuMiAzNi43IDU1LjF6TTQ5NiAyNzguMmMwIDMxLjktMy4yIDY1LjctMTcuNSA5NS0zNy45IDc2LjYtMTQyLjEgNzQuOC0yMTYuNyA3NC44LTc1LjggMC0xODYuMiAyLjctMjI1LjYtNzQuOC0xNC42LTI5LTIwLjItNjMuMS0yMC4yLTk1IDAtNDEuOSAxMy45LTgxLjUgNDEuNS0xMTMuNi01LjItMTUuOC03LjctMzIuNC03LjctNDguOCAwLTIxLjUgNC45LTMyLjMgMTQuNi01MS44IDQ1LjMgMCA3NC4zIDkgMTA4LjggMzYgMjktNi45IDU4LjgtMTAgODguNy0xMCAyNyAwIDU0LjIgMi45IDgwLjQgOS4yIDM0LTI2LjcgNjMtMzUuMiAxMDcuOC0zNS4yIDkuOCAxOS41IDE0LjYgMzAuMyAxNC42IDUxLjggMCAxNi40LTIuNiAzMi43LTcuNyA0OC4yIDI3LjUgMzIuNCAzOSA3Mi4zIDM5IDExNC4yem0tNjQuMyA1MC41YzAtNDMuOS0yNi43LTgyLjYtNzMuNS04Mi42LTE4LjkgMC0zNyAzLjQtNTYgNi0xNC45IDIuMy0yOS44IDMuMi00NS4xIDMuMi0xNS4yIDAtMzAuMS0uOS00NS4xLTMuMi0xOC43LTIuNi0zNy02LTU2LTYtNDYuOCAwLTczLjUgMzguNy03My41IDgyLjYgMCA4Ny44IDgwLjQgMTAxLjMgMTUwLjQgMTAxLjNsNDguMiAwYzcwLjMgMCAxNTAuNi0xMy40IDE1MC42LTEwMS4zem0tODIuNi01NS4xYy0yNS44IDAtMzYuNyAzNC4yLTM2LjcgNTUuMXMxMC45IDU1LjEgMzYuNyA1NS4xIDM2LjctMzQuMiAzNi43LTU1LjEtMTAuOS01NS4xLTM2LjctNTUuMXoiXQogICAgfTsKICAgIGZhR2V0UG9ja2V0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdldC1wb2NrZXQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjI2NSIsICJNNDA3LjYgNjRsLTM2NyAwQzE4LjUgNjQgMCA4Mi41IDAgMTA0LjZMMCAyMzkuOEMwIDM2NC41IDk5LjcgNDY0IDIyNC4yIDQ2NCAzNDguMiA0NjQgNDQ4IDM2NC41IDQ0OCAyMzkuOGwwLTEzNS4yQzQ0OCA4Mi4yIDQzMC4zIDY0IDQwNy42IDY0em0tMTYyIDI2OC41Yy0xMi40IDExLjgtMzEuNCAxMS4xLTQyLjQgMC0xMTMuNy0xMDguOS0xMTQuOS0xMDUuMS0xMTQuOS0xMjMuMiAwLTE2LjkgMTMuOC0zMC43IDMwLjctMzAuNyAxNyAwIDE2LjEgMy44IDEwNS4yIDg5LjMgOTAuNi04Ni45IDg4LjYtODkuMyAxMDUuNS04OS4zczMwLjcgMTMuOCAzMC43IDMwLjdjMCAxNy44LTIuOSAxNS43LTExNC44IDEyMy4yeiJdCiAgICB9OwogICAgZmFHbGlkZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnbGlkZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMmE1IiwgIk0yNTIuOCAxNDguNmMwIDguOC0xLjYgMTcuNy0zLjQgMjYuNC01LjggMjcuOC0xMS42IDU1LjgtMTcuMyA4My42LTEuNCA2LjMtOC4zIDQuOS0xMy43IDQuOS0yMy44IDAtMzAuNS0yNi0zMC41LTQ1LjUgMC0yOS4zIDExLjItNjguMSAzOC41LTgzLjEgNC4zLTIuNSA5LjItNC4yIDE0LjEtNC4yIDExLjQgMCAxMi4zIDguMyAxMi4zIDE3Ljl6TTQ0OCA4MGwwIDM1MmMwIDI2LjUtMjEuNSA0OC00OCA0OEw0OCA0ODBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4TDAgODBDMCA1My41IDIxLjUgMzIgNDggMzJsMzUyIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDh6TTM4NCAyNjdjMC01LjEtMjAuOC0zNy43LTI1LjUtMzkuNS0yLjItLjktNy4yLTIuMy05LjYtMi4zLTIzLjEgMC0zOC43IDEwLjUtNTguMiAyMS41bC0uNS0uNWM0LjMtMjkuNCAxNC42LTU3LjIgMTQuNi04Ny40IDAtNDQuNi0yMy44LTYyLjctNjcuNS02Mi43LTcxLjcgMC0xMDggNzAuOC0xMDggMTIzLjUgMCA1NC43IDMyIDg1IDg2LjMgODUgNy41IDAgNi45LS42IDYuOSAyLjMtMTAuNSA4MC4zLTU2LjUgODIuOS01Ni41IDU4LjkgMC0yNC40IDI4LTM2LjUgMjguMy0zOC0uMi03LjYtMjkuMy0xNy4yLTM2LjctMTcuMi0yMS4xIDAtMzIuNyAzMy0zMi43IDUwLjYgMCAzMi4zIDIwLjQgNTQuNyA1My4zIDU0LjcgNDguMiAwIDgzLjQtNDkuNyA5NC4zLTkxLjcgOS40LTM3LjcgNy0zOS40IDEyLjMtNDIuMSAyMC0xMC4xIDM1LjgtMTYuOCA1OC40LTE2LjggMTEuMSAwIDE5IDIuMyAzNi43IDUuMiAxLjggLjEgNC4xLTEuNyA0LjEtMy41eiJdCiAgICB9OwogICAgZmFCaXR5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImJpdHkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjM3YSIsICJNODYuNSA2Ny4yYzk1LjQtODkuMiAyNDYuMS05MS4yIDM0My4xIDMuOCAxNC4zIDE0LjEtNi40IDM3LjEtMjIuNCAyMS41LTg0LjgtODIuNC0yMTUuOC04MC4zLTI5OC45LTMuMi0xNi4zIDE1LjEtMzYuNS04LjMtMjEuOC0yMi4xem05OC45IDQxOC42YzE5LjMgNS43IDI5LjMtMjMuNiA3LjktMzAtMTEyLjItMzMuOS0xNzUuOC0xNDkuNy0xNDcuNS0yNjEgNS0xOS42LTI0LjktMjguMS0zMC4yLTcuMS0zMi4xIDEyNy40IDQxLjEgMjU5LjggMTY5LjggMjk4LjF6bTE0OC4xLTJjMTIxLjktNDAuMiAxOTIuOS0xNjYuOSAxNjQuNC0yOTEtNC41LTE5LjctMzQuOS0xMy44LTMwIDcuOSAyNC4yIDEwNy43LTM3LjEgMjE3LjktMTQzLjIgMjUzLjQtMjEuMiA3LTEwLjQgMzYgOC44IDI5Ljd6bS02Mi45LTc5bC4yLTcxLjhjMC04LjItNi42LTE0LjgtMTQuOC0xNC44cy0xNC44IDYuNy0xNC44IDE0LjhsLS4yIDcxLjhjMCA4LjIgNi42IDE0LjggMTQuOCAxNC44czE0LjgtNi42IDE0LjgtMTQuOHptNzEtMjY5YzIuMSA5MC45IDQuNyAxMzEuOS04NS41IDEzMi41LTkyLjUtLjctODYuOS00NC4zLTg1LjUtMTMyLjUgMC0yMS44LTMyLjUtMTkuNi0zMi41IDBsMCA3MS42YzAgNjkuMyA2MC43IDkwLjkgMTE4IDkwLjEgNTcuMyAuOCAxMTgtMjAuOCAxMTgtOTAuMWwwLTcxLjZjMC0xOS42LTMyLjUtMjEuOC0zMi41IDB6Il0KICAgIH07CiAgICBmYVdwZXhwbG9yZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAid3BleHBsb3JlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMmRlIiwgIk0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem00ODAgMGEyMjQgMjI0IDAgMSAwIC00NDggMCAyMjQgMjI0IDAgMSAwIDQ0OCAwek0xNjAuOSAxMjQuNmw4Ni45IDM3LjEtMzcuMSA4Ni45LTg2LjktMzcuMSAzNy4xLTg2Ljl6bTExMCAxNjkuMWw0Ni42IDk0LTE0LjYgMC01MC0xMDAtNDguOSAxMDAtMTQgMCA1MS4xLTEwNi45LTIyLjMtOS40IDYtMTQgNjguNiAyOS4xLTYgMTQuMy0xNi41LTcuMXpNMjU5LjEgMTc3LjRsNjguNiAyOS40LTI5LjQgNjguMy02OC4zLTI5LjEgMjkuMS02OC42em04MC4zIDQyLjlsNTQuNiAyMy4xLTIzLjQgNTQuMy01NC4zLTIzLjEgMjMuMS01NC4zeiJdCiAgICB9OwogICAgZmFNZWdhcG9ydCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJtZWdhcG9ydCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNWEzIiwgIk0yMjIuNSAyMDkuNmwwIDY2LjIgMzMuNSAzMy41IDMzLjMtMzMuMyAwLTY2LjQtMzMuNC0zMy40LTMzLjQgMzMuNHpNMjU2IDhhMjQ4IDI0OCAwIDEgMCAwIDQ5NiAyNDggMjQ4IDAgMSAwIDAtNDk2ek00MDEuMSA0MjIuNGwtMjYuMSAxOS4yLTI2LTE5LjIgMC02NS41LTMzLjQtMzMuNC0zMy40IDMzLjQgMCA2NS41LTI2LjIgMTkuMi0yNi4xLTE5LjIgMC02NS41LTMzLjQtMzMuNC0zMy41IDMzLjQgMCA2NS41LTI2LjEgMTkuMi0yNi4xLTE5LjIgMC04NyA1OS41LTU5LjUgMC04Ny45IDU5LjUtNTkuNSAwLTc1LjYgMjYuMS0xOS4yIDI2LjEgMTkuMiAwIDc1LjYgNTkuNSA1OS41IDAgODcuNiA1OS43IDU5LjcgMCA4Ny4xLS4xIDB6Il0KICAgIH07CiAgICBmYUxlZXRjb2RlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImxlZXRjb2RlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU4NmEiLCAiTTIzNS40IDkuM0MyNDYuNS0yLjUgMjY1LjEtMy4yIDI3NyA3LjlzMTIuNSAyOS44IDEuNCA0MS42bC00MyA0NmMyMS41IDMuMyA0Mi4xIDExLjggNTkuMSAyNS42bDc0LjYgNjAuM2MxMi42IDEwLjIgMTQuNiAyOC44IDQuNCA0MS40cy0yOC43IDE0LjYtNDEuNCA0LjRsLTc0LjYtNjAuM2MtMjYuMi0yMS4xLTcxLjktMTguMi05NC41IDUuOUw4MSAyNjFjLTIxLjUgMjMtMTkuMSA2MCA1LjYgODQuMmw5MS4yIDg5LjRjMjQuOSAyNCA2NS42IDI0IDkwLjEtLjRsNTEuMS01MWMxMS41LTExLjUgMzAuMS0xMS41IDQxLjYgLjFzMTEuNCAzMC4yLS4xIDQxLjdsLTUxLjEgNTFjLTQ3LjEgNDcuMS0xMjQgNDcuNy0xNzEuOSAxLjZsLTkyLTkwLjJDLTEuNCAzNDEuMy02IDI2Ny45IDM4IDIyMC43TDIzNS40IDkuM3pNNDExLjcgMjczLjJjMTYuMiAwIDI5LjQgMTMuMiAyOS40IDI5LjVzLTEzLjIgMjkuNS0yOS40IDI5LjVsLTIxNi45IDBjLTE2LjIgMC0yOS40LTEzLjItMjkuNC0yOS41czEzLjItMjkuNSAyOS40LTI5LjVsMjE2LjkgMHoiXQogICAgfTsKICAgIGZhTWRiID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1kYiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmOGNhIiwgIk0xNy40IDE2MC40bC0xMC40IDE5MS42IDQzLjkgMCA1LjYtNzkuOCAyNy45IDc5LjggNDQuNyAwIDI1LjUtNzcuNCA0LjggNzcuNCA0NS41IDAtMTIuOC0xOTEuNi00NS41IDAtNDAuNyAxMTcuMy00Mi4zLTExNy4zLTQ2LjMgMHptMjgxIDBsLTQ3LjkgMCAwIDE5MS42IDQ3LjkgMHM5NSAuOCA5NC4yLTk1LjhjLS44LTk0LjItOTQuMi05NS44LTk0LjItOTUuOGwwIDB6bS0xLjIgMTQ2LjVsMC0xMDIuMXM0NiA0LjMgNDYuOCA1MC42LTQ2LjggNTEuNS00Ni44IDUxLjVsMCAwem0yMzguMy03NC4yYzcuMi0xMS40IDEwLTI1IDgtMzguMy01LjMtMzUuOC01NS4xLTM0LjMtNTUuMS0zNC4zbC01MS45IDAgMCAxOTEuNiA0NS41IDBzODcgNC44IDg3LTYzLjhjMC00My4xLTMzLjUtNTUuMS0zMy41LTU1LjFsMCAwem0tNTEuOS0zMS45czEzLjYtMS42IDE2IDkuNmMxLjQgNi43LTQgMTItNCAxMmwtMTIgMCAwLTIxLjZ6bS0uMSAxMDkuNWwuMS0yNC45IDAtMTguMiAuMSAwczQxLjYtNC43IDQxLjIgMjIuNGMtLjMgMjUuNy00MS4zIDIwLjctNDEuMyAyMC43bDAgMHoiXQogICAgfTsKICAgIGZhUGFnZTQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicGFnZTQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjNkNyIsICJNMjU2IDUwNEMxMTkgNTA0IDggMzkzIDggMjU2UzExOSA4IDI1NiA4YzIwLjkgMCA0MS4zIDIuNiA2MC43IDcuNUw1MC4zIDM5MiAyNTYgMzkyIDI1NiA1MDR6bTAtMTQzLjZsMC0yMTMuNi0xNDkuNCAyMTMuNiAxNDkuNCAwek0zNTIgMzkybDAgOTIuN2M0NS43LTE5LjIgODQuNS01MS43IDExMS40LTkyLjdMMzUyIDM5MnptNTcuNC0xMzguMmwtMjEuMiA4LjQgMjEuMiA4LjMgMC0xNi43em0tMjAuMyA1NC41Yy02LjcgMC04IDYuMy04IDEyLjlsMCA3LjcgMTYuMiAwIDAtMTBjMC01LjktMi4zLTEwLjYtOC4yLTEwLjZ6TTUwNCAyNTZjMCAzNy4zLTguMiA3Mi43LTIzIDEwNC40bC0xMjkgMCAwLTMzMy4xQzQ0MS4zIDY0LjggNTA0IDE1My4xIDUwNCAyNTZ6TTM2OC40IDE0My42bDY4LjIgMCAwLTQ3LjYtMTMuOSAwIDAgMzIuNi0xMy45IDAgMC0yOS42LTEzLjkgMCAwIDI5LjYtMTIuNyAwIDAtMzIuNi0xMy45IDAgMCA0Ny42IC4xIDB6bTY4LjEgMTg1LjNsLTI2LjUgMCAwLTExYzAtMTUuNC01LjYtMjUuMi0yMC45LTI1LjItMTUuNCAwLTIwLjcgMTAuNi0yMC43IDI1LjlsMCAyNS4zIDY4LjIgMCAwLTE1LS4xIDB6bTAtMTAzbC02OC4yIDI5LjcgMCAxMi40IDY4LjIgMjkuNSAwLTE2LjYtMTQuNC01LjcgMC0yNi41IDE0LjQtNS45IDAtMTYuOXptLTQuOC02OC41bC0zNS42IDAgMCAyNi42IDEzLjkgMCAwLTEyLjIgMTEgMGM4LjYgMTUuOCAxLjMgMzUuMy0xOC42IDM1LjMtMjIuNSAwLTI4LjMtMjUuMy0xNS41LTM3LjdsLTExLjYtMTAuNmMtMTYuMiAxNy41LTEyLjIgNjMuOSAyNy4xIDYzLjkgMzQgMCA0NC43LTM1LjkgMjkuMy02NS4zeiJdCiAgICB9OwogICAgZmFUaGVSZWRZZXRpID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInRoZS1yZWQteWV0aSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNjlkIiwgIk00ODguNyAyNDEuN2wyMC43IDcuMWMtOS42LTIzLjktMjMuOS0zNy0zMS43LTQ0LjhsNy4xLTE4LjJjLjIgMCAxMi4zLTI3LjgtMi41LTMwLjctLjYtMTEuMy02LjYtMjctMTguNC0yNy03LjYtMTAuNi0xNy43LTEyLjMtMzAuNy01LjktOS4xIDQuNC0xNy42IDEwLTI1LjMgMTYuNS01LjMtNi40LTMgLjQtMy0yOS44LTM3LjEtMjQuMy00NS40LTExLjctNzQuOCAzbC41IC41Yy0yMi03LjctNDUuMS0xMi4yLTY4LjQtMTMuMy01LjUtOC43LTE4LjYtMTkuMS0yNS4xLTI1LjFsMjQuOCA3LjFjLTUuNS01LjUtMjYuOC0xMi45LTM0LjItMTUuMiAxOC4yLTQuMSAyOS44LTIwLjggNDIuNS0zMy0zNC45LTEwLjEtNjcuOS01LjktOTcuOSAxMS44bDEyLTQ0LjItMS44LS41Yy0zMS42IDI0LjItMzMgNDEuOS0zMy43IDQ1LjUtLjktMi40LTYuMy0xOS42LTE1LjItMjctMy4zIDguMS0zLjUgMTcuMS0uNSAyNS4zIDMgOC40IDUuOSAxNC44IDguNCAxOC45LTE2LTMuMy0yOC4zLTQuOS00OS4yIDBsLTMuNyAwIDMzIDE0LjNjLTIwLjIgMTguOS0zNi4xIDQxLjktNDYuNyA2Ny40bC0xLjcgOC40IDEuNyAxLjcgNy42LTQuN2MtMy4zIDExLjYtNS4zIDE5LjQtNi42IDI1LjgtMTAuOSAxMi4yLTIwLjIgMjUuOC0yNy44IDQwLjMtMTUgMS0zMS44IDEwLjgtNDAuMyAxNC4zbDMgMy40IDI4LjggMWMtLjUgMS0uNyAyLjItMS4yIDMuMi03LjMgNi40LTM5LjggMzcuNy0zMyA4MC43bDIwLjItMjIuNGMuNSAxLjcgLjcgMy40IDEuMiA1LjIgMCAyNS41IC40IDg5LjYgNjQuOSAxNTAuNSA0My42IDQwIDk2IDYwLjIgMTU3LjUgNjAuMiAxMjEuNyAwIDIyMy04Ny4zIDIyMy0yMTEuNSA2LjgtOS43LTEuMiAzIDE2LjctMjUuMWwxMyAxNC4zIDIuNS0uNWMtMS44LTExLjctNC44LTIzLjEtOC45LTM0LjItMS41LTQuOC0zLjgtOS4zLTYuOC0xMy4zbDAgMHpNMzk4LjUgMTExLjJsLS41IDIxLjljNS41IDE4LjEgMTYuOSAxNy4yIDIyLjQgMTcuMmwtMy40LTQuNyAyMi40LTUuNGMtOSAuNS0xOCAuNS0yNyAwIDEyLjgtMi4xIDMzLjMtMjkgNDMtMTEuMyAzLjQgNy42IDYuNCAxNy4yIDkuMyAyNy44bDEuNy01LjljLTEuMy01LTEuOC0xMC4xLTEuNy0xNS4yIDUuNCAuNSA4LjggMy40IDkuMyAxMC4xIC41IDYuNCAxLjcgMTQuOCAzLjQgMjUuM2w0LjctMTEuM2M0LjYgMCA0LjUtMy42LTIuNSAyMC43LTIwLjktOC43LTM1LjEtOC40LTQ2LjUtOC40bDE4LjItMTZjLTI1LjMgOC4yLTMzIDEwLjgtNTQuOCAyMC45LTEuMS01LjQtNS0xMy41LTE2LTE5LjktMy4yIDMuOC0yLjggLjktLjcgMTQuOGwtMi41IDBjLTEuMi04LjItNC4xLTE2LTguNC0yMy4xbDQuMi0zLjRjOC40LTcuMSAxMS44LTE0LjMgMTAuNi0yMS45LS41LTYuNC01LjQtMTMuNS0xMy41LTIwLjcgNS42LTMuNCAxNS4yLS40IDI4LjMgOC41em0tMzkuNi0xMC4xYzIuNyAxLjkgMTEuNCA1LjQgMTguOSAxNy4yIDQuMiA4LjQgNCA5LjggMy40IDExLjEtLjUgMi40LS41IDQuMy0zIDcuMS0xLjcgMi41LTUuNCA0LjctMTEuOCA3LjYtNy42LTEzLTE2LjUtMjMuNi0yNy44LTMxLjJsMjAuMy0xMS44em0tMjY3LjQgNDJsMS4yLTEuN2MxLjItMi45IDQuMi03LjYgOS4zLTE1LjJsMi41LTMuNC0xMyAxMi4zIDUuNC00LjctMTAuMSA5LjMtNC4yIDEuMmMxMi4zLTI0LjEgMjMuMS00MS4zIDMyLjUtNTAuMiA5LjMtOS4zIDE2LTE2IDIwLjItMTkuNGwtNi40IDEuMmMtMTEuMy00LjItMTkuNC03LjEtMjQuOC04LjQgMi41LS41IDMuNy0uNSAzLjItLjUgMTAuMyAwIDE3LjUgLjUgMjAuOSAxLjIgNS4yIDEuNyAxMC42IDIuNSAxNiAyLjVsLjUtMS43LTguNC0zNS44IDEzLjUgMjljMi44LTQuNCA0LjgtOS4yIDUuOS0xNC4zIDEuNy02LjQgNS40LTEzIDEwLjEtMTkuNHM3LjYtMTAuNiA5LjMtMTEuM2MtMi42IDguMy00LjcgMTYuOC02LjQgMjUuM2wtMS43IDcuMS0uNSA0LjcgMi41IDIuNWMyMS45LTEzLjUgNDUuNS0xOS40IDcxLjMtMTguOWwyMS4xIC41Yy0xMS44IDEzLjUtMjcuOCAyMS45LTQ4LjUgMjQuOC03LjcgMS40LTE1LjYgMi40LTIzLjQgMi45bC0uMi0uNS0yLjUtMS4yYy00LjgtMS05LjctLjMtMTQgMi0yLjUtLjItNC45LS41LTcuMS0uN2wtMi41IDEuNyAuNSAxLjJjMiAuMiAzLjkgLjUgNi4yIC43bC0yIDMuNCAzLjQtLjUtMTAuNiAxMS4zYy00LjIgMy01LjQgNi40LTQuMiA5LjNsNS40LTMuNCAxLjIgMGM2LjEtOC4yIDE1LjItMTMuNiAyNS4zLTE1LjJsMC0zYzYuNCAuNSAxMyAxIDE5LjQgMS4yIDYuNCAwIDguNCAuNSA1LjQgMS4yIDcuMiA0IDE0LjEgOC42IDIwLjcgMTMuNSAxMy41IDEwLjEgMjMuNiAyMS45IDMwIDM1LjQgOC44IDE4LjIgMTMuNSAzNy4xIDEzLjUgNTYuNiAwIDkuNS0xIDE5LTMgMjguMy0zLjUgMTUuOS04LjkgMzEuMy0xNiA0NmwyLjUgLjVjMTguMi0xOS43IDQxLjktMTYgNDkuMi0xNmwtNi40IDUuOSAyMi40IDE3LjctMS43IDMwLjdjLTUuNC0xMi4zLTE2LjUtMjEuMS0zMy0yNy44IDE2LjUgMTQuOCAyMy42IDIxLjEgMjEuOSAyMC4yLTQuOC0yLjgtMy41LTEuOS0xMC44LTMuNyA0LjEgNC4xIDE3LjUgMTguOCAxOC4yIDIwLjdsLjIgLjItLjIgLjJjMCAxLjggMS42LTEuMi0xNCAyMi45LTc1LjItMTUuMy0xMDYuMy00Mi43LTE0MS4yLTYzLjJsMTEuOCAxLjJjLTExLjgtMTguNS0xNS42LTE3LjctMzguNC0yNi4xbDEwLjYtOC40Yy04LjgtMy0xOC4yLTMtMjguMyAuNWw3LjYtMTAuNi0xLjItMS43Yy0xNC45IDQuMy0xOS44IDkuMi0yMi42IDExLjMtMS4xLTUuNS0yLjgtMTIuNC0xMi4zLTI4LjhsLTEuMiAyNy0xMy4yLTVjMS41LTI1LjIgNS40LTUwLjUgMTMuMi03NC42ek0zNjggNDczLjFjLTQ5LjkgMjUtNTYuMSAyMi40LTU5IDIzLjktMjkuOC0xMS44LTUwLjktMzEuNy02My41LTU4LjhsMzAgMTYuNWMtOS44LTkuMy0xOC4zLTE2LjUtMzguNC00NC4zbDExLjggMjMuMS0xNy43LTcuNmMxNC4yIDIxLjEgMjMuNSA1MS43IDY2LjYgNzMuNS0xMjAuOCAyNC4yLTE5OS03Mi4xLTIwMC45LTc0LjMgMTEuMSA5LjIgMjIuOSAxNy41IDM1LjQgMjQuOCAzLjQgMS43IDcuMSAyLjUgMTAuMSAxLjJsLTE2LTIwLjdjOS4yIDQuMiA5LjUgNC41IDY5LjEgMjktNDIuNS0yMC43LTczLjgtNDAuOC05My4yLTYwLjItLjUgNi40LTEuMiAxMC4xLTEuMiAxMC4xIDguNyA3LjMgMTUuOCAxNi40IDIwLjcgMjYuNi0zOS0xOC45LTU3LjYtNDcuNi03MS4zLTgyLjYgNDkuOSA1NS4xIDExOC45IDM3LjUgMTIwLjUgMzcuMSAzNC44IDE2LjQgNjkuOSAyMy42IDExMy45IDEwLjYgMy4zIDAgMjAuMyAxNyAyNS4zIDM5LjFsNC4yLTMtMi41LTIzLjZjOSA5IDI0LjkgMjIuNiAzNC40IDEzLTE1LjYtNS4zLTIzLjUtOS41LTI5LjUtMzEuNyA0LjYgNC4yIDcuNiA5IDI3LjggMTVsMS4yLTEuMi0xMC41LTE0LjJjMTEuNy00LjgtMy41IDEgMzItMTAuOCA0LjMgMzQuMyA5IDQ5LjIgLjcgODkuNXpNNDgzLjMgMjU4LjdsLTIuNSAuNSAzIDkuM2MtMy41IDUuOS0yMy43IDQ0LjMtNzEuNiA3OS43LTM5LjUgMjkuOC03Ni42IDM5LjEtODAuOSA0MC4zbC03LjYtNy4xLTEuMiAzIDE0LjMgMTYtNy4xLTQuNyAzLjQgNC4yLTEuMiAwLTIxLjktMTMuNSA5LjMgMjYuNi0xOS0yNy45LTEuMiAyLjUgNy42IDI5Yy02LjEtOC4yLTIxLTMyLjYtNTYuOC0zOS42bDMyLjUgMjEuMmMtMzEuMiA0LjctNjMgMi41LTkzLjItNi40LTQuMi0xLjItOC45LTIuNS0xMy41LTQuMmwxLjItMy00NC44LTIyLjQgMjYuMSAyMi40Yy01Ny43IDkuMS0xMTMtMjUuNC0xMjYuNC04My40TDI5LjMgMjg0LjggNyAzMDcuMWMxOS41LTU3LjUgMjUuNi01Ny45IDUxLjQtNzAuMS05LjEtNS4zLTEuNi0zLjMtMzguNC05LjMgMTUuOC01LjggMzMtMTUuNCA3MyA1LjIgMS4yLS43IDIuNC0xLjMgMy43LTEuNyAuNi0zLjIgLjQtLjggMS0xMS44IDMuOSAxMCAzLjYgOC43IDMgOS4zbDEuNyAuNWMxMi43LTYuNSA4LjktNC41IDE3LTguOWwtNS40IDEzLjUgMjIuMy01LjgtOC40IDguNCAyLjUgMi41YzQuNS0xLjggMzAuMyAzLjQgNDAuOCAxNmwtMjMuNi0yLjVjMzkuNCAyMyA1MS41IDU0IDU1LjggNjkuNmwxLjctMS4yYy0yLjgtMjIuMy0xMi40LTMzLjktMTYtNDAuMSA0LjIgNSAzOS4yIDM0LjYgMTEwLjQgNDYtMTEuMy0uNS0yMy4xIDUuNC0zNC45IDE4LjlsNDYuNy0yMC4yLTkuMyAyMS45YzcuNi0xMC4xIDE0LjgtMjMuNiAyMS4yLTM5LjZsMC0uNSAxLjItMy0xLjIgMTZjMTMuNS00MS44IDI1LjMtNzguNSAzNS40LTEwOS43bDEzLjUtMjcuOCAwLTItNS40LTQuMiAxMC4xIDAgNS45IDQuMiAyLjUtMS4yLTMuNC0xNiAxMi4zIDE4LjkgNDEuOC0yMC4yLTE0LjggMTMgLjUgMi45IDE3LjctLjVjMTEuMSAuNCAyMi4xIDEuOCAzMyA0LjJsLTIzLjYgMi41LTEuMiAzIDI2LjYgMjMuMWM5LjkgOS45IDE4LjkgMjAuNiAyNyAzMi0xMS4yLTMuMy0xMC4zLTMuNC0yMS4yLTMuNGwxMi4zIDMyLjUtOC45LTEyLjh6bS02LjEtNzEuM2wtMy45IDEzLTE0LjMtMTEuOCAxOC4yLTEuMnptLTI1NC44IDcuMWMxLjcgMTAuNiA0LjcgMTcuNyA4LjggMjEuOS05LjMgNi42LTI3LjUgMTMuOS00Ni41IDE2bC41IDEuMmM4LjMgMS4zIDE2LjkgLjQgMjQuOC0yLjVsLTcuMSAxM2M0LjItMS43IDEwLjEtNy4xIDE3LjctMTQuOCAxMS45LTUuNSAxMi43LTUuMSAyMC4yLTE2LTEyLjctNi40LTE1LjctMTMuNy0xOC40LTE4Ljh6bTMuNy0xMDIuM2MtNi40LTMuNC0xMC42IDMtMTIuMyAxOC45czIuNSAyOS41IDExLjggMzkuNiAxOC4yIDEwLjYgMjYuMSAzIDMuNC0yMy42LTExLjMtNDcuN2MtMy41LTUuNy04LjQtMTAuNS0xNC4zLTEzLjhsMCAwem0tNC43IDQ2LjNjNS40IDIuMiAxMC41IDEuOSAxMi4zLTEwLjZsMC00LjctMS4yIC41Yy00LjMtMy4xLTIuNS00LjUtMS43LTYuMmwuNS0uNWMtLjktMS4yLTUtOC4xLTEyLjUgNC43LS41LTEzLjUgLjUtMjEuOSAzLTI0LjggMS4yLTIuNSA0LjctMS4yIDExLjMgNC4yIDYuNCA1LjQgMTEuMyAxNiAxNS4yIDMyLjUgNi41IDI4LTE5LjggMjYuMi0yNi45IDQuOXptLTQ1LTUuNWMxLjYgLjMgOS4zLTEuMSA5LjMtMTQuOGwtLjUgMGMtNS40LTEuMS0yLjItNS41LS43LTUuOS0xLjctMy0zLjQtNC4yLTUuNC00LjctOC4xIDAtMTEuNiAxMi43LTguMSAyMS4yIC41IDEuMSAxLjMgMiAyLjIgMi44czIgMS4yIDMuMiAxLjRsMCAwem00MC4xLTUwLjFsLTIuNSAuNSAuNSAzYzkuMS0uNSAxOC4xIDEuNSAyNi4xIDUuOS0yLjUtNS41LTEwLTE0LjMtMjguMy0xNC4zbC41IDIuNSAzLjcgMi40em0tNzEuOCA0OS40YzIxLjcgMTYuOCAxNi41IDIxLjQgNDYuNSAyMy42bC0yLjktNC43YzguNC03LjIgMTMuNy0xNy4zIDE0LjgtMjguMyAxLjctMTYtMS4yLTI5LjUtOC44LTQxLjNsMTMtNy42YzAtLjMgMC0uNi0uMS0uOXMtLjItLjYtLjQtLjhjLTIuMi0uOS00LjYtMS4yLTctLjlzLTQuNiAxLjItNi41IDIuNmMtMTIuNyA2LjctMjggMjAuOS0yOSAyMi40LTEuNyAxLjctMy40IDUuOS01LjQgMTMuNS0xLjkgNy43LTIuOSAxNS42LTIuOSAyMy42LTQuNy04LTEwLjUtNi40LTE5LjktNS45bDcuMSA3LjZjLTE2LjUgMC0yMy4zIDE1LjQtMjMuNiAxNiA2LjggMCA0LjYtNy42IDMwLTEyLjMtNC4zLTYuMy0zLjMtNS00LjktNi42em0xOC43LTE4LjdjMS4yLTcuNiAzLjQtMTMgNi40LTE3LjIgNS40LTYuNCAxMC42LTEwLjEgMTYtMTEuOCA0LjItMS43IDcuMSAxLjIgMTAuMSA5LjMgMi41IDguMiAzLjUgMTYuOCAzIDI1LjMtLjUgOS4zLTMuNCAxNy4yLTguNCAyMy4xLTIuOSAzLjQtNS40IDUuOS02LjQgNy42LTMuOCAuNC03LjYgLjItMTEuMy0uNWwtNy4xLTMuNC01LjQtNi40Yy44LTEwIDEuMy0xOC44IDMuMS0yNnptNDIgNTYuMWMtMzQuOCAxNC40LTM0LjcgMTQtMzYuMSAxNC4zLTIwLjggNC43LTE5LTI0LjQtMTguOS0yNC44bDUuOS0xLjItLjUtMi41Yy0yMC4yLTIuNi0zMSA0LjItMzIuNSA0LjkgLjUgLjUgMyAzLjQgNS45IDkuMyA0LjItNi40IDguOC0xMC4xIDE1LjItMTAuNi0xLjcgMTEuMi0xLjIgMjIuNyAxLjcgMzMuNyAuMSAuNSAyLjYgMTcuNCAyNy41IDI0LjEgMTEuMyAzIDI3IDEuMiA0OC45LTUuNGwtOS4yIC41Yy00LjItMTQuOC02LjQtMjQuOC01LjktMjkuNSAxMS4zLTguOCAyMS45LTExLjMgMzAuNy03LjZsMi41IDAtMTEuOC03LjYtNy4xIC41Yy01LjkgMS4yLTEyLjMgNC4yLTE5LjQgOC40bDMuMS02LjV6Il0KICAgIH07CiAgICBmYUppcmEgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiamlyYSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmN2IxIiwgIk00OTguNSAyNDEuN2MtNzIuOS03Mi43LTE2OS40LTE2OS45LTI0MS41LTI0MS43LTE2NS41IDE2NC45LTI0Mi41IDI0MS43LTI0Mi41IDI0MS43LTcuOSA3LjktNy45IDIwLjcgMCAyOC43IDEzMi44IDEzMi4zIDYxLjggNjEuNSAyNDIuNSAyNDEuNiAzNzkuNC0zNzggMTUuNy0xNi43IDI0MS41LTI0MS43IDgtNy45IDgtMjAuNyAwLTI4LjZ6TTI1NyAzMzEuN2wtNzYtNzUuNyA3Ni03NS43IDc2IDc1LjctNzYgNzUuN3oiXQogICAgfTsKICAgIGZhRmVkZXggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZmVkZXgiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjc5NyIsICJNNTg2IDI4NC41bDUzLjMtNTkuOS02Mi40IDAtMjEuNyAyNC44LTIyLjUtMjQuOC0xMTguNyAwIDAtMTYgNTYuMSAwIDAtNDguMS0xNTEuMiAwIDAgNzUuNS0uNSAwYy05LjYtMTEtMjEuNS0xNC44LTM1LjQtMTQuOC0yOC40IDAtNDkuOCAxOS40LTU3LjMgNDQuOS0xOC01OS40LTk3LjQtNTcuNi0xMjEuOS0xNGwwLTI0LjItNTQuOCAwIDAtMjYuMiA2MCAwIDAtNDEuMS0xMDkgMCAwIDE4NC40IDQ5IDAgMC03Ny41IDQ4LjkgMGMtMS41IDUuNy0yLjMgMTEuOC0yLjMgMTguMiAwIDczLjEgMTAyLjYgOTEuNCAxMzAuMiAyMy43bC00MiAwYy0xNC43IDIwLjktNDUuOCA4LjktNDUuOC0xNC42bDg1LjUgMGMzLjcgMzAuNSAyNy40IDU2LjkgNjAuMSA1Ni45IDE0LjEgMCAyNy02LjkgMzQuOS0xOC42bC41IDAgMCAxMS45IDIxMi4yIDAgMjIuMS0yNSAyMi4zIDI1IDY0LjQgMC01NC02MC41ek0xMzkuMyAyNjcuOWM2LjEtMjYuMyA0MS43LTI1LjYgNDYuNSAwbC00Ni41IDB6bTE1My40IDQ4LjljLTM0LjYgMC0zNC02Mi44IDAtNjIuOCAzMi42IDAgMzQuNSA2Mi44IDAgNjIuOHptMTY3LjggMTkuMWwtOTQuNCAwIDAtMTY2LjUgOTUgMCAwIDMwLjItNTYuMSAwIDAgMzMuOSA1NS41IDAgMCAyOC4xLTU2LjEgMCAwIDQ0LjcgNTYuMSAwIDAgMjkuNnptLTQ1LjktMzkuOGwwLTI0LjQgNTYuMSAwIDAtNDQgNTAuNyA1Ny01MC43IDU3IDAtNDUuNi01Ni4xIDB6bTEzOC42IDEwLjNsLTI2LjEgMjkuNS0zOC4xIDAgNDUuNi01MS4yLTQ1LjYtNTEuMiAzOS43IDAgMjYuNiAyOS4zIDI1LjYtMjkuMyAzOC41IDAtNDUuNCA1MSA0NiA1MS40LTQwLjUgMC0yNi4zLTI5LjV6Il0KICAgIH07CiAgICBmYUV2ZXJub3RlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImV2ZXJub3RlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY4MzkiLCAiTTEyMS4xIDEzMi4yYzEuNiAyMi4zLTE3LjYgMjEuNi0yMS42IDIxLjYtNjguOSAwLTczLjYtMS04My42IDMuMy0uNiAuMi0uNyAwLS40LS40TDEyNC4xIDQ2LjRjLjQtLjQgLjYtLjIgLjQgLjQtNC40IDEwLTMuNCAxNS4xLTMuNCA4NS40em03OSAzMDhjLTE0LjctMzcuMSAxMy03Ni45IDUyLjUtNzYuNiAxNy41IDAgMjIuNiAyMy4yIDcuOSAzMS40LTYuMiAzLjMtMjQuOSAxLjctMjUuMSAxOS4yIDAgMTcuMSAxOS43IDI1IDMxLjIgMjQuOSA2IDAgMTEuOS0xLjIgMTcuNS0zLjVzMTAuNi01LjcgMTQuOC05LjkgNy42LTkuMyA5LjktMTQuOCAzLjUtMTEuNSAzLjUtMTcuNWwwLS4xYzAtMTEuNi03LjgtNDcuMi00Ny41LTU1LjMtNy43LTEuNS02NS02LjMtNjguNC01MC41LTMuNyAxNi45LTE3LjQgNjMuNS00My4xIDY5LjEtOC43IDEuOS02OS43IDcuNi0xMTIuOS0zNi44IDAgMC0xOC42LTE1LjItMjguMi01OC0zLjQtMTUuNy05LjMtMzkuNy0xMS4xLTYyIDAtMTggMTEuMS0zMC40IDI1LjEtMzIuMiA4MSAwIDkwIDIuMyAxMDEtNy44IDkuOC05LjIgNy44LTE1LjUgNy44LTEwMi44IDEtOC4zIDcuOC0zMC44IDUzLjQtMjQuMSA2IC45IDMxLjkgNC4yIDM3LjUgMzAuNkwyOTAgNzQuOGMyMC40IDMuNyA3MC45IDcgODAuNiA1Ny45IDIyLjcgMTIxLjEgOC45IDIzOC41IDcuOCAyMzguNS0xNiAxMTQuNC0xMTEuMSAxMDguOS0xMTEuMSAxMDguOS0xOS0uMi01NC4yLTkuNC02Ny4zLTM5LjhsMCAwek0yODEgMjM1LjRjLTEgMS45LTIuMiA2IC45IDcgMTQuMSA0LjkgMzkuOCA2LjggNDUuOSA1LjUgMy4xLS4yIDMuMS00LjQgMi41LTYuNi0zLjUtMjEuOC00MC44LTI2LjUtNDkuMi01LjlsMCAweiJdCiAgICB9OwogICAgZmFVc2IgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidXNiIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYyODciLCAiTTYzMy41IDI1NmMwIDMuMS0xLjcgNi4xLTQuNSA3LjVMNTM5LjkgMzE3Yy0xLjQgLjgtMi44IDEuNC00LjUgMS40LTEuNCAwLTMuMS0uMy00LjUtMS4xLTIuOC0xLjctNC41LTQuNS00LjUtNy44bDAtMzUuNi0yMzAuNyAwYzI1LjMgMzkuNiA0MC41IDEwNi45IDY5LjYgMTA2LjlsMjYuNyAwIDAtMjYuOGMwLTUgMy45LTguOSA4LjktOC45bDg5LjEgMGM1IDAgOC45IDMuOSA4LjkgOC45bDAgODkuMWMwIDUtMy45IDguOS04LjkgOC45bC04OS4xIDBjLTUgMC04LjktMy45LTguOS04LjlsMC0yNi43LTI2LjcgMGMtNzUuNCAwLTgxLjEtMTQyLjUtMTI0LjctMTQyLjVsLTEwMC4zIDBjLTguMSAzMC42LTM1LjkgNTMuNS02OSA1My41LTM5LjMtLjEtNzEuMy0zMi4xLTcxLjMtNzEuNHMzMi03MS4zIDcxLjMtNzEuM2MzMy4xIDAgNjEgMjIuOCA2OSA1My41IDM5LjEgMCA0My45IDkuNSA3NC42LTYwLjQgNDAuMS04OS4xIDU4LjEtODIuMSAxMDguOS04Mi4xIDcuNS0yMC45IDI3LTM1LjYgNTAuNC0zNS42IDI5LjUgMCA1My41IDIzLjkgNTMuNSA1My41cy0yMy45IDUzLjUtNTMuNSA1My41Yy0yMy40IDAtNDIuOS0xNC44LTUwLjQtMzUuNmwtMjkuOCAwYy0yOS4xIDAtNDQuMyA2Ny40LTY5LjYgMTA2LjlsMzAyLjEgMCAwLTM1LjZjMC0zLjMgMS43LTYuMSA0LjUtNy44czYuNC0xLjQgOC45IC4zTDYyOSAyNDguOGMyLjggMS4xIDQuNSA0LjEgNC41IDcuMnoiXQogICAgfTsKICAgIGZhQW5ncnljcmVhdGl2ZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhbmdyeWNyZWF0aXZlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYzNmUiLCAiTTY0MCAyMzguMmwtMy4yIDI4LjItMzQuNSAyLjMtMiAxOC4xIDM0LjUtMi4zLTMuMiAyOC4yLTM0LjQgMi4yLTIuMyAyMC4xIDM0LjQtMi4yLTMgMjYuMS02NC43IDQuMSAxMi43LTExMy4yLTQ3LjMgMTE1LjQtMzEuOSAyLTIzLjgtMTE3LjggMzAuMy0yIDEzLjYgNzkuNCAzMS43LTgyLjQgOTMuMS02LjJ6TTQyNi44IDM3MS41bDI4LjMtMS44IDEyLjktMTIwLjEtMjguNCAxLjktMTIuOCAxMjB6TTE2MiAzODguMWwtMTkuNC0zNi0zLjUgMzcuNC0yOC4yIDEuNyAyLjctMjkuMWMtMTEgMTgtMzIgMzQuMy01Ni45IDM1LjgtMzIuOCAyLTU5LjctMjAuOS01Ni40LTU4LjIgMi42LTI5LjMgMjYuNy02Mi44IDY3LjUtNjUuNCAzNy43LTIuNCA0Ny42IDIzLjIgNTEuMyAyOC44bDIuOC0zMC44IDM4LjktMi41YzIwLjEtMS4zIDM4LjcgMy43IDQyLjUgMjMuN2wyLjYtMjYuNiA2NC44LTQuMi0yLjcgMjcuOS0zNi40IDIuNC0xLjcgMTcuOSAzNi40LTIuMy0yLjcgMjcuOS0zNi40IDIuMy0xLjkgMTkuOSAzNi4zLTIuMy0yLjEgMjAuOCA1NS0xMTcuMiAyMy44LTEuNiAzMi4xIDExMC42IDguOS04NS42LTIyLjMgMS40IDIuOS0yNy45IDc1LTQuOS0zIDI4LTI0LjMgMS42LTkuNyA5MS45LTU4IDMuNy00LjMtMTUuNi0zOS40IDIuNS04IDE2LjMtMTI2LjIgNy43em0tNDQuMy03MC4ybC0yNi40IDEuN2MtNi43LTEyLjQtMTQuNC0xNi42LTI2LjMtMTUuOC0xOSAxLjItMzMuMyAxNy41LTM0LjYgMzMuMy0xLjQgMTYgNy4zIDMyLjUgMjguNyAzMS4yIDEyLjgtLjggMjEuMy04LjYgMjguOS0xOC45bDI3LTEuNyAyLjctMjkuOHptNTYuMS03LjdjMS4yLTEyLjktNy42LTEzLjYtMjYuMS0xMi40TDE0NSAzMjYuM2MxNC4yLS45IDI3LjUtMi4xIDI4LjgtMTYuMXpNMTk0LjkgMzgxbDUuOC02MGMtNSAxMy41LTE0LjcgMjEuMS0yNy45IDI2LjZMMTk0LjkgMzgxem0xMzUuNC00NWwtNy45LTM3LjgtMTUuOCAzOS4zIDIzLjctMS41ek0xNjAuMiAyNjEuNGwtNC4zLTE3LjUtMzkuNiAyLjYtOC4xIDE4LjItMzEuOSAyLjEgNTctMTIxLjkgMjMuOS0xLjYgMzAuNyAxMDIgOS45LTEwNC43IDI3LTEuOCAzNy44IDYzLjYgNi41LTY2LjYgMjguNS0xLjktNCA0MS4yYzcuNC0xMy41IDIyLjktNDQuNyA2My42LTQ3LjUgNDAuNS0yLjggNTIuNCAyOS4zIDUzLjQgMzAuM2wzLjMtMzIgMzkuMy0yLjdjMTIuNy0uOSAyNy44IC4zIDM2LjMgOS43bC00LjQtMTEuOSAzMi4yLTIuMiAxMi45IDQzLjIgMjMtNDUuNyAzMS0yLjItNDMuNiA3OC40LTQuOCA0NC4zLTI4LjQgMS45IDQuOC00NC4zLTE1LjgtNDNjMSAyMi4zLTkuMiA0MC4xLTMyIDQ5LjZsMjUuMiAzOC44LTM2LjQgMi40LTE5LjItMzYuOC00IDM4LjMtMjguNCAxLjkgMy4zLTMxLjVjLTYuNyA5LjMtMTkuNyAzNS40LTU5LjYgMzgtMjYuMiAxLjctNDUuNi0xMC4zLTU1LjQtMzkuMmwtNCA0MC4zLTI1IDEuNi0zNy42LTYzLjMtNi4zIDY2LjItNTYuOCAzLjd6bTI3Ni42LTgyLjFjMTAuMi0uNyAxNy41LTIuMSAyMS42LTQuMyA0LjUtMi40IDctNi40IDcuNi0xMi4xIC42LTUuMy0uNi04LjgtMy40LTEwLjQtMy42LTIuMS0xMC42LTIuOC0yMi45LTJsLTIuOSAyOC44ek0zMjcuNyAyMTRjNS42IDUuOSAxMi43IDguNSAyMS4zIDcuOSA0LjctLjMgOS4xLTEuOCAxMy4zLTQuMSA1LjUtMyAxMC42LTggMTUuMS0xNC4zbC0zNC4yIDIuMyAyLjQtMjMuOSA2My4xLTQuMyAxLjItMTItMzEuMiAyLjFjLTQuMS0zLjctNy44LTYuNi0xMS4xLTguMS00LTEuNy04LjEtMi44LTEyLjItMi41LTggLjUtMTUuMyAzLjYtMjIgOS4yLTcuNyA2LjQtMTIgMTQuNS0xMi45IDI0LjQtMS4xIDkuNiAxLjQgMTcuMyA3LjIgMjMuM3ptLTIwMS4zIDguMmwyMy44LTEuNi04LjMtMzcuNi0xNS41IDM5LjJ6Il0KICAgIH07CiAgICBmYU1penVuaSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJtaXp1bmkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjNjYyIsICJNMjU2IDhhMjQ4IDI0OCAwIDEgMCAwIDQ5NiAyNDggMjQ4IDAgMSAwIDAtNDk2ek0xNzYgMzU5LjljLTMxLjQgMTAuNi01OC44IDI3LjMtODAgNDguMkw5NiAxMzZjMC0yMi4xIDE3LjktNDAgNDAtNDBzNDAgMTcuOSA0MCA0MGwwIDIyMy45ek0yOTYgMzUwYy0xMi45LTItMjYuMi0zLjEtMzkuOC0zLjEtMTMuOCAwLTI3LjIgMS4xLTQwLjIgMy4xbDAtMjE0YzAtMjIuMSAxNy45LTQwIDQwLTQwczQwIDE3LjkgNDAgNDBsMCAyMTR6bTEyMCA1Ny43Yy0yMS4yLTIwLjgtNDguNi0zNy40LTgwLTQ4TDMzNiAxMzZjMC0yMi4xIDE3LjktNDAgNDAtNDBzNDAgMTcuOSA0MCA0MGwwIDI3MS43eiJdCiAgICB9OwogICAgZmFJdGNoSW8gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaXRjaC1pbyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmODNhIiwgIk03MS45IDM0LjhDNTAuMiA0Ny43IDcuNCA5Ni44IDcgMTA5LjdsMCAyMS4zYzAgMjcuMSAyNS4zIDUwLjggNDguMiA1MC44IDI3LjYgMCA1MC41LTIyLjggNTAuNS01MCAwIDI3LjEgMjIuMiA1MCA0OS44IDUwczQ5LTIyLjggNDktNTBjMCAyNy4xIDIzLjYgNTAgNTEuMiA1MGwuNSAwYzI3LjYgMCA1MS4yLTIyLjggNTEuMi01MCAwIDI3LjEgMjEuNSA1MCA0OSA1MHM0OS44LTIyLjggNDkuOC01MGMwIDI3LjEgMjMgNTAgNTAuNSA1MCAyMyAwIDQ4LjMtMjMuOCA0OC4zLTUwLjhsMC0yMS4zYy0uNC0xMi45LTQzLjItNjIuMS02NC45LTc1LTY3LjQtMi4zLTExNC4yLTIuNy0xODQtMi43UzkxLjEgMzMuMSA3MS45IDM0Ljh6TTIwNC4yIDE2OS4yYy0yMiAzOC40LTc3LjkgMzguNy05OS44IC4yLTEzLjIgMjMuMS00My4yIDMyLjEtNTYgMjcuNy0zLjkgNDAuMi0xMy43IDIzNy4xIDE3LjcgMjY5LjIgODAgMTguNyAzMDIuMSAxOC4xIDM3OS44IDAgMzEuNi0zMi4zIDIxLjMtMjMyIDE3LjctMjY5LjItMTIuOSA0LjQtNDIuOS00LjYtNTYtMjcuNy0yMiAzOC41LTc3LjggMzguMS05OS44LS4yLTcuMSAxMi41LTIzIDI4LjktNTEuOCAyOC45LTEwLjQgLjMtMjAuOC0yLjItMjkuOS03LjNzLTE2LjctMTIuNi0yMS45LTIxLjZsMCAwem0tNDEuNiA1My44YzE2LjUgMCAzMS4xIDAgNDkuMiAxOS44IDI5LjMtMyA1OC45LTMgODguMiAwIDE4LjItMTkuNyAzMi44LTE5LjcgNDkuMi0xOS43IDUyLjMgMCA2NS4yIDc3LjUgODMuOSAxNDQuNCAxNy4zIDYyLjItNS41IDYzLjctMzQgNjMuNy00Mi4xLTEuNi02NS41LTMyLjItNjUuNS02Mi44LTM5LjMgNi40LTEwMS45IDguOC0xNTUuNiAwIDAgMzAuNi0yMy4zIDYxLjItNjUuNSA2Mi44LTI4LjQtLjEtNTEuMi0xLjYtMzMuOS02My43IDE4LjctNjcgMzEuNi0xNDQuNCA4My45LTE0NC40bDAtLjF6TTI1NiAyNzAuOHMtNDQuNCA0MC44LTUyLjQgNTUuMmwyOS0xLjIgMCAyNS4zYzAgMS41IDIxLjMgLjIgMjMuMyAuMiAxMS42IC41IDIzLjMgMSAyMy4zLS4ybDAtMjUuMyAyOSAxLjJjLTgtMTQuNS01Mi40LTU1LjItNTIuNC01NS4ybC4xIDB6Il0KICAgIH07CiAgICBmYVdpbmRvd3MgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAid2luZG93cyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMTdhIiwgIk0wIDkzLjdsMTgzLjYtMjUuMyAwIDE3Ny40LTE4My42IDAgMC0xNTIuMXpNMCA0MTguM2wxODMuNiAyNS4zIDAtMTc1LjItMTgzLjYgMCAwIDE0OS45em0yMDMuOCAyOGwyNDQuMiAzMy43IDAtMjExLjYtMjQ0LjIgMCAwIDE3Ny45em0wLTM4MC42bDAgMTgwLjEgMjQ0LjIgMCAwLTIxMy44LTI0NC4yIDMzLjd6Il0KICAgIH07CiAgICBmYVN0dW1ibGV1cG9uID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInN0dW1ibGV1cG9uIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxYTQiLCAiTTUwMi45IDI2NmwwIDY5LjdjMCA2Mi4xLTUwLjMgMTEyLjQtMTEyLjQgMTEyLjQtNjEuOCAwLTExMi40LTQ5LjgtMTEyLjQtMTExLjNsMC03MC4yIDM0LjMgMTYgNTEuMS0xNS4yIDAgNzAuNmMwIDE0LjcgMTIgMjYuNSAyNi43IDI2LjVTNDE3IDM1Mi43IDQxNyAzMzhsMC03MiA4NS45IDB6TTI3OC4yIDIwNy44bDM0LjMgMTYgNTEuMS0xNS4yIDAtMzUuNmMwLTYwLjUtNTEuMS0xMDktMTEyLjEtMTA5LTYwLjggMC0xMTIuMSA0OC4yLTExMi4xIDEwOC4ybDAgMTYyLjRjMCAxNC45LTEyIDI2LjctMjYuNyAyNi43Uzg2IDM0OS41IDg2IDMzNC42bDAtNjguNi04NiAwIDAgNjkuN2MwIDYyIDUwLjMgMTEyLjMgMTEyLjQgMTEyLjMgNjEuNiAwIDExMi40LTQ5LjUgMTEyLjQtMTEwLjhsMC0xNjAuM2MwLTE0LjcgMTItMjYuNyAyNi43LTI2LjdzMjYuNyAxMiAyNi43IDI2LjdsMCAzMC45eiJdCiAgICB9OwogICAgZmFHb29nbGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZ29vZ2xlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxYTAiLCAiTTUwMCAyNjEuOEM1MDAgNDAzLjMgNDAzLjEgNTA0IDI2MCA1MDQgMTIyLjggNTA0IDEyIDM5My4yIDEyIDI1NlMxMjIuOCA4IDI2MCA4YzY2LjggMCAxMjMgMjQuNSAxNjYuMyA2NC45bC02Ny41IDY0LjljLTg4LjMtODUuMi0yNTIuNS0yMS4yLTI1Mi41IDExOC4yIDAgODYuNSA2OS4xIDE1Ni42IDE1My43IDE1Ni42IDk4LjIgMCAxMzUtNzAuNCAxNDAuOC0xMDYuOWwtMTQwLjggMCAwLTg1LjMgMjM2LjEgMGMyLjMgMTIuNyAzLjkgMjQuOSAzLjkgNDEuNHoiXQogICAgfTsKICAgIGZhRGlzY29yZCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJkaXNjb3JkIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYzOTIiLCAiTTQ5Mi41IDY5LjhjLS4yLS4zLS40LS42LS44LS43LTM4LjEtMTcuNS03OC40LTMwLTExOS43LTM3LjEtLjQtLjEtLjggMC0xLjEgLjFzLS42IC40LS44IC44Yy01LjUgOS45LTEwLjUgMjAuMi0xNC45IDMwLjYtNDQuNi02LjgtODkuOS02LjgtMTM0LjQgMC00LjUtMTAuNS05LjUtMjAuNy0xNS4xLTMwLjYtLjItLjMtLjUtLjYtLjgtLjhzLS43LS4yLTEuMS0uMmMtNDEuMyA3LjEtODEuNiAxOS42LTExOS43IDM3LjEtLjMgLjEtLjYgLjQtLjggLjctNzYuMiAxMTMuOC05Ny4xIDIyNC45LTg2LjkgMzM0LjUgMCAuMyAuMSAuNSAuMiAuOHMuMyAuNCAuNSAuNmM0NC40IDMyLjkgOTQgNTggMTQ2LjggNzQuMiAuNCAuMSAuOCAuMSAxLjEgMHMuNy0uNCAuOS0uN2MxMS4zLTE1LjQgMjEuNC0zMS44IDMwLTQ4LjggLjEtLjIgLjItLjUgLjItLjhzMC0uNS0uMS0uOC0uMi0uNS0uNC0uNi0uNC0uMy0uNy0uNGMtMTUuOC02LjEtMzEuMi0xMy40LTQ1LjktMjEuOS0uMy0uMi0uNS0uNC0uNy0uNnMtLjMtLjYtLjMtLjkgMC0uNiAuMi0uOSAuMy0uNSAuNi0uN2MzLjEtMi4zIDYuMi00LjcgOS4xLTcuMSAuMy0uMiAuNi0uNCAuOS0uNHMuNyAwIDEgLjFjOTYuMiA0My45IDIwMC40IDQzLjkgMjk1LjUgMCAuMy0uMSAuNy0uMiAxLS4ycy43IC4yIC45IC40YzIuOSAyLjQgNiA0LjkgOS4xIDcuMiAuMiAuMiAuNCAuNCAuNiAuN3MuMiAuNiAuMiAuOS0uMSAuNi0uMyAuOS0uNCAuNS0uNiAuNmMtMTQuNyA4LjYtMzAgMTUuOS00NS45IDIxLjgtLjIgLjEtLjUgLjItLjcgLjRzLS4zIC40LS40IC43LS4xIC41LS4xIC44IC4xIC41IC4yIC44YzguOCAxNyAxOC44IDMzLjMgMzAgNDguOCAuMiAuMyAuNiAuNiAuOSAuN3MuOCAuMSAxLjEgMGM1Mi45LTE2LjIgMTAyLjYtNDEuMyAxNDcuMS03NC4yIC4yLS4yIC40LS40IC41LS42cy4yLS41IC4yLS44YzEyLjMtMTI2LjgtMjAuNS0yMzYuOS04Ni45LTMzNC41em0tMzAyIDI2Ny43Yy0yOSAwLTUyLjgtMjYuNi01Mi44LTU5LjJzMjMuNC01OS4yIDUyLjgtNTkuMmMyOS43IDAgNTMuMyAyNi44IDUyLjggNTkuMiAwIDMyLjctMjMuNCA1OS4yLTUyLjggNTkuMnptMTk1LjQgMGMtMjkgMC01Mi44LTI2LjYtNTIuOC01OS4yczIzLjQtNTkuMiA1Mi44LTU5LjJjMjkuNyAwIDUzLjMgMjYuOCA1Mi44IDU5LjIgMCAzMi43LTIzLjIgNTkuMi01Mi44IDU5LjJ6Il0KICAgIH07CiAgICBmYUhhY2tlck5ld3MgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaGFja2VyLW5ld3MiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjFkNCIsICJNMCAzMmwwIDQ0OCA0NDggMCAwLTQ0OC00NDggMHpNMjEuMiAyMjkuMmwtLjIgMGMuMS0uMSAuMi0uMyAuMy0uNCAwIC4xIDAgLjMtLjEgLjR6bTIxOCA1My45bDAgMTAwLjktMzEuNCAwIDAtMTAyLjctNzkuOC0xNTMuMyAzNy4zIDBjNTIuNSA5OC4zIDQ5LjIgMTAxLjIgNTkuMyAxMjUuNiAxMi4zLTI3IDUuOC0yNC40IDYwLjYtMTI1LjZsMzQuOCAwLTgwLjggMTU1LjF6Il0KICAgIH07CiAgICBmYUVsZXZlbnR5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImVsZXZlbnR5IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbIjExdHkiXSwgImU3ZDYiLCAiTTYxNS4zIDE2OC41YzIuMyAwIDQuNiAuNyA2LjYgMi4yIDEuOSAxLjQgMy4xIDMuMyAzLjggNSAxLjQgMy4zIDEuOCA3LjMgMS44IDExLjMgMCAyLjItLjMgNC45LS43IDcuNmwwIC40LTUwLjkgMjY0LjkgMCAwYy00IDIyLjEtOC41IDM5LjQtMTMuNiA1MS43LTUgMTIuMS0xMC45IDIxLjYtMTguNiAyN2wwIDBjLTcuNSA1LjMtMTYuOSA3LjctMjcuNiA4bC0zIDBjLTE2IDAtMjkuMy00LjItMzYuOS0xNC44LS4xLS4xLS4xLS4xLS4yLS4yLS4xLS4yLS4zLS40LS41LS42bDAgMGMtMS44LTIuNC0yLjUtNS4yLTIuOS03LjQtLjUtMi44LS43LTYuMS0uNy05LjggMC03LjMgLjYtMTMuNSAyLjEtMTguMiAxLjQtNC40IDQuOC0xMC40IDEyLjItMTAuNGwxLjMgLjFjLjIgMCAuNCAuMSAuNSAuMSAuMyAuMSAuNiAuMSAuOCAuMiAuNiAuMSAxLjMgLjMgMi4yIC42bDcuNiAyLjIgLjEgMCA3LjYgMi4xYy45IC4yIDEuNyAuNCAyLjIgLjUgLjQgLjEgLjYgLjEgLjcgLjEgMCAwIC4xIDAgLjItLjEgLjEtLjEgLjQtLjIgLjgtLjYgLjktLjkgMi4yLTIuNiAzLjYtNS43IDIuNi01LjggNC4yLTE0LjcgNC4yLTI3LjQgMC0uNy0uMy0zLjQtMS4zLTguOS0uOS01LjEtMi4zLTEyLjItNC4yLTIxLjFsLTU2LTIzMi45LS4xLS40IDAtLjNjLS40LTIuNy0uNy01LjMtLjctNy4zIDAtMy43IC40LTcuNSAxLjctMTAuNiAuNy0xLjYgMS44LTMuNCAzLjUtNC45IDEuOS0xLjUgNC4yLTIuMyA2LjUtMi4zbDM0LjYgMGM0LjYgMCA4LjcgMS43IDExLjkgNWwxLjMgMS41YzEuMiAxLjYgMiAzLjQgMi43IDUuMiAuOSAyLjQgMS41IDUuMSAyIDguMWwzMC40IDE2MS4yIDIzLjgtMTYwYy44LTUuOCAyLjItMTEuNCA1LjEtMTUuMSAzLTMuOCA3LjItNS44IDEyLTUuOGwyNCAwek0zNzUuMSAzNC42YzIuNiAwIDUuMSAuNyA3LjQgMi4zIDIuMiAxLjUgMy43IDMuNiA0LjcgNS43IDEuOSA0IDIuNSA5LjEgMi41IDE0LjVsMCAxMTEuMmMwIC4xIDAgLjIgMCAuM2wzMi40IDBjMi41IDAgNSAuNiA3LjIgMi4xIDIuMiAxLjQgMy43IDMuNCA0LjggNS41IDIgMy45IDIuNiA4LjggMi42IDEzLjlsMCAxNS40YzAgNS0uNiA5LjgtMi42IDEzLjctMS4xIDItMi42IDQtNC44IDUuNC0yLjIgMS40LTQuNyAyLTcuMSAybC0zMi41IDAgMCAxNDUuOGMwIDEwLjggLjcgMTkuNSAyIDI2LjIgMS40IDYuOSAzLjEgMTAuOSA0LjcgMTIuOSAxLjIgMS41IDIuMiAyLjUgMy4xIDMuMmwyLjIgMS40IC4xIC4xIDIuOSAuOGMxLjIgLjIgMi42IC4zIDQuMyAuM2wyMC4zIDBjNC41IDAgOC45IDEuNyAxMS44IDUuOCAyLjYgMy42IDMuMyA4LjEgMy4zIDEyLjJsMCAxNy4yYzAgNC41LS44IDkuMy0zLjQgMTMuMS0zIDQuMi03LjUgNi0xMi4zIDZsMCAwLTI5LjEgLjFjLTggMC0xNS0uNi0yMS4yLTEuNy02LjctMS4zLTEzLjQtNC4xLTIwLjEtOC4xLTcuMi00LjQtMTMtMTAuMy0xNy41LTE3LjgtNC41LTcuNS03LjktMTcuNS0xMC41LTI5LjUtMi42LTEyLjItMy45LTI2LjYtMy45LTQzbDAtMTQ0LjktMTMuNCAwYy0yLjQgMC00LjktLjYtNy4xLTItMi4yLTEuNC0zLjctMy40LTQuOC01LjQtMi0zLjktMi42LTguNy0yLjYtMTMuN2wwLTE1LjRjMC01LjEgLjYtMTAgMi42LTEzLjkgMS4xLTIuMSAyLjYtNCA0LjgtNS41IDIuMi0xLjUgNC43LTIuMSA3LjItMi4xbDEzLjQgMCAwLS42IDUuMi0xMTEuMiAwLS4xIC4zLTMuOWMuNS0zLjggMS4zLTcuNCAyLjctMTAuMyAyLjEtNC4yIDYtNy45IDExLjgtNy45bDI4LjYgMHptLTI2OCAxMS43YzEuOCAuMyAzLjYgLjkgNS4zIDIuMSAyLjEgMS41IDMuNSAzLjUgNC40IDUuNCAxLjcgMy43IDIuMyA4LjQgMi4zIDEzLjJsMCAzNzcuOGMwIDYuNy0uNiAxMi42LTIuNCAxNy4xLS45IDIuMy0yLjMgNC43LTQuNCA2LjUtMi4zIDItNS4xIDMtOC4xIDNsLTQzLjcgMGMtMyAwLTUuOC0xLjEtOC4xLTMuMS0yLjEtMS45LTMuNC00LjMtNC4yLTYuNS0xLjctNC41LTIuMy0xMC4zLTIuMy0xN2wwLTMxNS44Yy00LjggMS4yLTguNyAyLjItMTEuNSAyLjktMS45IC41LTMuNCAuOC00LjQgMS4xLS41IC4xLS45IC4yLTEuMiAuMy0uMSAwLS4zIC4xLS41IC4xLS4xIDAtLjIgMC0uMyAuMSAwIDAtLjIgMC0uMyAwIDAgMC0uMiAwLS40IDBsMCAwYy0uMSAwLS4zIDAtLjQgMC0uMSAwLS4yIDAtLjIgMC0yLjIgLjEtNC41LS40LTYuNi0xLjctMi4zLTEuNC0zLjgtMy40LTQuNy01LjMtMS44LTMuNy0yLjMtOC40LTIuMy0xM2wwLTI3LjRjMC00LjQgLjctOC44IDIuNi0xMi40IDIuMS0zLjkgNS41LTYuNiA5LjgtNy42bDc1LjUtMTkuNWMxLjQtLjQgMi45LS41IDQuNC0uNWwxLjggLjF6bTE0My44LS41YzEuOCAuMyAzLjYgLjkgNS4yIDIuMSAyLjEgMS41IDMuNSAzLjUgNC40IDUuNCAxLjcgMy43IDIuMiA4LjQgMi4yIDEzLjJsMCAzNzcuOGMwIDYuNy0uNiAxMi42LTIuNCAxNy4xLS45IDIuMy0yLjMgNC43LTQuNCA2LjUtMi4zIDItNS4xIDMtOC4xIDNsLTQzLjcgMGMtMyAwLTUuOC0xLjEtOC4xLTMuMS0yLjEtMS45LTMuNC00LjMtNC4yLTYuNS0xLjctNC41LTIuMy0xMC4zLTIuMy0xN2wwLTMxNS44Yy00LjggMS4yLTguNyAyLjItMTEuNSAyLjktMS45IC41LTMuNCAuOC00LjQgMS4xLS41IC4xLS45IC4yLTEuMiAuMy0uMSAwLS4zIC4xLS41IC4xLS4xIDAtLjIgMC0uMyAuMS0uMSAwLS4yIDAtLjMgMCAwIDAtLjIgMC0uNCAwbDAgMGMtLjEgMC0uMiAwLS4zIDAtLjEgMC0uMiAwLS4zIDAtMi4yIC4xLTQuNS0uNC02LjYtMS43LTIuMy0xLjQtMy44LTMuNC00LjctNS4zLTEuOC0zLjctMi4zLTguMy0yLjMtMTNsMC0yNy40YzAtNC40IC43LTguNyAyLjYtMTIuNCAyLjEtMy45IDUuNS02LjYgOS44LTcuNmw3NS40LTE5LjRjMS40LS40IDIuOS0uNSA0LjQtLjVsMS44IC4xeiJdCiAgICB9OwogICAgZmExMXR5ID0gZmFFbGV2ZW50eTsKICAgIGZhVGVhbXNwZWFrID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInRlYW1zcGVhayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNGY5IiwgIk0xNTIuOCAzNy4yYy0zMi4yIDM4LjEtNTYuMSA4Mi42LTY5LjkgMTMwLjUgMCAuMi0uMSAuMy0uMSAuNS0zOS4zIDE2LjItNjYuOCA1NC44LTY2LjggOTkuOCAwIDU5LjYgNDguNCAxMDggMTA4IDEwOHMxMDgtNDguNCAxMDgtMTA4YzAtNTMuNS0zOC45LTk3LjktOTAtMTA2LjUgMTUuNy00MS44IDQwLjQtNzkuNiA3Mi4zLTExMC43IDEuOC0xLjYgNC0yLjYgNi4zLTMuMSAzNy4yLTExLjUgNzYuNy0xMy4zIDExNC44LTUuMiAxMTkuMyAyNS4xIDE5OC42IDEzOC4yIDE4MS43IDI1OC44LTguNCA2Mi42LTM4LjYgMTEyLjctODcuNyAxNTEuNC01MC4xIDM5LjctMTA3LjUgNTQuMy0xNzAuMiA1Mi4ybC0yNC0xYzEyLjQgMi44IDI1IDQuOSAzNy42IDYuMyA0MC43IDQuMiA4MS40IDIuMSAxMjAuMS0xMi41IDk0LTM1LjUgMTQ5LjMtMTAyLjMgMTYyLjktMjAyLjUgNC44LTUyLjYtNS44LTEwNS40LTMwLjgtMTUyLTcwLjQtMTMxLjktMjM0LjItMTgxLjYtMzY2LTExMS4yLTIuNCAxLjQtNC41IDMuMS02LjMgNS4ybC4xIDB6TTMwOS40IDQzMy45Yy0yLjEgMTEuNS00LjIgMjEuOS0xNC42IDMxLjMgNTMuMi0xIDEyMy4yLTI5LjIgMTYxLjgtOTcuMSAzOS43LTY5LjkgMzcuNi0xMzkuOS02LjMtMjA3LjgtMzYuNS01NS4zLTg5LjgtODIuNC0xNTYuNi04Ni42IDEuNSAyLjMgMy4yIDQuNCA1LjIgNi4zbDUuMiA2LjNjMjUuMSAzMS4zIDM3LjYgNjcuOSA0Mi44IDEwNy41IDIuMSAxNS43LTEgMzAuMy0xMy42IDQxLjgtNC4yIDMuMS01LjIgNi4zLTQuMiAxMC40bDcuMyAxNy43IDI5LjMgNTQuM2M1LjIgMTEuNSA0LjIgMTkuOC02LjMgMjguMi0zLjIgMi41LTYuNyA0LjYtMTAuNCA2LjNsLTE4LjggOC40IDMuMSAxMy42YzMuMSA2LjMgMSAxMi41LTMuMSAxNy43LTIuNSAyLjQtMy44IDUuOS0zLjEgOS40IDIuMSAxMS41LTIuMSAxOS44LTEyLjUgMjUuMS0yLjEgMS00LjIgNS4yLTUuMiA3LjNsMC0uMXptLTEzMy42LTMuMWMxNi43IDExLjUgMzQuNSAyMC45IDUzLjIgMjYuMSAyNCA1LjIgNDEuOC02LjMgNDQuOS0zMC4zIDEtOC40IDUuMi0xNC42IDEyLjUtMTcuNyA3LjMtNC4yIDguNC03LjMgMi4xLTEzLjZsLTkuNC04LjQgMTMuNi00LjJjNi4zLTIuMSA3LjMtNS4yIDUuMi0xMS41LTEuNC0zLTIuNC02LjItMy4xLTkuNC0zLjEtMTQuNi0yLjEtMTUuNyAxMS41LTE4LjggOC40LTMuMSAxNS43LTYuMyAyMS45LTEyLjUgMy4xLTIuMSAzLjEtNC4yIDEtOC40bC0xNi43LTMwLjNjLTEtMS45LTIuMS0zLjgtMy4xLTUuNy02LjQtMTEuNy0xMy0yMy42LTE1LjctMzcuMS0yLjEtOS40LTEtMTcuNyA4LjQtMjQgNS4yLTQuMiA4LjQtOS40IDguNC0xNi43LS40LTEwLjEtMS41LTIwLjMtMy4xLTMwLjMtNi4zLTM3LjYtMjMtNjguOS01MS4yLTk1LTUuMi00LjItOS40LTYuMy0xNi43LTQuMmwtMzUuNiAxMi43IDYgMy42YzYuMyAzLjcgMTIuMiA3LjMgMTcgMTIuMSAzMC4zIDI2LjEgNDEuOCA2MS42IDQ1LjkgMTAwLjIgMSA4LjQgMCAxNi43LTcuMyAyMS45LTguNCA1LjItMTAuNCAxMi41LTcuMyAyMC45IDQuOSAxMy4yIDEwLjQgMjYgMTYuNyAzOC42TDI5MS42IDMxOGMtNi4zIDguNC0xMy42IDExLjUtMjEuOSAxNC42LTEyLjUgMy4xLTE0LjYgNy4zLTEwLjQgMjAuOSAuNiAxLjUgMS40IDIuOCAyLjEgNC4yIDIuMSA1LjIgMSA4LjQtNC4yIDEwLjRsLTEyLjUgMy4xIDUuMiA0LjIgNC4yIDQuMmM0LjIgNS4yIDQuMiA4LjQtMi4xIDEwLjQtNy4zIDQuMi0xMS41IDkuNC0xMS41IDE3LjcgMCAxMi41LTcuMyAxOS44LTE4LjggMjQtMy44IDEtNy42IDEuNS0xMS41IDFsLTM0LjUtMi4xIC4xIC4yeiJdCiAgICB9OwogICAgZmFTdXBwbGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3VwcGxlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYzZjkiLCAiTTY0MCAyNjIuNWMwIDY0LjEtMTA5IDExNi4xLTI0My41IDExNi4xLTI0LjggMC00OC42LTEuOC03MS4xLTUgNy43IC40IDE1LjUgLjYgMjMuNCAuNiAxMzQuNSAwIDI0My41LTU2LjkgMjQzLjUtMTI3LjEgMC0yOS40LTE5LjEtNTYuNC01MS4yLTc4IDYwIDIxLjEgOTguOSA1NS4xIDk4LjkgOTMuNHpNNDcuNyAyMjcuOWMtLjEtNzAuMiAxMDguOC0xMjcuMyAyNDMuMy0xMjcuNiA3LjkgMCAxNS42IC4yIDIzLjMgLjUtMjIuNS0zLjItNDYuMy00LjktNzEtNC45LTEzNC41IC40LTI0My40IDUyLjYtMjQzLjMgMTE2LjcgLjEgMzguMyAzOS4xIDcyLjMgOTkuMyA5My4zLTMyLjMtMjEuNS01MS41LTQ4LjYtNTEuNi03OHptNjAuMiAzOS45UzExOC40IDI4MSAxMzcuMiAyODFjMTcuOSAwIDI4LjQtMTEuNSAyOC40LTI1LjEgMC0yOC00MC4yLTI1LjEtNDAuMi0zOS43IDAtNS40IDUuMy05LjEgMTIuNS05LjEgNS43IDAgMTEuMyAyLjYgMTEuMyA2LjZsMCAzLjkgMTQuMiAwIDAtNy45YzAtMTIuMS0xNS40LTE2LjgtMjUuNC0xNi44LTE2LjUgMC0yOC41IDEwLjItMjguNSAyNC4xIDAgMjYuNiA0MC4yIDI1LjQgNDAuMiAzOS45IDAgNi42LTUuOCAxMC4xLTEyLjMgMTAuMS0xMS45IDAtMjAuNy0xMC4xLTIwLjctMTAuMWwtOC44IDEwLjl6bTEyMC44LTczLjZsMCA1NC40YzAgMTEuMy03LjEgMTcuOC0xNy44IDE3LjhzLTE3LjgtNi41LTE3LjgtMTcuN2wwLTU0LjUtMTUuOCAwIDAgNTVjMCAxOC45IDEzLjQgMzEuOSAzMy43IDMxLjkgMjAuMSAwIDMzLjQtMTMgMzMuNC0zMS45bDAtNTUtMTUuNyAwem0zNC40IDg1LjRsMTUuOCAwIDAtMjkuNSAxNS41IDBjMTYgMCAyNy4yLTExLjUgMjcuMi0yOC4xcy0xMS4yLTI3LjgtMjcuMi0yNy44bC0zOS4xIDAgMCAxMy40IDcuOCAwIDAgNzJ6bTE1LjgtNDNsMC0yOS4xIDEyLjkgMGM4LjcgMCAxMy43IDUuNyAxMy43IDE0LjQgMCA4LjktNS4xIDE0LjctMTQgMTQuN2wtMTIuNiAwem01NyA0M2wxNS44IDAgMC0yOS41IDE1LjUgMGMxNiAwIDI3LjItMTEuNSAyNy4yLTI4LjFzLTExLjItMjcuOC0yNy4yLTI3LjhsLTM5LjEgMCAwIDEzLjQgNy44IDAgMCA3MnptMTUuNy00M2wwLTI5LjEgMTIuOSAwYzguNyAwIDEzLjcgNS43IDEzLjcgMTQuNCAwIDguOS01IDE0LjctMTQgMTQuN2wtMTIuNiAwem01Ny4xIDM0LjhjMCA1LjggMi40IDguMiA4LjIgOC4ybDM3LjYgMGM1LjggMCA4LjItMi40IDguMi04LjJsMC0xMy0xNC4zIDAgMCA1LjJjMCAxLjctMSAyLjYtMi42IDIuNmwtMTguNiAwYy0xLjcgMC0yLjYtMS0yLjYtMi42bDAtNjEuMmMwLTUuNy0yLjQtOC4yLTguMi04LjJsLTE1LjQgMCAwIDEzLjQgNS4yIDBjMS43IDAgMi42IDEgMi42IDIuNmwwIDYxLjItLjEgMHptNjMuNCAwYzAgNS44IDIuNCA4LjIgOC4yIDguMmwzOC43IDBjNS43IDAgOC4yLTIuNCA4LjItOC4ybDAtMTMtMTQuMyAwIDAgNS4yYzAgMS43LTEgMi42LTIuNiAyLjZsLTE5LjcgMGMtMS43IDAtMi42LTEtMi42LTIuNmwwLTIwLjMgMjcuNyAwIDAtMTMuNC0yNy43IDAgMC0yMi40IDE5LjIgMGMxLjcgMCAyLjYgMSAyLjYgMi42bDAgNS4yIDE0LjIgMCAwLTEzYzAtNS43LTIuNS04LjItOC4yLTguMmwtNTEuNiAwIDAgMTMuNCA3LjggMCAwIDYzLjkgLjEgMHptNTguOS03NmwwIDUuOSAxLjYgMCAwLTUuOSAyLjcgMCAwLTEuMi03IDAgMCAxLjIgMi43IDB6bTUuNy0xLjJsMCA3LjEgMS41IDAgMC01LjcgMi4zIDUuNyAxLjMgMCAyLjMtNS43IDAgNS43IDEuNSAwIDAtNy4xLTIuMyAwLTIuMSA1LjEtMi4xLTUuMS0yLjQgMHoiXQogICAgfTsKICAgIGZhU3F1YXJlVHdpdHRlciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtdHdpdHRlciIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJ0d2l0dGVyLXNxdWFyZSJdLCAiZjA4MSIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnpNMzUxLjMgMTk5LjNjMCA4Ni43LTY2IDE4Ni42LTE4Ni42IDE4Ni42LTM3LjIgMC03MS43LTEwLjgtMTAwLjctMjkuNCA1LjMgLjYgMTAuNCAuOCAxNS44IC44IDMwLjcgMCA1OC45LTEwLjQgODEuNC0yOC0yOC44LS42LTUzLTE5LjUtNjEuMy00NS41IDEwLjEgMS41IDE5LjIgMS41IDI5LjYtMS4yLTMwLTYuMS01Mi41LTMyLjUtNTIuNS02NC40bDAtLjhjOC43IDQuOSAxOC45IDcuOSAyOS42IDguMy05LTYtMTYuNC0xNC4xLTIxLjUtMjMuNnMtNy44LTIwLjItNy43LTMxYzAtMTIuMiAzLjItMjMuNCA4LjktMzMuMSAzMi4zIDM5LjggODAuOCA2NS44IDEzNS4yIDY4LjYtOS4zLTQ0LjUgMjQtODAuNiA2NC04MC42IDE4LjkgMCAzNS45IDcuOSA0Ny45IDIwLjcgMTQuOC0yLjggMjktOC4zIDQxLjYtMTUuOC00LjkgMTUuMi0xNS4yIDI4LTI4LjggMzYuMSAxMy4yLTEuNCAyNi01LjEgMzcuOC0xMC4yLTguOSAxMy4xLTIwLjEgMjQuNy0zMi45IDM0IC4yIDIuOCAuMiA1LjcgLjIgOC41eiJdCiAgICB9OwogICAgZmFUd2l0dGVyU3F1YXJlID0gZmFTcXVhcmVUd2l0dGVyOwogICAgZmFWaW0gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidmltIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU4OGEiLCAiTTMwMy4zIDU0LjVsMC0xMi4zIDQtMy43IDcuOS03LjIgMy41LTMuMiAxNjggMCAxNS4xIDE1LjEgMCAzOC45LTMuNSAzLjYtODAuOSA4Mi45IDg2LjkgODYuOS05MS4yIDkxLjIgOC45IDAgNy42LTguMyAxLS45YzEuMS0uOCAyLjUtMS4yIDMuOS0xLjJsMjguOSAwIDEuNSAuMmMxLjUgLjQgMi44IDEuMiAzLjggMi41bDcuNiAxMC4yYzEuMyAxLjcgMS42IDMuOSAxIDUuOWwtMjIuMyA3Mi41IDEuMiAwYzIuMiAwIDQuMiAxLjEgNS41IDIuOXMxLjUgNC4xIC43IDYuMUw0NTkgNDQ1Yy0xIDIuNi0zLjQgNC4yLTYuMiA0LjJsLTQwLjQgMGMtMi4xIDAtNC4xLTEtNS4zLTIuN3MtMS42LTMuOS0xLTUuOWwyMC02My4yLTIyLjIgMC0xNi4yIDUwLjdjMi4xIC4xIDQuMSAxLjEgNS4zIDIuOSAxLjIgMS44IDEuNCA0LjIgLjYgNi4ybC0zLjMgNy45Yy0xIDIuNS0zLjUgNC4xLTYuMSA0LjFsLTM2LjggMGMtMi4xIDAtNC4xLTEtNS40LTIuN3MtMS42LTMuOS0xLTUuOWwxMC0zMi4xLTIzLjkgMjMuOGMuMyAxLjIgLjMgMi41LS4xIDMuOGwtMi45IDguNmMtLjkgMi43LTMuNCA0LjUtNi4zIDQuNWwtNy40IDAtNTQuNiA1NC42LTgzLjgtODMuOC0zMS42IDMyLjUtMy42IDMuNy00OS4yIDAtMi44LTEuN2MtOC44LTUuMS0xNC44LTguNS0xNy45LTEwLjNsMC0xMjkuMy01OC41LTU4LjUgMi42LTIuNiA1NS45LTU2IDAtOTkuNC0xMi42IDAtMTAuOC0xMC44LTMuNi0zLjYgMC00MC43IDMuMi0zLjUgNy45LTguNSAzLjctMy45IDE2Ni42IDAgOCA4IDI3LjQtMjcuNCA0Ni40IDQ2LjR6bS0yNTEtNS42bDAgMzAuMyA5LjQgNy44IDE4LjkgMCAwIDM0Ny45IDExLjQgMTAuMyAzOC4yIDAgOTEtOTNjMC0uNCAuMS0uOCAuMi0xLjFsMi42LTEwLjVjLjctMi45IDMuNC01IDYuNC01bDcuMSAwIDE1LjUtMTUuOS0yLTJjLTEuOC0xLjgtMi40LTQuNS0xLjUtNi45bDYuOS0xOS4zYy40LTEuMSAxLjEtMiAxLjktMi44bDYuOS01LjljMS4yLTEgMi44LTEuNiA0LjMtMS42bDE5LjcgMCAxLjMgLjJjLjEgMCAuMSAuMSAuMiAuMWwxOTkuMi0yMDMuNSAwLTI4LjctOC4yLTcuNC0xNTYuMiAwLTcuOCA3LjggMCAzMC41IDguMiA3LjQgMjEgMC0xNDcgMTQ2LjQgMC0xNDYuNiAxNi45IDAgOC43LTguNyAwLTI3LjctNy40LTkuOS0xNTcuNiAwLTggOHpNMjI3LjYgMzUyLjdsMTQuOCAwLTMxLjggOTAuOSA0NS4zIDAgMy05LjYtMTIuNSAwIDMxLjUtOTEuOS00Ny42IDAtMi42IDEwLjV6bTEzNi45IDFsLTE2LjQgMC0xMC41LTEwLjgtMzUuOCAwLTMuMyA5LjggMTEuOCAwLTMwLjUgODkuOSAzOC4xIDAgMi45LTguNi04LjggMCAyMC02MyAzNy44IDAtMjIuMyA3MS42IDM2LjggMCAzLjMtNy45LTguOCAwIDIwLjMtNjQgMzYuMSAwLTIyLjcgNzEuOSA0MC40IDAgMy4zLTguNi0xMC4yIDAgMjUtODEuMS03LjUtMTAuMi0yOC45IDAtOS41IDEwLjUtMTcuNCAwLTkuOS0xMC44LTIzLjMgMC05LjggMTEuMnpNMjYyLjUgMjkzLjZsLTYuOSAxOS4zIDUuMyA1LjMgMjEuMyAwIDUuNi01LjYgNS45LTIwLjMtNC42LTQuNi0xOS43IDAtNi45IDUuOXoiXQogICAgfTsKICAgIGZhRm9udEF3ZXNvbWUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZm9udC1hd2Vzb21lIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjI1MDEsIDYyNjk0LCAiZm9udC1hd2Vzb21lLWZsYWciLCAiZm9udC1hd2Vzb21lLWxvZ28tZnVsbCJdLCAiZjJiNCIsICJNOTEuNyA5NkMxMDYuMyA4Ni44IDExNiA3MC41IDExNiA1MiAxMTYgMjMuMyA5Mi43IDAgNjQgMFMxMiAyMy4zIDEyIDUyYzAgMTYuNyA3LjggMzEuNSAyMCA0MWwwIDQxOSA2NCAwIDAtNjQgMzczLjYgMGMxNC42IDAgMjYuNC0xMS44IDI2LjQtMjYuNCAwLTMuNy0uOC03LjMtMi4zLTEwLjdMNDMyIDI3MiA0OTMuNyAxMzMuMWMxLjUtMy40IDIuMy03IDIuMy0xMC43IDAtMTQuNi0xMS44LTI2LjQtMjYuNC0yNi40TDkxLjcgOTZ6Il0KICAgIH07CiAgICBmYUZvbnRBd2Vzb21lRmxhZyA9IGZhRm9udEF3ZXNvbWU7CiAgICBmYUZvbnRBd2Vzb21lTG9nb0Z1bGwgPSBmYUZvbnRBd2Vzb21lOwogICAgZmFXaXJzaW5kaGFuZHdlcmsgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAid2lyc2luZGhhbmR3ZXJrIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbIndzaCJdLCAiZTJkMCIsICJNMTguOSA0NzkuOGw4My40IDAgMC0xMTItODMuNCA0NyAwIDY1em0zMjkgMGw4Mi40IDAgMC02NS04Mi40LTQ3IDAgMTEyem0wLTQ0OGwwIDIxOS44LTEyMy42LTcyLjQtMTIxLjcgNzIuNCAwLTIxOS44LTgzLjcgMCAwIDM2MC44IDIwNS40LTEyMi4zIDIwNiAxMjIuMyAwLTM2MC44LTgyLjMgMHoiXQogICAgfTsKICAgIGZhV3NoID0gZmFXaXJzaW5kaGFuZHdlcms7CiAgICBmYVpvb20gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiem9vbSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlODdiIiwgIk0xMzQuMiAzMjYuNmwtMTE0LjQgMGMtOCAwLTE1LjItNC44LTE4LjMtMTIuMlMuMSAyOTguNiA1LjggMjkyLjlsNzkuMy03OS4zLTU2LjggMEMxMi43IDIxMy42IDAgMjAxIDAgMTg1LjRsMTA1LjUgMGM4IDAgMTUuMiA0LjggMTguMyAxMi4yczEuNCAxNS45LTQuMyAyMS42bC03OS4zIDc5LjMgNjUuNyAwYzE1LjYgMCAyOC4zIDEyLjYgMjguMyAyOC4zek02NDAgMjM4LjNjMC0zMC40LTI0LjctNTUuMS01NS4xLTU1LjEtMTYuMiAwLTMwLjkgNy4xLTQxIDE4LjMtMTAuMS0xMS4yLTI0LjctMTguMy00MS0xOC4zLTMwLjQgMC01NS4xIDI0LjctNTUuMSA1NS4xbDAgODguM2MxNS42IDAgMjguMy0xMi43IDI4LjMtMjguM2wwLTYwYzAtMTQuOCAxMi0yNi44IDI2LjgtMjYuOHMyNi44IDEyIDI2LjggMjYuOGwwIDYwYzAgMTUuNiAxMi42IDI4LjMgMjguMyAyOC4zbDAtODguM2MwLTE0LjggMTItMjYuOCAyNi44LTI2LjhzMjYuOCAxMiAyNi44IDI2LjhsMCA2MGMwIDE1LjYgMTIuNiAyOC4zIDI4LjMgMjguM2wwLTg4LjN6TTI4OC4yIDI1NmE3Mi44IDcyLjggMCAxIDEgMTQ1LjUgMCA3Mi44IDcyLjggMCAxIDEgLTE0NS41IDB6bTExNy4zIDBhNDQuNSA0NC41IDAgMSAwIC04OSAwIDQ0LjUgNDQuNSAwIDEgMCA4OSAwem0tMjc0LjEgMGE3Mi44IDcyLjggMCAxIDEgMTQ1LjUgMCA3Mi44IDcyLjggMCAxIDEgLTE0NS41IDB6bTExNy4zIDBhNDQuNSA0NC41IDAgMSAwIC04OSAwIDQ0LjUgNDQuNSAwIDEgMCA4OSAweiJdCiAgICB9OwogICAgZmFDb25mbHVlbmNlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNvbmZsdWVuY2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjc4ZCIsICJNMi44IDQxMi4yYy00LjUgNy42LTIuMSAxNy41IDUuNSAyMi4ybDEwNS45IDY1LjJjNy43IDQuNyAxNy43IDIuNCAyMi40LTUuMyAwLS4xIC4xLS4yIC4xLS4yIDY3LjEtMTEyLjIgODAuNS05NS45IDI4MC45LS43IDguMSAzLjkgMTcuOCAuNCAyMS43LTcuNyAuMS0uMSAuMS0uMyAuMi0uNGw1MC40LTExNC4xYzMuNi04LjEtLjEtMTcuNi04LjEtMjEuMy0yMi4yLTEwLjQtNjYuMi0zMS4yLTEwNS45LTUwLjMtMjQ3LjktMTIwLjYtMzMwLjggNDUuNy0zNzMuMSAxMTIuNnpNNTEwLjIgMTAwLjFjNC41LTcuNiAyLjEtMTcuNS01LjUtMjIuMkwzOTguOSAxMi44Yy03LjUtNS0xNy42LTMuMS0yMi42IDQuNC0uMiAuMy0uNCAuNi0uNiAxLTY3LjMgMTEyLjYtODEuMSA5NS42LTI4MC42IC45LTguMS0zLjktMTcuOC0uNC0yMS43IDcuNy0uMSAuMS0uMSAuMy0uMiAuNEwyMi43IDE0MS4zYy0zLjYgOC4xIC4xIDE3LjYgOC4xIDIxLjMgMjIuMiAxMC40IDY2LjMgMzEuMiAxMDYgNTAuNCAyNDggMTIwIDMzMC44LTQ1LjQgMzczLjQtMTEyLjl6Il0KICAgIH07CiAgICBmYURpZ2cgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZGlnZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMWE2IiwgIk04MS43IDE3Mi4zbC04MS43IDAgMCAxNzQuNCAxMzIuNyAwIDAtMjUwLjctNTEgMCAwIDc2LjN6bTAgMTMzLjRsLTMwLjggMCAwLTkyLjMgMzAuOCAwIDAgOTIuM3pNMzc4LjkgMTcyLjNsMCAxNzQuNCA4MS44IDAgMCAyOC41LTgxLjggMCAwIDQwLjggMTMzLjEgMCAwLTI0My43LTEzMy4xIDB6bTgxLjggMTMzLjRsLTMwLjggMCAwLTkyLjMgMzAuOCAwIDAgOTIuM3ptLTIzNS42IDQxbDgyLjEgMCAwIDI4LjUtODIuMSAwIDAgNDAuOCAxMzMuMyAwIDAtMjQzLjctMTMzLjMgMCAwIDE3NC40em01MS4yLTEzMy4zbDMwLjggMCAwIDkyLjMtMzAuOCAwIDAtOTIuM3pNMTUzLjMgOTZsNTEuMyAwIDAgNTEtNTEuMyAwIDAtNTF6bTAgNzYuM2w1MS4zIDAgMCAxNzQuNC01MS4zIDAgMC0xNzQuNHoiXQogICAgfTsKICAgIGZhVGhyZWFkcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ0aHJlYWRzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU2MTgiLCAiTTMzMS41IDIzNS43YzIuMiAuOSA0LjIgMS45IDYuMyAyLjggMjkuMiAxNC4xIDUwLjYgMzUuMiA2MS44IDYxLjQgMTUuNyAzNi41IDE3LjIgOTUuOC0zMC4zIDE0My4yLTM2LjIgMzYuMi04MC4zIDUyLjUtMTQyLjYgNTNsLS4zIDBjLTcwLjItLjUtMTI0LjEtMjQuMS0xNjAuNC03MC4yLTMyLjMtNDEtNDguOS05OC4xLTQ5LjUtMTY5LjZsMC0uNUMxNyAxODQuMyAzMy42IDEyNy4yIDY1LjkgODYuMiAxMDIuMiA0MC4xIDE1Ni4yIDE2LjUgMjI2LjQgMTZsLjMgMGM3MC4zIC41IDEyNC45IDI0IDE2Mi4zIDY5LjkgMTguNCAyMi43IDMyIDUwIDQwLjYgODEuN2wtNDAuNCAxMC44Yy03LjEtMjUuOC0xNy44LTQ3LjgtMzIuMi02NS40LTI5LjItMzUuOC03My01NC4yLTEzMC41LTU0LjYtNTcgLjUtMTAwLjEgMTguOC0xMjguMiA1NC40LTI2LjIgMzMuMy0zOS44IDgxLjUtNDAuMyAxNDMuMiAuNSA2MS43IDE0LjEgMTA5LjkgNDAuMyAxNDMuMyAyOCAzNS42IDcxLjIgNTMuOSAxMjguMiA1NC40IDUxLjQtLjQgODUuNC0xMi42IDExMy43LTQwLjkgMzIuMy0zMi4yIDMxLjctNzEuOCAyMS40LTk1LjktNi4xLTE0LjItMTcuMS0yNi0zMS45LTM0LjktMy43IDI2LjktMTEuOCA0OC4zLTI0LjcgNjQuOC0xNy4xIDIxLjgtNDEuNCAzMy42LTcyLjcgMzUuMy0yMy42IDEuMy00Ni4zLTQuNC02My45LTE2LTIwLjgtMTMuOC0zMy0zNC44LTM0LjMtNTkuMy0yLjUtNDguMyAzNS43LTgzIDk1LjItODYuNCAyMS4xLTEuMiA0MC45LS4zIDU5LjIgMi44LTIuNC0xNC44LTcuMy0yNi42LTE0LjYtMzUuMi0xMC0xMS43LTI1LjYtMTcuNy00Ni4yLTE3LjhsLS43IDBjLTE2LjYgMC0zOSA0LjYtNTMuMyAyNi4zbC0zNC40LTIzLjZjMTkuMi0yOS4xIDUwLjMtNDUuMSA4Ny44LTQ1LjFsLjggMGM2Mi42IC40IDk5LjkgMzkuNSAxMDMuNyAxMDcuN2wtLjIgLjIgLjEgMHptLTE1NiA2OC44YzEuMyAyNS4xIDI4LjQgMzYuOCA1NC42IDM1LjMgMjUuNi0xLjQgNTQuNi0xMS40IDU5LjUtNzMuMi0xMy4yLTIuOS0yNy44LTQuNC00My40LTQuNC00LjggMC05LjYgLjEtMTQuNCAuNC00Mi45IDIuNC01Ny4yIDIzLjItNTYuMiA0MS44bC0uMSAuMXoiXQogICAgfTsKICAgIGZhV3ByZXNzciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ3cHJlc3NyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInJlbmRhY3QiXSwgImYzZTQiLCAiTTI1NiA4YTI0OCAyNDggMCAxIDAgMCA0OTYgMjQ4IDI0OCAwIDEgMCAwLTQ5NnpNNDI3LjMgMTY2LjZjLTE1LjIgMzQuNS0zMC40IDY5LTQ1LjYgMTAzLjUtMi40IDUuNS02LjkgOC4yLTEzIDguMi0yMyAwLTQ2IC4xLTY5IDAtNS4xIDAtOC4yIDEuOS0xMC4zIDYuNy0xMC4yIDIzLjYtMjAuNiA0Ny0zMSA3MC41LTEuNSAzLjUtNC4xIDUuMy03LjkgNS4zLTQ1LjkgMC05MS45IDAtMTM3LjggMC0zLjEgMC01LjYtMS4xLTcuNy0zLjQtMTEuMi0xMi4zLTIyLjUtMjQuNi0zMy43LTM2LjktMi43LTMtMi44LTYuMi0xLjItOS43IDguNy0xOS41IDE3LjMtMzkuMSAyNS45LTU4LjcgMTIuOS0yOS40IDI1LjktNTguNyAzOC43LTg4LjEgMS43LTMuOSA0LjMtNS43IDguNS01LjcgMTQuMiAuMSAyOC41IDAgNDIuNyAwIDYuMiAwIDkuMiA0LjggNi43IDEwLjYtMTMuNiAzMC44LTI3LjIgNjEuNi00MC43IDkyLjMtNS43IDEzLTExLjQgMjYtMTcuMSAzOS0zLjkgOSA3LjEgMTIgMTEgNS42IC4yLS40LTEuNCA0LjIgMzAtNjcuNyAxLjQtMy4xIDMuNC00LjQgNi44LTQuNCAxNS4yIC4xIDMwLjQgMCA0NS42IDAgNS42IDAgNy45IDMuNiA1LjcgOC43LTguMyAxOS0xNi43IDM3LjktMjUgNTYuOS01IDExLjQgOC4xIDEyLjUgMTEuMyA1LjMgMC0uMSAyNy45LTYzLjMgMzIuMi03My4yIDItNC42IDUuNC02LjUgMTAuMy02LjUgMjYuNCAuMSA1Mi45IDAgNzkuMyAwIDEyLjQgMCAxMy45LTEzLjYgMy45LTEzLjYtMjUuMyAwLTUwLjUgMC03NS44IDAtNi4zIDAtNy44LTIuNS01LjMtOC4zIDUuOC0xMy4xIDExLjYtMjYuMSAxNy4zLTM5LjIgMS43LTQgNC41LTUuOCA4LjgtNS44IDIzLjEgLjEgMjYgMCAxMzAuOCAwIDYuMSAwIDggMi44IDUuNiA4LjN6Il0KICAgIH07CiAgICBmYVJlbmRhY3QgPSBmYVdwcmVzc3I7CiAgICBmYVlvYXN0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInlvYXN0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyYjEiLCAiTTkxLjMgNzZsMTg2IDAtNyAxOC45LTE3OSAwYy0zOS43IDAtNzEuOSAzMS42LTcxLjkgNzAuM2wwIDIwNS40YzAgMzUuNCAyNC45IDcwLjMgODQgNzAuM2wwIDE5LjEtMTIuMSAwQzQxLjIgNDYwIDAgNDE5LjggMCAzNzAuNUwwIDE2NS4yQzAgMTE1LjkgNDAuNyA3NiA5MS4zIDc2ek0zMjAuNCAyMGw2Ni41IDBjLTE0My44IDM3OC4xLTE0NS43IDM5OC45LTE4NC43IDQzOS4zLTIwLjggMjEuNi00OS4zIDMxLjctNzguMyAzMi43bDAtNTEuMWM0OS4yLTcuNyA2NC42LTQ5LjkgNjQuNi03NS4zIDAtMjAuMSAuNi0xMi42LTgyLjEtMjIzLjJsNjEuNCAwIDUwLjQgMTU2LjYgMTAyLjItMjc5ek00NDggMTYxLjVsMCAyOTguNS0yMTQgMGM2LjYtOS42IDEwLjctMTYuMyAxMi4xLTE5LjRsMTgyLjUgMCAwLTI3OS4xYzAtMzIuNS0xNy4xLTUxLjktNDguMi02Mi45TDM4Ny4xIDgxYzQxLjcgMTMuNiA2MC45IDQzLjEgNjAuOSA4MC41eiJdCiAgICB9OwogICAgZmFOaW1ibHIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibmltYmxyIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY1YTgiLCAiTTI0Ni42IDM1My4zYTI3IDI3IDAgMSAxIDAtNTQgMjcgMjcgMCAxIDEgMCA1NHptLTc5LjQtMjdhMjcuMSAyNy4xIDAgMSAxIC01NC4zIDAgMjcuMSAyNy4xIDAgMSAxIDU0LjMgMHpNMTkxLjggMTU5QzE1NyAxNTkgODkuNCAxNzguOCA1OS4yIDIyN0wxNCAwIDE0IDMzNS41QzE0IDQzMy4xIDkzLjYgNTEyIDE5MS44IDUxMlMzNjkuNSA0MzMgMzY5LjUgMzM1LjUgMjkwLjEgMTU5IDE5MS44IDE1OXptMCAzMDguMWMtNzMuMyAwLTEzMi41LTU4LjktMTMyLjUtMTMxLjZzNTkuMi0xMzEuNiAxMzIuNS0xMzEuNiAxMzIuNSA1OC45IDEzMi41IDEzMS41LTU5LjMgMTMxLjYtMTMyLjUgMTMxLjZsMCAuMXoiXQogICAgfTsKICAgIGZhUGl4ZWxmZWQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicGl4ZWxmZWQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTdkYiIsICJNMjU2IDBhMjU2IDI1NiAwIDEgMSAwIDUxMiAyNTYgMjU2IDAgMSAxIDAtNTEyek0yMzUuNyAzMTEuOWw0NyAwYzQ0LjIgMCA4MC4xLTM0LjkgODAuMS03OHMtMzUuOS03OC04MC4xLTc4bC02Ny44IDBjLTI1LjUgMC00Ni4yIDIwLjEtNDYuMiA0NWwwIDE3NS4xIDY3LTY0LjF6Il0KICAgIH07CiAgICBmYVlhaG9vID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInlhaG9vIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxOWUiLCAiTTIyMy44IDE0MS4xbC01Ni43IDE0My4yLTU2LTE0My4yLTk2LjEgMCAxMDUuOCAyNDkuMS0zOC42IDg5LjggOTQuMiAwIDE0MC45LTMzOC45LTkzLjYgMHpNMzI5LjIgMjc2LjlhNTguMiA1OC4yIDAgMSAwIDAgMTE2LjQgNTguMiA1OC4yIDAgMSAwIDAtMTE2LjR6TTM5NC43IDMybC05MyAyMjMuNSAxMDQuOCAwIDkyLjYtMjIzLjUtMTA0LjQgMHoiXQogICAgfTsKICAgIGZhQmx1ZXNreSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJibHVlc2t5IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU2NzEiLCAiTTQwNy44IDI5NC43Yy0zLjMtLjQtNi43LS44LTEwLTEuMyAzLjQgLjQgNi43IC45IDEwIDEuM3pNMjg4IDIyNy4xQzI2MS45IDE3Ni40IDE5MC45IDgxLjkgMTI0LjkgMzUuMyA2MS42LTkuNCAzNy41LTEuNyAyMS42IDUuNSAzLjMgMTMuOCAwIDQxLjkgMCA1OC40UzkuMSAxOTQgMTUgMjEzLjljMTkuNSA2NS43IDg5LjEgODcuOSAxNTMuMiA4MC43IDMuMy0uNSA2LjYtLjkgMTAtMS40LTMuMyAuNS02LjYgMS0xMCAxLjQtOTMuOSAxNC0xNzcuMyA0OC4yLTY3LjkgMTY5LjkgMTIwLjMgMTI0LjYgMTY0LjgtMjYuNyAxODcuNy0xMDMuNCAyMi45IDc2LjcgNDkuMiAyMjIuNSAxODUuNiAxMDMuNCAxMDIuNC0xMDMuNCAyOC4xLTE1Ni02NS44LTE2OS45LTMuMy0uNC02LjctLjgtMTAtMS4zIDMuNCAuNCA2LjcgLjkgMTAgMS4zIDY0LjEgNy4xIDEzMy42LTE1LjEgMTUzLjItODAuNyA1LjktMTkuOSAxNS0xMzguOSAxNS0xNTUuNXMtMy4zLTQ0LjctMjEuNi01Mi45Yy0xNS44LTcuMS00MC0xNC45LTEwMy4yIDI5LjgtNjYuMSA0Ni42LTEzNy4xIDE0MS4xLTE2My4yIDE5MS44eiJdCiAgICB9OwogICAgZmFTY3JpYmQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2NyaWJkIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYyOGEiLCAiTTQyLjYgMjUyLjdjLTE2LjEtMTktMjQuNy00NS45LTI0LjgtNzkuOSAwLTEwMC40IDc1LjItMTUzLjEgMTY3LjItMTUzLjEgOTguNi0xLjYgMTU2LjggNDkgMTg0LjMgNzAuNmwtNTAuNSA3Mi4xLTM3LjMtMjQuNiAyNi45LTM4LjZjLTM2LjUtMjQtNzkuNC0zNi41LTEyMy0zNS44LTUwLjctLjgtMTExLjcgMjcuMi0xMTEuNyA3Ni4yIDAgMTguNyAxMS4yIDIwLjcgMjguNiAxNS42IDIzLjMtNS4zIDQxLjkgLjYgNTUuOCAxNCAyNi40IDI0LjMgMjMuMiA2Ny42LS43IDkxLjktMjkuMiAyOS41LTg1LjIgMjcuMy0xMTQuOC04LjR6bTMxNy43IDUuOWMtMTUuNS0xOC44LTM4LjktMjkuNC02My4yLTI4LjYtMzguMS0yLTcxLjEgMjgtNzAuNSA2Ny4yLS43IDE2LjggNiAzMyAxOC40IDQ0LjMgMTQuMSAxMy45IDMzIDE5LjcgNTYuMyAxNC40IDE3LjQtNS4xIDI4LjYtMy4xIDI4LjYgMTUuNiAwIDQuMy0uNSA4LjUtMS40IDEyLjctMTYuNyA0MC45LTU5LjUgNjQuNC0xMjEuNCA2NC40LTUxLjkgLjItMTAyLjQtMTYuNC0xNDQuMS00Ny4zbDMzLjctMzkuNC0zNS42LTI3LjQtNjAuOCA3MS44IDE1LjQgMTMuOGM1Mi41IDQ2LjggMTIwLjQgNzIuNSAxOTAuNyA3Mi4yIDUxLjQgMCA5NC40LTEwLjUgMTMzLjYtNDQuMSA1Ny4xLTUxLjQgNTQuMi0xNDkuMiAyMC4zLTE4OS42eiJdCiAgICB9OwogICAgZmFDcmVhdGl2ZUNvbW1vbnNQZCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjcmVhdGl2ZS1jb21tb25zLXBkIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0ZWMiLCAiTTI1NiA4YTI0OCAyNDggMCAxIDAgMCA0OTYgMjQ4IDI0OCAwIDEgMCAwLTQ5NnptMCA0NDkuNWMtMTM5LjIgMC0yMzUuOC0xMzgtMTkwLjItMjY3LjlsNzguOCAzNS4xYy0yLjEgMTAuNS0zLjMgMjEuNS0zLjMgMzIuOSAwIDk5IDczLjkgMTI2LjkgMTIwLjQgMTI2LjkgMjIuOSAwIDUzLjUtNi43IDc5LjQtMjkuNUwzMDUgMzExLjFjLTUuNSA2LjMtMTcuNiAxNi43LTM2LjMgMTYuNy0zNy44IDAtNTMuNy0zOS45LTUzLjktNzEuOSAyMzAuNCAxMDIuNiAyMTYuNSA5Ni41IDIxNy45IDk2LjgtMzQuMyA2Mi40LTEwMC42IDEwNC44LTE3Ni43IDEwNC44em0xOTQuMi0xNTBsLTIyNC0xMDBjMTguOC0zNCA1NC45LTMwLjcgNzQuNy0xMWw0MC40LTQxLjZjLTI3LjEtMjMuMy01OC0yNy41LTc4LjEtMjcuNS00Ny40IDAtODAuOSAyMC41LTEwMC43IDUxLjZMODcuNiAxNDUuNmMzNi4xLTU0LjkgOTguMS05MS4yIDE2OC41LTkxLjIgMTExLjEgMCAyMDEuNSA5MC40IDIwMS41IDIwMS41IDAgMTgtMi40IDM1LjQtNi44IDUyLS4zLS4xLS40LS4yLS42LS40eiJdCiAgICB9OwogICAgZmFFYXJseWJpcmRzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImVhcmx5YmlyZHMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjM5YSIsICJNMzI5LjMgNDcuNWMxLjItMTMgMjEuMy0xNCAzNi42LTguNyAuOSAuMyAyNi4yIDkuNyAxOSAxNS4yLTI3LjktNy40LTU2LjQgMTguMi01NS42LTYuNXptLTIwMSA2LjljMzAuNy04LjEgNjIgMjAgNjEuMS03LjEtMS4zLTE0LjItMjMuNC0xNS4zLTQwLjItOS42LTEgLjMtMjguNyAxMC41LTIwLjkgMTYuN3pNMzM1LjUgMTYwYTE2IDE2IDAgMSAwIDAgMzIgMTYgMTYgMCAxIDAgMC0zMnptLTE1OS43IDBhMTYgMTYgMCAxIDAgMCAzMiAxNiAxNiAwIDEgMCAwLTMyek00OTQuMyAzMjMuMmMtOS45IDI0LTQwLjcgMTEtNjMuOS0xLjItMTMuNSA2OS4xLTU4LjEgMTExLjQtMTI2LjMgMTI0LjIgLjMgLjktMi0uMSAyNCAxIDMzLjYgMS40IDYzLjgtMy4xIDk3LjQtOC0xOS44LTEzLjgtMTEuNC0zNy4xLTkuOC0zOC4xIDEuNC0uOSAxNC43IDEuNyAyMS42IDExLjUgOC42LTEyLjUgMjguNC0xNC44IDMwLjItMTMuNiAxLjYgMS4xIDYuNiAyMC45LTYuOSAzNC42IDQuNy0uOSA4LjItMS42IDkuOC0yLjEgMi42LS44IDE3LjcgMTEuMyAzLjEgMTMuMy0xNC4zIDIuMy0yMi42IDUuMS00Ny4xIDEwLjgtNDUuOSAxMC43LTg1LjkgMTEuOC0xMTcuNyAxMi44bDEgMTEuNmMzLjggMTguMS0yMy40IDI0LjMtMjcuNiA2LjIgLjggMTcuOS0yNy4xIDIxLjgtMjguNC0xbC0uNSA1LjNjLS43IDE4LjQtMjguNCAxNy45LTI4LjMtLjYtNy41IDEzLjUtMjguMSA2LjgtMjYuNC04LjVsMS4yLTEyLjRjLTM2LjcgLjktNTkuNyAzLjEtNjEuOCAzLjEtMjAuOSAwLTIwLjktMzEuNiAwLTMxLjYgMi40IDAgMjcuNyAxLjMgNjMuMiAyLjgtNjEuMS0xNS41LTEwMy43LTU1LTExNC45LTExOC4yLTI1IDEyLjgtNTcuNSAyNi44LTY4LjIgLjgtMTAuNS0yNS40IDIxLjUtNDIuNiA2Ni44LTczLjQgLjctNi42IDEuNi0xMy4zIDIuNy0xOS44LTE0LjQtMTkuNi0xMS42LTM2LjMtMTYuMS02MC40LTE2LjggMi40LTIzLjItOS4xLTIzLjYtMjMuMSAuMy03LjMgMi4xLTE0LjkgMi40LTE1LjQgMS4xLTEuOCAxMC4xLTIgMTIuNy0yLjYgNi0zMS43IDUwLjYtMzMuMiA5MC45LTM0LjUgMTkuNy0yMS44IDQ1LjItNDEuNSA4MC45LTQ4LjMtMTUuMy0xOS40LTMuNC0zOS45LTIuNC00MC40IDEuNy0uOCAyMS4yIDQuMyAyNi4zIDIzLjIgNS4yLTguOCAxOC4zLTExLjQgMTkuNi0xMC43IDEuMSAuNiA2LjQgMTUtNC45IDI1LjkgNDAuMyAzLjUgNzIuMiAyNC43IDk2IDUwLjcgMzYuMSAxLjUgNzEuOCA1LjkgNzcuMSAzNCAyLjcgLjYgMTEuNiAuOCAxMi43IDIuNiAuMyAuNSAyLjEgOC4xIDIuNCAxNS40LS41IDEzLjktNi44IDI1LjQtMjMuNiAyMy4xLTMuMiAxNy4zLTIuNyAzMi45LTguNyA0Ny43IDIuNCAxMS43IDQgMjMuOCA0LjggMzYuNCAzNyAyNS40IDcwLjMgNDIuNSA2MC4zIDY2Ljl6TTIyMy41IDE1OS45Yy45LTQ0LTM3LjktNDIuMi03OC42LTQwLjMtMjEuNyAxLTM4LjkgMS45LTQ1LjUgMTMuOS0xMS40IDIwLjkgNS45IDkyLjkgMjMuMiAxMDEuMiA5LjggNC43IDczLjQgNy45IDg2LjMtNy4xIDguMi05LjQgMTUtNDkuNCAxNC42LTY3Ljd6bTUyIDU4LjNjLTQuMy0xMi40LTYtMzAuMS0xNS4zLTMyLjctMi0uNS05LS41LTExIDAtMTAgMi44LTEwLjggMjIuMS0xNyAzNy4yIDE1LjQgMCAxOS4zIDkuNyAyMy43IDkuNyA0LjMgMCA2LjMtMTEuMyAxOS42LTE0LjJ6bTEzNS43LTg0LjdjLTYuNi0xMi4xLTI0LjgtMTIuOS00Ni41LTEzLjktNDAuMi0xLjktNzguMi0zLjgtNzcuMyA0MC4zLS41IDE4LjMgNSA1OC4zIDEzLjIgNjcuOCAxMyAxNC45IDc2LjYgMTEuOCA4Ni4zIDcuMSAxNS44LTcuNiAzNi41LTc4LjkgMjQuMy0xMDEuM3oiXQogICAgfTsKICAgIGZhU3ltZm9ueWNhc3RzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInN5bWZvbnljYXN0cyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlOGFiIiwgIk0yOTMuOCAzNDIuNWMzLjQtMS41IDYuOC0xLjUgMTAuMiAwbDU0LjIgMjIuNmMyLjYgLjkgNC43IDIuNiA2LjIgNC44czIuMyA0LjggMi4zIDcuNmMwIDE5LjQtMy42IDM3LjItMTAuNyA1My40LTYuMiAxMy42LTE0LjUgMjUuNC0yNC44IDM1LjYtOC43IDguNS0xNy43IDE0LjYtMjcuMSAxOC40LTMuNCAxLjUtNi44IDEuNS0xMC4yIDAtMTAuNy00LjMtMjAuNi0xMS4zLTI5LjctMjAuOS0xMC0xMC40LTE3LjgtMjIuNS0yMy41LTM2LjQtNi40LTE1LjYtOS42LTMyLjMtOS42LTUwIDAtMi44IC43LTUuNCAyLjItNy42IDEuNS0yLjMgMy42LTMuOSA2LjItNC44bDU0LjItMjIuNnpNNDc5LjcgNDgzLjhhNzAuMSA3MC4xIDAgMSAxIDAtMTQwLjIgNzAuMSA3MC4xIDAgMSAxIDAgMTQwLjJ6TTI0NC42IDM3Ny42YzAgMTUuMyAyLjYgMjkuNyA3LjkgNDMuMiA0LjkgMTIuNCAxMS42IDIzLjMgMjAuMSAzMi41IDguMSA4LjkgMTYuOSAxNS4zIDI2LjMgMTkuMiA5LjItMy44IDE3LjgtMTAgMjUuNy0xOC43IDguNy05LjIgMTUuNC0xOS45IDIwLjMtMzIuMiA1LjUtMTMuNyA4LjItMjguNCA4LjItNDQuMWwtNTQuMi0yMi42LTU0LjIgMjIuNnptMjM1LjEtMjAuM2E1Ni41IDU2LjUgMCAxIDAgMCAxMTMgNTYuNSA1Ni41IDAgMSAwIDAtMTEzem0tMzUyLjggMi4zYzQuMSAwIDcuNiAxLjMgMTAuNCAzLjkgMi44IDIuNiA0LjIgNS45IDQuMiA5LjZsMCAxNi40IDMxLjEtMTkuMmMxLjUtMS4xIDMuMi0xLjcgNS4xLTEuNyAyLjQgMCA0LjYgLjggNi4zIDIuNXMyLjcgMy44IDIuNyA2LjJsMCA3Mi42YzAgMi42LS45IDQuOC0yLjcgNi41cy0zLjkgMi41LTYuMyAyLjVjLTEuOSAwLTMuNi0uNi01LjEtMS43bC0zMS4xLTE5LjIgMCAxNi40YzAgMy44LTEuNCA3LTQuMiA5LjZzLTYuMyA0LTEwLjQgNGwtODguMiAwYy00LjEgMC03LjYtMS4zLTEwLjUtNHMtNC4yLTUuOC00LjItOS42bDAtODEuM2MwLTMuOCAxLjQtNyA0LjItOS42czYuMy0zLjkgMTAuNS0zLjlsODguMiAwem0xNzIgOTcuOGMtMTEuMy03LTIwLjQtMTYuNC0yNy40LTI4LjMtNy41LTEyLjQtMTEuOS0yNi42LTEzLTQyLjRsNDAuNC0xNyAwIDg3LjZ6TTM3LjUgMzczLjRsMCA4MC44Yy4yIC4yIC42IC4zIDEuMiAuM2w4OC4yIDBjLjQgMCAuNy0uMSAxLjEtLjNsMC04MC44Yy0uMi0uMi0uNi0uMy0xLjItLjNsLTg4LjEgMGMtLjQgMC0uOCAuMS0xLjIgLjN6bTQxOC40IDUuMWMyLjMtMS4zIDQuNS0xLjMgNi44IDBsNDkuOCAzMC4yYzIuMyAxLjMgMy40IDMuMyAzLjQgNS45cy0xLjEgNC42LTMuNCA1LjlsLTQ5LjggMjguNmMtMi4zIDEuMy00LjUgMS4zLTYuOCAwcy0zLjQtMy4zLTMuNC01LjlsMC01OC44YzAtMi42IDEuMS00LjYgMy40LTUuOXpNMTQxLjUgNDA1LjVsMCAxNi40IDMxLjcgMTkuOCAwLTU2LTMxLjcgMTkuOHpNNDUxLjEgNS4yYzM1LjgtMS4yIDYyLjkgMTUuMSA2My44IDQwLjggLjQgMTAuOS01LjkgMzIuMi0yNy44IDMzLTE2LjMgLjYtMjcuNi05LjItMjguMS0yNC4xLS4yLTUuNCAxLjItMTAuMiA0LjktMTUuOCAzLjYtNy4xIDQuNC03LjkgNC4zLTExLS4zLTkuNC0xNC41LTkuNy0xOC4zLTkuNS01MyAxLjgtNjYuOSA3My4zLTc4LjIgMTMxLjVsLTUuNiAzMC43YzMwLjUgNC41IDUyLjItMSA2NC4yLTguOCAxNy0xMS00LjgtMjIuNC0yLTM1IDIuOC0xMi44IDE0LjQtMTkgMjMuNy0xOS4yIDEyLjktLjMgMjIuMiAxMy4xIDIxLjkgMjYuNy0uNSAyMi42LTMwLjQgNTMuNi05MC4yIDUyLjMtNy4zLS4yLTE0LS43LTIwLjItMS40bC0xMS4zIDYyLjNjLTMgMTQtNi4zIDI5LjUtMTAuNyA0NS44bDIwNCAwIC45IC4xYy4zIC4xIC42IC4xIC44IC4yIDIuMiAuNiA0IDIuNSA0LjUgNC44IC42IDIuOC0xIDYtMy43IDcuMi0uNSAuMi0xLjEgLjQtMS43IC41LS4zIDAtLjYgMC0uOSAuMWwtNTE1LjMgMGMtLjctLjEtLjkgMC0xLjctLjItMi41LS43LTQuNC0zLjEtNC42LTUuNy0uMi0yLjMgMS00LjYgMy01LjggLjctLjUgMS42LS44IDIuNC0uOSAuMyAwIC42IDAgLjgtLjFsNDguNCAwYy0xNy4yLTE2LjgtMjAtMzcuMi0xNi01MC41IDUuNC0xNy42IDE5LjQtMjAuOSAzMy0xNi43IDE0LjYgNC41IDIwLjMgMjIuMyAxNi4yIDM2LS41IDEuNS0xLjIgMy45LTIuOCA3LjItMS43IDMuOC00LjggNy4xLTYuMiAxMS41LTEuNSA0LjkgLjcgOS4xIDQuNSAxMi42bDU4LjkgMGM0LjItNCA3LjQtOSA5LjEtMTQuNiA1LjMtMTctNS41LTI4LjktMTAtMzMuNWwtMjEuNy0yMy4yYy05LjktMTEuMS0zMS43LTQxLjktMjEuMS03Ni41IDQuMS0xMy40IDEyLjgtMjcuNSAyNS4zLTM2LjkgMjYuNS0xOS43IDU1LjMtMjMgODIuNy0xNS4xIDM1LjUgMTAuMiA1Mi41IDMzLjcgNzQuNiA1MS44IDEyLjQtMzYuMyAyOS41LTcxLjkgNTUuMy0xMDEuOSAyMy4zLTI3LjMgNTQuNi00Ny4xIDkwLjQtNDguM3pNMjI5LjYgMTIxLjNjLTIyLjItNi0zNS43LS45LTQ1LjIgMTEuMi0xMS4zIDE0LjMtNy41IDMyLjggMy4zIDQzLjdsMTggMTkuOWMyMiAyNS41IDM0LjEgNDUuMyAyOS42IDcyLTIuMiAxMy4xLTguNSAyNS4yLTE3LjkgMzUuM2w1NC4yIDBjMS01LjEgMi0xMC40IDMuMS0xNS44bDMuNi0yMS45YzUuOS0yOS40IDEyLjQtNjIuMiAyMi4zLTk0LjgtMjQuMS0xOC4xLTM4LjUtNDAuNy03MC45LTQ5LjV6Il0KICAgIH07CiAgICBmYVNxdWFyZU9kbm9rbGFzc25pa2kgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLW9kbm9rbGFzc25pa2kiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsib2Rub2tsYXNzbmlraS1zcXVhcmUiXSwgImYyNjQiLCAiTTIyNCAxMzcuMWMtNS40LS4zLTEwLjggLjYtMTUuOSAyLjRzLTkuNyA0LjgtMTMuNiA4LjUtNyA4LjItOS4yIDEzLjItMy4yIDEwLjMtMy4yIDE1LjcgMS4xIDEwLjggMy4yIDE1LjcgNS4zIDkuNSA5LjIgMTMuMiA4LjYgNi42IDEzLjYgOC41IDEwLjUgMi43IDE1LjkgMi40YzUuNCAuMyAxMC44LS42IDE1LjktMi40czkuNy00LjggMTMuNi04LjUgNy04LjIgOS4yLTEzLjIgMy4yLTEwLjMgMy4yLTE1LjctMS4xLTEwLjgtMy4yLTE1LjctNS4zLTkuNS05LjItMTMuMi04LjYtNi42LTEzLjYtOC41LTEwLjUtMi43LTE1LjktMi40ek0zODQgMzJMNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NHpNMjI0IDI1OGE4MSA4MSAwIDEgMSAwLTE2Mi4xIDgxIDgxIDAgMSAxIDAgMTYyLjF6bTU5LjMgNi4yYzE2LjgtMTMuMiAyOS41LTUuNSAzNC4xIDMuNiA3LjggMTYtMS4xIDIzLjctMjEuNSAzNy0xNy4xIDEwLjktNDAuNyAxNS4yLTU2LjIgMTYuOGwxMyAxMi45IDQ3LjcgNDcuN2MxNy40IDE3LjktMTEgNDUuOC0yOC42IDI4LjYtMTItMTIuMi0yOS41LTI5LjctNDcuNy00Ny45bC00Ny43IDQ3LjljLTE3LjcgMTcuMi00Ni0xMS0yOC40LTI4LjYgMy43LTMuNyA3LjktNy45IDEyLjUtMTIuNSAxMC40LTEwLjQgMjIuNi0yMi43IDM1LjItMzUuMmwxMi45LTEyLjljLTE1LjQtMS42LTM5LjMtNS43LTU2LjYtMTYuOC0yMC4zLTEzLjMtMjkuMy0yMC45LTIxLjQtMzcgNC42LTkuMSAxNy4zLTE2LjggMzQuMS0zLjYgMCAwIDIyLjcgMTggNTkuMyAxOHM1OS4zLTE4IDU5LjMtMTh6Il0KICAgIH07CiAgICBmYU9kbm9rbGFzc25pa2lTcXVhcmUgPSBmYVNxdWFyZU9kbm9rbGFzc25pa2k7CiAgICBmYU1hcmtkb3duID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1hcmtkb3duIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY2MGYiLCAiTTU5My44IDU5LjFsLTU0Ny42IDBDMjAuNyA1OS4xIDAgNzkuOCAwIDEwNS4yTDAgNDA2LjdjMCAyNS41IDIwLjcgNDYuMiA0Ni4yIDQ2LjJsNTQ3LjcgMGMyNS41IDAgNDYuMi0yMC43IDQ2LjEtNDYuMWwwLTMwMS42YzAtMjUuNC0yMC43LTQ2LjEtNDYuMi00Ni4xek0zMzguNSAzNjAuNmwtNjEuNSAwIDAtMTIwLTYxLjUgNzYuOS02MS41LTc2LjkgMCAxMjAtNjEuNyAwIDAtMjA5LjIgNjEuNSAwIDYxLjUgNzYuOSA2MS41LTc2LjkgNjEuNSAwIDAgMjA5LjIgLjIgMHptMTM1LjMgMy4xbC05Mi4zLTEwNy43IDYxLjUgMCAwLTEwNC42IDYxLjUgMCAwIDEwNC42IDYxLjUgMC05Mi4yIDEwNy43eiJdCiAgICB9OwogICAgZmFUeXBvMyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ0eXBvMyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNDJiIiwgIk0xNzguNyA3OC40YzAtMjQuNyA1LjQtMzIuNCAxMy45LTM5LjQtNjkuNSA4LjUtMTQ5LjMgMzQtMTc2LjMgNjYuNC01LjQgNy43LTkuMyAyMC44LTkuMyAzNy4xIDAgMTAzLjUgMTA2LjggMzM3LjUgMTg0LjEgMzM3LjUgMzYuMyAwIDk3LjMtNTkuNSAxNDYuNy0xMzktNyAyLjMtMTEuNiAyLjMtMTguNSAyLjMtNTcuMiAwLTE0MC42LTE5OC41LTE0MC42LTI2NC45ek0zMDEuNSAzMmMtMzAuMSAwLTQxLjcgNS40LTQxLjcgMzYuMyAwIDY2LjQgNTMuOCAxOTguNSAxMDEuNyAxOTguNSAyNi4zIDAgNzguOC05OS43IDc4LjgtMTgyLjMgMC00MC45LTY3LTUyLjUtMTM4LjgtNTIuNXoiXQogICAgfTsKICAgIGZhSm9vbWxhID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImpvb21sYSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMWFhIiwgIk0uNiA5Mi4xYzAtMzMuMyAyNi44LTYwLjEgNTkuOC02MC4xIDMwIDAgNTQuNSAyMS45IDU5LjIgNTAuMiAzMi42LTcuNiA2Ny4xIC42IDk2LjUgMzBsLTQ0LjMgNDQuM2MtMjAuNS0yMC41LTQyLjYtMTYuMy01NS40LTMuNS0xNC4zIDE0LjMtMTQuMyAzNy45IDAgNTIuMmw5OS41IDk5LjUtNDQgNDQuM2MtODcuNy04Ny4yLTQ5LjctNDkuNy05OS44LTk5LjctMjYuOC0yNi41LTM1LTY0LjgtMjQuOC05OC45LTI2LjktNS44LTQ2LjctMjkuNy00Ni43LTU4LjN6TTEzMC4xIDIwOC41bDQ0LjMgNDQuM2MxMC0xMCA4OS43LTg5LjcgOTkuNy05OS44IDE0LjMtMTQuMyAzNy42LTE0LjMgNTEuOSAwIDEyLjggMTIuOCAxNyAzNS0zLjUgNTUuNGw0NCA0NC4zYzMxLjItMzEuMiAzOC41LTY3LjYgMjguOS0xMDEuMiAyOS4yLTQuMSA1MS45LTI5LjIgNTEuOS01OS41IDAtMzMuMi0yNi44LTYwLjEtNTkuOC02MC4xLTMwLjMgMC01NS40IDIyLjUtNTkuNSA1MS42LTMzLjgtOS45LTcxLjctMS41LTk4LjMgMjUuMS0xOC4zIDE5LjEtNzEuMSA3MS41LTk5LjYgOTkuOXpNMzk2LjQgMzYwLjdjOC4yLTMyLjctLjktNjguNS0yNi4zLTkzLjktMTEuOC0xMi4yIDUgNC43LTk5LjUtOTkuN2wtNDQuMyA0NC4zIDk5LjcgOTkuN2MxNC4zIDE0LjMgMTQuMyAzNy42IDAgNTEuOS0xMi44IDEyLjgtMzUgMTctNTUuNC0zLjVsLTQ0IDQ0LjNjMjcuNiAzMC4yIDY4IDM4LjggMTAyLjcgMjggNS41IDI3LjQgMjkuNyA0OC4xIDU4LjkgNDguMSAzMyAwIDU5LjgtMjYuOCA1OS44LTYwLjEgMC0zMC4yLTIyLjUtNTUtNTEuNi01OS4xem0tODQuMy01My4xbC00NC00NC4zYy04NyA4Ni40LTUwLjQgNTAuNC05OS43IDk5LjgtMTQuMyAxNC4zLTM3LjYgMTQuMy01MS45IDAtMTMuMS0xMy40LTE2LjktMzUuMyAzLjItNTUuNGwtNDQtNDQuM2MtMzAuMiAzMC4yLTM4IDY1LjItMjkuNSA5OC4zLTI2LjcgNi00Ni4yIDI5LjktNDYuMiA1OC4yIDAgMzMuMyAyNi44IDYwLjEgNTkuOCA2MC4xIDI4LjYgMCA1Mi41LTE5LjggNTguNi00Ni43IDMyLjcgOC4yIDY4LjUtLjYgOTQuMi0yNiAzMi4xLTMyIDEyLjItMTIuNCA5OS41LTk5Ljd6Il0KICAgIH07CiAgICBmYVdlaXhpbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ3ZWl4aW4iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjFkNyIsICJNMzg1LjIgMTY3LjZjNi40IDAgMTIuNiAuMyAxOC44IDEuMS0xNi42LTc4LjQtMTAwLjctMTM2LjctMTk2LjMtMTM2LjctMTA3LjIgMC0xOTQuNyA3Mi44LTE5NC43IDE2NS40IDAgNTMuNCAyOS4zIDk3LjUgNzcuOSAxMzEuNmwtMTkuMyA1OC42IDY4LTM0LjFjMjQuNCA0LjggNDMuOCA5LjcgNjguMiA5LjcgNi4yIDAgMTIuMS0uMyAxOC4zLS44LTQtMTIuOS02LjItMjYuNi02LjItNDAuOC0uMS04NC45IDcyLjktMTU0IDE2NS4zLTE1NHpNMjgwLjcgMTE0LjdjMTQuNSAwIDI0LjIgOS43IDI0LjIgMjQuNCAwIDE0LjUtOS43IDI0LjItMjQuMiAyNC4yLTE0LjggMC0yOS4zLTkuNy0yOS4zLTI0LjIgLjEtMTQuNyAxNC42LTI0LjQgMjkuMy0yNC40ek0xNDQuMyAxNjMuM2MtMTQuNSAwLTI5LjMtOS43LTI5LjMtMjQuMiAwLTE0LjggMTQuOC0yNC40IDI5LjMtMjQuNCAxNC44IDAgMjQuNCA5LjcgMjQuNCAyNC40IDAgMTQuNi05LjYgMjQuMi0yNC40IDI0LjJ6TTU2MyAzMTkuNGMwLTc3LjktNzcuOS0xNDEuMy0xNjUuNC0xNDEuMy05Mi43IDAtMTY1LjQgNjMuNC0xNjUuNCAxNDEuM1MzMDUgNDYwLjcgMzk3LjYgNDYwLjdjMTkuMyAwIDM4LjktNS4xIDU4LjYtOS45bDUzLjQgMjkuMy0xNC44LTQ4LjZDNTM0IDQwMi4xIDU2MyAzNjMuMiA1NjMgMzE5LjR6TTM0My45IDI5NC45Yy05LjcgMC0xOS4zLTkuNy0xOS4zLTE5LjYgMC05LjcgOS43LTE5LjMgMTkuMy0xOS4zIDE0LjggMCAyNC40IDkuNyAyNC40IDE5LjMgMCAxMC05LjcgMTkuNi0yNC40IDE5LjZ6bTEwNy4xIDBjLTkuNyAwLTE5LjMtOS43LTE5LjMtMTkuNiAwLTkuNyA5LjctMTkuMyAxOS4zLTE5LjMgMTQuNSAwIDI0LjQgOS43IDI0LjQgMTkuMyAuMSAxMC05LjkgMTkuNi0yNC40IDE5LjZ6Il0KICAgIH07CiAgICBmYUdydW50ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdydW50IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYzYWQiLCAiTTYxLjYgMTg5LjNjLTEuMSAxMCA1LjIgMTkuMSA1LjIgMTkuMSAuNy03LjUgMi4yLTEyLjggNC0xNi42IC40IDEwLjMgMy4yIDIzLjUgMTIuOCAzNC4xIDYuOSA3LjYgMzUuNiAyMy4zIDU0LjkgNi4xIDEgMi40IDIuMSA1LjMgMyA4LjUgMi45IDEwLjMtMi43IDI1LjMtMi43IDI1LjNzMTUuMS0xNy4xIDEzLjktMzIuNWMxMC44LS41IDIxLjQtOC40IDIxLjEtMTkuNSAwIDAtMTguOSAxMC40LTM1LjUtOC44LTkuNy0xMS4yLTQwLjktNDItODMuMS0zMS44IDQuMyAxIDguOSAyLjQgMTMuNSA0LjFsLS4xIDBjLTQuMiAyLTYuNSA3LjEtNyAxMnptMjguMy0xLjhjMTkuNSAxMSAzNy40IDI1LjcgNDQuOSAzNy01LjcgMy4zLTIxLjcgMTAuNC0zOC0xLjctMTAuMy03LjYtOS44LTI2LjItNi45LTM1LjN6TTIzMiAyMzMuM2MtMS4yIDE1LjUgMTMuOSAzMi41IDEzLjkgMzIuNXMtNS42LTE1LTIuNy0yNS4zYy45LTMuMiAyLTYgMy04LjUgMTkuMyAxNy4zIDQ4IDEuNSA1NC44LTYuMSA5LjYtMTAuNiAxMi4zLTIzLjggMTIuOC0zNC4xIDEuOCAzLjggMy40IDkuMSA0IDE2LjYgMCAwIDYuNC05LjEgNS4yLTE5LjEtLjYtNS0yLjktMTAtNy0xMS44bC0uMSAwYzQuNi0xLjggOS4yLTMuMiAxMy41LTQuMS00Mi4zLTEwLjItNzMuNCAyMC42LTgzLjEgMzEuOC0xNi43IDE5LjItMzUuNSA4LjgtMzUuNSA4LjgtLjIgMTAuOSAxMC40IDE4LjkgMjEuMiAxOS4zem02Mi43LTQ1LjhjMyA5LjEgMy40IDI3LjctNyAzNS40LTE2LjMgMTIuMS0zMi4yIDUtMzcuOSAxLjYgNy41LTExLjQgMjUuNC0yNiA0NC45LTM3em0tMTM0LjQgMjMxbC0yOS40IDBjLTUuNSAwLTguMiAxLjYtOS41IDIuOS0xLjkgMi0yLjIgNC43LS45IDguMSAzLjUgOS4xIDExLjQgMTYuNSAxMy43IDE4LjYgMy4xIDIuNyA3LjUgNC4zIDExLjggNC4zIDQuNCAwIDguMy0xLjcgMTEtNC42IDcuNS04LjIgMTEuOS0xNy4xIDEzLTE5LjggLjYtMS41IDEuMy00LjUtLjktNi44LTEuOC0xLjgtNC43LTIuNy04LjgtMi43ek0zNDkuNSAzMTcuM2MtMi40IDE3LjktMTMgMzMuOC0yNC42IDQzLjctMy4xLTIyLjctMy43LTU1LjUtMy43LTYyLjQgMC0xNC43IDkuNS0yNC41IDEyLjItMjYuMSAyLjUtMS41IDUuNC0zIDguMy00LjYgMTgtOS42IDQwLjQtMjEuNiA0MC40LTQzLjcgMC0xNi4yLTkuMy0yMy4yLTE1LjQtMjcuOC0uOC0uNi0xLjUtMS4xLTIuMi0xLjctMi4xLTEuNy0zLjctMy00LjMtNC40LTQuNC05LjgtMy42LTM0LjItMS43LTM3LjYgLjYtLjYgMTYuNy0yMC45IDExLjgtMzkuMi0yLTcuNC02LjktMTMuMy0xNC4xLTE3LTUuMy0yLjctMTEuOS00LjItMTkuNS00LjUtLjEtMi0uNS0zLjktLjktNS45LS42LTIuNi0xLjEtNS4zLS45LTguMSAuNC00LjcgLjgtOSAyLjItMTEuMyA4LjQtMTMuMyAyOC44LTE3LjYgMjktMTcuNmwxMi4zLTIuNC04LjEtOS41Yy0uMS0uMi0xNy4zLTE3LjUtNDYuMy0xNy41LTcuOSAwLTE2IDEuMy0yNC4xIDMuOS0yNC4yIDcuOC00Mi45IDMwLjUtNDkuNCAzOS4zLTMuMS0xLTYuMy0xLjktOS42LTIuNy00LjItMTUuOCA5LTM4LjUgOS0zOC41cy0xMy42LTMtMzMuNyAxNS4yYy0yLjYtNi41LTguMS0yMC41LTEuOC0zNy4yLTI5LjUgMTAuNC0zNi45IDI2LjMtMzkuMSA0MC43LTcuNi01LjQtNi43LTIzLjEtNy4yLTI3LjYtNy41IC45LTI5LjIgMjEuOS0yOC4yIDQ4LjMtMiAuNS0zLjkgMS4xLTUuOSAxLjctNi41LTguOC0yNS4xLTMxLjUtNDkuNC0zOS4zLTcuOS0yLjItMTYtMy41LTIzLjktMy41LTI5IDAtNDYuMSAxNy4zLTQ2LjMgMTcuNWwtOC4xIDkuNCAxMi4zIDIuNGMuMiAwIDIwLjYgNC4zIDI5IDE3LjYgMS40IDIuMiAxLjggNi42IDIuMiAxMS4zIC4yIDIuOC0uNCA1LjUtLjkgOC4xLS40IDEuOS0uOCAzLjktLjkgNS45LTcuNyAuMy0xNC4yIDEuOC0xOS41IDQuNS03LjIgMy43LTEyLjEgOS42LTE0LjEgMTctNSAxOC4yIDExLjIgMzguNSAxMS44IDM5LjIgMS45IDMuNCAyLjcgMjcuOC0xLjcgMzcuNi0uNiAxLjQtMi4yIDIuNy00LjMgNC40LS43IC41LTEuNCAxLjEtMi4yIDEuNy02LjEgNC42LTE1LjQgMTEuNy0xNS40IDI3LjggMCAyMi4xIDIyLjQgMzQuMSA0MC40IDQzLjcgMyAxLjYgNS44IDMuMSA4LjMgNC42IDIuNyAxLjYgMTIuMiAxMS40IDEyLjIgMjYuMSAwIDYuOS0uNiAzOS43LTMuNyA2Mi40LTExLjYtOS45LTIyLjItMjUuOS0yNC42LTQzLjggMCAwLTI5LjIgMjIuNi0yMC42IDcwLjggNS4yIDI5LjUgMjMuMiA0Ni4xIDQ3IDU0LjcgOC44IDE5LjEgMjkuNCA0NS43IDY3LjMgNDkuNiAxNC40IDExLjggMzQuNCAxOS41IDYzLjYgMTkuNWwuMiAwYzI5LjEgMCA0OS4xLTcuNyA2My42LTE5LjUgMzcuOS0zLjkgNTguNS0zMC41IDY3LjMtNDkuNiAyMy44LTguNyA0MS43LTI1LjIgNDctNTQuNyA4LjItNDguNC0yMS4xLTcwLjktMjEuMS03MC45ek0zMDYgMzcuN2M1LjYtMS44IDExLjYtMi43IDE3LjctMi43IDExIDAgMTkuOSAzIDI0LjcgNS0zLjEgMS40LTYuNCAzLjItOS43IDUuMy0yLjQtLjQtNS42LS44LTkuMi0uOC0xMC41IDAtMjAuNSAzLjEtMjguNyA4LjktMTIuMyA4LjctMTggMTYuOS0yMC43IDIyLjQtMi4yLTEuMy00LjUtMi41LTcuMS0zLjctMS42LS44LTMuMS0xLjUtNC43LTIuMiA2LjEtOS4xIDE5LjktMjYuNSAzNy43LTMyLjJ6bTIxIDE4LjJjLS44IDEtMS42IDIuMS0yLjMgMy4yLTMuMyA1LjItMy45IDExLjYtNC40IDE3LjgtLjUgNi40LTEuMSAxMi41LTQuNCAxNy00LjIgLjgtOC4xIDEuNy0xMS41IDIuNy0yLjMtMy4xLTUuNi03LTEwLjUtMTEuMiAxLjQtNC44IDUuNS0xNi4xIDEzLjUtMjIuNSA1LjYtNC4zIDEyLjItNi43IDE5LjYtN3pNNDUuOSA0NS4zYy0zLjMtMi4yLTYuNi00LTkuNy01LjMgNC44LTIgMTMuNy01IDI0LjctNSA2LjEgMCAxMiAuOSAxNy43IDIuNyAxNy44IDUuOCAzMS42IDIzLjIgMzcuNyAzMi4xLTEuNiAuNy0zLjIgMS40LTQuOCAyLjItMi41IDEuMi00LjkgMi41LTcuMSAzLjctMi42LTUuNC04LjMtMTMuNy0yMC43LTIyLjQtOC4zLTUuOC0xOC4yLTguOS0yOC44LTguOS0zLjQgLjEtNi42IC41LTkgLjl6TTkwLjYgODUuNGMtNC45IDQuMi04LjMgOC0xMC41IDExLjItMy40LS45LTcuMy0xLjktMTEuNS0yLjctMy4zLTQuNC0zLjgtMTAuNS00LjMtMTYuOS0uNS02LjItMS4xLTEyLjYtNC40LTE3LjgtLjctMS4xLTEuNS0yLjItMi4zLTMuMiA3LjQgLjMgMTQgMi42IDE5LjUgNyA4IDYuMyAxMi4xIDE3LjYgMTMuNSAyMi40ek01OC40IDI1OS45Yy0yLjctMS42LTUuNi0zLjEtOC40LTQuNi0xNC45LTgtMzAuMi0xNi4zLTMwLjItMzAuNSAwLTExLjEgNC4zLTE0LjYgOC45LTE4LjJsLjUtLjRjLjctLjYgMS40LTEuMiAyLjItMS44LS45IDcuMi0xLjkgMTMuMy0yLjcgMTQuOSAwIDAgMTIuMS0xNSAxNS43LTQ0LjMgMS40LTExLjUtMS4xLTM0LjMtNS4xLTQzIC4yIDQuOSAwIDkuOC0uMyAxNC40LS40LS44LS44LTEuNi0xLjMtMi4yLTMuMi00LTExLjgtMTcuNS05LjQtMjYuNiAuOS0zLjUgMy4xLTYgNi43LTcuOCAzLjgtMS45IDguOC0yLjkgMTUuMS0yLjkgMTIuMyAwIDI1LjkgMy43IDMyLjkgNiAyNS4xIDggNTUuNCAzMC45IDY0LjEgMzcuNyAuMiAuMiAuNCAuMyAuNCAuM2w1LjYgMy45LTMuNS01LjhjLS4yLS4zLTE5LjEtMzEuNC01My4yLTQ2LjUgMi0yLjkgNy40LTguMSAyMS42LTE1LjEgMjEuNC0xMC41IDQ2LjUtMTUuOCA3NC4zLTE1LjggMjcuOSAwIDUyLjkgNS4zIDc0LjMgMTUuOCAxNC4yIDYuOSAxOS42IDEyLjIgMjEuNiAxNS4xLTM0IDE1LjEtNTIuOSA0Ni4yLTUzLjEgNDYuNWwtMy41IDUuOCA1LjYtMy45cy4yLS4xIC40LS4zYzguNy02LjggMzktMjkuOCA2NC4xLTM3LjcgNy0yLjIgMjAuNi02IDMyLjktNiA2LjMgMCAxMS4zIDEgMTUuMSAyLjkgMy41IDEuOCA1LjcgNC40IDYuNyA3LjggMi41IDkuMS02LjEgMjIuNi05LjQgMjYuNi0uNSAuNi0uOSAxLjMtMS4zIDIuMi0uMy00LjYtLjUtOS41LS4zLTE0LjQtNCA4LjgtNi41IDMxLjUtNS4xIDQzIDMuNiAyOS4zIDE1LjcgNDQuMyAxNS43IDQ0LjMtLjgtMS42LTEuOC03LjctMi43LTE0LjkgLjcgLjYgMS41IDEuMiAyLjIgMS44bC41IC40YzQuNiAzLjcgOC45IDcuMSA4LjkgMTguMiAwIDE0LjItMTUuNCAyMi41LTMwLjIgMzAuNS0yLjkgMS41LTUuNyAzLjEtOC40IDQuNi04LjcgNS0xOCAxNi43LTE5LjEgMzQuMi0uOSAxNC42IC45IDQ5LjkgMy40IDc1LjktMTIuNCA0LjgtMjYuNyA2LjQtMzkuNyA2LjgtMi00LjEtMy45LTguNS01LjUtMTMuMS0uNy0yLTE5LjYtNTEuMS0yNi40LTYyLjIgNS41IDM5IDE3LjUgNzMuNyAyMy41IDg5LjYtMy41LS41LTcuMy0uNy0xMS43LS43bC0xMTcgMGMtNC40IDAtOC4zIC4zLTExLjcgLjcgNi0xNS45IDE4LjEtNTAuNiAyMy41LTg5LjYtNi44IDExLjItMjUuNyA2MC4zLTI2LjQgNjIuMi0xLjYgNC42LTMuNSA5LTUuNSAxMy4xLTEzLS40LTI3LjItMi0zOS43LTYuOCAyLjUtMjYgNC4zLTYxLjIgMy40LTc1LjktLjktMTcuNC0xMC4zLTI5LjItMTktMzQuMnpNMzUuMSA0MDQuNmMtMTIuMS0yMC04LjctNTQuMS0zLjctNTkuMSAxMC45IDM0LjQgNDcuMiA0NC4zIDc0LjQgNDUuNC0yLjcgNC4yLTUuMiA3LjYtNyAxMGwtMS40IDEuNGMtNy4yIDcuOC04LjYgMTguNS00LjEgMzEuOC0yMi43LS4xLTQ2LjMtOS44LTU4LjItMjkuNXptNDUuNyA0My41YzYgMS4xIDEyLjIgMS45IDE4LjYgMi40IDMuNSA4IDcuNCAxNS45IDEyLjMgMjMuMS0xNC40LTUuOS0yNC40LTE2LTMwLjktMjUuNXptMTExLjUgNTAuMWMtNjAuNi0uMS03OC4zLTQ1LjgtODQuOS02NC43LTMuNy0xMC41LTMuNC0xOC4yIC45LTIzLjEgMi45LTMuMyA5LjUtNy4yIDI0LjYtNy4ybDExOC44IDBjMTUuMSAwIDIxLjggMy45IDI0LjYgNy4yIDQuMiA0LjggNC41IDEyLjYgLjkgMjMuMS02LjYgMTguOC0yNC4zIDY0LjYtODQuOSA2NC43em04MC42LTI0LjZjNC45LTcuMiA4LjgtMTUuMSAxMi4zLTIzLjEgNi40LS41IDEyLjYtMS4zIDE4LjYtMi40LTYuNSA5LjUtMTYuNSAxOS42LTMwLjkgMjUuNXptNzYuNi02OWMtMTIgMTkuNy0zNS42IDI5LjMtNTguMSAyOS43IDQuNS0xMy4zIDMuMS0yNC4xLTQuMS0zMS44LS40LS41LS45LTEtMS40LTEuNS0xLjgtMi40LTQuMy01LjgtNy0xMCAyNy4yLTEuMiA2My41LTExIDc0LjQtNDUuNCA1IDUgOC40IDM5LjEtMy44IDU5ek0xOTIuMiAxODcuN2wuMiAwYzEyLjctLjEgMjcuMi0xNy44IDI3LjItMTcuOC05LjkgNi0xOC44IDguMS0yNy4zIDguMy04LjUtLjItMTcuNC0yLjMtMjcuMy04LjMgMCAwIDE0LjUgMTcuNiAyNy4yIDE3Ljh6bTYxLjcgMjMwLjdsLTI5LjQgMGMtNC4yIDAtNy4yIC45LTguOSAyLjctMi4yIDIuMy0xLjUgNS4yLS45IDYuNyAxIDIuNiA1LjUgMTEuMyAxMyAxOS4zIDIuNyAyLjkgNi42IDQuNSAxMSA0LjVzOC43LTEuNiAxMS44LTQuMmMyLjMtMiAxMC4yLTkuMiAxMy43LTE4LjEgMS4zLTMuMyAxLTYtLjktNy45LTEuMy0xLjMtNC0yLjktOS40LTN6Il0KICAgIH07CiAgICBmYVN1cHBvcnRub3cgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3VwcG9ydG5vdyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlODMzIiwgIk0wIDE5MS45bDIwMy45LS4xYzEuOC0uNiAyLjUtOS41IDMuMi0xMi4yIDMuMy0xMy41IDguNC0yNi40IDE0LjgtMzguN2wtMTYwLjIgMCAwLTQ4LjIgMjM0LjUgMCAwIDM5Yy01MS4yIDM2LjEtNTYuNCA5Mi42LTIzLjYgMTQzLjkgMzMuMSA1MS43IDkzLjQgODguMSAxNDkuNSAxMTAuNSA2Ny44LTI1LjIgMTY0LjktODkuOSAxNjkuNC0xNjkuNiAzLjEtNTUuMy00Mi4yLTEwMS44LTk4LjctOTEuOC00MS41IDcuNC02Mi4xIDQ2LjctNTQuOCA4Ni40bC00OC4yIDBjLTcuMy01Ni42IDIyLjgtMTEyLjYgNzguNC0xMzAuMyA3OC43LTI1LjEgMTU5LjUgMjggMTcwLjQgMTA4LjggMTUuMiAxMTIuMy05NS41IDE5OS45LTE4OC4xIDIzNy44LTQuNCAxLjgtMjQuNCAxMC4xLTI3LjUgMTAuMWwtMjgwLjMgMCAwLTQ4LjIgMTc4LjUgMC0zOC4xLTI4LjktMjMuMi0yMi4xLTE5OC4zIDAgMC00OC4yIDE2My4xIDBjLTcuMS0xMS42LTEyLjMtMjQuMy0xNi4xLTM3LjQtLjctMi41LTIuMS0xMi0zLjgtMTIuNmwtMjA0LjktLjEgMC00OC4yIDAgMHoiXQogICAgfTsKICAgIGZhUm9ja3JtcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJyb2Nrcm1zIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzZTkiLCAiTTI1NiA4YTI0OCAyNDggMCAxIDAgMCA0OTYgMjQ4IDI0OCAwIDEgMCAwLTQ5NnpNNDEzLjQgNDI3LjVsLTkwIDAtMTEyLTEzMS4zYy0xNy45LTIwLjQtMy45LTU2LjEgMjYuNi01Ni4xbDc1LjMgMC04NC42LTk5LjMtODQuMyA5OC45LTkwIDAgMTQ3LjEtMTcyLjVjMTQuNC0xOC40IDQxLjMtMTcuMyA1NC41IDBMNDEzLjcgMjUyLjNjMTkgMjIuOCAyIDU3LjItMjcuNiA1Ni4xLS42IDAtNzQuMiAuMi03NC4yIC4yTDQxMy40IDQyNy41eiJdCiAgICB9OwogICAgZmFVbnNwbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ1bnNwbGFzaCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlMDdjIiwgIk00NDggMjMwLjJsMCAyNDkuOC00NDggMCAwLTI0OS44IDE0MS4xIDAgMCAxMjQuOSAxNjUuNyAwIDAtMTI0LjkgMTQxLjEgMHpNMzA2LjkgMzJsLTE2NS43IDAgMCAxMjQuOSAxNjUuNyAwIDAtMTI0Ljl6Il0KICAgIH07CiAgICBmYVNxdWFyZUluc3RhZ3JhbSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtaW5zdGFncmFtIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImluc3RhZ3JhbS1zcXVhcmUiXSwgImUwNTUiLCAiTTE5NC40IDIxMS43YTUzLjMgNTMuMyAwIDEgMCA1OS4yIDg4LjYgNTMuMyA1My4zIDAgMSAwIC01OS4yLTg4LjZ6bTE0Mi4zLTY4LjRjLTUuMi01LjItMTEuNS05LjMtMTguNC0xMi0xOC4xLTcuMS01Ny42LTYuOC04My4xLTYuNS00LjEgMC03LjkgLjEtMTEuMiAuMXMtNy4yIDAtMTEuNC0uMWMtMjUuNS0uMy02NC44LS43LTgyLjkgNi41LTYuOSAyLjctMTMuMSA2LjgtMTguNCAxMnMtOS4zIDExLjUtMTIgMTguNGMtNy4xIDE4LjEtNi43IDU3LjctNi41IDgzLjIgMCA0LjEgLjEgNy45IC4xIDExLjFzMCA3LS4xIDExLjFjLS4yIDI1LjUtLjYgNjUuMSA2LjUgODMuMiAyLjcgNi45IDYuOCAxMy4xIDEyIDE4LjRzMTEuNSA5LjMgMTguNCAxMmMxOC4xIDcuMSA1Ny42IDYuOCA4My4xIDYuNSA0LjEgMCA3LjktLjEgMTEuMi0uMXM3LjIgMCAxMS40IC4xYzI1LjUgLjMgNjQuOCAuNyA4Mi45LTYuNSA2LjktMi43IDEzLjEtNi44IDE4LjQtMTJzOS4zLTExLjUgMTItMTguNGM3LjItMTggNi44LTU3LjQgNi41LTgzIDAtNC4yLS4xLTguMS0uMS0xMS40czAtNy4xIC4xLTExLjRjLjMtMjUuNSAuNy02NC45LTYuNS04My0yLjctNi45LTYuOC0xMy4xLTEyLTE4LjRsMCAuMnptLTY3LjEgNDQuNWMxOC4xIDEyLjEgMzAuNiAzMC45IDM0LjkgNTIuMnMtLjIgNDMuNS0xMi4zIDYxLjZjLTYgOS0xMy43IDE2LjYtMjIuNiAyMi42cy0xOSAxMC4xLTI5LjYgMTIuMmMtMjEuMyA0LjItNDMuNS0uMi02MS42LTEyLjNzLTMwLjYtMzAuOS0zNC45LTUyLjIgLjItNDMuNSAxMi4yLTYxLjYgMzAuOS0zMC42IDUyLjItMzQuOSA0My41IC4yIDYxLjYgMTIuMmwuMSAwem0yOS4yLTEuM2MtMy4xLTIuMS01LjYtNS4xLTcuMS04LjZzLTEuOC03LjMtMS4xLTExLjEgMi42LTcuMSA1LjItOS44IDYuMS00LjUgOS44LTUuMiA3LjYtLjQgMTEuMSAxLjEgNi41IDMuOSA4LjYgNyAzLjIgNi44IDMuMiAxMC42YzAgMi41LS41IDUtMS40IDcuM3MtMi40IDQuNC00LjEgNi4yLTMuOSAzLjItNi4yIDQuMi00LjggMS41LTcuMyAxLjVjLTMuOCAwLTcuNS0xLjEtMTAuNi0zLjJsLS4xIDB6TTQ0OCA5NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwek0zNTcgMzg5Yy0xOC43IDE4LjctNDEuNCAyNC42LTY3IDI1LjktMjYuNCAxLjUtMTA1LjYgMS41LTEzMiAwLTI1LjYtMS4zLTQ4LjMtNy4yLTY3LTI1LjlzLTI0LjYtNDEuNC0yNS44LTY3Yy0xLjUtMjYuNC0xLjUtMTA1LjYgMC0xMzIgMS4zLTI1LjYgNy4xLTQ4LjMgMjUuOC02N3M0MS41LTI0LjYgNjctMjUuOGMyNi40LTEuNSAxMDUuNi0xLjUgMTMyIDAgMjUuNiAxLjMgNDguMyA3LjEgNjcgMjUuOHMyNC42IDQxLjQgMjUuOCA2N2MxLjUgMjYuMyAxLjUgMTA1LjQgMCAxMzEuOS0xLjMgMjUuNi03LjEgNDguMy0yNS44IDY3bDAgLjF6Il0KICAgIH07CiAgICBmYUluc3RhZ3JhbVNxdWFyZSA9IGZhU3F1YXJlSW5zdGFncmFtOwogICAgZmFGaXJzdE9yZGVyQWx0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImZpcnN0LW9yZGVyLWFsdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNTBhIiwgIk0yNTYgOGEyNDggMjQ4IDAgMSAwIDAgNDk2IDI0OCAyNDggMCAxIDAgMC00OTZ6bTAgNy44YTI0MC4yIDI0MC4yIDAgMSAxIDAgNDgwLjQgMjQwLjIgMjQwLjIgMCAxIDEgMC00ODAuNHptMCAyMC41YTIxOS43IDIxOS43IDAgMSAwIDAgNDM5LjQgMjE5LjcgMjE5LjcgMCAxIDAgMC00MzkuNHptMCA4LjJhMjExLjUgMjExLjUgMCAxIDEgMCA0MjMgMjExLjUgMjExLjUgMCAxIDEgMC00MjN6bTE4Ni4yIDI2MGMtNC40IDE3LjEtMTEuMiAzMy41LTIwLjEgNDguN2wtNzQuMS0zNS45IDYxLjUgNTQuOGMtMTAuNiAxNC4xLTIzLjIgMjYuNi0zNy4yIDM3LjNsLTU0LjgtNjEuNiAzNS45IDc0LjNjLTE1LjIgOS0zMS42IDE1LjgtNDguNiAyMC4ybC0yNy4zLTc4LjUgNC44IDgyLjljLTguNiAxLjItMTcuNCAxLjgtMjYuMyAxLjhzLTE3LjctLjYtMjYuMy0xLjhsNC44LTgyLjUtMjcuMiA3OGMtMTcuMS00LjUtMzMuNC0xMS4zLTQ4LjctMjAuMmwzNS45LTc0LjMtNTQuOSA2MS42Yy0xNC0xMC43LTI2LjYtMjMuMi0zNy4yLTM3LjNsNjEuNi01NC45LTc0LjMgMzUuOUM4MC43IDMzOCA3NCAzMjEuNyA2OS41IDMwNC42bDc3LjgtMjcuMS04Mi4yIDQuOGMtMS4yLTguNi0xLjgtMTcuMy0xLjgtMjYuMiAwLTkgLjYtMTcuOCAxLjgtMjYuNWw4Mi40IDQuOC03Ny45LTI3LjJjNC41LTE3LjEgMTEuMy0zMy41IDIwLjItNDguN2w3NC4yIDM1LjktNjEuNS01NC45YzEwLjctMTQgMjMuMi0yNi42IDM3LjMtMzcuMmw1NC44IDYxLjUtMzUuOC03NC4yYzE1LjItOC45IDMxLjYtMTUuNyA0OC42LTIwLjFsMjYuOSA3Ny4yLTQuNy04MS42YzguNi0xLjIgMTcuNC0xLjggMjYuMy0xLjhzMTcuNyAuNiAyNi4zIDEuOGwtNC43IDgyLjIgMjctNzcuOGMxNy4zIDQuNSAzMy42IDExLjQgNDguNiAyMC4ybC0zNS44IDc0LjEgNTQuNy02MS41YzE0LjEgMTAuNyAyNi42IDIzLjIgMzcuMiAzNy4ybC02MS40IDU0LjggNzQuMS0zNS45YzguOSAxNS4yIDE1LjcgMzEuNiAyMC4yIDQ4LjZsLTc3LjggMjcuMSA4Mi4yLTQuN2MxLjIgOC43IDEuOCAxNy41IDEuOCAyNi41IDAgOC45LS42IDE3LjYtMS44IDI2LjJsLTgyLjEtNC43IDc3LjcgMjcuMXoiXQogICAgfTsKICAgIGZhRnVsY3J1bSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmdWxjcnVtIiwKICAgICAgaWNvbjogWzI1NiwgNTEyLCBbXSwgImY1MGIiLCAiTTYzLjggMTY0LjFMMjguNCAyMDcuNy03IDE2NC4xIDI4LjQgMTIwLjYgNjMuOCAxNjQuMXpNMTEyLjIgMGwtMjAuNSAxOTguMi01MSA1Ny44IDUxIDU3LjggMjAuNSAxOTguMiAwLTIxMS4xLTQxLjEtNDQuOSA0MS4xLTQ0LjkgMC0yMTEuMXptNzkuNyAxNjQuMWwzNS40IDQzLjYgMzUuNC00My42LTM1LjQtNDMuNS0zNS40IDQzLjV6bS00OC41IDQ3bDQxLjEgNDQuOS00MS4xIDQ0LjkgMCAyMTEuMSAyMC42LTE5OC4yIDUxLTU3LjgtNTEtNTcuOC0yMC42LTE5OC4yIDAgMjExLjF6Il0KICAgIH07CiAgICBmYUFyY2hMaW51eCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhcmNoLWxpbnV4IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU4NjciLCAiTTI4OC43LTcuOGMtMjQuMSA1OS0zOC42IDk3LjctNjUuNCAxNTUgMTYuNCAxNy40IDM2LjYgMzcuNiA2OS40IDYwLjUtMzUuMi0xNC41LTU5LjItMjguOS03Ny4yLTQ0LTM0LjMgNzEuNi04OC4xIDE3My41LTE5Ny4yIDM2OS40IDg1LjctNDkuNSAxNTIuMi04MCAyMTQuMS05MS42LTIuNy0xMS40LTQuMS0yMy44LTQtMzYuN2wuMS0yLjdjMS40LTU0LjkgMjkuOS05Ny4yIDYzLjgtOTQuNHM2MC4yIDQ5LjggNTguOCAxMDQuN2MtLjMgMTAuMy0xLjQgMjAuMi0zLjQgMjkuNCA2MS4yIDEyIDEyNyA0Mi40IDIxMS42IDkxLjItMTYuNy0zMC43LTMxLjYtNTguMy00NS44LTg0LjctMjIuNC0xNy40LTQ1LjctMzkuOS05My4zLTY0LjQgMzIuNyA4LjUgNTYuMyAxOC4zIDc0LjUgMjkuMy0xNDQuNS0yNjkuMS0xNTYuMi0zMDQuOC0yMDUuOC00MjEuMXoiXQogICAgfTsKICAgIGZhRmVkaXZlcnNlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImZlZGl2ZXJzZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlODY1IiwgIk0zOTQuOCA1MjYuOWE1NCA1NCAwIDEgMSA1LjgtMTA3LjggNTQgNTQgMCAxIDEgLTUuOCAxMDcuOHptLTUwLjEtODAuNmMtNS41IDEwLjktNy40IDIzLjMtNS42IDM1LjRMMTY4LjcgNDU0LjRjNS41LTEwLjkgNy41LTIzLjMgNS43LTM1LjRsMTcwLjMgMjcuM3pNMTEyLjcgNDgxLjZhNTQgNTQgMCAxIDEgNS45LTEwNy44IDU0IDU0IDAgMSAxIC01LjkgMTA3Ljh6bTI1Ny43LTYxLjRjLTEwLjkgNS42LTE5LjcgMTQuNC0yNS40IDI1LjNsLTcwLjYtNzAuOSAzMy42LTE3IDYyLjQgNjIuN3pNNDg2LjEgMjYxYzguNyA4LjYgMTkuOCAxNC4zIDMxLjkgMTYuNEw0MzkuNCA0MzAuOGMtOC43LTguNi0xOS44LTE0LjMtMzEuOS0xNi40TDQ4Ni4xIDI2MXpNMzc2LjcgMjE5LjNsMzAuNSAxOTUuMWMtMTIuMS0xLjktMjQuNS0uMS0zNS40IDUuM2wtMzIuMi0yMDYuMyAzNy4yIDZ6TTM1MC40IDMyOC45TDE3NC4yIDQxOC4yYy0yLTEyLjEtNy42LTIzLjItMTYuMi0zMmwxODYuNi05NC42IDUuOCAzNy4yem0tMTUyLjctMjJsLTQwLjMgNzguN2MtOC43LTguNi0xOS44LTE0LjMtMzEuOS0xNi4zbDQ1LjYtODkgMjYuNiAyNi43ek0xMjQuNyAzNjljLTEyLjEtMS44LTI0LjQgLjItMzUuNCA1LjZMNjIuNyAyMDQuM2MxMi4xIDEuOCAyNC41LS4xIDM1LjQtNS42TDEyNC43IDM2OXptMTQ3LjEtNDcuOGwtMzMuNiAxNy0xMzkuNC0xMzkuOWMxMC45LTUuNiAxOS43LTE0LjQgMjUuNC0yNS4zTDI3MS44IDMyMS4yem0xOTcuNS05Mi44YzIgMTIuMSA3LjYgMjMuMiAxNi4yIDMxLjlsLTg5LjMgNDUuMi01LjgtMzcuMiA3OC45LTQwem01NS42IDQ0LjNhNTQgNTQgMCAxIDEgNS45LTEwNy44IDU0IDU0IDAgMSAxIC01LjkgMTA3Ljh6TTI4NC42IDU4LjdjOC43IDguNiAxOS44IDE0LjMgMzEuOCAxNi4zbC05NS4zIDE4Ni4xLTI2LjYtMjYuNyA5MC0xNzUuOHpNNDc0LjkgMTkyLjFjLTUuNSAxMC45LTcuNSAyMy4zLTUuNyAzNS4zbC0yMDYuNC0zMy4xIDE3LjItMzMuNSAxOTUgMzEuM3pNNjguNyAxOTkuNkE1NCA1NCAwIDEgMSA3NC42IDkxLjggNTQgNTQgMCAxIDEgNjguNyAxOTkuNnptNDMyLTMzLjRjLTEwLjkgNS42LTE5LjcgMTQuNC0yNS40IDI1LjNMMzUzLjUgNjkuM2MxMC45LTUuNiAxOS43LTE0LjQgMjUuNC0yNS4zTDUwMC42IDE2Ni4yek0yMjkuMyAxNTIuNmwtMTcuMiAzMy41LTg3LjQtMTRjNS40LTEwLjkgNy40LTIzLjMgNS41LTM1LjRsOTkgMTUuOXptMTM5LjUgMTUuOWwtMzcuMi02LTEzLjYtODcuMmMxMi4xIDEuNyAyNC41LS4zIDM1LjMtNS45bDE1LjUgOTkuMXpNMjY3LjggMjYuMmMyIDEyLjEgNy42IDIzLjIgMTYuMiAzMS45bC0xNTMuOSA3OGMtMi0xMi4xLTcuNi0yMy4yLTE2LjItMzEuOWwxNTMuOS03OHptNTUuNiA0NC4zYTU0IDU0IDAgMSAxIDUuOC0xMDcuOCA1NCA1NCAwIDEgMSAtNS44IDEwNy44eiJdCiAgICB9OwogICAgZmFCcmF2ZVJldmVyc2UgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYnJhdmUtcmV2ZXJzZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNjNkIiwgIk0yOTguNSAwYzMgMCA1LjggMS4zIDcuOCAzLjZsMzguMSA0NGMuNS0uMSAxLS4yIDEuNS0uMyA5LjItMS42IDE4LjYtMi4yIDI3LjctMS4yIDExLjYgMS40IDIxLjUgNS40IDI4LjkgMTIuOSA3LjcgNy44IDE1LjQgMTUuOCAyMi42IDIzLjYgMi41IDIuNyA0LjkgNS4yIDYuOSA3LjQgLjcgLjggMS40IDEuNSAxLjkgMiAzLjQgMy43IDQuMiA4LjEgMi43IDExLjlsLTkuOCAyNC42IDEzLjEgMzguMWMuNyAyIC44IDQuMSAuMiA2LjItLjEgLjQtLjEgLjQtLjUgMi4xbC0xLjUgNS44Yy0xLjYgNi4zLTMuNSAxMy4zLTUuNCAyMC45LTUuNiAyMS42LTExLjIgNDMuMi0xNi40IDYzLjQtMTIuOSA0OS45LTIxLjQgODIuNy0yMy40IDkwLjktMTEuMSA0NC41LTE5LjkgNjAtNDguMyA4MC4zLTI0LjkgMTcuOC03Ni44IDUzLjYtODYuOCA2MC0xIC42LTIgMS4zLTMuNCAyLjMtLjUgLjQtMy4yIDIuMi0zLjkgMi43LTQuOSAzLjMtOC4zIDUuNS0xMi4xIDcuMy00LjcgMi4yLTkuMyAzLjUtMTMuOSAzLjVzLTkuMS0xLjItMTMuOS0zLjVjLTMuNy0xLjgtNy4yLTMuOS0xMi4xLTcuMy0uOC0uNS0zLjQtMi40LTMuOS0yLjctMS40LTEtMi41LTEuNy0zLjQtMi4zLTEwLTYuNC02MS45LTQyLjEtODYuOC02MC0yOC40LTIwLjQtMzcuMi0zNS44LTQ4LjMtODAuMy0yLTguMi0xMC41LTQxLTIzLjMtOTAuNS01LjMtMjAuNi0xMC45LTQyLjItMTYuNS02My44LTItNy42LTMuOC0xNC42LTUuNC0yMC45bC0xLjUtNS44LS41LTIuMWMtLjUtMi0uNC00LjIgLjItNi4ybDEzLjEtMzguMS05LjktMjQuNWMtMS41LTMuOC0uNy04LjIgMi0xMS4yIDEuMi0xLjMgMS44LTIgMi42LTIuOCAyLTIuMiA0LjQtNC43IDYuOS03LjQgNy4zLTcuNyAxNS0xNS43IDIyLjctMjMuNSA3LjQtNy41IDE3LjMtMTEuNiAyOC45LTEyLjkgOS4xLTEuMSAxOC41LS41IDI3LjcgMS4yIC41IC4xIDEgLjIgMS41IC4zbDM4LjEtNDRjMi0yLjQgNC44LTMuNyA3LjgtMy43bDE0OCAwem0tNC43IDIxLjFsLTEzOC42IDAtMzkuMSA0NS4xYy0yLjYgMy02LjcgNC4zLTEwLjYgMy4yLS4yLS4xLS43LS4yLTEuNS0uNC0xLjMtLjMtMi45LS42LTQuNS0uOS03LjQtMS4zLTE0LjktMS44LTIxLjctMS03LjMgLjktMTMgMy4yLTE2LjYgNi45LTcuNiA3LjctMTUuMiAxNS42LTIyLjMgMjMuMy0xLjcgMS44LTMuMyAzLjUtNC44IDUuMWw4LjggMjJjMSAyLjQgMSA1IC4yIDcuNUwyOS43IDE3MC42Yy40IDEuNCAuNSAxLjkgMS4yIDQuOCAxLjYgNi4zIDMuNSAxMy4zIDUuNCAyMC45IDUuNiAyMS42IDExLjIgNDMuMiAxNi40IDYzLjQgMTIuOSA1MCAyMS40IDgyLjggMjMuNCA5MSAxMC4xIDQwLjEgMTYuNCA1MS4zIDQwLjIgNjguMyAyNC42IDE3LjYgNzYuMyA1My4yIDg1LjkgNTkuMyAxLjIgLjggMi41IDEuNiA0IDIuNyAuNiAuNCAzLjIgMi4yIDMuOSAyLjcgNCAyLjggNi43IDQuNCA5LjIgNS42IDIuMiAxIDMuOSAxLjUgNS4xIDEuNXMyLjktLjUgNS4xLTEuNWMyLjUtMS4yIDUuMi0yLjggOS4yLTUuNiAuNy0uNSAzLjMtMi4zIDMuOS0yLjcgMS42LTEuMSAyLjgtMS45IDQtMi43IDkuNi02LjEgNjEuMy00MS43IDg1LjktNTkuMyAyMy44LTE3LjEgMzAuMi0yOC4yIDQwLjEtNjguMyAyLjEtOC4zIDEwLjUtNDEuMSAyMy4zLTkwLjcgNS4zLTIwLjYgMTAuOS00Mi4yIDE2LjUtNjMuOCAyLTcuNiAzLjgtMTQuNiA1LjQtMjAuOSAuNy0yLjkgLjktMy40IDEuMi00LjhsLTEzLjMtMzguOGMtLjgtMi40LS44LTUuMSAuMi03LjVsOC44LTIyYy0xLjUtMS42LTMuMS0zLjMtNC44LTUuMS03LjItNy42LTE0LjctMTUuNS0yMi4zLTIzLjMtMy43LTMuNy05LjMtNi0xNi42LTYuOS02LjgtLjgtMTQuNC0uMy0yMS43IDEtMS43IC4zLTMuMiAuNi00LjUgLjktLjggLjItMS4zIC4zLTEuNSAuNC0zLjggMS4xLTcuOS0uMi0xMC42LTMuMkwyOTMuOCAyMS4xek0yMjQuNSAzMTZjMi44IDAgMjAuOSA2LjUgMzUuNCAxNC4xczI1IDEzIDI4LjMgMTUuMiAxLjMgNi4yLTEuNyA4LjQtNDQuMSAzNC42LTQ4LjEgMzguMi05LjggOS41LTEzLjggOS41LTkuOC01LjktMTMuOC05LjUtNDUuMS0zNi00OC4xLTM4LjItNS4xLTYuMi0xLjctOC40IDEzLjktNy41IDI4LjMtMTUuMiAzMi41LTE0LjEgMzUuNC0xNC4xbC0uMiAwem0uMS0yMzAuN2MuNyAwIDguOCAuMiAyMC41IDQuMiAxMi4zIDQuMiAyNS43IDkuNCAzMS45IDkuNHM1MS45LTguOSA1MS45LTguOSA1NC4yIDY2LjcgNTQuMiA4MS02LjggMTgtMTMuNyAyNS40LTM2LjggMzkuOC00MC43IDQzLjktMTEuOSAxMC41LTcuMSAyMS44IDExLjcgMjUuOCAzLjkgNDAuNC0yMSAyNC40LTI5LjQgMjIuOC0yOC40LTEyLjItMzUuNy0xNy4xLTMwLjUtMjQuMy0zMC41LTMxLjggMjQtMjAuOCAyOC40LTIzLjkgMjQuNy0xNC44IDI1LjEtMTkuNCAuMy02LTUuNy0xNy40LTE2LjctMjYuNy0xNC45LTM2LjggMTkuMS0xNS40IDMxLjUtMjAuMiAzNi4yLTEzLjcgMzkuMi0xNS4xIDIuMi0yLjctNi44LTMuNi0zNC42LTQuMy00Ni4xLTEuMS0zMS4yIDguMi0zMi44IDEwLjktMyAyLjctMS40IDExLjggMTAuMSA1Mi44IDEwLjkgNjAuNiAyLjQgMTIuOS01LjggMTQuOC0yMi4xIDUuMi0yNi44IDUuMi0xOC42LTMuMy0yNi44LTUuMi02LjYtNy01LjgtMTQuOCA5LjMtNTEuNSAxMC45LTYwLjYgLjItOS4yLTEuNC0xMS44LTIxLjMtNy42LTMyLjgtMTAuOS0zNy4xIC4yLTQ2LjEgMS4xLTkuOCAyLjItNi44IDMuNiAyNi44IDEwLjQgMzkuMiAxNS4xIDI5LjcgMTAgMzEuNSAyMC4yLTkgMjUuNC0xNC45IDM2LjgtNi4xIDEyLjgtNS43IDE3LjQgMjAuNiAxNi40IDI1LjEgMTkuNCAyOC40IDE2LjQgMjguNCAyMy45LTIzLjIgMjctMzAuNSAzMS44LTI3LjIgMTUuNC0zNS43IDE3LjEtMjEuNy04LjItMjkuNC0yMi44LS44LTI5LjEgMy45LTQwLjQtMy4zLTE3LjctNy4xLTIxLjgtMzMuOC0zNi41LTQwLjctNDMuOS0xMy43LTExLjItMTMuNy0yNS40IDU0LjItODEgNTQuMi04MSA0NS44IDguOSA1MS45IDguOSAxOS41LTUuMiAzMS45LTkuNCAyMC42LTQuMiAyMC42LTQuMmwtLjMgMHoiXQogICAgfTsKICAgIGZhQXZpYW5leCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhdmlhbmV4IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzNzQiLCAiTTQ1My4yIDMybC0zMTIgMEMxMDIuMyAzMiA2NSA2My4yIDU3LjkgMTAxLjdMMS4zIDQxMC4zQy01LjggNDQ4LjggMjAgNDgwIDU5IDQ4MGwzMTIgMGMzOC45IDAgNzYuMi0zMS4yIDgzLjMtNjkuN0w1MTEgMTAxLjhDNTE4IDYzLjIgNDkyLjIgMzIgNDUzLjIgMzJ6TTM5NSAzNzkuM2wtMzIgMTMuNS0xMTUuNC0xMTBjLTE0LjcgMTAtMjkuMiAxOS41LTQxLjcgMjcuMWwyMi4xIDY0LjItMTcuOSAxMi43LTQwLjYtNjEtNTIuNC00OC4xIDE1LjctMTUuNCA1OCAzMS4xYzkuMy0xMC41IDIwLjgtMjIuNiAzMi44LTM0LjlsLTIwLjUtMjkuNi02OC44LTk5LjggMTguOC0yOC45IDguOS00LjggMTAzLjEgMTEyLjQgNC45IDQuNWMxOS40LTE4LjggMzMuOC0zMi40IDMzLjgtMzIuNCA3LjctNi41IDIxLjUtMi45IDMwLjcgNy45IDkgMTAuNSAxMC42IDI0LjcgMi43IDMxLjMtMS44IDEuMy0xNS41IDExLjQtMzUuMyAyNS42bDQuNSA3LjMgOTQuOSAxMTkuNC02LjMgNy45eiJdCiAgICB9OwogICAgZmFOczggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibnM4IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYzZDUiLCAiTTEwNC4zIDI2OS4ybDI2LjEgMCAwLTI2LjItMjYuMSAwIDAgMjYuMnpNMTU2LjggMjQzbC0uMS0yNi4yIDAtLjljLS4yLTEwLjQtNC40LTIwLjMtMTEuOS0yNy42cy0xNy41LTExLjMtMjcuOS0xMS4xLTIwLjMgNC40LTI3LjYgMTEuOC0xMS4zIDE3LjUtMTEuMiAyNy45bDAgLjIgMjYuNCAwIDAtLjJjLjEtMy40IDEuNS02LjYgMy45LTlzNS43LTMuNyA5LjEtMy43IDYuNyAxLjMgOS4xIDMuNyAzLjggNS42IDMuOSA5bDAgMjYuMiAyNi4zIDB6bTUyLjQgMjUuOGMwIDEyLTIuNCAyMy44LTYuOSAzNC45cy0xMS4zIDIxLjEtMTkuNyAyOS42LTE4LjUgMTUuMi0yOS42IDE5LjctMjIuOSA2LjktMzQuOSA2LjlsLS42IDBjLTI0LjIgMC00Ny4zLTkuNi02NC40LTI2LjdTMjYuMyAyOTMgMjYuMyAyNjguOGwtMjYuMyAwIDAgLjJjMCAxNS40IDMuMSAzMC43IDkgNDQuOXMxNC42IDI3LjIgMjUuNSAzOC4xIDIzLjkgMTkuNSAzOC4xIDI1LjQgMjkuNSA4LjkgNDQuOSA4LjlsLjggMGMxNS40IDAgMzAuNy0zIDQ0LjktOXMyNy4yLTE0LjYgMzguMS0yNS41IDE5LjUtMjMuOCAyNS40LTM4LjEgOC45LTI5LjUgOC45LTQ0LjlsMC0yNi0yNi4zIDAgMCAyNnptLTE1Ny4yIDBjLjEgMTcuMyA3IDMzLjkgMTkuMiA0Ni4xczI4LjggMTkuMSA0Ni4xIDE5LjEgMzMuOS02LjkgNDYuMS0xOS4xIDE5LjItMjguOCAxOS4yLTQ2LjFsLTI2LjMgMGMtLjIgMTAuMi00LjQgMjAtMTEuNyAyNy4ycy0xNy4xIDExLjItMjcuNCAxMS4yLTIwLjEtNC0yNy40LTExLjItMTEuNS0xNi45LTExLjctMjcuMmwwLTI2LTI2LjMgMCAwLTI2LjZjLjMtMTcuMyA3LjQtMzMuOCAxOS43LTQ1LjhzMjktMTguOCA0Ni4zLTE4LjYgMzMuOCA3LjIgNDUuOSAxOS41IDE4LjkgMjguOSAxOC45IDQ2LjJsMCAyNS4zIDI2LjMgMCAwLTI1LjNjMC0yNC4zLTkuNy00Ny43LTI2LjktNjQuOXMtNDAuNS0yNi45LTY0LjktMjYuOS00Ny43IDkuNy02NC45IDI2LjktMjYuOSA0MC41LTI2LjkgNjQuOWwwIDI1LjQgMjYuMyAwIDAgMjZ6bTQxOC40LTcxLjJjMTMuNyAwIDI0LjYgNi42IDMwLjEgMTguM2wuNyAxLjUgMjMuMi0xMS41LS42LTEuNGMtOC0xOS4zLTI4LjUtMzEuMy01My40LTMxLjMtMjMuMSAwLTQzLjYgMTEuNC01MSAyOC40LS4xIDI2LjktLjIgMjMuOSAwIDI0LjggNC43IDExIDE0LjYgMTkuNCAyOC43IDI0LjIgNi41IDIgMTMuMSAzLjMgMTkuOCA0IDUuNSAuNyAxMC42IDEuNCAxNS44IDMuMSA2LjQgMi4xIDEwLjUgNS4zIDEyLjggOS44bDAgOS45Yy0zLjcgNy41LTEzLjggMTIuMy0yNS44IDEyLjMtMTQuMyAwLTI2LTYuOS0zMS45LTE5bC0uNy0xLjUtMjMgMTEuNSAuNiAxLjRjNy45IDE5LjQgMjkuNiAzMiA1NS4zIDMyIDIzLjYgMCA0NC42LTExLjQgNTIuMy0yOC40bC4yLTI1LjktLjItLjdjLTQuOS0xMS0xNS4yLTE5LjYtMjguOS0yNC4yLTcuNy0yLjctMTQuMy0zLjYtMjAuNy00LjQtNS0uNS0xMC0xLjUtMTQuOC0yLjktNi4zLTEuOS0xMC40LTUuMS0xMi42LTkuNmwwLTguNGMzLjQtNy40IDEyLjktMTIuMSAyNC4yLTEyLjFsMCAwek0yODcuNiAzMTEuM2wyNi4xIDAgMC02OC40LTI2LjEgMCAwIDY4LjR6TTYzOS44IDI1OGMtMi45LTYuMy04LjMtMTItMTUuNC0xNi43IDUuNi0zLjggMTAuMS05LjEgMTMtMTUuM2wuMi0yNS4zLS4yLS43Yy03LjQtMTYtMjYuNy0yNi43LTQ4LjItMjYuN1M1NDguNSAxODQgNTQxLjEgMjAwbC0uMiAyNS4zIC4yIC43YzIuOSA2LjEgNy40IDExLjQgMTMgMTUuMy03LjIgNC43LTEyLjUgMTAuNS0xNS40IDE2LjdsLS4yIDI4LjkgLjIgLjdjNy42IDE2IDI3LjkgMjYuNyA1MC42IDI2LjdzNDMuMS0xMC43IDUwLjYtMjYuN2wuMi0yOC45LS4yLS43em0tNzMuMi01MC44YzMuNi02LjMgMTIuNi0xMC41IDIyLjYtMTAuNXMxOSA0LjIgMjIuNiAxMC41bDAgMTMuN2MtMy41IDYuMi0xMi42IDEwLjMtMjIuNiAxMC4zcy0xOS4xLTQuMi0yMi42LTEwLjNsMC0xMy43em00Ny4zIDcyLjJjLTMuOCA2LjYtMTMuMyAxMC45LTI0LjcgMTAuOS0xMS4xIDAtMjEtNC40LTI0LjctMTAuOWwwLTE2LjJjMy43LTYuMyAxMy41LTEwLjUgMjQuNy0xMC41IDExLjMgMCAyMC45IDQuMSAyNC43IDEwLjVsMCAxNi4yek0zNzYuNCAyNjZsLTU5LjgtODkuNy0yOSAwIDAgNDAuNiAyNi41IDAgMCAuNCA2Mi41IDk0LjEgMjUuNyAwIDAtMTM1LjEtMjUuOSAwIDAgODkuN3oiXQogICAgfTsKICAgIGZhU3F1YXJlUGludGVyZXN0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1waW50ZXJlc3QiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsicGludGVyZXN0LXNxdWFyZSJdLCAiZjBkMyIsICJNMzg0IDMyTDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsNzIuNiAwLTIuMi0uOGMtNS40LTQ4LjEtMy4xLTU3LjUgMTUuNy0xMzQuNyAzLjktMTYgOC41LTM1IDEzLjktNTcuOSAwIDAtNy4zLTE0LjgtNy4zLTM2LjUgMC03MC43IDc1LjUtNzggNzUuNS0yNSAwIDEzLjUtNS40IDMxLjEtMTEuMiA0OS44LTMuMyAxMC42LTYuNiAyMS41LTkuMSAzMi01LjcgMjQuNSAxMi4zIDQ0LjQgMzYuNCA0NC40IDQzLjcgMCA3Ny4yLTQ2IDc3LjItMTEyLjQgMC01OC44LTQyLjMtOTkuOS0xMDIuNi05OS45LTY5LjkgMC0xMTAuOSA1Mi40LTExMC45IDEwNi42IDAgMjEuMSA4LjIgNDMuNyAxOC4zIDU2IDIgMi40IDIuMyA0LjUgMS43IDctMS4xIDQuNy0zLjEgMTIuOS00LjcgMTkuMi0xIDQtMS44IDcuMy0yLjEgOC42LTEuMSA0LjUtMy41IDUuNS04LjIgMy4zLTMwLjYtMTQuMy00OS44LTU5LjEtNDkuOC05NS4xIDAtNzcuNSA1Ni4yLTE0OC42IDE2Mi4yLTE0OC42IDg1LjIgMCAxNTEuNCA2MC43IDE1MS40IDE0MS44IDAgODQuNi01My4zIDE1Mi43LTEyNy40IDE1Mi43LTI0LjkgMC00OC4zLTEyLjktNTYuMy0yOC4yIDAgMC0xMi4zIDQ2LjktMTUuMyA1OC40LTUgMTkuMy0xNy42IDQyLjktMjcuNCA1OS4zTDM4NCA0ODBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjR6Il0KICAgIH07CiAgICBmYVBpbnRlcmVzdFNxdWFyZSA9IGZhU3F1YXJlUGludGVyZXN0OwogICAgZmFCbHVldG9vdGhCID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImJsdWV0b290aC1iIiwKICAgICAgaWNvbjogWzI1NiwgNTEyLCBbXSwgImYyOTQiLCAiTTE2NC45IDI2MEwyNTcuNSAxNTYuNyAxMTEuNiAwIDExMS42IDIwNi4zIDI1LjQgMTIwLjItNiAxNTEuNiAxMDIuMSAyNjAtNiAzNjguNCAyNS40IDM5OS44IDExMS42IDMxMy43IDExNC4zIDUxMiAyNjIuOCAzNjMuNCAxNjQuOSAyNjB6bTQwLjktMTAzbC01MCA1MC0uMy0xMDAuMyA1MC4zIDUwLjN6bS01MCAxNTZsNTAgNTAtNTAuMyA1MC4zIC4zLTEwMC4zeiJdCiAgICB9OwogICAgZmFHcmlwZmlyZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJncmlwZmlyZSIsCiAgICAgIGljb246IFszMjAsIDUxMiwgW10sICJmM2FjIiwgIk04MC41IDMwMS40YzAtNzMuOCAxMDUuMS0xMjIuNSAxMDUuMS0yMDMgMC00Ny4xLTM0LTg4LTM5LjEtOTAuNCAuNCAzLjMgLjYgNi43IC42IDEwIDAgOTIuMS0xNDcuMSAxNTMuOS0xNDcuMSAyNjguNiAwIDQ5LjggMzIuMiA3OS4yIDY2LjUgMTA4LjMgNjUuMSA0Ni43IDc4LjEgNzEuNCA3OC4xIDg2LjYgMCAxMC4xLTQuOCAxNy00LjggMjIuMyAxMy4xLTE2LjcgMTcuNC0zMS45IDE3LjUtNDYuNCAwLTI5LjYtMjEuNy01Ni4zLTQ0LjItODYuNS0xNi0yMi4zLTMyLjYtNDIuNi0zMi42LTY5LjV6bTIwNS4zLTM5Yy0xMi4xLTY2LjgtNzgtMTI0LjQtOTQuNy0xMzAuOWw0IDcuMmMyLjQgNS4xIDMuNCAxMC45IDMuNCAxNy4xIDAgNDQuNy01NC4yIDExMS4yLTU2LjYgMTE2LjctMi4yIDUuMS0zLjIgMTAuNS0zLjIgMTUuOCAwIDIwLjEgMTUuMiA0Mi4xIDE3LjkgNDIuMSAyLjQgMCA1Ni42LTU1LjQgNTguMS04Ny43IDYuNCAxMS43IDkuMSAyMi42IDkuMSAzMy40IDAgNDEuMi00MS44IDk2LjktNDEuOCA5Ni45IDAgMTEuNiAzMS45IDUzLjIgMzUuNSA1My4yIDEgMCAyLjItMS40IDMuMi0yLjQgMzcuOS0zOS4zIDY3LjMtODUgNjcuMy0xMzYuOCAwLTgtLjctMTYuMi0yLjItMjQuNnoiXQogICAgfTsKICAgIGZhU3F1YXJlR29vZ2xlUGx1cyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtZ29vZ2xlLXBsdXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiZ29vZ2xlLXBsdXMtc3F1YXJlIl0sICJmMGQ0IiwgIk00NDggOTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMHpNNjQgMjU2YzAtNTUuMyA0NC43LTEwMCAxMDAtMTAwIDI3IDAgNDkuNSA5LjggNjcgMjYuMmwtMjcuMSAyNi4xYy03LjQtNy4xLTIwLjMtMTUuNC0zOS44LTE1LjQtMzQuMSAwLTYxLjkgMjguMi02MS45IDYzLjIgMCAzNC45IDI3LjggNjMuMiA2MS45IDYzLjIgMzkuNiAwIDU0LjQtMjguNSA1Ni44LTQzLjFsLTU2LjkgMCAwLTM0LjQgOTQuNCAwYzEgNSAxLjYgMTAuMSAxLjYgMTYuNiAwIDU3LjEtMzguMyA5Ny42LTk2IDk3LjYtNTUuMyAwLTEwMC00NC43LTEwMC0xMDB6bTI5MSAxOC4ybDAgMjktMjkuMiAwIDAtMjktMjkgMCAwLTI5LjIgMjkgMCAwLTI5IDI5LjIgMCAwIDI5IDI5IDAgMCAyOS4yLTI5IDB6Il0KICAgIH07CiAgICBmYUdvb2dsZVBsdXNTcXVhcmUgPSBmYVNxdWFyZUdvb2dsZVBsdXM7CiAgICBmYUdpdGVlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdpdGVlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU4NjMiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMSAwLTUxMiAyNTYgMjU2IDAgMSAxIDAgNTEyek0zODUuNiAxMTMuOGwwIDAtMTc3IDBjLTUyLjQgMC05NC44IDQyLjQtOTQuOCA5NC44bDAgMTc3YzAgNyA1LjcgMTIuNiAxMi42IDEyLjZsMTg2LjUgMGM0Ny4xIDAgODUuMy0zOC4yIDg1LjMtODUuM2wwLTcyLjdjMC03LTUuNy0xMi42LTEyLjYtMTIuNmwtMTQ1LjQgMGMtNyAwLTEyLjYgNS43LTEyLjYgMTIuNmwwIDMxLjZjMCA2LjYgNS4xIDEyLjEgMTEuNiAxMi42bDEgMCA4OC41IDBjNi42IDAgMTIuMSA1LjEgMTIuNiAxMS42bDAgMSAwIDYuM2MwIDIwLjktMTcgMzcuOS0zNy45IDM3LjlsLTEyMC4xIDBjLTcgMC0xMi42LTUuNy0xMi42LTEyLjZsMC0xMjAuMWMwLTIwLjQgMTYuMS0zNy4xIDM2LjQtMzcuOWwxLjYgMCAxNzcgMGM3IDAgMTIuNi01LjcgMTIuNi0xMi42bDAtMzEuNmMwLTctNS42LTEyLjYtMTIuNi0xMi42eiJdCiAgICB9OwogICAgZmFYbXBwID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInhtcHAiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTg2NCIsICJNMCA0Ny4yYzMuNSAxMzcuMSAxMTcuMSAyNzguNiAyNTIuOSAzNTYuNy0zMS41IDI1LTY3LjIgNDQuMS0xMDYuMiA1My45bDAgNS40YzU2LjQtMi4zIDk4LjEtMjAuMSAxNDEuMy00MC43IDY1LjcgMzQuNiAxMjIuMiAzOS45IDE0MS40IDQwLjdsMC01LjRjLTM5LTkuOC03NC43LTI4LjgtMTA2LjItNTMuOCAxMzUuNy03OC4yIDI0OS4zLTIxOS44IDI1Mi44LTM1Ni44LTU4LjQgMjUuNy0xMTkuMSA0NC4yLTE4MC4xIDYyLjNsMCAwYzMuNCA1OS0yMC4yIDE3MC40LTEwNy45IDI2Mi4zLTg4LjQtOTIuMy0xMTEuMi0yMDQuMS0xMDcuOC0yNjIuM2wwIDBDMTE3LjcgOTIuNiA1OS4zIDcwLjIgMCA0Ny4yek05My45IDk3bDczLjYgMjEuOEMxNjUuNCAyMTYgMjI2LjggMzU4IDM0MS4zIDQzMi4yIDE5MC41IDM3Ni45IDg5LjkgMjE1LjcgOTMuOSA5N3ptMzg4LjMgMGMzLjMgOTktNjUuNiAyMjQuNy0xNzEuNyAyOTYuNC00LjctNC4xLTkuMy04LjQtMTMuOC0xMi43IDc3LTgwLjIgMTEzLjItMTg2LjMgMTExLjktMjYxLjlMNDgyLjEgOTd6TTI2NC41IDQxMC41YzMgMS42IDUuOSAzLjIgOC45IDQuNy0xMi41IDYuNC0yNS40IDEyLjEtMzguNiAxNyAxMC4zLTYuNyAyMC4yLTEzLjkgMjkuNy0yMS43eiJdCiAgICB9OwogICAgZmFBcHBTdG9yZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhcHAtc3RvcmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjM2ZiIsICJNMjU1LjkgMTIwLjlsOS4xLTE1LjdjNS42LTkuOCAxOC4xLTEzLjEgMjcuOS03LjVzMTMuMSAxOC4xIDcuNSAyNy45bC04Ny41IDE1MS41IDYzLjMgMGMyMC41IDAgMzIgMjQuMSAyMy4xIDQwLjhsLTE4NS41IDBjLTExLjMgMC0yMC40LTkuMS0yMC40LTIwLjRzOS4xLTIwLjQgMjAuNC0yMC40bDUyIDAgNjYuNi0xMTUuNC0yMC44LTM2LjFjLTUuNi05LjgtMi4zLTIyLjIgNy41LTI3LjkgOS44LTUuNiAyMi4yLTIuMyAyNy45IDcuNWw4LjkgMTUuN3ptLTc4LjcgMjE4bC0xOS42IDM0Yy01LjYgOS44LTE4LjEgMTMuMS0yNy45IDcuNXMtMTMuMS0xOC4xLTcuNS0yNy45bDE0LjYtMjUuMmMxNi40LTUuMSAyOS44LTEuMiA0MC40IDExLjZ6bTE2OC45LTYxLjdsNTMuMSAwYzExLjMgMCAyMC40IDkuMSAyMC40IDIwLjRTNDEwLjUgMzE4IDM5OS4yIDMxOGwtMjkuNSAwIDE5LjkgMzQuNWM1LjYgOS44IDIuMyAyMi4yLTcuNSAyNy45LTkuOCA1LjYtMjIuMiAyLjMtMjcuOS03LjUtMzMuNS01OC4xLTU4LjctMTAxLjYtNzUuNC0xMzAuNi0xNy4xLTI5LjUtNC45LTU5LjEgNy4yLTY5LjEgMTMuNCAyMyAzMy40IDU3LjcgNjAuMSAxMDR6TTI1NiA4YTI0OCAyNDggMCAxIDAgMCA0OTYgMjQ4IDI0OCAwIDEgMCAwLTQ5NnpNNDAgMjU2YTIxNiAyMTYgMCAxIDEgNDMyIDAgMjE2IDIxNiAwIDEgMSAtNDMyIDB6Il0KICAgIH07CiAgICBmYVdpeCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ3aXgiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjVjZiIsICJNMzkzLjQgMTMxLjdjMCAxMyAyLjEgMzIuNy0yOC43IDQzLjgtOS41IDMuNC0xNiA5LjctMTYgOS43IDAtMzEgNC43LTQyLjIgMTcuNC00OC45IDkuOC01LjEgMjcuMi00LjYgMjcuMi00LjZ6TTI3Ny42IDE2Ny4ybC0zNC4yIDEzMi43LTI4LjUtMTA4LjZjLTcuNy0zMi0yMC44LTQ4LjUtNDguNC00OC41LTI3LjQgMC00MC43IDE2LjItNDguNCA0OC41TDg5LjUgMjk5LjkgNTUuMyAxNjcuMkM0OS43IDE0MC41IDIzLjkgMTI5IDAgMTMyTDY1LjYgMzc5LjlzMjEuNiAxLjYgMzIuNS00YzE0LjItNy4yIDIxLTEyLjggMjkuNi00Ni42IDcuNy0zMC4xIDI5LjEtMTE4LjQgMzEuMS0xMjQuNyA0LjgtMTQuOSAxMS4xLTEzLjggMTUuNCAwIDIgNi4zIDIzLjUgOTQuNiAzMS4xIDEyNC43IDguNiAzMy43IDE1LjQgMzkuMyAyOS42IDQ2LjYgMTAuOCA1LjUgMzIuNSA0IDMyLjUgNEwzMzIuOSAxMzJjLTI0LjQtMy4xLTQ5LjggOC45LTU1LjMgMzUuM3ptMTE1LjggNS4ycy00LjEgNi4zLTEzLjUgMTEuNmMtNiAzLjQtMTEuOCA1LjYtMTggOC42LTE1LjEgNy4zLTEzLjIgMTMuOS0xMy4yIDM1LjJsMCAxNTIuMXMxNi42IDIuMSAyNy40LTMuNGMxMy45LTcuMSAxNy4xLTE0IDE3LjMtNDQuOGwwLTE1MC4zIDAgMCAwLTl6bTE2My40IDg0LjFMNjQwIDEzMi44cy0zNS4xLTYtNTIuNSA5LjhjLTEzLjMgMTIuMS0yNC40IDI5LjYtNTQuMiA3Mi41LS41IC43LTYuMyAxMC41LTEzLjEgMC0yOS4zLTQyLjItNDAuOC02MC4zLTU0LjItNzIuNS0xNy40LTE1LjgtNTIuNS05LjgtNTIuNS05LjhsODMuMiAxMjMuNy04MyAxMjMuNHMzNi42IDQuNiA1NC0xMS4yYzExLjUtMTAuNSAxNy42LTIwLjQgNTIuNS03MC43IDYuOC0xMC41IDEyLjYtLjggMTMuMSAwIDI5LjQgNDIuNCAzOS4yIDU4LjEgNTMuMSA3MC43IDE3LjQgMTUuOCA1My4zIDExLjIgNTMuMyAxMS4ybC04My0xMjMuNHoiXQogICAgfTsKICAgIGZhSW50ZXJjb20gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaW50ZXJjb20iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjdhZiIsICJNMzkyIDMyTDU2IDMyQzI1LjEgMzIgMCA1Ny4xIDAgODhMMCA0MjRjMCAzMC45IDI1LjEgNTYgNTYgNTZsMzM2IDBjMzAuOSAwIDU2LTI1LjEgNTYtNTZsMC0zMzZjMC0zMC45LTI1LjEtNTYtNTYtNTZ6TTI4My43IDExNC4xYzAtMTkuOCAyOS45LTE5LjggMjkuOSAwbDAgMTk5LjVjMCAxOS44LTI5LjkgMTkuOC0yOS45IDBsMC0xOTkuNXptLTc0LjYtNy41YzAtMTkuOCAyOS45LTE5LjggMjkuOSAwbDAgMjE2LjVjMCAxOS44LTI5LjkgMTkuOC0yOS45IDBsMC0yMTYuNXptLTc0LjcgNy41YzAtMTkuOCAyOS45LTE5LjggMjkuOSAwbDAgMTk5LjVjMCAxOS44LTI5LjkgMTkuOC0yOS45IDBsMC0xOTkuNXpNNTkuNyAxNDRjMC0xOS44IDI5LjktMTkuOCAyOS45IDBsMCAxMzQuM2MwIDE5LjgtMjkuOSAxOS44LTI5LjkgMGwwLTEzNC4zek0zODMuMSAzNzEuOGMtNzIuOCA2My0yNDEuNyA2NS40LTMxOC4xIDAtMTUtMTIuOCA0LjQtMzUuNSAxOS40LTIyLjcgNjUuOSA1NS4zIDIxNi4xIDUzLjkgMjc5LjMgMCAxNC45LTEyLjkgMzQuMyA5LjggMTkuNCAyMi43em01LjItOTMuNWMwIDE5LjgtMjkuOSAxOS44LTI5LjkgMGwwLTEzNC4zYzAtMTkuOCAyOS45LTE5LjggMjkuOSAwbDAgMTM0LjN6Il0KICAgIH07CiAgICBmYVJlYWN0ZXVyb3BlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInJlYWN0ZXVyb3BlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY3NWQiLCAiTTI1MC43IDIxMS43bDUuOC00LjEgNS44IDQuMS0yLjEtNi44IDUuNy00LjMtNy4xLS4xLTIuMy02LjgtMi4zIDYuOC03LjIgLjEgNS43IDQuMy0yIDYuOHptNjMuNyAwbDUuOC00LjEgNS44IDQuMS0yLjEtNi44IDUuNy00LjMtNy4yLS4xLTIuMy02LjgtMi4zIDYuOC03LjIgLjEgNS43IDQuMy0xLjkgNi44em0tOTEuMyA1MC41bC0zLjQgMGMtNC44IDAtMy44IDQtMy44IDEyLjEgMCA0LjctMi4zIDYuMS01LjggNi4xcy01LjgtMS40LTUuOC02LjFsMC0zNi42YzAtNC43IDIuMy02LjEgNS44LTYuMXM1LjggMS40IDUuOCA2LjFjMCA3LjItLjcgMTAuNSAzLjggMTAuNWwzLjQgMGM0LjctLjEgMy44LTMuOSAzLjgtMTIuMyAwLTkuOS02LjctMTQuMS0xNi44LTE0LjFsLS4yIDBjLTEwLjEgMC0xNi44IDQuMi0xNi44IDE0LjFsMCA0MC4xYzAgMTAuNCA2LjcgMTQuMSAxNi44IDE0LjFsLjIgMGMxMC4xIDAgMTYuOC0zLjggMTYuOC0xNC4xIDAtOS45IDEuMS0xMy44LTMuOC0xMy44em0tODAuNyAxNy40bC0xNC43IDAgMC0xOS4zIDExLjQgMGMyLjUgMCAzLjgtMS4zIDMuOC0zLjhsMC0yLjFjMC0yLjUtMS4zLTMuOC0zLjgtMy44bC0xMS40IDAgMC0xOC4zIDE0LjQgMGMyLjUgMCAzLjgtMS4zIDMuOC0zLjhsMC0yLjFjMC0yLjUtMS4zLTMuOC0zLjgtMy44bC0yMS43IDBjLTIuNC0uMS0zLjcgMS4zLTMuNyAzLjhsMCA1OS4xYzAgMi41IDEuMyAzLjggMy44IDMuOGwyMS45IDBjMi41IDAgMy44LTEuMyAzLjgtMy44bDAtMi4xYzAtMi41LTEuMy0zLjgtMy44LTMuOHptLTQyLTE4LjVjNC42LTIgNy4zLTYgNy4zLTEyLjRsMC0xMS45YzAtMTAuMS02LjctMTQuMS0xNi44LTE0LjFsLTEzLjQgMGMtMi41IDAtMy44IDEuMy0zLjggMy44bDAgNTkuMWMwIDIuNSAxLjMgMy44IDMuOCAzLjhsMy40IDBjMi41IDAgMy44LTEuMyAzLjgtMy44bDAtMjIuOSA1LjYgMCA3LjQgMjMuNWMuMiAxIC44IDEuOCAxLjYgMi40czEuOCAuOSAyLjcgLjhsMy4zIDBjMi44IDAgNC0xLjggMy4yLTQuNGwtOC4xLTIzLjl6bS0zLjgtMTRjMCA0LjgtMi41IDYuMS02LjEgNi4xbC01LjggMCAwLTIwLjkgNS44IDBjMy42IDAgNi4xIDEuMyA2LjEgNi4xbDAgOC43ek0xNzYuMSAyMjZjLS4xLS41LS4yLTEtLjQtMS40cy0uNi0uOC0xLTEuMS0uOC0uNi0xLjMtLjctMS0uMi0xLjUtLjFsLTYuOSAwYy0uNSAwLTEgMC0xLjQgLjJzLS45IC40LTEuMyAuNy0uNyAuNy0uOSAxLjEtLjQgLjktLjQgMS40bC0xMSA1OS4yYy0uNSAyLjcgLjkgNC4xIDMuNCA0LjFsMyAwYy41IC4xIDEgMCAxLjUtLjJzLjktLjQgMS4zLS43IC43LS43IC45LTEuMiAuNC0uOSAuNC0xLjRsMS44LTExLjMgMTIuMiAwIDEuOCAxMS4zYzAgLjUgLjIgMSAuNCAxLjRzLjUgLjkgLjkgMS4yIC44IC42IDEuMyAuNyAxIC4yIDEuNSAuMmwzLjUgMGMyLjYgMCAzLjktMS40IDMuNC00LjFMMTc2LjEgMjI2em0tMTIuMyAzOS4zbDQuNy0yOS43IDQuNyAyOS43LTkuNCAwem04OS4zIDIwLjJsMC01My4yIDcuNSAwYzIuNSAwIDMuOC0xLjMgMy44LTMuOGwwLTIuMWMwLTIuNS0xLjMtMy44LTMuOC0zLjhsLTI1LjggMGMtMi41IDAtMy44IDEuMy0zLjggMy44bDAgMi4xYzAgMi41IDEuMyAzLjggMy44IDMuOGw3LjMgMCAwIDUzLjJjMCAyLjUgMS4zIDMuOCAzLjggMy44bDMuNCAwYzIuNSAwIDMuOC0xLjMgMy44LTMuOGwwIDB6bTI0OC0uOGwtMTkuNCAwIDAtMjYuNyAxNi4xIDBjLjMgMCAuNSAwIC44LS4xcy41LS4yIC43LS40IC4zLS40IC40LS43IC4xLS41IC4xLS44bDAtLjhjMC0uMyAwLS41LS4xLS44cy0uMi0uNS0uNC0uNy0uNC0uMy0uNy0uNC0uNS0uMS0uOC0uMWwtMTYuMSAwIDAtMjUuOCAxOS4xIDBjLjMgMCAuNSAwIC44LS4xcy41LS4yIC43LS40IC4zLS40IC40LS43IC4xLS41IC4xLS44bDAtLjhjMC0uMyAwLS41LS4xLS44cy0uMi0uNS0uNC0uNy0uNC0uMy0uNy0uNC0uNS0uMS0uOC0uMWwtMjIuMiAwYy0uMy0uMS0uNS0uMS0uOCAwcy0uNSAuMi0uNyAuNC0uMyAuNC0uNCAuNy0uMSAuNS0uMSAuOGwwIDYzYzAgLjMgMCAuNSAuMSAuOHMuMiAuNSAuNCAuNiAuNCAuMyAuNyAuNCAuNSAuMSAuOCAuMWwyMi41IDBjLjMgMCAuNSAwIC44LS4xcy41LS4yIC43LS40IC4zLS40IC40LS42IC4xLS41IC4xLS44bDAtLjhjMC0uMyAwLS41LS4xLS44cy0uMi0uNS0uNC0uNy0uNC0uMy0uNy0uNC0uNS0uMS0uOC0uMWwwIDB6TTQwOCAyMjEuOGwtLjggMGMtMTAuMSAwLTE1LjMgNC43LTE1LjMgMTQuMWwwIDQwLjFjMCA5LjMgNS4yIDE0LjEgMTUuMyAxNC4xbC44IDBjMTAuMSAwIDE1LjMtNC44IDE1LjMtMTQuMWwwLTQwLjFjMC05LjQtNS4yLTE0LjEtMTUuMy0xNC4xbDAgMHptMTAuMiA1Mi40Yy0uMSA4LTMgMTEuMS0xMC41IDExLjFzLTEwLjUtMy4xLTEwLjUtMTEuMWwwLTM2LjZjMC03LjkgMy0xMS4xIDEwLjUtMTEuMXMxMC41IDMuMiAxMC41IDExLjFsMCAzNi42em0tNDYuNS0xNC41YzYuMS0xLjYgOS4yLTYuMSA5LjItMTMuM2wwLTkuN2MwLTkuNC01LjItMTQuMS0xNS4zLTE0LjFsLTEzLjcgMGMtLjMgMC0uNSAwLS44IC4xcy0uNSAuMi0uNyAuNC0uMyAuNC0uNCAuNi0uMSAuNS0uMSAuOGwwIDYzYzAgLjMgMCAuNSAuMSAuOHMuMiAuNSAuNCAuNiAuNCAuMyAuNyAuNCAuNSAuMSAuOCAuMWwxLjIgMGMuMyAwIC41IDAgLjgtLjFzLjUtLjIgLjYtLjQgLjMtLjQgLjQtLjYgLjEtLjUgLjEtLjhsMC0yNi45IDExLjYgMCAxMC40IDI3LjJjLjIgLjUgLjUgLjkgLjkgMS4xcy45IC40IDEuNCAuNGwxLjUgMGMxLjQgMCAyLTEgMS41LTIuM2wtMTAuNi0yNy4zem0tNi40LTMuOWwtMTAuMiAwIDAtMjguNSAxMC4yIDBjNy41IDAgMTAuNSAzLjEgMTAuNSAxMS4xbDAgNi40YzAgNy44LTMgMTEtMTAuNSAxMWwwIDB6bTg1LjktMzMuMWwtMTMuNyAwYy0uMy0uMS0uNS0uMS0uOCAwcy0uNSAuMi0uNyAuNC0uMyAuNC0uNCAuNy0uMSAuNS0uMSAuOGwwIDYzYzAgLjMgMCAuNSAuMSAuOHMuMiAuNSAuNCAuNiAuNCAuMyAuNyAuNCAuNSAuMSAuOCAuMWwxLjIgMGMuMyAwIC41IDAgLjgtLjFzLjUtLjIgLjYtLjQgLjMtLjQgLjQtLjYgLjEtLjUgLjEtLjhsMC0yNi4xIDEwLjYgMGMxMC4xIDAgMTUuMy00LjggMTUuMy0xNC4xbDAtMTAuNWMwLTkuNC01LjItMTQuMS0xNS4zLTE0LjF6bTEwLjIgMjIuOGMwIDcuOS0zIDExLjEtMTAuNSAxMS4xbC0xMC4yIDAgMC0yOS4yIDEwLjIgMGM3LjUtLjEgMTAuNSAzLjEgMTAuNSAxMWwwIDcuMXpNMjU5LjYgMzA4bC0yLjMtNi44LTIuMyA2LjgtNy4xIC4xIDUuNyA0LjMtMi4xIDYuOCA1LjgtNC4xIDUuOCA0LjEtMi4xLTYuOCA1LjctNC4zLTcuMS0uMXpNNDg3LjIgMTcxLjljLTExLjctNC40LTIzLjUtOC4xLTM1LjYtMTEuMyAxOS42LTc4IDExLjYtMTM0LjctMjIuMy0xNTMuOS0zNC41LTE5LjQtODUuOSA0LjMtMTM4LjIgNTUuMiAzLjQgMy4zIDYuOCA2LjcgMTAuMiAxMC4yIDgyLjUtODAgMTE5LjYtNTMuNSAxMjAuOS01Mi44IDIyLjQgMTIuNyAzNiA1NS44IDE1LjUgMTM3LjgtMjcuOC02LjQtNTYuMS0xMC43LTg0LjYtMTMtNzEuOS0xMDAuNS0xNDAuNi0xNDIuMS0xODIuMi0xNDIuMS0zMC44IDAtNDMuOCAyMS00Ny42IDI3LjctMTguMSAzMi0xMy4zIDg0LjIgLjEgMTMzLjgtNzAuNSAyMC4zLTEyMC43IDU0LjEtMTIwLjMgOTUgLjUgNTkuNiAxMDMuMiA4Ny44IDEyMi4xIDkyLjgtMjAuNSA4MS45LTEwLjEgMTM1LjYgMjIuMyAxNTMuOSAyOCAxNS44IDc1LjEgNiAxMzguMi01NS4yLTMuNC0zLjMtNi44LTYuNy0xMC4yLTEwLjItODIuNSA4MC0xMTkuNyA1My41LTEyMC45IDUyLjgtMjIuMy0xMi42LTM2LTU1LjYtMTUuNS0xMzcuOSAxMi40IDIuOSA0MS44IDkuNSA4NC42IDEzIDcxLjkgMTAwLjQgMTQwLjYgMTQyIDE4Mi4xIDE0MiAzMC44IDAgNDMuOC0yMSA0Ny42LTI3LjcgMTgtMzEuOSAxMy4zLTg0LjEtLjEtMTMzLjggMTUyLjMtNDMuOCAxNTYuMi0xMzAuMiAzMy45LTE3Ni4zbDAgMHpNMTM2IDM2LjhjMi45LTUuMSAxMS45LTIwLjMgMzQuOS0yMC4zIDM2LjggMCA5OC44IDM5LjYgMTYzLjMgMTI2LjItMzEuMy0xLjgtNjIuNy0xLjUtOTMuOSAuOSAxMy0xOC4zIDI3LjEtMzUuOCA0Mi4yLTUyLjQtMy40LTMuNS02LjgtNi45LTEwLjItMTAuMi0xOC4zIDIwLjItMzUuMyA0MS43LTUwLjcgNjQuMi0yOC41IDIuNy01Ni43IDcuNi04NC40IDE0LjYtLjItMS40LTI0LjMtODIuMi0xLjItMTIzbDAgMHpNNDQwLjggNDc1LjFjLTIuOSA1LjEtMTEuOCAyMC4zLTM0LjkgMjAuMy0zNi43IDAtOTguNy0zOS40LTE2My4zLTEyNi4yIDMxLjMgMS44IDYyLjcgMS41IDkzLjktLjktMTMgMTguMy0yNy4xIDM1LjgtNDIuMiA1Mi40IDMuNCAzLjUgNi44IDYuOSAxMC4yIDEwLjIgMTguNC0yMC4yIDM1LjMtNDEuNyA1MC43LTY0LjIgNDcuMy00LjcgODAuMy0xMy41IDg0LjQtMTQuNiAyMi43IDg0LjQgNC41IDExNyAxLjIgMTIzem05LjEtMTM4LjZjLTMuNi0xMS45LTcuNy0yNC4xLTEyLjQtMzYuNC0yLjEgMC00LjItLjUtNi4xLTEuNXMtMy41LTIuNC00LjYtNC4ybC0uMSAuMWMtMS42IDEuNS0zLjQgMi43LTUuNCAzLjYgNS43IDE0LjMgMTAuNiAyOC40IDE0LjcgNDIuMi0yMy43IDYtNDcuNyAxMC4zLTcyIDEzIDMuNS01LjMgMTcuMi0yNi4yIDMyLjItNTQuMi0yLjEtLjgtNC4yLTEuOS02LTMuMi0xLjEgMS4yLTMuNiA0LjItMTAuOSA0LjItNi4yIDExLjItMTcuNCAzMC45LTMzLjkgNTUuMi0zNy40IDMuMy03NSAzLjYtMTEyLjQgMS03LjktMTEuMi0yMS41LTMxLjEtMzYuOC01Ny44LTEtLjQtMi0uOS0zLTEuNS0xLjkgMS42LTMuOSAzLjItMTIuNiAzLjIgNi4zIDExLjIgMTcuNSAzMC43IDMzLjggNTQuNi0yNC4zLTIuMy00OC40LTYuMi03Mi4yLTExLjcgMy45LTE0IDguNi0yOC4zIDE0LjEtNDIuOS0zLjIgMC01LjQgLjItOC40LTEtMi4yIC44LTQuNiAxLjEtNi45IDEtNC45IDEzLjQtOS4xIDI2LjUtMTIuNyAzOS40LTE1OS45LTQyLjYtMTQwLjMtMTIzLjYtMS41LTE2NCAzLjYgMTEuOSA3LjcgMjQuMSAxMi40IDM2LjQgMTAuNCAwIDEyLjkgMy40IDE0LjQgNS4zIC43LS44IDEuNC0xLjYgMi4zLTIuMi01LjgtMTQuNy0xMC45LTI5LjItMTUuMi00My4zIDctMS44IDMyLjQtOC40IDcyLTEzLTE1LjkgMjQuMy0yNi43IDQzLjktMzIuOCA1NS4zIDMuMSAxLjggNS4zIDQuNiA2LjQgOCAyLjUtMy43IDYuMS02LjYgMTAuMi04LjQgNi41LTExLjcgMTcuOS0zMS45IDM0LjgtNTYuOSAzNy40LTMuMyA3NS0zLjYgMTEyLjQtMSAzMS41IDQ0LjYgMjguOSA0OC4xIDQyLjUgNjQuNSAyLjYtMy41IDYuMy02IDEwLjQtNy40LTYuNC0xMS40LTE3LjYtMzEtMzQuMy01NS41IDQwLjQgNC4xIDY1IDEwIDcyLjIgMTEuNy00IDE0LjQtOC45IDI5LjItMTQuNiA0NC4yIDIuNSAxIDQuOCAyLjQgNi44IDQuM2wuMSAuMWMxLTEuNSAyLjMtMi44IDMuOC0zLjhzMy4zLTEuNiA1LjEtMS44YzQuOS0xMy40IDkuMi0yNi42IDEyLjgtMzkuNSAxMS43IDMuMSAyMy4yIDYuOCAzNC41IDExIDEwNi4xIDM5LjkgNzQgODcuOSA3Mi42IDkwLjQtMTkuOCAzNS4xLTgwLjEgNTUuMi0xMDUuNyA2Mi41em0tMTE0LjQtMTE0bC0xLjIgMGMtLjMgMC0uNSAwLS44IC4xcy0uNSAuMi0uNiAuNC0uMyAuNC0uNCAuNi0uMSAuNS0uMSAuOGwwIDQ5LjhjMCA3LjktMi42IDExLjEtMTAuMSAxMS4xcy0xMC4xLTMuMS0xMC4xLTExLjFsMC00OS44YzAtLjMgMC0uNS0uMS0uOHMtLjItLjUtLjQtLjctLjQtLjMtLjctLjQtLjUtLjEtLjgtLjFsLTEuMiAwYy0uMyAwLS41IDAtLjggLjFzLS41IC4yLS43IC40LS4zIC40LS40IC42LS4xIC41LS4xIC44bDAgNTEuNWMwIDkuNiA1IDE0LjEgMTUuMSAxNC4xbC40IDBjMTAuMSAwIDE1LjEtNC42IDE1LjEtMTQuMWwwLTUxLjVjMC0uMy0uMS0uNS0uMi0uOHMtLjMtLjUtLjUtLjYtLjQtLjMtLjctLjQtLjUtLjEtLjgtLjF6TTMyMS44IDMwOGwtMi4zLTYuOC0yLjMgNi44LTcuMSAuMSA1LjcgNC4zLTIuMSA2LjggNS44LTQuMSA1LjggNC4xLTIuMS02LjggNS43LTQuMy03LjEtLjF6bS0zMS4xIDcuNGwtMi4zLTYuOC0yLjMgNi44LTcuMSAuMSA1LjcgNC4zLTIuMSA2LjggNS44LTQuMSA1LjggNC4xLTIuMS02LjggNS43LTQuMy03LjEtLjF6bTUuMS0zMC44bC0xOS40IDAgMC0yNi43IDE2LjEgMGMuMyAwIC41IDAgLjgtLjFzLjUtLjIgLjctLjQgLjMtLjQgLjQtLjcgLjEtLjUgLjEtLjhsMC0uOGMwLS4zIDAtLjUtLjEtLjhzLS4yLS41LS40LS43LS40LS4zLS43LS40LS41LS4xLS44LS4xbC0xNi4xIDAgMC0yNS44IDE5LjEgMGMuMyAwIC41IDAgLjgtLjFzLjUtLjIgLjctLjQgLjMtLjQgLjQtLjcgLjEtLjUgLjEtLjhsMC0uOGMwLS4zIDAtLjUtLjEtLjhzLS4yLS41LS40LS43LS40LS4zLS43LS40LS41LS4xLS44LS4xbC0yMi4yIDBjLS4zIDAtLjUgMC0uOCAuMXMtLjUgLjItLjcgLjQtLjMgLjQtLjQgLjYtLjEgLjUtLjEgLjhsMCA2M2MwIC4zIDAgLjUgLjEgLjhzLjIgLjUgLjQgLjYgLjQgLjMgLjcgLjQgLjUgLjEgLjggLjFsMjIuNSAwYy4zIDAgLjUgMCAuOC0uMXMuNS0uMiAuNy0uNCAuMy0uNCAuNC0uNyAuMS0uNSAuMS0uOGwwLS44YzAtLjMgMC0uNi0uMS0uOHMtLjItLjUtLjQtLjctLjQtLjQtLjctLjQtLjUtLjEtLjgtLjFsMCAwem0tNy40LTk5LjRsLTIuMyA2LjgtNy4xIC4xIDUuNyA0LjMtMi4xIDYuOCA1LjgtNC4xIDUuOCA0LjEtMi4xLTYuOCA1LjctNC4zLTcuMS0uMS0yLjMtNi44eiJdCiAgICB9OwogICAgZmFXYXplID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIndhemUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjgzZiIsICJNNTAyLjYgMjAxLjdjMTQuNSA4NS45LTMwLjkgMTY3LjktMTEzLjIgMjA4LjEgMTMgMzQuMS0xMi40IDcwLjItNDguMyA3MC4yLTEzLjIgMC0yNi01LjEtMzUuNi0xNC4ycy0xNS4zLTIxLjYtMTYtMzQuOGMtNi40IC4yLTY0LjIgMC03Ni4zLS42LS4zIDYuOC0xLjkgMTMuNS00LjcgMTkuNnMtNi45IDExLjctMTEuOSAxNi4zLTEwLjggOC4yLTE3LjIgMTAuNS0xMy4yIDMuNC0xOS45IDMuMWMtMzMuOS0xLjQtNTgtMzQuOC00Ny02Ny45LTM3LjItMTMuMS03Mi41LTM0LjktOTkuNi03MC44LTEzLTE3LjMtLjUtNDEuOCAyMC44LTQxLjggNDYuMyAwIDMyLjItNTQuMiA0My4yLTExMC4zIDE4LjQtOTMuOSAxMTYuOC0xNTcuMSAyMTEuNy0xNTcuMSAxMDIuNSAwIDE5Ny4yIDcwLjcgMjE0LjEgMTY5Ljd6TTM3My45IDM4OC4zYzQyLTE5LjIgODEuMy01Ni43IDk2LjMtMTAyLjEgNDAuNS0xMjMuMS02NC4yLTIyOC0xODEuNy0yMjgtODMuNCAwLTE3MC4zIDU1LjQtMTg2LjEgMTM2LTkuNSA0OC45IDUgMTMxLjQtNjguNyAxMzEuNCAyNC45IDMzLjEgNTguMyA1Mi42IDkzLjcgNjQgMjQuNy0yMS44IDYzLjktMTUuNSA3OS44IDE0LjMgMTQuMiAxIDc5LjIgMS4yIDg3LjkgLjggMy41LTYuOSA4LjUtMTIuOSAxNC43LTE3LjVzMTMuMi03LjkgMjAuOC05LjUgMTUuNC0xLjQgMjIuOSAuNCAxNC41IDUuMyAyMC41IDEwLjJ6TTIwNS41IDE4Ny4xYzAtMzQuNyA1MC44LTM0LjcgNTAuOCAwcy01MC44IDM0LjctNTAuOCAwem0xMTYuNiAwYzAtMzQuNyA1MC45LTM0LjcgNTAuOSAwcy01MC45IDM0LjgtNTAuOSAwek0xOTkuNSAyNTcuOGMtMy40LTE2LjkgMjIuMi0yMi4yIDI1LjYtNS4ybC4xIC4zYzQuMSAyMS40IDI5LjggNDQgNjQuMSA0My4xIDM1LjctLjkgNTkuMy0yMi4yIDY0LjEtNDIuOCA0LjUtMTYuMSAyOC42LTEwLjQgMjUuNSA2LTUuMiAyMi4yLTMxLjIgNjItOTEuNSA2Mi45LTQyLjYgMC04MC45LTI3LjgtODcuOS02NC4ybDAgMHoiXQogICAgfTsKICAgIGZhQ3JlYXRpdmVDb21tb25zUmVtaXggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY3JlYXRpdmUtY29tbW9ucy1yZW1peCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNGVlIiwgIk0yNTUuNiA4QzM5Ny40IDggNTA0IDExOC4xIDUwNCAyNTYgNTA0IDQwMy4xIDM4NS41IDUwNCAyNTUuNiA1MDQgMTIxLjYgNTA0IDggMzk0LjUgOCAyNTYgOCAxMjMuMSAxMTIuNyA4IDI1NS42IDh6bS44IDQ0LjdjLTExOC4yIDAtMjAzLjcgOTcuOS0yMDMuNyAyMDMuMyAwIDEwOS44IDkxLjIgMjAyLjggMjAzLjcgMjAyLjggMTAzLjIgMCAyMDIuOC04MS4xIDIwMi44LTIwMi44IC4xLTExMy44LTkwLjItMjAzLjMtMjAyLjgtMjAzLjN6TTQxOC4xIDI2MC40bDQuOSAyLjIgMCA3MGMtNy4yIDMuNi02My40IDI3LjUtNjcuMyAyOC44LTYuNS0xLjgtMTEzLjctNDYuOC0xMzcuMy01Ni4ybC02NC4yIDI2LjYtNjMuMy0yNy41IDAtNjMuOCA1OS4zLTI0LjhjLS43LS43LS40IDUtLjQtNzAuNGw2Ny4zLTI5LjcgMTUxLjkgNjIuOSAwIDYxLjYgNDkuMSAyMC4zem0tNzAuNCA4MS41bDAtNDMuOC0uNCAwIDAtMS44LTExMy44LTQ2LjUgMCA0NS4yIDExMy44IDQ2LjkgMC0uNCAuNCAuNHptNy41LTU3LjZsMzkuOS0xNi40LTM2LjgtMTUuNS0zOSAxNi40IDM1LjkgMTUuNXptNTIuMyAzOC4xbDAtNDMtNDQuMyAxOC42IDAgNDMuNCA0NC4zLTE5eiJdCiAgICB9OwogICAgZmFCYW5kY2FtcCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJiYW5kY2FtcCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMmQ1IiwgIk0yNTYgOGEyNDggMjQ4IDAgMSAwIDAgNDk2IDI0OCAyNDggMCAxIDAgMC00OTZ6bTQ4LjIgMzI2LjFsLTE4MSAwIDg0LjctMTU2LjEgMTgxIDAtODQuNyAxNTYuMXoiXQogICAgfTsKICAgIGZhU3F1YXJlV2ViQXdlc29tZVN0cm9rZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtd2ViLWF3ZXNvbWUtc3Ryb2tlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU2ODQiLCAiTTY0IDY0QzQ2LjMgNjQgMzIgNzguMyAzMiA5NmwwIDMyMGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTMyMGMwLTE3LjctMTQuMy0zMi0zMi0zMkw2NCA2NHpNMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZ6bTIzNSA4MS42bDUzIDQ2LjQgNTIuMi0xMC40Yy0yLjYtMy45LTQuMi04LjUtNC4yLTEzLjYgMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGMwIDEzLTEwLjMgMjMuNi0yMy4yIDI0TDMwNC41IDM0OS4xYy01LjIgMTEuNS0xNi42IDE4LjktMjkuMiAxOC45bC0xMDIuNiAwYy0xMi42IDAtMjQtNy40LTI5LjItMTguOUw4Ny4yIDIyNGMtMTIuOS0uNC0yMy4yLTExLTIzLjItMjQgMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGMwIDUtMS41IDkuNy00LjIgMTMuNkwxNjAgMjI0IDIxMy4xIDE3Ny42Yy04LjktNC4xLTE1LTEzLjEtMTUtMjMuNiAwLTE0LjQgMTEuNi0yNiAyNi0yNnMyNiAxMS42IDI2IDI2YzAgMTAuNS02LjIgMTkuNS0xNS4xIDIzLjZ6Il0KICAgIH07CiAgICBmYVZpbWVvViA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ2aW1lby12IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyN2QiLCAiTTQ0Ny44IDE1My42Yy0yIDQzLjYtMzIuNCAxMDMuMy05MS40IDE3OS4xLTYwLjkgNzkuMi0xMTIuNCAxMTguOC0xNTQuNiAxMTguOC0yNi4xIDAtNDguMi0yNC4xLTY2LjMtNzIuMy0zNS4yLTEyOS4yLTUwLjItMjA0LjktNzkuMy0yMDQuOS0zLjQgMC0xNS4xIDcuMS0zNS4yIDIxLjFMMCAxNjguMmM1MS42LTQ1LjMgMTAwLjktOTUuNyAxMzEuOC05OC41IDM0LjktMy40IDU2LjMgMjAuNSA2NC40IDcxLjUgMjguNyAxODEuNSA0MS40IDIwOC45IDkzLjYgMTI2LjcgMTguNy0yOS42IDI4LjgtNTIuMSAzMC4yLTY3LjYgNC44LTQ1LjktMzUuOC00Mi44LTYzLjMtMzEgMjItNzIuMSA2NC4xLTEwNy4xIDEyNi4yLTEwNS4xIDQ1LjggMS4yIDY3LjUgMzEuMSA2NC45IDg5LjR6Il0KICAgIH07CiAgICBmYVN0cmF2YSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzdHJhdmEiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjQyOCIsICJNMTU4LjQgMEw3IDI5MiA5Ni4yIDI5MiAxNTguNCAxNzUuOSAyMjAuMSAyOTIgMzA4LjYgMjkyIDE1OC40IDB6TTMwOC42IDI5MmwtNDMuOSA4OC4yLTQ0LjYtODguMi02Ny42IDAgMTEyLjIgMjIwIDExMS41LTIyMC02Ny42IDB6Il0KICAgIH07CiAgICBmYVVuaXJlZ2lzdHJ5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInVuaXJlZ2lzdHJ5IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY0MDQiLCAiTTE5MiA0ODBjMzkuNSAwIDc2LjItMTEuOCAxMDYuOC0zMi4ybC0yMTMuNSAwQzExNS44IDQ2OC4yIDE1Mi41IDQ4MCAxOTIgNDgwek0xMDIuOSAyODYuOWwwLTEyLjQtMTAyLjkgMCAwIDEyLjRjMCAyLjUgMCA1IC4xIDcuNGwxMDMuMSAwYy0uMi0yLjQtLjMtNC45LS4zLTcuNHptMjAuNSA1N2wtMTE0LjkgMGMyLjYgOC41IDUuOCAxNi44IDkuNiAyNC44bDEzOC4zIDBjLTEyLjktNS43LTI0LjEtMTQuMi0zMy0yNC44em0tMTcuNy0zNC43bC0xMDQuNCAwYy45IDcuNiAyLjIgMTUgMy45IDIyLjNsMTA5LjcgMGMtNC02LjktNy4yLTE0LjQtOS4yLTIyLjN6bS0yLjgtNjkuM2wtMTAyLjkgMCAwIDE3LjMgMTAyLjkgMCAwLTE3LjN6bTAtMTczLjJsLTEwMi45IDAgMCA0LjkgMTAyLjkgMCAwLTQuOXptMC0zNC43bC0xMDIuOSAwIDAgMi41IDEwMi45IDAgMC0yLjV6bTAgNjkuM2wtMTAyLjkgMCAwIDcuNCAxMDIuOSAwIDAtNy40em0wIDEwNGwtMTAyLjkgMCAwIDE0LjggMTAyLjkgMCAwLTE0Ljh6bTAtNjkuM2wtMTAyLjkgMCAwIDkuOSAxMDIuOSAwIDAtOS45em0wIDM0LjZsLTEwMi45IDAgMCAxMi40IDEwMi45IDAgMC0xMi40ek0yNjkuMSAzMzEuNWwxMDkuNyAwYzEuOC03LjMgMy4xLTE0LjcgMy45LTIyLjNsLTEwNC40IDBjLTIuMSA3LjktNS4yIDE1LjQtOS4yIDIyLjN6bTEyLTE4NS43bDEwMi45IDAgMC05LjgtMTAyLjkgMCAwIDkuOHptMCAzNy4ybDEwMi45IDAgMC0xMi40LTEwMi45IDAgMCAxMi40em0wLTc0LjNsMTAyLjkgMCAwLTcuNC0xMDIuOSAwIDAgNy40em0wLTc2LjdsMCAyLjUgMTAyLjkgMCAwLTIuNS0xMDIuOSAwek03OC4xIDQ0Mi45bDIyNy43IDBjMTEuOC04LjcgMjIuNy0xOC42IDMyLjItMjkuN2wtMjkzLjEgMGM5LjYgMTEgMjEuNCAyMSAzMy4yIDI5Ljd6bTIwMy0zNzEuM2wxMDIuOSAwIDAtNC45LTEwMi45IDAgMCA0Ljl6bTAgMTQ4LjVsMTAyLjkgMCAwLTE0LjgtMTAyLjkgMCAwIDE0Ljh6TTM4LjggNDA1LjdsMzA1LjMgMGM2LjctOC41IDEyLjYtMTcuNiAxNy44LTI3LjJMMjMgMzc4LjVjNS4yIDkuNiA5LjIgMTguNyAxNS44IDI3LjJ6bTE4OC44LTM3LjFsMTM5LjQgMGMzLjctOCA1LjgtMTYuMiA4LjUtMjQuOGwtMTE1IDBjLTguOCAxMC43LTIwLjEgMTkuMi0zMi45IDI0Ljh6bTUzLjUtODEuN2MwIDIuNS0uMSA1LS40IDcuNGwxMDMuMSAwYy4xLTIuNSAuMi00LjkgLjItNy40bDAtMTIuNC0xMDIuOSAwIDAgMTIuNHptMC0yOS43bDEwMi45IDAgMC0xNy4zLTEwMi45IDAgMCAxNy4zeiJdCiAgICB9OwogICAgZmFDY0RpbmVyc0NsdWIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY2MtZGluZXJzLWNsdWIiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjI0YyIsICJNMjM5LjcgNzkuOWExNzUuOCAxNzUuOCAwIDEgMCAwIDM1MS42IDE3NS44IDE3NS44IDAgMSAwIDAtMzUxLjZ6TTE5OS44IDM1OS41Yy00MS43LTE1LjktNzEuNC01Ni40LTcxLjQtMTAzLjhzMjkuNy04Ny45IDcxLjQtMTA0LjFsMCAyMDcuOXptNzkuOCAuM2wwLTIwOC4yYzQxLjcgMTYuMiA3MS40IDU2LjcgNzEuNCAxMDQuMXMtMjkuNyA4Ny45LTcxLjQgMTA0LjF6TTUyOCAzMkw0OCAzMkMyMS41IDMyIDAgNTMuNSAwIDgwTDAgNDMyYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDQ4MCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMzUyYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4ek0zMjkuNyA0NDhsLTkwLjMgMEMxMzMuMiA0NDggNDUuNiAzNjIuNSA0NS42IDI1Ny44IDQ1LjYgMTQzLjIgMTMzLjIgNjQgMjM5LjQgNjRsOTAuMyAwYzEwNSAwIDIwMC43IDc5LjIgMjAwLjcgMTkzLjggMCAxMDQuNy05NS43IDE5MC4yLTIwMC43IDE5MC4yeiJdCiAgICB9OwogICAgZmFLdWJlcm5ldGVzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImt1YmVybmV0ZXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTg1NyIsICJNMjU2IDMxNi4xYzMuNS0uMSA3LjIgMiA4LjkgNS4xTDI5MyAzNzEuN2MtMy42IDEuMi03LjMgMi4zLTExLjIgMy4xLTIxLjQgNC45LTQyLjcgMy40LTYyLTMuMmwyNy45LTUwLjRjMS43LTMuMSA0LjktNSA4LjItNS4xem01MC41LTIzLjRsNTcuMiA5LjdjLTguNCAyMy41LTI0LjQgNDMuOS00NS44IDU3LjVsLTIyLjItNTMuNmMtMi00LjcgLjEtMTAuNCA0LjgtMTIuNiAxLjktLjkgNC4xLTEuMyA2LS45em0tODkuMSA3LjdjLjUgMi4xIC4zIDQuMi0uNSA2bC0yMS44IDUzLjNjLTIwLjUtMTMuMi0zNi45LTMyLjktNDUuNy01Ny4xbDU2LjctOS42YzUuMS0uOSAxMC4xIDIuNCAxMS4zIDcuNXptNTguOC00MWwtMy45IDE3LjEtMTUuOCA3LjYtMTUuOS03LjctNC0xNy4xIDExLTEzLjcgMTcuNyAwIDExIDEzLjd6bS03My43LTE2LjdjMy45IDMuNCA0LjQgOS41IDEuMiAxMy42LTEuMyAxLjctMy4xIDIuOC01IDMuM2wtNTUuMyAxNi4yYy0yLjgtMjUuNyAzLjMtNTAuNyAxNi4xLTcxLjZsNDMuMSAzOC42em0xNTAuNy0zOC41YzYuNCAxMC40IDExLjIgMjIgMTQuMSAzNC42IDIuOSAxMi40IDMuNiAyNC44IDIuNCAzNi44bC01NS42LTE2Yy01LTEuNC04LjEtNi43LTYuOS0xMS43IC41LTIuMSAxLjYtMy44IDMuMS01LjFsNDIuOS0zOC41em0tMTEzLjggNC40Yy0uMiA1LjItNC43IDkuNC05LjkgOS40LTIuMSAwLTQuMS0uNy01LjctMS44bC00Ny4zLTMzLjRjMTQuNS0xNC4zIDMzLjEtMjQuOCA1NC41LTI5LjcgMy45LS45IDcuOC0xLjYgMTEuNy0ybC0zLjMgNTcuNnptMzAuOC01Ny42YzI1IDMuMSA0OC4xIDE0LjQgNjUuOCAzMS43bC00Ny4xIDMzLjJjLTQuMiAzLTEwIDIuMy0xMy4zLTEuOC0xLjMtMS43LTItMy42LTIuMS01LjZsLTMuMy01Ny41ek0yNTQuNS0xLjNjNS45LS4zIDExLjcgLjkgMTcgMy40TDQ1NSA4OS43YzQuNyAyLjMgOC45IDUuNiAxMi4yIDkuN3M1LjYgOC44IDYuOCAxMy45bDQ1LjMgMTk2LjljMS4yIDUuMSAxLjIgMTAuNCAwIDE1LjVzLTMuNSA5LjktNi44IDEzLjlMMzg1LjYgNDk3LjZjLTMuMyA0LjEtNy41IDcuNC0xMi4yIDkuNnMtMTAgMy40LTE1LjIgMy40bC0yMDMuNiAwYy01LjMgMC0xMC41LTEuMi0xNS4yLTMuNHMtOC45LTUuNS0xMi4yLTkuNkwuMiAzMzkuN2MtLjctLjktMS40LTEuOC0yLTIuOC0yLjYtMy45LTQuMy04LjMtNS4xLTEyLjlzLS43LTkuMyAuMy0xMy44TDM4LjcgMTEzLjRjMS4yLTUuMSAzLjUtOS45IDYuOC0xMy45czcuNS03LjQgMTIuMi05LjdMMjQxLjEgMi4xYzQuMi0yIDguOC0zLjIgMTMuNC0zLjR6bTEuOCA2N2MtNi4xIDAtMTEgNS41LTExIDEyLjIgMCAuMSAwIC4yIDAgLjMgMCAuOS0uMSAyIDAgMi44IC4xIDMuOSAxIDYuOSAxLjUgMTAuNCAuOSA3LjcgMS43IDE0IDEuMiAxOS45LS41IDIuMi0yLjEgNC4zLTMuNiA1LjdsLS4yIDQuNmMtNi42IC41LTEzLjIgMS42LTE5LjggMy4xLTI4LjUgNi41LTUzLjEgMjEuMS03MS44IDQxLTEuMi0uOC0zLjMtMi4zLTQtMi44LTIgLjMtNCAuOS02LjUtLjYtNC45LTMuMy05LjQtNy45LTE0LjgtMTMuNC0yLjUtMi42LTQuMy01LjEtNy4yLTcuNy0uNy0uNi0xLjctMS40LTIuNC0yLTIuMy0xLjgtNS0yLjgtNy43LTIuOS0zLjQtLjEtNi42IDEuMi04LjggMy45LTMuOCA0LjctMi41IDEyIDIuNyAxNi4yIC4xIDAgLjEgLjEgLjIgLjEgLjcgLjYgMS42IDEuMyAyLjMgMS44IDMuMSAyLjMgNiAzLjUgOS4xIDUuMyA2LjYgNC4xIDEyIDcuNCAxNi4zIDExLjUgMS43IDEuOCAyIDQuOSAyLjIgNi4zbDMuNSAzLjJjLTE4LjggMjguNC0yNy42IDYzLjQtMjIuNCA5OS4xbC00LjYgMS4zYy0xLjIgMS42LTIuOSA0LTQuNyA0LjctNS42IDEuOC0xMiAyLjQtMTkuNyAzLjMtMy42IC4zLTYuNyAuMS0xMC41IC44LS44IC4yLTIgLjQtMi45IC43bC0uMSAwLS4yIC4xYy02LjUgMS42LTEwLjcgNy41LTkuMyAxMy40IDEuMyA1LjkgNy43IDkuNCAxNC4yIDhsLjIgMGMuMSAwIC4xLS4xIC4yLS4xIC45LS4yIDIuMS0uNCAyLjgtLjYgMy44LTEgNi41LTIuNSA5LjgtMy44IDcuMy0yLjYgMTMuMy00LjggMTkuMi01LjYgMi40LS4yIDUgMS41IDYuMyAyLjJsNC44LS44YzExIDM0LjEgMzQuMSA2MS43IDYzLjMgNzkuMWwtMiA0LjhjLjcgMS45IDEuNSA0LjQgMSA2LjItMi4xIDUuNS01LjggMTEuNC05LjkgMTcuOS0yIDMtNC4xIDUuMy01LjkgOC44LS40IC44LTEgMi4xLTEuNCAzLTIuOCA2LS44IDEzIDQuNyAxNS42IDUuNSAyLjYgMTIuMi0uMSAxNS4yLTYuMmwwIDBjLjQtLjkgMS0yIDEuNC0yLjggMS42LTMuNiAyLjEtNi42IDMuMi0xMC4xIDIuOS03LjMgNC41LTE0LjkgOC41LTE5LjcgMS4xLTEuMyAyLjktMS44IDQuOC0yLjNsMi41LTQuNWMyNS41IDkuOCA1NCAxMi40IDgyLjUgNS45IDYuNS0xLjUgMTIuOC0zLjQgMTguOC01LjcgLjcgMS4yIDIgMy42IDIuMyA0LjIgMS45IC42IDMuOSAuOSA1LjYgMy40IDMgNS4xIDUgMTEuMiA3LjUgMTguNSAxLjEgMy40IDEuNiA2LjUgMy4yIDEwLjEgLjQgLjggMSAyIDEuNCAyLjggMi45IDYuMSA5LjcgOC44IDE1LjIgNi4yIDUuNC0yLjYgNy41LTkuNiA0LjctMTUuNi0uNC0uOS0xLTIuMS0xLjQtMy0xLjgtMy40LTMuOS01LjctNS45LTguNy00LjItNi41LTcuNi0xMS45LTkuOC0xNy40LS45LTIuOCAuMi00LjYgLjgtNi41LS40LS41LTEuMy0zLjItMS44LTQuNCAzMC40LTE3LjkgNTIuOC00Ni42IDYzLjMtNzkuNiAxLjQgLjIgMy45IC43IDQuNyAuOCAxLjctMS4xIDMuMi0yLjUgNi4yLTIuMyA1LjkgLjggMTEuOSAzIDE5LjIgNS42IDMuNCAxLjMgNi4xIDIuOCA5LjggMy44IC44IC4yIDEuOSAuNCAyLjggLjYgLjEgMCAuMSAwIC4yIC4xbC4yIDBjNi41IDEuNCAxMi44LTIuMiAxNC4yLThzLTIuOC0xMS44LTkuMy0xMy40Yy0uOS0uMi0yLjMtLjYtMy4yLS43LTMuOC0uNy02LjktLjUtMTAuNS0uOC03LjctLjgtMTQtMS40LTE5LjctMy4yLTIuMy0uOS00LTMuNy00LjgtNC44bC00LjQtMS4zYzIuMy0xNi42IDEuNy0zMy45LTIuMy01MS4zLTQtMTcuNS0xMS4xLTMzLjUtMjAuNi00Ny42IDEuMS0xIDMuMy0yLjkgMy45LTMuNSAuMi0yIDAtNCAyLjEtNi4yIDQuMy00LjEgOS44LTcuNCAxNi4zLTExLjUgMy4xLTEuOCA2LTMgOS4xLTUuMyAuNy0uNSAxLjctMS4zIDIuNC0xLjkgNS4zLTQuMiA2LjUtMTEuNCAyLjctMTYuMnMtMTEuMS01LjItMTYuNC0xYy0uNyAuNi0xLjggMS40LTIuNCAyLTIuOSAyLjUtNC44IDUtNy4yIDcuNy01LjQgNS41LTkuOSAxMC4xLTE0LjggMTMuNC0yLjEgMS4yLTUuMyAuOC02LjcgLjdsLTQuMiAzYy0yMy44LTI1LTU2LjItNDEtOTEuMi00NC4xLS4xLTEuNS0uMi00LjEtLjItNC45LTEuNC0xLjQtMy4yLTIuNS0zLjYtNS41LS41LTUuOSAuMy0xMi4zIDEuMy0xOS45IC41LTMuNiAxLjQtNi42IDEuNS0xMC40IDAtLjkgMC0yLjIgMC0zLjEgMC02LjctNC45LTEyLjItMTEtMTIuMnoiXQogICAgfTsKICAgIGZhUGludGVyZXN0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInBpbnRlcmVzdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMGQyIiwgIk01MDQgMjU2YzAgMTM3LTExMSAyNDgtMjQ4IDI0OC0yNS42IDAtNTAuMi0zLjktNzMuNC0xMS4xIDEwLjEtMTYuNSAyNS4yLTQzLjUgMzAuOC02NSAzLTExLjYgMTUuNC01OSAxNS40LTU5IDguMSAxNS40IDMxLjcgMjguNSA1Ni44IDI4LjUgNzQuOCAwIDEyOC43LTY4LjggMTI4LjctMTU0LjMgMC04MS45LTY2LjktMTQzLjItMTUyLjktMTQzLjItMTA3IDAtMTYzLjkgNzEuOC0xNjMuOSAxNTAuMSAwIDM2LjQgMTkuNCA4MS43IDUwLjMgOTYuMSA0LjcgMi4yIDcuMiAxLjIgOC4zLTMuMyAuOC0zLjQgNS0yMC4zIDYuOS0yOC4xIC42LTIuNSAuMy00LjctMS43LTcuMS0xMC4xLTEyLjUtMTguMy0zNS4zLTE4LjMtNTYuNiAwLTU0LjcgNDEuNC0xMDcuNiAxMTItMTA3LjYgNjAuOSAwIDEwMy42IDQxLjUgMTAzLjYgMTAwLjkgMCA2Ny4xLTMzLjkgMTEzLjYtNzggMTEzLjYtMjQuMyAwLTQyLjYtMjAuMS0zNi43LTQ0LjggNy0yOS41IDIwLjUtNjEuMyAyMC41LTgyLjYgMC0xOS0xMC4yLTM0LjktMzEuNC0zNC45LTI0LjkgMC00NC45IDI1LjctNDQuOSA2MC4yIDAgMjIgNy40IDM2LjggNy40IDM2LjhzLTI0LjUgMTAzLjgtMjkgMTIzLjJDMTYxLjUgNDM3LjIgMTYzLjUgNDY3LjQgMTY1LjYgNDg3IDczLjQgNDUwLjkgOCAzNjEuMSA4IDI1NiA4IDExOSAxMTkgOCAyNTYgOFM1MDQgMTE5IDUwNCAyNTZ6Il0KICAgIH07CiAgICBmYUFsZ29saWEgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYWxnb2xpYSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMzZjIiwgIk0yNTYgMGMtMTM5LjkgMC0yNTQgMTEyLjctMjU2IDI1Mi4xLTIgMTQxLjUgMTEyLjkgMjU4LjcgMjU0LjUgMjU5LjUgNDMuNyAuMyA4NS45LTEwLjQgMTIzLjMtMzAuNyAzLjYtMiA0LjItNyAxLjEtOS43bC0yNC0yMS4yYy00LjktNC4zLTExLjgtNS41LTE3LjgtMy0yNi4xIDExLjEtNTQuNSAxNi44LTgzLjcgMTYuNC0xMTQuNC0xLjUtMjA2LjktOTYuNi0yMDUuMS0yMTEgMS44LTExMi45IDk0LjMtMjA0LjIgMjA3LjctMjA0LjJsMjA3LjcgMCAwIDM2OS0xMTcuOC0xMDQuN2MtMy44LTMuNC05LjctMi43LTEyLjcgMS4zLTE4LjkgMjUtNDkuNyA0MC42LTgzLjkgMzguMi00Ny41LTMuMy04NS45LTQxLjUtODkuNS04OC45LTQuMi01Ni42IDQwLjYtMTAzLjkgOTYuMy0xMDMuOSA1MC40IDAgOTEuOSAzOC44IDk2LjIgODggLjQgNC40IDIuNCA4LjUgNS43IDExLjRsMzAuNyAyNy4yYzMuNSAzLjEgOSAxLjIgOS45LTMuNCAyLjItMTEuOCAzLTI0LjIgMi4xLTM2LjgtNC45LTcyLTYzLjMtMTMwLTEzNS40LTEzNC40LTgyLjctNS4xLTE1MS44IDU5LjUtMTU0IDE0MC42LTIuMSA3OC45IDYyLjYgMTQ3IDE0MS42IDE0OC43IDMzIC43IDYzLjYtOS42IDg4LjMtMjcuNkw0OTUgNTA5LjRjNi42IDUuOCAxNyAxLjIgMTctNy43bDAtNDkyYzAtNS40LTQuNC05LjctOS43LTkuN0wyNTYgMHoiXQogICAgfTsKICAgIGZhU3RhY2twYXRoID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInN0YWNrcGF0aCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmODQyIiwgIk0yNDQuNiAyMzIuNGMwIDguNS00LjMgMjAuNS0yMS4zIDIwLjVsLTE5LjYgMCAwLTQxLjUgMTkuNiAwYzE3LjEgMCAyMS4zIDEyLjQgMjEuMyAyMXpNNDQ4IDMybDAgNDQ4LTQ0OCAwIDAtNDQ4IDQ0OCAwek0xNTEuMyAyODcuOGMwLTIxLjItMTIuMS0zNC41LTQ2LjctNDQuOC0yMC42LTcuNC0yNi0xMC45LTI2LTE4LjZzNy0xNC42IDIwLjQtMTQuNmMxNC4xIDAgMjAuOCA4LjQgMjAuOCAxOC40bDMwLjcgMCAuMi0uNmMuNS0xOS42LTE1LjEtNDEuNi01MS4xLTQxLjYtMjMuNCAwLTUyLjYgMTAuOC01Mi42IDM4LjMgMCAxOS40IDkuMiAzMS4zIDUwLjcgNDQuNCAxNy4zIDYuMiAyMS45IDEwLjQgMjEuOSAxOS41IDAgMTUuMi0xOS4xIDE0LjItMTkuNSAxNC4yLTIwLjQgMC0yNS43LTkuMS0yNS43LTIxLjlsLTMwLjggMC0uMiAuNmMtLjcgMzEuMyAyOC40IDQ1LjIgNTYuNiA0NS4yIDMwIDAgNTEuMS0xMy42IDUxLjEtMzguM3ptMTI1LjQtNTUuNmMwLTI1LjMtMTguNC00NS41LTUzLjQtNDUuNWwtNTEuOCAwIDAgMTM4LjIgMzIuMiAwIDAtNDcuNCAxOS42IDBjMzAuMyAwIDUzLjQtMTYgNTMuNC00NS40ek0yOTcuOSAzMjVsNDkuMS0xMzguMi0zMS4xIDAtNDcuOSAxMzguMiAyOS45IDB6TTQwNC41IDE4Ni44bC0zMS4xIDAtNDcuOSAxMzguMiAyOS45IDAgNDkuMS0xMzguMnoiXQogICAgfTsKICAgIGZhT2N0b3B1c0RlcGxveSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJvY3RvcHVzLWRlcGxveSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMDgyIiwgIk00NTUuNyAzNDkuMmMtNDUuOS0zOS4xLTM2LjctNzcuOS0xNi4xLTEyOC4xIDM1LjctODctMjMuNS0xODYuOS0xMDkuNi0yMTIuOC05Mi45LTI3LjktMTk1LjcgMTYtMjMwLjMgMTA4LjgtOC43IDIzLjUtMTIuNSA0OC41LTExIDczLjUgMS43IDI5LjUgMTQuNyA1MyAyNC4xIDgwLjMgMTcuMiA1MC4yLTI4LjEgOTIuNy02Ni43IDExNy42LTQ2LjggMzAuMi0zNi4zIDM5LjktOC40IDQxLjkgMjMuNCAxLjcgNDQuNS00LjUgNjUuMy0xNSA5LjItNC42IDQwLjctMTguOSA0NS4xLTI4LjYtMTIuMiAyNi42LTM3IDcyLjctMjEuNSAxMDIuMSAxOS4xIDM2LjIgNjcuMS0zMS44IDc2LjctNDUuOCA4LjYtMTIuNiA0My04MS4zIDYzLjYtNDYuOSAxOC45IDMxLjQgOC42IDc2LjQgMzUuNyAxMDQuNiAzMi45IDM0LjIgNTEuMi0xOC4zIDUxLjQtNDQuMiAuMi0xNi40LTYuMS05NS45IDI5LjktNTkuOSAyMS40IDIxLjQgNTIuOSA3MS4yIDg4LjYgNjcgMzguNy00LjUtMjIuMS02OC0yOC4zLTc4LjcgNS40IDQuMyA1My43IDM0LjEgNTMuOCA5LjUgLjEtMTguOC0zMC4xLTM0LjctNDIuNS00NS4zeiJdCiAgICB9OwogICAgZmFZYW1tZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAieWFtbWVyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY4NDAiLCAiTTUwMC43IDE1OS41Yy0uNC0xLjgtMS4yLTMuNC0yLjMtNC44cy0yLjUtMi42LTQuMS0zLjVjLTMuMS0xLjYtNi43LTItMTAuMS0xLjFsLTI2LjQgNi42IDAtLjItMjIuMyA1LjgtMS4yIC4zLS42LTIuMmMtMTUuNS01OC4zLTQ1LTExMS45LTg2LjEtMTU2LjItMi42LTIuNy02LjEtNC4yLTkuOC00LjNzLTcuMyAxLjMtMTAgMy44bC0xMDIuOSAxMDIuNy0xOTkuOSAwYy02LjYgMC0xMi45IDIuNi0xNy42IDcuM1MwIDEyNC44IDAgMTMxLjRsMCAyNDlDMCAzODcgMi42IDM5My4zIDcuMyAzOThzMTEgNy4zIDE3LjYgNy4zTDIyNSA0MDUuMyAzMjguMSA1MDhjMi42IDIuNiA2IDQgOS43IDRzNy4xLTEuNCA5LjctNGMuMS0uMSAuMi0uMyAuNC0uNCAyOS4zLTMxLjUgNTIuOC02Ny44IDY5LjYtMTA3LjQgNi45LTE2LjUgMTIuNy0zMy41IDE3LjMtNTAuOGwwIDAgMjAuNCA1LjMgMC0uMSAyOC4zIDcuM2MuOSAuMiAxLjcgLjQgMi42IC41IDEuNCAuMiAyLjggLjIgNC4xLS4xIDIuNS0uNSA0LjgtMS43IDYuNy0zLjRzMy4yLTQgMy44LTYuNWMxNS4yLTYzLjQgMTUuMi0xMjkuNiAuMS0xOTNsMCAwek0zMzcuMSAyNC43bDAgMCAwIDAgMCAwek0yMjYuOSAxODkuOGwtNTIuNiA5MS4zYy0xIDEuNy0xLjUgMy43LTEuNSA1LjdsMCA0Ni4yYzAgNS44LTIuMyAxMS40LTYuNSAxNS42cy05LjcgNi40LTE1LjYgNi40bC0zLjQgMGMtNS44IDAtMTEuNC0yLjMtMTUuNi02LjRzLTYuNS05LjctNi41LTE1LjZsMC00NS43YzAtMS45LS41LTMuOC0xLjQtNS41TDcyLjMgMTg5LjZjLTEuOS0zLjQtMi44LTcuMS0yLjgtMTFzMS4xLTcuNiAzLTEwLjkgNC43LTYuMSA4LjEtOCA3LjEtMi45IDExLTIuOWwzLjMgMGM0IDAgOCAxLjEgMTEuNSAzLjJzNi4zIDUuMSA4LjEgOC43bDM2LjQgNzAuMyAzNy41LTcwLjVjMS44LTMuNSA0LjYtNi40IDcuOS04LjRzNy4yLTMuMiAxMS4xLTMuMiA3LjggLjkgMTEuMiAyLjggNi4zIDQuNyA4LjIgOC4xYzIgMy4zIDMgNy4xIDMgMTFzLTEgNy43LTMgMTFsMCAwek0zMzcuMSAyNC43YzM1LjkgNDAuNiA2MS45IDg5IDc1LjggMTQxLjNsLjYgMi0xMTQuMSAyOS42IDAtNjYuMWMwLTYuNi0yLjctMTIuOS03LjMtMTcuNnMtMTEtNy4zLTE3LjYtNy4zbC0xOS40IDAgODIuMS04MS44ek0zOTcuNiAzOTJsMCAwIDAgMGMtMTQuNyAzNC44LTM1LjEgNjctNjAuMiA5NS4ybC04Mi4yLTgxLjkgMTkuMiAwYzYuNiAwIDEyLjktMi42IDE3LjYtNy4zczcuMy0xMSA3LjMtMTcuNmwwLTY2LjIgMTE0LjYgMjkuOWMtNC40IDE2LjMtOS44IDMyLjMtMTYuMyA0Ny45bDAgMHptODQtNTIuNGwwIDAtNTAuNi0xMy4xLTEzMS43LTM0LjMgMC03Mi41IDExOS43LTMxIDQuNS0xLjJjMjkuOS03LjcgNDkuMi0xMi44IDU4LjEtMTUuMSAxMiA1NS4xIDEyIDExMi4xIDAgMTY3LjJ6Il0KICAgIH07CiAgICBmYU1vZHggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibW9keCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMjg1IiwgIk0zNTYgMjQxLjhsMzYuNyAyMy43IDAgMjE0LjUtMTMzLTgzLjggOTYuMy0xNTQuNHpNNDQwIDc1bC0yMTMuNyAwLTIzIDM3LjggMTUzLjUgOTYuNSA4My4yLTEzNC4zek0zNTEgMjE3LjhsLTI5NS44LTE4NS44IDAgMjE0LjUgNDYgMjkgMjQ5LjgtNTcuN3pNOTcgMjk0LjJMOCA0MzcgMjIxLjcgNDM3IDM0Ni43IDIzNi41IDk3IDI5NC4yeiJdCiAgICB9OwogICAgZmFTcXVhcmVUaHJlYWRzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS10aHJlYWRzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU2MTkiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6TTI5NC4yIDI0NC4zYzE5LjUgOS4zIDMzLjcgMjMuNSA0MS4yIDQwLjkgMTAuNCAyNC4zIDExLjQgNjMuOS0yMC4yIDk1LjQtMjQuMiAyNC4xLTUzLjUgMzUtOTUuMSAzNS4zbC0uMiAwYy00Ni44LS4zLTgyLjgtMTYuMS0xMDYuOS00Ni44LTIxLjUtMjcuMy0zMi42LTY1LjQtMzMtMTEzLjFsMC0uMmMuNC00Ny43IDExLjUtODUuNyAzMy0xMTMuMSAyNC4yLTMwLjcgNjAuMi00Ni41IDEwNi45LTQ2LjhsLjIgMGM0Ni45IC4zIDgzLjMgMTYgMTA4LjIgNDYuNiAxMi4zIDE1LjEgMjEuMyAzMy4zIDI3IDU0LjRsLTI2LjkgNy4yYy00LjctMTcuMi0xMS45LTMxLjktMjEuNC00My42LTE5LjQtMjMuOS00OC43LTM2LjEtODctMzYuNC0zOCAuMy02Ni44IDEyLjUtODUuNSAzNi4yLTE3LjUgMjIuMy0yNi42IDU0LjQtMjYuOSA5NS41IC4zIDQxLjEgOS40IDczLjMgMjYuOSA5NS41IDE4LjcgMjMuOCA0Ny40IDM2IDg1LjUgMzYuMiAzNC4zLS4zIDU2LjktOC40IDc1LjgtMjcuMyAyMS41LTIxLjUgMjEuMS00Ny45IDE0LjItNjQtNC05LjQtMTEuNC0xNy4zLTIxLjMtMjMuMy0yLjQgMTgtNy45IDMyLjItMTYuNSA0My4yLTExLjQgMTQuNS0yNy43IDIyLjQtNDguNCAyMy41LTE1LjcgLjktMzAuOC0yLjktNDIuNi0xMC43LTEzLjktOS4yLTIyLTIzLjItMjIuOS0zOS41LTEuNy0zMi4yIDIzLjgtNTUuMyA2My41LTU3LjYgMTQuMS0uOCAyNy4zLS4yIDM5LjUgMS45LTEuNi05LjktNC45LTE3LjctOS44LTIzLjQtNi43LTcuOC0xNy4xLTExLjgtMzAuOC0xMS45bC0uNCAwYy0xMSAwLTI2IDMuMS0zNS42IDE3LjZsLTIzLTE1LjhjMTIuOC0xOS40IDMzLjYtMzAuMSA1OC41LTMwLjFsLjYgMGM0MS44IC4zIDY2LjYgMjYuMyA2OS4xIDcxLjggMS40IC42IDIuOCAxLjIgNC4yIDEuOWwuMSAuNXptLTcxLjggNjcuNWMxNy0uOSAzNi40LTcuNiAzOS43LTQ4LjgtOC44LTEuOS0xOC42LTIuOS0yOS0yLjktMy4yIDAtNi40IC4xLTkuNiAuMy0yOC42IDEuNi0zOC4xIDE1LjUtMzcuNCAyNy45IC45IDE2LjcgMTkgMjQuNSAzNi40IDIzLjZsLS4xLS4xeiJdCiAgICB9OwogICAgZmFPbGRSZXB1YmxpYyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJvbGQtcmVwdWJsaWMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjUxMCIsICJNMjQzLjggMTAuMmM3LjUtLjMgMTUtLjMgMjIuNS0uMSAzLjYgLjEgNy4yIC40IDEwLjggLjcgNC45IC4zIDkuOCAxIDE0LjcgMS42IDIuOSAuNCA1LjggMSA4LjcgMS41IDcuOSAxLjMgMTUuNyAzLjMgMjMuNCA1LjQgMTIuMiAzLjUgMjQuMiA3LjkgMzUuOCAxMy4yIDI2LjYgMTIuMiA1MC45IDI5LjIgNzEuNiA0OS45IDIwIDIwLjEgMzYuNyA0My41IDQ4LjkgNjkuMiAxLjEgMi42IDIuNCA1LjEgMy41IDcuNyAyLjggNi40IDUuNCAxMyA3LjYgMTkuNiA0LjEgMTIuMyA3LjMgMjUgOS40IDM3LjggLjYgMy4xIDEgNi4zIDEuNCA5LjUgLjUgMy44IC45IDcuNyAxLjIgMTEuNiAuOCA4LjMgLjggMTYuNyAuOCAyNS4xLS4xIDUtLjMgOS45LS43IDE0LjktLjIgMy40LS41IDYuOC0xIDEwLjEtLjQgMi43LS42IDUuNS0xLjEgOC4yLS45IDUuMS0xLjcgMTAuMy0yLjkgMTUuNC00LjEgMTguNS0xMC4zIDM2LjYtMTguNSA1My42LTE1LjggMzIuOC0zOC44IDYyLjItNjcuMSA4NS4xLTE3LjMgMTQuMS0zNi40IDI1LjktNTYuOSAzNC45LTYuMiAyLjctMTIuNSA1LjMtMTguOSA3LjQtMy41IDEuMi03IDIuNC0xMC42IDMuNC02LjYgMS45LTEzLjMgMy42LTIwIDUtNC43IC45LTkuMyAxLjctMTQgMi41LTUuMyAuNy0xMC41IDEuNC0xNS44IDEuNy02LjcgLjctMTMuNCAuOC0yMC4xIC44LTYuOCAwLTEzLjYtLjEtMjAuNC0uOC0zLjMtLjItNi42LS41LTkuOC0xLTIuNy0uNC01LjUtLjYtOC4yLTEuMS00LjEtLjctOC4yLTEuNC0xMi40LTIuMi00LjItLjktOC41LTEuOS0xMi43LTMtOC42LTIuMi0xNy4xLTUtMjUuNC04LjEtMTAuNS00LjEtMjAuOC04LjctMzAuNi0xNC4yLTIuMS0xLjItNC4zLTIuMy02LjQtMy42LTExLjItNi42LTIxLjktMTQuMS0zMS45LTIyLjMtMzQuNy0yOC40LTYxLjQtNjYuNC03Ni40LTEwOC43LTMuMS04LjctNS43LTE3LjYtNy44LTI2LjctMS41LTYuMi0yLjUtMTIuNC0zLjYtMTguNy0uNC0yLjMtLjYtNC43LTEtNy4xLS42LTQtLjgtOC0xLjItMTEuOS0uOC05LjUtLjctMTktLjUtMjguNSAuMS0zLjUgLjMtNyAuNy0xMC41IC4zLTMuMiAuNS02LjQgLjktOS41IC40LTIuOCAuNy01LjYgMS4yLTguNCAuNy0zLjkgMS4zLTcuOSAyLjEtMTEuOCAzLjQtMTYuNSA4LjUtMzIuNyAxNS4zLTQ4LjIgMS4yLTIuOSAyLjYtNS43IDMuOS04LjYgOC4xLTE2LjcgMTcuOS0zMi42IDI5LjUtNDcuMSAyMC0yNS40IDQ1LjEtNDYuNyA3My4zLTYyLjUgNy41LTQuMiAxNS4yLTggMjMuMS0xMS40IDE1LjgtNi45IDMyLjQtMTIgNDkuMy0xNS40IDMuNS0uNyA3LTEuMiAxMC42LTEuOCAyLjYtLjUgNS4zLS43IDcuOS0xLjEgMy41LS41IDcuMS0uNyAxMC42LTEgMi41LS4yIDQuOS0uNCA3LjQtLjV6bTguNiAyNC40Yy05LjIgLjEtMTguNCAxLTI3LjYgMi4yLTcuMyAxLjEtMTQuNSAyLjYtMjEuNyA0LjMtMTMuOSAzLjUtMjcuNSA4LjMtNDAuNSAxNC40LTEwLjUgNS0yMC42IDEwLjctMzAuMiAxNy4yLTQuMiAyLjktOC40IDUuOC0xMi4zIDktNS4xIDQtMTAgOC4yLTE0LjcgMTIuNi0yLjUgMi4yLTQuOCA0LjctNy4yIDcuMS0yOC4yIDI4LjgtNDguNCA2NS40LTU3LjUgMTA0LjctMiA4LjQtMy41IDE3LTQuNCAyNS42LTEuMSA4LjktMS40IDE3LjktMS40IDI2LjggLjEgNy4xIC40IDE0LjMgMS4yIDIxLjQgLjYgNy4xIDEuOSAxNC4yIDMuMiAyMS4yIDEuMSA0LjYgMiA5LjMgMy4zIDEzLjkgNi4zIDIzLjQgMTYuNSA0NS43IDMwLjEgNjUuOCA4LjYgMTMgMTguOCAyNC45IDMwIDM1LjggMTYuMyAxNS44IDM1IDI5IDU1LjMgMzkuMiA3LjMgMy41IDE0LjcgNi45IDIyLjMgOS42IDUgMS44IDEwLjEgMy42IDE1LjIgNSAxMS4zIDMuMiAyMi44IDUuNiAzNC40IDcuMSAyLjkgLjMgNS44IC42IDguNyAuOSAxMy44IDEuMSAyNy43IDEgNDEuNS0uNCA0LjQtLjYgOC45LTEgMTMuMy0xLjggMy42LS43IDcuMy0xLjIgMTAuOS0yLjEgNC4xLTEgOC4zLTEuOSAxMi40LTMuMSAyNi41LTcuMyA1MS42LTE5LjcgNzMuNi0zNi4yIDE1LjgtMTEuOCAzMC0yNS44IDQyLjEtNDEuMyAzLjMtNCA2LjItOC4zIDkuMS0xMi42IDMuNC01LjEgNi42LTEwLjIgOS42LTE1LjUgMi40LTQuNCA0LjctOC45IDctMTMuNCA1LjctMTIuMSAxMC4zLTI0LjYgMTMuOC0zNy41IDIuNi0xMCA0LjctMjAuMiA1LjktMzAuNCAxLjgtMTMuNSAxLjktMjcuMSAxLjMtNDAuNy0uMy0zLjktLjctNy44LTEtMTEuNy0yLjItMTkuMS02LjgtMzcuOS0xMy44LTU1LjgtNi0xNS4xLTEzLjUtMjkuNi0yMi42LTQzLjEtMTIuNy0xOC44LTI4LjItMzUuNy00Ni00OS44LTI1LTIwLTU0LjUtMzQuNS04NS42LTQyLjEtNy44LTEuOS0xNS43LTMuMy0yMy42LTQuNC0zLjktLjYtNy44LS44LTExLjgtMS4yLTcuNC0uNi0xNC44LS43LTIyLjItLjZ6TTE0Ny4zIDgzLjVjMTMuMy04LjkgMjguMS0xNS40IDQzLjMtMjAuMi0zLjIgMS44LTYuNCAzLjQtOS41IDUuMy0xMS4yIDYuNy0yMS41IDE0LjktMzAuNCAyNC41LTYuOCA3LjQtMTIuOCAxNS43LTE3IDI0LjktMy4zIDYuOS01LjYgMTQuMi02LjkgMjEuNy0uOSA0LjgtMS4zIDkuOC0xLjIgMTQuOCAuMSAxMy43IDQuNCAyNy4xIDExLjMgMzguOCA1LjkgMTAuMiAxMy42IDE5LjMgMjIuNCAyNy4zIDQuOSA0LjQgMTAuMiA4LjEgMTUgMTIuNiAyLjMgMi4yIDQuNSA0LjQgNi40IDYuOSAyLjYgMy4zIDQuOSA3IDYgMTEuMSAuOSAzIC43IDYuMiAuNyA5LjMgMCA0LjEgMCA4LjIgMCAxMi4zIC4xIDMuNSAwIDcuMSAuMSAxMC42IC4xIDIuNCAwIDQuOCAuMSA3LjEgLjIgNS44IC4xIDExLjUgLjEgMTcuMyAuMSAyLjkgMCA1LjggLjEgOC43IDAgMS42IC4xIDMuMyAwIDQuOS0uOSAuMS0xLjggLjItMi43IC4yLTExIDAtMjEuOS0yLjYtMzItNi45LTYtMi43LTExLjgtNS45LTE3LjEtOS44LTUuOC00LjItMTEuMS05LTE1LjgtMTQuMy02LjUtNy4yLTEyLTE1LjQtMTYuNi0yMy45LTEuMS0yLTIuMi00LTMuMi02LjEtMS4yLTIuNi0yLjYtNS4xLTMuNy03LjgtNC05LjctNi42LTE5LjktOC4xLTMwLjMtLjUtNC40LTEuMS04LjktMS4yLTEzLjMtLjctMTUuNyAuOC0zMS42IDQuNy00Ni44IDIuMS04LjIgNC44LTE2LjIgOC4zLTIzLjggNi4zLTE0LjIgMTUuMy0yNy4yIDI2LjMtMzguMiA2LjMtNi4yIDEzLjEtMTEuOCAyMC41LTE2Ljd6TTMyMi43IDYzLjRjMi43IC43IDUuNCAxLjcgOC4xIDIuNyA2LjQgMi4zIDEyLjcgNC44IDE4LjcgOCAxMy4xIDYuNCAyNS4zIDE0LjggMzUuOCAyNSAxMC4yIDEwIDE4LjcgMjEuNiAyNS4xIDM0LjMgMS4zIDIuNyAyLjYgNS41IDMuOCA4LjMgNi4zIDE1LjEgMTAgMzEuMyAxMS4yIDQ3LjYgLjQgNC41IC40IDkuMSAuNSAxMy42IC4xIDExLjYtMS41IDIzLjMtNC4zIDM0LjUtMiA3LjMtNC4zIDE0LjUtNy45IDIxLjItMy4yIDYuNi02LjcgMTMuMi0xMC44IDE5LjItNi45IDEwLjUtMTUuNiAxOS45LTI1LjggMjcuMi0xMC41IDcuNi0yMi42IDEzLTM1LjQgMTUuNC0zLjUgLjctNy4xIDEuMS0xMC43IDEuMi0xLjggLjEtMy43IC4yLTUuNi0uMS0uMy0yLjEgMC00LjMgMC02LjUgMC0zLjcgLjEtNy40IC4xLTExLjIgLjItNyAwLTE0LjEgLjItMjEuMSAwLTIuNCAwLTQuOCAwLTcuMSAuMi01LjEgMC0xMC4xIC4xLTE1LjIgLjEtMy0uMi02IC41LTkgLjctMi41IDEuOC00LjkgMy4xLTcuMSA0LjUtNy4zIDExLjEtMTMgMTcuNy0xOC4zIDUuNC00LjIgMTAuNS04LjggMTUtMTMuOCA3LjctOC40IDE0LjItMTcuOSAxOC44LTI4LjMgMi41LTUuOSA0LjUtMTIuMSA1LjUtMTguNSAuOS00LjQgMS4xLTguOCAxLTEzLjMgMC03LjgtMS40LTE1LjYtMy42LTIzLjItMS44LTUuNy00LjMtMTEuMi03LjEtMTYuNC0zLjktNi45LTguNi0xMy4zLTE0LTE5LjItOS45LTEwLjgtMjEuOC0xOS45LTM0LjYtMjcuMS0xLjgtMS0zLjgtMS44LTUuNi0zek0yMjEuOSAxMjEuOWMxLTEuMiAyLTIuMyAzLjEtMy40LS42IC45LTEuMyAxLjgtMiAyLjctMy4xIDMuOS01LjUgOC4zLTcgMTMuMS0uOSAzLjMtMS43IDYuNi0xLjcgMTAtLjEgMi41LS4xIDUuMSAuMyA3LjYgMS4xIDcuNiA0LjMgMTQuOSA4LjggMjEuMSAyIDIuNyA0LjIgNS4zIDYuOSA3LjMgMS42IDEuMyAzLjUgMi4xIDUuMyAzIDMuMSAxLjcgNi4zIDMuMiA5LjEgNS41IDIuNyAyLjEgNC42IDUuMyA0LjQgOC44IDAgNzMuNyAwIDE0Ny4zIDAgMjIxIDAgMS40LS4xIDIuNyAwIDQgLjEgMS41IC44IDIuOCAxLjUgNC4xIC45IDEuNyAxLjggMy4zIDMuMiA0LjYgLjkgLjggMiAxLjQgMy4yIDEuMiAxLjUtLjIgMi43LTEuNCAzLjQtMi42IDEtMS41IDEuNy0zLjIgMi4zLTQuOSAuOC0yLjEgLjQtNC40IC41LTYuNiAuMS00IDAtOC4xIC4xLTEyLjEgMC01LjkgMC0xMS44IC4xLTE3LjcgLjEtMy42IDAtNy4yIC4xLTEwLjkgLjItNCAwLTguMSAuMS0xMi4xIDAtNiAwLTEyIC4xLTE4IC4xLTMuNiAwLTcuMiAuMS0xMC45IC4xLTMuOSAwLTcuOSAuMS0xMS44IDAtNiAwLTEyIC4xLTE4IC4yLTMuOSAwLTcuOSAuMi0xMS44IC4zIDEuNCAuMSAyLjkgLjIgNC40IC4yIDMuNiAuNCA3LjIgLjggMTAuOCAuMyAzLjQgLjQgNi45IC45IDEwLjMgLjQgMy4xIC41IDYuMiAxIDkuMyAuNiA0LjEgLjkgOC4yIDEuNSAxMi4zIDEuNSA5IDIuOCAxOC4xIDUuMSAyNyAxLjEgNC44IDIuNCA5LjYgNCAxNC4zIDIuNSA3LjkgNS43IDE1LjcgMTAuMyAyMi42IDEuNyAyLjYgMy45IDUgNi4xIDcuMiAuMyAuMiAuNiAuNSAuOSAuNyAuNiAuMyAxLjMtLjEgMS43LS42IC43LS45IDEuMi0xLjkgMS43LTIuOSA0LjEtNy44IDguMi0xNS42IDEyLjMtMjMuMyAuNy0xLjMgMS40LTIuNiAyLjYtMy42IDEuOC0xLjYgMy44LTIuNyA2LTMuNiAyLjktMS4yIDUuOS0yLjIgOS0yLjQgNi42LS42IDEzLjEgLjcgMTkuNiAxLjggMy43IC42IDcuNCAxLjIgMTEuMSAxLjQgMy43IC4xIDcuNSAuMSAxMS4yLS4zIDguNi0uOSAxNy0zIDI0LjktNi4yIDUuMy0yLjIgMTAuNS00LjggMTUuMy03LjkgMTEuNS03LjIgMjEuNS0xNi42IDMwLTI3IDEuMi0xLjQgMi4yLTIuOSAzLjUtNC4zLTEuMiAzLjItMi43IDYuNC00LjIgOS41LTEuMyAyLjktMi44IDUuNi00LjMgOC40LTUuMiA5LjYtMTEgMTguOS0xNy44IDI3LjUtNCA1LjItOC41IDEwLjEtMTMuMyAxNC42LTYuNiA2LjEtMTQuMSAxMS40LTIyLjQgMTQuOC04LjIgMy40LTE3LjMgNC42LTI2LjEgMy4zLTMuNi0uNi03LTEuNy0xMC40LTIuOS0yLjgtMS01LjQtMi40LTgtMy43LTMuNC0xLjctNi42LTMuOC05LjctNi4xIDIuNyAzLjEgNS43IDUuOSA4LjcgOC42IDQuMyAzLjggOC43IDcuMyAxMy42IDEwLjIgNCAyLjUgOC4zIDQuNCAxMi44IDUuNSAxLjUgLjQgMyAuNSA0LjUgLjYtMS4zIDEuMS0yLjYgMi00IDMtOS42IDYuNS0yMCAxMS45LTMwLjcgMTYuNC0yMC45IDguNy00My4yIDE0LTY1LjcgMTUuMy00LjcgLjItOS4zIC40LTE0IC40LTUtLjEtMTAtLjEtMTQuOS0uNy0xMS4yLS44LTIyLjMtMi43LTMzLjItNS40LTEwLjQtMi43LTIwLjYtNi4xLTMwLjMtMTAuNi04LjctMy45LTE3LjEtOC40LTI1LTEzLjgtMS44LTEuMy0zLjctMi41LTUuNC00LjEgNi42LTEuMiAxMy0zLjQgMTktNi41IDUuNy0yLjkgMTEtNi43IDE1LjYtMTEuMSAyLjItMi4yIDQuMy00LjYgNi4yLTcuMS0zLjQgMi4xLTYuOSA0LjItMTAuNiA1LjgtNC40IDIuMi05LjEgMy44LTEzLjggNS01LjcgMS41LTExLjcgMS43LTE3LjYgMS4xLTguMS0xLTE1LjktNC4zLTIyLjUtOS00LjMtMi45LTguMi02LjQtMTItMTAuMS05LjktMTAuMi0xOC4yLTIxLjgtMjUuNy0zMy45LTMuOS02LjMtNy41LTEyLjctMTEuMS0xOS4yLTEtMi0yLjEtNC4xLTMuMi02LjEgMi44IDIuOSA1LjYgNiA4LjQgOC45IDE5LjIgMTkuMiAzNy42IDMyLjMgNTMuNyAzNS41IDMuMSAuNyA2LjMgLjUgOS41IC44IDIuOCAuMyA1LjYgLjIgOC4zIC4zIDUgLjEgMTAuMSAwIDE1LjItLjIgMy42LS4yIDcuMy0uNyAxMC45LTEuMSAyLjEtLjIgNC4xLS43IDYuMS0xLjIgMy45LTEgOC4xLTEgMTEuOCAuNiA0LjggMS44IDguNCA1LjYgMTEuNCA5LjcgMi4yIDMgNC4xIDYuMiA1LjcgOS42IDEuMiAyLjQgMi41IDQuOCAzLjYgNy4zIDEgMi4yIDIuMiA0LjQgMy40IDYuNSAuNyAxIDEuNCAyLjIgMi42IDIuNiAxLjEtLjggMS43LTEuOSAyLjMtMyAyLjEtNC4yIDMuNC04LjYgNC45LTEzIDItNi42IDMuOC0xMy4zIDUuMi0yMCAyLjItOS4zIDMuMi0xOC43IDQuNS0yOC4xIC42LTQgLjgtOCAxLjMtMTIgLjktMTAuNiAxLjktMjEuMyAyLjItMzEuOSAuMS0xLjkgLjItMy43IC4zLTUuNiAwLTQuMyAuMi04LjcgLjItMTMgMC0yLjQgMC00LjggMC03LjEgMC01LjEtLjItMTAuMS0uMi0xNS4yLS4yLTYuNi0uNy0xMy4yLTEuMy0xOS44LS43LTUuOS0xLjUtMTEuOC0zLjEtMTcuNS0yLTcuNy01LjYtMTUtOS44LTIxLjgtMy4yLTUuMS02LjgtOS45LTExLjEtMTQtMy45LTMuOS04LjYtNy4xLTEzLjktOC40LTEuNS0uNC0zLjEtLjQtNC42LS42IC4xLTMgLjctNS45IDEuMy04LjggMS42LTcuNyAzLjgtMTUuMyA2LjgtMjIuNiAxLjUtNCAzLjQtNy45IDUuNC0xMS43IDMuNC02LjYgNy42LTEyLjggMTIuNS0xOC41em0zMS4zIDEuN2MuNC0uMSAuNy0uMSAxLjEtLjIgLjIgMS44IC4xIDMuNiAuMSA1LjRsMCAzOC4xYzAgMS43IC4xIDMuNS0uMiA1LjItLjQgMC0uNyAwLTEuMSAwLS45LTMuOC0xLjctNy42LTIuNi0xMS4zLS40LTEuNS0uNi0zLjEtMS4xLTQuNi0xLjctLjItMy40LS4yLTUuMi0uMi01LjEgMC0xMC4xIDAtMTUuMiAwLTEuNyAwLTMuMyAuMS01IDAgMC0uNC0uMy0uOSAuMi0xLjIgMS4zLS43IDIuNy0uOSA0LjEtMS40IDMuNC0xLjEgNi45LTIuMiAxMC4zLTMuMyAxLjQtLjUgMi45LS43IDQuMi0xLjUgMC0uNiAwLTEuMSAwLTEuNy0xLjItLjYtMi41LS45LTMuOC0xLjMtMy4xLTEtNi4zLTItOS40LTMtMS44LS42LTMuNy0xLTUuNC0xLjggMC0uNC0uMS0uNy0uMS0xLjEgNS4xLS4yIDEwLjIgLjEgMTUuMy0uMSAzLjQtLjEgNi43IC4xIDEwLjEtLjEgLjEtLjQgLjMtLjggLjQtMS4yIDEuMS00LjkgMi4zLTkuOCAzLjQtMTQuN3ptNi0uMmMuNCAwIC43IC4xIDEuMSAuMiAxIDMuOCAxLjcgNy44IDIuNyAxMS42IC40IDEuNCAuNiAyLjkgMSA0LjMgMi41IC4yIDUuMSAwIDcuNiAwIDUuMiAuMSAxMC4zIC4xIDE1LjUgLjEgLjggMCAxLjUgMCAyLjMgLjEgMCAuNC0uMSAuNy0uMSAxLjEtMS44IC44LTMuOCAxLjItNS43IDEuOS0zLjcgMS4yLTcuNSAyLjQtMTEuMiAzLjYtLjYgLjItMS4xIC40LTEuNyAuNi0uMiAuNi0uMiAxLjEtLjEgMS43IC45IC41IDEuOCAuOCAyLjggMS4xIDQuOSAxLjUgOS43IDMuMSAxNC42IDQuNiAuNCAuMSAuOCAuMyAxLjEgLjUgLjQgLjMgLjIgLjggLjIgMS4yLTEuNyAuMS0zLjMgMC01IDAtNS4yIDAtMTAuMyAwLTE1LjUgMC0xLjYgMC0zLjIgMC00LjggLjItLjUgMS43LS43IDMuNC0xLjIgNS4xLS45IDMuNi0xLjUgNy4yLTIuNSAxMC44LS40IDAtLjcgMC0xLjEgLjEtLjMtMS43LS4yLTMuNS0uMi01LjJsMC0zOC4xYzAtMS44LS4xLTMuNiAuMS01LjR6bS0xODYgNDVjMS4xLTIuMiAyLjEtNC40IDMuNC02LjUtMS44IDcuNi0yLjkgMTUuMy0zLjYgMjMtLjggNy43LS44IDE1LjUtLjUgMjMuMiAxLjEgMTkuOSA1LjUgMzkuOCAxNC4yIDU3LjkgMyA2IDYuNCAxMS44IDEwLjUgMTcuMSA2LjEgNy41IDEyLjUgMTQuOCAxOS44IDIxLjEgNC44IDQuMSAxMCA3LjggMTUuNSAxMC44IDMuMyAxLjcgNi41IDMuNCA5LjkgNC43IDUgMiAxMC4yIDMuNiAxNS40IDQuOSAzLjggMSA3LjggMS40IDExLjUgMi43IDUgMS42IDkuNSA0LjYgMTMgOC40IDQuOSA1LjIgOC4xIDExLjkgMTAuMiAxOC43IDEgMi45IDEuNiA1LjkgMi4yIDguOSAuMiAuOCAuMiAxLjUgLjIgMi4zLTYuNSAyLjgtMTMuMyA1LjEtMjAuMyA2LjItNC4xIC44LTguMyAxLTEyLjUgMS4xLTEwLjIgLjItMjAuNS0xLjgtMzAuMS01LjEtMy43LTEuNC03LjUtMi45LTExLTQuNy04LjEtMy44LTE1LjYtOC43LTIyLjUtMTQuNS0yLjktMi42LTUuOC01LjEtOC40LTgtOS4yLTkuOC0xNi4zLTIxLjQtMjEuOC0zMy43LTIuNC01LjUtNC42LTExLjItNi40LTE3LTEuMi0zLjktMi40LTcuOS0zLjMtMTEuOS0uNy0yLjktMS4yLTUuOS0xLjktOC45LS41LTIuMS0uNy00LjMtMS02LjUtLjgtNS40LTEuMy0xMC45LTEuMy0xNi40IC4xLTYuMiAuMi0xMi40IDEuMS0xOC41IC40LTIuOSAuNy01LjcgMS4yLTguNiAxLTUuNyAyLjEtMTEuNCAzLjctMTYuOSAzLjEtMTEuNiA3LjUtMjMgMTIuNy0zMy44em0zNjMuNy02LjRjMS4xIDEuNyAxLjkgMy41IDIuOCA1LjMgMi4xIDQuNSA0LjIgOC45IDYgMTMuNSA3LjYgMTguOCAxMi4zIDM4LjggMTMgNTkgMCAxLjggLjEgMy41IC4xIDUuMyAuMSA5LjYtMS4zIDE5LjEtMy4yIDI4LjUtLjcgMy42LTEuNSA3LjItMi42IDEwLjctNCAxNC43LTEwIDI5LTE4LjQgNDEuOC04LjIgMTIuNi0xOSAyMy41LTMxLjggMzEuNC01LjcgMy42LTExLjggNi42LTE4IDkuMi01LjggMi4yLTExLjcgNC0xNy44IDUuMS02LjQgMS0xMi45IDEuNS0xOS40IDEuMi03LjktLjUtMTUuOC0yLjEtMjMuMi00LjgtMS45LS44LTMuOS0xLjUtNS44LTIuMy0uMi0xLjUgLjItMyAuNS00LjUgMS4yLTUuNyAzLTExLjQgNS43LTE2LjYgMi40LTQuNSA1LjUtOC43IDkuNS0xMS45IDIuNC0yLjEgNS4yLTMuNiA4LjItNC44IDMuNi0xLjUgNy41LTIgMTEuMi0yLjggNy4yLTEuNyAxNC40LTMuOSAyMS4yLTcgMTAuMy00LjcgMTkuNy0xMS40IDI3LjYtMTkuNSAxLjYtMS42IDMuMi0zLjIgNC43LTQuOSAzLjQtMy44IDYuNy03LjYgOS44LTExLjUgNy41LTEwLjEgMTIuOC0yMS42IDE2LjctMzMuNSAxLjYtNS4zIDMuMi0xMC42IDQuMi0xNi4xIC42LTIuOSAxLTUuOCAxLjUtOC43IC45LTYuMSAxLjYtMTIuMiAxLjctMTguNCAuMS02LjYgLjEtMTMuMy0uNS0xOS45LS43LTgtMS45LTE2LTMuNy0yMy44eiJdCiAgICB9OwogICAgZmFTdXNlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInN1c2UiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjdkNiIsICJNNjA0LjUgMjEwYTEwLjQgMTAuNCAwIDEgMSAtMTEuNC0xNy40IDEwLjQgMTAuNCAwIDEgMSAxMS40IDE3LjR6TTYyMSAxODcuMmEzOC41IDM4LjUgMCAxIDEgLTc1IDE3LjYgMzguNSAzOC41IDAgMSAxIDc1LTE3LjZ6TTQzMy43IDMzNi43YzMuMiA0LjYgNS44IDkgNy4zIDEzLjQgMSAzLjEgMi40IDcuMyA1LjUgOC45IC4yIC4xIC4zIC4yIC41IC4yIDUuNyAyLjEgMjAuMyAxLjcgMjAuMyAxLjdsMjYuOCAwYzIuMyAwIDIyLjQgMCAyMS45LTIuMy0yLjQtMTAuOC0xNC45LTEyLjctMjQuNC0xOC4zLTguNy01LjItMTctMTEuMS0yMC44LTIxLjMtMi01LjItLjgtMTcuNCAyLjYtMjEuOCAyLjUtMy4yIDYuMS01LjMgMTAtNi4yIDQuMy0uOSA4LjgtLjEgMTMuMSAuMyA1LjMgLjUgMTAuNiAxLjUgMTUuOSAyLjIgMTAuMyAxLjMgMjAuNiAxLjkgMzEgMS42IDE3LjEtLjUgMzQuMi0zLjIgNTAuNC04LjcgMTEuMy0zLjggMjIuNC04LjkgMzItMTYuMSAxMC45LTguMSA4LjEtNy40LTMtNi4yLTEzLjMgMS40LTI2LjYgMS42LTM5LjkgLjgtMTIuNC0uNy0yNC43LTIuMi0zNS45LTcuOS04LjgtNC42LTE2LjQtOS4xLTIzLjQtMTYuMi0xLTEuMS0xLjctNC4yIC4yLTYuMiAxLjktMS45IDUuOC0uOCA3IC4yIDEyLjIgMTAuMiAzMC41IDE4LjYgNDkuMyAxOS41IDEwLjIgLjUgMjAuMSAuNyAzMC40IC4zIDUuMS0uMiAxMi44LS4yIDE3LjktLjMgMi42IDAgOS44IC43IDExLjItMi4xIC40LS44IC40LTEuOCAuMy0yLjctMS41LTQwLjktNC41LTg2LjktNDcuMy0xMDYuNS0zMS45LTE0LjYtNzkuNy0zNy4yLTk5LjktNDYuNi00LjctMi4yLTEwLjIgMS4zLTEwLjIgNi41IDAgMTMuNiAuNyAzMy4zIC43IDUxLjEtOS43LTkuOS0yNi0xNi4xLTM4LjQtMjEuOC0xNC4xLTYuNS0yOC43LTEyLTQzLjUtMTYuNi0yOS44LTkuMi02MC43LTE0LjktOTEuNy0xOC0zNS4yLTMuNS03MS0xLjgtMTA1LjcgNS4zLTU2LjkgMTIuMi0xMTMuMSAzOS43LTE1NS43IDc5LjgtMjYuMSAyNC42LTQ2LjYgNTkuNy00OCA5NS4yLTIgNTAuMyAxMi4xIDc3LjMgMzggMTA1LjIgNDEuMyA0NC40IDEzMC4yIDUwLjYgMTY2LjItMiAxNi4yLTIzLjcgMTkuNy01NS44IDgtODItMTEuOC0yNi4yLTM4LjgtNDUuMS02Ny40LTQ2LTIyLjItLjctNDUuOSAxMC42LTU0LjUgMzEuMS02LjUgMTUuNy0yLjggMzUuMSA5IDQ3LjMgNC42IDQuOCAxMC45IDguNyAxNy43IDcuMSA0LS45IDcuNC0zLjkgOC04IC45LTYtNC40LTkuOS03LjYtMTQuNS01LjgtOC4zLTQuNy0yMC45IDIuNy0yNy45IDYuMi02IDE1LjMtNy44IDIzLjktNy43IDggMCAxNi4yIDEuNCAyMy4xIDUuNSA5LjcgNS43IDE2LjIgMTYuMiAxOC40IDI3LjIgNi43IDMzLTIwLjIgNTkuOS01Ni42IDYyLTE4LjYgMS4xLTM3LjYtMy44LTUyLjEtMTUuNS0zNi45LTI5LjgtNDUuOS05MC4zLTMuOC0xMjIuNyA0MC0zMC43IDkwLjQtMjIuOCAxMjAuMi02LjggMjMuOCAxMi44IDQxLjUgMzMuNiA1NSA1Ni43IDYuNyAxMS42IDEyLjUgMjMuNyAxNy44IDM2LjEgNS4xIDExLjggOS45IDIzLjggMjAuMiAzMi41IDYuOCA1LjggMTUuMiA1LjYgMjQuMSA1LjZsNTAuOCAwYzYuOSAwIDUuMi00LjYgMi4yLTcuNy02LjctNi45LTE2LjQtOC40LTI1LjQtMTAuOS0yMC41LTUuNi0xOC40LTMyLjgtMTIuNy0zMi44IDE4LjMgMCAxOC45IC42IDM0LjkgLjMgMjMuMi0uMyAzMC4yLTEuNyA0OC4zIDUgOS43IDMuNiAxOSAxMy4xIDI1LjEgMjEuN3oiXQogICAgfTsKICAgIGZhQXBwU3RvcmVJb3MgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYXBwLXN0b3JlLWlvcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMzcwIiwgIk00MDAgMzJMNDggMzJDMjEuNSAzMiAwIDUzLjUgMCA4MEwwIDQzMmMwIDI2LjUgMjEuNSA0OCA0OCA0OGwzNTIgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTM1MmMwLTI2LjUtMjEuNS00OC00OC00OHpNMTI3IDM4NC41Yy01LjUgOS42LTE3LjggMTIuOC0yNy4zIDcuMy05LjYtNS41LTEyLjgtMTcuOC03LjMtMjcuM2wxNC4zLTI0LjdjMTYuMS00LjkgMjkuMy0xLjEgMzkuNiAxMS40TDEyNyAzODQuNXptMTM4LjktNTMuOUw4NCAzMzAuNmMtMTEgMC0yMC05LTIwLTIwczktMjAgMjAtMjBsNTEgMCA2NS40LTExMy4yLTIwLjUtMzUuNGMtNS41LTkuNi0yLjItMjEuOCA3LjMtMjcuMyA5LjYtNS41IDIxLjgtMi4yIDI3LjMgNy4zbDguOSAxNS40IDguOS0xNS40YzUuNS05LjYgMTcuOC0xMi44IDI3LjMtNy4zIDkuNiA1LjUgMTIuOCAxNy44IDcuMyAyNy4zbC04NS44IDE0OC42IDYyLjEgMGMyMC4yIDAgMzEuNSAyMy43IDIyLjcgNDB6bTk4LjEgMGwtMjkgMCAxOS42IDMzLjljNS41IDkuNiAyLjIgMjEuOC03LjMgMjcuMy05LjYgNS41LTIxLjggMi4yLTI3LjMtNy4zLTMyLjktNTYuOS01Ny41LTk5LjctNzQtMTI4LjEtMTYuNy0yOS00LjgtNTggNy4xLTY3LjggMTMuMSAyMi43IDMyLjcgNTYuNyA1OC45IDEwMmw1MiAwYzExIDAgMjAgOSAyMCAyMCAwIDExLjEtOSAyMC0yMCAyMHoiXQogICAgfTsKICAgIGZhVWx0cmFseXRpY3NZb2xvID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInVsdHJhbHl0aWNzLXlvbG8iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTg2ZiIsICJNMzgzLjUgMTAuOGM2MS44LS4yIDExMi4zIDUwLjYgMTEyLjMgMTEyLjktLjIgMi43IDAgMC0uMSAzLjNsLjMgLjNjLTEuNSA4OS45LTUzIDE2OC40LTEyNy40IDIwOC41bDAgNTIuOGMwIDYyLjYtNTEuMSAxMTMuNS0xMTMuNyAxMTIuOS02Mi0uNi0xMTEuNC01Mi4yLTExMS40LTExNC4zbDAtNTEuMmMtNDAuNy0yMS45LTc0LjUtNTUuMi05Ny05NS42IDIzLjIgMTYuNSA1MS43IDI2IDgyIDI1LjkgNzguNi0uMiAxNDIuMi02NCAxNDIuMy0xNDIuNSAuMS02Mi4zIDUwLjUtMTEyLjcgMTEyLjktMTEyLjl6bS0yNTUgMjI1LjhhMTEyLjkgMTEyLjkgMCAxIDEgMC0yMjUuOCAxMTIuOSAxMTIuOSAwIDEgMSAwIDIyNS44eiJdCiAgICB9OwogICAgZmFTcXVhcmVEcmliYmJsZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtZHJpYmJibGUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiZHJpYmJibGUtc3F1YXJlIl0sICJmMzk3IiwgIk0xNjUuOSAxMzIuNWMtMzguMyAxOC02Ni44IDUzLjMtNzUuNyA5NS43IDYuMSAuMSA2Mi40IC4zIDEyNi40LTE2LjctMjIuNy00MC4yLTQ3LjEtNzQuMS01MC43LTc5em0yNi4xLTkuMWMzLjggNS4xIDI4LjYgMzguOSA1MSA4MCA0OC42LTE4LjMgNjkuMS00NS45IDcxLjYtNDkuNC0zMy42LTI5LjgtNzkuMy00MS4xLTEyMi42LTMwLjZ6TTI3Ny40IDM4MmMtMi0xMi0xMC01My44LTI5LjItMTAzLjYtNTUuMSAxOC44LTkzLjggNTYuNC0xMDguMSA4NS42IDQwLjUgMzEuNiA5My4zIDM2LjcgMTM3LjMgMTh6TTIyNy44IDIzMi42QzE1OS42IDI1MyA5My40IDI1Mi4yIDg3LjQgMjUybDAgNC4yYzAgMzUuMSAxMy4zIDY3LjEgMzUuMSA5MS40IDIyLjItMzcuOSA2Ny4xLTc3LjkgMTE2LjUtOTEuOC0zLjQtNy44LTcuMi0xNS41LTExLjEtMjMuMmwtLjEgMHptNzIuNSAxMzYuOWMzMC43LTIwLjcgNTIuNS01My42IDU4LjYtOTEuNi00LjYtMS41LTQyLjMtMTIuNy04NS4xLTUuOCAxNy45IDQ5LjEgMjUuMSA4OS4xIDI2LjUgOTcuNHptLTM0LjgtMTE5YzQ1LjUtNS43IDkwLjcgMy40IDk1LjIgNC40LS4zLTMyLjMtMTEuOC02MS45LTMwLjktODUuMS0yLjkgMy45LTI1LjggMzMuMi03Ni4zIDUzLjkgNC44IDkuOCA4LjMgMTcuOCAxMiAyNi44ek0zODQgMzJMNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NHpNMjI0IDk2YTE2MCAxNjAgMCAxIDEgMCAzMjAgMTYwIDE2MCAwIDEgMSAwLTMyMHoiXQogICAgfTsKICAgIGZhRHJpYmJibGVTcXVhcmUgPSBmYVNxdWFyZURyaWJiYmxlOwogICAgZmFVaWtpdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ1aWtpdCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNDAzIiwgIk00NDMuOSAxMjhsMCAyNTYtMjI1LjkgMTI4LTIxOC0xMjggMC0yMTQuMyA4Ny42IDQ1LjEgMCAxMTcgMTMzLjUgNzUuNSAxMzUuOC03NS41IDAtMTUxLTEwMS4xLTU3LjYgODcuNi01My4xIDEwMC41IDU3Ljl6TTMwOC42IDQ5LjFsLTg0LjgtNDkuMS04OC42IDU0LjggODYgNDcuMyA4Ny40LTUzeiJdCiAgICB9OwogICAgZmFTdXBlcnBvd2VycyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzdXBlcnBvd2VycyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMmRkIiwgIk00NDggMzJjLTgzLjMgMTEtMTY2LjggMjItMjUwIDMzLTkyIDEyLjUtMTYzLjMgODYuNy0xNjkgMTgwLTMuMyA1NS41IDE4IDEwOS41IDU3LjggMTQ4LjJMMCA0ODBjODMuMy0xMSAxNjYuNS0yMiAyNDkuOC0zMyA5MS44LTEyLjUgMTYzLjMtODYuOCAxNjguNy0xNzkuOCAzLjUtNTUuNS0xOC0xMDkuNS01Ny43LTE0OC4yTDQ0OCAzMnpNMzY4LjMgMjY0LjNjLTQuMiA3OS41LTc0IDEzOS4yLTE1Mi44IDEzNC41LTc5LjUtNC43LTE0MC43LTcxLTEzNi4zLTE1MSA0LjUtNzkuMiA3NC4zLTEzOS4zIDE1My0xMzQuNSA3OS4zIDQuNyAxNDAuNSA3MSAxMzYuMSAxNTF6Il0KICAgIH07CiAgICBmYVlvdXR1YmUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAieW91dHViZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzYxODAyXSwgImYxNjciLCAiTTU0OS43IDEyNC4xQzU0My41IDEwMC40IDUyNC45IDgxLjggNTAxLjQgNzUuNSA0NTguOSA2NCAyODguMSA2NCAyODguMSA2NFMxMTcuMyA2NCA3NC43IDc1LjVDNTEuMiA4MS44IDMyLjcgMTAwLjQgMjYuNCAxMjQuMSAxNSAxNjcgMTUgMjU2LjQgMTUgMjU2LjRzMCA4OS40IDExLjQgMTMyLjNjNi4zIDIzLjYgMjQuOCA0MS41IDQ4LjMgNDcuOCA0Mi42IDExLjUgMjEzLjQgMTEuNSAyMTMuNCAxMS41czE3MC44IDAgMjEzLjQtMTEuNWMyMy41LTYuMyA0Mi0yNC4yIDQ4LjMtNDcuOCAxMS40LTQyLjkgMTEuNC0xMzIuMyAxMS40LTEzMi4zczAtODkuNC0xMS40LTEzMi4zek0yMzIuMiAzMzcuNmwwLTE2Mi40IDE0Mi43IDgxLjItMTQyLjcgODEuMnoiXQogICAgfTsKICAgIGZhRW1iZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZW1iZXIiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjQyMyIsICJNNjM5LjkgMjU0LjZjLTEuMS0xMC43LTEwLjctNi44LTEwLjctNi44cy0xNS42IDEyLjEtMjkuMyAxMC43Yy0xMy43LTEuMy05LjQtMzItOS40LTMyczMtMjguMS01LjEtMzAuNGMtOC4xLTIuNC0xOCA3LjMtMTggNy4zcy0xMi40IDEzLjctMTguMyAzMS4ybC0xLjYgLjVzMS45LTMwLjYtLjMtMzcuNmMtMS42LTMuNS0xNi40LTMuMi0xOC44IDNzLTE0LjIgNDkuMi0xNSA2Ny4yYzAgMC0yMy4xIDE5LjYtNDMuMyAyMi44cy0yNS05LjQtMjUtOS40IDU0LjgtMTUuMyA1Mi45LTU5LjEtNDQuMi0yNy42LTQ5LTI0Yy00LjYgMy41LTI5LjQgMTguNC0zNi42IDU5LjctLjIgMS40LS43IDcuNS0uNyA3LjVzLTIxLjIgMTQuMi0zMyAxOGMwIDAgMzMtNTUuNi03LjMtODAuOS0xMS40LTYuOC0yMS4zLS41LTI3LjIgNS4zIDEzLjYtMTcuMyA0Ni40LTY0LjIgMzYuOS0xMDUuMi01LjgtMjQuNC0xOC0yNy4xLTI5LjItMjMuMS0xNyA2LjctMjMuNSAxNi43LTIzLjUgMTYuN3MtMjIgMzItMjcuMSA3OS41LTEyLjYgMTA1LjEtMTIuNiAxMDUuMS0xMC41IDEwLjItMjAuMiAxMC43LTUuNC0yOC43LTUuNC0yOC43IDcuNS00NC42IDctNTIuMS0xLjEtMTEuNi05LjktMTQuMmMtOC45LTIuNy0xOC41IDguNi0xOC41IDguNnMtMjUuNSAzOC43LTI3LjcgNDQuNmwtMS4zIDIuNC0xLjMtMS42czE4LTUyLjcgLjgtNTMuNS0yOC41IDE4LjgtMjguNSAxOC44LTE5LjYgMzIuOC0yMC40IDM2LjVsLTEuMy0xLjZzOC4xLTM4LjIgNi40LTQ3LjZjLTEuNi05LjQtMTAuNS03LjUtMTAuNS03LjVzLTExLjMtMS4zLTE0LjIgNS45LTEzLjcgNTUuMy0xNSA3MC43YzAgMC0yOC4yIDIwLjItNDYuOCAyMC40LTE4LjUgLjMtMTYuNy0xMS44LTE2LjctMTEuOHM2OC0yMy4zIDQ5LjQtNjkuMmMtOC4zLTExLjgtMTgtMTUuNS0zMS43LTE1LjMtMTMuNyAuMy0zMC4zIDguNi00MS4zIDMzLjMtNS4zIDExLjgtNi44IDIzLTcuOCAzMS41IDAgMC0xMi4zIDIuNC0xOC44LTIuOXMtMTAgMC0xMCAwLTExLjIgMTQtLjEgMTguMyAyOC4xIDYuMSAyOC4xIDYuMWMxLjYgNy41IDYuMiAxOS41IDE5LjYgMjkuNyAyMC4yIDE1LjMgNTguOC0xLjMgNTguOC0xLjNsMTUuOS04LjhzLjUgMTQuNiAxMi4xIDE2LjcgMTYuNCAxIDM2LjUtNDcuOWMxMS44LTI1IDEyLjYtMjMuNiAxMi42LTIzLjZsMS4zLS4zcy05LjEgNDYuOC01LjYgNTkuN0MxODcuNyAzMTkuNCAyMDMgMzE4IDIwMyAzMThzOC4zIDIuNCAxNS0yMS4yIDE5LjYtNDkuOSAxOS42LTQ5LjlsMS42IDBzLTUuNiA0OC4xIDMgNjMuNyAzMC45IDUuMyAzMC45IDUuMyAxNS42LTcuOCAxOC0xMC4yYzAgMCAxOC41IDE1LjggNDQuNiAxMi45IDU4LjMtMTEuNSA3OS4xLTI1LjkgNzkuMS0yNS45czEwIDI0LjQgNDEuMSAyNi43YzM1LjUgMi43IDU0LjgtMTguNiA1NC44LTE4LjZzLS4zIDEzLjUgMTIuMSAxOC42IDIwLjctMjIuOCAyMC43LTIyLjhsMjAuNy01Ny4yIDEuOSAwczEuMSAzNy4zIDIxLjUgNDMuMiA0Ny0xMy43IDQ3LTEzLjcgNi40LTMuNSA1LjMtMTQuM3ptLTU3OCA1LjNjLjgtMzIgMjEuOC00NS45IDI5LTM5IDcuMyA3IDQuNiAyMi05LjEgMzEuNC0xMy43IDkuNS0xOS45IDcuNi0xOS45IDcuNnpNMzM0LjcgMTM2LjFzMTkuMS00OS43IDIzLjYtMjUuNS00MCA5Ni4yLTQwIDk2LjJjLjUtMTYuMiAxNi40LTcwLjcgMTYuNC03MC43em0yMi44IDEzOC40Yy0xMi42IDMzLTQzLjMgMTkuNi00My4zIDE5LjZzLTMuNS0xMS44IDYuNC00NC45IDMzLjMtMjAuMiAzMy4zLTIwLjIgMTYuMiAxMi40IDMuNiA0NS41em04NC42LTE0LjZzLTMtMTAuNSA4LjEtMzAuNmMxMS0yMC4yIDE5LjYtOS4xIDE5LjYtOS4xczkuNCAxMC4yLTEuMyAyNS41LTI2LjQgMTQuMi0yNi40IDE0LjJ6Il0KICAgIH07CiAgICBmYUJvb3RzdHJhcCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJib290c3RyYXAiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjgzNiIsICJNMzMzLjUgMjAxLjRjMC0yMi4xLTE1LjYtMzQuMy00My0zNC4zbC01MC40IDAgMCA3MS4yIDQyLjUgMGMzMi44LS4xIDUwLjktMTMuMyA1MC45LTM2Ljl6TTUxNyAxODguNmMtOS41LTMwLjktMTAuOS02OC44LTkuOC05OC4xIDEuMS0zMC41LTIyLjctNTguNS01NC43LTU4LjVMMTIzLjcgMzJjLTMyLjEgMC01NS44IDI4LjEtNTQuNyA1OC41IDEgMjkuMy0uMyA2Ny4yLTkuOCA5OC4xLTkuNiAzMS0yNS43IDUwLjYtNTIuMiA1My4xbDAgMjguNWMyNi40IDIuNSA0Mi42IDIyLjEgNTIuMiA1My4xIDkuNSAzMC45IDEwLjkgNjguOCA5LjggOTguMS0xLjEgMzAuNSAyMi43IDU4LjUgNTQuNyA1OC41bDMyOC43IDBjMzIuMSAwIDU1LjgtMjguMSA1NC43LTU4LjUtMS0yOS4zIC4zLTY3LjIgOS44LTk4LjEgOS42LTMxIDI1LjctNTAuNiA1Mi4xLTUzLjFsMC0yOC41Yy0yNi4zLTIuNS00Mi41LTIyLjEtNTItNTMuMXpNMzAwLjIgMzc1LjFsLTk3LjkgMCAwLTIzOC4zIDk3LjQgMGM0My4zIDAgNzEuNyAyMy40IDcxLjcgNTkuNCAwIDI1LjMtMTkuMSA0Ny45LTQzLjUgNTEuOGwwIDEuM2MzMy4yIDMuNiA1NS41IDI2LjYgNTUuNSA1OC4zIDAgNDIuMS0zMS4zIDY3LjUtODMuMiA2Ny41em0tMTAtMTA4LjdsLTUwLjEgMCAwIDc4LjQgNTIuMyAwYzM0LjIgMCA1Mi4zLTEzLjcgNTIuMy0zOS41IDAtMjUuNy0xOC42LTM4LjktNTQuNS0zOC45eiJdCiAgICB9OwogICAgZmFJdHVuZXMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaXR1bmVzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzYjQiLCAiTTIyMy42IDgwLjNhMTcxLjMgMTcxLjMgMCAxIDAgLjIgMzQyLjUgMTcxLjMgMTcxLjMgMCAxIDAgLS4yLTM0Mi41em03OS40IDI0MGMtMy4yIDEzLjYtMTMuNSAyMS4yLTI3LjMgMjMuOC0xMi4xIDIuMi0yMi4yIDIuOC0zMS45LTUtMTEuOC0xMC0xMi0yNi40LTEuNC0zNi44IDguNC04IDIwLjMtOS42IDM4LTEyLjggMy0uNSA1LjYtMS4yIDcuNy0zLjcgMy4yLTMuNiAyLjItMiAyLjItODAuOCAwLTUuNi0yLjctNy4xLTguNC02LjEtNCAuNy05MS45IDE3LjEtOTEuOSAxNy4xLTUgMS4xLTYuNyAyLjYtNi43IDguMyAwIDExNi4xIC41IDExMC44LTEuMiAxMTguNS0yLjEgOS03LjYgMTUuOC0xNC45IDE5LjYtOC4zIDQuNi0yMy40IDYuNi0zMS40IDUuMi0yMS40LTQtMjguOS0yOC43LTE0LjQtNDIuOSA4LjQtOCAyMC4zLTkuNiAzOC0xMi44IDMtLjUgNS42LTEuMiA3LjctMy43IDUtNS43IC45LTEyNyAyLjYtMTMzLjcgLjQtMi42IDEuNS00LjggMy41LTYuNCAyLjEtMS43IDUuOC0yLjcgNi43LTIuNyAxMDEtMTkgMTEzLjMtMjEuNCAxMTUuMS0yMS40IDUuNy0uNCA5IDMgOSA4LjctLjEgMTcwLjYgLjQgMTYxLjQtMSAxNjcuNnpNMzQ1LjIgMzJMMTAyLjggMzJDNDUuOSAzMiAwIDc3LjkgMCAxMzQuOEwwIDM3Ny4yQzAgNDM0LjEgNDUuOSA0ODAgMTAyLjggNDgwbDI0Mi40IDBjNTcgMCAxMDIuOC00NS45IDEwMi44LTEwMi44bDAtMjQyLjRDNDQ4IDc3LjkgNDAyLjEgMzIgMzQ1LjIgMzJ6TTIyMy42IDU5YTE5Mi41IDE5Mi41IDAgMSAxIDAgMzg1IDE5Mi41IDE5Mi41IDAgMSAxIDAtMzg1eiJdCiAgICB9OwogICAgZmFTcXVhcmVYaW5nID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS14aW5nIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInhpbmctc3F1YXJlIl0sICJmMTY5IiwgIk00NDggOTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMHpNOTMuOCAzMjAuMmMtNS41IDAtOC43LTUuMy02LTEwLjNsNDkuMy04Ni43Yy4xIDAgLjEtLjEgMC0uMmwtMzEuNC01NGMtMy01LjYgLjItMTAuMSA2LTEwLjFsNDYuNiAwYzUuMiAwIDkuNSAyLjkgMTIuOSA4LjdsMzEuOSA1NS4zYy0xLjMgMi4zLTE4IDMxLjctNTAuMSA4OC4yLTMuNSA2LjItNy43IDkuMS0xMi42IDkuMWwtNDYuNiAwem0xNjMuNS0zMy40bDAgLjIgNjUuNSAxMTljMi44IDUuMSAuMSAxMC4xLTYgMTAuMWwtNDYuNiAwYy01LjUgMC05LjctMi45LTEyLjktOC43bC02Ni0xMjAuM2MxLjgtMy4yIDIyLjktNDAuNCA2My4zLTExMS42IDExLjctMjAuNyAyNS4xLTQ0LjMgNDAuMS03MC44IDMuMy01LjggNy40LTguNyAxMi41LTguN2w0Ni45IDBjNS43LS4xIDguOCA0LjcgNiAxMEwyNTcuMyAyODYuOHoiXQogICAgfTsKICAgIGZhWGluZ1NxdWFyZSA9IGZhU3F1YXJlWGluZzsKICAgIGZhQ3NzM0FsdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjc3MzLWFsdCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMzhiIiwgIk0wIDMyTDM0LjkgNDI3LjggMTkyIDQ4MCAzNDkuMSA0MjcuOCAzODQgMzIgMCAzMnptMzEzLjEgODBsLTQuOCA0Ny4zLTExNS4zIDQ5LjMtLjMgLjEgMTExLjUgMC0xMi44IDE0Ni42LTk4LjIgMjguNy05OC44LTI5LjItNi40LTczLjkgNDguOSAwIDMuMiAzOC4zIDUyLjYgMTMuMyA1NC43LTE1LjQgMy43LTYxLjYtMTY2LjMtLjUgMC0uMS0uMiAuMS0zLjYtNDYuMyAxMTIuMS00Ni43IDYuNS0yLjctMTIyLjkgMC01LjgtNDcuMyAyNDIuMiAweiJdCiAgICB9OwogICAgZmFTcXVhcmVzcGFjZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmVzcGFjZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNWJlIiwgIk0xODYuMSAzNDMuM2MtOS43IDkuNy05LjcgMjUuMyAwIDM0LjlzMjUuMyA5LjYgMzQuOSAwTDM3OC4zIDIyMS4xYzE5LjMtMTkuMyA1MC42LTE5LjMgNjkuOSAwczE5LjMgNTAuNiAwIDY5LjlMMjk0IDQ0NS4xYzE5LjMgMTkuMyA1MC41IDE5LjMgNjkuOCAwbDAgMCAxMTkuMy0xMTkuMmMzOC42LTM4LjYgMzguNi0xMDEuMSAwLTEzOS43LTM4LjYtMzguNi0xMDEuMi0zOC42LTEzOS43IDBMMTg2LjEgMzQzLjN6TTQzMC43IDIzOC41Yy05LjctOS43LTI1LjMtOS43LTM0LjkgMEwyMzguNSAzOTUuN2MtMTkuMyAxOS4zLTUwLjUgMTkuMy02OS44IDBsMCAwYy05LjYtOS42LTI1LjMtOS43LTM0LjkgMGwwIDBjLTkuNyA5LjYtOS43IDI1LjMgMCAzNC45bDAgMGMzOC42IDM4LjYgMTAxLjEgMzguNiAxMzkuNyAwTDQzMC43IDI3My41YzkuNi05LjcgOS42LTI1LjMgMC0zNC45em0tMjYyIDg3LjNMMzI1LjkgMTY4LjdjOS42LTkuNiA5LjYtMjUuMyAwLTM0LjktOS42LTkuNi0yNS4zLTkuNi0zNC45IDBMMTMzLjcgMjkwLjljLTE5LjMgMTkuMy01MC42IDE5LjMtNjkuOSAwbDAgMGMtMTkuMy0xOS4zLTE5LjMtNTAuNSAwLTY5LjhsMCAwIDE1NC4yLTE1NC4yYy0xOS4zLTE5LjMtNTAuNS0xOS4zLTY5LjggMGwwIDAtMTE5LjIgMTE5LjNjLTM4LjYgMzguNi0zOC42IDEwMS4xIDAgMTM5LjcgMzguNiAzOC42IDEwMS4xIDM4LjYgMTM5LjcgMHpNODEuMyAyNzMuNWM5LjYgOS42IDI1LjMgOS42IDM0LjkgMEwyNzMuNSAxMTYuM2MxOS4zLTE5LjMgNTAuNi0xOS4zIDY5LjggMGwwIDBjOS43IDkuNiAyNS4zIDkuNiAzNC45IDBzOS42LTI1LjMgMC0zNC45Yy0zOC42LTM4LjYtMTAxLjEtMzguNi0xMzkuNyAwTDgxLjMgMjM4LjVjLTkuNiA5LjYtOS42IDI1LjMgMCAzNC45bDAgMHoiXQogICAgfTsKICAgIGZhVHJlbGxvID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInRyZWxsbyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMTgxIiwgIk0zOTIuMyAzMkw1Ni4xIDMyYy0zMSAwLTU2LjEgMjUuMS01Ni4xIDU2LS4xIDAgMC00IDAgMzM2IDAgMzAuOSAyNS4xIDU2IDU2IDU2bDMzNi4yIDBjMzAuOC0uMiA1NS43LTI1LjIgNTUuNy01NmwwLTMzNmMuMS0zMC44LTI0LjgtNTUuOC01NS42LTU2ek0xOTcgMzcxLjNjLS4yIDE0LjctMTIuMSAyNi42LTI2LjkgMjYuNmwtODIuNyAwYy0xNC44IC4xLTI2LjktMTEuOC0yNy0yNi42bDAtMjU0LjJjMC0xNC44IDEyLTI2LjkgMjYuOS0yNi45bDgyLjkgMGMxNC44IDAgMjYuOSAxMiAyNi45IDI2LjlsMCAyNTQuMi0uMSAwem0xOTMuMS0xMTJjMCAxNC44LTEyIDI2LjktMjYuOSAyNi45bC04MSAwYy0xNC44IDAtMjYuOS0xMi0yNi45LTI2LjlsMC0xNDIuMWMwLTE0LjggMTItMjYuOSAyNi44LTI2LjlsODEuMSAwYzE0LjggMCAyNi45IDEyIDI2LjkgMjYuOWwwIDE0Mi4xeiJdCiAgICB9OwogICAgZmFWaWFkZW8gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidmlhZGVvIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyYTkiLCAiTTI3Ni40IDE1MC41bDAgLjdjLTE3LjktNTIuNi00Mi42LTEwMy40LTcwLjgtMTUxLjIgNDMuMyAyOS4yIDY3IDEwMCA3MC44IDE1MC41em0zMi43IDEyMS43YzcuNiAxOC4yIDExIDM3LjUgMTEgNTcgMCA3Ny43LTU3LjggMTQxLTEzNy44IDEzOS40bDMuOC0uM2M3NC4yLTQ2LjcgMTA5LjMtMTE4LjYgMTA5LjMtMjA1LjEgMC0zOC4xLTYuNS03NS45LTE4LjktMTEyIDEgMTEuNyAxIDIzLjcgMSAzNS40IDAgOTEuOC0xOC4xIDI0MS42LTExNi42IDI4MC02NS43LTExLjQtMTExLjMtNjguNi0xMTEuMy0xMzcuNCAwLTc1LjYgNTcuNC0xNDIuMyAxMzUuNC0xNDIuMyAxNi44IDAgMzMuNyAzLjEgNDkuMSA5LjYgMS43LTE1LjEgNi41LTI5LjkgMTMuNC00My4zLTE5LjktNy4yLTQxLjItMTAuNy02Mi41LTEwLjctMTYxLjUgMC0yMzguNyAxOTUuOS0xMjkuOSAzMTMuNyA2Ny45IDc0LjYgMTkyIDczLjkgMjU5LjggMCA1Ni42LTYxLjMgNjAuOS0xNDIuNCAzNi40LTIwMS0xMi43IDgtMjcuMSAxMy45LTQyLjIgMTd6TTQxOC4zIDExLjdjLTMxIDY2LjUtODEuMyA0Ny4yLTExNS44IDgwLjEtMTIuNCAxMi0yMC42IDM0LTIwLjYgNTAuNSAwIDE0LjEgNC41IDI3LjEgMTIgMzguOCA0Ny40LTExIDk4LjMtNDYgMTE4LjItOTAuNy0uNyA1LjUtNC44IDE0LjQtNy4yIDE5LjItMjAuMyAzNS43LTY0LjYgNjUuNi05OS43IDg0LjkgMTQuOCAxNC40IDMzLjcgMjUuOCA1NSAyNS44IDc5IDAgMTEwLjEtMTM0LjYgNTguMS0yMDguNnoiXQogICAgfTsKICAgIGZhU2VhcmNoZW5naW4gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2VhcmNoZW5naW4iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjNlYiIsICJNMjE0LjYgMTMwLjNsLTY3LjIgMjguMiAwLTExNS4zLTU0LjcgMTkwLjMgNTQuNy0yNC4yIDAgMTMwLjMgNjcuMi0yMDkuM3pNMTMxLjQgMzMuNmwtMS4zIDQuNy0xNS4yIDUyLjlDNzQuNiAxMDYuNyA0NiAxNDUuOCA0NiAxOTEuNSA0NiAyNDMuOCA4MC4zIDI4Ny40IDEyOS40IDI5N2wwIDUzLjZDNTEuNSAzNDAuMS02IDI3Mi40LTYgMTkxLjYtNiAxMTEuMSA1My44IDQ0LjQgMTMxLjQgMzMuNnpNNDQyLjggNDgwLjhjLTExLjIgMTEuMi0yMy4xIDEyLjMtMjguNiAxMC41LTUuNC0xLjgtMjcuMS0xOS45LTYwLjQtNDQuNC0zMy4zLTI0LjYtMzMuNi0zNS43LTQzLTU2LjctOS40LTIwLjktMzAuNC00Mi42LTU3LjUtNTIuNGwtOS43LTE0LjdjLTI0LjcgMTYuOS01MyAyNi45LTgxLjMgMjguN2wyLjEtNi42IDE1LjktNDkuNWM0Ni41LTExLjkgODAuOS01NCA4MC45LTEwNC4yIDAtNTQuNS0zOC40LTEwMi4xLTk2LTEwNy4xbDAtNTIuMWM4My4yIDUuMSAxNDguOCA3NC41IDE0OC44IDE1OS4zIDAgMzMuNi0xMS4yIDY0LjctMjkgOTAuNGwxNC42IDkuNmM5LjggMjcuMSAzMS41IDQ4IDUyLjQgNTcuNHMzMi4yIDkuNyA1Ni44IDQzYzI0LjYgMzMuMiA0Mi43IDU0LjkgNDQuNSA2MC4zcy43IDE3LjMtMTAuNSAyOC41em0tOS45LTE3LjljMC00LjQtMy42LTgtOC04cy04IDMuNi04IDggMy42IDggOCA4IDgtMy42IDgtOHoiXQogICAgfTsKICAgIGZhVW5yZWFsRW5naW5lID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInVucmVhbC1lbmdpbmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTg1YyIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6bTY1LjUtMTEzLjdsLTI1LjEtMjguMy00Mi40IDQyLjZjLTI0LjEtLjMtNDcuOS02LjItNjkuMy0xNy4ycy00MC4xLTI2LjktNTQuNS00Ni4zYzQuNSAxLjQgOS4yIDIuMyAxMy45IDIuNiA2LjkgLjEgMTQuNS0yLjQgMTQuNS0xNC4xbDAtMTE1LjFjLjEtMy0uNS01LjktMS43LTguNnMtMy4xLTUtNS40LTYuOS01LTMuMS03LjktMy43LTUuOS0uNS04LjggLjJjLTE5LjYgNC41LTM1LjMgNTMuNS0zNS4zIDUzLjUtLjItMjIuNiA0LjUtNDUgMTMuOC02NS42czIzLTM5IDQwLjEtNTMuOGMyMi41LTE5LjUgNTAuMS0zMi4yIDc5LjYtMzYuNy0yMS40IDEyLjItMzMuNSAzMi4xLTMzLjUgNDguOSAwIDI2LjkgMTYuMiAyMy42IDIxIDE5LjdsMCAxNTUuM2MuOCAxLjkgMS45IDMuOCAzLjIgNS41IDIuMSAzIDUgNS40IDguMiA3czYuOSAyLjUgMTAuNSAyLjVjMTYuMiAwIDM3LjMtMTguNSAzNy4zLTE4LjVsMC0xMjUuN2MwLTEyLjgtOS42LTI4LjItMTkuMy0zMy41IDAgMCAxNy45LTMuMiAzMS43IDcuNCAyLjYtMy4yIDUuMy02LjIgOC4yLTkuMSAzMi4yLTMxLjYgNjIuNS00MC42IDg3LjctNDUuMSAwIDAtNDUuOSAzNi4xLTQ1LjkgODQuNSAwIDM2IC45IDEyMy44IC45IDEyMy44IDE3IDE2LjQgNDIuNC03LjMgNjUuMi0zMC44LTQuNCAyMS4zLTI0IDc1LjktODYuNiAxMDUuNHoiXQogICAgfTsKICAgIGZhUGF5cGFsID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInBheXBhbCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMWVkIiwgIk0xMTEuOSAyOTUuOWMtMy41IDE5LjItMTcuNCAxMDguNy0yMS41IDEzNC0uMyAxLjgtMSAyLjUtMyAyLjVsLTc0LjYgMGMtNy42IDAtMTMuMS02LjYtMTIuMS0xMy45TDU5LjMgNDYuNmMxLjUtOS42IDEwLjEtMTYuOSAyMC0xNi45IDE1Mi4zIDAgMTY1LjEtMy43IDIwNCAxMS40IDYwLjEgMjMuMyA2NS42IDc5LjUgNDQgMTQwLjMtMjEuNSA2Mi42LTcyLjUgODkuNS0xNDAuMSA5MC4zLTQzLjQgLjctNjkuNS03LTc1LjMgMjQuMnpNMzU3LjYgMTUyYy0xLjgtMS4zLTIuNS0xLjgtMyAxLjMtMiAxMS40LTUuMSAyMi41LTguOCAzMy42LTM5LjkgMTEzLjgtMTUwLjUgMTAzLjktMjA0LjUgMTAzLjktNi4xIDAtMTAuMSAzLjMtMTAuOSA5LjQtMjIuNiAxNDAuNC0yNy4xIDE2OS43LTI3LjEgMTY5LjctMSA3LjEgMy41IDEyLjkgMTAuNiAxMi45bDYzLjUgMGM4LjYgMCAxNS43LTYuMyAxNy40LTE0LjkgLjctNS40LTEuMSA2LjEgMTQuNC05MS4zIDQuNi0yMiAxNC4zLTE5LjcgMjkuMy0xOS43IDcxIDAgMTI2LjQtMjguOCAxNDIuOS0xMTIuMyA2LjUtMzQuOCA0LjYtNzEuNC0yMy44LTkyLjZ6Il0KICAgIH07CiAgICBmYVNxdWFyZUJsdWVza3kgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLWJsdWVza3kiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTZhMyIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnpNMjI0IDI0Ny40YzE0LjUtMzAgNTQtODUuOCA5MC43LTExMy4zIDI2LjUtMTkuOSA2OS4zLTM1LjIgNjkuMyAxMy43IDAgOS44LTUuNiA4Mi4xLTguOSA5My44LTExLjQgNDAuOC01MyA1MS4yLTkwIDQ0LjkgNjQuNyAxMSA4MS4yIDQ3LjUgNDUuNiA4NC02Ny41IDY5LjMtOTctMTcuNC0xMDQuNi0zOS42bC0uMy0uOWMtLjktMi42LTEuNC00LjEtMS44LTQuMXMtLjkgMS41LTEuOCA0LjFjLS4xIC4zLS4yIC42LS4zIC45LTcuNiAyMi4yLTM3LjEgMTA4LjgtMTA0LjYgMzkuNi0zNS41LTM2LjUtMTkuMS03MyA0NS42LTg0LTM3IDYuMy03OC42LTQuMS05MC00NC45LTMuMy0xMS43LTguOS04NC04LjktOTMuOCAwLTQ4LjkgNDIuOS0zMy41IDY5LjMtMTMuNyAzNi43IDI3LjUgNzYuMiA4My40IDkwLjcgMTEzLjN6Il0KICAgIH07CiAgICBmYURBbmREQmV5b25kID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImQtYW5kLWQtYmV5b25kIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY2Y2EiLCAiTTMxMy44IDI0MS41YzEzLjggMCAyMS0xMC4xIDI0LjgtMTcuOS0xLTEuMS01LTQuMi03LjQtNi42LTIuNCA0LjMtOC4yIDEwLjctMTMuOSAxMC43LTEwLjIgMC0xNS40LTE0LjctMy4yLTI2LjYtLjUtLjItNC4zLTEuOC04IDIuNCAwLTMgMS01LjEgMi4xLTYuNi0zLjUgMS4zLTkuOCA1LjYtMTEuNCA3LjkgLjItNS44IDEuNi03LjUgLjYtOWwtLjItLjJzLTguNSA1LjYtOS4zIDE0LjdjMCAwIDEuMS0xLjYgMi4xLTEuOSAuNi0uMyAxLjMgMCAuNiAxLjktLjIgLjYtNS44IDE1LjcgNS4xIDI2LS42LTEuNi0xLjktNy42IDIuNC0xLjktLjMgLjEgNS44IDcuMSAxNS43IDcuMXptNTIuNC0yMS4xYzAtNC00LjktNC40LTUuNi00LjUgMiAzLjkgLjkgNy41IC4yIDkgMi41LS40IDUuNC0xLjYgNS40LTQuNXptMTAuMyA1LjJjMC02LjQtNi4yLTExLjQtMTMuNS0xMC43IDggMS4zIDUuNiAxMy44LTUgMTEuNCAzLjctMi42IDMuMi05LjktMS4zLTEyLjUgMS40IDQuMi0zIDguMi03LjQgNC42LTIuNC0xLjktOC02LjYtMTAuNi04LjYtMi40LTIuMS01LjUtMS02LjYtMS44LTEuMy0xLjEtLjUtMy44LTIuMi01LTEuNi0uOC0zLS4zLTQuOC0xLTEuNi0uNi0yLjctMS45LTIuNi0zLjUtMi41IDQuNCAzLjQgNi4zIDQuNSA4LjUgMSAxLjktLjggNC44IDQgOC41IDE0LjggMTEuNiA5LjEgOCAxMC40IDE4LjEgLjYgNC4zIDQuMiA2LjcgNi40IDcuNC0yLjEtMS45LTIuOS02LjQgMC05LjMgMCAxMy45IDE5LjIgMTMuMyAyMy4xIDYuNC0yLjQgMS4xLTctLjItOS0xLjkgNy43IDEgMTQuMi00LjEgMTQuNi0xMC42em0tMzkuNC0xOC40YzIgLjggMS42IC43IDYuNCA0LjUgMTAuMi0yNC41IDIxLjctMTUuNyAyMi0xNS41IDIuMi0xLjkgOS44LTMuOCAxMy44LTIuNy0yLjQtMi43LTcuNS02LjItMTMuMy02LjItNC43IDAtNy40IDIuMi04IDEuMy0uOC0xLjQgMy4yLTMuNCAzLjItMy40LTUuNCAuMi05LjYgNi43LTExLjIgNS45LTEuMS0uNSAxLjQtMy43IDEuNC0zLjctNS4xIDIuOS05LjMgOS4xLTEwLjIgMTMgNC42LTUuOCAxMy44LTkuOCAxOS43LTktMTAuNSAuNS0xOS41IDkuNy0yMy44IDE1Ljh6bTI0Mi41IDUxLjljLTIwLjcgMC00MCAxLjMtNTAuMyAyLjFsNy40IDguMiAwIDc3LjItNy40IDguMmMxMC40IC44IDMwLjkgMi4xIDUxLjYgMi4xIDQyLjEgMCA1OS4xLTIwLjcgNTkuMS00OC45IDAtMjkuMy0yMy4yLTQ4LjktNjAuNC00OC45em0tMTUuMSA3NS42bDAtNTMuM2MzMC4xLTMuMyA0Ni44IDMuOCA0Ni44IDI2LjMgMCAyNS42LTIxLjQgMzAuMi00Ni44IDI3ek0zMDEuNiAxODFjLTEtMy40LS4yLTYuOSAxLjEtOS40IDEgMyAyLjYgNi40IDcuNSA5LS41LTIuNC0uMi01LjYgLjUtOC0xLjQtNS40IDIuMS05LjkgNi40LTkuOSA2LjkgMCA4LjUgOC44IDQuNyAxNC40IDIuMSAzLjIgNS41IDUuNiA3LjcgNy44IDMuMi0zLjcgNS41LTkuNSA1LjUtMTMuOCAwLTguMi01LjUtMTUuOS0xNi43LTE2LjUtMjAtLjktMjAuMiAxNi42LTIwIDE4LjkgLjUgNS4yIDMuNCA3LjggMy4zIDcuNXptLS40IDZjLS41IDEuOC03IDMuNy0xMC4yIDYuOSA0LjgtMSA3LS4yIDcuOCAxLjggLjUgMS40LS4yIDMuNC0uNSA1LjYgMS42LTEuOCA3LTUuNSAxMS02LjItMS0uMy0zLjQtLjgtNC4zLS44IDIuOS0zLjQgOS4zLTQuNSAxMi44LTMuNy0yLjItLjItNi43IDEuMS04LjUgMi42IDEuNiAuMyAzIC42IDQuMyAxLjEtMi4xIC44LTQuOCAzLjQtNS44IDYuMSA3LTUgMTMuMSA1LjIgNyA4LjIgLjggLjIgMi43IDAgMy41LS41LS4zIDEuMS0xLjkgMy0zIDMuNCAyLjkgMCA3LTEuOSA4LjItNC42IDAgMC0xLjggLjYtMi42LS4ycy4zLTQuMyAuMy00LjNjLTIuMyAyLjktMy40LTEuMy0xLjMtNC4yLTEtLjMtMy41LS42LTQuNi0uNSAzLjItMS4xIDEwLjQtMS44IDExLjItLjMgLjYgMS4xLTEgMy40LTEgMy40IDQtLjUgOC4zIDEuMSA2LjcgNS4xIDIuOS0xLjQgNS41LTUuOSA0LjgtMTAuNC0uMyAxLTEuNiAyLjQtMi45IDIuNyAuMi0xLjQtMS0yLjItMS45LTIuNiAxLjctOS42LTE0LjYtMTQuMi0xNC4xLTIzLjktMSAxLjMtMS44IDUtLjggNy4xIDIuNyAzLjIgOC43IDYuNyAxMC4xIDEyLjItMi42LTYuNC0xNS4xLTExLjQtMTQuNi0yMC4yLTEuNiAxLjYtMi42IDcuOC0xLjMgMTEgMi40IDEuNCA0LjUgMy44IDQuOCA2LjEtMi4yLTUuMS0xMS40LTYuMS0xMy45LTEyLjItLjYgMi4yLS4zIDUgMSA2LjcgMCAwLTIuMi0uOC03LS42IDEuNyAuNiA1LjEgMy41IDQuOCA1LjJ6bTI1LjkgNy40Yy0yLjcgMC0zLjUtMi4xLTQuMi00LjMgMy4zIDEuMyA0LjIgNC4zIDQuMiA0LjN6bTM4LjkgMy43bC0xLS42Yy0xLjEtMS0yLjktMS40LTQuNy0xLjQtMi45IDAtNS44IDEuMy03LjUgMy40LS44IC44LTEuNCAxLjgtMi4xIDIuNmwwIDE1LjdjMy41IDIuNiA3LjEtMi45IDMtNy4yIDEuNSAuMyA0LjYgMi43IDUuMSAzLjIgMCAwIDIuNi0uNSA1LS41IDIuMSAwIDMuOSAuMyA1LjYgMS4xbDAtMTguNGMtMS4xIC41LTIuMiAxLTIuNyAxLjRsLS43IC43ek03OS45IDMwNS45YzE3LjItNC42IDE2LjItMTggMTYuMi0xOS45IDAtMjAuNi0yNC4xLTI1LTM3LTI1bC01Ni4xIDAgOC4zIDguNiAwIDI5LjUtMTEuMyAwIDExLjQgMTQuNiAwIDMyLjMtOC40IDguNmM2MS43IDAgNzMuOCAxLjUgODYuNC01LjkgNi43LTQgOS45LTkuOCA5LjktMTcuNiAwLTUuMSAyLjYtMTguOC0xOS40LTI1LjJ6TTM4LjYgMjc4LjRjMjAgMCAyOS42LS44IDI5LjYgOS4xbDAgM2MwIDEyLjEtMTkgOC44LTI5LjYgOC44bDAtMjAuOXptMCA1OS4ybDAtMjIuNmMxMi4yIDAgMzIuNy0yLjMgMzIuNyA4LjhsMCA0LjUgLjIgMGMwIDExLjItMTIuNSA5LjMtMzIuOSA5LjN6bTEwMS4yLTE5LjNsMjMuMSAuMiAwLS4yIDE0LjEtMjEuMi0zNy4yIDAgMC0xNC45IDUyLjQgMC0xNC4xLTIxIDAtLjItNzMuNSAuMiA3LjQgOC4yIDAgNzcuMS03LjQgOC4yIDgxLjIgMCAxNC4xLTIxLjItNjAuMSAuMiAwLTE1LjR6bTIxNC43LTYwLjFjLTczLjkgMC03Ny41IDk5LjMtLjMgOTkuMyA3Ny45IDAgNzQuMS05OS4zIC4zLTk5LjN6bS0uMyA3Ny41Yy0zNy40IDAtMzYuOS01NS4zIC4yLTU1LjMgMzYuOCAuMSAzOC44IDU1LjMtLjIgNTUuM3ptLTkxLjMtOC4zbDQ0LjEtNjYuMi00MS43IDAgNi4xIDcuMi0yMC41IDM3LjItLjMgMC0yMS0zNy4yIDYuNC03LjItNDQuOSAwIDQ0LjEgNjUuOCAuMiAxOS40LTcuNyA4LjIgNDIuNiAwLTcuMi04LjItLjItMTl6TTIzNC41IDE3Ni4xYzEuNiAxLjMgMi45IDIuNCAyLjkgNi42bDAgMzguOGMwIDQuMi0uOCA1LjMtMi43IDYuNC0uMSAuMS03LjUgNC41LTcuOSA0LjZsMzUuMSAwYzEwIDAgMTcuNC0xLjUgMjYtOC42LS42LTUgLjItOS41IC44LTEyIDAtLjItMS44IDEuNC0yLjcgMy41IDAtNS43IDEuNi0xNS40IDkuNi0yMC41LS4xIDAtMy43LS44LTkgMS4xIDItMy4xIDEwLTcuOSAxMC40LTcuOS04LjItMjYtMzgtMjIuOS0zMi4yLTIyLjktMzAuOSAwLTMyLjYgLjMtMzkuOS00IC4xIC44IC41IDguMiA5LjYgMTQuOXptMjEuNSA1LjVjNC42IDAgMjMuMS0zLjMgMjMuMSAxNy4zIDAgMjAuNy0xOC40IDE3LjMtMjMuMSAxNy4zbDAtMzQuNnptMjI4LjkgNzkuNmw3IDguMyAwIDQyLjUtLjMgMGMtNS40LTE0LjQtNDIuMy00MS41LTQ1LjItNTAuOWwtMzEuNiAwIDcuNCA4LjUgMCA3Ni45LTcuMiA4LjMgMzkgMC03LjQtOC4yIDAtNDcuNCAuMyAwYzMuNyAxMC42IDQ0LjUgNDIuOSA0OC41IDU1LjZsMjEuMyAwIDAtODUuMiA3LjQtOC4zLTM5LjItLjF6TTM3OC4yIDE2NS4xYy0zMi4yIDAtMzIuOCAuMi0zOS45LTQgLjEgLjcgLjUgOC4zIDkuNiAxNC45IDMuMSAyIDIuOSA0LjMgMi45IDkuNSAxLjgtMS4xIDMuOC0yLjIgNi4xLTMtMS4xIDEuMS0yLjcgMi43LTMuNSA0LjUgMS0xLjEgNy41LTUuMSAxNC42LTMuNS0xLjYgLjMtNCAxLjEtNi4xIDIuOSAuMSAwIDIuMS0xLjEgNy41LS4zbDAtNC4zYzQuNyAwIDIzLjEtMy40IDIzLjEgMTcuMyAwIDIwLjUtMTguNSAxNy4zLTE5LjcgMTcuMyA1LjcgNC40IDUuOCAxMiAyLjIgMTYuM2wuMyAwYzMzLjQgMCAzNi43LTI3LjMgMzYuNy0zNCAwLTMuOC0xLjEtMzItMzMuOC0zMy42eiJdCiAgICB9OwogICAgZmFNaWNyb3NvZnQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibWljcm9zb2Z0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzY2EiLCAiTTAgMzJsMjE0LjYgMCAwIDIxNC42LTIxNC42IDAgMC0yMTQuNnptMjMzLjQgMGwyMTQuNiAwIDAgMjE0LjYtMjE0LjYgMCAwLTIxNC42ek0wIDI2NS40bDIxNC42IDAgMCAyMTQuNi0yMTQuNiAwIDAtMjE0LjZ6bTIzMy40IDBsMjE0LjYgMCAwIDIxNC42LTIxNC42IDAgMC0yMTQuNnoiXQogICAgfTsKICAgIGZhRmx5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImZseSIsCiAgICAgIGljb246IFszMjAsIDUxMiwgW10sICJmNDE3IiwgIk0xNjUuOSA0MjcuOGMxMi45IDExLjcgMzMuNyAzMy4zIDMzLjIgNTAuNyAwIC44LS4xIDEuNi0uMSAyLjUtMS44IDE5LjgtMTguOCAzMS4xLTM5LjEgMzEtMjUtLjEtMzkuOS0xNi44LTM4LjctMzUuOCAxLTE2LjIgMjAuNS0zNi43IDMyLjQtNDcuNiAyLjMtMi4xIDIuNy0yLjcgNS42LTMuNiAzLjQgMCAzLjkgLjMgNi43IDIuOHpNMzAwIDY3LjNjLTE2LjMtMjUuNy0zOC42LTQwLjYtNjMuMy01Mi4xLTI1LjUtMTAuNy01NC42LTE1LjQtNzYuNi0xNS4yLTQ0LjEgMC03MS4yIDEzLjItODEuMSAxNy4zLTUzLjYgMjcuOS04NC40IDY5LjktODIuOSAxNDEuMyA3LjEgODIuMiA5NyAxNzYgMTU1LjggMjMzLjggMS43IDEuNiA0LjUgNC41IDYuMiA1LjFsMy4zIC4xYzIuMS0uNyAxLjgtLjUgMy41LTIuMSA1Mi4zLTQ5LjIgMTQwLjctMTQ1LjggMTU1LjktMjE1LjcgNy0zOS4yIDMuMS03Mi41LTIwLjgtMTEyLjV6TTE1NC45IDM1MS45Yy0yOC01MS4xLTY1LjItMTMwLjctNjkuMy0xODktMy40LTQ3LjUgMTEuNC0xMzEuMiA2OS4zLTEzNi43bDAgMzI1Ljd6TTI5Ni44IDE4MGMtMTYuNCA1Ni44LTc3LjMgMTI4LTExOC45IDE3MC4zIDI3LjgtNTEuOSA2NS4yLTEzMy4zIDY3LjItMTkxLjkgMS42LTQ1LjktOS44LTEwNS44LTQ4LTEzMS40IDg4LjggMTguMyAxMTUuNSA5OC4xIDk5LjcgMTUzeiJdCiAgICB9OwogICAgZmFDY1N0cmlwZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjYy1zdHJpcGUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjFmNSIsICJNNDkyLjQgMjIwLjhjLTguOSAwLTE4LjcgNi43LTE4LjcgMjIuN2wzNi43IDBjMC0xNi05LjMtMjIuNy0xOC0yMi43ek0zNzUgMjIzLjRjLTguMiAwLTEzLjMgMi45LTE3IDdsLjIgNTIuOGMzLjUgMy43IDguNSA2LjcgMTYuOCA2LjcgMTMuMSAwIDIxLjktMTQuMyAyMS45LTMzLjQgMC0xOC42LTktMzMuMi0yMS45LTMzLjF6TTUyOCAzMkw0OCAzMkMyMS41IDMyIDAgNTMuNSAwIDgwTDAgNDMyYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDQ4MCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMzUyYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4ek0xMjIuMiAyODEuMWMwIDI1LjYtMjAuMyA0MC4xLTQ5LjkgNDAuMy0xMi4yIDAtMjUuNi0yLjQtMzguOC04LjFsMC0zMy45YzEyIDYuNCAyNy4xIDExLjMgMzguOSAxMS4zIDcuOSAwIDEzLjYtMi4xIDEzLjYtOC43IDAtMTctNTQtMTAuNi01NC00OS45IDAtMjUuMiAxOS4yLTQwLjIgNDgtNDAuMiAxMS44IDAgMjMuNSAxLjggMzUuMyA2LjVsMCAzMy40Yy0xMC44LTUuOC0yNC41LTkuMS0zNS4zLTkuMS03LjUgMC0xMi4xIDIuMi0xMi4xIDcuNyAwIDE2IDU0LjMgOC40IDU0LjMgNTAuN3pNMTkxIDIyNC41bC0yNyAwIDAgNTAuNWMwIDIwLjkgMjIuNSAxNC40IDI3IDEyLjZsMCAyOC45Yy00LjcgMi42LTEzLjMgNC43LTI0LjkgNC43LTIxLjEgMC0zNi45LTE1LjUtMzYuOS0zNi41bC4yLTExMy45IDM0LjctNy40IDAgMzAuOCAyNi45IDAgMCAzMC4zem03NCAyLjRjLTQuNS0xLjUtMTguNy0zLjYtMjcuMSA3LjRsMCA4NC40LTM1LjUgMCAwLTEyNC41IDMwLjcgMCAyLjIgMTAuNWM4LjMtMTUuMyAyNC45LTEyLjIgMjkuNi0xMC41bC4xIDAgMCAzMi43em00NC4xIDkxLjhsLTM1LjcgMCAwLTEyNC41IDM1LjcgMCAwIDEyNC41em0wLTE0Mi45bC0zNS43IDcuNiAwLTI4LjkgMzUuNy03LjYgMCAyOC45em03NC4xIDE0NS41Yy0xMi40IDAtMjAtNS4zLTI1LjEtOWwtLjEgNDAuMi0zNS41IDcuNSAwLTE2NS44IDMxLjMgMCAxLjggOC44YzQuOS00LjUgMTMuOS0xMS4xIDI3LjgtMTEuMSAyNC45IDAgNDguNCAyMi41IDQ4LjQgNjMuOCAwIDQ1LjEtMjMuMiA2NS41LTQ4LjYgNjUuNnptMTYwLjQtNTEuNWwtNjkuNSAwYzEuNiAxNi42IDEzLjggMjEuNSAyNy42IDIxLjUgMTQuMSAwIDI1LjItMyAzNC45LTcuOWwwIDI4LjZjLTkuNyA1LjMtMjIuNCA5LjItMzkuNCA5LjItMzQuNiAwLTU4LjgtMjEuNy01OC44LTY0LjUgMC0zNi4yIDIwLjUtNjQuOSA1NC4zLTY0LjkgMzMuNyAwIDUxLjMgMjguNyA1MS4zIDY1LjEgMCAzLjUtLjMgMTAuOS0uNCAxMi45eiJdCiAgICB9OwogICAgZmFXb3JkcHJlc3NTaW1wbGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAid29yZHByZXNzLXNpbXBsZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNDExIiwgIk0yNTYgOGEyNDggMjQ4IDAgMSAwIDAgNDk2IDI0OCAyNDggMCAxIDAgMC00OTZ6TTMzIDI1NmMwLTMyLjMgNi45LTYzIDE5LjMtOTAuN0wxNTguNyA0NTYuN0M4NC4zIDQyMC41IDMzIDM0NC4yIDMzIDI1NnpNMjU2IDQ3OWMtMjEuOSAwLTQzLTMuMi02My05LjFsNjYuOS0xOTQuNCA2OC41IDE4Ny44Yy41IDEuMSAxIDIuMSAxLjYgMy4xLTIzLjEgOC4xLTQ4IDEyLjYtNzQgMTIuNnptMzAuNy0zMjcuNWMxMy40LS43IDI1LjUtMi4xIDI1LjUtMi4xIDEyLTEuNCAxMC42LTE5LjEtMS40LTE4LjQgMCAwLTM2LjEgMi44LTU5LjQgMi44LTIxLjkgMC01OC43LTIuOC01OC43LTIuOC0xMi0uNy0xMy40IDE3LjctMS40IDE4LjQgMCAwIDExLjQgMS40IDIzLjQgMi4xbDM0LjcgOTUuMi00OC44IDE0Ni4zLTgxLjItMjQxLjVjMTMuNC0uNyAyNS41LTIuMSAyNS41LTIuMSAxMi0xLjQgMTAuNi0xOS4xLTEuNC0xOC40IDAgMC0zNi4xIDIuOC01OS40IDIuOC00LjIgMC05LjEtLjEtMTQuNC0uMyAzOS45LTYwLjUgMTA4LjQtMTAwLjUgMTg2LjMtMTAwLjUgNTggMCAxMTAuOSAyMi4yIDE1MC42IDU4LjUtMS0uMS0xLjktLjItMi45LS4yLTIxLjkgMC0zNy40IDE5LjEtMzcuNCAzOS42IDAgMTguNCAxMC42IDMzLjkgMjEuOSA1Mi4zIDguNSAxNC44IDE4LjQgMzMuOSAxOC40IDYxLjUgMCAxOS4xLTcuMyA0MS4yLTE3IDcyLjFsLTIyLjIgNzQuMy04MC43LTIzOS42em04MS40IDI5Ny4ybDY4LjEtMTk2LjljMTIuNy0zMS44IDE3LTU3LjIgMTctNzkuOSAwLTguMi0uNS0xNS44LTEuNS0yMi45IDE3LjQgMzEuOCAyNy4zIDY4LjIgMjcuMyAxMDcgMCA4Mi4zLTQ0LjYgMTU0LjEtMTEwLjkgMTkyLjd6Il0KICAgIH07CiAgICBmYVNlbGxzeSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzZWxsc3kiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjIxMyIsICJNNTQwIDIzNy4zYzMuMS0xMi4zIDQuMy0yNC44IDQuMy0zNy40IDAtOTIuNS03NS40LTE2Ny45LTE2Ny45LTE2Ny45LTc3LjIgMC0xNDQuNiA1My0xNjMgMTI3LjgtMTUuMy0xMy4yLTM0LjktMjAuNS01NS4yLTIwLjUtNDYuMyAwLTg0IDM3LjctODQgODQgMCA3LjQgLjkgMTUgMy4xIDIyLjQtNDIuOSAyMC4yLTcwLjggNjMuNy03MC44IDExMS4yIDAgNjggNTUuNSAxMjMuMiAxMjMuMiAxMjMuMmwzODEuMiAwYzY3LjcgMCAxMjMuMi01NS4yIDEyMy4yLTEyMy4yIDAtNTYuNC0zOC45LTEwNi05NC4xLTExOS41ek0yMDAuMiA0MDEuNmMwIDguMy03IDE1LjMtMTUuMyAxNS4zbC0zMC45IDBjLTguMyAwLTE1LjMtNy0xNS4zLTE1LjNsMC0xMTAuOWMwLTguMyA3LTE1LjMgMTUuMy0xNS4zbDMwLjkgMGM4LjMgMCAxNS4zIDcgMTUuMyAxNS4zbDAgMTEwLjl6bTg5LjUgMGMwIDguMy03IDE1LjMtMTUuMyAxNS4zbC0zMC45IDBjLTguMyAwLTE1LjMtNy0xNS4zLTE1LjNsMC0xMzEuNWMwLTguMyA3LTE1LjMgMTUuMy0xNS4zbDMwLjkgMGM4LjMgMCAxNS4zIDcgMTUuMyAxNS4zbDAgMTMxLjV6bTg5LjUgMGMwIDguMy03IDE1LjMtMTUuMyAxNS4zbC0zMSAwYy04LjMgMC0xNS4zLTctMTUuMy0xNS4zbDAtMTYyLjdjMC04LjMgNy0xNS4zIDE1LjMtMTUuM2wzMSAwYzguMyAwIDE1LjMgNyAxNS4zIDE1LjNsMCAxNjIuN3ptODcgMGMwIDguMy03IDE1LjMtMTUuMyAxNS4zbC0yOC41IDBjLTguMyAwLTE1LjMtNy0xNS4zLTE1LjNsMC0yMjQuNmMwLTguNiA3LTE1LjYgMTUuMy0xNS42bDI4LjUgMGM4LjMgMCAxNS4zIDcgMTUuMyAxNS42bDAgMjI0LjZ6Il0KICAgIH07CiAgICBmYURhc2hjdWJlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImRhc2hjdWJlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyMTAiLCAiTTMyNi45IDEwNGwtMjE2LjIgMGMtNTEuMSAwLTkxLjIgNDMuMy05MS4yIDkzLjVsMCAyMjkuNWMwIDUwLjUgNDAuMSA4NSA5MS4yIDg1bDIyNy4yIDBjNTEuMSAwIDkxLjItMzQuNSA5MS4yLTg1bDAtNDI3LTEwMi4yIDEwNHpNMTU0LjIgNDE2LjVjLTE3LjcgMC0zMi40LTE1LjEtMzIuNC0zMi44bDAtMTQyLjljMC0xNy43IDE0LjctMzIuNSAzMi40LTMyLjVsMTQwLjcgMGMxNy43IDAgMzIgMTQuOCAzMiAzMi41bDAgMTIzLjUgNTEuMSA1Mi4zLTIyMy44IDAgMC0uMXoiXQogICAgfTsKICAgIGZhR2l0dGVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdpdHRlciIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmNDI2IiwgIk02Ni40IDMyMi41bC01MC40IDAgMC0zMjIuNSA1MC40IDAgMCAzMjIuNXpNMTY2LjkgNzYuMWwtNTAuNCAwIDAgNDM1LjkgNTAuNCAwIDAtNDM1Ljl6bTEwMC42IDBsLTUwLjQgMCAwIDQzNS45IDUwLjQgMCAwLTQzNS45ek0zNjggNzZsLTUwLjQgMCAwIDI0NyA1MC40IDAgMC0yNDd6Il0KICAgIH07CiAgICBmYVdvbGZQYWNrQmF0dGFsaW9uID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIndvbGYtcGFjay1iYXR0YWxpb24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjUxNCIsICJNMjM2LjIgNDcxLjVsMTAuNiAxNS44IDUuMy0xMi4zIDUuMyA3IDAgMjkuOWMyMS4xLTcuOSAyMS4xLTY2LjkgMjUuNS05Ny4yIDQuNi0zMS45LS45LTkyLjggODEuNC0xNDkuMS04LjktMjMuNi0xMi00OS40LTIuNi04MCAyNy45IDMuNCA1My45IDEwLjYgNjMuMyA1NC4xbC0zMC4zIDguNGMxMS4xIDIzIDE3IDQ2LjggMTMuMiA3Mi4xbC0yNy4zLTctNi4yIDMzLjQtMTguNS03LTguOCAzMy40LTE5LjQtNyAyNi40IDIxLjEgOC44LTI4LjIgMjQuNiA1LjIgNy0zNS42IDI2LjQgMTQuNWMuMi0yMCA3LTU4LjEtOC44LTg0LjVsMjYuNCA1LjNjNC0yMi4xLTIuNC0zOS4yLTcuOS01Ni43bDIyLjQgOS43Yy0uNC0yNS4xLTI5LjktNTYuOC02MS42LTU4LjUtMjAuMi0xLjEtNTYuNy0yNS4yLTU0LjEtNTEuOSAyLTE5LjkgMTcuNC00Mi42IDQzLjEtNDkuNy00NCAzNi41LTkuNyA2Ny4zIDUuMyA3My41IDQuNC0xMS40IDE3LjUtNjkuMSAwLTEzMC4yLTQwLjQgMjIuOS04OS43IDY1LjEtOTMuMiAxNDcuOGwtNTggMzguNy0zLjUgOTMuMiAxMDcuMy01OS44IDcgNy0xNy42IDMuNS00NCAzOC43LTE1LjgtNS4zLTI4LjEgNDkuMy0zLjUgMTE5LjYgMjEuMSAxNS44LTMyLjUgMTUuOC0zMi42LTE1LjggMjEuMS0xNS44LTMuNS0xMTkuNi0yOC4yLTQ5LjMtMTUuOCA1LjMtNDQtMzguNy0xNy42LTMuNSA3LTcgMTA3LjMgNTkuOC0zLjUtOTMuMy01OC4xLTM4LjdjLTMuNS04Mi44LTUyLjctMTI1LTkzLjItMTQ3LjktMTcuNSA2MS4xLTQuNCAxMTguOCAwIDEzMC4yIDE1LTYuMiA0OS4zLTM3IDUuMy03My41IDI1LjcgNy4xIDQxLjEgMjkuOCA0My4xIDQ5LjcgMi42IDI2LjctMzMuOSA1MC44LTU0LjEgNTEuOS0zMS43IDEuNy02MS4yIDMzLjQtNjEuNiA1OC41bDIyLjQtOS43QzEzLjQgMjI0LjcgNyAyNDEuOCAxMSAyNjMuOWwyNi40LTUuM2MtMTUuOCAyNi40LTkuMSA2NC40LTguOCA4NC40bDI2LjQtMTQuNSA3IDM1LjYgMjQuNi01LjMgOC44IDI4LjIgMjYuNC0yMS4xLTE5LjQgNy04LjgtMzMuNC0xOC41IDctNi4yLTMzLjQtMjcuMyA3QzM4IDI5NC44IDQzLjggMjcxIDU1IDI0OGwtMzAuMy04LjRjOS40LTQzLjUgMzUuNS01MC44IDYzLjMtNTQuMSA5LjQgMzAuNiA2LjIgNTYuNS0yLjYgODAuMSA4Mi4zIDU2LjMgNzYuOCAxMTcuMiA4MS40IDE0OS4xIDQuNCAzMC4zIDQuNCA4OS4zIDI1LjUgOTcuMmwwLTI5LjggNS4zLTcgNS4zIDEyLjMgMTAuNi0xNS44IDExLjQgMjEuMSAxMS40LTIxLjEgMCAwem03OS4yLTk1TDI5OS41IDM2NmM3LjUtNC40IDEzLjgtOC40IDE5LjQtMTIuMy0uNiA3LjItLjMgMTMuOC0zLjUgMjIuOGwwIDB6bTI4LjItNDkuM2MtLjQgMTAuOS0uOSAyMS43LTEuOCAzMS43LTcuOC0xLjktMTUuNi0zLjgtMjEuMS03IDguMi03LjkgMTUuNi0xNi4zIDIyLjktMjQuN2wwIDB6bTI0LjYgNS4zYzAtMTMuNC0yLjEtMjQuMi01LjMtMzMuNC01LjUgOS41LTExLjcgMTguNi0xOC41IDI3LjNsMjMuOCA2LjJ6bTMuNS04MC45YzE5LjQgMTIuOCAyNy44IDMzLjcgMjkuOSA1Ni4zLTEyLjMtNC41LTI0LjYtOS4zLTM3LTEwLjYgNS4xLTEyIDYuNi0yOC4xIDctNDUuN2wwIDB6bS0xLjgtNDUuN2MuOCAxNC4zIDEuOCAyOC44IDEuOCA0Mi4yIDE5LjItOC4xIDI5LjgtOS43IDQ0LTE0LjEtMTAuNi0xOS0yNy4yLTI1LjUtNDUuOC0yOC4ybDAgMHpNMTM0LjIgMzc2LjVMMTUwIDM2NmMtNy41LTQuNC0xMy44LTguNC0xOS40LTEyLjMgLjYgNy4zIC4zIDEzLjkgMy41IDIyLjlsMCAwek0xMDYgMzI3LjNjLjQgMTAuOSAuOSAyMS43IDEuOCAzMS43IDcuOC0xLjkgMTUuNi0zLjggMjEuMS03LTguMi03LjktMTUuNi0xNi4zLTIyLjktMjQuN3ptLTI0LjYgNS4zYzAtMTMuNCAyLTI0LjIgNS4zLTMzLjQgNS41IDkuNSAxMS43IDE4LjYgMTguNSAyNy4zbC0yMy44IDYuMnptLTMuNS04MC45Yy0xOS40IDEyLjgtMjcuOCAzMy43LTI5LjkgNTYuMyAxMi4zLTQuNSAyNC42LTkuMyAzNy0xMC42LTUtMTItNi42LTI4LjEtNy00NS43bC0uMSAwem0xLjgtNDUuN2MtLjggMTQuMy0xLjggMjguOC0xLjggNDIuMi0xOS4yLTguMS0yOS44LTkuNy00NC0xNC4xIDEwLjYtMTkgMjcuMi0yNS41IDQ1LjgtMjguMXoiXQogICAgfTsKICAgIGZhTGFzdGZtID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImxhc3RmbSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjAyIiwgIk0yMjUuOCAzNjcuMWwtMTguOC01MXMtMzAuNSAzNC03Ni4yIDM0Yy00MC41IDAtNjkuMi0zNS4yLTY5LjItOTEuNSAwLTcyLjEgMzYuNC05Ny45IDcyLjEtOTcuOSA2Ni41IDAgNzQuOCA1My4zIDEwMC45IDEzNC45IDE4LjggNTYuOSA1NCAxMDIuNiAxNTUuNCAxMDIuNiA3Mi43IDAgMTIyLTIyLjMgMTIyLTgwLjkgMC03Mi45LTYyLjctODAuNi0xMTUtOTIuMS0yNS44LTUuOS0zMy40LTE2LjQtMzMuNC0zNCAwLTE5LjkgMTUuOC0zMS43IDQxLjYtMzEuNyAyOC4yIDAgNDMuNCAxMC42IDQ1LjcgMzUuOGw1OC42LTdjLTQuNy01Mi44LTQxLjEtNzQuNS0xMDAuOS03NC41LTUyLjggMC0xMDQuNCAxOS45LTEwNC40IDgzLjkgMCAzOS45IDE5LjQgNjUuMSA2OCA3Ni44IDQ0LjkgMTAuNiA3OS44IDEzLjggNzkuOCA0NS43IDAgMjEuNy0yMS4xIDMwLjUtNjEgMzAuNS01OS4yIDAtODMuOS0zMS4xLTk3LjktNzMuOS0zMi05Ni44LTQzLjYtMTYzLTE2MS4zLTE2My04Ni4xIDAtMTMxLjggNTQuNS0xMzEuOCAxNDcuMiAwIDg5LjEgNDUuNyAxMzcuMiAxMjcuOSAxMzcuMiA2Ni4yIDAgOTcuOS0zMS4xIDk3LjktMzEuMXoiXQogICAgfTsKICAgIGZhU2hvcHdhcmUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2hvcHdhcmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjViNSIsICJNNDAzLjUgNDU1LjRjLTQyLjYgMzEuNy05NC40IDQ4LjctMTQ3LjUgNDguNi0xMzcuMiAwLTI0OC0xMTEtMjQ4LTI0OCAwLTEzNy4yIDExMS0yNDggMjQ4LTI0OCA2MS4yLS4xIDEyMC4yIDIyLjYgMTY1LjcgNjMuNSAuNiAuNSAuOSAxLjIgMS4xIDEuOXMuMSAxLjUtLjMgMi4yLS44IDEuMy0xLjUgMS42LTEuNCAuNS0yLjIgLjRjLTE4LjgtMi41LTM3LjctMy43LTU2LjctMy43LTEyOS40IDAtMjIyLjQgNTMuNS0yMjIuNCAxNTUuNCAwIDEwOSA5Mi4xIDE0NS45IDE3Ni44IDE3OC43IDMzLjYgMTMgNjUuNCAyNS40IDg3IDQxLjYgLjQgLjMgLjggLjggMS4xIDEuM3MuNCAxIC40IDEuNi0uMSAxLjEtLjQgMS42LS42IC45LTEuMSAxLjNsLS4xIDB6TTUwMyAyMzMuMWMtLjEtLjktLjUtMS44LTEuMy0yLjQtNTEuOC00My05My42LTYwLjUtMTQ0LjUtNjAuNS04NC4xIDAtODAuMyA1Mi4yLTgwLjMgNTMuNiAwIDQyLjYgNTIuMSA2MiAxMTIuMyA4NC41IDMxLjEgMTEuNiA2My4yIDIzLjYgOTIuNyAzOS45IC40IC4yIC45IC40IDEuNCAuNHMxIDAgMS41LS4yIC45LS40IDEuMy0uOCAuNi0uOCAuOC0xLjJjMTQuMS0zNiAxOS41LTc0LjggMTYtMTEzLjN6Il0KICAgIH07CiAgICBmYUJsb2dnZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYmxvZ2dlciIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMzdjIiwgIk0xNjIuNCAxOTZjNC44LTQuOSA2LjItNS4xIDM2LjQtNS4xIDI3LjIgMCAyOC4xIC4xIDMyLjEgMi4xIDUuOCAyLjkgOC4zIDcgOC4zIDEzLjYgMCA1LjktMi40IDEwLTcuNiAxMy40LTIuOCAxLjgtNC41IDEuOS0zMS4xIDIuMS0xNi40IC4xLTI5LjUtLjItMzEuNS0uOC0xMC4zLTIuOS0xNC4xLTE3LjctNi42LTI1LjN6bTYxLjQgOTQuNWMtNTMuOSAwLTU1LjggLjItNjAuMiA0LjEtMy41IDMuMS01LjcgOS40LTUuMSAxMy45IC43IDQuNyA0LjggMTAuMSA5LjIgMTIgMi4yIDEgMTQuMSAxLjcgNTYuMyAxLjJsNDcuOS0uNiA5LjItMS41YzktNS4xIDEwLjUtMTcuNCAzLjEtMjQuNC01LjMtNC43LTUtNC43LTYwLjQtNC43ek00NDcuMiA0MjAuNmMtMy41IDI4LjQtMjMgNTAuNC01MS4xIDU3LjUtNy4yIDEuOC05LjcgMS45LTE3Mi45IDEuOC0xNTcuOCAwLTE2NS45LS4xLTE3Mi0xLjgtOC40LTIuMi0xNS42LTUuNS0yMi4zLTEwLTUuNi0zLjgtMTMuOS0xMS44LTE3LTE2LjQtMy44LTUuNi04LjItMTUuMy0xMC0yMlMwIDQyMC4zIDAgMjU2LjNjMC0xNjMuMSAwLTE2Ni42IDEuOC0xNzMuNyA2LjMtMjQuNyAyNS45LTQzLjYgNTEuMi00OS4yIDcuMy0xLjYgMzMyLjEtMS45IDM0MC0uMyAyMS4yIDQuMyAzNy45IDE3LjEgNDcuNiAzNi40IDcuNyAxNS4zIDctMS41IDcuMyAxODAuNiAuMiAxMTUuOCAwIDE2NC41LS43IDE3MC41ek0zNjEuOCAyMzUuNGMtMS4xLTUtNC4yLTkuNi03LjctMTEuNS0xLjEtLjYtOC0xLjMtMTUuNS0xLjctMTIuNC0uNi0xMy44LS44LTE3LjgtMy4xLTYuMi0zLjYtNy45LTcuNi04LTE4LjMgMC0yMC40LTguNS0zOS40LTI1LjMtNTYuNS0xMi0xMi4yLTI1LjMtMjAuNS00MC42LTI1LjEtMy42LTEuMS0xMS44LTEuNS0zOS4yLTEuOC00Mi45LS41LTUyLjUgLjQtNjcuMSA2LjItMjcgMTAuNy00Ni4zIDMzLjQtNTMuNCA2Mi40LTEuMyA1LjQtMS42IDE0LjItMS45IDY0LjMtLjQgNjIuOCAwIDcyLjEgNCA4NC41IDkuNyAzMC43IDM3LjEgNTMuNCA2NC42IDU4LjQgOS4yIDEuNyAxMjIuMiAyLjEgMTMzLjcgLjUgMjAuMS0yLjcgMzUuOS0xMC44IDUwLjctMjUuOSAxMC43LTEwLjkgMTcuNC0yMi44IDIxLjgtMzguNSAzLjItMTAuOSAyLjktODguNCAxLjctOTMuOXoiXQogICAgfTsKICAgIGZhRWRnZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJlZGdlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyODIiLCAiTTEyMC4xIDM3LjRjNDEtMjUuMiA4Ny42LTM4LjIgMTM0LjktMzcuNCAxNjggMCAyNTcgMTIzLjggMjU3IDIxOS41LS4xIDMyLjctMTMgNjMuOS0zNS45IDg3LjItMjIuOSAyMy4yLTU0IDM2LjUtODYuNyAzNy03NS4yIDAtOTEuNS0yMy4xLTkxLjUtMzIgMC0zLjggMS4yLTYuMiA0LjgtOS40bDEtMS4yIC40LTEuNmMxMC41LTExLjUgMTUuOS0yNi4yIDE1LjktNDEuNiAwLTc4LjctODIuMi0xNDIuNy0xODQtMTQyLjctMzcuNS0uMy03NC41IDguOS0xMDcuNSAyNi45IDI3LTU3LjUgODIuNy05Ny42IDkxLjMtMTAzLjggLjgtLjYgLjMtLjggLjMtLjh6bTE1LjYgMzE4LjFjLTEuNCAzMCA0LjYgNjAgMTYuNCA4Ny4yIDEzLjYgMjYuNCAzMi43IDUxIDU2LjUgNjkuMy01OS41LTExLjUtMTExLjUtNDMuOS0xNDkuNC04OS4zLTM4LjEtNDYuNC01OS4yLTEwNC4zLTU5LjItMTY0LjggMC01MS4yIDYyLjQtOTQuNCAxMzYtOTQuNCAzNi42LS42IDcyLjQgMTAuOSAxMDEuOCAzMi43bC0zLjYgMS4yYy01MS41IDE3LjYtOTguNSA5MC43LTk4LjUgMTU4LjF6TTQ2OS44IDQwMGwtLjcgLjFjLTExLjggMTguOC0yNS45IDM1LjEtNDIuMiA0OS41LTMwLjggMjgtNjguMSA0NS41LTEwOC44IDQ5LjktMTguNiAuMy0zNi44LTMuMi01My44LTExLjQtMjUuNi0xMC4zLTQ3LjEtMzAtNjEuNi01My0xNC40LTIzLjktMjEuMS01MS43LTE5LTc5LjYtLjYtMjAuMSA1LjQtNDAuMyAxNS01OC4yIDEzLjkgMzMuMSAzNy41IDYxLjMgNjcuNiA4MC44czY1LjUgMjkuNSAxMDEuNCAyOC42YzMxIC4zIDYyLjEtNi43IDkwLjItMjAuNWwxLjktLjljMy45LTIuMyA3LjctMy45IDExLjYgMCA0LjUgNC45IDEuOCA5LjItMS4yIDE0LS4yIC4yLS4zIC41LS40IC43eiJdCiAgICB9OwogICAgZmFJb3hob3N0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImlveGhvc3QiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjIwOCIsICJNNjE2IDE2MGwtNjcuMyAwQzUxMS4yIDcwLjcgNDIyLjkgOCAzMjAgOCAxODMgOCA3MiAxMTkgNzIgMjU2IDcyIDI3Mi40IDczLjYgMjg4LjUgNzYuNyAzMDRMMjQgMzA0Yy0xMy4zIDAtMjQgMTAuOC0yNCAyNCAwIDEzLjMgMTAuNyAyNCAyNCAyNGw2Ny4zIDBjMzcuNSA4OS4zIDEyNS44IDE1MiAyMjguNyAxNTIgMTM3IDAgMjQ4LTExMSAyNDgtMjQ4IDAtMTYuNC0xLjYtMzIuNS00LjctNDhsNTIuNyAwYzEzLjMgMCAyNC0xMC44IDI0LTI0IDAtMTMuMy0xMC43LTI0LTI0LTI0em0tOTYgOTZjMCAxMTAuNS04OS41IDIwMC0yMDAgMjAwLTc1LjcgMC0xNDEuNi00Mi0xNzUuNS0xMDRMNDI0IDM1MmMxMy4zIDAgMjQtMTAuOCAyNC0yNCAwLTEzLjMtMTAuNy0yNC0yNC0yNGwtMjk4LjIgMGMtMy44LTE1LjQtNS44LTMxLjQtNS44LTQ4IDAtMTEwLjUgODkuNS0yMDAgMjAwLTIwMCA3NS43IDAgMTQxLjYgNDIgMTc1LjUgMTA0TDIxNiAxNjBjLTEzLjMgMC0yNCAxMC44LTI0IDI0IDAgMTMuMyAxMC43IDI0IDI0IDI0bDI5OC4yIDBjMy44IDE1LjQgNS44IDMxLjQgNS44IDQ4ek0yMTYgMjMybDIwOCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0IDAgMTMuMi0xMC43IDI0LTI0IDI0bC0yMDggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjQgMC0xMy4yIDEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYVNjaGxpeCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzY2hsaXgiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjNlYSIsICJNMzUwLjUgMTU3LjdsLTU0LjItNDYuMSA3My40LTM5IDc4LjMgNDQuMi05Ny41IDQwLjl6TTE5MiAxMjIuMWw0NS43LTI4LjIgMzQuNyAzNC42LTU1LjQgMjktMjUtMzUuNHptLTY1LjEgNi42bDMxLjktMjIuMSAxNy4yIDI4LjQtMzYuNyAyMi41LTEyLjQtMjguOHptLTIzLjMgODguMmwtOC44LTM0LjggMjkuNi0xOC4zIDEzLjEgMzUuMy0zMy45IDE3Ljh6TTgyLjQgMTMzLjJsMjMuOS0xOC4xIDguOSAyNC0yNi43IDE4LjMtNi4xLTI0LjJ6TTU5IDIwNi41bC0zLjYtMjguNCAyMi4zLTE1LjUgNi4xIDI4LjctMjQuOCAxNS4yek0yOC40IDIyMy4xbDIwLjgtMTIuOCAzLjMgMzMuNC0yMi45IDEyLTEuMi0zMi42ek0xLjQgMjY4TDIwLjYgMjU3LjggMjEgMjk2IDAgMzA0LjggMS40IDI2OHptNTkuMSA1OS4zbC0yOC4zIDguMy0xLjYtNDYuOCAyNS4xLTEwLjcgNC44IDQ5LjJ6TTk5IDI2My4ybC0zMS4xIDEzLTUuMi00MC44IDI3LjQtMTQuNCA4LjkgNDIuMnpNMTIzLjIgMzc3bC00MS42IDUuOS04LjEtNjMuNSAzNS4yLTEwLjggMTQuNSA2OC40em0yOC41LTEzOS45bDIxLjIgNTcuMS00Ni4yIDEzLjYtMTMuNy01NC4xIDM4LjctMTYuNnptODUuNyAyMzAuNWwtNzAuOS0zLjMtMjQuMy05NS44IDU1LjItOC42IDQwIDEwNy43ek0xNTIuNSAxODcuOWw0Mi4yLTIyLjQgMjggNDUuOS01MC44IDIxLjMtMTkuNC00NC44em00MSA5NC45bDYxLjMtMTguNyA1Mi44IDg2LjYtNzkuOCAxMS4zLTM0LjMtNzkuMnptNTEuNC04NS42bDY3LjMtMjguOCA2NS41IDY1LjQtODguNiAyNi4yLTQ0LjItNjIuOHoiXQogICAgfTsKICAgIGZhREFuZEQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZC1hbmQtZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMzhkIiwgIk04Mi45IDk4LjljLS42LTE3LjIgMi0zMy44IDEyLjctNDguMiAuMyA3LjQgMS4yIDE0LjUgNC4yIDIxLjYgNS45LTI3LjUgMTkuNy00OS4zIDQyLjMtNjUuNS0xLjkgNS45LTMuNSAxMS44LTMgMTcuNyA4LjctNy40IDE4LjgtMTcuOCA0NC40LTIyLjcgMTQuNy0yLjggMjkuNy0yIDQyLjEgMSAzOC41IDkuMyA2MSAzNC4zIDY5LjcgNzIuMyA1LjMgMjMuMSAuNyA0NS04LjMgNjYuNC01LjIgMTIuNC0xMiAyNC40LTIwLjcgMzUuMS0yLTEuOS0zLjktMy44LTUuOC01LjYtNDIuOC00MC44LTI2LjgtMjUuMi0zNy40LTM3LjQtMS4xLTEuMi0xLTIuMi0uMS0zLjYgOC4zLTEzLjUgMTEuOC0yOC4yIDEwLTQ0LTEuMS05LjgtNC4zLTE4LjktMTEuMy0yNi4yLTE0LjUtMTUuMy0zOS4yLTE1LTUzLjUgLjYtMTEuNCAxMi41LTE0LjEgMjcuNC0xMC45IDQzLjYgLjIgMS4zIC40IDIuNyAwIDMuOS0zLjQgMTMuNy00LjYgMjcuNi0yLjUgNDEuNiAuMSAuNSAuMSAxLjEgLjEgMS42IDAgLjMtLjEgLjUtLjIgMS4xLTIxLjgtMTEtMzYtMjguMy00My4yLTUyLjItOC4zIDE3LjgtMTEuMSAzNS41LTYuNiA1NC4xLTE1LjYtMTUuMi0yMS4zLTM0LjMtMjItNTUuMnpNNTUyLjUgMjIyLjFjLTExLjYtMTEuNi0yNS0yMC40LTQwLjEtMjYuNi0xMi44LTUuMi0yNi03LjktMzkuOS03LjEtMTAgLjYtMTkuNiAzLjEtMjkgNi40LTIuNSAuOS01LjEgMS42LTcuNyAyLjItNC45IDEuMi03LjMtMy4xLTQuNy02LjggMy4yLTQuNiAzLjQtNC4yIDE1LTEyIC42LS40IDEuMi0uOCAyLjItMS41bC0yLjUgMGMtLjYgMC0xLjIgLjItMS45IC4zLTE5LjMgMy4zLTMwLjcgMTUuNS00OC45IDI5LjYtMTAuNCA4LjEtMTMuOCAzLjgtMTItLjUgMS40LTMuNSAzLjMtNi43IDUuMS0xMCAxLTEuOCAyLjMtMy40IDMuNS01LjEtLjItLjItLjUtLjMtLjctLjUtMjcgMTguMy00Ni43IDQyLjQtNTcuNyA3My4zIC4zIC4zIC43IC42IDEgLjkgLjMtLjYgLjUtMS4yIC45LTEuNyAxMC40LTEyLjEgMjIuOC0yMS44IDM2LjYtMjkuOCAxOC4yLTEwLjYgMzcuNS0xOC4zIDU4LjctMjAuMiA0LjMtLjQgOC43LS4xIDEzLjEtLjEtMS44IC43LTMuNSAuOS01LjMgMS4xLTE4LjUgMi40LTM1LjUgOS01MS41IDE4LjUtMzAuMiAxNy45LTU0LjUgNDIuMi03NS4xIDcwLjQtLjMgLjQtLjQgLjktLjcgMS4zIDE0LjUgNS4zIDI0IDE3LjMgMzYuMSAyNS42IC4yLS4xIC4zLS4yIC40LS40bDEuMi0yLjdjMTIuMi0yNi45IDI3LTUyLjMgNDYuNy03NC41IDE2LjctMTguOCAzOC0yNS4zIDYyLjUtMjAgNS45IDEuMyAxMS40IDQuNCAxNy4yIDYuOCAyLjMtMS40IDUuMS0zLjIgOC00LjcgOC40LTQuMyAxNy40LTcgMjYuNy05IDE0LjctMy4xIDI5LjUtNC45IDQ0LjUtMS4zbDAtLjVjLS41LS40LTEuMi0uOC0xLjctMS40ek0zMTcuMSAzOTcuNmMtMzkuNC0zMy0yMi44LTE5LjUtNDIuNy0zNS42LS44IC45IDAtLjItMS45IDMtMTEuMiAxOS4xLTI1LjUgMzUuMy00NCA0Ny42LTEwLjMgNi44LTIxLjUgMTEuOC0zNC4xIDExLjgtMjEuNiAwLTM4LjItOS41LTQ5LjQtMjcuOC0xMi0xOS41LTEzLjMtNDAuNy04LjItNjIuNiA3LjgtMzMuOCAzMC4xLTU1LjIgMzguNi02NC4zLTE4LjctNi4yLTMzIDEuNy00Ni40IDEzLjkgLjgtMTMuOSA0LjMtMjYuMiAxMS44LTM3LjMtMjQuMyAxMC42LTQ1LjkgMjUtNjQuOCA0My45LS4zLTUuOCA1LjQtNDMuNyA1LjYtNDQuNyAuMy0yLjctLjYtNS4zLTMtNy40LTI0LjIgMjQuNy00NC41IDUxLjgtNTYuMSA4NC42IDcuNC01LjkgMTQuOS0xMS40IDIzLjYtMTYuMi04LjMgMjIuMy0xOS42IDUyLjgtNy44IDEwMS4xIDQuNiAxOSAxMS45IDM2LjggMjQuMSA1Mi4zIDIuOSAzLjcgNi4zIDYuOSA5LjUgMTAuMyAuMi0uMiAuNC0uMyAuNi0uNS0xLjQtNy0yLjItMTQuMS0xLjUtMjEuOSAyLjIgMy4yIDMuOSA2IDUuOSA4LjYgMTIuNiAxNiAyOC43IDI3LjQgNDcuMiAzNS42IDI1IDExLjMgNTEuMSAxMy4zIDc3LjkgOC42IDU0LjktOS43IDkwLjctNDguNiAxMTYtOTguOCAxLTEuOCAuNi0yLjktLjktNC4yem0xNzItNDYuNGMtOS41LTMuMS0yMi4yLTQuMi0yOC43LTIuOSA5LjkgNCAxNC4xIDYuNiAxOC44IDEyIDEyLjYgMTQuNCAxMC40IDM0LjctNS40IDQ1LjYtMTEuNyA4LjEtMjQuOSAxMC41LTM4LjkgOS4xLTEuMi0uMS0yLjMtLjQtMy0uNiAyLjgtMy43IDYtNyA4LjEtMTAuOCA5LjQtMTYuOCA1LjQtNDIuMS04LjctNTYuMS0yLjEtMi4xLTQuNi0zLjktNy01LjktLjMgMS4zLS4xIDIuMSAuMSAyLjggNC4yIDE2LjYtOC4xIDMyLjQtMjQuOCAzMS44LTcuNi0uMy0xMy45LTMuOC0xOS42LTguNS0xOS41LTE2LjEtMzkuMS0zMi4xLTU4LjUtNDguMy01LjktNC45LTEyLjUtOC4xLTIwLjEtOC43LTQuNi0uNC05LjMtLjYtMTMuOS0uOS01LjktLjQtOC44LTIuOC0xMC40LTguNC0uOS0zLjQtMS41LTYuOC0yLjItMTAuMi0xLjUtOC4xLTYuMi0xMy0xNC4zLTE0LjItNC40LS43LTguOS0xLTEzLjMtMS41LTEzLTEuNC0xOS44LTcuNC0yMi42LTIwLjMtNSAxMS0xLjYgMjIuNCA3LjMgMjkuOSA0LjUgMy44IDkuMyA3LjMgMTMuOCAxMS4yIDQuNiAzLjggNy40IDguNyA3LjkgMTQuOCAuNCA0LjcgLjggOS41IDEuOCAxNC4xIDIuMiAxMC42IDguOSAxOC40IDE3IDI1LjEgMTYuNSAxMy43IDMzIDI3LjMgNDkuNSA0MS4xIDE3LjkgMTUgMTMuOSAzMi44IDEzIDU2LS45IDIyLjkgMTIuMiA0Mi45IDMzLjUgNTEuMiAxIC40IDIgLjYgMy42IDEuMS0xNS43LTE4LjItMTAuMS00NC4xIC43LTUyLjMgLjMgMi4yIC40IDQuMyAuOSA2LjQgOS40IDQ0LjEgNDUuNCA2NC4yIDg1IDU2LjkgMTYtMi45IDMwLjYtOC45IDQyLjktMTkuOCAyLTEuOCAzLjctNC4xIDUuOS02LjUtMTkuMyA0LjYtMzUuOCAuMS01MC45LTEwLjYgLjctLjMgMS4zLS4zIDEuOS0uMyAyMS4zIDEuOCA0MC42LTMuNCA1Ny0xNy40IDE5LjUtMTYuNiAyNi42LTQyLjkgMTcuNC02Ni04LjMtMjAuMS0yMy42LTMyLjMtNDMuOC0zOC45ek05OS44IDE3OS4zYy01LjMtOS4yLTEzLjItMTUuNi0yMi4xLTIxLjMgMTMuNy0uNSAyNi42IC4yIDM5LjYgMy43LTctMTIuMi04LjUtMjQuNy01LTM4LjcgNS4zIDExLjkgMTMuNyAyMC4xIDIzLjYgMjYuOCAxOS43IDEzLjIgMzUuNyAxOS42IDQ2LjcgMzAuMiAzLjQgMy4zIDYuMyA3LjEgOS42IDEwLjktLjgtMi4xLTEuNC00LjEtMi4yLTYtNS0xMC42LTEzLTE4LjYtMjIuNi0yNS0xLjgtMS4yLTIuOC0yLjUtMy40LTQuNS0zLjMtMTIuNS0zLTI1LjEtLjctMzcuNiAxLTUuNSAyLjgtMTAuOSA0LjUtMTYuMyAuOC0yLjQgMi4zLTQuNiA0LTYuNiAuNiA2LjkgMCAyNS41IDE5LjYgNDYgMTAuOCAxMS4zIDIyLjQgMjEuOSAzMy45IDMyLjcgOSA4LjUgMTguMyAxNi43IDI1LjUgMjYuOCAxLjEgMS42IDIuMiAzLjMgMy44IDQuNy01LTEzLTE0LjItMjQuMS0yNC4yLTMzLjgtOS42LTkuMy0xOS40LTE4LjQtMjkuMi0yNy40LTMuMy0zLTQuNi02LjctNS4xLTEwLjktMS4yLTEwLjQgMC0yMC42IDQuMy0zMC4yIC41LTEgMS4xLTIgMS45LTMuMyAuNSA0LjIgLjYgNy45IDEuNCAxMS42IDQuOCAyMy4xIDIwLjQgMzYuMyA0OS4zIDYzLjUgMTAgOS40IDE5LjMgMTkuMiAyNS42IDMxLjYgNC44IDkuMyA3LjMgMTkgNS43IDI5LjYtLjEgLjYgLjUgMS43IDEuMSAyIDYuMiAyLjYgMTAgNi45IDkuNyAxNC4zIDcuNy0yLjYgMTIuNS04IDE2LjQtMTQuNSA0LjIgMjAuMi05LjEgNTAuMy0yNy4yIDU4LjcgLjQtNC41IDUtMjMuNC0xNi41LTI3LjctNi44LTEuMy0xMi44LTEuMy0yMi45LTIuMSA0LjctOSAxMC40LTIwLjYgLjUtMjIuNC0yNC45LTQuNi01Mi44IDEuOS01Ny44IDQuNiA4LjIgLjQgMTYuMyAxIDIzLjUgMy4zLTIgNi41LTQgMTIuNy01LjggMTguOS0xLjkgNi41IDIuMSAxNC42IDkuMyA5LjYgMS4yLS45IDIuMy0xLjkgMy4zLTIuNy0zLjEgMTcuOS0yLjkgMTUuOS0yLjggMTguMyAuMyAxMC4yIDkuNSA3LjggMTUuNyA3LjMtMi41IDExLjgtMjkuNSAyNy4zLTQ1LjQgMjUuOCA3LTQuNyAxMi43LTEwLjMgMTUuOS0xNy45LTYuNSAuOC0xMi45IDEuNi0xOS4yIDIuNGwtLjMtLjljNC43LTMuNCA4LTcuOCAxMC4yLTEzLjEgOC43LTIxLjEtMy42LTM4LTI1LTM5LjktOS4xLS44LTE3LjggLjgtMjUuOSA1LjUgNi4yLTE1LjYgMTcuMi0yNi42IDMyLjYtMzQuNS0xNS4yLTQuMy04LjktMi43LTI0LjYtNi4zIDE0LjYtOS4zIDMwLjItMTMuMiA0Ni41LTE0LjYtNS4yLTMuMi00OC4xLTMuNi03MC4yIDIwLjkgNy45IDEuNCAxNS41IDIuOCAyMy4yIDQuMi0yMy44IDctNDQgMTkuNy02Mi40IDM1LjYgMS4xLTQuOCAyLjctOS41IDMuMy0xNC4zIC42LTQuNSAuOC05LjIgLjEtMTMuNi0xLjUtOS40LTguOS0xNS4xLTE5LjctMTYuMy03LjktLjktMTUuNiAuMS0yMy4zIDEuMy0uOSAuMS0xLjcgLjMtMi45IDAgMTUuOC0xNC44IDM2LTIxLjcgNTMuMS0zMy41IDYtNC41IDYuOC04LjIgMy0xNC45em0xMjguNCAyNi44YzMuMyAxNiAxMi42IDI1LjUgMjMuOCAyNC4zLTQuNi0xMS4zLTEyLjEtMTkuNS0yMy44LTI0LjN6Il0KICAgIH07CiAgICBmYVZ1ZWpzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInZ1ZWpzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY0MWYiLCAiTTM1Ni45IDY0LjNsLTc2LjkgMC01NiA4OC42LTQ4LTg4LjYtMTc2IDAgMjI0IDM4My43IDIyNC0zODMuNy05MS4xIDB6TTU1LjcgOTYuM2w1My44IDAgMTE0LjUgMTk4LjIgMTE0LjQtMTk4LjIgNTMuOCAwLTE2OC4yIDI4OC4yLTE2OC4zLTI4OC4yeiJdCiAgICB9OwogICAgZmFNZXRhID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1ldGEiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTQ5YiIsICJNNjQwIDMxNy45YzAgOTEuMy0zOS40IDE0OC41LTExMC4zIDE0OC41LTYyLjYgMC05NS44LTM0LjYtMTU2LjktMTM2LjZsLTMxLjQtNTIuNmMtOC4zLTEyLjUtMTQuNS0yNC4yLTIxLjItMzUtMjAuMSAzMy44LTQ3LjEgODMtNDcuMSA4My02NyAxMTYuNi0xMDQuNiAxNDEuMi0xNTYuOSAxNDEuMi03Mi44IDAtMTE2LjItNTcuMy0xMTYuMi0xNDUuOSAwLTE0MyA3OS44LTI3OC4xIDE4My45LTI3OC4xIDUwLjIgMCA5My44IDI0LjcgMTQ0LjggODkuNSAzNy4xLTUwLjEgNzguMS04OS41IDEzMC42LTg5LjUgOTkuMSAwIDE4MC43IDEyNS43IDE4MC43IDI3NS41ek0yODcuNCAxOTIuMmMtNDIuOS02Mi4xLTcwLjktODAuNS0xMDQuNC04MC41LTYxLjkgMC0xMTMuOCAxMDYuMS0xMTMuOCAyMTAgMCA0OC41IDE4LjUgNzUuNyA0OS42IDc1LjcgMzAuMiAwIDQ5LTE5IDEwMy4yLTEwMy44IDAgMCAyNC43LTM5LjEgNjUuNC0xMDEuNHpNNTMxLjIgMzk3LjRjMzIuMiAwIDQ2LjktMjcuNSA0Ni45LTc0LjkgMC0xMjQuMi01NC4zLTIyNS40LTEyMy4yLTIyNS40LTMzLjIgMC02MS4xIDI1LjktOTQuOSA3OCA5LjQgMTMuOCAxOS4xIDI5IDI5LjMgNDUuNGwzNy41IDYyLjRjNTguNyA5NC4xIDczLjUgMTE0LjUgMTA0LjQgMTE0LjV6Il0KICAgIH07CiAgICBmYUNyZWF0aXZlQ29tbW9uc1NoYXJlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNyZWF0aXZlLWNvbW1vbnMtc2hhcmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjRmMiIsICJNMjU1LjYgOEMzOTcuNCA4IDUwNCAxMTguMSA1MDQgMjU2IDUwNCA0MDMuMSAzODUuNSA1MDQgMjU1LjYgNTA0IDEyMS42IDUwNCA4IDM5NC41IDggMjU2IDggMTIzLjEgMTEyLjcgOCAyNTUuNiA4em0uOCA0NC43Yy0xMTguMiAwLTIwMy43IDk3LjktMjAzLjcgMjAzLjMgMCAxMDkuOCA5MS4yIDIwMi44IDIwMy43IDIwMi44IDEwMy4yIDAgMjAyLjgtODEuMSAyMDIuOC0yMDIuOCAuMS0xMTMuOC05MC4yLTIwMy4zLTIwMi44LTIwMy4zem0xMDEgMTMyLjRjNy44IDAgMTMuNyA2LjEgMTMuNyAxMy43bDAgMTgyLjVjMCA3LjctNi4xIDEzLjctMTMuNyAxMy43bC0xMzUuMSAwYy03LjcgMC0xMy43LTYtMTMuNy0xMy43bDAtNTQtNTQgMGMtNy44IDAtMTMuNy02LTEzLjctMTMuN2wwLTE4Mi41YzAtOC4yIDYuNi0xMi43IDEyLjQtMTMuN2wxMzYuNCAwYzcuNyAwIDEzLjcgNiAxMy43IDEzLjdsMCA1NCA1NCAwek0xNjcuOSAzMDAuM2w0MC43IDAgMC0xMDEuNGMwLTcuNCA1LjgtMTIuNiAxMi0xMy43bDU1LjggMCAwLTQwLjMtMTA4LjUgMCAwIDE1NS40em0xNzYuMi04OC4xbC0xMDguNSAwIDAgMTU1LjQgMTA4LjUgMCAwLTE1NS40eiJdCiAgICB9OwogICAgZmFTdHVkaW92aW5hcmkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3R1ZGlvdmluYXJpIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzZjgiLCAiTTQ4MC43IDE4Ny43bDQuMiAyOCAwIDI4LTI1LjEgNDQuMS0zOS44IDc4LjQtNTYuMSA2Ny41LTc5LjEgMzcuOC0xNy43IDI0LjUtNy43IDEyLTkuNiA0czE3LjMtNjMuNiAxOS40LTYzLjYgMjAuMyAuNyAyMC4zIC43bDY2LjctMzguNi05Mi41IDI2LjEtNTUuOSAzNi44LTIyLjggMjgtNi42IDEuNCAyMC44LTczLjYgNi45LTUuNSAyMC43IDEyLjkgODguMy00NS4yIDU2LjgtNTEuNSAxNC44LTY4LjQtMTI1LjQgMjMuMyAxNS4yLTE4LjItMTczLjQtNTMuMyA4MS45LTEwLjUtMTY2LTEyMi45IDExNC45IDE4LjEtMTAxLjMtMTA4IDI1Mi45IDEyNi42LTMxLjUtMzggMTI0LjQgNzQuNC0xNDMuMy05OSAxOC43IDM4LjQtNDkuNi0xOC4xLTQ1LjUtODQuMyAxOTQuNiAxMjItNDIuOS01NS44IDEwOCA5Ni40IDEyLTguOS0yMS0xNi40IDQuMi0zNy44IDM3LjgtMTAuNCAyOS4yIDI0LjcgMTEuNSA0LjItNyA2LjIgOC41IDEyLTEzLjEgNy40LTEwLjMgMjAuMiAxMC41IDIzLjl6Il0KICAgIH07CiAgICBmYUJpdGJ1Y2tldCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJiaXRidWNrZXQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MTgxMF0sICJmMTcxIiwgIk0yMi4yIDMyYy0yLjEgMC00LjIgLjQtNi4xIDEuMXMtMy43IDEuOS01LjIgMy40LTIuNyAzLjItMy41IDUuMS0xLjMgNC0xLjMgNi4xYzAgLjkgLjEgMS45IC4yIDIuOEw3NC4xIDQ2Mi43Yy44IDUuMSAzLjQgOS43IDcuMyAxM3M4LjggNS4yIDE0IDUuMmwzMjUuNyAwYzMuOCAuMSA3LjUtMS4zIDEwLjUtMy43czQuOS01LjkgNS41LTkuN0w1MDUgNTAuN2MuNy00LjItLjMtOC40LTIuOC0xMS45cy02LjItNS43LTEwLjQtNi40Yy0uOS0uMS0xLjktLjItMi44LS4yTDIyLjIgMzJ6TTMwOC4xIDMyOS44bC0xMDQgMC0yOC4xLTE0NyAxNTcuMyAwLTI1LjIgMTQ3eiJdCiAgICB9OwogICAgZmFWayA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ2ayIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMTg5IiwgIk0zMS41IDYzLjVDMCA5NSAwIDE0NS43IDAgMjQ3TDAgMjY1QzAgMzY2LjMgMCA0MTcgMzEuNSA0NDguNVMxMTMuNyA0ODAgMjE1IDQ4MGwxNy45IDBjMTAxLjQgMCAxNTIuMSAwIDE4My41LTMxLjVTNDQ4IDM2Ni4zIDQ0OCAyNjVsMC0xNy45YzAtMTAxLjQgMC0xNTIuMS0zMS41LTE4My41UzMzNC4zIDMyIDIzMyAzMkwyMTUgMzJDMTEzLjcgMzIgNjMgMzIgMzEuNSA2My41ek03NS42IDE2OC4zbDUxLjEgMGMxLjcgODUuNSAzOS40IDEyMS43IDY5LjMgMTI5LjJsMC0xMjkuMiA0OC4yIDAgMCA3My43YzI5LjUtMy4yIDYwLjUtMzYuOCA3MC45LTczLjdsNDguMiAwYy0zLjkgMTkuMi0xMS44IDM3LjMtMjMuMSA1My4zcy0yNS43IDI5LjUtNDIuNSAzOS42YzE4LjcgOS4zIDM1LjIgMjIuNCA0OC40IDM4LjVzMjIuOSAzNC45IDI4LjMgNTVsLTUzIDBjLTQuOS0xNy41LTE0LjgtMzMuMS0yOC42LTQ1cy0zMC43LTE5LjQtNDguNy0yMS42bDAgNjYuNi01LjggMGMtMTAyLjEgMC0xNjAuMy03MC0xNjIuOC0xODYuNXoiXQogICAgfTsKICAgIGZhR2l0aHViID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdpdGh1YiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMDliIiwgIk0xNzMuOSAzOTcuNGMwIDItMi4zIDMuNi01LjIgMy42LTMuMyAuMy01LjYtMS4zLTUuNi0zLjYgMC0yIDIuMy0zLjYgNS4yLTMuNiAzLS4zIDUuNiAxLjMgNS42IDMuNnptLTMxLjEtNC41Yy0uNyAyIDEuMyA0LjMgNC4zIDQuOSAyLjYgMSA1LjYgMCA2LjItMnMtMS4zLTQuMy00LjMtNS4yYy0yLjYtLjctNS41IC4zLTYuMiAyLjN6bTQ0LjItMS43Yy0yLjkgLjctNC45IDIuNi00LjYgNC45IC4zIDIgMi45IDMuMyA1LjkgMi42IDIuOS0uNyA0LjktMi42IDQuNi00LjYtLjMtMS45LTMtMy4yLTUuOS0yLjl6TTI1Mi44IDhjLTEzOC43IDAtMjQ0LjggMTA1LjMtMjQ0LjggMjQ0IDAgMTEwLjkgNjkuOCAyMDUuOCAxNjkuNSAyMzkuMiAxMi44IDIuMyAxNy4zLTUuNiAxNy4zLTEyLjEgMC02LjItLjMtNDAuNC0uMy02MS40IDAgMC03MCAxNS04NC43LTI5LjggMCAwLTExLjQtMjkuMS0yNy44LTM2LjYgMCAwLTIyLjktMTUuNyAxLjYtMTUuNCAwIDAgMjQuOSAyIDM4LjYgMjUuOCAyMS45IDM4LjYgNTguNiAyNy41IDcyLjkgMjAuOSAyLjMtMTYgOC44LTI3LjEgMTYtMzMuNy01NS45LTYuMi0xMTIuMy0xNC4zLTExMi4zLTExMC41IDAtMjcuNSA3LjYtNDEuMyAyMy42LTU4LjktMi42LTYuNS0xMS4xLTMzLjMgMi42LTY3LjkgMjAuOS02LjUgNjkgMjcgNjkgMjcgMjAtNS42IDQxLjUtOC41IDYyLjgtOC41czQyLjggMi45IDYyLjggOC41YzAgMCA0OC4xLTMzLjYgNjktMjcgMTMuNyAzNC43IDUuMiA2MS40IDIuNiA2Ny45IDE2IDE3LjcgMjUuOCAzMS41IDI1LjggNTguOSAwIDk2LjUtNTguOSAxMDQuMi0xMTQuOCAxMTAuNSA5LjIgNy45IDE3IDIyLjkgMTcgNDYuNCAwIDMzLjctLjMgNzUuNC0uMyA4My42IDAgNi41IDQuNiAxNC40IDE3LjMgMTIuMSAxMDAtMzMuMiAxNjcuOC0xMjguMSAxNjcuOC0yMzkgMC0xMzguNy0xMTIuNS0yNDQtMjUxLjItMjQ0ek0xMDUuMiAzNTIuOWMtMS4zIDEtMSAzLjMgLjcgNS4yIDEuNiAxLjYgMy45IDIuMyA1LjIgMSAxLjMtMSAxLTMuMy0uNy01LjItMS42LTEuNi0zLjktMi4zLTUuMi0xem0tMTAuOC04LjFjLS43IDEuMyAuMyAyLjkgMi4zIDMuOSAxLjYgMSAzLjYgLjcgNC4zLS43IC43LTEuMy0uMy0yLjktMi4zLTMuOS0yLS42LTMuNi0uMy00LjMgLjd6bTMyLjQgMzUuNmMtMS42IDEuMy0xIDQuMyAxLjMgNi4yIDIuMyAyLjMgNS4yIDIuNiA2LjUgMSAxLjMtMS4zIC43LTQuMy0xLjMtNi4yLTIuMi0yLjMtNS4yLTIuNi02LjUtMXptLTExLjQtMTQuN2MtMS42IDEtMS42IDMuNiAwIDUuOXM0LjMgMy4zIDUuNiAyLjNjMS42LTEuMyAxLjYtMy45IDAtNi4yLTEuNC0yLjMtNC0zLjMtNS42LTJ6Il0KICAgIH07CiAgICBmYUNvZGllcGllID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNvZGllcGllIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyODQiLCAiTTQ0Mi41IDIwMi45YzMwLjcgMCAzMy41IDUzLjEtLjMgNTMuMWwtMTAuOCAwIDAgNDQuMy0yNi42IDAgMC05Ny40IDM3LjcgMHpNNDkyIDM1Mi42QzQ0OS45IDQ0NC41IDM3MC40IDUwNCAyNjggNTA0IDEzMSA1MDQgMjAgMzkzIDIwIDI1NlMxMzEgOCAyNjggOGM5Ny40IDAgMTcyLjggNTMuNyAyMTguMiAxMzguNEwzMDAuMiAyNTUuMiA0OTIgMzUyLjZ6bS0zOC41IDEyLjVsLTYwLjMtMzAuN2MtMjcuMSA0NC4zLTcwLjQgNzEuNC0xMjIuNCA3MS40LTgyLjUgMC0xNDkuMi02Ni43LTE0OS4yLTE0OC45IDAtODIuNSA2Ni43LTE0OS4yIDE0OS4yLTE0OS4yIDQ4LjQgMCA4OC45IDIzLjUgMTE2LjkgNjMuNGw1OS41LTM0LjZDNDA2LjUgNzMuOSAzNDIuNSAzNi41IDI2OCAzNi41IDE0Ni44IDM2LjUgNDguNSAxMzQuOCA0OC41IDI1NlMxNDYuOCA0NzUuNSAyNjggNDc1LjVjNzguNiAwIDE0Ni41LTQyLjEgMTg1LjUtMTEwLjR6Il0KICAgIH07CiAgICBmYVBpZWRQaXBlciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwaWVkLXBpcGVyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyYWUiLCAiTTQ0MC4yIDIzLjJjLTI2LjcgNi44LTY4LjEgMjguNS0xMTQuNiA2Ny41LTMwLjktMTcuNS02NS44LTI2LjctMTAxLjQtMjYuNy0xMTQuOSAwLTIwOCA5My4xLTIwOCAyMDhzOTMuMSAyMDggMjA4IDIwOCAyMDgtOTMuMSAyMDgtMjA4Yy4xLTU0LjEtMjEtMTA2LjEtNTguNy0xNDQuOC02LjYgOC41LTEyLjMgMTcuNy0xNyAyNy40IDI4LjkgMzIuMyA0NC44IDc0LjEgNDQuOSAxMTcuNCAwIDk3LjctNzkuNCAxNzcuMS0xNzcuMSAxNzcuMS0zMC44IDAtNjEtOC4xLTg3LjYtMjMuNCA4Mi45LTEwNy4zIDE1MC44LTM3LjggMTg0LjMtMjI2LjYgNS44LTMyLjYgMjgtOTQuMyAxMjYuMi0xNjAuMiA4LjEtNS40IDIuNC0xOC4xLTctMTUuN3pNMTA5LjMgNDA2LjRDODkuOCAzODkuOCA3NC4yIDM2OS4yIDYzLjUgMzQ2cy0xNi4zLTQ4LjUtMTYuMy03NGMwLTk3LjcgNzkuNC0xNzcuMSAxNzcuMS0xNzcuMSAyNi42IDAgNTIuOCA2LjEgNzYuNiAxNy44LTY2IDYyLjEtMTI2LjkgMTUyLjktMTkxLjYgMjkzLjh6Il0KICAgIH07CiAgICBmYVJhc3BiZXJyeVBpID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInJhc3BiZXJyeS1waSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmN2JiIiwgIk0zOTIuNSAyMzIuNWwtMy43LTYuNWMuMS00Ni40LTIxLjQtNjUuMy00Ni41LTc5LjcgNy42LTIgMTUuNC0zLjYgMTcuNi0xMy4yIDEzLjEtMy4zIDE1LjgtOS40IDE3LjEtMTUuOCAzLjQtMi4zIDE0LjgtOC43IDEzLjYtMTkuNyA2LjQtNC40IDEwLTEwLjEgOC4xLTE4LjEgNi45LTcuNSA4LjctMTMuNyA1LjgtMTkuNCA4LjMtMTAuMyA0LjYtMTUuNiAxLjEtMjAuOSA2LjItMTEuMiAuNy0yMy4yLTE2LjYtMjEuMi02LjktMTAuMS0yMS45LTcuOC0yNC4yLTcuOC0yLjYtMy4yLTYtNi0xNi41LTQuNy02LjgtNi4xLTE0LjQtNS0yMi4zLTIuMS05LjMtNy4zLTE1LjUtMS40LTIyLjYgLjgtMTEuMy0zLjYtMTMuOSAxLjMtMTkuNCAzLjQtMTIuMy0yLjYtMTYuMSAzLTIyIDguOWwtNi45LS4xYy0xOC42IDEwLjgtMjcuOCAzMi44LTMxLjEgNDQuMS0zLjMtMTEuMy0xMi41LTMzLjMtMzEuMS00NC4xbC02LjkgLjFjLTUuOS01LjktOS43LTExLjUtMjItOC45LTUuNi0yLTguMS03LTE5LjQtMy40LTQuNi0xLjQtOC45LTQuNC0xMy45LTQuMy0yLjYgLjEtNS41IDEtOC43IDMuNS03LjktMy0xNS41LTQtMjIuMyAyLjEtMTAuNS0xLjMtMTQgMS40LTE2LjUgNC43LTIuMyAwLTE3LjMtMi4zLTI0LjIgNy44LTE3LjMtMi0yMi43IDEwLTE2LjUgMjEuMi0zLjUgNS40LTcuMiAxMC43IDEuMSAyMC45LTIuOSA1LjctMS4xIDExLjkgNS44IDE5LjQtMS44IDggMS44IDEzLjcgOC4xIDE4LjEtMS4yIDExIDEwLjIgMTcuNCAxMy42IDE5LjcgMS4zIDYuNCA0IDEyLjQgMTcuMSAxNS44IDIuMiA5LjUgMTAgMTEuMiAxNy42IDEzLjItMjUuMSAxNC40LTQ2LjYgMzMuMy00Ni41IDc5LjdsLTMuNyA2LjVjLTI4LjggMTcuMi01NC43IDcyLjctMTQuMiAxMTcuNyAyLjYgMTQuMSA3LjEgMjQuMiAxMSAzNS40IDUuOSA0NS4yIDQ0LjUgNjYuMyA1NC42IDY4LjggMTQuOSAxMS4yIDMwLjggMjEuOCA1Mi4yIDI5LjIgMjAuMyAyMC42IDQyLjMgMjguNCA2NC4zIDI4LjRsMSAwYzIyLjEgMCA0NC03LjggNjQuMi0yOC40IDIxLjUtNy40IDM3LjMtMTggNTIuMi0yOS4yIDEwLjItMi41IDQ4LjctMjMuNiA1NC42LTY4LjggMy45LTExLjIgOC40LTIxLjMgMTEtMzUuNCA0MC42LTQ1LjEgMTQuNy0xMDAuNS0xNC0xMTcuN3ptLTIyLjItOGMtMS41IDE4LjctOTguOS02NS4xLTgyLjEtNjcuOSA0NS43LTcuNSA4My42IDE5LjIgODIuMSA2Ny45em0tNDMgOTMuMWMtMjQuNSAxNS44LTU5LjggNS42LTc4LjgtMjIuOHMtMTQuNi02NC4yIDkuOS04MCA1OS44LTUuNiA3OC44IDIyLjggMTQuNiA2NC4yLTkuOSA4MHpNMjU5LjQgMjkuM2MuOCA0LjIgMS44IDYuOCAyLjkgNy42IDUuNC01LjggOS44LTExLjcgMTYuOC0xNy4zIDAgMy4zLTEuNyA2LjggMi41IDkuNCAzLjctNSA4LjgtOS41IDE1LjUtMTMuMy0zLjIgNS42LS42IDcuMyAxLjIgOS42IDUuMS00LjQgMTAtOC44IDE5LjQtMTIuMy0yLjYgMy4xLTYuMiA2LjItMi40IDkuOCA1LjMtMy4zIDEwLjYtNi42IDIzLjEtOC45LTIuOCAzLjEtOC43IDYuMy01LjEgOS40IDYuNi0yLjUgMTQtNC40IDIyLjEtNS40LTMuOSAzLjItNy4xIDYuMy0zLjkgOC44IDcuMS0yLjIgMTYuOS01LjEgMjYuNC0yLjZsLTYgNi4xYy0uNyAuOCAxNC4xIC42IDIzLjkgLjgtMy42IDUtNy4yIDkuNy05LjMgMTguMiAxIDEgNS44IC40IDEwLjQgMC00LjcgOS45LTEyLjggMTIuMy0xNC43IDE2LjYgMi45IDIuMiA2LjggMS42IDExLjIgLjEtMy40IDYuOS0xMC40IDExLjctMTYgMTcuMyAxLjQgMSAzLjkgMS42IDkuNyAuOS01LjIgNS41LTExLjQgMTAuNS0xOC44IDE1IDEuMyAxLjUgNS44IDEuNSAxMCAxLjYtNi43IDYuNS0xNS4zIDkuOS0yMy40IDE0LjIgNCAyLjcgNi45IDIuMSAxMCAyLjEtNS43IDQuNy0xNS40IDcuMS0yNC40IDEwIDEuNyAyLjcgMy40IDMuNCA3LjEgNC4xLTkuNSA1LjMtMjMuMiAyLjktMjcgNS42IC45IDIuNyAzLjYgNC40IDYuNyA1LjgtMTUuNCAuOS01Ny4zLS42LTY1LjQtMzIuMyAxNS43LTE3LjMgNDQuNC0zNy41IDkzLjctNjIuNi0zOC40IDEyLjgtNzMgMzAtMTAyIDUzLjUtMzQuMy0xNS45LTEwLjgtNTUuOSA1LjgtNzEuOHpNMjI1IDE0My45YzI0LjItLjMgNTQuMSAxNy44IDU0IDM0LjctLjEgMTUtMjEgMjcuMS01My44IDI2LjktMzIuMS0uNC01My43LTE1LjItNTMuNi0yOS44IDAtMTEuOSAyNi4yLTMyLjUgNTMuNC0zMS44ek0xMDIgMTMxLjFjMy43LS43IDUuNC0xLjUgNy4xLTQuMS05LTIuOC0xOC43LTUuMy0yNC40LTEwIDMuMSAwIDYgLjcgMTAtMi4xLTguMS00LjMtMTYuNy03LjctMjMuNC0xNC4yIDQuMi0uMSA4LjcgMCAxMC0xLjYtNy40LTQuNS0xMy42LTkuNS0xOC44LTE1IDUuOCAuNyA4LjMgLjEgOS43LS45LTUuNi01LjYtMTIuNy0xMC40LTE2LTE3LjMgNC4zIDEuNSA4LjMgMiAxMS4yLS4xLTEuOS00LjItMTAtNi43LTE0LjctMTYuNiA0LjYgLjQgOS40IDEgMTAuNCAwLTIuMS04LjUtNS44LTEzLjMtOS4zLTE4LjIgOS44LS4xIDI0LjYgMCAyMy45LS44bC02LTYuMWM5LjUtMi41IDE5LjMgLjQgMjYuNCAyLjYgMy4yLTIuNS0uMS01LjYtMy45LTguOCA4LjEgMS4xIDE1LjQgMi45IDIyLjEgNS40IDMuNS0zLjEtMi4zLTYuMy01LjEtOS40IDEyLjUgMi4zIDE3LjggNS42IDIzLjEgOC45IDMuOC0zLjYgLjItNi43LTIuNC05LjggOS40IDMuNCAxNC4zIDcuOSAxOS40IDEyLjMgMS43LTIuMyA0LjQtNCAxLjItOS42IDYuNyAzLjggMTEuOCA4LjMgMTUuNSAxMy4zIDQuMS0yLjYgMi41LTYuMiAyLjUtOS40IDcgNS42IDExLjQgMTEuNSAxNi44IDE3LjMgMS4xLS44IDItMy40IDIuOS03LjYgMTYuNiAxNS45IDQwLjEgNTUuOSA2IDcxLjgtMjktMjMuNS02My42LTQwLjctMTAyLTUzLjUgNDkuMyAyNSA3OCA0NS4zIDkzLjcgNjIuNi04IDMxLjgtNTAgMzMuMi02NS40IDMyLjMgMy4xLTEuNCA1LjgtMy4yIDYuNy01LjgtNC0yLjgtMTcuNi0uNC0yNy4yLTUuNnptNjAuMSAyNC4xYzE2LjggMi44LTgwLjYgODYuNS04Mi4xIDY3LjktMS41LTQ4LjcgMzYuNS03NS41IDgyLjEtNjcuOXpNNTguNyAzNDJjLTIzLjctMTguOC0zMS4zLTczLjcgMTIuNi05OC4zIDI2LjUtNyA5IDEwNy44LTEyLjYgOTguM3ptOTEgOTguMmMtMTMuMyA3LjktNDUuOCA0LjctNjguOC0yNy45LTE1LjUtMjcuNC0xMy41LTU1LjItMi42LTYzLjQgMTYuMy05LjggNDEuNSAzLjQgNjAuOSAyNS42IDE2LjkgMjAgMjQuNiA1NS4zIDEwLjUgNjUuN3pNMTIzLjMgMzIwLjVjLTI0LjUtMTUuOC0yOC45LTUxLjYtOS45LTgwczU0LjMtMzguNiA3OC44LTIyLjggMjguOSA1MS42IDkuOSA4MGMtMTkuMSAyOC40LTU0LjQgMzguNi03OC44IDIyLjh6TTIyNS41IDQ5NmMtMjkuNCAxLjItNTguMi0yMy43LTU3LjgtMzIuMy0uNC0xMi43IDM1LjgtMjIuNiA1OS4zLTIyIDIzLjctMSA1NS42IDcuNSA1NS43IDE4LjkgLjUgMTEtMjguOCAzNS45LTU3LjIgMzUuNHptNTguOS0xMjQuOWMuMiAyOS43LTI2LjIgNTMuOC01OC44IDU0cy01OS4yLTIzLjgtNTkuNC01My40bDAtLjZjLS4yLTI5LjcgMjYuMi01My44IDU4LjgtNTRzNTkuMiAyMy44IDU5LjQgNTMuNGwwIC42em04Mi4yIDQyLjdjLTI1LjMgMzQuNi01OS42IDM1LjktNzIuMyAyNi4zLTEzLjMtMTIuNC0zLjItNTAuOSAxNS4xLTcyIDIwLjktMjMuMyA0My4zLTM4LjUgNTguOS0yNi42IDEwLjUgMTAuMyAxNi43IDQ5LjEtMS43IDcyLjN6bTIyLjktNzMuMmMtMjEuNSA5LjQtMzktMTA1LjMtMTIuNi05OC4zIDQzLjkgMjQuNyAzNi4zIDc5LjYgMTIuNiA5OC4zeiJdCiAgICB9OwogICAgZmFDc3MzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNzczMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjEzYyIsICJNNDgwIDMybC02NCAzNjgtMjIzLjMgODAtMTkyLjctODAgMTkuNi05NC44IDgyIDAtOCA0MC42IDExNi40IDQ0LjQgMTM0LjEtNDQuNCAxOC44LTk3LjEtMzMzLjQgMCAxNi04MiAzMzMuNyAwIDEwLjUtNTIuNy0zMzMuNCAwIDE2LjMtODIgNDA3LjQgMHoiXQogICAgfTsKICAgIGZhSHVic3BvdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJodWJzcG90IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzYjIiLCAiTTIzNS44IDIxMS42Yy0yNS4xIDIzLjctNDAuOCA1Ny4zLTQwLjggOTQuNiAwIDI5LjMgOS43IDU2LjMgMjYgNzhMMTcxLjUgNDM0Yy00LjQtMS42LTkuMS0yLjUtMTQtMi41LTEwLjggMC0yMC45IDQuMi0yOC41IDExLjhzLTExLjggMTcuOC0xMS44IDI4LjYgNC4yIDIwLjkgMTEuOCAyOC41IDE3LjggMTEuNiAyOC41IDExLjZjMTAuOCAwIDIwLjktMy45IDI4LjYtMTEuNiA3LjYtNy42IDExLjgtMTcuOCAxMS44LTI4LjUgMC00LjItLjYtOC4yLTEuOS0xMi4xbDUwLTUwLjJjMjIgMTYuOSA0OS40IDI2LjkgNzkuMyAyNi45IDcxLjkgMCAxMzAtNTguMyAxMzAtMTMwLjIgMC02NS4yLTQ3LjctMTE5LjItMTEwLjItMTI4LjdsMC02MS42YzE3LjUtNy40IDI4LjItMjMuOCAyOC4yLTQyLjkgMC0yNi4xLTIwLjktNDcuOS00Ny00Ny45UzI3OS42IDQ3IDI3OS42IDczLjFjMCAxOS4xIDEwLjcgMzUuNSAyOC4yIDQyLjlsMCA2MS4yYy0xNS4yIDIuMS0yOS42IDYuNy00Mi43IDEzLjYtMjcuNi0yMC45LTExNy41LTg1LjctMTY4LjktMTI0LjggMS4yLTQuNCAyLTkgMi0xMy44IDAtMjguOC0yMy41LTUyLjItNTIuNC01Mi4yLTI4LjggMC01Mi4yIDIzLjQtNTIuMiA1Mi4yIDAgMjguOSAyMy40IDUyLjMgNTIuMiA1Mi4zIDkuOCAwIDE4LjktMi45IDI2LjgtNy42TDIzNS44IDIxMS42em04OS41IDI1LjZhNjkgNjkgMCAxIDEgMCAxMzggNjkgNjkgMCAxIDEgMC0xMzh6Il0KICAgIH07CiAgICBmYUNtcGxpZCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjbXBsaWQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTM2MCIsICJNMjI2LjEgMzg4LjJjMC0uNy0uMi0xLjUtLjYtMi4xcy0xLTEuMS0xLjctMS40Yy0uNS0uMi0xLjEtLjQtMS42LS40bC0xNDkuNiAwYy0zLjEgMC02LjItLjgtOC45LTIuMnMtNS4xLTMuNS02LjktNi4xLTIuOS01LjUtMy4zLTguNiAwLTYuMiAxLjEtOS4xTDgxLjYgMjU1LjdjMi03LjIgNi4yLTEzLjUgMTItMTguMnMxMi45LTcuNCAyMC40LTcuOGwxNDguNiAwYzEuNS0uMSAyLjktLjYgNC0xLjZzMi0yLjIgMi40LTMuNmwxMC44LTQxLjFjLjQtMSAuMy0yLS4xLTIuOXMtMS4yLTEuNi0yLjEtMmMtLjQtLjItLjktLjMtMS40LS4zLS4xIDAtLjEgMC0uMiAwbC0xNDguNSAwYy0yMi4yIDEuMi00My40IDkuMi02MC44IDIzcy0zMCAzMi43LTM2LjIgNTQuMUwzLjUgMzU4LjhjLTMuMiA4LjctNC4yIDE4LTMgMjcuMXM0LjYgMTcuOSA5LjkgMjUuNSAxMi4zIDEzLjggMjAuNSAxOCAxNy4zIDYuNSAyNi41IDYuNmMxIDAgMS45IDAgMi45LS4xbDE0OC42IDBjMS41LS4xIDIuOS0uNyA0LTEuNnMyLTIuMiAyLjQtMy42bDEwLjctNDEuMWMuMi0uNSAuMy0uOSAuMy0xLjR6bTgwLjUtMzA3Yy4yLS40IC4zLS45IC4zLTEuNCAwLS41LS4xLTEtLjMtMS41cy0uNS0uOS0uOC0xLjItLjgtLjYtMS4yLS44LTEtLjMtMS41LS4zbC00MS4yIDBjLTEuNSAuMS0yLjkgLjYtNCAxLjZzLTIgMi4yLTIuNCAzLjZsLTIxLjMgODAuOSA1MS4xIDAgMjEuNC04MC45em0tMTI2LjMgMjg3bDUxLjEgMCAzMi0xMjIuNi01MS4xIDAtMzIgMTIyLjZ6TTUxMS45IDc5LjdjMC0xLS41LTEuOS0xLjItMi42cy0xLjctMS4xLTIuNi0xLjFjLS4xIDAtLjEgMC0uMiAwbC00MSAwYy0xLjUgLjEtMi45IC42LTQuMSAxLjVzLTIgMi4yLTIuNSAzLjZMMzY4LjkgNDMwLjZjLS4yIC40LS4zIC45LS4zIDEuMyAwIDEgLjQgMiAxLjEgMi43czEuNyAxLjEgMi43IDEuMWw0MS4yIDBjMS41LS4xIDIuOS0uNiA0LTEuNnMyLTIuMiAyLjQtMy42TDUxMS41IDgxLjJjLjItLjUgLjMtMSAuMy0xLjV6TTMyNC42IDM4NC41bC00MSAwYy0xLjUgLjEtMi45IC43LTQgMS42cy0yIDIuMi0yLjQgMy42bC0xMC43IDQxLjFjLS4yIC40LS4zIC45LS4zIDEuNCAwIC41IC4xIDEgLjMgMS41cy41IC45IC44IDEuMiAuOCAuNiAxLjIgLjggMSAuMyAxLjUgLjNjLjEgMCAuMiAwIC4zIDBsNDAuOSAwYzEuNS0uMSAyLjktLjYgNC0xLjZzMi0yLjIgMi40LTMuNmwxMC44LTQxLjFjLjItLjYgLjMtMS4yIC4zLTEuOHMtLjMtMS4yLS42LTEuNy0uOC0uOS0xLjMtMS4yLTEuMi0uNC0xLjgtLjRjLS4xIDAtLjIgMC0uMyAwbDAgMHpNNjM2IDc2LjFsLTQxIDBjLTEuNSAuMS0yLjkgLjYtNCAxLjVzLTIgMi4yLTIuNCAzLjZMNDk3LjEgNDMwLjZjLS4yIC40LS4yIC45LS4yIDEuMyAwIDEgLjQgMiAxLjEgMi43czEuNyAxLjEgMi43IDEuMWw0MS4xIDBjMS41LS4xIDIuOS0uNiA0LTEuNnMyLTIuMiAyLjQtMy42TDYzOS43IDgxLjJjLjItLjUgLjMtMSAuMy0xLjUtLjEtMS0uNS0xLjktMS4yLTIuNXMtMS42LTEtMi42LTFjLS4xIDAtLjEgMC0uMiAwbDAtLjF6TTM3MS42IDIyNS4ybDEwLjgtNDEuMWMuMi0uNCAuMi0uOSAuMi0xLjQgMC0xLS40LTItMS4xLTIuN3MtMS43LTEuMS0yLjctMS4xbC00MS4zIDBjLTEuNSAuMS0yLjkgLjctNCAxLjZzLTIgMi4yLTIuNCAzLjZsLTEwLjggNDEuMWMtLjIgLjUtLjMgMS0uMyAxLjVsMCAuMmMuMSAxIC41IDEuOCAxLjIgMi41czEuNiAxIDIuNiAxYy4xIDAgLjIgMCAuMyAwbDQxLjEgMGMxLjUtLjEgMi45LS42IDQtMS42czItMi4yIDIuNC0zLjZ6Il0KICAgIH07CiAgICBmYUR5YWxvZyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJkeWFsb2ciLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjM5OSIsICJNMTYgMzJsMCAxMTkuMiA2NCAwIDAtNTUuMiAxMDcuMiAwQzMwMC42IDk2IDM2OCAxNzYuMiAzNjggMjU1LjkgMzY4IDMzMiAzMDkuNCA0MTYgMTg3LjIgNDE2bC0xNzEuMiAwIDAgNjQgMTcxLjIgMEMzNDcuOSA0ODAgNDMyIDM2Ny4zIDQzMiAyNTUuOSA0MzIgMTk3LjIgNDA5LjkgMTQyLjUgMzY5LjcgMTAxLjYgMzI0LjkgNTYgMjYxLjcgMzIgMTg3LjIgMzJMMTYgMzJ6Il0KICAgIH07CiAgICBmYUVsZW1lbnRvciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJlbGVtZW50b3IiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjQzMCIsICJNLjUgMjU2YzAgMTQxIDExMy42IDI1NSAyNTQuNiAyNTUgMTQyIDAgMjU2LTExNCAyNTYtMjU1IDAtMTQwLTExNC0yNTMuOS0yNTYtMjUzLjktMTQxIDAtMjU0LjYgMTEzLjktMjU0LjYgMjUzLjl6TTE5Mi4xIDE1MGwwIDIxMy00MyAwIDAtMjEzIDQzIDB6bTQyIDBsMTI4IDAgMCA0My0xMjggMCAwLTQzem0xMjggODVsMCA0My0xMjggMCAwLTQzIDEyOCAwem0tMTI4IDg1bDEyOCAwIDAgNDMtMTI4IDAgMC00M3oiXQogICAgfTsKICAgIGZhRmlyc3RPcmRlciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmaXJzdC1vcmRlciIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMmIwIiwgIk0xMy4zIDIyOS4yYy4xLS4xIC4yLS4zIC4zLS40IDAgLjEgMCAuMy0uMSAuNGwtLjIgMHpNMjI0LjQgOTYuNmMtNy4xIDAtMTQuNiAuNi0yMS40IDEuN2wzLjcgNjcuNC0yMi02NGMtMTQuMyAzLjctMjcuNyA5LjQtNDAgMTYuNmwyOS40IDYxLjQtNDUuMS01MC45Yy0xMS40IDguOS0yMS43IDE5LjEtMzAuNiAzMC45bDUwLjYgNDUuNC02MS4xLTI5LjdjLTcuMSAxMi4zLTEyLjkgMjUuNy0xNi42IDQwbDY0LjMgMjIuNi02OC00Yy0uOSA3LjEtMS40IDE0LjYtMS40IDIycy42IDE0LjYgMS40IDIxLjdsNjcuNy00LTY0IDIyLjZjMy43IDE0LjMgOS40IDI3LjcgMTYuNiA0MC4zTDE0OSAzMDYuOSA5OC4xIDM1MmM4LjkgMTEuNyAxOS4xIDIyLjMgMzAuOSAzMC45bDQ0LjktNTAuOS0yOS41IDYxLjRjMTIuMyA3LjQgMjUuNyAxMy4xIDQwIDE2LjlsMjIuMy02NC42LTQgNjhjNy4xIDEuMSAxNC42IDEuNyAyMS43IDEuNyA3LjQgMCAxNC42LS42IDIxLjctMS43bC00LTY4LjYgMjIuNiA2NS4xYzE0LjMtNCAyNy43LTkuNCA0MC0xNi45bC0yOS40LTYxLjMgNDQuOSA1MC45YzExLjctOC45IDIyLTE5LjEgMzAuNi0zMC45bC01MC42LTQ1LjEgNjEuMSAyOS40YzcuMS0xMi4zIDEyLjktMjUuNyAxNi42LTQwLjNsLTY0LTIyLjMgNjcuNCA0YzEuMS03LjEgMS40LTE0LjMgMS40LTIxLjdzLS4zLTE0LjktMS40LTIybC02Ny43IDQgNjQtMjIuM2MtMy43LTE0LjMtOS4xLTI4LTE2LjYtNDAuM2wtNjAuOSAyOS43IDUwLjYtNDUuNGMtOC45LTExLjctMTkuMS0yMi0zMC42LTMwLjlsLTQ1LjEgNTAuOSAyOS40LTYxLjFjLTEyLjMtNy40LTI1LjctMTMuMS00MC0xNi45bC0yMi4zIDY0LjMgNC02Ny43Yy03LjEtMS4yLTE0LjMtMS43LTIxLjctMS43ek00NDMuOCAxMjhMNDQzLjggMzg0IDIyNC40IDUxMiA1IDM4NCA1IDEyOCAyMjQuNCAwIDQ0My44IDEyOHptLTE3LjEgMTAuM2wtMjAyLjMtMTE3LjQtMjAyLjMgMTE3LjQgMCAyMzUuMSAyMDIuMyAxMTcuNyAyMDIuMy0xMTcuNyAwLTIzNS4xek0yMjQuNCAzNy4xbDE4Ny43IDEwOS40IDAgMjE4LjktMTg3LjcgMTA5LjUtMTg3LjctMTA5LjUgMC0yMTguOCAxODcuNy0xMDkuNXptMCA1MC45Yy05Mi4zIDAtMTY2LjkgNzUuMS0xNjYuOSAxNjggMCA5Mi42IDc0LjYgMTY3LjcgMTY2LjkgMTY3LjcgOTIgMCAxNjYuOS03NS4xIDE2Ni45LTE2Ny43IDAtOTIuOS03NC45LTE2OC0xNjYuOS0xNjh6Il0KICAgIH07CiAgICBmYURyaWJiYmxlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImRyaWJiYmxlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxN2QiLCAiTTI1NiA4YTI0OCAyNDggMCAxIDAgMCA0OTYgMjQ4IDI0OCAwIDEgMCAwLTQ5NnpNNDIwIDEyMi40YzI5LjUgMzYgNDcuNCA4MiA0Ny44IDEzMi03LTEuNS03Ny0xNS43LTE0Ny41LTYuOC01LjgtMTQtMTEuMi0yNi40LTE4LjYtNDEuNiA3OC4zLTMyIDExMy44LTc3LjUgMTE4LjMtODMuNXpNMzk2LjQgOTcuOWMtMy44IDUuNC0zNS43IDQ4LjMtMTExIDc2LjUtMzQuNy02My44LTczLjItMTE2LjItNzktMTI0IDY3LjItMTYuMiAxMzggMS4zIDE5MC4xIDQ3LjV6TTE2NS45IDY0LjZjNS42IDcuNyA0My40IDYwLjEgNzguNSAxMjIuNS05OS4xIDI2LjMtMTg2LjQgMjUuOS0xOTUuOCAyNS44IDEzLjctNjUuNyA1OC0xMjAuNCAxMTcuMy0xNDguM3pNNDQuMiAyNTYuM2MwLTIuMiAwLTQuMyAuMS02LjUgOS4zIC4yIDExMS45IDEuNSAyMTcuNy0zMC4xIDYuMSAxMS45IDExLjkgMjMuOSAxNy4yIDM1LjktNzYuNiAyMS42LTE0Ni4yIDgzLjUtMTgwLjUgMTQyLjMtMzMuOC0zNy42LTU0LjUtODcuMi01NC41LTE0MS42ek0xMjYgNDIzLjRjMjIuMS00NS4yIDgyLjItMTAzLjYgMTY3LjYtMTMyLjggMjkuNyA3Ny4zIDQyIDE0Mi4xIDQ1LjIgMTYwLjYtNjguMSAyOS0xNTAgMjEuMS0yMTIuOC0yNy45em0yNDguNCA4LjVjLTIuMi0xMi45LTEzLjQtNzQuOS00MS4yLTE1MSA2Ni40LTEwLjYgMTI0LjcgNi44IDEzMS45IDkuMS05LjQgNTguOS00My4zIDEwOS44LTkwLjggMTQyeiJdCiAgICB9OwogICAgZmFMaW5rZWRpbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJsaW5rZWRpbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMDhjIiwgIk00MTYgMzJMMzEuOSAzMkMxNC4zIDMyIDAgNDYuNSAwIDY0LjNMMCA0NDcuN0MwIDQ2NS41IDE0LjMgNDgwIDMxLjkgNDgwTDQxNiA0ODBjMTcuNiAwIDMyLTE0LjUgMzItMzIuM2wwLTM4My40QzQ0OCA0Ni41IDQzMy42IDMyIDQxNiAzMnpNMTM1LjQgNDE2bC02Ni40IDAgMC0yMTMuOCA2Ni41IDAgMCAyMTMuOC0uMSAwek0xMDIuMiA5NmEzOC41IDM4LjUgMCAxIDEgMCA3NyAzOC41IDM4LjUgMCAxIDEgMC03N3pNMzg0LjMgNDE2bC02Ni40IDAgMC0xMDRjMC0yNC44LS41LTU2LjctMzQuNS01Ni43LTM0LjYgMC0zOS45IDI3LTM5LjkgNTQuOWwwIDEwNS44LTY2LjQgMCAwLTIxMy44IDYzLjcgMCAwIDI5LjIgLjkgMGM4LjktMTYuOCAzMC42LTM0LjUgNjIuOS0zNC41IDY3LjIgMCA3OS43IDQ0LjMgNzkuNyAxMDEuOWwwIDExNy4yeiJdCiAgICB9OwogICAgZmFDY1BheXBhbCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjYy1wYXlwYWwiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjFmNCIsICJNMTg2LjMgMjU4LjJjMCAxMi4yLTkuNyAyMS41LTIyIDIxLjUtOS4yIDAtMTYtNS4yLTE2LTE1IDAtMTIuMiA5LjUtMjIgMjEuNy0yMiA5LjMgMCAxNi4zIDUuNyAxNi4zIDE1LjV6TTgwLjUgMjA5LjdsLTQuNyAwYy0xLjUgMC0zIDEtMy4yIDIuN2wtNC4zIDI2LjcgOC4yLS4zYzExIDAgMTkuNS0xLjUgMjEuNS0xNC4yIDIuMy0xMy40LTYuMi0xNC45LTE3LjUtMTQuOXptMjg0IDBsLTQuNSAwYy0xLjggMC0zIDEtMy4yIDIuN2wtNC4yIDI2LjcgOC0uM2MxMyAwIDIyLTMgMjItMTgtLjEtMTAuNi05LjYtMTEuMS0xOC4xLTExLjF6TTU3NiA4MGwwIDM1MmMwIDI2LjUtMjEuNSA0OC00OCA0OEw0OCA0ODBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4TDAgODBDMCA1My41IDIxLjUgMzIgNDggMzJsNDgwIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDh6TTEyOC4zIDIxNS40YzAtMjEtMTYuMi0yOC0zNC43LTI4bC00MCAwYy0yLjUgMC01IDItNS4yIDQuN0wzMiAyOTQuMmMtLjMgMiAxLjIgNCAzLjIgNGwxOSAwYzIuNyAwIDUuMi0yLjkgNS41LTUuN2w0LjUtMjYuNmMxLTcuMiAxMy4yLTQuNyAxOC00LjcgMjguNiAwIDQ2LjEtMTcgNDYuMS00NS44em04NC4yIDguOGwtMTkgMGMtMy44IDAtNCA1LjUtNC4yIDguMi01LjgtOC41LTE0LjItMTAtMjMuNy0xMC0yNC41IDAtNDMuMiAyMS41LTQzLjIgNDUuMiAwIDE5LjUgMTIuMiAzMi4yIDMxLjcgMzIuMiA5IDAgMjAuMi00LjkgMjYuNS0xMS45LS41IDEuNS0xIDQuNy0xIDYuMiAwIDIuMyAxIDQgMy4yIDRsMTcuMiAwYzIuNyAwIDUtMi45IDUuNS01LjdsMTAuMi02NC4zYy4zLTEuOS0xLjItMy45LTMuMi0zLjl6TTI1MyAzMjIuMWw2My43LTkyLjZjLjUtLjUgLjUtMSAuNS0xLjcgMC0xLjctMS41LTMuNS0zLjItMy41bC0xOS4yIDBjLTEuNyAwLTMuNSAxLTQuNSAyLjVsLTI2LjUgMzktMTEtMzcuNWMtLjgtMi4yLTMtNC01LjUtNGwtMTguNyAwYy0xLjcgMC0zLjIgMS44LTMuMiAzLjUgMCAxLjIgMTkuNSA1Ni44IDIxLjIgNjIuMS0yLjcgMy44LTIwLjUgMjguNi0yMC41IDMxLjYgMCAxLjggMS41IDMuMiAzLjIgMy4ybDE5LjIgMGMxLjgtLjEgMy41LTEuMSA0LjUtMi42ek00MTIuMyAyMTUuNGMwLTIxLTE2LjItMjgtMzQuNy0yOGwtMzkuNyAwYy0yLjcgMC01LjIgMi01LjUgNC43bC0xNi4yIDEwMmMtLjIgMiAxLjMgNCAzLjIgNGwyMC41IDBjMiAwIDMuNS0xLjUgNC0zLjJsNC41LTI5YzEtNy4yIDEzLjItNC43IDE4LTQuNyAyOC40IDAgNDUuOS0xNyA0NS45LTQ1Ljh6bTg0LjIgOC44bC0xOSAwYy0zLjggMC00IDUuNS00LjMgOC4yLTUuNS04LjUtMTQtMTAtMjMuNy0xMC0yNC41IDAtNDMuMiAyMS41LTQzLjIgNDUuMiAwIDE5LjUgMTIuMiAzMi4yIDMxLjcgMzIuMiA5LjMgMCAyMC41LTQuOSAyNi41LTExLjktLjMgMS41LTEgNC43LTEgNi4yIDAgMi4zIDEgNCAzLjIgNGwxNy4zIDBjMi43IDAgNS0yLjkgNS41LTUuN2wxMC4yLTY0LjNjLjMtMS45LTEuMi0zLjktMy4yLTMuOXpNNTQ0IDE5MC45YzAtMi0xLjUtMy41LTMuMi0zLjVsLTE4LjUgMGMtMS41IDAtMyAxLjItMy4yIDIuN2wtMTYuMiAxMDQtLjMgLjVjMCAxLjggMS41IDMuNSAzLjUgMy41bDE2LjUgMGMyLjUgMCA1LTIuOSA1LjItNS43bDE2LjItMTAxLjIgMC0uM3ptLTkwIDUxLjhjLTEyLjIgMC0yMS43IDkuNy0yMS43IDIyIDAgOS43IDcgMTUgMTYuMiAxNSAxMiAwIDIxLjctOS4yIDIxLjctMjEuNSAuMS05LjgtNi45LTE1LjUtMTYuMi0xNS41eiJdCiAgICB9OwogICAgZmFEaGwgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZGhsIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY3OTAiLCAiTTIzOCAzMDEuMmw1OC43IDAgMjIuMy0zMC4yLTU4LjcgMC0yMi4zIDMwLjJ6TTAgMjgyLjlsMCA2LjQgODEuOCAwIDQuNy02LjQtODYuNSAwek0xNzIuOSAyNzFjLTguNyAwLTYtMy42LTQuNi01LjUgMi44LTMuOCA3LjYtMTAuNCAxMC40LTE0LjFzMi44LTUuOS0yLjgtNS45bC01MSAwLTQxLjEgNTUuOCAxMDAuMSAwYzMzLjEgMCA1MS41LTIyLjUgNTcuMi0zMC4zbC02OC4yIDB6bTMxNy41LTYuOWwzOS4zLTUzLjQtNjIuMiAwLTM5LjMgNTMuNCA2Mi4yIDB6TTk1LjMgMjcxbC05NS4zIDAgMCA2LjQgOTAuNiAwIDQuNy02LjR6bTExMS0yNi42Yy0yLjggMy44LTcuNSAxMC40LTEwLjMgMTQuMi0xLjQgMi00LjEgNS41IDQuNiA1LjVsNDUuNiAwczcuMy0xMCAxMy41LTE4LjRjOC40LTExLjQgLjctMzUtMjkuMi0zNWwtMTE3LjkgMC0yMC40IDI3LjggMTExLjQgMGM1LjYgMCA1LjUgMi4yIDIuNyA1Ljl6TTAgMzAxLjJsNzMuMSAwIDQuNy02LjQtNzcuOCAwIDAgNi40em0zMjMgMGw1OC43IDAgMjIuMy0zMC4yLTU4LjcgMGMtLjEgMC0yMi4zIDMwLjItMjIuMyAzMC4yem0yMjIgLjFsOTUgMCAwLTYuNC05MC4zIDAtNC43IDYuNHpNNTY3LjMgMjcxbC00LjcgNi40IDc3LjQgMCAwLTYuNC03Mi43IDB6bS0xMy41IDE4LjNsODYuMiAwIDAtNi40LTgxLjUgMC00LjcgNi40ek0zODkuNiAyMTAuN2wtMjIuNSAzMC42LTI2LjIgMCAyMi41LTMwLjYtNTguNyAwLTM5LjMgNTMuNCAxNDMuNiAwIDM5LjMtNTMuNC01OC43IDB6TTQyMy4xIDI3MXMtNC4zIDUuOS02LjQgOC43Yy03LjQgMTAtLjkgMjEuNiAyMy4yIDIxLjZsOTQuMyAwIDIyLjMtMzAuMy0xMzMuNCAweiJdCiAgICB9OwogICAgZmFUZXggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidGV4IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU3ZmYiLCAiTTYyMC44IDk1LjRjLTMwLjggLjQtNDIuMSAxNi42LTQ3LjcgMjQuNWwtLjEgLjEtNTUuNyA4MC41IDgyLjggMTIxLjFjNy41IDEwLjYgMTEuMyAxMi41IDM1LjQgMTIuNWwwIDkuMWMtOS4xLS43LTI4LS43LTM3LjctLjctMTIuNCAwLTMwLjggMC00Mi45IC43bDAtOS4xYzEzLjItLjggMTYuNi03LjMgMTYuNi0xMC4yIDAtMS4xIDAtMi4zLTMtNi40bC02NS41LTk2LjMtNjAuMiA4Ny45Yy0xLjkgMi43LTMuOCA1LjQtMy44IDEwLjIgMCA2LjEgMy40IDEzLjYgMTUgMTQuN2wwIDkuMWMtOS40LS43LTI3LjEtLjctMzcuMi0uN2wtMi44IDAtMTEuNyA4Mi42LTE5NS45IDAgMC05LjFjMjYuNyAwIDMwLjkgMCAzMC45LTE2LjlsMC0yMDMuMmMwLTE2LjktNC4zLTE2LjktMzAuOS0xNi45bDAtMTAuMyAxOS44IDBjLTQuOC02MS4xLTEwLjgtNzEuNy02OC03MS44bC0yMC43IDBjLTYuOCAxLjUtNi44IDYuMS02LjggMTQuNGwwIDIwNWMwIDEzLjYgMS4xIDE3LjggMzIuNCAxNy44bDEwLjUgMCAwIDkuMS0uNCAwYy0xNy45LS4zLTM2LjctLjctNTQuOS0uN3MtMzYuOSAuMy01NC44IC43bC0uNiAwIDAtOS4xIDEwLjcgMGMzMS43IDAgMzIuOC00LjEgMzIuOC0xNy44bDAtMjA1YzAtOC43IDAtMTMuMi03LjItMTQuM2wtMjAuOCAwYy01OC40IDAtNjMuNyAxMC45LTY4LjYgNzMuM2wtNi44IDAgNi4zLTgzLjMgMjE3LjUgMCA2LjEgODEuOCAxNjQuMSAwIDkgODMuMy02LjggMGMtNS4zLTQ5LjgtMTIuMS03My03MC4zLTczbC01MS41IDBjLTE1IDAtMTUuOCAxLjktMTUuOCAxNC42bDAgOTMuMyAzNS41IDBjMzUuNSAwIDM4LjktMTIuOCAzOC45LTQ0bDYgMCAwIDk3LjktNiAwYzAtMzEuOC0zLjQtNDQuOC0zOC45LTQ0LjhsLTM1LjUgMCAwIDEwNS4yYzAgMTMgLjcgMTQuOCAxNS44IDE0LjhsNTIuMiAwYzYxLjEgMCA2OS45LTI1LjggNzcuNC03My42LTcuNyAwLTE2LjMgLjItMjIuMiAuN2wwLTkuMWM3LjIgMCAzMS43LS40IDQ3LjgtMjMuOGw2NS41LTk1LjctNzIuNy0xMDYuN2MtOC4zLTExLjctMTUuMS0xMi41LTM1LjgtMTIuNWwwLTkuMWM5LjEgLjcgMjcuOSAuNyAzNy43IC43IDEyLjQgMCAzMC44IDAgNDIuOS0uN2wwIDkuMWMtMTIuNSAuNC0xNi42IDYuOC0xNi42IDEwLjIgMCAxLjEgLjQgMi4zIDMgNi40bDU1LjcgODEuNiA0OS43LTcyLjFjMi43LTMuNyA0LjUtNi44IDQuNS0xMS4zIDAtNi4xLTMtMTMuNi0xNS0xNC44bDAtOS4xYzkuNCAuNyAyNC44IC43IDM3LjIgLjcgOSAwIDIzLjMgMCAzMi0uN2wwIDkuMXoiXQogICAgfTsKICAgIGZhQ2xhdWRlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNsYXVkZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlODYxIiwgIk0xMDAuNCAzNDAuNWwxMDAuNy01Ni41IDEuNy00LjktMS43LTIuNy00LjkgMC0xNi44LTEtNTcuNS0xLjYtNDkuOS0yLjEtNDguMy0yLjYtMTIuMi0yLjYtMTEuNC0xNSAxLjItNy41IDEwLjItNi45IDE0LjcgMS4zYzE4LjkgMS4zIDQ1LjkgMy4xIDgxIDUuNmwzNS4yIDIuMSA1Mi4yIDUuNCA4LjMgMCAxLjItMy40LTIuOC0yLjEtMi4yLTIuMS01MC4zLTM0LjEtNTQuNC0zNi0yOC41LTIwLjctMTUuNC0xMC41LTcuOC05LjgtMy40LTIxLjUgMTQtMTUuNCAxOC44IDEuMyA0LjggMS4zIDE5IDE0LjcgNDAuNyAzMS41IDUzLjEgMzkuMSA3LjggNi41IDMuMS0yLjIgLjQtMS42LTMuNS01LjgtMjguOS01Mi4yLTMwLjgtNTMuMS0xMy43LTIyLTMuNi0xMy4yYy0xLjMtNS40LTIuMi0xMC0yLjItMTUuNWwxNS45LTIxLjYgOC44LTIuOCAyMS4yIDIuOCA4LjkgNy44IDEzLjIgMzAuMiAyMS40IDQ3LjUgMzMuMiA2NC42IDkuNyAxOS4yIDUuMiAxNy44IDEuOSA1LjQgMy40IDAgMC0zLjEgMi43LTM2LjQgNS00NC43IDQuOS01Ny41IDEuNy0xNi4yIDgtMTkuNCAxNS45LTEwLjUgMTIuNCA1LjkgMTAuMiAxNC43LTEuNCA5LjUtNi4xIDM5LjUtMTEuOSA2MS45LTcuOCA0MS41IDQuNSAwIDUuMi01LjIgMjEtMjcuOCAzNS4yLTQ0LjEgMTUuNS0xNy41IDE4LjEtMTkuMyAxMS42LTkuMiAyMiAwIDE2LjIgMjQuMS03LjMgMjQuOS0yMi43IDI4LjctMTguOCAyNC40LTI3IDM2LjMtMTYuOCAyOSAxLjYgMi4zIDQtLjQgNjAuOS0xMyAzMi45LTUuOSAzOS4zLTYuNyAxNy44IDguMyAxLjkgOC40LTcgMTcuMi00MiAxMC40LTQ5LjIgOS44LTczLjMgMTcuMy0uOSAuNyAxIDEuMyAzMyAzLjEgMTQuMSAuOCAzNC42IDAgNjQuNCA0LjggMTYuOCAxMS4xIDEwLjEgMTMuNi0xLjcgMTAuNC0yNS45IDEzLjJjLTE1LjUtMy43LTU0LjQtMTIuOS0xMTYuNi0yNy43bC0yOC03LTMuOSAwIDAgMi4zIDIzLjMgMjIuOCA0Mi43IDM4LjYgNTMuNSA0OS44IDIuNyAxMi4zLTYuOSA5LjctNy4zLTEtNDctMzUuNC0xOC4xLTE1LjktNDEuMS0zNC42LTIuNyAwIDAgMy42IDkuNSAxMy45IDUwIDc1LjIgMi42IDIzLTMuNiA3LjUtMTMgNC41LTE0LjItMi42LTI5LjMtNDEuMS0zMC4yLTQ2LjMtMjQuNC00MS41LTMgMS43LTE0LjQgMTU0LjgtNi43IDcuOS0xNS41IDUuOS0xMy05LjgtNi45LTE1LjkgNi45LTMxLjUgOC4zLTQxLjEgNi43LTMyLjcgNi4xLTQwLjYgMy42LTEzLjUtLjItLjktMyAuNC0zMC42IDQyLTQ2LjUgNjIuOS0zNi44IDM5LjQtOC44IDMuNS0xNS4zLTcuOSAxLjQtMTQuMSA4LjUtMTIuNiA1MC45LTY0LjggMzAuNy00MC4yIDE5LjgtMjMuMi0uMS0zLjQtMS4yIDAtMTM1LjMgODcuOC0yNC4xIDMuMS0xMC40LTkuNyAxLjMtMTUuOSA0LjktNS4yIDQwLjctMjgtLjEgLjEgMCAuMXoiXQogICAgfTsKICAgIGZhU2hvcGlmeSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzaG9waWZ5IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImUwNTciLCAiTTM4OC41IDEwNC4xYy0uMi0xLjEtLjctMi4xLTEuNS0yLjhzLTEuOC0xLjItMi45LTEuMmMtMiAwLTM3LjItLjgtMzcuMi0uOHMtMjEuNi0yMC44LTI5LjYtMjguOGwwIDQzMi43IDEyNS43LTMxLjJzLTU0LTM2NS41LTU0LjQtMzY3Ljl6TTI4OC45IDcwLjVjLTEuOS02LjEtNC4zLTExLjktNy4yLTE3LjYtMTAuNC0yMC0yNi0zMC45LTQ0LjQtMzAuOS0xLjMgMC0yLjcgLjEtNCAuNC0uNC0uOC0xLjItMS4yLTEuNi0yLTgtOC44LTE4LjQtMTIuOC0zMC44LTEyLjQtMjQgLjgtNDggMTgtNjcuMiA0OC44LTEzLjYgMjEuNi0yNCA0OC44LTI2LjggNzAuMS0yNy42IDguNC00Ni44IDE0LjQtNDcuMiAxNC44LTE0IDQuNC0xNC40IDQuOC0xNiAxOC0xLjIgMTAtMzggMjkxLjgtMzggMjkxLjhsMzAyLjYgNTIuNSAwLTQzOC4zYy0xLjUgLjEtMi45IC4yLTQuNCAuNCAwIDAtNS42IDEuNi0xNC44IDQuNHpNMjMzLjYgODcuN2MtMTYgNC44LTMzLjYgMTAuNC01MC44IDE1LjYgNC44LTE4LjggMTQuNC0zNy42IDI1LjYtNTAgNC40LTQuNCAxMC40LTkuNiAxNy4yLTEyLjggNi44IDE0LjQgOC40IDM0IDggNDcuMnpNMjAwLjggMjQuNGM1LS4yIDEwIDEuMSAxNC40IDMuNi02LjQgMy4yLTEyLjggOC40LTE4LjggMTQuNC0xNS4yIDE2LjQtMjYuOCA0Mi0zMS42IDY2LjUtMTQuNCA0LjQtMjguOCA4LjgtNDIgMTIuOCA4LjgtMzguNCA0MS4yLTk2LjQgNzgtOTcuMnpNMTU0LjQgMjQ0LjZjMS42IDI1LjYgNjkuMiAzMS4yIDczLjIgOTEuNyAyLjggNDcuNi0yNS4yIDgwLjEtNjUuNiA4Mi41LTQ4LjggMy4yLTc1LjYtMjUuNi03NS42LTI1LjZsMTAuNC00NHMyNi44IDIwLjQgNDguNCAxOC44YzE0LS44IDE5LjItMTIuNCAxOC44LTIwLjQtMi0zMy42LTU3LjItMzEuNi02MC44LTg2LjktMy4yLTQ2LjQgMjcuMi05My4zIDk0LjUtOTcuNyAyNi0xLjYgMzkuMiA0LjggMzkuMiA0LjhsLTE1LjIgNTcuNnMtMTcuMi04LTM3LjYtNi40Yy0yOS42IDItMzAgMjAuOC0yOS42IDI1LjZ6TTI0OS42IDgyLjljMC0xMi0xLjYtMjkuMi03LjItNDMuNiAxOC40IDMuNiAyNy4yIDI0IDMxLjIgMzYuNC03LjIgMi0xNS4yIDQuNC0yNCA3LjJ6Il0KICAgIH07CiAgICBmYVNxdWFyZVJlZGRpdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtcmVkZGl0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInJlZGRpdC1zcXVhcmUiXSwgImYxYTIiLCAiTTY0IDMybDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMnpNMzA1LjkgMTY2LjRjMjAuNiAwIDM3LjMtMTYuNyAzNy4zLTM3LjNzLTE2LjctMzcuMy0zNy4zLTM3LjNjLTE4IDAtMzMuMSAxMi44LTM2LjYgMjkuOC0zMC4yIDMuMi01My44IDI4LjgtNTMuOCA1OS45bDAgLjJjLTMyLjggMS40LTYyLjggMTAuNy04Ni42IDI1LjUtOC44LTYuOC0xOS45LTEwLjktMzItMTAuOS0yOC45IDAtNTIuMyAyMy40LTUyLjMgNTIuMyAwIDIxIDEyLjMgMzkgMzAuMSA0Ny40IDEuNyA2MC43IDY3LjkgMTA5LjYgMTQ5LjMgMTA5LjZzMTQ3LjYtNDguOSAxNDkuMy0xMDkuN2MxNy43LTguNCAyOS45LTI2LjQgMjkuOS00Ny4zIDAtMjguOS0yMy40LTUyLjMtNTIuMy01Mi4zLTEyIDAtMjMgNC0zMS45IDEwLjgtMjQtMTQuOS01NC4zLTI0LjItODcuNS0yNS40bDAtLjFjMC0yMi4yIDE2LjUtNDAuNyAzNy45LTQzLjcgMy45IDE2LjUgMTguNyAyOC43IDM2LjMgMjguN2wuMi0uMnpNMTU1IDI0OC4xYzE0LjYgMCAyNS44IDE1LjQgMjUgMzQuNHMtMTEuOCAyNS45LTI2LjUgMjUuOS0yNy41LTcuNy0yNi42LTI2LjcgMTMuNS0zMy41IDI4LjEtMzMuNWwwLS4xem0xNjYuNCAzMy41Yy45IDE5LTEyIDI2LjctMjYuNiAyNi43cy0yNS42LTYuOS0yNi41LTI1LjkgMTAuMy0zNC40IDI1LTM0LjQgMjcuMyAxNC42IDI4LjEgMzMuNWwwIC4xem0tNDIuMSA0OS42Yy05IDIxLjUtMzAuMyAzNi43LTU1LjEgMzYuN3MtNDYuMS0xNS4xLTU1LjEtMzYuN2MtMS4xLTIuNiAuNy01LjQgMy40LTUuNyAxNi4xLTEuNiAzMy41LTIuNSA1MS43LTIuNXMzNS42IC45IDUxLjcgMi41YzIuNyAuMyA0LjUgMy4xIDMuNCA1Ljd6Il0KICAgIH07CiAgICBmYVJlZGRpdFNxdWFyZSA9IGZhU3F1YXJlUmVkZGl0OwogICAgZmFDcmVhdGl2ZUNvbW1vbnNOYyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjcmVhdGl2ZS1jb21tb25zLW5jIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0ZTgiLCAiTTI1NS42IDhDMzk1LjQgOCA1MDQgMTE1LjkgNTA0IDI1NiA1MDQgNDAzLjIgMzg1LjUgNTA0IDI1NS42IDUwNCAxMjEuMSA1MDQgOCAzOTMuMiA4IDI1NiA4IDEyMy4xIDExMi43IDggMjU1LjYgOHpNNjMuOCAxODkuMWMtNy40IDIwLjQtMTEuMSA0Mi43LTExLjEgNjYuOSAwIDExMC45IDkyLjEgMjAyLjQgMjAzLjcgMjAyLjQgMTIyLjQgMCAxNzcuMi0xMDEuOCAxNzguNS0xMDQuMWwtOTMuNC00MS42Yy03LjcgMzcuMS00MS4yIDUzLTY4LjIgNTUuNGwwIDM4LjEtMjguOCAwIDAtMzguMmMtMjcuNS0uMy01Mi42LTEwLjItNzUuMy0yOS43bDM0LjEtMzQuNWMzMS43IDI5LjQgODYuNCAzMS44IDg2LjQtMi4yIDAtNi4yLTIuMi0xMS4yLTYuNi0xNS4xLTE0LjItNi0xLjgtLjEtMjE5LjMtOTcuNHpNMjU2LjQgNTIuM0MyMTggNTIuMyAxNDQgNjEgODUuOSAxNDUuM2w5NC44IDQyLjVjMTAtMzEuMyA0MC40LTQyLjkgNjMuOC00NC4zbDAtMzguMSAyOC44IDAgMCAzOC4xYzIyLjcgMS4yIDQzLjQgOC45IDYyIDIzTDMwMyAxOTkuN2MtNDIuNy0yOS45LTgzLjUtOC03MCAxMS4xIDUzLjQgMjQuMSA0My44IDE5LjggOTMgNDEuNmwxMjcuMSA1Ni43YzQuMS0xNy40IDYuMi0zNS4xIDYuMi01My4xIDAtNTctMTkuOC0xMDUtNTkuMy0xNDMuOS0zOS4zLTM5LjktODcuMi01OS44LTE0My42LTU5Ljh6Il0KICAgIH07CiAgICBmYUdhbGFjdGljUmVwdWJsaWMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZ2FsYWN0aWMtcmVwdWJsaWMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjUwYyIsICJNMjU2IDhhMjQ4IDI0OCAwIDEgMSAwIDQ5NiAyNDggMjQ4IDAgMSAxIDAtNDk2em0wIDE2LjVhMjMxLjUgMjMxLjUgMCAxIDAgMCA0NjIuOSAyMzEuNSAyMzEuNSAwIDEgMCAwLTQ2Mi45em0yNy42IDIxLjhsMCAyNC42YzMwLjMgNC41IDU5IDE2LjMgODMuNiAzNC41bDE3LjQtMTcuNGMtMjguNy0yMi4xLTYzLjMtMzYuOS0xMDEtNDEuOHptLTU1LjQgLjFjLTM3LjYgNC45LTcyLjIgMTkuOC0xMDAuOSA0MS45bDE3LjMgMTcuNCAuMSAwYzI0LjEtMTcuOCA1Mi42LTMwLjEgODMuNS0zNC43bDAtMjQuNXptMTIuMiA1MC4ybDAgODIuOWMtMTAgMi0xOS40IDUuOS0yNy43IDExLjRsLTU4LjYtNTguNi0yMS45IDIxLjkgNTguNyA1OC43Yy01LjUgOC4yLTkuNCAxNy42LTExLjUgMjcuNmwtODIuOSAwIDAgMzEgODIuOSAwYzIgMTAgNiAxOS4zIDExLjUgMjcuNWwtNTguNyA1OC43IDIxLjkgMjEuOSA1OC42LTU4LjZjOC40IDUuNiAxNy44IDkuNSAyNy43IDExLjVsMCA4Mi45IDMxIDAgMC04Mi45YzEwLTIgMTkuNC02LjEgMjcuNi0xMS41bDU4LjcgNTguNyAyMS45LTIxLjktNTguNy01OC43YzUuNS04LjIgOS41LTE3LjUgMTEuNS0yNy41bDgyLjkgMCAwLTMxLTgyLjkgMGMtMi0xMC02LTE5LjQtMTEuNS0yNy42bDU4LjctNTguNy0yMS45LTIxLjktNTguNyA1OC43Yy04LjItNS41LTE3LjYtOS41LTI3LjYtMTEuNWwwLTgyLjktMzEgMHptMTgzLjIgMzAuN2wtMTcuNCAxNy40YzE4LjMgMjQuNiAzMC4yIDUzLjQgMzQuNyA4My43bDI0LjYgMGMtNS0zNy43LTE5LjgtNzIuMy00MS45LTEwMXptLTMzNS42IC4xYy0yMi4xIDI4LjctMzYuOSA2My4zLTQxLjggMTAwLjlsMjQuNiAwYzQuNi0zMSAxNi44LTU5LjQgMzQuNi04My41TDg4LjIgMTI3LjR6TTQ2LjMgMjgzLjdjNC45IDM3LjYgMTkuNyA3Mi4yIDQxLjggMTAwLjlsMTcuNC0xNy40Qzg3LjcgMzQzLjEgNzUuNiAzMTQuNiA3MSAyODMuN2wtMjQuNiAwIDAgMHptMzk0LjcgMGMtNC42IDMxLTE2LjggNTkuNS0zNC43IDgzLjZsMTcuNCAxNy40YzIyLjEtMjguNyAzNy02My4zIDQxLjktMTAxbC0yNC42IDB6TTE0NC43IDQwNi40bC0xNy40IDE3LjRjMjguNyAyMi4xIDYzLjMgMzcgMTAxIDQxLjlsMC0yNC42Yy0zMS00LjYtNTkuNS0xNi44LTgzLjYtMzQuNnptMjIyLjUgMGMtMjQuMSAxNy44LTUyLjYgMzAuMS04My42IDM0LjdsMCAyNC42YzM3LjctNC45IDcyLjItMTkuOCAxMDEtNDEuOGwtMTcuMy0xNy40LS4xIDB6Il0KICAgIH07CiAgICBmYUZhY2Vib29rID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImZhY2Vib29rIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjJlM10sICJmMDlhIiwgIk01MTIgMjU2QzUxMiAxMTQuNiAzOTcuNCAwIDI1NiAwUzAgMTE0LjYgMCAyNTZDMCAzNzYgODIuNyA0NzYuOCAxOTQuMiA1MDQuNWwwLTE3MC4zLTUyLjggMCAwLTc4LjIgNTIuOCAwIDAtMzMuN2MwLTg3LjEgMzkuNC0xMjcuNSAxMjUtMTI3LjUgMTYuMiAwIDQ0LjIgMy4yIDU1LjcgNi40bDAgNzAuOGMtNi0uNi0xNi41LTEtMjkuNi0xLTQyIDAtNTguMiAxNS45LTU4LjIgNTcuMmwwIDI3LjggODMuNiAwLTE0LjQgNzguMi02OS4zIDAgMCAxNzUuOUM0MTMuOCA0OTQuOCA1MTIgMzg2LjkgNTEyIDI1NnoiXQogICAgfTsKICAgIGZhR2l0bGFiID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdpdGxhYiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjk2IiwgIk01MDQgMjA0LjZsLS43LTEuOC02OS43LTE4MS44Yy0xLjQtMy42LTMuOS02LjYtNy4yLTguNi0yLjQtMS42LTUuMS0yLjUtOC0yLjhzLTUuNyAuMS04LjQgMS4xLTUuMSAyLjctNy4xIDQuOGMtMS45IDIuMS0zLjMgNC43LTQuMSA3LjRsLTQ3IDE0NC0xOTAuNSAwLTQ3LjEtMTQ0Yy0uOC0yLjgtMi4yLTUuMy00LjEtNy40LTItMi4xLTQuNC0zLjctNy4xLTQuOC0yLjYtMS01LjUtMS40LTguNC0xLjFzLTUuNiAxLjItOCAyLjhjLTMuMiAyLTUuOCA1LjEtNy4yIDguNkw5LjggMjAyLjggOSAyMDQuNmMtMTAgMjYuMi0xMS4zIDU1LTMuNSA4MiA3LjcgMjYuOSAyNCA1MC43IDQ2LjQgNjcuNmwuMyAuMiAuNiAuNCAxMDYgNzkuNWMzOC41IDI5LjEgNjYuNyA1MC4zIDg0LjYgNjMuOSAzLjcgMS45IDguMyA0LjMgMTMgNC4zczkuMy0yLjQgMTMtNC4zYzE3LjktMTMuNSA0Ni4xLTM0LjkgODQuNi02My45bDEwNi43LTc5LjkgLjMtLjNjMjIuNC0xNi45IDM4LjctNDAuNiA0NS42LTY3LjUgOC42LTI3IDcuNC01NS44LTIuNi04MnoiXQogICAgfTsKICAgIGZhUXEgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicXEiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjFkNiIsICJNNDM0LjEgNDIwLjRjLTExLjUgMS40LTQ0LjktNTIuNy00NC45LTUyLjcgMCAzMS4zLTE2LjEgNzIuMi01MSAxMDEuOCAxNi44IDUuMiA1NC44IDE5LjIgNDUuOCAzNC40LTcuMyAxMi4zLTEyNS41IDcuOS0xNTkuNiA0LTM0LjEgMy44LTE1Mi4zIDguMy0xNTkuNi00LTktMTUuMiAyOC45LTI5LjIgNDUuOC0zNC40LTM0LjktMjkuNS01MS4xLTcwLjQtNTEuMS0xMDEuOCAwIDAtMzMuMyA1NC4xLTQ0LjkgNTIuNy01LjQtLjYtMTIuNC0yOS42IDkuMy05OS43IDEwLjMtMzMgMjItNjAuNSA0MC4xLTEwNS44LTMuMS0xMTYuOSA0NS4yLTIxNSAxNjAuMy0yMTUgMTEzLjcgMCAxNjMuMiA5Ni4xIDE2MC4zIDIxNSAxOC4xIDQ1LjIgMjkuOSA3Mi45IDQwLjEgMTA1LjggMjEuOCA3MC4xIDE0LjcgOTkuMSA5LjMgOTkuN3oiXQogICAgfTsKICAgIGZhU3RyaXBlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInN0cmlwZSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNDI5IiwgIk0xNjUgMTQ0LjdsLTQzLjMgOS4yLS4yIDE0Mi40YzAgMjYuMyAxOS44IDQzLjMgNDYuMSA0My4zIDE0LjYgMCAyNS4zLTIuNyAzMS4yLTUuOWwwLTMzLjhjLTUuNyAyLjMtMzMuNyAxMC41LTMzLjctMTUuN2wwLTYzLjIgMzMuNyAwIDAtMzcuOC0zMy43IDAtLjEtMzguNXptODkuMSA1MS42bC0yLjctMTMuMS0zOC40IDAgMCAxNTMuMiA0NC4zIDAgMC0xMDMuMWMxMC41LTEzLjggMjguMi0xMS4xIDMzLjktOS4zbDAtNDAuOGMtNi0yLjEtMjYuNy02LTM3LjEgMTMuMXpNMzQ2LjQgMTI0bC00NC42IDkuNSAwIDM2LjIgNDQuNi05LjUgMC0zNi4yek00NC45IDIyOC4zYzAtNi45IDUuOC05LjYgMTUuMS05LjcgMTMuNSAwIDMwLjcgNC4xIDQ0LjIgMTEuNGwwLTQxLjhjLTE0LjctNS44LTI5LjQtOC4xLTQ0LjEtOC4xLTM2IDAtNjAgMTguOC02MCA1MC4yIDAgNDkuMiA2Ny41IDQxLjIgNjcuNSA2Mi40IDAgOC4yLTcuMSAxMC45LTE3IDEwLjktMTQuNyAwLTMzLjctNi4xLTQ4LjYtMTQuMmwwIDQwYzE2LjUgNy4xIDMzLjIgMTAuMSA0OC41IDEwLjEgMzYuOSAwIDYyLjMtMTUuOCA2Mi4zLTQ3LjggMC01Mi45LTY3LjktNDMuNC02Ny45LTYzLjR6TTY0MCAyNjEuNmMwLTQ1LjUtMjItODEuNC02NC4yLTgxLjRzLTY3LjkgMzUuOS02Ny45IDgxLjFjMCA1My41IDMwLjMgNzguMiA3My41IDc4LjIgMjEuMiAwIDM3LjEtNC44IDQ5LjItMTEuNWwwLTMzLjRjLTEyLjEgNi4xLTI2IDkuOC00My42IDkuOC0xNy4zIDAtMzIuNS02LjEtMzQuNS0yNi45bDg2LjkgMGMuMi0yLjMgLjYtMTEuNiAuNi0xNS45em0tODcuOS0xNi44YzAtMjAgMTIuMy0yOC40IDIzLjQtMjguNCAxMC45IDAgMjIuNSA4LjQgMjIuNSAyOC40bC00NS45IDB6TTQzOS4yIDE4MC4yYy0xNy40IDAtMjguNiA4LjItMzQuOCAxMy45bC0yLjMtMTEtMzkuMSAwIDAgMjA0LjggNDQuNC05LjQgLjEtNTAuMmM2LjQgNC43IDE1LjkgMTEuMiAzMS40IDExLjIgMzEuOCAwIDYwLjgtMjMuMiA2MC44LTc5LjYgLjEtNTEuNi0yOS4zLTc5LjctNjAuNS03OS43ek00MjguNiAzMDIuN2MtMTAuNCAwLTE2LjYtMy44LTIwLjktOC40bC0uMy02NmM0LjYtNS4xIDExLTguOCAyMS4yLTguOCAxNi4yIDAgMjcuNCAxOC4yIDI3LjQgNDEuNCAuMSAyMy45LTEwLjkgNDEuOC0yNy40IDQxLjh6TTMwMS45IDMzNi40bDQ0LjYgMCAwLTE1My4yLTQ0LjYgMCAwIDE1My4yeiJdCiAgICB9OwogICAgZmFEYWlseW1vdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJkYWlseW1vdGlvbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlMDUyIiwgIk0yOTguOSAyNjdjLTcuNC00LjItMTUuOC02LjMtMjQuNC02LjItMTMuMiAwLTI0LjQgNC40LTMzLjQgMTMuM3MtMTMuNiAyMC0xMy42IDMzLjRjMCAxNC4xIDQuNCAyNS42IDEzLjMgMzQuNnMyMCAxMy40IDMzLjQgMTMuNGMxMy43IDAgMjUtNC42IDM0LjEtMTMuOFMzMjIgMzIxLjEgMzIyIDMwNy41YzAtOC4yLTIuMS0xNi4zLTYuMS0yMy41LTQtNy4xLTkuOC0xMy0xNy0xN3pNMCAzMmwwIDQ0OCA0NDggMCAwLTQ0OC00NDggMHpNMzc0LjcgNDA1LjNsLTUzLjEgMCAwLTIzLjktLjcgMGMtMTAuNSAxNy41LTI5LjEgMjYuMi01NS44IDI2LjItMTguNCAwLTM0LjctNC40LTQ4LjktMTMuMS0xNC4xLTguNi0yNS41LTIxLTMyLjktMzUuOC03LjctMTUuMS0xMS42LTMyLjEtMTEuNi01MC45IDAtMTguNCAzLjktMzUuMSAxMS44LTUwLjIgNy41LTE0LjcgMTguOS0yNy4xIDMyLjktMzUuOCAxNC4xLTguNyAzMC0xMy4xIDQ3LjctMTMuMSAxMC4yLS4xIDIwLjIgMS42IDI5LjcgNS4yIDguOSAzLjUgMTcuMiA5LjEgMjUgMTdsMC03Ny45IDU1LjgtMTIuMSAwIDI2NC40eiJdCiAgICB9OwogICAgZmFTdGVhbSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzdGVhbSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMWI2IiwgIk01MDQgMjU2YzAgMTM3LTExMS4yIDI0OC0yNDguNCAyNDgtMTEzLjggMC0yMDkuNi03Ni4zLTIzOS0xODAuNGw5NS4yIDM5LjNjNi40IDMyLjEgMzQuOSA1Ni40IDY4LjkgNTYuNCAzOS4yIDAgNzEuOS0zMi40IDcwLjItNzMuNWw4NC41LTYwLjJjNTIuMSAxLjMgOTUuOC00MC45IDk1LjgtOTMuNSAwLTUxLjYtNDItOTMuNS05My43LTkzLjVzLTkzLjcgNDItOTMuNyA5My41bDAgMS4yLTU5LjIgODUuN2MtMTUuNS0uOS0zMC43IDMuNC00My41IDEyLjFMOCAyMzYuMUMxOC4yIDEwOC40IDEyNS4xIDggMjU1LjYgOCAzOTIuOCA4IDUwNCAxMTkgNTA0IDI1NnpNMTYzLjcgMzg0LjNsLTMwLjUtMTIuNmM1LjYgMTEuNiAxNS4zIDIwLjggMjcuMiAyNS44IDI2LjkgMTEuMiA1Ny44LTEuNiA2OS0yOC40IDUuNC0xMyA1LjUtMjcuMyAuMS00MC4zUzIxNCAzMDUuNiAyMDEgMzAwLjJjLTEyLjktNS40LTI2LjctNS4yLTM4LjktLjZsMzEuNSAxM2MxOS44IDguMiAyOS4yIDMwLjkgMjAuOSA1MC43LTguMyAxOS45LTMxIDI5LjItNTAuOCAyMXpNMzM3LjUgMTI5LjhhNjIuMyA2Mi4zIDAgMSAxIDAgMTI0LjYgNjIuMyA2Mi4zIDAgMSAxIDAtMTI0LjZ6bS4xIDEwOWE0Ni44IDQ2LjggMCAxIDAgMC05My42IDQ2LjggNDYuOCAwIDEgMCAwIDkzLjZ6Il0KICAgIH07CiAgICBmYVZlbm1vViA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ2ZW5tby12IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU4NWIiLCAiTTQ2Ni41IDE0LjhjMTcuNCAyOC43IDI1LjMgNTguMiAyNS4zIDk1LjUgMCAxMTktMTAxLjkgMjczLjUtMTg0LjcgMzgyLjFsLTE4OC45IDAtNzUuOC00NTEuNSAxNjUuNC0xNS43IDQwLjEgMzIxLjNjMzcuNC02MC44IDgzLjYtMTU2LjMgODMuNi0yMjEuNCAwLTM1LjYtNi4xLTU5LjktMTUuNy03OS45TDQ2Ni41IDE0Ljh6Il0KICAgIH07CiAgICBmYVNuYXBjaGF0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNuYXBjaGF0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjIxMjQsICJzbmFwY2hhdC1naG9zdCJdLCAiZjJhYiIsICJNNDk3LjEgMzY2LjZjLTMuNC05LjItOS44LTE0LjEtMTcuMS0xOC4yLTEuNC0uOC0yLjYtMS41LTMuNy0xLjktMi4yLTEuMS00LjQtMi4yLTYuNi0zLjQtMjIuOC0xMi4xLTQwLjYtMjcuMy01My00NS40LTMuNS01LjEtNi42LTEwLjUtOS4xLTE2LjEtMS4xLTMtMS00LjctLjItNi4zIC44LTEuMiAxLjctMi4yIDIuOS0zIDMuOS0yLjYgOC01LjIgMTAuNy03IDQuOS0zLjIgOC44LTUuNyAxMS4yLTcuNCA5LjQtNi41IDE1LjktMTMuNSAyMC0yMS4zIDIuOS01LjQgNC41LTExLjMgNC45LTE3LjRzLS42LTEyLjItMi44LTE3LjhjLTYuMi0xNi4zLTIxLjYtMjYuNC00MC4zLTI2LjQtMy45IDAtNy45IC40LTExLjcgMS4yLTEgLjItMi4xIC41LTMuMSAuNyAuMi0xMS4yLS4xLTIyLjktMS4xLTM0LjUtMy41LTQwLjgtMTcuOC02Mi4xLTMyLjctNzkuMi05LjUtMTAuNy0yMC43LTE5LjctMzMuMi0yNi43LTIyLjYtMTIuOS00OC4yLTE5LjQtNzYuMS0xOS40cy01My40IDYuNS03NiAxOS40Yy0xMi41IDctMjMuNyAxNi4xLTMzLjMgMjYuOC0xNC45IDE3LTI5LjIgMzguNC0zMi43IDc5LjItMSAxMS42LTEuMiAyMy40LTEuMSAzNC41LTEtLjMtMi0uNS0zLjEtLjctMy45LS44LTcuOC0xLjItMTEuNy0xLjItMTguNyAwLTM0LjEgMTAuMS00MC4zIDI2LjQtMi4yIDUuNy0zLjIgMTEuOC0yLjggMTcuOHMyIDEyIDQuOSAxNy40YzQuMSA3LjggMTAuNyAxNC43IDIwIDIxLjMgMi41IDEuNyA2LjQgNC4yIDExLjIgNy40IDIuNiAxLjcgNi41IDQuMiAxMC4zIDYuNyAxLjMgLjkgMi40IDIgMy4zIDMuMyAuOCAxLjYgLjggMy40LS40IDYuNi0yLjUgNS41LTUuNSAxMC44LTguOSAxNS44LTEyLjEgMTcuNy0yOS40IDMyLjYtNTEuNCA0NC42LTExLjcgNi4yLTIzLjkgMTAuMy0yOSAyNC4zLTMuOSAxMC41LTEuMyAyMi41IDguNSAzMi42IDMuNiAzLjggNy44IDYuOSAxMi40IDkuNCA5LjYgNS4zIDE5LjggOS4zIDMwLjMgMTIuMSAyLjIgLjYgNC4zIDEuNSA2LjEgMi43IDMuNiAzLjEgMy4xIDcuOSA3LjggMTQuOCAyLjQgMy42IDUuNCA2LjcgOSA5LjEgMTAgNi45IDIxLjMgNy40IDMzLjIgNy44IDEwLjggLjQgMjMgLjkgMzYuOSA1LjUgNS44IDEuOSAxMS44IDUuNiAxOC43IDkuOSAxNi43IDEwLjMgMzkuNiAyNC4zIDc3LjggMjQuM3M2MS4zLTE0LjEgNzguMS0yNC40YzYuOS00LjIgMTIuOS03LjkgMTguNS05LjggMTMuOS00LjYgMjYuMi01LjEgMzYuOS01LjUgMTEuOS0uNSAyMy4yLS45IDMzLjItNy44IDQuMi0yLjkgNy43LTYuNyAxMC4yLTExLjIgMy40LTUuOCAzLjQtOS45IDYuNi0xMi44IDEuOC0xLjIgMy43LTIuMSA1LjgtMi42IDEwLjctMi44IDIxLTYuOSAzMC44LTEyLjIgNC45LTIuNiA5LjMtNi4xIDEzLTEwLjJsLjEtLjJjOS4yLTkuOSAxMS41LTIxLjUgNy44LTMxLjh6bS0zNCAxOC4zYy0yMC43IDExLjUtMzQuNSAxMC4yLTQ1LjMgMTcuMS05LjEgNS45LTMuNyAxOC41LTEwLjMgMjMuMS04LjEgNS42LTMyLjItLjQtNjMuMiA5LjktMjUuNiA4LjUtNDIgMzIuOC04OCAzMi44cy02Mi0yNC4zLTg4LjEtMzIuOWMtMzEtMTAuMy01NS4xLTQuMi02My4yLTkuOS02LjYtNC42LTEuMi0xNy4yLTEwLjMtMjMuMS0xMC43LTYuOS0yNC41LTUuNy00NS4zLTE3LjEtMTMuMi03LjMtNS43LTExLjgtMS4zLTEzLjkgNzUuMS0zNi40IDg3LjEtOTIuNiA4Ny43LTk2LjcgLjYtNSAxLjQtOS00LjItMTQuMS01LjQtNS0yOS4yLTE5LjctMzUuOC0yNC4zLTEwLjktNy42LTE1LjctMTUuMy0xMi4yLTI0LjYgMi41LTYuNSA4LjUtOC45IDE0LjktOC45IDIgMCA0IC4yIDYgLjcgMTIgMi42IDIzLjcgOC42IDMwLjQgMTAuMiAuOCAuMiAxLjYgLjMgMi41IC4zIDMuNiAwIDQuOS0xLjggNC42LTUuOS0uOC0xMy4xLTIuNi0zOC43LS42LTYyLjYgMi44LTMyLjkgMTMuNC00OS4yIDI2LTYzLjYgNi4xLTYuOSAzNC41LTM3IDg4LjktMzdTMzM5IDc0LjIgMzQ1IDgxLjFjMTIuNiAxNC40IDIzLjIgMzAuNyAyNiA2My42IDIuMSAyMy45IC4zIDQ5LjUtLjYgNjIuNi0uMyA0LjMgMSA1LjkgNC42IDUuOSAuOCAwIDEuNy0uMSAyLjUtLjMgNi43LTEuNiAxOC40LTcuNiAzMC40LTEwLjIgMi0uNCA0LS43IDYtLjcgNi40IDAgMTIuNCAyLjUgMTQuOSA4LjkgMy41IDkuNC0xLjIgMTctMTIuMiAyNC42LTYuNiA0LjYtMzAuNCAxOS4zLTM1LjggMjQuMy01LjYgNS4xLTQuOCA5LjEtNC4yIDE0LjIgLjUgNC4yIDEyLjUgNjAuNCA4Ny43IDk2LjcgNC40IDIuMiAxMS45IDYuNy0xLjMgMTQuMXoiXQogICAgfTsKICAgIGZhU25hcGNoYXRHaG9zdCA9IGZhU25hcGNoYXQ7CiAgICBmYUdhbGFjdGljU2VuYXRlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdhbGFjdGljLXNlbmF0ZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNTBkIiwgIk0yNDkuOSAzMy41bDAgMjYuMWMtMTMuNiAyMC42LTIzLjkgMTA4LjYtMjQuNSAyMTUuMyAxMS43LTE1LjYgMTkuMS0zMy4zIDE5LjEtNDguMmwwLTE2LjljMC01LjMgLjgtMTAuNSAyLjItMTUuNiAuNi0yLjEgMS40LTQuMSAyLjYtNS44czMuNC0zLjggNi43LTMuOCA1LjQgMi4xIDYuNyAzLjhjMS4yIDEuOCAyIDMuNyAyLjYgNS44IDEuNCA1LjEgMi4yIDEwLjMgMi4yIDE1LjZsMCAxNi45YzAgMTQuOSA3LjQgMzIuNiAxOS4xIDQ4LjItLjYtMTA2LjgtMTAuOS0xOTQuNy0yNC41LTIxNS4zbDAtMjYuMS0xMi4zIDB6TTIyMy41IDE4MS4zYy05LjUgMi4xLTE4LjcgNS4yLTI3LjUgOS4xIDguOSAxNi4xIDkuOCAzMi42IDEuNyAzNy4zLTggNC42LTIxLjgtNC4yLTMxLjQtMTkuOC0xMS42IDguOC0yMS45IDE5LjMtMzAuNiAzMS4xIDE0LjcgOS42IDIyLjkgMjIuOSAxOC4zIDMwLjctNC41IDcuNy0yMCA3LjEtMzUuNS0xLTUuOCAxMy4yLTkuNyAyNy41LTExLjYgNDIuNCA5LjcgLjIgMTguNyAyLjQgMjYuMiA2IDE3LjgtLjMgMzIuOC0yIDQwLjUtNC4yIDUuNi0yNi40IDIzLTQ4LjIgNDYuMy01OS41IC43LTI1LjYgMS45LTQ5LjcgMy41LTcyLjF6bTY1IDBjMS42IDIyLjQgMi43IDQ2LjUgMy41IDcyLjEgMjMuMyAxMS4zIDQwLjggMzMuMiA0Ni4zIDU5LjUgNy43IDIuMyAyMi43IDMuOSA0MC41IDQuMiA3LjUtMy43IDE2LjUtNS44IDI2LjItNi0xLjktMTQuOS01LjktMjkuMi0xMS43LTQyLjQtMTUuNCA4LjEtMzAuOSA4LjctMzUuNSAxLTQuNi03LjcgMy42LTIxLjEgMTguMy0zMC43LTguNy0xMS44LTE5LTIyLjMtMzAuNi0zMS4xLTkuNSAxNS42LTIzLjQgMjQuNC0zMS40IDE5LjgtOC4xLTQuNi03LjItMjEuMiAxLjctMzcuMy04LjgtMy45LTE4LTctMjcuNC05LjF6TTI1NiAxODkuOWMtMy4yIDAtNS45IDguOC02LjEgMTkuOWwwIDAgMCAxNi45YzAgNDEuNC00OSA5NS05My41IDk1LTUyIDAtMTIyLjgtMS40LTE1Ni40IDI5LjJsMCAyLjVjOS40IDE3LjEgMjAuNiAzMy4yIDMzLjIgNDggMTIuNS0yMS4xIDUxLjYtNDEgMTA4LTQxLjQgNDUuNyAxIDc5IDIwLjMgOTAuOCA0MC45IDAgMCAwIDAgMCAuMSA3LjcgMi4xIDE1LjggMy4yIDI0IDMuMiA4LjIgMCAxNi40LTEuMSAyNC0zLjIgMCAwIDAgMCAwLS4xIDExLjctMjAuNSA0NS4xLTM5LjggOTAuOC00MC45IDU2LjQgLjQgOTUuNSAyMC4zIDEwOCA0MS40IDEyLjYtMTQuOCAyMy44LTMwLjkgMzMuMi00OGwwLTIuNWMtMzMuNi0zMC42LTEwNC40LTI5LjItMTU2LjQtMjkuMi00NC41IDAtOTMuNS01My42LTkzLjUtOTVsMC0xNi45LS4xIDBjLS4yLTExLjEtMi45LTE5LjktNi4xLTE5Ljl6bTAgMTc3LjlhNDAuNiA0MC42IDAgMSAxIDAtODEuMyA0MC42IDQwLjYgMCAxIDEgMCA4MS4zem0wLTczLjZhMzMgMzMgMCAxIDAgMCA2NS45IDMzIDMzIDAgMSAwIDAtNjUuOXptMCA1OS44YTI2LjggMjYuOCAwIDEgMSAwLTUzLjYgMjYuOCAyNi44IDAgMSAxIDAgNTMuNnptLTExNC44IDEzYy0xMC4yIC4xLTIxLjYgLjQtMzAuNSAxLjcgLjQgNC40IDEuNSAxOC42IDcuMSAyOS44IDkuMS0yLjYgMTguNC0zLjkgMjcuNi0zLjkgNDEuMyAuOSA3MS41IDM0LjQgNzguMyA3NC41bC4xIDQuN2MxMC40IDEuOSAyMS4yIDIuOSAzMi4yIDIuOSAxMSAwIDIxLjgtMSAzMi4yLTIuOWwuMS00LjdjNi44LTQwLjEgMzctNzMuNSA3OC4zLTc0LjUgOS4zIDAgMTguNSAxLjMgMjcuNiAzLjkgNS42LTExLjEgNi43LTI1LjMgNy4xLTI5LjgtOC45LTEuMy0yMC4zLTEuNi0zMC41LTEuNy0xOC44IC40LTM1LjIgNC4yLTQ4LjYgOS43LTEyLjUgMTYtMjkuMiAzMC00OS42IDMzLjEtLjEgMC0uMiAwLS4zIDAgMCAwLS4xIDAtLjIgLjEtNS4yIDEuMS0xMC42IDEuNi0xNi4yIDEuNi01LjUgMC0xMC45LS41LTE2LjItMS42LS4xIDAtLjEgMC0uMi0uMS0uMSAwLS4yIDAtLjMgMC0yMC40LTMtMzctMTctNDkuNi0zMy4xLTEzLjQtNS41LTI5LjktOS4yLTQ4LjYtOS43eiJdCiAgICB9OwogICAgZmFQaG9lbml4RnJhbWV3b3JrID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInBob2VuaXgtZnJhbWV3b3JrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYzZGMiLCAiTTIxMi45IDM0NC4zYzMuOC0uMSAyMi44LTEuNCAyNS42LTIuMi0yLjQtMi42LTQzLjYtMS02OC00OS42LTQuMy04LjYtNy41LTE3LjYtNi40LTI3LjYgMi45LTI1LjUgMzIuOS0zMCA1Mi0xOC41IDM2IDIxLjYgNjMuMyA5MS4zIDExMy43IDk3LjUgMzcgNC41IDg0LjYtMTcgMTA4LjItNDUuNC0uNi0uMS0uOC0uMi0xLS4xLS40IC4xLS44IC4yLTEuMSAuMy0zMy4zIDEyLjEtOTQuMyA5LjctMTM0LjctMTQuOC0zNy42LTIyLjgtNTMuMS01OC43LTUxLjgtNzQuNiAxLjgtMjEuMyAyMi45LTIzLjIgMzUuOS0xOS42IDE0LjQgMy45IDI0LjQgMTcuNiAzOC45IDI3LjQgMTUuNiAxMC40IDMyLjkgMTMuNyA1MS4zIDEwLjMgMTQuOS0yLjcgMzQuNC0xMi4zIDM2LjUtMTQuNS0xLjEtLjEtMS44LS4xLTIuNS0uMi02LjItLjYtMTIuNC0uOC0xOC41LTEuNy0xMTEuMi0xNi41LTEyOC45LTE2My42LTI1Mi41LTE3My4xLTQ0LjMtMy40LTk5LjQgOC4xLTEzNi4zIDM1LS44IC42LTEuNSAxLjItMi4yIDEuOCAuMSAuMiAuMSAuMyAuMiAuNSAuOCAwIDEuNi0uMSAyLjQtLjIgNi4zLTEgMTIuNS0uOCAxOC43IC4zIDIzLjggNC4zIDQ3LjcgMjMuMSA1NS45IDc2LjUgNS4zIDM0LjMtLjcgNTAuOCA4IDg2LjEgMTkgNzcuMSA5MSAxMDcuNiAxMjcuNyAxMDYuNHpNNzUuMyA2NC45Yy0uOS0xLS45LTEuMi0xLjMtMiAxMi4xLTIuNiAyNC4yLTQuMSAzNi42LTQuOC0xLjEgMTQuNy0yMi4yIDIxLjMtMzUuMyA2Ljh6TTI3Mi4yIDQxNS40Yy00Mi44IDEuMi05Mi0yNi43LTEyMy41LTYxLjQtNC42LTUtMTYuOC0yMC4yLTE4LjYtMjMuNGwuNC0uNGM2LjYgNC4xIDI1LjcgMTguNiA1NC44IDI3IDI0LjIgNyA0OC4xIDYuMyA3MS42LTMuMyAyMi43LTkuMyA0MS0uNSA0My4xIDIuOS0xOC41IDMuOC0yMC4xIDQuNC0yNCA3LjktNS4xIDQuNC00LjYgMTEuNyA3IDE3LjIgMjYuMiAxMi40IDYzLTIuOCA5Ny4yIDI1LjQgMi40IDIgOC4xIDcuOCAxMC4xIDEwLjctLjEgLjItLjMgLjMtLjQgLjUtNC44LTEuNS0xNi40LTcuNS00MC4yLTkuMy0yNC43LTItNDYuMyA1LjMtNzcuNSA2LjJ6TTQ0NyAxNjMuNGMxNi40LTUuMiA0MS4zLTEzLjQgNjYuNS0zLjMgMTYuMSA2LjUgMjYuMiAxOC43IDMyLjEgMzQuNiAzLjUgOS40IDUuMSAxOS43IDUuMSAyOC43LS4yIDAtLjQgMC0uNiAuMS0uMi0uNC0uNC0uOS0uNS0xLjMtNS0yMi0yOS45LTQzLjgtNjcuNi0yOS45LTUwLjIgMTguNi0xMzAuNCA5LjctMTc2LjktNDgtLjctLjktMi40LTEuNy0xLjMtMy4yIC4xLS4yIDIuMSAuNiAzIDEuMyAxOC4xIDEzLjQgMzguMyAyMS45IDYwLjMgMjYuMiAzMC41IDYuMSA1NC42IDIuOSA3OS45LTUuMnpNNTQ5LjcgMjgwLjljLTMyLjQgLjItMzMuOCA1MC4xLTEwMy42IDY0LjQtMTguMiAzLjctMzguNyA0LjYtNDQuOSA0LjJsMC0uNGMyLjgtMS41IDE0LjctMi42IDI5LjctMTYuNiA3LjktNy4zIDE1LjMtMTUuMSAyMi44LTIyLjkgMTkuNS0yMC4yIDQxLjQtNDIuMiA4MS45LTM5IDIzLjEgMS44IDI5LjMgOC4yIDM2LjEgMTIuNyAuMyAuMiAuNCAuNSAuNyAuOS0uNSAwLS43IC4xLS45IDAtNy0yLjctMTQuMy0zLjMtMjEuOC0zLjN6bS0xMi4zLTI0LjFjLS4xIC4yLS4xIC40LS4yIC42LTI4LjktNC40LTQ4LTcuOS02OC41IDQtMTcgOS45LTMxLjQgMjAuNS02MiAyNC40LTI3LjEgMy40LTQ1LjEgMi40LTY2LjEtOC0uMy0uMi0uNi0uNC0xLS42IDAtLjIgLjEtLjMgLjEtLjUgMjQuOSAzLjggMzYuNCA1LjEgNTUuNS01LjggMjIuMy0xMi45IDQwLjEtMjYuNiA3MS4zLTMxIDI5LjYtNC4xIDUxLjMgMi41IDcwLjkgMTYuOXpNMjY4LjYgOTcuM2MtLjYtLjYtMS4xLTEuMi0yLjEtMi4zIDcuNiAwIDI5LjctMS4yIDUzLjQgOC40IDE5LjcgOCAzMi4yIDIxIDUwLjIgMzIuOSAxMS4xIDcuMyAyMy40IDkuMyAzNi40IDguMSA0LjMtLjQgOC41LTEuMiAxMi44LTEuNyAuNC0uMSAuOSAwIDEuNSAuMy0uNiAuNC0xLjIgLjktMS44IDEuMi04LjEgNC0xNi43IDYuMy0yNS42IDcuMS0yNi4xIDIuNi01MC4zLTMuNy03My40LTE1LjQtMTkuMy05LjktMzYuNC0yMi45LTUxLjQtMzguNnpNNjQwIDMzNS43Yy0zLjUgMy4xLTIyLjcgMTEuNi00Mi43IDUuMy0xMi4zLTMuOS0xOS41LTE0LjktMzEuNi0yNC4xLTEwLTcuNi0yMC45LTcuOS0yOC4xLTguNCAuNi0uOCAuOS0xLjIgMS4yLTEuNCAxNC44LTkuMiAzMC41LTEyLjIgNDcuMy02LjUgMTIuNSA0LjIgMTkuMiAxMy41IDMwLjQgMjQuMiAxMC44IDEwLjQgMjEgOS45IDIzLjEgMTAuNSAuMS0uMSAuMiAwIC40IC40em0tMjEyLjUgMTM3YzIuMiAxLjIgMS42IDEuNSAxLjUgMi0xOC41LTEuNC0zMy45LTcuNi00Ni44LTIyLjItMjEuOC0yNC43LTQxLjctMjcuOS00OC42LTI5LjcgLjUtLjIgLjgtLjQgMS4xLS40IDEzLjEgLjEgMjYuMSAuNyAzOC45IDMuOSAyNS4zIDYuNCAzNSAyNS40IDQxLjYgMzUuMyAzLjIgNC44IDcuMyA4LjMgMTIuMyAxMS4xeiJdCiAgICB9OwogICAgZmFHaXQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZ2l0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxZDMiLCAiTTIxNi4zIDE1OC40bC03OS4zIDBjLTQwLTEwLjUtMTMwLjUtNy44LTEzMC41IDc0LjggMCAzMC4xIDE1IDUxLjIgMzUgNjEtMjUuMSAyMy0zNyAzMy44LTM3IDQ5LjIgMCAxMSA0LjUgMjEuMSAxNy45IDI2LjgtMTQuMyAxMy40LTIyLjQgMjMuMS0yMi40IDQxLjQgMCAzMi4xIDI4IDUwLjggMTAxLjYgNTAuOCA3MC44IDAgMTExLjgtMjYuNCAxMTEuOC03My4yIDAtNTguNy00NS4yLTU2LjUtMTUxLjYtNjNsMTMuNC0yMS42YzI3LjMgNy42IDExOC43IDEwIDExOC43LTY3LjkgMC0xOC43LTcuNy0zMS43LTE1LTQxLjFsMzcuNC0yLjggMC0zNC41ek0xNTIuOSA0MDAuM2MwIDMyLjEtMTA0LjkgMzIuMS0xMDQuOSAyLjQgMC04LjEgNS4zLTE1IDEwLjYtMjEuNSA3Ny43IDUuMyA5NC4zIDMuNCA5NC4zIDE5LjF6TTEwMi4xIDI2NS43Yy01Mi44IDAtNTAuNS03MS4yIDEuMi03MS4yIDQ5LjUgMCA1MC44IDcxLjItMS4yIDcxLjJ6TTIzNS40IDM2Ni4ybDAtMzIuMWMyNi43LTMuNyAyNy4yLTIgMjcuMi0xMWwwLTExOS41YzAtOC41LTIuMS03LjQtMjcuMi0xNi4zbDQuNS0zMi45IDg0LjIgMCAwIDE2OC43YzAgNi41IC40IDcuMyA2LjUgOC4xbDIwLjcgMi44IDAgMzIuMS0xMTUuOSAwem01Mi41LTI0NC4zYy0yMy4yIDAtMzYuNi0xMy40LTM2LjYtMzYuNnMxMy40LTM1LjggMzYuNi0zNS44YzIzLjYgMCAzNyAxMi42IDM3IDM1LjhzLTEzLjQgMzYuNi0zNyAzNi42ek01MTIgMzUwLjVjLTE3LjUgOC41LTQzLjEgMTYuMy02Ni4zIDE2LjMtNDguNCAwLTY2LjctMTkuNS02Ni43LTY1LjVsMC0xMDYuNWMwLTUuNCAxLTQuMS0zMS43LTQuMWwwLTM2LjJjMzUuOC00LjEgNTAtMjIgNTQuNS02Ni4zbDM4LjYgMGMwIDY1LjgtMS4zIDYxLjggMy4zIDYxLjhsNTcuMyAwIDAgNDAuNi02MC42IDAgMCA5Ny4xYzAgNi45LTQuOSA1MS40IDYwLjYgMjYuOGwxMSAzNS44eiJdCiAgICB9OwogICAgZmFPcHRpbk1vbnN0ZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAib3B0aW4tbW9uc3RlciIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMjNjIiwgIk01NzIuOCA0MjEuNGM1LjYtOS41IDQuNy0xNS4yLTUuNC0xMS42LTMtNC45LTctOS41LTExLjEtMTMuOCAyLjktOS43LS43LTE0LjItMTAuOC05LjItNC42LTMuMi0xMC4zLTYuNS0xNS45LTkuMiAwLTE1LjEtMTEuNi0xMS42LTE3LjYtNS43LTEwLjQtMS41LTE4LjctLjMtMjYuOCA1LjcgLjMtNi41IC4zLTEzIC4zLTE5LjcgMTIuNiAwIDQwLjItMTEgNDUuOS0zNi4yIDEuNC02LjggMS42LTEzLjgtLjMtMjEuOS0zLTEzLjUtMTQuMy0yMS4zLTI1LjEtMjUuNy0uOC01LjktNy42LTE0LjMtMTQuOS0xNS45cy0xMi40IDQuOS0xNC4xIDEwLjNjLTguNSAwLTE5LjIgMi44LTIxLjEgOC40LTUuNC0uNS0xMS4xLTEuNC0xNi44LTEuOSAyLjctMS45IDUuNC0zLjUgOC40LTQuNiA1LjQtOS4yIDE0LjYtMTEuNCAyNS43LTExLjZsMC0yLjhjMTkuNS0uNSA0My01LjkgNTMuOC0xOC4xIDEyLjctMTMuOCAxNC42LTM3LjMgMTIuNC01NS4xLTIuNC0xNy4zLTkuNy0zNy42LTI0LjYtNDguMS04LjQtNS45LTIxLjYtLjgtMjIuNyA5LjUtMi4yIDE5LjYgMS4yIDMwLTM4LjYgMjUuMS0xMC4zLTIzLjgtMjQuNi00NC42LTQyLjctNjAtNjkuNi01OS43LTE2Ny43LTUzLjgtMjQ0LjItMzcuNiAxOS43IDQuNiA0MS4xIDguNiA1OS43IDE2LjUtMjYuMiAyLjQtNTIuNyAxMS4zLTc2LjIgMjMuMi0zMi44IDE3LTQ0IDI5LjktNTYuNyA0Mi40IDE0LjktMi4yIDI4LjktNS4xIDQzLjgtMy44LTkuNyA1LjQtMTguNCAxMi4yLTI2LjUgMjAtMjUuOCAuOS0yMy44LTUuMy0yNi4yLTI1LjktMS4xLTEwLjUtMTQuMy0xNS40LTIyLjctOS43LTI4LjEgMTkuOS0zMy41IDc5LjktMTIuMiAxMDMuNSAxMC44IDEyLjIgMzUuMSAxNy4zIDU0LjkgMTcuOC0uMyAxLjEtLjMgMS45LS4zIDIuNyAxMC44IC41IDE5LjUgMi43IDI0LjYgMTEuNiAzIDEuMSA1LjcgMi43IDguMSA0LjYtNS40IC41LTExLjEgMS40LTE2LjUgMS45LTMuMy02LjYtMTMuNy04LjEtMjEuMS04LjEtMS42LTUuNy02LjUtMTIuMi0xNC4xLTEwLjMtNi44IDEuOS0xNC4xIDEwLTE0LjkgMTUuOS0yMi41IDkuNS0zMC4xIDI2LjgtMjUuMSA0Ny42IDUuMyAyNC44IDMzIDM2LjIgNDUuOSAzNi4ybDAgMTkuN2MtNi42LTUtMTQuMy03LjUtMjYuOC01LjctNS41LTUuNS0xNy4zLTEwLjEtMTcuMyA1LjctNS45IDIuNy0xMS40IDUuOS0xNS45IDkuMi05LjgtNC45LTEzLjYtMS43LTExLjEgOS4yLTQuMSA0LjMtNy44IDguNi0xMS4xIDEzLjgtMTAuMi0zLjctMTEgMi4yLTUuNCAxMS42LTEuMSAzLjUtMS42IDctMS45IDEwLjgtLjUgMzEuNiA0NC42IDY0IDczLjUgNjUuMSAxNy4zIC41IDM0LjYtOC40IDQzLTIzLjUgMTEzLjIgNC45IDIyNi43IDQuMSAzNDAuMiAwIDguMSAxNS4xIDI1LjQgMjQuMyA0Mi43IDIzLjUgMjkuMi0xLjEgNzQuMy0zMy41IDczLjUtNjUuMSAuMi0zLjctLjctNy4yLTEuNy0xMC43ek00OTkgMTY3LjRjMS4xLTMgMi40LTguNCAyLjQtMTQuNiAwLTUuOSA2LjgtOC4xIDE0LjEtLjggMTEuMSAxMS42IDE0LjkgNDAuNSAxMy44IDUxLjEtNC4xLTEzLjYtMTMtMjktMzAuMy0zNS43em0tNC42IDYuN2MxOS41IDYuMiAyOC42IDI3LjYgMjkuNyA0OC45LTEuMSAyLjctMyA1LjQtNC45IDcuNi01LjcgNS45LTE1LjQgMTAtMjYuMiAxMi4yIDQuMy0yMS4zIC4zLTQ3LjMtMTIuNy02MyA0LjktLjggMTAuOS0yLjQgMTQuMS01Ljd6bS0yNC4xIDYuOGMxMy44IDExLjkgMjAgMzkuMiAxNC4xIDYzLjUtNC4xIC41LTguMSAuOC0xMS42IC44LTEuOS0yMS45LTYuOC00NC0xNC4zLTY0LjYgMy43IC4zIDguMSAuMyAxMS44IC4zek00Ny43IDIwM2MtMS4xLTEwLjUgMi40LTM5LjUgMTMuOC01MS4xIDctNy4zIDE0LjEtNS4xIDE0LjEgLjggMCA2LjIgMS40IDExLjYgMi40IDE0LjYtMTcuMyA2LjgtMjYuMiAyMi4yLTMwLjMgMzUuN3ptOS43IDI3LjZjLTEuOS0yLjItMy41LTQuOS00LjktNy42IDEuNC0yMS4zIDEwLjMtNDIuNyAyOS43LTQ4LjkgMy4yIDMuMiA5LjIgNC45IDE0LjEgNS43LTEzIDE1LjctMTcgNDEuNi0xMi43IDYzLTEwLjgtMi4yLTIwLjUtNi0yNi4yLTEyLjJ6bTQ3LjkgMTQuNmMtNC4xIDAtOC4xLS4zLTEyLjctLjgtNC42LTE4LjYtMS45LTM4LjkgNS40LTUzbDAgLjMgMTIuMi01LjFjNC45LTEuOSA5LjctMy44IDE0LjktNC45LTEwLjcgMTkuNy0xNy40IDQxLjMtMTkuOCA2My41em0xODQtMTAuNWE3Ni4xIDc2LjEgMCAxIDEgMC0xNTIuMiA3Ni4xIDc2LjEgMCAxIDEgMCAxNTIuMnptMTE1LjYgMjIuMWMtLjMgMTcuOC03IDQ4LjktMjMgNTctMTMuMiA2LjYtNi41LTcuNS0xNi41LTU4LjEgMTMuMyAuMyAyNi42IC4zIDM5LjUgMS4xem0tNTQtMS42Yy44IDQuOSAzLjggNDAuMy0xLjYgNDEuOS0xMS42IDMuNS00MCA0LjMtNTEuMS0xLjEtNC4xLTMtNC42LTM1LjktNC4zLTQxLjFsMCAuM2MxOC45LS4zIDM4LjEtLjMgNTcgMHpNMjc4LjUgMzA5Yy0xMyAzLjUtNDEuNiA0LjEtNTQuNi0xLjYtNi41LTIuNy0zLjgtNDIuNC0xLjktNTEuNiAxOS4yLS41IDM4LjQtLjUgNTcuOC0uOGwwIC4zYzEuMSA4LjMgMy4zIDUxLjItMS4zIDUzLjd6TTE3MiAyNTcuOWMxMi4yLS44IDI0LjYtMS40IDM2LjgtMS42LTIuNCAxNS40LTMgNDMuNS00LjkgNTIuMi0xLjEgNi44LTQuMyA2LjgtOS43IDQuMy0yMS45LTkuOC0yNy42LTM1LjItMjIuMi01NC45em0tMzUuNCAzMS4zYzcuOC0xLjEgMTUuNy0xLjkgMjMuNS0yLjcgMS42IDYuMiAzLjggMTEuOSA3IDE3LjYgMTAgMTcgNDQgMzUuNyA0NS4xIDcgNi4yIDE0LjkgNDAuOCAxMi4yIDU0LjkgMTAuOCAxNS43LTEuNCAyMy44LTEuNCAyNi44LTE0LjMgMTIuNCA0LjMgMzAuOCA0LjEgNDQgMyAxMS4zLS44IDIwLjgtLjUgMjQuNi04LjkgMS4xIDUuMSAxLjkgMTEuNiA0LjYgMTYuOCAxMC44IDIxLjMgMzcuMyAxLjQgNDYuOC0zMS42IDguNiAuOCAxNy42IDEuOSAyNi41IDIuNy0uNCAxLjMtMy44IDcuMyA3LjMgMTEuNi00Ny42IDQ3LTk1LjcgODcuOC0xNjMuMiAxMDctNjMuMi0yMC44LTExMi4xLTU5LjUtMTU1LjktMTA2LjUgOS42LTMuNCAxMC40LTguOCA4LTEyLjV6TTExNSA0NjEuN2MtMy44IDE3LjgtMjEuOSAyOS43LTM5LjcgMjguOS0xOS4yLS44LTQ2LjUtMTctNTkuMi0zNi41LTIuNy0zMS4xIDQzLjgtNjEuMyA2Ni4yLTU0LjYgMTQuOSA0LjMgMjcuOCAzMC44IDMzLjUgNTQgMCAzLS4zIDUuNy0uOCA4LjJ6bS04LjctNjZjLS41LTEzLjUtLjUtMjctLjMtNDAuNWwuMyAwYzIuNy0xLjYgNS43LTMuOCA3LjgtNi41IDYuNS0xLjYgMTMtNS4xIDE1LjEtOS4yIDMuMy03LjEtNy03LjUtNS40LTEyLjQgMi43LTEuMSA1LjctMi4yIDcuOC0zLjUgMjkuMiAyOS4yIDU4LjYgNTYuNSA5Ny4zIDc3LTM2LjggMTEuMy03Mi40IDI3LjYtMTA1LjkgNDctMS4yLTE4LjYtNy43LTM1LjktMTYuNy01MS45em0zMzcuNiA2NC42Yy0xMDMgMy41LTIwNi4yIDQuMS0zMDkuNCAwIDAgLjMgMCAuMy0uMyAuM2wwLS4zIC4zIDBjMzUuMS0yMS42IDcyLjItMzkuMiAxMTIuNC01MC44IDExLjYgNS4xIDIzIDkuNSAzNC45IDEzLjIgMi4yIC44IDIuMiAuOCA0LjMgMCAxNC4zLTQuMSAyOC40LTkuMiA0Mi4yLTE1LjQgNDEuNSAxMS43IDc4LjggMzEuNyAxMTUuNiA1M3ptMTAuNS0xMi40Yy0zNS45LTE5LjUtNzMtMzUuOS0xMTEuOS00Ny42IDM4LjEtMjAgNzEuOS00Ny4zIDEwMy41LTc2LjcgMi4yIDEuNCA0LjYgMi40IDcuNiAzLjIgMCAuOCAuMyAxLjkgLjUgMi40LTQuNiAyLjctNy44IDYuMi01LjkgMTAuMyAyLjIgMy44IDguNiA3LjYgMTUuMSA4LjkgMi40IDIuNyA1LjEgNS4xIDguMSA2LjggMCAxMy44LS4zIDI3LjYtLjggNDEuM2wuMy0uM2MtOS4zIDE1LjktMTUuNSAzNy0xNi41IDUxLjd6bTEwNS45IDYuMmMtMTIuNyAxOS41LTQwIDM1LjctNTkuMiAzNi41LTE5LjMgLjktNDAuNS0xMy4yLTQwLjUtMzcgNS43LTIzLjIgMTguOS00OS43IDMzLjUtNTQgMjIuNy02LjkgNjkuMiAyMy40IDY2LjIgNTQuNXpNMzczLjEgNzUuMmMtMy44LTcyLjEtMTAwLjgtNzkuNy0xMjYtMjMuNSA0NC42LTI0LjMgOTAuMy0xNS43IDEyNiAyMy41ek03NSA0MDcuMWMtMTUuNyAxLjYtNDkuNSAyNS40LTQ5LjUgNDMuMiAwIDExLjYgMTUuNyAxOS41IDMyLjIgMTQuOSAxMi4yLTMuMiAzMS4xLTE3LjYgMzUuOS0yNy4zIDYtMTEuNi0zLjctMzIuNy0xOC42LTMwLjh6TTI5MC45IDIzMC45YzI4LjYgMCA1MS45LTIxLjYgNTEuOS00OC40IDAtMzYuMS00MC41LTU4LjEtNzIuMi00NC4zIDkuNSAzIDE2LjUgMTEuNiAxNi41IDIxLjYgMCAyMy4zLTMzLjMgMzItNDYuNSAxMS4zLTcuMyAzNC4xIDE5LjQgNTkuOCA1MC4zIDU5Ljh6TTY4LjIgNDc0LjFjLjUgNi41IDEyLjIgMTIuNyAyMS42IDkuNSA2LjgtMi43IDE0LjYtMTAuNSAxNy4zLTE2LjIgMy03LTEuMS0yMC05LjctMTguNC04LjkgMS42LTI5LjcgMTYuNy0yOS4yIDI1LjF6bTQzMy4yLTY3Yy0xNC45LTEuOS0yNC42IDE5LjItMTguOSAzMC44IDQuOSA5LjcgMjQuMSAyNC4xIDM2LjIgMjcuMyAxNi41IDQuNiAzMi4yLTMuMiAzMi4yLTE0LjkgMC0xNy44LTMzLjgtNDEuNi00OS41LTQzLjJ6TTQ3OSA0NDljLTguNC0xLjYtMTIuNCAxMS4zLTkuNSAxOC40IDIuNCA1LjcgMTAuMyAxMy41IDE3LjMgMTYuMiA5LjIgMy4yIDIxLjEtMyAyMS4zLTkuNSAuOS04LjQtMjAuMi0yMy41LTI5LjEtMjUuMXoiXQogICAgfTsKICAgIGZhSmVua2lucyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJqZW5raW5zIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzYjYiLCAiTTQ1NS40IDQyNWMtMS40LTExLjItMTktMjMuMS0yOC4yLTMxLjktNS4xLTUtMjktMjMuMS0zMC40LTI5LjktMS40LTYuNiA5LjctMjEuNSAxMy4zLTI4LjkgNS4xLTEwLjcgOC44LTIzLjcgMTEuMy0zMi42IDE4LjgtNjYuMSAyMC43LTE1Ni45LTYuMi0yMTEuMi0xMC4yLTIwLjYtMzguNi00OS01Ni40LTYyLjUtNDItMzEuNy0xMTkuNi0zNS4zLTE3MC4xLTE2LjYtMTQuMSA1LjItMjcuOCA5LjgtNDAuMSAxNy4xLTMzLjEgMTkuNC02OC4zIDMyLjUtNzguMSA3MS42LTI0LjIgMTAuOC0zMS41IDQxLjgtMzAuMyA3Ny44IC4yIDcgNC4xIDE1LjggMi43IDIyLjQtLjcgMy4zLTUuMiA3LjYtNi4xIDkuOC0xMS42IDI3LjctMi4zIDY0IDExLjEgODMuNyA4LjEgMTEuOSAyMS41IDIyLjQgMzkuMiAyNS4yIC43IDEwLjYgMy4zIDE5LjcgOC4yIDMwLjQgMy4xIDYuOCAxNC43IDE5IDEwLjQgMjcuNy0yLjIgNC40LTIxIDEzLjgtMjcuMyAxNy42LTIxLjEgMTIuNS0zNi40IDIwLjMtNTUuOSAzNC4zLTEyLjYgOS0zMi4zIDEwLjItMjkuMiAzMS4xIDIuMSAxNC4xIDEwLjEgMzEuNiAxNC43IDQ1LjggLjcgMiAxLjQgNC4xIDIuMSA2bDQyMiAwYzQuOS0xNS4zIDkuNy0zMC45IDE0LjYtNDcuMiAzLjQtMTEuNCAxMC4yLTI3LjggOC43LTM5Ljd6TTE3NC4yIDMzLjdjMS44LS41IDMuNCAuNyA0LjkgMi40LS4yIDUuMi01LjQgNS4xLTguOSA2LjgtNS40IDYuNy0xMy40IDkuOC0yMCAxNy4yLTYuOCA3LjUtMTQuNCAyNy43LTIzLjQgMzAtNC41IDEuMS05LjctLjgtMTMuNi0uNS0xMC40IC43LTE3LjcgNi0yOC4zIDcuNSAxMy42LTI5LjkgNTYuMS01NCA4OS4zLTYzLjR6TTY5LjQgMTI3LjNjMTMuNS0xNC45IDMyLjEtMjQuMSA1NC44LTI1LjkgMTEuNyAyOS43LTguNCA2NS0uOSA5Ny42IDIuMyA5LjkgMTAuMiAyNS40LTIuNCAyNS43IC4zLTI4LjMtMzQuOC00Ni4zLTYxLjMtMjkuNi0xLjgtMjEuNS00LjktNTEuNyA5LjgtNjcuOHptMzYuNyAyMDAuMmMtMS00LjEtMi43LTEyLjktMi4zLTE1LjEgMS42LTguNyAxNy4xLTEyLjUgMTEtMjQuNy0xMS4zLS4xLTEzLjggMTAuMi0yNC4xIDExLjMtMjYuNyAyLjYtNDUuNi0zNS40LTQ0LjQtNTguNCAxLTE5LjUgMTcuNi0zOC4yIDQwLjEtMzUuOCAxNiAxLjggMjEuNCAxOS4yIDI0LjUgMzQuNyA5LjIgLjUgMjIuNS0uNCAyNi45LTcuNi0uNi0xNy41LTguOC0zMS42LTguMi00Ny43IDEtMzAuMyAxNy41LTU3LjYgNC44LTg3LjQgMTMuNi0zMC45IDUzLjUtNTUuMyA4My4xLTcwIDM2LjYtMTguMyA5NC45LTMuNyAxMjkuMyAxNS44IDE5LjcgMTEuMSAzNC40IDMyLjcgNDguMyA1MC43LTE5LjUtNS44LTM2LjEgNC4yLTMzLjEgMjAuMyAxNi4zLTE0LjkgNDQuMi0uMiA1Mi41IDE2LjQgNy45IDE1LjggNy44IDM5LjMgOSA2Mi44IDIuOSA1Ny0xMC40IDExNS45LTM5LjEgMTU3LjEtNy43IDExLTE0LjEgMjMtMjQuOSAzMC42LTI2IDE4LjItNjUuNCAzNC43LTk5LjIgMjMuNC00NC43LTE1LTY1LTQ0LjgtODkuNS03OC44IC43IDE4LjcgMTMuOCAzNC4xIDI2LjggNDguNCAxMS4zIDEyLjUgMjUgMjYuNiAzOS43IDMyLjQtMTIuMy0yLjktMzEuMS0zLjgtMzYuMiA3LjItMjguNi0xLjktNTUuMS00LjgtNjguNy0yNC4yLTEwLjYtMTUuNC0yMS40LTQxLjQtMjYuMy02MS40em0yMjIgMTI0LjFjNC4xLTMgMTEuMS0yLjkgMTcuNC0zLjYtNS40LTIuNy0xMy0zLjctMTkuMy0yLjItLjEtNC4yLTItNi44LTMuMi0xMC4yIDEwLjYtMy44IDM1LjUtMjguNSA0OS42LTIwLjMgNi43IDMuOSA5LjUgMjYuMiAxMC4xIDM3IC40IDktLjggMTgtNC41IDIyLjgtMTguOC0uNi0zNS44LTIuOC01MC43LTcgLjktNi4xLTEtMTIuMSAuNi0xNi41em0tMTcuMi0yMGMtMTYuOCAuOC0yNi0xLjItMzguMy0xMC44IC4yLS44IDEuNC0uNSAxLjUtMS40IDE4IDggNDAuOC0zLjMgNTktNC45LTcuOSA1LjEtMTQuNiAxMS42LTIyLjIgMTcuMXptLTEyLjEgMzMuMmMtMS42LTkuNC0zLjUtMTItMi44LTIwLjIgMjUtMTYuNiAyOS43IDI4LjYgMi44IDIwLjJ6TTE5NC4zIDQzOC42Yy0xMS42LS43LTQ4LjEtMTQtMzguNS0yMy43IDkuNCA2LjUgMjcuNSA0LjkgNDEuMyA3LjMgLjggNC40LTIuOCAxMC4yLTIuOCAxNi40ek0yNiA0OTcuMWMtNC4zLTEyLjctOS4yLTI1LjEtMTQuOC0zNi45IDMwLjgtMjMuOCA2NS4zLTQ4LjkgMTAyLjItNjMuNSAyLjgtMS4xIDIzLjIgMjUuNCAyNi4yIDI3LjYgMTYuNSAxMS43IDM3IDIxIDU2LjIgMzAuMiAxLjIgOC44IDMuOSAyMC4yIDguNyAzNS41IC43IDIuMyAxLjQgNC43IDIuMiA3LjJsLTE4MC43IDAgMC0uMXptMjQwLjYgNS43bC0uOCAwYy4zLS4yIC41LS40IC44LS41bDAgLjV6bTcuNS01LjdjMi4xLTEuNCA0LjMtMi44IDYuNC00LjMgMS4xIDEuNCAyLjIgMi44IDMuMiA0LjNsLTkuNiAwem0xNS4xLTI0LjdjLTEwLjggNy4zLTIwLjYgMTguMy0zMy4zIDI1LjItNiAzLjMtMjcgMTEuNy0zMy40IDEwLjItMy42LS44LTMuOS01LjMtNS40LTkuNS0zLjEtOS0xMC4xLTIzLjQtMTAuOC0zNy0uOC0xNy4yLTIuNS00NiAxNi00Mi40IDE0LjkgMi45IDMyLjMgOS43IDQzLjkgMTYuMSA3LjEgMy45IDExLjEgOC42IDIxLjkgOS41LS4xIDEuNC0uMSAyLjgtLjIgNC4zLTUuOSAzLjktMTUuMyAzLjgtMjEuOCA3LjEgOS41IC40IDE3IDIuNyAyMy41IDUuOS0uMSAzLjQtLjMgNy0uNCAxMC42em01My40IDI0LjdsLTE0IDBjLS4xLTMuMi0yLjgtNS44LTYuMS01LjhzLTUuOSAyLjYtNi4xIDUuOGwtMTcuNCAwYy0yLjgtNC40LTUuNy04LjYtOC45LTEyLjUgMi4xLTIuMiA0LTQuNyA2LTYuOSA5IDMuNyAxNC44LTQuOSAyMS43LTQuMiA3LjkgLjggMTQuMiAxMS43IDI1LjQgMTFsLS42IDEyLjZ6bTguNyAwYy4yLTQgLjQtNy44IC42LTExLjUgMTUuNi03LjMgMjkgMS4zIDM1LjcgMTEuNWwtMzYuMyAwem04My40LTM3Yy0yLjMgMTEuMi01LjggMjQtOS45IDM3LjEtLjItLjEtLjQtLjEtLjYtLjFsLTI3LjkgMGMuNi0xLjEgMS4yLTIuMiAxLjktMy4zLTIuNi02LjEtOS04LjctMTAuOS0xNS41IDEyLjEtMjIuNyA2LjUtOTMuNC0yNC4yLTc4LjUgNC4zLTYuMyAxNS42LTExLjUgMjAuOC0xOS4zIDEzIDEwLjQgMjAuOCAyMC4zIDMzLjIgMzEuNCA2LjggNiAyMCAxMy4zIDIxLjQgMjMuMSAuOCA1LjUtMi42IDE4LjktMy44IDI1LjF6TTE5MC41IDEzMC41YzUuNC0xNC45IDI3LjItMzQuNyA0NS0zMiA3LjcgMS4yIDE4IDguMiAxMi4yIDE3LjctMzAuMi03LTQ1LjIgMTIuNi01NC40IDMzLjEtOC4xLTItNC45LTEzLjEtMi44LTE4Ljh6bTE4NC4xIDYzLjFjOC4yLTMuNiAyMi40LS43IDI5LjYtNS4zLTQuMi0xMS41LTEwLjMtMjEuNC05LjMtMzcuNyAuNSAwIDEgMCAxLjQgLjEgNi44IDE0LjIgMTIuNyAyOS4yIDIxLjQgNDEuNy01LjcgMTMuNS00My42IDI1LjQtNDMuMSAxLjJ6bS05Ni44IDIuN2MtNi44LTEwLjktMTktMzIuNS0xNC41LTQ1LjMgNi41IDExLjkgOC42IDI0LjQgMTcuOCAzMy4zIDQuMSA0IDEyLjIgOSA4LjIgMjAuMi0uOSAyLjctNy44IDguNi0xMS43IDkuNy0xNC40IDQuMy00Ny45IC45LTM2LjYtMTcuMSAxMS45IC43IDI3LjkgNy44IDM2LjgtLjh6bTI3LjMgNzBjMy44IDYuNiAxLjQgMTguNyAxMi4xIDIwLjYgMjAuMiAzLjQgNDMuNi0xMi4zIDU4LjEtMTcuOCA5LTE1LjItLjgtMjAuNy04LjktMzAuNS0xNi42LTIwLTM4LjgtNDQuOC0zOC03NC43IDYuNy00LjkgNy4zIDcuNCA4LjIgOS43IDguNyAyMC4zIDMwLjQgNDYuMiA0Ni4zIDYzLjUgMy45IDQuMyAxMC4zIDguNCAxMSAxMS4yIDIuMSA4LjItNS40IDE4LTQuNSAyMy41LTIxLjcgMTMuOS00NS44IDI5LjEtODEuNCAyNS42LTcuNC02LjctMTAuMy0yMS40LTIuOS0zMS4xem0tMjAxLjMtOS4yYy02LjgtMy45LTguNC0yMS0xNi40LTIxLjQtMTEuNC0uNy05LjMgMjIuMi05LjMgMzUuNS03LjgtNy4xLTkuMi0yOS4xLTMuNS00MC4zLTYuNi0zLjItOS41IDMuNi0xMy4xIDUuOSA0LjctMzQuMSA0OS44LTE1LjggNDIuMyAyMC4zem0yOTkuNiAyOC44Yy0xMC4xIDE5LjItMjQuNCA0MC40LTU0IDQxLS42LTYuMi0xLjEtMTUuNiAwLTE5LjQgMjIuNy0yLjIgMzYuNi0xMy43IDU0LTIxLjZ6TTI2MS41IDI5OC4zYzE4LjkgOS45IDUzLjYgMTEgNzkuMyAxMC4yIDEuNCA1LjYgMS4zIDEyLjYgMS40IDE5LjQtMzMgMS44LTcyLTYuNC04MC43LTI5LjZ6TTM1My43IDM0NWMtMS43IDQuMy01LjMgOS4zLTkuOCAxMS4xLTEyLjEgNC45LTQ1LjYgOC43LTYyLjQtLjMtMTAuNy01LjctMTcuNS0xOC41LTIzLjQtMjYtMi44LTMuNi0xNi45LTEyLjktLjItMTIuOSAxMy4xIDMyLjcgNTggMjkgOTUuOCAyOC4xeiJdCiAgICB9OwogICAgZmFTbGlkZXNoYXJlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNsaWRlc2hhcmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjFlNyIsICJNMTg3LjkgMTUzLjdjLTM0IDAtNjEuNyAyNS43LTYxLjcgNTcuNyAwIDMxLjcgMjcuNyA1Ny43IDYxLjcgNTcuN3M2MS43LTI2IDYxLjctNTcuN2MwLTMyLTI3LjctNTcuNy02MS43LTU3Ljd6bTE0My40IDBjLTM0IDAtNjEuNyAyNS43LTYxLjcgNTcuNyAwIDMxLjcgMjcuNyA1Ny43IDYxLjcgNTcuNyAzNC4zIDAgNjEuNy0yNiA2MS43LTU3LjcgLjEtMzItMjcuNC01Ny43LTYxLjctNTcuN3ptMTU2LjYgOTBsLTYgNC4zIDAtMTk4LjNjMC0yNy40LTIwLjYtNDkuNy00Ni00OS43TDc2LjggMGMtMjUuNCAwLTQ2IDIyLjMtNDYgNDkuN2wwIDE5OC4zYy0yLTEuNC00LjMtMi45LTYuMy00LjMtMTUuMS0xMC42LTI1LjEgNC0xNiAxNy43IDE4LjMgMjIuNiA1My4xIDUwLjMgMTA2LjMgNzItNTYuMyAxOTEuNyAxMzcuNCAyMjIuMyAxMzQuMyAxMjQuMSAwLS43IC4zLTU2LjYgLjMtOTYuNiA1LjEgMS4xIDkuNCAyLjMgMTMuNyAzLjEgMCAzOS43IC4zIDkyLjggLjMgOTMuNS0zLjEgOTguMyAxOTAuNiA2Ny43IDEzNC4zLTEyNCA1My4xLTIxLjcgODgtNDkuNCAxMDYuMy03MiA5LjEtMTMuOC0uOS0yOC4zLTE2LjEtMTcuOHptLTMwLjUgMTkuMmMtNjguOSAzNy40LTEyOC4zIDMxLjEtMTYwLjYgMjkuNy0yMy43LS45LTMyLjYgOS4xLTMzLjcgMjQuOS0xMC4zLTcuNy0xOC42LTE1LjUtMjAuMy0xNy4xLTUuMS01LjQtMTMuNy04LTI3LjEtNy43LTMxLjcgMS4xLTg5LjcgNy40LTE1Ny40LTI4bDAtMTkyLjRjMC0zNC45IDguOS00NS43IDQwLjYtNDUuN2wzMTcuNyAwYzMwLjMgMCA0MC45IDEyLjkgNDAuOSA0NS43bDAgMTkwLjYtLjEgMHoiXQogICAgfTsKICAgIGZhVWJlciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ1YmVyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY0MDIiLCAiTTQxNC4xIDMyTDMzLjkgMzJDMTUuMiAzMiAwIDQ3LjIgMCA2NS45TDAgNDQ2YzAgMTguOCAxNS4yIDM0IDMzLjkgMzRMNDE0IDQ4MGMxOC43IDAgMzMuOS0xNS4yIDMzLjktMzMuOWwwLTM4MC4yQzQ0OCA0Ny4yIDQzMi44IDMyIDQxNC4xIDMyek0yMzcuNiAzOTEuMUMxNjMgMzk4LjYgOTYuNCAzNDQuMiA4OC45IDI2OS42bDk0LjQgMCAwIDIwLjRjMCAzLjcgMyA2LjggNi44IDYuOGw2Ny45IDBjMy43IDAgNi44LTMgNi44LTYuOGwwLTY3LjljMC0zLjctMy02LjgtNi44LTYuOGwtNjcuOSAwYy0zLjcgMC02LjggMy02LjggNi44bDAgMjAuNC05NC40IDBjNy02OS40IDY1LjQtMTIyLjIgMTM1LjEtMTIyLjJzMTI4LjEgNTIuOCAxMzUuMSAxMjIuMmM3LjUgNzQuNS00Ni45IDE0MS4xLTEyMS41IDE0OC42eiJdCiAgICB9OwogICAgZmFEaWdpdGFsT2NlYW4gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZGlnaXRhbC1vY2VhbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMzkxIiwgIk04NyA0ODEuOGw3My43IDAgMC03My42LTczLjcgMCAwIDczLjZ6TTI1LjQgMzQ2LjZsMCA2MS42IDYxLjYgMCAwLTYxLjYtNjEuNiAwek00OTEuNiAxNzYuOUM0NjguNiAxMDIuNyA0MDkuMiA0My42IDMzNSAyMC4zIDE2NC45LTMyLjggOCA5My43IDggMjU1LjlsOTUuOCAwYzAtMTAxLjggMTAxLTE4MC41IDIwOC4xLTE0MS43IDM5LjcgMTQuMyA3MS41IDQ2LjEgODUuOCA4NS43IDM5LjEgMTA3LTM5LjcgMjA3LjgtMTQxLjQgMjA4bDAgLjMtLjMgMCAwIDk1LjhjMTYyLjYgMCAyODguOC0xNTYuOCAyMzUuNi0zMjcuMXptLTIzNS4zIDIzMWwwLTk1LjMtOTUuNiAwIDAgOTUuNiA5NS4zIDAgMC0uMyAuMyAweiJdCiAgICB9OwogICAgZmFTb3VuZGNsb3VkID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNvdW5kY2xvdWQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjFiZSIsICJNNjQwLjIgMjk4LjZjLTEuMyAyMy4xLTExLjUgNDQuOC0yOC40IDYwLjVzLTM5LjIgMjQuNC02Mi4zIDI0LjFsLTIxOCAwYy00LjggMC05LjQtMi0xMi44LTUuNHMtNS4zLTgtNS4zLTEyLjhsMC0yMzQuOGMtLjItNCAuOS04IDMuMS0xMS40czUuMy02LjEgOS03LjdjMCAwIDIwLjEtMTMuOSA2Mi4zLTEzLjkgMjUuOCAwIDUxLjEgNi45IDczLjMgMjAuMSAxNy4zIDEwLjIgMzIuMyAyMy44IDQ0LjEgNDAuMXMyMCAzNC44IDI0LjIgNTQuNGM3LjUtMi4xIDE1LjMtMy4yIDIzLjEtMy4yIDExLjctLjEgMjMuMyAyLjIgMzQuMiA2LjdzMjAuNSAxMS4zIDI4LjcgMTkuNyAxNC42IDE4LjMgMTguOSAyOS4zIDYuMyAyMi42IDUuOSAzNC4zem0tMzU0LTE1My41Yy4xLTEgMC0yLS4zLTIuOXMtLjgtMS44LTEuNS0yLjYtMS41LTEuMy0yLjQtMS43Yy0xLjgtLjgtNC0uOC01LjggMC0uOSAuNC0xLjcgMS0yLjQgMS43cy0xLjIgMS42LTEuNSAyLjYtLjQgMS45LS4zIDIuOWMtNiA3OC45LTEwLjYgMTUyLjkgMCAyMzEuNiAuMiAxLjcgMSAzLjMgMi4zIDQuNSAyLjYgMi40IDYuOCAyLjQgOS40IDAgMS4zLTEuMiAyLjEtMi44IDIuMy00LjUgMTEuMy03OS40IDYuNi0xNTIgMC0yMzEuNmwuMiAwem0tNDQgMjcuM2MtLjItMS44LTEuMS0zLjUtMi40LTQuN3MtMy4xLTEuOS01LTEuOS0zLjYgLjctNSAxLjktMi4yIDIuOS0yLjQgNC43Yy03LjkgNjcuOS03LjkgMTM2LjUgMCAyMDQuNCAuMyAxLjggMS4yIDMuNCAyLjUgNC41czMuMSAxLjggNC44IDEuOCAzLjUtLjYgNC44LTEuOCAyLjItMi44IDIuNS00LjVjOC44LTY3LjggOC44LTEzNi41IC4xLTIwNC40bC4xIDB6bS00NC4zLTYuOWMtLjItMS44LTEtMy40LTIuMy00LjZzLTMtMS44LTQuOC0xLjgtMy41IC43LTQuOCAxLjgtMi4xIDIuOC0yLjMgNC42Yy02LjcgNzItMTAuMiAxMzkuMyAwIDIxMS4xIDAgMS45IC43IDMuNyAyLjEgNXMzLjEgMi4xIDUgMi4xIDMuNy0uNyA1LTIuMSAyLjEtMy4xIDIuMS01YzEwLjUtNzIuOCA3LjMtMTM4LjIgLjEtMjExLjFsLS4xIDB6bS00NCAyMC42YzAtMS45LS44LTMuOC0yLjEtNS4ycy0zLjItMi4xLTUuMi0yLjEtMy44IC44LTUuMiAyLjEtMi4xIDMuMi0yLjEgNS4yYy04LjEgNjMuMy04LjEgMTI3LjUgMCAxOTAuOCAuMiAxLjggMSAzLjQgMi40IDQuNnMzLjEgMS45IDQuOCAxLjkgMy41LS43IDQuOC0xLjkgMi4yLTIuOCAyLjQtNC42YzguOC02My4zIDguOS0xMjcuNSAuMy0xOTAuOGwtLjEgMHptLTQ0LjUgNDcuNmMwLTEuOS0uOC0zLjgtMi4xLTUuMXMtMy4yLTIuMS01LjEtMi4xLTMuOCAuOC01LjEgMi4xLTIuMSAzLjItMi4xIDUuMWMtMTAuNSA0OS4yLTUuNSA5My45IC40IDE0My42IC4zIDEuNiAxLjEgMy4xIDIuMyA0LjJzMi44IDEuNyA0LjUgMS43IDMuMi0uNiA0LjUtMS43IDIuMS0yLjUgMi4zLTQuMmM2LjYtNTAuNCAxMS42LTk0LjEgLjQtMTQzLjZ6bS00NC4xLTcuNWMtLjItMS44LTEuMS0zLjUtMi40LTQuOHMtMy4yLTEuOS01LTEuOS0zLjYgLjctNSAxLjktMi4yIDIuOS0yLjQgNC44Yy05LjMgNTAuMi02LjIgOTQuNCAuMyAxNDQuNSAuNyA3LjYgMTMuNiA3LjUgMTQuNCAwIDcuMi01MC45IDEwLjUtOTMuOCAuMy0xNDQuNWwtLjIgMHpNMjAuNyAyNTAuOGMtLjItMS44LTEuMS0zLjUtMi40LTQuOHMtMy4yLTEuOS01LTEuOS0zLjYgLjctNSAxLjktMi4zIDIuOS0yLjQgNC44Yy04LjUgMzMuNy01LjkgNjEuNiAuNiA5NS40IC4yIDEuNyAxIDMuMyAyLjMgNC40czIuOSAxLjggNC43IDEuOCAzLjQtLjYgNC43LTEuOCAyLjEtMi43IDIuMy00LjRjNy41LTM0LjUgMTEuMi02MS44IC40LTk1LjRsLS4yIDB6Il0KICAgIH07CiAgICBmYVNxdWFyZUZpZ21hID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1maWdtYSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlN2U0IiwgIk0zODQgMzJjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDMyMCAwek0xNzMuNyA5NmMtMzMgMC01OS44IDI2LjgtNTkuOCA1OS44IDAgMjEgMTAuOCAzOS40IDI3LjIgNTAuMS0xNi40IDEwLjctMjcuMiAyOS4xLTI3LjIgNTAuMXMxMC44IDM5LjUgMjcuMiA1MC4xYy0xNi40IDEwLjctMjcuMiAyOS4xLTI3LjIgNTAuMSAwIDMzLjEgMjcuMSA1OS44IDYwLjEgNTkuOCAzMy4yIDAgNjAuNi0yNi45IDYwLjYtNjAuM2wwLTU1LjdjMTAuNiA5LjggMjQuOCAxNS44IDQwLjQgMTUuOGwxLjEgMGMzMyAwIDU5LjgtMjYuOCA1OS44LTU5LjggMC0yMS0xMC44LTM5LjUtMjcuMi01MC4xIDE2LjQtMTAuNyAyNy4yLTI5LjEgMjcuMi01MC4xIDAtMzMtMjYuOC01OS44LTU5LjgtNTkuOEwxNzMuNyA5NnptNDEuNiAyMTkuOGwwIDM5LjljMCAyMi42LTE4LjYgNDEtNDEuMyA0MS0yMi40IDAtNDAuNy0xOC4yLTQwLjctNDAuNSAwLTIyLjMgMTguMS00MC40IDQwLjMtNDAuNGw0MS43IDB6bTAtMTAwLjNsMCA4MC45LTQxLjcgMGMtMjIuMy0uMS00MC4zLTE4LjItNDAuMy00MC41IDAtMjIuMyAxOC4xLTQwLjUgNDAuNS00MC41bDQxLjYgMHptNjAuOCAwYzIyLjMgMCA0MC41IDE4LjEgNDAuNSA0MC41cy0xOC4xIDQwLjUtNDAuNSA0MC41bC0xLjEgMGMtMjIuMyAwLTQwLjQtMTguMS00MC40LTQwLjVzMTguMS00MC41IDQwLjQtNDAuNWwxLjEgMHptLTYwLjgtMTkuM2wtNDEuNiAwYy0yMi4zIDAtNDAuNS0xOC4xLTQwLjUtNDAuNHMxOC4xLTQwLjUgNDAuNS00MC41bDQxLjYgMCAwIDgwLjl6bTYwLjgtODAuOWMyMi4zIDAgNDAuNSAxOC4xIDQwLjUgNDAuNXMtMTguMSA0MC40LTQwLjUgNDAuNGwtNDEuNSAwIDAtODAuOSA0MS41IDB6Il0KICAgIH07CiAgICBmYUNyZWF0aXZlQ29tbW9uc1NhID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNyZWF0aXZlLWNvbW1vbnMtc2EiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjRlZiIsICJNMjU1LjYgOEMzOTcuNCA4IDUwNCAxMTguMSA1MDQgMjU2IDUwNCA0MDMuMSAzODUuNSA1MDQgMjU1LjYgNTA0IDEyMS42IDUwNCA4IDM5NC41IDggMjU2IDggMTIzLjEgMTEyLjcgOCAyNTUuNiA4em0uOCA0NC43Yy0xMTguMiAwLTIwMy43IDk3LjktMjAzLjcgMjAzLjMgMCAxMDkuOCA5MS4yIDIwMi44IDIwMy43IDIwMi44IDEwMy4yIDAgMjAyLjgtODEuMSAyMDIuOC0yMDIuOCAuMS0xMTMuOC05MC4yLTIwMy4zLTIwMi44LTIwMy4zek0xNDUuNyAyMjFjMTMtODMuOSA4MC41LTk1LjcgMTA4LjktOTUuNyA5OS44IDAgMTI3LjUgODIuNSAxMjcuNSAxMzQuMiAwIDYzLjYtNDEgMTMyLjktMTI4LjkgMTMyLjktMzguOSAwLTk5LjEtMjAtMTA5LjQtOTdsNjIuNSAwYzEuNSAzMC4xIDE5LjYgNDUuMiA1NC41IDQ1LjIgMjMuMyAwIDU4LTE4LjIgNTgtODIuOCAwLTgyLjUtNDkuMS04MC42LTU2LjctODAuNi0zMy4xIDAtNTEuNyAxNC42LTU1LjggNDMuOGwxOC4yIDAtNDkuMiA0OS4yLTQ5LTQ5LjIgMTkuNCAweiJdCiAgICB9OwogICAgZmFDaHJvbWUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY2hyb21lIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyNjgiLCAiTTAgMjU2YzAtNDYuNiAxMi41LTkwLjQgMzQuMy0xMjguOUwxNDQuMSAzMTguM2MyMS45IDM5LjIgNjMuOCA2NS43IDExMS45IDY1LjcgMTQuMyAwIDI3LjEtMi4zIDQwLjgtNi42TDIyMC41IDUwOS42Qzk1LjkgNDkyLjMgMCAzODUuMyAwIDI1NnptMzY1LjEgNjUuNmMxMi4zLTE5LjIgMTguOS00Mi41IDE4LjktNjUuNiAwLTM4LjItMTYuOC03Mi41LTQzLjMtOTZsMTUyLjcgMGMxMiAyOS42IDE4LjYgNjIuMSAxOC42IDk2IDAgMTQxLjQtMTE0LjYgMjU1LjEtMjU2IDI1NkwzNjUuMSAzMjEuNnpNNDc3LjggMTI4TDI1NiAxMjhjLTYyLjkgMC0xMTMuNyA0NC4xLTEyNS41IDEwMi43TDU0LjIgOTguNUMxMDEgMzguNSAxNzQgMCAyNTYgMCAzNTAuOCAwIDQzMy41IDUxLjUgNDc3LjggMTI4ek0zNDQgMjU2YTg4IDg4IDAgMSAxIC0xNzYgMCA4OCA4OCAwIDEgMSAxNzYgMHoiXQogICAgfTsKICAgIGZhVHJhZGVGZWRlcmF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInRyYWRlLWZlZGVyYXRpb24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjUxMyIsICJNMjU2IDguOGEyNDcuMiAyNDcuMiAwIDEgMCAwIDQ5NC40IDI0Ny4yIDI0Ny4yIDAgMSAwIDAtNDk0LjR6bTAgMTEuNmEyMzUuNiAyMzUuNiAwIDEgMSAwIDQ3MS4yIDIzNS42IDIzNS42IDAgMSAxIDAtNDcxLjJ6TTQxMS4xIDE2My4xbDAtNDYuOC0xOTMuOCAwIDAgODEuNy0xNTUuMSAwIDM2LjcgNDYgMTE3LjcgMCAwIDE5Ni44IDQ4LjggMCAwLTE5NS44IDgzLjMgMCAwLTQ3LTgzLjMgMCAwLTM0LjggMTQ1LjcgMCAwLS4xem0tNzMuMyA0NS4xbDAgMjMuOS04Mi45IDAgMCAxOTcuNC0yNi44IDAgMC0xOTcuNC0xMjMuOCAwLTIwLjEtMjMuOSAxNDMuOSAwIDAtODAuNiAxNzEuOCAwIDAgMjQuNC0xNDUgMCAwIDU2LjIgODIuOSAwem0tMTYxLjMtNjlsLTEyLjQtMjAuNyAyLjEgMjMuOC0yMy41IDUuNCAyMy4zIDUuNC0yLjEgMjQgMTIuMy0yMC41IDIyLjIgOS41LTE1LjctMTguMSAxNS44LTE4LjEtMjIgOS4zem0tMjkuNi0xOS43bDkuMy0xMS41LTEyLjcgNS45LTgtMTIuNCAxLjcgMTMuOS0xNC4zIDMuOCAxMy43IDIuNy0uOCAxNC43IDYuOC0xMi4yIDEzLjggNS4zLTkuNS0xMC4yek0zMTIuMyAyNjQuN2wtMTMuMSA1LjYtNy4zLTEyLjIgMS4zIDE0LjItMTMuOSAzLjIgMTMuOSAzLjItMS4yIDE0LjIgNy4zLTEyLjIgMTMuMSA1LjUtOS40LTEwLjcgOS4zLTEwLjh6bTEwNi45LTc3LjJsLTIwLjkgOS4xLTEyLTE5LjYgMi4yIDIyLjctMjIuMyA1LjQgMjIuMiA0LjktMS44IDIyLjkgMTEuNS0xOS42IDIxLjIgOC44LTE1LjEtMTcgMTUtMTcuNnpNMjU2IDI5LjlhMjI2LjEgMjI2LjEgMCAxIDAgMCA0NTIuMiAyMjYuMSAyMjYuMSAwIDEgMCAwLTQ1Mi4yek0zNTAuNiAxOTZsMCA1MS04My4zIDAgMCAxOTUuNy01Mi43IDAgMC0xOTYuOC0xMTYuNyAwLTQwLTQ5LjkgMTU3LjQgMCAwLTgxLjYgMTk3LjggMCAwIDUwLjctMTQ1LjcgMCAwIDMwLjkgODMuMiAwek0yNTYgNDMuMmM2MC4zIDAgMTE0LjggMjUgMTUzLjYgNjUuMmwtMTk5LjEgMCAwIDgxLjYtMTU3LjQgMEM4MS4xIDEwNC44IDE2MS40IDQzLjIgMjU2IDQzLjJ6bTAgNDI3LjFjLTExNy45IDAtMjEzLjYtOTUuNi0yMTMuNi0yMTMuNSAwLTIxLjIgMy4xLTQxLjggOC45LTYxLjFsNDMuOCA1Ni4zIDExNC43IDAgMCAxOTYuOCA2NC42IDAgMC0xOTUuOCA4My4zIDAgMC02Mi43LTgzLjIgMCAwLTE5LjIgMTQ1LjYgMCAwLTUwLjhjMzAuOCAzNyA0OS4zIDg0LjYgNDkuMyAxMzYuNSAuMSAxMTcuOS05NS41IDIxMy41LTIxMy40IDIxMy41ek0xODYuOCAyNzVsLTExLTIxLjQgMS43IDI0LjUtMjMuNyAzLjkgMjMuOCA1LjktMy43IDIzLjggMTMtMjAuOSAyMS41IDEwLjgtMTUuOC0xOC44IDE2LjktMTcuMS0yMi43IDkuM3oiXQogICAgfTsKICAgIGZhVmFhZGluID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInZhYWRpbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNDA4IiwgIk0yMjQuNSAxNDAuN0MyMjYgMTIzLjEgMjI5LjQgODggMjc0LjMgODhsOTguNiAwYzIwLjcgMCAzMi4xLTcuOCAzMi4xLTIxLjZsMC0xMi4zYzAtMTIuMiA5LjMtMjIuMSAyMS41LTIyLjFTNDQ4IDQxLjkgNDQ4IDU0LjFsMCAzNi41YzAgNDIuOS0yMS41IDYyLTY2LjggNjJsLTEwMC41IDBjLTMwLjEgMC0zMyAxNC43LTMzIDI3LjEgMCAxLjMtLjEgMi41LS4yIDMuNy0uNyAxMi4zLTEwLjkgMjIuMi0yMy40IDIyLjJzLTIyLjctOS44LTIzLjQtMjIuMmMtLjEtMS4yLS4yLTIuNC0uMi0zLjcgMC0xMi4zLTMtMjcuMS0zMy0yNy4xbC0xMDAuNyAwQzIxLjUgMTUyLjYgMCAxMzMuNSAwIDkwLjZMMCA1NC4xQzAgNDEuOSA5LjQgMzIgMjEuNiAzMnMyMS41IDkuOSAyMS41IDIyLjFsMCAxMi4zQzQzLjEgODAuMiA1NC41IDg4IDc1LjIgODhsOTguNiAwYzQ0LjggMCA0OC4zIDM1LjEgNDkuOCA1Mi43bC45IDB6TTIyNCA0NTZjMTEuNSAwIDIxLjQtNyAyNS43LTE2LjMgMS4xLTEuOCA5Ny4xLTE2OS42IDk4LjItMTcxLjQgMTEuOS0xOS42LTMuMi00NC4zLTI3LjItNDQuMy0xMy45IDAtMjMuMyA2LjQtMjkuOCAyMC4zTDIyNCAzNjIgMTU3LjEgMjQ0LjNjLTYuNC0xMy45LTE1LjktMjAuMy0yOS44LTIwLjMtMjQgMC0zOS4xIDI0LjYtMjcuMiA0NC4zIDEuMSAxLjkgOTcuMSAxNjkuNiA5OC4yIDE3MS40IDQuMyA5LjMgMTQuMiAxNi4zIDI1LjcgMTYuM3oiXQogICAgfTsKICAgIGZhRGV2aWFudGFydCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJkZXZpYW50YXJ0IiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbXSwgImYxYmQiLCAiTTMyMCA5My4ybC05OC4yIDE3OS4xIDcuNCA5LjUgOTAuOCAwIDAgMTI3LjctMTYwLjkgMC0xMy41IDkuMi00My43IDg0Yy0uMyAwLTguNiA4LjYtOS4yIDkuMmwtOTIuNyAwIDAtOTMuMiA5My4yLTE3OS40LTcuNC05LjItODUuOCAwIDAtMTI3LjYgMTU2IDAgMTMuNS05LjIgNDMuNy04NGMuMyAwIDguNi04LjYgOS4yLTkuMmw5Ny42IDAgMCA5My4xeiJdCiAgICB9OwogICAgZmFNZWRpdW0gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibWVkaXVtIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbNjI0MDcsICJtZWRpdW0tbSJdLCAiZjIzYSIsICJNMzY5LjQgMzJjNDMuNCAwIDc4LjYgMzUuMiA3OC42IDc4LjZsMCA4My44Yy0xLjktLjEtMy44LS4yLTUuNy0uMmwtLjQgMGMtMTAgMC0yMi4zIDIuNC0zMS4xIDYuOC0xMCA0LjYtMTguNyAxMS41LTI2IDIwLjYtMTEuOCAxNC42LTE4LjkgMzQuMy0yMC42IDU2LjQtLjEgLjctLjEgMS4zLS4yIDJzLS4xIDEuMi0uMSAxLjljLS4xIDEuMi0uMSAyLjQtLjEgMy42IDAgMS45LS4xIDMuOCAwIDUuOCAxLjIgNTAuMSAyOC4yIDkwLjIgNzYuMyA5MC4yIDIuNyAwIDUuMy0uMSA3LjktLjRsMCAyMC40YzAgNDMuNC0zNS4yIDc4LjYtNzguNiA3OC42TDc4LjYgNDgwQzM1LjIgNDgwIDAgNDQ0LjggMCA0MDEuNEwwIDExMC42QzAgNjcuMiAzNS4yIDMyIDc4LjYgMzJsMjkwLjggMHpNODIuMyAxMzguOWwuMyAuMWMxMy4yIDMgMTkuOCA3LjQgMTkuOCAyMy40bDAgMTg3LjJjMCAxNi02LjcgMjAuNC0xOS45IDIzLjRsLS4zIC4xIDAgMi44IDUyLjggMCAwLTIuOC0uMy0uMWMtMTMuMi0zLTE5LjktNy40LTE5LjktMjMuNGwwLTE3Ni4zIDg2LjEgMjAyLjUgNC45IDAgODguNi0yMDguMiAwIDE4Ni42Yy0xLjEgMTIuNi03LjggMTYuNS0xOS43IDE5LjJsLS4zIC4xIDAgMi43IDkxLjkgMCAwLTIuNy0uMy0uMWMtMTEuOS0yLjctMTguNy02LjYtMTkuOS0xOS4ybC0uMS0xOTEuOCAuMSAwYzAtMTYgNi43LTIwLjQgMTkuOS0yMy40bC4zLS4xIDAtMi43LTcyLjIgMC02NyAxNTcuNC02Ny0xNTcuNC03Ny44IDAgMCAyLjd6TTQ0OCAzNDAuM2MtMjUuMS03LjQtNDMtMzUuMS00MS4yLTY3LjhsMCAwIDQxLjEgMCAwIDY3Ljh6bS02LjQtMTM1LjZjMi4zIDAgNC40IC4zIDYuNCAuOWwwIDU3LjQtNDAuMiAwYzEuNS0zMy42IDEzLjYtNTcuOSAzMy44LTU4LjN6Il0KICAgIH07CiAgICBmYU1lZGl1bU0gPSBmYU1lZGl1bTsKICAgIGZhT3BlbmNhcnQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAib3BlbmNhcnQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjIzZCIsICJNMzMxLjggNDQwLjRhNDUuOCA0NS44IDAgMSAxIDkxLjUgLjMgNDUuOCA0NS44IDAgMSAxIC05MS41LS4zek0xNjkuNCAzOTQuOWE0NS43IDQ1LjcgMCAxIDAgLjMgOTEuMyA0NS43IDQ1LjcgMCAxIDAgLS4zLTkxLjN6bTI5MS43LTI3MGMtMzAyLjIgMC0zNzkuMi0xMi44LTQ2MS4xLTk5LjIgMzQuNCA1MS43IDUzLjMgMTQ4LjkgMzczLjEgMTQ0LjIgMzMzLjMtNSAxMzAgODYuMSA3MC44IDE4OC45IDE4Ni43LTE2Ni43IDMxOS40LTIzMy45IDE3LjItMjMzLjl6Il0KICAgIH07CiAgICBmYVlDb21iaW5hdG9yID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInktY29tYmluYXRvciIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMjNiIiwgIk00NDggMzJsMCA0NDgtNDQ4IDAgMC00NDggNDQ4IDB6TTIzNiAyODcuNWw3Ny41LTE0NS41LTMyLjcgMC00NS44IDkxYy00LjcgOS4zLTkgMTguMy0xMi44IDI2LjhsLTEyLjItMjYuOC00NS4yLTkxLTM1IDAgNzYuNyAxNDMuOCAwIDk0LjUgMjkuNSAwIDAtOTIuOHoiXQogICAgfTsKICAgIGZhTGluZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJsaW5lIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzYzAiLCAiTTMxMSAxOTYuOGwwIDgxLjNjMCAyLjEtMS42IDMuNy0zLjcgMy43bC0xMyAwYy0xLjMgMC0yLjQtLjctMy0xLjVMMjU0IDIzMCAyNTQgMjc4LjJjMCAyLjEtMS42IDMuNy0zLjcgMy43bC0xMyAwYy0yLjEgMC0zLjctMS42LTMuNy0zLjdsMC04MS4zYzAtMi4xIDEuNi0zLjcgMy43LTMuN2wxMi45IDBjMS4xIDAgMi40IC42IDMgMS42bDM3LjMgNTAuMyAwLTQ4LjJjMC0yLjEgMS42LTMuNyAzLjctMy43bDEzIDBjMi4xLS4xIDMuOCAxLjYgMy44IDMuNWwwIC4xem0tOTMuNy0zLjdsLTEzIDBjLTIuMSAwLTMuNyAxLjYtMy43IDMuN2wwIDgxLjNjMCAyLjEgMS42IDMuNyAzLjcgMy43bDEzIDBjMi4xIDAgMy43LTEuNiAzLjctMy43bDAtODEuM2MwLTEuOS0xLjYtMy43LTMuNy0zLjd6bS0zMS40IDY4LjFsLTM1LjYgMCAwLTY0LjRjMC0yLjEtMS42LTMuNy0zLjctMy43bC0xMyAwYy0yLjEgMC0zLjcgMS42LTMuNyAzLjdsMCA4MS4zYzAgMSAuMyAxLjggMSAyLjUgLjcgLjYgMS41IDEgMi41IDFsNTIuMiAwYzIuMSAwIDMuNy0xLjYgMy43LTMuN2wwLTEzYzAtMS45LTEuNi0zLjctMy41LTMuN2wuMSAwem0xOTMuNy02OC4xbC01Mi4zIDBjLTEuOSAwLTMuNyAxLjYtMy43IDMuN2wwIDgxLjNjMCAxLjkgMS42IDMuNyAzLjcgMy43bDUyLjIgMGMyLjEgMCAzLjctMS42IDMuNy0zLjdsMC0xMy4xYzAtMi4xLTEuNi0zLjctMy43LTMuN2wtMzUuNSAwIDAtMTMuNiAzNS41IDBjMi4xIDAgMy43LTEuNiAzLjctMy43bDAtMTMuMWMwLTIuMS0xLjYtMy43LTMuNy0zLjdsLTM1LjUgMCAwLTEzLjcgMzUuNSAwYzIuMSAwIDMuNy0xLjYgMy43LTMuN2wwLTEzYy0uMS0xLjktMS43LTMuNy0zLjctMy43bC4xIDB6TTUxMiA5My40bDAgMzI2Yy0uMSA1MS4yLTQyLjEgOTIuNy05My40IDkyLjZsLTMyNiAwQzQxLjQgNTExLjktLjEgNDY5LjggMCA0MTguNmwwLTMyNkMuMSA0MS40IDQyLjItLjEgOTMuNCAwbDMyNiAwYzUxLjIgLjEgOTIuNyA0Mi4xIDkyLjYgOTMuNHpNNDQxLjYgMjMzLjVjMC04My40LTgzLjctMTUxLjMtMTg2LjQtMTUxLjNTNjguOCAxNTAuMSA2OC44IDIzMy41YzAgNzQuNyA2Ni4zIDEzNy40IDE1NS45IDE0OS4zIDIxLjggNC43IDE5LjMgMTIuNyAxNC40IDQyLjEtLjggNC43LTMuOCAxOC40IDE2LjEgMTAuMXMxMDcuMy02My4yIDE0Ni41LTEwOC4yYzI3LTI5LjcgMzkuOS01OS44IDM5LjktOTMuMWwwLS4yeiJdCiAgICB9OwogICAgZmFBbWlsaWEgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYW1pbGlhIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzNmQiLCAiTTI0MC4yIDMyYy02MS45IDAtMTMxLjUgMTYuOS0xODQuMiA1NS40LTUuMSAzLjEtOS4xIDkuMi03LjIgMTkuNCAxLjEgNS4xIDUuMSAyNy40IDEwLjIgMzkuNiA0LjEgMTAuMiAxNC4yIDEwLjIgMjAuMyA2LjEgMzIuNS0yMi4zIDk2LjUtNDcuNyAxNTIuMy00Ny43IDU3LjkgMCA1OC45IDI4LjQgNTguOSA3My4xbDAgMzguNUMyMDMuMSAyMjcuNyA3OC4zIDI1MSA0Ni44IDI2NC4yIDExLjMgMjgwLjUgMTYuNCAzNTcuNyAxNi40IDM3NlMzMS42IDQ4MCAxNDEuMyA0ODBjNDcuOCAwIDExMy43LTIwLjcgMTUzLjMtNDIuMWwwIDI1LjRjMCAzIDIuMSA4LjIgNi4xIDkuMSAzLjEgMSA1MC43IDIgNTkuOSAyczYyLjUgLjMgNjYuNS0uN2M0LjEtMSA1LjEtNi4xIDUuMS05LjFsMC0yOTYuNmMtLjEtODAuMy01Ny45LTEzNi0xOTItMTM2em01MC4yIDM0OGMtMjEuNCAxMy4yLTQ4LjcgMjQuNC03OS4xIDI0LjQtNTIuOCAwLTU4LjktMzMuNS01OS00NC43IDAtMTIuMi0zLTQyLjcgMTguMy01Mi45IDI0LjMtMTMuMiA3NS4xLTI5LjQgMTE5LjgtMzMuNWwwIDEwNi43eiJdCiAgICB9OwogICAgZmFBc3ltbWV0cmlrID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImFzeW1tZXRyaWsiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjM3MiIsICJNNTE3LjUgMzA5LjJjMzguOC00MCA1OC4xLTgwIDU4LjUtMTE2LjEgLjgtNjUuNS01OS40LTExOC4yLTE2OS40LTEzNS0xMjguNy0xOS43LTI4OC41IDE1LjUtNDA2LjYgODIuNCA1Mi0yNi41IDExMC42LTQ4LjIgMTcwLjctNTguMiA3NC41LTIwLjUgMTUzLTI1LjQgMjIxLjMtMTQuOCAxNTIuNSAyMy44IDE5Ni44IDEyNy41IDk4LjggMjMxLjctMTAuMiAxMC44LTIyIDIxLjEtMzUgMzAuNkwzMDQuOSAxMDMuNCAxMTQuNyAzODguOWMtNjUuNi0yOS40LTc2LjUtOTAuMi0xOS4xLTE1MS4yIDIwLjgtMjIuMiA0OC4zLTQxLjkgNzkuNS01OC4xIDIwLTEyLjIgMzkuNy0yMi42IDYyLTMwLjctNjUuMSAyMC4zLTEyMi43IDUyLjktMTYxLjYgOTIuOS0yNy43IDI4LjYtNDEuNCA1Ny4xLTQxLjcgODIuOS0uNSAzNS4xIDIzLjQgNjUuMSA2OC40IDgzbC0zNC41IDUxLjcgMTAxLjYgMCAyMi0zNC40YzIyLjIgMSA0NS4zIDAgNjguNi0yLjdsLTIyLjggMzcuMSAxMzUuNSAwLTMyLjYtNTMuMWMxOC42LTUuMyAzNi45LTExLjUgNTQuNS0xOC43bDQ1LjkgNzEuOCAxMDEuNiAwLTczLjQtMTEwLjRjMTguNS0xMi4xIDM1LTI1LjUgNDguOS0zOS44ek0zMjkuOSAzODkuN2wtMjUtNDAuNi0zMi43IDUzLjNjLTIzLjQgMy41LTQ2LjcgNS4xLTY5LjIgNC40bDEwMS45LTE1OS4zIDc4LjcgMTIzYy0xNy4yIDcuNC0zNS4zIDEzLjktNTMuNyAxOS4yeiJdCiAgICB9OwogICAgZmFQaGFicmljYXRvciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwaGFicmljYXRvciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmM2RiIiwgIk0zMzEuMSAyNjIuMWwtLjEtMTNzMjEuNy0xOS44IDIxLjEtMjEuMmwtOS41LTIwYy0uNi0xLjQtMjkuNS0uNS0yOS41LS41bC05LjQtOS4zcy4yLTI4LjUtMS4yLTI5LjFsLTIwLjEtOS4yYy0xLjQtLjYtMjAuNyAyMS0yMC43IDIxbC0xMy4xLS4ycy0yMC41LTIxLjQtMjEuOS0yMC44bC0yMCA4LjNjLTEuNCAuNSAuMiAyOC45IC4yIDI4LjlsLTkuMSA5LjFzLTI5LjItLjktMjkuNyAuNEwxNjAgMjI2LjNjLS42IDEuNCAyMSAyMSAyMSAyMWwuMSAxMi45UzE1OS40IDI4MCAxNjAgMjgxLjRsOS41IDIwYy42IDEuNCAyOS41IC41IDI5LjUgLjVsOS40IDkuM3MtLjIgMzEuOCAxLjIgMzIuM2wyMC4xIDguM2MxLjQgLjYgMjAuNy0yMy41IDIwLjctMjMuNWwxMy4xIC4yczIwLjUgMjMuOCAyMS44IDIzLjNsMjAtNy41YzEuNC0uNi0uMi0zMi4xLS4yLTMyLjFsOS4xLTkuMXMyOS4yIC45IDI5LjctLjVsOC4xLTE5LjhjLjctMS4xLTIwLjktMjAuNy0yMC45LTIwLjd6bS00NC45LTguN2MuNyAxNy4xLTEyLjggMzEuNi0zMC4xIDMyLjRzLTMyLjEtMTIuNS0zMi44LTI5LjYgMTIuOC0zMS42IDMwLjEtMzIuM2MxNy4zLS44IDMyLjEgMTIuNSAzMi44IDI5LjV6bTIwMS4yLTM3LjlsLTk3LTk3LS4xIC4xYy03NS4xLTczLjMtMTk1LjQtNzIuOC0yNjkuOCAxLjYtNTAuOSA1MS0yNy44IDI3LjktOTUuNyA5NS4zLTIyLjMgMjIuMy0yMi4zIDU4LjcgMCA4MSA2OS45IDY5LjQgNDYuNCA0NiA5Ny40IDk3bC4xLS4xYzc1LjEgNzMuMyAxOTUuNCA3Mi45IDI2OS44LTEuNiA1MS01MC45IDI3LjktMjcuOSA5NS4zLTk1LjMgMjIuMy0yMi4zIDIyLjMtNTguNyAwLTgxek0zNjMuNSAxNDguMmExNTIuMyAxNTIuMyAwIDEgMSAtMjE1IDIxNS42IDE1Mi4zIDE1Mi4zIDAgMSAxIDIxNS0yMTUuNnoiXQogICAgfTsKICAgIGZhQm90cyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJib3RzIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImUzNDAiLCAiTTg2LjMgMTk3LjhjLTgtLjEtMTUuOSAxLjctMjMuMSA1LjFzLTEzLjUgOC42LTE4LjQgMTQuOWwwLTYxLjljMC0yLjItLjktNC4zLTIuNC01LjhzLTMuNi0yLjQtNS44LTIuNGwtMjguNCAwYy0yLjIgMC00LjMgLjktNS44IDIuNFMwIDE1My44IDAgMTU2TDAgMzMzLjZjMCAxLjEgLjIgMi4xIC42IDMuMXMxIDEuOSAxLjggMi43IDEuNyAxLjQgMi43IDEuOCAyLjEgLjYgMy4xIC42bDI4LjQgMGMxLjEgMCAyLjEtLjIgMy4xLS42czEuOS0xIDIuNy0xLjggMS40LTEuNyAxLjgtMi43IC42LTIuMSAuNi0zLjFsMC04LjFjMTEuNiAxMy40IDI1LjkgMTkuOCA0MS42IDE5LjggMzQuNiAwIDYxLjktMjYuMiA2MS45LTczLjggMC00NS45LTI3LTczLjYtNjEuOS03My42ek03MS41IDMwNS43Yy05LjYgMC0yMS4yLTQuOS0yNi43LTEyLjVsMC00M2M1LjUtNy42IDE3LjItMTIuOCAyNi43LTEyLjggMTcuNyAwIDMxLjEgMTMuMSAzMS4xIDM0IDAgMjEuMi0xMy40IDM0LjMtMzEuMSAzNC4zem0xNTYuNC01OWExNy40IDE3LjQgMCAxIDAgMCAzNC44IDE3LjQgMTcuNCAwIDEgMCAwLTM0Ljh6bTQ2LjEtOTBsMC00NC43YzIuOC0xLjIgNS4yLTMuMyA2LjYtNnMxLjktNS44IDEuMy04LjktMi4yLTUuNy00LjYtNy43LTUuNC0zLTguNC0zLTYuMSAxLjEtOC40IDMtNCA0LjctNC42IDcuNy0uMSA2LjEgMS4zIDguOSAzLjggNC44IDYuNiA2bDAgNDQuN2MtMjggMS4zLTU0LjQgMTMuNi03My42IDM0LjFzLTI5LjUgNDcuNy0yOC44IDc1LjggMTIuMyA1NC43IDMyLjQgNzQuMyA0NyAzMC42IDc1LjEgMzAuNiA1NS0xMSA3NS4xLTMwLjYgMzEuNy00Ni4zIDMyLjQtNzQuMy05LjctNTUuMy0yOC44LTc1LjgtNDUuNS0zMi44LTczLjYtMzQuMXptODYgMTA3LjRjMCAzMC41LTQwLjggNTUuMy05MS4xIDU1LjNzLTkxLjEtMjQuNy05MS4xLTU1LjMgNDAuOC01NS4zIDkxLjEtNTUuMyA5MS4xIDI0LjcgOTEuMSA1NS4zbDAgMHptLTUwLjIgMTcuNGMzLjQgMCA2LjgtMSA5LjctMi45czUuMS00LjYgNi40LTcuOCAxLjctNi43IDEtMTAuMS0yLjMtNi41LTQuOC04LjktNS41LTQuMS04LjktNC44LTYuOS0uMy0xMC4xIDEtNS45IDMuNS03LjggNi40LTIuOSA2LjItMi45IDkuN2MwIDQuNiAxLjggOSA1LjEgMTIuM3M3LjcgNS4xIDEyLjMgNS4xbDAgMHptMjcwLjktMzFjLTE0LjgtMi42LTIyLjQtMy44LTIyLjQtOS45IDAtNS41IDcuMy05LjkgMTcuNy05LjkgMTIuMiAuMSAyNC4yIDMuNiAzNC41IDEwLjEgMS44IDEuMiA0IDEuNiA2LjIgMS4xczQtMS43IDUuMS0zLjZjLjEtLjEgLjEtLjIgLjItLjNsOC42LTE0LjljMS4xLTEuOSAxLjQtNC4xIC44LTYuMXMtMS45LTMuOS0zLjctNWMtMTUuNy05LjQtMzMuNy0xNC4zLTUyLTE0LjEtMzkgMC02MC4yIDIxLjUtNjAuMiA0Ni4yIDAgMzYuMyAzMy43IDQxLjkgNTcuNiA0NS42IDEzLjQgMi4zIDI0LjEgNC40IDI0LjEgMTEgMCA2LjQtNS41IDEwLjgtMTguOSAxMC44LTEzLjYgMC0zMS02LjItNDIuNi0xMy42LS45LS42LTEuOS0xLTMtMS4ycy0yLjEtLjItMy4yIC4xLTIuMSAuNy0yLjkgMS4zLTEuNiAxLjQtMi4yIDIuM2MwIC4xLS4xIC4xLS4xIC4ybC0xMC4yIDE2LjljLTEuMSAxLjgtMS40IDQtMSA2czEuNyAzLjkgMy41IDVjMTUuMiAxMC4zIDM3LjcgMTYuNyA1OS40IDE2LjcgNDAuNCAwIDY0LTE5LjggNjQtNDYuNSAwLTM4LjEtMzUuNS00My45LTU5LjMtNDguM3ptLTk1LjkgNjAuOGMtLjUtMi0xLjgtMy43LTMuNi00LjhzLTMuOS0xLjUtNS45LTEuMWMtMS40IC4zLTIuOCAuNC00LjIgLjQtNy44IDAtMTIuNS02LjEtMTIuNS0xNC4ybDAtNTEuMiAyMC4zIDBjMi4yIDAgNC4yLS45IDUuOC0yLjRzMi40LTMuNiAyLjQtNS44bDAtMjIuN2MwLTIuMi0uOS00LjItMi40LTUuOHMtMy42LTIuNC01LjgtMi40bC0yMC4zIDAgMC0zMC4yYzAtMi4yLS45LTQuMi0yLjQtNS44cy0zLjYtMi40LTUuOC0yLjRsLTI4LjIgMGMtMi4yIDAtNC4yIC45LTUuOCAyLjRzLTIuNCAzLjYtMi40IDUuOGwwIDMwLjItMTUuMSAwYy0xLjEgMC0yLjEgLjItMy4xIC42cy0xLjkgMS0yLjYgMS44LTEuNCAxLjctMS44IDIuNi0uNiAyLS42IDMuMWwwIDIyLjdjMCAxLjEgLjIgMi4xIC42IDMuMXMxIDEuOSAxLjggMi42IDEuNyAxLjQgMi42IDEuOCAyIC42IDMuMSAuNmwxNS4xIDAgMCA2My43YzAgMjcgMTUuNCA0MS4zIDQzLjkgNDEuMyAxMi4yIDAgMjEuNC0yLjIgMjcuNi01LjQgMS42LS44IDIuOS0yLjIgMy43LTMuOXMuOS0zLjYgLjUtNS40bC01LTE5LjN6Il0KICAgIH07CiAgICBmYVZpbmUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidmluZSIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMWNhIiwgIk0zODQgMjU0LjdsMCA1Mi4xYy0xOC40IDQuMi0zNi45IDYuMS01Mi4xIDYuMS0zNi45IDc3LjQtMTAzIDE0My44LTEyNS4xIDE1Ni4yLTE0IDcuOS0yNy4xIDguNC00Mi43LS44LTI3LjEtMTYuMy0xMjkuOS0xMDAuNi0xNjQuMS0zNjUuNmw3NC41IDBjMTguNyAxNTkuMSA2NC41IDI0MC43IDExNC44IDMwMS44IDI3LjktMjcuOSA1NC44LTY1LjEgNzUuNi0xMDYuOS00OS44LTI1LjMtODAuMS04MC45LTgwLjEtMTQ1LjYgMC02NS42IDM3LjctMTE1LjEgMTAyLjItMTE1LjEgMTE0LjkgMCAxMDYuMiAxMjcuOSA4MS42IDE4MS41IDAgMC00Ni40IDkuMi02My41LTIwLjUgMy40LTExLjMgOC4yLTMwLjggOC4yLTQ4LjUgMC0zMS4zLTExLjMtNDYuNi0yOC40LTQ2LjYtMTguMiAwLTMwLjggMTcuMS0zMC44IDUwIC4xIDc5LjIgNTkuNCAxMTguNyAxMjkuOSAxMDEuOXoiXQogICAgfTsKICAgIGZhTWVkcnQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibWVkcnQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjNjOCIsICJNMTI5LjcgMjU2YzAgMTIxLjggODMuOSAyMjIuOCAxOTMuNSAyNDEuMS0xOC43IDQuNS0zOC4yIDYuOS01OC4yIDYuOS0xMzcuNiAwLTI0OS0xMTEtMjQ5LTI0OFMxMjcuNCA4IDI2NC45IDhjMjAuMSAwIDM5LjYgMi40IDU4LjIgNi45LTEwOS42IDE4LjMtMTkzLjQgMTE5LjMtMTkzLjQgMjQxLjF6TTQyNy4xIDM1Ni4zYy03Ny43IDU1LjQtMTc5LjYgNDcuNS0yNDAuNC0xNC42IDUuNSAxNC4xIDEyLjcgMjcuNyAyMS43IDQwLjUgNjEuNiA4OC4yIDE4Mi40IDEwOS4zIDI2OS43IDQ3czEwOC4xLTE4NC4zIDQ2LjUtMjcyLjZjLTktMTIuOS0xOS4zLTI0LjMtMzAuNS0zNC4yIDM3LjQgNzguOCAxMC43IDE3OC41LTY3IDIzMy45em0tMjE4LjgtMjQ0Yy0xLjQgMS0yLjcgMi4xLTQgMy4xIDY0LjMtMTcuOCAxMzUuOSA0IDE3OC45IDYwLjUgMzUuNyA0NyA0Mi45IDEwNi42IDI0LjQgMTU4IDU2LjctNTYuMiA2Ny42LTE0Mi4xIDIyLjMtMjAxLjgtNTAtNjUuNS0xNDkuMS03NC40LTIyMS42LTE5Ljh6TTMxMiAyMjRjLTQuNCAwLTgtMy42LTgtOGwwLTQwYzAtNC40LTMuNi04LTgtOGwtNDggMGMtNC40IDAtOCAzLjYtOCA4bDAgNDBjMCA0LjQtMy42IDgtOCA4bC00MCAwYy00LjQgMC04IDMuNi04IDhsMCA0OGMwIDQuNCAzLjYgOCA4IDhsNDAgMGM0LjQgMCA4IDMuNiA4IDhsMCA0MGMwIDQuNCAzLjYgOCA4IDhsNDggMGM0LjQgMCA4LTMuNiA4LThsMC00MGMwLTQuNCAzLjYtOCA4LThsNDAgMGM0LjQgMCA4LTMuNiA4LThsMC00OGMwLTQuNC0zLjYtOC04LThsLTQwIDB6Il0KICAgIH07CiAgICBmYU9zaSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJvc2kiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjQxYSIsICJNOCAyNjYuNGMyLjMtMTM1LjggOTcuNC0yMzIuNCAyMTMuOC0yNDguMSAxMzguOC0xOC42IDI1NS42IDc1LjggMjc4IDIwMS4xIDIxLjMgMTE4LjgtNDQgMjMwLTE1MS42IDI3NC05LjMgMy44LTE0LjQgMS43LTE4LTcuNy0xNy44LTQ2LjMtMzUuNi05Mi42LTUzLjQtMTM5LTMuMS04LjEtMS0xMy4yIDctMTYuOCAyNC4yLTExIDM5LjMtMjkuNCA0My4zLTU1LjggMS41LTkuNyAxLTE5LjYtMS41LTI5LjFzLTYuOS0xOC40LTEyLjktMjYuMS0xMy42LTE0LjEtMjIuMi0xOC44LTE4LjEtNy41LTI3LjktOC4zYy0zOS0zLjQtNzEuOCAyMy43LTc3LjUgNTkuNy01LjIgMzMgMTEuMSA2My43IDQxLjkgNzcuNyA5LjYgNC40IDExLjUgOC42IDcuOCAxOC40LTE3LjkgNDYuNi0zNS44IDkzLjItNTMuNyAxMzkuOS0yLjYgNi45LTguMyA5LjMtMTUuNSA2LjUtNTIuNi0yMC4zLTEwMS40LTYxLTEzMC44LTExOS0yNC45LTQ5LjItMjUuMi04Ny43LTI2LjgtMTA4Ljd6bTIwLjktMS45Yy40IDYuNiAuNiAxNC4zIDEuMyAyMi4xIDYuMyA3MS45IDQ5LjYgMTQzLjUgMTMxIDE4My4xIDMuMiAxLjUgNC40IC44IDUuNi0yLjMgMTQuOS0zOS4xIDI5LjktNzguMiA0NS0xMTcuMyAxLjMtMy4zIC42LTQuOC0yLjQtNi43LTMxLjYtMTkuOS00Ny4zLTQ4LjUtNDUuNi04NiAxLTIxLjYgOS4zLTQwLjUgMjMuOC01Ni4zIDMwLTMyLjcgNzctMzkuOCAxMTUuNS0xNy42IDE1LjYgOSAyOC4yIDIyLjMgMzYuMiAzOC40czExLjIgMzQuMiA5IDUyYy0zLjYgMzAuNi0xOS4zIDUzLjktNDUuNyA2OS44LTIuNyAxLjYtMy41IDIuOS0yLjMgNiAxNS4yIDM5LjIgMzAuMyA3OC40IDQ1LjIgMTE3LjcgMS4yIDMuMSAyLjQgMy44IDUuNiAyLjMgMzUuNS0xNi42IDY1LjItNDAuMyA4OC4xLTcyIDM0LjgtNDguMiA0OS4xLTEwMS45IDQyLjMtMTYxLTEzLjctMTE3LjUtMTE5LjQtMjE0LjgtMjU1LjUtMTk4LTEwNi4xIDEzLTE5NS4zIDEwMi41LTE5Ny4xIDIyNS44eiJdCiAgICB9OwogICAgZmFHZyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjYwIiwgIk0xNzkuMiAyMzAuNGwxMDIuNCAxMDIuNC0xMDIuNCAxMDIuNC0xNzkuMi0xNzkuMiAxNzkuMi0xNzkuMiA0NC44IDQ0LjgtMjUuNiAyNS42LTE5LjItMTkuMi0xMjggMTI4IDEyOCAxMjggNTEuNS01MS41LTc3LjEtNzYuNSAyNS42LTI1LjZ6TTMzMi44IDc2LjhsLTEwMi40IDEwMi40IDEwMi40IDEwMi40IDI1LjYtMjUuNi03Ny4xLTc2LjUgNTEuNS01MS41IDEyOCAxMjgtMTI4IDEyOC0xOS4yLTE5LjItMjUuNiAyNS42IDQ0LjggNDQuOCAxNzkuMi0xNzkuMi0xNzkuMi0xNzkuMnoiXQogICAgfTsKICAgIGZhQnV5c2VsbGFkcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJidXlzZWxsYWRzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyMGQiLCAiTTIyNCAxNTAuN2w0Mi45IDE2MC43LTg1LjggMCA0Mi45LTE2MC43ek00NDggODBsMCAzNTJjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNDgwYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDgwQzAgNTMuNSAyMS41IDMyIDQ4IDMybDM1MiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4ek0zODIuNyA0MDUuM2wtOTQuNS0yOTguNy0xMjguNCAwLTk0LjUgMjk4LjcgOTAuNyAwIDExMS43LTkxLjYgMjQuMiA5MS42IDkwLjggMHoiXQogICAgfTsKICAgIGZhR29vZ2xlUGx1cyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnb29nbGUtcGx1cyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMmIzIiwgIk0yNTYgOGEyNDggMjQ4IDAgMSAwIDAgNDk2IDI0OCAyNDggMCAxIDAgMC00OTZ6TTE4NS4zIDM4MGMtMzIuOSAwLTY0LjQtMTMuMS04Ny43LTM2LjNzLTM2LjMtNTQuOC0zNi4zLTg3LjcgMTMuMS02NC40IDM2LjMtODcuNyA1NC44LTM2LjMgODcuNy0zNi4zYzMxLjMgMCA2MC4xIDExIDgzIDMyLjNsLTMzLjYgMzIuNmMtMTMuMi0xMi45LTMxLjMtMTkuMS00OS40LTE5LjEtNDIuOSAwLTc3LjIgMzUuNS03Ny4yIDc4LjFTMTQyLjMgMzM0IDE4NS4zIDMzNGMzMi42IDAgNjQuOS0xOS4xIDcwLjEtNTMuM2wtNzAuMSAwIDAtNDIuNiAxMTYuOSAwYzEuMyA2LjggMS45IDEzLjggMS45IDIwLjcgMCA3MC44LTQ3LjUgMTIxLjItMTE4LjggMTIxLjJ6TTQxNS41IDI3My44bDAgMzUuNS0zNS41IDAgMC0zNS41LTM1LjUgMCAwLTM1LjUgMzUuNSAwIDAtMzUuNSAzNS41IDAgMCAzNS41IDM1LjIgMCAwIDM1LjUtMzUuMiAweiJdCiAgICB9OwogICAgZmFTY3JlZW5wYWwgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2NyZWVucGFsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1NzAiLCAiTTI3OC42IDIyLjVhMjIuNSAyMi41IDAgMSAxIC00NSAwIDIyLjUgMjIuNSAwIDEgMSA0NSAwek0xOTguNyAyNTlhNTcuNCA1Ny40IDAgMSAxIDExNC44IDAgNTcuNCA1Ny40IDAgMSAxIC0xMTQuOCAwem0xMzguNiA5MWMyMi4zLTE5LjkgMzYuNS00Ny4zIDM5LjktNzdsMTE5LjUgMGMtMy41IDYxLjQtMzAuNCAxMTkuMi03NS4yIDE2MS40LTQ0LjcgNDIuMi0xMDMuOSA2NS44LTE2NS40IDY1LjhTMTM1LjQgNDc2LjYgOTAuNyA0MzQuNEM0NS45IDM5Mi4yIDE5LjEgMzM0LjQgMTUuNSAyNzNsMTE5LjcgMGMzLjQgMjkuNyAxNy42IDU3LjEgMzkuOSA3N3M1MS4yIDMwLjkgODEuMSAzMC45YzI5IDAgNTguNy0xMSA4MS4xLTMwLjl6TTI4LjMgMTQxLjdhMjIuNSAyMi41IDAgMSAxIDQ1LTEuNCAyMi41IDIyLjUgMCAxIDEgLTQ1IDEuNHptNDU1LjYtLjdhMjIuNCAyMi40IDAgMSAxIC00NC45IDAgMjIuNCAyMi40IDAgMSAxIDQ0LjkgMHpNMzE4IDk1LjNjLTE3LjMgMTMuOC0zOS4yIDIyLjgtNjEuOSAyMi44cy00NC42LTktNjEuOS0yMi44Yy0xNy4zLTE0LjctMjguOC0zNS4xLTMyLjQtNTcuNSAxNS4xLTYuNCAzMC44LTExLjMgNDYuOS0xNC41IDAgMTIuNiA1IDI0LjYgMTMuOSAzMy41czIwLjkgMTMuOSAzMy41IDEzLjkgMjQuNi01IDMzLjUtMTMuOSAxMy45LTIwLjkgMTMuOS0zMy41YzE2LjEgMy4yIDMxLjggOC4xIDQ2LjkgMTQuNS0zLjYgMjIuNC0xNS4xIDQyLjgtMzIuNCA1Ny41ek04Mi45IDIzMWMtMjEuNCA3LjYtNDQuNyA3LjQtNjUuOS0uNiAyLTE2LjMgNS42LTMyLjMgMTAuOC00Ny45IDUuNCAzLjEgMTEuMyA1LjEgMTcuNSA2IDYuMiAuOCAxMi40IC40IDE4LjUtMS4yIDYtMS43IDExLjYtNC40IDE2LjYtOC4yczkuMS04LjUgMTIuMi0xMy45IDUuMS0xMS40IDYtMTcuNWMuOC02LjIgLjQtMTIuNS0xLjItMTguNXMtNC40LTExLjYtOC4yLTE2LjZjLTMuOC00LjktOC41LTkuMS0xMy45LTEyLjIgMTAuOC0xMi4zIDIyLjktMjMuNSAzNi0zMy4zIDE3LjYgMTQuMyAyOS41IDM0LjUgMzMuNiA1Ni44cy4xIDQ1LjQtMTEuMiA2NWMtMTEuNCAxOS42LTI5LjQgMzQuNS01MC43IDQyLjF6bTM0Ni40IC4xYy0yMS4zLTcuNi0zOS4zLTIyLjYtNTAuNy00Mi4yLTExLjMtMTkuNi0xNS4yLTQyLjctMTEuMS02NSA0LjEtMjIuMiAxNi00Mi40IDMzLjUtNTYuNyAxMy4xIDkuOCAyNS4yIDIxIDM2IDMzLjMtMTAuNyA2LjQtMTguNCAxNi43LTIxLjUgMjguOC0zLjIgMTItMi4zIDI0LjggNC44IDM1LjYgNi4yIDEwLjggMTYuNCAxOC43IDI4LjQgMjJzMjQuOSAxLjcgMzUuNy00LjNjNS4zIDE1LjUgOC45IDMxLjYgMTAuOSA0Ny44LTIyLjEgOC4xLTQ0LjYgOC4zLTY2IC43eiJdCiAgICB9OwogICAgZmFCaXRjb2luID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImJpdGNvaW4iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjM3OSIsICJNOCAyNTZhMjQ4IDI0OCAwIDEgMSA0OTYgMCAyNDggMjQ4IDAgMSAxIC00OTYgMHptMzU0LjMtMzUuM2M0LjktMzMtMjAuMi01MC43LTU0LjYtNjIuNmwxMS4xLTQ0LjctMjcuMi02LjgtMTAuOSA0My41Yy03LjItMS44LTE0LjUtMy41LTIxLjgtNS4xbDEwLjktNDMuOC0yNy4yLTYuOC0xMS4yIDQ0LjdjLTUuOS0xLjMtMTEuNy0yLjctMTcuNC00LjFsMC0uMS0zNy41LTkuNC03LjIgMjkuMXMyMC4yIDQuNiAxOS44IDQuOWMxMSAyLjggMTMgMTAgMTIuNyAxNS44bC0xMi43IDUwLjljLjggLjIgMS43IC41IDIuOCAuOS0uOS0uMi0xLjktLjUtMi45LS43bC0xNy44IDcxLjNjLTEuMyAzLjMtNC44IDguNC0xMi41IDYuNSAuMyAuNC0xOS44LTQuOS0xOS44LTQuOWwtMTMuNSAzMS4xIDM1LjQgOC44YzYuNiAxLjcgMTMgMy40IDE5LjQgNWwtMTEuMyA0NS4yIDI3LjIgNi44IDExLjItNDQuN2M3LjIgMiAxNC40IDMuOCAyMS43IDUuNmwtMTEuMSA0NC41IDI3LjIgNi44IDExLjMtNDUuMWM0Ni40IDguOCA4MS4zIDUuMiA5Ni0zNi43IDExLjgtMzMuOC0uNi01My4zLTI1LTY2IDE3LjgtNC4xIDMxLjItMTUuOCAzNC43LTM5Ljl6bS02Mi4yIDg3LjJjLTguNCAzMy44LTY1LjMgMTUuNS04My44IDEwLjlsMTQuOS01OS45YzE4LjQgNC42IDc3LjYgMTMuNyA2OC44IDQ5em04LjQtODcuN2MtNy43IDMwLjctNTUgMTUuMS03MC40IDExLjNsMTMuNS01NC4zYzE1LjQgMy44IDY0LjggMTEgNTYuOCA0M3oiXQogICAgfTsKICAgIGZhU3dpZnQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3dpZnQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjhlMSIsICJNNDQ4IDE1Ni4xYzAtNC41LS4xLTktLjItMTMuNS0uMS05LjktMS0xOS43LTIuNi0yOS40LTEuNy05LjctNC44LTE5LjItOS4yLTI4LTktMTcuNy0yMy40LTMyLjEtNDEuMi00MS4xLTguOC00LjUtMTguMy03LjYtMjgtOS4yLTkuNy0xLjYtMTkuNi0yLjUtMjkuNC0yLjYtNC41LS4xLTktLjItMTMuNS0uMkwxMjQuMSAzMmMtNC41IDAtOSAuMS0xMy41IC4yLTIuNCAuMS00LjkgLjItNy40IC4zLTcuNCAuMy0xNC44IDEuMS0yMi4xIDIuMy03LjMgMS4zLTE0LjQgMy4zLTIxLjIgNi4xLTIuMyAxLTQuNiAyLTYuOCAzLjEtNi42IDMuNC0xMi44IDcuNS0xOC40IDEyLjMtMS45IDEuNi0zLjcgMy4zLTUuNCA1LTcgNy0xMi45IDE1LTE3LjQgMjMuOC00LjQgOC44LTcuNiAxOC4zLTkuMiAyOC0xLjYgOS43LTIuNCAxOS42LTIuNSAyOS40LS4xIDQuNS0uMiA5LS4yIDEzLjVMMCAzNTUuOWMwIDQuNSAuMSA5IC4yIDEzLjUgLjEgOS45IDEgMTkuNyAyLjYgMjkuNCAxLjcgOS43IDQuOCAxOS4yIDkuMiAyOCA5IDE3LjcgMjMuNCAzMi4xIDQxLjEgNDEuMSA4LjggNC40IDE4LjMgNy41IDI4IDkuMiA5LjcgMS42IDE5LjYgMi41IDI5LjQgMi42IDQuNSAuMSA5IC4yIDEzLjUgLjJsMTk5LjggMGM0LjUgMCA5LS4xIDEzLjUtLjIgOS45LS4xIDE5LjctMSAyOS40LTIuNiA5LjctMS43IDE5LjItNC44IDI4LTkuMiAxNy43LTkgMzIuMS0yMy40IDQxLjEtNDEuMiA0LjQtOC44IDcuNi0xOC4zIDkuMi0yOCAxLjYtOS43IDIuNS0xOS42IDIuNi0yOS40IC4xLTQuNSAuMi05IC4yLTEzLjVsMC0xODMuOGMwLTUuNCAwLTEwLjcgMC0xNnptLTY5LjkgMjQxYy0yMC0zOC45LTU3LjItMjkuMy03Ni4zLTE5LjUtMS43IDEtMy41IDItNS4yIDNsLS40IC4yYy0zOS41IDIxLTkyLjUgMjIuNS0xNDUuOC0uNC00My40LTE4LjgtODAuMS01MC4zLTEwNS4zLTkwLjQgMTIuMyA5LjEgMjUuNCAxNi45IDM5LjIgMjMuNCA1Ni40IDI2LjQgMTEzIDI0LjUgMTUzIDAtNTctNDMuOC0xMDQuNi0xMDEtMTQxLjEtMTQ3LjItNy04LjEtMTMuMi0xNi44LTE4LjgtMjUuOSA0My43IDQwIDExMi43IDkwLjIgMTM3LjUgMTA0LjEtNTIuNi01NS41LTk4LjktMTIzLjktOTYuNy0xMjEuNyA4Mi44IDgzLjQgMTU5LjIgMTMwLjYgMTU5LjIgMTMwLjYgMi45IDEuNiA1IDIuOCA2LjcgNCAxLjYtNC4xIDMtOC4yIDQuMi0xMi41IDEzLjItNDguMy0xLjctMTAzLjYtMzUuMy0xNDkuMiA3Ni44IDQ2LjEgMTIyLjIgMTMzLjcgMTAzLjYgMjA3LjgtLjQgMS43LTEgMy40LTEuNCA1LjEgMzguNSA0Ny40IDI4IDk4LjIgMjMuMSA4OC42bDAgMHoiXQogICAgfTsKICAgIGZhRmlsZXNQaW53aGVlbCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlcy1waW53aGVlbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNjlmIiwgIk0yNTMuNSAyNDYuNEwxMzcuMiAxMzAuMmMtLjYtLjYtMS0xLjMtMS40LTJzLS41LTEuNi0uNS0yLjQgLjItMS42IC41LTIuNCAuOC0xLjQgMS40LTJMMjUzLjYgNS4xYy45LS45IDItMS41IDMuMi0xLjdzMi41LS4xIDMuNiAuMyAyLjEgMS4zIDIuOCAyLjMgMS4xIDIuMiAxLjEgMy41bDAgMjMyLjVjMCAxLjMtLjMgMi41LTEgMy42cy0xLjcgMS45LTIuOSAyLjQtMi41IC42LTMuNyAuMy0yLjQtLjktMy4yLTEuOXptNDAuMy00LjRsMC0xMzQuNGMwLS44IC4xLTEuNiAuNS0yLjRzLjgtMS41IDEuMy0yLjEgMS4zLTEuMSAyLTEuNCAxLjYtLjUgMi40LS41bDEzNC40IDBjMS4yIDAgMi41IC40IDMuNSAxLjFzMS44IDEuNyAyLjMgMi44IC42IDIuNCAuMyAzLjYtLjkgMi4zLTEuNyAzLjJMMzA0LjMgMjQ2LjRjLS45IC44LTIgMS40LTMuMiAxLjZzLTIuNCAuMS0zLjUtLjQtMi4xLTEuMy0yLjgtMi4zLTEuMS0yLjItMS4xLTMuNGwuMSAuMXptMzAuNiAzNWMtMS4yIDAtMi41LS4zLTMuNS0xcy0xLjktMS42LTIuNC0yLjgtLjYtMi40LS40LTMuNiAuOC0yLjMgMS43LTMuMkw0MDQgMTgyLjJjLjYtLjYgMS4zLTEgMi0xLjRzMS42LS41IDIuNC0uNSAxLjYgLjIgMi40IC41IDEuNCAuOCAyIDEuNGw4NC40IDg0LjJjLjkgLjkgMS41IDIgMS43IDMuMnMuMSAyLjUtLjMgMy42LTEuMyAyLjEtMi4zIDIuOC0yLjIgMS4xLTMuNSAxLjFsLTE2OC41IDAgLjEtLjF6bTkwLjcgMTMxbC05NS4zLTk1LjJjLS45LS45LTEuNS0yLTEuNy0zLjJzLS4xLTIuNSAuNC0zLjcgMS4zLTIuMSAyLjQtMi44IDIuMy0xIDMuNS0xbDk1LjIgMGMxLjcgMCAzLjIgLjcgNC40IDEuOHMxLjggMi44IDEuOCA0LjRsMCA5NS4zYzAgMS4yLS40IDIuNS0xLjEgMy41cy0xLjcgMS44LTIuOCAyLjMtMi40IC42LTMuNiAuMy0yLjMtLjktMy4yLTEuN3pNMTYuOCAzMDIuMWwyMTYuOSAwYzEuMiAwIDIuNSAuNCAzLjUgMS4xczEuOCAxLjcgMi4zIDIuOCAuNiAyLjQgLjMgMy42LS44IDIuMy0xLjcgMy4yTDEyOS43IDQyMS4yYy0uNiAuNi0xLjMgMS0yIDEuNHMtMS42IC41LTIuNCAuNS0xLjYtLjItMi40LS41LTEuNC0uOC0yLTEuNEwxMi4zIDMxMi44Yy0uOS0uOS0xLjUtMi0xLjctMy4ycy0uMS0yLjUgLjQtMy42IDEuMy0yLjEgMi4zLTIuOCAyLjMtMSAzLjUtMWwwLS4xek0yNjQuMyA0NjUuM2MwIC44LS4yIDEuNi0uNSAyLjRzLS44IDEuNS0xLjQgMi0xLjMgMS0yIDEuNC0xLjYgLjUtMi40IC41bC0xMjggMGMtMS4yIDAtMi41LS40LTMuNS0xLjFzLTEuOC0xLjctMi4zLTIuOC0uNi0yLjQtLjMtMy42IC44LTIuMyAxLjctMy4ybDEyOC0xMjhjLjktLjkgMi0xLjUgMy4yLTEuN3MyLjUtLjEgMy42IC4zIDIuMSAxLjMgMi44IDIuMyAxLjEgMi4yIDEuMSAzLjVsMCAxMjh6bTQwLTEzMi41bDgyLjggODIuN2MuNiAuNiAxIDEuMyAxLjQgMnMuNSAxLjYgLjUgMi40LS4yIDEuNi0uNSAyLjQtLjggMS40LTEuNCAyTDMwNC4zIDUwN2MtLjkgLjktMiAxLjUtMy4yIDEuN3MtMi41IC4xLTMuNi0uMy0yLjEtMS4zLTIuOC0yLjMtMS4xLTIuMi0xLjEtMy41bDAtMTY1LjRjMC0xLjIgLjQtMi41IDEuMS0zLjVzMS43LTEuOCAyLjgtMi4zIDIuNC0uNiAzLjYtLjMgMi4zIC44IDMuMiAxLjd6TTc5IDEyMi40YzAtMS4yIC4zLTIuNSAxLTMuNXMxLjctMS44IDIuOC0yLjMgMi40LS42IDMuNi0uNCAyLjMgLjggMy4yIDEuN0wyMzguMSAyNjYuNGMuOSAuOSAxLjUgMiAxLjcgMy4ycy4xIDIuNS0uMyAzLjYtMS4zIDIuMS0yLjMgMi44LTIuMiAxLjEtMy41IDEuMWwtMTQ4LjQgMGMtMS43IDAtMy4yLS43LTQuNC0xLjhzLTEuOC0yLjgtMS44LTQuNGwwLTE0OC40LS4xLS4xeiJdCiAgICB9OwogICAgZmFMYXJhdmVsID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImxhcmF2ZWwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjNiZCIsICJNNTA0LjYgMTE1LjhjLS4xLS4yLS4yLS41LS4zLS43LS4xLS40LS4zLS44LS41LTEuMi0uMi0uMi0uMy0uNS0uNS0uNy0uMi0uMy0uNS0uNi0uNy0uOS0uMi0uMi0uNS0uNC0uOC0uNi0uMy0uMi0uNi0uNS0uOS0uN0w0MDQuNiA1NS41Yy0xLjItLjctMi42LTEuMS00LTEuMXMtMi44IC40LTQgMS4xTDMwMC4zIDExMWMtLjMgLjItLjYgLjQtLjkgLjctLjMgLjItLjUgLjQtLjggLjYtLjMgLjMtLjUgLjYtLjcgLjktLjIgLjItLjQgLjQtLjUgLjctLjIgLjQtLjQgLjgtLjUgMS4yLS4xIC4yLS4yIC40LS4zIC43LS4yIC43LS4zIDEuNC0uMyAyLjFsMCAxMDUuMi04MC4yIDQ2LjIgMC0yMDUuOWMwLS43LS4xLTEuNC0uMy0yLjEtLjEtLjItLjItLjQtLjMtLjctLjEtLjQtLjMtLjgtLjUtMS4yLS4xLS4zLS40LS41LS41LS43LS4yLS4zLS41LS42LS43LS45LS4yLS4yLS41LS40LS44LS42LS4zLS4yLS42LS41LS45LS43TDExNS44IDEuMWMtMS4yLS43LTIuNi0xLjEtNC0xLjFzLTIuOCAuNC00IDEuMUwxMS41IDU2LjVjLS4zIC4yLS42IC40LS45IC43LS4zIC4yLS41IC40LS44IC42LS4zIC4zLS41IC42LS43IC45LS4yIC4zLS40IC41LS42IC43LS4yIC40LS40IC44LS41IDEuMi0uMSAuMi0uMiAuNC0uMyAuNy0uMiAuNy0uMyAxLjQtLjMgMi4xbDAgMzI5LjdjMCAxLjQgLjQgMi44IDEuMSA0czEuNyAyLjIgMi45IDIuOUwyMDQgNTEwLjljLjQgLjIgLjkgLjQgMS4zIC41IC4yIC4xIC40IC4yIC42IC4zIDEuMyAuNCAyLjggLjQgNC4xIDAgLjItLjEgLjQtLjIgLjYtLjIgLjUtLjIgMS0uMyAxLjQtLjZMNDA0LjYgNDAwLjFjMS4yLS43IDIuMi0xLjcgMi45LTIuOXMxLjEtMi42IDEuMS00bDAtMTA1LjMgOTIuMi01My4xYzEuMi0uNyAyLjItMS43IDIuOS0zczEuMS0yLjYgMS4xLTRsMC0xMDkuOGMwLS43LS4xLTEuNC0uMi0yLjF6TTExMS44IDE3LjNsODAuMiA0Ni4xLTgwLjIgNDYuMi04MC4yLTQ2LjIgODAuMi00Ni4yem04OC4yIDYwbDAgMjAxLjNjLTMzLjIgMTkuMS01OS45IDM0LjUtODAuMiA0Ni4ybDAtMjAxLjNDMTUzIDEwNC40IDE3OS43IDg5IDIwMCA3Ny4zem0wIDQxMi44TDIzLjUgMzg4LjUgMjMuNSA3Ny4zYzIwLjMgMTEuNyA0Ny4xIDI3LjEgODAuMiA0Ni4ybDAgMjE1LjJjMCAuMyAuMSAuNiAuMSAuOSAwIC40IC4xIC44IC4yIDEuMiAuMSAuMyAuMiAuNiAuNCAuOSAuMSAuMyAuMyAuNyAuNCAxIC4yIC4zIC40IC41IC42IC44IC4yIC4zIC40IC42IC43IC44IC4yIC4yIC41IC40IC44IC42IC4zIC4yIC42IC41IC45IC43bDkyLjIgNTIuMiAuMSA5Mi40em04LTEwNi4yTDEyOCAzMzguNmM1NC43LTMxLjUgMTEzLjUtNjUuMyAxNzYuMy0xMDEuNWw4MC4xIDQ2LjFDMzU1IDMwMCAyOTYuMiAzMzMuNSAyMDggMzgzLjl6bTE4NC41IDQuNmwtMTc2LjUgMTAxLjYgMC05Mi4zQzMxNy40IDM0MCAzNzYuMiAzMDYuNCAzOTIuNSAyOTdsMCA5MS40em0wLTExOS4xYy0yMC4zLTExLjYtNDcuMS0yNy04MC4yLTQ2LjFsMC05MS40YzIwLjMgMTEuNyA0Ny4xIDI3LjEgODAuMiA0Ni4ybDAgOTEuM3ptOC0xMDUuM2wtODAuMi00Ni4yIDgwLjItNDYuMiA4MC4yIDQ2LjEtODAuMiA0Ni4yem04IDEwNS4zbDAtOTEuM2MzMy4yLTE5LjEgNjAtMzQuNSA4MC4zLTQ2LjJsMCA5MS40LTgwLjMgNDYuMnoiXQogICAgfTsKICAgIGZhV3Bmb3JtcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ3cGZvcm1zIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyOTgiLCAiTTQ0OCA3NS4ybDAgMzYxLjdjMCAyNC4zLTE5IDQzLjItNDMuMiA0My4ybC0zNjEuNiAwQzE5LjMgNDgwIDAgNDYxLjQgMCA0MzYuOEwwIDc1LjJDMCA1MS4xIDE4LjggMzIgNDMuMiAzMmwzNjEuNyAwYzI0IDAgNDMuMSAxOC44IDQzLjEgNDMuMnpNNDEwLjcgNDM2LjhsMC0zNjEuNmMwLTMtMi42LTUuOC01LjgtNS44bC05LjMgMC0xMTAuMyA3NC42LTYxLjMtNDkuOS02MS4yIDQ5LjktMTEwLjMtNzQuNy05LjMgMGMtMy4yIDAtNS44IDIuOC01LjggNS44bDAgMzYxLjdjMCAzIDIuNiA1LjggNS44IDUuOGwzNjEuNyAwYzMuMiAuMSA1LjgtMi43IDUuOC01Ljh6TTE1MC4yIDE4NmwwIDM3LTczLjUgMCAwLTM3IDczLjUgMHptMCA3NC40bDAgMzcuMy03My41IDAgMC0zNy4zIDczLjUgMHptMTEuMS0xNDcuM2w1NC00My43LTExOC41IDAgNjQuNSA0My43em0yMTAgNzIuOWwwIDM3LTE5NiAwIDAtMzcgMTk2IDB6bTAgNzQuNGwwIDM3LjMtMTk2IDAgMC0zNy4zIDE5NiAwek0yODYuNyAxMTMuMWw2NC41LTQzLjctMTE4LjQgMCA1My45IDQzLjd6TTM3MS4zIDMzNWwwIDM3LjMtOTkuNCAwIDAtMzcuMyA5OS40IDB6Il0KICAgIH07CiAgICBmYVNwZWFrZXJEZWNrID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNwZWFrZXItZGVjayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmODNjIiwgIk0yMTMuOSAyOTZMMTAwIDI5NmMtMjYuNSAwLTUyLTEwLjUtNzAuNy0yOS4zUzAgMjIyLjUgMCAxOTYgMTAuNSAxNDQgMjkuMyAxMjUuMyA3My41IDk2IDEwMCA5NmwxMzIuOCAwYzEwLjYgMCAyMC44IDQuMiAyOC4zIDExLjdzMTEuNyAxNy43IDExLjcgMjguMy00LjIgMjAuOC0xMS43IDI4LjMtMTcuNyAxMS43LTI4LjMgMTEuN0w5OCAxNzZjLTI2LjUgMC0yNi40IDQwIDAgNDBsMTEzLjggMGMyNi41IDAgNTIgMTAuNSA3MC43IDI5LjNzMjkuMyA0NC4yIDI5LjMgNzAuNy0xMC41IDUyLTI5LjMgNzAuNy00NC4yIDI5LjMtNzAuNyAyOS4zTDQwIDQxNmMtMTAuNiAwLTIwLjgtNC4yLTI4LjMtMTEuN1MwIDM4Ni42IDAgMzc2IDQuMiAzNTUuMiAxMS43IDM0Ny43IDI5LjQgMzM2IDQwIDMzNmwxNzMuOSAwYzI2LjUgMCAyNi41LTQwIDAtNDB6TTI5OCA0MTZjMTMuNS05LjIgMjUtMjEgMzMuOC0zNC43czE0LjctMjkuMiAxNy4zLTQ1LjNsNjQuNiAwYzIuNiAwIDUuMi0uNiA3LjYtMS42czQuNi0yLjUgNi40LTQuNCAzLjMtNC4xIDQuMi02LjUgMS41LTUgMS40LTcuNmwwLTEyMGMwLTIuNi0uNS01LjItMS40LTcuNnMtMi40LTQuNi00LjItNi41LTQtMy4zLTYuNC00LjQtNS0xLjYtNy42LTEuNmwtMTE3LjIgMGM5LjctMTEuMSAxNS0yNS4zIDE1LTQwcy01LjMtMjguOS0xNS00MGwxMzYuOSAwYzQzLjQgMCA3OC42IDM1LjggNzguNiA4MGwwIDE2MGMwIDQ0LjItMzUuMiA4MC03OC42IDgwTDI5OCA0MTZ6Il0KICAgIH07CiAgICBmYUZsaWNrciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmbGlja3IiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjE2ZSIsICJNNDAwIDMyTDQ4IDMyQzIxLjUgMzIgMCA1My41IDAgODBMMCA0MzJjMCAyNi41IDIxLjUgNDggNDggNDhsMzUyIDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0zNTJjMC0yNi41LTIxLjUtNDgtNDgtNDh6TTE0NC41IDE5MmE2My41IDYzLjUgMCAxIDEgMCAxMjcgNjMuNSA2My41IDAgMSAxIDAtMTI3em0xNTkgMGE2My41IDYzLjUgMCAxIDEgMCAxMjcgNjMuNSA2My41IDAgMSAxIDAtMTI3eiJdCiAgICB9OwogICAgZmFDY1Zpc2EgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY2MtdmlzYSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMWYwIiwgIk00NzAuMSAyMzEuM3M3LjYgMzcuMiA5LjMgNDVsLTMzLjQgMGMzLjMtOC45IDE2LTQzLjUgMTYtNDMuNS0uMiAuMyAzLjMtOS4xIDUuMy0xNC45bDIuOCAxMy40ek01NzYgODBsMCAzNTJjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNDgwYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDgwQzAgNTMuNSAyMS41IDMyIDQ4IDMybDQ4MCAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4ek0xNTIuNSAzMzEuMmw2My4yLTE1NS4yLTQyLjUgMC0zOS4zIDEwNi00LjMtMjEuNS0xNC03MS40Yy0yLjMtOS45LTkuNC0xMi43LTE4LjItMTMuMWwtNjQuNyAwLS43IDMuMWMxNS44IDQgMjkuOSA5LjggNDIuMiAxNy4xbDM1LjggMTM1IDQyLjUgMHptOTQuNCAuMmwyNS4yLTE1NS40LTQwLjIgMC0yNS4xIDE1NS40IDQwLjEgMHptMTM5LjktNTAuOGMuMi0xNy43LTEwLjYtMzEuMi0zMy43LTQyLjMtMTQuMS03LjEtMjIuNy0xMS45LTIyLjctMTkuMiAuMi02LjYgNy4zLTEzLjQgMjMuMS0xMy40IDEzLjEtLjMgMjIuNyAyLjggMjkuOSA1LjlsMy42IDEuNyA1LjUtMzMuNmMtNy45LTMuMS0yMC41LTYuNi0zNi02LjYtMzkuNyAwLTY3LjYgMjEuMi02Ny44IDUxLjQtLjMgMjIuMyAyMCAzNC43IDM1LjIgNDIuMiAxNS41IDcuNiAyMC44IDEyLjYgMjAuOCAxOS4zLS4yIDEwLjQtMTIuNiAxNS4yLTI0LjEgMTUuMi0xNiAwLTI0LjYtMi41LTM3LjctOC4zbC01LjMtMi41LTUuNiAzNC45YzkuNCA0LjMgMjYuOCA4LjEgNDQuOCA4LjMgNDIuMiAuMSA2OS43LTIwLjggNzAtNTN6TTUyOCAzMzEuNGwtMzIuNC0xNTUuNC0zMS4xIDBjLTkuNiAwLTE2LjkgMi44LTIxIDEyLjlsLTU5LjcgMTQyLjUgNDIuMiAwczYuOS0xOS4yIDguNC0yMy4zbDUxLjYgMGMxLjIgNS41IDQuOCAyMy4zIDQuOCAyMy4zbDM3LjIgMHoiXQogICAgfTsKICAgIGZhVXB3b3JrID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInVwd29yayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNjQxIiwgIk00OTMuOSAyOTUuNmMtNTAuMyAwLTgzLjUtMzguOS05Mi44LTUzLjkgMTEuOS05NS4zIDQ2LjgtMTI1LjQgOTIuOC0xMjUuNCA0NS41IDAgODAuOSAzNi40IDgwLjkgODkuN3MtMzUuNCA4OS43LTgwLjkgODkuN2wwLS4xem0wLTIzNy44Yy04MS45IDAtMTI3LjggNTMuNC0xNDEgMTA4LjQtMTQuOS0yOC0yNS45LTY1LjUtMzQuNS0xMDAuM2wtMTEzLjIgMCAwIDE0MWMwIDUxLjEtMjMuMyA4OS02OC44IDg5cy03MS42LTM3LjgtNzEuNi04OWwuNS0xNDEtNjUuMyAwIDAgMTQxYzAgNDEuMSAxMy4zIDc4LjQgMzcuNiAxMDUuMSAyNSAyNy41IDU5LjIgNDEuOCA5OC44IDQxLjggNzguOCAwIDEzMy44LTYwLjQgMTMzLjgtMTQ2LjlsMC05NC44YzguMiAzMS4yIDI3LjggOTEuMSA2NS4zIDE0My42bC0zNSAxOTkuNCA2Ni40IDAgMjMuMS0xNDEuM2M3LjYgNi4zIDE1LjcgMTIgMjQuMiAxNyAyMi4yIDE0IDQ3LjcgMjEuOSA3My45IDIyLjggMCAwIDQgLjIgNi4xIC4yIDgxLjIgMCAxNDUuOS02Mi45IDE0NS45LTE0Ny44UzU3NS4zIDU3LjkgNDk0LjEgNTcuOWwtLjItLjF6Il0KICAgIH07CiAgICBmYUtha2FvVGFsayA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJrYWthby10YWxrIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU3ZDciLCAiTTI4OCAyLjVjMTU5LjEgMCAyODggMTAxLjcgMjg4IDIyNy4xIDAgMTI1LjQtMTI4LjkgMjI3LjEtMjg4IDIyNy4xLTE3LjUgMC0zNC42LTEuMi01MS4yLTMuNi0xNi42IDExLjctMTEyLjYgNzkuMS0xMjEuNyA4MC40IDAgMC0zLjcgMS40LTYuOS0uNHMtMi42LTYuNy0yLjYtNi43QzEwNi42IDUxOS44IDEzMC42IDQzNy4yIDEzNSA0MjEuOSA1My45IDM4MS44IDAgMzEwLjYgMCAyMjkuNSAwIDEwNC4xIDEyOC45IDIuNSAyODggMi41ek04Ni4yIDE2MS43Yy05IDAtMTYuMyA3LjMtMTYuMyAxNi4zczcuMyAxNi4zIDE2LjMgMTYuM2wyNS45IDAgMCA5OC43YzAgOC44IDcuNSAxNS45IDE2LjYgMTUuOXMxNi42LTcuMSAxNi42LTE1LjlsMC05OC43IDI1LjkgMGM5IDAgMTYuMy03LjMgMTYuMy0xNi4zcy03LjMtMTYuMy0xNi4zLTE2LjNsLTg1LjEgMHptMTQwLjggMGMtMTAuOCAuMi0xOS4zIDguNC0yMi4xIDE2LjRMMTY1LjIgMjgyLjdjLTUgMTUuNy0uNiAyMS41IDMuOSAyMy42IDMuMiAxLjUgNi45IDIuMyAxMC42IDIuMyA2LjkgMCAxMi4yLTIuOCAxMy44LTcuM2w4LjItMjEuNiA1MC43IDAgOC4yIDIxLjVjMS42IDQuNSA2LjkgNy4zIDEzLjggNy4zIDMuNyAwIDcuMy0uOCAxMC42LTIuMyA0LjYtMi4xIDktNy45IDMuOS0yMy42TDI0OS4yIDE3OC4xYy0yLjgtOC0xMS4zLTE2LjItMjIuMi0xNi40em0xODAuOSAwYy05LjIgMC0xNi42IDcuNS0xNi42IDE2LjZsMCAxMTMuN2MwIDkuMiA3LjUgMTYuNiAxNi42IDE2LjZzMTYuNi03LjUgMTYuNi0xNi42bDAtMzYuMiA1LjgtNS44IDM4LjkgNTEuNmMzLjIgNC4yIDggNi42IDEzLjMgNi42IDMuNiAwIDcuMS0xLjEgMTAtMy4zIDMuNS0yLjcgNS44LTYuNiA2LjQtMTFzLS41LTguOC0zLjItMTIuM2wtNDAuOS01NC4yIDM3LjktMzcuOGMyLjYtMi42IDMuOS02LjIgMy43LTEwLjEtLjItMy45LTItNy42LTQuOS0xMC41LTMuMS0zLjEtNy4zLTQuOS0xMS40LTQuOS0zLjYgMC02LjggMS4zLTkuMiAzLjdsLTQ2LjMgNDYuNCAwLTM1LjdjMC05LjItNy41LTE2LjYtMTYuNi0xNi42em0tOTEuMyAwYy05LjMgMC0xNi45IDcuNS0xNi45IDE2LjZsMCAxMTIuOGMwIDguNCA3LjEgMTUuMiAxNS45IDE1LjNsNTMuMyAwYzguOCAwIDE1LjktNi45IDE1LjktMTUuM3MtNy4yLTE1LjItMTUuOS0xNS4ybC0zNS4zIDAgMC05Ny42YzAtOS4yLTcuNi0xNi42LTE3LTE2LjZ6bS03MyA4OC42bC0zMy4yIDAgMTYuNi00Ny4xIDE2LjYgNDcuMXoiXQogICAgfTsKICAgIGZhRmx1dHRlciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmbHV0dGVyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU2OTQiLCAiTTQyOS41IDIzNi4zTDI5MS43IDM3NC4xIDQyOS41IDUxMiAyNzIgNTEyYy0zNi4xLTM2LjEtODIuMS04Mi4xLTEzNy45LTEzNy45bDEzNy45LTEzNy44IDE1Ny41IDB6TTI3MiAwTDE2IDI1NiA5NC44IDMzNC44IDQyOS41IDAgMjcyIDB6Il0KICAgIH07CiAgICBmYUJ1ZmZlciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJidWZmZXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjgzNyIsICJNNDI4LjIgMzgwLjdMMjMxLjcgNDc4LjVjLTIuMyAxLTQuOCAxLjUtNy4zIDEuNXMtNS0uNS03LjMtMS41TDIwLjUgMzgwLjdjLTQtMi00LTUuMyAwLTcuM0w2Ny42IDM1MGMyLjMtMSA0LjgtMS41IDcuMy0xLjVzNSAuNSA3LjMgMS41bDEzNC44IDY3YzIuMyAxIDQuOCAxLjUgNy4zIDEuNXM1LS41IDcuMy0xLjVsMTM0LjgtNjdjMi4zLTEgNC44LTEuNSA3LjMtMS41czUgLjUgNy4zIDEuNWw0Ny4xIDIzLjRjNCAyIDQgNS4yIDAgNy4yem0wLTEzNi41bC00Ny4xLTIzLjRjLTIuMy0xLTQuOC0xLjUtNy4zLTEuNXMtNSAuNS03LjMgMS41TDIzMS43IDI4Ny44Yy0yLjMgMS00LjggMS41LTcuMyAxLjVzLTUtLjUtNy4zLTEuNUw4Mi4zIDIyMC43Yy0yLjMtMS00LjgtMS41LTcuMy0xLjVzLTUgLjUtNy4zIDEuNUwyMC41IDI0NC4xYy00IDItNCA1LjMgMCA3LjNsMTk2LjUgOTcuOGMyLjMgMSA0LjggMS41IDcuMyAxLjVzNS0uNSA3LjMtMS41bDE5Ni41LTk3LjhjNC0yIDQtNS4zIDAtNy4zek0yMC41IDEzMC40TDIxNyAyMjAuN2M0LjcgMS45IDEwIDEuOSAxNC43IDBsMTk2LjUtOTAuM2M0LTEuOSA0LTQuOSAwLTYuN0wyMzEuNyAzMy40Yy00LjctMS45LTEwLTEuOS0xNC43IDBMMjAuNSAxMjMuN2MtNCAxLjgtNCA0LjkgMCA2Ljd6Il0KICAgIH07CiAgICBmYUdyYXRpcGF5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdyYXRpcGF5IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxODQiLCAiTTI1NiAwYTI1NiAyNTYgMCAxIDAgMCA1MTIgMjU2IDI1NiAwIDEgMCAwLTUxMnpNMzc0LjMgMjMzLjdMMjU3LjcgMzkxLjMgMTQxLjMgMjMzLjdjLTktMTIuMy0xOS43LTUyIDE0LTc0LjMgMjktMTguNyA1Ni40LTQuMyA3MC43IDEyLjMgMTYuNCAxOC41IDQ4LjEgMTcuNCA2My43IDAgMTQuMy0xNi42IDQxLjctMzEgNzAuMy0xMi4zIDM0IDIyLjMgMjMuMyA2MS45IDE0LjIgNzQuM3oiXQogICAgfTsKICAgIGZhR29vZ2xlUGF5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdvb2dsZS1wYXkiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTA3OSIsICJNMTA1LjcgMjE1bDAgNDEuMiA1Ny4xIDBjLTEuMiA2LjYtMy42IDEyLjktNy4yIDE4LjVzLTguNCAxMC40LTEzLjkgMTQuMWMtOS41IDYuNi0yMS43IDEwLjMtMzYgMTAuMy0yNy42IDAtNTAuOS0xOC45LTU5LjMtNDQuMi00LjQtMTMuMy00LjQtMjcuNyAwLTQxIDguNC0yNS41IDMxLjctNDQuNCA1OS4zLTQ0LjQgNy41LS4xIDE0LjkgMS4yIDIxLjkgNHMxMy4zIDYuOSAxOC42IDEyLjFMMTc2LjUgMTU1Yy0xOS4xLTE4LjEtNDQuNC0yOC4xLTcwLjctMjcuOC0xOS43IC4xLTM4LjkgNS43LTU1LjYgMTYuMXMtMzAuMSAyNS4zLTM4LjggNDNDMy45IDIwMS4yIDAgMjE3LjcgMCAyMzQuNHMzLjkgMzMuMiAxMS4zIDQ4LjFsMCAuMmM4LjcgMTcuNyAyMi4xIDMyLjUgMzguOCA0M3MzNS45IDE2IDU1LjYgMTZjMjguNSAwIDUyLjUtOS41IDcwLTI1LjkgMjAtMTguNiAzMS40LTQ2LjIgMzEuNC03OC45IDAtNy4zLS42LTE0LjYtMS44LTIxLjhsLTk5LjcgMHptMzg5LjQtNGMtMTAuMS05LjQtMjMuOS0xNC4xLTQxLjQtMTQuMS0yMi41IDAtMzkuMyA4LjMtNTAuNSAyNC45TDQyNC4xIDIzNWM3LjYtMTEuMyAxOC4xLTE3IDMxLjMtMTcgOC40IDAgMTYuNSAzLjIgMjIuNyA4LjggMyAyLjYgNS41IDUuOSA3LjEgOS42czIuNSA3LjYgMi41IDExLjdsMCA1LjVjLTkuMS01LjEtMjAuNi03LjgtMzQuNi03LjgtMTYuNCAwLTI5LjYgMy45LTM5LjUgMTEuOHMtMTQuOCAxOC4zLTE0LjggMzEuNmMtLjIgNS45IDEgMTEuOCAzLjQgMTcuMnM2IDEwLjIgMTAuNSAxNC4xYzkuMiA4LjMgMjEgMTIuNSAzNC44IDEyLjUgMTYuMyAwIDI5LjItNy4zIDM5LTIxLjlsMSAwIDAgMTcuNyAyMi42IDAgMC03OC43Yy4xLTE2LjYtNC45LTI5LjctMTUtMzl6bS0xOS4yIDg5LjNjLTMuNSAzLjUtNy42IDYuMy0xMi4yIDguMnMtOS41IDIuOS0xNC40IDIuOWMtNi43IC4xLTEzLjEtMi4xLTE4LjMtNi4yLTIuNC0xLjgtNC40LTQuMi01LjctNi45cy0yLTUuNy0yLTguN2MwLTcgMy4yLTEyLjggOS41LTE3LjRzMTQuNS03IDI0LjEtN2MxMy4yLS4yIDIzLjUgMi44IDMwLjggOC44IDAgMTAuMS00IDE4LjktMTEuNyAyNi40em0tOTMuNy0xNDJjLTUuMy01LjMtMTEuNi05LjUtMTguNi0xMi4zcy0xNC40LTQuMi0yMS45LTRsLTYyLjcgMCAwIDE4Ni43IDIzLjYgMCAwLTc1LjYgMzkgMGMxNiAwIDI5LjUtNS40IDQwLjUtMTUuOSAuOS0uOSAxLjgtMS44IDIuNi0yLjcgOS42LTEwLjUgMTQuOC0yNC40IDE0LjMtMzguNnMtNi42LTI3LjctMTYuOS0zNy42bDAgMHptLTE2LjYgNjIuMmMtMyAzLjItNi42IDUuNy0xMC42IDcuNHMtOC40IDIuNS0xMi43IDIuM2wtMzkuNiAwIDAtNjUuMiAzOS42IDBjOC41IDAgMTYuNiAzLjMgMjIuNiA5LjIgNi4xIDYuMSA5LjYgMTQuMyA5LjggMjNzLTMuMSAxNy05IDIzLjNsMCAwek02MTQuMyAyMDFsLTM2LjUgOTEuNy0uNSAwLTM3LjQtOTEuNy0yNS43IDAgNTEuOCAxMTkuNi0yOS40IDY0LjMgMjQuMyAwIDc5LTE4My45LTI1LjcgMHoiXQogICAgfTsKICAgIGZhQXBwbGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYXBwbGUiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjE3OSIsICJNMzE5LjEgMjY4LjdjLS4yLTM2LjcgMTYuNC02NC40IDUwLTg0LjgtMTguOC0yNi45LTQ3LjItNDEuNy04NC43LTQ0LjYtMzUuNS0yLjgtNzQuMyAyMC43LTg4LjUgMjAuNy0xNSAwLTQ5LjQtMTkuNy03Ni40LTE5LjctNTUuOCAuOS0xMTUuMSA0NC41LTExNS4xIDEzMy4yIDAgMjYuMiA0LjggNTMuMyAxNC40IDgxLjIgMTIuOCAzNi43IDU5IDEyNi43IDEwNy4yIDEyNS4yIDI1LjItLjYgNDMtMTcuOSA3NS44LTE3LjkgMzEuOCAwIDQ4LjMgMTcuOSA3Ni40IDE3LjkgNDguNi0uNyA5MC40LTgyLjUgMTAyLjYtMTE5LjMtNjUuMi0zMC43LTYxLjctOTAtNjEuNy05MS45ek0yNjIuNSAxMDQuNWMyNy4zLTMyLjQgMjQuOC02MS45IDI0LTcyLjUtMjQuMSAxLjQtNTIgMTYuNC02Ny45IDM0LjktMTcuNSAxOS44LTI3LjggNDQuMy0yNS42IDcxLjkgMjYuMSAyIDQ5LjktMTEuNCA2OS41LTM0LjN6Il0KICAgIH07CiAgICBmYVR1bWJsciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ0dW1ibHIiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZjE3MyIsICJNMzA5LjkgNDgwLjNjLTEzLjYgMTQuNS01MCAzMS43LTk3LjQgMzEuNy0xMjAuOCAwLTE0Ny04OC44LTE0Ny0xNDAuNmwwLTE0NC00Ny41IDBjLTUuNSAwLTEwLTQuNS0xMC0xMGwwLTY4YzAtNy4yIDQuNS0xMy42IDExLjMtMTYgNjItMjEuOCA4MS41LTc2IDg0LjMtMTE3LjEgLjgtMTEgNi41LTE2LjMgMTYuMS0xNi4zbDcwLjkgMGM1LjUgMCAxMCA0LjUgMTAgMTBsMCAxMTUuMiA4MyAwYzUuNSAwIDEwIDQuNCAxMCA5LjlsMCA4MS43YzAgNS41LTQuNSAxMC0xMCAxMGwtODMuNCAwIDAgMTMzLjJjMCAzNC4yIDIzLjcgNTMuNiA2OCAzNS44IDQuOC0xLjkgOS0zLjIgMTIuNy0yLjIgMy41IC45IDUuOCAzLjQgNy40IDcuOWwyMiA2NC4zYzEuOCA1IDMuMyAxMC42LS40IDE0LjV6Il0KICAgIH07CiAgICBmYVBob2VuaXhTcXVhZHJvbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwaG9lbml4LXNxdWFkcm9uIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1MTEiLCAiTTk2IDYzLjRjNDYuNS0zNi4xIDEwNS42LTU2LjEgMTY0LjUtNTQuNiAyOS42LS40IDU5LjEgNS40IDg2LjkgMTUuMy0yNC4xLTQuNi00OS02LjMtNzMuNC0yLjUtNDIuOSA1LjMtODMgMjcuMi0xMTEuOCA1OS4yIDUuNy0xIDEwLjgtMy43IDE2LTUuOSAxOC4xLTcuOSAzNy41LTEzLjMgNTcuMi0xNC44IDE5LjctMi4xIDM5LjYtLjQgNTkuMyAxLjktMTQuNCAyLjgtMjkuMSA0LjYtNDMgOS42LTM0LjQgMTEuMS02NS4zIDMzLjItODYuMyA2Mi42LTEzLjggMTkuNy0yMy42IDQyLjktMjQuNyA2Ny4xLS40IDE2LjUgNS4yIDM0LjggMTkuOCA0NCAxMS4yIDYuOCAyNC42IDkuMiAzNy41IDYuNyAxNS40LTIuNSAzMC4xLTguNiA0My42LTE2LjMgMTEuNS02LjggMjIuNy0xNC42IDMyLTI0LjMgMy44LTMuMiAyLjUtOC40IDIuNi0xMi44LTIuMS0uMy00LjQtMS4xLTYuMyAuMy0xMS40IDYuMy0yMy40IDExLjQtMzUuOCAxNS40LTIwIDYuMi00Mi4yIDguNS02Mi4xIC44IDEyLjggMS43IDI2LjEgLjMgMzcuNy01LjQgMjAuMi05LjcgMzYuOC0yNS4yIDU0LjQtMzguOCAyNy43LTIxLjMgNTcuNS0zOS45IDg4LjktNTUuMyAyNS43LTEyIDUyLjktMjIuOCA4MS42LTI0LjEtMTUuNiAxMy43LTMyLjEgMjYuNS00Ni44IDQxLjQtMTQuNSAxNC0yNy41IDI5LjUtNDAuMSA0NS4yLTMuNSA0LjYtOSA2LjktMTMuNiAxMC4yLTIyLjQgMTUtNDAuMyAzNS44LTUxLjkgNjAuMS05LjMgMTkuNy0xNC41IDQxLjktMTEuOCA2My42IDEuOSAxMy43IDguNyAyNy42IDIwLjkgMzQuOSAxMi45IDggMjkgOC4xIDQzLjUgNS4xIDMyLjgtNy40IDYxLjQtMjguOSA4MS01NS44IDIwLjQtMjcuNSAzMC41LTYyLjIgMjkuMi05Ni4zLS41LTcuNS0xLjYtMTUtMS43LTIyLjUgOCAxOS41IDE0LjggMzkuNyAxNi42IDYwLjggMiAxNC4zIC43IDI4LjgtMS42IDQyLjktMS45IDExLTUuNyAyMS41LTcuOCAzMi40IDIwLjQtMjIuOSAzNC01MC45IDM5LjMtODEuMSA1LjYtMzUuNSAuNy03MS45LTE0LjItMTA0LjYgMjAuOCAzMiAzMi4zIDY5LjYgMzUuNyAxMDcuNSAuNSAxMi43IC41IDI1LjUgMCAzOC4yLTIuOCAzNC4zLTEyLjkgNjcuNi0yOS42IDk3LjgtMjYuMSA0Ny4zLTY4IDg1LjYtMTE3LjIgMTA4LTc4LjMgMzYuMi0xNzQuNyAzMS4zLTI0OC0xNC43LTM5LTIzLjgtNzAuNi01OC05MS40LTk4LjctMTQuNy0yOC45LTIzLjMtNjAuNS0yNS40LTkyLjlsMC0zMS4zQzMuOSAxNzIgNDAuOSAxMDUuOCA5NiA2My40em0yMjIgODAuM2M1LjUtLjkgMTAuOC0yLjQgMTYtNC41IDUtMS44IDkuMi01LjkgMTAuMy0xMS4yLTkgNS0xOCA5LjktMjYuMyAxNS43eiJdCiAgICB9OwogICAgZmFDZW50ZXJjb2RlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNlbnRlcmNvZGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjM4MCIsICJNMjAxLjggMjU0LjhhNjQuMSA2NC4xIDAgMSAxIDEyNy40IDEzLjggNjQuMSA2NC4xIDAgMSAxIC0xMjcuNC0xMy44em00MS42IDI0OC45Qzk2LjcgNDk2LTguMiAzNjUuNSAxMC4xIDIyNC4zIDIxLjMgMTM3LjcgNzUuOSA2Ny40IDE0OS4yIDMyLjMgMzEwLjItNDQuOCA0OTguOSA2OS43IDUwMy45IDI0OC45IDUwOCAzOTUuOSAzODUuNSA1MTEuMSAyNDMuNCA1MDMuN3ptMTc5LjktMTgwYzI3LjktMTE4LTE2MC41LTIwNS45LTIzNy4yLTIzNC4yLTU3LjUgNTYuMy02OS4xIDE4OC42LTMzLjggMzQ0LjQgNjguOCAxNS44IDE2OS4xLTI2LjQgMjcxLTExMC4yeiJdCiAgICB9OwogICAgZmFEZWJpYW4gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZGViaWFuIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU2MGIiLCAiTTM4MC40IDI0NS42YzMtNy42IDUuNS0xNCA1LjItMjQuNGwtNC4zIDljNC40LTEzLjIgNC0yNy4xIDMuNi00MC40LS4yLTYtLjMtMTEuOCAwLTE3LjRsLTEuOC0uNWMtMS41LTQ1LjItNDAuNi05My4xLTc1LjMtMTA5LjQtMzAtMTMuOC03Ni4xLTE2LjItOTcuMy01LjggMS4zLTEuMSA0LjItMiA2LjgtMi43bC4zLS4xYzMuMy0xIDYtMS43IDQtMi45LTE5LjIgMS45LTI0LjkgNS41LTMxLjEgOS40bC0uMSAwYy00LjYgMi45LTkuNSA2LTIwLjMgOC43LTMuNSAzLjQgMS43IDIgNS44IC45czcuMi0xLjktLjEgMi40Yy0zLjUgMS02LjYgMS4zLTkuNiAxLjZsLS4xIDBjLTguMyAuOC0xNS44IDEuNi0zMC43IDE3IC44IDEuMyAzLjQtLjIgNS4zLTEuM2wuMS0uMWMyLjMtMS40IDMuNC0yLTEuNyA0LjQtMTkuMS0yLjQtNjAuMyA0My43LTY5LjEgNTlsNC42IC44Yy0zLjIgOC02LjggMTQuOC0xMCAyMC44LTQuMyA4LjEtNy45IDE0LjktOC43IDIxLjMtLjMgNS4xLTEgMTEtMS43IDE3LjMtLjEgMS0uMiAyLS4zIDNsLS4xIC42Yy0zIDI3LjMtNi43IDYwLjggMy45IDczbC0xLjMgMTNjLjYgMS4yIDEuMSAyLjMgMS42IDMuNSAuMiAuNCAuNCAuOCAuNSAxLjEgMSAyLjEgMiA0LjIgMy4zIDYuMmwtMyAuMmM3IDIyLjEgMTAuOCAyMi41IDE1LjEgMjIuOSA0LjQgLjQgOS4zIC45IDE4LjcgMjQuMi0yLjctLjktNS41LTEuOS05LjQtNy4yLS41IDQuMSA1LjggMTYuMyAxMy4xIDI1LjhsLTMuMSAzLjZjMi4xIDMuNyA0LjggNi4yIDcuNiA4LjggMSAuOSAyLjEgMS45IDMuMSAyLjktMTEuOS02LjUgMy4yIDEzLjcgMTEuOSAyNS4yIC44IDEuMSAxLjUgMiAyLjIgMi45IDEuNCAxLjkgMi41IDMuNCAyLjkgNC4xbDIuNC00LjJjLS4zIDYuMSA0LjMgMTMuOSAxMy4xIDI0LjdsNy4zLS4zYzMgNiAxNCAxNi43IDIwLjcgMTcuMmwtNC40IDUuOGM4LjEgMi42IDEwLjMgNC4zIDEyLjcgNi4yIDIuNiAyLjEgNS40IDQuMyAxNi4xIDguMWwtNC4yLTcuNGMzLjUgMyA2LjIgNS45IDguOCA4LjdsLjEgLjFjNS4yIDUuNiA5LjkgMTAuNiAxOS43IDE1LjMgMTAuNyAzLjcgMTYuNiA0LjcgMjIuNyA1LjggLjMgMCAuNiAuMSAuOSAuMSA1LjQgLjggMTEuMiAxLjggMjAuOCA0LjUtMS4xLS4xLTIuMi0uMS0zLjMtLjEtMi4zLS4xLTQuNy0uMS03LS4xLTE0LjQtLjItMjkuMi0uNC00Mi43LTUuMi05Ni42LTI1LjctMTg0LjktMTM5LTE3OC40LTI1NS42LS42LTkuOS0uMy0yMC45IDAtMzAuNyAuNC0xMy41IC43LTI0LjgtMS42LTI4LjNsMS0zLjFjNS4zLTE3LjQgMTEuNy0zOC4yIDIzLjgtNjIuOGwtLjEtLjIgMC0uMWMuNCAuNCAzLjQgMy40IDguOC01LjggLjgtMS44IDEuNi0zLjcgMi40LTUuNiAuNS0xLjEgLjktMi4yIDEuNC0zLjIgMi41LTYuMSA1LjEtMTIuMyA4LjQtMTcuOWwyLjYtLjZjMS43LTEwLjEgMTctMjMuOCAyOS44LTM1LjJsMS4xLTFjNS43LTUuMSAxMC43LTkuNyAxMy42LTEzLjFsLjcgNC40YzE3LTE1LjkgNDQuNi0yNy41IDY1LjYtMzYuNGwuNS0uMmM0LjgtMiA5LjMtMy45IDEzLjMtNS43LTMuNCAzLjggMi4yIDIuNyAxMCAxIDQuOC0xIDEwLjQtMi4xIDE1LjMtMi40bC0zLjkgMi4xYy0yLjcgMS40LTUuNCAyLjgtOCA0LjYgOC4xLTIgMTEuNy0xLjQgMTUuNy0uOGwuMyAwYzMuNSAuNiA3LjMgMS4yIDE0LjYgLjItNS42IC44LTEyLjMgMy0xMS4yIDMuOCA3LjkgLjkgMTIuOC0uMSAxNy4yLTFsLjIgMGM1LjUtMS4xIDEwLjMtMiAxOS4zIC45bC0xLTQuOGM3LjMgMi42IDEyLjcgNC4zIDE3LjUgNS44bC41IC4xYzEwIDMgMTcuNiA1LjMgMzQuMiAxNC4xIDMuMiAuMiA1LjMtLjUgNy40LTEuMmwuMSAwYzMuNi0xLjEgNy0yLjEgMTUuMiAxLjIgLjMgLjUgLjUgMSAuNyAxLjQgLjEgLjIgLjIgLjUgLjMgLjdsMCAuMWMxIDIuNiAxLjggNC42IDE0LjYgMTIuMSAxLjctLjctMi43LTQuNy02LjQtOC4ybC0uMS0uMWMtLjItLjEtLjMtLjMtLjUtLjQgMzIuMiAxNy4zIDY3LjMgNTQuMSA3OCA5My41LTYtMTEuMS01LjItNS41LTQuMyAuNSAuNiA0IDEuMiA4LjEtLjIgNy41IDQuNSAxMi4xIDguMSAyNC41IDEwLjQgMzcuNGwtLjgtMi45LS4xLS4zYy0zLjMtMTEuOS05LjYtMzQuMy0xOS45LTQ5LjMtLjQgNC4zLTIuOCAzLjktNS4yIDMuNWwtLjEgMGMtMy4zLS42LTYuMi0xLjEtMS45IDEyLjYgMi42IDMuOCAzLjEgMi40IDMuNSAxLjEgLjUtMS41IC45LTIuNyA0LjcgNS4yIC4xIDQuMSAxIDguMiAyLjEgMTIuN2wuMSAuNmMuMSAuMyAuMSAuNSAuMiAuOGwuMSAuNmMuNiAyLjYgMS4zIDUuNCAxLjggOC40LTEuMS0uMi0yLjMtMi4yLTMuNC00LjItMS40LTIuNC0yLjgtNC43LTMuNy0zLjIgMi40IDExLjUgNi41IDE3LjQgOCAxOC4zLS4zIC42LS42IC43LTEuMSAuNy0uOCAwLTEuOCAuMS0xLjkgNS4zIC43IDEzLjcgMy4zIDEyLjUgNS4zIDExLjYgLjYtLjMgMS4yLS42IDEuNy0uNC0uNiAyLjUtMS42IDUuMS0yLjcgNy45LTIuOCA3LjEtNiAxNS40LTMuNCAyNi4xLS44LTMtMi02LTMuMS04LjlsLS4xLS40Yy0uMi0uNS0uNC0xLS42LTEuNS0uMy0uOC0uNi0xLjYtLjktMi4zLS42IDQuNC0uMyA3LjctLjEgMTAuNmwwIC43Yy40IDUuMyAuNyAxMC0zIDE5LjkgNC4zLTE0LjIgMy44LTI2LjktLjItMjAuOCAxIDEwLjktMy43IDIwLjQtOCAyOC45bC0uMSAuMmMtMy42IDcuMS02LjggMTMuNS01LjkgMTkuM2wtNS4yLTcuMWMtNy41IDEwLjktNyAxMy4zLTYuNSAxNS41bDAgLjFjLjUgMS45IDEgMy44LTMuNCAxMC44IDEuNy0yLjkgMS4zLTMuNiAxLTQuMi0uNC0uOC0uNy0xLjUgMS43LTUuMS0xLjYgLjEtNS41IDMuOS0xMC4xIDguNS0zLjkgMy45LTguNSA4LjQtMTIuOCAxMS44LTM3LjUgMzAuMS04Mi4zIDM0LTEyNS42IDE3LjggLjItMS0uMi0yLjEtMy4xLTQuMS0zNi44LTI4LjItNTguNS01Mi4xLTUwLjktMTA3LjUgMi4xLTEuNiAzLjYtNS44IDUuMy0xMC44bC4yLS40IC4xLS4zIDAtLjFjMi45LTguNCA2LjUtMTguOCAxNC4zLTIzLjggNy44LTE3LjMgMzEuMy0zMy4zIDU2LjQtMzMuNyAyNS42LTEuNCA0Ny4yIDEzLjcgNTguMSAyNy45LTE5LjgtMTguNC01Mi4xLTI0LTc5LjctMTAuNC0yOC4yIDEyLjctNDUgNDMuOC00Mi41IDc0LjcgLjMtLjQgLjYtLjYgLjktLjhsLjItLjJjLjYtLjUgMS4xLS45IDEuNC0zLjMtLjkgNjAuMiA2NC44IDEwNC4zIDExMi4xIDgybC42IDEuM2MxMi43LTMuNSAxNS45LTYuNSAyMC4zLTEwLjdsLjEtLjFjMi4yLTIuMSA0LjctNC41IDguOS03LjMtLjMgLjctMS4zIDEuNy0yLjQgMi43LTIuMiAyLjEtNC42IDQuNS0xLjYgNC42IDUtMS4zIDE4LjUtMTMuNCAyOC41LTIyLjMgLjYtLjUgMS4yLTEgMS43LTEuNSAxLjUtMS4zIDIuOC0yLjUgNC0zLjZsLjMtLjNjMS45LTQuMiAxLjYtNS42IDEuMy03bDAtLjFjLS40LTEuNi0uOC0zLjMgMi40LTkuNmw3LjMtMy43Yy44LTIuMSAxLjUtNC4xIDIuMi02IC4yLS42IC41LTEuMiAuNy0xLjhsLS40LS4yLS4xLS4xek0yNDggMzM0LjFjLTYtMy0xMy43LTguOS0xNC44LTExLjRsLS40IC4zYy0uMyAuNi0uNSAxLjMtLjIgMi4yLTEyLjItNS43LTIzLjQtMTQuMy0zMi42LTI0LjkgNC45IDcuMSAxMC4xIDE0LjEgMTcgMTkuNS02LjktMi4zLTE1LjEtMTEuOC0yMS42LTE5LjNsLS4xLS4xYy00LjMtNS03LjktOS4xLTkuNy05LjUgMTkuOCAzNS41IDgwLjUgNjIuMyAxMTIuMyA0OS0xNC43IC41LTMzLjQgLjMtNDkuOS01Ljh6bTc5LjMtMTE5LjdsLS4xLS4yYy0uNS0xLjUtMS4xLTMuMS0xLjctMy40IDEuNC01LjggNS40LTEwLjcgNC40IDQuNi0xIDMuOC0xLjggMS41LTIuNi0xem0tNC4yIDIyLjJjLTEuMyA3LjktNSAxNS41LTEwLjEgMjIuNSAuMi0yLTEuMi0yLjQtMi42LTIuOC0yLjktLjgtNS45LTEuNiA1LjYtMTYuMS0uNSAxLjktMi4xIDQuNi0zLjcgNy4zbC0uMyAuNGMtMy42IDUuOS02LjcgMTEgNCA0LjNsMS0xLjhjMi42LTQuNSA1LTguOCA2LTEzLjhsLjEgMHptLTU1LjYgMzMuOWM3LjEgLjYgMTQuMSAuNiAyMS0xLjEtMi41IDIuNC01LjIgNC44LTguMyA3LjItMTEuMS0xLjctMjEuMi02LTEyLjctNi4xem0tOTIuNiAxMS42YzMuNiA3LjEgNi40IDExLjUgOSAxNS43bC4xIC4yYzIuMyAzLjcgNC40IDcuMSA2LjggMTEuNy01LjEtNC4yLTguNy05LjUtMTIuNS0xNWwtLjMtLjVjLTEuNC0yLjEtMi44LTQuMi00LjQtNi4ybDEuMi01LjkgLjEgMHptNy41LTkuNmMxLjYgMy4zIDMuMiA2LjQgNS43IDkuMWwyLjYgNy43LTEuMy0yLjFjLTMuMi01LjMtNi4zLTEwLjYtOC0xNi43bDEgMnptMjM4LjktNDEuNmMtMi4zIDE3LjQtNy43IDM0LjYtMTYgNTAuMyA3LjYtMTQuOSAxMi41LTMwLjkgMTQuOC00Ny4ybDEuMi0zLjF6TTM1LjggMTEwLjZjLjQgLjggMS40IC41IDIuMyAuMyAxLjktLjUgMy42LS45LS4xIDcuNi0uNSAuMy0xIC43LTEuNSAxLTEuNCAuOS0yLjggMS45LTMuOSAzIDEuOS0zLjggMy41LTcuNCAzLjItMTEuOXpNMjUuNSAxNTIuM2MtLjcgMy43LTEuNSA3LjktMy40IDEzLjkgLjItMS45IDAtMy41LS4yLTQuOWwwLS4xYy0uNC0zLjQtLjctNi4zIDQuMy0xMi44LS4zIDEuMi0uNSAyLjUtLjcgMy44bDAgLjF6Il0KICAgIH07CiAgICBmYU1hc3RvZG9uID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1hc3RvZG9uIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY0ZjYiLCAiTTQzMyAxNzkuMWMwLTk3LjItNjMuNy0xMjUuNy02My43LTEyNS43LTYyLjUtMjguNy0yMjguNi0yOC40LTI5MC41IDAgMCAwLTYzLjcgMjguNS02My43IDEyNS43IDAgMTE1LjctNi42IDI1OS40IDEwNS42IDI4OS4xIDQwLjUgMTAuNyA3NS4zIDEzIDEwMy4zIDExLjQgNTAuOC0yLjggNzkuMy0xOC4xIDc5LjMtMTguMWwtMS43LTM2LjlzLTM2LjMgMTEuNC03Ny4xIDEwLjFjLTQwLjQtMS40LTgzLTQuNC04OS42LTU0LS42LTQuNi0uOS05LjMtLjktMTMuOSA4NS42IDIwLjkgMTU4LjcgOS4xIDE3OC43IDYuNyA1Ni4xLTYuNyAxMDUtNDEuMyAxMTEuMi03Mi45IDkuOC00OS44IDktMTIxLjUgOS0xMjEuNXpNMzU3LjkgMzA0LjNsLTQ2LjYgMCAwLTExNC4yYzAtNDkuNy02NC01MS42LTY0IDYuOWwwIDYyLjUtNDYuMyAwIDAtNjIuNWMwLTU4LjUtNjQtNTYuNi02NC02LjlsMCAxMTQuMi00Ni43IDBjMC0xMjIuMS01LjItMTQ3LjkgMTguNC0xNzUgMjUuOS0yOC45IDc5LjgtMzAuOCAxMDMuOCA2LjFsMTEuNiAxOS41IDExLjYtMTkuNWMyNC4xLTM3LjEgNzguMS0zNC44IDEwMy44LTYuMSAyMy43IDI3LjMgMTguNCA1MyAxOC40IDE3NWwwIDB6Il0KICAgIH07CiAgICBmYVNrZXRjaCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJza2V0Y2giLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjdjNiIsICJNMjcuOCAxNjIuMmwtMTguNSAyNC45IDkwLjUgMCA2LjktMTMwLjctNzguOSAxMDUuOHpNMzk2LjYgNDUuN0wyNjggMzIgNDAzLjcgMTc5LjIgMzk2LjYgNDUuN3pNMTEyLjUgMjE4LjNsLTExLjItMjItOTEuMSAwIDIyNC45IDI2MS43LTEyMi42LTIzOS43em0yLTMxLjJsMjg0IDBDMzQwLjYgMTI0LjMgMjkzLjMgNzIuOSAyNTYuNiAzM0wxMTQuNSAxODcuMXptMjk3LjMgOS4xbC0xMzMuOSAyNjEuOCAyMjQuOC0yNjEuNy05MC45IDAgMC0uMXpNNDE1LjcgNjlsLTkuNC0xMi42IC45IDE3LjMgNi4xIDExMy40IDkwLjMgMC04Ny45LTExOC4xek0xMTMuOCA5My41TDEwOS4yIDE3OS4xIDI0NSAzMiAxMTYuNCA0NS43IDExMy44IDkzLjV6TTQwMS41IDE5Ni4ybC0yOTAgMGMxOC4yIDM1LjYgNjYuNiAxMzAuMiAxNDUuMSAyODMuOEw0MDEuNSAxOTYuMnoiXQogICAgfTsKICAgIGZhV2ViQXdlc29tZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ3ZWItYXdlc29tZSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNjgyIiwgIk0zNzIuMiA1MmMwIDIwLjktMTIuNCAzOS0zMC4yIDQ3LjJMNDQ4IDE5MiA1NTIuNCAxNzEuMWMtNS4zLTcuNy04LjQtMTcuMS04LjQtMjcuMSAwLTI2LjUgMjEuNS00OCA0OC00OHM0OCAyMS41IDQ4IDQ4YzAgMjYtMjAuNiA0Ny4xLTQ2LjQgNDhMNDgxIDQ0Mi4zYy0xMC4zIDIzLTMzLjIgMzcuNy01OC40IDM3LjdsLTIwNS4yIDBjLTI1LjIgMC00OC0xNC44LTU4LjQtMzcuN0w0Ni40IDE5MkMyMC42IDE5MS4xIDAgMTcwIDAgMTQ0IDAgMTE3LjUgMjEuNSA5NiA0OCA5NnM0OCAyMS41IDQ4IDQ4YzAgMTAuMS0zLjEgMTkuNC04LjQgMjcuMUwxOTIgMTkyIDI5OC4xIDk5LjFjLTE3LjctOC4zLTMwLTI2LjMtMzAtNDcuMSAwLTI4LjcgMjMuMy01MiA1Mi01MnM1MiAyMy4zIDUyIDUybC4xIDB6Il0KICAgIH07CiAgICBmYVNhc3MgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2FzcyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNDFlIiwgIk0zMDEuOCAzNzguOWwwIDB6bTI0OS4xLTg3Yy0yMC4xIDAtNDAgNC42LTU4IDEzLjUtNS45LTExLjktMTItMjIuMy0xMy0zMC4xLTEuMi05LjEtMi41LTE0LjUtMS4xLTI1LjNzNy43LTI2LjEgNy42LTI3LjItMS40LTYuNi0xNC4zLTYuNy0yNCAyLjUtMjUuMyA1LjljLTIuMyA2LjItNC4xIDEyLjYtNS4zIDE5LjEtMi4zIDExLjctMjUuOCA1My41LTM5LjEgNzUuMy00LjQtOC41LTguMS0xNi04LjktMjItMS4yLTkuMS0yLjUtMTQuNS0xLjEtMjUuM3M3LjctMjYuMSA3LjYtMjcuMi0xLjQtNi42LTE0LjMtNi43LTI0IDIuNS0yNS4zIDUuOS0yLjcgMTEuNC01LjMgMTkuMS0zMy45IDc3LjMtNDIuMSA5NS40Yy00LjIgOS4yLTcuOCAxNi42LTEwLjQgMjEuNi0uNCAuOC0uNyAxLjMtLjkgMS43IC4zLS41IC41LTEgLjUtLjgtMi4yIDQuMy0zLjUgNi43LTMuNSA2LjdsMCAuMWMtMS43IDMuMi0zLjYgNi4xLTQuNSA2LjEtLjYgMC0xLjktOC40IC4zLTE5LjkgNC43LTI0LjIgMTUuOC02MS44IDE1LjctNjMuMS0uMS0uNyAyLjEtNy4yLTcuMy0xMC43LTkuMS0zLjMtMTIuNCAyLjItMTMuMiAyLjJzLTEuNCAyLTEuNCAyIDEwLjEtNDIuNC0xOS40LTQyLjRjLTE4LjQgMC00NCAyMC4yLTU2LjYgMzguNS03LjkgNC4zLTI1IDEzLjYtNDMgMjMuNS02LjkgMy44LTE0IDcuNy0yMC43IDExLjQtLjUtLjUtLjktMS0xLjQtMS41LTM1LjgtMzguMi0xMDEuOS02NS4yLTk5LjEtMTE2LjUgMS0xOC43IDcuNS02Ny44IDEyNy4xLTEyNy40IDk4LTQ4LjggMTc2LjMtMzUuNCAxODkuOC01LjYgMTkuNCA0Mi41LTQxLjkgMTIxLjYtMTQzLjcgMTMzLTM4LjggNC4zLTU5LjItMTAuNy02NC4zLTE2LjMtNS4zLTUuOS02LjEtNi4yLTguMS01LjEtMy4zIDEuOC0xLjIgNyAwIDEwLjEgMyA3LjkgMTUuNSAyMS45IDM2LjggMjguOSAxOC43IDYuMSA2NC4yIDkuNSAxMTkuMi0xMS44IDYxLjgtMjMuOCAxMDkuOS05MC4xIDk1LjgtMTQ1LjYtMTQuNC01Ni40LTEwNy45LTc0LjktMTk2LjMtNDMuNS01Mi43IDE4LjctMTA5LjcgNDguMS0xNTAuNyA4Ni40LTQ4LjcgNDUuNi01Ni41IDg1LjMtNTMuMyAxMDEuOSAxMS40IDU4LjkgOTIuNiA5Ny4zIDEyNS4xIDEyNS43LTEuNiAuOS0zLjEgMS43LTQuNSAyLjUtMTYuMyA4LjEtNzguMiA0MC41LTkzLjcgNzQuNy0xNy41IDM4LjggMi45IDY2LjYgMTYuMyA3MC40IDQxLjggMTEuNiA4NC42LTkuMyAxMDcuNi00My42czIwLjItNzkuMSA5LjYtOTkuNWMtLjEtLjMtLjMtLjUtLjQtLjggNC4yLTIuNSA4LjUtNSAxMi44LTcuNSA4LjMtNC45IDE2LjQtOS40IDIzLjUtMTMuMy00IDEwLjgtNi45IDIzLjgtOC40IDQyLjYtMS44IDIyIDcuMyA1MC41IDE5LjEgNjEuNyA1LjIgNC45IDExLjUgNSAxNS40IDUgMTMuOCAwIDIwLTExLjQgMjYuOS0yNSA4LjUtMTYuNiAxNi0zNS45IDE2LTM1LjlzLTkuNCA1Mi4yIDE2LjMgNTIuMmM5LjQgMCAxOC44LTEyLjEgMjMtMTguM2wwIC4xcy4yLS40IC43LTEuMmMxLTEuNSAxLjUtMi40IDEuNS0yLjRsMC0uM2MzLjgtNi41IDEyLjEtMjEuNCAyNC42LTQ2IDE2LjItMzEuOCAzMS43LTcxLjUgMzEuNy03MS41IDEuNSA4LjcgMy42IDE3LjMgNi4yIDI1LjggMi44IDkuNSA4LjcgMTkuOSAxMy40IDMwLTMuOCA1LjItNi4xIDguMi02LjEgOC4yIDAgLjEgMCAuMSAuMSAuMi0zIDQtNi40IDguMy05LjkgMTIuNS0xMi44IDE1LjItMjggMzIuNi0zMCAzNy42LTIuNCA1LjktMS44IDEwLjMgMi44IDEzLjcgMy40IDIuNiA5LjQgMyAxNS43IDIuNSAxMS41LS44IDE5LjYtMy42IDIzLjUtNS40IDcuMi0yLjYgMTQtNi4xIDIwLjItMTAuNiAxMi41LTkuMiAyMC4xLTIyLjQgMTkuNC0zOS44LS40LTkuNi0zLjUtMTkuMi03LjMtMjguMiAxLjEtMS42IDIuMy0zLjMgMy40LTUgMTkuOC0yOC45IDM1LjEtNjAuNiAzNS4xLTYwLjYgMS41IDguNyAzLjYgMTcuMyA2LjIgMjUuOCAyLjQgOC4xIDcuMSAxNyAxMS40IDI1LjctMTguNiAxNS4xLTMwLjEgMzIuNi0zNC4xIDQ0LjEtNy40IDIxLjMtMS42IDMwLjkgOS4zIDMzLjEgNC45IDEgMTEuOS0xLjMgMTcuMS0zLjUgNy43LTIuNiAxNS02LjMgMjEuNi0xMS4xIDEyLjUtOS4yIDI0LjYtMjIuMSAyMy44LTM5LjYtLjMtNy45LTIuNS0xNS44LTUuNC0yMy40IDE1LjctNi42IDM2LjEtMTAuMiA2Mi4xLTcuMiA1NS43IDYuNSA2Ni42IDQxLjMgNjQuNSA1NS44cy0xMy44IDIyLjYtMTcuNyAyNS01LjEgMy4zLTQuOCA1LjFjLjUgMi42IDIuMyAyLjUgNS42IDEuOSA0LjYtLjggMjkuMi0xMS44IDMwLjMtMzguNyAxLjYtMzQtMzEuMS03MS40LTg5LTcxLjFsMCAwek0xMjEuOCA0MzYuNmMtMTguNCAyMC4xLTQ0LjIgMjcuNy01NS4zIDIxLjMtMTEuOS02LjktNy4yLTM2LjUgMTUuNS01Ny45IDEzLjgtMTMgMzEuNi0yNSA0My40LTMyLjQgMi43LTEuNiA2LjYtNCAxMS40LTYuOSAuOC0uNSAxLjItLjcgMS4yLS43IC45LS42IDEuOS0xLjEgMi45LTEuNyA4LjMgMzAuNCAuMyA1Ny4yLTE5LjEgNzguM2wwIDB6bTEzNC40LTkxLjRjLTYuNCAxNS43LTE5LjkgNTUuNy0yOC4xIDUzLjYtNy0xLjgtMTEuMy0zMi4zLTEuNC02Mi4zIDUtMTUuMSAxNS42LTMzLjEgMjEuOS00MC4xIDEwLjEtMTEuMyAyMS4yLTE0LjkgMjMuOC0xMC40IDMuNSA1LjktMTIuMiA0OS40LTE2LjIgNTkuMnptMTExIDUzYy0yLjcgMS40LTUuMiAyLjMtNi40IDEuNi0uOS0uNSAxLjEtMi40IDEuMS0yLjRzMTMuOS0xNC45IDE5LjQtMjEuN2MzLjItNCA2LjktOC43IDEwLjktMTMuOSAwIC41IC4xIDEgLjEgMS42LS4xIDE3LjktMTcuMyAzMC0yNS4xIDM0LjhsMCAwem04NS42LTE5LjVjLTItMS40LTEuNy02LjEgNS0yMC43IDIuNi01LjcgOC42LTE1LjMgMTktMjQuNSAxLjIgMy41IDEuOCA3LjEgMS45IDEwLjgtLjEgMjIuNS0xNi4yIDMwLjktMjUuOSAzNC40bDAgMHoiXQogICAgfTsKICAgIGZhVGhyZWVtYSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ0aHJlZW1hIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImU4NWYiLCAiTTg3LjQgNDQ1LjFjMTguNSAwIDMzLjUgMTUgMzMuNSAzMy40UzEwNS45IDUxMiA4Ny40IDUxMiA1NCA0OTcgNTQgNDc4LjUgNjkgNDQ1LjEgODcuNCA0NDUuMXptMTA5LjIgMGMxOC41IDAgMzMuNSAxNSAzMy41IDMzLjRzLTE1IDMzLjUtMzMuNSAzMy41LTMzLjQtMTUtMzMuNC0zMy41IDE1LTMzLjQgMzMuNC0zMy40em0xMDkuMyAwYzE4LjUgMCAzMy41IDE1IDMzLjUgMzMuNHMtMTUgMzMuNS0zMy41IDMzLjUtMzMuNS0xNS0zMy41LTMzLjUgMTUtMzMuNCAzMy41LTMzLjR6TTE5Mi4zIC4zYzEwOS44IDAgMTk5LjIgODkuMyAxOTkuMiAxOTkuMVMzMDIuMiAzOTguNSAxOTIuNCAzOTguNWMtNDAuNSAwLTc4LjEtMTIuMS0xMDkuNi0zMi45bC03Ni41IDI0LjUgMjQuOC03NEM3LjMgMjgzLjQtNi44IDI0My02LjggMTk5LjQtNi44IDg5LjcgODIuNSAuMyAxOTIuMyAuM3ptLjEgOTMuN2MtMzEuNiAwLTU3LjMgMjUuOC01Ny4zIDU3LjNsMCAyNi43LTEuOCAwYy0xMCAwLTE4IDgtMTggMThsMCA3Mi4zYzAgMTAgOCAxOCAxOCAxOGwxMTguMSAwYzEwIDAgMTgtOCAxOC0xOGwuMSAwIDAtNzIuM2MwLTEwLTguMS0xOC0xOC0xOGwtMS44IDAgMC0yNi43YzAtMzEuNi0yNS44LTU3LjMtNTcuMy01Ny4zem0tLjEgMjMuNWMxOC42IDAgMzMuOCAxNS4xIDMzLjggMzMuOGwwIDI2LjctNjcuNiAwIDAtMjYuN2MwLTE4LjYgMTUuMS0zMy44IDMzLjgtMzMuOHoiXQogICAgfTsKICAgIGZhU3F1YXJlV2hhdHNhcHAgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXdoYXRzYXBwIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbIndoYXRzYXBwLXNxdWFyZSJdLCAiZjQwYyIsICJNOTIuMSAyNTQuNmMwIDI0LjkgNyA0OS4yIDIwLjIgNzAuMWwzLjEgNS0xMy4zIDQ4LjYgNDkuOS0xMy4xIDQuOCAyLjljMjAuMiAxMiA0My40IDE4LjQgNjcuMSAxOC40bC4xIDBjNzIuNiAwIDEzMy4zLTU5LjEgMTMzLjMtMTMxLjggMC0zNS4yLTE1LjItNjguMy00MC4xLTkzLjItMjUtMjUtNTgtMzguNy05My4yLTM4LjctNzIuNyAwLTEzMS44IDU5LjEtMTMxLjkgMTMxLjh6TTI3NC44IDMzMGMtMTIuNiAxLjktMjIuNCAuOS00Ny41LTkuOS0zNi44LTE1LjktNjEuOC01MS41LTY2LjktNTguNy0uNC0uNi0uNy0uOS0uOC0xLjEtMi0yLjYtMTYuMi0yMS41LTE2LjItNDEgMC0xOC40IDktMjcuOSAxMy4yLTMyLjMgLjMtLjMgLjUtLjUgLjctLjggMy42LTQgNy45LTUgMTAuNi01IDIuNiAwIDUuMyAwIDcuNiAuMWwuOCAwYzIuMyAwIDUuMiAwIDguMSA2LjggMS4yIDIuOSAzIDcuMyA0LjkgMTEuOCAzLjMgOCA2LjcgMTYuMyA3LjMgMTcuNiAxIDIgMS43IDQuMyAuMyA2LjktMy40IDYuOC02LjkgMTAuNC05LjMgMTMtMy4xIDMuMi00LjUgNC43LTIuMyA4LjYgMTUuMyAyNi4zIDMwLjYgMzUuNCA1My45IDQ3LjEgNCAyIDYuMyAxLjcgOC42LTEgMi4zLTIuNiA5LjktMTEuNiAxMi41LTE1LjUgMi42LTQgNS4zLTMuMyA4LjktMnMyMy4xIDEwLjkgMjcuMSAxMi45Yy44IC40IDEuNSAuNyAyLjEgMSAyLjggMS40IDQuNyAyLjMgNS41IDMuNiAuOSAxLjkgLjkgOS45LTIuNCAxOS4xLTMuMyA5LjMtMTkuMSAxNy43LTI2LjcgMTguOHpNNDQ4IDk2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjB6TTE0OC4xIDM5My45TDY0IDQxNiA4Ni41IDMzMy44Yy0xMy45LTI0LTIxLjItNTEuMy0yMS4yLTc5LjMgLjEtODcuNCA3MS4yLTE1OC41IDE1OC42LTE1OC41IDQyLjQgMCA4Mi4yIDE2LjUgMTEyLjIgNDYuNSAyOS45IDMwIDQ3LjkgNjkuOCA0Ny45IDExMi4yIDAgODcuNC03Mi43IDE1OC41LTE2MC4xIDE1OC41LTI2LjYgMC01Mi43LTYuNy03NS44LTE5LjN6Il0KICAgIH07CiAgICBmYVdoYXRzYXBwU3F1YXJlID0gZmFTcXVhcmVXaGF0c2FwcDsKICAgIGZhU2t5cGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2t5cGUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjE3ZSIsICJNNDI0LjcgMjk5LjhjMi45LTE0IDQuNy0yOC45IDQuNy00My44IDAtMTEzLjUtOTEuOS0yMDUuMy0yMDUuMy0yMDUuMy0xNC45IDAtMjkuNyAxLjctNDMuOCA0LjctMTktMTQuNy00Mi42LTIzLjQtNjguMy0yMy40LTYxLjggMC0xMTIgNTAuMi0xMTIgMTEyIDAgMjUuNyA4LjcgNDkuMyAyMy4zIDY4LjItMi45IDE0LTQuNyAyOC45LTQuNyA0My44IDAgMTEzLjUgOTEuOSAyMDUuMyAyMDUuMyAyMDUuMyAxNC45IDAgMjkuNy0xLjcgNDMuOC00LjcgMTkgMTQuNiA0Mi42IDIzLjMgNjguMiAyMy4zIDYxLjggMCAxMTItNTAuMiAxMTItMTEyIC4xLTI1LjYtOC42LTQ5LjItMjMuMi02OC4xek0yMzAuMSAzOTEuM2MtNjUuNiAwLTEyMC41LTI5LjItMTIwLjUtNjUgMC0xNiA5LTMwLjYgMjkuNS0zMC42IDMxLjIgMCAzNC4xIDQ0LjkgODguMSA0NC45IDI1LjcgMCA0Mi4zLTExLjQgNDIuMy0yNi4zIDAtMTguNy0xNi0yMS42LTQyLTI4LTYyLjUtMTUuNC0xMTcuOC0yMi0xMTcuOC04Ny4yIDAtNTkuMiA1OC42LTgxLjEgMTA5LjEtODEuMSA1NS4xIDAgMTEwLjggMjEuOSAxMTAuOCA1NS40IDAgMTYuOS0xMS40IDMxLjgtMzAuMyAzMS44LTI4LjMgMC0yOS4yLTMzLjUtNzUtMzMuNS0yNS43IDAtNDIgNy00MiAyMi41IDAgMTkuOCAyMC44IDIxLjggNjkuMSAzMyA0MS40IDkuMyA5MC43IDI2LjggOTAuNyA3Ny42IDAgNTkuMS01Ny4xIDg2LjUtMTEyIDg2LjV6Il0KICAgIH07CiAgICBmYUFuZ3VsYXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYW5ndWxhciIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNDIwIiwgIk0xODUuNyAyNjguMWw3Ni4yIDAtMzguMS05MS42LTM4LjEgOTEuNnpNMjIzLjggMzJMMTYgMTA2LjQgNDcuOCAzODIuMSAyMjMuOCA0ODAgMzk5LjggMzgyLjEgNDMxLjYgMTA2LjQgMjIzLjggMzJ6TTM1NCAzNzMuOGwtNDguNiAwLTI2LjItNjUuNC0xMTAuNiAwLTI2LjIgNjUuNC00OC43IDAgMTMwLjEtMjkyLjMgMTMwLjIgMjkyLjN6Il0KICAgIH07CiAgICBmYUNpcmNsZVp1bGlwID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNpcmNsZS16dWxpcCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlODUxIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDEgMC01MTIgMjU2IDI1NiAwIDEgMSAwIDUxMnpNMjQzLjUgMjQwYzEuMi0xLjktLjktNC4yLTIuNi0yLjhsLTg5IDc5LjVjLTkuMiA3LjItMTUuMiAxOS4xLTE1LjIgMzIuNSAwIDIxLjkgMTYgMzkuOCAzNS43IDM5LjhsMTY3LjMgMGMxOS42IDAgMzUuNy0xNy45IDM1LjctMzkuOCAwLTIxLjktMTYuMS0zOS43LTM1LjctMzkuOGwtMTI2LjYgMGMtMS45IDAtMy0yLjMtMi4xLTQuMUwyNDMuNSAyNDB6TTE3Mi40IDEyMy4xYy0xOS42IDAtMzUuNyAxNy45LTM1LjcgMzkuOHMxNiAzOS44IDM1LjcgMzkuOGwxMjYuNiAwYzEuOSAwIDMuMSAyLjIgMi4yIDQuMUwyNjguNSAyNzJjLTEuMiAxLjkgLjkgNC4yIDIuNiAyLjhsODktNzkuNWM5LjItNy4yIDE1LjItMTkuMSAxNS4yLTMyLjUgMC0yMS45LTE2LTM5LjctMzUuNy0zOS44bC0xNjcuMyAweiJdCiAgICB9OwogICAgZmFPcGVuc3VzZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJvcGVuc3VzZSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNjJiIiwgIk00NzEuMSAxMDIuN3MtLjMgMTguMy0uMyAyMC4zYy05LjEtMy03NC40LTI0LjEtMTM1LjctMjYuMy01MS45LTEuOC0xMjIuOC00LjMtMjIzIDU3LjMtMTkuNCAxMi40LTczLjkgNDYuMS05OS42IDEwOS43LTUuNSAxMy4zLTEyLjYgNDMuMy01LjUgNzEuNCAzLjMgMTIuOCA4LjkgMjQuOSAxNi41IDM1LjcgMTcuNCAyNSA0Ni42IDQxLjYgNzguMSA0NC40IDQ0LjQgMy45IDc4LjEtMTYgOTAtNTMuMyA4LjItMjUuOCAwLTYzLjYtMzEuNS04Mi45LTI1LjYtMTUuNy01My4zLTEyLjEtNjkuMi0xLjYtMTMuOSA5LjItMjEuOCAyMy41LTIxLjYgMzkuMiAuMyAyNy44IDI0LjMgNDIuNiA0MS41IDQyLjYgNS40IDAgMTAuNy0uOSAxNS44LTIuNyA2LjUtMS44IDEzLjMtNi41IDEzLjMtMTQuOSAwLTEyLjEtMTEuNi0xNC44LTE2LjgtMTMuOS0yLjkgLjUtNC41IDItMTEuOCAyLjQtMi0uMi0xMi0zLjEtMTItMTRsMC0uMWMuMi0xMi4zIDEzLjItMTggMjUuNS0xNi45IDMyLjMgMi44IDQ3LjcgNDAuNyAyOC41IDY1LjctMTguMyAyMy43LTc2LjYgMjMuMi05OS43LTIwLjQtMjYtNDkuMiAxMi43LTExMS4yIDg3LTk4LjQgMzMuMiA1LjcgODMuNiAzNS41IDEwMi40IDEwNC4zbDQ1LjkgMGMtNS43LTE3LjYtOC45LTY4LjMgNDIuNy02OC4zIDU2LjcgMCA2My45IDM5LjkgNzkuOCA2OC4zbDQ4LjYgMGMtMTIuOC0xOC4zLTIxLjctMzguNy0xOC45LTU1LjggNS42LTMzLjggMzkuNy0xOC40IDgyLjQtMTcuNCA2Ni41IC40IDEwMi4xLTI3IDEwMy4xLTI4IDMuNy0zLjEgNi41LTE1LjggNy0xNy43IDEuMy01LjEtMy4yLTIuNC0zLjItMi40LTguNyA1LjItMzAuNSAxNS4yLTUwLjkgMTUuNi0yNS4zIC41LTc2LjItMjUuNC04MS42LTI4LjItLjMtLjQgLjEgMS4yLTExLTI1LjUgODguNCA1OC4zIDExOC4zIDQwLjUgMTQ1LjIgMjEuNyAuOC0uNiA0LjMtMi45IDMuNi01LjctMTMuOC00OC4xLTIyLjQtNjIuNy0zNC41LTY5LjYtMzctMjEuNi0xMjUtMzQuNy0xMjkuMi0zNS4zIC4xLS4xLS45LS4zLS45IC43em02MC40IDcyLjhhMzcuNiAzNy42IDAgMSAxIDc1LjIgMi42IDM3LjYgMzcuNiAwIDEgMSAtNzUuMi0yLjZ6bTM4LjYtMjUuM2MtMy42LS4zLTcuMSAuMS0xMC41IDEuMnMtNi41IDIuOS05LjIgNS4zLTQuOCA1LjMtNi4zIDguNS0yLjQgNi43LTIuNSAxMC4zIC41IDcuMSAxLjggMTAuNCAzLjMgNi4zIDUuOCA4LjkgNS41IDQuNSA4LjggNS45IDYuOSAyIDEwLjQgMS45YzMuNiAuMyA3LjEtLjEgMTAuNS0xLjJzNi41LTIuOSA5LjItNS4zIDQuOC01LjMgNi4zLTguNSAyLjQtNi43IDIuNS0xMC4zLS41LTcuMS0xLjgtMTAuNC0zLjMtNi4zLTUuOC04LjktNS41LTQuNS04LjgtNS45LTYuOS0yLTEwLjQtMS45em00LjMgMjguOGMtMTUuNCAwLTE1LjQtMTUuNiAwLTE1LjZzMTUuNCAxNS42IDAgMTUuNnoiXQogICAgfTsKICAgIGZhRHJvcGJveCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJkcm9wYm94IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYxNmIiLCAiTTI4OC40IDExNi4zbC0xMzIgODQuMyAxMzIgODQuMy0xMzIgODQuMy0xMzIuNC04NS4xIDEzMi4zLTg0LjMtMTMyLjMtODMuNSAxMzIuMy04NC4zIDEzMi4xIDg0LjN6TTE1NS42IDM5NS43bDEzMi04NC4zIDEzMiA4NC4zLTEzMiA4NC4zLTEzMi04NC4zek0yODguNCAyODQuMWwxMzItODQuMy0xMzItODMuNiAxMzEuMy04NC4yIDEzMi4zIDg0LjMtMTMyLjMgODQuMyAxMzIuMyA4NC4yLTEzMi4zIDg0LjMtMTMxLjMtODV6Il0KICAgIH07CiAgICBmYURlZXplciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJkZWV6ZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTA3NyIsICJNMTQuOCAxMDEuMUM2LjYgMTAxLjEgMCAxMjcuNiAwIDE2MC4zczYuNiA1OS4yIDE0LjggNTkuMiAxNC44LTI2LjUgMTQuOC01OS4yLTYuNi01OS4yLTE0LjgtNTkuMnpNNDQ4LjcgNDAuOWMtNy43IDAtMTQuNSAxNy4xLTE5LjQgNDQuMS03LjctNDYuNy0yMC4yLTc3LTM0LjItNzctMTYuOCAwLTMxLjEgNDIuOS0zOCAxMDUuNC02LjYtNDUuNC0xNi44LTc0LjItMjguMy03NC4yLTE2LjEgMC0yOS42IDU2LjktMzQuNyAxMzYuMi05LjQtNDAuOC0yMy4yLTY2LjMtMzguMy02Ni4zcy0yOC44IDI1LjUtMzguMyA2Ni4zYy01LjEtNzkuMy0xOC42LTEzNi4yLTM0LjctMTM2LjItMTEuNSAwLTIxLjcgMjguOC0yOC4zIDc0LjItNi42LTYyLjUtMjEuMi0xMDUuNC0zNy44LTEwNS40LTE0IDAtMjYuNSAzMC40LTM0LjIgNzctNC44LTI3LTExLjctNDQuMS0xOS40LTQ0LjEtMTQuMyAwLTI2IDU5LjItMjYgMTMyLjFTNDkgMzA1LjIgNjMuMyAzMDUuMmM1LjkgMCAxMS41LTkuOSAxNS44LTI2LjggNi45IDYxLjcgMjEuMiAxMDQuMSAzOCAxMDQuMSAxMyAwIDI0LjUtMjUuNSAzMi4xLTY1LjYgNS40IDc2LjMgMTguNiAxMzAuNCAzNC4yIDEzMC40IDkuNyAwIDE4LjYtMjEuNCAyNS4zLTU2LjQgNy45IDcyLjIgMjYuMyAxMjIuNyA0Ny43IDEyMi43czM5LjUtNTAuNSA0Ny43LTEyMi43YzYuNiAzNSAxNS42IDU2LjQgMjUuMyA1Ni40IDE1LjYgMCAyOC44LTU0LjEgMzQuMi0xMzAuNCA3LjcgNDAuMSAxOS40IDY1LjYgMzIuMSA2NS42IDE2LjYgMCAzMC45LTQyLjMgMzgtMTA0LjEgNC4zIDE2LjggOS43IDI2LjggMTUuOCAyNi44IDE0LjMgMCAyNi01OS4yIDI2LTEzMi4xUzQ2MyA0MC45IDQ0OC43IDQwLjl6bTQ4LjUgNjAuMmMtOC4yIDAtMTQuOCAyNi41LTE0LjggNTkuMnM2LjYgNTkuMiAxNC44IDU5LjIgMTQuOC0yNi41IDE0LjgtNTkuMi02LjYtNTkuMi0xNC44LTU5LjJ6Il0KICAgIH07CiAgICBmYUNyZWF0aXZlQ29tbW9uc1NhbXBsaW5nID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNyZWF0aXZlLWNvbW1vbnMtc2FtcGxpbmciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjRmMCIsICJNMjU1LjYgOEMzOTcuNCA4IDUwNCAxMTguMSA1MDQgMjU2IDUwNCA0MDMuMSAzODUuNSA1MDQgMjU1LjYgNTA0IDEyMS42IDUwNCA4IDM5NC41IDggMjU2IDggMTIzLjEgMTEyLjcgOCAyNTUuNiA4em0uOCA0NC43Yy0xMTguMiAwLTIwMy43IDk3LjktMjAzLjcgMjAzLjMgMCAxMDkuOCA5MS4yIDIwMi44IDIwMy43IDIwMi44IDEwMy4yIDAgMjAyLjgtODEuMSAyMDIuOC0yMDIuOCAuMS0xMTMuOC05MC4yLTIwMy4zLTIwMi44LTIwMy4zem0zLjYgNTMuMmMyLjgtLjMgMTEuNSAxIDExLjUgMTEuNWw2LjYgMTA3LjIgNC45LTU5LjNjMC02IDQuNy0xMC42IDEwLjYtMTAuNnMxMC42IDQuNyAxMC42IDEwLjZjMCAyLjUtLjUtNS43IDUuNyA4MS41bDUuOC02NC4yYy4zLTIuOSAyLjktOS4zIDEwLjItOS4zIDMuOCAwIDkuOSAyLjMgMTAuNiA4LjlsMTEuNSA5Ni41IDUuMy0xMi44YzEuOC00LjQgNS4yLTYuNiAxMC4yLTYuNmw1OCAwIDAgMjEuMy01MC45IDAtMTguMiA0NC4zYy0zLjkgOS45LTE5LjUgOS4xLTIwLjgtMy4xbC00LTMxLjktNy41IDkyLjZjLS4zIDMtMyA5LjMtMTAuMiA5LjMtMyAwLTkuOC0yLjEtMTAuNi05LjMgMC0xLjkgLjYgNS44LTYuMi03Ny45bC01LjMgNzIuMmMtMS4xIDQuOC00LjggOS4zLTEwLjYgOS4zLTIuOSAwLTkuOC0yLTEwLjYtOS4zIDAtMS45IC41IDYuNy01LjgtODcuN0wyNTUgMzgzLjljMCA2LjMtMy42IDEyLjQtMTAuNiAxMi40LTUuMiAwLTEwLjYtNC4xLTEwLjYtMTJMMjI4IDI5Ni42Yy01LjggOTIuNS01LjMgODQtNS4zIDg1LjktMS4xIDQuOC00LjggOS4zLTEwLjYgOS4zLTMgMC05LjgtMi4xLTEwLjYtOS4zIDAtLjctLjQtMS4xLS40LTIuNmwtNi4yLTg4LjYtNC45IDU2LjdjLS43IDYuNS02LjcgOS4zLTEwLjYgOS4zLTUuOCAwLTkuNi00LjEtMTAuNi04LjlMMTU3LjcgMjcyYy0yIDQtMy41IDguNC0xMS4xIDguNGwtNTEuNCAwIDAtMjEuMyA0NC44IDAgMTMuNy0yNy45YzQuNC05LjkgMTguMi03LjIgMTkuOSAyLjdsMy4xIDIwLjQgOC40LTk3LjljMC02IDQuOC0xMC42IDEwLjYtMTAuNiAuNSAwIDEwLjYtLjIgMTAuNiAxMi40bDQuOSA2OS4xIDYuNi05Mi42YzAtMTAuMSA5LjUtMTAuNiAxMC4yLTEwLjYgLjYgMCAxMC42IC43IDEwLjYgMTAuNmw1LjMgODAuNiA2LjItOTcuOWMuMS0xLjEtLjYtMTAuMyA5LjktMTEuNXoiXQogICAgfTsKICAgIGZhSmVkaU9yZGVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImplZGktb3JkZXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjUwZSIsICJNMzk4LjkgMzczLjZjOTUuOS0xMjIuMSAxNy4yLTIzMy4xIDE3LjItMjMzLjEgNDUuNCA4NS44LTQxLjQgMTcwLjUtNDEuNCAxNzAuNSAxMDUtMTcxLjUtNjAuNS0yNzEuNS02MC41LTI3MS41IDk2LjkgNzIuNy0xMC4xIDE5MC43LTEwLjEgMTkwLjcgODUuOCAxNTguNC02OC42IDIzMC4xLTY4LjYgMjMwLjFzLS40LTE2LjktMi4yLTg1LjdjNC4zIDQuNSAzNC41IDM2LjIgMzQuNSAzNi4ybC0yNC4yLTQ3LjQgNjIuNi05LjEtNjIuNi05LjEgMjAuMi01NS41LTMxLjQgNDUuOWMtMi4yLTg3LjctNy44LTMwNS4xLTcuOS0zMDYuOSAwIDEtNS42IDIxOS03LjkgMzA2LjlsLTMxLjQtNDUuOSAyMC4yIDU1LjUtNjIuNiA5LjEgNjIuNiA5LjEtMjQuMiA0Ny40IDM0LjUtMzYuMmMtMS44IDY4LjgtMi4yIDg1LjctMi4yIDg1LjdTNTkuMSAzODguNiAxNDQuOSAyMzAuMmMwIDAtMTA3LTExOC4xLTEwLjEtMTkwLjcgMCAwLTE2NS41IDk5LjktNjAuNSAyNzEuNSAwIDAtODYuOC04NC44LTQxLjQtMTcwLjUgMCAwLTc4LjcgMTExIDE3LjIgMjMzLjEgMCAwLTI2LjItMTYuMS00OS40LTc3LjcgMCAwIDE2LjkgMTgzLjMgMjIyIDE4NS43bDQuMSAwYzIwNS0yLjQgMjIyLTE4NS43IDIyMi0xODUuNy0yMy42IDYxLjUtNDkuOSA3Ny43LTQ5LjkgNzcuN3oiXQogICAgfTsKICAgIGZhUlByb2plY3QgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAici1wcm9qZWN0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY0ZjciLCAiTTU3OC41IDIyNi42QzU3OC41IDExOS4xIDQ0OC40IDMyIDI4OCAzMlMtMi41IDExOS4xLTIuNSAyMjYuNmMwIDk1LjggMTAzLjMgMTc1LjQgMjM5LjQgMTkxLjVsMCA2MS45IDk5LjEgMCAwLTYxLjVjMjQuMy0yLjcgNDcuNi03LjQgNjkuNC0xMy45bDQwLjEgNzUuNCAxMTIgMC02Ny40LTExMy43YzU0LjUtMzUuNCA4OC40LTg0LjkgODguNC0xMzkuN3pNMTExLjcgMjQxLjFjMC03My41IDk4LjktMTMzIDIyMC44LTEzM3MyMTEuOSA0MC43IDIxMS45IDEzM2MwIDUwLjEtMjYuNSA4NS03MC4zIDEwNi40LTIuNC0xLjYtNC43LTIuOS02LjQtMy43LTEwLjItNS4yLTI3LjgtMTAuNS0yNy44LTEwLjVzODYuNi02LjQgODYuNi05Mi43LTkwLjYtODcuOS05MC42LTg3LjlsLTE5OSAwIDAgMjA4LjNjLTc0LjEtMjEuNS0xMjUuMi02Ny4xLTEyNS4yLTExOS45em0yMjUuMSAzOC4zbDAtNTUuNmM1Ny44IDAgODcuOC02LjggODcuOCAyNy4zIDAgMzYuNS0zOC4yIDI4LjMtODcuOCAyOC4zem0tLjkgNzIuNWwyNi42IDBjMTAuOCAwIDE4LjkgMTEuNyAyNCAxOS4yLTE2LjEgMS45LTMzIDIuOC01MC42IDIuOWwwLTIyLjF6Il0KICAgIH07CiAgICBmYUluc3RhbG9kID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImluc3RhbG9kIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUwODEiLCAiTTE1My42IDQ4MGwyMzMuNyAwIDExNS40LTIwNC4yLTI5OC4zIDU3LjQtNTAuOCAxNDYuOHpNNTA1IDI0MC4xTDM4Ny40IDMyIDE1NS45IDMyIDM2MC41IDI2Ny45IDUwNSAyNDAuMXpNMTI0LjYgNDguOEw3LjUgMjU2IDEyMy41IDQ2MS4yIDIyNS45IDE2NS42IDEyNC42IDQ4Ljh6Il0KICAgIH07CiAgICBmYUNhbmFkaWFuTWFwbGVMZWFmID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNhbmFkaWFuLW1hcGxlLWxlYWYiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjc4NSIsICJNMzgzLjggMzUxLjdjMi41LTIuNSAxMDUuMi05Mi40IDEwNS4yLTkyLjRsLTE3LjUtNy41Yy0xMC00LjktNy40LTExLjUtNS0xNy40IDIuNC03LjYgMjAuMS02Ny4zIDIwLjEtNjcuM3MtNDcuNyAxMC01Ny43IDEyLjVjLTcuNSAyLjQtMTAtMi41LTEyLjUtNy41cy0xNS0zMi40LTE1LTMyLjQtNTIuNiA1OS45LTU1LjEgNjIuM2MtMTAgNy41LTIwLjEgMC0xNy42LTEwIDAtMTAgMjcuNi0xMjkuNiAyNy42LTEyOS42cy0zMC4xIDE3LjQtNDAuMSAyMi40Yy03LjUgNS0xMi42IDUtMTcuNi01LTUuMS03LjUtNDIuNy03OS44LTQyLjctNzkuOHMtMzcuNSA3Mi4zLTQyLjUgNzkuOGMtNSAxMC0xMCAxMC0xNy42IDUtMTAtNS00MC4xLTIyLjQtNDAuMS0yMi40UzE4My4zIDE4MiAxODMuMyAxOTJjMi41IDEwLTcuNSAxNy41LTE3LjYgMTAtMi41LTIuNS01NS4xLTYyLjMtNTUuMS02Mi4zcy0xMi41IDI3LjMtMTUgMzIuMy01IDkuOS0xMi41IDcuNUM3MyAxNzcgMjUuNCAxNjcgMjUuNCAxNjdTNDMgMjI2LjcgNDUuNSAyMzQuM2MyLjQgNiA1IDEyLjUtNSAxNy40TDIzIDI1OS4zczEwMi42IDg5LjkgMTA1LjIgOTIuNGM1LjEgNSAxMCA3LjUgNS4xIDIyLjUtNS4xIDE1LTEwLjEgMzUuMS0xMC4xIDM1LjFzOTUuMi0yMC4xIDEwNS4zLTIyLjZjOC43LS45IDE4LjMgMi41IDE4LjMgMTIuNVMyNDEgNTEyIDI0MSA1MTJsMzAgMHMtNS44LTEwMi43LTUuOC0xMTIuOCA5LjUtMTMuNCAxOC40LTEyLjVjMTAgMi41IDEwNS4yIDIyLjYgMTA1LjIgMjIuNnMtNS0yMC4xLTEwLTM1LjEgMC0xNy41IDUtMjIuNXoiXQogICAgfTsKICAgIGZhRXRoZXJldW0gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZXRoZXJldW0iLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZjQyZSIsICJNMzExLjkgMjYwLjhMMTYwIDM1My42IDggMjYwLjggMTYwIDAgMzExLjkgMjYwLjh6TTE2MCAzODMuNEw4IDI5MC42IDE2MCA1MTIgMzEyIDI5MC42IDE2MCAzODMuNHoiXQogICAgfTsKICAgIGZhSG91enogPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaG91enoiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjI3YyIsICJNMjc2IDMzMC43bC0xMDQuNiAwIDAgMTQ5LjMtMTU0LjMgMCAwLTQ0OCAxMDkuNSAwIDAgMTA0LjUgMzA1LjEgODUuNiAwIDI1Ny45LTE1NS43IDAgMC0xNDkuM3oiXQogICAgfTsKICAgIGZhVmliZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidmliZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjQwOSIsICJNNDQ0LjMgNDkuOWMtMTIuNy0xMS43LTY0LjEtNDktMTc4LjctNDkuNSAwIDAtMTM1LjEtOC4xLTIwMC45IDUyLjMtMzYuNiAzNi42LTQ5LjUgOTAuMy01MC45IDE1Ni44cy0zLjEgMTkxLjEgMTE3IDIyNC45bC4xIDAtLjEgNTEuNnMtLjggMjAuOSAxMyAyNS4xYzE2LjYgNS4yIDI2LjQtMTAuNyA0Mi4zLTI3LjggOC43LTkuNCAyMC43LTIzLjIgMjkuOC0zMy43IDgyLjIgNi45IDE0NS4zLTguOSAxNTIuNS0xMS4yIDE2LjYtNS40IDExMC41LTE3LjQgMTI1LjctMTQyIDE1LjgtMTI4LjYtNy42LTIwOS44LTQ5LjgtMjQ2LjV6TTQ1OC4yIDI4N2MtMTIuOSAxMDQtODkgMTEwLjYtMTAzIDExNS4xLTYgMS45LTYxLjUgMTUuNy0xMzEuMiAxMS4yIDAgMC01MiA2Mi43LTY4LjIgNzktNS4zIDUuMy0xMS4xIDQuOC0xMS01LjcgMC02LjkgLjQtODUuNyAuNC04NS43bDAgMEM0My40IDM3Mi43IDQ5LjQgMjY2LjYgNTAuNSAyMTEuMXMxMS42LTEwMSA0Mi42LTEzMS42YzU1LjctNTAuNSAxNzAuNC00MyAxNzAuNC00MyA5Ni45IC40IDE0My4zIDI5LjYgMTU0LjEgMzkuNCAzNS43IDMwLjYgNTMuOSAxMDMuOCA0MC42IDIxMS4xem0tMTM5LTgwLjhjLjQgOC42LTEyLjUgOS4yLTEyLjkgLjYtMS4xLTIyLTExLjQtMzIuNy0zMi42LTMzLjktOC42LS41LTcuOC0xMy40IC43LTEyLjkgMjcuOSAxLjUgNDMuNCAxNy41IDQ0LjggNDYuMnptMjAuMyAxMS4zYzEtNDIuNC0yNS41LTc1LjYtNzUuOC03OS4zLTguNS0uNi03LjYtMTMuNSAuOS0xMi45IDU4IDQuMiA4OC45IDQ0LjEgODcuOCA5Mi41LS4xIDguNi0xMy4xIDguMi0xMi45LS4zem00NyAxMy40Yy4xIDguNi0xMi45IDguNy0xMi45IC4xLS42LTgxLjUtNTQuOS0xMjUuOS0xMjAuOC0xMjYuNC04LjUtLjEtOC41LTEyLjkgMC0xMi45IDczLjcgLjUgMTMzIDUxLjQgMTMzLjcgMTM5LjJ6TTM3NS4yIDMyOWwwIC4yYy0xMC44IDE5LTMxIDQwLTUxLjggMzMuM2wtLjItLjNjLTIxLjEtNS45LTcwLjgtMzEuNS0xMDIuMi01Ni41LTE2LjItMTIuOC0zMS0yNy45LTQyLjQtNDIuNC0xMC4zLTEyLjktMjAuNy0yOC4yLTMwLjgtNDYuNi0yMS4zLTM4LjUtMjYtNTUuNy0yNi01NS43LTYuNy0yMC44IDE0LjItNDEgMzMuMy01MS44bC4yIDBjOS4yLTQuOCAxOC0zLjIgMjMuOSAzLjkgMCAwIDEyLjQgMTQuOCAxNy43IDIyLjEgNSA2LjggMTEuNyAxNy43IDE1LjIgMjMuOCA2LjEgMTAuOSAyLjMgMjItMy43IDI2LjZsLTEyIDkuNmMtNi4xIDQuOS01LjMgMTQtNS4zIDE0czE3LjggNjcuMyA4NC4zIDg0LjNjMCAwIDkuMSAuOCAxNC01LjNsOS42LTEyYzQuNi02IDE1LjctOS44IDI2LjYtMy43IDE0LjcgOC4zIDMzLjQgMjEuMiA0NS44IDMyLjkgNyA1LjcgOC42IDE0LjQgMy44IDIzLjZ6Il0KICAgIH07CiAgICBmYUtpY2tzdGFydGVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImtpY2tzdGFydGVyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInNxdWFyZS1raWNrc3RhcnRlciJdLCAiZjNiYiIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnpNMzIwLjggMjMzbC0yMy4zIDIzLjEgMjMuMyAyMi45YzI0LjEgMjMuOSAyNC4xIDYzIDAgODYuOXMtNjMuNCAyMy45LTg3LjYgMGwtOC41LTguNGMtMTEuMyAxNi0yOS43IDI2LjUtNTAuOSAyNi41LTM0LjEgMC02MS45LTI3LjUtNjEuOS02MS40bDAtMTMzLjJjMC0zMy44IDI3LjctNjEuNCA2MS45LTYxLjQgMjEuMSAwIDM5LjYgMTAuNSA1MC45IDI2LjVsOC41LTguNGMyNC4xLTIzLjkgNjMuNC0yMy45IDg3LjYgMHMyNC4xIDYzIDAgODYuOXoiXQogICAgfTsKICAgIGZhU3F1YXJlS2lja3N0YXJ0ZXIgPSBmYUtpY2tzdGFydGVyOwogICAgZmFTcG90aWZ5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNwb3RpZnkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjFiYyIsICJNMjU2IDhhMjQ4IDI0OCAwIDEgMCAwIDQ5NiAyNDggMjQ4IDAgMSAwIDAtNDk2ek0zNTYuNyAzNzIuOWMtNC4yIDAtNi44LTEuMy0xMC43LTMuNi02Mi40LTM3LjYtMTM1LTM5LjItMjA2LjctMjQuNS0zLjkgMS05IDIuNi0xMS45IDIuNi05LjcgMC0xNS44LTcuNy0xNS44LTE1LjggMC0xMC4zIDYuMS0xNS4yIDEzLjYtMTYuOCA4MS45LTE4LjEgMTY1LjYtMTYuNSAyMzcgMjYuMiA2LjEgMy45IDkuNyA3LjQgOS43IDE2LjVzLTcuMSAxNS40LTE1LjIgMTUuNHptMjYuOS02NS42Yy01LjIgMC04LjctMi4zLTEyLjMtNC4yLTYyLjUtMzctMTU1LjctNTEuOS0yMzguNi0yOS40LTQuOCAxLjMtNy40IDIuNi0xMS45IDIuNi0xMC43IDAtMTkuNC04LjctMTkuNC0xOS40czUuMi0xNy44IDE1LjUtMjAuN2MyNy44LTcuOCA1Ni4yLTEzLjYgOTcuOC0xMy42IDY0LjkgMCAxMjcuNiAxNi4xIDE3NyA0NS41IDguMSA0LjggMTEuMyAxMSAxMS4zIDE5LjctLjEgMTAuOC04LjUgMTkuNS0xOS40IDE5LjV6bTMxLTc2LjJjLTUuMiAwLTguNC0xLjMtMTIuOS0zLjktNzEuMi00Mi41LTE5OC41LTUyLjctMjgwLjktMjkuNy0zLjYgMS04LjEgMi42LTEyLjkgMi42LTEzLjIgMC0yMy4zLTEwLjMtMjMuMy0yMy42IDAtMTMuNiA4LjQtMjEuMyAxNy40LTIzLjkgMzUuMi0xMC4zIDc0LjYtMTUuMiAxMTcuNS0xNS4yIDczIDAgMTQ5LjUgMTUuMiAyMDUuNCA0Ny44IDcuOCA0LjUgMTIuOSAxMC43IDEyLjkgMjIuNiAwIDEzLjYtMTEgMjMuMy0yMy4yIDIzLjN6Il0KICAgIH07CiAgICBmYUxlYW5wdWIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibGVhbnB1YiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMjEyIiwgIk0zODYuNiAxMTEuNWwxNS4xIDI0OS0xMS0uM2MtMzYuMi0uOC03MS42IDguOC0xMDIuNyAyOC0zMS0xOS4yLTY2LjQtMjgtMTAyLjctMjgtNDUuNiAwLTgyLjEgMTAuNy0xMjMuNSAyNy43TDkzLjIgMTI5LjZjMjguNS0xMS44IDYxLjUtMTguMSA5Mi4yLTE4LjEgNDEuMiAwIDczLjggMTMuMiAxMDIuNyA0Mi41IDI3LjctMjguMyA1OS00MS43IDk4LjUtNDIuNXpNNTY5LjIgNDQ4Yy0yNS41IDAtNDcuNS01LjItNzAuNS0xNS42LTM0LjMtMTUuNi03MC0yNS0xMDcuOS0yNS0zOSAwLTc0LjkgMTIuOS0xMDIuNyA0MC42LTI3LjctMjcuNy02My43LTQwLjYtMTAyLjctNDAuNi0zNy45IDAtNzMuNiA5LjMtMTA3LjkgMjUtMjIuMiA5LjktNDQuNyAxNS42LTY5LjIgMTUuNkw3IDQ0OCA0OS42IDk4LjljMzkuMy0yMi4yIDg3LTM0LjkgMTMyLjMtMzQuOSAzNy4xIDAgNzUuMiA3LjcgMTA2LjIgMjkuMSAzMS0yMS40IDY5LjItMjkuMSAxMDYuMi0yOS4xIDQ1LjMgMCA5MyAxMi42IDEzMi4zIDM0LjlMNTY5LjIgNDQ4em0tNDMuNC00NC43TDQ5MS44IDEyM2MtMzAuNy0xNC02Ny4yLTIxLjQtMTAxLTIxLjQtMzguNCAwLTc0LjQgMTIuMS0xMDIuNyAzOC43LTI4LjMtMjYuNi02NC4yLTM4LjctMTAyLjctMzguNy0zMy44IDAtNzAuMyA3LjQtMTAxIDIxLjRsLTM0IDI4MC4yYzQ3LjItMTkuNSA4Mi45LTMzLjUgMTM1LTMzLjUgMzcuNiAwIDcwLjggOS42IDEwMi43IDI5LjYgMzEuOC0yMCA2NS4xLTI5LjYgMTAyLjctMjkuNiA1Mi4yIDAgODcuOCAxNCAxMzUgMzMuNXoiXQogICAgfTsKICAgIGZhSmF2YSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJqYXZhIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY0ZTQiLCAiTTI3Ny44IDMxMi45YzkuOC02LjcgMjMuNC0xMi41IDIzLjQtMTIuNXMtMzguNyA3LTc3LjIgMTAuMmMtNDcuMSAzLjktOTcuNyA0LjctMTIzLjEgMS4zLTYwLjEtOCAzMy0zMC4xIDMzLTMwLjFzLTM2LjEtMi40LTgwLjYgMTljLTUyLjUgMjUuNCAxMzAgMzcgMjI0LjUgMTIuMXptLTg1LjQtMzIuMWMtMTktNDIuNy04My4xLTgwLjIgMC0xNDUuOCAxMDMuNy04MS44IDUwLjUtMTM1IDUwLjUtMTM1IDIxLjUgODQuNS03NS42IDExMC4xLTExMC43IDE2Mi42LTIzLjkgMzUuOSAxMS43IDc0LjQgNjAuMiAxMTguMnpNMzA3IDEwNC42Yy4xIDAtMTc1LjIgNDMuOC05MS41IDE0MC4yIDI0LjcgMjguNC02LjUgNTQtNi41IDU0czYyLjctMzIuNCAzMy45LTcyLjlDMjE2IDE4OC4xIDE5NS40IDE2OS4zIDMwNyAxMDQuNnptLTYuMSAyNzAuNWMtLjUgMS0xLjIgMS44LTIgMi42IDEyOC4zLTMzLjcgODEuMS0xMTguOSAxOS44LTk3LjMtMy4zIDEuMi02LjIgMy40LTguMiA2LjMgMy42LTEuMyA3LjMtMi4zIDExLTMgMzEtNi41IDc1LjUgNDEuNS0yMC42IDkxLjR6TTM0OCA0MzcuNHMxNC41IDExLjktMTUuOSAyMS4yYy01Ny45IDE3LjUtMjQwLjggMjIuOC0yOTEuNiAuNy0xOC4zLTcuOSAxNi0xOSAyNi44LTIxLjMgMTEuMi0yLjQgMTcuNy0yIDE3LjctMi0yMC4zLTE0LjMtMTMxLjMgMjguMS01Ni40IDQwLjIgMjA0LjIgMzMuMiAzNzIuNC0xNC45IDMxOS40LTM4Ljh6TTEyNC41IDM5NmMtNzguNyAyMiA0Ny45IDY3LjQgMTQ4LjEgMjQuNS05LjgtMy44LTE5LjItOC40LTI4LjItMTMuOC00NC43IDguNS02NS40IDkuMS0xMDYgNC41LTMzLjUtMy44LTEzLjktMTUuMi0xMy45LTE1LjJ6bTE3OS44IDk3LjJjLTc4LjcgMTQuOC0xNzUuOCAxMy4xLTIzMy4zIDMuNiAwLS4xIDExLjggOS43IDcyLjQgMTMuNiA5Mi4yIDUuOSAyMzMuOC0zLjMgMjM3LjEtNDYuOSAwIDAtNi40IDE2LjUtNzYuMiAyOS43ek0yNjAuNyAzNTNjLTU5LjIgMTEuNC05My41IDExLjEtMTM2LjggNi42LTMzLjUtMy41LTExLjYtMTkuNy0xMS42LTE5LjctODYuOCAyOC44IDQ4LjIgNjEuNCAxNjkuNSAyNS45LTcuOC0yLjgtMTUtNy4xLTIxLjEtMTIuOHoiXQogICAgfTsKICAgIGZhTmZjU3ltYm9sID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm5mYy1zeW1ib2wiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTUzMSIsICJNMzYwLjkgMzIuNGM3LjctMS4zIDE1LjcgLjUgMjEuMiA1IDg0LjEgNTguNyAxMjkuOSAxMzYuMyAxMjkuOSAyMTcuNyAwIDgzLjEtNDUuOCAxNjAuOC0xMjkuOSAyMTkuNS00LjggNC0xMS43IDUuOS0xOC42IDUuMy03LS42LTEzLjUtMy42LTE4LjQtOC41TDE2MS43IDI4OC43Yy01LjYtNS41LTguNy0xMy05LjYtMjAuOSAwLTcuOCA0LTE1LjMgOS41LTIwLjkgNS42LTUuNSAxMy4xLTguNyAyMC45LTguNyA3LjkgMCAxNS40IDMuMSAyMC45IDguNkwzNjguNSA0MTEuMmM1NC42LTQ0LjcgODQuMy05OS4yIDg0LjMtMTU2LjEgMC02MS42LTM2LjktMTIyLjItMTAzLjktMTY5LjMtNi40LTQuNS0xMC44LTExLjQtMTIuMS0xOS4xLTEuNC03LjcgLjQtMTUuNyA1LTIyLjEgNC41LTYuNCAxMS40LTEwLjggMTkuMS0xMi4xem0tMjA2IDQ0Ny4yYy03LjcgMS4zLTE1LjYtLjUtMjIuMS01LTgzLjEtNTguNy0xMjktMTM2LjQtMTI5LTIxOS41IDAtODEuNCA0NS44LTE1OSAxMjktMjE3LjcgNS43LTQgMTIuNi01LjkgMTkuNi01LjMgNi45IC42IDEzLjQgMy42IDE4LjMgOC41TDM1NC4xIDIyMy4zYzUuNiA1LjUgOC43IDEzIDguNyAyMC45IC4xIDYuOS0zIDE1LjMtOC42IDIwLjktNS41IDUuNS0xMyA4LjctMjAuOSA4LjctNy44IDAtMTYuMi0zLjEtMjAuOS04LjZMMTQ3LjMgMTAwLjdjLTU0LjYgNDUuMi04NC4zIDk5LjItODQuMyAxNTQuNCAwIDYzLjQgMzYuOSAxMjQgMTAzLjEgMTcxLjEgNy4zIDQuNiAxMS42IDExLjQgMTMgMTkuMiAxLjMgNy43LS41IDE1LjctNSAyMi4xcy0xMS40IDEwLjctMTkuMiAxMi4xeiJdCiAgICB9OwogICAgZmFXb2R1ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIndvZHUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTA4OCIsICJNMTc4LjQgMzM5LjdsLTM3LjMgMC0yOC45LTExNi4yLS41IDAtMjguNSAxMTYuMi0zOCAwLTQ1LjItMTcwLjggMzcuNSAwIDI3IDExNi4yIC41IDAgMjkuNy0xMTYuMiAzNS4yIDAgMjkuMiAxMTcuNyAuNSAwIDI4LTExNy43IDM2LjggMC00NS45IDE3MC44em05My0xMjdjMzkgMCA2NC4xIDI1LjggNjQuMSA2NS4zIDAgMzkuMi0yNS4xIDY1LTY0LjEgNjUtMzguNyAwLTYzLjktMjUuOC02My45LTY1IDAtMzkuNSAyNS4xLTY1LjMgNjMuOS02NS4zem0wIDEwNC44YzIzLjIgMCAzMC4xLTE5LjkgMzAuMS0zOS41IDAtMTkuOS02LjktMzkuNy0zMC4xLTM5LjctMjcuNyAwLTI5LjkgMTkuOS0yOS45IDM5LjcgMCAxOS42IDYuOSAzOS41IDI5LjkgMzkuNXptMTYzLjcgNi41bC0uNSAwYy03LjkgMTMuNC0yMS44IDE5LjEtMzcuNSAxOS4xLTM3LjMgMC01NS41LTMyLTU1LjUtNjYuMiAwLTMzLjIgMTguNC02NC4xIDU0LjgtNjQuMSAxNC42IDAgMjguOSA2LjIgMzYuOCAxOC40bC4yIDAgMC02Mi4yIDM0IDAgMCAxNzAuOC0zMi4zIDAgMC0xNS44em0tMjkuNy04NS42Yy0yMi4yIDAtMjkuOSAxOS4xLTI5LjkgMzkuNSAwIDE5LjQgOC44IDM5LjcgMjkuOSAzOS43IDIyLjUgMCAyOS4yLTE5LjYgMjkuMi0zOS45IDAtMjAuMS03LjItMzkuMi0yOS4yLTM5LjJ6TTU5MyAzMzkuN2wtMzIuMyAwIDAtMTcuMi0uNyAwYy04LjYgMTMuOS0yMy40IDIwLjYtMzcuOCAyMC42LTM2LjEgMC00NS4yLTIwLjMtNDUuMi01MC45bDAtNzYuMSAzNCAwIDAgNjkuOGMwIDIwLjMgNiAzMC40IDIxLjggMzAuNCAxOC40IDAgMjYuMy0xMC4zIDI2LjMtMzUuNGwwLTY0LjggMzQgMCAwIDEyMy42em05LjUtMzYuOGwzNy41IDAgMCAzNi44LTM3LjUgMCAwLTM2Ljh6Il0KICAgIH07CiAgICBmYVNxdWFyZVN0ZWFtID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1zdGVhbSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJzdGVhbS1zcXVhcmUiXSwgImYxYjciLCAiTTE2NS42IDMwOS4xYzE4LjYgNy43IDI3LjMgMjguOSAxOS42IDQ3LjRzLTI5IDI3LjItNDcuNiAxOS40bC0yOC41LTExLjhjNSAxMC42IDEzLjggMTkuNCAyNS40IDI0LjIgMjUuMiAxMC41IDU0LjEtMS40IDY0LjYtMjYuNSA1LjEtMTIuMSA1LjEtMjUuNSAuMS0zNy43LTUuMS0xMi4xLTE0LjUtMjEuNi0yNi43LTI2LjctMTIuMS01LTI1LTQuOC0zNi40LS41bDI5LjUgMTIuMnpNNDQ4IDk2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZsMCAxNDQuNyAxMTYuNiA0OC4xYzEyLTguMiAyNi4yLTEyLjEgNDAuNy0xMS4zbDU1LjQtODAuMiAwLTEuMWMwLTQ4LjIgMzkuMy04Ny41IDg3LjYtODcuNXM4Ny42IDM5LjMgODcuNiA4Ny41YzAgNDkuMi00MC45IDg4LjctODkuNiA4Ny41bC03OSA1Ni4zYzEuNiAzOC41LTI5LjEgNjguOC02NS43IDY4LjgtMzEuOCAwLTU4LjUtMjIuNy02NC41LTUyLjdMMCAzMTkuMiAwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMHpNMjQxLjkgMTk2LjJhNTguNCA1OC40IDAgMSAwIDExNi44IDAgNTguNCA1OC40IDAgMSAwIC0xMTYuOCAwem0xMDIuNC0uMWE0My45IDQzLjkgMCAxIDEgLTg3LjggMCA0My45IDQzLjkgMCAxIDEgODcuOCAweiJdCiAgICB9OwogICAgZmFTdGVhbVNxdWFyZSA9IGZhU3F1YXJlU3RlYW07CiAgICBmYUNyZWF0aXZlQ29tbW9uc05jRXUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY3JlYXRpdmUtY29tbW9ucy1uYy1ldSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNGU5IiwgIk0yNTUuNyA4QzExMS42IDggOCAxMjQuOCA4IDI1NiA4IDM5Mi4zIDExOS43IDUwNCAyNTUuNyA1MDQgMzg1LjkgNTA0IDUwNCA0MDMuMSA1MDQgMjU2IDUwNCAxMTcgMzk2LjQgOCAyNTUuNyA4em0uNiA0NTAuN2MtMTEyIDAtMjAzLjYtOTIuNS0yMDMuNi0yMDIuNyAwLTIzLjIgMy43LTQ1LjIgMTAuOS02Nmw2NS43IDI5LjEtNC43IDAgMCAyOS41IDIzLjMgMGMwIDYuMi0uNCAzLjItLjQgMTkuNWwtMjIuOCAwIDAgMjkuNSAyNyAwYzExLjQgNjcgNjcuMiAxMDEuMyAxMjQuNiAxMDEuMyAyNi42IDAgNTAuNi03LjkgNjQuOC0xNS44bC0xMC00Ni4xYy04LjcgNC42LTI4LjIgMTAuOC00Ny4zIDEwLjgtMjguMiAwLTU4LjEtMTAuOS02Ny4zLTUwLjJsOTAuMyAwIDEyOC4zIDU2LjhjLTEuNSAyLjEtNTYuMiAxMDQuMy0xNzguOCAxMDQuM3pNMjM5LjYgMjY4LjFsLS41LS40IC45IC40LS40IDB6bTc3LjItMTkuNWwzLjcgMCAwLTI5LjUtNzAuMyAwLTI4LjYtMTIuNmMyLjUtNS41IDUuNC0xMC41IDguOC0xNC4zIDEyLjktMTUuOCAzMS4xLTIyLjQgNTEuMS0yMi40IDE4LjMgMCAzNS4zIDUuNCA0Ni4xIDEwbDExLjYtNDcuM2MtMTUtNi42LTM3LTEyLjQtNjIuMy0xMi40LTM5IDAtNzIuMiAxNS44LTk1LjkgNDIuMy01LjMgNi4xLTkuOCAxMi45LTEzLjkgMjAuMUw4NS41IDE0Ni40YzY0LjYtOTYuOCAxNTcuNy05My42IDE3MC43LTkzLjYgMTEzIDAgMjAzIDkwLjIgMjAzIDIwMy40IDAgMTguNy0yLjEgMzYuMy02LjMgNTIuOUwzMTYuOCAyNDguNnoiXQogICAgfTsKICAgIGZhTnBtID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm5wbSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmM2Q0IiwgIk0yODggMjg4bC0zMiAwIDAtNjQgMzIgMCAwIDY0ek01NzYgMTYwbDAgMTkyLTI4OCAwIDAgMzItMTI4IDAgMC0zMi0xNjAgMCAwLTE5MiA1NzYgMHpNMTYwIDE5MmwtMTI4IDAgMCAxMjggNjQgMCAwLTk2IDMyIDAgMCA5NiAzMiAwIDAtMTI4em0xNjAgMGwtMTI4IDAgMCAxNjAgNjQgMCAwLTMyIDY0IDAgMC0xMjh6bTIyNCAwbC0xOTIgMCAwIDEyOCA2NCAwIDAtOTYgMzIgMCAwIDk2IDMyIDAgMC05NiAzMiAwIDAgOTYgMzIgMCAwLTEyOHoiXQogICAgfTsKICAgIGZhQ2xvdWRzY2FsZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjbG91ZHNjYWxlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzODMiLCAiTTMxOC4xIDE1NGwtOS40IDcuNmMtMjIuNS0xOS4zLTUxLjUtMzMuNi04My4zLTMzLjYtNzEuNiAwLTEyOS40IDYwLjgtMTI5LjQgMTMyLjMgMCA2LjYgLjQgMTMuMSAxLjQgMTkuNC0yLTU2IDQxLjgtOTcuNCA5Mi42LTk3LjQgMjQuMiAwIDQ2LjIgOS40IDYyLjYgMjQuN2wtMjUuMiAyMC40Yy04LjMtLjktMTYuOCAxLjgtMjMuMSA4LjEtMTEuMSAxMS0xMS4xIDI4LjkgMCA0MCAxMS4xIDExIDI4LjkgMTEgNDAgMCA2LjMtNi4zIDktMTQuOSA4LjEtMjMuMWw3NS4yLTg4LjhjNi4zLTYuNS0zLjMtMTUuOS05LjUtOS42ek0yMTMuNyAyNDYuNWExNCAxNCAwIDEgMSAyMC42IDE5IDE0IDE0IDAgMSAxIC0yMC42LTE5ek0yMjQgMzJhMjI0IDIyNCAwIDEgMCAwIDQ0OCAyMjQgMjI0IDAgMSAwIDAtNDQ4em0wIDY0YTE2MCAxNjAgMCAxIDEgMCAzMjAgMTYwIDE2MCAwIDEgMSAwLTMyMHoiXQogICAgfTsKICAgIGZhVGhlbWVjbyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ0aGVtZWNvIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY1YzYiLCAiTTIwMi45IDguNGM5LjktNS43IDI2LTUuOCAzNi0uMkw0MzAgMTE1LjljMTAgNS42IDE4IDE5LjQgMTggMzAuOUw0NDggMzY0YzAgMTEuNC04LjEgMjUuMy0xOCAzMUwyMzguOCA1MDMuN2MtOS45IDUuNy0yNiA1LjYtMzUuOC0uMkwxNy45IDM5NS4xQzggMzg5LjMgMCAzNzUuNCAwIDM2NEwwIDE0Ni43YzAtMTEuNCA4LTI1LjQgMTcuOS0zMS4xTDIwMi45IDguNHpNMTI1LjUgMjA4LjNjLTE1LjkgMC0zMS45IC4xLTQ3LjggLjFsMCAxMDEuNCAxOS4xIDAgMC0yOS44IDI4LjcgMGM0OS43IDAgNDkuNi03MS43IDAtNzEuN3pNMjY1LjYgMzA4LjZsLTMwLjctMzQuNmMzNy03LjUgMzQuOC02NS4yLTEwLjktNjUuNS0xNi4xIDAtMzIuMi0uMS00OC4zLS4xbDAgMTAxLjYgMTkuMSAwIDAtMzMuOSAxOC40IDAgMjkuNiAzMy45IDIyLjggMCAwLTEuM3ptLTQxLjYtODIuM2MyMy4zIDAgMjMuMyAzMi41IDAgMzIuNWwtMjkuMSAwIDAtMzIuNSAyOS4xIDB6bS05NS42LTEuNmMyMS4yIDAgMjEuMSAzOC45IDAgMzguOWwtMzIuMyAwIDAtMzguOCAzMi4zIDB6bTE5Mi42LTE4LjJjLTY4LjUgMC03MSAxMDUuOCAwIDEwNS44IDY5LjUgMCA2OS40LTEwNS44IDAtMTA1Ljh6bTAgMTcuNGM0NC4xIDAgNDQuOCA3MC45IDAgNzAuOXMtNDQuNC03MC45IDAtNzAuOXoiXQogICAgfTsKICAgIGZhR29vZ2xlUGxheSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnb29nbGUtcGxheSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmM2FiIiwgIk0yOTMuNiAyMzQuM0w3Mi45IDEzIDM1My43IDE3NC4yIDI5My42IDIzNC4zek0xNS4zIDBDMi4zIDYuOC02LjQgMTkuMi02LjQgMzUuM2wwIDQ0MS4zYzAgMTYuMSA4LjcgMjguNSAyMS43IDM1LjNMMjcxLjkgMjU1LjkgMTUuMyAwek00NDAuNSAyMjUuNmwtNTguOS0zNC4xLTY1LjcgNjQuNSA2NS43IDY0LjUgNjAuMS0zNC4xYzE4LTE0LjMgMTgtNDYuNS0xLjItNjAuOHpNNzIuOSA0OTlMMzUzLjcgMzM3LjggMjkzLjYgMjc3LjcgNzIuOSA0OTl6Il0KICAgIH07CiAgICBmYUtvcnZ1ZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJrb3J2dWUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjQyZiIsICJNMzg3LjYgMzRsLTMyNyAwQzI3LjkgMzQgMS4xIDYwLjggMS4xIDkzLjVsMCAzMjcuMWMwIDMyLjYgMjYuOCA1OS40IDU5LjUgNTkuNGwzMjcuMSAwYzMzIDAgNTkuNS0yNi44IDU5LjUtNTkuNWwwLTMyN0M0NDcuMSA2MC44IDQyMC4zIDM0IDM4Ny42IDM0ek04OC4yIDEyMC44bDk2IDAgMCAxMTYgNjEuOC0xMTYgMTEwLjkgMC04MS4yIDEzMi0xODcuNSAwIDAtMTMyek0yNTAgMzkyLjlsLTY1LjctMTEzLjYgMCAxMTMuNi05NiAwIDAtMTMwLjggMTkxLjUgMCA4OC42IDEzMC44LTExOC40IDB6Il0KICAgIH07CiAgICBmYVczYyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ3M2MiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTdkZSIsICJNMTA1LjIgMzA1LjNsMzAuOS0xMDQuN2M3LjktMjYuNyA4LjYtNDAuNiAuMi02OC44bC0xMC4xLTMzLjkgNDQuMSAwIDYxIDIwNy40IDQ1LjctMTU1LjVjMTMuMy00NS4zIDIxLjEtNTEuOSA1OS40LTUxLjlsMTMyLjggMGMtMjQuMiA0Mi45LTQ5LjMgODUuMi03My45IDEyNy45IDIuNiAuOCA1LjIgMS44IDcuNyAyLjggMTcuMyA3LjEgMzIuMiAxOS40IDQyIDM1LjUgMTEuMiAxOC41IDE2LjggNDAuMiAxNi44IDY1LjIgMCAzMC44LTguMiA1Ni44LTI0LjYgNzcuOC0xNC41IDE4LjYtMzUgMjkuNS01OC4yIDMxLjIgMCAuMy01LjIgLjQtNS44IC40LTM5LjctLjEtNzAuOC0zMi4xLTgzLjEtNjguN2w0Mi45IDBjMy41IDUuMyA2LjggMTAuNyAxMS4yIDE1LjUgOC4xIDcuMyAxOC41IDEwLjkgMjkuMyAxMS4xIDEzLjEgMCAyMy4zLTkuMSAyOS45LTE5LjggOC4xLTEzLjIgMTIuMi0yOSAxMi4yLTQ3LjUgMC0xMy4xLTEuOC0yNC4zLTUuMy0zMy42LS45LTIuMy0xLjktNC41LTMtNi42LTEuNC0yLjYtMi45LTUuMS00LjctNy40LTEwLjEtMTMuMi0yOS4zLTE5LjctNDcuNS0xOS44bC0yOC4yIDAgNzAuMy0xMjItMzUuNiAwYy00My4xIDAtMzUuOS01LjQtNTAuNCA0My4zbC03NS43IDI1NS4zLTQuMiAwLTYzLjEtMjExLjEtNjMuMSAyMTEuMS00LjIgMC0xMDEtMzQwLjcgNDQuMiAwIDYxIDIwNy40ek00NjcgMzM1LjdjLjMgLjYgMTEuMyAyMC4zIDE4LjMgMzAuMyA3LjEgMTAuMSAxOS44IDIwLjkgMjQuOCAyNC42czE5LjEgMTIuNSAzNC4zIDEzLjljMTUuMiAxLjUgMjMuMyAuMiAzOC43LTYuNiAxNS40LTYuOCAyNy45LTIwLjQgMzQuOS0yOC4xIDYuOS03LjYgMTcuOS0yNy4zIDE4LjItMjcuN2wzLjMgMTYuOGMxLjcgOS0xIDIzLjctNC4xIDMwLTQuMyA4LjYtNy42IDEzLjUtMTQgMjAuMy02LjEgNi41LTE2LjcgMTMuNS0yMS4zIDE2LjQtNC42IDIuOS0yMy4xIDE1LjEtNTAuMSAxMC4zcy00NC43LTI1LjktNTMuOS0zOC4yYy05LjgtMTMuMi0xNi43LTI4LjMtMTktMzMuMi0zLjgtOC40LTkuOS0yOC4yLTEwLjEtMjguOHptMTY5LjctMjE4YzMuMyAyMC4zLS4xIDI4LjctOS4xIDQ2bC0xMi43IDI0LjJjLS4zLS42LTEwLTIwLjctMjUuOS0zMS45LTEzLjYtOS42LTIyLjUtMTEuNy0zNi4zLTguOC0xNy44IDMuNy0zOCAyNS00Ni44IDUxLjItMTAuNSAzMS40LTEwLjcgNDYuNi0xMSA2MC42LS42IDIyLjQgMi45IDM1LjYgMi45IDM1LjZzLTE1LjQtMjguNS0xNS4yLTcwLjFjLjEtMjkuNyA0LjgtNTYuNyAxOC41LTgzLjMgMTIuMS0yMy40IDMwLjEtMzcuNCA0Ni4xLTM5LjEgMTYuNS0xLjcgMjkuNiA2LjMgMzkuNyAxNC45IDEwLjYgOSAyMS4zIDI4LjggMjEuMyAyOC44bDI0LjktNDkuOCAzLjYgMjEuOHoiXQogICAgfTsKICAgIGZhR3JhdiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJncmF2IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyZDYiLCAiTTMwMi42IDIxMC42YzQuNSA0LjUgNC41IDEyLjMgMCAxNi44bC0xMCAxMGMtNC41IDQuOS0xMi4zIDQuOS0xNy4xIDBsLTEwLjgtMTAuOGMtNC41LTQuOS00LjUtMTIuMyAwLTE3LjFsMTAtMTBjNC41LTQuNSAxMi4zLTQuNSAxNy4xIDBsMTAuOCAxMS4xem0tMzEuMi0yMC4zYTcuNyA3LjcgMCAxIDAgLTEwLjYtMTEgNy43IDcuNyAwIDEgMCAxMC42IDExem0tMjYuOCA1LjVhNy41IDcuNSAwIDEgMCAxMC43IDEwLjUgNy41IDcuNSAwIDEgMCAtMTAuNy0xMC41ek0zMTkuNCAxODJjLTIwLjUtMTQuOS0zNC45LTQ0LjYtMTIuMy03MC4zIDIyLjMtMjUuNyA0Mi0xNy44IDYxLjcgLjggMTIuMyAxMS43IDMwLjIgMjUuNyAxNy44IDQ5LjgtMTIuOSAyNC4zLTQ2LjYgMzQuMy02Ny4yIDE5Ljd6bTQ5LjItNDUuOWMtOS4yLTEwLjMtMjQuMSA3LjEtMTYgMTYuNiA3LjYgOS4zIDMzLjEgMi41IDE2LTE2LjZ6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTQ0My43IDQ0YzIuNi0xNi42LTIwLjktMTcuMS0yNi0yNi41LTE0LTI0LjktMjguNi0zOC01Ni4zLTMxLjQgMTItOC4zIDI0LjMtNi4zIDI0LjMtNi4zIC4zLTYuNiAwLTEzLjQtOS43LTI1LjcgNC0xMi45IC4zLTIzLjEgLjMtMjMuMSAxNi04LjkgMjcuNy0yNS4yIDMwLTQ0LjYgMy43LTMyLTE5LjQtNjEuMS01MS40LTY0LjgtMjIuOC0yLjYtNDUuMSA3LjktNTYuMSAyNi41LTIzLjkgNDEuNCAxLjQgNzMuMiAyMy4xIDg0LTE0LjktMS40LTM1LjQtMTIuMy00MS40LTM1LjQtNi44LTI2LjUgMi45LTUxLjQgOS4yLTYzLjQgMCAwLTQuNS02LTguMy05LjIgMCAwLTE0LjIgMC0yNS40IDUuNSAxMi4zLTE1LjcgMjYtMTQuOSAyNi0xNC45IDAtNi42LS42LTE1LjQtMy43LTIyLjMtNS42LTExLjQtMjQuNi0xMy4zLTMyLjcgMi45IC4xLS4yIC4zLS40IC40LS41LTUuMiAxMi4zLTEuMSA1Ny43IDE3LjQgOTAtMi42IDEuNC05LjQgNi4zLTEzLjQgMTAuMy0yMi4zIDEwLTU4IDYyLjItNTggNjIuMi0yOS4xIDExLjEtNzkuNyA1Mi41LTcyLjkgODIuMyAuMyAzLjEgMS40IDUuNyAzLjEgNy43LTIuOSAyLjMtNS43IDUuMi04LjYgOC42LTEyLjMgMTQuMi01LjUgMzYuMyAxOC4zIDI1LjIgMTYuMy03LjQgMzAuNi0yMC45IDM3LjUtMzEuNCAwIDAtNS43LTUuMi0xNi44LTQuNSAyOC42LTYuOCAzNS40LTkuNyA0Ny43LTkuNCA4LjMgNCA4LjMtMzUuNCA4LjMtMzUuNCAwLTE1LjItMi4zLTMyLTExLjUtNDIuOCAxMi45IDEyLjYgMzAgMzMuOCAyOC45IDYyLjYtLjggMTguOS0xNS43IDIzLjctMTUuNyAyMy43LTkuNCAxNy4xLTQ0LjYgNjgtMzEuNCAxMDkuNCAwIDAtMTAtMTUuNC0xMC41LTIyLjgtMTggMjAtNDggNTQtMjUuNCA2Ni42IDI3LjUgMTUuMiAxMTIuMy05MS41IDEzMC4zLTE0Ni45IDM1LjctMjEuNSA1Ny4yLTQ4LjggNjYtNjcuMSAyMi43IDQ0LjkgOTguNCA5Ny41IDEwNC40IDYwLjl6Il0KICAgIH07CiAgICBmYUF3cyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhd3MiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjM3NSIsICJNMTgwLjQgMjAzYy0uNyAyMi42IDEwLjYgMzIuNyAxMC45IDM5LS4xIDEuMy0uNiAyLjUtMS4zIDMuNnMtMS43IDItMi44IDIuNmwtMTIuOCA5Yy0xLjcgMS4yLTMuNiAxLjgtNS42IDEuOS0uNCAwLTguMiAxLjgtMjAuNS0yNS42LTcuNSA5LjQtMTcgMTYuOS0yNy45IDIycy0yMi43IDcuNy0zNC43IDcuNWMtMTYuMyAuOS02MC40LTkuMi01OC4xLTU2LjItMS42LTM4LjMgMzQuMS02Mi4xIDcwLjktNjAgNy4xIDAgMjEuNiAuNCA0NyA2LjNsMC0xNS42YzIuNy0yNi41LTE0LjctNDctNDQuOC00My45LTIuNCAwLTE5LjQtLjUtNDUuOCAxMC4xLTcuNCAzLjQtOC4zIDIuOC0xMC44IDIuOC03LjQgMC00LjQtMjEuNS0yLjktMjQuMiA1LjItNi40IDM1LjktMTguNCA2NS45LTE4LjIgMjAuMS0xLjggNDAuMSA0LjQgNTUuNyAxNy4zIDYuMyA3LjEgMTEuMiAxNS40IDE0LjIgMjQuNHM0LjIgMTguNSAzLjUgMjhsMCA2OS4zek05NCAyMzUuNGMzMi40LS41IDQ2LjItMjAgNDkuMy0zMC41IDIuNS0xMC4xIDIuMS0xNi40IDIuMS0yNy40LTkuNy0yLjMtMjMuNi00LjktMzkuNi00LjktMTUuMi0xLjEtNDIuOCA1LjYtNDEuNyAzMi4zLTEuMiAxNi44IDExLjEgMzEuNCAzMCAzMC41em0xNzAuOSAyMy4xYy03LjkgLjctMTEuNS00LjktMTIuNy0xMC40TDIwMi40IDgzLjRjLTEtMi44LTEuNi01LjYtMS45LTguNi0uMi0xLjIgLjEtMi40IC44LTMuNHMxLjgtMS42IDMtMS44Yy4yIDAtMi4xIDAgMjIuMiAwIDguOC0uOSAxMS42IDYgMTIuNiAxMC40TDI3NC45IDIyMC44IDMwOC4xIDgwYy41LTMuMiAyLjktMTEuMSAxMi44LTEwLjJsMTcuMiAwYzIuMi0uMiAxMS4xLS41IDEyLjcgMTAuNEwzODQuMSAyMjIuNyA0MjEgODAuMWMuNS0yLjIgMi43LTExLjQgMTIuNy0xMC40bDE5LjcgMGMuOS0uMSA2LjItLjggNS4zIDguNi0uNCAxLjggMy40LTEwLjctNTIuOCAxNjkuOS0xLjEgNS41LTQuOCAxMS4xLTEyLjcgMTAuNGwtMTguNyAwYy0xMC45IDEuMi0xMi41LTkuNy0xMi43LTEwLjdsLTMzLjItMTM3LjEtMzIuOCAxMzdjLS4yIDEuMS0xLjcgMTEuOS0xMi43IDEwLjdsLTE4LjMgMCAwIDB6bTI3My41IDUuNmMtNS45IDAtMzMuOS0uMy01Ny40LTEyLjMtMi4zLTEtNC4zLTIuNi01LjctNC44cy0yLjEtNC42LTIuMS03LjFsMC0xMC43YzAtOC41IDYuMi02LjkgOC44LTUuOSAxMCA0LjEgMTYuNSA3LjEgMjguOCA5LjYgMzYuNyA3LjUgNTIuOC0yLjMgNTYuNy00LjUgMTMuMi03LjggMTQuMi0yNS43IDUuMy0zNC45LTEwLjUtOC44LTE1LjUtOS4xLTUzLjEtMjEtNC42LTEuMy00My43LTEzLjYtNDMuOC01Mi40LS42LTI4LjIgMjUtNTYuMiA2OS41LTU2IDEyLjcgMCA0Ni40IDQuMSA1NS42IDE1LjYgMS40IDIuMSAyIDQuNiAxLjkgN2wwIDEwLjFjMCA0LjQtMS42IDYuNy00LjkgNi43LTcuNy0uOS0yMS40LTExLjItNDkuMi0xMC44LTYuOS0uNC0zOS45IC45LTM4LjQgMjUtLjQgMTkgMjYuNiAyNi4xIDI5LjcgMjYuOSAzNi41IDExIDQ4LjYgMTIuOCA2My4xIDI5LjYgMTcuMSAyMi4yIDcuOSA0OC4zIDQuMyA1NS40LTE5LjEgMzcuNS02OC40IDM0LjQtNjkuMyAzNC40em00MC4yIDEwNC45Yy03MCA1MS43LTE3MS43IDc5LjItMjU4LjUgNzkuMi0xMTcuMSAuOC0yMzAuMy00Mi4zLTMxNy4zLTEyMC43LTYuNS01LjktLjgtMTQgNy4yLTkuNSA5Ni41IDU1LjIgMjA1LjcgODQuMiAzMTYuOSA4NC4xIDgzLS40IDE2NS4xLTE3LjMgMjQxLjYtNDkuNSAxMS44LTUgMjEuOCA3LjggMTAuMSAxNi40em0yOS4yLTMzLjNjLTktMTEuNS01OS4zLTUuNC04MS44LTIuNy02LjggLjgtNy45LTUuMS0xLjgtOS41IDQwLjEtMjguMiAxMDUuOS0yMC4xIDExMy40LTEwLjYgNy41IDkuNS0yLjEgNzUuNC0zOS42IDEwNi45LTUuOCA0LjktMTEuMyAyLjMtOC43LTQuMSA4LjQtMjEuMyAyNy40LTY4LjUgMTguNC04MHoiXQogICAgfTsKICAgIGZhR2xpZGVHID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdsaWRlLWciLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjJhNiIsICJNNDA3LjEgMjExLjJjLTMuNS0xLjQtMTEuNi0zLjgtMTUuNC0zLjgtMzcuMSAwLTYyLjIgMTYuOC05My41IDM0LjVsLS45LS45YzctNDcuMyAyMy41LTkxLjkgMjMuNS0xNDAuNCAwLTcxLjUtMzguMi0xMDAuNi0xMDguNC0xMDAuNi0xMTUuMSAwLTE3My40IDExMy43LTE3My40IDE5OC40IDAgODcuOSA1MS4zIDEzNi42IDEzOC42IDEzNi42IDEyIDAgMTEtMSAxMSAzLjgtMTYuOSAxMjguOS05MC44IDEzMy4xLTkwLjggOTQuNiAwLTM5LjIgNDUtNTguNiA0NS41LTYxLS4zLTEyLjItNDctMjcuNi01OC45LTI3LjYtMzMuOSAuMS01Mi40IDUxLjItNTIuNCA3OS4zIDAgNTEuOSAzMi44IDg3LjkgODUuNSA4Ny45IDc3LjQgMCAxMzQtNzcuOCAxNTEuNC0xNDUuNCAxNS4xLTYwLjUgMTEuMi02My4zIDE5LjctNjcuNiAzMi4yLTE2LjIgNTcuNS0yNyA5My44LTI3IDE3LjggMCAzMC41IDMuNyA1OC45IDguNCAyLjkgMCA2LjctMi45IDYuNy01LjggMC04LTMzLjQtNjAuNS00MC45LTYzLjR6TTIzMS44IDEyNi44Yy05LjMgNDQuNy0xOC42IDg5LjYtMjcuOCAxMzQuMy0yLjMgMTAuMi0xMy4zIDcuOC0yMiA3LjgtMzguMyAwLTQ5LTQxLjgtNDktNzMuMSAwLTQ3IDE4LTEwOS4zIDYxLjgtMTMzLjQgNy00LjEgMTQuOC02LjcgMjIuNi02LjcgMTguNiAwIDIwIDEzLjMgMjAgMjguNy0uMSAxNC4zLTIuNyAyOC41LTUuNiA0Mi40eiJdCiAgICB9OwogICAgZmFKc2ZpZGRsZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJqc2ZpZGRsZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMWNjIiwgIk01MTEuMSAyMzcuNWMtNC43LTIuNi01LjctNS43LTYuNC0xMC44LTIuNC0xNi41LTMuNS0zMy42LTkuMS00OS4xLTM1LjktMTAwLTE1NC0xNDMuNC0yNDYuOC05MS42LTI3LjQgMTUuMi00OSAzNi40LTY1LjUgNjMuOS0zLjItMS41LTUuNS0yLjctNy44LTMuNy0zMC4xLTEyLjQtNTktMTAuMS04NS4zIDkuMi0yNS41IDE4LjctMzYuNCA0NC41LTMyLjcgNzYuNCAuNCAzLTIgNy42LTQuNSA5LjUtMzkuNyAzMC01NiA3OC4xLTQxLjkgMTI0LjYgMTMuOCA0NS42IDU3LjUgNzkuOCAxMDUuNiA4MS40IDMwLjMgMSA2MC42IC41IDkxIC41IDg0IDAgMTY4LjEgLjUgMjUyLjEtLjUgNTIuNy0uNiA5Ni4xLTM2LjkgMTA4LjItODcuMyAxMS41LTQ4LjEtMTEuMS05Ny4zLTU2LjgtMTIyLjZ6bTIxLjEgMTU2LjljLTE4LjIgMjIuNC00Mi4zIDM1LjMtNzEuMyAzNS43LTU2LjkgLjgtMTEzLjggLjItMTcwLjcgLjIgMCAuNy0xNjMgLjItMTYzLjcgLjItNDMuOS0uMy03Ni43LTE5LjgtOTUuMi02MC0xOC45LTQxLjItNC05MC44IDM0LjItMTE2LjEgOS4yLTYuMSAxMi41LTExLjYgMTAuMS0yMy4xLTUuNS0yNi40IDQuNS00OCAyNi40LTYzIDIzLTE1LjcgNDcuNC0xNi4xIDcyLTMuMSAxMC4zIDUuNCAxNC42IDExLjYgMjIuMi0yLjUgMTQuMi0yNi40IDM0LjYtNDYuNyA2MC43LTYxLjMgOTcuNS01NC40IDIyOC40IDcuNiAyMzAuMiAxMzIuNyAuMSA4LjIgMi40IDEyLjQgOS44IDE1LjkgNTcuNiAyNi44IDc0LjUgOTYuMSAzNS4xIDE0NC41em0tODcuOC04MC41Yy01LjggMzEuMi0zNC42IDU1LjEtNjYuNyA1NS4xLTE3IDAtMzIuMS02LjUtNDQuMS0xNy43LTI3LjctMjUuNy03MS4xLTc1LTk1LjktOTMuNC0yMC4xLTE0LjktNDItMTIuMy02MC4zIDMuOC01MCA0NC4xIDE1LjkgMTIxLjggNjcuMSA3Ny4yIDQuNS00IDcuOC05LjUgMTIuNy0xMi44IDguMi01LjUgMjAuOC0uOSAxMy4yIDEwLjYtMTcuNCAyNi4zLTQ5LjMgMzguMi03OC45IDI5LjMtMjguOS04LjctNDguOC0zNi00OC42LTcwLjIgMS4yLTIyLjUgMTIuNC00My4xIDM1LjQtNTYgMjIuNi0xMi42IDQ2LjQtMTMuMSA2NyAyLjUgNTAuOCAzOC41IDc1LjYgODEuNyAxMDcuMyAxMDEuMiAyNC42IDE1LjEgNTQuMyA3LjQgNjguOC0xNy41IDI4LjgtNDkuMi0zNC42LTEwNS03OC45LTYzLjUtNCAzLjctNi45IDguOS0xMS40IDExLjctMTEgNi44LTE3LjMtNC4xLTEyLjgtMTAuNCAyMC43LTI4LjYgNTAuNS00MC40IDgzLjMtMjguMiAzMS40IDExLjcgNDkuMSA0NC40IDQyLjggNzguMnoiXQogICAgfTsKICAgIGZhS2V5YmFzZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJrZXliYXNlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY0ZjUiLCAiTTI4Ni4yIDQxOWExOCAxOCAwIDEgMCAwIDM2IDE4IDE4IDAgMSAwIDAtMzZ6TTM5OC4xIDI3MS40Yy05LjUtMTQuNi0zOS40LTUyLjQtODcuMy03My43LTYuMS0yLjctMTIuMi01LjEtMTguNC03LjMgNC4xLTkuOSA2LTIwLjYgNS44LTMxLjRzLTIuNy0yMS4zLTcuMi0zMS4xLTEwLjktMTguNS0xOC45LTI1LjctMTcuNC0xMi42LTI3LjYtMTZjLTEyLjQtNC4xLTIzLjMtNi0zMi40LTUuOC0uNi0yLTEuOS0xMSA5LjQtMzVsLTIyLjktMTMuNS01LjUgNy42Yy04LjcgMTIuMS0xNi45IDIzLjYtMjQuMyAzNC45LTIuNy0uNi01LjUtMS4xLTguMy0xLjItNDEuNS0yLjQtMzktMi4zLTQxLjEtMi4zLTUwLjYgMC01MC44IDUyLjEtNTAuOCA0NS45bC0yLjQgMzYuN2MtMS42IDI3IDE5LjggNTAuMiA0Ny42IDUxLjhsOC45IC41QzEwNiAyMTUuNSA5MC40IDIyNy41IDc2LjYgMjQxLjQgMTQgMzA0LjcgMTQgMzc0IDE0IDQyOS44bDAgMzMuNiAyMy4zLTI5LjhjMy4xIDEzLjEgOCAyNS44IDE0LjYgMzcuNiA1LjggMTAuMSAxNC45IDkuNCAxOS42IDcuMyA0LjItMS45IDEwLTYuOSAzLjgtMjAuMS04LTE2LjgtMTMuMy0zNC43LTE1LjgtNTMuMWw0Ni44LTU5LjgtMjQuNyA3NC4xYzU4LjItNDIuNCAxNTcuNC02MS44IDIzNi4yLTM4LjYgMzQuMiAxMC4xIDY3LjQgLjcgODQuNy0yMy44IC43LTEgMS4yLTIuMiAxLjgtMy4yIDEuOCA5LjQgMi43IDE4LjkgMi44IDI4LjQgMCAyMy4zLTMuNyA1Mi45LTE0LjkgODEuNi0yLjUgNi41IDEuOCAxNC41IDguNiAxNS43IDcuNCAxLjYgMTUuMy0zLjEgMTguNC0xMS4xIDkuNi0yNS41IDE0LjYtNTQuNiAxNC42LTg2LjIgMC0zOC42LTEzLTc3LjUtMzUuOS0xMTAuOXpNMTQyLjQgMTI4LjZsLTE1LjctLjktMS40IDIxLjggMTMuMSAuOGMtLjYgNi41LS41IDEzLjEgLjMgMTkuNmwtMjIuNC0xLjNjLTEuNi0uMS0zLjItLjUtNC43LTEuMXMtMi44LTEuNi0zLjktMi44LTEuOS0yLjYtMi41LTQuMS0uOC0zLjEtLjctNC43TDEwNyAxMTljMS0xMi4yIDEzLjktMTEuMyAxMy4zLTExLjNsMjkuMSAxLjdjLTIuOCA2LjItNS4xIDEyLjYtNyAxOS4yek0yOTAuOCAzMDAuOGMtMi4xIDEuNi00LjggMi40LTcuNSAyLjJzLTUuMS0xLjUtNi45LTMuNWwtOS43LTExLjUtMzQuNCAyN2MtMS42IDEuMy0zLjcgMS45LTUuOCAxLjdzLTQtMS4yLTUuMy0yLjhsLTE1LjgtMTguNmMtMS4yLTEuNi0xLjctMy41LTEuNS01LjRzMS4zLTMuNyAyLjgtNC45bDM0LjYtMjcuMi0xNC4xLTE2LjctMTcuMSAxMy41Yy0xLjYgMS4yLTMuNSAxLjgtNS41IDEuNnMtMy44LTEuMS01LjEtMi42YzAgMC0zLjctNC40LTMuOC00LjUtMS4yLTEuNi0xLjctMy41LTEuNS01LjVzMS4zLTMuNyAyLjgtNC45TDIxNCAyMjUuMnMtMTguNS0yMi0xOC42LTIyLjFjLS44LTEtMS4zLTIuMS0xLjctMy4zcy0uNC0yLjUtLjMtMy43IC42LTIuNCAxLjItMy41IDEuNS0yIDIuNS0yLjhjMi4xLTEuNyA0LjgtMi40IDcuNC0yLjJzNS4xIDEuNSA2LjkgMy42bDgxLjEgOTYuM2MuOCAxIDEuMyAyLjEgMS43IDMuM3MuNCAyLjUgLjMgMy43LS42IDIuNS0xLjIgMy41LTEuNSAyLjEtMi41IDIuOHpNMTg3LjQgNDE5YTE4IDE4IDAgMSAwIDAgMzYgMTggMTggMCAxIDAgMC0zNnoiXQogICAgfTsKICAgIGZhTHVtb25Ecm9wID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImx1bW9uLWRyb3AiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTdlMyIsICJNNDgwIDMyYzUzIDAgOTYgNDMgOTYgOTZsMCAyMjRjMCA1My00MyA5Ni05NiA5Nkw5NiA0NDhjLTUzIDAtOTYtNDMtOTYtOTZMMCAxMjhDMCA3NSA0MyAzMiA5NiAzMmwzODQgMHpNMzAyLjQgMTE0LjdjLTkuOC0xNi40LTIwLjUtMTYuNC0yOS42IDBsLTY4LjkgMTE0Yy0xMC43IDE1LjYtMTYuNCAzMi44LTE2LjQgNTIuNSAwIDUwLjkgNDQuMyA5NC4zIDEwMC4xIDk0LjMgNTUgMCAxMDAuOS00My41IDEwMC45LTk0LjMgMC0xOS43LTYuNi0zNy44LTE3LjItNTIuNWwtNjguOS0xMTR6Il0KICAgIH07CiAgICBmYUZvcmdlam8gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZm9yZ2VqbyIsCiAgICAgIGljb246IFszMjAsIDUxMiwgW10sICJlODYwIiwgIk0yNjEuNSAxLjJjMzQgMCA2MS42IDI3LjYgNjEuNiA2MS42cy0yNy42IDYxLjYtNjEuNiA2MS42Yy0yMyAwLTQzLjEtMTIuNy01My43LTMxLjRsLTI4LjUgMGMtMjQgMC00NyA5LjUtNjQgMjYuNXMtMjYuNSA0MC0yNi41IDY0bDAgNDMuNWMyNi0xOS41IDU3LjctMzAuMiA5MC42LTMwLjJsMjguNSAwYzEwLjYtMTguNyAzMC42LTMxLjQgNTMuNy0zMS40IDM0IDAgNjEuNiAyNy42IDYxLjYgNjEuNnMtMjcuNiA2MS42LTYxLjYgNjEuNmMtMjMgMC00My4xLTEyLjctNTMuNy0zMS40bC0yOC41IDBjLTI0IDAtNDcgOS41LTY0IDI2LjVzLTI2LjUgNDAtMjYuNSA2NGwwIDQ3LjhjMTguNyAxMC42IDMxLjQgMzAuNiAzMS40IDUzLjYgMCAzNC0yNy42IDYxLjYtNjEuNiA2MS42Uy0zIDQ4My4yLTMgNDQ5LjJjMC0yMyAxMi43LTQzLjEgMzEuNC01My42bDAtMjEyYzAtNDAgMTUuOS03OC40IDQ0LjItMTA2LjdzNjYuNy00NC4yIDEwNi43LTQ0LjJsMjguNSAwYzEwLjYtMTguNyAzMC42LTMxLjQgNTMuNy0zMS40ek01OC42IDQyMy45Yy0xNCAwLTI1LjMgMTEuMy0yNS4zIDI1LjNzMTEuMyAyNS40IDI1LjMgMjUuNCAyNS40LTExLjQgMjUuNC0yNS40LTExLjQtMjUuMy0yNS40LTI1LjN6TTI2MS41IDIwMS43YTI1LjQgMjUuNCAwIDEgMCAwIDUwLjcgMjUuNCAyNS40IDAgMSAwIDAtNTAuN3ptMC0xNjQuMmEyNS40IDI1LjQgMCAxIDAgMCA1MC43IDI1LjQgMjUuNCAwIDEgMCAwLTUwLjd6Il0KICAgIH07CiAgICBmYVBvc3RncmVzcWwgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicG9zdGdyZXNxbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlODU4IiwgIk0yMTkuOCAxNzEuM2MzLjkgLjUgMTMuMSAyLjcgMTIuMyA4LjUtLjggNS45LTkuMiA5LjEtMTQuMiA4LjQtNC43LS43LTEzLjItNi4xLTEyLjMtMTIuMWwuMy0yLjFjNC4yIDAgOC4zLTMuNSAxMy45LTIuN3ptMTY4LjEtMy40YzEwLjggMi42LTEuMSAxMy41LTYuOCAxNC4zLTQuMyAuNi0xMi4xLTIuMi0xMi44LTcuNC0xLTcuNCAxNS43LTcuOSAxOS43LTYuOXptLTIyLTE0MC44YzM1LjctLjMgODEuMyA5LjQgMTE0LjMgNTEuNyA3LjIgOS4yIDEwIDI0IDkuNyA0MC45LS44IDQ5LjYtMjYgMTI5LjQtNzAuNyAxOTcuNCA0LjUgMi45IDE3LjYgNy40IDUxLjEgLjUgNS42LTEuMiAxMi43LTIuMiAxNy42IDEuNiAxOC4yIDEzLjktMTkuNiAzNS4xLTI4LjQgMzkuMi0xMy4yIDYuMi0zNC44IDkuNS01MS4yIDguNy0yLjEtLjItNC4zLS4yLTYuMy0uNi01LjEtMS4xLTcuNC0xLTguMy0uNy0xLjEgLjMtMS40IDIuOS0xLjYgMy44LTIuOCAyNC45LTcuNyA2NC43LTEwLjcgODItMi44IDE2LjMtNy43IDI5LjMtMTcuMiAzOS4yLTkuNSA5LjktMjIuOCAxNS43LTQwLjYgMTkuNS0yMi4zIDQuOC0zNy45LS4xLTQ4LjctOS4xLTEwLjMtOC43LTE1LjItMjAuNC0xOC0yNy40LTEuOC00LjUtMy0xMS41LTQtMTkuOC0yLjMtMTkuOC0zLjMtNTAuNC0zLTgzLjMtMjQuNiAyMi4xLTU1IDE3LjItNjguMiAxMy45LTEwLjUtMi42LTMzLTE2LjEtMTcuNS0yOC43IDExLjktOS43IDMwLjMtNS41IDQyLjItMTUgMi40LTEuOSAxMS40LTEwLjYgMTEuNC0xMy41LTEwLS4zLTE5LjYtMi45LTI4LjEtNy41LTEzLjUgMTQuNS0yNi40IDI5LjUtMzkuMyA0NC42LTguMyA5LjktMTcuNCAxNS44LTI3LjQgMTYuMi05LjkgLjQtMTguNy00LjYtMjYuMS0xMS44LTcuMy03LjEtMTQuMS0xNy4yLTIwLjQtMjktMTktMzUuNS0zMy4yLTg2LjEtNDIuMy0xMjYuNC02LTI2LjctOS42LTQ5LjEtMTAuMS01OS0yLjItNDQuMyA4LTc0LjEgMjYtOTMuMiAxNy45LTE5IDQyLjQtMjYgNjYuMS0yNy40IDM1LjYtMiA3MSA4LjUgODYuNiAxMy44bDUgMS44YzE1LjktMTAuOCAzNi4xLTE3LjQgNjEuNy0xNyAxMy4yIC4yIDI1LjUgMi4yIDM2LjcgNC4yIDE4LjYtNy4xIDM5LjgtOS41IDU5LjQtOS43em0tOTYgMjAuNWMtMjQuNy0uNC00Mi45IDYuNS01Ni42IDE2LjgtLjggLjYtMS44IDEtMi44IDEuMi0xNC40IDExLjgtMjMuOSAyOC0zMC4zIDQ0LjgtNy4yIDE5LjEtMTAgMzguNS0xMS4xIDUxLjUgNy42LTQuMyAxNy45LTguNyAyOC43LTExLjIgMTAuNS0yLjQgMjIuNC0zLjIgMzIuNyAuOCAxMC45IDQuMiAxOSAxMy4zIDIyLjIgMjguMSA3LjUgMzQuNyA2LjcgNTguMiAyLjcgNzUuOS00LjggMjEtMTYuOCAzOS41LTIxLjkgNjAuNCAzLjUtLjkgNy4xLS42IDkuOCAuMWw3LjIgMi45YzcuNyA0LjQgMTIuOCAxMyAxNCAyMS43IDIgNiAuMSAxNC4zIDAgMjAuNiA2LjcgMTYuMyA3LjIgMzYuMSA2LjcgNTMuMy0uNyAyNS0xIDQwLjIgMy4yIDUxLjcgMi45IDcuOSA0LjcgMTYuNCAxMC40IDIyLjggMi42IDMgNi4xIDUuNSAxMC45IDYuOCAxOC41IDUuMSA0NC00LjcgNTYuNi0xOC4yIDcuNy04LjIgMTIuMy0xOS4zIDEzLjQtMzMuOSAxLjEtMTMuNiA0LjItMjcuNiA2LjMtNDEuMWwyLjktOC44YzEuNy0xNC44IDMuNC0yOS42IDUtNDQuNC0uNC05LjEgLjktMTYuMSAzLjktMjEuNSAzLjEtNS43IDcuNi04LjkgMTEuOC0xMC44IDEuOC0uOCAzLjktMS4yIDUuNi0yLTEuNi0yLjQtMy42LTQuNi01LjMtNi44LTguMi0xMC40LTEzLjMtMjIuMy0xOS43LTMzLjgtOC41LTE1LjItMjMuOC00Mi4yLTMwLjEtNjcuNS00LjEtMTYuNC00LjktMzQuNSA2LTQ3IDkuOC0xMS4yIDI2LjktMTUuNSA1MS45LTEzLTMuNC0xMC0xMS40LTI3LjUtMjQuOC00NC43LTE4LTIzLTQ1LjctNDUuOS04NS43LTUzLjEtNy4zLS45LTE1LjItMS41LTIzLjYtMS43em0tMzIuMiAyODJjLTggLjctMTUuNSAxOC4yLTIxLjcgMjMuMS02LjIgNC45LTE0LjUgNy42LTMwIDEwLjctNC41IC45LTcuNyAxLjktOS43IDIuOCAyMi4zIDE1LjggNTguMyAzLjIgNzIuNi0xNi44IDEuNy0yLjQgMi4xLTYgLjUtMTAuMi0xLjctNC41LTYuNC0xMC4xLTExLjktOS42ek0xMTcuNiA0OS4yYy0yMS42IDEuMi00MiA3LjUtNTYuNCAyMi44LTE0LjQgMTUuMi0yNC4yIDQwLjYtMjIuMSA4Mi41IC40IDguNSAzLjggMzAgOS44IDU2LjYgOC45IDM5LjggMjMuNyA5MC4zIDQwLjYgMTIyLjIgNiAxMS4xIDE3LjQgMzMgMzIuOCAzMi4zIDQuNC0uMiAxMC4xLTIuOCAxNy0xMSAxMi42LTE0LjggMjUuMi0yOS41IDM4LjUtNDMuNy0xNy45LTE1LjQtMjguNS00MC4zLTI0LjgtNjcuMiAzLjQtMjQuMyAuNS00OC4yIDEuMi03Mi41IC40LTExLjkgMi4zLTM4LjcgMTIuNi02NS44IDUuOS0xNS41IDE0LjUtMzEuMyAyNy40LTQ0LjItMTYuNC01LjQtNDcuMS0xMy41LTc2LjYtMTEuOXpNNDA1LjEgMzI4LjljLTMuOCAxLjEtNi43IDIuMi04LjcgNS44LTEuMyAyLjQtMi41IDYuNy0yLjIgMTQuMiA0LjggMy45IDE0LjEgMy4zIDE5LjggMy4yIDEzLjktLjIgMjkuOS0zLjEgMzkuMy03LjUgNy45LTMuNyAxNC43LTguMyAxOS0xMi4yLTM4LjIgNy43LTU1LjQgMi4xLTYzLjItNC44LTEuMyAuNC0yLjkgLjktMy45IDEuMnpNMjI1LjMgMTY0LjljLTE1LjQtNS45LTM1LjQgMS44LTQ4LjkgOS40LTMuNiAyLTYuNSA0LTcuOSA1LjIgLjQgOC44IDIuOCAzNi4xLTEuNCA2Ni4zLTUuMSAzNi42IDIxLjcgNjYuNiA1Mi41IDY2LjcgNS4xLTIwLjggMTctMzkuMiAyMS44LTYwLjEgMy41LTE1LjMgNC41LTM2LjYtMi43LTY5LjctMi4zLTEwLjUtNy40LTE1LjQtMTMuNC0xNy43ek0zNzAuMSA0Mi4yYy0xNS4yLS4yLTI4LjggMS43LTM5LjIgMy44IDI2IDExLjggNDUuNiAyOS43IDU5LjYgNDcuNiAxNy40IDIyLjIgMjYuMyA0NC4xIDI5IDU1IC43IDIuNyAxLjMgNS43IC41IDguNCAuNiAxOC45LTQgMzEuMy00LjYgNDkuMi0uNCAxMi45IDIuOSAyOC4xIDMuNyA0NC43IC44IDE1LjctMSAzMi41LTExLjIgNDkuNSAuOCAxIDEuNiAyLjEgMi40IDMuMSAyNi44LTQyLjIgNDYtODguNiA1Ni4zLTEyOC41IDUuNS0yMS40IDguNC00MC43IDguNy01Ni4xIC4yLTE1LjItMi0yNS40LTUuOC0zMC40LTI4LjMtMzYuMS02Ni44LTQ1LjgtOTkuMy00Ni4yem0zNS42IDExOS41Yy0yNS4zLTMuMi0zNy4zIDEuNS00Mi44IDcuNy02IDYuOC02LjggMTguNS0yLjkgMzQuMSA1LjcgMjIuNiAyMC4xIDQ4LjYgMjguNyA2NCAzLjYgNi40IDYuNCAxMy4xIDEwIDE5LjQgNS41LTExLjcgNi42LTIzLjUgNi0zNS41LS43LTE1LTQuMi0zMC4zLTMuNy00NS44bC40LTcuNGMxLjItMTQuMyA0LjEtMjQuNiA0LjItMzYuNXoiXQogICAgfTsKICAgIGZhV2VlYmx5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIndlZWJseSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNWNjIiwgIk00MjUuMSA2NS44Yy0zOS45IDAtNzMuMyAyNS43LTgzLjcgNjQuMy0xOC4yLTU4LjEtNjUuNS02NC4zLTg1LTY0LjMtMTkuOCAwLTY2LjggNi4zLTg1LjMgNjQuMy0xMC40LTM4LjYtNDMuNC02NC4zLTgzLjctNjQuMy00OSAwLTg3LjUgMzMuOS04Ny41IDc3LjIgMCAyOSA0LjIgMzMuMyA3Ny4yIDIzMy41IDIyLjQgNjAuNiA2Ny44IDY5LjQgOTIuNyA2OS40IDM5LjIgMCA3MC0xOS41IDg1LjktNTQgMTUuOSAzNC44IDQ2LjcgNTQuMyA4NS45IDU0LjMgMjUgMCA3MC40LTkuMSA5Mi43LTY5LjcgNzYuNi0yMDguNiA3Ny41LTIwNS42IDc3LjUtMjI3LjIgLjYtNDguMy0zNi04My41LTg2LjktODMuNXptMjYuMyAxMTQuOEwzODUuOSAzNTcuMWMtNy45IDIxLjUtMjEuMiAzNy4yLTQ2LjIgMzcuMi0yMy40IDAtMzcuNC0xMi40LTQ0LTMzLjlsLTM5LjMtMTE3LjQtMSAwLTM5LjMgMTE3LjRjLTcgMjEuNS0yMC45IDMzLjYtNDQgMzMuNi0yNSAwLTM4LjMtMTUuNy00Ni4yLTM3LjJMNjAuOSAxODEuNmMtNS40LTE0LjgtNy45LTIzLjktNy45LTM0LjUgMC0xNi4zIDE1LjgtMjkuNCAzOC4zLTI5LjQgMTguNyAwIDMyIDExLjggMzYuMSAyOS4xbDQ0IDEzOS44IDEgMCA0NC43LTEzNi44YzYtMTkuNyAxNi41LTMyLjEgMzktMzIuMXMzMi45IDEyLjEgMzkgMzIuMWw0NC43IDEzNi44IDEgMCA0NC0xMzkuOGM0LjEtMTcuMiAxNy40LTI5LjEgMzYuMS0yOS4xIDIyLjIgMCAzOC4zIDEzLjMgMzguMyAzNS43LS4zIDcuOS00LjEgMTYtNy42IDI3LjJ6Il0KICAgIH07CiAgICBmYURvY2tlciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJkb2NrZXIiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjM5NSIsICJNMzQ5LjkgMjM2LjNsLTY2LjEgMCAwLTU5LjQgNjYuMSAwIDAgNTkuNHptMC0yMDQuM2wtNjYuMSAwIDAgNjAuNyA2Ni4xIDAgMC02MC43em03OC4yIDE0NC44bC02Ni4xIDAgMCA1OS40IDY2LjEgMCAwLTU5LjR6TTI3MS44IDEwNC43bC02Ni4xIDAgMCA2MC4xIDY2LjEgMCAwLTYwLjF6bTc4LjEgMGwtNjYuMSAwIDAgNjAuMSA2Ni4xIDAgMC02MC4xem0yNzYuOCAxMDBjLTE0LjQtOS43LTQ3LjYtMTMuMi03My4xLTguNC0zLjMtMjQtMTYuNy00NC45LTQxLjEtNjMuN2wtMTQtOS4zLTkuMyAxNGMtMTguNCAyNy44LTIzLjQgNzMuNi0zLjcgMTAzLjgtOC43IDQuNy0yNS44IDExLjEtNDguNCAxMC43bC00MzQuNyAwYy04LjcgNTAuOCA1LjggMTE2LjggNDQgMTYyLjEgMzcuMSA0My45IDkyLjcgNjYuMiAxNjUuNCA2Ni4yIDE1Ny40IDAgMjczLjktNzIuNSAzMjguNC0yMDQuMiAyMS40IC40IDY3LjYgLjEgOTEuMy00NS4yIDEuNS0yLjUgNi42LTEzLjIgOC41LTE3LjFsLTEzLjMtOC45ek0xMTUuNiAxNzYuOGwtNjYgMCAwIDU5LjQgNjYuMSAwIDAtNTkuNC0uMSAwem03OC4xIDBsLTY2LjEgMCAwIDU5LjQgNjYuMSAwIDAtNTkuNHptNzguMSAwbC02Ni4xIDAgMCA1OS40IDY2LjEgMCAwLTU5LjR6bS03OC4xLTcyLjFsLTY2LjEgMCAwIDYwLjEgNjYuMSAwIDAtNjAuMXoiXQogICAgfTsKICAgIGZhTWFnZW50byA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJtYWdlbnRvIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzYzQiLCAiTTQ0NS45IDEyNy45bDAgMjU2LjEtNjMuNCAzNi41IDAtMjU1LjgtMTU4LjUtOTEuNi0xNTguNiA5MS42IC40IDI1NS45LTYzLjMtMzYuNiAwLTI1NS45IDIyMS45LTEyOC4xIDIyMS41IDEyNy45ek0yNTUuOCA0MjAuNWwtMzEuNiAxOC40LTMxLjgtMTguMiAwLTI1Ni02My4zIDM2LjYgLjEgMjU1LjkgOTQuOSA1NC45IDk1LjEtNTQuOSAwLTI1Ni02My40LTM2LjYgMCAyNTUuOXoiXQogICAgfTsKICAgIGZhVG9yQnJvd3NlciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ0b3ItYnJvd3NlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlODM4IiwgIk0yNTYuNSA0NjUuNGwwLTMxYzk4LjMtLjMgMTc3LjktODAgMTc3LjktMTc4LjRTMzU0LjggNzcuOSAyNTYuNSA3Ny42bDAtMzFDMzcyIDQ2LjggNDY1LjQgMTQwLjUgNDY1LjQgMjU2UzM3MiA0NjUuMiAyNTYuNSA0NjUuNHptMC0xMDguNmM1NS40LS4zIDEwMC4zLTQ1LjMgMTAwLjMtMTAwLjhTMzEyIDE1NS41IDI1Ni41IDE1NS4ybDAtMzFjNzIuNiAuMyAxMzEuNCA1OS4yIDEzMS40IDEzMS44UzMyOS4xIDM4Ny42IDI1Ni41IDM4Ny44bDAtMzF6bTAtMTU1LjFjMjkuNyAuMyA1My44IDI0LjUgNTMuOCA1NC4zcy0yNCA1NC01My44IDU0LjNsMC0xMDguNnpNMCAyNTZhMjU2IDI1NiAwIDEgMCA1MTIgMCAyNTYgMjU2IDAgMSAwIC01MTIgMHoiXQogICAgfTsKICAgIGZhR2l0QWx0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdpdC1hbHQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjg0MSIsICJNNDM5LjYgMjM2LjFMMjQ0IDQwLjVDMjM4LjYgMzUgMjMxLjIgMzIgMjIzLjYgMzJzLTE1IDMtMjAuNCA4LjRsLTQwLjcgNDAuNiA1MS41IDUxLjVjMjcuMS05LjEgNTIuNyAxNi44IDQzLjQgNDMuN2w0OS43IDQ5LjdjMzQuMi0xMS44IDYxLjIgMzEgMzUuNSA1Ni43LTI2LjUgMjYuNS03MC4yLTIuOS01Ni0zNy4zbC00Ni4zLTQ2LjMgMCAxMjEuOWMyNS4zIDEyLjUgMjIuMyA0MS44IDkuMSA1NS02LjQgNi40LTE1LjIgMTAuMS0yNC4zIDEwLjFzLTE3LjgtMy42LTI0LjMtMTAuMWMtMTcuNi0xNy42LTExLjEtNDYuOSAxMS4yLTU2bDAtMTIzYy0yMC44LTguNS0yNC42LTMwLjctMTguNi00NUwxNDIuNiAxMDEgOC41IDIzNS4xQzMgMjQwLjYgMCAyNDcuOSAwIDI1NS41czMgMTUgOC41IDIwLjRMMjA0LjEgNDcxLjZjNS40IDUuNCAxMi43IDguNCAyMC40IDguNHMxNS0zIDIwLjQtOC40TDQzOS42IDI3Ni45YzUuNC01LjQgOC40LTEyLjggOC40LTIwLjRzLTMtMTUtOC40LTIwLjR6Il0KICAgIH07CiAgICBmYUZpcmVmb3hCcm93c2VyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImZpcmVmb3gtYnJvd3NlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMDA3IiwgIk0xMzAuMiAxMjcuNWwwIDB6bTM1MS40IDQ1LjRjLTEwLjYtMjUuNS0zMi4xLTUzLTQ4LjktNjEuNyAxMy43IDI2LjkgMjEuNyA1My45IDI0LjcgNzQgMCAuMSAwIC4zIC4xIC40LTI3LjYtNjguOC03NC40LTk2LjUtMTEyLjYtMTU2LjgtMTUtMjMuNy0xMC45LTI1LjItMTMuMS0yNC43bC0uMSAuMWMtNDYuNyAyNi03NS4zIDc4LjQtODIuNiAxMjIuNy0xNi42IC45LTMyLjkgNS00Ny45IDEyLjEtMS40IC42LTIuNSAxLjctMy4xIDNzLS45IDIuOC0uNiA0LjNjLjIgLjggLjYgMS42IDEuMSAyLjNzMS4yIDEuMyAxLjkgMS43IDEuNiAuNyAyLjQgLjggMS43IDAgMi41LS4zbC41LS4yYzE1LjUtNy4zIDMyLjQtMTEuMiA0OS41LTExLjMgNjIuOC0uNiA5Ny4yIDQ0IDEwNy42IDYyLjMtMTMtOS4yLTM2LjQtMTguMi01OC44LTE0LjMgODcuNyA0My45IDY0LjIgMTk0LjUtNTcuNCAxODkuMi01OS41LTIuNi05Ny4xLTUxLTEwMC41LTkwLjggMCAwIDExLjItNDEuOSA4MC42LTQxLjkgNy41IDAgMjguOS0yMC45IDI5LjMtMjctLjEtMi00Mi41LTE4LjktNTkuMS0zNS4yLTguOC04LjctMTMuMS0xMi45LTE2LjgtMTYuMS0yLTEuNy00LjEtMy4zLTYuMy00LjgtNS42LTE5LjUtNS44LTQwLS43LTU5LjYtMjUuMSAxMS40LTQ0LjYgMjkuNC01OC43IDQ1LjRsLS4xIDBjLTkuNy0xMi4yLTktNTIuNi04LjQtNjEuMS0uMS0uNS03LjIgMy43LTguMiA0LjMtOC42IDYuMS0xNi41IDEyLjktMjMuOCAyMC40LTE2LjMgMTYuNi00NC4xIDUwLjItNTUuNSAxMDEuMi00LjUgMjAuNC02LjggNDQuNC02LjggNTIuMyAwIDEzNC43IDEwOS4yIDI0My45IDI0My45IDI0My45IDEyMC42IDAgMjIzLTg3LjIgMjQwLjQtMjAyLjYgMTEuNi03Ni43LTE0LjctMTMxLjEtMTQuNy0xMzJ6Il0KICAgIH07CiAgICBmYUNsb3Vkc21pdGggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY2xvdWRzbWl0aCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMzg0IiwgIk01MTIgMjI3LjZMNTEyIDI4NC41IDI4NC40IDUxMiAyMjcuNiA1MTIgMCAyODQuNCAwIDIyNy42IDIyNy42IDAgMjg0LjUgMCA1MTIgMjI3LjZ6bS0yNTYgMTYyYzE3LjggLjUgMzUuNi0yLjYgNTIuMi05LjFzMzEuOC0xNi4yIDQ0LjYtMjguNyAyMy0yNy4zIDI5LjktNDMuOCAxMC41LTM0LjEgMTAuNS01Mi0zLjYtMzUuNS0xMC41LTUyLTE3LjEtMzEuMy0yOS45LTQzLjgtMjgtMjIuMi00NC42LTI4LjctMzQuNC05LjYtNTIuMi05LjFjLTE3LjgtLjUtMzUuNiAyLjYtNTIuMiA5LjFzLTMxLjggMTYuMy00NC42IDI4LjctMjMgMjcuMy0yOS45IDQzLjgtMTAuNSAzNC4xLTEwLjUgNTIgMy42IDM1LjUgMTAuNSA1MiAxNy4xIDMxLjMgMjkuOSA0My44IDI4IDIyLjIgNDQuNiAyOC43IDM0LjQgOS42IDUyLjIgOS4xeiJdCiAgICB9OwogICAgZmFXaXphcmRzT2ZUaGVDb2FzdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ3aXphcmRzLW9mLXRoZS1jb2FzdCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNzMwIiwgIk0yMTkuMiAzNDUuN2MtMS45IDEuNC0xMS4xIDguNC0uMyAyMy42IDQuNiA2LjQgMTQuMSAxMi44IDIxLjcgNi42IDYuNS00LjkgNy40LTEyLjkgLjMtMjMtNS41LTcuOC0xNC4zLTEyLjktMjEuNy03LjF6bTMzNi44IDc1LjljLS4zIDEuNy0uNiAxLjcgLjggMCAyLjEtNC4yIDQuMi0xMC4yIDUtMTkuOSAzLjEtMzguNS00MC4zLTcxLjUtMTAxLjMtNzgtNTQuNy02LTEyNC40IDkuMi0xODguOCA2MC41bC0uMyAxLjZjMi42IDUgNSAxMC43IDMuNCAyMS4ybC44IC4zYzYzLjktNTguNCAxMzEuMi03Ny4yIDE4NC40LTczLjggNTguNCAzLjcgMTAwIDM0IDEwMCA2OC4xIDAgMTAtMi42IDE1LjctMy45IDIwLjJ6TTM5Mi4zIDI0MC40Yy44IDcuMSA0LjIgMTAuMiA5LjIgMTAuNSA1LjUgLjMgOS40LTIuNiAxMC41LTYuNiAuOC0zLjQgMi4xLTI5LjggMi4xLTI5LjhTNDAyLjggMjIxIDM5OS4xIDIyNWMtMy43IDMuNy03LjMgOC40LTYuOCAxNS41em0tNTAtMTUxLjFjLTIwNC41IDAtMzI5LjIgMTM3LjUtMzQxLjUgMTUxLjktMSAuNS0xLjMgLjggLjggMS4zIDYwLjUgMTYuNSAxNTUuOCA4MS4yIDE5Ni4xIDIwMi4ybDEgLjNjNTUuMi02OS45IDE0MC45LTEyOC4xIDIzNy0xMjguMSA4MC45IDAgMTMwLjIgNDIuMiAxMzAuMiA4MC40IDAgMTguMy02LjYgMzMuNS0yMi4zIDQ2LjMgMCAxLS4yIC44IC44IC44IDE0LjctMTAuNyAyNy41LTI4LjggMjcuNS00OC4yIDAtMjIuOC0xMi4xLTM4LjItMTIuMS0zOC4yIDcuMSA3LjEgMTAuNyAxNi4yIDEwLjcgMTYuMiA1LjgtNDAuOSAyNy02Mi4zIDI3LTYyLjMtMi40LTkuNy02LjgtMTcuOC02LjgtMTcuOCA3LjYgOC4xIDE0LjQgMjcuNSAxNC40IDQxLjQgMCAxMC41LTMuNCAyMi44LTEyLjYgMzEuOWwuMyAuNWM4LjEtNSAxNi41LTE2LjggMTYuNS0zOCAwLTE1LjctNC43LTI1LjktNC43LTI1LjkgNS44LTUuMiAxMS4zLTkuMiAxNi0xMS44IC44IDMuNCAyLjEgOS43IDIuNCAxNC45IDAgMSAuOCAxLjggMSAwIC44LTUuOC0uMy0xNi4yLS4zLTE2LjUgNi0zLjEgOS43LTQuNSA5LjctNC41LTE1LjctMTEwLjMtMTQ0LTE5Ni45LTI5MS4yLTE5Ni45ek0yNDMgMzc4LjljLTExLjEgOS0yNC4yIDQuMS0zMC42LTQuMi03LjQtOS42LTYuOC0yNC4xIDQuMi0zMi41IDE0LjgtMTEuNCAyNy4xLS41IDMxLjIgNS41IC4zIC40IDEyLjEgMTYuNi00LjcgMzEuMnptMi4xLTEzNi40bDkuNC0xNy44IDExLjggNzEtMTIuNiA2LTI0LjYtMjguOCAxNC4xLTI2LjcgMy43IDQuNC0xLjgtOC4xem0xOC42IDExNy42bC0uMy0uM2MyLTQuMS0yLjUtNi42LTE3LjUtMzEuNy0xLjMtMi40LTMuMS0yLjktNC40LTIuNmwtLjMtLjVjNy45LTUuOCAxNS40LTEwLjIgMjUuNC0xNS43bC41IC4zYzEuMyAxLjggMi4xIDIuOSAzLjQgNC43bC0uMyAuNWMtMS0uMy0yLjQtLjgtNS4yIC4zLTIuMSAuOC03LjkgMy43LTEyLjMgNy42bDAgMS4zYzEuNiAyLjQgMy45IDYuNiA1LjggOS43bC4zIDBjMTAtNi4zIDcuNi00LjUgMTEuNS03LjlsLjMgMGMuNSAxLjggLjUgMS44IDEuOCA1LjVsLS4zIC4zYy0zLjEgLjYtNC43IC4zLTExLjUgNS41bDAgLjNjOS41IDE3IDExIDE2LjggMTIuNiAxNmwuMyAuM2MtMi4zIDEuNi02LjMgNC4yLTkuNyA2LjZ6TTMxOSAzMjcuNmMtMy4xIDEuNi02IDIuOS0xMCA1bC0uMy0uM2MxLjMtMi42IDEuMi0yLjctMTEuOC0zMi41bC0uMy0uM2MtLjIgMC04LjkgMy43LTEwIDcuM2wtLjUgMC0xLTUuOCAuMy0uNWM3LjMtNC42IDI1LjUtMTEuNiAyNy44LTEyLjZsLjUgLjMgMy4xIDUtLjMgLjVjLTMuNS0xLjgtNy40IC44LTEyLjMgMi42bDAgLjNjMTIuMyAzMiAxMi43IDMwLjYgMTQuNyAzMC42bDAgLjJ6bTQ0LjgtMTYuNWMtNC4yIDEtNS4yIDEuMy05LjcgMi45bC0uMy0uMyAuNS00LjVjLTEtMy40LTMuMS0xMS41LTMuNy0xMy42bC0uMy0uM2MtMy40IC44LTguOSAyLjYtMTIuOCAzLjlsLS4zIC4zYy44IDIuNiAzLjEgOS45IDQuMiAxMy45IC44IDIuNCAxLjggMi45IDIuOSAzLjFsMCAuNWMtMy43IDEtNy4xIDIuNi0xMC4yIDMuOWwtLjMtLjNjMS0xLjMgMS0yLjkgLjMtNS0xLTMuMS04LjEtMjMuOC05LjItMjcuMi0uNS0xLjgtMS42LTMuMS0yLjYtMy4xbDAtLjVjMy4xLTEgNi0yLjEgMTAuNy0zLjRsLjMgLjMtLjMgNC43YzEuMyAzLjkgMi40IDcuNiAzLjEgOS43bC4zIDBjMy45LTEuMyA5LjQtMi45IDEyLjgtMy45bC4zLS4zLTIuNi05LjRjLS41LTEuOC0xLTMuNC0yLjYtMy45bDAtLjNjNC40LTEgNy4zLTEuOCAxMC43LTIuNGwuMyAuM2MtMSAxLjMtMSAyLjktLjUgNC40IDEuNiA2LjMgNC43IDIwLjQgNi4zIDI2LjUgLjUgMi42IDEuOCAzLjQgMi42IDMuOXptMzIuMi02LjhsLS4zIC4zYy00LjcgLjUtMTQuMSAyLjQtMjIuNSA0LjJsLS4zLS4zIC44LTQuMmMtMS42LTcuOS0zLjQtMTguNi01LTI2LjItLjMtMS44LS44LTIuOS0yLjYtMy43bC44LS41YzkuMi0xLjYgMjAuMi0yLjQgMjQuOS0yLjZsLjMgLjNjLjUgMi40IC44IDMuMSAxLjYgNS41bC0uMyAuM2MtMS4xLTEuMS0zLjMtMy4yLTE2LjItLjhsLS4zIC4zYy4zIDEuNiAxIDYuNiAxLjYgOS45bC4zIC4zYzkuNS0xLjcgNC44LS4xIDEwLjctMi40bC4zIDBjMCAxLjYtLjMgMS44LS4zIDUuMmwtLjMgMGMtNC44LTEtMi4yLS45LTEwLjIgMGwtLjMgLjNjLjMgMi4xIDEuNiA5LjQgMi4xIDEyLjZsLjMgLjNjMS4yIC40IDE0LjItLjYgMTYuMi00LjdsLjMgMGMtLjUgMi40LTEgNC4yLTEuNiA2em0xMC43LTQ0LjVjLTQuNSAyLjQtOC4xIDIuOS0xMSAyLjktLjIgMC0xMS40IDEuMS0xNy41LTEwLTYuNy0xMC44LTEtMjUuMiA1LjUtMzEuNyA4LjgtOC4xIDIzLjQtMTAuMSAyOC41LTE3IDgtMTAuMy0xMy0yMi4zLTI5LjYtNS44bC0yLjYtMi45IDUuMi0xNi4yYzI1LjYtMS42IDQ1LjItMyA1MCAxNi4yIC44IDMuMSAwIDkuNC0uMyAxMi4xIDAgMi42LTEuOCAxOC44LTIuMSAyMy0uNSA0LjItLjggMTguMy0uOCAyMC43IC4zIDIuNCAuNSA0LjIgMS42IDUuNSAxLjYgMS44IDUuOCAxLjggNS44IDEuOGwtLjggNC43Yy0xMS44LTEuMS0xMC4zLS42LTIwLjQtMS0zLjItNS4xLTIuMi0zLjMtNC4yLTcuOSAwIDAtNC4yIDMuOS03LjMgNS41ek00NDMuOSAyODFjLTYuNC0xMC42LTE5LjgtNy4yLTIxLjcgNS41LTIuNiAxNy4xIDE0LjMgMTkuOCAyMC43IDEwLjJsLjMgLjNjLS41IDEuOC0xLjggNi0xLjggNi4zbC0uNSAuNWMtMTAuMyA2LjktMjguNS0yLjUtMjUuNy0xOC42IDEuOS0xMC45IDE0LjQtMTguOSAyOC44LTkuOWwuMyAuNWMwIDEuMS0uMyAzLjQtLjMgNS4zem01LjgtODcuN2wwLTYuNmMuNyAwIDE5LjYgMy4zIDI3LjggNy4zbC0xLjYgMTcuNXMxMC4yLTkuNCAxNS40LTEwLjdjNS4yLTEuNiAxNC45IDcuMyAxNC45IDcuM2wtMTEuMyAxMS4zYy0xMi4xLTYuNC0xOS42LS4xLTIwLjcgLjgtNS4zIDM4LjctOC42IDQyLjIgNC40IDQ2LjFsLS41IDQuN2MtMTcuNi00LjMtMTguNS00LjUtMzYuOS03LjNsLjgtNC43YzcuMyAwIDcuNS01LjMgNy42LTYuOCAwIDAgNS01My4yIDUtNTUuMyAwLTIuOS01LTMuNy01LTMuN3ptMTEgMTE0LjRjLTguMS0yLjEtMTQuMS0xMS0xMC43LTIwLjcgMy4xLTkuNCAxMi4zLTEyLjMgMTguOS0xMC4yIDkuMiAyLjYgMTIuOCAxMS44IDEwLjcgMTkuNC0yLjYgOC45LTkuNCAxMy45LTE4LjkgMTEuNXptNDIuMiA5LjdjLTIuNC0uNS03LjEtMi40LTguNi0yLjlsMC0uMyAxLjYtMS44Yy42LTguMiAuNi03LjMgLjMtNy42LTQuOC0xLjgtNi43LTIuNC03LjEtMi40LTEuMyAxLjgtMi45IDQuNS0zLjcgNS41bC0uOCAzLjQgMCAuM2MtMS4zLS4zLTMuOS0xLjMtNi0xLjZsMC0uMyAyLjYtMS44YzMuNC00LjcgMTAtMTQuMSAxMy45LTIwLjJsMC0yLjEgLjUtLjNjMi4xIC44IDUuNSAyLjEgNy42IDIuOSAuNSAuNSAuMi0xLjktMSAyNS4xLS4yIDEuOCAwIDIuNiAuOCAzLjl6bS00LjctODkuOGMxMS4zLTE4LjMgMzAuOC0xNi4yIDM0LTMuNGw3LjYtMjYuMmMyLjMtNi4yLTIuOC05LjktNC41LTExLjNsMS44LTMuN2MxMi4yIDEwLjQgMTYuNCAxNCAyMi41IDIwLjQtMjUuOSA3My4xLTMwLjggODAuOC0yNC42IDg0LjNsLTEuOCA0LjRjLTYuNC0zLjMtOC45LTQuNC0xNy44LTguNmwyLjEtNi44Yy0uMy0uMy0zLjkgMy45LTkuNyAzLjctMTkuMS0xLjMtMjIuOS0zMS43LTkuNy01Mi45em0yOS4zIDc5LjNjMC01LjctNi4zLTcuOS03LjktNS4yLTEuMyAyLjEgMSA1IDIuOSA4LjQgMS42IDIuNiAyLjYgNi4zIDEgOS40LTIuNiA2LjMtMTIuNCA1LjMtMTUuNC0uOCAwLS43LS4zIC4xIDEuOC00LjdsLjgtLjNjLS42IDUuNyA2LjEgOS42IDguNCA1IDEtMi4xLS41LTUuNS0yLjEtOC40LTEuNi0yLjYtMy43LTYuMy0xLjgtOS43IDIuNy01LjEgMTEuMy00LjUgMTQuNyAyLjRsMCAuNS0yLjQgMy40em0yMS4yIDEzLjRjLTItMy4zLS45LTIuMS00LjUtNC43bC0uMyAwYy0yLjQgNC4yLTUuOCAxMC41LTguNiAxNi4yLTEuMyAyLjQtMSAzLjQtLjggMy45bC0uMyAuMy01LjgtNC40IC4zLS4zIDIuMS0xLjNjMy4xLTUuOCA2LjYtMTIuMSA5LjItMTdsMC0uM2MtMi42LTItMS4yLTEuNS02LTEuOGwwLS4zIDMuMS0zLjQgLjMgMGMzLjcgMi40IDEwIDYuOCAxMi4zIDguOWwuMyAuMy0xLjMgMy45ek01NzUuOCAyNzZsLTIuOS0yLjljLjgtMi40IDEuOC01IDIuMS03LjYgLjctOS43LTExLjUtMTEuOC0xMS41LTUgMCA1IDcuOSAxOS40IDcuOSAyNy44IDAgMTAuMi01LjggMTUuNy0xMy45IDE2LjUtOC40IC44LTIwLjItMTAuNS0yMC4yLTEwLjVsNS0xNC40IDIuOSAyLjFjLTMgMTcuOCAxNy43IDIwLjQgMTMuMyA1LjItMS4xLTQtMTguNy0zNC4yIDIuMS0zOC4yIDEzLjYtMi40IDIzIDE2LjUgMjMgMTYuNUw1NzUuOCAyNzZ6bTM1LjYtMTAuMmMtMTEtMzAuNC02MC41LTEyNy41LTE5Mi0xMjkuNi01My40LTEtOTQuMyAxNS40LTEzMi44IDM4bDg1LjYtOS4yLTkxLjQgMjAuNyAyNS4xIDE5LjYtMy45LTE2LjVjNy41LTEuNyAzOS4xLTguNSA2Ni44LTguOWwtMjIuMyA4MC40YzEzLjYtLjcgMTktOSAxOS42LTIyLjhsNS0xIC4zIDI2LjdjLTIyLjUgMy4yLTM3LjMgNi43LTQ5LjUgOS45bDEzLjEtNDMuMi02MS41LTM2LjcgMi40IDguMSAxMC4yIDVjNi4zIDE4LjYgMTkuNCA1Ni42IDIwLjQgNTguNyAyIDQuMyAzLjIgNS44IDEyIDQuNWwxLjEgNWMtMTYuMSA0LjktMjMuNyA3LjYtMzkgMTQuNGwtMi40LTQuN2M0LjQtMi45IDguNy0zLjkgNS41LTEyLjgtMjMuNy02Mi41LTIxLjUtNTguMS0yMi44LTU5LjRsMi40LTQuNCAzMy41IDY3LjNjLTMuOC0xMS45IDEuNyAxLjctMzMtNzguOGwtNDEuOSA4OC41IDQuNy0xMy45LTM1LjktNDIuMiAyNy44IDkzLjUtMTEuOCA4LjRjLTExMS45LTEwMS43LTEwNS44LTk4LjQtMTEzLjctOTguNy01LjUtLjMtMTMuNiA1LjUtMTMuNiA1LjVsLTUtNmMzMC42LTIzLjUgMzEuNi0yNC4zIDU4LjQtNDIuN2w0LjIgNy4xcy01LjggNC4yLTcuOSA3LjFjLTUuOSA5LjMgMS43IDEzLjMgNjEuOCA3NS43bC0xOC44LTU4LjkgMzkuOC0xMC4yIDI1LjcgMzAuNiA0LjQtMTIuMy01LTI0LjYgMTMuMS0zLjQgLjUgMy4xIDMuNy0xMC41LTk0LjMgMjkuMyAxMS4zLTUtMTMuNi00Mi40IDE3LjMtOS4yIDMwLjEgMzYuMSAyOC41LTEzLjFjLTEuNC03LjUtMi41LTE0LjUtNC43LTE5LjZsMTcuMyAxMy45IDQuNy0yLjEtNTkuMi00Mi43IDIzLjEgMTEuNWMxOS02LjEgMjUuMi03LjUgMzIuMi05LjdsMi42IDExYy0xMi42IDEyLjYgMS40IDE2LjggNi41IDE5LjRsLTEzLjYtNjEgMTIgMjguM2M0LjItMS4zIDcuMy0yLjEgNy4zLTIuMWwyLjYgOC42cy0zLjEgMS02LjMgMi4xbDguOSAyMSAzMy44LTY1LjctMjAuNyA2MWM0Mi40LTI0LjEgODEuNC0zNi43IDEzMi0zNS45IDY3IDEgMTY3LjMgNDAuOCAxOTkuOCAxMzkuOCAuOCAyLjEgMCAyLjYtLjggLjN6bS00MDgtMTEzLjRzMS44LS41IDQuMi0xLjNsOS40IDcuNmMtLjQgMC0zLjQtLjMtMTEuMyAyLjRsLTIuNC04LjZ6bTE0My44IDM4LjVjLTEuNi0uNi0yNi41LTQuOC0zMy4zIDIwLjdsMjEuNyAxNyAxMS41LTM3Ljd6TTMxOC40IDY3LjFjLTU4LjQgMC0xMDYuMSAxMi0xMTUgMTQuNGwwIC44YzguNCAyLjEgMTQuNCA0LjIgMjEuMiAxMS44bDEuNiAuM2M2LjYtMS44IDQ5LTEzLjkgMTEwLjItMTMuOSAxODAuMiAwIDMwMS43IDExNi44IDMwMS43IDIyMy40bDAgMTBjMCAxLjMgLjggMi42IDEuMSAuNSAuNS0yLjEgLjgtOC42IC44LTE5LjYgLjMtODMuOC05Ni42LTIyNy42LTMyMS42LTIyNy42ek01MjkuNSAyMzYuOGMxLjMtNS44IDAtMTIuMy03LjMtMTMuMS05LjYtMS4xLTE2LjEgMjMuOC0xNyAzMy41LS44IDUuNS0xLjMgMTQuOSA2IDE0LjkgNC43IDAgOS43LS45IDE4LjMtMzUuNHpNNDY4IDI3OS43Yy0yLjYtLjgtOS40LS44LTEyLjYgMTAuNS0xLjggNi44IC41IDEzLjQgNiAxNC43IDMuNyAxLjEgOC45IC41IDExLjgtMTAuNyAyLjYtOS45LTEuOC0xMy42LTUuMi0xNC40em0yMyAyMWMxLjggLjUgMy4xIDEgNS44IDEuOCAwLTEuOCAuNS04LjQgLjgtMTIuMS0xIDEuMy01LjUgOC4xLTYuNiAxMGwwIC4zeiJdCiAgICB9OwogICAgZmFDcmVhdGl2ZUNvbW1vbnNOZCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjcmVhdGl2ZS1jb21tb25zLW5kIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0ZWIiLCAiTTI1NS42IDhDMzk3LjQgOCA1MDQgMTE4LjEgNTA0IDI1NiA1MDQgNDAzLjEgMzg1LjUgNTA0IDI1NS42IDUwNCAxMjEuNiA1MDQgOCAzOTQuNSA4IDI1NiA4IDEyMy4xIDExMi43IDggMjU1LjYgOHptLjggNDQuN2MtMTE4LjIgMC0yMDMuNyA5Ny45LTIwMy43IDIwMy4zIDAgMTA5LjggOTEuMiAyMDIuOCAyMDMuNyAyMDIuOCAxMDMuMiAwIDIwMi44LTgxLjEgMjAyLjgtMjAyLjggLjEtMTEzLjgtOTAuMi0yMDMuMy0yMDIuOC0yMDMuM3ptOTQgMTQ0LjNsMCA0Mi41LTE4MC4zIDAgMC00Mi41IDE4MC4zIDB6bTAgNzkuOGwwIDQyLjUtMTgwLjMgMCAwLTQyLjUgMTgwLjMgMHoiXQogICAgfTsKICAgIGZhVXNwcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ1c3BzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY3ZTEiLCAiTTQyOC4zIDI0MS43YzI1LjgtNDEuMyAxNS4yLTQ4LjgtMTEuNy00OC44bC0yNyAwYy0uMSAwLTEuNS0xLjQtMTAuOSA4LTExLjIgNS42LTM3LjkgNi4zLTM3LjkgOC43IDAgNC41IDcwLjMtMy4xIDg4LjEgMCA5LjUgMS41LTEuNSAyMC40LTQuNCAzMi0uNSA0LjUgMi40IDIuMyAzLjggLjF6TTMxNi4yIDI2NC4zYzY0LTIxLjMgOTcuMy0yMy45IDEwMi0yNi4yIDQuNC0yLjktNC40LTYuNi0yNi4yLTUuOC01MS43IDIuMi0xMzcuNiAzNy4xLTE3Mi42IDUzLjlsLTMwLjctOTMuMyAxOTYuNiAwYy0yLjctMjguMi0xNTIuOS0yMi42LTMzNy45LTIyLjZMLTUgNDE1LjhjMTk2LjQtOTcuMyAyNTguOS0xMzAuMyAzMjEuMi0xNTEuNXpNNjIuNyA5NmMyNTMuMyA1My43IDMzMCA2NS43IDMzMi4xIDg1LjIgMzYuNCAwIDQ1LjkgMCA1Mi40IDYuNiAyMS4xIDE5LjctMTQuNiA2Ny43LTE0LjYgNjcuNy00LjQgMi45LTQwNi40IDE2MC4yLTQwNi40IDE2MC4yTDQ0OS4zIDQxNS43IDUxNyA5NiA2Mi43IDk2eiJdCiAgICB9OwogICAgZmFTcXVhcmVMZXR0ZXJib3hkID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1sZXR0ZXJib3hkIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU2MmUiLCAiTTM4NCAzMmMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMzIwIDB6TTEwNS4xIDE4N0M2Ni40IDE4NyAzNSAyMTguMyAzNSAyNTdzMzEuNCA3MCA3MC4xIDcwYzI0LjggMCA0Ni41LTEyLjggNTktMzIuMmwuNS0uNy0uNC0uNmMtNi41LTEwLjYtMTAuMi0yMy4xLTEwLjItMzYuNSAwLTEzLjYgMy45LTI2LjMgMTAuNi0zNy4xLTEyLjQtMTkuOC0zNC40LTMyLjktNTkuNS0zMi45ek0yMjQgMTg3Yy0yNC44IDAtNDYuNSAxMi44LTU5IDMyLjJsLS41IC43IC40IC42YzYuNSAxMC42IDEwLjIgMjMuMSAxMC4yIDM2LjUgMCAxMy42LTMuOSAyNi4zLTEwLjYgMzcuMSAxMi40IDE5LjcgMzQuNCAzMi45IDU5LjUgMzIuOSAyNC44IDAgNDYuNS0xMi44IDU5LTMyLjJsLjUtLjctLjQtLjZjLTYuNS0xMC42LTEwLjItMjMuMS0xMC4yLTM2LjUgMC0xMy42IDMuOS0yNi4zIDEwLjYtMzcuMS0xMi40LTE5LjctMzQuNC0zMi45LTU5LjUtMzIuOXptMTE4LjkgMGMtMjQuOCAwLTQ2LjUgMTIuOC01OSAzMi4ybC0uNSAuNyAuNCAuNmM2LjUgMTAuNiAxMC4yIDIzLjEgMTAuMiAzNi41IDAgMTMuNi0zLjkgMjYuMy0xMC42IDM3LjEgMTIuNCAxOS44IDM0LjQgMzIuOSA1OS41IDMyLjkgMzguNyAwIDcwLjEtMzEuMyA3MC4xLTcwcy0zMS40LTcwLTcwLjEtNzB6Il0KICAgIH07CiAgICBmYU1hbmRhbG9yaWFuID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1hbmRhbG9yaWFuIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY1MGYiLCAiTTIwMC42IDUxMS45Yy0xLTMuMy0xLjctMTUuOC0xLjQtMjQuNiAuNi0xNS45IDEtMjQuNyAxLjQtMjguOCAuNi02LjIgMi45LTIwLjcgMy4zLTIxLjQgLjYtMSAuNC0yNy45LS4yLTMzLjEtLjMtMi42LS42LTExLjktLjctMjAuNy0uMS0xNi41LS41LTIwLjEtMi43LTI0LjgtMS4xLTIuMy0xLjItMy44LTEtMTEuNCAuMi00LjIgLjEtOC41LS4zLTEyLjctMi0xMy0zLjUtMjcuNy0zLjItMzMuOXMuNC03LjEgMi4xLTkuN2MzLjEtNC43IDYuNS0xNCA4LjYtMjMuMyAyLjMtOS45IDMuOS0xNy4yIDQuNi0yMC43IDEuMS01LjEgMi42LTEwLjEgNC40LTE1LjEgMi4zLTYuMiAyLjUtMTUuNCAuNC0xNS40LS4zIDAtMS40IDEuMi0yLjQgMi43cy00LjggNC44LTguMyA3LjRjLTguNCA2LjEtMTEuNyA5LjQtMTIuNyAxMi42cy0xIDcuMi0uMiA3LjhjLjMgLjIgMS4zIDIuNCAyLjEgNC45IDEuNiA1IDEuOSAxMC4zIC43IDE1LjQtLjQgMS44LTEgNS41LTEuNSA4LjJzLTEgNi41LTEuMyA4LjJjLS4yIDEuNS0uNyAzLTEuNSA0LjMtMSAxLTEuMSAuOS0yLjEtLjUtLjctMS41LTEuMi0zLjEtMS40LTQuNy0uMi0xLjctMS42LTcuMS0zLjEtMTEuOS0zLjMtMTAuOS0zLjUtMTYuMi0xLTIxIC44LTEuNCAxLjQtMyAxLjctNC42IDAtMi40LTIuMi01LjMtNy40LTkuOS03LTYuMi04LjYtNy45LTEwLjItMTEuMy0xLjctMy42LTMuMS00LjEtNC41LTEuNS0xLjggMy0yLjYgOS4xLTMgMjJsLS4zIDEyLjIgMiAyLjJjMy4yIDMuNyAxMi4xIDE2LjUgMTMuOCAxOS44IDMuNCA2LjcgNC4zIDExLjcgNC40IDIzLjZzMSAyMi44IDIgMjQuN2MuNCAuNyAuNSAxLjQgLjMgMS41cy40IDIuMSAxLjMgNC4zYzEgMi45IDEuNyA1LjkgMi4xIDkgLjQgMy41IC45IDcgMS43IDEwLjQgMi4yIDkuNiAyLjggMTQuMSAyLjQgMjAuMS0uMiAzLjMtLjUgMTEuMS0uNyAxNy4zLTEuMyA0MS44LTEuOCA1OC0yIDYxLjItLjEgMi0uNCAxMS41LS42IDIxLjEtLjQgMTYuMy0xLjMgMjcuNC0yLjQgMjguNi0uNiAuNy04LjEtNC45LTEyLjUtOS41LTMuOC0zLjktNC00LjgtMi44LTkuOSAuNy0zIDIuMy0xOC4zIDMuMy0zMi42IC40LTQuOCAuOC0xMC41IDEtMTIuNyAuOC05LjQgMS43LTIwLjMgMi42LTM0LjggLjYtOC41IDEuMy0xNi40IDEuNy0xNy43cy45LTkuOSAxLjEtMTkuMWwuNC0xNi44LTIuMy00LjNjLTEuNy0zLjMtNC45LTYuOS0xMy4yLTE1LjMtNi02LjEtMTEuOC0xMi4zLTEyLjktMTMuOGwtMi0yLjggLjgtMTAuOWMxLjEtMTUuNyAxLjEtNDguNiAwLTU5LjFsLS45LTguNy0zLjMtNC41Yy01LjktOC4xLTUuOC03LjctNi4yLTMzLjMtLjEtNi4xLS40LTExLjUtLjYtMTIuMS0uOC0xLjktMy0yLjctOC41LTMtOC45LS42LTExLTEuOS0yMy44LTE0LjYtNi4yLTYtMTIuMy0xMi0xMy44LTEzLjItMi44LTIuNC0yLjgtMi0uNi05LjZsMS40LTQuNi0xLjctM2MtLjgtMS40LTEuNi0yLjgtMi42LTQuMS0xLjMtMS41LTUuNS0xMC45LTYtMTMuNS0uMi0uNy0uMi0xLjQtLjEtMi4xcy41LTEuMyAuOS0xLjhjMi4yLTIuOSAzLjQtNS43IDQuNS0xMC43IDIuMy0xMS4yIDcuNy0yNi4xIDEwLjYtMjkuMiAzLjItMy41IDcuNy0xIDkuNCA1IDEuMyA0LjggMS40IDkuOCAuMSAxOC42LS41IDMuNy0uOSA3LjQtMSAxMS4xIDAgNCAuMiA0LjcgMi4zIDcuNCAzLjMgNC40IDcuNyA3LjQgMTUuMiAxMC41IDEuNyAuNyAzLjMgMS43IDQuNyAyLjggMTEuMiAxMC43IDE4LjYgMTYuMiAyMi45IDE2LjkgNS4yIC44IDggNC41IDEwIDEzLjQgMS4zIDUuNyA0IDExLjEgNS41IDExLjEgMS4yLS4yIDIuMy0uNyAzLjMtMS40IDItMS4yIDIuMi0xLjcgMi4yLTQuMi0uMy02LS45LTExLjktMi0xNy44LS40LTEuNy0uOC00LjEtLjktNS40cy0uNi0zLjgtMS01LjdjLTIuNi0xMS4yLTMuNi0xNS41LTQuMS0xNi0xLjYtMi00LjEtMTAuMi00LjktMTUuOS0xLjYtMTEuMS00LTE0LjItMTIuOS0xNy40LTQuOS0xLjgtOS40LTQuNS0xMy4zLTcuOS0xLjItMS00LTMuMi02LjQtNS4xcy00LjQtMy41LTQuNi0zLjhjLS44LS43LTEuNy0xLjQtMi43LTItNi4yLTQuMi04LjgtNy0xMS4zLTEybC0yLjQtNWMtLjEtOC43LS4zLTE3LjMtLjQtMjZsNi45LTYuNmM0LTMuOCA4LjUtNy40IDEwLjYtOC40IDMuMy0xLjcgNC40LTEuOSAxMS40LTIgOC41LS4yIDEwLjEgMCAxMS43IDEuNnMxLjQgNi40LS4zIDguNWMtLjYgLjctMS4xIDEuNS0xLjMgMi4zIDAgLjYtMi42IDQuOS01LjQgOS0xLjEgMi4yLTEuOSA0LjUtMi40IDYuOCAyMC40IDEzLjQgMjEuNiAzLjggMTQuMSAyOWwxMS40IDIuNWMzLjEtOC43IDYuNS0xNy4zIDguNi0yNi4yIC4zLTcuNi0xMi00LjItMTUuNC04LjctMi4zLTUuOSAzLjEtMTQuMiA2LjEtMTkuMiAxLjYtMi4zIDYuNi00LjcgOC44LTQuMSAuOSAuMiA0LjItLjQgNy40LTEuMyAyLjUtLjggNS0xLjMgNy41LTEuNyAyLS4yIDQuMS0uNyA2LTEuMyAzLjctMS4xIDQuNS0xLjIgNi4zLS40IDEuOSAuNiAzLjggMS4xIDUuOCAxLjQgMi4xIC4zIDQuMSAuOSA2IDEuOSAxLjYgLjkgMy4zIDEuNyA1IDIuMiAyLjUgLjcgMyAuNiA3LTEuN0wyMjYgNS40IDIzNi43IDVjMTAuNC0uNCAxMC44LS41IDE1LjMtMi43TDI1Ni41IDAgMjU5IDEuNGMxLjggMSAzLjEgMi43IDQuOSA2IDIuNCA0LjUgMi40IDQuNiAxLjQgNy40LS45IDIuNC0uOSAzLjMtLjEgNi40IC41IDIgMS4yIDQgMi4xIDUuOSAuNiAxLjMgMS4xIDIuNiAxLjMgNCAuMyA0LjMgMCA1LjMtMi40IDYuOS0yLjIgMS41LTcgNy45LTcgOS4zLS4yIDEtLjYgMi0xLjEgMy01IDExLjUtNi44IDEzLjYtMTQuMyAxNy05LjIgNC4yLTEyLjMgNS4yLTE2LjIgNS4yLTMuMSAwLTQgLjItNC41IDEuMy0xLjIgMS40LTIuNSAyLjctNC4xIDMuNy0xLjggMS4yLTMuMyAyLjktNC40IDQuOC0uNSAxLjItMS40IDIuMi0yLjUgMi45LS45IC40LTEuOCAxLTIuNSAxLjctMi4yIDEuOS00LjYgMy43LTcgNS40LTMuMyAyLjMtNi45IDUtNy45IDYtLjcgLjctMS41IDEuMy0yLjQgMS43LS44IC40LTEuNiAuOS0yLjEgMS42LTEuMyAxLjQtMS41IDIuMS0xLjEgNC42IC4zIDIgLjggNCAxLjQgNS45IDEuMyAzLjggMS4zIDcuOSAwIDEwLjZzLS45IDYuNyAxLjQgOS42YzIgMi42IDIuMiA0LjYgLjcgOC44LS44IDIuOS0xLjEgNS45LTEuMSA4LjkgMCA0LjkgLjIgNi4zIDEuNSA4LjRzMS44IDIuNSAzLjIgMi4zYzItLjIgMi4zLTEuMSA0LjctMTIuMSAyLjItMTAgMy43LTExLjkgMTMuOC0xNy4xIDIuOS0xLjUgNy41LTQgMTAtNS40czYuOC0zLjcgOS40LTQuOWM1LjktMi42IDExLjItNi42IDE1LjItMTEuNyA3LjEtOC44IDEwLTE2LjIgMTIuOC0zMy4zIC40LTIuOCAxLjMtNS40IDIuOS03LjcgMS40LTIuMiAyLjQtNC43IDIuOS03LjMgMS01LjMgMi45LTkuMSA1LjYtMTEuNSA0LjctNC4yIDYtMS4xIDQuNiAxMC45LS41IDMuOS0xLjEgMTAuMy0xLjQgMTQuNGwtLjYgNy40YzMgMi43IDUuOSA1LjUgOC45IDguMmwuMSA4LjRjLjEgNC42IC41IDkuNSAuOSAxMC45bC44IDIuNS02LjQgNi4zYy04LjUgOC4zLTEyLjkgMTMuOS0xNi44IDIxLjYtMS44IDMuNS0zLjcgNy4xLTQuNCA4LTIuMiAzLjEtNi41IDEzLTguOCAyMC4zbC0yLjMgNy4yLTcgNi41Yy0zLjggMy42LTggNy4yLTkuMiA4LjItMyAyLjMtNC4zIDUuMS00LjMgMTAtLjEgMi41IC40IDUgMS42IDcuMyAuOCAxLjYgMS41IDMuMiAyLjEgNC44IC4zIDEgLjkgMiAxLjYgMi45IDEuNCAxLjYgMS45IDE2LjEgLjggMjMuMi0uNyA0LjUtMy42IDEyLTQuNyAxMi0xLjggMC00LjEgOS4zLTUuMSAyMC43LS4yIDItLjYgNS45LTEgOC43cy0xIDEwLTEuNCAxNmMtLjggMTIuMi0uMiAxOC44IDIgMjMuMiAzLjQgNi43IC41IDEyLjctMTEgMjIuOGwtNCAzLjUgLjEgNS4yYy4xIDMgLjQgNiAxLjEgOC45IDQuNiAxNiA0LjcgMTYuOSA0LjQgMzcuMS0uNSAyNi40LS4zIDQwLjMgLjYgNDQuMiAuNSAyLjMgLjkgNC42IDEuMSA3IC4yIDIgLjcgNS4zIDEuMSA3LjQgLjUgMi4zIC44IDExIC44IDIyLjdsMCAxOS4xLTEuOCAyLjZjLTIuNyAzLjktMTUuMSAxMy41LTE1LjUgMTIuM2wuMSAwem0yOS41LTQ1LjFjLS4yLS4zLS4zLTYuOS0uMy0xNC42IDAtMTQuMS0uOS0yNy41LTIuMy0zNC40LS40LTItLjgtOS43LS45LTE3LjEtLjItMTEuOS0xLjQtMjQuNC0yLjYtMjYuNC0uNy0xLjEtMy0xNy43LTMtMjEuMyAwLTQuMiAxLTYgNS4zLTkuMXM0LjktMy4xIDUuNS0uN2MuMyAxLjEgMS40IDUuNiAyLjYgMTAgMy45IDE1LjEgNC4xIDE2LjMgNCAyMS43LS4xIDUuOC0uMSA2LjEtMS43IDE3LjctMSA3LjEtMS4yIDEyLjQtMSAyOC40IC4yIDE5LjQtLjYgMzUuNy0yIDQxLjMtLjcgMi44LTIuOCA1LjUtMy40IDQuNGwtLjEgMHptLTcxLTM3LjZjLS44LTMuNi0xLjMtNy4yLTEuNy0xMC44cy0xLTcuMi0xLjctMTAuOGMtLjUtMi4xLS45LTQuMy0xLTYuNS0uMy0zLjItLjktNy41LTEuMy05LjUtMS00LjgtMy4zLTE5LjQtMy40LTIxLjEgMC0uNy0uMy00LS43LTcuNC0uNy02LjItLjgtMjcuNy0uMi0yOC4zIDEtMSA2LjYgMi44IDExLjMgNy40bDUuMyA1LjMtLjQgNi41Yy0uMiAzLjYtLjYgMTAuMi0uOCAxNC44LS41IDEzLjMtLjcgOC43LTEuNiAyOC40LS44IDE3LjQtMS45IDMxLjMtMi42IDMyLS4xIC4xLS4yIC4xLS4yIC4ycy0uMiAwLS4zIDAtLjIgMC0uMy0uMS0uMS0uMS0uMi0uMmwwIDB6TTcyIDE2Mi42YzIxLjEgMTIuOCAxNy44IDE0LjIgMjguNSAxNy43IDEzIDQuMyAxOC45IDcuMSAyMy4yIDE2LjktNDMuNyAzNi4xLTY5IDU3LjktNzYuNyA3MC45LTMxIDUyLTYgMTAxLjYgNjIuOCA4Ny4yLTE0LjIgMjkuMi03OCAyOC42LTk4LjctNC45LTI0LjctNDAtMjIuMS0xMTguMyA2MS0xODcuN2wwIDB6bTIxMC44IDE3OWM1Ni43IDYuOSA4Mi4zLTM3LjcgNDYuNS04OS4yIDAgMC0yNi45LTI5LjMtNjQuMy02OCAzLTE1LjUgOS41LTMyLjEgMzAuNi01My44IDg5LjIgNjMuNSA5MiAxNDEuNiA5Mi41IDE0OS40IDQuMyA3MC42LTc4LjcgOTEuMi0xMDUuMyA2MS43bDAgMHoiXQogICAgfTsKICAgIGZhU2xhY2sgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2xhY2siLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs2MjQ0NywgInNsYWNrLWhhc2giXSwgImYxOTgiLCAiTTk0LjEgMzE1LjFjMCAyNS45LTIxLjIgNDcuMS00Ny4xIDQ3LjFTMCAzNDEgMCAzMTUuMSAyMS4yIDI2OCA0Ny4xIDI2OGw0Ny4xIDAgMCA0Ny4xem0yMy43IDBjMC0yNS45IDIxLjItNDcuMSA0Ny4xLTQ3LjFTMjEyIDI4OS4yIDIxMiAzMTUuMWwwIDExNy44YzAgMjUuOS0yMS4yIDQ3LjEtNDcuMSA0Ny4xcy00Ny4xLTIxLjItNDcuMS00Ny4xbDAtMTE3Ljh6bTQ3LjEtMTg5Yy0yNS45IDAtNDcuMS0yMS4yLTQ3LjEtNDcuMVMxMzkgMzIgMTY0LjkgMzIgMjEyIDUzLjIgMjEyIDc5LjFsMCA0Ny4xLTQ3LjEgMHptMCAyMy43YzI1LjkgMCA0Ny4xIDIxLjIgNDcuMSA0Ny4xUzE5MC44IDI0NCAxNjQuOSAyNDRMNDcuMSAyNDRDMjEuMiAyNDQgMCAyMjIuOCAwIDE5Ni45czIxLjItNDcuMSA0Ny4xLTQ3LjFsMTE3LjggMHptMTg5IDQ3LjFjMC0yNS45IDIxLjItNDcuMSA0Ny4xLTQ3LjFTNDQ4IDE3MSA0NDggMTk2LjkgNDI2LjggMjQ0IDQwMC45IDI0NGwtNDcuMSAwIDAtNDcuMXptLTIzLjcgMGMwIDI1LjktMjEuMiA0Ny4xLTQ3LjEgNDcuMVMyMzYgMjIyLjggMjM2IDE5Ni45bDAtMTE3LjhDMjM2IDUzLjIgMjU3LjIgMzIgMjgzLjEgMzJzNDcuMSAyMS4yIDQ3LjEgNDcuMWwwIDExNy44em0tNDcuMSAxODljMjUuOSAwIDQ3LjEgMjEuMiA0Ny4xIDQ3LjFTMzA5IDQ4MCAyODMuMSA0ODAgMjM2IDQ1OC44IDIzNiA0MzIuOWwwLTQ3LjEgNDcuMSAwem0wLTIzLjdjLTI1LjkgMC00Ny4xLTIxLjItNDcuMS00Ny4xUzI1Ny4yIDI2OCAyODMuMSAyNjhsMTE3LjggMGMyNS45IDAgNDcuMSAyMS4yIDQ3LjEgNDcuMXMtMjEuMiA0Ny4xLTQ3LjEgNDcuMWwtMTE3LjggMHoiXQogICAgfTsKICAgIGZhU2xhY2tIYXNoID0gZmFTbGFjazsKICAgIGZhQW5nZWxsaXN0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImFuZ2VsbGlzdCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMjA5IiwgIk0zMTUuNiAyMTUuNGMxMS43LTMyLjYgNDUuNC0xMjYuOSA0NS40LTE1Ny4xIDAtMjYuNi0xNS43LTQ4LjktNDMuNy00OC45LTQ0LjYgMC04NC42IDEzMS43LTk3LjEgMTYzLjEtOS43LTI4LjUtNTUuMS0xNzIuNS05NS4xLTE3Mi41LTMxLjEgMC00NS43IDIyLjktNDUuNyA1MS43IDAgMzUuMyAzNC4yIDEyNi44IDQ2LjYgMTYyLTYuMy0yLjMtMTMuMS00LjMtMjAtNC4zLTIzLjQgMC00OC4zIDI5LjEtNDguMyA1Mi42IDAgOC45IDQuOSAyMS40IDggMjkuNy0zNi45IDEwLTUxLjEgMzQuNi01MS4xIDcxLjctLjEgNzIuMiA2OC4zIDE0OC42IDE2NC41IDE0OC42IDExOCAwIDE5MS40LTg4LjYgMTkxLjQtMjAyLjkgMC00My4xLTYuOS04Mi01NC45LTkzLjd6TTI4MC4yIDEwOGM0LTEyLjMgMjEuMS02NC4zIDM3LjEtNjQuMyA4LjYgMCAxMC45IDguOSAxMC45IDE2IDAgMTkuMS0zOC42IDEyNC42LTQ3LjEgMTQ4bC0zNC02IDMzLjEtOTMuN3pNMTEwLjggNDguM2MwLTExLjkgMTQuNS00NS43IDQ2LjMgNDcuMWwzNC42IDEwMC4zYy0xNS42LTEuMy0yNy43LTMtMzUuNCAxLjQtMTAuOS0yOC44LTQ1LjUtMTE5LjctNDUuNS0xNDguOHpNMTA4LjUgMjQ0YzI5LjMgMCA2Ny4xIDk0LjYgNjcuMSAxMDcuNCAwIDUuMS00LjkgMTEuNC0xMC42IDExLjQtMjAuOSAwLTc2LjktNzYuOS03Ni45LTk3LjcgLjEtNy43IDEyLjctMjEuMSAyMC40LTIxLjF6TTI5Mi44IDQzMC4zYy0yOS4xIDMyLTY2LjMgNDguNi0xMDkuNyA0OC42LTU5LjQgMC0xMDYuMy0zMi42LTEyOC45LTg4LjMtMTcuMS00My40IDMuOC02OC4zIDIwLjYtNjguMyAxMS40IDAgNTQuMyA2MC4zIDU0LjMgNzMuMSAwIDQuOS03LjcgOC4zLTExLjcgOC4zLTE2LjEgMC0yMi40LTE1LjUtNTEuMS01MS40LTI5LjcgMjkuNyAyMC41IDg2LjkgNTguMyA4Ni45IDI2LjEgMCA0My4xLTI0LjIgMzgtNDIgMy43IDAgOC4zIC4zIDExLjctLjYgMS4xIDI3LjEgOS4xIDU5LjQgNDEuNyA2MS43IDAtLjkgMi03LjEgMi03LjQgMC0xNy40LTEwLjYtMzIuNi0xMC42LTUwLjMgMC0yOC4zIDIxLjctNTUuNyA0My43LTcxLjcgOC02IDE3LjctOS43IDI3LjEtMTMuMSA5LjctMy43IDIwLTggMjcuNC0xNS40LTEuMS0xMS4yLTUuNy0yMS4xLTE2LjktMjEuMS0yNy43IDAtMTIwLjYgNC0xMjAuNi0zOS43IDAtNi43IC4xLTEzLjEgMTcuNC0xMy4xIDMyLjMgMCAxMTQuMyA4IDEzOC4zIDI5LjEgMTguMSAxNi4xIDI0LjMgMTEzLjItMzEgMTc0Ljd6bS05OC42LTEyNmM5LjcgMy4xIDE5LjcgNCAyOS43IDYtNy40IDUuNC0xNCAxMi0yMC4zIDE5LjEtMi44LTguNS02LjItMTYuOC05LjQtMjUuMXoiXQogICAgfTsKICAgIGZhQW5kcm9pZCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhbmRyb2lkIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYxN2IiLCAiTTQyMC41IDI1My45YTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHptLTI2NS4xIDBhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4em0yNzMuNy05Ni41bDQ3LjktODNjLjgtMS4xIDEuMy0yLjQgMS41LTMuOHMuMi0yLjctLjEtNC4xLS45LTIuNi0xLjctMy43LTEuOC0yLTMtMi43LTIuNS0xLjEtMy45LTEuMy0yLjcgMC00IC40LTIuNSAxLjEtMy42IDEuOS0xLjkgMi0yLjUgMy4ybC00OC41IDg0LjFjLTM4LjgtMTcuNC04MC44LTI2LjQtMTIzLjMtMjYuNHMtODQuNSA5LTEyMy4zIDI2LjRMMTE2LjIgNjQuNGMtLjYtMS4yLTEuNS0yLjMtMi41LTMuMnMtMi4zLTEuNS0zLjYtMS45LTIuNy0uNS00LS40LTIuNyAuNi0zLjkgMS4zLTIuMiAxLjYtMyAyLjctMS40IDIuNC0xLjcgMy43LS4zIDIuNy0uMSA0LjEgLjggMi42IDEuNSAzLjhsNDcuOSA4M0M2NC41IDIwMi4yIDguMiAyODUuNSAwIDM4NGw1NzYgMGMtOC4yLTk4LjUtNjQuNS0xODEuOC0xNDYuOS0yMjYuNnoiXQogICAgfTsKICAgIGZhTWVldHVwID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1lZXR1cCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMmUwIiwgIk0xMzEuMSA0MTQuM2MxLjEgNS43LTIuMyAxMS4xLTggMTIuMy01LjQgMS4xLTEwLjktMi4zLTEyLTgtMS4xLTUuNCAyLjMtMTEuMSA3LjctMTIuM3MxMS4xIDIuMyAxMi4zIDh6bTE0My4xIDcxLjRjLTYuMyA0LjYtOCAxMy40LTMuNyAyMCA0LjYgNi42IDEzLjQgOC4zIDIwIDMuNyA2LjMtNC42IDgtMTMuNCAzLjQtMjAtNC4yLTYuNS0xMy4xLTguMy0xOS43LTMuN3ptLTg2LTQ2Mi4zYTExLjggMTEuOCAwIDEgMCAtNC45LTIzIDExLjggMTEuOCAwIDEgMCA0LjkgMjN6TTY2LjUgMjI2LjNhMjIuMiAyMi4yIDAgMSAwIC0yNC43IDM2LjkgMjIuMiAyMi4yIDAgMSAwIDI0LjctMzYuOXptMjcyLTE3MC45YTIyLjEgMjIuMSAwIDEgMCAtMjIuNC0zOCAyMi4xIDIyLjEgMCAxIDAgMjIuNCAzOHptLTE5MS4xIDU4YTE2LjkgMTYuOSAwIDEgMCAtMTguOC0yOCAxNi45IDE2LjkgMCAxIDAgMTguOCAyOHptMzcyLjMgMTU2Yy03LjQgMS43LTEyLjMgOS4xLTEwLjYgMTYuOSAxLjQgNy40IDguOSAxMi4zIDE2LjMgMTAuNiA3LjQtMS40IDEyLjMtOC45IDEwLjYtMTYuNi0xLjUtNy40LTguOS0xMi4zLTE2LjMtMTAuOXptMzkuNy01Ni44YTEwLjEgMTAuMSAwIDEgMCAtMTkuOCA0LjMgMTAuMSAxMC4xIDAgMSAwIDE5LjgtNC4zem0tODAuMy03My43YTE4LjggMTguOCAwIDEgMCAyMC43IDMxLjMgMTguOCAxOC44IDAgMSAwIC0yMC43LTMxLjN6bS02LjMgMTM5LjRjMjYuMyA0My4xIDE1LjEgMTAwLTI2LjMgMTI5LjEtMTcuNCAxMi4zLTM3LjEgMTcuNy01Ni45IDE3LjEtMTIgNDcuMS02OS40IDY0LjYtMTA1LjEgMzIuNi0xLjEgLjktMi42IDEuNy0zLjcgMi45LTM5LjEgMjcuMS05Mi4zIDE3LjQtMTE5LjQtMjIuMy05LjctMTQuMy0xNC42LTMwLjYtMTUuMS00Ni45LTY1LjQtMTAuOS05MC05NC00MS4xLTEzOS43LTI4LjMtNDYuOSAuNi0xMDcuNCA1My40LTExNC45IDI1LjEtNjYuMiAxMDcuNi05Ny42IDE2My42LTU0LjIgNjcuNC0yMi4zIDEzNi4zIDI5LjQgMTMwLjkgMTAxLjEgNDEuMSAxMi42IDUyLjggNjYuOSAxOS43IDk1LjJ6bS03MCA3NC4zYy0zLjEtMjAuNi00MC45LTQuNi00My4xLTI3LjEtMy4xLTMyIDQzLjctMTAxLjEgNDAtMTI4LTMuNC0yNC0xOS40LTI5LjEtMzMuNC0yOS40LTEzLjQtLjMtMTYuOSAyLTIxLjQgNC42LTIuOSAxLjctNi42IDQuOS0xMS43LS4zLTYuMy02LTExLjEtMTEuNy0xOS40LTEyLjktMTIuMy0yLTE3LjcgMi0yNi42IDkuNy0zLjQgMi45LTEyIDEyLjktMjAgOS4xLTMuNC0xLjctMTUuNC03LjctMjQtMTEuNC0xNi4zLTcuMS00MCA0LjYtNDguNiAyMC0xMi45IDIyLjktMzggMTEzLjEtNDEuNyAxMjUuMS04LjYgMjYuNiAxMC45IDQ4LjYgMzYuOSA0Ny4xIDExLjEtLjYgMTguMy00LjYgMjUuNC0xNy40IDQtNy40IDQxLjctMTA3LjcgNDQuNi0xMTIuNiAyLTMuNCA4LjktOCAxNC42LTUuMSA1LjcgMy4xIDYuOSA5LjQgNiAxNS4xLTEuMSA5LjctMjggNzAuOS0yOC45IDc3LjctMy40IDIyLjkgMjYuOSAyNi42IDM4LjYgNCAzLjctNy4xIDQ1LjctOTIuNiA0OS40LTk4LjMgNC4zLTYuMyA3LjQtOC4zIDExLjctOCAzLjEgMCA4LjMgLjkgNy4xIDEwLjktMS40IDkuNC0zNS4xIDcyLjMtMzguOSA4Ny43LTQuNiAyMC42IDYuNiA0MS40IDI0LjkgNTAuNiAxMS40IDUuNyA2Mi41IDE1LjcgNTguNS0xMS4xem01LjcgOTIuM2EyMy4zIDIzLjMgMCAxIDAgMjYuMiAzOC40IDIzLjMgMjMuMyAwIDEgMCAtMjYuMi0zOC40eiJdCiAgICB9OwogICAgZmFGb250aWNvbnNGaSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmb250aWNvbnMtZmkiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjNhMiIsICJNMTE0LjQgMjI0bDkyLjQgMC0xNS4yIDUxLjItNzYuNCAwIDAgMTU3LjhjMCA4LTIuOCA5LjIgNC40IDEwbDU5LjYgNS42IDAgMzQuNC0xNzkuMiAwIDAtMzUuMiAyOS4yLTIuOGM3LjItLjggOS4yLTMuMiA5LjItMTAuOGwwLTE1NS44YzAtMy4yLTQtMy4yLTgtMy4ybC0zMC40IDAgMC01MS4yIDM4LjQgMCAwLTI4LjhjMC02OCAzNi40LTk2IDEwNi05NiA0Ni44IDAgODguOCAxMS4yIDg4LjggNzIuNEwxNjMuNiAxODBjLjQtMjUuNi02LTMxLjYtMjIuNC0zMS42LTI1LjIgMC0yNiAxMy42LTI2IDM3LjZsMCAzMmMwIDMuMi00LjggNi0uOCA2ek0zODQgNDgzbC0xNDAuOCAwIDAtMzQuNCAyOC0zLjZjNy4yLS44IDEwLjQtMi40IDEwLjQtMTBsMC0xNDhjMC01LjYtNC05LjItOS4yLTEwLjhsLTMzLjItOC44IDkuMi00MC40IDExMCAwIDAgMjA4YzAgOC0zLjYgOC44IDQgMTBsMjEuNiAzLjYgMCAzNC40ek0zNTQgMTM1LjhsMTIuNCA0NS42LTEwIDEwLTQyLjgtMjIuOC00Mi44IDIyLjgtMTAtMTAgMTIuNC00NS42LTMwLTM2LjQgNC44LTEwIDM4IDAgMjEuMi0zOC40IDEyLjggMCAyMS4yIDM4LjQgMzggMCA0LjggMTMuMi0zMCAzMy4yeiJdCiAgICB9OwogICAgZmFQYWxmZWQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicGFsZmVkIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYzZDgiLCAiTTM4NC45IDE5My45YzAtNDcuNC01NS4yLTQ0LjItOTUuNC0yOS44LTEuMyAzOS40LTIuNSA4MC43LTMgMTE5LjggLjcgMi44IDIuNiA2LjIgMTUuMSA2LjIgMzYuOCAwIDgzLjQtNDIuOCA4My4zLTk2LjJ6TTE5MC40IDI2Ni4xYy4yIDAgNi41LTIuNyAxMS4yLTIuNyAyNi42IDAgMjAuNyA0NC4xLTE0LjQgNDQuMS0yMS41IDAtMzcuMS0xOC4xLTM3LjEtNDMgMC00MiA0Mi45LTk1LjYgMTAwLjctMTI2LjUgMS0xMi40IDMtMjIgMTAuNS0yOC4yIDExLjItOSAyNi42LTMuNSAyOS41IDExLjEgNzIuMi0yMi4yIDEzNS4yIDEgMTM1LjIgNzIgMCA3Ny45LTc5LjMgMTUyLjYtMTQwLjEgMTM4LjItLjEgMzkuNCAuOSA3NC40IDIuNyAxMDBsMCAuMmMuMiAzLjQgLjYgMTIuNS01LjMgMTkuMS05LjYgMTAuNi0zMy40IDEwLTM2LjQtMjIuMy00LjEtNDQuNCAuMi0yMDYuMSAxLjQtMjQyLjUtMjEuNSAxNS01OC41IDUwLjMtNTguNSA3NS45IC4yIDIuNSAuNCA0IC42IDQuNnpNOCAxODEuMXMtLjEgMzcuNCAzOC40IDM3LjRsMzAgMCAyMi40IDIxNy4yczAgNDQuMyA0NC43IDQ0LjNsMjg4LjkgMHM0NC43LS40IDQ0LjctNDQuM2wyMi40LTIxNy4yIDMwIDBzMzguNCAxLjIgMzguNC0zNy40YzAgMCAuMS0zNy40LTM4LjQtMzcuNGwtMzAuMSAwYy03LjMtMjUuNi0zMC4yLTc0LjMtMTE5LjQtNzQuM2wtMjggMCAwLTE5LjFzLTIuNy0xOC40LTIxLjEtMTguNGwtODUuOCAwUzIyNCAzMS45IDIyNCA1MC4zbDAgMTkuMS0yOC4xIDBzLTEwNSA0LjItMTIwLjUgNzQuM2wtMjkgMFM4IDE0Mi41IDggMTgxLjF6Il0KICAgIH07CiAgICBmYVdwYmVnaW5uZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAid3BiZWdpbm5lciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjk3IiwgIk00NjMuMiAzMjIuNGM1Ni4yIDY0LjMgNC4yIDE1Ny42LTkxLjkgMTU3LjYtMzkuNiAwLTc4LjgtMTcuNy0xMDAuMS01MC02LjkgLjQtMjIuNyAuNC0yOS42IDAtMjEuNCAzMi40LTYwLjYgNTAtMTAwLjEgNTAtOTUuNSAwLTE0OC4zLTkzLTkxLjktMTU3LjYtNzkuMS0xMzEuOSAzMS4zLTI5MC40IDIwNi44LTI5MC40IDE3NS42IDAgMjg1LjkgMTU4LjYgMjA2LjggMjkwLjR6bS0zMzkuNi04M2w0MS41IDAgMC01OC4xLTQxLjUgMCAwIDU4LjF6bTIxNy4yIDg2LjFsMC0yMy44Yy02MC41IDIwLjktMTMyLjQgOS4yLTE4Ny42LTM0bC4yIDI0LjljNTEuMSA0Ni40IDEzMS43IDU3LjkgMTg3LjMgMzIuOXpNMTkwIDIzOS40bDE2Ni4xIDAgMC01OC4xLTE2Ni4xIDAgMCA1OC4xeiJdCiAgICB9OwogICAgZmFEaWFzcG9yYSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJkaWFzcG9yYSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNzkxIiwgIk0yMTkuNyAzNTQuNmMtMS40IDAtODggMTE5LjktODguNyAxMTkuOVM0NC40IDQxNCA0NCA0MTMuMyAxMzAuNiAyODcuNSAxMzAuNiAyODUuOGMwLTIuMi0xMjkuNi00NC0xMzcuNi00Ny4xLTEuMy0uNSAzMS40LTEwMS44IDMxLjctMTAyLjEgLjYtLjcgMTQ0LjQgNDcgMTQ1LjUgNDcgLjQgMCAuOS0uNiAxLTEuMyAuNC0yIDEtMTQ4LjYgMS43LTE0OS42IC44LTEuMiAxMDQuNS0uNyAxMDUuMS0uMyAxLjUgMSAzLjUgMTU2LjEgNi4xIDE1Ni4xIDEuNCAwIDEzOC43LTQ3IDEzOS4zLTQ2LjMgLjggLjkgMzEuOSAxMDIuMiAzMS41IDEwMi42LS45IC45LTE0MC4yIDQ3LjEtMTQwLjYgNDguOC0uMyAxLjQgODIuOCAxMjIuMSA4Mi41IDEyMi45cy04NS41IDYzLjUtODYuMyA2My41Yy0xLS4yLTg5LTEyNS41LTkwLjktMTI1LjVsMCAweiJdCiAgICB9OwogICAgZmFQcm9kdWN0SHVudCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwcm9kdWN0LWh1bnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjI4OCIsICJNMzI2LjMgMjE4LjhjMCAyMC41LTE2LjcgMzcuMi0zNy4yIDM3LjJsLTcwLjMgMCAwLTc0LjQgNzAuMyAwYzIwLjUgMCAzNy4yIDE2LjcgMzcuMiAzNy4yek04IDI1NmEyNDggMjQ4IDAgMSAxIDQ5NiAwIDI0OCAyNDggMCAxIDEgLTQ5NiAwem0zNjcuOS0zNy4yYzAtNDcuOS0zOC45LTg2LjgtODYuOC04Ni44bC0xMTkuOSAwIDAgMjQ4IDQ5LjYgMCAwLTc0LjQgNzAuMyAwYzQ3LjkgMCA4Ni44LTM4LjkgODYuOC04Ni44eiJdCiAgICB9OwogICAgZmFTcXVhcmVVcHdvcmsgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXVwd29yayIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNjdjIiwgIk01NiAzMmwzMzYgMGMzMC45IDAgNTYgMjUuMSA1NiA1NmwwIDMzNmMwIDMwLjktMjUuMSA1Ni01NiA1Nkw1NiA0ODBjLTMwLjkgMC01Ni0yNS4xLTU2LTU2TDAgODhDMCA1Ny4xIDI1LjEgMzIgNTYgMzJ6TTI3MC45IDI3NC4yYzYuNi01Mi45IDI1LjktNjkuNSA1MS40LTY5LjUgMjUuMyAwIDQ0LjkgMjAuMiA0NC45IDQ5LjdzLTE5LjcgNDkuNy00NC45IDQ5LjdjLTI3LjkgMC00Ni4zLTIxLjUtNTEuNC0yOS45em0tMjYuNy00MS44Yy04LjItMTUuNS0xNC4zLTM2LjMtMTkuMi01NS42bC02Mi45IDAgMCA3OC4xYzAgMjguNC0xMi45IDQ5LjQtMzguMiA0OS40Uzg0LjEgMjgzLjQgODQuMSAyNTVsLjMtNzguMS0zNi4yIDAgMCA3OC4xYzAgMjIuOCA3LjQgNDMuNSAyMC45IDU4LjIgMTMuOSAxNS4yIDMyLjggMjMuMiA1NC44IDIzLjIgNDMuNyAwIDc0LjItMzMuNSA3NC4yLTgxLjVsMC01Mi41YzQuNiAxNy4zIDE1LjQgNTAuNSAzNi4yIDc5LjdsLTE5LjMgMTEwLjUgMzYuOCAwIDEyLjgtNzguNGM0LjIgMy41IDguNyA2LjYgMTMuNCA5LjQgMTIuMyA3LjggMjYuNCAxMi4yIDQwLjkgMTIuNmwzLjQgMGM0NS4xIDAgODAuOS0zNC45IDgwLjktODEuOXMtMzUuOS04Mi4yLTgwLjktODIuMmMtNDUuNCAwLTcwLjkgMjkuNy03OC4xIDYwLjFsMCAuMnoiXQogICAgfTsKICAgIGZhQ3V0dGxlZmlzaCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjdXR0bGVmaXNoIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzOGMiLCAiTTM0OCAzMDUuNWMtMTcuNSAzMS42LTU3LjQgNTQuNS05NiA1NC41LTU2LjYgMC0xMDQtNDcuNC0xMDQtMTA0czQ3LjQtMTA0IDEwNC0xMDRjMzguNiAwIDc4LjUgMjIuOSA5NiA1NC41IDEzLjctNTAuOSA0MS43LTkzLjMgODctMTE3LjgtNDUuMy00OS42LTExMC41LTgwLjctMTgzLTgwLjctMTM3IDAtMjQ4IDExMS0yNDggMjQ4UzExNSA1MDQgMjUyIDUwNGM3Mi41IDAgMTM3LjctMzEuMSAxODMtODAuNy00NS4zLTI0LjUtNzMuMy02Ni45LTg3LTExNy44eiJdCiAgICB9OwogICAgZmFNZWRhcHBzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1lZGFwcHMiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZjNjNiIsICJNMTE4LjMgMjM4LjRjMy41LTEyLjUgNi45LTMzLjYgMTMuMi0zMy42IDguMyAxLjggOS42IDIzLjQgMTguNiAzNi42IDQuNi0yMy41IDUuMy04NS4xIDE0LjEtODYuNyA5LS43IDE5LjcgNjYuNSAyMiA3Ny41IDkuOSA0LjEgNDguOSA2LjYgNDguOSA2LjYgMS45IDcuMy0yNCA3LjYtNDAgNy44LTQuNiAxNC44LTUuNCAyNy43LTExLjQgMjgtNC43IC4yLTguMi0yOC44LTE3LjUtNDkuNmwtOS40IDY1LjVjLTQuNCAxMy0xNS41LTIyLjUtMjEuOS0zOS4zLTMuMy0uMS02Mi40LTEuNi00Ny42LTcuOGwzMS01ek0yMjggNDQ4YzIxLjIgMCAyMS4yLTMyIDAtMzJMOTIgNDE2Yy0yMS4yIDAtMjEuMiAzMiAwIDMybDEzNiAwem0tMjQgNjRjMjEuMiAwIDIxLjItMzIgMC0zMmwtODggMGMtMjEuMiAwLTIxLjIgMzIgMCAzMmw4OCAwem0zNC4yLTE0MS41YzMuMi0xOC45IDUuMi0zNi40IDExLjktNDguOCA3LjktMTQuNyAxNi4xLTI4LjEgMjQtNDEgMjQuNi00MC40IDQ1LjktNzUuMiA0NS45LTEyNS41IDAtODUuNi03MS44LTE1NS4yLTE2MC0xNTUuMlMwIDY5LjYgMCAxNTUuMmMwIDUwLjIgMjEuMyA4NS4xIDQ1LjkgMTI1LjUgNy45IDEyLjkgMTYgMjYuMyAyNCA0MSA2LjcgMTIuNSA4LjcgMjkuOCAxMS45IDQ4LjkgMy41IDIxIDM2LjEgMTUuNyAzMi42LTUuMS0zLjYtMjEuNy01LjYtNDAuNy0xNS4zLTU4LjYtMzIuNi02MC40LTY2LjEtOTUuNi02Ni4xLTE1MS43IDAtNjcuOSA1Ny0xMjMuMiAxMjctMTIzLjJTMjg3IDg3LjMgMjg3IDE1NS4yYzAgNTYuMS0zMy41IDkxLjMtNjYuMSAxNTEuNi05LjcgMTgtMTEuNyAzNy40LTE1LjMgNTguNi0zLjQgMjAuNiAyOSAyNi40IDMyLjYgNS4xeiJdCiAgICB9OwogICAgZmFQaXggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicGl4IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU0M2EiLCAiTTI0Mi40IDI5Mi41YzUuNC01LjQgMTQuNy01LjQgMjAuMSAwbDc3IDc3YzE0LjIgMTQuMiAzMy4xIDIyIDUzLjEgMjJsMTUuMSAwLTk3LjEgOTcuMWMtMzAuMyAyOS41LTc5LjUgMjkuNS0xMDkuOCAwbC05Ny41LTk3LjQgOS4zIDBjMjAgMCAzOC45LTcuOCA1My4xLTIybDc2LjctNzYuN3ptMjAuMS03My42Yy02LjQgNS41LTE0LjYgNS42LTIwLjEgMGwtNzYuNy03Ni43Yy0xNC4yLTE1LjEtMzMuMS0yMi01My4xLTIybC05LjMgMCA5Ny40LTk3LjRjMzAuNC0zMC4zIDc5LjYtMzAuMyAxMDkuOSAwbDk3LjIgOTcuMS0xNS4yIDBjLTIwIDAtMzguOSA3LjgtNTMuMSAyMmwtNzcgNzd6TTExMi42IDE0Mi43YzEzLjggMCAyNi41IDUuNiAzNy4xIDE1LjRsNzYuNyA3Ni43YzcuMiA2LjMgMTYuNiAxMC44IDI2LjEgMTAuOCA5LjQgMCAxOC44LTQuNSAyNi0xMC44bDc3LTc3YzkuOC05LjcgMjMuMy0xNS4zIDM3LjEtMTUuM2wzNy43IDAgNTguMyA1OC4zYzMwLjMgMzAuMyAzMC4zIDc5LjUgMCAxMDkuOGwtNTguMyA1OC4zLTM3LjcgMGMtMTMuOCAwLTI3LjMtNS42LTM3LjEtMTUuNGwtNzctNzdjLTEzLjktMTMuOS0zOC4yLTEzLjktNTIuMSAuMWwtNzYuNyA3Ni42Yy0xMC42IDkuOC0yMy4zIDE1LjQtMzcuMSAxNS40bC0zMS44IDAtNTgtNThjLTMwLjMtMzAuMy0zMC4zLTc5LjUgMC0xMDkuOGw1OC01OC4xIDMxLjggMHoiXQogICAgfTsKICAgIGZhU3F1YXJlVHVtYmxyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS10dW1ibHIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsidHVtYmxyLXNxdWFyZSJdLCAiZjE3NCIsICJNNDQ4IDk2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjB6TTI1Ni44IDQxNmMtNzUuNSAwLTkxLjktNTUuNS05MS45LTg3LjlsMC05MC0yOS43IDBjLTMuNCAwLTYuMi0yLjgtNi4yLTYuMmwwLTQyLjVjMC00LjUgMi44LTguNSA3LjEtMTAgMzguOC0xMy43IDUwLjktNDcuNSA1Mi43LTczLjIgLjUtNi45IDQuMS0xMC4yIDEwLTEwLjJsNDQuMyAwYzMuNCAwIDYuMiAyLjggNi4yIDYuMmwwIDcyIDUxLjkgMGMzLjQgMCA2LjIgMi44IDYuMiA2LjJsMCA1MS4xYzAgMy40LTIuOCA2LjItNi4yIDYuMmwtNTIuMSAwIDAgODMuM2MwIDIxLjQgMTQuOCAzMy41IDQyLjUgMjIuNCAzLTEuMiA1LjYtMiA4LTEuNCAyLjIgLjUgMy42IDIuMSA0LjYgNC45TDMxOCAzODcuMWMxIDMuMiAyIDYuNy0uMyA5LjEtOC41IDkuMS0zMS4yIDE5LjgtNjAuOSAxOS44eiJdCiAgICB9OwogICAgZmFUdW1ibHJTcXVhcmUgPSBmYVNxdWFyZVR1bWJscjsKICAgIGZhUmVhY3QgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicmVhY3QiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjQxYiIsICJNNDE4LjIgMTc3LjJjLTUuNC0xLjgtMTAuOC0zLjUtMTYuMi01LjEgLjktMy43IDEuNy03LjQgMi41LTExLjEgMTIuMy01OS42IDQuMi0xMDcuNS0yMy4xLTEyMy4zLTI2LjMtMTUuMS02OS4yIC42LTExMi42IDM4LjQtNC4zIDMuNy04LjUgNy42LTEyLjUgMTEuNS0yLjctMi42LTUuNS01LjItOC4zLTcuNy00NS41LTQwLjQtOTEuMS01Ny40LTExOC40LTQxLjUtMjYuMiAxNS4yLTM0IDYwLjMtMjMgMTE2LjcgMS4xIDUuNiAyLjMgMTEuMSAzLjcgMTYuNy02LjQgMS44LTEyLjcgMy44LTE4LjYgNS45LTUzLjQgMTguNS05MS43IDQ3LjctOTEuNyA3Ny45IDAgMzEuMiA0MC44IDYyLjUgOTYuMyA4MS41IDQuNSAxLjUgOSAzIDEzLjYgNC4zLTEuNSA2LTIuOCAxMS45LTQgMTgtMTAuNSA1NS41LTIuMyA5OS41IDIzLjkgMTE0LjYgMjcgMTUuNiA3Mi40LS40IDExNi42LTM5LjEgMy41LTMuMSA3LTYuMyAxMC41LTkuNyA0LjQgNC4zIDkgOC40IDEzLjYgMTIuNCA0Mi44IDM2LjggODUuMSA1MS43IDExMS4yIDM2LjYgMjctMTUuNiAzNS44LTYyLjkgMjQuNC0xMjAuNS0uOS00LjQtMS45LTguOS0zLTEzLjUgMy4yLS45IDYuMy0xLjkgOS40LTIuOSA1Ny43LTE5LjEgOTkuNS01MCA5OS41LTgxLjcgMC0zMC4zLTM5LjQtNTkuNy05My44LTc4LjR6TTI4Mi45IDkyLjNjMzcuMi0zMi40IDcxLjktNDUuMSA4Ny43LTM2IDE2LjkgOS43IDIzLjQgNDguOSAxMi44IDEwMC40LS43IDMuNC0xLjQgNi43LTIuMyAxMC0yMi4yLTUtNDQuNy04LjYtNjcuMy0xMC42LTEzLTE4LjYtMjcuMi0zNi40LTQyLjYtNTMuMSAzLjktMy43IDcuNy03LjIgMTEuNy0xMC43ek0xNjcuMiAzMDcuNWM1LjEgOC43IDEwLjMgMTcuNCAxNS44IDI1LjktMTUuNi0xLjctMzEuMS00LjItNDYuNC03LjUgNC40LTE0LjQgOS45LTI5LjMgMTYuMy00NC41IDQuNiA4LjggOS4zIDE3LjUgMTQuMyAyNi4xek0xMzYuOSAxODcuMmMxNC40LTMuMiAyOS43LTUuOCA0NS42LTcuOC01LjMgOC4zLTEwLjUgMTYuOC0xNS40IDI1LjQtNC45IDguNS05LjcgMTcuMi0xNC4yIDI2LTYuMy0xNC45LTExLjYtMjkuNS0xNi00My42em0yNy40IDY4LjljNi42LTEzLjggMTMuOC0yNy4zIDIxLjQtNDAuNnMxNS44LTI2LjIgMjQuNC0zOC45YzE1LTEuMSAzMC4zLTEuNyA0NS45LTEuN3MzMSAuNiA0NS45IDEuN2M4LjUgMTIuNiAxNi42IDI1LjUgMjQuMyAzOC43czE0LjkgMjYuNyAyMS43IDQwLjRjLTYuNyAxMy44LTEzLjkgMjcuNC0yMS42IDQwLjgtNy42IDEzLjMtMTUuNyAyNi4yLTI0LjIgMzktMTQuOSAxLjEtMzAuNCAxLjYtNDYuMSAxLjZzLTMwLjktLjUtNDUuNi0xLjRjLTguNy0xMi43LTE2LjktMjUuNy0yNC42LTM5cy0xNC44LTI2LjgtMjEuNS00MC42em0xODAuNiA1MS4yYzUuMS04LjggOS45LTE3LjcgMTQuNi0yNi43IDYuNCAxNC41IDEyIDI5LjIgMTYuOSA0NC4zLTE1LjUgMy41LTMxLjIgNi4yLTQ3IDggNS40LTguNCAxMC41LTE3IDE1LjUtMjUuNnptMTQuNC03Ni41Yy00LjctOC44LTkuNS0xNy42LTE0LjUtMjYuMi00LjktOC41LTEwLTE2LjktMTUuMy0yNS4yIDE2LjEgMiAzMS41IDQuNyA0NS45IDgtNC42IDE0LjgtMTAgMjkuMi0xNi4xIDQzLjR6TTI1Ni4yIDExOC4zYzEwLjUgMTEuNCAyMC40IDIzLjQgMjkuNiAzNS44LTE5LjgtLjktMzkuNy0uOS01OS41IDAgOS44LTEyLjkgMTkuOS0yNC45IDI5LjktMzUuOHpNMTQwLjIgNTdjMTYuOC05LjggNTQuMSA0LjIgOTMuNCAzOSAyLjUgMi4yIDUgNC42IDcuNiA3LTE1LjUgMTYuNy0yOS44IDM0LjUtNDIuOSA1My4xLTIyLjYgMi00NSA1LjUtNjcuMiAxMC40LTEuMy01LjEtMi40LTEwLjMtMy41LTE1LjUtOS40LTQ4LjQtMy4yLTg0LjkgMTIuNi05NHpNMTE1LjcgMzIwLjZjLTQuMi0xLjItOC4zLTIuNS0xMi40LTMuOS0yMS4zLTYuNy00NS41LTE3LjMtNjMtMzEuMi0xMC4xLTctMTYuOS0xNy44LTE4LjgtMjkuOSAwLTE4LjMgMzEuNi00MS43IDc3LjItNTcuNiA1LjctMiAxMS41LTMuOCAxNy4zLTUuNSA2LjggMjEuNyAxNSA0MyAyNC41IDYzLjYtOS42IDIwLjktMTcuOSA0Mi41LTI0LjggNjQuNXptMTE2LjYgOThjLTE2LjUgMTUuMS0zNS42IDI3LjEtNTYuNCAzNS4zLTExLjEgNS4zLTIzLjkgNS44LTM1LjMgMS4zLTE1LjktOS4yLTIyLjUtNDQuNS0xMy41LTkyIDEuMS01LjYgMi4zLTExLjIgMy43LTE2LjcgMjIuNCA0LjggNDUgOC4xIDY3LjkgOS44IDEzLjIgMTguNyAyNy43IDM2LjYgNDMuMiA1My40LTMuMiAzLjEtNi40IDYuMS05LjYgOC45em0yNC41LTI0LjNjLTEwLjItMTEtMjAuNC0yMy4yLTMwLjMtMzYuMyA5LjYgLjQgMTkuNSAuNiAyOS41IC42IDEwLjMgMCAyMC40LS4yIDMwLjQtLjctOS4yIDEyLjctMTkuMSAyNC44LTI5LjYgMzYuNHptMTMwLjcgMzBjLS45IDEyLjItNi45IDIzLjYtMTYuNSAzMS4zLTE1LjkgOS4yLTQ5LjgtMi44LTg2LjQtMzQuMi00LjItMy42LTguNC03LjUtMTIuNy0xMS41IDE1LjMtMTYuOSAyOS40LTM0LjggNDIuMi01My42IDIyLjktMS45IDQ1LjctNS40IDY4LjItMTAuNSAxIDQuMSAxLjkgOC4yIDIuNyAxMi4yIDQuOSAyMS42IDUuNyA0NC4xIDIuNSA2Ni4zem0xOC4yLTEwNy41Yy0yLjggLjktNS42IDEuOC04LjUgMi42LTctMjEuOC0xNS42LTQzLjEtMjUuNS02My44IDkuNi0yMC40IDE3LjctNDEuNCAyNC41LTYyLjkgNS4yIDEuNSAxMC4yIDMuMSAxNSA0LjcgNDYuNiAxNiA3OS4zIDM5LjggNzkuMyA1OCAwIDE5LjYtMzQuOSA0NC45LTg0LjggNjEuNHpNMjU2IDMwMS44YTQ1LjggNDUuOCAwIDEgMCAwLTkxLjYgNDUuOCA0NS44IDAgMSAwIDAgOTEuNnoiXQogICAgfTsKICAgIGZhSHVnZ2luZ0ZhY2UgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaHVnZ2luZy1mYWNlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU4NjkiLCAiTTI4Ni44IDguMmMxMzAgMCAyMzUuNCAxMDUuOCAyMzUuNCAyMzYuMyAwIDE3LjctMS45IDM1LTUuNiA1MS43LTEuNCA2LjUtMy4xIDEyLjgtNS4xIDE5LjEgNi41LS42IDEzIC42IDE4LjcgMy41IDEyLjYgNi41IDIwLjIgMjEuNyAxOC4yIDM1LjctLjcgNC45LTIuNCA5LjQtNC44IDEzLjUgNS4yIDQuMiA5IDEwLjEgMTAuOCAxNy4xIDEuNCA1LjUgMi45IDE3LjEtNC44IDI4LjkgNS44IDkuMiA2LjYgMjAuNiAyLjIgMzAuNi02LjIgMTQuMS0yMS43IDI1LjMtNTEuNyAzNy4zLTMyLjUgMTMtNjcuMSAyMS45LTEwMi4zIDIxLjktMzIgMC01NS45LTguOS03MS0yNi40LTEzIDIuMi0yNi4zIDMuNC00MCAzLjQtMTIuNyAwLTI1LjItMS0zNy4zLTIuOS0xNS4xIDE3LjItMzguOCAyNS45LTcwLjYgMjUuOS0zNS4xIDAtNzAtOS0xMDIuNC0yMS45LTMwLTEyLTQ1LjUtMjMuMS01MS43LTM3LjMtNC40LTkuOS0zLjYtMjEuNCAyLjItMzAuNi03LjctMTEuOS02LjMtMjMuNC00LjgtMjguOSAxLjgtNyA1LjctMTIuOSAxMC44LTE3LjEtMi41LTQuMS00LjEtOC42LTQuOC0xMy41LTEuNS0xMC40IDItMjAuNyA5LjctMjkuMiA2LjEtNi43IDE1LjEtMTAuMyAyNC4yLTEwLjItMS45LTYuMS0zLjYtMTIuNC01LTE4LjctMy43LTE2LjctNS43LTM0LTUuNy01MS44IDAtMTMwLjUgMTA1LjQtMjM2LjMgMjM1LjQtMjM2LjN6TTExNy41IDMxMWMtMTMtOC4yLTIyLjEtMy42LTE5IDEzLjRzNTcuMiA1OC4yIDUyIDY3LjJjLTUuMiA4LjgtMjMuNS0xMC4xLTIzLjgtMTAuNSAwIDAtNTguMi01My4xLTcwLjgtMzkuMy0xMi42IDEzLjggOS42IDI1LjQgNDEuMyA0NC43czM0LjIgMjQuNCAyOS43IDMxLjctNzQuNS01Mi04MS4xLTI2LjhjLTYuNSAyNS4xIDcxLjQgMzIuNCA2Ni43IDQ5LjgtNC44IDE3LjQtNTQuOS0zMi44LTY1LjItMTMuMy0xMC4zIDE5LjYgNzAuOCA0Mi42IDcxLjQgNDIuNyAyNi4yIDYuOCA5Mi42IDIxLjMgMTE1LjktMTIuOSAxNi43LTI0LjYgMTUuNi00My4xLTcuNC02Ni4xcy0zNi4zLTU2LjctMzYuMy01Ni43YzAtLjItNS0xOS41LTE2LjMtMTcuOC0xMS40IDEuOC0xOS43IDMxIDQuMSA0OC45IDIzLjggMTcuOS00LjcgMzAtMTMuOSAxMy4zLTkuMi0xNi44LTM0LjItNTkuOS00Ny4xLTY4LjJ6bTM2MC42IDEzLjRjMy4xLTE3LTYuMS0yMS42LTE5LTEzLjQtMTMgOC4zLTM3LjkgNTEuNC00Ny4xIDY4LjJzLTM3LjcgNC42LTEzLjktMTMuMyAxNS40LTQ3LjEgNC4xLTQ4LjktMTYuMyAxNy44LTE2LjMgMTcuOGMtLjEgLjItMTMuNCAzMy43LTM2LjMgNTYuNy0yMi45IDIzLTI0LjEgNDEuNS03LjQgNjYuMSAyMy4yIDM0LjIgODkuNyAxOS43IDExNS45IDEyLjkgMS41LS40IDgxLjYtMjMuMyA3MS40LTQyLjctMTAuMy0xOS41LTYwLjQgMzAuNi02NS4zIDEzLjMtNC44LTE3LjMgNzMuMi0yNC42IDY2LjctNDkuOC02LjYtMjUuMS03Ni42IDM0LjEtODEuMSAyNi44LTQuNS03LjMtMi0xMi40IDI5LjctMzEuNyAzMS43LTE5LjMgNTQtMzAuOSA0MS4zLTQ0LjctMTIuNy0xMy44LTcwLjggMzkuMy03MC44IDM5LjMtLjQgLjQtMTguNiAxOS4zLTIzLjggMTAuNS01LjMtOC45IDQ4LjktNTAuMSA1Mi02Ny4yek0yODYuOCAzMi42Yy0xMTYuNiAwLTIxMS4xIDk0LjktMjExLjEgMjExLjkgMCAxNy4xIDIgMzMuOCA1LjggNDkuNyAwLS4xIC4xLS4xIC4yLS4yIDYuMS03LjQgMTQuOS0xMS40IDI0LjctMTEuNCAxNy43IDAgMzEuMSAxMS45IDQxLjUgMjQuOSA2LjgtOS40IDE3LjEtMTUgMjcuOS0xNSAyMC43IDAgMzMuMiAxOC4xIDM3LjkgMzQuMyAyLjMgNS41IDEzLjYgMzAuNSAzMC40IDQ3LjQgMjUuNyAyNS44IDMyLjIgNTIuNCAxOS40IDgwLjkgMTYgMS44IDMyLjggMS43IDQ5LjItLjMtMTIuNS0yOC40LTYtNTQuOSAxOS42LTgwLjYgMTYuOS0xNi45IDI4LjEtNDEuOSAzMC41LTQ3LjQgNC43LTE2LjIgMTcuMi0zNC4zIDM3LjktMzQuMyAxMC45IDAgMjEuMiA1LjYgMjcuOSAxNSAxMC40LTEzIDIzLjgtMjQuOSA0MS41LTI0LjkgOC43IDAgMTYuNiAzLjEgMjIuNSA4LjkgNS0yMiA2LjQtNDUuOCA0LjEtNjguNy0xMC44LTEwNi45LTEwMC43LTE5MC4zLTIxMC0xOTAuM3ptMS41IDIzNC4yYzQzLjYgMCA3OS00MiA3OS0xNC41IDAgMjcuNC0xOS4yIDgwLjktNzguOCA4MC45LTE5LjIgMC0zNC4yLTUuNS00NS44LTEzLjktMjMuMi0xOS40LTMzLjQtNDguMi0zMy40LTY2LjkgMC0yNy40IDM1LjQgMTQuNSA3OSAxNC41em0tMTMuMyAyNWMtOC4yIDIuNC0xNS41IDYuOC0yMS41IDEyLjYgMjIgMTIuOCA1MC40IDEyLjkgNzEuNy0xLjMtNS41LTQuOS0xMi04LjctMTkuMS0xMS01LjEtMS42LTEwLjQgMTUuOC0xNiAxNS44LTUuMiAwLTEwLjMtMTcuNi0xNS4xLTE2LjJ6TTE0Ny4xIDIxNS41YTE5LjggMTkuOCAwIDEgMSAwLTM5LjYgMTkuOCAxOS44IDAgMSAxIDAgMzkuNnptMjgyLjQgMGExOS44IDE5LjggMCAxIDEgMC0zOS42IDE5LjggMTkuOCAwIDEgMSAwIDM5LjZ6bS0yNDQtNTUuNGM3LjktMTQuOSAyNi4zLTIwLjUgNDEuMS0xMi42czIwLjQgMjYuNCAxMi42IDQxLjJjLTMuNyA3LTE1LjUtNC40LTIyLjQtMS45LTcuNyAyLjctMTAuOCAxOC43LTE4LjYgMTQuNi0xNC44LTcuOS0yMC40LTI2LjQtMTIuNi00MS4yem0xNjQuNC0xMi42YzE0LjgtNy45IDMzLjItMi4zIDQxLjEgMTIuNnMyLjIgMzMuMy0xMi42IDQxLjJjLTcuOCA0LjItMTAuOS0xMS44LTE4LjctMTQuNi02LjktMi40LTE4LjcgOS0yMi40IDEuOS03LjktMTQuOS0yLjItMzMuMyAxMi42LTQxLjJ6Il0KICAgIH07CiAgICBmYUp4bCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJqeGwiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTY3YiIsICJNNDEyLjIgMzJMMzUuOCAzMkMxNiAzMiAwIDQ4IDAgNjcuOEwwIDQ0NC4yQzAgNDY0IDE2IDQ4MCAzNS44IDQ4MGwzNzYuNCAwYzE5LjggMCAzNS44LTE2IDM1LjgtMzUuOGwwLTM3Ni40QzQ0OCA0OCA0MzIgMzIgNDEyLjIgMzJ6TTM3OC42IDMzMy43YzAgNDAuMi0zMi42IDcyLjgtNzIuOCA3Mi44bC0yMzUuNiAwYzAtNDAuMiAzMi42LTcyLjggNzIuOC03Mi44bDIzNS42IDB6bTAtMTEzLjljMCA0MC4yLTMyLjYgNzIuOC03Mi44IDcyLjhsLTIzNS42IDBjMC00MC4yIDMyLjYtNzIuOCA3Mi44LTcyLjhsMjM1LjYgMHptMC0xMTMuOWMwIDQwLjItMzIuNiA3Mi44LTcyLjggNzIuOGwtMjM1LjYgMGMwLTQwLjIgMzIuNi03Mi44IDcyLjgtNzIuOGwyMzUuNiAweiJdCiAgICB9OwogICAgZmFTcXVhcmVMaW5rZWRpbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtbGlua2VkaW4iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTdkMCIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnptNSAxNzAuMmw2Ni41IDAgMCAyMTMuOC02Ni41IDAgMC0yMTMuOHptNzEuNy02Ny43YTM4LjUgMzguNSAwIDEgMSAtNzcgMCAzOC41IDM4LjUgMCAxIDEgNzcgMHpNMzE3LjkgNDE2bDAtMTA0YzAtMjQuOC0uNS01Ni43LTM0LjUtNTYuNy0zNC42IDAtMzkuOSAyNy0zOS45IDU0LjlsMCAxMDUuOC02Ni40IDAgMC0yMTMuOCA2My43IDAgMCAyOS4yIC45IDBjOC45LTE2LjggMzAuNi0zNC41IDYyLjktMzQuNSA2Ny4yIDAgNzkuNyA0NC4zIDc5LjcgMTAxLjlsMCAxMTcuMi02Ni40IDB6Il0KICAgIH07CiAgICBmYUNzcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjc3MiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTZhMiIsICJNMzc2LjMgMzJMMCAzMiAwIDQwOC4zYzAgMTkgNy42IDM3LjIgMjEgNTAuN3MzMS43IDIxIDUwLjcgMjFsMzA0LjYgMGMxOSAwIDM3LjItNy42IDUwLjctMjFzMjEtMzEuNyAyMS01MC43bDAtMzA0LjZjMC0xOS03LjYtMzcuMi0yMS01MC43cy0zMS43LTIxLTUwLjctMjF6TTMzMi40IDQzMS40Yy03LjctOC41LTExLjctMjAuNy0xMi0zNi42bDMxLjMgMGMuMiAxNC4xIDUuMSAyMS4xIDE0LjggMjEuMWM0LjkgMCA4LjQtMS42IDEwLjUtNC43YzItMy4xIDMtOCAzLTE0LjhjMC01LjQtMS4zLTkuOS00LTEzLjRjLTMuNS00LjItOC4xLTcuNS0xMy4yLTkuNUwzNTEuMiAzNjhjLTEwLjMtNC45LTE3LjgtMTAuOC0yMi41LTE3LjZjLTQuNS02LjgtNi43LTE2LjMtNi43LTI4LjRjMC0xMy42IDQtMjQuNiAxMS44LTMzLjFjOC4xLTguNSAxOS4xLTEyLjcgMzMuMi0xMi43YzEzLjYgMCAyNC4xIDQuMiAzMS41IDEyLjVjNy41IDguNCAxMS41IDIwLjMgMTEuOCAzNS45bC0zMC4xIDBjLjItNS4xLS45LTEwLjItMy0xNC44Yy0xLjctMy40LTUtNS4xLTEwLTUuMWMtOC44IDAtMTMuMiA1LjItMTMuMiAxNS43YzAgNS4zIDEuMSA5LjQgMy4yIDEyLjZjMy4xIDMuNSA3IDYuMiAxMS40IDcuOGwxMS4xIDQuOWMxMS41IDUuMyAxOS43IDExLjcgMjQuOCAxOS40YzUuMSA3LjcgNy42IDE4IDcuNiAzMWMwIDE1LjUtNCAyNy40LTEyLjMgMzUuN2MtOC4yIDguMy0xOS41IDEyLjUtMzQuMSAxMi41cy0yNS42LTQuMi0zMy40LTEyLjd6bS0xMDEgMGMtNy43LTguNS0xMS43LTIwLjctMTItMzYuNmwzMS4zIDBjLjIgMTQuMSA1LjEgMjEuMSAxNC44IDIxLjFjNC45IDAgOC40LTEuNiAxMC40LTQuN2MyLTMuMSAzLTggMy0xNC44YzAtNS40LTEuMy05LjktMy45LTEzLjRjLTMuNS00LjItOC4xLTcuNS0xMy4yLTkuNUwyNTAuMiAzNjhjLTEwLjMtNC45LTE3LjgtMTAuOC0yMi41LTE3LjZjLTQuNS02LjgtNi43LTE2LjMtNi43LTI4LjRjMC0xMy42IDQtMjQuNiAxMS44LTMzLjFjOC4xLTguNSAxOS4xLTEyLjcgMzMuMi0xMi43YzEzLjYgMCAyNC4xIDQuMiAzMS40IDEyLjVjNy42IDguNCAxMS41IDIwLjMgMTEuOSAzNS45bC0zMC4xIDBjLjItNS4xLS45LTEwLjItMy0xNC44Yy0xLjctMy40LTUtNS4xLTEwLTUuMWMtOC44IDAtMTMuMiA1LjItMTMuMiAxNS43YzAgNS4zIDEuMSA5LjQgMy4yIDEyLjZjMy4xIDMuNSA3IDYuMiAxMS40IDcuOGwxMS4xIDQuOWMxMS41IDUuMyAxOS43IDExLjcgMjQuOCAxOS40YzUuMSA3LjcgNy42IDE4IDcuNiAzMWMwIDE1LjUtNC4xIDI3LjQtMTIuMyAzNS43cy0xOS41IDEyLjUtMzQuMSAxMi41cy0yNS42LTQuMi0zMy40LTEyLjd6bS0xMDUuNiAxLjFjLTguNC03LjctMTIuNS0xOS4yLTEyLjUtMzQuNWwwLTc1LjRjMC0xNS4yIDQuNC0yNi43IDEzLjItMzQuNmM4LjktNy44IDIwLjctMTEuOCAzNS4yLTExLjhjMTQuMSAwIDI1LjIgNCAzMy40IDEyYzguMyA4IDEyLjUgMjAgMTIuNSAzNS45bDAgNi0zMy4xIDAgMC01LjhjMC02LjEtMS4zLTEwLjctNC0xMy42Yy0xLjEtMS41LTIuNi0yLjctNC4zLTMuNXMtMy41LTEuMi01LjQtMS4xYy01LjQgMC05LjIgMS44LTExLjQgNS42Yy0yLjMgNS4yLTMuMyAxMC44LTMgMTYuNGwwIDY1LjVjMCAxMy43IDQuOCAyMC42IDE0LjQgMjAuOGM0LjUgMCA3LjktMS42IDEwLjItNC44YzIuNS00LjEgMy43LTguOCAzLjUtMTMuNmwwLTQuOSAzMy4xIDAgMCA1LjFjMCAxMC42LTIuMSAxOS41LTYuMiAyNi42Yy00IDYuOS05LjkgMTIuNS0xNy4xIDE2Yy03LjcgMy43LTE2LjEgNS41LTI0LjYgNS4zYy0xNC4yIDAtMjUuNS0zLjktMzMuOC0xMS42eiJdCiAgICB9OwogICAgZmFIYXNobm9kZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJoYXNobm9kZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNDk5IiwgIk0zNS43IDE3MS4xYy00Ni45IDQ2LTQ2LjkgMTIyLjkgMCAxNjkuOEwxNzEuNiA0NzYuOGM0NiA0Ni45IDEyMi45IDQ2LjkgMTY5LjggMEw0NzcuMyAzNDAuOWM0Ni45LTQ2LjkgNDYuOS0xMjMuOCAwLTE2OS44TDM0MS40IDM1LjJjLTQ2LjktNDYuOS0xMjMuOC00Ni45LTE2OS44IDBMMzUuNyAxNzEuMXpNMTk2IDE5Ni41YTg0LjUgODQuNSAwIDEgMSAxMjAgMTE5IDg0LjUgODQuNSAwIDEgMSAtMTIwLTExOXoiXQogICAgfTsKICAgIGZhUmVkZGl0QWxpZW4gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicmVkZGl0LWFsaWVuIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyODEiLCAiTTM3MyAxMzguNmMtMjUuMiAwLTQ2LjMtMTcuNS01MS45LTQxLTMwLjYgNC4zLTU0LjIgMzAuNy01NC4yIDYyLjRsMCAuMmM0Ny40IDEuOCA5MC42IDE1LjEgMTI0LjkgMzYuMyAxMi42LTkuNyAyOC40LTE1LjUgNDUuNS0xNS41IDQxLjMgMCA3NC43IDMzLjQgNzQuNyA3NC43IDAgMjkuOC0xNy40IDU1LjUtNDIuNyA2Ny41LTIuNCA4Ni44LTk3IDE1Ni42LTIxMy4yIDE1Ni42UzQ1LjUgNDEwLjEgNDMgMzIzLjRjLTI1LjQtMTEuOS00My0zNy43LTQzLTY3LjcgMC00MS4zIDMzLjQtNzQuNyA3NC43LTc0LjcgMTcuMiAwIDMzIDUuOCA0NS43IDE1LjYgMzQtMjEuMSA3Ni44LTM0LjQgMTIzLjctMzYuNGwwLS4zYzAtNDQuMyAzMy43LTgwLjkgNzYuOC04NS41IDQuOS0yNC4yIDI2LjMtNDIuNCA1Mi4xLTQyLjQgMjkuNCAwIDUzLjMgMjMuOSA1My4zIDUzLjNzLTIzLjkgNTMuMy01My4zIDUzLjN6TTE1Ny41IDI1NS4zYy0yMC45IDAtMzguOSAyMC44LTQwLjIgNDcuOXMxNy4xIDM4LjEgMzggMzguMSAzNi42LTkuOCAzNy44LTM2LjktMTQuNy00OS4xLTM1LjctNDkuMWwuMSAwek0zOTUgMzAzLjFjLTEuMi0yNy4xLTE5LjItNDcuOS00MC4yLTQ3LjlzLTM2LjkgMjItMzUuNyA0OS4xIDE2LjkgMzYuOSAzNy44IDM2LjkgMzkuMy0xMSAzOC0zOC4xbC4xIDB6bS02MC4xIDcwLjhjMS41LTMuNi0xLTcuNy00LjktOC4xLTIzLTIuMy00Ny45LTMuNi03My44LTMuNnMtNTAuOCAxLjMtNzMuOCAzLjZjLTMuOSAuNC02LjQgNC41LTQuOSA4LjEgMTIuOSAzMC44IDQzLjMgNTIuNCA3OC43IDUyLjRzNjUuOC0yMS42IDc4LjctNTIuNHoiXQogICAgfTsKICAgIGZhVGlrdG9rID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInRpa3RvayIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlMDdiIiwgIk00NDguNSAyMDkuOWMtNDQgLjEtODctMTMuNi0xMjIuOC0zOS4ybDAgMTc4LjdjMCAzMy4xLTEwLjEgNjUuNC0yOSA5Mi42cy00NS42IDQ4LTc2LjYgNTkuNi02NC44IDEzLjUtOTYuOSA1LjMtNjAuOS0yNS45LTgyLjctNTAuOC0zNS4zLTU2LTM5LTg4LjkgMi45LTY2LjEgMTguNi05NS4yIDQwLTUyLjcgNjkuNi02Ny43IDYyLjktMjAuNSA5NS43LTE2bDAgODkuOWMtMTUtNC43LTMxLjEtNC42LTQ2IC40cy0yNy45IDE0LjYtMzcgMjcuMy0xNCAyOC4xLTEzLjkgNDMuOSA1LjIgMzEgMTQuNSA0My43IDIyLjQgMjIuMSAzNy40IDI2LjkgMzEuMSA0LjggNDYtLjEgMjgtMTQuNCAzNy4yLTI3LjEgMTQuMi0yOC4xIDE0LjItNDMuOGwwLTM0OS40IDg4IDBjLS4xIDcuNCAuNiAxNC45IDEuOSAyMi4yIDMuMSAxNi4zIDkuNCAzMS45IDE4LjcgNDUuN3MyMS4zIDI1LjYgMzUuMiAzNC42YzE5LjkgMTMuMSA0My4yIDIwLjEgNjcgMjAuMWwwIDg3LjR6Il0KICAgIH07CiAgICBmYVdvcmRwcmVzcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ3b3JkcHJlc3MiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjE5YSIsICJNNjEuNyAxNjkuNGwxMDEuNSAyNzhjLTcxLTM0LjQtMTE5LjktMTA3LjItMTE5LjktMTkxLjQgMC0zMC45IDYuNi02MC4xIDE4LjQtODYuNnptMzM3LjkgNzUuOWMwLTI2LjMtOS40LTQ0LjUtMTcuNS01OC43LTEwLjgtMTcuNS0yMC45LTMyLjQtMjAuOS00OS45IDAtMTkuNiAxNC44LTM3LjggMzUuNy0zNy44IC45IDAgMS44IC4xIDIuOCAuMi0zNy45LTM0LjctODguMy01NS45LTE0My43LTU1LjktNzQuMyAwLTEzOS43IDM4LjEtMTc3LjggOTUuOSA1IC4yIDkuNyAuMyAxMy43IC4zIDIyLjIgMCA1Ni43LTIuNyA1Ni43LTIuNyAxMS41LS43IDEyLjggMTYuMiAxLjQgMTcuNSAwIDAtMTEuNSAxLjMtMjQuMyAybDc3LjUgMjMwLjQgNDYuNi0xMzkuNi0zMy4xLTkwLjhjLTExLjUtLjctMjIuMy0yLTIyLjMtMi0xMS41LS43LTEwLjEtMTguMiAxLjMtMTcuNSAwIDAgMzUuMSAyLjcgNTYgMi43IDIyLjIgMCA1Ni43LTIuNyA1Ni43LTIuNyAxMS41LS43IDEyLjggMTYuMiAxLjQgMTcuNSAwIDAtMTEuNSAxLjMtMjQuMyAybDc2LjkgMjI4LjcgMjEuMi03MC45YzktMjkuNCAxNi01MC41IDE2LTY4Ljd6TTI1OS43IDI3NC42TDE5NS45IDQ2MC4xYzE5LjEgNS42IDM5LjIgOC43IDYwLjEgOC43IDI0LjggMCA0OC41LTQuMyA3MC42LTEyLjEtLjYtLjktMS4xLTEuOS0xLjUtMi45TDI1OS43IDI3NC42em0xODMtMTIwLjdjLjkgNi44IDEuNCAxNCAxLjQgMjEuOSAwIDIxLjYtNCA0NS44LTE2LjIgNzYuMmwtNjUgMTg3LjljNjMuMy0zNi45IDEwNS44LTEwNS40IDEwNS44LTE4My45IDAtMzctOS40LTcxLjgtMjYtMTAyLjF6TTggMjU2YTI0OCAyNDggMCAxIDEgNDk2IDAgMjQ4IDI0OCAwIDEgMSAtNDk2IDB6bTQ4NC42IDBhMjM2LjYgMjM2LjYgMCAxIDAgLTQ3My4yIDAgMjM2LjYgMjM2LjYgMCAxIDAgNDczLjIgMHoiXQogICAgfTsKICAgIGZhSWRlYWwgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaWRlYWwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTAxMyIsICJNOTMuOCAxNjUuNWE0OS4xIDQ5LjEgMCAxIDAgMCA5OC4xIDQ5LjEgNDkuMSAwIDEgMCAwLTk4LjF6TTU0LjMgNDI1LjhsNzguOSAwIDAtMTQwLjUtNzguOSAwIDAgMTQwLjV6TTIwNS44IDIxNC4yYzAtMjAtMTAtMjIuNS0xOC43LTIyLjVsLTE0IDAgMCA0NS44IDE0IDBjOS43IDAgMTguNy0yLjggMTguNy0yMy4zem0yMDEuNyA0NmwwLTkxLjMgMjIuOCAwIDAgNjguNiAzMy43IDBDNDU0LjYgMTEzLjEgMzU2LjggODYuMiAyNjcuOCA4Ni4ybC05NC44IDAgMCA4Mi44IDE0IDBjMjUuNiAwIDQxLjUgMTcuNCA0MS41IDQ1LjMgMCAyOC44LTE1LjUgNDYtNDEuNSA0NmwtMTQgMCAwIDE2NS42IDk0LjggMGMxNDQuNiAwIDE5NC45LTY3LjIgMTk2LjctMTY1LjZsLTU3LjEgMHptLTEwOS44IDBsLTU2LjIgMCAwLTkxLjIgNTQuNCAwIDAgMjIuNy0zMS43IDAgMCAxMC42IDMwIDAgMCAyMi43LTMwIDAgMCAxMi41IDMzLjUgMCAwIDIyLjd6bTc0LjcgMGwtNS4yLTE3LjctMjkuNyAwLTUuMiAxNy43LTIzLjcgMCAyNy41LTkxLjMgMzIuMyAwIDI3LjUgOTEuMy0yMy43IDB6TTI2Ny44IDMyTC4xIDMyIC4xIDQ4MCAyNjcuOCA0ODBjMTYxLjggMCAyNTEtNzkuNyAyNTEtMjI0LjUgMC04My41LTMyLjYtMjIzLjUtMjUxLTIyMy41em0wIDQyNi45bC0yNDYuNiAwIDAtNDA1LjkgMjQ2LjYgMGMxNDIuMSAwIDIyOS45IDY0LjYgMjI5LjkgMjAyLjQgMCAxMzQuMS04MSAyMDMuNC0yMjkuOSAyMDMuNHptODMuOS0yNjQuOWwtNy41IDI1LjggMTYuNCAwLTcuNS0yNS44LTEuNCAweiJdCiAgICB9OwogICAgZmFQaWVkUGlwZXJQcCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwaWVkLXBpcGVyLXBwIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYxYTciLCAiTTIwNS4zIDE3NC42YzAgMjEuMS0xNC4yIDM4LjEtMzEuNyAzOC4xLTcuMSAwLTEyLjgtMS4yLTE3LjItMy43bDAtNjhjNC40LTIuNyAxMC4xLTQuMiAxNy4yLTQuMiAxNy41IDAgMzEuNyAxNi45IDMxLjcgMzcuOHptNTIuNiA2N2MtNy4xIDAtMTIuOCAxLjUtMTcuMiA0LjJsMCA2OGM0LjQgMi41IDEwLjEgMy43IDE3LjIgMy43IDE3LjQgMCAzMS43LTE2LjkgMzEuNy0zNy44IDAtMjEuMS0xNC4zLTM4LjEtMzEuNy0zOC4xek00NDggODBsMCAzNTJjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNDgwYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDgwQzAgNTMuNSAyMS41IDMyIDQ4IDMybDM1MiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4ek0xODUgMjU1LjFjNDEgMCA3NC4yLTM1LjYgNzQuMi03OS42UzIyNiA5NS45IDE4NSA5NS45Yy0xMiAwLTI0LjEgMy4yLTM0LjYgOC44bC00NS43IDAgMCAyMDYuMyA1MS44LTEwLjEgMC01MC42YzguNiAzLjEgMTguMSA0LjggMjguNSA0Ljh6bTE1OC40IDI1LjNjMC00NC0zMy4yLTc5LjYtNzMuOS03OS42LTMuMiAwLTYuNCAuMi05LjYgLjctMy43IDEyLjUtMTAuMSAyMy44LTE5LjIgMzMuNC0xMy44IDE1LTMyLjIgMjMuOC01MS44IDI0LjhsMCAxNTYuMyA1MS44LTEwLjEgMC01MC42YzguNiAzLjIgMTguMiA0LjcgMjguNyA0LjcgNDAuOCAwIDc0LTM1LjYgNzQtNzkuNnoiXQogICAgfTsKICAgIGZhVXNzdW5uYWggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidXNzdW5uYWgiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjQwNyIsICJNNDk2LjkgMjY4LjFjMCA2My45LTI1LjQgMTI1LjItNzAuNiAxNzAuM1MzMTkuOSA1MDkgMjU2IDUwOSAxMzAuOCA0ODMuNSA4NS43IDQzOC40IDE1LjEgMzMxLjkgMTUuMSAyNjhjMC02My45IDI1LjQtMTI1LjIgNzAuNi0xNzAuNFMxOTIuMiAyNy4xIDI1Ni4xIDI3LjEgMzgxLjMgNTIuNCA0MjYuNSA5Ny42IDQ5NyAyMDQuMSA0OTcgMjY4bC0uMSAuMXpNMzkuNSAyNjhjLS42IDI4LjggNC41IDU3LjUgMTUuMSA4NC4zczI2LjQgNTEuMiA0Ni42IDcxLjggNDQuMiAzNyA3MC44IDQ4LjEgNTUuMSAxNi45IDgzLjkgMTYuOSA1Ny40LTUuOCA4My45LTE2LjkgNTAuNi0yNy41IDcwLjgtNDguMSAzNi00NSA0Ni42LTcxLjggMTUuNy01NS41IDE1LjEtODQuM2MuNi0yOC44LTQuNS01Ny41LTE1LjEtODQuM3MtMjYuNC01MS4yLTQ2LjYtNzEuOC00NC4yLTM3LTcwLjgtNDguMS01NS4xLTE2LjktODMuOS0xNi45LTU3LjQgNS44LTgzLjkgMTYuOS01MC42IDI3LjUtNzAuOCA0OC4xLTM2IDQ1LTQ2LjYgNzEuOC0xNS43IDU1LjUtMTUuMSA4NC4zem0zODUuOSA2My4zYy0xMi43IDAtMjEuNi0xLjktMjYuNy01LjktNS41LTQuMy04LjItMTIuMy04LjItMjMuOGwwLTk2LjVjMC02LjUtNS4yLTIwLjItMTUuNy00MS4yIDcgMCAxNy05LjEgMzAtMjcuMmwwIDE0Ny44YzAgMTEgMi40IDE5LjQgNyAyNS4zIDMuNyA0LjcgMTAuMSA4LjkgMTkgMTIuNiAxLjIgLjQgMi42IC45IDQuMSAxLjQgMi45IC45IDYuMyAyLjEgMTAuMyAzLjUtMS44IDIuNy04LjMgNC0xOS45IDRsLjEgMHptLTIxOSAwYy0xLjMgMi40LTMuNiA1LjUtNi44IDkuNGwtMTguNSAyMi41Yy0xLTYuMS00LTEzLTkuMy0yMC42cy05LjctMTEuNC0xMy40LTExLjRsLTg5LjggMGMzLjMtNS4zIDQuOS04LjggNC45LTEwLjhzLS44LTUuMy0yLjQtOS43Yy0xLjUtNC40LTIuNC04LjUtMi40LTEyLjQgMC03LjQgMi4xLTEzLjkgNi4zLTE5LjNsMjAtMjUuNi03LjEtMTcuNyAxNi4xLTE5LjggNi43IDE2LjggOC0xMC4zYy0xLjggNi40LTIuNiAxMi4zLTIuNiAxNy43IDAgNC4yIDIuOCAxMy4zIDguMyAyNy4zbDE2LjIgNDAuNyAxNy43IDBjMi44IC40IDcuNyA1IDE0LjYgMTMuOSAxLjggMi40IDQuMyA1LjggNy43IDEwLjIgMS40IDEuOSAyLjkgMy45IDQuNiA2LjEgMS4zLTIuMyAyLTQuNiAyLTcuMSAwLTItMS4zLTYuNi00LTEzLjRMMTc4IDMwNC4xYy00LTEwLjYtNi4xLTE3LjctNi4xLTIxLjMgMC02LjMgMS45LTEyLjMgNS44LTE3LjkgLjUtLjYgMS0xLjMgMS41LTEuOSA0LjQtNS42IDguOC0xMS4xIDEzLjMtMTYuNS0xLjEgNC42LTEuNyA4LjctMS43IDEyIDAgMy43IDEuNyA5LjkgNS4xIDE4LjhsNy45IDIwLjRjMS45IDQuNyAzIDguMiAzLjcgMTAuM2wyNS45IDAtLjktMi42Yy0xLjQtMy45LTQtNy03LjctOS4zbDE1LjYtMjAuMSAxMi4zIDMyIDEzLjQgMC02LjEtMTUuOGMtMS41LTMuOS00LTctNy43LTkuM2wxNS43LTIwLjEgMTcuMyA0NS4yIDEzLjQgMC0xMS40LTI5LjRjLTEuNS0zLjktNC03LTcuNy05LjNsMTUuNi0yMCAyMi40IDU4LjcgMjYuMiAwYzEuNSAwIDMtMS4xIDQuNS0zLjFzMi4yLTQuMSAyLjItNi4zbDAtOTMuNWMwLTYuNS00LjUtMjAuMy0xMy43LTQxLjIgNS40IDAgMTQuMS05LjEgMjYuMi0yNy4ybDAgMTYzLjVjMCA3LjIgLjYgMTIgMS43IDE0LjYgMS42IDMuNCA1LjMgNi4yIDExLjEgOC4yLTMuOSA1LjYtOC43IDguNS0xNC41IDguNWwtMTU0LjggMC0uMS0uMnptLTk4LTQ0Yy0yLjctNi43LTQtMTEuNy00LTE1LS42IDEuMi0yLjQgMy43LTUuNCA3LjYtMS40IDEuOS0yLjIgMy43LTIuMiA1LjMgMCAyLjYgLjggNS43IDIuMiA5LjNsNS42IDEzLjljNSAwIDkgMCAxMS45LS4xbC04LjItMjAuOSAuMS0uMXptMTMuNS03Mi40Yy0zLTUuMi03LTkuMy0xMS45LTExLjktMy41LTEuOS01LjMtNC4zLTUuMy03LjQgMC0yLjQgNC42LTguNiAxNC0xOC4zIC4yIDMuOCAxLjkgNy42IDQuOSAxMS4yIDMuMSAzLjYgNC42IDcgNC42IDEwLjEgMCAyLjYtMi4xIDgtNi4yIDE2LjNsLS4xIDB6bS0yNy42IDBjLTMtNS4yLTctOS4zLTExLjktMTEuOS0zLjUtMS45LTUuMy00LjMtNS4zLTcuNCAwLTIuNCA0LjYtOC42IDE0LTE4LjMgLjIgMy44IDEuOSA3LjYgNC45IDExLjIgMy4xIDMuNiA0LjYgNyA0LjYgMTAuMSAwIDIuNi0yLjEgOC02LjIgMTYuM2wtLjEgMHptODcgMjcuNWMtMy01LjItNy05LjMtMTEuOS0xMS45LTMuNS0xLjktNS4zLTQuMy01LjMtNy40IDAtMi40IDQuNi04LjYgMTQtMTguMyAuMiAzLjggMS45IDcuNiA0LjkgMTEuMiAzLjEgMy42IDQuNiA3IDQuNiAxMC4xIDAgMi42LTIuMSA4LTYuMiAxNi4zbC0uMSAweiJdCiAgICB9OwogICAgZmFGb3J0QXdlc29tZUFsdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmb3J0LWF3ZXNvbWUtYWx0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzYTMiLCAiTTIwOCAyMzcuNGwtMjIuMiAwYy0yLjEgMC0zLjcgMS42LTMuNyAzLjdsMCA1MS43YzAgMi4xIDEuNiAzLjcgMy43IDMuN2wyMi4yIDBjMi4xIDAgMy43LTEuNiAzLjctMy43bDAtNTEuN2MwLTIuMS0xLjYtMy43LTMuNy0zLjd6bTExOC4yIDBsLTIyLjIgMGMtMi4xIDAtMy43IDEuNi0zLjcgMy43bDAgNTEuN2MwIDIuMSAxLjYgMy43IDMuNyAzLjdsMjIuMiAwYzIuMSAwIDMuNy0xLjYgMy43LTMuN2wwLTUxLjdjLS4xLTIuMS0xLjctMy43LTMuNy0zLjd6bTEzMi0xMjUuMWMtMi4zLTMuMi00LjYtNi40LTcuMS05LjUtOS44LTEyLjUtMjAuOC0yNC0zMi44LTM0LjQtNC41LTMuOS05LjEtNy42LTEzLjktMTEuMi0xLjYtMS4yLTMuMi0yLjMtNC44LTMuNS0yNy42LTE5LjYtNTkuMy0zMy43LTkzLjYtNDAuNy0xNi4yLTMuMy0zMi45LTUtNTAtNXMtMzMuOSAxLjctNTAgNWMtMzQuMyA3LjEtNjYgMjEuMi05My4zIDQwLjgtMS42IDEuMS0zLjIgMi4zLTQuOCAzLjUtNC44IDMuNi05LjQgNy4zLTEzLjkgMTEuMi0zIDIuNi01LjkgNS4zLTguOCA4cy01LjcgNS41LTguNCA4LjRjLTUuNSA1LjctMTAuNyAxMS44LTE1LjYgMTgtMi40IDMuMS00LjggNi4zLTcuMSA5LjUtMjguOSA0MC42LTQ1LjggOTAuMS00NS44IDE0My42IDAgMiAuMSA0IC4xIDYgLjEgLjcgLjEgMS4zIC4xIDIgLjEgMS4zIC4xIDIuNyAuMiA0IDAgLjggLjEgMS41IC4xIDIuMyAwIDEuMyAuMSAyLjUgLjIgMy43IC4xIC44IC4xIDEuNiAuMiAyLjQgLjEgMS4xIC4yIDIuMyAuMyAzLjUgMCAuOCAuMSAxLjYgLjIgMi40IC4xIDEuMiAuMyAyLjQgLjQgMy42IC4xIC44IC4yIDEuNSAuMyAyLjMgLjEgMS4zIC4zIDIuNiAuNSAzLjkgLjEgLjYgLjIgMS4zIC4zIDEuOWwuOSA1LjdjLjEgLjYgLjIgMS4xIC4zIDEuNyAuMyAxLjMgLjUgMi43IC44IDQgLjIgLjggLjMgMS42IC41IDIuNCAuMiAxIC41IDIuMSAuNyAzLjIgLjIgLjkgLjQgMS43IC42IDIuNiAuMiAxIC40IDIgLjcgMyAuMiAuOSAuNSAxLjggLjcgMi43IC4zIDEgLjUgMS45IC44IDIuOSAuMyAuOSAuNSAxLjggLjggMi43IC4yIC45IC41IDEuOSAuOCAyLjhzLjUgMS44IC44IDIuN2MuMyAxIC42IDEuOSAuOSAyLjggLjYgMS42IDEuMSAzLjMgMS43IDQuOSAuNCAxIC43IDEuOSAxIDIuOCAuMyAxIC43IDIgMS4xIDMgLjMgLjggLjYgMS41IC45IDIuM2wxLjIgM2MuMyAuNyAuNiAxLjUgLjkgMi4yIC40IDEgLjkgMiAxLjMgM2wuOSAyLjFjLjUgMSAuOSAyIDEuNCAzIC4zIC43IC42IDEuMyAuOSAyIC41IDEgMSAyLjEgMS41IDMuMSAuMiAuNiAuNSAxLjEgLjggMS43IC42IDEuMSAxLjEgMi4yIDEuNyAzLjMgLjEgLjIgLjIgLjMgLjMgLjUgMi4yIDQuMSA0LjQgOC4yIDYuOCAxMi4yIC4yIC40IC41IC44IC43IDEuMiAuNyAxLjEgMS4zIDIuMiAyIDMuMyAuMyAuNSAuNiAuOSAuOSAxLjQgLjYgMS4xIDEuMyAyLjEgMiAzLjIgLjMgLjUgLjYgLjkgLjkgMS40IC43IDEuMSAxLjQgMi4xIDIuMSAzLjIgLjIgLjQgLjUgLjggLjggMS4yIC43IDEuMSAxLjUgMi4yIDIuMyAzLjMgLjIgLjIgLjMgLjUgLjUgLjcgMzcuNSA1MS43IDk0LjQgODguNSAxNjAgOTkuNCAuOSAuMSAxLjcgLjMgMi42IC40IDEgLjIgMi4xIC40IDMuMSAuNXMxLjkgLjMgMi44IC40YzEgLjIgMiAuMyAzIC40IC45IC4xIDEuOSAuMiAyLjkgLjNzMS45IC4yIDIuOSAuMyAyLjEgLjIgMy4xIC4zYy45IC4xIDEuOCAuMSAyLjcgLjIgMS4xIC4xIDIuMyAuMSAzLjQgLjIgLjggMCAxLjcgLjEgMi41IC4xIDEuMyAwIDIuNiAuMSAzLjkgLjEgLjcgLjEgMS40IC4xIDIuMSAuMSAyIC4xIDQgLjEgNiAuMXM0LS4xIDYtLjFjLjcgMCAxLjQtLjEgMi4xLS4xIDEuMyAwIDIuNiAwIDMuOS0uMSAuOCAwIDEuNy0uMSAyLjUtLjEgMS4xLS4xIDIuMy0uMSAzLjQtLjIgLjkgMCAxLjgtLjEgMi43LS4yIDEtLjEgMi4xLS4yIDMuMS0uM3MxLjktLjIgMi45LS4zYy45LS4xIDEuOS0uMiAyLjktLjNzMi0uMyAzLS40IDEuOS0uMyAyLjgtLjRjMS0uMiAyLjEtLjMgMy4xLS41IC45LS4xIDEuNy0uMyAyLjYtLjQgNjUuNi0xMSAxMjIuNS00Ny43IDE2MC4xLTEwMi40IC4yLS4yIC4zLS41IC41LS43IC44LTEuMSAxLjUtMi4yIDIuMy0zLjMgLjItLjQgLjUtLjggLjgtMS4yIC43LTEuMSAxLjQtMi4xIDIuMS0zLjIgLjMtLjUgLjYtLjkgLjktMS40IC42LTEuMSAxLjMtMi4xIDItMy4yIC4zLS41IC42LS45IC45LTEuNCAuNy0xLjEgMS4zLTIuMiAyLTMuMyAuMi0uNCAuNS0uOCAuNy0xLjIgMi40LTQgNC42LTguMSA2LjgtMTIuMiAuMS0uMiAuMi0uMyAuMy0uNSAuNi0xLjEgMS4xLTIuMiAxLjctMy4zIC4yLS42IC41LTEuMSAuOC0xLjcgLjUtMSAxLTIuMSAxLjUtMy4xIC4zLS43IC42LTEuMyAuOS0yIC41LTEgMS0yIDEuNC0zbC45LTIuMWMuNS0xIC45LTIgMS4zLTMgLjMtLjcgLjYtMS41IC45LTIuMmwxLjItM2MuMy0uOCAuNi0xLjUgLjktMi4zIC40LTEgLjctMiAxLjEtM3MuNy0xLjkgMS0yLjhjLjYtMS42IDEuMi0zLjMgMS43LTQuOSAuMy0xIC42LTEuOSAuOS0yLjhzLjUtMS44IC44LTIuN2MuMi0uOSAuNS0xLjkgLjgtMi44cy42LTEuOCAuOC0yLjdjLjMtMSAuNS0xLjkgLjgtMi45IC4yLS45IC41LTEuOCAuNy0yLjcgLjItMSAuNS0yIC43LTMgLjItLjkgLjQtMS43IC42LTIuNiAuMi0xIC41LTIuMSAuNy0zLjIgLjItLjggLjMtMS42IC41LTIuNCAuMy0xLjMgLjYtMi43IC44LTQgLjEtLjYgLjItMS4xIC4zLTEuN2wuOS01LjdjLjEtLjYgLjItMS4zIC4zLTEuOSAuMS0xLjMgLjMtMi42IC41LTMuOSAuMS0uOCAuMi0xLjUgLjMtMi4zIC4xLTEuMiAuMy0yLjQgLjQtMy42IDAtLjggLjEtMS42IC4yLTIuNCAuMS0xLjEgLjItMi4zIC4zLTMuNSAuMS0uOCAuMS0xLjYgLjItMi40IC4xIDEuNyAuMSAuNSAuMi0uNyAwLS44IC4xLTEuNSAuMS0yLjMgLjEtMS4zIC4yLTIuNyAuMi00IC4xLS43IC4xLTEuMyAuMS0yIC4xLTIgLjEtNCAuMS02IDAtNTMuNS0xNi45LTEwMy00NS44LTE0My43ek00NDggMzcxLjVjLTkuNCAxNS41LTIwLjYgMjkuOS0zMy42IDQyLjktMjAuNiAyMC42LTQ0LjUgMzYuNy03MS4yIDQ4LTEzLjkgNS44LTI4LjIgMTAuMy00Mi45IDEzLjJsMC03NS44YzAtNTguNi04OC42LTU4LjYtODguNiAwbDAgNzUuOGMtMTQuNy0yLjktMjktNy4zLTQyLjktMTMuMi0yNi43LTExLjMtNTAuNi0yNy40LTcxLjItNDgtMTMtMTMtMjQuMi0yNy40LTMzLjYtNDIuOWwwLTcxLjNjMC0yLjEgMS42LTMuNyAzLjctMy43bDIyLjEgMGMyLjEgMCAzLjcgMS42IDMuNyAzLjdsMCAyNS44IDI5LjYgMCAwLTE0NGMwLTIuMSAxLjYtMy43IDMuNy0zLjdsMjIuMSAwYzIuMSAwIDMuNyAxLjYgMy43IDMuN2wwIDI1LjkgMjkuNSAwIDAtMjUuOWMwLTIuMSAxLjYtMy43IDMuNy0zLjdsMjIuMiAwYzIuMSAwIDMuNyAxLjYgMy43IDMuN2wwIDI1LjkgMjkuNSAwIDAtMjUuOWMwLTQuOCA2LjUtMy43IDkuNS0zLjdsMC05MC4yYy00LjQtMi03LjQtNi43LTcuNC0xMS41IDAtMTYuOCAyNS40LTE2LjggMjUuNCAwIDAgNC44LTMgOS40LTcuNCAxMS41bDAgMy45YzYuMy0xLjQgMTIuNy0yLjMgMTkuMi0yLjMgOS40IDAgMTguNCAzLjUgMjYuMyAzLjUgNy4yIDAgMTUuMi0zLjUgMTkuNC0zLjUgMi4xIDAgMy43IDEuNiAzLjcgMy43bDAgNDguNGMwIDUuNi0xOC43IDYuNS0yMi40IDYuNS04LjYgMC0xNi42LTMuNS0yNS40LTMuNS03IDAtMTQuMSAxLjItMjAuOCAyLjhsMCAzMC43YzMgMCA5LjUtMS4xIDkuNSAzLjdsMCAyNS45IDI5LjUgMCAwLTI1LjljMC0yLjEgMS42LTMuNyAzLjctMy43bDIyLjIgMGMyLjEgMCAzLjcgMS42IDMuNyAzLjdsMCAyNS45IDI5LjUgMCAwLTI1LjljMC0yLjEgMS42LTMuNyAzLjctMy43bDIyLjEgMGMyLjEgMCAzLjcgMS42IDMuNyAzLjdsMCAxNDQgMjkuNSAwIDAtMjUuOGMwLTIuMSAxLjYtMy43IDMuNy0zLjdsMjIuMiAwYzIuMSAwIDMuNyAxLjYgMy43IDMuN2wwIDcxLjN6Il0KICAgIH07CiAgICBmYUJ1cm9tb2JlbGV4cGVydGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYnVyb21vYmVsZXhwZXJ0ZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMzdmIiwgIk0wIDMybDAgMTI4IDEyOCAwIDAtMTI4LTEyOCAwek0xMjAgMTUybC0xMTIgMCAwLTExMiAxMTIgMCAwIDExMnpNMTYwIDMybDAgMTI4IDEyOCAwIDAtMTI4LTEyOCAwek0yODAgMTUybC0xMTIgMCAwLTExMiAxMTIgMCAwIDExMnpNMzIwIDMybDAgMTI4IDEyOCAwIDAtMTI4LTEyOCAwek00NDAgMTUybC0xMTIgMCAwLTExMiAxMTIgMCAwIDExMnpNMCAxOTJsMCAxMjggMTI4IDAgMC0xMjgtMTI4IDB6TTEyMCAzMTJsLTExMiAwIDAtMTEyIDExMiAwIDAgMTEyem00MC0xMjBsMCAxMjggMTI4IDAgMC0xMjgtMTI4IDB6TTI4MCAzMTJsLTExMiAwIDAtMTEyIDExMiAwIDAgMTEyem00MC0xMjBsMCAxMjggMTI4IDAgMC0xMjgtMTI4IDB6TTQ0MCAzMTJsLTExMiAwIDAtMTEyIDExMiAwIDAgMTEyek0wIDM1MmwwIDEyOCAxMjggMCAwLTEyOC0xMjggMHpNMTIwIDQ3MmwtMTEyIDAgMC0xMTIgMTEyIDAgMCAxMTJ6bTQwLTEyMGwwIDEyOCAxMjggMCAwLTEyOC0xMjggMHpNMjgwIDQ3MmwtMTEyIDAgMC0xMTIgMTEyIDAgMCAxMTJ6bTQwLTEyMGwwIDEyOCAxMjggMCAwLTEyOC0xMjggMHoiXQogICAgfTsKICAgIGZhQmlsaWJpbGkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYmlsaWJpbGkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTNkOSIsICJNNDg4LjYgMTA0LjFjMTYuNyAxOC4xIDI0LjQgMzkuNyAyMy4zIDY1LjdsMCAyMDIuNGMtLjQgMjYuNC05LjIgNDguMS0yNi41IDY1LjEtMTcuMiAxNy0zOS4xIDI1LjktNjUuNSAyNi43TDkyIDQ2NGMtMjYuNC0uOC00OC4yLTkuOC02NS4zLTI3LjItMTcuMS0xNy40LTI2LTQwLjMtMjYuNy02OC42TDAgMTY5LjhjLjgtMjYgOS43LTQ3LjYgMjYuNy02NS43IDE3LjEtMTYuMyAzOC44LTI1LjMgNjUuMy0yNi4xbDI5LjQgMC0yNS40LTI1LjhjLTUuNy01LjctOC42LTEzLTguNi0yMS44czIuOS0xNi4xIDguNi0yMS44IDEzLTguNiAyMS45LTguNiAxNi4xIDIuOSAyMS45IDguNmw3My4zIDY5LjQgODggMCA3NC41LTY5LjRDMzgxLjcgMi45IDM4OS4yIDAgMzk4IDBzMTYuMSAyLjkgMjEuOSA4LjZjNS43IDUuNyA4LjYgMTMgOC42IDIxLjhzLTIuOSAxNi4xLTguNiAyMS44TDM5NC42IDc4IDQyMy45IDc4YzI2LjQgLjggNDggOS44IDY0LjcgMjYuMXptLTM4LjggNjkuN2MtLjQtOS42LTMuNy0xNy40LTEwLjctMjMuNS01LjItNi4xLTE0LTkuNC0yMi43LTkuOGwtMzIwLjQgMGMtOS42IC40LTE3LjQgMy43LTIzLjYgOS44LTYuMSA2LjEtOS40IDEzLjktOS44IDIzLjVsMCAxOTQuNGMwIDkuMiAzLjMgMTcgOS44IDIzLjVzMTQuNCA5LjggMjMuNiA5LjhsMzIwLjQgMGM5LjIgMCAxNy0zLjMgMjMuMy05LjhzOS43LTE0LjMgMTAuMS0yMy41bDAtMTk0LjR6TTE4NS41IDIxNi41YzYuMyA2LjMgOS43IDE0LjEgMTAuMSAyMy4ybDAgMzMuM2MtLjQgOS4yLTMuNyAxNi45LTkuOCAyMy4yLTYuMiA2LjMtMTQgOS41LTIzLjYgOS41cy0xNy41LTMuMi0yMy42LTkuNS05LjQtMTQtOS44LTIzLjJsMC0zMy4zYy40LTkuMSAzLjgtMTYuOSAxMC4xLTIzLjJzMTMuMi05LjYgMjMuMy0xMGM5LjIgLjQgMTcgMy43IDIzLjMgMTB6bTE5MS41IDBjNi4zIDYuMyA5LjcgMTQuMSAxMC4xIDIzLjJsMCAzMy4zYy0uNCA5LjItMy43IDE2LjktOS44IDIzLjJzLTE0IDkuNS0yMy42IDkuNS0xNy40LTMuMi0yMy42LTkuNWMtNy02LjMtOS40LTE0LTkuNy0yMy4ybDAtMzMuM2MuMy05LjEgMy43LTE2LjkgMTAtMjMuMnMxNC4xLTkuNiAyMy4zLTEwYzkuMiAuNCAxNyAzLjcgMjMuMyAxMHoiXQogICAgfTsKICAgIGZhTmVvcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJuZW9zIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY2MTIiLCAiTTM4My44IDUxMmwtOTUuMSAwLTEwOC4yLTE1NC41IDAgOTEuMS04Ni40IDYzLjQtOTcuNyAwIDAtNDgyLjIgNDAuNS0yOS44IDEwOCAwIDEyMy43IDE3Ni4xIDAtMTEyLjcgODYuNC02My40IDk3LjcgMCAwIDQ2MS41LTY4LjkgNTAuNXpNNy4yIDM1LjNsMCA0NjAuNyA3Mi01Mi45IDAtMjQ5LjEgMjE1LjUgMzA3LjYgODQuOCAwIDUyLjQtMzguMi03OC4zIDAtMzE2LjEtNDUwLjUtMzAuMiAyMi4zek04OS43IDUwMS45bDgwLTU4LjggMC0xMDEtNzkuOC0xMTQuNCAwIDIyMC45LTcyLjYgNTMuMyA3Mi4zIDAgMCAwek00OSAxMC44bDMxMC42IDQ0Mi42IDgyLjQgMCAwLTQ0Mi42LTc5LjggMCAwIDMxNy42LTIyMi45LTMxNy42LTkwLjMgMHpNMjc5LjQgMTkxLjZsNzIgMTAyLjggMC0yNzguNS03MiA1MyAwIDEyMi43eiJdCiAgICB9OwogICAgZmFEZXYgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZGV2IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY2Y2MiLCAiTTEyMC4xIDIwOC4zYy0zLjktMi45LTcuOC00LjMtMTEuNi00LjNsLTE3LjQgMCAwIDEwNC41IDE3LjQgMGMzLjkgMCA3LjgtMS40IDExLjYtNC4zczUuOC03LjMgNS44LTEzLjFsMC02OS43YzAtNS44LTItMTAuMi01LjgtMTMuMXpNNDA0LjEgMzJMNDMuOSAzMkMxOS43IDMyIC4xIDUxLjYgMCA3NS44TDAgNDM2LjJDLjEgNDYwLjQgMTkuNyA0ODAgNDMuOSA0ODBsMzYwLjIgMGMyNC4yIDAgNDMuOC0xOS42IDQzLjktNDMuOGwwLTM2MC40QzQ0Ny45IDUxLjYgNDI4LjMgMzIgNDA0LjEgMzJ6TTE1NC4yIDI5MS4yYzAgMTguOC0xMS42IDQ3LjMtNDguNCA0Ny4zbC00Ni40IDAgMC0xNjUuNSA0Ny40IDBjMzUuNCAwIDQ3LjQgMjguNSA0Ny40IDQ3LjNsMCA3MC45em0xMDAuNy04OC43bC01My4zIDAgMCAzOC40IDMyLjYgMCAwIDI5LjYtMzIuNiAwIDAgMzguNCA1My4zIDAgMCAyOS42LTYyLjIgMGMtMTEuMiAuMy0yMC40LTguNS0yMC43LTE5LjdsMC0xMjUuMWMtLjMtMTEuMSA4LjYtMjAuNCAxOS43LTIwLjdsNjMuMiAwIDAgMjkuNXpNMzU4LjUgMzE3LjhjLTEzLjIgMzAuNy0zNi44IDI0LjYtNDcuNCAwbC0zOC41LTE0NC44IDMyLjYgMCAyOS43IDExMy43IDI5LjYtMTEzLjcgMzIuNiAwLTM4LjUgMTQ0Ljh6Il0KICAgIH07CiAgICBmYUhvdGphciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJob3RqYXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjNiMSIsICJNMzYxLjggMGMwIDEzMS42LTgwLjcgMTc2LjgtMTQwLjIgMjA5LjQtLjYgLjMtMS4xIC42LTEuNiAuOS01My44IDMwLjItODguNyA0OS44LTg5LjYgMTIybC05OC4xIDBjMC0xMzEuNSA4MC43LTE3Ni43IDE0MC4yLTIwOS4zIDU0LjgtMjkuOCA5MC4zLTUwIDkwLjMtMTIzbDk5IDB6TTMwMS4zIDMwMi42YzU0LjgtMjkuOCA5MC4zLTUwIDkwLjMtMTIzbDk4IDBjMCAxMzEuNi04MC43IDE3Ni43LTE0MC4yIDIwOS40LTU0LjggMjkuOC05MC4zIDUwLTkwLjMgMTIzbC05OCAwYzAtMTMxLjYgODAuNy0xNzYuOCAxNDAuMi0yMDkuNHoiXQogICAgfTsKICAgIGZhRG9jaHViID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImRvY2h1YiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMzk0IiwgIk00MTMuOSAxNjBMMjcyIDE2MCAyNzIgMTkuNiA0MTMuOSAxNjB6TTMyMCAxOTJsMCAxMzBjMCA2Ni44LTM2LjUgMTAwLjEtMTEzLjMgMTAwLjFsLTk0LjcgMCAwLTMzNy4zIDk0LjcgMGMxMiAwIDIzLjEgLjggMzMuMSAyLjVsMC04NEMyMjguOSAxLjEgMjE3LjQgMCAyMDUuMiAwTDE2IDAgMTYgNTEyIDIwNS4yIDUxMkMzNDUuNyA1MTIgNDE2IDQ0Ny40IDQxNiAzMTguMWwwLTEyNi4xLTk2IDB6Il0KICAgIH07CiAgICBmYVZpbWVvID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInZpbWVvIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY0MGEiLCAiTTQwMy4yIDMyTDQ0LjggMzJDMjAuMSAzMiAwIDUyLjEgMCA3Ni44TDAgNDM1LjJDMCA0NTkuOSAyMC4xIDQ4MCA0NC44IDQ4MGwzNTguNCAwYzI0LjcgMCA0NC44LTIwLjEgNDQuOC00NC44bDAtMzU4LjRDNDQ4IDUyLjEgNDI3LjkgMzIgNDAzLjIgMzJ6TTM3NyAxODAuOGMtMS40IDMxLjUtMjMuNCA3NC43LTY2IDEyOS40LTQ0IDU3LjItODEuMyA4NS44LTExMS43IDg1LjgtMTguOSAwLTM0LjgtMTcuNC00Ny45LTUyLjMtMjUuNS05My4zLTM2LjQtMTQ4LTU3LjQtMTQ4LTIuNCAwLTEwLjkgNS4xLTI1LjQgMTUuMkw1My40IDE5MS4zYzM3LjMtMzIuOCA3Mi45LTY5LjIgOTUuMi03MS4yIDI1LjItMi40IDQwLjcgMTQuOCA0Ni41IDUxLjcgMjAuNyAxMzEuMiAyOS45IDE1MSA2Ny42IDkxLjYgMTMuNS0yMS40IDIwLjgtMzcuNyAyMS44LTQ4LjkgMy41LTMzLjItMjUuOS0zMC45LTQ1LjgtMjIuNCAxNS45LTUyLjEgNDYuMy03Ny40IDkxLjItNzYgMzMuMyAuOSA0OSAyMi41IDQ3LjEgNjQuN3oiXQogICAgfTsKICAgIGZhTWF4Y2RuID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1heGNkbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMTM2IiwgIk00NjEuMSA0NDIuN2wtOTcuNCAwIDUxLjktMjQyLjdjMi4zLTEwLjIgLjktMTkuNS00LjQtMjUuNy01LTYuMS0xMy43LTkuNi0yNC4yLTkuNmwtNDkuMyAwLTU5LjUgMjc4LTk3LjQgMCA1OS41LTI3OC04My40IDAtNTkuNSAyNzgtOTcuNCAwIDU5LjUtMjc4LTQ0LjYtOTUuNCAzNzIuMSAwYzM5LjQgMCA3NS4zIDE2LjMgOTguMyA0NC45IDIzLjMgMjguNiAzMS44IDY3LjQgMjMuNiAxMDUuOUw0NjEuMSA0NDIuN3oiXQogICAgfTsKICAgIGZhU3F1YXJlRm9udEF3ZXNvbWVTdHJva2UgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLWZvbnQtYXdlc29tZS1zdHJva2UiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiZm9udC1hd2Vzb21lLWFsdCJdLCAiZjM1YyIsICJNNjQgNjRDNDYuMyA2NCAzMiA3OC4zIDMyIDk2bDAgMzIwYzAgMTcuNyAxNC4zIDMyIDMyIDMybDMyMCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMzIwYzAtMTcuNy0xNC4zLTMyLTMyLTMyTDY0IDY0ek0wIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NnptMTU0IDU4YzAgOS4zLTQuOCAxNy40LTEyLjEgMjJsMTg4LjkgMGM3LjMgMCAxMy4yIDUuOSAxMy4yIDEzLjIgMCAxLjgtLjQgMy43LTEuMSA1LjRMMzEyIDI2NCAzNDIuOSAzMzMuNGMuOCAxLjcgMS4xIDMuNSAxLjEgNS40IDAgNy4zLTUuOSAxMy4yLTEzLjIgMTMuMmwtMTg2LjggMCAwIDMyLTMyIDAgMC0yMDkuNWMtNi4xLTQuOC0xMC0xMi4yLTEwLTIwLjUgMC0xNC40IDExLjYtMjYgMjYtMjZzMjYgMTEuNiAyNiAyNnoiXQogICAgfTsKICAgIGZhRm9udEF3ZXNvbWVBbHQgPSBmYVNxdWFyZUZvbnRBd2Vzb21lU3Ryb2tlOwogICAgZmFTcGVha2FwID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNwZWFrYXAiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjNmMyIsICJNNjQuNCAzOTEuOEMtMTUgMzAzLjYtNy42IDE2Ny40IDgxLjEgODcuNnMyMjQuOC03MyAzMDQuMiAxNS4yIDcyIDIyNC40LTE2LjYgMzA0LjFjLTE4LjcgMTYuOSA2NCA0My4xIDQyIDUyLjMtODIuMSAzNC4yLTI1My45IDM1LTM0Ni4yLTY3LjVsMCAwek0yNzcuNyAxODAuMmwzOC41LTQwLjljLTkuNi04LjktMzItMjYuOC03Ni4yLTI3LjYtNTIuMy0uOS05NS45IDI4LjMtOTYuOCA4MC0uMiAxMS4zIC4zIDM2LjcgMjkuNCA1NC44IDM0LjUgMjEuNCA4Ni41IDIxLjUgODYgNTIuMy0uNCAyMS4zLTI2LjQgMjUuOC0zOC42IDI1LjYtMyAwLTMwLjItLjUtNDcuNi0yNC42bC00MCA0Mi42YzI4LjIgMjcgNTkgMzIuNiA4My41IDMzIDEwLjIgLjIgOTYuNCAuMyA5Ny44LTgxIC4zLTE1LjgtMi4xLTM5LjctMjguOS01Ni42LTM0LjQtMjEuNi04NS0xOS40LTg0LjQtNDkuNyAuNC0yMy4zIDMxLTI1LjQgMzcuNS0yNS4zIC40IDAgMjYuNiAuMyAzOS42IDE3LjRsMCAweiJdCiAgICB9OwogICAgZmFGYW50YXN5RmxpZ2h0R2FtZXMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZmFudGFzeS1mbGlnaHQtZ2FtZXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjZkYyIsICJNMjU2IDMyLjlMMzIuOSAyNTYgMjU2IDQ3OS4xIDQ3OS4xIDI1NiAyNTYgMzIuOXpNODguMyAyNTUuOGMyLTIgMTEuOS0xMi4zIDk2LjUtOTcuNSA0MS40LTQxLjggODYuMi00My44IDExOS44LTE4LjcgMjQuNiAxOC40IDYyLjEgNTguOSA2Mi4xIDU5IC43IC43IDEuMSAyLjkgLjYgMy40LTExLjMgMTEuOC0yMi43IDIzLjUtMzMuNSAzNC43LTM0LjItMzIuMy00MC41LTM4LjItNDguNS00NC0xNy44LTEyLjctNDEuNC0xMC4xLTU3IDUuMS0yLjIgMi4xLTEuOCAzLjQgLjEgNS40IDIuOSAyLjkgMjguMSAyOC4zIDM1LjEgMzUuOC0xMS45IDExLjYtMjMuNyAyMy0zNS43IDM0LjctMTItMTIuNS0yNC41LTI1LjUtMzYuNS0zOC4xLTIxLjQgMjEuMS00MS43IDQxLjEtNjEuOCA2MUw4OC4zIDI1NS44ek0zMjMuMiAzNTcuNGMtMzUuNSAzNS40LTc4LjEgMzguMS0xMDcgMjAuNS0yMi4xLTEzLjUtMzkuNC0zMi4xLTcyLjktNjYuOCAxMi0xMi40IDIzLjgtMjQuNCAzNS40LTM2LjMgMzMgMzEuOSAzNy4xIDM2IDQ0LjcgNDIuMSAxOC41IDE0LjcgNDIuNSAxMy43IDU5LjMtMS44IDMuNy0zLjQgMy43LTMuNiAuMS03LjItMTAuNi0xMC43LTIxLjItMjEuNC0zMS44LTMyLjItMS4zLTEuMy0zLTIuNS0uOC00LjcgMTAuOC0xMC43IDIxLjUtMjEuNSAzMi4yLTMyLjMgLjMtLjMgLjYtLjQgMS45LTEuMSAxMi40IDEyLjkgMjQuOSAyNS45IDM3LjIgMzguOCAyMS0yMC43IDQxLjItNDAuNyA2MS4zLTYwLjQgMTMuNyAxMy40IDI3LjEgMjYuNiA0MC45IDQwLTIwLjIgMjAuOS04MS43IDgyLjctMTAwLjUgMTAxLjV6TTI1NiAwTDAgMjU2IDI1NiA1MTIgNTEyIDI1NiAyNTYgMHpNMTYgMjU2TDI1NiAxNiA0OTYgMjU2IDI1NiA0OTYgMTYgMjU2eiJdCiAgICB9OwogICAgZmFMaW51eCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJsaW51eCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMTdjIiwgIk0yMjAuOSAxMjMuM2MxIC41IDEuOCAxLjcgMyAxLjcgMS4xIDAgMi44LS40IDIuOS0xLjUgLjItMS40LTEuOS0yLjMtMy4yLTIuOS0xLjctLjctMy45LTEtNS41LS4xLS40IC4yLS44IC43LS42IDEuMSAuMyAxLjMgMi4zIDEuMSAzLjQgMS43ek0xOTkgMTI1YzEuMiAwIDItMS4yIDMtMS43IDEuMS0uNiAzLjEtLjQgMy41LTEuNiAuMi0uNC0uMi0uOS0uNi0xLjEtMS42LS45LTMuOC0uNi01LjUgLjEtMS4zIC42LTMuNCAxLjUtMy4yIDIuOSAuMSAxIDEuOCAxLjUgMi44IDEuNHpNNDIwIDQwMy44Yy0zLjYtNC01LjMtMTEuNi03LjItMTkuNy0xLjgtOC4xLTMuOS0xNi44LTEwLjUtMjIuNC0xLjMtMS4xLTIuNi0yLjEtNC0yLjktMS4zLS44LTIuNy0xLjUtNC4xLTIgOS4yLTI3LjMgNS42LTU0LjUtMy43LTc5LjEtMTEuNC0zMC4xLTMxLjMtNTYuNC00Ni41LTc0LjQtMTcuMS0yMS41LTMzLjctNDEuOS0zMy40LTcyIC41LTQ1LjkgNS4xLTEzMS4yLTc1LjgtMTMxLjMtMTAyLjQtLjItNzYuOCAxMDMuNC03Ny45IDEzNS4yLTEuNyAyMy40LTYuNCA0MS44LTIyLjUgNjQuNy0xOC45IDIyLjUtNDUuNSA1OC44LTU4LjEgOTYuNy02IDE3LjktOC44IDM2LjEtNi4yIDUzLjMtNi41IDUuOC0xMS40IDE0LjctMTYuNiAyMC4yLTQuMiA0LjMtMTAuMyA1LjktMTcgOC4zcy0xNCA2LTE4LjUgMTQuNWMtMi4xIDMuOS0yLjggOC4xLTIuOCAxMi40IDAgMy45IC42IDcuOSAxLjIgMTEuOCAxLjIgOC4xIDIuNSAxNS43IC44IDIwLjgtNS4yIDE0LjQtNS45IDI0LjQtMi4yIDMxLjcgMy44IDcuMyAxMS40IDEwLjUgMjAuMSAxMi4zIDE3LjMgMy42IDQwLjggMi43IDU5LjMgMTIuNSAxOS44IDEwLjQgMzkuOSAxNC4xIDU1LjkgMTAuNCAxMS42LTIuNiAyMS4xLTkuNiAyNS45LTIwLjIgMTIuNS0uMSAyNi4zLTUuNCA0OC4zLTYuNiAxNC45LTEuMiAzMy42IDUuMyA1NS4xIDQuMSAuNiAyLjMgMS40IDQuNiAyLjUgNi43bDAgLjFjOC4zIDE2LjcgMjMuOCAyNC4zIDQwLjMgMjMgMTYuNi0xLjMgMzQuMS0xMSA0OC4zLTI3LjkgMTMuNi0xNi40IDM2LTIzLjIgNTAuOS0zMi4yIDcuNC00LjUgMTMuNC0xMC4xIDEzLjktMTguMyAuNC04LjItNC40LTE3LjMtMTUuNS0yOS43ek0yMjMuOCA4Ny4zYzkuOC0yMi4yIDM0LjItMjEuOCA0NC0uNCA2LjUgMTQuMiAzLjYgMzAuOS00LjMgNDAuNC0xLjYtLjgtNS45LTIuNi0xMi42LTQuOSAxLjEtMS4yIDMuMS0yLjcgMy45LTQuNiA0LjgtMTEuOC0uMi0yNy05LjEtMjcuMy03LjMtLjUtMTMuOSAxMC44LTExLjggMjMtNC4xLTItOS40LTMuNS0xMy00LjQtMS02LjktLjMtMTQuNiAyLjktMjEuOHpNMTgzLjEgNzUuOGMxMC4xIDAgMjAuOCAxNC4yIDE5LjEgMzMuNS0zLjUgMS03LjEgMi41LTEwLjIgNC42IDEuMi04LjktMy4zLTIwLjEtOS42LTE5LjYtOC40IC43LTkuOCAyMS4yLTEuOCAyOC4xIDEgLjggMS45LS4yLTUuOSA1LjUtMTUuNi0xNC42LTEwLjUtNTIuMSA4LjQtNTIuMXptLTEzLjYgNjAuN2M2LjItNC42IDEzLjYtMTAgMTQuMS0xMC41IDQuNy00LjQgMTMuNS0xNC4yIDI3LjktMTQuMiA3LjEgMCAxNS42IDIuMyAyNS45IDguOSA2LjMgNC4xIDExLjMgNC40IDIyLjYgOS4zIDguNCAzLjUgMTMuNyA5LjcgMTAuNSAxOC4yLTIuNiA3LjEtMTEgMTQuNC0yMi43IDE4LjEtMTEuMSAzLjYtMTkuOCAxNi0zOC4yIDE0LjktMy45LS4yLTctMS05LjYtMi4xLTgtMy41LTEyLjItMTAuNC0yMC0xNS04LjYtNC44LTEzLjItMTAuNC0xNC43LTE1LjMtMS40LTQuOSAwLTkgNC4yLTEyLjN6bTMuMyAzMzRjLTIuNyAzNS4xLTQzLjkgMzQuNC03NS4zIDE4LTI5LjktMTUuOC02OC42LTYuNS03Ni41LTIxLjktMi40LTQuNy0yLjQtMTIuNyAyLjYtMjYuNGwwLS4yYzIuNC03LjYgLjYtMTYtLjYtMjMuOS0xLjItNy44LTEuOC0xNSAuOS0yMCAzLjUtNi43IDguNS05LjEgMTQuOC0xMS4zIDEwLjMtMy43IDExLjgtMy40IDE5LjYtOS45IDUuNS01LjcgOS41LTEyLjkgMTQuMy0xOCA1LjEtNS41IDEwLTguMSAxNy43LTYuOSA4LjEgMS4yIDE1LjEgNi44IDIxLjkgMTZsMTkuNiAzNS42YzkuNSAxOS45IDQzLjEgNDguNCA0MSA2OC45em0tMS40LTI1LjljLTQuMS02LjYtOS42LTEzLjYtMTQuNC0xOS42IDcuMSAwIDE0LjItMi4yIDE2LjctOC45IDIuMy02LjIgMC0xNC45LTcuNC0yNC45LTEzLjUtMTguMi0zOC4zLTMyLjUtMzguMy0zMi41LTEzLjUtOC40LTIxLjEtMTguNy0yNC42LTI5LjlzLTMtMjMuMy0uMy0zNS4yYzUuMi0yMi45IDE4LjYtNDUuMiAyNy4yLTU5LjIgMi4zLTEuNyAuOCAzLjItOC43IDIwLjgtOC41IDE2LjEtMjQuNCA1My4zLTIuNiA4Mi40IC42LTIwLjcgNS41LTQxLjggMTMuOC02MS41IDEyLTI3LjQgMzcuMy03NC45IDM5LjMtMTEyLjcgMS4xIC44IDQuNiAzLjIgNi4yIDQuMSA0LjYgMi43IDguMSA2LjcgMTIuNiAxMC4zIDEyLjQgMTAgMjguNSA5LjIgNDIuNCAxLjIgNi4yLTMuNSAxMS4yLTcuNSAxNS45LTkgOS45LTMuMSAxNy44LTguNiAyMi4zLTE1IDcuNyAzMC40IDI1LjcgNzQuMyAzNy4yIDk1LjcgNi4xIDExLjQgMTguMyAzNS41IDIzLjYgNjQuNiAzLjMtLjEgNyAuNCAxMC45IDEuNCAxMy44LTM1LjctMTEuNy03NC4yLTIzLjMtODQuOS00LjctNC42LTQuOS02LjYtMi42LTYuNSAxMi42IDExLjIgMjkuMiAzMy43IDM1LjIgNTkgMi44IDExLjYgMy4zIDIzLjcgLjQgMzUuNyAxNi40IDYuOCAzNS45IDE3LjkgMzAuNyAzNC44LTIuMi0uMS0zLjIgMC00LjIgMCAzLjItMTAuMS0zLjktMTcuNi0yMi44LTI2LjEtMTkuNi04LjYtMzYtOC42LTM4LjMgMTIuNS0xMi4xIDQuMi0xOC4zIDE0LjctMjEuNCAyNy4zLTIuOCAxMS4yLTMuNiAyNC43LTQuNCAzOS45LS41IDcuNy0zLjYgMTgtNi44IDI5LTMyLjEgMjIuOS03Ni43IDMyLjktMTE0LjMgNy4yem0yNTcuNC0xMS41Yy0uOSAxNi44LTQxLjIgMTkuOS02My4yIDQ2LjUtMTMuMiAxNS43LTI5LjQgMjQuNC00My42IDI1LjVzLTI2LjUtNC44LTMzLjctMTkuM2MtNC43LTExLjEtMi40LTIzLjEgMS4xLTM2LjMgMy43LTE0LjIgOS4yLTI4LjggOS45LTQwLjYgLjgtMTUuMiAxLjctMjguNSA0LjItMzguNyAyLjYtMTAuMyA2LjYtMTcuMiAxMy43LTIxLjEgLjMtLjIgLjctLjMgMS0uNSAuOCAxMy4yIDcuMyAyNi42IDE4LjggMjkuNSAxMi42IDMuMyAzMC43LTcuNSAzOC40LTE2LjMgOS0uMyAxNS43LS45IDIyLjYgNS4xIDkuOSA4LjUgNy4xIDMwLjMgMTcuMSA0MS42IDEwLjYgMTEuNiAxNCAxOS41IDEzLjcgMjQuNnpNMTczLjQgMTQ4LjdjMiAxLjkgNC43IDQuNSA4IDcuMSA2LjYgNS4yIDE1LjggMTAuNiAyNy4zIDEwLjYgMTEuNiAwIDIyLjUtNS45IDMxLjgtMTAuOCA0LjktMi42IDEwLjktNyAxNC44LTEwLjRzNS45LTYuMyAzLjEtNi42LTIuNiAyLjYtNiA1LjFjLTQuNCAzLjItOS43IDcuNC0xMy45IDkuOC03LjQgNC4yLTE5LjUgMTAuMi0yOS45IDEwLjJzLTE4LjctNC44LTI0LjktOS43Yy0zLjEtMi41LTUuNy01LTcuNy02LjktMS41LTEuNC0xLjktNC42LTQuMy00LjktMS40LS4xLTEuOCAzLjcgMS43IDYuNXoiXQogICAgfTsKICAgIGZhQ290dG9uQnVyZWF1ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNvdHRvbi1idXJlYXUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjg5ZSIsICJNNDc0LjMgMzMwLjRDNDUwLjYgNDIyLjMgMzgwLjEgNDc1IDI3Mi40IDQ3OC44bDAtNDkuMmMwLTQ4IDI2LjQtNzQuNCA3NC40LTc0LjQgNjIgMCA5OS4yLTM3LjIgOTkuMi05OS4yIDAtNjEuNC0zNi41LTk4LjMtOTcuNC05OS4xLTMzLTY5LjMtMTQ2LjUtNjQuNy0xNzcuMiAwLTYwLjkgLjgtOTcuNCAzNy43LTk3LjQgOTkuMSAwIDYyLjEgMzcuMyA5OS40IDk5LjQgOTkuNCA0OCAwIDc0LjYgMjYuMiA3NC42IDc0LjRsMCA0OS4yYy0xMzQuNC01LTIxMS4xLTg1LjEtMjExLjEtMjIzIDAtMTQxLjggODEuNC0yMjMuMiAyMjMuMi0yMjMuMiAxMTQuOCAwIDE4OS44IDUzLjIgMjE0LjcgMTQ4LjhsMjUuMyAwQzQ3My45IDcxLjUgMzg4LjIgOCAyNTkuOCA4IDEwNSA4IDEyIDEwMS4yIDEyIDI1NS44IDEyIDQxMS4xIDEwNS4yIDUwNC4zIDI1OS44IDUwNCAzODguMSA1MDQgNDczLjcgNDQwLjIgNDk5LjUgMzMwLjRsLTI1LjIgMHpNMzU3IDE4Mi4zYzQxLjQgMy40IDY0LjIgMjkgNjQuMiA3My43IDAgNDgtMjYuNCA3NC40LTc0LjQgNzQuNC0yOC42IDAtNDkuMy05LjYtNjEuNi0yNy4zIDgzLjEtMTYuNSA3NS42LTk5LjcgNzEuOC0xMjAuN3ptLTgxLjcgOTcuNGMtMi41LTEwLjMtMTYuMy04NyA1Ni4yLTk3IDIuMyAxMC4xIDE2LjUgODcuMS01Ni4zIDk3bDAgMHpNMjYwIDEzMmMyOC42IDAgNDkgOS43IDYxLjQgMjcuNi0yOC40IDUuNS00OS40IDIwLjYtNjEuNiA0My40LTEyLjItMjIuOS0zMy4yLTM4LTYxLjYtNDMuNCAxMi40LTE3LjcgMzMuMy0yNy40IDYxLjYtMjcuNGwuMi0uM3ptLTcxLjUgNTAuN2M3My4yIDEwLjYgNTguOSA4Ni44IDU2LjUgOTctNzIuNC05LjgtNTktODctNTYuMi05N2wtLjIgMHpNMTczLjIgMzMwLjRjLTQ4IDAtNzQuNC0yNi40LTc0LjQtNzQuNCAwLTQ0LjQgMjIuOS03MCA2NC4yLTczLjctNi44IDM3LjItMS40IDEwNi41IDcxLjYgMTIwLjctMTIuMSAxNy42LTMyLjggMjcuMy02MS4xIDI3LjNsLS4zIDB6bTUzLjIgMTIuNGMxNC4zLTcuNiAyNi0xOS4zIDMzLjYtMzMuNSA3LjggMTQuNSAxOS4zIDI1LjUgMzMuOCAzMy41LTE0LjQgNy42LTI2LjEgMTkuNC0zMy42IDMzLjgtOC0xNC41LTE5LjEtMjYuMi0zMy42LTMzLjhsLS4zIDB6Il0KICAgIH07CiAgICBmYUdvb2dsZVdhbGxldCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnb29nbGUtd2FsbGV0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYxZWUiLCAiTTE1Ni44IDEyNi44YzM3LjYgNjAuNiA2NC4yIDExMy4xIDg0LjMgMTYyLjUtOC4zIDMzLjgtMTguOCA2Ni41LTMxLjMgOTguMy0xMy4yLTUyLjMtMjYuNS0xMDEuMy01Ni0xNDguNSA2LjUtMzYuNCAyLjMtNzMuNiAzLTExMi4zek0xMDkuMyAyMDBsLTkzLjIgMGMtNi41IDAtMTAuNSA3LjUtNi41IDEyLjcgNDIuMiA1NC4zIDcxLjcgMTE3LjggOTEuNyAxODcuM2wxMDMuNSAwYy0xNi4yLTY5LjctMzguNy0xMzMuNy04Mi41LTE5My41LTMtNC04LTYuNS0xMy02LjV6bTQ3LjgtODhjNjguNSAxMDggMTMwIDIzNC41IDEzOC4yIDM2OEw0MDkgNDgwYy0xMi0xMzgtNjguNC0yNjUtMTQzLjItMzY4bC0xMDguNyAwek00MDguOSA0My41Yy0xLjgtNi44LTguMi0xMS41LTE1LjItMTEuNWwtODguMyAwYy01LjMgMC05IDUtNy44IDEwLjMgMTMuMiA0Ni41IDIyLjMgOTUuNSAyNi41IDE0NiA0OC4yIDg2LjIgNzkuNyAxNzguMyA5MC42IDI3MC44IDE1LjgtNjAuNSAyNS4zLTEzMy41IDI1LjMtMjAzIDAtNzMuNi0xMi4xLTE0NS4xLTMxLjEtMjEyLjZ6Il0KICAgIH07CiAgICBmYUZvdXJzcXVhcmUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZm91cnNxdWFyZSIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMTgwIiwgIk0zMzEuMSAzTDU3LjkgM0MyMC40IDMgOCAzMS4zIDggNDkuMUw4IDQ4Mi45YzAgMjAuMyAxMi4xIDI3LjcgMTguMiAzMC4xIDYuMiAyLjUgMjIuOCA0LjYgMzIuOS03LjEgMTI4LjktMTQ5LjQgMTMxLjEtMTUxLjkgMTMxLjEtMTUxLjkgMy4xLTMuNCAzLjQtMy4xIDYuOC0zLjFsODMuNCAwYzM1LjEgMCA0MC42LTI1LjIgNDQuMy0zOS43bDQ4LjYtMjQzQzM4MS44IDI1LjggMzcxLjEgMyAzMzEuMSAzek0zMTQuOCA3Ni44bC0xMS40IDU5LjdjLTEuMiA2LjUtOS41IDEzLjItMTYuOSAxMy4ybC0xMDYuNCAwYy0xMiAwLTIwLjYgOC4zLTIwLjYgMjAuM2wwIDEzYzAgMTIgOC42IDIwLjYgMjAuNiAyMC42bDkwLjQgMGM4LjMgMCAxNi42IDkuMiAxNC44IDE4LjItMS44IDguOS0xMC41IDUzLjgtMTEuNCA1OC44LS45IDQuOS02LjggMTMuNS0xNi45IDEzLjVsLTczLjUgMGMtMTMuNSAwLTE3LjIgMS44LTI2LjUgMTIuNiAwIDAtOC45IDExLjQtODkuNSAxMDguMy0uOSAuOS0xLjggLjYtMS44LS4zbDAtMzM4LjhjMC03LjcgNi44LTE2LjYgMTYuNi0xNi42bDIxOSAwYzguMiAwIDE1LjYgNy43IDEzLjUgMTcuNXoiXQogICAgfTsKICAgIGZhU2hpcnRzaW5idWxrID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNoaXJ0c2luYnVsayIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMjE0IiwgIk0xMDAgNDEwLjNsMzAuNiAxMy40IDQuNC05LjktMzAuNi0xMy40LTQuNCA5Ljl6bTM5LjQgMTcuNWwzMC42IDEzLjQgNC40LTkuOS0zMC42LTEzLjQtNC40IDkuOXptMTcyLjEtMTRsNC40IDkuOSAzMC42LTEzLjQtNC40LTkuOS0zMC42IDEzLjR6TTE3OS4xIDQ0NWwzMC4zIDEzLjcgNC40LTkuOS0zMC4zLTEzLjQtNC40IDkuNnpNNjAuNCAzOTIuOGwzMC42IDEzLjQgNC40LTkuNi0zMC42LTEzLjctNC40IDkuOXptMjExLjQgMzguNWw0LjQgOS45IDMwLjYtMTMuNC00LjQtOS45LTMwLjYgMTMuNHptLTM5LjMgMTcuNWw0LjQgOS45IDMwLjYtMTMuNy00LjQtOS42LTMwLjYgMTMuNHptMTE4LjQtNTIuMmw0LjQgOS42IDMwLjYtMTMuNC00LjQtOS45LTMwLjYgMTMuN3pNMTcwIDQ2LjZsLTMzLjUgMCAwIDEwLjUgMzMuNSAwIDAtMTAuNXptLTQ3LjIgMGwtMzMuNiAwIDAgMTAuNSAzMy41IDAgLjEtMTAuNXptLTQ3LjMgMGwtMzMuMiAwIDAgMTAuNSAzMy4zIDAtLjEtMTAuNXptMTQxLjUgMGwtMzMuMiAwIDAgMTAuNSAzMy4yIDAgMC0xMC41em05NC41IDBsLTMzLjUgMCAwIDEwLjUgMzMuNSAwIDAtMTAuNXptNDcuMyAwbC0zMy41IDAgMCAxMC41IDMzLjUgMCAwLTEwLjV6bS05NC42IDBsLTMzLjIgMCAwIDEwLjUgMzMuMiAwIDAtMTAuNXptMTQxLjUgMGwtMzMuMyAwIDAgMTAuNSAzMy4zIDAgMC0xMC41ek01Mi44IDM1MS4xbC0xMC44IDAgMCAzMy41IDEwLjggMCAwLTMzLjV6bTcwLTIxNS45bC0zMy42IDAgMCAxMC41IDMzLjUgMCAuMS0xMC41em0tNzAgMTAuNmwyMi44IDAgMC0xMC41LTMzLjYgMCAwIDMzLjUgMTAuOCAwIDAtMjN6TTIyMS43IDM3NC40YTkxLjMgOTEuMyAwIDEgMCAwLTE4Mi42IDkxLjMgOTEuMyAwIDEgMCAwIDE4Mi42ek0xNzMuNSAyNjMuM2MwLTI1LjQgMjkuNS0zMS44IDQ5LjYtMzEuOCAxNi45IDAgMjkuMiA1LjggNDQuMyAxMmwtOC44IDE2LjktLjkgMGMtNi40LTkuOS0yNC44LTEzLjEtMzUuNi0xMy4xLTkgMC0yOS44IDEuOC0yOS44IDE0LjkgMCAyMS42IDc4LjUtMTAuMiA3OC41IDM3LjkgMCAyNS40LTMxLjUgMzEuMi01MSAzMS4yLTE4LjEgMC0zMi40LTIuOS00Ny4yLTEyLjJsOS0xOC40IC45IDBjNi4xIDEyLjIgMjMuNiAxNC45IDM1LjkgMTQuOSA4LjcgMCAzMi43LTEuMiAzMi43LTE0LjMgMC0yNi4xLTc3LjYgNi4zLTc3LjYtMzh6TTUyLjggMTc4LjRsLTEwLjggMCAwIDMzLjYgMTAuOCAwIDAtMzMuNnpNMzk1LjIgMzg0LjZsMTAuOCAwIDAtMzMuNS0xMC44IDAgMCAzMy41ek01Mi44IDMwNy45bC0xMC44IDAgMCAzMy41IDEwLjggMCAwLTMzLjV6TTAgMy43bDAgNDA2IDIyMS43IDk4LjYgMjI2LjMtOTguNiAwLTQwNi00NDggMHpNNDE4LjggMzkwLjhsLTE5Ni44IDg1LjctMTkyLjgtODUuNyAwLTI3MC4xIDM4OS43IDAgMCAyNzAuMS0uMSAwem0wLTI5OS4zbC0zODkuNiAwIDAtNTguNiAzODkuNyAwIDAgNTguNi0uMSAwek01Mi44IDIyMS42bC0xMC44IDAgMCAzMy41IDEwLjggMCAwLTMzLjV6bTAgNDMuMmwtMTAuOCAwIDAgMzMuNSAxMC44IDAgMC0zMy41ek0xNzAgMTM1LjJsLTMzLjUgMCAwIDEwLjUgMzMuNSAwIDAtMTAuNXpNMzk1LjIgMjk4LjNsMTAuOCAwIDAtMzMuNS0xMC44IDAgMCAzMy41em0wLTQzLjJsMTAuOCAwIDAtMzMuNS0xMC44IDAgMCAzMy41ek0yMTcgMTM1LjJsLTMzLjIgMCAwIDEwLjUgMzMuMiAwIDAtMTAuNXpNMzk1LjIgMjEybDEwLjggMCAwLTMzLjUtMTAuOCAwIDAgMzMuNXptMCAxMjkuNWwxMC44IDAgMC0zMy41LTEwLjggMCAwIDMzLjV6bS0xMzEtMjA2LjNsLTMzLjIgMCAwIDEwLjUgMzMuMiAwIDAtMTAuNXptNDcuMyAwbC0zMy41IDAgMCAxMC41IDMzLjUgMCAwLTEwLjV6bTgzLjcgMzMuNmwxMC44IDAgMC0zMy41LTMzLjUgMCAwIDEwLjUgMjIuOCAwLS4xIDIzem0tMzYuNC0zMy42bC0zMy41IDAgMCAxMC41IDMzLjUgMCAwLTEwLjV6Il0KICAgIH07CiAgICBmYU1pbnRiaXQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibWludGJpdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNjJmIiwgIk03My4yIDUxMmwwLTczLjEgMjkyLjUgMCAwLTczLjIgNzMuMiAwIDAtMTQ2LjMgNzMuMSAwIDAtMjE5LjQtMjE5LjQgMCAwIDczLjEtMTQ2LjMgMCAwIDczLjItNzMuMSAwIDAgMjkyLjYtNzMuMiAwIDAgNzMuMSA3My4yIDB6bTczLjEtMjE5LjRsNzMuMiAwIDAgNzMuMS03My4yIDAgMC03My4xem03My4yLTczLjFsNzMuMSAwIDAgNzMuMS03My4yIDAgMC03My4yIC4xIC4xem03My4xIDBsMC03My4yIDczLjIgMCAwIDczLjEtNzMuMiAwIDAgLjF6TTM2NS43IDczLjFsNzMuMiAwIDAgNzMuMi03My4yIDAgMC03My4yeiJdCiAgICB9OwogICAgZmFadWxpcCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ6dWxpcCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlODUzIiwgIk00MjQgOTljMCAyMi42LTEwLjEgNDIuNi0yNS41IDU0LjhMMjQ5LjMgMjg3LjdjLTIuOCAyLjQtNi40LTEuNS00LjQtNC43bDU0LjctMTEwLjFjMS41LTMuMS0uNS02LjktMy42LTYuOUw4My44IDE2NkM1MC45IDE2NiAyNCAxMzUuOSAyNCA5OSAyNCA2Mi4xIDUwLjkgMzIgODMuOCAzMmwyODAuNCAwQzM5Ny4xIDMyIDQyNCA2Mi4xIDQyNCA5OXpNODMuOCA0ODBsMjgwLjQgMGMzMi45IDAgNTkuOC0zMC4yIDU5LjgtNjdzLTI2LjktNjctNTkuOC02N2wtMjEyLjMgMGMtMy4xIDAtNS4xLTMuOC0zLjYtNi45TDIwMy4xIDIyOWMyLTMuMi0xLjYtNy4xLTQuNC00LjdMNDkuNSAzNTguMkMzNC4xIDM3MC40IDI0IDM5MC40IDI0IDQxMyAyNCA0NDkuOCA1MC45IDQ4MCA4My44IDQ4MHoiXQogICAgfTsKICAgIGZhU3RheWxpbmtlZCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzdGF5bGlua2VkIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzZjUiLCAiTTM4Ni43IDI5Mi41bDIuNyAyLjctMTcwLTE2Ny4zYy0zLjUtMy41LTkuNy0zLjctMTMuOC0uNUwxNDguMyAxNzFjLTQuMiAzLjItNC42IDguNy0xLjEgMTIuMmw2OC4xIDY0LjNjMy42IDMuNSA5LjkgMy43IDE0IC41bC4xLS4xYzQuMS0zLjIgMTAuNC0zIDE0IC41bDg0IDgxLjNjMy42IDMuNSAzLjIgOS0uOSAxMi4ybC05My4yIDc0Yy00LjIgMy4zLTEwLjUgMy4xLTE0LjItLjRMNjcuMiAyNjhjLTMuNS0zLjUtOS43LTMuNy0xMy45LS41TDcuNSAzMDIuNGMtNC4yIDMuMi00LjcgOC43LTEuMiAxMi4yTDIxNSA1MTAuN3M3LjQgNi44IDE3LjMtLjhMNDMwLjMgMzQ2YzQtMy4yIDQuNC04LjcgLjctMTIuMmwtNDQuMy00MS4zem01NC41LTgzLjRMMjMwLjcgMi41Yy0xLjUtMS4yLTgtNS41LTE2LjMgMS4xTDcuNiAxNjUuN2MtNC4yIDMuMi00LjggOC43LTEuMiAxMi4ybDQyLjMgNDEuNyAxNzEuNyAxNjUuMWMzLjcgMy41IDEwLjEgMy43IDE0LjMgLjRsNTAuMi0zOC44LS4zLS4zIDcuNy02YzQuMi0zLjIgNC42LTguNyAuOS0xMi4ybC01Ny4xLTU0LjRjLTMuNi0zLjUtMTAtMy43LTE0LjItLjVsLS4xIC4xYy00LjIgMy4yLTEwLjUgMy4xLTE0LjItLjRMMTEzIDE4MC44Yy0zLjYtMy41LTMuMS04LjkgMS4xLTEyLjJsOTIuMi03MS41YzQuMS0zLjIgMTAuMy0zIDEzLjkgLjVsMTYwLjQgMTU5YzMuNyAzLjUgMTAgMy43IDE0LjEgLjVsNDUuOC0zNS44YzQuMS0zLjIgNC40LTguNyAuNy0xMi4yeiJdCiAgICB9OwogICAgZmFXZWJmbG93ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIndlYmZsb3ciLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTY1YyIsICJNNjQwIDY0bC0yMDQuMiAzOTkuMi0xOTEuOCAwIDg1LjUtMTY1LjUtMy44IDBDMjU1LjEgMzg5LjMgMTQ5LjkgNDQ5LjUgMCA0NjMuMkwwIDMwMC4xczk1LjktNS43IDE1Mi4zLTY0LjlsLTE1Mi4zIDAgMC0xNzEuMiAxNzEuMSAwIDAgMTQwLjggMy44IDAgNzAtMTQwLjggMTI5LjQgMCAwIDEzOS45IDMuOCAwIDcyLjYtMTM5LjkgMTg5LjMgMHoiXQogICAgfTsKICAgIGZhUmVucmVuID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInJlbnJlbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMThiIiwgIk0yMTQgMTY5LjFDMjE0IDI3OS41IDE1MyAzNzQuNSA2Ni40IDQxNi41IDMwIDM3My4yIDggMzE3LjcgOCAyNTYuNiA4IDEzMy45IDk3LjEgMzIuMiAyMTQgMTIuNWwwIDE1Ni42ek0yNTUgNTA0Yy00Mi45IDAtODMuMy0xMS0xMTguNS0zMC40IDU3LjItMzYuMSAxMDMuNC05MC43IDExOC41LTE1NC42IDE1LjUgNjMuOSA2MS43IDExOC41IDExOC44IDE1NC43LTM1LjEgMTkuMy03NS41IDMwLjMtMTE4LjggMzAuM3ptMTkwLjYtODcuNUMzNTkgMzc0LjUgMjk4IDI3OS42IDI5OCAxNjkuMWwwLTE1Ni42YzExNi45IDE5LjcgMjA2IDEyMS40IDIwNiAyNDQuMSAwIDYxLjEtMjIgMTE2LjYtNTguNCAxNTkuOXoiXQogICAgfTsKICAgIGZhS29GaSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJrby1maSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlODU2IiwgIk0yNDkuOCA3NWM4OS44IDAgMTEzIDEuMSAxNDYuMyA0LjQgNzguMSA3LjggMTIzLjYgNTYgMTIzLjYgMTI1LjJsMCA4LjljMCA2NC4zLTQ3LjEgMTE2LjktMTEwLjggMTIyLjQtNSAxNi42LTEyLjggMzMuMi0yMy4zIDQ5LjktMjQuNCAzNy43LTczLjEgODUuMy0xNjIuOSA4NS4zbC0xNy43IDBjLTczLjEgMC0xMjkuNy0zMS42LTE2My41LTg5LjItMjkuOS01MC40LTMzLjgtMTA2LjQtMzMuOC0xODEuMiAwLTczLjcgNDQuNC0xMTMuNiA5Ni40LTEyMC4yIDM5LjMtNSA4OC4xLTUuNSAxNDUuNy01LjV6bTAgNDEuNmMtNjAuNCAwLTEwMy42IC41LTEzNi4zIDUuNS00NiA2LjctNjQuMyAzMi43LTY0LjMgNzkuMmwuMiAyNS43YzEuMiA1Ny4zIDcuMSA5Ny4xIDI3LjUgMTM0LjUgMjYuNiA0OS4zIDc0LjggNjguMiAxMjkuNyA2OC4ybDE3LjIgMGM3MiAwIDEwNy0zNC45IDEyNi4zLTY1LjQgOS40LTE1LjUgMTcuNy0zMi43IDIyLjItNTQuM2wzLjMtMTMuOCAxOS45IDBjNDQuMyAwIDgyLjYtMzYgODIuNi04MmwwLTguM2MwLTUxLjUtMzIuMi03OC43LTg4LjEtODUuMy0zMS42LTIuOC01MC40LTMuOS0xNDAuMi0zLjl6TTI2NyAxNjkuMmMzOC4yIDAgNjQuOCAzMS42IDY0LjggNjcgMCAzMi43LTE4LjMgNjEtNDIuMSA4My4xLTE1IDE1LTM5LjMgMzAuNS01NS45IDQwLjUtNC40IDIuOC0xMCA0LjQtMTYuNyA0LjQtNS41IDAtMTAuNS0xLjctMTUuNS00LjQtMTYuNi0xMC00MS0yNS41LTU2LjUtNDAuNS0yMS44LTIwLjgtMzkuMi00Ni45LTQxLjMtNzdsLS4yLTYuMWMwLTM1LjUgMjUuNS02NyA2NC4zLTY3IDIyLjcgMCAzOC44IDExLjYgNDkuMyAyNy43IDExLjYtMTYuMSAyNy4yLTI3LjcgNDkuOS0yNy43em0xMjIuNS0zLjljMjguMyAwIDQzLjggMTYuNiA0My44IDQzLjJzLTE1LjUgNDIuNy00My44IDQyLjdjLTguOSAwLTEzLjgtNS0xMy44LTExLjdsMC02Mi42YzAtNi43IDUtMTEuNiAxMy44LTExLjZ6Il0KICAgIH07CiAgICBmYVJldiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJyZXYiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjViMiIsICJNMTU4LjcgMjc0LjlhNjUuNiA2NS42IDAgMSAxIDEzMS4yIDAgNjUuNiA2NS42IDAgMSAxIC0xMzEuMiAwem0yNzAuNy01LjFsLS4xIDBjLS43LTI5LjMtNy43LTU4LjItMjAuNS04NC42cy0zMS4yLTQ5LjctNTMuOC02OC40TDMwOS42IDE0M2MyMiAxNC4yIDQwLjEgMzMuOCA1Mi43IDU2LjhzMTkuMSA0OC44IDE5LjEgNzUuMWMwIDg2LjYtNzAuNSAxNTcuMS0xNTcuMSAxNTcuMVM2Ny4yIDM2MS41IDY3LjIgMjc0LjljMC04MS45IDYzLTE0OS4zIDE0My0xNTYuNGwwIDM5LjEgMTA4LjgtNjIuOC0xMDguOC02Mi44IDAgMzguM2MtMTA2LjcgNy4yLTE5MSA5Ni0xOTEgMjA0LjYgMCAxMTEuNiA4OS4xIDIwMi4zIDIwMC4xIDIwNWwwIC4xIDIxMC4yIDAgMC0yMTAuMnoiXQogICAgfTsKICAgIGZhS2V5Y2RuID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImtleWNkbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmM2JhIiwgIk02My44IDQwOS4zbDYwLjUtNTljMzIuMSA0Mi44IDcxLjEgNjYgMTI2LjYgNjcuNCAzMC41IC43IDYwLjMtNyA4Ni40LTIyLjQgNS4xIDUuMyAxOC41IDE5LjUgMjAuOSAyMi0zMi4yIDIwLjctNjkuNiAzMS4xLTEwOC4xIDMwLjItNDMuMy0xLjEtODQuNi0xNi43LTExNy43LTQ0LjQgLjMtLjYtMzguMiAzNy41LTM4LjYgMzcuOSA5LjUgMjkuOC0xMy4xIDYyLjQtNDYuMyA2Mi40LTI2LjgtLjEtNDcuNS0yMS43LTQ3LjUtNDguNSAwLTM0LjMgMzMuMS01Ni42IDYzLjgtNDUuNnpNNDE4LjcgMTU2LjljMTkuMSAzMS4zIDI5LjYgNjcuNCAyOC43IDEwNC0xLjEgNDQuOC0xOSA4Ny41LTQ4LjYgMTIxIC4zIC4zIDIzLjggMjUuMiAyNC4xIDI1LjUgOS42LTEuMyAxOS4yIDIgMjUuOSA5LjEgMTEuMyAxMiAxMC45IDMwLjktMS4xIDQyLjQtMTIgMTEuMy0zMC45IDEwLjktNDIuNC0xLjEtNi43LTctOS40LTE2LjgtNy42LTI2LjMtMjQuOS0yNi42LTQ0LjQtNDcuMi00NC40LTQ3LjIgNDIuNy0zNC4xIDYzLjMtNzkuNiA2NC40LTEyNC4yIC43LTI4LjktNy4yLTU3LjItMjEuMS04Mi4ybDIyLjEtMjF6TTEwNCA1My4xYzYuNyA3IDkuNCAxNi44IDcuNiAyNi4zbDQ1LjkgNDguMWMtNC43IDMuOC0xMy4zIDEwLjQtMjIuOCAyMS4zLTI1LjQgMjguNS0zOS42IDY0LjgtNDAuNyAxMDIuOS0uNyAyOC45IDYuMSA1Ny4yIDIwIDgyLjRMOTIgMzU1LjZjLTE5LjMtMzEuNi0yOC45LTY3LjctMjcuOC0xMDQuNyAxLTQ0LjYgMTguMy04Ny42IDQ3LjUtMTIxLjFMODYuNCAxMDMuNGMtOS42IDEuMy0xOS4yLTItMjUuOS05LjEtMTEuMy0xMi0xMC45LTMwLjkgMS4xLTQyLjQgMTEuOS0xMS4yIDMwLjYtMTAuOSA0Mi40IDEuMnpNNDY0LjkgOGMyNiAwIDQ3LjEgMjIuNCA0Ny4xIDQ4LjNTNDkwLjkgMTA0IDQ2NC45IDEwNGMtNi4zIC4xLTE0LTEuMS0xNS45LTEuOGwtNjIuOSA1OS43Yy0zMi43LTQzLjYtNzYuNy02NS45LTEyNi45LTY3LjItMzAuNS0uNy02MC4zIDYuOC04Ni4yIDIyLjRsLTIxLjEtMjJDMTg0LjEgNzQuMyAyMjEuNSA2NCAyNjAgNjQuOSAzMDMuMyA2NiAzNDQuNiA4MS42IDM3Ny43IDEwOS41bDQxLjEtMzguNmMtMS41LTQuNy0yLjItOS42LTIuMi0xNC41LS4xLTI2LjcgMjIuMy00OC40IDQ4LjMtNDguNHpNMjU2LjcgMTEzLjRjNS41IDAgMTAuOSAuNCAxNi40IDEuMSA3OC4xIDkuOCAxMzMuNCA4MS4xIDEyMy44IDE1OS4xLTkuOCA3OC4xLTgxLjEgMTMzLjQtMTU5LjEgMTIzLjgtNzguMS05LjgtMTMzLjQtODEuMS0xMjMuOC0xNTkuMiA5LjMtNzIuNCA3MC4xLTEyNC42IDE0Mi43LTEyNC44em0tNTkgMTE5LjRjLjYgMjIuNyAxMi4yIDQxLjggMzIuNCA1Mi4ybC0xMSA1MS43IDczLjcgMC0xMS01MS43YzIwLjEtMTAuOSAzMi4xLTI5IDMyLjQtNTIuMi0uNC0zMi44LTI1LjgtNTcuNS01OC4zLTU4LjMtMzIuMSAuOC01Ny4zIDI0LjgtNTguMiA1OC4zeiJdCiAgICB9OwogICAgZmFIaXJlQUhlbHBlciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJoaXJlLWEtaGVscGVyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzYjAiLCAiTTQ0My4xIDBMNzEuOSAwQzY3LjkgMzcuMyAzNy40IDY3LjggMCA3MS43TDAgNDQzLjJjMzcuNCA0LjkgNjYgMzIuNCA3MS45IDY4LjhsMzcyLjIgMGMzLTM2LjQgMzIuNS02NS44IDY3LjktNjkuOGwwLTM3MC41QzQ3NS42IDY1LjggNDQ3IDM2LjQgNDQzLjEgMHptLTM3IDQwNC45Yy0zNi4zIDAtMTguOC0yLTU1LjEtMi0zNS44IDAtMjEgMi01Ni4xIDItNS45IDAtNC45LTguMiAwLTkuOCAyMi44LTcuNiAyMi45LTEwLjIgMjQuNi0xMi44IDEwLjQtMTUuNiA1LjktODMgNS45LTExMyAwLTUuMy02LjQtMTIuOC0xMy44LTEyLjhsLTExMS4yIDBjLTcuNCAwLTEzLjggNy41LTEzLjggMTIuOCAwIDMwLTQuNSA5Ny40IDUuOSAxMTMgMS43IDIuNSAxLjggNS4yIDI0LjYgMTIuOCA0LjkgMS42IDYgOS44IDAgOS44LTM1LjEgMC0yMC4zLTItNTYuMS0yLTM2LjMgMC0xOC44IDItNTUuMSAyLTcuOSAwLTUuOC0xMC44IDAtMTAuOCAxMC4yLTMuNCAxMy41LTMuNSAyMS43LTEzLjggNy43LTEyLjkgNy45LTQ0LjQgNy45LTEyNy44bDAtMTAxLjJjMC0yMi4yLTEyLjItMjguMy0yOC42LTMyLjQtOC44LTIuMi00LTExLjggMS0xMS44IDM2LjUgMCAyMC42IDIgNTcuMSAyIDMyLjcgMCAxNi41LTIgNDkuMi0yIDMuMyAwIDguNSA4LjMgMSAxMC44LTQuOSAxLjYtMjcuNiAzLjctMjcuNiAzOS4zIDAgNDUuNi0uMiA1NS44IDEgNjguOCAwIDEuMyAyLjMgMTIuOCAxMi44IDEyLjhsMTA5LjIgMGMxMC41IDAgMTIuOC0xMS41IDEyLjgtMTIuOCAxLjItMTMgMS0yMy4yIDEtNjguOCAwLTM1LjYtMjIuNy0zNy43LTI3LjYtMzkuMy03LjUtMi41LTIuMy0xMC44IDEtMTAuOCAzMi43IDAgMTYuNSAyIDQ5LjIgMiAzNi41IDAgMjAuNi0yIDU3LjEtMiA0LjkgMCA5LjkgOS42IDEgMTEuOC0xNi40IDQuMS0yOC42IDEwLjMtMjguNiAzMi40bDAgMTAxLjJjMCA4My40IC4xIDExNC45IDcuOSAxMjcuOCA4LjIgMTAuMiAxMS40IDEwLjQgMjEuNyAxMy44IDUuOCAwIDcuOCAxMC44IDAgMTAuOHoiXQogICAgfTsKICAgIGZhU3F1YXJlSGFja2VyTmV3cyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtaGFja2VyLW5ld3MiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiaGFja2VyLW5ld3Mtc3F1YXJlIl0sICJmM2FmIiwgIk00NDggOTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMHpNMjEgMjI5LjJzLjEtLjEgLjEtLjIgLjEtLjIgLjItLjJjMCAuMSAwIC4zLS4xIC40bC0uMiAwek0yMzkuMiAzODRsLTMxLjQgMCAwLTEwMi43LTc5LjgtMTUzLjMgMzcuMyAwYzQxLjUgNzcuNyA0OC4xIDk1LjggNTQuMSAxMTIgMS42IDQuMyAzLjEgOC41IDUuMiAxMy42IDMuMi03IDUuMS0xMS45IDcuMS0xNy4zIDUuOS0xNS4zIDEyLjgtMzMuMiA1My41LTEwOC4zbDM0LjggMC04MC44IDE1NS4xIDAgMTAwLjl6Il0KICAgIH07CiAgICBmYUhhY2tlck5ld3NTcXVhcmUgPSBmYVNxdWFyZUhhY2tlck5ld3M7CiAgICBmYUNyZWF0aXZlQ29tbW9uc1BkQWx0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNyZWF0aXZlLWNvbW1vbnMtcGQtYWx0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0ZWQiLCAiTTI1NS42IDhDMTEyLjcgOCA4IDEyMy4xIDggMjU2IDggMzk0LjUgMTIxLjYgNTA0IDI1NS42IDUwNCAzODUuNSA1MDQgNTA0IDQwMy4xIDUwNCAyNTYgNTA0IDExOC4xIDM5Ny40IDggMjU1LjYgOHptLjggNDUwLjhjLTExMi41IDAtMjAzLjctOTMtMjAzLjctMjAyLjggMC0xMDUuNCA4NS41LTIwMy4zIDIwMy43LTIwMy4zIDExMi42IDAgMjAyLjkgODkuNSAyMDIuOCAyMDMuMyAwIDEyMS43LTk5LjYgMjAyLjgtMjAyLjggMjAyLjh6TTMyNC43IDE4NmwtNTMuMiAwIDAgMTM3LjIgNTMuMiAwYzIxLjQgMCA3MC01LjEgNzAtNjguNiAwLTYzLjQtNDguNi02OC42LTcwLTY4LjZ6bS44IDEwOC41bC0xOS45IDAgMC03OS43IDE5LjQtLjFjMy44IDAgMzUtMi4xIDM1IDM5LjkgMCAyNC42LTEwLjUgMzkuOS0zNC41IDM5Ljl6TTIxMS43IDE4NmwtNjguMiAwIDAgMTM3LjMgMzQuNiAwIDAtNDQuMyAyNyAwYzU0LjEgMCA1Ny4xLTM3LjUgNTcuMS00Ni41IDAtMzEtMTYuOC00Ni41LTUwLjUtNDYuNXptLTQuOSA2Ny4zbC0yOS4yIDAgMC00MS42IDI4LjMgMGMzMC45IDAgMjguOCA0MS42IC45IDQxLjZ6Il0KICAgIH07CiAgICBmYU9yY2lkID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm9yY2lkIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY4ZDIiLCAiTTI5NC43IDE4OC4ybC00NS45IDAgMCAxNTMuOCA0Ny41IDBjNjcuNiAwIDgzLjEtNTEuMyA4My4xLTc2LjkgMC00MS42LTI2LjUtNzYuOS04NC43LTc2Ljl6TTI1NiA4YTI0OCAyNDggMCAxIDAgMCA0OTYgMjQ4IDI0OCAwIDEgMCAwLTQ5NnpNMTc1LjIgMzY4LjhsLTI5LjggMCAwLTIwNy41IDI5LjggMCAwIDIwNy41ek0xNjAuMyA5OC41YTE5LjYgMTkuNiAwIDEgMSAwIDM5LjIgMTkuNiAxOS42IDAgMSAxIDAtMzkuMnpNMzAwIDM2OWwtODEgMCAwLTIwNy43IDgwLjYgMGM3Ni43IDAgMTEwLjQgNTQuOCAxMTAuNCAxMDMuOSAwIDUzLjMtNDEuNyAxMDMuOS0xMTAgMTAzLjl6Il0KICAgIH07CiAgICBmYUJvYXJkR2FtZUdlZWsgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYm9hcmQtZ2FtZS1nZWVrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbImJnZyJdLCAiZTg1NSIsICJNMTY4LjggMTY4LjNsMzAuMS04LjItMTIuMyA5OC44IDE2LjcgMTYuMS0zOC45IDkxLjItMTExLjggNDEuMi01Mi42LTEzMS44IDE3LjctMTctMTAuNS04NC4zIDE5MS4yLTcwLjMtMjkuNSA2NC4zem0xODAuNiAxNi41YzExLjYgMCAxOSA3LjQgMTkgMTcuOWwwIDMxLjVjMCA5LjctNi4zIDE4LjktMTkuNSAyMi4xIDEzLjEgMy4xIDIwLjUgMTIgMjAuNSAyMS40bDAgMzAuOWMwIDExLjEtNy40IDE4LjEtMTkgMTguMWwtODkuMSAwIDAtMTQxLjggODggMHpNMjk4IDI5OS44bDMzIDBjMS41IDAgMi4xLTEgMi4xLTIuMWwwLTI2LjljMC0xLS42LTIuMy0yLjEtMi4zbC0zMyAwIDAgMzEuM3ptMC01Ny4zbDMzIDBjMS41IDAgMi4xLTEuMSAyLjEtMi4zbDAtMjQuOGMwLTEtLjYtMi4zLTIuMS0yLjNsLTMzIDAgMCAyOS40em0yMDQuMS0yNy4ybC02NS42IDBjLTEgMC0yLjEgMS4xLTIuMSAyLjNsMCA3Ni4xYzAgMS4zIDEgMi4xIDIuMSAyLjFsMjkuNyAwYzEuNSAwIDIuMy0uOCAyLjMtMi4xbDAtMjQtMTkuMyAwIDEyLjgtMzAgNDAuMSAwIDAgNzAuOGMwIDkuMi03LjIgMTYuMi0xNi4zIDE2LjJsLTcxLjUgMGMtOS4xIDAtMTYuNS03LTE2LjUtMTYuMmwwLTEwOS43YzAtOC42IDcuNC0xNiAxNi41LTE2bDg3LjggMCAwIDMwLjV6bTEzMi42IDBsLTY1LjYgMGMtMS4xIDAtMi4xIDEuMS0yLjEgMi4zbDAgNzYuMWMwIDEuMyAxIDIuMSAyLjEgMi4xbDI5LjYgMGMxLjUgMCAyLjMtLjggMi4zLTIuMWwwLTI0LTE5LjIgMCAxMi44LTMwIDQwLjEgMCAwIDcwLjhjMCA5LjItNy4yIDE2LjItMTYuMyAxNi4ybC03MS41IDBjLTkuMSAwLTE2LjUtNi45LTE2LjUtMTYuMmwwLTEwOS43YzAtOC42IDcuNC0xNiAxNi41LTE2bDg3LjggMCAwIDMwLjV6Il0KICAgIH07CiAgICBmYUJnZyA9IGZhQm9hcmRHYW1lR2VlazsKICAgIGZhQmVoYW5jZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJiZWhhbmNlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYxYjQiLCAiTTIzMiAyMzcuMmMzMS44LTE1LjIgNDguNC0zOC4yIDQ4LjQtNzQgMC03MC42LTUyLjYtODcuOC0xMTMuMy04Ny44bC0xNjcuMSAwIDAgMzU0LjQgMTcxLjggMGM2NC40IDAgMTI0LjktMzAuOSAxMjQuOS0xMDIuOSAwLTQ0LjUtMjEuMS03Ny40LTY0LjctODkuN3pNNzcuOSAxMzUuOWw3My4xIDBjMjguMSAwIDUzLjQgNy45IDUzLjQgNDAuNSAwIDMwLjEtMTkuNyA0Mi4yLTQ3LjUgNDIuMmwtNzkgMCAwLTgyLjd6bTgzLjMgMjMzLjdsLTgzLjMgMCAwLTk3LjYgODQuOSAwYzM0LjMgMCA1NiAxNC4zIDU2IDUwLjYgMCAzNS44LTI1LjkgNDctNTcuNiA0N3pNNTE5LjcgMTI4LjlsLTE0My43IDAgMC0zNC45IDE0My43IDAgMCAzNC45ek01NzYgMzA1LjJjMC03NS45LTQ0LjQtMTM5LjItMTI0LjktMTM5LjItNzguMiAwLTEzMS4zIDU4LjgtMTMxLjMgMTM1LjggMCA3OS45IDUwLjMgMTM0LjcgMTMxLjMgMTM0LjcgNjEuMyAwIDEwMS0yNy42IDEyMC4xLTg2LjNsLTYyLjIgMGMtNi43IDIxLjktMzQuMyAzMy41LTU1LjcgMzMuNS00MS4zIDAtNjMtMjQuMi02My02NS4zbDE4NS4xIDBjLjMtNC4yIC42LTguNyAuNi0xMy4yek0zOTAuNCAyNzRjMi4zLTMzLjcgMjQuNy01NC44IDU4LjUtNTQuOCAzNS40IDAgNTMuMiAyMC44IDU2LjIgNTQuOGwtMTE0LjcgMHoiXQogICAgfTsKICAgIGZhTW9uZXJvID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm1vbmVybyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmM2QwIiwgIk0zNjAgMzg0bDEwOC40IDBDNDI1IDQ1NS45IDM0Ni4xIDUwNCAyNTYgNTA0Uzg3IDQ1NS45IDQzLjYgMzg0bDEwOC40IDAgMC0xMjcuOCAxMDQgMTA0LjggMTA0LTEwNSAwIDEyOHpNOTYgMzM2bDAtMjA4IDE1OS40IDE1OS40IDE2MC42LTE1OS40IDAgMjA4IDc0LjggMGM4LjUtMjUuMSAxMy4yLTUyIDEzLjItODAgMC0xMzctMTExLTI0OC0yNDgtMjQ4UzggMTE5IDggMjU2YzAgMjggNC42IDU0LjkgMTMuMiA4MEw5NiAzMzZ6Il0KICAgIH07CiAgICBmYUZpZ21hID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImZpZ21hIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY3OTkiLCAiTTE0IDk1LjhDMTQgNDIuOSA1Ni45IDAgMTA5LjggMEwyNzQuMiAwYzUyLjkgMCA5NS44IDQyLjkgOTUuOCA5NS44IDAgMzMuNS0xNy4yIDYzLTQzLjIgODAuMSAyNiAxNy4xIDQzLjIgNDYuNiA0My4yIDgwLjEgMCA1Mi45LTQyLjkgOTUuOC05NS44IDk1LjhsLTIuMSAwYy0yNC44IDAtNDcuNC05LjQtNjQuNC0yNC45bDAgODguM2MwIDUzLjYtNDQgOTYuOC05Ny40IDk2LjgtNTIuOCAwLTk2LjMtNDIuOC05Ni4zLTk1LjggMC0zMy41IDE3LjItNjMgNDMuMi04MC4xLTI2LTE3LjEtNDMuMi00Ni42LTQzLjItODAuMXMxNy4yLTYzIDQzLjItODAuMUMzMS4yIDE1OC44IDE0IDEyOS4zIDE0IDk1Ljh6bTE2Mi4zIDk1LjhsLTY2LjUgMGMtMzUuNiAwLTY0LjQgMjguOC02NC40IDY0LjQgMCAzNS40IDI4LjYgNjQuMiA2NCA2NC40bDY2LjkgMCAwLTEyOC44ek0yMDcuNyAyNTZjMCAzNS42IDI4LjggNjQuNCA2NC40IDY0LjRsMi4xIDBjMzUuNiAwIDY0LjQtMjguOCA2NC40LTY0LjRzLTI4LjgtNjQuNC02NC40LTY0LjRsLTIuMSAwYy0zNS42IDAtNjQuNCAyOC44LTY0LjQgNjQuNHptLTk3LjkgOTUuOGwtLjQgMGMtMzUuNCAuMi02NCAyOS02NCA2NC40czI5LjIgNjQuNCA2NC45IDY0LjRjMzYuMyAwIDY2LTI5LjQgNjYtNjUuNWwwLTYzLjQtNjYuNSAwem0wLTMyMC40Yy0zNS42IDAtNjQuNCAyOC44LTY0LjQgNjQuNHMyOC44IDY0LjQgNjQuNCA2NC40bDY2LjUgMCAwLTEyOC44LTY2LjUgMHptOTcuOSAxMjguOGw2Ni41IDBjMzUuNiAwIDY0LjQtMjguOCA2NC40LTY0LjRzLTI4LjgtNjQuNC02NC40LTY0LjRsLTY2LjUgMCAwIDEyOC44eiJdCiAgICB9OwogICAgZmFJbnN0YWdyYW0gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaW5zdGFncmFtIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYxNmQiLCAiTTIyNC4zIDE0MWExMTUgMTE1IDAgMSAwIC0uNiAyMzAgMTE1IDExNSAwIDEgMCAuNi0yMzB6bS0uNiA0MC40YTc0LjYgNzQuNiAwIDEgMSAuNiAxNDkuMiA3NC42IDc0LjYgMCAxIDEgLS42LTE0OS4yem05My40LTQ1LjFhMjYuOCAyNi44IDAgMSAxIDUzLjYgMCAyNi44IDI2LjggMCAxIDEgLTUzLjYgMHptMTI5LjcgMjcuMmMtMS43LTM1LjktOS45LTY3LjctMzYuMi05My45LTI2LjItMjYuMi01OC0zNC40LTkzLjktMzYuMi0zNy0yLjEtMTQ3LjktMi4xLTE4NC45IDAtMzUuOCAxLjctNjcuNiA5LjktOTMuOSAzNi4xcy0zNC40IDU4LTM2LjIgOTMuOWMtMi4xIDM3LTIuMSAxNDcuOSAwIDE4NC45IDEuNyAzNS45IDkuOSA2Ny43IDM2LjIgOTMuOXM1OCAzNC40IDkzLjkgMzYuMmMzNyAyLjEgMTQ3LjkgMi4xIDE4NC45IDAgMzUuOS0xLjcgNjcuNy05LjkgOTMuOS0zNi4yIDI2LjItMjYuMiAzNC40LTU4IDM2LjItOTMuOSAyLjEtMzcgMi4xLTE0Ny44IDAtMTg0Ljh6TTM5OSAzODhjLTcuOCAxOS42LTIyLjkgMzQuNy00Mi42IDQyLjYtMjkuNSAxMS43LTk5LjUgOS0xMzIuMSA5cy0xMDIuNyAyLjYtMTMyLjEtOWMtMTkuNi03LjgtMzQuNy0yMi45LTQyLjYtNDIuNi0xMS43LTI5LjUtOS05OS41LTktMTMyLjFzLTIuNi0xMDIuNyA5LTEzMi4xYzcuOC0xOS42IDIyLjktMzQuNyA0Mi42LTQyLjYgMjkuNS0xMS43IDk5LjUtOSAxMzIuMS05czEwMi43LTIuNiAxMzIuMSA5YzE5LjYgNy44IDM0LjcgMjIuOSA0Mi42IDQyLjYgMTEuNyAyOS41IDkgOTkuNSA5IDEzMi4xczIuNyAxMDIuNy05IDEzMi4xeiJdCiAgICB9OwogICAgZmFQZXJieXRlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInBlcmJ5dGUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTA4MyIsICJNMzA1LjMgMjg0LjZsLTU4LjcgMCAwIDk4LjcgNTguNyAwYzE2LjMgMCAyOS00LjYgMzguMi0xMy44czEzLjgtMjEuMiAxMy44LTM2LjFjMC0xNC42LTQuNy0yNi4zLTE0LTM1LjNzLTIyLTEzLjUtMzcuOS0xMy41ek0xNDkuNCAxMjguN2wtNTguNyAwIDAgOTguNyA1OC43IDBjMTYuMyAwIDI5LTQuNiAzOC4yLTEzLjhzMTMuOC0yMS4yIDEzLjgtMzYuMWMwLTE0LjYtNC43LTI2LjMtMTQtMzUuM3MtMjItMTMuNS0zNy45LTEzLjV6TTM2Ni42IDMyTDgxLjQgMzJjLTIxLjYgMC00Mi4yIDguNi01Ny41IDIzLjlTMCA5MS44IDAgMTEzLjRMMCAzOTguNmMwIDIxLjYgOC42IDQyLjIgMjMuOSA1Ny41UzU5LjggNDgwIDgxLjQgNDgwbDI4NS4zIDBjMjEuNiAwIDQyLjItOC42IDU3LjUtMjMuOVM0NDggNDIwLjIgNDQ4IDM5OC42bDAtMjg1LjNjMC0yMS42LTguNi00Mi4yLTIzLjktNTcuNVMzODguMiAzMiAzNjYuNiAzMnptNjMuNiAzNjYuNmMwIDE2LjktNi43IDMzLTE4LjcgNDVzLTI4LjEgMTguNi00NSAxOC43bC0yODUuMyAwYy0xNi45IDAtMzMtNi43LTQ1LTE4LjdzLTE4LjYtMjguMS0xOC43LTQ1bDAtMjg1LjNjMC0xNi45IDYuNy0zMyAxOC43LTQ1czI4LjEtMTguNiA0NS0xOC43bDI4NS4zIDBjMTYuOSAwIDMzIDYuNyA0NSAxOC43czE4LjYgMjguMSAxOC43IDQ1bDAgMjg1LjN6bS0xMjUtMjY5LjlsLTU4LjcgMCAwIDk4LjcgNTguNyAwYzE2LjMgMCAyOS00LjYgMzguMi0xMy44czEzLjgtMjEuMiAxMy44LTM2LjFjMC0xNC42LTQuNy0yNi4zLTE0LTM1LjNzLTIyLTEzLjUtMzcuOS0xMy41eiJdCiAgICB9OwogICAgZmFTcXVhcmVWaW1lbyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtdmltZW8iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsidmltZW8tc3F1YXJlIl0sICJmMTk0IiwgIk00NDggOTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMHpNMzE4LjUgMzA5LjVjLTQzLjUgNTYuNS04MC4zIDg0LjgtMTEwLjQgODQuOC0xOC43IDAtMzQuNC0xNy4yLTQ3LjMtNTEuNi0zLjgtMTMuOS03LjMtMjYuOS0xMC41LTM5LTE4LjItNjguMy0yOC42LTEwNy40LTQ2LjItMTA3LjQtMi40IDAtMTAuOCA1LTI1LjEgMTUuMUw2NCAxOTJjNy02LjEgMTMuOS0xMi40IDIwLjYtMTguNSAyOS4xLTI2LjMgNTUuNi01MC4zIDczLjUtNTEuOSAyNC45LTIuNCA0MC4yIDE0LjYgNDYgNTEuMSAyMC41IDEyOS42IDI5LjYgMTQ5LjIgNjYuOCA5MC41IDEzLjQtMjEuMiAyMC42LTM3LjIgMjEuNS00OC4zIDMuNC0zMi44LTI1LjYtMzAuNi00NS4yLTIyLjIgMTUuNy01MS41IDQ1LjgtNzYuNSA5MC4xLTc1LjEgMzIuOSAxIDQ4LjQgMjIuNCA0Ni41IDY0LTEuNCAzMS4xLTIzLjIgNzMuOC02NS4zIDEyNy45eiJdCiAgICB9OwogICAgZmFWaW1lb1NxdWFyZSA9IGZhU3F1YXJlVmltZW87CiAgICBmYVB1c2hlZCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwdXNoZWQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjNlMSIsICJNNDE1LjEgMTExLjlsLTk4LjUtOSAxNC0zMy40YzEwLjQtMjMuNS0xMC44LTQwLjQtMjguNy0zN0wzMC42IDc2LjljLTE1LjEgMi43LTI2IDE4LjMtMjEuNCAzNi42TDExNC4zIDQ2MS44YzYuNSAyMS4zIDM2LjcgMjQuMiA0Ny43IDdMMTk3LjMgMzg4IDQzMi41IDE1Ni43YzE2LjQtMTYuOCA0LjMtNDIuOS0xNy40LTQ0Ljh6TTMwNS43IDUzLjZjNS4xLS43IDcuNSAyLjUgNS4yIDcuNGwtMTYuOCAzOS45LTE3Ny40LTE2LjMgMTg5LTMxek0zMC44IDEwNy45Yy0zLjEtNS4xIDEtMTAgNi4xLTkuMWwyNDguNyAyMi43LTk2LjkgMjMwLjctMTU3LjktMjQ0LjN6TTE0NC4xIDQ1Ni40Yy0yLjYgNC03LjkgMy4xLTkuNC0xLjJMNTEuNiAxNzkuNyAxNzkuMyAzNzcuM2MtNyAxNS0zNS4yIDc5LjEtMzUuMiA3OS4xek00MTYuOSAxNDEuOWwtMTk4LjcgMTk1LjQgODkuNy0yMTMuNyAxMDYuNCA5LjdjNCAxLjEgNS43IDUuMyAyLjYgOC42eiJdCiAgICB9OwogICAgZmFNaXhjbG91ZCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJtaXhjbG91ZCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmMjg5IiwgIk0yMTMgMzQ2LjZsLTMzLjIgMCAwLTE1MS41IDYuMi0yMS42LTEwLjcgMC0zOC4xIDE3My4xLTYxIDAtMzguNC0xNzMuMS0xMC41IDAgNS45IDIxLjYgMCAxNTEuNS0zMy4yIDAgMC0xODEuNiA2NS43IDAgMzYuNiAxNzMuMSA4LjUgMCAzNi42LTE3My4xIDY1LjcgMCAwIDE4MS42em0zMzEuNS02M2wtODYgNjIuMSAwLTM4LjEgNzIuOS01MS44LTcyLjktNTEuOCAwLTM4LjEgODYgNjIuMyA5LjMgMCA4Ni4zLTYyLjMgMCAzOC4xLTczLjEgNTEuOCA3My4xIDUxLjggMCAzOC4xLTg2LjMtNjIuMS05LjMgMHpNNDMwLjIgMjcyLjNsLTE4MiAwIDAtMzMuMSAxODIgMCAwIDMzLjF6Il0KICAgIH07CiAgICBmYVlhbmRleEludGVybmF0aW9uYWwgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAieWFuZGV4LWludGVybmF0aW9uYWwiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZjQxNCIsICJNMTI5LjUgNTEybDAtMTY2LjEtMTExLTI5Ny45IDU1LjggMCA4MS44IDIyOS43IDk0LjEtMjc3LjcgNTEuMyAwLTEyMC43IDM0Ny44IDAgMTY0LjItNTEuMyAweiJdCiAgICB9OwogICAgZmFIaXZlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImhpdmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTA3ZiIsICJNMjYwLjQgMjU0LjlMMTMxLjUgMzMuMWMtLjItLjMtLjUtLjYtLjgtLjhzLS43LS4zLTEuMS0uMy0uOCAuMS0xLjEgLjMtLjYgLjUtLjggLjhMLjMgMjU0LjljLS4yIC4zLS4zIC43LS4zIDEuMXMuMSAuOCAuMyAxLjFMMTI5LjEgNDc4LjljLjIgLjMgLjUgLjYgLjggLjhzLjcgLjMgMS4xIC4zIC44LS4xIDEuMS0uMyAuNi0uNSAuOC0uOEwyNjAuNCAyNTcuMWMuMi0uMyAuMy0uNyAuMy0xLjFzLS4xLS44LS4zLTEuMXptMzkuMS0yNS43Yy4yIC4zIC41IC42IC44IC44cy43IC4zIDEuMSAuM2w2Ni41IDBjLjQgMCAuOC0uMSAxLjEtLjNzLjYtLjUgLjgtLjggLjMtLjcgLjMtMS4xLS4xLS44LS4zLTEuMUwyNTkuMSAzMy4xYy0uMi0uMy0uNS0uNi0uOC0uOHMtLjctLjMtMS4xLS4zbC02Ni41IDBjLS40IDAtLjggLjEtMS4xIC4zcy0uNiAuNS0uOCAuOC0uMyAuNy0uMyAxLjEgLjEgLjggLjMgMS4xTDI5OS40IDIyOS4yem0yMTIuMyAyNS43TDM4NC45IDMzLjFjLS4yLS4zLS41LS42LS44LS44cy0uNy0uMy0xLjEtLjNsLTY2LjYgMGMtLjQgMC0uOCAuMS0xLjEgLjNzLS42IC41LS44IC44LS4zIC43LS4zIDEuMSAuMSAuOCAuMyAxLjFMNDQwLjcgMjU2IDMxNC41IDQ3Ni43Yy0uMiAuMy0uMyAuNy0uMyAxLjFzLjEgLjggLjMgMS4xIC41IC42IC44IC44IC43IC4zIDEuMSAuM2w2Ni42IDBjLjQgMCAuOC0uMSAxLjEtLjNzLjYtLjUgLjgtLjhMNTExLjcgMjU3LjFjLjItLjMgLjMtLjcgLjMtMS4xcy0uMS0uOC0uMy0xLjF6TTM2NiAyODQuOWwtNjYuNSAwYy0uNCAwLS44IC4xLTEuMSAuM3MtLjYgLjUtLjggLjhMMTg4LjggNDc2LjdjLS4yIC4zLS4zIC43LS4zIDEuMXMuMSAuOCAuMyAxLjEgLjUgLjYgLjggLjggLjcgLjMgMS4xIC4zbDY2LjUgMGMuNCAwIC44LS4xIDEuMS0uM3MuNi0uNSAuOC0uOEwzNjcuOSAyODguM2MuMi0uMyAuMy0uNyAuMy0xLjFzLS4xLS44LS4zLTEuMS0uNS0uNi0uOC0uOC0uNy0uMy0xLjEtLjN6Il0KICAgIH07CiAgICBmYUNyZWF0aXZlQ29tbW9uc1plcm8gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY3JlYXRpdmUtY29tbW9ucy16ZXJvIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0ZjMiLCAiTTI1NS42IDhDMzk3LjQgOCA1MDQgMTE4LjEgNTA0IDI1NiA1MDQgNDAzLjEgMzg1LjUgNTA0IDI1NS42IDUwNCAxMjEuNiA1MDQgOCAzOTQuNSA4IDI1NiA4IDEyMy4xIDExMi43IDggMjU1LjYgOHptLjggNDQuN2MtMTE4LjIgMC0yMDMuNyA5Ny45LTIwMy43IDIwMy4zIDAgMTA5LjggOTEuMiAyMDIuOCAyMDMuNyAyMDIuOCAxMDMuMiAwIDIwMi44LTgxLjEgMjAyLjgtMjAyLjggLjEtMTEzLjgtOTAuMi0yMDMuMy0yMDIuOC0yMDMuM3ptLS40IDYwLjVjLTgxLjkgMC0xMDIuNSA3Ny4zLTEwMi41IDE0Mi44UzE3NC4xIDM5OC44IDI1NiAzOTguOCAzNTguNSAzMjEuNSAzNTguNSAyNTYgMzM3LjkgMTEzLjIgMjU2IDExMy4yem0wIDUzLjljMy4zIDAgNi40IC41IDkuMiAxLjIgNS45IDUuMSA4LjggMTIuMSAzLjEgMjEuOUwyMTMuOCAyOTAuNGMtMS43LTEyLjctMS45LTI1LjEtMS45LTM0LjQgMC0yOC44IDItODguOSA0NC4xLTg4Ljl6bTQwLjggNDYuMmMyLjkgMTUuNCAzLjMgMzEuNCAzLjMgNDIuNyAwIDI4LjktMiA4OC45LTQ0LjEgODguOS0xMy41IDAtMzIuNi03LjctMjAuMS0yNi40bDYwLjktMTA1LjJ6Il0KICAgIH07CiAgICBmYVNxdWFyZVNuYXBjaGF0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1zbmFwY2hhdCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJzbmFwY2hhdC1zcXVhcmUiXSwgImYyYWQiLCAiTTM4NCAzMkw2NCAzMmMtMTcgMC0zMy4zIDYuNy00NS4zIDE4LjdTMCA3OSAwIDk2TDAgNDE2YzAgMTcgNi43IDMzLjMgMTguNyA0NS4zUzQ3IDQ4MCA2NCA0ODBsMzIwIDBjMTcgMCAzMy4zLTYuNyA0NS4zLTE4LjdTNDQ4IDQzMyA0NDggNDE2bDAtMzIwYzAtMTctNi43LTMzLjMtMTguNy00NS4zUzQwMSAzMiAzODQgMzJ6bS0zLjkgMzE5LjNsLS4xIC4xYy0yLjUgMi44LTUuNCA1LjEtOC43IDYuOC02LjUgMy42LTEzLjQgNi4zLTIwLjYgOC4yLTEuNCAuNC0yLjcgMS0zLjkgMS44LTIuMiAxLjktMi4xIDQuNi00LjQgOC42LTEuNyAzLTQgNS41LTYuOCA3LjUtNi43IDQuNi0xNC4yIDQuOS0yMi4yIDUuMi03LjIgLjMtMTUuNCAuNi0yNC43IDMuNy0zLjggMS4yLTcuOCAzLjctMTIuNCA2LjUtMTEuMyA2LjktMjYuNyAxNi40LTUyLjMgMTYuNHMtNDAuOS05LjQtNTIuMS0xNi4zYy00LjctMi45LTguNy01LjQtMTIuNS02LjYtOS4zLTMuMS0xNy41LTMuNC0yNC43LTMuNy04LS4zLTE1LjUtLjYtMjIuMi01LjItMi40LTEuNi00LjQtMy43LTYtNi4xLTMuMi00LjYtMi45LTcuOC01LjMtOS45LTEuMy0uOC0yLjYtMS41LTQuMS0xLjgtNy4xLTEuOS0xMy45LTQuNi0yMC4zLTguMS0zLjEtMS42LTUuOS0zLjgtOC4zLTYuMy02LjYtNi44LTguMy0xNC44LTUuNy0yMS44IDMuNC05LjMgMTEuNi0xMi4xIDE5LjQtMTYuMyAxNC44LTggMjYuMy0xOC4xIDM0LjQtMjkuOSAyLjMtMy4zIDQuMy02LjkgNi0xMC42IC44LTIuMiAuOC0zLjMgLjItNC40LS42LS45LTEuMy0xLjYtMi4yLTIuMi0yLjUtMS43LTUuMS0zLjQtNi45LTQuNS0zLjMtMi4xLTUuOS0zLjgtNy41LTUtNi4zLTQuNC0xMC42LTktMTMuNC0xNC4yLTEuOS0zLjYtMy03LjYtMy4zLTExLjZzLjQtOC4xIDEuOS0xMS45YzQuMS0xMC45IDE0LjUtMTcuNyAyNy0xNy43IDIuNiAwIDUuMyAuMyA3LjggLjggLjcgLjIgMS40IC4zIDIgLjUtLjEtNy40IC4xLTE1LjQgLjctMjMuMSAyLjQtMjcuMyAxMS45LTQxLjYgMjEuOS01MyA2LjQtNy4yIDEzLjktMTMuMiAyMi4zLTE3LjkgMTUuMS04LjYgMzIuMi0xMyA1MC45LTEzczM1LjggNC40IDUwLjkgMTNjOC4zIDQuNyAxNS45IDEwLjggMjIuMiAxNy45IDEwIDExLjQgMTkuNSAyNS43IDIxLjkgNTMgLjYgNy43IC45IDE1LjQgLjcgMjMuMSAuNy0uMiAxLjQtLjMgMi4xLS41IDIuNi0uNiA1LjItLjggNy44LS44IDEyLjUgMCAyMi44IDYuOCAyNyAxNy43IDEuNSAzLjggMi4xIDcuOSAxLjkgMTEuOXMtMS40IDgtMy4zIDExLjZjLTIuNyA1LjItNy4xIDkuOS0xMy40IDE0LjItMS43IDEuMi00LjMgMi45LTcuNSA1LTEuOCAxLjItNC41IDIuOS03LjIgNC43LS44IC41LTEuNCAxLjItMS45IDItLjUgMS0uNSAyLjIgLjIgNC4yIDEuNyAzLjggMy43IDcuNCA2LjEgMTAuOCA4LjMgMTIuMSAyMC4yIDIyLjMgMzUuNSAzMC40IDEuNSAuOCAzIDEuNSA0LjQgMi4zIC43IC4zIDEuNiAuOCAyLjUgMS4zIDQuOSAyLjcgOS4yIDYgMTEuNSAxMi4yIDIuNSA2LjkgMSAxNC43LTUuMiAyMS4zem0tMTYuNy0xOC41Yy01MC4zLTI0LjMtNTguMy02MS45LTU4LjctNjQuNy0uNC0zLjQtLjktNiAyLjgtOS41IDMuNi0zLjMgMTkuNS0xMy4yIDI0LTE2LjMgNy4zLTUuMSAxMC41LTEwLjIgOC4yLTE2LjUtMS43LTQuMy01LjctNi0xMC02LTEuMyAwLTIuNyAuMi00IC40LTggMS43LTE1LjggNS44LTIwLjQgNi45LS41IC4xLTEuMSAuMi0xLjcgLjItMi40IDAtMy4zLTEuMS0zLjEtNCAuNi04LjggMS44LTI1LjkgLjQtNDEuOS0xLjktMjItOS0zMi45LTE3LjQtNDIuNi00LjEtNC42LTIzLjEtMjQuNy01OS41LTI0LjdzLTU1LjQgMjAuMS01OS41IDI0LjhjLTguNCA5LjctMTUuNSAyMC42LTE3LjQgNDIuNi0xLjQgMTYtLjEgMzMuMSAuNCA0MS45IC4yIDIuOC0uNyA0LTMuMSA0LS42IDAtMS4xLS4xLTEuNy0uMi00LjUtMS4xLTEyLjMtNS4xLTIwLjMtNi45LTEuMy0uMy0yLjYtLjQtNC0uNC00LjMgMC04LjMgMS42LTEwIDYtMi40IDYuMyAuOCAxMS40IDguMiAxNi41IDQuNCAzLjEgMjAuNCAxMyAyNCAxNi4zIDMuNyAzLjQgMy4yIDYuMSAyLjggOS41LS40IDIuOC04LjQgNDAuNC01OC43IDY0LjctMi45IDEuNC04IDQuNCAuOSA5LjMgMTMuOSA3LjYgMjMuMSA2LjggMzAuMyAxMS40IDYuMSAzLjkgMi41IDEyLjQgNi45IDE1LjQgNS41IDMuOCAyMS42LS4zIDQyLjMgNi42IDE3LjQgNS43IDI4LjEgMjIgNTkgMjJzNDEuOC0xNi4zIDU4LjktMjJjMjAuOC02LjkgMzYuOS0yLjggNDIuMy02LjYgNC40LTMuMSAuOC0xMS41IDYuOS0xNS40IDcuMi00LjYgMTYuNC0zLjggMzAuMy0xMS41IDguOC00LjkgMy44LTcuOSAuOS05LjR6Il0KICAgIH07CiAgICBmYVNuYXBjaGF0U3F1YXJlID0gZmFTcXVhcmVTbmFwY2hhdDsKICAgIGZhVGhlbWVpc2xlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInRoZW1laXNsZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMmIyIiwgIk0yMDggODguM2MwLTEwIDYuMy0yMS43IDE3LjctMjEuNyAxMS4xIDAgMTcuNyAxMS43IDE3LjcgMjEuNyAwIDEwLjMtNi42IDIxLjctMTcuNyAyMS43LTExLjQgMC0xNy43LTExLjQtMTcuNy0yMS43em0zMDQgMTYwYzAgMzYtMTEuNCAxMDIuMy0zNi4zIDEyOS43LTIyLjkgMjQuOS04Ny40IDYxLjEtMTIwLjkgNzAuNmwtMS4xIC4zIDAgMzIuNmMwIDE2LjMtMTIuNiAzMC42LTI5LjEgMzAuNi0xMCAwLTE5LjQtNS43LTI0LjYtMTQuMy01LjQgOC42LTE0LjkgMTQuMy0yNC45IDE0LjNzLTE5LjQtNS43LTI0LjktMTQuM2MtNS4xIDguNi0xNC42IDE0LjMtMjQuNiAxNC4zLTEwLjMgMC0xOS40LTUuNy0yNC45LTE0LjMtNS4xIDguNi0xNC42IDE0LjMtMjQuNiAxNC4zLTE4LjkgMC0yOS40LTE1LjctMjkuNC0zMi45LTE2LjMgMTIuMy0zNS43IDE5LjQtNTYuNiAxOS40LTIyIDAtNDMuNC04LjMtNjAuMy0yMi45IDEwLjMtLjMgMjAuNi0yLjMgMzAuMy01LjctMjAuOS01LjctMzkuNC0xOC45LTUyLTM2LjMgMjEuNCA0LjYgNDYuMiAxLjcgNjcuMS0xMS4xLTIyLTIyLTU2LjYtNTguOS02OC42LTg3LjQtNS43LTEzLjQtNi45LTMxLjQtNi45LTQ1LjcgMC00OS43IDIwLjMtMTYwIDg2LjMtMTYwIDEwLjYgMCAxOC45IDQuOSAyMy4xIDE0LjkgMy43LTUuNCA3LjctMTAuNSAxMi0xNS40IDItMi42IDUuNy01LjQgNy4xLTguMyA4LTEyLjYgMTEuNy0yMS4xIDIxLjctMzQgMzIuMy00MS4xIDgxLjctNjkuNCAxMzQuOS02OS40IDYgMCAxMiAuMyAxNy43IDEuMSAxMC45LTExLjcgMjYtMTguMyA0MS43LTE4LjMgMTQuNiAwIDI5LjcgNiA0MCAxNi4zIC45IC45IDEuNCAyLjMgMS40IDMuNCAwIDMuNy0xMC4zIDEzLjQtMTIuOSAxNi4zIDQuMyAxLjQgMTUuNyA2LjkgMTUuNyAxMiAwIDIuOS0yLjkgNS4xLTQuNiA3LjEgMzEuNCAyNy43IDQ5LjQgNjcuMSA1Ni4zIDEwOCA0LjMtNS4xIDEwLjMtOC42IDE3LjEtOC42IDEwLjYgMCAyMC45IDcuMSAyOC42IDE0IDIwLjkgMTguNiAyNS43IDUzLjEgMjUuNyA3OS43ek0xODggODkuNGMwIDE4LjMgMTIuNiAzNy4xIDMyLjMgMzcuMXMzMi4zLTE4LjkgMzIuMy0zNy4xYzAtMTgtMTIuNi0zNi45LTMyLjMtMzYuOVMxODggNzEuNCAxODggODkuNHpNMjM3LjcgMTk0YzAtMTkuNyAzLjctMzkuMSA4LjYtNTguMy01MiA3OS41LTEzLjUgMTg0LjYgNjguOSAxODQuNiAyMS40IDAgNDIuNi03LjcgNjAtMjAgMi03LjQgMy43LTE0LjkgMy43LTIyLjYgMC0xNC4zLTYuMy0yMS40LTIwLjYtMjEuNC00LjYgMC05LjEgLjktMTMuNCAxLjctNjMuMyAxMi43LTEwNy4xIDMuNy0xMDcuMS02NHpNMTk2LjYgNDQ4LjljMC0xMS4xLTguOS0yMC45LTIwLjMtMjAuOXMtMjAgOS43LTIwIDIwLjlsMCAzMi42YzAgMTEuMSA4LjYgMjEuMSAyMCAyMS4xczIwLjMtOS43IDIwLjMtMjEuMWwwLTMyLjZ6bTQ5LjEgMGMwLTExLjEtOC42LTIwLjktMjAtMjAuOXMtMjAuMyA5LjctMjAuMyAyMC45bDAgMzIuNmMwIDExLjEgOC45IDIxLjEgMjAuMyAyMS4xczIwLTEwIDIwLTIxLjFsMC0zMi42em00OS43IDBjMC0xMS4xLTguOS0yMC45LTIwLjMtMjAuOXMtMjAuMyA5LjctMjAuMyAyMC45bDAgMzIuNmMwIDExLjEgOC45IDIxLjEgMjAuMyAyMS4xczIwLjMtOS43IDIwLjMtMjEuMWwwLTMyLjZ6bTQ5LjcgMGMwLTExLjEtOC45LTIwLjktMjAuMy0yMC45cy0yMC4zIDkuNy0yMC4zIDIwLjlsMCAzMi42YzAgMTEuMSA4LjkgMjEuMSAyMC4zIDIxLjFzMjAuMy0xMCAyMC4zLTIxLjFsMC0zMi42ek00MjEuNyAyODZjLTMwLjkgNTkuMS05MC4zIDEwMi42LTE1OC42IDEwMi42LTk2LjYgMC0xNjAuNi04NC42LTE2MC42LTE3Ni42IDAtMTYuOSAyLTMzLjQgNi00OS43LTIwIDMzLjctMjkuNyA3Mi42LTI5LjcgMTExLjQgMCA2MC4zIDI0LjkgMTIxLjcgNzEuNCAxNjAuOSA1LjEtOS43IDE0LjktMTYuMyAyNi0xNi4zIDEwIDAgMTkuNCA1LjcgMjQuNiAxNC4zIDUuNC04LjYgMTQuNi0xNC4zIDI0LjktMTQuMyAxMCAwIDE5LjQgNS43IDI0LjYgMTQuMyA1LjQtOC42IDE0LjktMTQuMyAyNC45LTE0LjNzMTkuNCA1LjcgMjQuOSAxNC4zYzUuMS04LjYgMTQuNi0xNC4zIDI0LjYtMTQuMyAxMC45IDAgMjAuOSA2LjYgMjUuNyAxNiA0My40LTM2LjMgNjguNi05MiA3MS40LTE0OC4zem0xMC42LTk5LjdjMC01My43LTM0LjYtMTA1LjctOTIuNi0xMDUuNy0zMC4zIDAtNTguNiAxNS4xLTc4LjkgMzYuOS0yMCA2Ni40LTI3LjQgMTM2LjYgNDEuNCAxMzYuNiAyOC44IDAgOTcuNC0yOC41IDg0LjMgMzYuOSAyOC45LTI2IDQ1LjctNjUuNyA0NS43LTEwNC42eiJdCiAgICB9OwogICAgZmFEYXJ0TGFuZyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJkYXJ0LWxhbmciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTY5MyIsICJNMzc4LjYgNzguOWMtMi44LS4xLTUuNi0uMi04LjUtLjJsLTI2NC4xIDAgMTQzLjItNzJjNy40LTQuNCAxOC44LTYuNyAzMC40LTYuNyAxMy41IDAgMjkuNCA5LjIgMzcgMTYuOGw2MiA2MiAwIC4xek0xMDcuMyA5Ni41bDI2Mi44IDBjMTYgMCAyNS40IDEuNCAzNS40IDkuM2wxMDYuNSAxMDYuNCAwIDIwOC44LTc5LjMgLjctMzI1LjQtMzI1LjJ6TTk2LjUgMzczbDAtMjYyLjIgMzIzLjggMzIzLjggLjcgNzcuNC0yMTIuMiAwLTk4LjEtOTguMkM5OS40IDQwMi41IDk2LjUgMzk4LjUgOTYuNSAzNzN6TTc4LjcgMTA1LjNsMCAyNjcuN2MwIDMuMyAuMSA2LjMgLjIgOS4xbC02Mi02MkM2LjUgMzA5LjMgMCAyOTQuMyAwIDI3OS42IDAgMjcyLjggMy45IDI2Mi4xIDYuNyAyNTZsNzItMTUwLjd6Il0KICAgIH07CiAgICBmYURlcGxveWRvZyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJkZXBsb3lkb2ciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjM4ZSIsICJNMzgyLjIgMTM2bDUxLjcgMCAwIDIzOS42LTUxLjcgMCAwLTIwLjdjLTE5LjggMjQuOC01Mi44IDI0LjEtNzMuOCAxNC43LTI2LjItMTEuNy00NC4zLTM4LjEtNDQuMy03MS44IDAtMjkuOCAxNC44LTU3LjkgNDMuMy03MC44IDIwLjItOS4xIDUyLjctMTAuNiA3NC44IDEyLjlsMC0xMDMuOXpNMzE3LjUgMjk3LjhhMzMuMiAzMy4yIDAgMSAwIDY2LjQgMSAzMy4yIDMzLjIgMCAxIDAgLTY2LjQtMXpNMTg4LjUgMTM2bDUxLjcgMCAwIDIzOS42LTUxLjcgMCAwLTIwLjdjLTE5LjggMjQuOC01Mi44IDI0LjEtNzMuOCAxNC43LTI2LjItMTEuNy00NC4zLTM4LjEtNDQuMy03MS44IDAtMjkuOCAxNC44LTU3LjkgNDMuMy03MC44IDIwLjItOS4xIDUyLjctMTAuNiA3NC44IDEyLjlsMC0xMDMuOXpNMTIzLjggMjk3LjhhMzMuMiAzMy4yIDAgMSAwIDY2LjQgMSAzMy4yIDMzLjIgMCAxIDAgLTY2LjQtMXpNNDQ4IDk2YzE3LjUgMCAzMiAxNC40IDMyIDMybDAgMjU2YzAgMTcuNS0xNC40IDMyLTMyIDMyTDY0IDQxNmMtMTcuNSAwLTMyLTE0LjQtMzItMzJsMC0yNTZjMC0xNy41IDE0LjQtMzIgMzItMzJsMzg0IDB6bTAtMzJMNjQgNjRDMjguOCA2NCAwIDkyLjggMCAxMjhMMCAzODRjMCAzNS4yIDI4LjggNjQgNjQgNjRsMzg0IDBjMzUuMiAwIDY0LTI4LjggNjQtNjRsMC0yNTZjMC0zNS4yLTI4LjgtNjQtNjQtNjR6Il0KICAgIH07CiAgICBmYUZsaXBib2FyZCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJmbGlwYm9hcmQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjQ0ZCIsICJNMCAzMmwwIDQ0OCA0NDggMCAwLTQ0OC00NDggMHpNMzU4LjQgMjExLjJsLTg5LjYgMCAwIDg5LjYtODkuNiAwIDAgODkuNi04OS42IDAgMC0yNjguOCAyNjguOCAwIDAgODkuNnoiXQogICAgfTsKICAgIGZhQnV5TkxhcmdlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImJ1eS1uLWxhcmdlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY4YTYiLCAiTTI4OC4yIDMyQzEzMy41IDMyIDggMTMyLjMgOCAyNTZTMTMzLjUgNDgwIDI4OC4yIDQ4MCA1NjguNCAzNzkuNyA1NjguNCAyNTYgNDQyLjkgMzIgMjg4LjIgMzJ6TTIwMi44IDM4OS4ybC0xMzguNSAxLjQgNzcuMi0yOTAuNyAxMzMuNCAwYzYzLjIgMCA4NC45IDI4LjYgNzggNzIuOC0uNCAyLjMtLjkgNC42LTEuNSA2LjktNS42LTEuMy0xMS40LTEuOS0xNy4yLTEuOS00Mi4zIDAtNzYuNyAzMy45LTc2LjcgNzUuNyAwIDM3LjEgMjcuMSA2OCA2Mi45IDc0LjUtMTguMiAzNy4yLTU2LjIgNjAuOS0xMTcuNyA2MS41ek0zNTguMiAyMDcuMWwzMiAwLTIyLjIgOTAuMy0zNS40IDAtMTEuMi0zNS42LTcuOCAzNS42LTM3LjggMCAyNi42LTkwLjMgMzEuMyAwIDE1IDM2LjggOS40LTM2Ljh6TTUwNC4xIDM4OS4ybC0xOTcuMSAwIDE1LjgtNjEuMmMzLjggLjYgNy42IC44IDExLjUgLjggNDIuMyAwIDc2LjctMzMuOSA3Ni43LTc1LjYgMC0zMi42LTIxLTYwLjUtNTAuNC03MS4xbDIxLjMtODIuNCA5Mi41IDAtNTMgMjA1LjQgMTAzLjkgMC0yMS4yIDg0LjF6TTIxMS45IDI2OS40bC0yNC43IDAtMTMuOCA1Ni41IDI0LjcgMGMxNi4xIDAgMzIuMS0zLjIgMzcuOS0yNi42IDUuNi0yMi4zLTgtMjkuOC0yNC4xLTI5Ljh6TTIzMy4yIDE3MGwtMjEuMyAwLTExLjcgNDcuNyAyMS40IDBjMTggMCAzNS40LTE0LjYgMzkuMi0zMC4xIDQuNi0xOC45LTkuNS0xNy42LTI3LjYtMTcuNnoiXQogICAgfTsKICAgIGZhV2F0Y2htYW5Nb25pdG9yaW5nID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIndhdGNobWFuLW1vbml0b3JpbmciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTA4NyIsICJNMjU2IDE2YTI0MCAyNDAgMCAxIDAgMCA0ODAgMjQwIDI0MCAwIDEgMCAwLTQ4MHpNMTIxLjcgNDI5LjFjLTUxLjYtNDAuMi04NC45LTEwMi44LTg0LjktMTczLjEgMC0yMS43IDMuMi00My4zIDkuNi02NC4xbDEwMi45LTE3LjktLjEgMTEtMTMuOSAycy0uMSAxMi41LS4xIDE5LjVjMCAyIC40IDQgMS4yIDUuOHMyLjEgMy40IDMuNyA0LjZsOS41IDcuNC0yNy43IDIwNC45ek0yMjcuNCAxNDUuOWw4LjUtNy42czYuOS01LjQtLjEtOS4zYy03LjItNC0zOS41LTM0LjUtMzkuNS0zNC41LTUuMy01LjUtOC4zLTcuMy0xNS41IDAgMCAwLTMyLjMgMzAuNS0zOS41IDM0LjUtNy4xIDQtLjEgOS4zLS4xIDkuM2w4LjUgNy42IDAgNC40LTczLjUtMTkuMmMzOS42LTU2LjkgMTA1LjUtOTQuMyAxODAtOTQuMyAzMS4zIDAgNjIuMiA2LjcgOTAuNiAxOS42czUzLjggMzEuOCA3NC4zIDU1LjRsLTE5My41IDM3LjcgMC0zLjZ6bTM0LjEgMzI5LjNsLTMzLjktMjUwLjkgOS41LTcuNGMxLjYtMS4yIDIuOC0yLjggMy43LTQuNnMxLjMtMy44IDEuMi01LjhjMC03LS4xLTE5LjUtLjEtMTkuNWwtMTMuOS0yLS4xLTEwLjUgMjQxLjcgMzEuNGMzLjkgMTYuNCA1LjggMzMuMyA1LjggNTAuMSAwIDExOS4xLTk1LjQgMjE2LjItMjEzLjggMjE5LjF6Il0KICAgIH07CiAgICBmYUhpcHMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaGlwcyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNDUyIiwgIk0yNTEuNiAxNTcuNmMwLTEuOS0uOS0yLjgtMi44LTIuOGwtNDAuOSAwYy0xLjYgMC0yLjcgMS40LTIuNyAyLjhsMCAyMDEuOGMwIDEuNCAxLjEgMi44IDIuNyAyLjhsNDAuOSAwYzEuOSAwIDIuOC0uOSAyLjgtMi44bDAtMjAxLjh6TTE1Ni41IDE2OGMtMTYuMS0xMS44LTM2LjMtMTcuOS02MC4zLTE4LTE4LjEtLjEtMzQuNiAzLjctNDkuOCAxMS40bDAtODEuMmMwLTEuOC0uOS0yLjctMi44LTIuN2wtNDAuOSAwQy45IDc3LjUgMCA3OC40IDAgODAuMkwwIDM1OS40YzAgMS45IC45IDIuOCAyLjcgMi44bDQxIDBjMS45IDAgMi44LS45IDIuOC0yLjhsMC0xMzYuMWMwLS44LTIuOC0yNyA0NS44LTI3IDQ4LjUgMCA0NS44IDI2LjEgNDUuOCAyN2wwIDEyMi42YzAgOSA3LjMgMTYuMyAxNi40IDE2LjNsMjcuMyAwYzEuOCAwIDIuNy0uOSAyLjctMi44bDAtMTM2LjFjMC0yMy40LTkuMy00MS44LTI4LTU1LjN6TTYzNC45IDI3OC4xYy02LjgtMTUuNy0xOC40LTI3LTM0LjktMzQuMWwtNTcuNi0yNS4zYy04LjYtMy42LTkuMi0xMS4yLTIuNi0xNi4xIDcuNC01LjUgNDQuMy0xMy45IDg0IDYuOCAxLjcgMSA0LS4zIDQtMi40bDAtNDQuN2MwLTEuMy0uNi0yLjEtMS45LTIuNi0xNy43LTYuNi0zNi4xLTkuOS01NS4xLTkuOS0yNi41IDAtNDUuMyA1LjgtNTguNSAxNS40LS41IC40LTI4LjQgMjAtMjIuNyA1My43IDMuNCAxOS42IDE1LjggMzQuMiAzNy4yIDQzLjZMNTgwLjQgMjg2YzExLjYgNS4xIDE1LjIgMTMuMyAxMi4yIDIxLjItMy43IDkuMS0xMy4yIDEzLjYtMzYuNSAxMy42LTI0LjMgMC00NC43LTguOS01OC40LTE5LjEtMi4xLTEuNC00LjQgLjItNC40IDIuM2wwIDM0LjRjMCAxMC40IDQuOSAxNy4zIDE0LjYgMjAuNyAxNS42IDUuNSAzMS42IDguMiA0OC4yIDguMiAxMi43IDAgMjUuOC0xLjIgMzYuMy00LjMgLjctLjMgMzYtOC45IDQ1LjYtNDUuOCAzLjUtMTMuNSAyLjQtMjYuNS0zLjEtMzkuMXpNMzc2LjIgMTQ5LjhjLTMxLjcgMC0xMDQuMiAyMC4xLTEwNC4yIDEwMy41bDAgMTgzLjVjMCAuOCAuNiAyLjcgMi43IDIuN2w0MC45IDBjMS45IDAgMi44LS45IDIuOC0yLjdsMC04OC44YzE2LjUgMTIuNyAzNS44IDE5LjEgNTcuNyAxOS4xIDYwLjUgMCAxMDguNy00OC41IDEwOC43LTEwOC43IC4xLTYwLjMtNDguMi0xMDguNi0xMDguNi0xMDguNnptMCA0Ni42YTYyLjIgNjIuMiAwIDEgMSAwIDEyNC4zIDYyLjIgNjIuMiAwIDEgMSAwLTEyNC4zek0yMjguMyA3Mi41Yy0xNS45IDAtMjguOCAxMi45LTI4LjkgMjguOSAwIDE1LjYgMTIuNyAyOC45IDI4LjkgMjguOXMyOC45LTEzLjEgMjguOS0yOC45YzAtMTYuMi0xMy0yOC45LTI4LjktMjguOXoiXQogICAgfTsKICAgIGZhQ2xvdWR2ZXJzaWZ5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNsb3VkdmVyc2lmeSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmMzg1IiwgIk0xNjAuNiAzMDRjOC4yIDY4LjUgNjcuNCAxMTUuNSAxNDYgMTExLjMgNTEuMiA0My4zIDEzNi44IDQ1LjggMTg2LjQtNS42IDY5LjIgMS4xIDExOC41LTQ0LjYgMTMxLjUtOTkuNSAxNC44LTYyLjUtMTguMi0xMzIuNS05Mi4xLTE1NS4xLTMzLTg4LjEtMTMxLjQtMTAxLjUtMTg2LjUtODUtNTcuMyAxNy4zLTg0LjMgNTMuMi05OS4zIDEwOS43LTcuOCAyLjctMjYuNSA4LjktNDUgMjQuMSAxMS43IDAgMTUuMiA4LjkgMTUuMiAxOS41bDAgMjAuNGMwIDEwLjctOC43IDE5LjUtMTkuNSAxOS41bC0yMC4yIDBjLTEwLjcgMC0xOS41LTYtMTkuNS0xNi43bDAtNi42LTQ2LjggMGMtMy44IDAtMTAuOCA0LjMtMTAuOCAxMS45bDAgNDAuNGMwIDYuNCA1LjMgMTEuOCAxMS43IDExLjhsNDguOSAwIDAtLjF6TTM4OCAzMTJjLTEwLjcgNDYuMyAyMS43IDcyLjQgNTUuMyA4Ni44LTEwNy4yIDMzLjgtMTcxLjYtNTAuOC0xMzUuMy0xMTAuOC0zMy4yIDIxLjYtMzMuNyA3MS4yLTI5LjIgOTIuOS0xNy45LTEyLjQtNTMuOC0zMi40LTU3LjQtNzkuOC0zLTM5LjkgMjEuNS03NS43IDU3LTkzLjkgMzAuNi0xNS44IDEwMy41LTguNSAxMzMuNiA0MC44LTE0LjEtNDgtNTMuOC03MC4xLTEwMS44LTc0LjggMzAuOS0zMC43IDY0LjQtNTAuMyAxMTQuMi00My43IDY5LjggOS4zIDEzMy4yIDgyLjggNjcuNyAxNTAuNSAzNS0xNi4zIDQ4LjctNTQuNCA0Ny41LTc2LjlsMTAuNSAxOS42YzExLjggMjIgMTUuMiA0Ny42IDkuNCA3Mi05LjIgMzktNDAuNiA2OC44LTc5LjcgNzYuNS0zMi4xIDYuMy04My4xLTUuMS05MS44LTU5LjJ6TTE0MCAyMDhsLTM5LjggMGMtOC45IDAtMTYuMi03LjMtMTYuMi0xNi4ybDAtMzkuNmMwLTguOSA3LjMtMTYuMiAxNi4yLTE2LjJsMzkuOCAwYzguOSAwIDE2LjIgNy4zIDE2LjIgMTYuMmwwIDM5LjZjMCA4LjktNy4zIDE2LjItMTYuMiAxNi4yek0yMi4xIDE2OGMtNS42IDAtMTAuMS00LjUtMTAuMS0xMC4xbDAtMjcuOGMwLTUuNiA0LjUtMTAuMSAxMC4xLTEwLjFsMjcuNyAwYzUuNSAwIDEwLjEgNC41IDEwLjEgMTAuMWwwIDI3LjhjMCA1LjYtNC41IDEwLjEtMTAuMSAxMC4xbC0yNy43IDB6TTE4MCAxNDIuN2wwLTIxLjRjMC01LjEgNC4yLTkuMyA5LjMtOS4zbDIxLjQgMGM1LjEgMCA5LjMgNC4yIDkuMyA5LjNsMCAyMS40YzAgNS4xLTQuMiA5LjMtOS4zIDkuM2wtMjEuNCAwYy01LjEgMC05LjMtNC4yLTkuMy05LjN6TTY4IDIzNS41bDAgMjVjMCA2LjMtNS4xIDExLjUtMTEuNCAxMS41bC0yNS4yIDBjLTYuMyAwLTExLjQtNS4yLTExLjQtMTEuNWwwLTI1YzAtNi4zIDUuMS0xMS41IDExLjQtMTEuNWwyNS4xIDBjNi40IDAgMTEuNSA1LjIgMTEuNSAxMS41eiJdCiAgICB9OwogICAgZmFHb29kcmVhZHMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZ29vZHJlYWRzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzYTgiLCAiTTI5OS45IDE5MS4yYzUuMSAzNy4zLTQuNyA3OS0zNS45IDEwMC43LTIyLjMgMTUuNS01Mi44IDE0LjEtNzAuOCA1LjctMzcuMS0xNy4zLTQ5LjUtNTguNi00Ni44LTk3LjIgNC4zLTYwLjkgNDAuOS04Ny45IDc1LjMtODcuNSA0Ni45LS4yIDcxLjggMzEuOCA3OC4yIDc4LjN6TTQ0OCA4OGwwIDMzNmMwIDMwLjktMjUuMSA1Ni01NiA1Nkw1NiA0ODBjLTMwLjkgMC01Ni0yNS4xLTU2LTU2TDAgODhDMCA1Ny4xIDI1LjEgMzIgNTYgMzJsMzM2IDBjMzAuOSAwIDU2IDI1LjEgNTYgNTZ6TTMzMCAzMTMuMnMtLjEtMzQtLjEtMjE3LjNsLTI5IDAgMCA0MC4zYy0uOCAuMy0xLjItLjUtMS42LTEuMi05LjYtMjAuNy0zNS45LTQ2LjMtNzYtNDYtNTEuOSAuNC04Ny4yIDMxLjItMTAwLjYgNzcuOC00LjMgMTQuOS01LjggMzAuMS01LjUgNDUuNiAxLjcgNzcuOSA0NS4xIDExNy44IDExMi40IDExNS4yIDI4LjktMS4xIDU0LjUtMTcgNjktNDUuMiAuNS0xIDEuMS0xLjkgMS43LTIuOSAuMiAuMSAuNCAuMSAuNiAuMiAuMyAzLjggLjIgMzAuNyAuMSAzNC41LS4yIDE0LjgtMiAyOS41LTcuMiA0My41LTcuOCAyMS0yMi4zIDM0LjctNDQuNSAzOS41LTE3LjggMy45LTM1LjYgMy44LTUzLjItMS4yLTIxLjUtNi4xLTM2LjUtMTktNDEuMS00MS44LS4zLTEuNi0xLjMtMS4zLTIuMy0xLjNsLTI2LjggMGMuOCAxMC42IDMuMiAyMC4zIDguNSAyOS4yIDI0LjIgNDAuNSA4Mi43IDQ4LjUgMTI4LjIgMzcuNCA0OS45LTEyLjMgNjcuMy01NC45IDY3LjQtMTA2LjN6Il0KICAgIH07CiAgICBmYVRpZGFsID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInRpZGFsIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU3ZGMiLCAiTTEwNy4yIDQ4bC0xLjMgMGMtMzIuMyAzMy4xLTY1LjQgNjUuNS05OCA5OC41LTIuNiAyLjgtNi4xIDUuMS03LjkgOC42IDM1LjYgMzUuNCA3MSA3MSAxMDYuNiAxMDYuNCAzNS40LTM1LjMgNzAuNy03MC44IDEwNi4xLTEwNi4xbDAtMS4zLTczLjItNzMuMkMxMjguOCA2OS44IDExNy4zIDU5LjYgMTA3LjIgNDh6bTIxMy41IDBsLTEuMyAwYy0zNC45IDM2LjEtNzEuNSA3MS0xMDYuMyAxMDcuMiAzNS45IDM1LjEgNzEgNzEgMTA2LjcgMTA2LjMgMzQuMy0zNC4xIDY4LjQtNjguNCAxMDIuNi0xMDIuNCAxLjUtMS41IDMuMy0yLjggNC4xLTQuOC0zNC42LTMzLjgtNjguNC02OC4yLTEwMi42LTEwMi4xLTEuMy0xLjMtMi4zLTIuNi0zLjMtNC4xem0yMTMuNSAwbC0xLjMgMGMtMTcuMiAxOC0zNS4xIDM1LjMtNTIuNiA1My0xNy45IDE3LjctMzUuNCAzNS43LTUzLjUgNTMuMyAuOCAyLjMgMyAzLjYgNC42IDUuNUw1MzMuMyAyNjEuNWMzNi4xLTM0LjkgNzAuOC03MS4yIDEwNi43LTEwNi4xLS41LTIuMi0yLjYtMy41LTQtNUw1NTUuOCA3MC4yYy03LjEtNy40LTE0LjktMTQuMi0yMS41LTIyLjJ6TTMxOS42IDI2MS43Yy0zNC45IDM1LjEtNzAgNzAtMTA0LjkgMTA0LjktLjMgLjctLjcgMS43LTEgMi4zIDI0IDIzLjcgNDcuNyA0Ny41IDcxLjUgNzEuMyAxMS44IDExLjMgMjIuOCAyMy41IDM0LjkgMzQuNCA4LjQtNy40IDE2LjQtMTYuNCAyNC43LTI0LjMgMjUuNS0yNS4zIDUxLTUxIDc2LjUtNzYuMyAxLjgtMi4yIDQuMy0zLjYgNS41LTYuMy0zNS40LTM0LjktNzAuNS03MC4yLTEwNS42LTEwNS40bC0xLjUtLjd6Il0KICAgIH07CiAgICBmYVVuaXR5ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInVuaXR5IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImUwNDkiLCAiTTI0My42IDkxLjZsODAuMSA0Ni44YzIuOSAxLjYgMyA2LjIgMCA3LjhsLTk1LjIgNTUuNmMtMi45IDEuNy02LjMgMS42LTkgMGwtOTUuMi01NS42Yy0yLjktMS42LTMtNi4zIDAtNy44bDgwLjEtNDYuOCAwLTkxLjYtMjA0LjQgMTE5LjQgMCAyMzguOCA3OC40LTQ1LjggMC05My42Yy0uMS0zLjMgMy44LTUuNyA2LjctMy45bDk1LjIgNTUuNmMyLjkgMS43IDQuNSA0LjcgNC41IDcuOGwwIDExMS4yYy4xIDMuMy0zLjggNS43LTYuNyAzLjlMOTggMzQ2LjggMTkuNiAzOTIuNiAyMjQgNTEyIDQyOC40IDM5Mi42IDM1MCAzNDYuOCAyNjkuOSAzOTMuNmMtMi44IDEuNy02LjgtLjUtNi43LTMuOWwwLTExMS4yYzAtMy4zIDEuOC02LjMgNC41LTcuOEwzNjIuOSAyMTVjMi44LTEuNyA2LjggLjUgNi43IDMuOWwwIDkzLjYgNzguNCA0NS44IDAtMjM4LjgtMjA0LjQtMTE5LjQgMCA5MS42eiJdCiAgICB9OwogICAgZmFUZW5jZW50V2VpYm8gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidGVuY2VudC13ZWlibyIsCiAgICAgIGljb246IFszMjAsIDUxMiwgW10sICJmMWQ1IiwgIk00MC41IDQ5NS44YzEuNCAxOS45LTI3LjYgMjIuMi0yOS43IDIuOS0xMS42LTEyOS45IDMxLjEtMjM5LjUgMTAxLjQtMzEzLjItMTUuNi0zNCA5LjItNzcuMSA1MC42LTc3LjEgMzAuMyAwIDU1LjEgMjQuNiA1NS4xIDU1LjEgMCA0NC00OS41IDcwLjgtODYuOSA0NS4xLTY1LjcgNzEuMy0xMDEuNCAxNjkuOC05MC41IDI4Ny4yek0xNjAuMiAuMWMtMTI1LjkgMC0yMDQuMyAxMzQuMi0xNDguMyAyNDIuMyA4LjcgMTcuNCAzNS4zIDQuNSAyNi4zLTEzLjQtNDYuMy05Mi42IDIxLTE5OS4yIDEyMi0xOTkuMiA3NS40IDAgMTM2LjkgNjEuNCAxMzYuOSAxMzYuOSAwIDkwLjgtODYuOSAxNTMuOS0xNjcuNyAxMzMuMS0xOS4xLTQuMS0yNS42IDI0LjQtNi42IDI5LjEgMTEwLjcgMjMuMiAyMDQtNjAgMjA0LTE2Mi4zIDAtOTEuOS03NC42LTE2Ni41LTE2Ni42LTE2Ni41eiJdCiAgICB9OwogICAgZmFGcmVlQ29kZUNhbXAgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZnJlZS1jb2RlLWNhbXAiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjJjNSIsICJNOTcuNCA5Ni4yYzEwLjQtMTAuNiAxNi0xNy4xIDE2LTIxLjkgMC0yLjgtMS45LTUuNS0zLjgtNy40LTIuNC0xLjgtNS40LTIuOC04LjQtMi44LTguNSAwLTIwLjkgOC44LTM1LjggMjUuNy00MS41IDQ3LjMtNjIuNyA5My4xLTYxLjggMTYwLjZTMjEgMzY3LjMgNTcuNiA0MTIuMmMxOC44IDIzLjYgMzMuMiAzNS44IDQzLjUgMzUuOCAzLjItLjMgNi4xLTEuNiA4LjQtMy44IDEuOS0yLjggMy44LTUuNiAzLjgtOC40IDAtNS42LTMuOS0xMi4yLTEzLjItMjAuNi00NC41LTQyLjMtNjcuMy05Ny02Ny41LTE2NS0uMi02MS40IDIxLjYtMTEyLjQgNjQuOC0xNTR6TTIzOS42IDQyMC4xYy42IC40IC45IC42IC45IC42bC0uOS0uNnptOTMuOCAuNmwuMi0uMWMtLjIgLjEtLjMgLjItLjIgLjF6bTMuMS0xNTguMmMtMTYuMi00LjIgNTAuNC04Mi45LTY4LjEtMTc3LjIgMCAwIDE1LjUgNDkuNC02Mi44IDE1OS42LTc0LjMgMTA0LjQgMjMuNSAxNjguNyAzNCAxNzUuMi02LjctNC4zLTQ3LjQtMzUuNyA5LjYtMTI4LjYgMTEtMTguMyAyNS41LTM0LjkgNDMuNS03Mi4yIDAgMCAxNS45IDIyLjQgNy42IDcxLjEtMTIuNSA3My42IDUzLjggNTIuNSA1NC44IDUzLjUgMjIuOCAyNi44LTE3LjcgNzMuNS0yMS42IDc2LjYgNS41LTMuNyAxMTcuNy03OCAzMy0xODguMS02IDYtMTMuOCAzNC4yLTMwIDMwLjF6TTUxMSA4OS43Yy0xNC45LTE2LjktMjcuNC0yNS43LTM1LjktMjUuNy0zIC4xLTUuOSAxLjEtOC40IDIuOC0xLjkgMS45LTMuOCA0LjctMy44IDcuNCAwIDQuOCA1LjYgMTEuMyAxNiAyMS45IDQzLjIgNDEuNiA2NSA5Mi42IDY0LjggMTU0LjEtLjIgNjgtMjMgMTIyLjYtNjcuNSAxNjUtOS4zIDguNC0xMy4yIDE0LjktMTMuMiAyMC42IDAgMi43IDEuOSA1LjYgMy44IDguNCAyLjMgMi4yIDUuMiAzLjYgOC40IDMuOCAxMC4zIDAgMjQuNy0xMi4xIDQzLjUtMzUuOCAzNi42LTQ0LjkgNTMuMS05NC40IDU0LjEtMTYxLjlTNTUyLjUgMTM3IDUxMSA4OS43eiJdCiAgICB9OwogICAgZmFYVHdpdHRlciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ4LXR3aXR0ZXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTYxYiIsICJNMzU3LjIgNDhMNDI3LjggNDggMjczLjYgMjI0LjIgNDU1IDQ2NCAzMTMgNDY0IDIwMS43IDMxOC42IDc0LjUgNDY0IDMuOCA0NjQgMTY4LjcgMjc1LjUtNS4yIDQ4IDE0MC40IDQ4IDI0MC45IDE4MC45IDM1Ny4yIDQ4ek0zMzIuNCA0MjEuOGwzOS4xIDAtMjUyLjQtMzMzLjgtNDIgMCAyNTUuMyAzMzMuOHoiXQogICAgfTsKICAgIGZhU3RpY2tlck11bGUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3RpY2tlci1tdWxlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYzZjciLCAiTTU2MS43IDE5OS42bDAgMHptLTYuMi03Ny40Yy03LjctMjIuMy01LjEtNy4yLTEzLjQtMzYuOS0xLjYtNi41LTMuNi0xNC41LTYuMi0yMC00LjQtOC43LTQuNi03LjUtNC42LTkuNSAwLTUuMyAzMC43LTQ1LjMgMTktNDYuOS01LjctLjYtMTIuMiAxMS42LTIwLjYgMTctOC42IDQuMi04IDUtMTAuMyA1LTIuNiAwLTUuNy0zLTYuMi01LTItNS43IDEuOS0yNS45LTMuNi0yNS45LTMuNiAwLTEyLjMgMjQuOC0xNyAyNS44LTUuMiAxLjMtMjcuOS0xMS40LTc1LjEgMTgtMjUuMyAxMy4yLTg2LjkgNjUuMi04NyA2NS4zLTYuNyA0LjctMjAgNC43LTM1LjUgMTYtNDQuNCAzMC4xLTEwOS42IDkuNC0xMTAuNyA5LTExMC42LTI2LjgtMTI4LTE1LjItMTU5IDExLjUtMjAuOCAxNy45LTIzLjcgMzYuNS0yNC4yIDM4LjktNC4yIDIwLjQgNS4yIDQ4LjMgNi43IDY0LjMgMS44IDE5LjMtMi43IDE3LjcgNy43IDk4LjMgLjUgMSA0LjEgMCA1LjEgMS41IDAgOC40LTMuOCAxMi4xLTQuMSAxMy0xLjUgNC41LTEuNSAxMC41IDAgMTYgMi4zIDguMiA4LjIgMzcuMiA4LjIgNDYuOSAwIDQxLjggLjQgNDQgMi42IDQ5LjQgMy45IDEwIDEyLjUgOS4xIDE3IDEyIDMuMSAzLjUtLjUgOC41IDEgMTIuNSAuNSAyIDMuNiA0IDYuMiA1IDkuMiAzLjYgMjcgLjMgMjkuOS0yLjUgMS42LTEuNSAuNS00LjUgMy4xLTUgNS4xIDAgMTAuOC0uNSAxNC40LTIuNSA1LjEtMi41IDQuMS02IDEuNS0xMC41LS40LS44LTctMTMuMy05LjgtMTYtMi4xLTItNS4xLTMtNy4yLTQuNS01LjgtNC45LTEwLjMtMTkuNC0xMC4zLTE5LjUtNC42LTE5LjQtMTAuMy00Ni4zLTQuMS02Ni44IDQuNi0xNy4yIDM5LjUtODcuNyAzOS42LTg3LjggNC4xLTYuNSAxNy0xMS41IDI3LjMtNyA2IDEuOSAxOS4zIDIyIDY1LjQgMzAuOSA0Ny45IDguNyA5Ny40LTIgMTEyLjItMiAyLjggMi0xLjkgMTMtLjUgMzguOSAwIDI2LjQtLjQgMTMuNy00LjEgMjkuOS0yLjIgOS43IDMuNCAyMy4yLTEuNSA0Ni45LTEuNCA5LjgtOS45IDMyLjctOC4yIDQzLjQgLjUgMSAxIDIgMS41IDMuNSAuNSA0LjUgMS41IDguNSA0LjYgMTAgNy4zIDMuNiAxMi0zLjUgOS44IDExLjUtLjcgMy4xLTIuNiAxMiAxLjUgMTUgNC40IDMuNyAzMC42IDMuNCAzNi41IC41IDIuNi0xLjUgMS42LTQuNSA2LjQtNy40IDEuOS0uOSAxMS4zLS40IDExLjMtNi41IC4zLTEuOC05LjItMTkuOS05LjMtMjAtMi42LTMuNS05LjItNC41LTExLjMtOC02LjktMTAuMS0xLjctNTIuNiAuNS01OS40IDMtMTEgNS42LTIyLjQgOC43LTMyLjQgMTEtNDIuNSAxMC4zLTUwLjYgMTYuNS02OC4zIC44LTEuOCA2LjQtMjMuMSAxMC4zLTI5LjkgOS4zLTE3IDIxLjctMzIuNCAzMy41LTQ3LjQgMTgtMjIuOSAzNC00Ni45IDUyLTY5LjggNi4xLTcgOC4yLTEzLjcgMTgtOCAxMC44IDUuNyAyMS42IDcgMzEuOSAxNyAxNC42IDEyLjggMTAuMiAxOC4yIDExLjggMjIuOSAxLjUgNSA3LjcgMTAuNSAxNC45IDkuNSAxMC40LTIgMTMtMi41IDEzLjQtMi41IDIuNi0uNSA1LjctNSA3LjItOCAzLjEtNS41IDcuMi05IDcuMi0xNi41IDAtNy43LS40LTIuOC0yMC42LTUyLjl6Il0KICAgIH07CiAgICBmYVR3aXRjaCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ0d2l0Y2giLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjFlOCIsICJNMzU5LjQgMTAzLjVsLTM4LjYgMCAwIDEwOS43IDM4LjYgMCAwLTEwOS43ek0yNTMuMiAxMDNsLTM4LjYgMCAwIDEwOS44IDM4LjYgMCAwLTEwOS44ek04OSAwbC05Ni41IDkxLjQgMCAzMjkuMiAxMTUuOCAwIDAgOTEuNCA5Ni41LTkxLjQgNzcuMyAwIDE3My44LTE2NC42IDAtMjU2LTM2Ni45IDB6TTQxNy4zIDIzNy44bC03Ny4yIDczLjEtNzcuMiAwLTY3LjYgNjQgMC02NC04Ni45IDAgMC0yNzQuMyAzMDguOSAwIDAgMjAxLjJ6Il0KICAgIH07CiAgICBmYUtpY2tzdGFydGVySyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJraWNrc3RhcnRlci1rIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzYmMiLCAiTTM1Ni43IDI1Ni4ybDQwLjgtNDAuNWM0Mi4yLTQxLjkgNDIuMi0xMTAuMyAwLTE1Mi4xcy0xMTEtNDEuOS0xNTMuMiAwTDIyOS4zIDc4LjRDMjA5LjYgNTAuMyAxNzcuMSAzMiAxNDAuMiAzMiA4MC41IDMyIDMyIDgwLjIgMzIgMTM5LjVsMCAyMzNjMCA1OS40IDQ4LjUgMTA3LjUgMTA4LjIgMTA3LjUgMzcuMSAwIDY5LjMtMTguMyA4OS00Ni40bDE0LjkgMTQuN2M0Mi4yIDQxLjkgMTExIDQxLjkgMTUzLjIgMHM0Mi4yLTExMC4zIDAtMTUyLjFsLTQwLjgtNDAgLjEgMHoiXQogICAgfTsKICAgIGZhQ3JpdGljYWxSb2xlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNyaXRpY2FsLXJvbGUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjZjOSIsICJNMjI1LjggMGMuMyAuMiAyMTYuNiAxMjQuNSAyMTcuMSAxMjQuNyAzIDEuMiAzLjcgMy41IDMuNyA2LjYtLjEgODMuNC0uMSAxNjYuOSAwIDI1MC40IC4xIDEuMi0uMiAyLjQtLjggMy40cy0xLjUgMS45LTIuNiAyLjRjLTIxLjQgMTItMjA3LjkgMTE4LjMtMjE4LjkgMTI0LjZsLTMgMGMtNzkuMy00NS43LTIxOC4zLTEyNS40LTIxOC40LTEyNS41LS42LS4zLTEuMS0uNy0xLjQtMS4zcy0uNS0xLjItLjQtMS45YzAtLjkgMC0yMjUuOS0uMS0yNTMuMS0uMS0xIC4yLTIgLjctMi45czEuMy0xLjYgMi4yLTJDMjcuMiAxMTIuMSAyMTMuMiA2IDIyNC4xIDBsMS44IDB6TTIxNS40IDIwLjRsLS4yLS4yYy02NC43IDM2LjktMTI5LjUgNzMuNy0xOTQuMiAxMTAuNiAwIC4xIC4xIC4yIC4xIC40TDUyIDE0Mi45Yy03LjcgNi04LjMgNi0xMC42IDUuMS0uMSAwLTI0LjItOS4zLTI2LjgtMTBsMCAyMzAuNGMuOS0xLjQgNjQuMS0xMTAuOSA2NC4xLTExMSAxLjYtMi44IDMtMS45IDkuMS0xLjUgMS40IC4xIDEuNSAuMiAuOCAxLjQtNDEuMiA3MS4zLTM2LjQgNjMtNjcuNSAxMTYuOS0uOCAxLjQtLjYgMS4xIDEuMiAxLjFsMTg2LjUgMGMxLjQgMCAxLjctLjIgMS43LTEuNmwwLTguOWMwLTEuMyAyLjQtLjgtMTguNC0xLTcuNS0uMS0xNC4xLTMuMi0yMS40LTEyLjctNy40LTkuNy0xNC42LTE5LjQtMjEuOC0yOS4yLTIuMy0zLjEtMy40LTIuNC0xNi44LTIuNC0xLjggMC0xLjggMC0xLjggMS44IC4zIDI2LjIgLjIgMjUuMyAxIDMyLjcgLjUgNC40IDIuMiA0LjIgOS43IDQuOCAzLjEgLjMgMy45IDQuMSAuNSA0LjktMS42IC40LTMxLjYgLjUtMzMuNy0uMS0uNS0uMS0xLS41LTEuMy0uOXMtLjUtMS0uNC0xLjYgLjMtMS4xIC42LTEuNSAuOS0uNyAxLjQtLjhjMy4zLS44IDYuMiAuOCA2LjctNC40IDEuMy0xMy43IDEuMi05IDEuMS03OS40IDAtMTAuOC0uNC0xMi42LTUuNC0xMy42LTEuMi0uMi0zLjUtLjItNC43LS42LTIuOS0xLTItNC44IDEuOC00LjggMzMuNyAwIDQ2LjEtMS4xIDU2LjEgNC45IDcuNyA0LjYgMTIgMTEuNSAxMi41IDIwLjQgLjkgMTQuNi02LjUgMjIuMy0xNSAzMi42LS4yIC4xLS4zIC4zLS40IC41cy0uMSAuNC0uMSAuNiAwIC40IC4xIC42IC4yIC40IC40IC41YzIuNiAzLjIgNSA2LjYgNy43IDkuOCAyNy42IDMzLjIgMjQuMSAzMC41IDQxLjMgMzMuMSAuOSAuMSAxLS40IDEtMS4ybDAtMTFjMC0xIC4zLTEuNCAxLjQtMS4zIDcuOCAxLjIgMTUuOCAxLjEgMjMuNi0uMyAxLjEtLjEgMS41IC4yIDEuNSAxLjMgMCAuMSAuOSAyNi43IC45IDI2LjggMCAxLjUgLjcgMS42IDEuOSAxLjZsMTg2LjcgMGMtMjcuMi00Ny01NC4yLTk0LTgxLjItMTQwLjggMi4zLS43LS40IDAgNi43LTEuNCAyLS40IDIuMS0uNCAzLjEgMS40IDcuMyAxMi42IDc3LjMgMTM0IDc3LjQgMTM0LjFsMC0yMzAuNGMtMS43IC41LTEwMy4zIDM4LjctMTA1LjggMzkuNy0xLjEgLjQtMS41IC4yLTEuOS0uOS0uNi0xLjktMS4zLTMuOC0yLjEtNS42LS4zLS44LS4xLTEuMSAuNi0xLjQgLjEgMCA5NS41LTM1LjggMTAzLTM4LjgtNjUuNC0zNy42LTEzMC42LTc1LTE5Ni0xMTIuNmw4Ni44IDE1MC40LS4zIC4zYy05LjYtLjktMTAuNS0xLjYtMTEuOC0zLjktMS0xLjctNzMuNS0xMjcuNy04Mi0xNDIuMi05LjEgMTQuNy04My42IDE0Ni4yLTg1LjQgMTQ2LjMtMi45IC4yLTUuOSAuMS05LjIgLjEgMjguOC00OS44IDU3LjYtOTkuNSA4Ni4yLTE0OWwwIDB6bTUxLjkgMTI5LjljMS45LS4xIDMuNy0uNCA1LjUtLjggMS43LS4zIDIuNSAuMiAyLjYgMS45IDAgLjEgLjEgMTkuMS0uOSAyMC41cy0xLjkgMS4yLTIuNi0uMmMtNS05LjcgNi4yLTkuNy0zOS4xLTEyLS43IDAtMSAuMi0xIC45IDAgLjEgMy43IDEyMiAzLjcgMTIyLjEgMCAuOSAuNSAxLjIgMS4yIDEuNSAzIDEuMiA1LjkgMi41IDguNyA0IDcuMyA0LjMgMTEuNCAxMC44IDEyLjQgMTkuMyAxLjQgMTEuOC0yLjggMzUuOC0zMi4yIDM3LjEtMi44IC4xLTI4LjMgMS4xLTM0LjEtMjMuMy00LjctMTkuMyA4LjMtMzIuNyAxOS45LTM2LjQgLjYtLjEgMS4yLS40IDEuNS0uOXMuNS0xLjEgLjUtMS43Yy4xLTUuNiAzLTEwNy4xIDMuNy0xMjEuMyAwLTEuMS0uNi0xLjItMS40LTEuMS0zMi4zIC41LTM2LjctLjMtNDAuMiA4LjUtMi40IDYuMi00LjEgMS4zLTQgLjIgMS4xLTYgMi4yLTEyIDMuMy0xOCAuNC0yLjEgMS40LTIuNiAzLjQtMS45IDUuNiAyLjEgNi43IDEuNyAzNy4yIDEuOSAxLjcgMCAxLjgtLjEgMS44LTEuOCAuNy0yNy41IC42LTIyLjYgMS0yOS42IC4xLS42LS4xLTEuMi0uMy0xLjdzLS43LS45LTEuMy0xLjFjLTUuNi0yLjktOC44LTcuNi04LjktMTMuOS0uNC0xNC44IDE3LjctMjEuNyAyNy40LTExLjUgNi44IDcuMiA1LjggMTguOS0yLjUgMjQuMi0uOCAuNC0xLjQgMS4xLTEuOCAxLjhzLS42IDEuNi0uNCAyLjVjMCAuNi0uMS00LjMgMSAzMCAwIC45IC40IDEuMSAxLjIgMS4xIC4xIDAgMjMtLjEgMzQuNS0uNGwwLS4xek02OC4zIDE0MS43YzE5LjgtNC41IDMyLjctLjYgNTIuNSAxLjcgMi44IC4zIDMuNyAxLjIgMy42IDQtLjIgNS0xLjIgMjIuMy0xLjIgMjMuMSAwIC41LS4yIDEtLjUgMS40cy0uNyAuNy0xLjIgLjljLTQuMSAxLjctMy42LTQuNC00LTcuMy0zLjEtMjIuNC03My45LTMyLjctNzQuNiAyNS40LS4zIDIzLjkgMTcgNTMuNiA1NC4xIDUwLjkgMjcuMi0yIDE5LTIwLjIgMjQuOC0yMC41IC40LS4xIC45IDAgMS4zIC4xcy44IC40IDEuMSAuNyAuNSAuNyAuNiAxLjIgLjEgLjkgMCAxLjNjLTEuOCAxMC44LTMuNCAxOS0zLjQgMTkuMi0xLjUgOS4yLTg2LjcgMjIuMS05My40LTQyLjEtMi43LTI1LjggMTAuNC01My40IDQwLjMtNjAuMnptODAgODcuN2wtMTkuNSAwYy0uNiAwLTEuMi0uMS0xLjYtLjRzLS44LS44LTEtMS40YzIuNC0zLjggNS45IC45IDUuOS02LjEtLjEtMjUuOCAuMi0zOCAuMi00MC4xIDAtMy40LS41LTQuNi0zLjMtNC45LTctLjctMy4xLTMuNC0xLjEtMy40IDExLjgtLjEgMjIuNi0uMiAzMCAuNyA4LjggMS4xIDE2LjcgMTIuNiA3LjkgMjIuNi0yIDIuMi00IDQuNC02LjEgNi43IDEgMS4yIDYuOSA4LjggMTcuMyAxOS43IDIuNyAyLjggNi4yIDMuNSA5LjkgMy4xIC42IDAgMS4xLS4yIDEuNS0uNnMuNy0uOSAuNy0xLjVjLjMtMy40IC4zIDQuNyAuNC00MC42IDAtNS42LS4zLTYuNi0zLjItNi44LTQtLjQtNC0yLjMtLjctMy40bDE5LjEtLjFjLjMgMCA0LjUgLjUgMSAzLjQgMCAwLS4yIDAtLjIgMC0zLjYgLjMtMy45IDEtNCA0LjYtLjMgNDMuOSAuMSA0MC4yIC40IDQyLjggLjEgLjggLjMgMi4yIDUuMSAyLjEgMi41IDAgMy45IDMuNCAwIDMuNC0xMC40IC4xLTIwLjcgMC0zMS4xIC4xLTEwLjcgMC0xMy41LTYuMi0yNC4yLTIwLjgtMS42LTIuMi04LjMtMi40LTguMi0uNCAuOSAxNi41IDAgMTcuOCA0IDE3LjcgNC44LS4xIDQuNyAzLjYgLjggMy41bC4xIDB6bTI3NS0xMC4xYy0xLjIgNy4xIC4yIDEwLjQtNS4zIDEwLjMtNjEuNS0uNC00Ny44LS4yLTUwLjctLjMtMS4yLS4xLTIuNC0uNC0zLjYtLjctMi41LS42IDEuNS0xLjItLjQtNS42LTEuNC0zLjQtMi44LTYuOC00LjEtMTAuMi0uMS0uNC0uNC0uOC0uNy0xLjFzLS44LS40LTEuMy0uNGMtNC45LS4yLTkuNy0uMi0xNC42IC4xLS4zIDAtLjYgLjItLjkgLjNzLS41IC40LS43IC43Yy0xLjYgMy42LTMuMSA3LjMtNC41IDExLTEuMyAzLjIgNy45IDEuMyAxMi4yIDIuMiAzIC42IDQuNSAzLjcgLjcgMy43bC0yNi40IDBjLTIuOSAwLTMuMS0zLjItLjctMy4yIDEuMiAuMSAyLjQtLjIgMy41LS45czEuOS0xLjUgMi40LTIuNmMxLjUtMyAyLjgtNiA0LjEtOS4xIDE4LjItNDIuMSAxNy4xLTQwLjIgMTguNC00MS42IC4yLS4yIC40LS40IC43LS42cy42LS4yIC44LS4yIC42IC4xIC44IC4yIC41IC4zIC43IC42YzIuOSAzLjMgMTguNCA0NC43IDIzLjYgNTEuOSAyIDIuNyA1LjcgMiA2LjQgMiAzLjYgLjEgNC0xLjEgNC4xLTQuMyAuMS0xLjkgLjEgMS4yIC4xLTQxLjIgMC00LjUtMi40LTMuNy01LjYtNC4zLS4zIDAtMi42LS42LS4xLTMuMSAuMi0uMi0uOS0uMiAyMS43LS4yIDIuMyAwIDUuMyAyLjgtMS4yIDMuNC0uNCAwLS43IDAtMS4xIC4ycy0uNiAuMy0uOSAuNi0uNCAuNi0uNiAuOS0uMiAuNy0uMSAxLjFjLS4xIDEuNi0uMiAzOC45IC4zIDQxLjIgLjIgLjcgLjYgMS40IDEuMiAxLjhzMS4zIC43IDIuMSAuNmMxMy4zIC40IDE0LjkgLjQgMTYtMy40IDEuNy01LjggNC4xLTIuNSAzLjctLjJsMCAuMXpNMzE4LjYgMjgzLjZjLTQuMiAwLTQuNC0zLjQtLjYtMy40IDM1LjktLjIgMjguMSAuNCAzNy4yLS42IDEuNy0uMiAyLjQgLjIgMi4zIDEuOS0uMyAzLjQtLjYgNi44LTEgMTAuMi0uMiAyLjItMy4yIDIuNi0zLjQtLjItLjQtNS4zLTIuMi00LjUtMTUuNi01LjEtMS42LS4xLTEuNiAwLTEuNiAxLjVsMCAxNi4xYzAgMS43IDAgMS42IDEuNiAxLjUgMy4xLS4yIDEwLjMgLjMgMTUuNy0xLjUgLjUtLjIgMy4zLTEuOCAzLjEgMS44IDAgLjItLjggMTAuNC0xLjIgMTEuNC0uNSAxLjMtMS45IDEuNS0yLjYgLjMtMS4yLTIgMC01LjEtMy43LTUuMy0xNS40LS45LTEyLjktMi41LTEyLjkgNiAwIDEyLjMtLjggMTYuMSAzLjkgMTYuMiAxNi42IC41IDE0LjQgMCAxNi40LTUuNyAuOC0yLjQgMy41LTEuOCAzLjIgLjYtLjQgMy4yLS44IDYuNC0xLjIgOS42IDAgLjQtLjIgMi40LTQuNyAyLjQtMzcuMi0uMS0zNC41LS4yLTM1LjItLjMtMi43LS41LTIuMi0zIC4yLTMuNCAxLjEtLjIgNCAuNSA0LjItMi42IDIuNC01Ni4yLS4xLTUxLjMtMy45LTUxLjNsMCAwem0tLjQtMTA5LjVjMi41IC42IDMuMSAxLjggMyA0LjYtLjMgNS4zLS4zIDktLjYgOS43LS43IDIuMi0zLjEgMi4xLTMuMy0uMy0uNC00LjgtMy03LjgtNy42LTkuMS0yNi4zLTcuNy0zMi44IDE1LjUtMjcuMiAzMC4yIDUuOSAxNS40IDIyIDE1LjkgMjguOSAxMy44IDUuOS0xLjkgNS45LTYuNSA2LjktNy42IDEuMi0xLjMgMi4yLTEuOCAzLjEgMS4xIDAgLjEgLjYgMTEuOS02IDEyLjctMS42IC4yLTE5LjQgMy43LTMyLjctMy40LTIxLTExLjItMTYuNy0zNS41LTYuOS00NS4zIDE0LTE0LjEgMzkuOS03LjEgNDIuMy02LjVsMCAwek0yODkuOCAyODAuMWMzLjMgMCAzLjcgMyAuMiAzLjQtMi42IC4zLTUtLjQtNSA1LjUgMCAyLS4yIDI5IC40IDQxLjQgLjEgMi4zIDEuMiAzLjUgMy40IDMuNyAyMiAxLjIgMTUtMS43IDE4LjgtNi4zIDEuOC0yLjIgMi44IC44IDIuOCAxLjEgLjMgMTMuNi00IDEyLjQtNS4yIDEyLjRsLTM4LjItLjJjLTEuOS0uMi0yLjEtMy0uNC0zLjQgMi0uNSA0LjkgLjQgNS4xLTIuOCAxLTE1LjkgLjYtNDQuNiAuMy00Ny44LS4zLTMuOC0yLjgtMy4zLTUuNy0zLjctMi41LS40LTItMy4yIC4zLTMuMiAxLjQgMCAxOCAwIDIzLjEgMHptLTMxLjYtNTcuOGMuMSA0LjEgMi45IDMuNSA2IDMuNiAyLjYgLjEgMi41IDMuNC0uMSAzLjQtNi41IDAtMTMuNyAwLTIxLjYtLjEtMy44IDAtMy40LTMuNCAwLTMuNCA0LjUgMCAzLjIgMS42IDMuNC00NS41IDAtNS4xLTMuMy0zLjUtNC43LTQuMi0yLjYtMS4yLTEuNC0zLjEgLjQtMy4yIDEuMyAwIDIwLjItLjQgMjEuMiAuMnMxLjkgMS42LS40IDIuOWMtMSAuNS0zLjktLjMtNC4yIDIuNSAwIC4yLS44IDEuNi0uMSA0My44bDAgMHpNMjIxLjMgNDk2LjZjLjUgLjMgMSAuNSAxLjYgLjVzMS4xLS4yIDEuNi0uNWMxNy05LjggMTgyLTEwMy42IDE5Ny40LTExMi41LS4xLS40IDExLjMtLjItMTgxLjUtLjMtMS4yIDAtMS42IC40LTEuNSAxLjYgMCAuMSAxLjMgNDQuNSAxLjIgNTAuNC0uMSAyLjYtLjYgNS4yLTEuNCA3LjctLjYgMS44IC40LS41LTEzLjUgMzIuMi0uNyAxLjctMSAyLjItMi0uMS00LjItMTAuMy04LjMtMjAuNy0xMi42LTMxLTEuNS0zLjQtMi4yLTcuMS0yLTEwLjggLjItMi41IC44LTE2LjEgMS41LTQ4IDAtMS45IDAtMi0yLTJsLTE4MyAwYzIuNiAxLjYgMTc4LjMgMTAyLjYgMTk2IDExMi44bC4xIDB6TTEzMC40IDMwNy45YzAgMi40IC40IDIuOCAyLjggMyAxMS41IDEuMiAyMSAzLjcgMjUuNi03LjMgNi0xNC41IDIuNy0zNC40LTEyLjUtMzguOC0yLS42LTE2LTIuOC0xNS45IDEuNSAwIDggMCAxMS42IDAgNDEuNnptMTA1LjgtMTVjMCAyLjEgMS4xIDM4LjcgMS4xIDM5LjEgLjMgOS45LTI1LjYgNS44LTI1LjItMi42IC4xLTIgMS40LTM3LjQgMS4xLTM5LjQtMTQuMSA3LjQtMTQuNCA0MC4yIDYuNCA0OC44IDQgMS43IDguNCAxLjkgMTIuNSAuNnM3LjYtNCA5LjktNy43YzQuOS03LjggNi44LTI5LjUtNS40LTM5LS4xIC4xLS4yIC4xLS40IC4xbDAgMHptLTEyLjMtMTk4Yy05LjggMC05LjcgMTQuOC0uMSAxNC45czEwLjEtMTQuOSAuMS0xNC45bDAgMHpNMTQzLjcgMTk4LjZjMCAxLjggLjQgMi40IDIuMiAyLjYgMTMuNiAxLjQgMTIuNS0xMSAxMi4yLTEzLjQtMS43LTExLjItMTQuNC0xMC4yLTE0LjQtNy44IDAgNC41IDAgMTMuNyAwIDE4LjZ6TTM1NiAyMDVsLTYuMS0xNS44Yy0yLjIgNS41LTQuMiAxMC42LTYuMiAxNS44bDEyLjMgMHoiXQogICAgfTsKICAgIGZhU3RlYW1TeW1ib2wgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3RlYW0tc3ltYm9sIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzZjYiLCAiTTI3My41IDE3Ny41YTYxIDYxIDAgMSAxIDEyMiAwIDYxIDYxIDAgMSAxIC0xMjIgMHptMTc0LjUgLjJjMCA2My01MSAxMTMuOC0xMTMuNyAxMTMuOEwyMjUgMzcxLjNjLTQgNDMtNDAuNSA3Ni44LTg0LjUgNzYuOC00MC41IDAtNzQuNy0yOC44LTgzLTY3TDAgMzU4IDAgMjUwLjcgOTcuMiAyOTBjMTUuMS05LjIgMzIuMi0xMy4zIDUyLTExLjVsNzEtMTAxLjdDMjIwLjcgMTE0LjUgMjcxLjcgNjQgMzM0LjIgNjQgMzk3IDY0IDQ0OCAxMTUgNDQ4IDE3Ny43ek0yMDMgMzYzYzAtMzQuNy0yNy44LTYyLjUtNjIuNS02Mi41LTQuNSAwLTkgLjUtMTMuNSAxLjVsMjYgMTAuNWMyNS41IDEwLjIgMzggMzkgMjcuNyA2NC41LTEwLjIgMjUuNS0zOS4yIDM4LTY0LjcgMjcuNS0xMC4yLTQtMjAuNS04LjMtMzAuNy0xMi4yIDEwLjUgMTkuNyAzMS4yIDMzLjIgNTUuMiAzMy4yIDM0LjcgMCA2Mi41LTI3LjggNjIuNS02Mi41ek00MTAuNSAxNzcuN2E3Ni40IDc2LjQgMCAxIDAgLTE1Mi44IDAgNzYuNCA3Ni40IDAgMSAwIDE1Mi44IDB6Il0KICAgIH07CiAgICBmYU1haWxjaGltcCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJtYWlsY2hpbXAiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjU5ZSIsICJNMzMxIDI0My41YzMuMS0uNCA2LjItLjQgOS4zIDAgMS43LTMuOCAyLTEwLjQgLjUtMTcuNi0yLjItMTAuNy01LjMtMTcuMS0xMS41LTE2LjFzLTYuNSA4LjctNC4yIDE5LjRjMS4zIDYgMy41IDExLjEgNiAxNC4zbDAgMHpNMjc3LjQgMjUyYzQuNSAyIDcuMiAzLjMgOC4zIDIuMSAxLjktMS45LTMuNS05LjQtMTIuMS0xMy4xLTUtMi4xLTEwLjQtMi44LTE1LjgtMi4ycy0xMC41IDIuNy0xNC44IDUuOGMtMyAyLjItNS44IDUuMi01LjQgNy4xIC45IDMuNyAxMC0yLjcgMjIuNi0zLjUgNy0uNCAxMi44IDEuOCAxNy4zIDMuN2wwIDB6bS05IDUuMWMtOS4xIDEuNC0xNSA2LjUtMTMuNSAxMC4xIC45IC4zIDEuMiAuOCA1LjItLjggNi0yLjMgMTIuNC0yLjkgMTguNy0xLjkgMi45IC4zIDQuMyAuNSA0LjktLjUgMS41LTIuMi01LjctOC0xNS40LTYuOWwwIDB6bTU0LjIgMTcuMWMzLjQtNi45LTEwLjktMTMuOS0xNC4zLTdzMTAuOSAxMy45IDE0LjMgN2wwIDB6bTE1LjctMjAuNWMtNy43LS4xLTggMTUuOC0uMyAxNS45czgtMTUuOCAuMy0xNmwwIDB6TTExOS41IDMzMi43Yy0xLjMgLjMtNiAxLjUtOC41LTIuMy01LjItOCAxMS4xLTIwLjQgMy0zNS44LTkuMS0xNy41LTI3LjgtMTMuNS0zNS01LjUtOC43IDkuNi04LjcgMjMuNS01IDI0LjEgNC4zIC42IDQuMS02LjUgNy40LTExLjYgLjktMS40IDIuMS0yLjYgMy41LTMuNnMzLTEuNiA0LjYtMiAzLjQtLjQgNSAwIDMuMyAxIDQuNyAxLjljMTEuNiA3LjYgMS40IDE3LjggMi4zIDI4LjYgMS40IDE2LjcgMTguNCAxNi40IDIxLjYgOSAuMi0uNCAuMy0uOCAuMy0xLjJzLS4yLS44LS41LTEuMWMwIC45IC43LTEuMy0zLjQtLjRsMCAwem0yOTkuNy0xNy4xYy0zLjMtMTEuNy0yLjYtOS4yLTYuOC0yMC41IDIuNC0zLjcgMTUuMy0yNC0zLjEtNDMuMy0xMC40LTEwLjktMzMuOS0xNi41LTQxLjEtMTguNS0xLjUtMTEuNCA0LjYtNTguNy0yMS41LTgzIDIwLjgtMjEuNiAzMy44LTQ1LjMgMzMuNy02NS43LS4xLTM5LjItNDguMi01MS0xMDcuNC0yNi41bC0xMi41IDUuM2MtLjEgMC0yMi43LTIyLjMtMjMuMS0yMi42LTY3LjUtNTguOS0yNzguOCAxNzUuOS0yMTEuMyAyMzIuOWwxNC44IDEyLjVjLTQgMTAuNy01LjQgMjIuMi00LjEgMzMuNSAzLjQgMzMuNCAzNiA2MC40IDY3LjUgNjAuNCA1Ny43IDEzMy4xIDI2Ny45IDEzMy4zIDMyMi4zIDMgMS43LTQuNSA5LjEtMjQuNiA5LjEtNDIuNHMtMTAuMS0yNS4zLTE2LjUtMjUuM2wwIDB6bS0zMTYgNDguMmMtMjIuOC0uNi00Ny41LTIxLjEtNDkuOS00NS41LTYuMi02MS4zIDc0LjMtNzUuMyA4NC0xMi4zIDQuNSAyOS42LTQuNyA1OC41LTM0LjEgNTcuOGwwIDB6TTg0LjcgMjQ5LjZjLTE1LjIgMy0yOC41IDExLjUtMzYuNyAyMy41LTQuOS00LjEtMTQtMTItMTUuNi0xNS0xMy0yNC44IDE0LjItNzMgMzMuMy0xMDAuMiA0Ny4xLTY3LjIgMTIwLjktMTE4LjEgMTU1LTEwOC45IDUuNSAxLjYgMjMuOSAyMi45IDIzLjkgMjIuOXMtMzQuMSAxOC45LTY1LjggNDUuM0MxMzYuMiAxNTAgMTA0IDE5Ny43IDg0LjcgMjQ5LjZ6TTMyMy42IDM1MC43cy0zNS43IDUuMy02OS41LTcuMWM2LjItMjAuMiAyNyA2LjEgOTYuNC0xMy44IDE1LjMtNC40IDM1LjQtMTMgNTEtMjUuNCAzLjQgNy44IDUuOCAxNS45IDcuMSAyNC4zIDMuNy0uNyAxNC4yLS41IDExLjQgMTguMS0zLjMgMTkuOS0xMS43IDM2LTI1LjkgNTAuOC04LjkgOS42LTE5LjQgMTcuNS0zMS4yIDIzLjMtNi41IDMuNC0xMy4zIDYuMy0yMC4zIDguNi01My41IDE3LjUtMTA4LjMtMS43LTEyNi00My0xLjQtMy4xLTIuNi02LjQtMy42LTkuNy03LjUtMjcuMi0xLjEtNTkuOCAxOC44LTgwLjQgMS4yLTEuMyAyLjUtMi45IDIuNS00LjgtLjItMS43LS44LTMuMy0xLjktNC41LTctMTAuMS0zMS4yLTI3LjQtMjYuMy02MC44IDMuNS0yNCAyNC41LTQwLjkgNDQuMS0zOS45bDUgLjNjOC41IC41IDE1LjkgMS42IDIyLjkgMS45IDExLjcgLjUgMjIuMi0xLjIgMzQuNi0xMS42IDQuMi0zLjUgNy42LTYuNSAxMy4zLTcuNSAyLjMtLjYgNC43LS43IDctLjNzNC42IDEuMiA2LjYgMi41YzEwIDYuNiAxMS40IDIyLjcgMTEuOSAzNC41IC4zIDYuNyAxLjEgMjMgMS40IDI3LjYgLjYgMTAuNyAzLjQgMTIuMiA5LjEgMTQgMy4yIDEgNi4yIDEuOCAxMC41IDMuMSAxMy4yIDMuNyAyMSA3LjUgMjYgMTIuMyAyLjUgMi41IDQuMiA1LjggNC43IDkuMyAxLjYgMTEuNC04LjggMjUuNC0zNi4zIDM4LjItNDYuNyAyMS43LTkzLjcgMTQuNC0xMDAuNSAxMy43LTIwLjItMi43LTMxLjYgMjMuMy0xOS41IDQxLjEgMjIuNiAzMy40IDEyMi40IDIwIDE1MS40LTIxLjQgLjctMSAuMS0xLjYtLjctMS00MS44IDI4LjYtOTcuMSAzOC4yLTEyOC41IDI2LTQuOC0xLjgtMTQuNy02LjQtMTUuOS0xNi43IDQzLjYgMTMuNSA3MSAuNyA3MSAuN3MyLTIuOC0uNi0yLjV6TTE3MS43IDE1Ny41YzE2LjctMTkuNCAzNy40LTM2LjIgNTUuOC00NS42IC4xLS4xIC4zLS4xIC41LS4xcy4zIC4xIC40IC4yIC4yIC4zIC4yIC40IDAgLjMtLjEgLjVjLTEuNSAyLjctNC4zIDguMy01LjIgMTIuNyAwIC4xIDAgLjMgMCAuNHMuMiAuMyAuMyAuNCAuMyAuMSAuNCAuMSAuMyAwIC40LS4xYzExLjUtNy44IDMxLjUtMTYuMiA0OS0xNy4zIC4yIDAgLjMgMCAuNSAuMXMuMiAuMiAuMyAuNCAuMSAuMyAwIC41LS4xIC4zLS4zIC40Yy0yLjkgMi4yLTUuNSA0LjgtNy43IDcuNy0uMSAuMS0uMSAuMi0uMSAuNHMwIC4zIC4xIC40IC4yIC4yIC4zIC4zIC4yIC4xIC40IC4xYzEyLjMgLjEgMjkuNyA0LjQgNDEgMTAuNyAuOCAuNCAuMiAxLjktLjYgMS43LTY5LjUtMTUuOS0xMjMuMSAxOC41LTEzNC41IDI2LjgtLjIgLjEtLjMgLjEtLjUgLjFzLS4zLS4xLS41LS4yLS4yLS4zLS4yLS41IC4xLS40IC4yLS41bC0uMSAweiJdCiAgICB9OwogICAgZmFMdW1vbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJsdW1vbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlN2UyIiwgIk00NTIuNSAyMjMuNWM5LjggMCAxNi41IDYuMyAxNi41IDE2LjZsMCAzMS44YzAgMTAuMy02LjYgMTYuNi0xNi42IDE2LjZsLTU2LjIgMGMtOS44IDAtMTYuNS02LjMtMTYuNS0xNi42bDAtMzEuOGMwLTEwLjMgNi43LTE2LjYgMTYuNS0xNi42bDU2LjMgMHptLTI1LjcgMTMuMWMtMS41LTIuNi0zLjItMi42LTQuNiAwbC0xMC43IDE3LjZjLTEuNyAyLjQtMi42IDUuMS0yLjYgOC4yIDAgNy45IDYuOSAxNC42IDE1LjYgMTQuNiA4LjUgMCAxNS42LTYuNyAxNS42LTE0LjYgMC0zLTEtNS44LTIuNy04LjJsLTEwLjctMTcuNnpNODUuOCAyMjMuOGMxIDAgMS41IC42IDEuNSAxLjVsMCA1MC4zIDY0LjYgMGMxIDAgMS42IC42IDEuNiAxLjVsMCA5LjdjMCAuOS0uNiAxLjUtMS42IDEuNWwtNzguNCAwYy0xIDAtMS42LS42LTEuNi0xLjVsMC02MS40YzAtLjkgLjYtMS41IDEuNi0xLjVsMTIuMyAwem04OC4zIDBjMSAwIDEuNSAuNiAxLjUgMS41bDAgNDVjMCA0IDIgNS4yIDUuNyA1LjJsNDYuOSAwYzMuOCAwIDUuNy0xLjMgNS43LTUuMmwwLTQ1YzAtLjkgLjUtMS41IDEuNS0xLjVsMTIuMyAwYzEgMCAxLjYgLjYgMS42IDEuNWwwIDQ2YzAgMTAuNS01LjMgMTYuOC0xNy42IDE2LjhsLTU0IDBjLTEyLjMgMC0xNy42LTYuMy0xNy42LTE2LjhsMC00NmMwLS45IC42LTEuNSAxLjYtMS41bDEyLjMgMHptMTA4LjIgMGMxIDAgMS42IC41IDIuMiAxLjRsMzAuNSA0Ni40IDEuNCAwIDMwLjUtNDYuNGMuNi0uOSAxLjItMS40IDIuMi0xLjRsMTggMGMxIDAgMS41IC42IDEuNSAxLjVsMCA2MS40YzAgLjktLjUgMS41LTEuNSAxLjVsLTEyLjMgMGMtMSAwLTEuNi0uNi0xLjYtMS41bDAtNDMuOC0xLjEgMC0yOC43IDQzLjhjLS42IC45LTEuMyAxLjUtMi40IDEuNWwtMTAuNyAwYy0xIDAtMS43LS42LTIuMy0xLjVsLTI4LjctNDMuOC0xLjEgMCAwIDQzLjhjMCAuOS0uNSAxLjUtMS41IDEuNWwtMTIuMyAwYy0xIDAtMS42LS42LTEuNi0xLjVsMC02MS40YzAtLjkgLjYtMS41IDEuNi0xLjVsMTcuOSAwem0yMTQuNCAwYy45IDAgMS4zIC40IDIuMiAxLjFsNTIuNyA0Ni4zIDEuMyAwIDAtNDZjMC0uOSAuNi0xLjUgMS42LTEuNWwxMi4zIDBjMSAwIDEuNiAuNiAxLjYgMS41bDAgNjEuNGMwIC45LS42IDEuNS0xLjYgMS41bC0xNC40IDBjLTEgMC0xLjQtLjQtMi4zLTEuMWwtNTIuNi00Ni4zLTEuNCAwIDAgNDZjMCAuOS0uNSAxLjUtMS41IDEuNWwtMTIuMyAwYy0xIDAtMS42LS42LTEuNi0xLjVsMC02MS40YzAtLjkgLjYtMS41IDEuNi0xLjVsMTQuNCAwek0zMjAgMTE0LjFjODcuOSAwIDE2Ny43IDE1LjcgMjI1LjUgNDFsMi43IDEuMkM1ODcuMSAxNzMuOCA2NDAgMjA2LjUgNjQwIDI1NnMtNTIuOSA4Mi4yLTkxLjggOTkuNmwtMi43IDEuMmMtNTcuOCAyNS40LTEzNy42IDQxLTIyNS41IDQxLTc2LjIgMC0xNTUuMS0xMC41LTIyNS41LTQxLTM5LjYtMTcuNC05NC41LTUwLjMtOTQuNS0xMDAuOHM1NC45LTgzLjUgOTQuNS0xMDAuOGM3MC40LTMwLjUgMTQ5LjMtNDEgMjI1LjUtNDF6bS04OC45IDIyOWMyMC4zIDI5IDUyLjggNDkuNiA4OC45IDQ5LjYgMzYuMiAwIDY4LjctMjAuNiA4OS00OS43bC0xNzcuOSAuMXptLTk2LjEgMGM0My4zIDI5LjcgOTYuNyA0My41IDE0OC40IDQ4LTI0LjItOS4xLTQ0LjQtMjYuNy01OC42LTQ4LjFsLTg5LjkgMHptMjgwLjMtLjFjLTE0LjIgMjEuNC0zNC40IDM5LjEtNTguNiA0OC4xIDUxLjgtNC41IDEwNS4zLTE4LjMgMTQ4LjYtNDguMmwtOTAgMHptLTMzNy40IC4xYzQ0LjEgMjMuMSA5My43IDM1LjQgMTQyLjcgNDIuNi0zMy40LTguNi02Ni41LTIxLjktOTQuNC00Mi42bC00OC4zIDB6bTQzNi4yLS4yYy0yNy45IDIwLjgtNjEuMSAzNC4yLTk0LjYgNDIuOCA0Ny4zLTYuOSA4OS42LTE4LjUgMTIzLjktMzMuNmwxLjctLjhjNi4xLTIuNyAxMS45LTUuNSAxNy40LTguNGwtNDguNSAwek01MjAgMTczLjZjMTAuNyA4LjcgMTkuOCAxOC4xIDI3IDI4LjIgLjQgLjYgLjUgMS4zIC4xIDJzLTEgMS0xLjcgMWwtMS42IDBjLS42IDAtMS4yLS4zLTEuNS0uOC03LjktMTAuOS0xOC4yLTIxLjEtMzAuNi0zMC40bC05My41IDBjNS40IDguOCA5LjkgMTguNSAxMy40IDI4LjYgLjIgLjYgLjEgMS4yLS4yIDEuN3MtLjkgLjgtMS42IC44bC0xLjQgMGMtLjggMC0xLjUtLjUtMS44LTEuMy0zLjgtMTAuNy04LjctMjAuOC0xNC41LTI5LjlsLTE4NC4zIC4xYy01LjggOS4xLTEwLjcgMTkuMS0xNC40IDI5LjgtLjMgLjgtMSAxLjMtMS44IDEuM2wtMS40IDBjLS42IDAtMS4yLS4zLTEuNi0uOHMtLjUtMS4xLS4yLTEuN2MzLjUtMTAuMiA4LTE5LjcgMTMuNC0yOC42bC05My42IDBjLTEyLjMgOS4zLTIyLjYgMTkuNC0zMC40IDMwLjMtLjQgLjUtLjkgLjgtMS41IC44bC0xLjYgMGMtLjcgMC0xLjQtLjQtMS43LTFzLS4zLTEuNCAuMS0yYzcuNi0xMC41IDE2LjctMTkuOSAyNi44LTI4bC01MSAwYy0yOC45IDE2LjYtNjIgNDMuMy02My41IDc5LjdsNDQuNyAwYy41IDAgMSAuMiAxLjMgLjZzLjYgLjggLjYgMS4zbDAgMS4zYzAgMS4xLS45IDEuOS0xLjkgMS45bC00NC43IDBDNi44IDI5NSA0MCAzMjEuNyA2OSAzMzguM2w1MC45IDBjLTEwLjMtOC40LTE5LjEtMTcuNC0yNi4xLTI3bC0uOC0xLjFjLS40LS42LS41LTEuMy0uMS0yczEtMSAxLjctMWwxLjYgMCAuMiAwYy41IC4xIDEgLjMgMS4zIC44IDcuOSAxMC45IDE4LjEgMjEgMzAuNSAzMC4zbDkzLjYgMGMtNS4zLTguOC05LjgtMTguNC0xMy40LTI4LjUtLjItLjYtLjEtMS4yIC4yLTEuN3MuOS0uOCAxLjYtLjhsMS40IDAgLjIgMGMuNyAuMSAxLjQgLjYgMS43IDEuMyAzLjggMTAuNyA4LjYgMjAuNyAxNC40IDI5LjhsMTg0LjUtLjFjNS44LTkuMSAxMC42LTE5LjEgMTQuNC0yOS43bC4xLS4xYy4zLS43IDEtMS4xIDEuNy0xLjFsMS40IDBjLjYgMCAxLjIgLjMgMS42IC44cy41IDEuMiAuMiAxLjdjLTMuNSAxMC4xLTggMTkuNy0xMy4zIDI4LjVsOTMuNyAwYzEyLjMtOS4zIDIyLjUtMTkuNCAzMC4zLTMwLjJsLjEtLjJjLjQtLjQgLjktLjYgMS40LS42bDEuNiAwYy43IDAgMS40IC40IDEuNyAxcy4zIDEuNC0uMSAyYy03LjEgMTAtMTYuMSAxOS4zLTI2LjcgMjcuOWw1MS4xIDBjMjguOC0xNi42IDYxLjgtNDMuMyA2My40LTc5LjZsLTQ0LjcgMGMtMSAwLTEuOS0uOS0xLjktMS45bDAtMS4zYzAtMS4xIC45LTEuOSAxLjktMS45bDQ0LjcgMGMtMS42LTM2LjUtMzQuOS02My4zLTYzLjktNzkuOWwtNTAuOSAwek0yMjAuNSAxMjYuMmMtNDkuMSA3LjEtOTguNyAxOS41LTE0MyA0Mi43bDQ4LjQgMGMyNy45LTIwLjggNjEtMzQuMSA5NC41LTQyLjd6bTYyLjgtNS40Yy01MS44IDQuNS0xMDUuMiAxOC4zLTE0OC42IDQ4LjFsOTAgMGMxNC4yLTIxLjQgMzQuNC0zOSA1OC42LTQ4LjF6bTM2LjYtMS42Yy0zNi4yIDAtNjguNyAyMC42LTg5IDQ5LjdsMTc3LjktLjFjLTIwLjMtMjkuMS01Mi43LTQ5LjYtODguOS00OS42em0zNi42IDEuNmMyNC4yIDkuMSA0NC40IDI2LjYgNTguNSA0OGw4OS44IDBjLTQzLjMtMjkuNy05Ni42LTQzLjUtMTQ4LjMtNDh6bTYyLjggNS40YzMzLjQgOC41IDY2LjQgMjEuOSA5NC4zIDQyLjVsNDguMyAwYy00NC4xLTIzLjEtOTMuNi0zNS40LTE0Mi42LTQyLjV6Il0KICAgIH07CiAgICBmYU51dHJpdGlvbml4ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm51dHJpdGlvbml4IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzZDYiLCAiTTExMiA4LjFTMjQ1LjQtLjEgMjMzIDExMi41YzAgMCAxOS4xLTc0LjkgMTAzLTQwLjYgMCAwLTE3LjcgNzQtODggNTYgMCAwIDE0LjYtNTQuNiA2Ni4xLTU2LjYgMCAwLTM5LjktMTAuMy04Mi4xIDQ4LjggMCAwLTE5LjgtOTQuNS05My42LTk5LjcgMCAwIDc1LjIgMTkuNCA3Ny42IDEwNy41IDAgLjEtMTA2LjQgNy0xMDQtMTE5Ljh6TTQyNCAzMjMuN2MwIDQ4LjUtOS43IDk1LjMtMzIgMTMyLjMtNDIuMiAzMC45LTEwNSA0OC0xNjggNDgtNjIuOSAwLTEyNS44LTE3LjEtMTY4LTQ4LTIyLjMtMzctMzItODMuOC0zMi0xMzIuMyAwLTQ4LjQgMTcuNy05NC43IDQwLTEzMS43IDQyLjItMzAuOSA5Ny4xLTQ4LjYgMTYwLTQ4LjYgNjMgMCAxMTcuOCAxNy42IDE2MCA0OC42IDIyLjMgMzcgNDAgODMuMyA0MCAxMzEuN3pNMTQ0IDQyOGEyOCAyOCAwIDEgMCAtNTYgMCAyOCAyOCAwIDEgMCA1NiAwem0wLTY2LjJhMjggMjggMCAxIDAgLTU2IDAgMjggMjggMCAxIDAgNTYgMHptMC02Ni4yYTI4IDI4IDAgMSAwIC01NiAwIDI4IDI4IDAgMSAwIDU2IDB6TTIxNiA0MjhhMjggMjggMCAxIDAgLTU2IDAgMjggMjggMCAxIDAgNTYgMHptMC02Ni4yYTI4IDI4IDAgMSAwIC01NiAwIDI4IDI4IDAgMSAwIDU2IDB6bTAtNjYuMmEyOCAyOCAwIDEgMCAtNTYgMCAyOCAyOCAwIDEgMCA1NiAwek0yODggNDI4YTI4IDI4IDAgMSAwIC01NiAwIDI4IDI4IDAgMSAwIDU2IDB6bTAtNjYuMmEyOCAyOCAwIDEgMCAtNTYgMCAyOCAyOCAwIDEgMCA1NiAwem0wLTY2LjJhMjggMjggMCAxIDAgLTU2IDAgMjggMjggMCAxIDAgNTYgMHpNMzYwIDQyOGEyOCAyOCAwIDEgMCAtNTYgMCAyOCAyOCAwIDEgMCA1NiAwem0wLTY2LjJhMjggMjggMCAxIDAgLTU2IDAgMjggMjggMCAxIDAgNTYgMHptMC02Ni4yYTI4IDI4IDAgMSAwIC01NiAwIDI4IDI4IDAgMSAwIDU2IDB6TTM4NCAyNTZjLTQuOC0yMi4zLTcuNC0zNi45LTE2LTU2LTM4LjgtMTkuOS05MC41LTMyLTE0NC0zMlMxMTguOCAxODAuMSA4MCAyMDBjLTguOCAxOS41LTExLjIgMzMuOS0xNiA1NiA0Mi4yLTcuOSA5OC43LTE0LjggMTYwLTE0LjhzMTE3LjggNi45IDE2MCAxNC44eiJdCiAgICB9OwogICAgZmFDcmVhdGl2ZUNvbW1vbnNTYW1wbGluZ1BsdXMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY3JlYXRpdmUtY29tbW9ucy1zYW1wbGluZy1wbHVzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0ZjEiLCAiTTI1NS42IDhDMzk3LjQgOCA1MDQgMTE4LjEgNTA0IDI1NiA1MDQgNDAzLjEgMzg1LjUgNTA0IDI1NS42IDUwNCAxMjEuNiA1MDQgOCAzOTQuNSA4IDI1NiA4IDEyMy4xIDExMi43IDggMjU1LjYgOHptLjggNDQuN2MtMTE4LjIgMC0yMDMuNyA5Ny45LTIwMy43IDIwMy4zIDAgMTA5LjggOTEuMiAyMDIuOCAyMDMuNyAyMDIuOCAxMDMuMiAwIDIwMi44LTgxLjEgMjAyLjgtMjAyLjggLjEtMTEzLjgtOTAuMi0yMDMuMy0yMDIuOC0yMDMuM3ptMTA3IDIwNS42Yy00LjcgMC05IDIuOC0xMC43IDcuMmwtNCA5LjUtMTEtOTIuOGMtMS43LTEzLjktMjItMTMuNC0yMy4xIC40bC00LjMgNTEuNC01LjItNjguOGMtMS4xLTE0LjMtMjIuMS0xNC4yLTIzLjIgMGwtMy41IDQ0LjktNS45LTk0LjNjLS45LTE0LjUtMjIuMy0xNC40LTIzLjIgMGwtNS4xIDgzLjctNC4zLTY2LjNjLS45LTE0LjQtMjIuMi0xNC40LTIzLjIgMGwtNS4zIDgwLjItNC4xLTU3Yy0xLjEtMTQuMy0yMi0xNC4zLTIzLjItLjJsLTcuNyA4OS44LTEuOC0xMi4yYy0xLjctMTEuNC0xNy4xLTEzLjYtMjItMy4zbC0xMy4yIDI3LjctNDMuOSAwIDAgMjMuMiA1MS4zIDBjNC40IDAgOC40LTIuNSAxMC40LTYuNGwxMC43IDczLjFjMiAxMy41IDIxLjkgMTMgMjMuMS0uN2wzLjgtNDMuNiA1LjcgNzguM2MxLjEgMTQuNCAyMi4zIDE0LjIgMjMuMi0uMWw0LjYtNzAuNCA0LjggNzMuM2MuOSAxNC40IDIyLjMgMTQuNCAyMy4yLS4xbDQuOS04MC41IDQuNSA3MS44Yy45IDE0LjMgMjIuMSAxNC41IDIzLjIgLjJsNC42LTU4LjYgNC45IDY0LjRjMS4xIDE0LjMgMjIgMTQuMiAyMy4xIC4xbDYuOC04MyAyLjcgMjIuM2MxLjQgMTEuOCAxNy43IDE0LjEgMjIuMyAzLjFsMTgtNDMuNCA1MC41IDAgMC0yMy4yLTU4LjQgLjN6bS03OCA1LjJsLTIxLjkgMCAwIDIxLjljMCA0LjEtMy4zIDcuNS03LjUgNy41LTQuMSAwLTcuNS0zLjMtNy41LTcuNWwwLTIxLjktMjEuOSAwYy00LjEgMC03LjUtMy4zLTcuNS03LjUgMC00LjEgMy40LTcuNSA3LjUtNy41bDIxLjkgMCAwLTIxLjljMC00LjEgMy40LTcuNSA3LjUtNy41czcuNSAzLjMgNy41IDcuNWwwIDIxLjkgMjEuOSAwYzQuMSAwIDcuNSAzLjMgNy41IDcuNSAwIDQuMS0zLjQgNy41LTcuNSA3LjV6Il0KICAgIH07CiAgICBmYVJlZGhhdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJyZWRoYXQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjdiYyIsICJNMzQxLjUgMjg1LjZjMzMuNyAwIDgyLjMtNi45IDgyLjMtNDcgLjItNi43IC45LTEuOC0yMC45LTk2LjItNC42LTE5LjEtOC43LTI3LjgtNDIuMy00NC42LTI2LjEtMTMuMy04Mi45LTM1LjQtOTkuNy0zNS40LTE1LjcgMC0yMC4yIDIwLjItMzguOSAyMC4yLTE4IDAtMzEuMy0xNS4xLTQ4LjEtMTUuMS0xNi4xIDAtMjYuNyAxMS0zNC44IDMzLjYtMjcuNSA3Ny42LTI2LjMgNzQuMy0yNi4xIDc4LjMgMCAyNC44IDk3LjYgMTA2LjEgMjI4LjUgMTA2LjF6TTQyOSAyNTQuOGM0LjcgMjIgNC43IDI0LjMgNC43IDI3LjIgMCAzNy43LTQyLjMgNTguNi05OCA1OC42LTEyNS43IC4xLTIzNS45LTczLjYtMjM1LjktMTIyLjMgMC02LjggMS40LTEzLjUgNC4xLTE5LjctNDUuMiAyLjMtMTAzLjggMTAuMy0xMDMuOCA2MiAwIDg0LjcgMjAwLjYgMTg5IDM1OS41IDE4OSAxMjEuOCAwIDE1Mi41LTU1LjEgMTUyLjUtOTguNiAwLTM0LjItMjkuNi03My04Mi45LTk2LjJ6Il0KICAgIH07CiAgICBmYVNxdWFyZVBpZWRQaXBlciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtcGllZC1waXBlciIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJwaWVkLXBpcGVyLXNxdWFyZSJdLCAiZTAxZSIsICJNMzIuMSA0MTlsLTMyIDYwLjIgLjgtMzI4Qy45IDg1LjMgNTQuMSAzMiAxMjAuMSAzMmwzMjcuMiAwQzM1NC4zIDYwLjkgMjU3LjQgMTI2LjIgMTkzLjQgMjAwLjYgMTIyLjggMjgyIDgyLjcgMzM4IDMyLjEgNDE5em00MTYtMzg3UzMwNS4zIDk4LjggMjYxLjcgMTk5LjFjLTIzLjIgNTMuNi0yOC45IDExOC4xLTcxIDE1OC42LTI4LjkgMjcuOC02OS44IDM4LjItMTA1LjMgNTYuMy0yMy4yIDEyLTY2LjQgNDAuNS04NC45IDY2bDMyOC40IDBjNjYgMCAxMTkuMy01My4zIDExOS4zLTExOS4yLS4xIDAtLjEtMzI4LjgtLjEtMzI4Ljh6Il0KICAgIH07CiAgICBmYVBpZWRQaXBlclNxdWFyZSA9IGZhU3F1YXJlUGllZFBpcGVyOwogICAgZmFXaGF0c2FwcCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ3aGF0c2FwcCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMjMyIiwgIk0zODAuOSA5Ny4xYy00MS45LTQyLTk3LjctNjUuMS0xNTctNjUuMS0xMjIuNCAwLTIyMiA5OS42LTIyMiAyMjIgMCAzOS4xIDEwLjIgNzcuMyAyOS42IDExMUwwIDQ4MCAxMTcuNyA0NDkuMWMzMi40IDE3LjcgNjguOSAyNyAxMDYuMSAyN2wuMSAwYzEyMi4zIDAgMjI0LjEtOTkuNiAyMjQuMS0yMjIgMC01OS4zLTI1LjItMTE1LTY3LjEtMTU3em0tMTU3IDM0MS42Yy0zMy4yIDAtNjUuNy04LjktOTQtMjUuN2wtNi43LTQtNjkuOCAxOC4zIDE4LjYtNjguMS00LjQtN2MtMTguNS0yOS40LTI4LjItNjMuMy0yOC4yLTk4LjIgMC0xMDEuNyA4Mi44LTE4NC41IDE4NC42LTE4NC41IDQ5LjMgMCA5NS42IDE5LjIgMTMwLjQgNTQuMXM1Ni4yIDgxLjIgNTYuMSAxMzAuNWMwIDEwMS44LTg0LjkgMTg0LjYtMTg2LjYgMTg0LjZ6TTMyNS4xIDMwMC41Yy01LjUtMi44LTMyLjgtMTYuMi0zNy45LTE4LTUuMS0xLjktOC44LTIuOC0xMi41IDIuOHMtMTQuMyAxOC0xNy42IDIxLjhjLTMuMiAzLjctNi41IDQuMi0xMiAxLjQtMzIuNi0xNi4zLTU0LTI5LjEtNzUuNS02Ni01LjctOS44IDUuNy05LjEgMTYuMy0zMC4zIDEuOC0zLjcgLjktNi45LS41LTkuN3MtMTIuNS0zMC4xLTE3LjEtNDEuMmMtNC41LTEwLjgtOS4xLTkuMy0xMi41LTkuNS0zLjItLjItNi45LS4yLTEwLjYtLjJzLTkuNyAxLjQtMTQuOCA2LjljLTUuMSA1LjYtMTkuNCAxOS0xOS40IDQ2LjNzMTkuOSA1My43IDIyLjYgNTcuNGMyLjggMy43IDM5LjEgNTkuNyA5NC44IDgzLjggMzUuMiAxNS4yIDQ5IDE2LjUgNjYuNiAxMy45IDEwLjctMS42IDMyLjgtMTMuNCAzNy40LTI2LjRzNC42LTI0LjEgMy4yLTI2LjRjLTEuMy0yLjUtNS0zLjktMTAuNS02LjZ6Il0KICAgIH07CiAgICBmYUltZGIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiaW1kYiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMmQ4IiwgIk04OS41IDMyMy42bC0zNS42IDAgMC0xMzcuNCAzNS42IDAgMCAxMzcuNHptNjYuNi03My4xbDkuMS02NC4zIDQ2LjMgMCAwIDEzNy40LTMxIDAgMC05Mi43LTEzLjQgOTIuNy0yMS4zIDAtMTMtOTAuNy0uMSA5MC43LTMxLjIgMCAwLTEzNy40IDQ2LjEgMGMuNSA4LjMgMi44IDE4LjEgNC4zIDI5LjRsNC4yIDM0Ljl6bTY3LjYgNzMuMWwwLTEzNy40IDI2LjYgMGMxNyAwIDI3IC45IDMzIDIuNCA2LjEgMS43IDEwLjcgNC4yIDEzLjkgNy45IDMuMSAzLjMgNS4xIDYuNiA1LjggMTIgLjkgNC40IDEuNCAxMy4xIDEuNCAyNi4ybDAgNDguMmMwIDEyLjMtLjcgMjAuNS0xLjkgMjQuNy0xLjEgNC4xLTMuMSA3LjQtNiA5LjctMi44IDIuNC02LjQgNC4xLTEwLjcgNS00LjIgLjgtMTAuNiAxLjMtMTkuMSAxLjNsLTQzIDB6bTM1LjUtMTEzLjlsMCA4OS40YzUuMSAwIDguMy0xIDkuNC0yLjMgMS4xLTIgMS44LTcuNiAxLjgtMTYuN2wwLTUzLjNjMC02LjItLjEtMTAuMi0uNy0xMi0uMy0xLjgtMS4yLTMtMi42LTQuNy0xLjQgMC00LjEtLjQtNy45LS40em01Ny4zIDExMy45bDAtMTM3LjQgMzQuMSAwIDAgNDMuOWMyLjktMi40IDYuMS00LjkgOS41LTYuNiAzLjYtMS41IDguOC0yLjQgMTIuOC0yLjQgNC44IDAgOC45IC44IDEyLjMgMi4yIDMuNCAxLjUgNiAzLjUgOCA2LjIgMS43IDIuNiAyLjcgNS4zIDMuMSA3LjggLjQgMi42LS4yIDgtLjIgMTYuMmwwIDM4LjZjMCA4LjIgLjIgMTQuMy0uOCAxOC40LTEuMSA0LTMuOCA3LjYtNy44IDkuNi00LjEgMy45LTguOSA1LjMtMTQuNiA1LjMtNCAwLTkuMi0uOS0xMi43LTIuNS0zLjUtMS44LTYuNy00LjUtOS42LThsLTIuMSA4LjctMzIgMHptNDUuMS0yMC43Yy43LTEuOCAxLTYgMS0xMi41bDAtMzUuNGMwLTUuNi0uMy05LjUtMS4xLTExLjItLjctMS45LTMuNy0yLjctNS44LTIuNy0yIDAtMy40IC44LTQuMSAyLjMtLjYgMS41LTEgNS40LTEgMTEuNmwwIDM2LjRjMCA2LjEgLjQgMTAgMS4yIDExLjYgLjYgMS43IDIuMSAyLjUgNC4xIDIuNSAyLjIgMCA0LjItLjggNS43LTIuNnpNNDE4LjQgMzJjMTUuNyAxLjIgMjguNyAxNS4yIDI4LjcgMzEuOWwwIDM4NC4yYzAgMTYuNC0xMS45IDMwLjQtMjguMiAzMS0uMyAwLS41IC45LS44IC45TDI5LjkgNDgwYy0uMyAwLS42LS45LS44LS4xLTE1LjctMS40LTI3LjktMTMuOC0yOS0zMC4yTDAgNjEuOEMxLjEgNDUuOSAxMy44IDMzLjEgMzAuMyAzMS4xbDM4Ny40IDBjLjIgMCAuNSAuOSAuNyAuOXpNMzAuMyA0MS4zQzE5IDQyIDEwIDUxIDkuMyA2Mi40bDAgMzg3LjNjLjQgNS40IDIuNyAxMC41IDYuNCAxNC4zIDMuOCAzLjkgOC44IDYuMyAxNC4yIDYuN2wzODguMiAwYzExLjUtMSAyMC42LTExLjYgMjAuNi0yMi42bDAtMzg0LjJjMC01LjctMi4xLTExLjMtNi0xNS41cy05LjMtNi44LTE1LTcuMmwtMzg3LjQgMHoiXQogICAgfTsKICAgIGZhUHl0aG9uID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInB5dGhvbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmM2UyIiwgIk00MzkuOCAyMDAuNWMtNy43LTMwLjktMjIuMy01NC4yLTUzLjQtNTQuMmwtNDAuMSAwIDAgNDcuNGMwIDM2LjgtMzEuMiA2Ny44LTY2LjggNjcuOGwtMTA2LjggMGMtMjkuMiAwLTUzLjQgMjUtNTMuNCA1NC4zbDAgMTAxLjhjMCAyOSAyNS4yIDQ2IDUzLjQgNTQuMyAzMy44IDkuOSA2Ni4zIDExLjcgMTA2LjggMCAyNi45LTcuOCA1My40LTIzLjUgNTMuNC01NC4zbDAtNDAuNy0xMDYuNyAwIDAtMTMuNiAxNjAuMiAwYzMxLjEgMCA0Mi42LTIxLjcgNTMuNC01NC4yIDExLjItMzMuNSAxMC43LTY1LjcgMC0xMDguNnpNMjg2LjIgNDQ0LjdhMjAuNCAyMC40IDAgMSAxIDAtNDAuNyAyMC40IDIwLjQgMCAxIDEgMCA0MC43ek0xNjcuOCAyNDguMWwxMDYuOCAwYzI5LjcgMCA1My40LTI0LjUgNTMuNC01NC4zbDAtMTAxLjljMC0yOS0yNC40LTUwLjctNTMuNC01NS42LTM1LjgtNS45LTc0LjctNS42LTEwNi44IC4xLTQ1LjIgOC01My40IDI0LjctNTMuNCA1NS42bDAgNDAuNyAxMDYuOSAwIDAgMTMuNi0xNDcgMGMtMzEuMSAwLTU4LjMgMTguNy02Ni44IDU0LjItOS44IDQwLjctMTAuMiA2Ni4xIDAgMTA4LjYgNy42IDMxLjYgMjUuNyA1NC4yIDU2LjggNTQuMmwzNi43IDAgMC00OC44YzAtMzUuMyAzMC41LTY2LjQgNjYuOC02Ni40ek0xNjEuMiA2NC43YTIwLjQgMjAuNCAwIDEgMSAwIDQwLjggMjAuNCAyMC40IDAgMSAxIDAtNDAuOHoiXQogICAgfTsKICAgIGZhQ2FzaEFwcCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjYXNoLWFwcCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlN2Q0IiwgIk00NDAuMyA5Ni45Yy05LjQtMjYuNS0zMC4zLTQ3LjQtNTYuOC01Ny0yNC4xLTcuOS00Ni4zLTcuOS05MS42LTcuOUwxNTYgMzJjLTQ0LjggMC02Ny4yIDAtOTEuMyA3LjUtMjYuNSA5LjYtNDcuNCAzMC41LTU3IDU3LTcuNyAyNC4zLTcuNyA0Ni43LTcuNyA5MS43TDAgMzIzLjhjMCA0NS4yIDAgNjcuNCA3LjUgOTEuNSA5LjYgMjYuNSAzMC41IDQ3LjQgNTcgNTcgMjQuMyA3LjcgNDYuNyA3LjcgOTEuNiA3LjdsMTM1LjcgMGM0NSAwIDY3LjQgMCA5MS42LTcuNyAyNi41LTkuNiA0Ny40LTMwLjUgNTctNTcgNy43LTI0LjMgNy43LTQ2LjcgNy43LTkxLjVsMC0xMzUuNWMwLTQ1IDAtNjcuNC03LjctOTEuNXpNMzIzLjEgMTg1LjRsLTI1LjggMjEuMWMtMi4zIDEuOS01LjUgMS41LTcuMy0uOS0xMy4yLTE2LjItMzMuNy0yNS40LTU2LjEtMjUuNC0yNSAwLTQwLjYgMTAuOS00MC42IDI2LjItLjQgMTIuOCAxMS43IDE5LjYgNDkuMSAyNy43IDQ3LjIgMTAgNjguNyAyOS43IDY4LjcgNjIuNyAwIDQxLjQtMzMuNyA3MS45LTg2LjQgNzUuM2wtNS4xIDI0LjVjLS40IDIuMy0yLjYgNC4xLTUuMSA0LjFsLTQwLjYgMGMtMy40IDAtNS44LTMuMi01LjEtNi40bDYuNC0yNy4zYy0yNi03LjUtNDcuMi0yMi01OS4zLTM5LjctMS41LTIuMy0xLjEtNS4zIDEuMS03bDI4LjItMjJjMi4zLTEuOSA1LjgtMS4zIDcuNSAxLjEgMTQuOSAyMC45IDM4IDMzLjMgNjUuNyAzMy4zIDI1IDAgNDMuOC0xMi4yIDQzLjgtMjkuNyAwLTEzLjQtOS40LTE5LjYtNDEuMi0yNi4yLTU0LjItMTEuNy03NS44LTMxLjgtNzUuOC02NC45IDAtMzguNCAzMi4yLTY3LjIgODAuOS03MWw1LjMtMjUuNGMuNC0yLjMgMi42LTQuMSA1LjEtNC4xbDM5LjkgMGMzLjIgMCA1LjggMyA1LjEgNi4ybC02LjIgMjguNGMyMC45IDYuNCAzOCAxNy45IDQ4LjcgMzIuMiAxLjcgMi4xIDEuMyA1LjMtLjkgN3oiXQogICAgfTsKICAgIGZhUGludGVyZXN0UCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwaW50ZXJlc3QtcCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMjMxIiwgIk0yMDQgNi41Yy0xMDIuNiAwLTIwNCA2OC40LTIwNCAxNzkuMSAwIDcwLjQgMzkuNiAxMTAuNCA2My42IDExMC40IDkuOSAwIDE1LjYtMjcuNiAxNS42LTM1LjQgMC05LjMtMjMuNy0yOS4xLTIzLjctNjcuOCAwLTgwLjQgNjEuMi0xMzcuNCAxNDAuNC0xMzcuNCA2OC4xIDAgMTE4LjUgMzguNyAxMTguNSAxMDkuOCAwIDUzLjEtMjEuMyAxNTIuNy05MC4zIDE1Mi43LTI0LjkgMC00Ni4yLTE4LTQ2LjItNDMuOCAwLTM3LjggMjYuNC03NC40IDI2LjQtMTEzLjQgMC02Ni4yLTkzLjktNTQuMi05My45IDI1LjggMCAxNi44IDIuMSAzNS40IDkuNiA1MC43LTEzLjggNTkuNC00MiAxNDcuOS00MiAyMDkuMSAwIDE4LjkgMi43IDM3LjUgNC41IDU2LjQgMy40IDMuOCAxLjcgMy40IDYuOSAxLjUgNTAuNC02OSA0OC42LTgyLjUgNzEuNC0xNzIuOCAxMi4zIDIzLjQgNDQuMSAzNiA2OS4zIDM2IDEwNi4yIDAgMTUzLjktMTAzLjUgMTUzLjktMTk2LjggMC05OS4zLTg1LjgtMTY0LjEtMTgwLTE2NC4xeiJdCiAgICB9OwogICAgZmFXaG1jcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJ3aG1jcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNDBkIiwgIk00NDggMTYxbDAtMjEuMy0yOC41LTguOC0yLjItMTAuNCAyMC4xLTIwLjctMTAuNC0xOS40LTI5IDcuNS03LjItNy41IDcuNS0yOC4yLTE5LjEtMTEuNi0yMS4zIDIxLTEwLjctMy4yLTctMjYuNC0yMi42IDAtNi4yIDI2LjQtMTIuMSAzLjItMTkuNy0yMS0xOS40IDExIDguMSAyNy43LTguMSA4LjQtMjguNS03LjUtMTEgMTkuMSAyMC43IDIxLTIuOSAxMC40LTI4LjUgNy44LS4zIDIxLjcgMjguOCA3LjUgMi40IDEyLjEtMjAuMSAxOS45IDEwLjQgMTguNSAyOS42LTcuNSA3LjIgOC42LTguMSAyNi45IDE5LjkgMTEuNiAxOS40LTIwLjQgMTEuNiAyLjkgNi43IDI4LjUgMjIuNiAuMyA2LjctMjguOCAxMS42LTMuNSAyMC43IDIxLjYgMjAuNC0xMi4xLTguOC0yOCA3LjgtOC4xIDI4LjggOC44IDEwLjMtMjAuMS0yMC45LTE4LjggMi4yLTEyLjEgMjkuMS03ek0zMjguOCA5Mi42YTU2LjggNTYuOCAwIDEgMSAwIDExMy42IDU2LjggNTYuOCAwIDEgMSAwLTExMy42em03Mi4zIDEzMGw0Ni45IDE0LjUgMCAzOS45LTU1LjEgMTMuNC00LjEgMjIuNyAzOC45IDM1LjMtMTkuMiAzNy45LTU0LTE2LjctMTQuNiAxNS4yIDE2LjcgNTIuNS0zOC4zIDIyLjctMzguOS00MC41LTIxLjcgNi42LTEyLjYgNTQtNDIuNC0uNS0xMi42LTUzLjYtMjEuNy01LjYtMzYuNCAzOC40LTM3LjQtMjEuNyAxNS4yLTUwLjUtMTMuNy0xNi4xLTU1LjUgMTQuMS0xOS43LTM0LjggMzcuOS0zNy40LTQuOC0yMi44LTU0LTE0LjEgLjUtNDAuOSA1My41LTE0LjcgNS43LTE5LjctMzguOS0zOS40IDIwLjctMzUuOCA1My42IDE0LjEgMTUuMi0xNS43LTE1LjItNTIgMzYuNC0yMC43IDM2LjggMzkuNCAyMi43LTYuMSAxMS42LTUyIDQyLjQgMCAxMS42IDQ1LjktMjIuNi01LjktNi4zLTEuNy0zLjMgNS43LTExIDE5LjEtMy4zIDUuNiA0LjYgNC42IDE3LjIgMTcuNC0uMyAxLTIzLjggNi41LTYuMiAxLjdjMCAzLjItLjEgOS42LS4zIDE5LjMtNDcuNSAxMC40LTgzLjMgNTIuOC04My4zIDEwMy41IDAgNTguMyA0Ny4zIDEwNS43IDEwNS43IDEwNS43IDUwLjUgMCA5Mi43LTM1LjQgMTAzLjItODIuOCA5LjkgLjEgMTYuNiAuMiAyMC4xIC4zbDEuNi02LjcgNS42LTI0IDEuOS0uNiAxNy4xIDE3LjggNC43IDQuOSA1LjgtMy40IDIwLjQtMTIuMSA1LjgtMy41LTItNi41LTYuOC0yMS4yeiJdCiAgICB9OwogICAgZmFKb2dldCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJqb2dldCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmM2I3IiwgIk0zODYuMSA0NUMzNDUuNiAxOS45IDMwMC42IDggMjU2LjIgOCAxNzMgOCA5MS44IDQ5LjkgNDQuOSAxMjUuOS0yNyAyNDIuNSA5LjMgMzk1LjIgMTI1LjkgNDY3LjFzMjY5LjMgMzUuNiAzNDEuMi04MC45QzUzOSAyNjkuNiA1MDIuNyAxMTYuOCAzODYuMSA0NXptNTEuOCAzMjMuMmMtNDAuNCA2NS41LTExMC40IDEwMS41LTE4MiAxMDEuNS02LjggMC0xMy42LS40LTIwLjQtMS05LTEzLjYtMTkuOS0zMy4zLTIzLjctNDIuNC01LjctMTMuNy0yNy4yLTQ1LjYgMzEuMi02Ny4xIDUxLjctMTkuMSAxNzYuNy0xNi41IDIwOC44LTE3LjYtNCA5LTguNiAxNy45LTEzLjkgMjYuNnpNMjM3LjEgMjgxLjljLTU1LjUtMS40LTgxLjctMjAuOC01OC41LTQ4LjJzNTEuMS00MC43IDY4LjktNTEuMmMxNy45LTEwLjUgMjcuMy0zMy43LTIzLjYtMjkuNy0xMjguNiA4LjctMTY3LjMgOTkuMy0xNzguMyAxNDAuMi04LjgtNDkuNy0uMS0xMDIuNyAyOC41LTE0OS4xIDYxLjktMTAwLjUgMTkzLjUtMTMxLjcgMjk0LTY5LjggNzQuOCA0Ni4xIDExMS4yIDEzMC45IDk5LjMgMjEyLjctMjQuOS0uNS0xNzkuMy0zLjYtMjMwLjMtNC45em0xODMuOC01NC44Yy0yMi43LTYtNTcgMTEuMy04Ni43IDI3LjItMjkuNyAxNS44LTMxLjEgOC4yLTMxLjEgOC4yczQwLjItMjguMSA1MC43LTM0LjUgMzEuOS0xNCAxMy40LTI0LjZjLTMuMi0xLjgtNi43LTIuNy0xMC40LTIuNy0xNy44IDAtNDEuNSAxOC43LTY3LjUgMzUuNi0zMS41IDIwLjUtNjUuMyAzMS4zLTY1LjMgMzEuM0wzOTMuNSAyNjYgNDQwIDI0Mi42czMuNi05LjUtMTkuMS0xNS41eiJdCiAgICB9OwogICAgZmFTcXVhcmVZb3V0dWJlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS15b3V0dWJlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbNjE3OTgsICJ5b3V0dWJlLXNxdWFyZSJdLCAiZjQzMSIsICJNMjgyIDI1Ni4ybC05NS4yLTU0LjEgMCAxMDguMiA5NS4yLTU0LjF6TTM4NCAzMkw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0em0xNC40IDEzNi4xYzcuNiAyOC42IDcuNiA4OC4yIDcuNiA4OC4yczAgNTkuNi03LjYgODguMWMtNC4yIDE1LjgtMTYuNSAyNy43LTMyLjIgMzEuOS0yOC4zIDcuNy0xNDIuMiA3LjctMTQyLjIgNy43cy0xMTMuOSAwLTE0Mi4yLTcuNmMtMTUuNy00LjItMjgtMTYuMS0zMi4yLTMxLjktNy42LTI4LjYtNy42LTg4LjItNy42LTg4LjJzMC01OS43IDcuNi04OC4yYzQuMi0xNS44IDE2LjUtMjguMiAzMi4yLTMyLjQgMjguMy03LjcgMTQyLjItNy43IDE0Mi4yLTcuN3MxMTMuOSAwIDE0Mi4yIDcuN2MxNS43IDQuMiAyOCAxNi42IDMyLjIgMzIuNHoiXQogICAgfTsKICAgIGZhWW91dHViZVNxdWFyZSA9IGZhU3F1YXJlWW91dHViZTsKICAgIGZhQXRsYXNzaWFuID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImF0bGFzc2lhbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNzdiIiwgIk0xNTIuMiAyMzYuNGMtNy43LTguMi0xOS43LTcuNy0yNC44IDIuOEwxLjYgNDkwLjJjLTUgMTAgMi40IDIxLjcgMTMuNCAyMS43bDE3NSAwYzUuOCAuMSAxMS0zLjIgMTMuNC04LjQgMzcuOS03Ny44IDE1LjEtMTk2LjMtNTEuMi0yNjcuMXpNMjQ0LjQgOC4xYy0xMjIuMyAxOTMuNC04LjUgMzQ4LjYgNjUgNDk1LjUgMi41IDUuMSA3LjcgOC40IDEzLjQgOC40TDQ5NyA1MTJjMTEuMiAwIDE4LjQtMTEuOCAxMy40LTIxLjcgMCAwLTIzNC41LTQ3MC42LTI0MC40LTQ4Mi4zLTUuMy0xMC42LTE4LjgtMTAuOC0yNS42IC4xeiJdCiAgICB9OwogICAgZmFQaWVkUGlwZXJIYXQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicGllZC1waXBlci1oYXQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjRlNSIsICJNNjQwIDI0LjljLTgwLjggNTMuNi04OS40IDkyLjUtOTYuNCAxMDQuNC02LjcgMTIuMi0xMS43IDYwLjMtMjMuMyA4My42LTExLjcgMjMuNi01NC4yIDQyLjItNjYuMSA1MC0xMS43IDcuOC0yOC4zIDM4LjEtNDEuOSA2NC4yLTEwOC4xLTQuNC0xNjcuNCAzOC44LTI1OS4yIDkzLjYgMjkuNC05LjcgNDMuMy0xNi43IDQzLjMtMTYuNyA5NC4yLTM2IDEzOS4zLTY4LjMgMjgxLjEtNDkuMiAxLjEgMCAxLjkgLjYgMi44IC44IDMuOSAyLjIgNS4zIDYuOSAzLjEgMTAuOGwtNTMuOSA5NS44Yy0yLjUgNC43LTcuOCA3LjItMTMuMSA2LjEtMTI2LjgtMjMuOC0yMjYuOSAxNy4zLTMxOC45IDE4LjYtNzMuNCAxLjEtOTcuNS0zMy41LTk3LjUtMzUuMSAwLTEuMSAuNi0xLjcgMS43LTEuNyAwIDAgMzguMyAwIDEwMy4xLTE1LjMgNzMuNi0xNDAuMyAxMzkuMi0xODkuNCAyMTAuNi0xODkuNCAwIDAgNzEuNyAwIDkwLjYgNjEuOSAyMi44LTM5LjcgMjguMy00OS4yIDI4LjMtNDkuMiA1LjMtOS40IDM1LTc3LjIgODYuNC0xNDEuNCA1MS41LTY0IDkwLjQtNzkuOSAxMTkuMy05MS44eiJdCiAgICB9OwogICAgZmFJbnRlcm5ldEV4cGxvcmVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImludGVybmV0LWV4cGxvcmVyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyNmIiLCAiTTQ4My4xIDE1OS43YzEwLjktMjQuNiAyMS40LTYwLjQgMjEuNC04Ny45IDAtNzIuNy03OS42LTk4LjQtMjA5LjctMzguNi0xMDcuNi03LjItMjExLjIgNzMuNy0yMzcuMSAxODYuNSAzMC45LTM0LjkgNzguMy04Mi4zIDEyMi0xMDEuMi01NC4zIDQ4LjMtMTAwLjYgMTA5LjQtMTM1LjcgMTczLjItMjAuNyAzNy45LTQ0IDk5LjItNDQgMTQ1IDAgOTguNiA5Mi45IDg2LjUgMTgwLjMgNDIgMzEuNCAxNS40IDY2LjYgMTUuNiAxMDEuNyAxNS42IDk3LjEgMCAxODQuMi01NC4zIDIxNi44LTE0NmwtMTIwLjggMGMtNTIuNSA4OC42LTE5Ni44IDUzLTE5Ni44LTQ3LjRsMzI4LjggMGM2LjQtNDMuNi0xLjctOTUuNy0yNi45LTE0MS4yek02NC42IDM0Ni45QzgyLjMgMzk4IDExOC4zIDQ0Mi43IDE2NC44IDQ3MC4yIDc2LjEgNTE5LjEtOC40IDQ5OS4zIDY0LjYgMzQ2Ljl6TTE4MC41IDIzOGMyLTU1LjIgNTAuMy05NC45IDEwNC05NC45IDUzLjQgMCAxMDIgMzkuNyAxMDQgOTQuOWwtMjA4IDB6TTM2NS4xIDUwLjRjMjEuNC0xMC4zIDQ4LjYtMjIgNzIuNi0yMiAzMS40IDAgNTQuMyAyMS43IDU0LjMgNTMuNyAwIDIwLTcuNCA0OS0xNC42IDY3LjktMjYuMy00Mi4zLTY2LTgxLjYtMTEyLjMtOTkuNnoiXQogICAgfTsKICAgIGZhQWlyYm5iID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImFpcmJuYiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmODM0IiwgIk0yMjQuNSAzNzMuMWMtMjUuMi0zMS43LTQwLjEtNTkuNC00NS04My4yLTIyLjUtODggMTEyLjYtODggOTAuMSAwLTUuNCAyNC4yLTIwLjMgNTItNDUgODMuMmwtLjEgMHptMTM4LjIgNzMuMmMtNDIuMSAxOC4zLTgzLjctMTAuOS0xMTkuMy01MC41IDEwMy45LTEzMC4xIDQ2LjEtMjAwLTE4LjgtMjAwLTU0LjkgMC04NS4yIDQ2LjUtNzMuMyAxMDAuNSA2LjkgMjkuMiAyNS4yIDYyLjQgNTQuNCA5OS41LTMyLjUgMzYtNjAuNSA1Mi43LTg1LjIgNTQuOS01MCA3LjQtODkuMS00MS4xLTcxLjMtOTEuMSAxNS4xLTM5LjIgMTExLjctMjMxLjIgMTE1LjktMjQxLjYgMTUuOC0zMC4xIDI1LjYtNTcuNCA1OS40LTU3LjQgMzIuMyAwIDQzLjQgMjUuOSA2MC40IDU5LjkgMzYgNzAuNiA4OS40IDE3Ny41IDExNC44IDIzOS4xIDEzLjIgMzMuMS0xLjQgNzEuMy0zNyA4Ni42em00Ny0xMzYuMWMtMTI4LjktMjc0LjMtMTM2LTI3OC4yLTE4NS4xLTI3OC4yLTQ1LjUgMC02NC45IDMxLjctODQuNyA3Mi44LTEwNi4yIDIxMi4zLTExNi40IDI0Mi40LTExNy4zIDI0NS0yNS4yIDY5LjMgMjYuNyAxMzAuMiA4OS42IDEzMC4yIDIxLjcgMCA2MC42LTYuMSAxMTIuNC02Mi40IDU4LjcgNjMuOCAxMDEuMyA2Mi40IDExMi40IDYyLjQgNjIuOSAuMSAxMTQuOS02MC45IDg5LjYtMTMwLjIgMC0zLjktMTYuOC0zOC45LTE2LjgtMzkuNmwwIDB6Il0KICAgIH07CiAgICBmYUpzID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImpzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzYjgiLCAiTTAgMzJsMCA0NDggNDQ4IDAgMC00NDgtNDQ4IDB6TTI0My44IDM4MS40YzAgNDMuNi0yNS42IDYzLjUtNjIuOSA2My41LTMzLjcgMC01My4yLTE3LjQtNjMuMi0zOC41TDE1MiAzODUuN2M2LjYgMTEuNyAxMi42IDIxLjYgMjcuMSAyMS42IDEzLjggMCAyMi42LTUuNCAyMi42LTI2LjVsMC0xNDMuMSA0Mi4xIDAgMCAxNDMuN3ptOTkuNiA2My41Yy0zOS4xIDAtNjQuNC0xOC42LTc2LjctNDNMMzAxIDM4Mi4xYzkgMTQuNyAyMC44IDI1LjYgNDEuNSAyNS42IDE3LjQgMCAyOC42LTguNyAyOC42LTIwLjggMC0xNC40LTExLjQtMTkuNS0zMC43LTI4bC0xMC41LTQuNWMtMzAuNC0xMi45LTUwLjUtMjkuMi01MC41LTYzLjUgMC0zMS42IDI0LjEtNTUuNiA2MS42LTU1LjYgMjYuOCAwIDQ2IDkuMyA1OS44IDMzLjdMMzY4IDI5MGMtNy4yLTEyLjktMTUtMTgtMjcuMS0xOC0xMi4zIDAtMjAuMSA3LjgtMjAuMSAxOCAwIDEyLjYgNy44IDE3LjcgMjUuOSAyNS42bDEwLjUgNC41YzM1LjggMTUuMyA1NS45IDMxIDU1LjkgNjYuMiAwIDM3LjgtMjkuOCA1OC42LTY5LjcgNTguNnoiXQogICAgfTsKICAgIGZhUXVpbnNjYXBlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInF1aW5zY2FwZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNDU5IiwgIk0zMTMuNyA0NzQuNmwtMSAwYy00MS45IDAtODIuMS0xNi43LTExMS44LTQ2LjNzLTQ2LjMtNjkuOS00Ni4zLTExMS44IDE2LjctODIuMSA0Ni4zLTExMS44IDY5LjktNDYuMyAxMTEuOC00Ni4zYzk0LjkgMCAxNjguMiA4My4xIDE1NyAxNzYuNiA0IDUuMSA4LjIgOS42IDExLjIgMTUuMyAxMy40LTMwLjMgMjAuMy02Mi40IDIwLjMtOTcuNyAwLTEzNS4xLTEwOS41LTI0NC42LTI0NC42LTI0NC42UzEyLjEgMTE3LjUgMTIuMSAyNTIuNiAxMjEuNiA0OTcuMiAyNTYuNiA0OTcuMmMyMy44IC4yIDQ3LjYtMy4yIDcwLjQtMTAuMS01LjItMy41LTguOS04LjEtMTMuMy0xMi41em03OC4zLTE2OWE5OS4yIDk5LjIgMCAxIDAgMCAxOTguNCA5OS4yIDk5LjIgMCAxIDAgMC0xOTguNHoiXQogICAgfTsKICAgIGZhQWR2ZXJzYWwgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYWR2ZXJzYWwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjM2YSIsICJNNDgyLjEgMzJMMjguNyAzMkM1LjggMzIgMCAzNy45IDAgNjAuOUwwIDQ1MS4xQzAgNDc0LjQgNS44IDQ4MCAyOC43IDQ4MGw0NTMuNCAwYzI0LjQgMCAyOS45LTUuMiAyOS45LTI5LjdsMC0zODguMWMwLTI0LjYtNS40LTMwLjItMjkuOS0zMC4yek0xNzguNCAyMjAuM2MtMjcuNS0yMC4yLTcyLjEtOC43LTg0LjIgMjMuNC00LjMgMTEuMS05LjMgOS41LTE3LjUgOC4zLTkuNy0xLjUtMTcuMi0zLjItMjIuNS01LjUtMjguOC0xMS40IDguNi01NS4zIDI0LjktNjQuMyA0MS4xLTIxLjQgODMuNC0yMi4yIDEyNS4zLTQuOCA0MC45IDE2LjggMzQuNSA1OS4yIDM0LjUgMTI4LjUgMi43IDI1LjgtNC4zIDU4LjMgOS4zIDg4LjggMS45IDQuNCAuNCA3LjktMi43IDEwLjctOC40IDYuNy0zOS4zIDIuMi00Ni42LTcuNC0xLjktMi4yLTEuOC0zLjYtMy45LTYuMi0zLjYtMy45LTcuMy0yLjItMTEuOSAxLTU3LjQgMzYuNC0xNDAuMyAyMS40LTE0Ny00My4zLTMuMS0yOS4zIDEyLjQtNTcuMSAzOS42LTcxIDM4LjItMTkuNSAxMTIuMi0xMS44IDExNC0zMC45IDEuMS0xMC4yLTEuOS0yMC4xLTExLjMtMjcuM3ptMjg2LjcgMjIyYzAgMTUuMS0xMS4xIDkuOS0xNy44IDkuOWwtMzk0LjkgMGMtNy40IDAtMTguMiA0LjgtMTcuOC0xMC43IC40LTEzLjkgMTAuNS05LjEgMTcuMS05LjEgMTMyLjMtLjQgMjY0LjUtLjQgMzk2LjggMCA2LjggMCAxNi42LTQuNCAxNi42IDkuOXptMy44LTM0MC41bDAgMjkxYzAgNS43LS43IDEzLjktOC4xIDEzLjktMTIuNC0uNC0yNy41IDcuMS0zNi4xLTUuNi01LjgtOC43LTcuOC00LTEyLjQtMS4yLTUzLjQgMjkuNy0xMjguMSA3LjEtMTQ0LjQtODUuMi02LjEtMzMuNC0uNy02Ny4xIDE1LjctMTAwIDExLjgtMjMuOSA1Ni45LTc2LjEgMTM2LjEtMzAuNWwwLTcxYzAtMjYuMi0uMS0yNi4yIDI2LTI2LjIgMy4xIDAgNi42IC40IDkuNyAwIDEwLjEtLjggMTMuNiA0LjQgMTMuNiAxNC4zLS4xIC4yLS4xIC4zLS4xIC41ek00MTcuNCAzMzQuMWMtMTkuNSA0Ny42LTcyLjkgNDMuMy05MCA1LjItMTUuMS0zMy4zLTE1LjUtNjguMiAuNC0xMDEuNSAxNi4zLTM0LjEgNTkuNy0zNS43IDgxLjUtNC44IDIwLjYgMjguOCAxNC45IDg0LjYgOC4xIDEwMS4xek0xMjIuNiAzNjkuNGMtNy41LTEuMy0zMy0zLjMtMzMuNy0yNy44LS40LTEzLjkgNy44LTIzIDE5LjgtMjUuOCAyNC40LTUuOSA0OS4zLTkuOSA3My43LTE0LjcgOC45LTIgNy40IDQuNCA3LjggOS41IDEuNCAzMy0yNi4xIDU5LjItNjcuNiA1OC44eiJdCiAgICB9OwogICAgZmFDcmVhdGl2ZUNvbW1vbnMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY3JlYXRpdmUtY29tbW9ucyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjVlIiwgIk0yNTMuOCAyMTQuOWwtMzMuMiAxNy4zYy05LjQtMTkuNi0yNS4yLTE5LjktMjcuNS0xOS45LTIyLjEgMC0zMy4yIDE0LjYtMzMuMiA0My44IDAgMjMuNiA5LjIgNDMuOCAzMy4yIDQzLjggMTQuNSAwIDI0LjYtNy4xIDMwLjYtMjEuM2wzMC42IDE1LjVjLTYuMiAxMS41LTI1LjcgMzktNjUuMSAzOS0yMi42IDAtNzQtMTAuMy03NC03NyAwLTU4LjcgNDMtNzcuMSA3Mi42LTc3LjEgMzAuNyAwIDUyLjcgMTEuOSA2NiAzNS45em0xNDMgMGwtMzIuOCAxNy4zYy05LjUtMTkuOC0yNS43LTE5LjktMjcuOS0xOS45LTIyLjEgMC0zMy4yIDE0LjYtMzMuMiA0My44IDAgMjMuNSA5LjIgNDMuOCAzMy4yIDQzLjggMTQuNCAwIDI0LjYtNy4xIDMwLjUtMjEuM2wzMSAxNS41Yy0yLjEgMy44LTIxLjQgMzktNjUuMSAzOS0yMi43IDAtNzQtOS45LTc0LTc3IDAtNTguNyA0My03Ny4xIDcyLjYtNzcuMSAzMC43IDAgNTIuNiAxMS45IDY1LjYgMzUuOXpNMjU1LjYgOEMxMTIuNyA4IDggMTIzLjEgOCAyNTYuMSA4IDM5NC41IDEyMS42IDUwNC4xIDI1NS42IDUwNC4xIDM4NS41IDUwNC4xIDUwNCA0MDMuMiA1MDQgMjU2LjEgNTA0IDExOC4yIDM5Ny40IDggMjU1LjYgOHptLjkgNDUwLjhjLTExMi41IDAtMjAzLjctOTMtMjAzLjctMjAyLjggMC0xMDUuNCA4NS40LTIwMy4zIDIwMy43LTIwMy4zIDExMi41IDAgMjAyLjggODkuNSAyMDIuOCAyMDMuMyAwIDEyMS43LTk5LjcgMjAyLjgtMjAyLjggMjAyLjh6Il0KICAgIH07CiAgICBmYU5vdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJub3Rpb24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTdkOSIsICJNOTQuOSAxMDAuMmMxNC45IDEyLjEgMjAuNSAxMS4yIDQ4LjYgOS4zTDQwNy44IDkzLjZjNS42IDAgLjktNS42LS45LTYuNUwzNjIuOSA1NS40Yy04LjQtNi41LTE5LjYtMTQtNDEuMS0xMi4xTDY1LjkgNjEuOWMtOS4zIC45LTExLjIgNS42LTcuNSA5LjNsMzYuNCAyOC45em0xNS45IDYxLjZsMCAyNzguMWMwIDE0LjkgNy41IDIwLjUgMjQuMyAxOS42bDI5MC41LTE2LjhjMTYuOC0uOSAxOC43LTExLjIgMTguNy0yMy4zbDAtMjc2LjJjMC0xMi4xLTQuNy0xOC43LTE1LTE3LjdMMTI1LjcgMTQzLjFjLTExLjIgLjktMTQuOSA2LjUtMTQuOSAxOC43em0yODYuNyAxNC45YzEuOSA4LjQgMCAxNi44LTguNCAxNy44bC0xNCAyLjggMCAyMDUuM2MtMTIuMiA2LjUtMjMuNCAxMC4zLTMyLjcgMTAuMy0xNSAwLTE4LjctNC43LTI5LjktMTguN2wtOTEuNS0xNDMuNyAwIDEzOSAyOSA2LjVzMCAxNi44LTIzLjQgMTYuOGwtNjQuNCAzLjdjLTEuOS0zLjcgMC0xMy4xIDYuNS0xNC45bDE2LjgtNC43IDAtMTgzLjgtMjMuMy0xLjljLTEuOS04LjQgMi44LTIwLjUgMTUuOS0yMS41bDY5LjEtNC43IDk1LjMgMTQ1LjYgMC0xMjguOC0yNC4zLTIuOGMtMS45LTEwLjMgNS42LTE3LjcgMTQuOS0xOC43bDY0LjUtMy44ek00NC40IDM2LjdMMzEwLjYgMTcuMWMzMi43LTIuOCA0MS4xLS45IDYxLjYgMTRsODUgNTkuN2MxNCAxMC4zIDE4LjcgMTMuMSAxOC43IDI0LjNsMCAzMjcuNmMwIDIwLjUtNy41IDMyLjctMzMuNiAzNC41TDEzMy4yIDQ5NS44Yy0xOS42IC45LTI5LTEuOS0zOS4yLTE0LjlMMzEuNCAzOTkuN2MtMTEuMi0xNC45LTE1LjktMjYuMS0xNS45LTM5LjJsMC0yOTEuMmMwLTE2LjggNy41LTMwLjggMjguOS0zMi43eiJdCiAgICB9OwogICAgZmFDaHJvbWVjYXN0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImNocm9tZWNhc3QiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjgzOCIsICJNNDQ4IDY0TDY0LjIgNjRjLTIzLjYgMC00Mi43IDE5LjEtNDIuNyA0Mi43bDAgNjMuOSA0Mi43IDAgMC02My45IDM4My44IDAgMCAyOTguNi0xNDkuMiAwIDAgNDIuNyAxNDkuNCAwYzIzLjYgMCA0Mi43LTE5LjEgNDIuNy00Mi43bDAtMjk4LjZDNDkwLjkgODMuMSA0NzEuNiA2NCA0NDggNjR6TTIxLjUgMzgzLjZsMCA2My45IDYzLjkgMGMwLTM1LjMtMjguNi02My45LTYzLjktNjMuOXptMC04NWwwIDQyLjRjNTguOSAwIDEwNi42IDQ4LjEgMTA2LjYgMTA3bDQyLjcgMGMuMS04Mi40LTY2LjktMTQ5LjMtMTQ5LjMtMTQ5LjR6TTIxMy42IDQ0OGw0Mi43IDBDMjU1LjggMzE4LjUgMTUxIDIxMy43IDIxLjUgMjEzLjRsMCA0Mi40YzEwNi0uMiAxOTIgODYuMiAxOTIuMSAxOTIuMnoiXQogICAgfTsKICAgIGZhVWx0cmFseXRpY3NIdWIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidWx0cmFseXRpY3MtaHViIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU4NmUiLCAiTTEzMC40IDE2YzYwLjkgMCAxMTAuNCA0OS41IDExMC40IDExMC40bDAgMjQuOWM0LjgtLjcgOS43LTEgMTQuNi0xIDg4LjEtLjIgMTY1LjEgNDkgMjA1LjQgMTIxLjItMjIuOC0xNi4yLTUwLjctMjUuNC04MC40LTI1LjMtNzcuMSAuMi0xMzkuNSA2Mi42LTEzOS42IDEzOS40LS4xIDYwLjktNDkuNSAxMTAuMy0xMTAuNyAxMTAuNS02MC42IC4yLTExMC4yLTQ5LjUtMTEwLjItMTEwLjUgLjItMi42IDAgMCAuMS0zLjJsMC0yNTZDMjAuMSA2NS41IDY5LjUgMTYgMTMwLjQgMTZ6TTM4MC4zIDQ5NmExMTAuNCAxMTAuNCAwIDEgMSAwLTIyMC45IDExMC40IDExMC40IDAgMSAxIDAgMjIwLjl6Il0KICAgIH07CiAgICBmYVdpa2lwZWRpYVcgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAid2lraXBlZGlhLXciLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjI2NiIsICJNNjQwIDUxLjJsLS4zIDEyLjJjLTI4LjEgLjgtNDUgMTUuOC01NS44IDQwLjMtMjUgNTcuOC0xMDMuMyAyNDAtMTU1LjMgMzU4LjZsLTEzLjYgMC04MS45LTE5My4xYy0zMi41IDYzLjYtNjguMyAxMzAtOTkuMiAxOTMuMS0uMyAuMy0xNSAwLTE1LS4zLTQ2LjktMTA5LjctOTYuMS0yMTguNi0xNDMuMS0zMjguNi0xMS40LTI2LjctNDkuNC03MC03NS42LTY5LjcgMC0zLjEtLjMtMTAtLjMtMTQuMmwxNjEuOSAwIDAgMTMuOWMtMTkuMiAxLjEtNTIuOCAxMy4zLTQzLjMgMzQuMiAyMS45IDQ5LjcgMTAzLjYgMjQwLjMgMTI1LjYgMjg4LjYgMTUtMjkuNyA1Ny44LTEwOS4yIDc1LjMtMTQyLjgtMTMuOS0yOC4zLTU4LjYtMTMzLjktNzIuOC0xNjAtOS43LTE3LjgtMzYuMS0xOS40LTU1LjgtMTkuN2wwLTEzLjkgMTQyLjUgLjMgMCAxMy4xYy0xOS40IC42LTM4LjEgNy44LTI5LjQgMjYuMSAxOC45IDQwIDMwLjYgNjguMSA0OC4xIDEwNC43IDUuNi0xMC44IDM0LjctNjkuNCA0OC4xLTEwMC44IDguOS0yMC42LTMuOS0yOC42LTM4LjYtMjkuNCAuMy0zLjYgMC0xMC4zIC4zLTEzLjYgNDQuNC0uMyAxMTEuMS0uMyAxMjMuMS0uNmwwIDEzLjZDNDYyLjQgNjQgNDM5LjEgNzYgNDI2LjggOTQuOUwzNjcuNiAyMTcuN2M2LjQgMTYuMSA2My4zIDE0Mi44IDY5LjIgMTU2LjdMNTU5LjIgOTEuOGMtOC42LTIzLjEtMzYuNC0yOC4xLTQ3LjItMjguM2wwLTEzLjkgMTI3LjggMS4xIC4yIC41eiJdCiAgICB9OwogICAgZmFTaXRyb3ggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2l0cm94IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU0NGEiLCAiTTIxMi40IDBsMCAwIDIzNS42IDAgMCAxMjgtMzg0IDBDNjQgNTcuNiAxNDEuOCAuNSAyMTIuNCAwem0yNC44IDE5MmwwIDBjNjkuOSAuNSAxNDYuNyA1Ny42IDE0Ni43IDEyOGwtMTczLjIgMCAwIDBDMTQwLjkgMzE5LjYgNjQgMjYyLjQgNjQgMTkybDE3My4zIDB6bS0xLjcgMzIwYzcwLjctLjUgMTQ4LjQtNTcuNiAxNDguNC0xMjhsLTM4NCAwIDAgMTI4IDIzNS42IDAgMCAweiJdCiAgICB9OwogICAgZmFTcXVhcmVHaXRsYWIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLWdpdGxhYiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJnaXRsYWItc3F1YXJlIl0sICJlNWFlIiwgIk0wIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZ6bTMzNy41IDEyLjVsNDQuNiAxMTYuNCAuNCAxLjJjNS42IDE2LjggNy4yIDM1LjIgMi4zIDUyLjUtNSAxNy4yLTE1LjQgMzIuNC0yOS44IDQzLjNsLS4yIC4xLTY4LjQgNTEuMi01NC4xIDQwLjljLS41IC4yLTEuMSAuNS0xLjcgLjgtMiAxLTQuNCAyLTYuNyAyLTMgMC02LjgtMS44LTguMy0yLjhsLTU0LjItNDAuOS02Ny45LTUwLjktLjQtLjMtLjItLjFjLTE0LjMtMTAuOC0yNC44LTI2LTI5LjctNDMuM3MtNC4yLTM1LjcgMi4yLTUyLjVsLjUtMS4yIDQ0LjctMTE2LjRjLjktMi4zIDIuNS00LjMgNC41LTUuNiAxLjYtMSAzLjQtMS42IDUuMi0xLjggMS4zLS43IDIuMS0uNCAzLjQgLjEgLjYgLjIgMS4yIC41IDIgLjcgMSAuNCAxLjYgLjkgMi40IDEuNSAuNiAuNCAxLjIgMSAyLjEgMS41IDEuMiAxLjQgMi4yIDMgMi43IDQuOGwyOS4yIDkyLjIgMTIyLjkgMCAzMC4yLTkyLjJjLjUtMS44IDEuNC0zLjQgMi42LTQuOHMyLjgtMi40IDQuNS0zLjFjMS43LS42IDMuNi0uOSA1LjQtLjdzMy42IC44IDUuMiAxLjhjMiAxLjMgMy43IDMuMyA0LjYgNS42eiJdCiAgICB9OwogICAgZmFHaXRsYWJTcXVhcmUgPSBmYVNxdWFyZUdpdGxhYjsKICAgIGZhU2hvZWxhY2UgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2hvZWxhY2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTYwYyIsICJNNDA1LjIgMzMxYzIuMi0xLjEgNC40LTIuMyA2LjUtMy43bDguMy00LjhjMS41LTEuMSA0LjQtMy40IDguNy02LjdsLjUtLjVjMy40LTMuNCA3LjItNSAxMS4zLTQuOSAxLjggMCAzLjkgLjUgNi40IDEuNWwzMS0yNy41Yy45LS43IDEuNy0xLjMgMi42LTEuOGwuMiAwYzMuMy0xLjkgNi0xLjggOC4yIC40IDMuOSAyLjEgNC4yIDUuNiAuOSAxMC42TDQ1Ny4yIDMyMmMuMiAuNSAuNCAxIC40IDEuNSAuNSAyLjIgLjMgNC40LS41IDYuNi0uNyAxLjUtMS44IDIuOS0zLjEgNC4yLTEuNCAxLjQtMi43IDIuOC00LjIgNC4yTDQzMSAzNTIuMmMtMS43IDEuMi0zLjQgMi4zLTUuMSAzLjMtMi4xIDEuMy00LjMgMi41LTYuNiAzLjYtMSAuNC0xLjkgLjktMi45IDEuMy01LjkgMi41LTExLjkgNC4yLTE4LjIgNS0yLjkgMjQuNS0xMS4zIDQ3LjEtMjUuMSA2Ny44LTE3LjUgMjUuNy00MS40IDQ1LjQtNzEuOCA1OC44LTMwLjIgMTMuNS02MyAyMC4yLTk4LjIgMjAuMi00OC42LS41LTg4LTExLjQtMTE4LjItMzIuOC0zNS4xLTI1LTUyLjYtNTcuOS01Mi42LTk5LjFsMC01LjZjMS4yLTI4LjEgOS41LTU0LjYgMjQuOC03OS44IDE1LjEtMjQuOSAzNy4xLTQxLjcgNjYuMS01MC41IDE0LjktNC40IDI5LjktNi42IDQ1LTYuNiAxNS41IDAgMzEuNiAyLjkgNDguMSA4LjZzMzUuMiAxNS41IDU1LjkgMjkuNWw1NC4xIDM2LjNjMTUuMSA5LjggMjguOCAxNi41IDQxLjIgMjAtMi42LTI1LjEtMTEuNy00Ni42LTI3LjMtNjQuNS0xNS43LTE4LjEtMzUuNi0zMS4zLTU5LjktMzkuN0wyNTcgMjIwYy0yMS40LTcuNS0zNy4zLTE0LjktNDcuNy0yMi4yLTI4LjItMTkuMS00My44LTQ1LjItNDctNzguNWwtLjUtOS44YzAtMzIuMSAxMy01OC45IDM5LTgwLjUgMjMtMTkuMyA1MC42LTI5IDgyLjUtMjkgMjQgMCA0NS42IDYuOSA2NC43IDIwLjggMTkuMiAxNCAzMC4xIDMzLjggMzIuNiA1OS40bC41IDEwYzAgMTguNi00LjggMzQuNS0xNC40IDQ3LjctOS44IDEzLjItMTguNSAxOS45LTI2IDE5LjktMS42LS4xLTMuMS0uMy00LjUtLjZsLTM0IDMyYy01LjUgMy05LjIgMi41LTExLjEtMS42LTEuOS0yLjItMS44LTQuOSAuNS04LjJsLjItLjJjLjUtLjcgMS4yLTEuNSAyLTIuNGwzMS42LTMwYy0uNC0xLjUtLjYtMy4xLS42LTQuOCAwLTQuMSAxLjYtNy42IDQuOS0xMC40IDEzLjgtMTIuNCAyMC44LTI2LjcgMjAuOC00Mi44IDAtMTYtNi4xLTI5LjUtMTguMi00MC40cy0yOC43LTE2LjUtNDkuNy0xNi44Yy0yNi4yIDAtNDcuOCA3LjktNjQuNyAyMy43UzE5Mi42IDg5LjkgMTkyLjYgMTEyYzAgMTcuOCA2LjkgMzMuOSAyMC42IDQ4LjMgMTMuNiAxNC4yIDM0LjYgMjUuNCA2MyAzMy41IDM5LjggMTEuNSA3MC4yIDMxIDkxLjMgNTguMyAxOC43IDI0LjIgMjkuMSA1MS4zIDMxLjMgODEuNCAyLjItLjcgNC4zLTEuNSA2LjUtMi42bC0uMSAuMXpNMjk0LjQgMTc4LjdjMCAxLjEgLjYgMS42IDEuOCAxLjYgLjEgMCA5LjctOC45IDI4LjgtMjYuNiAwLTIuNC01LjEgLjktMTUuMyAxMC0xMC4yIDkuMi0xNS4zIDE0LjItMTUuMyAxNC45bDAgLjF6bTggNi40YzAtMS0uNS0xLjUtMS41LTEuNS0xLjEgMC0yLjEgLjUtMi45IDEuNi0xLjktLjEtMy4zIC4xLTQuMiAuNy0uNCAuMi0uNSAuNS0uNSAuNyAwIC43IC41IDEuMyAxLjUgMS42bDMuMyAwYzIuOS0xLjEgNC40LTIuMiA0LjQtMy4zbC0uMSAuMnpNMzI1IDE2NS4yYzAtMi44LTEuNi0yLjgtNC45IDAtMS42IDEuNS0zLjYgMy41LTYgNi4yLS44IC42LTIuNiAyLjItNS4zIDQuOS0yLjggMi45LTQuMiA0LjctNC4yIDUuM2wuMiAxLjNjLjcgLjIgMS4yIC40IDEuNSAuNCAuMSAwIDMuMy0yLjkgOS41LTguN3M5LjMtOC45IDkuMy05LjNsLS4xLS4xem0xNTkuNyAxMjBsLTMwLjYgMjdjMS44IDEgMy4yIDIuNCA0IDQuMmwzMC4yLTI3Yy4yLTEuMiAuMS0yLjItLjUtMi45LS42LS41LTEuNi0uOS0zLjEtMS4zem0tMS42LS45bC0uNy0uNy0yNyAyMS45IDEuNiAyIDI2LTIzLjEgLjEtLjF6TTM2Ni45IDM2My45Yy04LTIuMS0xNS40LTQuNi0yMi4yLTcuNS0xNS4zLTYuMi0zNC4zLTE3LTU3LTMyLjRsLTM3LjQtMjUuM2MtMTUuOC0xMC4xLTMwLjItMTcuNi00My4yLTIyLjYtMTMuMS00LjktMjYtNy4zLTM4LjYtNy4zbC01LjUgMGMtMzIuMiAxLjctNTcuMiAxMy44LTc1IDM2LjItMTYuNiAyMC44LTI1IDQ1LjMtMjUgNzMuNiAwIDMxLjggMTIuOCA1Ni43IDM4LjIgNzQuNyAyNS40IDE4LjEgNjAuMiAyNy4xIDEwNC40IDI3LjEgMzQuNyAwIDY0LTYuMiA4Ny44LTE4LjYgMjMuNy0xMi40IDQyLjEtMjguOCA1NS4yLTQ5LjIgOS44LTE1LjUgMTUuOS0zMS44IDE4LjItNDguOGwuMSAuMXoiXQogICAgfTsKICAgIGZhT3BlbnN0cmVldG1hcCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJvcGVuc3RyZWV0bWFwIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU4NmIiLCAiTTYxIDQ5OC43Yy03LjEtMS44LTEwLjgtNC43LTI5LjYtMjMuNi0yMi41LTIyLjQtMjMuOS0yNC42LTIzLjktMzYuMyAwLTEzLTMuOS04LjQgNjcuOS04MC4zIDcyLjUtNzIuNyA2OC43LTY5LjUgODEuOS02OS41IDYuMSAwIDcuNiAuNCAxMi41IDIuOGw1LjYgMi44YzExLjctMTEuNyAyMy40LTIzLjQgMzUuMS0zNS4xbC00LjQtNi45Yy04LjYtMTMuMy0xNi42LTMyLjgtMjAuMy00OC45LTEwLjItNDUuNCAuOC05My4zIDI5LjgtMTI5LjcgNTAuMS02Mi44IDE0MC4xLTc2LjcgMjA2LjYtMzIgMzYuNSAyNC41IDYwLjMgNjIuNSA2NyAxMDcgMS40IDkuNCAxLjQgMzEuOCAwIDQxLjgtNC45IDM0LjYtMTkuNyA2NC00NC40IDg4LjctMTIuNyAxMi43LTIzIDIwLjEtMzkuMiAyOC4yLTE5LjMgOS43LTM1LjcgMTQuMy01OCAxNi4xLTMxLjcgMi42LTY2LjktNi4xLTkzLjgtMjMuNGwtNi45LTQuNGMtMTEuNyAxMS43LTIzLjQgMjMuNC0zNS4xIDM1LjFsMi44IDUuNmMyLjUgNC45IDIuOCA2LjQgMi44IDEyLjUgMCAxMy4xIDMuMSA5LjQtNjkgODEuNS01NS42IDU1LjUtNjQuMSA2My43LTY4LjQgNjUuNy01LjUgMi41LTEzLjkgMy40LTE5IDIuMXpNMzU5LjQgMjk2LjljNDAuMS03LjMgNzUuMS0zNCA5Mi43LTcwLjcgMjgtNTguNCA5LjItMTI3LTQ0LjgtMTYzLjMtMTIuOS04LjctMzAuOC0xNi00Ny43LTE5LjQtMTEuNy0yLjQtMzYuNC0yLjEtNDguNiAuNS0xOC4yIDMuOS0zNC45IDExLjEtNDkuNCAyMS40LTguOSA2LjQtMjMuNyAyMS4xLTI5LjkgMjkuOS0zNC42IDQ5LTMxLjUgMTE0LjEgNy43IDE1OS4zIDIwLjEgMjMuMiA0Ny44IDM4LjQgNzguNiA0MyAxMC4yIDEuNSAzMSAxLjIgNDEuNS0uOHptLTM1LjUtMTcuNGMtMTMuOC0yLjItMjUuNi01LjctMzUuMS0xMC41bC01LjQtMi43IDAtNDkuOS05LjUgMGMtOC4yIDAtMTkuNSAxLjYtMjcuNyA0LTEuMSAuMy0xLjUgMS42LTEuNyA0LjhsLS4zIDQuNC00LjEtNy44Yy05LTE3LjItMTIuMi0zMC43LTEyLjItNTEuNCAwLTE2IDEuMS0yMy40IDUuNi0zNi4zIDIuNC02LjggOC4yLTE4LjkgMTAuOC0yMi4zIDEuMS0xLjUgMS4yLTEuMSAxLjMgMy4zbDAgNWMxOC44LS4yIDM3LjYtLjMgNTYuNC0uNSAuMi00LjcgLjMtOS41IC41LTE0LjJsLTE5IDAgMC0zMSAzLjQtMS43YzUuNi0yLjggMTUuOS02LjcgMjEuNy04LjIgMy0uOCA2LjEtMS42IDYuOS0xLjggMS4yLS40IDEuMyAuMSAuNyAzLjMtMS4yIDYuMS0uOSAyMyAuNSAyOSAyLjggMTEuOSA5LjggMjAuNyAxOS4yIDI0LjMgNS42IDIuMSAxNi4zIDIuNiAyMi41IC45IDUuOS0xLjYgMTIuNS02LjQgMTUuOS0xMS41IDUtNy41IDYuNy0xNC4xIDcuMi0yNy4xbC40LTExLjQgNyAzLjZjOCA0LjIgMTcuOCAxMS4yIDI0LjkgMTggNC44IDQuNiA1IDQuOCA1IDkuMmwwIDQuNS0xOC45IDAgMCAxNC42IDM1IDBjMS4zIDIuNiAyLjUgNS4yIDMuOCA3LjdsLTkuNyAwYy02LjcgMC0xMi43IC42LTE5LjQgMS45bC05LjcgMS45IDAgNy4xYzAgMy45IC4yIDcuMSAuMyA3LjFzNC4xLS44IDguNy0xLjcgOC43LTEuNyA5LjEtMS43Yy40IDAgLjggMTEuMyAuOCAyNS44bDAgMjUuOGMtNi4yIC4yLTEyLjMgLjMtMTguNSAuNS0uMiA0LjctLjMgOS40LS41IDE0LjIgMTMuNSAuMiAyNyAuMyA0MC40IC41LTEgMi4zLTIgNC41LTMgNi44bC0xMC43IC4xYy05LjkgLjEtMTEuMSAuMi0xNS42IDIuNS0xMS44IDUuOC0xOC4xIDE4LjktMTguMyAzNy45bC0uMSA5LjMtNS44IDNjLTUgMi42LTIyLjYgOS0yNC45IDktLjUgMC0uOC0xMi0uOC0zMC42bDAtMzAuNi05LjQgMGMtNiAwLTEyLjQgLjYtMTcuOSAxLjctMTIuNiAyLjYtMTEuNSAxLjctMTEuNSA5LjUgMCA1IC4zIDYuOCAxLjEgNi44IC42IDAgNC42LS44IDguOC0xLjdzOC0xLjcgOC4zLTEuNyAuNiAxMSAuNiAyNC41bDAgMjQuNS03LjUtLjFjLTQuMS0uMS04LjUtLjMtOS43LS41em0tMzkuNC03MS42YzguOS0zLjkgMTUuNi0xMi45IDE4LjMtMjQuNCAxLjYtNi45IDEuNy0yMi42IDAtMzAuMi0yLjUtMTItOS42LTIxLjEtMTkuMy0yNC44LTYuOS0yLjYtMTguNC0yLjYtMjUuMyAwLTkuNyAzLjctMTYuNCAxMi44LTE5LjIgMjUuNi0xLjYgNy41LTEuNiAyMS40IDAgMjguOSAyLjYgMTIuNSAxMC41IDIyLjMgMjAuNiAyNS42IDcgMi4zIDE4LjkgMiAyNC45LS43em0tMTkuOS0xNC41Yy0zLjUtMy01LjItOC45LTUuOC0yMC42LS42LTEwLjUgLjYtMjEuMyAyLjktMjYgMi00LjMgNS44LTYuNCAxMC40LTYgNy40IC44IDEwLjMgNi41IDExLjEgMjIuNSAuOSAxNi43LTEuOSAyOC45LTcgMzEuMy0zLjkgMS44LTguNiAxLjMtMTEuNi0xLjJ6bTk0LjkgMTUuMWMxNS00LjYgMjIuOC0yMC4xIDIxLjktNDMuNS0uOC0xOS45LTcuOS0zMi4xLTIxLjUtMzcuMi01LjctMi4xLTE4LTEuOC0yNCAuNS05LjYgMy43LTE2LjQgMTIuNC0xOS4zIDI0LjctMiA4LjYtMS4zIDI4IDEuMyAzNS4yIDQgMTEuMyAxMS42IDE4LjcgMjEuNCAyMSA1LjggMS40IDE0LjQgMSAyMC4zLS44em0tMTYuNy0xNC4yYy01LTIuNy03LjMtMTMuMi02LjUtMzAuMSAuNi0xMi44IDEuNS0xNi43IDQuOC0yMC40IDQuNy01LjMgMTMuNi0zLjggMTYuNyAyLjggMy40IDcuMyA0IDMwLjEgMSA0MC4yLTEuNyA1LjctNS4yIDguOC0xMC4xIDguNy0yIDAtNC42LS42LTUuOC0xLjN6bS04NS4yIDUxLjVjLTcuMy03LjYtOS45LTExLjQtOC40LTExLjkgMi45LS45IDEzLjktMy4xIDE0LjItMi44IC4yIC4yIC4yIDQuOSAuMSAxMC40bC0uMiAxMC4xLTUuNi01Ljl6bTE1Ni40LTEuMmMuNy02IDMuMS0xMS41IDUuNy0xMy4yIDIuOS0xLjggNi40LTIuNiA4LTEuNyAxLjIgLjcgLjkgMS41LTIuNCA1LjktMi4xIDIuOC01LjYgNy03LjggOS40bC00IDQuMyAuNS00Ljd6TTQzOC40IDE2MWwuMS0zMi45IDIuNiA3LjdjNS4xIDE1LjMgNi45IDMxLjggNS4xIDQ2LjYtMS40IDExLjYtMS40IDExLjUtNC45IDExLjVsLTMgMCAuMS0zMi45ek0zNDQgMTA2LjJjLTIuNi0xLTUuMy00LjgtNi41LTktMS4yLTQtMS41LTI4LjUtLjQtMzMuNSAuNi0zIC45LTMuMiAzLjgtMy4yIDYuMiAwIDE4LjMgMiAxOC43IDMuMSAuMiAuNiAuNyA0LjkgMSA5LjUgLjcgOS43LS43IDIzLjItMi44IDI3LjYtMi40IDUuMS04LjUgNy41LTEzLjcgNS4zem0tOTQuMy0yLjRjLjQtLjggMy43LTQuNiA3LjMtOC40bDYuNS02LjljMCA1LjYgMCAxMS4yIC4xIDE2LjhsLTcuMyAwYy02LjcgMC03LjMtLjEtNi41LTEuNXptMzQuNCAzNDEuN2MtMjQtNi45LTQzLjktMTIuOS00NC4yLTEzLjEtLjUtLjYgMjQuMy04OC41IDI1LjMtODkuNiAuNS0uNSA4NS40IDIzLjMgODguOSAyNC45IDEuMiAuNi0uMSA1LjgtMTAuNiA0Mi40LTYuNiAyMy0xMi40IDQzLjItMTIuOCA0NXMtMS40IDMuMi0xLjkgMy4xLTIwLjctNS44LTQ0LjctMTIuN3pNMzQyLjggNDU2YzAtMS4xIDI0LjctODcuMyAyNS4xLTg3LjYgLjktLjcgODcuMS0yNC43IDg3LjQtMjQuNCAuNCAuNC0yNC4xIDg3LjMtMjQuNyA4Ny45LS40IC4zLTgzLjIgMjQtODUuOCAyNC41LTEuMSAuMi0xLjkgLjEtMS45LS40ek0xOTkuNiA0MTcuNWMxNy0xNy4xIDMyLjItMzIuNyAzMy43LTM0LjcgMy40LTQuNSA4LjItMTQuOCA5LjUtMjAuNSAuNS0yLjQgMS4xLTcuMSAxLjItMTAuNWwuMi02LjIgMy43LTFjMi0uNiAzLjgtLjkgNC0uNyAuNSAuNS0yNC4zIDg3LTI1LjEgODcuOC0uNCAuMy0xMy42IDQuMy0yOS40IDguOGwtMjguNyA4LjIgMzEtMzEuMXptMTY2LjktNjEuNmMtLjItLjMtLjctMi0xLjItMy43bC0uOS0zLjIgMy4yLS41YzI3LTQuNiA1NS45LTE3LjMgNzguNy0zNC41IDMuMy0yLjUgNS4xLTMuNCA1LjMtMi43IDEuMSAzLjMgNS41IDE5LjEgNS40IDE5LjMtLjcgLjctOTAuMiAyNS44LTkwLjUgMjUuNHpNNjIuOSAzMjkuOGMtMS0uOC0yMy44LTc3LjktMjUuNS04Ni40LS4zLTEuNyAzLS45IDQzLjggMTAuOCA0Mi43IDEyLjIgNDQuMiAxMi43IDQ0LjggMTQuOSAuNSAyIC4yIDIuNi0yLjUgNC41LTEuNyAxLjItMTUuNSAxNC42LTMwLjcgMjkuOHMtMjcuOCAyNy42LTI4IDI3LjYtMS4xLS41LTEuOC0xLjF6bTE2LjUtODguMmMtMjMuOS02LjktNDMuNS0xMi42LTQzLjYtMTIuNi0uMy0uMiAyNS4zLTg5LjMgMjUuOS04OS44IC40LS40IDg5LjEgMjQuNCA5MCAyNS4yIC4yIC4yLTUuNCAyMC41LTEyLjQgNDUuMS0xMS42IDQwLjctMTIuOSA0NC44LTE0LjUgNDQuNy0xIDAtMjEuMy01LjctNDUuMi0xMi42em01OS42IDEwLjhjLjItLjYgNC4zLTE0LjUgOC45LTMwLjlsOC41LTI5LjcgMS4xIDYuNWMxLjkgMTEuMiA1LjMgMjMuOSA5LjMgMzUuMSAyLjEgNS45IDMuOCAxMC45IDMuNiAxMXMtNi43IDItMTQuNSA0LjMtMTQuOSA0LjItMTUuOCA0LjVjLTEuMSAuMy0xLjUgLjEtMS4yLS43ek0xMDYgMTM5LjFjLTIzLjktNi45LTQzLjctMTIuOC00My45LTEzLjItLjgtMS4zLTI1LjEtODctMjQuNy04Ny40IC41LS41IDg2LjggMjQuMyA4Ny42IDI1LjEgLjkgMSAyNS44IDg4LjIgMjUuMSA4OC0uMyAwLTIwLjEtNS43LTQ0LTEyLjZ6bTQzLjItMzQuNUMxMzYuNSA2MCAxMzkgNjguOCAxMzcuMiA2Mi41bDM0LjEtOS43YzE4LjgtNS40IDM0LjctOS45IDM1LjQtMTAuMnMtMS42IDIuOC01LjIgNi44Yy0xOS4xIDIxLjMtMzEuNSA0NC0zOS40IDcxLjktMS41IDUuMi0yLjcgMTAuMy0yLjcgMTEuMyAwIDUuOS0yLjMtLjUtMTAuMi0yOHoiXQogICAgfTsKICAgIGZhU2VsbGNhc3QgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2VsbGNhc3QiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjJkYSIsICJNMzUzLjUgMzJMOTQuOCAzMkM0Mi43IDMyIC4xIDc0LjYgLjEgMTI2LjZsMCAyNTguN0MuMSA0MzcuNCA0Mi43IDQ4MCA5NC44IDQ4MGwyNTguNyAwYzUyLjEgMCA5NC43LTQyLjYgOTQuNy05NC42bDAtMjU4LjhjMC01Mi00Mi42LTk0LjYtOTQuNy05NC42em0tNTAgMzE2LjRjLTI3LjkgNDguMi04OS45IDY0LjktMTM4LjIgMzcuMi0yMi45IDM5LjgtNTQuOSA4LjYtNDIuMy0xMy4ybDE1LjctMjcuMmM1LjktMTAuMyAxOS4yLTEzLjkgMjkuNS03LjkgMTguNiAxMC44LS4xLS4xIDE4LjUgMTAuNyAyNy42IDE1LjkgNjMuNCA2LjMgNzkuNC0yMS4zIDE1LjktMjcuNiA2LjMtNjMuNC0yMS4zLTc5LjQtMTcuOC0xMC4yLS42LS40LTE4LjYtMTAuNi0yNC42LTE0LjItMy40LTUxLjkgMjEuNi0zNy41IDE4LjYgMTAuOC0uMS0uMSAxOC41IDEwLjcgNDguNCAyOCA2NS4xIDkwLjMgMzcuMiAxMzguNXptMjEuOC0yMDguOGMtMTcgMjkuNS0xNi4zIDI4LjgtMTkgMzEuNS02LjUgNi41LTE2LjMgOC43LTI2LjUgMy42LTE4LjYtMTAuOCAuMSAuMS0xOC41LTEwLjctMjcuNi0xNS45LTYzLjQtNi4zLTc5LjQgMjEuM3MtNi4zIDYzLjQgMjEuMyA3OS40YzAgMCAxOC41IDEwLjYgMTguNiAxMC42IDI0LjYgMTQuMiAzLjQgNTEuOS0yMS42IDM3LjUtMTguNi0xMC44IC4xIC4xLTE4LjUtMTAuNy00OC4yLTI3LjgtNjQuOS05MC4xLTM3LjEtMTM4LjQgMjcuOS00OC4yIDg5LjktNjQuOSAxMzguMi0zNy4ybDQuOC04LjRjMTQuMy0yNC45IDUyLTMuMyAzNy43IDIxLjV6Il0KICAgIH07CiAgICBmYU1peCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJtaXgiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjNjYiIsICJNMCA2NEwwIDQxMi45YzAgNTYuMiA4OCA1OC4xIDg4IDBsMC0yMzguNmM3LjktNTIuOSA4OC01MC40IDg4IDYuNWwwIDE3NS4zYzAgNTcuOSA5NiA1OCA5NiAwTDI3MiAyNDBjNS4zLTU0LjcgODgtNTIuNSA4OCA0LjNsMCAyMy44YzAgNTkuOSA4OCA1Ni42IDg4IDBMNDQ4IDY0IDAgNjR6Il0KICAgIH07CiAgICBmYUNjQXBwbGVQYXkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY2MtYXBwbGUtcGF5IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY0MTYiLCAiTTMwMi4yIDIxOC40YzAgMTcuMi0xMC41IDI3LjEtMjkgMjcuMWwtMjQuMyAwIDAtNTQuMiAyNC40IDBjMTguNCAwIDI4LjkgOS44IDI4LjkgMjcuMXpNMzQ5LjcgMjgxYzAgOC4zIDcuMiAxMy43IDE4LjUgMTMuNyAxNC40IDAgMjUuMi05LjEgMjUuMi0yMS45bDAtNy43LTIzLjUgMS41Yy0xMy4zIC45LTIwLjIgNS44LTIwLjIgMTQuNHpNNTc2IDc5bDAgMzUyYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDQ4IDQ3OWMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCA3OUMwIDUyLjUgMjEuNSAzMSA0OCAzMWw0ODAgMGMyNi41IDAgNDggMjEuNSA0OCA0OHpNMTI3LjggMTk3LjJjOC40IC43IDE2LjgtNC4yIDIyLjEtMTAuNCA1LjItNi40IDguNi0xNSA3LjctMjMuNy03LjQgLjMtMTYuNiA0LjktMjEuOSAxMS4zLTQuOCA1LjUtOC45IDE0LjQtNy45IDIyLjh6bTYwLjYgNzQuNWMtLjItLjItMTkuNi03LjYtMTkuOC0zMC0uMi0xOC43IDE1LjMtMjcuNyAxNi0yOC4yLTguOC0xMy0yMi40LTE0LjQtMjcuMS0xNC43LTEyLjItLjctMjIuNiA2LjktMjguNCA2LjktNS45IDAtMTQuNy02LjYtMjQuMy02LjQtMTIuNSAuMi0yNC4yIDcuMy0zMC41IDE4LjYtMTMuMSAyMi42LTMuNCA1NiA5LjMgNzQuNCA2LjIgOS4xIDEzLjcgMTkuMSAyMy41IDE4LjcgOS4zLS40IDEzLTYgMjQuMi02IDExLjMgMCAxNC41IDYgMjQuMyA1LjkgMTAuMi0uMiAxNi41LTkuMSAyMi44LTE4LjIgNi45LTEwLjQgOS44LTIwLjQgMTAtMjF6bTEzNS40LTUzLjRjMC0yNi42LTE4LjUtNDQuOC00NC45LTQ0LjhsLTUxLjIgMCAwIDEzNi40IDIxLjIgMCAwLTQ2LjYgMjkuMyAwYzI2LjggMCA0NS42LTE4LjQgNDUuNi00NXptOTAgMjMuN2MwLTE5LjctMTUuOC0zMi40LTQwLTMyLjQtMjIuNSAwLTM5LjEgMTIuOS0zOS43IDMwLjVsMTkuMSAwYzEuNi04LjQgOS40LTEzLjkgMjAtMTMuOSAxMyAwIDIwLjIgNiAyMC4yIDE3LjJsMCA3LjUtMjYuNCAxLjZjLTI0LjYgMS41LTM3LjkgMTEuNi0zNy45IDI5LjEgMCAxNy43IDEzLjcgMjkuNCAzMy40IDI5LjQgMTMuMyAwIDI1LjYtNi43IDMxLjItMTcuNGwuNCAwIDAgMTYuNCAxOS42IDAgMC02OCAuMSAwek01MTYgMjEwLjlsLTIxLjUgMC0yNC45IDgwLjYtLjQgMC0yNC45LTgwLjYtMjIuMyAwIDM1LjkgOTkuMy0xLjkgNmMtMy4yIDEwLjItOC41IDE0LjItMTcuOSAxNC4yLTEuNyAwLTQuOS0uMi02LjItLjNsMCAxNi40YzEuMiAuNCA2LjUgLjUgOC4xIC41IDIwLjcgMCAzMC40LTcuOSAzOC45LTMxLjhMNTE2IDIxMC45eiJdCiAgICB9OwogICAgZmFTb2xhbmEgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic29sYW5hIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU4NWUiLCAiTTUxMC41IDM4NS4ybC04NC45IDg4LjdjLTEuOCAxLjktNC4xIDMuNS02LjYgNC41cy01LjIgMS42LTcuOSAxLjZMOC45IDQ4MGMtMS45IDAtMy44LS41LTUuNC0xLjZzLTIuOS0yLjUtMy42LTQuMi0xLTMuNi0uNy01LjUgMS4yLTMuNiAyLjUtNC45bDg0LjktODguN2MxLjgtMS45IDQuMS0zLjUgNi41LTQuNXM1LjEtMS42IDcuOC0xLjZsNDAyLjQgMGMxLjkgMCAzLjggLjUgNS40IDEuNnMyLjkgMi41IDMuNiA0LjIgMSAzLjYgLjcgNS41LTEuMiAzLjYtMi41IDQuOXpNNDI1LjcgMjA2LjZjLTEuOC0xLjktNC4xLTMuNS02LjYtNC41cy01LjItMS42LTcuOS0xLjZsLTQwMi40IDBjLTEuOSAwLTMuOCAuNS01LjQgMS42cy0yLjkgMi41LTMuNiA0LjItMSAzLjYtLjcgNS41IDEuMiAzLjYgMi41IDQuOWw4NC45IDg4LjdjMS44IDEuOSA0LjEgMy41IDYuNSA0LjVzNS4xIDEuNiA3LjggMS42bDQwMi40IDBjMS45IDAgMy44LS41IDUuNC0xLjZzMi45LTIuNSAzLjYtNC4yIDEtMy42IC43LTUuNS0xLjItMy42LTIuNS00LjlsLTg0LjktODguN3pNOC45IDE0Mi45bDQwMi40IDBjMi43IDAgNS40LS41IDcuOS0xLjZzNC43LTIuNiA2LjYtNC41bDg0LjktODguN2MxLjMtMS40IDIuMi0zLjEgMi41LTQuOXMuMS0zLjctLjctNS41LTItMy4yLTMuNi00LjItMy41LTEuNi01LjQtMS42TDEwMSAzMmMtMi43IDAtNS40IC41LTcuOCAxLjZzLTQuNyAyLjYtNi41IDQuNUwxLjcgMTI2LjhjLTEuMyAxLjQtMi4yIDMuMS0yLjUgNC45cy0uMSAzLjcgLjcgNS41IDIgMy4yIDMuNiA0LjIgMy41IDEuNiA1LjQgMS42eiJdCiAgICB9OwogICAgZmFUeXBlc2NyaXB0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInR5cGVzY3JpcHQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTg0MCIsICJNMTYuOCAzMmw0MTQuNCAwYzkuMyAwIDE2LjggNy41IDE2LjggMTYuOGwwIDQxNC40YzAgOS4zLTcuNSAxNi44LTE2LjggMTYuOEwxNi44IDQ4MEM3LjUgNDgwIDAgNDcyLjUgMCA0NjMuMkwwIDQ4LjhDMCAzOS41IDcuNSAzMiAxNi44IDMyek0yNDkgMjcwLjNsMC0zNi43LTE1OS40IDAgMCAzNi43IDU2LjkgMCAwIDE2My42IDQ1LjMgMCAwLTE2My42IDU3LjIgMHptMTguMSAxNTkuM2M3LjMgMy43IDE1LjkgNi41IDI1LjkgOC40czIwLjUgMi44IDMxLjUgMi44YzEwLjggMCAyMS0xIDMwLjctMy4xczE4LjItNS40IDI1LjUtMTAuMSAxMy4xLTEwLjkgMTcuNC0xOC40IDYuNC0xNyA2LjQtMjguMmMwLTguMS0xLjItMTUuMi0zLjctMjEuM3MtNS45LTExLjUtMTAuNS0xNi4zLTEwLjEtOS0xNi41LTEyLjgtMTMuNy03LjMtMjEuNy0xMC43Yy01LjktMi40LTExLjItNC44LTE1LjktNy4xcy04LjctNC42LTExLjktNy01LjgtNC45LTcuNi03LjUtMi43LTUuNy0yLjctOWMwLTMuMSAuOC01LjggMi40LTguM3MzLjgtNC42IDYuNy02LjQgNi41LTMuMSAxMC43LTQuMSA4LjktMS41IDE0LjEtMS41YzMuNyAwIDcuNyAuMyAxMS45IC44czguNCAxLjQgMTIuNiAyLjYgOC4zIDIuNiAxMi4zIDQuNCA3LjcgMy44IDExIDYuMWwwLTQxLjhjLTYuOC0yLjYtMTQuMy00LjUtMjIuNC01LjhzLTE3LjQtMS45LTI3LjktMS45Yy0xMC43IDAtMjAuOCAxLjEtMzAuNCAzLjRzLTE4IDUuOC0yNS4yIDEwLjctMTMgMTEtMTcuMiAxOC41LTYuMyAxNi41LTYuMyAyNi45YzAgMTMuMyAzLjkgMjQuNyAxMS42IDM0LjFzMTkuNSAxNy40IDM1LjIgMjMuOWM2LjIgMi41IDExLjkgNSAxNy4zIDcuNHMxMCA0LjkgMTMuOCA3LjUgNyA1LjQgOS4yIDguNSAzLjQgNi42IDMuNCAxMC41YzAgMi45LS43IDUuNi0yLjEgOHMtMy41IDQuNi02LjQgNi40LTYuNCAzLjItMTAuNyA0LjMtOS4zIDEuNS0xNSAxLjVjLTkuNyAwLTE5LjQtMS43LTI4LjktNS4xcy0xOC40LTguNS0yNi42LTE1LjNsMCA0NC43eiJdCiAgICB9OwogICAgZmFCcmF2ZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJicmF2ZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNjNjIiwgIk0xNDUuNiAwbDE1NyAwIDQ0LjcgNTAuOHMzOS4zLTEwLjkgNTcuOCA3LjYgMzMuOCAzNC45IDMzLjggMzQuOWwtMTIgMjkuNSAxNS4zIDQzLjdzLTQ0LjkgMTcwLjItNTAuMSAxOTFjLTEwLjQgNDAuOS0xNy40IDU2LjgtNDYuOSA3Ny41cy04Mi45IDU2LjgtOTEuNiA2Mi4yYy0xLjkgMS4yLTMuOSAyLjUtNS45IDMuOS03LjUgNS4xLTE1LjggMTAuOC0yMy41IDEwLjhzLTE2LjEtNS43LTIzLjUtMTAuOGMtMi0xLjQtNC0yLjgtNS45LTMuOS04LjctNS41LTYyLjEtNDEuNS05MS42LTYyLjJzLTM2LjUtMzYuNi00Ni45LTc3LjVjLTUuMy0yMC44LTUwLjEtMTkxLTUwLjEtMTkxTDIxLjUgMTIyLjggOS4zIDkzLjNzMTUuMy0xNi40IDMzLjgtMzQuOSA1Ny44LTcuNiA1Ny44LTcuNkwxNDUuNiAwem03OC41IDQwNy42YzMuNyAwIDguOS00LjcgMTMtOC40IC42LS41IDEuMi0xLjEgMS43LTEuNSA0LjItMy43IDQ3LjgtMzcuNSA1MS0zOS44czUuNC02LjUgMS45LTguN2MtMi44LTEuNy0xMC01LjUtMjAuMy0xMC44LTMtMS42LTYuMy0zLjItOS43LTUtMTUuNC04LTM0LjUtMTQuNy0zNy41LTE0LjdzLTIyLjEgNi44LTM3LjUgMTQuN2MtMy41IDEuOC02LjcgMy41LTkuNyA1LTEwLjMgNS4zLTE3LjYgOS4xLTIwLjMgMTAuOC0zLjYgMi4yLTEuNCA2LjQgMS45IDguN3M0Ni44IDM2LjEgNTEgMzkuOGMuNSAuNSAxLjEgMSAxLjcgMS41IDQuMSAzLjcgOS4zIDguNCAxMyA4LjRsLS4yIDB6bTAtMTY1LjdjNC43IDAgMTcuNi0zIDI2LjQtNWwyLS41YzcuOC0xLjggNy4zLTYuMyA2LjQtMTMtLjEtLjgtLjItMS42LS4zLTIuNC0uNi02LjEtNS44LTMzLjEtOS4xLTUwLjMtMS4xLTUuOC0yLTEwLjUtMi40LTEyLjktMS41LTguMS0uNi05LjQgLjctMTEuMyAuMi0uMyAuNS0uNyAuNy0xLjEgMS40LTIuMyAxNi02LjIgMjcuOS05LjUgMi41LS43IDQuOC0xLjMgNi45LTEuOSAxMC42LTMgMzIuNC0uNiA0NC4yIC42IDEuOCAuMiAzLjQgLjQgNC43IC41IDkuNiAuOSAxMC40IDIuMyA3LjIgMy44LTIuMyAxLjEtMTYuMiA2LjMtMjguNyAxMC45LTQuNyAxLjgtOS4yIDMuNS0xMi44IDQuOC0xLjUgLjUtMyAxLjEtNC41IDEuNy0xMi41IDQuNi0yNy4yIDEwLTI4LjkgMTkuNC0xLjUgOC4zIDUuMiAxOS45IDExLjMgMzAuMyAxLjYgMi44IDMuMiA1LjUgNC42IDguMSA2LjMgMTEuOSA2LjUgMTMuMyA2LjEgMTguMS0uNCAzLjktMTQuNSAxMi43LTIyLjQgMTcuNi0xLjggMS4xLTMuMyAyLjEtNC4yIDIuNy0uOCAuNS0yLjEgMS40LTMuOCAyLjQtOC42IDUuMi0yNi4zIDE2LTI2LjMgMjIuNSAwIDcuOCAyNC42IDI4LjEgMzIuNCAzMy4yczI4LjkgMTYuMSAzNy45IDE3LjggMjMtOC41IDMxLjItMjMuOGM3LjctMTQuNCAxLjctMjguNS0zLjItNDBsLS45LTIuMmMtNC41LTEwLjYgMS45LTE3IDYuMi0yMS4zIC41LS41IDEtMSAxLjQtMS40bDQzLTQ1LjdjMS4zLTEuMyAyLjUtMi42IDMuNy0zLjggNS44LTUuNyAxMC44LTEwLjUgMTAuOC0yMi44IDAtMTQuOS01Ny41LTg0LjUtNTcuNS04NC41cy00OC41IDkuMy01NS4xIDkuM2MtNS4yIDAtMTUuMy0zLjUtMjUuOC03LjEtMi43LS45LTUuNC0xLjktOC0yLjctMTMtNC4zLTIxLjgtNC40LTIxLjgtNC40cy04LjcgMC0yMS44IDQuNGMtMi43IC45LTUuNCAxLjgtOCAyLjctMTAuNSAzLjYtMjAuNiA3LjEtMjUuOCA3LjEtNi41IDAtNTUuMS05LjMtNTUuMS05LjNzLTU3LjUgNjkuNi01Ny41IDg0LjVjMCAxMi4zIDQuOSAxNy4xIDEwLjggMjIuOCAxLjIgMS4yIDIuNSAyLjQgMy43IDMuOGw0My4xIDQ1LjhjLjQgLjUgLjkgLjkgMS40IDEuNCA0LjMgNC4zIDEwLjYgMTAuNyA2LjIgMjEuM2wtLjkgMi4yYy00LjkgMTEuNS0xMSAyNS42LTMuMiA0MCA4LjIgMTUuMyAyMi4yIDI1LjUgMzEuMiAyMy44czMwLjEtMTIuNyAzNy45LTE3LjggMzIuNC0yNS40IDMyLjQtMzMuMmMwLTYuNS0xNy43LTE3LjMtMjYuMy0yMi41LTEuNy0xLTMuMS0xLjktMy44LTIuNC0uOS0uNi0yLjQtMS41LTQuMi0yLjctNy45LTQuOS0yMi0xMy43LTIyLjQtMTcuNi0uNC00LjgtLjMtNi4yIDYuMS0xOC4xIDEuMy0yLjUgMi45LTUuMyA0LjYtOC4xIDYtMTAuNCAxMi44LTIyIDExLjMtMzAuMy0xLjctOS40LTE2LjQtMTQuOC0yOC45LTE5LjQtMS42LS42LTMuMS0xLjEtNC41LTEuNy0zLjYtMS40LTguMS0zLjEtMTIuOC00LjhsLS4xIDBjLTEyLjUtNC43LTI2LjQtOS45LTI4LjctMTAuOS0zLjItMS41LTIuMy0yLjggNy4yLTMuOCAxLjMtLjEgMi45LS4zIDQuNy0uNSAxMS44LTEuMyAzMy42LTMuNiA0NC4yLS42IDIuMSAuNiA0LjQgMS4yIDYuOSAxLjkgMTEuOSAzLjIgMjYuNSA3LjIgMjcuOSA5LjUgLjIgLjQgLjUgLjcgLjcgMS4xIDEuMyAxLjkgMi4yIDMuMiAuNyAxMS4zLS40IDIuNC0xLjMgNy4xLTIuNCAxMi45LTMuMyAxNy4yLTguNSA0NC4yLTkuMSA1MC4zLS4xIC44LS4yIDEuNy0uMyAyLjQtLjggNi43LTEuNCAxMS4yIDYuNCAxM2wyIC41YzguOCAyIDIxLjggNSAyNi40IDVsMC0uMXoiXQogICAgfTsKICAgIGZhRXRzeSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJldHN5IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYyZDciLCAiTTM4NCAzNDhjLTEuOCAxMC43LTEzLjggMTEwLTE1LjUgMTMyLTExNy45LTQuMy0yMTkuOS00LjctMzY4LjUgMGwwLTI1LjVjNDUuNS04LjkgNjAuNi04IDYxLTM1LjIgMS44LTcyLjMgMy41LTI0NC4xIDAtMzIyLTEtMjguNS0xMi4xLTI2LjgtNjEtMzZMMCAzNS44YzczLjkgMi40IDI1NS45IDguNiAzNjMtMy44LTMuNSAzOC4yLTcuOCAxMjYuNS03LjggMTI2LjVsLTIzLjIgMEMzMjAuOSAxMTUuNyAzMTMuMiA2OCAyNzcuMyA2OGwtMTM3IDBjLTEwLjIgMC0xMC43IDMuNS0xMC43IDkuOGwwIDE2My44YzU4IC41IDg4LjUtMi41IDg4LjUtMi41IDI5LjgtMSAyNy42LTguNSA0MC43LTY1LjNsMjUuOCAwYy00LjQgMTAxLjQtMy45IDYxLjgtMS44IDE2MC4zTDI1NyAzMzRjLTkuMi00MC4xLTkuMS02MS0zOS41LTYxLjUgMCAwLTIxLjUtMi04OC0ybDAgMTM5YzAgMjYgMTQuMyAzOC4zIDQ0LjMgMzguM2w4OS4zIDBjNjMuNiAwIDY2LjYtMjUgOTguNy05OS44bDIyLjIgMHoiXQogICAgfTsKICAgIGZhQnRjID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImJ0YyIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMTVhIiwgIk0zMTAuNCAyNDIuNmMyNy43LTE0LjIgNDUuNC0zOS40IDQxLjMtODEuMy01LjQtNTcuNC01Mi41LTc2LjYtMTE0LjgtODEuOWwwLTc5LjQtNDguNSAwIDAgNzcuMmMtMTIuNiAwLTI1LjUgLjMtMzguNCAuNmwwLTc3LjgtNDguNSAwIDAgNzkuNGMtMTcuOCAuNS0zOC42IC4zLTk3LjQgMGwwIDUxLjdjMzguMy0uNyA1OC40LTMuMSA2MyAyMS40bDAgMjE3LjRjLTIuOSAxOS41LTE4LjUgMTYuNy01My4zIDE2LjFMNCA0NDMuN2M4OC41IDAgOTcuNCAuMyA5Ny40IC4zbDAgNjggNDguNSAwIDAtNjcuMWMxMy4yIC4zIDI2LjIgLjMgMzguNCAuM2wwIDY2LjcgNDguNSAwIDAtNjhjODEuMy00LjQgMTM1LjYtMjQuOSAxNDIuOS0xMDEuNSA1LjctNjEuNC0yMy4zLTg4LjktNjkuMy05OS45ek0xNTAuOCAxMzQuNmMyNy40IDAgMTEzLjEtOC41IDExMy4xIDQ4LjUgMCA1NC41LTg1LjcgNDguMi0xMTMuMSA0OC4ybDAtOTYuN3ptMCAyNTEuOGwwLTEwNi41YzMyLjggMCAxMzMuMS05LjEgMTMzLjEgNTMuMyAwIDYwLjItMTAwLjQgNTMuMy0xMzMuMSA1My4zeiJdCiAgICB9OwogICAgZmFBZG4gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYWRuIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxNzAiLCAiTTI1NiAxNjcuNWw2NC45IDk4LjgtMTI5LjggMCA2NC45LTk4Ljh6TTggMjU2YTI0OCAyNDggMCAxIDEgNDk2IDAgMjQ4IDI0OCAwIDEgMSAtNDk2IDB6bTM5Ni4yIDgyLjdsLTE0OC4yLTIyMy4yLTE0OC4yIDIyMy4yIDMwLjQgMCAzMy42LTUxLjcgMTY4LjYgMCAzMy42IDUxLjcgMzAuMiAweiJdCiAgICB9OwogICAgZmFTcXVhcmVYVHdpdHRlciA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUteC10d2l0dGVyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU2MWEiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6bTI5Ny4xIDg0bC0xMDMuOCAxMTguNiAxMjIuMSAxNjEuNC05NS42IDAtNzQuOC05Ny45LTg1LjcgOTcuOS00Ny41IDAgMTExLTEyNi45LTExNy4xLTE1My4xIDk4IDAgNjcuNyA4OS41IDc4LjItODkuNSA0Ny41IDB6TTMyMy4zIDM2Ny42bC0xNjkuOS0yMjQuNy0yOC4zIDAgMTcxLjggMjI0LjcgMjYuNCAweiJdCiAgICB9OwogICAgZmFTcXVhcmVGb250QXdlc29tZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtZm9udC1hd2Vzb21lIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU1YWQiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6bTkwIDEyMmMwIDkuMy00LjggMTcuNC0xMi4xIDIybDE4OC45IDBjNy4zIDAgMTMuMiA1LjkgMTMuMiAxMy4yIDAgMS44LS40IDMuNy0xLjEgNS40TDMxMiAyNjQgMzQyLjkgMzMzLjRjLjcgMS43IDEuMSAzLjUgMS4xIDUuNCAwIDcuMy01LjkgMTMuMi0xMy4yIDEzLjJsLTE4Ni44IDAgMCAzMi0zMiAwIDAtMjA5LjVjLTYuMS00LjgtMTAtMTIuMi0xMC0yMC41IDAtMTQuNCAxMS42LTI2IDI2LTI2czI2IDExLjYgMjYgMjZ6Il0KICAgIH07CiAgICBmYUZvcnVtYmVlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImZvcnVtYmVlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyMTEiLCAiTTUuOCAzMDkuN0MyIDI5Mi43IDAgMjc1LjUgMCAyNTguMyAwIDEzNSA5OS44IDM1IDIyMy4xIDM1IDIzOS43IDM1IDI1Ni40IDM3IDI3Mi40IDQwLjUgMTQ5IDg3LjUgNTEuOSAxODYgNS44IDMwOS43ek0zOTguNyAxMjAuNWMtMTMuNy0xNy41LTI5LjctMzIuNy00Ny44LTQ1LjMtMTQ5LjYgNDQuMy0yNjYuMyAxNjIuMS0zMDkuNyAzMTIgMTIuNSAxOC4xIDI4IDM1LjYgNDUuMiA0OSA0My4xLTE1MS4zIDE2MS4yLTI3MS43IDMxMi4zLTMxNS43em0xNS44IDI1Mi43YzE1LjItMjUuMSAyNS40LTUzLjcgMjkuNS04Mi44LTc5LjQgNDIuOS0xNDUgMTEwLjYtMTg3LjYgMTkwLjMgMzAtNC40IDU4LjktMTUuMyA4NC42LTMxLjMgMzUgMTMuMSA3MC45IDI0LjMgMTA3IDMzLjYtOS4zLTM2LjUtMjAuNC03NC41LTMzLjUtMTA5Ljh6bTI5LjctMTQ1LjVjLTIuNi0xOS41LTcuOS0zOC43LTE1LjgtNTYuOC0xMzcuOSA0NS44LTI0Ni40IDE1Ni42LTI5MS4zIDI5NS4xIDE4LjEgNy42IDM3IDEyLjUgNTYuNiAxNS4yIDQ2LjMtMTE0LjEgMTM2LjgtMjA2LjggMjUwLjUtMjUzLjV6Il0KICAgIH07CiAgICBmYTQyR3JvdXAgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiNDItZ3JvdXAiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsiaW5ub3NvZnQiXSwgImUwODAiLCAiTTMyMCA5NmwwIDMyMGMyMSAwIDQxLjgtNC4xIDYxLjItMTIuMnMzNy0xOS44IDUxLjktMzQuNyAyNi42LTMyLjUgMzQuNy01MS45IDEyLjItNDAuMiAxMi4yLTYxLjItNC4xLTQxLjgtMTIuMi02MS4yLTE5LjgtMzcuMS0zNC43LTUxLjktMzIuNS0yNi42LTUxLjktMzQuNy00MC4yLTEyLjItNjEuMi0xMi4yek0wIDI1NkwxNjAgNDE2IDMyMCAyNTYgMTYwIDk2IDAgMjU2em00ODAgMGMwIDIxIDQuMSA0MS44IDEyLjIgNjEuMnMxOS44IDM3IDM0LjcgNTEuOSAzMi41IDI2LjYgNTEuOSAzNC43IDQwLjIgMTIuMiA2MS4yIDEyLjJsMC0zMjBjLTQyLjQgMC04My4xIDE2LjktMTEzLjEgNDYuOVM0ODAgMjEzLjYgNDgwIDI1NnoiXQogICAgfTsKICAgIGZhSW5ub3NvZnQgPSBmYTQyR3JvdXA7CiAgICBmYVN0dW1ibGV1cG9uQ2lyY2xlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInN0dW1ibGV1cG9uLWNpcmNsZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMWEzIiwgIk0yNjQgOGEyNDggMjQ4IDAgMSAwIDAgNDk2IDI0OCAyNDggMCAxIDAgMC00OTZ6bTAgMTc3LjVjLTkuOCAwLTE3LjggOC0xNy44IDE3LjhsMCAxMDYuOWMwIDQwLjktMzMuOSA3My45LTc0LjkgNzMuOS00MS40IDAtNzQuOS0zMy41LTc0LjktNzQuOWwwLTQ2LjUgNTcuMyAwIDAgNDUuOGMwIDEwIDggMTcuOCAxNy44IDE3LjhzMTcuOC03LjkgMTcuOC0xNy44bDAtMTA4LjRjMC00MCAzNC4yLTcyLjEgNzQuNy03Mi4xIDQwLjcgMCA3NC43IDMyLjMgNzQuNyA3Mi42bDAgMjMuNy0zNC4xIDEwLjEtMjIuOS0xMC43IDAtMjAuNmMuMS05LjYtNy45LTE3LjYtMTcuNy0xNy42ek00MzEuNiAzMDkuMWMwIDQxLjQtMzMuNSA3NC45LTc0LjkgNzQuOS00MS4yIDAtNzQuOS0zMy4yLTc0LjktNzQuMmwwLTQ2LjggMjIuOSAxMC43IDM0LjEtMTAuMSAwIDQ3LjFjMCA5LjggOCAxNy42IDE3LjggMTcuNnMxNy44LTcuOSAxNy44LTE3LjZsMC00OCA1Ny4zIDBjLS4xIDQ1LjktLjEgNDYuNC0uMSA0Ni40eiJdCiAgICB9OwogICAgZmFTeW1mb255ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInN5bWZvbnkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjgzZCIsICJNMjU2IDhhMjQ4IDI0OCAwIDEgMCAwIDQ5NiAyNDggMjQ4IDAgMSAwIDAtNDk2ek0zODkuNyAxNTEuNWMtMTEuNSAuNC0xOS40LTYuNC0xOS44LTE2LjktLjMtOS4yIDYuNy0xMy40IDYuNS0xOC45LS4yLTYuNS0xMC4yLTYuOC0xMi45LTYuNy0zOS44IDEuMy00OC42IDU3LTU4LjkgMTEzLjggMjEuNCAzLjIgMzYuNi0uNyA0NS4xLTYuMiAxMi03LjctMy4zLTE1LjctMS40LTI0LjYgNC0xOC4yIDMyLjYtMTkgMzIgNS4zLS40IDE3LjktMjUuOSA0MS44LTc3LjYgMzUuNy0xMC44IDU5LjUtMTguNCAxMTUtNTguMiAxNjEuNy0yOSAzNC41LTU4LjQgMzkuOC03MS42IDQwLjMtMjQuNiAuOS00MS0xMi4zLTQxLjYtMjkuOC0uNi0xNyAxNC40LTI2LjMgMjQuMy0yNi42IDIxLjktLjggMzAuMSAyNS43IDE0LjkgMzQtMTIuMSA5LjcgLjEgMTIuNiAyLjEgMTIuNiAxMC40LS40IDE3LjMtNS41IDIyLjItOSAyNC0yMCAzMy4yLTU0LjkgNDUuNC0xMTguMyA4LjItNDkuNyAxNy03OCAxOC4yLTgyLTE2LjktMTIuNy0yNy4xLTI4LjYtNDkuOC0zNC43LTE1LjYtNC4yLTI1LjEtLjYtMzEuOCA3LjgtNy45IDEwLTUuMyAyMyAyLjQgMzAuN2wxMi42IDE0YzE1LjUgMTcuOSAyNCAzMS45IDIwLjggNTAuNi01LjEgMjkuOS00MC43IDUyLjktODIuOSAzOS45LTM2LTExLjEtNDIuNy0zNi42LTM4LjQtNTAuNiA3LjUtMjQuMiA0Mi40LTExLjcgMzQuNiAxMy42LTIuOCA4LjYtNC45IDguNy02LjMgMTMuMS00LjYgMTQuOCA0MS44IDI4LjQgNTEtMS40IDQuNS0xNC41LTUuMy0yMS43LTIyLjItMzkuOS0yOC41LTMxLjctMTYtNjUuNSAyLjktNzkuNyA1Mi44LTM5LjQgMTAwLjUgMTcuNSAxMTAuNiAyNS44IDM3LjItMTA5IDEwMC41LTEwNS41IDEwMi40LTEwNS41IDI1LjItLjggNDQuMiAxMC42IDQ0LjggMjguNiAuMiA3LjctNC4yIDIyLjYtMTkuNSAyMy4xeiJdCiAgICB9OwogICAgZmFTYWxlc2ZvcmNlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNhbGVzZm9yY2UiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjgzYiIsICJNMjQ5LjQgMjQ1LjZsLTI2LjQgMGMuNy01LjIgMy4zLTE0LjEgMTMuNi0xNC4xIDYuOCAwIDEyIDMuOCAxMi43IDE0LjF6TTM4NiAyMzEuOGMtLjUgMC0xNC4xLTEuOC0xNC4xIDIwczEzLjYgMjAgMTQuMSAyMGMxMyAwIDE0LjEtMTMuNSAxNC4xLTIwIDAtMjEuOC0xMy43LTIwLTE0LjEtMjB6TTE0Mi44IDI1NS41Yy0xLjEgLjktMiAyLTIuNSAzLjJzLS44IDIuNy0uNyA0YzAgNC44IDIuMSA2LjEgMy4zIDcgNC43IDMuNyAxNS4xIDIuMSAyMC45IDFsMC0xNi45Yy01LjMtMS4xLTE2LjctMi0yMC45IDEuNnpNNjQwLjUgMjMyYzAgODcuNi04MCAxNTQuNC0xNjUuNCAxMzYuNC0xOC40IDMzLTcwLjcgNzAuOC0xMzIuMiA0MS42LTQxLjIgOTYtMTc3LjkgOTIuMi0yMTMuOC01LjItMTE5LjcgMjMuOS0xNzguOC0xMzguNC03NS4zLTE5OS4zLTM0LjgtNzkuNCAyMi42LTE3My42IDExNC4zLTE3My42IDE5LjEgMCAzNy45IDQuNCA1NSAxMi45czMyIDIwLjcgNDMuNiAzNS44YzIwLjctMjEuNCA0OS40LTM0LjggODEuMS0zNC44IDQyLjMgMCA3OSAyMy41IDk4LjggNTguNiA5Mi44LTQwLjcgMTkzLjggMjguMiAxOTMuOCAxMjcuNXpNMTIwLjkgMjYzLjhjMC0xMS44LTExLjctMTUuMi0xNy45LTE3LjItNS4zLTIuMS0xMy40LTMuNS0xMy40LTguOSAwLTkuNSAxNy02LjcgMjUuMi0yLjEgMCAwIDEuMiAuNyAxLjYtLjUgLjItLjcgMi40LTYuNiAyLjYtNy4zIC4xLS4zIC4xLS42LS4xLS44cy0uNC0uNS0uNi0uNmMtMTIuMy03LjYtNDAuNy04LjUtNDAuNyAxMi43IDAgMTIuNSAxMS41IDE1LjQgMTcuOSAxNy4yIDQuNyAxLjYgMTMuMiAzIDEzLjIgOC43IDAgNC0zLjUgNy4xLTkuMiA3LjEtNi45IDAtMTMuNS0yLjItMTktNi4zLS41LS4yLTEuNC0uNy0xLjYgLjdsLTIuNCA3LjVjLS41IC45IC4yIDEuMiAuMiAxLjQgMS44IDEuNCAxMC4zIDYuNiAyMi44IDYuNiAxMy4yIDAgMjEuNC03LjEgMjEuNC0xOC4xbDAgMHptMzItNDIuNmMtMTAuMSAwLTE4LjcgMy4yLTIxLjQgNS4yLS4xIC4xLS4yIC4yLS4zIC4zcy0uMSAuMi0uMSAuNCAwIC4zIDAgLjQgLjEgLjMgLjIgLjRsMi42IDcuMWMuMSAuMiAuMiAuNSAuNSAuNnMuNSAuMiAuNyAuMWMuNiAwIDYuOC00IDE2LjktNCA0IDAgNy4xIC43IDkuMiAyLjQgMy42IDIuOCAzLjEgOC4zIDMuMSAxMC42LTQuOC0uMy0xOS4xLTMuNC0yOS40IDMuOC0yLjMgMS42LTQuMyAzLjgtNS41IDYuM3MtMS45IDUuNC0xLjggOC4yYzAgNS45IDEuNSAxMC40IDYuNiAxNC40IDEyLjIgOC4yIDM2LjMgMiAzOC4xIDEuNCAxLjYtLjMgMy41LS43IDMuNS0xLjlsMC0zMy45YzAtNC42IC4zLTIxLjYtMjIuOC0yMS42bDAgLjF6bTQ2LjYtMjFjMC0uMiAwLS4zLS4xLS41cy0uMS0uMy0uMy0uNC0uMi0uMi0uNC0uMy0uMy0uMS0uNS0uMWwtOS44IDBjLS4yIDAtLjMgMC0uNSAuMXMtLjMgLjEtLjQgLjMtLjIgLjItLjMgLjQtLjEgLjMtLjEgLjVsMCA3OWMwIC4yIDAgLjMgLjEgLjVzLjEgLjMgLjMgLjQgLjIgLjIgLjQgLjMgLjMgLjEgLjUgLjFsOS45IDBjLjIgMCAuMyAwIC41LS4xcy4zLS4xIC40LS4zIC4yLS4yIC4zLS40IC4xLS4zIC4xLS41bC0uMS03OXptNTUuNyAyOC45Yy0yLjEtMi4zLTYuOC03LjUtMTcuNi03LjUtMy41IDAtMTQuMiAuMi0yMC43IDguOS02LjQgNy42LTYuNiAxOC4xLTYuNiAyMS40IDAgMy4xIC4yIDE0LjMgNy4xIDIxLjIgMi42IDIuOSA5LjEgOC4yIDIyLjggOC4yIDEwLjggMCAxNi41LTIuMyAxOC42LTMuOCAuNS0uMiAuNy0uNyAuMi0xLjlsLTIuMy02LjhjLS4xLS4zLS4zLS41LS42LS42cy0uNS0uMi0uOC0uMWMtMi42IC45LTYuMyAyLjgtMTUuMyAyLjgtMTcuNCAwLTE2LjgtMTQuNy0xNi45LTE2LjdsMzcuMiAwYy4zIDAgLjUtLjEgLjctLjNzLjQtLjQgLjQtLjdjLS4zIDAgMi4xLTE0LjctNi4xLTI0LjJsMCAwem0zNi43IDUyLjdjMTMuMiAwIDIxLjQtNy4xIDIxLjQtMTguMSAwLTExLjgtMTEuNy0xNS4yLTE3LjktMTcuMi00LjEtMS43LTEzLjQtMy40LTEzLjQtOC45IDAtMy44IDMuMy02LjQgOC41LTYuNCA1LjggLjEgMTEuNSAxLjYgMTYuNyA0LjIgMCAwIDEuMiAuNyAxLjYtLjUgLjItLjcgMi40LTYuNiAyLjYtNy4zIC4xLS4zIC4xLS42LS4xLS44cy0uNC0uNS0uNi0uNmMtNy45LTQuOS0xNi43LTQuOS0yMC4yLTQuOS0xMiAwLTIwLjUgNy4zLTIwLjUgMTcuNiAwIDEyLjUgMTEuNSAxNS40IDE3LjkgMTcuMiA2LjEgMiAxMy4yIDMuMyAxMy4yIDguNyAwIDQtMy41IDcuMS05LjIgNy4xLTYuOSAwLTEzLjUtMi4yLTE5LTYuNC0uMS0uMS0uMy0uMi0uNS0uMnMtLjQgMC0uNSAuMS0uMyAuMi0uNCAuMy0uMiAuMy0uMiAuNWwtMi4zIDcuNWMtLjUgLjkgLjIgMS4yIC4yIDEuNCAxLjcgMS40IDEwLjMgNi42IDIyLjggNi42bDAgMHpNMzU3LjYgMjI0YzAtLjctLjItMS4yLTEuMi0xLjJsLTExLjggMGMwLS4xIC45LTguOSA0LjUtMTIuNSA0LjItNC4yIDExLjgtMS42IDEyLTEuNiAxLjIgLjUgMS40IDAgMS42LS41bDIuOC03LjhjLjctLjkgMC0xLjItLjItMS40LTUuMS0yLTE3LjQtMi45LTI0LjUgNC4yLTUuNSA1LjUtNyAxMy45LTggMTkuNWwtOC41IDBjLS4zIDAtLjYgLjItLjggLjRzLS4zIC41LS40IC44bC0xLjQgNy44YzAgLjcgLjIgMS4yIDEuMiAxLjJsOC4yIDBjLTguNSA0Ny45LTguNyA1MC4yLTEwLjMgNTUuNS0xLjEgMy42LTMuMyA2LjktNS45IDcuOC0uMSAwLTMuOSAxLjctOS42LS4yIDAgMC0uOS0uNS0xLjQgLjctLjIgLjctMi42IDYuOC0yLjggNy41czAgMS40IC41IDEuNGM1LjEgMiAxMyAxLjggMTcuOSAwIDYuMy0yLjMgOS43LTcuOSAxMS41LTEyLjkgMi44LTcuNyAyLjgtOS44IDExLjgtNTkuN2wxMi4yIDBjLjMgMCAuNi0uMiAuOC0uNHMuMy0uNSAuNC0uOGwxLjQtNy44ek00MTEgMjQwYy0uNi0xLjctNS4xLTE4LjEtMjUuMi0xOC4xLTE1LjIgMC0yMyAxMC0yNS4yIDE4LjEtMSAzLTMuMiAxNCAwIDIzLjUgLjEgLjMgNC40IDE4LjEgMjUuMiAxOC4xIDE1IDAgMjIuOS05LjYgMjUuMi0xOC4xIDMuMi05LjYgMS0yMC41IDAtMjMuNXptNDUuNC0xNi43Yy01LTEuNy0xNi42LTEuOS0yMi4xIDUuNGwwLTQuNWMwLS4yIDAtLjMtLjEtLjVzLS4xLS4zLS4zLS40LS4yLS4yLS40LS4zLS4zLS4xLS41LS4xbC05LjQgMGMtLjIgMC0uMyAwLS41IC4xcy0uMyAuMS0uNCAuMy0uMiAuMi0uMyAuNC0uMSAuMy0uMSAuNWwwIDU1LjNjMCAuMiAwIC4zIC4xIC41cy4xIC4zIC4zIC40IC4yIC4yIC40IC4zIC4zIC4xIC41IC4xbDkuNiAwYy4yIDAgLjMgMCAuNS0uMXMuMy0uMSAuNC0uMyAuMi0uMiAuMy0uNCAuMS0uMyAuMS0uNWwwLTI3LjhjMC0yLjkgLjEtMTEuNCA0LjUtMTUuMSA0LjktNC45IDEyLTMuNCAxMy40LTMuMSAuMyAwIC42LS4xIC44LS4zcy40LS40IC42LS43YzEuMi0yLjYgMi4yLTUuMyAzLjEtOCAuMS0uMyAuMS0uNSAwLS44cy0uMy0uNS0uNS0uNmwwIDB6bTQ2LjggNTQuMWwtMi4xLTcuM2MtLjUtMS4yLTEuNC0uNy0xLjQtLjctNC4yIDEuOC0xMC4xIDEuOS0xMS4zIDEuOS00LjYgMC0xNy4yLTEuMS0xNy4yLTE5LjggMC02LjIgMS44LTE5LjggMTYuNS0xOS44IDMuOS0uMSA3LjggLjUgMTEuNSAxLjYgMCAwIC45IC41IDEuMi0uNyAuOS0yLjYgMS42LTQuNSAyLjYtNy41IC4yLS45LS41LTEuMi0uNy0xLjItMTEuNi0zLjktMjIuMy0yLjUtMjcuOCAwLTEuNiAuNy0xNi4yIDYuNS0xNi4yIDI3LjUgMCAyLjktLjYgMzAuMSAyOC45IDMwLjEgNS4zIDAgMTAuNi0xIDE1LjUtMi44IC4yLS4yIC40LS40IC41LS42cy4xLS41IDAtLjhsMCAwem01My45LTM5LjVjLS44LTMtNS40LTE2LjItMjIuMy0xNi4yLTE2IDAtMjMuNSAxMC4xLTI1LjYgMTguNi0xLjIgMy44LTEuNyA3LjgtMS43IDExLjggMCAyNS45IDE4LjggMjkuNCAyOS45IDI5LjQgMTAuOCAwIDE2LjUtMi4zIDE4LjYtMy44IC41LS4yIC43LS43IC4yLTEuOWwtMi40LTYuOGMtLjEtLjMtLjMtLjUtLjYtLjZzLS42LS4yLS44LS4xYy0yLjYgLjktNi4zIDIuOC0xNS4zIDIuOC0xNy40IDAtMTYuOS0xNC43LTE2LjktMTYuN2wzNy4yIDBjLjMgMCAuNS0uMSAuNy0uM3MuNC0uNCAuNC0uN2MtLjIgMCAuOS03LjEtMS40LTE1LjVsMCAwem0tMjMuMy02LjRjLTEwLjMgMC0xMyA5LTEzLjYgMTQuMWwyNi40IDBjLS45LTExLjktNy42LTE0LjEtMTIuNy0xNC4xbDAgMHoiXQogICAgfTsKICAgIGZhU291cmNldHJlZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzb3VyY2V0cmVlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY3ZDMiLCAiTTQyNy40IDIwM2MwLTExMi4xLTkwLjktMjAzLTIwMy0yMDMtMTEyLjEtLjItMjAzIDkwLjYtMjAzLjIgMjAyLjYtLjEgNDMgMTMuNSA4NC44IDM4LjcgMTE5LjZzNjAuOSA2MC42IDEwMS44IDczLjhsMCAxMDEuN2MwIDMuOCAxLjUgNy40IDQuMiAxMC4xczYuMyA0LjIgMTAuMSA0LjJsOTYuNCAwYzMuOCAwIDcuNC0xLjUgMTAuMS00LjJzNC4yLTYuMyA0LjItMTAuMWwwLTEwMS42YzQwLjgtMTMuMiA3Ni41LTM5IDEwMS43LTczLjdzMzguOS03Ni41IDM5LTExOS40em0tMjcxLjYgMGMwLTkwLjggMTM3LjMtOTAuOCAxMzcuMyAwLS4xIDg5LjktMTM3LjMgOTEtMTM3LjMgMHoiXQogICAgfTsKICAgIGZhTGlua2VkaW5JbiA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJsaW5rZWRpbi1pbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMGUxIiwgIk0xMDAuMyA0NDhsLTkyLjkgMCAwLTI5OS4xIDkyLjkgMCAwIDI5OS4xek01My44IDEwOC4xQzI0LjEgMTA4LjEgMCA4My41IDAgNTMuOCAwIDM5LjUgNS43IDI1LjkgMTUuOCAxNS44czIzLjgtMTUuOCAzOC0xNS44IDI3LjkgNS43IDM4IDE1LjggMTUuOCAyMy44IDE1LjggMzhjMCAyOS43LTI0LjEgNTQuMy01My44IDU0LjN6TTQ0Ny45IDQ0OGwtOTIuNyAwIDAtMTQ1LjZjMC0zNC43LS43LTc5LjItNDguMy03OS4yLTQ4LjMgMC01NS43IDM3LjctNTUuNyA3Ni43bDAgMTQ4LjEtOTIuOCAwIDAtMjk5LjEgODkuMSAwIDAgNDAuOCAxLjMgMGMxMi40LTIzLjUgNDIuNy00OC4zIDg3LjktNDguMyA5NCAwIDExMS4zIDYxLjkgMTExLjMgMTQyLjNsMCAxNjQuMy0uMSAweiJdCiAgICB9OwogICAgZmFIdG1sNSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJodG1sNSIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMTNiIiwgIk0wIDMyTDM0LjkgNDI3LjggMTkxLjUgNDgwIDM0OS4xIDQyNy44IDM4NCAzMiAwIDMyek0zMDguMiAxNTkuOWwtMTgzLjggMCA0LjEgNDkuNCAxNzUuNiAwLTEzLjYgMTQ4LjQtOTcuOSAyNyAwIC4zLTEuMSAwLTk4LjctMjcuMy02LTc1LjggNDcuNyAwIDMuNSAzOC4xIDUzLjUgMTQuNSA1My43LTE0LjUgNi02Mi4yLTE2Ni45IDAtMTIuOC0xNDUuNiAyNDEuMSAwLTQuNCA0Ny43eiJdCiAgICB9OwogICAgZmFSdXN0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInJ1c3QiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTA3YSIsICJNNTA4LjUgMjQ5LjhsLTIxLjgtMTMuNWMtLjItMi0uMy0zLjktLjUtNS45bDE4LjctMTcuNWMuOS0uOSAxLjYtMS45IDItMy4xcy41LTIuNSAuMi0zLjctLjgtMi40LTEuNi0zLjMtMS44LTEuNy0zLTIuMWwtMjQtOWMtLjUtMS45LTEuMS0zLjgtMS43LTUuNmwxNS0yMC44Yy43LTEgMS4yLTIuMiAxLjMtMy40czAtMi41LS41LTMuNy0xLjItMi4yLTIuMi0yLjktMi4xLTEuMy0zLjQtMS41bC0yNS40LTQuMmMtLjktMS43LTEuOC0zLjQtMi43LTUuMmwxMC43LTIzLjRjLjUtMS4xIC43LTIuNCAuNi0zLjZzLS41LTIuNC0xLjItMy41LTEuNi0xLjktMi44LTIuNS0yLjQtLjgtMy42LS44bC0yNS44IC45Yy0xLjItMS41LTIuNC0yLjktMy42LTQuNEw0MzkgODEuOGMuMy0xLjIgLjMtMi41LS4xLTMuN3MtMS0yLjMtMS45LTMuMi0yLTEuNS0zLjItMS45LTIuNS0uNC0zLjctLjFMNDA1IDc4LjljLTEuNC0xLjItMi45LTIuNC00LjQtMy42bC45LTI1LjhjLjEtMS4zLS4yLTIuNS0uOC0zLjZzLTEuNC0yLjEtMi41LTIuOC0yLjItMS4xLTMuNS0xLjItMi41IC4xLTMuNyAuNkwzNjcuNyA1My4yYy0xLjctLjktMy40LTEuOC01LjEtMi43bC00LjItMjUuNGMtLjItMS4yLS43LTIuNC0xLjUtMy40cy0xLjgtMS43LTIuOS0yLjItMi40LS43LTMuNy0uNS0yLjQgLjYtMy40IDEuM0wzMjYgMzUuM2MtMS45LS42LTMuOC0xLjEtNS42LTEuN2wtOS0yNGMtLjQtMS4yLTEuMi0yLjItMi4xLTNzLTIuMS0xLjQtMy4zLTEuNi0yLjUtLjItMy43IC4yLTIuMyAxLjEtMy4xIDJMMjgxLjYgMjUuOWMtMi0uMi0zLjktLjQtNS45LS41TDI2Mi4zIDMuNWMtLjctMS4xLTEuNi0xLjktMi43LTIuNnMtMi4zLS45LTMuNi0uOS0yLjUgLjMtMy42IC45LTIgMS41LTIuNyAyLjZMMjM2LjIgMjUuM2MtMiAuMi0zLjkgLjMtNS45IC42TDIxMi45IDcuMWMtLjktLjktMS45LTEuNi0zLjEtMnMtMi41LS41LTMuNy0uMi0yLjQgLjgtMy4zIDEuNi0xLjcgMS44LTIuMSAzbC05IDI0Yy0xLjkgLjYtMy44IDEuMS01LjcgMS43bC0yMC44LTE1Yy0xLS43LTIuMi0xLjItMy40LTEuM3MtMi41IDAtMy43IC41LTIuMiAxLjItMi45IDIuMi0xLjMgMi4xLTEuNSAzLjRsLTQuMiAyNS40Yy0xLjcgLjktMy40IDEuOC01LjIgMi43TDEyMC45IDQyLjZjLTEuMS0uNS0yLjQtLjctMy43LS42cy0yLjUgLjUtMy41IDEuMi0xLjkgMS43LTIuNSAyLjgtLjggMi40LS44IDMuNmwuOSAyNS44Yy0xLjUgMS4yLTMgMi40LTQuNCAzLjZMODEuOCA3M2MtMS4yLS4zLTIuNS0uMy0zLjcgLjFzLTIuMyAxLTMuMiAxLjktMS41IDItMS45IDMuMi0uNCAyLjUtLjEgMy43TDc4LjkgMTA3Yy0xLjIgMS40LTIuNCAyLjktMy42IDQuNGwtMjUuOC0uOWMtMS4zIDAtMi41IC4yLTMuNiAuOHMtMi4xIDEuNC0yLjggMi40LTEuMSAyLjItMS4yIDMuNSAuMSAyLjUgLjYgMy42bDEwLjcgMjMuNGMtLjkgMS43LTEuOCAzLjQtMi43IDUuMmwtMjUuNCA0LjFjLTEuMiAuMi0yLjQgLjctMy40IDEuNXMtMS43IDEuOC0yLjIgMi45LS43IDIuNC0uNSAzLjcgLjYgMi40IDEuMyAzLjRsMTUgMjAuOGMtLjYgMS45LTEuMSAzLjgtMS43IDUuN2wtMjQgOWMtMS4yIC40LTIuMiAxLjItMyAyLjFzLTEuNCAyLjEtMS42IDMuMy0uMiAyLjUgLjIgMy43IDEuMSAyLjMgMiAzLjFsMTguNyAxNy41Yy0uMiAyLS40IDMuOS0uNiA1LjlMMy41IDI0OS44Yy0xLjEgLjctMS45IDEuNi0yLjYgMi43cy0uOSAyLjMtLjkgMy42IC4zIDIuNSAuOSAzLjYgMS41IDIgMi42IDIuN2wyMS44IDEzLjVjLjIgMiAuMyAzLjkgLjYgNS45TDcuMSAyOTkuMWMtLjkgLjktMS42IDEuOS0yIDMuMXMtLjUgMi41LS4yIDMuNyAuOCAyLjQgMS42IDMuMyAxLjggMS43IDMgMi4xbDI0IDljLjYgMS45IDEuMSAzLjggMS43IDUuNmwtMTUgMjAuOGMtLjcgMS0xLjIgMi4yLTEuMyAzLjRzMCAyLjUgLjUgMy43IDEuMiAyLjIgMi4yIDIuOSAyLjEgMS4zIDMuNCAxLjVsMjUuNCA0LjJjLjkgMS43IDEuOCAzLjQgMi43IDUuMUw0Mi42IDM5MS4xYy0uNSAxLjEtLjcgMi40LS42IDMuNnMuNSAyLjUgMS4yIDMuNWMuNyAxLjEgMS42IDEuOSAyLjcgMi41czIuNCAuOCAzLjYgLjhsMjUuOC0uOWMxLjIgMS41IDIuNCAyLjkgMy42IDQuNEw3MyA0MzAuMmMtLjMgMS4yLS4zIDIuNSAuMSAzLjdzMSAyLjMgMS45IDMuMiAyIDEuNSAzLjIgMS45IDIuNSAuNCAzLjcgLjFsMjUuMi01LjljMS41IDEuMiAyLjkgMi40IDQuNCAzLjZsLS45IDI1LjhjMCAxLjMgLjIgMi41IC44IDMuNnMxLjQgMi4xIDIuNSAyLjggMi4yIDEuMSAzLjUgMS4yIDIuNS0uMSAzLjYtLjZsMjMuNC0xMC43YzEuNyAuOSAzLjQgMS44IDUuMSAyLjdsNC4yIDI1LjRjLjIgMS4yIC43IDIuNCAxLjUgMy40czEuOCAxLjggMi45IDIuMiAyLjQgLjcgMy43IC41IDIuNC0uNiAzLjQtMS4zbDIwLjgtMTVjMS45IC42IDMuOCAxLjEgNS42IDEuN2w5IDI0Yy40IDEuMiAxLjIgMi4yIDIuMSAzczIuMSAxLjQgMy4zIDEuNiAyLjUgLjIgMy43LS4yIDIuMy0xLjEgMy4xLTJsMTcuNS0xOC43YzIgLjIgMy45IC40IDUuOSAuNmwxMy41IDIxLjhjLjcgMS4xIDEuNiAxLjkgMi43IDIuNnMyLjMgLjkgMy42IC45IDIuNS0uMyAzLjYtLjkgMi0xLjUgMi43LTIuNmwxMy41LTIxLjhjMi0uMiAzLjktLjMgNS45LS42bDE3LjUgMTguN2MuOSAuOSAxLjkgMS42IDMuMSAyczIuNSAuNSAzLjcgLjIgMi40LS44IDMuMy0xLjYgMS43LTEuOCAyLjEtM2w5LTI0YzEuOS0uNiAzLjgtMS4xIDUuNi0xLjdsMjAuOCAxNWMxIC43IDIuMiAxLjIgMy40IDEuM3MyLjUgMCAzLjctLjUgMi4yLTEuMiAyLjktMi4yIDEuMy0yLjEgMS41LTMuNGw0LjItMjUuNGMxLjctLjkgMy40LTEuOCA1LjEtMi43bDIzLjQgMTAuN2MxLjEgLjUgMi40IC43IDMuNiAuNnMyLjQtLjUgMy41LTEuMiAxLjktMS42IDIuNS0yLjggLjgtMi40IC44LTMuNmwtLjktMjUuOGMxLjUtMS4yIDIuOS0yLjQgNC40LTMuNmwyNS4yIDUuOWMxLjIgLjMgMi41IC4zIDMuNy0uMXMyLjMtMSAzLjItMS45IDEuNS0yIDEuOS0zLjIgLjQtMi41IC4xLTMuN0w0MzMuMSA0MDVjMS4yLTEuNCAyLjQtMi45IDMuNi00LjRsMjUuOCAuOWMxLjMgLjEgMi41LS4yIDMuNi0uOHMyLjEtMS40IDIuOC0yLjVjLjctMSAxLjEtMi4yIDEuMi0zLjVzLS4xLTIuNS0uNi0zLjZsLTEwLjctMjMuNGMuOS0xLjcgMS44LTMuNCAyLjctNS4xbDI1LjQtNC4yYzEuMi0uMiAyLjQtLjcgMy40LTEuNXMxLjgtMS44IDIuMi0yLjkgLjctMi40IC41LTMuNy0uNi0yLjQtMS4zLTMuNGwtMTUtMjAuOGMuNi0xLjkgMS4xLTMuOCAxLjctNS42bDI0LTljMS4yLS40IDIuMi0xLjIgMy0yLjFzMS40LTIuMSAxLjYtMy4zIC4yLTIuNS0uMi0zLjctMS4xLTIuMy0yLTMuMWwtMTguNy0xNy41Yy4yLTEuOSAuNC0zLjkgLjYtNS45bDIxLjgtMTMuNWMxLjEtLjcgMS45LTEuNiAyLjYtMi43cy45LTIuMyAuOS0zLjYtLjMtMi41LS45LTMuNi0xLjUtMi0yLjYtMi43bDAgMHptLTE1MSAxMjkuMWMtMy42LS44LTcuNC0uMS0xMC41IDEuOXMtNS4zIDUuMi02IDguOGwtNy42IDM1LjdjLTI0LjYgMTEuMS01MS4zIDE2LjgtNzguMyAxNi43cy01My42LTYuMS03OC4xLTE3LjRsLTcuNi0zNS43Yy0uNC0xLjgtMS4xLTMuNS0yLjEtNXMtMi40LTIuOC0zLjktMy44LTMuMi0xLjctNS0yLTMuNi0uMy01LjQgLjFsLTMxLjUgNi44Yy01LjgtNi0xMS4zLTEyLjUtMTYuMy0xOS4ybDE1My4yIDBjMS43IDAgMi45LS4zIDIuOS0xLjlsMC01NC4yYzAtMS42LTEuMi0xLjktMi45LTEuOWwtNDQuOCAwIDAtMzQuNCA0OC41IDBjNC40IDAgMjMuNyAxLjMgMjkuOCAyNS45IDEuOSA3LjUgNi4yIDMyLjEgOS4xIDQwIDIuOSA4LjggMTQuNiAyNi41IDI3LjEgMjYuNWw3OSAwYy01LjMgNy4xLTExLjEgMTMuOC0xNy4zIDIwLjFsLTMyLjEtNi45em0yNS44IDM0LjVjMCAzLS45IDYtMi42IDguNXMtNCA0LjUtNi44IDUuNi01LjggMS41LTguOCAuOS01LjctMi03LjgtNC4yLTMuNi00LjgtNC4yLTcuOC0uMy02IC44LTguOCAzLjEtNS4yIDUuNi02LjkgNS40LTIuNiA4LjUtMi42bC40IDBjNCAuMSA3LjcgMS44IDEwLjUgNC42czQuMyA2LjcgNC4zIDEwLjZsLjEgMHptLTIyNS42LS43YzAgMy0uOSA2LTIuNiA4LjVzLTQuMSA0LjUtNi44IDUuNi01LjggMS41LTguOCAuOS01LjctMi03LjgtNC4yLTMuNi00LjgtNC4yLTcuOC0uMy02IC45LTguOCAzLjEtNS4yIDUuNi02LjggNS40LTIuNiA4LjUtMi42bC41IDBjNCAuMSA3LjcgMS44IDEwLjUgNC42czQuMyA2LjcgNC4zIDEwLjZsLjEgMHpNNjkuNiAyMzQuMmwzMi44LTE0LjZjMS43LS43IDMuMi0xLjggNC40LTMuMXMyLjItMi45IDIuOS00LjYgMS0zLjUgLjktNS4zLS41LTMuNi0xLjItNS4zbC02LjgtMTUuMiAyNi42IDAgMCAxMTkuNy01My42IDBjLTYuNi0yMy4yLTguNy00Ny42LTYuMS03MS42ek01OC4zIDE5OC4xYzAtMiAuNC00IDEuMi01LjhzMS45LTMuNSAzLjMtNC45IDMuMS0yLjUgNC45LTMuMyAzLjgtMS4yIDUuOC0xLjJsLjUgMGMzIC4xIDUuOSAxIDguMyAyLjhzNC4zIDQuMSA1LjQgNi45IDEuMyA1LjggLjcgOC44LTIuMSA1LjYtNC4zIDcuNy00LjkgMy41LTcuOCA0LjEtNiAuMi04LjctLjktNS4xLTMuMS02LjgtNS42LTIuNS01LjQtMi41LTguNGwwIDB6bTE1NS4yIDI0LjVsMC0zNS4zIDYzLjMgMGMzLjMgMCAyMy4xIDMuOCAyMy4xIDE4LjYgMCAxMi4zLTE1LjIgMTYuNy0yNy43IDE2LjdsLTU4LjcgMHpNMzk5IDMwNi43Yy05LjggMS4xLTIwLjYtNC4xLTIyLTEwLjEtNS44LTMyLjUtMTUuNC0zOS40LTMwLjYtNTEuNCAxOC45LTEyIDM4LjUtMjkuNiAzOC41LTUzLjMgMC0yNS41LTE3LjUtNDEuNi0yOS40LTQ5LjUtMTYuOC0xMS0zNS4zLTEzLjItNDAuMy0xMy4ybC0xOTguOSAwYzI3LjUtMzAuNyA2NC40LTUxLjUgMTA0LjktNTkuMmwyMy41IDI0LjZjMS4zIDEuMyAyLjggMi40IDQuNCAzLjFzMy41IDEuMSA1LjMgMS4yIDMuNi0uMyA1LjMtLjkgMy4yLTEuNyA0LjYtMi45bDI2LjMtMjVjMjYuOCA1IDUyLjEgMTUuOCA3NC4zIDMxLjZzNDAuNiAzNi4yIDU0LjEgNTkuOWwtMTggNDAuNmMtMS41IDMuNC0xLjUgNy4yLS4yIDEwLjZzMy45IDYuMiA3LjMgNy43bDM0LjYgMTUuM2MxLjEgMTAuOCAxLjIgMjEuNyAuNCAzMi41bC0xOS4zIDBjLTEuOSAwLTIuNyAxLjMtMi43IDMuMWwwIDguOGMwIDIwLjgtMTEuNyAyNS4zLTIyIDI2LjV6TTI0MCA2MC4yYzAtNCAxLjYtNy45IDQuNS0xMC43czYuNy00LjUgMTAuNy00LjVsLjQgMGMzIC4xIDUuOSAxIDguNCAyLjhzNC4zIDQuMSA1LjQgNi45IDEuMyA1LjggLjcgOC44LTIuMSA1LjYtNC4zIDcuNy00LjkgMy41LTcuOCA0LTYgLjItOC43LS45LTUuMS0zLjEtNi44LTUuNi0yLjUtNS40LTIuNS04LjR6TTQzNi44IDIxNGMtMiAwLTQtLjQtNS44LTEuMnMtMy41LTEuOS00LjktMy4zLTIuNS0zLjEtMy4zLTQuOS0xLjItMy44LTEuMi01LjggLjQtNCAxLjItNS44IDEuOS0zLjUgMy4zLTQuOSAzLjEtMi41IDQuOS0zLjMgMy44LTEuMiA1LjgtMS4ybC40IDBjNCAuMSA3LjkgMS43IDEwLjcgNC42czQuNCA2LjggNC4zIDEwLjgtMS43IDcuOS00LjYgMTAuNy02LjggNC40LTEwLjggNC4zeiJdCiAgICB9OwogICAgZmFIb3JuYmlsbCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJob3JuYmlsbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNTkyIiwgIk03Ni44IDM3MC4zYzEgNy44LS40IDE1LjgtNC4xIDIyLjhzLTkuNiAxMi42LTE2LjcgMTYuMS0xNS4xIDQuNy0yMi45IDMuMy0xNS01LjEtMjAuNi0xMC43LTkuMi0xMi45LTEwLjUtMjAuNyAwLTE1LjggMy42LTIyLjkgOS4zLTEyLjggMTYuMy0xNi41IDE1LTUgMjIuOS0zLjljLTc4LjMtMTExLjMgNTItMTkwLjUgNTItMTkwLjUtNS45IDQzLTguMiA5MS4yLTguMiA5MS4yLTY3LjMgNDEuNSAuOSA2NC4xIDM5LjggNzIuOSA5LjkgMjcgMjcuOCA1MC4yIDUxLjQgNjYuN3M1MS42IDI1LjMgODAuMyAyNS4zYzEuOSAwIDMuOC0uMiA1LjctLjNsLjEgMTguOWMtOTkuMiAxLjQtMTU4LjctMjkuMS0xODguOS01MS42em0xMDgtMzI3LjdjLjktNy4yLS4yLTE0LjYtMy40LTIxLjItMy02LjItNy42LTExLjUtMTMuNC0xNS4zcy0xMi41LTUuOS0xOS40LTYuMi0xMy44IDEuNC0xOS44IDQuNy0xMS4xIDguMy0xNC41IDE0LjMtNS4yIDEyLjgtNSAxOS43IDIuMiAxMy43IDUuOSAxOS41IDguOSAxMC42IDE1LjEgMTMuNiAxMy4xIDQuNCAyMCAzLjljLTIyLjYgMjkuOS01My44IDg5LjYtNTIuNCAxOTBsMjEuOC0uMmMwLS45LS4xLTEuOC0uMS0yLjcgMC0yOCA4LjQtNTUuMyAyNC4xLTc4LjVzMzcuOS00MS4yIDYzLjgtNTEuNmM4LTM3LjcgMzAuNy0xMTQuMyA3My44LTQ0LjMgMCAwIDQ4LjEgMi40IDkxLjIgOC4yIDAgMC03Ny44LTEyOC0xODcuNi01NC4xbDAgMHpNNDg5IDE3Ni44YzYuMy0zIDExLjctNy43IDE1LjUtMTMuNnM1LjktMTIuNyA2LjEtMTkuOC0xLjYtMTQtNS4yLTIwLTguNy0xMS0xNC45LTE0LjMtMTMuMi00LjgtMjAuMi00LjQtMTMuOCAyLjgtMTkuNSA2LjktMTAuMiA5LjYtMTMgMTYuMS0zLjcgMTMuNi0yLjcgMjAuNWMtMzEuNy0yMS45LTg5LjgtNDkuMS0xODMuNC00Ny43bC4xIDIyLjVjMi43LS4yIDUuNC0uNCA4LjEtLjQgMjguMSAwIDU1LjYgOC41IDc4LjkgMjQuM3M0MS4yIDM4LjMgNTEuNiA2NC41YzM5LjEgOSAxMDUuMSAzMS42IDM4LjUgNzIuNSAwIDAtMi4zIDQ4LjEtOC4yIDkxLjIgMCAwIDEzMy40LTgxLjIgNDktMTk0LjYgNi42IC42IDEzLjMtLjYgMTkuMy0zLjVsMCAwek0zNzQuNCA0MzYuMmMyMS40LTMyLjUgNDYuNC04OS43IDQ1LjEtMTc5LjdsLTE5LjUgLjFjLjEgMi4xIC4zIDQuMSAuMyA2LjIgMCAyOC42LTguOCA1Ni41LTI1LjEgODBzLTM5LjUgNDEuNC02Ni4zIDUxLjRjLTguOSAzOS0zMS40IDEwNi43LTcyLjggMzkuNSAwIDAtNDguMS0yLjMtOTEuMi04LjIgMCAwIDc5LjkgMTMxLjMgMTkxLjkgNTEgLjMgNC45IDEuNSA5LjYgMy42IDE0IDIuOSA2LjEgNy41IDExLjQgMTMuMSAxNS4xczEyLjIgNiAxOSA2LjQgMTMuNi0xLjEgMTkuNi00LjIgMTEuMS03LjggMTQuNy0xMy42IDUuNi0xMi40IDUuNy0xOS4yLTEuNS0xMy41LTQuOC0xOS40LTguMi0xMC45LTE0LjEtMTQuMy0xMi42LTUuMi0xOS40LTUuMWwwLS4xeiJdCiAgICB9OwogICAgZmFQaHAgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicGhwIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY0NTciLCAiTTMyMCAxMDQuNWMxNzEuNCAwIDMwMy4yIDcyLjIgMzAzLjIgMTUxLjVTNDkxLjMgNDA3LjUgMzIwIDQwNy41QzE0OC42IDQwNy41IDE2LjggMzM1LjMgMTYuOCAyNTZTMTQ4LjcgMTA0LjUgMzIwIDEwNC41em0wLTE2LjhDMTQzLjMgODcuNyAwIDE2MyAwIDI1NlMxNDMuMyA0MjQuMyAzMjAgNDI0LjMgNjQwIDM0OSA2NDAgMjU2IDQ5Ni43IDg3LjcgMzIwIDg3Ljd6TTIxOC4yIDI0Mi41Yy03LjkgNDAuNS0zNS44IDM2LjMtNzAuMSAzNi4zbDEzLjctNzAuNmMzOCAwIDYzLjgtNC4xIDU2LjQgMzQuM3pNOTcuNCAzNTAuM2wzNi43IDAgOC43LTQ0LjhjNDEuMSAwIDY2LjYgMyA5MC4yLTE5LjEgMjYuMS0yNCAzMi45LTY2LjcgMTQuMy04OC4xLTkuNy0xMS4yLTI1LjMtMTYuNy00Ni41LTE2LjdsLTcwLjcgMC0zMi43IDE2OC43ek0yODMuMSAxMzYuN2wzNi41IDAtOC43IDQ0LjhjMzEuNSAwIDYwLjctMi4zIDc0LjggMTAuNyAxNC44IDEzLjYgNy43IDMxLTguMyAxMTMuMWwtMzcgMGMxNS40LTc5LjQgMTguMy04NiAxMi43LTkyLTUuNC01LjgtMTcuNy00LjYtNDcuNC00LjZsLTE4LjggOTYuNi0zNi41IDAgMzIuNy0xNjguNnpNNTA1IDI0Mi41Yy04IDQxLjEtMzYuNyAzNi4zLTcwLjEgMzYuM2wxMy43LTcwLjZjMzguMiAwIDYzLjgtNC4xIDU2LjQgMzQuM3pNMzg0LjIgMzUwLjNsMzYuOCAwIDguNy00NC44YzQzLjIgMCA2Ny4xIDIuNSA5MC4yLTE5LjEgMjYuMS0yNCAzMi45LTY2LjcgMTQuMy04OC4xLTkuNy0xMS4yLTI1LjMtMTYuNy00Ni41LTE2LjdsLTcwLjcgMC0zMi44IDE2OC43eiJdCiAgICB9OwogICAgZmFEaXNxdXMgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZGlzcXVzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU3ZDUiLCAiTTI5MC4yIDUxMmMtNjIuNiAwLTExOS45LTIyLjktMTY0LjItNjAuOEwxNyA0NjYuMSA1OS4xIDM2Mi4yYy0xNC43LTMyLjQtMjIuOS02OC4zLTIyLjktMTA2LjIgMC0xNDEuNCAxMTMuNy0yNTYgMjU0LTI1NiAxNDAuMyAwIDI1NCAxMTQuNiAyNTQgMjU2IDAgMTQxLjQtMTEzLjcgMjU2LTI1NCAyNTZ6TTQyOC45IDI1NS4zbDAtLjdDNDI4LjkgMTgwLjcgMzc2LjggMTI4IDI4NyAxMjhsLTk3IDAgMCAyNTYgOTUuNiAwYzkwLjUgMCAxNDMuNC01NC45IDE0My40LTEyOC43ek0yODggMzIxLjFsLTI4LjQgMCAwLTEzMC4yIDI4LjQgMGM0MS43IDAgNjkuMyAyMy44IDY5LjMgNjQuN2wwIC43YzAgNDEuMy0yNy43IDY0LjctNjkuMyA2NC43eiJdCiAgICB9OwogICAgZmE1MDBweCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICI1MDBweCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMjZlIiwgIk03MS44IDM0NC4zYy02LjUtMTQuMi02LjktMTguMyA3LjQtMjMuMSAyNS42LTggOCA5LjIgNDMuMiA0OS4ybC4zIDAgMC05My45YzEuMi01MC4yIDQ0LTkyLjIgOTcuNy05Mi4yIDUzLjkgMCA5Ny43IDQzLjUgOTcuNyA5Ni44IDAgNjMuNC02MC44IDExMy4yLTEyOC41IDkzLjMtMTAuNS00LjItMi4xLTMxLjcgOC41LTI4LjYgNTMgMCA4OS40LTEwLjEgODkuNC02NC40IDAtNjEtNzcuMS04OS42LTExNi45LTQ0LjYtMjMuNSAyNi40LTE3LjYgNDIuMS0xNy42IDE1Ny42IDUwLjcgMzEgMTE4LjMgMjIgMTYwLjQtMjAuMSAyNC44LTI0LjggMzguNS01OCAzOC41LTkzIDAtMzUuMi0xMy44LTY4LjItMzguOC05My4zLTI0LjgtMjQuOC01Ny44LTM4LjUtOTMuMy0zOC41UzE1MSAxNjMuMyAxMjYuMyAxODhjLS4zIC4zLTE2IDE2LjUtMjEuMiAyMy45bC0uNSAuNmMtMy4zIDQuNy02LjMgOS4xLTIwLjEgNi4xLTYuOS0xLjctMTQuMy01LjgtMTQuMy0xMS44TDcwLjIgMjBjMC01IDMuOS0xMC41IDEwLjUtMTAuNUwzMjIgOS41YzguMyAwIDguMyAxMS42IDguMyAxNS4xIDAgMy45IDAgMTUuMS04LjMgMTUuMWwtMjIzLjIgMCAwIDEzMi45IC4zIDBjMTA0LjItMTA5LjggMjgyLjgtMzYgMjgyLjggMTA4LjkgMCAxNzguMS0yNDQuOCAyMjAuMy0zMTAuMSA2Mi44ek0xMzUuMSA4My41Yy0uNSA0LjIgNC42IDI0LjUgMTQuNiAyMC42IDEyNC44LTQ3LjUgMjAyLjggNDAuNCAyMDkuNCA0MC40IDQuOCAwIDIyLjgtMTUuMyAxNC4zLTIyLjgtOTMuMi04OS0yMzQuNS01Ny0yMzguMy0zOC4yek0zNjEuNSA0MTQuN2MtMTEwIDEwOS45LTI5OSA2MC44LTMzMi0xMDQuMiAwLTEyLjItMzAuNC03LjQtMjguOSAzLjMgMjQgMTczLjQgMjQ2IDI1Ni45IDM4MS42IDEyMS4zIDYuOS03LjgtMTIuNi0yOC40LTIwLjctMjAuNHpNMTgyLjEgMzA2LjZjMCA0IDQuMyA3LjMgNS41IDguNSAzIDMgNi4xIDQuNCA4LjUgNC40IDMuOCAwIDIuNiAuMiAyMi4zLTE5LjUgMTkuNiAxOS4zIDE5LjEgMTkuNSAyMi4zIDE5LjUgNS40IDAgMTguNS0xMC40IDEwLjctMTguMmwtMTcuMy0xNy4zIDE4LjItMTguMmM2LjMtNi44LTEwLjEtMjEuOC0xNi4yLTE1LjdMMjE4LjIgMjY4Yy0xOC42LTE4LjgtMTguNC0xOS41LTIxLjUtMTkuNS01IDAtMTggMTEuNy0xMi40IDE3LjNMMjAyLjUgMjg0Yy0xOC4xIDE3LjktMjAuNCAxOS4yLTIwLjQgMjIuNnoiXQogICAgfTsKICAgIGZhQWZmaWxpYXRldGhlbWUgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYWZmaWxpYXRldGhlbWUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjM2YiIsICJNMTU5LjcgMjM3LjRDMTA4LjQgMzA4LjMgNDMuMSAzNDguMiAxNCAzMjYuNi0xNS4yIDMwNC45IDIuOCAyMzAgNTQuMiAxNTkuMSAxMDUuNSA4OC4yIDE3MC44IDQ4LjMgMTk5LjkgNjkuOXMxMS4xIDk2LjYtNDAuMiAxNjcuNXptMzUxLjItNTcuM2MtNzMuOCAxMjMuNC0xOTEuOSAxODcuNy0yNjQuNSAxNDMuNi0yNS0xNS4yLTQxLjMtNDEuMi00OS03My44LTMzLjYgNjQuOC05Mi44IDExMy44LTE2NC4xIDEzMy4yIDQ5LjggNTkuMyAxMjQuMSA5Ni45IDIwNyA5Ni45IDE1MCAwIDI3MS42LTEyMy4xIDI3MS42LTI3NC45IC4xLTguNS0uMy0xNi44LTEtMjV6Il0KICAgIH07CiAgICBmYVJlZFJpdmVyID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInJlZC1yaXZlciIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmM2UzIiwgIk0zNTMuMiAzMkw5NC44IDMyQzQyLjQgMzIgMCA3NC40IDAgMTI2LjhMMCAzODUuMkMwIDQzNy42IDQyLjQgNDgwIDk0LjggNDgwbDI1OC40IDBjNTIuNCAwIDk0LjgtNDIuNCA5NC44LTk0LjhsMC0yNTguNEM0NDggNzQuNCA0MDUuNiAzMiAzNTMuMiAzMnpNMTQ0LjkgMjAwLjlsMCA1Ni4zYzAgMjctMjEuOSA0OC45LTQ4LjkgNDguOWwwLTE1NC4yYzAtMTMuMiAxMC43LTIzLjkgMjMuOS0yMy45bDE1NC4yIDBjMCAyNy0yMS45IDQ4LjktNDguOSA0OC45bC01Ni4zIDBjLTEyLjMtLjYtMjQuNiAxMS42LTI0IDI0em0xNzYuMyA3MmwtNTYuMyAwYy0xMi4zLS42LTI0LjYgMTEuNi0yNCAyNGwwIDU2LjNjMCAyNy0yMS45IDQ4LjktNDguOSA0OC45bDAtMTU0LjJjMC0xMy4yIDEwLjctMjMuOSAyMy45LTIzLjlsMTU0LjIgMGMwIDI3LTIxLjkgNDguOS00OC45IDQ4Ljl6Il0KICAgIH07CiAgICBmYVR3aXR0ZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidHdpdHRlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMDk5IiwgIk00NTkuNCAxNTEuN2MuMyA0LjUgLjMgOS4xIC4zIDEzLjYgMCAxMzguNy0xMDUuNiAyOTguNi0yOTguNiAyOTguNi01OS41IDAtMTE0LjctMTcuMi0xNjEuMS00Ny4xIDguNCAxIDE2LjYgMS4zIDI1LjMgMS4zIDQ5LjEgMCA5NC4yLTE2LjYgMTMwLjMtNDQuOC00Ni4xLTEtODQuOC0zMS4yLTk4LjEtNzIuOCA2LjUgMSAxMyAxLjYgMTkuOCAxLjYgOS40IDAgMTguOC0xLjMgMjcuNi0zLjYtNDguMS05LjctODQuMS01Mi04NC4xLTEwM2wwLTEuM2MxNCA3LjggMzAuMiAxMi43IDQ3LjQgMTMuMy0yOC4zLTE4LjgtNDYuOC01MS00Ni44LTg3LjQgMC0xOS41IDUuMi0zNy40IDE0LjMtNTMgNTEuNyA2My43IDEyOS4zIDEwNS4zIDIxNi40IDEwOS44LTEuNi03LjgtMi42LTE1LjktMi42LTI0IDAtNTcuOCA0Ni44LTEwNC45IDEwNC45LTEwNC45IDMwLjIgMCA1Ny41IDEyLjcgNzYuNyAzMy4xIDIzLjctNC41IDQ2LjUtMTMuMyA2Ni42LTI1LjMtNy44IDI0LjQtMjQuNCA0NC44LTQ2LjEgNTcuOCAyMS4xLTIuMyA0MS42LTguMSA2MC40LTE2LjItMTQuMyAyMC44LTMyLjIgMzkuMy01Mi42IDU0LjN6Il0KICAgIH07CiAgICBmYUZvcnRBd2Vzb21lID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImZvcnQtYXdlc29tZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjg2IiwgIk00ODkuNSAyODcuOWwtMjcuNCAwYy0yLjYgMC00LjYgMi00LjYgNC42bDAgMzItMzYuNiAwIDAtMTc4LjNjMC0yLjYtMi00LjYtNC42LTQuNmwtMjcuNCAwYy0yLjYgMC00LjYgMi00LjYgNC42bDAgMzItMzYuNiAwIDAtMzJjMC0yLjYtMi00LjYtNC42LTQuNmwtMjcuNCAwYy0yLjYgMC00LjYgMi00LjYgNC42bDAgMzItMzYuNiAwIDAtMzJjMC02LTgtNC42LTExLjctNC42bDAtMzhjOC4zLTIgMTcuMS0zLjQgMjUuNy0zLjQgMTAuOSAwIDIwLjkgNC4zIDMxLjQgNC4zIDQuNiAwIDI3LjctMS4xIDI3LjctOGwwLTYwYzAtMi42LTItNC42LTQuNi00LjYtNS4xIDAtMTUuMSA0LjMtMjQgNC4zLTkuNyAwLTIwLjktNC4zLTMyLjYtNC4zLTggMC0xNiAxLjEtMjMuNyAyLjlsMC00LjljNS40LTIuNiA5LjEtOC4zIDkuMS0xNC4zIDAtMjAuNy0zMS40LTIwLjgtMzEuNCAwIDAgNiAzLjcgMTEuNyA5LjEgMTQuM2wwIDExMS43Yy0zLjcgMC0xMS43LTEuNC0xMS43IDQuNmwwIDMyLTM2LjYgMCAwLTMyYzAtMi42LTItNC42LTQuNi00LjZsLTI3LjQgMGMtMi42IDAtNC42IDItNC42IDQuNmwwIDMyLTM2LjMgMCAwLTMyYzAtMi42LTItNC42LTQuNi00LjZsLTI3LjQgMGMtMi42IDAtNC42IDItNC42IDQuNmwwIDE3OC4zLTM2LjYgMCAwLTMyYzAtMi42LTItNC42LTQuNi00LjZsLTI3LjQgMGMtMi42IDAtNC42IDItNC42IDQuNmwwIDIxOS41IDE4Mi45IDAgMC05NmMwLTcyLjYgMTA5LjctNzIuNiAxMDkuNyAwbDAgOTYgMTgyLjkgMCAwLTIxOS41Yy4xLTIuNi0xLjktNC42LTQuNS00LjZ6bS0yODguMS00LjVjMCAyLjYtMiA0LjYtNC42IDQuNmwtMjcuNCAwYy0yLjYgMC00LjYtMi00LjYtNC42bDAtNjRjMC0yLjYgMi00LjYgNC42LTQuNmwyNy40IDBjMi42IDAgNC42IDIgNC42IDQuNmwwIDY0em0xNDYuNCAwYzAgMi42LTIgNC42LTQuNiA0LjZsLTI3LjQgMGMtMi42IDAtNC42LTItNC42LTQuNmwwLTY0YzAtMi42IDItNC42IDQuNi00LjZsMjcuNCAwYzIuNiAwIDQuNiAyIDQuNiA0LjZsMCA2NHoiXQogICAgfTsKICAgIGZhTWl4ZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibWl4ZXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTA1NiIsICJNODIuNiA3Ni4xYy0zLjgtNS4xLTguNy05LjQtMTQuMi0xMi41cy0xMS43LTUuMS0xOC4xLTUuNy0xMi44IC4xLTE4LjggMi4yLTExLjYgNS4zLTE2LjMgOS42Yy0xNy42IDE2LjItMTkgNDMuNS00LjggNjIuOGw5MS44IDEyMy05Mi4zIDEyNC4xYy0xNC4yIDE5LjMtMTMuMSA0Ni42IDQuNyA2Mi44IDQuNyA0LjMgMTAuMyA3LjYgMTYuMyA5LjZzMTIuNSAyLjggMTguOCAyLjIgMTIuNS0yLjUgMTguMS01LjcgMTAuNC03LjQgMTQuMi0xMi41TDIxMC45IDI2Mi43YzEuNS0yLjEgMi4zLTQuNiAyLjMtNy4xcy0uOC01LTIuMy03LjFMODIuNiA3Ni4xek00MzguMiAzNzkuNmwtOTIuMy0xMjQuMSA5MS44LTEyM2MxNC4yLTE5LjIgMTIuOC00Ni42LTQuNy02Mi44LTQuNy00LjMtMTAuMy03LjYtMTYuMy05LjZzLTEyLjUtMi44LTE4LjgtMi4yLTEyLjUgMi41LTE4LjEgNS43LTEwLjQgNy40LTE0LjIgMTIuNWwtMTI4IDE3Mi4xYy0xLjUgMi4xLTIuMyA0LjYtMi4zIDcuMXMuOCA1IDIuMyA3LjFMMzY2IDQzNS45YzMuOCA1LjEgOC43IDkuNCAxNC4yIDEyLjVzMTEuNyA1LjEgMTguMSA1LjcgMTIuOC0uMSAxOC44LTIuMiAxMS42LTUuMyAxNi4zLTkuNmMxNy44LTE2LjIgMTktNDMuNSA0LjctNjIuOHoiXQogICAgfTsKICAgIGZhTHlmdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJseWZ0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzYzMiLCAiTTAgODEuMWw3Ny44IDAgMCAyMDguN2MwIDMzLjEgMTUgNTIuOCAyNy4yIDYxLTEyLjcgMTEuMS01MS4yIDIwLjktODAuMi0yLjgtMTctMTQtMjQuOC0zNy4zLTI0LjgtNTlMMCA4MS4xek00ODUuOSAyNTQuNmwwLTIyIDIzLjggMCAwLTc2LjgtMjYuMSAwYy0xMC4xLTQ2LjMtNTEuMi04MC43LTEwMC4zLTgwLjctNTYuNiAwLTEwMi43IDQ2LTEwMi43IDEwMi43bDAgMTc5LjJjMTYgMi4zIDM1LjQtLjMgNTEuNy0xNCAxNy4xLTE0IDI0LjgtMzcuMiAyNC44LTU5bDAtNi43IDM4LjggMCAwLTc2LjgtMzguOCAwIDAtMjMuM2MwLTM0LjYgNTIuMi0zNC42IDUyLjIgMGwwIDc3LjFjMCA1Ni42IDQ2IDEwMi43IDEwMi43IDEwMi43bDAtNzYuNWMtMTQuNSAwLTI2LjEtMTEuNy0yNi4xLTI1Ljl6bS0yOTQuMy05OWwwIDExM2MwIDE1LjQtMjMuOCAxNS40LTIzLjggMGwwLTExMy03Ni44IDAgMCAxMzIuN2MwIDIzLjggOCA1NCA0NSA2My45IDM3IDkuOCA1OC4yLTEwLjYgNTguMi0xMC42LTIuMSAxMy40LTE0LjUgMjMuMy0zNC45IDI1LjMtMTUuNSAxLjYtMzUuMi0zLjYtNDUtNy44bDAgNzAuM2MyNS4xIDcuNSA1MS41IDkuOCA3Ny42IDQuNyA0Ny4xLTkuMSA3Ni44LTQ4LjQgNzYuOC0xMDAuOGwwLTE3OC4yLTc3LjEgMCAwIC41eiJdCiAgICB9OwogICAgZmFBcHBsZVBheSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhcHBsZS1wYXkiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjQxNSIsICJNMTE2LjkgMTU4LjVjLTcuNSA4LjktMTkuNSAxNS45LTMxLjUgMTQuOS0xLjUtMTIgNC40LTI0LjggMTEuMy0zMi42IDcuNS05LjEgMjAuNi0xNS42IDMxLjMtMTYuMSAxLjIgMTIuNC0zLjcgMjQuNy0xMS4xIDMzLjh6bTEwLjkgMTcuMmMtMTcuNC0xLTMyLjMgOS45LTQwLjUgOS45LTguNCAwLTIxLTkuNC0zNC44LTkuMS0xNy45IC4zLTM0LjUgMTAuNC00My42IDI2LjUtMTguOCAzMi4zLTQuOSA4MCAxMy4zIDEwNi4zIDguOSAxMyAxOS41IDI3LjMgMzMuNSAyNi44IDEzLjMtLjUgMTguNS04LjYgMzQuNS04LjYgMTYuMSAwIDIwLjggOC42IDM0LjggOC40IDE0LjUtLjMgMjMuNi0xMyAzMi41LTI2IDEwLjEtMTQuOCAxNC4zLTI5LjEgMTQuNS0yOS45LS4zLS4zLTI4LTEwLjktMjguMy00Mi45LS4zLTI2LjggMjEuOS0zOS41IDIyLjktNDAuMy0xMi41LTE4LjYtMzItMjAuNi0zOC44LTIxLjF6bTEwMC40LTM2LjJsMCAxOTQuOSAzMC4zIDAgMC02Ni42IDQxLjkgMGMzOC4zIDAgNjUuMS0yNi4zIDY1LjEtNjQuM3MtMjYuNC02NC02NC4xLTY0bC03My4yIDB6TTI1OC41IDE2NWwzNC45IDBjMjYuMyAwIDQxLjMgMTQgNDEuMyAzOC42cy0xNSAzOC44LTQxLjQgMzguOGwtMzQuOCAwIDAtNzcuNHpNNDIwLjcgMzM1LjljMTkgMCAzNi42LTkuNiA0NC42LTI0LjlsLjYgMCAwIDIzLjQgMjggMCAwLTk3YzAtMjguMS0yMi41LTQ2LjMtNTcuMS00Ni4zLTMyLjEgMC01NS45IDE4LjQtNTYuOCA0My42bDI3LjMgMGMyLjMtMTIgMTMuNC0xOS45IDI4LjYtMTkuOSAxOC41IDAgMjguOSA4LjYgMjguOSAyNC41bDAgMTAuOC0zNy44IDIuM2MtMzUuMSAyLjEtNTQuMSAxNi41LTU0LjEgNDEuNSAuMSAyNS4yIDE5LjcgNDIgNDcuOCA0MnptOC4yLTIzLjFjLTE2LjEgMC0yNi40LTcuOC0yNi40LTE5LjYgMC0xMi4zIDkuOS0xOS40IDI4LjgtMjAuNWwzMy42LTIuMSAwIDExYzAgMTguMi0xNS41IDMxLjItMzYgMzEuMnptMTAyLjUgNzQuNmMyOS41IDAgNDMuNC0xMS4zIDU1LjUtNDUuNGw1My4xLTE0OS0zMC44IDAtMzUuNiAxMTUuMS0uNiAwLTM1LjYtMTE1LjEtMzEuNiAwIDUxLjIgMTQxLjktMi44IDguNmMtNC42IDE0LjYtMTIuMSAyMC4zLTI1LjUgMjAuMy0yLjQgMC03LS4zLTguOS0uNWwwIDIzLjRjMS44IC40IDkuMyAuNyAxMS42IC43eiJdCiAgICB9OwogICAgZmFBcnRzdGF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImFydHN0YXRpb24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjc3YSIsICJNMi4xIDM3Ny40bDQzIDc0LjNjNC4zIDguNSAxMC44IDE1LjcgMTguOSAyMC43czE3LjQgNy42IDI3IDcuNmwyODUuNCAwLTU5LjItMTAyLjYtMzE1LjEgMHpNNTAxLjkgMzUwTDMzNS43IDU5LjNjLTQuNC04LjItMTAuOS0xNS4xLTE4LjktMjBTMjk5LjcgMzIgMjkwLjQgMzJsLTg4LjQgMCAyNTcuMyA0NDcuNiA0MC43LTcwLjVjMS45LTMuMiAyMS0yOS43IDItNTkuMXpNMjc1LjIgMzA0LjVsLTExNS41LTIwMC0xMTUuNSAyMDAgMjMxIDB6Il0KICAgIH07CiAgICBmYU5vZGVKcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJub2RlLWpzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzZDMiLCAiTTIyNC41IDUwOGMtNi43IDAtMTMuNS0xLjgtMTkuNC01LjJsLTYxLjctMzYuNWMtOS4yLTUuMi00LjctNy0xLjctOCAxMi4zLTQuMyAxNC44LTUuMiAyNy45LTEyLjcgMS40LS44IDMuMi0uNSA0LjYgLjRsNDcuNCAyOC4xYzEuNyAxIDQuMSAxIDUuNyAwTDQxMiAzNjcuNWMxLjctMSAyLjgtMyAyLjgtNWwwLTIxMy4yYzAtMi4xLTEuMS00LTIuOS01LjFMMjI3LjMgMzcuN2MtMS43LTEtNC0xLTUuNyAwTDM3LjEgMTQ0LjNjLTEuOCAxLTIuOSAzLTIuOSA1LjFsMCAyMTMuMWMwIDIgMS4xIDQgMi45IDQuOWw1MC42IDI5LjJjMjcuNSAxMy43IDQ0LjMtMi40IDQ0LjMtMTguN2wwLTIxMC40YzAtMyAyLjQtNS4zIDUuNC01LjNsMjMuNCAwYzIuOSAwIDUuNCAyLjMgNS40IDUuM2wwIDIxMC41YzAgMzYuNi0yMCA1Ny42LTU0LjcgNTcuNi0xMC43IDAtMTkuMSAwLTQyLjUtMTEuNkwyMC42IDM5Ni4xYy0xMi02LjktMTkuNC0xOS44LTE5LjQtMzMuN2wwLTIxMy4xYzAtMTMuOCA3LjQtMjYuOCAxOS40LTMzLjdMMjA1LjEgOWMxMS43LTYuNiAyNy4yLTYuNiAzOC44IDBMNDI4LjYgMTE1LjdjMTIgNi45IDE5LjQgMTkuOCAxOS40IDMzLjdsMCAyMTMuMWMwIDEzLjgtNy40IDI2LjctMTkuNCAzMy43TDI0My45IDUwMi44Yy01LjkgMy40LTEyLjYgNS4yLTE5LjQgNS4yek0zNzMuNiAyOTcuOWMwLTM5LjktMjctNTAuNS04My43LTU4LTU3LjQtNy42LTYzLjItMTEuNS02My4yLTI0LjkgMC0xMS4xIDQuOS0yNS45IDQ3LjQtMjUuOSAzNy45IDAgNTEuOSA4LjIgNTcuNyAzMy44IC41IDIuNCAyLjcgNC4yIDUuMiA0LjJsMjQgMGMxLjUgMCAyLjktLjYgMy45LTEuN3MxLjUtMi42IDEuNC00LjFjLTMuNy00NC4xLTMzLTY0LjYtOTIuMi02NC42LTUyLjcgMC04NC4xIDIyLjItODQuMSA1OS41IDAgNDAuNCAzMS4zIDUxLjYgODEuOCA1Ni42IDYwLjUgNS45IDY1LjIgMTQuOCA2NS4yIDI2LjcgMCAyMC42LTE2LjYgMjkuNC01NS41IDI5LjQtNDguOSAwLTU5LjYtMTIuMy02My4yLTM2LjYtLjQtMi42LTIuNi00LjUtNS4zLTQuNWwtMjMuOSAwYy0zIDAtNS4zIDIuNC01LjMgNS4zIDAgMzEuMSAxNi45IDY4LjIgOTcuOCA2OC4yIDU4LjQtLjEgOTItMjMuMiA5Mi02My40eiJdCiAgICB9OwogICAgZmFVbmNoYXJ0ZWQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidW5jaGFydGVkIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImUwODQiLCAiTTE3MS44IDIzMi44YzEuMSAwIDIuMS0uMyAzLS45czEuNi0xLjQgMi0yLjRjMi4yLTkuOCA3LjQtMTguNiAxNC45LTI1LjMgMS4yLS44IDEuNy0yLjUgMS43LTQuMS0uMS0uNy0uMy0xLjMtLjYtMS45cy0uOS0xLjEtMS40LTEuNEw3NC41IDEyOC41IDE0OS4xIDg1YzEuNS0uOCAyLjctMiAzLjYtMy41czEuNC0zLjEgMS40LTQuOGMwLTEuNy0uNC0zLjQtMS4zLTQuOXMtMi4yLTIuNy0zLjctMy40TDEyNi43IDU1LjZjLTEuNS0uOC0zLjEtMS4yLTQuOC0xLjJzLTMuMyAuNC00LjggMS4yTDE3IDExMy42Yy0xLjUgLjgtMi43IDItMy42IDMuNXMtMS40IDMuMS0xLjQgNC44TDEyIDIzN2MwIDEuNyAuNCAzLjQgMS4zIDQuOXMyLjIgMi43IDMuNyAzLjRsMjIuNCAxMi44YzEuNSAuOSAzLjIgMS4zIDUgMS4yIDIuNCAuMSA0LjgtLjggNi42LTIuNSAxLjgtMS45IDIuOC00LjQgMi45LTdsMC04NS4zIDExNS45IDY3LjljLjYgLjMgMS40IC40IDIuMSAuNHpNMzIzLjQgMzc3LjdjLTEuNyAuMS0zLjQgLjUtNSAxLjJsLTc0LjUgNDMuMSAwLTEzNC4yYzAtMi45LTIuOS01LjgtNi4yLTQuNi05LjQgMi44LTE5LjUgMy0yOSAuNC0uNy0uMi0xLjUtLjItMi4yLS4xcy0xLjQgLjQtMiAuOS0xLjEgMS0xLjQgMS43LS41IDEuNC0uNSAyLjFsMCAxMzMuMy03NC41LTQzLjFjLTEuNS0uOS0zLjItMS4zLTUtMS4yLTIuNSAwLTQuOSAxLTYuNyAyLjhzLTIuOCA0LjItMi44IDYuN2wwIDI2LjFjMCAxLjcgLjQgMy40IDEuMyA0LjlzMi4yIDIuNyAzLjcgMy40bDEwMC4yIDU3LjZjMS41IC45IDMuMiAxLjMgNSAxLjIgMS43IDAgMy40LS40IDUtMS4ybDEwMC4yLTU3LjZjMS41LS44IDIuNy0yIDMuNi0zLjVzMS40LTMuMSAxLjQtNC44bDAtMjYuMWMtLjgtNC42LTUuNC05LjEtMTAuNC05LjF6TTI4Ni4xIDc4YTIzIDIzIDAgMSAwIDAtNDYgMjMgMjMgMCAxIDAgMCA0NnptNjMuNi0xMC4xYTIzIDIzIDAgMSAwIDAgNDYgMjMgMjMgMCAxIDAgMC00NnptNjMuMiA4My43YTIzIDIzIDAgMSAwIDAtNDYgMjMgMjMgMCAxIDAgMCA0NnptLTYzLjItOS4yYTIzIDIzIDAgMSAwIDAgNDYgMjMgMjMgMCAxIDAgMC00NnptLTYzLjYgODMuMmM0LjUgMCA5LTEuMyAxMi44LTMuOXM2LjctNi4xIDguNS0xMC4zIDIuMi04LjggMS4zLTEzLjMtMy4xLTguNi02LjMtMTEuOC03LjMtNS40LTExLjgtNi4zLTkuMS0uNC0xMy4zIDEuMy03LjggNC43LTEwLjMgOC41LTMuOSA4LjItMy45IDEyLjhjMCAzIC42IDYgMS44IDguOHMyLjkgNS4zIDUgNy41IDQuNyAzLjggNy41IDUgNS44IDEuOCA4LjggMS44bDAgMHpNMjI0IDI2MmM0LjUgMCA5LTEuNCAxMi44LTMuOXM2LjctNi4xIDguNS0xMC4zIDIuMi04LjggMS4zLTEzLjMtMy4xLTguNi02LjMtMTEuOC03LjMtNS40LTExLjgtNi4zLTkuMS0uNC0xMy4zIDEuMy03LjggNC43LTEwLjMgOC41LTMuOSA4LjItMy45IDEyLjhjMCAzIC42IDYgMS43IDguOHMyLjggNS4zIDUgNy41IDQuNyAzLjggNy41IDUgNS44IDEuOCA4LjggMS44bDAgMHptMTg4LjktODIuNGMtNC42IDAtOSAxLjMtMTIuOCAzLjlzLTYuNyA2LjEtOC41IDEwLjMtMi4yIDguOC0xLjMgMTMuMyAzLjEgOC42IDYuMyAxMS44IDcuMyA1LjQgMTEuOCA2LjMgOS4xIC40IDEzLjMtMS4zIDcuOC00LjcgMTAuMy04LjUgMy45LTguMiAzLjktMTIuOGMwLTYuMS0yLjQtMTEuOS02LjctMTYuM3MtMTAuMi02LjctMTYuMy02LjdsMCAwem0wIDcyLjNjLTQuNiAwLTkgMS4zLTEyLjggMy45cy02LjcgNi4xLTguNSAxMC4zLTIuMiA4LjgtMS4zIDEzLjMgMy4xIDguNiA2LjMgMTEuOCA3LjMgNS40IDExLjggNi4zIDkuMSAuNCAxMy4zLTEuMyA3LjgtNC43IDEwLjMtOC41IDMuOS04LjIgMy45LTEyLjhjMC02LjEtMi40LTExLjktNi43LTE2LjNzLTEwLjItNi43LTE2LjMtNi43bDAgMHoiXQogICAgfTsKICAgIGZhUGxheXN0YXRpb24gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAicGxheXN0YXRpb24iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjNkZiIsICJNNTcxIDM3Mi4zYy0xMS4zIDE0LjItMzguOCAyNC4zLTM4LjggMjQuM2wtMjA1LjEgNzMuNiAwLTU0LjMgMTUwLjktNTMuOGMxNy4xLTYuMSAxOS44LTE0LjggNS44LTE5LjQtMTMuOS00LjYtMzkuMS0zLjMtNTYuMiAyLjlsLTEwMC41IDM1LjUgMC01Ni40YzIzLjItNy44IDQ3LjEtMTMuNiA3NS43LTE2LjggNDAuOS00LjUgOTAuOSAuNiAxMzAuMiAxNS41IDQ0LjIgMTQgNDkuMiAzNC43IDM4IDQ4Ljl6TTM0Ni42IDI3OS44bDAtMTM5YzAtMTYuMy0zLTMxLjMtMTguMy0zNS42LTExLjctMy44LTE5IDcuMS0xOSAyMy40bDAgMzQ3LjktOTMuOC0yOS44IDAtNDE0LjdjMzkuOSA3LjQgOTggMjQuOSAxMjkuMiAzNS40IDc5LjUgMjcuMyAxMDYuNCA2MS4zIDEwNi40IDEzNy44IDAgNzQuNS00NiAxMDIuOC0xMDQuNSA3NC42ek00My4zIDQxMC4yYy00NS40LTEyLjgtNTMtMzkuNS0zMi4zLTU0LjggMTkuMS0xNC4yIDUxLjctMjQuOSA1MS43LTI0LjlsMTM0LjUtNDcuOCAwIDU0LjUtOTYuOCAzNC42Yy0xNy4xIDYuMS0xOS43IDE0LjgtNS44IDE5LjRzMzkuMSAzLjMgNTYuMi0yLjlsNDYuNC0xNi45IDAgNDguOGMtNTEuNiA5LjMtMTAxLjQgNy4zLTE1My45LTEweiJdCiAgICB9OwogICAgZmFNaWNyb2Jsb2cgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibWljcm9ibG9nIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImUwMWEiLCAiTTM5OS44IDM2Mi4yYzI5LjUtMzQuNyA0Ny4xLTc4LjMgNDcuMS0xMjUuOCAwLTExMy05OS42LTIwNC40LTIyMi41LTIwNC40UzIgMTIzLjUgMiAyMzYuNCAxMDEuNiA0NDAuOSAyMjQuNSA0NDAuOWMyNyAwIDUzLjktNC41IDc5LjQtMTMuNCAxLjQtLjUgMy0uNSA0LjUtLjFzMi43IDEuNCAzLjYgMi42YzE4LjYgMjUuMSA0Ny42IDQyLjcgNzkuOSA0OS45IDEuMSAuMiAyLjMgMCAzLjMtLjZzMS43LTEuNiAxLjktMi44Yy4xLS42IC4xLTEuMyAwLTEuOXMtLjQtMS4yLS44LTEuN2MtMTIuMy0xNi0xOC43LTM1LjgtMTgtNTZzOC40LTM5LjUgMjEuNy01NC43bC0uMiAuMXpNMzMwIDIxMi40bC01Ny4zIDQzLjUgMjAuOCA2OC45Yy40IDEuMyAuNCAyLjctLjEgNHMtMS4yIDIuNC0yLjMgMy4yLTIuNCAxLjItMy44IDEuMi0yLjctLjQtMy44LTEuMmwtNTkuMS00MS01OS4xIDQxLjFjLTEuMSAuOC0yLjQgMS4yLTMuOCAxLjJzLTIuNy0uNC0zLjgtMS4yLTEuOS0xLjktMi4zLTMuMi0uNS0yLjctLjEtNGwyMC44LTY4LjktNTcuMy00My41Yy0xLjEtLjgtMS45LTEuOS0yLjMtMy4ycy0uNC0yLjcgMC00IDEuMi0yLjQgMi4zLTMuMiAyLjQtMS4zIDMuNy0xLjNsNzEuOS0xLjUgMjMuNy02Ny45Yy40LTEuMyAxLjMtMi40IDIuNC0zLjJzMi40LTEuMiAzLjgtMS4yIDIuNyAuNCAzLjggMS4yIDEuOSAxLjkgMi40IDMuMmwyMy43IDY3LjkgNzEuOSAxLjVjMS40IDAgMi43IC40IDMuOCAxLjJzMS45IDEuOSAyLjMgMy4yIC40IDIuNyAwIDQtMS4yIDIuNC0yLjMgMy4zbDAgMHoiXQogICAgfTsKICAgIGZhR2l0a3Jha2VuID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImdpdGtyYWtlbiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmM2E2IiwgIk01NTcuNyAxMTguMWMtMi4zLTYuMS05LjMtOS4yLTE1LjMtNi42LTUuNyAyLjQtOC41IDguOS02LjMgMTQuNiAxMC45IDI5IDE2LjkgNjAuNSAxNi45IDkzLjMgMCAxMzQuNi0xMDAuMyAyNDUuNy0yMzAuMiAyNjIuN2wwLTEyMy43YzcuOS0xLjUgMTUuNS0zLjYgMjMtNi4ybDAgMTA0YzEwNi43LTI1LjkgMTg1LjktMTIyLjEgMTg1LjktMjM2LjggMC05MS44LTUwLjgtMTcxLjgtMTI1LjgtMjEzLjMtNS43LTMuMi0xMy0uOS0xNS45IDUtMi43IDUuNS0uNiAxMi4yIDQuNyAxNS4xIDY3LjkgMzcuNiAxMTMuOSAxMTAgMTEzLjkgMTkzLjIgMCA5My4zLTU3LjkgMTczLjEtMTM5LjggMjA1LjRsMC05Mi4yYzE0LjItNC41IDI0LjktMTcuNyAyNC45LTMzLjUgMC0xMy4xLTYuOC0yNC40LTE3LjMtMzAuNSA4LjMtNzkuNSA0NC41LTU4LjYgNDQuNS04My45bDAtMTQuN2MwLTM4LTg3LjktMTYxLjgtMTI5LTE2NC43LTIuNS0uMi01LS4yLTcuNiAwLTQxLjIgMy0xMjkuMSAxMjYuNy0xMjkuMSAxNjQuN2wwIDE0LjhjMCAyNS4zIDM2LjMgNC4zIDQ0LjUgODMuOS0xMC42IDYuMS0xNy4zIDE3LjQtMTcuMyAzMC41IDAgMTUuOCAxMC42IDI5IDI0LjggMzMuNWwwIDkyLjJjLTgxLjktMzIuMi0xMzkuOC0xMTItMTM5LjgtMjA1LjQgMC04My4xIDQ2LTE1NS41IDExMy45LTE5My4yIDUuNC0zIDcuNC05LjYgNC43LTE1LjEtMi45LTUuOS0xMC4xLTguMi0xNS45LTUtNzUgNDEuNS0xMjUuOCAxMjEuNS0xMjUuOCAyMTMuMyAwIDExNC43IDc5LjIgMjEwLjggMTg1LjkgMjM2LjhsMC0xMDRjNy42IDIuNSAxNS4xIDQuNiAyMyA2LjJsMCAxMjMuN2MtMTI5LjgtMTctMjMwLjItMTI4LjEtMjMwLjItMjYyLjcgMC0zMi44IDYtNjQuMyAxNi45LTkzLjMgMi4yLTUuOC0uNi0xMi4yLTYuMy0xNC42LTYtMi42LTEzIC40LTE1LjMgNi42LTExLjggMzEuNS0xOC4zIDY1LjYtMTguMyAxMDEuMyAwIDE1NS4xIDEyMi42IDI4MS42IDI3Ni4zIDI4Ny44bDAtMTQ1LjljNi44IC40IDE1IC41IDIzLjQgMGwwIDE0NS44YzE1My43LTYuMSAyNzYuMy0xMzIuNiAyNzYuMy0yODcuNyAwLTM1LjctNi41LTY5LjgtMTguMy0xMDEuNHpNMzU3LjkgMzIyLjlhMjMuNyAyMy43IDAgMSAxIDAtNDcuNCAyMy43IDIzLjcgMCAxIDEgMCA0Ny40ek0yMTguMSAyNzUuNGEyMy43IDIzLjcgMCAxIDEgMCA0Ny40IDIzLjcgMjMuNyAwIDEgMSAwLTQ3LjR6Il0KICAgIH07CiAgICBmYVRlbGVncmFtID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInRlbGVncmFtIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjI0NjIsICJ0ZWxlZ3JhbS1wbGFuZSJdLCAiZjJjNiIsICJNMjU2IDhhMjQ4IDI0OCAwIDEgMCAwIDQ5NiAyNDggMjQ4IDAgMSAwIDAtNDk2ek0zNzEgMTc2LjdjLTMuNyAzOS4yLTE5LjkgMTM0LjQtMjguMSAxNzguMy0zLjUgMTguNi0xMC4zIDI0LjgtMTYuOSAyNS40LTE0LjQgMS4zLTI1LjMtOS41LTM5LjMtMTguNy0yMS44LTE0LjMtMzQuMi0yMy4yLTU1LjMtMzcuMi0yNC41LTE2LjEtOC42LTI1IDUuMy0zOS41IDMuNy0zLjggNjcuMS02MS41IDY4LjMtNjYuNyAuMi0uNyAuMy0zLjEtMS4yLTQuNHMtMy42LS44LTUuMS0uNWMtMi4yIC41LTM3LjEgMjMuNS0xMDQuNiA2OS4xLTkuOSA2LjgtMTguOSAxMC4xLTI2LjkgOS45LTguOS0uMi0yNS45LTUtMzguNi05LjEtMTUuNS01LTI3LjktNy43LTI2LjgtMTYuMyAuNi00LjUgNi43LTkgMTguNC0xMy43IDcyLjMtMzEuNSAxMjAuNS01Mi4zIDE0NC42LTYyLjMgNjguOS0yOC42IDgzLjItMzMuNiA5Mi41LTMzLjggMi4xIDAgNi42IC41IDkuNiAyLjkgMiAxLjcgMy4yIDQuMSAzLjUgNi43IC41IDMuMiAuNiA2LjUgLjQgOS44eiJdCiAgICB9OwogICAgZmFUZWxlZ3JhbVBsYW5lID0gZmFUZWxlZ3JhbTsKICAgIGZhVWx0cmFseXRpY3MgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidWx0cmFseXRpY3MiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTg2ZCIsICJNMzkxLjQgMzkuN2M2NS44LS4yIDExOC42IDUxLjggMTIwLjQgMTE2LjYgLjcgMjYuNC0xLjUgNTQuMS0zLjggNzQuMS0xNy4yIDE0OC42LTEyMi40IDI0Mi0yNTIuNCAyNDItOTUuNC0uMS0xNzkuNC01Mi43LTIyMy4yLTEzMC42IDI0LjQgMTcuNCA1NC41IDI3LjQgODcuNiAyNy40IDgzLjIgLjEgMTUxLjQtNjcuNCAxNTEuMi0xNTBsLjEtNjAuNmMtLjItNjUuNyA1My45LTExOSAxMjAuMS0xMTguOXpNMTE5LjkgMTAwLjJjNjYuMiAwIDExOS45IDUzLjMgMTE5LjkgMTE5UzE4Ni4xIDMzOC4zIDExOS45IDMzOC4zIDAgMjg1IDAgMjE5LjNjMC02NS43IDUzLjctMTE5IDExOS45LTExOXoiXQogICAgfTsKICAgIGZhSXR1bmVzTm90ZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJpdHVuZXMtbm90ZSIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmM2I1IiwgIk0zODEuOSAzODguMmMtNi40IDI3LjQtMjcuMiA0Mi44LTU1LjEgNDgtMjQuNSA0LjUtNDQuOSA1LjYtNjQuNS0xMC4yLTIzLjktMjAuMS0yNC4yLTUzLjQtMi43LTc0LjQgMTctMTYuMiA0MC45LTE5LjUgNzYuOC0yNS44IDYtMS4xIDExLjItMi41IDE1LjYtNy40IDYuNC03LjIgNC40LTQuMSA0LjQtMTYzLjIgMC0xMS4yLTUuNS0xNC4zLTE3LTEyLjMtOC4yIDEuNC0xODUuNyAzNC42LTE4NS43IDM0LjYtMTAuMiAyLjItMTMuNCA1LjItMTMuNCAxNi43IDAgMjM0LjcgMS4xIDIyMy45LTIuNSAyMzkuNS00LjIgMTguMi0xNS40IDMxLjktMzAuMiAzOS41LTE2LjggOS4zLTQ3LjIgMTMuNC02My40IDEwLjQtNDMuMi04LjEtNTguNC01OC0yOS4xLTg2LjYgMTctMTYuMiA0MC45LTE5LjUgNzYuOC0yNS44IDYtMS4xIDExLjItMi41IDE1LjYtNy40IDEwLjEtMTEuNSAxLjgtMjU2LjYgNS4yLTI3MC4yIC44LTUuMiAzLTkuNiA3LjEtMTIuOSA0LjItMy41IDExLjgtNS41IDEzLjQtNS41IDIwNC0zOC4yIDIyOC45LTQzLjEgMjMyLjQtNDMuMSAxMS41LS44IDE4LjEgNiAxOC4xIDE3LjYgLjIgMzQ0LjUgMS4xIDMyNi0xLjggMzM4LjV6Il0KICAgIH07CiAgICBmYUxlc3MgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAibGVzcyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNDFkIiwgIk02MTMuMiAyMTljMC0yMC41IDMuMi0zMi42IDMuMi01NC42IDAtMzQuMi0xMi42LTQ1LjItNDAuNS00NS4ybC0yMC41IDAgMCAyNC4yIDYuMyAwYzE0LjIgMCAxNy4zIDQuNyAxNy4zIDIyLjEgMCAxNi4zLTEuNiAzMi42LTEuNiA1MS41IDAgMjQuMiA3LjkgMzMuNiAyMy42IDM3LjNsMCAxLjZjLTE1LjggMy43LTIzLjYgMTMuMS0yMy42IDM3LjMgMCAxOC45IDEuNiAzNC4yIDEuNiA1MS41IDAgMTcuOS0zLjcgMjIuNi0xNy4zIDIyLjZsMCAuNS02LjMgMCAwIDI1LjIgMjAuNSAwYzI3LjggMCA0MC41LTExIDQwLjUtNDUuMiAwLTIyLjYtMy4yLTM0LjItMy4yLTU0LjYgMC0xMSA2LjgtMjIuNiAyNy4zLTIzLjZsMC0yNy4zYy0yMC41LS43LTI3LjMtMTIuMy0yNy4zLTIzLjN6TTUwNy42IDI1MWMtMTUuOC02LjMtMzAuNS0xMC0zMC41LTIwLjUgMC03LjkgNi4zLTEyLjYgMTcuOS0xMi42czIyLjEgNC43IDMzLjYgMTMuMWwyMS0yNy44Yy0xMy4xLTEwLTMxLTIwLjUtNTUuMi0yMC41LTM1LjcgMC01OS45IDIwLjUtNTkuOSA0OS40IDAgMjUuNyAyMi42IDM4LjkgNDEuNSA0Ni4yIDE2LjMgNi4zIDMyLjEgMTEuNiAzMi4xIDIyLjEgMCA3LjktNi4zIDEzLjEtMjAuNSAxMy4xLTEzLjEgMC0yNi4zLTUuMy00MC41LTE2LjNsLTIxIDMwLjVjMTUuOCAxMy4xIDM5LjkgMjIuMSA1OS45IDIyLjEgNDIgMCA2NC42LTIyLjEgNjQuNi01MXMtMjIuNS00MS00My00Ny44ek0xNDguNyAzMTAuNGMtMy43IDAtOC40LTMuMi04LjQtMTMuMWwwLTE3OC4yLTc0LjYgMGMtMjguNCAwLTQxIDExLTQxIDQ1LjIgMCAyMi42IDMuMiAzNS4yIDMuMiA1NC42IDAgMTEtNi44IDIyLjYtMjcuMyAyMy42bDAgMjcuM2MyMC41IC41IDI3LjMgMTIuMSAyNy4zIDIzLjEgMCAxOS40LTMuMiAzMS0zLjIgNTMuNiAwIDM0LjIgMTIuNiA0NS4yIDQwLjUgNDUuMmwyMC41IDAgMC0yNC4yLTYuMyAwYy0xMy4xIDAtMTcuMy01LjMtMTcuMy0yMi42czEuNi0zMi4xIDEuNi01MS41YzAtMjQuMi03LjktMzMuNi0yMy42LTM3LjNsMC0xLjZjMTUuOC0zLjcgMjMuNi0xMy4xIDIzLjYtMzcuMyAwLTE4LjktMS42LTM0LjItMS42LTUxLjVzMy43LTIyLjEgMTcuMy0yMi4xbDE0LjEgMCAwIDE1MC44YzAgMzIuMSAxMSA1My4xIDQzLjEgNTMuMSAxMCAwIDE3LjktMS42IDIzLjYtMy43bC01LjMtMzQuMmMtMy4xIC44LTQuNiAuOC02LjIgLjh6TTM4MC40IDI1MWMtMTYuMy02LjMtMzEtMTAtMzEtMjAuNSAwLTcuOSA2LjMtMTIuNiAxNy45LTEyLjZzMjIuMSA0LjcgMzMuNiAxMy4xbDIxLTI3LjhjLTEzLjEtMTAtMzEtMjAuNS01NS4yLTIwLjUtMzUuNyAwLTU5LjkgMjAuNS01OS45IDQ5LjQgMCAyNS43IDIyLjYgMzguOSA0MS41IDQ2LjIgMTYuMyA2LjMgMzIuMSAxMS42IDMyLjEgMjIuMSAwIDcuOS02LjMgMTMuMS0yMC41IDEzLjEtMTMuMSAwLTI2LjMtNS4zLTQwLjUtMTYuM2wtMjAuNSAzMC41YzE1LjggMTMuMSAzOS45IDIyLjEgNTkuOSAyMi4xIDQyIDAgNjQuNi0yMi4xIDY0LjYtNTEgLjEtMjguOS0yMi41LTQxLTQzLTQ3Ljh6bS0xNTUtNjguOGMtMzguNCAwLTc1LjEgMzIuMS03NC4xIDgyLjUgMCA1MiAzNC4yIDgyLjUgNzkuMyA4Mi41IDE4LjkgMCAzOS45LTYuOCA1Ni4yLTE3LjlMMjcxIDMwMS41Yy0xMS42IDYuOC0yMi42IDEwLTM0LjIgMTAtMjEgMC0zNy4zLTEwLTQxLjUtMzQuMmw5NS4yIDBjLjUtMy43IDEuNi0xMSAxLjYtMTkuNCAuNi00Mi42LTIyLjYtNzUuNy02Ni43LTc1Ljd6bS0zMCA2Ni4yYzMuMi0yMSAxNS44LTMxIDMwLjUtMzEgMTguOSAwIDI2LjMgMTMuMSAyNi4zIDMxbC01Ni44IDB6Il0KICAgIH07CiAgICBmYUZpcmVmb3ggPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZmlyZWZveCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjY5IiwgIk01MDMuNSAyNDEuNWMtLjEtMS42LS4yLTMuMS0uMi00LjdsMC0uMS0uNC00LjcgMC0uMWMtMS4zLTEzLjktMy43LTI3LjctNy4zLTQxLjIgMC0uMSAwLS4xLS4xLS4ybC0xLjEtNGMtLjEtLjItLjEtLjUtLjItLjYtLjQtMS4yLS43LTIuNS0xLjEtMy43LS4xLS4yLS4xLS42LS4yLS44LS40LTEuMi0uNy0yLjQtMS4xLTMuNS0uMS0uNC0uMi0uNi0uNC0xLS40LTEuMi0uNy0yLjMtMS4yLTMuNWwtLjQtMS4xYy0uNC0xLjEtLjgtMi4zLTEuMi0zLjQtLjEtLjMtLjItLjctLjQtMS0uNS0xLjEtLjgtMi4zLTEuMy0zLjQtLjEtLjItLjItLjYtLjQtLjgtLjUtMS4yLTEtMi4zLTEuNC0zLjUgMC0uMS0uMS0uMi0uMS0uNC0xLjYtMy44LTMuMi03LjctNS0xMS40bC0uNC0uN2MtLjUtMS0uOC0xLjgtMS4zLTIuNi0uMi0uNS0uNS0xLjEtLjctMS42LS40LS44LS44LTEuNi0xLjItMi40LS40LS42LS42LTEuMi0xLTEuOHMtLjgtMS40LTEuMi0yLjNjLS40LS42LS43LTEuMy0xLjEtMS45cy0uOC0xLjQtMS4yLTIuMmMtLjQtLjctLjgtMS40LTEuMi0yLS40LS43LS44LTEuMy0xLjItMnMtLjgtMS4zLTEuMi0yLS44LTEuMy0xLjItMS45LS44LTEuNC0xLjMtMi4yYy0uNC0uNi0uOC0xLjItMS4yLTEuOGwtMS40LTIuMWMtLjQtLjYtLjgtMS4yLTEuMi0xLjgtLjUtLjctMS4xLTEuNi0xLjYtMi4zLS40LS41LS43LTEuMS0xLjEtMS42bC0xLjgtMi41Yy0uNC0uNS0uNi0uOC0xLTEuMy0xLTEuMy0xLjgtMi41LTIuOC0zLjctNy4yLTkuNC0xNS0xOC4zLTIzLjUtMjYuNi01LjctNi0xMS44LTExLjUtMTguMy0xNi43LTQtMy41LTguMi02LjctMTIuNS05LjgtNy43LTUuOC0xNi0xMC44LTI0LjYtMTUuMS0yLjQtMS4zLTQuOC0yLjUtNy4yLTMuNy0xNy43LTguNi0zNi4zLTE1LjItNTUuNC0xOS42LTEuOS0uNC0zLjgtLjgtNS42LTEuMmwtLjEgMGMtMS0uMS0xLjgtLjQtMi44LS41LTEyLjUtMi40LTI1LjItMy43LTM4LTRsLTEwLjYgMGMtMTUuMyAuMi0zMC41IDEuOS00NS41IDUtMzMuNiA3LjEtNjMuMiAyMS4yLTgyLjkgMzktMS4xIDEtMS45IDEuNy0yLjQgMi4ybC0uNSAuNSAuMSAwYzAgMCAuMSAwIC4xIDBzMC0uMSAwLS4xbC0uMSAuMWMuMS0uMSAuMS0uMSAuMi0uMSAxNC42LTguOCAzNC45LTE2IDQ5LjQtMTkuNmw1LjktMS40Yy40LS4xIC44LS4xIDEuMi0uMiAxLjctLjQgMy40LS43IDUuMi0xLjEgLjIgMCAuNi0uMSAuOC0uMSA2NC4yLTExLjcgMTMyLjYgNy41IDE4MC4yIDUzIDEwLjMgOS44IDE5LjMgMjAuOCAyNi45IDMyLjggMzAuNCA0OS4yIDI3LjUgMTExLjEgMy44IDE0Ny42LTM0LjQgNTMtMTExLjQgNzEuMy0xNTkgMjQuOC0xNi0xNS41LTI1LjItMzYuNy0yNS42LTU5LS4yLTEwLjcgMi0yMS4yIDYuMi0zMSAxLjctMy44IDEzLjEtMjUuNyAxOC4yLTI0LjYtMTMuMS0yLjgtMzcuNSAyLjYtNTQuNyAyOC4yLTE1LjQgMjIuOS0xNC41IDU4LjItNSA4My4zLTYtMTIuNC0xMC4xLTI1LjYtMTIuMS0zOS4yLTEyLjItODIuNiA0My4zLTE1MyA5NC4zLTE3MC41LTI3LjUtMjQtOTYuNS0yMi4zLTE0Ny43IDE1LjQtMjkuOSAyMi01MS4yIDUzLjItNjIuNSA5MC40IDEuNy0yMC45IDkuNi01Mi4xIDI1LjgtODMuOS0xNy4yIDguOS0zOSAzNy00OS44IDYyLjktMTUuNiAzNy40LTIxIDgyLjItMTYuMSAxMjQuOCAuNCAzLjIgLjcgNi40IDEuMSA5LjYgMTkuOSAxMTcuMSAxMjIgMjA2LjQgMjQ0LjggMjA2LjQgMTM3LjEgMCAyNDguMy0xMTEuMiAyNDguMy0yNDguNC0uMS00LjUtLjItOS4xLS41LTEzLjV6Il0KICAgIH07CiAgICBmYUthZ2dsZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJrYWdnbGUiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZjVmYSIsICJNMzA0LjIgNTAxLjVMMTU4LjQgMzIwLjMgMjk4LjIgMTg1YzIuNi0yLjcgMS43LTEwLjUtNS4zLTEwLjVsLTY5LjIgMGMtMy41IDAtNyAxLjgtMTAuNSA1LjNsLTEzMi4zIDEzMy43IDAtMzA2YzAtNS0yLjUtNy41LTcuNS03LjVMMjEuNSAwQzE2LjUgMCAxNCAyLjUgMTQgNy41bDAgNDk3YzAgNSAyLjUgNy41IDcuNSA3LjVsNTEuOSAwYzUgMCA3LjUtMi41IDcuNS03LjVsMC0xMDkgMzAuOC0yOS4zIDExMC41IDE0MC42YzMgMy41IDYuNSA1LjMgMTAuNSA1LjNsNjYuOSAwYzMuNSAwIDUuNS0xIDYtM2wtMS40LTcuNnoiXQogICAgfTsKICAgIGZhRmFjZWJvb2tNZXNzZW5nZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZmFjZWJvb2stbWVzc2VuZ2VyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYzOWYiLCAiTTI1Ni42IDhjLTE0MCAwLTI0OC42IDEwMi4zLTI0OC42IDI0MC42IDAgNzIuMyAyOS43IDEzNC44IDc4LjEgMTc3LjkgOC4zIDcuNSA2LjYgMTEuOSA4IDU4LjIgLjEgMy4yIDEgNi40IDIuNiA5LjJzMy45IDUuMiA2LjcgNi45IDUuOSAyLjggOS4xIDMgNi41LS4zIDkuNS0xLjZDMTc0LjkgNDc5IDE3NS42IDQ3Ny4yIDE4NC42IDQ3OS42IDMzNy44IDUyMS44IDUwNCA0MjMuNyA1MDQgMjQ4LjYgNTA0IDExMC4zIDM5Ni42IDggMjU2LjYgOHpNNDA1LjggMTkzLjFsLTczIDExNS42Yy0yLjggNC4zLTYuNCA4LjEtMTAuNiAxMXMtOS4xIDQuOC0xNC4xIDUuOC0xMC4zIC44LTE1LjMtLjQtOS43LTMuNC0xMy44LTYuNGwtNTguMS00My41Yy0yLjYtMS45LTUuOC0zLTktM3MtNi40IDEuMS05IDNsLTc4LjQgNTkuNGMtMTAuNSA3LjktMjQuMi00LjYtMTcuMS0xNS43bDczLTExNS42YzIuOC00LjMgNi40LTguMSAxMC42LTExczkuMS00LjggMTQuMS01LjggMTAuMy0uOCAxNS4zIC40IDkuNyAzLjQgMTMuOSA2LjRsNTguMSA0My41YzIuNiAxLjkgNS44IDMgOSAzczYuNC0xLjEgOS0zbDc4LjQtNTkuNGMxMC40LTggMjQuMSA0LjUgMTcuMSAxNS42eiJdCiAgICB9OwogICAgZmFBdWRpYmxlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImF1ZGlibGUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjM3MyIsICJNNjQwIDE5OS45bDAgNTQtMzIwIDIwMC0zMjAtMTk5LjkgMC01NCAzMjAgMjAwIDMyMC0yMDAuMXptLTE5NC41IDcybDQ3LjEtMjkuNGMtMzcuMi01NS44LTEwMC43LTkyLjYtMTcyLjctOTIuNnMtMTM1LjUgMzYuNy0xNzIuNiA5Mi40bC4zIDBjMi41LTIuMyA1LjEtNC41IDcuNy02LjcgODkuNy03NC40IDIxOS40LTU4LjEgMjkwLjIgMzYuM3pNMjI1LjQgMjkwLjdjMTYuOS0xMS45IDM2LjUtMTguNyA1Ny40LTE4LjcgMzQuNCAwIDY1LjIgMTguNCA4Ni40IDQ3LjZsNDUuNC0yOC40Yy0yMC45LTI5LjktNTUuNi00OS41LTk0LjgtNDkuNS0zOC45IDAtNzMuNCAxOS40LTk0LjQgNDl6TTEwMy42IDE2MS4xQzIzNS40IDU2LjggNDIxLjggODQuNyA1MjEuMSAyMjMuMmwuNyAxIDQ4LjgtMzAuNGMtNTMuNS04MS43LTE0NS44LTEzNS43LTI1MC43LTEzNS43LTEwMy41IDAtMTk2LjYgNTMuNS0yNTAuNSAxMzUuNiA5LjktMTAuNSAyMi43LTIzLjUgMzQuMi0zMi42eiJdCiAgICB9OwogICAgZmFQYXRyZW9uID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInBhdHJlb24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjNkOSIsICJNNDkwIDE1My44Yy0uMS02NS40LTUxLTExOS0xMTAuNy0xMzguMy03NC4yLTI0LTE3Mi0yMC41LTI0Mi45IDEyLjktODUuOCA0MC41LTExMi44IDEyOS4zLTExMy44IDIxNy44LS44IDcyLjggNi40IDI2NC40IDExNC42IDI2NS44IDgwLjMgMSA5Mi4zLTEwMi41IDEyOS41LTE1Mi4zIDI2LjQtMzUuNSA2MC41LTQ1LjUgMTAyLjQtNTUuOSA3Mi0xNy44IDEyMS4xLTc0LjcgMTIxLTE1MGwtLjEgMHoiXQogICAgfTsKICAgIGZhVm52ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInZudiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNDBiIiwgIk0xMDQuOSAzNTJjLTM0LjEgMC00Ni40LTMwLjQtNDYuNC0zMC40TDIuNiAyMTAuMVMtNy44IDE5MiAxMyAxOTJsMzIuOCAwYzEwLjQgMCAxMy4yIDguNyAxOC44IDE4LjFsMzYuNyA3NC41czUuMiAxMy4xIDIxLjEgMTMuMSAyMS4xLTEzLjEgMjEuMS0xMy4xbDM2LjctNzQuNWM1LjYtOS41IDguNC0xOC4xIDE4LjgtMTguMWwzMi44IDBjMjAuOCAwIDEwLjQgMTguMSAxMC40IDE4LjFMMTg2LjQgMzIxLjZTMTc0LjIgMzUyIDE0MCAzNTJsLTM1LjEgMHptMzk1IDBjLTM0LjEgMC00Ni40LTMwLjQtNDYuNC0zMC40TDM5Ny42IDIxMC4xUzM4Ny4yIDE5MiA0MDggMTkybDMyLjggMGMxMC40IDAgMTMuMiA4LjcgMTguOCAxOC4xbDM2LjcgNzQuNXM1LjIgMTMuMSAyMS4xIDEzLjEgMjEuMS0xMy4xIDIxLjEtMTMuMWwzNi44LTc0LjVjNS42LTkuNSA4LjQtMTguMSAxOC44LTE4LjFsMzIuOSAwYzIwLjggMCAxMC40IDE4LjEgMTAuNCAxOC4xTDU4MS41IDMyMS42UzU2OS4zIDM1MiA1MzUuMSAzNTJsLTM1LjIgMHpNMzM3LjYgMTkyYzM0LjEgMCA0Ni40IDMwLjQgNDYuNCAzMC40bDU1LjkgMTExLjVTNDUwLjMgMzUyIDQyOS41IDM1MmwtMzIuOCAwYy0xMC40IDAtMTMuMi04LjctMTguOC0xOC4xbC0zNi43LTc0LjVzLTUuMi0xMy4xLTIxLjEtMTMuMS0yMS4xIDEzLjEtMjEuMSAxMy4xbC0zNi43IDc0LjVjLTUuNiA5LjQtOC40IDE4LjEtMTguOCAxOC4xbC0zMi45IDBjLTIwLjggMC0xMC40LTE4LjEtMTAuNC0xOC4xbDU1LjktMTExLjVTMjY4LjMgMTkyIDMwMi41IDE5MmwzNS4xIDB6Il0KICAgIH07CiAgICBmYVBhZ2VsaW5lcyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwYWdlbGluZXMiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjE4YyIsICJNMzg0LjEgMzEyLjdjLTU1LjEgMTM2LjctMTg3LjEgNTQtMTg3LjEgNTQtNDAuNSA4MS44LTEwNy40IDEzNC40LTE4NC42IDEzNC43LTE2LjEgMC0xNi42LTI0LjQgMC0yNC40IDY0LjQtLjMgMTIwLjUtNDIuNyAxNTcuMi0xMTAuMS00MS4xIDE1LjktMTE4LjYgMjcuOS0xNjEuNi04Mi4yIDEwOS00NC45IDE1OS4xIDExLjIgMTc4LjMgNDUuNSA5LjktMjQuNCAxNy01MC45IDIxLjYtNzkuNyAwIDAtMTM5LjcgMjEuOS0xNDkuNS05OC4xIDExOS4xLTQ3LjkgMTUyLjYgNzYuNyAxNTIuNiA3Ni43IDEuNi0xNi43IDMuMy01Mi42IDMuMy01My40IDAgMC0xMDYuMy03My43LTM4LjEtMTY1LjIgMTI0LjYgNDMgNjEuNCAxNjIuNCA2MS40IDE2Mi40IC41IDEuNiAuNSAyMy44IDAgMzMuNCAwIDAgNDUuMi04OSAxMzYuNC01Ny41LTQuMiAxMzQtMTQxLjkgMTA2LjQtMTQxLjkgMTA2LjQtNC40IDI3LjQtMTEuMiA1My40LTIwIDc3LjUgMCAwIDgzLTkxLjggMTcyLTIweiJdCiAgICB9OwogICAgZmFBbWF6b24gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYW1hem9uIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyNzAiLCAiTTI1Ny43IDE2Mi43Yy00OC43IDEuOC0xNjkuNSAxNS41LTE2OS41IDExNy41IDAgMTA5LjUgMTM4LjMgMTE0IDE4My41IDQzLjIgNi41IDEwLjIgMzUuNCAzNy41IDQ1LjMgNDYuOGw1Ni44LTU2cy0zMi4zLTI1LjMtMzIuMy01Mi44bDAtMTQ3LjFDMzQxLjUgODkgMzE3IDMyIDIyOS4yIDMyIDE0MS4yIDMyIDk0LjUgODcgOTQuNSAxMzYuM2w3My41IDYuOGMxNi4zLTQ5LjUgNTQuMi00OS41IDU0LjItNDkuNSA0MC43LS4xIDM1LjUgMjkuOCAzNS41IDY5LjF6bTAgODYuOGMwIDgwLTg0LjIgNjgtODQuMiAxNy4yIDAtNDcuMiA1MC41LTU2LjcgODQuMi01Ny44bDAgNDAuNnpNMzkzLjcgNDEzYy03LjcgMTAtNzAgNjctMTc0LjUgNjdTMzQuNyA0MDguNSAxMC4yIDM3OWMtNi44LTcuNyAxLTExLjMgNS41LTguMyA3My4zIDQ0LjUgMTg3LjggMTE3LjggMzcyLjUgMzAuMyA3LjUtMy43IDEzLjMgMiA1LjUgMTJ6bTM5LjggMi4yYy02LjUgMTUuOC0xNiAyNi44LTIxLjIgMzEtNS41IDQuNS05LjUgMi43LTYuNS0zLjhzMTkuMy00Ni41IDEyLjctNTVjLTYuNS04LjMtMzctNC4zLTQ4LTMuMi0xMC44IDEtMTMgMi0xNC0uMy0yLjMtNS43IDIxLjctMTUuNSAzNy41LTE3LjUgMTUuNy0xLjggNDEtLjggNDYgNS43IDMuNyA1LjEgMCAyNy4xLTYuNSA0My4xeiJdCiAgICB9OwogICAgZmFFbnZpcmEgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZW52aXJhIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyOTkiLCAiTTAgMzJjNDc3LjYgMCAzNjYuNiAzMTcuMyAzNjcuMSAzNjYuM2w4MC45IDgxLjctMjYgMC03MC40LTcxLjJDMzEyLjYgNDEzIDIyNy4yIDQ0My4zIDEzNy4yIDM3MS44IDQ3IDMwMC4zIDUyIDIxNC43IDAgMzJ6TTc5LjcgNzhjLTQ5LjctMjMuNS01LjIgOS4yLTUuMiA5LjIgNDUuMiAzMS4yIDY2IDczLjcgOTAuMiAxMTkuOSAzMS41IDYwLjIgNzkgMTM5LjcgMTQ0LjIgMTY3LjcgNjUgMjggMzQuMiAxMi41IDYtOC41LTI4LjItMjEuMi02OC4yLTg3LTkxLTEzMC4yLTMxLjctNjAtNjEtMTE4LjYtMTQ0LjItMTU4LjF6Il0KICAgIH07CiAgICBmYUxpbm9kZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJsaW5vZGUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjJiOCIsICJNMzY2LjMgMTg2LjlsLTU5LjUgMzYuOS0uOCAzNi45LTI5LjMtMTkuMy0zOS40IDI0LjNjMi4yIDU1LjIgMi41IDU5LjMgMi41IDU5LjVsLTk3LjIgNjUuNC0xNS4xLTEwNC43IDEwOC4xLTYyLTQwLjItMjYtNzUuNCAzOC41LTIxLTE0My4zIDEyOS00OS40LTkxLjMtNDMuNi0xMjUuNyAzOS40IDI3LjcgMTM0LjkgNDEuOSAzMi43LTMxLjggMTUuMSAyMC45IDEwMS40IDI5LjMgMjcuNy0yMC45IDEyLjYgMTYuOCA3OC44IDY2LjIgNjkuNmMtMTAuOC03NC44LTExLjctNzguNi0xMS43LTc4LjhsNzcuOS01NS4zQzI0NCAzNjUuNCAyNDIuMyAzNjcgMjQyLjMgMzY3bC44IDI0LjMgMzMuNSAyOC41LS44LTc3LjEgNDYuOS0zMy41IDI2LjgtMTguNC0yLjUgMzYgMjUuMSAxNy42IDYuNy03NC42IDU4LjctNDMuNi03MS4yLTM5LjR6Il0KICAgIH07CiAgICBmYUFjY3Vzb2Z0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImFjY3Vzb2Z0IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYzNjkiLCAiTTMyMi4xIDI1MmwwLTEtNTEuMi02NS44cy0xMiAxLjYtMjUgMTUuMWMtOSA5LjMtMjQyLjEgMjM5LjEtMjQzLjQgMjQwLjktNyAxMCAxLjYgNi44IDE1LjcgMS43IC44IDAgMTE0LjUtMzYuNiAxMTQuNS0zNi42IC41LS42LS4xLS4xIC42LS42LS40LTUuMS0uOC0yNi4yLTEtMjcuNy0uNi01LjIgMi4yLTYuOSA3LTguOWw5Mi42LTMzLjhjLjYtLjggODguNS04MS43IDkwLjItODMuM3pNNDgyLjIgMzcyLjFjMTMuMyAxNi4xIDIwLjcgMTMuMyAzMC44IDkuMyAzLjItMS4yIDExNS40LTQ3LjYgMTE3LjgtNDguOSA4LTQuMy0xLjctMTYuNy03LjItMjMuNC0yLjEtMi41LTIwNS4xLTI0NS42LTIwNy4yLTI0OC4zLTkuNy0xMi4yLTE0LjMtMTIuOS0zOC40LTEyLjgtMTAuMiAwLTEwNi44IC41LTExNi41IC42LTE5LjIgLjEtMzIuOS0uMy0xOS4yIDE2LjkgNy43IDkuNSAyMzQuMiAyOTkuNyAyMzkuOSAzMDYuNnptMTUyLjcgMS42Yy0yLjMtLjMtMjQuNi00LjctMzgtNy4yIDAgMC0xMTUgNTAuNC0xMTcuNSA1MS42LTE2IDcuMy0yNi45LTMuMi0zNi43LTE0LjZsLTU3LjEtNzRjLTUuNC0uOS02MC40LTkuNi02NS4zLTkuMy0zLjEgLjItOS42IC44LTE0LjQgMi45LTQuOSAyLjEtMTQ1LjIgNTIuOC0xNTAuMiA1NC43LTUuMSAyLTExLjQgMy42LTExLjEgNy42IC4yIDIuNSAyIDIuNiA0LjYgMy41IDIuNyAuOCAzMDAuOSA2Ny42IDMwOCA2OS4xIDE1LjYgMy4zIDM4LjUgMTAuNSA1My42IDEuNyAyLjEtMS4yIDEyMy44LTc2LjQgMTI1LjgtNzcuOCA1LjQtNCA0LjMtNi44LTEuNy04LjJ6Il0KICAgIH07CiAgICBmYUVybGFuZyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJlcmxhbmciLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjM5ZCIsICJNODcuMiA1My41bC04Ny4yIDAgMCA0MDUgMTAwLjQgMGMtNDkuNy01Mi42LTc4LjgtMTI1LjMtNzguNy0yMTIuMS0uMS03Ni43IDI0LTE0Mi43IDY1LjUtMTkyLjl6bTIzOC4yIDkuN2MtNDUuOSAuMS04NS4xIDMzLjUtODkuMiA4My4ybDE2OS45IDBjLTEuMS00OS43LTM0LjUtODMuMS04MC43LTgzLjJ6bTIzMC43LTkuNmwuMyAwLS4xLS4xLS4yIC4xem0uMyAwYzMxLjQgNDIuNyA0OC43IDk3LjUgNDYuMiAxNjIuNyAuNSA2IC41IDExLjcgMCAyNC4xbC0zNzIuNCAwYy0uMiAxMDkuNyAzOC45IDE5NC45IDEzOC42IDE5NS4zIDY4LjUtLjMgMTE4LTUxIDE1MS45LTEwNi4xbDk2LjQgNDguMmMtMTcuNCAzMC45LTM2LjUgNTcuOC01Ny45IDgwLjhsODAuOCAwIDAtNDA1LTgzLjYgMHoiXQogICAgfTsKICAgIGZhVW5pc29uID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInVuaXNvbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlODU0IiwgIk00MzUuMSAxNjEuN2ExMy45IDEzLjkgMCAxIDEgMTkuNi0xOS43IDEzLjkgMTMuOSAwIDEgMSAtMTkuNiAxOS43ek0zNjkuNyA5Ny44YzEwLjQgMi4xIDIwLjYgNS4yIDMwLjQgOS4yIDYuOCAyLjggMTAuMSAxMC44IDcuMyAxNy43LTIuOCA2LjctMTAuOSAxMC4xLTE3LjYgNy4zLTguMy0zLjQtMTYuOC01LjgtMjUuNy03LjgtOC42LTEuNy0xNy4zLTIuNS0yNi0yLjUtMTkuMyAwLTM3LjEtMTAuMy00Ni43LTI3LTguNy0xNS4xLTIwLjYtMjguOS0zNC43LTM5LjctNTkuMS00NS41LTE0My44LTM0LjMtMTg5LjIgMjUtMi42IDMuMy02LjUgNS4zLTEwLjcgNS4zLTcuNCAwLTEzLjUtNi4xLTEzLjUtMTMuNSAwLTMuMiAxLjItNi4zIDMuMi04LjggMTIuOS0xNi43IDI4LjktMzAuNyA0Ny4xLTQxLjIgNzcuNC00NC44IDE3Ni40LTE4LjIgMjIxLjEgNTkuNCA0LjMgOC4yIDEzLjcgMTMuMyAyMi44IDEzLjUgMTAuOCAwIDIxLjYgMSAzMi4yIDMuMXpNMzUgMjcwYzQuNi04LjIgNC42LTE4LjIgMC0yNi40LTIxLjktMzYuNS0yNy4zLTgyLjMtMTYuMy0xMjMuMiAxLjYtNS45IDYuOS0xMCAxMy0xMCA4LjcgMCAxNS4zIDguNyAxMyAxNy05LjUgMzUuNC0zLjQgNzEgMTMuNyAxMDIuOSA5LjMgMTYuNSA5LjMgMzYuNyAwIDUzLjEtOC43IDE1LjctMTQuOCAzMi40LTE3LjIgNTAuMy05LjcgNzMuOSA0Mi4zIDE0MS43IDExNi4yIDE1MS40IDcuMyAxIDEyLjYgNy45IDExLjYgMTUuMi0xIDcuMy03LjggMTIuNi0xNS4xIDExLjYtMjEuMS0yLjgtNDEuNC05LjctNTkuOC0yMC4zLTc1LjYtNDMuNi0xMDQuOS0xNDUuOC01OS4yLTIyMS41ek0yMTYuOSA1MDljLTcuNCAyLTE1LjEtMi40LTE3LjEtOS44czIuNS0xNSA5LjktMTYuOWM4LjUtMi4yIDE3LjQgNC41IDE3LjQgMTMuNCAwIDYuMi00LjIgMTEuNi0xMC4yIDEzLjN6bTEyMi4zLTkxYy05LjUgMC0xOC40IDUtMjMuMiAxMy4yLTQuOSA5LjQtMTEuNyAxOC4yLTE4LjcgMjYuMmwwIDBjLTcuMSA4LTE0LjggMTUuMi0yMy4yIDIxLjctNS45IDQuNS0xNC40IDMuNC0xOS0yLjVzLTMuNC0xNC40IDIuNS0xOC45YzctNS40IDEzLjUtMTEuNSAxOS40LTE4LjFsMCAwYzUuOS02LjYgMTEuMS0xMy44IDE1LjUtMjEuNiA5LjctMTYuNyAyNy41LTI3IDQ2LjgtMjcgMTcuOCAwIDM1LjQtMy41IDUxLjgtMTAuMyA2OC4zLTI4LjMgMTAxLjEtMTA4LjMgNzMuMi0xNzYuNS0uNi0xLjYtMS0zLjMtMS01IDAtNy40IDYuMS0xMy41IDEzLjUtMTMuNSA1LjQgMCAxMC4zIDMuMiAxMi40IDguMiA4LjIgMTkuNyAxMi40IDQwLjggMTIuNCA2Mi4xIDAgODkuNS03Mi43IDE2Mi4xLTE2Mi40IDE2Mi4xbDAgMHptLTEzLjEtMjY4YzMuOS0uNCA3LjktLjYgMTEuOS0uNiA1OS4zIDAgMTA4LjIgNDguNyAxMDguMiAxMDcuOFMzOTcuMyAzNjUgMzM4IDM2NWMtNCAwLTcuOS0uMi0xMS44LS42LTIyLjItMS43LTQzLjMgMTAuNC01Mi45IDMwLjQtMTcuMiAzOS4xLTU2LjIgNjQuNS05OS4xIDY0LjUtNTkuMyAwLTEwOC4yLTQ4LjctMTA4LjItMTA3LjggMC0yMy4yIDcuNS00NS43IDIxLjQtNjQuMyAxMi4yLTE4LjMgMTIuMS00Mi4zLS40LTYwLjUtMTMuNi0xOC41LTIwLjktNDAuOC0yMC45LTYzLjcgMC01OS4xIDQ4LjgtMTA3LjggMTA4LjItMTA3LjggNDIuOCAwIDgxLjggMjUuNCA5OSA2NC40IDkuNiAyMCAzMC43IDMyLjEgNTIuOSAzMC40ek0xMDYuOCAzOTMuNGMxNC40IDI1LjIgNDEuMSA0MC44IDY5LjggNDAuOCA0NC4yIDAgODAuNi0zNi44IDgwLjYtODEuNnMtMzYuNC04MS42LTgwLjYtODEuNmMtMTQuMiAwLTI4LjEgMy44LTQwLjMgMTAuOS0zOC4zIDIyLjQtNTEuNiA3Mi43LTI5LjUgMTExLjR6TTI2OCAyOThjMTQuNCAyNS4yIDQxLjEgNDAuOCA2OS44IDQwLjggNDQuMiAwIDgwLjYtMzYuOCA4MC42LTgxLjZzLTM2LjQtODEuNi04MC42LTgxLjZjLTE0LjIgMC0yOC4xIDMuOC00MC4zIDEwLjktMzguMyAyMi40LTUxLjYgNzIuNy0yOS41IDExMS40em0tOTEuMi01NC42YzQ0LjIgMCA4MC41LTM2LjggODAuNS04MS42cy0zNi40LTgxLjYtODAuNi04MS42LTgwLjYgMzYuOC04MC42IDgxLjZjMCA0NC43IDM2LjQgODEuNiA4MC42IDgxLjZ6Il0KICAgIH07CiAgICBmYUNjRGlzY292ZXIgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY2MtZGlzY292ZXIiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjFmMiIsICJNNTIwLjQgMTk2LjFjMC03LjktNS41LTEyLjEtMTUuNi0xMi4xbC00LjkgMCAwIDI0LjkgNC43IDBjMTAuMyAwIDE1LjgtNC40IDE1LjgtMTIuOHpNNTI4IDMyTDQ4IDMyQzIxLjUgMzIgMCA1My41IDAgODBMMCA0MzJjMCAyNi41IDIxLjUgNDggNDggNDhsNDgwIDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0zNTJjMC0yNi41LTIxLjUtNDgtNDgtNDh6TTQ4My45IDE3MC45YzIyLjYgMCA1Mi45LTQuMSA1Mi45IDI0LjQgMCAxMi42LTYuNiAyMC43LTE4LjcgMjMuMmwyNS44IDM0LjQtMTkuNiAwLTIyLjItMzIuOC0yLjIgMCAwIDMyLjgtMTYgMCAwLTgyek00MjggMTcxbDQ1LjMgMCAwIDE0LTI5LjMgMCAwIDE4LjIgMjguMyAwIDAgMTMuOC0yOC4zIDAgMCAyMi4yIDI5LjMgMCAwIDEzLjgtNDUuMyAwIDAtODJ6bS02OC43IDBsMjEuOSA1NS4yIDIyLjItNTUuMiAxNy41IDAtMzUuNSA4NC4yLTguNiAwLTM1LTg0LjIgMTcuNSAwem0tNTUuOSA4Ni4yYTQ0LjYgNDQuNiAwIDEgMSAwLTg5LjIgNDQuNiA0NC42IDAgMSAxIDAgODkuMnptLTQ5LjMtODMuMWwwIDE5Yy0yMC4xLTIwLjEtNDYuOC00LjctNDYuOCAxOSAwIDI1IDI3LjUgMzguNSA0Ni44IDE5LjJsMCAxOWMtMjkuNyAxNC4zLTYzLjMtNS43LTYzLjMtMzguMiAwLTMxLjIgMzMuMS01MyA2My4zLTM4em0tOTcuMiA2Ni4zYzExLjQgMCAyMi40LTE1LjMtMy4zLTI0LjQtMTUtNS41LTIwLjItMTEuNC0yMC4yLTIyLjcgMC0yMy4yIDMwLjYtMzEuNCA0OS43LTE0LjNsLTguNCAxMC44Yy0xMC40LTExLjYtMjQuOS02LjItMjQuOSAyLjUgMCA0LjQgMi43IDYuOSAxMi4zIDEwLjMgMTguMiA2LjYgMjMuNiAxMi41IDIzLjYgMjUuNiAwIDI5LjUtMzguOCAzNy40LTU2LjYgMTEuM2wxMC4zLTkuOWMzLjcgNy4xIDkuOSAxMC44IDE3LjUgMTAuOHpNNTUuNCAyNTNsLTIzLjQgMCAwLTgyIDIzLjQgMGMyNi4xIDAgNDQuMSAxNyA0NC4xIDQxLjEgMCAxOC41LTEzLjIgNDAuOS00NC4xIDQwLjl6bTY3LjUgMGwtMTYgMCAwLTgyIDE2IDAgMCA4MnpNNTQ0IDQzM2MwIDguMi02LjggMTUtMTUgMTVsLTQwMSAwYzE4OS42LTM1LjYgMzgyLjctMTM5LjIgNDE2LTE2MGwwIDE0NXpNNzQuMSAxOTEuNmMtNS4yLTQuOS0xMS42LTYuNi0yMS45LTYuNmwtNC4yIDAgMCA1NC4yIDQuMiAwYzEwLjMgMCAxNy0yIDIxLjktNi40IDUuNy01LjIgOC45LTEyLjggOC45LTIwLjdzLTMuMi0xNS41LTguOS0yMC41eiJdCiAgICB9OwogICAgZmFTYWZhcmkgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAic2FmYXJpIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyNjciLCAiTTI3NC43IDI3NC43TDIzNy4zIDIzNy4zIDE2NiAzNDYgMjc0LjcgMjc0Ljd6TTI1NiA4YTI0OCAyNDggMCAxIDAgMCA0OTYgMjQ4IDI0OCAwIDEgMCAwLTQ5NnpNNDExLjggMTgyLjhsMTQuOC02LjFjMS0uNCAyLS42IDMuMS0uNnMyLjEgLjIgMy4xIC42IDEuOCAxIDIuNiAxLjcgMS4zIDEuNiAxLjcgMi42IC42IDIgLjYgMy4xLS4yIDIuMS0uNiAzLjEtMSAxLjktMS43IDIuNi0xLjYgMS4zLTIuNiAxLjdMNDE4IDE5Ny42Yy0yIC44LTQuMiAuOC02LjEgMHMtMy41LTIuNC00LjMtNC4zLS44LTQuMiAwLTYuMSAyLjQtMy41IDQuMy00LjN6TTMxNC40IDk0bDYuMS0xNC44Yy44LTIgMi40LTMuNSA0LjMtNC4zczQuMi0uOCA2LjEgMCAzLjUgMi40IDQuMyA0LjMgLjggNC4yIDAgNi4xbC02LjEgMTQuOGMtLjggMi0yLjQgMy41LTQuMyA0LjNzLTQuMiAuOC02LjEgMGMtMS0uNC0xLjktMS0yLjYtMS43cy0xLjMtMS42LTEuNy0yLjYtLjYtMi0uNi0zLjEgLjItMi4xIC42LTMuMXpNMjU2IDYwYzIuMSAwIDQuMiAuOCA1LjcgMi4zUzI2NCA2NS45IDI2NCA2OGwwIDE2YzAgMi4xLS44IDQuMi0yLjMgNS43cy0zLjUgMi4zLTUuNyAyLjMtNC4yLS44LTUuNy0yLjMtMi4zLTMuNS0yLjMtNS43bDAtMTZjMC0yLjEgLjgtNC4yIDIuMy01LjdTMjUzLjkgNjAgMjU2IDYwek0xODEgNzQuOWMxLS40IDItLjYgMy4xLS42czIuMSAuMiAzLjEgLjYgMS45IDEgMi42IDEuNyAxLjMgMS42IDEuNyAyLjZMMTk3LjYgOTRjLjQgMSAuNyAyIC43IDMuMXMtLjIgMi4xLS42IDMuMS0xIDEuOS0xLjcgMi42LTEuNiAxLjQtMi42IDEuOC0yIC42LTMuMSAuNi0yLjEtLjItMy4xLS42LTEuOS0xLTIuNi0xLjgtMS4zLTEuNy0xLjctMi43bC02LjEtMTQuOGMtLjgtMi0uOC00LjIgMC02LjFzMi40LTMuNSA0LjMtNC4zem0tNjMuNiA0Mi41YzEuNS0xLjUgMy41LTIuMyA1LjctMi4zczQuMiAuOCA1LjcgMi4zTDE0MCAxMjguN2MxLjUgMS41IDIuMyAzLjUgMi4zIDUuNnMtLjggNC4xLTIuMyA1LjZjLTEuNSAxLjUtMy41IDIuMy01LjcgMi4zcy00LjItLjgtNS43LTIuM2wtMTEuMy0xMS4zYy0xLjUtMS41LTIuMy0zLjUtMi4zLTUuNnMuOC00LjEgMi4zLTUuNmwwIDB6TTYwIDI1NmMwLTIuMSAuOC00LjIgMi4zLTUuN1M2NS45IDI0OCA2OCAyNDhsMTYgMGMyLjEgMCA0LjIgLjggNS43IDIuM3MyLjMgMy41IDIuMyA1LjctLjggNC4yLTIuMyA1LjctMy41IDIuMy01LjcgMi4zbC0xNiAwYy0yLjEgMC00LjItLjgtNS43LTIuM1M2MCAyNTguMSA2MCAyNTZ6bTQwLjIgNzMuMmwtMTQuOCA2LjFjLTEgLjQtMiAuNi0zLjEgLjZzLTIuMS0uMi0zLjEtLjYtMS45LTEtMi42LTEuNy0xLjMtMS42LTEuNy0yLjYtLjYtMi0uNi0zLjEgLjItMi4xIC42LTMuMSAxLTEuOSAxLjctMi42IDEuNi0xLjMgMi42LTEuN0w5NCAzMTQuNGMyLS44IDQuMi0uOCA2LjEgMHMzLjUgMi40IDQuMyA0LjMgLjggNC4yIDAgNi4xLTIuNCAzLjUtNC4zIDQuM3ptNC4zLTEzNmMtLjQgMS0xIDEuOS0xLjcgMi42cy0xLjYgMS4zLTIuNiAxLjctMiAuNi0zLjEgLjYtMi4xLS4yLTMuMS0uNmwtMTQuOC02LjFjLTItLjgtMy41LTIuNC00LjMtNC4zcy0uOC00LjIgMC02LjEgMi40LTMuNSA0LjMtNC4zIDQuMi0uOCA2LjEgMGwxNC44IDYuMWMyIC44IDMuNSAyLjQgNC4zIDQuM3MuOCA0LjIgMCA2LjFsMCAwek0xOTcuNiA0MThsLTYuMSAxNC44Yy0uNCAxLTEgMS45LTEuNyAyLjZzLTEuNiAxLjMtMi42IDEuNy0yIC42LTMuMSAuNi0yLjEtLjItMy4xLS42LTEuOS0xLTIuNi0xLjctMS4zLTEuNi0xLjctMi42LS42LTItLjYtMy4xIC4yLTIuMSAuNi0zLjFsNi4xLTE0LjhjLjQtMSAxLTEuOSAxLjctMi43czEuNi0xLjQgMi42LTEuOCAyLS42IDMuMS0uNiAyLjEgLjIgMy4xIC42IDEuOSAxIDIuNiAxLjggMS4zIDEuNyAxLjcgMi42IC42IDIgLjYgMy4xLS4yIDIuMS0uNyAzLjF6TTI2NCA0NDRjMCAyLjEtLjggNC4yLTIuMyA1LjdzLTMuNSAyLjMtNS43IDIuMy00LjItLjgtNS43LTIuMy0yLjMtMy41LTIuMy01LjdsMC0xNmMwLTIuMSAuOC00LjIgMi4zLTUuN3MzLjUtMi4zIDUuNy0yLjMgNC4yIC44IDUuNyAyLjMgMi4zIDMuNSAyLjMgNS43bDAgMTZ6bTY3LTYuOWMtMSAuNC0yIC42LTMuMSAuNnMtMi4xLS4yLTMuMS0uNi0xLjktMS0yLjYtMS43LTEuMy0xLjYtMS43LTIuNkwzMTQuNCA0MThjLS44LTItLjgtNC4yIDAtNi4xczIuNC0zLjUgNC4zLTQuMyA0LjItLjggNi4xIDAgMy41IDIuNCA0LjMgNC4zbDYuMSAxNC44Yy44IDIgLjggNC4yIDAgNi4xcy0yLjQgMy41LTQuMyA0LjN6bTYzLjYtNDIuNWMtMS41IDEuNS0zLjUgMi4zLTUuNyAyLjNzLTQuMi0uOC01LjctMi4zTDM3MiAzODMuM2MtMS41LTEuNS0yLjMtMy41LTIuMy01LjZzLjgtNC4xIDIuMy01LjYgMy41LTIuMyA1LjctMi4zIDQuMiAuOCA1LjcgMi4zbDExLjMgMTEuM2MxLjUgMS41IDIuMyAzLjUgMi4zIDUuNnMtLjggNC4xLTIuMyA1LjZsMCAwek0yODYuMiAyODYuMkwxMTAuMyA0MDEuNyAyMjUuOCAyMjUuOCA0MDEuNyAxMTAuMyAyODYuMiAyODYuMnpNNDM3LjEgMzMxYy0uOCAyLTIuNCAzLjUtNC4zIDQuM3MtNC4yIC44LTYuMSAwbC0xNC44LTYuMWMtMi0uOC0zLjUtMi40LTQuMy00LjNzLS44LTQuMiAwLTYuMWMuNC0xIDEtMS45IDEuNy0yLjZzMS42LTEuMyAyLjYtMS43IDItLjYgMy4xLS42IDIuMSAuMiAzLjEgLjZsMTQuOCA2LjFjMiAuOCAzLjUgMi40IDQuMyA0LjNzLjggNC4yIDAgNi4xem02LjktNjdsLTE2IDBjLTIuMSAwLTQuMi0uOC01LjctMi4zcy0yLjMtMy41LTIuMy01LjcgLjgtNC4yIDIuMy01LjcgMy41LTIuMyA1LjctMi4zbDE2IDBjMi4xIDAgNC4yIC44IDUuNyAyLjNzMi4zIDMuNSAyLjMgNS43LS44IDQuMi0yLjMgNS43LTMuNSAyLjMtNS43IDIuM3oiXQogICAgfTsKICAgIGZhU3BhY2VBd2Vzb21lID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInNwYWNlLWF3ZXNvbWUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTVhYyIsICJNOTYgMjU2bDMyIDAgMCAyNTYtMTI4IDAgMC0xNjAgMzIgMCAwLTMyIDMyIDAgMC0zMiAzMiAwIDAtMzJ6bTQxNiA5NmwwIDE2MC0xMjggMCAwLTI1NiAzMiAwIDAgMzIgMzIgMCAwIDMyIDMyIDAgMCAzMiAzMiAwek0zMjAgNjRsMzIgMCAwIDM4NC0zMiAwIDAtMzItMTI4IDAgMCAzMi0zMiAwIDAtMzg0IDMyIDAgMC0zMiAzMiAwIDAtMzIgNjQgMCAwIDMyIDMyIDAgMCAzMnptLTMyIDY0bC02NCAwIDAgNjQgNjQgMCAwLTY0eiJdCiAgICB9OwogICAgZmFOb2RlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm5vZGUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjQxOSIsICJNMzE2LjMgNDUyYy0yLjEgMC00LjItLjYtNi4xLTEuNkwyOTEgNDM5Yy0yLjktMS42LTEuNS0yLjItLjUtMi41IDMuOC0xLjMgNC42LTEuNiA4LjctNCAuNC0uMiAxLS4xIDEuNCAuMWwxNC44IDguOGMuNSAuMyAxLjMgLjMgMS44IDBMMzc1IDQwOGMuNS0uMyAuOS0uOSAuOS0xLjZsMC02Ni43YzAtLjctLjMtMS4zLS45LTEuNmwtNTcuOC0zMy4zYy0uNS0uMy0xLjItLjMtMS44IDBsLTU3LjggMzMuM2MtLjYgLjMtLjkgMS0uOSAxLjZsMCA2Ni43YzAgLjYgLjQgMS4yIC45IDEuNWwxNS44IDkuMWM4LjYgNC4zIDEzLjktLjggMTMuOS01LjhsMC02NS45YzAtLjkgLjctMS43IDEuNy0xLjdsNy4zIDBjLjkgMCAxLjcgLjcgMS43IDEuN2wwIDY1LjljMCAxMS41LTYuMiAxOC0xNy4xIDE4LTMuMyAwLTYgMC0xMy4zLTMuNmwtMTUuMi04LjdjLTMuNy0yLjItNi4xLTYuMi02LjEtMTAuNWwwLTY2LjdjMC00LjMgMi4zLTguNCA2LjEtMTAuNWw1Ny44LTMzLjRjMy43LTIuMSA4LjUtMi4xIDEyLjEgMGw1Ny44IDMzLjRjMy43IDIuMiA2LjEgNi4yIDYuMSAxMC41bDAgNjYuN2MwIDQuMy0yLjMgOC40LTYuMSAxMC41bC01Ny44IDMzLjRjLTEuNyAxLjEtMy44IDEuNy02IDEuN3pNMzYzIDM4Ni4yYzAtMTIuNS04LjQtMTUuOC0yNi4yLTE4LjItMTgtMi40LTE5LjgtMy42LTE5LjgtNy44IDAtMy41IDEuNS04LjEgMTQuOC04LjEgMTEuOSAwIDE2LjMgMi42IDE4LjEgMTAuNiAuMiAuOCAuOCAxLjMgMS42IDEuM2w3LjUgMGMuNSAwIC45LS4yIDEuMi0uNSAuMy0uNCAuNS0uOCAuNC0xLjMtMS4yLTEzLjgtMTAuMy0yMC4yLTI4LjgtMjAuMi0xNi41IDAtMjYuMyA3LTI2LjMgMTguNiAwIDEyLjcgOS44IDE2LjEgMjUuNiAxNy43IDE4LjkgMS45IDIwLjQgNC42IDIwLjQgOC4zIDAgNi41LTUuMiA5LjItMTcuNCA5LjItMTUuMyAwLTE4LjctMy44LTE5LjgtMTEuNC0uMS0uOC0uOC0xLjQtMS43LTEuNGwtNy41IDBjLS45IDAtMS43IC43LTEuNyAxLjcgMCA5LjcgNS4zIDIxLjMgMzAuNiAyMS4zIDE4LjUgMCAyOS03LjIgMjktMTkuOHptNTQuNS01MC4xYzAgNi4xLTUgMTEuMS0xMS4xIDExLjFzLTExLjEtNS0xMS4xLTExLjFjMC02LjMgNS4yLTExLjEgMTEuMS0xMS4xIDYtLjEgMTEuMSA0LjggMTEuMSAxMS4xem0tMS44IDBjMC01LjItNC4yLTkuMy05LjQtOS4zLTUuMSAwLTkuMyA0LjEtOS4zIDkuM3M0LjIgOS40IDkuMyA5LjRjNS4yLS4xIDkuNC00LjMgOS40LTkuNHptLTQuNSA2LjJsLTIuNiAwYy0uMS0uNi0uNS0zLjgtLjUtMy45LS4yLS43LS40LTEuMS0xLjMtMS4xbC0yLjIgMCAwIDUtMi40IDAgMC0xMi41IDQuMyAwYzEuNSAwIDQuNCAwIDQuNCAzLjMgMCAyLjMtMS41IDIuOC0yLjQgMy4xIDEuNyAuMSAxLjggMS4yIDIuMSAyLjggLjEgMSAuMyAyLjcgLjYgMy4zem0tMi44LTguOGMwLTEuNy0xLjItMS43LTEuOC0xLjdsLTIgMCAwIDMuNSAxLjkgMGMxLjYgMCAxLjktMS4xIDEuOS0xLjh6TTEzNy4zIDE5MWMwLTIuNy0xLjQtNS4xLTMuNy02LjRMNzIuMyAxNDkuM2MtMS0uNi0yLjItLjktMy40LTFsLS42IDBjLTEuMiAwLTIuMyAuNC0zLjQgMUwzLjcgMTg0LjZDMS40IDE4NS45IDAgMTg4LjQgMCAxOTFsLjEgOTVjMCAxLjMgLjcgMi41IDEuOCAzLjJzMi41IC43IDMuNyAwTDQyIDI2OC4zYzIuMy0xLjQgMy43LTMuOCAzLjctNi40bDAtNDQuNGMwLTIuNiAxLjQtNS4xIDMuNy02LjRsMTUuNS04LjljMS4yLS43IDIuNC0xIDMuNy0xczIuNiAuMyAzLjcgMWwxNS41IDguOWMyLjMgMS4zIDMuNyAzLjggMy43IDYuNGwwIDQ0LjRjMCAyLjYgMS40IDUuMSAzLjcgNi40bDM2LjQgMjAuOWMxLjEgLjcgMi42IC43IDMuNyAwIDEuMS0uNiAxLjgtMS45IDEuOC0zLjJsLjItOTV6TTQ3Mi41IDg3LjNsMCAxNzYuNGMwIDIuNi0xLjQgNS4xLTMuNyA2LjRsLTYxLjMgMzUuNGMtMi4zIDEuMy01LjEgMS4zLTcuNCAwbC02MS4zLTM1LjRjLTIuMy0xLjMtMy43LTMuOC0zLjctNi40bDAtNzAuOGMwLTIuNiAxLjQtNS4xIDMuNy02LjRsNjEuMy0zNS40YzIuMy0xLjMgNS4xLTEuMyA3LjQgMGwxNS4zIDguOGMxLjcgMSAzLjktLjMgMy45LTIuMmwwLTk0YzAtMi44IDMtNC42IDUuNS0zLjJsMzYuNSAyMC40YzIuMyAxLjIgMy44IDMuNyAzLjggNi40em0tNDYgMTI4LjljMC0uNy0uNC0xLjMtLjktMS42bC0yMS0xMi4yYy0uNi0uMy0xLjMtLjMtMS45IDBsLTIxIDEyLjJjLS42IC4zLS45IC45LS45IDEuNmwwIDI0LjNjMCAuNyAuNCAxLjMgLjkgMS42bDIxIDEyLjFjLjYgLjMgMS4zIC4zIDEuOCAwbDIxLTEyLjFjLjYtLjMgLjktLjkgLjktMS42bDAtMjQuMyAuMSAwem0yMDkuOC0uN2MyLjMtMS4zIDMuNy0zLjggMy43LTYuNGwwLTE3LjFjMC0yLjYtMS40LTUuMS0zLjctNi40bC02MC45LTM1LjRjLTIuMy0xLjMtNS4xLTEuMy03LjQgMGwtNjEuMyAzNS40Yy0yLjMgMS4zLTMuNyAzLjgtMy43IDYuNGwwIDcwLjhjMCAyLjcgMS40IDUuMSAzLjcgNi40bDYwLjkgMzQuN2MyLjIgMS4zIDUgMS4zIDcuMyAwbDM2LjgtMjAuNWMyLjUtMS40IDIuNS01IDAtNi40TDU1MCAyNDEuNmMtMS4yLS43LTEuOS0xLjktMS45LTMuMmwwLTIyLjJjMC0xLjMgLjctMi41IDEuOS0zLjJsMTkuMi0xMS4xYzEuMS0uNyAyLjYtLjcgMy43IDBMNTkyLjEgMjEzYzEuMSAuNyAxLjkgMS45IDEuOSAzLjJsMCAxNy40YzAgMi44IDMuMSA0LjYgNS42IDMuMmwzNi43LTIxLjN6TTU1OSAyMTljLS40IC4zLS43IC43LS43IDEuMmwwIDEzLjZjMCAuNSAuMyAxIC43IDEuMmwxMS44IDYuOGMuNCAuMyAxIC4zIDEuNCAwTDU4NCAyMzVjLjQtLjMgLjctLjcgLjctMS4ybDAtMTMuNmMwLS41LS4zLTEtLjctMS4ybC0xMS44LTYuOGMtLjQtLjMtMS0uMy0xLjQgMEw1NTkgMjE5ek0zMDQuOCAyNjIuNWwwLTcwLjRjMC0yLjYtMS42LTUuMS0zLjktNi40bC02MS4xLTM1LjJjLTIuMS0xLjItNS0xLjQtNy40IDBsLTYxLjEgMzUuMmMtMi4zIDEuMy0zLjkgMy43LTMuOSA2LjRsMCA3MC40YzAgMi44IDEuOSA1LjIgNCA2LjRsNjEuMiAzNS4yYzIuNCAxLjQgNS4yIDEuMyA3LjQgMGw2MS0zNS4yYzEuOC0xIDMuMS0yLjcgMy42LTQuNyAuMS0uNSAuMi0xLjEgLjItMS43ek0yMzAuNSAxMzcuNmwtLjggLjUgMS4xIDAtLjMtLjV6bTc2LjIgMTMwLjJsLS40LS43IDAgLjkgLjQtLjJ6Il0KICAgIH07CiAgICBmYUNvZGVwZW4gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY29kZXBlbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMWNiIiwgIk01MDIuMyAxNTkuN2wtMjM0LTE1NmMtOC00LjktMTYuNS01LTI0LjYgMGwtMjM0IDE1NmMtNiA0LTkuNyAxMS4xLTkuNyAxOC4zTDAgMzM0YzAgNy4xIDMuNyAxNC4zIDkuNyAxOC4zbDIzNCAxNTZjOCA0LjkgMTYuNSA1IDI0LjYgMGwyMzQtMTU2YzYtNCA5LjctMTEuMSA5LjctMTguM2wwLTE1NmMwLTcuMS0zLjctMTQuMy05LjctMTguM3pNMjc4IDYzLjFsMTcyLjMgMTE0LjktNzYuOSA1MS40LTk1LjQtNjMuNyAwLTEwMi42em0tNDQgMEwyMzQgMTY1LjcgMTM4LjYgMjI5LjQgNjEuNyAxNzggMjM0IDYzLjF6TTQ0IDIxOS4xTDk5LjEgMjU2IDQ0IDI5Mi44IDQ0IDIxOS4xek0yMzQgNDQ4LjhMNjEuNyAzMzQgMTM4LjYgMjgyLjYgMjM0IDM0Ni4zIDIzNCA0NDguOHpNMjU2IDMwOGwtNzcuNy01MiA3Ny43LTUyIDc3LjcgNTItNzcuNyA1MnptMjIgMTQwLjlsMC0xMDIuNiA5NS40LTYzLjcgNzYuOSA1MS40LTE3Mi4zIDExNC45em0xOTAtMTU2bC01NS4xLTM2LjkgNTUuMS0zNi45IDAgNzMuN3oiXQogICAgfTsKICAgIGZhUmF2ZWxyeSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJyYXZlbHJ5IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyZDkiLCAiTTQ5OC42IDIzNC4yYy0xLjItMTAuMy0xLjctMjAuOC0zLjctMzEtMi41LTEyLjQtNS43LTI0LjYtOS42LTM2LjYtNi44LTIwLjktMTcuMi00MC4zLTMwLjktNTcuNS01LjktNy42LTEyLjEtMTQuOC0xOC44LTIxLjctMTQuMS0xNC0zMC0yNi4xLTQ3LjEtMzYuMS0xNy44LTEwLjYtMzYuOC0xOC45LTU2LjctMjQuNy0xMS0zLjEtMjIuMy01LjQtMzMuNS03LjYtNi44LTEuMy0xMy43LTEuNy0yMC42LTIuNS0uMyAwLS42LS40LS45LS42LTEwLjggMC0yMS41IDAtMzIuMyAwLTIuNCAuNC00LjggLjktNy4yIDEuMi0xMS42IDEuMi0yMy4xIDMuNi0zNC4zIDcuMS0xMy44IDQuMS0yNy4xIDkuNi0zOS44IDE2LjQtMTMuMyA3LTI2LjEgMTUuMS0zOC4xIDI0LjItNi4yIDQuNi0xMi4zIDkuNC0xOCAxNC41LTEwLjIgOS4yLTIwLjQgMTguNC0yOS45IDI4LjMtMTIuOCAxMy4zLTI0LjEgMjguMS0zMy42IDQ0LTguNiAxNC0xNS41IDI5LTIwLjUgNDQuNi03LjIgMjIuNy0xMC4zIDQ2LjYtOS4yIDcwLjMgLjYgMTMuNSAyIDI2LjkgNC40IDQwLjIgMy40IDE4LjQgOSAzNi4zIDE2LjcgNTMuMyAxMy42IDI5LjIgMzIuMSA1MS41IDUwLjQgNjcuOSAxMi44IDExLjYgMjYuOCAyMS45IDQxLjggMzAuNiAxNy43IDEwLjQgMzYuNCAxOC45IDU1LjkgMjUuMyAxMy4zIDQuMyAyNi45IDcuNiA0MC42IDkuOCA2LjEgMSAxMi4zIDEuMyAxOC40IDEuOSAuNCAuMSAuOCAuMyAxLjIgLjZsMzIuMyAwYzIuNS0uNCA1LS45IDcuNS0xLjEgMTYuMy0xLjMgMzIuMS01LjMgNDcuNS0xMC43IDE3LjItNS45IDMzLjctMTMuOSA0OS0yMy44IDkuNy02LjQgMTkuNC0xMy4xIDI4LjctMjAuMSA1LjgtNC4zIDExLTkuNSAxNi4zLTE0LjUgNC0zLjcgNy44LTcuNiAxMS41LTExLjUgMTItMTIuNyAyMi42LTI2LjYgMzEuNC00MS42IDkuNS0xNiAxNy40LTMyLjkgMjIuMy01MC45IDIuOS0xMC40IDQuOS0yMSA3LTMxLjcgMS01LjMgMS4zLTEwLjcgMS45LTE2LjEgMC0uMyAuNC0uNiAuNi0uOWwwLTM3LjFjLS4yLS42LS40LTEuMi0uNi0xLjh6bS0xNjEuMS0xLjJzLTE2LjYtMy0yOC41LTNjLTI3LjIgMC0zMy42IDE0LjktMzMuNiAzN2wwIDkzLjctNzMuNSAwIDAtMTkwLjcgNzMuNSAwIDAgMzEuOWM4LjktMjYuOCAyNi44LTM2LjIgNjItMzYuMmwwIDY3LjN6Il0KICAgIH07CiAgICBmYUFsaXBheSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJhbGlwYXkiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjY0MiIsICJNMzc3LjcgMzJMNzAuMyAzMkMzMS40IDMyIDAgNjMuNCAwIDEwMi4zTDAgNDA5LjdDMCA0NDguNiAzMS40IDQ4MCA3MC4zIDQ4MGwzMDcuNSAwYzM4LjUgMCA2OS44LTMxLjEgNzAuMy02OS42LTQ2LTI1LjYtMTEwLjYtNjAuMy0xNzEuNi04OC40LTMyLjEgNDQtODQuMSA4MS0xNDguNiA4MS03MC42IDAtOTMuNy00NS4zLTk3LTc2LjQtNC0zOSAxNC45LTgxLjUgOTkuNS04MS41IDM1LjQgMCA3OS40IDEwLjIgMTI3LjEgMjUgMTYuNS0zMC4xIDI2LjUtNjAuMyAyNi41LTYwLjNsLTE3OC4yIDAgMC0xNi43IDkyLjEgMCAwLTMxLjItMTA5LjQgMCAwLTE5IDEwOS40IDAgMC01MC40IDUwLjkgMCAwIDUwLjQgMTA5LjQgMCAwIDE5LTEwOS40IDAgMCAzMS4yIDg4LjggMHMtMTUuMiA0Ni42LTM4LjMgOTAuOWM0OC45IDE2LjcgMTAwIDM2IDE0OC42IDUyLjdsMC0yMzQuNGMuMi0zOC43LTMxLjItNzAuMy02OS45LTcwLjN6TTQ3LjMgMzIzYzEgMjAuMiAxMC4yIDUzLjcgNjkuOSA1My43IDUyLjEgMCA5Mi42LTM5LjcgMTE3LjktNzIuOS00NC42LTE4LjctODQuNS0zMS40LTEwOS40LTMxLjQtNjcuNCAwLTc5LjQgMzMuMS03OC40IDUwLjZ6Il0KICAgIH07CiAgICBmYUNjQW1leCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJjYy1hbWV4IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYxZjMiLCAiTTAgNDMyYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDQ4MCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMS4xLTYxLjcgMC0zMS45LTM1LjEtMzEuOSAzNS4xLTIwMy43IDAgMC0xNjMuOC02NS44IDAgODEuNy0xODQuNyA3OC42IDAgMjguMSA2My4yIDAtNjMuMiA5Ny4yIDAgMTYuOSA0Ny42IDE3LTQ3LjYgNzUuNSAwIDAtMi40YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4TDQ4IDMyQzIxLjUgMzIgMCA1My41IDAgODBMMCA0MzJ6bTQ0MC40LTIxLjdsNDIuMi00Ni4zIDQyIDQ2LjMgNTEuNCAwLTY4LTcyLjEgNjgtNzIuMS01MC42IDAtNDIgNDYuNy00MS41LTQ2LjctNTEuNCAwIDY3LjUgNzIuNS02Ny40IDcxLjYgMC0zMy4xLTgzIDAgMC0yMi4yIDgwLjkgMCAwLTMyLjMtODAuOSAwIDAtMjIuNCA4MyAwIDAtMzMuMS0xMjIgMCAwIDE0My4yIDE3MS44IDB6bTk2LjMtNzJsMzkuMyA0MS45IDAtODMuMy0zOS4zIDQxLjR6bS0zNi4zLTkybDM2LjktMTAwLjYgMCAxMDAuNiAzOC43IDAgMC0xNDMuMy02MC4yIDAtMzIuMiA4OS4zLTMxLjktODkuMy02MS4yIDAgMCAxNDMuMS02My4yLTE0My4xLTUxLjIgMC02Mi40IDE0My4zIDQzIDAgMTEuOS0yOC43IDY1LjkgMCAxMiAyOC43IDgyLjcgMCAwLTEwMC4zIDM2LjggMTAwLjMgMzQuNCAwek0yODIgMTg1LjRsMTkuNS00Ni45IDE5LjQgNDYuOS0zOC45IDB6Il0KICAgIH07CiAgICBmYVBpZWRQaXBlckFsdCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwaWVkLXBpcGVyLWFsdCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMWE4IiwgIk0yNDQgMjQ2Yy0zLjItMi02LjMtMi45LTEwLjEtMi45LTYuNiAwLTEyLjYgMy4yLTE5LjMgMy43bDEuNyA0LjkgMjcuNy01Ljd6TTM3OS45IDQ0My45Yy0xOSAwLTY0LjEgOS41LTc5LjkgMTkuOGw2LjkgNDUuMWMzNS43IDYuMSA3MC4xIDMuNiAxMDYtOS44LTQuOC0xMC0yMy41LTU1LjEtMzMtNTUuMXpNMzQwLjggMTc3YzYuNiAyLjggMTEuNSA5LjIgMjIuNyAyMi4xIDItMS40IDcuNS01LjIgNy41LTguNiAwLTQuOS0xMS44LTEzLjItMTMuMi0yMyAxMS4yLTUuNyAyNS4yLTYgMzcuNi04LjkgNjguMS0xNi40IDExNi4zLTUyLjkgMTQ2LjgtMTE2LjcgNi4xLTEyLjYgMTEuOC0yNS44IDEyLjQtMzkuOWwtMiAyLjZjLTI4LjQgNTAtMzMgNjMuMi04MS4zIDEwMC0zMS45IDI0LjQtNjkuMiA0MC4yLTEwNi42IDU0LjZsLTYuMy0uMyAwLTIxLjhjLTE5LjYgMS42LTE5LjctMTQuNi0zMS42LTIzLTE4LjcgMjAuNi0zMS42IDQwLjgtNTguOSA1MS4xLTEyLjcgNC44LTE5LjYgMTAtMjUuOSAyMS44IDM0LjktMTYuNCA5MS4yLTEzLjUgOTguOC0xMHpNNTU1LjUgMGwtLjYgMS4xLS4zIC45IC42LS42IC4zLTEuNHpNNDk2LjMgMzgyLjFjLTMzLjktNTYuOS03NS4zLTExOC40LTE1MC0xMTUuNWwtLjMtNmMtMS4xLTEzLjUgMzIuOCAzLjIgMzUuMS0zMWwtMTQuNCA3LjJjLTE5LjgtNDUuNy04LjYtNTQuMy02NS41LTU0LjMtMTQuNyAwLTI2LjcgMS43LTQxLjQgNC42IDIuOSAxOC42IDIuMiAzNi43LTEwLjkgNTAuM2wxOS41IDUuNWMtMS43IDMuMi0yLjkgNi4zLTIuOSA5LjggMCAyMSA0Mi44IDIuOSA0Mi44IDMzLjYgMCAxOC40LTM2LjggNjAuMS01NC45IDYwLjEtOCAwLTUzLjctNTAtNTMuNC02MC4xbC4zLTQuNiA1Mi4zLTExLjVjMTMtMi42IDEyLjMtMjIuNy0yLjktMjIuNy0zLjcgMC00My4xIDkuMi00OS40IDEwLjYtMi01LjItNy41LTE0LjEtMTMuOC0xNC4xLTMuMiAwLTYuMyAzLjItOS41IDQtOS4yIDIuNi0zMSAyLjktMjEuNSAyMC4xTDE1LjkgMjk4LjVjLTUuNSAxLjEtOC45IDYuMy04LjkgMTEuOCAwIDYgNS41IDEwLjkgMTEuNSAxMC45IDggMCAxMzEuMy0yOC40IDE0Ny40LTMyLjIgMi42IDMuMiA0LjYgNi4zIDcuOCA4LjYgMjAuMSAxNC40IDU5LjggODUuOSA3Ni40IDg1LjkgMjQuMSAwIDU4LTIyLjQgNzEuMy00MS45IDMuMi00LjMgNi45LTcuNSAxMi40LTYuOSAuNiAxMy44LTMxLjYgMzQuMi0zMyA0My43LTEuNCAxMC4yLTEgMzUuMi0uMyA0MS4xIDI2LjcgOC4xIDUyLTMuNiA3Ny45LTIuOSA0LjMtMjEgMTAuNi00MS45IDkuOC02My41bC0uMy05LjVjLTEuNC0zNC4yLTEwLjktMzguNS0zNC44LTU4LjYtMS4xLTEuMS0yLjYtMi42LTMuNy00IDIuMi0xLjQgMS4xLTEgNC42LTEuNyA4OC41IDAgNTYuMyAxODMuNiAxMTEuNSAyMjkuOSAzMy4xLTE1IDcyLjUtMjcuOSAxMDMuNS00Ny4yLTI5LTI1LjYtNTIuNi00NS43LTcyLjctNzkuOXpNMzAwLjEgNDI4LjJsMCAyNy4yIDExLjgtMy40LTIuOS0yMy44LTguOSAwek0yMzEuNCAyNzcuOGwyNC4xIDYxLjIgMjEtMTMuOC0zMS4zLTUwLjktMTMuOCAzLjV6bTg0LjQgMTU0LjlsMiAxMi40YzktMS41IDU4LjQtNi42IDU4LjQtMTQuMSAwLTEuNC0uNi0zLjItLjktNC42LTI2LjggMC0zNi45IDMuOC01OS41IDYuM3oiXQogICAgfTsKICAgIGZhTGV0dGVyYm94ZCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJsZXR0ZXJib3hkIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU2MmQiLCAiTTUyMS4zIDEyOEM1ODYuOSAxMjggNjQwIDE4MS4xIDY0MCAyNDYuNlM1ODYuOSAzNjUuMiA1MjEuMyAzNjUuMmMtNDIuNSAwLTc5LjctMjIuMy0xMDAuNy01NS44IDExLjQtMTguMiAxOC0zOS43IDE4LTYyLjhzLTYuNi00NC42LTE4LTYyLjhsLjgtMS4yYzIwLjgtMzIuMyA1Ni44LTUzLjkgOTcuOS01NC42bDIgMHpNMzIwIDEyOGM0Mi41IDAgNzkuNyAyMi4zIDEwMC43IDU1LjgtMTEuNCAxOC4yLTE4IDM5LjctMTggNjIuOHM2LjYgNDQuNiAxOCA2Mi44bC0uOCAxLjJjLTIwLjggMzIuMy01Ni44IDUzLjktOTcuOSA1NC42bC0yIDBjLTQyLjUgMC03OS43LTIyLjMtMTAwLjctNTUuOCAxMS40LTE4LjIgMTgtMzkuNyAxOC02Mi44cy02LjYtNDQuNi0xOC02Mi44bC44LTEuMmMyMC44LTMyLjMgNTYuOC01My45IDk3LjktNTQuNmwyIDB6bS0yMDEuMyAwYzQyLjUgMCA3OS43IDIyLjMgMTAwLjcgNTUuOC0xMS40IDE4LjItMTggMzkuNy0xOCA2Mi44czYuNiA0NC42IDE4IDYyLjhsLS44IDEuMmMtMjAuOCAzMi4zLTU2LjggNTMuOS05Ny45IDU0LjZsLTIgMEM1My4xIDM2NS4xIDAgMzEyLjEgMCAyNDYuNlM1My4xIDEyOCAxMTguNyAxMjh6Il0KICAgIH07CiAgICBmYU9wZXJhID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIm9wZXJhIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyNmEiLCAiTTMyMS45IDMyLjdjLTE3MC4yIDAtMjUyLjYgMjIzLjgtMTQ3LjUgMzU1LjEgMzYuNSA0NS40IDg4LjYgNzUuNiAxNDcuNSA3NS42IDM2LjMgMCA3MC4zLTExLjEgOTkuNC0zMC40LTQzLjggMzkuMi0xMDEuOSA2My0xNjUuMyA2My0zLjkgMC04IDAtMTEuOS0uMy0xMzEuNS02LjEtMjM2LjEtMTE0LjYtMjM2LjEtMjQ3LjcgMC0xMzcgMTExLTI0OCAyNDgtMjQ4bC44IDBjNjMuMSAuMyAxMjAuNyAyNC4xIDE2NC40IDYzLjEtMjktMTkuNC02My4xLTMwLjQtOTkuMy0zMC40ek00MjMuNyA0MzAuNGMtNDAuOSAyNC43LTkwLjcgMjMuNi0xMzItNS44IDU2LjItMjAuNSA5Ny43LTkxLjYgOTcuNy0xNzYuNiAwLTg0LjctNDEuMi0xNTUuOC05Ny40LTE3Ni42IDQxLjgtMjkuMiA5MS4yLTMwLjMgMTMyLjktNSAxMDUuOSA5OC43IDEwNS41IDI2NS43LTEuMiAzNjR6Il0KICAgIH07CiAgICBmYVdlaWJvID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogIndlaWJvIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxOGEiLCAiTTQwNyAxNzcuNmM3LjYtMjQtMTMuNC00Ni44LTM3LjQtNDEuNy0yMiA0LjgtMjguOC0yOC4xLTcuMS0zMi44IDUwLjEtMTAuOSA5Mi4zIDM3LjEgNzYuNSA4NC44LTYuOCAyMS4yLTM4LjggMTAuOC0zMi0xMC4zek0yMTQuOCA0NDYuN2MtMTA2LjMgMC0yMTQuOC01MS40LTIxNC44LTEzNi4zIDAtNDQuMyAyOC05NS40IDc2LjMtMTQzLjcgOTkuNy05OS43IDIwMy4yLTEwMC45IDE3My42LTUuNy00IDEzLjEgMTIuMyA1LjcgMTIuMyA2IDc5LjUtMzMuNiAxNDAuNS0xNi44IDExNCA1MS40LTMuNyA5LjQgMS4xIDEwLjkgOC4zIDEzLjEgMTM1LjcgNDIuMyAzNC44IDIxNS4yLTE2OS43IDIxNS4yek0zNTguNSAzMDAuNGMtNS40LTU1LjctNzguNS05NC0xNjMuNC04NS43LTg0LjggOC42LTE0OC44IDYwLjMtMTQzLjQgMTE2czc4LjUgOTQgMTYzLjQgODUuN2M4NC44LTguNiAxNDguOC02MC4zIDE0My40LTExNnpNMzQ3LjkgMzUuMWMtMjUuOSA1LjYtMTYuOCA0My43IDguMyAzOC4zIDcyLjMtMTUuMiAxMzQuOCA1Mi44IDExMS43IDEyNC03LjQgMjQuMiAyOS4xIDM3IDM3LjQgMTIgMzEuOS05OS44LTU1LjEtMTk1LjktMTU3LjQtMTc0LjN6bS03OC41IDMxMWMtMTcuMSAzOC44LTY2LjggNjAtMTA5LjEgNDYuMy00MC44LTEzLjEtNTgtNTMuNC00MC4zLTg5LjcgMTcuNy0zNS40IDYzLjEtNTUuNCAxMDMuNC00NS4xIDQyIDEwLjggNjMuMSA1MC4yIDQ2IDg4LjV6bS04Ni4zLTMwYy0xMi45LTUuNC0zMCAuMy0zOCAxMi45LTguMyAxMi45LTQuMyAyOCA4LjYgMzQgMTMuMSA2IDMwLjggLjMgMzkuMS0xMi45IDgtMTMuMSAzLjctMjguMy05LjctMzR6bTMyLjYtMTMuNGMtNS4xLTEuNy0xMS40IC42LTE0LjMgNS40LTIuOSA1LjEtMS40IDEwLjYgMy43IDEyLjkgNS4xIDIgMTEuNy0uMyAxNC42LTUuNCAyLjgtNS4yIDEuMS0xMC45LTQtMTIuOXoiXQogICAgfTsKICAgIGZhUmVhZG1lID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInJlYWRtZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNGQ1IiwgIk01MjguMyA0Ni41bC0xMzkuOCAwYy00OC4xIDAtODkuOSAzMy4zLTEwMC40IDgwLjMtMTAuNi00Ny01Mi4zLTgwLjMtMTAwLjQtODAuM0w0OCA0Ni41QzIxLjUgNDYuNSAwIDY4IDAgOTQuNUwwIDM0MC4zYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDg5LjcgMGMxMDIuMiAwIDEzMi43IDI0LjQgMTQ3LjMgNzUgLjcgMi44IDUuMiAyLjggNiAwIDE0LjctNTAuNiA0NS4yLTc1IDE0Ny4zLTc1bDg5LjcgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTI0NS43YzAtMjYuNC0yMS4zLTQ3LjktNDcuNy00OC4xek0yNDIgMzExLjljMCAxLjktMS41IDMuNS0zLjUgMy41bC0xNjAuMyAwYy0xLjkgMC0zLjUtMS41LTMuNS0zLjVsMC0yMi45YzAtMS45IDEuNS0zLjUgMy41LTMuNWwxNjAuNCAwYzEuOSAwIDMuNSAxLjUgMy41IDMuNWwwIDIyLjktLjEgMHptMC02MC45YzAgMS45LTEuNSAzLjUtMy41IDMuNWwtMTYwLjMgMGMtMS45IDAtMy41LTEuNS0zLjUtMy41bDAtMjIuOWMwLTEuOSAxLjUtMy41IDMuNS0zLjVsMTYwLjQgMGMxLjkgMCAzLjUgMS41IDMuNSAzLjVsMCAyMi45LS4xIDB6bTAtNjAuOWMwIDEuOS0xLjUgMy41LTMuNSAzLjVsLTE2MC4zIDBjLTEuOSAwLTMuNS0xLjUtMy41LTMuNWwwLTIyLjljMC0xLjkgMS41LTMuNSAzLjUtMy41bDE2MC40IDBjMS45IDAgMy41IDEuNSAzLjUgMy41bDAgMjIuOS0uMSAwek01MDEuMyAzMTEuOGMwIDEuOS0xLjUgMy41LTMuNSAzLjVsLTE2MC4zIDBjLTEuOSAwLTMuNS0xLjUtMy41LTMuNWwwLTIyLjljMC0xLjkgMS41LTMuNSAzLjUtMy41bDE2MC40IDBjMS45IDAgMy41IDEuNSAzLjUgMy41bDAgMjIuOS0uMSAwem0wLTYwLjljMCAxLjktMS41IDMuNS0zLjUgMy41bC0xNjAuMyAwYy0xLjkgMC0zLjUtMS41LTMuNS0zLjVsMC0yMi45YzAtMS45IDEuNS0zLjUgMy41LTMuNWwxNjAuNCAwYzEuOSAwIDMuNSAxLjUgMy41IDMuNWwwIDIyLjktLjEgMHptMC02MC45YzAgMS45LTEuNSAzLjUtMy41IDMuNWwtMTYwLjMgMGMtMS45IDAtMy41LTEuNS0zLjUtMy41bDAtMjIuOGMwLTEuOSAxLjUtMy41IDMuNS0zLjVsMTYwLjQgMGMxLjkgMCAzLjUgMS41IDMuNSAzLjVsMCAyMi44LS4xIDB6Il0KICAgIH07CiAgICBmYUdvbGFuZyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnb2xhbmciLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTQwZiIsICJNNDAwLjEgMTk0LjhjLTEwLjkgMi44LTE5LjkgNC4zLTI5LjEgNy42LTcuMyAxLjktMTQuNyAzLjktMjMuMiA2LjFsLS42IC4xYy00LjIgMS4yLTQuNiAxLjMtOC41LTMuMi00LjctNS4zLTguMS04LjctMTQuNi0xMS45LTE5LjctOS42LTM4LjctNi44LTU2LjQgNC43LTIxLjIgMTMuNy0zMi4xIDM0LTMxLjggNTkuMiAuMyAyNSAxNy40IDQ1LjUgNDEuMiA0OC45IDIyIDIuOCAzOS44LTQuNiA1My44LTIwLjUgMi4xLTIuNiA0LTUuMyA2LjEtOC4zIC44LTEgMS41LTIuMSAyLjMtMy4zbC02MC4xIDBjLTYuNSAwLTguMS00LTUuOS05LjMgNC05LjcgMTEuNS0yNS45IDE1LjktMzQgLjktMS44IDMuMS01LjggNi45LTUuOGwxMDEuMSAwYzQuNS0xMy40IDExLjgtMjYuOSAyMS42LTM5LjcgMjIuNy0yOS45IDQ5LjMtNDUuNSA4Ny4yLTUyIDMxLjgtNS42IDYxLjctMi41IDg4LjkgMTUuOSAyNC42IDE2LjggMzkuOCAzOS42IDQzLjkgNjkuNSA1LjMgNDIuMS02LjkgNzYuMy0zNi43IDEwNS42LTE5LjcgMjAuOS00NC45IDM0LTczLjkgMzkuOS01LjYgMS0xMS4xIDEuNS0xNi41IDItMi45IC4yLTUuNyAuNS04LjUgLjgtMjguMy0uNi01NC4yLTguNy03Ni0yNy40LTE1LjMtMTMuMy0yNS45LTI5LjYtMzEuMS00OC41LTMuNyA3LjMtOCAxNC40LTE0IDIxLjEtMjEuNiAyOS42LTUwLjkgNDgtODcuOSA1Mi45LTMwLjYgNC4xLTU4LjktMS44LTgzLjktMjAuNS0yMy0xNy41LTM2LjEtNDAuNS0zOS41LTY5LjItNC4xLTM0IDUuOS02NS40IDI2LjQtOTEuMyAyMi4yLTI5IDUxLjUtNDcuNCA4Ny4zLTUzLjkgMjkuMy02LjIgNTcuMy0xLjkgODIuNiAxNS4zIDE2LjUgMTAuOSAyOC4zIDI1LjggMzYuMSA0My45IDEuOSAyLjggLjYgNC40LTMuMSA1LjN6TTQ4LjMgMjAwLjRjLTEuMyAwLTEuNi0uNi0uOS0xLjZsNi42LTguNGMuNi0uOSAyLjItMS41IDMuNC0xLjVsMTExLjMgMGMxLjIgMCAxLjUgLjkgLjkgMS44bC01LjMgOC4xYy0uNiAxLTIuMiAxLjktMy4xIDEuOWwtMTEyLjgtLjN6TTEuMiAyMjkuMWMtMS4yIDAtMS42LS43LS45LTEuNmw2LjUtOC40Yy42LS45IDIuMi0xLjYgMy40LTEuNmwxNDIuMSAwYzEuMiAwIDEuOCAxIDEuNSAxLjlsLTIuNSA3LjVjLS4zIDEuMi0xLjUgMS45LTIuOCAxLjlMMS4yIDIyOS4xem03NC41IDI2LjhjLS42IC45LS4zIDEuOCAuOSAxLjhsNjggLjNjLjkgMCAyLjItLjkgMi4yLTIuMWwuNi03LjVjMC0xLjMtLjYtMi4yLTEuOS0yLjJsLTYyLjMgMGMtMS4yIDAtMi41IC45LTMuMSAxLjlsLTQuNCA3Ljh6bTUwMS41LTE4Yy0uMi0yLjYtLjMtNC44LS43LTctNS42LTMwLjgtMzQtNDguMy02My42LTQxLjQtMjkgNi41LTQ3LjcgMjQuOS01NC41IDU0LjItNS42IDI0LjMgNi4yIDQ4LjkgMjguNiA1OC45IDE3LjIgNy41IDM0LjMgNi42IDUwLjgtMS45IDI0LjYtMTMuNiAzOC0zMi43IDM5LjYtNTkuNS0uMS0xLjItLjEtMi4zLS4yLTMuM3oiXQogICAgfTsKICAgIGZhU3RhY2tFeGNoYW5nZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzdGFjay1leGNoYW5nZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMThkIiwgIk0xOC4xIDMzMi4zbDQxMi43IDAgMCAyMmMwIDM3LjctMjkuMyA2OC02NS4zIDY4bC0xOSAwLTg2LjggODkuNyAwLTg5LjctMTc2LjMgMGMtMzYgMC02NS4zLTMwLjMtNjUuMy02OGwwLTIyem0wLTIzLjZsNDEyLjcgMCAwLTg1LTQxMi43IDAgMCA4NXptMC0xMDkuNGw0MTIuNyAwIDAtODUtNDEyLjcgMCAwIDg1ek0zNjUuNCAwTDgzLjQgMGMtMzYgMC02NS4zIDMwLjMtNjUuMyA2Ny43bDAgMjIuMyA0MTIuNyAwIDAtMjIuM0M0MzAuNyAzMC4zIDQwMS40IDAgMzY1LjQgMHoiXQogICAgfTsKICAgIGZhR3VscCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJndWxwIiwKICAgICAgaWNvbjogWzI1NiwgNTEyLCBbXSwgImYzYWUiLCAiTTIxMCAzOTEuMWwtMTQuMSAyNC42LTQuNiA4MC4yYzAgOC45LTI4LjMgMTYuMS02My4xIDE2LjFzLTYzLjEtNy4yLTYzLjEtMTYuMWwtNS44LTc5LjQtMTQuOS0yNS40YzQxLjIgMTcuMyAxMjYgMTYuNyAxNjUuNiAwek0xNCAxMzcuOEwyNy42IDI2My4zYzUuOS0yMCAyMC44LTQ3IDQwLTU1LjIgNi4zLTIuNyAxMi43LTIuNyAxOC43IC45IDUuMiAzIDkuNiA5LjMgMTAuMSAxMS44IDEuMiA2LjUtMiA5LjEtNC41IDkuMS0zIDAtNS4zLTQuNi02LjgtNy4zLTQuMS03LjMtMTAuMy03LjYtMTYuOS0yLjgtNi45IDUtMTIuOSAxMy40LTE3LjEgMjAuNy01LjEgOC44LTkuNCAxOC41LTEyIDI4LjItMS41IDUuNi0yLjkgMTQuNi0uNiAxOS45IDEgMi4yIDIuNSAzLjYgNC45IDMuNiA1IDAgMTIuMy02LjYgMTUuOC0xMC4xIDQuNS00LjUgMTAuMy0xMS41IDEyLjUtMTZsNS4yLTE1LjVjMi42LTYuOCA5LjktNS42IDkuOSAwIDAgMTAuMi0zLjcgMTMuNi0xMCAzNC43LTUuOCAxOS41LTcuNiAyNS44LTcuNiAyNS44LS43IDIuOC0zLjQgNy41LTYuMyA3LjUtMS4yIDAtMi4xLS40LTIuNi0xLjItMS0xLjQtLjktNS4zLS44LTYuMyAuMi0zLjIgNi4zLTIyLjIgNy4zLTI1LjItMiAyLjItNC4xIDQuNC02LjQgNi42LTUuNCA1LjEtMTQuMSAxMS44LTIxLjUgMTEuOC0zLjQgMC01LjYtLjktNy43LTIuNGw3LjYgNzkuNmMyIDUgMzkuMiAxNy4xIDg4LjIgMTcuMSA0OS4xIDAgODYuMy0xMi4yIDg4LjItMTcuMWwxMC45LTk0LjZjLTUuNyA1LjItMTIuMyAxMS42LTE5LjYgMTQuOC01LjQgMi4zLTE3LjQgMy44LTE3LjQtNS43IDAtNS4yIDkuMS0xNC44IDE0LjQtMjEuNSAxLjQtMS43IDQuNy01LjkgNC43LTguMSAwLTIuOS02LTIuMi0xMS43IDIuNS0zLjIgMi43LTYuMiA2LjMtOC43IDkuNy00LjMgNi02LjYgMTEuMi04LjUgMTUuNS02LjIgMTQuMi00LjEgOC42LTkuMSAyMi01IDEzLjMtNC4yIDExLjgtNS4yIDE0LS45IDEuOS0yLjIgMy41LTQgNC41LTEuOSAxLTQuNSAuOS02LjEtLjMtLjktLjYtMS4zLTEuOS0xLjMtMy43IDAtLjkgLjEtMS44IC4zLTIuNyAxLjUtNi4xIDcuOC0xOC4xIDE1LTM0LjMgMS42LTMuNyAxLTIuNiAuOC0yLjMtNi4yIDYtMTAuOSA4LjktMTQuNCAxMC41LTUuOCAyLjYtMTMgMi42LTE0LjUtNC4xLS4xLS40LS4xLS44LS4yLTEuMi0xMS44IDkuMi0yNC4zIDExLjctMjAtOC4xLTQuNiA4LjItMTIuNiAxNC45LTIyLjQgMTQuOS00LjEgMC03LjEtMS40LTguNi01LjEtMi4zLTUuNSAxLjMtMTQuOSA0LjYtMjMuOCAxLjctNC41IDQtOS45IDcuMS0xNi4yIDEuNi0zLjQgNC4yLTUuNCA3LjYtNC41IC42IC4yIDEuMSAuNCAxLjYgLjcgMi42IDEuOCAxLjYgNC41IC4zIDcuMi0zLjggNy41LTcuMSAxMy05LjMgMjAuOC0uOSAzLjMtMiA5IDEuNSA5IDIuNCAwIDQuNy0uOCA2LjktMi40IDQuNi0zLjQgOC4zLTguNSAxMS4xLTEzLjUgMi0zLjYgNC40LTguMyA1LjYtMTIuMyAuNS0xLjcgMS4xLTMuMyAxLjgtNC44IDEuMS0yLjUgMi42LTUuMSA1LjItNS4xIDEuMyAwIDIuNCAuNSAzLjIgMS41IDEuNyAyLjIgMS4zIDQuNSAuNCA2LjktMiA1LjYtNC43IDEwLjYtNi45IDE2LjctMS4zIDMuNS0yLjcgOC0yLjcgMTEuNyAwIDMuNCAzLjcgMi42IDYuOCAxLjIgMi40LTEuMSA0LjgtMi44IDYuOC00LjUgMS4yLTQuOSAuOS0zLjggMjYuNC02OC4yIDEuMy0zLjMgMy43LTQuNyA2LjEtNC43IDEuMiAwIDIuMiAuNCAzLjIgMS4xIDEuNyAxLjMgMS43IDQuMSAxIDYuMi0uNyAxLjktLjYgMS4zLTQuNSAxMC41LTUuMiAxMi4xLTguNiAyMC44LTEzLjIgMzEuOS0xLjkgNC42LTcuNyAxOC45LTguNyAyMi4zLS42IDIuMi0xLjMgNS44IDEgNS44IDUuNCAwIDE5LjMtMTMuMSAyMy4xLTE3IC4yLS4zIC41LS40IC45LS42IC42LTEuOSAxLjItMy43IDEuNy01LjUgMS40LTMuOCAyLjctOC4yIDUuMy0xMS4zIC44LTEgMS43LTEuNiAyLjctMS42IDIuOCAwIDQuMiAxLjIgNC4yIDQgMCAxLjEtLjcgNS4xLTEuMSA2LjIgMS40LTEuNSAyLjktMyA0LjUtNC41IDE1LTEzLjkgMjUuNy02LjggMjUuNyAuMiAwIDcuNC04LjkgMTcuNy0xMy44IDIzLjQtMS42IDEuOS00LjkgNS40LTUgNi40IDAgMS4zIC45IDEuOCAyLjIgMS44IDIgMCA2LjQtMy41IDgtNC43IDUtMy45IDExLjgtOS45IDE2LjYtMTQuMWwxNC44LTEzNi44Yy0zMC41IDE3LjEtMTk3LjYgMTcuMi0yMjguMyAuMnptMjI5LjctOC41YzAgMjEtMjMxLjIgMjEtMjMxLjIgMCAwLTguOCA1MS44LTE1LjkgMTE1LjYtMTUuOSA5IDAgMTcuOCAuMSAyNi4zIC40TDE2NyA2NS4xIDIyOC4zIC42YzEuNC0xLjQgNS44LS4yIDkuOSAzLjVzNi42IDcuOSA1LjMgOS4zbC0uMSAuMS01Ny4zIDYwLjUtMTAgNDAuN2MzOS45IDIuNiA2Ny42IDguMSA2Ny42IDE0LjZ6bS02OS40IDQuNmMwLS44LS45LTEuNS0yLjUtMi4xbC0uMiAuOGMwIDEuMy01IDIuNC0xMS4xIDIuNHMtMTEuMS0xLjEtMTEuMS0yLjRjMC0uMSAwLS4yIC4xLS4zbC4yLS43Yy0xLjggLjYtMyAxLjQtMyAyLjMgMCAyLjEgNi4yIDMuNyAxMy43IDMuNyA3LjcgLjEgMTMuOS0xLjYgMTMuOS0zLjd6Il0KICAgIH07CiAgICBmYVllbHAgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAieWVscCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMWU5IiwgIk00Mi45IDI0MC4zbDk5LjYgNDguNmMxOS4yIDkuNCAxNi4yIDM3LjUtNC41IDQyLjdMMzAuNSAzNTguNWMtMy4yIC44LTYuNCAuOS05LjYgLjNzLTYuMi0xLjgtOC45LTMuNy00LjktNC4zLTYuNi03LjEtMi43LTUuOS0zLjEtOS4yYy0zLjMtMjguOC0uMi01Ny45IDktODUuMyAxLTMuMSAyLjctNS45IDQuOS04LjNzNC45LTQuMiA3LjktNS41IDYuMi0xLjggOS41LTEuOCA2LjQgLjkgOS4zIDIuM3ptNDQgMjM5LjNjMjMuOCAxNi4zIDUwLjkgMjcuMyA3OS40IDMyLjEgMy4yIC42IDYuNSAuNCA5LjYtLjRzNi4xLTIuMyA4LjYtNC40IDQuNi00LjYgNi03LjUgMi4zLTYuMSAyLjQtOS40bDMuOS0xMTAuOGMuNy0yMS4zLTI1LjUtMzEuOS0zOS44LTE2LjFMODIuOCA0NDUuNWMtMi4yIDIuNC0zLjggNS4zLTQuOCA4LjRzLTEuMyA2LjQtLjkgOS42IDEuNSA2LjMgMy4xIDkuMSAzLjkgNS4yIDYuNiA3bDAgMHpNMjMyLjIgMzY5LjdsNTguOCA5NGMxLjcgMi44IDQgNS4xIDYuOCA2LjlzNS44IDMgOSAzLjUgNi41IC4zIDkuNy0uNSA2LjEtMi40IDguNi00LjRjMjIuMy0xOC40IDQwLjMtNDEuNSA1Mi43LTY3LjYgMS40LTIuOSAyLjEtNi4xIDIuMi05LjRzLS42LTYuNS0xLjktOS40LTMuMi01LjctNS42LTcuOC01LjItMy45LTguMy00LjlMMjU4LjcgMzM1LjdjLTIwLjMtNi41LTM3LjggMTUuOC0yNi41IDMzLjl6TTM4MC42IDIzNy40Yy0xMS41LTI2LjUtMjguNy01MC4yLTUwLjQtNjkuMy0yLjQtMi4xLTUuMy0zLjctOC40LTQuN3MtNi40LTEuMi05LjYtLjgtNi4zIDEuNS05LjEgMy4yLTUuMSA0LTYuOSA2LjdsLTYyIDkxLjljLTExLjkgMTcuNyA0LjcgNDAuNiAyNS4yIDM0LjdMMzY2IDI2OC42YzMuMS0uOSA2LTIuNSA4LjUtNC42czQuNS00LjcgNS44LTcuNyAyLjEtNi4yIDIuMi05LjQtLjYtNi41LTEuOS05LjVsMCAwek02Mi4xIDMwLjJjLTIuOCAxLjQtNS40IDMuMy03LjQgNS43cy0zLjYgNS4yLTQuNSA4LjItMS4yIDYuMi0uOSA5LjMgMS4zIDYuMSAyLjkgOC45TDE1Ni4zIDI0Mi42YzExLjcgMjAuMiA0Mi42IDExLjkgNDIuNi0xMS40bDAtMjA4LjNjMC0zLjEtLjYtNi4zLTEuOC05LjJzLTMuMS01LjUtNS40LTcuNi01LTMuOC04LTQuOC02LjEtMS40LTkuMy0xLjJjLTM5IDMuMS03NyAxMy4zLTExMi4zIDMwLjF6Il0KICAgIH07CiAgICBmYUdvZm9yZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJnb2ZvcmUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjNhNyIsICJNMzQ4IDMxOS44bC0xMy4yIDAgMCAzNC43Yy0yNC41IDIzLjEtNTYuMyAzNS44LTg5LjkgMzUuOC03My4yIDAtMTMyLjQtNjAuMi0xMzIuNC0xMzQuNCAwLTc0LjEgNTkuMi0xMzQuNCAxMzIuNC0xMzQuNCAzNS4zIDAgNjguNiAxNCA5My42IDM5LjRsNjIuMy02My4zYy00MS44LTQyLjMtOTcuMS02NS42LTE1Ni4xLTY1LjYtMTIyLjcgMC0yMjAuNyAxMDAuNi0yMjAuNyAyMjQgMCAxMjIuNSA5NyAyMjQgMjIwLjcgMjI0IDYzLjIgMCAxMjQuNS0yNi4yIDE3MS04Mi41LTItMjcuNi0xMy40LTc3LjctNjcuNy03Ny43ek0zMzUuOSAyMDcuM2wtMTA2LjMgMCAwIDg5IDExOC40IDBjMzMuNSAwIDYwLjUgMTUuMSA3NiA0MS44bDAtMzAuNmMwLTY1LjItNDAuNC0xMDAuMi04OC4xLTEwMC4yeiJdCiAgICB9OwogICAgZmFBdmlhdG8gPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYXZpYXRvIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY0MjEiLCAiTTEwNy4yIDI4My41bC0xOS00MS44LTUyLjEgMC0xOSA0MS44LTE3LjEgMCA2Mi4yLTEzMS40IDYyLjIgMTMxLjQtMTcuMiAwem0tNDUtOTguMWwtMTkuNiA0Mi41IDM5LjIgMC0xOS42LTQyLjV6TTE3NC45IDI4Ny44bC02Mi4yLTEzMS40IDE3LjEgMCA0NS4xIDk2IDQ1LjEtOTYgMTcgMC02Mi4xIDEzMS40em04MC42LTQuM2wwLTEyNy4xIDE1LjUgMCAwIDEyNy4xLTE1LjUgMHpNNDY0LjYgMTY3LjlsMCAxMTUuNi0xNy4zIDAgMC0xMTUuNi00MS4yIDAgMC0xMS41IDk5LjYgMCAwIDExLjUtNDEuMSAwek02NDAgMjE4LjhjMCA5LjItMS43IDE3LjgtNS4xIDI1LjhzLTguMiAxNS4xLTE0LjIgMjEuMS0xMy4xIDEwLjgtMjEuMSAxNC4yLTE2LjYgNS4xLTI1LjggNS4xLTE3LjgtMS43LTI1LjgtNS4xLTE1LjEtOC4yLTIxLjEtMTQuMi0xMC44LTEzLTE0LjItMjEuMWMtMy40LTgtNS4xLTE2LjYtNS4xLTI1LjhzMS43LTE3LjggNS4xLTI1LjggOC4yLTE1LjEgMTQuMi0yMS4xIDEzLTguNCAyMS4xLTExLjljOC0zLjQgMTYuNi01LjEgMjUuOC01LjFzMTcuOCAxLjcgMjUuOCA1LjEgMTUuMSA1LjggMjEuMSAxMS45YzYgNiAxMC43IDEzLjEgMTQuMiAyMS4xIDMuNCA4IDUuMSAxNi42IDUuMSAyNS44em0tMTUuNSAwYzAtNy4zLTEuMy0xNC0zLjktMjAuM3MtNi4yLTExLjctMTAuOC0xNi4zLTEwLTguMi0xNi4yLTEwLjktMTIuOC00LTE5LjgtNC0xMy42IDEuMy0xOS44IDQtMTEuNiA2LjMtMTYuMiAxMC45LTguMiAxMC0xMC44IDE2LjMtMy45IDEzLjEtMy45IDIwLjNjMCA3LjMgMS4zIDE0IDMuOSAyMC4zczYuMiAxMS43IDEwLjggMTYuMyAxMCA4LjIgMTYuMiAxMC45IDEyLjggNCAxOS44IDQgMTMuNi0xLjMgMTkuOC00IDExLjYtNi4zIDE2LjItMTAuOSA4LjItMTAgMTAuOC0xNi4zIDMuOS0xMy4xIDMuOS0yMC4zem0tOTQuOCA5Ni43bDAtNi4zIDg4LjktMTAtMjQyLjkgMTMuNGMuNi0yLjIgMS4xLTQuNiAxLjQtNy4yIC4zLTIgLjUtNC4yIC42LTYuNWw2NC44LTguMS02NC45IDEuOWMwLS40LS4xLS43LS4xLTEuMS0yLjgtMTcuMi0yNS41LTIzLjctMjUuNS0yMy43bC0xLjEtMjYuMyAyMy44IDAgMTkgNDEuOCAxNy4xIDAtNjIuMi0xMzEuNC02Mi4yIDEzMS40IDE3LjEgMCAxOS00MS44IDIzLjYgMC0xLjEgMjYuNHMtMjIuNyA2LjUtMjUuNSAyMy43Yy0uMSAuMy0uMSAuNy0uMSAxLjFsLTY0LjktMS45IDY0LjggOC4xYy4xIDIuMyAuMyA0LjQgLjYgNi41IC4zIDIuNiAuOCA1IDEuNCA3LjJsLTI0Mi45LTEzLjUgODguOSAxMCAwIDYuM2MtNS45IC45LTEwLjUgNi0xMC41IDEyLjIgMCA2LjggNS42IDEyLjQgMTIuNCAxMi40czEyLjQtNS42IDEyLjQtMTIuNGMwLTYuMi00LjYtMTEuMy0xMC41LTEyLjJsMC01LjggODAuMyA5IDAgNS40Yy01LjcgMS4xLTkuOSA2LjItOS45IDEyLjEgMCA2LjggNS42IDEwLjIgMTIuNCAxMC4yczEyLjQtMy40IDEyLjQtMTAuMmMwLTYtNC4zLTExLTkuOS0xMi4xbDAtNC45IDI4LjQgMy4yIDAgMjMuNy01LjkgMCAwIDEzLjkgNS45IDAgMC02LjYgNSAwIDAgNi42IDUuOSAwIDAtMTMuOC01LjkgMCAwLTIzLjIgMzguMyA0LjNjOC4xIDExLjQgMTkgMTMuNiAxOSAxMy42bC0uMSA2LjctNS4xIC4yLS4xIDEyLjEgNC4xIDAgLjEtNSA1LjIgMCAuMSA1IDQuMSAwLS4xLTEyLjEtNS4xLS4yLS4xLTYuN3MxMC45LTIuMSAxOS0xMy42bDM4LjMtNC4zIDAgMjMuMi01LjkgMCAwIDEzLjggNS45IDAgMC02LjYgNSAwIDAgNi42IDUuOSAwIDAtMTMuOC01LjkgMCAwLTIzLjcgMjguNC0zLjIgMCA0LjljLTUuNyAxLjEtOS45IDYuMi05LjkgMTIuMSAwIDYuOCA1LjYgMTAuMiAxMi40IDEwLjJzMTIuNC0zLjQgMTIuNC0xMC4yYzAtNi00LjMtMTEtOS45LTEyLjFsMC01LjQgODAuMy05IDAgNS44Yy01LjkgLjktMTAuNSA2LTEwLjUgMTIuMiAwIDYuOCA1LjYgMTIuNCAxMi40IDEyLjRzMTIuNC01LjYgMTIuNC0xMi40Yy0uMi02LjMtNC43LTExLjQtMTAuNy0xMi4zek0zMjguOSAyMjcuOWwxOS42LTQyLjUgMTkuNiA0Mi41LTE3LjkgMC0xLjctNDAuMy0xLjcgNDAuMy0xNy45IDB6Il0KICAgIH07CiAgICBmYVBhZGxldCA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJwYWRsZXQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTRhMCIsICJNMjk3LjkgMGwuMSAwYzcuNiAuMSAxNC40IDQuNyAxNy41IDExLjhsMTMyIDMwOC41IC4zLS4xIC4yIC40LTIuOCAxMC00Mi45IDE1OGMtMy43IDE2LjItMTkuNyAyNi4zLTM1LjggMjIuNmwtNjguNC0xNS42LTY4LjUgMTUuNmMtMTYuMSAzLjctMzIuMS02LjQtMzUuOC0yMi42bC00Mi45LTE1OC0yLjctMTAgLjEtLjQgMTMyLjEtMzA4LjRjMy03IDkuOS0xMS42IDE3LjUtMTEuOHpNMTYwLjEgMzIyLjFsMTMxIDM5LjEgNi45IDEyMi41IDcuOS0xMjEuNSAxMzAuNi0zOS4zIC4yLS4xLTEzMSAyNS4xLTguNi0zMjAuMi01LjIgMzIwLjItMTMxLjgtMjUuOHpNNDI2IDIyMi42bDk0LjQtNDEgNzMuOCAwLTE1NyAyNDcuNiAzMS42LTEwOS00Mi44LTk3LjZ6bTE3MS41LTQxLjJsNDEuNCA3Ni4yYzQgNy41LTMuOSAxNS45LTExLjYgMTIuMmwtNDcuNi0yMi43IDE3LjgtNjUuN3pNMTI3LjMgMzE4LjVMMTU4LjcgNDMwIDEuNiAxNTQuNWMtNS45LTEwLjQgNS41LTIyIDE1LjktMTYuMmwxNTEuOCA4NC4yLTQyLjEgOTZ6Il0KICAgIH07CiAgICBmYUVkZ2VMZWdhY3kgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZWRnZS1sZWdhY3kiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTA3OCIsICJNLTYgMjI4LjJsLjQtLjVjMCAuMiAwIC4zLS4xIC41bC0uMyAwem00NjAuNiAxNS41YzAtNDQtNy44LTg0LjUtMjguOC0xMjIuNC00MS03My40LTExMy42LTExMy4zLTE5OC42LTExMy4zLTEzOS45LS4zLTIxOC4zIDEwNS4yLTIzMi44IDIxOS43IDQyLjQtNjEuMyAxMTcuMS0xMjEuNCAyMjAuNC0xMjUgMCAwIDEwOS43IDAgOTkuNCAxMDVsLTE3NS44IDBjNi40LTM3LjQgMTguNS01OSAzNC4zLTc4LjktNzUgMzQuOS0xMjEuOCA5Ni4xLTEyMC44IDE4OC4zIC44IDcxLjUgNTAuMSAxNDQuOCAxMjAuOCAxNzIgODMuNCAzMS44IDE5Mi44IDcuMiAyNDAuMS0yMS4zbDAtMTA0LjRjLTgwLjkgNTYuNS0yNzAuOSA2MC45LTI3Mi4zLTY3LjZsMzE0LjEgMCAwLTUyLjF6Il0KICAgIH07CiAgICBmYVNxdWFyZUxhc3RmbSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtbGFzdGZtIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImxhc3RmbS1zcXVhcmUiXSwgImYyMDMiLCAiTTQ0OCA5NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwek0yMTAuNyAyODAuOGMtMS44LTUuNS0zLjQtMTAuOC01LTE1LjktMTIuOS00MS45LTIxLTY4LjQtNTgtNjguNC0yMi40IDAtNDUuMSAxNi4xLTQ1LjEgNjEuMiAwIDM1LjIgMTggNTcuMiA0My4zIDU3LjIgMjguNiAwIDQ3LjYtMjEuMyA0Ny42LTIxLjNsMTEuNyAzMS45cy0xOS44IDE5LjQtNjEuMiAxOS40Yy01MS4zIDAtNzkuOS0zMC4xLTc5LjktODUuOCAwLTU3LjkgMjguNi05MiA4Mi41LTkyIDY3LjkgMCA3OS4zIDM1LjMgOTYuNCA4OC40IDEuNCA0LjQgMi45IDguOSA0LjQgMTMuNSA4LjggMjYuOCAyNC4yIDQ2LjIgNjEuMiA0Ni4yIDI0LjkgMCAzOC4xLTUuNSAzOC4xLTE5LjEgMC0xNy41LTE2LjktMjEuMi00MC0yNi40LTMuMi0uNy02LjUtMS40LTkuOS0yLjItMzAuNC03LjMtNDIuNS0yMy4xLTQyLjUtNDggMC00MCAzMi4zLTUyLjQgNjUuMi01Mi40IDM3LjQgMCA2MC4xIDEzLjYgNjMgNDYuNmwtMzYuNyA0LjRjLTEuNS0xNS44LTExLTIyLjQtMjguNi0yMi40LTE2LjEgMC0yNiA3LjMtMjYgMTkuOCAwIDExIDQuOCAxNy42IDIwLjkgMjEuMyAyLjIgLjUgNC41IDEgNi43IDEuNCAzMS4xIDYuNSA2NS4xIDEzLjcgNjUuMSA1Ni4xIC4xIDM2LjctMzAuNyA1MC42LTc2LjEgNTAuNi02My40IDAtODUuNC0yOC42LTk3LjEtNjQuMXoiXQogICAgfTsKICAgIGZhTGFzdGZtU3F1YXJlID0gZmFTcXVhcmVMYXN0Zm07CiAgICBmYUdvb2RyZWFkc0cgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiZ29vZHJlYWRzLWciLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZjNhOSIsICJNMTAuOCA0MDMuM2wyLjggMGMxMi43IDAgMjUuNSAwIDM4LjIgLjEgMS42IDAgMy4xLS40IDMuNiAyLjEgNy4xIDM0LjkgMzAgNTQuNiA2Mi45IDYzLjkgMjYuOSA3LjYgNTQuMSA3LjggODEuMyAxLjggMzMuOC03LjQgNTYtMjguMyA2OC02MC40IDgtMjEuNSAxMC43LTQzLjggMTEtNjYuNSAuMS01LjggLjMtNDctLjItNTIuOGwtLjktLjNjLS44IDEuNS0xLjcgMi45LTIuNSA0LjQtMjIuMSA0My4xLTYxLjMgNjcuNC0xMDUuNCA2OS4xLTEwMyA0LTE2OS40LTU3LTE3Mi0xNzYuMi0uNS0yMy43IDEuOC00Ni45IDguMy02OS43IDIwLjYtNzEuMSA3NC42LTExOC4yIDE1My45LTExOC44IDYxLjMtLjQgMTAxLjUgMzguNyAxMTYuMiA3MC4zIC41IDEuMSAxLjMgMi4zIDIuNCAxLjlsMC02MS42IDQ0LjMgMGMwIDI4MC4zIC4xIDMzMi4yIC4xIDMzMi4yLS4xIDc4LjUtMjYuNyAxNDMuNy0xMDMgMTYyLjItNjkuNSAxNi45LTE1OSA0LjgtMTk2LTU3LjItOC0xMy41LTExLjgtMjguMy0xMy00NC41ek0xNTcuMSAzNi41Yy01Mi41LS41LTEwOC41IDQwLjctMTE1IDEzMy44LTQuMSA1OSAxNC44IDEyMi4yIDcxLjUgMTQ4LjYgMjcuNiAxMi45IDc0LjMgMTUgMTA4LjMtOC43IDQ3LjYtMzMuMiA2Mi43LTk3IDU0LjgtMTU0LTkuNy03MS4xLTQ3LjgtMTIwLTExOS42LTExOS43eiJdCiAgICB9OwogICAgZmFDY01hc3RlcmNhcmQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiY2MtbWFzdGVyY2FyZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMWYxIiwgIk00ODIuOSA0MTAuM2MwIDYuOC00LjYgMTEuNy0xMS4yIDExLjctNi44IDAtMTEuMi01LjItMTEuMi0xMS43czQuNC0xMS43IDExLjItMTEuN2M2LjYgMCAxMS4yIDUuMiAxMS4yIDExLjd6TTE3Mi4xIDM5OC42Yy03LjEgMC0xMS4yIDUuMi0xMS4yIDExLjdTMTY1IDQyMiAxNzIuMSA0MjJjNi41IDAgMTAuOS00LjkgMTAuOS0xMS43LS4xLTYuNS00LjQtMTEuNy0xMC45LTExLjd6bTExNy41LS4zYy01LjQgMC04LjcgMy41LTkuNSA4LjdsMTkuMSAwYy0uOS01LjctNC40LTguNy05LjYtOC43em0xMDcuOCAuM2MtNi44IDAtMTAuOSA1LjItMTAuOSAxMS43czQuMSAxMS43IDEwLjkgMTEuNyAxMS4yLTQuOSAxMS4yLTExLjdjMC02LjUtNC40LTExLjctMTEuMi0xMS43em0xMDUuOSAyNi4xYzAgLjMgLjMgLjUgLjMgMS4xIDAgLjMtLjMgLjUtLjMgMS4xLS4zIC4zLS4zIC41LS41IC44LS4zIC4zLS41IC41LTEuMSAuNS0uMyAuMy0uNSAuMy0xLjEgLjMtLjMgMC0uNSAwLTEuMS0uMy0uMyAwLS41LS4zLS44LS41LS4zLS4zLS41LS41LS41LS44LS4zLS41LS4zLS44LS4zLTEuMSAwLS41IDAtLjggLjMtMS4xIDAtLjUgLjMtLjggLjUtMS4xIC4zLS4zIC41LS4zIC44LS41IC41LS4zIC44LS4zIDEuMS0uMyAuNSAwIC44IDAgMS4xIC4zIC41IC4zIC44IC4zIDEuMSAuNXMuMiAuNiAuNSAxLjF6bS0yLjIgMS40Yy41IDAgLjUtLjMgLjgtLjMgLjMtLjMgLjMtLjUgLjMtLjhzMC0uNS0uMy0uOGMtLjMgMC0uNS0uMy0xLjEtLjNsLTEuNiAwIDAgMy41IC44IDAgMC0xLjQgLjMgMCAxLjEgMS40IC44IDAtMS4xLTEuM3pNNTc2IDgxbDAgMzUyYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDQ4IDQ4MWMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCA4MUMwIDU0LjUgMjEuNSAzMyA0OCAzM2w0ODAgMGMyNi41IDAgNDggMjEuNSA0OCA0OHpNNjQgMjIwLjZjMCA3Ni41IDYyLjEgMTM4LjUgMTM4LjUgMTM4LjUgMjcuMiAwIDUzLjktOC4yIDc2LjUtMjMuMS03Mi45LTU5LjMtNzIuNC0xNzEuMiAwLTIzMC41LTIyLjYtMTUtNDkuMy0yMy4xLTc2LjUtMjMuMS03Ni40LS4xLTEzOC41IDYyLTEzOC41IDEzOC4yek0yODggMzI5LjRjNzAuNS01NSA3MC4yLTE2Mi4yIDAtMjE3LjUtNzAuMiA1NS4zLTcwLjUgMTYyLjYgMCAyMTcuNXpNMTQ1LjcgNDA1LjdjMC04LjctNS43LTE0LjQtMTQuNy0xNC43LTQuNiAwLTkuNSAxLjQtMTIuOCA2LjUtMi40LTQuMS02LjUtNi41LTEyLjItNi41LTMuOCAwLTcuNiAxLjQtMTAuNiA1LjRsMC00LjQtOC4yIDAgMCAzNi43IDguMiAwYzAtMTguOS0yLjUtMzAuMiA5LTMwLjIgMTAuMiAwIDguMiAxMC4yIDguMiAzMC4ybDcuOSAwYzAtMTguMy0yLjUtMzAuMiA5LTMwLjIgMTAuMiAwIDguMiAxMCA4LjIgMzAuMmw4LjIgMCAwLTIzLS4yIDB6TTE5MC42IDM5MmwtNy45IDAgMCA0LjRjLTIuNy0zLjMtNi41LTUuNC0xMS43LTUuNC0xMC4zIDAtMTguMiA4LjItMTguMiAxOS4zIDAgMTEuMiA3LjkgMTkuMyAxOC4yIDE5LjMgNS4yIDAgOS0xLjkgMTEuNy01LjRsMCA0LjYgNy45IDAgMC0zNi44em00MC41IDI1LjZjMC0xNS0yMi45LTguMi0yMi45LTE1LjIgMC01LjcgMTEuOS00LjggMTguNS0xLjFsMy4zLTYuNWMtOS40LTYuMS0zMC4yLTYtMzAuMiA4LjIgMCAxNC4zIDIyLjkgOC4zIDIyLjkgMTUgMCA2LjMtMTMuNSA1LjgtMjAuNyAuOGwtMy41IDYuM2MxMS4yIDcuNiAzMi42IDYgMzIuNi03LjV6bTM1LjQgOS4zbC0yLjItNi44Yy0zLjggMi4xLTEyLjIgNC40LTEyLjItNC4xbDAtMTYuNiAxMy4xIDAgMC03LjQtMTMuMSAwIDAtMTEuMi04LjIgMCAwIDExLjItNy42IDAgMCA3LjMgNy42IDAgMCAxNi43YzAgMTcuNiAxNy4zIDE0LjQgMjIuNiAxMC45em0xMy4zLTEzLjRsMjcuNSAwYzAtMTYuMi03LjQtMjIuNi0xNy40LTIyLjYtMTAuNiAwLTE4LjIgNy45LTE4LjIgMTkuMyAwIDIwLjUgMjIuNiAyMy45IDMzLjggMTQuMmwtMy44LTZjLTcuOCA2LjQtMTkuNiA1LjgtMjEuOS00Ljl6TTMzOC45IDM5MmMtNC42LTItMTEuNi0xLjgtMTUuMiA0LjRsMC00LjQtOC4yIDAgMCAzNi43IDguMiAwIDAtMjAuN2MwLTExLjYgOS41LTEwLjEgMTIuOC04LjRsMi40LTcuNnptMTAuNiAxOC4zYzAtMTEuNCAxMS42LTE1LjEgMjAuNy04LjRsMy44LTYuNWMtMTEuNi05LjEtMzIuNy00LjEtMzIuNyAxNSAwIDE5LjggMjIuNCAyMy44IDMyLjcgMTVsLTMuOC02LjVjLTkuMiA2LjUtMjAuNyAyLjYtMjAuNy04LjZ6TTQxNi4yIDM5MmwtOC4yIDAgMCA0LjRjLTguMy0xMS0yOS45LTQuOC0yOS45IDEzLjkgMCAxOS4yIDIyLjQgMjQuNyAyOS45IDEzLjlsMCA0LjYgOC4yIDAgMC0zNi44em0zMy43IDBjLTIuNC0xLjItMTEtMi45LTE1LjIgNC40bDAtNC40LTcuOSAwIDAgMzYuNyA3LjkgMCAwLTIwLjdjMC0xMSA5LTEwLjMgMTIuOC04LjRsMi40LTcuNnptNDAuMy0xNC45bC03LjkgMCAwIDE5LjNjLTguMi0xMC45LTI5LjktNS4xLTI5LjkgMTMuOSAwIDE5LjQgMjIuNSAyNC42IDI5LjkgMTMuOWwwIDQuNiA3LjkgMCAwLTUxLjd6bTcuNi03NS4xbDAgNC42IC44IDAgMC00LjYgMS45IDAgMC0uOC00LjYgMCAwIC44IDEuOSAwem02LjYgMTIzLjhjMC0uNSAwLTEuMS0uMy0xLjYtLjMtLjMtLjUtLjgtLjgtMS4xcy0uOC0uNS0xLjEtLjhjLS41IDAtMS4xLS4zLTEuNi0uMy0uMyAwLS44IC4zLTEuNCAuMy0uNSAuMy0uOCAuNS0xLjEgLjgtLjUgLjMtLjggLjgtLjggMS4xLS4zIC41LS4zIDEuMS0uMyAxLjYgMCAuMyAwIC44IC4zIDEuNCAwIC4zIC4zIC44IC44IDEuMSAuMyAuMyAuNSAuNSAxLjEgLjggLjUgLjMgMS4xIC4zIDEuNCAuMyAuNSAwIDEuMSAwIDEuNi0uMyAuMy0uMyAuOC0uNSAxLjEtLjhzLjUtLjggLjgtMS4xYy4zLS42IC4zLTEuMSAuMy0xLjR6bTMuMi0xMjQuN2wtMS40IDAtMS42IDMuNS0xLjYtMy41LTEuNCAwIDAgNS40IC44IDAgMC00LjEgMS42IDMuNSAxLjEgMCAxLjQtMy41IDAgNC4xIDEuMSAwIDAtNS40em00LjQtODAuNWMwLTc2LjItNjIuMS0xMzguMy0xMzguNS0xMzguMy0yNy4yIDAtNTMuOSA4LjItNzYuNSAyMy4xIDcyLjEgNTkuMyA3My4yIDE3MS41IDAgMjMwLjUgMjIuNiAxNSA0OS41IDIzLjEgNzYuNSAyMy4xIDc2LjQgLjEgMTM4LjUtNjEuOSAxMzguNS0xMzguNHoiXQogICAgfTsKICAgIGZhRGlzY291cnNlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImRpc2NvdXJzZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMzkzIiwgIk0yMjUuOSAzMkMxMDMuMyAzMiAwIDEzMC41IDAgMjUyLjEgMCAyNTYgLjEgNDgwIC4xIDQ4MGwyMjUuOC0uMkMzNDguNiA0NzkuOCA0NDggMzc3LjUgNDQ4IDI1NS45UzM0OC42IDMyIDIyNS45IDMyek0yMjQgMzg0Yy0xOS40IDAtMzcuOS00LjMtNTQuNC0xMi4xTDg4LjUgMzkyIDExMS40IDMxN2MtOS44LTE4LjEtMTUuNC0zOC45LTE1LjQtNjEgMC03MC43IDU3LjMtMTI4IDEyOC0xMjhzMTI4IDU3LjMgMTI4IDEyOC01Ny4zIDEyOC0xMjggMTI4eiJdCiAgICB9OwogICAgZmFCbGFja1RpZSA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJibGFjay10aWUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjI3ZSIsICJNMCAzMmwwIDQ0OCA0NDggMCAwLTQ0OC00NDggMHpNMzE2LjUgMzU3LjJsLTkyLjUgODguNy05Mi41LTg4LjcgNjQuNS0xODQtNjQuNS04Ni42IDE4NC45IDAtNjQuNCA4Ni42IDY0LjUgMTg0eiJdCiAgICB9OwogICAgZmFTcXVhcmVGYWNlYm9vayA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtZmFjZWJvb2siLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiZmFjZWJvb2stc3F1YXJlIl0sICJmMDgyIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDk4LjIgMCAwLTE0NS44LTUyLjggMCAwLTc4LjIgNTIuOCAwIDAtMzMuN2MwLTg3LjEgMzkuNC0xMjcuNSAxMjUtMTI3LjUgMTYuMiAwIDQ0LjIgMy4yIDU1LjcgNi40bDAgNzAuOGMtNi0uNi0xNi41LTEtMjkuNi0xLTQyIDAtNTguMiAxNS45LTU4LjIgNTcuMmwwIDI3LjggODMuNiAwLTE0LjQgNzguMi02OS4zIDAgMCAxNDUuOCAxMjkgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnoiXQogICAgfTsKICAgIGZhRmFjZWJvb2tTcXVhcmUgPSBmYVNxdWFyZUZhY2Vib29rOwogICAgZmFCYXR0bGVOZXQgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAiYmF0dGxlLW5ldCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmODM1IiwgIk00NDguOCAyMjUuNmMyNi45IC4yIDM1LjYtNy40IDM4LjktMTIuNCAxMi41LTE2LjMtNy4xLTQ3LjYtNTIuOC03MS4zIDE3LjgtMzMuNiAzMC4xLTYzLjcgMzYuMy04NS4zIDMuNC0xMS44IDEuMS0xOSAuNS0yMC4zLTEuNyAxMC41LTE1LjggNDguNS00OC4yIDEwMC0yNS0xMS4yLTU2LjUtMjAuMS05My44LTIzLjgtOC45LTE2LjktMzQuOS02My45LTYwLjUtODguOS0xNi44LTE2LjUtMzAuMy0yMi42LTQwLjgtMjMuNWwwIDBjLTEzLjgtMS42LTIyLjcgNS44LTI3LjQgMTEtMTcuMiAxOC41LTI0LjMgNDguOS0yNSA4NC4xLTcuMi0xMi4zLTE3LjItMjQuNi0yOC41LTI1LjlsLS4yIDBjLTIwLjctMy41LTM4LjQgMjkuMi0zNiA4MS4zLTM4LjQgMS40LTcxIDUuOC05MyAxMS4yLTkuOSAyLjQtMTYuMiA3LjMtMTcuOCA5LjcgMS0uNCAyMi40LTkuMiAxMTEuNi05LjIgNS4yIDUzIDI5LjggMTAxLjggMjYgOTMuMi05LjcgMTUuNC0zOC4yIDYyLjQtNDcuMyA5Ny43LTUuOSAyMi45LTQuNCAzNy42IC4yIDQ3LjEgNS42IDEyLjggMTYuNCAxNi43IDIzLjIgMTguMyAyNSA1LjcgNTUuNC0zLjYgODYuNy0yMS4xLTcuNSAxMi44LTEzLjkgMjguNS05LjEgMzkuMyA3LjMgMTkuNiA0NC41IDE4LjcgODguNC05LjQgMjAuMiAzMi4yIDQwLjEgNTcuOSA1NS43IDc0LjEgMi42IDIuOCA1LjUgNS4yIDguOCA3LjEgNS4xIDMuMiA4LjYgMy40IDguNiAzLjQtOC4yLTYuNy0zNC0zOC02Mi41LTkxLjggMjIuMi0xNiA0NS43LTM4LjkgNjcuNS02OS4zIDEyMi44IDQuNiAxNDMuMy0yNC44IDE0OC0zMS42IDE0LjctMTkuOSAzLjQtNTcuNC01Ny4zLTkzLjd6TTM3MSAzMzEuOGMyMy44LTM3LjcgMzAuMy02Ny44IDI5LjQtOTIuMyAyNy45IDE3LjYgNDcuMiAzNy42IDQ5LjEgNTguOCAxLjEgMTIuOS04LjEgMjkuMS03OC41IDMzLjV6TTIxNy4xIDM4Ny43YzkuOC02LjIgMTkuNS0xMy4xIDI5LjItMjAuNSA2LjcgMTMuMyAxMy42IDI2LjEgMjAuNiAzOC4yLTQwLjYgMjEuOS02OC44IDEyLjgtNDkuOC0xNy43em0yMTUtMTcxLjNjLTEwLjMtNS4zLTIxLjItMTAuMy0zMi40LTE1IDcuOS0xMi4xIDE1LjUtMjQuNCAyMi43LTM2LjkgMzkuMSAyNC4xIDQ1LjkgNTMuMiA5LjYgNTEuOXpNMjc5LjQgMzk4Yy01LjUtMTEuNC0xMS0yMy41LTE2LjUtMzYuNCA0My4yIDEuMyA2Mi40LTE4LjcgNjMuMy0yMC40IDAgLjEtMjUgMTUuNi02Mi41IDEyLjIgMzAuNi0yNS42IDU5LjEtNTMuNyA4NS4xLTg0IDguNy0xMC4yIDE3LTIwLjYgMjQuOS0zMS4xLS40LS4zLTEuNS0zLTE2LjUtMTItNTEuNyA2MC4zLTEwMi4zIDk4LTEzMi44IDExNS45LTIwLjYtMTEuMi00MC44LTMxLjgtNTUuNy02MS41LTIwLTM5LjktMzAtODIuNC0zMS42LTExNi4xIDEyLjMgLjkgMjUuMyAyLjIgMzguOCAzLjktMjIuMyAzNi44LTE0LjQgNjMtMTMuNSA2NC4yIDAtLjEtMS0yOS4yIDIwLjEtNTkuNiA5IDUyLjUgMjQgMTAzLjggNDQuNyAxNTIuOCAuOS0uNCAxLjggLjkgMTguNy04LjItMjYuMy03NC41LTMzLjgtMTM4LjItMzQtMTczLjQgMjAtMTIuNCA0OC4yLTE5LjggODEuNi0xNy44IDQ0LjYgMi43IDg2LjQgMTUuMiAxMTYuMyAzMC43LTcuMSAxMC40LTE0LjkgMjEuMy0yMy4zIDMyLjUtMjAuNy0zNy43LTQ3LjMtNDMuOS00OC45LTQzLjcgLjEgMCAyNS45IDE0LjEgNDEuNSA0Ny4yLTM3LjUtMTMuOC03Ni4xLTI0LjQtMTE1LjMtMzEuNy0xMy4xLTIuNC0yNi4yLTQuNC0zOS40LTYtLjEgLjQtMS44IDEuOC0yLjIgMjAuMyA3Ny45IDE0LjUgMTM2LjYgMzkuOSAxNjcuMiA1Ny4yIC43IDIzLjYtNyA1MS42LTI1LjQgNzkuNi0yNC42IDM3LjMtNTYuNCA2Ny4yLTg0LjggODUuNHptMjcuNC0yODdjLTQ0LjYtMS43LTczLjYgNy40LTk0LjcgMjAuNyAyLTUyLjMgMjEuMy03Ni40IDM4LjItNzUuMyAxNi45LTQuMiA1NC45IDUyLjIgNTYuNSA1NC42em0tMTMwLjcgMy4xYy41IDEyLjEgMS42IDI0LjYgMy4yIDM3LjMtMTQuNi0uOS0yOC43LTEuMy00Mi40LTEuMy0uMSAzLjItLjEtNTEgMjQuNy00OS42bC4xIDBjNS44IDEuMSAxMC42IDYuOSAxNC40IDEzLjZ6bS0yOC4xIDE2MmMyMC44IDM5LjcgNDMuMyA2MC42IDY1LjMgNzIuMy00Ni44IDI0LjgtNzcuNSAyMC04NC45IDQuNS0uMi0uMi0xMS4xLTE1LjMgMTkuNy03Ni44bDAgMHoiXQogICAgfTsKICAgIGZhQmltb2JqZWN0ID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogImJpbW9iamVjdCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMzc4IiwgIk00MTYgMzJMMzIgMzJDMTQuNCAzMiAwIDQ2LjQgMCA2NEwwIDQ0OGMwIDE3LjYgMTQuNCAzMiAzMiAzMmwzODQgMGMxNy42IDAgMzItMTQuNCAzMi0zMmwwLTM4NGMwLTE3LjYtMTQuNC0zMi0zMi0zMnpNMzUyIDI4OS40YzAgNDkuNC0xMS40IDgyLjYtMTAzLjggODIuNmwtMTYuOSAwYy00NC4xIDAtNjIuNC0xNC45LTcwLjQtMzguOGwtLjkgMCAwIDM0LjgtNjQgMCAwLTIzMiA2NCAwIDAgNzQuNyAxLjEgMGM0LjYtMzAuNSAzOS43LTM4LjggNjkuNy0zOC44bDE3LjMgMGM5Mi40IDAgMTAzLjggMzMuMSAxMDMuOCA4Mi41bDAgMzUgLjEgMHptLTY0LTI4LjlsMCAyMi45YzAgMjEuNy0zLjQgMzMuOC0zOC40IDMzLjhsLTQ1LjMgMGMtMjguOSAwLTQ0LjEtNi41LTQ0LjEtMzUuN2wwLTE5YzAtMjkuMyAxNS4yLTM1LjcgNDQuMS0zNS43bDQ1LjMgMGMzNS0uMiAzOC40IDEyIDM4LjQgMzMuN3oiXQogICAgfTsKICAgIGZhU3ZlbHRlID0gewogICAgICBwcmVmaXg6ICJmYWIiLAogICAgICBpY29uTmFtZTogInN2ZWx0ZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlODY4IiwgIk0yMDIuMSAyNi40YzY2LjgtNDIuNiAxNTkuMy0yMi43IDIwNi4xIDQ0LjMgMTEuMSAxNS41IDE5IDMzLjEgMjMuMiA1MS44czQuNyAzNy45IDEuMyA1Ni43Yy0zLjIgMTgtMTAuMSAzNS4xLTIwLjEgNTAuMyAxNC42IDI3LjkgMTkuNiA2MCAxNCA5MS0zLjMgMTguNC0xMC40IDM2LTIwLjkgNTEuNXMtMjQuMSAyOC43LTM5LjkgMzguN0wyNDguMyA0ODUuNmMtNjYuOCA0Mi42LTE1OS4zIDIyLjctMjA2LjEtNDQuMi0xMS4xLTE1LjUtMTktMzMuMi0yMy4yLTUxLjhzLTQuNy0zNy45LTEuMy01Ni43YzMuMi0xOCAxMC4xLTM1LjEgMjAuMS01MC4zLTE0LjctMjcuOS0xOS42LTYwLTE0LTkxLjEgMy4zLTE4LjQgMTAuNC0zNiAyMC45LTUxLjVzMjQuMS0yOC43IDM5LjktMzguN0wyMDIuMSAyNi40ek0zMTUuNiA2Ny4yYy0xNy45LTYuNi0zNy40LTcuNi01NS45LTIuOC04LjQgMi4zLTE2LjUgNS44LTIzLjggMTAuNUwxMTguNSAxNDkuN2MtOS41IDYtMTcuNyAxMy45LTI0IDIzLjNTODQgMTkyLjggODIgMjAzLjljLTIgMTEuMy0xLjcgMjIuOSAuOCAzNC4xczcuMyAyMS44IDEzLjkgMzEuMmMxMC45IDE1LjcgMjYuMyAyNy42IDQ0LjIgMzQuM3MzNy40IDcuNiA1NS45IDIuOGM4LjQtMi4zIDE2LjUtNS44IDIzLjgtMTAuNWw0NC44LTI4LjZjMi4yLTEuNCA0LjctMi41IDcuMi0zLjIgNS42LTEuNCAxMS40LTEuMiAxNi44IC44czEwIDUuNiAxMy4zIDEwLjNjMiAyLjggMy41IDYgNC4yIDkuNHMuOSA2LjkgLjMgMTAuM2MtLjYgMy4zLTEuOSA2LjUtMy44IDkuMy0xLjkgMi44LTQuNCA1LjItNy4yIDdMMTc4LjggMzg2LjFjLTIuMiAxLjQtNC43IDIuNS03LjIgMy4yLTUuNiAxLjQtMTEuNCAxLjItMTYuOC0uOHMtMTAtNS42LTEzLjMtMTAuM2MtMy42LTUuMS01LjMtMTEuMi00LjctMTcuNGwuNC00LjQtNC4zLTEuM2MtMTYuNS01LTMyLjEtMTIuNy00NS45LTIyLjlsLTYtNC40LTIuMiA2LjdjLTEuMiAzLjYtMi4xIDcuMy0yLjggMTEtMiAxMS4zLTEuNyAyMi45IC44IDM0LjFzNy4zIDIxLjggMTMuOSAzMS4xYzEwLjkgMTUuNyAyNi4zIDI3LjYgNDQuMiAzNC4zczM3LjQgNy42IDU1LjggMi44YzguNC0yLjMgMTYuNS01LjggMjMuOS0xMC41bDExNy4zLTc0LjhjOS41LTYgMTcuNy0xMy45IDI0LTIzLjNzMTAuNi0xOS45IDEyLjYtMzFjMi0xMS4zIDEuOC0yMi45LS44LTM0LjFzLTcuMy0yMS44LTE0LTMxLjFjLTEwLjktMTUuNy0yNi4zLTI3LjYtNDQuMi0zNC4zcy0zNy40LTcuNi01NS45LTIuOGMtOC40IDIuMy0xNi41IDUuOC0yMy44IDEwLjVMMTg1IDI0NC44Yy0yLjIgMS40LTQuNiAyLjUtNy4yIDMuMi01LjYgMS40LTExLjUgMS4yLTE2LjgtLjhzLTEwLTUuNi0xMy4zLTEwLjNjLTItMi44LTMuNC02LTQuMi05LjRzLS45LTYuOS0uMi0xMC4zYy42LTMuMyAxLjktNi41IDMuOC05LjNzNC40LTUuMiA3LjItN2wxMTcuNC03NC44YzIuMi0xLjQgNC43LTIuNSA3LjItMy4yIDUuNi0xLjQgMTEuNC0xLjEgMTYuOCAuOXMxMCA1LjYgMTMuMyAxMC4zYzMuNiA1LjEgNS4yIDExLjMgNC43IDE3LjRsLS40IDQuNCA0LjQgMS4zYzE2LjUgNSAzMiAxMi44IDQ1LjkgMjNsNiA0LjQgMi4yLTYuOGMxLjItMy42IDIuMS03LjMgMi44LTExIDItMTEuMyAxLjgtMjIuOS0uOC0zNC4xcy03LjMtMjEuOC0xNC0zMS4xYy0xMC45LTE1LjctMjYuMy0yNy42LTQ0LjItMzQuM3oiXQogICAgfTsKICAgIGZhU3F1YXJlRGVza3BybyA9IHsKICAgICAgcHJlZml4OiAiZmFiIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtZGVza3BybyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlODQ0IiwgIk00MDguOCAzMkM0MzAuNCAzMiA0NDggNDkuNiA0NDggNzEuMmwwIDM2OS42YzAgMjEuNi0xNy42IDM5LjItMzkuMiAzOS4yTDM5LjIgNDgwQzE3LjYgNDgwIDAgNDYyLjQgMCA0NDAuOEwwIDcxLjJDMCA0OS42IDE3LjYgMzIgMzkuMiAzMmwzNjkuNiAwek0xMTAuOSAyNzQuMWwwIDExNC40IDg5LjEtLjFjMjAuNiAwIDM5LjQtMy4yIDU2LjMtOS41czMxLjMtMTUuNCA0My4yLTI3YzEyLjItMTEuOSAyMS42LTI2IDI4LjItNDIuMSA0LjYtMTEuMSA3LjctMjMgOS4yLTM1LjdsLTQzLjggMGMtMS4xIDYuNC0yLjggMTIuNC01LjEgMTguMi00LjIgMTAuOS0xMC4zIDIwLjMtMTguMiAyOC4yLTcuOSA3LjctMTcuNCAxMy43LTI4LjYgMTcuOS0xMS4xIDQuMy0yMy41IDYuNC0zNy4zIDYuNGwtNTAgMCAwLTcwLjYtNDMgLjF6bTAtMTUxLjRsMCAxMTQuNCA0My0uMSAwLTcwLjcgNTAgMGMxMy43IDAgMjYuMiAyLjEgMzcuMyA2LjQgMTEuMSA0LjMgMjAuNiAxMC4zIDI4LjYgMTguMyA3LjkgNy43IDE0IDE3LjEgMTguMiAyOC4yIDIuMyA1LjYgNCAxMS41IDUuMSAxNy44bDQzLjkgLjFjLTEuNC0xMi42LTQuNC0yNC40LTguOS0zNS4zLTYuNi0xNi40LTE2LTMwLjUtMjguMS00Mi4yLTEyLjEtMTEuOS0yNi43LTIxLjEtNDMuNi0yNy41LTE2LjktNi40LTM1LjctOS41LTU2LjMtOS41bC04OSAuMXoiXQogICAgfTsKICAgIGZhVGFpbHdpbmRDc3MgPSB7CiAgICAgIHByZWZpeDogImZhYiIsCiAgICAgIGljb25OYW1lOiAidGFpbHdpbmQtY3NzIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU4NjYiLCAiTTMyMCA2NGMtODUuMyAwLTEzOC43IDQyLjctMTYwIDEyOCAzMi00Mi43IDY5LjMtNTguNyAxMTItNDggMjQuMyA2LjEgNDEuNyAyMy44IDYxIDQzLjMgMzEuNCAzMS44IDY3LjcgNjguNyAxNDcgNjguNyA4NS4zIDAgMTM4LjctNDIuNyAxNjAtMTI4LTMyIDQyLjctNjkuMyA1OC43LTExMiA0OC0yNC4zLTYuMS00MS43LTIzLjgtNjEtNDMuMy0zMS40LTMxLjgtNjcuNy02OC43LTE0Ny02OC43ek0xNjAgMjU2Yy04NS4zIDAtMTM4LjcgNDIuNy0xNjAgMTI4IDMyLTQyLjcgNjkuMy01OC43IDExMi00OCAyNC4zIDYuMSA0MS43IDIzLjggNjEgNDMuMyAzMS40IDMxLjggNjcuNyA2OC43IDE0NyA2OC43IDg1LjMgMCAxMzguNy00Mi43IDE2MC0xMjgtMzIgNDIuNy02OS4zIDU4LjctMTEyIDQ4LTI0LjMtNi4xLTQxLjctMjMuOC02MS00My4zLTMxLjQtMzEuOC02Ny43LTY4LjctMTQ3LTY4Ljd6Il0KICAgIH07CiAgICBpY29ucyA9IHsKICAgICAgZmFTcXVhcmVHaXRodWIsCiAgICAgIGZhR2l0aHViU3F1YXJlLAogICAgICBmYVRoaW5rUGVha3MsCiAgICAgIGZhR29vZ2xlRHJpdmUsCiAgICAgIGZhQXV0b3ByZWZpeGVyLAogICAgICBmYVNxdWFyZVZpYWRlbywKICAgICAgZmFWaWFkZW9TcXVhcmUsCiAgICAgIGZhQ3BhbmVsLAogICAgICBmYU1lbmRlbGV5LAogICAgICBmYURyYWZ0MmRpZ2l0YWwsCiAgICAgIGZhUmVwbHlkLAogICAgICBmYUVtcGlyZSwKICAgICAgZmFBY2Nlc3NpYmxlSWNvbiwKICAgICAgZmFRdW9yYSwKICAgICAgZmFDY0pjYiwKICAgICAgZmFGZWRvcmEsCiAgICAgIGZhRHVvbGluZ28sCiAgICAgIGZhRmlyc3RkcmFmdCwKICAgICAgZmFGcmVlYnNkLAogICAgICBmYU9keXNlZSwKICAgICAgZmFHZ0NpcmNsZSwKICAgICAgZmFDbG91ZGZsYXJlLAogICAgICBmYUhhY2tlcnJhbmssCiAgICAgIGZhU2t5YXRsYXMsCiAgICAgIGZhRGVza3BybywKICAgICAgZmFSZXNvbHZpbmcsCiAgICAgIGZhQmxhY2tiZXJyeSwKICAgICAgZmFTdHJpcGVTLAogICAgICBmYVNxdWFyZUJlaGFuY2UsCiAgICAgIGZhQmVoYW5jZVNxdWFyZSwKICAgICAgZmFTZXJ2aWNlc3RhY2ssCiAgICAgIGZhUm9ja2V0Y2hhdCwKICAgICAgZmFSZWJlbCwKICAgICAgZmFTcXVhcmVXZWJBd2Vzb21lLAogICAgICBmYUxpbmt0cmVlLAogICAgICBmYVNpbXBseWJ1aWx0LAogICAgICBmYVN0dWJiZXIsCiAgICAgIGZhQXBwZXIsCiAgICAgIGZhR29vZ2xlU2Nob2xhciwKICAgICAgZmFZYXJuLAogICAgICBmYVN0YWNrT3ZlcmZsb3csCiAgICAgIGZhQmx1ZXRvb3RoLAogICAgICBmYUNyZWF0aXZlQ29tbW9uc05jSnAsCiAgICAgIGZhUmVkZGl0LAogICAgICBmYUNvbm5lY3RkZXZlbG9wLAogICAgICBmYVJlc2VhcmNoZ2F0ZSwKICAgICAgZmFTaWduYWxNZXNzZW5nZXIsCiAgICAgIGZhWGluZywKICAgICAgZmFTcXVhcmVKcywKICAgICAgZmFKc1NxdWFyZSwKICAgICAgZmFGb250aWNvbnMsCiAgICAgIGZhVXBzLAogICAgICBmYUFtYXpvblBheSwKICAgICAgZmFQYW5kb3JhLAogICAgICBmYU9wZW5pZCwKICAgICAgZmFWc2NvLAogICAgICBmYUdsb2JhbGVha3MsCiAgICAgIGZhVmVubW8sCiAgICAgIGZhVWJ1bnR1LAogICAgICBmYVZpYWNvaW4sCiAgICAgIGZhWmhpaHUsCiAgICAgIGZhWWFuZGV4LAogICAgICBmYVBpeGl2LAogICAgICBmYU9wZW5haSwKICAgICAgZmFTaXRoLAogICAgICBmYUp1bGlhLAogICAgICBmYU5mY0RpcmVjdGlvbmFsLAogICAgICBmYUNyZWF0aXZlQ29tbW9uc0J5LAogICAgICBmYVVtYnJhY28sCiAgICAgIGZhSG9vbGksCiAgICAgIGZhU3F1YXJlR2l0LAogICAgICBmYUdpdFNxdWFyZSwKICAgICAgZmFPZG5va2xhc3NuaWtpLAogICAgICBmYURydXBhbCwKICAgICAgZmFCbG9nZ2VyQiwKICAgICAgZmFJbnZpc2lvbiwKICAgICAgZmFGYWNlYm9va0YsCiAgICAgIGZhQ2VudG9zLAogICAgICBmYVNjYWxld2F5LAogICAgICBmYUNjQW1hem9uUGF5LAogICAgICBmYUViYXksCiAgICAgIGZhQ29udGFvLAogICAgICBmYUVsbG8sCiAgICAgIGZhU2lzdHJpeCwKICAgICAgZmFQZXJpc2NvcGUsCiAgICAgIGZhRXhwZWRpdGVkc3NsLAogICAgICBmYU5hcHN0ZXIsCiAgICAgIGZhRGVsaWNpb3VzLAogICAgICBmYUd1aWxkZWQsCiAgICAgIGZhT2JzaWRpYW4sCiAgICAgIGZhWGJveCwKICAgICAgZmFVbnRhcHBkLAogICAgICBmYUdvb2dsZVBsdXNHLAogICAgICBmYUdpdGh1YkFsdCwKICAgICAgZmFHZXRQb2NrZXQsCiAgICAgIGZhR2xpZGUsCiAgICAgIGZhQml0eSwKICAgICAgZmFXcGV4cGxvcmVyLAogICAgICBmYU1lZ2Fwb3J0LAogICAgICBmYUxlZXRjb2RlLAogICAgICBmYU1kYiwKICAgICAgZmFQYWdlNCwKICAgICAgZmFUaGVSZWRZZXRpLAogICAgICBmYUppcmEsCiAgICAgIGZhRmVkZXgsCiAgICAgIGZhRXZlcm5vdGUsCiAgICAgIGZhVXNiLAogICAgICBmYUFuZ3J5Y3JlYXRpdmUsCiAgICAgIGZhTWl6dW5pLAogICAgICBmYUl0Y2hJbywKICAgICAgZmFXaW5kb3dzLAogICAgICBmYVN0dW1ibGV1cG9uLAogICAgICBmYUdvb2dsZSwKICAgICAgZmFEaXNjb3JkLAogICAgICBmYUhhY2tlck5ld3MsCiAgICAgIGZhRWxldmVudHksCiAgICAgIGZhMTF0eSwKICAgICAgZmFUZWFtc3BlYWssCiAgICAgIGZhU3VwcGxlLAogICAgICBmYVNxdWFyZVR3aXR0ZXIsCiAgICAgIGZhVHdpdHRlclNxdWFyZSwKICAgICAgZmFWaW0sCiAgICAgIGZhRm9udEF3ZXNvbWUsCiAgICAgIGZhRm9udEF3ZXNvbWVGbGFnLAogICAgICBmYUZvbnRBd2Vzb21lTG9nb0Z1bGwsCiAgICAgIGZhV2lyc2luZGhhbmR3ZXJrLAogICAgICBmYVdzaCwKICAgICAgZmFab29tLAogICAgICBmYUNvbmZsdWVuY2UsCiAgICAgIGZhRGlnZywKICAgICAgZmFUaHJlYWRzLAogICAgICBmYVdwcmVzc3IsCiAgICAgIGZhUmVuZGFjdCwKICAgICAgZmFZb2FzdCwKICAgICAgZmFOaW1ibHIsCiAgICAgIGZhUGl4ZWxmZWQsCiAgICAgIGZhWWFob28sCiAgICAgIGZhQmx1ZXNreSwKICAgICAgZmFTY3JpYmQsCiAgICAgIGZhQ3JlYXRpdmVDb21tb25zUGQsCiAgICAgIGZhRWFybHliaXJkcywKICAgICAgZmFTeW1mb255Y2FzdHMsCiAgICAgIGZhU3F1YXJlT2Rub2tsYXNzbmlraSwKICAgICAgZmFPZG5va2xhc3NuaWtpU3F1YXJlLAogICAgICBmYU1hcmtkb3duLAogICAgICBmYVR5cG8zLAogICAgICBmYUpvb21sYSwKICAgICAgZmFXZWl4aW4sCiAgICAgIGZhR3J1bnQsCiAgICAgIGZhU3VwcG9ydG5vdywKICAgICAgZmFSb2Nrcm1zLAogICAgICBmYVVuc3BsYXNoLAogICAgICBmYVNxdWFyZUluc3RhZ3JhbSwKICAgICAgZmFJbnN0YWdyYW1TcXVhcmUsCiAgICAgIGZhRmlyc3RPcmRlckFsdCwKICAgICAgZmFGdWxjcnVtLAogICAgICBmYUFyY2hMaW51eCwKICAgICAgZmFGZWRpdmVyc2UsCiAgICAgIGZhQnJhdmVSZXZlcnNlLAogICAgICBmYUF2aWFuZXgsCiAgICAgIGZhTnM4LAogICAgICBmYVNxdWFyZVBpbnRlcmVzdCwKICAgICAgZmFQaW50ZXJlc3RTcXVhcmUsCiAgICAgIGZhQmx1ZXRvb3RoQiwKICAgICAgZmFHcmlwZmlyZSwKICAgICAgZmFTcXVhcmVHb29nbGVQbHVzLAogICAgICBmYUdvb2dsZVBsdXNTcXVhcmUsCiAgICAgIGZhR2l0ZWUsCiAgICAgIGZhWG1wcCwKICAgICAgZmFBcHBTdG9yZSwKICAgICAgZmFXaXgsCiAgICAgIGZhSW50ZXJjb20sCiAgICAgIGZhUmVhY3RldXJvcGUsCiAgICAgIGZhV2F6ZSwKICAgICAgZmFDcmVhdGl2ZUNvbW1vbnNSZW1peCwKICAgICAgZmFCYW5kY2FtcCwKICAgICAgZmFTcXVhcmVXZWJBd2Vzb21lU3Ryb2tlLAogICAgICBmYVZpbWVvViwKICAgICAgZmFTdHJhdmEsCiAgICAgIGZhVW5pcmVnaXN0cnksCiAgICAgIGZhQ2NEaW5lcnNDbHViLAogICAgICBmYUt1YmVybmV0ZXMsCiAgICAgIGZhUGludGVyZXN0LAogICAgICBmYUFsZ29saWEsCiAgICAgIGZhU3RhY2twYXRoLAogICAgICBmYU9jdG9wdXNEZXBsb3ksCiAgICAgIGZhWWFtbWVyLAogICAgICBmYU1vZHgsCiAgICAgIGZhU3F1YXJlVGhyZWFkcywKICAgICAgZmFPbGRSZXB1YmxpYywKICAgICAgZmFTdXNlLAogICAgICBmYUFwcFN0b3JlSW9zLAogICAgICBmYVVsdHJhbHl0aWNzWW9sbywKICAgICAgZmFTcXVhcmVEcmliYmJsZSwKICAgICAgZmFEcmliYmJsZVNxdWFyZSwKICAgICAgZmFVaWtpdCwKICAgICAgZmFTdXBlcnBvd2VycywKICAgICAgZmFZb3V0dWJlLAogICAgICBmYUVtYmVyLAogICAgICBmYUJvb3RzdHJhcCwKICAgICAgZmFJdHVuZXMsCiAgICAgIGZhU3F1YXJlWGluZywKICAgICAgZmFYaW5nU3F1YXJlLAogICAgICBmYUNzczNBbHQsCiAgICAgIGZhU3F1YXJlc3BhY2UsCiAgICAgIGZhVHJlbGxvLAogICAgICBmYVZpYWRlbywKICAgICAgZmFTZWFyY2hlbmdpbiwKICAgICAgZmFVbnJlYWxFbmdpbmUsCiAgICAgIGZhUGF5cGFsLAogICAgICBmYVNxdWFyZUJsdWVza3ksCiAgICAgIGZhREFuZERCZXlvbmQsCiAgICAgIGZhTWljcm9zb2Z0LAogICAgICBmYUZseSwKICAgICAgZmFDY1N0cmlwZSwKICAgICAgZmFXb3JkcHJlc3NTaW1wbGUsCiAgICAgIGZhU2VsbHN5LAogICAgICBmYURhc2hjdWJlLAogICAgICBmYUdpdHRlciwKICAgICAgZmFXb2xmUGFja0JhdHRhbGlvbiwKICAgICAgZmFMYXN0Zm0sCiAgICAgIGZhU2hvcHdhcmUsCiAgICAgIGZhQmxvZ2dlciwKICAgICAgZmFFZGdlLAogICAgICBmYUlveGhvc3QsCiAgICAgIGZhU2NobGl4LAogICAgICBmYURBbmRELAogICAgICBmYVZ1ZWpzLAogICAgICBmYU1ldGEsCiAgICAgIGZhQ3JlYXRpdmVDb21tb25zU2hhcmUsCiAgICAgIGZhU3R1ZGlvdmluYXJpLAogICAgICBmYUJpdGJ1Y2tldCwKICAgICAgZmFWaywKICAgICAgZmFHaXRodWIsCiAgICAgIGZhQ29kaWVwaWUsCiAgICAgIGZhUGllZFBpcGVyLAogICAgICBmYVJhc3BiZXJyeVBpLAogICAgICBmYUNzczMsCiAgICAgIGZhSHVic3BvdCwKICAgICAgZmFDbXBsaWQsCiAgICAgIGZhRHlhbG9nLAogICAgICBmYUVsZW1lbnRvciwKICAgICAgZmFGaXJzdE9yZGVyLAogICAgICBmYURyaWJiYmxlLAogICAgICBmYUxpbmtlZGluLAogICAgICBmYUNjUGF5cGFsLAogICAgICBmYURobCwKICAgICAgZmFUZXgsCiAgICAgIGZhQ2xhdWRlLAogICAgICBmYVNob3BpZnksCiAgICAgIGZhU3F1YXJlUmVkZGl0LAogICAgICBmYVJlZGRpdFNxdWFyZSwKICAgICAgZmFDcmVhdGl2ZUNvbW1vbnNOYywKICAgICAgZmFHYWxhY3RpY1JlcHVibGljLAogICAgICBmYUZhY2Vib29rLAogICAgICBmYUdpdGxhYiwKICAgICAgZmFRcSwKICAgICAgZmFTdHJpcGUsCiAgICAgIGZhRGFpbHltb3Rpb24sCiAgICAgIGZhU3RlYW0sCiAgICAgIGZhVmVubW9WLAogICAgICBmYVNuYXBjaGF0LAogICAgICBmYVNuYXBjaGF0R2hvc3QsCiAgICAgIGZhR2FsYWN0aWNTZW5hdGUsCiAgICAgIGZhUGhvZW5peEZyYW1ld29yaywKICAgICAgZmFHaXQsCiAgICAgIGZhT3B0aW5Nb25zdGVyLAogICAgICBmYUplbmtpbnMsCiAgICAgIGZhU2xpZGVzaGFyZSwKICAgICAgZmFVYmVyLAogICAgICBmYURpZ2l0YWxPY2VhbiwKICAgICAgZmFTb3VuZGNsb3VkLAogICAgICBmYVNxdWFyZUZpZ21hLAogICAgICBmYUNyZWF0aXZlQ29tbW9uc1NhLAogICAgICBmYUNocm9tZSwKICAgICAgZmFUcmFkZUZlZGVyYXRpb24sCiAgICAgIGZhVmFhZGluLAogICAgICBmYURldmlhbnRhcnQsCiAgICAgIGZhTWVkaXVtLAogICAgICBmYU1lZGl1bU0sCiAgICAgIGZhT3BlbmNhcnQsCiAgICAgIGZhWUNvbWJpbmF0b3IsCiAgICAgIGZhTGluZSwKICAgICAgZmFBbWlsaWEsCiAgICAgIGZhQXN5bW1ldHJpaywKICAgICAgZmFQaGFicmljYXRvciwKICAgICAgZmFCb3RzLAogICAgICBmYVZpbmUsCiAgICAgIGZhTWVkcnQsCiAgICAgIGZhT3NpLAogICAgICBmYUdnLAogICAgICBmYUJ1eXNlbGxhZHMsCiAgICAgIGZhR29vZ2xlUGx1cywKICAgICAgZmFTY3JlZW5wYWwsCiAgICAgIGZhQml0Y29pbiwKICAgICAgZmFTd2lmdCwKICAgICAgZmFGaWxlc1BpbndoZWVsLAogICAgICBmYUxhcmF2ZWwsCiAgICAgIGZhV3Bmb3JtcywKICAgICAgZmFTcGVha2VyRGVjaywKICAgICAgZmFGbGlja3IsCiAgICAgIGZhQ2NWaXNhLAogICAgICBmYVVwd29yaywKICAgICAgZmFLYWthb1RhbGssCiAgICAgIGZhRmx1dHRlciwKICAgICAgZmFCdWZmZXIsCiAgICAgIGZhR3JhdGlwYXksCiAgICAgIGZhR29vZ2xlUGF5LAogICAgICBmYUFwcGxlLAogICAgICBmYVR1bWJsciwKICAgICAgZmFQaG9lbml4U3F1YWRyb24sCiAgICAgIGZhQ2VudGVyY29kZSwKICAgICAgZmFEZWJpYW4sCiAgICAgIGZhTWFzdG9kb24sCiAgICAgIGZhU2tldGNoLAogICAgICBmYVdlYkF3ZXNvbWUsCiAgICAgIGZhU2FzcywKICAgICAgZmFUaHJlZW1hLAogICAgICBmYVNxdWFyZVdoYXRzYXBwLAogICAgICBmYVdoYXRzYXBwU3F1YXJlLAogICAgICBmYVNreXBlLAogICAgICBmYUFuZ3VsYXIsCiAgICAgIGZhQ2lyY2xlWnVsaXAsCiAgICAgIGZhT3BlbnN1c2UsCiAgICAgIGZhRHJvcGJveCwKICAgICAgZmFEZWV6ZXIsCiAgICAgIGZhQ3JlYXRpdmVDb21tb25zU2FtcGxpbmcsCiAgICAgIGZhSmVkaU9yZGVyLAogICAgICBmYVJQcm9qZWN0LAogICAgICBmYUluc3RhbG9kLAogICAgICBmYUNhbmFkaWFuTWFwbGVMZWFmLAogICAgICBmYUV0aGVyZXVtLAogICAgICBmYUhvdXp6LAogICAgICBmYVZpYmVyLAogICAgICBmYUtpY2tzdGFydGVyLAogICAgICBmYVNxdWFyZUtpY2tzdGFydGVyLAogICAgICBmYVNwb3RpZnksCiAgICAgIGZhTGVhbnB1YiwKICAgICAgZmFKYXZhLAogICAgICBmYU5mY1N5bWJvbCwKICAgICAgZmFXb2R1LAogICAgICBmYVNxdWFyZVN0ZWFtLAogICAgICBmYVN0ZWFtU3F1YXJlLAogICAgICBmYUNyZWF0aXZlQ29tbW9uc05jRXUsCiAgICAgIGZhTnBtLAogICAgICBmYUNsb3Vkc2NhbGUsCiAgICAgIGZhVGhlbWVjbywKICAgICAgZmFHb29nbGVQbGF5LAogICAgICBmYUtvcnZ1ZSwKICAgICAgZmFXM2MsCiAgICAgIGZhR3JhdiwKICAgICAgZmFBd3MsCiAgICAgIGZhR2xpZGVHLAogICAgICBmYUpzZmlkZGxlLAogICAgICBmYUtleWJhc2UsCiAgICAgIGZhTHVtb25Ecm9wLAogICAgICBmYUZvcmdlam8sCiAgICAgIGZhUG9zdGdyZXNxbCwKICAgICAgZmFXZWVibHksCiAgICAgIGZhRG9ja2VyLAogICAgICBmYU1hZ2VudG8sCiAgICAgIGZhVG9yQnJvd3NlciwKICAgICAgZmFHaXRBbHQsCiAgICAgIGZhRmlyZWZveEJyb3dzZXIsCiAgICAgIGZhQ2xvdWRzbWl0aCwKICAgICAgZmFXaXphcmRzT2ZUaGVDb2FzdCwKICAgICAgZmFDcmVhdGl2ZUNvbW1vbnNOZCwKICAgICAgZmFVc3BzLAogICAgICBmYVNxdWFyZUxldHRlcmJveGQsCiAgICAgIGZhTWFuZGFsb3JpYW4sCiAgICAgIGZhU2xhY2ssCiAgICAgIGZhU2xhY2tIYXNoLAogICAgICBmYUFuZ2VsbGlzdCwKICAgICAgZmFBbmRyb2lkLAogICAgICBmYU1lZXR1cCwKICAgICAgZmFGb250aWNvbnNGaSwKICAgICAgZmFQYWxmZWQsCiAgICAgIGZhV3BiZWdpbm5lciwKICAgICAgZmFEaWFzcG9yYSwKICAgICAgZmFQcm9kdWN0SHVudCwKICAgICAgZmFTcXVhcmVVcHdvcmssCiAgICAgIGZhQ3V0dGxlZmlzaCwKICAgICAgZmFNZWRhcHBzLAogICAgICBmYVBpeCwKICAgICAgZmFTcXVhcmVUdW1ibHIsCiAgICAgIGZhVHVtYmxyU3F1YXJlLAogICAgICBmYVJlYWN0LAogICAgICBmYUh1Z2dpbmdGYWNlLAogICAgICBmYUp4bCwKICAgICAgZmFTcXVhcmVMaW5rZWRpbiwKICAgICAgZmFDc3MsCiAgICAgIGZhSGFzaG5vZGUsCiAgICAgIGZhUmVkZGl0QWxpZW4sCiAgICAgIGZhVGlrdG9rLAogICAgICBmYVdvcmRwcmVzcywKICAgICAgZmFJZGVhbCwKICAgICAgZmFQaWVkUGlwZXJQcCwKICAgICAgZmFVc3N1bm5haCwKICAgICAgZmFGb3J0QXdlc29tZUFsdCwKICAgICAgZmFCdXJvbW9iZWxleHBlcnRlLAogICAgICBmYUJpbGliaWxpLAogICAgICBmYU5lb3MsCiAgICAgIGZhRGV2LAogICAgICBmYUhvdGphciwKICAgICAgZmFEb2NodWIsCiAgICAgIGZhVmltZW8sCiAgICAgIGZhTWF4Y2RuLAogICAgICBmYVNxdWFyZUZvbnRBd2Vzb21lU3Ryb2tlLAogICAgICBmYUZvbnRBd2Vzb21lQWx0LAogICAgICBmYVNwZWFrYXAsCiAgICAgIGZhRmFudGFzeUZsaWdodEdhbWVzLAogICAgICBmYUxpbnV4LAogICAgICBmYUNvdHRvbkJ1cmVhdSwKICAgICAgZmFHb29nbGVXYWxsZXQsCiAgICAgIGZhRm91cnNxdWFyZSwKICAgICAgZmFTaGlydHNpbmJ1bGssCiAgICAgIGZhTWludGJpdCwKICAgICAgZmFadWxpcCwKICAgICAgZmFTdGF5bGlua2VkLAogICAgICBmYVdlYmZsb3csCiAgICAgIGZhUmVucmVuLAogICAgICBmYUtvRmksCiAgICAgIGZhUmV2LAogICAgICBmYUtleWNkbiwKICAgICAgZmFIaXJlQUhlbHBlciwKICAgICAgZmFTcXVhcmVIYWNrZXJOZXdzLAogICAgICBmYUhhY2tlck5ld3NTcXVhcmUsCiAgICAgIGZhQ3JlYXRpdmVDb21tb25zUGRBbHQsCiAgICAgIGZhT3JjaWQsCiAgICAgIGZhQm9hcmRHYW1lR2VlaywKICAgICAgZmFCZ2csCiAgICAgIGZhQmVoYW5jZSwKICAgICAgZmFNb25lcm8sCiAgICAgIGZhRmlnbWEsCiAgICAgIGZhSW5zdGFncmFtLAogICAgICBmYVBlcmJ5dGUsCiAgICAgIGZhU3F1YXJlVmltZW8sCiAgICAgIGZhVmltZW9TcXVhcmUsCiAgICAgIGZhUHVzaGVkLAogICAgICBmYU1peGNsb3VkLAogICAgICBmYVlhbmRleEludGVybmF0aW9uYWwsCiAgICAgIGZhSGl2ZSwKICAgICAgZmFDcmVhdGl2ZUNvbW1vbnNaZXJvLAogICAgICBmYVNxdWFyZVNuYXBjaGF0LAogICAgICBmYVNuYXBjaGF0U3F1YXJlLAogICAgICBmYVRoZW1laXNsZSwKICAgICAgZmFEYXJ0TGFuZywKICAgICAgZmFEZXBsb3lkb2csCiAgICAgIGZhRmxpcGJvYXJkLAogICAgICBmYUJ1eU5MYXJnZSwKICAgICAgZmFXYXRjaG1hbk1vbml0b3JpbmcsCiAgICAgIGZhSGlwcywKICAgICAgZmFDbG91ZHZlcnNpZnksCiAgICAgIGZhR29vZHJlYWRzLAogICAgICBmYVRpZGFsLAogICAgICBmYVVuaXR5LAogICAgICBmYVRlbmNlbnRXZWlibywKICAgICAgZmFGcmVlQ29kZUNhbXAsCiAgICAgIGZhWFR3aXR0ZXIsCiAgICAgIGZhU3RpY2tlck11bGUsCiAgICAgIGZhVHdpdGNoLAogICAgICBmYUtpY2tzdGFydGVySywKICAgICAgZmFDcml0aWNhbFJvbGUsCiAgICAgIGZhU3RlYW1TeW1ib2wsCiAgICAgIGZhTWFpbGNoaW1wLAogICAgICBmYUx1bW9uLAogICAgICBmYU51dHJpdGlvbml4LAogICAgICBmYUNyZWF0aXZlQ29tbW9uc1NhbXBsaW5nUGx1cywKICAgICAgZmFSZWRoYXQsCiAgICAgIGZhU3F1YXJlUGllZFBpcGVyLAogICAgICBmYVBpZWRQaXBlclNxdWFyZSwKICAgICAgZmFXaGF0c2FwcCwKICAgICAgZmFJbWRiLAogICAgICBmYVB5dGhvbiwKICAgICAgZmFDYXNoQXBwLAogICAgICBmYVBpbnRlcmVzdFAsCiAgICAgIGZhV2htY3MsCiAgICAgIGZhSm9nZXQsCiAgICAgIGZhU3F1YXJlWW91dHViZSwKICAgICAgZmFZb3V0dWJlU3F1YXJlLAogICAgICBmYUF0bGFzc2lhbiwKICAgICAgZmFQaWVkUGlwZXJIYXQsCiAgICAgIGZhSW50ZXJuZXRFeHBsb3JlciwKICAgICAgZmFBaXJibmIsCiAgICAgIGZhSnMsCiAgICAgIGZhUXVpbnNjYXBlLAogICAgICBmYUFkdmVyc2FsLAogICAgICBmYUNyZWF0aXZlQ29tbW9ucywKICAgICAgZmFOb3Rpb24sCiAgICAgIGZhQ2hyb21lY2FzdCwKICAgICAgZmFVbHRyYWx5dGljc0h1YiwKICAgICAgZmFXaWtpcGVkaWFXLAogICAgICBmYVNpdHJveCwKICAgICAgZmFTcXVhcmVHaXRsYWIsCiAgICAgIGZhR2l0bGFiU3F1YXJlLAogICAgICBmYVNob2VsYWNlLAogICAgICBmYU9wZW5zdHJlZXRtYXAsCiAgICAgIGZhU2VsbGNhc3QsCiAgICAgIGZhTWl4LAogICAgICBmYUNjQXBwbGVQYXksCiAgICAgIGZhU29sYW5hLAogICAgICBmYVR5cGVzY3JpcHQsCiAgICAgIGZhQnJhdmUsCiAgICAgIGZhRXRzeSwKICAgICAgZmFCdGMsCiAgICAgIGZhQWRuLAogICAgICBmYVNxdWFyZVhUd2l0dGVyLAogICAgICBmYVNxdWFyZUZvbnRBd2Vzb21lLAogICAgICBmYUZvcnVtYmVlLAogICAgICBmYTQyR3JvdXAsCiAgICAgIGZhSW5ub3NvZnQsCiAgICAgIGZhU3R1bWJsZXVwb25DaXJjbGUsCiAgICAgIGZhU3ltZm9ueSwKICAgICAgZmFTYWxlc2ZvcmNlLAogICAgICBmYVNvdXJjZXRyZWUsCiAgICAgIGZhTGlua2VkaW5JbiwKICAgICAgZmFIdG1sNSwKICAgICAgZmFSdXN0LAogICAgICBmYUhvcm5iaWxsLAogICAgICBmYVBocCwKICAgICAgZmFEaXNxdXMsCiAgICAgIGZhNTAwcHgsCiAgICAgIGZhQWZmaWxpYXRldGhlbWUsCiAgICAgIGZhUmVkUml2ZXIsCiAgICAgIGZhVHdpdHRlciwKICAgICAgZmFGb3J0QXdlc29tZSwKICAgICAgZmFNaXhlciwKICAgICAgZmFMeWZ0LAogICAgICBmYUFwcGxlUGF5LAogICAgICBmYUFydHN0YXRpb24sCiAgICAgIGZhTm9kZUpzLAogICAgICBmYVVuY2hhcnRlZCwKICAgICAgZmFQbGF5c3RhdGlvbiwKICAgICAgZmFNaWNyb2Jsb2csCiAgICAgIGZhR2l0a3Jha2VuLAogICAgICBmYVRlbGVncmFtLAogICAgICBmYVRlbGVncmFtUGxhbmUsCiAgICAgIGZhVWx0cmFseXRpY3MsCiAgICAgIGZhSXR1bmVzTm90ZSwKICAgICAgZmFMZXNzLAogICAgICBmYUZpcmVmb3gsCiAgICAgIGZhS2FnZ2xlLAogICAgICBmYUZhY2Vib29rTWVzc2VuZ2VyLAogICAgICBmYUF1ZGlibGUsCiAgICAgIGZhUGF0cmVvbiwKICAgICAgZmFWbnYsCiAgICAgIGZhUGFnZWxpbmVzLAogICAgICBmYUFtYXpvbiwKICAgICAgZmFFbnZpcmEsCiAgICAgIGZhTGlub2RlLAogICAgICBmYUFjY3Vzb2Z0LAogICAgICBmYUVybGFuZywKICAgICAgZmFVbmlzb24sCiAgICAgIGZhQ2NEaXNjb3ZlciwKICAgICAgZmFTYWZhcmksCiAgICAgIGZhU3BhY2VBd2Vzb21lLAogICAgICBmYU5vZGUsCiAgICAgIGZhQ29kZXBlbiwKICAgICAgZmFSYXZlbHJ5LAogICAgICBmYUFsaXBheSwKICAgICAgZmFDY0FtZXgsCiAgICAgIGZhUGllZFBpcGVyQWx0LAogICAgICBmYUxldHRlcmJveGQsCiAgICAgIGZhT3BlcmEsCiAgICAgIGZhV2VpYm8sCiAgICAgIGZhUmVhZG1lLAogICAgICBmYUdvbGFuZywKICAgICAgZmFTdGFja0V4Y2hhbmdlLAogICAgICBmYUd1bHAsCiAgICAgIGZhWWVscCwKICAgICAgZmFHb2ZvcmUsCiAgICAgIGZhQXZpYXRvLAogICAgICBmYVBhZGxldCwKICAgICAgZmFFZGdlTGVnYWN5LAogICAgICBmYVNxdWFyZUxhc3RmbSwKICAgICAgZmFMYXN0Zm1TcXVhcmUsCiAgICAgIGZhR29vZHJlYWRzRywKICAgICAgZmFDY01hc3RlcmNhcmQsCiAgICAgIGZhRGlzY291cnNlLAogICAgICBmYUJsYWNrVGllLAogICAgICBmYVNxdWFyZUZhY2Vib29rLAogICAgICBmYUZhY2Vib29rU3F1YXJlLAogICAgICBmYUJhdHRsZU5ldCwKICAgICAgZmFCaW1vYmplY3QsCiAgICAgIGZhU3ZlbHRlLAogICAgICBmYVNxdWFyZURlc2twcm8sCiAgICAgIGZhVGFpbHdpbmRDc3MKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZm9ydGF3ZXNvbWUrZnJlZS1yZWd1bGFyLXN2Zy1pY29uc0A3LjIuMC9ub2RlX21vZHVsZXMvQGZvcnRhd2Vzb21lL2ZyZWUtcmVndWxhci1zdmctaWNvbnMvaW5kZXgubWpzCnZhciBwcmVmaXgyLCBmYVNxdWFyZU1pbnVzLCBmYU1pbnVzU3F1YXJlLCBmYUNhbGVuZGFyQ2hlY2ssIGZhRmFjZUtpc3MsIGZhS2lzcywgZmFQYXN0ZSwgZmFGaWxlQ2xpcGJvYXJkLCBmYUhhbmRQb2ludExlZnQsIGZhRmlsZUV4Y2VsLCBmYUVudmVsb3BlLCBmYVNxdWFyZUNhcmV0RG93biwgZmFDYXJldFNxdWFyZURvd24sIGZhVHJ1Y2ssIGZhQmVsbCwgZmFNZXNzYWdlLCBmYUNvbW1lbnRBbHQsIGZhRmFjZURpenp5LCBmYURpenp5LCBmYUNhbGVuZGFyRGF5cywgZmFDYWxlbmRhckFsdCwgZmFIYW5kUG9pbnRVcCwgZmFIYW5kTGl6YXJkLCBmYVNxdWFyZUZ1bGwsIGZhQ2lyY2xlUGF1c2UsIGZhUGF1c2VDaXJjbGUsIGZhSGFyZERyaXZlLCBmYUhkZCwgZmFGaWxlWmlwcGVyLCBmYUZpbGVBcmNoaXZlLCBmYUZsb3BweURpc2ssIGZhU2F2ZSwgZmFGYWNlR3JpblRvbmd1ZVNxdWludCwgZmFHcmluVG9uZ3VlU3F1aW50LCBmYUNhbWVyYSwgZmFDYW1lcmFBbHQsIGZhRmFjZUdyaW5TdGFycywgZmFHcmluU3RhcnMsIGZhRXllLCBmYUZhY2VTYWRUZWFyLCBmYVNhZFRlYXIsIGZhU2hhcmVGcm9tU3F1YXJlLCBmYVNoYXJlU3F1YXJlLCBmYU5vdGVTdGlja3ksIGZhU3RpY2t5Tm90ZSwgZmFIYW5kQmFja0Zpc3QsIGZhSGFuZFJvY2ssIGZhQ2hlc3NRdWVlbiwgZmFGYWNlR3JpblRlYXJzLCBmYUdyaW5UZWFycywgZmFQZW5Ub1NxdWFyZSwgZmFFZGl0LCBmYUZhY2VHcmluQmVhbVN3ZWF0LCBmYUdyaW5CZWFtU3dlYXQsIGZhQ2xvY2ssIGZhQ2xvY2tGb3VyLCBmYUZhY2VMYXVnaFdpbmssIGZhTGF1Z2hXaW5rLCBmYVBhcGVyUGxhbmUsIGZhSGVhcnQsIGZhRm9udEF3ZXNvbWUyLCBmYUZvbnRBd2Vzb21lRmxhZzIsIGZhRm9udEF3ZXNvbWVMb2dvRnVsbDIsIGZhQ2xvbmUsIGZhRm9sZGVyT3BlbiwgZmFXaW5kb3dNaW5pbWl6ZSwgZmFTdGFySGFsZiwgZmFBbGFybUNsb2NrLCBmYU5ld3NwYXBlciwgZmFIb3NwaXRhbCwgZmFIb3NwaXRhbEFsdCwgZmFIb3NwaXRhbFdpZGUsIGZhQ2lyY2xlU3RvcCwgZmFTdG9wQ2lyY2xlLCBmYU9iamVjdFVuZ3JvdXAsIGZhQ29tbWVudCwgZmFDaGVzc1Bhd24sIGZhQ2FsZW5kYXJQbHVzLCBmYUNsaXBib2FyZCwgZmFUaHVtYnNEb3duLCBmYUlkQmFkZ2UsIGZhU3F1YXJlQ2hlY2ssIGZhQ2hlY2tTcXVhcmUsIGZhQ2hlc3NCaXNob3AsIGZhRW52ZWxvcGVPcGVuLCBmYUNpcmNsZVhtYXJrLCBmYVRpbWVzQ2lyY2xlLCBmYVhtYXJrQ2lyY2xlLCBmYVNxdWFyZUNhcmV0VXAsIGZhQ2FyZXRTcXVhcmVVcCwgZmFGaWxlSW1hZ2UsIGZhU3F1YXJlQ2FyZXRSaWdodCwgZmFDYXJldFNxdWFyZVJpZ2h0LCBmYVN1biwgZmFJbWFnZSwgZmFMaWdodGJ1bGIsIGZhQWRkcmVzc0NhcmQsIGZhQ29udGFjdENhcmQsIGZhVmNhcmQsIGZhRmFjZU1laCwgZmFNZWgsIGZhTWFwLCBmYUhhbmRQb2ludERvd24sIGZhRmFjZU1laEJsYW5rLCBmYU1laEJsYW5rLCBmYUZhY2VHcmluVG9uZ3VlLCBmYUdyaW5Ub25ndWUsIGZhRnV0Ym9sLCBmYUZ1dGJvbEJhbGwsIGZhU29jY2VyQmFsbCwgZmFGYWNlU3VycHJpc2UsIGZhU3VycHJpc2UsIGZhRm9sZGVyLCBmYUZvbGRlckJsYW5rLCBmYUNsb3VkLCBmYUNpcmNsZSwgZmFGYWNlR3JpblNxdWludCwgZmFHcmluU3F1aW50LCBmYUNpcmNsZVVzZXIsIGZhVXNlckNpcmNsZSwgZmFSZWN0YW5nbGVMaXN0LCBmYUxpc3RBbHQsIGZhSGFuZCwgZmFIYW5kUGFwZXIsIGZhVGh1bWJzVXAsIGZhQnVpbGRpbmcsIGZhQ2hlc3NSb29rLCBmYUNpcmNsZVF1ZXN0aW9uLCBmYVF1ZXN0aW9uQ2lyY2xlLCBmYUZpbGUsIGZhRmFjZVNhZENyeSwgZmFTYWRDcnksIGZhQ2FsZW5kYXJNaW51cywgZmFGYWNlVGlyZWQsIGZhVGlyZWQsIGZhSGFuZFBvaW50UmlnaHQsIGZhQ2lyY2xlVXAsIGZhQXJyb3dBbHRDaXJjbGVVcCwgZmFIYW5kU2Npc3NvcnMsIGZhR2VtLCBmYVJlY3RhbmdsZVhtYXJrLCBmYVJlY3RhbmdsZVRpbWVzLCBmYVRpbWVzUmVjdGFuZ2xlLCBmYVdpbmRvd0Nsb3NlLCBmYVRyYXNoQ2FuLCBmYVRyYXNoQWx0LCBmYUxpZmVSaW5nLCBmYUNvcHlyaWdodCwgZmFDaXJjbGVMZWZ0LCBmYUFycm93QWx0Q2lyY2xlTGVmdCwgZmFDYWxlbmRhciwgZmFGYWNlRnJvd25PcGVuLCBmYUZyb3duT3BlbiwgZmFDaGFydEJhciwgZmFCYXJDaGFydCwgZmFIb3VzZSwgZmFIb21lLCBmYUhvbWVBbHQsIGZhSG9tZUxnQWx0LCBmYUZhY2VGcm93biwgZmFGcm93biwgZmFVc2VyLCBmYVVzZXJBbHQsIGZhVXNlckxhcmdlLCBmYVNub3dmbGFrZSwgZmFCb29rbWFyaywgZmFTcXVhcmVDYXJldExlZnQsIGZhQ2FyZXRTcXVhcmVMZWZ0LCBmYUhhbmRzaGFrZSwgZmFIYW5kc2hha2VBbHQsIGZhSGFuZHNoYWtlU2ltcGxlLCBmYUZhY2VTbWlsZVdpbmssIGZhU21pbGVXaW5rLCBmYUZhY2VHcmluU3F1aW50VGVhcnMsIGZhR3JpblNxdWludFRlYXJzLCBmYUZpbGVBdWRpbywgZmFDYWxlbmRhclhtYXJrLCBmYUNhbGVuZGFyVGltZXMsIGZhQ2lyY2xlRG93biwgZmFBcnJvd0FsdENpcmNsZURvd24sIGZhRmlsZUxpbmVzLCBmYUZpbGVBbHQsIGZhRmlsZVRleHQsIGZhQ29tbWVudHMsIGZhQ2lyY2xlQ2hlY2ssIGZhQ2hlY2tDaXJjbGUsIGZhTW9vbiwgZmFDbG9zZWRDYXB0aW9uaW5nLCBmYUltYWdlcywgZmFDaXJjbGVSaWdodCwgZmFBcnJvd0FsdENpcmNsZVJpZ2h0LCBmYUlkQ2FyZCwgZmFEcml2ZXJzTGljZW5zZSwgZmFDaXJjbGVQbGF5LCBmYVBsYXlDaXJjbGUsIGZhRmFjZUxhdWdoQmVhbSwgZmFMYXVnaEJlYW0sIGZhQWRkcmVzc0Jvb2ssIGZhQ29udGFjdEJvb2ssIGZhSG91cmdsYXNzLCBmYUhvdXJnbGFzc0VtcHR5LCBmYUhlYWRwaG9uZXMsIGZhSGVhZHBob25lc0FsdCwgZmFIZWFkcGhvbmVzU2ltcGxlLCBmYUZpbGVQb3dlcnBvaW50LCBmYVdpbmRvd01heGltaXplLCBmYUNvbW1lbnREb3RzLCBmYUNvbW1lbnRpbmcsIGZhRmFjZUdyaW5Ub25ndWVXaW5rLCBmYUdyaW5Ub25ndWVXaW5rLCBmYUhvdXJnbGFzc0hhbGYsIGZhSG91cmdsYXNzMiwgZmFDcmVkaXRDYXJkLCBmYUNyZWRpdENhcmRBbHQsIGZhSGFuZFNwb2NrLCBmYUJlbGxTbGFzaCwgZmFTdGFyLCBmYUZsYWcsIGZhTGVtb24sIGZhV2luZG93UmVzdG9yZSwgZmFGYWNlR3JpbkhlYXJ0cywgZmFHcmluSGVhcnRzLCBmYUZhY2VLaXNzQmVhbSwgZmFLaXNzQmVhbSwgZmFGaWxlUGRmLCBmYUZhY2VHcmluV2lkZSwgZmFHcmluQWx0LCBmYUZhY2VMYXVnaFNxdWludCwgZmFMYXVnaFNxdWludCwgZmFGYWNlS2lzc1dpbmtIZWFydCwgZmFLaXNzV2lua0hlYXJ0LCBmYUNvcHksIGZhQ2hlc3NLaW5nLCBmYVNxdWFyZVBsdXMsIGZhUGx1c1NxdWFyZSwgZmFGaWxlQ29kZSwgZmFGYWNlR3JpbldpbmssIGZhR3JpbldpbmssIGZhTW9uZXlCaWxsMSwgZmFNb25leUJpbGxBbHQsIGZhRXllU2xhc2gsIGZhRmlsZVdvcmQsIGZhRmFjZUFuZ3J5LCBmYUFuZ3J5LCBmYUNoZXNzS25pZ2h0LCBmYUZhY2VHcmluQmVhbSwgZmFHcmluQmVhbSwgZmFIYW5kUGVhY2UsIGZhQ29tcGFzcywgZmFTcXVhcmUsIGZhRmFjZUdyaW4sIGZhR3JpbiwgZmFGYWNlU21pbGUsIGZhU21pbGUsIGZhRmFjZVNtaWxlQmVhbSwgZmFTbWlsZUJlYW0sIGZhRm9sZGVyQ2xvc2VkLCBmYUtleWJvYXJkLCBmYUZhY2VSb2xsaW5nRXllcywgZmFNZWhSb2xsaW5nRXllcywgZmFGYWNlR3JpbWFjZSwgZmFHcmltYWNlLCBmYUNpcmNsZURvdCwgZmFEb3RDaXJjbGUsIGZhT2JqZWN0R3JvdXAsIGZhRmFjZUZsdXNoZWQsIGZhRmx1c2hlZCwgZmFTdGFySGFsZlN0cm9rZSwgZmFTdGFySGFsZkFsdCwgZmFGaWxlVmlkZW8sIGZhRmFjZUxhdWdoLCBmYUxhdWdoLCBmYUhhbmRQb2ludGVyLCBmYVJlZ2lzdGVyZWQsIGljb25zMjsKdmFyIGluaXRfZnJlZV9yZWd1bGFyX3N2Z19pY29ucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0Bmb3J0YXdlc29tZStmcmVlLXJlZ3VsYXItc3ZnLWljb25zQDcuMi4wL25vZGVfbW9kdWxlcy9AZm9ydGF3ZXNvbWUvZnJlZS1yZWd1bGFyLXN2Zy1pY29ucy9pbmRleC5tanMiKCkgewogICAgcHJlZml4MiA9ICJmYXIiOwogICAgZmFTcXVhcmVNaW51cyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtbWludXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs2MTc2NywgIm1pbnVzLXNxdWFyZSJdLCAiZjE0NiIsICJNNjQgODBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyMGMwIDguOCA3LjIgMTYgMTYgMTZsMzIwIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzIwYzAtOC44LTcuMi0xNi0xNi0xNkw2NCA4MHpNMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZ6TTEzNiAyMzJsMTc2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE3NiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFNaW51c1NxdWFyZSA9IGZhU3F1YXJlTWludXM7CiAgICBmYUNhbGVuZGFyQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY2FsZW5kYXItY2hlY2siLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjI3NCIsICJNMzI4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA0MCAzMiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjg4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsMzIgMCAwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA0MCAxNjAgMCAwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0ek02NCAxMTJjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDI4OGMwIDguOCA3LjIgMTYgMTYgMTZsMzIwIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMjg4YzAtOC44LTcuMi0xNi0xNi0xNkw2NCAxMTJ6bTIzMC43IDY1LjljNy44LTEwLjcgMjIuOC0xMy4xIDMzLjUtNS4zIDEwLjcgNy44IDEzLjEgMjIuOCA1LjMgMzMuNUwyMTEuNCAzNzQuMWMtNC4xIDUuNy0xMC41IDkuMy0xNy41IDkuOC03IC41LTEzLjktMi0xOC44LTYuOWwtNTUuOS01NS45Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBsMzYgMzYgMTA1LjYtMTQ1LjJ6Il0KICAgIH07CiAgICBmYUZhY2VLaXNzID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2Uta2lzcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODUzNSwgImtpc3MiXSwgImY1OTYiLCAiTTQ2NCAyNTZhMjA4IDIwOCAwIDEgMCAtNDE2IDAgMjA4IDIwOCAwIDEgMCA0MTYgMHpNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMjQwIDBsMzIgMGMyNi41IDAgNDggMjEuNSA0OCA0OCAwIDEyLjMtNC42IDIzLjUtMTIuMiAzMiA3LjYgOC41IDEyLjIgMTkuNyAxMi4yIDMyIDAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZzNy4yLTE2IDE2LTE2bDE2IDBjOC44IDAgMTYtNy4yIDE2LTE2cy03LjItMTYtMTYtMTZsLTE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsMTYgMGM4LjggMCAxNi03LjIgMTYtMTZzLTcuMi0xNi0xNi0xNmwtMTYgMGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNnptLTk2LTQ4YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTE5Mi0zMmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYUtpc3MgPSBmYUZhY2VLaXNzOwogICAgZmFQYXN0ZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJwYXN0ZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJmaWxlLWNsaXBib2FyZCJdLCAiZjBlYSIsICJNNjQgNDhsMjI0IDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgNDggNDggMCAwLTQ4YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDBDMjguNyAwIDAgMjguNyAwIDY0TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDExMiAwIDAtNDgtMTEyIDBjLTguOCAwLTE2LTcuMi0xNi0xNkw0OCA2NGMwLTguOCA3LjItMTYgMTYtMTZ6bTE3NiA3MmMwLTEzLjMtMTAuNy0yNC0yNC0yNEwxMDQgOTZjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTA1LjYgMGM4LjgtOC42IDE5LTE1LjggMzAuMi0yMS4xIC4xLS45IC4yLTEuOSAuMi0yLjl6TTQ0OCA0NjRsLTE2MCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0yMjRjMC04LjggNy4yLTE2IDE2LTE2bDEwMS41IDBjNC4yIDAgOC4zIDEuNyAxMS4zIDQuN2w1OC41IDU4LjVjMyAzIDQuNyA3LjEgNC43IDExLjNMNDY0IDQ0OGMwIDguOC03LjIgMTYtMTYgMTZ6TTIyNCAyMjRsMCAyMjRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTYwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xNjUuNWMwLTE3LTYuNy0zMy4zLTE4LjctNDUuM2wtNTguNS01OC41Yy0xMi0xMi0yOC4zLTE4LjctNDUuMy0xOC43TDI4OCAxNjBjLTM1LjMgMC02NCAyOC43LTY0IDY0eiJdCiAgICB9OwogICAgZmFGaWxlQ2xpcGJvYXJkID0gZmFQYXN0ZTsKICAgIGZhSGFuZFBvaW50TGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kLXBvaW50LWxlZnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjBhNSIsICJNNjQgMTI4bDE3Ny42IDBjLTEgNS4yLTEuNiAxMC41LTEuNiAxNmwwIDE2LTE3NiAwYy04LjggMC0xNi03LjItMTYtMTZzNy4yLTE2IDE2LTE2em0yMjQgMTZjMC0xNy43IDE0LjMtMzIgMzItMzJsMjQgMGM2Ni4zIDAgMTIwIDUzLjcgMTIwIDEyMGwwIDQ4YzAgNTIuNS0zMy43IDk3LjEtODAuNyAxMTMuNCAuNS0zLjEgLjctNi4yIC43LTkuNCAwLTIwLTkuMi0zNy45LTIzLjYtNDkuNyA0LjktOSA3LjYtMTkuNCA3LjYtMzAuMyAwLTE1LjEtNS4zLTI5LTE0LTQwIDguOC0xMSAxNC0yNC45IDE0LTQwbDAtNDBjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCA0MGMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTgwem0zMi04MGwwIDBjLTE4IDAtMzQuNiA2LTQ4IDE2TDY0IDgwQzI4LjcgODAgMCAxMDguNyAwIDE0NHMyOC43IDY0IDY0IDY0bDgyIDBjLTEuMyA1LjEtMiAxMC41LTIgMTYgMCAyNS4zIDE0LjcgNDcuMiAzNiA1Ny42LTIuNiA3LTQgMTQuNS00IDIyLjQgMCAyMCA5LjIgMzcuOSAyMy42IDQ5LjctNC45IDktNy42IDE5LjQtNy42IDMwLjMgMCAzNS4zIDI4LjcgNjQgNjQgNjRsODggMGM5Mi44IDAgMTY4LTc1LjIgMTY4LTE2OGwwLTQ4YzAtOTIuOC03NS4yLTE2OC0xNjgtMTY4bC0yNCAwek0yNTYgNDAwYy04LjggMC0xNi03LjItMTYtMTZzNy4yLTE2IDE2LTE2bDY0IDBjOC44IDAgMTYgNy4yIDE2IDE2cy03LjIgMTYtMTYgMTZsLTY0IDB6TTI0MCAyMjRjMCA1LjUgLjcgMTAuOSAyIDE2bC0zNCAwYy04LjggMC0xNi03LjItMTYtMTZzNy4yLTE2IDE2LTE2bDMyIDAgMCAxNnptMjQgNjRsNDAgMGM4LjggMCAxNiA3LjIgMTYgMTZzLTcuMiAxNi0xNiAxNmwtNjQgMGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNmwyNCAweiJdCiAgICB9OwogICAgZmFGaWxlRXhjZWwgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1leGNlbCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMWMzIiwgIk02NCA0OGwxMTIgMCAwIDg4YzAgMzkuOCAzMi4yIDcyIDcyIDcybDg4IDAgMCAyNDBjMCA4LjgtNy4yIDE2LTE2IDE2TDY0IDQ2NGMtOC44IDAtMTYtNy4yLTE2LTE2TDQ4IDY0YzAtOC44IDcuMi0xNiAxNi0xNnpNMjI0IDY3LjlsOTIuMSA5Mi4xLTY4LjEgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC02OC4xek02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI2MS41YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI0Mi43IDE4LjdDMjMwLjcgNi43IDIxNC41IDAgMTk3LjUgMEw2NCAwem05OS4yIDI2NS42Yy04LTEwLjYtMjMtMTIuOC0zMy42LTQuOHMtMTIuOCAyMy00LjggMzMuNkwxNjIgMzQ0IDEyNC44IDM5My42Yy04IDEwLjYtNS44IDI1LjYgNC44IDMzLjZzMjUuNiA1LjggMzMuNi00LjhMMTkyIDM4NCAyMjAuOCA0MjIuNGM4IDEwLjYgMjMgMTIuOCAzMy42IDQuOHMxMi44LTIzIDQuOC0zMy42TDIyMiAzNDQgMjU5LjIgMjk0LjRjOC0xMC42IDUuOC0yNS42LTQuOC0zMy42cy0yNS42LTUuOC0zMy42IDQuOEwxOTIgMzA0IDE2My4yIDI2NS42eiJdCiAgICB9OwogICAgZmFFbnZlbG9wZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJlbnZlbG9wZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODM4NiwgOTk5MywgNjE0NDNdLCAiZjBlMCIsICJNNjEuNCA2NEMyNy41IDY0IDAgOTEuNSAwIDEyNS40IDAgMTI2LjMgMCAxMjcuMSAuMSAxMjhMMCAxMjggMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNTYtLjEgMGMwLS45IC4xLTEuNyAuMS0yLjYgMC0zMy45LTI3LjUtNjEuNC02MS40LTYxLjRMNjEuNCA2NHpNNDY0IDE5Mi4zTDQ2NCAzODRjMCA4LjgtNy4yIDE2LTE2IDE2TDY0IDQwMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMTkxLjcgMTU0LjggMTE3LjRjMzEuNCAyMy45IDc0LjkgMjMuOSAxMDYuNCAwTDQ2NCAxOTIuM3pNNDggMTI1LjRDNDggMTE4IDU0IDExMiA2MS40IDExMmwzODkuMiAwYzcuNCAwIDEzLjQgNiAxMy40IDEzLjQgMCA0LjItMiA4LjItNS4zIDEwLjdMMjgwLjIgMjcxLjVjLTE0LjMgMTAuOC0zNC4xIDEwLjgtNDguNCAwTDUzLjMgMTM2LjFjLTMuMy0yLjUtNS4zLTYuNS01LjMtMTAuN3oiXQogICAgfTsKICAgIGZhU3F1YXJlQ2FyZXREb3duID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1jYXJldC1kb3duIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImNhcmV0LXNxdWFyZS1kb3duIl0sICJmMTUwIiwgIk0zODQgNDMyYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyMGMwLTguOC03LjItMTYtMTYtMTZMNjQgODBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyMGMwIDguOCA3LjIgMTYgMTYgMTZsMzIwIDB6bTY0LTE2YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMHpNMjI0IDM1MmMtNi43IDAtMTMtMi44LTE3LjYtNy43bC0xMDQtMTEyYy02LjUtNy04LjItMTcuMi00LjQtMjUuOVMxMTAuNSAxOTIgMTIwIDE5MmwyMDggMGM5LjUgMCAxOC4yIDUuNyAyMiAxNC40czIuMSAxOC45LTQuNCAyNS45bC0xMDQgMTEyYy00LjUgNC45LTEwLjkgNy43LTE3LjYgNy43eiJdCiAgICB9OwogICAgZmFDYXJldFNxdWFyZURvd24gPSBmYVNxdWFyZUNhcmV0RG93bjsKICAgIGZhVHJ1Y2sgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAidHJ1Y2siLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjg2NjYsIDk5NTFdLCAiZjBkMSIsICJNNjQgODBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDI4OGMwIDguOCA3LjIgMTYgMTYgMTZsMy4zIDBjMTAuNC0zNi45IDQ0LjQtNjQgODQuNy02NHM3NC4yIDI3LjEgODQuNyA2NGwxMDIuNiAwYzQuOS0xNy40IDE1LjEtMzIuNyAyOC43LTQzLjlMMzY4IDk2YzAtOC44LTcuMi0xNi0xNi0xNkw2NCA4MHptMy4zIDM2OEw2NCA0NDhjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMjg4IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMiA1NS40IDBjMTcgMCAzMy4zIDYuNyA0NS4zIDE4LjdsNDAuNiA0MC42YzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNMNTc2IDM4NGMwIDM1LjMtMjguNyA2NC02NCA2NGwtMy4zIDBjLTEwLjQgMzYuOS00NC40IDY0LTg0LjcgNjRzLTc0LjItMjcuMS04NC43LTY0bC0xMDIuNiAwYy0xMC40IDM2LjktNDQuNCA2NC04NC43IDY0cy03NC4yLTI3LjEtODQuNy02NHpNNDE2IDI1NmwxMTIgMCAwLTIzLjRjMC00LjItMS43LTguMy00LjctMTEuM2wtNDAuNi00MC42Yy0zLTMtNy4xLTQuNy0xMS4zLTQuN2wtNTUuNCAwIDAgODB6bTAgNDhsMCAzMi40YzIuNi0uMiA1LjMtLjQgOC0uNCA0MC4zIDAgNzQuMiAyNy4xIDg0LjcgNjRsMy4zIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtODAtMTEyIDB6TTE1MiA0NjRhNDAgNDAgMCAxIDAgMC04MCA0MCA0MCAwIDEgMCAwIDgwem0yNzIgMGE0MCA0MCAwIDEgMCAwLTgwIDQwIDQwIDAgMSAwIDAgODB6Il0KICAgIH07CiAgICBmYUJlbGwgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiYmVsbCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyODI3NiwgNjE2MDJdLCAiZjBmMyIsICJNMjI0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgOS43QzExOC42IDQ1LjMgNTYgMTE1LjQgNTYgMjAwbDAgMTQuNWMwIDM3LjctMTAgNzQuNy0yOSAxMDcuM0w1LjEgMzU5LjJDMS44IDM2NSAwIDM3MS41IDAgMzc4LjIgMCAzOTkuMSAxNi45IDQxNiAzNy44IDQxNmwzNzIuNCAwYzIwLjkgMCAzNy44LTE2LjkgMzcuOC0zNy44IDAtNi43LTEuOC0xMy4zLTUuMS0xOUw0MjEgMzIxLjdjLTE5LTMyLjYtMjktNjkuNi0yOS0xMDcuM2wwLTE0LjVjMC04NC42LTYyLjYtMTU0LjctMTQ0LTE2Ni4zbDAtOS43YzAtMTMuMy0xMC43LTI0LTI0LTI0ek0zOTIuNCAzNjhsLTMzNi45IDAgMTIuOS0yMi4xQzkxLjcgMzA2IDEwNCAyNjAuNiAxMDQgMjE0LjVsMC0xNC41YzAtNjYuMyA1My43LTEyMCAxMjAtMTIwczEyMCA1My43IDEyMCAxMjBsMCAxNC41YzAgNDYuMiAxMi4zIDkxLjUgMzUuNSAxMzEuNEwzOTIuNCAzNjh6TTE1Ni4xIDQ2NGM5LjkgMjggMzYuNiA0OCA2Ny45IDQ4czU4LTIwIDY3LjktNDhsLTEzNS44IDB6Il0KICAgIH07CiAgICBmYU1lc3NhZ2UgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAibWVzc2FnZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJjb21tZW50LWFsdCJdLCAiZjI3YSIsICJNMjAzLjcgNTEyLjlzMCAwIDAgMGwtMzcuOCAyNi43Yy03LjMgNS4yLTE2LjkgNS44LTI0LjkgMS43UzEyOCA1MjkgMTI4IDUyMGwwLTcyLTMyIDBjLTUzIDAtOTYtNDMtOTYtOTZMMCAxMjhDMCA3NSA0MyAzMiA5NiAzMmwzMjAgMGM1MyAwIDk2IDQzIDk2IDk2bDAgMjI0YzAgNTMtNDMgOTYtOTYgOTZsLTEyMC40IDAtOTEuOSA2NC45em02NC4zLTEwNC4xYzguMS01LjcgMTcuOC04LjggMjcuNy04LjhMNDE2IDQwMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTIyNGMwLTI2LjUtMjEuNS00OC00OC00OEw5NiA4MGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCAyMjRjMCAyNi41IDIxLjUgNDggNDggNDhsNTYgMGMxMC40IDAgMTkuMyA2LjYgMjIuNiAxNS45IC45IDIuNSAxLjQgNS4yIDEuNCA4LjFsMCA0OS43YzMyLjctMjMuMSA2My4zLTQ0LjcgOTEuOS02NC45eiJdCiAgICB9OwogICAgZmFDb21tZW50QWx0ID0gZmFNZXNzYWdlOwogICAgZmFGYWNlRGl6enkgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1kaXp6eSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJkaXp6eSJdLCAiZjU2NyIsICJNNDY0IDI1NmEyMDggMjA4IDAgMSAwIC00MTYgMCAyMDggMjA4IDAgMSAwIDQxNiAwek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwek0xMzQuMSAxNTMuOWwyNS45IDI1LjkgMjUuOS0yNS45YzcuOC03LjggMjAuNS03LjggMjguMyAwczcuOCAyMC41IDAgMjguM2wtMjUuOSAyNS45IDI1LjkgMjUuOWM3LjggNy44IDcuOCAyMC41IDAgMjguM3MtMjAuNSA3LjgtMjguMyAwbC0yNS45LTI1LjktMjUuOSAyNS45Yy03LjggNy44LTIwLjUgNy44LTI4LjMgMHMtNy44LTIwLjUgMC0yOC4zbDI1LjktMjUuOS0yNS45LTI1LjljLTcuOC03LjgtNy44LTIwLjUgMC0yOC4zczIwLjUtNy44IDI4LjMgMHptMTkyIDBsMjUuOSAyNS45IDI1LjktMjUuOWM3LjgtNy44IDIwLjUtNy44IDI4LjMgMHM3LjggMjAuNSAwIDI4LjNsLTI1LjkgMjUuOSAyNS45IDI1LjljNy44IDcuOCA3LjggMjAuNSAwIDI4LjNzLTIwLjUgNy44LTI4LjMgMGwtMjUuOS0yNS45LTI1LjkgMjUuOWMtNy44IDcuOC0yMC41IDcuOC0yOC4zIDBzLTcuOC0yMC41IDAtMjguM2wyNS45LTI1LjktMjUuOS0yNS45Yy03LjgtNy44LTcuOC0yMC41IDAtMjguM3MyMC41LTcuOCAyOC4zIDB6TTI1NiAyODhhNjQgNjQgMCAxIDEgMCAxMjggNjQgNjQgMCAxIDEgMC0xMjh6Il0KICAgIH07CiAgICBmYURpenp5ID0gZmFGYWNlRGl6enk7CiAgICBmYUNhbGVuZGFyRGF5cyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjYWxlbmRhci1kYXlzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImNhbGVuZGFyLWFsdCJdLCAiZjA3MyIsICJNMTIwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA0MCAxNjAgMCAwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA0MCAzMiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjg4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsMzIgMCAwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0ek0zODQgNDMyYzguOCAwIDE2LTcuMiAxNi0xNmwwLTY0LTg4IDAgMCA4MCA3MiAwem0xNi0xMjhsMC04MC04OCAwIDAgODAgODggMHptLTEzNiAwbDAtODAtODAgMCAwIDgwIDgwIDB6bS0xMjggMGwwLTgwLTg4IDAgMCA4MCA4OCAwek00OCAzNTJsMCA2NGMwIDguOCA3LjIgMTYgMTYgMTZsNzIgMCAwLTgwLTg4IDB6bTEzNiAwbDAgODAgODAgMCAwLTgwLTgwIDB6TTEyMCAxMTJsLTU2IDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDQ4IDM1MiAwIDAtNDhjMC04LjgtNy4yLTE2LTE2LTE2bC0yNjQgMHoiXQogICAgfTsKICAgIGZhQ2FsZW5kYXJBbHQgPSBmYUNhbGVuZGFyRGF5czsKICAgIGZhSGFuZFBvaW50VXAgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1wb2ludC11cCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzk3NTddLCAiZjBhNiIsICJNNjQgNjRsMCAxNzcuNmM1LjItMSAxMC41LTEuNiAxNi0xLjZsMTYgMCAwLTE3NmMwLTguOC03LjItMTYtMTYtMTZTNjQgNTUuMiA2NCA2NHpNODAgMjg4Yy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDI0YzAgNjYuMyA1My43IDEyMCAxMjAgMTIwbDQ4IDBjNTIuNSAwIDk3LjEtMzMuNyAxMTMuNC04MC43LTMuMSAuNS02LjIgLjctOS40IC43LTIwIDAtMzcuOS05LjItNDkuNy0yMy42LTkgNC45LTE5LjQgNy42LTMwLjMgNy42LTE1LjEgMC0yOS01LjMtNDAtMTQtMTEgOC44LTI0LjkgMTQtNDAgMTRsLTQwIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsNDAgMGM4LjggMCAxNi03LjIgMTYtMTZzLTcuMi0xNi0xNi0xNmwtODAgMHpNMCAzMjBsMCAwYzAtMTggNi0zNC42IDE2LTQ4TDE2IDY0QzE2IDI4LjcgNDQuNyAwIDgwIDBzNjQgMjguNyA2NCA2NGwwIDgyYzUuMS0xLjMgMTAuNS0yIDE2LTIgMjUuMyAwIDQ3LjIgMTQuNyA1Ny42IDM2IDctMi42IDE0LjUtNCAyMi40LTQgMjAgMCAzNy45IDkuMiA0OS43IDIzLjYgOS00LjkgMTkuNC03LjYgMzAuMy03LjYgMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCA4OGMwIDkyLjgtNzUuMiAxNjgtMTY4IDE2OGwtNDggMEM3NS4yIDUxMiAwIDQzNi44IDAgMzQ0bDAtMjR6bTMzNi02NGMwLTguOC03LjItMTYtMTYtMTZzLTE2IDcuMi0xNiAxNmwwIDY0YzAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZsMC02NHpNMTYwIDI0MGM1LjUgMCAxMC45IC43IDE2IDJsMC0zNGMwLTguOC03LjItMTYtMTYtMTZzLTE2IDcuMi0xNiAxNmwwIDMyIDE2IDB6bTY0IDI0bDAgNDBjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTY0YzAtOC44LTcuMi0xNi0xNi0xNnMtMTYgNy4yLTE2IDE2bDAgMjR6Il0KICAgIH07CiAgICBmYUhhbmRMaXphcmQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1saXphcmQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjI1OCIsICJNNzIgMTEyYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDE2OCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0cy0yOC43IDY0LTY0IDY0bC0xMDQgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNTIgMGM0LjUgMCA4LjkgMS4zIDEyLjcgMy42bDY0IDQwYzcgNC40IDExLjMgMTIuMSAxMS4zIDIwLjRsMCAyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTEwLjctNDYuOS0yOS4zLTE0NS4xIDBjLTM5LjggMC03Mi0zMi4yLTcyLTcyczMyLjItNzIgNzItNzJsMTA0IDBjOC44IDAgMTYtNy4yIDE2LTE2cy03LjItMTYtMTYtMTZMNzIgMjA4Yy0zOS44IDAtNzItMzIuMi03Mi03MlMzMi4yIDY0IDcyIDY0bDIwOS42IDBjNDYuNyAwIDkwLjkgMjEuNSAxMTkuNyA1OC4zbDc4LjQgMTAwLjFjMjAuOSAyNi43IDMyLjMgNTkuNyAzMi4zIDkzLjdMNTEyIDQyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTEwNy45YzAtMjMuMi03LjgtNDUuOC0yMi4xLTY0LjFMMzYzLjUgMTUxLjljLTE5LjctMjUuMi00OS45LTM5LjktODEuOS0zOS45TDcyIDExMnoiXQogICAgfTsKICAgIGZhU3F1YXJlRnVsbCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtZnVsbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODk5NywgMTI4OTk4LCAxMjg5OTksIDEyOWUzLCAxMjkwMDEsIDEyOTAwMiwgMTI5MDAzLCAxMTAzNSwgMTEwMzZdLCAiZjQ1YyIsICJNNDQ4IDQ4YzguOCAwIDE2IDcuMiAxNiAxNmwwIDM4NGMwIDguOC03LjIgMTYtMTYgMTZMNjQgNDY0Yy04LjggMC0xNi03LjItMTYtMTZMNDggNjRjMC04LjggNy4yLTE2IDE2LTE2bDM4NCAwek02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwzODQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTM4NGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAweiJdCiAgICB9OwogICAgZmFDaXJjbGVQYXVzZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtcGF1c2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MjA5MiwgInBhdXNlLWNpcmNsZSJdLCAiZjI4YiIsICJNMjU2IDQ4YTIwOCAyMDggMCAxIDEgMCA0MTYgMjA4IDIwOCAwIDEgMSAwLTQxNnptMCA0NjRhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0yMjQgMTg0YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTQ0YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xNDR6bTExMiAwYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTQ0YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xNDR6Il0KICAgIH07CiAgICBmYVBhdXNlQ2lyY2xlID0gZmFDaXJjbGVQYXVzZTsKICAgIGZhSGFyZERyaXZlID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImhhcmQtZHJpdmUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjg0MzYsICJoZGQiXSwgImYwYTAiLCAiTTY0IDgwYy04LjggMC0xNiA3LjItMTYgMTZsMCAxNjJjNS4xLTEuMyAxMC41LTIgMTYtMmwzMjAgMGM1LjUgMCAxMC45IC43IDE2IDJsMC0xNjJjMC04LjgtNy4yLTE2LTE2LTE2TDY0IDgwek00OCAzMjBsMCA5NmMwIDguOCA3LjIgMTYgMTYgMTZsMzIwIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtOTZjMC04LjgtNy4yLTE2LTE2LTE2TDY0IDMwNGMtOC44IDAtMTYgNy4yLTE2IDE2ek0wIDMyMEwwIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC05NnptMjE2IDQ4YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6bTEyMC0yNGEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6Il0KICAgIH07CiAgICBmYUhkZCA9IGZhSGFyZERyaXZlOwogICAgZmFGaWxlWmlwcGVyID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZpbGUtemlwcGVyIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbImZpbGUtYXJjaGl2ZSJdLCAiZjFjNiIsICJNNjQgNDhsMTEyIDAgMCA4OGMwIDM5LjggMzIuMiA3MiA3MiA3Mmw4OCAwIDAgMjQwYzAgOC44LTcuMiAxNi0xNiAxNkw2NCA0NjRjLTguOCAwLTE2LTcuMi0xNi0xNkw0OCA2NGMwLTguOCA3LjItMTYgMTYtMTZ6TTIyNCA2Ny45bDkyLjEgOTIuMS02OC4xIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtNjguMXpNNjQgMEMyOC43IDAgMCAyOC43IDAgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjU2IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNjEuNWMwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0wyNDIuNyAxOC43QzIzMC43IDYuNyAyMTQuNSAwIDE5Ny41IDBMNjQgMHpNODAgMTA0YzAgMTMuMyAxMC43IDI0IDI0IDI0bDE2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE2IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0em0wIDgwYzAgMTMuMyAxMC43IDI0IDI0IDI0bDMyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTMyIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0em02NCA1NmwtMzIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA0OGMwIDI2LjUgMjEuNSA0OCA0OCA0OHM0OC0yMS41IDQ4LTQ4bDAtNDhjMC0xNy43LTE0LjMtMzItMzItMzJ6bS0xNiA2NGExNiAxNiAwIDEgMSAwIDMyIDE2IDE2IDAgMSAxIDAtMzJ6Il0KICAgIH07CiAgICBmYUZpbGVBcmNoaXZlID0gZmFGaWxlWmlwcGVyOwogICAgZmFGbG9wcHlEaXNrID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZsb3BweS1kaXNrIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI4MTkwLCAxMjg0MjYsICJzYXZlIl0sICJmMGM3IiwgIk02NCA4MGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzIwYzAgOC44IDcuMiAxNiAxNiAxNmwzMjAgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0yNDIuN2MwLTQuMi0xLjctOC4zLTQuNy0xMS4zTDMyMCA4Ni42IDMyMCAxNzZjMCAxNy43LTE0LjMgMzItMzIgMzJsLTE2MCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTk2LTMyIDB6bTgwIDBsMCA4MCAxMjggMCAwLTgwLTEyOCAwek0wIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDI0Mi43IDBjMTcgMCAzMy4zIDYuNyA0NS4zIDE4LjdMNDI5LjMgMTI4YzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNMNDQ4IDQxNmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZ6TTE2MCAzMjBhNjQgNjQgMCAxIDEgMTI4IDAgNjQgNjQgMCAxIDEgLTEyOCAweiJdCiAgICB9OwogICAgZmFTYXZlID0gZmFGbG9wcHlEaXNrOwogICAgZmFGYWNlR3JpblRvbmd1ZVNxdWludCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWdyaW4tdG9uZ3VlLXNxdWludCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU0MSwgImdyaW4tdG9uZ3VlLXNxdWludCJdLCAiZjU4YSIsICJNNDY0IDI1NmMwLTExNC45LTkzLjEtMjA4LTIwOC0yMDhTNDggMTQxLjEgNDggMjU2YzAgNzUuOSA0MC43IDE0Mi40IDEwMS41IDE3OC43LTMuNi0xMC45LTUuNS0yMi42LTUuNS0zNC43bDAtMzcuNWMtMTAuMi0xMi42LTE4LjMtMjYuOS0yMy44LTQyLjQtNC4xLTExLjYgNy44LTIxLjQgMTkuNi0xNy44IDM0LjcgMTAuNiA3NC4yIDE2LjUgMTE2LjEgMTYuNSA0MiAwIDgxLjUtNiAxMTYuMy0xNi42IDExLjgtMy42IDIzLjcgNi4xIDE5LjYgMTcuOC01LjUgMTUuNi0xMy42IDI5LjktMjMuOCA0Mi41bDAgMzcuNWMwIDEyLjEtMS45IDIzLjgtNS41IDM0LjcgNjAuOC0zNi4zIDEwMS41LTEwMi43IDEwMS41LTE3OC43ek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0xMjUuOC03NS43Yy02LjItNS4yLTcuNi0xNC4zLTMuMS0yMS4xczEzLjMtOS4yIDIwLjYtNS41bDc5LjYgNDBjNS40IDIuNyA4LjggOC4yIDguOCAxNC4zcy0zLjQgMTEuNi04LjggMTQuM2wtNzkuNiA0MGMtNy4zIDMuNi0xNi4xIDEuMy0yMC42LTUuNXMtMy4xLTE1LjkgMy4xLTIxLjFMMTU5IDIwOCAxMjUuOCAxODAuM3ptMjYzLjYtMjEuMWM0LjUgNi44IDMuMSAxNS45LTMuMSAyMS4xTDM1MyAyMDggMzg2LjIgMjM1LjdjNi4yIDUuMiA3LjYgMTQuMyAzLjEgMjEuMXMtMTMuMyA5LjItMjAuNiA1LjVsLTc5LjYtNDBjLTUuNC0yLjctOC44LTguMi04LjgtMTQuM3MzLjQtMTEuNiA4LjgtMTQuM2w3OS42LTQwYzcuMy0zLjYgMTYuMS0xLjMgMjAuNiA1LjV6TTMyMCA0MTZsMC0zNy40YzAtMTQuNy0xMS45LTI2LjYtMjYuNi0yNi42bC0yIDBjLTExLjMgMC0yMS4xIDcuOS0yMy42IDE4LjktMi44IDEyLjYtMjAuOCAxMi42LTIzLjYgMC0yLjUtMTEuMS0xMi4zLTE4LjktMjMuNi0xOC45bC0yIDBjLTE0LjcgMC0yNi42IDExLjktMjYuNiAyNi42bDAgMzcuNGMwIDM1LjMgMjguNyA2NCA2NCA2NHM2NC0yOC43IDY0LTY0eiJdCiAgICB9OwogICAgZmFHcmluVG9uZ3VlU3F1aW50ID0gZmFGYWNlR3JpblRvbmd1ZVNxdWludDsKICAgIGZhQ2FtZXJhID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNhbWVyYSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYyMjU4LCAiY2FtZXJhLWFsdCJdLCAiZjAzMCIsICJNMTkzLjEgMzJjLTE4LjcgMC0zNi4yIDkuNC00Ni42IDI0LjlMMTIwLjUgOTYgNjQgOTZDMjguNyA5NiAwIDEyNC43IDAgMTYwTDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0bC01Ni41IDAtMjYtMzkuMUMzNTUuMSA0MS40IDMzNy42IDMyIDMxOC45IDMyTDE5My4xIDMyem0tNi43IDUxLjZjMS41LTIuMiA0LTMuNiA2LjctMy42bDEyNS43IDBjMi43IDAgNS4yIDEuMyA2LjcgMy42bDMzLjIgNDkuOGM0LjUgNi43IDExLjkgMTAuNyAyMCAxMC43bDY5LjMgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAyNTZjMCA4LjgtNy4yIDE2LTE2IDE2TDY0IDQzMmMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMjU2YzAtOC44IDcuMi0xNiAxNi0xNmw2OS4zIDBjOCAwIDE1LjUtNCAyMC0xMC43bDMzLjItNDkuOHpNMjU2IDM4NGExMTIgMTEyIDAgMSAwIDAtMjI0IDExMiAxMTIgMCAxIDAgMCAyMjR6TTE5MiAyNzJhNjQgNjQgMCAxIDEgMTI4IDAgNjQgNjQgMCAxIDEgLTEyOCAweiJdCiAgICB9OwogICAgZmFDYW1lcmFBbHQgPSBmYUNhbWVyYTsKICAgIGZhRmFjZUdyaW5TdGFycyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWdyaW4tc3RhcnMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjkzMjEsICJncmluLXN0YXJzIl0sICJmNTg3IiwgIk0wIDI1NmMwLTI5LjYgNS01Ny45IDE0LjItODQuNGwxNy4zIDE2LjktNC42IDI3Yy00LjIgMjQuNCA1LjYgNDYuMiAyMiA1OS45IDkuOCAxMDUuOCA5OC44IDE4OC43IDIwNy4xIDE4OC43czE5Ny40LTgyLjggMjA3LjEtMTg4LjZjMTYuNC0xMy43IDI2LjEtMzUuNCAyMi01OS45bC00LjYtMjcgMTcuMy0xNi45YzkuMiAyNi40IDE0LjIgNTQuOCAxNC4yIDg0LjQgMCAxNDEuNC0xMTQuNiAyNTYtMjU2IDI1NlMwIDM5Ny40IDAgMjU2ek0yNTYgNDhjLTE1LjIgMC0zMCAxLjYtNDQuMyA0LjdMMjAxLjQgMzEuOEMxOTcgMjMgMTkxLjEgMTUuOCAxODQuMiAxMC4yIDIwNyAzLjYgMjMxLjEgMCAyNTYgMHM0OSAzLjYgNzEuOCAxMC4yQzMyMC45IDE1LjggMzE1IDIzIDMxMC42IDMxLjhMMzAwLjMgNTIuN0MyODYgNDkuNiAyNzEuMiA0OCAyNTYgNDh6TTM3Mi4yIDMwMi4zYzExLjgtMy42IDIzLjcgNi4xIDE5LjYgMTcuOC0xOS44IDU1LjktNzMuMSA5Ni0xMzUuOCA5Ni02Mi43IDAtMTE2LTQwLTEzNS44LTk1LjktNC4xLTExLjYgNy44LTIxLjQgMTkuNi0xNy44IDM0LjcgMTAuNiA3NC4yIDE2LjUgMTE2LjEgMTYuNSA0MiAwIDgxLjUtNiAxMTYuMy0xNi42ek0zNTMuNyA1My4xYzUuOS0xMS45IDIyLjgtMTEuOSAyOC43IDBsMjMuMyA0Ny4yIDUyIDcuNmMxMy4xIDEuOSAxOC40IDE4IDguOSAyNy4zbC0zNy43IDM2LjcgOC45IDUxLjhjMi4yIDEzLjEtMTEuNSAyMy0yMy4yIDE2LjlMMzY4IDIxNiAzMjEuNSAyNDAuNWMtMTEuNyA2LjItMjUuNS0zLjgtMjMuMi0xNi45bDguOS01MS44LTM3LjctMzYuN2MtOS41LTkuMy00LjMtMjUuNCA4LjktMjcuM2w1Mi03LjYgMjMuMy00Ny4yem0tMTk1LjMgMGwyMy4zIDQ3LjIgNTIgNy42YzEzLjEgMS45IDE4LjQgMTggOC45IDI3LjNsLTM3LjcgMzYuNyA4LjkgNTEuOGMyLjIgMTMuMS0xMS41IDIzLTIzLjIgMTYuOUwxNDQgMjE2IDk3LjUgMjQwLjVjLTExLjcgNi4yLTI1LjUtMy44LTIzLjItMTYuOWw4LjktNTEuOC0zNy43LTM2LjdjLTkuNS05LjMtNC4zLTI1LjQgOC45LTI3LjNsNTItNy42IDIzLjMtNDcuMmM1LjktMTEuOSAyMi44LTExLjkgMjguNyAweiJdCiAgICB9OwogICAgZmFHcmluU3RhcnMgPSBmYUZhY2VHcmluU3RhcnM7CiAgICBmYUV5ZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJleWUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgwNjVdLCAiZjA2ZSIsICJNMjg4IDgwQzIyMi44IDgwIDE2OS4yIDEwOS42IDEyOC4xIDE0Ny43IDg5LjYgMTgzLjUgNjMgMjI2IDQ5LjQgMjU2IDYzIDI4NiA4OS42IDMyOC41IDEyOC4xIDM2NC4zIDE2OS4yIDQwMi40IDIyMi44IDQzMiAyODggNDMyczExOC44LTI5LjYgMTU5LjktNjcuN0M0ODYuNCAzMjguNSA1MTMgMjg2IDUyNi42IDI1NiA1MTMgMjI2IDQ4Ni40IDE4My41IDQ0Ny45IDE0Ny43IDQwNi44IDEwOS42IDM1My4yIDgwIDI4OCA4MHpNOTUuNCAxMTIuNkMxNDIuNSA2OC44IDIwNy4yIDMyIDI4OCAzMnMxNDUuNSAzNi44IDE5Mi42IDgwLjZjNDYuOCA0My41IDc4LjEgOTUuNCA5MyAxMzEuMSAzLjMgNy45IDMuMyAxNi43IDAgMjQuNi0xNC45IDM1LjctNDYuMiA4Ny43LTkzIDEzMS4xLTQ3LjEgNDMuNy0xMTEuOCA4MC42LTE5Mi42IDgwLjZTMTQyLjUgNDQzLjIgOTUuNCAzOTkuNGMtNDYuOC00My41LTc4LjEtOTUuNC05My0xMzEuMS0zLjMtNy45LTMuMy0xNi43IDAtMjQuNiAxNC45LTM1LjcgNDYuMi04Ny43IDkzLTEzMS4xek0yODggMzM2YzQ0LjIgMCA4MC0zNS44IDgwLTgwIDAtMjkuNi0xNi4xLTU1LjUtNDAtNjkuMy0xLjQgNTkuNy00OS42IDEwNy45LTEwOS4zIDEwOS4zIDEzLjggMjMuOSAzOS43IDQwIDY5LjMgNDB6bS03OS42LTg4LjRjMi41IC4zIDUgLjQgNy42IC40IDM1LjMgMCA2NC0yOC43IDY0LTY0IDAtMi42LS4yLTUuMS0uNC03LjYtMzcuNCAzLjktNjcuMiAzMy43LTcxLjEgNzEuMXptNDUuNi0xMTVjMTAuOC0zIDIyLjItNC41IDMzLjktNC41IDguOCAwIDE3LjUgLjkgMjUuOCAyLjYgLjMgLjEgLjUgLjEgLjggLjIgNTcuOSAxMi4yIDEwMS40IDYzLjcgMTAxLjQgMTI1LjIgMCA3MC43LTU3LjMgMTI4LTEyOCAxMjgtNjEuNiAwLTExMy00My41LTEyNS4yLTEwMS40LTEuOC04LjYtMi44LTE3LjUtMi44LTI2LjYgMC0xMSAxLjQtMjEuOCA0LTMyIC4yLS43IC4zLTEuMyAuNS0xLjkgMTEuOS00My40IDQ2LjEtNzcuNiA4OS41LTg5LjV6Il0KICAgIH07CiAgICBmYUZhY2VTYWRUZWFyID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2Utc2FkLXRlYXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1NDYsICJzYWQtdGVhciJdLCAiZjViNCIsICJNNDY0IDI1NmMwLTExNC45LTkzLjEtMjA4LTIwOC0yMDhTNDggMTQxLjEgNDggMjU2YzAgNDEuOCAxMi4zIDgwLjcgMzMuNiAxMTMuMyA4LjIgNDQuNyA0Ny4zIDc4LjYgOTQuMyA3OC43IDI0LjcgMTAuMyA1MS43IDE2IDgwLjEgMTYgMTE0LjkgMCAyMDgtOTMuMSAyMDgtMjA4ek0yODggMzUyYy01LjUgMC0xMC45IC42LTE2IDEuOCAwLS42IDAtMS4yIDAtMS44IDAtMTYuMi00LTMxLjUtMTEuMS00NC45IDguNy0yIDE3LjgtMy4xIDI3LjEtMy4xIDQwLjIgMCA3NS43IDE5LjggOTcuNSA1MCA3LjcgMTAuOCA1LjMgMjUuOC01LjUgMzMuNXMtMjUuOCA1LjMtMzMuNS01LjVjLTEzLjEtMTguMi0zNC40LTMwLTU4LjUtMzB6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTE3Ni04MGEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6bTEyOCAzMmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwek0xODUuNCAyNzYuOGM2LjUgNy44IDEyLjYgMTYuMSAxOC4zIDI0LjYgOSAxMy40IDIwLjMgMzAuMiAyMC4zIDQ3LjQgMCAyOC4zLTIxLjUgNTEuMi00OCA1MS4ycy00OC0yMi45LTQ4LTUxLjJjMC0xNy4yIDExLjItMzQgMjAuMy00Ny40IDUuNy04LjUgMTEuOS0xNi43IDE4LjMtMjQuNiAyLjQtMi45IDUuNy00LjggOS40LTQuOHM3IDEuOSA5LjQgNC44eiJdCiAgICB9OwogICAgZmFTYWRUZWFyID0gZmFGYWNlU2FkVGVhcjsKICAgIGZhU2hhcmVGcm9tU3F1YXJlID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInNoYXJlLWZyb20tc3F1YXJlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbNjE1MDksICJzaGFyZS1zcXVhcmUiXSwgImYxNGQiLCAiTTQyNS41IDdjLTYuOS02LjktMTcuMi04LjktMjYuMi01LjJTMzg0LjUgMTQuMyAzODQuNSAyNGwwIDU2LTQ4IDBjLTg4LjQgMC0xNjAgNzEuNi0xNjAgMTYwIDAgNDYuNyAyMC43IDgwLjQgNDMuNiAxMDMuNCA4LjEgOC4yIDE2LjUgMTQuOSAyNC4zIDIwLjQgOS4yIDYuNSAyMS43IDUuNyAzMC4xLTEuOXMxMC4yLTIwIDQuNS0yOS44Yy0zLjYtNi4zLTYuNS0xNC45LTYuNS0yNi43IDAtMzYuMiAyOS4zLTY1LjUgNjUuNS02NS41bDQ2LjUgMCAwIDU2YzAgOS43IDUuOCAxOC41IDE0LjggMjIuMnMxOS4zIDEuNyAyNi4yLTUuMmwxMzYtMTM2YzkuNC05LjQgOS40LTI0LjYgMC0zMy45TDQyNS41IDd6bTcgOTdsMC0yMi4xIDc4LjEgNzguMS03OC4xIDc4LjEgMC0yMi4xYzAtMTMuMy0xMC43LTI0LTI0LTI0TDMzOCAxOTJjLTUwLjkgMC05My45IDMzLjUtMTA4LjMgNzkuNi0zLjMtOS40LTUuMi0xOS44LTUuMi0zMS42IDAtNjEuOSA1MC4xLTExMiAxMTItMTEybDcyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjR6bS0zMjAtOGMtNDQuMiAwLTgwIDM1LjgtODAgODBsMCAyNTZjMCA0NC4yIDM1LjggODAgODAgODBsMjU2IDBjNDQuMiAwIDgwLTM1LjggODAtODBsMC0yNGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDI0YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0yNTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0yNTZjMC0xNy43IDE0LjMtMzIgMzItMzJsMjQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMjQgMHoiXQogICAgfTsKICAgIGZhU2hhcmVTcXVhcmUgPSBmYVNoYXJlRnJvbVNxdWFyZTsKICAgIGZhTm90ZVN0aWNreSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJub3RlLXN0aWNreSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzYyMDI2LCAic3RpY2t5LW5vdGUiXSwgImYyNDkiLCAiTTI0MCA0MzJMNjQgNDMyYy04LjggMC0xNi03LjItMTYtMTZMNDggOTZjMC04LjggNy4yLTE2IDE2LTE2bDMyMCAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDE3Ni04OCAwYy0zOS44IDAtNzIgMzIuMi03MiA3MmwwIDg4ek0zODAuMSAzMjBMMjg4IDQxMi4xIDI4OCAzNDRjMC0xMy4zIDEwLjctMjQgMjQtMjRsNjguMSAwek0wIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwxOTcuNSAwYzE3IDAgMzMuMy02LjcgNDUuMy0xOC43TDQyOS4zIDMzOC43YzEyLTEyIDE4LjctMjguMyAxOC43LTQ1LjNMNDQ4IDk2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZ6Il0KICAgIH07CiAgICBmYVN0aWNreU5vdGUgPSBmYU5vdGVTdGlja3k7CiAgICBmYUhhbmRCYWNrRmlzdCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kLWJhY2stZmlzdCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJoYW5kLXJvY2siXSwgImYyNTUiLCAiTTk2IDQwMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwyMjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTQ4YzAtMTcuNy0xNC4zLTMyLTMyLTMyTDk2IDQwMHpNNzMuMiAzNTJsNjQuNiAwLTc5LjUtODguM0M1MS43IDI1Ni4zIDQ4IDI0Ni44IDQ4IDIzNi45TDQ4IDIwNGMwLTE2LjEgMTEuOS0yOS41IDI3LjQtMzEuNyAxMS44LTEuNyAyMC42LTExLjggMjAuNi0yMy44TDk2IDcyYzAtMTMuMyAxMC43LTI0IDI0LTI0IDcuMiAwIDEzLjYgMy4xIDE4IDguMSA0LjYgNS4yIDExLjEgOC4xIDE4IDguMXMxMy40LTMgMTgtOC4xYzQuNC01IDEwLjgtOC4xIDE4LTguMSA4LjUgMCAxNS45IDQuNCAyMC4yIDExLjEgNi45IDEwLjcgMjAuOSAxNC4yIDMyIDggMy41LTEuOSA3LjQtMy4xIDExLjgtMy4xIDEwLjYgMCAxOS43IDYuOSAyMi44IDE2LjYgMy44IDExLjcgMTUuOSAxOC43IDI4IDE2IDEuNy0uNCAzLjQtLjYgNS4yLS42IDEzLjMgMCAyNCAxMC43IDI0IDI0bDAgOTIuMmMwIDE0LjQtMy41IDI4LjUtMTAuMiA0MS4ybC01Mi4yIDk4LjYgNTQuMyAwIDQwLjMtNzYuMmMxMC40LTE5LjYgMTUuOC00MS41IDE1LjgtNjMuNmwwLTkyLjJjMC0zOC40LTMwLjEtNjkuOC02OC4xLTcxLjktMTIuOS0xOS4zLTM0LjktMzIuMS01OS45LTMyLjEtNS43IDAtMTEuMiAuNy0xNi41IDEuOS0xMi43LTExLjEtMjkuMy0xNy45LTQ3LjUtMTcuOS0xMy4xIDAtMjUuNCAzLjUtMzYgOS42LTEwLjYtNi4xLTIyLjktOS42LTM2LTkuNi0zOS44IDAtNzIgMzIuMi03MiA3MmwwIDU4LjdDMTkuNyAxNDMgMCAxNzEuMiAwIDIwNGwwIDMyLjljMCAyMS43IDggNDIuNyAyMi42IDU4LjlMNzMuMiAzNTJ6Il0KICAgIH07CiAgICBmYUhhbmRSb2NrID0gZmFIYW5kQmFja0Zpc3Q7CiAgICBmYUNoZXNzUXVlZW4gPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY2hlc3MtcXVlZW4iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5ODE5XSwgImY0NDUiLCAiTTMyNS4zIDkwLjhjOS4xLTQuOCAyMC42LTMuMyAyOC4yIDQuM2wzOS44IDM5LjggMy43IDMuM2M5LjEgNy4xIDIwLjkgMTAgMzIuNCA3LjdsNDYuNC05LjMgMy41LS40YzgtLjQgMTUuOCAzLjIgMjAuNiA5LjggNS41IDcuNiA2LjEgMTcuNiAxLjYgMjUuOGwtMTEyLjYgMjAyLjYgNTEuNSA3MC45IDEuOCAyLjdjNCA2LjYgNi4yIDE0LjIgNi4yIDIyIDAgMjMuMy0xOC45IDQyLjEtNDIuMSA0Mi4xbC0yOTkuOCAwYy0yMS44IDAtMzkuOC0xNi42LTQxLjktMzcuOGwtLjItNC4zIC4xLTMuM2MuNi03LjcgMy40LTE1LjEgNy45LTIxLjRsNTEuNS03MC45LTExMi41LTIwMi42Yy00LjUtOC4yLTMuOS0xOC4zIDEuNi0yNS44czE0LjktMTEuMiAyNC4xLTkuNGw0Ni40IDkuM2MxMy4xIDIuNiAyNi43LTEuNSAzNi4xLTEwLjlMMTU5LjUgOTUgMTYzIDkyLjJjOC42LTUuOCAyMC4xLTUuNiAyOC41IDEuMWw0MCAzMiAyLjggMi4xYzE0LjQgOS42IDMzLjUgOC45IDQ3LjItMi4xbDQwLTMyIDMuOC0yLjV6TTE2NC43IDQwMGwtNDYuNiA2NCAyNzYuNyAwLTQ2LjYtNjQtMTgzLjYgMHpNMzExLjUgMTYyLjhjLTMwLjEgMjQuMS03Mi4xIDI1LjYtMTAzLjggNC41bC02LjItNC41LTIzLjMtMTguNi0yNC42IDI0LjZjLTE5LjggMTkuOC00Ny43IDI4LjktNzUuMSAyNC44bDg4LjEgMTU4LjUgMTc5LjggMCA4OC0xNTguNWMtMjUuNyAzLjgtNTEuNy0zLjktNzEuMS0yMWwtNC0zLjctMjQuNi0yNC42LTIzLjIgMTguNnpNMjU2LjUgNzJhNDAgNDAgMCAxIDEgMC04MCA0MCA0MCAwIDEgMSAwIDgweiJdCiAgICB9OwogICAgZmFGYWNlR3JpblRlYXJzID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi10ZWFycyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzEyODUxNCwgImdyaW4tdGVhcnMiXSwgImY1ODgiLCAiTTUwNC4xIDM1M0M1MTIuOSAzNjcuMiA1MjUuMyAzNzkgNTM5LjggMzg3LjIgNDk1LjEgNDYyIDQxMy40IDUxMiAzMjAgNTEyUzE0NC45IDQ2MiAxMDAuMiAzODcuMmMxNC42LTguMiAyNi45LTIwIDM1LjgtMzQuMyAzNC45IDY2IDEwNC4yIDExMSAxODQuMSAxMTFzMTQ5LjItNDUgMTg0LjEtMTExem0xNi40LTE1Mi41QzQ5Ni4yIDExMi42IDQxNS43IDQ4IDMyMCA0OFMxNDMuOCAxMTIuNiAxMTkuNSAyMDAuNWMtMTAuNi00LjgtMjIuNy02LjgtMzUuNC01bC0xMy40IDEuOUM5Ny4yIDg0LjMgMTk4LjggMCAzMjAgMFM1NDIuOCA4NC4zIDU2OS4zIDE5Ny40bC0xMy40LTEuOWMtMTIuNy0xLjgtMjQuOCAuMi0zNS40IDV6TTQ1NS44IDMyMGMtMTkuOCA1NS45LTczLjEgOTYtMTM1LjggOTYtNjIuNyAwLTExNi00MC0xMzUuOC05NS45LTQuMS0xMS42IDcuOC0yMS40IDE5LjYtMTcuOCAzNC43IDEwLjYgNzQuMiAxNi41IDExNi4xIDE2LjUgNDIgMCA4MS41LTYgMTE2LjMtMTYuNiAxMS44LTMuNiAyMy43IDYuMSAxOS42IDE3Ljh6TTIxMiAyMDhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0zNy42IDMwLjQtNjggNjgtNjhzNjggMzAuNCA2OCA2OGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTE1LjUtMTIuNS0yOC0yOC0yOHMtMjggMTIuNS0yOCAyOHptMTg4LTI4Yy0xNS41IDAtMjggMTIuNS0yOCAyOGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTM3LjYgMzAuNC02OCA2OC02OHM2OCAzMC40IDY4IDY4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMTUuNS0xMi41LTI4LTI4LTI4ek02NDAgMzAwLjZjMCAyOC40LTIzIDUxLjQtNTEuNCA1MS40LTI1LjYgMC00Ny4zLTE4LjgtNTAuOS00NC4xTDUzMSAyNjEuMWMtMS41LTEwLjYgNy41LTE5LjYgMTguMS0xOC4xbDQ2LjcgNi43YzI1LjMgMy42IDQ0LjEgMjUuMyA0NC4xIDUwLjl6bS02NDAgMGMwLTI1LjYgMTguOC00Ny4zIDQ0LjEtNTAuOUw5MC45IDI0M2MxMC42LTEuNSAxOS42IDcuNSAxOC4xIDE4LjFsLTYuNyA0Ni43Qzk4LjcgMzMzLjIgNzcgMzUyIDUxLjQgMzUyIDIzIDM1MiAwIDMyOSAwIDMwMC42eiJdCiAgICB9OwogICAgZmFHcmluVGVhcnMgPSBmYUZhY2VHcmluVGVhcnM7CiAgICBmYVBlblRvU3F1YXJlID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInBlbi10by1zcXVhcmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiZWRpdCJdLCAiZjA0NCIsICJNNDQxIDU4LjlMNDUzLjEgNzFjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlMNDI0IDEzNC4xIDM3Ny45IDg4IDQwNyA1OC45YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwek0yMDkuOCAyNTYuMkwzNDQgMTIxLjkgMzkwLjEgMTY4IDI1NS44IDMwMi4yYy0yLjkgMi45LTYuNSA1LTEwLjQgNi4xbC01OC41IDE2LjcgMTYuNy01OC41YzEuMS0zLjkgMy4yLTcuNSA2LjEtMTAuNHpNMzczLjEgMjVMMTc1LjggMjIyLjJjLTguNyA4LjctMTUgMTkuNC0xOC4zIDMxLjFsLTI4LjYgMTAwYy0yLjQgOC40LS4xIDE3LjQgNi4xIDIzLjZzMTUuMiA4LjUgMjMuNiA2LjFsMTAwLTI4LjZjMTEuOC0zLjQgMjIuNS05LjcgMzEuMS0xOC4zTDQ4NyAxMzguOWMyOC4xLTI4LjEgMjguMS03My43IDAtMTAxLjhMNDc0LjkgMjVDNDQ2LjgtMy4xIDQwMS4yLTMuMSAzNzMuMSAyNXpNODggNjRDMzkuNCA2NCAwIDEwMy40IDAgMTUyTDAgNDI0YzAgNDguNiAzOS40IDg4IDg4IDg4bDI3MiAwYzQ4LjYgMCA4OC0zOS40IDg4LTg4bDAtMTEyYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTEyYzAgMjIuMS0xNy45IDQwLTQwIDQwTDg4IDQ2NGMtMjIuMSAwLTQwLTE3LjktNDAtNDBsMC0yNzJjMC0yMi4xIDE3LjktNDAgNDAtNDBsMTEyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRMODggNjR6Il0KICAgIH07CiAgICBmYUVkaXQgPSBmYVBlblRvU3F1YXJlOwogICAgZmFGYWNlR3JpbkJlYW1Td2VhdCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWdyaW4tYmVhbS1zd2VhdCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyODUxNywgImdyaW4tYmVhbS1zd2VhdCJdLCAiZjU4MyIsICJNNTMwLjIgMTUuOWMtOC44LTEwLjctMTguNS0yMC45LTI5LTMwLTMtMi42LTcuNC0yLjYtMTAuNCAwLTEwLjUgOS4xLTIwLjEgMTkuMy0yOSAzMC0xNC43IDE3LjgtMjkuOCA0MC4xLTI5LjggNjQuMSAwIDM2LjQgMjcuNiA2NCA2NCA2NHM2NC0yNy42IDY0LTY0YzAtMjQtMTUuMi00Ni4zLTI5LjgtNjQuMXptLTEzMiA4LjlDMzY0LjggOC45IDMyNy40IDAgMjg4IDAgMTQ2LjYgMCAzMiAxMTQuNiAzMiAyNTZTMTQ2LjYgNTEyIDI4OCA1MTIgNTQ0IDM5Ny40IDU0NCAyNTZjMC0yNC40LTMuNC00OC05LjgtNzAuNC0xMS45IDQuMi0yNC43IDYuNC0zOC4yIDYuNC0zLjQgMC02LjgtLjEtMTAuMi0uNCA2LjYgMjAuMyAxMC4yIDQxLjkgMTAuMiA2NC40IDAgMTE0LjktOTMuMSAyMDgtMjA4IDIwOFM4MCAzNzAuOSA4MCAyNTYgMTczLjEgNDggMjg4IDQ4YzM0LjggMCA2Ny41IDguNSA5Ni4zIDIzLjYgMS40LTE3LjQgNi45LTMzLjEgMTMuOC00Ni44ek00MjMuOCAzMjBjNC4xLTExLjYtNy44LTIxLjQtMTkuNi0xNy44LTM0LjggMTAuNi03NC4zIDE2LjYtMTE2LjMgMTYuNi00MS45IDAtODEuNC02LTExNi4xLTE2LjUtMTEuOC0zLjYtMjMuNyA2LjEtMTkuNiAxNy44IDE5LjggNTUuOSA3My4xIDk1LjkgMTM1LjggOTUuOSA2Mi43IDAgMTE2LTQwLjEgMTM1LjgtOTZ6TTE4MCAyMDhjMC0xNS41IDEyLjUtMjggMjgtMjhzMjggMTIuNSAyOCAyOGwwIDhjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC04YzAtMzcuNi0zMC40LTY4LTY4LTY4cy02OCAzMC40LTY4IDY4bDAgOGMwIDExIDkgMjAgMjAgMjBzMjAtOSAyMC0yMGwwLTh6bTE4OC0yOGMxNS41IDAgMjggMTIuNSAyOCAyOGwwIDhjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC04YzAtMzcuNi0zMC40LTY4LTY4LTY4cy02OCAzMC40LTY4IDY4bDAgOGMwIDExIDkgMjAgMjAgMjBzMjAtOSAyMC0yMGwwLThjMC0xNS41IDEyLjUtMjggMjgtMjh6Il0KICAgIH07CiAgICBmYUdyaW5CZWFtU3dlYXQgPSBmYUZhY2VHcmluQmVhbVN3ZWF0OwogICAgZmFDbG9jayA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjbG9jayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODMzOSwgImNsb2NrLWZvdXIiXSwgImYwMTciLCAiTTQ2NCAyNTZhMjA4IDIwOCAwIDEgMSAtNDE2IDAgMjA4IDIwOCAwIDEgMSA0MTYgMHpNMCAyNTZhMjU2IDI1NiAwIDEgMCA1MTIgMCAyNTYgMjU2IDAgMSAwIC01MTIgMHpNMjMyIDEyMGwwIDEzNmMwIDggNCAxNS41IDEwLjcgMjBsOTYgNjRjMTEgNy40IDI1LjkgNC40IDMzLjMtNi43czQuNC0yNS45LTYuNy0zMy4zTDI4MCAyNDMuMiAyODAgMTIwYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0eiJdCiAgICB9OwogICAgZmFDbG9ja0ZvdXIgPSBmYUNsb2NrOwogICAgZmFGYWNlTGF1Z2hXaW5rID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2UtbGF1Z2gtd2luayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJsYXVnaC13aW5rIl0sICJmNTljIiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDAgLTQxNiAwIDIwOCAyMDggMCAxIDAgNDE2IDB6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTExOC4zIDU4LjJjLTQuMi0xMy43IDcuMS0yNi4yIDIxLjQtMjYuMmwyMzIuNiAwYzE0LjMgMCAyNS42IDEyLjUgMjEuNCAyNi4yLTE4IDU4LjktNzIuOSAxMDEuOC0xMzcuNyAxMDEuOFMxMzYuMyAzNzMuMSAxMTguMyAzMTQuMnpNMTQ0IDE5MmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0xNjQgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBjMC0zMy4xIDI2LjktNjAgNjAtNjBsMTYgMGMzMy4xIDAgNjAgMjYuOSA2MCA2MCAwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjAtOS0yMC0yMC0yMGwtMTYgMGMtMTEgMC0yMCA5LTIwIDIweiJdCiAgICB9OwogICAgZmFMYXVnaFdpbmsgPSBmYUZhY2VMYXVnaFdpbms7CiAgICBmYVBhcGVyUGxhbmUgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAicGFwZXItcGxhbmUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFs2MTkxM10sICJmMWQ4IiwgIk0yOTAuNSAyODcuN0w0OTEuNCA4Ni45IDM1OSA0NTYuMyAyOTAuNSAyODcuN3pNNDU3LjQgNTNMMjU2LjYgMjUzLjggODggMTg1LjMgNDU3LjQgNTN6TTM4LjEgMjE2LjhsMjA1LjggODMuNiA4My42IDIwNS44YzUuMyAxMy4xIDE4LjEgMjEuNyAzMi4zIDIxLjcgMTQuNyAwIDI3LjgtOS4yIDMyLjgtMjMuMUw1NzAuNiA4YzMuNS05LjggMS0yMC42LTYuMy0yOHMtMTguMi05LjgtMjgtNi4zTDM5LjQgMTUxLjdjLTEzLjkgNS0yMy4xIDE4LjEtMjMuMSAzMi44IDAgMTQuMiA4LjYgMjcgMjEuNyAzMi4zeiJdCiAgICB9OwogICAgZmFIZWFydCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJoZWFydCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODE1MywgMTI4MTU0LCAxMjgxNTUsIDEyODE1NiwgMTI4NDIwLCAxMjkyOTMsIDEyOTI5NCwgMTI5NTA1LCA5ODI5LCAxMDA4NCwgNjE1NzhdLCAiZjAwNCIsICJNMzc4LjkgODBjLTI3LjMgMC01MyAxMy4xLTY5IDM1LjJsLTM0LjQgNDcuNmMtNC41IDYuMi0xMS43IDkuOS0xOS40IDkuOXMtMTQuOS0zLjctMTkuNC05LjlsLTM0LjQtNDcuNmMtMTYtMjIuMS00MS43LTM1LjItNjktMzUuMi00NyAwLTg1LjEgMzguMS04NS4xIDg1LjEgMCA0OS45IDMyIDk4LjQgNjguMSAxNDIuMyA0MS4xIDUwIDkxLjQgOTQgMTI1LjkgMTIwLjMgMy4yIDIuNCA3LjkgNC4yIDE0IDQuMnMxMC44LTEuOCAxNC00LjJjMzQuNS0yNi4zIDg0LjgtNzAuNCAxMjUuOS0xMjAuMyAzNi4yLTQzLjkgNjguMS05Mi40IDY4LjEtMTQyLjMgMC00Ny0zOC4xLTg1LjEtODUuMS04NS4xek0yNzEgODcuMWMyNS0zNC42IDY1LjItNTUuMSAxMDcuOS01NS4xIDczLjUgMCAxMzMuMSA1OS42IDEzMy4xIDEzMy4xIDAgNjguNi00Mi45IDEyOC45LTc5LjEgMTcyLjgtNDQuMSA1My42LTk3LjMgMTAwLjEtMTMzLjggMTI3LjktMTIuMyA5LjQtMjcuNSAxNC4xLTQzLjEgMTQuMXMtMzAuOC00LjctNDMuMS0xNC4xQzE3Ni40IDQzOCAxMjMuMiAzOTEuNSA3OS4xIDMzOCA0Mi45IDI5NC4xIDAgMjMzLjcgMCAxNjUuMSAwIDkxLjYgNTkuNiAzMiAxMzMuMSAzMiAxNzUuOCAzMiAyMTYgNTIuNSAyNDEgODcuMWwxNSAyMC43IDE1LTIwLjd6Il0KICAgIH07CiAgICBmYUZvbnRBd2Vzb21lMiA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmb250LWF3ZXNvbWUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MjUwMSwgNjI2OTQsICJmb250LWF3ZXNvbWUtZmxhZyIsICJmb250LWF3ZXNvbWUtbG9nby1mdWxsIl0sICJmMmI0IiwgIk05MS43IDk2QzEwNi4zIDg2LjggMTE2IDcwLjUgMTE2IDUyIDExNiAyMy4zIDkyLjcgMCA2NCAwUzEyIDIzLjMgMTIgNTJjMCAxNi43IDcuOCAzMS41IDIwIDQxbDAgNDE5IDQ4IDAgMC02NCAzODkuNiAwYzE0LjYgMCAyNi40LTExLjggMjYuNC0yNi40IDAtMy43LS44LTcuMy0yLjMtMTAuN0w0MzIgMjcyIDQ5My43IDEzMy4xYzEuNS0zLjQgMi4zLTcgMi4zLTEwLjcgMC0xNC42LTExLjgtMjYuNC0yNi40LTI2LjRMOTEuNyA5NnpNODAgNDAwbDAtMjU2IDM1Ni40IDAtNDguMiAxMDguNWMtNS41IDEyLjQtNS41IDI2LjYgMCAzOUw0MzYuNCA0MDAgODAgNDAweiJdCiAgICB9OwogICAgZmFGb250QXdlc29tZUZsYWcyID0gZmFGb250QXdlc29tZTI7CiAgICBmYUZvbnRBd2Vzb21lTG9nb0Z1bGwyID0gZmFGb250QXdlc29tZTI7CiAgICBmYUNsb25lID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNsb25lIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyNGQiLCAiTTI4OCA0NjRMNjQgNDY0Yy04LjggMC0xNi03LjItMTYtMTZsMC0yMjRjMC04LjggNy4yLTE2IDE2LTE2bDQ4IDAgMC00OC00OCAwYy0zNS4zIDAtNjQgMjguNy02NCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyMjQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTQ4LTQ4IDAgMCA0OGMwIDguOC03LjIgMTYtMTYgMTZ6TTIyNCAzMDRjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTIyNGMwLTguOCA3LjItMTYgMTYtMTZsMjI0IDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMjI0YzAgOC44LTcuMiAxNi0xNiAxNmwtMjI0IDB6bS02NC0xNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwyMjQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTIyNGMwLTM1LjMtMjguNy02NC02NC02NEwyMjQgMGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCAyMjR6Il0KICAgIH07CiAgICBmYUZvbGRlck9wZW4gPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZm9sZGVyLW9wZW4iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgxOTQsIDEyODQ0OSwgNjE3MTddLCAiZjA3YyIsICJNOTcuNSA0MDBsNTAtMTYwIDM3OS40IDAtNTAgMTYwLTM3OS40IDB6bTE5MC43IDQ4TDQ3NyA0NDhjMjEgMCAzOS42LTEzLjYgNDUuOC0zMy43bDUwLTE2MGM5LjctMzAuOS0xMy40LTYyLjMtNDUuOC02Mi4zbC0zNzkuNCAwYy0yMSAwLTM5LjYgMTMuNi00NS44IDMzLjdMODAuMiAyOTQuNCA4MC4yIDk2YzAtOC44IDcuMi0xNiAxNi0xNmwxMzguNyAwYzMuNSAwIDYuOCAxLjEgOS42IDMuMkwyODIuOSAxMTJjMTMuOCAxMC40IDMwLjcgMTYgNDggMTZsMTE3LjMgMGM4LjggMCAxNiA3LjIgMTYgMTZsNDggMGMwLTM1LjMtMjguNy02NC02NC02NEwzMzAuOSA4MGMtNi45IDAtMTMuNy0yLjItMTkuMi02LjRMMjczLjMgNDQuOEMyNjIuMiAzNi41IDI0OC44IDMyIDIzNC45IDMyTDk2LjIgMzJjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgMjg4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE5MiAweiJdCiAgICB9OwogICAgZmFXaW5kb3dNaW5pbWl6ZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJ3aW5kb3ctbWluaW1pemUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg0NjldLCAiZjJkMSIsICJNMCA0MjRjMC0xMy4zIDEwLjctMjQgMjQtMjRsNDY0IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRMMjQgNDQ4Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNHoiXQogICAgfTsKICAgIGZhU3RhckhhbGYgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAic3Rhci1oYWxmIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbNjE3MzFdLCAiZjA4OSIsICJNMjg1LjctMTUuOGMxMC44IDIuNiAxOC40IDEyLjIgMTguNCAyMy4zbDAgMzg3LjFjMCA5LTUuMSAxNy4zLTEzLjEgMjEuNEwxNDMuOCA0OTFjLTggNC4xLTE3LjcgMy4zLTI1LTJzLTExLTE0LjItOS42LTIzLjJMMTM0LjQgMzA1LjkgMjAgMTkxLjRjLTYuNC02LjQtOC42LTE1LjgtNS44LTI0LjRzMTAuMS0xNC45IDE5LjEtMTYuM0wxOTMuMSAxMjUuMyAyNTguOC0zLjNjNS05LjkgMTYuMi0xNSAyNy0xMi40ek0yNTYuMSAxMDcuNEwyMzAuMyAxNThjLTMuNSA2LjgtMTAgMTEuNi0xNy42IDEyLjhsLTEyNS41IDIwIDg5LjggODkuOWM1LjQgNS40IDcuOSAxMy4xIDYuNyAyMC43bC0xOS44IDEyNS41IDkyLjItNDYuOSAwLTI3Mi42eiJdCiAgICB9OwogICAgZmFBbGFybUNsb2NrID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImFsYXJtLWNsb2NrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTIwMF0sICJmMzRlIiwgIk00MDIuNiA1MC4yYy01LjQgMS43LTExLjMgMS44LTE2LjItLjktNS44LTMuMi0xMS44LTYuMi0xNy44LTguOS0xMC40LTQuNy0xMy43LTE4LjMtNC4xLTI0LjYgMTUtOS45IDMzLTE1LjcgNTIuMy0xNS43IDUyLjYgMCA5NS4yIDQyLjYgOTUuMiA5NS4yIDAgMTMuMi0yLjcgMjUuOC03LjYgMzcuMy00LjUgMTAuNS0xOC40IDkuOC0yNC45IC40LTMuOC01LjUtNy44LTEwLjgtMTItMTYtMy41LTQuNC00LjUtMTAuMi0zLjgtMTUuOCAuMi0xLjkgLjQtMy45IC40LTUuOSAwLTI2LjEtMjEuMi00Ny4yLTQ3LjItNDcuMi00LjkgMC05LjcgLjgtMTQuMiAyLjJ6TTMyLjUgMTMyLjljLTYuNSA5LjQtMjAuNSAxMC4xLTI0LjktLjQtNC45LTExLjUtNy42LTI0LjEtNy42LTM3LjMgMC01Mi42IDQyLjYtOTUuMiA5NS4yLTk1LjIgMTkuMyAwIDM3LjMgNS44IDUyLjMgMTUuNyA5LjYgNi4zIDYuMyAxOS45LTQuMSAyNC42LTYuMSAyLjgtMTIgNS43LTE3LjggOC45LTQuOSAyLjctMTAuOSAyLjYtMTYuMiAuOS00LjUtMS40LTkuMi0yLjItMTQuMi0yLjItMjYuMSAwLTQ3LjIgMjEuMi00Ny4yIDQ3LjIgMCAyIC4xIDQgLjQgNS45IC43IDUuNi0uMyAxMS40LTMuOCAxNS44LTQuMiA1LjItOC4yIDEwLjUtMTIgMTZ6TTQzMiAyODhhMTc2IDE3NiAwIDEgMCAtMzUyIDAgMTc2IDE3NiAwIDEgMCAzNTIgMHpNMzk2LjUgNDYyLjVDMzU4LjEgNDkzLjQgMzA5LjIgNTEyIDI1NiA1MTJzLTEwMi4xLTE4LjYtMTQwLjUtNDkuNUw3MyA1MDVjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsNDIuNS00Mi41QzUwLjYgMzkwLjEgMzIgMzQxLjIgMzIgMjg4IDMyIDE2NC4zIDEzMi4zIDY0IDI1NiA2NFM0ODAgMTY0LjMgNDgwIDI4OGMwIDUzLjItMTguNiAxMDIuMS00OS41IDE0MC41TDQ3MyA0NzFjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtNDIuNS00Mi41ek0yODAgMTg0bDAgOTQuMSA0MSA0MWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwbC00OC00OGMtNC41LTQuNS03LTEwLjYtNy0xN2wwLTEwNGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0eiJdCiAgICB9OwogICAgZmFOZXdzcGFwZXIgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAibmV3c3BhcGVyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MjQwXSwgImYxZWEiLCAiTTE2OCA4MGMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAzMDRjMCA4LjQtMS40IDE2LjUtNC4xIDI0TDQ0MCA0MzJjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC0zMDRjMC0xMy4zLTEwLjctMjQtMjQtMjRMMTY4IDgwek03MiA0ODBjLTM5LjggMC03Mi0zMi4yLTcyLTcyTDAgMTEyQzAgOTguNyAxMC43IDg4IDI0IDg4czI0IDEwLjcgMjQgMjRsMCAyOTZjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTMwNGMwLTM5LjggMzIuMi03MiA3Mi03MmwyNzIgMGMzOS44IDAgNzIgMzIuMiA3MiA3MmwwIDMwNGMwIDM5LjgtMzIuMiA3Mi03MiA3Mkw3MiA0ODB6TTE5MiAxNTJjMC0xMy4zIDEwLjctMjQgMjQtMjRsNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0bC00OCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTQ4em0xNTIgMjRsNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNDggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHpNMjE2IDI1NmwxNzYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTc2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6bTAgODBsMTc2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE3NiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFIb3NwaXRhbCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJob3NwaXRhbCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyNzk3MywgNjI1ODksICJob3NwaXRhbC1hbHQiLCAiaG9zcGl0YWwtd2lkZSJdLCAiZjBmOCIsICJNMTc2IDBjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgNDgtNDggMGMtMzUuMyAwLTY0IDI4LjctNjQgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsNDQ4IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNzJjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTQ4IDAgMC00OGMwLTM1LjMtMjguNy02NC02NC02NEwxNzYgMHpNMTYwIDY0YzAtOC44IDcuMi0xNiAxNi0xNmwyMjQgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCA3MmMwIDEzLjMgMTAuNyAyNCAyNCAyNGw3MiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDI3MmMwIDguOC03LjIgMTYtMTYgMTZsLTE3NiAwIDAtODBjMC0xNy43LTE0LjMtMzItMzItMzJsLTMyIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgODAtMTc2IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTI3MmMwLTguOCA3LjItMTYgMTYtMTZsNzIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTcyek0xMTIgMjI0Yy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDB6TTk2IDMzNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2em0zMjAgMGwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2em0xNi0xMTJjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHpNMjY0IDEwNGwwIDMyLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDE2YzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwIDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDE2IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzIgMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0xNmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDAgMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTE2IDBjLTguOCAwLTE2IDcuMi0xNiAxNnoiXQogICAgfTsKICAgIGZhSG9zcGl0YWxBbHQgPSBmYUhvc3BpdGFsOwogICAgZmFIb3NwaXRhbFdpZGUgPSBmYUhvc3BpdGFsOwogICAgZmFDaXJjbGVTdG9wID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1zdG9wIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjIwOTQsICJzdG9wLWNpcmNsZSJdLCAiZjI4ZCIsICJNMjU2IDQ4YTIwOCAyMDggMCAxIDEgMCA0MTYgMjA4IDIwOCAwIDEgMSAwLTQxNnptMCA0NjRhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0xNjAgMTkybDAgMTI4YzAgMTcuNyAxNC4zIDMyIDMyIDMybDEyOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMTI4YzAtMTcuNy0xNC4zLTMyLTMyLTMybC0xMjggMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6bTQ4IDExMmwwLTk2IDk2IDAgMCA5Ni05NiAweiJdCiAgICB9OwogICAgZmFTdG9wQ2lyY2xlID0gZmFDaXJjbGVTdG9wOwogICAgZmFPYmplY3RVbmdyb3VwID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogIm9iamVjdC11bmdyb3VwIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYyNDgiLCAiTTQ4LjIgNjYuOGMtLjEtLjgtLjItMS43LS4yLTIuNWwwLS4yYzAtOC44IDcuMi0xNiAxNi0xNiAuOSAwIDEuOSAuMSAyLjggLjIgNy41IDEuMyAxMy4yIDcuOSAxMy4yIDE1LjggMCA4LjgtNy4yIDE2LTE2IDE2LTcuOSAwLTE0LjUtNS43LTE1LjgtMTMuMnpNMCA2NGMwIDI2LjkgMTYuNSA0OS45IDQwIDU5LjNsMCAxMDUuM2MtMjMuNSA5LjUtNDAgMzIuNS00MCA1OS4zIDAgMzUuMyAyOC43IDY0IDY0IDY0IDI2LjkgMCA0OS45LTE2LjUgNTkuMy00MGwyMDEuMyAwYzkuNSAyMy41IDMyLjUgNDAgNTkuMyA0MCAzNS4zIDAgNjQtMjguNyA2NC02NCAwLTI2LjktMTYuNS00OS45LTQwLTU5LjNsMC0xMDUuM2MyMy41LTkuNSA0MC0zMi41IDQwLTU5LjMgMC0zNS4zLTI4LjctNjQtNjQtNjQtMjYuOSAwLTQ5LjkgMTYuNS01OS4zIDQwTDEyMy4zIDQwQzExMy45IDE2LjUgOTAuOSAwIDY0IDAgMjguNyAwIDAgMjguNyAwIDY0em0zNjggMGExNiAxNiAwIDEgMSAzMiAwIDE2IDE2IDAgMSAxIC0zMiAwek0zMjQuNyA4OGM2LjUgMTYgMTkuMyAyOC45IDM1LjMgMzUuM2wwIDEwNS4zYy0xNiA2LjUtMjguOSAxOS4zLTM1LjMgMzUuM2wtMjAxLjMgMGMtNi41LTE2LTE5LjMtMjguOS0zNS4zLTM1LjNsMC0xMDUuM2MxNi02LjUgMjguOS0xOS4zIDM1LjMtMzUuM2wyMDEuMyAwek0zODQgMjcyYTE2IDE2IDAgMSAxIDAgMzIgMTYgMTYgMCAxIDEgMC0zMnpNODAgMjg4YzAgNy45LTUuNyAxNC41LTEzLjIgMTUuOC0uOCAuMS0xLjcgLjItMi41IC4ybC0uMiAwYy04LjggMC0xNi03LjItMTYtMTYgMC0uOSAuMS0xLjkgLjItMi44IDEuMy03LjUgNy45LTEzLjIgMTUuOC0xMy4yIDguOCAwIDE2IDcuMiAxNiAxNnptNDM2LjctNDBjNi41IDE2IDE5LjMgMjguOSAzNS4zIDM1LjNsMCAxMDUuM2MtMTYgNi41LTI4LjkgMTkuMy0zNS4zIDM1LjNsLTIwMS4zIDBjLTYuNS0xNi0xOS4zLTI4LjktMzUuMy0zNS4zbDAtMjAuNy00OCAwIDAgMjAuN2MtMjMuNSA5LjUtNDAgMzIuNS00MCA1OS4zIDAgMzUuMyAyOC43IDY0IDY0IDY0IDI2LjkgMCA0OS45LTE2LjUgNTkuMy00MGwyMDEuMyAwYzkuNSAyMy41IDMyLjUgNDAgNTkuMyA0MCAzNS4zIDAgNjQtMjguNyA2NC02NCAwLTI2LjktMTYuNS00OS45LTQwLTU5LjNsMC0xMDUuM2MyMy41LTkuNSA0MC0zMi41IDQwLTU5LjMgMC0zNS4zLTI4LjctNjQtNjQtNjQtMjYuOSAwLTQ5LjkgMTYuNS01OS4zIDQwbC01Mi43IDAgMCA5LjZjMTAuNyAxMC45IDE5LjEgMjMuOSAyNC42IDM4LjRsMjggMHptNTkuMy04YTE2IDE2IDAgMSAxIDAtMzIgMTYgMTYgMCAxIDEgMCAzMnpNMjcxLjggNDUwLjdhMTYgMTYgMCAxIDEgLTMxLjUtNS41IDE2IDE2IDAgMSAxIDMxLjUgNS41em0zMDEuNSAxM2MtNy41LTEuMy0xMy4yLTcuOS0xMy4yLTE1LjggMC04LjggNy4yLTE2IDE2LTE2IDcuOSAwIDE0LjUgNS43IDE1LjggMTMuMmwwIC4xYy4xIC45IC4yIDEuOCAuMiAyLjcgMCA4LjgtNy4yIDE2LTE2IDE2LS45IDAtMS45LS4xLTIuOC0uMnoiXQogICAgfTsKICAgIGZhQ29tbWVudCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjb21tZW50IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NDg5LCA2MTY2OV0sICJmMDc1IiwgIk01MS45IDM4NC45QzE5LjMgMzQ0LjYgMCAyOTQuNCAwIDI0MCAwIDEwNy41IDExNC42IDAgMjU2IDBTNTEyIDEwNy41IDUxMiAyNDAgMzk3LjQgNDgwIDI1NiA0ODBjLTM2LjUgMC03MS4yLTcuMi0xMDIuNi0yMEwzNyA1MDkuOWMtMy43IDEuNi03LjUgMi4xLTExLjUgMi4xLTE0LjEgMC0yNS41LTExLjQtMjUuNS0yNS41IDAtNC4zIDEuMS04LjUgMy4xLTEyLjJsNDguOC04OS40em0zNy4zLTMwLjJjMTIuMiAxNS4xIDE0LjEgMzYuMSA0LjggNTMuMmwtMTggMzMuMSA1OC41LTI1LjFjMTEuOC01LjEgMjUuMi01LjIgMzcuMS0uMyAyNS43IDEwLjUgNTQuMiAxNi40IDg0LjMgMTYuNCAxMTcuOCAwIDIwOC04OC44IDIwOC0xOTJTMzczLjggNDggMjU2IDQ4IDQ4IDEzNi44IDQ4IDI0MGMwIDQyLjggMTUuMSA4Mi40IDQxLjIgMTE0Ljd6Il0KICAgIH07CiAgICBmYUNoZXNzUGF3biA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjaGVzcy1wYXduIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbOTgyM10sICJmNDQzIiwgIk0xOTItMzJjNjYuMyAwIDEyMCA1My43IDEyMCAxMjAgMCAyNy42LTkuMyA1Mi45LTI0LjkgNzMuMiA5LjggMyAxNi45IDEyLjEgMTYuOSAyMi44IDAgMTMuMy0xMC43IDI0LTI0IDI0bC0uNiAwIDI0LjYgMTYwIDUzLjYgNjdjNi43IDguNCAxMC40IDE4LjggMTAuNCAyOS42IDAgMjYuMi0yMS4yIDQ3LjQtNDcuNCA0Ny40TDYzLjQgNTEyYy0yNi4yIDAtNDcuNC0yMS4yLTQ3LjQtNDcuNCAwLTEwLjggMy43LTIxLjIgMTAuNC0yOS42bDUzLjYtNjcgMjQuNi0xNjAtLjYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjQgMC0xMC44IDcuMS0xOS44IDE2LjktMjIuOC0xNS42LTIwLjMtMjQuOS00NS42LTI0LjktNzMuMiAwLTY2LjMgNTMuNy0xMjAgMTIwLTEyMHpNMTE1LjkgNDAwbC01MS4yIDY0IDI1NC43IDAtNTEuMi02NC0xNTIuMiAwem0zNi4yLTE4NC43bC0yMSAxMzYuNyAxMjEuOSAwLTIxLTEzNi43LTEuMS03LjMtNzcuNiAwLTEuMSA3LjN6TTE5MiAxNmE3MiA3MiAwIDEgMCAwIDE0NCA3MiA3MiAwIDEgMCAwLTE0NHoiXQogICAgfTsKICAgIGZhQ2FsZW5kYXJQbHVzID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNhbGVuZGFyLXBsdXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjI3MSIsICJNMTIwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA0MCAxNjAgMCAwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA0MCAzMiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjg4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsMzIgMCAwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0em0wIDExMmwtNTYgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMjg4YzAgOC44IDcuMiAxNiAxNiAxNmwzMjAgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0yODhjMC04LjgtNy4yLTE2LTE2LTE2bC0yNjQgMHptMTA0IDY0YzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgNDggNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNDggMCAwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNDgtNDggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGw0OCAwIDAtNDhjMC0xMy4zIDEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYUNsaXBib2FyZCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjbGlwYm9hcmQiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjgyMDNdLCAiZjMyOCIsICJNMjMyIDk2bC04MCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDgwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjR6bTAgNDhjMzcuMSAwIDY3LjYtMjggNzEuNi02NEwzMjAgODBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzUyYzAgOC44LTcuMiAxNi0xNiAxNkw2NCA0NjRjLTguOCAwLTE2LTcuMi0xNi0xNkw0OCA5NmMwLTguOCA3LjItMTYgMTYtMTZsMTYuNCAwYzQgMzYgMzQuNSA2NCA3MS42IDY0bDgwIDB6TTI5MS45IDMyQzI3OSAxMi43IDI1NyAwIDIzMiAwTDE1MiAwYy0yNSAwLTQ3IDEyLjctNTkuOSAzMkw2NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI1NiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzUyYzAtMzUuMy0yOC43LTY0LTY0LTY0bC0yOC4xIDB6Il0KICAgIH07CiAgICBmYVRodW1ic0Rvd24gPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAidGh1bWJzLWRvd24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgwNzgsIDYxNTc2XSwgImYxNjUiLCAiTTM2MCAzMmw3LjQgLjRjMzUgMy42IDYyLjUgMzIuMiA2NC40IDY3LjcgMTcuOCAxMS44IDMwLjEgMzEuNCAzMiA1My45bC4yIDZjMCA1LjctLjcgMTEuMi0yIDE2LjUgMTAuMiAxMS41IDE2LjggMjYuMyAxNy44IDQyLjdsLjIgNC44YzAgMTMuMi0zLjYgMjUuNC05LjggMzYgNC45IDguNCA4LjIgMTcuOSA5LjMgMjhsLjQgOGMwIDM3LjMtMjguMyA2Ny45LTY0LjYgNzEuNmwtNy40IC40LTEwOS43IDAgMTQuMSAzMCAzLjEgNy42YzEyLjUgMzUuNy0xLjggNzUuNS0zNC4yIDk1bC03LjIgMy45Yy0zNy41IDE3LjYtODEuNyAzLjYtMTAyLjYtMzEuMmwtLjYtLjktMi43LTUtLjYtMS4yLTMwLjEtNjRjLTkuNCAxNy44LTI4IDI5LjktNDkuNSAyOS45bC0zMiAwYy0zMC45IDAtNTYtMjUuMS01Ni01NkwwIDE1MmMwLTMwLjkgMjUuMS01NiA1Ni01NmwzMiAwYzEyLjQgMCAyMy45IDQuMSAzMy4yIDExIDEzLjItMjEuNCAzMi0zOS40IDU1LTUxLjZsMTIuMi02LjUgLjctLjMgNi42LTMuMiAuNy0uMyA3LjEtM2MxNi43LTYuNiAzNC41LTkuOSA1Mi42LTkuOUwzNjAgMzJ6TTI1NS45IDgwYy0xMiAwLTIzLjkgMi4zLTM1LjEgNi42bC00LjcgMi01LjMgMi42IDAgMC0xMi4yIDYuNWMtMjkuMiAxNS41LTQ4LjMgNDQuOS01MC43IDc3LjZsLS4yIDggMCAxMTIuOSAuMSA0LjFjLjUgOC4yIDIuNSAxNi4yIDYgMjMuN2w1Ni44IDEyMC45IDIuMSAzLjhjOC40IDEzLjcgMjYgMTkuMSA0MC44IDEyLjJsMi45LTEuNmMxMy03LjggMTguNy0yMy43IDEzLjctMzhsLTEuMi0zLTMwLjItNjQuMmMtMy41LTcuNC0yLjktMTYuMSAxLjUtMjMuMXMxMi0xMS4xIDIwLjItMTEuMWwxNDcuNSAwIDIuNC0uMWMxMS4zLTEuMSAyMC4zLTEwLjEgMjEuNC0yMS40bC4xLTIuNWMwLTcuMS0zLjEtMTMuNS04LjItMTgtNS4yLTQuNi04LjItMTEuMS04LjItMThzMy0xMy40IDguMi0xOGM0LjQtMy45IDcuNC05LjMgOC0xNS4zbC4yLTIuN2MwLTguNC00LjQtMTUuOS0xMS4yLTIwLjItMTAuNy02LjktMTQuMi0yMC45LTgtMzIgMS41LTIuNiAyLjUtNS42IDIuOS04LjZsLjItMy4yYzAtMTAuNi02LjktMTkuNi0xNi42LTIyLjgtMTEuNy0zLjgtMTguNy0xNS45LTE2LTI4IC4yLS45IC4zLTEuOCAuNC0yLjZsLjItMi42YzAtMTIuNC05LjUtMjIuNi0yMS42LTIzLjhMMzYwIDgwIDI1NS45IDgwek01NiAxNDRjLTQuNCAwLTggMy42LTggOGwwIDIyNGMwIDQuNCAzLjYgOCA4IDhsMzIgMGM0LjQgMCA4LTMuNiA4LThsMC0yMjRjMC00LjQtMy42LTgtOC04bC0zMiAweiJdCiAgICB9OwogICAgZmFJZEJhZGdlID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImlkLWJhZGdlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYyYzEiLCAiTTI1NiA0OGwwIDE2YzAgMTcuNy0xNC4zIDMyLTMyIDMybC02NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTE2LTY0IDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDM4NGMwIDguOCA3LjIgMTYgMTYgMTZsMjU2IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzg0YzAtOC44LTcuMi0xNi0xNi0xNmwtNjQgMHpNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMMzIwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzODRjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDY0ek0xNjAgMzIwbDY0IDBjNDQuMiAwIDgwIDM1LjggODAgODAgMCA4LjgtNy4yIDE2LTE2IDE2TDk2IDQxNmMtOC44IDAtMTYtNy4yLTE2LTE2IDAtNDQuMiAzNS44LTgwIDgwLTgwem0tMjQtOTZhNTYgNTYgMCAxIDEgMTEyIDAgNTYgNTYgMCAxIDEgLTExMiAweiJdCiAgICB9OwogICAgZmFTcXVhcmVDaGVjayA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtY2hlY2siLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs5NzQ1LCA5OTg5LCA2MTUxMCwgImNoZWNrLXNxdWFyZSJdLCAiZjE0YSIsICJNMzg0IDMyYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMHpNNjQgODBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyMGMwIDguOCA3LjIgMTYgMTYgMTZsMzIwIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzIwYzAtOC44LTcuMi0xNi0xNi0xNkw2NCA4MHptMjMwLjcgODkuOWM3LjgtMTAuNyAyMi44LTEzLjEgMzMuNS01LjMgMTAuNyA3LjggMTMuMSAyMi44IDUuMyAzMy41TDIxMS40IDM2Ni4xYy00LjEgNS43LTEwLjUgOS4zLTE3LjUgOS44LTcgLjUtMTMuOS0yLTE4LjgtNi45bC01NS45LTU1LjljLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGwzNiAzNiAxMDUuNi0xNDUuMnoiXQogICAgfTsKICAgIGZhQ2hlY2tTcXVhcmUgPSBmYVNxdWFyZUNoZWNrOwogICAgZmFDaGVzc0Jpc2hvcCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjaGVzcy1iaXNob3AiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFs5ODIxXSwgImY0M2EiLCAiTTIxNiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNiAwIDgxLjggOTguMWMyNC43IDI5LjYgMzguMiA2NyAzOC4yIDEwNS42IDAgNDMuNy0xNy40IDg1LjctNDguMyAxMTYuNmwtOC42IDguNiA0Ni41IDU4LjJjNi43IDguNCAxMC40IDE4LjggMTAuNCAyOS42IDAgMjYuMi0yMS4yIDQ3LjQtNDcuNCA0Ny40TDQ3LjQgNTEyQzIxLjIgNTEyIDAgNDkwLjggMCA0NjQuNiAwIDQ1My45IDMuNyA0NDMuNCAxMC40IDQzNWw0Ni41LTU4LjItOC42LTguNkMxNy40IDMzNy40IDAgMjk1LjQgMCAyNTEuNyAwIDIxMy4xIDEzLjUgMTc1LjggMzguMiAxNDYuMUwxMjAgNDggMTA0IDQ4QzkwLjcgNDggODAgMzcuMyA4MCAyNFM5MC43IDAgMTA0IDBMMjE2IDB6TTk0LjQgNDA2LjhsLTQ1LjcgNTcuMiAyMjIuNyAwLTQ1LjctNTcuMS01LjUtNi45LTEyMC4zIDAtNS41IDYuOHpNMTU2LjkgNzguN0w3NS4xIDE3Ni44Yy0xNS4zIDE4LjQtMjQuNiA0MS0yNi43IDY0LjdMNDggMjUxLjdjMCAzMSAxMi4zIDYwLjcgMzQuMiA4Mi43bDE3LjcgMTcuNyAxMjAuMiAwYzYuMi02LjIgMTIuMS0xMi4xIDE3LjgtMTcuNyAyMS45LTIxLjkgMzQuMi01MS42IDM0LjItODIuNmwtLjQtMTAuMmMtMS41LTE3LTYuNy0zMy4zLTE1LjItNDhMMjA5IDI0MWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWw1MS44LTUxLjgtNjMuNy03Ni41LTMuMS0zLjgtMy4xIDMuOHoiXQogICAgfTsKICAgIGZhRW52ZWxvcGVPcGVuID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImVudmVsb3BlLW9wZW4iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MjEzNV0sICJmMmI2IiwgIk01MTIgNDE2YzAgMzUuMy0yOC41IDY0LTYzLjkgNjRMNjQgNDgwYy0zNS40IDAtNjQtMjguNy02NC02NEwwIDE2NGMuMS0xNS41IDcuOC0zMCAyMC41LTM4LjhMMjA2LTIuN2MzMC4xLTIwLjcgNjkuOC0yMC43IDk5LjkgMEw0OTEuNSAxMjUuMmMxMi44IDguOCAyMC40IDIzLjMgMjAuNSAzOC44bDAgMjUyek02NCA0MzJsMzg0LjEgMGM4LjggMCAxNS45LTcuMSAxNS45LTE2bDAtMTkxLjctMTU0LjggMTE3LjRjLTMxLjQgMjMuOS03NC45IDIzLjktMTA2LjQgMEw0OCAyMjQuMyA0OCA0MTZjMCA4LjkgNy4yIDE2IDE2IDE2ek00NjMuNiAxNjQuNEwyNzguNyAzNi44Yy0xMy43LTkuNC0zMS43LTkuNC00NS40IDBMNDguNCAxNjQuNCAyMzEuOCAzMDMuNWMxNC4zIDEwLjggMzQuMSAxMC44IDQ4LjQgMEw0NjMuNiAxNjQuNHoiXQogICAgfTsKICAgIGZhQ2lyY2xlWG1hcmsgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLXhtYXJrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjE1MzIsICJ0aW1lcy1jaXJjbGUiLCAieG1hcmstY2lyY2xlIl0sICJmMDU3IiwgIk0yNTYgNDhhMjA4IDIwOCAwIDEgMSAwIDQxNiAyMDggMjA4IDAgMSAxIDAtNDE2em0wIDQ2NGEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTE2NyAxNjdjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45bDU1IDU1LTU1IDU1Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBsNTUtNTUgNTUgNTVjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC01NS01NSA1NS01NWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwbC01NSA1NS01NS01NWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDB6Il0KICAgIH07CiAgICBmYVRpbWVzQ2lyY2xlID0gZmFDaXJjbGVYbWFyazsKICAgIGZhWG1hcmtDaXJjbGUgPSBmYUNpcmNsZVhtYXJrOwogICAgZmFTcXVhcmVDYXJldFVwID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1jYXJldC11cCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJjYXJldC1zcXVhcmUtdXAiXSwgImYxNTEiLCAiTTY0IDgwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMjBjMCA4LjggNy4yIDE2IDE2IDE2bDMyMCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyMGMwLTguOC03LjItMTYtMTYtMTZMNjQgODB6TTAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMzIwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2em0yMjQgNjRjNi43IDAgMTMgMi44IDE3LjYgNy43bDEwNCAxMTJjNi41IDcgOC4yIDE3LjIgNC40IDI1LjlTMzM3LjUgMzIwIDMyOCAzMjBsLTIwOCAwYy05LjUgMC0xOC4yLTUuNy0yMi0xNC40cy0yLjEtMTguOSA0LjQtMjUuOWwxMDQtMTEyYzQuNS00LjkgMTAuOS03LjcgMTcuNi03Ljd6Il0KICAgIH07CiAgICBmYUNhcmV0U3F1YXJlVXAgPSBmYVNxdWFyZUNhcmV0VXA7CiAgICBmYUZpbGVJbWFnZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLWltYWdlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4NDQzXSwgImYxYzUiLCAiTTE3NiA0OEw2NCA0OGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzg0YzAgOC44IDcuMiAxNiAxNiAxNmwyNTYgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0yNDAtODggMGMtMzkuOCAwLTcyLTMyLjItNzItNzJsMC04OHpNMzE2LjEgMTYwTDIyNCA2Ny45IDIyNCAxMzZjMCAxMy4zIDEwLjcgMjQgMjQgMjRsNjguMSAwek0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwxOTcuNSAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDM2NS4zIDE0MS4zYzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNMMzg0IDQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6TTI1OS40IDQzMmwtMTM0LjggMGMtMTUuOCAwLTI4LjYtMTIuOC0yOC42LTI4LjYgMC02LjQgMi4xLTEyLjUgNi0xNy42bDY3LjYtODYuOUMxNzUgMjkyIDE4My4zIDI4OCAxOTIgMjg4czE3IDQgMjIuNCAxMC45TDI4MiAzODUuOWMzLjkgNSA2IDExLjIgNiAxNy42IDAgMTUuOC0xMi44IDI4LjYtMjguNiAyOC42ek0xMTIgMjI0YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhU3F1YXJlQ2FyZXRSaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtY2FyZXQtcmlnaHQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiY2FyZXQtc3F1YXJlLXJpZ2h0Il0sICJmMTUyIiwgIk00MDAgOTZjMC04LjgtNy4yLTE2LTE2LTE2TDY0IDgwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMjBjMCA4LjggNy4yIDE2IDE2IDE2bDMyMCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyMHpNMzg0IDMyYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMHpNMzIwIDI1NmMwIDYuNy0yLjggMTMtNy43IDE3LjZsLTExMiAxMDRjLTcgNi41LTE3LjIgOC4yLTI1LjkgNC40UzE2MCAzNjkuNSAxNjAgMzYwbDAtMjA4YzAtOS41IDUuNy0xOC4yIDE0LjQtMjJzMTguOS0yLjEgMjUuOSA0LjRsMTEyIDEwNGM0LjkgNC41IDcuNyAxMC45IDcuNyAxNy42eiJdCiAgICB9OwogICAgZmFDYXJldFNxdWFyZVJpZ2h0ID0gZmFTcXVhcmVDYXJldFJpZ2h0OwogICAgZmFTdW4gPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAic3VuIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbOTcyOF0sICJmMTg1IiwgIk0yODgtMzJjOCAwIDE1LjQgNCAxOS45IDEwLjZsNTguOCA4Ny40IDEwMy40LTIwLjJjNy44LTEuNSAxNS45IC45IDIxLjYgNi42czguMSAxMy44IDYuNiAyMS42TDQ3OCAxNzcuMyA1NjUuNCAyMzYuMUM1NzIgMjQwLjUgNTc2IDI0OCA1NzYgMjU2cy00IDE1LjQtMTAuNiAxOS45TDQ3OCAzMzQuNyA0OTguMiA0MzhjMS41IDcuOC0uOSAxNS45LTYuNiAyMS42cy0xMy44IDguMS0yMS42IDYuNkwzNjYuNyA0NDYgMzA3LjkgNTMzLjRDMzAzLjQgNTQwIDI5NiA1NDQgMjg4IDU0NHMtMTUuNC00LTE5LjktMTAuNkwyMDkuMyA0NDYgMTA1LjkgNDY2LjJjLTcuOCAxLjUtMTUuOS0uOS0yMS42LTYuNnMtOC4xLTEzLjgtNi42LTIxLjZMOTggMzM0LjcgMTAuNiAyNzUuOUM0IDI3MS40IDAgMjY0IDAgMjU2czQtMTUuNCAxMC42LTE5LjlMOTggMTc3LjMgNzcuOCA3My45Yy0xLjUtNy44IC45LTE1LjkgNi42LTIxLjZzMTMuOC04LjEgMjEuNi02LjZsMTAzLjMgMjAuMiA1OC44LTg3LjQgMS44LTIuM0MyNzQuNC0yOSAyODEtMzIgMjg4LTMyem0tNDcuOCAxMzhjLTUuNCA4LTE1IDEyLTI0LjUgMTAuMmwtODQtMTYuNCAxNi40IDg0YzEuOCA5LjUtMi4yIDE5LjEtMTAuMiAyNC41TDY3IDI1NiAxMzggMzAzLjhjOCA1LjQgMTIgMTUgMTAuMiAyNC41bC0xNi40IDg0IDg0LTE2LjQgMy41LS40YzguMy0uNCAxNi4zIDMuNiAyMSAxMC42bDQ3LjggNzEgNDcuOC03MSAyLjItMi44YzUuNi02LjEgMTQtOSAyMi4zLTcuM2w4NCAxNi40LTE2LjQtODRjLTEuOC05LjUgMi4yLTE5LjEgMTAuMi0yNC41bDcxLTQ3LjgtNzEtNDcuOGMtOC01LjQtMTItMTUtMTAuMi0yNC41bDE2LjQtODQtODQgMTYuNGMtOS41IDEuOC0xOS4xLTIuMi0yNC41LTEwLjJsLTQ3LjgtNzEtNDcuOCA3MXpNMjg4IDM3NmExMjAgMTIwIDAgMSAxIDAtMjQwIDEyMCAxMjAgMCAxIDEgMCAyNDB6bTAtMTkyYTcyIDcyIDAgMSAwIDAgMTQ0IDcyIDcyIDAgMSAwIDAtMTQ0eiJdCiAgICB9OwogICAgZmFJbWFnZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJpbWFnZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMDNlIiwgIk02NCA4MGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzIwYzAgOC44IDcuMiAxNiAxNiAxNmwzMjAgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMjBjMC04LjgtNy4yLTE2LTE2LTE2TDY0IDgwek0wIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NnptMTI4IDMyYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHptMTM2IDcyYzguNSAwIDE2LjQgNC41IDIwLjcgMTEuOGw4MCAxMzZjNC40IDcuNCA0LjQgMTYuNiAuMSAyNC4xUzM1Mi42IDM4NCAzNDQgMzg0bC0yNDAgMGMtOC45IDAtMTcuMi01LTIxLjMtMTIuOXMtMy41LTE3LjUgMS42LTI0LjhsNTYtODBjNC41LTYuNCAxMS44LTEwLjIgMTkuNy0xMC4yczE1LjIgMy44IDE5LjcgMTAuMmwxNy4yIDI0LjYgNDYuNS03OWM0LjMtNy4zIDEyLjItMTEuOCAyMC43LTExLjh6Il0KICAgIH07CiAgICBmYUxpZ2h0YnVsYiA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJsaWdodGJ1bGIiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjgxNjFdLCAiZjBlYiIsICJNMjk2LjUgMjkxLjFDMzIxIDI2NS4yIDMzNiAyMzAuNCAzMzYgMTkyIDMzNiAxMTIuNSAyNzEuNSA0OCAxOTIgNDhTNDggMTEyLjUgNDggMTkyYzAgMzguNCAxNSA3My4yIDM5LjUgOTkuMSAyMS4zIDIyLjQgNDQuOSA1NCA1My4zIDkyLjlsMTAyLjQgMGM4LjQtMzkgMzItNzAuNSA1My4zLTkyLjl6bTM0LjggMzNDMzA3LjcgMzQ5IDI4OCAzNzkuNCAyODggNDEzLjdsMCAxOC4zYzAgNDQuMi0zNS44IDgwLTgwIDgwbC0zMiAwYy00NC4yIDAtODAtMzUuOC04MC04MGwwLTE4LjNDOTYgMzc5LjQgNzYuMyAzNDkgNTIuNyAzMjQuMSAyMCAyODkuNyAwIDI0My4yIDAgMTkyIDAgODYgODYgMCAxOTIgMFMzODQgODYgMzg0IDE5MmMwIDUxLjItMjAgOTcuNy01Mi43IDEzMi4xek0xNDQgMTg0YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtNDguNiAzOS40LTg4IDg4LTg4IDEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0Yy0yMi4xIDAtNDAgMTcuOS00MCA0MHoiXQogICAgfTsKICAgIGZhQWRkcmVzc0NhcmQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiYWRkcmVzcy1jYXJkIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbNjIxNDAsICJjb250YWN0LWNhcmQiLCAidmNhcmQiXSwgImYyYmIiLCAiTTUxMiA4MGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMjBjMCA4LjgtNy4yIDE2LTE2IDE2TDY0IDQzMmMtOC44IDAtMTYtNy4yLTE2LTE2TDQ4IDk2YzAtOC44IDcuMi0xNiAxNi0xNmw0NDggMHpNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGw0NDggMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnpNMjA4IDI0OGE1NiA1NiAwIDEgMCAwLTExMiA1NiA1NiAwIDEgMCAwIDExMnptLTMyIDQwYy00NC4yIDAtODAgMzUuOC04MCA4MCAwIDguOCA3LjIgMTYgMTYgMTZsMTkyIDBjOC44IDAgMTYtNy4yIDE2LTE2IDAtNDQuMi0zNS44LTgwLTgwLTgwbC02NCAwek0zNzYgMTQ0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDgwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTgwIDB6bTAgOTZjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsODAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtODAgMHoiXQogICAgfTsKICAgIGZhQ29udGFjdENhcmQgPSBmYUFkZHJlc3NDYXJkOwogICAgZmFWY2FyZCA9IGZhQWRkcmVzc0NhcmQ7CiAgICBmYUZhY2VNZWggPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1tZWgiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MjgsICJtZWgiXSwgImYxMWEiLCAiTTQ2NCAyNTZhMjA4IDIwOCAwIDEgMSAtNDE2IDAgMjA4IDIwOCAwIDEgMSA0MTYgMHpNMjU2IDBhMjU2IDI1NiAwIDEgMCAwIDUxMiAyNTYgMjU2IDAgMSAwIDAtNTEyek0xNzYgMjQwYTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHptMTkyLTMyYTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6TTE4NCAzMjBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTQ0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE0NCAweiJdCiAgICB9OwogICAgZmFNZWggPSBmYUZhY2VNZWg7CiAgICBmYU1hcCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJtYXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MDYsIDYyMDcyXSwgImYyNzkiLCAiTTUxMiA0OGMwLTguMy00LjMtMTYtMTEuMy0yMC40cy0xNS45LTQuOC0yMy4zLTEuMUwzNTIuNSA4OC4xIDE4MCAyOS40Yy0xMy43LTQuNy0yOC43LTMuOC00MS45IDIuM0wxMy44IDkwLjNDNS40IDk0LjIgMCAxMDIuNyAwIDExMkwwIDQ2NGMwIDguMiA0LjIgMTUuOSAxMS4xIDIwLjNzMTUuNiA0LjkgMjMuMSAxLjRsMTI3LjMtNTkuOSAxNzAuNyA1Ni45YzEzLjcgNC42IDI4LjUgMy43IDQxLjYtMi41bDEyNC40LTU4LjVjOC40LTQgMTMuOC0xMi40IDEzLjgtMjEuN2wwLTM1MnpNMTQ0IDgyLjFsMCAyOTktOTYgNDUuMiAwLTI5OSA5Ni00NS4yem00OCAzMDMuM2wwLTMwMS4xIDEyOCA0My41IDAgMzAwLjMtMTI4LTQyLjd6TTM2OCAxMzRsOTYtNDcuNCAwIDI5OC4yLTk2IDQ1LjIgMC0yOTZ6Il0KICAgIH07CiAgICBmYUhhbmRQb2ludERvd24gPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1wb2ludC1kb3duIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYwYTciLCAiTTY0IDQ0OGwwLTE3Ny42YzUuMiAxIDEwLjUgMS42IDE2IDEuNmwxNiAwIDAgMTc2YzAgOC44LTcuMiAxNi0xNiAxNnMtMTYtNy4yLTE2LTE2ek04MCAyMjRjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMjRjMC02Ni4zIDUzLjctMTIwIDEyMC0xMjBsNDggMGM1Mi41IDAgOTcuMSAzMy43IDExMy40IDgwLjctMy4xLS41LTYuMi0uNy05LjQtLjctMjAgMC0zNy45IDkuMi00OS43IDIzLjYtOS00LjktMTkuNC03LjYtMzAuMy03LjYtMTUuMSAwLTI5IDUuMy00MCAxNC0xMS04LjgtMjQuOS0xNC00MC0xNGwtNDAgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw0MCAwYzguOCAwIDE2IDcuMiAxNiAxNnMtNy4yIDE2LTE2IDE2bC04MCAwek0wIDE5MmwwIDBjMCAxOCA2IDM0LjYgMTYgNDhsMCAyMDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRzNjQtMjguNyA2NC02NGwwLTgyYzUuMSAxLjMgMTAuNSAyIDE2IDIgMjUuMyAwIDQ3LjItMTQuNyA1Ny42LTM2IDcgMi42IDE0LjUgNCAyMi40IDQgMjAgMCAzNy45LTkuMiA0OS43LTIzLjYgOSA0LjkgMTkuNCA3LjYgMzAuMyA3LjYgMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC04OEMzODQgNzUuMiAzMDguOCAwIDIxNiAwTDE2OCAwQzc1LjIgMCAwIDc1LjIgMCAxNjhsMCAyNHptMzM2IDY0YzAgOC44LTcuMiAxNi0xNiAxNnMtMTYtNy4yLTE2LTE2bDAtNjRjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDY0ek0xNjAgMjcyYzUuNSAwIDEwLjktLjcgMTYtMmwwIDM0YzAgOC44LTcuMiAxNi0xNiAxNnMtMTYtNy4yLTE2LTE2bDAtMzIgMTYgMHptNjQtMjRsMC00MGMwLTguOCA3LjItMTYgMTYtMTZzMTYgNy4yIDE2IDE2bDAgNjRjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC0yNHoiXQogICAgfTsKICAgIGZhRmFjZU1laEJsYW5rID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2UtbWVoLWJsYW5rIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTY2LCAibWVoLWJsYW5rIl0sICJmNWE0IiwgIk0yNTYgNDhhMjA4IDIwOCAwIDEgMCAwIDQxNiAyMDggMjA4IDAgMSAwIDAtNDE2ek01MTIgMjU2YTI1NiAyNTYgMCAxIDEgLTUxMiAwIDI1NiAyNTYgMCAxIDEgNTEyIDB6TTE0NCAyMDhhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptMTkyLTMyYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhTWVoQmxhbmsgPSBmYUZhY2VNZWhCbGFuazsKICAgIGZhRmFjZUdyaW5Ub25ndWUgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1ncmluLXRvbmd1ZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODUzOSwgImdyaW4tdG9uZ3VlIl0sICJmNTg5IiwgIk00NjQgMjU2YzAtMTE0LjktOTMuMS0yMDgtMjA4LTIwOFM0OCAxNDEuMSA0OCAyNTZjMCA3NC4xIDM4LjggMTM5LjIgOTcuMSAxNzYtLjctNS4yLTEuMS0xMC42LTEuMS0xNmwwLTUzLjVjLTEwLjItMTIuNi0xOC4zLTI2LjktMjMuOC00Mi40LTQuMS0xMS42IDcuOC0yMS40IDE5LjYtMTcuOCAzNC43IDEwLjYgNzQuMiAxNi41IDExNi4xIDE2LjUgNDIgMCA4MS41LTYgMTE2LjMtMTYuNiAxMS44LTMuNiAyMy43IDYuMSAxOS42IDE3LjgtNS41IDE1LjYtMTMuNiAyOS45LTIzLjggNDIuNWwwIDUzLjVjMCA1LjQtLjQgMTAuOC0xLjEgMTYgNTguNC0zNi44IDk3LjEtMTAxLjkgOTcuMS0xNzZ6bTQ4IDBjMCAxMTYuMy03Ny42IDIxNC42LTE4My45IDI0NS43LTE5LjUgMTYuNC00NC42IDI2LjMtNzIuMSAyNi4zcy01Mi42LTkuOS03Mi4xLTI2LjNDNzcuNiA0NzAuNiAwIDM3Mi4zIDAgMjU2IDAgMTE0LjYgMTE0LjYgMCAyNTYgMFM1MTIgMTE0LjYgNTEyIDI1NnpNMTc2IDE3NmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6bTEyOCAzMmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0xNiAyMDhsMC0zNy40YzAtMTQuNy0xMS45LTI2LjYtMjYuNi0yNi42bC0yIDBjLTExLjMgMC0yMS4xIDcuOS0yMy42IDE4LjktMi44IDEyLjYtMjAuOCAxMi42LTIzLjYgMC0yLjUtMTEuMS0xMi4zLTE4LjktMjMuNi0xOC45bC0yIDBjLTE0LjcgMC0yNi42IDExLjktMjYuNiAyNi42bDAgMzcuNGMwIDM1LjMgMjguNyA2NCA2NCA2NHM2NC0yOC43IDY0LTY0eiJdCiAgICB9OwogICAgZmFHcmluVG9uZ3VlID0gZmFGYWNlR3JpblRvbmd1ZTsKICAgIGZhRnV0Ym9sID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZ1dGJvbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzk5MTcsICJmdXRib2wtYmFsbCIsICJzb2NjZXItYmFsbCJdLCAiZjFlMyIsICJNMzg3IDIyOC4zYy00LjQtMi44LTcuNi03LTkuMi0xMS45cy0xLjQtMTAuMiAuNS0xNUw0MTEuNiAxMThjLTE5LjktMjIuNC00NC42LTQwLjUtNzIuNC01Mi43bC02OS4xIDU3LjZjLTQgMy4zLTkgNS4xLTE0LjEgNS4xcy0xMC4yLTEuOC0xNC4xLTUuMUwxNzIuOCA2NS4zYy0yNy44IDEyLjItNTIuNSAzMC4zLTcyLjQgNTIuN2wzMy40IDgzLjRjMS45IDQuOCAyLjEgMTAuMSAuNSAxNXMtNC45IDkuMS05LjIgMTEuOUw0OSAyNzYuMmMzIDMwLjkgMTIuNyA1OS43IDI3LjYgODUuMmw4OS43LTZjNS4yLS4zIDEwLjMgMS4xIDE0LjUgNC4yczcuMiA3LjQgOC40IDEyLjVsMjIgODcuMmMxNC40IDMuMiAyOS40IDQuOCA0NC44IDQuOHMzMC4zLTEuNyA0NC44LTQuOGwyMi04Ny4yYzEuMy01IDQuMi05LjQgOC40LTEyLjVzOS4zLTQuNSAxNC41LTQuMmw4OS43IDZjMTUtMjUuNCAyNC43LTU0LjMgMjcuNi04NS4xTDM4NyAyMjguM3pNMjU2IDBhMjU2IDI1NiAwIDEgMSAwIDUxMiAyNTYgMjU2IDAgMSAxIDAtNTEyem02MiAyMjFjOC40IDYuMSAxMS45IDE2LjkgOC43IDI2LjhsLTE4LjMgNTYuM2MtMy4yIDkuOS0xMi40IDE2LjYtMjIuOCAxNi42bC01OS4yIDBjLTEwLjQgMC0xOS42LTYuNy0yMi44LTE2LjZsLTE4LjMtNTYuM2MtMy4yLTkuOSAuMy0yMC43IDguNy0yNi44bDQ3LjktMzQuOGM4LjQtNi4xIDE5LjgtNi4xIDI4LjIgMEwzMTggMjIxeiJdCiAgICB9OwogICAgZmFGdXRib2xCYWxsID0gZmFGdXRib2w7CiAgICBmYVNvY2NlckJhbGwgPSBmYUZ1dGJvbDsKICAgIGZhRmFjZVN1cnByaXNlID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2Utc3VycHJpc2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1NTgsICJzdXJwcmlzZSJdLCAiZjVjMiIsICJNNDY0IDI1NmEyMDggMjA4IDAgMSAwIC00MTYgMCAyMDggMjA4IDAgMSAwIDQxNiAwek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0xNzYtODBhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em0xMjggMzJhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptLTQ4IDgwYTY0IDY0IDAgMSAxIDAgMTI4IDY0IDY0IDAgMSAxIDAtMTI4eiJdCiAgICB9OwogICAgZmFTdXJwcmlzZSA9IGZhRmFjZVN1cnByaXNlOwogICAgZmFGb2xkZXIgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZm9sZGVyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MTkzLCAxMjg0NDcsIDYxNzE2LCAiZm9sZGVyLWJsYW5rIl0sICJmMDdiIiwgIk02NCA0MDBsMzg0IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMjQwYzAtOC44LTcuMi0xNi0xNi0xNmwtMTQ5LjMgMGMtMTcuMyAwLTM0LjItNS42LTQ4LTE2TDIxMi4zIDgzLjJjLTIuOC0yLjEtNi4xLTMuMi05LjYtMy4yTDY0IDgwYy04LjggMC0xNiA3LjItMTYgMTZsMCAyODhjMCA4LjggNy4yIDE2IDE2IDE2em0zODQgNDhMNjQgNDQ4Yy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDEzOC43IDBjMTMuOCAwIDI3LjMgNC41IDM4LjQgMTIuOGwzOC40IDI4LjhjNS41IDQuMiAxMi4zIDYuNCAxOS4yIDYuNEw0NDggODBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyNDBjMCAzNS4zLTI4LjcgNjQtNjQgNjR6Il0KICAgIH07CiAgICBmYUZvbGRlckJsYW5rID0gZmFGb2xkZXI7CiAgICBmYUNsb3VkID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNsb3VkIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbOTcyOV0sICJmMGMyIiwgIk04MCAxOTJjMC04OC40IDcxLjYtMTYwIDE2MC0xNjAgNDcuMSAwIDg5LjQgMjAuNCAxMTguNyA1Mi43IDEwLjYtMy4xIDIxLjgtNC43IDMzLjMtNC43IDY2LjMgMCAxMjAgNTMuNyAxMjAgMTIwIDAgMTMuMi0yLjEgMjUuOS02LjEgMzcuOCA0MS42IDIxLjEgNzAuMSA2NC4zIDcwLjEgMTE0LjIgMCA3MC43LTU3LjMgMTI4LTEyOCAxMjhsLTMwNCAwYy03OS41IDAtMTQ0LTY0LjUtMTQ0LTE0NCAwLTU2LjggMzIuOS0xMDUuOSA4MC43LTEyOS40LS40LTQuOC0uNy05LjctLjctMTQuNnpNMjQwIDgwYy02MS45IDAtMTEyIDUwLjEtMTEyIDExMiAwIDguNCAuOSAxNi42IDIuNyAyNC41IDIuNyAxMi4xLTQuMyAyNC4zLTE2LjEgMjguMS0zOC43IDEyLjQtNjYuNiA0OC43LTY2LjYgOTEuNCAwIDUzIDQzIDk2IDk2IDk2bDMwNCAwYzQ0LjIgMCA4MC0zNS44IDgwLTgwIDAtMzcuNC0yNS43LTY4LjktNjAuNS03Ny42LTcuNS0xLjktMTMuNi03LjItMTYuNS0xNC4zcy0yLjEtMTUuMiAyLTIxLjdjNy0xMS4xIDExLTI0LjIgMTEtMzguMyAwLTM5LjgtMzIuMi03Mi03Mi03Mi0xMS4xIDAtMjEuNSAyLjUtMzAuOCA2LjktMTAuNSA1LTIzLjEgMS43LTI5LjgtNy44LTIwLjMtMjguNi01My43LTQ3LjEtOTEuMy00Ny4xeiJdCiAgICB9OwogICAgZmFDaXJjbGUgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MzA4LCAxMjgzMDksIDEyODk5MiwgMTI4OTkzLCAxMjg5OTQsIDEyODk5NSwgMTI4OTk2LCA5Njc5LCA5ODk4LCA5ODk5LCAxMTA0NCwgNjE3MDgsIDYxOTE1XSwgImYxMTEiLCAiTTQ2NCAyNTZhMjA4IDIwOCAwIDEgMCAtNDE2IDAgMjA4IDIwOCAwIDEgMCA0MTYgMHpNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHoiXQogICAgfTsKICAgIGZhRmFjZUdyaW5TcXVpbnQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1ncmluLXNxdWludCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODUxOCwgImdyaW4tc3F1aW50Il0sICJmNTg1IiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDAgLTQxNiAwIDIwOCAyMDggMCAxIDAgNDE2IDB6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTM3Mi4yIDQ2LjNjMTEuOC0zLjYgMjMuNyA2LjEgMTkuNiAxNy44LTE5LjggNTUuOS03My4xIDk2LTEzNS44IDk2LTYyLjcgMC0xMTYtNDAtMTM1LjgtOTUuOS00LjEtMTEuNiA3LjgtMjEuNCAxOS42LTE3LjggMzQuNyAxMC42IDc0LjIgMTYuNSAxMTYuMSAxNi41IDQyIDAgODEuNS02IDExNi4zLTE2LjZ6bS0yNDkuNi0xNDNjNC41LTYuOCAxMy4zLTkuMiAyMC42LTUuNWw3OS42IDQwYzUuNCAyLjcgOC44IDguMiA4LjggMTQuM3MtMy40IDExLjYtOC44IDE0LjNsLTc5LjYgNDBjLTcuMyAzLjYtMTYuMSAxLjMtMjAuNi01LjVzLTMuMS0xNS45IDMuMS0yMS4xTDE1OSAyMDggMTI1LjggMTgwLjNjLTYuMi01LjItNy42LTE0LjMtMy4xLTIxLjF6bTI2My42IDIxLjFMMzUzIDIwOCAzODYuMiAyMzUuN2M2LjIgNS4yIDcuNiAxNC4zIDMuMSAyMS4xcy0xMy4zIDkuMi0yMC42IDUuNWwtNzkuNi00MGMtNS40LTIuNy04LjgtOC4yLTguOC0xNC4zczMuNC0xMS42IDguOC0xNC4zbDc5LjYtNDBjNy4zLTMuNiAxNi4xLTEuMyAyMC42IDUuNXMzLjEgMTUuOS0zLjEgMjEuMXoiXQogICAgfTsKICAgIGZhR3JpblNxdWludCA9IGZhRmFjZUdyaW5TcXVpbnQ7CiAgICBmYUNpcmNsZVVzZXIgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLXVzZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MjE0MiwgInVzZXItY2lyY2xlIl0sICJmMmJkIiwgIk00MDYuNSAzOTkuNkMzODcuNCAzNTIuOSAzNDEuNSAzMjAgMjg4IDMyMGwtNjQgMGMtNTMuNSAwLTk5LjQgMzIuOS0xMTguNSA3OS42LTM1LjYtMzcuMy01Ny41LTg3LjktNTcuNS0xNDMuNiAwLTExNC45IDkzLjEtMjA4IDIwOC0yMDhzMjA4IDkzLjEgMjA4IDIwOGMwIDU1LjctMjEuOSAxMDYuMi01Ny41IDE0My42em0tNDAuMSAzMi43QzMzNC40IDQ1Mi40IDI5Ni42IDQ2NCAyNTYgNDY0cy03OC40LTExLjYtMTEwLjUtMzEuN2M3LjMtMzYuNyAzOS43LTY0LjMgNzguNS02NC4zbDY0IDBjMzguOCAwIDcxLjIgMjcuNiA3OC41IDY0LjN6TTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyem0wLTI3MmE0MCA0MCAwIDEgMSAwLTgwIDQwIDQwIDAgMSAxIDAgODB6bS04OC00MGE4OCA4OCAwIDEgMCAxNzYgMCA4OCA4OCAwIDEgMCAtMTc2IDB6Il0KICAgIH07CiAgICBmYVVzZXJDaXJjbGUgPSBmYUNpcmNsZVVzZXI7CiAgICBmYVJlY3RhbmdsZUxpc3QgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAicmVjdGFuZ2xlLWxpc3QiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsibGlzdC1hbHQiXSwgImYwMjIiLCAiTTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMjU2YzAgOC44IDcuMiAxNiAxNiAxNmwzODQgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0yNTZjMC04LjgtNy4yLTE2LTE2LTE2TDY0IDExMnpNMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyNTZjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDQ4Yy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDEyOHpNMTYwIDMyMGEzMiAzMiAwIDEgMSAtNjQgMCAzMiAzMiAwIDEgMSA2NCAwem0tMzItOTZhMzIgMzIgMCAxIDEgMC02NCAzMiAzMiAwIDEgMSAwIDY0em0xMDQtNTZsMTYwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE2MCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0em0wIDEyOGwxNjAgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTYwIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYUxpc3RBbHQgPSBmYVJlY3RhbmdsZUxpc3Q7CiAgICBmYUhhbmQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiaGFuZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyOTMwNiwgOTk5NSwgImhhbmQtcGFwZXIiXSwgImYyNTYiLCAiTTI1Ni41IDBjLTI1LjMgMC00Ny4yIDE0LjctNTcuNiAzNi03LTIuNi0xNC41LTQtMjIuNC00LTM1LjMgMC02NCAyOC43LTY0IDY0bDAgMTY1LjUtMi43LTIuN2MtMjUtMjUtNjUuNS0yNS05MC41IDBzLTI1IDY1LjUgMCA5MC41TDEwNyA0MzdjNDggNDggMTEzLjEgNzUgMTgxIDc1bDE2LjUgMGMxLjUgMCAzLS4xIDQuNS0uNCA5MS43LTYuMiAxNjUtNzkuNCAxNzEuMS0xNzEuMSAuMy0xLjUgLjQtMyAuNC00LjVsMC0xNzZjMC0zNS4zLTI4LjctNjQtNjQtNjQtNS41IDAtMTAuOSAuNy0xNiAybDAtMmMwLTM1LjMtMjguNy02NC02NC02NC03LjkgMC0xNS40IDEuNC0yMi40IDQtMTAuNC0yMS4zLTMyLjMtMzYtNTcuNi0zNnptLTE2IDk2LjFsMC0uMSAwLTMyYzAtOC44IDcuMi0xNiAxNi0xNnMxNiA3LjIgMTYgMTZsMCAxNjhjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTEzNmMwLTguOCA3LjItMTYgMTYtMTZzMTYgNy4yIDE2IDE2bDAgMTM2YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC03MmMwLTguOCA3LjItMTYgMTYtMTZzMTYgNy4yIDE2IDE2bDAgMTcyLjljLS4xIC42LS4xIDEuMy0uMiAxLjktMy40IDY5LjctNTkuMyAxMjUuNi0xMjkgMTI5LS42IDAtMS4zIC4xLTEuOSAuMkwyODggNDY0QzIzMi45IDQ2NCAxODAgNDQyLjEgMTQxIDQwMy4xTDUzLjIgMzE1LjNjLTYuMi02LjItNi4yLTE2LjQgMC0yMi42czE2LjQtNi4yIDIyLjYgMGw0My43IDQzLjdjNi45IDYuOSAxNy4yIDguOSAyNi4yIDUuMnMxNC44LTEyLjUgMTQuOC0yMi4ybDAtMjIzLjRjMC04LjggNy4yLTE2IDE2LTE2IDguOCAwIDE2IDcuMSAxNiAxNS45bDAgMTM2LjFjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTEzNS45eiJdCiAgICB9OwogICAgZmFIYW5kUGFwZXIgPSBmYUhhbmQ7CiAgICBmYVRodW1ic1VwID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInRodW1icy11cCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODA3NywgNjE1NzVdLCAiZjE2NCIsICJNMTcxLjUgMzguOEMxOTIuMyA0IDIzNi41LTEwIDI3NCA3LjZsNy4yIDMuOEMzMTYgMzIuMyAzMzAgNzYuNSAzMTIuNCAxMTRsMCAwLTE0LjEgMzAgMTA5LjcgMCA3LjQgLjRjMzYuMyAzLjcgNjQuNiAzNC40IDY0LjYgNzEuNiAwIDEzLjItMy42IDI1LjQtOS44IDM2IDYuMSAxMC42IDkuNyAyMi44IDkuOCAzNiAwIDE4LjMtNi45IDM0LjgtMTggNDcuNSAxLjMgNS4zIDIgMTAuOCAyIDE2LjUgMCAyNS4xLTEyLjkgNDctMzIuMiA1OS45LTEuOSAzNS41LTI5LjQgNjQuMi02NC40IDY3LjdsLTcuNCAuNC0xMDQuMSAwYy0xOCAwLTM1LjktMy40LTUyLjYtOS45bC03LjEtMy0uNy0uMy02LjYtMy4yLS43LS4zLTEyLjItNi41Yy0xMi4zLTYuNS0yMy4zLTE0LjctMzIuOS0yNC4xLTQuMSAyNi45LTI3LjMgNDcuNC01NS4zIDQ3LjRsLTMyIDBjLTMwLjkgMC01Ni0yNS4xLTU2LTU2TDAgMjAwYzAtMzAuOSAyNS4xLTU2IDU2LTU2bDMyIDBjMTAuOCAwIDIwLjkgMy4xIDI5LjUgOC41bDUwLjEtMTA2LjUgLjYtMS4yIDIuNy01IC42LS45ek01NiAxOTJjLTQuNCAwLTggMy42LTggOGwwIDIyNGMwIDQuNCAzLjYgOCA4IDhsMzIgMGM0LjQgMCA4LTMuNiA4LThsMC0yMjRjMC00LjQtMy42LTgtOC04bC0zMiAwek0yNTMuNiA1MWMtMTQuOC02LjktMzIuMy0xLjYtNDAuNyAxMmwtMi4yIDQtNTYuOCAxMjAuOWMtMy41IDcuNS01LjUgMTUuNS02IDIzLjdsLS4xIDQuMiAwIDExMi45IC4yIDcuOWMyLjQgMzIuNyAyMS40IDYyLjEgNTAuNyA3Ny43bDExLjUgNi4xIDYuMyAzLjFjMTIuNCA1LjYgMjUuOCA4LjUgMzkuNCA4LjVsMTA0LjEgMCAyLjQtLjFjMTIuMS0xLjIgMjEuNi0xMS41IDIxLjYtMjMuOWwtLjItMi42Yy0uMS0uOS0uMi0xLjctLjQtMi42LTIuNy0xMi4xIDQuMy0yNC4yIDE2LTI4IDkuNy0zLjEgMTYuNi0xMi4yIDE2LjYtMjIuOCAwLTQuMy0xLjEtOC4yLTMuMS0xMS44LTYuMy0xMS4xLTIuOC0yNS4yIDgtMzIgNi44LTQuMyAxMS4yLTExLjggMTEuMi0yMC4yIDAtNy4xLTMuMS0xMy41LTguMi0xOC01LjItNC42LTguMi0xMS4xLTguMi0xOHMzLTEzLjQgOC4yLTE4YzUuMS00LjUgOC4yLTEwLjkgOC4yLTE4bC0uMS0yLjRjLTEuMS0xMS4zLTEwLjEtMjAuMy0yMS40LTIxLjRsLTIuNC0uMS0xNDcuNSAwYy04LjIgMC0xNS44LTQuMi0yMC4yLTExLjEtNC40LTYuOS01LTE1LjctMS41LTIzLjFMMjY5IDkzLjZjNy0xNSAxLjQtMzIuNy0xMi41LTQxTDI1My42IDUxeiJdCiAgICB9OwogICAgZmFCdWlsZGluZyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJidWlsZGluZyIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyNzk3MCwgNjE2ODddLCAiZjFhZCIsICJNNjQgNDhjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDM4NGMwIDguOCA3LjIgMTYgMTYgMTZsODAgMCAwLTgwYzAtMTcuNyAxNC4zLTMyIDMyLTMybDMyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA4MCA4MCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTM4NGMwLTguOC03LjItMTYtMTYtMTZMNjQgNDh6TTAgNjRDMCAyOC43IDI4LjcgMCA2NCAwTDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzg0YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA2NHptOTYgNDhjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMnpNMjQwIDk2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZ6TTk2IDI0MGMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyem0xNDQtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNnoiXQogICAgfTsKICAgIGZhQ2hlc3NSb29rID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNoZXNzLXJvb2siLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFs5ODIwXSwgImY0NDciLCAiTTM1MiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTM4LjdjMCAxMy44LTQuNSAyNy4zLTEyLjggMzguNGwtMzUuMiA0Ni45IDAgMTEyIDQwLjggNjguMWM0LjcgNy44IDcuMiAxNi43IDcuMiAyNS44IDAgMjcuNy0yMi40IDUwLjEtNTAuMSA1MC4xTDUwLjEgNTEyYy0yNy43IDAtNTAuMS0yMi40LTUwLjEtNTAuMSAwLTkuMSAyLjUtMTggNy4yLTI1LjhMNDggMzY4IDQ4IDI1NiAxMi44IDIwOS4xQzQuNSAxOTggMCAxODQuNSAwIDE3MC43TDAgMzJDMCAxNC4zIDE0LjMgMCAzMiAwTDM1MiAwek00OC4zIDQ2MC44bC0uMyAxLjFjMCAxLjIgMSAyLjEgMi4xIDIuMWwyODMuOCAwYzEuMiAwIDIuMS0xIDIuMS0yLjFsLS4zLTEuMS0zNi41LTYwLjgtMjE0LjQgMC0zNi41IDYwLjh6TTQ4IDE3MC43YzAgMi42IC42IDUuMSAxLjggNy40bDEuNCAyLjIgMCAwIDM1LjIgNDYuOSA5LjYgMTIuOCAwIDExMiAxOTIgMCAwLTExMiA5LjYtMTIuOCAzNS4yLTQ2LjkgMCAwIDEuNC0yLjJjMS4yLTIuMyAxLjgtNC44IDEuOC03LjRsMC0xMjIuNy02NCAwIDAgMjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0yNC02NCAwIDAgMjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0yNC02NCAwIDAgMTIyLjd6Il0KICAgIH07CiAgICBmYUNpcmNsZVF1ZXN0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1xdWVzdGlvbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYyMTA4LCAicXVlc3Rpb24tY2lyY2xlIl0sICJmMDU5IiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDAgLTQxNiAwIDIwOCAyMDggMCAxIDAgNDE2IDB6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTI1Ni04MGMtMTcuNyAwLTMyIDE0LjMtMzIgMzIgMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRjMC00NC4yIDM1LjgtODAgODAtODBzODAgMzUuOCA4MCA4MGMwIDQ3LjItMzYgNjcuMi01NiA3NC41bDAgMy44YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtOC4xYzAtMjAuNSAxNC44LTM1LjIgMzAuMS00MC4yIDYuNC0yLjEgMTMuMi01LjUgMTguMi0xMC4zIDQuMy00LjIgNy43LTEwIDcuNy0xOS42IDAtMTcuNy0xNC4zLTMyLTMyLTMyek0yMjQgMzY4YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6Il0KICAgIH07CiAgICBmYVF1ZXN0aW9uQ2lyY2xlID0gZmFDaXJjbGVRdWVzdGlvbjsKICAgIGZhRmlsZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4MTk2LCAxMjg0NTksIDYxNDYyXSwgImYxNWIiLCAiTTE3NiA0OEw2NCA0OGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzg0YzAgOC44IDcuMiAxNiAxNiAxNmwyNTYgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0yNDAtODggMGMtMzkuOCAwLTcyLTMyLjItNzItNzJsMC04OHpNMzE2LjEgMTYwTDIyNCA2Ny45IDIyNCAxMzZjMCAxMy4zIDEwLjcgMjQgMjQgMjRsNjguMSAwek0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwxOTcuNSAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDM2NS4zIDE0MS4zYzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNMMzg0IDQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6Il0KICAgIH07CiAgICBmYUZhY2VTYWRDcnkgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1zYWQtY3J5IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTU3LCAic2FkLWNyeSJdLCAiZjViMyIsICJNNDAwIDQwNi4xTDQwMCAyODhjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAxNTIuNmMtMjguNyAxNS02MS40IDIzLjQtOTYgMjMuNHMtNjcuMy04LjUtOTYtMjMuNEwxNjAgMjg4YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTE4LjFDNzIuNiAzNjguMiA0OCAzMTUgNDggMjU2IDQ4IDE0MS4xIDE0MS4xIDQ4IDI1NiA0OHMyMDggOTMuMSAyMDggMjA4YzAgNTktMjQuNiAxMTIuMi02NCAxNTAuMXpNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTE1MiAxOTZsMTYgMGMxMSAwIDIwIDkgMjAgMjBzOSAyMCAyMCAyMCAyMC05IDIwLTIwYzAtMzMuMS0yNi45LTYwLTYwLTYwbC0xNiAwYy0zMy4xIDAtNjAgMjYuOS02MCA2MCAwIDExIDkgMjAgMjAgMjBzMjAtOSAyMC0yMCA5LTIwIDIwLTIwem0xNzIgMjBjMC0xMSA5LTIwIDIwLTIwbDE2IDBjMTEgMCAyMCA5IDIwIDIwczkgMjAgMjAgMjAgMjAtOSAyMC0yMGMwLTMzLjEtMjYuOS02MC02MC02MGwtMTYgMGMtMzMuMSAwLTYwIDI2LjktNjAgNjAgMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjB6TTIwOCAzMzZsMCAzMmMwIDI2LjUgMjEuNSA0OCA0OCA0OHM0OC0yMS41IDQ4LTQ4bDAtMzJjMC0yNi41LTIxLjUtNDgtNDgtNDhzLTQ4IDIxLjUtNDggNDh6Il0KICAgIH07CiAgICBmYVNhZENyeSA9IGZhRmFjZVNhZENyeTsKICAgIGZhQ2FsZW5kYXJNaW51cyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjYWxlbmRhci1taW51cyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMjcyIiwgIk0xMjAgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDQwIDE2MCAwIDAtNDBjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDQwIDMyIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyODhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGwzMiAwIDAtNDBjMC0xMy4zIDEwLjctMjQgMjQtMjR6bTAgMTEybC01NiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAyODhjMCA4LjggNy4yIDE2IDE2IDE2bDMyMCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTI4OGMwLTguOC03LjItMTYtMTYtMTZsLTI2NCAwem0zMiAxMzZsMTQ0IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE0NCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFGYWNlVGlyZWQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS10aXJlZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU1NSwgInRpcmVkIl0sICJmNWM4IiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDAgLTQxNiAwIDIwOCAyMDggMCAxIDAgNDE2IDB6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTE3Ni41IDY0LjNDMTk2LjEgMzAyLjEgMjIzLjggMjg4IDI1NiAyODhzNTkuOSAxNC4xIDc5LjUgMzIuM2MxOSAxNy44IDMyLjUgNDEuNyAzMi41IDYzLjcgMCA1LjQtMi43IDEwLjQtNy4yIDEzLjRzLTEwLjIgMy40LTE1LjIgMS4zbC0xNy4yLTcuNWMtMjIuOC0xMC00Ny41LTE1LjEtNzIuNC0xNS4xcy00OS42IDUuMi03Mi40IDE1LjFsLTE3LjIgNy41Yy00LjkgMi4yLTEwLjcgMS43LTE1LjItMS4zcy03LjItOC03LjItMTMuNGMwLTIyIDEzLjUtNDUuOSAzMi41LTYzLjd6TTEyMi42IDE1OS4yYzQuNS02LjggMTMuMy05LjIgMjAuNi01LjVsNzkuNiA0MGM1LjQgMi43IDguOCA4LjIgOC44IDE0LjNzLTMuNCAxMS42LTguOCAxNC4zbC03OS42IDQwYy03LjMgMy42LTE2LjEgMS4zLTIwLjYtNS41cy0zLjEtMTUuOSAzLjEtMjEuMUwxNTkgMjA4IDEyNS44IDE4MC4zYy02LjItNS4yLTcuNi0xNC4zLTMuMS0yMS4xem0yNjMuNiAyMS4xTDM1MyAyMDggMzg2LjIgMjM1LjdjNi4yIDUuMiA3LjYgMTQuMyAzLjEgMjEuMXMtMTMuMyA5LjItMjAuNiA1LjVsLTc5LjYtNDBjLTUuNC0yLjctOC44LTguMi04LjgtMTQuM3MzLjQtMTEuNiA4LjgtMTQuM2w3OS42LTQwYzcuMy0zLjYgMTYuMS0xLjMgMjAuNiA1LjVzMy4xIDE1LjktMy4xIDIxLjF6Il0KICAgIH07CiAgICBmYVRpcmVkID0gZmFGYWNlVGlyZWQ7CiAgICBmYUhhbmRQb2ludFJpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImhhbmQtcG9pbnQtcmlnaHQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjBhNCIsICJNNDQ4IDEyOGwtMTc3LjYgMGMxIDUuMiAxLjYgMTAuNSAxLjYgMTZsMCAxNiAxNzYgMGM4LjggMCAxNi03LjIgMTYtMTZzLTcuMi0xNi0xNi0xNnpNMjI0IDE0NGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtMjQgMGMtNjYuMyAwLTEyMCA1My43LTEyMCAxMjBsMCA0OGMwIDUyLjUgMzMuNyA5Ny4xIDgwLjcgMTEzLjQtLjUtMy4xLS43LTYuMi0uNy05LjQgMC0yMCA5LjItMzcuOSAyMy42LTQ5LjctNC45LTktNy42LTE5LjQtNy42LTMwLjMgMC0xNS4xIDUuMy0yOSAxNC00MC04LjgtMTEtMTQtMjQuOS0xNC00MGwwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA0MGMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtODB6TTE5MiA2NGwwIDBjMTggMCAzNC42IDYgNDggMTZsMjA4IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRzLTI4LjcgNjQtNjQgNjRsLTgyIDBjMS4zIDUuMSAyIDEwLjUgMiAxNiAwIDI1LjMtMTQuNyA0Ny4yLTM2IDU3LjYgMi42IDcgNCAxNC41IDQgMjIuNCAwIDIwLTkuMiAzNy45LTIzLjYgNDkuNyA0LjkgOSA3LjYgMTkuNCA3LjYgMzAuMyAwIDM1LjMtMjguNyA2NC02NCA2NGwtODggMEM3NS4yIDQ0OCAwIDM3Mi44IDAgMjgwbDAtNDhDMCAxMzkuMiA3NS4yIDY0IDE2OCA2NGwyNCAwem02NCAzMzZjOC44IDAgMTYtNy4yIDE2LTE2cy03LjItMTYtMTYtMTZsLTY0IDBjLTguOCAwLTE2IDcuMi0xNiAxNnM3LjIgMTYgMTYgMTZsNjQgMHptMTYtMTc2YzAgNS41LS43IDEwLjktMiAxNmwzNCAwYzguOCAwIDE2LTcuMiAxNi0xNnMtNy4yLTE2LTE2LTE2bC0zMiAwIDAgMTZ6bS0yNCA2NGwtNDAgMGMtOC44IDAtMTYgNy4yLTE2IDE2czcuMiAxNiAxNiAxNmw2NCAwYzguOCAwIDE2LTcuMiAxNi0xNnMtNy4yLTE2LTE2LTE2bC0yNCAweiJdCiAgICB9OwogICAgZmFDaXJjbGVVcCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtdXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MTQ2NywgImFycm93LWFsdC1jaXJjbGUtdXAiXSwgImYzNWIiLCAiTTI1NiA0OGEyMDggMjA4IDAgMSAxIDAgNDE2IDIwOCAyMDggMCAxIDEgMC00MTZ6bTAgNDY0YTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnptMTEuMy0zODcuM2MtNi4yLTYuMi0xNi40LTYuMi0yMi42IDBsLTEwNCAxMDRjLTQuNiA0LjYtNS45IDExLjUtMy41IDE3LjRzOC4zIDkuOSAxNC44IDkuOWw3MiAwIDAgMTA0YzAgMTMuMyAxMC43IDI0IDI0IDI0bDE2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC0xMDQgNzIgMGM2LjUgMCAxMi4zLTMuOSAxNC44LTkuOXMxLjEtMTIuOS0zLjUtMTcuNGwtMTA0LTEwNHoiXQogICAgfTsKICAgIGZhQXJyb3dBbHRDaXJjbGVVcCA9IGZhQ2lyY2xlVXA7CiAgICBmYUhhbmRTY2lzc29ycyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kLXNjaXNzb3JzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyNTciLCAiTS4yIDI3Ni4zYy0xLjItMzUuMyAyNi40LTY1IDYxLjctNjYuMmwzLjMtLjEtOC4yLTEuOEMyMi41IDIwMC41IC43IDE2Ni4zIDguMyAxMzEuOFM1MC4yIDc1LjUgODQuNyA4My4ybDE3MyAzOC4zYzIuMy0yLjkgNC42LTUuNyA3LjEtOC41bDE4LjQtMjAuM0MyOTkuOSA3NC41IDMyMy41IDY0IDM0OC4zIDY0bDEwLjIgMGM1NC4xIDAgMTA0LjEgMjguNyAxMzEuMyA3NS40bDEuNSAyLjZjMTMuNiAyMy4yIDIwLjcgNDkuNyAyMC43IDc2LjZMNTEyIDM0NGMwIDY2LjMtNTMuNyAxMjAtMTIwIDEyMGwtMTA0IDBjLTM1LjMgMC02NC0yOC43LTY0LTY0IDAtMi44IC4yLTUuNiAuNS04LjMtMTkuNC0xMS0zMi41LTMxLjgtMzIuNS01NS43IDAtLjggMC0xLjYgMC0yLjRMNjYuNCAzMzhjLTM1LjMgMS4yLTY1LTI2LjQtNjYuMi02MS43em02My40LTE4LjJjLTguOCAuMy0xNS43IDcuNy0xNS40IDE2LjZzNy43IDE1LjcgMTYuNSAxNS40bDE2MS41LTUuNmM5LjgtLjMgMTguNyA1LjMgMjIuNyAxNC4yczIuMiAxOS4zLTQuNSAyNi40Yy0yLjggMi45LTQuNCA2LjctNC40IDExIDAgOC44IDcuMiAxNiAxNiAxNiA5LjEgMCAxNy40IDUuMSAyMS41IDEzLjNzMy4yIDE3LjktMi4zIDI1LjFjLTIgMi43LTMuMiA2LTMuMiA5LjYgMCA4LjggNy4yIDE2IDE2IDE2bDEwNCAwYzM5LjggMCA3Mi0zMi4yIDcyLTcybDAtMTI1LjRjMC0xOC40LTQuOS0zNi41LTE0LjItNTIuNGwtMS41LTIuNmMtMTguNi0zMi01Mi44LTUxLjYtODkuOC01MS42bC0xMC4yIDBjLTExLjMgMC0yMiA0LjgtMjkuNiAxMy4xbDAgMC0xOC40IDIwLjNjLS42IC42LTEuMSAxLjMtMS43IDEuOWw1NyAxMy4yYzguNiAyIDE0IDEwLjYgMTIgMTkuMnMtMTAuNiAxNC0xOS4yIDEyTDI2Mi44IDE3MS44IDc0LjMgMTMwYy04LjYtMS45LTE3LjIgMy41LTE5LjEgMTIuMnMzLjUgMTcuMiAxMi4yIDE5LjFsMTg3LjUgNDEuNmMxMC4yIDIuMyAxNy44IDEwLjkgMTguNyAyMS40bC4xIDFjLjYgNi42LTEuNSAxMy4xLTUuOCAxOC4xcy0xMC42IDcuOS0xNy4yIDguMkw2My42IDI1OC4xeiJdCiAgICB9OwogICAgZmFHZW0gPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZ2VtIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MTQyXSwgImYzYTUiLCAiTTE2OC41IDcybDg3LjUgOTMgODcuNS05My0xNzUgMHpNMzgzLjkgOTkuMWwtNzIuMyA3Ni45IDEyOSAwLTU2LjYtNzYuOXptNTAgMTI0LjlMNzguMSAyMjQgMjU2IDQyMC4zIDQzMy45IDIyNHpNNzEuNSAxNzZsMTI5IDAtNzIuMy03Ni45LTU2LjYgNzYuOXptNDM0LjMgNDAuMWwtMjMyIDI1NmMtNC41IDUtMTEgNy45LTE3LjggNy45cy0xMy4yLTIuOS0xNy44LTcuOWwtMjMyLTI1NmMtNy43LTguNS04LjMtMjEuMi0xLjUtMzAuNGwxMTItMTUyYzQuNS02LjEgMTEuNy05LjggMTkuMy05LjhsMjQwIDBjNy42IDAgMTQuOCAzLjYgMTkuMyA5LjhsMTEyIDE1MmM2LjggOS4yIDYuMSAyMS45LTEuNSAzMC40eiJdCiAgICB9OwogICAgZmFSZWN0YW5nbGVYbWFyayA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJyZWN0YW5nbGUteG1hcmsiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MjE2NCwgInJlY3RhbmdsZS10aW1lcyIsICJ0aW1lcy1yZWN0YW5nbGUiLCAid2luZG93LWNsb3NlIl0sICJmNDEwIiwgIk02NCAxMTJjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDI1NmMwIDguOCA3LjIgMTYgMTYgMTZsMzg0IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMjU2YzAtOC44LTcuMi0xNi0xNi0xNkw2NCAxMTJ6TTAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjU2YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjh6bTMzNC4xIDQ5LjljOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlsLTQ0LjEgNDQuMSA0NC4xIDQ0LjFjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtNDQuMS00NC4xLTQ0LjEgNDQuMWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWw0NC4xLTQ0LjEtNDQuMS00NC4xYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBsNDQuMSA0NC4xIDQ0LjEtNDQuMWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHoiXQogICAgfTsKICAgIGZhUmVjdGFuZ2xlVGltZXMgPSBmYVJlY3RhbmdsZVhtYXJrOwogICAgZmFUaW1lc1JlY3RhbmdsZSA9IGZhUmVjdGFuZ2xlWG1hcms7CiAgICBmYVdpbmRvd0Nsb3NlID0gZmFSZWN0YW5nbGVYbWFyazsKICAgIGZhVHJhc2hDYW4gPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAidHJhc2gtY2FuIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbNjE0NjAsICJ0cmFzaC1hbHQiXSwgImYyZWQiLCAiTTE2Ni4yLTE2Yy0xMy4zIDAtMjUuMyA4LjMtMzAgMjAuOEwxMjAgNDggMjQgNDhDMTAuNyA0OCAwIDU4LjcgMCA3MlMxMC43IDk2IDI0IDk2bDQwMCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC05NiAwLTE2LjItNDMuMkMzMDcuMS03LjcgMjk1LjItMTYgMjgxLjgtMTZMMTY2LjItMTZ6TTMyIDE0NGwwIDMwNGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMwNC00OCAwIDAgMzA0YzAgOC44LTcuMiAxNi0xNiAxNkw5NiA0NjRjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMwNC00OCAwem0xNjAgNzJjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAxNzZjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTE3NnptMTEyIDBjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAxNzZjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTE3NnoiXQogICAgfTsKICAgIGZhVHJhc2hBbHQgPSBmYVRyYXNoQ2FuOwogICAgZmFMaWZlUmluZyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJsaWZlLXJpbmciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjFjZCIsICJNMzg1LjEgNDE5LjFDMzQ5LjcgNDQ3LjIgMzA0LjggNDY0IDI1NiA0NjRzLTkzLjctMTYuOC0xMjkuMS00NC45bDgwLjQtODAuNGMxNC4zIDguNCAzMSAxMy4zIDQ4LjggMTMuM3MzNC41LTQuOCA0OC44LTEzLjNsODAuNCA4MC40em02OC4xIC4yQzQ4OS45IDM3NC45IDUxMiAzMTguMSA1MTIgMjU2UzQ4OS45IDEzNy4xIDQ1My4yIDkyLjdMNDY1IDgxYzkuNC05LjQgOS40LTI0LjYgMC0zMy45cy0yNC42LTkuNC0zMy45IDBMNDE5LjMgNTguOEMzNzQuOSAyMi4xIDMxOC4xIDAgMjU2IDBTMTM3LjEgMjIuMSA5Mi43IDU4LjhMODEgNDdjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwUzM3LjcgNzEuNiA0NyA4MUw1OC44IDkyLjdDMjIuMSAxMzcuMSAwIDE5My45IDAgMjU2UzIyLjEgMzc0LjkgNTguOCA0MTkuM0w0NyA0MzFjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMGwxMS44LTExLjhDMTM3LjEgNDg5LjkgMTkzLjkgNTEyIDI1NiA1MTJzMTE4LjktMjIuMSAxNjMuMy01OC44TDQzMSA0NjVjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC0xMS44LTExLjh6bS0zNC4xLTM0LjFsLTgwLjQtODAuNGM4LjQtMTQuMyAxMy4zLTMxIDEzLjMtNDguOHMtNC44LTM0LjUtMTMuMy00OC44bDgwLjQtODAuNEM0NDcuMiAxNjIuMyA0NjQgMjA3LjIgNDY0IDI1NnMtMTYuOCA5My43LTQ0LjkgMTI5LjF6TTM4NS4xIDkyLjlsLTgwLjQgODAuNGMtMTQuMy04LjQtMzEtMTMuMy00OC44LTEzLjNzLTM0LjUgNC44LTQ4LjggMTMuM0wxMjYuOSA5Mi45QzE2Mi4zIDY0LjggMjA3LjIgNDggMjU2IDQ4czkzLjcgMTYuOCAxMjkuMSA0NC45ek0xNzMuMyAzMDQuOEw5Mi45IDM4NS4xQzY0LjggMzQ5LjcgNDggMzA0LjggNDggMjU2czE2LjgtOTMuNyA0NC45LTEyOS4xbDgwLjQgODAuNGMtOC40IDE0LjMtMTMuMyAzMS0xMy4zIDQ4LjhzNC44IDM0LjUgMTMuMyA0OC44ek0yMDggMjU2YTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6Il0KICAgIH07CiAgICBmYUNvcHlyaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjb3B5cmlnaHQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxNjldLCAiZjFmOSIsICJNMjU2IDQ4YTIwOCAyMDggMCAxIDEgMCA0MTYgMjA4IDIwOCAwIDEgMSAwLTQxNnptMCA0NjRhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0yMDUuMSAzMDYuOWMtMjguMS0yOC4xLTI4LjEtNzMuNyAwLTEwMS44czczLjctMjguMSAxMDEuOCAwYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWMtNDYuOS00Ni45LTEyMi44LTQ2LjktMTY5LjcgMHMtNDYuOSAxMjIuOCAwIDE2OS43IDEyMi44IDQ2LjkgMTY5LjcgMGM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwYy0yOC4xIDI4LjEtNzMuNyAyOC4xLTEwMS44IDB6Il0KICAgIH07CiAgICBmYUNpcmNsZUxlZnQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLWxlZnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MTg0MCwgImFycm93LWFsdC1jaXJjbGUtbGVmdCJdLCAiZjM1OSIsICJNNDggMjU2YTIwOCAyMDggMCAxIDEgNDE2IDAgMjA4IDIwOCAwIDEgMSAtNDE2IDB6bTQ2NCAwYTI1NiAyNTYgMCAxIDAgLTUxMiAwIDI1NiAyNTYgMCAxIDAgNTEyIDB6TTEyNC43IDI0NC43Yy02LjIgNi4yLTYuMiAxNi40IDAgMjIuNmwxMDQgMTA0YzQuNiA0LjYgMTEuNSA1LjkgMTcuNCAzLjVzOS45LTguMyA5LjktMTQuOGwwLTcyIDEwNCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtMTZjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTEwNCAwIDAtNzJjMC02LjUtMy45LTEyLjMtOS45LTE0LjhzLTEyLjktMS4xLTE3LjQgMy41bC0xMDQgMTA0eiJdCiAgICB9OwogICAgZmFBcnJvd0FsdENpcmNsZUxlZnQgPSBmYUNpcmNsZUxlZnQ7CiAgICBmYUNhbGVuZGFyID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNhbGVuZGFyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI4MTk3LCAxMjgxOThdLCAiZjEzMyIsICJNMTIwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA0MCAxNjAgMCAwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA0MCAzMiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjg4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsMzIgMCAwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0em0wIDExMmwtNTYgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgNDggMzUyIDAgMC00OGMwLTguOC03LjItMTYtMTYtMTZsLTI2NCAwek00OCAyMjRsMCAxOTJjMCA4LjggNy4yIDE2IDE2IDE2bDMyMCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTE5Mi0zNTIgMHoiXQogICAgfTsKICAgIGZhRmFjZUZyb3duT3BlbiA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWZyb3duLW9wZW4iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1NTAsICJmcm93bi1vcGVuIl0sICJmNTdhIiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDAgLTQxNiAwIDIwOCAyMDggMCAxIDAgNDE2IDB6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6TTE4Mi40IDM4Mi41Yy0xMi40IDUuMi0yNi41LTQuMS0yMS4xLTE2LjQgMTYtMzYuNiA1Mi40LTYyLjEgOTQuOC02Mi4xczc4LjggMjUuNiA5NC44IDYyLjFjNS40IDEyLjMtOC43IDIxLjYtMjEuMSAxNi40LTIyLjQtOS41LTQ3LjQtMTQuOC03My43LTE0LjhzLTUxLjMgNS4zLTczLjcgMTQuOHpNMTQ0IDIwOGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0xOTItMzJhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFGcm93bk9wZW4gPSBmYUZhY2VGcm93bk9wZW47CiAgICBmYUNoYXJ0QmFyID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNoYXJ0LWJhciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJiYXItY2hhcnQiXSwgImYwODAiLCAiTTQ4IDU2YzAtMTMuMy0xMC43LTI0LTI0LTI0UzAgNDIuNyAwIDU2TDAgNDAwYzAgNDQuMiAzNS44IDgwIDgwIDgwbDQwOCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0TDgwIDQzMmMtMTcuNyAwLTMyLTE0LjMtMzItMzJMNDggNTZ6bTEwNCA3MmwyMDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNEwxNTIgODBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjR6bTAgNjRjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTQ0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE0NCAwem0wIDExMmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwyNzIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMjcyIDB6Il0KICAgIH07CiAgICBmYUJhckNoYXJ0ID0gZmFDaGFydEJhcjsKICAgIGZhSG91c2UgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiaG91c2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjc5NjgsIDYzNDk4LCA2MzUwMCwgImhvbWUiLCAiaG9tZS1hbHQiLCAiaG9tZS1sZy1hbHQiXSwgImYwMTUiLCAiTTI0MCA2LjFjOS4xLTguMiAyMi45LTguMiAzMiAwbDIzMiAyMDhjOS45IDguOCAxMC43IDI0IDEuOCAzMy45cy0yNCAxMC43LTMzLjkgMS44bC04LTcuMiAwIDIwNS4zYzAgMzUuMy0yOC43IDY0LTY0IDY0bC0yODggMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0yMDUuMy04IDcuMmMtOS45IDguOC0yNSA4LTMzLjktMS44cy04LTI1IDEuOC0zMy45TDI0MCA2LjF6bTE2IDUwLjFMOTYgMTk5LjcgOTYgNDQ4YzAgOC44IDcuMiAxNiAxNiAxNmw0OCAwIDAtMTA0YzAtMzkuOCAzMi4yLTcyIDcyLTcybDQ4IDBjMzkuOCAwIDcyIDMyLjIgNzIgNzJsMCAxMDQgNDggMGM4LjggMCAxNi03LjIgMTYtMTZsMC0yNDguMy0xNjAtMTQzLjR6TTIwOCA0NjRsOTYgMCAwLTEwNGMwLTEzLjMtMTAuNy0yNC0yNC0yNGwtNDggMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAxMDR6Il0KICAgIH07CiAgICBmYUhvbWUgPSBmYUhvdXNlOwogICAgZmFIb21lQWx0ID0gZmFIb3VzZTsKICAgIGZhSG9tZUxnQWx0ID0gZmFIb3VzZTsKICAgIGZhRmFjZUZyb3duID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2UtZnJvd24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5Nzg1LCAiZnJvd24iXSwgImYxMTkiLCAiTTQ2NCAyNTZhMjA4IDIwOCAwIDEgMCAtNDE2IDAgMjA4IDIwOCAwIDEgMCA0MTYgMHpNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHpNMzM0LjcgMzg0LjZDMzE5LjcgMzY5IDI5My42IDM1MiAyNTYgMzUycy02My43IDE3LTc4LjcgMzIuNmMtOS4yIDkuNi0yNC40IDkuOS0zMy45IC43cy05LjktMjQuNC0uNy0zMy45YzIyLjEtMjMgNjAtNDcuNCAxMTMuMy00Ny40czkxLjIgMjQuNCAxMTMuMyA0Ny40YzkuMiA5LjYgOC45IDI0LjgtLjcgMzMuOXMtMjQuOCA4LjktMzMuOS0uN3pNMTQ0IDIwOGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0xOTItMzJhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFGcm93biA9IGZhRmFjZUZyb3duOwogICAgZmFVc2VyID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInVzZXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjgxMDAsIDYyMTQ0LCA2MjQ3MCwgInVzZXItYWx0IiwgInVzZXItbGFyZ2UiXSwgImYwMDciLCAiTTE0NCAxMjhhODAgODAgMCAxIDEgMTYwIDAgODAgODAgMCAxIDEgLTE2MCAwem0yMDggMGExMjggMTI4IDAgMSAwIC0yNTYgMCAxMjggMTI4IDAgMSAwIDI1NiAwek00OCA0ODBjMC03MC43IDU3LjMtMTI4IDEyOC0xMjhsOTYgMGM3MC43IDAgMTI4IDU3LjMgMTI4IDEyOGwwIDhjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLThjMC05Ny4yLTc4LjgtMTc2LTE3Ni0xNzZsLTk2IDBDNzguOCAzMDQgMCAzODIuOCAwIDQ4MGwwIDhjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTh6Il0KICAgIH07CiAgICBmYVVzZXJBbHQgPSBmYVVzZXI7CiAgICBmYVVzZXJMYXJnZSA9IGZhVXNlcjsKICAgIGZhU25vd2ZsYWtlID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInNub3dmbGFrZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEwMDUyLCAxMDA1NF0sICJmMmRjIiwgIk0yODAuMS04YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgNzguMS0yMy0yM2MtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWw1NyA1NyAwIDc2LjUtNjYuMi0zOC4yLTIwLjktNzcuOGMtMy40LTEyLjgtMTYuNi0yMC40LTI5LjQtMTdTOTUuMiA5OCA5OC43IDExMC44bDguNCAzMS41LTY3LjYtMzlDMjggOTYuNiAxMy4zIDEwMC41IDYuNyAxMTJTNCAxMzguMiAxNS41IDE0NC44bDY3LjYgMzktMzEuNSA4LjRjLTEyLjggMy40LTIwLjQgMTYuNi0xNyAyOS40czE2LjYgMjAuNCAyOS40IDE3bDc3LjgtMjAuOSA2Ni4yIDM4LjItNjYuMiAzOC4yLTc3LjgtMjAuOWMtMTIuOC0zLjQtMjYgNC4yLTI5LjQgMTdzNC4yIDI2IDE3IDI5LjRsMzEuNSA4LjQtNjcuNiAzOUM0IDM3My44IC4xIDM4OC41IDYuNyA0MDBzMjEuMyAxNS40IDMyLjggOC44bDY3LjYtMzktOC40IDMxLjVjLTMuNCAxMi44IDQuMiAyNiAxNyAyOS40czI2LTQuMiAyOS40LTE3bDIwLjktNzcuOCA2Ni4yLTM4LjIgMCA3Ni41LTU3IDU3Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBsMjMtMjMgMCA3OC4xYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC03OC4xIDIzIDIzYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNTctNTcgMC03Ni41IDY2LjIgMzguMiAyMC45IDc3LjhjMy40IDEyLjggMTYuNiAyMC40IDI5LjQgMTdzMjAuNC0xNi42IDE3LTI5LjRsLTguNC0zMS41IDY3LjYgMzljMTEuNSA2LjYgMjYuMiAyLjcgMzIuOC04LjhzMi43LTI2LjItOC44LTMyLjhsLTY3LjYtMzkgMzEuNS04LjRjMTIuOC0zLjQgMjAuNC0xNi42IDE3LTI5LjRzLTE2LjYtMjAuNC0yOS40LTE3bC03Ny44IDIwLjktNjYuMi0zOC4yIDY2LjItMzguMiA3Ny44IDIwLjljMTIuOCAzLjQgMjYtNC4yIDI5LjQtMTdzLTQuMi0yNi0xNy0yOS40bC0zMS41LTguNCA2Ny42LTM5YzExLjUtNi42IDE1LjQtMjEuMyA4LjgtMzIuOHMtMjEuMy0xNS40LTMyLjgtOC44bC02Ny42IDM5IDguNC0zMS41YzMuNC0xMi44LTQuMi0yNi0xNy0yOS40cy0yNiA0LjItMjkuNCAxN2wtMjAuOSA3Ny44LTY2LjIgMzguMiAwLTc2LjUgNTctNTdjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMGwtMjMgMjMgMC03OC4xeiJdCiAgICB9OwogICAgZmFCb29rbWFyayA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJib29rbWFyayIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyODI3OCwgNjE1OTFdLCAiZjAyZSIsICJNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMMzIwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCA0MTcuMWMwIDI1LjYtMjguNSA0MC44LTQ5LjggMjYuNkwxOTIgNDEyLjggNDkuOCA1MDcuN0MyOC41IDUyMS45IDAgNTA2LjYgMCA0ODEuMUwwIDY0ek02NCA0OGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzg3LjIgMTE3LjQtNzguMmMxNi4xLTEwLjcgMzcuMS0xMC43IDUzLjIgMEwzMzYgNDUxLjIgMzM2IDY0YzAtOC44LTcuMi0xNi0xNi0xNkw2NCA0OHoiXQogICAgfTsKICAgIGZhU3F1YXJlQ2FyZXRMZWZ0ID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1jYXJldC1sZWZ0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImNhcmV0LXNxdWFyZS1sZWZ0Il0sICJmMTkxIiwgIk00OCA0MTZjMCA4LjggNy4yIDE2IDE2IDE2bDMyMCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyMGMwLTguOC03LjItMTYtMTYtMTZMNjQgODBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyMHptMTYgNjRjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMzIwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwem02NC0yMjRjMC02LjcgMi44LTEzIDcuNy0xNy42bDExMi0xMDRjNy02LjUgMTcuMi04LjIgMjUuOS00LjRTMjg4IDE0Mi41IDI4OCAxNTJsMCAyMDhjMCA5LjUtNS43IDE4LjItMTQuNCAyMnMtMTguOSAyLjEtMjUuOS00LjRsLTExMi0xMDRjLTQuOS00LjUtNy43LTEwLjktNy43LTE3LjZ6Il0KICAgIH07CiAgICBmYUNhcmV0U3F1YXJlTGVmdCA9IGZhU3F1YXJlQ2FyZXRMZWZ0OwogICAgZmFIYW5kc2hha2UgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiaGFuZHNoYWtlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI5MzA5LCA2MjY2MiwgImhhbmRzaGFrZS1hbHQiLCAiaGFuZHNoYWtlLXNpbXBsZSJdLCAiZjJiNSIsICJNNTk4LjEgNzUuNGMxMC43LTcuOCAxMy4xLTIyLjggNS4zLTMzLjVzLTIyLjgtMTMuMS0zMy41LTUuM2wtNzQuNSA1NC4yLTkuOS02LjZDNDY1LjggNzEgNDQyLjYgNjQgNDE4LjkgNjRsLTU5LjIgMC0uNCAwLTE0My42IDBjLTI2LjcgMC01Mi41IDguOS03My40IDI1LjFMNzAuMSAzNi42Yy0xMC43LTcuOC0yNS43LTUuNC0zMy41IDUuM3MtNS40IDI1LjcgNS4zIDMzLjVsODggNjRjOS42IDYuOSAyMi43IDUuOSAzMS4xLTIuNGwzLjktMy45YzEzLjUtMTMuNSAzMS44LTIxLjEgNTAuOS0yMS4xbDQ2LjMgMC05MS43IDkxLjdjLTE1LjYgMTUuNi0xNS42IDQwLjkgMCA1Ni42bC44IC44QzIxOCAzMDggMjk0IDMwOCAzNDAuOSAyNjEuMWwyNy4xLTI3LjEgOTcuOCA5Ny44YzE1LjYgMTUuNiAxNS42IDQwLjkgMCA1Ni42bC05LjggOS44LTMxLTMxYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDI4IDI4Yy0xNy41IDEwLjQtMzcuMiAxNi43LTU3LjYgMTguNUwzMTMgMzk5Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDE1IDE1LTMuOCAwYy0zNi4xIDAtNzAuNy0xNC4zLTk2LjItMzkuOEw2NSAyNzljLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwcy05LjQgMjQuNiAwIDMzLjlMMTYwLjIgNDQyLjFjMzQuNSAzNC41IDgxLjMgNTMuOSAxMzAuMSA1My45bDUxLjggMCAxIDEgMS0xIDUuNyAwYzQ4LjggMCA5NS42LTE5LjQgMTMwLjEtNTMuOWwxOS45LTE5LjljMS4yLTEuMiAyLjMtMi4zIDMuNC0zLjUgLjctLjUgMS4zLTEuMSAxLjktMS43TDYwOSAzMTNjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMGwtNTMuOCA1My44Yy00LjItMTIuOC0xMS4zLTI0LjktMjEuNS0zNS4xTDM4NSAxODNjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwbC00NC4xIDQ0LjFjLTI2LjUgMjYuNS02OC41IDI4LTk2LjcgNC42bDk4LjctOTguN2MxMy40LTEzLjQgMzEuNi0yMSA1MC42LTIxLjFsOC41IDAgLjIgMCA1MC44IDBjMTQuMiAwIDI4LjEgNC4yIDM5LjkgMTIuMUw0ODIuNyAxNDBjOC40IDUuNiAxOS4zIDUuMyAyNy40LS42bDg4LTY0eiJdCiAgICB9OwogICAgZmFIYW5kc2hha2VBbHQgPSBmYUhhbmRzaGFrZTsKICAgIGZhSGFuZHNoYWtlU2ltcGxlID0gZmFIYW5kc2hha2U7CiAgICBmYUZhY2VTbWlsZVdpbmsgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1zbWlsZS13aW5rIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTIxLCAic21pbGUtd2luayJdLCAiZjRkYSIsICJNNDY0IDI1NmEyMDggMjA4IDAgMSAwIC00MTYgMCAyMDggMjA4IDAgMSAwIDQxNiAwek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0xNzcuMyA2My40QzE5Mi4zIDMzNSAyMTguNCAzNTIgMjU2IDM1MnM2My43LTE3IDc4LjctMzIuNmM5LjItOS42IDI0LjQtOS45IDMzLjktLjdzOS45IDI0LjQgLjcgMzMuOWMtMjIuMSAyMy02MCA0Ny40LTExMy4zIDQ3LjRzLTkxLjItMjQuNC0xMTMuMy00Ny40Yy05LjItOS42LTguOS0yNC44IC43LTMzLjlzMjQuOC04LjkgMzMuOSAuN3pNMTQ0IDIwOGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0xNjQgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBjMC0zMy4xIDI2LjktNjAgNjAtNjBsMTYgMGMzMy4xIDAgNjAgMjYuOSA2MCA2MCAwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjAtOS0yMC0yMC0yMGwtMTYgMGMtMTEgMC0yMCA5LTIwIDIweiJdCiAgICB9OwogICAgZmFTbWlsZVdpbmsgPSBmYUZhY2VTbWlsZVdpbms7CiAgICBmYUZhY2VHcmluU3F1aW50VGVhcnMgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1ncmluLXNxdWludC10ZWFycyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyOTMxNSwgImdyaW4tc3F1aW50LXRlYXJzIl0sICJmNTg2IiwgIk00MDMuMSA0MDMuMWM2Ny4yLTY3LjIgNzguOC0xNjguOSAzNC45LTI0OGwzNi43LTUuMmM0LjUtLjYgOC44LTEuNiAxMy4xLTIuOCA0NC42IDk0LjkgMjcuNyAyMTEuNS01MC43IDI5MHMtMTk1LjEgOTUuMy0yOTAgNTAuN2MxLjItNC4yIDIuMS04LjYgMi44LTEzLjFsNS4yLTM2LjdjNzkuMSA0My45IDE4MC44IDMyLjMgMjQ4LTM0Ljl6TTc1IDc1Yzc4LjQtNzguNCAxOTUuMS05NS4zIDI5MC01MC43LTEuMiA0LjItMi4xIDguNi0yLjggMTMuMWwtNS4yIDM2LjdjLTc5LjEtNDMuOS0xODAuOC0zMi4zLTI0OCAzNC45cy03OC44IDE2OC45LTM0LjkgMjQ4bC0zNi43IDUuMmMtNC41IC42LTguOCAxLjYtMTMuMSAyLjgtNDQuNi05NC45LTI3LjctMjExLjUgNTAuNy0yOTB6TTM3MC45IDIwNi41YzUuOC0xMC45IDIxLjEtMTIuNCAyNi40LTEuMyAyNS42IDUzLjUgMTYuMiAxMTkuNi0yOC4yIDE2My45LTQ0LjMgNDQuMy0xMTAuMyA1My43LTE2My44IDI4LjItMTEuMS01LjMtOS42LTIwLjYgMS4zLTI2LjQgMzItMTcuMSA2NC4yLTQwLjggOTMuOC03MC40IDI5LjctMjkuNyA1My40LTYxLjkgNzAuNS05NHpNOTMuMyAyODEuOWMtMS43LTggMi45LTE1LjkgMTAuNi0xOC40bDg0LjYtMjhjNS43LTEuOSAxMi4xLS40IDE2LjMgMy45czUuOCAxMC42IDMuOSAxNi4zbC0yOCA4NC42Yy0yLjYgNy43LTEwLjUgMTIuMy0xOC40IDEwLjZzLTEzLjQtOS0xMi43LTE3LjFsMy45LTQzLjEtNDMuMSAzLjljLTguMSAuNy0xNS41LTQuNy0xNy4xLTEyLjd6TTI5NC42IDExMC40bC0zLjkgNDMuMSA0My4xLTMuOWM4LjEtLjcgMTUuNSA0LjcgMTcuMSAxMi43cy0yLjkgMTUuOS0xMC42IDE4LjRsLTg0LjYgMjhjLTUuNyAxLjktMTIuMSAuNC0xNi4zLTMuOXMtNS44LTEwLjYtMy45LTE2LjNsMjgtODQuNmMyLjYtNy43IDEwLjUtMTIuMyAxOC40LTEwLjZzMTMuNCA5IDEyLjcgMTcuMXpNNTEyIDUxLjRjMCAyNS42LTE4LjggNDcuMy00NC4xIDUwLjlMNDIxLjEgMTA5Yy0xMC42IDEuNS0xOS42LTcuNS0xOC4xLTE4LjFsNi43LTQ2LjdDNDEzLjMgMTguOCA0MzUgMCA0NjAuNiAwIDQ4OSAwIDUxMiAyMyA1MTIgNTEuNHpNNDQuMSA0MDkuN0w5MC45IDQwM2MxMC42LTEuNSAxOS42IDcuNSAxOC4xIDE4LjFsLTYuNyA0Ni43Qzk4LjcgNDkzLjIgNzcgNTEyIDUxLjQgNTEyIDIzIDUxMiAwIDQ4OSAwIDQ2MC42IDAgNDM1IDE4LjggNDEzLjMgNDQuMSA0MDkuN3oiXQogICAgfTsKICAgIGZhR3JpblNxdWludFRlYXJzID0gZmFGYWNlR3JpblNxdWludFRlYXJzOwogICAgZmFGaWxlQXVkaW8gPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1hdWRpbyIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMWM3IiwgIk02NCA0OGwxMTIgMCAwIDg4YzAgMzkuOCAzMi4yIDcyIDcyIDcybDg4IDAgMCAyNDBjMCA4LjgtNy4yIDE2LTE2IDE2TDY0IDQ2NGMtOC44IDAtMTYtNy4yLTE2LTE2TDQ4IDY0YzAtOC44IDcuMi0xNiAxNi0xNnpNMjI0IDY3LjlsOTIuMSA5Mi4xLTY4LjEgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC02OC4xek02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI2MS41YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI0Mi43IDE4LjdDMjMwLjcgNi43IDIxNC41IDAgMTk3LjUgMEw2NCAwek0yMjEuOSAyNjcuNmMtNC43IDEwLS4zIDIxLjkgOS43IDI2LjYgMTkuMiA4LjkgMzIuNCAyOC4zIDMyLjQgNTAuOHMtMTMuMiA0MS45LTMyLjQgNTAuOGMtMTAgNC43LTE0LjQgMTYuNi05LjcgMjYuNnMxNi42IDE0LjQgMjYuNiA5LjdDMjgxLjIgNDE2LjggMzA0IDM4My42IDMwNCAzNDVzLTIyLjgtNzEuOS01NS42LTg3LjFjLTEwLTQuNy0yMS45LS4zLTI2LjYgOS43ek0xMDQgMzA1Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDMyYzAgMTMuMyAxMC43IDI0IDI0IDI0bDE2IDAgMjcuMiAzNGMzIDMuOCA3LjYgNiAxMi41IDZsLjMgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0xMjhjMC04LjgtNy4yLTE2LTE2LTE2bC0uMyAwYy00LjkgMC05LjUgMi4yLTEyLjUgNmwtMjcuMiAzNC0xNiAwek0yMjMuMyAzNzNjOS45LTUuNCAxNi43LTE2IDE2LjctMjguMXMtNi43LTIyLjctMTYuNy0yOC4xYy03LjgtNC4yLTE1LjMgMy4zLTE1LjMgMTIuMWwwIDMyYzAgOC44IDcuNiAxNi4zIDE1LjMgMTIuMXoiXQogICAgfTsKICAgIGZhQ2FsZW5kYXJYbWFyayA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjYWxlbmRhci14bWFyayIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJjYWxlbmRhci10aW1lcyJdLCAiZjI3MyIsICJNMTIwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA0MCAxNjAgMCAwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA0MCAzMiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjg4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsMzIgMCAwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0em0wIDExMmwtNTYgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMjg4YzAgOC44IDcuMiAxNiAxNiAxNmwzMjAgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0yODhjMC04LjgtNy4yLTE2LTE2LTE2bC0yNjQgMHptMTcxLjkgOTIuMWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOWwtMzMuOSAzMy45IDMzLjkgMzMuOWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwbC0zMy45LTMzLjktMzMuOSAzMy45Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45bDMzLjktMzMuOS0zMy45LTMzLjljLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGwzMy45IDMzLjkgMzMuOS0zMy45YzkuNC05LjQgMjQuNi05LjQgMzMuOSAweiJdCiAgICB9OwogICAgZmFDYWxlbmRhclRpbWVzID0gZmFDYWxlbmRhclhtYXJrOwogICAgZmFDaXJjbGVEb3duID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1kb3duIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjE0NjYsICJhcnJvdy1hbHQtY2lyY2xlLWRvd24iXSwgImYzNTgiLCAiTTI1NiA0NjRhMjA4IDIwOCAwIDEgMSAwLTQxNiAyMDggMjA4IDAgMSAxIDAgNDE2ek0yNTYgMGEyNTYgMjU2IDAgMSAwIDAgNTEyIDI1NiAyNTYgMCAxIDAgMC01MTJ6TTI0NC43IDM4Ny4zYzYuMiA2LjIgMTYuNCA2LjIgMjIuNiAwbDEwNC0xMDRjNC42LTQuNiA1LjktMTEuNSAzLjUtMTcuNFMzNjYuNSAyNTYgMzYwIDI1NmwtNzIgMCAwLTEwNGMwLTEzLjMtMTAuNy0yNC0yNC0yNGwtMTYgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAxMDQtNzIgMGMtNi41IDAtMTIuMyAzLjktMTQuOCA5LjlzLTEuMSAxMi45IDMuNSAxNy40bDEwNCAxMDR6Il0KICAgIH07CiAgICBmYUFycm93QWx0Q2lyY2xlRG93biA9IGZhQ2lyY2xlRG93bjsKICAgIGZhRmlsZUxpbmVzID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZpbGUtbGluZXMiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjg0NDEsIDEyODQ2MiwgNjE2ODYsICJmaWxlLWFsdCIsICJmaWxlLXRleHQiXSwgImYxNWMiLCAiTTY0IDQ4bDExMiAwIDAgODhjMCAzOS44IDMyLjIgNzIgNzIgNzJsODggMCAwIDI0MGMwIDguOC03LjIgMTYtMTYgMTZMNjQgNDY0Yy04LjggMC0xNi03LjItMTYtMTZMNDggNjRjMC04LjggNy4yLTE2IDE2LTE2ek0yMjQgNjcuOWw5Mi4xIDkyLjEtNjguMSAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTY4LjF6TTY0IDBDMjguNyAwIDAgMjguNyAwIDY0TDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI1NiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjYxLjVjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNMMjQyLjcgMTguN0MyMzAuNyA2LjcgMjE0LjUgMCAxOTcuNSAwTDY0IDB6bTU2IDI1NmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNDQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTQ0IDB6bTAgOTZjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTQ0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE0NCAweiJdCiAgICB9OwogICAgZmFGaWxlQWx0ID0gZmFGaWxlTGluZXM7CiAgICBmYUZpbGVUZXh0ID0gZmFGaWxlTGluZXM7CiAgICBmYUNvbW1lbnRzID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNvbW1lbnRzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4NDkwLCA2MTY3MF0sICJmMDg2IiwgIk03Ni4yIDI1OC43YzYuMS0xNS4yIDQtMzIuNi01LjYtNDUuOS0xNC41LTIwLjEtMjIuNi00My43LTIyLjYtNjguOCAwLTY2LjggNjAuNS0xMjggMTQ0LTEyOHMxNDQgNjEuMiAxNDQgMTI4LTYwLjUgMTI4LTE0NCAxMjhjLTE1LjkgMC0zMS4xLTIuMy00NS4zLTYuNS0xMC4zLTMuMS0yMS40LTIuNS0zMS40IDEuNWwtNTAuNCAyMC4yIDExLjQtMjguNXpNMCAxNDRjMCAzNS44IDExLjYgNjkuMSAzMS43IDk2LjhMMS45IDMxNS4yYy0xLjMgMy4yLTEuOSA2LjYtMS45IDEwIDAgMTQuOCAxMiAyNi44IDI2LjggMjYuOCAzLjQgMCA2LjgtLjcgMTAtMS45bDk2LjMtMzguNWMxOC42IDUuNSAzOC40IDguNCA1OC45IDguNCAxMDYgMCAxOTItNzguOCAxOTItMTc2UzI5OC0zMiAxOTItMzIgMCA0Ni44IDAgMTQ0ek0zODQgNTEyYzIwLjYgMCA0MC4zLTMgNTguOS04LjRsOTYuMyAzOC41YzMuMiAxLjMgNi42IDEuOSAxMCAxLjkgMTQuOCAwIDI2LjgtMTIgMjYuOC0yNi44IDAtMy40LS43LTYuOC0xLjktMTBsLTI5LjctNzQuNGMyMC0yNy44IDMxLjctNjEuMSAzMS43LTk2LjggMC04Mi40LTYxLjctMTUxLjUtMTQ1LTE3MC43LTEuNiAxNi4zLTUuMSAzMS45LTEwLjEgNDYuOSA2My45IDE0LjggMTA3LjIgNjcuMyAxMDcuMiAxMjMuOSAwIDI1LjEtOC4xIDQ4LjctMjIuNiA2OC44LTkuNiAxMy4zLTExLjcgMzAuNi01LjYgNDUuOWwxMS40IDI4LjUtNTAuNC0yMC4yYy0xMC00LTIxLjEtNC41LTMxLjQtMS41LTE0LjIgNC4yLTI5LjQgNi41LTQ1LjMgNi41LTcyLjIgMC0xMjcuMS00NS43LTE0MC43LTEwMS4yLTE1LjYgMy4yLTMxLjcgNS00OC4xIDUuMiAxNi40IDgxLjkgOTQuNyAxNDQgMTg4LjggMTQ0eiJdCiAgICB9OwogICAgZmFDaXJjbGVDaGVjayA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtY2hlY2siLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MTUzMywgImNoZWNrLWNpcmNsZSJdLCAiZjA1OCIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAxIDAtNTEyIDI1NiAyNTYgMCAxIDEgMCA1MTJ6bTAtNDY0YTIwOCAyMDggMCAxIDAgMCA0MTYgMjA4IDIwOCAwIDEgMCAwLTQxNnptNzAuNyAxMjEuOWM3LjgtMTAuNyAyMi44LTEzLjEgMzMuNS01LjMgMTAuNyA3LjggMTMuMSAyMi44IDUuMyAzMy41TDI0My40IDM2Ni4xYy00LjEgNS43LTEwLjUgOS4zLTE3LjUgOS44LTcgLjUtMTMuOS0yLTE4LjgtNi45bC01NS45LTU1LjljLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGwzNiAzNiAxMDUuNi0xNDUuMnoiXQogICAgfTsKICAgIGZhQ2hlY2tDaXJjbGUgPSBmYUNpcmNsZUNoZWNrOwogICAgZmFNb29uID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogIm1vb24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjc3NjksIDkyMTRdLCAiZjE4NiIsICJNMjM5LjMgNDguN2MtMTA3LjEgOC41LTE5MS4zIDk4LjEtMTkxLjMgMjA3LjMgMCAxMTQuOSA5My4xIDIwOCAyMDggMjA4IDMzLjMgMCA2NC43LTcuOCA5Mi42LTIxLjctMTAzLjQtMjMuNC0xODAuNi0xMTUuOC0xODAuNi0yMjYuMyAwLTY1LjggMjcuNC0xMjUuMSA3MS4zLTE2Ny4zek0wIDI1NmMwLTE0MS40IDExNC42LTI1NiAyNTYtMjU2IDE5LjQgMCAzOC40IDIuMiA1Ni43IDYuMyA5LjkgMi4yIDE3LjMgMTAuNSAxOC41IDIwLjVzLTQgMTkuOC0xMy4xIDI0LjRjLTYwLjYgMzAuMi0xMDIuMSA5Mi43LTEwMi4xIDE2NC44IDAgMTAxLjYgODIuNCAxODQgMTg0IDE4NCA1IDAgOS45LS4yIDE0LjgtLjYgMTAuMS0uOCAxOS42IDQuOCAyMy44IDE0LjFzMiAyMC4xLTUuMyAyNy4xQzM4Ny4zIDQ4NC44IDMyNC44IDUxMiAyNTYgNTEyIDExNC42IDUxMiAwIDM5Ny40IDAgMjU2eiJdCiAgICB9OwogICAgZmFDbG9zZWRDYXB0aW9uaW5nID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNsb3NlZC1jYXB0aW9uaW5nIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyMGEiLCAiTTQ0OCAxMTJjOC44IDAgMTYgNy4yIDE2IDE2bDAgMjU2YzAgOC44LTcuMiAxNi0xNiAxNkw2NCA0MDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTI1NmMwLTguOCA3LjItMTYgMTYtMTZsMzg0IDB6TTY0IDY0QzI4LjcgNjQgMCA5Mi43IDAgMTI4TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDY0em04OCAxNDRsMzIgMGM0LjQgMCA4IDMuNiA4IDggMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGMwLTMwLjktMjUuMS01Ni01Ni01NmwtMzIgMGMtMzAuOSAwLTU2IDI1LjEtNTYgNTZsMCA4MGMwIDMwLjkgMjUuMSA1NiA1NiA1NmwzMiAwYzMwLjkgMCA1Ni0yNS4xIDU2LTU2IDAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0YzAgNC40LTMuNiA4LTggOGwtMzIgMGMtNC40IDAtOC0zLjYtOC04bDAtODBjMC00LjQgMy42LTggOC04em0xNjggOGMwLTQuNCAzLjYtOCA4LThsMzIgMGM0LjQgMCA4IDMuNiA4IDggMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGMwLTMwLjktMjUuMS01Ni01Ni01NmwtMzIgMGMtMzAuOSAwLTU2IDI1LjEtNTYgNTZsMCA4MGMwIDMwLjkgMjUuMSA1NiA1NiA1NmwzMiAwYzMwLjkgMCA1Ni0yNS4xIDU2LTU2IDAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0YzAgNC40LTMuNiA4LTggOGwtMzIgMGMtNC40IDAtOC0zLjYtOC04bDAtODB6Il0KICAgIH07CiAgICBmYUltYWdlcyA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJpbWFnZXMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjMwMiIsICJNNDgwIDgwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDI1NmMwIDguOC03LjIgMTYtMTYgMTZsLTMyMCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0yNTZjMC04LjggNy4yLTE2IDE2LTE2bDMyMCAwek0xNjAgMzJjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgMjU2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDE2MCAzMnptODAgMTEyYTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6bTE0MC43IDMuOGMtNC4zLTcuMy0xMi4yLTExLjgtMjAuNy0xMS44cy0xNi40IDQuNS0yMC43IDExLjhsLTQ2LjUgNzktMTcuMi0yNC42Yy00LjUtNi40LTExLjgtMTAuMi0xOS43LTEwLjJzLTE1LjIgMy44LTE5LjcgMTAuMmwtNTYgODBjLTUuMSA3LjMtNS44IDE2LjktMS42IDI0LjhTMTkxLjEgMzIwIDIwMCAzMjBsMjQwIDBjOC42IDAgMTYuNi00LjYgMjAuOC0xMi4xczQuMi0xNi43LS4xLTI0LjFsLTgwLTEzNnpNNDggMTUyYzAtMTMuMy0xMC43LTI0LTI0LTI0UzAgMTM4LjcgMCAxNTJMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzYwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRMNjQgNDY0Yy04LjggMC0xNi03LjItMTYtMTZsMC0yOTZ6Il0KICAgIH07CiAgICBmYUNpcmNsZVJpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1yaWdodCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYxODM4LCAiYXJyb3ctYWx0LWNpcmNsZS1yaWdodCJdLCAiZjM1YSIsICJNNDY0IDI1NmEyMDggMjA4IDAgMSAxIC00MTYgMCAyMDggMjA4IDAgMSAxIDQxNiAwek0wIDI1NmEyNTYgMjU2IDAgMSAwIDUxMiAwIDI1NiAyNTYgMCAxIDAgLTUxMiAwem0zODcuMyAxMS4zYzYuMi02LjIgNi4yLTE2LjQgMC0yMi42bC0xMDQtMTA0Yy00LjYtNC42LTExLjUtNS45LTE3LjQtMy41UzI1NiAxNDUuNSAyNTYgMTUybDAgNzItMTA0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMTZjMCAxMy4zIDEwLjcgMjQgMjQgMjRsMTA0IDAgMCA3MmMwIDYuNSAzLjkgMTIuMyA5LjkgMTQuOHMxMi45IDEuMSAxNy40LTMuNWwxMDQtMTA0eiJdCiAgICB9OwogICAgZmFBcnJvd0FsdENpcmNsZVJpZ2h0ID0gZmFDaXJjbGVSaWdodDsKICAgIGZhSWRDYXJkID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImlkLWNhcmQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFs2MjE0NywgImRyaXZlcnMtbGljZW5zZSJdLCAiZjJjMiIsICJNNDggNDE2bDAtMjU2IDQ4MCAwIDAgMjU2YzAgOC44LTcuMiAxNi0xNiAxNmwtMTkyIDBjMC00NC4yLTM1LjgtODAtODAtODBsLTY0IDBjLTQ0LjIgMC04MCAzNS44LTgwIDgwbC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZ6TTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsNDQ4IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6TTIwOCAzMTJhNTYgNTYgMCAxIDAgMC0xMTIgNTYgNTYgMCAxIDAgMCAxMTJ6TTM3NiAyMDhjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsODAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtODAgMHptMCA5NmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw4MCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC04MCAweiJdCiAgICB9OwogICAgZmFEcml2ZXJzTGljZW5zZSA9IGZhSWRDYXJkOwogICAgZmFDaXJjbGVQbGF5ID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1wbGF5IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjE0NjksICJwbGF5LWNpcmNsZSJdLCAiZjE0NCIsICJNMjU2IDQ4YTIwOCAyMDggMCAxIDEgMCA0MTYgMjA4IDIwOCAwIDEgMSAwLTQxNnptMCA0NjRhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0yMTIuNSAxNDcuNWMtNy40LTQuNS0xNi43LTQuNy0yNC4zLS41UzE3NiAxNTkuMyAxNzYgMTY4bDAgMTc2YzAgOC43IDQuNyAxNi43IDEyLjMgMjAuOXMxNi44IDQuMSAyNC4zLS41bDE0NC04OGM3LjEtNC40IDExLjUtMTIuMSAxMS41LTIwLjVzLTQuNC0xNi4xLTExLjUtMjAuNWwtMTQ0LTg4ek0yOTggMjU2bC03NCA0NS4yIDAtOTAuNCA3NCA0NS4yeiJdCiAgICB9OwogICAgZmFQbGF5Q2lyY2xlID0gZmFDaXJjbGVQbGF5OwogICAgZmFGYWNlTGF1Z2hCZWFtID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2UtbGF1Z2gtYmVhbSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODUxMywgImxhdWdoLWJlYW0iXSwgImY1OWEiLCAiTTQ2NCAyNTZhMjA4IDIwOCAwIDEgMCAtNDE2IDAgMjA4IDIwOCAwIDEgMCA0MTYgMHpNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMTE4LjMgNTguMmMtNC4yLTEzLjcgNy4xLTI2LjIgMjEuNC0yNi4ybDIzMi42IDBjMTQuMyAwIDI1LjYgMTIuNSAyMS40IDI2LjItMTggNTguOS03Mi45IDEwMS44LTEzNy43IDEwMS44UzEzNi4zIDM3My4xIDExOC4zIDMxNC4yek0xNzYgMTgwYy0xNS41IDAtMjggMTIuNS0yOCAyOGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTM3LjYgMzAuNC02OCA2OC02OHM2OCAzMC40IDY4IDY4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMTUuNS0xMi41LTI4LTI4LTI4em0xMzIgMjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0zNy42IDMwLjQtNjggNjgtNjhzNjggMzAuNCA2OCA2OGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTE1LjUtMTIuNS0yOC0yOC0yOHMtMjggMTIuNS0yOCAyOHoiXQogICAgfTsKICAgIGZhTGF1Z2hCZWFtID0gZmFGYWNlTGF1Z2hCZWFtOwogICAgZmFBZGRyZXNzQm9vayA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJhZGRyZXNzLWJvb2siLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MjEzOCwgImNvbnRhY3QtYm9vayJdLCAiZjJiOSIsICJNMzg0IDQ4YzguOCAwIDE2IDcuMiAxNiAxNmwwIDM4NGMwIDguOC03LjIgMTYtMTYgMTZMOTYgNDY0Yy04LjggMC0xNi03LjItMTYtMTZMODAgNjRjMC04LjggNy4yLTE2IDE2LTE2bDI4OCAwek05NiAwQzYwLjcgMCAzMiAyOC43IDMyIDY0bDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI4OCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzg0YzAtMzUuMy0yOC43LTY0LTY0LTY0TDk2IDB6TTI0MCAyNDhhNTYgNTYgMCAxIDAgMC0xMTIgNTYgNTYgMCAxIDAgMCAxMTJ6bS0zMiA0MGMtNDQuMiAwLTgwIDM1LjgtODAgODAgMCA4LjggNy4yIDE2IDE2IDE2bDE5MiAwYzguOCAwIDE2LTcuMiAxNi0xNiAwLTQ0LjItMzUuOC04MC04MC04MGwtNjQgMHpNNTEyIDgwYzAtOC44LTcuMi0xNi0xNi0xNnMtMTYgNy4yLTE2IDE2bDAgNjRjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTY0ek00OTYgMTkyYy04LjggMC0xNiA3LjItMTYgMTZsMCA2NGMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtNjRjMC04LjgtNy4yLTE2LTE2LTE2em0xNiAxNDRjMC04LjgtNy4yLTE2LTE2LTE2cy0xNiA3LjItMTYgMTZsMCA2NGMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtNjR6Il0KICAgIH07CiAgICBmYUNvbnRhY3RCb29rID0gZmFBZGRyZXNzQm9vazsKICAgIGZhSG91cmdsYXNzID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImhvdXJnbGFzcyIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzkyMDMsIDYyMDMyLCAiaG91cmdsYXNzLWVtcHR5Il0sICJmMjU0IiwgIk0yNCAwQzEwLjcgMCAwIDEwLjcgMCAyNFMxMC43IDQ4IDI0IDQ4bDggMCAwIDE5YzAgNDAuMyAxNiA3OSA0NC41IDEwNy41bDgxLjUgODEuNS04MS41IDgxLjVDNDggMzY2IDMyIDQwNC43IDMyIDQ0NWwwIDE5LTggMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwzMzYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtOCAwIDAtMTljMC00MC4zLTE2LTc5LTQ0LjUtMTA3LjVsLTgxLjUtODEuNSA4MS41LTgxLjVDMzM2IDE0NiAzNTIgMTA3LjMgMzUyIDY3bDAtMTkgOCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0UzM3My4zIDAgMzYwIDBMMjQgMHpNMTkyIDI4OS45bDgxLjUgODEuNUMyOTMgMzkxIDMwNCA0MTcuNCAzMDQgNDQ1bDAgMTktMjI0IDAgMC0xOWMwLTI3LjYgMTEtNTQgMzAuNS03My41TDE5MiAyODkuOXptMC02Ny45bC04MS41LTgxLjVDOTEgMTIxIDgwIDk0LjYgODAgNjdsMC0xOSAyMjQgMCAwIDE5YzAgMjcuNi0xMSA1NC0zMC41IDczLjVMMTkyIDIyMi4xeiJdCiAgICB9OwogICAgZmFIb3VyZ2xhc3NFbXB0eSA9IGZhSG91cmdsYXNzOwogICAgZmFIZWFkcGhvbmVzID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImhlYWRwaG9uZXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjc5MTEsIDYyODYzLCAiaGVhZHBob25lcy1hbHQiLCAiaGVhZHBob25lcy1zaW1wbGUiXSwgImYwMjUiLCAiTTQ4IDIyNGMwLTk3LjIgNzguOC0xNzYgMTc2LTE3NnMxNzYgNzguOCAxNzYgMTc2bDAgNDQuOGMtMTQuMS04LjItMzAuNS0xMi44LTQ4LTEyLjhsLTE2IDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgMTI4YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDE2IDBjNTMgMCA5Ni00MyA5Ni05NmwwLTE2MEM0NDggMTAwLjMgMzQ3LjcgMCAyMjQgMFMwIDEwMC4zIDAgMjI0TDAgMzg0YzAgNTMgNDMgOTYgOTYgOTZsMTYgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTEyOGMwLTI2LjUtMjEuNS00OC00OC00OGwtMTYgMGMtMTcuNSAwLTMzLjkgNC43LTQ4IDEyLjhMNDggMjI0em0wIDEyOGMwLTI2LjUgMjEuNS00OCA0OC00OGwxNiAwIDAgMTI4LTE2IDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMzJ6bTM1MiAwbDAgMzJjMCAyNi41LTIxLjUgNDgtNDggNDhsLTE2IDAgMC0xMjggMTYgMGMyNi41IDAgNDggMjEuNSA0OCA0OHoiXQogICAgfTsKICAgIGZhSGVhZHBob25lc0FsdCA9IGZhSGVhZHBob25lczsKICAgIGZhSGVhZHBob25lc1NpbXBsZSA9IGZhSGVhZHBob25lczsKICAgIGZhRmlsZVBvd2VycG9pbnQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1wb3dlcnBvaW50IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYxYzQiLCAiTTY0IDQ4bDExMiAwIDAgODhjMCAzOS44IDMyLjIgNzIgNzIgNzJsODggMCAwIDI0MGMwIDguOC03LjIgMTYtMTYgMTZMNjQgNDY0Yy04LjggMC0xNi03LjItMTYtMTZMNDggNjRjMC04LjggNy4yLTE2IDE2LTE2ek0yMjQgNjcuOWw5Mi4xIDkyLjEtNjguMSAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTY4LjF6TTY0IDBDMjguNyAwIDAgMjguNyAwIDY0TDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI1NiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjYxLjVjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNMMjQyLjcgMTguN0MyMzAuNyA2LjcgMjE0LjUgMCAxOTcuNSAwTDY0IDB6bTg4IDI1NmMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAxMjhjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTE2IDI4IDBjMzcuNiAwIDY4LTMwLjQgNjgtNjhzLTMwLjQtNjgtNjgtNjhsLTUyIDB6bTUyIDg4bC0yOCAwIDAtNDAgMjggMGMxMSAwIDIwIDkgMjAgMjBzLTkgMjAtMjAgMjB6Il0KICAgIH07CiAgICBmYVdpbmRvd01heGltaXplID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogIndpbmRvdy1tYXhpbWl6ZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODQ3MF0sICJmMmQwIiwgIk00OCAyMjRsMCAxNjBjMCA4LjggNy4yIDE2IDE2IDE2bDM4NCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTE2MC00MTYgMHpNMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyNTZjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDQ4Yy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDEyOHoiXQogICAgfTsKICAgIGZhQ29tbWVudERvdHMgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY29tbWVudC1kb3RzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MTcyLCA2MjA3NSwgImNvbW1lbnRpbmciXSwgImY0YWQiLCAiTTAgMjQwYzAgNTQuNCAxOS4zIDEwNC42IDUxLjkgMTQ0LjlMMy4xIDQ3NC4zYy0yIDMuNy0zLjEgNy45LTMuMSAxMi4yIDAgMTQuMSAxMS40IDI1LjUgMjUuNSAyNS41IDQgMCA3LjgtLjYgMTEuNS0yLjFMMTUzLjQgNDYwYzMxLjQgMTIuOSA2Ni4xIDIwIDEwMi42IDIwIDE0MS40IDAgMjU2LTEwNy41IDI1Ni0yNDBTMzk3LjQgMCAyNTYgMCAwIDEwNy41IDAgMjQwek05NCA0MDcuOWM5LjMtMTcuMSA3LjQtMzguMS00LjgtNTMuMi0yNi4xLTMyLjMtNDEuMi03MS45LTQxLjItMTE0LjcgMC0xMDMuMiA5MC4yLTE5MiAyMDgtMTkyczIwOCA4OC44IDIwOCAxOTItOTAuMiAxOTItMjA4IDE5MmMtMzAuMiAwLTU4LjctNS45LTg0LjMtMTYuNC0xMS45LTQuOS0yNS4zLTQuOC0zNy4xIC4zTDc2IDQ0MC45IDk0IDQwNy45ek0xNDQgMjcyYTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHptMTQ0LTMyYTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6bTgwIDMyYTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHoiXQogICAgfTsKICAgIGZhQ29tbWVudGluZyA9IGZhQ29tbWVudERvdHM7CiAgICBmYUZhY2VHcmluVG9uZ3VlV2luayA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWdyaW4tdG9uZ3VlLXdpbmsiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1NDAsICJncmluLXRvbmd1ZS13aW5rIl0sICJmNThiIiwgIk0zNjYuOSA0MzJjLjgtNS4yIDEuMS0xMC42IDEuMS0xNmwwLTUzLjVjMTAuMi0xMi42IDE4LjMtMjYuOSAyMy44LTQyLjUgNC4xLTExLjYtNy44LTIxLjQtMTkuNi0xNy44LTM0LjggMTAuNi03NC4zIDE2LjYtMTE2LjMgMTYuNi00MS45IDAtODEuNC02LTExNi4xLTE2LjUtMTEuOC0zLjYtMjMuNyA2LjEtMTkuNiAxNy44IDUuNSAxNS41IDEzLjYgMjkuOSAyMy44IDQyLjRsMCA1My41YzAgNS40IC40IDEwLjggMS4xIDE2LTU4LjQtMzYuOC05Ny4xLTEwMS45LTk3LjEtMTc2IDAtMTE0LjkgOTMuMS0yMDggMjA4LTIwOHMyMDggOTMuMSAyMDggMjA4YzAgNzQuMS0zOC44IDEzOS4yLTk3LjEgMTc2em0tMzguOCA2OS43QzQzNC40IDQ3MC42IDUxMiAzNzIuMyA1MTIgMjU2IDUxMiAxMTQuNiAzOTcuNCAwIDI1NiAwUzAgMTE0LjYgMCAyNTZDMCAzNzIuMyA3Ny42IDQ3MC42IDE4My45IDUwMS43IDIwMy40IDUxOC4xIDIyOC41IDUyOCAyNTYgNTI4czUyLjYtOS45IDcyLjEtMjYuM3pNMzIwIDM3OC42bDAgMzcuNGMwIDM1LjMtMjguNyA2NC02NCA2NHMtNjQtMjguNy02NC02NGwwLTM3LjRjMC0xNC43IDExLjktMjYuNiAyNi42LTI2LjZsMiAwYzExLjMgMCAyMS4xIDcuOSAyMy42IDE4LjkgMi44IDEyLjYgMjAuOCAxMi42IDIzLjYgMCAyLjUtMTEuMSAxMi4zLTE4LjkgMjMuNi0xOC45bDIgMGMxNC43IDAgMjYuNiAxMS45IDI2LjYgMjYuNnpNMTMyIDIzMmMwLTExIDktMjAgMjAtMjBsMTYgMGMxMSAwIDIwIDkgMjAgMjBzOSAyMCAyMCAyMCAyMC05IDIwLTIwYzAtMzMuMS0yNi45LTYwLTYwLTYwbC0xNiAwYy0zMy4xIDAtNjAgMjYuOS02MCA2MCAwIDExIDkgMjAgMjAgMjBzMjAtOSAyMC0yMHptMjI4LjQtMjRhMjQgMjQgMCAxIDAgLTQ4IDAgMjQgMjQgMCAxIDAgNDggMHpNMjg4IDIwOGE0OCA0OCAwIDEgMSA5NiAwIDQ4IDQ4IDAgMSAxIC05NiAwem0xMjggMGE4MCA4MCAwIDEgMCAtMTYwIDAgODAgODAgMCAxIDAgMTYwIDB6Il0KICAgIH07CiAgICBmYUdyaW5Ub25ndWVXaW5rID0gZmFGYWNlR3JpblRvbmd1ZVdpbms7CiAgICBmYUhvdXJnbGFzc0hhbGYgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiaG91cmdsYXNzLWhhbGYiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsiaG91cmdsYXNzLTIiXSwgImYyNTIiLCAiTTAgMjRDMCAxMC43IDEwLjcgMCAyNCAwTDM2MCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC04IDAgMCAxOWMwIDQwLjMtMTYgNzktNDQuNSAxMDcuNWwtODEuNSA4MS41IDgxLjUgODEuNUMzMzYgMzY2IDM1MiA0MDQuNyAzNTIgNDQ1bDAgMTkgOCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0TDI0IDUxMmMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGw4IDAgMC0xOWMwLTQwLjMgMTYtNzkgNDQuNS0xMDcuNWw4MS41LTgxLjUtODEuNS04MS41QzQ4IDE0NiAzMiAxMDcuMyAzMiA2N2wwLTE5LTggMEMxMC43IDQ4IDAgMzcuMyAwIDI0ek0xMTAuNSAzNzEuNWMtMy45IDMuOS03LjUgOC4xLTEwLjcgMTIuNWwxODQuNCAwYy0zLjItNC40LTYuOC04LjYtMTAuNy0xMi41bC04MS41LTgxLjUtODEuNSA4MS41ek04MC44IDQzMmMtLjUgNC4zLS44IDguNi0uOCAxM2wwIDE5IDIyNCAwIDAtMTljMC00LjQtLjMtOC43LS44LTEzTDgwLjggNDMyek0yNTQuMSAxNjBsLTEyNC4xIDAgNjIuMSA2Mi4xIDYyLjEtNjIuMXptMzkuNy00OEMzMDAuNCA5OC4xIDMwNCA4Mi43IDMwNCA2N2wwLTE5LTIyNCAwIDAgMTljMCAxNS43IDMuNiAzMS4xIDEwLjIgNDVsMjAzLjUgMHoiXQogICAgfTsKICAgIGZhSG91cmdsYXNzMiA9IGZhSG91cmdsYXNzSGFsZjsKICAgIGZhQ3JlZGl0Q2FyZCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJjcmVkaXQtY2FyZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODE3OSwgNjIwODMsICJjcmVkaXQtY2FyZC1hbHQiXSwgImYwOWQiLCAiTTQ0OCAxMTJjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzItNDE2IDAgMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsMzg0IDB6bTE2IDExMmwwIDE2MGMwIDguOC03LjIgMTYtMTYgMTZMNjQgNDAwYy04LjggMC0xNi03LjItMTYtMTZsMC0xNjAgNDE2IDB6TTY0IDY0QzI4LjcgNjQgMCA5Mi43IDAgMTI4TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDY0ek04MCAzNDRjMCAxMy4zIDEwLjcgMjQgMjQgMjRsNDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNDggMGMtMTMuMyAwLTI0IDEwLjctMjQgMjR6bTE0NCAwYzAgMTMuMyAxMC43IDI0IDI0IDI0bDY0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTY0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0eiJdCiAgICB9OwogICAgZmFDcmVkaXRDYXJkQWx0ID0gZmFDcmVkaXRDYXJkOwogICAgZmFIYW5kU3BvY2sgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1zcG9jayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODQwNl0sICJmMjU5IiwgIk0xMzguMyA4MC44Yy05LjItMzMuOCAxMC41LTY4LjggNDQuMy03OC40IDM0LTkuNiA2OS40IDEwLjIgNzkgNDQuMkwyOTEuOSAxNTMuNyAzMDUuMSA4NGM2LjYtMzQuNyA0MC4xLTU3LjUgNzQuOC01MC45IDMxLjQgNiA1MyAzMy45IDUyIDY0LjkgMTAtMi42IDIwLjgtMi44IDMxLjUtLjEgMzQuMyA4LjYgNTUuMSA0My4zIDQ2LjYgNzcuNkw0NTQuNyAzOTcuMkM0MzcuOCA0NjQuNyAzNzcuMiA1MTIgMzA3LjYgNTEybC0zMy43IDBjLTU2LjkgMC0xMTIuMi0xOS0xNTcuMi01My45bC05Mi03MS42Yy0yNy45LTIxLjctMzIuOS02MS45LTExLjItODkuOHM2MS45LTMyLjkgODkuOC0xMS4ybDE3IDEzLjItNTEuOC0xMzEuMmMtMTMtMzIuOSAzLjItNzAuMSAzNi04MyAxMS4xLTQuNCAyMi43LTUuNCAzMy43LTMuN3ptNzcuMS0yMS4yYy0yLjQtOC41LTExLjItMTMuNC0xOS43LTExcy0xMy40IDExLjItMTEgMTkuN2w1NC44IDE4Mi40YzMuNSAxMi4zLTMuMyAyNS4yLTE1LjQgMjkuM3MtMjUuMy0yLTMwLTEzLjlMMTQyLjkgMTM4LjFjLTMuMi04LjItMTIuNS0xMi4zLTIwLjgtOXMtMTIuMyAxMi41LTkgMjAuOGw3My4zIDE4NS42YzEyIDMwLjMtMjMuNyA1Ny00OS40IDM3TDczLjggMzIzLjRjLTctNS40LTE3LTQuMi0yMi41IDIuOHMtNC4yIDE3IDIuOCAyMi41bDkyIDcxLjZjMzYuNSAyOC40IDgxLjQgNDMuOCAxMjcuNyA0My44bDMzLjcgMGM0Ny41IDAgODktMzIuNCAxMDAuNS03OC41bDU1LjQtMjIxLjZjMi4xLTguNi0zLjEtMTcuMy0xMS42LTE5LjRzLTE3LjMgMy4xLTE5LjQgMTEuNmwtMjYgMTA0Yy0yLjkgMTEuNy0xMy40IDE5LjktMjUuNSAxOS45LTE2LjUgMC0yOC45LTE1LTI1LjgtMzEuMkwzODMuNyA5OWMxLjctOC43LTQtMTcuMS0xMi43LTE4LjdTMzU0IDg0LjMgMzUyLjMgOTNMMzIwLjUgMjYwYy0yLjIgMTEuNi0xMi40IDIwLTI0LjIgMjAtMTEgMC0yMC43LTcuMy0yMy43LTE3LjlMMjE1LjQgNTkuNnoiXQogICAgfTsKICAgIGZhQmVsbFNsYXNoID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImJlbGwtc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgyNzcsIDYxOTQzXSwgImYxZjYiLCAiTTQxLTI0LjljLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwUy0yLjMtLjMgNyA5LjFsNTI4IDUyOGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTg3LjgtODcuOGMxNy41LTMuMyAzMC44LTE4LjcgMzAuOC0zNy4xIDAtNi43LTEuOC0xMy4zLTUuMS0xOUw0ODUgMzIxLjdjLTE5LTMyLjYtMjktNjkuNi0yOS0xMDcuM2wwLTE0LjVjMC04NC42LTYyLjYtMTU0LjctMTQ0LTE2Ni4zbDAtOS43YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgOS43Yy00Mi4yIDYtNzkuNCAyNy44LTEwNS40IDU5LjFMNDEtMjQuOXpNMTkyLjggMTI2LjlDMjE0LjcgOTguNCAyNDkuMiA4MCAyODggODAgMzU0LjMgODAgNDA4IDEzMy43IDQwOCAyMDBsMCAxNC41YzAgNDYuMiAxMi4zIDkxLjUgMzUuNSAxMzEuNGwxMi45IDIyLjEtMjIuNiAwLTI0MS4xLTI0MS4xek0xMzIuNSAzNDUuOWMxOS41LTMzLjQgMzEuMy03MC43IDM0LjYtMTA5bC00Ni43LTQ2LjdjLS4yIDMuMy0uMyA2LjYtLjMgOS45bDAgMTQuNWMwIDM3LjctMTAgNzQuNy0yOSAxMDcuM0w2OS4xIDM1OS4yYy0zLjQgNS44LTUuMSAxMi4zLTUuMSAxOSAwIDIwLjkgMTYuOSAzNy44IDM3LjggMzcuOGwyNDQuNCAwLTQ4LTQ4LTE3OC42IDAgMTIuOS0yMi4xek0yMjAuMSA0NjRjOS45IDI4IDM2LjYgNDggNjcuOSA0OHM1OC0yMCA2Ny45LTQ4bC0xMzUuOCAweiJdCiAgICB9OwogICAgZmFTdGFyID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogInN0YXIiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMTA4OCwgNjE0NDZdLCAiZjAwNSIsICJNMjg4LjEtMzJjOSAwIDE3LjMgNS4xIDIxLjQgMTMuMUwzODMgMTI1LjMgNTQyLjkgMTUwLjdjOC45IDEuNCAxNi4zIDcuNyAxOS4xIDE2LjNzLjUgMTgtNS44IDI0LjRMNDQxLjcgMzA1LjkgNDY3IDQ2NS44YzEuNCA4LjktMi4zIDE3LjktOS42IDIzLjJzLTE3IDYuMS0yNSAyTDI4OC4xIDQxNy42IDE0My44IDQ5MWMtOCA0LjEtMTcuNyAzLjMtMjUtMnMtMTEtMTQuMi05LjYtMjMuMkwxMzQuNCAzMDUuOSAyMCAxOTEuNGMtNi40LTYuNC04LjYtMTUuOC01LjgtMjQuNHMxMC4xLTE0LjkgMTkuMS0xNi4zbDE1OS45LTI1LjQgNzMuNi0xNDQuMmM0LjEtOCAxMi40LTEzLjEgMjEuNC0xMy4xem0wIDc2LjhMMjMwLjMgMTU4Yy0zLjUgNi44LTEwIDExLjYtMTcuNiAxMi44bC0xMjUuNSAyMCA4OS44IDg5LjljNS40IDUuNCA3LjkgMTMuMSA2LjcgMjAuN2wtMTkuOCAxMjUuNSAxMTMuMy01Ny42YzYuOC0zLjUgMTQuOS0zLjUgMjEuOCAwbDExMy4zIDU3LjYtMTkuOC0xMjUuNWMtMS4yLTcuNiAxLjMtMTUuMyA2LjctMjAuN2w4OS44LTg5LjktMTI1LjUtMjBjLTcuNi0xLjItMTQuMS02LTE3LjYtMTIuOEwyODguMSA0NC44eiJdCiAgICB9OwogICAgZmFGbGFnID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZsYWciLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjc5ODgsIDYxNzI1XSwgImYwMjQiLCAiTTQ4IDI0QzQ4IDEwLjcgMzcuMyAwIDI0IDBTMCAxMC43IDAgMjRMMCA0ODhjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTEwMCA4MC4zLTIwLjFjNDEuMS0xMC4zIDg0LjYtNS41IDEyMi41IDEzLjQgNDQuMiAyMi4xIDk1LjUgMjQuOCAxNDEuNyA3LjRsMzQuNy0xM2MxMi41LTQuNyAyMC44LTE2LjYgMjAuOC0zMGwwLTI3OS43YzAtMjMtMjQuMi0zOC00NC44LTI3LjdsLTkuNiA0LjhjLTQ2LjMgMjMuMi0xMDAuOCAyMy4yLTE0Ny4xIDAtMzUuMS0xNy42LTc1LjQtMjItMTEzLjUtMTIuNUw0OCA1MiA0OCAyNHptMCA3Ny41bDk2LjYtMjQuMmMyNy02LjcgNTUuNS0zLjYgODAuNCA4LjggNTQuOSAyNy40IDExOC43IDI5LjcgMTc1IDYuOGwwIDI0MS44LTI0LjQgOS4xYy0zMy43IDEyLjYtNzEuMiAxMC43LTEwMy40LTUuNC00OC4yLTI0LjEtMTAzLjMtMzAuMS0xNTUuNi0xNy4xbC02OC42IDE3LjIgMC0yMzd6Il0KICAgIH07CiAgICBmYUxlbW9uID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImxlbW9uIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI3ODE5XSwgImYwOTQiLCAiTTM2OCA4MGMtMy4yIDAtNi4yIC40LTguOSAxLjMtMTkuMSA1LjUtNDYuMSAxMC43LTc0LjMgMy4zLTU3LjQtMTQuOS0xMjQuNiA3LjQtMTc0LjcgNTcuNVMzNy43IDI1OS40IDUyLjYgMzE2LjhjNy4zIDI4LjIgMi4yIDU1LjItMy4zIDc0LjMtLjggMi44LTEuMyA1LjgtMS4zIDguOSAwIDE3LjcgMTQuMyAzMiAzMiAzMiAzLjIgMCA2LjItLjQgOC45LTEuMyAxOS4xLTUuNSA0Ni4xLTEwLjcgNzQuMy0zLjMgNTcuNCAxNC45IDEyNC42LTcuNCAxNzQuNy01Ny41czcyLjQtMTE3LjMgNTcuNS0xNzQuN2MtNy4zLTI4LjItMi4yLTU1LjIgMy4zLTc0LjMgLjgtMi44IDEuMy01LjggMS4zLTguOSAwLTE3LjctMTQuMy0zMi0zMi0zMnptMC00OGM0NC4yIDAgODAgMzUuOCA4MCA4MCAwIDcuNy0xLjEgMTUuMi0zLjEgMjIuMy00LjYgMTUuOC03LjEgMzIuOS0zIDQ4LjkgMjAuMSA3Ny42LTEwLjkgMTYxLjUtNzAgMjIwLjdzLTE0My4xIDkwLjItMjIwLjcgNzBjLTE2LTQuMS0zMy0xLjYtNDguOSAzLTcuMSAyLTE0LjYgMy4xLTIyLjMgMy4xLTQ0LjIgMC04MC0zNS44LTgwLTgwIDAtNy43IDEuMS0xNS4yIDMuMS0yMi4zIDQuNi0xNS44IDcuMS0zMi45IDMtNDguOS0yMC4xLTc3LjYgMTAuOS0xNjEuNSA3MC0yMjAuN1MyMTkuMyAxOCAyOTYuOCAzOC4xYzE2IDQuMSAzMyAxLjYgNDguOS0zIDcuMS0yIDE0LjYtMy4xIDIyLjMtMy4xek0yNDYuNyAxNjdjLTUyIDE1LjItOTYuNSA1OS43LTExMS43IDExMS43LTMuNyAxMi43LTE3LjEgMjAtMjkuOCAxNi4zUzg1LjIgMjc4IDg5IDI2NS4zYzE5LjgtNjcuNyA3Ni42LTEyNC41IDE0NC4zLTE0NC4zIDEyLjctMy43IDI2LjEgMy42IDI5LjggMTYuM3MtMy42IDI2LjEtMTYuMyAyOS44eiJdCiAgICB9OwogICAgZmFXaW5kb3dSZXN0b3JlID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogIndpbmRvdy1yZXN0b3JlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYyZDIiLCAiTTUxMiA4MEwyMjQgODBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDE2LTQ4IDAgMC0xNmMwLTM1LjMgMjguNy02NCA2NC02NGwyODggMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDE5MmMwIDM1LjMtMjguNyA2NC02NCA2NGwtNDggMCAwLTQ4IDQ4IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMTkyYzAtOC44LTcuMi0xNi0xNi0xNnpNMzY4IDI4OGwtMzIwIDAgMCAxMjhjMCA4LjggNy4yIDE2IDE2IDE2bDI4OCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTEyOHpNNjQgMTYwbDI4OCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMTkyYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAyMjRjMC0zNS4zIDI4LjctNjQgNjQtNjR6Il0KICAgIH07CiAgICBmYUZhY2VHcmluSGVhcnRzID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi1oZWFydHMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MjUsICJncmluLWhlYXJ0cyJdLCAiZjU4NCIsICJNNDY0IDI1NmMwIDExNC45LTkzLjEgMjA4LTIwOCAyMDhTNDggMzcwLjkgNDggMjU2YzAtMy41IC4xLTcuMSAuMy0xMC42LTE0LTEzLjktMjkuNy0zMy4xLTM5LjMtNTYuNy01LjggMjEuNC04LjkgNDQtOC45IDY3LjMgMCAxNDEuNCAxMTQuNiAyNTYgMjU2IDI1NlM1MTIgMzk3LjQgNTEyIDI1NmMwLTIzLjMtMy4xLTQ1LjktOC45LTY3LjMtOS42IDIzLjctMjUuNCA0Mi44LTM5LjMgNTYuNyAuMiAzLjUgLjMgNyAuMyAxMC42ek0zNjggNTguOWMxMS43LTYgMjQuNS05LjYgMzcuNy0xMC42LTQyLjEtMzAuNC05My44LTQ4LjMtMTQ5LjctNDguM1MxNDguNCAxNy45IDEwNi4zIDQ4LjNjMTMuMiAxIDI2IDQuNiAzNy43IDEwLjYgMTMuOC03LjEgMjkuMy0xMC45IDQ1LjEtMTAuOWwyLjkgMGM4LjkgMCAxNy42IDEuMiAyNS44IDMuNSAxMi40LTIuMyAyNS4yLTMuNSAzOC4yLTMuNXMyNS44IDEuMiAzOC4yIDMuNWM4LjItMi4zIDE2LjktMy41IDI1LjgtMy41bDIuOSAwYzE1LjggMCAzMS4zIDMuOCA0NS4xIDEwLjl6bTQuMiAyNDMuNGMtMzQuOCAxMC42LTc0LjMgMTYuNi0xMTYuMyAxNi42LTQxLjkgMC04MS40LTYtMTE2LjEtMTYuNS0xMS44LTMuNi0yMy43IDYuMS0xOS42IDE3LjggMTkuOCA1NS45IDczLjEgOTUuOSAxMzUuOCA5NS45IDYyLjcgMCAxMTYtNDAuMSAxMzUuOC05NiA0LjEtMTEuNi03LjgtMjEuNC0xOS42LTE3Ljh6TTMyMi45IDk2TDMyMCA5NmMtMjYuNSAwLTQ4IDIxLjUtNDggNDggMCA1My40IDY2LjkgOTUuNyA4OSAxMDguMiA0LjQgMi41IDkuNiAyLjUgMTQgMCAyMi4xLTEyLjUgODktNTQuOCA4OS0xMDguMiAwLTI2LjUtMjEuNS00OC00OC00OGwtMi45IDBjLTEzLjUgMC0yNi41IDUuNC0zNiAxNC45bC05LjEgOS4xLTkuMS05LjFjLTkuNS05LjUtMjIuNS0xNC45LTM2LTE0Ljl6bS0xODggMTQuOWMtOS41LTkuNS0yMi41LTE0LjktMzYtMTQuOUw5NiA5NmMtMjYuNSAwLTQ4IDIxLjUtNDggNDggMCA1My40IDY2LjkgOTUuNyA4OSAxMDguMiA0LjQgMi41IDkuNiAyLjUgMTQgMCAyMi4xLTEyLjUgODktNTQuOCA4OS0xMDguMiAwLTI2LjUtMjEuNS00OC00OC00OGwtMi45IDBjLTEzLjUgMC0yNi41IDUuNC0zNiAxNC45bC05LjEgOS4xLTkuMS05LjF6Il0KICAgIH07CiAgICBmYUdyaW5IZWFydHMgPSBmYUZhY2VHcmluSGVhcnRzOwogICAgZmFGYWNlS2lzc0JlYW0gPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1raXNzLWJlYW0iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MzcsICJraXNzLWJlYW0iXSwgImY1OTciLCAiTTQ2NCAyNTZhMjA4IDIwOCAwIDEgMCAtNDE2IDAgMjA4IDIwOCAwIDEgMCA0MTYgMHpNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMjQwIDE2bDMyIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDggMCAxMi4zLTQuNiAyMy41LTEyLjIgMzIgNy42IDguNSAxMi4yIDE5LjcgMTIuMiAzMiAwIDI2LjUtMjEuNSA0OC00OCA0OGwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNmwxNiAwYzguOCAwIDE2LTcuMiAxNi0xNnMtNy4yLTE2LTE2LTE2bC0xNiAwYy04LjggMC0xNi03LjItMTYtMTZzNy4yLTE2IDE2LTE2bDE2IDBjOC44IDAgMTYtNy4yIDE2LTE2cy03LjItMTYtMTYtMTZsLTE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZ6bS02NC05MmMtMTUuNSAwLTI4IDEyLjUtMjggMjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0zNy42IDMwLjQtNjggNjgtNjhzNjggMzAuNCA2OCA2OGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTE1LjUtMTIuNS0yOC0yOC0yOHptMTMyIDI4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMzcuNiAzMC40LTY4IDY4LTY4czY4IDMwLjQgNjggNjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0xNS41LTEyLjUtMjgtMjgtMjhzLTI4IDEyLjUtMjggMjh6Il0KICAgIH07CiAgICBmYUtpc3NCZWFtID0gZmFGYWNlS2lzc0JlYW07CiAgICBmYUZpbGVQZGYgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1wZGYiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjFjMSIsICJNMjA4IDQ4TDk2IDQ4Yy04LjggMC0xNiA3LjItMTYgMTZsMCAzODRjMCA4LjggNy4yIDE2IDE2IDE2bDgwIDAgMCA0OC04MCAwYy0zNS4zIDAtNjQtMjguNy02NC02NEwzMiA2NEMzMiAyOC43IDYwLjcgMCA5NiAwTDIyOS41IDBjMTcgMCAzMy4zIDYuNyA0NS4zIDE4LjdMMzk3LjMgMTQxLjNjMTIgMTIgMTguNyAyOC4zIDE4LjcgNDUuM2wwIDE0OS41LTQ4IDAgMC0xMjgtODggMGMtMzkuOCAwLTcyLTMyLjItNzItNzJsMC04OHpNMzQ4LjEgMTYwTDI1NiA2Ny45IDI1NiAxMzZjMCAxMy4zIDEwLjcgMjQgMjQgMjRsNjguMSAwek0yNDAgMzgwbDMyIDBjMzMuMSAwIDYwIDI2LjkgNjAgNjBzLTI2LjkgNjAtNjAgNjBsLTEyIDAgMCAyOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC0xMjhjMC0xMSA5LTIwIDIwLTIwem0zMiA4MGMxMSAwIDIwLTkgMjAtMjBzLTktMjAtMjAtMjBsLTEyIDAgMCA0MCAxMiAwem05Ni04MGwzMiAwYzI4LjcgMCA1MiAyMy4zIDUyIDUybDAgNjRjMCAyOC43LTIzLjMgNTItNTIgNTJsLTMyIDBjLTExIDAtMjAtOS0yMC0yMGwwLTEyOGMwLTExIDktMjAgMjAtMjB6bTMyIDEyOGM2LjYgMCAxMi01LjQgMTItMTJsMC02NGMwLTYuNi01LjQtMTItMTItMTJsLTEyIDAgMCA4OCAxMiAwem03Ni0xMDhjMC0xMSA5LTIwIDIwLTIwbDQ4IDBjMTEgMCAyMCA5IDIwIDIwcy05IDIwLTIwIDIwbC0yOCAwIDAgMjQgMjggMGMxMSAwIDIwIDkgMjAgMjBzLTkgMjAtMjAgMjBsLTI4IDAgMCA0NGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC0xMjh6Il0KICAgIH07CiAgICBmYUZhY2VHcmluV2lkZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWdyaW4td2lkZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODUxNSwgImdyaW4tYWx0Il0sICJmNTgxIiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDAgLTQxNiAwIDIwOCAyMDggMCAxIDAgNDE2IDB6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTM3Mi4yIDQ2LjNjMTEuOC0zLjYgMjMuNyA2LjEgMTkuNiAxNy44LTE5LjggNTUuOS03My4xIDk2LTEzNS44IDk2LTYyLjcgMC0xMTYtNDAtMTM1LjgtOTUuOS00LjEtMTEuNiA3LjgtMjEuNCAxOS42LTE3LjggMzQuNyAxMC42IDc0LjIgMTYuNSAxMTYuMSAxNi41IDQyIDAgODEuNS02IDExNi4zLTE2LjZ6TTIyNCAxOTJjMCAzNS4zLTE0LjMgNjQtMzIgNjRzLTMyLTI4LjctMzItNjQgMTQuMy02NCAzMi02NCAzMiAyOC43IDMyIDY0em05NiA2NGMtMTcuNyAwLTMyLTI4LjctMzItNjRzMTQuMy02NCAzMi02NCAzMiAyOC43IDMyIDY0LTE0LjMgNjQtMzIgNjR6Il0KICAgIH07CiAgICBmYUdyaW5BbHQgPSBmYUZhY2VHcmluV2lkZTsKICAgIGZhRmFjZUxhdWdoU3F1aW50ID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2UtbGF1Z2gtc3F1aW50IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImxhdWdoLXNxdWludCJdLCAiZjU5YiIsICJNNDY0IDI1NmEyMDggMjA4IDAgMSAwIC00MTYgMCAyMDggMjA4IDAgMSAwIDQxNiAwek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0xMjUuMiA3Ni40Yy02LjUtMTQgNS0yOC40IDIwLjQtMjguNGwyMjAuOCAwYzE1LjQgMCAyNi44IDE0LjQgMjAuNCAyOC40LTIyLjggNDkuNC03Mi44IDgzLjYtMTMwLjggODMuNnMtMTA3LjktMzQuMi0xMzAuOC04My42em0tMi42LTE3My4yYzQuNS02LjggMTMuMy05LjIgMjAuNi01LjVsNzkuNiA0MGM1LjQgMi43IDguOCA4LjIgOC44IDE0LjNzLTMuNCAxMS42LTguOCAxNC4zbC03OS42IDQwYy03LjMgMy42LTE2LjEgMS4zLTIwLjYtNS41cy0zLjEtMTUuOSAzLjEtMjEuMUwxNTkgMjA4IDEyNS44IDE4MC4zYy02LjItNS4yLTcuNi0xNC4zLTMuMS0yMS4xem0yNjMuNiAyMS4xTDM1MyAyMDggMzg2LjIgMjM1LjdjNi4yIDUuMiA3LjYgMTQuMyAzLjEgMjEuMXMtMTMuMyA5LjItMjAuNiA1LjVsLTc5LjYtNDBjLTUuNC0yLjctOC44LTguMi04LjgtMTQuM3MzLjQtMTEuNiA4LjgtMTQuM2w3OS42LTQwYzcuMy0zLjYgMTYuMS0xLjMgMjAuNiA1LjVzMy4xIDE1LjktMy4xIDIxLjF6Il0KICAgIH07CiAgICBmYUxhdWdoU3F1aW50ID0gZmFGYWNlTGF1Z2hTcXVpbnQ7CiAgICBmYUZhY2VLaXNzV2lua0hlYXJ0ID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2Uta2lzcy13aW5rLWhlYXJ0IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI4NTM2LCAia2lzcy13aW5rLWhlYXJ0Il0sICJmNTk4IiwgIk0zODYgNDM5LjVjLTI5LjIgMTUuNi02Mi41IDI0LjUtOTggMjQuNS0xMTQuOSAwLTIwOC05My4xLTIwOC0yMDhTMTczLjIgNDggMjg4IDQ4YzExMy4yIDAgMjA1LjIgOTAuNCAyMDcuOSAyMDIuOSAxNC4zIDEuNSAyOC42IDYgNDEuOSAxMy43IDIgMS4yIDQgMi40IDUuOSAzLjcgLjItNC4xIC4zLTguMiAuMy0xMi4zIDAtMTQxLjQtMTE0LjYtMjU2LTI1Ni0yNTZTMzIgMTE0LjYgMzIgMjU2IDE0Ni42IDUxMiAyODggNTEyYzQxLjQgMCA4MC41LTkuOCAxMTUuMS0yNy4zLTUuOC0xMi45LTEyLTI4LjUtMTcuMi00NS4yek0yNTYgMjg4YzAgOC44IDcuMiAxNiAxNiAxNmwxNiAwYzguOCAwIDE2IDcuMiAxNiAxNnMtNy4yIDE2LTE2IDE2bC0xNiAwYy04LjggMC0xNiA3LjItMTYgMTZzNy4yIDE2IDE2IDE2bDE2IDBjOC44IDAgMTYgNy4yIDE2IDE2cy03LjIgMTYtMTYgMTZsLTE2IDBjLTguOCAwLTE2IDcuMi0xNiAxNnM3LjIgMTYgMTYgMTZsMzIgMGMyNi41IDAgNDgtMjEuNSA0OC00OCAwLTEyLjMtNC42LTIzLjUtMTIuMi0zMiA3LjYtOC41IDEyLjItMTkuNyAxMi4yLTMyIDAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6bS00OC00OGEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6bTE1Mi00NGwxNiAwYzExIDAgMjAgOSAyMCAyMHM5IDIwIDIwIDIwIDIwLTkgMjAtMjBjMC0zMy4xLTI2LjktNjAtNjAtNjBsLTE2IDBjLTMzLjEgMC02MCAyNi45LTYwIDYwIDAgMTEgOSAyMCAyMCAyMHMyMC05IDIwLTIwIDktMjAgMjAtMjB6TTU0Mi44IDM1MGMtMi4yLTE4LjMtMTIuOS0zNC42LTI4LjktNDMuOC0yOC4xLTE2LjItNjMuOS02LjYtODAuMSAyMS41bC0yLjcgNC42Yy0yNC41IDQyLjUgNy45IDExNy45IDI0LjQgMTUwLjggNS4xIDEwLjEgMTUuNSAxNi4xIDI2LjggMTUuNSAzNi43LTIuMiAxMTguMi0xMS43IDE0Mi44LTU0LjJsMi43LTQuNmMxNi4yLTI4LjEgNi42LTYzLjktMjEuNS04MC4xLTE2LTkuMi0zNS40LTEwLjQtNTIuNC0zLjFsLTkuOCA0LjItMS4zLTEwLjZ6Il0KICAgIH07CiAgICBmYUtpc3NXaW5rSGVhcnQgPSBmYUZhY2VLaXNzV2lua0hlYXJ0OwogICAgZmFDb3B5ID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNvcHkiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjBjNSIsICJNMzg0IDMzNmwtMTkyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTI1NmMwLTguOCA3LjItMTYgMTYtMTZsMTMzLjUgMGM0LjIgMCA4LjMgMS43IDExLjMgNC43bDU4LjUgNTguNWMzIDMgNC43IDcuMSA0LjcgMTEuM0w0MDAgMzIwYzAgOC44LTcuMiAxNi0xNiAxNnpNMTkyIDM4NGwxOTIgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTE5Ny41YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDM3MC43IDE4LjdDMzU4LjcgNi43IDM0Mi41IDAgMzI1LjUgMEwxOTIgMGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCAyNTZjMCAzNS4zIDI4LjcgNjQgNjQgNjR6TTY0IDEyOGMtMzUuMyAwLTY0IDI4LjctNjQgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTkyIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xNi00OCAwIDAgMTZjMCA4LjgtNy4yIDE2LTE2IDE2TDY0IDQ2NGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMjU2YzAtOC44IDcuMi0xNiAxNi0xNmwxNiAwIDAtNDgtMTYgMHoiXQogICAgfTsKICAgIGZhQ2hlc3NLaW5nID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNoZXNzLWtpbmciLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs5ODE4XSwgImY0M2YiLCAiTTIyNC0zMmMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDQwIDQ4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTQ4IDAgMCA4MCAxNjEuOCAwYzIxLjEgMCAzOC4yIDE3LjEgMzguMiAzOC4yIDAgNi40LTEuNiAxMi43LTQuNyAxOC4zTDM1Ny4yIDM3NC41IDQwNS42IDQzNWM2LjcgOC40IDEwLjQgMTguOCAxMC40IDI5LjYgMCAyNi4yLTIxLjIgNDcuNC00Ny40IDQ3LjRMNzkuNCA1MTJjLTI2LjIgMC00Ny40LTIxLjItNDcuNC00Ny40IDAtMTAuOCAzLjctMjEuMiAxMC40LTI5LjZMOTAuOCAzNzQuNSA0LjcgMjE2LjZDMS42IDIxMC45IDAgMjA0LjYgMCAxOTguMiAwIDE3Ny4xIDE3LjEgMTYwIDM4LjIgMTYwbDE2MS44IDAgMC04MC00OCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDQ4IDAgMC00MGMwLTEzLjMgMTAuNy0yNCAyNC0yNHpNMTMxLjggNDAwbC0zLjYgNC40LTQ3LjYgNTkuNiAyODYuNiAwLTQ3LjYtNTkuNi0zLjYtNC40LTE4NC4zIDB6bTEuMS00OC41bC4zIC41IDE4MS42IDAgLjMtLjUgNzguMy0xNDMuNS0zMzguNyAwIDc4LjMgMTQzLjV6Il0KICAgIH07CiAgICBmYVNxdWFyZVBsdXMgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXBsdXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs2MTg0NiwgInBsdXMtc3F1YXJlIl0sICJmMGZlIiwgIk02NCA4MGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzIwYzAgOC44IDcuMiAxNiAxNiAxNmwzMjAgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMjBjMC04LjgtNy4yLTE2LTE2LTE2TDY0IDgwek0wIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NnpNMjAwIDM0NGwwLTY0LTY0IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsNjQgMCAwLTY0YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA2NCA2NCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC02NCAwIDAgNjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjR6Il0KICAgIH07CiAgICBmYVBsdXNTcXVhcmUgPSBmYVNxdWFyZVBsdXM7CiAgICBmYUZpbGVDb2RlID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZpbGUtY29kZSIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMWM5IiwgIk02NCA0OGwxMTIgMCAwIDg4YzAgMzkuOCAzMi4yIDcyIDcyIDcybDg4IDAgMCAyNDBjMCA4LjgtNy4yIDE2LTE2IDE2TDY0IDQ2NGMtOC44IDAtMTYtNy4yLTE2LTE2TDQ4IDY0YzAtOC44IDcuMi0xNiAxNi0xNnpNMjI0IDY3LjlsOTIuMSA5Mi4xLTY4LjEgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC02OC4xek02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI2MS41YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI0Mi43IDE4LjdDMjMwLjcgNi43IDIxNC41IDAgMTk3LjUgMEw2NCAwek0xNzAuMiAyOTUuNmM4LjYtMTAuMSA3LjUtMjUuMi0yLjYtMzMuOHMtMjUuMi03LjUtMzMuOCAyLjZsLTQ4IDU2Yy03LjcgOS03LjcgMjIuMiAwIDMxLjJsNDggNTZjOC42IDEwLjEgMjMuOCAxMS4yIDMzLjggMi42czExLjItMjMuOCAyLjYtMzMuOGwtMzQuNi00MC40IDM0LjYtNDAuNHptODAtMzEuMmMtOC42LTEwLjEtMjMuOC0xMS4yLTMzLjgtMi42cy0xMS4yIDIzLjgtMi42IDMzLjhsMzQuNiA0MC40LTM0LjYgNDAuNGMtOC42IDEwLjEtNy41IDI1LjIgMi42IDMzLjhzMjUuMiA3LjUgMzMuOC0yLjZsNDgtNTZjNy43LTkgNy43LTIyLjIgMC0zMS4ybC00OC01NnoiXQogICAgfTsKICAgIGZhRmFjZUdyaW5XaW5rID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi13aW5rIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImdyaW4td2luayJdLCAiZjU4YyIsICJNNDY0IDI1NmEyMDggMjA4IDAgMSAwIC00MTYgMCAyMDggMjA4IDAgMSAwIDQxNiAwek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0zNzIuMiA0Ni4zYzExLjgtMy42IDIzLjcgNi4xIDE5LjYgMTcuOC0xOS44IDU1LjktNzMuMSA5Ni0xMzUuOCA5Ni02Mi43IDAtMTE2LTQwLTEzNS44LTk1LjktNC4xLTExLjYgNy44LTIxLjQgMTkuNi0xNy44IDM0LjcgMTAuNiA3NC4yIDE2LjUgMTE2LjEgMTYuNSA0MiAwIDgxLjUtNiAxMTYuMy0xNi42ek0xNDQgMjA4YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTE2NCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGMwLTMzLjEgMjYuOS02MCA2MC02MGwxNiAwYzMzLjEgMCA2MCAyNi45IDYwIDYwIDAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMC05LTIwLTIwLTIwbC0xNiAwYy0xMSAwLTIwIDktMjAgMjB6Il0KICAgIH07CiAgICBmYUdyaW5XaW5rID0gZmFGYWNlR3Jpbldpbms7CiAgICBmYU1vbmV5QmlsbDEgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAibW9uZXktYmlsbC0xIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbIm1vbmV5LWJpbGwtYWx0Il0sICJmM2QxIiwgIk0xMTIgMTEyYzAgMzUuMy0yOC43IDY0LTY0IDY0bDAgMTYwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDI4OCAwYzAtMzUuMyAyOC43LTY0IDY0LTY0bDAtMTYwYy0zNS4zIDAtNjQtMjguNy02NC02NGwtMjg4IDB6TTAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjU2YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjh6bTI1NiAxNmExMTIgMTEyIDAgMSAxIDAgMjI0IDExMiAxMTIgMCAxIDEgMC0yMjR6bS0xNiA0NGMtMTEgMC0yMCA5LTIwIDIwIDAgOS43IDYuOSAxNy43IDE2IDE5LjZsMCA0OC40LTQgMGMtMTEgMC0yMCA5LTIwIDIwczkgMjAgMjAgMjBsNDggMGMxMSAwIDIwLTkgMjAtMjBzLTktMjAtMjAtMjBsLTQgMCAwLTY4YzAtMTEtOS0yMC0yMC0yMGwtMTYgMHoiXQogICAgfTsKICAgIGZhTW9uZXlCaWxsQWx0ID0gZmFNb25leUJpbGwxOwogICAgZmFFeWVTbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJleWUtc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjA3MCIsICJNNDEtMjQuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTLTIuMy0uMyA3IDkuMWw1MjggNTI4YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtOTYuNC05Ni40YzIuNy0yLjQgNS40LTQuOCA4LTcuMiA0Ni44LTQzLjUgNzguMS05NS40IDkzLTEzMS4xIDMuMy03LjkgMy4zLTE2LjcgMC0yNC42LTE0LjktMzUuNy00Ni4yLTg3LjctOTMtMTMxLjEtNDcuMS00My43LTExMS44LTgwLjYtMTkyLjYtODAuNi01Ni44IDAtMTA1LjYgMTguMi0xNDYgNDQuMkw0MS0yNC45ek0xNzYuOSAxMTEuMWMzMi4xLTE4LjkgNjkuMi0zMS4xIDExMS4xLTMxLjEgNjUuMiAwIDExOC44IDI5LjYgMTU5LjkgNjcuNyAzOC41IDM1LjcgNjUuMSA3OC4zIDc4LjYgMTA4LjMtMTMuNiAzMC00MC4yIDcyLjUtNzguNiAxMDguMy0zLjEgMi44LTYuMiA1LjYtOS40IDguNEwzOTMuOCAzMjhjMTQtMjAuNSAyMi4yLTQ1LjMgMjIuMi03MiAwLTcwLjctNTcuMy0xMjgtMTI4LTEyOC0yNi43IDAtNTEuNSA4LjItNzIgMjIuMmwtMzkuMS0zOS4xem0xODIgMTgybC0xMDgtMTA4YzExLjEtNS44IDIzLjctOS4xIDM3LjEtOS4xIDQ0LjIgMCA4MCAzNS44IDgwIDgwIDAgMTMuNC0zLjMgMjYtOS4xIDM3LjF6TTEwMy40IDE3My4ybC0zNC0zNGMtMzIuNiAzNi44LTU1IDc1LjgtNjYuOSAxMDQuNS0zLjMgNy45LTMuMyAxNi43IDAgMjQuNiAxNC45IDM1LjcgNDYuMiA4Ny43IDkzIDEzMS4xIDQ3LjEgNDMuNyAxMTEuOCA4MC42IDE5Mi42IDgwLjYgMzcuMyAwIDcxLjItNy45IDEwMS41LTIwLjZMMzUyLjIgNDIyYy0yMCA2LjQtNDEuNCAxMC02NC4yIDEwLTY1LjIgMC0xMTguOC0yOS42LTE1OS45LTY3LjctMzguNS0zNS43LTY1LjEtNzguMy03OC42LTEwOC4zIDEwLjQtMjMuMSAyOC42LTUzLjYgNTQtODIuOHoiXQogICAgfTsKICAgIGZhRmlsZVdvcmQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmlsZS13b3JkIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYxYzIiLCAiTTY0IDQ4bDExMiAwIDAgODhjMCAzOS44IDMyLjIgNzIgNzIgNzJsODggMCAwIDI0MGMwIDguOC03LjIgMTYtMTYgMTZMNjQgNDY0Yy04LjggMC0xNi03LjItMTYtMTZMNDggNjRjMC04LjggNy4yLTE2IDE2LTE2ek0yMjQgNjcuOWw5Mi4xIDkyLjEtNjguMSAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTY4LjF6TTY0IDBDMjguNyAwIDAgMjguNyAwIDY0TDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI1NiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjYxLjVjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNMMjQyLjcgMTguN0MyMzAuNyA2LjcgMjE0LjUgMCAxOTcuNSAwTDY0IDB6bTcxLjMgMjc0LjJjLTMuMi0xMi45LTE2LjItMjAuNy0yOS4xLTE3LjVTODUuNSAyNzMgODguNyAyODUuOGwzMiAxMjhjMi41IDEwLjIgMTEuNCAxNy41IDIxLjkgMTguMXMyMC4xLTUuNyAyMy44LTE1LjVsMjUuNS02OC4xIDI1LjUgNjguMWMzLjcgOS44IDEzLjMgMTYuMSAyMy44IDE1LjVzMTkuNC03LjkgMjEuOS0xOC4xbDMyLTEyOGMzLjItMTIuOS00LjYtMjUuOS0xNy41LTI5LjFzLTI1LjkgNC42LTI5LjEgMTcuNWwtMTMuMyA1My4yLTIwLjktNTUuOEMyMTEgMjYyLjIgMjAyIDI1NiAxOTIgMjU2cy0xOSA2LjItMjIuNSAxNS42bC0yMC45IDU1LjgtMTMuMy01My4yeiJdCiAgICB9OwogICAgZmFGYWNlQW5ncnkgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1hbmdyeSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU0NCwgImFuZ3J5Il0sICJmNTU2IiwgIk0yNTYgNDhhMjA4IDIwOCAwIDEgMSAwIDQxNiAyMDggMjA4IDAgMSAxIDAtNDE2em0wIDQ2NGEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6bTAtMTQ0YzI0LjEgMCA0NS40IDExLjggNTguNSAzMCA3LjcgMTAuOCAyMi43IDEzLjIgMzMuNSA1LjVzMTMuMi0yMi43IDUuNS0zMy41Yy0yMS43LTMwLjItNTcuMy01MC05Ny41LTUwcy03NS43IDE5LjgtOTcuNSA1MGMtNy43IDEwLjgtNS4zIDI1LjggNS41IDMzLjVzMjUuOCA1LjMgMzMuNS01LjVjMTMuMS0xOC4yIDM0LjQtMzAgNTguNS0zMHptLTgwLTk2YzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtLjMgOS43IDMuMmMxMC41IDMuNSAyMS44LTIuMiAyNS4zLTEyLjZzLTIuMi0yMS44LTEyLjYtMjUuM2wtOTYtMzJjLTEwLjUtMy41LTIxLjggMi4yLTI1LjMgMTIuNnMyLjIgMjEuOCAxMi42IDI1LjNsMjguOSA5LjZjLTQuMSA1LjQtNi42IDEyLjEtNi42IDE5LjQgMCAxNy43IDE0LjMgMzIgMzIgMzJ6bTE5Mi0zMmMwLTcuMy0yLjQtMTQtNi42LTE5LjRsMjguOS05LjZjMTAuNS0zLjUgMTYuMS0xNC44IDEyLjYtMjUuM3MtMTQuOC0xNi4xLTI1LjMtMTIuNmwtOTYgMzJjLTEwLjUgMy41LTE2LjEgMTQuOC0xMi42IDI1LjNzMTQuOCAxNi4xIDI1LjMgMTIuNmw5LjctMy4yIDAgLjNjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMnoiXQogICAgfTsKICAgIGZhQW5ncnkgPSBmYUZhY2VBbmdyeTsKICAgIGZhQ2hlc3NLbmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY2hlc3Mta25pZ2h0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbOTgyMl0sICJmNDQxIiwgIk0yMzItMzJjMTEwLjUgMCAyMDAgODkuNSAyMDAgMjAwbDAgMTI3LjdjMCAxOC45LTYuMSAzNy4xLTE3LjIgNTIuMmwtNS4xIDYuMi0zNi4zIDQwLjcgMzIuMSA0MC4yYzYuNyA4LjQgMTAuNCAxOC44IDEwLjQgMjkuNmwtLjIgNC44Yy0yLjQgMjMuOS0yMi42IDQyLjUtNDcuMSA0Mi41bC0yODkuMiAwLTQuOC0uMmMtMjMuOS0yLjQtNDIuNS0yMi42LTQyLjUtNDcuMSAwLTEwLjggMy43LTIxLjIgMTAuNC0yOS42bDM3LjYtNDcgMC0yNC4zYzAtMjQuMyAxMC4xLTQ3LjYgMjcuOC02NC4ybDYzLjUtNTkuNS0xNy40IDAtLjIgLjJjLTIwLjMgMjAuMy00OS42IDI4LjItNzcuMSAyMS4xbC01LjUtMS42Yy0zMC45LTEwLjMtNTIuMy0zOC01NC45LTcwLjFsLS4yLTYuNCAwLTEuNGMwLTE5LjcgNy4xLTM4LjggMTkuOS01My44bDc2LjEtODguOCAwLTQ3LjEgLjEtMi41QzExMy40LTIyLjYgMTIzLjYtMzIgMTM2LTMybDk2IDB6TTgwLjcgNDY0bDI4Ni42IDAtMzguNC00OC0yMDkuOSAwLTM4LjQgNDh6TTE2MCA0OGMwIDUuNy0yLjEgMTEuMy01LjggMTUuNkw3Mi4zIDE1OS4xQzY3IDE2NS40IDY0IDE3My40IDY0IDE4MS43bDAgMS40IC40IDUuMmMxLjkgMTEuOSAxMC4zIDIxLjkgMjEuOSAyNS44bDQuNSAxLjFjMTAuNSAxLjkgMjEuMy0xLjQgMjktOWw3LjItNy4yIDMuNy0zYzMuOS0yLjYgOC41LTQgMTMuMy00bDg4IDBjOS44IDAgMTguNyA2IDIyLjMgMTUuMnMxLjMgMTkuNi01LjkgMjYuM2wtMTA3LjggMTAxYy04LjEgNy42LTEyLjcgMTguMS0xMi43IDI5LjJsMCA0LjMgMjA1LjIgMCA0MC43LTQ1LjggMi4zLTIuOGM1LjEtNi44IDcuOC0xNS4yIDcuOC0yMy43TDM4NCAxNjhjMC04My45LTY4LjEtMTUyLTE1Mi0xNTJsLTcyIDAgMCAzMnptMzIgNzJhMjQgMjQgMCAxIDEgMC00OCAyNCAyNCAwIDEgMSAwIDQ4eiJdCiAgICB9OwogICAgZmFGYWNlR3JpbkJlYW0gPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1ncmluLWJlYW0iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MTYsICJncmluLWJlYW0iXSwgImY1ODIiLCAiTTQ2NCAyNTZhMjA4IDIwOCAwIDEgMCAtNDE2IDAgMjA4IDIwOCAwIDEgMCA0MTYgMHpNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMzcyLjIgNDYuM2MxMS44LTMuNiAyMy43IDYuMSAxOS42IDE3LjgtMTkuOCA1NS45LTczLjEgOTYtMTM1LjggOTYtNjIuNyAwLTExNi00MC0xMzUuOC05NS45LTQuMS0xMS42IDcuOC0yMS40IDE5LjYtMTcuOCAzNC43IDEwLjYgNzQuMiAxNi41IDExNi4xIDE2LjUgNDIgMCA4MS41LTYgMTE2LjMtMTYuNnpNMTc2IDE4MGMtMTUuNSAwLTI4IDEyLjUtMjggMjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0zNy42IDMwLjQtNjggNjgtNjhzNjggMzAuNCA2OCA2OGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTE1LjUtMTIuNS0yOC0yOC0yOHptMTMyIDI4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMzcuNiAzMC40LTY4IDY4LTY4czY4IDMwLjQgNjggNjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0xNS41LTEyLjUtMjgtMjgtMjhzLTI4IDEyLjUtMjggMjh6Il0KICAgIH07CiAgICBmYUdyaW5CZWFtID0gZmFGYWNlR3JpbkJlYW07CiAgICBmYUhhbmRQZWFjZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kLXBlYWNlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbOTk5Nl0sICJmMjViIiwgIk0yMTkgMS40Yy0zNS4yLTMuNy02Ni42IDIxLjgtNzAuMyA1N2wtNi40IDYwLjYtMTcuNC00OS40QzExMy4yIDM2LjMgNzYuNiAxOC44IDQzLjMgMzAuNVMtNy42IDc4LjggNC4xIDExMi4xTDU2LjkgMjYyLjJDNDEuNyAyNzYuNyAzMi4yIDI5Ny4zIDMyLjIgMzIwbDAgMjRjMCA5Mi44IDc1LjIgMTY4IDE2OCAxNjhsNDggMGM5Mi44IDAgMTY4LTc1LjIgMTY4LTE2OGwwLTEyMGMwLTM1LjMtMjguNy02NC02NC02NC03LjkgMC0xNS40IDEuNC0yMi40IDQtMTAuNC0yMS4zLTMyLjMtMzYtNTcuNi0zNi0uNyAwLTEuNSAwLTIuMiAwbDUuOS01Ni4zYzMuNy0zNS4yLTIxLjgtNjYuNi01Ny03MC4zem0tLjIgMTU1LjRjLTYuNiAxMC4xLTEwLjUgMjIuMi0xMC41IDM1LjJsMCA0OGMwIC43IDAgMS40IDAgMi01LjEtMS4zLTEwLjUtMi0xNi0ybC03LjQgMC01LjQtMTUuMyAxNy0xNjEuM2MuOS04LjggOC44LTE1LjIgMTcuNi0xNC4yczE1LjIgOC44IDE0LjIgMTcuNmwtOS41IDkwLjF6TTc5LjYgODUuNmw1NC4zIDE1NC40LTIxLjcgMGMtNCAwLTggLjMtMTEuOSAuOUw0OS40IDk2LjJjLTIuOS04LjMgMS41LTE3LjUgOS44LTIwLjRzMTcuNSAxLjUgMjAuNCA5Ljh6TTI1Ni4yIDE5MmMwLTguOCA3LjItMTYgMTYtMTZzMTYgNy4yIDE2IDE2bDAgNDhjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC00OHptMzguNCAxMDhjMTAuNCAyMS4zIDMyLjMgMzYgNTcuNiAzNiA1LjUgMCAxMC45LS43IDE2LTJsMCAxMGMwIDY2LjMtNTMuNyAxMjAtMTIwIDEyMGwtNDggMGMtNjYuMyAwLTEyMC01My43LTEyMC0xMjBsMC0yNGMwLTE3LjcgMTQuMy0zMiAzMi0zMmw4MCAwYzguOCAwIDE2IDcuMiAxNiAxNnMtNy4yIDE2LTE2IDE2bC00MCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDQwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjQgMC0uNyAwLTEuNCAwLTIgNS4xIDEuMyAxMC41IDIgMTYgMiA3LjkgMCAxNS40LTEuNCAyMi40LTR6bTczLjYtMjhjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC00OGMwLTguOCA3LjItMTYgMTYtMTZzMTYgNy4yIDE2IDE2bDAgNDh6Il0KICAgIH07CiAgICBmYUNvbXBhc3MgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiY29tcGFzcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyOTUxN10sICJmMTRlIiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDAgLTQxNiAwIDIwOCAyMDggMCAxIDAgNDE2IDB6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTMwNi43IDY5LjFMMTYyLjQgMzgwLjZjLTE5LjQgNy41LTM4LjUtMTEuNi0zMS0zMWw1NS41LTE0NC4zYzMuMy04LjUgOS45LTE1LjEgMTguNC0xOC40bDE0NC4zLTU1LjVjMTkuNC03LjUgMzguNSAxMS42IDMxIDMxTDMyNS4xIDMwNi43Yy0zLjMgOC41LTkuOSAxNS4xLTE4LjQgMTguNHpNMjg4IDI1NmEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAweiJdCiAgICB9OwogICAgZmFTcXVhcmUgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbOTYzMiwgOTcyMywgOTcyNCwgNjE1OTBdLCAiZjBjOCIsICJNMzg0IDgwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyMGMwIDguOC03LjIgMTYtMTYgMTZMNjQgNDMyYy04LjggMC0xNi03LjItMTYtMTZMNDggOTZjMC04LjggNy4yLTE2IDE2LTE2bDMyMCAwek02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyeiJdCiAgICB9OwogICAgZmFGYWNlR3JpbiA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWdyaW4iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MTIsICJncmluIl0sICJmNTgwIiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDAgLTQxNiAwIDIwOCAyMDggMCAxIDAgNDE2IDB6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTM3Mi4yIDQ2LjNjMTEuOC0zLjYgMjMuNyA2LjEgMTkuNiAxNy44LTE5LjggNTUuOS03My4xIDk2LTEzNS44IDk2LTYyLjcgMC0xMTYtNDAtMTM1LjgtOTUuOS00LjEtMTEuNiA3LjgtMjEuNCAxOS42LTE3LjggMzQuNyAxMC42IDc0LjIgMTYuNSAxMTYuMSAxNi41IDQyIDAgODEuNS02IDExNi4zLTE2LjZ6TTE0NCAyMDhhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptMTkyLTMyYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhR3JpbiA9IGZhRmFjZUdyaW47CiAgICBmYUZhY2VTbWlsZSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLXNtaWxlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTc4LCAic21pbGUiXSwgImYxMTgiLCAiTTQ2NCAyNTZhMjA4IDIwOCAwIDEgMCAtNDE2IDAgMjA4IDIwOCAwIDEgMCA0MTYgMHpNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMTc3LjMgNjMuNEMxOTIuMyAzMzUgMjE4LjQgMzUyIDI1NiAzNTJzNjMuNy0xNyA3OC43LTMyLjZjOS4yLTkuNiAyNC40LTkuOSAzMy45LS43czkuOSAyNC40IC43IDMzLjljLTIyLjEgMjMtNjAgNDcuNC0xMTMuMyA0Ny40cy05MS4yLTI0LjQtMTEzLjMtNDcuNGMtOS4yLTkuNi04LjktMjQuOCAuNy0zMy45czI0LjgtOC45IDMzLjkgLjd6TTE0NCAyMDhhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptMTkyLTMyYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhU21pbGUgPSBmYUZhY2VTbWlsZTsKICAgIGZhRmFjZVNtaWxlQmVhbSA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLXNtaWxlLWJlYW0iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MjIsICJzbWlsZS1iZWFtIl0sICJmNWI4IiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDAgLTQxNiAwIDIwOCAyMDggMCAxIDAgNDE2IDB6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTE3Ny4zIDYzLjRDMTkyLjMgMzM1IDIxOC40IDM1MiAyNTYgMzUyczYzLjctMTcgNzguNy0zMi42YzkuMi05LjYgMjQuNC05LjkgMzMuOS0uN3M5LjkgMjQuNCAuNyAzMy45Yy0yMi4xIDIzLTYwIDQ3LjQtMTEzLjMgNDcuNHMtOTEuMi0yNC40LTExMy4zLTQ3LjRjLTkuMi05LjYtOC45LTI0LjggLjctMzMuOXMyNC44LTguOSAzMy45IC43ek0xNzYgMTgwYy0xNS41IDAtMjggMTIuNS0yOCAyOGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTM3LjYgMzAuNC02OCA2OC02OHM2OCAzMC40IDY4IDY4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMTUuNS0xMi41LTI4LTI4LTI4em0xMzIgMjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0zNy42IDMwLjQtNjggNjgtNjhzNjggMzAuNCA2OCA2OGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTE1LjUtMTIuNS0yOC0yOC0yOHMtMjggMTIuNS0yOCAyOHoiXQogICAgfTsKICAgIGZhU21pbGVCZWFtID0gZmFGYWNlU21pbGVCZWFtOwogICAgZmFGb2xkZXJDbG9zZWQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZm9sZGVyLWNsb3NlZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMTg1IiwgIk00NDggNDAwTDY0IDQwMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMTQ0IDQxNiAwIDAgMTQ0YzAgOC44LTcuMiAxNi0xNiAxNnptMTYtMjA4bC00MTYgMCAwLTk2YzAtOC44IDcuMi0xNiAxNi0xNmwxMzguNyAwYzMuNSAwIDYuOCAxLjEgOS42IDMuMkwyNTAuNyAxMTJjMTMuOCAxMC40IDMwLjcgMTYgNDggMTZMNDQ4IDEyOGM4LjggMCAxNiA3LjIgMTYgMTZsMCA0OHpNNjQgNDQ4bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjQwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDI5OC43IDgwYy02LjkgMC0xMy43LTIuMi0xOS4yLTYuNEwyNDEuMSA0NC44QzIzMCAzNi41IDIxNi41IDMyIDIwMi43IDMyTDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjR6Il0KICAgIH07CiAgICBmYUtleWJvYXJkID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImtleWJvYXJkIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbOWUzXSwgImYxMWMiLCAiTTY0IDExMmMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMjU2YzAgOC44IDcuMiAxNiAxNiAxNmw0NDggMGM4LjggMCAxNi03LjIgMTYtMTZsMC0yNTZjMC04LjgtNy4yLTE2LTE2LTE2TDY0IDExMnpNMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsNDQ4IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyNTZjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDQ4Yy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDEyOHpNMTc2IDMyMGwyMjQgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAxNmMwIDguOC03LjIgMTYtMTYgMTZsLTIyNCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0xNmMwLTguOCA3LjItMTYgMTYtMTZ6bS03Mi03MmMwLTguOCA3LjItMTYgMTYtMTZsMTYgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAxNmMwIDguOC03LjIgMTYtMTYgMTZsLTE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTE2em0xNi05NmwxNiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDE2YzAgOC44LTcuMiAxNi0xNiAxNmwtMTYgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMTZjMC04LjggNy4yLTE2IDE2LTE2em02NCA5NmMwLTguOCA3LjItMTYgMTYtMTZsMTYgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAxNmMwIDguOC03LjIgMTYtMTYgMTZsLTE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTE2em0xNi05NmwxNiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDE2YzAgOC44LTcuMiAxNi0xNiAxNmwtMTYgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMTZjMC04LjggNy4yLTE2IDE2LTE2em02NCA5NmMwLTguOCA3LjItMTYgMTYtMTZsMTYgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAxNmMwIDguOC03LjIgMTYtMTYgMTZsLTE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTE2em0xNi05NmwxNiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDE2YzAgOC44LTcuMiAxNi0xNiAxNmwtMTYgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMTZjMC04LjggNy4yLTE2IDE2LTE2em02NCA5NmMwLTguOCA3LjItMTYgMTYtMTZsMTYgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAxNmMwIDguOC03LjIgMTYtMTYgMTZsLTE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTE2em0xNi05NmwxNiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDE2YzAgOC44LTcuMiAxNi0xNiAxNmwtMTYgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMTZjMC04LjggNy4yLTE2IDE2LTE2em02NCA5NmMwLTguOCA3LjItMTYgMTYtMTZsMTYgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAxNmMwIDguOC03LjIgMTYtMTYgMTZsLTE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTE2em0xNi05NmwxNiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDE2YzAgOC44LTcuMiAxNi0xNiAxNmwtMTYgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMTZjMC04LjggNy4yLTE2IDE2LTE2eiJdCiAgICB9OwogICAgZmFGYWNlUm9sbGluZ0V5ZXMgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1yb2xsaW5nLWV5ZXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1ODAsICJtZWgtcm9sbGluZy1leWVzIl0sICJmNWE1IiwgIk0yNTYgNDhhMjA4IDIwOCAwIDEgMSAwIDQxNiAyMDggMjA4IDAgMSAxIDAtNDE2em0wIDQ2NGEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTE3NiAzNzZjMCAxMy4zIDEwLjcgMjQgMjQgMjRsMTEyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTExMiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHpNMTYwIDI2NGMtMjIuMSAwLTQwLTE3LjktNDAtNDAgMC05LjUgMy4zLTE4LjEgOC44LTI1IDMuMiAxNC4zIDE2IDI1IDMxLjIgMjVzMjgtMTAuNyAzMS4yLTI1YzUuNSA2LjggOC44IDE1LjUgOC44IDI1IDAgMjIuMS0xNy45IDQwLTQwIDQwem0wIDQwYTgwIDgwIDAgMSAwIDAtMTYwIDgwIDgwIDAgMSAwIDAgMTYwem0xOTItNDBjLTIyLjEgMC00MC0xNy45LTQwLTQwIDAtOS41IDMuMy0xOC4xIDguOC0yNSAzLjIgMTQuMyAxNiAyNSAzMS4yIDI1czI4LTEwLjcgMzEuMi0yNWM1LjUgNi44IDguOCAxNS41IDguOCAyNSAwIDIyLjEtMTcuOSA0MC00MCA0MHptMCA0MGE4MCA4MCAwIDEgMCAwLTE2MCA4MCA4MCAwIDEgMCAwIDE2MHoiXQogICAgfTsKICAgIGZhTWVoUm9sbGluZ0V5ZXMgPSBmYUZhY2VSb2xsaW5nRXllczsKICAgIGZhRmFjZUdyaW1hY2UgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1ncmltYWNlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTU2LCAiZ3JpbWFjZSJdLCAiZjU3ZiIsICJNMjU2IDQ4YTIwOCAyMDggMCAxIDAgMCA0MTYgMjA4IDIwOCAwIDEgMCAwLTQxNnpNNTEyIDI1NmEyNTYgMjU2IDAgMSAxIC01MTIgMCAyNTYgMjU2IDAgMSAxIDUxMiAwek0xNTIgMzUyYzAgMTEuOSA4LjYgMjEuOCAyMCAyMy43bDAtNDcuM2MtMTEuNCAxLjktMjAgMTEuOC0yMCAyMy43em04NCAyNGwwLTQ4LTI0IDAgMCA0OCAyNCAwem02NCAwbDAtNDgtMjQgMCAwIDQ4IDI0IDB6bTQwLS4zYzExLjQtMS45IDIwLTExLjggMjAtMjMuN3MtOC42LTIxLjgtMjAtMjMuN2wwIDQ3LjN6TTE3NiAyODhsMTYwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRzLTI4LjcgNjQtNjQgNjRsLTE2MCAwYy0zNS4zIDAtNjQtMjguNy02NC02NHMyOC43LTY0IDY0LTY0em0wLTExMmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6bTEyOCAzMmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAweiJdCiAgICB9OwogICAgZmFHcmltYWNlID0gZmFGYWNlR3JpbWFjZTsKICAgIGZhQ2lyY2xlRG90ID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1kb3QiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgyODAsICJkb3QtY2lyY2xlIl0sICJmMTkyIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDEgMC01MTIgMjU2IDI1NiAwIDEgMSAwIDUxMnptMC00NjRhMjA4IDIwOCAwIDEgMCAwIDQxNiAyMDggMjA4IDAgMSAwIDAtNDE2em0wIDMwNGE5NiA5NiAwIDEgMSAwLTE5MiA5NiA5NiAwIDEgMSAwIDE5MnoiXQogICAgfTsKICAgIGZhRG90Q2lyY2xlID0gZmFDaXJjbGVEb3Q7CiAgICBmYU9iamVjdEdyb3VwID0gewogICAgICBwcmVmaXg6ICJmYXIiLAogICAgICBpY29uTmFtZTogIm9iamVjdC1ncm91cCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMjQ3IiwgIk00MCA2NGEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwem00OCA1OS4zYzE2LTYuNSAyOC45LTE5LjMgMzUuMy0zNS4zbDMyOS4zIDBjNi41IDE2IDE5LjMgMjguOSAzNS4zIDM1LjNsMCAyNjUuM2MtMTYgNi41LTI4LjkgMTkuMy0zNS4zIDM1LjNsLTMyOS4zIDBjLTYuNS0xNi0xOS4zLTI4LjktMzUuMy0zNS4zbDAtMjY1LjN6TTUxMiAwYy0yNi45IDAtNDkuOSAxNi41LTU5LjMgNDBMMTIzLjMgNDBDMTEzLjkgMTYuNSA5MC45IDAgNjQgMCAyOC43IDAgMCAyOC43IDAgNjQgMCA5MC45IDE2LjUgMTEzLjkgNDAgMTIzLjNsMCAyNjUuM2MtMjMuNSA5LjUtNDAgMzIuNS00MCA1OS4zIDAgMzUuMyAyOC43IDY0IDY0IDY0IDI2LjkgMCA0OS45LTE2LjUgNTkuMy00MGwzMjkuMyAwYzkuNSAyMy41IDMyLjUgNDAgNTkuMyA0MCAzNS4zIDAgNjQtMjguNyA2NC02NCAwLTI2LjktMTYuNS00OS45LTQwLTU5LjNsMC0yNjUuM2MyMy41LTkuNSA0MC0zMi41IDQwLTU5LjMgMC0zNS4zLTI4LjctNjQtNjQtNjR6TTQ4OCA2NGEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwek02NCA0MjRhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4em00MjQgMjRhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHpNMTkyIDE3Nmw4OCAwIDAgNTYtODggMCAwLTU2em0tOC00MGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA3MmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxMDQgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTcyYzAtMTcuNy0xNC4zLTMyLTMyLTMybC0xMDQgMHptNzIgMTg0bDAgMjRjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTA0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC03MmMwLTE3LjctMTQuMy0zMi0zMi0zMmwtMjQgMGMwIDE0LjYtMy45IDI4LjItMTAuNyA0MGwyNi43IDAgMCA1Ni04OCAwIDAtMTYuNGMtMi42IC4zLTUuMyAuNC04IC40bC0zMiAweiJdCiAgICB9OwogICAgZmFGYWNlRmx1c2hlZCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWZsdXNoZWQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1NjMsICJmbHVzaGVkIl0sICJmNTc5IiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDEgLTQxNiAwIDIwOCAyMDggMCAxIDEgNDE2IDB6TTI1NiAwYTI1NiAyNTYgMCAxIDAgMCA1MTIgMjU2IDI1NiAwIDEgMCAwLTUxMnpNMTYwIDI0OGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6bTIxNi0yNGEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAwek0xOTIgMzUyYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDEyOCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xMjggMHpNMTYwIDE3NmE0OCA0OCAwIDEgMSAwIDk2IDQ4IDQ4IDAgMSAxIDAtOTZ6bTAgMTI4YTgwIDgwIDAgMSAwIDAtMTYwIDgwIDgwIDAgMSAwIDAgMTYwem0xNDQtODBhNDggNDggMCAxIDEgOTYgMCA0OCA0OCAwIDEgMSAtOTYgMHptMTI4IDBhODAgODAgMCAxIDAgLTE2MCAwIDgwIDgwIDAgMSAwIDE2MCAweiJdCiAgICB9OwogICAgZmFGbHVzaGVkID0gZmFGYWNlRmx1c2hlZDsKICAgIGZhU3RhckhhbGZTdHJva2UgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAic3Rhci1oYWxmLXN0cm9rZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJzdGFyLWhhbGYtYWx0Il0sICJmNWMwIiwgIk0zMDkuNS0xOC45Yy00LjEtOC0xMi40LTEzLjEtMjEuNC0xMy4xcy0xNy4zIDUuMS0yMS40IDEzLjFMMTkzLjEgMTI1LjMgMzMuMiAxNTAuN2MtOC45IDEuNC0xNi4zIDcuNy0xOS4xIDE2LjNzLS41IDE4IDUuOCAyNC40bDExNC40IDExNC41LTI1LjIgMTU5LjljLTEuNCA4LjkgMi4zIDE3LjkgOS42IDIzLjJzMTYuOSA2LjEgMjUgMkwyODguMSA0MTcuNiA0MzIuNCA0OTFjOCA0LjEgMTcuNyAzLjMgMjUtMnMxMS0xNC4yIDkuNi0yMy4yTDQ0MS43IDMwNS45IDU1Ni4xIDE5MS40YzYuNC02LjQgOC42LTE1LjggNS44LTI0LjRzLTEwLjEtMTQuOS0xOS4xLTE2LjNMMzgzIDEyNS4zIDMwOS41LTE4Ljl6TTI2NC4xIDkxLjhsMCAyODQuMS0xMDAuMSA1MC45IDE5LjgtMTI1LjVjMS4yLTcuNi0xLjMtMTUuMy02LjctMjAuN2wtODkuOC04OS45IDEyNS41LTIwYzcuNi0xLjIgMTQuMS02IDE3LjYtMTIuOGwzMy44LTY2LjJ6bTQ4IDI4NC4xbDAtMjg0LjEgMzMuOCA2Ni4yYzMuNSA2LjggMTAgMTEuNiAxNy42IDEyLjhsMTI1LjUgMjAtODkuOCA4OS45Yy01LjQgNS40LTcuOSAxMy4xLTYuNyAyMC43bDE5LjggMTI1LjUtMTAwLjEtNTAuOXoiXQogICAgfTsKICAgIGZhU3RhckhhbGZBbHQgPSBmYVN0YXJIYWxmU3Ryb2tlOwogICAgZmFGaWxlVmlkZW8gPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAiZmlsZS12aWRlbyIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMWM4IiwgIk02NCA0OGwxMTIgMCAwIDg4YzAgMzkuOCAzMi4yIDcyIDcyIDcybDg4IDAgMCAyNDBjMCA4LjgtNy4yIDE2LTE2IDE2TDY0IDQ2NGMtOC44IDAtMTYtNy4yLTE2LTE2TDQ4IDY0YzAtOC44IDcuMi0xNiAxNi0xNnpNMjI0IDY3LjlsOTIuMSA5Mi4xLTY4LjEgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC02OC4xek02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI2MS41YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI0Mi43IDE4LjdDMjMwLjcgNi43IDIxNC41IDAgMTk3LjUgMEw2NCAwek04MCAyODhsMCA5NmMwIDE3LjcgMTQuMyAzMiAzMiAzMmw5NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMjQgMzUgMzVjMy4yIDMuMiA3LjUgNSAxMiA1IDkuNCAwIDE3LTcuNiAxNy0xN2wwLTk0LjFjMC05LjQtNy42LTE3LTE3LTE3LTQuNSAwLTguOCAxLjgtMTIgNWwtMzUgMzUgMC0yNGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtOTYgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6Il0KICAgIH07CiAgICBmYUZhY2VMYXVnaCA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWxhdWdoIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImxhdWdoIl0sICJmNTk5IiwgIk00NjQgMjU2YTIwOCAyMDggMCAxIDAgLTQxNiAwIDIwOCAyMDggMCAxIDAgNDE2IDB6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTExOC4zIDU4LjJjLTQuMi0xMy43IDcuMS0yNi4yIDIxLjQtMjYuMmwyMzIuNiAwYzE0LjMgMCAyNS42IDEyLjUgMjEuNCAyNi4yLTE4IDU4LjktNzIuOSAxMDEuOC0xMzcuNyAxMDEuOFMxMzYuMyAzNzMuMSAxMTguMyAzMTQuMnpNMTQ0IDE5MmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0xOTItMzJhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFMYXVnaCA9IGZhRmFjZUxhdWdoOwogICAgZmFIYW5kUG9pbnRlciA9IHsKICAgICAgcHJlZml4OiAiZmFyIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kLXBvaW50ZXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjI1YSIsICJNMTYwIDY0YzAtOC44IDcuMi0xNiAxNi0xNnMxNiA3LjIgMTYgMTZsMCAxMzZjMCAxMC4zIDYuNiAxOS41IDE2LjQgMjIuOHMyMC42LS4xIDI2LjgtOC4zYzMtMy45IDcuNi02LjQgMTIuOC02LjQgOC44IDAgMTYgNy4yIDE2IDE2IDAgMTAuMyA2LjYgMTkuNSAxNi40IDIyLjhzMjAuNi0uMSAyNi44LTguM2MzLTMuOSA3LjYtNi40IDEyLjgtNi40IDcuOCAwIDE0LjMgNS42IDE1LjcgMTMgMS42IDguMiA3LjMgMTUuMSAxNS4xIDE4czE2LjcgMS42IDIzLjMtMy42YzIuNy0yLjEgNi4xLTMuNCA5LjktMy40IDguOCAwIDE2IDcuMiAxNiAxNmwwIDEyMGMwIDM5LjgtMzIuMiA3Mi03MiA3MmwtMTE2LjYgMGMtMzcuNCAwLTcyLjQtMTguNy05My4yLTQ5LjlMNTAuNyAzMTIuOWMtNC45LTcuNC0yLjktMTcuMyA0LjQtMjIuMnMxNy4zLTIuOSAyMi4yIDQuNEwxMTYgMzUzLjJjNS45IDguOCAxNi44IDEyLjcgMjYuOSA5LjdzMTctMTIuNCAxNy0yM0wxNjAgNjR6TTE3NiAwYy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDE5Ny43QzkxLjIgMjM4IDU1LjUgMjMyLjggMjguNSAyNTAuNy0uOSAyNzAuNC04LjkgMzEwLjEgMTAuOCAzMzkuNUw3OC4zIDQ0MC44YzI5LjcgNDQuNSA3OS42IDcxLjIgMTMzLjEgNzEuMkwzMjggNTEyYzY2LjMgMCAxMjAtNTMuNyAxMjAtMTIwbDAtMTIwYzAtMzUuMy0yOC43LTY0LTY0LTY0LTQuNSAwLTguOCAuNS0xMyAxLjMtMTEuNy0xNS40LTMwLjItMjUuMy01MS0yNS4zLTYuOSAwLTEzLjUgMS4xLTE5LjcgMy4xLTExLjYtMTYuNC0zMC43LTI3LjEtNTIuMy0yNy4xLTIuNyAwLTUuNCAuMi04IC41TDI0MCA2NGMwLTM1LjMtMjguNy02NC02NC02NHptNDggMzA0YzAtOC44LTcuMi0xNi0xNi0xNnMtMTYgNy4yLTE2IDE2bDAgOTZjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTk2em00OC0xNmMtOC44IDAtMTYgNy4yLTE2IDE2bDAgOTZjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTk2YzAtOC44LTcuMi0xNi0xNi0xNnptODAgMTZjMC04LjgtNy4yLTE2LTE2LTE2cy0xNiA3LjItMTYgMTZsMCA5NmMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtOTZ6Il0KICAgIH07CiAgICBmYVJlZ2lzdGVyZWQgPSB7CiAgICAgIHByZWZpeDogImZhciIsCiAgICAgIGljb25OYW1lOiAicmVnaXN0ZXJlZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzE3NF0sICJmMjVkIiwgIk0yNTYgNDhhMjA4IDIwOCAwIDEgMSAwIDQxNiAyMDggMjA4IDAgMSAxIDAtNDE2em0wIDQ2NGEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTIwMCAxNDRjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMTc2YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC01NiAzNC40IDAgNDEgNjguM2M2LjggMTEuNCAyMS42IDE1IDMyLjkgOC4yczE1LTIxLjYgOC4yLTMyLjlsLTMwLjItNTAuM2MyNC42LTExLjUgNDEuNi0zNi40IDQxLjYtNjUuMyAwLTM5LjgtMzIuMi03Mi03Mi03MmwtODAgMHptNzIgOTZsLTQ4IDAgMC00OCA1NiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC04IDB6Il0KICAgIH07CiAgICBpY29uczIgPSB7CiAgICAgIGZhU3F1YXJlTWludXMsCiAgICAgIGZhTWludXNTcXVhcmUsCiAgICAgIGZhQ2FsZW5kYXJDaGVjaywKICAgICAgZmFGYWNlS2lzcywKICAgICAgZmFLaXNzLAogICAgICBmYVBhc3RlLAogICAgICBmYUZpbGVDbGlwYm9hcmQsCiAgICAgIGZhSGFuZFBvaW50TGVmdCwKICAgICAgZmFGaWxlRXhjZWwsCiAgICAgIGZhRW52ZWxvcGUsCiAgICAgIGZhU3F1YXJlQ2FyZXREb3duLAogICAgICBmYUNhcmV0U3F1YXJlRG93biwKICAgICAgZmFUcnVjaywKICAgICAgZmFCZWxsLAogICAgICBmYU1lc3NhZ2UsCiAgICAgIGZhQ29tbWVudEFsdCwKICAgICAgZmFGYWNlRGl6enksCiAgICAgIGZhRGl6enksCiAgICAgIGZhQ2FsZW5kYXJEYXlzLAogICAgICBmYUNhbGVuZGFyQWx0LAogICAgICBmYUhhbmRQb2ludFVwLAogICAgICBmYUhhbmRMaXphcmQsCiAgICAgIGZhU3F1YXJlRnVsbCwKICAgICAgZmFDaXJjbGVQYXVzZSwKICAgICAgZmFQYXVzZUNpcmNsZSwKICAgICAgZmFIYXJkRHJpdmUsCiAgICAgIGZhSGRkLAogICAgICBmYUZpbGVaaXBwZXIsCiAgICAgIGZhRmlsZUFyY2hpdmUsCiAgICAgIGZhRmxvcHB5RGlzaywKICAgICAgZmFTYXZlLAogICAgICBmYUZhY2VHcmluVG9uZ3VlU3F1aW50LAogICAgICBmYUdyaW5Ub25ndWVTcXVpbnQsCiAgICAgIGZhQ2FtZXJhLAogICAgICBmYUNhbWVyYUFsdCwKICAgICAgZmFGYWNlR3JpblN0YXJzLAogICAgICBmYUdyaW5TdGFycywKICAgICAgZmFFeWUsCiAgICAgIGZhRmFjZVNhZFRlYXIsCiAgICAgIGZhU2FkVGVhciwKICAgICAgZmFTaGFyZUZyb21TcXVhcmUsCiAgICAgIGZhU2hhcmVTcXVhcmUsCiAgICAgIGZhTm90ZVN0aWNreSwKICAgICAgZmFTdGlja3lOb3RlLAogICAgICBmYUhhbmRCYWNrRmlzdCwKICAgICAgZmFIYW5kUm9jaywKICAgICAgZmFDaGVzc1F1ZWVuLAogICAgICBmYUZhY2VHcmluVGVhcnMsCiAgICAgIGZhR3JpblRlYXJzLAogICAgICBmYVBlblRvU3F1YXJlLAogICAgICBmYUVkaXQsCiAgICAgIGZhRmFjZUdyaW5CZWFtU3dlYXQsCiAgICAgIGZhR3JpbkJlYW1Td2VhdCwKICAgICAgZmFDbG9jaywKICAgICAgZmFDbG9ja0ZvdXIsCiAgICAgIGZhRmFjZUxhdWdoV2luaywKICAgICAgZmFMYXVnaFdpbmssCiAgICAgIGZhUGFwZXJQbGFuZSwKICAgICAgZmFIZWFydCwKICAgICAgZmFGb250QXdlc29tZTogZmFGb250QXdlc29tZTIsCiAgICAgIGZhRm9udEF3ZXNvbWVGbGFnOiBmYUZvbnRBd2Vzb21lRmxhZzIsCiAgICAgIGZhRm9udEF3ZXNvbWVMb2dvRnVsbDogZmFGb250QXdlc29tZUxvZ29GdWxsMiwKICAgICAgZmFDbG9uZSwKICAgICAgZmFGb2xkZXJPcGVuLAogICAgICBmYVdpbmRvd01pbmltaXplLAogICAgICBmYVN0YXJIYWxmLAogICAgICBmYUFsYXJtQ2xvY2ssCiAgICAgIGZhTmV3c3BhcGVyLAogICAgICBmYUhvc3BpdGFsLAogICAgICBmYUhvc3BpdGFsQWx0LAogICAgICBmYUhvc3BpdGFsV2lkZSwKICAgICAgZmFDaXJjbGVTdG9wLAogICAgICBmYVN0b3BDaXJjbGUsCiAgICAgIGZhT2JqZWN0VW5ncm91cCwKICAgICAgZmFDb21tZW50LAogICAgICBmYUNoZXNzUGF3biwKICAgICAgZmFDYWxlbmRhclBsdXMsCiAgICAgIGZhQ2xpcGJvYXJkLAogICAgICBmYVRodW1ic0Rvd24sCiAgICAgIGZhSWRCYWRnZSwKICAgICAgZmFTcXVhcmVDaGVjaywKICAgICAgZmFDaGVja1NxdWFyZSwKICAgICAgZmFDaGVzc0Jpc2hvcCwKICAgICAgZmFFbnZlbG9wZU9wZW4sCiAgICAgIGZhQ2lyY2xlWG1hcmssCiAgICAgIGZhVGltZXNDaXJjbGUsCiAgICAgIGZhWG1hcmtDaXJjbGUsCiAgICAgIGZhU3F1YXJlQ2FyZXRVcCwKICAgICAgZmFDYXJldFNxdWFyZVVwLAogICAgICBmYUZpbGVJbWFnZSwKICAgICAgZmFTcXVhcmVDYXJldFJpZ2h0LAogICAgICBmYUNhcmV0U3F1YXJlUmlnaHQsCiAgICAgIGZhU3VuLAogICAgICBmYUltYWdlLAogICAgICBmYUxpZ2h0YnVsYiwKICAgICAgZmFBZGRyZXNzQ2FyZCwKICAgICAgZmFDb250YWN0Q2FyZCwKICAgICAgZmFWY2FyZCwKICAgICAgZmFGYWNlTWVoLAogICAgICBmYU1laCwKICAgICAgZmFNYXAsCiAgICAgIGZhSGFuZFBvaW50RG93biwKICAgICAgZmFGYWNlTWVoQmxhbmssCiAgICAgIGZhTWVoQmxhbmssCiAgICAgIGZhRmFjZUdyaW5Ub25ndWUsCiAgICAgIGZhR3JpblRvbmd1ZSwKICAgICAgZmFGdXRib2wsCiAgICAgIGZhRnV0Ym9sQmFsbCwKICAgICAgZmFTb2NjZXJCYWxsLAogICAgICBmYUZhY2VTdXJwcmlzZSwKICAgICAgZmFTdXJwcmlzZSwKICAgICAgZmFGb2xkZXIsCiAgICAgIGZhRm9sZGVyQmxhbmssCiAgICAgIGZhQ2xvdWQsCiAgICAgIGZhQ2lyY2xlLAogICAgICBmYUZhY2VHcmluU3F1aW50LAogICAgICBmYUdyaW5TcXVpbnQsCiAgICAgIGZhQ2lyY2xlVXNlciwKICAgICAgZmFVc2VyQ2lyY2xlLAogICAgICBmYVJlY3RhbmdsZUxpc3QsCiAgICAgIGZhTGlzdEFsdCwKICAgICAgZmFIYW5kLAogICAgICBmYUhhbmRQYXBlciwKICAgICAgZmFUaHVtYnNVcCwKICAgICAgZmFCdWlsZGluZywKICAgICAgZmFDaGVzc1Jvb2ssCiAgICAgIGZhQ2lyY2xlUXVlc3Rpb24sCiAgICAgIGZhUXVlc3Rpb25DaXJjbGUsCiAgICAgIGZhRmlsZSwKICAgICAgZmFGYWNlU2FkQ3J5LAogICAgICBmYVNhZENyeSwKICAgICAgZmFDYWxlbmRhck1pbnVzLAogICAgICBmYUZhY2VUaXJlZCwKICAgICAgZmFUaXJlZCwKICAgICAgZmFIYW5kUG9pbnRSaWdodCwKICAgICAgZmFDaXJjbGVVcCwKICAgICAgZmFBcnJvd0FsdENpcmNsZVVwLAogICAgICBmYUhhbmRTY2lzc29ycywKICAgICAgZmFHZW0sCiAgICAgIGZhUmVjdGFuZ2xlWG1hcmssCiAgICAgIGZhUmVjdGFuZ2xlVGltZXMsCiAgICAgIGZhVGltZXNSZWN0YW5nbGUsCiAgICAgIGZhV2luZG93Q2xvc2UsCiAgICAgIGZhVHJhc2hDYW4sCiAgICAgIGZhVHJhc2hBbHQsCiAgICAgIGZhTGlmZVJpbmcsCiAgICAgIGZhQ29weXJpZ2h0LAogICAgICBmYUNpcmNsZUxlZnQsCiAgICAgIGZhQXJyb3dBbHRDaXJjbGVMZWZ0LAogICAgICBmYUNhbGVuZGFyLAogICAgICBmYUZhY2VGcm93bk9wZW4sCiAgICAgIGZhRnJvd25PcGVuLAogICAgICBmYUNoYXJ0QmFyLAogICAgICBmYUJhckNoYXJ0LAogICAgICBmYUhvdXNlLAogICAgICBmYUhvbWUsCiAgICAgIGZhSG9tZUFsdCwKICAgICAgZmFIb21lTGdBbHQsCiAgICAgIGZhRmFjZUZyb3duLAogICAgICBmYUZyb3duLAogICAgICBmYVVzZXIsCiAgICAgIGZhVXNlckFsdCwKICAgICAgZmFVc2VyTGFyZ2UsCiAgICAgIGZhU25vd2ZsYWtlLAogICAgICBmYUJvb2ttYXJrLAogICAgICBmYVNxdWFyZUNhcmV0TGVmdCwKICAgICAgZmFDYXJldFNxdWFyZUxlZnQsCiAgICAgIGZhSGFuZHNoYWtlLAogICAgICBmYUhhbmRzaGFrZUFsdCwKICAgICAgZmFIYW5kc2hha2VTaW1wbGUsCiAgICAgIGZhRmFjZVNtaWxlV2luaywKICAgICAgZmFTbWlsZVdpbmssCiAgICAgIGZhRmFjZUdyaW5TcXVpbnRUZWFycywKICAgICAgZmFHcmluU3F1aW50VGVhcnMsCiAgICAgIGZhRmlsZUF1ZGlvLAogICAgICBmYUNhbGVuZGFyWG1hcmssCiAgICAgIGZhQ2FsZW5kYXJUaW1lcywKICAgICAgZmFDaXJjbGVEb3duLAogICAgICBmYUFycm93QWx0Q2lyY2xlRG93biwKICAgICAgZmFGaWxlTGluZXMsCiAgICAgIGZhRmlsZUFsdCwKICAgICAgZmFGaWxlVGV4dCwKICAgICAgZmFDb21tZW50cywKICAgICAgZmFDaXJjbGVDaGVjaywKICAgICAgZmFDaGVja0NpcmNsZSwKICAgICAgZmFNb29uLAogICAgICBmYUNsb3NlZENhcHRpb25pbmcsCiAgICAgIGZhSW1hZ2VzLAogICAgICBmYUNpcmNsZVJpZ2h0LAogICAgICBmYUFycm93QWx0Q2lyY2xlUmlnaHQsCiAgICAgIGZhSWRDYXJkLAogICAgICBmYURyaXZlcnNMaWNlbnNlLAogICAgICBmYUNpcmNsZVBsYXksCiAgICAgIGZhUGxheUNpcmNsZSwKICAgICAgZmFGYWNlTGF1Z2hCZWFtLAogICAgICBmYUxhdWdoQmVhbSwKICAgICAgZmFBZGRyZXNzQm9vaywKICAgICAgZmFDb250YWN0Qm9vaywKICAgICAgZmFIb3VyZ2xhc3MsCiAgICAgIGZhSG91cmdsYXNzRW1wdHksCiAgICAgIGZhSGVhZHBob25lcywKICAgICAgZmFIZWFkcGhvbmVzQWx0LAogICAgICBmYUhlYWRwaG9uZXNTaW1wbGUsCiAgICAgIGZhRmlsZVBvd2VycG9pbnQsCiAgICAgIGZhV2luZG93TWF4aW1pemUsCiAgICAgIGZhQ29tbWVudERvdHMsCiAgICAgIGZhQ29tbWVudGluZywKICAgICAgZmFGYWNlR3JpblRvbmd1ZVdpbmssCiAgICAgIGZhR3JpblRvbmd1ZVdpbmssCiAgICAgIGZhSG91cmdsYXNzSGFsZiwKICAgICAgZmFIb3VyZ2xhc3MyLAogICAgICBmYUNyZWRpdENhcmQsCiAgICAgIGZhQ3JlZGl0Q2FyZEFsdCwKICAgICAgZmFIYW5kU3BvY2ssCiAgICAgIGZhQmVsbFNsYXNoLAogICAgICBmYVN0YXIsCiAgICAgIGZhRmxhZywKICAgICAgZmFMZW1vbiwKICAgICAgZmFXaW5kb3dSZXN0b3JlLAogICAgICBmYUZhY2VHcmluSGVhcnRzLAogICAgICBmYUdyaW5IZWFydHMsCiAgICAgIGZhRmFjZUtpc3NCZWFtLAogICAgICBmYUtpc3NCZWFtLAogICAgICBmYUZpbGVQZGYsCiAgICAgIGZhRmFjZUdyaW5XaWRlLAogICAgICBmYUdyaW5BbHQsCiAgICAgIGZhRmFjZUxhdWdoU3F1aW50LAogICAgICBmYUxhdWdoU3F1aW50LAogICAgICBmYUZhY2VLaXNzV2lua0hlYXJ0LAogICAgICBmYUtpc3NXaW5rSGVhcnQsCiAgICAgIGZhQ29weSwKICAgICAgZmFDaGVzc0tpbmcsCiAgICAgIGZhU3F1YXJlUGx1cywKICAgICAgZmFQbHVzU3F1YXJlLAogICAgICBmYUZpbGVDb2RlLAogICAgICBmYUZhY2VHcmluV2luaywKICAgICAgZmFHcmluV2luaywKICAgICAgZmFNb25leUJpbGwxLAogICAgICBmYU1vbmV5QmlsbEFsdCwKICAgICAgZmFFeWVTbGFzaCwKICAgICAgZmFGaWxlV29yZCwKICAgICAgZmFGYWNlQW5ncnksCiAgICAgIGZhQW5ncnksCiAgICAgIGZhQ2hlc3NLbmlnaHQsCiAgICAgIGZhRmFjZUdyaW5CZWFtLAogICAgICBmYUdyaW5CZWFtLAogICAgICBmYUhhbmRQZWFjZSwKICAgICAgZmFDb21wYXNzLAogICAgICBmYVNxdWFyZSwKICAgICAgZmFGYWNlR3JpbiwKICAgICAgZmFHcmluLAogICAgICBmYUZhY2VTbWlsZSwKICAgICAgZmFTbWlsZSwKICAgICAgZmFGYWNlU21pbGVCZWFtLAogICAgICBmYVNtaWxlQmVhbSwKICAgICAgZmFGb2xkZXJDbG9zZWQsCiAgICAgIGZhS2V5Ym9hcmQsCiAgICAgIGZhRmFjZVJvbGxpbmdFeWVzLAogICAgICBmYU1laFJvbGxpbmdFeWVzLAogICAgICBmYUZhY2VHcmltYWNlLAogICAgICBmYUdyaW1hY2UsCiAgICAgIGZhQ2lyY2xlRG90LAogICAgICBmYURvdENpcmNsZSwKICAgICAgZmFPYmplY3RHcm91cCwKICAgICAgZmFGYWNlRmx1c2hlZCwKICAgICAgZmFGbHVzaGVkLAogICAgICBmYVN0YXJIYWxmU3Ryb2tlLAogICAgICBmYVN0YXJIYWxmQWx0LAogICAgICBmYUZpbGVWaWRlbywKICAgICAgZmFGYWNlTGF1Z2gsCiAgICAgIGZhTGF1Z2gsCiAgICAgIGZhSGFuZFBvaW50ZXIsCiAgICAgIGZhUmVnaXN0ZXJlZAogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0Bmb3J0YXdlc29tZStmcmVlLXNvbGlkLXN2Zy1pY29uc0A3LjIuMC9ub2RlX21vZHVsZXMvQGZvcnRhd2Vzb21lL2ZyZWUtc29saWQtc3ZnLWljb25zL2luZGV4Lm1qcwp2YXIgcHJlZml4MywgZmEwLCBmYTEsIGZhMiwgZmEzLCBmYTQsIGZhNSwgZmE2LCBmYTcsIGZhOCwgZmE5LCBmYURvbGxhclNpZ24sIGZhRG9sbGFyLCBmYVVzZCwgZmFEb2csIGZhVHJ1Y2tNb3ZpbmcsIGZhUm90YXRlLCBmYVN5bmNBbHQsIGZhU3F1YXJlTWludXMyLCBmYU1pbnVzU3F1YXJlMiwgZmFBbGlnbkp1c3RpZnksIGZhQ2FsZW5kYXJDaGVjazIsIGZhRmFjZUtpc3MyLCBmYUtpc3MyLCBmYUtpdGNoZW5TZXQsIGZhRG5hLCBmYUNoaWxkUmVhY2hpbmcsIGZhUGFzdGUyLCBmYUZpbGVDbGlwYm9hcmQyLCBmYU1ldGVvciwgZmFHZWFycywgZmFDb2dzLCBmYUZpbGVDaXJjbGVQbHVzLCBmYUljaWNsZXMsIGZhQXJyb3dUcmVuZFVwLCBmYUhleGFnb25Ob2Rlc0JvbHQsIGZhUXVlc3Rpb24sIGZhSGFuZHNCb3VuZCwgZmFQZXJzb25XYWxraW5nTHVnZ2FnZSwgZmFGaWxlQXJyb3dEb3duLCBmYUZpbGVEb3dubG9hZCwgZmFQZXJzb25Cb290aCwgZmFMb2N1c3QsIGZhUmlnaHRMb25nLCBmYUxvbmdBcnJvd0FsdFJpZ2h0LCBmYVRydWNrRHJvcGxldCwgZmFIYW5kSG9sZGluZ01lZGljYWwsIGZhSGFuZFBvaW50TGVmdDIsIGZhQ2FsY3VsYXRvciwgZmFNaW51cywgZmFTdWJ0cmFjdCwgZmFBcnJvd1VwWkEsIGZhU29ydEFscGhhVXBBbHQsIGZhTWljcm9waG9uZVNsYXNoLCBmYVNxdWFyZVBlbiwgZmFQZW5TcXVhcmUsIGZhUGVuY2lsU3F1YXJlLCBmYUhhbmRGaXN0LCBmYUZpc3RSYWlzZWQsIGZhQ29tbWVudFNtcywgZmFTbXMsIGZhU2ltQ2FyZCwgZmFTY2FsZUJhbGFuY2VkLCBmYUJhbGFuY2VTY2FsZSwgZmFDYXIsIGZhQXV0b21vYmlsZSwgZmFDcm9wU2ltcGxlLCBmYUNyb3BBbHQsIGZhTWVkYWwsIGZhU2Nyb2xsLCBmYUZpbGVFeGNlbDIsIGZhRmlsdGVyLCBmYURydW0sIGZhTWFwUGluLCBmYVNjYWxlVW5iYWxhbmNlZEZsaXAsIGZhQmFsYW5jZVNjYWxlUmlnaHQsIGZhQXJyb3dzVG9DaXJjbGUsIGZhRW52ZWxvcGUyLCBmYUJhYnksIGZhU3F1YXJlQ2FyZXREb3duMiwgZmFDYXJldFNxdWFyZURvd24yLCBmYVRlbnQsIGZhQSwgZmFQYXJhY2h1dGVCb3gsIGZhQ2FydEFycm93RG93biwgZmFCcmlkZ2VDaXJjbGVFeGNsYW1hdGlvbiwgZmFDbG91ZEFycm93VXAsIGZhQ2xvdWRVcGxvYWQsIGZhQ2xvdWRVcGxvYWRBbHQsIGZhQXQsIGZhSW5kaWFuUnVwZWVTaWduLCBmYUluZGlhblJ1cGVlLCBmYUluciwgZmFUcnVjazIsIGZhQ2hhbGtib2FyZFVzZXIsIGZhQ2hhbGtib2FyZFRlYWNoZXIsIGZhVXNlckNoZWNrLCBmYVVzZXJOaW5qYSwgZmFQbGFudFdpbHQsIGZhV2VpZ2h0U2NhbGUsIGZhV2VpZ2h0LCBmYUNhcmV0UmlnaHQsIGZhRmxvcmluU2lnbiwgZmFCZWxsMiwgZmFMYXJpU2lnbiwgZmFNaWxsU2lnbiwgZmFQZXJzb25Tbm93Ym9hcmRpbmcsIGZhU25vd2JvYXJkaW5nLCBmYVR0eSwgZmFUZWxldHlwZSwgZmFVc2Vyc1JlY3RhbmdsZSwgZmFNb2JpbGUsIGZhTW9iaWxlQW5kcm9pZCwgZmFNb2JpbGVQaG9uZSwgZmFBcnJvd3NUdXJuVG9Eb3RzLCBmYUV4Y2xhbWF0aW9uLCBmYUNodXJjaCwgZmFUb2dnbGVPZmYsIGZhU2hvZVByaW50cywgZmFGaWxlQ2lyY2xlRXhjbGFtYXRpb24sIGZhV2FsbGV0LCBmYU1lc3NhZ2UyLCBmYUNvbW1lbnRBbHQyLCBmYVRyb3BoeSwgZmFGYWNlRGl6enkyLCBmYURpenp5MiwgZmFCYWN0ZXJpYSwgZmFFYXJEZWFmLCBmYURlYWYsIGZhRGVhZm5lc3MsIGZhSGFyZE9mSGVhcmluZywgZmFQZW9wbGVBcnJvd3MsIGZhUGVvcGxlQXJyb3dzTGVmdFJpZ2h0LCBmYUhhbmRzQ2xhcHBpbmcsIGZhVmlydXNDb3ZpZFNsYXNoLCBmYUNhbGVuZGFyRGF5czIsIGZhQ2FsZW5kYXJBbHQyLCBmYURpYW1vbmRUdXJuUmlnaHQsIGZhRGlyZWN0aW9ucywgZmFIYW5kUG9pbnRVcDIsIGZhQmV6aWVyQ3VydmUsIGZhUGVyc29uSGFsZkRyZXNzLCBmYVNxdWFyZVBvbGxIb3Jpem9udGFsLCBmYVBvbGxILCBmYVNjaG9vbENpcmNsZVhtYXJrLCBmYUhhbmRMaXphcmQyLCBmYUNoYWxrYm9hcmQsIGZhQmxhY2tib2FyZCwgZmFVcFJpZ2h0RnJvbVNxdWFyZSwgZmFFeHRlcm5hbExpbmtBbHQsIGZhU3F1YXJlRnVsbDIsIGZhQ2xvdmVyLCBmYVRlZXRoT3BlbiwgZmFCYXJzU3RhZ2dlcmVkLCBmYVJlb3JkZXIsIGZhU3RyZWFtLCBmYVdhcmVob3VzZSwgZmFTd2F0Y2hib29rLCBmYUNhbXBncm91bmQsIGZhUGVyc29uV2Fsa2luZ0Fycm93UmlnaHQsIGZhR2xhc3NlcywgZmFDaXJjbGVQYXVzZTIsIGZhUGF1c2VDaXJjbGUyLCBmYU1lbW9yeSwgZmFHaWZ0LCBmYU1vbmV5QmlsbFdoZWF0LCBmYUR1bmdlb24sIGZhU3VpdGNhc2VNZWRpY2FsLCBmYU1lZGtpdCwgZmFQZXJzb25DYW5lLCBmYUdhdWdlLCBmYURhc2hib2FyZCwgZmFHYXVnZU1lZCwgZmFUYWNob21ldGVyQWx0QXZlcmFnZSwgZmFFbnZlbG9wZU9wZW5UZXh0LCBmYVRvb2xib3gsIGZhUG93ZXJPZmYsIGZhU2lnbmFsLCBmYVNpZ25hbDUsIGZhU2lnbmFsUGVyZmVjdCwgZmFBcnJvd3NTcGluLCBmYUpvaW50LCBmYUJyYWlsbGUsIGZhQmFza2V0U2hvcHBpbmcsIGZhU2hvcHBpbmdCYXNrZXQsIGZhQnJpZGdlLCBmYVBsYW5lQXJyaXZhbCwgZmFDYXNoUmVnaXN0ZXIsIGZhUmluZywgZmFBcXVhcml1cywgZmFTaGFyZU5vZGVzLCBmYVNoYXJlQWx0LCBmYVBlcnNvbkNpcmNsZUV4Y2xhbWF0aW9uLCBmYUJpbm9jdWxhcnMsIGZhS2lwU2lnbiwgZmFIYXJkRHJpdmUyLCBmYUhkZDIsIGZhUmFua2luZ1N0YXIsIGZhVXNlclRpZSwgZmFFbGxpcHNpcywgZmFFbGxpcHNpc0gsIGZhU3RvcmVTbGFzaCwgZmFQZXJjZW50LCBmYVBlcmNlbnRhZ2UsIGZhRmlsZVppcHBlcjIsIGZhRmlsZUFyY2hpdmUyLCBmYURpc3BsYXksIGZhSWNvbnMsIGZhSGVhcnRNdXNpY0NhbWVyYUJvbHQsIGZhUnVsZXJWZXJ0aWNhbCwgZmFNYXBMb2NhdGlvbkRvdCwgZmFNYXBNYXJrZWRBbHQsIGZhSGVhcnRDcmFjaywgZmFIZWFydEJyb2tlbiwgZmFDb3csIGZhUnNzLCBmYUZlZWQsIGZhTWFnbmlmeWluZ0dsYXNzLCBmYVNlYXJjaCwgZmFDbG91ZE1vb24sIGZhQm94ZXNTdGFja2VkLCBmYUJveGVzLCBmYUJveGVzQWx0LCBmYUNvZGVCcmFuY2gsIGZhQmFuLCBmYUNhbmNlbCwgZmFKdWdEZXRlcmdlbnQsIGZhUmVwbHksIGZhTWFpbFJlcGx5LCBmYVN1blBsYW50V2lsdCwgZmFCYWN0ZXJpdW0sIGZhUmVjb3JkVmlueWwsIGZhRmxvcHB5RGlzazIsIGZhU2F2ZTIsIGZhVG9pbGV0c1BvcnRhYmxlLCBmYU8sIGZhUGFsZXR0ZSwgZmFVbmxvY2ssIGZhRWFyTGlzdGVuLCBmYUFzc2lzdGl2ZUxpc3RlbmluZ1N5c3RlbXMsIGZhQ29kZVB1bGxSZXF1ZXN0LCBmYUtleSwgZmFTa3VsbCwgZmFNYXJzU3Ryb2tlVXAsIGZhTWFyc1N0cm9rZVYsIGZhRmlyZUZsYW1lU2ltcGxlLCBmYUJ1cm4sIGZhVHJlZSwgZmFTbW9nLCBmYVMsIGZhSmVkaSwgZmFQZXJzb25IaWtpbmcsIGZhSGlraW5nLCBmYUFycm93c1VwVG9MaW5lLCBmYU1hcnNEb3VibGUsIGZhVGhlcm1vbWV0ZXIsIGZhUGFpbnRicnVzaCwgZmFQYWludEJydXNoLCBmYU5ldXRlciwgZmFTcXVhcmVQaG9uZUZsaXAsIGZhUGhvbmVTcXVhcmVBbHQsIGZhRmFjZUdyaW5Ub25ndWVTcXVpbnQyLCBmYUdyaW5Ub25ndWVTcXVpbnQyLCBmYUNvbW1lbnREb2xsYXIsIGZhSGlwcG8sIGZhQm93bEZvb2QsIGZhU3F1YXJlVmlydXMsIGZhQ2xvdWRTdW5SYWluLCBmYUFycm93UmlnaHRMb25nLCBmYUxvbmdBcnJvd1JpZ2h0LCBmYUJ1aWxkaW5nVW4sIGZhVGVtcGVyYXR1cmVMb3csIGZhRG9vck9wZW4sIGZhQWxpZ25MZWZ0LCBmYUNhbWVyYTIsIGZhQ2FtZXJhQWx0MiwgZmFVc2Vyc1JheXMsIGZhUmFpbmJvdywgZmFTaXRlbWFwLCBmYUZhY2VHcmluU3RhcnMyLCBmYUdyaW5TdGFyczIsIGZhU29ydFVwLCBmYVNvcnRBc2MsIGZhRXllMiwgZmFDYXJldExlZnQsIGZhQXBwbGVXaG9sZSwgZmFBcHBsZUFsdCwgZmFTY3JvbGxUb3JhaCwgZmFUb3JhaCwgZmFIb3VzZUxvY2ssIGZhQXJyb3dzTGVmdFJpZ2h0VG9MaW5lLCBmYVRyYXNoLCBmYUZhY2VTYWRUZWFyMiwgZmFTYWRUZWFyMiwgZmFGYXgsIGZhUGVyc29uQ2lyY2xlUGx1cywgZmFIYW1zYSwgZmFQZXJzb25DaXJjbGVRdWVzdGlvbiwgZmFDbGlwYm9hcmRDaGVjaywgZmFTaGFyZUZyb21TcXVhcmUyLCBmYVNoYXJlU3F1YXJlMiwgZmFSZWNlaXB0LCBmYUVxdWFscywgZmFDaGV2cm9uVXAsIGZhVmlydXNTbGFzaCwgZmFTbGFzaCwgZmFFeHBhbmQsIGZhTm90ZVN0aWNreTIsIGZhU3RpY2t5Tm90ZTIsIGZhVGFibGVDb2x1bW5zLCBmYUNvbHVtbnMsIGZhUGVyc29uU2hlbHRlciwgZmFDaXJjbGVOb3RjaCwgZmFXYXRlciwgZmFEZWxldGVMZWZ0LCBmYUJhY2tzcGFjZSwgZmFCcm9vbUJhbGwsIGZhUXVpZGRpdGNoLCBmYVF1aWRkaXRjaEJyb29tQmFsbCwgZmFKLCBmYVNodXR0bGVTcGFjZSwgZmFTcGFjZVNodXR0bGUsIGZhWWluWWFuZywgZmFTdG9wLCBmYVRyb3dlbCwgZmFIYW5kQmFja0Zpc3QyLCBmYUhhbmRSb2NrMiwgZmFUZW1wZXJhdHVyZUhpZ2gsIGZhR3JlYXRlclRoYW4sIGZhQ3J1dGNoLCBmYVNlcHRhZ29uLCBmYUhlcHRhZ29uLCBmYVN0cmVldFZpZXcsIGZhV2F2ZVNxdWFyZSwgZmFBbmdsZUxlZnQsIGZhU2NyZXdkcml2ZXIsIGZhVHJhY3RvciwgZmFCcmlkZ2VDaXJjbGVYbWFyaywgZmFWaWFscywgZmFTdGV0aG9zY29wZSwgZmFQb2RjYXN0LCBmYUFycm93VXBSaWdodERvdHMsIGZhQ2hlc3NRdWVlbjIsIGZhQW5jaG9yQ2lyY2xlRXhjbGFtYXRpb24sIGZhRWxsaXBzaXNWZXJ0aWNhbCwgZmFFbGxpcHNpc1YsIGZhSGVhcnRDaXJjbGVFeGNsYW1hdGlvbiwgZmFCdWlsZGluZ0NpcmNsZUV4Y2xhbWF0aW9uLCBmYVBlcnNvbkFycm93VXBGcm9tTGluZSwgZmFOb3RFcXVhbCwgZmFUcmFpblRyYW0sIGZhUGxhbmVEZXBhcnR1cmUsIGZhUmlnaHRUb0JyYWNrZXQsIGZhU2lnbkluQWx0LCBmYVNkQ2FyZCwgZmFIb3VzZUNpcmNsZUV4Y2xhbWF0aW9uLCBmYVNoZWtlbFNpZ24sIGZhSWxzLCBmYVNoZWtlbCwgZmFTaGVxZWwsIGZhU2hlcWVsU2lnbiwgZmFSYWRpbywgZmFIYW5kRG90cywgZmFBbGxlcmdpZXMsIGZhQm9va1NrdWxsLCBmYUJvb2tEZWFkLCBmYVVubG9ja0tleWhvbGUsIGZhVW5sb2NrQWx0LCBmYUZpbGVBcnJvd1VwLCBmYUZpbGVVcGxvYWQsIGZhRmFjZUdyaW5UZWFyczIsIGZhR3JpblRlYXJzMiwgZmFQZW5Ub1NxdWFyZTIsIGZhRWRpdDIsIGZhRWFydGhFdXJvcGUsIGZhR2xvYmVFdXJvcGUsIGZhRmFjZUdyaW5CZWFtU3dlYXQyLCBmYUdyaW5CZWFtU3dlYXQyLCBmYUNpcmNsZUhhbGZTdHJva2UsIGZhQWRqdXN0LCBmYVBlcnNvbk1pbGl0YXJ5VG9QZXJzb24sIGZhVGFibGVDZWxsc0NvbHVtbkxvY2ssIGZhVHJ1Y2tGaWVsZFVuLCBmYUNsb2NrMiwgZmFDbG9ja0ZvdXIyLCBmYUJvb2ssIGZhRmFjZUxhdWdoV2luazIsIGZhTGF1Z2hXaW5rMiwgZmFDbG91ZE1lYXRiYWxsLCBmYUNoYXJ0QXJlYSwgZmFBcmVhQ2hhcnQsIGZhUnVwaWFoU2lnbiwgZmFUZXh0V2lkdGgsIGZhU2F0ZWxsaXRlLCBmYU1hZ25pZnlpbmdHbGFzc01pbnVzLCBmYVNlYXJjaE1pbnVzLCBmYVBlb3BsZUdyb3VwLCBmYVNxdWFyZUJpbmFyeSwgZmFNYXNrc1RoZWF0ZXIsIGZhVGhlYXRlck1hc2tzLCBmYUNhcnRQbHVzLCBmYUhhbmRzQXNsSW50ZXJwcmV0aW5nLCBmYUFtZXJpY2FuU2lnbkxhbmd1YWdlSW50ZXJwcmV0aW5nLCBmYUFzbEludGVycHJldGluZywgZmFIYW5kc0FtZXJpY2FuU2lnbkxhbmd1YWdlSW50ZXJwcmV0aW5nLCBmYVRhYmxlQ2VsbHNSb3dVbmxvY2ssIGZhUm9ja2V0LCBmYVNocmltcCwgZmFUZW5nZVNpZ24sIGZhVGVuZ2UsIGZhSG91c2VDaGltbmV5TWVkaWNhbCwgZmFDbGluaWNNZWRpY2FsLCBmYVVzZXJzU2xhc2gsIGZhUGFwZXJQbGFuZTIsIGZhQm9va0F0bGFzLCBmYUF0bGFzLCBmYVRhYmxlLCBmYUhlYXJ0MiwgZmFDaXJjbGVDaGV2cm9uVXAsIGZhQ2hldnJvbkNpcmNsZVVwLCBmYUJhdHRlcnlIYWxmLCBmYUJhdHRlcnkzLCBmYUZvbnRBd2Vzb21lMywgZmFGb250QXdlc29tZUZsYWczLCBmYUZvbnRBd2Vzb21lTG9nb0Z1bGwzLCBmYUhhbmRjdWZmcywgZmFIYXRDb3dib3lTaWRlLCBmYUluZHVzdHJ5LCBmYUxpbmVzTGVhbmluZywgZmFQYXNzcG9ydCwgZmFJbmZpbml0eSwgZmFDbG9uZTIsIGZhRm9yd2FyZCwgZmFNLCBmYVJvYWRTcGlrZXMsIGZhTW91bnRhaW4sIGZhQ2hlc3MsIGZhVGVtcGVyYXR1cmVUaHJlZVF1YXJ0ZXJzLCBmYVRlbXBlcmF0dXJlMywgZmFUaGVybW9tZXRlcjMsIGZhVGhlcm1vbWV0ZXJUaHJlZVF1YXJ0ZXJzLCBmYUIsIGZhU2hpZWxkVmlydXMsIGZhTGl0ZWNvaW5TaWduLCBmYURpY2VENiwgZmFHcmlwTGluZXNWZXJ0aWNhbCwgZmFHb2xmQmFsbFRlZSwgZmFHb2xmQmFsbCwgZmFIZXhhZ29uLCBmYUZvbGRlck9wZW4yLCBmYUthYWJhLCBmYUhhbmRIb2xkaW5nLCBmYVNpbmdsZVF1b3RlUmlnaHQsIGZhQm90dGxlRHJvcGxldCwgZmFXaW5kb3dNaW5pbWl6ZTIsIGZhQ2hldnJvblJpZ2h0LCBmYUVnZywgZmFMYW5kbWFya0RvbWUsIGZhTGFuZG1hcmtBbHQsIGZhV29ybSwgZmFVc2VySW5qdXJlZCwgZmFTdHJpa2V0aHJvdWdoLCBmYUJsb2csIGZhU3RvcHdhdGNoMjAsIGZhVHJ1Y2tQaWNrdXAsIGZhU2VlZGxpbmcsIGZhU3Byb3V0LCBmYVRyYW5zZ2VuZGVyLCBmYVRyYW5zZ2VuZGVyQWx0LCBmYVN0YXJIYWxmMiwgZmFQaG90b0ZpbG0sIGZhUGhvdG9WaWRlbywgZmFQaWN0dXJlSW5QaWN0dXJlLCBmYVB1bXBNZWRpY2FsLCBmYUZpcmUsIGZhTWFnbmlmeWluZ0dsYXNzUGx1cywgZmFTZWFyY2hQbHVzLCBmYUZsYXNrLCBmYUFsaWduUmlnaHQsIGZhQ2FibGVDYXIsIGZhVHJhbSwgZmFLaXRNZWRpY2FsLCBmYUZpcnN0QWlkLCBmYUdyaXBMaW5lcywgZmFCdXJnZXIsIGZhSGFtYnVyZ2VyLCBmYVNub3dtYW4sIGZhSG90ZWwsIGZhUHJpbnQsIGZhVm9sbGV5YmFsbCwgZmFWb2xsZXliYWxsQmFsbCwgZmFUcmFmZmljTGlnaHQsIGZhUGxhbmVDaXJjbGVDaGVjaywgZmFVc2VycywgZmFDZXJ0aWZpY2F0ZSwgZmFBbGFybUNsb2NrMiwgZmFIZWxpY29wdGVyU3ltYm9sLCBmYUhvdXNlQ2hpbW5leUNyYWNrLCBmYUhvdXNlRGFtYWdlLCBmYVBlcnNvbk1pbGl0YXJ5UG9pbnRpbmcsIGZhRGF0YWJhc2UsIGZhTmV3c3BhcGVyMiwgZmFDbG91ZFJhaW4sIGZhTWF4aW1pemUsIGZhRXhwYW5kQXJyb3dzQWx0LCBmYUxvY2F0aW9uQXJyb3csIGZhQ2l0eSwgZmFYUmF5LCBmYVVtYnJlbGxhQmVhY2gsIGZhQXJyb3dSaWdodFRvQnJhY2tldCwgZmFTaWduSW4sIGZhSGVhZHNldCwgZmFTcGxvdGNoLCBmYVVwTG9uZywgZmFMb25nQXJyb3dBbHRVcCwgZmFIZXhhZ29uTm9kZXMsIGZhSG9zcGl0YWwyLCBmYUhvc3BpdGFsQWx0MiwgZmFIb3NwaXRhbFdpZGUyLCBmYVBlcnNvbkhhcmFzc2luZywgZmFNb25leUJpbGxUcmVuZFVwLCBmYVBlblJ1bGVyLCBmYVBlbmNpbFJ1bGVyLCBmYVJlcGVhdCwgZmFCb25lLCBmYUZpcmVGbGFtZUN1cnZlZCwgZmFGaXJlQWx0LCBmYUJ1c1NpbXBsZSwgZmFCdXNBbHQsIGZhVmVudXNNYXJzLCBmYUJsZW5kZXIsIGZhVSwgZmFTaGFyZSwgZmFNYWlsRm9yd2FyZCwgZmFQaG9uZUZsaXAsIGZhUGhvbmVBbHQsIGZhVG9pbGV0UG9ydGFibGUsIGZhUGVyc29uUHJlZ25hbnQsIGZhTGVzc1RoYW4sIGZhU3VwZXJzY3JpcHQsIGZhQ2lyY2xlU3RvcDIsIGZhU3RvcENpcmNsZTIsIGZhQXJyb3dzVXBEb3duLCBmYUFycm93c1YsIGZhUG9vU3Rvcm0sIGZhUG9vQm9sdCwgZmFWaWRlb1NsYXNoLCBmYVNxdWFyZVhtYXJrLCBmYVRpbWVzU3F1YXJlLCBmYVhtYXJrU3F1YXJlLCBmYUhhbmRIb2xkaW5nRHJvcGxldCwgZmFIYW5kSG9sZGluZ1dhdGVyLCBmYVdvblNpZ24sIGZhS3J3LCBmYVdvbiwgZmFPYmplY3RVbmdyb3VwMiwgZmFDb21tZW50MiwgZmFIaWxsQXZhbGFuY2hlLCBmYUFycm93c1RvRXllLCBmYVNub3dwbG93LCBmYUNoYXJ0R2FudHQsIGZhVmlkZW8sIGZhVmlkZW9DYW1lcmEsIGZhQ2hlc3NQYXduMiwgZmFTeW5hZ29ndWUsIGZhQnVpbGRpbmdDaXJjbGVDaGVjaywgZmFDYWxlbmRhclBsdXMyLCBmYVdoZWVsY2hhaXJNb3ZlLCBmYVdoZWVsY2hhaXJBbHQsIGZhVXNlclNoaWVsZCwgZmFCb2xkLCBmYUhlYXJ0UHVsc2UsIGZhSGVhcnRiZWF0LCBmYVNxdWFyZVJvb3RWYXJpYWJsZSwgZmFTcXVhcmVSb290QWx0LCBmYUhhbmRzQnViYmxlcywgZmFIYW5kc1dhc2gsIGZhTWFya2VyLCBmYUNsaXBib2FyZDIsIGZhUGxhY2VPZldvcnNoaXAsIGZhQ2FubmFiaXMsIGZhUGVvcGxlUm9vZiwgZmFEaXNlYXNlLCBmYUJvb2tCaWJsZSwgZmFCaWJsZSwgZmFDaGVzc0JvYXJkLCBmYU1hcnMsIGZhTGFwdG9wLCBmYVVzZXJYbWFyaywgZmFVc2VyVGltZXMsIGZhRmxhZ1VzYSwgZmFIYW5kTWlkZGxlRmluZ2VyLCBmYU1vcnRhclBlc3RsZSwgZmFIZWFkU2lkZUNvdWdoLCBmYVBsYW5lTG9jaywgZmFCYXR0ZXJ5VGhyZWVRdWFydGVycywgZmFCYXR0ZXJ5NCwgZmFGcmFuY1NpZ24sIGZhRmlsdGVyQ2lyY2xlRG9sbGFyLCBmYUZ1bm5lbERvbGxhciwgZmFDaGVlc2UsIGZhQ2lyY2xlSCwgZmFIb3NwaXRhbFN5bWJvbCwgZmFTY2hvb2wsIGZhRGljZUZpdmUsIGZhVG9ybmFkbywgZmFKZXRGaWdodGVyLCBmYUZpZ2h0ZXJKZXQsIGZhVGh1bWJzRG93bjIsIGZhQnJvb20sIGZhRmlsZUltcG9ydCwgZmFBcnJvd1JpZ2h0VG9GaWxlLCBmYVV0ZW5zaWxzLCBmYUN1dGxlcnksIGZhSWRCYWRnZTIsIGZhU3BpZGVyLCBmYU1vYmlsZVJldHJvLCBmYVNpZ25zUG9zdCwgZmFNYXBTaWducywgZmFHcm91cEFycm93c1JvdGF0ZSwgZmFBcnJvd3NTcGxpdFVwQW5kTGVmdCwgZmFGaWxsRHJpcCwgZmFTaGllbGRIZWFydCwgZmFQZXJzb25Ta2lpbmdOb3JkaWMsIGZhU2tpaW5nTm9yZGljLCBmYVNxdWFyZUNoZWNrMiwgZmFDaGVja1NxdWFyZTIsIGZhQmF0aCwgZmFCYXRodHViLCBmYUNoZXNzQmlzaG9wMiwgZmFQcmVzY3JpcHRpb25Cb3R0bGVNZWRpY2FsLCBmYVByZXNjcmlwdGlvbkJvdHRsZUFsdCwgZmFEcmF3UG9seWdvbiwgZmFWZWN0b3JQb2x5Z29uLCBmYUlDdXJzb3IsIGZhSGVhcnRDaXJjbGVQbHVzLCBmYVNoaWVsZERvZywgZmFHcmVhdGVyVGhhbkVxdWFsLCBmYUVudmVsb3BlT3BlbjIsIGZhTW91bmQsIGZhVm9pY2VtYWlsLCBmYVZlc3QsIGZhQXVkaW9EZXNjcmlwdGlvbiwgZmFXLCBmYUV5ZURyb3BwZXIsIGZhRXllRHJvcHBlckVtcHR5LCBmYUV5ZWRyb3BwZXIsIGZhQ2lyY2xlWG1hcmsyLCBmYVRpbWVzQ2lyY2xlMiwgZmFYbWFya0NpcmNsZTIsIGZhVHJhaWxlciwgZmFUdXJraXNoTGlyYVNpZ24sIGZhVHJ5LCBmYVR1cmtpc2hMaXJhLCBmYVZvbGNhbm8sIGZhV2FuZFNwYXJrbGVzLCBmYU1pY3JvcGhvbmUsIGZhQ3Jvd24sIGZhVGVudEFycm93VHVybkxlZnQsIGZhVHJ1Y2tGYXN0LCBmYVNoaXBwaW5nRmFzdCwgZmFVc2VyUGVuLCBmYVVzZXJFZGl0LCBmYVVzZXJDbG9jaywgZmFTaG93ZXIsIGZhU3F1YXJlQ2FyZXRVcDIsIGZhQ2FyZXRTcXVhcmVVcDIsIGZhTWFwTG9jYXRpb24sIGZhTWFwTWFya2VkLCBmYVBlbkZhbmN5LCBmYUV1cm9TaWduLCBmYUV1ciwgZmFFdXJvLCBmYUhvdXNlQ2lyY2xlWG1hcmssIGZhTGlyYVNpZ24sIGZhWWVuU2lnbiwgZmFDbnksIGZhSnB5LCBmYVJtYiwgZmFZZW4sIGZhQm94T3BlbiwgZmFUcnVja0ZpZWxkLCBmYUxvY2F0aW9uUGluTG9jaywgZmFQZXJzb25QcmF5aW5nLCBmYVByYXksIGZhQ2xpcGJvYXJkTGlzdCwgZmFTYWNrRG9sbGFyLCBmYU1vdW50YWluU3VuLCBmYUFycm93VXBXaWRlU2hvcnQsIGZhU29ydEFtb3VudFVwLCBmYVVzZXJzTGluZSwgZmFTdGFyT2ZEYXZpZCwgZmFOb3Rlc01lZGljYWwsIGZhQXVzdHJhbFNpZ24sIGZhQ2xpcGJvYXJkVXNlciwgZmFGaWxlSW1hZ2UyLCBmYVNxdWFyZUNhcmV0UmlnaHQyLCBmYUNhcmV0U3F1YXJlUmlnaHQyLCBmYVZpYWwsIGZhSGVsaWNvcHRlciwgZmFNaXR0ZW4sIGZhR2FzUHVtcCwgZmFFbnZlbG9wZUNpcmNsZUNoZWNrLCBmYVBlcnNvblNrYXRpbmcsIGZhU2thdGluZywgZmFTdW4yLCBmYUJhc2ViYWxsLCBmYUJhc2ViYWxsQmFsbCwgZmFJbWFnZTIsIGZhTm90ZGVmLCBmYUJhc2tldGJhbGwsIGZhQmFza2V0YmFsbEJhbGwsIGZhUGVuY2lsLCBmYVBlbmNpbEFsdCwgZmFQZXJzb25XYWxraW5nQXJyb3dMb29wTGVmdCwgZmFEaWNlU2l4LCBmYUFuZ2xlc0Rvd24sIGZhQW5nbGVEb3VibGVEb3duLCBmYVN5cmluZ2UsIGZhV2hlYXRBd24sIGZhV2hlYXRBbHQsIGZhUGxhbmVVcCwgZmFBbGlnbkNlbnRlciwgZmFIb2NrZXlQdWNrLCBmYUNpcmNsZUFycm93TGVmdCwgZmFBcnJvd0NpcmNsZUxlZnQsIGZhUGx1Z0NpcmNsZUJvbHQsIGZhUmVzdHJvb20sIGZhQW5jaG9yTG9jaywgZmFUaW1lbGluZSwgZmFMaWdodGJ1bGIyLCBmYUNpcmNsZUFycm93UmlnaHQsIGZhQXJyb3dDaXJjbGVSaWdodCwgZmFNYXJzQW5kVmVudXMsIGZhTmV0d29ya1dpcmVkLCBmYUJ1aWxkaW5nU2hpZWxkLCBmYUNvZGUsIGZhRmVhdGhlclBvaW50ZWQsIGZhRmVhdGhlckFsdCwgZmFGaWxlQ2lyY2xlUXVlc3Rpb24sIGZhU2lnbmF0dXJlLCBmYUVhcnRoQW1lcmljYXMsIGZhRWFydGgsIGZhRWFydGhBbWVyaWNhLCBmYUdsb2JlQW1lcmljYXMsIGZhQ2Fycm90LCBmYVRlbXBlcmF0dXJlRnVsbCwgZmFUZW1wZXJhdHVyZTQsIGZhVGhlcm1vbWV0ZXI0LCBmYVRoZXJtb21ldGVyRnVsbCwgZmFUYWJsZUNlbGxzUm93TG9jaywgZmFCb2x0TGlnaHRuaW5nLCBmYUNsb3VkU2hvd2Vyc1dhdGVyLCBmYUFycm93VXBMb25nLCBmYUxvbmdBcnJvd1VwLCBmYUFkZHJlc3NDYXJkMiwgZmFDb250YWN0Q2FyZDIsIGZhVmNhcmQyLCBmYUFuZ2xlUmlnaHQsIGZhRmFjZU1laDIsIGZhTWVoMiwgZmFBcnJvd1VwRnJvbUdyb3VuZFdhdGVyLCBmYU1hcDIsIGZhVXNlclBsdXMsIGZhVmVudXMsIGZhRGlhZ3JhbVN1Y2Nlc3NvciwgZmFIZWFkU2lkZUNvdWdoU2xhc2gsIGZhRGlhZ3JhbVByb2plY3QsIGZhUHJvamVjdERpYWdyYW0sIGZhVGVybWluYWwsIGZhSG91c2VGaXJlLCBmYU1hc2ssIGZhSHVycmljYW5lLCBmYUVhcnRoQWZyaWNhLCBmYUdsb2JlQWZyaWNhLCBmYVRodW1idGFjaywgZmFUaHVtYlRhY2ssIGZhSGFuZFBvaW50RG93bjIsIGZhRmFjZU1laEJsYW5rMiwgZmFNZWhCbGFuazIsIGZhVGVtcGVyYXR1cmVFbXB0eSwgZmFUZW1wZXJhdHVyZTAsIGZhVGhlcm1vbWV0ZXIwLCBmYVRoZXJtb21ldGVyRW1wdHksIGZhQm9yZGVyTm9uZSwgZmFIaWdobGlnaHRlciwgZmFNb25leUJpbGxXYXZlLCBmYVRvaWxldFBhcGVyU2xhc2gsIGZhRmlsZVNoaWVsZCwgZmFUZXh0SGVpZ2h0LCBmYUZhY2VHcmluVG9uZ3VlMiwgZmFHcmluVG9uZ3VlMiwgZmFGaWxlU2lnbmF0dXJlLCBmYUJ1aWxkaW5nV2hlYXQsIGZhUGx1Z0NpcmNsZU1pbnVzLCBmYUZ1dGJvbDIsIGZhRnV0Ym9sQmFsbDIsIGZhU29jY2VyQmFsbDIsIGZhQ2lyY2xlUGx1cywgZmFQbHVzQ2lyY2xlLCBmYUJyYXppbGlhblJlYWxTaWduLCBmYVN0YXJBbmRDcmVzY2VudCwgZmFGYWNlU3VycHJpc2UyLCBmYVN1cnByaXNlMiwgZmFIb3NwaXRhbFVzZXIsIGZhQXJyb3dEb3duVXBMb2NrLCBmYUZvbGRlcjIsIGZhRm9sZGVyQmxhbmsyLCBmYUhvbGx5QmVycnksIGZhVmVudXNEb3VibGUsIGZhQ2xpcGJvYXJkUXVlc3Rpb24sIGZhSG90ZG9nLCBmYUFycm93VXBGcm9tQnJhY2tldCwgZmFNaWNyb3Njb3BlLCBmYUNsb3VkMiwgZmFCYXNlYmFsbEJhdEJhbGwsIGZhQ2FyUmVhciwgZmFDYXJBbHQsIGZhVGh1bWJ0YWNrU2xhc2gsIGZhVGh1bWJUYWNrU2xhc2gsIGZhUGx1c01pbnVzLCBmYUhvdXNlQ2lyY2xlQ2hlY2ssIGZhQ2FsZW5kYXJEYXksIGZhTGlicmEsIGZhQ2lyY2xlMiwgZmFNb2JpbGVWaWJyYXRlLCBmYUZhY2VHcmluU3F1aW50MiwgZmFHcmluU3F1aW50MiwgZmFVc2Vyc0JldHdlZW5MaW5lcywgZmFIb3VzZU1lZGljYWxDaXJjbGVYbWFyaywgZmFUYWJsZUxpc3QsIGZhVGhMaXN0LCBmYUZsYXNrVmlhbCwgZmFDaXJjbGVFeGNsYW1hdGlvbiwgZmFFeGNsYW1hdGlvbkNpcmNsZSwgZmFUYXhpLCBmYUNhYiwgZmFUZXh0U2xhc2gsIGZhUmVtb3ZlRm9ybWF0LCBmYVBlb3BsZVB1bGxpbmcsIGZhQmFja3dhcmQsIGZhQ2FyQnVyc3QsIGZhQ2FyQ3Jhc2gsIGZhTGluaywgZmFDaGFpbiwgZmFCYWNrd2FyZFN0ZXAsIGZhU3RlcEJhY2t3YXJkLCBmYVgsIGZhQ2lyY2xlVXNlcjIsIGZhVXNlckNpcmNsZTIsIGZhUmVjdGFuZ2xlTGlzdDIsIGZhTGlzdEFsdDIsIGZhSGFuZDIsIGZhSGFuZFBhcGVyMiwgZmFDYW5jZXIsIGZhVmFuU2h1dHRsZSwgZmFTaHV0dGxlVmFuLCBmYVN0YWlycywgZmFIb3JzZUhlYWQsIGZhVmF1bHQsIGZhQ2xvc2VkQ2FwdGlvbmluZ1NsYXNoLCBmYURydW1TdGVlbHBhbiwgZmFUaHVtYnNVcDIsIGZhU3RhbXAsIGZhTWVub3JhaCwgZmFDaGlsZHJlbiwgZmFDaGFydExpbmUsIGZhTGluZUNoYXJ0LCBmYVNxdWFyZUVudmVsb3BlLCBmYUVudmVsb3BlU3F1YXJlLCBmYUJhblNtb2tpbmcsIGZhU21va2luZ0JhbiwgZmFUcnVja0Zyb250LCBmYUJ1aWxkaW5nMiwgZmFCdWxsc2V5ZSwgZmFBcnJvd0xlZnRMb25nLCBmYUxvbmdBcnJvd0xlZnQsIGZhQ2hlc3NSb29rMiwgZmFCbGVuZGVyUGhvbmUsIGZhQXJyb3dUdXJuVXAsIGZhTGV2ZWxVcCwgZmFCaWN5Y2xlLCBmYUNpcmNsZUFycm93RG93biwgZmFBcnJvd0NpcmNsZURvd24sIGZhR2VhciwgZmFDb2csIGZhTWFyc0FuZFZlbnVzQnVyc3QsIGZhT3R0ZXIsIGZhQ2lyY2xlQ2hldnJvbkxlZnQsIGZhQ2hldnJvbkNpcmNsZUxlZnQsIGZhQ2lyY2xlUXVlc3Rpb24yLCBmYVF1ZXN0aW9uQ2lyY2xlMiwgZmFXYWxraWVUYWxraWUsIGZhVXNlckdyb3VwLCBmYVVzZXJGcmllbmRzLCBmYUhvdXNlQ2hpbW5leSwgZmFIb21lTGcsIGZhUmlnaHRGcm9tQnJhY2tldCwgZmFTaWduT3V0QWx0LCBmYUZpbGUyLCBmYVBsYW5lU2xhc2gsIGZhQ2xvdWRTaG93ZXJzSGVhdnksIGZhUGVyc29uRmFsbGluZywgZmFUdXJuRG93biwgZmFMZXZlbERvd25BbHQsIGZhVXBSaWdodEFuZERvd25MZWZ0RnJvbUNlbnRlciwgZmFFeHBhbmRBbHQsIGZhVXNlclRhZywgZmFIYW5kU3BhcmtsZXMsIGZhQXJyb3dzVG9Eb3QsIGZhRmFjZVNhZENyeTIsIGZhU2FkQ3J5MiwgZmFEb25nU2lnbiwgZmFQZW9wbGVMaW5lLCBmYVNxdWFyZVJzcywgZmFSc3NTcXVhcmUsIGZhQ2FsZW5kYXJNaW51czIsIGZhQ2hhcnREaWFncmFtLCBmYUZhY2VUaXJlZDIsIGZhVGlyZWQyLCBmYUhhbmRQb2ludFJpZ2h0MiwgZmFBcnJvd1VwLCBmYUN1YmVzU3RhY2tlZCwgZmFDaGlsZENvbWJhdGFudCwgZmFDaGlsZFJpZmxlLCBmYVZlc3RQYXRjaGVzLCBmYU1hcnRpbmlHbGFzc0VtcHR5LCBmYUdsYXNzTWFydGluaSwgZmFNYWduZXQsIGZhUm9hZEJhcnJpZXIsIGZhQ29tcGFzc0RyYWZ0aW5nLCBmYURyYWZ0aW5nQ29tcGFzcywgZmFTcXVhcmVQZXJzb25Db25maW5lZCwgZmFQbGF0ZVdoZWF0LCBmYVNpZ25IYW5naW5nLCBmYVNpZ24sIGZhQ2FyQmF0dGVyeSwgZmFCYXR0ZXJ5Q2FyLCBmYVNoaXJ0LCBmYVRTaGlydCwgZmFUc2hpcnQsIGZhUGFyYWdyYXBoLCBmYUVudmVsb3Blc0J1bGssIGZhTWFpbEJ1bGssIGZhR3VpdGFyLCBmYVN1aXRjYXNlLCBmYUNpcmNsZVVwMiwgZmFBcnJvd0FsdENpcmNsZVVwMiwgZmFGLCBmYVhtYXJrc0xpbmVzLCBmYUVhcnRoT2NlYW5pYSwgZmFHbG9iZU9jZWFuaWEsIGZhQ29tbWVudFNsYXNoLCBmYVBsYXksIGZhVmlhbENpcmNsZUNoZWNrLCBmYUJyaWRnZUNpcmNsZUNoZWNrLCBmYUNlZGlTaWduLCBmYVB1enpsZVBpZWNlLCBmYUhlbG1ldFVuLCBmYUdsYXNzV2F0ZXIsIGZhSGVhcnRDaXJjbGVCb2x0LCBmYVB1bXBTb2FwLCBmYUhhbmRTY2lzc29yczIsIGZhRG9sbHksIGZhRG9sbHlCb3gsIGZhUGFwZXJjbGlwLCBmYURlbW9jcmF0LCBmYVNxdWFyZUFycm93VXBSaWdodCwgZmFFeHRlcm5hbExpbmtTcXVhcmUsIGZhRmVycnksIGZhTW9zcXVpdG8sIGZhQnVpbGRpbmdDaXJjbGVBcnJvd1JpZ2h0LCBmYUxlZnRSaWdodCwgZmFBcnJvd3NBbHRILCBmYVZpcnVzLCBmYUdlbTIsIGZhVG9pbGV0LCBmYVNpbmdsZVF1b3RlTGVmdCwgZmFNb25leUJpbGxzLCBmYVRhYmxldEJ1dHRvbiwgZmFSZWN0YW5nbGVYbWFyazIsIGZhUmVjdGFuZ2xlVGltZXMyLCBmYVRpbWVzUmVjdGFuZ2xlMiwgZmFXaW5kb3dDbG9zZTIsIGZhV3JlbmNoLCBmYVRyYXNoQ2FuMiwgZmFUcmFzaEFsdDIsIGZhVGFibGVDZWxscywgZmFUaCwgZmFSaWJib24sIGZhTGFuZG1hcmtGbGFnLCBmYVVwRG93bkxlZnRSaWdodCwgZmFBcnJvd3NBbHQsIGZhQ2FyU2lkZSwgZmFUcmFzaEFycm93VXAsIGZhVHJhc2hSZXN0b3JlLCBmYUxpZmVSaW5nMiwgZmFDb3B5cmlnaHQyLCBmYUZpbGVQcmVzY3JpcHRpb24sIGZhRXJhc2VyLCBmYUhvdXJnbGFzc1N0YXJ0LCBmYUhvdXJnbGFzczEsIGZhQ2lyY2xlTGVmdDIsIGZhQXJyb3dBbHRDaXJjbGVMZWZ0MiwgZmFDcnV6ZWlyb1NpZ24sIGZhU21va2luZywgZmFTcXVhcmVQb2xsVmVydGljYWwsIGZhUG9sbCwgZmFQZXJzb25DaXJjbGVNaW51cywgZmFCaW9oYXphcmQsIGZhQmVsbENvbmNpZXJnZSwgZmFDb25jaWVyZ2VCZWxsLCBmYVJ1bGVySG9yaXpvbnRhbCwgZmFIb3JzZSwgZmFDYWxlbmRhcjIsIGZhSGFuZHNIb2xkaW5nQ2hpbGQsIGZhSXRhbGljLCBmYUtoYW5kYSwgZmFGYWNlRnJvd25PcGVuMiwgZmFGcm93bk9wZW4yLCBmYUNoZWNrLCBmYUZpbmdlcnByaW50LCBmYUNoYXJnaW5nU3RhdGlvbiwgZmFVc2VyTG9jaywgZmFNb2JpbGVTY3JlZW5CdXR0b24sIGZhTW9iaWxlQWx0LCBmYUFuY2hvckNpcmNsZUNoZWNrLCBmYVBlcnNvbldhbGtpbmdXaXRoQ2FuZSwgZmFCbGluZCwgZmFGaWxlV2F2ZWZvcm0sIGZhRmlsZU1lZGljYWxBbHQsIGZhSG91c2VDcmFjaywgZmFIYXRXaXphcmQsIGZhVXNlckRvY3RvciwgZmFVc2VyTWQsIGZhQ2hhcnRCYXIyLCBmYUJhckNoYXJ0MiwgZmFTcHJheUNhblNwYXJrbGVzLCBmYUFpckZyZXNoZW5lciwgZmFCYWh0U2lnbiwgZmFUZW1wZXJhdHVyZUFycm93VXAsIGZhVGVtcGVyYXR1cmVVcCwgZmFXZWJBd2Vzb21lMiwgZmFOb25CaW5hcnksIGZhTiwgZmFBcnJvd3NVcERvd25MZWZ0UmlnaHQsIGZhQXJyb3dzLCBmYUhvdXNlMiwgZmFIb21lMiwgZmFIb21lQWx0MiwgZmFIb21lTGdBbHQyLCBmYVNwaW5uZXIsIGZhR2F2ZWwsIGZhTGVnYWwsIGZhVGlja2V0U2ltcGxlLCBmYVRpY2tldEFsdCwgZmFEb3ZlLCBmYVRhcnBEcm9wbGV0LCBmYVRyZWVDaXR5LCBmYVR1cm5VcCwgZmFMZXZlbFVwQWx0LCBmYVRlbXBlcmF0dXJlUXVhcnRlciwgZmFUZW1wZXJhdHVyZTEsIGZhVGhlcm1vbWV0ZXIxLCBmYVRoZXJtb21ldGVyUXVhcnRlciwgZmFTbGlkZXJzLCBmYVNsaWRlcnNILCBmYU1vc3F1ZSwgZmFILCBmYUluZm8sIGZhUGVyc29uV2Fsa2luZywgZmFXYWxraW5nLCBmYUFycm93VHVybkRvd24sIGZhTGV2ZWxEb3duLCBmYVJvYWQsIGZhU3BpcmFsLCBmYUZhY2VGcm93bjIsIGZhRnJvd24yLCBmYVdpbmVHbGFzc0VtcHR5LCBmYVdpbmVHbGFzc0FsdCwgZmFDbGFwcGVyYm9hcmQsIGZhRm9yd2FyZFN0ZXAsIGZhU3RlcEZvcndhcmQsIGZhU3F1YXJlVXBSaWdodCwgZmFFeHRlcm5hbExpbmtTcXVhcmVBbHQsIGZhQm9va0pvdXJuYWxXaGlsbHMsIGZhSm91cm5hbFdoaWxscywgZmFDaGFtcGFnbmVHbGFzc2VzLCBmYUdsYXNzQ2hlZXJzLCBmYUR1bXBzdGVyLCBmYUhlYXJ0Q2lyY2xlWG1hcmssIGZhQ29tcHV0ZXIsIGZhV2FuZE1hZ2ljLCBmYU1hZ2ljLCBmYUJyYWluLCBmYUJyaWVmY2FzZU1lZGljYWwsIGZhSG91c2VNZWRpY2FsQ2lyY2xlRXhjbGFtYXRpb24sIGZhQ29kZUNvbW1pdCwgZmFQZXJzb25CcmVhc3RmZWVkaW5nLCBmYVBlcnNvblJheXMsIGZhTWFuYXRTaWduLCBmYVNvcnQsIGZhVW5zb3J0ZWQsIGZhQ2lyY2xlUmFkaWF0aW9uLCBmYVJhZGlhdGlvbkFsdCwgZmFMYXB0b3BDb2RlLCBmYVNpbmssIGZhQXJyb3dVcEZyb21XYXRlclB1bXAsIGZhTWljcm9waG9uZUxpbmVzU2xhc2gsIGZhTWljcm9waG9uZUFsdFNsYXNoLCBmYVNlcnZlciwgZmFVc2VyMiwgZmFVc2VyQWx0MiwgZmFVc2VyTGFyZ2UyLCBmYVNub3dmbGFrZTIsIGZhVGF1cnVzLCBmYVNrdWxsQ3Jvc3Nib25lcywgZmFQZXNvU2lnbiwgZmFXaW5lR2xhc3MsIGZhVGVtcGVyYXR1cmVIYWxmLCBmYVRlbXBlcmF0dXJlMiwgZmFUaGVybW9tZXRlcjIsIGZhVGhlcm1vbWV0ZXJIYWxmLCBmYVRpY2tldCwgZmFXaGVhdEF3bkNpcmNsZUV4Y2xhbWF0aW9uLCBmYUFycm93c1R1cm5SaWdodCwgZmFDYW5keUNhbmUsIGZhV2hlZWxjaGFpciwgZmFTcGVsbENoZWNrLCBmYVZvbHVtZU9mZiwgZmFMdW5ncywgZmFCb29rbWFyazIsIGZhQmFyY29kZSwgZmFMaXN0T2wsIGZhTGlzdDEyLCBmYUxpc3ROdW1lcmljLCBmYUZpbGVDaXJjbGVYbWFyaywgZmFDdWJlLCBmYVRhcGUsIGZhQm9tYiwgZmFTY2FsZVVuYmFsYW5jZWQsIGZhQmFsYW5jZVNjYWxlTGVmdCwgZmFTcXVhcmVDYXJldExlZnQyLCBmYUNhcmV0U3F1YXJlTGVmdDIsIGZhUnVsZXIsIGZhSSwgZmFWb2x1bWVYbWFyaywgZmFWb2x1bWVNdXRlLCBmYVZvbHVtZVRpbWVzLCBmYUFyY2h3YXksIGZhUGVyc29uRGlnZ2luZywgZmFEaWdnaW5nLCBmYUdhdWdlSGlnaCwgZmFUYWNob21ldGVyQWx0LCBmYVRhY2hvbWV0ZXJBbHRGYXN0LCBmYUdlbmRlcmxlc3MsIGZhQ2xvdWRTdW4sIGZhQXJyb3dSaWdodCwgZmFIYW5kc2hha2UyLCBmYUhhbmRzaGFrZUFsdDIsIGZhSGFuZHNoYWtlU2ltcGxlMiwgZmFQZXJzb25Ta2lpbmcsIGZhU2tpaW5nLCBmYUJyaWRnZVdhdGVyLCBmYUJ1aWxkaW5nTmdvLCBmYUlnbG9vLCBmYUNpcmNsZURvbGxhclRvU2xvdCwgZmFEb25hdGUsIGZhWSwgZmFGYWNlU21pbGVXaW5rMiwgZmFTbWlsZVdpbmsyLCBmYURpY2VGb3VyLCBmYUZhY2VHcmluU3F1aW50VGVhcnMyLCBmYUdyaW5TcXVpbnRUZWFyczIsIGZhRmlsZUF1ZGlvMiwgZmFBcnJvd3NEb3duVG9MaW5lLCBmYUcsIGZhVmloYXJhLCBmYUZsYWdDaGVja2VyZWQsIGZhR2F1Z2VTaW1wbGUsIGZhR2F1Z2VTaW1wbGVNZWQsIGZhVGFjaG9tZXRlckF2ZXJhZ2UsIGZhUmlnaHRMZWZ0LCBmYUV4Y2hhbmdlQWx0LCBmYVBpbGxzLCBmYUV4cGxvc2lvbiwgZmFBcnJvd3NEb3duVG9QZW9wbGUsIGZhVXNlcnNWaWV3ZmluZGVyLCBmYUNhck9uLCBmYVNsZWlnaCwgZmFEdW1iYmVsbCwgZmFCYWJ5Q2FycmlhZ2UsIGZhQ2FycmlhZ2VCYWJ5LCBmYUtpd2lCaXJkLCBmYUNhbGVuZGFyWG1hcmsyLCBmYUNhbGVuZGFyVGltZXMyLCBmYUNpcmNsZURvd24yLCBmYUFycm93QWx0Q2lyY2xlRG93bjIsIGZhRmlsZU1lZGljYWwsIGZhWG1hcmssIGZhQ2xvc2UsIGZhTXVsdGlwbHksIGZhUmVtb3ZlLCBmYVRpbWVzLCBmYVNoYXBlcywgZmFUcmlhbmdsZUNpcmNsZVNxdWFyZSwgZmFEaWNlT25lLCBmYUxvY2tPcGVuLCBmYVBlcHBlckhvdCwgZmFEcm9wbGV0U2xhc2gsIGZhVGludFNsYXNoLCBmYURyb3BsZXQsIGZhVGludCwgZmFGaWxlTGluZXMyLCBmYUZpbGVBbHQyLCBmYUZpbGVUZXh0MiwgZmFDb21tZW50c0RvbGxhciwgZmFNYWduaWZ5aW5nR2xhc3NMb2NhdGlvbiwgZmFTZWFyY2hMb2NhdGlvbiwgZmFGaWxlSW52b2ljZSwgZmFQZW50YWdvbiwgZmFSZXB1YmxpY2FuLCBmYVNob3AsIGZhU3RvcmVBbHQsIGZhRmlsbSwgZmFGaWxtQWx0LCBmYUZpbG1TaW1wbGUsIGZhQnVpbGRpbmdDaXJjbGVYbWFyaywgZmFDb21tZW50czIsIGZhVGFncywgZmFHdW4sIGZhQ2lyY2xlQ2hlY2syLCBmYUNoZWNrQ2lyY2xlMiwgZmFTY29ycGlvLCBmYUlkQ2FyZENsaXAsIGZhSWRDYXJkQWx0LCBmYU1vb24yLCBmYU9pbFdlbGwsIGZhVGFjaG9ncmFwaERpZ2l0YWwsIGZhRGlnaXRhbFRhY2hvZ3JhcGgsIGZhVGFibGV0LCBmYVRhYmxldEFuZHJvaWQsIGZhUnVibGVTaWduLCBmYVJvdWJsZSwgZmFSdWIsIGZhUnVibGUsIGZhQ2xvc2VkQ2FwdGlvbmluZzIsIGZhUGVuLCBmYVBsYW5lLCBmYUltYWdlczIsIGZhTW9iaWxlU2NyZWVuLCBmYU1vYmlsZUFuZHJvaWRBbHQsIGZhR3VhcmFuaVNpZ24sIGZhQmFnU2hvcHBpbmcsIGZhU2hvcHBpbmdCYWcsIGZhQ2lyY2xlUmlnaHQyLCBmYUFycm93QWx0Q2lyY2xlUmlnaHQyLCBmYVBob25lVm9sdW1lLCBmYVZvbHVtZUNvbnRyb2xQaG9uZSwgZmFDdWJlcywgZmFQaG9uZSwgZmFUb3JpaUdhdGUsIGZhQmFjb24sIGZhUGVyc29uRmFsbGluZ0J1cnN0LCBmYVF1b3RlUmlnaHQsIGZhUXVvdGVSaWdodEFsdCwgZmFIb3VzZU1lZGljYWxGbGFnLCBmYVByZXNjcmlwdGlvbiwgZmFEaWNlVGhyZWUsIGZhQnVpbGRpbmdMb2NrLCBmYUlkQ2FyZDIsIGZhRHJpdmVyc0xpY2Vuc2UyLCBmYUNpcmNsZVBsYXkyLCBmYVBsYXlDaXJjbGUyLCBmYUZhY2VMYXVnaEJlYW0yLCBmYUxhdWdoQmVhbTIsIGZhTGVhZiwgZmFIb3VzZUNoaW1uZXlVc2VyLCBmYVJvdGF0ZVJpZ2h0LCBmYVJlZG9BbHQsIGZhUm90YXRlRm9yd2FyZCwgZmFUb290aCwgZmFIb3VzZUNoaW1uZXlXaW5kb3csIGZhTW90b3JjeWNsZSwgZmFCYWNrd2FyZEZhc3QsIGZhRmFzdEJhY2t3YXJkLCBmYUFkZHJlc3NCb29rMiwgZmFDb250YWN0Qm9vazIsIGZhU2FpbGJvYXQsIGZhQm9va0Jvb2ttYXJrLCBmYU1hZ25pZnlpbmdHbGFzc0Fycm93UmlnaHQsIGZhTWljcm9waG9uZUxpbmVzLCBmYU1pY3JvcGhvbmVBbHQsIGZhUmVwbHlBbGwsIGZhTWFpbFJlcGx5QWxsLCBmYVVuaXZlcnNhbEFjY2VzcywgZmFUb2lsZXRQYXBlciwgZmFUb2lsZXRQYXBlckFsdCwgZmFUb2lsZXRQYXBlckJsYW5rLCBmYVZyQ2FyZGJvYXJkLCBmYVBpenphU2xpY2UsIGZhU3ByYXlDYW4sIGZhVm9sdW1lTG93LCBmYVZvbHVtZURvd24sIGZhQ3Jvc3MsIGZhUGVyc29uLCBmYU1hbGUsIGZhSG91cmdsYXNzMywgZmFIb3VyZ2xhc3NFbXB0eTIsIGZhRmlzaCwgZmFEcnVtc3RpY2tCaXRlLCBmYUNoYXJ0U2ltcGxlLCBmYUF0b20sIGZhUCwgZmFKZXRGaWdodGVyVXAsIGZhUGx1Z0NpcmNsZVhtYXJrLCBmYVNoZWV0UGxhc3RpYywgZmFWLCBmYUxpc3QsIGZhTGlzdFNxdWFyZXMsIGZhUGlzY2VzLCBmYVNvbGFyUGFuZWwsIGZhTGFuZE1pbmVPbiwgZmFIZWFkcGhvbmVzMiwgZmFIZWFkcGhvbmVzQWx0MiwgZmFIZWFkcGhvbmVzU2ltcGxlMiwgZmFCdXMsIGZhRmlsZVBvd2VycG9pbnQyLCBmYVF1b3RlTGVmdCwgZmFRdW90ZUxlZnRBbHQsIGZhQ2hldnJvbkRvd24sIGZhRWFydGhBc2lhLCBmYUdsb2JlQXNpYSwgZmFDZW50U2lnbiwgZmFTaGllbGRDYXQsIGZhU2Nob29sQ2lyY2xlQ2hlY2ssIGZhTWFydGluaUdsYXNzLCBmYUdsYXNzTWFydGluaUFsdCwgZmFQbHVnLCBmYVBhbm9yYW1hLCBmYUNsb2NrUm90YXRlTGVmdCwgZmFIaXN0b3J5LCBmYUphcldoZWF0LCBmYUNsb3VkQXJyb3dEb3duLCBmYUNsb3VkRG93bmxvYWQsIGZhQ2xvdWREb3dubG9hZEFsdCwgZmFUcnVja1JhbXBCb3gsIGZhVHJ1Y2tMb2FkaW5nLCBmYUFuZ2xlRG93biwgZmFQbHVnQ2lyY2xlQ2hlY2ssIGZhV2luZG93TWF4aW1pemUyLCBmYUhhbmRzSG9sZGluZ0NpcmNsZSwgZmFMb2NhdGlvblBpbiwgZmFNYXBNYXJrZXIsIGZhQm93bGluZ0JhbGwsIGZhQ2FydEZsYXRiZWQsIGZhRG9sbHlGbGF0YmVkLCBmYUhvdXNlVXNlciwgZmFIb21lVXNlciwgZmFHaG9zdCwgZmFDb21tZW50Tm9kZXMsIGZhUGVyc29uQXJyb3dEb3duVG9MaW5lLCBmYVBsdWdDaXJjbGVQbHVzLCBmYVBlcnNvblN3aW1taW5nLCBmYVN3aW1tZXIsIGZhQ29tbWVudERvdHMyLCBmYUNvbW1lbnRpbmcyLCBmYUNoYXJ0UGllLCBmYVBpZUNoYXJ0LCBmYUZyb2csIGZhV2luZUJvdHRsZSwgZmFJbmJveCwgZmFTcXVhcmVILCBmYUhTcXVhcmUsIGZhSG91c2VNZWRpY2FsLCBmYUNpcmNsZUNoZXZyb25SaWdodCwgZmFDaGV2cm9uQ2lyY2xlUmlnaHQsIGZhRmlsZUNzdiwgZmFIYXRDb3dib3ksIGZhRmFjZUdyaW5Ub25ndWVXaW5rMiwgZmFHcmluVG9uZ3VlV2luazIsIGZhTCwgZmFBcnJvd0Rvd25TaG9ydFdpZGUsIGZhU29ydEFtb3VudERlc2MsIGZhU29ydEFtb3VudERvd25BbHQsIGZhSG91cmdsYXNzSGFsZjIsIGZhSG91cmdsYXNzMjIsIGZhU3Bvb24sIGZhVXRlbnNpbFNwb29uLCBmYUNyZWRpdENhcmQyLCBmYUNyZWRpdENhcmRBbHQyLCBmYUZpbGVJbnZvaWNlRG9sbGFyLCBmYVNwYWdoZXR0aU1vbnN0ZXJGbHlpbmcsIGZhUGFzdGFmYXJpYW5pc20sIGZhTWFydGluaUdsYXNzQ2l0cnVzLCBmYUNvY2t0YWlsLCBmYUJ1bGxob3JuLCBmYUJveFRpc3N1ZSwgZmFNYXR0cmVzc1BpbGxvdywgZmFDaGV2cm9uTGVmdCwgZmFDbG91ZE1vb25SYWluLCBmYUFycm93RG93bjE5LCBmYVNvcnROdW1lcmljQXNjLCBmYVNvcnROdW1lcmljRG93biwgZmFIYW5kU3BvY2syLCBmYVdhbmRNYWdpY1NwYXJrbGVzLCBmYU1hZ2ljV2FuZFNwYXJrbGVzLCBmYUNvbW1lbnRNZWRpY2FsLCBmYUJlbGxTbGFzaDIsIGZhSGFuZHNoYWtlU2xhc2gsIGZhSGFuZHNoYWtlQWx0U2xhc2gsIGZhSGFuZHNoYWtlU2ltcGxlU2xhc2gsIGZhQm90dGxlV2F0ZXIsIGZhRGljZUQyMCwgZmFBcnJvd0Rvd25aQSwgZmFTb3J0QWxwaGFEZXNjLCBmYVNvcnRBbHBoYURvd25BbHQsIGZhQnJ1c2gsIGZhUGVyc29uV2Fsa2luZ0Rhc2hlZExpbmVBcnJvd1JpZ2h0LCBmYUFycm93VXBTaG9ydFdpZGUsIGZhU29ydEFtb3VudFVwQWx0LCBmYUdyaXBWZXJ0aWNhbCwgZmFHcmlkVmVydGljYWwsIGZhQ2FyVHVubmVsLCBmYUNoYXJ0Q29sdW1uLCBmYUNhcHJpY29ybiwgZmFUcnVja0Fycm93UmlnaHQsIGZhVHYsIGZhVGVsZXZpc2lvbiwgZmFUdkFsdCwgZmFTZWN0aW9uLCBmYVBlYWNlLCBmYVN0YXIyLCBmYUZsYWcyLCBmYVRyaWFuZ2xlRXhjbGFtYXRpb24sIGZhRXhjbGFtYXRpb25UcmlhbmdsZSwgZmFXYXJuaW5nLCBmYVNjaG9vbENpcmNsZUV4Y2xhbWF0aW9uLCBmYUdyYWR1YXRpb25DYXAsIGZhTW9ydGFyQm9hcmQsIGZhU3RvcmUsIGZhVXNlckFzdHJvbmF1dCwgZmFCdWlsZGluZ0ZsYWcsIGZhTXVnU2F1Y2VyLCBmYUNvZmZlZSwgZmFMZW1vbjIsIGZhQ2FyYXZhbiwgZmFRLCBmYUxvY2ssIGZhUGFpbnRSb2xsZXIsIGZhVm9sdW1lSGlnaCwgZmFWb2x1bWVVcCwgZmFGb2xkZXJQbHVzLCBmYU1lcmN1cnksIGZhQW5jaG9yLCBmYVNxdWFyZVBhcmtpbmcsIGZhUGFya2luZywgZmFIYW51a2lhaCwgZmFSb3RhdGVMZWZ0LCBmYVJvdGF0ZUJhY2ssIGZhUm90YXRlQmFja3dhcmQsIGZhVW5kb0FsdCwgZmFIZWFkaW5nLCBmYUhlYWRlciwgZmFDcm9zc2hhaXJzLCBmYUNpcmNsZU5vZGVzLCBmYVdpbmRvd1Jlc3RvcmUyLCBmYVIsIGZhRmlsdGVyQ2lyY2xlWG1hcmssIGZhR29wdXJhbSwgZmFIZWFydENpcmNsZU1pbnVzLCBmYVN0YXJPZkxpZmUsIGZhQnVzaW5lc3NUaW1lLCBmYUJyaWVmY2FzZUNsb2NrLCBmYUZpcmVFeHRpbmd1aXNoZXIsIGZhQXJyb3dEb3duTG9uZywgZmFMb25nQXJyb3dEb3duLCBmYVVzZXJNaW51cywgZmFNb25leUNoZWNrLCBmYUhvdXNlTGFwdG9wLCBmYUxhcHRvcEhvdXNlLCBmYURvd25sb2FkLCBmYVNhZ2l0dGFyaXVzLCBmYUNvdWNoLCBmYVJvYWRMb2NrLCBmYVNjaXNzb3JzLCBmYUN1dCwgZmFCdWcsIGZhQXJyb3dSaWdodEZyb21CcmFja2V0LCBmYVNpZ25PdXQsIGZhSGFuZEhvbGRpbmdIYW5kLCBmYVN0cm9vcHdhZmVsLCBmYUNoaWxkLCBmYUljZUNyZWFtLCBmYUNvbXB1dGVyTW91c2UsIGZhTW91c2UsIGZhRmF1Y2V0LCBmYUF3YXJkLCBmYVBlcnNvbkRyb3duaW5nLCBmYUNhbWVyYVJvdGF0ZSwgZmFGYWNlR3JpbkhlYXJ0czIsIGZhR3JpbkhlYXJ0czIsIGZhRmlsZUZyYWdtZW50LCBmYVBlcnNvbk1pbGl0YXJ5UmlmbGUsIGZhVG9nZ2xlT24sIGZhTHVuZ3NWaXJ1cywgZmFUYWJsZVRlbm5pc1BhZGRsZUJhbGwsIGZhUGluZ1BvbmdQYWRkbGVCYWxsLCBmYVRhYmxlVGVubmlzLCBmYUJveGVzUGFja2luZywgZmFQZXJzb25DaGFsa2JvYXJkLCBmYURpY2VUd28sIGZhQXJyb3dSaWdodEFycm93TGVmdCwgZmFFeGNoYW5nZSwgZmFGb290YmFsbCwgZmFGb290YmFsbEJhbGwsIGZhVHJ1Y2tNb25zdGVyLCBmYUFzdGVyaXNrLCBmYUJhdHRlcnlGdWxsLCBmYUJhdHRlcnksIGZhQmF0dGVyeTUsIGZhQ2hpbGREcmVzcywgZmFGYWNlS2lzc0JlYW0yLCBmYUtpc3NCZWFtMiwgZmFUcmFzaENhbkFycm93VXAsIGZhVHJhc2hSZXN0b3JlQWx0LCBmYUZvbnQsIGZhQm9yZUhvbGUsIGZhVmlydXNDb3ZpZCwgZmFGaWxlUGRmMiwgZmFMYW5ndWFnZSwgZmFTaGllbGRIYWx2ZWQsIGZhU2hpZWxkQWx0LCBmYUNhcmV0VXAsIGZhRmlsZVBlbiwgZmFGaWxlRWRpdCwgZmFQZXJzb25CaWtpbmcsIGZhQmlraW5nLCBmYUJvb2tPcGVuUmVhZGVyLCBmYUJvb2tSZWFkZXIsIGZhR2xhc3NXYXRlckRyb3BsZXQsIGZhVG93ZXJCcm9hZGNhc3QsIGZhQnJvYWRjYXN0VG93ZXIsIGZhTWluaW1pemUsIGZhQ29tcHJlc3NBcnJvd3NBbHQsIGZhQXJyb3dSaWdodFRvQ2l0eSwgZmFMYXB0b3BNZWRpY2FsLCBmYUJyZWFkU2xpY2UsIGZhR2xvYmUsIGZhRm9sZGVyTWludXMsIGZhTWFza0ZhY2UsIGZhQm9uZywgZmFSb2FkQnJpZGdlLCBmYUFycm93VXA5MSwgZmFTb3J0TnVtZXJpY1VwQWx0LCBmYU1vdW50YWluQ2l0eSwgZmFBcnJvd0Rvd245MSwgZmFTb3J0TnVtZXJpY0Rlc2MsIGZhU29ydE51bWVyaWNEb3duQWx0LCBmYUZhY2VHcmluV2lkZTIsIGZhR3JpbkFsdDIsIGZhUG9vcCwgZmFEaGFybWFjaGFrcmEsIGZhQmF0dGVyeVF1YXJ0ZXIsIGZhQmF0dGVyeTIsIGZhQW5raCwgZmFEaWFtb25kLCBmYVN1YnNjcmlwdCwgZmFSdXBlZVNpZ24sIGZhUnVwZWUsIGZhUGVyc29uUmlmbGUsIGZhRCwgZmFTcXVhcmVOZmksIGZhVGVldGgsIGZhTWFnbmlmeWluZ0dsYXNzRG9sbGFyLCBmYVNlYXJjaERvbGxhciwgZmFEdW1wc3RlckZpcmUsIGZhVXBsb2FkLCBmYVVzZXJTbGFzaCwgZmFVc2VyQWx0U2xhc2gsIGZhVXNlckxhcmdlU2xhc2gsIGZhQXJyb3dMZWZ0LCBmYVZpYWxWaXJ1cywgZmFDaGVja0RvdWJsZSwgZmFQYXcsIGZhSGVsbWV0U2FmZXR5LCBmYUhhcmRIYXQsIGZhSGF0SGFyZCwgZmFFLCBmYUZhY2VMYXVnaFNxdWludDIsIGZhTGF1Z2hTcXVpbnQyLCBmYURvd25MZWZ0QW5kVXBSaWdodFRvQ2VudGVyLCBmYUNvbXByZXNzQWx0LCBmYUdpZnRzLCBmYUJlZCwgZmFNb25leUJpbGxUcmFuc2ZlciwgZmFQZXJzb25SdW5uaW5nLCBmYVJ1bm5pbmcsIGZhQ2lyY2xlQ2hldnJvbkRvd24sIGZhQ2hldnJvbkNpcmNsZURvd24sIGZhVXNlck51cnNlLCBmYUZhY2VLaXNzV2lua0hlYXJ0MiwgZmFLaXNzV2lua0hlYXJ0MiwgZmFGaWxsLCBmYU1vbmV5QmlsbDFXYXZlLCBmYU1vbmV5QmlsbFdhdmVBbHQsIGZhTGFuZG1hcmssIGZhTXVzaWMsIGZhQm9va01lZGljYWwsIGZhU2h1ZmZsZSwgZmFSYW5kb20sIGZhVW5kZXJsaW5lLCBmYUJ1aWxkaW5nVXNlciwgZmFSb2JvdCwgZmFQbHVzLCBmYUFkZCwgZmFDb3B5MiwgZmFDaGVzc0tpbmcyLCBmYUhvdXNlRmxvb2RXYXRlciwgZmFCaXRjb2luU2lnbiwgZmFCb3gsIGZhU3F1YXJlUGx1czIsIGZhUGx1c1NxdWFyZTIsIGZhQXJyb3dzTGVmdFJpZ2h0LCBmYUFycm93c0gsIGZhRmFuLCBmYUNyb3csIGZhRmlsZUNpcmNsZUNoZWNrLCBmYUxpbmtTbGFzaCwgZmFDaGFpbkJyb2tlbiwgZmFDaGFpblNsYXNoLCBmYVVubGluaywgZmFBcnJvd1JvdGF0ZVJpZ2h0LCBmYUFycm93UmlnaHRSb3RhdGUsIGZhQXJyb3dSb3RhdGVGb3J3YXJkLCBmYVJlZG8sIGZhUGVuQ2xpcCwgZmFQZW5BbHQsIGZhRG9vckNsb3NlZCwgZmFBcnJvd0Rvd25XaWRlU2hvcnQsIGZhU29ydEFtb3VudEFzYywgZmFTb3J0QW1vdW50RG93biwgZmFDYXJldERvd24sIGZhSywgZmFDaGVja1RvU2xvdCwgZmFWb3RlWWVhLCBmYUZpc2hGaW5zLCBmYUNvbXByZXNzLCBmYUFycm93VXBBWiwgZmFTb3J0QWxwaGFVcCwgZmFVc2VyR3JhZHVhdGUsIGZhRmlsZUNvZGUyLCBmYVNvYXAsIGZhUmVjeWNsZSwgZmFGYWNlR3JpbldpbmsyLCBmYUdyaW5XaW5rMiwgZmFXYXRlckxhZGRlciwgZmFMYWRkZXJXYXRlciwgZmFTd2ltbWluZ1Bvb2wsIGZhR2VtaW5pLCBmYVRvd2VyQ2VsbCwgZmFDb2xvblNpZ24sIGZhTGFwdG9wRmlsZSwgZmFCYWhhaSwgZmFIYXlrYWwsIGZhTW9uZXlCaWxsMTIsIGZhTW9uZXlCaWxsQWx0MiwgZmFDbG91ZEJvbHQsIGZhVGh1bmRlcnN0b3JtLCBmYUV0aGVybmV0LCBmYUhyeXZuaWFTaWduLCBmYUhyeXZuaWEsIGZhRXllU2xhc2gyLCBmYUNhcnRGbGF0YmVkU3VpdGNhc2UsIGZhTHVnZ2FnZUNhcnQsIGZhUmFkaWF0aW9uLCBmYUZpbGVXb3JkMiwgZmFCZWRQdWxzZSwgZmFQcm9jZWR1cmVzLCBmYVRlbnRzLCBmYU11Z0hvdCwgZmFCb2x0LCBmYVphcCwgZmFKYXIsIGZhVHJ1Y2tQbGFuZSwgZmFIYW5kSG9sZGluZ0hlYXJ0LCBmYUFycm93Um90YXRlTGVmdCwgZmFBcnJvd0xlZnRSb3RhdGUsIGZhQXJyb3dSb3RhdGVCYWNrLCBmYUFycm93Um90YXRlQmFja3dhcmQsIGZhVW5kbywgZmFGYWNlQW5ncnkyLCBmYUFuZ3J5MiwgZmFCdXJzdCwgZmFaLCBmYUJhbmRhZ2UsIGZhQmFuZEFpZCwgZmFQbGFuZUNpcmNsZUV4Y2xhbWF0aW9uLCBmYUJ1c1NpZGUsIGZhQnVncywgZmFCZWVyTXVnRW1wdHksIGZhQmVlciwgZmFQZXJzb25DaXJjbGVDaGVjaywgZmFTdGFwbGVyLCBmYUhvdXNlTWVkaWNhbENpcmNsZUNoZWNrLCBmYU5haXJhU2lnbiwgZmFXaWZpLCBmYVdpZmkzLCBmYVdpZmlTdHJvbmcsIGZhTW9uZXlDaGVja0RvbGxhciwgZmFNb25leUNoZWNrQWx0LCBmYUV5ZUxvd1Zpc2lvbiwgZmFMb3dWaXNpb24sIGZhQ2lyY2xlQXJyb3dVcCwgZmFBcnJvd0NpcmNsZVVwLCBmYUNhbWVyYVJldHJvLCBmYUNhcHN1bGVzLCBmYVBvbywgZmFWb2x1bWUsIGZhVm9sdW1lTWVkaXVtLCBmYUVsZXZhdG9yLCBmYVRhZywgZmFGaWxlQ2lyY2xlTWludXMsIGZhRG93bkxvbmcsIGZhTG9uZ0Fycm93QWx0RG93biwgZmFDb21wYWN0RGlzYywgZmFTdWl0Y2FzZVJvbGxpbmcsIGZhQm9va1F1cmFuLCBmYVF1cmFuLCBmYVBob25lU2xhc2gsIGZhUm9hZENpcmNsZUNoZWNrLCBmYVNob3BMb2NrLCBmYUltYWdlUG9ydHJhaXQsIGZhUG9ydHJhaXQsIGZhQnJpZGdlTG9jaywgZmFIYW1tZXIsIGZhQXJyb3dVcDE5LCBmYVNvcnROdW1lcmljVXAsIGZhQ2hlc3NLbmlnaHQyLCBmYUhvdXNlRmxvb2RXYXRlckNpcmNsZUFycm93UmlnaHQsIGZhQXJyb3dVcFJpZ2h0RnJvbVNxdWFyZSwgZmFFeHRlcm5hbExpbmssIGZhQXJyb3dEb3duVXBBY3Jvc3NMaW5lLCBmYUZhY2VHcmluQmVhbTIsIGZhR3JpbkJlYW0yLCBmYVJlY3RhbmdsZUFkLCBmYUFkLCBmYUJvb2tUYW5ha2gsIGZhVGFuYWtoLCBmYUhvdFR1YlBlcnNvbiwgZmFIb3RUdWIsIGZhRmlsZUhhbGZEYXNoZWQsIGZhT3V0ZGVudCwgZmFEZWRlbnQsIGZhSGFuZFBlYWNlMiwgZmFIZWFkU2lkZVZpcnVzLCBmYUNvbXBhc3MyLCBmYVBlbk5pYiwgZmFUZW50QXJyb3dzRG93biwgZmFGb3J3YXJkRmFzdCwgZmFGYXN0Rm9yd2FyZCwgZmFDcm9wLCBmYVdoaXNrZXlHbGFzcywgZmFHbGFzc1doaXNrZXksIGZhU3F1YXJlMiwgZmFGYWNlR3JpbjIsIGZhR3JpbjIsIGZhRmlsZUNvbnRyYWN0LCBmYUFuZ2xlVXAsIGZhRmFjZVNtaWxlMiwgZmFTbWlsZTIsIGZhUGVyc29uRHJlc3NCdXJzdCwgZmFEaXZpZGUsIGZhQ29kZUZvcmssIGZhSG91c2VGbGFnLCBmYUJ1aWxkaW5nQ29sdW1ucywgZmFCYW5rLCBmYUluc3RpdHV0aW9uLCBmYU11c2V1bSwgZmFVbml2ZXJzaXR5LCBmYVJ1ZywgZmFDb2RlTWVyZ2UsIGZhSG91c2VUc3VuYW1pLCBmYU1hZ25pZnlpbmdHbGFzc0NoYXJ0LCBmYVVtYnJlbGxhLCBmYUhpbGxSb2Nrc2xpZGUsIGZhVXNlclNlY3JldCwgZmFQYWdlciwgZmFCcmllZmNhc2UsIGZhVHJvd2VsQnJpY2tzLCBmYVNvY2tzLCBmYVQsIGZhTWljcm9jaGlwLCBmYVRydWNrTWVkaWNhbCwgZmFBbWJ1bGFuY2UsIGZhT20sIGZhTW9zcXVpdG9OZXQsIGZhUHJlc2NyaXB0aW9uQm90dGxlLCBmYVVzZXJzR2VhciwgZmFVc2Vyc0NvZywgZmFSb2FkQ2lyY2xlRXhjbGFtYXRpb24sIGZhUGF1c2UsIGZhU3RhZmZTbmFrZSwgZmFSb2RBc2NsZXBpdXMsIGZhUm9kU25ha2UsIGZhU3RhZmZBZXNjdWxhcGl1cywgZmFQaWdneUJhbmssIGZhTW9udW1lbnQsIGZhQW5nbGVzUmlnaHQsIGZhQW5nbGVEb3VibGVSaWdodCwgZmFEZXNrdG9wLCBmYURlc2t0b3BBbHQsIGZhUGxhbmVDaXJjbGVYbWFyaywgZmFSZXR3ZWV0LCBmYVVzZXJHZWFyLCBmYVVzZXJDb2csIGZhQm9yZGVyQWxsLCBmYUNvaW5zLCBmYU1hcnNTdHJva2UsIGZhSGFuZHNoYWtlQW5nbGUsIGZhSGFuZHNIZWxwaW5nLCBmYUFycm93RG93biwgZmFMb2NhdGlvbkRvdCwgZmFNYXBNYXJrZXJBbHQsIGZhUGx1Z0NpcmNsZUV4Y2xhbWF0aW9uLCBmYUNvb2tpZUJpdGUsIGZhU2NyZXdkcml2ZXJXcmVuY2gsIGZhVG9vbHMsIGZhSW5kZW50LCBmYUJhcnMsIGZhTmF2aWNvbiwgZmFIYW5kc1ByYXlpbmcsIGZhUHJheWluZ0hhbmRzLCBmYVZpcnVzZXMsIGZhU2Nob29sRmxhZywgZmFUcmFkZW1hcmssIGZhRmlyZUJ1cm5lciwgZmFGYWNlU21pbGVCZWFtMiwgZmFTbWlsZUJlYW0yLCBmYVRlbnRBcnJvd0xlZnRSaWdodCwgZmFSb3V0ZSwgZmFBbmdsZXNVcCwgZmFBbmdsZURvdWJsZVVwLCBmYUJ1Y2tldCwgZmFMZXNzVGhhbkVxdWFsLCBmYUZvbGRlckNsb3NlZDIsIGZhUGVyc29uVGhyb3VnaFdpbmRvdywgZmFTY2hvb2xMb2NrLCBmYVBlcnNvbkJ1cnN0LCBmYUxlZnRMb25nLCBmYUxvbmdBcnJvd0FsdExlZnQsIGZhTG9jYXRpb25Dcm9zc2hhaXJzLCBmYUxvY2F0aW9uLCBmYVBlcnNvbkRvdHNGcm9tTGluZSwgZmFEaWFnbm9zZXMsIGZhR2F1Z2VTaW1wbGVIaWdoLCBmYVRhY2hvbWV0ZXIsIGZhVGFjaG9tZXRlckZhc3QsIGZhQW5nbGVzTGVmdCwgZmFBbmdsZURvdWJsZUxlZnQsIGZhVXBEb3duLCBmYUFycm93c0FsdFYsIGZhQmF0dGVyeUVtcHR5LCBmYUJhdHRlcnkwLCBmYUtleWJvYXJkMiwgZmFDb29raWUsIGZhU3RvcHdhdGNoLCBmYUVqZWN0LCBmYVNhdGVsbGl0ZURpc2gsIGZhRmFjZVJvbGxpbmdFeWVzMiwgZmFNZWhSb2xsaW5nRXllczIsIGZhTGlzdENoZWNrLCBmYVRhc2tzLCBmYVNhY2tYbWFyaywgZmFIYXNodGFnLCBmYVRyYWluLCBmYUdhbWVwYWQsIGZhRmlsZUV4cG9ydCwgZmFBcnJvd1JpZ2h0RnJvbUZpbGUsIGZhRmFjZUdyaW1hY2UyLCBmYUdyaW1hY2UyLCBmYVRyYWluU3Vid2F5LCBmYVN1YndheSwgZmFDaXJjbGVEb3QyLCBmYURvdENpcmNsZTIsIGZhT2JqZWN0R3JvdXAyLCBmYVNoaXAsIGZhQywgZmFTcXVhcmVQaG9uZSwgZmFQaG9uZVNxdWFyZSwgZmFSdWxlckNvbWJpbmVkLCBmYUFycm93c1JvdGF0ZSwgZmFSZWZyZXNoLCBmYVN5bmMsIGZhUGVyc29uRHJlc3MsIGZhRmVtYWxlLCBmYUJvb2tPcGVuLCBmYUZvbGRlclRyZWUsIGZhVmlyZ28sIGZhQm94QXJjaGl2ZSwgZmFBcmNoaXZlLCBmYVRlbnRBcnJvd0Rvd25Ub0xpbmUsIGZhUXJjb2RlLCBmYURyYWdvbiwgZmFIb3VyZ2xhc3NFbmQsIGZhSG91cmdsYXNzMzIsIGZhR3JpcCwgZmFHcmlkSG9yaXpvbnRhbCwgZmFHcmlwSG9yaXpvbnRhbCwgZmFCb3JkZXJUb3BMZWZ0LCBmYUJvcmRlclN0eWxlLCBmYUxpc3RVbCwgZmFMaXN0RG90cywgZmFQZW9wbGVSb2JiZXJ5LCBmYU1vYmlsZUJ1dHRvbiwgZmFBcnJvd0Rvd25BWiwgZmFTb3J0QWxwaGFBc2MsIGZhU29ydEFscGhhRG93biwgZmFNb25leUJpbGwsIGZhQ2lyY2xlTWludXMsIGZhTWludXNDaXJjbGUsIGZhQXJyb3dQb2ludGVyLCBmYU1vdXNlUG9pbnRlciwgZmFTcXVhcmVTaGFyZU5vZGVzLCBmYVNoYXJlQWx0U3F1YXJlLCBmYVRhYmxlQ2VsbHNMYXJnZSwgZmFUaExhcmdlLCBmYUNhdCwgZmFDYWxlbmRhcldlZWssIGZhQ29kZUNvbXBhcmUsIGZhTGVvLCBmYVJvYWRDaXJjbGVYbWFyaywgZmFQYWxsZXQsIGZhQ2FrZUNhbmRsZXMsIGZhQmlydGhkYXlDYWtlLCBmYUNha2UsIGZhQnVnU2xhc2gsIGZhVGFycCwgZmFEaWFncmFtUHJlZGVjZXNzb3IsIGZhRmFjZUZsdXNoZWQyLCBmYUZsdXNoZWQyLCBmYURpYWdyYW1OZXh0LCBmYUFuY2hvckNpcmNsZVhtYXJrLCBmYVBlcnNvbkNpcmNsZVhtYXJrLCBmYVNwYSwgZmFBcmllcywgZmFCYXJzUHJvZ3Jlc3MsIGZhVGFza3NBbHQsIGZhSGVhcnRDaXJjbGVDaGVjaywgZmFNYXJzU3Ryb2tlUmlnaHQsIGZhTWFyc1N0cm9rZUgsIGZhVG93ZXJPYnNlcnZhdGlvbiwgZmFTdGVybGluZ1NpZ24sIGZhR2JwLCBmYVBvdW5kU2lnbiwgZmFGYXVjZXREcmlwLCBmYUNpcmNsZUluZm8sIGZhSW5mb0NpcmNsZSwgZmFGZWF0aGVyLCBmYUJvd2xSaWNlLCBmYVN0YXJIYWxmU3Ryb2tlMiwgZmFTdGFySGFsZkFsdDIsIGZhVGVtcGVyYXR1cmVBcnJvd0Rvd24sIGZhVGVtcGVyYXR1cmVEb3duLCBmYU1hc2tWZW50aWxhdG9yLCBmYUZpbGVWaWRlbzIsIGZhQXJyb3dUcmVuZERvd24sIGZhT2lsQ2FuLCBmYVBlb3BsZUNhcnJ5Qm94LCBmYVBlb3BsZUNhcnJ5LCBmYUNoYWlyLCBmYVdpbmQsIGZhTGF5ZXJHcm91cCwgZmFIZWFkU2lkZU1hc2ssIGZhSGFuZHMsIGZhU2lnbkxhbmd1YWdlLCBmYVNpZ25pbmcsIGZhVGFibGV0cywgZmFXZWlnaHRIYW5naW5nLCBmYURpY2UsIGZhU2hvcFNsYXNoLCBmYVN0b3JlQWx0U2xhc2gsIGZhU29ydERvd24sIGZhU29ydERlc2MsIGZhUGVzZXRhU2lnbiwgZmFUYWJsZXRTY3JlZW5CdXR0b24sIGZhVGFibGV0QWx0LCBmYUhhbmRIb2xkaW5nRG9sbGFyLCBmYUhhbmRIb2xkaW5nVXNkLCBmYVNoaWVsZCwgZmFTaGllbGRCbGFuaywgZmFGYWNlTGF1Z2gyLCBmYUxhdWdoMiwgZmFIYW5kc0hvbGRpbmcsIGZhQ2FydFNob3BwaW5nLCBmYVNob3BwaW5nQ2FydCwgZmFPY3RhZ29uLCBmYUhhbmRQb2ludGVyMiwgZmFSZWdpc3RlcmVkMiwgZmFIb3VzZVNpZ25hbCwgZmFCYW5nbGFkZXNoaVRha2FTaWduLCBpY29uczM7CnZhciBpbml0X2ZyZWVfc29saWRfc3ZnX2ljb25zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGZvcnRhd2Vzb21lK2ZyZWUtc29saWQtc3ZnLWljb25zQDcuMi4wL25vZGVfbW9kdWxlcy9AZm9ydGF3ZXNvbWUvZnJlZS1zb2xpZC1zdmctaWNvbnMvaW5kZXgubWpzIigpIHsKICAgIHByZWZpeDMgPSAiZmFzIjsKICAgIGZhMCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICIwIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbXSwgIjMwIiwgIk0wIDE5MkMwIDEwMy42IDcxLjYgMzIgMTYwIDMyczE2MCA3MS42IDE2MCAxNjBsMCAxMjhjMCA4OC40LTcxLjYgMTYwLTE2MCAxNjBTMCA0MDguNCAwIDMyMEwwIDE5MnpNMTYwIDk2Yy01MyAwLTk2IDQzLTk2IDk2bDAgMTI4YzAgNTMgNDMgOTYgOTYgOTZzOTYtNDMgOTYtOTZsMC0xMjhjMC01My00My05Ni05Ni05NnoiXQogICAgfTsKICAgIGZhMSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICIxIiwKICAgICAgaWNvbjogWzI1NiwgNTEyLCBbXSwgIjMxIiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0UzE0LjMgOTYgMzIgOTZsNjQgMCAwIDMyMC02NCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDE5MiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC02NCAwIDAtMzUyYzAtMTcuNy0xNC4zLTMyLTMyLTMyTDMyIDMyeiJdCiAgICB9OwogICAgZmEyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIjIiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiMzIiLCAiTTQ4IDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMybDE3MSAwYzYwLjIgMCAxMDkgNDguOCAxMDkgMTA5IDAgNDMuOC0yNi4yIDgzLjMtNjYuNCAxMDAuNGwtMTM5LjEgNTlDMTE5IDMxNS40IDk2IDM1MC4yIDk2IDM4OC43bDAgMjcuMyAyMjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkw2NCA0ODBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNTkuM2MwLTY0LjIgMzguNC0xMjIuMiA5Ny41LTE0Ny4zbDEzOS4xLTU5YzE2LjYtNy4xIDI3LjQtMjMuNCAyNy40LTQxLjQgMC0yNC45LTIwLjItNDUtNDUtNDVMODAgOTZDNjIuMyA5NiA0OCA4MS43IDQ4IDY0eiJdCiAgICB9OwogICAgZmEzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIjMiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiMzMiLCAiTTgwIDI4OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxMTIgMGMzNS4zIDAgNjQtMjguNyA2NC02NHMtMjguNy02NC02NC02NEwzMiA5NkMxNC4zIDk2IDAgODEuNyAwIDY0UzE0LjMgMzIgMzIgMzJsMTYwIDBjNzAuNyAwIDEyOCA1Ny4zIDEyOCAxMjggMCAzOC4yLTE2LjggNzIuNS00My4zIDk2IDI2LjYgMjMuNSA0My4zIDU3LjggNDMuMyA5NiAwIDcwLjctNTcuMyAxMjgtMTI4IDEyOEwzMiA0ODBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMTYwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRzLTI4LjctNjQtNjQtNjRMODAgMjg4eiJdCiAgICB9OwogICAgZmE0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIjQiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiMzQiLCAiTTY0IDY0YzAtMTcuNy0xNC4zLTMyLTMyLTMyUzAgNDYuMyAwIDY0TDAgMjg4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE5MiAwIDAgOTZjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTk2IDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTMyIDAgMC0yMjRjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAyMjQtMTkyIDAgMC0yMjR6Il0KICAgIH07CiAgICBmYTUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiNSIsCiAgICAgIGljb246IFszMjAsIDUxMiwgW10sICIzNSIsICJNMCA2NEMwIDQ2LjMgMTQuMyAzMiAzMiAzMmwyMjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTkyIDAgMCAxMTIgMTIwIDBjNzUuMSAwIDEzNiA2MC45IDEzNiAxMzZTMjU5LjEgNDgwIDE4NCA0ODBMMzIgNDgwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDE1MiAwYzM5LjggMCA3Mi0zMi4yIDcyLTcycy0zMi4yLTcyLTcyLTcyTDMyIDI3MmMtMTcuNyAwLTMyLTE0LjMtMzItMzJMMCA2NHoiXQogICAgfTsKICAgIGZhNiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICI2IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgIjM2IiwgIk0yNTYgMzJjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTg4IDBjLTQ4LjYgMC04OCAzOS40LTg4IDg4bDAgMzIuMmMyMi45LTE1LjMgNTAuNC0yNC4yIDgwLTI0LjJsNDggMGM3OS41IDAgMTQ0IDY0LjUgMTQ0IDE0NFMyODcuNSA0ODAgMjA4IDQ4MGwtNDggMEM4MC41IDQ4MCAxNiA0MTUuNSAxNiAzMzZsMC0xNTJDMTYgMTAwLjEgODQuMSAzMiAxNjggMzJsODggMHpNODAgMzM2YzAgNDQuMiAzNS44IDgwIDgwIDgwbDQ4IDBjNDQuMiAwIDgwLTM1LjggODAtODBzLTM1LjgtODAtODAtODBsLTQ4IDBjLTQ0LjIgMC04MCAzNS44LTgwIDgweiJdCiAgICB9OwogICAgZmE3ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIjciLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiMzciLCAiTTAgNjRDMCA0Ni4zIDE0LjMgMzIgMzIgMzJsMjU2IDBjMTEuNSAwIDIyIDYuMSAyNy43IDE2LjFzNS43IDIyLjItLjEgMzIuMWwtMjI0IDM4NGMtOC45IDE1LjMtMjguNSAyMC40LTQzLjggMTEuNXMtMjAuNC0yOC41LTExLjUtNDMuOEwyMzIuMyA5NiAzMiA5NkMxNC4zIDk2IDAgODEuNyAwIDY0eiJdCiAgICB9OwogICAgZmE4ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIjgiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiMzgiLCAiTTMwNCAxNjBjMC03MC43LTU3LjMtMTI4LTEyOC0xMjhsLTMyIDBjLTcwLjcgMC0xMjggNTcuMy0xMjggMTI4IDAgMzQuNiAxMy43IDY2IDM2IDg5LTMxLjUgMjMuMy01MiA2MC44LTUyIDEwMyAwIDcwLjcgNTcuMyAxMjggMTI4IDEyOGw2NCAwYzcwLjcgMCAxMjgtNTcuMyAxMjgtMTI4IDAtNDIuMi0yMC41LTc5LjctNTItMTAzIDIyLjMtMjMgMzYtNTQuNCAzNi04OXpNMTc2LjEgMjg4bDE1LjkgMGMzNS4zIDAgNjQgMjguNyA2NCA2NHMtMjguNyA2NC02NCA2NGwtNjQgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRzMjguNy02NCA2NC02NGw0OC4xIDB6bTAtNjRMMTQ0IDIyNGMtMzUuMyAwLTY0LTI4LjctNjQtNjQgMC0zNS4zIDI4LjctNjQgNjQtNjRsMzIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NCAwIDM1LjMtMjguNiA2NC02NCA2NHoiXQogICAgfTsKICAgIGZhOSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICI5IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgIjM5IiwgIk0yMDggMzIwYzI5LjYgMCA1Ny4xLTguOSA4MC0yNC4ybDAgMzIuMmMwIDQ4LjYtMzkuNCA4OC04OCA4OEw5NiA0MTZjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMTA0IDBjODMuOSAwIDE1Mi02OC4xIDE1Mi0xNTJsMC0xNTIuMUMzNTEuOSA5Ni40IDI4Ny41IDMyIDIwOCAzMmwtNDggMEM4MC41IDMyIDE2IDk2LjUgMTYgMTc2UzgwLjUgMzIwIDE2MCAzMjBsNDggMHptODAtMTQ0YzAgNDQuMi0zNS44IDgwLTgwIDgwbC00OCAwYy00NC4yIDAtODAtMzUuOC04MC04MHMzNS44LTgwIDgwLTgwbDQ4IDBjNDQuMiAwIDgwIDM1LjggODAgODB6Il0KICAgIH07CiAgICBmYURvbGxhclNpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZG9sbGFyLXNpZ24iLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFsxMjgxNzgsIDYxNzgxLCAiZG9sbGFyIiwgInVzZCJdLCAiMjQiLCAiTTEzNiAyNGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgNDAgNTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTE0LjkgMGMtMjQuOSAwLTQ1LjEgMjAuMi00NS4xIDQ1LjEgMCAyMi41IDE2LjUgNDEuNSAzOC43IDQ0LjdsOTEuNiAxMy4xYzUzLjggNy43IDkzLjcgNTMuNyA5My43IDEwOCAwIDYwLjMtNDguOSAxMDkuMS0xMDkuMSAxMDkuMWwtMTAuOSAwIDAgNDBjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC00MC03MiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDEzMC45IDBjMjQuOSAwIDQ1LjEtMjAuMiA0NS4xLTQ1LjEgMC0yMi41LTE2LjUtNDEuNS0zOC43LTQ0LjdsLTkxLjYtMTMuMUM1NS45IDI3My41IDE2IDIyNy40IDE2IDE3My4xIDE2IDExMi45IDY0LjkgNjQgMTI1LjEgNjRsMTAuOSAwIDAtNDB6Il0KICAgIH07CiAgICBmYURvbGxhciA9IGZhRG9sbGFyU2lnbjsKICAgIGZhVXNkID0gZmFEb2xsYXJTaWduOwogICAgZmFEb2cgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZG9nIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4MDIxXSwgImY2ZDMiLCAiTTMyIDExMmMxNi42IDAgMzAuMiAxMi42IDMxLjggMjguN2wuMyA2LjZDNjUuOCAxNjMuNCA3OS40IDE3NiA5NiAxNzZsMTc5LjEgMCAxNDAuOSA2MC40IDAgMjQzLjZjMCAxNy43LTE0LjMgMzItMzIgMzJsLTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTMxLjNDMjk2IDM2MSAyNjguOCAzNjggMjQwIDM2OHMtNTYtNy04MC0xOS4zTDE2MCA0ODBjMCAxNy43LTE0LjMgMzItMzIgMzJsLTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMjQ1LjZjLTM3LjMtMTMuMi02NC00OC42LTY0LTkwLjQgMC0xNy43IDE0LjMtMzIgMzItMzJ6TTM1NS44LTMyYzcuNyAwIDE0LjkgMy42IDE5LjYgOS44TDM5MiAwIDQ0NC4xIDBjMTIuNyAwIDI0LjkgNS4xIDMzLjkgMTQuMUw0OTYgMzIgNTUyIDMyYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgMjRjMCA0NC4yLTM1LjggODAtODAgODBsLTY0IDAtNyAyOC0xMjQuNy01My40IDMxLjYtMTQ3LjJDMzM0LjMtMjMuOSAzNDQuMi0zMiAzNTUuOC0zMnpNNDQ4IDQ0YTIwIDIwIDAgMSAwIDAgNDAgMjAgMjAgMCAxIDAgMC00MHoiXQogICAgfTsKICAgIGZhVHJ1Y2tNb3ZpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHJ1Y2stbW92aW5nIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY0ZGYiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MjRjMCA0OC42IDM5LjQgODggODggODggMjUuMiAwIDQ4LTEwLjYgNjQtMjcuNiAxNiAxNyAzOC44IDI3LjYgNjQgMjcuNiA0MC4zIDAgNzQuMi0yNy4xIDg0LjctNjRsMTM0LjYgMGMxMC40IDM2LjkgNDQuNCA2NCA4NC43IDY0IDQzIDAgNzguOS0zMC45IDg2LjUtNzEuNyAyMC0xMC44IDMzLjUtMzIgMzMuNS01Ni4zbDAtMTQ2LjdjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNMNTc2IDE0Ni43Yy0xMi0xMi0yOC4zLTE4LjctNDUuMy0xOC43bC01MC43IDAgMC0zMmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnpNNDgwIDE5Mmw1MC43IDAgNDUuMyA0NS4zIDAgNTAuNy05NiAwIDAtOTZ6TTg4IDM4NGE0MCA0MCAwIDEgMSAwIDgwIDQwIDQwIDAgMSAxIDAtODB6bTM5MiA0MGE0MCA0MCAwIDEgMSA4MCAwIDQwIDQwIDAgMSAxIC04MCAwek0yMTYgMzg0YTQwIDQwIDAgMSAxIDAgODAgNDAgNDAgMCAxIDEgMC04MHoiXQogICAgfTsKICAgIGZhUm90YXRlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJvdGF0ZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODI2MCwgInN5bmMtYWx0Il0sICJmMmYxIiwgIk00ODAuMSAxOTJsNy45IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC0xNDRjMC05LjctNS44LTE4LjUtMTQuOC0yMi4yUzQ3Ny45IC4yIDQ3MSA3TDQxOS4zIDU4LjhDMzc1IDIyLjEgMzE4IDAgMjU2IDAgMTI3IDAgMjAuMyA5NS40IDIuNiAyMTkuNSAuMSAyMzcgMTIuMiAyNTMuMiAyOS43IDI1NS43czMzLjctOS43IDM2LjItMjcuMUM3OS4yIDEzNS41IDE1OS4zIDY0IDI1NiA2NCAzMDAuNCA2NCAzNDEuMiA3OSAzNzMuNyAxMDQuM0wzMjcgMTUxYy02LjkgNi45LTguOSAxNy4yLTUuMiAyNi4yUzMzNC4zIDE5MiAzNDQgMTkybDEzNi4xIDB6bTI5LjQgMTAwLjVjMi41LTE3LjUtOS43LTMzLjctMjcuMS0zNi4ycy0zMy43IDkuNy0zNi4yIDI3LjFjLTEzLjMgOTMtOTMuNCAxNjQuNS0xOTAuMSAxNjQuNS00NC40IDAtODUuMi0xNS0xMTcuNy00MC4zTDE4NSAzNjFjNi45LTYuOSA4LjktMTcuMiA1LjItMjYuMlMxNzcuNyAzMjAgMTY4IDMyMEwyNCAzMjBjLTEzLjMgMC0yNCAxMC43LTI0IDI0TDAgNDg4YzAgOS43IDUuOCAxOC41IDE0LjggMjIuMlMzNC4xIDUxMS44IDQxIDUwNWw1MS44LTUxLjhDMTM3IDQ4OS45IDE5NCA1MTIgMjU2IDUxMiAzODUgNTEyIDQ5MS43IDQxNi42IDUwOS40IDI5Mi41eiJdCiAgICB9OwogICAgZmFTeW5jQWx0ID0gZmFSb3RhdGU7CiAgICBmYVNxdWFyZU1pbnVzMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtbWludXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs2MTc2NywgIm1pbnVzLXNxdWFyZSJdLCAiZjE0NiIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnptNzIgMjAwbDE3NiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNzYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhTWludXNTcXVhcmUyID0gZmFTcXVhcmVNaW51czI7CiAgICBmYUFsaWduSnVzdGlmeSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhbGlnbi1qdXN0aWZ5IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYwMzkiLCAiTTQ0OCA2NGMwLTE3LjctMTQuMy0zMi0zMi0zMkwzMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0UzE0LjMgOTYgMzIgOTZsMzg0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJ6bTAgMjU2YzAtMTcuNy0xNC4zLTMyLTMyLTMyTDMyIDI4OGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzODQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnpNMCAxOTJjMCAxNy43IDE0LjMgMzIgMzIgMzJsMzg0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgMTYwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnpNNDQ4IDQ0OGMwLTE3LjctMTQuMy0zMi0zMi0zMkwzMiA0MTZjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzg0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJ6Il0KICAgIH07CiAgICBmYUNhbGVuZGFyQ2hlY2syID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhbGVuZGFyLWNoZWNrIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyNzQiLCAiTTMyMCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzIgMzIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI4OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDMyIDAgMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMzIgMTI4IDAgMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnptMjIgMTYxLjdjLTEwLjctNy44LTI1LjctNS40LTMzLjUgNS4zTDE4OS4xIDMzMS4yIDEzNyAyNzkuMWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWw3MiA3MmM1IDUgMTEuOSA3LjUgMTguOCA3czEzLjQtNC4xIDE3LjUtOS44TDM0Ny4zIDE5NS4yYzcuOC0xMC43IDUuNC0yNS43LTUuMy0zMy41eiJdCiAgICB9OwogICAgZmFGYWNlS2lzczIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1raXNzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTM1LCAia2lzcyJdLCAiZjU5NiIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTI0MCAyODhsMzIgMGMyNi41IDAgNDggMjEuNSA0OCA0OCAwIDEyLjMtNC42IDIzLjUtMTIuMiAzMiA3LjYgOC41IDEyLjIgMTkuNyAxMi4yIDMyIDAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZzNy4yLTE2IDE2LTE2bDE2IDBjOC44IDAgMTYtNy4yIDE2LTE2cy03LjItMTYtMTYtMTZsLTE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsMTYgMGM4LjggMCAxNi03LjIgMTYtMTZzLTcuMi0xNi0xNi0xNmwtMTYgMGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNnptLTk2LTgwYTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTE5Mi0zMmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYUtpc3MyID0gZmFGYWNlS2lzczI7CiAgICBmYUtpdGNoZW5TZXQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAia2l0Y2hlbi1zZXQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUxYSIsICJNMjQwIDE0NGE5NiA5NiAwIDEgMCAtMTkyIDAgOTYgOTYgMCAxIDAgMTkyIDB6bTQ0LjQgMzJDMjY5LjkgMjQwLjEgMjEyLjUgMjg4IDE0NCAyODggNjQuNSAyODggMCAyMjMuNSAwIDE0NFM2NC41IDAgMTQ0IDBjNjguNSAwIDEyNS45IDQ3LjkgMTQwLjQgMTEybDcxLjggMGM4LjgtOS44IDIxLjYtMTYgMzUuOC0xNmwxMDQgMGMyNi41IDAgNDggMjEuNSA0OCA0OHMtMjEuNSA0OC00OCA0OGwtMTA0IDBjLTE0LjIgMC0yNy02LjItMzUuOC0xNmwtNzEuOCAwek0xNDQgODBhNjQgNjQgMCAxIDEgMCAxMjggNjQgNjQgMCAxIDEgMC0xMjh6TTQwMCAyNDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA4IDk2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTI0MCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDk2IDAgMC04YzAtMTMuMyAxMC43LTI0IDI0LTI0ek0yODggNDY0bDAtMTEyIDIyNCAwIDAgMTEyYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xMjggMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDh6TTQ4IDMyMGwxMjggMGMyNi41IDAgNDggMjEuNSA0OCA0OHMtMjEuNSA0OC00OCA0OGwtMTYgMGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtNjQgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC04MGMwLTguOCA3LjItMTYgMTYtMTZ6bTEyOCA2NGM4LjggMCAxNi03LjIgMTYtMTZzLTcuMi0xNi0xNi0xNmwtMTYgMCAwIDMyIDE2IDB6TTI0IDQ2NGwxNzYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNEwyNCA1MTJjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYURuYSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkbmEiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjk1MTZdLCAiZjQ3MSIsICJNMzUyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzIgMCA1Ny44LTI0LjQgMTA0LjgtNTcuNCAxNDQuNS0yNC4xIDI4LjktNTMuOCA1NS4xLTgzLjYgNzkuNSAyOS44IDI0LjUgNTkuNSA1MC42IDgzLjYgNzkuNSAzMyAzOS42IDU3LjQgODYuNyA1Ny40IDE0NC41IDAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMyTDY0IDQ4MGMwIDE3LjctMTQuMyAzMi0zMiAzMlMwIDQ5Ny43IDAgNDgwQzAgNDIyLjIgMjQuNCAzNzUuMiA1Ny40IDMzNS41IDgxLjUgMzA2LjYgMTExLjIgMjgwLjUgMTQxIDI1NiAxMTEuMiAyMzEuNSA4MS41IDIwNS40IDU3LjQgMTc2LjUgMjQuNCAxMzYuOCAwIDg5LjggMCAzMiAwIDE0LjMgMTQuMyAwIDMyIDBTNjQgMTQuMyA2NCAzMmwyNTYgMGMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNMjgzLjUgMzg0bC0xODIuOSAwYy04LjIgMTAuNS0xNS4xIDIxLjEtMjAuNiAzMmwyMjQuMiAwYy01LjYtMTAuOS0xMi41LTIxLjUtMjAuNi0zMnpNMjM4IDMzNmMtMTQuMy0xMy0yOS44LTI1LjgtNDYtMzktMTYuMiAxMy4xLTMxLjcgMjYtNDYgMzlsOTIgMHpNMTAwLjUgMTI4bDE4Mi45IDBjOC4yLTEwLjUgMTUuMS0yMS4xIDIwLjYtMzJMNzkuOSA5NmM1LjYgMTAuOSAxMi41IDIxLjUgMjAuNiAzMnpNMTQ2IDE3NmMxNC4zIDEzIDI5LjggMjUuOCA0NiAzOSAxNi4yLTEzLjEgMzEuNy0yNiA0Ni0zOWwtOTIgMHoiXQogICAgfTsKICAgIGZhQ2hpbGRSZWFjaGluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGlsZC1yZWFjaGluZyIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlNTlkIiwgIk0yNTYgNjRhNjQgNjQgMCAxIDAgLTEyOCAwIDY0IDY0IDAgMSAwIDEyOCAwek0xNTIuOSAxNjkuM2MtMjMuNy04LjQtNDQuNS0yNC4zLTU4LjgtNDUuOEw3NC42IDk0LjJDNjQuOCA3OS41IDQ1IDc1LjYgMzAuMyA4NS40UzExLjYgMTE1IDIxLjQgMTI5LjhMNDAuOSAxNTljMTguMSAyNy4xIDQyLjggNDguNCA3MS4xIDYyLjRMMTEyIDQ4MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtOTYgMzIgMCAwIDk2YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yNTguNGMyOS4xLTE0LjIgNTQuNC0zNi4yIDcyLjctNjQuMmwxOC4yLTI3LjljOS42LTE0LjggNS40LTM0LjYtOS40LTQ0LjNzLTM0LjYtNS41LTQ0LjMgOS40TDI5MSAxMjIuNGMtMjEuOCAzMy40LTU4LjkgNTMuNi05OC44IDUzLjYtMTIuNiAwLTI0LjktMi0zNi42LTUuOC0uOS0uMy0xLjgtLjctMi43LS45eiJdCiAgICB9OwogICAgZmFQYXN0ZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGFzdGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiZmlsZS1jbGlwYm9hcmQiXSwgImYwZWEiLCAiTTY0IDBDMjguNyAwIDAgMjguNyAwIDY0TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDExMiAwIDAtMjI0YzAtNjEuOSA1MC4xLTExMiAxMTItMTEybDY0IDAgMC00OGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAwek0yNDggMTEybC0xNDQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxNDQgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNHptNDAgNDhjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgMjI0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE2MCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTY1LjVjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNsLTU4LjUtNTguNWMtMTItMTItMjguMy0xOC43LTQ1LjMtMTguN0wyODggMTYweiJdCiAgICB9OwogICAgZmFGaWxlQ2xpcGJvYXJkMiA9IGZhUGFzdGUyOwogICAgZmFNZXRlb3IgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWV0ZW9yIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTczMl0sICJmNzUzIiwgIk00OTMuNyAuOWwtMTk0LjIgNzQuNyAyLjMtMjkuM2MxLTEyLjgtMTIuOC0yMS41LTI0LTE1LjFMMTAxLjMgMTMzLjRDMzguNiAxNjkuNyAwIDIzNi42IDAgMzA5IDAgNDIxLjEgOTAuOSA1MTIgMjAzIDUxMiAyNzUuNCA1MTIgMzQyLjMgNDczLjQgMzc4LjYgNDEwLjdMNDgwLjggMjM0LjNjNi41LTExLjEtMi4yLTI1LTE1LjEtMjRsLTI5LjMgMi4zIDc0LjctMTk0LjJjLjYtMS41IC45LTMuMiAuOS00LjggMC03LjUtNi0xMy41LTEzLjUtMTMuNS0xLjcgMC0zLjMgLjMtNC44IC45ek0xOTIgMTkyYTEyOCAxMjggMCAxIDEgMCAyNTYgMTI4IDEyOCAwIDEgMSAwLTI1NnptMCA5NmEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem0xNiA5NmExNiAxNiAwIDEgMCAwLTMyIDE2IDE2IDAgMSAwIDAgMzJ6Il0KICAgIH07CiAgICBmYUdlYXJzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImdlYXJzIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbImNvZ3MiXSwgImYwODUiLCAiTTQxNS45IDIxMC41YzEyLjItMy4zIDI1IDIuNSAzMC41IDEzLjhMNDY1IDI2MS45YzEwLjMgMS40IDIwLjQgNC4yIDI5LjkgOC4xbDM1LTIzLjNjMTAuNS03IDI0LjQtNS42IDMzLjMgMy4zbDE5LjIgMTkuMmM4LjkgOC45IDEwLjMgMjIuOSAzLjMgMzMuM2wtMjMuMyAzNC45YzEuOSA0LjcgMy42IDkuNiA1IDE0LjcgMS40IDUuMSAyLjMgMTAuMSAzIDE1LjJsMzcuNyAxOC42YzExLjMgNS42IDE3LjEgMTguNCAxMy44IDMwLjVsLTcgMjYuMmMtMy4zIDEyLjEtMTQuNiAyMC4zLTI3LjIgMTkuNWwtNDItMi43Yy02LjMgOC4xLTEzLjYgMTUuNi0yMS45IDIybDIuNyA0MS45Yy44IDEyLjYtNy40IDI0LTE5LjUgMjcuMmwtMjYuMiA3Yy0xMi4yIDMuMy0yNC45LTIuNS0zMC41LTEzLjhsLTE4LjYtMzcuNmMtMTAuMy0xLjQtMjAuNC00LjItMjkuOS04LjFsLTM1IDIzLjNjLTEwLjUgNy0yNC40IDUuNi0zMy4zLTMuM2wtMTkuMi0xOS4yYy04LjktOC45LTEwLjMtMjIuOC0zLjMtMzMuM2wyMy4zLTM1Yy0xLjktNC43LTMuNi05LjYtNS0xNC43cy0yLjMtMTAuMi0zLTE1LjJsLTM3LjctMTguNmMtMTEuMy01LjYtMTctMTguNC0xMy44LTMwLjVsNy0yNi4yYzMuMy0xMi4xIDE0LjYtMjAuMyAyNy4yLTE5LjVsNDEuOSAyLjdjNi4zLTguMSAxMy42LTE1LjYgMjEuOS0yMmwtMi43LTQxLjhjLS44LTEyLjYgNy40LTI0IDE5LjUtMjcuMmwyNi4yLTd6TTQ0OC40IDM0MGE0NCA0NCAwIDEgMCAuMSA4OCA0NCA0NCAwIDEgMCAtLjEtODh6TTIyNC45LTQ1LjVsMjYuMiA3YzEyLjEgMy4zIDIwLjMgMTQuNyAxOS41IDI3LjJsLTIuNyA0MS44YzguMyA2LjQgMTUuNiAxMy44IDIxLjkgMjJsNDItMi43YzEyLjUtLjggMjMuOSA3LjQgMjcuMiAxOS41bDcgMjYuMmMzLjIgMTIuMS0yLjUgMjQuOS0xMy44IDMwLjVsLTM3LjcgMTguNmMtLjcgNS4xLTEuNyAxMC4yLTMgMTUuMnMtMy4xIDEwLTUgMTQuN2wyMy4zIDM1YzcgMTAuNSA1LjYgMjQuNC0zLjMgMzMuM0wzMDcuMyAyNjJjLTguOSA4LjktMjIuOCAxMC4zLTMzLjMgMy4zTDIzOSAyNDJjLTkuNSAzLjktMTkuNiA2LjctMjkuOSA4LjFsLTE4LjYgMzcuNmMtNS42IDExLjMtMTguNCAxNy0zMC41IDEzLjhsLTI2LjItN2MtMTIuMi0zLjMtMjAuMy0xNC43LTE5LjUtMjcuMmwyLjctNDEuOWMtOC4zLTYuNC0xNS42LTEzLjgtMjEuOS0yMmwtNDIgMi43Yy0xMi41IC44LTIzLjktNy40LTI3LjItMTkuNWwtNy0yNi4yYy0zLjItMTIuMSAyLjUtMjQuOSAxMy44LTMwLjVsMzcuNy0xOC42Yy43LTUuMSAxLjctMTAuMSAzLTE1LjIgMS40LTUuMSAzLTEwIDUtMTQuN0w1NS4xIDQ2LjVjLTctMTAuNS01LjYtMjQuNCAzLjMtMzMuM0w3Ny42LTZjOC45LTguOSAyMi44LTEwLjMgMzMuMy0zLjNsMzUgMjMuM2M5LjUtMy45IDE5LjYtNi43IDI5LjktOC4xbDE4LjYtMzcuNmM1LjYtMTEuMyAxOC4zLTE3IDMwLjUtMTMuOHpNMTkyLjQgODRhNDQgNDQgMCAxIDAgMCA4OCA0NCA0NCAwIDEgMCAwLTg4eiJdCiAgICB9OwogICAgZmFDb2dzID0gZmFHZWFyczsKICAgIGZhRmlsZUNpcmNsZVBsdXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1jaXJjbGUtcGx1cyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzU4NjA2XSwgImU0OTQiLCAiTTk2IDBDNjAuNyAwIDMyIDI4LjcgMzIgNjRsMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTgwIDBjLTIyLjctMzEuNS0zNi03MC4yLTM2LTExMiAwLTEwMC42IDc3LjQtMTgzLjIgMTc2LTE5MS4zbDAtMzguMWMwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0wyOTAuNyAxOC43QzI3OC43IDYuNyAyNjIuNSAwIDI0NS41IDBMOTYgMHpNMzU3LjUgMTc2TDI2NCAxNzZjLTEzLjMgMC0yNC0xMC43LTI0LTI0TDI0MCA1OC41IDM1Ny41IDE3NnpNNDMyIDU0NGExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6bTE2LTIwOGwwIDQ4IDQ4IDBjOC44IDAgMTYgNy4yIDE2IDE2cy03LjIgMTYtMTYgMTZsLTQ4IDAgMCA0OGMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTQ4LTQ4IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsNDggMCAwLTQ4YzAtOC44IDcuMi0xNiAxNi0xNnMxNiA3LjIgMTYgMTZ6Il0KICAgIH07CiAgICBmYUljaWNsZXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaWNpY2xlcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmN2FkIiwgIk03NS44IDMwNC44TDEgMzUuN0MuMyAzMy4yIDAgMzAuNyAwIDI4LjIgMCAxMi42IDEyLjYgMCAyOC4yIDBMNDgyLjQgMGMxNi4zIDAgMjkuNiAxMy4yIDI5LjYgMjkuNiAwIDEuNi0uMSAzLjMtLjQgNC45TDQzNC42IDQ5Ni4xYy0xLjUgOS4yLTkuNSAxNS45LTE4LjggMTUuOS05LjIgMC0xNy4xLTYuNi0xOC43LTE1LjZMMzM2IDE2MCAzMDcuMiAzMDMuOWMtMS45IDkuMy0xMC4xIDE2LjEtMTkuNiAxNi4xLTkuMiAwLTE3LjItNi4yLTE5LjQtMTUuMUwyNDAgMTkyIDIxMC42IDM2OC4yYy0xLjUgOS4xLTkuNCAxNS44LTE4LjYgMTUuOHMtMTcuMS02LjctMTguNi0xNS44TDE0NCAxOTIgMTE1LjkgMzA0LjNjLTIuMyA5LjItMTAuNiAxNS43LTIwLjEgMTUuNy05LjMgMC0xNy41LTYuMi0yMC0xNS4yeiJdCiAgICB9OwogICAgZmFBcnJvd1RyZW5kVXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctdHJlbmQtdXAiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTA5OCIsICJNMzg0IDE2MGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxNjAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDE2MGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTgyLjctMTY5LjQgMTY5LjRjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwTDE5MiAyNjkuMyA1NC42IDQwNi42Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM2wxNjAtMTYwYzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwTDMyMCAzMDYuNyA0NjYuNyAxNjAgMzg0IDE2MHoiXQogICAgfTsKICAgIGZhSGV4YWdvbk5vZGVzQm9sdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoZXhhZ29uLW5vZGVzLWJvbHQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTY5YSIsICJNMjQ4IDEwNi42YzE4LjktOSAzMi0yOC4zIDMyLTUwLjZjMC0zMC45LTI1LjEtNTYtNTYtNTZzLTU2IDI1LjEtNTYgNTZjMCAyMi4zIDEzLjEgNDEuNiAzMiA1MC42bDAgOTguOGMtMi44IDEuMy01LjUgMi45LTggNC43bC04MC4xLTQ1LjhjMS42LTIwLjgtOC42LTQxLjYtMjcuOS01Mi44QzU3LjIgOTYgMjMgMTA1LjIgNy41IDEzMlMxLjIgMTkzIDI4IDIwOC41YzEuMyAuOCAyLjYgMS41IDQgMi4xbDAgOTAuOGMtMS4zIC42LTIuNyAxLjMtNCAyLjFDMS4yIDMxOS04IDM1My4yIDcuNSAzODBTNTcuMiA0MTYgODQgNDAwLjVjMTkuMy0xMS4xIDI5LjQtMzIgMjcuOC01Mi44bDUwLjUtMjguOWMtMTEuNS0xMS4yLTE5LjktMjUuNi0yMy44LTQxLjdMODggMzA2LjFjLTIuNi0xLjgtNS4yLTMuMy04LTQuN2wwLTkwLjhjMi44LTEuMyA1LjUtMi45IDgtNC43bDgwLjEgNDUuOGMtLjEgMS40LS4yIDIuOC0uMiA0LjNjMCAyMi4zIDEzLjEgNDEuNiAzMiA1MC42bDAgOTguOGMtMTguOSA5LTMyIDI4LjMtMzIgNTAuNmMwIDMwLjkgMjUuMSA1NiA1NiA1NmMzMC43IDAgNTUuNi0yNC43IDU2LTU1LjJjLTcuNS0xMi45LTEzLjUtMjYuOC0xNy42LTQxLjVjLTQuMi00LTkuMS03LjMtMTQuNC05LjlsMC05OC44YzIuOC0xLjMgNS41LTIuOSA4LTQuN2wxMC41IDZjNS41LTE1LjMgMTMuMS0yOS41IDIyLjQtNDIuNWwtOS4xLTUuMmMuMS0xLjQgLjItMi44IC4yLTQuM2MwLTIyLjMtMTMuMS00MS42LTMyLTUwLjZsMC05OC44ek00NDAuNSAxMzJDNDI1IDEwNS4yIDM5MC44IDk2IDM2NCAxMTEuNWMtMTkuMyAxMS4xLTI5LjQgMzItMjcuOCA1Mi44bC01MC42IDI4LjljMTEuNSAxMS4yIDE5LjkgMjUuNiAyMy44IDQxLjdMMzYwIDIwNS45Yy40IC4zIC44IC42IDEuMyAuOWMyMS43LTkuNSA0NS42LTE0LjggNzAuOC0xNC44YzIgMCA0IDAgNS45IC4xYzEyLjEtMTcuMyAxMy44LTQwLjYgMi42LTYwLjF6TTQzMiA1MTJhMTQ0IDE0NCAwIDEgMCAwLTI4OCAxNDQgMTQ0IDAgMSAwIDAgMjg4em00Ny45LTIyNWM0LjMgMy43IDUuNCA5LjkgMi42IDE0LjlMNDUyLjQgMzU2bDM1LjYgMGM1LjIgMCA5LjggMy4zIDExLjQgOC4ycy0uMSAxMC4zLTQuMiAxMy40bC05NiA3MmMtNC41IDMuNC0xMC44IDMuMi0xNS4xLS42cy01LjQtOS45LTIuNi0xNC45TDQxMS42IDM4MCAzNzYgMzgwYy01LjIgMC05LjgtMy4zLTExLjQtOC4ycy4xLTEwLjMgNC4yLTEzLjRsOTYtNzJjNC41LTMuNCAxMC44LTMuMiAxNS4xIC42eiJdCiAgICB9OwogICAgZmFRdWVzdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJxdWVzdGlvbiIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWzEwMDY3LCAxMDA2OCwgNjE3MzZdLCAiM2YiLCAiTTY0IDE2MGMwLTUzIDQzLTk2IDk2LTk2czk2IDQzIDk2IDk2YzAgNDIuNy0yNy45IDc4LjktNjYuNSA5MS40LTI4LjQgOS4yLTYxLjUgMzUuMy02MS41IDc2LjZsMCAyNGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjRjMC0xLjcgLjYtNC4xIDMuNS03LjMgMy0zLjMgNy45LTYuNSAxMy43LTguNCA2NC4zLTIwLjcgMTEwLjgtODEgMTEwLjgtMTUyLjMgMC04OC40LTcxLjYtMTYwLTE2MC0xNjBTMCA3MS42IDAgMTYwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJ6bTk2IDM1MmMyMi4xIDAgNDAtMTcuOSA0MC00MHMtMTcuOS00MC00MC00MC00MCAxNy45LTQwIDQwIDE3LjkgNDAgNDAgNDB6Il0KICAgIH07CiAgICBmYUhhbmRzQm91bmQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZHMtYm91bmQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRmOSIsICJNNjQgMzJDNjQgMTQuMyA0OS43IDAgMzIgMFMwIDE0LjMgMCAzMkwwIDIxMy45YzAgMTQuMiA1LjEgMjcuOSAxNC4zIDM4LjdMOTkuNiAzNTIgOTYgMzUyYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDM4NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0zLjYgMCA4NS4zLTk5LjVjOS4yLTEwLjggMTQuMy0yNC41IDE0LjMtMzguN0w1NzYgMzJjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAxMTIuOC02OS4zIDkyLjRjLTUuNyA3LjYtMTYuMSA5LjYtMjQuMiA0LjgtOS43LTUuNy0xMi4xLTE4LjctNS4xLTI3LjVMNDQxIDE4MGMxMC44LTEzLjUgOC45LTMzLjMtNC40LTQ0LjVzLTMzLTkuOC00NC41IDMuMmwtNDYuNyA1Mi41QzMyOSAyMDkuNyAzMjAgMjMzLjQgMzIwIDI1OC4xbDAgOTMuOS02NCAwIDAtOTMuOWMwLTI0LjYtOS00OC40LTI1LjQtNjYuOGwtNDYuNy01Mi41Yy0xMS41LTEzLTMxLjMtMTQuNC00NC41LTMuMlMxMjQuMiAxNjYuNCAxMzUgMTgwbDI3LjYgMzQuNWM3IDguOCA0LjcgMjEuOC01LjEgMjcuNS04LjEgNC44LTE4LjYgMi43LTI0LjItNC44TDY0IDE0NC44IDY0IDMyem02NCA0NDhsMCAzMiAxMjggMCAwLTMyIDY0IDAgMCAzMiAxMjggMCAwLTMyIDMyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRMOTYgNDMyYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDMyIDB6Il0KICAgIH07CiAgICBmYVBlcnNvbldhbGtpbmdMdWdnYWdlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi13YWxraW5nLWx1Z2dhZ2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTU1NCIsICJNMjY0LjMgMjRhNTYgNTYgMCAxIDEgMTEyIDAgNTYgNTYgMCAxIDEgLTExMiAwem0tOCAxODEuM2wtMjIuNiAyMi42Yy02IDYtOS40IDE0LjEtOS40IDIyLjZsMCAzNy41YzAgMTIuMy03IDIzLTE3LjIgMjguNC0uOSA0LjItMi40IDguNC00LjMgMTIuM2wtNjkgMTM4LjEtLjgtLjQtMjcuNyA1NS4zYy05LjkgMTkuOC0zMy45IDI3LjgtNTMuNyAxNy45TDE0LjYgNTIxYy0xOS44LTkuOS0yNy44LTMzLjktMTcuOS01My43TDQ3LjMgMzY2LjNjOS45LTE5LjggMzMuOS0yNy44IDUzLjctMTcuOWwzMC43IDE1LjMgMjguMy01Ni42Yy4zLS42IC40LTEuMiAuNC0xLjhsMC0xNi45YzAtLjIgMC0uMyAwLS41bDAtMzcuNWMwLTI1LjUgMTAuMS00OS45IDI4LjEtNjcuOWwzNS4xLTM1LjFjMjIuOC0yMi44IDUzLjYtMzUuNiA4NS44LTM1LjYgMzYuOSAwIDcxLjggMTYuOCA5NC44IDQ1LjZMNDIyLjEgMTgwYzYuMSA3LjYgMTUuMyAxMiAyNSAxMmwzMy4yIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTMzLjIgMGMtMjkuMiAwLTU2LjctMTMuMy03NS0zNmwtMy44LTQuNyAwIDExNS4yIDM0LjUgMjkuNmMxNy43IDE1LjIgMjkuMyAzNi4yIDMyLjYgNTkuM0w0NDggNTA3LjVjMi41IDE3LjUtOS43IDMzLjctMjcuMiAzNi4ycy0zMy43LTkuNy0zNi4yLTI3LjJMMzcyIDQyOC40Yy0xLjEtNy43LTUtMTQuNy0xMC45LTE5LjhsLTcxLjQtNjEuMmMtMjEuMy0xOC4yLTMzLjUtNDQuOS0zMy41LTcyLjlsMC02OS4zem0uMSAxNjUuOGMyLjQgMi4zIDQuOCA0LjYgNy40IDYuOGw0NiAzOS40LTIuMiA3LjZjLTQuNSAxNS43LTEyLjkgMzAtMjQuNCA0MS41bC02OC4zIDY4LjNjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwcy0xMi41LTMyLjggMC00NS4zTDIzOCA0MjEuMWMzLjgtMy44IDYuNi04LjYgOC4xLTEzLjhMMjU2LjQgMzcxeiJdCiAgICB9OwogICAgZmFGaWxlQXJyb3dEb3duID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbGUtYXJyb3ctZG93biIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJmaWxlLWRvd25sb2FkIl0sICJmNTZkIiwgIk0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwyMTMuNSAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDM2NS4zIDEyNS4zYzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNMMzg0IDQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6bTIwOC01LjVsMCA5My41YzAgMTMuMyAxMC43IDI0IDI0IDI0TDMyNS41IDE3NiAyMDggNTguNXpNMTc1IDQ0MWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMGw2NC02NGM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwbC0yMyAyMyAwLTg2LjFjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCA4Ni4xLTIzLTIzYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDY0IDY0eiJdCiAgICB9OwogICAgZmFGaWxlRG93bmxvYWQgPSBmYUZpbGVBcnJvd0Rvd247CiAgICBmYVBlcnNvbkJvb3RoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1ib290aCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNzU2IiwgIk00MCAyNEE1NiA1NiAwIDEgMSAxNTIgMjQgNTYgNTYgMCAxIDEgNDAgMjR6bTUxLjEgODhjMjMuNSAwIDQ1LjUgMTEuMyA1OS4xIDMwLjRsNDguNyA2OC4yYzYgOC40IDE1LjcgMTMuNCAyNiAxMy40bDMxLjEgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzEuMSAwYy0zMSAwLTYwLjEtMTUtNzguMS00MC4ybC0yLjgtMy45IDAgODAuMSA0MS42IDMxLjJDMjA5LjggMzczLjMgMjI0IDQwMS44IDIyNCA0MzJsMCA4MGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTgwYzAtMTAuMS00LjctMTkuNi0xMi44LTI1LjZMNzAuNCAzNDguOEM0Ni4yIDMzMC43IDMyIDMwMi4yIDMyIDI3MmwwLTEwMC45QzMyIDEzOC41IDU4LjUgMTEyIDkxLjEgMTEyek0zMiA1MTJsMC0xMzIuN2MzLjEgMi43IDYuMyA1LjQgOS42IDcuOUw5NiA0MjggOTYgNTEyYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMyem01NDQtODhsMCA5NmMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTcyLTE2OCAwYy03LjEgMC0xMy44LTMuMS0xOC40LTguNnMtNi41LTEyLjYtNS4zLTE5LjZsMzAuNy0xNzYuNy02My4xLTEzNy42IDAgNzJjLTUuMi0xLTEwLjUtMS42LTE2LTEuNmwtMzIgMCAwLTEyMGMwLTMwLjkgMjUuMS01NiA1Ni01Nkw1MjAgMGMzMC45IDAgNTYgMjUuMSA1NiA1NmwwIDM2OHpNMjg4IDMzNmM1LjUgMCAxMC44LS42IDE2LTEuNkwzMDQgNTIwYzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMTg0IDMyIDB6Il0KICAgIH07CiAgICBmYUxvY3VzdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsb2N1c3QiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUyMCIsICJNMzI4IDMyYzEzNyAwIDI0OCAxMTEgMjQ4IDI0OGwwIDQwLS40IDguMkM1NzEuNSAzNjguNSA1MzcuNCA0MDAgNDk2IDQwMGwtMTIuMyAwIDI1LjIgNDQuMWM2LjYgMTEuNSAyLjYgMjYuMi04LjkgMzIuOHMtMjYuMiAyLjYtMzIuNy04LjlsLTM4LjgtNjcuOS04MC40IDAtNDguMiA2OS43Yy03LjUgMTAuOS0yMi41IDEzLjYtMzMuNCA2LjFzLTEzLjYtMjIuNS02LjEtMzMuNGwyOS4zLTQyLjMtNzQuNSAwLTUxLjcgNzAuMmMtNy45IDEwLjctMjIuOSAxMi45LTMzLjYgNS4xcy0xMi45LTIyLjktNS4xLTMzLjZsNDAuNS01NS00My0xNi40LTc5LjMgMTAwLjVjLTguMiAxMC40LTIzLjMgMTIuMi0zMy43IDRzLTEyLjItMjMuMy00LTMzLjdsMjQwLTMwNCAyLjEtMi4zYzUuMi01LjEgMTIuNS03LjUgMTkuOS02LjYgOC40IDEuMSAxNS42IDYuNSAxOC45IDE0LjNsMjEuNyA1MC43IDQwLjktNTUuNSAyLjEtMi40YzUuMS01LjMgMTIuNS04IDIwLTcuMiA4LjUgMSAxNS45IDYuNSAxOS4zIDE0LjRsNDEuOCA5Ny41IDY0LjIgMGMxMC4yIDAgMjAgMiAyOSA1LjUtMTYuNC05NC05OC4zLTE2NS41LTE5Ny0xNjUuNWwtMTYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxNiAwek00ODggMjk2YTI0IDI0IDAgMSAwIDAgNDggMjQgMjQgMCAxIDAgMC00OHpNNDMuNSAzMzEuMUMzNi4yIDMyMS40IDMyIDMwOS41IDMyIDI5Ni44IDMyIDI2NS41IDU3LjUgMjQwIDg4LjkgMjQwbDI3LjYgMC03Mi45IDkxLjF6TTIyNS4xIDI0MGw0OC4yIDAgMS40LTEuOS0xNi45LTM5LjUtMzIuNyA0MS41em0xMDcuOCAwbDQ2LjcgMC0xNy4yLTQwLTI5LjUgNDB6Il0KICAgIH07CiAgICBmYVJpZ2h0TG9uZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyaWdodC1sb25nIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImxvbmctYXJyb3ctYWx0LXJpZ2h0Il0sICJmMzBiIiwgIk01NjYuNiAyMzMuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM2wtMTI4IDEyOGMtOS4yIDkuMi0yMi45IDExLjktMzQuOSA2LjlTMzg0IDM5Ni45IDM4NCAzODRsMC02NC0zMzYgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC0zMmMwLTI2LjUgMjEuNS00OCA0OC00OGwzMzYgMCAwLTY0YzAtMTIuOSA3LjgtMjQuNiAxOS44LTI5LjZzMjUuNy0yLjIgMzQuOSA2LjlsMTI4IDEyOHoiXQogICAgfTsKICAgIGZhTG9uZ0Fycm93QWx0UmlnaHQgPSBmYVJpZ2h0TG9uZzsKICAgIGZhVHJ1Y2tEcm9wbGV0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRydWNrLWRyb3BsZXQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTU4YyIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwzLjMgMGMxMC40IDM2LjkgNDQuNCA2NCA4NC43IDY0czc0LjItMjcuMSA4NC43LTY0bDEwMi42IDBjMTAuNCAzNi45IDQ0LjQgNjQgODQuNyA2NHM3NC4yLTI3LjEgODQuNy02NGwzLjMgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTE0Ni43YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDUxMiAxNDYuN2MtMTItMTItMjguMy0xOC43LTQ1LjMtMTguN2wtNTAuNyAwIDAtMzJjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6TTUxMiAyMzcuM2wwIDUwLjctOTYgMCAwLTk2IDUwLjcgMCA0NS4zIDQ1LjN6TTE1MiAzODRhNDAgNDAgMCAxIDEgMCA4MCA0MCA0MCAwIDEgMSAwLTgwem0yMzIgNDBhNDAgNDAgMCAxIDEgODAgMCA0MCA0MCAwIDEgMSAtODAgMHpNMjA4IDMwNGMtMzkuOCAwLTcyLTMyLjItNzItNzIgMC0zMy4yIDM0LjUtNzggNTUuOC0xMDIuNCA4LjctMTAgMjMuOC0xMCAzMi41IDAgMjEuMiAyNC40IDU1LjggNjkuMSA1NS44IDEwMi40IDAgNDgtMzIuMiA3Mi03MiA3MnoiXQogICAgfTsKICAgIGZhSGFuZEhvbGRpbmdNZWRpY2FsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbmQtaG9sZGluZy1tZWRpY2FsIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImUwNWMiLCAiTTI0MCAyNGMwLTEzLjMgMTAuNy0yNCAyNC0yNGw0OCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgNTYgNTYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0bC01NiAwIDAgNTZjMCAxMy4zLTEwLjcgMjQtMjQgMjRsLTQ4IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtNTYtNTYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC00OGMwLTEzLjMgMTAuNy0yNCAyNC0yNGw1NiAwIDAtNTZ6TTY2LjcgMzg0bDQyLjUtNDIuNWMyNC0yNCA1Ni42LTM3LjUgOTAuNS0zNy41TDM1MiAzMDRjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTcyIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTEyLjYgMCAxMTkuNy04OC4yYzE3LjgtMTMuMSA0Mi44LTkuMyA1NS45IDguNXM5LjMgNDIuOC04LjUgNTUuOUw0MzMuMSA0ODUuNWMtMjMuNCAxNy4yLTUxLjYgMjYuNS04MC43IDI2LjVMMzIgNTEyYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTY0YzAtMTcuNyAxNC4zLTMyIDMyLTMybDM0LjcgMHoiXQogICAgfTsKICAgIGZhSGFuZFBvaW50TGVmdDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1wb2ludC1sZWZ0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYwYTUiLCAiTTMyIDk2QzE0LjMgOTYgMCAxMTAuMyAwIDEyOHMxNC4zIDMyIDMyIDMybDIwOCAwIDAtNjQtMjA4IDB6TTE5MiAyODhjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNjQgMHptLTY0LTY0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDQ4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTQ4IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyem05NiAxNjBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNjQgMHptODgtOTZsLS42IDBjNS40IDkuNCA4LjYgMjAuMyA4LjYgMzIgMCAxMy4yLTQgMjUuNC0xMC44IDM1LjYgMjQuOSA4LjcgNDIuOCAzMi41IDQyLjggNjAuNCAwIDExLjctMy4xIDIyLjYtOC42IDMybDguNiAwYzg4LjQgMCAxNjAtNzEuNiAxNjAtMTYwbDAtNjEuN2MwLTQyLjQtMTYuOS04My4xLTQ2LjktMTEzLjFsLTExLjYtMTEuNkM0MjkuNSA3Ny41IDM5Ni45IDY0IDM2MyA2NGwtMjcgMGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCA4OGMwIDIyLjEgMTcuOSA0MCA0MCA0MHM0MC0xNy45IDQwLTQwbDAtNTZjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDU2YzAgMzkuOC0zMi4yIDcyLTcyIDcyeiJdCiAgICB9OwogICAgZmFDYWxjdWxhdG9yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhbGN1bGF0b3IiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjg0MjVdLCAiZjFlYyIsICJNNjQgMEMyOC43IDAgMCAyOC43IDAgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjU2IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zODRjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMHpNOTYgNjRsMTkyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAzMmMwIDE3LjctMTQuMyAzMi0zMiAzMkw5NiAxNjBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMzJjMC0xNy43IDE0LjMtMzIgMzItMzJ6bTE2IDE2OGEyNCAyNCAwIDEgMSAtNDggMCAyNCAyNCAwIDEgMSA0OCAwem04MCAyNGEyNCAyNCAwIDEgMSAwLTQ4IDI0IDI0IDAgMSAxIDAgNDh6bTEyOC0yNGEyNCAyNCAwIDEgMSAtNDggMCAyNCAyNCAwIDEgMSA0OCAwek04OCAzNTJhMjQgMjQgMCAxIDEgMC00OCAyNCAyNCAwIDEgMSAwIDQ4em0xMjgtMjRhMjQgMjQgMCAxIDEgLTQ4IDAgMjQgMjQgMCAxIDEgNDggMHptODAgMjRhMjQgMjQgMCAxIDEgMC00OCAyNCAyNCAwIDEgMSAwIDQ4ek02NCA0MjRjMC0xMy4zIDEwLjctMjQgMjQtMjRsMTEyIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRMODggNDQ4Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNHptMjMyLTI0YzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0LTI0LTEwLjctMjQtMjQgMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhTWludXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWludXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs4MjExLCA4NzIyLCAxMDEzNCwgInN1YnRyYWN0Il0sICJmMDY4IiwgIk0wIDI1NmMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzODQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiAyODhjLTE3LjcgMC0zMi0xNC4zLTMyLTMyeiJdCiAgICB9OwogICAgZmFTdWJ0cmFjdCA9IGZhTWludXM7CiAgICBmYUFycm93VXBaQSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy11cC16LWEiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsic29ydC1hbHBoYS11cC1hbHQiXSwgImY4ODIiLCAiTTE1MC42IDQxLjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwbC04MCA4MGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMEw5NiAxNDEuMyA5NiA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTMwNi43IDI1LjQgMjUuNGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zbC04MC04MHpNMjg4IDY0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDUwLjcgMC03My40IDczLjRjLTkuMiA5LjItMTEuOSAyMi45LTYuOSAzNC45UzMwNy4xIDIyNCAzMjAgMjI0bDEyOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC01MC43IDAgNzMuNC03My40YzkuMi05LjIgMTEuOS0yMi45IDYuOS0zNC45UzQ2MSAzMiA0NDggMzJMMzIwIDMyYy0xNy43IDAtMzIgMTQuMy0zMiAzMnpNNDEyLjYgMjczLjdDNDA3LjIgMjYyLjggMzk2LjEgMjU2IDM4NCAyNTZzLTIzLjIgNi44LTI4LjYgMTcuN2wtODAgMTYwYy03LjkgMTUuOC0xLjUgMzUgMTQuMyA0Mi45czM1IDEuNSA0Mi45LTE0LjNsNy4yLTE0LjMgODguNCAwIDcuMiAxNC4zYzcuOSAxNS44IDI3LjEgMjIuMiA0Mi45IDE0LjNzMjIuMi0yNy4xIDE0LjMtNDIuOWwtODAtMTYwek0zODQgMzU5LjZsMjAuMiA0MC40LTQwLjQgMCAyMC4yLTQwLjR6Il0KICAgIH07CiAgICBmYVNvcnRBbHBoYVVwQWx0ID0gZmFBcnJvd1VwWkE7CiAgICBmYU1pY3JvcGhvbmVTbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtaWNyb3Bob25lLXNsYXNoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYxMzEiLCAiTTQxLTI0LjljLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwUy0yLjMtLjMgNyA5LjFsNTI4IDUyOGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlMNDI0LjcgMzU4LjhDNDU4LjkgMzI0LjIgNDgwIDI3Ni42IDQ4MCAyMjRsMC00MGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDQwYzAgMzkuMy0xNS43IDc0LjktNDEuMyAxMDAuOUwzNTYuOCAyOTFDMzczLjYgMjczLjcgMzg0IDI1MCAzODQgMjI0bDAtMTI4YzAtNTMtNDMtOTYtOTYtOTZzLTk2IDQzLTk2IDk2bDAgMzAuMi0xNTEtMTUxem0yOTguMyA0MzRsLTQxLjQtNDEuNGMtMy4zIC4yLTYuNSAuMy05LjggLjMtNzkuNSAwLTE0NC02NC41LTE0NC0xNDRsMC0xMC4yLTQzLjYtNDMuNmMtMi44IDMuOS00LjQgOC43LTQuNCAxMy44bDAgNDBjMCA5Ny45IDczLjMgMTc4LjcgMTY4IDE5MC41bDAgNDkuNS00OCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDE0NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC00OCAwIDAtNDkuNWM5LjMtMS4yIDE4LjQtMyAyNy4zLTUuNHoiXQogICAgfTsKICAgIGZhU3F1YXJlUGVuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1wZW4iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsicGVuLXNxdWFyZSIsICJwZW5jaWwtc3F1YXJlIl0sICJmMTRiIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyek0zMjUuOCAxMzkuN2wxNC40IDE0LjRjMTUuNiAxNS42IDE1LjYgNDAuOSAwIDU2LjZsLTIzLjggMjMuOC03MS03MSAyMy44LTIzLjhjMTUuNi0xNS42IDQwLjktMTUuNiA1Ni42IDB6TTExOS45IDI4OWw5MS41LTkxLjYgNzEgNzEtOTEuNiA5MS41Yy00LjEgNC4xLTkuMiA3LTE0LjkgOC40bC02MC4xIDE1Yy01LjUgMS40LTExLjItLjItMTUuMi00LjJzLTUuNi05LjctNC4yLTE1LjJsMTUtNjAuMWMxLjQtNS42IDQuMy0xMC44IDguNC0xNC45eiJdCiAgICB9OwogICAgZmFQZW5TcXVhcmUgPSBmYVNxdWFyZVBlbjsKICAgIGZhUGVuY2lsU3F1YXJlID0gZmFTcXVhcmVQZW47CiAgICBmYUhhbmRGaXN0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbmQtZmlzdCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzk5OTQsICJmaXN0LXJhaXNlZCJdLCAiZjZkZSIsICJNMTYwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxMTItNjQgMCAwLTExMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNMzIgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJTOTYgNDYuMyA5NiA2NGwwIDgwLTY0IDAgMC04MHptMTkyIDBjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDk2YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtOTZ6bTk2IDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY0em0tOTYgODhsMC0uNmM5LjQgNS40IDIwLjMgOC42IDMyIDguNiAxMy4yIDAgMjUuNC00IDM1LjYtMTAuOCA4LjcgMjQuOSAzMi41IDQyLjggNjAuNCA0Mi44IDExLjcgMCAyMi42LTMuMSAzMi04LjZsMCA4LjZjMCA1Mi4zLTI1LjEgOTguOC02NCAxMjhsMCA5NmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMTYwIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNzguNGMtMTcuMy03LjktMzMuMi0xOC44LTQ2LjktMzIuNUwzNy41IDM1Ny41QzEzLjUgMzMzLjUgMCAzMDAuOSAwIDI2N2wwLTI3YzAtMzUuMyAyOC43LTY0IDY0LTY0bDg4IDBjMjIuMSAwIDQwIDE3LjkgNDAgNDBzLTE3LjkgNDAtNDAgNDBsLTU2IDBjLTguOCAwLTE2IDcuMi0xNiAxNnM3LjIgMTYgMTYgMTZsNTYgMGMzOS44IDAgNzItMzIuMiA3Mi03MnoiXQogICAgfTsKICAgIGZhRmlzdFJhaXNlZCA9IGZhSGFuZEZpc3Q7CiAgICBmYUNvbW1lbnRTbXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY29tbWVudC1zbXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsic21zIl0sICJmN2NkIiwgIk0yNTYgNDgwYzE0MS40IDAgMjU2LTEwNy41IDI1Ni0yNDBTMzk3LjQgMCAyNTYgMCAwIDEwNy41IDAgMjQwYzAgNTQuMyAxOS4yIDEwNC4zIDUxLjYgMTQ0LjVMMi44IDQ3Ni44Yy00LjggOS0zLjMgMjAgMy42IDI3LjVzMTcuOCA5LjggMjcuMSA1LjhsMTE4LjQtNTAuN0MxODMuNyA0NzIuNiAyMTguOSA0ODAgMjU2IDQ4MHpNMTQwLjggMTcyLjhsMTkuMiAwYzguOCAwIDE2IDcuMiAxNiAxNnMtNy4yIDE2LTE2IDE2bC0xOS4yIDBjLTUuMyAwLTkuNiA0LjMtOS42IDkuNnM0LjMgOS42IDkuNiA5LjZjMjMgMCA0MS42IDE4LjYgNDEuNiA0MS42cy0xOC42IDQxLjYtNDEuNiA0MS42bC0yNS42IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsMjUuNiAwYzUuMyAwIDkuNi00LjMgOS42LTkuNnMtNC4zLTkuNi05LjYtOS42Yy0yMyAwLTQxLjYtMTguNi00MS42LTQxLjZzMTguNi00MS42IDQxLjYtNDEuNnptMTg4LjggNDEuNmMwLTIzIDE4LjYtNDEuNiA0MS42LTQxLjZsMTkuMiAwYzguOCAwIDE2IDcuMiAxNiAxNnMtNy4yIDE2LTE2IDE2bC0xOS4yIDBjLTUuMyAwLTkuNiA0LjMtOS42IDkuNnM0LjMgOS42IDkuNiA5LjZjMjMgMCA0MS42IDE4LjYgNDEuNiA0MS42cy0xOC42IDQxLjYtNDEuNiA0MS42bC0yNS42IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsMjUuNiAwYzUuMyAwIDkuNi00LjMgOS42LTkuNnMtNC4zLTkuNi05LjYtOS42Yy0yMyAwLTQxLjYtMTguNi00MS42LTQxLjZ6bS05OC4zLTMzLjhsMjQuNyA0MS4xIDI0LjctNDEuMWMzLjctNi4yIDExLjEtOS4xIDE4LTcuMnMxMS43IDguMiAxMS43IDE1LjRsMCAxMDIuNGMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTQ0LjYtOC43IDE0LjVjLTIuOSA0LjgtOC4xIDcuOC0xMy43IDcuOHMtMTAuOC0zLTEzLjctNy44bC04LjctMTQuNSAwIDQ0LjZjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC0xMDIuNGMwLTcuMiA0LjgtMTMuNSAxMS43LTE1LjRzMTQuMyAxIDE4IDcuMnoiXQogICAgfTsKICAgIGZhU21zID0gZmFDb21tZW50U21zOwogICAgZmFTaW1DYXJkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNpbS1jYXJkIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY3YzQiLCAiTTAgNjRDMCAyOC43IDI4LjcgMCA2NCAwTDI1OC43IDBjMTcgMCAzMy4zIDYuNyA0NS4zIDE4LjdMMzY1LjMgODBjMTIgMTIgMTguNyAyOC4zIDE4LjcgNDUuM0wzODQgNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA2NHpNOTYgMjU2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDQwIDEyOCAwIDAtNzItOTYgMHpNNjQgNDE2YzAgMTcuNyAxNC4zIDMyIDMyIDMybDQ4IDAgMC03Mi04MCAwIDAgNDB6bTI1NiAwbDAtNDAtMTI4IDAgMCA3MiA5NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMyem0wLTEyOGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtNDggMCAwIDcyIDgwIDAgMC00MHoiXQogICAgfTsKICAgIGZhU2NhbGVCYWxhbmNlZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzY2FsZS1iYWxhbmNlZCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzk4NzgsICJiYWxhbmNlLXNjYWxlIl0sICJmMjRlIiwgIk0zODQgMzJsMTI4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzk4LjQgOTZjLTUuMiAyNS44LTIyLjkgNDcuMS00Ni40IDU3LjNsMCAyOTQuNyAxNjAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzg0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMTYwIDAgMC0yOTQuN2MtMjMuNS0xMC4zLTQxLjItMzEuNi00Ni40LTU3LjNMMTI4IDk2Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDEyOCAwYzE0LjYtMTkuNCAzNy44LTMyIDY0LTMyczQ5LjQgMTIuNiA2NCAzMnptNTUuNiAyODhMNTg0LjQgMzIwIDUxMiAxOTUuOCA0MzkuNiAzMjB6TTUxMiA0MTZjLTYyLjkgMC0xMTUuMi0zNC0xMjYtNzguOS0yLjYtMTEgMS0yMi4zIDYuNy0zMi4xbDk1LjItMTYzLjJjNS04LjYgMTQuMi0xMy44IDI0LjEtMTMuOHMxOS4xIDUuMyAyNC4xIDEzLjhsOTUuMiAxNjMuMmM1LjcgOS44IDkuMyAyMS4xIDYuNyAzMi4xLTEwLjggNDQuOC02My4xIDc4LjktMTI2IDc4Ljl6TTEyNi44IDE5NS44TDU0LjQgMzIwIDE5OS4zIDMyMCAxMjYuOCAxOTUuOHpNLjkgMzM3LjFjLTIuNi0xMSAxLTIyLjMgNi43LTMyLjFsOTUuMi0xNjMuMmM1LTguNiAxNC4yLTEzLjggMjQuMS0xMy44czE5LjEgNS4zIDI0LjEgMTMuOGw5NS4yIDE2My4yYzUuNyA5LjggOS4zIDIxLjEgNi43IDMyLjEtMTAuOCA0NC44LTYzLjEgNzguOS0xMjYgNzguOVMxMS43IDM4MiAuOSAzMzcuMXoiXQogICAgfTsKICAgIGZhQmFsYW5jZVNjYWxlID0gZmFTY2FsZUJhbGFuY2VkOwogICAgZmFDYXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NjY0LCAiYXV0b21vYmlsZSJdLCAiZjFiOSIsICJNMTM1LjIgMTE3LjRsLTI2LjEgNzQuNiAyOTMuOCAwLTI2LjEtNzQuNkMzNzIuMyAxMDQuNiAzNjAuMiA5NiAzNDYuNiA5NkwxNjUuNCA5NmMtMTMuNiAwLTI1LjcgOC42LTMwLjIgMjEuNHpNMzkuNiAxOTYuOEw3NC44IDk2LjNDODguMyA1Ny44IDEyNC42IDMyIDE2NS40IDMybDE4MS4yIDBjNDAuOCAwIDc3LjEgMjUuOCA5MC42IDY0LjNsMzUuMiAxMDAuNWMyMy4yIDkuNiAzOS42IDMyLjUgMzkuNiA1OS4ybDAgMTkyYzAgMTcuNy0xNC4zIDMyLTMyIDMybC0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTMyLTMyMCAwIDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJsLTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyTDAgMjU2YzAtMjYuNyAxNi40LTQ5LjYgMzkuNi01OS4yek0xMjggMzA0YTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6bTI4OCAzMmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6Il0KICAgIH07CiAgICBmYUF1dG9tb2JpbGUgPSBmYUNhcjsKICAgIGZhQ3JvcFNpbXBsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjcm9wLXNpbXBsZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJjcm9wLWFsdCJdLCAiZjU2NSIsICJNMTI4IDMyYzAtMTcuNy0xNC4zLTMyLTMyLTMyUzY0IDE0LjMgNjQgMzJsMCAzMi0zMiAwQzE0LjMgNjQgMCA3OC4zIDAgOTZzMTQuMyAzMiAzMiAzMmwzMiAwIDAgMjU2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDIwOCAwIDAtNjQtMjA4IDAgMC0zNTJ6TTM4NCA0ODBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTMyIDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTMyIDAgMC0yNTZjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTIwOCAwIDAgNjQgMjA4IDAgMCAzNTJ6Il0KICAgIH07CiAgICBmYUNyb3BBbHQgPSBmYUNyb3BTaW1wbGU7CiAgICBmYU1lZGFsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1lZGFsIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI3OTQxXSwgImY1YTIiLCAiTTIyNC4zIDEyOEwxMzkuNy0xMi45Yy02LjUtMTAuOC0yMC4xLTE0LjctMzEuMy05LjFMMjEuOCAyMS4zQzkuOSAyNy4yIDUuMSA0MS42IDExIDUzLjVMODAuNiAxOTIuNmMtMzAuMSAzMy45LTQ4LjMgNzguNS00OC4zIDEyNy40IDAgMTA2IDg2IDE5MiAxOTIgMTkyczE5Mi04NiAxOTItMTkyYzAtNDguOS0xOC4zLTkzLjUtNDguMy0xMjcuNEw0MzcuNiA1My41YzUuOS0xMS45IDEuMS0yNi4zLTEwLjctMzIuMkwzNDAuMi0yMi4xYy0xMS4yLTUuNi0yNC45LTEuNi0zMS4zIDkuMUwyMjQuMyAxMjh6bTMwLjggMTQyLjVjMS40IDIuOCA0IDQuNyA3IDUuMWw1MC4xIDcuM2M3LjcgMS4xIDEwLjcgMTAuNSA1LjIgMTZsLTM2LjMgMzUuNGMtMi4yIDIuMi0zLjIgNS4yLTIuNyA4LjNsOC42IDQ5LjljMS4zIDcuNi02LjcgMTMuNS0xMy42IDkuOWwtNDQuOC0yMy42Yy0yLjctMS40LTYtMS40LTguNyAwbC00NC44IDIzLjZjLTYuOSAzLjYtMTQuOS0yLjItMTMuNi05LjlsOC42LTQ5LjljLjUtMy0uNS02LjEtMi43LTguM2wtMzYuMy0zNS40Yy01LjYtNS40LTIuNS0xNC44IDUuMi0xNmw1MC4xLTcuM2MzLS40IDUuNy0yLjQgNy01LjFsMjIuNC00NS40YzMuNC03IDEzLjMtNyAxNi44IDBsMjIuNCA0NS40eiJdCiAgICB9OwogICAgZmFTY3JvbGwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2Nyb2xsIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4MjIwXSwgImY3MGUiLCAiTTAgMTEyQzAgNzAuNSAzMS42IDM2LjQgNzIgMzIuNGwwLS40IDI4MCAwYzUzIDAgOTYgNDMgOTYgOTZsMCAxNzYtMTc2IDBjLTM5LjggMC03MiAzMi4yLTcyIDcybDAgNjBjMCAyNC4zLTE5LjcgNDQtNDQgNDRzLTQ0LTE5LjctNDQtNDRsMC0yMjgtNjQgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC00OHpNMjM2LjggNDgwYzcuMS0xMy4xIDExLjItMjguMSAxMS4yLTQ0bDAtNjBjMC0xMy4zIDEwLjctMjQgMjQtMjRsMjQ4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCAyNGMwIDQ0LjItMzUuOCA4MC04MCA4MGwtMjI3LjIgMHpNODAgODBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgNDggNjQgMCAwLTQ4YzAtMTcuNy0xNC4zLTMyLTMyLTMyeiJdCiAgICB9OwogICAgZmFGaWxlRXhjZWwyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbGUtZXhjZWwiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjFjMyIsICJNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMMjEzLjUgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN0wzNjUuMyAxMjUuM2MxMiAxMiAxOC43IDI4LjMgMTguNyA0NS4zTDM4NCA0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDY0em0yMDgtNS41bDAgOTMuNWMwIDEzLjMgMTAuNyAyNCAyNCAyNEwzMjUuNSAxNzYgMjA4IDU4LjV6TTE2NCAyNjYuN2MtNy40LTExLTIyLjMtMTQtMzMuMy02LjdzLTE0IDIyLjMtNi43IDMzLjNMMTYzLjIgMzUyIDEyNCA0MTAuN2MtNy40IDExLTQuNCAyNS45IDYuNyAzMy4zczI1LjkgNC40IDMzLjMtNi43bDI4LTQyIDI4IDQyYzcuNCAxMSAyMi4zIDE0IDMzLjMgNi43czE0LTIyLjMgNi43LTMzLjNMMjIwLjggMzUyIDI2MCAyOTMuM2M3LjQtMTEgNC40LTI1LjktNi43LTMzLjNzLTI1LjktNC40LTMzLjMgNi43bC0yOCA0Mi0yOC00MnoiXQogICAgfTsKICAgIGZhRmlsdGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbHRlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMGIwIiwgIk0zMiA2NEMxOS4xIDY0IDcuNCA3MS44IDIuNCA4My44Uy4yIDEwOS41IDkuNCAxMTguNkwxOTIgMzAxLjMgMTkyIDQxNmMwIDguNSAzLjQgMTYuNiA5LjQgMjIuNmw2NCA2NGM5LjIgOS4yIDIyLjkgMTEuOSAzNC45IDYuOVMzMjAgNDkyLjkgMzIwIDQ4MGwwLTE3OC43IDE4Mi42LTE4Mi42YzkuMi05LjIgMTEuOS0yMi45IDYuOS0zNC45UzQ5Mi45IDY0IDQ4MCA2NEwzMiA2NHoiXQogICAgfTsKICAgIGZhRHJ1bSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkcnVtIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI5MzQ1XSwgImY1NjkiLCAiTTUwMS4yIDc2LjFjMTEuMS03LjMgMTQuMi0yMi4xIDYuOS0zMy4ycy0yMi4xLTE0LjItMzMuMi02LjlMMzcwLjIgMTA0LjVDMzM1LjggOTguNyAyOTcgOTYgMjU2IDk2IDExNC42IDk2IDAgMTI4IDAgMjA4TDAgMzY4YzAgMzEuMyAyNy40IDU4LjggNzIgNzguN0w3MiAzNDRjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDExOS40YzMzIDguOSA3MS4xIDE0LjUgMTEyIDE2LjFMMjMyIDM3NmMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgMTAzLjVjNDAuOS0xLjYgNzktNy4yIDExMi0xNi4xTDM5MiAzNDRjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDEwMi43YzQ0LjYtMTkuOSA3Mi00Ny40IDcyLTc4LjdsMC0xNjBjMC00MS4xLTMwLjItNjkuNS03OC44LTg3LjRsNjcuOS00NC41ek0zMDcuNCAxNDUuNmwtNjQuNiA0Mi4zYy0xMS4xIDcuMy0xNC4yIDIyLjEtNi45IDMzLjJzMjIuMSAxNC4yIDMzLjIgNi45bDExMS4xLTcyLjhjMTQuNyAzLjIgMjcuOSA3IDM5LjQgMTEuNSAzOC44IDE1LjEgNDQuNCAzMC42IDQ0LjQgNDEuMyAwIC44LTIuNyAxNy4yLTQ2IDM1LjktMzguOSAxNi44LTk2IDI4LjEtMTYyIDI4LjFTMTMyLjkgMjYwLjcgOTQgMjQzLjljLTQzLjMtMTguNy00Ni0zNS4xLTQ2LTM1LjkgMC0xMC42IDUuNi0yNi4yIDQ0LjQtNDEuMyAzOC4zLTE0LjkgOTUuNC0yMi43IDE2My42LTIyLjcgMTggMCAzNS4xIC41IDUxLjQgMS42eiJdCiAgICB9OwogICAgZmFNYXBQaW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFwLXBpbiIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWzEyODIwNV0sICJmMjc2IiwgIk0xOTIgMjg0LjRDMjU2LjEgMjY5LjkgMzA0IDIxMi41IDMwNCAxNDQgMzA0IDY0LjUgMjM5LjUgMCAxNjAgMFMxNiA2NC41IDE2IDE0NGMwIDY4LjUgNDcuOSAxMjUuOSAxMTIgMTQwLjRMMTI4IDQ4MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTk1LjZ6TTE2OCA5NmMtMzAuOSAwLTU2IDI1LjEtNTYgNTYgMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRjMC01Ny40IDQ2LjYtMTA0IDEwNC0xMDQgMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjR6Il0KICAgIH07CiAgICBmYVNjYWxlVW5iYWxhbmNlZEZsaXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2NhbGUtdW5iYWxhbmNlZC1mbGlwIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbImJhbGFuY2Utc2NhbGUtcmlnaHQiXSwgImY1MTYiLCAiTTExOC4yIDYyLjRDMTAxLjUgNTYuOCA5Mi40IDM4LjYgOTggMjEuOVMxMjEuNy0zLjkgMTM4LjUgMS42bDExMyAzNy43YzEzLjktMjMuNSAzOS42LTM5LjMgNjguOS0zOS4zIDQ0LjIgMCA4MCAzNS44IDgwIDgwIDAgMy0uMiA1LjktLjUgOC44bDEyMi42IDQwLjljMTYuOCA1LjYgMjUuOCAyMy43IDIwLjIgNDAuNXMtMjMuNyAyNS44LTQwLjUgMjAuMkwzNjYuNyAxNDUuMmMtNC41IDMuMi05LjMgNS45LTE0LjQgOC4ybDAgMzI2LjdjMCAxNy43LTE0LjMgMzItMzIgMzJsLTE5MiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDE2MCAwIDAtMjk0LjdjLTIxLTkuMi0zNy4yLTI3LTQ0LjItNDlsLTEyNS45LTQyek0yMDAuOCAyODhMMTI4LjMgMTYzLjggNTUuOSAyODggMjAwLjggMjg4em0tNzIuNCA5NmMtNjIuOSAwLTExNS4yLTM0LTEyNi03OC45LTIuNi0xMSAxLTIyLjMgNi43LTMyLjFsOTUuMi0xNjMuMmM1LTguNiAxNC4yLTEzLjggMjQuMS0xMy44czE5LjEgNS4zIDI0LjEgMTMuOGw5NS4yIDE2My4yYzUuNyA5LjggOS4zIDIxLjEgNi43IDMyLjEtMTAuOCA0NC44LTYzLjEgNzguOS0xMjYgNzguOXptMzgyLjgtOTIuMmwtNzIuNCAxMjQuMiAxNDQuOSAwLTcyLjQtMTI0LjJ6bTEyNiAxNDEuM0M2MjYuNCA0NzggNTc0LjEgNTEyIDUxMS4yIDUxMnMtMTE1LjItMzQtMTI2LTc4LjljLTIuNi0xMSAxLTIyLjMgNi43LTMyLjFsOTUuMi0xNjMuMmM1LTguNiAxNC4yLTEzLjggMjQuMS0xMy44czE5LjEgNS4zIDI0LjEgMTMuOGw5NS4yIDE2My4yYzUuNyA5LjggOS4zIDIxLjEgNi43IDMyLjF6Il0KICAgIH07CiAgICBmYUJhbGFuY2VTY2FsZVJpZ2h0ID0gZmFTY2FsZVVuYmFsYW5jZWRGbGlwOwogICAgZmFBcnJvd3NUb0NpcmNsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvd3MtdG8tY2lyY2xlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU0YmQiLCAiTTkuNCA5LjRDMjEuOS0zLjEgNDIuMS0zLjEgNTQuNiA5LjRMMTI4IDgyLjcgMTI4IDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCA5NmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtOTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxOC43IDAtNzMuNC03My40Qy0zLjEgNDIuMS0zLjEgMjEuOSA5LjQgOS40ek0yMDAgMjU2YTU2IDU2IDAgMSAxIDExMiAwIDU2IDU2IDAgMSAxIC0xMTIgMHpNNTAyLjYgNTQuNkw0MjkuMyAxMjggNDQ4IDEyOGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtOTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC05NmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMTguNyA3My40LTczLjRjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM3ptLTQ1LjMgNDQ4TDM4NCA0MjkuMyAzODQgNDQ4YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtOTZjMC0xNy43IDE0LjMtMzIgMzItMzJsOTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTguNyAwIDczLjQgNzMuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMHpNOS40IDQ1Ny40TDgyLjcgMzg0IDY0IDM4NGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw5NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgOTZjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xOC43LTczLjQgNzMuNGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjN6Il0KICAgIH07CiAgICBmYUVudmVsb3BlMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJlbnZlbG9wZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODM4NiwgOTk5MywgNjE0NDNdLCAiZjBlMCIsICJNNDggNjRjLTI2LjUgMC00OCAyMS41LTQ4IDQ4IDAgMTUuMSA3LjEgMjkuMyAxOS4yIDM4LjRsMjA4IDE1NmMxNy4xIDEyLjggNDAuNSAxMi44IDU3LjYgMGwyMDgtMTU2YzEyLjEtOS4xIDE5LjItMjMuMyAxOS4yLTM4LjQgMC0yNi41LTIxLjUtNDgtNDgtNDhMNDggNjR6TTAgMTk2TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTg4LTE5OC40IDE0OC44Yy0zNC4xIDI1LjYtODEuMSAyNS42LTExNS4yIDBMMCAxOTZ6Il0KICAgIH07CiAgICBmYUJhYnkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmFieSIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmNzdjIiwgIk0xMjAgODhhNzIgNzIgMCAxIDEgMTQ0IDAgNzIgNzIgMCAxIDEgLTE0NCAwek03LjcgMTQ0LjVjMTMtMTcuOSAzOC0yMS44IDU1LjktOC44TDk5LjggMTYyYzI2LjggMTkuNSA1OS4xIDMwIDkyLjIgMzBzNjUuNC0xMC41IDkyLjItMzBsMzYuMi0yNi40YzE3LjktMTMgNDIuOS05IDU1LjkgOC44czkgNDIuOS04LjggNTUuOWwtMzYuMiAyNi40Yy0xMy42IDkuOS0yOC4xIDE4LjItNDMuMyAyNWwwIDM2LjMtMTkyIDAgMC0zNi4zYy0xNS4yLTYuNy0yOS43LTE1LjEtNDMuMy0yNUwxNi41IDIwMC4zYy0xNy45LTEzLTIxLjgtMzgtOC44LTU1Ljl6TTk3LjUgMzI5LjNsNjAuNiA1My0yNiAzNy4yIDI0LjMgMjQuM2MxNS42IDE1LjYgMTUuNiA0MC45IDAgNTYuNnMtNDAuOSAxNS42LTU2LjYgMGwtNDgtNDhDMzggNDM4LjYgMzYuMSA0MTcgNDcuMiA0MDEuMWw1MC4yLTcxLjh6bTEyOC41IDUzbDYwLjYtNTMgNTAuMiA3MS44YzExLjEgMTUuOSA5LjIgMzcuNS00LjUgNTEuMmwtNDggNDhjLTE1LjYgMTUuNi00MC45IDE1LjYtNTYuNiAwcy0xNS42LTQwLjkgMC01Ni42bDI0LjMtMjQuMy0yNi0zNy4yeiJdCiAgICB9OwogICAgZmFTcXVhcmVDYXJldERvd24yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1jYXJldC1kb3duIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImNhcmV0LXNxdWFyZS1kb3duIl0sICJmMTUwIiwgIk0zODQgNDgwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDB6TTIyNCAzNTJjLTYuNyAwLTEzLTIuOC0xNy42LTcuN2wtMTA0LTExMmMtNi41LTctOC4yLTE3LjItNC40LTI1LjlTMTEwLjUgMTkyIDEyMCAxOTJsMjA4IDBjOS41IDAgMTguMiA1LjcgMjIgMTQuNHMyLjEgMTguOS00LjQgMjUuOWwtMTA0IDExMmMtNC41IDQuOS0xMC45IDcuNy0xNy42IDcuN3oiXQogICAgfTsKICAgIGZhQ2FyZXRTcXVhcmVEb3duMiA9IGZhU3F1YXJlQ2FyZXREb3duMjsKICAgIGZhVGVudCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0ZW50IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1N2QiLCAiTTI2LjkgMjA2LjlMMy43IDQ0NC45QzEuOCA0NjMuNyAxNi42IDQ4MCAzNS41IDQ4MGwxNzIuNyAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMTI5YzAtOC4zIDYuNy0xNSAxNS0xNSA1LjUgMCAxMC42IDMgMTMuMiA3LjlsODYuMSAxNTljOC40IDE1LjUgMjQuNiAyNS4xIDQyLjIgMjUuMWw2NC4xIDBjMTguOSAwIDMzLjctMTYuMyAzMS44LTM1LjFMNDg1LjYgMjA3LjFjLTEuOS0xOS42LTEyLjgtMzcuMy0yOS41LTQ3LjhMMjgwLjkgNDguM2MtMTUuNy0xMC0zNS44LTkuOS01MS41IC4xTDU2LjEgMTU5LjJjLTE2LjUgMTAuNi0yNy4zIDI4LjItMjkuMiA0Ny43eiJdCiAgICB9OwogICAgZmFBID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImEiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFs5N10sICI0MSIsICJNMjIxLjUgNTEuN0MyMTYuNiAzOS44IDIwNC45IDMyIDE5MiAzMnMtMjQuNiA3LjgtMjkuNSAxOS43Yy05My4zIDIyNC0xNDYuNyAzNTItMTYwIDM4NC02LjggMTYuMyAuOSAzNSAxNy4yIDQxLjhzMzUtLjkgNDEuOC0xNy4ybDMxLjgtNzYuMyAxOTcuMyAwIDMxLjggNzYuM2M2LjggMTYuMyAyNS41IDI0IDQxLjggMTcuMnMyNC0yNS41IDE3LjItNDEuOGMtMTMuMy0zMi02Ni43LTE2MC0xNjAtMzg0ek0yNjQgMzIwbC0xNDQgMCA3Mi0xNzIuOCA3MiAxNzIuOHoiXQogICAgfTsKICAgIGZhUGFyYWNodXRlQm94ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBhcmFjaHV0ZS1ib3giLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjRjZCIsICJNMTI4IDIyNEMxMjggMTUyLjIgMTQ0LjMgODguNCAxNjkuNSA0My40IDE5NS4xLTIuNCAyMjYuNi0yNCAyNTYtMjRzNjAuOSAyMS42IDg2LjUgNjcuNEMzNjcuNyA4OC40IDM4NCAxNTIuMiAzODQgMjI0bC0xMDQgMCAwIDk2IDggMGM5LjMgMCAxOC4xIDIgMjYgNS41bDExOC40LTEwMS41LS41IDBjMC03OC40LTE3LjctMTUwLjYtNDcuNi0yMDQtNi4xLTExLTEyLjktMjEuMy0yMC4zLTMwLjkgODYuNSAzNS45IDE0Ny44IDExNS4xIDE0Ny44IDIxOC45IDAgNy0zLjEgMTMuNy04LjQgMTguMkwzNDcuNCAzNjAuMWMzIDcuNCA0LjYgMTUuNCA0LjYgMjMuOWwwIDY0YzAgMzUuMy0yOC43IDY0LTY0IDY0bC02NCAwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTY0YzAtOC40IDEuNi0xNi41IDQuNi0yMy45TDguNCAyMjYuMkMzLjEgMjIxLjcgMCAyMTUgMCAyMDggMCAxMDQuMiA2MS4zIDI0LjkgMTQ3LjgtMTAuOSAxNDAuNS0xLjQgMTMzLjcgOSAxMjcuNiAyMCA5Ny43IDczLjQgODAgMTQ1LjYgODAgMjI0bC0uNSAwIDExOC40IDEwMS41YzgtMy41IDE2LjgtNS41IDI2LTUuNWw4IDAgMC05Ni0xMDQgMHoiXQogICAgfTsKICAgIGZhQ2FydEFycm93RG93biA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYXJ0LWFycm93LWRvd24iLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjIxOCIsICJNMCA4QzAtNS4zIDEwLjctMTYgMjQtMTZsNDUuMyAwYzI3LjEgMCA1MC4zIDE5LjQgNTUuMSA0NmwuNCAyIDE4Ny4yIDAgMCAxMDIuMS0zMS0zMWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWw3MiA3MmM5LjQgOS40IDI0LjYgOS40IDMzLjkgMGw3Mi03MmM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwbC0zMSAzMSAwLTEwMi4xIDE3Ny40IDBjMjAgMCAzNS4xIDE4LjIgMzEuNCAzNy45TDUzNy44IDIzNS44Yy01LjcgMzAuMy0zMi4xIDUyLjItNjIuOSA1Mi4ybC0zMDMuNiAwIDUuMSAyOC4zYzIuMSAxMS40IDEyIDE5LjcgMjMuNiAxOS43TDQ1NiAzMzZjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTI1NS45IDBjLTM0LjggMC02NC42LTI0LjktNzAuOC01OS4xTDc3LjIgMzguNmMtLjctMy44LTQtNi42LTcuOS02LjZMMjQgMzJDMTAuNyAzMiAwIDIxLjMgMCA4ek0xNjAgNDY0YTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6bTIyNCAwYTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6Il0KICAgIH07CiAgICBmYUJyaWRnZUNpcmNsZUV4Y2xhbWF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJyaWRnZS1jaXJjbGUtZXhjbGFtYXRpb24iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRjYSIsICJNMzIgMzJDMTQuMyAzMiAwIDQ2LjMgMCA2NFMxNC4zIDk2IDMyIDk2bDggMCAwIDY0LTQwIDAgMCAxMTJjMzcuNiA5LjQgNjQgNDMuMiA2NCA4MmwwIDk0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC02NGMwLTUzIDQzLTk2IDk2LTk2IDYuNCAwIDEyLjcgLjYgMTguNyAxLjggMzQuNy00OS41IDkyLjItODEuOCAxNTcuMy04MS44IDI4LjYgMCA1NS42IDYuMiA4MCAxNy40bDAtNjUuNC00MCAwIDAtNjQgOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDMyIDMyek00MjQgOTZsMCA2NC04MCAwIDAtNjQgODAgMHpNMjk2IDk2bDAgNjQtODAgMCAwLTY0IDgwIDB6TTg4IDk2bDgwIDAgMCA2NC04MCAwIDAtNjR6TTQzMiA1NDRhMTQ0IDE0NCAwIDEgMCAwLTI4OCAxNDQgMTQ0IDAgMSAwIDAgMjg4em0wLTEwMGEyMCAyMCAwIDEgMSAwIDQwIDIwIDIwIDAgMSAxIDAtNDB6bTAtMTQwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDgwYzAgOC44LTcuMiAxNi0xNiAxNnMtMTYtNy4yLTE2LTE2bDAtODBjMC04LjggNy4yLTE2IDE2LTE2eiJdCiAgICB9OwogICAgZmFDbG91ZEFycm93VXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2xvdWQtYXJyb3ctdXAiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFs2MjMzOCwgImNsb3VkLXVwbG9hZCIsICJjbG91ZC11cGxvYWQtYWx0Il0sICJmMGVlIiwgIk0xNDQgNDgwYy03OS41IDAtMTQ0LTY0LjUtMTQ0LTE0NCAwLTYzLjQgNDEtMTE3LjIgOTcuOS0xMzYuNS0xLjMtNy43LTEuOS0xNS41LTEuOS0yMy41IDAtNzkuNSA2NC41LTE0NCAxNDQtMTQ0IDU1LjQgMCAxMDMuNSAzMS4zIDEyNy42IDc3LjEgMTQuMi04LjMgMzAuOC0xMy4xIDQ4LjQtMTMuMSA1MyAwIDk2IDQzIDk2IDk2IDAgMTUuNy0zLjggMzAuNi0xMC41IDQzLjcgNDQgMjAuMyA3NC41IDY0LjcgNzQuNSAxMTYuMyAwIDcwLjctNTcuMyAxMjgtMTI4IDEyOGwtMzA0IDB6TTMwNSAxOTFjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwbC03MiA3MmMtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDMxLTMxIDAgMTAyLjFjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTEwMi4xIDMxIDMxYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNzItNzJ6Il0KICAgIH07CiAgICBmYUNsb3VkVXBsb2FkID0gZmFDbG91ZEFycm93VXA7CiAgICBmYUNsb3VkVXBsb2FkQWx0ID0gZmFDbG91ZEFycm93VXA7CiAgICBmYUF0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImF0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjE5NDZdLCAiNDAiLCAiTTI1NiA2NEMxNTAgNjQgNjQgMTUwIDY0IDI1NnM4NiAxOTIgMTkyIDE5MmMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkMxMTQuNiA1MTIgMCAzOTcuNCAwIDI1NlMxMTQuNiAwIDI1NiAwIDUxMiAxMTQuNiA1MTIgMjU2bDAgMzJjMCA1My00MyA5Ni05NiA5Ni0yOS4zIDAtNTUuNi0xMy4yLTczLjItMzMuOS0yMi44IDIxLTUzLjMgMzMuOS04Ni44IDMzLjktNzAuNyAwLTEyOC01Ny4zLTEyOC0xMjhzNTcuMy0xMjggMTI4LTEyOGMyNy45IDAgNTMuNyA4LjkgNzQuNyAyNC4xIDUuNy01IDEzLjEtOC4xIDIxLjMtOC4xIDE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTEyYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zMmMwLTEwNi04Ni0xOTItMTkyLTE5MnptNjQgMTkyYTY0IDY0IDAgMSAwIC0xMjggMCA2NCA2NCAwIDEgMCAxMjggMHoiXQogICAgfTsKICAgIGZhSW5kaWFuUnVwZWVTaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImluZGlhbi1ydXBlZS1zaWduIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbImluZGlhbi1ydXBlZSIsICJpbnIiXSwgImUxYmMiLCAiTTAgNjRDMCA0Ni4zIDE0LjMgMzIgMzIgMzJsMjY0IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTc2LjcgMGMxNy43IDE5LjggMzAuMSA0NC42IDM0LjcgNzJsNDIgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNDIgMGMtMTAuNCA2Mi4yLTYwLjggMTEwLjktMTIzLjggMTE4LjlMMjc0LjYgNDIyYzE0LjQgMTAuMyAxNy43IDMwLjMgNy40IDQ0LjZzLTMwLjMgMTcuNy00NC42IDcuNEwxMy40IDMxNEMyLjEgMzA2LTIuNyAyOTEuNSAxLjUgMjc4LjJTMTguMSAyNTYgMzIgMjU2bDgwIDBjMzUuOCAwIDY2LjEtMjMuNSA3Ni4zLTU2TDI0IDIwMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxNjQuMyAwYy0xMC4yLTMyLjUtNDAuNS01Ni03Ni4zLTU2TDMyIDk2QzE0LjMgOTYgMCA4MS43IDAgNjR6Il0KICAgIH07CiAgICBmYUluZGlhblJ1cGVlID0gZmFJbmRpYW5SdXBlZVNpZ247CiAgICBmYUluciA9IGZhSW5kaWFuUnVwZWVTaWduOwogICAgZmFUcnVjazIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHJ1Y2siLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjg2NjYsIDk5NTFdLCAiZjBkMSIsICJNMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwyODggMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyIDUwLjcgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN0w1NTcuMyAxOTJjMTIgMTIgMTguNyAyOC4zIDE4LjcgNDUuM0w1NzYgMzg0YzAgMzUuMy0yOC43IDY0LTY0IDY0bC0zLjMgMGMtMTAuNCAzNi45LTQ0LjQgNjQtODQuNyA2NHMtNzQuMi0yNy4xLTg0LjctNjRsLTEwMi42IDBjLTEwLjQgMzYuOS00NC40IDY0LTg0LjcgNjRzLTc0LjItMjcuMS04NC43LTY0TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NnpNNTEyIDI4OGwwLTUwLjctNDUuMy00NS4zLTUwLjcgMCAwIDk2IDk2IDB6TTE5MiA0MjRhNDAgNDAgMCAxIDAgLTgwIDAgNDAgNDAgMCAxIDAgODAgMHptMjMyIDQwYTQwIDQwIDAgMSAwIDAtODAgNDAgNDAgMCAxIDAgMCA4MHoiXQogICAgfTsKICAgIGZhQ2hhbGtib2FyZFVzZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hhbGtib2FyZC11c2VyIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbImNoYWxrYm9hcmQtdGVhY2hlciJdLCAiZjUxYyIsICJNMTkyIDM4NGM1MyAwIDk2IDQzIDk2IDk2IDAgMTcuNy0xNC4zIDMyLTMyIDMyTDMyIDUxMmMtMTcuNyAwLTMyLTE0LjMtMzItMzIgMC01MyA0My05NiA5Ni05Nmw5NiAwek01NDQgMzJjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyODhjMCAzMy4xLTI1LjIgNjAuNC01Ny41IDYzLjdsLTYuNSAuMy0yMTEuMSAwYy01LjEtMjQuMi0xNi4zLTQ2LjEtMzIuMS02NGw1MS4yIDAgMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMmw5NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzIgMzIgMCAwLTI4OC0zNTIgMCAwIDU3LjNjLTE0LjgtNi0zMS05LjMtNDgtOS4zLTUuNCAwLTEwLjggLjMtMTYgMWwwLTQ5YzAtMzUuMyAyOC43LTY0IDY0LTY0bDM1MiAwek0xNDQgMzUyYTgwIDgwIDAgMSAxIDAtMTYwIDgwIDgwIDAgMSAxIDAgMTYweiJdCiAgICB9OwogICAgZmFDaGFsa2JvYXJkVGVhY2hlciA9IGZhQ2hhbGtib2FyZFVzZXI7CiAgICBmYVVzZXJDaGVjayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1c2VyLWNoZWNrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY0ZmMiLCAiTTI4NiAzMDRjOTguNSAwIDE3OC4zIDc5LjggMTc4LjMgMTc4LjMgMCAxNi40LTEzLjMgMjkuNy0yOS43IDI5LjdMNzggNTEyYy0xNi40IDAtMjkuNy0xMy4zLTI5LjctMjkuNyAwLTk4LjUgNzkuOC0xNzguMyAxNzguMy0xNzguM2w1OS40IDB6TTU4NS43IDEwNS45YzcuOC0xMC43IDIyLjgtMTMuMSAzMy41LTUuM3MxMy4xIDIyLjggNS4zIDMzLjVMNTIyLjEgMjc0LjljLTQuMiA1LjctMTAuNyA5LjQtMTcuNyA5LjhzLTE0LTIuMi0xOC45LTcuM2wtNDYuNC00OGMtOS4yLTkuNS05LTI0LjcgLjYtMzMuOSA5LjUtOS4yIDI0LjctOC45IDMzLjkgLjZsMjYuNSAyNy40IDg1LjYtMTE3Ljd6TTI1Ni4zIDI0OGExMjAgMTIwIDAgMSAxIDAtMjQwIDEyMCAxMjAgMCAxIDEgMCAyNDB6Il0KICAgIH07CiAgICBmYVVzZXJOaW5qYSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1c2VyLW5pbmphIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI5Mzk5XSwgImY1MDQiLCAiTTM1MiAxMjhjMCA3MC43LTU3LjMgMTI4LTEyOCAxMjgtNTcuMiAwLTEwNS42LTM3LjUtMTIyLTg5LjMtMS4xIDEuMy0yLjIgMi42LTMuNSAzLjgtMTUuOCAxNS44LTM4LjggMjAuNy01My42IDIyLjEtOC4xIC44LTE0LjYtNS43LTEzLjgtMTMuOCAxLjQtMTQuNyA2LjMtMzcuOCAyMi4xLTUzLjYgNS44LTUuOCAxMi42LTEwLjEgMTkuNi0xMy40LTctMy4yLTEzLjgtNy42LTE5LjYtMTMuNC0xNS44LTE1LjgtMjAuNy0zOC44LTIyLjEtNTMuNi0uOC04LjEgNS43LTE0LjYgMTMuOC0xMy44IDE0LjcgMS40IDM3LjggNi4zIDUzLjYgMjIuMSA0LjggNC44IDguNyAxMC40IDExLjcgMTYuMSAyMS4zLTQxLjIgNjQuMy02OS40IDExMy44LTY5LjQgNzAuNyAwIDEyOCA1Ny4zIDEyOCAxMjh6TTE0NCAxMTJjMCA4LjggNy4yIDE2IDE2IDE2bDEyOCAwYzguOCAwIDE2LTcuMiAxNi0xNnMtNy4yLTE2LTE2LTE2TDE2MCA5NmMtOC44IDAtMTYgNy4yLTE2IDE2em0tMS40IDIxMWw2NyA1MC4yYzguNSA2LjQgMjAuMyA2LjQgMjguOCAwbDY3LTUwLjJjNi41LTQuOSAxNS4yLTYuMiAyMi42LTIuOCA2MS40IDI4LjIgMTA0LjEgOTAuMiAxMDQuMSAxNjIuMSAwIDE2LjQtMTMuMyAyOS43LTI5LjcgMjkuN0w0NS43IDUxMmMtMTYuNCAwLTI5LjctMTMuMy0yOS43LTI5LjcgMC03MiA0Mi43LTEzNCAxMDQuMS0xNjIuMSA3LjQtMy40IDE2LjEtMi4xIDIyLjYgMi44eiJdCiAgICB9OwogICAgZmFQbGFudFdpbHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGxhbnQtd2lsdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNWFhIiwgIk0zNDQtMzJjNjYuMyAwIDEyMCA1My43IDEyMCAxMjBsMCA2LjJjMjkuMyAxMi4yIDQ4IDQxLjMgNDggNzYuOSAwIDI3LjktMjUuMyA3NC44LTY2IDExMS43LTMuOCAzLjUtOC44IDUuMy0xNCA1LjNzLTEwLjItMS44LTE0LTUuM2MtNDAuNy0zNi44LTY2LTgzLjctNjYtMTExLjcgMC0zNS42IDE4LjctNjQuNyA0OC03Ni45bDAtNi4yYzAtMzAuOS0yNS4xLTU2LTU2LTU2cy01NiAyNS4xLTU2IDU2bDAgNDI0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMjk2YzAtMzAuOS0yNS4xLTU2LTU2LTU2cy01NiAyNS4xLTU2IDU2bDAgMzguMmMyOS4zIDEyLjIgNDggNDEuMyA0OCA3Ni45IDAgMjcuOS0yNS4zIDc0LjgtNjYgMTExLjctMy44IDMuNS04LjggNS4zLTE0IDUuM3MtMTAuMi0xLjgtMTQtNS4zQzI1LjMgNDA1LjkgMCAzNTkgMCAzMzEuMSAwIDI5NS40IDE4LjcgMjY2LjQgNDggMjU0LjJMNDggMjE2YzAtNjYuMyA1My43LTEyMCAxMjAtMTIwIDIwLjIgMCAzOS4zIDUgNTYgMTMuOEwyMjQgODhjMC02Ni4zIDUzLjctMTIwIDEyMC0xMjB6Il0KICAgIH07CiAgICBmYVdlaWdodFNjYWxlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIndlaWdodC1zY2FsZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJ3ZWlnaHQiXSwgImY0OTYiLCAiTTExNi42IDE5MmMtMy0xMC4xLTQuNi0yMC45LTQuNi0zMiAwLTYxLjkgNTAuMS0xMTIgMTEyLTExMlMzMzYgOTguMSAzMzYgMTYwYzAgMTEuMS0xLjYgMjEuOS00LjYgMzJsLTcxIDAgMjQuNi00NC4zYzYuNC0xMS42IDIuMy0yNi4yLTkuMy0zMi42cy0yNi4yLTIuMy0zMi42IDkuM2wtMzcuNiA2Ny43LTg4LjggMHpNMTI4IDMyTDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTY0IDBDMjkzLjMgMTEuOSAyNjAgMCAyMjQgMHMtNjkuMyAxMS45LTk2IDMyeiJdCiAgICB9OwogICAgZmFXZWlnaHQgPSBmYVdlaWdodFNjYWxlOwogICAgZmFDYXJldFJpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhcmV0LXJpZ2h0IiwKICAgICAgaWNvbjogWzI1NiwgNTEyLCBbXSwgImYwZGEiLCAiTTI0OS4zIDIzNS44YzEwLjIgMTIuNiA5LjUgMzEuMS0yLjIgNDIuOGwtMTI4IDEyOGMtOS4yIDkuMi0yMi45IDExLjktMzQuOSA2LjlTNjQuNSAzOTYuOSA2NC41IDM4NGwwLTI1NmMwLTEyLjkgNy44LTI0LjYgMTkuOC0yOS42czI1LjctMi4yIDM0LjkgNi45bDEyOCAxMjggMi4yIDIuNHoiXQogICAgfTsKICAgIGZhRmxvcmluU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmbG9yaW4tc2lnbiIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlMTg0IiwgIk0zMTQuNyAzMmMtMzguOCAwLTczLjcgMjMuMy04OC42IDU5LjFMMTcwLjcgMjI0IDY0IDIyNGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmw4MCAwLTQ1LjEgMTA4LjNjLTUgMTEuOS0xNi42IDE5LjctMjkuNSAxOS43TDMyIDQxNmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzNy4zIDBjMzguOCAwIDczLjctMjMuMyA4OC42LTU5LjFMMjEzLjMgMjg4IDMyMCAyODhjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTgwIDAgNDUuMS0xMDguM2M1LTExLjkgMTYuNi0xOS43IDI5LjUtMTkuN0wzNTIgOTZjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTM3LjMgMHoiXQogICAgfTsKICAgIGZhQmVsbDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmVsbCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyODI3NiwgNjE2MDJdLCAiZjBmMyIsICJNMjI0IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgMy4yQzExOSA1MCA2NCAxMTQuNiA2NCAxOTJsMCAyMS43YzAgNDguMS0xNi40IDk0LjgtNDYuNCAxMzIuNEw3LjggMzU4LjNDMi43IDM2NC42IDAgMzcyLjQgMCAzODAuNSAwIDQwMC4xIDE1LjkgNDE2IDM1LjUgNDE2bDM3Ni45IDBjMTkuNiAwIDM1LjUtMTUuOSAzNS41LTM1LjUgMC04LjEtMi43LTE1LjktNy44LTIyLjJsLTkuOC0xMi4yQzQwMC40IDMwOC41IDM4NCAyNjEuOCAzODQgMjEzLjdsMC0yMS43YzAtNzcuNC01NS0xNDItMTI4LTE1Ni44bDAtMy4yYzAtMTcuNy0xNC4zLTMyLTMyLTMyek0xNjIgNDY0YzcuMSAyNy42IDMyLjIgNDggNjIgNDhzNTQuOS0yMC40IDYyLTQ4bC0xMjQgMHoiXQogICAgfTsKICAgIGZhTGFyaVNpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGFyaS1zaWduIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImUxYzgiLCAiTTE0NCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgNDEuNWM3LjktMSAxNS45LTEuNSAyNC0xLjVzMTYuMSAuNSAyNCAxLjVMMjE2IDI0YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA1NGM1OC45IDIzLjggMTAzLjIgNzYgMTE2LjIgMTM5LjcgMy41IDE3LjMtNy43IDM0LjItMjUgMzcuN3MtMzQuMi03LjctMzcuNy0yNWMtNi43LTMzLjItMjYuNC02MS44LTUzLjQtODAuMmwwIDgxLjhjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0xMDEuOGMtNy44LTEuNS0xNS44LTIuMi0yNC0yLjJzLTE2LjIgLjgtMjQgMi4yTDE2OCAyMzJjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC04MS44Yy0zMy44IDIzLTU2IDYxLjktNTYgMTA1LjggMCA3MC43IDU3LjMgMTI4IDEyOCAxMjhsMTYwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgNDQ4Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDE2LjkgMEMxOC41IDM1MCAwIDMwNS4yIDAgMjU2IDAgMTc1LjQgNDkuNiAxMDYuNCAxMjAgNzhsMC01NGMwLTEzLjMgMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhTWlsbFNpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWlsbC1zaWduIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImUxZWQiLCAiTTI5Ny0yMi4yYzEyLjMgNSAxOC4yIDE5IDEzLjIgMzEuM2wtMjkgNzEuM0MzMzguOCA4NS4xIDM4NCAxMzMuMyAzODQgMTkybDAgMjA4YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMjA4YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4LTYuNCAwLTEyLjUgMS4yLTE4IDMuNWwtMzAgNzMuOCAwIDE3OC43YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMjEuMi01Ny44IDE0Mi4yYy01IDEyLjMtMTkgMTguMi0zMS4zIDEzLjJzLTE4LjItMTktMTMuMi0zMS4zTDE2MCAyNTEuMyAxNjAgMTkyYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4cy00OCAyMS41LTQ4IDQ4bDAgMjA4YzAgMTcuNy0xNC4zIDMyLTMyIDMyUzAgNDE3LjcgMCA0MDBMMCAxMTJjMC0xNy43IDE0LjMtMzIgMzItMzIgMTAuOSAwIDIwLjUgNS40IDI2LjMgMTMuNyAxNi04LjcgMzQuMy0xMy43IDUzLjctMTMuNyAzMS4zIDAgNTkuNyAxMi45IDgwIDMzLjYgOS42LTkuOCAyMC45LTE3LjggMzMuNS0yMy41TDI2NS44LTljNS0xMi4zIDE5LTE4LjIgMzEuMy0xMy4yeiJdCiAgICB9OwogICAgZmFQZXJzb25Tbm93Ym9hcmRpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLXNub3dib2FyZGluZyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyNzkzOCwgInNub3dib2FyZGluZyJdLCAiZjdjZSIsICJNNDI0LjUgMTZhNTYgNTYgMCAxIDEgMCAxMTIgNTYgNTYgMCAxIDEgMC0xMTJ6TTE2Ni40IDQ1LjVjMTAuMi0xNC40IDMwLjItMTcuOSA0NC42LTcuN2wyNzIgMTkyYzE0LjQgMTAuMiAxNy45IDMwLjIgNy43IDQ0LjZzLTMwLjIgMTcuOS00NC42IDcuN2wtOTIuMi02NS4xLTYyLjIgNTMuMyAzMi4xIDI2LjdjMTguMiAxNS4yIDI4LjggMzcuNyAyOC44IDYxLjVsMCA4Ny44IDc3LjUgMTUuMmM2LjIgMS4yIDEyLjYgLjkgMTguNy0uOGw0MS4yLTExLjhjMTIuNy0zLjYgMjYgMy43IDI5LjcgMTYuNXMtMy43IDI2LTE2LjUgMjkuN2wtNDEuMiAxMS44Yy0xMy40IDMuOC0yNy40IDQuNC00MS4xIDEuOEw4Ny4xIDQ0My4zYy0xNy4yLTMuNC0zMy0xMS44LTQ1LjMtMjQuMUwxNS41IDM5M2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDI2LjIgMjYuMmM1LjYgNS42IDEyLjggOS40IDIwLjYgMTFsNjQuMiAxMi42IDAtMTIzLjdjMC0yNy43IDEyLTU0IDMyLjgtNzIuMmw2OS02MC40LTg4LjItNjIuM0MxNTkuNiA4MCAxNTYuMiA2MCAxNjYuNCA0NS41em01OC4xIDM3NS43bDY0IDEyLjUgMC03NS4zYzAtNC43LTIuMS05LjMtNS44LTEyLjNsLTU4LjItNDguNSAwIDEyMy42eiJdCiAgICB9OwogICAgZmFTbm93Ym9hcmRpbmcgPSBmYVBlcnNvblNub3dib2FyZGluZzsKICAgIGZhVHR5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInR0eSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJ0ZWxldHlwZSJdLCAiZjFlNCIsICJNNDUwLjIgMjY2LjhjMTUuOCA2LjUgMzQuMSAuMyA0Mi42LTE0LjZsMi40LTQuMmMyNy45LTQ4LjkgMjMuNi0xMTguOC0zMS4zLTE1NC41LTEyNi04Mi0yODkuNi04Mi00MTUuNiAwLTU0LjkgMzUuNy01OS4zIDEwNS43LTMxLjMgMTU0LjVsMi40IDQuMmM4LjUgMTQuOSAyNi43IDIxLjEgNDIuNiAxNC42bDgxLjktMzMuN2MxMy45LTUuNyAyMi40LTE5LjkgMjAuOS0zNC45bC01LjEtNTFjNjIuNS0yMSAxMzAuOC0xOS45IDE5Mi42IDMuM2wtNC44IDQ3LjdjLTEuNSAxNSA3IDI5LjIgMjAuOSAzNC45bDgxLjkgMzMuN3pNMzIgMzUyYTMyIDMyIDAgMSAwIDY0IDAgMzIgMzIgMCAxIDAgLTY0IDB6bTk2IDBhMzIgMzIgMCAxIDAgNjQgMCAzMiAzMiAwIDEgMCAtNjQgMHpNNjQgNDE2YTMyIDMyIDAgMSAwIDAgNjQgMzIgMzIgMCAxIDAgMC02NHptMzUyIDMyYTMyIDMyIDAgMSAwIDY0IDAgMzIgMzIgMCAxIDAgLTY0IDB6TTI1NiAzMjBhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDEgMCAwLTY0em02NCAzMmEzMiAzMiAwIDEgMCA2NCAwIDMyIDMyIDAgMSAwIC02NCAwem0xMjgtMzJhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDEgMCAwLTY0ek0xMjggNDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMybDE5MiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0xOTIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6Il0KICAgIH07CiAgICBmYVRlbGV0eXBlID0gZmFUdHk7CiAgICBmYVVzZXJzUmVjdGFuZ2xlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXJzLXJlY3RhbmdsZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTk0IiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDQ0OCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyem0yMjQgNzJhNTYgNTYgMCAxIDEgMCAxMTIgNTYgNTYgMCAxIDEgMC0xMTJ6bTAgMTUyYzUzIDAgOTYgNDMgOTYgOTZsMCAyNGMwIDEzLjMtMTAuNyAyNC0yNCAyNGwtMTQ0IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtMjRjMC01MyA0My05NiA5Ni05NnptOTYtNjRhNDggNDggMCAxIDEgOTYgMCA0OCA0OCAwIDEgMSAtOTYgMHpNMTY4IDI3Mi4zYy0xNS4yIDIyLjgtMjQgNTAuMi0yNCA3OS43bDAgMjRjMCA4LjQgMS40IDE2LjUgNC4xIDI0bC00Ni44IDBDODkuNiA0MDAgODAgMzkwLjQgODAgMzc4LjdMODAgMzY4YzAtNTAuMyAzOC43LTkxLjYgODgtOTUuN3pNNDI3LjkgNDAwYzIuNy03LjUgNC4xLTE1LjYgNC4xLTI0bDAtMjRjMC0yOS41LTguOC01Ni45LTI0LTc5LjcgNDkuMyA0LjEgODggNDUuMyA4OCA5NS43bDAgMTAuN2MwIDExLjgtOS42IDIxLjMtMjEuMyAyMS4zbC00Ni44IDB6TTk2IDE5MmE0OCA0OCAwIDEgMSA5NiAwIDQ4IDQ4IDAgMSAxIC05NiAweiJdCiAgICB9OwogICAgZmFNb2JpbGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibW9iaWxlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4MjQxLCAibW9iaWxlLWFuZHJvaWQiLCAibW9iaWxlLXBob25lIl0sICJmM2NlIiwgIk04MCAwQzQ0LjcgMCAxNiAyOC43IDE2IDY0bDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDIyNCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzg0YzAtMzUuMy0yOC43LTY0LTY0LTY0TDgwIDB6bTcyIDQxNmw4MCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC04MCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFNb2JpbGVBbmRyb2lkID0gZmFNb2JpbGU7CiAgICBmYU1vYmlsZVBob25lID0gZmFNb2JpbGU7CiAgICBmYUFycm93c1R1cm5Ub0RvdHMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3dzLXR1cm4tdG8tZG90cyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNGMxIiwgIk0yNjUuNC02LjZjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM0wyODUuMyA2NCAzNTIgNjRjNTMgMCA5NiA0MyA5NiA5NmwwIDMyYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMzJjMC0xNy43LTE0LjMtMzItMzItMzJsLTY2LjcgMCAyNS40IDI1LjRjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNzLTMyLjggMTIuNS00NS4zIDBsLTgwLTgwYy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM2w4MC04MHptLTgyLjcgMjcybDgwIDgwYzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zbC04MCA4MGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNMMTYyLjcgNDAwIDk2IDQwMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAzMmMwIDE3LjctMTQuMyAzMi0zMiAzMlMwIDQ4MS43IDAgNDY0bDAtMzJjMC01MyA0My05NiA5Ni05Nmw2Ni43IDAtMjUuNC0yNS40Yy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM3MzMi44LTEyLjUgNDUuMyAwek0zMjAgMzY4YTY0IDY0IDAgMSAxIDEyOCAwIDY0IDY0IDAgMSAxIC0xMjggMHpNNjQgMTYwYTY0IDY0IDAgMSAxIDAtMTI4IDY0IDY0IDAgMSAxIDAgMTI4eiJdCiAgICB9OwogICAgZmFFeGNsYW1hdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJleGNsYW1hdGlvbiIsCiAgICAgIGljb246IFsxMjgsIDUxMiwgWzEwMDY5LCAxMDA3MSwgNjE3MzhdLCAiMjEiLCAiTTY0IDQzMmMyMi4xIDAgNDAgMTcuOSA0MCA0MHMtMTcuOSA0MC00MCA0MC00MC0xNy45LTQwLTQwYzAtMjIuMSAxNy45LTQwIDQwLTQwek02NCAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4IDAgLjYgMCAxLjEgMCAxLjdsLTE2IDMwNGMtLjkgMTctMTUgMzAuMy0zMiAzMC4zUzMzIDM3MC43IDMyIDM1My43TDE2IDQ5LjdjMC0uNiAwLTEuMSAwLTEuNyAwLTI2LjUgMjEuNS00OCA0OC00OHoiXQogICAgfTsKICAgIGZhQ2h1cmNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNodXJjaCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzk5NjJdLCAiZjUxZCIsICJNMjgwLThjMC0xMy4zLTEwLjctMjQtMjQtMjRTMjMyLTIxLjMgMjMyLThsMCAyNC0zMiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDMyIDAgMCA0OC05OC42IDY1LjhDMTIwIDE4Ni43IDExMiAyMDEuNiAxMTIgMjE3LjdsMCAzOC4zLTc5LjggNDUuNkMxMi4zIDMxMyAwIDMzNC4yIDAgMzU3LjFMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjQgNzQuNyAwIDg1LjQgMCAzMjAgMGw2NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtOTAuOWMwLTIzLTEyLjMtNDQuMi0zMi4yLTU1LjZMNDAwIDI1NiA0MDAgMjE3LjdjMC0xNi04LTMxLTIxLjQtMzkuOWwtOTguNi02NS44IDAtNDggMzIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMzIgMCAwLTI0ek0yNTYgMzIwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgODAtMTI4IDAgMC04MGMwLTM1LjMgMjguNy02NCA2NC02NHoiXQogICAgfTsKICAgIGZhVG9nZ2xlT2ZmID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRvZ2dsZS1vZmYiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjIwNCIsICJNMzg0IDEyOGM3MC43IDAgMTI4IDU3LjMgMTI4IDEyOFM0NTQuNyAzODQgMzg0IDM4NGwtMTkyIDBjLTcwLjcgMC0xMjgtNTcuMy0xMjgtMTI4czU3LjMtMTI4IDEyOC0xMjhsMTkyIDB6TTU3NiAyNTZjMC0xMDYtODYtMTkyLTE5Mi0xOTJMMTkyIDY0Qzg2IDY0IDAgMTUwIDAgMjU2Uzg2IDQ0OCAxOTIgNDQ4bDE5MiAwYzEwNiAwIDE5Mi04NiAxOTItMTkyek0xOTIgMzM2YTgwIDgwIDAgMSAwIDAtMTYwIDgwIDgwIDAgMSAwIDAgMTYweiJdCiAgICB9OwogICAgZmFTaG9lUHJpbnRzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNob2UtcHJpbnRzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY1NGIiLCAiTTI5NiAxOTJjLTIxLjEtMTIuMS00Mi4zLTI0LjItNzItMjkuM2wwLTE0MC4zQzI1Ny43IDEzIDMxMS40IDAgMzUyIDAgNDQ4IDAgNTc2IDQ4IDU3NiAxMjhzLTExOS42IDk2LTE3NiA5NmMtNDggMC03Ni0xNi0xMDQtMzJ6TTEyOCAzMmw0OCAwIDAgMTI4LTQ4IDBjLTM1LjMgMC02NC0yOC43LTY0LTY0czI4LjctNjQgNjQtNjR6TTIzMiAzMjBjMjgtMTYgNTYtMzIgMTA0LTMyIDU2LjQgMCAxNzYgMTYgMTc2IDk2UzM4NCA1MTIgMjg4IDUxMmMtNDAuNSAwLTk0LjMtMTMtMTI4LTIyLjRsMC0xNDAuM2MyOS43LTUuMiA1MC45LTE3LjMgNzItMjkuNHpNNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NHMyOC43LTY0IDY0LTY0bDQ4IDAgMCAxMjgtNDggMHoiXQogICAgfTsKICAgIGZhRmlsZUNpcmNsZUV4Y2xhbWF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbGUtY2lyY2xlLWV4Y2xhbWF0aW9uIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU0ZWIiLCAiTTk2IDBDNjAuNyAwIDMyIDI4LjcgMzIgNjRsMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTgwIDBjLTIyLjctMzEuNS0zNi03MC4yLTM2LTExMiAwLTEwMC42IDc3LjQtMTgzLjIgMTc2LTE5MS4zbDAtMzguMWMwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0wyOTAuNyAxOC43QzI3OC43IDYuNyAyNjIuNSAwIDI0NS41IDBMOTYgMHpNMzU3LjUgMTc2TDI2NCAxNzZjLTEzLjMgMC0yNC0xMC43LTI0LTI0TDI0MCA1OC41IDM1Ny41IDE3NnpNNDMyIDU0NGExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6bTAtMTAwYTIwIDIwIDAgMSAxIDAgNDAgMjAgMjAgMCAxIDEgMC00MHptMC0xNDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgODBjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC04MGMwLTguOCA3LjItMTYgMTYtMTZ6Il0KICAgIH07CiAgICBmYVdhbGxldCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3YWxsZXQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjU1NSIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwzODQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTE5MmMwLTM1LjMtMjguNy02NC02NC02NEw3MiAxMjhjLTEzLjMgMC0yNC0xMC43LTI0LTI0UzU4LjcgODAgNzIgODBsMzg0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRMNjQgMzJ6TTQxNiAyNTZhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFNZXNzYWdlMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtZXNzYWdlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImNvbW1lbnQtYWx0Il0sICJmMjdhIiwgIk0wIDM1MkwwIDEyOEMwIDc1IDQzIDMyIDk2IDMybDMyMCAwYzUzIDAgOTYgNDMgOTYgOTZsMCAyMjRjMCA1My00MyA5Ni05NiA5NmwtMTIwIDBjLTUuMiAwLTEwLjIgMS43LTE0LjQgNC44TDE2Ni40IDUzOS4yYy00LjIgMy4xLTkuMiA0LjgtMTQuNCA0LjgtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC03Mi0zMiAwYy01MyAwLTk2LTQzLTk2LTk2eiJdCiAgICB9OwogICAgZmFDb21tZW50QWx0MiA9IGZhTWVzc2FnZTI7CiAgICBmYVRyb3BoeSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cm9waHkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjc5NDJdLCAiZjA5MSIsICJNMTQ0LjMgMGwyMjQgMGMyNi41IDAgNDguMSAyMS44IDQ3LjEgNDguMi0uMiA1LjMtLjQgMTAuNi0uNyAxNS44bDQ5LjYgMGMyNi4xIDAgNDkuMSAyMS42IDQ3LjEgNDkuOC03LjUgMTAzLjctNjAuNSAxNjAuNy0xMTggMTkwLjUtMTUuOCA4LjItMzEuOSAxNC4zLTQ3LjIgMTguOC0yMC4yIDI4LjYtNDEuMiA0My43LTU3LjkgNTEuOGwwIDczLjEgNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTkyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsNjQgMCAwLTczLjFjLTE2LTcuNy0zNS45LTIyLTU1LjMtNDguMy0xOC40LTQuOC0zOC40LTEyLjEtNTcuOS0yMy4xLTU0LjEtMzAuMy0xMDIuOS04Ny40LTEwOS45LTE4OS45LTEuOS0yOC4xIDIxLTQ5LjcgNDcuMS00OS43bDQ5LjYgMGMtLjMtNS4yLS41LTEwLjQtLjctMTUuOC0xLTI2LjUgMjAuNi00OC4yIDQ3LjEtNDguMnpNMTAxLjUgMTEybC01Mi40IDBjNi4yIDg0LjcgNDUuMSAxMjcuMSA4NS4yIDE0OS42LTE0LjQtMzcuMy0yNi4zLTg2LTMyLjgtMTQ5LjZ6TTM4MCAyNTYuOGM0MC41LTIzLjggNzcuMS02Ni4xIDgzLjMtMTQ0LjhMNDExIDExMmMtNi4yIDYwLjktMTcuNCAxMDguMi0zMSAxNDQuOHoiXQogICAgfTsKICAgIGZhRmFjZURpenp5MiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWRpenp5IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImRpenp5Il0sICJmNTY3IiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMTM0LjEgMTUzLjlsMjUuOSAyNS45IDI1LjktMjUuOWM3LjgtNy44IDIwLjUtNy44IDI4LjMgMHM3LjggMjAuNSAwIDI4LjNsLTI1LjkgMjUuOSAyNS45IDI1LjljNy44IDcuOCA3LjggMjAuNSAwIDI4LjNzLTIwLjUgNy44LTI4LjMgMGwtMjUuOS0yNS45LTI1LjkgMjUuOWMtNy44IDcuOC0yMC41IDcuOC0yOC4zIDBzLTcuOC0yMC41IDAtMjguM2wyNS45LTI1LjktMjUuOS0yNS45Yy03LjgtNy44LTcuOC0yMC41IDAtMjguM3MyMC41LTcuOCAyOC4zIDB6bTE5MiAwbDI1LjkgMjUuOSAyNS45LTI1LjljNy44LTcuOCAyMC41LTcuOCAyOC4zIDBzNy44IDIwLjUgMCAyOC4zbC0yNS45IDI1LjkgMjUuOSAyNS45YzcuOCA3LjggNy44IDIwLjUgMCAyOC4zcy0yMC41IDcuOC0yOC4zIDBsLTI1LjktMjUuOS0yNS45IDI1LjljLTcuOCA3LjgtMjAuNSA3LjgtMjguMyAwcy03LjgtMjAuNSAwLTI4LjNsMjUuOS0yNS45LTI1LjktMjUuOWMtNy44LTcuOC03LjgtMjAuNSAwLTI4LjNzMjAuNS03LjggMjguMyAwek0yNTYgMzA0YTY0IDY0IDAgMSAxIDAgMTI4IDY0IDY0IDAgMSAxIDAtMTI4eiJdCiAgICB9OwogICAgZmFEaXp6eTIgPSBmYUZhY2VEaXp6eTI7CiAgICBmYUJhY3RlcmlhID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhY3RlcmlhIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImUwNTkiLCAiTTI1Ni0zMmMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDExYzguNiAyLjIgMTYuOSA1LjYgMjQuOCAxMC4zTDMxMSA3YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOWwtNi4zIDYuM2M0LjYgNy44IDggMTYuMiAxMC4zIDI0LjhsMTEgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTEgMGMtMi4yIDguNi01LjYgMTYuOS0xMC4zIDI0LjhMMzQ1IDE1MWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwbC00LjEtNC4xLTMwLjEgMzAuMSA0LjEgNC4xYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTQuMS00LjFjLTEwIDEwLTIwIDIwLTMwLjEgMzAuMUwyMTcgMjc5YzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTYuMy02LjNjLTcuOCA0LjYtMTYuMiA4LTI0LjggMTAuM2wwIDExYzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMTFjLTguNi0yLjItMTYuOS01LjYtMjQuOC0xMC4zTDczIDMxM2MtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWw2LjMtNi4zYy00LjYtNy44LTgtMTYuMi0xMC4zLTI0LjhsLTExIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMTEgMGMyLjItOC42IDUuNi0xNi45IDEwLjMtMjQuOEwzOSAxNjljLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGw0LjEgNC4xYzEwLTEwIDIwLTIwIDMwLjEtMzAuMUwxMDMgMTA1Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBsNC4xIDQuMSAzMC4xLTMwLjEtNC4xLTQuMWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlTMTkxLjYtMi4zIDIwMSA3bDYuMyA2LjNjNy44LTQuNiAxNi4yLTggMjQuOC0xMC4zbDAtMTFjMC0xMy4zIDEwLjctMjQgMjQtMjR6TTEyOCAyNTZhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0ek0yNDAgMTQ0YTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6bTI5NiA0MGwwIDExYzguNiAyLjIgMTYuOSA1LjYgMjQuOCAxMC4zTDU2NyAxOTljOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45bC02LjMgNi4zYzQuNiA3LjggOCAxNi4yIDEwLjMgMjQuOGwxMSAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xMSAwYy0yLjIgOC42LTUuNiAxNi45LTEwLjMgMjQuOEw2MDEgMzQzYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTQuMS00LjEtMzAuMSAzMC4xIDQuMSA0LjFjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtNC4xLTQuMWMtMTAgMTAtMjAgMjAtMzAuMSAzMC4xTDQ3MyA0NzFjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtNi4zLTYuM2MtNy44IDQuNi0xNi4yIDgtMjQuOCAxMC4zbDAgMTFjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0xMWMtOC42LTIuMi0xNi45LTUuNi0yNC44LTEwLjNMMzI5IDUwNWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWw2LjMtNi4zYy00LjYtNy44LTgtMTYuMi0xMC4zLTI0LjhsLTExIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMTEgMGMyLjItOC42IDUuNi0xNi45IDEwLjMtMjQuOEwyOTUgMzYxYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBsNC4xIDQuMWMxMC0xMCAyMC0yMCAzMC4xLTMwLjFMMzU5IDI5N2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDQuMSA0LjEgMzAuMS0zMC4xLTQuMS00LjFjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGw2LjMgNi4zYzcuOC00LjYgMTYuMi04IDI0LjgtMTAuM2wwLTExYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjR6TTQ0OCAzODRhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHoiXQogICAgfTsKICAgIGZhRWFyRGVhZiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJlYXItZGVhZiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJkZWFmIiwgImRlYWZuZXNzIiwgImhhcmQtb2YtaGVhcmluZyJdLCAiZjJhNCIsICJNNTAyLjYgNTQuNmwtNDAgNDBjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwcy0xMi41LTMyLjggMC00NS4zbDQwLTQwYzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwczEyLjUgMzIuOCAwIDQ1LjN6bS0zMjAgMzIwbC0xMjggMTI4Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM2wxMjgtMTI4YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwczEyLjUgMzIuOCAwIDQ1LjN6TTI0MCAxMjhjLTU3LjYgMC0xMDUuMSA0My42LTExMS4zIDk5LjUtMS45IDE3LjYtMTcuOCAzMC4yLTM1LjMgMjguM3MtMzAuMi0xNy44LTI4LjMtMzUuM2M5LjctODggODQuMy0xNTYuNSAxNzQuOS0xNTYuNSA5Ny4yIDAgMTc2IDc4LjggMTc2IDE3NiAwIDQ2LTE3LjcgODcuOS00Ni42IDExOS4zLTEyIDEzLTE3LjQgMjQuOC0xNy40IDM0LjdsMCA2LjFjMCA2MS45LTUwLjEgMTEyLTExMiAxMTItMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTYuMWMwLTMyLjkgMTcuNC01OS42IDM0LjQtNzggMTguNC0yMCAyOS42LTQ2LjYgMjkuNi03NS45IDAtNjEuOS01MC4xLTExMi0xMTItMTEyem0wIDgwYy0xNy43IDAtMzIgMTQuMy0zMiAzMiAwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGMwLTQ0LjIgMzUuOC04MCA4MC04MHM4MCAzNS44IDgwIDgwYzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtMTcuNy0xNC4zLTMyLTMyLTMyeiJdCiAgICB9OwogICAgZmFEZWFmID0gZmFFYXJEZWFmOwogICAgZmFEZWFmbmVzcyA9IGZhRWFyRGVhZjsKICAgIGZhSGFyZE9mSGVhcmluZyA9IGZhRWFyRGVhZjsKICAgIGZhUGVvcGxlQXJyb3dzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlb3BsZS1hcnJvd3MiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsicGVvcGxlLWFycm93cy1sZWZ0LXJpZ2h0Il0sICJlMDY4IiwgIk0zMiA2NEE2NCA2NCAwIDEgMSAxNjAgNjQgNjQgNjQgMCAxIDEgMzIgNjR6TTAgMjI0YzAtMzUuMyAyOC43LTY0IDY0LTY0bDY0IDBjMy4yIDAgNi40IC4yIDkuNSAuN0w5My4xIDIwNS4xQzY1IDIzMy4yIDY1IDI3OC44IDkzLjEgMzA2LjlsNTYgNTZjMy40IDMuNCA3IDYuNCAxMC45IDlsMCA5Mi4xYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0zMiAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTEyMC42QzEyLjkgMzMyLjQgMCAzMTEuNyAwIDI4OGwwLTY0ek0zNTIgNjRhNjQgNjQgMCAxIDEgMTI4IDAgNjQgNjQgMCAxIDEgLTEyOCAwem02Ni45IDE0MS4xbC00NC40LTQ0LjRjMy4xLS41IDYuMy0uNyA5LjUtLjdsNjQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDY0YzAgMjMuNy0xMi45IDQ0LjQtMzIgNTUuNEw0ODAgNDY0YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0zMiAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTkyLjFjMy45LTIuNiA3LjUtNS42IDEwLjktOWw1Ni01NmMyOC4xLTI4LjEgMjguMS03My43IDAtMTAxLjh6TTMwMi44IDE3Ny44YzktMy43IDE5LjMtMS43IDI2LjIgNS4ybDU2IDU2YzkuNCA5LjQgOS40IDI0LjYgMCAzMy45bC01NiA1NmMtNi45IDYuOS0xNy4yIDguOS0yNi4yIDUuMlMyODggMzIxLjcgMjg4IDMxMmwwLTI0LTY0IDAgMCAyNGMwIDkuNy01LjggMTguNS0xNC44IDIyLjJzLTE5LjMgMS43LTI2LjItNS4ybC01Ni01NmMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlsNTYtNTZjNi45LTYuOSAxNy4yLTguOSAyNi4yLTUuMlMyMjQgMTkwLjMgMjI0IDIwMGwwIDI0IDY0IDAgMC0yNGMwLTkuNyA1LjgtMTguNSAxNC44LTIyLjJ6Il0KICAgIH07CiAgICBmYVBlb3BsZUFycm93c0xlZnRSaWdodCA9IGZhUGVvcGxlQXJyb3dzOwogICAgZmFIYW5kc0NsYXBwaW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbmRzLWNsYXBwaW5nIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUxYTgiLCAiTTM0NCA4bDAgNjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC02NGMwLTEzLjMgMTAuNy0yNCAyNC0yNFMzNDQtNS4zIDM0NCA4ek0yMjAgMTAuN2wzMiA0OGM3LjQgMTEgNC40IDI1LjktNi43IDMzLjNzLTI1LjkgNC40LTMzLjMtNi43bC0zMi00OGMtNy40LTExLTQuNC0yNS45IDYuNy0zMy4zUzIxMi42LS4zIDIyMCAxMC43ek0xMzUgMTE5YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwTDI5Mi43IDI0Mi43YzEwLjEgMTAuMSAyNy4zIDIuOSAyNy4zLTExLjNsMC0zOS40YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAxNTMuNmMwIDU3LjEtMzAgMTEwLTc4LjkgMTM5LjQtNjQgMzguNC0xNDUuOCAyOC4zLTE5OC41LTI0LjRMNyAzNjFjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGw1MyA1M2M2LjEgNi4xIDE2IDYuMSAyMi4xIDBzNi4xLTE2IDAtMjIuMUwyMyAyNjVjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGw5MyA5M2M2LjEgNi4xIDE2IDYuMSAyMi4xIDBzNi4xLTE2IDAtMjIuMUw1NSAxODVjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGwxMTcgMTE3YzYuMSA2LjEgMTYgNi4xIDIyLjEgMHM2LjEtMTYgMC0yMi4xbC05My05M2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjl6TTQzMy4xIDQ4NC45Yy0yNC4yIDE0LjUtNTAuOSAyMi4xLTc3LjcgMjMuMSA0OC4xLTM5LjYgNzYuNi05OSA3Ni42LTE2Mi40bDAtOTguMWM4LjItLjEgMTYtNi40IDE2LTE2bDAtMzkuNGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMTUzLjZjMCA1Ny4xLTMwIDExMC03OC45IDEzOS40ek00NTMuMyA0YzExIDcuNCAxNCAyMi4zIDYuNyAzMy4zbC0zMiA0OGMtNy40IDExLTIyLjMgMTQtMzMuMyA2LjdzLTE0LTIyLjMtNi43LTMzLjNsMzItNDhjNy40LTExIDIyLjMtMTQgMzMuMy02Ljd6Il0KICAgIH07CiAgICBmYVZpcnVzQ292aWRTbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ2aXJ1cy1jb3ZpZC1zbGFzaCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNGE5IiwgIk00MS0yNC45Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMFMtMi4zLS4zIDcgOS4xbDUyOCA1MjhjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC04My04MyAxMS40LTExLjRjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMGwtMTEuMyAxMS4zLTIzLjgtMjMuOGMxNy45LTIzLjUgMjkuOS01MS43IDM0LjEtODIuM2wzMy42IDAgMCAxNmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtODBjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAxNi0zMy42IDBjLTQuMi0zMC43LTE2LjMtNTguOC0zNC4xLTgyLjNsMjMuOC0yMy44IDExLjMgMTEuM2M5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlMNDQwLjcgNDYuN2MtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWwxMS4zIDExLjMtMjMuOCAyMy44QzM3MC44IDk3LjkgMzQyLjcgODUuOCAzMTIgODEuNmwwLTMzLjYgMTYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNFMzNDEuMyAwIDMyOCAwTDI0OCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDE2IDAgMCAzMy42Yy0zMC43IDQuMi01OC44IDE2LjMtODIuMyAzNC4xTDE1Ny45IDkyIDE2OS4yIDgwLjZjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMEwxMjMuOSA1OC4xIDQxLTI0Ljl6TTExMy42IDIzMmwtMzMuNiAwIDAtMTZjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCA4MGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTYgMzMuNiAwYzQuMiAzMC43IDE2LjMgNTguOCAzNC4xIDgyLjNsLTIzLjggMjMuOC0xMS4zLTExLjNjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwcy05LjQgMjQuNiAwIDMzLjlsNTYuNiA1Ni42YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtMTEuMy0xMS4zIDIzLjgtMjMuOGMyMy41IDE3LjkgNTEuNyAyOS45IDgyLjMgMzQuMWwwIDMzLjYtMTYgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw4MCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xNiAwIDAtMzMuNmMxMy40LTEuOCAyNi40LTUuMiAzOC43LTkuOUwxMjMuNSAxOTMuM2MtNC43IDEyLjMtOCAyNS4yLTkuOSAzOC43eiJdCiAgICB9OwogICAgZmFDYWxlbmRhckRheXMyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhbGVuZGFyLWRheXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiY2FsZW5kYXItYWx0Il0sICJmMDczIiwgIk0xMjggMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDMyIDEyOCAwIDAtMzJjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDMyIDMyIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyODhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGwzMiAwIDAtMzJjMC0xNy43IDE0LjMtMzIgMzItMzJ6TTY0IDI0MGwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2em0xMjggMGwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2em0xNDQtMTZjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHpNNjQgMzY4bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6bTE0NC0xNmMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwem0xMTIgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnoiXQogICAgfTsKICAgIGZhQ2FsZW5kYXJBbHQyID0gZmFDYWxlbmRhckRheXMyOwogICAgZmFEaWFtb25kVHVyblJpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRpYW1vbmQtdHVybi1yaWdodCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJkaXJlY3Rpb25zIl0sICJmNWViIiwgIk0yMTUgMTdMMTcgMjE1QzYuMSAyMjUuOSAwIDI0MC42IDAgMjU2czYuMSAzMC4xIDE3IDQxTDIxNSA0OTVjMTAuOSAxMC45IDI1LjYgMTcgNDEgMTdzMzAuMS02LjEgNDEtMTdMNDk1IDI5N2MxMC45LTEwLjkgMTctMjUuNiAxNy00MXMtNi4xLTMwLjEtMTctNDFMMjk3IDE3QzI4Ni4xIDYuMSAyNzEuNCAwIDI1NiAwcy0zMC4xIDYuMS00MSAxN3pNMzg1IDI1N2wtNzIgNzJjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsMzEtMzEtNzguMSAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDQwYzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNDBjMC0zOS44IDMyLjItNzIgNzItNzJsNzguMSAwLTMxLTMxYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBsNzIgNzJjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjl6Il0KICAgIH07CiAgICBmYURpcmVjdGlvbnMgPSBmYURpYW1vbmRUdXJuUmlnaHQ7CiAgICBmYUhhbmRQb2ludFVwMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kLXBvaW50LXVwIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbOTc1N10sICJmMGE2IiwgIk0zMiAzMkMzMiAxNC4zIDQ2LjMgMCA2NCAwUzk2IDE0LjMgOTYgMzJsMCAyMDgtNjQgMCAwLTIwOHpNMjI0IDE5MmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02NHptLTY0LTY0YzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNDhjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC00OGMwLTE3LjcgMTQuMy0zMiAzMi0zMnptMTYwIDk2YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY0em0tOTYgODhsMC0uNmM5LjQgNS40IDIwLjMgOC42IDMyIDguNiAxMy4yIDAgMjUuNC00IDM1LjYtMTAuOCA4LjcgMjQuOSAzMi41IDQyLjggNjAuNCA0Mi44IDExLjcgMCAyMi42LTMuMSAzMi04LjZsMCA4LjZjMCA4OC40LTcxLjYgMTYwLTE2MCAxNjBsLTYxLjcgMGMtNDIuNCAwLTgzLjEtMTYuOS0xMTMuMS00Ni45TDM3LjUgNDUzLjVDMTMuNSA0MjkuNSAwIDM5Ni45IDAgMzYzbDAtMjdjMC0zNS4zIDI4LjctNjQgNjQtNjRsODggMGMyMi4xIDAgNDAgMTcuOSA0MCA0MHMtMTcuOSA0MC00MCA0MGwtNTYgMGMtOC44IDAtMTYgNy4yLTE2IDE2czcuMiAxNiAxNiAxNmw1NiAwYzM5LjggMCA3Mi0zMi4yIDcyLTcyeiJdCiAgICB9OwogICAgZmFCZXppZXJDdXJ2ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiZXppZXItY3VydmUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjU1YiIsICJNMjk2IDEzNmwwLTQ4IDQ4IDAgMCA0OC00OCAwek0yODggMzJjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgNC0xMTguNCAwQzExMS4yIDYyLjcgODkuMyA0OCA2NCA0OCAyOC43IDQ4IDAgNzYuNyAwIDExMnMyOC43IDY0IDY0IDY0YzI1LjMgMCA0Ny4yLTE0LjcgNTcuNi0zNmw2Ni45IDBjLTU4LjkgMzkuNi05OC45IDEwNS0xMDQgMTgwTDgwIDMyMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCA2NGMwIDI2LjUgMjEuNSA0OCA0OCA0OGw2NCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtNjRjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTMuMyAwYzUuOS02NyA0OC41LTEyMy40IDEwNy41LTE0OS4xIDguNiAxMi43IDIzLjIgMjEuMSAzOS44IDIxLjFsNjQgMGMxNi42IDAgMzEuMS04LjQgMzkuOC0yMS4xIDU5IDI1LjcgMTAxLjYgODIuMSAxMDcuNSAxNDkuMWwtMy4zIDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgNjRjMCAyNi41IDIxLjUgNDggNDggNDhsNjQgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTY0YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC00LjUgMGMtNS03NS00NS4xLTE0MC40LTEwNC0xODBsNjYuOSAwYzEwLjQgMjEuMyAzMi4zIDM2IDU3LjYgMzYgMzUuMyAwIDY0LTI4LjcgNjQtNjRzLTI4LjctNjQtNjQtNjRjLTI1LjMgMC00Ny4yIDE0LjctNTcuNiAzNmwtMTE4LjQgMCAwLTRjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTY0IDB6TTg4IDM3Nmw0OCAwIDAgNDgtNDggMCAwLTQ4em00MTYgNDhsMC00OCA0OCAwIDAgNDgtNDggMHoiXQogICAgfTsKICAgIGZhUGVyc29uSGFsZkRyZXNzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1oYWxmLWRyZXNzIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImU1NDgiLCAiTTE0My40LTMuOWM5LjctMTYuOCAyNy44LTI4LjEgNDguNi0yOC4xIDMwLjkgMCA1NiAyNS4xIDU2IDU2IDAgMjUuNC0xNi45IDQ2LjgtNDAgNTMuN2wwIDBjLTUuMSAxLjUtMTAuNCAyLjMtMTYgMi4zLTMwLjkgMC01Ni0yNS4xLTU2LTU2bDAgMGMwLTEwLjEgMi43LTE5LjcgNy40LTI3Ljl6TTMxOC4zIDI5OS4xTDI3MiAyMzYuNyAyNzIgNTEyYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTYwIDAtLjQgMC0yMzguNmMzNi4yIDQuNCA2OS4yIDIzLjQgOTEuMiA1M2w3MC41IDk1YzEwLjUgMTQuMiA3LjYgMzQuMi02LjYgNDQuOHMtMzQuMiA3LjYtNDQuOC02LjZ6TTE3NiAxMTNsMCAzOTljMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xMjgtMjUuOCAwYy0xMC45IDAtMTguNi0xMC43LTE1LjItMjEuMWw0My0xMjktNDguMyA2NS4xYy0xMC41IDE0LjItMzAuNiAxNy4yLTQ0LjggNi42cy0xNy4yLTMwLjYtNi42LTQ0LjhsNzAuNS05NWMyMi0yOS42IDU1LjEtNDguNiA5MS4yLTUzeiJdCiAgICB9OwogICAgZmFTcXVhcmVQb2xsSG9yaXpvbnRhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtcG9sbC1ob3Jpem9udGFsIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInBvbGwtaCJdLCAiZjY4MiIsICJNNDQ4IDk2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjB6TTI1NiAxNTJjMCAxMy4zLTEwLjcgMjQtMjQgMjRsLTExMiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDExMiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0em03MiA4MGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMjA4IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMjA4IDB6TTE5MiAzNjBjMCAxMy4zLTEwLjcgMjQtMjQgMjRsLTQ4IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHoiXQogICAgfTsKICAgIGZhUG9sbEggPSBmYVNxdWFyZVBvbGxIb3Jpem9udGFsOwogICAgZmFTY2hvb2xDaXJjbGVYbWFyayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzY2hvb2wtY2lyY2xlLXhtYXJrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NmQiLCAiTTY0IDEyOGMtMzUuMyAwLTY0IDI4LjctNjQgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjc2IDBjLTEwLjUtMTQuNi0xOS0zMC43LTI1LjEtNDhsLTkwLjkgMCAwLTg4YzAtMjIuMSAxNy45LTQwIDQwLTQwbDQ4IDBjMSAwIDEuOSAwIDIuOSAuMSAyNi4zLTc0LjYgOTcuNS0xMjguMSAxODEuMS0xMjguMSAyOC42IDAgNTUuNiA2LjIgODAgMTcuNGwwLTMzLjRjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTY0IDAtMTI3LjktMTE1LjFjLTE4LjMtMTYuNC00Ni0xNi40LTY0LjIgMEwxMjggMTI4IDY0IDEyOHptNjQgMjQwYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJ6TTExMiAyNTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNnpNMjg4IDEyOGE2NCA2NCAwIDEgMSAwIDEyOCA2NCA2NCAwIDEgMSAwLTEyOHpNNDk2IDU0NGExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6bTU5LjMtMTgwLjdsLTM2LjcgMzYuNyAzNi43IDM2LjdjNi4yIDYuMiA2LjIgMTYuNCAwIDIyLjZzLTE2LjQgNi4yLTIyLjYgMGwtMzYuNy0zNi43LTM2LjcgMzYuN2MtNi4yIDYuMi0xNi40IDYuMi0yMi42IDBzLTYuMi0xNi40IDAtMjIuNmwzNi43LTM2LjctMzYuNy0zNi43Yy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBsMzYuNyAzNi43IDM2LjctMzYuN2M2LjItNi4yIDE2LjQtNi4yIDIyLjYgMHM2LjIgMTYuNCAwIDIyLjZ6Il0KICAgIH07CiAgICBmYUhhbmRMaXphcmQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbmQtbGl6YXJkIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyNTgiLCAiTTAgMTEyQzAgODUuNSAyMS41IDY0IDQ4IDY0bDIzOC41IDBjMzYuOCAwIDcxLjIgMTggOTIuMSA0OC4ybDExMy41IDE2NGMxMyAxOC43IDE5LjkgNDEgMTkuOSA2My44bDAgNzZjMCAxNy43LTE0LjMgMzItMzIgMzJsLTk2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTMuOC03OC4xLTUwLjItMTYxLjkgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhzMjEuNS00OCA0OC00OGwxMjggMGMyNi41IDAgNDgtMjEuNSA0OC00OHMtMjEuNS00OC00OC00OEw0OCAxNjBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4eiJdCiAgICB9OwogICAgZmFDaGFsa2JvYXJkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoYWxrYm9hcmQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsiYmxhY2tib2FyZCJdLCAiZjUxYiIsICJNOTYgNjRjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgMjU2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDUxMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDk2IDY0ek00ODAgMzg0bC02NCAwIDAtMzJjMC0xNy43LTE0LjMtMzItMzItMzJsLTk2IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgMzItMTYwIDAgMC0yNTYgMzg0IDAgMCAyNTZ6Il0KICAgIH07CiAgICBmYUJsYWNrYm9hcmQgPSBmYUNoYWxrYm9hcmQ7CiAgICBmYVVwUmlnaHRGcm9tU3F1YXJlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVwLXJpZ2h0LWZyb20tc3F1YXJlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImV4dGVybmFsLWxpbmstYWx0Il0sICJmMzVkIiwgIk0yOTAuNCAxOS44QzI5NS40IDcuOCAzMDcuMSAwIDMyMCAwTDQ4MCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTYwYzAgMTIuOS03LjggMjQuNi0xOS44IDI5LjZzLTI1LjcgMi4yLTM0LjktNi45TDQwMCAxNTcuMyAyNDYuNiAzMTAuNmMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNMMzU0LjcgMTEyIDI5Ny40IDU0LjZjLTkuMi05LjItMTEuOS0yMi45LTYuOS0zNC45ek0wIDE3NmMwLTQ0LjIgMzUuOC04MCA4MC04MGw4MCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC04MCAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAyNTZjMCA4LjggNy4yIDE2IDE2IDE2bDI1NiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTgwYzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCA4MGMwIDQ0LjItMzUuOCA4MC04MCA4MEw4MCA1MTJjLTQ0LjIgMC04MC0zNS44LTgwLTgwTDAgMTc2eiJdCiAgICB9OwogICAgZmFFeHRlcm5hbExpbmtBbHQgPSBmYVVwUmlnaHRGcm9tU3F1YXJlOwogICAgZmFTcXVhcmVGdWxsMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtZnVsbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODk5NywgMTI4OTk4LCAxMjg5OTksIDEyOWUzLCAxMjkwMDEsIDEyOTAwMiwgMTI5MDAzLCAxMTAzNSwgMTEwMzZdLCAiZjQ1YyIsICJNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMNDQ4IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzODRjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDY0eiJdCiAgICB9OwogICAgZmFDbG92ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2xvdmVyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUxMzkiLCAiTTMxMC40IDE2QzM0Ni42IDE2IDM3NiA0NS40IDM3NiA4MS43bDAgNS4yYzAgMTEuMi0yLjcgMjIuMy03LjggMzIuMmwtMi4zIDQuMi0yMC4xIDMzLjVjLTEuMSAxLjktMS4yIDMuNC0xLjEgNC41IC4yIDEuMyAuOSAyLjcgMi4xIDMuOXMyLjYgMS45IDMuOSAyLjFjMS4xIC4yIDIuNiAuMSA0LjUtMS4xbDMzLjUtMjAuMSA0LjItMi4zYzEwLTUuMSAyMS03LjggMzIuMi03LjhsNS4yIDBjMzYuMiAwIDY1LjYgMjkuNCA2NS42IDY1LjcgMCAxNy40LTYuOSAzNC4xLTE5LjIgNDYuNGwtMS4zIDEuM2MtMy43IDMuNy0zLjcgOS42IDAgMTMuM2wxLjMgMS4zYzEyLjMgMTIuMyAxOS4yIDI5IDE5LjIgNDYuNCAwIDM2LjItMjkuNCA2NS42LTY1LjYgNjUuNmwtNS4yIDBjLTEyLjggMC0yNS41LTMuNS0zNi41LTEwLjFsLTMzLjUtMjAuMWMtMS45LTEuMS0zLjQtMS4yLTQuNS0xLjEtMS4zIC4yLTIuNyAuOS0zLjkgMi4xcy0xLjkgMi42LTIuMSAzLjljLS4yIDEuMS0uMSAyLjYgMS4xIDQuNWwyMC4xIDMzLjVjNi42IDExIDEwLjEgMjMuNiAxMC4xIDM2LjVsMCA1LjJjMCAzNi4yLTI5LjQgNjUuNi02NS42IDY1LjYtMTcuNCAwLTM0LjEtNi45LTQ2LjQtMTkuMmwtMS4zLTEuM2MtMy43LTMuNy05LjYtMy43LTEzLjMgMGwtMS4zIDEuM2MtMTIuMyAxMi4zLTI5IDE5LjItNDYuNCAxOS4yLTM2LjIgMC02NS42LTI5LjQtNjUuNy02NS42bDAtNS4yYzAtMTIuOCAzLjUtMjUuNSAxMC4xLTM2LjVsMjAuMS0zMy41YzEuMS0xLjkgMS4yLTMuNCAxLjEtNC41LS4yLTEuMy0uOS0yLjctMi4xLTMuOXMtMi42LTEuOS0zLjktMi4xYy0uNS0uMS0xLjItLjEtMS45IDBsLTIuNSAxLTMzLjUgMjAuMWMtMTEgNi42LTIzLjYgMTAuMS0zNi41IDEwLjFsLTUuMiAwQzQ1LjQgMzc2IDE2IDM0Ni42IDE2IDMxMC40IDE2IDI5MyAyMi45IDI3Ni4zIDM1LjIgMjY0bDEuMy0xLjMgMS4yLTEuNWMyLjEtMy4xIDIuMS03LjIgMC0xMC4zbC0xLjItMS41LTEuMy0xLjNDMjIuOSAyMzUuOCAxNiAyMTkuMSAxNiAyMDEuNyAxNiAxNjUuNCA0NS40IDEzNiA4MS43IDEzNmw1LjIgMGMxMi44IDAgMjUuNSAzLjUgMzYuNSAxMC4xbDMzLjUgMjAuMSAyLjUgMWMuNyAuMSAxLjQgLjEgMS45IC4xIDEuMy0uMiAyLjctLjkgMy45LTIuMXMxLjktMi42IDIuMS0zLjljLjEtLjUgLjEtMS4yLS4xLTEuOWwtMS0yLjUtMjAuMS0zMy41Yy02LjYtMTEtMTAuMS0yMy42LTEwLjEtMzYuNWwwLTUuMmMwLTM2LjIgMjkuNC02NS43IDY1LjctNjUuNyAxNy40IDAgMzQuMSA2LjkgNDYuNCAxOS4ybDEuMyAxLjNjMy43IDMuNiA5LjYgMy43IDEzLjMgMGwxLjMtMS4zIDQuOC00LjRDMjgwLjUgMjEuMyAyOTUuMSAxNiAzMTAuNCAxNnoiXQogICAgfTsKICAgIGZhVGVldGhPcGVuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRlZXRoLW9wZW4iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjYyZiIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NmwwIDgwYzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtODBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6bTAgMjcyYy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtNDhjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzA0em04MC0xNjBjMC0yNi41IDIxLjUtNDggNDgtNDhzNDggMjEuNSA0OCA0OGwwIDI0YzAgMTMuMy0xMC43IDI0LTI0IDI0bC00OCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTI0em0xMjggMGMwLTI2LjUgMjEuNS00OCA0OC00OHM0OCAyMS41IDQ4IDQ4bDAgMjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRsLTQ4IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtMjR6TTgwIDExMmMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDI0YzAgMTMuMy0xMC43IDI0LTI0IDI0bC0xNiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTI0YzAtMTcuNyAxNC4zLTMyIDMyLTMyem0zMjAgMzJjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDI0YzAgMTMuMy0xMC43IDI0LTI0IDI0bC0xNiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTI0ek00OCAzODRsMC0xNmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAxNmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMnptMTQ0IDQ4Yy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTE2YzAtOC44IDcuMi0xNiAxNi0xNmw2NCAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDE2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4em0xMjggMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC0xNmMwLTguOCA3LjItMTYgMTYtMTZsNjQgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAxNmMwIDI2LjUtMjEuNSA0OC00OCA0OHptMTEyLTE2Yy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTE2YzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDE2YzAgMTcuNy0xNC4zIDMyLTMyIDMyeiJdCiAgICB9OwogICAgZmFCYXJzU3RhZ2dlcmVkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhcnMtc3RhZ2dlcmVkIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInJlb3JkZXIiLCAic3RyZWFtIl0sICJmNTUwIiwgIk0wIDk2QzAgNzguMyAxNC4zIDY0IDMyIDY0bDM4NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDEyOEMxNC4zIDEyOCAwIDExMy43IDAgOTZ6TTY0IDI1NmMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzODQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkw5NiAyODhjLTE3LjcgMC0zMi0xNC4zLTMyLTMyek00NDggNDE2YzAgMTcuNy0xNC4zIDMyLTMyIDMyTDMyIDQ0OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwzODQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnoiXQogICAgfTsKICAgIGZhUmVvcmRlciA9IGZhQmFyc1N0YWdnZXJlZDsKICAgIGZhU3RyZWFtID0gZmFCYXJzU3RhZ2dlcmVkOwogICAgZmFXYXJlaG91c2UgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid2FyZWhvdXNlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY0OTQiLCAiTTAgMTQyLjFMMCA0ODBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTI0MGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzODQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDI0MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzM3LjljMC0yNy41LTE3LjYtNTItNDMuOC02MC43TDMwMy4yIDUuMWMtOS45LTMuMy0yMC41LTMuMy0zMC40IDBMNDMuOCA4MS40QzE3LjYgOTAuMSAwIDExNC42IDAgMTQyLjF6TTQ2NCAyNTZsLTM1MiAwIDAgNjQgMzUyIDAgMC02NHpNMTEyIDQxNmwzNTIgMCAwLTY0LTM1MiAwIDAgNjR6bTM1MiAzMmwtMzUyIDAgMCA2NCAzNTIgMCAwLTY0eiJdCiAgICB9OwogICAgZmFTd2F0Y2hib29rID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN3YXRjaGJvb2siLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjVjMyIsICJNMCA0OEMwIDIxLjUgMjEuNSAwIDQ4IDBsOTYgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDM2OGMwIDUzLTQzIDk2LTk2IDk2UzAgNDY5IDAgNDE2TDAgNDh6TTI0MCA0MDkuNmwwLTI3MS41IDQ4LjEtNDguMWMxOC43LTE4LjcgNDkuMS0xOC43IDY3LjkgMGw2Ny45IDY3LjljMTguNyAxOC43IDE4LjcgNDkuMSAwIDY3LjlMMjQwIDQwOS42ek0yMDUuNSA1MTJsMTkyLTE5MiA2Ni42IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA5NmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMjU4LjUgMHpNODAgNjRjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNkw4MCA2NHpNNjQgMjA4bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6TTk2IDQ0MGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6Il0KICAgIH07CiAgICBmYUNhbXBncm91bmQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FtcGdyb3VuZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzk5NzhdLCAiZjZiYiIsICJNMzQ0LjggNTIuM2MxMS4yLTEzLjcgOS4yLTMzLjgtNC41LTQ1cy0zMy44LTkuMi00NSA0LjVsLTM5LjIgNDgtMzkuMi00OEMyMDUuNi0xLjkgMTg1LjQtNCAxNzEuNyA3LjJzLTE1LjcgMzEuNC00LjUgNDVsNDcuNCA1OC0yMDIgMjQ2LjlDNC41IDM2Ny4xIDAgMzc5LjYgMCAzOTIuNkwwIDQzMmMwIDI2LjUgMjEuNSA0OCA0OCA0OGw0MTYgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTM5LjRjMC0xMi45LTQuNS0yNS41LTEyLjctMzUuNWwtMjAyLTI0Ni45IDQ3LjQtNTh6TTI1NiAyODhsMTEyIDEyOC0yMjQgMCAxMTItMTI4eiJdCiAgICB9OwogICAgZmFQZXJzb25XYWxraW5nQXJyb3dSaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24td2Fsa2luZy1hcnJvdy1yaWdodCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTUyIiwgIk0xMDQuNSAyNGE1NiA1NiAwIDEgMSAxMTIgMCA1NiA1NiAwIDEgMSAtMTEyIDB6bS04IDE4MS4zTDczLjkgMjI3LjljLTYgNi05LjQgMTQuMS05LjQgMjIuNmwwIDM3LjVjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0zNy41YzAtMjUuNSAxMC4xLTQ5LjkgMjguMS02Ny45bDM1LjEtMzUuMWMyMi44LTIyLjggNTMuNi0zNS42IDg1LjgtMzUuNiAzNi45IDAgNzEuOCAxNi44IDk0LjggNDUuNkwyNjIuMyAxODBjNi4xIDcuNiAxNS4zIDEyIDI1IDEybDMzLjIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzMuMiAwYy0yOS4yIDAtNTYuNy0xMy4zLTc1LTM2bC0zLjgtNC43IDAgMTE1LjIgMzQuNSAyOS42YzE3LjcgMTUuMiAyOS4zIDM2LjIgMzIuNiA1OS4zbDEyLjYgODguMWMyLjUgMTcuNS05LjcgMzMuNy0yNy4yIDM2LjJzLTMzLjctOS43LTM2LjItMjcuMmwtMTIuNi04OC4xYy0xLjEtNy43LTUtMTQuNy0xMC45LTE5LjhMMTMwIDM0Ny41Yy0yMS4zLTE4LjItMzMuNS00NC45LTMzLjUtNzIuOWwwLTY5LjN6TTk2LjYgMzcxYzIuNCAyLjMgNC44IDQuNiA3LjQgNi44bDQ2IDM5LjQtMi4yIDcuNmMtNC41IDE1LjctMTIuOSAzMC0yNC40IDQxLjVMNTUuMSA1MzQuNmMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNsNjguMy02OC4zYzMuOC0zLjggNi42LTguNiA4LjEtMTMuOEw5Ni42IDM3MXpNNTA1LjUgMzQ1Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45bDMxLTMxLTEwMi4xIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMTAyLjEgMC0zMS0zMWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDcyIDcyYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45bC03MiA3MnoiXQogICAgfTsKICAgIGZhR2xhc3NlcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnbGFzc2VzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY1MzAiLCAiTTE0My4zIDk2Yy0xNCAwLTI2LjUgOS4yLTMwLjYgMjIuNkw3MC40IDI1NiAyMjQgMjU2YzE3LjcgMCAzMiAxNC4zIDMyIDMybDY0IDBjMC0xNy43IDE0LjMtMzIgMzItMzJsMTUzLjYgMC00Mi4zLTEzNy40QzQ1OS4yIDEwNS4yIDQ0Ni44IDk2IDQzMi43IDk2TDQwMCA5NmMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwzMi43IDBjNDIuMSAwIDc5LjQgMjcuNSA5MS44IDY3LjhsNDUuNCAxNDcuNWM0LjEgMTMuMiA2LjEgMjYuOSA2LjEgNDAuN2wwIDk2YzAgNTMtNDMgOTYtOTYgOTZsLTY0IDBjLTUzIDAtOTYtNDMtOTYtOTZsMC0zMi02NCAwIDAgMzJjMCA1My00MyA5Ni05NiA5NmwtNjQgMGMtNTMgMC05Ni00My05Ni05NmwwLTk2YzAtMTMuOCAyLjEtMjcuNSA2LjEtNDAuN0w1MS41IDk5LjhDNjMuOSA1OS41IDEwMS4xIDMyIDE0My4zIDMyTDE3NiAzMmMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIuNyAwek02NCAzMjBsMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmw2NCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNjQtMTI4IDB6bTQxNiA5NmMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTY0LTEyOCAwIDAgNjRjMCAxNy43IDE0LjMgMzIgMzIgMzJsNjQgMHoiXQogICAgfTsKICAgIGZhQ2lyY2xlUGF1c2UyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1wYXVzZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYyMDkyLCAicGF1c2UtY2lyY2xlIl0sICJmMjhiIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMjI0IDE5MmwwIDEyOGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTEyOGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMyem0xMjggMGwwIDEyOGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTEyOGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMyeiJdCiAgICB9OwogICAgZmFQYXVzZUNpcmNsZTIgPSBmYUNpcmNsZVBhdXNlMjsKICAgIGZhTWVtb3J5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1lbW9yeSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNTM4IiwgIk02NCA2NEMyOC43IDY0IDAgOTIuNyAwIDEyOGwwIDcuNEMwIDE0Mi4yIDQuNCAxNDggMTAuMSAxNTEuNyAyMy4zIDE2MC4zIDMyIDE3NS4xIDMyIDE5MnMtOC43IDMxLjctMjEuOSA0MC4zQzQuNCAyMzYgMCAyNDEuOCAwIDI0OC42bDAgNTUuNCA1MTIgMCAwLTU1LjRjMC02LjgtNC40LTEyLjYtMTAuMS0xNi4zLTEzLjItOC42LTIxLjktMjMuNC0yMS45LTQwLjNzOC43LTMxLjcgMjEuOS00MC4zYzUuNy0zLjcgMTAuMS05LjUgMTAuMS0xNi4zbDAtNy40YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDY0ek01MTIgNDE2bDAtNjQtNTEyIDAgMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmw2NCAwIDAtMjRjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDI0IDg4IDAgMC0yNGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgMjQgODggMCAwLTI0YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCAyNCA2NCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMyek0xNjAgMTYwbDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02NGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMyem0xMjggMGwwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMnptMTI4IDBsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJ6Il0KICAgIH07CiAgICBmYUdpZnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ2lmdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyNzg3M10sICJmMDZiIiwgIk0zMjEuNSA2OC44QzMyOS4xIDU1LjkgMzQyLjkgNDggMzU3LjggNDhsMi4yIDBjMjIuMSAwIDQwIDE3LjkgNDAgNDBzLTE3LjkgNDAtNDAgNDBsLTczLjMgMCAzNC44LTU5LjJ6bS0xMzEgMGwzNC44IDU5LjItNzMuMyAwYy0yMi4xIDAtNDAtMTcuOS00MC00MHMxNy45LTQwIDQwLTQwbDIuMiAwYzE0LjkgMCAyOC44IDcuOSAzNi4zIDIwLjh6bTg5LjYtMjQuM2wtMjQuMSA0MS0yNC4xLTQxQzIxNS43IDE2LjkgMTg2LjEgMCAxNTQuMiAwTDE1MiAwYy00OC42IDAtODggMzkuNC04OCA4OCAwIDE0LjQgMy41IDI4IDkuNiA0MEwzMiAxMjhjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJsNDQ4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0zMmMwLTE3LjctMTQuMy0zMi0zMi0zMmwtNDEuNiAwYzYuMS0xMiA5LjYtMjUuNiA5LjYtNDAgMC00OC42LTM5LjQtODgtODgtODhsLTIuMiAwYy0zMS45IDAtNjEuNSAxNi45LTc3LjcgNDQuNHpNNDgwIDI3MmwtMjAwIDAgMCAyMDggMTM2IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xNDR6bS0yNDggMGwtMjAwIDAgMCAxNDRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTM2IDAgMC0yMDh6Il0KICAgIH07CiAgICBmYU1vbmV5QmlsbFdoZWF0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vbmV5LWJpbGwtd2hlYXQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTUyYSIsICJNMTc2LTE2YzQ0LjIgMCA4MCAzNS44IDgwIDgwIDAgOC44LTcuMiAxNi0xNiAxNi00NC4yIDAtODAtMzUuOC04MC04MCAwLTguOCA3LjItMTYgMTYtMTZ6TTU2IDBsNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNEw1NiA0OEM0Mi43IDQ4IDMyIDM3LjMgMzIgMjRTNDIuNyAwIDU2IDB6TTI0IDcybDExMiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0TDI0IDEyMEMxMC43IDEyMCAwIDEwOS4zIDAgOTZTMTAuNyA3MiAyNCA3MnptOCA5NmMwLTEzLjMgMTAuNy0yNCAyNC0yNGw0OCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC00OCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHpNMjcyIDBjMC04LjggNy4yLTE2IDE2LTE2IDQ0LjIgMCA4MCAzNS44IDgwIDgwIDAgOC44LTcuMiAxNi0xNiAxNi00NC4yIDAtODAtMzUuOC04MC04MHpNNDAwLTE2YzQ0LjIgMCA4MCAzNS44IDgwIDgwIDAgOC44LTcuMiAxNi0xNiAxNi00NC4yIDAtODAtMzUuOC04MC04MCAwLTguOCA3LjItMTYgMTYtMTZ6bTgwIDE0NGMwIDQ0LjItMzUuOCA4MC04MCA4MC04LjggMC0xNi03LjItMTYtMTYgMC00NC4yIDM1LjgtODAgODAtODAgOC44IDAgMTYgNy4yIDE2IDE2ek0zNTIgMTEyYzguOCAwIDE2IDcuMiAxNiAxNiAwIDQ0LjItMzUuOCA4MC04MCA4MC04LjggMC0xNi03LjItMTYtMTYgMC00NC4yIDM1LjgtODAgODAtODB6bS05NiAxNmMwIDQ0LjItMzUuOCA4MC04MCA4MC04LjggMC0xNi03LjItMTYtMTYgMC00NC4yIDM1LjgtODAgODAtODAgOC44IDAgMTYgNy4yIDE2IDE2ek0wIDMwNGMwLTI2LjUgMjEuNS00OCA0OC00OGw0MTYgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDE2MGMwIDI2LjUtMjEuNSA0OC00OCA0OEw0OCA1MTJjLTI2LjUgMC00OC0yMS41LTQ4LTQ4TDAgMzA0ek00OCA0MTZsMCA0OCA0OCAwYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4ek05NiAzMDRsLTQ4IDAgMCA0OGMyNi41IDAgNDgtMjEuNSA0OC00OHpNNDY0IDQxNmMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsNDggMCAwLTQ4ek00MTYgMzA0YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDAtNDgtNDggMHptLTk2IDgwYTY0IDY0IDAgMSAwIC0xMjggMCA2NCA2NCAwIDEgMCAxMjggMHoiXQogICAgfTsKICAgIGZhRHVuZ2VvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkdW5nZW9uIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY2ZDkiLCAiTTM0Ny41IDE0NC44YzYuNSA1LjQgMTIuNSAxMS4zIDE4IDE3LjcgOC43IDEwLjIgMjMuNyAxNCAzNS4xIDYuOWw1NC4xLTMzLjhjMTEuMi03IDE0LjctMjEuNyA2LjktMzIuMi0xNS4zLTIwLjUtMzMuNS0zOC42LTU0LjEtNTMuOC0xMC40LTcuNi0yNC43LTQuMy0zMS44IDYuNGwtMzUuMSA1Mi42Yy03LjggMTEuNi0zLjggMjcuMyA3IDM2LjJ6TTMyNy44IDQxLjFjOC42LTEyLjkgMi45LTMwLjUtMTIuMi0zNC4xLTE5LjEtNC42LTM5LjEtNy01OS42LTdzLTQwLjQgMi40LTU5LjYgN2MtMTUuMSAzLjYtMjAuOCAyMS4yLTEyLjIgMzQuMWw0MCA2MGM1LjIgNy44IDE0LjUgMTEuNyAyMy45IDExLjIgNS4yLS4zIDEwLjYtLjMgMTUuOCAwIDkuNCAuNSAxOC43LTMuNCAyMy45LTExLjJsNDAtNjB6TTUwLjUgMTAzLjNjLTcuOSAxMC41LTQuMyAyNS4zIDYuOSAzMi4ybDU0LjEgMzMuOGMxMS40IDcuMSAyNi4zIDMuMyAzNS4xLTYuOSA1LjUtNi40IDExLjUtMTIuMyAxOC0xNy43IDEwLjgtOC45IDE0LjgtMjQuNiA3LTM2LjJMMTM2LjQgNTUuOWMtNy4xLTEwLjctMjEuNS0xNC0zMS44LTYuNC0yMC42IDE1LjEtMzguOCAzMy4zLTU0LjEgNTMuOHptNjIgMTQxLjFjLjgtOS45LTMuMy0xOS45LTExLjgtMjUuMUw0MSAxODJjLTEyLjktOC0yOS45LTIuMy0zMy42IDEyLjUtNC45IDE5LjctNy41IDQwLjMtNy41IDYxLjZsMCAyNGMwIDEzLjMgMTAuNyAyNCAyNCAyNGw2NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtMjRjMC0zLjkgLjItNy44IC41LTExLjZ6bTI4Ny4xIDBjLjMgMy44IC41IDcuNyAuNSAxMS42bDAgMjRjMCAxMy4zIDEwLjcgMjQgMjQgMjRsNjQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTI0YzAtMjEuMi0yLjYtNDEuOC03LjUtNjEuNi0zLjYtMTQuNy0yMC43LTIwLjUtMzMuNi0xMi41bC01OS43IDM3LjNjLTguNCA1LjMtMTIuNiAxNS4yLTExLjggMjUuMXpNODggMzUybC02NCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNEwwIDQ4OGMwIDEzLjMgMTAuNyAyNCAyNCAyNGw2NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtMTEyYzAtMTMuMy0xMC43LTI0LTI0LTI0em00MDAgMGwtNjQgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAxMTJjMCAxMy4zIDEwLjcgMjQgMjQgMjRsNjQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTExMmMwLTEzLjMtMTAuNy0yNC0yNC0yNHpNMjgwIDE4NGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDMwNGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMzA0em0tODAgMzJjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAyNzJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTI3MnptMTYwIDBjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAyNzJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTI3MnoiXQogICAgfTsKICAgIGZhU3VpdGNhc2VNZWRpY2FsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN1aXRjYXNlLW1lZGljYWwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsibWVka2l0Il0sICJmMGZhIiwgIk0xOTIgNTZsMCA0MCAxMjggMCAwLTQwYzAtNC40LTMuNi04LTgtOEwyMDAgNDhjLTQuNCAwLTggMy42LTggOHptLTQ4IDhsMC04YzAtMzAuOSAyNS4xLTU2IDU2LTU2TDMxMiAwYzMwLjkgMCA1NiAyNS4xIDU2IDU2bDAgNDI0LTIyNCAwIDAtNDE2ek05NiAxNzZsMCAzMDQtMzIgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxNjBjMC0zNS4zIDI4LjctNjQgNjQtNjRsMzIgMCAwIDgwek00MTYgNDgwbDAtMzg0IDMyIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyNTZjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTMyIDB6TTI0NCAyMDhjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDM2LTM2IDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDI0YzAgOC44IDcuMiAxNiAxNiAxNmwzNiAwIDAgMzZjMCA4LjggNy4yIDE2IDE2IDE2bDI0IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzYgMzYgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0yNGMwLTguOC03LjItMTYtMTYtMTZsLTM2IDAgMC0zNmMwLTguOC03LjItMTYtMTYtMTZsLTI0IDB6Il0KICAgIH07CiAgICBmYU1lZGtpdCA9IGZhU3VpdGNhc2VNZWRpY2FsOwogICAgZmFQZXJzb25DYW5lID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1jYW5lIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU1M2MiLCAiTTIzMi0zMmE1NiA1NiAwIDEgMSAwIDExMiA1NiA1NiAwIDEgMSAwLTExMnpNMTQ0IDIzNi43TDk3LjcgMjk5LjFjLTEwLjUgMTQuMi0zMC42IDE3LjItNDQuOCA2LjZzLTE3LjItMzAuNi02LjYtNDQuOGw3MC41LTk1QzE0MiAxMzIgMTgxLjcgMTEyIDIyNCAxMTJzODIgMjAgMTA3LjIgNTMuOWw3MC41IDk1YzEwLjUgMTQuMiA3LjYgMzQuMi02LjYgNDQuOHMtMzQuMiA3LjYtNDQuOC02LjZMMzA0IDIzNi43IDMwNCA1MTJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xNjBjMC04LjgtNy4yLTE2LTE2LTE2cy0xNiA3LjItMTYgMTZsMCAxNjBjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0yNzUuM3pNMzkyIDM4NGMtNC40IDAtOCAzLjYtOCA4IDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtMzAuOSAyNS4xLTU2IDU2LTU2czU2IDI1LjEgNTYgNTZsMCAxMjhjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0xMjhjMC00LjQtMy42LTgtOC04eiJdCiAgICB9OwogICAgZmFHYXVnZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnYXVnZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJkYXNoYm9hcmQiLCAiZ2F1Z2UtbWVkIiwgInRhY2hvbWV0ZXItYWx0LWF2ZXJhZ2UiXSwgImY2MjQiLCAiTTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTMyMCA5NmMwLTI2LjktMTYuNS00OS45LTQwLTU5LjNMMjgwIDEyMGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDE3Mi43Yy0yMy41IDkuNS00MCAzMi41LTQwIDU5LjMgMCAzNS4zIDI4LjcgNjQgNjQgNjRzNjQtMjguNyA2NC02NHpNMTQ0IDE3NmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6bS0xNiA4MGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem0yODggMzJhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0ek00MDAgMTQ0YTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6Il0KICAgIH07CiAgICBmYURhc2hib2FyZCA9IGZhR2F1Z2U7CiAgICBmYUdhdWdlTWVkID0gZmFHYXVnZTsKICAgIGZhVGFjaG9tZXRlckFsdEF2ZXJhZ2UgPSBmYUdhdWdlOwogICAgZmFFbnZlbG9wZU9wZW5UZXh0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImVudmVsb3BlLW9wZW4tdGV4dCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNjU4IiwgIk0yODggMzMuOUw5Ni40IDE3NS44IDI1NC41IDI5M2M1LjMgMy45IDExLjIgNi45IDE3LjUgOC43TDI3MiA0NjRjMCA1LjUgLjUgMTAuOCAxLjMgMTZMOTYgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTIzOS45YzAtMjAuMyA5LjYtMzkuNCAyNS45LTUxLjRMMjU0LjUtMjFjOS43LTcuMiAyMS40LTExIDMzLjUtMTFzMjMuOCAzLjkgMzMuNSAxMUw1MTguMSAxMjQuN2M3LjIgNS4zIDEzLjEgMTIgMTcuNCAxOS42LTIuNS0uMi01LS4zLTcuNS0uM0w0MzYuNiAxNDQgMjg4IDMzLjl6TTMyMCAyNDBjMC0yNi41IDIxLjUtNDggNDgtNDhsMTYwIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAyMjRjMCAyNi41LTIxLjUgNDgtNDggNDhsLTE2MCAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTIyNHptODAgMTZjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsOTYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtOTYgMHptMCA5NmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw1NiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC01NiAweiJdCiAgICB9OwogICAgZmFUb29sYm94ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRvb2xib3giLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjk1MjBdLCAiZjU1MiIsICJNMTc2IDU2bDAgNDAgMTYwIDAgMC00MGMwLTQuNC0zLjYtOC04LThMMTg0IDQ4Yy00LjQgMC04IDMuNi04IDh6TTEyOCA5NmwwLTQwYzAtMzAuOSAyNS4xLTU2IDU2LTU2TDMyOCAwYzMwLjkgMCA1NiAyNS4xIDU2IDU2bDAgNDAgMjguMSAwYzEyLjcgMCAyNC45IDUuMSAzMy45IDE0LjFsNTEuOSA1MS45YzkgOSAxNC4xIDIxLjIgMTQuMSAzMy45bDAgNzYuMS0xMzYgMCAwLTE2YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTYtMTQ0IDAgMC0xNmMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDE2LTEzNiAwIDAtNzYuMWMwLTEyLjcgNS4xLTI0LjkgMTQuMS0zMy45bDUxLjktNTEuOWM5LTkgMjEuMi0xNC4xIDMzLjktMTQuMUwxMjggOTZ6TTAgNDE2bDAtOTYgMTM2IDAgMCAxNmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTYgMTQ0IDAgMCAxNmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTYgMTM2IDAgMCA5NmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0eiJdCiAgICB9OwogICAgZmFQb3dlck9mZiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwb3dlci1vZmYiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5MjExXSwgImYwMTEiLCAiTTI4OCAwYzAtMTcuNy0xNC4zLTMyLTMyLTMyUzIyNC0xNy43IDIyNCAwbDAgMjU2YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJMMjg4IDB6TTE0Ni4zIDk4LjRjMTQuNS0xMC4xIDE4LTMwLjEgNy45LTQ0LjZzLTMwLjEtMTgtNDQuNi03LjlDNDMuNCA5Mi4xIDAgMTY5IDAgMjU2IDAgMzk3LjQgMTE0LjYgNTEyIDI1NiA1MTJTNTEyIDM5Ny40IDUxMiAyNTZjMC04Ny00My40LTE2My45LTEwOS43LTIxMC4xLTE0LjUtMTAuMS0zNC40LTYuNi00NC42IDcuOXMtNi42IDM0LjQgNy45IDQ0LjZjNDkuOCAzNC44IDgyLjMgOTIuNCA4Mi4zIDE1Ny42IDAgMTA2LTg2IDE5Mi0xOTIgMTkyUzY0IDM2MiA2NCAyNTZjMC02NS4yIDMyLjUtMTIyLjkgODIuMy0xNTcuNnoiXQogICAgfTsKICAgIGZhU2lnbmFsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNpZ25hbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODI0NiwgInNpZ25hbC01IiwgInNpZ25hbC1wZXJmZWN0Il0sICJmMDEyIiwgIk00ODggNTZjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCA0MDBjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTQwMHpNMzYwIDEyOGMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAzMDRjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTMwNGMwLTEzLjMtMTAuNy0yNC0yNC0yNHpNMjgwIDI0OGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDIwOGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMjA4ek0xNTIgMzIwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDExMmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTEyYzAtMTMuMy0xMC43LTI0LTI0LTI0ek00OCAzODRjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgNDhjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTQ4YzAtMTMuMy0xMC43LTI0LTI0LTI0eiJdCiAgICB9OwogICAgZmFTaWduYWw1ID0gZmFTaWduYWw7CiAgICBmYVNpZ25hbFBlcmZlY3QgPSBmYVNpZ25hbDsKICAgIGZhQXJyb3dzU3BpbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvd3Mtc3BpbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNGJiIiwgIk00ODEuNyAyNDAuMWMtMTcuNi0xLjItMzIuOSAxMi0zNC4yIDI5LjctMy4zIDQ3LTIzLjYgODkuNC01NC44IDEyMUwzNjEgMzU5Yy02LjktNi45LTE3LjItOC45LTI2LjItNS4yUzMyMCAzNjYuMyAzMjAgMzc2bDAgMTEyYzAgMTMuMyAxMC43IDI0IDI0IDI0bDExMiAwYzkuNyAwIDE4LjUtNS44IDIyLjItMTQuOHMxLjctMTkuMy01LjItMjYuMmwtMzUtMzVjNDEuNy00Mi4yIDY4LjktOTguOCA3My40LTE2MS44IDEuMi0xNy42LTEyLTMyLjktMjkuNy0zNC4yek0zOSA0MUw3NCA3NmMtNDEuNyA0Mi4yLTY4LjkgOTguOC03My40IDE2MS44LTEuMiAxNy42IDEyIDMyLjkgMjkuNyAzNC4yczMyLjktMTIgMzQuMi0yOS43YzMuMy00NyAyMy42LTg5LjQgNTQuOC0xMjFMMTUxIDE1M2M2LjkgNi45IDE3LjIgOC45IDI2LjIgNS4yUzE5MiAxNDUuNyAxOTIgMTM2bDAtMTEyYzAtMTMuMy0xMC43LTI0LTI0LTI0TDU2IDBDNDYuMyAwIDM3LjUgNS44IDMzLjggMTQuOFMzMi4yIDM0LjEgMzkgNDF6bTIwMS0xMC43Yy0xLjIgMTcuNiAxMiAzMi45IDI5LjcgMzQuMiA0NyAzLjMgODkuNCAyMy42IDEyMSA1NC44TDM1OSAxNTFjLTYuOSA2LjktOC45IDE3LjItNS4yIDI2LjJTMzY2LjMgMTkyIDM3NiAxOTJsMTEyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC0xMTJjMC05LjctNS44LTE4LjUtMTQuOC0yMi4yUzQ3Ny45IDMyLjIgNDcxIDM5TDQzNiA3NGMtNDIuMi00MS43LTk4LjgtNjguOS0xNjEuOC03My40LTE3LjYtMS4yLTMyLjkgMTItMzQuMiAyOS43ek00MSA0NzNsMzUtMzVjNDIuMiA0MS43IDk4LjggNjguOSAxNjEuOCA3My40IDE3LjYgMS4yIDMyLjktMTIgMzQuMi0yOS43cy0xMi0zMi45LTI5LjctMzQuMmMtNDctMy4zLTg5LjQtMjMuNi0xMjEtNTQuOEwxNTMgMzYxYzYuOS02LjkgOC45LTE3LjIgNS4yLTI2LjJTMTQ1LjcgMzIwIDEzNiAzMjBMMjQgMzIwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNEwwIDQ1NmMwIDkuNyA1LjggMTguNSAxNC44IDIyLjJTMzQuMSA0NzkuOCA0MSA0NzN6Il0KICAgIH07CiAgICBmYUpvaW50ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImpvaW50IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY1OTUiLCAiTTM2MCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgMTljMCA0MC4zIDE2IDc5IDQ0LjUgMTA3LjVsMjEgMjFDNDY5IDE5MSA0ODAgMjE3LjQgNDgwIDI0NWwwIDE5YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMTljMC0xNC45LTUuOS0yOS4xLTE2LjQtMzkuNmwtMjEtMjFDMzU3LjEgMTQ2LjkgMzM2IDk2IDMzNiA0M2wwLTE5YzAtMTMuMyAxMC43LTI0IDI0LTI0ek01NTIgMjg4Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTE5YzAtNDAuMy0xNi03OS00NC41LTEwNy41bC0yMS0yMUM0NDMgOTcgNDMyIDcwLjYgNDMyIDQzbDAtMTljMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDE5YzAgMTQuOSA1LjkgMjkuMSAxNi40IDM5LjZsMjEgMjFDNTU0LjkgMTQxLjEgNTc2IDE5MiA1NzYgMjQ1bDAgMTljMCAxMy4zLTEwLjcgMjQtMjQgMjR6TTI5Mi43IDMyMGM1LjYgMCAxMC43IDIuOSAxMy42IDcuNkwzOTQuNiA0NzFjMS4zIDIuMSAwIDQuOS0yLjQgNS4yLTE2LjEgMi41LTMyLjQgMy43LTQ4LjcgMy43bC0zOC4xIDBjLTUuNiAwLTEwLjctMi45LTEzLjYtNy42bC03OS0xMjguNGMtNi05LjggMC0yMi42IDExLjUtMjMuMyA2LjctLjQgMTMuNC0uNiAyMC4yLS42bDQ4LjMgMHpNNDU5LjMgNDY1LjljLTYuNCAxLTEyLjctMS45LTE2LjEtNy40TDM3NC4xIDM0Ni4xYy02LjctMTAuOSAxLjUtMjQuNyAxNC4yLTIyLjkgMS4zIC4yIDIuNiAuNCAzLjggLjZsMTM2LjQgMjFjMjcuMyA0LjIgNDcuNCAyNy43IDQ3LjQgNTUuM3MtMjAuMSA1MS4xLTQ3LjQgNTUuM2wtNjkuMiAxMC42ek0xMzguNyAzMzZjNi43LTEuNSAxMy42IDEuNCAxNy4yIDcuMmw2OC45IDExMmM2LjYgMTAuNy0xLjIgMjQuNC0xMy44IDIzLjEtMTMtMS40LTI1LjktMy41LTM4LjYtNi41TDMxLjIgNDM5LjJDMTIuOSA0MzUgMCA0MTguNyAwIDQwMHMxMi45LTM1IDMxLjItMzkuMkwxMzguNyAzMzZ6Il0KICAgIH07CiAgICBmYUJyYWlsbGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnJhaWxsZSIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmMmExIiwgIk04MCAxNDRhODAgODAgMCAxIDAgMC0xNjAgODAgODAgMCAxIDAgMCAxNjB6bTAgMTkyYTgwIDgwIDAgMSAwIDAtMTYwIDgwIDgwIDAgMSAwIDAgMTYwem0wIDEzNmMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNCAyNCAxMC43IDI0IDI0LTEwLjcgMjQtMjQgMjR6bTAgNTZjNDQuMiAwIDgwLTM1LjggODAtODBzLTM1LjgtODAtODAtODAtODAgMzUuOC04MCA4MCAzNS44IDgwIDgwIDgwem0yNDgtODBjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjQgMTAuNy0yNCAyNC0yNCAyNCAxMC43IDI0IDI0em01NiAwYzAtNDQuMi0zNS44LTgwLTgwLTgwcy04MCAzNS44LTgwIDgwIDM1LjggODAgODAgODAgODAtMzUuOCA4MC04MHpNMzA0IDIzMmEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6bTAgMTA0YTgwIDgwIDAgMSAwIDAtMTYwIDgwIDgwIDAgMSAwIDAgMTYwem0wLTE5MmE4MCA4MCAwIDEgMCAwLTE2MCA4MCA4MCAwIDEgMCAwIDE2MHoiXQogICAgfTsKICAgIGZhQmFza2V0U2hvcHBpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmFza2V0LXNob3BwaW5nIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInNob3BwaW5nLWJhc2tldCJdLCAiZjI5MSIsICJNMjg4IDBjNi42IDAgMTIuOSAyLjcgMTcuNCA3LjVsMTQ0IDE1MiAuNSAuNSA3OC4xIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzIgMCAxNC41LTkuNiAyNi43LTIyLjggMzAuN0w0OTEuMSA0MjkuOWMtNi41IDI5LjMtMzIuNSA1MC4xLTYyLjUgNTAuMWwtMjgxLjMgMGMtMzAgMC01Ni0yMC44LTYyLjUtNTAuMWwtNDYtMjA3LjJjLTEzLjItMy45LTIyLjgtMTYuMi0yMi44LTMwLjcgMC0xNy43IDE0LjMtMzIgMzItMzJsNzguMSAwIC41LS41IDE0NC0xNTJDMjc1LjEgMi43IDI4MS40IDAgMjg4IDB6bTAgNTguOUwxOTIuMiAxNjAgMzgzLjggMTYwIDI4OCA1OC45ek0yMDggMjY0YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTEyYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xMTJ6bTgwLTI0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDExMmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTEyYzAtMTMuMy0xMC43LTI0LTI0LTI0em0xMjggMjRjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAxMTJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTExMnoiXQogICAgfTsKICAgIGZhU2hvcHBpbmdCYXNrZXQgPSBmYUJhc2tldFNob3BwaW5nOwogICAgZmFCcmlkZ2UgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnJpZGdlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU0YzgiLCAiTTMyIDMyQzE0LjMgMzIgMCA0Ni4zIDAgNjRTMTQuMyA5NiAzMiA5Nmw4IDAgMCA2NC00MCAwIDAgMTEyYzM3LjYgOS40IDY0IDQzLjIgNjQgODJsMCA5NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNjRjMC01MyA0My05NiA5Ni05NnM5NiA0MyA5NiA5NmwwIDY0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC05NGMwLTM4LjggMjYuNC03Mi42IDY0LTgybDAtMTEyLTQwIDAgMC02NCA4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgMzJ6TTQyNCA5NmwwIDY0LTgwIDAgMC02NCA4MCAwek0yOTYgOTZsMCA2NC04MCAwIDAtNjQgODAgMHpNODggOTZsODAgMCAwIDY0LTgwIDAgMC02NHoiXQogICAgfTsKICAgIGZhUGxhbmVBcnJpdmFsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBsYW5lLWFycml2YWwiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjg3NDhdLCAiZjVhZiIsICJNMzg2LjYgMTkzLjFMMjY1LjkgMy43Yy00LjgtNy42LTEyLjYtMTIuOC0yMS40LTE0LjNsLTQzLjEtNy42Yy0xMC44LTEuOS0yMC4yIDcuMy0xOC42IDE4LjFsMjQgMTYxLjYtMTA1LTE4LjUtMzMuOC02MS44QzY0LjUgNzQuNyA1OC4yIDcwLjIgNTEuMSA2OUwzNCA2NmMtOS44LTEuNy0xOC44IDUuOS0xOC44IDE1LjhsLjYgMTA2LjNjLjIgMzAuOSAyMi40IDU3LjMgNTIuOSA2Mi43bDEzLjUgMi40IDAgMCA0MTcuNiA3My42YzMwLjUgNS40IDU5LjUtMTUgNjQuOS00NS40cy0xNS01OS41LTQ1LjQtNjQuOUwzODYuNiAxOTMuMXpNMjI0IDM4NGEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6bTEzMS4yLTE1LjNhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHpNMzIgNDQ4Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDUxMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDMyIDQ0OHoiXQogICAgfTsKICAgIGZhQ2FzaFJlZ2lzdGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhc2gtcmVnaXN0ZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjc4OCIsICJNOTYgMEM2MC43IDAgMzIgMjguNyAzMiA2NHMyOC43IDY0IDY0IDY0bDQ4IDAgMCAzMi01NyAwYy0zMS42IDAtNTguNSAyMy4xLTYzLjMgNTQuNEwxLjEgMzY0LjFDLjQgMzY4LjggMCAzNzMuNiAwIDM3OC40TDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtNjkuNmMwLTQuOC0uNC05LjYtMS4xLTE0LjRMNDg4LjIgMjE0LjRDNDgzLjUgMTgzLjEgNDU2LjYgMTYwIDQyNSAxNjBsLTIxNyAwIDAtMzIgNDggMGMzNS4zIDAgNjQtMjguNyA2NC02NFMyOTEuMyAwIDI1NiAwTDk2IDB6bTAgNDhsMTYwIDBjOC44IDAgMTYgNy4yIDE2IDE2cy03LjIgMTYtMTYgMTZMOTYgODBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZ6TTY0IDQyNGMwLTEzLjMgMTAuNy0yNCAyNC0yNGwzMzYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNEw4OCA0NDhjLTEzLjMgMC0yNC0xMC43LTI0LTI0em00OC0xNjBhMjQgMjQgMCAxIDEgMC00OCAyNCAyNCAwIDEgMSAwIDQ4em0xMjAtMjRhMjQgMjQgMCAxIDEgLTQ4IDAgMjQgMjQgMCAxIDEgNDggMHpNMTYwIDM0NGEyNCAyNCAwIDEgMSAwLTQ4IDI0IDI0IDAgMSAxIDAgNDh6TTMyOCAyNDBhMjQgMjQgMCAxIDEgLTQ4IDAgMjQgMjQgMCAxIDEgNDggMHpNMjU2IDM0NGEyNCAyNCAwIDEgMSAwLTQ4IDI0IDI0IDAgMSAxIDAgNDh6TTQyNCAyNDBhMjQgMjQgMCAxIDEgLTQ4IDAgMjQgMjQgMCAxIDEgNDggMHpNMzUyIDM0NGEyNCAyNCAwIDEgMSAwLTQ4IDI0IDI0IDAgMSAxIDAgNDh6Il0KICAgIH07CiAgICBmYVJpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicmluZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNzBiIiwgIk02NCAyMDhjMCA3LjggNC40IDE4LjcgMTcuMSAzMC4zIDQ1LjQtMjQuMiAxMDcuNy0zOC4zIDE3NC45LTM4LjNzMTI5LjUgMTQuMSAxNzQuOSAzOC4zYzEyLjgtMTEuNiAxNy4xLTIyLjUgMTcuMS0zMC4zIDAtMTIuMy0xMC44LTMyLTQ3LjktNTAuNi0zNS4yLTE3LjYtODYuMS0yOS40LTE0NC4xLTI5LjRzLTEwOC45IDExLjgtMTQ0LjEgMjkuNEM3NC44IDE3NiA2NCAxOTUuNyA2NCAyMDh6bTE5MiA0MGMtNDcgMC04OS4zIDcuNi0xMjIuOSAxOS43IDMzLjIgMTIuNCA3NS43IDIwLjMgMTIyLjkgMjAuM3M4OS43LTcuOCAxMjIuOS0yMC4zQzM0NS4zIDI1NS42IDMwMyAyNDggMjU2IDI0OHpNMCAyMDhDMCAxNTguNCAzOS40IDEyMi4yIDgzLjMgMTAwLjIgMTI5LjEgNzcuMyAxOTAuMyA2NCAyNTYgNjRzMTI2LjkgMTMuMyAxNzIuNyAzNi4yYzQzLjkgMjIgODMuMyA1OC4yIDgzLjMgMTA3LjhsMCA5NmMwIDQ5LjYtMzkuNCA4NS44LTgzLjMgMTA3LjgtNDUuOSAyMi45LTEwNyAzNi4yLTE3Mi43IDM2LjJTMTI5LjEgNDM0LjcgODMuMyA0MTEuOEMzOS40IDM4OS44IDAgMzUzLjYgMCAzMDRsMC05NnoiXQogICAgfTsKICAgIGZhQXF1YXJpdXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXF1YXJpdXMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTg0NSIsICJNNDAxLjcgMjkxLjRjOS00LjUgMTkuNi00LjUgMjguNiAwbDEyOCA2NGMxNS44IDcuOSAyMi4yIDI3LjEgMTQuMyA0Mi45cy0yNy4xIDIyLjItNDIuOSAxNC4zTDQxNiAzNTUuOCAzMDIuMyA0MTIuNmMtOSA0LjUtMTkuNiA0LjUtMjguNiAwTDE2MCAzNTUuOCA0Ni4zIDQxMi42Yy0xNS44IDcuOS0zNSAxLjUtNDIuOS0xNC4zcy0xLjUtMzUgMTQuMy00Mi45bDEyOC02NGM5LTQuNSAxOS42LTQuNSAyOC42IDBMMjg4IDM0OC4yIDQwMS43IDI5MS40em0zLjQtMTkzLjVjOC4yLTMgMTcuMy0yLjUgMjUuMiAxLjVsMTI4IDY0YzE1LjggNy45IDIyLjIgMjcuMSAxNC4zIDQyLjlzLTI3LjEgMjIuMi00Mi45IDE0LjNMNDE2IDE2My44IDMwMi4zIDIyMC42Yy05IDQuNS0xOS42IDQuNS0yOC42IDBMMTYwIDE2My44IDQ2LjMgMjIwLjZjLTE1LjggNy45LTM1IDEuNS00Mi45LTE0LjNzLTEuNS0zNSAxNC4zLTQyLjlsMTI4LTY0IDMuNC0xLjVjOC4yLTMgMTcuMy0yLjUgMjUuMiAxLjVsMTEzLjcgNTYuOCAxMTMuNy01Ni44IDMuNC0xLjV6Il0KICAgIH07CiAgICBmYVNoYXJlTm9kZXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2hhcmUtbm9kZXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsic2hhcmUtYWx0Il0sICJmMWUwIiwgIk0zODQgMTkyYzUzIDAgOTYtNDMgOTYtOTZzLTQzLTk2LTk2LTk2LTk2IDQzLTk2IDk2YzAgNS40IC41IDEwLjggMS4zIDE2TDE1OS42IDE4NC4xYy0xNi45LTE1LTM5LjItMjQuMS02My42LTI0LjEtNTMgMC05NiA0My05NiA5NnM0MyA5NiA5NiA5NmMyNC40IDAgNDYuNi05LjEgNjMuNi0yNC4xTDI4OS4zIDQwMGMtLjkgNS4yLTEuMyAxMC41LTEuMyAxNiAwIDUzIDQzIDk2IDk2IDk2czk2LTQzIDk2LTk2LTQzLTk2LTk2LTk2Yy0yNC40IDAtNDYuNiA5LjEtNjMuNiAyNC4xTDE5MC43IDI3MmMuOS01LjIgMS4zLTEwLjUgMS4zLTE2cy0uNS0xMC44LTEuMy0xNmwxMjkuNy03Mi4xYzE2LjkgMTUgMzkuMiAyNC4xIDYzLjYgMjQuMXoiXQogICAgfTsKICAgIGZhU2hhcmVBbHQgPSBmYVNoYXJlTm9kZXM7CiAgICBmYVBlcnNvbkNpcmNsZUV4Y2xhbWF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1jaXJjbGUtZXhjbGFtYXRpb24iLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTUzZiIsICJNMjgwIDI0YTU2IDU2IDAgMSAwIC0xMTIgMCA1NiA1NiAwIDEgMCAxMTIgMHptMjQgMjEyLjdMMzQxIDI4Ni42YzEyLjgtMTcuNSAyOC41LTMyLjcgNDYuMy00NWwtNTYuMi03NS43QzMwNiAxMzIgMjY2LjMgMTEyIDIyNCAxMTJzLTgyIDIwLTEwNy4yIDUzLjlsLTcwLjUgOTVjLTEwLjUgMTQuMi03LjYgMzQuMiA2LjYgNDQuOHMzNC4yIDcuNiA0NC44LTYuNkwxNDQgMjM2LjcgMTQ0IDUxMmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTYwYzAtOC44IDcuMi0xNiAxNi0xNnMxNiA3LjIgMTYgMTZsMCAxNjBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTI3NS4zek00OTYgNTQ0YTE0NCAxNDQgMCAxIDAgMC0yODggMTQ0IDE0NCAwIDEgMCAwIDI4OHptMC0xMDBhMjAgMjAgMCAxIDEgMCA0MCAyMCAyMCAwIDEgMSAwLTQwem0wLTE0MGM4LjggMCAxNiA3LjIgMTYgMTZsMCA4MGMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTgwYzAtOC44IDcuMi0xNiAxNi0xNnoiXQogICAgfTsKICAgIGZhQmlub2N1bGFycyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiaW5vY3VsYXJzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxZTUiLCAiTTEyOCAzMmwzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzItOTYgMCAwLTMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyem02NCA5NmwwIDMyMGMwIDE3LjctMTQuMyAzMi0zMiAzMkwzMiA0ODBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNTkuMWMwLTM0LjYgOS40LTY4LjYgMjcuMi05OC4zIDEzLjctMjIuOCAyMi41LTQ4LjIgMjUuOC03NC42TDYwLjUgMTU2YzItMTYgMTUuNi0yOCAzMS44LTI4bDk5LjggMHptMjI3LjggMGMxNi4xIDAgMjkuOCAxMiAzMS44IDI4TDQ1OSAyMTZjMy4zIDI2LjQgMTIuMSA1MS44IDI1LjggNzQuNiAxNy44IDI5LjcgMjcuMiA2My43IDI3LjIgOTguM2wwIDU5LjFjMCAxNy43LTE0LjMgMzItMzIgMzJsLTEyOCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTMyMCA5OS44IDB6TTMyMCA2NGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzItOTYgMCAwLTMyem0tMzIgNjRsMCAxNjAtNjQgMCAwLTE2MCA2NCAweiJdCiAgICB9OwogICAgZmFLaXBTaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImtpcC1zaWduIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImUxYzQiLCAiTTM0MC44IDg4LjNjMTMuNC0xMS41IDE1LTMxLjcgMy41LTQ1LjFzLTMxLjctMTUtNDUuMS0zLjVMMTI4IDE4Ni40IDEyOCA2NGMwLTE3LjctMTQuMy0zMi0zMi0zMlM2NCA0Ni4zIDY0IDY0bDAgMTY4LTMyIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMzIgMCAwIDE2OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTIyLjQgMTcxLjIgMTQ2LjdjMTMuNCAxMS41IDMzLjYgOS45IDQ1LjEtMy41czkuOS0zMy42LTMuNS00NS4xTDE3My4yIDI4MCAzNTIgMjgwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0TDE3My4yIDIzMiAzNDAuOCA4OC4zeiJdCiAgICB9OwogICAgZmFIYXJkRHJpdmUyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhcmQtZHJpdmUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjg0MzYsICJoZGQiXSwgImYwYTAiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCAyNjAuMUMxOC4xIDI0Ny40IDQwLjIgMjQwIDY0IDI0MGwzMjAgMGMyMy44IDAgNDUuOSA3LjQgNjQgMjAuMUw0NDggOTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6TTQ0OCAzNTJjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMjg4Yy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDY0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtNjR6TTIyNCAzODRhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptMTI4LTMyYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhSGRkMiA9IGZhSGFyZERyaXZlMjsKICAgIGZhUmFua2luZ1N0YXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicmFua2luZy1zdGFyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1NjEiLCAiTTMyMS44IDU0LjFMMjk4LjIgNi4zYy0zLjktOC4zLTE2LjEtOC42LTIwLjQgMGwtMjMuNiA0Ny44LTUyLjMgNy41Yy05LjMgMS40LTEzLjMgMTIuOS02LjQgMTkuOGwzOCAzNy05IDUyLjFjLTEuNCA5LjMgOC4yIDE2LjUgMTYuOCAxMi4ybDQ2LjktMjQuOCA0Ni42IDI0LjRjOC42IDQuMyAxOC4zLTIuOSAxNi44LTEyLjJsLTktNTIuMSAzOC0zNi42YzYuOC02LjggMi45LTE4LjMtNi40LTE5LjhsLTUyLjMtNy41ek0yNTYgMjU2Yy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDE2MGMwIDI2LjUgMjEuNSA0OCA0OCA0OGw2NCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMTYwYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC02NCAwek00OCAzMjBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgOTZjMCAyNi41IDIxLjUgNDggNDggNDhsNjQgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTk2YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC02NCAwek00MTYgNDMybDAgMzJjMCAyNi41IDIxLjUgNDggNDggNDhsNjQgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTMyYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC02NCAwYy0yNi41IDAtNDggMjEuNS00OCA0OHoiXQogICAgfTsKICAgIGZhVXNlclRpZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1c2VyLXRpZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNTA4IiwgIk0yMjQgMjQ4YTEyMCAxMjAgMCAxIDEgMC0yNDAgMTIwIDEyMCAwIDEgMSAwIDI0MHptLTMwLjUgNTZsNjEgMGM5LjcgMCAxNy41IDcuOCAxNy41IDE3LjUgMCA0LjItMS41IDguMi00LjIgMTEuNGwtMjcuNCAzMiAzMSAxMTUuMSAuNiAwIDM0LjYtMTM4LjVjMi4yLTguNyAxMS4xLTE0IDE5LjUtMTAuOCA2MS45IDIzLjYgMTA1LjkgODMuNiAxMDUuOSAxNTMuOCAwIDE1LjEtMTIuMyAyNy40LTI3LjQgMjcuNEw0My40IDUxMmMtMTUuMSAwLTI3LjQtMTIuMy0yNy40LTI3LjQgMC03MC4yIDQ0LTEzMC4yIDEwNS45LTE1My44IDguNC0zLjIgMTcuMyAyLjEgMTkuNSAxMC44bDM0LjYgMTM4LjUgLjYgMCAzMS0xMTUuMS0yNy40LTMyYy0yLjctMy4yLTQuMi03LjItNC4yLTExLjQgMC05LjcgNy44LTE3LjUgMTcuNS0xNy41eiJdCiAgICB9OwogICAgZmFFbGxpcHNpcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJlbGxpcHNpcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJlbGxpcHNpcy1oIl0sICJmMTQxIiwgIk0wIDI1NmE1NiA1NiAwIDEgMSAxMTIgMCA1NiA1NiAwIDEgMSAtMTEyIDB6bTE2OCAwYTU2IDU2IDAgMSAxIDExMiAwIDU2IDU2IDAgMSAxIC0xMTIgMHptMjI0LTU2YTU2IDU2IDAgMSAxIDAgMTEyIDU2IDU2IDAgMSAxIDAtMTEyeiJdCiAgICB9OwogICAgZmFFbGxpcHNpc0ggPSBmYUVsbGlwc2lzOwogICAgZmFTdG9yZVNsYXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN0b3JlLXNsYXNoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImUwNzEiLCAiTTQxLTI0LjljLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwUy0yLjMtLjMgNyA5LjFsNTI4IDUyOGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTU4LjYtNTguNmMxLjEtNCAxLjYtOC4yIDEuNi0xMi41bDAtMTUxLjJjLTEyLjUgNC42LTI2LjEgNy4yLTQwLjUgNy4yLTguMSAwLTE1LjktLjgtMjMuNS0yLjRsMCA2Ni40LTMwLjIgMC0xMzcuNS0xMzcuNWMyLjktMy42IDUuNS03LjQgNy42LTExLjUgMTEuNiAyMiAzNC43IDM3IDYxLjMgMzcgMjYuOCAwIDQ5LjgtMTUuMSA2MS40LTM3LjEgMTEuNCAyMi4xIDM0LjUgMzcuMSA2MC44IDM3LjEgNDUuNiAwIDc4LjQtNDMuNyA2NS42LTg3LjVMNTEzLjggNzIuM0M1MDYuOCA0OC40IDQ4NC45IDMyIDQ2MCAzMkwxMTYgMzJjLTUuNSAwLTEwLjggLjgtMTUuOSAyLjNMNDEtMjQuOXpNMTUxLjUgMjIxLjNMNDguNyAxMTguNiAzOC45IDE1Mi41Yy0xMi44IDQzLjcgMjAgODcuNSA2NS42IDg3LjUgMTguMSAwIDM0LjctNy4xIDQ3LTE4Ljd6TTQxMC4yIDQ4MGwtMTI4LTEyOC0xNTQuMiAwIDAtNjYuNGMtNy42IDEuNi0xNS41IDIuNC0yMy41IDIuNC0xNC40IDAtMjgtMi42LTQwLjUtNy4yTDY0IDQzMmMwIDI2LjUgMjEuNSA0OCA0OCA0OGwyOTguMiAweiJdCiAgICB9OwogICAgZmFQZXJjZW50ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcmNlbnQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs2MjEwMSwgNjI3ODUsICJwZXJjZW50YWdlIl0sICIyNSIsICJNMTkyIDEyOGE5NiA5NiAwIDEgMCAtMTkyIDAgOTYgOTYgMCAxIDAgMTkyIDB6TTQ0OCAzODRhOTYgOTYgMCAxIDAgLTE5MiAwIDk2IDk2IDAgMSAwIDE5MiAwek00MzguNiA4Ni42YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwbC0zODQgMzg0Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwbDM4NC0zODR6Il0KICAgIH07CiAgICBmYVBlcmNlbnRhZ2UgPSBmYVBlcmNlbnQ7CiAgICBmYUZpbGVaaXBwZXIyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbGUtemlwcGVyIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbImZpbGUtYXJjaGl2ZSJdLCAiZjFjNiIsICJNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMMjEzLjUgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN0wzNjUuMyAxMjUuM2MxMiAxMiAxOC43IDI4LjMgMTguNyA0NS4zTDM4NCA0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDY0em0yMDgtNS41bDAgOTMuNWMwIDEzLjMgMTAuNyAyNCAyNCAyNEwzMjUuNSAxNzYgMjA4IDU4LjV6TTY0IDcyYzAgMTMuMyAxMC43IDI0IDI0IDI0bDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRMODggNDhDNzQuNyA0OCA2NCA1OC43IDY0IDcyem0wIDk2YzAgMTMuMyAxMC43IDI0IDI0IDI0bDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTQ4IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0em02NCA3MmwtMzIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA0OGMwIDI2LjUgMjEuNSA0OCA0OCA0OHM0OC0yMS41IDQ4LTQ4bDAtNDhjMC0xNy43LTE0LjMtMzItMzItMzJ6bS0xNiA2NGExNiAxNiAwIDEgMSAwIDMyIDE2IDE2IDAgMSAxIDAtMzJ6Il0KICAgIH07CiAgICBmYUZpbGVBcmNoaXZlMiA9IGZhRmlsZVppcHBlcjI7CiAgICBmYURpc3BsYXkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZGlzcGxheSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMTYzIiwgIk00NDggOTZsMCAyNTYtMzg0IDAgMC0yNTYgMzg0IDB6TTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCAzNTJjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTQ0IDAtMTYgNDgtNzIgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwyNzIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNzIgMC0xNi00OCAxNDQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI1NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnoiXQogICAgfTsKICAgIGZhSWNvbnMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaWNvbnMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiaGVhcnQtbXVzaWMtY2FtZXJhLWJvbHQiXSwgImY4NmQiLCAiTTE3NC45IDI3MmMxMC43IDAgMjAuNyA1LjMgMjYuNiAxNC4ybDExLjggMTcuOCAyNi43IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAxMTJjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNTEyYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDM1MmMwLTI2LjUgMjEuNS00OCA0OC00OGwyNi43IDAgMTEuOC0xNy44YzUuOS04LjkgMTUuOS0xNC4yIDI2LjYtMTQuMmw2MS43IDB6bTI3OC42LTEyYzUuNi00LjkgMTMuOS01LjMgMTkuOS0uOXM4LjMgMTIuNCA1LjMgMTkuM0w0NDAuMyAzNjggNDk2IDM2OGM2LjcgMCAxMi42IDQuMSAxNSAxMC40cy42IDEzLjMtNC40IDE3LjdsLTEyOCAxMTJjLTUuNiA0LjktMTMuOSA1LjMtMTkuOSAuOXMtOC4zLTEyLjQtNS4zLTE5LjNsMzguNS04OS43LTU1LjggMGMtNi43IDAtMTIuNi00LjEtMTUtMTAuNHMtLjYtMTMuMyA0LjQtMTcuN2wxMjgtMTEyek0xNDQgMzYwYTQ4IDQ4IDAgMSAwIDAgOTYgNDggNDggMCAxIDAgMC05NnpNNDgzLjggLjRjNi41LTEuMSAxMy4xIC40IDE4LjUgNC40IDYuMSA0LjUgOS43IDExLjcgOS43IDE5LjJsMCAxNTItLjMgNC45Yy0zLjMgMjQuMi0zMC41IDQzLjEtNjMuNyA0My4xLTM1LjMgMC02NC0yMS41LTY0LTQ4czI4LjctNDggNjQtNDhjNS41IDAgMTAuOSAuNiAxNiAxLjZsMC00OS4zLTExMiAzMy42IDAgMTEwLjItLjMgNC45Yy0zLjMgMjQuMi0zMC41IDQzLjEtNjMuNyA0My4xLTM1LjMgMC02NC0yMS41LTY0LTQ4czI4LjctNDggNjQtNDhjNS41IDAgMTAuOSAuNiAxNiAxLjZMMzA0IDcyYzAtMTAuNiA3LTIwIDE3LjEtMjNsMTYwLTQ4IDIuNy0uNnpNMTg4LjkgMEMyMjYgMCAyNTYgMzAgMjU2IDY3LjFsMCA2LjFjMCA1Ni4xLTc1LjIgMTEyLjEtMTEwLjMgMTM1LjMtMTAuOCA3LjEtMjQuNiA3LjEtMzUuNCAwLTM1LjEtMjMuMS0xMTAuMy03OS4yLTExMC4zLTEzNS4zbDAtNi4xQzAgMzAgMzAgMCA2Ny4xIDAgODguMiAwIDEwOCA5LjkgMTIwLjcgMjYuOGw3LjMgOS44IDcuMy05LjhDMTQ4IDkuOSAxNjcuOCAwIDE4OC45IDB6Il0KICAgIH07CiAgICBmYUhlYXJ0TXVzaWNDYW1lcmFCb2x0ID0gZmFJY29uczsKICAgIGZhUnVsZXJWZXJ0aWNhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJydWxlci12ZXJ0aWNhbCIsCiAgICAgIGljb246IFsyNTYsIDUxMiwgW10sICJmNTQ4IiwgIk0wIDE2QzAtMTAuNSAyMS41LTMyIDQ4LTMybDE2MCAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMjQtMTA0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTA0IDAgMCA0OC03MiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDcyIDAgMCA0OC0xMDQgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxMDQgMCAwIDQ4LTcyIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNzIgMCAwIDQ4LTEwNCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDEwNCAwIDAgMjRjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNTQ0Yy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDE2eiJdCiAgICB9OwogICAgZmFNYXBMb2NhdGlvbkRvdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtYXAtbG9jYXRpb24tZG90IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbIm1hcC1tYXJrZWQtYWx0Il0sICJmNWEwIiwgIk01NzYgNDhjMC0xMS4xLTUuNy0yMS40LTE1LjItMjcuMnMtMjEuMi02LjQtMzEuMS0xLjRMNDEzLjUgNzcuNSAyMzQuMSAxNy42Yy04LjEtMi43LTE2LjgtMi4xLTI0LjQgMS43bC0xMjggNjRDNzAuOCA4OC44IDY0IDk5LjkgNjQgMTEybDAgMzUyYzAgMTEuMSA1LjcgMjEuNCAxNS4yIDI3LjJzMjEuMiA2LjQgMzEuMSAxLjRsMTE2LjEtNTguMSAxNzMuMyA1Ny44Yy00LjMtNi40LTguNS0xMy4xLTEyLjYtMTkuOS0xMS0xOC4zLTIxLjktMzkuMy0zMC02MS44bC0xMDEuMi0zMy43IDAtMjg0LjUgMTI4IDQyLjcgMCA5OS4zYzMxLTM1LjggNzctNTguNCAxMjgtNTguNCAyMi42IDAgNDQuMiA0LjQgNjQgMTIuNUw1NzYgNDh6TTUxMiAyMjRjLTY2LjMgMC0xMjAgNTIuOC0xMjAgMTE3LjkgMCA2OC45IDY0LjEgMTUwLjQgOTguNiAxODkuMyAxMS42IDEzIDMxLjMgMTMgNDIuOSAwIDM0LjUtMzguOSA5OC42LTEyMC40IDk4LjYtMTg5LjMgMC02NS4xLTUzLjctMTE3LjktMTIwLTExNy45ek00NzIgMzQ0YTQwIDQwIDAgMSAxIDgwIDAgNDAgNDAgMCAxIDEgLTgwIDB6Il0KICAgIH07CiAgICBmYU1hcE1hcmtlZEFsdCA9IGZhTWFwTG9jYXRpb25Eb3Q7CiAgICBmYUhlYXJ0Q3JhY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGVhcnQtY3JhY2siLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgxNDgsICJoZWFydC1icm9rZW4iXSwgImY3YTkiLCAiTTEzMy4xIDMyYzE3LjMgMCAzNC4yIDMuNCA0OS45IDkuN2w1NC44IDg1LjItNzUuNCA3NS40Yy0xLjUgMS41LTIuNCAzLjYtMi4zIDUuOHMxIDQuMiAyLjYgNS43bDExMiAxMDRjMi45IDIuNyA3LjQgMi45IDEwLjUgLjNzMy44LTcgMS43LTEwLjRsLTYwLjQtOTguMSA5MC43LTc1LjZjMi42LTIuMSAzLjUtNS43IDIuNC04LjhMMjk2LjQgNjAuNkMzMTkuNiA0Mi4zIDM0OC42IDMyIDM3OC45IDMyIDQ1Mi40IDMyIDUxMiA5MS42IDUxMiAxNjUuMWwwIDIuNmMwIDExMi4yLTEzOS45IDI0Mi41LTIxMi45IDI5OC4yLTEyLjQgOS40LTI3LjYgMTQuMS00My4xIDE0LjFzLTMwLjgtNC42LTQzLjEtMTQuMUMxMzkuOSA0MTAuMiAwIDI3OS45IDAgMTY3LjdsMC0yLjZDMCA5MS42IDU5LjYgMzIgMTMzLjEgMzJ6Il0KICAgIH07CiAgICBmYUhlYXJ0QnJva2VuID0gZmFIZWFydENyYWNrOwogICAgZmFDb3cgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY293IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI4MDA0XSwgImY2YzgiLCAiTTk2IDIyNGwwIDE5MmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtODguMmM5LjkgNi42IDIwLjYgMTIgMzIgMTYuMWwwIDI0LjJjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTE2LjljNS4zIC42IDEwLjYgLjkgMTYgLjlzMTAuNy0uMyAxNi0uOWwwIDE2LjljMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTI0LjJjMTEuNC00IDIyLjEtOS40IDMyLTE2LjFsMCA4OC4yYzAgMTcuNyAxNC4zIDMyIDMyIDMybDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0xNjAgMzIgMzIgMCA0OS41YzAgOS41IDIuOCAxOC43IDguMSAyNi42TDUzMCA0MjdjOC44IDEzLjEgMjMuNSAyMSAzOS4zIDIxIDIyLjUgMCA0MS45LTE1LjkgNDYuMy0zOGwyMC4zLTEwMS42YzIuNi0xMy0uMy0yNi41LTgtMzcuM2wtMy45LTUuNSAwLTgxLjZjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAxNC40LTUyLjktNzQuMUM0OTYgODYuNSA0NTIuNCA2NCA0MDUuOSA2NEwxNDQgNjRDNzcuNyA2NCAyNCAxMTcuNyAyNCAxODRsMCA1NEM5LjQgMjQ5LjggMCAyNjcuOCAwIDI4OGwwIDE3LjZjMCA4IDYuNCAxNC40IDE0LjQgMTQuNCAzMS44IDAgNTcuNi0yNS44IDU3LjYtNTcuNkw3MiAxODRjMC0yNC4zIDEyLjEtNDUuOCAzMC41LTU4LjktNC4yIDEwLjgtNi41IDIyLjYtNi41IDM0LjlsMCA2NHpNNTYwIDMzNmExNiAxNiAwIDEgMSAzMiAwIDE2IDE2IDAgMSAxIC0zMiAwek0xNjYuNiAxNjYuNmMtNC4yLTQuMi02LjYtMTAtNi42LTE2IDAtMTIuNSAxMC4xLTIyLjYgMjIuNi0yMi42bDE3OC43IDBjMTIuNSAwIDIyLjYgMTAuMSAyMi42IDIyLjYgMCA2LTIuNCAxMS44LTYuNiAxNmwtMjMuNCAyMy40QzMzMi4yIDIxMS44IDMwMi43IDIyNCAyNzIgMjI0cy02MC4yLTEyLjItODEuOS0zMy45bC0yMy40LTIzLjR6Il0KICAgIH07CiAgICBmYVJzcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyc3MiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiZmVlZCJdLCAiZjA5ZSIsICJNMCA2NGMwLTE3LjcgMTQuMy0zMiAzMi0zMiAyMjkuOCAwIDQxNiAxODYuMiA0MTYgNDE2IDAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMyQzM4NCAyNTMuNiAyMjYuNCA5NiAzMiA5NiAxNC4zIDk2IDAgODEuNyAwIDY0ek0wIDQxNmE2NCA2NCAwIDEgMSAxMjggMCA2NCA2NCAwIDEgMSAtMTI4IDB6TTMyIDE2MGMxNTkuMSAwIDI4OCAxMjguOSAyODggMjg4IDAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMyYzAtMTIzLjctMTAwLjMtMjI0LTIyNC0yMjQtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMnoiXQogICAgfTsKICAgIGZhRmVlZCA9IGZhUnNzOwogICAgZmFNYWduaWZ5aW5nR2xhc3MgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFnbmlmeWluZy1nbGFzcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODI2OSwgInNlYXJjaCJdLCAiZjAwMiIsICJNNDE2IDIwOGMwIDQ1LjktMTQuOSA4OC4zLTQwIDEyMi43TDUwMi42IDQ1Ny40YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zcy0zMi44IDEyLjUtNDUuMyAwTDMzMC43IDM3NkMyOTYuMyA0MDEuMSAyNTMuOSA0MTYgMjA4IDQxNiA5My4xIDQxNiAwIDMyMi45IDAgMjA4UzkzLjEgMCAyMDggMCA0MTYgOTMuMSA0MTYgMjA4ek0yMDggMzUyYTE0NCAxNDQgMCAxIDAgMC0yODggMTQ0IDE0NCAwIDEgMCAwIDI4OHoiXQogICAgfTsKICAgIGZhU2VhcmNoID0gZmFNYWduaWZ5aW5nR2xhc3M7CiAgICBmYUNsb3VkTW9vbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjbG91ZC1tb29uIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY2YzMiLCAiTTQ4MCAwYzE0LjYgMCAyOC44IDEuNiA0Mi41IDQuNyA3LjQgMS43IDEzIDcuOCAxMy45IDE1LjRzLTMgMTQuOS05LjggMTguM2MtNDUuNCAyMi42LTc2LjYgNjkuNS03Ni42IDEyMy42IDAgNzYuMiA2MS44IDEzOCAxMzggMTM4IDMuNyAwIDcuNC0uMSAxMS4xLS40IDcuNi0uNiAxNC43IDMuNiAxNy44IDEwLjZzMS41IDE1LjEtMy45IDIwLjRjLTI2IDI1LTU5LjEgNDIuNy05NS45IDQ5LjktMTEuMS0yNS4zLTMwLjItNDYuMy01NC4xLTU5LjgtNy42LTYzLjQtNjEuNi0xMTIuNi0xMjcuMS0xMTIuNi0xMS4yIDAtMjIuMSAxLjUtMzIuNSA0LjItNC44LTQuMi05LjktOC4yLTE1LjItMTEuOC0uMS0yLjgtLjItNS42LS4yLTguNCAwLTEwNiA4Ni0xOTIgMTkyLTE5MnptLS4xIDQzMS45YzAgNDQuMi0zNS44IDgwLTgwIDgwbC0yNzEuOSAwYy01MyAwLTk2LTQzLTk2LTk2IDAtNDcuNiAzNC42LTg3IDgwLTk0LjYtLjQtNTIuOCA0Mi45LTk3LjMgOTYtOTcuMyAzNC45IDAgNjUuNCAxOC42IDgyLjIgNDYuNCAxMy05LjEgMjguOC0xNC40IDQ1LjgtMTQuNCA0NC4yIDAgODAgMzUuOCA4MCA4MCAwIDUuOS0uNiAxMS43LTEuOSAxNy4yIDM3LjQgNi43IDY1LjggMzkuNCA2NS44IDc4Ljd6Il0KICAgIH07CiAgICBmYUJveGVzU3RhY2tlZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib3hlcy1zdGFja2VkIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjI2MjUsICJib3hlcyIsICJib3hlcy1hbHQiXSwgImY0NjgiLCAiTTIyNCAwbDAgNjRjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtNjQgMzIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDEyOGMwIDUuNS0uNyAxMC45LTIgMTZsLTI1MiAwYy0xLjMtNS4xLTItMTAuNS0yLTE2bDAtMTI4YzAtMzUuMyAyOC43LTY0IDY0LTY0bDMyIDB6bTk2IDUxMmMtMTEuMiAwLTIxLjgtMi45LTMxLTggOS41LTE2LjUgMTUtMzUuNiAxNS01NmwwLTEyOGMwLTIwLjQtNS41LTM5LjUtMTUtNTYgOS4yLTUuMSAxOS43LTggMzEtOGwzMiAwIDAgNjRjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtNjQgMzIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDEyOGMwIDM1LjMtMjguNyA2NC02NCA2NGwtMTI4IDB6TTAgMzIwYzAtMzUuMyAyOC43LTY0IDY0LTY0bDMyIDAgMCA2NGMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC02NCAzMiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMTI4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAzMjB6Il0KICAgIH07CiAgICBmYUJveGVzID0gZmFCb3hlc1N0YWNrZWQ7CiAgICBmYUJveGVzQWx0ID0gZmFCb3hlc1N0YWNrZWQ7CiAgICBmYUNvZGVCcmFuY2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY29kZS1icmFuY2giLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjEyNiIsICJNODAgMTA0YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHptODAtMjRjMCAzMi44LTE5LjcgNjEtNDggNzMuM2wwIDcwLjcgMTc2IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0yMi43Yy0yOC4zLTEyLjMtNDgtNDAuNS00OC03My4zIDAtNDQuMiAzNS44LTgwIDgwLTgwczgwIDM1LjggODAgODBjMCAzMi44LTE5LjcgNjEtNDggNzMuM2wwIDIyLjdjMCA2MS45LTUwLjEgMTEyLTExMiAxMTJsLTE3NiAwIDAgNzAuN2MyOC4zIDEyLjMgNDggNDAuNSA0OCA3My4zIDAgNDQuMi0zNS44IDgwLTgwIDgwUzAgNDc2LjIgMCA0MzJjMC0zMi44IDE5LjctNjEgNDgtNzMuM2wwLTIwNS4zQzE5LjcgMTQxIDAgMTEyLjggMCA4MCAwIDM1LjggMzUuOCAwIDgwIDBzODAgMzUuOCA4MCA4MHptMjMyIDBhMjQgMjQgMCAxIDAgLTQ4IDAgMjQgMjQgMCAxIDAgNDggMHpNODAgNDU2YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiXQogICAgfTsKICAgIGZhQmFuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODY4MywgImNhbmNlbCJdLCAiZjA1ZSIsICJNMzY3LjIgNDEyLjVMOTkuNSAxNDQuOGMtMjIuNCAzMS40LTM1LjUgNjkuOC0zNS41IDExMS4yIDAgMTA2IDg2IDE5MiAxOTIgMTkyIDQxLjUgMCA3OS45LTEzLjEgMTExLjItMzUuNXptNDUuMy00NS4zYzIyLjQtMzEuNCAzNS41LTY5LjggMzUuNS0xMTEuMiAwLTEwNi04Ni0xOTItMTkyLTE5Mi00MS41IDAtNzkuOSAxMy4xLTExMS4yIDM1LjVMNDEyLjUgMzY3LjJ6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6Il0KICAgIH07CiAgICBmYUNhbmNlbCA9IGZhQmFuOwogICAgZmFKdWdEZXRlcmdlbnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAianVnLWRldGVyZ2VudCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlNTE5IiwgIk05NiAyNGMwLTEzLjMgMTAuNy0yNCAyNC0yNGw4MCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgMjQgOCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0TDg4IDk2Qzc0LjcgOTYgNjQgODUuMyA2NCA3MlM3NC43IDQ4IDg4IDQ4bDggMCAwLTI0ek0wIDI1NmMwLTcwLjcgNTcuMy0xMjggMTI4LTEyOGwxMjggMGM3MC43IDAgMTI4IDU3LjMgMTI4IDEyOGwwIDE5MmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMjU2em0yNTYgMGwwIDk2YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC05NmMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMnoiXQogICAgfTsKICAgIGZhUmVwbHkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicmVwbHkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MTcxNCwgIm1haWwtcmVwbHkiXSwgImYzZTUiLCAiTTIwNC4yIDE4LjRjMTIgNSAxOS44IDE2LjYgMTkuOCAyOS42bDAgODAgMTEyIDBjOTcuMiAwIDE3NiA3OC44IDE3NiAxNzYgMCAxMTMuMy04MS41IDE2My45LTEwMC4yIDE3NC4xLTIuNSAxLjQtNS4zIDEuOS04LjEgMS45LTEwLjkgMC0xOS43LTguOS0xOS43LTE5LjcgMC03LjUgNC4zLTE0LjQgOS44LTE5LjUgOS40LTguOCAyMi4yLTI2LjQgMjIuMi01Ni43IDAtNTMtNDMtOTYtOTYtOTZsLTk2IDAgMCA4MGMwIDEyLjktNy44IDI0LjYtMTkuOCAyOS42cy0yNS43IDIuMi0zNC45LTYuOWwtMTYwLTE2MGMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNsMTYwLTE2MGM5LjItOS4yIDIyLjktMTEuOSAzNC45LTYuOXoiXQogICAgfTsKICAgIGZhTWFpbFJlcGx5ID0gZmFSZXBseTsKICAgIGZhU3VuUGxhbnRXaWx0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN1bi1wbGFudC13aWx0IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1N2EiLCAiTTE2MCAwYy01LjUgMC0xMC42IDIuOC0xMy41IDcuNGwtMS4xIDIuMS0yNC44IDU1LjQtNTYuNy0yMS43Yy01LjktMi4yLTEyLjUtLjgtMTcgMy43UzQxIDU4IDQzLjIgNjMuOWwyMS43IDU2LjctNTUuNCAyNC44QzMuNyAxNDggMCAxNTMuNyAwIDE2MHMzLjcgMTIgOS41IDE0LjZsNTUuNCAyNC44LTIxLjcgNTYuN2MtMi4yIDUuOS0uOCAxMi41IDMuNyAxN3MxMS4xIDUuOSAxNyAzLjdsNTYuNy0yMS43IDI0LjggNTUuNGMyLjYgNS44IDguMyA5LjUgMTQuNiA5LjVzMTItMy43IDE0LjYtOS41bDI0LjgtNTUuNCA1Ni44IDIxLjdjNS45IDIuMiAxMi41IC44IDE3LTMuN3M1LjktMTEuMSAzLjctMTdsLTIxLjctNTYuNyA1NS40LTI0LjhjNS44LTIuNiA5LjUtOC4zIDkuNS0xNC42cy0zLjctMTItOS41LTE0LjZsLTU1LjQtMjQuOCAyMS43LTU2LjcgLjctMi4yYzEuMi01LjMtLjQtMTAuOS00LjMtMTQuOHMtOS41LTUuNS0xNC44LTQuM2wtMi4yIC43LTU2LjggMjEuNy0yNC44LTU1LjRDMTcyIDMuNyAxNjYuMyAwIDE2MCAwem0wIDk2YTY0IDY0IDAgMSAxIDAgMTI4IDY0IDY0IDAgMSAxIDAtMTI4em0zMiA2NGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem0zNzYgMTZsMCA1My40Yy0xNC44IDcuNy0yNCAyMy4xLTI0IDQ0LjYgMCAxNi44IDE2IDQ0IDM3LjQgNjcuMiA1LjggNi4yIDE1LjUgNi4yIDIxLjIgMCAyMS40LTIzLjMgMzcuNC01MC42IDM3LjQtNjcuMiAwLTIxLjUtOS4yLTM3LTI0LTQ0LjZsMC01My40YzAtNDQuMi0zNS44LTgwLTgwLTgwcy04MCAzNS44LTgwIDgwbDAgMjIuN2MtOS44LTQuMy0yMC42LTYuNy0zMi02LjctNDQuMiAwLTgwIDM1LjgtODAgODBsMCAyMS40Yy0xNC44IDcuNi0yNCAyMy4xLTI0IDQ0LjYgMCAxNi44IDE2IDQ0IDM3LjQgNjcuMiA1LjggNi4yIDE1LjUgNi4yIDIxLjIgMCAyMS40LTIzLjMgMzcuNC01MC42IDM3LjQtNjcuMiAwLTIxLjUtOS4yLTM3LTI0LTQ0LjZsMC0yMS40YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAxNzYtNDI0IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNTc2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTEwNCAwIDAtMjcyYzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJ6Il0KICAgIH07CiAgICBmYUJhY3Rlcml1bSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYWN0ZXJpdW0iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTA1YSIsICJNNDA4IDE2YzAtMTMuMy0xMC43LTI0LTI0LTI0UzM2MCAyLjcgMzYwIDE2bDAgMjMuNGMtMTMuOSA1LjMtMjYuOSAxMy41LTM4LjIgMjQuNUwzMDUgNDdjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwcy05LjQgMjQuNiAwIDMzLjlsMTYuOCAxNi44LTMwLjEgMzAuMS0xNi44LTE2LjhjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwcy05LjQgMjQuNiAwIDMzLjlsMTYuOCAxNi44Yy0xMCAxMC0yMCAyMC0zMC4xIDMwLjFMMTc3IDE3NWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWwxNi44IDE2LjgtMzAuMSAzMC4xLTE2LjgtMTYuOGMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWwxNi44IDE2LjhjLTExIDExLjMtMTkuMiAyNC4zLTI0LjUgMzguMkw0OCAzMjhjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTYuMyAwYzEuMyAxOC4zIDcuMSAzNi40IDE3LjQgNTIuNEw3MSA0MzljLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMGwxMC42LTEwLjZjMTYgMTAuMyAzNC4xIDE2LjEgNTIuNCAxNy40bDAgMTYuM2MwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMjMuNGMxMy45LTUuMyAyNi45LTEzLjUgMzguMi0yNC41TDI3MSA0NjVjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC0xNi44LTE2LjggMzAuMS0zMC4xIDE2LjggMTYuOGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTE2LjgtMTYuOGMxMC0xMCAyMC0yMCAzMC4xLTMwLjFMMzk5IDMzN2M5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTE2LjgtMTYuOCAzMC4xLTMwLjEgMTYuOCAxNi44YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtMTYuOC0xNi44YzExLTExLjMgMTkuMi0yNC4zIDI0LjUtMzguMmwyMy40IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE2LjMgMGMtMS4zLTE4LjMtNy4xLTM2LjQtMTcuNC01Mi40TDUwNSA3M2M5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwTDQ2MC40IDQ5LjdjLTE2LTEwLjMtMzQuMS0xNi4xLTUyLjQtMTcuNEw0MDggMTZ6TTE2MCAzNTJhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHpNMjcyIDI0MGEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYVJlY29yZFZpbnlsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJlY29yZC12aW55bCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmOGQ5IiwgIk0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0yNTYtOTZhOTYgOTYgMCAxIDEgMCAxOTIgOTYgOTYgMCAxIDEgMC0xOTJ6bTAgMjQwYTE0NCAxNDQgMCAxIDAgMC0yODggMTQ0IDE0NCAwIDEgMCAwIDI4OHptMC0xMTJhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFGbG9wcHlEaXNrMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmbG9wcHktZGlzayIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyODE5MCwgMTI4NDI2LCAic2F2ZSJdLCAiZjBjNyIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI0Mi43YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDM1MiA1MC43QzM0MCAzOC43IDMyMy43IDMyIDMwNi43IDMyTDY0IDMyem0zMiA5NmMwLTE3LjcgMTQuMy0zMiAzMi0zMmwxNjAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0xNjAgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC02NHpNMjI0IDI4OGE2NCA2NCAwIDEgMSAwIDEyOCA2NCA2NCAwIDEgMSAwLTEyOHoiXQogICAgfTsKICAgIGZhU2F2ZTIgPSBmYUZsb3BweURpc2syOwogICAgZmFUb2lsZXRzUG9ydGFibGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidG9pbGV0cy1wb3J0YWJsZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTg0IiwgIk02NCAwbDk2IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAxNi0yMjQgMCAwLTE2QzAgMjguNyAyOC43IDAgNjQgMHpNMCAxMjhsMjI0IDAgMCAzNjBjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC04LTEyOCAwIDAgOGMwIDEzLjMtMTAuNyAyNC0yNCAyNFMwIDUwMS4zIDAgNDg4TDAgMTI4ek0xMjggMjQ4bDAgNDhjMCAxMy4zIDEwLjcgMjQgMjQgMjRsMjQgMCAwLTk2LTI0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0ek0zNTIgMGw5NiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMTYtMjI0IDAgMC0xNmMwLTM1LjMgMjguNy02NCA2NC02NHpNMjg4IDEyOGwyMjQgMCAwIDM2MGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTgtMTI4IDAgMCA4YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMzYwek00MTYgMjQ4bDAgNDhjMCAxMy4zIDEwLjcgMjQgMjQgMjRsMjQgMCAwLTk2LTI0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0eiJdCiAgICB9OwogICAgZmFPID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm8iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMTFdLCAiNGYiLCAiTTIyNCA5NmExNjAgMTYwIDAgMSAwIDAgMzIwIDE2MCAxNjAgMCAxIDAgMC0zMjB6TTQ0OCAyNTZhMjI0IDIyNCAwIDEgMSAtNDQ4IDAgMjI0IDIyNCAwIDEgMSA0NDggMHoiXQogICAgfTsKICAgIGZhUGFsZXR0ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwYWxldHRlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3OTEyXSwgImY1M2YiLCAiTTUxMiAyNTZjMCAuOSAwIDEuOCAwIDIuNy0uNCAzNi41LTMzLjYgNjEuMy03MC4xIDYxLjNMMzQ0IDMyMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDggMCAzLjQgLjQgNi43IDEgOS45IDIuMSAxMC4yIDYuNSAyMCAxMC44IDI5LjkgNi4xIDEzLjggMTIuMSAyNy41IDEyLjEgNDIgMCAzMS44LTIxLjYgNjAuNy01My40IDYyLTMuNSAuMS03IC4yLTEwLjYgLjItMTQxLjQgMC0yNTYtMTE0LjYtMjU2LTI1NlMxMTQuNiAwIDI1NiAwIDUxMiAxMTQuNiA1MTIgMjU2ek0xMjggMjg4YTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6bTAtOTZhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0ek0yODggOTZhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHptOTYgOTZhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFVbmxvY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidW5sb2NrIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4Mjc1XSwgImYwOWMiLCAiTTEyOCA5NmMwLTM1LjMgMjguNy02NCA2NC02NCAzMS43IDAgNTggMjMgNjMuMSA1My4zIDIuOSAxNy40IDE5LjQgMjkuMiAzNi45IDI2LjNzMjkuMi0xOS40IDI2LjMtMzYuOUMzMDguMSAxNC4xIDI1NS41LTMyIDE5Mi0zMiAxMjEuMy0zMiA2NCAyNS4zIDY0IDk2bDAgNjRjLTM1LjMgMC02NCAyOC43LTY0IDY0TDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI1NiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjI0YzAtMzUuMy0yOC43LTY0LTY0LTY0bC0xOTIgMCAwLTY0eiJdCiAgICB9OwogICAgZmFFYXJMaXN0ZW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZWFyLWxpc3RlbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJhc3Npc3RpdmUtbGlzdGVuaW5nLXN5c3RlbXMiXSwgImYyYTIiLCAiTTM3OS42IC4zYy04LjkgMS4yLTE3LjIgNi4yLTIyLjQgMTQuMS02LjggMTAuNC03IDI0LjEtLjQgMzQuNiA1LjYgOC45IDE1LjUgMTIuNyAyMy44IDE4LjUgNy41IDUuMiAxNy42IDEzLjIgMjcuNyAyNC4yIDIwIDIxLjcgMzkuNSA1NC4zIDM5LjUgMTAwLjMgMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmMwLTY2LTI4LjUtMTEzLjQtNTYuNS0xNDMuNy0xMy45LTE1LjEtMjcuOC0yNi4xLTM4LjMtMzMuMy0xMS03LjYtMjMuNS0xNi42LTM3LjYtMTQuN3pNMjQwIDEyOGMtNTcuNiAwLTEwNS4xIDQzLjYtMTExLjMgOTkuNS0xLjkgMTcuNi0xNy44IDMwLjItMzUuMyAyOC4zcy0zMC4yLTE3LjgtMjguMy0zNS4zYzkuNy04OCA4NC4zLTE1Ni41IDE3NC45LTE1Ni41IDk3LjIgMCAxNzYgNzguOCAxNzYgMTc2IDAgNDYtMTcuNyA4Ny45LTQ2LjYgMTE5LjMtMTIgMTMtMTcuNCAyNC44LTE3LjQgMzQuN2wwIDYuMWMwIDYxLjktNTAuMSAxMTItMTEyIDExMi0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMyYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtNi4xYzAtMzIuOSAxNy40LTU5LjYgMzQuNC03OCAxOC40LTIwIDI5LjYtNDYuNiAyOS42LTc1LjkgMC02MS45LTUwLjEtMTEyLTExMi0xMTJ6TTAgNDgwYTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTE2MC05NmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6TTg2LjYgMzYxLjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zbDY0IDY0YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTY0LTY0ek0yNDAgMjA4Yy0xNy43IDAtMzIgMTQuMy0zMiAzMiAwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGMwLTQ0LjIgMzUuOC04MCA4MC04MHM4MCAzNS44IDgwIDgwYzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtMTcuNy0xNC4zLTMyLTMyLTMyeiJdCiAgICB9OwogICAgZmFBc3Npc3RpdmVMaXN0ZW5pbmdTeXN0ZW1zID0gZmFFYXJMaXN0ZW47CiAgICBmYUNvZGVQdWxsUmVxdWVzdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjb2RlLXB1bGwtcmVxdWVzdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMTNjIiwgIk0zMjggMjRjMC05LjctNS44LTE4LjUtMTQuOC0yMi4yUzI5My45IC4yIDI4NyA3TDIzMSA2M2MtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlsNTYgNTZjNi45IDYuOSAxNy4yIDguOSAyNi4yIDUuMlMzMjggMTQ1LjcgMzI4IDEzNmwwLTI0IDI0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAyMTQuN2MtMjguMyAxMi4zLTQ4IDQwLjUtNDggNzMuMyAwIDQ0LjIgMzUuOCA4MCA4MCA4MHM4MC0zNS44IDgwLTgwYzAtMzIuOC0xOS43LTYxLTQ4LTczLjNMNDQ4IDE0NGMwLTUzLTQzLTk2LTk2LTk2bC0yNCAwIDAtMjR6TTcyIDgwYTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6bTU2IDczLjNjMjguMy0xMi4zIDQ4LTQwLjUgNDgtNzMuMyAwLTQ0LjItMzUuOC04MC04MC04MFMxNiAzNS44IDE2IDgwYzAgMzIuOCAxOS43IDYxIDQ4IDczLjNsMCAyMDUuM2MtMjguMyAxMi4zLTQ4IDQwLjUtNDggNzMuMyAwIDQ0LjIgMzUuOCA4MCA4MCA4MHM4MC0zNS44IDgwLTgwYzAtMzIuOC0xOS43LTYxLTQ4LTczLjNsMC0yMDUuM3pNNzIgNDMyYTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6bTM0NC0yNGEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6Il0KICAgIH07CiAgICBmYUtleSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJrZXkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgyNzNdLCAiZjA4NCIsICJNMzM2IDM1MmM5Ny4yIDAgMTc2LTc4LjggMTc2LTE3NlM0MzMuMiAwIDMzNiAwIDE2MCA3OC44IDE2MCAxNzZjMCAxOC43IDIuOSAzNi44IDguMyA1My43TDcgMzkxYy00LjUgNC41LTcgMTAuNi03IDE3bDAgODBjMCAxMy4zIDEwLjcgMjQgMjQgMjRsODAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTQwIDQwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC00MCA0MCAwYzYuNCAwIDEyLjUtMi41IDE3LTdsMzMuMy0zMy4zYzE2LjkgNS40IDM1IDguMyA1My43IDguM3pNMzc2IDk2YTQwIDQwIDAgMSAxIDAgODAgNDAgNDAgMCAxIDEgMC04MHoiXQogICAgfTsKICAgIGZhU2t1bGwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2t1bGwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgxMjhdLCAiZjU0YyIsICJNNDE2IDQyNy40YzU4LjUtNDQgOTYtMTExLjYgOTYtMTg3LjQgMC0xMzIuNS0xMTQuNi0yNDAtMjU2LTI0MFMwIDEwNy41IDAgMjQwYzAgNzUuOCAzNy41IDE0My40IDk2IDE4Ny40TDk2IDQ2NGMwIDI2LjUgMjEuNSA0OCA0OCA0OGwzMiAwIDAtNDBjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDQwIDY0IDAgMC00MGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgNDAgMzIgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTM2LjZ6TTk2IDI1NmE2NCA2NCAwIDEgMSAxMjggMCA2NCA2NCAwIDEgMSAtMTI4IDB6bTI1Ni02NGE2NCA2NCAwIDEgMSAwIDEyOCA2NCA2NCAwIDEgMSAwLTEyOHoiXQogICAgfTsKICAgIGZhTWFyc1N0cm9rZVVwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hcnMtc3Ryb2tlLXVwIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbOTg5NiwgIm1hcnMtc3Ryb2tlLXYiXSwgImYyMmEiLCAiTTE5MiAyNTZhMTEyIDExMiAwIDEgMCAwIDIyNCAxMTIgMTEyIDAgMSAwIDAtMjI0ek0xNiAzNjhjMC04Ni4zIDYyLjEtMTU4LjEgMTQ0LjEtMTczLjEtLjEtLjktLjEtMS45LS4xLTIuOWwwLTE2LTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMzIgMCAwLTYxLjQtMjggMjIuNGMtMTMuOCAxMS0zMy45IDguOC00NS01cy04LjgtMzMuOSA1LTQ1bDgwLTY0YzExLjctOS4zIDI4LjMtOS4zIDQwIDBsODAgNjRjMTMuOCAxMSAxNiAzMS4yIDUgNDVzLTMxLjIgMTYtNDUgNWwtMjgtMjIuNCAwIDYxLjQgMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIgMCAwIDE2YzAgMSAwIDEuOS0uMSAyLjkgODIgMTUgMTQ0LjEgODYuOCAxNDQuMSAxNzMuMSAwIDk3LjItNzguOCAxNzYtMTc2IDE3NlMxNiA0NjUuMiAxNiAzNjh6Il0KICAgIH07CiAgICBmYU1hcnNTdHJva2VWID0gZmFNYXJzU3Ryb2tlVXA7CiAgICBmYUZpcmVGbGFtZVNpbXBsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaXJlLWZsYW1lLXNpbXBsZSIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJidXJuIl0sICJmNDZhIiwgIk0zNzIuNSAyNTYuNWwtLjctMS45QzMzNy44IDE2MC44IDI4MiA3Ni41IDIwOS4xIDguNWwtMy4zLTNDMjAyLjEgMiAxOTcuMSAwIDE5MiAwcy0xMC4xIDItMTMuOCA1LjVsLTMuMyAzQzEwMiA3Ni41IDQ2LjIgMTYwLjggMTIuMiAyNTQuNmwtLjcgMS45QzMuOSAyNzcuMyAwIDI5OS40IDAgMzIxLjYgMCA0MjYuNyA4Ni44IDUxMiAxOTIgNTEyczE5Mi04NS4zIDE5Mi0xOTAuNGMwLTIyLjItMy45LTQ0LjItMTEuNS02NS4xem0tOTAuOCA0OS41YzQuMSA5LjMgNi4yIDE5LjQgNi4yIDI5LjUgMCA1My00MyA5Ni41LTk2IDk2LjVzLTk2LTQzLjUtOTYtOTYuNWMwLTEwLjEgMi4xLTIwLjMgNi4yLTI5LjVsMS45LTQuM2MxNS44LTM1LjQgMzcuOS02Ny43IDY1LjMtOTUuMWw4LjktOC45YzMuNi0zLjYgOC41LTUuNiAxMy42LTUuNnMxMCAyIDEzLjYgNS42bDguOSA4LjljMjcuNCAyNy40IDQ5LjYgNTkuNyA2NS4zIDk1LjFsMS45IDQuM3oiXQogICAgfTsKICAgIGZhQnVybiA9IGZhRmlyZUZsYW1lU2ltcGxlOwogICAgZmFUcmVlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRyZWUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjc3OTRdLCAiZjFiYiIsICJNMjI0LTMyYzcgMCAxMy43IDMuMSAxOC4zIDguNWwxMzYgMTYwYzYuMSA3LjEgNy40IDE3LjEgMy41IDI1LjZTMzY5LjQgMTc2IDM2MCAxNzZsLTI0LjkgMCA3NS4yIDg4LjVjNi4xIDcuMSA3LjQgMTcuMSAzLjUgMjUuNlM0MDEuNCAzMDQgMzkyIDMwNGwtMzguNSAwIDg4LjggMTA0LjVjNi4xIDcuMSA3LjQgMTcuMSAzLjUgMjUuNlM0MzMuNCA0NDggNDI0IDQ0OGwtMTY4IDAgMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY0LTE2OCAwYy05LjQgMC0xNy45LTUuNC0yMS44LTEzLjlzLTIuNi0xOC41IDMuNS0yNS42TDk0LjUgMzA0IDU2IDMwNGMtOS40IDAtMTcuOS01LjQtMjEuOC0xMy45cy0yLjYtMTguNSAzLjUtMjUuNkwxMTIuOSAxNzYgODggMTc2Yy05LjQgMC0xNy45LTUuNC0yMS44LTEzLjlzLTIuNi0xOC41IDMuNS0yNS42bDEzNi0xNjBDMjEwLjMtMjguOSAyMTctMzIgMjI0LTMyeiJdCiAgICB9OwogICAgZmFTbW9nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNtb2ciLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjc1ZiIsICJNMTc2IDI4OEM5Ni41IDI4OCAzMiAyMjMuNSAzMiAxNDRTOTYuNSAwIDE3NiAwYzI3LjIgMCA1Mi42IDcuNSA3NC4zIDIwLjYgMjAuMS0xMyA0NC0yMC42IDY5LjctMjAuNiA0Ny40IDAgODguNyAyNS43IDExMC45IDY0bDEuMSAwYzYxLjkgMCAxMTIgNTAuMSAxMTIgMTEyIDAgNjAuMy00Ny42IDEwOS40LTEwNy4yIDExMS45LTIyLjYgMjAtNTIuMyAzMi4xLTg0LjggMzIuMS0zMi41IDAtNjIuMS0xMi4xLTg0LjctMzJMMTc2IDI4OHpNNTEyIDM5MmMwIDEzLjMtMTAuNyAyNC0yNCAyNEwyNCA0MTZjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsNDY0IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjR6TTg4IDQ2NGw4MCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC04MCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0em0xNzYgMGwyODggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMjg4IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYVMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicyIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWzExNV0sICI1MyIsICJNMCAxNTcuNUMwIDg4LjIgNTYuMiAzMiAxMjUuNSAzMkwyNzIgMzJjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMTI1LjUgOTZjLTM0IDAtNjEuNSAyNy41LTYxLjUgNjEuNSAwIDMxIDIzLjEgNTcuMiA1My45IDYxTDIxMC4xIDIzMEMyNzIuOSAyMzcuOSAzMjAgMjkxLjIgMzIwIDM1NC41IDMyMCA0MjMuOCAyNjMuOCA0ODAgMTk0LjUgNDgwTDQ4IDQ4MGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxNDYuNSAwYzM0IDAgNjEuNS0yNy41IDYxLjUtNjEuNSAwLTMxLTIzLjEtNTcuMi01My45LTYxTDEwOS45IDI4MkM0Ny4xIDI3NC4xIDAgMjIwLjggMCAxNTcuNXoiXQogICAgfTsKICAgIGZhSmVkaSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJqZWRpIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY2NjkiLCAiTTI0NiAzMTUuN2wtMjEuMi0zMS45Yy0yLjEtMy4yLTEuNy03LjQgMS0xMC4xczYuOS0zLjEgMTAuMS0xbDI5LjUgMTkuN2MyLjEgMS40IDQuOS0uMSA1LTIuNkwyNzkuNyA4Yy4xLTQuNSAzLjgtOCA4LjMtOHM4LjEgMy41IDguMyA4bDkuNCAyODEuOWMuMSAyLjUgMi45IDMuOSA1IDIuNmwyOS41LTE5LjdjMy4yLTIuMSA3LjQtMS43IDEwLjEgMXMzLjEgNi45IDEgMTAuMUwzMzAgMzE1LjdjLTEuMyAxLjktLjIgNC41IDIgNC45bDM3LjYgNy41YzMuNyAuNyA2LjQgNCA2LjQgNy44cy0yLjcgNy4xLTYuNCA3LjhMMzMyIDM1MS40Yy0yLjIgLjQtMy4zIDMtMiA0LjlsMjEuMiAzMS45YzIuMSAzLjIgMS43IDcuNC0xIDEwLjFzLTYuOSAzLjEtMTAuMSAxbC0yNi4zLTE3LjZjLTIuMi0xLjQtNS4xIC4yLTUgMi44bDIuMSA2MS41YzU5LjgtMTAuOCAxMDUuMS02My4xIDEwNS4xLTEyNiAwLTM3LTE1LjctNzAuNC00MC44LTkzLjctNy02LjUtNi41LTE4LjYgMS0yNC40IDM0LTI2LjMgNTUuOC02Ny41IDU1LjgtMTEzLjkgMC0xNi44LTIuOS0zMy04LjItNDgtNC42LTEzIDEwLjItMzAgMjEuNC0yMiA1My41IDM4IDkyLjcgOTQuOCAxMDcuOCAxNjAuNyAuNSAyLjEtLjIgNC4zLTEuNyA1LjlsLTI4LjQgMjguNGMtNCA0LTEuMiAxMC45IDQuNSAxMC45bDI2IDBjMy40IDAgNi4yIDIuNiA2LjMgNiAuMSAzLjMgLjIgNi42IC4yIDEwIDAgMTcuNS0xLjcgMzQuNy00LjggNTEuMy0uMiAxLjItLjkgMi40LTEuNyAzLjNsLTQ2LjUgNDYuNWMtNCA0LTEuMiAxMC45IDQuNSAxMC45bDE0LjYgMGM0LjYgMCA3LjcgNC44IDUuNyA5LTQ0LjUgODkuNS0xMzYuOSAxNTEtMjQzLjcgMTUxUzg4LjggNDUwLjUgNDQuMyAzNjFjLTIuMS00LjIgMS05IDUuNy05bDE0LjYgMGM1LjcgMCA4LjYtNi45IDQuNS0xMC45TDIyLjYgMjk0LjZjLS45LS45LTEuNS0yLTEuNy0zLjMtMy4yLTE2LjYtNC44LTMzLjgtNC44LTUxLjMgMC0zLjMgLjEtNi43IC4yLTEwIC4xLTMuNCAyLjktNiA2LjMtNmwyNiAwYzUuNyAwIDguNi02LjkgNC41LTEwLjlMMjQuNiAxODQuNmMtMS41LTEuNS0yLjItMy44LTEuNy01LjkgMTUuMi02NiA1NC4zLTEyMi44IDEwNy44LTE2MC43IDExLjMtOCAyNiA4LjkgMjEuNCAyMi01LjMgMTUtOC4yIDMxLjItOC4yIDQ4IDAgNDYuMyAyMS45IDg3LjUgNTUuOCAxMTMuOSA3LjUgNS44IDggMTcuOSAxIDI0LjQtMjUuMSAyMy40LTQwLjggNTYuNy00MC44IDkzLjcgMCA2Mi45IDQ1LjQgMTE1LjIgMTA1LjEgMTI2bDIuMS02MS41Yy4xLTIuNi0yLjgtNC4yLTUtMi44bC0yNi4zIDE3LjZjLTMuMiAyLjEtNy40IDEuNy0xMC4xLTFzLTMuMS02LjktMS0xMC4xTDI0NiAzNTYuM2MxLjMtMS45IC4yLTQuNS0yLTQuOWwtMzcuNi03LjVjLTMuNy0uNy02LjQtNC02LjQtNy44czIuNy03LjEgNi40LTcuOGwzNy42LTcuNWMyLjItLjQgMy4zLTMgMi00Ljl6Il0KICAgIH07CiAgICBmYVBlcnNvbkhpa2luZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24taGlraW5nIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImhpa2luZyJdLCAiZjZlYyIsICJNMTkyLTMyYTU2IDU2IDAgMSAxIDAgMTEyIDU2IDU2IDAgMSAxIDAtMTEyek0xMjggMTczLjZjMC0zNCAyNy42LTYxLjYgNjEuNi02MS42IDIwLjMgMCAzOS43IDguMSA1NCAyMi40bDQ4LjIgNDguMmM2IDYgMTQuMSA5LjQgMjIuNiA5LjRsMzcuNSAwYzUuOCAwIDExLjMgMS42IDE2IDQuM2wwLTc2LjNjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDQwMGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTI2OC4zYy00LjcgMi43LTEwLjIgNC4zLTE2IDQuM2wtMzcuNSAwYy0yNS41IDAtNDkuOS0xMC4xLTY3LjktMjguMWwtNi42LTYuNiAwIDEwOS4yIDM0LjUgMjkuNmMxNy43IDE1LjIgMjkuMyAzNi4yIDMyLjYgNTkuM2wxMi42IDg4LjFjMi41IDE3LjUtOS43IDMzLjctMjcuMiAzNi4ycy0zMy43LTkuNy0zNi4yLTI3LjJsLTEyLjYtODguMWMtMS4xLTcuNy01LTE0LjctMTAuOS0xOS44bC03MS40LTYxLjJjLTIxLjMtMTguMi0zMy41LTQ0LjktMzMuNS03Mi45bDAtMTAxem0tNC44IDIwMy43YzIuMyAyLjMgNC43IDQuNCA3LjEgNi41bDQ0LjkgMzguNWMtMy42IDguNC04LjUgMTYuMy0xNC40IDIzLjRMODguNiA1MzIuNWMtMTEuMyAxMy42LTMxLjUgMTUuNC00NS4xIDQuMXMtMTUuNC0zMS41LTQuMS00NS4xbDcyLjMtODYuN2MyLjYtMy4xIDQuNS02LjYgNS44LTEwLjRsNS43LTE3LjF6TTAgMTYwYzAtMzUuMyAyOC43LTY0IDY0LTY0IDE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTI4YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTk2eiJdCiAgICB9OwogICAgZmFIaWtpbmcgPSBmYVBlcnNvbkhpa2luZzsKICAgIGZhQXJyb3dzVXBUb0xpbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3dzLXVwLXRvLWxpbmUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTRjMiIsICJNMzIgMEMxNC4zIDAgMCAxNC4zIDAgMzJTMTQuMyA2NCAzMiA2NGwzODQgMGMxNy43IDAgMzItMTQuMyAzMi0zMlM0MzMuNyAwIDQxNiAwTDMyIDB6bTg2LjYgMTM3LjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwbC02NCA2NGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMEw2NCAyMzcuMyA2NCA0ODBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTI0Mi43IDkuNCA5LjRjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBzMTIuNS0zMi44IDAtNDUuM2wtNjQtNjR6bTI1NiAwYy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMGwtNjQgNjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBsOS40LTkuNCAwIDI0Mi43YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yNDIuNyA5LjQgOS40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTY0LTY0eiJdCiAgICB9OwogICAgZmFNYXJzRG91YmxlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hcnMtZG91YmxlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbOTg5MV0sICJmMjI3IiwgIk0yODggMzJjMC0xNy43IDE0LjMtMzIgMzItMzJMNDQ4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxMjhjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC01MC43LTk1IDk1YzE5LjUgMjguNCAzMSA2Mi43IDMxIDk5LjggMCA5Ny4yLTc4LjggMTc2LTE3NiAxNzZTMCA0MDEuMiAwIDMwNCA3OC44IDEyOCAxNzYgMTI4YzM3IDAgNzEuNCAxMS40IDk5LjggMzFsOTUtOTUtNTAuNyAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnpNMTc2IDQxNmExMTIgMTEyIDAgMSAwIDAtMjI0IDExMiAxMTIgMCAxIDAgMCAyMjR6bTE2MCA2NGMtNi44IDAtMTMuNC0uNC0yMC0xLjEgMjMuNi0xOC45IDQzLjMtNDIuNSA1Ny42LTY5LjQgNDMuMy0xNS41IDc0LjQtNTYuOSA3NC40LTEwNS41IDAtMjUuMi04LjMtNDguNS0yMi40LTY3LjIgNy4xIDIuMSAxNC42IDMuMiAyMi40IDMuMiAxNyAwIDMyLjctNS4zIDQ1LjctMTQuMyAxMS43IDIzLjYgMTguMyA1MC4yIDE4LjMgNzguMyAwIDk3LjItNzguOCAxNzYtMTc2IDE3NnpNNTI4IDE1Ny4zTDUyOCAzMmMwLTExLjQtMi40LTIyLjItNi43LTMyTDYwOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTI4YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNTAuNy00OCA0OHoiXQogICAgfTsKICAgIGZhVGhlcm1vbWV0ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGhlcm1vbWV0ZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjQ5MSIsICJNOTYgMzgyLjFsMC04OC44YzAtMTQuOSA1LjktMjkuMSAxNi40LTM5LjZsMjEuNy0yMS43IDQxIDQxYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNDEtNDEgNDYuMS00Ni4xIDQxIDQxYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNDEtNDEgNDYuMS00Ni4xIDQxIDQxYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNDEtNDEgNy44LTcuOGMxOS40LTE5LjQgNDUuNi0zMC4yIDczLTMwLjIgNTcgMCAxMDMuMiA0Ni4yIDEwMy4yIDEwMy4yIDAgMjcuNC0xMC45IDUzLjYtMzAuMiA3M0wyNTguMyAzOTkuNmMtMTAuNSAxMC41LTI0LjcgMTYuNC0zOS42IDE2LjRsLTg4LjggMC04OSA4OWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBTLTIuMyA0ODAuNCA3IDQ3MWw4OS04OXoiXQogICAgfTsKICAgIGZhUGFpbnRicnVzaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwYWludGJydXNoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4Mzk2LCAicGFpbnQtYnJ1c2giXSwgImYxZmMiLCAiTTQ4MC41IDEwLjNMMjU5LjEgMTU4Yy0yOS4xIDE5LjQtNDcuNiA1MC45LTUwLjYgODUuMyA2Mi4zIDEyLjggMTExLjQgNjEuOSAxMjQuMyAxMjQuMyAzNC41LTMgNjUuOS0yMS41IDg1LjMtNTAuNkw1NjUuNyA5NS41YzYuNy0xMC4xIDEwLjMtMjEuOSAxMC4zLTM0LjEgMC0zMy45LTI3LjUtNjEuNC02MS40LTYxLjQtMTIuMSAwLTI0IDMuNi0zNC4xIDEwLjN6TTI4OCA0MDBjMC02MS45LTUwLjEtMTEyLTExMi0xMTJTNjQgMzM4LjEgNjQgNDAwYzAgMy45IC4yIDcuOCAuNiAxMS42IDEuOCAxNy41LTEwLjIgMzYuNC0yNy44IDM2LjRMMzIgNDQ4Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDE0NCAwYzYxLjkgMCAxMTItNTAuMSAxMTItMTEyeiJdCiAgICB9OwogICAgZmFQYWludEJydXNoID0gZmFQYWludGJydXNoOwogICAgZmFOZXV0ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibmV1dGVyIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbOTkwNl0sICJmMjJjIiwgIk04MCAxNzZhMTEyIDExMiAwIDEgMSAyMjQgMCAxMTIgMTEyIDAgMSAxIC0yMjQgMHpNMjIzLjkgMzQ5LjFDMzA1LjkgMzM0LjEgMzY4IDI2Mi4zIDM2OCAxNzYgMzY4IDc4LjggMjg5LjIgMCAxOTIgMFMxNiA3OC44IDE2IDE3NmMwIDg2LjMgNjIuMSAxNTguMSAxNDQuMSAxNzMuMS0uMSAxLS4xIDEuOS0uMSAyLjlsMCAxNjBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE2MGMwLTEgMC0xLjktLjEtMi45eiJdCiAgICB9OwogICAgZmFTcXVhcmVQaG9uZUZsaXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXBob25lLWZsaXAiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsicGhvbmUtc3F1YXJlLWFsdCJdLCAiZjg3YiIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnptMjMyIDk2LjdsMi44IC44YzMyLjMgOC44IDU5LjkgNDAuMSA1MS44IDc4LjItMTguNSA4Ny41LTg3LjQgMTU2LjMtMTc0LjkgMTc0LjktMzguMSA4LjEtNjkuNC0xOS41LTc4LjItNTEuOGwtLjgtMi44Yy0yLjctOS44IDIuNC0yMC4xIDExLjgtMjRsNDguNy0yMC4zYzguMy0zLjQgMTcuOC0xLjEgMjMuNSA1LjlsMTkuMyAyMy42YzM1LjEtMTcuNCA2My40LTQ2LjYgNzkuNi04Mi40bC0yMi4xLTE4Yy02LjktNS43LTkuMy0xNS4yLTUuOS0yMy41bDIwLjMtNDguN2MzLjktOS40IDE0LjItMTQuNCAyNC0xMS44eiJdCiAgICB9OwogICAgZmFQaG9uZVNxdWFyZUFsdCA9IGZhU3F1YXJlUGhvbmVGbGlwOwogICAgZmFGYWNlR3JpblRvbmd1ZVNxdWludDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1ncmluLXRvbmd1ZS1zcXVpbnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1NDEsICJncmluLXRvbmd1ZS1zcXVpbnQiXSwgImY1OGEiLCAiTTAgMjU2YzAgMTA0LjQgNjIuNSAxOTQuMiAxNTIuMiAyMzQuMS01LjMtMTMtOC4yLTI3LjItOC4yLTQyLjFsMC02MS43Yy0xNi45LTE2LjUtMzAuMS0zNi43LTM4LjMtNTkuMy00LjMtMTEuOCA3LjctMjEuOCAxOS42LTE4LjEgMzkuMiAxMi4yIDgzLjcgMTkuMSAxMzAuNyAxOS4xczkxLjUtNi45IDEzMC43LTE5LjFjMTEuOS0zLjcgMjMuOSA2LjMgMTkuNiAxOC4xLTguMyAyMi42LTIxLjUgNDIuOC0zOC4zIDU5LjNsMCA2MS43YzAgMTQuOS0yLjkgMjkuMS04LjIgNDIuMSA4OS43LTM5LjggMTUyLjItMTI5LjYgMTUyLjItMjM0LjEgMC0xNDEuNC0xMTQuNi0yNTYtMjU2LTI1NlMwIDExNC42IDAgMjU2em0xMjUuOC05MS43Yy02LjItNS4yLTcuNi0xNC4zLTMuMS0yMS4xczEzLjMtOS4yIDIwLjYtNS41bDc5LjYgNDBjNS40IDIuNyA4LjggOC4yIDguOCAxNC4zcy0zLjQgMTEuNi04LjggMTQuM2wtNzkuNiA0MGMtNy4zIDMuNi0xNi4xIDEuMy0yMC42LTUuNXMtMy4xLTE1LjkgMy4xLTIxLjFMMTU5IDE5MiAxMjUuOCAxNjQuM3ptMjYzLjYtMjEuMWM0LjUgNi44IDMuMSAxNS45LTMuMSAyMS4xTDM1MyAxOTIgMzg2LjIgMjE5LjdjNi4yIDUuMiA3LjYgMTQuMyAzLjEgMjEuMXMtMTMuMyA5LjItMjAuNiA1LjVsLTc5LjYtNDBjLTUuNC0yLjctOC44LTguMi04LjgtMTQuM3MzLjQtMTEuNiA4LjgtMTQuM2w3OS42LTQwYzcuMy0zLjYgMTYuMS0xLjMgMjAuNiA1LjV6TTMyMCA0NDhsMC00NS40YzAtMTQuNy0xMS45LTI2LjYtMjYuNi0yNi42bC0yIDBjLTExLjMgMC0yMS4xIDcuOS0yMy42IDE4LjktMi44IDEyLjYtMjAuOCAxMi42LTIzLjYgMC0yLjUtMTEuMS0xMi4zLTE4LjktMjMuNi0xOC45bC0yIDBjLTE0LjcgMC0yNi42IDExLjktMjYuNiAyNi42bDAgNDUuNGMwIDM1LjMgMjguNyA2NCA2NCA2NHM2NC0yOC43IDY0LTY0eiJdCiAgICB9OwogICAgZmFHcmluVG9uZ3VlU3F1aW50MiA9IGZhRmFjZUdyaW5Ub25ndWVTcXVpbnQyOwogICAgZmFDb21tZW50RG9sbGFyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvbW1lbnQtZG9sbGFyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY2NTEiLCAiTTI1NiA0ODBjMTQxLjQgMCAyNTYtMTA3LjUgMjU2LTI0MFMzOTcuNCAwIDI1NiAwIDAgMTA3LjUgMCAyNDBjMCA1NC4zIDE5LjIgMTA0LjMgNTEuNiAxNDQuNUwyLjggNDc2LjhjLTQuOCA5LTMuMyAyMCAzLjYgMjcuNXMxNy44IDkuOCAyNy4xIDUuOGwxMTguNC01MC43QzE4My43IDQ3Mi42IDIxOC45IDQ4MCAyNTYgNDgwem00LTM1MmMxMSAwIDIwIDkgMjAgMjBsMCA0IDggMGMxMSAwIDIwIDkgMjAgMjBzLTkgMjAtMjAgMjBsLTQ3LjUgMGMtNi45IDAtMTIuNSA1LjYtMTIuNSAxMi41IDAgNi4xIDQuNCAxMS4zIDEwLjQgMTIuM2w0MS43IDdjMjUuMyA0LjIgNDMuOSAyNi4xIDQzLjkgNTEuOCAwIDI2LjEtMTkgNDcuNy00NCA1MS44bDAgNC43YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLTQtMjQgMGMtMTEgMC0yMC05LTIwLTIwczktMjAgMjAtMjBsNTUuNSAwYzYuOSAwIDEyLjUtNS42IDEyLjUtMTIuNSAwLTYuMS00LjQtMTEuMy0xMC40LTEyLjNsLTQxLjctN2MtMjUuMy00LjItNDMuOS0yNi4xLTQzLjktNTEuOCAwLTI4LjggMjMuMi01Mi4yIDUyLTUyLjVsMC00YzAtMTEgOS0yMCAyMC0yMHoiXQogICAgfTsKICAgIGZhSGlwcG8gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGlwcG8iLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjk0MzVdLCAiZjZlZCIsICJNNDA3IDQ3YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwbDE3LjIgMTcuMmMxLjktLjEgMy45LS4yIDUuOC0uMmwzMiAwYzExLjIgMCAyMS45IDIuMyAzMS42IDYuNUw1NDMgNTVjOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45TDU2NCAxMDEuOWM3LjYgMTIuMiAxMiAyNi43IDEyIDQyLjEgMCAxMC4yIDcuNCAxOC44IDE2LjcgMjMgMjcuOSAxMi41IDQ3LjMgNDAuNSA0Ny4zIDczIDAgMjYuMi0xMi42IDQ5LjQtMzIgNjRsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTE2LTY0IDAgMCAxNmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTE3LjZjLTExLjgtMi40LTIyLjctNy40LTMyLTE0LjQtMS41LTEuMS0yLjktMi4zLTQuMy0zLjUtMTctMTQuNy0yNy43LTM2LjQtMjcuNy02MC41IDAtOC44LTcuMi0xNi0xNi0xNnMtMTYgNy4yLTE2IDE2YzAgNDQuNyAyNi4yIDgzLjIgNjQgMTAxLjJsMCAxMC44YzAgMTcuNyAxNC4zIDMyIDMyIDMybDMyIDAgMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtNjQgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC03NmMtMTkuOCA3LjctNDEuNCAxMi02NCAxMnMtNDQuMi00LjMtNjQtMTJsMCA3NmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtNjQgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0xMTguOS0xOC4xIDQwLjdjLTUuNCAxMi4xLTE5LjYgMTcuNi0zMS43IDEyLjJTLTMuMyAzNjIuNCAyLjEgMzUwLjNMMjQgMzAwLjljNS4zLTExLjkgOC0yNC43IDgtMzcuNyAwLTEwNy41IDg1LjItMTk1LjIgMTkxLjgtMTk5LjFsLjItLjEgNjQgMGM0MS43IDAgODMuNCAxMi4xIDExNy4yIDI1LjcgMS43LTEuOCAzLjUtMy42IDUuMy01LjJMNDA3IDgxYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXptNzMgMTg1YTI0IDI0IDAgMSAwIC00OCAwIDI0IDI0IDAgMSAwIDQ4IDB6bTg4IDI0YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHpNNDgwIDE0NGExNiAxNiAwIDEgMCAtMzIgMCAxNiAxNiAwIDEgMCAzMiAwem00OCAxNmExNiAxNiAwIDEgMCAwLTMyIDE2IDE2IDAgMSAwIDAgMzJ6Il0KICAgIH07CiAgICBmYUJvd2xGb29kID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvd2wtZm9vZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNGM2IiwgIk0wIDE3NmMwLTM1LjMgMjguNy02NCA2NC02NCAuNSAwIDEuMSAwIDEuNiAwIDcuNC0zNi41IDM5LjctNjQgNzguNC02NCAxNSAwIDI5IDQuMSA0MC45IDExLjIgMTMuMy0yNS43IDQwLjEtNDMuMiA3MS4xLTQzLjJzNTcuOCAxNy42IDcxLjEgNDMuMmMxMi03LjEgMjYtMTEuMiA0MC45LTExLjIgMzguNyAwIDcxIDI3LjUgNzguNCA2NCAuNSAwIDEuMSAwIDEuNiAwIDM1LjMgMCA2NCAyOC43IDY0IDY0IDAgMTEuNy0zLjEgMjIuNi04LjYgMzJMOC42IDIwOEMzLjEgMTk4LjYgMCAxODcuNyAwIDE3NnpNMCAyODMuNEMwIDI2OC4zIDEyLjMgMjU2IDI3LjQgMjU2bDQ1Ny4xIDBjMTUuMSAwIDI3LjQgMTIuMyAyNy40IDI3LjQgMCA3MC41LTQ0LjQgMTMwLjctMTA2LjcgMTU0LjFMNDAzLjUgNDUyYy0yIDE2LTE1LjYgMjgtMzEuOCAyOGwtMjMxLjUgMGMtMTYuMSAwLTI5LjgtMTItMzEuOC0yOGwtMS44LTE0LjRDNDQuNCA0MTQuMSAwIDM1My45IDAgMjgzLjR6Il0KICAgIH07CiAgICBmYVNxdWFyZVZpcnVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS12aXJ1cyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNTc4IiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyem0xNjAgODBjMTMuMyAwIDI0IDEwLjcgMjQgMjQgMCAyMi45IDI3LjcgMzQuNCA0My45IDE4LjIgOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45Yy0xNi4yIDE2LjItNC43IDQzLjkgMTguMiA0My45IDEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0Yy0yMi45IDAtMzQuNCAyNy43LTE4LjIgNDMuOSA5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwYy0xNi4yLTE2LjItNDMuOS00LjctNDMuOSAxOC4yIDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtMjIuOS0yNy43LTM0LjQtNDMuOS0xOC4yLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjljMTYuMi0xNi4yIDQuNy00My45LTE4LjItNDMuOS0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0YzIyLjkgMCAzNC40LTI3LjcgMTguMi00My45LTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGMxNi4yIDE2LjIgNDMuOSA0LjcgNDMuOS0xOC4yIDAtMTMuMyAxMC43LTI0IDI0LTI0ek0xOTIgMjQ4YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHptODggNDBhMjQgMjQgMCAxIDAgLTQ4IDAgMjQgMjQgMCAxIDAgNDggMHoiXQogICAgfTsKICAgIGZhQ2xvdWRTdW5SYWluID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNsb3VkLXN1bi1yYWluIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI3NzgyXSwgImY3NDMiLCAiTTI1NC45IDQ0OC4yYzQuMi0xMi42IDE3LjgtMTkuNCAzMC4zLTE1LjIgMTIuNiA0LjIgMTkuNCAxNy44IDE1LjIgMzAuNGwtMjEuNCA2NC4xYy00LjIgMTIuNi0xNy44IDE5LjQtMzAuNCAxNS4ycy0xOS40LTE3LjgtMTUuMi0zMC4zbDIxLjQtNjQuMnptMTIwIDBjNC4yLTEyLjYgMTcuOC0xOS40IDMwLjMtMTUuMiAxMi42IDQuMiAxOS40IDE3LjggMTUuMiAzMC40bC0yMS40IDY0LjFjLTQuMiAxMi42LTE3LjggMTkuNC0zMC40IDE1LjJzLTE5LjQtMTcuOC0xNS4yLTMwLjNsMjEuNC02NC4yem0xMjAgMGM0LjItMTIuNiAxNy44LTE5LjQgMzAuMy0xNS4yIDEyLjYgNC4yIDE5LjQgMTcuOCAxNS4yIDMwLjRsLTIxLjQgNjQuMWMtNC4yIDEyLjYtMTcuOCAxOS40LTMwLjQgMTUuMnMtMTkuNC0xNy44LTE1LjItMzAuM2wyMS40LTY0LjJ6TTQ0OC4zIDEyOGM0NC4yIDAgODAgMzUuOCA4MCA4MCAwIDcuNS0xLjEgMTQuNy0zIDIxLjUgMjkuOCAxMS42IDUxIDQwLjYgNTEgNzQuNSAwIDQ0LjItMzUuOCA4MC04MCA4MGwtMTkyIDAtOC4yLS40Yy00MC4zLTQuMS03MS44LTM4LjItNzEuOC03OS42IDAtMzkgMjcuOS03MS41IDY0LjktNzguNS0uNS0zLjEtLjktNi4yLS45LTkuNSAwLTMwLjkgMjUuMS01NiA1Ni01NiAxMi40IDAgMjMuOSA0LjEgMzMuMiAxMC45IDEzLjQtMjUuNSA0MC4xLTQyLjkgNzAuOC00Mi45ek0yNDAuMy0zMS44YzUuMyAwIDEwLjMgMi43IDEzLjMgNy4xbDQ3LjMgNzAuNCA4My4zLTE2LjNjNS4yLTEgMTAuNiAuNyAxNC4zIDQuNCAzLjggMy44IDUuNCA5LjIgNC40IDE0LjRsLTguNiA0My44Yy0xMS45IDUuNS0yMi44IDEyLjktMzIuNCAyMS42LTUuNy0xLTExLjctMS41LTE3LjctMS41LTE0LjMgMC0yOCAzLTQwLjQgOC4yLTE2LjktMTUtMzkuMi0yNC4yLTYzLjYtMjQuMi01MyAwLTk2IDQzLTk2IDk2IDAgMzAuOSAxNC42IDU4LjIgMzcuMiA3NS44LTMuNCAxMS41LTUuMiAyMy42LTUuMiAzNi4yIDAgMTMuMiAyIDI1LjkgNS43IDM3LjlsLTIuNC0zLjUtODMuMiAxNi4zYy01LjIgMS0xMC42LS43LTE0LjMtNC40LTMuOC0zLjgtNS40LTkuMi00LjQtMTQuNGwxNi4zLTgzLjMtNzAuNC00Ny40Yy00LjQtMy03LjEtOC03LjEtMTMuMyAwLTUuMyAyLjYtMTAuMyA3LTEzLjJsNzAuNC00Ny40LTE2LjMtODMuMi0uMi0yYy0uMy00LjYgMS4zLTkuMSA0LjYtMTIuNCAzLjgtMy44IDkuMi01LjQgMTQuNC00LjRsODMuMiAxNi4zIDQ3LjMtNzAuNCAxLjItMS42YzMtMy41IDcuNC01LjUgMTIuMS01LjV6bTAgMTc1LjhjOC42IDAgMTYuNiAyLjMgMjMuNiA2LjItOS43IDExLjktMTYuOSAyNS45LTIwLjcgNDEuMy0xNSA4LjEtMjguMiAxOS4yLTM4LjggMzIuMy03LjUtOC41LTEyLjItMTkuNi0xMi4yLTMxLjggMC0yNi41IDIxLjUtNDggNDgtNDh6Il0KICAgIH07CiAgICBmYUFycm93UmlnaHRMb25nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXJpZ2h0LWxvbmciLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsibG9uZy1hcnJvdy1yaWdodCJdLCAiZjE3OCIsICJNNTY2LjYgMjc4LjZjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNsLTEyOC0xMjhjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zTDQ2Ni43IDIyNCAzMiAyMjRjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNDM0LjcgMC03My40IDczLjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBsMTI4LTEyOHoiXQogICAgfTsKICAgIGZhTG9uZ0Fycm93UmlnaHQgPSBmYUFycm93UmlnaHRMb25nOwogICAgZmFCdWlsZGluZ1VuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJ1aWxkaW5nLXVuIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU0ZDkiLCAiTTMyIDY0QzMyIDI4LjcgNjAuNyAwIDk2IDBMMzUyIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyNzItMTEyIDBjLTIwLjkgMC0zOS41IDEwLjEtNTEuMiAyNS42LTgtNi0xOC05LjYtMjguOC05LjYtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCA2NCA2NCAwIDAgNDgtMTQ0IDBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDMyIDY0ek0xNDQgOTZjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHptMTEyIDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6TTE0NCAyMjRjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHptMTEyIDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6TTQyNy40IDM4MC41YzktMi4xIDE4LjMgMi4yIDIyLjUgMTAuNWwyNi4xIDUyLjIgMC00My4zYzAtMTEgOS0yMCAyMC0yMHMyMCA5IDIwIDIwbDAgMTI4YzAgOS4zLTYuNCAxNy4zLTE1LjQgMTkuNXMtMTguMy0yLjItMjIuNS0xMC41TDQ1MiA0ODQuNyA0NTIgNTI4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLTEyOGMwLTkuMyA2LjQtMTcuMyAxNS40LTE5LjV6TTMyNCA0MDBsMCA5NmMwIDYuNiA1LjQgMTIgMTIgMTJzMTItNS40IDEyLTEybDAtOTZjMC0xMSA5LTIwIDIwLTIwczIwIDkgMjAgMjBsMCA5NmMwIDI4LjctMjMuMyA1Mi01MiA1MnMtNTItMjMuMy01Mi01MmwwLTk2YzAtMTEgOS0yMCAyMC0yMHMyMCA5IDIwIDIweiJdCiAgICB9OwogICAgZmFUZW1wZXJhdHVyZUxvdyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0ZW1wZXJhdHVyZS1sb3ciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjc2YiIsICJNOTYgOTZjMC01MyA0My05NiA5Ni05NnM5NiA0MyA5NiA5NmwwIDE2NC43YzI5LjUgMjYuNCA0OCA2NC43IDQ4IDEwNy4zIDAgNzkuNS02NC41IDE0NC0xNDQgMTQ0UzQ4IDQ0Ny41IDQ4IDM2OGMwLTQyLjYgMTguNS04MSA0OC0xMDcuM0w5NiA5NnptOTYgMzM2YzM1LjMgMCA2NC0yOC43IDY0LTY0IDAtMjYuOS0xNi41LTQ5LjktNDAtNTkuM2wwLTI4LjdjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAyOC43Yy0yMy41IDkuNS00MCAzMi41LTQwIDU5LjMgMCAzNS4zIDI4LjcgNjQgNjQgNjR6TTQ2NCA4MGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwek0zNTIgODBhODAgODAgMCAxIDEgMTYwIDAgODAgODAgMCAxIDEgLTE2MCAweiJdCiAgICB9OwogICAgZmFEb29yT3BlbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkb29yLW9wZW4iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjUyYiIsICJNMjg4IDY0bDY0IDAgMCA0MTZjMCAxNy43IDE0LjMgMzIgMzIgMzJsMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwwLTM4NGMwLTM1LjMtMjguNy02NC02NC02NGwtOTYgMCAwIDAtMTYwIDBDNjAuNyAwIDMyIDI4LjcgMzIgNjRsMCAzODRjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMjI0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC00MTZ6TTE2MCAyNTZhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHoiXQogICAgfTsKICAgIGZhQWxpZ25MZWZ0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFsaWduLWxlZnQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjAzNiIsICJNMjg4IDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMyTDMyIDk2QzE0LjMgOTYgMCA4MS43IDAgNjRTMTQuMyAzMiAzMiAzMmwyMjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnptMCAyNTZjMCAxNy43LTE0LjMgMzItMzIgMzJMMzIgMzUyYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDIyNCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMyek0wIDE5MmMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzODQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiAyMjRjLTE3LjcgMC0zMi0xNC4zLTMyLTMyek00NDggNDQ4YzAgMTcuNy0xNC4zIDMyLTMyIDMyTDMyIDQ4MGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwzODQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnoiXQogICAgfTsKICAgIGZhQ2FtZXJhMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYW1lcmEiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MjI1OCwgImNhbWVyYS1hbHQiXSwgImYwMzAiLCAiTTE0OS4xIDY0LjhMMTM4LjcgOTYgNjQgOTZDMjguNyA5NiAwIDEyNC43IDAgMTYwTDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0bC03NC43IDAtMTAuNC0zMS4yQzM1Ni40IDQ1LjIgMzM4LjEgMzIgMzE3LjQgMzJMMTk0LjYgMzJjLTIwLjcgMC0zOSAxMy4yLTQ1LjUgMzIuOHpNMjU2IDE5MmE5NiA5NiAwIDEgMSAwIDE5MiA5NiA5NiAwIDEgMSAwLTE5MnoiXQogICAgfTsKICAgIGZhQ2FtZXJhQWx0MiA9IGZhQ2FtZXJhMjsKICAgIGZhVXNlcnNSYXlzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXJzLXJheXMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU5MyIsICJNMzEtMzNDMjEuNy0yMy42IDIxLjctOC40IDMxIDFMODcgNTdjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45TDY1LTMzYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHpNNjA5LTMzYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMEw1MTkgMjNjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMEw2MDkgMWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXpNNjUgNTQ1bDU2LTU2YzkuNC05LjQgOS40LTI0LjYgMC0zMy45cy0yNC42LTkuNC0zMy45IDBMMzEgNTExYy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDB6bTU0NCAwYzkuNC05LjQgOS40LTI0LjYgMC0zMy45bC01Ni01NmMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWw1NiA1NmM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHpNMzIwIDIwOGE2NCA2NCAwIDEgMCAwLTEyOCA2NCA2NCAwIDEgMCAwIDEyOHptMCAzMmMtNjEuOSAwLTExMiA1MC4xLTExMiAxMTJsMCA4YzAgMTMuMyAxMC43IDI0IDI0IDI0bDE3NiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtOGMwLTYxLjktNTAuMS0xMTItMTEyLTExMnptMjE2LTgwYTU2IDU2IDAgMSAwIC0xMTIgMCA1NiA1NiAwIDEgMCAxMTIgMHpNNDUxLjIgMjYwLjRDNDY5LjQgMjg2LjMgNDgwIDMxNy45IDQ4MCAzNTJsMCA4YzAgOC40LTEuNCAxNi41LTQuMSAyNGw3OC44IDBjMTEuOCAwIDIxLjMtOS42IDIxLjMtMjEuM2wwLTEwLjdjMC01My00My05Ni05Ni05Ni0xMCAwLTE5LjcgMS41LTI4LjggNC40em0tMjYyLjQgMGMtOS4xLTIuOS0xOC44LTQuNC0yOC44LTQuNC01MyAwLTk2IDQzLTk2IDk2bDAgMTAuN2MwIDExLjggOS42IDIxLjMgMjEuMyAyMS4zbDc4LjggMGMtMi43LTcuNS00LjEtMTUuNi00LjEtMjRsMC04YzAtMzQuMSAxMC42LTY1LjcgMjguOC05MS42ek0yMTYgMTYwYTU2IDU2IDAgMSAwIC0xMTIgMCA1NiA1NiAwIDEgMCAxMTIgMHoiXQogICAgfTsKICAgIGZhUmFpbmJvdyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyYWluYm93IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI3NzUyXSwgImY3NWIiLCAiTTMyMCA5NkMxNzguNiA5NiA2NCAyMTAuNiA2NCAzNTJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMlMwIDQzMy43IDAgNDE2bDAtNjRDMCAxNzUuMyAxNDMuMyAzMiAzMjAgMzJTNjQwIDE3NS4zIDY0MCAzNTJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY0QzU3NiAyMTAuNiA0NjEuNCA5NiAzMjAgOTZ6bTAgMTEyYy03OS41IDAtMTQ0IDY0LjUtMTQ0IDE0NGwwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNjRjMC0xMTQuOSA5My4xLTIwOCAyMDgtMjA4czIwOCA5My4xIDIwOCAyMDhsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY0YzAtNzkuNS02NC41LTE0NC0xNDQtMTQ0ek0yODggMzUybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02NGMwLTUzIDQzLTk2IDk2LTk2czk2IDQzIDk2IDk2bDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMnoiXQogICAgfTsKICAgIGZhU2l0ZW1hcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaXRlbWFwIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYwZTgiLCAiTTE5MiA2NGMwLTE3LjcgMTQuMy0zMiAzMi0zMmw2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTggMCAwIDY0IDEyMCAwYzM5LjggMCA3MiAzMi4yIDcyIDcybDAgNTYgOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJsOCAwIDAtNTZjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTEyMCAwIDAgODAgOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJsOCAwIDAtODAtMTIwIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgNTYgOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJsOCAwIDAtNTZjMC0zOS44IDMyLjItNzIgNzItNzJsMTIwIDAgMC02NC04IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjR6Il0KICAgIH07CiAgICBmYUZhY2VHcmluU3RhcnMyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi1zdGFycyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyOTMyMSwgImdyaW4tc3RhcnMiXSwgImY1ODciLCAiTTI1NiA1MTJjMTQxLjQgMCAyNTYtMTE0LjYgMjU2LTI1NiAwLTI0LjQtMy40LTQ4LjEtOS44LTcwLjUgMTguNi0zNi4xLTIuNy04My42LTQ2LjctOTAtNDYuOS01OC4zLTExOC45LTk1LjUtMTk5LjUtOTUuNVMxMDMuNCAzNy4zIDU2LjUgOTUuNWMtNDQgNi40LTY1LjMgNTMuOS00Ni43IDkwLTYuNCAyMi40LTkuOCA0Ni05LjggNzAuNSAwIDE0MS40IDExNC42IDI1NiAyNTYgMjU2ek0zODYuNyAzMjQuOWMxMS45LTMuNyAyMy45IDYuMyAxOS42IDE4LjEtMjIuNCA2MS4zLTgxLjMgMTA1LjEtMTUwLjMgMTA1LjFTMTI4LjEgNDA0LjIgMTA1LjcgMzQyLjljLTQuMy0xMS44IDcuNy0yMS44IDE5LjYtMTguMSAzOS4yIDEyLjIgODMuNyAxOS4xIDEzMC43IDE5LjFzOTEuNS02LjkgMTMwLjctMTkuMXptLTMxLjYtMjMxYzUuMy0xMC43IDIwLjUtMTAuNyAyNS44IDBsMjAuOSA0Mi40IDQ2LjcgNi44YzExLjggMS43IDE2LjUgMTYuMiA4IDI0LjVsLTMzLjggMzMgOCA0Ni42YzIgMTEuNy0xMC4zIDIwLjctMjAuOSAxNS4ybC00MS44LTIyLTQxLjggMjJjLTEwLjUgNS41LTIyLjktMy40LTIwLjktMTUuMmw4LTQ2LjYtMzMuOC0zM2MtOC41LTguMy0zLjgtMjIuOCA4LTI0LjVsNDYuNy02LjggMjAuOS00Mi40em0tMTk4LjIgMGwyMC45IDQyLjQgNDYuNyA2LjhjMTEuOCAxLjcgMTYuNSAxNi4yIDggMjQuNWwtMzMuOCAzMyA4IDQ2LjZjMiAxMS43LTEwLjMgMjAuNy0yMC45IDE1LjJsLTQxLjgtMjItNDEuOCAyMmMtMTAuNSA1LjUtMjIuOS0zLjQtMjAuOS0xNS4ybDgtNDYuNi0zMy44LTMzYy04LjUtOC4zLTMuOC0yMi44IDgtMjQuNWw0Ni43LTYuOCAyMC45LTQyLjRjNS4zLTEwLjcgMjAuNS0xMC43IDI1LjggMHoiXQogICAgfTsKICAgIGZhR3JpblN0YXJzMiA9IGZhRmFjZUdyaW5TdGFyczI7CiAgICBmYVNvcnRVcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzb3J0LXVwIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbInNvcnQtYXNjIl0sICJmMGRlIiwgIk0zMiAyMjRjLTEyLjkgMC0yNC42LTcuOC0yOS42LTE5LjhTLjIgMTc4LjUgOS40IDE2OS40bDE2MC0xNjBjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBsMTYwIDE2MGM5LjIgOS4yIDExLjkgMjIuOSA2LjkgMzQuOVMzNjQuOSAyMjQgMzUyIDIyNEwzMiAyMjR6Il0KICAgIH07CiAgICBmYVNvcnRBc2MgPSBmYVNvcnRVcDsKICAgIGZhRXllMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJleWUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgwNjVdLCAiZjA2ZSIsICJNMjg4IDMyYy04MC44IDAtMTQ1LjUgMzYuOC0xOTIuNiA4MC42LTQ2LjggNDMuNS03OC4xIDk1LjQtOTMgMTMxLjEtMy4zIDcuOS0zLjMgMTYuNyAwIDI0LjYgMTQuOSAzNS43IDQ2LjIgODcuNyA5MyAxMzEuMSA0Ny4xIDQzLjcgMTExLjggODAuNiAxOTIuNiA4MC42czE0NS41LTM2LjggMTkyLjYtODAuNmM0Ni44LTQzLjUgNzguMS05NS40IDkzLTEzMS4xIDMuMy03LjkgMy4zLTE2LjcgMC0yNC42LTE0LjktMzUuNy00Ni4yLTg3LjctOTMtMTMxLjEtNDcuMS00My43LTExMS44LTgwLjYtMTkyLjYtODAuNnpNMTQ0IDI1NmExNDQgMTQ0IDAgMSAxIDI4OCAwIDE0NCAxNDQgMCAxIDEgLTI4OCAwem0xNDQtNjRjMCAzNS4zLTI4LjcgNjQtNjQgNjQtMTEuNSAwLTIyLjMtMy0zMS43LTguNC0xIDEwLjktLjEgMjIuMSAyLjkgMzMuMiAxMy43IDUxLjIgNjYuNCA4MS42IDExNy42IDY3LjlzODEuNi02Ni40IDY3LjktMTE3LjZjLTEyLjItNDUuNy01NS41LTc0LjgtMTAxLjEtNzAuOCA1LjMgOS4zIDguNCAyMC4xIDguNCAzMS43eiJdCiAgICB9OwogICAgZmFDYXJldExlZnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FyZXQtbGVmdCIsCiAgICAgIGljb246IFsyNTYsIDUxMiwgW10sICJmMGQ5IiwgIk03LjcgMjM1LjhjLTEwLjMgMTIuNi05LjUgMzEuMSAyLjIgNDIuOGwxMjggMTI4YzkuMiA5LjIgMjIuOSAxMS45IDM0LjkgNi45czE5LjgtMTYuNiAxOS44LTI5LjZsMC0yNTZjMC0xMi45LTcuOC0yNC42LTE5LjgtMjkuNnMtMjUuNy0yLjItMzQuOSA2LjlsLTEyOCAxMjgtMi4yIDIuNHoiXQogICAgfTsKICAgIGZhQXBwbGVXaG9sZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcHBsZS13aG9sZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyNzgyMiwgMTI3ODIzLCAiYXBwbGUtYWx0Il0sICJmNWQxIiwgIk0yMjQgMTEyYy04LjggMC0xNi03LjItMTYtMTZsMC0xNmMwLTQ0LjIgMzUuOC04MCA4MC04MGwxNiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDE2YzAgNDQuMi0zNS44IDgwLTgwIDgwbC0xNiAwek0wIDI4OGMwLTc2LjMgMzUuNy0xNjAgMTEyLTE2MCAyNy4zIDAgNTkuNyAxMC4zIDgyLjcgMTkuMyAxOC44IDcuMyAzOS45IDcuMyA1OC43IDAgMjIuOS04LjkgNTUuNC0xOS4zIDgyLjctMTkuMyA3Ni4zIDAgMTEyIDgzLjcgMTEyIDE2MCAwIDEyOC04MCAyMjQtMTYwIDIyNC0xNi41IDAtMzguMS02LjYtNTEuNS0xMS4zLTguMS0yLjgtMTYuOS0yLjgtMjUgMC0xMy40IDQuNy0zNSAxMS4zLTUxLjUgMTEuMy04MCAwLTE2MC05Ni0xNjAtMjI0eiJdCiAgICB9OwogICAgZmFBcHBsZUFsdCA9IGZhQXBwbGVXaG9sZTsKICAgIGZhU2Nyb2xsVG9yYWggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2Nyb2xsLXRvcmFoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInRvcmFoIl0sICJmNmEwIiwgIk0wIDQ4QzAgMjEuNSAyMS41IDAgNDggMCA2OC45IDAgODYuNyAxMy40IDkzLjMgMzJsMzg5LjUgMGM2LjYtMTguNiAyNC40LTMyIDQ1LjMtMzIgMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA0MTZjMCAyNi41LTIxLjUgNDgtNDggNDgtMjAuOSAwLTM4LjctMTMuNC00NS4zLTMyTDkzLjMgNDgwYy02LjYgMTguNi0yNC40IDMyLTQ1LjMgMzItMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCA0OHpNMTc3LjkgMzAxYy0xLjIgMi0xLjkgNC4yLTEuOSA2LjYgMCA2LjkgNS42IDEyLjUgMTIuNSAxMi41bDU2LjkgMCAzMC41IDQ5LjJjMi42IDQuMiA3LjIgNi44IDEyLjIgNi44czkuNi0yLjYgMTIuMi02LjhsMzAuNS00OS4yIDU2LjkgMGM2LjkgMCAxMi41LTUuNiAxMi41LTEyLjUgMC0yLjMtLjYtNC42LTEuOS02LjZsLTI3LjgtNDUgMjcuOC00NWMxLjItMiAxLjktNC4yIDEuOS02LjYgMC02LjktNS42LTEyLjUtMTIuNS0xMi41bC01Ni45IDAtMzAuNS00OS4yYy0yLjYtNC4yLTcuMi02LjgtMTIuMi02LjhzLTkuNiAyLjYtMTIuMiA2LjhsLTMwLjUgNDkuMi01Ni45IDBjLTYuOSAwLTEyLjUgNS42LTEyLjUgMTIuNSAwIDIuMyAuNiA0LjYgMS45IDYuNmwyNy44IDQ1LTI3LjggNDV6Il0KICAgIH07CiAgICBmYVRvcmFoID0gZmFTY3JvbGxUb3JhaDsKICAgIGZhSG91c2VMb2NrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLWxvY2siLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTUxMCIsICJNNTI4IDIyNC4xYzQ0LjIgMCA4MCAzNS44IDgwIDgwbDAgNTAuNmMxOC42IDYuNiAzMiAyNC40IDMyIDQ1LjNsMCA5NmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTI4IDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtOTZjMC0yMC45IDEzLjQtMzguNyAzMi00NS4zbDAtNTAuNmMwLTQ0LjIgMzUuOC04MCA4MC04MHpNMjY4LjYgNi41YzEyLjItOS4zIDI5LjctOC43IDQxLjIgMmwxODUgMTcxLjhDNDQwLjIgMTk1IDQwMCAyNDQuOCA0MDAgMzA0bDAgMjQuNGMtMTkuNiAxNy42LTMyIDQzLjEtMzIgNzEuNWwwIDk2YzAgNS41IC41IDEwLjkgMS4zIDE2LjFMMTQ0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0xNzYtMTYgMGMtMTMuMiAwLTI1LTguMS0yOS44LTIwLjNzLTEuNi0yNi4yIDgtMzUuMWwyMjQtMjA4IDIuNC0yek0yNzIgMzIwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDk2IDk2IDAgMC04Ny4zYzAtMTYuNSA3LTMxLjUgMTguNC00Mi4xLTguNy05LTIwLjktMTQuNi0zNC40LTE0LjZsLTMyIDB6bTI1Ni00Ny45Yy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDQ3LjkgNjQgMCAwLTQ3LjljMC0xNy43LTE0LjMtMzItMzItMzJ6Il0KICAgIH07CiAgICBmYUFycm93c0xlZnRSaWdodFRvTGluZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvd3MtbGVmdC1yaWdodC10by1saW5lIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU0YmEiLCAiTTMyIDk2QzE0LjMgOTYgMCAxMTAuMyAwIDEyOEwwIDM4NGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjU2YzAtMTcuNy0xNC4zLTMyLTMyLTMyek0zOTAuNiAzNDIuNmw2NC02NGMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM2wtNjQtNjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zbDkuNCA5LjQtMTMzLjUgMCA5LjQtOS40YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwbC02NCA2NGMtNiA2LTkuNCAxNC4xLTkuNCAyMi42czMuNCAxNi42IDkuNCAyMi42bDY0IDY0YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTkuNC05LjQgMTMzLjUgMC05LjQgOS40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwek01NzYgMTI4YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMjU2YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yNTZ6Il0KICAgIH07CiAgICBmYVRyYXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRyYXNoIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYxZjgiLCAiTTEzNi43IDUuOUwxMjggMzIgMzIgMzJDMTQuMyAzMiAwIDQ2LjMgMCA2NFMxNC4zIDk2IDMyIDk2bDM4NCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC05NiAwLTguNy0yNi4xQzMwNi45LTcuMiAyOTQuNy0xNiAyODAuOS0xNkwxNjcuMS0xNmMtMTMuOCAwLTI2IDguOC0zMC40IDIxLjl6TTQxNiAxNDRMMzIgMTQ0IDUzLjEgNDY3LjFDNTQuNyA0OTIuNCA3NS43IDUxMiAxMDEgNTEyTDM0NyA1MTJjMjUuMyAwIDQ2LjMtMTkuNiA0Ny45LTQ0LjlMNDE2IDE0NHoiXQogICAgfTsKICAgIGZhRmFjZVNhZFRlYXIyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2Utc2FkLXRlYXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1NDYsICJzYWQtdGVhciJdLCAiZjViNCIsICJNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMjcxIDk4YzUuNS0xLjMgMTEuMS0yIDE3LTIgMjQuMSAwIDQ1LjQgMTEuOCA1OC41IDMwIDcuNyAxMC44IDIyLjcgMTMuMiAzMy41IDUuNXMxMy4yLTIyLjcgNS41LTMzLjVjLTIxLjctMzAuMi01Ny4zLTUwLTk3LjUtNTAtMTIuNSAwLTI0LjYgMS45LTM1LjkgNS41IDkuOCAxMi43IDE2LjUgMjcuOSAxOC45IDQ0LjZ6TTE3NiAyNDBhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0em0xOTItMzJhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHpNMTg1LjQgMjkyLjhjLTIuNC0yLjktNS43LTQuOC05LjQtNC44cy03IDEuOS05LjQgNC44Yy02LjUgNy44LTEyLjYgMTYuMS0xOC4zIDI0LjYtOSAxMy40LTIwLjMgMzAuMi0yMC4zIDQ3LjQgMCAyOC4zIDIxLjUgNTEuMiA0OCA1MS4yczQ4LTIyLjkgNDgtNTEuMmMwLTE3LjItMTEuMi0zNC0yMC4zLTQ3LjQtNS43LTguNS0xMS45LTE2LjctMTguMy0yNC42eiJdCiAgICB9OwogICAgZmFTYWRUZWFyMiA9IGZhRmFjZVNhZFRlYXIyOwogICAgZmFGYXggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmF4IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MjI0LCAxMjg0MzldLCAiZjFhYyIsICJNMTYwIDY0bDAgODAgNjQgMCAwLTgwIDE0Ni43IDAgNDUuMyA0NS4zIDAgMzQuNyA2NCAwIDAtMzQuN2MwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0w0MTYgMTguN0M0MDQgNi43IDM4Ny43IDAgMzcwLjcgMEwyMjQgMGMtMzUuMyAwLTY0IDI4LjctNjQgNjR6TTMyIDEyOGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJMMCA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJsNDggMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTI4OGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtNDggMHptNDQ4IDY0bC0zMjAgMCAwIDI1NmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwyODggMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTIyNGMwLTE3LjctMTQuMy0zMi0zMi0zMnpNMjI0IDI4OGEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwem0wIDk2YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6TTMzNiAyNjRhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4ek0zMTIgMzg0YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6TTQyNCAyNjRhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4ek00MDAgMzg0YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6Il0KICAgIH07CiAgICBmYVBlcnNvbkNpcmNsZVBsdXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLWNpcmNsZS1wbHVzIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NDEiLCAiTTI4MCAyNGE1NiA1NiAwIDEgMCAtMTEyIDAgNTYgNTYgMCAxIDAgMTEyIDB6bTI0IDIxMi43TDM0MSAyODYuNmMxMi44LTE3LjUgMjguNS0zMi43IDQ2LjMtNDVsLTU2LjItNzUuN0MzMDYgMTMyIDI2Ni4zIDExMiAyMjQgMTEycy04MiAyMC0xMDcuMiA1My45bC03MC41IDk1Yy0xMC41IDE0LjItNy42IDM0LjIgNi42IDQ0LjhzMzQuMiA3LjYgNDQuOC02LjZMMTQ0IDIzNi43IDE0NCA1MTJjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE2MGMwLTguOCA3LjItMTYgMTYtMTZzMTYgNy4yIDE2IDE2bDAgMTYwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yNzUuM3pNNDk2IDU0NGExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6bTE2LTIwOGwwIDQ4IDQ4IDBjOC44IDAgMTYgNy4yIDE2IDE2cy03LjIgMTYtMTYgMTZsLTQ4IDAgMCA0OGMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTQ4LTQ4IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsNDggMCAwLTQ4YzAtOC44IDcuMi0xNiAxNi0xNnMxNiA3LjIgMTYgMTZ6Il0KICAgIH07CiAgICBmYUhhbXNhID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbXNhIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY2NjUiLCAiTTM0LjYgMjg4TDgwIDI4OGM4LjggMCAxNi03LjIgMTYtMTZMOTYgNzJjMC0yMi4xIDE3LjktNDAgNDAtNDBzNDAgMTcuOSA0MCA0MGwwIDEzMmMwIDExIDkgMjAgMjAgMjBzMjAtOSAyMC0yMGwwLTE2NGMwLTIyLjEgMTcuOS00MCA0MC00MHM0MCAxNy45IDQwIDQwbDAgMTY0YzAgMTEgOSAyMCAyMCAyMHMyMC05IDIwLTIwbDAtMTMyYzAtMjIuMSAxNy45LTQwIDQwLTQwczQwIDE3LjkgNDAgNDBsMCAyMDBjMCA4LjggNy4yIDE2IDE2IDE2bDQ1LjQgMGMxOS4xIDAgMzQuNiAxNS41IDM0LjYgMzQuNiAwIDguNi0zLjIgMTYuOS05IDIzLjNMNDE2LjYgNDQxYy00MS4xIDQ1LjItOTkuNCA3MS0xNjAuNiA3MVMxMzYuNiA0ODYuMiA5NS40IDQ0MUw5IDM0NS45Yy01LjgtNi40LTktMTQuNy05LTIzLjMgMC0xOS4xIDE1LjUtMzQuNiAzNC42LTM0LjZ6TTI1NiAyODhjLTM4LjQgMC03Ni44IDM1LjgtOTAuNiA1MC4yLTMuNiAzLjctNS40IDguNy01LjQgMTMuOHMxLjggMTAuMSA1LjQgMTMuOEMxNzkuMiAzODAuMiAyMTcuNiA0MTYgMjU2IDQxNnM3Ni44LTM1LjggOTAuNi01MC4yYzMuNi0zLjcgNS40LTguNyA1LjQtMTMuOHMtMS44LTEwLjEtNS40LTEzLjhDMzMyLjggMzIzLjggMjk0LjQgMjg4IDI1NiAyODh6bTAgMzJhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFQZXJzb25DaXJjbGVRdWVzdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tY2lyY2xlLXF1ZXN0aW9uIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NDIiLCAiTTI4MCAyNGE1NiA1NiAwIDEgMCAtMTEyIDAgNTYgNTYgMCAxIDAgMTEyIDB6bTI0IDIxMi43TDM0MSAyODYuNmMxMi44LTE3LjUgMjguNS0zMi43IDQ2LjMtNDVsLTU2LjItNzUuN0MzMDYgMTMyIDI2Ni4zIDExMiAyMjQgMTEycy04MiAyMC0xMDcuMiA1My45bC03MC41IDk1Yy0xMC41IDE0LjItNy42IDM0LjIgNi42IDQ0LjhzMzQuMiA3LjYgNDQuOC02LjZMMTQ0IDIzNi43IDE0NCA1MTJjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE2MGMwLTguOCA3LjItMTYgMTYtMTZzMTYgNy4yIDE2IDE2bDAgMTYwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yNzUuM3pNNDk2IDU0NGExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6bTAtMTAwYTIwIDIwIDAgMSAxIDAgNDAgMjAgMjAgMCAxIDEgMC00MHptMC0xMDBjLTExLjYgMC0yMS4zIDguMi0yMy41IDE5LjItMS44IDguNy0xMC4yIDE0LjMtMTguOSAxMi41cy0xNC4zLTEwLjItMTIuNS0xOC45YzUuMi0yNS42IDI3LjgtNDQuOCA1NC45LTQ0LjggMzAuOSAwIDU2IDI1LjEgNTYgNTYgMCAxOS44LTExLjcgMzcuOC0yOS44IDQ1LjlsLTEwLjQgNC42Yy0xLjIgNy43LTcuOCAxMy41LTE1LjggMTMuNS04LjggMC0xNi03LjItMTYtMTYgMC0xMS4yIDYuNi0yMS4zIDE2LjgtMjUuOWwxMi40LTUuNWM2LjYtMi45IDEwLjgtOS40IDEwLjgtMTYuNiAwLTEzLjMtMTAuNy0yNC0yNC0yNHoiXQogICAgfTsKICAgIGZhQ2xpcGJvYXJkQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2xpcGJvYXJkLWNoZWNrIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY0NmMiLCAiTTI1NiAwYzIzLjcgMCA0NC40IDEyLjkgNTUuNCAzMmw4LjYgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDM1MmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsOC42IDBDODMuNiAxMi45IDEwNC4zIDAgMTI4IDBMMjU2IDB6bTI2LjkgMjEyLjZjLTEwLjctNy44LTI1LjctNS40LTMzLjUgNS4zbC04NS42IDExNy43LTI2LjUtMjcuNGMtOS4yLTkuNS0yNC40LTkuOC0zMy45LS42cy05LjggMjQuNC0uNiAzMy45bDQ2LjQgNDhjNC45IDUuMSAxMS44IDcuOCAxOC45IDcuM3MxMy42LTQuMSAxNy44LTkuOEwyODguMiAyNDYuMWM3LjgtMTAuNyA1LjQtMjUuNy01LjMtMzMuNXpNMTM2IDY0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDExMiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0TDEzNiA2NHoiXQogICAgfTsKICAgIGZhU2hhcmVGcm9tU3F1YXJlMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaGFyZS1mcm9tLXNxdWFyZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzYxNTA5LCAic2hhcmUtc3F1YXJlIl0sICJmMTRkIiwgIk0zODQuNSAyNGwwIDcyLTY0IDBjLTc5LjUgMC0xNDQgNjQuNS0xNDQgMTQ0IDAgOTMuNCA4Mi44IDEzNC44IDEwMC42IDE0Mi42IDIuMiAxIDQuNiAxLjQgNy4xIDEuNGwyLjUgMGM5LjggMCAxNy44LTggMTcuOC0xNy44IDAtOC4zLTUuOS0xNS41LTEyLjgtMjAuMy04LjktNi4yLTE5LjItMTguMi0xOS4yLTQwLjUgMC00NSAzNi41LTgxLjUgODEuNS04MS41bDMwLjUgMCAwIDcyYzAgOS43IDUuOCAxOC41IDE0LjggMjIuMnMxOS4zIDEuNyAyNi4yLTUuMmwxMzYtMTM2YzkuNC05LjQgOS40LTI0LjYgMC0zMy45TDQyNS41IDdjLTYuOS02LjktMTcuMi04LjktMjYuMi01LjJTMzg0LjUgMTQuMyAzODQuNSAyNHptLTI3MiA3MmMtNDQuMiAwLTgwIDM1LjgtODAgODBsMCAyNTZjMCA0NC4yIDM1LjggODAgODAgODBsMjU2IDBjNDQuMiAwIDgwLTM1LjggODAtODBsMC0zMmMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMjU2IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTI1NmMwLTguOCA3LjItMTYgMTYtMTZsMTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTYgMHoiXQogICAgfTsKICAgIGZhU2hhcmVTcXVhcmUyID0gZmFTaGFyZUZyb21TcXVhcmUyOwogICAgZmFSZWNlaXB0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJlY2VpcHQiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjk1MzRdLCAiZjU0MyIsICJNMTQgMi4yQzIyLjUtMS43IDMyLjUtLjMgMzkuNiA1LjhMODAgNDAuNCAxMjAuNCA1LjhjOS03LjcgMjIuMy03LjcgMzEuMiAwTDE5MiA0MC40IDIzMi40IDUuOGM5LTcuNyAyMi4yLTcuNyAzMS4yIDBMMzA0IDQwLjQgMzQ0LjQgNS44YzcuMS02LjEgMTcuMS03LjUgMjUuNi0zLjZTMzg0IDE0LjYgMzg0IDI0bDAgNDY0YzAgOS40LTUuNSAxNy45LTE0IDIxLjhzLTE4LjUgMi41LTI1LjYtMy42bC00MC40LTM0LjYtNDAuNCAzNC42Yy05IDcuNy0yMi4yIDcuNy0zMS4yIDBsLTQwLjQtMzQuNi00MC40IDM0LjZjLTkgNy43LTIyLjMgNy43LTMxLjIgMEw4MCA0NzEuNiAzOS42IDUwNi4yYy03LjEgNi4xLTE3LjEgNy41LTI1LjYgMy42UzAgNDk3LjQgMCA0ODhMMCAyNEMwIDE0LjYgNS41IDYuMSAxNCAyLjJ6TTEwNCAxMzZjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTc2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE3NiAwek04MCAzNTJjMCAxMy4zIDEwLjcgMjQgMjQgMjRsMTc2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE3NiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHptMjQtMTIwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDE3NiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xNzYgMHoiXQogICAgfTsKICAgIGZhRXF1YWxzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImVxdWFscyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzYyNzY0XSwgIjNkIiwgIk0zMiAxMjhjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzg0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgMTI4em0wIDE5MmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzODQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwzMiAzMjB6Il0KICAgIH07CiAgICBmYUNoZXZyb25VcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGV2cm9uLXVwIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYwNzciLCAiTTIwMS40IDEwNS40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDE5MiAxOTJjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNzLTMyLjggMTIuNS00NS4zIDBMMjI0IDE3My4zIDU0LjYgMzQyLjZjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwcy0xMi41LTMyLjggMC00NS4zbDE5Mi0xOTJ6Il0KICAgIH07CiAgICBmYVZpcnVzU2xhc2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidmlydXMtc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTA3NSIsICJNNDEtMjQuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTLTIuMy0uMyA3IDkuMWw1MjggNTI4YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtODguNi04OC42YzEuNy0xMi4xLTItMjQuOC0xMS4zLTM0LTMxLjItMzEuMi05LjEtODQuNSAzNS04NC41IDIyLjEgMCA0MC0xNy45IDQwLTQwcy0xNy45LTQwLTQwLTQwYy00NC4xIDAtNjYuMS01My4zLTM1LTg0LjUgMTUuNi0xNS42IDE1LjYtNDAuOSAwLTU2LjZzLTQwLjktMTUuNi01Ni42IDBjLTMxLjIgMzEuMi04NC41IDkuMS04NC41LTM1IDAtMjIuMS0xNy45LTQwLTQwLTQwcy00MCAxNy45LTQwIDQwYzAgNDQuMS01My4zIDY2LjEtODQuNSAzNS05LjMtOS4zLTIyLTEzLTM0LTExLjNMNDEtMjQuOXpNNzIgMjE2Yy0yMi4xIDAtNDAgMTcuOS00MCA0MHMxNy45IDQwIDQwIDQwYzQ0LjEgMCA2Ni4xIDUzLjMgMzUgODQuNS0xNS42IDE1LjYtMTUuNiA0MC45IDAgNTYuNnM0MC45IDE1LjYgNTYuNiAwYzMxLjItMzEuMiA4NC41LTkuMSA4NC41IDM1IDAgMjIuMSAxNy45IDQwIDQwIDQwczQwLTE3LjkgNDAtNDBjMC0yMS40IDEyLjYtMzcuNiAyOS4xLTQ1LjFsLTI0MC0yNDBDMTA5LjYgMjAzLjQgOTMuNCAyMTYgNzIgMjE2eiJdCiAgICB9OwogICAgZmFTbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzbGFzaCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNzE1IiwgIk03LTI1YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwTDU2OSA1MDNjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMEw3IDlDLTIuMy0uNC0yLjMtMTUuNiA3LTI1eiJdCiAgICB9OwogICAgZmFFeHBhbmQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZXhwYW5kIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYwNjUiLCAiTTMyIDMyQzE0LjMgMzIgMCA0Ni4zIDAgNjRsMCA5NmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtNjQgNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwzMiAzMnpNNjQgMzUyYzAtMTcuNy0xNC4zLTMyLTMyLTMyUzAgMzM0LjMgMCAzNTJsMCA5NmMwIDE3LjcgMTQuMyAzMiAzMiAzMmw5NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC02NCAwIDAtNjR6TTMyMCAzMmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmw2NCAwIDAgNjRjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTk2YzAtMTcuNy0xNC4zLTMyLTMyLTMybC05NiAwek00NDggMzUyYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgNjQtNjQgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmw5NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtOTZ6Il0KICAgIH07CiAgICBmYU5vdGVTdGlja3kyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm5vdGUtc3RpY2t5IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbNjIwMjYsICJzdGlja3ktbm90ZSJdLCAiZjI0OSIsICJNNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjEzLjVjMCAxNy02LjcgMzMuMy0xOC43IDQ1LjNMMzIyLjcgNDYxLjNjLTEyIDEyLTI4LjMgMTguNy00NS4zIDE4LjdMNjQgNDgwek0zODkuNSAzMDRMMjk2IDMwNGMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCA5My41IDExNy41LTExNy41eiJdCiAgICB9OwogICAgZmFTdGlja3lOb3RlMiA9IGZhTm90ZVN0aWNreTI7CiAgICBmYVRhYmxlQ29sdW1ucyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWJsZS1jb2x1bW5zIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImNvbHVtbnMiXSwgImYwZGIiLCAiTTAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMzIwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2em02NCA2NGwwIDI1NiAxMjggMCAwLTI1Ni0xMjggMHptMzIwIDBsLTEyOCAwIDAgMjU2IDEyOCAwIDAtMjU2eiJdCiAgICB9OwogICAgZmFDb2x1bW5zID0gZmFUYWJsZUNvbHVtbnM7CiAgICBmYVBlcnNvblNoZWx0ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLXNoZWx0ZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTU0ZiIsICJNMjcxLjkgNC4yYy05LjgtNS42LTIxLjktNS42LTMxLjggMGwtMjI0IDEyOEM2LjIgMTM3LjkgMCAxNDguNSAwIDE2MEwwIDQ4MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMyTDY0IDE3OC42IDI1NiA2OC45IDQ0OCAxNzguNiA0NDggNDgwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zMjBjMC0xMS41LTYuMi0yMi4xLTE2LjEtMjcuOGwtMjI0LTEyOHpNMjU2IDIwOGE0MCA0MCAwIDEgMCAwLTgwIDQwIDQwIDAgMSAwIDAgODB6bS04IDE5MmwxNiAwIDAgODhjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTE3NC41IDI2LjkgNDkuOWM2LjMgMTEuNyAyMC44IDE2IDMyLjUgOS44czE2LTIwLjggOS44LTMyLjVsLTMzLjItNjEuN0MzMjkuNyAyNDUuMSAyOTQuNCAyMjQgMjU2IDIyNHMtNzMuNyAyMS4xLTkxLjkgNTQuOWwtMzMuMiA2MS43Yy02LjMgMTEuNy0xLjkgMjYuMiA5LjggMzIuNXMyNi4yIDEuOSAzMi41LTkuOEwyMDAgMzEzLjUgMjAwIDQ4OGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtODh6Il0KICAgIH07CiAgICBmYUNpcmNsZU5vdGNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1ub3RjaCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMWNlIiwgIk0yMjIuNyAzMi4xYzUgMTYuOS00LjYgMzQuOC0yMS41IDM5LjgtNzkuMyAyMy42LTEzNy4xIDk3LjEtMTM3LjEgMTg0LjEgMCAxMDYgODYgMTkyIDE5MiAxOTJzMTkyLTg2IDE5Mi0xOTJjMC04Ni45LTU3LjgtMTYwLjQtMTM3LjEtMTg0LjEtMTYuOS01LTI2LjYtMjIuOS0yMS41LTM5LjhzMjIuOS0yNi42IDM5LjgtMjEuNUM0MzQuOSA0Mi4xIDUxMiAxNDAgNTEyIDI1NiA1MTIgMzk3LjQgMzk3LjQgNTEyIDI1NiA1MTJTMCAzOTcuNCAwIDI1NmMwLTExNiA3Ny4xLTIxMy45IDE4Mi45LTI0NS40IDE2LjktNSAzNC44IDQuNiAzOS44IDIxLjV6Il0KICAgIH07CiAgICBmYVdhdGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIndhdGVyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY3NzMiLCAiTTQxMC42IDEyNC4xYzIwLjcgMTUuNiA0NiAzMC43IDc0LjIgMzQuNSAxMy4xIDEuOCAyNS4yLTcuNSAyNy0yMC42cy03LjUtMjUuMi0yMC42LTI3Yy0xNS45LTIuMS0zMy4yLTExLjMtNTEuNy0yNS4yLTM4LjQtMjktOTAuNS0yOS0xMjkgMC0yNCAxOC4xLTQwLjcgMjYuMy01NC41IDI2LjNzLTMwLjUtOC4yLTU0LjUtMjYuM2MtMzguNC0yOS05MC41LTI5LTEyOSAwLTE4LjUgMTMuOS0zNS44IDIzLjEtNTEuNyAyNS4yLTEzLjEgMS44LTIyLjQgMTMuOC0yMC42IDI3czEzLjggMjIuNCAyNyAyMC42YzI4LjItMy44IDUzLjYtMTguOSA3NC4yLTM0LjUgMjEuMy0xNi4xIDQ5LjktMTYuMSA3MS4yIDAgMjQuMiAxOC4zIDUyLjMgMzUuOSA4My40IDM1LjlzNTkuMS0xNy43IDgzLjQtMzUuOWMyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMHptMCAxNDRjMjAuNyAxNS42IDQ2IDMwLjcgNzQuMiAzNC41IDEzLjEgMS44IDI1LjItNy41IDI3LTIwLjZzLTcuNS0yNS4yLTIwLjYtMjdjLTE1LjktMi4xLTMzLjItMTEuMy01MS43LTI1LjItMzguNC0yOS05MC41LTI5LTEyOSAwLTI0IDE4LjEtNDAuNyAyNi4zLTU0LjUgMjYuM3MtMzAuNS04LjItNTQuNS0yNi4zYy0zOC40LTI5LTkwLjUtMjktMTI5IDAtMTguNSAxMy45LTM1LjggMjMuMS01MS43IDI1LjItMTMuMSAxLjctMjIuNCAxMy44LTIwLjYgMjdzMTMuOCAyMi40IDI3IDIwLjZjMjguMi0zLjggNTMuNi0xOC45IDc0LjItMzQuNSAyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAyNC4yIDE4LjMgNTIuMyAzNS45IDgzLjQgMzUuOXM1OS4xLTE3LjcgODMuNC0zNS45YzIxLjMtMTYuMSA0OS45LTE2LjEgNzEuMiAwem0tNzEuMiAxNDRjMjEuMy0xNi4xIDQ5LjktMTYuMSA3MS4yIDAgMjAuNyAxNS42IDQ2IDMwLjcgNzQuMiAzNC41IDEzLjEgMS44IDI1LjItNy41IDI3LTIwLjZzLTcuNS0yNS4yLTIwLjYtMjdjLTE1LjktMi4xLTMzLjItMTEuMy01MS43LTI1LjItMzguNC0yOS05MC41LTI5LTEyOSAwLTI0IDE4LjEtNDAuNyAyNi4zLTU0LjUgMjYuM3MtMzAuNS04LjItNTQuNS0yNi4zYy0zOC40LTI5LTkwLjUtMjktMTI5IDAtMTguNSAxMy45LTM1LjggMjMuMS01MS43IDI1LjItMTMuMSAxLjgtMjIuNCAxMy44LTIwLjYgMjdzMTMuOCAyMi40IDI3IDIwLjZjMjguMi0zLjggNTMuNi0xOC45IDc0LjItMzQuNSAyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAyNC4yIDE4LjMgNTIuMyAzNS45IDgzLjQgMzUuOXM1OS4xLTE3LjcgODMuNC0zNS45eiJdCiAgICB9OwogICAgZmFEZWxldGVMZWZ0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRlbGV0ZS1sZWZ0IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbOTAwMywgImJhY2tzcGFjZSJdLCAiZjU1YSIsICJNNTc2IDEyOGMwLTM1LjMtMjguNy02NC02NC02NEwyMDUuMyA2NGMtMTcgMC0zMy4zIDYuNy00NS4zIDE4LjdMOS40IDIzMy40Yy02IDYtOS40IDE0LjEtOS40IDIyLjZzMy40IDE2LjYgOS40IDIyLjZMMTYwIDQyOS4zYzEyIDEyIDI4LjMgMTguNyA0NS4zIDE4LjdMNTEyIDQ0OGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI1NnpNMjg0LjEgMTg4LjFjOS40LTkuNCAyNC42LTkuNCAzMy45IDBsMzMuOSAzMy45IDMzLjktMzMuOWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjlsLTMzLjkgMzMuOSAzMy45IDMzLjljOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtMzMuOS0zMy45LTMzLjkgMzMuOWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWwzMy45LTMzLjktMzMuOS0zMy45Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXoiXQogICAgfTsKICAgIGZhQmFja3NwYWNlID0gZmFEZWxldGVMZWZ0OwogICAgZmFCcm9vbUJhbGwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnJvb20tYmFsbCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJxdWlkZGl0Y2giLCAicXVpZGRpdGNoLWJyb29tLWJhbGwiXSwgImY0NTgiLCAiTTQ5NiA1NDRhODAgODAgMCAxIDEgMC0xNjAgODAgODAgMCAxIDEgMCAxNjB6TTEwNi44IDI3Ny4yYzMwLjYtMzAuNiA3My4xLTQ1LjkgMTE1LjgtNDIuMkwzNDEgMzUzLjNjMy43IDQyLjgtMTEuNiA4NS4yLTQyLjIgMTE1LjktMjcuNCAyNy40LTY0LjYgNDIuOC0xMDMuMyA0Mi44TDIyLjEgNTEyYy0xMi4yIDAtMjIuMS05LjktMjIuMS0yMi4xIDAtNi4zIDIuNy0xMi4zIDcuMy0xNi41TDEzMy43IDM1OS43YzQuMi0zLjctLjQtMTAuNC01LjQtNy45TDc3LjIgMzc3LjRjLTYuMSAzLTEzLjItMS40LTEzLjItOC4yIDAtMzEuNSAxMi41LTYxLjggMzQuOC04NGw4LTh6bTQxNy0yNzBjMTIuNi0xMC4zIDMxLjEtOS41IDQyLjggMi4yczEyLjQgMzAuMiAyLjIgNDIuOGwtMi4yIDIuNC0xOTIgMTkyIDM0LjggMzQuN2M0LjIgNC4yIDYuNiAxMCA2LjYgMTYgMCAxMi41LTEwLjEgMjIuNi0yMi42IDIyLjZsLTI5LjEgMC0xMDguMy0xMDguMyAwLTI5LjFjMC0xMi41IDEwLjEtMjIuNiAyMi42LTIyLjYgNiAwIDExLjggMi40IDE2IDYuNmwzNC44IDM0LjcgMTkyLTE5MiAyLjQtMi4yeiJdCiAgICB9OwogICAgZmFRdWlkZGl0Y2ggPSBmYUJyb29tQmFsbDsKICAgIGZhUXVpZGRpdGNoQnJvb21CYWxsID0gZmFCcm9vbUJhbGw7CiAgICBmYUogPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaiIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWzEwNl0sICI0YSIsICJNMjg4IDMyYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMjU2YzAgODguNC03MS42IDE2MC0xNjAgMTYwUzAgNDA4LjQgMCAzMjBsMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMzJjMCA1MyA0MyA5NiA5NiA5NnM5Ni00MyA5Ni05NmwwLTI1NmMwLTE3LjcgMTQuMy0zMiAzMi0zMnoiXQogICAgfTsKICAgIGZhU2h1dHRsZVNwYWNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNodXR0bGUtc3BhY2UiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsic3BhY2Utc2h1dHRsZSJdLCAiZjE5NyIsICJNMCAzNjhsMCA2NGMwIDI2LjUgMjEuNSA0OCA0OCA0OGw1MCAwYzQwLjYgMCA4MC40LTExIDExNS4yLTMxLjlsMTMzLjUtODAuMS05My4zIDAtNjQuOSAzOC45Yy0xNCA4LjQtMjguOSAxNC43LTQ0LjUgMTlsMC02Ni40YzkuNy01LjYgMTcuOC0xMy43IDIzLjQtMjMuNGwxOTguOCAwYzY3LjEgMCAxMjcuOC0yMC42IDE3MC4zLTcwLjYgNC42LTUuNCA0LjYtMTMuMyAwLTE4LjgtNDIuNS01MC4xLTEwMy4yLTcwLjYtMTcwLjMtNzAuNmwtMTk4LjggMGMtNS42LTkuNy0xMy43LTE3LjgtMjMuNC0yMy40bDAtNjYuNGMxNS42IDQuMiAzMC42IDEwLjYgNDQuNSAxOWw2NC45IDM4LjkgOTMuMyAwLTEzMy41LTgwLjFDMTc4LjQgNDMgMTM4LjYgMzIgOTggMzJMNDggMzJDMjEuNSAzMiAwIDUzLjUgMCA4MEwwIDM2OHptOTYgMGwwIDY0LTQ4IDAgMC02NCA0OCAwek05NiA4MGwwIDY0LTQ4IDAgMC02NCA0OCAwek00MTYgMjI0YzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNnMtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2eiJdCiAgICB9OwogICAgZmFTcGFjZVNodXR0bGUgPSBmYVNodXR0bGVTcGFjZTsKICAgIGZhWWluWWFuZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ5aW4teWFuZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzk3NzVdLCAiZjZhZCIsICJNMjI0IDE2MGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0zMiAzNTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyem0wLTQ0OGM1MyAwIDk2IDQzIDk2IDk2cy00MyA5Ni05NiA5Ni05NiA0My05NiA5NiA0MyA5NiA5NiA5NkMxNTAgNDQ4IDY0IDM2MiA2NCAyNTZTMTUwIDY0IDI1NiA2NHpNMjI0IDM1MmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAweiJdCiAgICB9OwogICAgZmFTdG9wID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN0b3AiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs5MjA5XSwgImYwNGQiLCAiTTY0IDMybDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMnoiXQogICAgfTsKICAgIGZhVHJvd2VsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRyb3dlbCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTg5IiwgIk00MDcuOSAxODEuNEwyNzcuMyAzMTIgMzQyLjYgMzc3LjRjNy45IDcuOSAxMS4xIDE5LjQgOC40IDMwLjNzLTEwLjggMTkuNi0yMS41IDIyLjlsLTI1NiA4MGMtMTEuNCAzLjUtMjMuOCAuNS0zMi4yLTcuOXMtMTEuNS0yMC44LTcuOS0zMi4ybDgwLTI1NmMzLjMtMTAuNyAxMi0xOC45IDIyLjktMjEuNXMyMi40IC41IDMwLjMgOC40TDIzMiAyNjYuNyAzNjIuNiAxMzYuMWMtMTQuMy0xNC42LTE0LjItMzggLjMtNTIuNWw5NS40LTk1LjRjMjYuOS0yNi45IDcwLjUtMjYuOSA5Ny41IDBzMjYuOSA3MC41IDAgOTcuNWwtOTUuNCA5NS40Yy0xNC41IDE0LjUtMzcuOSAxNC42LTUyLjUgLjN6Il0KICAgIH07CiAgICBmYUhhbmRCYWNrRmlzdDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1iYWNrLWZpc3QiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsiaGFuZC1yb2NrIl0sICJmMjU1IiwgIk03LjQgMjUzLjZDMi42IDI0NS45IDAgMjM3LjEgMCAyMjhsMC0zNmMwLTI2LjUgMjEuNS00OCA0OC00OGwxNiAwIDAtODBjMC0yNi41IDIxLjUtNDggNDgtNDggMTcuMyAwIDMyLjQgOS4xIDQwLjkgMjIuOCA0LjMtMjIuMSAyMy44LTM4LjggNDcuMS0zOC44IDIzLjQgMCA0Mi45IDE2LjggNDcuMSAzOC45IDcuMy00LjQgMTUuOC02LjkgMjQuOS02LjkgMjIuMSAwIDQwLjggMTUgNDYuMyAzNS40IDUuNS0yLjIgMTEuNC0zLjQgMTcuNy0zLjQgMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA5Ni45YzAgOS45LTIuMyAxOS43LTYuOCAyOC42bC0zOS42IDc5LjFjLTEwLjggMjEuNy0zMyAzNS40LTU3LjIgMzUuNEw5NiAzNTJjLTE2LjUgMC0zMS44LTguNC00MC42LTIyLjRsLTQ4LTc2ek0zMiA0ODBsMC00OGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwyNTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDQ4YzAgMTcuNy0xNC4zIDMyLTMyIDMyTDY0IDUxMmMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6Il0KICAgIH07CiAgICBmYUhhbmRSb2NrMiA9IGZhSGFuZEJhY2tGaXN0MjsKICAgIGZhVGVtcGVyYXR1cmVIaWdoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRlbXBlcmF0dXJlLWhpZ2giLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjc2OSIsICJNOTYgOTZjMC01MyA0My05NiA5Ni05NnM5NiA0MyA5NiA5NmwwIDE2NC43YzI5LjUgMjYuNCA0OCA2NC43IDQ4IDEwNy4zIDAgNzkuNS02NC41IDE0NC0xNDQgMTQ0UzQ4IDQ0Ny41IDQ4IDM2OGMwLTQyLjYgMTguNS04MSA0OC0xMDcuM0w5NiA5NnptOTYgMzM2YzM1LjMgMCA2NC0yOC43IDY0LTY0IDAtMjYuOS0xNi41LTQ5LjktNDAtNTkuM0wyMTYgOTZjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAyMTIuN2MtMjMuNSA5LjUtNDAgMzIuNS00MCA1OS4zIDAgMzUuMyAyOC43IDY0IDY0IDY0ek00NjQgODBhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHpNMzUyIDgwYTgwIDgwIDAgMSAxIDE2MCAwIDgwIDgwIDAgMSAxIC0xNjAgMHoiXQogICAgfTsKICAgIGZhR3JlYXRlclRoYW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ3JlYXRlci10aGFuIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjI3NjldLCAiM2UiLCAiTTM0LjkgNTAuNmMtNy40IDE2LS40IDM1LjEgMTUuNiA0Mi41TDQwMy42IDI1NiA1MC42IDQxOWMtMTYgNy40LTIzLjEgMjYuNC0xNS42IDQyLjVzMjYuNCAyMyA0Mi41IDE1LjZsNDE2LTE5MmMxMS4zLTUuMiAxOC42LTE2LjYgMTguNi0yOS4xcy03LjMtMjMuOC0xOC42LTI5LjFMNzcuNCAzNWMtMTYtNy40LTM1LjEtLjQtNDIuNSAxNS42eiJdCiAgICB9OwogICAgZmFDcnV0Y2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY3J1dGNoIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY3ZjciLCAiTTI5Ny40IDkuNGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMGwxNjAgMTYwYzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zcy0zMi44IDEyLjUtNDUuMyAwbC0xLjQtMS40LTE1OC42IDE1OC42Yy0xOCAxOC00Mi40IDI4LjEtNjcuOSAyOC4xbC01OSAwYy04LjUgMC0xNi42IDMuNC0yMi42IDkuNC02MS43IDYxLjctOTIuOCA5Mi44LTkzLjMgOTMuMy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM2wxNi0xNiAwIDAgNzcuMy03Ny4zYzYtNiA5LjQtMTQuMSA5LjQtMjIuNmwwLTU5YzAtMjUuNSAxMC4xLTQ5LjkgMjguMS02Ny45TDI5OC43IDU2IDI5Ny40IDU0LjZjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zek0zNDQgMTAxLjNMMjYxLjMgMTg0IDMyOCAyNTAuNyA0MTAuNyAxNjggMzQ0IDEwMS4zem0tMTI4IDEyOGwtMzAuNiAzMC42Yy02IDYtOS40IDE0LjEtOS40IDIyLjZsMCA1My41IDUzLjUgMGM4LjUgMCAxNi42LTMuNCAyMi42LTkuNEwyODIuNyAyOTYgMjE2IDIyOS4zeiJdCiAgICB9OwogICAgZmFTZXB0YWdvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzZXB0YWdvbiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJoZXB0YWdvbiJdLCAiZTgyMCIsICJNMjY3LjQtMzEuNWMxNS45LTUuNSAzMy41LTQuNiA0OC44IDIuN2wxNzIuNCA4MyA2LjMgMy41YzE0LjIgOSAyNC41IDIzLjMgMjguMyAzOS45bDQyLjYgMTg2LjUgMS4yIDcuMmMxLjYgMTQuMy0xLjcgMjguOC05LjQgNDEuMWwtNC4yIDUuOS0xMTkuMyAxNDkuNmMtMTIuMSAxNS4yLTMwLjYgMjQuMS01MCAyNC4xbC0xOTEuMyAwYy0xOS41IDAtMzcuOS04LjktNTAtMjQuMUwyMy41IDMzOC40Yy0xMi4xLTE1LjItMTYuNy0zNS4yLTEyLjMtNTQuMmw0Mi42LTE4Ni41IDItN2M1LjYtMTUuOSAxNy4yLTI5IDMyLjYtMzYuNGwxNzIuNC04MyA2LjctMi43eiJdCiAgICB9OwogICAgZmFIZXB0YWdvbiA9IGZhU2VwdGFnb247CiAgICBmYVN0cmVldFZpZXcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3RyZWV0LXZpZXciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjIxZCIsICJNMjU2IDBhNjQgNjQgMCAxIDEgMCAxMjggNjQgNjQgMCAxIDEgMC0xMjh6TTIyNCAxNjBsNjQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDQ4YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0xLjggMC0xMS4xIDk5LjVjLTEuOCAxNi4yLTE1LjUgMjguNS0zMS44IDI4LjVsLTM4LjcgMGMtMTYuMyAwLTMwLTEyLjMtMzEuOC0yOC41bC0xMS4xLTk5LjUtMS44IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNDhjMC0zNS4zIDI4LjctNjQgNjQtNjR6TTQxMi40IDQwMC4yYy0xNi4xLTQuMi0zNC44LTcuNi01NS40LTEwLjJsNS4zLTQ3LjdjMjIuNyAyLjkgNDMuNyA2LjcgNjIuMSAxMS41IDIyLjQgNS44IDQyLjYgMTMuMyA1Ny44IDIzLjMgMTQuNyA5LjYgMjkuOCAyNC45IDI5LjggNDdzLTE1LjEgMzcuNC0yOS44IDQ3Yy0xNS4yIDkuOS0zNS41IDE3LjUtNTcuOCAyMy4zLTQ1LjEgMTEuNy0xMDUuMyAxNy44LTE2OC40IDE3LjhzLTEyMy4zLTYuMS0xNjguNC0xNy44QzY1LjIgNDg4LjQgNDUgNDgwLjkgMjkuOCA0NzEgMTUuMSA0NjEuNCAwIDQ0Ni4xIDAgNDI0czE1LjEtMzcuNCAyOS44LTQ3YzE1LjItOS45IDM1LjUtMTcuNSA1Ny44LTIzLjMgMTguNS00LjggMzkuNS04LjYgNjIuMS0xMS41TDE1NSAzOTBjLTIwLjYgMi42LTM5LjMgNi4xLTU1LjQgMTAuMi01Ni42IDE0LjYtNTYuNiAzMi45IDAgNDcuNSAzOS45IDEwLjMgOTUuOCAxNi4yIDE1Ni40IDE2LjJzMTE2LjUtNS45IDE1Ni40LTE2LjJjNTYuNi0xNC42IDU2LjYtMzIuOSAwLTQ3LjV6Il0KICAgIH07CiAgICBmYVdhdmVTcXVhcmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid2F2ZS1zcXVhcmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjgzZSIsICJNNjQgOTZjMC0xNy43IDE0LjMtMzIgMzItMzJsMTYwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAyODggOTYgMCAwLTEyOGMwLTE3LjcgMTQuMy0zMiAzMi0zMmw2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0zMiAwIDAgMTI4YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0xNjAgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0yODgtOTYgMCAwIDEyOGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtNjQgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwzMiAwIDAtMTI4eiJdCiAgICB9OwogICAgZmFBbmdsZUxlZnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYW5nbGUtbGVmdCIsCiAgICAgIGljb246IFsyNTYsIDUxMiwgWzgyNDldLCAiZjEwNCIsICJNOS40IDIzMy40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM2wxNjAgMTYwYzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNMNzcuMyAyNTYgMjE0LjYgMTE4LjZjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBsLTE2MCAxNjB6Il0KICAgIH07CiAgICBmYVNjcmV3ZHJpdmVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNjcmV3ZHJpdmVyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI5NjkxXSwgImY1NGEiLCAiTTM1Mi4xIDE0Ni43bDAtNDkuNmMwLTEwLjcgNS4zLTIwLjcgMTQuMi0yNi42TDQ4NS4yLTguN2M2LjMtNC4yIDE0LjgtMy40IDIwLjIgMmw0NS40IDQ1LjVjNS40IDUuNCA2LjIgMTMuOCAyIDIwLjJMNDczLjYgMTc3LjhjLTUuOSA4LjktMTUuOSAxNC4yLTI2LjYgMTQuMmwtNDkuNiAwLTkwLjcgOTAuN2MxNSAzMy4zIDguOSA3My45LTE4LjUgMTAxLjNMMTYyLjEgNTEwLjFjLTE4LjcgMTguNy00OS4xIDE4LjctNjcuOSAwTDM0LjEgNDQ5LjljLTE4LjctMTguNy0xOC43LTQ5LjEgMC02Ny45TDE2MC4xIDI1NmMyNy40LTI3LjQgNjcuOS0zMy42IDEwMS4zLTE4LjVsOTAuNy05MC43eiJdCiAgICB9OwogICAgZmFUcmFjdG9yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRyYWN0b3IiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjg2NjhdLCAiZjcyMiIsICJNMTYwIDk2bDAgOTYgMTMzLjQgMC01Ny42LTk2LTc1LjggMHpNOTYgMjIzTDk2IDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMybDEwNy44IDBjMjIuNSAwIDQzLjMgMTEuOCA1NC45IDMxLjFsNzcuNCAxMjguOSA2NCAwIDAtNzJjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDcyIDQ4IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA0MS41YzAgMTQuMi02LjMgMjcuOC0xNy4zIDM2LjlsLTM1IDI5LjJjMjYuNSAxNS4yIDQ0LjMgNDMuNyA0NC4zIDc2LjQgMCA0OC42LTM5LjQgODgtODggODhzLTg4LTM5LjQtODgtODhjMC0xNC40IDMuNS0yOCA5LjYtNDBsLTEwMS4yIDBjLTMgMTMuNC03LjkgMjYtMTQuNCAzNy43IDcuNyA5LjQgNy4yIDIzLjQtMS42IDMyLjJsLTIyLjYgMjIuNmMtOC44IDguOC0yMi43IDkuMy0zMi4yIDEuNi05LjMgNS4yLTE5LjMgOS4zLTI5LjggMTIuMy0xLjIgMTIuMS0xMS40IDIxLjYtMjMuOSAyMS42bC0zMiAwYy0xMi40IDAtMjIuNy05LjUtMjMuOS0yMS42LTEwLjUtMy0yMC40LTcuMi0yOS44LTEyLjMtOS40IDcuNy0yMy40IDcuMi0zMi4yLTEuNkwzNS41IDQ1My44Yy04LjgtOC44LTkuMy0yMi43LTEuNi0zMi4yLTUuMi05LjMtOS4zLTE5LjMtMTIuMy0yOS44LTEyLjEtMS4yLTIxLjYtMTEuNC0yMS42LTIzLjlsMC0zMmMwLTEyLjQgOS41LTIyLjcgMjEuNi0yMy45IDMtMTAuNSA3LjItMjAuNCAxMi4zLTI5LjgtNy43LTkuNC03LjItMjMuNCAxLjYtMzIuMmwyMi42LTIyLjZjOC44LTguOCAyMi43LTkuMyAzMi4yLTEuNiAxLjktMSAzLjctMiA1LjctM3ptNjQgNjVhNjQgNjQgMCAxIDAgMCAxMjggNjQgNjQgMCAxIDAgMC0xMjh6TTQ0MCA0MjRhNDAgNDAgMCAxIDAgODAgMCA0MCA0MCAwIDEgMCAtODAgMHoiXQogICAgfTsKICAgIGZhQnJpZGdlQ2lyY2xlWG1hcmsgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnJpZGdlLWNpcmNsZS14bWFyayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNGNiIiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0UzE0LjMgOTYgMzIgOTZsOCAwIDAgNjQtNDAgMCAwIDExMmMzNy42IDkuNCA2NCA0My4yIDY0IDgybDAgOTRjMCAxNy43IDE0LjMgMzIgMzIgMzJsMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTY0YzAtNTMgNDMtOTYgOTYtOTYgNi40IDAgMTIuNyAuNiAxOC43IDEuOCAzNC43LTQ5LjUgOTIuMi04MS44IDE1Ny4zLTgxLjggMjguNiAwIDU1LjYgNi4yIDgwIDE3LjRsMC02NS40LTQwIDAgMC02NCA4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgMzJ6TTQyNCA5NmwwIDY0LTgwIDAgMC02NCA4MCAwek0yOTYgOTZsMCA2NC04MCAwIDAtNjQgODAgMHpNODggOTZsODAgMCAwIDY0LTgwIDAgMC02NHpNNDMyIDU0NGExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6bTU5LjMtMTgwLjdsLTM2LjcgMzYuNyAzNi43IDM2LjdjNi4yIDYuMiA2LjIgMTYuNCAwIDIyLjZzLTE2LjQgNi4yLTIyLjYgMGwtMzYuNy0zNi43LTM2LjcgMzYuN2MtNi4yIDYuMi0xNi40IDYuMi0yMi42IDBzLTYuMi0xNi40IDAtMjIuNmwzNi43LTM2LjctMzYuNy0zNi43Yy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBsMzYuNyAzNi43IDM2LjctMzYuN2M2LjItNi4yIDE2LjQtNi4yIDIyLjYgMHM2LjIgMTYuNCAwIDIyLjZ6Il0KICAgIH07CiAgICBmYVZpYWxzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZpYWxzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0OTMiLCAiTTMyIDBDMTQuMyAwIDAgMTQuMyAwIDMyUzE0LjMgNjQgMzIgNjRsMCAzNTJjMCA1MyA0MyA5NiA5NiA5NnM5Ni00MyA5Ni05NmwwLTM1MiA2NCAwIDAgMzUyYzAgNTMgNDMgOTYgOTYgOTZzOTYtNDMgOTYtOTZsMC0zNTJjMTcuNyAwIDMyLTE0LjMgMzItMzJTNDk3LjcgMCA0ODAgMEwzMiAwek0xNjAgNjRsMCAxMjgtNjQgMCAwLTEyOCA2NCAwem0yNTYgMGwwIDEyOC02NCAwIDAtMTI4IDY0IDB6Il0KICAgIH07CiAgICBmYVN0ZXRob3Njb3BlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN0ZXRob3Njb3BlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI5NjU4XSwgImYwZjEiLCAiTTMyIDQ4QzMyIDIxLjUgNTMuNSAwIDgwIDBsNDggMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIgMCAwIDEyOGMwIDUzIDQzIDk2IDk2IDk2czk2LTQzIDk2LTk2bDAtMTI4LTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyUzIzOC4zIDAgMjU2IDBsNDggMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDE0NGMwIDc3LjQtNTUgMTQyLTEyOCAxNTYuOGwwIDE5LjJjMCA2MS45IDUwLjEgMTEyIDExMiAxMTJzMTEyLTUwLjEgMTEyLTExMmwwLTg1LjVjLTM3LjMtMTMuMi02NC00OC43LTY0LTkwLjUgMC01MyA0My05NiA5Ni05NnM5NiA0MyA5NiA5NmMwIDQxLjgtMjYuNyA3Ny40LTY0IDkwLjVsMCA4NS41YzAgOTcuMi03OC44IDE3Ni0xNzYgMTc2UzE2MCA0NjUuMiAxNjAgMzY4bDAtMTkuMkM4NyAzMzQgMzIgMjY5LjQgMzIgMTkyTDMyIDQ4ek00ODAgMjI0YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHoiXQogICAgfTsKICAgIGZhUG9kY2FzdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwb2RjYXN0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyY2UiLCAiTTMzNiAzNTkuOGMzOS4xLTMyLjMgNjQtODEuMSA2NC0xMzUuOCAwLTk3LjItNzguOC0xNzYtMTc2LTE3NlM0OCAxMjYuOCA0OCAyMjRDNDggMjc4LjcgNzIuOSAzMjcuNSAxMTIgMzU5LjggMTEyLjQgMzc3LjQgMTE1LjIgNDAwLjIgMTE4LjQgNDIxLjYgNDggMzgzLjkgMCAzMDkuNSAwIDIyNCAwIDEwMC4zIDEwMC4zIDAgMjI0IDBTNDQ4IDEwMC4zIDQ0OCAyMjRjMCA4NS42LTQ4IDE1OS45LTExOC41IDE5Ny42IDMuMy0yMS40IDYtNDQuMiA2LjQtNjEuOHptLTE0LTUzLjRjLTguMy0xMi42LTE5LjItMjEuNi0zMC40LTI3LjgtMi4xLTEuMS00LjItMi4yLTYuMy0zLjIgMTEuNy0xMy45IDE4LjgtMzEuOSAxOC44LTUxLjUgMC00NC4yLTM1LjgtODAtODAtODBzLTgwIDM1LjgtODAgODBjMCAxOS42IDcuMSAzNy42IDE4LjggNTEuNS0yLjEgMS00LjIgMi02LjMgMy4yLTExLjIgNi4yLTIyLjEgMTUuMi0zMC40IDI3LjgtMTguOC0yMi4zLTMwLjEtNTEtMzAuMS04Mi40IDAtNzAuNyA1Ny4zLTEyOCAxMjgtMTI4czEyOCA1Ny4zIDEyOCAxMjhjMCAzMS40LTExLjMgNjAuMi0zMC4xIDgyLjR6TTIyNCAzMTJjMzIuOSAwIDY0IDguNiA2NCA0My44IDAgMzMtMTIuOSAxMDQuMS0yMC42IDEzMi45LTUuMSAxOS0yNC41IDIzLjQtNDMuNCAyMy40cy0zOC4yLTQuNC00My40LTIzLjRjLTcuOC0yOC41LTIwLjYtOTkuNy0yMC42LTEzMi44IDAtMzUuMSAzMS4xLTQzLjggNjQtNDMuOHptMC0xMjhhNDAgNDAgMCAxIDEgMCA4MCA0MCA0MCAwIDEgMSAwLTgweiJdCiAgICB9OwogICAgZmFBcnJvd1VwUmlnaHREb3RzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXVwLXJpZ2h0LWRvdHMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTRiNyIsICJNOTYgMzJDNzguMyAzMiA2NCA0Ni4zIDY0IDY0Uzc4LjMgOTYgOTYgOTZMMTE0LjcgOTYgOS40IDIwMS40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwTDE2MCAxNDEuMyAxNjAgMTYwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC05NmMwLTE3LjctMTQuMy0zMi0zMi0zMkw5NiAzMnpNNDAzLjggNzAuMWEzOC4xIDM4LjEgMCAxIDAgNzYuMiAwIDM4LjEgMzguMSAwIDEgMCAtNzYuMiAwek0yNzkuNyAxOTQuMmEzOC4xIDM4LjEgMCAxIDAgNzYuMiAwIDM4LjEgMzguMSAwIDEgMCAtNzYuMiAwem0xNjIuMi0zOC4xYTM4LjEgMzguMSAwIDEgMCAwIDc2LjIgMzguMSAzOC4xIDAgMSAwIDAtNzYuMnpNMTU2LjIgMzE3LjhhMzguMSAzOC4xIDAgMSAwIDc2LjIgMCAzOC4xIDM4LjEgMCAxIDAgLTc2LjIgMHptMTYxLjYtMzguMWEzOC4xIDM4LjEgMCAxIDAgMCA3Ni4yIDM4LjEgMzguMSAwIDEgMCAwLTc2LjJ6bTg2LjEgMzguMWEzOC4xIDM4LjEgMCAxIDAgNzYuMiAwIDM4LjEgMzguMSAwIDEgMCAtNzYuMiAwek03MC4xIDQwMy44YTM4LjEgMzguMSAwIDEgMCAwIDc2LjIgMzguMSAzOC4xIDAgMSAwIDAtNzYuMnptODYuMSAzOC4xYTM4LjEgMzguMSAwIDEgMCA3Ni4yIDAgMzguMSAzOC4xIDAgMSAwIC03Ni4yIDB6bTE2MS42LTM4LjFhMzguMSAzOC4xIDAgMSAwIDAgNzYuMiAzOC4xIDM4LjEgMCAxIDAgMC03Ni4yem04Ni4xIDM4LjFhMzguMSAzOC4xIDAgMSAwIDc2LjIgMCAzOC4xIDM4LjEgMCAxIDAgLTc2LjIgMHoiXQogICAgfTsKICAgIGZhQ2hlc3NRdWVlbjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hlc3MtcXVlZW4iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5ODE5XSwgImY0NDUiLCAiTTI1NiA4MGE0OCA0OCAwIDEgMCAwLTk2IDQ4IDQ4IDAgMSAwIDAgOTZ6TTUuNSAxODVMMTI4IDM4NCA3MS44IDQ1NC4zYy01IDYuMy03LjggMTQuMS03LjggMjIuMiAwIDE5LjYgMTUuOSAzNS41IDM1LjUgMzUuNWwzMTIuOSAwYzE5LjYgMCAzNS41LTE1LjkgMzUuNS0zNS41IDAtOC4xLTIuNy0xNS45LTcuOC0yMi4yTDM4NCAzODQgNTA2LjUgMTg1YzMuNi01LjkgNS41LTEyLjcgNS41LTE5LjZsMC0uNmMwLTIwLjMtMTYuNS0zNi44LTM2LjgtMzYuOC03LjMgMC0xNC40IDIuMi0yMC40IDYuMmwtMTYuOSAxMS4zYy0xMi43IDguNS0yOS42IDYuOC00MC40LTRsLTM0LjEtMzQuMUMzNTYuMSAxMDAuMSAzNDYuMiA5NiAzMzYgOTZzLTIwLjEgNC4xLTI3LjMgMTEuM2wtMzAuMSAzMC4xYy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMGwtMzAuMS0zMC4xQzE5Ni4xIDEwMC4xIDE4Ni4yIDk2IDE3NiA5NnMtMjAuMSA0LjEtMjcuMyAxMS4zbC0zNC4xIDM0LjFjLTEwLjggMTAuOC0yNy43IDEyLjUtNDAuNCA0TDU3LjMgMTM0LjJjLTYuMS00LTEzLjItNi4yLTIwLjQtNi4yLTIwLjMgMC0zNi44IDE2LjUtMzYuOCAzNi44bDAgLjZjMCA2LjkgMS45IDEzLjcgNS41IDE5LjZ6Il0KICAgIH07CiAgICBmYUFuY2hvckNpcmNsZUV4Y2xhbWF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFuY2hvci1jaXJjbGUtZXhjbGFtYXRpb24iLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTRhYiIsICJNMzIwLjUgOTZhMzIgMzIgMCAxIDEgLTY0IDAgMzIgMzIgMCAxIDEgNjQgMHptLTMyLTk2Yy01MyAwLTk2IDQzLTk2IDk2IDAgNDEuOCAyNi43IDc3LjQgNjQgOTAuNWwwIDI1Ny45Yy02Mi45LTE0LjMtMTEwLjItNjkuNy0xMTEuOS0xMzYuNWwxNi4xIDE0LjFjMTAgOC43IDI1LjEgNy43IDMzLjktMi4zczcuNy0yNS4xLTIuMy0zMy45bC02NC01NmMtOS03LjktMjIuNi03LjktMzEuNiAwbC02NCA1NmMtMTAgOC43LTExIDIzLjktMi4zIDMzLjlzMjMuOSAxMSAzMy45IDIuM2wxNi4yLTE0LjJjMi4xIDExMy4xIDk0LjQgMjA0LjEgMjA4IDIwNC4xIDE2LjYgMCAzMi43LTEuOSA0OC4yLTUuNi0yMC4zLTMwLjUtMzIuMi02Ny0zMi4yLTEwNi40IDAtMjcuMyA1LjctNTMuMyAxNi03Ni45bDAtMTM2LjZjMzcuMy0xMy4yIDY0LTQ4LjcgNjQtOTAuNSAwLTUzLTQzLTk2LTk2LTk2em0yMDggNTQ0YTE0NCAxNDQgMCAxIDAgMC0yODggMTQ0IDE0NCAwIDEgMCAwIDI4OHptMC0xMDBhMjAgMjAgMCAxIDEgMCA0MCAyMCAyMCAwIDEgMSAwLTQwem0wLTE0MGM4LjggMCAxNiA3LjIgMTYgMTZsMCA4MGMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTgwYzAtOC44IDcuMi0xNiAxNi0xNnoiXQogICAgfTsKICAgIGZhRWxsaXBzaXNWZXJ0aWNhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJlbGxpcHNpcy12ZXJ0aWNhbCIsCiAgICAgIGljb246IFsxMjgsIDUxMiwgWyJlbGxpcHNpcy12Il0sICJmMTQyIiwgIk02NCAxNDRhNTYgNTYgMCAxIDEgMC0xMTIgNTYgNTYgMCAxIDEgMCAxMTJ6bTAgMjI0YzMwLjkgMCA1NiAyNS4xIDU2IDU2cy0yNS4xIDU2LTU2IDU2LTU2LTI1LjEtNTYtNTYgMjUuMS01NiA1Ni01NnptNTYtMTEyYzAgMzAuOS0yNS4xIDU2LTU2IDU2cy01Ni0yNS4xLTU2LTU2IDI1LjEtNTYgNTYtNTYgNTYgMjUuMSA1NiA1NnoiXQogICAgfTsKICAgIGZhRWxsaXBzaXNWID0gZmFFbGxpcHNpc1ZlcnRpY2FsOwogICAgZmFIZWFydENpcmNsZUV4Y2xhbWF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhlYXJ0LWNpcmNsZS1leGNsYW1hdGlvbiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNGZlIiwgIk0yNDEgODcuMWwxNSAyMC43IDE1LTIwLjdDMjk2IDUyLjUgMzM2LjIgMzIgMzc4LjkgMzIgNDUyLjQgMzIgNTEyIDkxLjYgNTEyIDE2NS4xbDAgMi42YzAgMTcuNi0zLjQgMzUuNi05LjUgNTMuNy0yMS44LTguNi00NS42LTEzLjQtNzAuNS0xMy40LTEwNiAwLTE5MiA4Ni0xOTIgMTkyIDAgMjguNSA2LjIgNTUuNiAxNy40IDgwLS41IDAtLjkgMC0xLjQgMC0xNS41IDAtMzAuOC00LjYtNDMuMS0xNC4xLTczLTU1LjctMjEyLjktMTg2LTIxMi45LTI5OC4ybDAtMi42QzAgOTEuNiA1OS42IDMyIDEzMy4xIDMyIDE3NS44IDMyIDIxNiA1Mi41IDI0MSA4Ny4xek00MzIgMjU2YTE0NCAxNDQgMCAxIDEgMCAyODggMTQ0IDE0NCAwIDEgMSAwLTI4OHptMCAyMjhhMjAgMjAgMCAxIDAgMC00MCAyMCAyMCAwIDEgMCAwIDQwem0wLTE4MGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgODBjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTgwYzAtOC44LTcuMi0xNi0xNi0xNnoiXQogICAgfTsKICAgIGZhQnVpbGRpbmdDaXJjbGVFeGNsYW1hdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJidWlsZGluZy1jaXJjbGUtZXhjbGFtYXRpb24iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRkMyIsICJNOTYgMEM2MC43IDAgMzIgMjguNyAzMiA2NGwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxODAgMGMtMTAuNS0xNC42LTE5LTMwLjctMjUuMS00OGwtNzQuOSAwIDAtODBjMC0xNy43IDE0LjMtMzIgMzItMzJsMzIgMGMyIDAgNCAuMiA1LjkgLjUgNi0yMy42IDE2LjMtNDUuNCAzMC4xLTY0LjVsLTQgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgNGMyNy41LTE5LjggNjAuMy0zMi40IDk2LTM1LjRMNDE2IDY0YzAtMzUuMy0yOC43LTY0LTY0LTY0TDk2IDB6bTMyIDExMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyek0yNzIgOTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNnpNMTI4IDI0MGMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyek00MzIgNTQ0YTE0NCAxNDQgMCAxIDAgMC0yODggMTQ0IDE0NCAwIDEgMCAwIDI4OHptMC0xMDBhMjAgMjAgMCAxIDEgMCA0MCAyMCAyMCAwIDEgMSAwLTQwem0wLTE0MGM4LjggMCAxNiA3LjIgMTYgMTZsMCA4MGMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTgwYzAtOC44IDcuMi0xNiAxNi0xNnoiXQogICAgfTsKICAgIGZhUGVyc29uQXJyb3dVcEZyb21MaW5lID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1hcnJvdy11cC1mcm9tLWxpbmUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUzOSIsICJNMTkyLTMyYTU2IDU2IDAgMSAxIDAgMTEyIDU2IDU2IDAgMSAxIDAtMTEyek0zMTguMyAyOTkuMWwtNDYuMy02Mi40IDAgMjQzLjMgMjcyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgNTQ0Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDgwIDAgMC0yNDMuMy00Ni4zIDYyLjRjLTEwLjUgMTQuMi0zMC42IDE3LjItNDQuOCA2LjZzLTE3LjItMzAuNi02LjYtNDQuOGw3MC41LTk1QzExMCAxMzIgMTQ5LjcgMTEyIDE5MiAxMTJzODIgMjAgMTA3LjIgNTMuOWw3MC41IDk1YzEwLjUgMTQuMiA3LjYgMzQuMi02LjYgNDQuOHMtMzQuMiA3LjYtNDQuOC02LjZ6TTIwOCA0ODBsMC0xMjhjMC04LjgtNy4yLTE2LTE2LTE2cy0xNiA3LjItMTYgMTZsMCAxMjggMzIgMHpNNTY2LjYgMTAyLjZjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwTDQ5NiA3Ny4zIDQ5NiAyMjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xNDYuNy0yNS40IDI1LjRjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwcy0xMi41LTMyLjggMC00NS4zbDgwLTgwYzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDgwIDgwYzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zeiJdCiAgICB9OwogICAgZmFOb3RFcXVhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJub3QtZXF1YWwiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjUzZSIsICJNMzc4LjYgODEuOGM5LjgtMTQuNyA1LjgtMzQuNi04LjktNDQuNHMtMzQuNi01LjgtNDQuNCA4LjlMMjcwLjkgMTI4IDMyIDEyOGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwxOTYuMiAwLTg1LjMgMTI4LTExMC45IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNjguMiAwLTMwLjggNDYuMmMtOS44IDE0LjctNS44IDM0LjYgOC45IDQ0LjRzMzQuNiA1LjggNDQuNC04LjlMMTc3LjEgMzg0IDQxNiAzODRjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTE5Ni4yIDAgODUuMy0xMjggMTEwLjkgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNjguMiAwIDMwLjgtNDYuMnoiXQogICAgfTsKICAgIGZhVHJhaW5UcmFtID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRyYWluLXRyYW0iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjg2NTBdLCAiZTViNCIsICJNMCA4QzAtNS4zIDEwLjctMTYgMjQtMTZsMzM2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCAzMmMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTgtMTIwIDAgMCA2NCA0MCAwYzUzIDAgOTYgNDMgOTYgOTZsMCAxNjBjMCAzMS4yLTE0LjkgNTktMzggNzYuNWw2NC4zIDc2YzguNiAxMC4xIDcuMyAyNS4zLTIuOCAzMy44cy0yNS4zIDcuMy0zMy44LTIuOGwtNzQuNi04OC4xYy0zLjYgLjQtNy4zIC42LTExLjEgLjZsLTEyOCAwYy0zLjggMC03LjUtLjItMTEuMS0uNkw0Mi4zIDUzNS41Yy04LjYgMTAuMS0yMy43IDExLjQtMzMuOCAyLjhzLTExLjQtMjMuNy0yLjgtMzMuOGw2NC4zLTc2QzQ2LjkgNDExIDMyIDM4My4yIDMyIDM1MmwwLTE2MGMwLTUzIDQzLTk2IDk2LTk2bDQwIDAgMC02NC0xMjAgMCAwIDhjMCAxMy4zLTEwLjcgMjQtMjQgMjRTMCA1My4zIDAgNDBMMCA4ek0xMjggMTYwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMybDEyOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMzJjMC0xNy43LTE0LjMtMzItMzItMzJsLTEyOCAwem0zMiAxOTJhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHptOTYgMzJhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFQbGFuZURlcGFydHVyZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwbGFuZS1kZXBhcnR1cmUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjg3NDddLCAiZjViMCIsICJNMzcyIDE0My45TDE3Mi43IDQwLjJjLTgtNC4xLTE3LjMtNC44LTI1LjctMS43bC00MS4xIDE1Yy0xMC4zIDMuNy0xMy44IDE2LjQtNy4xIDI1TDIwMC4zIDIwNi40IDEwMC4xIDI0Mi44IDQwIDIwNi4yYy02LjItMy44LTEzLjgtNC41LTIwLjctMi4xTDMgMjEwLjFjLTkuNCAzLjQtMTMuNCAxNC41LTguMyAyMy4xbDUzLjYgOTEuOGMxNS42IDI2LjcgNDguMSAzOC40IDc3LjEgMjcuOGwxMi45LTQuNyAwIDAgMzk4LjQtMTQ1YzI5LjEtMTAuNiA0NC00Mi43IDMzLjUtNzEuOHMtNDIuNy00NC03MS44LTMzLjVMMzcyIDE0My45ek0zMi4yIDQ0OGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmw1MTIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNTEyIDB6Il0KICAgIH07CiAgICBmYVJpZ2h0VG9CcmFja2V0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJpZ2h0LXRvLWJyYWNrZXQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsic2lnbi1pbi1hbHQiXSwgImYyZjYiLCAiTTM0NSAyNzNjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlMMjAxIDk1Yy02LjktNi45LTE3LjItOC45LTI2LjItNS4yUzE2MCAxMDIuMyAxNjAgMTEybDAgODAtMTEyIDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgMzJjMCAyNi41IDIxLjUgNDggNDggNDhsMTEyIDAgMCA4MGMwIDkuNyA1LjggMTguNSAxNC44IDIyLjJzMTkuMyAxLjcgMjYuMi01LjJMMzQ1IDI3M3ptNyAxNDNjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNjQgMGM1MyAwIDk2LTQzIDk2LTk2bDAtMjU2YzAtNTMtNDMtOTYtOTYtOTZsLTY0IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDI1NmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtNjQgMHoiXQogICAgfTsKICAgIGZhU2lnbkluQWx0ID0gZmFSaWdodFRvQnJhY2tldDsKICAgIGZhU2RDYXJkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNkLWNhcmQiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjdjMiIsICJNMzg0IDY0YzAtMzUuMy0yOC43LTY0LTY0LTY0TDEyNS4zIDBDMTA4LjMgMCA5MiA2LjcgODAgMTguN0wxOC43IDgwQzYuNyA5MiAwIDEwOC4zIDAgMTI1LjNMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjU2IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zODR6TTE2MCA4OGwwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNDhjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNHptODggMGwwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNDhjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNHptODggMGwwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNDhjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNHoiXQogICAgfTsKICAgIGZhSG91c2VDaXJjbGVFeGNsYW1hdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VzZS1jaXJjbGUtZXhjbGFtYXRpb24iLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTUwYSIsICJNNDk2IDU0NGExNDQgMTQ0IDAgMSAxIDAtMjg4IDE0NCAxNDQgMCAxIDEgMCAyODh6TTI2OC42IDYuNWMxMi4yLTkuMyAyOS43LTguNyA0MS4yIDJsMjE3LjYgMjAyYy0xMC4yLTEuNy0yMC43LTIuNi0zMS4zLTIuNi03OC42IDAtMTQ2LjEgNDcuMi0xNzUuOCAxMTQuOC01LjEtMS44LTEwLjUtMi44LTE2LjItMi44bC0zMiAwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDk2IDkxIDBjNi4xIDE3LjMgMTQuNiAzMy40IDI1LjEgNDhMMTQ0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0xNzYtMTYgMGMtMTMuMiAwLTI1LTguMS0yOS44LTIwLjNzLTEuNi0yNi4yIDgtMzUuMWwyMjQtMjA4IDIuNC0yek00OTYgNDQ0YTIwIDIwIDAgMSAwIDAgNDAgMjAgMjAgMCAxIDAgMC00MHptMC0xNDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDgwYzAgOC44IDcuMiAxNiAxNiAxNiA4LjggMCAxNi03LjIgMTYtMTZsMC04MGMwLTguOC03LjItMTYtMTYtMTZ6Il0KICAgIH07CiAgICBmYVNoZWtlbFNpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2hla2VsLXNpZ24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs4MzYyLCAiaWxzIiwgInNoZWtlbCIsICJzaGVxZWwiLCAic2hlcWVsLXNpZ24iXSwgImYyMGIiLCAiTTMyIDMyQzE0LjMgMzIgMCA0Ni4zIDAgNjRMMCA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTM1MiAxMjggMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDE2MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTYwYzAtNzAuNy01Ny4zLTEyOC0xMjgtMTI4TDMyIDMyek0zMjAgNDgwYzcwLjcgMCAxMjgtNTcuMyAxMjgtMTI4bDAtMjg4YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMjg4YzAgMzUuMy0yOC43IDY0LTY0IDY0bC0xMjggMCAwLTIyNGMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDI1NmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxNjAgMHoiXQogICAgfTsKICAgIGZhSWxzID0gZmFTaGVrZWxTaWduOwogICAgZmFTaGVrZWwgPSBmYVNoZWtlbFNpZ247CiAgICBmYVNoZXFlbCA9IGZhU2hla2VsU2lnbjsKICAgIGZhU2hlcWVsU2lnbiA9IGZhU2hla2VsU2lnbjsKICAgIGZhUmFkaW8gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicmFkaW8iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgyNTFdLCAiZjhkNyIsICJNNDk0LjggMTVjMTIuNy0zLjcgMjAtMTcuMSAxNi4zLTI5LjhTNDk0LTM0LjggNDgxLjMtMzFMNTEuOCA5NC45QzQyLjQgOTcuNiAzMy45IDEwMi4xIDI2LjYgMTA4IDEwLjUgMTE5LjcgMCAxMzguNiAwIDE2MEwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzODQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI1NmMwLTM1LjMtMjguNy02NC02NC02NEwyMTguNSA5NiA0OTQuOCAxNXpNMzY4IDIwOGE4MCA4MCAwIDEgMSAwIDE2MCA4MCA4MCAwIDEgMSAwLTE2MHpNNjQgMjQ4YzAtMTMuMyAxMC43LTI0IDI0LTI0bDExMiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0TDg4IDI3MmMtMTMuMyAwLTI0LTEwLjctMjQtMjR6bTAgOTZjMC0xMy4zIDEwLjctMjQgMjQtMjRsMTEyIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRMODggMzY4Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNHoiXQogICAgfTsKICAgIGZhSGFuZERvdHMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1kb3RzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImFsbGVyZ2llcyJdLCAiZjQ2MSIsICJNMjg4IDMyYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMjA4YzAgOC44LTcuMiAxNi0xNiAxNnMtMTYtNy4yLTE2LTE2bDAtMTc2YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMjcyYzAgMS41IDAgMy4xIC4xIDQuNkw2Ny42IDI4M2MtMTYtMTUuMi00MS4zLTE0LjYtNTYuNiAxLjRTLTMuNiAzMjUuNyAxMi40IDM0MUwxMjQuOCA0NDhjNDMuMSA0MS4xIDEwMC40IDY0IDE2MCA2NGwxOS4yIDBjOTcuMiAwIDE3Ni03OC44IDE3Ni0xNzZsMC0yMDhjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAxMTJjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC0xNzZjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAxNzZjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC0yMDh6TTIwMCAzNTJhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHptMTIwLTU2YTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHptNDAgODhhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHptLTg4IDI0YTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHoiXQogICAgfTsKICAgIGZhQWxsZXJnaWVzID0gZmFIYW5kRG90czsKICAgIGZhQm9va1NrdWxsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvb2stc2t1bGwiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiYm9vay1kZWFkIl0sICJmNmI3IiwgIk05NiA1MTJsMzIwIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsMC02Ni43YzE4LjYtNi42IDMyLTI0LjQgMzItNDUuM2wwLTI4OGMwLTI2LjUtMjEuNS00OC00OC00OEw5NiAwQzQzIDAgMCA0MyAwIDk2TDAgNDE2YzAgNTMgNDMgOTYgOTYgOTZ6TTY0IDQxNmMwLTE3LjcgMTQuMy0zMiAzMi0zMmwyNTYgMCAwIDY0LTI1NiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnpNMjcyIDE2My4ybDAgMTIuOGMwIDguOC03LjIgMTYtMTYgMTZsLTY0IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTEyLjhjLTE5LjQtMTEuNy0zMi0zMC4zLTMyLTUxLjIgMC0zNS4zIDM1LjgtNjQgODAtNjRzODAgMjguNyA4MCA2NGMwIDIwLjktMTIuNiAzOS41LTMyIDUxLjJ6TTIwOCAxMTJhMTYgMTYgMCAxIDAgLTMyIDAgMTYgMTYgMCAxIDAgMzIgMHptNDggMTZhMTYgMTYgMCAxIDAgMC0zMiAxNiAxNiAwIDEgMCAwIDMyem03NC4yIDk1LjdjNC42IDEwLjEgLjEgMjEuOS05LjkgMjYuNWwtNDcuOSAyMS44IDQ3LjkgMjEuOGMxMC4xIDQuNiAxNC41IDE2LjQgOS45IDI2LjVzLTE2LjQgMTQuNS0yNi41IDkuOUwyMjQgMjk0IDE0NC4zIDMzMC4yYy0xMC4xIDQuNi0yMS45IC4xLTI2LjUtOS45cy0uMS0yMS45IDkuOS0yNi41bDQ3LjktMjEuOC00Ny45LTIxLjhjLTEwLjEtNC42LTE0LjUtMTYuNC05LjktMjYuNXMxNi40LTE0LjUgMjYuNS05LjlMMjI0IDI1MCAzMDMuNyAyMTMuOGMxMC4xLTQuNiAyMS45LS4xIDI2LjUgOS45eiJdCiAgICB9OwogICAgZmFCb29rRGVhZCA9IGZhQm9va1NrdWxsOwogICAgZmFVbmxvY2tLZXlob2xlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVubG9jay1rZXlob2xlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbInVubG9jay1hbHQiXSwgImYxM2UiLCAiTTE5MiAzMmMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCA2NCAxOTIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDIyNGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMjI0YzAtMzUuMyAyOC43LTY0IDY0LTY0bDAtNjRjMC03MC43IDU3LjMtMTI4IDEyOC0xMjggNjMuNSAwIDExNi4xIDQ2LjEgMTI2LjIgMTA2LjcgMi45IDE3LjQtOC44IDMzLjktMjYuMyAzNi45cy0zMy45LTguOC0zNi45LTI2LjNDMjUwIDU1LjEgMjIzLjcgMzIgMTkyIDMyem00MCAzMjhjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTgwIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsODAgMHoiXQogICAgfTsKICAgIGZhVW5sb2NrQWx0ID0gZmFVbmxvY2tLZXlob2xlOwogICAgZmFGaWxlQXJyb3dVcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLWFycm93LXVwIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbImZpbGUtdXBsb2FkIl0sICJmNTc0IiwgIk0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwyMTMuNSAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDM2NS4zIDEyNS4zYzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNMMzg0IDQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6bTIwOC01LjVsMCA5My41YzAgMTMuMyAxMC43IDI0IDI0IDI0TDMyNS41IDE3NiAyMDggNTguNXpNMjA5IDI2M2MtOS40LTkuNC0yNC42LTkuNC0zMy45IDBsLTY0IDY0Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBsMjMtMjMgMCA4Ni4xYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC04Ni4xIDIzIDIzYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNjQtNjR6Il0KICAgIH07CiAgICBmYUZpbGVVcGxvYWQgPSBmYUZpbGVBcnJvd1VwOwogICAgZmFGYWNlR3JpblRlYXJzMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWdyaW4tdGVhcnMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjg1MTQsICJncmluLXRlYXJzIl0sICJmNTg4IiwgIk01NTQuOCAyMDMuNGwxNi4zIDIuM0M1NDcuNyA4OC40IDQ0NC4yIDAgMzIwIDBTOTIuMyA4OC40IDY4LjkgMjA1LjdsMTYuMy0yLjNjMzctNS4zIDY4LjYgMjYuNCA2My40IDYzLjRsLTYuNyA0Ni43Yy00LjEgMjktMjEuNiA1My4yLTQ1LjggNjYuOCA0My43IDc4LjUgMTI3LjYgMTMxLjcgMjIzLjggMTMxLjdzMTgwLjEtNTMuMSAyMjMuOC0xMzEuN2MtMjQuMS0xMy41LTQxLjYtMzcuOC00NS44LTY2LjhsLTYuNy00Ni43Yy01LjMtMzcgMjYuNC02OC42IDYzLjQtNjMuNHpNNDcwLjMgMzI2LjlDNDQ3LjkgMzg4LjIgMzg5LjEgNDMyIDMyMCA0MzJTMTkyLjEgMzg4LjIgMTY5LjcgMzI2LjljLTQuMy0xMS44IDcuNy0yMS44IDE5LjYtMTguMSAzOS4yIDEyLjIgODMuNyAxOS4xIDEzMC43IDE5LjFzOTEuNS02LjkgMTMwLjctMTkuMWMxMS45LTMuNyAyMy45IDYuMyAxOS42IDE4LjF6TTIxMiAyMDhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0zNy42IDMwLjQtNjggNjgtNjhzNjggMzAuNCA2OCA2OGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTE1LjUtMTIuNS0yOC0yOC0yOHMtMjggMTIuNS0yOCAyOHptMTg4LTI4Yy0xNS41IDAtMjggMTIuNS0yOCAyOGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTM3LjYgMzAuNC02OCA2OC02OHM2OCAzMC40IDY4IDY4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMTUuNS0xMi41LTI4LTI4LTI4ek02NDAgMzAwLjZjMC0yNS42LTE4LjgtNDcuMy00NC4xLTUwLjlMNTQ5LjEgMjQzYy0xMC42LTEuNS0xOS42IDcuNS0xOC4xIDE4LjFsNi43IDQ2LjdjMy42IDI1LjMgMjUuMyA0NC4xIDUwLjkgNDQuMSAyOC40IDAgNTEuNC0yMyA1MS40LTUxLjR6bS02NDAgMEMwIDMyOSAyMyAzNTIgNTEuNCAzNTIgNzcgMzUyIDk4LjcgMzMzLjIgMTAyLjMgMzA3LjlsNi43LTQ2LjdjMS41LTEwLjYtNy41LTE5LjYtMTguMS0xOC4xbC00Ni43IDYuN0MxOC44IDI1My4zIDAgMjc1IDAgMzAwLjZ6Il0KICAgIH07CiAgICBmYUdyaW5UZWFyczIgPSBmYUZhY2VHcmluVGVhcnMyOwogICAgZmFQZW5Ub1NxdWFyZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVuLXRvLXNxdWFyZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJlZGl0Il0sICJmMDQ0IiwgIk00NzEuNiAyMS43Yy0yMS45LTIxLjktNTcuMy0yMS45LTc5LjIgMEwzNjggNDYuMSA0NjUuOSAxNDQgNDkwLjMgMTE5LjZjMjEuOS0yMS45IDIxLjktNTcuMyAwLTc5LjJMNDcxLjYgMjEuN3ptLTI5OS4yIDIyMGMtNi4xIDYuMS0xMC44IDEzLjYtMTMuNSAyMS45bC0yOS42IDg4LjhjLTIuOSA4LjYtLjYgMTguMSA1LjggMjQuNnMxNS45IDguNyAyNC42IDUuOGw4OC44LTI5LjZjOC4yLTIuNyAxNS43LTcuNCAyMS45LTEzLjVMNDMyIDE3Ny45IDMzNC4xIDgwIDE3Mi40IDI0MS43ek05NiA2NEM0MyA2NCAwIDEwNyAwIDE2MEwwIDQxNmMwIDUzIDQzIDk2IDk2IDk2bDI1NiAwYzUzIDAgOTYtNDMgOTYtOTZsMC05NmMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDk2YzAgMTcuNy0xNC4zIDMyLTMyIDMyTDk2IDQ0OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0yNTZjMC0xNy43IDE0LjMtMzIgMzItMzJsOTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkw5NiA2NHoiXQogICAgfTsKICAgIGZhRWRpdDIgPSBmYVBlblRvU3F1YXJlMjsKICAgIGZhRWFydGhFdXJvcGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZWFydGgtZXVyb3BlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImdsb2JlLWV1cm9wZSJdLCAiZjdhMiIsICJNMjU2LjIgNDhjMTE0LjggLjEgMjA3LjggOTMuMiAyMDcuOCAyMDggMCAyMi4xLTMuNCA0My40LTkuOCA2My40LTIgLjQtNC4xIC42LTYuMiAuNmwtMi43IDBjLTguNSAwLTE2LjYtMy40LTIyLjYtOS40bC0yOS4zLTI5LjNjLTYtNi05LjQtMTQuMS05LjQtMjIuNmwwLTUwLjdjMC04LjggNy4yLTE2IDE2LTE2czE2LTcuMiAxNi0xNi03LjItMTYtMTYtMTZsLTI0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0cy0xMC43IDI0LTI0IDI0bC01NiAwYy04LjggMC0xNiA3LjItMTYgMTZzLTcuMiAxNi0xNiAxNmwtMjUuNCAwYy0xMi41IDAtMjIuNi0xMC4xLTIyLjYtMjIuNiAwLTYgMi40LTExLjggNi42LTE2bDcwLjEtNzAuMWMyLjEtMi4xIDMuMy01IDMuMy04IDAtNi4yLTUuMS0xMS4zLTExLjMtMTEuM2wtMTQuMSAwYy0xMi41IDAtMjIuNi0xMC4xLTIyLjYtMjIuNiAwLTYgMi40LTExLjggNi42LTE2bDIzLjEtMjMuMWMuOC0uOCAxLjYtMS41IDIuNS0yLjJ6TTQzOC40IDM1Ni4xYy0zMi44IDU5LjYtOTMuOSAxMDEuNC0xNjUuMiAxMDcuMi0uNy0yLjMtMS4xLTQuOC0xLjEtNy4zIDAtMTMuMy0xMC43LTI0LTI0LTI0bC0yNi43IDBjLTguNSAwLTE2LjYtMy40LTIyLjYtOS40bC0yOS4zLTI5LjNjLTYtNi05LjQtMTQuMS05LjQtMjIuNmwwLTY2LjdjMC0xNy43IDE0LjMtMzIgMzItMzJsOTguNyAwYzguNSAwIDE2LjYgMy40IDIyLjYgOS40bDI5LjMgMjkuM2M2IDYgMTQuMSA5LjQgMjIuNiA5LjRsNS41IDBjOC41IDAgMTYuNiAzLjQgMjIuNiA5LjRsMTYgMTZjNC4yIDQuMiAxMCA2LjYgMTYgNi42IDQuOCAwIDkuMyAxLjUgMTMgNC4xek0yNTYgNTEybDI2LjItMS4zYy04LjYgLjktMTcuMyAxLjMtMjYuMiAxLjN6bTI2LjItMS4zQzQxMS4zIDQ5Ny42IDUxMiAzODguNiA1MTIgMjU2IDUxMiAxMTQuNiAzOTcuNCAwIDI1NiAwbDAgMEMxMTQuNiAwIDAgMTE0LjYgMCAyNTYgMCAzODMuNSA5My4yIDQ4OS4zIDIxNS4zIDUwOC44IDIyOC41IDUxMC45IDI0Mi4xIDUxMiAyNTYgNTEyek0xODcuMyAxMjMuM2wtMzIgMzJjLTYuMiA2LjItMTYuNCA2LjItMjIuNiAwcy02LjItMTYuNCAwLTIyLjZsMzItMzJjNi4yLTYuMiAxNi40LTYuMiAyMi42IDBzNi4yIDE2LjQgMCAyMi42eiJdCiAgICB9OwogICAgZmFHbG9iZUV1cm9wZSA9IGZhRWFydGhFdXJvcGU7CiAgICBmYUZhY2VHcmluQmVhbVN3ZWF0MiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWdyaW4tYmVhbS1zd2VhdCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyODUxNywgImdyaW4tYmVhbS1zd2VhdCJdLCAiZjU4MyIsICJNNTQ2LjItLjFjMTQuNyAxNy44IDI5LjggNDAuMSAyOS44IDY0LjEgMCAzNi40LTI3LjYgNjQtNjQgNjRzLTY0LTI3LjYtNjQtNjRjMC0yNCAxNS4yLTQ2LjMgMjkuOC02NC4xIDguOC0xMC43IDE4LjUtMjAuOCAyOS0zMCAzLTIuNiA3LjQtMi42IDEwLjQgMCAxMC41IDkuMSAyMC4xIDE5LjMgMjkgMzB6TTI4OCAwYzQyLjUgMCA4Mi42IDEwLjQgMTE3LjggMjguNy0zLjYgMTAuOS01LjggMjIuNy01LjggMzUuMyAwIDYyLjkgNDkuMSAxMTIgMTEyIDExMiA2LjQgMCAxMi43LS41IDE4LjgtMS41IDguNiAyNS42IDEzLjIgNTMgMTMuMiA4MS41IDAgMTQxLjQtMTE0LjYgMjU2LTI1NiAyNTZTMzIgMzk3LjQgMzIgMjU2IDE0Ni42IDAgMjg4IDB6TTQxOC43IDMwOC45QzM3OS41IDMyMS4xIDMzNS4xIDMyOCAyODggMzI4cy05MS41LTYuOS0xMzAuNy0xOS4xYy0xMS45LTMuNy0yMy45IDYuMy0xOS42IDE4LjEgMjIuNCA2MS4zIDgxLjMgMTA1LjEgMTUwLjMgMTA1LjFzMTI3LjktNDMuOCAxNTAuMy0xMDUuMWM0LjMtMTEuOC03LjctMjEuOC0xOS42LTE4LjF6TTIwOCAxODBjMTUuNSAwIDI4IDEyLjUgMjggMjhsMCA4YzAgMTEgOSAyMCAyMCAyMHMyMC05IDIwLTIwbDAtOGMwLTM3LjYtMzAuNC02OC02OC02OHMtNjggMzAuNC02OCA2OGwwIDhjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC04YzAtMTUuNSAxMi41LTI4IDI4LTI4em0xMzIgMjhjMC0xNS41IDEyLjUtMjggMjgtMjhzMjggMTIuNSAyOCAyOGwwIDhjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC04YzAtMzcuNi0zMC40LTY4LTY4LTY4cy02OCAzMC40LTY4IDY4bDAgOGMwIDExIDkgMjAgMjAgMjBzMjAtOSAyMC0yMGwwLTh6Il0KICAgIH07CiAgICBmYUdyaW5CZWFtU3dlYXQyID0gZmFGYWNlR3JpbkJlYW1Td2VhdDI7CiAgICBmYUNpcmNsZUhhbGZTdHJva2UgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLWhhbGYtc3Ryb2tlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTY4MCwgImFkanVzdCJdLCAiZjA0MiIsICJNNDQ4IDI1NmMwLTEwNi04Ni0xOTItMTkyLTE5MmwwIDM4NGMxMDYgMCAxOTItODYgMTkyLTE5MnpNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHoiXQogICAgfTsKICAgIGZhQWRqdXN0ID0gZmFDaXJjbGVIYWxmU3Ryb2tlOwogICAgZmFQZXJzb25NaWxpdGFyeVRvUGVyc29uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1taWxpdGFyeS10by1wZXJzb24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTU0YyIsICJNNzEgMTIuNWMtOC42IDEtMTUgOC4yLTE1IDE2LjggMCA5LjMgNy41IDE2LjggMTYuNyAxNi45bDExMS40IDBjOC44LS4xIDE1LjktNy4yIDE1LjktMTZMMjAwIDE2YzAtOS41LTguMy0xNy0xNy44LTE1LjlMNzEgMTIuNXpNMTg5LjUgNzguMWwtMTIyLjkgMGMtMS42IDUuNy0yLjUgMTEuNy0yLjUgMTcuOSAwIDM1LjMgMjguNyA2NCA2NCA2NHM2NC0yOC43IDY0LTY0YzAtNi4yLS45LTEyLjItMi41LTE3Ljl6TTMyIDI1NmwwIDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMybDEyOCAwYzEuOCAwIDMuNS0uMSA1LjItLjRMNTMgMjA4LjZDNDAuMSAyMjAuMyAzMiAyMzcuMiAzMiAyNTZ6bTE5MC4yIDQyLjVjMS4xLTMuMyAxLjgtNi44IDEuOC0xMC41bDAtMzJjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTY0IDBjLTMuNyAwLTcuNCAuMy0xMC45IC45TDIyMi4yIDI5OC41ek0zODQgMTYwYTY0IDY0IDAgMSAwIDAtMTI4IDY0IDY0IDAgMSAwIDAgMTI4em0tMzIgMzJjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTI4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0zMmMwLTM1LjMtMjguNy02NC02NC02NGwtNjQgMHpNMjE1LjggNDUwLjFjNS4yLTQuNiA4LjItMTEuMSA4LjItMTguMXMtMy0xMy41LTguMi0xOC4xbC02NC01NmMtNy4xLTYuMi0xNy4xLTcuNy0yNS43LTMuOFMxMTIgMzY2LjYgMTEyIDM3NmwwIDMyLTg4IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsODggMCAwIDMyYzAgOS40IDUuNSAxOCAxNC4xIDIxLjlzMTguNiAyLjQgMjUuNy0zLjhsNjQtNTZ6TTI4OCA0MzEuOWMwIDYuOSAzIDEzLjUgOC4xIDE4LjFsNjQgNTYuNGM3LjEgNi4yIDE3LjEgNy44IDI1LjcgMy45UzQwMCA0OTcuOCA0MDAgNDg4LjRsMC0zMi40IDg4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTg4IDAgMC0zMmMwLTkuNC01LjUtMTgtMTQuMS0yMS45cy0xOC42LTIuNC0yNS43IDMuOGwtNjQgNTZjLTUuMiA0LjUtOC4yIDExLjEtOC4yIDE4eiJdCiAgICB9OwogICAgZmFUYWJsZUNlbGxzQ29sdW1uTG9jayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWJsZS1jZWxscy1jb2x1bW4tbG9jayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNjc4IiwgIk0yNTYgMjI0bDAgMTkyIDY0IDAgMC0xOTItNjQgMHptMjU2LTc5Yy00Ni43IDUuOC04NS42IDM2LjgtMTAyLjcgNzlsLTI1LjMgMCAwIDkwLjhjLTEwLjEgMTUuMi0xNiAzMy40LTE2IDUzLjFsMCA5NmMwIDUuNSAuNSAxMC45IDEuMyAxNi4xTDEyOCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDY0IDk2YzAtMzUuMyAyOC43LTY0IDY0LTY0bDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgNDl6TTEyOCAyMjRsMCAxOTIgNjQgMCAwLTE5Mi02NCAwem00MzIgNDguMWMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDQ3LjkgNjQgMCAwLTQ3Ljl6TTQxNiAzNjhjMC0yMC45IDEzLjQtMzguNyAzMi00NS4zbDAtNTAuNmMwLTQ0LjIgMzUuOC04MCA4MC04MHM4MCAzNS44IDgwIDgwbDAgNTAuNmMxOC42IDYuNiAzMiAyNC40IDMyIDQ1LjNsMCA5NmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTI4IDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtOTZ6Il0KICAgIH07CiAgICBmYVRydWNrRmllbGRVbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cnVjay1maWVsZC11biIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNThlIiwgIk05NiAzMkM2MC43IDMyIDMyIDYwLjcgMzIgOTZsMCAzMmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA5NmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwwIDQ4YzAgMjEuMSAxMy43IDM5LjEgMzIuNiA0NS41LS40IDMuNC0uNiA3LS42IDEwLjUgMCA0OC42IDM5LjQgODggODggODhzODgtMzkuNCA4OC04OGMwLTIuNy0uMS01LjQtLjQtOGwxNDQuNyAwYy0uMiAyLjYtLjQgNS4zLS40IDggMCA0OC42IDM5LjQgODggODggODhzODgtMzkuNCA4OC04OGMwLTIuNy0uMS01LjQtLjQtOGwuNCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtNjRjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTI0LjcgMC0xLjctNC4yLTQzLjgtMTA2LjNjLTEyLjMtMzAtNDEuNi00OS41LTc0LTQ5LjVsLTQwLjQgMEMzNjQuNCA0NC45IDM0My43IDMyIDMyMCAzMkw5NiAzMnpNMzg0IDIyNGwwLTk2IDMxLjkgMGM2LjUgMCAxMi4zIDMuOSAxNC44IDkuOWwzNS40IDg2LjEtODIuMSAwek0xNTIgMzUyYTQwIDQwIDAgMSAxIDAgODAgNDAgNDAgMCAxIDEgMC04MHptMjgwIDQwYTQwIDQwIDAgMSAxIDgwIDAgNDAgNDAgMCAxIDEgLTgwIDB6TTI1Ni42IDEzMi45bDI3LjQgNDEgMC0yOS45YzAtMTEgOS0yMCAyMC0yMHMyMCA5IDIwIDIwbDAgOTZjMCA4LjgtNS44IDE2LjYtMTQuMiAxOS4xcy0xNy41LS43LTIyLjQtOGwtMjcuNC00MSAwIDI5LjljMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOTZjMC04LjggNS44LTE2LjYgMTQuMi0xOS4xczE3LjUgLjcgMjIuNCA4ek0xMzIgMTQ0bDAgNjRjMCA2LjYgNS40IDEyIDEyIDEyczEyLTUuNCAxMi0xMmwwLTY0YzAtMTEgOS0yMCAyMC0yMHMyMCA5IDIwIDIwbDAgNjRjMCAyOC43LTIzLjMgNTItNTIgNTJzLTUyLTIzLjMtNTItNTJsMC02NGMwLTExIDktMjAgMjAtMjBzMjAgOSAyMCAyMHoiXQogICAgfTsKICAgIGZhQ2xvY2syID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNsb2NrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MzM5LCAiY2xvY2stZm91ciJdLCAiZjAxNyIsICJNMjU2IDBhMjU2IDI1NiAwIDEgMSAwIDUxMiAyNTYgMjU2IDAgMSAxIDAtNTEyek0yMzIgMTIwbDAgMTM2YzAgOCA0IDE1LjUgMTAuNyAyMGw5NiA2NGMxMSA3LjQgMjUuOSA0LjQgMzMuMy02LjdzNC40LTI1LjktNi43LTMzLjNMMjgwIDI0My4yIDI4MCAxMjBjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjR6Il0KICAgIH07CiAgICBmYUNsb2NrRm91cjIgPSBmYUNsb2NrMjsKICAgIGZhQm9vayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib29rIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI4MjEyXSwgImYwMmQiLCAiTTM4NCA1MTJMOTYgNTEyYy01MyAwLTk2LTQzLTk2LTk2TDAgOTZDMCA0MyA0MyAwIDk2IDBMNDAwIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAyODhjMCAyMC45LTEzLjQgMzguNy0zMiA0NS4zbDAgNjYuN2MxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIgMHpNOTYgMzg0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDI1NiAwIDAtNjQtMjU2IDB6bTMyLTIzMmMwIDEzLjMgMTAuNyAyNCAyNCAyNGwxNzYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTc2IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0em0yNCA3MmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNzYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTc2IDB6Il0KICAgIH07CiAgICBmYUZhY2VMYXVnaFdpbmsyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtbGF1Z2gtd2luayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJsYXVnaC13aW5rIl0sICJmNTljIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMTAxLjYgMzE0Yy0zLjctMTMuNyA3LjUtMjYgMjEuNy0yNmwyNjUuNCAwYzE0LjIgMCAyNS40IDEyLjMgMjEuNyAyNi0xOC41IDY4LTgwLjYgMTE4LTE1NC40IDExOFMxMjAgMzgyIDEwMS42IDMxNHpNMTQ0IDE5MmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0xNjQgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBjMC0zMy4xIDI2LjktNjAgNjAtNjBsMTYgMGMzMy4xIDAgNjAgMjYuOSA2MCA2MCAwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjAtOS0yMC0yMC0yMGwtMTYgMGMtMTEgMC0yMCA5LTIwIDIweiJdCiAgICB9OwogICAgZmFMYXVnaFdpbmsyID0gZmFGYWNlTGF1Z2hXaW5rMjsKICAgIGZhQ2xvdWRNZWF0YmFsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjbG91ZC1tZWF0YmFsbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNzNiIiwgIk0wIDIyNGMwIDUzIDQzIDk2IDk2IDk2bDI2LjkgMGMzLjUtMTIuMSAxMC4xLTIzLjMgMTkuMi0zMi40bDEuNC0xLjRjMTUtMTUgMzUuMy0yMi45IDU2LjEtMjIuMiAxNC4yLTE1LjEgMzQuMi0yMy45IDU1LjQtMjMuOWwyIDBjMjEuMSAwIDQxLjEgOC44IDU1LjQgMjMuOSAyMC44LS42IDQxLjEgNy4zIDU2LjEgMjIuMmwxLjQgMS40YzkuMiA5LjIgMTUuNyAyMC40IDE5LjIgMzIuNGwyNi45IDBjNTMgMCA5Ni00MyA5Ni05NnMtNDMtOTYtOTYtOTZjLS41IDAtMS4xIDAtMS42IDAgMS4xLTUuMiAxLjYtMTAuNSAxLjYtMTYgMC00NC4yLTM1LjgtODAtODAtODAtMjQuMyAwLTQ2LjEgMTAuOS02MC44IDI4LTE4LjctMzUuNy01Ni4xLTYwLTk5LjItNjAtNjEuOSAwLTExMiA1MC4xLTExMiAxMTIgMCA3LjEgLjcgMTQuMSAxLjkgMjAuOC0zOC4zIDEyLjYtNjUuOSA0OC43LTY1LjkgOTEuMnpNMTU2LjUgNDI0LjNjOS41IDYuMyAxNC4yIDE3LjcgMTEuOSAyOC44LTEuOCA5LjIgMSAxOC43IDcuNyAyNS4zbDEuNCAxLjRjNi42IDYuNiAxNi4xIDkuNSAyNS4zIDcuNyAxMS4xLTIuMiAyMi41IDIuNSAyOC44IDExLjkgNS4yIDcuOCAxNCAxMi41IDIzLjMgMTIuNWwyIDBjOS40IDAgMTguMS00LjcgMjMuMy0xMi41IDYuMy05LjUgMTcuNy0xNC4yIDI4LjgtMTEuOSA5LjIgMS44IDE4LjctMSAyNS4zLTcuN2wxLjQtMS40YzYuNi02LjYgOS41LTE2LjEgNy43LTI1LjMtMi4yLTExLjEgMi41LTIyLjUgMTEuOS0yOC44IDcuOC01LjIgMTIuNS0xNCAxMi41LTIzLjNsMC0yYzAtOS40LTQuNy0xOC4xLTEyLjUtMjMuMy05LjUtNi4zLTE0LjItMTcuNy0xMS45LTI4LjggMS44LTkuMi0xLTE4LjctNy43LTI1LjNsLTEuNC0xLjRjLTYuNi02LjYtMTYuMS05LjUtMjUuMy03LjctMTEuMSAyLjItMjIuNS0yLjUtMjguOC0xMS45LTUuMi03LjgtMTQtMTIuNS0yMy4zLTEyLjVsLTIgMGMtOS40IDAtMTguMSA0LjctMjMuMyAxMi41LTYuMyA5LjUtMTcuNyAxNC4yLTI4LjggMTEuOS05LjItMS44LTE4LjcgMS0yNS4zIDcuN2wtMS40IDEuNGMtNi42IDYuNi05LjUgMTYuMS03LjcgMjUuMyAyLjIgMTEuMS0yLjUgMjIuNS0xMS45IDI4LjgtNy44IDUuMi0xMi41IDE0LTEyLjUgMjMuM2wwIDJjMCA5LjQgNC43IDE4LjEgMTIuNSAyMy4zek00OCA0NDhhNDggNDggMCAxIDAgMC05NiA0OCA0OCAwIDEgMCAwIDk2em00MTYgMGE0OCA0OCAwIDEgMCAwLTk2IDQ4IDQ4IDAgMSAwIDAgOTZ6Il0KICAgIH07CiAgICBmYUNoYXJ0QXJlYSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGFydC1hcmVhIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImFyZWEtY2hhcnQiXSwgImYxZmUiLCAiTTMyIDMyYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzM2YzAgOC44IDcuMiAxNiAxNiAxNmw0MDAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkw4MCA0ODBjLTQ0LjIgMC04MC0zNS44LTgwLTgwTDAgNjRDMCA0Ni4zIDE0LjMgMzIgMzIgMzJ6TTI0MCA5NmM2LjcgMCAxMy4xIDIuOCAxNy43IDcuOEwzMjguOCAxODEuMyAzNzUgMTM1YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwbDY0IDY0YzQuNSA0LjUgNyAxMC42IDcgMTdsMCAxMTJjMCAxMy4zLTEwLjcgMjQtMjQgMjRsLTMwNCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTExMmMwLTYgMi4zLTExLjggNi4zLTE2LjJsODgtOTZjNC41LTUgMTEtNy44IDE3LjctNy44eiJdCiAgICB9OwogICAgZmFBcmVhQ2hhcnQgPSBmYUNoYXJ0QXJlYTsKICAgIGZhUnVwaWFoU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJydXBpYWgtc2lnbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMjNkIiwgIk0wIDY0QzAgNDYuMyAxNC4zIDMyIDMyIDMybDgwIDBjNzkuNSAwIDE0NCA2NC41IDE0NCAxNDQgMCA1NC4zLTMwIDEwMS41LTc0LjQgMTI2LjFsNDEgMTM2LjdjNS4xIDE2LjktNC41IDM0LjgtMjEuNSAzOS44cy0zNC44LTQuNS0zOS44LTIxLjVMMTIwLjEgMzE5LjhjLTIuNyAuMS01LjQgLjItOC4xIC4ybC00OCAwIDAgMTI4YzAgMTcuNy0xNC4zIDMyLTMyIDMyUzAgNDY1LjcgMCA0NDhMMCA2NHpNNjQgMjU2bDQ4IDBjNDQuMiAwIDgwLTM1LjggODAtODBzLTM1LjgtODAtODAtODBsLTQ4IDAgMCAxNjB6bTI1Ni0zMmw4MCAwYzYxLjkgMCAxMTIgNTAuMSAxMTIgMTEyUzQ2MS45IDQ0OCA0MDAgNDQ4bC00OCAwIDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0yNTZjMC0xNy43IDE0LjMtMzIgMzItMzJ6bTgwIDE2MGMyNi41IDAgNDgtMjEuNSA0OC00OHMtMjEuNS00OC00OC00OGwtNDggMCAwIDk2IDQ4IDB6Il0KICAgIH07CiAgICBmYVRleHRXaWR0aCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0ZXh0LXdpZHRoIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYwMzUiLCAiTTQwIDBDMTcuOSAwIDAgMTcuOSAwIDQwTDAgOTZjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTMyIDEyOCAwIDAgMTYwLTMyIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMTI4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTMyIDAgMC0xNjAgMTI4IDAgMCAzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtNTZjMC0yMi4xLTE3LjktNDAtNDAtNDBMNDAgMHptNzguNiA0MDYuNmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMGwtNjQgNjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zbDY0IDY0YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTkuNC05LjQgMjI5LjUgMC05LjQgOS40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwbDY0LTY0YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zbC02NC02NGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNsOS40IDkuNC0yMjkuNSAwIDkuNC05LjR6Il0KICAgIH07CiAgICBmYVNhdGVsbGl0ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzYXRlbGxpdGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg3NTJdLCAiZjdiZiIsICJNMTk5IDdjOS40LTkuNCAyNC42LTkuNCAzMy45IDBsODkuNCA4OS40IDU1LTU1YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDQ4IDQ4YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zbC01NSA1NSA4OS40IDg5LjRjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlsLTk2IDk2Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMGwtODkuNC04OS40LTE1LjUgMTUuNWMxMS40IDI0LjYgMTcuOCA1MiAxNy44IDgwLjkgMCAzMS43LTcuNyA2MS41LTIxLjIgODcuOC00LjcgOS0xNi43IDEwLjMtMjMuOCAzLjFsLTk2LjMtOTYuMy02MCA2MGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNsNjAtNjAtOTYuMy05Ni4zYy03LjItNy4yLTUuOS0xOS4yIDMuMS0yMy44IDI2LjMtMTMuNiA1Ni4yLTIxLjIgODcuOC0yMS4yIDI4LjkgMCA1Ni4zIDYuNCA4MC45IDE3LjhMMTkyLjQgMjI2LjMgMTAzIDEzN2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlMMTk5IDd6bTE3IDUwLjlsLTYyLjEgNjIuMSA3Mi40IDcyLjQgNjIuMS02Mi4xLTcyLjQtNzIuNHpNMzkyIDM1OC4xbDYyLjEtNjIuMS03Mi40LTcyLjQtNjIuMSA2Mi4xIDcyLjQgNzIuNHoiXQogICAgfTsKICAgIGZhTWFnbmlmeWluZ0dsYXNzTWludXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFnbmlmeWluZy1nbGFzcy1taW51cyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJzZWFyY2gtbWludXMiXSwgImYwMTAiLCAiTTQxNiAyMDhjMCA0NS45LTE0LjkgODguMy00MCAxMjIuN0w1MDIuNiA0NTcuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMEwzMzAuNyAzNzZDMjk2LjMgNDAxLjEgMjUzLjkgNDE2IDIwOCA0MTYgOTMuMSA0MTYgMCAzMjIuOSAwIDIwOFM5My4xIDAgMjA4IDAgNDE2IDkzLjEgNDE2IDIwOHpNMTM2IDE4NGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNDQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTQ0IDB6Il0KICAgIH07CiAgICBmYVNlYXJjaE1pbnVzID0gZmFNYWduaWZ5aW5nR2xhc3NNaW51czsKICAgIGZhUGVvcGxlR3JvdXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVvcGxlLWdyb3VwIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1MzMiLCAiTTI1NiAwYTY0IDY0IDAgMSAxIDAgMTI4IDY0IDY0IDAgMSAxIDAtMTI4em05NiAzMTJjMCAyNS0xMi43IDQ3LTMyIDU5LjlsMCA5Mi4xYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0zMiAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTkyLjFDMTcyLjcgMzU5IDE2MCAzMzcgMTYwIDMxMmwwLTQwYzAtNTMgNDMtOTYgOTYtOTZzOTYgNDMgOTYgOTZsMCA0MHpNOTYgMzJhNTYgNTYgMCAxIDEgMCAxMTIgNTYgNTYgMCAxIDEgMC0xMTJ6bTE2IDI0MGwwIDMyYzAgMzIuNSAxMi4xIDYyLjEgMzIgODQuN2wwIDc1LjNjMCAxLjIgMCAyLjUgLjEgMy43LTguNSA3LjYtMTkuNyAxMi4zLTMyLjEgMTIuM2wtMzIgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC01Ni42QzEyLjkgMzY0LjQgMCAzNDMuNyAwIDMyMGwwLTMyYzAtNTMgNDMtOTYgOTYtOTYgMTIuNyAwIDI0LjggMi41IDM1LjkgNi45LTEyLjYgMjEuNC0xOS45IDQ2LjQtMTkuOSA3My4xek0zNjggNDY0bDAtNzUuM2MxOS45LTIyLjUgMzItNTIuMiAzMi04NC43bDAtMzJjMC0yNi43LTcuMy01MS42LTE5LjktNzMuMSAxMS4xLTQuNSAyMy4yLTYuOSAzNS45LTYuOSA1MyAwIDk2IDQzIDk2IDk2bDAgMzJjMCAyMy43LTEyLjkgNDQuNC0zMiA1NS40bDAgNTYuNmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMzIgMGMtMTIuMyAwLTIzLjYtNC42LTMyLjEtMTIuMyAwLTEuMiAuMS0yLjUgLjEtMy43ek00MTYgMzJhNTYgNTYgMCAxIDEgMCAxMTIgNTYgNTYgMCAxIDEgMC0xMTJ6Il0KICAgIH07CiAgICBmYVNxdWFyZUJpbmFyeSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtYmluYXJ5IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU2OWIiLCAiTTAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMzIwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2em0xNDQgNGMtMjQuMyAwLTQ0IDE5LjctNDQgNDRsMCA0OGMwIDI0LjMgMTkuNyA0NCA0NCA0NGwzMiAwYzI0LjMgMCA0NC0xOS43IDQ0LTQ0bDAtNDhjMC0yNC4zLTE5LjctNDQtNDQtNDRsLTMyIDB6bS00IDQ0YzAtMi4yIDEuOC00IDQtNGwzMiAwYzIuMiAwIDQgMS44IDQgNGwwIDQ4YzAgMi4yLTEuOCA0LTQgNGwtMzIgMGMtMi4yIDAtNC0xLjgtNC00bDAtNDh6bTE0MC00NGMtMTEgMC0yMCA5LTIwIDIwIDAgOS43IDYuOSAxNy43IDE2IDE5LjZsMCA3Ni40YzAgMTEgOSAyMCAyMCAyMHMyMC05IDIwLTIwbDAtOTZjMC0xMS05LTIwLTIwLTIwbC0xNiAwek0xMzIgMjk2YzAgOS43IDYuOSAxNy43IDE2IDE5LjZsMCA3Ni40YzAgMTEgOSAyMCAyMCAyMHMyMC05IDIwLTIwbDAtOTZjMC0xMS05LTIwLTIwLTIwbC0xNiAwYy0xMSAwLTIwIDktMjAgMjB6bTk2IDI0bDAgNDhjMCAyNC4zIDE5LjcgNDQgNDQgNDRsMzIgMGMyNC4zIDAgNDQtMTkuNyA0NC00NGwwLTQ4YzAtMjQuMy0xOS43LTQ0LTQ0LTQ0bC0zMiAwYy0yNC4zIDAtNDQgMTkuNy00NCA0NHptNDQtNGwzMiAwYzIuMiAwIDQgMS44IDQgNGwwIDQ4YzAgMi4yLTEuOCA0LTQgNGwtMzIgMGMtMi4yIDAtNC0xLjgtNC00bDAtNDhjMC0yLjIgMS44LTQgNC00eiJdCiAgICB9OwogICAgZmFNYXNrc1RoZWF0ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFza3MtdGhlYXRlciIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyNzkxNywgInRoZWF0ZXItbWFza3MiXSwgImY2MzAiLCAiTS01IDExOEwyMy41IDI3OS43YzE0IDc5LjUgNzYuMyAxNDEuOCAxNTUuOCAxNTUuOGwxMi43IDIuMmMtMTYuNS0yOC42LTI3LjEtNjAuNy0zMC42LTk0LjVsLTI0LjEgNC4zYy05LjcgMS43LTE4LjgtNS44LTE2LjktMTUuNSA0LjgtMjQuNyAxOS4xLTQ2LjYgMzkuNy02MC45bDAtNzQuNmMtMS40IC44LTMgMS4zLTQuNyAxLjZsLTYzIDExLjFjLTguNyAxLjUtMTcuMy00LjQtMTUuOS0xMy4xIDMuMS0xOS42IDE4LjQtMzYgMzkuMS0zOS43IDE3LjItMyAzMy45IDMuNSA0NC42IDE1LjhsMC0yMi43YzAtMjIuNSA2LjktNTIuNCAzMi4zLTczLjQgMjYtMjEuNSA2Ny43LTQzLjkgMTI0LjktNTQuMi0zMC41LTE2LjMtODYuMy0zMi0xNjMuOC0xOC40LTgwLjMgMTQuMi0xMjggNTAuMS0xNTAuMSA3Ni4xLTkgMTAuNS0xMC44IDI0LjktOC40IDM4LjV6TTIwOCAxMzguN2wwIDE3NC44YzAgODAuNyA1MC41IDE1Mi45IDEyNi40IDE4MC40TDM2Mi4xIDUwNGMxNC4xIDUuMSAyOS42IDUuMSA0My43IDBMNDMzLjYgNDk0QzUwOS41IDQ2Ni40IDU2MCAzOTQuMyA1NjAgMzEzLjVsMC0xNzQuOGMwLTYuOS0yLjEtMTMuOC03LTE4LjYtMjIuNi0yMi41LTc4LjItNTYtMTY5LTU2cy0xNDYuNCAzMy42LTE2OSA1NmMtNC45IDQuOS03IDExLjctNyAxOC42em02Ni4xIDE4Ny4xYy0xLjQtNyA3LTExIDEyLjctNi42IDI2LjkgMjAuNiA2MC42IDMyLjkgOTcuMiAzMi45czcwLjItMTIuMyA5Ny4yLTMyLjljNS43LTQuNCAxNC4xLS40IDEyLjcgNi42LTEwLjEgNTEuNC01NS41IDkwLjMtMTA5LjkgOTAuM3MtOTkuOC0zOC44LTEwOS45LTkwLjN6bS41LTEwMS41QzI4MS4yIDIwNS41IDI5OSAxOTIgMzIwIDE5MnMzOC45IDEzLjUgNDUuNCAzMi4zYzIuOSA4LjQtNC41IDE1LjctMTMuNCAxNS43bC02NCAwYy04LjggMC0xNi4zLTcuNC0xMy40LTE1Ljd6TTQ4MCAyNDBsLTY0IDBjLTguOCAwLTE2LjMtNy40LTEzLjQtMTUuNyA2LjUtMTguOCAyNC40LTMyLjMgNDUuNC0zMi4zczM4LjkgMTMuNSA0NS40IDMyLjNjMi45IDguNC00LjUgMTUuNy0xMy40IDE1Ljd6Il0KICAgIH07CiAgICBmYVRoZWF0ZXJNYXNrcyA9IGZhTWFza3NUaGVhdGVyOwogICAgZmFDYXJ0UGx1cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYXJ0LXBsdXMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjIxNyIsICJNMCA4QzAtNS4zIDEwLjctMTYgMjQtMTZsNDUuMyAwYzI3LjEgMCA1MC4zIDE5LjQgNTUuMSA0NmwuNCAyIDQxMi43IDBjMjAgMCAzNS4xIDE4LjIgMzEuNCAzNy45TDUzNy44IDIzNS44Yy01LjcgMzAuMy0zMi4xIDUyLjItNjIuOSA1Mi4ybC0zMDMuNiAwIDUuMSAyOC4zYzIuMSAxMS40IDEyIDE5LjcgMjMuNiAxOS43TDQ1NiAzMzZjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTI1NS45IDBjLTM0LjggMC02NC42LTI0LjktNzAuOC01OS4xTDc3LjIgMzguNmMtLjctMy44LTQtNi42LTcuOS02LjZMMjQgMzJDMTAuNyAzMiAwIDIxLjMgMCA4ek0xNjAgNDY0YTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6bTIyNCAwYTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6TTMzNiA3OC40Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDMzLjYtMzMuNiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDMzLjYgMCAwIDMzLjZjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTMzLjYgMzMuNiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0zMy42IDAgMC0zMy42YzAtMTMuMy0xMC43LTI0LTI0LTI0eiJdCiAgICB9OwogICAgZmFIYW5kc0FzbEludGVycHJldGluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kcy1hc2wtaW50ZXJwcmV0aW5nIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbImFtZXJpY2FuLXNpZ24tbGFuZ3VhZ2UtaW50ZXJwcmV0aW5nIiwgImFzbC1pbnRlcnByZXRpbmciLCAiaGFuZHMtYW1lcmljYW4tc2lnbi1sYW5ndWFnZS1pbnRlcnByZXRpbmciXSwgImYyYTMiLCAiTTE1Ni42IDQ2LjNjNy45LTE1LjggMS41LTM1LTE0LjMtNDIuOXMtMzUtMS41LTQyLjkgMTQuM0wxMy41IDE4OS40QzQuNiAyMDcuMiAwIDIyNi44IDAgMjQ2LjdMMCAyNTZjMCA3MC43IDU3LjMgMTI4IDEyOCAxMjhsODAgMCAwLS4zYzM1LjItMi43IDY1LjQtMjIuOCA4Mi4xLTUxLjcgOC44LTE1LjMgMy42LTM0LjktMTEuNy00My43cy0zNC45LTMuNi00My43IDExLjdjLTcgMTItMTkuOSAyMC0zNC43IDIwLTIyLjEgMC00MC0xNy45LTQwLTQwczE3LjktNDAgNDAtNDBjMTQuOCAwIDI3LjcgOCAzNC43IDIwIDguOCAxNS4zIDI4LjQgMjAuNSA0My43IDExLjdzMjAuNS0yOC40IDExLjctNDMuN2MtMTIuOC0yMi4xLTMzLjYtMzkuMS01OC40LTQ3LjFsODAuOC0yMmMxNy00LjYgMjcuMS0yMi4yIDIyLjUtMzkuM3MtMjIuMi0yNy4xLTM5LjMtMjIuNWwtMTAwLjcgMjcuNSA4MS42LTY4YzEzLjYtMTEuMyAxNS40LTMxLjUgNC4xLTQ1LjFTMjQ5LjEtMy45IDIzNS41IDcuNGwtMTAxLjkgODQuOSAyMy00NnpNNDgzLjQgNDY1LjdjLTcuOSAxNS44LTEuNSAzNSAxNC4zIDQyLjlzMzUgMS41IDQyLjktMTQuM2w4NS45LTE3MS43YzguOS0xNy44IDEzLjUtMzcuNCAxMy41LTU3LjJsMC05LjNjMC03MC43LTU3LjMtMTI4LTEyOC0xMjhsLTgwIDAgMCAuM2MtMzUuMiAyLjctNjUuNCAyMi44LTgyLjEgNTEuNy04LjkgMTUuMy0zLjYgMzQuOSAxMS43IDQzLjdzMzQuOSAzLjYgNDMuNy0xMS43YzctMTIgMTkuOS0yMCAzNC43LTIwIDIyLjEgMCA0MCAxNy45IDQwIDQwcy0xNy45IDQwLTQwIDQwYy0xNC44IDAtMjcuNy04LTM0LjctMjAtOC45LTE1LjMtMjguNC0yMC41LTQzLjctMTEuN3MtMjAuNSAyOC40LTExLjcgNDMuN2MxMi44IDIyLjEgMzMuNiAzOS4xIDU4LjQgNDcuMWwtODAuOCAyMmMtMTcuMSA0LjYtMjcuMSAyMi4yLTIyLjUgMzkuM3MyMi4yIDI3LjEgMzkuMyAyMi41bDEwMC43LTI3LjUtODEuNiA2OGMtMTMuNiAxMS4zLTE1LjQgMzEuNS00LjEgNDUuMXMzMS41IDE1LjQgNDUuMSA0LjFsMTAxLjktODQuOS0yMyA0NnoiXQogICAgfTsKICAgIGZhQW1lcmljYW5TaWduTGFuZ3VhZ2VJbnRlcnByZXRpbmcgPSBmYUhhbmRzQXNsSW50ZXJwcmV0aW5nOwogICAgZmFBc2xJbnRlcnByZXRpbmcgPSBmYUhhbmRzQXNsSW50ZXJwcmV0aW5nOwogICAgZmFIYW5kc0FtZXJpY2FuU2lnbkxhbmd1YWdlSW50ZXJwcmV0aW5nID0gZmFIYW5kc0FzbEludGVycHJldGluZzsKICAgIGZhVGFibGVDZWxsc1Jvd1VubG9jayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWJsZS1jZWxscy1yb3ctdW5sb2NrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU2OTEiLCAiTTI1NiAyMjRsMCAxOTIgNjQgMCAwLTE5Mi02NCAwem0yNTYtNzljLTQ2LjcgNS44LTg1LjYgMzYuOC0xMDIuNyA3OWwtMjUuMyAwIDAgOTAuOGMtMTAuMSAxNS4yLTE2IDMzLjQtMTYgNTMuMWwwIDk2YzAgNS41IC41IDEwLjkgMS4zIDE2LjFMMTI4IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMNjQgOTZjMC0zNS4zIDI4LjctNjQgNjQtNjRsMzIwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCA0OXpNMTI4IDIyNGwwIDE5MiA2NCAwIDAtMTkyLTY0IDB6bTQzMiA0OGMtLjEtMTcuNi0xNC40LTMxLjktMzItMzEuOS0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDQ3LjkgOTYgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDk2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xMjggMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC05NmMwLTIwLjkgMTMuNC0zOC43IDMyLTQ1LjNsMC01MC42YzAtNDQuMiAzNS44LTgwIDgwLTgwIDQ0LjIgMCA3OS45IDM1LjggODAgNzkuOWwtNDggMHoiXQogICAgfTsKICAgIGZhUm9ja2V0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJvY2tldCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMTM1IiwgIk0xMjggMzIwTDI0LjUgMzIwYy0yNC45IDAtNDAuMi0yNy4xLTI3LjQtNDguNUw1MCAxODMuM0M1OC43IDE2OC44IDc0LjMgMTYwIDkxLjIgMTYwbDk1IDBjNzYuMS0xMjguOSAxODkuNi0xMzUuNCAyNjUuNS0xMjQuMyAxMi44IDEuOSAyMi44IDExLjkgMjQuNiAyNC42IDExLjEgNzUuOSA0LjYgMTg5LjQtMTI0LjMgMjY1LjVsMCA5NWMwIDE2LjktOC44IDMyLjUtMjMuMyA0MS4ybC04OC4yIDUyLjljLTIxLjMgMTIuOC00OC41LTIuNi00OC41LTI3LjRMMTkyIDM4NGMwLTM1LjMtMjguNy02NC02NC02NGwtLjEgMHpNNDAwIDE2MGE0OCA0OCAwIDEgMCAtOTYgMCA0OCA0OCAwIDEgMCA5NiAweiJdCiAgICB9OwogICAgZmFTaHJpbXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2hyaW1wIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI5NDI0XSwgImU0NDgiLCAiTTcyIDMyQzMyLjIgMzIgMCA2NC4yIDAgMTA0IDAgMTQxLjkgMjkuMyAxNzIuOSA2Ni40IDE3NS44IDc3LjYgMjU3LjIgMTQ3LjQgMzIwIDIzMiAzMjBsNTYgMCAwLTE5Mi0yMTYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRTNTguNyA4MCA3MiA4MGwzODQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNEw3MiAzMnpNMjI0IDQ1NmMwIDEzLjMgMTAuNyAyNCAyNCAyNGw3MiAwIDAtNzIuMi02NC4xLTIyLjRjLTEyLjUtNC40LTI2LjIgMi4yLTMwLjYgMTQuN3MyLjIgMjYuMiAxNC43IDMwLjZsNC41IDEuNkMyMzMgNDMzLjkgMjI0IDQ0My45IDIyNCA0NTZ6bTEyOCAyMy4zYzM2LjQtMy4zIDY5LjUtMTcuNiA5Ni4xLTM5LjZsLTg2LjUtMzQuNmMtMyAxLjgtNi4yIDMuMi05LjYgNC4zbDAgNjkuOXpNNDcyLjYgNDE1YzI0LjYtMzAuMyAzOS40LTY4LjkgMzkuNC0xMTEgMC0xMi4zLTEuMy0yNC4zLTMuNy0zNS45TDM4Mi44IDM1NS4xYy44IDMuNCAxLjIgNyAxLjIgMTAuNiAwIDQuNi0uNyA5LTEuOSAxMy4xTDQ3Mi42IDQxNXpNMzM2IDEyOGwtMTYgMCAwIDE5MiAxOC4zIDBjOS45IDAgMTkuMSAzLjIgMjYuNiA4LjVsMTMzLjUtOTIuNEM0NzEuOCAxNzIuNiA0MDkuMSAxMjggMzM2IDEyOHpNMTY4IDE5MmEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAweiJdCiAgICB9OwogICAgZmFUZW5nZVNpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGVuZ2Utc2lnbiIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzgzNzYsICJ0ZW5nZSJdLCAiZjdkNyIsICJNMCA1NkMwIDQyLjcgMTAuNyAzMiAyNCAzMmwzMzYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNEwyNCA4MEMxMC43IDgwIDAgNjkuMyAwIDU2ek0wIDE2MGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzMjAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTI4IDAgMCAyNTZjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0yNTYtMTI4IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyeiJdCiAgICB9OwogICAgZmFUZW5nZSA9IGZhVGVuZ2VTaWduOwogICAgZmFIb3VzZUNoaW1uZXlNZWRpY2FsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLWNoaW1uZXktbWVkaWNhbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJjbGluaWMtbWVkaWNhbCJdLCAiZjdmMiIsICJNMjM0LjIgOC42YzEyLjMtMTEuNCAzMS4zLTExLjQgNDMuNSAwTDM2OCA5Mi4zIDM2OCA4MGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTAxLjUgMzcuOCAzNS4xYzkuNiA5IDEyLjggMjIuOSA4IDM1LjFTNDkzLjIgMjcyIDQ4MCAyNzJsLTE2IDAgMCAxNzZjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTI4OCAwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTE3Ni0xNiAwYy0xMy4yIDAtMjUtOC4xLTI5LjgtMjAuM3MtMS42LTI2LjIgOC0zNS4xbDIyNC0yMDh6TTIyNCAyNDhsMCA0MC00MCAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsNDAgMCAwIDQwYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTQwIDQwIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC00MCAwIDAtNDBjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6Il0KICAgIH07CiAgICBmYUNsaW5pY01lZGljYWwgPSBmYUhvdXNlQ2hpbW5leU1lZGljYWw7CiAgICBmYVVzZXJzU2xhc2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlcnMtc2xhc2giLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTA3MyIsICJNNzMtMjQuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTMjkuNy0uMyAzOSA5LjFsNTI4IDUyOGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlMMzIxLjggMjI0YzU2LjYtMSAxMDIuMi00Ny4yIDEwMi4yLTEwNCAwLTU3LjQtNDYuNi0xMDQtMTA0LTEwNC01Ni44IDAtMTAzIDQ1LjYtMTA0IDEwMi4yTDczLTI0Ljl6TTUxMiAyODhjLTE3LjIgMC0zMy43IDMuNC00OC43IDkuNmwxNzAgMTcwYzQuMi01LjQgNi43LTEyLjIgNi43LTE5LjZsMC0zMmMwLTcwLjctNTcuMy0xMjgtMTI4LTEyOHpNNTkuOSA5Ny43Yy0yMS41IDEyLjUtMzUuOSAzNS43LTM1LjkgNjIuMyAwIDM5LjggMzIuMiA3MiA3MiA3MiAyNi42IDAgNDkuOC0xNC40IDYyLjMtMzUuOUw1OS45IDk3Ljd6TTI1MC4yIDI4OEMxOTYuOCAzMTMuOSAxNjAgMzY4LjcgMTYwIDQzMmwwIDE2YzAgMTcuNyAxNC4zIDMyIDMyIDMybDI1MC4yIDAtMTkyLTE5MnpNMTI4IDI4OEM1Ny4zIDI4OCAwIDM0NS4zIDAgNDE2bDAgMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJsODYuNyAwYy00LjMtOS44LTYuNy0yMC42LTYuNy0zMmwwLTE2YzAtNTMuMiAyMC0xMDEuOCA1Mi45LTEzOC42LTExLjctMy41LTI0LjEtNS40LTM2LjktNS40ek02MTYgMTYwYTcyIDcyIDAgMSAwIC0xNDQgMCA3MiA3MiAwIDEgMCAxNDQgMHoiXQogICAgfTsKICAgIGZhUGFwZXJQbGFuZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGFwZXItcGxhbmUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFs2MTkxM10sICJmMWQ4IiwgIk01MzYuNC0yNi4zYzkuOC0zLjUgMjAuNi0xIDI4IDYuM3M5LjggMTguMiA2LjMgMjhsLTE3OCA0OTYuOWMtNSAxMy45LTE4LjEgMjMuMS0zMi44IDIzLjEtMTQuMiAwLTI3LTguNi0zMi4zLTIxLjdsLTY0LjItMTU4Yy00LjUtMTEtMi41LTIzLjYgNS4yLTMyLjZsOTQuNS0xMTIuNGM1LjEtNi4xIDQuNy0xNS0uOS0yMC42cy0xNC42LTYtMjAuNi0uOUwyMjkuMiAyNzYuMWMtOS4xIDcuNi0yMS42IDkuNi0zMi42IDUuMkwzOC4xIDIxNi44Yy0xMy4xLTUuMy0yMS43LTE4LjEtMjEuNy0zMi4zIDAtMTQuNyA5LjItMjcuOCAyMy4xLTMyLjhsNDk2LjktMTc4eiJdCiAgICB9OwogICAgZmFCb29rQXRsYXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm9vay1hdGxhcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJhdGxhcyJdLCAiZjU1OCIsICJNOTYgNTEybDMyMCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybDAtNjYuN2MxOC42LTYuNiAzMi0yNC40IDMyLTQ1LjNsMC0yODhjMC0yNi41LTIxLjUtNDgtNDgtNDhMOTYgMEM0MyAwIDAgNDMgMCA5NkwwIDQxNmMwIDUzIDQzIDk2IDk2IDk2ek02NCA0MTZjMC0xNy43IDE0LjMtMzIgMzItMzJsMjU2IDAgMCA2NC0yNTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6TTMxMC42IDIwOEwyNzkgMjA4Yy0xLjQgMjMuMS02IDQ0LjItMTIuNiA2MS4yIDIyLjctMTIuNSAzOS40LTM0LjggNDQuMi02MS4yem0tMTczLjEgMGM0LjggMjYuNCAyMS41IDQ4LjcgNDQuMiA2MS4yLTYuNy0xNy0xMS4yLTM4LTEyLjYtNjEuMmwtMzEuNiAwem03Ni40IDU1YzQuNSA5LjYgOC4yIDEzLjggMTAuMiAxNS41IDItMS43IDUuNy01LjggMTAuMi0xNS41IDYuMi0xMy40IDExLjEtMzIuNSAxMi43LTU1bC00NS44IDBjMS42IDIyLjUgNi41IDQxLjYgMTIuNyA1NXptLTEyLjctODdsNDUuOCAwYy0xLjYtMjIuNS02LjUtNDEuNi0xMi43LTU1LTQuNS05LjYtOC4yLTEzLjgtMTAuMi0xNS41LTIgMS43LTUuNyA1LjgtMTAuMiAxNS41LTYuMiAxMy40LTExLjEgMzIuNS0xMi43IDU1em0xMDkuNSAwYy00LjgtMjYuNC0yMS41LTQ4LjctNDQuMi02MS4yIDYuNyAxNyAxMS4yIDM4IDEyLjYgNjEuMmwzMS42IDB6TTE2OSAxNzZjMS40LTIzLjEgNi00NC4yIDEyLjYtNjEuMi0yMi43IDEyLjUtMzkuNCAzNC44LTQ0LjIgNjEuMmwzMS42IDB6TTk2IDE5MmExMjggMTI4IDAgMSAxIDI1NiAwIDEyOCAxMjggMCAxIDEgLTI1NiAweiJdCiAgICB9OwogICAgZmFBdGxhcyA9IGZhQm9va0F0bGFzOwogICAgZmFUYWJsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWJsZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMGNlIiwgIk0zODQgMzJjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTMyMCAwLTYuNS0uM0MyNS4yIDQ3Ni40IDAgNDQ5LjEgMCA0MTZMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMHpNNjQgMzIwbDAgOTYgMTI4IDAgMC05Ni0xMjggMHptMTkyIDBsMCA5NiAxMjggMCAwLTk2LTEyOCAwek02NCAyNTZsMTI4IDAgMC05Ni0xMjggMCAwIDk2em0xOTIgMGwxMjggMCAwLTk2LTEyOCAwIDAgOTZ6Il0KICAgIH07CiAgICBmYUhlYXJ0MiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoZWFydCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODE1MywgMTI4MTU0LCAxMjgxNTUsIDEyODE1NiwgMTI4NDIwLCAxMjkyOTMsIDEyOTI5NCwgMTI5NTA1LCA5ODI5LCAxMDA4NCwgNjE1NzhdLCAiZjAwNCIsICJNMjQxIDg3LjFsMTUgMjAuNyAxNS0yMC43QzI5NiA1Mi41IDMzNi4yIDMyIDM3OC45IDMyIDQ1Mi40IDMyIDUxMiA5MS42IDUxMiAxNjUuMWwwIDIuNmMwIDExMi4yLTEzOS45IDI0Mi41LTIxMi45IDI5OC4yLTEyLjQgOS40LTI3LjYgMTQuMS00My4xIDE0LjFzLTMwLjgtNC42LTQzLjEtMTQuMUMxMzkuOSA0MTAuMiAwIDI3OS45IDAgMTY3LjdsMC0yLjZDMCA5MS42IDU5LjYgMzIgMTMzLjEgMzIgMTc1LjggMzIgMjE2IDUyLjUgMjQxIDg3LjF6Il0KICAgIH07CiAgICBmYUNpcmNsZUNoZXZyb25VcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtY2hldnJvbi11cCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJjaGV2cm9uLWNpcmNsZS11cCJdLCAiZjEzOSIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTM3NyAyNzFjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtODctODctODcgODdjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlMMjM5IDE2N2M5LjQtOS40IDI0LjYtOS40IDMzLjkgMEwzNzcgMjcxeiJdCiAgICB9OwogICAgZmFDaGV2cm9uQ2lyY2xlVXAgPSBmYUNpcmNsZUNoZXZyb25VcDsKICAgIGZhQmF0dGVyeUhhbGYgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmF0dGVyeS1oYWxmIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbImJhdHRlcnktMyJdLCAiZjI0MiIsICJNNTI4IDEyOGM4LjggMCAxNiA3LjIgMTYgMTZsMCAyMjRjMCA4LjgtNy4yIDE2LTE2IDE2bC00MTYgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMjI0YzAtOC44IDcuMi0xNiAxNi0xNmw0MTYgMHpNMTEyIDY0Yy00NC4yIDAtODAgMzUuOC04MCA4MGwwIDIyNGMwIDQ0LjIgMzUuOCA4MCA4MCA4MGw0MTYgMGM0NC4yIDAgODAtMzUuOCA4MC04MGwwLTQ4YzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNjRjMC0xNy43LTE0LjMtMzItMzItMzJsMC00OGMwLTQ0LjItMzUuOC04MC04MC04MEwxMTIgNjR6bTU2IDExMmMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAxMTJjMCAxMy4zIDEwLjcgMjQgMjQgMjRsMTQ0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC0xMTJjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTE0NCAweiJdCiAgICB9OwogICAgZmFCYXR0ZXJ5MyA9IGZhQmF0dGVyeUhhbGY7CiAgICBmYUZvbnRBd2Vzb21lMyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmb250LWF3ZXNvbWUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MjUwMSwgNjI2OTQsICJmb250LWF3ZXNvbWUtZmxhZyIsICJmb250LWF3ZXNvbWUtbG9nby1mdWxsIl0sICJmMmI0IiwgIk05MS43IDk2QzEwNi4zIDg2LjggMTE2IDcwLjUgMTE2IDUyIDExNiAyMy4zIDkyLjcgMCA2NCAwUzEyIDIzLjMgMTIgNTJjMCAxNi43IDcuOCAzMS41IDIwIDQxbDAgNDE5IDY0IDAgMC02NCAzNzMuNiAwYzE0LjYgMCAyNi40LTExLjggMjYuNC0yNi40IDAtMy43LS44LTcuMy0yLjMtMTAuN0w0MzIgMjcyIDQ5My43IDEzMy4xYzEuNS0zLjQgMi4zLTcgMi4zLTEwLjcgMC0xNC42LTExLjgtMjYuNC0yNi40LTI2LjRMOTEuNyA5NnoiXQogICAgfTsKICAgIGZhRm9udEF3ZXNvbWVGbGFnMyA9IGZhRm9udEF3ZXNvbWUzOwogICAgZmFGb250QXdlc29tZUxvZ29GdWxsMyA9IGZhRm9udEF3ZXNvbWUzOwogICAgZmFIYW5kY3VmZnMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZGN1ZmZzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU0ZjgiLCAiTTMyMC0zMmMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMiAxNC4zIDMyIDMyIDMyIDMyLTE0LjMgMzItMzJ6TTE5MiA2NGEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6TTE1MiA5NmMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAxNmMwIDEgLjEgMS45IC4yIDIuOS03NC43IDI2LjMtMTI4LjIgOTcuNS0xMjguMiAxODEuMSAwIDEwNiA4NiAxOTIgMTkyIDE5MnMxOTItODYgMTkyLTE5MmMwLTgzLjctNTMuNS0xNTQuOC0xMjguMi0xODEuMSAuMS0uOSAuMi0xLjkgLjItMi45bDAtMTZjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTgwIDB6TTY0IDMyMGExMjggMTI4IDAgMSAxIDI1NiAwIDEyOCAxMjggMCAxIDEgLTI1NiAwem00NDggMGMwIDY2LjktNTEuMyAxMjEuOC0xMTYuNiAxMjcuNS0xNC4zIDIyLjgtMzIuNCA0My4xLTUzLjQgNTkuOSAxMy41IDMgMjcuNiA0LjYgNDIgNC42IDEwNiAwIDE5Mi04NiAxOTItMTkyIDAtODMuNy01My41LTE1NC44LTEyOC4yLTE4MS4xIC4xLS45IC4yLTEuOSAuMi0yLjlsMC0xNmMwLTEzLjMtMTAuNy0yNC0yNC0yNGwtODAgMGMtMTIuMyAwLTIyLjQgOS4yLTIzLjggMjEuMSAzMC4zIDE5LjIgNTYuMSA0NSA3NS4yIDc1LjQgNjUuNCA1LjggMTE2LjYgNjAuNiAxMTYuNiAxMjcuNXpNMzg0IDY0YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHoiXQogICAgfTsKICAgIGZhSGF0Q293Ym95U2lkZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYXQtY293Ym95LXNpZGUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjhjMSIsICJNNjQwIDM4OC4zYzAgMTYuOS03LjEgMzIuMi0xOC40IDQzLjFsLTM1LTIzLjMtMjkyLjctMTk1LjFjLTM2LjEtMjQuMS03OC42LTM2LjktMTIyLTM2LjlsLTMuOSAwYy0yLjcgMC01LjQgMC04IC4xbDIyLjItMTAwYzUuNy0yNS44IDI4LjYtNDQuMSA1NS00NC4xIDEyLjIgMCAyNC4xIDQgMzMuOCAxMS4zbDQuNyAzLjVjMjYuMyAxOS43IDYyLjQgMTkuNyA4OC42IDBsNC43LTMuNWM5LjgtNy4zIDIxLjYtMTEuMyAzMy44LTExLjMgMjYuNCAwIDQ5LjMgMTguMyA1NSA0NC4xbDMzIDE0OC41QzU3NC41IDIzMi4zIDY0MCAzMDIuNiA2NDAgMzg4LjN6TTE3MS45IDIyNGMzMy45IDAgNjcuMSAxMCA5NS40IDI4LjlMNTYwIDQ0OCA1NiA0NDhjLTMwLjkgMC01Ni0yNS4xLTU2LTU2IDAtOTIuOCA3NS4yLTE2OCAxNjgtMTY4bDMuOSAweiJdCiAgICB9OwogICAgZmFJbmR1c3RyeSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJpbmR1c3RyeSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjc1IiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0TDAgNDMyYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDQxNiAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMjc5LjhjMC0xOC4yLTE5LjQtMjkuNy0zNS40LTIxLjFsLTE1Ni42IDg0LjMgMC02My4yYzAtMTguMi0xOS40LTI5LjctMzUuNC0yMS4xTDEyOCAyMTUuNCAxMjggNjRjMC0xNy43LTE0LjMtMzItMzItMzJMMzIgMzJ6Il0KICAgIH07CiAgICBmYUxpbmVzTGVhbmluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsaW5lcy1sZWFuaW5nIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImU1MWUiLCAiTTE5MC40IDc0LjFjNS42LTE2LjgtMy41LTM0LjktMjAuMi00MC41cy0zNC45IDMuNS00MC41IDIwLjJsLTEyOCAzODRjLTUuNiAxNi44IDMuNSAzNC45IDIwLjIgNDAuNXMzNC45LTMuNSA0MC41LTIwLjJsMTI4LTM4NHptNzAuOS00MS43Yy0xNy40LTIuOS0zMy45IDguOS0zNi44IDI2LjNsLTY0IDM4NGMtMi45IDE3LjQgOC45IDMzLjkgMjYuMyAzNi44czMzLjktOC45IDM2LjgtMjYuM2w2NC0zODRjMi45LTE3LjQtOC45LTMzLjktMjYuMy0zNi44ek0zNTIgMzJjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgMzg0YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zODRjMC0xNy43LTE0LjMtMzItMzItMzJ6Il0KICAgIH07CiAgICBmYVBhc3Nwb3J0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBhc3Nwb3J0IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY1YWIiLCAiTTAgNjRDMCAyOC43IDI4LjcgMCA2NCAwTDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzg0YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA2NHpNOTYgNDA4YzAgMTMuMyAxMC43IDI0IDI0IDI0bDE0NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xNDQgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjR6TTI3OC42IDIwOGMtNC44IDI2LjQtMjEuNSA0OC43LTQ0LjIgNjEuMiA2LjctMTcgMTEuMi0zOCAxMi42LTYxLjJsMzEuNiAwem0tMTczLjEgMGwzMS42IDBjMS40IDIzLjEgNiA0NC4yIDEyLjYgNjEuMi0yMi43LTEyLjUtMzkuNC0zNC44LTQ0LjItNjEuMnptNzYuNCA1NWMtNi4yLTEzLjQtMTEuMS0zMi41LTEyLjctNTVsNDUuOCAwYy0xLjYgMjIuNS02LjUgNDEuNi0xMi43IDU1LTQuNSA5LjYtOC4yIDEzLjgtMTAuMiAxNS41LTItMS43LTUuNy01LjgtMTAuMi0xNS41em0wLTE0MmM0LjUtOS42IDguMi0xMy44IDEwLjItMTUuNSAyIDEuNyA1LjcgNS44IDEwLjIgMTUuNSA2LjIgMTMuNCAxMS4xIDMyLjUgMTIuNyA1NWwtNDUuOCAwYzEuNi0yMi41IDYuNS00MS42IDEyLjctNTV6bTk2LjcgNTVMMjQ3IDE3NmMtMS40LTIzLjEtNi00NC4yLTEyLjYtNjEuMiAyMi43IDEyLjUgMzkuNCAzNC44IDQ0LjIgNjEuMnpNMTM3IDE3NmwtMzEuNiAwYzQuOC0yNi40IDIxLjUtNDguNyA0NC4yLTYxLjItNi43IDE3LTExLjIgMzgtMTIuNiA2MS4yem0xODMgMTZhMTI4IDEyOCAwIDEgMCAtMjU2IDAgMTI4IDEyOCAwIDEgMCAyNTYgMHoiXQogICAgfTsKICAgIGZhSW5maW5pdHkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaW5maW5pdHkiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFs4NzM0LCA5ODU0XSwgImY1MzQiLCAiTTAgMjU2YzAtODguNCA3MS42LTE2MCAxNjAtMTYwIDUwLjQgMCA5Ny44IDIzLjcgMTI4IDY0bDMyIDQyLjcgMzItNDIuN2MzMC4yLTQwLjMgNzcuNi02NCAxMjgtNjQgODguNCAwIDE2MCA3MS42IDE2MCAxNjBTNTY4LjQgNDE2IDQ4MCA0MTZjLTUwLjQgMC05Ny44LTIzLjctMTI4LTY0bC0zMi00Mi43LTMyIDQyLjdjLTMwLjIgNDAuMy03Ny42IDY0LTEyOCA2NC04OC40IDAtMTYwLTcxLjYtMTYwLTE2MHptMjgwIDBsLTQzLjItNTcuNmMtMTguMS0yNC4yLTQ2LjYtMzguNC03Ni44LTM4LjQtNTMgMC05NiA0My05NiA5NnM0MyA5NiA5NiA5NmMzMC4yIDAgNTguNy0xNC4yIDc2LjgtMzguNEwyODAgMjU2em04MCAwbDQzLjIgNTcuNmMxOC4xIDI0LjIgNDYuNiAzOC40IDc2LjggMzguNCA1MyAwIDk2LTQzIDk2LTk2cy00My05Ni05Ni05NmMtMzAuMiAwLTU4LjcgMTQuMi03Ni44IDM4LjRMMzYwIDI1NnoiXQogICAgfTsKICAgIGZhQ2xvbmUyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNsb25lIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyNGQiLCAiTTI4OCA0NDhsLTIyNCAwIDAtMjI0IDQ4IDAgMC02NC00OCAwYy0zNS4zIDAtNjQgMjguNy02NCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyMjQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTQ4LTY0IDAgMCA0OHptLTY0LTk2bDIyNCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjI0YzAtMzUuMy0yOC43LTY0LTY0LTY0TDIyNCAwYy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDIyNGMwIDM1LjMgMjguNyA2NCA2NCA2NHoiXQogICAgfTsKICAgIGZhRm9yd2FyZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmb3J3YXJkIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbOTE5M10sICJmMDRlIiwgIk0zNzEuNyA0My4xQzM2MC4xIDMyIDM0MyAyOC45IDMyOC4zIDM1LjJTMzA0IDU2IDMwNCA3MmwwIDEzNi4zLTE3Mi4zLTE2NS4xQzEyMC4xIDMyIDEwMyAyOC45IDg4LjMgMzUuMlM2NCA1NiA2NCA3MmwwIDM2OGMwIDE2IDkuNiAzMC41IDI0LjMgMzYuOHMzMS44IDMuMiA0My40LTcuOUwzMDQgMzAzLjcgMzA0IDQ0MGMwIDE2IDkuNiAzMC41IDI0LjMgMzYuOHMzMS44IDMuMiA0My40LTcuOWwxOTItMTg0YzcuOS03LjUgMTIuMy0xOCAxMi4zLTI4LjlzLTQuNS0yMS4zLTEyLjMtMjguOWwtMTkyLTE4NHoiXQogICAgfTsKICAgIGZhTSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTA5XSwgIjRkIiwgIk0yMi43IDMzLjRjMTMuNS00LjEgMjguMSAxLjEgMzUuOSAxMi45TDIyNCAyOTQuMyAzODkuNCA0Ni4zYzcuOC0xMS43IDIyLjQtMTcgMzUuOS0xMi45UzQ0OCA0OS45IDQ0OCA2NGwwIDM4NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTI3OC4zLTEzMy40IDIwMC4xYy01LjkgOC45LTE1LjkgMTQuMi0yNi42IDE0LjJzLTIwLjctNS4zLTI2LjYtMTQuMkw2NCAxNjkuNyA2NCA0NDhjMCAxNy43LTE0LjMgMzItMzIgMzJTMCA0NjUuNyAwIDQ0OEwwIDY0QzAgNDkuOSA5LjIgMzcuNSAyMi43IDMzLjR6Il0KICAgIH07CiAgICBmYVJvYWRTcGlrZXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicm9hZC1zcGlrZXMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU2OCIsICJNNjQgMTE2LjhjMC0xNS44IDIwLjUtMjIgMjkuMy04LjlsOTguNyAxNDggMC0xMzkuMmMwLTE1LjggMjAuNS0yMiAyOS4zLTguOWw5OC43IDE0OCAwLTEzOS4yYzAtMTUuOCAyMC41LTIyIDI5LjMtOC45bDk4LjcgMTQ4IDAtMTM5LjJjMC0xNS44IDIwLjUtMjIgMjkuMy04LjlMNjA2LjggMzAyLjJjMTQuMiAyMS4zLTEuMSA0OS44LTI2LjYgNDkuOEw2NCAzNTIgNjQgMTE2Ljh6TTMyIDM4NGw1NzYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA0NDhjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJ6Il0KICAgIH07CiAgICBmYU1vdW50YWluID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vdW50YWluIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3OTU2XSwgImY2ZmMiLCAiTTI1Ni41IDBjMTQuNyAwIDI4LjIgOC4xIDM1LjIgMjFsMjE2IDQwMGM2LjcgMTIuNCA2LjQgMjcuNC0uOCAzOS41LTcuMiAxMi4xLTIwLjMgMTkuNS0zNC4zIDE5LjVsLTQzMiAwYy0xNC4xIDAtMjcuMS03LjQtMzQuMy0xOS41cy03LjUtMjcuMS0uOC0zOS41bDIxNi00MDAgMi45LTQuNkMyMzEuNyA2LjIgMjQzLjYgMCAyNTYuNSAwek0xNzAuNCAyNDkuOWwyNi44IDI2LjhjNi4yIDYuMiAxNi40IDYuMiAyMi42IDBsNDMuMy00My4zYzYtNiAxNC4xLTkuNCAyMi42LTkuNGw0Mi44IDAtNzIuMS0xMzMuNS04Ni4xIDE1OS40eiJdCiAgICB9OwogICAgZmFDaGVzcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGVzcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNDM5IiwgIk0xNjggNTZsMCA0MC03OC4xIDBjLTE0LjMgMC0yNS45IDExLjYtMjUuOSAyNS45IDAgNCAuOSA4IDIuNyAxMS42bDMzLjQgNjYuOGMtMTEuNCAxLjgtMjAuMiAxMS43LTIwLjIgMjMuNyAwIDEzLjMgMTAuNyAyNCAyNCAyNGw1LjYgMC0xMy42IDEzNi01Ni4yIDcwLjNjLTUgNi4zLTcuOCAxNC4xLTcuOCAyMi4yIDAgMTkuNiAxNS45IDM1LjUgMzUuNSAzNS41bDI0OC45IDBjMTkuNiAwIDM1LjUtMTUuOSAzNS41LTM1LjUgMC04LjEtMi43LTE1LjktNy44LTIyLjJMMjg4IDM4NCAyNzQuNCAyNDggMjgwIDI0OGMxMy4zIDAgMjQtMTAuNyAyNC0yNCAwLTExLjktOC43LTIxLjktMjAuMi0yMy43bDMzLjQtNjYuOGMxLjgtMy42IDIuNy03LjYgMi43LTExLjYgMC0xNC4zLTExLjYtMjUuOS0yNS45LTI1LjlsLTc4LjEgMCAwLTQwIDE2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRTMjQ1LjMgOCAyMzIgOGwtMTYgMCAwLTE2YzAtMTMuMy0xMC43LTI0LTI0LTI0UzE2OC0yMS4zIDE2OC04bDAgMTYtMTYgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNiAwek0zMjUuOCAyNzkuNmw4LjUgODUuNSA0Ny40IDU5LjIgNC4yIDUuN2M5LjIgMTMuNyAxNC4xIDI5LjkgMTQuMSA0Ni41IDAgMTIuNy0yLjggMjQuOC03LjkgMzUuNWw4My4xIDBjMjAuMyAwIDM2LjgtMTYuNSAzNi44LTM2LjggMC03LjMtMi4yLTE0LjQtNi4yLTIwLjRsLTI1LjgtMzguNyAwLTY0IDEzLjMtMTMuM2MxMi0xMiAxOC43LTI4LjMgMTguNy00NS4zTDUxMiAxOTJjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAxNi0zMiAwIDAtMTZjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAzMmMwIDIyLjQtMTAuMiA0Mi40LTI2LjIgNTUuNnoiXQogICAgfTsKICAgIGZhVGVtcGVyYXR1cmVUaHJlZVF1YXJ0ZXJzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRlbXBlcmF0dXJlLXRocmVlLXF1YXJ0ZXJzIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbInRlbXBlcmF0dXJlLTMiLCAidGhlcm1vbWV0ZXItMyIsICJ0aGVybW9tZXRlci10aHJlZS1xdWFydGVycyJdLCAiZjJjOCIsICJNMTYwIDBDMTA3IDAgNjQgNDMgNjQgOTZsMCAxNjQuN0MzNC41IDI4NyAxNiAzMjUuNCAxNiAzNjggMTYgNDQ3LjUgODAuNSA1MTIgMTYwIDUxMnMxNDQtNjQuNSAxNDQtMTQ0YzAtNDIuNi0xOC41LTgxLTQ4LTEwNy4zTDI1NiA5NmMwLTUzLTQzLTk2LTk2LTk2em02NCAzNjhjMCAzNS4zLTI4LjcgNjQtNjQgNjRzLTY0LTI4LjctNjQtNjRjMC0yNi45IDE2LjUtNDkuOSA0MC01OS4zTDEzNiAxNTJjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDE1Ni43YzIzLjUgOS41IDQwIDMyLjUgNDAgNTkuM3oiXQogICAgfTsKICAgIGZhVGVtcGVyYXR1cmUzID0gZmFUZW1wZXJhdHVyZVRocmVlUXVhcnRlcnM7CiAgICBmYVRoZXJtb21ldGVyMyA9IGZhVGVtcGVyYXR1cmVUaHJlZVF1YXJ0ZXJzOwogICAgZmFUaGVybW9tZXRlclRocmVlUXVhcnRlcnMgPSBmYVRlbXBlcmF0dXJlVGhyZWVRdWFydGVyczsKICAgIGZhQiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbOThdLCAiNDIiLCAiTTMyIDMyQzE0LjMgMzIgMCA0Ni4zIDAgNjRMMCA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTYwIDBjNzAuNyAwIDEyOC01Ny4zIDEyOC0xMjggMC00Ni41LTI0LjgtODcuMy02Mi0xMDkuNyAxOC43LTIyLjMgMzAtNTEgMzAtODIuMyAwLTcwLjctNTcuMy0xMjgtMTI4LTEyOEwzMiAzMnpNMTYwIDIyNGwtOTYgMCAwLTEyOCA5NiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0cy0yOC43IDY0LTY0IDY0ek02NCAyODhsMTI4IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRzLTI4LjcgNjQtNjQgNjRsLTEyOCAwIDAtMTI4eiJdCiAgICB9OwogICAgZmFTaGllbGRWaXJ1cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaGllbGQtdmlydXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTA2YyIsICJNMjUzLjQgMi45QzI0OS4yIDEgMjQ0LjcgMCAyNDAgMHMtOS4yIDEtMTMuNCAyLjlMMzguMyA4Mi44Yy0yMiA5LjMtMzguNCAzMS0zOC4zIDU3LjIgLjUgOTkuMiA0MS4zIDI4MC43IDIxMy42IDM2My4yIDE2LjcgOCAzNi4xIDggNTIuOCAwIDE3Mi40LTgyLjUgMjEzLjItMjY0IDIxMy42LTM2My4yIC4xLTI2LjItMTYuMy00Ny45LTM4LjMtNTcuMkwyNTMuNCAyLjl6TTI0MCAxMjhjMTMuMyAwIDI0IDEwLjcgMjQgMjQgMCAyMi45IDI3LjcgMzQuNCA0My45IDE4LjIgOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45Yy0xNi4yIDE2LjItNC43IDQzLjkgMTguMiA0My45IDEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0Yy0yMi45IDAtMzQuNCAyNy43LTE4LjIgNDMuOSA5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwYy0xNi4yLTE2LjItNDMuOS00LjctNDMuOSAxOC4yIDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtMjIuOS0yNy43LTM0LjQtNDMuOS0xOC4yLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjljMTYuMi0xNi4yIDQuNy00My45LTE4LjItNDMuOS0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0YzIyLjkgMCAzNC40LTI3LjcgMTguMi00My45LTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGMxNi4yIDE2LjIgNDMuOSA0LjcgNDMuOS0xOC4yIDAtMTMuMyAxMC43LTI0IDI0LTI0ek0yMDggMjY0YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHptODggNDBhMjQgMjQgMCAxIDAgLTQ4IDAgMjQgMjQgMCAxIDAgNDggMHoiXQogICAgfTsKICAgIGZhTGl0ZWNvaW5TaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxpdGVjb2luLXNpZ24iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZTFkMyIsICJNMTI4IDY0YzAtMTcuNy0xNC4zLTMyLTMyLTMyUzY0IDQ2LjMgNjQgNjRsMCAxNTcuOS0zOC42IDExYy0xMi43IDMuNi0yMC4xIDE2LjktMTYuNSAyOS43czE2LjkgMjAuMSAyOS43IDE2LjVMNjQgMjcxLjggNjQgNDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMybDI1NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0yMjQgMCAwLTE2Mi41IDEzNC42LTM4LjVjMTIuNy0zLjYgMjAuMS0xNi45IDE2LjUtMjkuN3MtMTYuOS0yMC4xLTI5LjctMTYuNUwxMjggMjAzLjYgMTI4IDY0eiJdCiAgICB9OwogICAgZmFEaWNlRDYgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZGljZS1kNiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNmQxIiwgIk0yMjQuNCA4LjNDMjQ0LTIuOCAyNjgtMi44IDI4Ny42IDguM2wxNzYgOTkuN2MyMCAxMS40IDMyLjQgMzIuNiAzMi40IDU1LjdsMCAxOTcuNGMwIDIzLTEyLjQgNDQuMy0zMi40IDU1LjdsLTE3NiA5OS43Yy0xOS42IDExLjEtNDMuNiAxMS4xLTYzLjEgMGwtMTc2LTk5LjdDMjguNCA0MDUuNSAxNiAzODQuMiAxNiAzNjEuMmwwLTE5Ny40YzAtMjMgMTIuNC00NC4zIDMyLjQtNTUuN2wxNzYtOTkuN3pNMTAyLjYgMTU1LjZjLTguOC0zLjEtMTguOCAuMy0yMy44IDguNnMtMy4yIDE4LjcgMy42IDI1bDMuMiAyLjQgMTUwLjIgOTAuMiAwIDE0OC43YzAgMTEgOSAyMCAyMCAyMCAxMSAwIDIwLTkgMjAtMjBsMC0xNDguNyAxNTAuMy05MC4yYzkuNS01LjcgMTIuNi0xOCA2LjktMjcuNHMtMTgtMTIuNS0yNy40LTYuOWwtMTQ5LjcgODkuOC0xNDkuNy04OS44LTMuNy0xLjd6Il0KICAgIH07CiAgICBmYUdyaXBMaW5lc1ZlcnRpY2FsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImdyaXAtbGluZXMtdmVydGljYWwiLAogICAgICBpY29uOiBbMTkyLCA1MTIsIFtdLCAiZjdhNSIsICJNNjQgNjRjMC0xNy43LTE0LjMtMzItMzItMzJTMCA0Ni4zIDAgNjRMMCA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMkw2NCA2NHptMTI4IDBjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAzODRjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTM4NHoiXQogICAgfTsKICAgIGZhR29sZkJhbGxUZWUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ29sZi1iYWxsLXRlZSIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJnb2xmLWJhbGwiXSwgImY0NTAiLCAiTTI5OC41IDM4NC4xYzEyLjEgMS4yIDIxLjUgMTEuNSAyMS41IDIzLjlzLTkuNCAyMi42LTIxLjUgMjMuOWwtMi41IC4xLTgwIDAgMCA4OGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTg4LTgwIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0IDAtMTIuNCA5LjQtMjIuNiAyMS41LTIzLjlsMi41LS4xIDIwOCAwIDIuNSAuMXpNMTkyIDBjMTA2IDAgMTkyIDg2IDE5MiAxOTIgMCA1Ny40LTI1LjIgMTA4LjgtNjUuMSAxNDRMNjUuMSAzMzZDMjUuMiAzMDAuOCAwIDI0OS40IDAgMTkyIDAgODYgODYgMCAxOTIgMHptMzIgMjQwYy03LjcgMC0xNC4yIDUuNS0xNS43IDEyLjhsLS42IDYuNGMtMS4zIDYuMy02LjIgMTEuMi0xMi41IDEyLjVsLTYuNCAuNmMtNy4zIDEuNS0xMi44IDgtMTIuOCAxNS43IDAgOC44IDcuMiAxNiAxNiAxNiAyNi41IDAgNDgtMjEuNSA0OC00OCAwLTguOC03LjItMTYtMTYtMTZ6bTY0LTY0Yy03LjcgMC0xNC4yIDUuNS0xNS43IDEyLjhsLS42IDYuNGMtMS4zIDYuMy02LjIgMTEuMi0xMi41IDEyLjVsLTYuNCAuNmMtNy4zIDEuNS0xMi44IDgtMTIuOCAxNS43IDAgOC44IDcuMiAxNiAxNiAxNiAyNi41IDAgNDgtMjEuNSA0OC00OCAwLTguOC03LjItMTYtMTYtMTZ6bS04MC0xNmMtNy43IDAtMTQuMiA1LjUtMTUuNyAxMi44bC0uNiA2LjRjLTEuMyA2LjMtNi4yIDExLjItMTIuNSAxMi41bC02LjQgLjZjLTcuMyAxLjUtMTIuOCA4LTEyLjggMTUuNyAwIDguOCA3LjIgMTYgMTYgMTYgMjYuNSAwIDQ4LTIxLjUgNDgtNDggMC04LjgtNy4yLTE2LTE2LTE2eiJdCiAgICB9OwogICAgZmFHb2xmQmFsbCA9IGZhR29sZkJhbGxUZWU7CiAgICBmYUhleGFnb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGV4YWdvbiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzExMDQzXSwgImYzMTIiLCAiTTMzLjUgMjIwLjNjLTEyLjcgMjIuMi0xMi43IDQ5LjQgMCA3MS41bDk2LjIgMTY4LjFjMTIuOCAyMi40IDM2LjcgMzYuMiA2Mi41IDM2LjJsMTkxLjYgMGMyNS44IDAgNDkuNy0xMy44IDYyLjUtMzYuMmw5Ni4yLTE2OC4xYzEyLjctMjIuMiAxMi43LTQ5LjQgMC03MS41TDQ0Ni4zIDUyLjJDNDMzLjUgMjkuOCA0MDkuNiAxNiAzODMuOCAxNkwxOTIuMiAxNmMtMjUuOCAwLTQ5LjcgMTMuOC02Mi41IDM2LjJMMzMuNSAyMjAuM3oiXQogICAgfTsKICAgIGZhRm9sZGVyT3BlbjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZm9sZGVyLW9wZW4iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgxOTQsIDEyODQ0OSwgNjE3MTddLCAiZjA3YyIsICJNNTYgMjI1LjZMMzIuNCAyOTYuMiAzMi40IDk2YzAtMzUuMyAyOC43LTY0IDY0LTY0bDEzOC43IDBjMTMuOCAwIDI3LjMgNC41IDM4LjQgMTIuOGwzOC40IDI4LjhjNS41IDQuMiAxMi4zIDYuNCAxOS4yIDYuNGwxMTcuMyAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMTYtMzY1LjQgMGMtNDEuMyAwLTc4IDI2LjQtOTEuMSA2NS42ek00NzcuOCA0NDhMOTkgNDQ4Yy0zMi44IDAtNTUuOS0zMi4xLTQ1LjUtNjMuMmw0OC0xNDRDMTA4IDIyMS4yIDEyNi40IDIwOCAxNDcgMjA4bDM3OC44IDBjMzIuOCAwIDU1LjkgMzIuMSA0NS41IDYzLjJsLTQ4IDE0NGMtNi41IDE5LjYtMjQuOSAzMi44LTQ1LjUgMzIuOHoiXQogICAgfTsKICAgIGZhS2FhYmEgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAia2FhYmEiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgzMzFdLCAiZjY2YiIsICJNMjU2IDUxLjNMOTIuOCAxMTIuNCAyNDcuNSAxNzEuMWM1LjUgMi4xIDExLjUgMi4xIDE3IDBMNDE5LjIgMTEyLjQgMjU2IDUxLjN6TTAgMTI5LjNjMC0yMCAxMi40LTM3LjkgMzEuMS00NC45bDIwOC03OGMxMC45LTQuMSAyMi44LTQuMSAzMy43IDBsMjA4IDc4YzE4LjcgNyAzMS4xIDI0LjkgMzEuMSA0NC45bDAgMzYtMjUzLjIgOTZjLTEuOCAuNy0zLjggLjctNS43IDBsLTI1My4yLTk2IDAtMzZ6bTAgMTQwbDAtNTIuNyAyMzYuMSA4OS42YzEyLjggNC45IDI2LjkgNC45IDM5LjcgMGwyMzYuMS04OS42IDAgNTIuNy0xMjggNDguNiAwIDUxLjMgMTI4LTQ4LjYgMCA2Mi4yYzAgMjAtMTIuNCAzNy45LTMxLjEgNDQuOWwtMjA4IDc4Yy0xMC45IDQuMS0yMi44IDQuMS0zMy43IDBsLTIwOC03OEMxMi40IDQyMC43IDAgNDAyLjcgMCAzODIuN2wwLTYyLjIgMTI4IDQ4LjYgMC01MS4zLTEyOC00OC42ek0yMzYuMSA0MTAuMWMxMi44IDQuOSAyNi45IDQuOSAzOS43IDBsNjAuMS0yMi44IDAtNTEuMy03Ny4yIDI5LjNjLTEuOCAuNy0zLjggLjctNS43IDBsLTc3LjItMjkuMyAwIDUxLjMgNjAuMSAyMi44eiJdCiAgICB9OwogICAgZmFIYW5kSG9sZGluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kLWhvbGRpbmciLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjRiZCIsICJNNjYuNyAzODRsNDIuNS00Mi41YzI0LTI0IDU2LjYtMzcuNSA5MC41LTM3LjVMMzUyIDMwNGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtNzIgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxMTIuNiAwIDExOS43LTg4LjJjMTcuOC0xMy4xIDQyLjgtOS4zIDU1LjkgOC41czkuMyA0Mi44LTguNSA1NS45TDQzMy4xIDQ4NS41Yy0yMy40IDE3LjItNTEuNiAyNi41LTgwLjcgMjYuNUwzMiA1MTJjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJsMzQuNyAweiJdCiAgICB9OwogICAgZmFTaW5nbGVRdW90ZVJpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNpbmdsZS1xdW90ZS1yaWdodCIsCiAgICAgIGljb246IFsxOTIsIDUxMiwgW10sICJlODFjIiwgIk02NCA0MTZjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsOCAwYzMwLjkgMCA1Ni0yNS4xIDU2LTU2bDAtOC02NCAwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTY0YzAtMzUuMyAyOC43LTY0IDY0LTY0bDY0IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAxMzZjMCA2Ni4zLTUzLjcgMTIwLTEyMCAxMjBsLTggMHoiXQogICAgfTsKICAgIGZhQm90dGxlRHJvcGxldCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib3R0bGUtZHJvcGxldCIsCiAgICAgIGljb246IFszMjAsIDUxMiwgW10sICJlNGM0IiwgIk04MCAwYzAtMTcuNyAxNC4zLTMyIDMyLTMybDk2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsMCAxMDMuM2M2NC45IDIwLjQgMTEyIDgxIDExMiAxNTIuN2wwIDE5MmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1NDRjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMjg4YzAtNzEuNiA0Ny4xLTEzMi4zIDExMi0xNTIuN0wxMTIgMzJDOTQuMyAzMiA4MCAxNy43IDgwIDB6bTgwIDQxNmMzNS4zIDAgNjQtMzIuNCA2NC02NCAwLTIxLjItMjguOS02NC41LTQ3LjktOTAuNi04LjEtMTEuMS0yNC4yLTExLjEtMzIuMyAwLTE5IDI2LjEtNDcuOSA2OS40LTQ3LjkgOTAuNiAwIDMxLjYgMjguNyA2NCA2NCA2NHoiXQogICAgfTsKICAgIGZhV2luZG93TWluaW1pemUyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIndpbmRvdy1taW5pbWl6ZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODQ2OV0sICJmMmQxIiwgIk0wIDQxNmMwLTE3LjcgMTQuMy0zMiAzMi0zMmw0NDggMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA0NDhjLTE3LjcgMC0zMi0xNC4zLTMyLTMyeiJdCiAgICB9OwogICAgZmFDaGV2cm9uUmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hldnJvbi1yaWdodCIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWzkwMDJdLCAiZjA1NCIsICJNMzExLjEgMjMzLjRjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNsLTE5MiAxOTJjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwcy0xMi41LTMyLjggMC00NS4zTDI0My4yIDI1NiA3My45IDg2LjZjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zczMyLjgtMTIuNSA0NS4zIDBsMTkyIDE5MnoiXQogICAgfTsKICAgIGZhRWdnID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImVnZyIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyOTM3MF0sICJmN2ZiIiwgIk0xOTIgNDk2Qzg2IDQ5NiAwIDM5NCAwIDI4OCAwIDE3NiA2NCAxNiAxOTIgMTZTMzg0IDE3NiAzODQgMjg4YzAgMTA2LTg2IDIwOC0xOTIgMjA4ek0xNTQuOCAxMzRjNi41LTYgNy0xNi4xIDEtMjIuNnMtMTYuMS03LTIyLjYtMWMtMjMuOSAyMS44LTQxLjEgNTIuNy01Mi4zIDg0LjItMTEuMiAzMS42LTE2LjkgNjUuMS0xNi45IDkzLjUgMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmMwLTI0LjUgNS01NC40IDE1LjEtODIuOCAxMC4xLTI4LjUgMjUtNTQuMSA0My43LTcxLjJ6Il0KICAgIH07CiAgICBmYUxhbmRtYXJrRG9tZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsYW5kbWFyay1kb21lIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImxhbmRtYXJrLWFsdCJdLCAiZjc1MiIsICJNMjU2IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyIDAgLjkgMCAxLjggLjEgMi42LTgwLjUgMTMuNC0xNDQgNzYuOS0xNTcuNSAxNTcuNEw2NCAxOTJjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMCAxNjAtNTEuMiAzOC40QzQuNyA0NjAuNCAwIDQ2OS45IDAgNDgwIDAgNDk3LjcgMTQuMyA1MTIgMzIgNTEybDQ0OCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMyIDAtMTAuMS00LjctMTkuNi0xMi44LTI1LjZMNDQ4IDQxNiA0NDggMjU2YzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0yLjcgMGMtMTMuNS04MC40LTc3LTE0My45LTE1Ny41LTE1Ny40IC4xLS45IC4xLTEuNyAuMS0yLjYgMC0xNy43LTE0LjMtMzItMzItMzJ6bTgwIDI1Nmw2NCAwIDAgMTYwLTY0IDAgMC0xNjB6TTIyNCA0MTZsMC0xNjAgNjQgMCAwIDE2MC02NCAwek0xMTIgMjU2bDY0IDAgMCAxNjAtNjQgMCAwLTE2MHoiXQogICAgfTsKICAgIGZhTGFuZG1hcmtBbHQgPSBmYUxhbmRtYXJrRG9tZTsKICAgIGZhV29ybSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3b3JtIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU1OTkiLCAiTTIyNCA5NmMwLTUzIDQzLTk2IDk2LTk2bDM4LjQgMEM0MDcuOSAwIDQ0OCA0MC4xIDQ0OCA4OS42TDQ0OCAzNzZjMCA3NS4xLTYwLjkgMTM2LTEzNiAxMzZTMTc2IDQ1MS4xIDE3NiAzNzZsMC04MGMwLTIyLjEtMTcuOS00MC00MC00MHMtNDAgMTcuOS00MCA0MGwwIDE2OGMwIDI2LjUtMjEuNSA0OC00OCA0OFMwIDQ5MC41IDAgNDY0TDAgMjk2YzAtNzUuMSA2MC45LTEzNiAxMzYtMTM2czEzNiA2MC45IDEzNiAxMzZsMCA4MGMwIDIyLjEgMTcuOSA0MCA0MCA0MHM0MC0xNy45IDQwLTQwbDAtMTg0LTMyIDBjLTUzIDAtOTYtNDMtOTYtOTZ6bTE0NC04YTI0IDI0IDAgMSAwIC00OCAwIDI0IDI0IDAgMSAwIDQ4IDB6Il0KICAgIH07CiAgICBmYVVzZXJJbmp1cmVkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXItaW5qdXJlZCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNzI4IiwgIk0yNDIuNyA4MEwzMzQgODBjLTEwLjctMjQuNi0yOS41LTQ0LjktNTIuOS01Ny42TDI0Mi43IDgwem0tLjktNzAuN0MyMzYgOC40IDIzMCA4IDIyNCA4IDE3NC44IDggMTMyLjUgMzcuNiAxMTQgODBsODAuNiAwIDQ3LjEtNzAuN3pNMjI0IDI0OGM2Ni4zIDAgMTIwLTUzLjcgMTIwLTEyMGwtMjQwIDBjMCA2Ni4zIDUzLjcgMTIwIDEyMCAxMjB6TTk4LjcgMzQxLjhDNDkuMyAzNzAuMiAxNiA0MjMuNSAxNiA0ODQuNiAxNiA0OTkuNyAyOC4zIDUxMiA0My40IDUxMmwxNTEgMC05NS44LTE3MC4yem00NS4xLTE3LjdsNDIuNyA3NS45IDg1LjUgMGM0NC4yIDAgODAgMzUuOCA4MCA4MCAwIDExLjQtMi40IDIyLjItNi43IDMybDU5LjIgMGMxNS4xIDAgMjcuNC0xMi4zIDI3LjQtMjcuNCAwLTkwLjktNzMuNy0xNjQuNi0xNjQuNi0xNjQuNmwtODYuOSAwYy0xMi42IDAtMjQuOSAxLjQtMzYuNyA0LjF6TTIxMy41IDQ0OGwzNiA2NCAyMi41IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTU4LjUgMHoiXQogICAgfTsKICAgIGZhU3RyaWtldGhyb3VnaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzdHJpa2V0aHJvdWdoIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYwY2MiLCAiTTk2IDE1Ny41Qzk2IDg4LjIgMTUyLjIgMzIgMjIxLjUgMzJMMzY4IDMyYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDIyMS41IDk2Yy0zNCAwLTYxLjUgMjcuNS02MS41IDYxLjUgMCAzMSAyMy4xIDU3LjIgNTMuOSA2MWw0NC4xIDUuNSAyMjIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiAyODhjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsODMuMSAwQzEwMyAyMDQuNiA5NiAxODEuOCA5NiAxNTcuNXpNMzQ5LjIgMzM2bDY1LjUgMGMuOSA2LjEgMS40IDEyLjIgMS40IDE4LjUgMCA2OS4zLTU2LjIgMTI1LjUtMTI1LjUgMTI1LjVMMTQ0IDQ4MGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxNDYuNSAwYzM0IDAgNjEuNS0yNy41IDYxLjUtNjEuNSAwLTYuNC0xLTEyLjctMi44LTE4LjV6Il0KICAgIH07CiAgICBmYUJsb2cgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmxvZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNzgxIiwgIk0yMjQgMjRjMC0xMy4zIDEwLjctMjQgMjQtMjQgMTQ1LjggMCAyNjQgMTE4LjIgMjY0IDI2NCAwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGMwLTExOS4zLTk2LjctMjE2LTIxNi0yMTYtMTMuMyAwLTI0LTEwLjctMjQtMjR6TTgwIDk2YzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMjI0YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4czQ4LTIxLjUgNDgtNDgtMjEuNS00OC00OC00OGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtNjRjMC04LjggNy4yLTE2IDE2LTE2IDc5LjUgMCAxNDQgNjQuNSAxNDQgMTQ0UzI1NS41IDUxMiAxNzYgNTEyIDMyIDQ0Ny41IDMyIDM2OGwwLTIyNGMwLTI2LjUgMjEuNS00OCA0OC00OHptMTY4IDBjOTIuOCAwIDE2OCA3NS4yIDE2OCAxNjggMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRjMC02Ni4zLTUzLjctMTIwLTEyMC0xMjAtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhU3RvcHdhdGNoMjAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3RvcHdhdGNoLTIwIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImUwNmYiLCAiTTE2OC41IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMzIgMCAwIDI1LjNjLTEwOCAxMS45LTE5MiAxMDMuNS0xOTIgMjE0LjcgMCAxMTkuMyA5Ni43IDIxNiAyMTYgMjE2czIxNi05Ni43IDIxNi0yMTZjMC0zOS44LTEwLjgtNzcuMS0yOS42LTEwOS4ybDI4LjItMjguMmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMGwtMjMuNCAyMy40Yy0zMi45LTMwLjItNzUuMi01MC4zLTEyMi01NS41bDAtMjUuMyAzMiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xMTIgMHptLTYwIDI0MGMwLTI4LjcgMjMuMy01MiA1Mi01MnM1MiAyMy4zIDUyIDUybDAgMy44YzAgMTEuNy0zLjIgMjMuMS05LjMgMzNsLTQzLjggNzEuMiAzMy4xIDBjMTEgMCAyMCA5IDIwIDIwcy05IDIwLTIwIDIwbC01Ny44IDBjLTE0LjUgMC0yNi4yLTExLjctMjYuMi0yNi4yIDAtNC45IDEuMy05LjYgMy45LTEzLjhsNTYuNy05Mi4xYzIuMi0zLjYgMy40LTcuOCAzLjQtMTIuMWwwLTMuOGMwLTYuNi01LjQtMTItMTItMTJzLTEyIDUuNC0xMiAxMmMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjB6bTE4MC01MmMyOC43IDAgNTIgMjMuMyA1MiA1MmwwIDk2YzAgMjguNy0yMy4zIDUyLTUyIDUycy01Mi0yMy4zLTUyLTUybDAtOTZjMC0yOC43IDIzLjMtNTIgNTItNTJ6bS0xMiA1MmwwIDk2YzAgNi42IDUuNCAxMiAxMiAxMnMxMi01LjQgMTItMTJsMC05NmMwLTYuNi01LjQtMTItMTItMTJzLTEyIDUuNC0xMiAxMnoiXQogICAgfTsKICAgIGZhVHJ1Y2tQaWNrdXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHJ1Y2stcGlja3VwIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI4NzYzXSwgImY2M2MiLCAiTTM2My44IDk2bDU3LjYgOTYtMTMzLjQgMCAwLTk2IDc1LjggMHpNNDk2IDE5Mkw0MTguNiA2My4xQzQwNy4xIDQzLjggMzg2LjIgMzIgMzYzLjggMzJMMjU2IDMyYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDEyOC0xNDQgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCA4MGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzMi40IDBjLS4yIDIuNi0uNCA1LjMtLjQgOCAwIDQ4LjYgMzkuNCA4OCA4OCA4OHM4OC0zOS40IDg4LTg4YzAtMi43LS4xLTUuNC0uNC04bDE2MC43IDBjLS4yIDIuNi0uNCA1LjMtLjQgOCAwIDQ4LjYgMzkuNCA4OCA4OCA4OHM4OC0zOS40IDg4LTg4YzAtMi43LS4xLTUuNC0uNC04bDMyLjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwwLTgwYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC02NCAwek0xMTIgMzkyYTQwIDQwIDAgMSAxIDgwIDAgNDAgNDAgMCAxIDEgLTgwIDB6bTM3Ni00MGE0MCA0MCAwIDEgMSAwIDgwIDQwIDQwIDAgMSAxIDAtODB6Il0KICAgIH07CiAgICBmYVNlZWRsaW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNlZWRsaW5nIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3NzkzLCAic3Byb3V0Il0sICJmNGQ4IiwgIk01MTIgMzJDNTEyIDE0MC4xIDQzNS40IDIzMC4zIDMzMy42IDI1MS40IDMyNS43IDE5My4zIDI5OS42IDE0MSAyNjEuMSAxMDAuNSAzMDEuMiA0MCAzNjkuOSAwIDQ0OCAwbDMyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJ6TTAgOTZDMCA3OC4zIDE0LjMgNjQgMzIgNjRsMzIgMGMxMjMuNyAwIDIyNCAxMDAuMyAyMjQgMjI0bDAgMTkyYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTYwQzEwMC4zIDMyMCAwIDIxOS43IDAgOTZ6Il0KICAgIH07CiAgICBmYVNwcm91dCA9IGZhU2VlZGxpbmc7CiAgICBmYVRyYW5zZ2VuZGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRyYW5zZ2VuZGVyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbOTg5NSwgInRyYW5zZ2VuZGVyLWFsdCJdLCAiZjIyNSIsICJNMTI4LTMyYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDk3LjkgMzIgMTM2IDcwLjEgMTUxIDU1YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOWwtMTUgMTUgMTQuMiAxNC4yYzI3LjktMjMuOCA2NC4yLTM4LjIgMTAzLjgtMzguMiAzNi43IDAgNzAuNiAxMi40IDk3LjYgMzMuMkw0NjYuNyAzMiA0NDggMzJjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsOTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDk2YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTguNy04NC40IDg0LjRjMTMgMjMuMSAyMC40IDQ5LjkgMjAuNCA3OC4zIDAgNzcuNC01NSAxNDItMTI4IDE1Ni44bDAgMzUuMiAzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0zMiAwIDAgMTZjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xNi0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDMyIDAgMC0zNS4yYy03My0xNC44LTEyOC03OS40LTEyOC0xNTYuOCAwLTMxLjQgOS02MC43IDI0LjctODUuNGwtMTYuNy0xNi43LTE1IDE1Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45bDE1LTE1LTM4LjEtMzguMSAwIDMwLjFjMCAxNy43LTE0LjMgMzItMzIgMzJTMCAxMTMuNyAwIDk2TDAgMEMwLTE3LjcgMTQuMy0zMiAzMi0zMmw5NiAwek0yODggMzM2YTk2IDk2IDAgMSAwIDAtMTkyIDk2IDk2IDAgMSAwIDAgMTkyeiJdCiAgICB9OwogICAgZmFUcmFuc2dlbmRlckFsdCA9IGZhVHJhbnNnZW5kZXI7CiAgICBmYVN0YXJIYWxmMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzdGFyLWhhbGYiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFs2MTczMV0sICJmMDg5IiwgIk0zMDQuMSA3LjZjMC0xMS4xLTcuNi0yMC43LTE4LjQtMjMuM3MtMjEuOSAyLjUtMjcgMTIuNEwxOTMuMSAxMjUuMyAzMy4yIDE1MC43Yy04LjkgMS40LTE2LjMgNy43LTE5LjEgMTYuM3MtLjUgMTggNS44IDI0LjRsMTE0LjQgMTE0LjUtMjUuMiAxNTkuOWMtMS40IDguOSAyLjMgMTcuOSA5LjYgMjMuMnMxNi45IDYuMSAyNSAyTDI5MSA0MTYuMWM4LTQuMSAxMy4xLTEyLjQgMTMuMS0yMS40bDAtMzg3LjF6Il0KICAgIH07CiAgICBmYVBob3RvRmlsbSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwaG90by1maWxtIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbInBob3RvLXZpZGVvIl0sICJmODdjIiwgIk0xOTIgNjRjMC0zNS4zIDI4LjctNjQgNjQtNjRMNTc2IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyMjRjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTMyMCAwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTIyNHpNMzIwIDk2YTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6bTE1Ni41IDExLjVDNDcyLjEgMTAwLjQgNDY0LjQgOTYgNDU2IDk2cy0xNi4xIDQuNC0yMC41IDExLjVsLTU0IDg4LjMtMTcuOS0yNS42Yy00LjUtNi40LTExLjgtMTAuMi0xOS43LTEwLjJzLTE1LjIgMy44LTE5LjcgMTAuMmwtNTYgODBjLTUuMSA3LjMtNS44IDE2LjktMS42IDI0LjhTMjc5LjEgMjg4IDI4OCAyODhsMjU2IDBjOC43IDAgMTYuNy00LjcgMjAuOS0xMi4zczQuMS0xNi44LS41LTI0LjNsLTg4LTE0NHpNMTQ0IDEyOGwwIDE2MGMwIDYxLjkgNTAuMSAxMTIgMTEyIDExMmwxOTIgMCAwIDE2YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxOTJjMC0zNS4zIDI4LjctNjQgNjQtNjRsODAgMHpNNTIgMTk2bDAgMjRjMCA4LjggNy4yIDE2IDE2IDE2bDI0IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMjRjMC04LjgtNy4yLTE2LTE2LTE2bC0yNCAwYy04LjggMC0xNiA3LjItMTYgMTZ6bTE2IDgwYy04LjggMC0xNiA3LjItMTYgMTZsMCAyNGMwIDguOCA3LjIgMTYgMTYgMTZsMjQgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0yNGMwLTguOC03LjItMTYtMTYtMTZsLTI0IDB6bTAgOTZjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDI0YzAgOC44IDcuMiAxNiAxNiAxNmwyNCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTI0YzAtOC44LTcuMi0xNi0xNi0xNmwtMjQgMHoiXQogICAgfTsKICAgIGZhUGhvdG9WaWRlbyA9IGZhUGhvdG9GaWxtOwogICAgZmFQaWN0dXJlSW5QaWN0dXJlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBpY3R1cmUtaW4tcGljdHVyZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlODBiIiwgIk00NDggMzJjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAxMTItNjQgMCAwLTExMi0zODQgMCAwIDMyMCAxNDQgMCAwIDY0LTE0NCAwLTYuNS0uM2MtMzAuMS0zLjEtNTQuMS0yNy01Ny4xLTU3LjFMMCA0MTYgMCA5NkMwIDYyLjkgMjUuMiAzNS42IDU3LjUgMzIuM0w2NCAzMiA0NDggMzJ6bTE2IDIyNGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDEyOGMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTYwIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMTI4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDE2MCAweiJdCiAgICB9OwogICAgZmFQdW1wTWVkaWNhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwdW1wLW1lZGljYWwiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZTA2YSIsICJNOTYgMGwwIDgwIDEyOCAwIDAtMjQgNzIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNFMzMDkuMyA4IDI5NiA4bC03MiAwIDAtOGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtNjQgMEMxMTAuMy0zMiA5Ni0xNy43IDk2IDB6TTY0IDEyOGMtMzUuMyAwLTY0IDI4LjctNjQgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTkyIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMTI4em02NCAxMjBjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgNDAgNDAgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTQwIDAgMCA0MGMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTQwLTQwIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmw0MCAwIDAtNDB6Il0KICAgIH07CiAgICBmYUZpcmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlyZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyODI5M10sICJmMDZkIiwgIk0xNjAuNS0yNi40YzkuMy03LjggMjMtNy41IDMxLjkgLjkgMTIuMyAxMS42IDIzLjMgMjQuNCAzMy45IDM3LjQgMTMuNSAxNi41IDI5LjcgMzguMyA0NS4zIDY0LjIgNS4yLTYuOCAxMC0xMi44IDE0LjItMTcuOSAxLjEtMS4zIDIuMi0yLjcgMy4zLTQuMSA3LjktOS44IDE3LjctMjIuMSAzMC44LTIyLjEgMTMuNCAwIDIyLjggMTEuOSAzMC44IDIyLjEgMS4zIDEuNyAyLjYgMy4zIDMuOSA0LjggMTAuMyAxMi40IDI0IDMwLjMgMzcuNyA1Mi40IDI3LjIgNDMuOSA1NS42IDEwNi40IDU1LjYgMTc2LjYgMCAxMjMuNy0xMDAuMyAyMjQtMjI0IDIyNFMwIDQxMS43IDAgMjg4YzAtOTEuMSA0MS4xLTE3MCA4MC41LTIyNSAxOS45LTI3LjcgMzkuNy00OS45IDU0LjYtNjUuMSA4LjItOC40IDE2LjUtMTYuNyAyNS41LTI0LjJ6TTIyNS43IDQxNmMyNS4zIDAgNDcuNy03IDY4LjgtMjEgNDIuMS0yOS40IDUzLjQtODguMiAyOC4xLTEzNC40LTQuNS05LTE2LTkuNi0yMi41LTJsLTI1LjIgMjkuM2MtNi42IDcuNi0xOC41IDcuNC0yNC43LS41LTE3LjMtMjIuMS00OS4xLTYyLjQtNjUuMy04My01LjQtNi45LTE1LjItOC0yMS41LTEuOS0xOC4zIDE3LjgtNTEuNSA1Ni44LTUxLjUgMTA0LjMgMCA2OC42IDUwLjYgMTA5LjIgMTEzLjcgMTA5LjJ6Il0KICAgIH07CiAgICBmYU1hZ25pZnlpbmdHbGFzc1BsdXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFnbmlmeWluZy1nbGFzcy1wbHVzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNlYXJjaC1wbHVzIl0sICJmMDBlIiwgIk00MTYgMjA4YzAgNDUuOS0xNC45IDg4LjMtNDAgMTIyLjdMNTAyLjYgNDU3LjRjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNzLTMyLjggMTIuNS00NS4zIDBMMzMwLjcgMzc2QzI5Ni4zIDQwMS4xIDI1My45IDQxNiAyMDggNDE2IDkzLjEgNDE2IDAgMzIyLjkgMCAyMDhTOTMuMSAwIDIwOCAwIDQxNiA5My4xIDQxNiAyMDh6TTIwOCAxMTJjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgNDgtNDggMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw0OCAwIDAgNDhjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTQ4IDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTQ4IDAgMC00OGMwLTEzLjMtMTAuNy0yNC0yNC0yNHoiXQogICAgfTsKICAgIGZhU2VhcmNoUGx1cyA9IGZhTWFnbmlmeWluZ0dsYXNzUGx1czsKICAgIGZhRmxhc2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmxhc2siLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjBjMyIsICJNMjg4IDBMMTI4IDBDMTEwLjMgMCA5NiAxNC4zIDk2IDMyczE0LjMgMzIgMzIgMzJMMTI4IDIxNS41IDcuNSA0MjYuM0MyLjYgNDM1IDAgNDQ0LjcgMCA0NTQuNyAwIDQ4Ni40IDI1LjYgNTEyIDU3LjMgNTEybDMzMy40IDBjMzEuNiAwIDU3LjMtMjUuNiA1Ny4zLTU3LjMgMC0xMC0yLjYtMTkuOC03LjUtMjguNEwzMjAgMjE1LjUgMzIwIDY0YzE3LjcgMCAzMi0xNC4zIDMyLTMyUzMzNy43IDAgMzIwIDBMMjg4IDB6TTE5MiAyMTUuNWwwLTE1MS41IDY0IDAgMCAxNTEuNWMwIDExLjEgMi45IDIyLjEgOC40IDMxLjhsNDEuNiA3Mi43LTE2NCAwIDQxLjYtNzIuN2M1LjUtOS43IDguNC0yMC42IDguNC0zMS44eiJdCiAgICB9OwogICAgZmFBbGlnblJpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFsaWduLXJpZ2h0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYwMzgiLCAiTTQ0OCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMkwxOTIgOTZjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMjI0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJ6bTAgMjU2YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0yMjQgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwyMjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnpNMCAxOTJjMC0xNy43IDE0LjMtMzIgMzItMzJsMzg0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgMjI0Yy0xNy43IDAtMzItMTQuMy0zMi0zMnpNNDQ4IDQ0OGMwIDE3LjctMTQuMyAzMi0zMiAzMkwzMiA0ODBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMzg0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJ6Il0KICAgIH07CiAgICBmYUNhYmxlQ2FyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhYmxlLWNhciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODY3MywgNTc1NTEsICJ0cmFtIl0sICJmN2RhIiwgIk0yODgtMzJhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0ek0xNjAgMjRhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHpNMzIgMjg4YzAtMzUuMyAyOC43LTY0IDY0LTY0bDEzNiAwIDAtOTYuMi0xOTMuNCA1NS4zYy0xMi43IDMuNi0yNi0zLjctMjkuNy0xNi41czMuNy0yNiAxNi41LTI5LjdsMjI0LTY0IDAgMCAyMjQtNjRjMTIuNy0zLjYgMjYgMy43IDI5LjcgMTYuNXMtMy43IDI2LTE2LjUgMjkuN2wtMjA2LjYgNTkgMCAxMDkuOSAxMzYgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDE2MGMwIDM1LjMtMjguNyA2NC02NCA2NEw5NiA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMTYwem04MCAwYy04LjggMC0xNiA3LjItMTYgMTZsMCA2NGMwIDguOCA3LjIgMTYgMTYgMTZsNTYgMCAwLTk2LTU2IDB6bTE4NCA5NmwwLTk2LTgwIDAgMCA5NiA4MCAwem00OCAwbDU2IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtNjRjMC04LjgtNy4yLTE2LTE2LTE2bC01NiAwIDAgOTZ6Il0KICAgIH07CiAgICBmYVRyYW0gPSBmYUNhYmxlQ2FyOwogICAgZmFLaXRNZWRpY2FsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImtpdC1tZWRpY2FsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImZpcnN0LWFpZCJdLCAiZjQ3OSIsICJNNjQgNjRDMjguNyA2NCAwIDkyLjcgMCAxMjhMMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTYgMCAwLTM4NC0xNiAwem02NCAwbDAgMzg0IDI1NiAwIDAtMzg0LTI1NiAwek00NDggNDQ4YzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0bC0xNiAwIDAgMzg0IDE2IDB6TTIyNCAxODRjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgNDAgNDAgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTQwIDAgMCA0MGMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTQwLTQwIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmw0MCAwIDAtNDB6Il0KICAgIH07CiAgICBmYUZpcnN0QWlkID0gZmFLaXRNZWRpY2FsOwogICAgZmFHcmlwTGluZXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ3JpcC1saW5lcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmN2E0IiwgIk0zMiAyODhjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzg0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgMjg4em0wLTEyOGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzODQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwzMiAxNjB6Il0KICAgIH07CiAgICBmYUJ1cmdlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJidXJnZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiaGFtYnVyZ2VyIl0sICJmODA1IiwgIk00OCAzODRjLTguOCAwLTE2IDcuMi0xNiAxNiAwIDQ0LjIgMzUuOCA4MCA4MCA4MGwyODggMGM0NC4yIDAgODAtMzUuOCA4MC04MCAwLTguOC03LjItMTYtMTYtMTZMNDggMzg0ek0zMiAyMDJjMCAxMi4yIDkuOSAyMiAyMiAyMkw0NTggMjI0YzEyLjIgMCAyMi05LjkgMjItMjIgMC0xNy4yLTIuNi0zNC40LTEwLjgtNDkuNS0yMi4yLTQwLjgtODIuMy0xMjAuNS0yMTMuMi0xMjAuNVM2NSAxMTEuNiA0Mi44IDE1Mi41QzM0LjYgMTY3LjYgMzIgMTg0LjggMzIgMjAyek0wIDMwNGMwIDE3LjcgMTQuMyAzMiAzMiAzMmw0NDggMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwzMiAyNzJjLTE3LjcgMC0zMiAxNC4zLTMyIDMyek0yNTYgNzJhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4ek0xMjAgMTI4YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6bTI0OC0yNGEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6Il0KICAgIH07CiAgICBmYUhhbWJ1cmdlciA9IGZhQnVyZ2VyOwogICAgZmFTbm93bWFuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNub3dtYW4iLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFs5NzMxLCA5OTI0XSwgImY3ZDAiLCAiTTQwMyAyMTEuN2MzMi4yLTI0LjkgNTMtNjMuOSA1My0xMDcuNyAwLTc1LjEtNjAuOS0xMzYtMTM2LTEzNlMxODQgMjguOSAxODQgMTA0YzAgNDMuOSAyMC44IDgyLjkgNTMgMTA3LjctMzIuMiAxNi4zLTU5IDQxLjgtNzYuOCA3My4xTDExMiAyNjQuMiAxMTIgMjI0YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTkuNi0yMi41LTkuN2MtMTIuMi01LjItMjYuMyAuNC0zMS41IDEyLjZzLjQgMjYuMyAxMi42IDMxLjVjMzYuMSAxNS41IDc1LjkgMzIuNSAxMTkuNCA1MS4yLTMuOSAxNC45LTYgMzAuNi02IDQ2LjcgMCA3MCAzOS4xIDEzMC44IDk2LjYgMTYxLjkgNy45IDQuMyAxNi45IDYuMSAyNS45IDYuMWwxMjMgMGM5IDAgMTgtMS44IDI1LjktNi4xIDU3LjUtMzEuMSA5Ni42LTkyIDk2LjYtMTYxLjkgMC0xNi4yLTIuMS0zMS44LTYtNDYuNyA0My41LTE4LjcgODMuNC0zNS43IDExOS40LTUxLjIgMTIuMi01LjIgMTcuOC0xOS4zIDEyLjYtMzEuNXMtMTkuMy0xNy44LTMxLjUtMTIuNmwtMjIuNSA5LjcgMC0xOS42YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgNDAuMi00OC4yIDIwLjZjLTE3LjktMzEuMy00NC42LTU2LjgtNzYuOC03My4xek0yOTYgNDE2YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6bTI0LTEyMGEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6TTI0OCA4MGEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwek0zNjggNTZhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4ek0yOTIuMiAxNTkuM2MtMi43LTQuOC00LjItMTAuMi00LjItMTUuNyAwLTE3LjUgMTQuMi0zMS42IDMxLjYtMzEuNmwuOCAwYzE3LjUgMCAzMS42IDE0LjIgMzEuNiAzMS42IDAgNS41LTEuNCAxMC45LTQuMiAxNS43TDMyNyAxOTUuOGMtMy4xIDUuNC0xMC44IDUuNC0xMy45IDBsLTIwLjktMzYuNnoiXQogICAgfTsKICAgIGZhSG90ZWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG90ZWwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjc5NzZdLCAiZjU5NCIsICJNMTYgMjRDMTYgMTAuNyAyNi43IDAgNDAgMEw0NzIgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtOCAwIDAgNDE2IDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNEw0MCA1MTJjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsOCAwIDAtNDE2LTggMEMyNi43IDQ4IDE2IDM3LjMgMTYgMjR6bTIwOCA4OGwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2ek0xMjggOTZjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHptOTYgMTEybDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6TTM1MiA5NmMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwek0xMTIgMjA4bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6bTI0MC0xNmMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwek0yODggMzg0bDQzLjggMGM5LjkgMCAxNy41LTkgMTQtMTguMi0xMy44LTM2LjEtNDguOC02MS44LTg5LjctNjEuOHMtNzUuOSAyNS43LTg5LjcgNjEuOGMtMy41IDkuMiA0LjEgMTguMiAxNCAxOC4ybDQzLjggMCAwIDgwIDY0IDAgMC04MHoiXQogICAgfTsKICAgIGZhUHJpbnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicHJpbnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg0MjQsIDEyODQzOCwgOTExM10sICJmMDJmIiwgIk02NCA2NEM2NCAyOC43IDkyLjcgMCAxMjggMEwzNDEuNSAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43bDQyLjUgNDIuNWMxMiAxMiAxOC43IDI4LjMgMTguNyA0NS4zbDAgMzcuNS0zODQgMCAwLTgwek0wIDI1NmMwLTM1LjMgMjguNy02NCA2NC02NGwzODQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDk2YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0zMiAwIDAgNjRjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTI1NiAwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTY0LTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtOTZ6TTEyOCA0MTZsMCAzMiAyNTYgMCAwLTk2LTI1NiAwIDAgNjR6TTQ1NiAyNzJhMjQgMjQgMCAxIDAgLTQ4IDAgMjQgMjQgMCAxIDAgNDggMHoiXQogICAgfTsKICAgIGZhVm9sbGV5YmFsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ2b2xsZXliYWxsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3OTUyLCAidm9sbGV5YmFsbC1iYWxsIl0sICJmNDVmIiwgIk01MTIgMjU4LjljLTIzLjQgOC00Ny44IDEzLjEtNzIuNiAxNS4xIDUuOS05OC42LTMwLjctMTkxLjEtOTQuOS0yNTguMyA5Ny44IDM2IDE2Ny41IDEzMCAxNjcuNSAyNDAuMyAwIDEgMCAxLjkgMCAyLjl6bS01LjkgNTJjLTUuMiAyMy43LTEzLjYgNDYuMi0yNC45IDY2LjktOTQuNyA1Mi4yLTIxNCA1MC0zMDguNC0xMy42IDIxLjctMzEuMyA0OS44LTU4LjkgODMuOC04MC41IDc5LjUgNDEuNiAxNjguNSA0OS4xIDI0OS41IDI3LjF6TTI3OS43IDI0MS42Yy0zLjctODkuNy00MS43LTE3MC41LTEwMS4zLTIyOS43IDIyLjMtNy4xIDQ2LTExLjIgNzAuNS0xMS45IDkyLjUgNTUuOSAxNTAuMyAxNjAuMyAxNDIuNCAyNzMuOC0zOC0zLjItNzUuOS0xMy43LTExMS42LTMyLjN6TTEzMC41IDMyLjhDMTQ5LjEgNDkuMSAxNjUuOCA2Ny43IDE3OS45IDg4LjIgOTEuNSAxMzIuMyAyOS43IDIxMC4zIDMuNyAyOTkuNSAxLjMgMjg1LjMgMCAyNzAuOCAwIDI1NiAwIDE2MC4yIDUyLjYgNzYuNyAxMzAuNSAzMi44em03My40IDk3YzE2LjMgMzQuNSAyNi4xIDcyLjYgMjcuOSAxMTIuOC03NS44IDQ4LTEyNi44IDEyMS4zLTE0OC4zIDIwMi41LTE3LjYtMTYuMS0zMy0zNC42LTQ1LjUtNTUgMi4xLTEwOC4xIDYzLjctMjEwLjQgMTY1LjktMjYwLjN6TTI1NiA1MTJjLTQ3LjcgMC05Mi4zLTEzLTEzMC41LTM1LjcgNC44LTI0LjMgMTIuNi00OCAyMy4yLTcwLjQgODIuNCA1NC40IDE4MC44IDY4LjkgMjcxIDQ3LTQ0LjQgMzctMTAxLjUgNTkuMi0xNjMuNyA1OS4yeiJdCiAgICB9OwogICAgZmFWb2xsZXliYWxsQmFsbCA9IGZhVm9sbGV5YmFsbDsKICAgIGZhVHJhZmZpY0xpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRyYWZmaWMtbGlnaHQiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFsxMjg2NzhdLCAiZjYzNyIsICJNNjQtMzJDMjguNy0zMiAwLTMuMyAwIDMyTDAgMzg0YzAgODguNCA3MS42IDE2MCAxNjAgMTYwczE2MC03MS42IDE2MC0xNjBsMC0zNTJjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQtMzJ6bTk2IDM5MmMzMC45IDAgNTYgMjUuMSA1NiA1NnMtMjUuMSA1Ni01NiA1Ni01Ni0yNS4xLTU2LTU2IDI1LjEtNTYgNTYtNTZ6bTU2LTEwNGE1NiA1NiAwIDEgMSAtMTEyIDAgNTYgNTYgMCAxIDEgMTEyIDB6TTE2MCAxNTJhNTYgNTYgMCAxIDEgMC0xMTIgNTYgNTYgMCAxIDEgMCAxMTJ6Il0KICAgIH07CiAgICBmYVBsYW5lQ2lyY2xlQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGxhbmUtY2lyY2xlLWNoZWNrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NTUiLCAiTTIzMiAyNGMwLTMwLjkgMjUuMS01NiA1Ni01NnM1NiAyNS4xIDU2IDU2bDAgMTI3LjMgNzggNzEuNWMtNjkuMyAyOS0xMTggOTcuNC0xMTggMTc3LjIgMCA0OS4zIDE4LjYgOTQuMyA0OS4xIDEyOC4zTDI4OCA1MTIgMTc5LjkgNTM5Yy0xMC4xIDIuNS0xOS45LTUuMS0xOS45LTE1LjVsMC0xOS44YzAtNC45IDIuMi05LjUgNi0xMi41bDY2LTUyLjggMC05OS43LTE2Mi45IDU0LjNDNTguNyAzOTYuNCA0OCAzODguNyA0OCAzNzcuOGwwLTQzLjdjMC05IDMuOC0xNy41IDEwLjQtMjMuNkwyMzIgMTUxLjMgMjMyIDI0ek0zNTIgNDAwYTE0NCAxNDQgMCAxIDEgMjg4IDAgMTQ0IDE0NCAwIDEgMSAtMjg4IDB6bTIwMS40LTYwLjljLTcuMS01LjItMTcuMi0zLjYtMjIuNCAzLjVsLTUzIDcyLjktMjYuOC0yNi44Yy02LjItNi4yLTE2LjQtNi4yLTIyLjYgMHMtNi4yIDE2LjQgMCAyMi42bDQwIDQwYzMuMyAzLjMgNy45IDUgMTIuNiA0LjZzOC45LTIuOCAxMS43LTYuNWw2NC04OGM1LjItNy4xIDMuNi0xNy4yLTMuNS0yMi4zeiJdCiAgICB9OwogICAgZmFVc2VycyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1c2VycyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmMGMwIiwgIk0zMjAgMTZhMTA0IDEwNCAwIDEgMSAwIDIwOCAxMDQgMTA0IDAgMSAxIDAtMjA4ek05NiA4OGE3MiA3MiAwIDEgMSAwIDE0NCA3MiA3MiAwIDEgMSAwLTE0NHpNMCA0MTZjMC03MC43IDU3LjMtMTI4IDEyOC0xMjggMTIuOCAwIDI1LjIgMS45IDM2LjkgNS40LTMyLjkgMzYuOC01Mi45IDg1LjQtNTIuOSAxMzguNmwwIDE2YzAgMTEuNCAyLjQgMjIuMiA2LjcgMzJMMzIgNDgwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTMyem01MjEuMyA2NGM0LjMtOS44IDYuNy0yMC42IDYuNy0zMmwwLTE2YzAtNTMuMi0yMC0xMDEuOC01Mi45LTEzOC42IDExLjctMy41IDI0LjEtNS40IDM2LjktNS40IDcwLjcgMCAxMjggNTcuMyAxMjggMTI4bDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJsLTg2LjcgMHpNNDcyIDE2MGE3MiA3MiAwIDEgMSAxNDQgMCA3MiA3MiAwIDEgMSAtMTQ0IDB6TTE2MCA0MzJjMC04OC40IDcxLjYtMTYwIDE2MC0xNjBzMTYwIDcxLjYgMTYwIDE2MGwwIDE2YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0yNTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0xNnoiXQogICAgfTsKICAgIGZhQ2VydGlmaWNhdGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2VydGlmaWNhdGUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjBhMyIsICJNMjM5LjItOGMtNi4xLTYuMi0xNS04LjctMjMuNC02LjRTMjAwLjktNS42IDE5OC44IDIuOEwxODMuNSA2M2MtMS4xIDQuNC01LjYgNy05LjkgNS43TDExMy44IDUxLjljLTguNC0yLjQtMTcuNCAwLTIzLjUgNi4xcy04LjUgMTUuMS02LjEgMjMuNWwxNi45IDU5LjhjMS4yIDQuMy0xLjQgOC44LTUuNyA5LjlMMzUuMSAxNjYuNWMtOC40IDIuMS0xNSA4LjctMTcuMyAxNy4xcy4yIDE3LjMgNi40IDIzLjRsNDQuNSA0My4zYzMuMiAzLjEgMy4yIDguMyAwIDExLjVMMjQuMyAzMDUuMWMtNi4yIDYuMS04LjcgMTUtNi40IDIzLjRzOC45IDE0LjkgMTcuMyAxNy4xbDYwLjIgMTUuM2M0LjQgMS4xIDcgNS42IDUuNyA5LjlMODQuMiA0MzAuNWMtMi40IDguNCAwIDE3LjQgNi4xIDIzLjVzMTUuMSA4LjUgMjMuNSA2LjFsNTkuOC0xNi45YzQuMy0xLjIgOC44IDEuNCA5LjkgNS43bDE1LjMgNjAuMmMyLjEgOC40IDguNyAxNSAxNy4xIDE3LjNzMTcuMy0uMiAyMy40LTYuNGw0My4zLTQ0LjVjMy4xLTMuMiA4LjMtMy4yIDExLjUgMEwzMzcuMyA1MjBjNi4xIDYuMiAxNSA4LjcgMjMuNCA2LjRzMTQuOS04LjkgMTcuMS0xNy4zTDM5My4xIDQ0OWMxLjEtNC40IDUuNi03IDkuOS01LjdsNTkuOCAxNi45YzguNCAyLjQgMTcuNCAwIDIzLjUtNi4xczguNS0xNS4xIDYuMS0yMy41bC0xNi45LTU5LjhjLTEuMi00LjMgMS40LTguOCA1LjctOS45bDYwLjItMTUuM2M4LjQtMi4xIDE1LTguNyAxNy4zLTE3LjFzLS4yLTE3LjQtNi40LTIzLjRsLTQ0LjUtNDMuM2MtMy4yLTMuMS0zLjItOC4zIDAtMTEuNWw0NC41LTQzLjNjNi4yLTYuMSA4LjctMTUgNi40LTIzLjRzLTguOS0xNC45LTE3LjMtMTcuMWwtNjAuMi0xNS4zYy00LjQtMS4xLTctNS42LTUuNy05LjlsMTYuOS01OS44YzIuNC04LjQgMC0xNy40LTYuMS0yMy41cy0xNS4xLTguNS0yMy41LTYuMUw0MDMgNjguOGMtNC4zIDEuMi04LjgtMS40LTkuOS01LjdMMzc3LjggMi44Yy0yLjEtOC40LTguNy0xNS0xNy4xLTE3LjNzLTE3LjMgLjItMjMuNCA2LjRMMjk0IDM2LjVjLTMuMSAzLjItOC4zIDMuMi0xMS41IDBMMjM5LjItOHoiXQogICAgfTsKICAgIGZhQWxhcm1DbG9jazIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYWxhcm0tY2xvY2siLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5MjAwXSwgImYzNGUiLCAiTTUwNC40IDEzMi41Yy00LjUgMTAuNS0xOC40IDkuOC0yNC45IC40LTI3LjgtNDAtNjYuMS03Mi4yLTExMS05Mi42LTEwLjQtNC43LTEzLjctMTguMy00LjEtMjQuNiAxNS05LjkgMzMtMTUuNyA1Mi4zLTE1LjcgNTIuNiAwIDk1LjIgNDIuNiA5NS4yIDk1LjIgMCAxMy4yLTIuNyAyNS44LTcuNiAzNy4zem0tNDcxLjkgLjRjLTYuNSA5LjQtMjAuNSAxMC4xLTI0LjktLjQtNC45LTExLjUtNy42LTI0LjEtNy42LTM3LjMgMC01Mi42IDQyLjYtOTUuMiA5NS4yLTk1LjIgMTkuMyAwIDM3LjMgNS44IDUyLjMgMTUuNyA5LjYgNi4zIDYuMyAxOS45LTQuMSAyNC42LTQ0LjggMjAuNC04My4xIDUyLjYtMTExIDkyLjZ6TTM5MC4yIDQ2Ny40QzM1Mi44IDQ5NS40IDMwNi4zIDUxMiAyNTYgNTEycy05Ni44LTE2LjYtMTM0LjEtNDQuNkw4Ni42IDUwMi42Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM2wzNS4yLTM1LjJDNDguNiAzODQuOCAzMiAzMzguMyAzMiAyODggMzIgMTY0LjMgMTMyLjMgNjQgMjU2IDY0UzQ4MCAxNjQuMyA0ODAgMjg4YzAgNTAuMy0xNi42IDk2LjgtNDQuNiAxMzQuMmwzNS4yIDM1LjJjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNzLTMyLjggMTIuNS00NS4zIDBsLTM1LjItMzUuMnpNMjgwIDE4NGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDEwNGMwIDYuNCAyLjUgMTIuNSA3IDE3bDU2IDU2YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNDktNDkgMC05NC4xeiJdCiAgICB9OwogICAgZmFIZWxpY29wdGVyU3ltYm9sID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhlbGljb3B0ZXItc3ltYm9sIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1MDIiLCAiTTQ0NS40IDIyNGw2NC43IDBDNDk1LjYgMTA4LjIgNDAzLjggMTYuNCAyODggMmwwIDY0LjdDMzY4LjQgODAuMSA0MzEuOSAxNDMuNiA0NDUuNCAyMjR6TTUxMCAyODhsLTY0LjcgMEM0MzEuOSAzNjguNCAzNjguNCA0MzEuOSAyODggNDQ1LjNsMCA2NC43YzExNS44LTE0LjQgMjA3LjYtMTA2LjIgMjIyLTIyMnpNMiAyODhDMTYuNCA0MDMuOCAxMDguMiA0OTUuNiAyMjQgNTEwbDAtNjQuN0MxNDMuNiA0MzEuOSA4MC4yIDM2OC40IDY2LjcgMjg4TDIgMjg4em0wLTY0bDY0LjcgMEM4MC4yIDE0My42IDE0My42IDgwLjEgMjI0IDY2LjdMMjI0IDJDMTA4LjIgMTYuNCAxNi40IDEwOC4yIDIgMjI0em0yMDYtNjRjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAxOTJjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTY0IDk2IDAgMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTkyYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgNjQtOTYgMCAwLTY0eiJdCiAgICB9OwogICAgZmFIb3VzZUNoaW1uZXlDcmFjayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VzZS1jaGltbmV5LWNyYWNrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImhvdXNlLWRhbWFnZSJdLCAiZjZmMSIsICJNMjM0LjIgOC42YzEyLjMtMTEuNCAzMS4zLTExLjQgNDMuNSAwTDM2OCA5Mi4zIDM2OCA4MGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTAxLjUgMzcuOCAzNS4xYzkuNiA5IDEyLjggMjIuOSA4IDM1LjFTNDkzLjIgMjcyIDQ4MCAyNzJsLTE2IDAgMCAxNzZjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTEwNS42IDAtMzguNC02NCA4MC44LTY3LjNjNy44LTYuNSA3LjYtMTguNi0uNC0yNC45TDIxOC42IDI2My4yYy0xNC42LTExLjUtMzMuOCA3LTIyLjggMjJMMjU2IDM2OCAxNzAuNSA0MzkuMmMtNi4xIDUtNy41IDEzLjgtMy41IDIwLjVsMzEuMyA1Mi4yLTg2LjQgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0xNzYtMTYgMGMtMTMuMiAwLTI1LTguMS0yOS44LTIwLjNzLTEuNi0yNi4yIDgtMzUuMWwyMjQtMjA4eiJdCiAgICB9OwogICAgZmFIb3VzZURhbWFnZSA9IGZhSG91c2VDaGltbmV5Q3JhY2s7CiAgICBmYVBlcnNvbk1pbGl0YXJ5UG9pbnRpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLW1pbGl0YXJ5LXBvaW50aW5nIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1NGEiLCAiTTIxNC45IDE0LjFDMjAyIDE1LjIgMTkyIDI2IDE5MiAzOSAxOTIgNTIuOCAyMDMuMiA2NCAyMTcgNjRsMTUxIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzAuNkMzODQgOCAzNzYgLjcgMzY2LjcgMS40TDIxNC45IDE0LjF6TTIwOCAxMTJjMCA0NC4yIDM1LjggODAgODAgODBzODAtMzUuOCA4MC04MGMwLTUuNS0uNi0xMC44LTEuNi0xNkwyMDkuNiA5NmMtMSA1LjItMS42IDEwLjUtMS42IDE2ek00MCAyMjRjLTIyLjEgMC00MCAxNy45LTQwIDQwczE3LjkgNDAgNDAgNDBsMTUyIDAgMCA4OS40IDE2Mi44LTE2Mi44Yy0xMy4zLTQuMy0yNy4zLTYuNS00MS42LTYuNUw0MCAyMjR6bTM0NS43IDIwLjlsLTE3MS4xIDE3MS4xIDE2OS40IDAgMC00Ni4zIDUzLjYgOTAuNmMxMS4yIDE5IDM1LjggMjUuMyA1NC44IDE0LjFzMjUuMy0zNS44IDE0LjEtNTQuOEw0MzAuMyAyOTAuOGMtMTEuMi0xOS0yNi42LTM0LjUtNDQuNi00NS45ek0xOTIgNDQ4bDAgMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTI4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0zMi0xOTIgMHoiXQogICAgfTsKICAgIGZhRGF0YWJhc2UgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZGF0YWJhc2UiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjFjMCIsICJNNDQ4IDIwNS44Yy0xNC44IDkuOC0zMS44IDE3LjctNDkuNSAyNC00NyAxNi44LTEwOC43IDI2LjItMTc0LjUgMjYuMlM5Ni40IDI0Ni41IDQ5LjUgMjI5LjhjLTE3LjYtNi4zLTM0LjctMTQuMi00OS41LTI0TDAgMjg4YzAgNDQuMiAxMDAuMyA4MCAyMjQgODBzMjI0LTM1LjggMjI0LTgwbDAtODIuMnptMC03Ny44bDAtNDhDNDQ4IDM1LjggMzQ3LjcgMCAyMjQgMFMwIDM1LjggMCA4MGwwIDQ4YzAgNDQuMiAxMDAuMyA4MCAyMjQgODBzMjI0LTM1LjggMjI0LTgwek0zOTguNSAzODkuOEMzNTEuNiA0MDYuNSAyODkuOSA0MTYgMjI0IDQxNlM5Ni40IDQwNi41IDQ5LjUgMzg5LjhjLTE3LjYtNi4zLTM0LjctMTQuMi00OS41LTI0TDAgNDMyYzAgNDQuMiAxMDAuMyA4MCAyMjQgODBzMjI0LTM1LjggMjI0LTgwbDAtNjYuMmMtMTQuOCA5LjgtMzEuOCAxNy43LTQ5LjUgMjR6Il0KICAgIH07CiAgICBmYU5ld3NwYXBlcjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibmV3c3BhcGVyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MjQwXSwgImYxZWEiLCAiTTAgNDE2TDAgMTIwYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCAyODhjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNEw5NiA5NmMwLTM1LjMgMjguNy02NCA2NC02NGwyODggMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0ek0xNjAgMTI4bDAgNjRjMCAxNy43IDE0LjMgMzIgMzIgMzJsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTY0YzAtMTcuNy0xNC4zLTMyLTMyLTMybC02NCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnptMjQgMjQwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDI0MCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0yNDAgMHptLTI0LTcyYzAgMTMuMyAxMC43IDI0IDI0IDI0bDI0MCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0yNDAgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjR6TTM2MCAxNzZjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNjQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNjQgMHoiXQogICAgfTsKICAgIGZhQ2xvdWRSYWluID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNsb3VkLXJhaW4iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjc3ODMsIDk5MjZdLCAiZjczZCIsICJNOTYgMzIwYy01MyAwLTk2LTQzLTk2LTk2IDAtNDIuNSAyNy42LTc4LjYgNjUuOS05MS4yLTEuMy02LjctMS45LTEzLjctMS45LTIwLjggMC02MS45IDUwLjEtMTEyIDExMi0xMTIgNDMuMSAwIDgwLjUgMjQuMyA5OS4yIDYwIDE0LjctMTcuMSAzNi41LTI4IDYwLjgtMjggNDQuMiAwIDgwIDM1LjggODAgODAgMCA1LjUtLjYgMTAuOC0xLjYgMTYgLjUgMCAxLjEgMCAxLjYgMCA1MyAwIDk2IDQzIDk2IDk2cy00MyA5Ni05NiA5Nkw5NiAzMjB6bTEuNiA2OC4yYzEuMS0yLjUgMy42LTQuMiA2LjQtNC4yczUuMyAxLjYgNi40IDQuMmwzMC4yIDY4LjJjMi4yIDUuMSAzLjQgMTAuNSAzLjQgMTYgMCAyMS45LTE4LjEgMzkuNi00MCAzOS42cy00MC0xNy43LTQwLTM5LjZjMC01LjUgMS4yLTExIDMuNC0xNmwzMC4yLTY4LjJ6bTE1MiAwYzEuMS0yLjUgMy42LTQuMiA2LjQtNC4yczUuMyAxLjYgNi40IDQuMmwzMC4yIDY4LjJjMi4yIDUuMSAzLjQgMTAuNSAzLjQgMTYgMCAyMS45LTE4LjEgMzkuNi00MCAzOS42cy00MC0xNy43LTQwLTM5LjZjMC01LjUgMS4yLTExIDMuNC0xNmwzMC4yLTY4LjJ6bTEyMS44IDY4LjJsMzAuMi02OC4yYzEuMS0yLjUgMy42LTQuMiA2LjQtNC4yczUuMyAxLjYgNi40IDQuMmwzMC4yIDY4LjJjMi4yIDUuMSAzLjQgMTAuNSAzLjQgMTYgMCAyMS45LTE4LjEgMzkuNi00MCAzOS42cy00MC0xNy43LTQwLTM5LjZjMC01LjUgMS4yLTExIDMuNC0xNnoiXQogICAgfTsKICAgIGZhTWF4aW1pemUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWF4aW1pemUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiZXhwYW5kLWFycm93cy1hbHQiXSwgImYzMWUiLCAiTTE2OCAzMkwyNCAzMkMxMC43IDMyIDAgNDIuNyAwIDU2TDAgMjAwYzAgOS43IDUuOCAxOC41IDE0LjggMjIuMlMzNC4xIDIyMy44IDQxIDIxN2w0MC00MCA3OSA3OS03OSA3OS00MC00MGMtNi45LTYuOS0xNy4yLTguOS0yNi4yLTUuMlMwIDMwMi4zIDAgMzEyTDAgNDU2YzAgMTMuMyAxMC43IDI0IDI0IDI0bDE0NCAwYzkuNyAwIDE4LjUtNS44IDIyLjItMTQuOHMxLjctMTkuMy01LjItMjYuMmwtNDAtNDAgNzktNzkgNzkgNzktNDAgNDBjLTYuOSA2LjktOC45IDE3LjItNS4yIDI2LjJTMjcwLjMgNDgwIDI4MCA0ODBsMTQ0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC0xNDRjMC05LjctNS44LTE4LjUtMTQuOC0yMi4ycy0xOS4zLTEuNy0yNi4yIDUuMmwtNDAgNDAtNzktNzkgNzktNzkgNDAgNDBjNi45IDYuOSAxNy4yIDguOSAyNi4yIDUuMlM0NDggMjA5LjcgNDQ4IDIwMGwwLTE0NGMwLTEzLjMtMTAuNy0yNC0yNC0yNEwyODAgMzJjLTkuNyAwLTE4LjUgNS44LTIyLjIgMTQuOFMyNTYuMiA2Ni4xIDI2MyA3M2w0MCA0MC03OSA3OS03OS03OSA0MC00MGM2LjktNi45IDguOS0xNy4yIDUuMi0yNi4yUzE3Ny43IDMyIDE2OCAzMnoiXQogICAgfTsKICAgIGZhRXhwYW5kQXJyb3dzQWx0ID0gZmFNYXhpbWl6ZTsKICAgIGZhTG9jYXRpb25BcnJvdyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsb2NhdGlvbi1hcnJvdyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMTI0IiwgIk00NzcuOSA3NS41YzQuNS0xMS44IDEuNy0yNS4yLTcuMi0zNC4xcy0yMi4zLTExLjgtMzQuMS03LjJsLTQxNiAxNjBDNy45IDE5OS0uMyAyMTEuMiAwIDIyNC43czkuMSAyNS40IDIxLjkgMjkuNmwxNzYuOCA1OC45IDU4LjkgMTc2LjhjNC4zIDEyLjggMTYuMSAyMS42IDI5LjYgMjEuOXMyNS43LTcuOSAzMC42LTIwLjVsMTYwLTQxNnoiXQogICAgfTsKICAgIGZhQ2l0eSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXR5IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI3OTYxXSwgImY2NGYiLCAiTTMyMCAwYy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDMyLTQ4IDAgMC03MmMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDcyLTY0IDAgMC03MkM5NiAxMC43IDg1LjMgMCA3MiAwUzQ4IDEwLjcgNDggMjRsMCA3NGMtMjcuNiA3LjEtNDggMzIuMi00OCA2MkwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGw0NDggMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTE5MmMwLTM1LjMtMjguNy02NC02NC02NGwtNjQgMCAwLTEyOGMwLTM1LjMtMjguNy02NC02NC02NEwzMjAgMHptNjQgMTEybDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZ6bS0xNiA4MGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwem0xNiAxMTJsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNnptMTEyLTE2YzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDB6TTI1NiAzMDRsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNnpNMjQwIDE5MmM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwek0xMjggMzA0bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZ6TTExMiAxOTJjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMHoiXQogICAgfTsKICAgIGZhWFJheSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ4LXJheSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNDk3IiwgIk0wIDY0QzAgNDYuMyAxNC4zIDMyIDMyIDMybDQ0OCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybDAgMzIwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDQ4MGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMkwzMiA5NkMxNC4zIDk2IDAgODEuNyAwIDY0em0yODAgNTZjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAxNi02NCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDY0IDAgMCA0OC04MCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDgwIDAgMCA0OC02NCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDY0IDAgMCAxNmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTYgNjQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNjQgMCAwLTQ4IDgwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTgwIDAgMC00OCA2NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC02NCAwIDAtMTZ6Il0KICAgIH07CiAgICBmYVVtYnJlbGxhQmVhY2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidW1icmVsbGEtYmVhY2giLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjc5NThdLCAiZjVjYSIsICJNNDk3LjUgMzQxLjFjLTUuOSAxNi43LTI1LjMgMjMtNDEuMSAxNS4xbC0xNzguMi04OS4xLTEuNiAzLjItODguOCAxNzcuNyAyOTIuMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDUxMmMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw4NC4yIDAgMTAzLjItMjA2LjMgMS42LTMuMi0xNjUuNC04Mi43Yy0xNS44LTcuOS0yMi40LTI3LjMtMTIuNS00MiA0NS45LTY4LjYgMTI0LjEtMTEzLjggMjEyLjktMTEzLjggMTQxLjQgMCAyNTYgMTE0LjYgMjU2IDI1NiAwIDI5LjgtNS4xIDU4LjUtMTQuNSA4NS4xeiJdCiAgICB9OwogICAgZmFBcnJvd1JpZ2h0VG9CcmFja2V0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXJpZ2h0LXRvLWJyYWNrZXQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsic2lnbi1pbiJdLCAiZjA5MCIsICJNMzUyIDk2bDY0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAyNTZjMCAxNy43LTE0LjMgMzItMzIgMzJsLTY0IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNjQgMGM1MyAwIDk2LTQzIDk2LTk2bDAtMjU2YzAtNTMtNDMtOTYtOTYtOTZsLTY0IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJ6bS05LjQgMTgyLjZjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNsLTEyOC0xMjhjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zTDI0Mi43IDIyNCAzMiAyMjRjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMjEwLjcgMC03My40IDczLjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBsMTI4LTEyOHoiXQogICAgfTsKICAgIGZhU2lnbkluID0gZmFBcnJvd1JpZ2h0VG9CcmFja2V0OwogICAgZmFIZWFkc2V0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhlYWRzZXQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjU5MCIsICJNMjI0IDY0Yy03OSAwLTE0NC43IDU3LjMtMTU3LjcgMTMyLjcgOS4zLTMgMTkuMy00LjcgMjkuNy00LjdsMTYgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDk2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xNiAwYy01MyAwLTk2LTQzLTk2LTk2bDAtNjRDMCAxMDAuMyAxMDAuMyAwIDIyNCAwUzQ0OCAxMDAuMyA0NDggMjI0bDAgMTY4LjFjMCA2Ni4zLTUzLjggMTIwLTEyMC4xIDEyMGwtODcuOS0uMS0zMiAwYy0yNi41IDAtNDgtMjEuNS00OC00OHMyMS41LTQ4IDQ4LTQ4bDMyIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAwIDQwIDBjMzkuOCAwIDcyLTMyLjIgNzItNzJsMC0yMC45Yy0xNC4xIDguMi0zMC41IDEyLjgtNDggMTIuOGwtMTYgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC05NmMwLTI2LjUgMjEuNS00OCA0OC00OGwxNiAwYzEwLjQgMCAyMC4zIDEuNiAyOS43IDQuNy0xMy03NS4zLTc4LjYtMTMyLjctMTU3LjctMTMyLjd6Il0KICAgIH07CiAgICBmYVNwbG90Y2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3Bsb3RjaCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNWJjIiwgIk0yMDguNSA2Mi4zbDI4LjEtMzYuOUMyNDguOCA5LjQgMjY3LjggMCAyODggMCAzMTYuNSAwIDM0MS42IDE4LjcgMzQ5LjggNDZsMTcuOCA1OS40YzEwLjMgMzQuNCAzNi4xIDYyIDY5LjggNzQuNmwzOS44IDE0LjljMjAuOSA3LjkgMzQuOCAyNy45IDM0LjggNTAuMiAwIDE2LjktNy45IDMyLjgtMjEuNSA0Mi45bC02Ny4zIDUwLjVjLTI0LjMgMTguMi0zNy4yIDQ3LjktMzMuOCA3OC4xbDIuNSAyMi43YzQuMyAzOC43LTI2IDcyLjYtNjUgNzIuNi0xNC44IDAtMjkuMy01LjEtNDAuOS0xNC4zbC01NS4zLTQ0LjNjLTQuNS0zLjYtOS4zLTYuNy0xNC41LTkuMi0xNS44LTcuOS0zMy43LTEwLjQtNTEtNy4zTDgyLjQgNDUxLjljLTM0LjYgNi4zLTY2LjQtMjAuMy02Ni40LTU1LjQgMC0xMy4yIDQuNy0yNiAxMy4xLTM2LjJsMTEuMi0xMy40YzE0LjYtMTcuNCAyMi42LTM5LjQgMjIuNi02Mi4xIDAtMTguOC01LjUtMzcuMi0xNS44LTUzTDguOCAxNzMuNUMzLjEgMTY0LjcgMCAxNTQuNCAwIDE0My45IDAgMTEwLjUgMzAuMSA4NS4xIDYzIDkwLjdsNTEuMyA4LjdjMzUuOSA2LjEgNzIuMi04LjIgOTQuMi0zNy4xeiJdCiAgICB9OwogICAgZmFVcExvbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXAtbG9uZyIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWyJsb25nLWFycm93LWFsdC11cCJdLCAiZjMwYyIsICJNMTM3LjQtMjIuNmMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMGwxMjggMTI4YzkuMiA5LjIgMTEuOSAyMi45IDYuOSAzNC45UzMwMC45IDE2MCAyODggMTYwbC02NCAwIDAgMzM2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0zMiAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTMzNi02NCAwYy0xMi45IDAtMjQuNi03LjgtMjkuNi0xOS44Uy4yIDExNC41IDkuNCAxMDUuNGwxMjgtMTI4eiJdCiAgICB9OwogICAgZmFMb25nQXJyb3dBbHRVcCA9IGZhVXBMb25nOwogICAgZmFIZXhhZ29uTm9kZXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGV4YWdvbi1ub2RlcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNjk5IiwgIk0yNDggMTA2LjZjMTguOS05IDMyLTI4LjMgMzItNTAuNmMwLTMwLjktMjUuMS01Ni01Ni01NnMtNTYgMjUuMS01NiA1NmMwIDIyLjMgMTMuMSA0MS42IDMyIDUwLjZsMCA5OC44Yy0yLjggMS4zLTUuNSAyLjktOCA0LjdsLTgwLjEtNDUuOGMxLjYtMjAuOC04LjYtNDEuNi0yNy45LTUyLjhDNTcuMiA5NiAyMyAxMDUuMiA3LjUgMTMyUzEuMiAxOTMgMjggMjA4LjVjMS4zIC44IDIuNiAxLjUgNCAyLjFsMCA5MC44Yy0xLjMgLjYtMi43IDEuMy00IDIuMUMxLjIgMzE5LTggMzUzLjIgNy41IDM4MFM1Ny4yIDQxNiA4NCA0MDAuNWMxOS4zLTExLjEgMjkuNC0zMiAyNy44LTUyLjhsNTAuNS0yOC45Yy0xMS41LTExLjItMTkuOS0yNS42LTIzLjgtNDEuN0w4OCAzMDYuMWMtMi42LTEuOC01LjItMy4zLTgtNC43bDAtOTAuOGMyLjgtMS4zIDUuNS0yLjkgOC00LjdsODAuMSA0NS44Yy0uMSAxLjQtLjIgMi44LS4yIDQuM2MwIDIyLjMgMTMuMSA0MS42IDMyIDUwLjZsMCA5OC44Yy0xOC45IDktMzIgMjguMy0zMiA1MC42YzAgMzAuOSAyNS4xIDU2IDU2IDU2czU2LTI1LjEgNTYtNTZjMC0yMi4zLTEzLjEtNDEuNi0zMi01MC42bDAtOTguOGMyLjgtMS4zIDUuNS0yLjkgOC00LjdsODAuMSA0NS44Yy0xLjYgMjAuOCA4LjYgNDEuNiAyNy44IDUyLjhjMjYuOCAxNS41IDYxIDYuMyA3Ni41LTIwLjVzNi4zLTYxLTIwLjUtNzYuNWMtMS4zLS44LTIuNy0xLjUtNC0yLjFsMC05MC44YzEuNC0uNiAyLjctMS4zIDQtMi4xYzI2LjgtMTUuNSAzNi00OS43IDIwLjUtNzYuNVMzOTAuOCA5NiAzNjQgMTExLjVjLTE5LjMgMTEuMS0yOS40IDMyLTI3LjggNTIuOGwtNTAuNiAyOC45YzExLjUgMTEuMiAxOS45IDI1LjYgMjMuOCA0MS43TDM2MCAyMDUuOWMyLjYgMS44IDUuMiAzLjMgOCA0LjdsMCA5MC44Yy0yLjggMS4zLTUuNSAyLjktOCA0LjZsLTgwLjEtNDUuOGMuMS0xLjQgLjItMi44IC4yLTQuM2MwLTIyLjMtMTMuMS00MS42LTMyLTUwLjZsMC05OC44eiJdCiAgICB9OwogICAgZmFIb3NwaXRhbDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG9zcGl0YWwiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjc5NzMsIDYyNTg5LCAiaG9zcGl0YWwtYWx0IiwgImhvc3BpdGFsLXdpZGUiXSwgImYwZjgiLCAiTTEyOCA2NGMwLTM1LjMgMjguNy02NCA2NC02NEwzODQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDY0IDY0IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyNTZjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDE5MmMwLTM1LjMgMjguNy02NCA2NC02NGw2NCAwIDAtNjR6TTI3MiAzNTJjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgODAgOTYgMCAwLTgwYzAtMTcuNy0xNC4zLTMyLTMyLTMybC0zMiAwek0xMjggMzY4bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZ6TTExMiAyNTZjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMHpNNTEyIDM2OGwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2ek00OTYgMjU2YzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDB6TTI2NCAxMDRsMCAzMi0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAxNmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMCAwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwxNiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyIDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMTZjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwIDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0xNiAwYy04LjggMC0xNiA3LjItMTYgMTZ6Il0KICAgIH07CiAgICBmYUhvc3BpdGFsQWx0MiA9IGZhSG9zcGl0YWwyOwogICAgZmFIb3NwaXRhbFdpZGUyID0gZmFIb3NwaXRhbDI7CiAgICBmYVBlcnNvbkhhcmFzc2luZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24taGFyYXNzaW5nIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1NDkiLCAiTTE5MiA5NmE0OCA0OCAwIDEgMCAwLTk2IDQ4IDQ4IDAgMSAwIDAgOTZ6TTU5LjQgMzA0LjVMODggMjU2LjkgODggNDgwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xMjggMTYgMCAwIDEyOGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjQ0LjcgNDcuNCA1Ny4xYzExLjMgMTMuNiAzMS41IDE1LjUgNDUuMSA0LjJzMTUuNS0zMS41IDQuMi00NS4xbC03My43LTg4LjljLTE4LjItMjItNDUuMy0zNC43LTczLjktMzQuN2wtMzUuOSAwYy0zMy43IDAtNjQuOSAxNy43LTgyLjMgNDYuNmwtNTguMyA5N2MtOS4xIDE1LjEtNC4yIDM0LjggMTAuOSA0My45czM0LjggNC4yIDQzLjktMTAuOXpNNDgwIDI0MGE0OCA0OCAwIDEgMCAtOTYgMCA0OCA0OCAwIDEgMCA5NiAwek00NjQgMzQ0bDAgNTguNy00MS40LTQxLjRjLTcuMy03LjMtMTcuNi0xMC42LTI3LjgtOXMtMTguOSA4LjEtMjMuNSAxNy4zbC00OCA5NmMtNy45IDE1LjgtMS41IDM1IDE0LjMgNDIuOXMzNSAxLjUgNDIuOS0xNC4zbDI4LjEtNTYuMyA1NC43IDU0LjdjMTIuNCAxMi40IDI5LjEgMTkuMyA0Ni42IDE5LjMgMzYuNCAwIDY1LjktMjkuNSA2NS45LTY1LjlMNTc2IDM0NGMwLTMwLjktMjUuMS01Ni01Ni01NnMtNTYgMjUuMS01NiA1NnpNMjg4IDQ4YzAgOC44IDcuMiAxNiAxNiAxNmw1NiAwYzguOCAwIDE2LTcuMiAxNi0xNnMtNy4yLTE2LTE2LTE2bC01NiAwYy04LjggMC0xNiA3LjItMTYgMTZ6bS0uOCA0OS43Yy03LjktNC0xNy41LS43LTIxLjUgNy4ycy0uNyAxNy41IDcuMiAyMS41bDQ4IDI0YzcuOSA0IDE3LjUgLjcgMjEuNS03LjJzLjctMTcuNS03LjItMjEuNWwtNDgtMjR6Il0KICAgIH07CiAgICBmYU1vbmV5QmlsbFRyZW5kVXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibW9uZXktYmlsbC10cmVuZC11cCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTI5IiwgIk00ODAgOGMwLTEzLjMtMTAuNy0yNC0yNC0yNEwzNTQuMi0xNmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw0My45IDAtMTExLjMgMTExLjMtOTUuMS04MS41Yy05LTcuNy0yMi4yLTcuNy0zMS4yIDBsLTExMiA5NmMtMTAuMSA4LjYtMTEuMiAyMy44LTIuNiAzMy44czIzLjggMTEuMiAzMy44IDIuNmw5Ni40LTgyLjYgOTYuNCA4Mi42YzkuNSA4LjIgMjMuNyA3LjYgMzIuNi0xLjNsMTI3LTEyNyAwIDQzLjljMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNEw0ODAgOHpNNDggMjU2Yy0yNi41IDAtNDggMjEuNS00OCA0OEwwIDQ2NGMwIDI2LjUgMjEuNSA0OCA0OCA0OGw0MTYgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTE2MGMwLTI2LjUtMjEuNS00OC00OC00OEw0OCAyNTZ6bTQ3LjMgNTZjLTMuNCAyMC4xLTE5LjIgMzYtMzkuNCAzOS40LTQuNCAuNy04LTIuOS04LTcuM2wwLTMyYzAtNC40IDMuNi04IDgtOGwzMiAwYzQuNCAwIDguMSAzLjYgNy4zIDh6bTAgMTQ0LjFjLjcgNC40LTIuOSA4LTcuMyA4bC0zMiAwYy00LjQgMC04LTMuNi04LThsMC0zMmMwLTQuNCAzLjYtOC4xIDgtNy4zIDIwLjEgMy40IDM2IDE5LjIgMzkuNCAzOS40ek00NTYgNDE2LjdjNC40LS43IDggMi45IDggNy4zbDAgMzJjMCA0LjQtMy42IDgtOCA4bC0zMiAwYy00LjQgMC04LjEtMy42LTcuMy04IDMuNC0yMC4xIDE5LjItMzYgMzkuNC0zOS40ek00MTYuNyAzMTJjLS43LTQuNCAyLjktOCA3LjMtOGwzMiAwYzQuNCAwIDggMy42IDggOGwwIDMyYzAgNC40LTMuNiA4LjEtOCA3LjMtMjAuMS0zLjQtMzYtMTkuMi0zOS40LTM5LjR6TTE5MiAzODRhNjQgNjQgMCAxIDEgMTI4IDAgNjQgNjQgMCAxIDEgLTEyOCAweiJdCiAgICB9OwogICAgZmFQZW5SdWxlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZW4tcnVsZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsicGVuY2lsLXJ1bGVyIl0sICJmNWFlIiwgIk00MDQgMGMxOS4yIDAgMzcuNiA3LjYgNTEuMSAyMS4ybDM1LjcgMzUuN0M1MDQuNCA3MC40IDUxMiA4OC44IDUxMiAxMDhzLTcuNiAzNy42LTIxLjIgNTEuMUw0NDUuOSAyMDQgMzA4IDY2LjEgMzUyLjkgMjEuMkMzNjYuNCA3LjYgMzg0LjggMCA0MDQgMHpNNTguOSAzMTUuMUwyNzQuMSAxMDAgNDEyIDIzNy45IDE5Ni45IDQ1My4xYy0xMC43IDEwLjctMjQuMSAxOC41LTM4LjcgMjIuNkwzMC40IDUxMS4xYy04LjMgMi4zLTE3LjMgMC0yMy40LTYuMnMtOC41LTE1LjEtNi4yLTIzLjRMMzYuNCAzNTMuOGM0LjEtMTQuNiAxMS44LTI3LjkgMjIuNi0zOC43ek0yMjUuNCA4MC44TDgwLjggMjI1LjQgMTEuNyAxNTYuM2MtMTUuNi0xNS42LTE1LjYtNDAuOSAwLTU2LjZsODgtODhjMTUuNi0xNS42IDQwLjktMTUuNiA1Ni42IDBsNS45IDUuOS01Ni4zIDU2LjNjLTcuOCA3LjgtNy44IDIwLjUgMCAyOC4zczIwLjUgNy44IDI4LjMgMGw1Ni4zLTU2LjMgMzQuOSAzNC45ek00MzEuMiAyODYuNmwzNC45IDM0LjktNTYuMyA1Ni4zYy03LjggNy44LTcuOCAyMC41IDAgMjguM3MyMC41IDcuOCAyOC4zIDBsNTYuMy01Ni4zIDUuOSA1LjljMTUuNiAxNS42IDE1LjYgNDAuOSAwIDU2LjZsLTg4IDg4Yy0xNS42IDE1LjYtNDAuOSAxNS42LTU2LjYgMGwtNjkuMS02OS4xIDE0NC42LTE0NC42eiJdCiAgICB9OwogICAgZmFQZW5jaWxSdWxlciA9IGZhUGVuUnVsZXI7CiAgICBmYVJlcGVhdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyZXBlYXQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgyNTddLCAiZjM2MyIsICJNNDcwLjYgMTE4LjZjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNsLTY0LTY0Yy05LjItOS4yLTIyLjktMTEuOS0zNC45LTYuOVMzNTIgMTkuMSAzNTIgMzJsMCAzMi0xNjAgMEM4NiA2NCAwIDE1MCAwIDI1NiAwIDI3My43IDE0LjMgMjg4IDMyIDI4OHMzMi0xNC4zIDMyLTMyYzAtNzAuNyA1Ny4zLTEyOCAxMjgtMTI4bDE2MCAwIDAgMzJjMCAxMi45IDcuOCAyNC42IDE5LjggMjkuNnMyNS43IDIuMiAzNC45LTYuOWw2NC02NHpNNDEuNCAzOTMuNGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNsNjQgNjRjOS4yIDkuMiAyMi45IDExLjkgMzQuOSA2LjlTMTYwIDQ5Mi45IDE2MCA0ODBsMC0zMiAxNjAgMGMxMDYgMCAxOTItODYgMTkyLTE5MiAwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmMwIDcwLjctNTcuMyAxMjgtMTI4IDEyOGwtMTYwIDAgMC0zMmMwLTEyLjktNy44LTI0LjYtMTkuOC0yOS42cy0yNS43LTIuMi0zNC45IDYuOWwtNjQgNjR6Il0KICAgIH07CiAgICBmYUJvbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm9uZSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzEyOTQ2MF0sICJmNWQ3IiwgIk0xOTcuNCAxNjBjLTMuOSAwLTcuMi0yLjgtOC4xLTYuNi0xMC4yLTQyLjEtNDguMS03My40LTkzLjMtNzMuNC01MyAwLTk2IDQzLTk2IDk2IDAgMjkuMSAxMi45IDU1LjEgMzMuMyA3Mi43IDQuMyAzLjcgNC4zIDEwLjggMCAxNC41LTIwLjQgMTcuNi0zMy4zIDQzLjctMzMuMyA3Mi43IDAgNTMgNDMgOTYgOTYgOTYgNDUuMiAwIDgzLjEtMzEuMyA5My4zLTczLjQgLjktMy44IDQuMi02LjYgOC4xLTYuNmwyNDUuMSAwYzMuOSAwIDcuMiAyLjggOC4xIDYuNiAxMC4yIDQyLjEgNDguMSA3My40IDkzLjMgNzMuNCA1MyAwIDk2LTQzIDk2LTk2IDAtMjkuMS0xMi45LTU1LjEtMzMuMy03Mi43LTQuMy0zLjctNC4zLTEwLjggMC0xNC41IDIwLjQtMTcuNiAzMy4zLTQzLjcgMzMuMy03Mi43IDAtNTMtNDMtOTYtOTYtOTYtNDUuMiAwLTgzLjEgMzEuMy05My4zIDczLjQtLjkgMy44LTQuMiA2LjYtOC4xIDYuNmwtMjQ1LjEgMHoiXQogICAgfTsKICAgIGZhRmlyZUZsYW1lQ3VydmVkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpcmUtZmxhbWUtY3VydmVkIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbImZpcmUtYWx0Il0sICJmN2U0IiwgIk0xNTMuNiAyOS45bDE2LTIxLjNDMTczLjYgMy4yIDE4MCAwIDE4Ni43IDAgMTk4LjQgMCAyMDggOS42IDIwOCAyMS4zbDAgMjIuMWMwIDEzLjEgNS40IDI1LjcgMTQuOSAzNC43TDMwNy42IDE1OUMzNTYuNCAyMDUuNiAzODQgMjcwLjIgMzg0IDMzNy43IDM4NCA0MzQgMzA2IDUxMiAyMDkuNyA1MTJMMTkyIDUxMkM4NiA1MTIgMCA0MjYgMCAzMjBsMC0zLjhjMC00OC44IDE5LjQtOTUuNiA1My45LTEzMC4xbDMuNS0zLjVjNC4yLTQuMiAxMC02LjYgMTYtNi42IDEyLjUgMCAyMi42IDEwLjEgMjIuNiAyMi42TDk2IDI4OGMwIDM1LjMgMjguNyA2NCA2NCA2NHM2NC0yOC43IDY0LTY0bDAtMy45YzAtMTgtNy4yLTM1LjMtMTkuOS00OGwtMzguNi0zOC42Yy0yNC0yNC0zNy41LTU2LjctMzcuNS05MC43IDAtMjcuNyA5LTU0LjggMjUuNi03Ni45eiJdCiAgICB9OwogICAgZmFGaXJlQWx0ID0gZmFGaXJlRmxhbWVDdXJ2ZWQ7CiAgICBmYUJ1c1NpbXBsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJidXMtc2ltcGxlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImJ1cy1hbHQiXSwgImY1NWUiLCAiTTk2IDBDNDMgMCAwIDQzIDAgOTZMMCAzODRjMCAyOS44IDIwLjQgNTQuOSA0OCA2MmwwIDM0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDE2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0zMiAxOTIgMCAwIDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMybDE2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0zNGMyNy42LTcuMSA0OC0zMi4yIDQ4LTYybDAtMjg4YzAtNTMtNDMtOTYtOTYtOTZMOTYgMHpNNjQgMTI4YzAtMTcuNyAxNC4zLTMyIDMyLTMybDI1NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgOTZjMCAxNy43LTE0LjMgMzItMzIgMzJMOTYgMjU2Yy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTk2ek05NiAzMjBhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em0yNTYgMGEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYUJ1c0FsdCA9IGZhQnVzU2ltcGxlOwogICAgZmFWZW51c01hcnMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidmVudXMtbWFycyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzk4OTJdLCAiZjIyOCIsICJNNDgwLTY0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMlM0NjIuMyAwIDQ4MCAwTDUzMC43IDAgNDc0IDU2LjdjLTI2LjMtMTUuNy01Ny4xLTI0LjctOTAtMjQuNy0zNS40IDAtNjguNCAxMC41LTk2IDI4LjUtMjcuNi0xOC02MC42LTI4LjUtOTYtMjguNS05Ny4yIDAtMTc2IDc4LjgtMTc2IDE3NiAwIDg2LjMgNjIuMSAxNTguMSAxNDQgMTczLjFsMCAzNC45LTMyIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzIgMCAwIDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zMiAzMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0zMiAwIDAtMzQuOWMyMy4zLTQuMyA0NC45LTEzLjEgNjQtMjUuNiAyNy42IDE4IDYwLjYgMjguNSA5NiAyOC41IDk3LjIgMCAxNzYtNzguOCAxNzYtMTc2IDAtNDEuMS0xNC4xLTc5LTM3LjgtMTA5TDU3NiA0NS4zIDU3NiA5NmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTI4YzAtMTcuNy0xNC4zLTMyLTMyLTMyTDQ4MC02NHpNMzM2IDMwOS4yYzIwLjItMjguNiAzMi02My41IDMyLTEwMS4ycy0xMS44LTcyLjYtMzItMTAxLjJjMTQuNi02LjkgMzAuOC0xMC44IDQ4LTEwLjggNjEuOSAwIDExMiA1MC4xIDExMiAxMTJTNDQ1LjkgMzIwIDM4NCAzMjBjLTE3LjIgMC0zMy41LTMuOS00OC0xMC44ek0yODggMTUwLjNjMTAuMiAxNi45IDE2IDM2LjYgMTYgNTcuN3MtNS44IDQwLjktMTYgNTcuN2MtMTAuMi0xNi45LTE2LTM2LjYtMTYtNTcuN3M1LjgtNDAuOSAxNi01Ny43em0tNDgtNDMuNWMtMjAuMiAyOC42LTMyIDYzLjUtMzIgMTAxLjJzMTEuOCA3Mi42IDMyIDEwMS4yYy0xNC41IDYuOS0zMC44IDEwLjgtNDggMTAuOC02MS45IDAtMTEyLTUwLjEtMTEyLTExMlMxMzAuMSA5NiAxOTIgOTZjMTcuMiAwIDMzLjUgMy45IDQ4IDEwLjh6Il0KICAgIH07CiAgICBmYUJsZW5kZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmxlbmRlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNTE3IiwgIk0wIDU2QzAgMjUuMSAyNS4xIDAgNTYgMEw0MzcuNiAwYzIxLjMgMCAzNi42IDIwLjMgMzAuOCA0MC44TDQ1Ny4xIDgwIDM0NCA4MGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw5OS40IDAtMTguMyA2NC04MS4xIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNjcuNCAwLTI3LjQgOTYtMjU2IDAtOS4xLTk2LTYyLjkgMGMtMzAuOSAwLTU2LTI1LjEtNTYtNTZMMCA1NnpNMTE0LjMgMTkyTDEwMC42IDQ4IDU2IDQ4Yy00LjQgMC04IDMuNi04IDhsMCAxMjhjMCA0LjQgMy42IDggOCA4bDU4LjMgMHpNMTM2IDM4NGwyNDAgMGMyMi4xIDAgNDAgMTcuOSA0MCA0MGwwIDQ4YzAgMjIuMS0xNy45IDQwLTQwIDQwbC0yNDAgMGMtMjIuMSAwLTQwLTE3LjktNDAtNDBsMC00OGMwLTIyLjEgMTcuOS00MCA0MC00MHptMTIwIDg4YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiXQogICAgfTsKICAgIGZhVSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTE3XSwgIjU1IiwgIk0zMiAzMmMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDIyNGMwIDcwLjcgNTcuMyAxMjggMTI4IDEyOHMxMjgtNTcuMyAxMjgtMTI4bDAtMjI0YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAyMjRjMCAxMDYtODYgMTkyLTE5MiAxOTJTMCAzOTQgMCAyODhMMCA2NEMwIDQ2LjMgMTQuMyAzMiAzMiAzMnoiXQogICAgfTsKICAgIGZhU2hhcmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2hhcmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsibWFpbC1mb3J3YXJkIl0sICJmMDY0IiwgIk0zMDcuOCAxOC40Yy0xMiA1LTE5LjggMTYuNi0xOS44IDI5LjZsMCA4MC0xMTIgMGMtOTcuMiAwLTE3NiA3OC44LTE3NiAxNzYgMCAxMTMuMyA4MS41IDE2My45IDEwMC4yIDE3NC4xIDIuNSAxLjQgNS4zIDEuOSA4LjEgMS45IDEwLjkgMCAxOS43LTguOSAxOS43LTE5LjcgMC03LjUtNC4zLTE0LjQtOS44LTE5LjUtOS40LTguOC0yMi4yLTI2LjQtMjIuMi01Ni43IDAtNTMgNDMtOTYgOTYtOTZsOTYgMCAwIDgwYzAgMTIuOSA3LjggMjQuNiAxOS44IDI5LjZzMjUuNyAyLjIgMzQuOS02LjlsMTYwLTE2MGMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM2wtMTYwLTE2MGMtOS4yLTkuMi0yMi45LTExLjktMzQuOS02Ljl6Il0KICAgIH07CiAgICBmYU1haWxGb3J3YXJkID0gZmFTaGFyZTsKICAgIGZhUGhvbmVGbGlwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBob25lLWZsaXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgzODEsICJwaG9uZS1hbHQiXSwgImY4NzkiLCAiTTM1MS44IDI1YzcuOC0xOC44IDI4LjQtMjguOSA0OC4xLTIzLjVsNS41IDEuNWM2NC42IDE3LjYgMTE5LjggODAuMiAxMDMuNyAxNTYuNC0zNy4xIDE3NS0xNzQuOCAzMTIuNy0zNDkuOCAzNDkuOC03Ni4zIDE2LjItMTM4LjgtMzkuMS0xNTYuNC0xMDMuN2wtMS41LTUuNWMtNS40LTE5LjcgNC43LTQwLjMgMjMuNS00OC4xbDk3LjMtNDAuNWMxNi41LTYuOSAzNS42LTIuMSA0NyAxMS44bDM4LjYgNDcuMmM3MC4zLTM0LjkgMTI2LjgtOTMuMyAxNTkuMy0xNjQuOWwtNDQuMS0zNi4xYy0xMy45LTExLjMtMTguNi0zMC40LTExLjgtNDdMMzUxLjggMjV6Il0KICAgIH07CiAgICBmYVBob25lQWx0ID0gZmFQaG9uZUZsaXA7CiAgICBmYVRvaWxldFBvcnRhYmxlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRvaWxldC1wb3J0YWJsZSIsCiAgICAgIGljb246IFszMjAsIDUxMiwgW10sICJlNTgzIiwgIk0wIDY0bDAgMTYgMzIwIDAgMC0xNmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAwQzI4LjcgMCAwIDI4LjcgMCA2NHptMjQgNjRMMCAxMjggMCA0ODhjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTggMjI0IDAgMCA4YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0zNjAtMjk2IDB6bTIyNCA5NmwyNCAwIDAgOTYtMjQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC00OGMwLTEzLjMgMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhUGVyc29uUHJlZ25hbnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLXByZWduYW50IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImUzMWUiLCAiTTE5MiA4MGE1NiA1NiAwIDEgMCAwLTExMiA1NiA1NiAwIDEgMCAwIDExMnptODAgMzIxLjJjOC42LTQuNSAxNi44LTEwIDI0LjMtMTYuNWw0LTMuNGMyMi42LTE5LjQgMzUuNy00Ny43IDM1LjctNzcuNiAwLTM1LjktMTguOC02OS4xLTQ5LjYtODcuNmwtMzAuNC0xOC4yIDAtMS44YzAtNDYuNS0zNy43LTg0LjEtODQuMS04NC4xLTI4LjEgMC01NC40IDE0LjEtNzAgMzcuNUwyMS40IDI3MC4yYy05LjggMTQuNy01LjggMzQuNiA4LjkgNDQuNHMzNC42IDUuOCA0NC40LTguOWwyOS00My41LTMwLjUgMTEzLjVjLTIuNiA5LjYtLjYgMTkuOSA1LjUgMjcuOFM5NCA0MTYgMTA0IDQxNmw4IDAgMCA5NmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtOTYgMzIgMCAwIDk2YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xMTAuOHoiXQogICAgfTsKICAgIGZhTGVzc1RoYW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGVzcy10aGFuIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjI3NzRdLCAiM2MiLCAiTTQ3Ny4xIDUwLjZjNy40IDE2IC40IDM1LjEtMTUuNiA0Mi41TDEwOC40IDI1NiA0NjEuNCA0MTljMTYgNy40IDIzIDI2LjQgMTUuNiA0Mi41cy0yNi40IDIzLTQyLjUgMTUuNmwtNDE2LTE5MkM3LjMgMjc5LjggMCAyNjguNSAwIDI1NlM3LjMgMjMyLjIgMTguNiAyMjdsNDE2LTE5MmMxNi03LjQgMzUuMS0uNCA0Mi41IDE1LjZ6Il0KICAgIH07CiAgICBmYVN1cGVyc2NyaXB0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN1cGVyc2NyaXB0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYxMmIiLCAiTTU0NCAzMmMwLTExLjEtNS43LTIxLjQtMTUuMi0yNy4ycy0yMS4yLTYuNC0zMS4xLTEuNGwtMzIgMTZDNDQ5LjkgMjcuMyA0NDMuNSA0Ni41IDQ1MS40IDYyLjMgNDU3IDczLjUgNDY4LjMgODAgNDgwIDgwbDAgODBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwwLTEyOHpNOTYgNjRDNzguMyA2NCA2NCA3OC4zIDY0IDk2czE0LjMgMzIgMzIgMzJsMTUuMyAwIDg5LjYgMTI4LTg5LjYgMTI4LTE1LjMgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzMiAwYzEwLjQgMCAyMC4yLTUuMSAyNi4yLTEzLjZMMjQwIDMxMS44IDMyNS44IDQzNC40YzYgOC42IDE1LjggMTMuNiAyNi4yIDEzLjZsMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTUuMyAwLTg5LjYtMTI4IDg5LjYtMTI4IDE1LjMgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMzIgMGMtMTAuNCAwLTIwLjIgNS4xLTI2LjIgMTMuNkwyNDAgMjAwLjIgMTU0LjIgNzcuNkMxNDguMiA2OS4xIDEzOC40IDY0IDEyOCA2NEw5NiA2NHoiXQogICAgfTsKICAgIGZhQ2lyY2xlU3RvcDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLXN0b3AiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MjA5NCwgInN0b3AtY2lyY2xlIl0sICJmMjhkIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMTkyIDE2MGwxMjggMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDEyOGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMTI4IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTI4YzAtMTcuNyAxNC4zLTMyIDMyLTMyeiJdCiAgICB9OwogICAgZmFTdG9wQ2lyY2xlMiA9IGZhQ2lyY2xlU3RvcDI7CiAgICBmYUFycm93c1VwRG93biA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvd3MtdXAtZG93biIsCiAgICAgIGljb246IFsyNTYsIDUxMiwgWyJhcnJvd3MtdiJdLCAiZjA3ZCIsICJNMTUwLjYtMjIuNmMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTk2IDk2Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwTDk2IDc3LjMgOTYgNDM0LjcgNTQuNiAzOTMuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNsOTYgOTZjNiA2IDE0LjEgOS40IDIyLjYgOS40czE2LjYtMy40IDIyLjYtOS40bDk2LTk2YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwbC00MS40IDQxLjQgMC0zNTcuNSA0MS40IDQxLjRjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBzMTIuNS0zMi44IDAtNDUuM2wtOTYtOTZ6Il0KICAgIH07CiAgICBmYUFycm93c1YgPSBmYUFycm93c1VwRG93bjsKICAgIGZhUG9vU3Rvcm0gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicG9vLXN0b3JtIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInBvby1ib2x0Il0sICJmNzVhIiwgIk0yNjguOS0zMS44Yy01LjUtLjctMTEgMS40LTE0LjUgNS43cy00LjYgMTAuMS0yLjggMTUuM2MyLjggOC4yIDQuMyAxNi45IDQuMyAyNi4xIDAgMjEuNy04LjUgMzcuMi0yMS45IDQ3LjYtMTMuOSAxMC44LTM0LjEgMTctNTguMSAxN2wtMjQgMGMtNDguNiAwLTg4IDM5LjQtODggODggMCAxNC44IDMuNyAyOC44IDEwLjIgNDEuMS00MiA2LjYtNzQuMiA0My03NC4yIDg2LjkgMCA0Ni42IDM2LjIgODQuNyA4MS45IDg3LjggMy4xLTEyLjQgOS45LTIzLjggMTkuNi0zMi41TDI0Mi43IDIyNWMxMi4yLTEwLjkgMjgtMTcgNDQuNC0xNyA0NC42IDAgNzYuNSA0MyA2My43IDg1LjdsLTEyLjcgNDIuNGMyOC44IDEuMiA1Mi43IDIxLjEgNTkuOCA0Ny45bDI2LjIgMGM0OC42IDAgODgtMzkuNCA4OC04OCAwLTQzLjktMzIuMS04MC4zLTc0LjItODYuOSA2LjUtMTIuMyAxMC4yLTI2LjIgMTAuMi00MS4xIDAtNDguNi0zOS40LTg4LTg4LTg4bC05LjQgMGMuOS01LjQgMS40LTEwLjkgMS40LTE2LjYgMC00OC43LTM2LjEtODguOS04My4xLTk1LjJ6TTE0NC42IDQxNmw2MS44IDAtMzEuMiAxMDQuMWMtMy42IDExLjkgNS4zIDIzLjkgMTcuOCAyMy45IDQuNiAwIDktMS43IDEyLjQtNC43TDM0Ni41IDQxMi45YzMuNS0zLjEgNS41LTcuNiA1LjUtMTIuNCAwLTkuMi03LjQtMTYuNi0xNi42LTE2LjZsLTYxLjggMCAzMS4yLTEwNC4xYzMuNi0xMS45LTUuMy0yMy45LTE3LjgtMjMuOS00LjYgMC05IDEuNy0xMi40IDQuN0wxMzMuNSAzODcuMWMtMy41IDMuMS01LjUgNy42LTUuNSAxMi40IDAgOS4yIDcuNCAxNi42IDE2LjYgMTYuNnoiXQogICAgfTsKICAgIGZhUG9vQm9sdCA9IGZhUG9vU3Rvcm07CiAgICBmYVZpZGVvU2xhc2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidmlkZW8tc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjRlMiIsICJNNDEtMjQuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTLTIuMy0uMyA3IDkuMWw1MjggNTI4YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtMTUzLTE1MyAwLTIyMi4yYzAtMzUuMy0yOC43LTY0LTY0LTY0TDEyOS44IDY0IDQxLTI0Ljl6TTMyIDEyOGwwIDI1NmMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGM3LjggMCAxNS4zLTEuNCAyMi4yLTRMMzYgMTA1LjhjLTIuNiA2LjktNCAxNC40LTQgMjIuMnpNNDY0IDMzNmw3My41IDU4LjhjNC4yIDMuNCA5LjQgNS4yIDE0LjggNS4yIDEzLjEgMCAyMy43LTEwLjYgMjMuNy0yMy43bDAtMjQwLjZjMC0xMy4xLTEwLjYtMjMuNy0yMy43LTIzLjctNS40IDAtMTAuNiAxLjgtMTQuOCA1LjJMNDY0IDE3NiA0NjQgMzM2eiJdCiAgICB9OwogICAgZmFTcXVhcmVYbWFyayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUteG1hcmsiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMDA2MiwgInRpbWVzLXNxdWFyZSIsICJ4bWFyay1zcXVhcmUiXSwgImYyZDMiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6bTcxIDEzNWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMGw1NSA1NSA1NS01NWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjlsLTU1IDU1IDU1IDU1YzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTU1LTU1LTU1IDU1Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45bDU1LTU1LTU1LTU1Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXoiXQogICAgfTsKICAgIGZhVGltZXNTcXVhcmUgPSBmYVNxdWFyZVhtYXJrOwogICAgZmFYbWFya1NxdWFyZSA9IGZhU3F1YXJlWG1hcms7CiAgICBmYUhhbmRIb2xkaW5nRHJvcGxldCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kLWhvbGRpbmctZHJvcGxldCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJoYW5kLWhvbGRpbmctd2F0ZXIiXSwgImY0YzEiLCAiTTI3NS41IDYuNkwyMDkuMiAxMDNDMTk4IDExOS4zIDE5MiAxMzguNiAxOTIgMTU4LjNsMCAxLjdjMCA1MyA0MyA5NiA5NiA5NnM5Ni00MyA5Ni05NmwwLTEuN2MwLTE5LjgtNi0zOS0xNy4yLTU1LjNMMzAwLjUgNi42QzI5Ny43IDIuNSAyOTMgMCAyODggMHMtOS43IDIuNS0xMi41IDYuNnpNMTA5LjMgMzQxLjVMNjYuNyAzODQgMzIgMzg0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDY0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDMyMC41IDBjMjkgMCA1Ny4zLTkuMyA4MC43LTI2LjVsMTI2LjYtOTMuM2MxNy44LTEzLjEgMjEuNi0zOC4xIDguNS01NS45cy0zOC4xLTIxLjYtNTUuOS04LjVMMzkyLjYgNDE2IDI4MCA0MTZjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsNzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTUyLjIgMGMtMzMuOSAwLTY2LjUgMTMuNS05MC41IDM3LjV6Il0KICAgIH07CiAgICBmYUhhbmRIb2xkaW5nV2F0ZXIgPSBmYUhhbmRIb2xkaW5nRHJvcGxldDsKICAgIGZhV29uU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3b24tc2lnbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzgzNjEsICJrcnciLCAid29uIl0sICJmMTU5IiwgIk02Mi40IDUzLjlDNTYuOCAzNy4xIDM4LjcgMjguMSAyMS45IDMzLjZTLTMuOSA1Ny40IDEuNyA3NC4xTDU2LjkgMjQwIDMyIDI0MGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw0MC45IDAgNTYuNyAxNzAuMWM0LjUgMTMuNSAxNy40IDIyLjQgMzEuNiAyMS45czI2LjQtMTAuNCAyOS44LTI0LjJMMjMzIDI4OCAyNzkgMjg4IDMyMSA0NTUuOGMzLjQgMTMuOCAxNS42IDIzLjcgMjkuOCAyNC4yczI3LjEtOC40IDMxLjYtMjEuOUw0MzkuMSAyODggNDgwIDI4OGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMjQuOSAwIDU1LjMtMTY1LjljNS42LTE2LjgtMy41LTM0LjktMjAuMi00MC41cy0zNC45IDMuNS00MC41IDIwLjJsLTYyIDE4Ni4xLTU0LjYgMC00NS45LTE4My44QzI4My41IDQyIDI3MC43IDMyIDI1NiAzMnMtMjcuNSAxMC0zMSAyNC4yTDE3OSAyNDAgMTI0LjQgMjQwIDYyLjQgNTMuOXptNzggMjM0LjFsMjYuNiAwLTExLjQgNDUuNi0xNS4yLTQ1LjZ6TTI0NSAyNDBsMTEtNDQuMSAxMSA0NC4xLTIyIDB6bTEwMCA0OGwyNi42IDAtMTUuMiA0NS42LTExLjQtNDUuNnoiXQogICAgfTsKICAgIGZhS3J3ID0gZmFXb25TaWduOwogICAgZmFXb24gPSBmYVdvblNpZ247CiAgICBmYU9iamVjdFVuZ3JvdXAyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm9iamVjdC11bmdyb3VwIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYyNDgiLCAiTTMyIDExOS40QzEyLjkgMTA4LjQgMCA4Ny43IDAgNjQgMCAyOC43IDI4LjcgMCA2NCAwIDg3LjcgMCAxMDguNCAxMi45IDExOS40IDMybDIwOS4xIDBjMTEuMS0xOS4xIDMxLjctMzIgNTUuNC0zMiAzNS4zIDAgNjQgMjguNyA2NCA2NCAwIDIzLjctMTIuOSA0NC40LTMyIDU1LjRsMCAxMTMuMWMxOS4xIDExLjEgMzIgMzEuNyAzMiA1NS40IDAgMzUuMy0yOC43IDY0LTY0IDY0LTIzLjcgMC00NC40LTEyLjktNTUuNC0zMmwtMjA5LjEgMGMtMTEuMSAxOS4xLTMxLjcgMzItNTUuNCAzMi0zNS4zIDAtNjQtMjguNy02NC02NCAwLTIzLjcgMTIuOS00NC40IDMyLTU1LjRsMC0xMTMuMXpNMTE5LjQgOTZjLTUuNiA5LjctMTMuNyAxNy44LTIzLjQgMjMuNGwwIDExMy4xYzkuNyA1LjYgMTcuOCAxMy43IDIzLjQgMjMuNGwyMDkuMSAwYzUuNi05LjcgMTMuNy0xNy44IDIzLjQtMjMuNGwwLTExMy4xYy05LjctNS42LTE3LjgtMTMuNy0yMy40LTIzLjRMMTE5LjQgOTZ6TTU0NCAyNzkuNGMtOS43LTUuNi0xNy44LTEzLjctMjMuNC0yMy40bC0yOS4yIDBjLTUuMy0xNy43LTE0LjgtMzMuNS0yNy40LTQ2LjRsMC0xNy42IDU2LjYgMGMxMS4xLTE5LjEgMzEuNy0zMiA1NS40LTMyIDM1LjMgMCA2NCAyOC43IDY0IDY0IDAgMjMuNy0xMi45IDQ0LjQtMzIgNTUuNGwwIDExMy4xYzE5LjEgMTEuMSAzMiAzMS43IDMyIDU1LjQgMCAzNS4zLTI4LjcgNjQtNjQgNjQtMjMuNyAwLTQ0LjQtMTIuOS01NS40LTMybC0yMDkuMSAwYy0xMS4xIDE5LjEtMzEuNyAzMi01NS40IDMyLTM1LjMgMC02NC0yOC43LTY0LTY0IDAtMjMuNyAxMi45LTQ0LjQgMzItNTUuNGwwLTI0LjYgNjQgMCAwIDI0LjZjOS43IDUuNiAxNy44IDEzLjcgMjMuNCAyMy40bDIwOS4xIDBjNS42LTkuNyAxMy43LTE3LjggMjMuNC0yMy40bDAtMTEzLjF6Il0KICAgIH07CiAgICBmYUNvbW1lbnQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvbW1lbnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg0ODksIDYxNjY5XSwgImYwNzUiLCAiTTUxMiAyNDBjMCAxMzIuNS0xMTQuNiAyNDAtMjU2IDI0MC0zNy4xIDAtNzIuMy03LjQtMTA0LjEtMjAuN0wzMy41IDUxMC4xYy05LjQgNC0yMC4yIDEuNy0yNy4xLTUuOFMtMiA0ODUuOCAyLjggNDc2LjhsNDguOC05Mi4yQzE5LjIgMzQ0LjMgMCAyOTQuMyAwIDI0MCAwIDEwNy41IDExNC42IDAgMjU2IDBTNTEyIDEwNy41IDUxMiAyNDB6Il0KICAgIH07CiAgICBmYUhpbGxBdmFsYW5jaGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGlsbC1hdmFsYW5jaGUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUwNyIsICJNNDQwLjEgNDAxLjljMzQuMiAyMy4xIDgxLjEgMTkuNSAxMTEuNC0xMC44IDM0LjQtMzQuNCAzNC40LTkwLjEgMC0xMjQuNS0yNy44LTI3LjgtNjkuNS0zMy4xLTEwMi42LTE2LTExLjggNi4xLTE2LjQgMjAuNi0xMC4zIDMyLjNzMjAuNiAxNi40IDMyLjMgMTAuM2MxNS4xLTcuOCAzNC01LjMgNDYuNiA3LjMgMTUuNiAxNS42IDE1LjYgNDAuOSAwIDU2LjZzLTQwLjkgMTUuNi01Ni42IDBsLTgxLjctODEuN2MyMi4zLTE0LjIgMzcuMS0zOS4xIDM3LjEtNjcuNSAwLTMzLjktMjEuMS02Mi45LTUwLjktNzQuNSAxLjktNi44IDIuOS0xNCAyLjktMjEuNSAwLTQ0LjItMzUuOC04MC04MC04MC0yNy4zIDAtNTEuNSAxMy43LTY1LjkgMzQuNi01LjgtMjAtMjQuMi0zNC42LTQ2LjEtMzQuNi0yNi41IDAtNDggMjEuNS00OCA0OCAwIDQgLjUgNy45IDEuNCAxMS42TDQ0MC4xIDQwMS45ek00ODAuNCA2NGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem0wIDEyOGEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6TTY4LjcgODdDNDMuNSA2MS44IC40IDc5LjcgLjQgMTE1LjNMLjQgNDMyYzAgNDQuMiAzNS44IDgwIDgwIDgwbDMxNi43IDBjMzUuNiAwIDUzLjUtNDMuMSAyOC4zLTY4LjNMNjguNyA4N3oiXQogICAgfTsKICAgIGZhQXJyb3dzVG9FeWUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3dzLXRvLWV5ZSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNGJmIiwgIk0xNzYgNTZjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAzOC4xLTYzLTYzYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMFMyMS43IDU1LjYgMzEgNjVsNjMgNjMtMzguMSAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDk2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC05NnptMCA0MDBsMC05NmMwLTEzLjMtMTAuNy0yNC0yNC0yNGwtOTYgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwzOC4xIDAtNjMgNjNjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMGw2My02MyAwIDM4LjFjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNHptMzEyIDI0YzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtMzguMSA2MyA2M2M5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTYzLTYzIDM4LjEgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtOTYgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCA5NmMwIDEzLjMgMTAuNyAyNCAyNCAyNHpNNDY0IDU2bDAgOTZjMCAxMy4zIDEwLjcgMjQgMjQgMjRsOTYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMzguMSAwIDYzLTYzYzkuNC05LjQgOS40LTI0LjYgMC0zMy45cy0yNC42LTkuNC0zMy45IDBsLTYzIDYzIDAtMzguMWMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNHpNMzIwIDEyMGMtNTcuMyAwLTk5LjQgMzQtMTI1LjYgNjQuMy0yMCAyMy4xLTMyLjQgNDUuOC0zNy42IDU2LjEtMi41IDUtNC45IDkuNy00LjkgMTUuNnMyLjMgMTAuNiA0LjkgMTUuNmM1LjIgMTAuMyAxNy42IDMzIDM3LjYgNTYuMSAyNi4yIDMwLjMgNjguMiA2NC4zIDEyNS42IDY0LjNzOTkuNC0zNCAxMjUuNi02NC4zYzIwLTIzLjEgMzIuNC00NS44IDM3LjYtNTYuMSAyLjUtNSA0LjktOS43IDQuOS0xNS42cy0yLjMtMTAuNi00LjktMTUuNmMtNS4yLTEwLjMtMTcuNi0zMy0zNy42LTU2LjEtMjYuMi0zMC4zLTY4LjItNjQuMy0xMjUuNi02NC4zek0yNTYgMjU2YTY0IDY0IDAgMSAxIDEyOCAwIDY0IDY0IDAgMSAxIC0xMjggMHoiXQogICAgfTsKICAgIGZhU25vd3Bsb3cgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic25vd3Bsb3ciLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjdkMiIsICJNMTI4IDE2MGwwLTk2YzAtMzUuMyAyOC43LTY0IDY0LTY0TDI5Ni40IDBjMjQuMiAwIDQ2LjQgMTMuNyA1Ny4yIDM1LjRsODcuNiAxNzUuMWM0LjQgOC45IDYuOCAxOC43IDYuOCAyOC42bDAgNTYuOSA4MCAwIDAtODBjMC00OC42IDM5LjQtODggODgtODggMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRjLTIyLjEgMC00MCAxNy45LTQwIDQwbDAgMjA4YzAgMjIuMSAxNy45IDQwIDQwIDQwIDEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0Yy00OC42IDAtODgtMzkuNC04OC04OGwwLTgwLTYzIDBjOS41IDE2LjUgMTUgMzUuNiAxNSA1NiAwIDYxLjktNTAuMSAxMTItMTEyIDExMmwtMjI0IDBjLTYxLjkgMC0xMTItNTAuMS0xMTItMTEyIDAtMzAuNSAxMi4yLTU4LjIgMzItNzguNEw2NCAyMjRjMC0zNS4zIDI4LjctNjQgNjQtNjR6bTkxLjcgMzQuOWw0My42IDI5LjEgMTEzLjIgMC04MC0xNjAtMTA0LjQgMCAwIDEwOC44IDI3LjcgMjIuMXpNNDE2IDQwMGMwLTI2LjUtMjEuNS00OC00OC00OGwtMjI0IDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4czIxLjUgNDggNDggNDhsMjI0IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDh6bS0yODAgMGEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwem0yMTYtMjRhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4ek0yMzIgNDAwYTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6Il0KICAgIH07CiAgICBmYUNoYXJ0R2FudHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hhcnQtZ2FudHQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTBlNCIsICJNNjQgNjRjMC0xNy43LTE0LjMtMzItMzItMzJTMCA0Ni4zIDAgNjRMMCA0MDBjMCA0NC4yIDM1LjggODAgODAgODBsNDAwIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMODAgNDE2Yy04LjggMC0xNi03LjItMTYtMTZMNjQgNjR6bTk2IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsOTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtOTYgMHptNjQgMTEyYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDEyOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0xMjggMHpNMzg0IDI4OGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmw2NCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC02NCAweiJdCiAgICB9OwogICAgZmFWaWRlbyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ2aWRlbyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJ2aWRlby1jYW1lcmEiXSwgImYwM2QiLCAiTTk2IDY0Yy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDI1NmMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI1NmMwLTM1LjMtMjguNy02NC02NC02NEw5NiA2NHpNNDY0IDMzNmw3My41IDU4LjhjNC4yIDMuNCA5LjQgNS4yIDE0LjggNS4yIDEzLjEgMCAyMy43LTEwLjYgMjMuNy0yMy43bDAtMjQwLjZjMC0xMy4xLTEwLjYtMjMuNy0yMy43LTIzLjctNS40IDAtMTAuNiAxLjgtMTQuOCA1LjJMNDY0IDE3NiA0NjQgMzM2eiJdCiAgICB9OwogICAgZmFWaWRlb0NhbWVyYSA9IGZhVmlkZW87CiAgICBmYUNoZXNzUGF3bjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hlc3MtcGF3biIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzk4MjNdLCAiZjQ0MyIsICJNMTkyLTMyYzY2LjMgMCAxMjAgNTMuNyAxMjAgMTIwIDAgMjctOC45IDUxLjktMjQgNzIgMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTEwLjcgMCAyNi43IDE2MCA1Ni4yIDcwLjNjNSA2LjMgNy44IDE0LjEgNy44IDIyLjIgMCAxOS42LTE1LjkgMzUuNS0zNS41IDM1LjVMNTEuNSA1MTJjLTE5LjYgMC0zNS41LTE1LjktMzUuNS0zNS41IDAtOC4xIDIuNy0xNS45IDcuOC0yMi4yTDgwIDM4NCAxMDYuNyAyMjQgOTYgMjI0Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMyYy0xNS4xLTIwLjEtMjQtNDUtMjQtNzIgMC02Ni4zIDUzLjctMTIwIDEyMC0xMjB6Il0KICAgIH07CiAgICBmYVN5bmFnb2d1ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzeW5hZ29ndWUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgzMzNdLCAiZjY5YiIsICJNMTYgODBjMC0zNS4zIDI4LjctNjQgNjQtNjRzNjQgMjguNyA2NCA2NGwwIDMyLTEyOCAwIDAtMzJ6bTAgMzY4bDAtMjg4IDEyOCAwIDEyNi4yLTg0LjJjMTAuNy03LjIgMjQuOC03LjIgMzUuNSAwbDEyNi4yIDg0LjIgMTI4IDAgMCAyODhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMODAgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NHpNNTYwIDExMmwtMTI4IDAgMC0zMmMwLTM1LjMgMjguNy02NCA2NC02NHM2NCAyOC43IDY0IDY0bDAgMzJ6TTIyNCAzODRsMCA4MCAxMjggMCAwLTgwYzAtMzUuMy0yOC43LTY0LTY0LTY0cy02NCAyOC43LTY0IDY0em02NC0xNTJhNDAgNDAgMCAxIDAgMC04MCA0MCA0MCAwIDEgMCAwIDgweiJdCiAgICB9OwogICAgZmFCdWlsZGluZ0NpcmNsZUNoZWNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJ1aWxkaW5nLWNpcmNsZS1jaGVjayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNGQyIiwgIk05NiAwQzYwLjcgMCAzMiAyOC43IDMyIDY0bDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE4MCAwYy0xMC41LTE0LjYtMTktMzAuNy0yNS4xLTQ4bC03NC45IDAgMC04MGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzMiAwYzIgMCA0IC4yIDUuOSAuNSA2LTIzLjYgMTYuMy00NS40IDMwLjEtNjQuNWwtNCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCA0YzI3LjUtMTkuOCA2MC4zLTMyLjQgOTYtMzUuNEw0MTYgNjRjMC0zNS4zLTI4LjctNjQtNjQtNjRMOTYgMHptMzIgMTEyYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJ6TTI3MiA5NmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2ek0xMjggMjQwYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJ6TTU3NiA0MDBhMTQ0IDE0NCAwIDEgMCAtMjg4IDAgMTQ0IDE0NCAwIDEgMCAyODggMHptLTg2LjYtNjAuOWM3LjEgNS4yIDguNyAxNS4yIDMuNSAyMi4zbC02NCA4OGMtMi44IDMuOC03IDYuMi0xMS43IDYuNXMtOS4zLTEuMy0xMi42LTQuNmwtNDAtNDBjLTYuMi02LjItNi4yLTE2LjQgMC0yMi42czE2LjQtNi4yIDIyLjYgMGwyNi44IDI2LjggNTMtNzIuOWM1LjItNy4xIDE1LjItOC43IDIyLjQtMy41eiJdCiAgICB9OwogICAgZmFDYWxlbmRhclBsdXMyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhbGVuZGFyLXBsdXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjI3MSIsICJNMTI4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAzMiAxMjggMCAwLTMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAzMiAzMiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjg4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsMzIgMCAwLTMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyem05NiAxOTJjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgNDgtNDggMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw0OCAwIDAgNDhjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTQ4IDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTQ4IDAgMC00OGMwLTEzLjMtMTAuNy0yNC0yNC0yNHoiXQogICAgfTsKICAgIGZhV2hlZWxjaGFpck1vdmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid2hlZWxjaGFpci1tb3ZlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbIndoZWVsY2hhaXItYWx0Il0sICJlMmNlIiwgIk0zMTIgNTZhNTYgNTYgMCAxIDEgMTEyIDAgNTYgNTYgMCAxIDEgLTExMiAwek0yMDUuNCAxMjQuMWMtNi40LTUuMi0xNS42LTQuNy0yMS40IDEuMWwtMzMuNCAzMy40Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM0wxMzguOCA4MGMyOS0yOSA3NS4yLTMxLjQgMTA3LTUuNWw4MS4zIDY2YzIxLjQgMTcuNCAyMy44IDQ5LjIgNS4yIDY5LjVsLTQxLjggNDYgOTggMGMzMC4zIDAgNTMgMjcuNyA0Ny4xIDU3LjRMNDA3LjQgNDU0LjNjLTMuNSAxNy4zLTIwLjMgMjguNi0zNy43IDI1LjFzLTI4LjYtMjAuMy0yNS4xLTM3LjdMMzY5IDMyMCAzMTYuOCAzMjBjMi4xIDEwLjMgMy4yIDIxIDMuMiAzMiAwIDg4LjQtNzEuNiAxNjAtMTYwIDE2MFMwIDQ0MC40IDAgMzUyIDcxLjYgMTkyIDE2MCAxOTJjNiAwIDExLjkgLjMgMTcuOCAxbDUwLjQtNTAuNC0yMi43LTE4LjV6TTE2MCA0NDhhOTYgOTYgMCAxIDAgMC0xOTIgOTYgOTYgMCAxIDAgMCAxOTJ6Il0KICAgIH07CiAgICBmYVdoZWVsY2hhaXJBbHQgPSBmYVdoZWVsY2hhaXJNb3ZlOwogICAgZmFVc2VyU2hpZWxkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXItc2hpZWxkIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY1MDUiLCAiTTIyNCAyNDhhMTIwIDEyMCAwIDEgMCAwLTI0MCAxMjAgMTIwIDAgMSAwIDAgMjQwem0tMjkuNyA1NkM5NS44IDMwNCAxNiAzODMuOCAxNiA0ODIuMyAxNiA0OTguNyAyOS4zIDUxMiA0NS43IDUxMmwyNTEuNSAwQzI2MSA0NjkuNCAyNDAgNDE0LjUgMjQwIDM1Ni40bDAtMzEuMWMwLTcuMyAxLTE0LjUgMi45LTIxLjNsLTQ4LjYgMHptMjUxIDE4NC41bC0xMy4zIDYuMyAwLTE4OC4xIDk2IDMyIDAgMTkuNmMwIDU1LjgtMzIuMiAxMDYuNS04Mi43IDEzMC4zek00MjEuOSAyNTkuNWwtMTEyIDM3LjNjLTEzLjEgNC40LTIxLjkgMTYuNi0yMS45IDMwLjRsMCAzMS4xYzAgNzQuNCA0MyAxNDIuMSAxMTAuMiAxNzMuN2wxOC41IDguN2M0LjggMi4yIDEwIDMuNCAxNS4yIDMuNHMxMC41LTEuMiAxNS4yLTMuNGwxOC41LTguN0M1MzMgNTAwLjMgNTc2IDQzMi42IDU3NiAzNTguMmwwLTMxLjFjMC0xMy44LTguOC0yNi0yMS45LTMwLjRsLTExMi0zNy4zYy02LjYtMi4yLTEzLjctMi4yLTIwLjIgMHoiXQogICAgfTsKICAgIGZhQm9sZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib2xkIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYwMzIiLCAiTTMyIDMyQzE0LjMgMzIgMCA0Ni4zIDAgNjRTMTQuMyA5NiAzMiA5NmwzMiAwIDAgMzIwLTMyIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMjI0IDBjNzAuNyAwIDEyOC01Ny4zIDEyOC0xMjggMC00Ni41LTI0LjgtODcuMy02Mi0xMDkuNyAxOC43LTIyLjMgMzAtNTEgMzAtODIuMyAwLTcwLjctNTcuMy0xMjgtMTI4LTEyOEwzMiAzMnpNMjg4IDE2MGMwIDM1LjMtMjguNyA2NC02NCA2NGwtOTYgMCAwLTEyOCA5NiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0ek0xMjggNDE2bDAtMTI4IDEyOCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0cy0yOC43IDY0LTY0IDY0bC0xMjggMHoiXQogICAgfTsKICAgIGZhSGVhcnRQdWxzZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoZWFydC1wdWxzZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJoZWFydGJlYXQiXSwgImYyMWUiLCAiTTI1NiAxMDcuOUwyNDEgODcuMUMyMTYgNTIuNSAxNzUuOSAzMiAxMzMuMSAzMiA1OS42IDMyIDAgOTEuNiAwIDE2NS4xbDAgMi42YzAgMjMuNiA2LjIgNDggMTYuNiA3Mi4zbDEwNiAwYzMuMiAwIDYuMS0xLjkgNy40LTQuOWwzMS44LTc2LjNjMy43LTguOCAxMi4zLTE0LjYgMjEuOC0xNC44czE4LjMgNS40IDIyLjIgMTQuMWw1MS4zIDExMy45IDQxLjQtODIuOGM0LjEtOC4xIDEyLjQtMTMuMyAyMS41LTEzLjNzMTcuNCA1LjEgMjEuNSAxMy4zbDIzLjIgNDYuM2MxLjQgMi43IDQuMSA0LjQgNy4yIDQuNGwxMjMuNiAwYzEwLjUtMjQuMyAxNi42LTQ4LjcgMTYuNi03Mi4zbDAtMi42QzUxMiA5MS42IDQ1Mi40IDMyIDM3OC45IDMyIDMzNi4yIDMyIDI5NiA1Mi41IDI3MSA4Ny4xbC0xNSAyMC43ek00NjkuNiAyODhsLTk3LjggMGMtMjEuMiAwLTQwLjYtMTItNTAuMS0zMWwtMS43LTMuNC00Mi41IDg1LjFjLTQuMSA4LjMtMTIuNyAxMy41LTIyIDEzLjNzLTE3LjYtNS43LTIxLjQtMTQuMWwtNDkuMy0xMDkuNS0xMC41IDI1LjJjLTguNyAyMC45LTI5LjEgMzQuNS01MS43IDM0LjVsLTgwLjIgMGM0Ny4yIDczLjggMTIzIDE0MS43IDE3MC40IDE3Ny45IDEyLjQgOS40IDI3LjYgMTQuMSA0My4xIDE0LjFzMzAuOC00LjYgNDMuMS0xNC4xQzM0Ni42IDQyOS43IDQyMi40IDM2MS44IDQ2OS42IDI4OHoiXQogICAgfTsKICAgIGZhSGVhcnRiZWF0ID0gZmFIZWFydFB1bHNlOwogICAgZmFTcXVhcmVSb290VmFyaWFibGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXJvb3QtdmFyaWFibGUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsic3F1YXJlLXJvb3QtYWx0Il0sICJmNjk4IiwgIk0yODIuNiA3OC4xYzgtMjcuMyAzMy00Ni4xIDYxLjQtNDYuMWwyMDAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzNDQgOTYgMjM4LjcgNDU3Yy0zLjYgMTIuMy0xNC4xIDIxLjItMjYuOCAyMi44cy0yNS4xLTQuNi0zMS41LTE1LjZMNzcuNiAyODggMzIgMjg4Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDQ1LjYgMGMyMi44IDAgNDMuOCAxMi4xIDU1LjMgMzEuOGw2NS4yIDExMS44IDg0LjQtMjg5LjV6TTM5My40IDIzMy40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDQxLjQgNDEuNCA0MS40LTQxLjRjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM2wtNDEuNCA0MS40IDQxLjQgNDEuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMGwtNDEuNC00MS40LTQxLjQgNDEuNGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNsNDEuNC00MS40LTQxLjQtNDEuNGMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjN6Il0KICAgIH07CiAgICBmYVNxdWFyZVJvb3RBbHQgPSBmYVNxdWFyZVJvb3RWYXJpYWJsZTsKICAgIGZhSGFuZHNCdWJibGVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbmRzLWJ1YmJsZXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiaGFuZHMtd2FzaCJdLCAiZTA1ZSIsICJNMzg0IDY0YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHptOTYgMTI4YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHpNMTI4IDQ2NGE0OCA0OCAwIDEgMCAtOTYgMCA0OCA0OCAwIDEgMCA5NiAwek0wIDE2MGwuMSA3Mi42YzAgNDQuOCAxNy42IDg3LjEgNDcuOSAxMTguNCAuMy03NyA0MC4xLTE0OC40IDEwNS40LTE4OS4zbDEuOS0xLjJjLTIuNS0zLjctMi44LTguNi0uNC0xMi43bDYyLTEwNy40YzYuNi0xMS41IDIuNy0yNi4yLTguOC0zMi44UzE4MiA1IDE3NS40IDE2LjVsLTY4IDExNy44IDAgMCAwIDAtNDMuMyA3NSAwLTQ5LjNjMC0xNy43LTE0LjQtMzItMzItMzJTMCAxNDIuNCAwIDE2MHptMjEzLjYtMzUuOWMxNC4xLTguOCAyOS44LTEyLjcgNDUuMi0xMi4xbDM2LjUtNjMuM2M2LjYtMTEuNSAyLjctMjYuMi04LjgtMzIuOHMtMjYuMi0yLjctMzIuOCA4LjhsLTY3LjEgMTE2LjIgMjctMTYuOXptODYuNS0zNS43bC0xNi40IDI4LjRjMTUuMSA1LjUgMjguNiAxNS42IDM4LjMgMjkuN2wxOS43LTM0LjJjNi42LTExLjUgMi43LTI2LjItOC44LTMyLjhzLTI2LjItMi43LTMyLjggOC44em00Ni40IDYzLjdsLTEyLjUgMjEuN2MyIDguNiAyLjUgMTcuNSAxLjcgMjYuMWw0LjMgMCAwIDAgMzQuNCAwIDEzLjctMjMuOGM2LjYtMTEuNSAyLjctMjYuMi04LjgtMzIuOHMtMjYuMi0yLjctMzIuOCA4Ljh6TTI4My4xIDE3NWMtOS40LTE1LTI5LjEtMTkuNS00NC4xLTEwLjJsLTYwLjIgMzcuNkMxMjcuMyAyMzQuNyA5NiAyOTEuMiA5NiAzNTJsMCA4YzAgOC45IC44IDE3LjYgMi4yIDI2LjEgMzUuNCA4LjIgNjEuOCA0MCA2MS44IDc3LjkgMCA2LjMtLjcgMTIuNS0yLjEgMTguNCAyNS4yIDE4LjYgNTYuNCAyOS42IDkwLjEgMjkuNmwxNzYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtOTIgMGMtNi42IDAtMTItNS40LTEyLTEyczUuNC0xMiAxMi0xMmwxMjQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTI0IDBjLTYuNiAwLTEyLTUuNC0xMi0xMnM1LjQtMTIgMTItMTJsMTU2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE1NiAwYy02LjYgMC0xMi01LjQtMTItMTJzNS40LTEyIDEyLTEybDEyNCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xMzYgMCAwIDAgMCAwLTkzLjIgMCA0Ni4yLTI4LjljMTUtOS40IDE5LjUtMjkuMSAxMC4yLTQ0LjF6Il0KICAgIH07CiAgICBmYUhhbmRzV2FzaCA9IGZhSGFuZHNCdWJibGVzOwogICAgZmFNYXJrZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFya2VyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1YTEiLCAiTTQwOC44IDBjLTI3LjQgMC01My42IDEwLjktNzMgMzAuMkwzMTguMSA0OCAzMDUgMzQuOWMtMjguMS0yOC4xLTczLjctMjguMS0xMDEuOCAwTDEwMyAxMzVjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMEwyMzcuMSA2OC45YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwTDI4NC4xIDgxLjkgMTg0IDE4Mi4xIDMyOS45IDMyOCA0ODEuOCAxNzYuMmMxOS40LTE5LjQgMzAuMi00NS42IDMwLjItNzMgMC01Ny00Ni4yLTEwMy4yLTEwMy4yLTEwMy4yek0xMDIuNCAyNjMuN2MtNDkuOSA0OS45LTgzLjMgMTE0LTk1LjUgMTgzLjVMLjQgNDgzLjhDLTEgNDkxLjYgMS41IDQ5OS40IDcgNTA1czEzLjQgOCAyMS4xIDYuN2wzNi43LTYuNWM2OS41LTEyLjMgMTMzLjYtNDUuNiAxODMuNS05NS41TDI5NiAzNjEuOSAxNTAuMSAyMTYgMTAyLjQgMjYzLjd6Il0KICAgIH07CiAgICBmYUNsaXBib2FyZDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2xpcGJvYXJkIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4MjAzXSwgImYzMjgiLCAiTTMyMCAzMmwtOC42IDBDMzAwLjQgMTIuOSAyNzkuNyAwIDI1NiAwTDEyOCAwQzEwNC4zIDAgODMuNiAxMi45IDcyLjYgMzJMNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTM1MmMwLTM1LjMtMjguNy02NC02NC02NHpNMTM2IDExMmMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxMTIgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTEyIDB6Il0KICAgIH07CiAgICBmYVBsYWNlT2ZXb3JzaGlwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBsYWNlLW9mLXdvcnNoaXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjY3ZiIsICJNMTYwIDc5bDAgODEtNDQuOCAzMy42QzEwMy4xIDIwMi43IDk2IDIxNi45IDk2IDIzMmwwIDQwLTYwLjYgMzAuM0MxMy43IDMxMy4yIDAgMzM1LjMgMCAzNTkuNkwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NCA3NC43IDAgODUuNCAwIDMyMCAwbDY0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC04OC40YzAtMjQuMi0xMy43LTQ2LjQtMzUuNC01Ny4yTDQxNiAyNzIgNDE2IDIzMmMwLTE1LjEtNy4xLTI5LjMtMTkuMi0zOC40TDM1MiAxNjAgMzUyIDc5YzAtOS41LTQuMi0xOC41LTExLjUtMjQuNkwyNzEuNC0zLjJjLTguOS03LjQtMjEuOC03LjQtMzAuNyAwTDE3MS41IDU0LjRDMTY0LjIgNjAuNSAxNjAgNjkuNSAxNjAgNzl6bTk2IDI0MWMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDgwLTEyOCAwIDAtODBjMC0zNS4zIDI4LjctNjQgNjQtNjR6Il0KICAgIH07CiAgICBmYUNhbm5hYmlzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhbm5hYmlzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1NWYiLCAiTTI1NiAwYzUuMyAwIDEwLjMgMi43IDEzLjMgNy4xIDE1LjggMjMuNSAzNi43IDYzLjcgNDkuMiAxMDkgNy4zIDI2LjQgMTEuOCA1NS4zIDEwLjMgODQgMTEuNi04LjkgMjMuNy0xNi43IDM1LjktMjMuNyA0MS0yMy4zIDg0LjQtMzYuOSAxMTIuMi00Mi41IDUuMi0xIDEwLjcgLjYgMTQuNCA0LjRzNS40IDkuMiA0LjQgMTQuNWMtNS42IDI3LjctMTkuMyA3MC45LTQyLjcgMTExLjctOS4xIDE1LjktMTkuOSAzMS43LTMyLjUgNDYuMyAyNy45IDYuNiA1Mi41IDE3LjIgNjcuMyAyNS40IDUuMSAyLjggOC4yIDguMiA4LjIgMTRzLTMuMiAxMS4yLTguMiAxNGMtMTUuMiA4LjQtNDAuOSAxOS41LTY5LjggMjYuMS0yMC4yIDQuNi00Mi45IDcuMi02NS4yIDQuNmw4LjMgMzMuMmMxLjUgNi4xLS42IDEyLjUtNS41IDE2LjRzLTExLjYgNC42LTE3LjIgMS44TDI4MCA0MTcuMiAyODAgNDg4YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNzAuOC01OC41IDI5LjFjLTUuNiAyLjgtMTIuMyAyLjEtMTcuMi0xLjhzLTctMTAuMy01LjUtMTYuNGw4LjMtMzMuMmMtMjIuMiAyLjYtNDUgMC02NS4yLTQuNi0yOC45LTYuNi01NC41LTE3LjYtNjkuOC0yNi4xLTUuMS0yLjgtOC4yLTguMi04LjItMTRzMy4yLTExLjIgOC4yLTE0bDYuMi0zLjNjMTUtNy42IDM2LjgtMTYuNCA2MS4xLTIyLjItMTIuNS0xNC41LTIzLjMtMzAuNC0zMi40LTQ2LjItMjMuNC00MC44LTM3LjEtODQtNDIuNy0xMTEuNy0xLjEtNS4yIC42LTEwLjcgNC40LTE0LjVzOS4yLTUuNCAxNC40LTQuNGMyNy45IDUuNSA3MS4yIDE5LjIgMTEyLjIgNDIuNSAxMi4yIDYuOSAyNC4zIDE0LjggMzUuOCAyMy43LTEuNC0yOC43IDMuMS01Ny42IDEwLjMtODQgMTIuNS00NS4zIDMzLjQtODUuNSA0OS4yLTEwOWwxLjItMS42QzI0Ni45IDIgMjUxLjMgMCAyNTYgMHoiXQogICAgfTsKICAgIGZhUGVvcGxlUm9vZiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZW9wbGUtcm9vZiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTM3IiwgIk0zMDIuMy0xMi42Yy05LTQuNS0xOS42LTQuNS0yOC42IDBsLTI1NiAxMjhDMS45IDEyMy4zLTQuNSAxNDIuNSAzLjQgMTU4LjNzMjcuMSAyMi4yIDQyLjkgMTQuM0wyODggNTEuOCA1MjkuNyAxNzIuNmMxNS44IDcuOSAzNSAxLjUgNDIuOS0xNC4zczEuNS0zNS0xNC4zLTQyLjlsLTI1Ni0xMjh6TTI4OCAyNzJhNTYgNTYgMCAxIDAgMC0xMTIgNTYgNTYgMCAxIDAgMCAxMTJ6bTAgNDhjLTUzIDAtOTYgNDMtOTYgOTZsMCAzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxMjggMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTMyYzAtNTMtNDMtOTYtOTYtOTZ6TTE2MCAyNTZhNDggNDggMCAxIDAgLTk2IDAgNDggNDggMCAxIDAgOTYgMHptMzUyIDBhNDggNDggMCAxIDAgLTk2IDAgNDggNDggMCAxIDAgOTYgMHpNMTEyIDMzNmMtNDQuMiAwLTgwIDM1LjgtODAgODBsMCAzMy4xYzAgMTcgMTMuOCAzMC45IDMwLjkgMzAuOWw4Ny44IDBjLTQuMy05LjgtNi43LTIwLjYtNi43LTMybDAtNDhjMC0xOC40IDMuNS0zNiA5LjgtNTIuMi0xMi4yLTcuNS0yNi41LTExLjgtNDEuOC0xMS44ek00MjUuNCA0ODBsODcuOCAwYzE3IDAgMzAuOS0xMy44IDMwLjktMzAuOWwwLTMzLjFjMC00NC4yLTM1LjgtODAtODAtODAtMTUuMyAwLTI5LjYgNC4zLTQxLjggMTEuOCA2LjMgMTYuMiA5LjggMzMuOCA5LjggNTIuMmwwIDQ4YzAgMTEuNC0yLjQgMjIuMi02LjcgMzJ6Il0KICAgIH07CiAgICBmYURpc2Vhc2UgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZGlzZWFzZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmN2ZhIiwgIk0yMzYuNSAyOS40TDIyNCA0OGMtMjAgMzAtNTMuNiA0OC04OS43IDQ4TDY4IDk2Yy0zNy41IDAtNjcuOSAzMC40LTY3LjkgNjcuOSAwIDE4IDcuMiAzNS4yIDE5LjkgNDcuOWwyNyAyN2MxMSAxMSAxNy4yIDI1LjkgMTcuMiA0MS41IDAgMTUuOC02LjQgMzAuOS0xNy43IDQyTDMzLjQgMzM1LjFjLTExLjEgMTAuOC0xNy4zIDI1LjctMTcuMyA0MS4yIDAgMzYuOCAzNC4xIDY0LjIgNzAuMSA1Ni4ybDYyLjMtMTMuOGM3LjctMS43IDE1LjctMi42IDIzLjYtMi42IDMyLjggMCA2NC4yIDE0LjYgODUuMiAzOS44bDMwLjUgMzYuNmMxMC40IDEyLjQgMjUuNyAxOS42IDQxLjkgMTkuNiAzMC4xIDAgNTQuNS0yNC40IDU0LjUtNTQuNWwwLTUxLjJjMC00MS40IDI1LjQtNzguNSA2NC05My41bDIyLjItOC42YzI1LjItOS44IDQxLjgtMzQuMSA0MS44LTYxLjEgMC0yNi40LTE1LjktNTAuMy00MC4zLTYwLjVMNDI5IDE2NC44Yy0zMy4yLTEzLjktNTcuNi00My02NS41LTc4LjFsLTcuOS0zNS4yYy02LjgtMzAuMS0zMy41LTUxLjUtNjQuMy01MS41LTIyIDAtNDIuNiAxMS01NC44IDI5LjR6TTE2MCAxOTJhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em05NiAwYTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTMyIDk2YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhQm9va0JpYmxlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvb2stYmlibGUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiYmlibGUiXSwgImY2NDciLCAiTTk2IDUxMmMtNTMgMC05Ni00My05Ni05NkwwIDk2QzAgNDMgNDMgMCA5NiAwTDQwMCAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMjg4YzAgMjAuOS0xMy40IDM4LjctMzIgNDUuM2wwIDY2LjdjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMOTYgNTEyem0wLTEyOGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwyNTYgMCAwLTY0LTI1NiAwek0xOTIgODBsMCA0OC00OCAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsNDggMCAwIDExMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0xMTIgNDggMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTQ4IDAgMC00OGMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnoiXQogICAgfTsKICAgIGZhQmlibGUgPSBmYUJvb2tCaWJsZTsKICAgIGZhQ2hlc3NCb2FyZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGVzcy1ib2FyZCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNDNjIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyem02NCA2NGwwIDY0IDY0IDAgMC02NCA2NCAwIDAgNjQgNjQgMCAwLTY0IDY0IDAgMCA2NC02NCAwIDAgNjQgNjQgMCAwIDY0LTY0IDAgMCA2NCA2NCAwIDAgNjQtNjQgMCAwLTY0LTY0IDAgMCA2NC02NCAwIDAtNjQtNjQgMCAwIDY0LTY0IDAgMC02NCA2NCAwIDAtNjQtNjQgMCAwLTY0IDY0IDAgMC02NC02NCAwIDAtNjQgNjQgMHptNjQgMTI4bDY0IDAgMC02NC02NCAwIDAgNjR6bTAgNjRsMC02NC02NCAwIDAgNjQgNjQgMHptNjQgMGwtNjQgMCAwIDY0IDY0IDAgMC02NHptMCAwbDY0IDAgMC02NC02NCAwIDAgNjR6Il0KICAgIH07CiAgICBmYU1hcnMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFycyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzk3OTRdLCAiZjIyMiIsICJNMzIwIDMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyTDQ4MCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTI4YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNTAuNy05NSA5NWMxOS41IDI4LjQgMzEgNjIuNyAzMSA5OS44IDAgOTcuMi03OC44IDE3Ni0xNzYgMTc2UzMyIDQwMS4yIDMyIDMwNCAxMTAuOCAxMjggMjA4IDEyOGMzNyAwIDcxLjQgMTEuNCA5OS44IDMxbDk1LTk1LTUwLjcgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6TTIwOCA0MTZhMTEyIDExMiAwIDEgMCAwLTIyNCAxMTIgMTEyIDAgMSAwIDAgMjI0eiJdCiAgICB9OwogICAgZmFMYXB0b3AgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGFwdG9wIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI4MTg3XSwgImYxMDkiLCAiTTEyOCAzMkM5Mi43IDMyIDY0IDYwLjcgNjQgOTZsMCAyNDAgNjQgMCAwLTI0MCAzODQgMCAwIDI0MCA2NCAwIDAtMjQwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDEyOCAzMnpNMTkuMiAzODRDOC42IDM4NCAwIDM5Mi42IDAgNDAzLjIgMCA0NDUuNiAzNC40IDQ4MCA3Ni44IDQ4MGw0ODYuNCAwYzQyLjQgMCA3Ni44LTM0LjQgNzYuOC03Ni44IDAtMTAuNi04LjYtMTkuMi0xOS4yLTE5LjJMMTkuMiAzODR6Il0KICAgIH07CiAgICBmYVVzZXJYbWFyayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1c2VyLXhtYXJrIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInVzZXItdGltZXMiXSwgImYyMzUiLCAiTTI1NC4xIDMwNGM5OC41IDAgMTc4LjMgNzkuOCAxNzguMyAxNzguMyAwIDE2LjQtMTMuMyAyOS43LTI5LjcgMjkuN0w0Ni4xIDUxMmMtMTYuNCAwLTI5LjctMTMuMy0yOS43LTI5LjcgMC05OC41IDc5LjgtMTc4LjMgMTc4LjMtMTc4LjNsNTkuNCAwek01MzAuMyAxMDguMWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjlsLTMzLjkgMzMuOSAzMy45IDMzLjljOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtMzMuOS0zMy45LTMzLjkgMzMuOWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWwzMy45LTMzLjktMzMuOS0zMy45Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBsMzMuOSAzMy45IDMzLjktMzMuOXpNMjI0LjQgMjQ4YTEyMCAxMjAgMCAxIDEgMC0yNDAgMTIwIDEyMCAwIDEgMSAwIDI0MHoiXQogICAgfTsKICAgIGZhVXNlclRpbWVzID0gZmFVc2VyWG1hcms7CiAgICBmYUZsYWdVc2EgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmxhZy11c2EiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjc0ZCIsICJNMzIgMEM0OS43IDAgNjQgMTQuMyA2NCAzMmwwIDE2IDY5LTE3LjJjMzguMS05LjUgNzguMy01LjEgMTEzLjUgMTIuNSA0Ni4zIDIzLjIgMTAwLjggMjMuMiAxNDcuMSAwbDkuNi00LjhDNDIzLjggMjguMSA0NDggNDMuMSA0NDggNjYuMWwwIDM2LjEtNDQuNyAxNi4yYy00Mi44IDE1LjYtOTAgMTMuOS0xMzEuNi00LjZsLTE2LjEtNy4yYy0yMC4zLTktNDEuOC0xNC43LTYzLjYtMTYuOWwwIDMyLjJjMTcuNCAyLjEgMzQuNCA2LjcgNTAuNiAxMy45bDE2LjEgNy4yYzQ5LjIgMjEuOSAxMDUgMjMuOCAxNTUuNiA1LjRsMzMuNy0xMi4zIDAgNjItNDQuNyAxNi4yYy00Mi44IDE1LjYtOTAgMTMuOS0xMzEuNi00LjZsLTE2LjEtNy4yYy00MC4yLTE3LjktODUtMjIuNS0xMjguMS0xMy4zbC02My41IDEzLjYgMCAzMi43IDcwLjItMTUuMWMzNi40LTcuOCA3NC4zLTMuOSAxMDguNCAxMS4zbDE2LjEgNy4yYzQ5LjIgMjEuOSAxMDUgMjMuOCAxNTUuNiA1LjRsMzMuNy0xMi4zIDAgNjEuOS00NC43IDE2LjJjLTQyLjggMTUuNi05MCAxMy45LTEzMS42LTQuNmwtMTYuMS03LjJjLTQwLjItMTcuOS04NS0yMi41LTEyOC4xLTEzLjNsLTYzLjUgMTMuNiAwIDMyLjcgNzAuMi0xNS4xYzM2LjQtNy44IDc0LjMtMy45IDEwOC40IDExLjNsMTYuMSA3LjJjNDkuMiAyMS45IDEwNSAyMy44IDE1NS42IDUuNGwzMy43LTEyLjMgMCAzMy41YzAgMTMuMy04LjMgMjUuMy0yMC44IDMwbC0zNC43IDEzYy00Ni4yIDE3LjMtOTcuNiAxNC42LTE0MS43LTcuNC0zNy45LTE5LTgxLjQtMjMuNy0xMjIuNS0xMy40TDY0IDQwMCA2NCA0ODBjMCAxNy43LTE0LjMgMzItMzIgMzJTMCA0OTcuNyAwIDQ4MEwwIDMyQzAgMTQuMyAxNC4zIDAgMzIgMHptODAgOTZhMTYgMTYgMCAxIDAgLTMyIDAgMTYgMTYgMCAxIDAgMzIgMHptMzIgMGExNiAxNiAwIDEgMCAwLTMyIDE2IDE2IDAgMSAwIDAgMzJ6bS0zMiA0OGExNiAxNiAwIDEgMCAtMzIgMCAxNiAxNiAwIDEgMCAzMiAwem0zMiAwYTE2IDE2IDAgMSAwIDAtMzIgMTYgMTYgMCAxIDAgMCAzMnoiXQogICAgfTsKICAgIGZhSGFuZE1pZGRsZUZpbmdlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kLW1pZGRsZS1maW5nZXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjg0MDVdLCAiZjgwNiIsICJNMjMyIDBjLTIyLjEgMC00MCAxNy45LTQwIDQwbDAgMTY0LjJjLTguNS03LjYtMTkuNy0xMi4yLTMyLTEyLjItMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCA4MGMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTU1LjdjLTIgMS40LTMuOSAzLTUuOCA0LjVMNTUgMjg0LjhDNDAuNCAyOTcgMzIgMzE1IDMyIDMzNEwzMiAzNzJjMCAzOCAxNi45IDc0IDQ2LjEgOTguM2w1LjQgNC41YzI4LjggMjQgNjUgMzcuMSAxMDIuNCAzNy4xTDMwNCA1MTJjNzAuNyAwIDEyOC01Ny4zIDEyOC0xMjhsMC05NmMwLTI2LjUtMjEuNS00OC00OC00OC0xMi40IDAtMjMuNiA0LjctMzIuMSAxMi4zLTEuOS0yNC44LTIyLjYtNDQuMy00Ny45LTQ0LjMtMTIuMyAwLTIzLjUgNC42LTMyIDEyLjJMMjcyIDQwYzAtMjIuMS0xNy45LTQwLTQwLTQweiJdCiAgICB9OwogICAgZmFNb3J0YXJQZXN0bGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibW9ydGFyLXBlc3RsZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNWE3IiwgIk01MDQuMyAxMS4xQzQ5My4zLTEuNiA0NzQuNS0zLjcgNDYxIDYuMkwyNTIuMyAxNjAgMzk3LjMgMTYwIDUwMi42IDU0LjZjMTEuOC0xMS44IDEyLjYtMzAuOCAxLjYtNDMuNXpNMzIgMTkyYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMyYzAgODIuNSA0My40IDE0Ny43IDEyMy45IDE3Ni4yLTExLjEgMTMuOS0xOS40IDMwLjMtMjMuOSA0OC4xLTQuNCAxNy4xIDEwLjQgMzEuNyAyOC4xIDMxLjdsMTkyIDBjMTcuNyAwIDMyLjQtMTQuNiAyOC4xLTMxLjctNC41LTE3LjgtMTIuOC0zNC4xLTIzLjktNDguMSA4MC41LTI4LjYgMTIzLjktOTMuNyAxMjMuOS0xNzYuMiAxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwzMiAxOTJ6Il0KICAgIH07CiAgICBmYUhlYWRTaWRlQ291Z2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGVhZC1zaWRlLWNvdWdoIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUwNjEiLCAiTTk2IDUxMmw2NCAwYzUzIDAgOTYtNDMgOTYtOTZsMC04MGMwLTguOCA3LjItMTYgMTYtMTZsMSAwYzI2IDAgNDctMjEgNDctNDcgMC0xMS0zLjktMjEuNi0xMC45LTMwLjFMMjczLjMgMjAwQzI3MS40IDE5Ny42IDI3MC4xIDE5NC43IDI2OS43IDE5MS43IDI1NCA4My4zIDE2MC43IDAgNDggMCA0MC40IDAgMzIuOSAuNCAyNS40IDEuMSAxMC41IDIuNiAwIDE1LjkgMCAzMC45TDAgNDgwYzAgMTcuNyAxNC4zIDMyIDMyIDMybDY0IDB6bTE2LTMyMGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem02My4xIDIzNy4ybC00MS41LTMuNWMtMTIuMi0xLTIxLjYtMTEuMi0yMS42LTIzLjQgMC0xMC44IDcuMy0yMC4yIDE3LjgtMjIuOGw0MC40LTEwLjFjMTkuMi00LjggMzcuOCA5LjcgMzcuOCAyOS41IDAgMTcuOC0xNS4yIDMxLjgtMzIuOSAzMC4zek00ODAgMzEyYTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHptLTQwIDI0YTI0IDI0IDAgMSAwIC00OCAwIDI0IDI0IDAgMSAwIDQ4IDB6bS02NCA0OGEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAwem0xMjggMGEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAwek00ODAgNTA0YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHptLTQwLTcyYTI0IDI0IDAgMSAwIC00OCAwIDI0IDI0IDAgMSAwIDQ4IDB6Il0KICAgIH07CiAgICBmYVBsYW5lTG9jayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwbGFuZS1sb2NrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NTgiLCAiTTIzMiAyNGMwLTMwLjkgMjUuMS01NiA1Ni01NnM1NiAyNS4xIDU2IDU2bDAgMTI3LjMgODIuMSA3NS4yQzQwOS43IDI0OC4xIDQwMCAyNzQuOSA0MDAgMzA0bDAgMjQuNGMtNy4zIDYuNi0xMy42IDE0LjItMTguNyAyMi43bC0zNy4zLTEyLjQgMCA5OS43IDI0IDE5LjIgMCAzOC4zYzAgMTMuNSAyLjggMjYuNCA3LjggMzguMUwyODggNTEyIDE3OS45IDUzOWMtMTAuMSAyLjUtMTkuOS01LjEtMTkuOS0xNS41bDAtMTkuOGMwLTQuOSAyLjItOS41IDYtMTIuNWw2Ni01Mi44IDAtOTkuNy0xNjIuOSA1NC4zQzU4LjcgMzk2LjQgNDggMzg4LjcgNDggMzc3LjhsMC00My43YzAtOSAzLjgtMTcuNSAxMC40LTIzLjZMMjMyIDE1MS4zIDIzMiAyNHpNNTYwIDMwNC4xYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgNDcuOSA2NCAwIDAtNDcuOXpNNDE2IDQwMGMwLTIwLjkgMTMuNC0zOC43IDMyLTQ1LjNsMC01MC42YzAtNDQuMiAzNS44LTgwIDgwLTgwczgwIDM1LjggODAgODBsMCA1MC42YzE4LjYgNi42IDMyIDI0LjQgMzIgNDUuM2wwIDk2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xMjggMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC05NnoiXQogICAgfTsKICAgIGZhQmF0dGVyeVRocmVlUXVhcnRlcnMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmF0dGVyeS10aHJlZS1xdWFydGVycyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWyJiYXR0ZXJ5LTQiXSwgImYyNDEiLCAiTTUyOCAxMjhjOC44IDAgMTYgNy4yIDE2IDE2bDAgMjI0YzAgOC44LTcuMiAxNi0xNiAxNmwtNDE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTIyNGMwLTguOCA3LjItMTYgMTYtMTZsNDE2IDB6TTExMiA2NGMtNDQuMiAwLTgwIDM1LjgtODAgODBsMCAyMjRjMCA0NC4yIDM1LjggODAgODAgODBsNDE2IDBjNDQuMiAwIDgwLTM1LjggODAtODBsMC00OGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTY0YzAtMTcuNy0xNC4zLTMyLTMyLTMybDAtNDhjMC00NC4yLTM1LjgtODAtODAtODBMMTEyIDY0em01NiAxMTJjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMTEyYzAgMTMuMyAxMC43IDI0IDI0IDI0bDIyNCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtMTEyYzAtMTMuMy0xMC43LTI0LTI0LTI0bC0yMjQgMHoiXQogICAgfTsKICAgIGZhQmF0dGVyeTQgPSBmYUJhdHRlcnlUaHJlZVF1YXJ0ZXJzOwogICAgZmFGcmFuY1NpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZnJhbmMtc2lnbiIsCiAgICAgIGljb246IFszMjAsIDUxMiwgW10sICJlMThmIiwgIk04MCAzMkM2Mi4zIDMyIDQ4IDQ2LjMgNDggNjRsMCAyNTYtMjQgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwyNCAwIDAgODBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTgwIDg4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTg4IDAgMC02NCAxNDQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTQ0IDAgMC05NiAxNzYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkw4MCAzMnoiXQogICAgfTsKICAgIGZhRmlsdGVyQ2lyY2xlRG9sbGFyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbHRlci1jaXJjbGUtZG9sbGFyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImZ1bm5lbC1kb2xsYXIiXSwgImY2NjIiLCAiTTMyIDY0QzE5LjEgNjQgNy40IDcxLjggMi40IDgzLjhTLjIgMTA5LjUgOS40IDExOC42TDE5MiAzMDEuMyAxOTIgNDE2YzAgOC41IDMuNCAxNi42IDkuNCAyMi42bDY0IDY0YzIuNSAyLjUgNS4zIDQuNSA4LjMgNi0yMS4yLTMwLjktMzMuNi02OC4zLTMzLjYtMTA4LjYgMC05OS40IDc1LjUtMTgxLjEgMTcyLjMtMTkxbDkwLjQtOTAuNGM5LjItOS4yIDExLjktMjIuOSA2LjktMzQuOVM0OTIuOSA2NCA0ODAgNjRMMzIgNjR6TTU3NiA0MDBhMTQ0IDE0NCAwIDEgMCAtMjg4IDAgMTQ0IDE0NCAwIDEgMCAyODggMHpNNDE2IDMyMGMwLTguOCA3LjItMTYgMTYtMTZzMTYgNy4yIDE2IDE2bDAgOCAxNiAwYzguOCAwIDE2IDcuMiAxNiAxNnMtNy4yIDE2LTE2IDE2bC00NS44IDBjLTUuNiAwLTEwLjIgNC42LTEwLjIgMTAuMiAwIDQuOSAzLjUgOS4xIDguMyAxMGw0NSA4LjJjMjAgMy42IDM0LjYgMjEuMSAzNC42IDQxLjUgMCAyMy4zLTE4LjkgNDIuMi00Mi4yIDQyLjJsLTUuOCAwIDAgOGMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTgtMTYgMGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNmw1My44IDBjNS42IDAgMTAuMi00LjYgMTAuMi0xMC4yIDAtNC45LTMuNS05LjEtOC4zLTEwbC00NS04LjJjLTIwLTMuNi0zNC42LTIxLjEtMzQuNi00MS41IDAtMjIuNiAxNy43LTQxIDQwLTQyLjFsMC04LjF6Il0KICAgIH07CiAgICBmYUZ1bm5lbERvbGxhciA9IGZhRmlsdGVyQ2lyY2xlRG9sbGFyOwogICAgZmFDaGVlc2UgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hlZXNlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY3ZWYiLCAiTTUxMiAyNDAuMmwwIDE1LjgtNTEyIDBjMC0yMCAxMC0zOC43IDI2LjYtNDkuOEwyNzQuOSA0MC43YzguNi01LjcgMTguNi04LjcgMjguOS04LjcgMTE1IDAgMjA4LjIgOTMuMiAyMDguMiAyMDguMnptMCA2My44bDAgMTEyYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0xMTIgNTEyIDB6Il0KICAgIH07CiAgICBmYUNpcmNsZUggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLWgiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5NDA1LCAiaG9zcGl0YWwtc3ltYm9sIl0sICJmNDdlIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnptOTYtMzQ0bDAgMTc2YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNjQtOTYgMCAwIDY0YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMTc2YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA2NCA5NiAwIDAtNjRjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNHoiXQogICAgfTsKICAgIGZhSG9zcGl0YWxTeW1ib2wgPSBmYUNpcmNsZUg7CiAgICBmYVNjaG9vbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzY2hvb2wiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjc5NzldLCAiZjU0OSIsICJNMCAxOTJjMC0zNS4zIDI4LjctNjQgNjQtNjRsNjQgMCAxMjcuOS0xMTUuMWMxOC4zLTE2LjQgNDYtMTYuNCA2NC4yIDBMNDQ4IDEyOCA1MTIgMTI4YzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjU2YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxOTJ6TTIyNCAzNzZsMCA4OCAxMjggMCAwLTg4YzAtMjIuMS0xNy45LTQwLTQwLTQwbC00OCAwYy0yMi4xIDAtNDAgMTcuOS00MCA0MHptLTExMiA4YzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDB6bTE2LTE0NGwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2ek00OTYgMzg0YzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDB6bTE2LTE0NGwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2ek0yODggMjU2YTY0IDY0IDAgMSAwIDAtMTI4IDY0IDY0IDAgMSAwIDAgMTI4eiJdCiAgICB9OwogICAgZmFEaWNlRml2ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkaWNlLWZpdmUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs5ODYwXSwgImY1MjMiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6bTY0IDk2YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHpNOTYgMzUyYTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6TTIyNCAyMjRhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em02NC02NGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0zMiAxNjBhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFUb3JuYWRvID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRvcm5hZG8iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjc3ODZdLCAiZjc2ZiIsICJNMCAzMkwwIDQ1LjZDMCA2Mi43IDEuNyA3OS42IDUgOTZsMzUyLjggMGMzLjItNi45IDcuNS0xMy4zIDEzLTE4LjhsMzguNi0zOC42YzQuMi00LjIgNi42LTEwIDYuNi0xNiAwLTEyLjUtMTAuMS0yMi42LTIyLjYtMjIuNkwzMiAwQzE0LjMgMCAwIDE0LjMgMCAzMnpNMzU1LjcgMTQ0bC0zMzYgMGMxMi40IDI5LjcgMzAuMiA1Ni44IDUyLjcgODBsMzM5LjYgMC00Ny4yLTYyLjljLTMuOS01LjItNy0xMS05LjItMTcuMXpNMjQyLjYgMzM0LjdjOC4yIDQuOCAxNS44IDEwLjcgMjIuNSAxNy4zTDQ0NSAzNTJjMi05LjggMy0xOS45IDMtMzAuMSAwLTE3LjEtMi45LTM0LTguNi00OS45TDEzNiAyNzIgMjQyLjYgMzM0Ljd6TTI5NC4zIDQwMGM1LjMgMTcgNi41IDM1LjIgMy42IDUzbC01LjkgMzUuN2MtMiAxMi4yIDcuNCAyMy40IDE5LjggMjMuNCA1LjMgMCAxMC40LTIuMSAxNC4yLTUuOWw3OC4yLTc4LjJjOC41LTguNSAxNS44LTE3LjggMjEuOS0yNy45bC0xMzEuOCAweiJdCiAgICB9OwogICAgZmFKZXRGaWdodGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImpldC1maWdodGVyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImZpZ2h0ZXItamV0Il0sICJmMGZiIiwgIk00OTYuMiAyMDYuOGMtMTAuNy00LjUtMjIuMi02LjgtMzMuOC02LjhMMzYyIDIwMCAyNDggNDggMjk2IDQ4YzEzLjMgMCAyNC0xMC43IDI0LTI0UzMwOS4zIDAgMjk2IDBMMTUyIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsOCAwIDAgMTUyLTU0LjQgMC01Mi44LTY2Yy0zLTMuOC03LjYtNi0xMi41LTZMMTYgMTI4Yy04LjggMC0xNiA3LjItMTYgMTZsMCA4OCA0MCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC00MCAwIDAgODhjMCA4LjggNy4yIDE2IDE2IDE2bDI0LjMgMGM0LjkgMCA5LjUtMi4yIDEyLjUtNmw1Mi44LTY2IDU0LjQgMCAwIDE1Mi04IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTQ0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTQ4IDAgMTE0LTE1MiAxMDAuNCAwYzExLjYgMCAyMy4xLTIuMyAzMy44LTYuOGw2NS0yNy4xYzguOS0zLjcgMTQuOC0xMi41IDE0LjgtMjIuMnMtNS44LTE4LjQtMTQuOC0yMi4ybC02NS0yNy4xeiJdCiAgICB9OwogICAgZmFGaWdodGVySmV0ID0gZmFKZXRGaWdodGVyOwogICAgZmFUaHVtYnNEb3duMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0aHVtYnMtZG93biIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODA3OCwgNjE1NzZdLCAiZjE2NSIsICJNMzg0IDMyYzI2LjUgMCA0OCAyMS41IDQ4IDQ4IDAgNi4zLTEuMyAxMi4yLTMuNCAxNy43IDIwLjQgNS41IDM1LjQgMjQuMSAzNS40IDQ2LjMgMCA5LjEtMi42IDE3LjYtNyAyNC45IDIyLjIgNC4yIDM5IDIzLjcgMzkgNDcuMSAwIDE5LjctMTEuOSAzNi42LTI4LjkgNDQgMTcgNy40IDI4LjkgMjQuMyAyOC45IDQ0IDAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xNjAgMCAyOC4yIDcwLjRjMi41IDYuMyAzLjggMTMuMSAzLjggMTkuOWwwIDQuMmMwIDI3LjMtMjIuMSA0OS40LTQ5LjQgNDkuNC0xOC43IDAtMzUuOC0xMC42LTQ0LjItMjcuM0wxNzAuMSAzNTYuM2MtNi43LTEzLjMtMTAuMS0yOC0xMC4xLTQyLjlsMC0xODYuNmMwLTE5LjQgOC45LTM3LjggMjQtNTBsMTIuMi05LjdDMjI0LjYgNDQuNCAyNTkuOCAzMiAyOTYuMSAzMkwzODQgMzJ6TTgwIDk2YzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMjU2YzAgMTcuNy0xNC4zIDMyLTMyIDMybC00OCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMkwwIDEyOGMwLTE3LjcgMTQuMy0zMiAzMi0zMmw0OCAweiJdCiAgICB9OwogICAgZmFCcm9vbSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJicm9vbSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyOTUyOV0sICJmNTFhIiwgIk01NjYuNiA1NC42YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwbC0xOTIgMTkyLTM0LjctMzQuN2MtNC4yLTQuMi0xMC02LjYtMTYtNi42LTEyLjUgMC0yMi42IDEwLjEtMjIuNiAyMi42bDAgMjkuMSAxMDguMyAxMDguMyAyOS4xIDBjMTIuNSAwIDIyLjYtMTAuMSAyMi42LTIyLjYgMC02LTIuNC0xMS44LTYuNi0xNmwtMzQuNy0zNC43IDE5Mi0xOTJ6TTM0MS4xIDM1My40TDIyMi42IDIzNC45Yy00Mi43LTMuNy04NS4yIDExLjctMTE1LjggNDIuM2wtOCA4Yy0yMi4zIDIyLjMtMzQuOCA1Mi41LTM0LjggODQgMCA2LjggNy4xIDExLjIgMTMuMiA4LjJsNTEuMS0yNS41YzUtMi41IDkuNSA0LjEgNS40IDcuOUw3LjMgNDczLjRDMi43IDQ3Ny42IDAgNDgzLjYgMCA0ODkuOSAwIDUwMi4xIDkuOSA1MTIgMjIuMSA1MTJsMTczLjMgMGMzOC44IDAgNzUuOS0xNS40IDEwMy40LTQyLjggMzAuNi0zMC42IDQ1LjktNzMuMSA0Mi4zLTExNS44eiJdCiAgICB9OwogICAgZmFGaWxlSW1wb3J0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbGUtaW1wb3J0IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbImFycm93LXJpZ2h0LXRvLWZpbGUiXSwgImY1NmYiLCAiTTY0IDBDMjguNyAwIDAgMjguNyAwIDY0bDAgMjQwIDE4Mi4xIDAtMzEtMzFjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGw3MiA3MmM5LjQgOS40IDkuNCAyNC42IDAgMzMuOWwtNzIgNzJjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsMzEtMzEtMTgyLjEgMCAwIDk2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI1NiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjc3LjVjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNMMjU4LjcgMTguN0MyNDYuNyA2LjcgMjMwLjUgMCAyMTMuNSAwTDY0IDB6TTMyNS41IDE3NkwyMzIgMTc2Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNEwyMDggNTguNSAzMjUuNSAxNzZ6Il0KICAgIH07CiAgICBmYUFycm93UmlnaHRUb0ZpbGUgPSBmYUZpbGVJbXBvcnQ7CiAgICBmYVV0ZW5zaWxzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInV0ZW5zaWxzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3ODYwLCA2MTY4NSwgImN1dGxlcnkiXSwgImYyZTciLCAiTTYzLjkgMTQuNEM2My4xIDYuMiA1Ni4yIDAgNDggMHMtMTUuMSA2LjItMTYgMTQuM0wxNy45IDE0OS43Yy0xLjMgNi0xLjkgMTIuMS0xLjkgMTguMiAwIDQ1LjkgMzUuMSA4My42IDgwIDg3LjdMOTYgNDgwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yMjQuNGM0NC45LTQuMSA4MC00MS44IDgwLTg3LjcgMC02LjEtLjYtMTIuMi0xLjktMTguMkwyMjMuOSAxNC4zQzIyMy4xIDYuMiAyMTYuMiAwIDIwOCAwcy0xNS4xIDYuMi0xNS45IDE0LjRMMTc4LjUgMTQ5LjljLS42IDUuNy01LjQgMTAuMS0xMS4xIDEwLjEtNS44IDAtMTAuNi00LjQtMTEuMi0xMC4yTDE0My45IDE0LjZDMTQzLjIgNi4zIDEzNi4zIDAgMTI4IDBzLTE1LjIgNi4zLTE1LjkgMTQuNkw5OS44IDE0OS44Yy0uNSA1LjgtNS40IDEwLjItMTEuMiAxMC4yLTUuOCAwLTEwLjYtNC40LTExLjEtMTAuMUw2My45IDE0LjR6TTQ0OCAwQzQzMiAwIDMyMCAzMiAzMjAgMTc2bDAgMTEyYzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyIDAgMCAxMjhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTQ0OGMwLTE3LjctMTQuMy0zMi0zMi0zMnoiXQogICAgfTsKICAgIGZhQ3V0bGVyeSA9IGZhVXRlbnNpbHM7CiAgICBmYUlkQmFkZ2UyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImlkLWJhZGdlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYyYzEiLCAiTTY0IDBDMjguNyAwIDAgMjguNyAwIDY0TDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI1NiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzg0YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDB6bTk2IDM1Mmw2NCAwYzQ0LjIgMCA4MCAzNS44IDgwIDgwIDAgOC44LTcuMiAxNi0xNiAxNkw5NiA0NDhjLTguOCAwLTE2LTcuMi0xNi0xNiAwLTQ0LjIgMzUuOC04MCA4MC04MHptLTI0LTk2YTU2IDU2IDAgMSAxIDExMiAwIDU2IDU2IDAgMSAxIC0xMTIgMHpNMTUyIDY0bDgwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTgwIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYVNwaWRlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcGlkZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgzNzVdLCAiZjcxNyIsICJNMzY5LjMtMzFjMTEuOS0zLjUgMjQuNCAyLjcgMjkgMTMuOWwuOCAyLjMgNDAgMTM2YzIuNSA4LjQgLjEgMTcuNS02LjEgMjMuN2wtNjQuMSA2NC4xIDc2LjQtMjAuOCAxOS45LTU5LjggLjktMi4zYzUtMTEuMSAxNy43LTE2LjggMjkuNS0xMi45IDExLjggMy45IDE4LjUgMTYuMSAxNS44IDI4bC0uNyAyLjQtMjQgNzJjLTIuNSA3LjYtOC43IDEzLjQtMTYuNSAxNS42bC05MS4xIDI0LjggOTEuMSAyNC44YzcuNyAyLjEgMTMuOSA4IDE2LjUgMTUuNmwyNCA3MiAuNyAyLjRjMi43IDExLjktNC4xIDI0LjEtMTUuOCAyOC0xMS44IDMuOS0yNC41LTEuOC0yOS41LTEyLjlsLS45LTIuMy0xOS45LTU5LjgtNzYuNC0yMC44IDY0LjEgNjQuMWM2LjEgNi4xIDguNSAxNS4xIDYuMiAyMy40bC00MCAxNDQtLjggMi4zYy00LjQgMTEuMy0xNi44IDE3LjctMjguOCAxNC40LTEyLTMuMy0xOS4zLTE1LjItMTcuMi0yNy4ybC41LTIuNCAzNi4yLTEzMC41LTM3LjItMzcuMkMzNTEgNDA2IDMwOC40IDQ0OCAyNTYgNDQ4cy05NS00Mi05Ni05NC4xbC0zNyAzNyAzNiAxMjIuMyAuNiAyLjRjMi4yIDExLjktNC45IDIzLjktMTYuOCAyNy40LTExLjkgMy41LTI0LjQtMi43LTI5LTEzLjlsLS44LTIuMy00MC0xMzZjLTIuNS04LjQtLjEtMTcuNSA2LjEtMjMuOGw2NC4xLTY0LjEtNzYuNCAyMC44LTE5LjkgNTkuOC0uOSAyLjNjLTUgMTEuMS0xNy43IDE2LjgtMjkuNSAxMi45cy0xOC41LTE2LjEtMTUuOC0yOGwuNy0yLjQgMjQtNzJjMi41LTcuNiA4LjctMTMuNCAxNi41LTE1LjZsOTEuMS0yNC44LTkxLjEtMjQuOGMtNy43LTIuMS0xMy45LTgtMTYuNS0xNS42bC0yNC03Mi0uNy0yLjRjLTIuNy0xMS45IDQuMS0yNC4xIDE1LjgtMjhzMjQuNSAxLjggMjkuNSAxMi45bC45IDIuMyAxOS45IDU5LjggNzYuNCAyMC44LTY0LjEtNjQuMWMtNi4yLTYuMi04LjUtMTUuMy02LjEtMjMuN2w0MC0xMzYgLjgtMi4zYzQuNi0xMS4zIDE3LjEtMTcuNCAyOS0xMy45IDExLjkgMy41IDE5IDE1LjUgMTYuOCAyNy40bC0uNiAyLjQtMzYgMTIyLjMgNTMgNTNjMS00My4zIDM2LjQtNzguMSA3OS45LTc4LjFzNzguOSAzNC44IDc5LjkgNzguMmw1My4xLTUzLjEtMzYtMTIyLjMtLjYtMi40Yy0yLjItMTIgNC45LTIzLjkgMTYuOC0yNy40eiJdCiAgICB9OwogICAgZmFNb2JpbGVSZXRybyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb2JpbGUtcmV0cm8iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZTUyNyIsICJNMTYgNjRDMTYgMjguNyA0NC43IDAgODAgMEwzMDQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDM4NGMwIDM1LjMtMjguNyA2NC02NCA2NEw4MCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDE2IDY0em04MCA5NmwwIDY0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDEyOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNjRjMC0xNy43LTE0LjMtMzItMzItMzJsLTEyOCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnptOCAxOTJhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4em0yNCA3MmMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNCAxMC43IDI0IDI0IDI0IDI0LTEwLjcgMjQtMjR6bTY0LTcyYTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHptMjQgNzJjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjQgMTAuNyAyNCAyNCAyNCAyNC0xMC43IDI0LTI0em02NC03MmEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6bTI0IDcyYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0IDEwLjcgMjQgMjQgMjQgMjQtMTAuNyAyNC0yNHpNMTY4IDQwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTQ4IDB6Il0KICAgIH07CiAgICBmYVNpZ25zUG9zdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaWducy1wb3N0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbIm1hcC1zaWducyJdLCAiZjI3NyIsICJNMjU2LjQgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAzMi0xNjAgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxNjAgMCAwIDY0LTE1My40IDBjLTQuMiAwLTguMyAxLjctMTEuMyA0LjdsLTQ4IDQ4Yy02LjIgNi4yLTYuMiAxNi40IDAgMjIuNmw0OCA0OGMzIDMgNy4xIDQuNyAxMS4zIDQuN2wxNTMuNCAwIDAgOTZjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTk2IDE2MCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNjRjMC0xNy43LTE0LjMtMzItMzItMzJsLTE2MCAwIDAtNjQgMTUzLjQgMGM0LjIgMCA4LjMtMS43IDExLjMtNC43bDQ4LTQ4YzYuMi02LjIgNi4yLTE2LjQgMC0yMi42bC00OC00OGMtMy0zLTcuMS00LjctMTEuMy00LjdsLTE1My40IDAgMC0zMmMwLTE3LjctMTQuMy0zMi0zMi0zMnoiXQogICAgfTsKICAgIGZhTWFwU2lnbnMgPSBmYVNpZ25zUG9zdDsKICAgIGZhR3JvdXBBcnJvd3NSb3RhdGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ3JvdXAtYXJyb3dzLXJvdGF0ZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNGY2IiwgIk0zNy42IDEyMi4zYy0xMS41IDE4LjctMjAuNiAzOS0yNyA2MC41LTUgMTYuOSA0LjYgMzQuOCAyMS41IDM5LjhzMzQuOC00LjYgMzkuOC0yMS41YzE4LjQtNjEuOSA2Ny4zLTExMC44IDEyOS4yLTEyOS4yIDE2LjktNSAyNi42LTIyLjkgMjEuNS0zOS44UzE5OS44IDUuNiAxODIuOSAxMC42QzE2MS40IDE3IDE0MS4xIDI2LjEgMTIyLjMgMzcuNiAxMTIuMyAxNS40IDg5LjkgMCA2NCAwIDI4LjcgMCAwIDI4LjcgMCA2NCAwIDg5LjkgMTUuNCAxMTIuMyAzNy42IDEyMi4zem00MzYuNyAwYzIyLjItMTAgMzcuNi0zMi40IDM3LjYtNTguMyAwLTM1LjMtMjguNy02NC02NC02NC0yNS45IDAtNDguMyAxNS40LTU4LjMgMzcuNi0xOC43LTExLjUtMzktMjAuNi02MC41LTI3LTE2LjktNS0zNC44IDQuNi0zOS44IDIxLjVzNC42IDM0LjggMjEuNSAzOS44YzYxLjkgMTguNCAxMTAuOCA2Ny4zIDEyOS4yIDEyOS4yIDUgMTYuOSAyMi45IDI2LjYgMzkuOCAyMS41czI2LjYtMjIuOSAyMS41LTM5LjhjLTYuNC0yMS41LTE1LjUtNDEuOC0yNy02MC41ek01MTIgNDQ4YzAtMjUuOS0xNS40LTQ4LjMtMzcuNi01OC4zIDExLjUtMTguNyAyMC42LTM5IDI3LTYwLjUgNS0xNi45LTQuNi0zNC44LTIxLjUtMzkuOHMtMzQuOCA0LjYtMzkuOCAyMS41Yy0xOC40IDYxLjktNjcuMyAxMTAuOC0xMjkuMiAxMjkuMi0xNi45IDUtMjYuNiAyMi45LTIxLjUgMzkuOHMyMi45IDI2LjYgMzkuOCAyMS41YzIxLjUtNi40IDQxLjgtMTUuNSA2MC41LTI3IDEwIDIyLjIgMzIuNCAzNy42IDU4LjMgMzcuNiAzNS4zIDAgNjQtMjguNyA2NC02NHpNMzcuNiAzODkuN2MtMjIuMiAxMC0zNy42IDMyLjQtMzcuNiA1OC4zIDAgMzUuMyAyOC43IDY0IDY0IDY0IDI1LjkgMCA0OC4zLTE1LjQgNTguMy0zNy42IDE4LjcgMTEuNSAzOSAyMC42IDYwLjUgMjcgMTYuOSA1IDM0LjgtNC42IDM5LjgtMjEuNXMtNC42LTM0LjgtMjEuNS0zOS44Yy02MS45LTE4LjQtMTEwLjgtNjcuMy0xMjkuMi0xMjkuMi01LTE2LjktMjIuOS0yNi42LTM5LjgtMjEuNVM1LjYgMzEyLjIgMTAuNiAzMjkuMWM2LjQgMjEuNSAxNS41IDQxLjggMjcgNjAuNXpNMjU2IDE5MmMxNS42IDAgMzAgNS42IDQxLjEgMTQuOWwtMTUuMyAxNS4zYy02LjYgNi42LTEuOSAxNy44IDcuNCAxNy44bDYwLjUgMGM1LjcgMCAxMC40LTQuNyAxMC40LTEwLjRsMC02MC41YzAtOS4zLTExLjItMTMuOS0xNy44LTcuNGwtMTEuMiAxMS4yYy0xOS44LTE3LjktNDYuMi0yOC45LTc1LjEtMjguOS00My42IDAtODEuMyAyNC45LTk5LjggNjEuMS02IDExLjgtMS40IDI2LjMgMTAuNCAzMi4zczI2LjMgMS40IDMyLjMtMTAuNGMxMC42LTIwLjggMzIuMi0zNC45IDU3LTM0Ljl6bTU4LjYgOTMuMWMtMTAuNiAyMC44LTMyLjIgMzQuOS01NyAzNC45LTE1LjcgMC0zMC01LjYtNDEuMS0xNC45bDE1LjMtMTUuM2M2LjYtNi42IDEuOS0xNy44LTcuNC0xNy44TDE2NCAyNzJjLTUuNyAwLTEwLjQgNC43LTEwLjQgMTAuNGwwIDYwLjVjMCA5LjMgMTEuMiAxMy45IDE3LjggNy40bDExLjItMTEuMmMxOS44IDE3LjkgNDYuMiAyOC45IDc1LjEgMjguOSA0My42IDAgODEuMy0yNC45IDk5LjgtNjEuMSA2LTExLjggMS40LTI2LjMtMTAuNC0zMi4zcy0yNi4zLTEuNC0zMi4zIDEwLjR6Il0KICAgIH07CiAgICBmYUFycm93c1NwbGl0VXBBbmRMZWZ0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93cy1zcGxpdC11cC1hbmQtbGVmdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNGJjIiwgIk0zNDIuNi0yMi42Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMGwtOTYgOTZjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBsNDEuNC00MS40IDAgMTk1LjljLTE4LjgtMTAuOS00MC43LTE3LjEtNjQtMTcuMWwtMTE0LjcgMCA0MS40LTQxLjRjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBsLTk2IDk2Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM2w5NiA5NmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zTDEwOS4zIDMyMCAyMjQgMzIwYzM1LjMgMCA2NCAyOC43IDY0IDY0IDAgNzAuNyA1Ny4zIDEyOCAxMjggMTI4bDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTMyIDBjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMzA2LjcgNDEuNCA0MS40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTk2LTk2eiJdCiAgICB9OwogICAgZmFGaWxsRHJpcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxsLWRyaXAiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjU3NiIsICJNMzA5LjcgNzEuNmwtNjQuNCA2NC40IDMzLjQgMzMuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMGwtMzMuNC0zMy40LTk2LjQgOTYuNGMtMi45IDIuOS01LjEgNi41LTYuMyAxMC4zbDMyMS41IDAgNTMuNy01My43YzQuOS00LjkgNy42LTExLjUgNy42LTE4LjNzLTIuNy0xMy41LTcuNi0xOC4zTDM0Ni4zIDcxLjZDMzQxLjUgNjYuNyAzMzQuOSA2NCAzMjggNjRzLTEzLjUgMi43LTE4LjMgNy42ek01OC4zIDIzMi40bDk2LjQtOTYuNC00OS40LTQ5LjRjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zczMyLjgtMTIuNSA0NS4zIDBMMjAwIDkwLjcgMjY0LjQgMjYuM0MyODEuMyA5LjUgMzA0LjEgMCAzMjggMHM0Ni43IDkuNSA2My42IDI2LjNMNTE3LjcgMTUyLjRDNTM0LjUgMTY5LjMgNTQ0IDE5Mi4xIDU0NCAyMTZzLTkuNSA0Ni43LTI2LjMgNjMuNkwzMTEuNiA0ODUuN0MyOTQuNyA1MDIuNSAyNzEuOSA1MTIgMjQ4IDUxMnMtNDYuNy05LjUtNjMuNi0yNi4zTDU4LjMgMzU5LjZDNDEuNSAzNDIuNyAzMiAzMTkuOSAzMiAyOTZzOS41LTQ2LjcgMjYuMy02My42ek01MTIgNTQ0Yy0zNS4zIDAtNjQtMjguNy02NC02NCAwLTI1LjIgMzIuNi03OS42IDUxLjItMTA4LjcgNi05LjQgMTkuNS05LjQgMjUuNSAwIDE4LjcgMjkuMSA1MS4yIDgzLjUgNTEuMiAxMDguNyAwIDM1LjMtMjguNyA2NC02NCA2NHoiXQogICAgfTsKICAgIGZhU2hpZWxkSGVhcnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2hpZWxkLWhlYXJ0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1NzQiLCAiTTI2OS40IDIuOUMyNjUuMiAxIDI2MC43IDAgMjU2IDBzLTkuMiAxLTEzLjQgMi45TDU0LjMgODIuOGMtMjIgOS4zLTM4LjQgMzEtMzguMyA1Ny4yIC41IDk5LjIgNDEuMyAyODAuNyAyMTMuNiAzNjMuMiAxNi43IDggMzYuMSA4IDUyLjggMCAxNzIuNC04Mi41IDIxMy4yLTI2NCAyMTMuNi0zNjMuMiAuMS0yNi4yLTE2LjMtNDcuOS0zOC4zLTU3LjJMMjY5LjQgMi45ek0yNDkuNiAxODMuNWw2LjQgOC41IDYuNC04LjVjMTEuMS0xNC44IDI4LjUtMjMuNSA0Ni45LTIzLjUgMzIuNCAwIDU4LjcgMjYuMyA1OC43IDU4LjdsMCA1LjNjMCA0OS4xLTY1LjggOTguMS05Ni41IDExOC4zLTkuNSA2LjItMjEuNSA2LjItMzAuOSAwLTMwLjctMjAuMi05Ni41LTY5LjMtOTYuNS0xMTguM2wwLTUuM2MwLTMyLjQgMjYuMy01OC43IDU4LjctNTguNyAxOC41IDAgMzUuOSA4LjcgNDYuOSAyMy41eiJdCiAgICB9OwogICAgZmFQZXJzb25Ta2lpbmdOb3JkaWMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLXNraWluZy1ub3JkaWMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsic2tpaW5nLW5vcmRpYyJdLCAiZjdjYSIsICJNNDI0LjggMTZhNTYgNTYgMCAxIDEgMCAxMTIgNTYgNTYgMCAxIDEgMC0xMTJ6bTk5LjggMTkzLjdjNy42IDE1LjIgMS45IDMzLjYtMTIuNiA0MmwwIDE4MC4zLTMyIDAgMC0xNjQuMi0xMC4xIDVjLTI3LjQgMTMuNy02MC43IDYuMS03OS40LTE4LjJsLTE5LjYtMjUuNS0zOS41IDY4LjggMjQuOCAxMi40YzI5LjUgMTQuNyA0Mi45IDQ5LjUgMzEuMSA4MC4ybC0yOC4yIDczLjQgMTQ5LjQgMGM3LjkgMCAxNS42LTIuMyAyMi4yLTYuN2w3LjktNS4zYzExLTcuNCAyNS45LTQuNCAzMy4zIDYuN3M0LjQgMjUuOS02LjcgMzMuM2wtNy45IDUuM0M1NDMgNTA2LjkgNTI2IDUxMiA1MDguNiA1MTJsLTE4OS4xIDBjLS41IDAtMSAwLTEuNSAwTDI0IDUxMmMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGw4OCAwYzAtOC4yIDMuMS0xNi40IDkuNC0yMi42bDc0LjEtNzQuMSAxMC4yLTM1LjljMTEuMyAxOC4zIDI3LjcgMzMuOCA0OC40IDQ0LjJsNC44IDIuNC0xLjkgNi44Yy0zIDEwLjUtOC42IDIwLTE2LjMgMjcuN2wtNTEuNSA1MS41IDEwMS4zIDAgMzcuMS05Ni40LTU1LjYtMjcuOEMyMzAuNCAzMTkgMjE1LjMgMjY3IDIzOS4zIDIyNy4xbDM3LjctNjIuNy0yNy43LTcuN2MtOS0yLjUtMTguMSAzLjItMjAgMTIuM2wtNS45IDI5LjNjLTMuMSAxNS42LTE3LjEgMjYuMy0zMi41IDI1LjdsLTEzMCAyMDgtMzcuNyAwIDE0MC42LTIyNWMtMy40LTYuMy00LjYtMTMuOC0zLjEtMjEuM2w1LjktMjkuM2M5LjEtNDUuNiA1NS4xLTczLjggOTkuOS02MS40bDMyLjUgOWM0Ni43IDEzIDg4IDQwLjggMTE3LjYgNzkuM2wyNC45IDMyLjMgNDAuNC0yMC4yYzE1LjgtNy45IDM1LTEuNSA0Mi45IDE0LjN6Il0KICAgIH07CiAgICBmYVNraWluZ05vcmRpYyA9IGZhUGVyc29uU2tpaW5nTm9yZGljOwogICAgZmFTcXVhcmVDaGVjazIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLWNoZWNrIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbOTc0NSwgOTk4OSwgNjE1MTAsICJjaGVjay1zcXVhcmUiXSwgImYxNGEiLCAiTTM4NCAzMmMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMzIwIDB6TTM0MiAxNDUuN2MtMTAuNy03LjgtMjUuNy01LjQtMzMuNSA1LjNMMTg5LjEgMzE1LjIgMTM3IDI2My4xYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDcyIDcyYzUgNSAxMS45IDcuNSAxOC44IDdzMTMuNC00LjEgMTcuNS05LjhMMzQ3LjMgMTc5LjJjNy44LTEwLjcgNS40LTI1LjctNS4zLTMzLjV6Il0KICAgIH07CiAgICBmYUNoZWNrU3F1YXJlMiA9IGZhU3F1YXJlQ2hlY2syOwogICAgZmFCYXRoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhdGgiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg3MDUsICJiYXRodHViIl0sICJmMmNkIiwgIk05NiA3Ny4zYzAtNy4zIDUuOS0xMy4zIDEzLjMtMTMuMyAzLjUgMCA2LjkgMS40IDkuNCAzLjlsMTQuOSAxNC45Yy0zLjYgOS4xLTUuNSAxOC45LTUuNSAyOS4yIDAgMTkuOSA3LjIgMzggMTkuMiA1Mi01LjMgOS4yLTQgMjEuMSAzLjggMjkgOS40IDkuNCAyNC42IDkuNCAzMy45IDBMMjg5IDg5YzkuNC05LjQgOS40LTI0LjYgMC0zMy45LTcuOC03LjktMTkuOC05LjEtMjktMy44LTE0LTEyLTMyLjEtMTkuMi01Mi0xOS4yLTEwLjMgMC0yMC4yIDItMjkuMiA1LjVMMTYzLjkgMjIuNkMxNDkuNCA4LjEgMTI5LjcgMCAxMDkuMyAwIDY2LjYgMCAzMiAzNC42IDMyIDc3LjNMMzIgMjU2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDAgNDhjMCAyOC40IDEyLjQgNTQgMzIgNzEuNkw2NCA0ODBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE2IDI1NiAwIDAgMTZjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTQwLjRjMTkuNi0xNy42IDMyLTQzLjEgMzItNzEuNmwwLTQ4YzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDk2IDI1NiA5NiA3Ny4zeiJdCiAgICB9OwogICAgZmFCYXRodHViID0gZmFCYXRoOwogICAgZmFDaGVzc0Jpc2hvcDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hlc3MtYmlzaG9wIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbOTgyMV0sICJmNDNhIiwgIk02NCAzODRMNDguMyAzNjguM0MxNy40IDMzNy40IDAgMjk1LjQgMCAyNTEuNyAwIDIxMy4xIDEzLjUgMTc1LjggMzguMiAxNDYuMUwxMDYuNyA2NCA5NiA2NEM3OC4zIDY0IDY0IDQ5LjcgNjQgMzJTNzguMyAwIDk2IDBMMjI0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTEwLjcgMCA0Ny42IDU3LjEtODUuOSA4NS45Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBsODIuMy04Mi4zYzE4LjcgMjcuMyAyOC43IDU5LjcgMjguNyA5MyAwIDQzLjctMTcuNCA4NS43LTQ4LjMgMTE2LjZMMjU2IDM4NCAzMTIuMiA0NTQuM2M1IDYuMyA3LjggMTQuMSA3LjggMjIuMiAwIDE5LjYtMTUuOSAzNS41LTM1LjUgMzUuNUwzNS41IDUxMmMtMTkuNiAwLTM1LjUtMTUuOS0zNS41LTM1LjUgMC04LjEgMi43LTE1LjkgNy44LTIyLjJMNjQgMzg0eiJdCiAgICB9OwogICAgZmFQcmVzY3JpcHRpb25Cb3R0bGVNZWRpY2FsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInByZXNjcmlwdGlvbi1ib3R0bGUtbWVkaWNhbCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJwcmVzY3JpcHRpb24tYm90dGxlLWFsdCJdLCAiZjQ4NiIsICJNMCAzMkMwIDE0LjMgMTQuMyAwIDMyIDBMMzUyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAzMmMwIDE3LjctMTQuMyAzMi0zMiAzMkwzMiA5NkMxNC4zIDk2IDAgODEuNyAwIDY0TDAgMzJ6TTMyIDE0NGwzMjAgMCAwIDMwNGMwIDM1LjMtMjguNyA2NC02NCA2NEw5NiA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMzA0ek0xNjAgMjQ4bDAgNDAtNDAgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDQwIDAgMCA0MGMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC00MCA0MCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtNDAgMCAwLTQwYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2eiJdCiAgICB9OwogICAgZmFQcmVzY3JpcHRpb25Cb3R0bGVBbHQgPSBmYVByZXNjcmlwdGlvbkJvdHRsZU1lZGljYWw7CiAgICBmYURyYXdQb2x5Z29uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRyYXctcG9seWdvbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzU4MDU1LCAidmVjdG9yLXBvbHlnb24iXSwgImY1ZWUiLCAiTTY0IDBjMjMuNyAwIDQ0LjQgMTIuOSA1NS40IDMybDI3My4xIDBjMTEuMS0xOS4xIDMxLjctMzIgNTUuNC0zMiAzNS4zIDAgNjQgMjguNyA2NCA2NCAwIDM0LTI2LjUgNjEuOC02MCA2My45bC0yLjEgMi45LTcxLjUgOTkuMWMzLjYgOCA1LjYgMTYuOSA1LjYgMjYuMnMtMiAxOC4yLTUuNiAyNi4ybDIuMiAzLjEgNjkuMyA5NiAyLjEgMi45YzMzLjUgMi4xIDYwIDI5LjkgNjAgNjMuOSAwIDM1LjMtMjguNyA2NC02NCA2NC0yMy43IDAtNDQuNC0xMi45LTU1LjQtMzJsLTI3My4xIDBjLTExLjEgMTkuMS0zMS43IDMyLTU1LjQgMzItMzUuMyAwLTY0LTI4LjctNjQtNjQgMC0yMy43IDEyLjktNDQuNCAzMi01NS40bDAtMjczLjFDMTIuOSAxMDguNCAwIDg3LjcgMCA2NCAwIDI4LjcgMjguNyAwIDY0IDB6TTM5NC4yIDQxMy40bC02NS41LTkwLjYtMi4yLTMuMWMtMi4xIC4yLTQuMyAuMy02LjUgLjMtMzUuMyAwLTY0LTI4LjctNjQtNjRzMjguNy02NCA2NC02NGMyLjIgMCA0LjQgLjEgNi41IC4zbDY3LjctOTMuN2MtLjYtLjktMS4xLTEuNy0xLjYtMi42TDExOS40IDk2Yy01LjYgOS43LTEzLjcgMTcuOC0yMy40IDIzLjRsMCAyNzMuMWM5LjcgNS42IDE3LjggMTMuNyAyMy40IDIzLjRsMjczLjEgMGMuNS0uOSAxLjEtMS44IDEuNi0yLjZ6Il0KICAgIH07CiAgICBmYVZlY3RvclBvbHlnb24gPSBmYURyYXdQb2x5Z29uOwogICAgZmFJQ3Vyc29yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImktY3Vyc29yIiwKICAgICAgaWNvbjogWzI1NiwgNTEyLCBbXSwgImYyNDYiLCAiTS4xIDI5LjNDLTEuNCA0NyAxMS43IDYyLjQgMjkuMyA2My45bDggLjdDNzAuNSA2Ny4zIDk2IDk1IDk2IDEyOC4zbDAgOTUuNy0zMiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDMyIDAgMCA5NS43YzAgMzMuMy0yNS41IDYxLTU4LjcgNjMuOGwtOCAuN0MxMS43IDQ0OS42LTEuNCA0NjUgLjEgNDgyLjdTMTcgNTEzLjQgMzQuNyA1MTEuOWw4LS43YzM0LjEtMi44IDY0LjItMTguOSA4NS40LTQyLjkgMjEuMiAyNCA1MS4yIDQwIDg1LjQgNDIuOWw4IC43YzE3LjYgMS41IDMzLjEtMTEuNiAzNC41LTI5LjJzLTExLjYtMzMuMS0yOS4yLTM0LjVsLTgtLjdDMTg1LjUgNDQ0LjcgMTYwIDQxNyAxNjAgMzgzLjdsMC05NS43IDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTMyIDAgMC05NS43YzAtMzMuMyAyNS41LTYxIDU4LjctNjMuOGw4LS43YzE3LjYtMS41IDMwLjctMTYuOSAyOS4yLTM0LjVTMjM5LTEuNCAyMjEuMyAuMWwtOCAuN2MtMzQuMSAyLjgtNjQuMiAxOC45LTg1LjQgNDIuOS0yMS4yLTI0LTUxLjItNDAtODUuNC00Mi45bC04LS43QzE3LTEuNCAxLjYgMTEuNyAuMSAyOS4zeiJdCiAgICB9OwogICAgZmFIZWFydENpcmNsZVBsdXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGVhcnQtY2lyY2xlLXBsdXMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUwMCIsICJNMjQxIDg3LjFsMTUgMjAuNyAxNS0yMC43QzI5NiA1Mi41IDMzNi4yIDMyIDM3OC45IDMyIDQ1Mi40IDMyIDUxMiA5MS42IDUxMiAxNjUuMWwwIDIuNmMwIDE3LjYtMy40IDM1LjYtOS41IDUzLjctMjEuOC04LjYtNDUuNi0xMy40LTcwLjUtMTMuNC0xMDYgMC0xOTIgODYtMTkyIDE5MiAwIDI4LjUgNi4yIDU1LjYgMTcuNCA4MC0uNSAwLS45IDAtMS40IDAtMTUuNSAwLTMwLjgtNC42LTQzLjEtMTQuMS03My01NS43LTIxMi45LTE4Ni0yMTIuOS0yOTguMmwwLTIuNkMwIDkxLjYgNTkuNiAzMiAxMzMuMSAzMiAxNzUuOCAzMiAyMTYgNTIuNSAyNDEgODcuMXpNNDMyIDI1NmExNDQgMTQ0IDAgMSAxIDAgMjg4IDE0NCAxNDQgMCAxIDEgMC0yODh6bTE2IDgwYzAtOC44LTcuMi0xNi0xNi0xNnMtMTYgNy4yLTE2IDE2bDAgNDgtNDggMGMtOC44IDAtMTYgNy4yLTE2IDE2czcuMiAxNiAxNiAxNmw0OCAwIDAgNDhjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTQ4IDQ4IDBjOC44IDAgMTYtNy4yIDE2LTE2cy03LjItMTYtMTYtMTZsLTQ4IDAgMC00OHoiXQogICAgfTsKICAgIGZhU2hpZWxkRG9nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNoaWVsZC1kb2ciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTU3MyIsICJNMjY5LjQgMi45QzI2NS4yIDEgMjYwLjcgMCAyNTYgMHMtOS4yIDEtMTMuNCAyLjlMNTQuMyA4Mi44Yy0yMiA5LjMtMzguNCAzMS0zOC4zIDU3LjIgLjUgOTkuMiA0MS4zIDI4MC43IDIxMy42IDM2My4yIDE2LjcgOCAzNi4xIDggNTIuOCAwIDE3Mi40LTgyLjUgMjEzLjItMjY0IDIxMy42LTM2My4yIC4xLTI2LjItMTYuMy00Ny45LTM4LjMtNTcuMkwyNjkuNCAyLjl6TTE2MC45IDI4Ni4yYzQuOCAxLjIgOS45IDEuOCAxNS4xIDEuOCAzNS4zIDAgNjQtMjguNyA2NC02NGwwLTY0IDQ0LjIgMGMxMi4xIDAgMjMuMiA2LjggMjguNiAxNy43bDcuMiAxNC4zIDY0IDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA0NC4yLTM1LjggODAtODAgODBsLTQ4IDAgMCA1MC43YzAgNy4zLTUuOSAxMy4zLTEzLjMgMTMuMy0xLjggMC0zLjYtLjQtNS4yLTEuMWwtOTguNy00Mi4zYy02LjYtMi44LTEwLjgtOS4zLTEwLjgtMTYuNCAwLTIuOCAuNi01LjUgMS45LThsMTUtMzB6TTE2MCAxNjBsNDggMCAwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNDhjMC04LjggNy4yLTE2IDE2LTE2em0xMjggNDhhMTYgMTYgMCAxIDAgLTMyIDAgMTYgMTYgMCAxIDAgMzIgMHoiXQogICAgfTsKICAgIGZhR3JlYXRlclRoYW5FcXVhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJncmVhdGVyLXRoYW4tZXF1YWwiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjUzMiIsICJNMjEuOSA5NC40QzUuMSA4OC44LTMuOSA3MC42IDEuNyA1My45UzI1LjQgMjguMSA0Mi4xIDMzLjZsMzg0IDEyOEM0MzkuMiAxNjYgNDQ4IDE3OC4yIDQ0OCAxOTJzLTguOCAyNi0yMS45IDMwLjRsLTM4NCAxMjhjLTE2LjggNS42LTM0LjktMy41LTQwLjUtMjAuMnMzLjUtMzQuOSAyMC4yLTQwLjVMMzE0LjggMTkyIDIxLjkgOTQuNHpNNDE2IDQxNmMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA0ODBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMzg0IDB6Il0KICAgIH07CiAgICBmYUVudmVsb3BlT3BlbjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZW52ZWxvcGUtb3BlbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYyMTM1XSwgImYyYjYiLCAiTTY0LjQgMTc1LjhMMjU2IDMzLjkgNDQ3LjYgMTc1LjggMjg5LjUgMjkzYy05LjcgNy4yLTIxLjQgMTEtMzMuNSAxMXMtMjMuOC0zLjktMzMuNS0xMUw2NC40IDE3NS44ek0yNTYtMzJjLTEyLjEgMC0yMy44IDMuOS0zMy41IDExTDI1LjkgMTI0LjdDOS42IDEzNi44IDAgMTU1LjggMCAxNzYuMUwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzODQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTIzOS45YzAtMjAuMy05LjYtMzkuNC0yNS45LTUxLjRMMjg5LjUtMjFjLTkuNy03LjItMjEuNC0xMS0zMy41LTExeiJdCiAgICB9OwogICAgZmFNb3VuZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb3VuZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTJkIiwgIk0xMTIuNCAxNzkuMkMxNDIgMTI3LjcgMTk2LjggOTYgMjU2LjIgOTZzMTE0LjIgMzEuNyAxNDMuOSA4My4yTDUwOC43IDM2OGMxMi4zIDIxLjMtMy4xIDQ4LTI3LjcgNDhMMzEuNSA0MTZjLTI0LjYgMC00MC0yNi42LTI3LjctNDhMMTEyLjQgMTc5LjJ6Il0KICAgIH07CiAgICBmYVZvaWNlbWFpbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ2b2ljZW1haWwiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjg5NyIsICJNMTQ0IDE2MGE4MCA4MCAwIDEgMSAwIDE2MCA4MCA4MCAwIDEgMSAwLTE2MHpNMjYzLjggMzIwYzE1LjMtMjIuOSAyNC4yLTUwLjQgMjQuMi04MCAwLTc5LjUtNjQuNS0xNDQtMTQ0LTE0NFMwIDE2MC41IDAgMjQwIDY0LjUgMzg0IDE0NCAzODRsMzUyIDBjNzkuNSAwIDE0NC02NC41IDE0NC0xNDRTNTc1LjUgOTYgNDk2IDk2IDM1MiAxNjAuNSAzNTIgMjQwYzAgMjkuNiA4LjkgNTcuMSAyNC4yIDgwbC0xMTIuNSAwek00OTYgMTYwYTgwIDgwIDAgMSAxIDAgMTYwIDgwIDgwIDAgMSAxIDAtMTYweiJdCiAgICB9OwogICAgZmFWZXN0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZlc3QiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTA4NSIsICJNMjAwIDQ2NGwwLTE3MC4xYzAtMy45LS41LTcuOC0xLjQtMTEuNkwxNDQuNCA2NS40QzE2Mi4xIDc3LjIgMTg4LjIgODggMjI0IDg4czYxLjktMTAuOCA3OS42LTIyLjZMMjQ5LjQgMjgyLjNjLTEgMy44LTEuNCA3LjctMS40IDExLjZMMjQ4IDQ2NGMwIDI2LjUgMjEuNSA0OCA0OCA0OGwxMDQgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTE5My41YzAtOS41LTIuOC0xOC43LTguMS0yNi42bC00Ny45LTcxLjhjLTUuMy03LjktOC4xLTE3LjEtOC4xLTI2LjZMMzg0IDQ4YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC0zLjUgMGMtLjMgMC0uNiAwLTEgMC0uNiAwLTEuMiAwLTEuOCAwLTE4LjggMC0zNC4xIDkuNy00NC4xIDE4LjgtOS4zIDguNC0yOC41IDIxLjItNjEuNyAyMS4ycy01Mi40LTEyLjgtNjEuNy0yMS4yYy0xMC05LjEtMjUuMy0xOC44LTQ0LjEtMTguOC0uNiAwLTEuMiAwLTEuOCAwLS4zIDAtLjYgMC0xIDBMMTEyIDBDODUuNSAwIDY0IDIxLjUgNjQgNDhsMCA5Ny41YzAgOS41LTIuOCAxOC43LTguMSAyNi42TDguMSAyNDMuOUMyLjggMjUxLjggMCAyNjEuMSAwIDI3MC41TDAgNDY0YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDEwNCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4eiJdCiAgICB9OwogICAgZmFBdWRpb0Rlc2NyaXB0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImF1ZGlvLWRlc2NyaXB0aW9uIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyOWUiLCAiTTAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjU2YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjh6bTk2IDk2bDAgMTA0YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0yNCA0OCAwIDAgMjRjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTEwNGMwLTM1LjMtMjguNy02NC02NC02NGwtMTYgMGMtMzUuMyAwLTY0IDI4LjctNjQgNjR6bTQ4IDMybDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDE2IDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzItNDggMHptMTUyLTk2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDE0NGMwIDEzLjMgMTAuNyAyNCAyNCAyNGw0OCAwYzM5LjggMCA3Mi0zMi4yIDcyLTcybDAtNDhjMC0zOS44LTMyLjItNzItNzItNzJsLTQ4IDB6bTQ4IDE0NGwtMjQgMCAwLTk2IDI0IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA0OGMwIDEzLjMtMTAuNyAyNC0yNCAyNHoiXQogICAgfTsKICAgIGZhVyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTE5XSwgIjU3IiwgIk0yMC44IDM0YzE2LjUtNi4yIDM1IDIuMiA0MS4yIDE4LjdMMTcyLjIgMzQ2LjcgMjU3LjMgNTVjNC0xMy43IDE2LjUtMjMgMzAuNy0yM3MyNi43IDkuNCAzMC43IDIzTDQwMy44IDM0Ni43IDUxNCA1Mi44YzYuMi0xNi41IDI0LjYtMjQuOSA0MS4yLTE4LjdTNTgwLjIgNTguNyA1NzQgNzUuMmwtMTQ0IDM4NGMtNC44IDEyLjktMTcuNCAyMS4zLTMxLjIgMjAuN3MtMjUuNy05LjgtMjkuNS0yM0wyODggMTc4LjMgMjA2LjcgNDU3Yy0zLjkgMTMuMi0xNS44IDIyLjUtMjkuNSAyM3MtMjYuMy03LjgtMzEuMi0yMC43TDIgNzUuMkMtNC4yIDU4LjcgNC4yIDQwLjIgMjAuOCAzNHoiXQogICAgfTsKICAgIGZhRXllRHJvcHBlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJleWUtZHJvcHBlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJleWUtZHJvcHBlci1lbXB0eSIsICJleWVkcm9wcGVyIl0sICJmMWZiIiwgIk0zNDEuNiAyOS4ybC0xMDEuNiAxMDEuNi05LjQtOS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2wxNjAgMTYwYzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTkuNC05LjQgMTAxLjYtMTAxLjZjMzktMzkgMzktMTAyLjIgMC0xNDEuMXMtMTAyLjItMzktMTQxLjEgMHpNNTUuNCAzMjMuM2MtMTUgMTUtMjMuNCAzNS40LTIzLjQgNTYuNmwwIDQyLjQtMjYuNiAzOS45Yy04LjUgMTIuNy02LjggMjkuNiA0IDQwLjRzMjcuNyAxMi41IDQwLjQgNGwzOS45LTI2LjYgNDIuNCAwYzIxLjIgMCA0MS42LTguNCA1Ni42LTIzLjRsMTA5LjQtMTA5LjQtNDUuMy00NS4zLTEwOS40IDEwOS40Yy0zIDMtNy4xIDQuNy0xMS4zIDQuN2wtMzYuMSAwIDAtMzYuMWMwLTQuMiAxLjctOC4zIDQuNy0xMS4zbDEwOS40LTEwOS40LTQ1LjMtNDUuMy0xMDkuNCAxMDkuNHoiXQogICAgfTsKICAgIGZhRXllRHJvcHBlckVtcHR5ID0gZmFFeWVEcm9wcGVyOwogICAgZmFFeWVkcm9wcGVyID0gZmFFeWVEcm9wcGVyOwogICAgZmFDaXJjbGVYbWFyazIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLXhtYXJrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjE1MzIsICJ0aW1lcy1jaXJjbGUiLCAieG1hcmstY2lyY2xlIl0sICJmMDU3IiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMTY3IDE2N2M5LjQtOS40IDI0LjYtOS40IDMzLjkgMGw1NSA1NSA1NS01NWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjlsLTU1IDU1IDU1IDU1YzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTU1LTU1LTU1IDU1Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45bDU1LTU1LTU1LTU1Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXoiXQogICAgfTsKICAgIGZhVGltZXNDaXJjbGUyID0gZmFDaXJjbGVYbWFyazI7CiAgICBmYVhtYXJrQ2lyY2xlMiA9IGZhQ2lyY2xlWG1hcmsyOwogICAgZmFUcmFpbGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRyYWlsZXIiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTA0MSIsICJNMzIgOTZjMC0zNS4zIDI4LjctNjQgNjQtNjRsMzg0IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyNTYgNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMjk2LjQgMGMuMiAyLjYgLjQgNS4zIC40IDggMCA0OC42LTM5LjQgODgtODggODhzLTg4LTM5LjQtODgtODhjMC0yLjcgLjEtNS40IC40LThMOTYgNDE2Yy0zNS4zIDAtNjQtMjguNy02NC02NEwzMiA5NnptNDA4IDE2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDE2MGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTYwYzAtMTMuMy0xMC43LTI0LTI0LTI0ek0xMTIgMTM2bDAgMTYwYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xNjBjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjR6bTE3Ni0yNGMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAxNjBjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTE2MGMwLTEzLjMtMTAuNy0yNC0yNC0yNHpNMjY0IDQyNGE0MCA0MCAwIDEgMCAtODAgMCA0MCA0MCAwIDEgMCA4MCAweiJdCiAgICB9OwogICAgZmFUdXJraXNoTGlyYVNpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHVya2lzaC1saXJhLXNpZ24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsidHJ5IiwgInR1cmtpc2gtbGlyYSJdLCAiZTJiYiIsICJNMTYwIDMyYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNDMuNiAxMjEuNC0zNC43YzEyLjctMy42IDI2IDMuNyAyOS43IDE2LjVzLTMuNyAyNi0xNi41IDI5LjdsLTEzNC42IDM4LjUgMCA0Ni4xIDEyMS40LTM0LjdjMTIuNy0zLjYgMjYgMy43IDI5LjcgMTYuNXMtMy43IDI2LTE2LjUgMjkuN2wtMTM0LjYgMzguNSAwIDE2Mi41IDcyIDBjNTMgMCA5Ni00MyA5Ni05NiAwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMyYzAgODguNC03MS42IDE2MC0xNjAgMTYwbC0xMDQgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0xNzYuMi0yNS40IDcuM2MtMTIuNyAzLjYtMjYtMy43LTI5LjctMTYuNXMzLjctMjYgMTYuNS0yOS43bDM4LjYtMTEgMC00Ni4xLTI1LjQgNy4zYy0xMi43IDMuNi0yNi0zLjctMjkuNy0xNi41czMuNy0yNiAxNi41LTI5LjdsMzguNi0xMSAwLTYxLjljMC0xNy43IDE0LjMtMzIgMzItMzJ6Il0KICAgIH07CiAgICBmYVRyeSA9IGZhVHVya2lzaExpcmFTaWduOwogICAgZmFUdXJraXNoTGlyYSA9IGZhVHVya2lzaExpcmFTaWduOwogICAgZmFWb2xjYW5vID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZvbGNhbm8iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjc3NTVdLCAiZjc3MCIsICJNMTYwIDE0NGMtMzUuMyAwLTY0LTI4LjctNjQtNjRzMjguNy02NCA2NC02NGMxNS43IDAgMzAgNS42IDQxLjIgMTUgMTEuMi0xOC42IDMxLjYtMzEgNTQuOC0zMXM0My42IDEyLjQgNTQuOCAzMWMxMS4xLTkuNCAyNS41LTE1IDQxLjItMTUgMzUuMyAwIDY0IDI4LjcgNjQgNjRzLTI4LjcgNjQtNjQgNjRjLTE0LjcgMC0yOC4zLTUtMzkuMS0xMy4zbC0zMiA0OEMyNzUuMyAxODcgMjY2IDE5MiAyNTYgMTkycy0xOS4zLTUtMjQuOS0xMy4zbC0zMi00OEMxODguMyAxMzkgMTc0LjcgMTQ0IDE2MCAxNDR6TTE0NCAzNTJsNDguNC0yNC4yYzEwLjItNS4xIDIxLjYtNy44IDMzLTcuOCAxOS42IDAgMzguNCA3LjggNTIuMiAyMS42bDMyLjUgMzIuNWM2LjMgNi4zIDE0LjkgOS45IDIzLjggOS45IDExLjMgMCAyMS44LTUuNiAyOC0xNWw5LjctMTQuNi01OS02Ni4zYy05LjEtMTAuMi0yMi4yLTE2LjEtMzUuOS0xNi4xbC00MS44IDBjLTEzLjcgMC0yNi44IDUuOS0zNS45IDE2LjFsLTU5LjkgNjcuNCA0LjctMy41em0xOS40LTk1LjhjMTguMi0yMC41IDQ0LjMtMzIuMiA3MS44LTMyLjJsNDEuOCAwYzI3LjQgMCA1My41IDExLjcgNzEuOCAzMi4ybDE1MC4yIDE2OWM4LjUgOS41IDEzLjIgMjEuOSAxMy4yIDM0LjcgMCAyOC44LTIzLjQgNTIuMi01Mi4yIDUyLjJMNTIuMiA1MTJDMjMuNCA1MTIgMCA0ODguNiAwIDQ1OS44IDAgNDQ3LjEgNC43IDQzNC43IDEzLjIgNDI1LjJsMTUwLjItMTY5eiJdCiAgICB9OwogICAgZmFXYW5kU3BhcmtsZXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid2FuZC1zcGFya2xlcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNzJiIiwgIk00NjQgNi4xYzkuNS04LjUgMjQtOC4xIDMzIC45bDggOGM5IDkgOS40IDIzLjUgLjkgMzNsLTg1LjggOTUuOWMtMi42IDIuOS00LjEgNi43LTQuMSAxMC43bDAgMjEuNGMwIDguOC03LjIgMTYtMTYgMTZsLTE1LjggMGMtNC42IDAtOC45IDEuOS0xMS45IDUuM0wxMDAuNyA1MDAuOWMtNi4zIDcuMS0xNS4zIDExLjEtMjQuOCAxMS4xLTguOCAwLTE3LjMtMy41LTIzLjUtOS44TDkuNyA0NTkuN2MtNi4yLTYuMi05LjctMTQuNy05LjctMjMuNSAwLTkuNSA0LTE4LjUgMTEuMS0yNC44bDExMS42LTk5LjhjMy40LTMgNS4zLTcuNCA1LjMtMTEuOWwwLTI3LjZjMC04LjggNy4yLTE2IDE2LTE2bDM0LjYgMGMzLjkgMCA3LjctMS41IDEwLjctNC4xTDQ2NCA2LjF6TTQzMiAyODhjMy42IDAgNi43IDIuNCA3LjcgNS44bDE0LjggNTEuNyA1MS43IDE0LjhjMy40IDEgNS44IDQuMSA1LjggNy43cy0yLjQgNi43LTUuOCA3LjdsLTUxLjcgMTQuOC0xNC44IDUxLjdjLTEgMy40LTQuMSA1LjgtNy43IDUuOHMtNi43LTIuNC03LjctNS44bC0xNC44LTUxLjctNTEuNy0xNC44Yy0zLjQtMS01LjgtNC4xLTUuOC03LjdzMi40LTYuNyA1LjgtNy43bDUxLjctMTQuOCAxNC44LTUxLjdjMS0zLjQgNC4xLTUuOCA3LjctNS44ek04Ny43IDY5LjhsMTQuOCA1MS43IDUxLjcgMTQuOGMzLjQgMSA1LjggNC4xIDUuOCA3LjdzLTIuNCA2LjctNS44IDcuN2wtNTEuNyAxNC44LTE0LjggNTEuN2MtMSAzLjQtNC4xIDUuOC03LjcgNS44cy02LjctMi40LTcuNy01LjhMNTcuNSAxNjYuNSA1LjggMTUxLjdjLTMuNC0xLTUuOC00LjEtNS44LTcuN3MyLjQtNi43IDUuOC03LjdsNTEuNy0xNC44IDE0LjgtNTEuN2MxLTMuNCA0LjEtNS44IDcuNy01LjhzNi43IDIuNCA3LjcgNS44ek0yMDggMGMzLjcgMCA2LjkgMi41IDcuOCA2LjFsNi44IDI3LjMgMjcuMyA2LjhjMy42IC45IDYuMSA0LjEgNi4xIDcuOHMtMi41IDYuOS02LjEgNy44bC0yNy4zIDYuOC02LjggMjcuM2MtLjkgMy42LTQuMSA2LjEtNy44IDYuMXMtNi45LTIuNS03LjgtNi4xbC02LjgtMjcuMy0yNy4zLTYuOGMtMy42LS45LTYuMS00LjEtNi4xLTcuOHMyLjUtNi45IDYuMS03LjhsMjcuMy02LjggNi44LTI3LjNjLjktMy42IDQuMS02LjEgNy44LTYuMXoiXQogICAgfTsKICAgIGZhTWljcm9waG9uZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtaWNyb3Bob25lIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYxMzAiLCAiTTE5MiAwQzEzOSAwIDk2IDQzIDk2IDk2bDAgMTI4YzAgNTMgNDMgOTYgOTYgOTZzOTYtNDMgOTYtOTZsMC0xMjhjMC01My00My05Ni05Ni05NnpNNDggMTg0YzAtMTMuMy0xMC43LTI0LTI0LTI0UzAgMTcwLjcgMCAxODRsMCA0MGMwIDk3LjkgNzMuMyAxNzguNyAxNjggMTkwLjVsMCA0OS41LTQ4IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTQ0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTQ4IDAgMC00OS41Yzk0LjctMTEuOCAxNjgtOTIuNiAxNjgtMTkwLjVsMC00MGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDQwYzAgNzkuNS02NC41IDE0NC0xNDQgMTQ0UzQ4IDMwMy41IDQ4IDIyNGwwLTQweiJdCiAgICB9OwogICAgZmFDcm93biA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjcm93biIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyODA4MV0sICJmNTIxIiwgIk0zMTMgODcuMmM5LjItNy4zIDE1LTE4LjYgMTUtMzEuMiAwLTIyLjEtMTcuOS00MC00MC00MHMtNDAgMTcuOS00MCA0MGMwIDEyLjYgNS45IDIzLjkgMTUgMzEuMkwxOTQuNiAxOTQuOGMtMTAgMTUuNy0zMS4zIDE5LjYtNDYuMiA4LjRMODguOSAxNTguN2M0LjUtNi40IDcuMS0xNC4zIDcuMS0yMi43IDAtMjIuMS0xNy45LTQwLTQwLTQwcy00MCAxNy45LTQwIDQwYzAgMjEuOCAxNy41IDM5LjYgMzkuMiA0MEw4Ny44IDM5My41YzQuNyAzMS4zIDMxLjYgNTQuNSA2My4zIDU0LjVsMjczLjggMGMzMS43IDAgNTguNi0yMy4yIDYzLjMtNTQuNUw1MjAuOCAxNzZjMjEuNy0uNCAzOS4yLTE4LjIgMzkuMi00MCAwLTIyLjEtMTcuOS00MC00MC00MHMtNDAgMTcuOS00MCA0MGMwIDguNCAyLjYgMTYuMyA3LjEgMjIuN2wtNTkuNCA0NC42Yy0xNC45IDExLjItMzYuMiA3LjMtNDYuMi04LjRMMzEzIDg3LjJ6Il0KICAgIH07CiAgICBmYVRlbnRBcnJvd1R1cm5MZWZ0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRlbnQtYXJyb3ctdHVybi1sZWZ0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1ODAiLCAiTS0uNSAxMTNsNzIgNzJjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC0zMS0zMSAzNTAuMSAwYzIyLjEgMCA0MCAxNy45IDQwIDQwbDAgMjRjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTI0YzAtNDguNi0zOS40LTg4LTg4LTg4bC0zNTAuMSAwIDMxLTMxYzkuNC05LjQgOS40LTI0LjYgMC0zMy45UzgwLjktMi4zIDcxLjUgN0wtLjUgNzljLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45ek02MC4zIDI5Mi42TDM3LjEgNDc2Yy0yLjQgMTkuMSAxMi41IDM2IDMxLjcgMzZsMTU0LjUgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTExNy40YzAtNS45IDQuNy0xMC42IDEwLjYtMTAuNiA0IDAgNy43IDIuMyA5LjUgNS45bDY4LjIgMTM2LjVjNS40IDEwLjggMTYuNSAxNy43IDI4LjYgMTcuN2w3MS45IDBjMTkuMyAwIDM0LjItMTYuOSAzMS43LTM2TDQ1Mi43IDI5Mi43Yy0xLjItOS43LTYuOS0xOC40LTE1LjMtMjMuNEwyNzEuOSAxNjkuOWMtMTAuMi02LjEtMjIuOS02LjEtMzMuMSAuMUw3NS40IDI2OS4zYy04LjMgNS4xLTEzLjkgMTMuNy0xNS4xIDIzLjN6Il0KICAgIH07CiAgICBmYVRydWNrRmFzdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cnVjay1mYXN0IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbInNoaXBwaW5nLWZhc3QiXSwgImY0OGIiLCAiTTY0IDk2YzAtMzUuMyAyOC43LTY0IDY0LTY0bDI4OCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIgNTAuNyAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDYyMS4zIDE5MmMxMiAxMiAxOC43IDI4LjMgMTguNyA0NS4zTDY0MCAzODRjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTMuMyAwYy0xMC40IDM2LjktNDQuNCA2NC04NC43IDY0cy03NC4yLTI3LjEtODQuNy02NGwtMTAyLjYgMGMtMTAuNCAzNi45LTQ0LjQgNjQtODQuNyA2NHMtNzQuMi0yNy4xLTg0LjctNjRsLTMuMyAwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTQ4LTQwIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMTEyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRMMjQgMjQwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDE3NiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0TDI0IDE0NGMtMTMuMyAwLTI0LTEwLjctMjQtMjRTMTAuNyA5NiAyNCA5Nmw0MCAwek01NzYgMjg4bDAtNTAuNy00NS4zLTQ1LjMtNTAuNyAwIDAgOTYgOTYgMHpNMjU2IDQyNGE0MCA0MCAwIDEgMCAtODAgMCA0MCA0MCAwIDEgMCA4MCAwem0yMzIgNDBhNDAgNDAgMCAxIDAgMC04MCA0MCA0MCAwIDEgMCAwIDgweiJdCiAgICB9OwogICAgZmFTaGlwcGluZ0Zhc3QgPSBmYVRydWNrRmFzdDsKICAgIGZhVXNlclBlbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1c2VyLXBlbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWyJ1c2VyLWVkaXQiXSwgImY0ZmYiLCAiTTI1Ni4xIDI0OGExMjAgMTIwIDAgMSAwIDAtMjQwIDEyMCAxMjAgMCAxIDAgMCAyNDB6bS0yOS43IDU2Yy05OC41IDAtMTc4LjMgNzkuOC0xNzguMyAxNzguMyAwIDE2LjQgMTMuMyAyOS43IDI5LjcgMjkuN2wxOTYuNSAwIDEwLjktNTQuNWM0LjMtMjEuNyAxNS00MS42IDMwLjYtNTcuMmw2Ny4zLTY3LjNjLTI4LTE4LjMtNjEuNC0yOC45LTk3LjQtMjguOWwtNTkuNCAwek0zMzIuMyA0NjYuOWwtMTEuOSA1OS42Yy0uMiAuOS0uMyAxLjktLjMgMi45IDAgOCA2LjUgMTQuNiAxNC42IDE0LjYgMSAwIDEuOS0uMSAyLjktLjNsNTkuNi0xMS45YzEyLjQtMi41IDIzLjgtOC42IDMyLjctMTcuNWwxMTguOS0xMTguOS04MC04MC0xMTguOSAxMTguOWMtOC45IDguOS0xNSAyMC4zLTE3LjUgMzIuN3ptMjY3LjgtMTIzYzIyLjEtMjIuMSAyMi4xLTU3LjkgMC04MHMtNTcuOS0yMi4xLTgwIDBsLTI4LjggMjguOCA4MCA4MCAyOC44LTI4Ljh6Il0KICAgIH07CiAgICBmYVVzZXJFZGl0ID0gZmFVc2VyUGVuOwogICAgZmFVc2VyQ2xvY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlci1jbG9jayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNGZkIiwgIk0yMjQgOGExMjAgMTIwIDAgMSAxIDAgMjQwIDEyMCAxMjAgMCAxIDEgMC0yNDB6TTE5NC4zIDMwNGw1OS40IDBjMy45IDAgNy45IC4xIDExLjggLjQtMTYuMiAyOC4yLTI1LjUgNjAuOC0yNS41IDk1LjYgMCA0MS44IDEzLjQgODAuNSAzNiAxMTJMNDUuNyA1MTJDMjkuMyA1MTIgMTYgNDk4LjcgMTYgNDgyLjMgMTYgMzgzLjggOTUuOCAzMDQgMTk0LjMgMzA0ek0yODggNDAwYTE0NCAxNDQgMCAxIDEgMjg4IDAgMTQ0IDE0NCAwIDEgMSAtMjg4IDB6bTE0NC04MGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgNjRjMCA4LjggNy4yIDE2IDE2IDE2bDQ4IDBjOC44IDAgMTYtNy4yIDE2LTE2cy03LjItMTYtMTYtMTZsLTMyIDAgMC00OGMwLTguOC03LjItMTYtMTYtMTZ6Il0KICAgIH07CiAgICBmYVNob3dlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaG93ZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg3MDNdLCAiZjJjYyIsICJNNjQgMTMxLjljMC0xOS44IDE2LjEtMzUuOSAzNS45LTM1LjkgOS41IDAgMTguNiAzLjggMjUuNCAxMC41bDE2LjIgMTYuMmMtMjEgMzguOS0xNy40IDg3LjUgMTAuOSAxMjNMMTUxIDI0N2MtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwTDM0NSAxMjFjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMGwtMS4zIDEuM2MtMzUuNS0yOC4zLTg0LjEtMzEuOS0xMjMtMTAuOUwxNzAuNSA2MS4zQzE1MS44IDQyLjUgMTI2LjQgMzIgOTkuOSAzMiA0NC43IDMyIDAgNzYuNyAwIDEzMS45TDAgNDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zMTYuMXpNMjU2IDM1MmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6bTY0IDY0YTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6bTAtMTI4YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHptNjQgNjRhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHptMC0xMjhhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0em02NCA2NGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem0zMi0zMmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6Il0KICAgIH07CiAgICBmYVNxdWFyZUNhcmV0VXAyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1jYXJldC11cCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJjYXJldC1zcXVhcmUtdXAiXSwgImYxNTEiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6TTIyNCAxNjBjNi43IDAgMTMgMi44IDE3LjYgNy43bDEwNCAxMTJjNi41IDcgOC4yIDE3LjIgNC40IDI1LjlTMzM3LjUgMzIwIDMyOCAzMjBsLTIwOCAwYy05LjUgMC0xOC4yLTUuNy0yMi0xNC40cy0yLjEtMTguOSA0LjQtMjUuOWwxMDQtMTEyYzQuNS00LjkgMTAuOS03LjcgMTcuNi03Ljd6Il0KICAgIH07CiAgICBmYUNhcmV0U3F1YXJlVXAyID0gZmFTcXVhcmVDYXJldFVwMjsKICAgIGZhTWFwTG9jYXRpb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFwLWxvY2F0aW9uIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbIm1hcC1tYXJrZWQiXSwgImY1OWYiLCAiTTU3NiA0OGMwLTExLjEtNS43LTIxLjQtMTUuMi0yNy4ycy0yMS4yLTYuNC0zMS4xLTEuNEw0MTMuNSA3Ny41IDIzNC4xIDE3LjZjLTguMS0yLjctMTYuOC0yLjEtMjQuNCAxLjdsLTEyOCA2NEM3MC44IDg4LjggNjQgOTkuOSA2NCAxMTJsMCAzNTJjMCAxMS4xIDUuNyAyMS40IDE1LjIgMjcuMnMyMS4yIDYuNCAzMS4xIDEuNGwxMTYuMS01OC4xIDE3My4zIDU3LjhjLTQuMy02LjQtOC41LTEzLjEtMTIuNi0xOS45LTExLTE4LjMtMjEuOS0zOS4zLTMwLTYxLjhsLTEwMS4yLTMzLjcgMC0yODQuNSAxMjggNDIuNyAwIDk5LjNjMzEtMzUuOCA3Ny01OC40IDEyOC01OC40IDIyLjYgMCA0NC4yIDQuNCA2NCAxMi41TDU3NiA0OHpNMzkyIDM0MS45YzAgNjguOSA2NC4xIDE1MC40IDk4LjYgMTg5LjMgMTEuNiAxMyAzMS4zIDEzIDQyLjkgMCAzNC41LTM4LjkgOTguNi0xMjAuNCA5OC42LTE4OS4zIDAtNjUuMS01My43LTExNy45LTEyMC0xMTcuOVMzOTIgMjc2LjggMzkyIDM0MS45eiJdCiAgICB9OwogICAgZmFNYXBNYXJrZWQgPSBmYU1hcExvY2F0aW9uOwogICAgZmFQZW5GYW5jeSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZW4tZmFuY3kiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgzOTUsIDEwMDAyXSwgImY1YWMiLCAiTTM3My41IDI3LjFjMTUtMTcuMiAzNi43LTI3LjEgNTkuNi0yNy4xIDQzLjYgMCA3OSAzNS40IDc5IDc5IDAgMjIuOC05LjkgNDQuNi0yNy4xIDU5LjZMMjgzLjcgMzEzLjggMjczIDMwMyAyMDkgMjM5IDE5OC4yIDIyOC4zIDM3My41IDI3LjF6TTE2MS4xIDI1OUMxNjIgMjYwIDE4OCAyODYgMjM5IDMzN2wxMy45IDEzLjktMTcuMSA3NC4yYy0zLjkgMTcuMS0xNi45IDMwLjctMzMuOCAzNS40bC0xNjkuOCA0Ny41IDkyLjMtOTIuM2MxLjIgLjEgMi4zIC4yIDMuNSAuMiAxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMi0zMiAxNC4zLTMyIDMyYzAgMS4yIC4xIDIuNCAuMiAzLjVMMy45IDQ3OS44IDUxLjUgMzEwYzQuNy0xNi45IDE4LjMtMjkuOSAzNS40LTMzLjhMMTYxLjEgMjU5eiJdCiAgICB9OwogICAgZmFFdXJvU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJldXJvLXNpZ24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs4MzY0LCAiZXVyIiwgImV1cm8iXSwgImYxNTMiLCAiTTczLjMgMTkyQzEwMC44IDk5LjUgMTg2LjUgMzIgMjg4IDMybDY0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTY0IDBjLTY1LjYgMC0xMjIgMzkuNS0xNDYuNyA5NkwyNzIgMTkyYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNDMuMiAwYy0uNSA1LjMtLjggMTAuNi0uOCAxNnMuMyAxMC43IC44IDE2TDI3MiAyNzJjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTEzMC43IDBjMjQuNyA1Ni41IDgxLjEgOTYgMTQ2LjcgOTZsNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtNjQgMGMtMTAxLjUgMC0xODcuMi02Ny41LTIxNC43LTE2MEw0MCAzMjBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMjQuNiAwYy0uNy0xMC41LS43LTIxLjUgMC0zMkw0MCAyNDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMzMuMyAweiJdCiAgICB9OwogICAgZmFFdXIgPSBmYUV1cm9TaWduOwogICAgZmFFdXJvID0gZmFFdXJvU2lnbjsKICAgIGZhSG91c2VDaXJjbGVYbWFyayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VzZS1jaXJjbGUteG1hcmsiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTUwYiIsICJNNDk2IDU0NGExNDQgMTQ0IDAgMSAxIDAtMjg4IDE0NCAxNDQgMCAxIDEgMCAyODh6TTI2OC42IDYuNWMxMi4yLTkuMyAyOS43LTguNyA0MS4yIDJsMjE3LjYgMjAyYy0xMC4yLTEuNy0yMC43LTIuNi0zMS4zLTIuNi03OC42IDAtMTQ2LjIgNDcuMi0xNzUuOSAxMTQuOC01LTEuOC0xMC41LTIuOC0xNi4xLTIuOGwtMzIgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCA5NiA5MC45IDBjNi4xIDE3LjMgMTQuNiAzMy40IDI1LjIgNDhMMTQ0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0xNzYtMTYgMGMtMTMuMiAwLTI1LTguMS0yOS44LTIwLjNzLTEuNi0yNi4yIDgtMzUuMWwyMjQtMjA4IDIuNC0yek01NTUuMyAzNDAuN2MtNi4yLTYuMi0xNi40LTYuMi0yMi42IDBsLTM2LjcgMzYuNy0zNi43LTM2LjdjLTYuMi02LjItMTYuNC02LjItMjIuNiAwcy02LjIgMTYuNCAwIDIyLjZsMzYuNyAzNi43LTM2LjcgMzYuN2MtNi4yIDYuMi02LjIgMTYuNCAwIDIyLjZzMTYuNCA2LjIgMjIuNiAwbDM2LjctMzYuNyAzNi43IDM2LjdjNi4yIDYuMiAxNi40IDYuMiAyMi42IDBzNi4yLTE2LjQgMC0yMi42bC0zNi43LTM2LjcgMzYuNy0zNi43YzYuMi02LjIgNi4yLTE2LjQgMC0yMi42eiJdCiAgICB9OwogICAgZmFMaXJhU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsaXJhLXNpZ24iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFs4MzU2XSwgImYxOTUiLCAiTTg0LjkgMjU2bC0yOC40IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMTEuNiAwQzUzLjIgMTI0LjcgMTE2LjggNDIgMjA3LjYgNDJsOC4yIDBjMzMuNiAwIDY2LjIgMTEuMyA5Mi41IDMyLjJsMTYuMSAxMi43YzEzLjkgMTEgMTYuMiAzMS4xIDUuMiA0NXMtMzEuMSAxNi4yLTQ1IDUuMmwtMTYuMS0xMi43Yy0xNS0xMS45LTMzLjYtMTguNC01Mi44LTE4LjRsLTguMiAwYy01My44IDAtOTAuMSA1Mi45LTczLjUgMTAybDE2Mi40IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE0NS4xIDBjMi4zIDEwLjYgMy42IDIxLjMgMy45IDMybDE0MS4yIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRMMTUwIDMzNmMtNC44IDE4LjYtMTIuNiAzNi41LTIzLjYgNTIuOWwtMTguMSAyNy4xIDIxMi4yIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTI3MiAwYy0xMS44IDAtMjIuNi02LjUtMjguMi0xNi45cy01LTIzIDEuNi0zMi45bDUxLjItNzYuOGMzLjctNS42IDYuOS0xMS40IDkuNC0xNy40bC0yNiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDM0LjggMGMtLjUtMTAuOC0yLjYtMjEuNi02LjQtMzJ6Il0KICAgIH07CiAgICBmYVllblNpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAieWVuLXNpZ24iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxNjUsICJjbnkiLCAianB5IiwgInJtYiIsICJ5ZW4iXSwgImYxNTciLCAiTTc0LjkgNDYuN2MtOS42LTE0LjktMjkuNC0xOS4yLTQ0LjItOS42UzExLjUgNjYuNCAyMS4xIDgxLjNMMTQzLjcgMjcyIDg4IDI3MmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw3MiAwIDAgMzItNzIgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw3MiAwIDAgNDhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTQ4IDcyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTcyIDAgMC0zMiA3MiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC01NS43IDAgMTIyLjYtMTkwLjdjOS42LTE0LjkgNS4zLTM0LjctOS42LTQ0LjJzLTM0LjctNS4zLTQ0LjIgOS42TDE5MiAyMjguOCA3NC45IDQ2Ljd6Il0KICAgIH07CiAgICBmYUNueSA9IGZhWWVuU2lnbjsKICAgIGZhSnB5ID0gZmFZZW5TaWduOwogICAgZmFSbWIgPSBmYVllblNpZ247CiAgICBmYVllbiA9IGZhWWVuU2lnbjsKICAgIGZhQm94T3BlbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib3gtb3BlbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNDllIiwgIk01NjAuMyAyMzcuMmMxMC40IDExLjggMjguMyAxNC40IDQxLjggNS41IDE0LjctOS44IDE4LjctMjkuNyA4LjktNDQuNGwtNDgtNzJjLTIuOC00LjItNi42LTcuNy0xMS4xLTEwLjJMMzUxLjQgNC43Yy0xOS4zLTEwLjctNDIuOC0xMC43LTYyLjIgMEw4OC44IDExNmMtNS40IDMtOS43IDcuNC0xMi42IDEyLjhMMjcuNyAyMTguN2MtMTIuNiAyMy40LTMuOCA1Mi41IDE5LjYgNjUuMWwzMyAxNy43IDAgNTMuM2MwIDIzIDEyLjQgNDQuMyAzMi40IDU1LjdsMTc2IDk5LjdjMTkuNiAxMS4xIDQzLjUgMTEuMSA2My4xIDBsMTc2LTk5LjdjMjAuMS0xMS40IDMyLjQtMzIuNiAzMi40LTU1LjdsMC0xMTcuNXptLTI0MC05LjhMMTcwLjIgMTQ0IDMyMC4zIDYwLjYgNDcwLjQgMTQ0IDMyMC4zIDIyNy40em0tNDEuNSA1MC4ybC0yMS4zIDQ2LjItMTY1LjgtODguOCAyNS40LTQ3LjIgMTYxLjcgODkuOHoiXQogICAgfTsKICAgIGZhVHJ1Y2tGaWVsZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cnVjay1maWVsZCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNThkIiwgIk0zMiA5NmMwLTM1LjMgMjguNy02NCA2NC02NGwyMjQgMGMyMy43IDAgNDQuNCAxMi45IDU1LjQgMzJsNDAuNCAwYzMyLjQgMCA2MS42IDE5LjYgNzQgNDkuNWw0My44IDEwNi4zIDEuNyA0LjIgMjQuNyAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgNjRjMCAyNi41LTIxLjUgNDgtNDggNDhsLS40IDBjLjIgMi42IC40IDUuMyAuNCA4IDAgNDguNi0zOS40IDg4LTg4IDg4cy04OC0zOS40LTg4LTg4YzAtMi43IC4xLTUuNCAuNC04bC0xNDQuNyAwYy4yIDIuNiAuNCA1LjMgLjQgOCAwIDQ4LjYtMzkuNCA4OC04OCA4OHMtODgtMzkuNC04OC04OGMwLTMuNiAuMi03LjEgLjYtMTAuNS0xOS02LjQtMzIuNi0yNC40LTMyLjYtNDUuNWwwLTQ4Yy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTk2YzAtMTcuNyAxNC4zLTMyIDMyLTMybDAtMzJ6bTM1MiAzMmwwIDk2IDgyLjEgMC0zNS40LTg2LjFjLTIuNS02LTguMy05LjktMTQuOC05LjlMMzg0IDEyOHpNMTkyIDM5MmE0MCA0MCAwIDEgMCAtODAgMCA0MCA0MCAwIDEgMCA4MCAwem0yODAgNDBhNDAgNDAgMCAxIDAgMC04MCA0MCA0MCAwIDEgMCAwIDgweiJdCiAgICB9OwogICAgZmFMb2NhdGlvblBpbkxvY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibG9jYXRpb24tcGluLWxvY2siLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTUxZiIsICJNMCAxODguNkMwIDg0LjQgODYgMCAxOTIgMCAyOTQuMSAwIDM3Ny42IDc4LjMgMzgzLjYgMTc3IDMyMC43IDE4NS4xIDI3MiAyMzguOCAyNzIgMzA0bDAgMjQuNGMtMTkuNiAxNy42LTMyIDQzLjEtMzIgNzEuNWwwIDc1LjdjLTkuOSAxMS42LTE4LjkgMjEuNy0yNi40IDI5LjgtMTEuOCAxMi44LTMxLjUgMTIuOC00My4zIDAtNTAuMi01NC41LTE3MC40LTE5Ny41LTE3MC40LTMxNi44ek0xOTIgMjU2YTY0IDY0IDAgMSAwIDAtMTI4IDY0IDY0IDAgMSAwIDAgMTI4em0yNDAgNDguMWMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDQ3LjkgNjQgMCAwLTQ3Ljl6TTI4OCA0MDBjMC0yMC45IDEzLjQtMzguNyAzMi00NS4zbDAtNTAuNmMwLTQ0LjIgMzUuOC04MCA4MC04MHM4MCAzNS44IDgwIDgwbDAgNTAuNmMxOC42IDYuNiAzMiAyNC40IDMyIDQ1LjNsMCA5NmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTI4IDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtOTZ6Il0KICAgIH07CiAgICBmYVBlcnNvblByYXlpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLXByYXlpbmciLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjg3MjAsICJwcmF5Il0sICJmNjgzIiwgIk0zMjAgNjRhNjQgNjQgMCAxIDAgLTEyOCAwIDY0IDY0IDAgMSAwIDEyOCAwek0yMDAuNyAyNjRsMjIuOSAzMS41YzYuNSA4LjkgMTYuMyAxNC43IDI3LjIgMTYuMXMyMS45LTEuNyAzMC40LTguN2w4OC03MmMxNy4xLTE0IDE5LjYtMzkuMiA1LjYtNTYuM3MtMzkuMi0xOS42LTU2LjMtNS42bC01NS4yIDQ1LjItMjYuMi0zNmMtMTUuNi0yMS41LTQwLjYtMzQuMi02Ny4yLTM0LjItMzAuOSAwLTU5LjIgMTcuMS03My42IDQ0LjRMNDcuOCAyODAuOWMtMjAuMiAzOC41LTkuNCA4NS45IDI1LjYgMTExLjhMMTI2LjYgNDMyIDQwIDQzMmMtMjIuMSAwLTQwIDE3LjktNDAgNDBzMTcuOSA0MCA0MCA0MGwyMDggMGMxNy4zIDAgMzIuNi0xMS4xIDM4LTI3LjVzLS4zLTM0LjQtMTQuMi00NC43bC0xMTYuMS04NS44IDQ1LTkweiJdCiAgICB9OwogICAgZmFQcmF5ID0gZmFQZXJzb25QcmF5aW5nOwogICAgZmFDbGlwYm9hcmRMaXN0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNsaXBib2FyZC1saXN0IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY0NmQiLCAiTTMxMS40IDMybDguNiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzUyYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmw4LjYgMEM4My42IDEyLjkgMTA0LjMgMCAxMjggMEwyNTYgMGMyMy43IDAgNDQuNCAxMi45IDU1LjQgMzJ6TTI0OCAxMTJjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRMMTM2IDY0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDExMiAwek0xMjggMjU2YTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6bTMyIDBjMCAxMy4zIDEwLjcgMjQgMjQgMjRsMTEyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTExMiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHptMCAxMjhjMCAxMy4zIDEwLjcgMjQgMjQgMjRsMTEyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTExMiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHpNOTYgNDE2YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHoiXQogICAgfTsKICAgIGZhU2Fja0RvbGxhciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzYWNrLWRvbGxhciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODE3Nl0sICJmODFkIiwgIk0zMjggMTEybC0xNDQgMC0zNy4zLTc0LjVjLTEuOC0zLjYtMi43LTcuNi0yLjctMTEuNiAwLTE0LjMgMTEuNi0yNS45IDI1LjktMjUuOUwzNDIuMSAwYzE0LjMgMCAyNS45IDExLjYgMjUuOSAyNS45IDAgNC0uOSA4LTIuNyAxMS42TDMyOCAxMTJ6TTE2OS42IDE2MGwxNzIuOCAwIDQ4LjcgNDAuNkM0NTcuNiAyNTYgNDk2IDMzOCA0OTYgNDI0LjUgNDk2IDQ3Mi44IDQ1Ni44IDUxMiA0MDguNSA1MTJsLTMwNS4xIDBDNTUuMiA1MTIgMTYgNDcyLjggMTYgNDI0LjUgMTYgMzM4IDU0LjQgMjU2IDEyMC45IDIwMC42TDE2OS42IDE2MHpNMjYwIDIyNGMtMTEgMC0yMCA5LTIwIDIwbDAgNGMtMjguOCAuMy01MiAyMy43LTUyIDUyLjUgMCAyNS43IDE4LjUgNDcuNiA0My45IDUxLjhsNDEuNyA3YzYgMSAxMC40IDYuMiAxMC40IDEyLjMgMCA2LjktNS42IDEyLjUtMTIuNSAxMi41TDIxNiAzODRjLTExIDAtMjAgOS0yMCAyMHM5IDIwIDIwIDIwbDI0IDAgMCA0YzAgMTEgOSAyMCAyMCAyMHMyMC05IDIwLTIwbDAtNC43YzI1LTQuMSA0NC0yNS43IDQ0LTUxLjggMC0yNS43LTE4LjUtNDcuNi00My45LTUxLjhsLTQxLjctN2MtNi0xLTEwLjQtNi4yLTEwLjQtMTIuMyAwLTYuOSA1LjYtMTIuNSAxMi41LTEyLjVsNDcuNSAwYzExIDAgMjAtOSAyMC0yMHMtOS0yMC0yMC0yMGwtOCAwIDAtNGMwLTExLTktMjAtMjAtMjB6Il0KICAgIH07CiAgICBmYU1vdW50YWluU3VuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vdW50YWluLXN1biIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTJmIiwgIk0yNTYuNSAwYzE0LjcgMCAyOC4yIDguMSAzNS4yIDIxbDIxNiA0MDBjNi43IDEyLjQgNi40IDI3LjQtLjggMzkuNS03LjIgMTIuMS0yMC4zIDE5LjUtMzQuMyAxOS41bC00MzIgMGMtMTQuMSAwLTI3LjEtNy40LTM0LjMtMTkuNXMtNy41LTI3LjEtLjgtMzkuNWwyMTYtNDAwIDIuOS00LjZDMjMxLjcgNi4yIDI0My42IDAgMjU2LjUgMHpNMTcwLjQgMjQ5LjlsMjYuOCAyNi44YzYuMiA2LjIgMTYuNCA2LjIgMjIuNiAwbDQzLjMtNDMuM2M2LTYgMTQuMS05LjQgMjIuNi05LjRsNDIuOCAwLTcyLjEtMTMzLjUtODYuMSAxNTkuNHpNNDk2LjUgMTYwYTgwIDgwIDAgMSAxIDAtMTYwIDgwIDgwIDAgMSAxIDAgMTYweiJdCiAgICB9OwogICAgZmFBcnJvd1VwV2lkZVNob3J0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXVwLXdpZGUtc2hvcnQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsic29ydC1hbW91bnQtdXAiXSwgImYxNjEiLCAiTTE1MC42IDQxLjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwbC05NiA5NmMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMEw5NiAxNDEuMyA5NiA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTMwNi43IDQxLjQgNDEuNGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zbC05Ni05NnpNMzIwIDQ4MGwzMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0zMiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMyem0wLTEyOGw5NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC05NiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMyem0wLTEyOGwxNjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTYwIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJ6bTAtMTI4bDIyNCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDMyMCAzMmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMnoiXQogICAgfTsKICAgIGZhU29ydEFtb3VudFVwID0gZmFBcnJvd1VwV2lkZVNob3J0OwogICAgZmFVc2Vyc0xpbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlcnMtbGluZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTkyIiwgIk0yMjQgMTI4YTY0IDY0IDAgMSAxIDEyOCAwIDY0IDY0IDAgMSAxIC0xMjggMHpNMTc2IDMzNmMwLTYxLjkgNTAuMS0xMTIgMTEyLTExMnMxMTIgNTAuMSAxMTIgMTEybDAgOGMwIDEzLjMtMTAuNyAyNC0yNCAyNGwtMTc2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtOHpNMzkyIDE0NGE1NiA1NiAwIDEgMSAxMTIgMCA1NiA1NiAwIDEgMSAtMTEyIDB6bTI3LjIgMTAwLjRjOS4xLTIuOSAxOC44LTQuNCAyOC44LTQuNCA1MyAwIDk2IDQzIDk2IDk2bDAgMTAuN2MwIDExLjgtOS42IDIxLjMtMjEuMyAyMS4zbC03OC44IDBjMi43LTcuNSA0LjEtMTUuNiA0LjEtMjRsMC04YzAtMzQuMS0xMC42LTY1LjctMjguOC05MS42em0tMjYyLjQgMGMtMTguMiAyNi0yOC44IDU3LjUtMjguOCA5MS42bDAgOGMwIDguNCAxLjQgMTYuNSA0LjEgMjRsLTc4LjggMEM0MS42IDM2OCAzMiAzNTguNCAzMiAzNDYuN0wzMiAzMzZjMC01MyA0My05NiA5Ni05NiAxMCAwIDE5LjcgMS41IDI4LjggNC40ek03MiAxNDRhNTYgNTYgMCAxIDEgMTEyIDAgNTYgNTYgMCAxIDEgLTExMiAwek0wIDQ0MGMwLTEzLjMgMTAuNy0yNCAyNC0yNGw1MjggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNEwyNCA0NjRjLTEzLjMgMC0yNC0xMC43LTI0LTI0eiJdCiAgICB9OwogICAgZmFTdGFyT2ZEYXZpZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzdGFyLW9mLWRhdmlkIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTAwMTddLCAiZjY5YSIsICJNNDE1LjkgMzExLjlsLTI3LjggNDguMSA1NS43IDAtMjcuOC00OC4xek0zODMuNiAyNTZsLTYwLjItMTA0LTEzNC44IDAtNjAuMiAxMDQgNjAuMiAxMDQgMTM0LjggMCA2MC4yLTEwNHptNjQuNyAwbDU4LjQgMTAwLjljMy41IDYgNS4zIDEyLjggNS4zIDE5LjcgMCAyMS43LTE3LjYgMzkuNC0zOS40IDM5LjRsLTExNyAwLTYxLjMgMTA1LjhDMjg2LjUgNTM1LjYgMjcxLjggNTQ0IDI1NiA1NDRzLTMwLjUtOC40LTM4LjQtMjIuMmwtNjEuMy0xMDUuOC0xMTcgMGMtMjEuNyAwLTM5LjQtMTcuNi0zOS40LTM5LjQgMC02LjkgMS44LTEzLjcgNS4zLTE5LjdMNjMuNyAyNTYgNS4zIDE1NS4xQzEuOCAxNDkuMSAwIDE0Mi4zIDAgMTM1LjQgMCAxMTMuNiAxNy42IDk2IDM5LjQgOTZsMTE3IDAgNjEuMy0xMDUuOEMyMjUuNS0yMy42IDI0MC4yLTMyIDI1Ni0zMnMzMC41IDguNCAzOC40IDIyLjJsNjEuMyAxMDUuOCAxMTcgMGMyMS43IDAgMzkuNCAxNy42IDM5LjQgMzkuNCAwIDYuOS0xLjggMTMuNy01LjMgMTkuN0w0NDguMyAyNTZ6TTM4OC4xIDE1MmwyNy44IDQ4LjEgMjcuOC00OC4xLTU1LjcgMHpNMjkxIDk2bC0zNS02MC40LTM1IDYwLjQgNzAgMHpNMTIzLjkgMTUybC01NS43IDAgMjcuOCA0OC4xIDI3LjgtNDguMXpNOTYuMSAzMTEuOWwtMjcuOCA0OC4xIDU1LjcgMC0yNy44LTQ4LjF6TTIyMSA0MTZsMzUgNjAuNCAzNS02MC40LTcwIDB6Il0KICAgIH07CiAgICBmYU5vdGVzTWVkaWNhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJub3Rlcy1tZWRpY2FsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0ODEiLCAiTTk2IDM1MmMwIDM1LjMgMjguNyA2NCA2NCA2NGwxODEuNSAwYzE3IDAgMzMuMy02LjcgNDUuMy0xOC43TDQ5My4zIDI5MC43YzEyLTEyIDE4LjctMjguMyAxOC43LTQ1LjNMNTEyIDY0YzAtMzUuMy0yOC43LTY0LTY0LTY0TDE2MCAwQzEyNC43IDAgOTYgMjguNyA5NiA2NGwwIDI4OHpNMjg4IDExMmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDQ4IDQ4IDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC00OCAwIDAgNDhjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC00OC00OCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsNDggMCAwLTQ4YzAtOC44IDcuMi0xNiAxNi0xNnpNNDggMTIwYzAtMTMuMy0xMC43LTI0LTI0LTI0UzAgMTA2LjcgMCAxMjBMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjY0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRMNjQgNDY0Yy04LjggMC0xNi03LjItMTYtMTZsMC0zMjh6Il0KICAgIH07CiAgICBmYUF1c3RyYWxTaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImF1c3RyYWwtc2lnbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlMGE5IiwgIk0yNjYuNSAyNDBsLTg1IDAgNDIuNS0xMDYuNCA0Mi41IDEwNi40em02OC45IDBMMjYyLjkgNTguM0MyNTYuNSA0Mi40IDI0MS4xIDMyIDIyNCAzMnMtMzIuNSAxMC40LTM4LjkgMjYuM0wxMTIuNiAyNDAgMzIgMjQwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDYxLjQgMC0xOS4yIDQ4LTQyLjMgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwyMy4xIDAtMjAuOCA1Mi4xYy02LjYgMTYuNCAxLjQgMzUgMTcuOSA0MS42czM1LTEuNCA0MS42LTE3LjlsMzAuMy03NS45IDIwMCAwIDMwLjMgNzUuOWM2LjYgMTYuNCAyNS4yIDI0LjQgNDEuNiAxNy45czI0LjQtMjUuMiAxNy45LTQxLjZMMzkyLjkgMzg0IDQxNiAzODRjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTQyLjMgMC0xOS4yLTQ4IDYxLjQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtODAuNiAwem0tNDkuNyA0OGwxOS4yIDQ4LTE2MS42IDAgMTkuMi00OCAxMjMuMyAweiJdCiAgICB9OwogICAgZmFDbGlwYm9hcmRVc2VyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNsaXBib2FyZC11c2VyIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY3ZjMiLCAiTTMxMS40IDMybDguNiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzUyYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmw4LjYgMEM4My42IDEyLjkgMTA0LjMgMCAxMjggMEwyNTYgMGMyMy43IDAgNDQuNCAxMi45IDU1LjQgMzJ6TTI0OCAxMTJjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRMMTM2IDY0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDExMiAwek0xOTIgMzQ0YTU2IDU2IDAgMSAwIDAtMTEyIDU2IDU2IDAgMSAwIDAgMTEyek05OC4zIDQxM2MtMTIuOSAxNS42IDIuMiAzNSAyMi40IDM1bDE0Mi41IDBjMjAuMiAwIDM1LjMtMTkuNCAyMi40LTM1LTE0LjctMTcuNy0zNi45LTI5LTYxLjctMjlsLTY0IDBjLTI0LjggMC00NyAxMS4zLTYxLjcgMjl6Il0KICAgIH07CiAgICBmYUZpbGVJbWFnZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1pbWFnZSIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyODQ0M10sICJmMWM1IiwgIk0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwyMTMuNSAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDM2NS4zIDEyNS4zYzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNMMzg0IDQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6bTIwOC01LjVsMCA5My41YzAgMTMuMyAxMC43IDI0IDI0IDI0TDMyNS41IDE3NiAyMDggNTguNXpNMTI4IDI1NmEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwek05Mi42IDQ0OGwxOTguOCAwYzE1LjggMCAyOC42LTEyLjggMjguNi0yOC42IDAtNy4zLTIuOC0xNC40LTcuOS0xOS43TDIxNS4zIDI5Ny45Yy02LTYuMy0xNC40LTkuOS0yMy4yLTkuOWwtLjMgMGMtOC44IDAtMTcuMSAzLjYtMjMuMiA5LjlMNzEuOSAzOTkuN0M2Ni44IDQwNSA2NCA0MTIuMSA2NCA0MTkuNCA2NCA0MzUuMiA3Ni44IDQ0OCA5Mi42IDQ0OHoiXQogICAgfTsKICAgIGZhU3F1YXJlQ2FyZXRSaWdodDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLWNhcmV0LXJpZ2h0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImNhcmV0LXNxdWFyZS1yaWdodCJdLCAiZjE1MiIsICJNNDQ4IDk2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjB6TTMyMCAyNTZjMCA2LjctMi44IDEzLTcuNyAxNy42bC0xMTIgMTA0Yy03IDYuNS0xNy4yIDguMi0yNS45IDQuNFMxNjAgMzY5LjUgMTYwIDM2MGwwLTIwOGMwLTkuNSA1LjctMTguMiAxNC40LTIyczE4LjktMi4xIDI1LjkgNC40bDExMiAxMDRjNC45IDQuNSA3LjcgMTAuOSA3LjcgMTcuNnoiXQogICAgfTsKICAgIGZhQ2FyZXRTcXVhcmVSaWdodDIgPSBmYVNxdWFyZUNhcmV0UmlnaHQyOwogICAgZmFWaWFsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZpYWwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjk1MTRdLCAiZjQ5MiIsICJNMzQyLjYgOS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM0wzMDYuNyA2NCAyOC4xIDM0Mi42QzEwLjEgMzYwLjYgMCAzODUgMCA0MTAuNUwwIDQxNmMwIDUzIDQzIDk2IDk2IDk2bDUuNSAwYzI1LjUgMCA0OS45LTEwLjEgNjcuOS0yOC4xbDI3OC42LTI3OC42IDkuNCA5LjRjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBzMTIuNS0zMi44IDAtNDUuM2wtMTYwLTE2MHpNMjA1LjMgMjU2bDE0Ni43LTE0Ni43IDUwLjcgNTAuNy05NiA5Ni0xMDEuNSAweiJdCiAgICB9OwogICAgZmFIZWxpY29wdGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhlbGljb3B0ZXIiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjg2NDFdLCAiZjUzMyIsICJNMTc2IDMyYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDE1MiAwIDAgNDgtMjIwLjggMC0zMi44LTM5LjRDNjkuOSA4My4yIDYzLjEgODAgNTYgODBMMjQgODBDMTUuNyA4MCA4IDg0LjMgMy42IDkxLjRzLTQuOCAxNS45LTEuMSAyMy40bDQ4IDk2QzU0LjYgMjE4LjkgNjIuOSAyMjQgNzIgMjI0bDEwNy44IDAgMTA0IDE0My4xYzE1LjEgMjAuNyAzOS4xIDMyLjkgNjQuNyAzMi45bDc1LjUgMGM3NS4xIDAgMTM2LTYwLjkgMTM2LTEzNlM0OTkuMSAxMjggNDI0IDEyOGwtNDggMCAwLTQ4IDE1MiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0TDE3NiAzMnpNMzc2IDE5Mmw0OCAwYzM5LjggMCA3MiAzMi4yIDcyIDcycy0zMi4yIDcyLTcyIDcybC00OCAwIDAtMTQ0ek01NTIgNDE2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNCAwIDQuNC0zLjYgOC04IDhsLTI3MiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDI3MiAwYzMwLjkgMCA1Ni0yNS4xIDU2LTU2IDAtMTMuMy0xMC43LTI0LTI0LTI0eiJdCiAgICB9OwogICAgZmFNaXR0ZW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWl0dGVuIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY3YjUiLCAiTTM1MiAzODRMNjQgMzg0IDUuNCAxNzguOUMxLjggMTY2LjQgMCAxNTMuNCAwIDE0MC4zIDAgNjIuOCA2Mi44IDAgMTQwLjMgMGwzLjQgMGM2NiAwIDEyMy41IDQ0LjkgMTM5LjUgMTA4LjlsMzEuNCAxMjUuOCAxNy42LTIwLjFDMzQ0LjggMjAwLjIgMzYyLjkgMTkyIDM4MiAxOTJsMi44IDBjMzQuOSAwIDYzLjMgMjguMyA2My4zIDYzLjMgMCAxNS45LTYgMzEuMi0xNi44IDQyLjlMMzUyIDM4NHpNMzIgNDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMybDI4OCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTZjMCAxNy43LTE0LjMgMzItMzIgMzJMNjQgNTEyYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTE2eiJdCiAgICB9OwogICAgZmFHYXNQdW1wID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImdhcy1wdW1wIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTk4MV0sICJmNTJmIiwgIk0zMiA2NEMzMiAyOC43IDYwLjcgMCA5NiAwTDI1NiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMTkyIDggMGM0OC42IDAgODggMzkuNCA4OCA4OGwwIDMyYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xNTRjLTI3LjYtNy4xLTQ4LTMyLjItNDgtNjJsMC01OS41LTI1LjgtMjguM2MtOC45LTkuOC04LjItMjUgMS42LTMzLjlzMjUtOC4yIDMzLjkgMS42bDcxLjcgNzguOGM5LjQgMTAuMyAxNC42IDIzLjcgMTQuNiAzNy43TDUxMiAzNzZjMCAzOS44LTMyLjIgNzItNzIgNzJzLTcyLTMyLjItNzItNzJsMC0zMmMwLTIyLjEtMTcuOS00MC00MC00MGwtOCAwIDAgMTYxLjRjOS4zIDMuMyAxNiAxMi4yIDE2IDIyLjYgMCAxMy4zLTEwLjcgMjQtMjQgMjRMNDAgNTEyYy0xMy4zIDAtMjQtMTAuNy0yNC0yNCAwLTEwLjUgNi43LTE5LjMgMTYtMjIuNkwzMiA2NHpNOTYgODBsMCA5NmMwIDguOCA3LjIgMTYgMTYgMTZsMTI4IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtOTZjMC04LjgtNy4yLTE2LTE2LTE2TDExMiA2NGMtOC44IDAtMTYgNy4yLTE2IDE2eiJdCiAgICB9OwogICAgZmFFbnZlbG9wZUNpcmNsZUNoZWNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImVudmVsb3BlLWNpcmNsZS1jaGVjayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNGU4IiwgIk02NCAxMTJjMC0yNi41IDIxLjUtNDggNDgtNDhsNDE2IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA4MS40Yy0yNC40LTExLjItNTEuNC0xNy40LTgwLTE3LjQtODcuNyAwLTE2MS43IDU4LjgtMTg0LjcgMTM5LjItNy4xLTEuMy0xNC4xLTQuMi0yMC4xLTguOGwtMjA4LTE1NkM3MS4xIDE0MS4zIDY0IDEyNy4xIDY0IDExMnpNMzA0IDM2OGMwIDI4LjYgNi4yIDU1LjYgMTcuNCA4MEwxMjggNDQ4Yy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTE4OCAxOTguNCAxNDguOGMxMi42IDkuNCAyNi45IDE1LjQgNDEuNyAxNy45IDAgMS44LS4xIDMuNS0uMSA1LjN6bTQ4IDBhMTQ0IDE0NCAwIDEgMSAyODggMCAxNDQgMTQ0IDAgMSAxIC0yODggMHptMjAxLjQtNjAuOWMtNy4xLTUuMi0xNy4yLTMuNi0yMi40IDMuNWwtNTMgNzIuOS0yNi44LTI2LjhjLTYuMi02LjItMTYuNC02LjItMjIuNiAwcy02LjIgMTYuNCAwIDIyLjZsNDAgNDBjMy4zIDMuMyA3LjkgNSAxMi42IDQuNnM4LjktMi44IDExLjctNi41bDY0LTg4YzUuMi03LjEgMy42LTE3LjItMy41LTIyLjN6Il0KICAgIH07CiAgICBmYVBlcnNvblNrYXRpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLXNrYXRpbmciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsic2thdGluZyJdLCAiZjdjNSIsICJNMzY4IDU2YTU2IDU2IDAgMSAxIDExMiAwIDU2IDU2IDAgMSAxIC0xMTIgMHpNMTI4IDEyOGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwxNTAuMSAwYzQ5LjkgMCA3NC45IDYwLjMgMzkuNiA5NS42bC02My45IDYzLjkgNjkuOCAzMWMxNy4zIDcuNyAyOC41IDI0LjkgMjguNSA0My45bDAgODUuNmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTc1LjItODIuNC0zNi42Yy00MS0xOC4yLTUxLTcyLTE5LjMtMTAzLjdsNDAuNC00MC40LTk4LjcgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6TTg5LjQgMzYxLjRsNzUuOS03NS45YzcuNyAxOS43IDIxLjYgMzcuMyA0MSA0OS42bC03MS42IDcxLjZjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwcy0xMi41LTMyLjggMC00NS4zem0zNDYuNSA4Ny4xYzguNiAyLjEgMTMuOCAxMC44IDExLjYgMTkuNGwtLjQgMS43Yy02LjIgMjQuOS0yOC42IDQyLjQtNTQuMyA0Mi40TDMwNCA1MTJjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsODguOCAwYzExIDAgMjAuNi03LjUgMjMuMy0xOC4ybC40LTEuN2MyLjEtOC42IDEwLjgtMTMuOCAxOS40LTExLjZ6TTE0My4yIDQ4Ni4zbC02LjIgMy4xYy0yMS42IDEwLjgtNDcuNiA2LjYtNjQuNi0xMC41TDEyLjcgNDE5LjNjLTYuMi02LjItNi4yLTE2LjQgMC0yMi42czE2LjQtNi4yIDIyLjYgMGw1OS42IDU5LjZjNy4zIDcuMyAxOC41IDkuMSAyNy43IDQuNWw2LjItMy4xYzcuOS00IDE3LjUtLjcgMjEuNSA3LjJzLjcgMTcuNS03LjIgMjEuNXoiXQogICAgfTsKICAgIGZhU2thdGluZyA9IGZhUGVyc29uU2thdGluZzsKICAgIGZhU3VuMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzdW4iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFs5NzI4XSwgImYxODUiLCAiTTI4OC0zMmM4LjQgMCAxNi4zIDQuNCAyMC42IDExLjdMMzY0LjEgNzIuMyA0NjguOSA0NmM4LjItMiAxNi45IC40IDIyLjggNi4zUzUwMCA2NyA0OTggNzUuMWwtMjYuMyAxMDQuNyA5Mi43IDU1LjVjNy4yIDQuMyAxMS43IDEyLjIgMTEuNyAyMC42cy00LjQgMTYuMy0xMS43IDIwLjZMNDcxLjcgMzMyLjEgNDk4IDQzNi44YzIgOC4yLS40IDE2LjktNi4zIDIyLjhTNDc3IDQ2OCA0NjguOSA0NjZsLTEwNC43LTI2LjMtNTUuNSA5Mi43Yy00LjMgNy4yLTEyLjIgMTEuNy0yMC42IDExLjdzLTE2LjMtNC40LTIwLjYtMTEuN0wyMTEuOSA0MzkuNyAxMDcuMiA0NjZjLTguMiAyLTE2LjgtLjQtMjIuOC02LjNTNzYgNDQ1IDc4IDQzNi44bDI2LjItMTA0LjctOTIuNi01NS41QzQuNCAyNzIuMiAwIDI2NC40IDAgMjU2czQuNC0xNi4zIDExLjctMjAuNkwxMDQuMyAxNzkuOSA3OCA3NS4xYy0yLTguMiAuMy0xNi44IDYuMy0yMi44Uzk5IDQ0IDEwNy4yIDQ2bDEwNC43IDI2LjIgNTUuNS05Mi42IDEuOC0yLjZjNC41LTUuNyAxMS40LTkuMSAxOC44LTkuMXptMCAxNDRhMTQ0IDE0NCAwIDEgMCAwIDI4OCAxNDQgMTQ0IDAgMSAwIDAtMjg4em0wIDI0MGE5NiA5NiAwIDEgMSAwLTE5MiA5NiA5NiAwIDEgMSAwIDE5MnoiXQogICAgfTsKICAgIGZhQmFzZWJhbGwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmFzZWJhbGwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjkzNTgsIDk5MTgsICJiYXNlYmFsbC1iYWxsIl0sICJmNDMzIiwgIk0yMzIuNCAxLjFjLTEyMi4yIDExLjQtMjE5LjUgMTA4LjctMjMwLjkgMjMwLjkgMTYuMi0uMSAzMi0xLjggNDcuMi01IDEzLTIuNyAyNS43IDUuNSAyOC40IDE4LjVzLTUuNSAyNS43LTE4LjUgMjguNGMtMTguNCAzLjktMzcuNiA2LTU3LjEgNi4xIDExLjQgMTIyLjIgMTA4LjcgMjE5LjUgMjMwLjkgMjMwLjkgLjEtMTkuNSAyLjItMzguNyA2LjEtNTcuMSAyLjctMTMgMTUuNS0yMS4zIDI4LjQtMTguNXMyMS4zIDE1LjUgMTguNSAyOC40Yy0zLjIgMTUuMi00LjkgMzEtNSA0Ny4yIDEyMi4yLTExLjQgMjE5LjUtMTA4LjcgMjMwLjktMjMwLjktMTYuMiAuMS0zMiAxLjgtNDcuMiA1LTEzIDIuNy0yNS43LTUuNS0yOC40LTE4LjVzNS41LTI1LjcgMTguNS0yOC40YzE4LjQtMy45IDM3LjYtNiA1Ny4xLTYuMS0xMS40LTEyMi4yLTEwOC43LTIxOS41LTIzMC45LTIzMC45LS4xIDE5LjUtMi4yIDM4LjctNi4xIDU3LjEtMi43IDEzLTE1LjUgMjEuMy0yOC40IDE4LjVzLTIxLjMtMTUuNS0xOC41LTI4LjRjMy4yLTE1LjIgNC45LTMxIDUtNDcuMnptMi44IDE1MS40Yy0yMS40IDMyLjktNDkuNSA2MC45LTgyLjMgODIuMy0xMS4xIDcuMi0yNiA0LjEtMzMuMi03cy00LjEtMjYgNy0zMy4yYzI3LjItMTcuNyA1MC41LTQxIDY4LjMtNjguMyA3LjItMTEuMSAyMi4xLTE0LjMgMzMuMi03czE0LjMgMjIuMSA3IDMzLjJ6TTM5My4xIDI4NC4yYzcuMiAxMS4xIDQuMSAyNi03IDMzLjItMjcuMiAxNy43LTUwLjUgNDEtNjguMyA2OC4zLTcuMiAxMS4xLTIyLjEgMTQuMy0zMy4yIDdzLTE0LjMtMjIuMS03LTMzLjJjMjEuNC0zMi45IDQ5LjUtNjAuOSA4Mi4zLTgyLjMgMTEuMS03LjIgMjYtNC4xIDMzLjIgN3oiXQogICAgfTsKICAgIGZhQmFzZWJhbGxCYWxsID0gZmFCYXNlYmFsbDsKICAgIGZhSW1hZ2UyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImltYWdlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYwM2UiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6bTY0IDgwYTQ4IDQ4IDAgMSAxIDAgOTYgNDggNDggMCAxIDEgMC05NnpNMjcyIDIyNGM4LjQgMCAxNi4xIDQuNCAyMC41IDExLjVsODggMTQ0YzQuNSA3LjQgNC43IDE2LjcgLjUgMjQuM1MzNjguNyA0MTYgMzYwIDQxNkw4OCA0MTZjLTguOSAwLTE3LjItNS0yMS4zLTEyLjlzLTMuNS0xNy41IDEuNi0yNC44bDU2LTgwYzQuNS02LjQgMTEuOC0xMC4yIDE5LjctMTAuMnMxNS4yIDMuOCAxOS43IDEwLjJsMjYuNCAzNy44IDYxLjQtMTAwLjVjNC40LTcuMSAxMi4xLTExLjUgMjAuNS0xMS41eiJdCiAgICB9OwogICAgZmFOb3RkZWYgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibm90ZGVmIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImUxZmUiLCAiTTY0IDM5MC4zTDE1My41IDI1NiA2NCAxMjEuNyA2NCAzOTAuM3pNMTAyLjUgNDQ4TDI4MS41IDQ0OCAxOTIgMzEzLjcgMTAyLjUgNDQ4em0xMjgtMTkyTDMyMCAzOTAuMyAzMjAgMTIxLjcgMjMwLjUgMjU2ek0yODEuNSA2NEwxMDIuNSA2NCAxOTIgMTk4LjMgMjgxLjUgNjR6TTAgNDhDMCAyMS41IDIxLjUgMCA0OCAwTDMzNiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgNDE2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDQ4IDUxMmMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCA0OHoiXQogICAgfTsKICAgIGZhQmFza2V0YmFsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYXNrZXRiYWxsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3OTM2LCAiYmFza2V0YmFsbC1iYWxsIl0sICJmNDM0IiwgIk05Mi43IDU4LjhsNzguNCA3OC40YzE4LjItMjUgMjguOS01NS45IDI4LjktODkuMiAwLTE0LjEtMS45LTI3LjctNS41LTQwLjYtMzggOS40LTcyLjYgMjcuMi0xMDEuOCA1MS40ek01OC44IDkyLjdjLTI0LjIgMjkuMi00MiA2My44LTUxLjQgMTAxLjggMTIuOSAzLjYgMjYuNSA1LjUgNDAuNiA1LjUgMzMuMyAwIDY0LjEtMTAuNyA4OS4yLTI4LjlMNTguOCA5Mi43ek0yNTYgMGMtNC42IDAtOS4yIC4xLTEzLjcgLjQgMy43IDE1LjMgNS43IDMxLjIgNS43IDQ3LjYgMCA0Ni42LTE1LjkgODkuNC00Mi42IDEyMy40TDI1NiAyMjIuMSA0MTkuMyA1OC44QzM3NC45IDIyLjEgMzE4LjEgMCAyNTYgMHpNNDggMjQ4Yy0xNi40IDAtMzIuNC0yLTQ3LjYtNS43LS4yIDQuNS0uNCA5LjEtLjQgMTMuNyAwIDYyLjEgMjIuMSAxMTguOSA1OC44IDE2My4zTDIyMi4xIDI1NiAxNzEuNCAyMDUuNEMxMzcuNCAyMzIuMSA5NC42IDI0OCA0OCAyNDh6bTQ2My42IDIxLjdjLjItNC41IC40LTkuMSAuNC0xMy43IDAtNjIuMS0yMi4xLTExOC45LTU4LjgtMTYzLjNMMjg5LjkgMjU2IDM0MC42IDMwNi42YzM0LTI2LjcgNzYuOS00Mi42IDEyMy40LTQyLjYgMTYuNCAwIDMyLjQgMiA0Ny42IDUuN3ptLTcuMSA0Ny44Yy0xMi45LTMuNi0yNi41LTUuNS00MC42LTUuNS0zMy4zIDAtNjQuMSAxMC43LTg5LjIgMjguOWw3OC40IDc4LjRjMjQuMi0yOS4yIDQyLTYzLjggNTEuNC0xMDEuOHpNMzQwLjkgMzc0LjhjLTE4LjIgMjUtMjguOSA1NS45LTI4LjkgODkuMiAwIDE0LjEgMS45IDI3LjcgNS41IDQwLjYgMzgtOS40IDcyLjYtMjcuMiAxMDEuOC01MS40bC03OC40LTc4LjR6bS0zNC4zLTM0LjNMMjU2IDI4OS45IDkyLjcgNDUzLjJjNDQuMyAzNi43IDEwMS4yIDU4LjggMTYzLjMgNTguOCA0LjYgMCA5LjItLjEgMTMuNy0uNC0zLjctMTUuMy01LjctMzEuMi01LjctNDcuNiAwLTQ2LjYgMTUuOS04OS40IDQyLjYtMTIzLjR6Il0KICAgIH07CiAgICBmYUJhc2tldGJhbGxCYWxsID0gZmFCYXNrZXRiYWxsOwogICAgZmFQZW5jaWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVuY2lsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTk5OSwgNjE1MDQsICJwZW5jaWwtYWx0Il0sICJmMzAzIiwgIk0zNi40IDM1My4yYzQuMS0xNC42IDExLjgtMjcuOSAyMi42LTM4LjdsMTgxLjItMTgxLjIgMzMuOS0zMy45YzE2LjYgMTYuNiA1MS4zIDUxLjMgMTA0IDEwNGwzMy45IDMzLjktMzMuOSAzMy45LTE4MS4yIDE4MS4yYy0xMC43IDEwLjctMjQuMSAxOC41LTM4LjcgMjIuNkwzMC40IDUxMC42Yy04LjMgMi4zLTE3LjMgMC0yMy40LTYuMlMtMS40IDQ4OS4zIC45IDQ4MUwzNi40IDM1My4yem01NS42LTMuN2MtNC40IDQuNy03LjYgMTAuNC05LjMgMTYuNmwtMjQuMSA4Ni45IDg2LjktMjQuMWM2LjQtMS44IDEyLjItNS4xIDE3LTkuN0w5MS45IDM0OS41em0zNTQtMTQ2LjFjLTE2LjYtMTYuNi01MS4zLTUxLjMtMTA0LTEwNEwzMDggNjUuNUMzMzQuNSAzOSAzNDkuNCAyNC4xIDM1Mi45IDIwLjYgMzY2LjQgNyAzODQuOC0uNiA0MDQtLjZTNDQxLjYgNyA0NTUuMSAyMC42bDM1LjcgMzUuN0M1MDQuNCA2OS45IDUxMiA4OC4zIDUxMiAxMDcuNHMtNy42IDM3LjYtMjEuMiA1MS4xYy0zLjUgMy41LTE4LjQgMTguNC00NC45IDQ0Ljl6Il0KICAgIH07CiAgICBmYVBlbmNpbEFsdCA9IGZhUGVuY2lsOwogICAgZmFQZXJzb25XYWxraW5nQXJyb3dMb29wTGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24td2Fsa2luZy1hcnJvdy1sb29wLWxlZnQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU1MSIsICJNMTYwIDgwYTU2IDU2IDAgMSAwIDAtMTEyIDU2IDU2IDAgMSAwIDAgMTEyek03My40IDIyNy45bDIyLjYtMjIuNiAwIDY5LjNjMCAyOCAxMi4yIDU0LjcgMzMuNSA3Mi45bDcxLjQgNjEuMmM1LjkgNS4xIDkuOCAxMi4xIDEwLjkgMTkuOGwxMi42IDg4LjFjMi41IDE3LjUgMTguNyAyOS43IDM2LjIgMjcuMnMyOS43LTE4LjcgMjcuMi0zNi4ybC0xMi42LTg4LjFjLTMuMy0yMy4xLTE0LjktNDQuMS0zMi42LTU5LjNsLTM0LjUtMjkuNiAwLTExNS4yIDMuOCA0LjdjMTguMiAyMi44IDQ1LjggMzYgNzUgMzZsMzMuMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0zMy4yIDBjLTkuNyAwLTE4LjktNC40LTI1LTEybC0xNy45LTIyLjRjLTIzLTI4LjgtNTcuOS00NS42LTk0LjgtNDUuNi0zMi4yIDAtNjMuMSAxMi44LTg1LjggMzUuNkwyOC4xIDE4Mi42QzEwLjEgMjAwLjYgMCAyMjUgMCAyNTAuNUwwIDI4OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzcuNWMwLTguNSAzLjQtMTYuNiA5LjQtMjIuNnpNODUuOCA0MDcuM2MtMS41IDUuMi00LjMgMTAtOC4xIDEzLjhMOS40IDQ4OS40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwbDY4LjMtNjguM2MxMS41LTExLjUgMTkuOS0yNS44IDI0LjQtNDEuNWwyLjItNy42LTQ2LTM5LjRjLTIuNS0yLjItNS00LjQtNy40LTYuOEw4NS44IDQwNy4zek0zNTkgMzM1Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOWw3MiA3MmM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTMxLTMxIDEwMi4xIDBjMS4yIDAgMi40LS4xIDMuNS0uMyA1Ni4xLTMuOSAxMDAuNS01MC42IDEwMC41LTEwNy43IDAtNTkuNi00OC40LTEwOC0xMDgtMTA4bC05MiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDkyIDBjMzMuMSAwIDYwIDI2LjkgNjAgNjBzLTI2LjkgNjAtNjAgNjBsLTk4LjEgMCAzMS0zMWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwbC03MiA3MnoiXQogICAgfTsKICAgIGZhRGljZVNpeCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkaWNlLXNpeCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzk4NjFdLCAiZjUyNiIsICJNMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZ6bTE2MCA2NGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwek0xMjggMjg4YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHptMzIgNjRhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHpNMzIwIDE5MmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6bTMyIDY0YTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6TTMyMCAzODRhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFBbmdsZXNEb3duID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFuZ2xlcy1kb3duIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbImFuZ2xlLWRvdWJsZS1kb3duIl0sICJmMTAzIiwgIk0yMTQuNiA0NzAuNmMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBsLTE2MC0xNjBjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zczMyLjgtMTIuNSA0NS4zIDBMMTkyIDQwMi43IDMyOS40IDI2NS40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwczEyLjUgMzIuOCAwIDQ1LjNsLTE2MCAxNjB6bTE2MC0zNTJsLTE2MCAxNjBjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwbC0xNjAtMTYwYy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM3MzMi44LTEyLjUgNDUuMyAwTDE5MiAyMTAuNyAzMjkuNCA3My40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwczEyLjUgMzIuOCAwIDQ1LjN6Il0KICAgIH07CiAgICBmYUFuZ2xlRG91YmxlRG93biA9IGZhQW5nbGVzRG93bjsKICAgIGZhU3lyaW5nZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzeXJpbmdlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4MTM3XSwgImY0OGUiLCAiTTQ5Ny41LTE3Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDE1IDE1LTQ2LjEgNDYuMS02My02M2MtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWw3IDctNzguMSA3OC4xIDQxIDQxYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTQxLTQxLTQ2LjEgNDYuMSA0MSA0MWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwbC00MS00MS0zNy43IDM3LjdjLTEwLjUgMTAuNS0xNi40IDI0LjctMTYuNCAzOS42bDAgODguOC01NyA1N2MtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDU3LTU3IDg4LjggMGMxNC45IDAgMjkuMS01LjkgMzkuNi0xNi40bDIyOS43LTIyOS43IDcgN2M5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTYzLTYzIDQ2LjEtNDYuMSAxNSAxNWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTY0LTY0eiJdCiAgICB9OwogICAgZmFXaGVhdEF3biA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3aGVhdC1hd24iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsid2hlYXQtYWx0Il0sICJlMmNkIiwgIk03OS43IDIzNC42YzYuMi00LjEgMTQuNy0zLjQgMjAuMSAyLjFsNDYuMSA0Ni4xIDYuMSA2LjdjMTkuNyAyMy44IDI2LjMgNTUgMTkuMiA4My45IDMxLjctNy43IDY2LjIgMSA5MC42IDI1LjNsNDYuMSA0Ni4xYzYuMiA2LjIgNi4yIDE2LjQgMCAyMi42bC03LjQgNy40Yy0zNy41IDM3LjUtOTguMyAzNy41LTEzNS44IDBMMTM0LjEgNDQ0LjMgNDkuNCA1MjljLTkuNCA5LjQtMjQuNSA5LjQtMzMuOSAwLTkuNC05LjQtOS40LTI0LjYgMC0zMy45bDg0LjctODQuNy0zMC41LTMwLjVjLTM3LjUtMzcuNS0zNy41LTk4LjMgMC0xMzUuN2w3LjQtNy40IDIuNS0yLjF6bTEwNC0xMDRjNi4yLTQuMSAxNC43LTMuNCAyMC4xIDIuMWw0Ni4xIDQ2LjEgNi4xIDYuN2MxOS43IDIzLjggMjYuMyA1NSAxOS4yIDgzLjkgMzEuNy03LjcgNjYuMiAxIDkwLjYgMjUuM2w0Ni4xIDQ2LjFjNi4yIDYuMiA2LjIgMTYuNCAwIDIyLjZsLTcuNCA3LjRjLTM3LjUgMzcuNS05OC4zIDM3LjUtMTM1LjggMGwtOTQuOS05NC45Yy0zNy41LTM3LjUtMzcuNS05OC4zIDAtMTM1LjdsNy40LTcuNCAyLjUtMi4xek00OTUuMiAxNWM5LjQtOS40IDI0LjYtOS40IDM0IDAgOC44IDguOCA5LjMgMjIuNyAxLjYgMzIuMkw1MjkuMiA0OSA0MTQuNyAxNjMuNGM3LjcgMSAxNS4yIDMgMjIuNSA1LjlMNDk1LjUgMTExYzkuNC05LjQgMjQuNi05LjQgMzQgMCA4LjggOC44IDkuMyAyMi43IDEuNiAzMi4xbC0xLjcgMS44LTUyLjcgNTIuNyAzOSAzOWM2LjIgNi4yIDYuMiAxNi40IDAgMjIuNmwtNy40IDcuNGMtMzcuNSAzNy41LTk4LjMgMzcuNS0xMzUuOCAwbC05NC45LTk0LjljLTM3LjUtMzcuNS0zNy41LTk4LjMgMC0xMzUuN2w3LjQtNy40IDIuNS0yLjFjNi4yLTQuMSAxNC43LTMuNCAyMC4xIDIuMWwzOSAzOSA1Mi43LTUyLjdjOS40LTkuNCAyNC42LTkuNCAzNCAwIDguOCA4LjggOS4zIDIyLjcgMS42IDMyLjFsLTEuNyAxLjgtNTguMyA1OC4zYzIuOCA3LjEgNC43IDE0LjUgNS43IDIyLjFMNDk1LjIgMTV6Il0KICAgIH07CiAgICBmYVdoZWF0QWx0ID0gZmFXaGVhdEF3bjsKICAgIGZhUGxhbmVVcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwbGFuZS11cCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMjJkIiwgIk0yMDAgMjRjMC0zMC45IDI1LjEtNTYgNTYtNTZzNTYgMjUuMSA1NiA1NmwwIDEyNy4zIDE3My42IDE1OS4yYzYuNiA2LjEgMTAuNCAxNC42IDEwLjQgMjMuNmwwIDQzLjdjMCAxMC45LTEwLjcgMTguNi0yMS4xIDE1LjJsLTE2Mi45LTU0LjMgMCA5OS43IDY2IDUyLjhjMy44IDMgNiA3LjYgNiAxMi41bDAgMTkuOGMwIDEwLjQtOS44IDE4LTE5LjkgMTUuNUwyNTYgNTEyIDE0Ny45IDUzOWMtMTAuMSAyLjUtMTkuOS01LjEtMTkuOS0xNS41bDAtMTkuOGMwLTQuOSAyLjItOS41IDYtMTIuNWw2Ni01Mi44IDAtOTkuNy0xNjIuOSA1NC4zQzI2LjcgMzk2LjQgMTYgMzg4LjcgMTYgMzc3LjhsMC00My43YzAtOSAzLjgtMTcuNSAxMC40LTIzLjZMMjAwIDE1MS4zIDIwMCAyNHoiXQogICAgfTsKICAgIGZhQWxpZ25DZW50ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYWxpZ24tY2VudGVyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYwMzciLCAiTTM1MiA2NGMwLTE3LjctMTQuMy0zMi0zMi0zMkwxMjggMzJjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMTkyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJ6bTk2IDEyOGMwLTE3LjctMTQuMy0zMi0zMi0zMkwzMiAxNjBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzg0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJ6TTAgNDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMybDM4NCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDMyIDQxNmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6TTM1MiAzMjBjMC0xNy43LTE0LjMtMzItMzItMzJsLTE5MiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDE5MiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMyeiJdCiAgICB9OwogICAgZmFIb2NrZXlQdWNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvY2tleS1wdWNrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0NTMiLCAiTTI1NiAyNTZDMTE0LjYgMjU2IDAgMjEzIDAgMTYwczExNC42LTk2IDI1Ni05NiAyNTYgNDMgMjU2IDk2LTExNC42IDk2LTI1NiA5NnpNMCAzNTJMMCAyNDIuN2MxNi45IDEyLjMgMzcgMjIuMiA1OC4xIDMwLjEgNTMgMTkuOSAxMjMgMzEuMiAxOTcuOSAzMS4yczE0NC45LTExLjMgMTk3LjktMzEuMmMyMS4yLTcuOSA0MS4yLTE3LjggNTguMS0zMC4xTDUxMiAzNTJjMCA1My0xMTQuNiA5Ni0yNTYgOTZTMCA0MDUgMCAzNTJ6Il0KICAgIH07CiAgICBmYUNpcmNsZUFycm93TGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtYXJyb3ctbGVmdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJhcnJvdy1jaXJjbGUtbGVmdCJdLCAiZjBhOCIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTEzNSAyMzlsODAtODBjOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45bC0zOSAzOSAxNTAuMSAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNTAuMSAwIDM5IDM5YzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTgwLTgwYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXoiXQogICAgfTsKICAgIGZhQXJyb3dDaXJjbGVMZWZ0ID0gZmFDaXJjbGVBcnJvd0xlZnQ7CiAgICBmYVBsdWdDaXJjbGVCb2x0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBsdWctY2lyY2xlLWJvbHQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU1YiIsICJNMTkyLTMyYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgOTYgMTI4IDAgMC05NmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgOTYgNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwwIDQ4LjdjLTk4LjYgOC4xLTE3NiA5MC43LTE3NiAxOTEuMyAwIDI3LjMgNS43IDUzLjMgMTYgNzYuOWwwIDMuMWMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY2LjdDMTY1LjIgMzk4LjEgOTYgMzE5LjEgOTYgMjI0bDAtNjRjLTE3LjcgMC0zMi0xNC4zLTMyLTMyUzc4LjMgOTYgOTYgOTZsNjQgMCAwLTk2YzAtMTcuNyAxNC4zLTMyIDMyLTMyek0zNTIgNDAwYTE0NCAxNDQgMCAxIDEgMjg4IDAgMTQ0IDE0NCAwIDEgMSAtMjg4IDB6bTE3Ny40LTc3Yy01LjgtNC4yLTEzLjgtNC0xOS40IC41bC04MCA2NGMtNS4zIDQuMi03LjQgMTEuNC01LjEgMTcuOFM0MzMuMiA0MTYgNDQwIDQxNmwzMi45IDAtMTUuOSA0Mi40Yy0yLjUgNi43LS4yIDE0LjMgNS42IDE4LjZzMTMuOCA0IDE5LjQtLjVsODAtNjRjNS4zLTQuMiA3LjQtMTEuNCA1LjEtMTcuOFM1NTguOCAzODQgNTUyIDM4NGwtMzIuOSAwIDE1LjktNDIuNGMyLjUtNi43IC4yLTE0LjMtNS42LTE4LjZ6Il0KICAgIH07CiAgICBmYVJlc3Ryb29tID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJlc3Ryb29tIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY3YmQiLCAiTTgwIDQ4YTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6bTQwIDMwNGwwIDEyOGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTE1NC44Yy04LjEgOS4yLTIxLjEgMTMuMi0zMy41IDkuNC0xNi45LTUuMy0yNi4zLTIzLjItMjEtNDAuMWwyOS43LTk1LjJDNDQuNCAxNTYuOSA4My42IDEyOCAxMjggMTI4czgzLjYgMjguOSA5Ni44IDcxLjJsMjkuNyA5NS4yYzUuMyAxNi45LTQuMSAzNC44LTIxIDQwLjEtMTIuNCAzLjktMjUuNC0uMi0zMy41LTkuNEwyMDAgNDgwYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTI4LTE2IDB6TTMyMCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgNDY0YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNDY0YzAtMTMuMyAxMC43LTI0IDI0LTI0ek00NjQgNDhhNDggNDggMCAxIDEgOTYgMCA0OCA0OCAwIDEgMSAtOTYgMHpNNDQwIDQ4MGwwLTk2LTE3LjggMGMtMTAuOSAwLTE4LjYtMTAuNy0xNS4yLTIxLjFsOS0yNi45Yy0zLjIgMC02LjQtLjUtOS41LTEuNS0xNi45LTUuMy0yNi4zLTIzLjItMjEtNDAuMWwyOS43LTk1LjJDNDI4LjQgMTU2LjkgNDY3LjYgMTI4IDUxMiAxMjhzODMuNiAyOC45IDk2LjggNzEuMmwyOS43IDk1LjJjNS4zIDE2LjktNC4xIDM0LjgtMjEgNDAuMS0zLjIgMS02LjQgMS41LTkuNSAxLjVsOSAyNi45YzMuNSAxMC40LTQuMyAyMS4xLTE1LjIgMjEuMWwtMTcuOCAwIDAgOTZjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC05Ni0xNiAwIDAgOTZjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJ6Il0KICAgIH07CiAgICBmYUFuY2hvckxvY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYW5jaG9yLWxvY2siLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTRhZCIsICJNMzIwLjUgOTZhMzIgMzIgMCAxIDEgLTY0IDAgMzIgMzIgMCAxIDEgNjQgMHptLTMyLTk2Yy01MyAwLTk2IDQzLTk2IDk2IDAgNDEuOCAyNi43IDc3LjQgNjQgOTAuNWwwIDI1Ny45Yy02Mi45LTE0LjMtMTEwLjItNjkuNy0xMTEuOS0xMzYuNWwxNi4xIDE0LjFjMTAgOC43IDI1LjEgNy43IDMzLjktMi4zczcuNy0yNS4xLTIuMy0zMy45bC02NC01NmMtOS03LjktMjIuNi03LjktMzEuNiAwbC02NCA1NmMtMTAgOC43LTExIDIzLjktMi4zIDMzLjlzMjMuOSAxMSAzMy45IDIuM2wxNi4yLTE0LjJjMi4xIDExMy4xIDk0LjQgMjA0LjEgMjA4IDIwNC4xIDI4LjMgMCA1NS40LTUuNyA4MC0xNS45bDAtLjIgMC03Mi4yYy0xNC40IDkuNi0zMC42IDE2LjctNDggMjAuN2wwLTI1Ny45YzM3LjMtMTMuMiA2NC00OC43IDY0LTkwLjUgMC01My00My05Ni05Ni05NnptMjcyIDMwNC4xbDAgNDcuOS02NCAwIDAtNDcuOWMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMyek00MTYuNSA0MDBsMCA5NmMwIDI2LjUgMjEuNSA0OCA0OCA0OGwxMjggMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTk2YzAtMjAuOS0xMy40LTM4LjctMzItNDUuM2wwLTUwLjZjMC00NC4yLTM1LjgtODAtODAtODBzLTgwIDM1LjgtODAgODBsMCA1MC42Yy0xOC42IDYuNi0zMiAyNC40LTMyIDQ1LjN6Il0KICAgIH07CiAgICBmYVRpbWVsaW5lID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRpbWVsaW5lIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImUyOWMiLCAiTTE2MCAxNjkuM2MyOC4zLTEyLjMgNDgtNDAuNSA0OC03My4zIDAtNDQuMi0zNS44LTgwLTgwLTgwUzQ4IDUxLjggNDggOTZjMCAzMi44IDE5LjcgNjEgNDggNzMuM2wwIDU0LjctNjQgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwyMjQgMCAwIDU0LjdjLTI4LjMgMTIuMy00OCA0MC41LTQ4IDczLjMgMCA0NC4yIDM1LjggODAgODAgODBzODAtMzUuOCA4MC04MGMwLTMyLjgtMTkuNy02MS00OC03My4zbDAtNTQuNyAyMjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNjQgMCAwLTU0LjdjMjguMy0xMi4zIDQ4LTQwLjUgNDgtNzMuMyAwLTQ0LjItMzUuOC04MC04MC04MHMtODAgMzUuOC04MCA4MGMwIDMyLjggMTkuNyA2MSA0OCA3My4zbDAgNTQuNy0yNTYgMCAwLTU0Ljd6Il0KICAgIH07CiAgICBmYUxpZ2h0YnVsYjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGlnaHRidWxiIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4MTYxXSwgImYwZWIiLCAiTTI5Mi45IDM4NGM3LjMtMjIuMyAyMS45LTQyLjUgMzguNC01OS45IDMyLjctMzQuNCA1Mi43LTgwLjkgNTIuNy0xMzIuMSAwLTEwNi04Ni0xOTItMTkyLTE5MlMwIDg2IDAgMTkyYzAgNTEuMiAyMCA5Ny43IDUyLjcgMTMyLjEgMTYuNSAxNy40IDMxLjIgMzcuNiAzOC40IDU5LjlsMjAxLjcgMHpNMjg4IDQzMmwtMTkyIDAgMCAxNmMwIDQ0LjIgMzUuOCA4MCA4MCA4MGwzMiAwYzQ0LjIgMCA4MC0zNS44IDgwLTgwbDAtMTZ6TTE4NCAxMTJjLTM5LjggMC03MiAzMi4yLTcyIDcyIDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtNjYuMyA1My43LTEyMCAxMjAtMTIwIDEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0eiJdCiAgICB9OwogICAgZmFDaXJjbGVBcnJvd1JpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1hcnJvdy1yaWdodCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJhcnJvdy1jaXJjbGUtcmlnaHQiXSwgImYwYTkiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyem00MS0xNTljLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsMzktMzktMTUwLjEgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxNTAuMSAwLTM5LTM5Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBsODAgODBjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlsLTgwIDgweiJdCiAgICB9OwogICAgZmFBcnJvd0NpcmNsZVJpZ2h0ID0gZmFDaXJjbGVBcnJvd1JpZ2h0OwogICAgZmFNYXJzQW5kVmVudXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFycy1hbmQtdmVudXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5ODkzXSwgImYyMjQiLCAiTTM2OCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDExMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTEyYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMzQuNy02MyA2M2MxOS41IDI4LjQgMzEgNjIuNyAzMSA5OS44IDAgODYuMy02Mi4xIDE1OC4xLTE0NCAxNzMuMWwwIDM0LjkgMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIgMCAwIDMyYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMzItMzIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwzMiAwIDAtMzQuOWMtODEuOS0xNS0xNDQtODYuOC0xNDQtMTczLjEgMC05Ny4yIDc4LjgtMTc2IDE3Ni0xNzYgMzcgMCA3MS40IDExLjQgOTkuOCAzMWw2My02My0zNC43IDB6TTM1MiAyMDhhMTEyIDExMiAwIDEgMCAtMjI0IDAgMTEyIDExMiAwIDEgMCAyMjQgMHoiXQogICAgfTsKICAgIGZhTmV0d29ya1dpcmVkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm5ldHdvcmstd2lyZWQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjZmZiIsICJNMjQ4IDg4bDgwIDAgMCA0OC04MCAwIDAtNDh6bS04LTU2Yy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDY0YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDE2IDAgMCAzMi0yMjQgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmw5NiAwIDAgMzItMTYgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCA2NGMwIDI2LjUgMjEuNSA0OCA0OCA0OGw5NiAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtNjRjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTE2IDAgMC0zMiAxOTIgMCAwIDMyLTE2IDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgNjRjMCAyNi41IDIxLjUgNDggNDggNDhsOTYgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTY0YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC0xNiAwIDAtMzIgOTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMjI0IDAgMC0zMiAxNiAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtNjRjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTk2IDB6TTQ0OCAzNzZsOCAwIDAgNDgtODAgMCAwLTQ4IDcyIDB6bS0yNTYgMGw4IDAgMCA0OC04MCAwIDAtNDggNzIgMHoiXQogICAgfTsKICAgIGZhQnVpbGRpbmdTaGllbGQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnVpbGRpbmctc2hpZWxkIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU0ZDgiLCAiTTk2IDBDNjAuNyAwIDMyIDI4LjcgMzIgNjRsMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjAxLjIgMGMtMTIuNS0xNC43LTIzLjItMzAuOC0zMS44LTQ4bC04OS41IDAgMC04MGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzMiAwIDAtMjYuN2MwLTE4LjEgNi4xLTM1LjIgMTYuNi00OC44LS40LTEuNC0uNi0yLjktLjYtNC41bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMSA4Ni43LTI4LjljMy4xLTEgNi4yLTEuOCA5LjMtMi41TDQxNiA2NGMwLTM1LjMtMjguNy02NC02NC02NEw5NiAwem0zMiAxMTJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMnpNMjcyIDk2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZ6TTEyOCAyNDBjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMnpNNDQ1LjMgNDg4LjVsLTEzLjMgNi4zIDAtMTg4LjEgOTYgMzIgMCAxOS42YzAgNTUuOC0zMi4yIDEwNi41LTgyLjcgMTMwLjN6TTQyMS45IDI1OS41bC0xMTIgMzcuM2MtMTMuMSA0LjQtMjEuOSAxNi42LTIxLjkgMzAuNGwwIDMxLjFjMCA3NC40IDQzIDE0Mi4xIDExMC4yIDE3My43bDE4LjUgOC43YzQuOCAyLjIgMTAgMy40IDE1LjIgMy40czEwLjUtMS4yIDE1LjItMy40bDE4LjUtOC43QzUzMyA1MDAuMyA1NzYgNDMyLjYgNTc2IDM1OC4ybDAtMzEuMWMwLTEzLjgtOC44LTI2LTIxLjktMzAuNGwtMTEyLTM3LjNjLTYuNi0yLjItMTMuNy0yLjItMjAuMiAweiJdCiAgICB9OwogICAgZmFDb2RlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvZGUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjEyMSIsICJNMzYwLjggMS4yYy0xNy00LjktMzQuNyA1LTM5LjYgMjJsLTEyOCA0NDhjLTQuOSAxNyA1IDM0LjcgMjIgMzkuNnMzNC43LTUgMzkuNi0yMmwxMjgtNDQ4YzQuOS0xNy01LTM0LjctMjItMzkuNnptNjQuNiAxMzYuMWMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNsNzMuNCA3My40LTczLjQgNzMuNGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMGw5Ni05NmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM2wtOTYtOTZjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwem0tMjc0LjcgMGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTk2IDk2Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM2w5NiA5NmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zTDc3LjMgMjU2IDE1MC42IDE4Mi42YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zeiJdCiAgICB9OwogICAgZmFGZWF0aGVyUG9pbnRlZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmZWF0aGVyLXBvaW50ZWQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiZmVhdGhlci1hbHQiXSwgImY1NmIiLCAiTTQ3NS4zIC4xYzkuOS0uOCAxOS42IDMgMjYuNiAxMHMxMC44IDE2LjcgMTAgMjYuNmMtNCA0OS4zLTE3LjQgMTI2LjItNDYuMyAxOTkuNy0xLjggNC41LTUuNSA3LjktMTAuMiA5LjNMMzc0LjUgMjcwYy0zLjkgMS4yLTYuNSA0LjctNi41IDguOCAwIDUuMSA0LjEgOS4yIDkuMiA5LjJsMzguNiAwYzEyIDAgMTkuNyAxMi44IDEzLjUgMjMuMS00IDYuNy04LjMgMTMuMi0xMi43IDE5LjYtMiAyLjktNSA1LTguNCA2LjFMMzEwLjUgMzY2Yy0zLjkgMS4yLTYuNSA0LjctNi41IDguOCAwIDUuMSA0LjEgOS4yIDkuMiA5LjJsMTYgMGMxNC42IDAgMjEgMTcuNCA4LjggMjUuNC02OCA0NS0xMzcuNyA0My4zLTE4Mi40IDMxLjMtMTIuNy0zLjQtMjQtOS45LTM0LjQtMTcuOUw0OCA0OTZjLTguOCA4LjgtMjMuMiA4LjgtMzIgMHMtOC44LTIzLjIgMC0zMmw4MC04MCAuNSAuNWMuNy0xLjMgMS42LTIuNSAyLjctMy42TDI1NiAyMjRjOC44LTguOCA4LjgtMjMuMiAwLTMycy0yMy4yLTguOC0zMiAwTDg5LjcgMzI2LjJjLTguOSA4LjktMjQgNC40LTI1LTguMi00LjMtNTMuMiA5LjMtMTIzLjEgNzIuNi0xODYuNCA5MS4xLTkxLjEgMjU0LjItMTI0LjcgMzM3LjktMTMxLjV6Il0KICAgIH07CiAgICBmYUZlYXRoZXJBbHQgPSBmYUZlYXRoZXJQb2ludGVkOwogICAgZmFGaWxlQ2lyY2xlUXVlc3Rpb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1jaXJjbGUtcXVlc3Rpb24iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRlZiIsICJNOTYgMEM2MC43IDAgMzIgMjguNyAzMiA2NGwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxODAgMGMtMjIuNy0zMS41LTM2LTcwLjItMzYtMTEyIDAtMTAwLjYgNzcuNC0xODMuMiAxNzYtMTkxLjNsMC0zOC4xYzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI5MC43IDE4LjdDMjc4LjcgNi43IDI2Mi41IDAgMjQ1LjUgMEw5NiAwek0zNTcuNSAxNzZMMjY0IDE3NmMtMTMuMyAwLTI0LTEwLjctMjQtMjRMMjQwIDU4LjUgMzU3LjUgMTc2ek00MzIgNTQ0YTE0NCAxNDQgMCAxIDAgMC0yODggMTQ0IDE0NCAwIDEgMCAwIDI4OHptMC0xMDBhMjAgMjAgMCAxIDEgMCA0MCAyMCAyMCAwIDEgMSAwLTQwem0wLTEwMGMtMTEuNiAwLTIxLjMgOC4yLTIzLjUgMTkuMi0xLjggOC43LTEwLjIgMTQuMy0xOC45IDEyLjVzLTE0LjMtMTAuMi0xMi41LTE4LjljNS4yLTI1LjYgMjcuOC00NC44IDU0LjktNDQuOCAzMC45IDAgNTYgMjUuMSA1NiA1NiAwIDE5LjgtMTEuNyAzNy44LTI5LjggNDUuOWwtMTAuNCA0LjZjLTEuMiA3LjctNy44IDEzLjUtMTUuOCAxMy41LTguOCAwLTE2LTcuMi0xNi0xNiAwLTExLjIgNi42LTIxLjMgMTYuOC0yNS45bDEyLjQtNS41YzYuNi0yLjkgMTAuOC05LjQgMTAuOC0xNi42IDAtMTMuMy0xMC43LTI0LTI0LTI0eiJdCiAgICB9OwogICAgZmFTaWduYXR1cmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2lnbmF0dXJlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY1YjciLCAiTTE5MiAxMjhjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDcuOGMwIDI3LjctMi40IDU1LjMtNy4xIDgyLjVsLTg0LjQgMjUuM2MtNDAuNiAxMi4yLTY4LjQgNDkuNi02OC40IDkybDAgMzIuNC03MiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDcyLjUgMGM0LjIgMzYgMzQuOCA2NCA3MiA2NCAyNiAwIDUwLTEzLjkgNjIuOS0zNi41bDEzLjktMjQuM2MyNi44LTQ3IDQ2LjUtOTcuNyA1OC40LTE1MC41bDk0LjQtMjguMy0xMi41IDM3LjVjLTMuMyA5LjgtMS42IDIwLjUgNC40IDI4LjhTNDA1LjcgMzIwIDQxNiAzMjBsMTI4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTgzLjYgMCAxOC01My45YzMuOC0xMS4zIC45LTIzLjgtNy40LTMyLjRzLTIwLjctMTEuOC0zMi4yLTguNEwzMTYuNCAxOTguMWMyLjQtMjAuNyAzLjYtNDEuNCAzLjYtNjIuM2wwLTcuOGMwLTUzLTQzLTk2LTk2LTk2cy05NiA0My05NiA5NmwwIDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zMnptLTkuMiAxNzdsNDktMTQuN2MtMTAuNCAzMy44LTI0LjUgNjYuNC00Mi4xIDk3LjJsLTEzLjkgMjQuM2MtMS41IDIuNi00LjMgNC4zLTcuNCA0LjMtNC43IDAtOC41LTMuOC04LjUtOC41bDAtNzEuOWMwLTE0LjEgOS4zLTI2LjYgMjIuOC0zMC43ek02MTYgNDE2YzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0yOTIuOSAwYy02LjUgMTYuMy0xMy43IDMyLjMtMjEuNiA0OEw2MTYgNDE2eiJdCiAgICB9OwogICAgZmFFYXJ0aEFtZXJpY2FzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImVhcnRoLWFtZXJpY2FzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3NzU4LCAiZWFydGgiLCAiZWFydGgtYW1lcmljYSIsICJnbG9iZS1hbWVyaWNhcyJdLCAiZjU3ZCIsICJNNTUuNyAxOTkuN2wzMC45IDMwLjljNiA2IDE0LjEgOS40IDIyLjYgOS40bDIxLjUgMGM4LjUgMCAxNi42IDMuNCAyMi42IDkuNGwyOS4zIDI5LjNjNiA2IDkuNCAxNC4xIDkuNCAyMi42bDAgMzcuNWMwIDguNSAzLjQgMTYuNiA5LjQgMjIuNmwxMy4zIDEzLjNjNiA2IDkuNCAxNC4xIDkuNCAyMi42bDAgMTguN2MwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMi43YzAtOC41IDMuNC0xNi42IDkuNC0yMi42bDQ1LjMtNDUuM2M2LTYgOS40LTE0LjEgOS40LTIyLjZsMC0zNC43YzAtMTcuNy0xNC4zLTMyLTMyLTMybC04Mi43IDBjLTguNSAwLTE2LjYtMy40LTIyLjYtOS40bC0xNi0xNmMtNC4yLTQuMi02LjYtMTAtNi42LTE2IDAtMTIuNSAxMC4xLTIyLjYgMjIuNi0yMi42bDM0LjcgMGMxMi41IDAgMjIuNi0xMC4xIDIyLjYtMjIuNiAwLTYtMi40LTExLjgtNi42LTE2bC0xOS43LTE5LjdDMjQyIDEzMCAyNDAgMTI1LjEgMjQwIDEyMHMyLTEwIDUuNy0xMy43bDE3LjMtMTcuM2M1LjgtNS44IDkuMS0xMy43IDkuMS0yMS45IDAtNy4yLTIuNC0xMy43LTYuNC0xOC45LTMuMi0uMS02LjQtLjItOS42LS4yLTk1LjQgMC0xNzUuNyA2NC4yLTIwMC4zIDE1MS43ek00NjQgMjU2YzAtMzQuNi04LjQtNjcuMi0yMy40LTk1LjgtNi40IC45LTEyLjcgMy45LTE3LjkgOS4xbC0xMy40IDEzLjRjLTYgNi05LjQgMTQuMS05LjQgMjIuNmwwIDM0LjdjMCAxNy43IDE0LjMgMzIgMzIgMzJsMjQuMSAwYzIuNSAwIDUtLjMgNy4zLS44IC40LTUgLjUtMTAuMSAuNS0xNS4yek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAweiJdCiAgICB9OwogICAgZmFFYXJ0aCA9IGZhRWFydGhBbWVyaWNhczsKICAgIGZhRWFydGhBbWVyaWNhID0gZmFFYXJ0aEFtZXJpY2FzOwogICAgZmFHbG9iZUFtZXJpY2FzID0gZmFFYXJ0aEFtZXJpY2FzOwogICAgZmFDYXJyb3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2Fycm90IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI5MzY1XSwgImY3ODciLCAiTTQ1My4xLTM2LjdMNDQwLjktMjQuNmMtMzEuMiAzMS4yLTMxLjIgODEuOSAwIDExMy4xIDE1LjYgMTUuNiAzMS4yIDMxLjIgNDYuOSA0Ni45IDMxLjIgMzEuMiA4MS45IDMxLjIgMTEzLjEgMGwxMi4xLTEyLjFjNi4yLTYuMiA2LjItMTYuNCAwLTIyLjZMNjAwLjkgODguNmMtMzEuMi0zMS4yLTgxLjktMzEuMi0xMTMuMSAwIDMxLjItMzEuMiAzMS4yLTgxLjkgMC0xMTMuMUw0NzUuNy0zNi43Yy02LjItNi4yLTE2LjQtNi4yLTIyLjYgMHpNMzMxLjYgOTZjLTQ1LjIgMC04Ny4xIDIwLjQtMTE1IDU0LjNMMjczLjMgMjA3YzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBMMTkxLjYgMTkzLjIgNjcuMiA0NjYuOGMtNS41IDEyLjEtMi45IDI2LjQgNi41IDM1LjlzMjMuNyAxMiAzNS45IDYuNWwxNDEuNi02NC40LTQzLjgtNDMuOGMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDU2LjUgNTYuNSA5NS4zLTQzLjNjNTMuMS0yNC4xIDg3LjItNzcuMSA4Ny4yLTEzNS41IDAtODIuMi02Ni42LTE0OC44LTE0OC44LTE0OC44eiJdCiAgICB9OwogICAgZmFUZW1wZXJhdHVyZUZ1bGwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGVtcGVyYXR1cmUtZnVsbCIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWyJ0ZW1wZXJhdHVyZS00IiwgInRoZXJtb21ldGVyLTQiLCAidGhlcm1vbWV0ZXItZnVsbCJdLCAiZjJjNyIsICJNMTYwIDBDMTA3IDAgNjQgNDMgNjQgOTZsMCAxNjQuN0MzNC41IDI4NyAxNiAzMjUuNCAxNiAzNjggMTYgNDQ3LjUgODAuNSA1MTIgMTYwIDUxMnMxNDQtNjQuNSAxNDQtMTQ0YzAtNDIuNi0xOC41LTgxLTQ4LTEwNy4zTDI1NiA5NmMwLTUzLTQzLTk2LTk2LTk2em02NCAzNjhjMCAzNS4zLTI4LjcgNjQtNjQgNjRzLTY0LTI4LjctNjQtNjRjMC0yNi45IDE2LjUtNDkuOSA0MC01OS4zTDEzNiA5NmMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgMjEyLjdjMjMuNSA5LjUgNDAgMzIuNSA0MCA1OS4zeiJdCiAgICB9OwogICAgZmFUZW1wZXJhdHVyZTQgPSBmYVRlbXBlcmF0dXJlRnVsbDsKICAgIGZhVGhlcm1vbWV0ZXI0ID0gZmFUZW1wZXJhdHVyZUZ1bGw7CiAgICBmYVRoZXJtb21ldGVyRnVsbCA9IGZhVGVtcGVyYXR1cmVGdWxsOwogICAgZmFUYWJsZUNlbGxzUm93TG9jayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWJsZS1jZWxscy1yb3ctbG9jayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNjdhIiwgIk0yNTYgMjg4bDAtNjQgMTUzLjMgMGMxNy4xLTQyLjIgNTYtNzMuMiAxMDIuNy03OWwwLTQ5YzAtMzUuMy0yOC43LTY0LTY0LTY0TDEyOCAzMkM5Mi43IDMyIDY0IDYwLjcgNjQgOTZsMCAzMjBjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjQxLjMgMGMtLjktNS4yLTEuMy0xMC42LTEuMy0xNi4xbDAtNDcuOS0xMTIgMCAwLTY0IDExMy4zIDBjMy43LTIyIDE0LjgtNDEuNCAzMC43LTU1LjZsMC04LjQtMTQ0IDB6bTAtMTkybDE5MiAwIDAgNjQtMTkyIDAgMC02NHpNNTYwIDI3Mi4xbDAgNDcuOS02NCAwIDAtNDcuOWMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMyek00MTYgMzY4bDAgOTZjMCAyNi41IDIxLjUgNDggNDggNDhsMTI4IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC05NmMwLTIwLjktMTMuNC0zOC43LTMyLTQ1LjNsMC01MC42YzAtNDQuMi0zNS44LTgwLTgwLTgwcy04MCAzNS44LTgwIDgwbDAgNTAuNmMtMTguNiA2LjYtMzIgMjQuNC0zMiA0NS4zeiJdCiAgICB9OwogICAgZmFCb2x0TGlnaHRuaW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvbHQtbGlnaHRuaW5nIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImUwYjciLCAiTTAgMjU2TDI4LjUgMjhjMi0xNiAxNS42LTI4IDMxLjgtMjhMMjI4LjkgMGMxNSAwIDI3LjEgMTIuMSAyNy4xIDI3LjEgMCAzLjItLjYgNi41LTEuNyA5LjVMMjA4IDE2MCAzNDcuMyAxNjBjMjAuMiAwIDM2LjcgMTYuNCAzNi43IDM2LjcgMCA3LjQtMi4yIDE0LjYtNi40IDIwLjdsLTE5Mi4yIDI4MWMtNS45IDguNi0xNS42IDEzLjctMjUuOSAxMy43bC0yLjkgMGMtMTUuNyAwLTI4LjUtMTIuOC0yOC41LTI4LjUgMC0yLjMgLjMtNC42IC45LTYuOUwxNzYgMjg4IDMyIDI4OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6Il0KICAgIH07CiAgICBmYUNsb3VkU2hvd2Vyc1dhdGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNsb3VkLXNob3dlcnMtd2F0ZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTRlNCIsICJNMjc5LjIgNTUuN0MyNjMuOSAyMi44IDIzMC42IDAgMTkyIDAgMTM5IDAgOTYgNDMgOTYgOTYgNjAuNyA5NiAzMiAxMjQuNyAzMiAxNjBzMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NHMtMjguNy02NC02NC02NGwtMS42IDBjLTcuNC0zNi41LTM5LjctNjQtNzguNC02NC0yMi4yIDAtNDIuMyA5LjEtNTYuOCAyMy43ek00MTAuNiA0NzYuMWMyMC43IDE1LjYgNDYgMzAuNyA3NC4yIDM0LjUgMTMuMSAxLjggMjUuMi03LjUgMjctMjAuNnMtNy41LTI1LjItMjAuNi0yN2MtMTUuOS0yLjEtMzMuMi0xMS4zLTUxLjctMjUuMi0zOC40LTI5LTkwLjUtMjktMTI5IDAtMjQgMTguMS00MC43IDI2LjMtNTQuNSAyNi4zcy0zMC41LTguMi01NC41LTI2LjNjLTM4LjQtMjktOTAuNS0yOS0xMjkgMC0xOC41IDEzLjktMzUuOCAyMy4xLTUxLjcgMjUuMi0xMy4xIDEuOC0yMi40IDEzLjgtMjAuNiAyN3MxMy44IDIyLjQgMjcgMjAuNmMyOC4yLTMuOCA1My42LTE4LjkgNzQuMi0zNC41IDIxLjMtMTYuMSA0OS45LTE2LjEgNzEuMiAwIDI0LjIgMTguMyA1Mi4zIDM1LjkgODMuNCAzNS45czU5LjEtMTcuNyA4My40LTM1LjljMjEuMy0xNi4xIDQ5LjktMTYuMSA3MS4yIDB6TTEwMC4xIDMwMy42YzQuMi0xMi42LTIuNi0yNi4yLTE1LjItMzAuNHMtMjYuMiAyLjYtMzAuNCAxNS4ybC0yMS4zIDY0QzI5IDM2NSAzNS44IDM3OC42IDQ4LjQgMzgyLjhzMjYuMi0yLjYgMzAuNC0xNS4ybDIxLjMtNjR6bTEyMCAwYzQuMi0xMi42LTIuNi0yNi4yLTE1LjItMzAuNHMtMjYuMiAyLjYtMzAuNCAxNS4ybC0yMS4zIDY0Yy00LjIgMTIuNiAyLjYgMjYuMiAxNS4yIDMwLjRzMjYuMi0yLjYgMzAuNC0xNS4ybDIxLjMtNjR6bTExMiAwYzQuMi0xMi42LTIuNi0yNi4yLTE1LjItMzAuNHMtMjYuMiAyLjYtMzAuNCAxNS4ybC0yMS4zIDY0Yy00LjIgMTIuNiAyLjYgMjYuMiAxNS4yIDMwLjRzMjYuMi0yLjYgMzAuNC0xNS4ybDIxLjMtNjR6bTEyMCAwYzQuMi0xMi42LTIuNi0yNi4yLTE1LjItMzAuNHMtMjYuMiAyLjYtMzAuNCAxNS4ybC0yMS4zIDY0Yy00LjIgMTIuNiAyLjYgMjYuMiAxNS4yIDMwLjRzMjYuMi0yLjYgMzAuNC0xNS4ybDIxLjMtNjR6Il0KICAgIH07CiAgICBmYUFycm93VXBMb25nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXVwLWxvbmciLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFsibG9uZy1hcnJvdy11cCJdLCAiZjE3NiIsICJNMTgyLjYtMjIuNmMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTEyOCAxMjhjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBMMTI4IDc3LjMgMTI4IDUxMmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtNDM0LjcgNzMuNCA3My40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTEyOC0xMjh6Il0KICAgIH07CiAgICBmYUxvbmdBcnJvd1VwID0gZmFBcnJvd1VwTG9uZzsKICAgIGZhQWRkcmVzc0NhcmQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFkZHJlc3MtY2FyZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzYyMTQwLCAiY29udGFjdC1jYXJkIiwgInZjYXJkIl0sICJmMmJiIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDQ0OCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyem04MCAyNTZsNjQgMGM0NC4yIDAgODAgMzUuOCA4MCA4MCAwIDguOC03LjIgMTYtMTYgMTZMODAgMzg0Yy04LjggMC0xNi03LjItMTYtMTYgMC00NC4yIDM1LjgtODAgODAtODB6bS0yNC05NmE1NiA1NiAwIDEgMSAxMTIgMCA1NiA1NiAwIDEgMSAtMTEyIDB6bTI0MC00OGwxMTIgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTEyIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6bTAgOTZsMTEyIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTExMiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFDb250YWN0Q2FyZDIgPSBmYUFkZHJlc3NDYXJkMjsKICAgIGZhVmNhcmQyID0gZmFBZGRyZXNzQ2FyZDI7CiAgICBmYUFuZ2xlUmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYW5nbGUtcmlnaHQiLAogICAgICBpY29uOiBbMjU2LCA1MTIsIFs4MjUwXSwgImYxMDUiLCAiTTI0Ny4xIDIzMy40YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zbC0xNjAgMTYwYy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM0wxNzkuMiAyNTYgNDEuOSAxMTguNmMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMGwxNjAgMTYweiJdCiAgICB9OwogICAgZmFGYWNlTWVoMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLW1laCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODUyOCwgIm1laCJdLCAiZjExYSIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTE3NiAxNzZhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em0xMjggMzJhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHpNMTc2IDMyMGwxNjAgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTYwIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYU1laDIgPSBmYUZhY2VNZWgyOwogICAgZmFBcnJvd1VwRnJvbUdyb3VuZFdhdGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXVwLWZyb20tZ3JvdW5kLXdhdGVyIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU0YjUiLCAiTTMwMyA3YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwbDg4IDg4YzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTQ3LTQ3IDAgMjc4LjFjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0yNzguMS00NyA0N2MtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOUwzMDMgN3pNMjQwIDE5MmwwIDE2My4xYy0xMC42LTIuMi0yMS4zLTMuMi0zMi0zLjEtMzIuNSAuMi02NC45IDEwLjctOTIuMyAzMS40LTguOCA2LjYtMTUuOSAxMC45LTIxLjcgMTMuNWwtLjggLjRjLTMuNyAxLjctNi40IDIuOS05LjggLjMtNi00LjUtMTIuNi04LTE5LjMtMTAuNEw2NCAyNDBjMC0yNi41IDIxLjUtNDggNDgtNDhsMTI4IDB6bTMzNiA0OGwwIDE1NS4yYy0xLjEgLjgtMi4yIDEuNS0zLjMgMi40LTQuMSAzLjEtOC4zIC44LTEyLjYtMS41LS42LS4zLTEuMi0uNi0xLjgtMS01LjItMi43LTExLjEtNi42LTE4LTExLjctMjguMS0yMS4xLTYxLjMtMzEuNi05NC40LTMxLjQtMTUuNSAuMS0zMSAyLjUtNDYgNy4zbDAtMTY3LjMgMTI4IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDh6TTQwMy40IDQ3Ni4xQzM3OS4xIDQ5NC4zIDM1MS4xIDUxMiAzMjAgNTEycy01OS4xLTE3LjctODMuNC0zNS45Yy0yMS4zLTE2LjEtNDkuOS0xNi4xLTcxLjIgMC0yMy44IDE3LjktNTQuMSAzNS41LTg4LjEgMzUuMy0yMC40LS4xLTQwLjctNi43LTU5LjgtMjEuMS0xMC42LTgtMTIuNy0yMy00LjctMzMuNnMyMy0xMi43IDMzLjYtNC43YzExLjMgOC41IDIxLjYgMTEuNCAzMS4yIDExLjUgMTcuNiAuMSAzNy4zLTkuNCA1OC45LTI1LjcgMzguNC0yOSA5MC41LTI5IDEyOSAwIDI0IDE4LjEgNDAuNyAyNi4zIDU0LjUgMjYuM3MzMC41LTguMiA1NC41LTI2LjNjMzguNC0yOSA5MC41LTI5IDEyOSAwIDE2LjkgMTIuNyAzMi45IDIxLjUgNDcuOCAyNC42IDEzLjcgMi44IDI3LjQgLjkgNDIuMy0xMC4zIDEwLjYtOCAyNS42LTUuOSAzMy42IDQuN3M1LjkgMjUuNi00LjcgMzMuNmMtMjYuNCAxOS45LTU0LjIgMjQuNC04MC43IDE5LjEtMjUuMy01LjEtNDguMS0xOC45LTY3LjItMzMuMy0yMS4zLTE2LjEtNDkuOS0xNi4xLTcxLjIgMHoiXQogICAgfTsKICAgIGZhTWFwMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtYXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MDYsIDYyMDcyXSwgImYyNzkiLCAiTTUxMiA0OGMwLTExLjEtNS43LTIxLjQtMTUuMi0yNy4ycy0yMS4yLTYuNC0zMS4xLTEuNEwzNDkuNSA3Ny41IDE3MC4xIDE3LjZjLTguMS0yLjctMTYuOC0yLjEtMjQuNCAxLjdsLTEyOCA2NEM2LjggODguOCAwIDk5LjkgMCAxMTJMMCA0NjRjMCAxMS4xIDUuNyAyMS40IDE1LjIgMjcuMnMyMS4yIDYuNCAzMS4xIDEuNGwxMTYuMS01OC4xIDE3OS40IDU5LjhjOC4xIDIuNyAxNi44IDIuMSAyNC40LTEuN2wxMjgtNjRjMTAuOC01LjQgMTcuNy0xNi41IDE3LjctMjguNmwwLTM1MnpNMTkyIDM3Ni45bDAtMjg0LjUgMTI4IDQyLjcgMCAyODQuNS0xMjgtNDIuN3oiXQogICAgfTsKICAgIGZhVXNlclBsdXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlci1wbHVzIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYyMzQiLCAiTTI4NS43IDMwNGM5OC41IDAgMTc4LjMgNzkuOCAxNzguMyAxNzguMyAwIDE2LjQtMTMuMyAyOS43LTI5LjcgMjkuN0w3Ny43IDUxMkM2MS4zIDUxMiA0OCA0OTguNyA0OCA0ODIuMyA0OCAzODMuOCAxMjcuOCAzMDQgMjI2LjMgMzA0bDU5LjQgMHpNNTI4IDgwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgNDggNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNDggMCAwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNDgtNDggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGw0OCAwIDAtNDhjMC0xMy4zIDEwLjctMjQgMjQtMjR6TTI1NiAyNDhhMTIwIDEyMCAwIDEgMSAwLTI0MCAxMjAgMTIwIDAgMSAxIDAgMjQweiJdCiAgICB9OwogICAgZmFWZW51cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ2ZW51cyIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzk3OTJdLCAiZjIyMSIsICJNODAgMTc2YTExMiAxMTIgMCAxIDEgMjI0IDAgMTEyIDExMiAwIDEgMSAtMjI0IDB6TTIyMy45IDM0OS4xQzMwNS45IDMzNC4xIDM2OCAyNjIuMyAzNjggMTc2IDM2OCA3OC44IDI4OS4yIDAgMTkyIDBTMTYgNzguOCAxNiAxNzZjMCA4Ni4zIDYyLjEgMTU4LjEgMTQ0LjEgMTczLjEtLjEgMS0uMSAxLjktLjEgMi45bDAgNjQtMzIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzMiAwIDAgMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTMyIDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTMyIDAgMC02NGMwLTEgMC0xLjktLjEtMi45eiJdCiAgICB9OwogICAgZmFEaWFncmFtU3VjY2Vzc29yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRpYWdyYW0tc3VjY2Vzc29yIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU0N2EiLCAiTTI4OS4yIDEzNy45YzIuNS02IDguMy05LjkgMTQuOC05LjlsNDAgMCAwLTI0YzAtMTMuMy0xMC43LTI0LTI0LTI0bC05OCAwYzEuMyA1LjEgMiAxMC41IDIgMTZsMCA2NGMwIDM1LjMtMjguNyA2NC02NCA2NGwtOTYgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwyNTYgMGMzOS44IDAgNzIgMzIuMiA3MiA3MmwwIDI0IDQwIDBjNi41IDAgMTIuMyAzLjkgMTQuOCA5LjlzMS4xIDEyLjktMy41IDE3LjRsLTY0IDY0Yy02LjIgNi4yLTE2LjQgNi4yLTIyLjYgMGwtNjQtNjRjLTQuNi00LjYtNS45LTExLjUtMy41LTE3LjR6TTM4NCA0ODBMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTY0YzAtMzUuMyAyOC43LTY0IDY0LTY0bDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgNjRjMCAzNS4zLTI4LjcgNjQtNjQgNjR6TTE2MCAxNjBsMC02NC05NiAwIDAgNjQgOTYgMHoiXQogICAgfTsKICAgIGZhSGVhZFNpZGVDb3VnaFNsYXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhlYWQtc2lkZS1jb3VnaC1zbGFzaCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlMDYyIiwgIk01MzUtMjQuOWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjlMNDEgNTM3LjFjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsMjUtMjUgMC00NDcuMmMwLTE1IDEwLjUtMjguMyAyNS40LTI5LjggNy40LS43IDE0LjktMS4xIDIyLjYtMS4xIDExMi43IDAgMjA2IDgzLjMgMjIxLjcgMTkxLjcgLjQgMyAxLjcgNS45IDMuNiA4LjNsMi4yIDIuNiAyMjcuNS0yMjcuNXpNMTMzLjggNTEyTDI4OCAzNTcuOCAyODggNDE2YzAgNTMtNDMgOTYtOTYgOTZsLTU4LjIgMHpNMTc2IDIyNGEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6bTMzNiA0MGEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6bS04OCA3MmEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwem0tNjQgNDhhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHptMTI4IDBhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHptMjQgNzJhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4em0tODgtMjRhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHoiXQogICAgfTsKICAgIGZhRGlhZ3JhbVByb2plY3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZGlhZ3JhbS1wcm9qZWN0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInByb2plY3QtZGlhZ3JhbSJdLCAiZjU0MiIsICJNMCA4MEMwIDUzLjUgMjEuNSAzMiA0OCAzMmw5NiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMTYgMTI4IDAgMC0xNmMwLTI2LjUgMjEuNS00OCA0OC00OGw5NiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgOTZjMCAyNi41LTIxLjUgNDgtNDggNDhsLTk2IDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMTYtMTI4IDAgMCAxNmMwIDcuMy0xLjcgMTQuMy00LjYgMjAuNWw2OC42IDkxLjUgODAgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDk2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC05NiAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTk2YzAtNy4zIDEuNy0xNC4zIDQuNi0yMC41TDEyOCAyMjQgNDggMjI0Yy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDgweiJdCiAgICB9OwogICAgZmFQcm9qZWN0RGlhZ3JhbSA9IGZhRGlhZ3JhbVByb2plY3Q7CiAgICBmYVRlcm1pbmFsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRlcm1pbmFsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxMjAiLCAiTTkuNCAxMTguNmMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMGwxNjAgMTYwYzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zbC0xNjAgMTYwYy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM0wxNDYuNyAyNTYgOS40IDExOC42ek0yMjQgMzg0bDI1NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0yNTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMnoiXQogICAgfTsKICAgIGZhSG91c2VGaXJlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLWZpcmUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTUwYyIsICJNNDQ4IDE5MmMxNC4xIC40IDIzLjggMTEuNCAzMi43IDIxLjcgMiAyLjMgNCA0LjYgNiA2LjdsMTkgMTkuOSAxMi4yLTEzLjhjNS40LTYuMSAxMy4zLTguOSAyMC45LTguOSA3LjIgMCAxNC4zIDIuNiAxOS45IDcuOCAxOS43IDE4LjMgMzkuOCA0My4yIDU1IDcwLjYgMTUuMSAyNy4yIDI2LjIgNTguMiAyNi4yIDg4LjIgMCA4OC43LTcxLjMgMTU5LjgtMTYwIDE1OS44LTg5LjYgMC0xNjAtNzEuMy0xNjAtMTU5LjggMC0zNy4zIDE2LTczLjQgMzYuOC0xMDQuNSAyMC45LTMxLjMgNDcuNS01OSA3MC45LTgwLjEgNS43LTUuMiAxMy4xLTcuNyAyMC4zLTcuNXpNMjY4LjYgNi41YzEyLjItOS4zIDI5LjctOC43IDQxLjIgMmwxNDcuNSAxMzdjLTE5LjItNC4zLTQwIC41LTU1LjUgMTQuNC0zNi40IDMyLjYtNjcuNyA2OS44LTkwLjMgMTA2LjQtMTAuMyAxNi42LTE5LjcgMzQuOS0yNi44IDUzLjdMMjcyIDMyMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCA5NiA2NC42IDBjNy4zIDE3LjIgMTYuOCAzMy40IDI4LjIgNDhMMTQ0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0xNzYtMTYgMGMtMTMuMiAwLTI1LTguMS0yOS44LTIwLjNzLTEuNi0yNi4yIDgtMzUuMWwyMjQtMjA4IDIuNC0yek00ODkuMyAzNDMuN2MtNS40LTQuNy0xMy4xLTQuNy0xOC41IDAtMTcuNyAxNS40LTU0LjcgNTEuOS01NC43IDg4LjQgMCAzNS4zIDI4LjcgNjQgNjQgNjRzNjQtMjguNyA2NC02NGMwLTM2LjUtMzctNzMtNTQuNy04OC40eiJdCiAgICB9OwogICAgZmFNYXNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hc2siLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjZmYSIsICJNMjg4IDY0QzY0IDY0IDAgMTYwIDAgMjcyUzgwIDQ0OCAxNzYgNDQ4bDguNCAwYzI0LjIgMCA0Ni40LTEzLjcgNTcuMi0zNS40bDIzLjItNDYuM2M0LjQtOC44IDEzLjMtMTQuMyAyMy4yLTE0LjNzMTguOCA1LjUgMjMuMiAxNC4zbDIzLjIgNDYuM2MxMC44IDIxLjcgMzMgMzUuNCA1Ny4yIDM1LjRsOC40IDBjOTYgMCAxNzYtNjQgMTc2LTE3NlM1MTIgNjQgMjg4IDY0ek05NiAyNTZhNjQgNjQgMCAxIDEgMTI4IDAgNjQgNjQgMCAxIDEgLTEyOCAwem0zMjAtNjRhNjQgNjQgMCAxIDEgMCAxMjggNjQgNjQgMCAxIDEgMC0xMjh6Il0KICAgIH07CiAgICBmYUh1cnJpY2FuZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJodXJyaWNhbmUiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjc1MSIsICJNMCAyMDhDMCAxMDQuNCA3NS43IDE4LjUgMTc0LjkgMi42IDE4NCAxLjIgMTkyIDguNiAxOTIgMTcuOWwwIDYzLjNjMCA4LjQgNi41IDE1LjMgMTQuNyAxNi41IDEwMC4zIDE0LjkgMTc3LjMgMTAxLjMgMTc3LjMgMjA1LjcgMCAxMDMuNi03NS43IDE4OS41LTE3NC45IDIwNS40LTkuMiAxLjUtMTcuMS01LjktMTcuMS0xNS4ybDAtNjMuM0MxOTIgNDIxLjkgMTg1LjUgNDE1IDE3Ny4zIDQxMy43IDc3IDM5OC45IDAgMzEyLjQgMCAyMDh6bTI4OCA0OGE5NiA5NiAwIDEgMCAtMTkyIDAgOTYgOTYgMCAxIDAgMTkyIDB6bS05Ni0zMmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYUVhcnRoQWZyaWNhID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImVhcnRoLWFmcmljYSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyNzc1NywgImdsb2JlLWFmcmljYSJdLCAiZjU3YyIsICJNNDQ3LjYgMTc1Yy0zMS42LTc0LjYtMTA1LjUtMTI3LTE5MS42LTEyNy0yMi4xIDAtNDMuNCAzLjUtNjMuNCA5LjgtLjQgMi0uNiA0LjEtLjYgNi4ybDAgNzMuNGMwIDEyLjUgMTAuMSAyMi42IDIyLjYgMjIuNiA2IDAgMTEuOC0yLjQgMTYtNi42bDE2LTE2YzYtNiAxNC4xLTkuNCAyMi42LTkuNGw1LjUgMGMyOC41IDAgNDIuOCAzNC41IDIyLjYgNTQuNi02IDYtMTQuMSA5LjQtMjIuNiA5LjRsLTYxLjUgMGMtOC41IDAtMTYuNiAzLjQtMjIuNiA5LjRsLTIxLjMgMjEuM2MtNiA2LTkuNCAxNC4xLTkuNCAyMi42bDAgNDIuN2MwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJsMi43IDBjOC41IDAgMTYuNi0zLjQgMjIuNi05LjRsMjkuMy0yOS4zYzYtNiA5LjQtMTQuMSA5LjQtMjIuNmwwLTE4LjdjMC04LjggNy4yLTE2IDE2LTE2czE2LTcuMiAxNi0xNmwwLTM0LjdjMC04LjUtMy40LTE2LjYtOS40LTIyLjZsLTE2LTE2Yy00LjItNC4yLTYuNi0xMC02LjYtMTYgMC0xMi41IDEwLjEtMjIuNiAyMi42LTIyLjZsNDUgMGMxMi40IDAgMjIuNy03LjEgMjgtMTd6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6Il0KICAgIH07CiAgICBmYUdsb2JlQWZyaWNhID0gZmFFYXJ0aEFmcmljYTsKICAgIGZhVGh1bWJ0YWNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRodW1idGFjayIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyODIwNCwgMTI4MzkyLCAidGh1bWItdGFjayJdLCAiZjA4ZCIsICJNMzIgMzJDMzIgMTQuMyA0Ni4zIDAgNjQgMEwzMjAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMjkuNSAwIDEwLjMgMTM0LjFjMzcuMSAyMS4yIDY1LjggNTYuNCA3OC4yIDk5LjdsMy44IDEzLjRjMi44IDkuNyAuOCAyMC01LjIgMjguMVMzNjIgMzUyIDM1MiAzNTJMMzIgMzUyYy0xMCAwLTE5LjUtNC43LTI1LjUtMTIuN3MtOC0xOC40LTUuMi0yOC4xTDUgMjk3LjhjMTIuNC00My4zIDQxLTc4LjUgNzguMi05OS43TDkzLjUgNjQgNjQgNjRDNDYuMyA2NCAzMiA0OS43IDMyIDMyek0xNjAgNDAwbDY0IDAgMCAxMTJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xMTJ6Il0KICAgIH07CiAgICBmYVRodW1iVGFjayA9IGZhVGh1bWJ0YWNrOwogICAgZmFIYW5kUG9pbnREb3duMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kLXBvaW50LWRvd24iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjBhNyIsICJNMzIgNDgwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yMDgtNjQgMCAwIDIwOHpNMjI0IDMyMGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtNjRjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA2NHptLTY0IDY0YzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNDhjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnptMTYwLTk2YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDY0em0tOTYtODhsMCAuNmM5LjQtNS40IDIwLjMtOC42IDMyLTguNiAxMy4yIDAgMjUuNCA0IDM1LjYgMTAuOCA4LjctMjQuOSAzMi41LTQyLjggNjAuNC00Mi44IDExLjcgMCAyMi42IDMuMSAzMiA4LjZsMC04LjZDMzg0IDcxLjYgMzEyLjQgMCAyMjQgMEwxNjIuMyAwQzExOS44IDAgNzkuMSAxNi45IDQ5LjEgNDYuOUwzNy41IDU4LjVDMTMuNSA4Mi41IDAgMTE1LjEgMCAxNDlsMCAyN2MwIDM1LjMgMjguNyA2NCA2NCA2NGw4OCAwYzIyLjEgMCA0MC0xNy45IDQwLTQwcy0xNy45LTQwLTQwLTQwbC01NiAwYy04LjggMC0xNi03LjItMTYtMTZzNy4yLTE2IDE2LTE2bDU2IDBjMzkuOCAwIDcyIDMyLjIgNzIgNzJ6Il0KICAgIH07CiAgICBmYUZhY2VNZWhCbGFuazIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1tZWgtYmxhbmsiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1NjYsICJtZWgtYmxhbmsiXSwgImY1YTQiLCAiTTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTIwOC00OGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem0xMjggMzJhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFNZWhCbGFuazIgPSBmYUZhY2VNZWhCbGFuazI7CiAgICBmYVRlbXBlcmF0dXJlRW1wdHkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGVtcGVyYXR1cmUtZW1wdHkiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFsidGVtcGVyYXR1cmUtMCIsICJ0aGVybW9tZXRlci0wIiwgInRoZXJtb21ldGVyLWVtcHR5Il0sICJmMmNiIiwgIk02NCA5NmMwLTUzIDQzLTk2IDk2LTk2czk2IDQzIDk2IDk2bDAgMTY0LjdjMjkuNSAyNi40IDQ4IDY0LjcgNDggMTA3LjMgMCA3OS41LTY0LjUgMTQ0LTE0NCAxNDRTMTYgNDQ3LjUgMTYgMzY4YzAtNDIuNiAxOC41LTgxIDQ4LTEwNy4zTDY0IDk2em05NiAzMzZjMzUuMyAwIDY0LTI4LjcgNjQtNjRzLTI4LjctNjQtNjQtNjQtNjQgMjguNy02NCA2NCAyOC43IDY0IDY0IDY0eiJdCiAgICB9OwogICAgZmFUZW1wZXJhdHVyZTAgPSBmYVRlbXBlcmF0dXJlRW1wdHk7CiAgICBmYVRoZXJtb21ldGVyMCA9IGZhVGVtcGVyYXR1cmVFbXB0eTsKICAgIGZhVGhlcm1vbWV0ZXJFbXB0eSA9IGZhVGVtcGVyYXR1cmVFbXB0eTsKICAgIGZhQm9yZGVyTm9uZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib3JkZXItbm9uZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmODUwIiwgIk0zMiA0MTZjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzIgMzItMTQuMyAzMi0zMi0xNC4zLTMyLTMyLTMyek0xNjAgMzJhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDEgMCAwLTY0ek0yODggNDE2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMyIDMyLTE0LjMgMzItMzItMTQuMy0zMi0zMi0zMnpNMTYwIDQ4MGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMi0zMiAxNC4zLTMyIDMyIDE0LjMgMzIgMzIgMzJ6TTI4OCAzMmEzMiAzMiAwIDEgMCAwIDY0IDMyIDMyIDAgMSAwIDAtNjR6TTQxNiA0ODBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzItMzIgMTQuMy0zMiAzMiAxNC4zIDMyIDMyIDMyem0wLTM4NGEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6TTMyIDMyYTMyIDMyIDAgMSAwIDAgNjQgMzIgMzIgMCAxIDAgMC02NHpNNDE2IDM1MmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6TTMyIDE2MGEzMiAzMiAwIDEgMCAwIDY0IDMyIDMyIDAgMSAwIDAtNjR6bTAgMTkyYTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHpNNDE2IDE2MGEzMiAzMiAwIDEgMCAwIDY0IDMyIDMyIDAgMSAwIDAtNjR6Il0KICAgIH07CiAgICBmYUhpZ2hsaWdodGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhpZ2hsaWdodGVyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY1OTEiLCAiTTMxNSAzMTVMNDczLjQgOTkuOSA0NDQuMSA3MC42IDIyOSAyMjkgMzE1IDMxNXptLTE4NyA1bDAgMCAwLTcxLjdjMC0xNS4zIDcuMi0yOS42IDE5LjUtMzguNkw0MjAuNiA4LjRDNDI4IDIuOSA0MzcgMCA0NDYuMiAwIDQ1Ny42IDAgNDY4LjUgNC41IDQ3Ni42IDEyLjZsNTQuOCA1NC44YzguMSA4LjEgMTIuNiAxOSAxMi42IDMwLjUgMCA5LjItMi45IDE4LjItOC40IDI1LjZMMzM0LjQgMzk2LjVjLTkgMTIuMy0yMy40IDE5LjUtMzguNiAxOS41bC03MS43IDAtMjUuNCAyNS40Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMGwtNTAuNy01MC43Yy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM0wxMjggMzIwek03IDQ2Ni4zbDUxLjctNTEuNyA3MC42IDcwLjYtMTkuNyAxOS43Yy00LjUgNC41LTEwLjYgNy0xNyA3TDI0IDUxMmMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC00LjdjMC02LjQgMi41LTEyLjUgNy0xN3oiXQogICAgfTsKICAgIGZhTW9uZXlCaWxsV2F2ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb25leS1iaWxsLXdhdmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjUzYSIsICJNMCA0MTkuNkwwIDEwOS41YzAtMjMuMiAyNC4xLTM4LjYgNDYuMy0zMiA4Ny43IDI2LjIgMTQ5LjcgNS41IDIxMi4xLTE1LjMgNjQuNS0yMS41IDEyOS40LTQzLjEgMjIzLjMtMTMuMSAxOC41IDUuOSAzMC4zIDIzLjggMzAuMyA0My4zbDAgMzEwLjFjMCAyMy4yLTI0LjEgMzguNi00Ni4yIDMyLTg3LjctMjYuMi0xNDkuOC01LjUtMjEyLjEgMTUuMy02NC41IDIxLjUtMTI5LjQgNDMuMS0yMjMuMyAxMy4xLTE4LjUtNS45LTMwLjMtMjMuOC0zMC4zLTQzLjN6TTMzNiAyNTZjMC01My0zNS44LTk2LTgwLTk2cy04MCA0My04MCA5NiAzNS44IDk2IDgwIDk2IDgwLTQzIDgwLTk2ek0xMjAgNDEzLjZjNC40IDAgNy45LTMuOCA3LjItOC4xLTQuNi0yNy44LTI3LTQ5LjUtNTUuMi01My00LjQtLjUtOCAzLjEtOCA3LjVsMCAzOS45YzAgMy42IDIuNCA2LjggNiA3LjcgMTcuOSA0LjIgMzQuMyA2LjEgNTAgNi4xem0zMTguNS01MS4xYzUgLjggOS41LTMgOS41LThsMC00Mi42YzAtNC40LTMuNi04LjEtOC03LjUtMjUuMiAzLjEtNDUuOSAyMC45LTUzLjIgNDQuNi0xLjQgNC43IDIuMyA5LjEgNy4yIDkuMiAxNC4yIC40IDI5IDEuNyA0NC40IDQuM3pNNDQ4IDE1MmwwLTM5LjljMC0zLjYtMi41LTYuOC02LTcuNy0xNy45LTQuMi0zNC4zLTYuMS01MC02LjEtNC40IDAtNy45IDMuOC03LjIgOC4xIDQuNiAyNy44IDI3IDQ5LjUgNTUuMiA1MyA0LjQgLjUgOC0zLjEgOC03LjV6TTEyNS4yIDE2Mi45YzEuNC00LjctMi4zLTkuMS03LjItOS4yLTE0LjItLjQtMjktMS43LTQ0LjQtNC4zLTUtLjgtOS41IDMtOS41IDhMNjQgMjAwYzAgNC40IDMuNiA4LjEgOCA3LjUgMjUuMi0zLjEgNDUuOS0yMC45IDUzLjItNDQuNnoiXQogICAgfTsKICAgIGZhVG9pbGV0UGFwZXJTbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0b2lsZXQtcGFwZXItc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTA3MiIsICJNNDEtMjQuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTLTIuMy0uMyA3IDkuMWw1MjggNTI4YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtOTQuNS05NC41YzQwLjItMjMgNjkuNS05Ni45IDY5LjUtMTg0LjYgMC0xMDYtNDMtMTkyLTk2LTE5MnMtOTYgODYtOTYgMTkyYzAgMjQuMSAyLjIgNDcuMiA2LjMgNjguNEwzMDQgMjM4LjIgMzA0IDIyNGMwLTU4LjkgMTEuOC0xMTQuNSAzMy4yLTE1Ny4yIDUuOS0xMS43IDEzLjEtMjMuNyAyMS45LTM0LjhMMTI4IDMyYy04LjMgMC0xNi40IDIuMS0yNC4xIDYuMWwtNjMtNjN6TTMyIDIyNGwwIDI2NGMwIDMwLjkgMjUuMSA1NiA1NiA1NmwxNjAgMGMzMC45IDAgNTYtMjUuMSA1Ni01NmwwLTExNC4yLTI1Ni0yNTZDMzcuOSAxNDguMiAzMiAxODQuNyAzMiAyMjR6bTQxNiA2NGMtMTcuNyAwLTMyLTI4LjctMzItNjRzMTQuMy02NCAzMi02NCAzMiAyOC43IDMyIDY0LTE0LjMgNjQtMzIgNjR6Il0KICAgIH07CiAgICBmYUZpbGVTaGllbGQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1zaGllbGQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRmMCIsICJNOTYgMEM2MC43IDAgMzIgMjguNyAzMiA2NGwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyMDEuMiAwQzI2MSA0NjkuNCAyNDAgNDE0LjUgMjQwIDM1Ni40bDAtMzEuMWMwLTM0LjQgMjItNjUgNTQuNy03NS45bDExMi0zNy4zYzMuMS0xIDYuMi0xLjggOS4zLTIuNWwwLTM5LjFjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNMMjkwLjcgMTguN0MyNzguNyA2LjcgMjYyLjUgMCAyNDUuNSAwTDk2IDB6TTM1Ny41IDE3NkwyNjQgMTc2Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNEwyNDAgNTguNSAzNTcuNSAxNzZ6bTg3LjggMzEyLjVsLTEzLjMgNi4zIDAtMTg4LjEgOTYgMzIgMCAxOS42YzAgNTUuOC0zMi4yIDEwNi41LTgyLjcgMTMwLjN6TTQyMS45IDI1OS41bC0xMTIgMzcuM2MtMTMuMSA0LjQtMjEuOSAxNi42LTIxLjkgMzAuNGwwIDMxLjFjMCA3NC40IDQzIDE0Mi4xIDExMC4yIDE3My43bDE4LjUgOC43YzQuOCAyLjIgMTAgMy40IDE1LjIgMy40czEwLjUtMS4yIDE1LjItMy40bDE4LjUtOC43QzUzMyA1MDAuMyA1NzYgNDMyLjYgNTc2IDM1OC4ybDAtMzEuMWMwLTEzLjgtOC44LTI2LTIxLjktMzAuNGwtMTEyLTM3LjNjLTYuNi0yLjItMTMuNy0yLjItMjAuMiAweiJdCiAgICB9OwogICAgZmFUZXh0SGVpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRleHQtaGVpZ2h0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYwMzQiLCAiTTQwIDMyQzE3LjkgMzIgMCA0OS45IDAgNzJsMCA1NmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzIgNjQgMCAwIDMyMC0zMiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDEyOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0zMiAwIDAtMzIwIDY0IDAgMCAzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtNTZjMC0yMi4xLTE3LjktNDAtNDAtNDBMNDAgMzJ6TTQzOC42IDM2MS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2w2NCA2NGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGw2NC02NGMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMGwtOS40IDkuNCAwLTIyOS41IDkuNCA5LjRjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBzMTIuNS0zMi44IDAtNDUuM2wtNjQtNjRjLTYtNi0xNC4xLTkuNC0yMi42LTkuNHMtMTYuNiAzLjQtMjIuNiA5LjRsLTY0IDY0Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwbDkuNC05LjQgMCAyMjkuNS05LjQtOS40eiJdCiAgICB9OwogICAgZmFGYWNlR3JpblRvbmd1ZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1ncmluLXRvbmd1ZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODUzOSwgImdyaW4tdG9uZ3VlIl0sICJmNTg5IiwgIk0wIDI1NmMwIDEwNC40IDYyLjUgMTk0LjIgMTUyLjIgMjM0LjEtNS4zLTEzLTguMi0yNy4yLTguMi00Mi4xbDAtNjEuN2MtMTYuOS0xNi41LTMwLjEtMzYuNy0zOC4zLTU5LjMtNC4zLTExLjggNy43LTIxLjggMTkuNi0xOC4xIDM5LjIgMTIuMiA4My43IDE5LjEgMTMwLjcgMTkuMXM5MS41LTYuOSAxMzAuNy0xOS4xYzExLjktMy43IDIzLjkgNi4zIDE5LjYgMTguMS04LjMgMjIuNi0yMS41IDQyLjgtMzguMyA1OS4zbDAgNjEuN2MwIDE0LjktMi45IDI5LjEtOC4yIDQyLjEgODkuNy0zOS44IDE1Mi4yLTEyOS42IDE1Mi4yLTIzNC4xIDAtMTQxLjQtMTE0LjYtMjU2LTI1Ni0yNTZTMCAxMTQuNiAwIDI1NnptMTc2LTgwYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHptMTI4IDMyYTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTE2IDI0MGwwLTQ1LjRjMC0xNC43LTExLjktMjYuNi0yNi42LTI2LjZsLTIgMGMtMTEuMyAwLTIxLjEgNy45LTIzLjYgMTguOS0yLjggMTIuNi0yMC44IDEyLjYtMjMuNiAwLTIuNS0xMS4xLTEyLjMtMTguOS0yMy42LTE4LjlsLTIgMGMtMTQuNyAwLTI2LjYgMTEuOS0yNi42IDI2LjZsMCA0NS40YzAgMzUuMyAyOC43IDY0IDY0IDY0czY0LTI4LjcgNjQtNjR6Il0KICAgIH07CiAgICBmYUdyaW5Ub25ndWUyID0gZmFGYWNlR3JpblRvbmd1ZTI7CiAgICBmYUZpbGVTaWduYXR1cmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1zaWduYXR1cmUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjU3MyIsICJNNjQuMSA2NGMwLTM1LjMgMjguNy02NCA2NC02NEwyNzcuNiAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDQyOS4zIDEyNS4zYzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNsMCA5Ny41LTEzMiAxMzItNDIuMSAwLTE2LjEtNTMuNmMtNC43LTE1LjctMTkuMS0yNi40LTM1LjUtMjYuNC0xMS4zIDAtMjEuOSA1LjEtMjguOSAxMy45TDEzMy4zIDQwOWMtOC4zIDEwLjMtNi42IDI1LjUgMy43IDMzLjdzMjUuNSA2LjYgMzMuNy0zLjhsNDcuMS01OC44IDE1LjIgNTAuN2MzIDEwLjIgMTIuNCAxNy4xIDIzIDE3LjFsMzEuNSAwYy0uOSAzLjEtMS43IDYuMy0yLjMgOS41bC0xMC45IDU0LjUtMTQ2LjIgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0zODR6bTIwOC01LjVsMCA5My41YzAgMTMuMyAxMC43IDI0IDI0IDI0bDkzLjUgMC0xMTcuNS0xMTcuNXptNjAuMiA0MDguNGMyLjUtMTIuNCA4LjYtMjMuOCAxNy41LTMyLjdsMTE4LjktMTE4LjkgODAgODAtMTE4LjkgMTE4LjljLTguOSA4LjktMjAuMyAxNS0zMi43IDE3LjVsLTU5LjYgMTEuOWMtLjkgLjItMS45IC4zLTIuOSAuMy04IDAtMTQuNi02LjUtMTQuNi0xNC42IDAtMSAuMS0xLjkgLjMtMi45bDExLjktNTkuNnptMjY3LjgtMTIzbC0yOC44IDI4LjgtODAtODAgMjguOC0yOC44YzIyLjEtMjIuMSA1Ny45LTIyLjEgODAgMHMyMi4xIDU3LjkgMCA4MHoiXQogICAgfTsKICAgIGZhQnVpbGRpbmdXaGVhdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJidWlsZGluZy13aGVhdCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNGRiIiwgIk05NiAwQzYwLjcgMCAzMiAyOC43IDMyIDY0bDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI0OS4zIDBjLTYtMTQuOC05LjMtMzEtOS4zLTQ4IDAtMTcuNyA3LjItMzMuNyAxOC44LTQ1LjMtMTEuOS0xOS40LTE4LjgtNDIuMy0xOC44LTY2LjcgMC0xNy43IDcuMi0zMy43IDE4LjgtNDUuMy0xMS45LTE5LjQtMTguOC00Mi4zLTE4LjgtNjYuNyAwLTI1LjIgMTQuNS00Ni45IDM1LjYtNTcuNC0yLjQtNy4xLTMuNi0xNC43LTMuNi0yMi42bDAtMzJDMzY4IDk2LjcgMzg4IDcwLjEgNDE1LjkgNjAuMSA0MTMuOSAyNi42IDM4NiAwIDM1MiAwTDk2IDB6TTIwOCAzNTJsMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDgwLTk2IDAgMC04MGMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNMTI4IDExMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyek0yNzIgOTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNnpNMTI4IDI0MGMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyem0xNDQtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNnptMzUyIDBsLTE2IDBjLTQ0LjIgMC04MCAzNS44LTgwIDgwIDAgOC44IDcuMiAxNiAxNiAxNmwxNiAwYzQ0LjIgMCA4MC0zNS44IDgwLTgwIDAtOC44LTcuMi0xNi0xNi0xNnptMTYgMTI4YzAtOC44LTcuMi0xNi0xNi0xNmwtMTYgMGMtNDQuMiAwLTgwIDM1LjgtODAgODAgMCA4LjggNy4yIDE2IDE2IDE2bDE2IDBjNDQuMiAwIDgwLTM1LjggODAtODB6bTAgMTEyYzAtOC44LTcuMi0xNi0xNi0xNmwtMTYgMGMtNDQuMiAwLTgwIDM1LjgtODAgODAgMCA4LjggNy4yIDE2IDE2IDE2bDE2IDBjNDQuMiAwIDgwLTM1LjggODAtODB6TTQ5NiA1MjhjMC00NC4yLTM1LjgtODAtODAtODBsLTE2IDBjLTguOCAwLTE2IDcuMi0xNiAxNiAwIDQ0LjIgMzUuOCA4MCA4MCA4MGwxNiAwYzguOCAwIDE2LTcuMiAxNi0xNnptLTE2LTk2YzguOCAwIDE2LTcuMiAxNi0xNiAwLTQ0LjItMzUuOC04MC04MC04MGwtMTYgMGMtOC44IDAtMTYgNy4yLTE2IDE2IDAgNDQuMiAzNS44IDgwIDgwIDgwbDE2IDB6bTE2LTEyOGMwLTQ0LjItMzUuOC04MC04MC04MGwtMTYgMGMtOC44IDAtMTYgNy4yLTE2IDE2IDAgNDQuMiAzNS44IDgwIDgwIDgwbDE2IDBjOC44IDAgMTYtNy4yIDE2LTE2ek01MTIgNjRjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMTA0YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xMDRjMC0xMy4zLTEwLjctMjQtMjQtMjR6bTk2IDY0YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMzJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTMyek00NDAgMTA0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDMyYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0zMmMwLTEzLjMtMTAuNy0yNC0yNC0yNHoiXQogICAgfTsKICAgIGZhUGx1Z0NpcmNsZU1pbnVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBsdWctY2lyY2xlLW1pbnVzIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NWUiLCAiTTE5Mi0zMmMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDk2IDEyOCAwIDAtOTZjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDk2IDY0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsMCA0OC43Yy05OC42IDguMS0xNzYgOTAuNy0xNzYgMTkxLjMgMCAyNy4zIDUuNyA1My4zIDE2IDc2LjlsMCAzLjFjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02Ni43QzE2NS4yIDM5OC4xIDk2IDMxOS4xIDk2IDIyNGwwLTY0Yy0xNy43IDAtMzItMTQuMy0zMi0zMlM3OC4zIDk2IDk2IDk2bDY0IDAgMC05NmMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNMzUyIDQwMGExNDQgMTQ0IDAgMSAxIDI4OCAwIDE0NCAxNDQgMCAxIDEgLTI4OCAwem0yMjQgMGMwLTguOC03LjItMTYtMTYtMTZsLTEyOCAwYy04LjggMC0xNiA3LjItMTYgMTZzNy4yIDE2IDE2IDE2bDEyOCAwYzguOCAwIDE2LTcuMiAxNi0xNnoiXQogICAgfTsKICAgIGZhRnV0Ym9sMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmdXRib2wiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5OTE3LCAiZnV0Ym9sLWJhbGwiLCAic29jY2VyLWJhbGwiXSwgImYxZTMiLCAiTTQxNy4zIDM2MC4xbC03MS42LTQuOGMtNS4yLS4zLTEwLjMgMS4xLTE0LjUgNC4ycy03LjIgNy40LTguNCAxMi41bC0xNy42IDY5LjZDMjg5LjUgNDQ1LjggMjczIDQ0OCAyNTYgNDQ4cy0zMy41LTIuMi00OS4yLTYuNEwxODkuMiAzNzJjLTEuMy01LTQuMy05LjQtOC40LTEyLjVzLTkuMy00LjUtMTQuNS00LjJsLTcxLjYgNC44Yy0xNy42LTI3LjItMjguNS01OS4yLTMwLjQtOTMuNkwxMjUgMjI4LjNjNC40LTIuOCA3LjYtNyA5LjItMTEuOXMxLjQtMTAuMi0uNS0xNWwtMjYuNy02Ni42QzEyOCAxMDkuMiAxNTUuMyA4OSAxODYuNyA3Ni45bDU1LjIgNDZjNCAzLjMgOSA1LjEgMTQuMSA1LjFzMTAuMi0xLjggMTQuMS01LjFsNTUuMi00NmMzMS4zIDEyLjEgNTguNyAzMi4zIDc5LjYgNTcuOWwtMjYuNyA2Ni42Yy0xLjkgNC44LTIuMSAxMC4xLS41IDE1czQuOSA5LjEgOS4yIDExLjlsNjAuNyAzOC4yYy0xLjkgMzQuNC0xMi44IDY2LjQtMzAuNCA5My42ek0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnptMTQuMS0zMjUuN2MtOC40LTYuMS0xOS44LTYuMS0yOC4yIDBMMTk0IDIyMWMtOC40IDYuMS0xMS45IDE2LjktOC43IDI2LjhsMTguMyA1Ni4zYzMuMiA5LjkgMTIuNCAxNi42IDIyLjggMTYuNmw1OS4yIDBjMTAuNCAwIDE5LjYtNi43IDIyLjgtMTYuNmwxOC4zLTU2LjNjMy4yLTkuOS0uMy0yMC43LTguNy0yNi44bC00Ny45LTM0Ljh6Il0KICAgIH07CiAgICBmYUZ1dGJvbEJhbGwyID0gZmFGdXRib2wyOwogICAgZmFTb2NjZXJCYWxsMiA9IGZhRnV0Ym9sMjsKICAgIGZhQ2lyY2xlUGx1cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtcGx1cyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJwbHVzLWNpcmNsZSJdLCAiZjA1NSIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTIzMiAzNDRsMC02NC02NCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDY0IDAgMC02NGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgNjQgNjQgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNjQgMCAwIDY0YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0eiJdCiAgICB9OwogICAgZmFQbHVzQ2lyY2xlID0gZmFDaXJjbGVQbHVzOwogICAgZmFCcmF6aWxpYW5SZWFsU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJicmF6aWxpYW4tcmVhbC1zaWduIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU0NmMiLCAiTTQwMCAxNmMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDE2IDE2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTQ4LjkgMGMtMjYgMC00Ny4xIDIxLjEtNDcuMSA0Ny4xIDAgMjIuNSAxNS45IDQxLjggMzcuOSA0Ni4ybDMyLjggNi42YzUxLjkgMTAuNCA4OS4zIDU2IDg5LjMgMTA5IDAgNTAuNi0zMy44IDkzLjMtODAgMTA2LjdsMCAyMC40YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTYtMzIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw2NC45IDBjMjYgMCA0Ny4xLTIxLjEgNDcuMS00Ny4xIDAtMjIuNS0xNS45LTQxLjgtMzcuOS00Ni4ybC0zMi44LTYuNmMtNTEuOS0xMC40LTg5LjMtNTYtODkuMy0xMDkgMC01MC42IDMzLjgtOTMuMiA4MC0xMDYuN0wzNjggNDhjMC0xNy43IDE0LjMtMzIgMzItMzJ6TTAgNjRDMCA0Ni4zIDE0LjMgMzIgMzIgMzJsODAgMGM3OS41IDAgMTQ0IDY0LjUgMTQ0IDE0NCAwIDU0LjMtMzAgMTAxLjUtNzQuNCAxMjYuMWw0MSAxMzYuN2M1LjEgMTYuOS00LjUgMzQuOC0yMS41IDM5LjhzLTM0LjgtNC41LTM5LjgtMjEuNUwxMjAuMSAzMTkuOGMtMi43IC4xLTUuNCAuMi04LjEgLjJsLTQ4IDAgMCAxMjhjMCAxNy43LTE0LjMgMzItMzIgMzJTMCA0NjUuNyAwIDQ0OEwwIDY0ek02NCAyNTZsNDggMGM0NC4yIDAgODAtMzUuOCA4MC04MHMtMzUuOC04MC04MC04MGwtNDggMCAwIDE2MHoiXQogICAgfTsKICAgIGZhU3RhckFuZENyZXNjZW50ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN0YXItYW5kLWNyZXNjZW50IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTc3MF0sICJmNjk5IiwgIk0wIDI1NmMwLTE0MS40IDExNC42LTI1NiAyNTYtMjU2IDMzIDAgNjQuNiA2LjMgOTMuNiAxNy43IDcuNCAyLjkgMTEuNSAxMC43IDkuOCAxOC40cy04LjggMTMtMTYuNyAxMi40Yy00LjgtLjMtOS43LS41LTE0LjYtLjUtMTE0LjkgMC0yMDggOTMuMS0yMDggMjA4czkzLjEgMjA4IDIwOCAyMDhjNC45IDAgOS44LS4yIDE0LjYtLjUgNy45LS41IDE1IDQuNyAxNi43IDEyLjRzLTIuNCAxNS41LTkuOCAxOC40QzMyMC42IDUwNS43IDI4OSA1MTIgMjU2IDUxMiAxMTQuNiA1MTIgMCAzOTcuNCAwIDI1NnpNMzc1LjQgMTM3LjRjMy41LTcuMSAxMy43LTcuMSAxNy4yIDBsMzEuNSA2My44YzEuNCAyLjggNC4xIDQuOCA3LjIgNS4zbDcwLjQgMTAuMmM3LjkgMS4xIDExIDEwLjggNS4zIDE2LjRsLTUwLjkgNDkuNmMtMi4zIDIuMi0zLjMgNS40LTIuOCA4LjVsMTIgNzAuMWMxLjMgNy44LTYuOSAxMy44LTEzLjkgMTAuMWwtNjMtMzMuMWMtMi44LTEuNS02LjEtMS41LTguOSAwbC02MyAzMy4xYy03IDMuNy0xNS4zLTIuMy0xMy45LTEwLjFsMTItNzAuMWMuNS0zLjEtLjUtNi4zLTIuOC04LjVMMjYxIDIzMy4xYy01LjctNS42LTIuNi0xNS4yIDUuMy0xNi40bDcwLjQtMTAuMmMzLjEtLjUgNS44LTIuNCA3LjItNS4zbDMxLjUtNjMuOHoiXQogICAgfTsKICAgIGZhRmFjZVN1cnByaXNlMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLXN1cnByaXNlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTU4LCAic3VycHJpc2UiXSwgImY1YzIiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0xNzYgMTc2YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHptMTI4IDMyYTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bS00OCA4MGE2NCA2NCAwIDEgMSAwIDEyOCA2NCA2NCAwIDEgMSAwLTEyOHoiXQogICAgfTsKICAgIGZhU3VycHJpc2UyID0gZmFGYWNlU3VycHJpc2UyOwogICAgZmFIb3NwaXRhbFVzZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG9zcGl0YWwtdXNlciIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmODBkIiwgIk02NCA2NEM2NCAyOC43IDkyLjcgMCAxMjggMEwzODQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDEyMS4zYy00Ni45IDE5LTgwIDY1LTgwIDExOC43IDAgMjcuNyA4LjggNTMuNCAyMy44IDc0LjQtNTEuNSAyMS04Ny44IDcxLjYtODcuOCAxMzAuNyAwIDEgMCAxLjkgMCAyLjlsLTE3NiAwYy0zNS4zIDAtNjQtMjguNy02NC02NEw2NCA2NHpNMjA4IDQwMGwwIDY0IDUzLjQgMGM3LjItMjkuNCAyMS4zLTU2LjEgNDAuNC03OC4zLTYuMS0xOS41LTI0LjMtMzMuNy00NS44LTMzLjctMjYuNSAwLTQ4IDIxLjUtNDggNDh6TTI0OCA4OGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzItMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMTZjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDAgMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMTYgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMiAzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTE2YzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMCAwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMTYgMHpNNDE2IDMwNGE4MCA4MCAwIDEgMSAxNjAgMCA4MCA4MCAwIDEgMSAtMTYwIDB6TTM1MiA1MTJjMC01MyA0My05NiA5Ni05Nmw5NiAwYzUzIDAgOTYgNDMgOTYgOTYgMCAxNy43LTE0LjMgMzItMzIgMzJsLTIyNCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnoiXQogICAgfTsKICAgIGZhQXJyb3dEb3duVXBMb2NrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LWRvd24tdXAtbG9jayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNGIwIiwgIk0yNjIuNiA0MjIuNmwtODAgODBjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwbC04MC04MGMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMGwyNS40IDI1LjQgMC0xMTQuNy02NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDI1NiAwIDAtMTE0LjctMjUuNCAyNS40Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM2w4MC04MGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMGw4MCA4MGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMGwtMjUuNC0yNS40IDAgOTQuOGMtMjUuMyAyMC4zLTQyLjggNTAuMS00NyA4My45bC0xNDUgMCAwIDExNC43IDI1LjQtMjUuNGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zek0xOTIgMzJsMCAxNDQtNjQgMCAwLTE0NGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMyek00OTYgMzA0LjFjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA0Ny45IDY0IDAgMC00Ny45ek0zNTIgNDAwYzAtMjAuOSAxMy40LTM4LjcgMzItNDUuM2wwLTUwLjZjMC00NC4yIDM1LjgtODAgODAtODBzODAgMzUuOCA4MCA4MGwwIDUwLjZjMTguNiA2LjYgMzIgMjQuNCAzMiA0NS4zbDAgOTZjMCAyNi41LTIxLjUgNDgtNDggNDhsLTEyOCAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTk2eiJdCiAgICB9OwogICAgZmFGb2xkZXIyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZvbGRlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODE5MywgMTI4NDQ3LCA2MTcxNiwgImZvbGRlci1ibGFuayJdLCAiZjA3YiIsICJNNjQgNDQ4bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjQwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDI5OC43IDgwYy02LjkgMC0xMy43LTIuMi0xOS4yLTYuNEwyNDEuMSA0NC44QzIzMCAzNi41IDIxNi41IDMyIDIwMi43IDMyTDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjR6Il0KICAgIH07CiAgICBmYUZvbGRlckJsYW5rMiA9IGZhRm9sZGVyMjsKICAgIGZhSG9sbHlCZXJyeSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob2xseS1iZXJyeSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmN2FhIiwgIk0yNTYuMiA5NmE0OCA0OCAwIDEgMCAwLTk2IDQ4IDQ4IDAgMSAwIDAgOTZ6bS04MCA5NmE0OCA0OCAwIDEgMCAwLTk2IDQ4IDQ4IDAgMSAwIDAgOTZ6TTI3NyAzODMuOGMxIC4xIDIuMSAuMiAzLjIgLjIgMzkuOCAwIDcyIDMyLjIgNzIgNzJsMCAyMi43YzAgMTYuNCAxNiAyNy45IDMxLjYgMjIuOGwxMi44LTQuM2MxOC02IDM3LjMtNi41IDU1LjYtMS41bDE5LjQgNS4zYzE3LjkgNC45IDM0LjQtMTEuNiAyOS41LTI5LjVMNDk1LjkgNDUyYy01LTE4LjMtNC40LTM3LjYgMS41LTU1LjZsNC4zLTEyLjhjNS4yLTE1LjUtNi40LTMxLjYtMjIuOC0zMS42LTM0LjYgMC02Mi43LTI4LjEtNjIuNy02Mi43bDAtMzJjMC0xNi40LTE2LTI3LjktMzEuNi0yMi44bC0xMi44IDQuM2MtMTggNi0zNy4zIDYuNS01NS42IDEuNWwtMjkuNi04LjFjLTIuOS0uOC01LjktMS04LjctLjcgNC4yIDkuNyA1LjggMjAuOCAzLjcgMzIuM2wtNi4zIDM0LjhjLTEuNSA4LjQtMS40IDE3IC41IDI1LjNsNS4zIDIzLjljMi44IDEyLjcgMS4xIDI1LjItNCAzNS45ek0xMjcuOCAyMzQuNWMtMTUuNS01LjItMzEuNiA2LjQtMzEuNiAyMi44bDAgMzJjMCAzNC42LTI4LjEgNjIuNy02Mi43IDYyLjctMTYuNCAwLTI3LjkgMTYtMjIuOCAzMS42TDE1IDM5Ni40YzYgMTggNi41IDM3LjMgMS41IDU1LjZsLTUuMyAxOS40QzYuNCA0ODkuNCAyMi44IDUwNS44IDQwLjcgNTAxbDE5LjQtNS4zYzE4LjMtNSAzNy42LTQuNSA1NS42IDEuNWwxMi44IDQuM2MxNS41IDUuMiAzMS42LTYuNCAzMS42LTIyLjhsMC0zMmMwLTM0LjYgMjguMS02Mi43IDYyLjctNjIuNyAxNi40IDAgMjcuOS0xNiAyMi44LTMxLjZsLTQuMy0xMi44Yy02LTE4LTYuNS0zNy4zLTEuNS01NS42bDUuMy0xOS40YzQuOS0xNy45LTExLjYtMzQuNC0yOS41LTI5LjVsLTE5LjQgNS4zYy0xOC4zIDUtMzcuNiA0LjQtNTUuNi0xLjVsLTEyLjgtNC4zek0zODQuMiAxNDRhNDggNDggMCAxIDAgLTk2IDAgNDggNDggMCAxIDAgOTYgMHoiXQogICAgfTsKICAgIGZhVmVudXNEb3VibGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidmVudXMtZG91YmxlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbOTg5MF0sICJmMjI2IiwgIk0xOTIgMjg4YTExMiAxMTIgMCAxIDAgMC0yMjQgMTEyIDExMiAwIDEgMCAwIDIyNHpNMzY4IDE3NmMwIDg2LjMtNjIuMSAxNTguMS0xNDQuMSAxNzMuMSAuMSAxIC4xIDEuOSAuMSAyLjlsMCA2NCAzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0zMiAwIDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0zMi0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDMyIDAgMC02NGMwLTEgMC0xLjkgLjEtMi45LTgyLTE1LTE0NC4xLTg2LjgtMTQ0LjEtMTczLjEgMC05Ny4yIDc4LjgtMTc2IDE3Ni0xNzZTMzY4IDc4LjggMzY4IDE3NnpNMzU3LjUgMzI3YzE0LjQtMTUuOCAyNi42LTMzLjcgMzYuMS01My4xIDE2LjEgOSAzNC43IDE0LjEgNTQuNSAxNC4xIDYxLjkgMCAxMTItNTAuMSAxMTItMTEyUzUwOS45IDY0IDQ0OCA2NGMtMTkuOCAwLTM4LjMgNS4xLTU0LjUgMTQuMS05LjUtMTkuNC0yMS42LTM3LjMtMzYuMS01My4xIDI2LjQtMTUuOSA1Ny40LTI1IDkwLjUtMjUgOTcuMiAwIDE3NiA3OC44IDE3NiAxNzYgMCA4Ni4zLTYyLjEgMTU4LjEtMTQ0LjEgMTczLjEgLjEgLjkgLjEgMS45IC4xIDIuOWwwIDY0IDMyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTMyIDAgMCAzMmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTMyLTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMzIgMCAwLTY0YzAtMSAwLTEuOSAuMS0yLjktMjEuMS0zLjktNDAuOS0xMS41LTU4LjYtMjIuMnoiXQogICAgfTsKICAgIGZhQ2xpcGJvYXJkUXVlc3Rpb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2xpcGJvYXJkLXF1ZXN0aW9uIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImU0ZTMiLCAiTTMxMS40IDMybDguNiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzUyYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmw4LjYgMEM4My42IDEyLjkgMTA0LjMgMCAxMjggMEwyNTYgMGMyMy43IDAgNDQuNCAxMi45IDU1LjQgMzJ6TTI0OCAxMTJjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRMMTM2IDY0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDExMiAwek0xOTIgMjQ4YzE2LjEgMCAyOS4yIDEzLjEgMjkuMiAyOS4yIDAgOC43LTMuMSAxMy45LTYuOSAxNy43LTQuNSA0LjQtMTAuNyA3LjUtMTYuOCA5LjUtMTQuOSA1LTI5LjUgMTkuMy0yOS41IDM5LjUgMCAxMy4zIDEwLjcgMjQgMjQgMjQgMTEuNSAwIDIxLjItOC4xIDIzLjUtMTkgMTkuMi03LjEgNTMuNy0yNi4zIDUzLjctNzEuOCAwLTQyLjYtMzQuNi03Ny4yLTc3LjItNzcuMnMtNzcuMiAzNC42LTc3LjIgNzcuMmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0YzAtMTYuMSAxMy4xLTI5LjIgMjkuMi0yOS4yem0yOCAxNjhjMC0xNS41LTEyLjUtMjgtMjgtMjhzLTI4IDEyLjUtMjggMjggMTIuNSAyOCAyOCAyOCAyOC0xMi41IDI4LTI4eiJdCiAgICB9OwogICAgZmFIb3Rkb2cgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG90ZG9nIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3Nzg5XSwgImY4MGYiLCAiTTI4OCAwYy0yMC41IDAtNDAuMSA4LjEtNTQuNiAyMi42TDIyLjYgMjMzLjRDOC4xIDI0Ny45IDAgMjY3LjUgMCAyODggMCAzMDAuMiAyLjkgMzEyLjEgOC4yIDMyMi43TDMyMi43IDguMkMzMTIuMSAyLjkgMzAwLjIgMCAyODggMHpNMjI0IDUxMmMyMC41IDAgNDAuMS04LjEgNTQuNi0yMi42TDQ4OS40IDI3OC42YzE0LjUtMTQuNSAyMi42LTM0LjEgMjIuNi01NC42IDAtMTIuMi0yLjktMjQuMS04LjItMzQuN0wxODkuMyA1MDMuOGMxMC43IDUuNCAyMi42IDguMiAzNC43IDguMnpNNDU2LjYgMTY4LjZjMzEuMi0zMS4yIDMxLjItODEuOSAwLTExMy4xcy04MS45LTMxLjItMTEzLjEgMGwtMjg4IDI4OGMtMzEuMiAzMS4yLTMxLjIgODEuOSAwIDExMy4xczgxLjkgMzEuMiAxMTMuMSAwbDI4OC0yODh6Il0KICAgIH07CiAgICBmYUFycm93VXBGcm9tQnJhY2tldCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy11cC1mcm9tLWJyYWNrZXQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTA5YSIsICJNMjQ2LjYgOS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMGwtMTI4IDEyOGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMEwxOTIgMTA5LjMgMTkyIDMyMGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjEwLjcgNzMuNCA3My40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTEyOC0xMjh6TTY0IDM1MmMwLTE3LjctMTQuMy0zMi0zMi0zMlMwIDMzNC4zIDAgMzUybDAgNjRjMCA1MyA0MyA5NiA5NiA5NmwyNTYgMGM1MyAwIDk2LTQzIDk2LTk2bDAtNjRjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMkw5NiA0NDhjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjR6Il0KICAgIH07CiAgICBmYU1pY3Jvc2NvcGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWljcm9zY29wZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODMwMF0sICJmNjEwIiwgIk0xNzYgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCAyMDhjMCAyNi41IDIxLjUgNDggNDggNDhsNjQgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTY0IDMyIDBjNzAuNyAwIDEyOCA1Ny4zIDEyOCAxMjhTMzkwLjcgNDQ4IDMyMCA0NDhMMzIgNDQ4Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDQ0OCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0xNi45IDBjMzAuNC0zNCA0OC45LTc4LjggNDguOS0xMjggMC0xMDYtODYtMTkyLTE5Mi0xOTJsLTMyIDAgMC04MGMwLTI2LjUtMjEuNS00OC00OC00OEwxNzYgMHpNMTIwIDM1MmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNzYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTc2IDB6Il0KICAgIH07CiAgICBmYUNsb3VkMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjbG91ZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzk3MjldLCAiZjBjMiIsICJNMCAzMzZjMCA3OS41IDY0LjUgMTQ0IDE0NCAxNDRsMzA0IDBjNzAuNyAwIDEyOC01Ny4zIDEyOC0xMjggMC01MS42LTMwLjUtOTYuMS03NC41LTExNi4zIDYuNy0xMy4xIDEwLjUtMjggMTAuNS00My43IDAtNTMtNDMtOTYtOTYtOTYtMTcuNyAwLTM0LjIgNC44LTQ4LjQgMTMuMS0yNC4xLTQ1LjgtNzIuMi03Ny4xLTEyNy42LTc3LjEtNzkuNSAwLTE0NCA2NC41LTE0NCAxNDQgMCA4IC43IDE1LjkgMS45IDIzLjUtNTYuOSAxOS4yLTk3LjkgNzMuMS05Ny45IDEzNi41eiJdCiAgICB9OwogICAgZmFCYXNlYmFsbEJhdEJhbGwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmFzZWJhbGwtYmF0LWJhbGwiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjQzMiIsICJNNDY0LjEgNTQ0YTgwIDgwIDAgMSAxIDAtMTYwIDgwIDgwIDAgMSAxIDAgMTYwem04LjQtNTc2YzE1LjEgMCAyOS43IDUuOCA0MC43IDE2LjJsNDcuMiA0NC44YzEyLjYgMTIgMTkuMSAyOSAxNy41IDQ2LjMtMS4yIDEzLjMtNyAyNS44LTE2LjUgMzUuMkwzNjMuMSAzMDljLTcuMyA3LjMtMTUuNyAxMy40LTI1IDE4TDIwNiAzOTNjLTkuMiA0LjYtMTcuNyAxMC43LTI1IDE4bC05MiA5MiAxLjcgMS44YzcuNyA5LjQgNy4xIDIzLjMtMS43IDMyLjFzLTIyLjcgOS4zLTMyLjEgMS43bC0xLjgtMS43LTQ4LTQ4LTEuNy0xLjhjLTcuNy05LjQtNy4xLTIzLjMgMS43LTMyLjFzMjIuNy05LjMgMzIuMS0xLjdsMS44IDEuNyA5Mi05MmM3LjMtNy4zIDEzLjQtMTUuNyAxOC0yNWw2Ni4xLTEzMi4xYzQuNi05LjIgMTAuNy0xNy43IDE4LTI1TDQzMC44LTE0LjdDNDQxLjktMjUuOCA0NTYuOS0zMiA0NzIuNS0zMnoiXQogICAgfTsKICAgIGZhQ2FyUmVhciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYXItcmVhciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJjYXItYWx0Il0sICJmNWRlIiwgIk0xNjUuNCA5NmwxODEuMiAwYzEzLjYgMCAyNS43IDguNiAzMC4yIDIxLjRsMjYuMSA3NC42LTI5My44IDAgMjYuMS03NC42YzQuNS0xMi44IDE2LjYtMjEuNCAzMC4yLTIxLjR6bS05MC42IC4zTDM5LjYgMTk2LjhDMTYuNCAyMDYuNCAwIDIyOS4zIDAgMjU2bDAgOTZjMCAyMy43IDEyLjkgNDQuNCAzMiA1NS40TDMyIDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMzIgMjU2IDAgMCAzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNDAuNmMxOS4xLTExLjEgMzItMzEuNyAzMi01NS40bDAtOTZjMC0yNi43LTE2LjQtNDkuNi0zOS42LTU5LjJMNDM3LjIgOTYuM0M0MjMuNyA1Ny44IDM4Ny40IDMyIDM0Ni42IDMyTDE2NS40IDMyYy00MC44IDAtNzcuMSAyNS44LTkwLjYgNjQuM3pNMjA4IDI4OGw5NiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtOTYgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2ek00OCAyODBjMC0xMy4zIDEwLjctMjQgMjQtMjRsMzIgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMzIgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjR6bTM2MC0yNGwzMiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0zMiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFDYXJBbHQgPSBmYUNhclJlYXI7CiAgICBmYVRodW1idGFja1NsYXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRodW1idGFjay1zbGFzaCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJ0aHVtYi10YWNrLXNsYXNoIl0sICJlNjhmIiwgIk00MS0yNC45Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMFMtMi4zLS4zIDcgOS4xbDUyOCA1MjhjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45TDQxNy44IDM1MiA0NDggMzUyYzEwIDAgMTkuNS00LjcgMjUuNS0xMi43czgtMTguNCA1LjItMjguMUw0NzUgMjk3LjhjLTEyLjQtNDMuMy00MS03OC41LTc4LjItOTkuN0wzODYuNSA2NCA0MTYgNjRjMTcuNyAwIDMyLTE0LjMgMzItMzJTNDMzLjcgMCA0MTYgMEwxNjAgMGMtNy40IDAtMTQuMSAyLjUtMTkuNSA2LjZMMTkwLjEgNTYuMyAxODUuMyAxMTkuNCA0MS0yNC45ek0yODIuMiAzNTJMMTQ5LjcgMjE5LjZjLTIyLjcgMjAuNS0zOS44IDQ3LjQtNDguNyA3OC4zbC0zLjggMTMuNGMtMi44IDkuNy0uOCAyMCA1LjIgMjguMVMxMTggMzUyIDEyOCAzNTJsMTU0LjIgMHpNMjU2IDUxMmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTEyLTY0IDAgMCAxMTJ6Il0KICAgIH07CiAgICBmYVRodW1iVGFja1NsYXNoID0gZmFUaHVtYnRhY2tTbGFzaDsKICAgIGZhUGx1c01pbnVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBsdXMtbWludXMiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZTQzYyIsICJNMjI0IDMyYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMTI4LTEyOCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDEyOCAwIDAgMTI4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xMjggMTI4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTEyOCAwIDAtMTI4ek0wIDQ4MGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwzMiA0NDhjLTE3LjcgMC0zMiAxNC4zLTMyIDMyeiJdCiAgICB9OwogICAgZmFIb3VzZUNpcmNsZUNoZWNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLWNpcmNsZS1jaGVjayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTA5IiwgIk00OTYgNTQ0YTE0NCAxNDQgMCAxIDEgMC0yODggMTQ0IDE0NCAwIDEgMSAwIDI4OHpNMjY4LjYgNi41YzEyLjItOS4zIDI5LjctOC43IDQxLjIgMmwyMTcuNiAyMDJjLTEwLjItMS43LTIwLjctMi42LTMxLjMtMi42LTc4LjYgMC0xNDYuMSA0Ny4yLTE3NS44IDExNC44LTUuMS0xLjgtMTAuNS0yLjgtMTYuMi0yLjhsLTMyIDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgOTYgOTEgMGM2LjEgMTcuMyAxNC42IDMzLjQgMjUuMSA0OEwxNDQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTE3Ni0xNiAwYy0xMy4yIDAtMjUtOC4xLTI5LjgtMjAuM3MtMS42LTI2LjIgOC0zNS4xbDIyNC0yMDggMi40LTJ6TTU1My40IDMzOS4xYy03LjEtNS4yLTE3LjEtMy42LTIyLjMgMy41bC01MyA3Mi44LTI2LjctMjYuOGMtNi4yLTYuMi0xNi40LTYuMi0yMi42IDAtNi4yIDYuMi02LjIgMTYuNCAwIDIyLjZsNDAgNDBjMy4zIDMuMyA3LjkgNSAxMi42IDQuN3M4LjktMi44IDExLjctNi42bDY0LTg4YzUuMi03LjEgMy42LTE3LjEtMy41LTIyLjN6Il0KICAgIH07CiAgICBmYUNhbGVuZGFyRGF5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhbGVuZGFyLWRheSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNzgzIiwgIk0xMjggMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDMyIDEyOCAwIDAtMzJjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDMyIDMyIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyODhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGwzMiAwIDAtMzJjMC0xNy43IDE0LjMtMzIgMzItMzJ6bTAgMjU2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDY0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDY0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtNjQgMHoiXQogICAgfTsKICAgIGZhTGlicmEgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGlicmEiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTg0YiIsICJNNDgwIDM4NGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA0NDhjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsNDQ4IDB6TTI1NiAzMmM5Ny4yIDAgMTc2IDc4LjggMTc2IDE3NiAwIDE2LjYtMi40IDMyLjctNi43IDQ4bDU0LjcgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTA0LjIgMGMtMTEuOCAwLTIyLjctNi41LTI4LjItMTYuOXMtNC45LTIzLjEgMS42LTMyLjljMTEuOS0xNy44IDE4LjgtMzkuMSAxOC44LTYyLjIgMC02MS45LTUwLjEtMTEyLTExMi0xMTJTMTQ0IDE0Ni4xIDE0NCAyMDhjMCAyMy4xIDYuOSA0NC40IDE4LjggNjIuMiA2LjYgOS44IDcuMiAyMi41IDEuNiAzMi45UzE0OC4xIDMyMCAxMzYuMiAzMjBMMzIgMzIwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDU0LjggMGMtNC4zLTE1LjMtNi44LTMxLjQtNi44LTQ4IDAtOTcuMiA3OC44LTE3NiAxNzYtMTc2eiJdCiAgICB9OwogICAgZmFDaXJjbGUyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODMwOCwgMTI4MzA5LCAxMjg5OTIsIDEyODk5MywgMTI4OTk0LCAxMjg5OTUsIDEyODk5NiwgOTY3OSwgOTg5OCwgOTg5OSwgMTEwNDQsIDYxNzA4LCA2MTkxNV0sICJmMTExIiwgIk0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAweiJdCiAgICB9OwogICAgZmFNb2JpbGVWaWJyYXRlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vYmlsZS12aWJyYXRlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU4MTYiLCAiTTM4NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzg0YzAgMzUuMy0yOC43IDY0LTY0IDY0bC0xOTIgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0zODRjMC0zNS4zIDI4LjctNjQgNjQtNjRMMzg0IDB6TTI0OCA0MTZjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsODAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtODAgMHpNNDguOCAxMzMuNGM5LjQtNy43IDIzLjMtNy4xIDMyLjEgMS43IDkuNCA5LjQgOS40IDI0LjYgMCAzMy45bC0zMSAzMSAyNS40IDI1LjQgMi45IDMuMmM2LjMgNy43IDkuOCAxNy40IDkuOCAyNy40IDAgMTEuNS00LjYgMjIuNS0xMi43IDMwLjZsLTI1LjQgMjUuNCAzMSAzMSAxLjcgMS44YzcuNyA5LjQgNy4xIDIzLjMtMS43IDMyLjFzLTIyLjcgOS4zLTMyLjEgMS43TDQ3IDM3NyAxMi43IDM0Mi42QzUuNiAzMzUuNSAxLjIgMzI2LjIgLjIgMzE2LjNMMCAzMTIgLjIgMzA3LjdjMS05LjkgNS40LTE5LjIgMTIuNS0yNi4zTDM4LjEgMjU2IDEyLjcgMjMwLjZDNS42IDIyMy41IDEuMiAyMTQuMiAuMiAyMDQuM0wwIDIwMCAuMiAxOTUuN2MxLTkuOSA1LjQtMTkuMiAxMi41LTI2LjNMNDcgMTM1IDQ4LjggMTMzLjR6TTQ5NSAxMzVjOC44LTguOCAyMi43LTkuMyAzMi4xLTEuN2wxLjggMS43IDM0LjMgMzQuM2M3LjEgNy4xIDExLjUgMTYuNCAxMi41IDI2LjNsLjIgNC4zLS4yIDQuM2MtMSA5LjktNS40IDE5LjItMTIuNSAyNi4zbC0yNS40IDI1LjQgMjUuNCAyNS40YzcuMSA3LjEgMTEuNSAxNi40IDEyLjUgMjYuM2wuMiA0LjMtLjIgNC4zYy0xIDkuOS01LjQgMTkuMi0xMi41IDI2LjNsLTM0LjMgMzQuMy0xLjggMS43Yy05LjQgNy43LTIzLjMgNy4xLTMyLjEtMS43cy05LjMtMjIuNy0xLjctMzIuMWwxLjctMS44IDMxLTMxLTI1LjQtMjUuNGMtOC4xLTguMS0xMi43LTE5LjEtMTIuNy0zMC42IDAtMTAgMy41LTE5LjcgOS44LTI3LjRsMi45LTMuMiAyNS40LTI1LjQtMzEtMzFjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45eiJdCiAgICB9OwogICAgZmFGYWNlR3JpblNxdWludDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1ncmluLXNxdWludCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODUxOCwgImdyaW4tc3F1aW50Il0sICJmNTg1IiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMzg2LjcgMzA4LjljMTEuOS0zLjcgMjMuOSA2LjMgMTkuNiAxOC4xLTIyLjQgNjEuMy04MS4zIDEwNS4xLTE1MC4zIDEwNS4xUzEyOC4xIDM4OC4yIDEwNS43IDMyNi45Yy00LjMtMTEuOCA3LjctMjEuOCAxOS42LTE4LjEgMzkuMiAxMi4yIDgzLjcgMTkuMSAxMzAuNyAxOS4xczkxLjUtNi45IDEzMC43LTE5LjF6TTEyMi42IDE0My4yYzQuNS02LjggMTMuMy05LjIgMjAuNi01LjVsNzkuNiA0MGM1LjQgMi43IDguOCA4LjIgOC44IDE0LjNzLTMuNCAxMS42LTguOCAxNC4zbC03OS42IDQwYy03LjMgMy42LTE2LjEgMS4zLTIwLjYtNS41cy0zLjEtMTUuOSAzLjEtMjEuMUwxNTkgMTkyIDEyNS44IDE2NC4zYy02LjItNS4yLTcuNi0xNC4zLTMuMS0yMS4xem0yNjMuNiAyMS4xTDM1MyAxOTIgMzg2LjIgMjE5LjdjNi4yIDUuMiA3LjYgMTQuMyAzLjEgMjEuMXMtMTMuMyA5LjItMjAuNiA1LjVsLTc5LjYtNDBjLTUuNC0yLjctOC44LTguMi04LjgtMTQuM3MzLjQtMTEuNiA4LjgtMTQuM2w3OS42LTQwYzcuMy0zLjYgMTYuMS0xLjMgMjAuNiA1LjVzMy4xIDE1LjktMy4xIDIxLjF6Il0KICAgIH07CiAgICBmYUdyaW5TcXVpbnQyID0gZmFGYWNlR3JpblNxdWludDI7CiAgICBmYVVzZXJzQmV0d2VlbkxpbmVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXJzLWJldHdlZW4tbGluZXMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTU5MSIsICJNMjQgMTZsNTI4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRMMjQgNjRDMTAuNyA2NCAwIDUzLjMgMCA0MFMxMC43IDE2IDI0IDE2em0wIDQ0OGw1MjggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNEwyNCA1MTJjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6TTM5MiAxOTJhNTYgNTYgMCAxIDEgMTEyIDAgNTYgNTYgMCAxIDEgLTExMiAwem0yNy4yIDEwMC40YzkuMS0yLjkgMTguOC00LjQgMjguOC00LjQgNTMgMCA5NiA0MyA5NiA5NmwwIDEwLjdjMCAxMS44LTkuNiAyMS4zLTIxLjMgMjEuM2wtNzguOCAwYzIuNy03LjUgNC4xLTE1LjYgNC4xLTI0bDAtOGMwLTM0LjEtMTAuNi02NS43LTI4LjgtOTEuNnptLTI2Mi40IDBDMTM4LjYgMzE4LjMgMTI4IDM0OS45IDEyOCAzODRsMCA4YzAgOC40IDEuNCAxNi41IDQuMSAyNGwtNzguOCAwQzQxLjYgNDE2IDMyIDQwNi40IDMyIDM5NC43TDMyIDM4NGMwLTUzIDQzLTk2IDk2LTk2IDEwIDAgMTkuNyAxLjUgMjguOCA0LjR6TTcyIDE5MmE1NiA1NiAwIDEgMSAxMTIgMCA1NiA1NiAwIDEgMSAtMTEyIDB6bTE1Mi0xNmE2NCA2NCAwIDEgMSAxMjggMCA2NCA2NCAwIDEgMSAtMTI4IDB6TTE3NiAzODRjMC02MS45IDUwLjEtMTEyIDExMi0xMTJzMTEyIDUwLjEgMTEyIDExMmwwIDhjMCAxMy4zLTEwLjcgMjQtMjQgMjRsLTE3NiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTh6Il0KICAgIH07CiAgICBmYUhvdXNlTWVkaWNhbENpcmNsZVhtYXJrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLW1lZGljYWwtY2lyY2xlLXhtYXJrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1MTMiLCAiTTMwOS44IDguNmMtMTIuMy0xMS40LTMxLjMtMTEuNC00My41IDBsLTIyNCAyMDhjLTkuNiA5LTEyLjggMjIuOS04IDM1LjFTNTAuOCAyNzIgNjQgMjcybDE2IDAgMCAxNzZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTk2IDBjLTIxLjItMjkuNS0zNC4zLTY1LjMtMzUuOS0xMDRMMjcyIDQwOGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtNDAtNDAgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDQwIDAgMC00MGMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCA0MCAyMCAwYzM0LjktNDguNSA5MS43LTgwIDE1Ni04MCAxMC43IDAgMjEuMSAuOSAzMS4zIDIuNUwzMDkuOCA4LjZ6TTQ5NiA1NDRhMTQ0IDE0NCAwIDEgMCAwLTI4OCAxNDQgMTQ0IDAgMSAwIDAgMjg4em0yMi42LTE0NGwzNi43IDM2LjdjNi4yIDYuMiA2LjIgMTYuNCAwIDIyLjZzLTE2LjQgNi4yLTIyLjYgMGwtMzYuNy0zNi43LTM2LjcgMzYuN2MtNi4yIDYuMi0xNi40IDYuMi0yMi42IDBzLTYuMi0xNi40IDAtMjIuNmwzNi43LTM2LjctMzYuNy0zNi43Yy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBsMzYuNyAzNi43IDM2LjctMzYuN2M2LjItNi4yIDE2LjQtNi4yIDIyLjYgMHM2LjIgMTYuNCAwIDIyLjZMNTE4LjYgNDAweiJdCiAgICB9OwogICAgZmFUYWJsZUxpc3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGFibGUtbGlzdCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJ0aC1saXN0Il0sICJmMDBiIiwgIk0wIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NnptNjQgMGwwIDY0IDY0IDAgMC02NC02NCAwem0zMjAgMGwtMTkyIDAgMCA2NCAxOTIgMCAwLTY0ek02NCAyMjRsMCA2NCA2NCAwIDAtNjQtNjQgMHptMzIwIDBsLTE5MiAwIDAgNjQgMTkyIDAgMC02NHpNNjQgMzUybDAgNjQgNjQgMCAwLTY0LTY0IDB6bTMyMCAwbC0xOTIgMCAwIDY0IDE5MiAwIDAtNjR6Il0KICAgIH07CiAgICBmYVRoTGlzdCA9IGZhVGFibGVMaXN0OwogICAgZmFGbGFza1ZpYWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmxhc2stdmlhbCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNGYzIiwgIk0xODQuNiA0MTEuNWMtMy4xIDcuMy01LjQgMTQuOS02LjggMjIuNi0xNC41IDguOC0zMS41IDEzLjktNDkuOCAxMy45LTUzIDAtOTYtNDMtOTYtOTZMMzIgNjRDMTQuMyA2NCAwIDQ5LjcgMCAzMlMxNC4zIDAgMzIgMEwyMjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwwIDI1NS42LTM5LjQgOTEuOXpNOTYgNjRsMCAxMjggNjQgMCAwLTEyOC02NCAwek0zNTIgMEw1MTIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwwIDE1My40IDkxLjMgMjEzYzIuMyA1LjQgMy44IDExLjEgNC40IDE3bC4zIC42LS4zIDBjLjIgMS44IC4zIDMuNiAuMyA1LjQgMCAzMi4zLTI2LjIgNTguNi01OC42IDU4LjZsLTI2Ni45IDBjLTMyLjMgMC01OC42LTI2LjItNTguNi01OC42IDAtMS44IC4xLTMuNiAuMy01LjRsLS4zIDAgLjMtLjZjLjYtNS44IDIuMS0xMS42IDQuNC0xN0wzMjAgMjE3LjQgMzIwIDY0Yy0xNy43IDAtMzItMTQuMy0zMi0zMlMzMDIuMyAwIDMyMCAwbDMyIDB6TTQ1My4yIDI0Mi42Yy0zLjQtOC01LjItMTYuNS01LjItMjUuMmwwLTE1My40LTY0IDAgMCAxNTMuNGMwIDguNy0xLjggMTcuMi01LjIgMjUuMmwtMzMuMiA3Ny40IDE0MC43IDAtMzMuMi03Ny40eiJdCiAgICB9OwogICAgZmFDaXJjbGVFeGNsYW1hdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtZXhjbGFtYXRpb24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiZXhjbGFtYXRpb24tY2lyY2xlIl0sICJmMDZhIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDEgMC01MTIgMjU2IDI1NiAwIDEgMSAwIDUxMnptMC0xOTJhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDEgMCAwLTY0em0wLTE5MmMtMTguMiAwLTMyLjcgMTUuNS0zMS40IDMzLjdsNy40IDEwNGMuOSAxMi42IDExLjQgMjIuMyAyMy45IDIyLjMgMTIuNiAwIDIzLTkuNyAyMy45LTIyLjNsNy40LTEwNGMxLjMtMTguMi0xMy4xLTMzLjctMzEuNC0zMy43eiJdCiAgICB9OwogICAgZmFFeGNsYW1hdGlvbkNpcmNsZSA9IGZhQ2lyY2xlRXhjbGFtYXRpb247CiAgICBmYVRheGkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGF4aSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODY2MiwgImNhYiJdLCAiZjFiYSIsICJNMTkyIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgMzItOC45IDBjLTQyIDAtNzkuMSAyNy4zLTkxLjYgNjcuNGwtMjMgNzMuNUMxNC41IDIxOS4xIDAgMjQzLjkgMCAyNzJMMCA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJsMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTMyIDMyMCAwIDAgMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJsMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTE3NmMwLTI4LjEtMTQuNS01Mi45LTM2LjQtNjcuMWwtMjMtNzMuNUM0NDAuMSA5MS4zIDQwMi45IDY0IDM2MC45IDY0bC04LjkgMCAwLTMyYzAtMTcuNy0xNC4zLTMyLTMyLTMyTDE5MiAwek0xNTEuMSAxMjhsMjA5LjkgMGMxNCAwIDI2LjQgOS4xIDMwLjUgMjIuNWwxMyA0MS41LTI5Ni45IDAgMTMtNDEuNWM0LjItMTMuNCAxNi41LTIyLjUgMzAuNS0yMi41ek05NiAyNzJhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em0yODggMzJhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHoiXQogICAgfTsKICAgIGZhQ2FiID0gZmFUYXhpOwogICAgZmFUZXh0U2xhc2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGV4dC1zbGFzaCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJyZW1vdmUtZm9ybWF0Il0sICJmODdkIiwgIk00MS0yNC45Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMFMtMi4zLS4zIDcgOS4xbDUyOCA1MjhjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45TDMyMi43IDI1Ni45IDM2OC4yIDk2IDQ3MSA5NiA0NjUgMTIwLjJjLTQuMyAxNy4xIDYuMSAzNC41IDIzLjMgMzguOHMzNC41LTYuMSAzOC44LTIzLjNsMTEtNDQuMUM1NDUuNiA2MS4zIDUyMi43IDMyIDQ5MS41IDMybC0zMTkgMGMtMTkuOCAwLTM3LjMgMTIuMS00NC41IDMwLjFsLTg3LTg3ek0xODAuNCAxMTQuNWw0LjYtMTguNSAxMTYuNyAwLTMwLjggMTA5LTkwLjUtOTAuNXpNMjQxIDMxMC44TDIxMS4zIDQxNiAxNjAgNDE2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDE2MCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC00Mi4yIDAgMTUuMS01My4zLTUxLjktNTEuOXoiXQogICAgfTsKICAgIGZhUmVtb3ZlRm9ybWF0ID0gZmFUZXh0U2xhc2g7CiAgICBmYVBlb3BsZVB1bGxpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVvcGxlLXB1bGxpbmciLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUzNSIsICJNODAgOTZhNDggNDggMCAxIDAgMC05NiA0OCA0OCAwIDEgMCAwIDk2ek02NCAxMjhjLTM1LjMgMC02NCAyOC43LTY0IDY0TDAgMzIwYzAgMTcuNyAxNC4zIDMyIDMyIDMyIDkuOCAwIDE4LjUtNC40IDI0LjQtMTEuMkw4MC40IDQ4NS4zYzIuOSAxNy40IDE5LjQgMjkuMiAzNi44IDI2LjNzMjkuMi0xOS40IDI2LjMtMzYuOGwtMjAuNS0xMjIuNyAxNS43IDAgMzAgMTM0LjljMy44IDE3LjMgMjAuOSAyOC4xIDM4LjIgMjQuM3MyOC4xLTIwLjkgMjQuMy0zOC4ybC01Ny4zLTI1OCAxMTYuMyA1My44Yy41IC4zIDEuMSAuNSAxLjYgLjcgOC42IDMuNiAxOCAzLjEgMjUuOS0uNyAzLjQtMS42IDYuNi0zLjkgOS4zLTYuNyAzLjEtMy4yIDUuNS03IDcuMS0xMS40IC4xLS4zIC4yLS43IC4zLTFsMi41LTcuNWM1LjctMTcuMSAxOC4zLTMwLjkgMzQuNy0zOC4ybDgtMy41YzEtLjQgMS45LS44IDIuOS0xLjJsLTE2LjkgNjMuNWMtNS42IDIxLjEtLjEgNDMuNiAxNC43IDU5LjdsNzAuNyA3Ny4xIDIyIDg4LjFjNC4zIDE3LjEgMjEuNyAyNy42IDM4LjggMjMuM3MyNy42LTIxLjcgMjMuMy0zOC44bC0yMy05Mi4xYy0xLjktNy44LTUuOC0xNC45LTExLjItMjAuOGwtNDkuNS01NCAxOS4zLTY1LjUgOS42IDIzYzQuNCAxMC42IDEyLjUgMTkuMyAyMi44IDI0LjVsMjYuNyAxMy4zYzE1LjggNy45IDM1IDEuNSA0Mi45LTE0LjNzMS41LTM1LTE0LjMtNDIuOWwtMjEuNC0xMC43LTE1LjMtMzYuOGMtMTcuMS00MS4xLTU3LjMtNjcuOS0xMDEuOS02Ny45LTIyLjggMC00NS4zIDQuOC02Ni4xIDE0bC04IDMuNWMtMjQuNCAxMC45LTQ0LjYgMjktNTguMSA1MS42TDE1Ny4zIDEzNi45QzE0NC43IDEzMSAxMzAuOSAxMjggMTE3IDEyOGwtNTMgMHpNNDY0IDk2YTQ4IDQ4IDAgMSAwIDAtOTYgNDggNDggMCAxIDAgMCA5NnpNMzQ5LjcgMzM1LjZsLTI1IDYyLjQtNTkuNCA1OS40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwTDM3Mi4zIDQ0MWM0LjYtNC42IDguMi0xMC4xIDEwLjYtMTYuMWwxNC41LTM2LjItNDAuNy00NC40Yy0yLjUtMi43LTQuOC01LjYtNy04LjZ6Il0KICAgIH07CiAgICBmYUJhY2t3YXJkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhY2t3YXJkIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbOTE5NF0sICJmMDRhIiwgIk0yMDQuMyA0My4xQzIxNS45IDMyIDIzMyAyOC45IDI0Ny43IDM1LjJTMjcyIDU2IDI3MiA3MmwwIDEzNi4zIDE3Mi4zLTE2NS4xQzQ1NS45IDMyIDQ3MyAyOC45IDQ4Ny43IDM1LjJTNTEyIDU2IDUxMiA3MmwwIDM2OGMwIDE2LTkuNiAzMC41LTI0LjMgMzYuOHMtMzEuOCAzLjItNDMuNC03LjlMMjcyIDMwMy43IDI3MiA0NDBjMCAxNi05LjYgMzAuNS0yNC4zIDM2LjhzLTMxLjggMy4yLTQzLjQtNy45bC0xOTItMTg0QzQuNSAyNzcuMyAwIDI2Ni45IDAgMjU2czQuNS0yMS4zIDEyLjMtMjguOWwxOTItMTg0eiJdCiAgICB9OwogICAgZmFDYXJCdXJzdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYXItYnVyc3QiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsiY2FyLWNyYXNoIl0sICJmNWUxIiwgIk0yMzIgMTYuMWwwLTQ4YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgNDhjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNHpNMzIgMTY4LjFsNDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNDggMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNHpNMjgxLjUgNzAuNmM5LjQgOS40IDI0LjYgOS40IDMzLjkgMGwzMy45LTMzLjljOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMEwyODEuNSAzNi42Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXptLTE4MSAyMTVsMzMuOS0zMy45YzkuNC05LjQgOS40LTI0LjYgMC0zMy45cy0yNC42LTkuNC0zMy45IDBMNjYuNiAyNTEuNmMtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwek02Ni42IDIuN2MtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlsMzMuOSAzMy45YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOUwxMDAuNSAyLjdDOTEuMS02LjcgNzYtNi43IDY2LjYgMi43ek0zNTIuOSAxNzUuNEw1MDUgMjE2LjJjNi40IDEuNyAxMS4xIDcuMyAxMS44IDEzLjlsNy4yIDc0LTIzMS41LTYyIDQzLjItNjAuNWMzLjktNS40IDEwLjctNy45IDE3LjItNi4yek0yMjMuNiAyMjguNWwtMi4xIDIuOWMtMjEuNyA1LjUtMzkuOSAyMi4zLTQ2LjEgNDUuNS00LjEgMTUuNS0xMi40IDQ2LjQtMjQuOCA5Mi43bC04LjMgMzAuOWMtNC42IDE3LjEgNS42IDM0LjYgMjIuNiAzOS4ybDE1LjUgNC4xYzE3LjEgNC42IDM0LjYtNS42IDM5LjItMjIuNmw4LjMtMzAuOSAyNzguMiA3NC41LTguMyAzMC45Yy00LjYgMTcuMSA1LjYgMzQuNiAyMi42IDM5LjJsMTUuNSA0LjFjMTcuMSA0LjYgMzQuNi01LjYgMzkuMi0yMi42IDQuMS0xNS41IDEyLjQtNDYuNCAyNC44LTkyLjdsOC4zLTMwLjljNi4yLTIzLjItMS4xLTQ2LjgtMTcuMi02Mi41bC0uMy0zLjYtMTAtMTAzYy0zLjItMzMuMi0yNi43LTYwLjktNTguOS02OS41TDM2OS41IDExMy42Yy0zMi4yLTguNi02Ni40IDMuNi04NS44IDMwLjhsLTYwLjIgODQuMnptNDguNyA1Ny44YTMyIDMyIDAgMSAxIC0xNi42IDYxLjggMzIgMzIgMCAxIDEgMTYuNi02MS44em0yMDguMSA4OC45YTMyIDMyIDAgMSAxIDYxLjggMTYuNiAzMiAzMiAwIDEgMSAtNjEuOC0xNi42eiJdCiAgICB9OwogICAgZmFDYXJDcmFzaCA9IGZhQ2FyQnVyc3Q7CiAgICBmYUxpbmsgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGluayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyODI3OSwgImNoYWluIl0sICJmMGMxIiwgIk00MTkuNSA5NmMtMTYuNiAwLTMyLjcgNC41LTQ2LjggMTIuNy0xNS44LTE2LTM0LjItMjkuNC01NC41LTM5LjUgMjguMi0yNCA2NC4xLTM3LjIgMTAxLjMtMzcuMiA4Ni40IDAgMTU2LjUgNzAgMTU2LjUgMTU2LjUgMCA0MS41LTE2LjUgODEuMy00NS44IDExMC42bC03MS4xIDcxLjFjLTI5LjMgMjkuMy02OS4xIDQ1LjgtMTEwLjYgNDUuOC04Ni40IDAtMTU2LjUtNzAtMTU2LjUtMTU2LjUgMC0xLjUgMC0zIC4xLTQuNSAuNS0xNy43IDE1LjItMzEuNiAzMi45LTMxLjFzMzEuNiAxNS4yIDMxLjEgMzIuOWMwIC45IDAgMS44IDAgMi42IDAgNTEuMSA0MS40IDkyLjUgOTIuNSA5Mi41IDI0LjUgMCA0OC05LjcgNjUuNC0yNy4xbDcxLjEtNzEuMWMxNy4zLTE3LjMgMjcuMS00MC45IDI3LjEtNjUuNCAwLTUxLjEtNDEuNC05Mi41LTkyLjUtOTIuNXpNMjc1LjIgMTczLjNjLTEuOS0uOC0zLjgtMS45LTUuNS0zLjEtMTIuNi02LjUtMjctMTAuMi00Mi4xLTEwLjItMjQuNSAwLTQ4IDkuNy02NS40IDI3LjFMOTEuMSAyNTguMmMtMTcuMyAxNy4zLTI3LjEgNDAuOS0yNy4xIDY1LjQgMCA1MS4xIDQxLjQgOTIuNSA5Mi41IDkyLjUgMTYuNSAwIDMyLjYtNC40IDQ2LjctMTIuNiAxNS44IDE2IDM0LjIgMjkuNCA1NC42IDM5LjUtMjguMiAyMy45LTY0IDM3LjItMTAxLjMgMzcuMi04Ni40IDAtMTU2LjUtNzAtMTU2LjUtMTU2LjUgMC00MS41IDE2LjUtODEuMyA0NS44LTExMC42bDcxLjEtNzEuMWMyOS4zLTI5LjMgNjkuMS00NS44IDExMC42LTQ1LjggODYuNiAwIDE1Ni41IDcwLjYgMTU2LjUgMTU2LjkgMCAxLjMgMCAyLjYgMCAzLjktLjQgMTcuNy0xNS4xIDMxLjYtMzIuOCAzMS4ycy0zMS42LTE1LjEtMzEuMi0zMi44YzAtLjggMC0xLjUgMC0yLjMgMC0zMy43LTE4LTYzLjMtNDQuOC03OS42eiJdCiAgICB9OwogICAgZmFDaGFpbiA9IGZhTGluazsKICAgIGZhQmFja3dhcmRTdGVwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhY2t3YXJkLXN0ZXAiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsic3RlcC1iYWNrd2FyZCJdLCAiZjA0OCIsICJNMzYzIDM2LjhjLTEyLjktNy0yOC43LTYuMy00MSAxLjhMNjQgMjA4LjEgNjQgNjRjMC0xNy43LTE0LjMtMzItMzItMzJTMCA0Ni4zIDAgNjRMMCA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE0NC4xIDI1OCAxNjkuNmMxMi4zIDguMSAyOCA4LjggNDEgMS44czIxLTIwLjUgMjEtMzUuMmwwLTM2OGMwLTE0LjctOC4xLTI4LjItMjEtMzUuMnoiXQogICAgfTsKICAgIGZhU3RlcEJhY2t3YXJkID0gZmFCYWNrd2FyZFN0ZXA7CiAgICBmYVggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAieCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyMF0sICI1OCIsICJNMzc2LjYgODQuNWMxMS4zLTEzLjYgOS41LTMzLjgtNC4xLTQ1LjFzLTMzLjgtOS41LTQ1LjEgNC4xTDE5MiAyMDYgNTYuNiA0My41QzQ1LjMgMjkuOSAyNS4xIDI4LjEgMTEuNSAzOS40Uy0zLjkgNzAuOSA3LjQgODQuNUwxNTAuMyAyNTYgNy40IDQyNy41Yy0xMS4zIDEzLjYtOS41IDMzLjggNC4xIDQ1LjFzMzMuOCA5LjUgNDUuMS00LjFMMTkyIDMwNiAzMjcuNCA0NjguNWMxMS4zIDEzLjYgMzEuNSAxNS40IDQ1LjEgNC4xczE1LjQtMzEuNSA0LjEtNDUuMUwyMzMuNyAyNTYgMzc2LjYgODQuNXoiXQogICAgfTsKICAgIGZhQ2lyY2xlVXNlcjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLXVzZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MjE0MiwgInVzZXItY2lyY2xlIl0sICJmMmJkIiwgIk0zOTkgMzg0LjJDMzc2LjkgMzQ1LjggMzM1LjQgMzIwIDI4OCAzMjBsLTY0IDBjLTQ3LjQgMC04OC45IDI1LjgtMTExIDY0LjIgMzUuMiAzOS4yIDg2LjIgNjMuOCAxNDMgNjMuOHMxMDcuOC0yNC43IDE0My02My44ek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0yNTYgMTZhNzIgNzIgMCAxIDAgMC0xNDQgNzIgNzIgMCAxIDAgMCAxNDR6Il0KICAgIH07CiAgICBmYVVzZXJDaXJjbGUyID0gZmFDaXJjbGVVc2VyMjsKICAgIGZhUmVjdGFuZ2xlTGlzdDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicmVjdGFuZ2xlLWxpc3QiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsibGlzdC1hbHQiXSwgImYwMjIiLCAiTTY0IDY0QzI4LjcgNjQgMCA5Mi43IDAgMTI4TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDY0em05NiAyNTZhMzIgMzIgMCAxIDEgLTY0IDAgMzIgMzIgMCAxIDEgNjQgMHptLTMyLTk2YTMyIDMyIDAgMSAxIDAtNjQgMzIgMzIgMCAxIDEgMCA2NHptMTIwLTU2bDE0NCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNDQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHptMCAxMjhsMTQ0IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE0NCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFMaXN0QWx0MiA9IGZhUmVjdGFuZ2xlTGlzdDI7CiAgICBmYUhhbmQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbmQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjkzMDYsIDk5OTUsICJoYW5kLXBhcGVyIl0sICJmMjU2IiwgIk0yODggMzJjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAyMDhjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC0xNzZjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAyNzJjMCAxLjUgMCAzLjEgLjEgNC42TDY3LjYgMjgzYy0xNi0xNS4yLTQxLjMtMTQuNi01Ni42IDEuNFMtMy42IDMyNS43IDEyLjQgMzQxTDEyNC44IDQ0OGM0My4xIDQxLjEgMTAwLjQgNjQgMTYwIDY0bDE5LjIgMGM5Ny4yIDAgMTc2LTc4LjggMTc2LTE3NmwwLTIwOGMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDExMmMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTE3NmMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDE3NmMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTIwOHoiXQogICAgfTsKICAgIGZhSGFuZFBhcGVyMiA9IGZhSGFuZDI7CiAgICBmYUNhbmNlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYW5jZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTg0NyIsICJNNDA4IDE1MmM1Ny40IDAgMTA0IDQ2LjYgMTA0IDEwNCAwIDE0MS40LTExNC42IDI1Ni0yNTYgMjU2LTU0LjMgMC0xMDQuOC0xNy0xNDYuMy00NS45LTE0LjUtMTAuMS0xOC0zMC4xLTcuOS00NC42czMwLjEtMTggNDQuNi03LjljMzEuMSAyMS43IDY4LjkgMzQuNCAxMDkuNyAzNC40IDY3LjkgMCAxMjcuNS0zNS4zIDE2MS43LTg4LjUtMy4yIC4zLTYuNCAuNS05LjcgLjUtNTcuNCAwLTEwNC00Ni42LTEwNC0xMDRzNDYuNi0xMDQgMTA0LTEwNHpNMjU2IDBjNTQuMyAwIDEwNC44IDE3IDE0Ni4zIDQ1LjkgMTQuNSAxMC4xIDE4IDMwLjEgNy45IDQ0LjZzLTMwLjEgMTgtNDQuNiA3LjljLTMxLjEtMjEuNy02OC45LTM0LjQtMTA5LjctMzQuNC02Ny45IDAtMTI3LjUgMzUuMi0xNjEuNyA4OC40IDMuMi0uMyA2LjQtLjQgOS43LS40IDU3LjQgMCAxMDQgNDYuNiAxMDQgMTA0UzE2MS40IDM2MCAxMDQgMzYwIDAgMzEzLjQgMCAyNTZDMCAyNTQuMSAwIDI1Mi4yIC4xIDI1MC40IDMuMSAxMTEuNiAxMTYuNSAwIDI1NiAwek0xMDQgMjE2YTQwIDQwIDAgMSAwIDAgODAgNDAgNDAgMCAxIDAgMC04MHptMzA0IDBhNDAgNDAgMCAxIDAgMCA4MCA0MCA0MCAwIDEgMCAwLTgweiJdCiAgICB9OwogICAgZmFWYW5TaHV0dGxlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZhbi1zaHV0dGxlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4NjU2LCAic2h1dHRsZS12YW4iXSwgImY1YjYiLCAiTTY0IDY0QzI4LjcgNjQgMCA5Mi43IDAgMTI4TDAgMzM2YzAgMzUuMyAyOC43IDY0IDY0IDY0bC40IDBjNCA0NC45IDQxLjcgODAgODcuNiA4MHM4My42LTM1LjEgODcuNi04MGwxMDQuNyAwYzQgNDQuOSA0MS43IDgwIDg3LjYgODAgNDYuMSAwIDgzLjktMzUuNCA4Ny43LTgwLjUgMzEuNy0zLjggNTYuMy0zMC44IDU2LjMtNjMuNWwwLTEwMS4zYzAtMTMuOC00LjUtMjcuMy0xMi44LTM4LjRsLTgwLTEwNi43QzQ3MS4xIDczLjUgNDUyLjEgNjQgNDMyIDY0TDY0IDY0ek01MDQgMjI0bC0xMjAgMCAwLTk2IDQ4IDAgNzIgOTZ6TTY0IDIyNGwwLTk2IDk2IDAgMCA5Ni05NiAwem0xNjAgMGwwLTk2IDk2IDAgMCA5Ni05NiAwek0zOTIgMzkyYTQwIDQwIDAgMSAxIDgwIDAgNDAgNDAgMCAxIDEgLTgwIDB6TTE1MiAzNTJhNDAgNDAgMCAxIDEgMCA4MCA0MCA0MCAwIDEgMSAwLTgweiJdCiAgICB9OwogICAgZmFTaHV0dGxlVmFuID0gZmFWYW5TaHV0dGxlOwogICAgZmFTdGFpcnMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3RhaXJzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImUyODkiLCAiTTM4NCA2NGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwxMjggMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtOTYgMCAwIDk2YzAgMTcuNy0xNC4zIDMyLTMyIDMybC05NiAwIDAgOTZjMCAxNy43LTE0LjMgMzItMzIgMzJsLTk2IDAgMCA5NmMwIDE3LjctMTQuMyAzMi0zMiAzMkwzMiA0ODBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsOTYgMCAwLTk2YzAtMTcuNyAxNC4zLTMyIDMyLTMybDk2IDAgMC05NmMwLTE3LjcgMTQuMy0zMiAzMi0zMmw5NiAwIDAtOTZ6Il0KICAgIH07CiAgICBmYUhvcnNlSGVhZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3JzZS1oZWFkIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY3YWIiLCAiTTAgNDY0TDAgMzE2LjlDMCAyMDguNSA2OC4zIDExMS44IDE3MC41IDc1LjZMMzQwLjIgMTUuNWMyMS40LTcuNiA0My44IDguMyA0My44IDMwLjkgMCAxMS01LjUgMjEuMi0xNC42IDI3LjNMMzM2IDk2YzQ4LjEgMCA5MS4yIDI5LjggMTA4LjEgNzQuOWw0OC42IDEyOS41YzExLjggMzEuNCA0LjEgNjYuOC0xOS42IDkwLjUtMTYgMTYtMzcuOCAyNS4xLTYwLjUgMjUuMWwtMy40IDBjLTI2LjEgMC01MC45LTExLjYtNjcuNi0zMS43bC0zMi4zLTM4LjdjLTExLjcgNC4xLTI0LjIgNi40LTM3LjMgNi40bC0uMSAwYy02LjMgMC0xMi41LS41LTE4LjYtMS41LTMuNi0uNi03LjItMS40LTEwLjctMi4zbDAgMGMtMjguOS03LjgtNTMuMS0yNi44LTY3LjgtNTIuMi00LjQtNy43LTE0LjItMTAuMy0yMS45LTUuOHMtMTAuMyAxNC4yLTUuOCAyMS45YzI0IDQxLjUgNjguMyA3MCAxMTkuMyA3MS45bDQ3LjIgNzAuOGM0IDYuMSA2LjIgMTMuMiA2LjIgMjAuNCAwIDIwLjMtMTYuNSAzNi44LTM2LjggMzYuOEw0OCA1MTJjLTI2LjUgMC00OC0yMS41LTQ4LTQ4ek0zMjggMjI0YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiXQogICAgfTsKICAgIGZhVmF1bHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidmF1bHQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTJjNSIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NCAwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDI1NiAwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6TTI1NiAyNTZhNjQgNjQgMCAxIDAgLTEyOCAwIDY0IDY0IDAgMSAwIDEyOCAwek02NCAyNTZhMTI4IDEyOCAwIDEgMSAyNTYgMCAxMjggMTI4IDAgMSAxIC0yNTYgMHptMzg0LTQ4YzAgMTcuOC05LjcgMzMuMy0yNCA0MS42bDAgNzguNGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTc4LjRjLTE0LjMtOC4zLTI0LTIzLjgtMjQtNDEuNiAwLTI2LjUgMjEuNS00OCA0OC00OHM0OCAyMS41IDQ4IDQ4eiJdCiAgICB9OwogICAgZmFDbG9zZWRDYXB0aW9uaW5nU2xhc2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2xvc2VkLWNhcHRpb25pbmctc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTEzNSIsICJNNy0yNC45YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwTDEyOS44IDY0IDQ4MCA2NGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI1NmMwIDI1LjUtMTQuOSA0Ny40LTM2LjQgNTcuOEw1NjkgNTAzLjFjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMEw3IDkuMUMtMi4zLS4zLTIuMy0xNS41IDctMjQuOXptMzQ1IDMxMWwwLTcwLjJjMC00LjQgMy42LTggOC04bDMyIDBjNC40IDAgOCAzLjYgOCA4IDAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRjMC0zMC45LTI1LjEtNTYtNTYtNTZsLTMyIDBjLTMwLjkgMC01NiAyNS4xLTU2IDU2bDAgMjIuMiA0OCA0OHptNjEuNSA2MS41YzIwLjItOC40IDM0LjUtMjguNCAzNC41LTUxLjcgMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRjMCA0LjQtMy42IDgtOCA4bC0yMi4yIDAgNDMuNyA0My43ek0xMzAuMyAyMDAuMWMtMS41IDUtMi4zIDEwLjQtMi4zIDE1LjlsMCA4MGMwIDMwLjkgMjUuMSA1NiA1NiA1NmwzMiAwYzE4LjEgMCAzNC4xLTguNSA0NC40LTIxLjhMMzc4LjIgNDQ4IDk2IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0yNTZjMC03LjggMS40LTE1LjMgNC0yMi4ybDk0LjMgOTQuM3ptOTMuOCA5My44Yy0uMSAuNy0uMSAxLjQtLjEgMi4xIDAgNC40LTMuNiA4LTggOGwtMzIgMGMtNC40IDAtOC0zLjYtOC04bDAtNTAuMiA0OC4xIDQ4LjF6Il0KICAgIH07CiAgICBmYURydW1TdGVlbHBhbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkcnVtLXN0ZWVscGFuIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY1NmEiLCAiTTI4OCAzMmMxNTkuMSAwIDI4OCA0OCAyODggMTI4bDAgMTkyYzAgODAtMTI4LjkgMTI4LTI4OCAxMjhTMCA0MzIgMCAzNTJMMCAxNjBDMCA4MCAxMjguOSAzMiAyODggMzJ6TTUyOCAxNjBjMC05LjktOC0yOS45LTU1LTQ5LjgtMTguNi03LjktNDAuOS0xNC40LTY2LTE5LjRsLTI3LjggNDMuNmMtNy4zIDExLjUtMTEuMiAyNC44LTExLjIgMzguNCAwIDE3LjUgNi40IDM0LjQgMTguMSA0Ny41bDkuOCAxMWMyOS44LTUuMiA1NS45LTEyLjUgNzcuMi0yMS41IDQ3LjEtMTkuOSA1NS0zOS45IDU1LTQ5Ljh6TTM0OS4yIDIzNy4zYy04LTI2LjItMzIuNC00NS4zLTYxLjItNDUuM3MtNTMuMyAxOS4xLTYxLjIgNDUuM2MxOS40IDEuNyAzOS45IDIuNyA2MS4yIDIuN3M0MS44LS45IDYxLjItMi43ek0xNjkgOTAuOGMtMjUuMiA1LTQ3LjQgMTEuNi02NiAxOS40LTQ3LjEgMTkuOS01NSAzOS45LTU1IDQ5LjhzOCAyOS45IDU1IDQ5LjhjMjEuMyA5IDQ3LjQgMTYuMyA3Ny4yIDIxLjVsOS44LTExYzExLjYtMTMuMSAxOC4xLTMwIDE4LjEtNDcuNSAwLTEzLjYtMy45LTI2LjktMTEuMi0zOC40TDE2OSA5MC44em01Ni4zLThjLS45IDQuMy0xLjQgOC43LTEuNCAxMy4yIDAgMzUuMyAyOC43IDY0IDY0IDY0czY0LTI4LjcgNjQtNjRjMC00LjUtLjUtOS0xLjQtMTMuMi0xOS44LTEuOC00MC44LTIuOC02Mi42LTIuOHMtNDIuOCAxLTYyLjYgMi44eiJdCiAgICB9OwogICAgZmFUaHVtYnNVcDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGh1bWJzLXVwIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MDc3LCA2MTU3NV0sICJmMTY0IiwgIk04MCAxNjBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAyNTZjMCAxNy43LTE0LjMgMzItMzIgMzJsLTQ4IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyTDAgMTkyYzAtMTcuNyAxNC4zLTMyIDMyLTMybDQ4IDB6TTI3MC42IDE2QzI5Ny45IDE2IDMyMCAzOC4xIDMyMCA2NS40bDAgNC4yYzAgNi44LTEuMyAxMy42LTMuOCAxOS45TDI4OCAxNjAgNDQ4IDE2MGMyNi41IDAgNDggMjEuNSA0OCA0OCAwIDE5LjctMTEuOSAzNi42LTI4LjkgNDQgMTcgNy40IDI4LjkgMjQuMyAyOC45IDQ0IDAgMjMuNC0xNi44IDQyLjktMzkgNDcuMSA0LjQgNy4zIDcgMTUuOCA3IDI0LjkgMCAyMi4yLTE1IDQwLjgtMzUuNCA0Ni4zIDIuMiA1LjUgMy40IDExLjUgMy40IDE3LjcgMCAyNi41LTIxLjUgNDgtNDggNDhsLTg3LjkgMGMtMzYuMyAwLTcxLjYtMTIuNC05OS45LTM1LjFMMTg0IDQzNS4yYy0xNS4yLTEyLjEtMjQtMzAuNS0yNC01MGwwLTE4Ni42YzAtMTQuOSAzLjUtMjkuNiAxMC4xLTQyLjlMMjI2LjMgNDMuM0MyMzQuNyAyNi42IDI1MS44IDE2IDI3MC42IDE2eiJdCiAgICB9OwogICAgZmFTdGFtcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzdGFtcCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNWJmIiwgIk0zMTIgMjAxLjhjMC0xNy40IDkuMi0zMy4yIDE5LjktNDcgMTIuNi0xNi4yIDIwLjEtMzYuNiAyMC4xLTU4LjggMC01My00My05Ni05Ni05NnMtOTYgNDMtOTYgOTZjMCAyMi4xIDcuNSA0Mi41IDIwLjEgNTguOCAxMC43IDEzLjggMTkuOSAyOS42IDE5LjkgNDcgMCAyOS45LTI0LjMgNTQuMi01NC4yIDU0LjJMMTEyIDI1NmMtNjEuOSAwLTExMiA1MC4xLTExMiAxMTIgMCAyNi41IDIxLjUgNDggNDggNDhsNDE2IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDggMC02MS45LTUwLjEtMTEyLTExMi0xMTJsLTMzLjggMGMtMjkuOSAwLTU0LjItMjQuMy01NC4yLTU0LjJ6TTU2IDQ2NGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw0MDAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNEw1NiA0NjR6Il0KICAgIH07CiAgICBmYU1lbm9yYWggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWVub3JhaCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNjc2IiwgIk0yMC44IDcuNEMyMi44IDIuOSAyNy4xIDAgMzIgMHM5LjIgMi45IDExLjIgNy40TDYxLjMgNDkuN2MxLjggNC4xIDIuNyA4LjYgMi43IDEzLjFMNjQgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJTMCA4MS43IDAgNjRsMC0xLjJjMC00LjUgLjktOC45IDIuNy0xMy4xTDIwLjggNy40em05NiAwQzExOC44IDIuOSAxMjMuMSAwIDEyOCAwczkuMiAyLjkgMTEuMiA3LjRsMTguMiA0Mi40YzEuOCA0LjEgMi43IDguNiAyLjcgMTMuMWwwIDEuMmMwIDE3LjctMTQuMyAzMi0zMiAzMlM5NiA4MS43IDk2IDY0bDAtMS4yYzAtNC41IC45LTguOSAyLjctMTMuMUwxMTYuOCA3LjR6bTc3LjggNDIuNEwyMTIuOCA3LjRDMjE0LjggMi45IDIxOS4xIDAgMjI0IDBzOS4yIDIuOSAxMS4yIDcuNGwxOC4yIDQyLjRjMS44IDQuMSAyLjcgOC42IDIuNyAxMy4xbDAgMS4yYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMS4yYzAtNC41IC45LTguOSAyLjctMTMuMXpNMzA4LjggNy40QzMxMC44IDIuOSAzMTUuMSAwIDMyMCAwczkuMiAyLjkgMTEuMiA3LjRsMTguMiA0Mi40YzEuOCA0LjEgMi43IDguNiAyLjcgMTMuMWwwIDEuMmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTEuMmMwLTQuNSAuOS04LjkgMi43LTEzLjFMMzA4LjggNy40em03Ny44IDQyLjRMNDA0LjggNy40QzQwNi44IDIuOSA0MTEuMSAwIDQxNiAwczkuMiAyLjkgMTEuMiA3LjRsMTguMiA0Mi40YzEuOCA0LjEgMi43IDguNiAyLjcgMTMuMWwwIDEuMmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTEuMmMwLTQuNSAuOS04LjkgMi43LTEzLjF6TTUwMC44IDcuNEM1MDIuOCAyLjkgNTA3LjEgMCA1MTIgMHM5LjIgMi45IDExLjIgNy40bDE4LjIgNDIuNGMxLjggNC4xIDIuNyA4LjYgMi43IDEzLjFsMCAxLjJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xLjJjMC00LjUgLjktOC45IDIuNy0xMy4xTDUwMC44IDcuNHptNzcuOCA0Mi40TDU5Ni44IDcuNEM1OTguOCAyLjkgNjAzLjEgMCA2MDggMHM5LjIgMi45IDExLjIgNy40bDE4LjIgNDIuNGMxLjggNC4xIDIuNyA4LjYgMi43IDEzLjFsMCAxLjJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xLjJjMC00LjUgLjktOC45IDIuNy0xMy4xek0zMiAxMjhjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxMjhjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTkyIDAgMC0xNjBjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDE2MCAxOTIgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTEyOGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMTI4YzAgNTMtNDMgOTYtOTYgOTZsLTE5MiAwIDAgNjQgMTI4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTMyMCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDEyOCAwIDAtNjQtMTkyIDBjLTUzIDAtOTYtNDMtOTYtOTZMMCAxNjBjMC0xNy43IDE0LjMtMzIgMzItMzJ6bTk2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxMjgtNjQgMCAwLTEyOGMwLTE3LjcgMTQuMy0zMiAzMi0zMnptOTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDEyOC02NCAwIDAtMTI4YzAtMTcuNyAxNC4zLTMyIDMyLTMyem0xOTIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDEyOC02NCAwIDAtMTI4YzAtMTcuNyAxNC4zLTMyIDMyLTMyem05NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTI4LTY0IDAgMC0xMjhjMC0xNy43IDE0LjMtMzIgMzItMzJ6Il0KICAgIH07CiAgICBmYUNoaWxkcmVuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoaWxkcmVuIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU0ZTEiLCAiTTE2MC41IDBhNjQgNjQgMCAxIDEgMCAxMjggNjQgNjQgMCAxIDEgMC0xMjh6bS03MiA0ODBsMC04MC0xNy44IDBjLTEwLjkgMC0xOC42LTEwLjctMTUuMi0yMS4xTDg2LjcgMjg1LjUgNTggMzIzLjNjLTEwLjcgMTQuMS0zMC44IDE2LjgtNDQuOCA2LjJTLTMuNyAyOTguNyA3IDI4NC43TDY1LjkgMjA3YzIyLjQtMjkuNiA1Ny41LTQ3IDk0LjYtNDdzNzIuMiAxNy40IDk0LjYgNDdMMzE0IDI4NC43YzEwLjcgMTQuMSA3LjkgMzQuMi02LjIgNDQuOHMtMzQuMiA3LjktNDQuOC02LjJsLTI4LjctMzcuOCAzMS4xIDkzLjRjMy41IDEwLjQtNC4zIDIxLjEtMTUuMiAyMS4xbC0xNy44IDAgMCA4MGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTgwLTE2IDAgMCA4MGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMnpNNDgwLjUgMGE2NCA2NCAwIDEgMSAwIDEyOCA2NCA2NCAwIDEgMSAwLTEyOHptLTggMzg0bDAgOTZjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xNzkuNS0xMi45IDIwLjVjLTkuNCAxNS0yOS4yIDE5LjQtNDQuMSAxMHMtMTkuNC0yOS4yLTEwLTQ0LjFsNTEuNy04Mi4xYzE3LjYtMjcuOSA0OC4zLTQ0LjkgODEuMi00NC45bDEyLjMgMGMzMyAwIDYzLjcgMTYuOSA4MS4yIDQ0LjlMNjE5LjYgMjg3YzkuNCAxNSA0LjkgMzQuNy0xMCA0NC4xcy0zNC43IDQuOS00NC4xLTEwbC0xMi45LTIwLjUgMCAxNzkuNWMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTk2LTE2IDB6Il0KICAgIH07CiAgICBmYUNoYXJ0TGluZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGFydC1saW5lIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImxpbmUtY2hhcnQiXSwgImYyMDEiLCAiTTY0IDY0YzAtMTcuNy0xNC4zLTMyLTMyLTMyUzAgNDYuMyAwIDY0TDAgNDAwYzAgNDQuMiAzNS44IDgwIDgwIDgwbDQwMCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDgwIDQxNmMtOC44IDAtMTYtNy4yLTE2LTE2TDY0IDY0em00MDYuNiA4Ni42YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwTDMyMCAyMTAuNyAyNjIuNiAxNTMuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTk2IDk2Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwbDczLjQtNzMuNCA1Ny40IDU3LjRjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsMTI4LTEyOHoiXQogICAgfTsKICAgIGZhTGluZUNoYXJ0ID0gZmFDaGFydExpbmU7CiAgICBmYVNxdWFyZUVudmVsb3BlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1lbnZlbG9wZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJlbnZlbG9wZS1zcXVhcmUiXSwgImYxOTkiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6TTIwOS4xIDI2Ny45TDEwOC40IDIwNy40Yy03LjctNC42LTEyLjQtMTIuOS0xMi40LTIxLjkgMC0xNC4xIDExLjQtMjUuNSAyNS41LTI1LjVsMjA0LjkgMGMxNC4xIDAgMjUuNSAxMS40IDI1LjUgMjUuNSAwIDktNC43IDE3LjMtMTIuNCAyMS45TDIzOC45IDI2Ny45Yy00LjUgMi43LTkuNiA0LjEtMTQuOSA0LjFzLTEwLjQtMS40LTE0LjktNC4xek0zNTIgMjM3LjNsMCA4Mi43YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0xOTIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC04Mi43IDk2LjcgNThDMjAyLjEgMzAxIDIxMyAzMDQgMjI0IDMwNHMyMS45LTMgMzEuMy04LjdsOTYuNy01OHoiXQogICAgfTsKICAgIGZhRW52ZWxvcGVTcXVhcmUgPSBmYVNxdWFyZUVudmVsb3BlOwogICAgZmFCYW5TbW9raW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhbi1zbW9raW5nIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4Njg1LCAic21va2luZy1iYW4iXSwgImY1NGQiLCAiTTk5LjUgMTQ0LjhsNzkuMiA3OS4yLTUwLjcgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxNDYuNyAwIDkyLjUgOTIuNWMtMzEuNCAyMi40LTY5LjggMzUuNS0xMTEuMiAzNS41LTEwNiAwLTE5Mi04Ni0xOTItMTkyIDAtNDEuNSAxMy4xLTc5LjkgMzUuNS0xMTEuMnpNMzMzLjMgMjg4bC0zMi0zMiA4Mi43IDAgMCAzMi01MC43IDB6bTMyIDMybDE4LjcgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTMyYzAtMTcuNy0xNC4zLTMyLTMyLTMyTDI2OS4zIDIyNCAxNDQuOCA5OS41YzMxLjQtMjIuNCA2OS44LTM1LjUgMTExLjItMzUuNSAxMDYgMCAxOTIgODYgMTkyIDE5MiAwIDQxLjUtMTMuMSA3OS45LTM1LjUgMTExLjJMMzY1LjMgMzIwek0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMjcyIDk2Yy04LjggMC0xNiA3LjItMTYgMTYgMCAyNi41IDIxLjUgNDggNDggNDhsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZzNy4yIDE2IDE2IDE2IDE2LTcuMiAxNi0xNmMwLTI2LjUtMjEuNS00OC00OC00OGwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2cy03LjItMTYtMTYtMTZ6Il0KICAgIH07CiAgICBmYVNtb2tpbmdCYW4gPSBmYUJhblNtb2tpbmc7CiAgICBmYVRydWNrRnJvbnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHJ1Y2stZnJvbnQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTJiNyIsICJNMCAxMTJDMCA2Ny44IDM1LjggMzIgODAgMzJsMjg4IDBjNDQuMiAwIDgwIDM1LjggODAgODBsMCAyNTZjMCAyNi4yLTEyLjYgNDkuNC0zMiA2NGwwIDQ4YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTMyLTE5MiAwIDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJsLTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNDhDMTIuNiA0MTcuNCAwIDM5NC4yIDAgMzY4TDAgMTEyem05NiA4MGwwIDY0IDI1NiAwIDAtNjRjMC0xNy43LTE0LjMtMzItMzItMzJsLTE5MiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnptMzIgMTYwYTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6bTIyNCAzMmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6Il0KICAgIH07CiAgICBmYUJ1aWxkaW5nMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJidWlsZGluZyIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyNzk3MCwgNjE2ODddLCAiZjFhZCIsICJNNjQgMEMyOC43IDAgMCAyOC43IDAgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjU2IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zODRjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMHpNMTc2IDM1MmwzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgODAtOTYgMCAwLTgwYzAtMTcuNyAxNC4zLTMyIDMyLTMyek05NiAxMTJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMnpNMjQwIDk2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZ6TTk2IDI0MGMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyem0xNDQtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNnoiXQogICAgfTsKICAgIGZhQnVsbHNleWUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnVsbHNleWUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjE0MCIsICJNNDQ4IDI1NmExOTIgMTkyIDAgMSAwIC0zODQgMCAxOTIgMTkyIDAgMSAwIDM4NCAwek0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwem0yNTYgODBhODAgODAgMCAxIDAgMC0xNjAgODAgODAgMCAxIDAgMCAxNjB6bTAtMjI0YTE0NCAxNDQgMCAxIDEgMCAyODggMTQ0IDE0NCAwIDEgMSAwLTI4OHpNMjI0IDI1NmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAweiJdCiAgICB9OwogICAgZmFBcnJvd0xlZnRMb25nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LWxlZnQtbG9uZyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJsb25nLWFycm93LWxlZnQiXSwgImYxNzciLCAiTTkuNCAyMzMuNGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNsMTI4IDEyOGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zTDEwOS4zIDI4OCA1NDQgMjg4YzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC00MzQuNyAwIDczLjQtNzMuNGMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMGwtMTI4IDEyOHoiXQogICAgfTsKICAgIGZhTG9uZ0Fycm93TGVmdCA9IGZhQXJyb3dMZWZ0TG9uZzsKICAgIGZhQ2hlc3NSb29rMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGVzcy1yb29rIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbOTgyMF0sICJmNDQ3IiwgIk0wIDMyTDAgMTMzLjVjMCAxNyA2LjcgMzMuMyAxOC43IDQ1LjNMNjQgMjI0IDY0IDM4NCA3LjggNDU0LjNDMi43IDQ2MC42IDAgNDY4LjQgMCA0NzYuNSAwIDQ5Ni4xIDE1LjkgNTEyIDM1LjUgNTEybDMxMi45IDBjMTkuNiAwIDM1LjUtMTUuOSAzNS41LTM1LjUgMC04LjEtMi43LTE1LjktNy44LTIyLjJsLTU2LjItNzAuMyAwLTE2MCA0NS4zLTQ1LjNjMTItMTIgMTguNy0yOC4zIDE4LjctNDUuM0wzODQgMzJjMC0xNy43LTE0LjMtMzItMzItMzJMMzIwIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgMzItNDggMCAwLTMyYzAtMTcuNy0xNC4zLTMyLTMyLTMyTDE3NiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDMyLTQ4IDAgMC0zMkM5NiAxNC4zIDgxLjcgMCA2NCAwTDMyIDBDMTQuMyAwIDAgMTQuMyAwIDMyeiJdCiAgICB9OwogICAgZmFCbGVuZGVyUGhvbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmxlbmRlci1waG9uZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNmI2IiwgIk0xNTEuNCAxMy4yYzEwLjIgNS44IDE0LjUgMTguNCAxMCAyOS4zTDEzOC4yIDk4LjhjLTMuOSA5LjYtMTMuNyAxNS40LTI0IDE0LjRsLTIwLjItMkM3OC43IDE1Mi45IDc4IDE5OC45IDkxLjkgMjQxLjFsMjIuNC0yLjJjMTAuMy0xIDIwIDQuOCAyNCAxNC40bDIzLjIgNTYuM2M0LjUgMTAuOSAuMiAyMy40LTEwIDI5LjNsLTIuOSAxLjZjLTMzLjYgMTkuMi04MS43IDE2LjItMTA2LjItMjEuNi01Ni4zLTg2LjYtNTYuMy0xOTkuMSAwLTI4NS43IDI0LjYtMzcuNyA3Mi43LTQwLjcgMTA2LjItMjEuNmwyLjkgMS42ek0yMjQgMzM2TDE5My43IDE3LjVDMTkyLjggOC4xIDIwMC4yIDAgMjA5LjYgMGwzMjQgMGMyMS4zIDAgMzYuNiAyMC4zIDMwLjggNDAuOEw1NTMuMSA4MCA0NDAgODBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsOTkuNCAwLTE4LjMgNjQtODEuMSAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDY3LjQgMC0yNy40IDk2LTI1NiAwem04IDQ4bDI0MCAwYzIyLjEgMCA0MCAxNy45IDQwIDQwbDAgNDhjMCAyMi4xLTE3LjkgNDAtNDAgNDBsLTI0MCAwYy0yMi4xIDAtNDAtMTcuOS00MC00MGwwLTQ4YzAtMjIuMSAxNy45LTQwIDQwLTQwem0xMjAgODhhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiJdCiAgICB9OwogICAgZmFBcnJvd1R1cm5VcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy10dXJuLXVwIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbImxldmVsLXVwIl0sICJmMTQ4IiwgIk0zMiA0NDhjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsOTYgMGM1MyAwIDk2LTQzIDk2LTk2bDAtMzA2LjcgNzMuNCA3My40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTEyOC0xMjhjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwbC0xMjggMTI4Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwTDE2MCAxMDkuMyAxNjAgNDE2YzAgMTcuNy0xNC4zIDMyLTMyIDMybC05NiAweiJdCiAgICB9OwogICAgZmFMZXZlbFVwID0gZmFBcnJvd1R1cm5VcDsKICAgIGZhQmljeWNsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiaWN5Y2xlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI4NjkwXSwgImYyMDYiLCAiTTMzMS43IDQzLjNDMzM2IDM2LjMgMzQzLjcgMzIgMzUyIDMybDEwNCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC02NS42IDAgNzIuMiAxNDguNGMxMC43LTIuOSAyMS45LTQuNCAzMy40LTQuNCA3MC43IDAgMTI4IDU3LjMgMTI4IDEyOHMtNTcuMyAxMjgtMTI4IDEyOC0xMjgtNTcuMy0xMjgtMTI4YzAtNDIgMjAuMi03OS4yIDUxLjQtMTAyLjZsLTIwLjQtNDEuOS03My41IDE0N2MtMi4zIDQuOC02LjMgOC44LTExLjQgMTEuMi0uNiAuMy0xLjIgLjUtMS44IC43LTIuOSAxLjEtNS45IDEuNi04LjkgMS41TDI3MSAzNjhjLTcuOSA2My4xLTYxLjcgMTEyLTEyNyAxMTItNzAuNyAwLTEyOC01Ny4zLTEyOC0xMjhTNzMuMyAyMjQgMTQ0IDIyNGMxMC44IDAgMjEuMiAxLjMgMzEuMiAzLjhsMjguNS01Ni45LTExLjUtMjYuOS00MC4yIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsNTYgMGM5LjYgMCAxOC4zIDUuNyAyMi4xIDE0LjVsMTQuMyAzMy41IDEyMy43IDAtMzcuNy03Ny41Yy0zLjYtNy40LTMuMi0xNi4yIDEuMi0yMy4yek0yMjguNSAyMjguN2wtNDUuNiA5MS4zIDg0LjggMC0zOS4xLTkxLjN6TTMwNS43IDI4N2w0Ny41LTk1LTg4LjIgMCA0MC43IDk1em0xNjguNyA3NS41bC0yOS43LTYxYy0xMi44IDEzLTIwLjcgMzAuOC0yMC43IDUwLjUgMCAzOS44IDMyLjIgNzIgNzIgNzJzNzItMzIuMiA3Mi03Mi0zMi4yLTcyLTcyLTcyYy0yLjcgMC01LjUgLjItOC4xIC41bDI5LjcgNjFjNS44IDExLjkgLjggMjYuMy0xMS4xIDMyLjFzLTI2LjMgLjgtMzIuMS0xMS4xek0xNDkuMiAzNjhjLTIwLjIgMC0zMy40LTIxLjMtMjQuMy0zOS40bDI0LjItNDguNWMtMS43LS4xLTMuNC0uMi01LjEtLjItMzkuOCAwLTcyIDMyLjItNzIgNzJzMzIuMiA3MiA3MiA3MmMzNC4zIDAgNjIuOS0yMy45IDcwLjItNTZsLTY1IDB6Il0KICAgIH07CiAgICBmYUNpcmNsZUFycm93RG93biA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtYXJyb3ctZG93biIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJhcnJvdy1jaXJjbGUtZG93biJdLCAiZjBhYiIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTIzOSAzNzdsLTgwLTgwYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBsMzkgMzkgMC0xNTAuMWMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgMTUwLjEgMzktMzljOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45bC04MCA4MGMtOS40IDkuNC0yNC42IDkuNC0zMy45IDB6Il0KICAgIH07CiAgICBmYUFycm93Q2lyY2xlRG93biA9IGZhQ2lyY2xlQXJyb3dEb3duOwogICAgZmFHZWFyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImdlYXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5ODgxLCAiY29nIl0sICJmMDEzIiwgIk0xOTUuMSA5LjVDMTk4LjEtNS4zIDIxMS4yLTE2IDIyNi40LTE2bDU5LjggMGMxNS4yIDAgMjguMyAxMC43IDMxLjMgMjUuNUwzMzIgNzkuNWMxNC4xIDYgMjcuMyAxMy43IDM5LjMgMjIuOGw2Ny44LTIyLjVjMTQuNC00LjggMzAuMiAxLjIgMzcuOCAxNC40bDI5LjkgNTEuOGM3LjYgMTMuMiA0LjkgMjkuOC02LjUgMzkuOUw0NDcgMjMzLjNjLjkgNy40IDEuMyAxNSAxLjMgMjIuN3MtLjUgMTUuMy0xLjMgMjIuN2w1My40IDQ3LjVjMTEuNCAxMC4xIDE0IDI2LjggNi41IDM5LjlsLTI5LjkgNTEuOGMtNy42IDEzLjEtMjMuNCAxOS4yLTM3LjggMTQuNGwtNjcuOC0yMi41Yy0xMi4xIDkuMS0yNS4zIDE2LjctMzkuMyAyMi44bC0xNC40IDY5LjljLTMuMSAxNC45LTE2LjIgMjUuNS0zMS4zIDI1LjVsLTU5LjggMGMtMTUuMiAwLTI4LjMtMTAuNy0zMS4zLTI1LjVsLTE0LjQtNjkuOWMtMTQuMS02LTI3LjItMTMuNy0zOS4zLTIyLjhMNzMuNSA0MzIuM2MtMTQuNCA0LjgtMzAuMi0xLjItMzcuOC0xNC40TDUuOCAzNjYuMWMtNy42LTEzLjItNC45LTI5LjggNi41LTM5LjlsNTMuNC00Ny41Yy0uOS03LjQtMS4zLTE1LTEuMy0yMi43cy41LTE1LjMgMS4zLTIyLjdMMTIuMyAxODUuOGMtMTEuNC0xMC4xLTE0LTI2LjgtNi41LTM5LjlMMzUuNyA5NC4xYzcuNi0xMy4yIDIzLjQtMTkuMiAzNy44LTE0LjRsNjcuOCAyMi41YzEyLjEtOS4xIDI1LjMtMTYuNyAzOS4zLTIyLjhMMTk1LjEgOS41ek0yNTYuMyAzMzZhODAgODAgMCAxIDAgLS42LTE2MCA4MCA4MCAwIDEgMCAuNiAxNjB6Il0KICAgIH07CiAgICBmYUNvZyA9IGZhR2VhcjsKICAgIGZhTWFyc0FuZFZlbnVzQnVyc3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFycy1hbmQtdmVudXMtYnVyc3QiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTUyMyIsICJNNDY0LTMyYzAgMTcuNyAxNC4zIDMyIDMyIDMybDM0LjcgMC02MyA2M2MtMjguNC0xOS41LTYyLjctMzEtOTkuOC0zMS05Ny4yIDAtMTc2IDc4LjgtMTc2IDE3NiAwIDg2LjMgNjIuMSAxNTguMSAxNDQgMTczLjFsMCAzNC45LTMyIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzIgMCAwIDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zMiAzMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0zMiAwIDAtMzQuOWM4MS45LTE1IDE0NC04Ni44IDE0NC0xNzMuMSAwLTM3LTExLjQtNzEuNC0zMS05OS44bDYzLTYzIDAgMzQuN2MwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTEyYzAtMTcuNy0xNC4zLTMyLTMyLTMyTDQ5Ni02NGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6TTM2OCA5NmExMTIgMTEyIDAgMSAxIDAgMjI0IDExMiAxMTIgMCAxIDEgMC0yMjR6TTE5MC45LTIxLjlDMTg4LjQtMjggMTgyLjYtMzIgMTc2LTMycy0xMi40IDQtMTQuOSAxMC4xbC0yOS40IDc0LTc2LjItMjMuMWMtNi4zLTEuOS0xMy4xIC4yLTE3LjIgNS4zUzMzLjggNDYuNSAzNyA1Mi4ybDM5LjUgNjkuMS02NS42IDQ1LjFjLTUuNCAzLjctOCAxMC4zLTYuNSAxNi43czYuNyAxMS4yIDEzLjEgMTIuMmw3OC43IDEyLjItNS42IDc5LjRjLS41IDYuNSAzLjEgMTIuNyA5IDE1LjVzMTIuOSAxLjggMTcuOC0yLjZMMTUyLjEgMjY4Yy01LjMtMTkuMS04LjEtMzkuMi04LjEtNjAgMC02NS40IDI4LTEyNC4yIDcyLjYtMTY1LjFMMTkwLjktMjEuOXoiXQogICAgfTsKICAgIGZhT3R0ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAib3R0ZXIiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjk0NDZdLCAiZjcwMCIsICJNMTgxLjUgMTk3LjFsMTIuOSA2LjRjNS45IDMgMTIuNCA0LjUgMTkuMSA0LjUgMjMuNSAwIDQyLjYtMTkuMSA0Mi42LTQyLjZsMC0yMS40YzAtMzUuMy0yOC43LTY0LTY0LTY0bC02NCAwYy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDIxLjRjMCAyMy41IDE5LjEgNDIuNiA0Mi42IDQyLjYgNi42IDAgMTMuMS0xLjUgMTkuMS00LjUgOS4zLTQuNyAxNi40LTguMiAyMS4yLTEwLjZMMTM1LjEgMTg1Yy00LjUtMy03LjEtOC03LjEtMTMuM2wwLTMuN2MwLTEzLjMgMTAuNy0yNCAyNC0yNGwxNiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgMy43YzAgNS4zLTIuNyAxMC4zLTcuMSAxMy4zbC0xMS44IDcuOSA4LjQgNC4yem0tOC42IDQ5LjRsLTEyLjktNi40LTEyLjkgNi40Yy0xMi42IDYuMy0yNi41IDkuNi00MC41IDkuNi0zLjYgMC03LjEtLjItMTAuNi0uNmwwIC42YzAgMzUuMyAyOC43IDY0IDY0IDY0bDY0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsMTYwIDAgMC02NGMwLTIzLjcgMTIuOS00NC40IDMyLTU1LjQgOS40LTUuNCAyMC4zLTguNiAzMi04LjZsMC0xNmMwLTI2LjUgMjEuNS00OCA0OC00OCA4LjggMCAxNiA3LjIgMTYgMTZsMCA5NmMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtOTkuN2MwLTQ4LjItMzAuOC05MS03Ni42LTEwNi4zbC04LjUtMi44Yy04LTIuNy0xMi42LTExLjEtMTAuNC0xOS4zczEwLjMtMTMuMiAxOC42LTExLjZsMTkuOSA0QzU3NiA4Ni4xIDY0MCAxNjQuMiA2NDAgMjU0LjlsMCAxLjEgMCAwYzAgMTIzLjctMTAwLjMgMjI0LTIyNCAyMjRsLTE2MC42IDBDMTMyIDQ4MCAzMiAzODAgMzIgMjU2LjZsMC0zOS44Yy0xMC4xLTE0LjYtMTYtMzIuMy0xNi01MS40bDAtMjEuNCAwLTEuNEM2LjcgMTM5LjMgMCAxMzAuNSAwIDEyMCAwIDEwNi43IDEwLjcgOTYgMjQgOTZsMi44IDBDNDQuOCA1OC4yIDgzLjMgMzIgMTI4IDMybDY0IDBjNDQuNyAwIDgzLjIgMjYuMiAxMDEuMiA2NGwyLjggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNCAwIDEwLjUtNi43IDE5LjMtMTYgMjIuNmwwIDEuNCAwIDIxLjRjMCAxLjQgMCAyLjgtLjEgNC4zIDEyLTYuMiAyNS43LTkuNiA0MC4xLTkuNmw4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTggMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCA4IDU2LjQgMGMtMTUuMiAxNy0yNC40IDM5LjQtMjQuNCA2NGwtMzIgMGMtNDIuMyAwLTc4LjItMjcuNC05MS02NS4zLTUuMSAuOS0xMC4zIDEuMy0xNS42IDEuMy0xNC4xIDAtMjcuOS0zLjMtNDAuNS05LjZ6TTk2IDEyOGExNiAxNiAwIDEgMSAwIDMyIDE2IDE2IDAgMSAxIDAtMzJ6bTExMiAxNmExNiAxNiAwIDEgMSAzMiAwIDE2IDE2IDAgMSAxIC0zMiAweiJdCiAgICB9OwogICAgZmFDaXJjbGVDaGV2cm9uTGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtY2hldnJvbi1sZWZ0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImNoZXZyb24tY2lyY2xlLWxlZnQiXSwgImYxMzciLCAiTTUxMiAyNTZhMjU2IDI1NiAwIDEgMCAtNTEyIDAgMjU2IDI1NiAwIDEgMCA1MTIgMHpNMjcxIDEzNWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjlsLTg3IDg3IDg3IDg3YzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBMMTY3IDI3M2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlMMjcxIDEzNXoiXQogICAgfTsKICAgIGZhQ2hldnJvbkNpcmNsZUxlZnQgPSBmYUNpcmNsZUNoZXZyb25MZWZ0OwogICAgZmFDaXJjbGVRdWVzdGlvbjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLXF1ZXN0aW9uIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjIxMDgsICJxdWVzdGlvbi1jaXJjbGUiXSwgImYwNTkiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyem0wLTMzNmMtMTcuNyAwLTMyIDE0LjMtMzIgMzIgMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRjMC00NC4yIDM1LjgtODAgODAtODBzODAgMzUuOCA4MCA4MGMwIDQ3LjItMzYgNjcuMi01NiA3NC41bDAgMy44YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtOC4xYzAtMjAuNSAxNC44LTM1LjIgMzAuMS00MC4yIDYuNC0yLjEgMTMuMi01LjUgMTguMi0xMC4zIDQuMy00LjIgNy43LTEwIDcuNy0xOS42IDAtMTcuNy0xNC4zLTMyLTMyLTMyek0yMjQgMzY4YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6Il0KICAgIH07CiAgICBmYVF1ZXN0aW9uQ2lyY2xlMiA9IGZhQ2lyY2xlUXVlc3Rpb24yOwogICAgZmFXYWxraWVUYWxraWUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid2Fsa2llLXRhbGtpZSIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmOGVmIiwgIk04OC0zMmMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDcyIDQ4IDBjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwzMiAwYzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMTYgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDE2MC45YzAgOS45LTIuMyAxOS43LTYuOCAyOC42bC0yMC4yIDQwLjRjLTMuMyA2LjctNS4xIDE0LTUuMSAyMS41bDAgODQuN2MwIDM1LjMtMjguNyA2NC02NCA2NEw5NiA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtODQuN2MwLTcuNS0xLjctMTQuOC01LjEtMjEuNUw2LjggMzAxLjVDMi4zIDI5Mi42IDAgMjgyLjggMCAyNzIuOUwwIDExMkMwIDg1LjUgMjEuNSA2NCA0OCA2NGwxNiAwIDAtNzJjMC0xMy4zIDEwLjctMjQgMjQtMjR6bTMyIDE3NmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNDQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTQ0IDB6bTAgOTZjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTQ0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE0NCAweiJdCiAgICB9OwogICAgZmFVc2VyR3JvdXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlci1ncm91cCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyODEwMSwgInVzZXItZnJpZW5kcyJdLCAiZjUwMCIsICJNNjQgMTI4YTExMiAxMTIgMCAxIDEgMjI0IDAgMTEyIDExMiAwIDEgMSAtMjI0IDB6TTAgNDY0YzAtOTcuMiA3OC44LTE3NiAxNzYtMTc2czE3NiA3OC44IDE3NiAxNzZsMCA2YzAgMjMuMi0xOC44IDQyLTQyIDQyTDQyIDUxMmMtMjMuMiAwLTQyLTE4LjgtNDItNDJsMC02ek00MzIgNjRhOTYgOTYgMCAxIDEgMCAxOTIgOTYgOTYgMCAxIDEgMC0xOTJ6bTAgMjQwYzc5LjUgMCAxNDQgNjQuNSAxNDQgMTQ0bDAgMjIuNGMwIDIzLTE4LjYgNDEuNi00MS42IDQxLjZsLTE0NC44IDBjNi42LTEyLjUgMTAuNC0yNi44IDEwLjQtNDJsMC02YzAtNTEuNS0xNy40LTk4LjktNDYuNS0xMzYuNyAyMi42LTE0LjcgNDkuNi0yMy4zIDc4LjUtMjMuM3oiXQogICAgfTsKICAgIGZhVXNlckZyaWVuZHMgPSBmYVVzZXJHcm91cDsKICAgIGZhSG91c2VDaGltbmV5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLWNoaW1uZXkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MzQ5OSwgImhvbWUtbGciXSwgImUzYWYiLCAiTTIzNC4yIDguNmMxMi4zLTExLjQgMzEuMy0xMS40IDQzLjUgMEwzNjggOTIuMyAzNjggODBjMC0xNy43IDE0LjMtMzIgMzItMzJsMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDEwMS41IDM3LjggMzUuMWM5LjYgOSAxMi44IDIyLjkgOCAzNS4xUzQ5My4yIDI3MiA0ODAgMjcybC0xNiAwIDAgMTc2YzAgMzUuMy0yOC43IDY0LTY0IDY0bC0yODggMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0xNzYtMTYgMGMtMTMuMiAwLTI1LTguMS0yOS44LTIwLjNzLTEuNi0yNi4yIDgtMzUuMWwyMjQtMjA4ek0yNDAgMzIwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDk2IDEyOCAwIDAtOTZjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTMyIDB6Il0KICAgIH07CiAgICBmYUhvbWVMZyA9IGZhSG91c2VDaGltbmV5OwogICAgZmFSaWdodEZyb21CcmFja2V0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJpZ2h0LWZyb20tYnJhY2tldCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJzaWduLW91dC1hbHQiXSwgImYyZjUiLCAiTTUwNSAyNzNjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlMMzYxIDk1Yy02LjktNi45LTE3LjItOC45LTI2LjItNS4yUzMyMCAxMDIuMyAzMjAgMTEybDAgODAtMTEyIDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgMzJjMCAyNi41IDIxLjUgNDggNDggNDhsMTEyIDAgMCA4MGMwIDkuNyA1LjggMTguNSAxNC44IDIyLjJzMTkuMyAxLjcgMjYuMi01LjJMNTA1IDI3M3pNMTYwIDk2YzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDk2IDMyQzQzIDMyIDAgNzUgMCAxMjhMMCAzODRjMCA1MyA0MyA5NiA5NiA5Nmw2NCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC02NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTI1NmMwLTE3LjcgMTQuMy0zMiAzMi0zMmw2NCAweiJdCiAgICB9OwogICAgZmFTaWduT3V0QWx0ID0gZmFSaWdodEZyb21CcmFja2V0OwogICAgZmFGaWxlMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4MTk2LCAxMjg0NTksIDYxNDYyXSwgImYxNWIiLCAiTTY0IDBDMjguNyAwIDAgMjguNyAwIDY0TDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI1NiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjc3LjVjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNMMjU4LjcgMTguN0MyNDYuNyA2LjcgMjMwLjUgMCAyMTMuNSAwTDY0IDB6TTMyNS41IDE3NkwyMzIgMTc2Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNEwyMDggNTguNSAzMjUuNSAxNzZ6Il0KICAgIH07CiAgICBmYVBsYW5lU2xhc2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGxhbmUtc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTA2OSIsICJNNDEtMjQuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTLTIuMy0uMyA3IDkuMWw1MjggNTI4YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtMTgzLjQtMTgzLjQgNy4xLTcuNyAxMjcuMyAwYzMwLjkgMCA1Ni0yNS4xIDU2LTU2cy0yNS4xLTU2LTU2LTU2TDM5Mi43IDIwMCAyMzMuNSAyNi40QzIyNy41IDE5LjggMjE4LjkgMTYgMjA5LjkgMTZsLTQzLjcgMGMtMTAuOSAwLTE4LjYgMTAuNy0xNS4yIDIxLjFMMTc1LjEgMTA5LjIgNDEtMjQuOXpNMTMwLjIgMjAwbC0yNC42IDAtNTIuOC02NmMtMy0zLjgtNy42LTYtMTIuNS02bC0xOS44IDBjLTEwLjQgMC0xOCA5LjgtMTUuNSAxOS45TDMyIDI1NiA1IDM2NC4xQzIuNCAzNzQuMiAxMC4xIDM4NCAyMC41IDM4NGwxOS44IDBjNC45IDAgOS41LTIuMiAxMi41LTZsNTIuOC02NiA5OS43IDAtNTQuMyAxNjIuOWMtMy41IDEwLjQgNC4zIDIxLjEgMTUuMiAyMS4xbDQzLjcgMGM5IDAgMTcuNS0zLjggMjMuNi0xMC40TDMyMC43IDM5MC41IDEzMC4yIDIwMHoiXQogICAgfTsKICAgIGZhQ2xvdWRTaG93ZXJzSGVhdnkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2xvdWQtc2hvd2Vycy1oZWF2eSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNzQwIiwgIk05NiAzMjBjLTUzIDAtOTYtNDMtOTYtOTYgMC00Mi41IDI3LjYtNzguNiA2NS45LTkxLjItMS4zLTYuNy0xLjktMTMuNy0xLjktMjAuOCAwLTYxLjkgNTAuMS0xMTIgMTEyLTExMiA0My4xIDAgODAuNSAyNC4zIDk5LjIgNjAgMTQuNy0xNy4xIDM2LjUtMjggNjAuOC0yOCA0NC4yIDAgODAgMzUuOCA4MCA4MCAwIDUuNS0uNiAxMC44LTEuNiAxNiAuNSAwIDEuMSAwIDEuNiAwIDUzIDAgOTYgNDMgOTYgOTZzLTQzIDk2LTk2IDk2TDk2IDMyMHptNi44IDc5LjZsLTMyIDk2QzY2LjYgNTA4LjIgNTMgNTE1IDQwLjQgNTEwLjhTMjEgNDkzIDI1LjIgNDgwLjRsMzItOTZDNjEuNCAzNzEuOCA3NSAzNjUgODcuNiAzNjkuMlMxMDcgMzg3IDEwMi44IDM5OS42em0xMjAgMGwtMzIgOTZjLTQuMiAxMi42LTE3LjggMTkuNC0zMC40IDE1LjJTMTQxIDQ5MyAxNDUuMiA0ODAuNGwzMi05NmM0LjItMTIuNiAxNy44LTE5LjQgMzAuNC0xNS4yUzIyNyAzODcgMjIyLjggMzk5LjZ6bTExMiAwbC0zMiA5NmMtNC4yIDEyLjYtMTcuOCAxOS40LTMwLjQgMTUuMlMyNTMgNDkzIDI1Ny4yIDQ4MC40bDMyLTk2YzQuMi0xMi42IDE3LjgtMTkuNCAzMC40LTE1LjJTMzM5IDM4NyAzMzQuOCAzOTkuNnptMTIwIDBsLTMyIDk2Yy00LjIgMTIuNi0xNy44IDE5LjQtMzAuNCAxNS4yUzM3MyA0OTMgMzc3LjIgNDgwLjRsMzItOTZjNC4yLTEyLjYgMTcuOC0xOS40IDMwLjQtMTUuMlM0NTkgMzg3IDQ1NC44IDM5OS42eiJdCiAgICB9OwogICAgZmFQZXJzb25GYWxsaW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1mYWxsaW5nIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1NDYiLCAiTTMyMCAzMmMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDUuNGMwIDQ1LTIzLjYgODYuNi02Mi4xIDEwOS44bC00LjYgMi44QzEzMS40IDE4NC43IDk2IDI0Ny4xIDk2IDMxNC42TDk2IDM4NGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtNjkuNGMwLTE2LjcgMy4zLTMzIDkuNC00OEwzNTkuMiA1MDAuMmMxMS4xIDEzLjcgMzEuMyAxNS44IDQ1IDQuN3MxNS44LTMxLjMgNC43LTQ1TDI5NS4yIDMyMCA0MDAgMzIwIDQzOC40IDM3MS4yYzEwLjYgMTQuMSAzMC43IDE3IDQ0LjggNi40czE3LTMwLjcgNi40LTQ0LjhsLTQzLjItNTcuNkM0MzcuMyAyNjMuMSA0MjMuMSAyNTYgNDA4IDI1NmwtODkgMC02Mi45LTc1LjVjNDAuMy0zNiA2My45LTg3LjkgNjMuOS0xNDMuMWwwLTUuNHpNMTA0IDE0NGE1NiA1NiAwIDEgMCAwLTExMiA1NiA1NiAwIDEgMCAwIDExMnoiXQogICAgfTsKICAgIGZhVHVybkRvd24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHVybi1kb3duIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTA1NDksICJsZXZlbC1kb3duLWFsdCJdLCAiZjNiZSIsICJNMTY5LjQgNTAyLjZjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsMTI4LTEyOGM5LjItOS4yIDExLjktMjIuOSA2LjktMzQuOVMzMzIuOSAzMjAgMzIwIDMyMGwtNjQgMCAwLTE2MEMyNTYgNzEuNiAxODQuNCAwIDk2IDBMMzIgMEMxNC4zIDAgMCAxNC4zIDAgMzJMMCA5NmMwIDE3LjcgMTQuMyAzMiAzMiAzMmw2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTYwLTY0IDBjLTEyLjkgMC0yNC42IDcuOC0yOS42IDE5LjhzLTIuMiAyNS43IDYuOSAzNC45bDEyOCAxMjh6Il0KICAgIH07CiAgICBmYUxldmVsRG93bkFsdCA9IGZhVHVybkRvd247CiAgICBmYVVwUmlnaHRBbmREb3duTGVmdEZyb21DZW50ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXAtcmlnaHQtYW5kLWRvd24tbGVmdC1mcm9tLWNlbnRlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJleHBhbmQtYWx0Il0sICJmNDI0IiwgIk0zNDQgMEw0ODggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDE0NGMwIDkuNy01LjggMTguNS0xNC44IDIyLjJzLTE5LjMgMS43LTI2LjItNS4ybC0zOS0zOS04NyA4N2MtOS40IDkuNC0yNC42IDkuNC0zMy45IDBsLTMyLTMyYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOWw4Ny04Ny0zOS0zOWMtNi45LTYuOS04LjktMTcuMi01LjItMjYuMlMzMzQuMyAwIDM0NCAwek0xNjggNTEyTDI0IDUxMmMtMTMuMyAwLTI0LTEwLjctMjQtMjRMMCAzNDRjMC05LjcgNS44LTE4LjUgMTQuOC0yMi4yUzM0LjEgMzIwLjIgNDEgMzI3bDM5IDM5IDg3LTg3YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwbDMyIDMyYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45bC04NyA4NyAzOSAzOWM2LjkgNi45IDguOSAxNy4yIDUuMiAyNi4yUzE3Ny43IDUxMiAxNjggNTEyeiJdCiAgICB9OwogICAgZmFFeHBhbmRBbHQgPSBmYVVwUmlnaHRBbmREb3duTGVmdEZyb21DZW50ZXI7CiAgICBmYVVzZXJUYWcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlci10YWciLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjUwNyIsICJNMjU2LjEgOGExMjAgMTIwIDAgMSAxIDAgMjQwIDEyMCAxMjAgMCAxIDEgMC0yNDB6TTIyNi40IDMwNGw1OS40IDBjNi43IDAgMTMuMiAuNCAxOS43IDEuMS0uOSA0LjktMS40IDkuOS0xLjQgMTVsMCA5Mi4xYzAgMjUuNSAxMC4xIDQ5LjkgMjguMSA2Ny45bDMxLjkgMzEuOS0yODYuMyAwYy0xNi40IDAtMjkuNy0xMy4zLTI5LjctMjkuNyAwLTk4LjUgNzkuOC0xNzguMyAxNzguMy0xNzguM3pNMzUyLjEgNDEyLjJsMC05Mi4xYzAtMTcuNyAxNC4zLTMyIDMyLTMybDkyLjEgMGMxMi43IDAgMjQuOSA1LjEgMzMuOSAxNC4xbDk2IDk2YzE4LjcgMTguNyAxOC43IDQ5LjEgMCA2Ny45bC03Ni4xIDc2LjFjLTE4LjcgMTguNy00OS4xIDE4LjctNjcuOSAwbC05Ni05NmMtOS05LTE0LjEtMjEuMi0xNC4xLTMzLjl6bTEwNC00NC4yYTI0IDI0IDAgMSAwIC00OCAwIDI0IDI0IDAgMSAwIDQ4IDB6Il0KICAgIH07CiAgICBmYUhhbmRTcGFya2xlcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kLXNwYXJrbGVzIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImUwNWQiLCAiTTMyMCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMjA4YzAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZsMC0xNzZjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDE3NmMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtMTEyYzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAxNzguMmMtMTkuMiA1LjQtMzQuNyAyMC40LTQwLjQgNDAuM2wtNi41IDIyLjctMjIuNyA2LjVjLTI1LjIgNy4yLTQyLjUgMzAuMi00Mi41IDU2LjQgMCAyMi4xIDEyLjQgNDIgMzEuNCA1MS45LTI3LjUgMTcuOC02MC4yIDI4LjEtOTUuNCAyOC4xbC0xOS4yIDBjLTU5LjYgMC0xMTYuOS0yMi45LTE2MC02NEw3Ni40IDM0MWMtMTYtMTUuMi0xNi42LTQwLjYtMS40LTU2LjZzNDAuNi0xNi42IDU2LjYtMS40bDYwLjUgNTcuNmMwLTEuNS0uMS0zLjEtLjEtNC42bDAtMjcyYzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAxNzZjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTIwOGMwLTE3LjcgMTQuMy0zMiAzMi0zMnptLTcuMyAzMjYuNmMtMS4xLTMuOS00LjctNi42LTguNy02LjZzLTcuNiAyLjctOC43IDYuNmwtNy4zIDI1LjQtMjUuNCA3LjNjLTMuOSAxLjEtNi42IDQuNy02LjYgOC43czIuNyA3LjYgNi42IDguN2wyNS40IDcuMyA3LjMgMjUuNGMxLjEgMy45IDQuNyA2LjYgOC43IDYuNnM3LjYtMi43IDguNy02LjZsNy4zLTI1LjQgMjUuNC03LjNjMy45LTEuMSA2LjYtNC43IDYuNi04LjdzLTIuNy03LjYtNi42LTguN2wtMjUuNC03LjMtNy4zLTI1LjR6TTEwNCAxMjBsNDguMyAxMy44YzQuNiAxLjMgNy43IDUuNSA3LjcgMTAuMnMtMy4xIDguOS03LjcgMTAuMkwxMDQgMTY4IDkwLjIgMjE2LjNjLTEuMyA0LjYtNS41IDcuNy0xMC4yIDcuN3MtOC45LTMuMS0xMC4yLTcuN0w1NiAxNjggNy43IDE1NC4yQzMuMSAxNTIuOSAwIDE0OC43IDAgMTQ0czMuMS04LjkgNy43LTEwLjJMNTYgMTIwIDY5LjggNzEuN0M3MS4xIDY3LjEgNzUuMyA2NCA4MCA2NHM4LjkgMy4xIDEwLjIgNy43TDEwNCAxMjB6TTU4NCA0MDhsNDguMyAxMy44YzQuNiAxLjMgNy43IDUuNSA3LjcgMTAuMnMtMy4xIDguOS03LjcgMTAuMkw1ODQgNDU2IDU3MC4yIDUwNC4zYy0xLjMgNC42LTUuNSA3LjctMTAuMiA3LjdzLTguOS0zLjEtMTAuMi03LjdMNTM2IDQ1NiA0ODcuNyA0NDIuMmMtNC42LTEuMy03LjctNS41LTcuNy0xMC4yczMuMS04LjkgNy43LTEwLjJMNTM2IDQwOCA1NDkuOCAzNTkuN2MxLjMtNC42IDUuNS03LjcgMTAuMi03LjdzOC45IDMuMSAxMC4yIDcuN0w1ODQgNDA4eiJdCiAgICB9OwogICAgZmFBcnJvd3NUb0RvdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvd3MtdG8tZG90IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU0YmUiLCAiTTI1NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzIgMzIgMGMxMi45IDAgMjQuNiA3LjggMjkuNiAxOS44czIuMiAyNS43LTYuOSAzNC45bC02NCA2NGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBsLTY0LTY0Yy05LjItOS4yLTExLjktMjIuOS02LjktMzQuOVMxNzkuMSA2NCAxOTIgNjRsMzIgMCAwLTMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyek0xNjkuNCAzOTMuNGw2NC02NGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMGw2NCA2NGM5LjIgOS4yIDExLjkgMjIuOSA2LjkgMzQuOVMzMzIuOSA0NDggMzIwIDQ0OGwtMzIgMCAwIDMyYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMzItMzIgMGMtMTIuOSAwLTI0LjYtNy44LTI5LjYtMTkuOHMtMi4yLTI1LjcgNi45LTM0Ljl6TTMyIDIyNGwzMiAwIDAtMzJjMC0xMi45IDcuOC0yNC42IDE5LjgtMjkuNnMyNS43LTIuMiAzNC45IDYuOWw2NCA2NGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM2wtNjQgNjRjLTkuMiA5LjItMjIuOSAxMS45LTM0LjkgNi45UzY0IDMzMi45IDY0IDMyMGwwLTMyLTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJ6bTI5Ny40IDU0LjZjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zbDY0LTY0YzkuMi05LjIgMjIuOS0xMS45IDM0LjktNi45UzQ0OCAxNzkuMSA0NDggMTkybDAgMzIgMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIgMCAwIDMyYzAgMTIuOS03LjggMjQuNi0xOS44IDI5LjZzLTI1LjcgMi4yLTM0LjktNi45bC02NC02NHpNMjU2IDIyNGEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYUZhY2VTYWRDcnkyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2Utc2FkLWNyeSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU1NywgInNhZC1jcnkiXSwgImY1YjMiLCAiTTM1MiA0OTMuNGMtMjkuNiAxMi02Mi4xIDE4LjYtOTYgMTguNnMtNjYuNC02LjYtOTYtMTguNkwxNjAgMjk2YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTcxLjdDNDQuNCA0MjEuNiAwIDM0NCAwIDI1NiAwIDExNC42IDExNC42IDAgMjU2IDBTNTEyIDExNC42IDUxMiAyNTZjMCA4OC00NC40IDE2NS42LTExMiAyMTEuN0w0MDAgMjk2YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTk3LjR6TTE1MiAxOTZsMTYgMGMxMSAwIDIwIDkgMjAgMjBzOSAyMCAyMCAyMCAyMC05IDIwLTIwYzAtMzMuMS0yNi45LTYwLTYwLTYwbC0xNiAwYy0zMy4xIDAtNjAgMjYuOS02MCA2MCAwIDExIDkgMjAgMjAgMjBzMjAtOSAyMC0yMCA5LTIwIDIwLTIwem0xNzIgMjBjMC0xMSA5LTIwIDIwLTIwbDE2IDBjMTEgMCAyMCA5IDIwIDIwczkgMjAgMjAgMjAgMjAtOSAyMC0yMGMwLTMzLjEtMjYuOS02MC02MC02MGwtMTYgMGMtMzMuMSAwLTYwIDI2LjktNjAgNjAgMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjB6TTIwOCAzMzZsMCAzMmMwIDI2LjUgMjEuNSA0OCA0OCA0OHM0OC0yMS41IDQ4LTQ4bDAtMzJjMC0yNi41LTIxLjUtNDgtNDgtNDhzLTQ4IDIxLjUtNDggNDh6Il0KICAgIH07CiAgICBmYVNhZENyeTIgPSBmYUZhY2VTYWRDcnkyOwogICAgZmFEb25nU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkb25nLXNpZ24iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZTE2OSIsICJNMjg4LTE2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDMyLTEwNCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDEwNCAwIDAgNzIuMmMtMjIuOS0xNS4zLTUwLjQtMjQuMi04MC0yNC4yLTc5LjUgMC0xNDQgNjQuNS0xNDQgMTQ0Uzk2LjUgNDMyIDE3NiA0MzJjMzAgMCA1Ny44LTkuMSA4MC44LTI0LjggMy4zIDE0LjIgMTYgMjQuOCAzMS4yIDI0LjggMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0zMDQgNDAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNDAgMCAwLTMyYzAtMTcuNy0xNC4zLTMyLTMyLTMyek05NiAyODhhODAgODAgMCAxIDEgMTYwIDAgODAgODAgMCAxIDEgLTE2MCAwek0yNCA0NjRjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMzM2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRMMjQgNDY0eiJdCiAgICB9OwogICAgZmFQZW9wbGVMaW5lID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlb3BsZS1saW5lIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1MzQiLCAiTTI4OCAwYTY0IDY0IDAgMSAxIDAgMTI4IDY0IDY0IDAgMSAxIDAtMTI4em05NiAzMTJjMCAyNS0xMi43IDQ3LTMyIDU5LjlsMCA0NC4xLTEyOCAwIDAtNDQuMUMyMDQuNyAzNTkgMTkyIDMzNyAxOTIgMzEybDAtNDBjMC01MyA0My05NiA5Ni05NnM5NiA0MyA5NiA5NmwwIDQwem0xNiAxMDRsMC0yNy4zYzE5LjktMjIuNSAzMi01Mi4yIDMyLTg0LjdsMC0zMmMwLTI2LjctNy4zLTUxLjYtMTkuOS03My4xIDExLjEtNC41IDIzLjItNi45IDM1LjktNi45IDUzIDAgOTYgNDMgOTYgOTZsMCAzMmMwIDIzLjctMTIuOSA0NC40LTMyIDU1LjRsMCA0MC42LTExMiAwek02NCAzNzUuNEM0NC45IDM2NC40IDMyIDM0My43IDMyIDMyMGwwLTMyYzAtNTMgNDMtOTYgOTYtOTYgMTIuNyAwIDI0LjggMi41IDM1LjkgNi45LTEyLjYgMjEuNC0xOS45IDQ2LjQtMTkuOSA3My4xbDAgMzJjMCAzMi41IDEyLjEgNjIuMSAzMiA4NC43bDAgMjcuMy0xMTIgMCAwLTQwLjZ6TTEyOCAzMmE1NiA1NiAwIDEgMSAwIDExMiA1NiA1NiAwIDEgMSAwLTExMnptMzIwIDBhNTYgNTYgMCAxIDEgMCAxMTIgNTYgNTYgMCAxIDEgMC0xMTJ6TTI0IDQ2NGw1MjggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNEwyNCA1MTJjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYVNxdWFyZVJzcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtcnNzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInJzcy1zcXVhcmUiXSwgImYxNDMiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6TTk2IDEzNmMwLTEzLjMgMTAuNy0yNCAyNC0yNCAxMzcgMCAyNDggMTExIDI0OCAyNDggMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRjMC0xMTAuNS04OS41LTIwMC0yMDAtMjAwLTEzLjMgMC0yNC0xMC43LTI0LTI0em0wIDk2YzAtMTMuMyAxMC43LTI0IDI0LTI0IDgzLjkgMCAxNTIgNjguMSAxNTIgMTUyIDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtNTcuNC00Ni42LTEwNC0xMDQtMTA0LTEzLjMgMC0yNC0xMC43LTI0LTI0em0wIDEyMGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAweiJdCiAgICB9OwogICAgZmFSc3NTcXVhcmUgPSBmYVNxdWFyZVJzczsKICAgIGZhQ2FsZW5kYXJNaW51czIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FsZW5kYXItbWludXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjI3MiIsICJNMTI4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAzMiAxMjggMCAwLTMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAzMiAzMiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjg4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsMzIgMCAwLTMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyem0yNCAyNjRjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTQ0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE0NCAweiJdCiAgICB9OwogICAgZmFDaGFydERpYWdyYW0gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hhcnQtZGlhZ3JhbSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNjk1IiwgIk04MCAzMkM1My41IDMyIDMyIDUzLjUgMzIgODBzMjEuNSA0OCA0OCA0OGwxNTIgMCAwIDQwLTQ4IDQ4LTcyIDBjLTM5LjggMC03MiAzMi4yLTcyIDcybDAgNjQtOCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDY0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDY0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtOCAwIDAtNjRjMC0xMy4zIDEwLjctMjQgMjQtMjRsNzIgMCA0OCA0OCAwIDQwLTggMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmw2NCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNjRjMC0xNy43LTE0LjMtMzItMzItMzJsLTggMCAwLTQwIDQ4LTQ4IDcyIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA2NC04IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgNjRjMCAxNy43IDE0LjMgMzIgMzIgMzJsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTY0YzAtMTcuNy0xNC4zLTMyLTMyLTMybC04IDAgMC02NGMwLTM5LjgtMzIuMi03Mi03Mi03MmwtNzIgMC00OC00OCAwLTQwIDE1MiAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4cy0yMS41LTQ4LTQ4LTQ4TDgwIDMyeiJdCiAgICB9OwogICAgZmFGYWNlVGlyZWQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtdGlyZWQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1NTUsICJ0aXJlZCJdLCAiZjVjOCIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTE2NC43IDMyOC43YzIyLTIyIDUzLjktNDAuNyA5MS4zLTQwLjdzNjkuMyAxOC43IDkxLjMgNDAuN2MxMS4xIDExLjEgMjAuMSAyMy40IDI2LjQgMzUuNCA2LjIgMTEuNyAxMC4zIDI0LjQgMTAuMyAzNS45IDAgNS4yLTIuNiAxMC4yLTYuOSAxMy4ycy05LjggMy43LTE0LjcgMS44bC0yMC41LTcuN2MtMjYuOS0xMC4xLTU1LjUtMTUuMy04NC4zLTE1LjNsLTMuMiAwYy0yOC44IDAtNTcuMyA1LjItODQuMyAxNS4zTDE0OS42IDQxNWMtNC45IDEuOC0xMC40IDEuMi0xNC43LTEuOFMxMjggNDA1LjIgMTI4IDQwMGMwLTExLjYgNC4yLTI0LjIgMTAuMy0zNS45IDYuMy0xMiAxNS4zLTI0LjMgMjYuNC0zNS40ek0xMjIuNiAxNTkuMmM0LjUtNi44IDEzLjMtOS4yIDIwLjYtNS41bDc5LjYgNDBjNS40IDIuNyA4LjggOC4yIDguOCAxNC4zcy0zLjQgMTEuNi04LjggMTQuM2wtNzkuNiA0MGMtNy4zIDMuNi0xNi4xIDEuMy0yMC42LTUuNXMtMy4xLTE1LjkgMy4xLTIxLjFMMTU5IDIwOCAxMjUuOCAxODAuM2MtNi4yLTUuMi03LjYtMTQuMy0zLjEtMjEuMXptMjYzLjYgMjEuMUwzNTMgMjA4IDM4Ni4yIDIzNS43YzYuMiA1LjIgNy42IDE0LjMgMy4xIDIxLjFzLTEzLjMgOS4yLTIwLjYgNS41bC03OS42LTQwYy01LjQtMi43LTguOC04LjItOC44LTE0LjNzMy40LTExLjYgOC44LTE0LjNsNzkuNi00MGM3LjMtMy42IDE2LjEtMS4zIDIwLjYgNS41czMuMSAxNS45LTMuMSAyMS4xeiJdCiAgICB9OwogICAgZmFUaXJlZDIgPSBmYUZhY2VUaXJlZDI7CiAgICBmYUhhbmRQb2ludFJpZ2h0MiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kLXBvaW50LXJpZ2h0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYwYTQiLCAiTTQ4MCA5NmMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMjA4IDAgMC02NCAyMDggMHpNMzIwIDI4OGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtNjQgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw2NCAwem02NC02NGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtNDggMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw0OCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMyek0yODggMzg0YzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC02NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDY0IDB6bS04OC05NmwuNiAwYy01LjQgOS40LTguNiAyMC4zLTguNiAzMiAwIDEzLjIgNCAyNS40IDEwLjggMzUuNi0yNC45IDguNy00Mi44IDMyLjUtNDIuOCA2MC40IDAgMTEuNyAzLjEgMjIuNiA4LjYgMzJsLTguNiAwQzcxLjYgNDQ4IDAgMzc2LjQgMCAyODhsMC02MS43YzAtNDIuNCAxNi45LTgzLjEgNDYuOS0xMTMuMWwxMS42LTExLjZDODIuNSA3Ny41IDExNS4xIDY0IDE0OSA2NGwyNyAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgODhjMCAyMi4xLTE3LjkgNDAtNDAgNDBzLTQwLTE3LjktNDAtNDBsMC01NmMwLTguOC03LjItMTYtMTYtMTZzLTE2IDcuMi0xNiAxNmwwIDU2YzAgMzkuOCAzMi4yIDcyIDcyIDcyeiJdCiAgICB9OwogICAgZmFBcnJvd1VwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXVwIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbODU5M10sICJmMDYyIiwgIk0yMTQuNiA5LjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwbC0xNjAgMTYwYy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwTDE2MCAxMDkuMyAxNjAgNDgwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zNzAuNyAxMDUuNCAxMDUuNGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zbC0xNjAtMTYweiJdCiAgICB9OwogICAgZmFDdWJlc1N0YWNrZWQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY3ViZXMtc3RhY2tlZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNGU2IiwgIk0xOTIgMzJjMC0xNy43IDE0LjMtMzIgMzItMzJsNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMybC02NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTY0em0zMiAzNTJsNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMybC02NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyem0xOTIgMGw2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJ6TTMyMCAxOTJsNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMybC02NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyem0tMTgyLjYtMy45YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDQ1LjMgNDUuM2MxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM2wtNDUuMyA0NS4zYy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMEw5Mi4xIDI3OC42Yy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM2w0NS4zLTQ1LjN6TTMyIDM4NGw2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJ6Il0KICAgIH07CiAgICBmYUNoaWxkQ29tYmF0YW50ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoaWxkLWNvbWJhdGFudCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJjaGlsZC1yaWZsZSJdLCAiZTRlMCIsICJNMTc2LjUgMTI4YTY0IDY0IDAgMSAwIDAtMTI4IDY0IDY0IDAgMSAwIDAgMTI4em0tMTYgMzUybDAtOTYgMzIgMCAwIDk2YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xOTIuMiAyMC45IDMzLjJjOS40IDE1IDI5LjIgMTkuNCA0NC4xIDEwczE5LjQtMjkuMiAxMC00NC4xbC0zOS45LTYzLjNDMjY2LjggMTg0IDIyMy4zIDE2MCAxNzYuNSAxNjBTODYuMiAxODQgNjEuMyAyMjMuNkwyMS40IDI4N2MtOS40IDE1LTQuOSAzNC43IDEwIDQ0LjFzMzQuNyA0LjkgNDQuMS0xMGwyMC45LTMzLjIgMCAxOTIuMmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMyek00NDguNSAwbC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZzNy4yIDE2IDE2IDE2bDAgMTAwLjNjLTkuNiA1LjUtMTYgMTUuOS0xNiAyNy43bDAgMzJjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgMTQ0YzAgMTcuNyAxNC4zIDMyIDMyIDMybDE2IDAgMCA5NmMwIDguOCA3LjIgMTYgMTYgMTZsNTkuNSAwYzEwLjQgMCAxOC05LjggMTUuNS0xOS45bC0yMy05Mi4xIDQ0IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMTZjMC04LjgtNy4yLTE2LTE2LTE2bC00OCAwIDAtMjYuNyA1My4xLTE3LjdjNi41LTIuMiAxMC45LTguMyAxMC45LTE1LjJsMC04NC41YzAtOC44LTcuMi0xNi0xNi0xNmwtMTYgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgNTYtMTYgNS4zIDAtMTA5LjNjMC0xMS44LTYuNC0yMi4yLTE2LTI3LjdsMC0xMTYuM2MwLTguOC03LjItMTYtMTYtMTZ6Il0KICAgIH07CiAgICBmYUNoaWxkUmlmbGUgPSBmYUNoaWxkQ29tYmF0YW50OwogICAgZmFWZXN0UGF0Y2hlcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ2ZXN0LXBhdGNoZXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTA4NiIsICJNMjAwIDI5My45TDIwMCA0NjRjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNTEyYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDI3MC41YzAtOS41IDIuOC0xOC43IDguMS0yNi42bDQ3LjktNzEuOGM1LjMtNy45IDguMS0xNy4xIDguMS0yNi42TDY0IDQ4QzY0IDIxLjUgODUuNSAwIDExMiAwbDMuNSAwYy4zIDAgLjYgMCAxIDAgLjYgMCAxLjIgMCAxLjggMCAxOC44IDAgMzQuMSA5LjcgNDQuMSAxOC44IDkuMyA4LjQgMjguNSAyMS4yIDYxLjcgMjEuMnM1Mi40LTEyLjggNjEuNy0yMS4yYzEwLTkuMSAyNS4zLTE4LjggNDQuMS0xOC44IC42IDAgMS4yIDAgMS44IDAgLjMgMCAuNiAwIDEgMEwzMzYgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDk3LjVjMCA5LjUgMi44IDE4LjcgOC4xIDI2LjZsNDcuOSA3MS44YzUuMyA3LjkgOC4xIDE3LjEgOC4xIDI2LjZMNDQ4IDQ2NGMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTA0IDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMTcwLjFjMC0zLjkgLjUtNy44IDEuNC0xMS42TDMwMy42IDY1LjRDMjg1LjkgNzcuMiAyNTkuOCA4OCAyMjQgODhzLTYxLjktMTAuOC03OS42LTIyLjZsNTQuMiAyMTYuOGMxIDMuOCAxLjQgNy43IDEuNCAxMS42ek05NiA0NTZhNDAgNDAgMCAxIDAgMC04MCA0MCA0MCAwIDEgMCAwIDgwek02My41IDI1NS41Yy00LjcgNC43LTQuNyAxMi4zIDAgMTdMNzkgMjg4IDYzLjUgMzAzLjVjLTQuNyA0LjctNC43IDEyLjMgMCAxN3MxMi4zIDQuNyAxNyAwTDk2IDMwNSAxMTEuNSAzMjAuNWM0LjcgNC43IDEyLjMgNC43IDE3IDBzNC43LTEyLjMgMC0xN0wxMTMgMjg4IDEyOC41IDI3Mi41YzQuNy00LjcgNC43LTEyLjMgMC0xN3MtMTIuMy00LjctMTcgMEw5NiAyNzEgODAuNSAyNTUuNWMtNC43LTQuNy0xMi4zLTQuNy0xNyAwek0zMDQgMjgwbDAgNDBjMCA4LjggNy4yIDE2IDE2IDE2bDQwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTggMCAwLThjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjR6Il0KICAgIH07CiAgICBmYU1hcnRpbmlHbGFzc0VtcHR5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hcnRpbmktZ2xhc3MtZW1wdHkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiZ2xhc3MtbWFydGluaSJdLCAiZjAwMCIsICJNMzIgMzJDMTkuMSAzMiA3LjQgMzkuOCAyLjQgNTEuOFMuMiA3Ny41IDkuNCA4Ni42bDIxNC42IDIxNC42IDAgMTQ2LjctNjQgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwxOTIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNjQgMCAwLTE0Ni43IDIxNC42LTIxNC42YzkuMi05LjIgMTEuOS0yMi45IDYuOS0zNC45UzQ5Mi45IDMyIDQ4MCAzMkwzMiAzMnpNMjU2IDI0Mi43TDEwOS4zIDk2IDQwMi43IDk2IDI1NiAyNDIuN3oiXQogICAgfTsKICAgIGZhR2xhc3NNYXJ0aW5pID0gZmFNYXJ0aW5pR2xhc3NFbXB0eTsKICAgIGZhTWFnbmV0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hZ25ldCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyOTUyMl0sICJmMDc2IiwgIk0wIDE3NkwwIDI4OEMwIDQxMS43IDEwMC4zIDUxMiAyMjQgNTEyUzQ0OCA0MTEuNyA0NDggMjg4bDAtMTEyLTEyOCAwIDAgMTEyYzAgNTMtNDMgOTYtOTYgOTZzLTk2LTQzLTk2LTk2bDAtMTEyLTEyOCAwem0wLTQ4bDEyOCAwIDAtNjRjMC0xNy43LTE0LjMtMzItMzItMzJMMzIgMzJDMTQuMyAzMiAwIDQ2LjMgMCA2NGwwIDY0em0zMjAgMGwxMjggMCAwLTY0YzAtMTcuNy0xNC4zLTMyLTMyLTMybC02NCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDY0eiJdCiAgICB9OwogICAgZmFSb2FkQmFycmllciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyb2FkLWJhcnJpZXIiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU2MiIsICJNMzIgMzJDMTQuMyAzMiAwIDQ2LjMgMCA2NEwwIDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMyTDY0IDI2Ni4zIDE0OS4yIDk2IDY0IDk2IDY0IDY0YzAtMTcuNy0xNC4zLTMyLTMyLTMyek00MDUuMiA5NmwtNzQuMyAwLTUuNCAxMC43LTkwLjYgMTgxLjMgNzQuMyAwIDUuNC0xMC43IDkwLjYtMTgxLjN6TTM2Mi44IDI4OGw3NC4zIDAgNS40LTEwLjcgOTAuNi0xODEuMy03NC4zIDAtNS40IDEwLjctOTAuNiAxODEuM3pNMjAyLjggOTZsLTUuNCAxMC43LTkwLjYgMTgxLjMgNzQuMyAwIDUuNC0xMC43IDkwLjYtMTgxLjMtNzQuMyAwem0yODggMTkybDg1LjIgMCAwIDE2MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzg0YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgNTMuNy04NS4yIDE3MC4zeiJdCiAgICB9OwogICAgZmFDb21wYXNzRHJhZnRpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY29tcGFzcy1kcmFmdGluZyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJkcmFmdGluZy1jb21wYXNzIl0sICJmNTY4IiwgIk05OS4zIDI1Ni4xbDY5LjQtMTE5LjljLTUuNi0xMi4yLTguOC0yNS44LTguOC00MC4yIDAtNTMgNDMtOTYgOTYtOTZzOTYgNDMgOTYgOTZjMCAxNC4zLTMuMSAyNy45LTguOCA0MC4ybDQ0LjQgNzYuN2MtMjMuMSAyNi01My43IDQ1LjEtODguNCA1My44TDI1NiAxOTEuOSAxODcuOSAzMDkuNWMyMS41IDYuOCA0NC4zIDEwLjUgNjguMSAxMC41IDcwLjcgMCAxMzMuOC0zMi43IDE3NC45LTg0IDExLjEtMTMuOCAzMS4yLTE2IDQ1LTVzMTYgMzEuMiA1IDQ1Yy01Mi43IDY1LjgtMTMzLjkgMTA4LTIyNC44IDEwOC0zNS40IDAtNjkuNC02LjQtMTAwLjctMTguMUw5OC43IDQ2My43Qzk0IDQ3MS44IDg3IDQ3OC40IDc4LjYgNDgyLjZMMjMuMiA1MTAuM2MtNSAyLjUtMTAuOSAyLjItMTUuNi0uN1MwIDUwMS41IDAgNDk2bDAtNTUuNGMwLTguNCAyLjItMTYuNyA2LjUtMjQuMWw2MC0xMDMuN2MtMTIuOC0xMS4yLTI0LjYtMjMuNS0zNS4zLTM2LjgtMTEuMS0xMy44LTguOC0zMy45IDUtNDVzMzMuOS04LjggNDUgNWM1LjcgNy4xIDExLjggMTMuOCAxOC4yIDIwLjF6TTM4MS4xIDQwNy45YzMyLjUtMTMgNjIuNC0zMSA4OC45LTUyLjlsMzUuNiA2MS41YzQuMiA3LjMgNi41IDE1LjYgNi41IDI0LjFsMCA1NS40YzAgNS41LTIuOSAxMC43LTcuNiAxMy42cy0xMC42IDMuMi0xNS42IC43bC01NS40LTI3LjdjLTguNC00LjItMTUuNC0xMC44LTIwLjEtMTguOWwtMzIuMy01NS44ek0yNTYgMTI4YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHoiXQogICAgfTsKICAgIGZhRHJhZnRpbmdDb21wYXNzID0gZmFDb21wYXNzRHJhZnRpbmc7CiAgICBmYVNxdWFyZVBlcnNvbkNvbmZpbmVkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1wZXJzb24tY29uZmluZWQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTU3NyIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnptOTYgMTEyYTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6bTgwIDEwNGMwLTMwLjkgMjUuMS01NiA1Ni01NnM1NiAyNS4xIDU2IDU2bDAgMTAyLjFjMCAzNi40LTI5LjUgNjUuOS02NS45IDY1LjktMTcuNSAwLTM0LjMtNi45LTQ2LjYtMTkuM2wtNTQuNy01NC43LTI4LjEgNTYuM2MtNy45IDE1LjgtMjcuMSAyMi4yLTQyLjkgMTQuM3MtMjIuMi0yNy4xLTE0LjMtNDIuOWw0OC05NmM0LjYtOS4yIDEzLjMtMTUuNiAyMy41LTE3LjNzMjAuNSAxLjcgMjcuOCA5bDQxLjQgNDEuNCAwLTU4Ljd6Il0KICAgIH07CiAgICBmYVBsYXRlV2hlYXQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGxhdGUtd2hlYXQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTU1YSIsICJNMTc2IDMyYzQ0LjIgMCA4MCAzNS44IDgwIDgwbDAgMTZjMCA4LjgtNy4yIDE2LTE2IDE2LTQ0LjIgMC04MC0zNS44LTgwLTgwbDAtMTZjMC04LjggNy4yLTE2IDE2LTE2ek01NiA2NGw0OCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC00OCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNFM0Mi43IDY0IDU2IDY0ek0yNCAxMzZsMTEyIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRMMjQgMTg0Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0em04IDk2YzAtMTMuMyAxMC43LTI0IDI0LTI0bDQ4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTQ4IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0ek0yNzIgNDhjMC04LjggNy4yLTE2IDE2LTE2IDQ0LjIgMCA4MCAzNS44IDgwIDgwbDAgMTZjMCA4LjgtNy4yIDE2LTE2IDE2LTQ0LjIgMC04MC0zNS44LTgwLTgwbDAtMTZ6TTQwMCAzMmM0NC4yIDAgODAgMzUuOCA4MCA4MGwwIDE2YzAgOC44LTcuMiAxNi0xNiAxNi00NC4yIDAtODAtMzUuOC04MC04MGwwLTE2YzAtOC44IDcuMi0xNiAxNi0xNnptODAgMTYwbDAgMTZjMCA0NC4yLTM1LjggODAtODAgODAtOC44IDAtMTYtNy4yLTE2LTE2bDAtMTZjMC00NC4yIDM1LjgtODAgODAtODAgOC44IDAgMTYgNy4yIDE2IDE2ek0zNTIgMTc2YzguOCAwIDE2IDcuMiAxNiAxNmwwIDE2YzAgNDQuMi0zNS44IDgwLTgwIDgwLTguOCAwLTE2LTcuMi0xNi0xNmwwLTE2YzAtNDQuMiAzNS44LTgwIDgwLTgwem0tOTYgMTZsMCAxNmMwIDQ0LjItMzUuOCA4MC04MCA4MC04LjggMC0xNi03LjItMTYtMTZsMC0xNmMwLTQ0LjIgMzUuOC04MCA4MC04MCA4LjggMCAxNiA3LjIgMTYgMTZ6TTMuNSAzNDcuNkMxLjYgMzMyLjkgMTMgMzIwIDI3LjggMzIwbDQ1Ni40IDBjMTQuOCAwIDI2LjIgMTIuOSAyNC40IDI3LjYtNi4zIDUwLjItNDQuNCA4OS40LTkyLjYgOTguNGwwIDJjMCAxNy43LTE0LjMgMzItMzIgMzJsLTI1NiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTJjLTQ4LjItOS04Ni4zLTQ4LjItOTIuNS05OC40eiJdCiAgICB9OwogICAgZmFTaWduSGFuZ2luZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaWduLWhhbmdpbmciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsic2lnbiJdLCAiZjRkOSIsICJNOTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDMyIDM1MiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0zNTIgMCAwIDM1MmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTM1Mi0zMiAwQzE0LjMgMTI4IDAgMTEzLjcgMCA5NlMxNC4zIDY0IDMyIDY0bDMyIDAgMC0zMkM2NCAxNC4zIDc4LjMgMCA5NiAwek0yMDggMTc2bDI0MCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMTQ0YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0yNDAgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0xNDRjMC0xNy43IDE0LjMtMzIgMzItMzJ6Il0KICAgIH07CiAgICBmYVNpZ24gPSBmYVNpZ25IYW5naW5nOwogICAgZmFDYXJCYXR0ZXJ5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhci1iYXR0ZXJ5IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImJhdHRlcnktY2FyIl0sICJmNWRmIiwgIk04MCA2NGMwLTE3LjcgMTQuMy0zMiAzMi0zMmw2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDk2IDBjMC0xNy43IDE0LjMtMzIgMzItMzJsNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwxNiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjU2YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsMTYgMHpNMzkyIDE4NGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDMyLTMyIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMzIgMCAwIDMyYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0zMiAzMiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0zMiAwIDAtMzJ6TTY0IDI0MGMwIDEzLjMgMTAuNyAyNCAyNCAyNGwxMTIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNEw4OCAyMTZjLTEzLjMgMC0yNCAxMC43LTI0IDI0eiJdCiAgICB9OwogICAgZmFCYXR0ZXJ5Q2FyID0gZmFDYXJCYXR0ZXJ5OwogICAgZmFTaGlydCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaGlydCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzEyODA4NSwgInQtc2hpcnQiLCAidHNoaXJ0Il0sICJmNTUzIiwgIk0zMjAuMiAxMTJjNDQuMiAwIDgwLTM1LjggODAtODBsNTMuNSAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDYxNy42IDE2OS40YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zbC01MC43IDUwLjdjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwbC00MS40LTQxLjQgMCAyMjRjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTE5MiAwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTIyNC00MS40IDQxLjRjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwTDIyLjkgMjE0LjZjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zTDE0MS41IDUwLjdjMTItMTIgMjguMy0xOC43IDQ1LjMtMTguN2w1My41IDBjMCA0NC4yIDM1LjggODAgODAgODB6Il0KICAgIH07CiAgICBmYVRTaGlydCA9IGZhU2hpcnQ7CiAgICBmYVRzaGlydCA9IGZhU2hpcnQ7CiAgICBmYVBhcmFncmFwaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwYXJhZ3JhcGgiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxODJdLCAiZjFkZCIsICJNMTYwIDBMNDE2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTMyIDAgMCA0MTZjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC00MTYtNDggMCAwIDQxNmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTE2MC00OCAwQzcxLjYgMzIwIDAgMjQ4LjQgMCAxNjBTNzEuNiAwIDE2MCAweiJdCiAgICB9OwogICAgZmFFbnZlbG9wZXNCdWxrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImVudmVsb3Blcy1idWxrIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbIm1haWwtYnVsayJdLCAiZjY3NCIsICJNMTEyIDBDODUuNSAwIDY0IDIxLjUgNjQgNDhsMCAxNjAgODAgMCAwLTMyYzAtNTMgNDMtOTYgOTYtOTZsMjA4IDAgMC0zMmMwLTI2LjUtMjEuNS00OC00OC00OEwxMTIgMHpNMjQwIDEyOGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCAzMiA4MCAwYzUzIDAgOTYgNDMgOTYgOTZsMCAxMTIgMTYwIDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0xOTJjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTI4OCAwem0yMDAgNjRsNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0bC00OCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTQ4YzAtMTMuMyAxMC43LTI0IDI0LTI0ek00OCAyNTZjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgMTAuNCAxNTYuNiA4Ni4yYzEuMSAuNiAyLjIgLjkgMy40IC45czIuNC0uMyAzLjQtLjlMMzIwIDMxNC40IDMyMCAzMDRjMC0yNi41LTIxLjUtNDgtNDgtNDhMNDggMjU2ek0zMjAgMzY5LjJMMTg2LjYgNDQyLjZjLTguMSA0LjUtMTcuMyA2LjgtMjYuNiA2LjhzLTE4LjQtMi40LTI2LjYtNi44TDAgMzY5LjIgMCA0NjRjMCAyNi41IDIxLjUgNDggNDggNDhsMjI0IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC05NC44eiJdCiAgICB9OwogICAgZmFNYWlsQnVsayA9IGZhRW52ZWxvcGVzQnVsazsKICAgIGZhR3VpdGFyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImd1aXRhciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmN2E2IiwgIk00NjUgN2MtOS40LTkuNC0yNC42LTkuNC0zMy45IDBMMzgzIDU1Yy0yLjQgMi40LTQuMyA1LjMtNS41IDguNWwtMTUuNCA0MS03Ny41IDc3LjZjLTQ1LjEtMjkuNC05OS4zLTMwLjItMTMxIDEuNi0xMSAxMS0xOCAyNC42LTIxLjQgMzkuNi0zLjcgMTYuNi0xOS4xIDMwLjctMzYuMSAzMS42LTI1LjYgMS4zLTQ5LjMgMTAuNy02Ny4zIDI4LjYtNDQuOCA0NC44LTM2LjQgMTI1LjggMTguNyAxODAuOVMxODMuNiA1MjggMjI4LjQgNDgzLjJjMTcuOS0xNy45IDI3LjQtNDEuNyAyOC42LTY3LjMgLjktMTcgMTUtMzIuMyAzMS42LTM2LjEgMTUtMy40IDI4LjYtMTAuNSAzOS42LTIxLjQgMzEuOC0zMS44IDMxLTg1LjkgMS42LTEzMWw3Ny42LTc3LjYgNDEtMTUuNGMzLjItMS4yIDYuMS0zLjEgOC41LTUuNWw0OC00OGM5LjQtOS40IDkuNC0yNC42IDAtMzMuOUw0NjUgN3pNMjA4IDI1NmE0OCA0OCAwIDEgMSAwIDk2IDQ4IDQ4IDAgMSAxIDAtOTZ6Il0KICAgIH07CiAgICBmYVN1aXRjYXNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN1aXRjYXNlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI5NTIzXSwgImYwZjIiLCAiTTIwMCA0OGwxMTIgMGM0LjQgMCA4IDMuNiA4IDhsMCA0MC0xMjggMCAwLTQwYzAtNC40IDMuNi04IDgtOHptLTU2IDhsMCA0MjQgMjI0IDAgMC00MjRjMC0zMC45LTI1LjEtNTYtNTYtNTZMMjAwIDBjLTMwLjkgMC01NiAyNS4xLTU2IDU2ek00MTYgOTZsMCAzODQgMzIgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI1NmMwLTM1LjMtMjguNy02NC02NC02NGwtMzIgMHpNOTYgNDgwbDAtMzg0LTMyIDBDMjguNyA5NiAwIDEyNC43IDAgMTYwTDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyIDB6Il0KICAgIH07CiAgICBmYUNpcmNsZVVwMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtdXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MTQ2NywgImFycm93LWFsdC1jaXJjbGUtdXAiXSwgImYzNWIiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyem0xMS4zLTM4Ny4zbDEwNCAxMDRjNC42IDQuNiA1LjkgMTEuNSAzLjUgMTcuNFMzNjYuNSAyNTYgMzYwIDI1NmwtNTYgMCAwIDk2YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTk2LTU2IDBjLTYuNSAwLTEyLjMtMy45LTE0LjgtOS45cy0xLjEtMTIuOSAzLjUtMTcuNGwxMDQtMTA0YzYuMi02LjIgMTYuNC02LjIgMjIuNiAweiJdCiAgICB9OwogICAgZmFBcnJvd0FsdENpcmNsZVVwMiA9IGZhQ2lyY2xlVXAyOwogICAgZmFGID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImYiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFsxMDJdLCAiNDYiLCAiTTMyIDMyQzE0LjMgMzIgMCA0Ni4zIDAgNjRMMCA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE2MCAxNjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTYwIDAgMC0xMjggMjI0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgMzJ6Il0KICAgIH07CiAgICBmYVhtYXJrc0xpbmVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInhtYXJrcy1saW5lcyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTlhIiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0UzE0LjMgOTYgMzIgOTZsNTc2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgMzJ6bTAgMzg0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDU3NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDMyIDQxNnpNNyAxNjdjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45bDU1IDU1LTU1IDU1Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBsNTUtNTUgNTUgNTVjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC01NS01NSA1NS01NWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwbC01NSA1NS01NS01NWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDB6TTI2NSAxNjdjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwcy05LjQgMjQuNiAwIDMzLjlsNTUgNTUtNTUgNTVjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMGw1NS01NSA1NSA1NWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTU1LTU1IDU1LTU1YzkuNC05LjQgOS40LTI0LjYgMC0zMy45cy0yNC42LTkuNC0zMy45IDBsLTU1IDU1LTU1LTU1ek00NTUgMTY3Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOWw1NSA1NS01NSA1NWMtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDU1LTU1IDU1IDU1YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNTUtNTUgNTUtNTVjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMGwtNTUgNTUtNTUtNTVjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAweiJdCiAgICB9OwogICAgZmFFYXJ0aE9jZWFuaWEgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZWFydGgtb2NlYW5pYSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJnbG9iZS1vY2VhbmlhIl0sICJlNDdiIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMTkyIDE1MC42YzAtMTIuNSAxMC4xLTIyLjYgMjIuNi0yMi42bDQxLjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTguNyAwYy04LjUgMC0xNi42LTMuNC0yMi42LTkuNGwtMTYtMTZjLTQuMi00LjItNi42LTEwLTYuNi0xNnpNNDMyIDI1NmM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNnpNNDExLjMgMzc5LjNsLTMyIDMyYy02LjIgNi4yLTE2LjQgNi4yLTIyLjYgMHMtNi4yLTE2LjQgMC0yMi42bDMyLTMyYzYuMi02LjIgMTYuNC02LjIgMjIuNiAwczYuMiAxNi40IDAgMjIuNnpNMjI0IDQzMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZzLTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2em0tOTYtODBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTguN2MwLTguNSAzLjQtMTYuNiA5LjQtMjIuNmw0OC00OGM0LjItNC4yIDEwLTYuNiAxNi02LjZsNi42IDBjOC44IDAgMTYgNy4yIDE2IDE2czcuMiAxNiAxNiAxNiAxNi03LjIgMTYtMTYgNy4yLTE2IDE2LTE2bDYuNiAwYzYgMCAxMS44IDIuNCAxNiA2LjZsNDggNDhjNiA2IDkuNCAxNC4xIDkuNCAyMi42bDAgNTAuN2MwIDE3LjctMTQuMyAzMi0zMiAzMmwtNTAuNyAwYy04LjUgMC0xNi42LTMuNC0yMi42LTkuNGwtMTMuMy0xMy4zYy02LTYtMTQuMS05LjQtMjIuNi05LjRMMTI4IDM1MnoiXQogICAgfTsKICAgIGZhR2xvYmVPY2VhbmlhID0gZmFFYXJ0aE9jZWFuaWE7CiAgICBmYUNvbW1lbnRTbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjb21tZW50LXNsYXNoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY0YjMiLCAiTTQxLTI1QzMxLjYtMzQuMyAxNi40LTM0LjMgNy0yNVMtMi4zLS40IDcgOUw1MzUgNTM3YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtOTYuNi05Ni42YzQ0LjQtNDMuMiA3MS42LTEwMS44IDcxLjYtMTY2LjUgMC0xMzIuNS0xMTQuNi0yNDAtMjU2LTI0MC02MyAwLTEyMC44IDIxLjQtMTY1LjQgNTYuOEw0MS0yNXptMTkuNCAxNTVDNDIuMiAxNjMgMzIgMjAwLjMgMzIgMjM5LjkgMzIgMjk0LjIgNTEuMiAzNDQuMiA4My42IDM4NC40TDM0LjggNDc2LjdjLTQuOCA5LTMuMyAyMCAzLjYgMjcuNVM1Ni4xIDUxNCA2NS41IDUxMGwxMTguNC01MC43YzMxLjggMTMuMyA2Ny4xIDIwLjcgMTA0LjEgMjAuNyAzNi40IDAgNzAuOS03LjEgMTAyLjMtMTkuOUw2MC4zIDEzMC4xeiJdCiAgICB9OwogICAgZmFQbGF5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBsYXkiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs5NjU0XSwgImYwNGIiLCAiTTkxLjIgMzYuOWMtMTIuNC02LjgtMjcuNC02LjUtMzkuNiAuN1MzMiA1Ny45IDMyIDcybDAgMzY4YzAgMTQuMSA3LjUgMjcuMiAxOS42IDM0LjRzMjcuMiA3LjUgMzkuNiAuN2wzMzYtMTg0YzEyLjgtNyAyMC44LTIwLjUgMjAuOC0zNS4xcy04LTI4LjEtMjAuOC0zNS4xbC0zMzYtMTg0eiJdCiAgICB9OwogICAgZmFWaWFsQ2lyY2xlQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidmlhbC1jaXJjbGUtY2hlY2siLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTU5NiIsICJNMzIgMzJDMzIgMTQuMyA0Ni4zIDAgNjQgMEwyODggMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwwIDE2MS40Yy02Ni4xIDMwLjMtMTEyIDk3LjEtMTEyIDE3NC42IDAgMzkuNyAxMiA3Ni42IDMyLjcgMTA3LjItMTAuMyAzLjEtMjEuMyA0LjgtMzIuNyA0LjgtNjEuOSAwLTExMi01MC4xLTExMi0xMTJMNjQgNjRDNDYuMyA2NCAzMiA0OS43IDMyIDMyem05NiAzMmwwIDEyOCA5NiAwIDAtMTI4LTk2IDB6bTk2IDMzNmExNDQgMTQ0IDAgMSAxIDI4OCAwIDE0NCAxNDQgMCAxIDEgLTI4OCAwem0yMDEuNC02MC45Yy03LjEtNS4yLTE3LjItMy42LTIyLjQgMy41bC01MyA3Mi45LTI2LjgtMjYuOGMtNi4yLTYuMi0xNi40LTYuMi0yMi42IDBzLTYuMiAxNi40IDAgMjIuNmw0MCA0MGMzLjMgMy4zIDcuOSA1IDEyLjYgNC42czguOS0yLjggMTEuNy02LjVsNjQtODhjNS4yLTcuMSAzLjYtMTcuMi0zLjUtMjIuM3oiXQogICAgfTsKICAgIGZhQnJpZGdlQ2lyY2xlQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnJpZGdlLWNpcmNsZS1jaGVjayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNGM5IiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0UzE0LjMgOTYgMzIgOTZsOCAwIDAgNjQtNDAgMCAwIDExMmMzNy42IDkuNCA2NCA0My4yIDY0IDgybDAgOTRjMCAxNy43IDE0LjMgMzIgMzIgMzJsMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTY0YzAtNTMgNDMtOTYgOTYtOTYgNi40IDAgMTIuNyAuNiAxOC43IDEuOCAzNC43LTQ5LjUgOTIuMi04MS44IDE1Ny4zLTgxLjggMjguNiAwIDU1LjYgNi4yIDgwIDE3LjRsMC02NS40LTQwIDAgMC02NCA4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgMzJ6TTQyNCA5NmwwIDY0LTgwIDAgMC02NCA4MCAwek0yOTYgOTZsMCA2NC04MCAwIDAtNjQgODAgMHpNODggOTZsODAgMCAwIDY0LTgwIDAgMC02NHpNNTc2IDQwMGExNDQgMTQ0IDAgMSAwIC0yODggMCAxNDQgMTQ0IDAgMSAwIDI4OCAwem0tODYuNi02MC45YzcuMSA1LjIgOC43IDE1LjIgMy41IDIyLjNsLTY0IDg4Yy0yLjggMy44LTcgNi4yLTExLjcgNi41cy05LjMtMS4zLTEyLjYtNC42bC00MC00MGMtNi4yLTYuMi02LjItMTYuNCAwLTIyLjZzMTYuNC02LjIgMjIuNiAwbDI2LjggMjYuOCA1My03Mi45YzUuMi03LjEgMTUuMi04LjcgMjIuNC0zLjV6Il0KICAgIH07CiAgICBmYUNlZGlTaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNlZGktc2lnbiIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlMGRmIiwgIk0yMzIgMzJjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAyNi41Qzg4LjggNzMuOSAxNiAxNTYuNCAxNiAyNTZTODguOCA0MzguMSAxODQgNDUzLjVsMCAyNi41YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0yNC42YzQ2LjgtMy43IDg5LjEtMjMuNiAxMjEuMy01My45IDEyLjktMTIuMSAxMy40LTMyLjQgMS4zLTQ1LjJzLTMyLjQtMTMuNC00NS4yLTEuM2MtMjAuNyAxOS42LTQ3LjYgMzIuNy03Ny4zIDM2LjJsMC0yNzAuMWMyOS44IDMuNSA1Ni42IDE2LjYgNzcuMyAzNi4yIDEyLjkgMTIuMSAzMy4xIDExLjUgNDUuMi0xLjNzMTEuNS0zMy4xLTEuMy00NS4yQzMyMS4xIDgwLjIgMjc4LjggNjAuMyAyMzIgNTYuNkwyMzIgMzJ6bS00OCA5MS44bDAgMjY0LjRDMTI0LjMgMzczLjggODAgMzIwLjEgODAgMjU2czQ0LjMtMTE3LjggMTA0LTEzMi4yeiJdCiAgICB9OwogICAgZmFQdXp6bGVQaWVjZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwdXp6bGUtcGllY2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjk1MTNdLCAiZjEyZSIsICJNMjI0IDBjMzUuMyAwIDY0IDIxLjUgNjQgNDggMCAxMC40LTQuNCAyMC0xMiAyNy45LTYuNiA2LjktMTIgMTUuMy0xMiAyNC45IDAgMTUgMTIuMiAyNy4yIDI3LjIgMjcuMmw0NC44IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA0NC44YzAgMTUgMTIuMiAyNy4yIDI3LjIgMjcuMiA5LjUgMCAxOC01LjQgMjQuOS0xMiA3LjktNy41IDE3LjUtMTIgMjcuOS0xMiAyNi41IDAgNDggMjguNyA0OCA2NHMtMjEuNSA2NC00OCA2NGMtMTAuNCAwLTIwLjEtNC40LTI3LjktMTItNi45LTYuNi0xNS4zLTEyLTI0LjktMTItMTUgMC0yNy4yIDEyLjItMjcuMiAyNy4yTDM4NCA0NjRjMCAyNi41LTIxLjUgNDgtNDggNDhsLTU2LjggMGMtMTIuOCAwLTIzLjItMTAuNC0yMy4yLTIzLjIgMC05LjIgNS44LTE3LjMgMTMuMi0yMi44IDExLjYtOC43IDE4LjgtMjAuNyAxOC44LTM0IDAtMjYuNS0yOC43LTQ4LTY0LTQ4cy02NCAyMS41LTY0IDQ4YzAgMTMuMyA3LjIgMjUuMyAxOC44IDM0IDcuNCA1LjUgMTMuMiAxMy41IDEzLjIgMjIuOCAwIDEyLjgtMTAuNCAyMy4yLTIzLjIgMjMuMkw0OCA1MTJjLTI2LjUgMC00OC0yMS41LTQ4LTQ4TDAgMzQzLjJjMC0xMi44IDEwLjQtMjMuMiAyMy4yLTIzLjIgOS4yIDAgMTcuMyA1LjggMjIuOCAxMy4yIDguNyAxMS42IDIwLjcgMTguOCAzNCAxOC44IDI2LjUgMCA0OC0yOC43IDQ4LTY0cy0yMS41LTY0LTQ4LTY0Yy0xMy4zIDAtMjUuMyA3LjItMzQgMTguOC01LjUgNy40LTEzLjUgMTMuMi0yMi44IDEzLjItMTIuOCAwLTIzLjItMTAuNC0yMy4yLTIzLjJMMCAxNzZjMC0yNi41IDIxLjUtNDggNDgtNDhsMTA4LjggMGMxNSAwIDI3LjItMTIuMiAyNy4yLTI3LjIgMC05LjUtNS40LTE4LTEyLTI0LjktNy41LTcuOS0xMi0xNy41LTEyLTI3LjkgMC0yNi41IDI4LjctNDggNjQtNDh6Il0KICAgIH07CiAgICBmYUhlbG1ldFVuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhlbG1ldC11biIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTAzIiwgIk00NzkuNSAyMjRDNDcxLjIgOTguOSAzNjcuMiAwIDI0MCAwIDEwNy41IDAgMCAxMDcuNSAwIDI0MGwwIDU2LjNDMCAzNDQuOCAzOS4yIDM4NCA4Ny43IDM4NGwxMjcuMyAwIDEyOC42IDEyMS40YzQuNSA0LjIgMTAuNCA2LjYgMTYuNSA2LjZsOTYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtODYuNSAwLTEuNS0xLjUgMC0xNzQuNSAxMTIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtLjUgMHpNMzIwIDQxNy4ybC03OC03My43IDMyLjQtNTUuNSA0NS42IDAgMCAxMjkuMnpNMjg1LjMgMTAzLjFsMzQuNyA1MiAwLTQzLjJjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDk2YzAgNy4xLTQuNiAxMy4zLTExLjQgMTUuM3MtMTQtLjYtMTcuOS02LjRsLTM0LjctNTIgMCA0My4yYzAgOC44LTcuMiAxNi0xNiAxNnMtMTYtNy4yLTE2LTE2bDAtOTZjMC03LjEgNC42LTEzLjMgMTEuNC0xNS4zczE0IC42IDE3LjkgNi40ek0xNjAgMTEybDAgNjRjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTY0YzAtOC44IDcuMi0xNiAxNi0xNnMxNiA3LjIgMTYgMTZsMCA2NGMwIDI2LjUtMjEuNSA0OC00OCA0OHMtNDgtMjEuNS00OC00OGwwLTY0YzAtOC44IDcuMi0xNiAxNi0xNnMxNiA3LjIgMTYgMTZ6Il0KICAgIH07CiAgICBmYUdsYXNzV2F0ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ2xhc3Mtd2F0ZXIiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZTRmNCIsICJNMzIgMEMyMy4xIDAgMTQuNiAzLjcgOC42IDEwLjJTLS42IDI1LjQgLjEgMzQuM0wyOC45IDQzNy43YzMgNDEuOSAzNy44IDc0LjMgNzkuOCA3NC4zbDE2Ni42IDBjNDIgMCA3Ni44LTMyLjQgNzkuOC03NC4zTDM4My45IDM0LjNjLjYtOC45LTIuNC0xNy42LTguNS0yNC4xUzM2MC45IDAgMzUyIDBMMzIgMHpNNzMgMTU2LjVsLTYuNi05Mi41IDI1MS4zIDAtNi42IDkyLjUtMjQuMiAxMi4xYy0xOS40IDkuNy00Mi4yIDkuNy02MS42IDAtMjAuOS0xMC40LTQ1LjUtMTAuNC02Ni40IDAtMTkuNCA5LjctNDIuMiA5LjctNjEuNiAwTDczIDE1Ni41eiJdCiAgICB9OwogICAgZmFIZWFydENpcmNsZUJvbHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGVhcnQtY2lyY2xlLWJvbHQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRmYyIsICJNMjQxIDg3LjFsMTUgMjAuNyAxNS0yMC43QzI5NiA1Mi41IDMzNi4yIDMyIDM3OC45IDMyIDQ1Mi40IDMyIDUxMiA5MS42IDUxMiAxNjUuMWwwIDIuNmMwIDE3LjYtMy40IDM1LjYtOS41IDUzLjctMjEuOC04LjYtNDUuNi0xMy40LTcwLjUtMTMuNC0xMDYgMC0xOTIgODYtMTkyIDE5MiAwIDI4LjUgNi4yIDU1LjYgMTcuNCA4MC0uNSAwLS45IDAtMS40IDAtMTUuNSAwLTMwLjgtNC42LTQzLjEtMTQuMS03My01NS43LTIxMi45LTE4Ni0yMTIuOS0yOTguMmwwLTIuNkMwIDkxLjYgNTkuNiAzMiAxMzMuMSAzMiAxNzUuOCAzMiAyMTYgNTIuNSAyNDEgODcuMXpNMjg4IDQwMGExNDQgMTQ0IDAgMSAxIDI4OCAwIDE0NCAxNDQgMCAxIDEgLTI4OCAwem0xNzcuNC03N2MtNS44LTQuMi0xMy44LTQtMTkuNCAuNWwtODAgNjRjLTUuMyA0LjItNy40IDExLjQtNS4xIDE3LjhTMzY5LjIgNDE2IDM3NiA0MTZsMzIuOSAwLTE1LjkgNDIuNGMtMi41IDYuNy0uMiAxNC4zIDUuNiAxOC42czEzLjggNCAxOS40LS41bDgwLTY0YzUuMy00LjIgNy40LTExLjQgNS4xLTE3LjhTNDk0LjggMzg0IDQ4OCAzODRsLTMyLjkgMCAxNS45LTQyLjRjMi41LTYuNyAuMi0xNC4zLTUuNi0xOC42eiJdCiAgICB9OwogICAgZmFQdW1wU29hcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwdW1wLXNvYXAiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZTA2YiIsICJNOTYgMGwwIDgwIDEyOCAwIDAtMjQgNzIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNFMzMDkuMyA4IDI5NiA4bC03MiAwIDAtOGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtNjQgMEMxMTAuMy0zMiA5Ni0xNy43IDk2IDB6TTY0IDEyOGMtMzUuMyAwLTY0IDI4LjctNjQgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTkyIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMTI4ek0yMjQgMzQ0YzAgMzUuMy0yOC43IDU2LTY0IDU2cy02NC0yMC43LTY0LTU2YzAtMzIuNSAzNy04MC45IDUwLjktOTcuOSAzLjItMy45IDguMS02LjEgMTMuMS02LjFzOS45IDIuMiAxMy4xIDYuMUMxODcgMjYzLjEgMjI0IDMxMS41IDIyNCAzNDR6Il0KICAgIH07CiAgICBmYUhhbmRTY2lzc29yczIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1zY2lzc29ycyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMjU3IiwgIk00MCAyMDhjLTIyLjEgMC00MCAxNy45LTQwIDQwczE3LjkgNDAgNDAgNDBsMTgwLjIgMGMtNy42IDguNS0xMi4yIDE5LjctMTIuMiAzMiAwIDI1LjMgMTkuNSA0NiA0NC4zIDQ3LjktNy43IDguNS0xMi4zIDE5LjgtMTIuMyAzMi4xIDAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDk2IDBjNzAuNyAwIDEyOC01Ny4zIDEyOC0xMjhsMC0xMTMuMWMwLTQwLjItMTYtNzguOC00NC40LTEwNy4zLTIyLjgtMjIuOC01My42LTM1LjYtODUuOC0zNS42TDMzNiA2NGMtMjEuMyAwLTM5LjMgMTMuOS00NS42IDMzLjFsNzQuNSAyMy43YzguNCAyLjcgMTMuMSAxMS43IDEwLjQgMjAuMXMtMTEuNyAxMy4xLTIwLjEgMTAuNGwtNjcuMS0yMS40IDAgLjEtMjA0LTY0LjFDNjIuOSA1OS4yIDQwLjUgNzAuOSAzMy45IDkyczUuMSA0My41IDI2LjIgNTAuMkwyNjkuNSAyMDggNDAgMjA4eiJdCiAgICB9OwogICAgZmFEb2xseSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkb2xseSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJkb2xseS1ib3giXSwgImY0NzIiLCAiTTMyIDBDMTQuMyAwIDAgMTQuMyAwIDMyUzE0LjMgNjQgMzIgNjRsNzIuOSAwIDkyLjEgMjc2LjJjLTIyLjUgMTcuNi0zNyA0NS0zNyA3NS44IDAgNTMgNDMgOTYgOTYgOTYgNTIuNCAwIDk1LjEtNDIgOTYtOTQuM2wyMDIuMS02Ny40YzE2LjgtNS42IDI1LjgtMjMuNyAyMC4yLTQwLjVzLTIzLjctMjUuOC00MC41LTIwLjJMMzMxLjggMzU3Yy0xNy4yLTIyLjEtNDMuOS0zNi41LTc0LTM3TDE2NS43IDQzLjhDMTU2LjkgMTcuNiAxMzIuNSAwIDEwNC45IDBMMzIgMHpNMjA4IDQxNmE0OCA0OCAwIDEgMSA5NiAwIDQ4IDQ4IDAgMSAxIC05NiAwek0yODAuNSA4OS4zYy0yNS4yIDguMi0zOSAzNS4zLTMwLjggNjAuNWwzOS42IDEyMS43YzguMiAyNS4yIDM1LjMgMzkgNjAuNSAzMC44bDEyMS43LTM5LjZjMjUuMi04LjIgMzktMzUuMyAzMC44LTYwLjVMNDYyLjggODAuNWMtOC4yLTI1LjItMzUuMy0zOS02MC41LTMwLjhMMjgwLjUgODkuM3oiXQogICAgfTsKICAgIGZhRG9sbHlCb3ggPSBmYURvbGx5OwogICAgZmFQYXBlcmNsaXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGFwZXJjbGlwIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MjA2XSwgImYwYzYiLCAiTTIyNC42IDEyLjhjNTYuMi01Ni4yIDE0Ny40LTU2LjIgMjAzLjYgMHM1Ni4yIDE0Ny40IDAgMjAzLjZsLTE2NCAxNjRjLTM0LjQgMzQuNC05MC4xIDM0LjQtMTI0LjUgMHMtMzQuNC05MC4xIDAtMTI0LjVMMjkyLjUgMTAzLjNjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM0wxODUgMzAxLjNjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMGwxNjQtMTY0YzMxLjItMzEuMiAzMS4yLTgxLjkgMC0xMTMuMXMtODEuOS0zMS4yLTExMy4xIDBsLTE2NCAxNjRjLTUzLjEgNTMuMS01My4xIDEzOS4yIDAgMTkyLjNzMTM5LjIgNTMuMSAxOTIuMyAwTDQyOC4zIDI4NC4zYzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwczEyLjUgMzIuOCAwIDQ1LjNMMzQzLjQgNDU5LjZjLTc4LjEgNzguMS0yMDQuNyA3OC4xLTI4Mi44IDBzLTc4LjEtMjA0LjcgMC0yODIuOGwxNjQtMTY0eiJdCiAgICB9OwogICAgZmFEZW1vY3JhdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkZW1vY3JhdCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNzQ3IiwgIk02NCAzMmMwLTguOSAzLjgtMjAuOSA2LjItMjcuMyAxLTIuOCAzLjgtNC43IDYuOC00LjcgMS45IDAgMy44IC43IDUuMiAyLjFMMTI4IDQ1LjcgMTczLjggMi4xYzEuNC0xLjMgMy4yLTIuMSA1LjItMi4xIDMgMCA1LjggMS44IDYuOCA0LjcgMi40IDYuNSA2LjIgMTguNCA2LjIgMjcuMyAwIDI2LjUtMjEuOSA0Mi0yOS41IDQ2LjZsNzYuMiA3Mi42YzYgNS43IDEzLjkgOC44IDIyLjEgOC44bDIxOS4yIDAgMzIgMGM0MC4zIDAgNzguMiAxOSAxMDIuNCA1MS4ybDE5LjIgMjUuNmMxMC42IDE0LjEgNy43IDM0LjItNi40IDQ0LjhzLTM0LjIgNy43LTQ0LjgtNi40bC0xOS4yLTI1LjZjLTUuMy03LTExLjgtMTIuOC0xOS4yLTE3bDAgODcuNC0zNTIgMC00MC40LTk0LjNjLTMuOS05LjItMTUuMy0xMi42LTIzLjYtN2wtNDIuMSAyOGMtOS4xIDYuMS0xOS43IDkuMy0zMC43IDkuM2wtMiAwQzIzLjkgMjU2IDAgMjMyLjEgMCAyMDIuNyAwIDE5MC42IDQuMSAxNzguOSAxMS43IDE2OS40TDg3LjYgNzQuNkM3OC4xIDY3LjQgNjQgNTMuMiA2NCAzMnpNNTQ0IDM1MmwwIDEyOGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMzIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC02NC0xNjAgMCAwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTEyOCAzNTIgMHpNMjU2IDI4MGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6bTI0OC0yNGEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAwek0zNjggMjgwYTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiXQogICAgfTsKICAgIGZhU3F1YXJlQXJyb3dVcFJpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1hcnJvdy11cC1yaWdodCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJleHRlcm5hbC1saW5rLXNxdWFyZSJdLCAiZjE0YyIsICJNMzg0IDMyYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMHpNMjcyIDI5NmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTEyYzAtMTMuMy0xMC43LTI0LTI0LTI0bC0xMTIgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw1NC4xIDAtMTAzIDEwM2MtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDEwMy0xMDMgMCA1NC4xeiJdCiAgICB9OwogICAgZmFFeHRlcm5hbExpbmtTcXVhcmUgPSBmYVNxdWFyZUFycm93VXBSaWdodDsKICAgIGZhRmVycnkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmVycnkiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTRlYSIsICJNMjI0IDMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyTDM4NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzIgNDggMGM0NC4yIDAgODAgMzUuOCA4MCA4MGwwIDEyOC0uMSAwYy4xIC43IC4xIDEuMyAuMSAyIDAgMzAuMi03LjYgNTkuOC0yMiA4Ni4zbC0xMi43IDIzLjMtLjYgMWMtMjIuMy0xMS4zLTQ2LjUtMTYuOC03MC44LTE2LjctMzIuNSAuMi02NC45IDEwLjctOTIuNCAzMS40LTIyLjEgMTYuNi0yOS4xIDE2LjYtNTEuMiAwLTI4LjEtMjEuMS02MS4zLTMxLjYtOTQuNC0zMS40LTIzLjYgLjItNDcuMSA1LjctNjguNyAxNi43bC0uNi0xLTEyLjctMjMuM2MtMTQuNC0yNi41LTIyLTU2LjItMjItODYuMyAwLS43IDAtMS40IC4xLTJsLS4xIDAgMC0xMjhjMC00NC4yIDM1LjgtODAgODAtODBsNDggMCAwLTMyek0xNjAgMjU2bDMyMCAwIDAtMTEyYzAtOC44LTcuMi0xNi0xNi0xNmwtMjg4IDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDExMnpNNDAzLjQgNDc2LjFDMzc5LjEgNDk0LjMgMzUxLjEgNTEyIDMyMCA1MTJzLTU5LjEtMTcuNy04My40LTM1LjljLTIxLjMtMTYuMS00OS45LTE2LjEtNzEuMiAwLTIzLjggMTcuOS01NC4xIDM1LjUtODguMSAzNS4zLTIwLjQtLjEtNDAuNy02LjctNTkuOC0yMS4xLTEwLjYtOC0xMi43LTIzLTQuNy0zMy42czIzLTEyLjcgMzMuNi00LjdjMTEuMyA4LjUgMjEuNiAxMS40IDMxLjIgMTEuNSAxNy42IC4xIDM3LjMtOS40IDU4LjktMjUuNyAzOC40LTI5IDkwLjUtMjkgMTI5IDAgMjQgMTguMSA0MC43IDI2LjMgNTQuNSAyNi4zczMwLjUtOC4yIDU0LjUtMjYuM2MzOC40LTI5IDkwLjUtMjkgMTI5IDAgMTYuOSAxMi43IDMyLjkgMjEuNSA0Ny44IDI0LjYgMTMuNyAyLjggMjcuNCAuOSA0Mi4zLTEwLjMgMTAuNi04IDI1LjYtNS45IDMzLjYgNC43czUuOSAyNS42LTQuNyAzMy42Yy0yNi40IDE5LjktNTQuMiAyNC40LTgwLjcgMTkuMS0yNS4zLTUuMS00OC4xLTE4LjktNjcuMi0zMy4zLTIxLjMtMTYuMS00OS45LTE2LjEtNzEuMiAweiJdCiAgICB9OwogICAgZmFNb3NxdWl0byA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb3NxdWl0byIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTJiIiwgIk0xNzguNSA0OTUuMmMtNy41IDkuNi0yMSAxMi4xLTMxLjMgNS4zUzEzMy41IDQ4MCAxMzguOSA0NjlsMS4yLTIuMiAzNi4yLTU4IDAtNDEgLjMtNGMuNi0zLjkgMi4yLTcuNyA0LjYtMTAuOWwzOS4zLTUyLjItNjYuMiA1OS41Yy0xNyAxNS4zLTM5IDIzLjctNjEuOSAyMy44bC04LjEgMGMtNDYuNiAwLTg0LjQtMzcuOC04NC40LTg0LjQgMC00MyAzMi40LTc5LjIgNzUuMS04My45bDEzMC41LTE0LjUtNDQuOC0zOC4zLTIuNC0yLjRjLTUuMy02LTcuMy0xNC40LTUuMy0yMi4zbDEzLjMtNTMuNC0yNS45LTM4LjktMS4zLTIuMWMtNS44LTEwLjgtMi43LTI0LjYgNy40LTMxLjcgMTAuMS03LjEgMjMuNy01LjEgMzEuNCA0LjNsMS41IDIgMzIgNDggMS40IDIuMmMyLjggNS4zIDMuNSAxMS42IDIuMSAxNy42bC0xMi4zIDQ5LjIgNTMuMyA0NS43IDAtMjguOGMwLTExLjggNi41LTIyLjEgMTYtMjcuN2wwLTYwLjUgLjMtMy4zYzEuNS03LjMgOC0xMi43IDE1LjctMTIuN3MxNC4yIDUuNSAxNS43IDEyLjdsLjMgMy4yIDAgNjAuNWM5LjYgNS41IDE2IDE1LjggMTYgMjcuN2wwIDI4LjkgNTMuNC00NS44LTEyLjMtNDkuMmMtMS41LTUuOS0uNy0xMi4yIDIuMS0xNy42bDEuNC0yLjIgMzItNDggMS41LTJjNy43LTkuNCAyMS4zLTExLjUgMzEuNC00LjMgMTAuMSA3LjEgMTMuMSAyMC45IDcuNCAzMS43bC0xLjMgMi4xLTI1LjkgMzguOSAxMy4zIDUzLjRjMiA4LS4xIDE2LjMtNS4zIDIyLjNsLTIuNCAyLjQtNDQuNyAzOC4zIDEzMC41IDE0LjVjNDIuOCA0LjggNzUuMSA0MC45IDc1LjEgODMuOSAwIDQ2LjYtMzcuOCA4NC40LTg0LjQgODQuNGwtOC4xIDBjLTIyLjggMC00NC45LTguNS02MS45LTIzLjhsLTY2LjEtNTkuNSAzOS4yIDUyLjJjMi40IDMuMiA0IDcgNC42IDEwLjlsLjMgNCAwIDQxIDM2LjIgNTggMS4yIDIuMWM1LjQgMTEgMiAyNC43LTguMyAzMS41cy0yMy44IDQuNC0zMS4zLTUuM2wtMS40LTItNDAtNjQtMS42LTMuMWMtMS40LTMuMS0yLjEtNi42LTIuMS0xMC4xbDAtMzkuOC0zMi40LTQzLjEgMCA3NC43YzAgMTcuNy0xNC4zIDMyLTMyIDMyLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNzQuNi0zMi4zIDQzIDAgMzkuOGMwIDMuNS0uNyA2LjktMi4xIDEwLjFsLTEuNiAzLjEtNDAgNjQtMS40IDJ6Il0KICAgIH07CiAgICBmYUJ1aWxkaW5nQ2lyY2xlQXJyb3dSaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJidWlsZGluZy1jaXJjbGUtYXJyb3ctcmlnaHQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRkMSIsICJNMzIgNjRDMzIgMjguNyA2MC43IDAgOTYgMEwzNTIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDE0NC43Yy0zNS43IDIuOS02OC41IDE1LjYtOTYgMzUuNGwwLTRjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsNCAwYy0xMy44IDE5LjItMjQuMSA0MS0zMC4xIDY0LjUtMS45LS40LTMuOS0uNS01LjktLjVsLTMyIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgODAgNzQuOSAwYzYuMSAxNy4zIDE0LjYgMzMuNCAyNS4xIDQ4TDk2IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMzIgNjR6TTE0NCA5NmMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwem0xMTIgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnpNMTQ0IDIyNGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwek0yODggNDAwYTE0NCAxNDQgMCAxIDEgMjg4IDAgMTQ0IDE0NCAwIDEgMSAtMjg4IDB6bTE0MC43LTY3LjNjLTYuMiA2LjItNi4yIDE2LjQgMCAyMi42bDI4LjcgMjguNy04OS40IDBjLTguOCAwLTE2IDcuMi0xNiAxNnM3LjIgMTYgMTYgMTZsODkuNCAwLTI4LjcgMjguN2MtNi4yIDYuMi02LjIgMTYuNCAwIDIyLjZzMTYuNCA2LjIgMjIuNiAwbDU2LTU2YzYuMi02LjIgNi4yLTE2LjQgMC0yMi42bC01Ni01NmMtNi4yLTYuMi0xNi40LTYuMi0yMi42IDB6Il0KICAgIH07CiAgICBmYUxlZnRSaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsZWZ0LXJpZ2h0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbODU5NiwgImFycm93cy1hbHQtaCJdLCAiZjMzNyIsICJNNTAyLjYgNDA2LjZsLTk2IDk2Yy05LjIgOS4yLTIyLjkgMTEuOS0zNC45IDYuOVMzNTIgNDkyLjkgMzUyIDQ4MGwwLTY0LTMyMCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDMyMCAwIDAtNjRjMC0xMi45IDcuOC0yNC42IDE5LjgtMjkuNnMyNS43LTIuMiAzNC45IDYuOWw5NiA5NmMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3pNOS40IDE1MC42Yy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM2w5Ni05NmM5LjItOS4yIDIyLjktMTEuOSAzNC45LTYuOVMxNjAgMTkuMSAxNjAgMzJsMCA2NCAzMjAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIwIDAgMCA2NGMwIDEyLjktNy44IDI0LjYtMTkuOCAyOS42cy0yNS43IDIuMi0zNC45LTYuOWwtOTYtOTZ6Il0KICAgIH07CiAgICBmYUFycm93c0FsdEggPSBmYUxlZnRSaWdodDsKICAgIGZhVmlydXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidmlydXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTA3NCIsICJNMjk2IDQwYzAtMjIuMS0xNy45LTQwLTQwLTQwcy00MCAxNy45LTQwIDQwYzAgNDQuMS01My4zIDY2LjEtODQuNSAzNS0xNS42LTE1LjYtNDAuOS0xNS42LTU2LjYgMHMtMTUuNiA0MC45IDAgNTYuNmMzMS4yIDMxLjIgOS4xIDg0LjUtMzUgODQuNS0yMi4xIDAtNDAgMTcuOS00MCA0MHMxNy45IDQwIDQwIDQwYzQ0LjEgMCA2Ni4xIDUzLjMgMzUgODQuNS0xNS42IDE1LjYtMTUuNiA0MC45IDAgNTYuNnM0MC45IDE1LjYgNTYuNiAwYzMxLjItMzEuMiA4NC41LTkuMSA4NC41IDM1IDAgMjIuMSAxNy45IDQwIDQwIDQwczQwLTE3LjkgNDAtNDBjMC00NC4xIDUzLjMtNjYuMSA4NC41LTM1IDE1LjYgMTUuNiA0MC45IDE1LjYgNTYuNiAwczE1LjYtNDAuOSAwLTU2LjZjLTMxLjItMzEuMi05LjEtODQuNSAzNS04NC41IDIyLjEgMCA0MC0xNy45IDQwLTQwcy0xNy45LTQwLTQwLTQwYy00NC4xIDAtNjYuMS01My4zLTM1LTg0LjUgMTUuNi0xNS42IDE1LjYtNDAuOSAwLTU2LjZzLTQwLjktMTUuNi01Ni42IDBDMzQ5LjMgMTA2LjEgMjk2IDg0LjEgMjk2IDQwek0xNjAgMjI0YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTE2MCAzMmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYUdlbTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ2VtIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MTQyXSwgImYzYTUiLCAiTTExNi43IDMzLjhjNC41LTYuMSAxMS43LTkuOCAxOS4zLTkuOGwyNDAgMGM3LjYgMCAxNC44IDMuNiAxOS4zIDkuOGwxMTIgMTUyYzYuOCA5LjIgNi4xIDIxLjktMS41IDMwLjRsLTIzMiAyNTZjLTQuNSA1LTExIDcuOS0xNy44IDcuOXMtMTMuMi0yLjktMTcuOC03LjlsLTIzMi0yNTZjLTcuNy04LjUtOC4zLTIxLjItMS41LTMwLjRsMTEyLTE1MnptMzguNSAzOS44Yy0zLjMgMi41LTQuMiA3LTIuMSAxMC41TDIxMC41IDE3OS44IDYzLjMgMTkyYy00LjEgLjMtNy4zIDMuOC03LjMgOHMzLjIgNy42IDcuMyA4bDE5MiAxNmMuNCAwIC45IDAgMS4zIDBsMTkyLTE2YzQuMS0uMyA3LjMtMy44IDcuMy04cy0zLjItNy42LTcuMy04bC0xNDcuMi0xMi4zIDU3LjQtOTUuNmMyLjEtMy41IDEuMi04LjEtMi4xLTEwLjVzLTcuOS0yLTEwLjcgMUwyNTYgMTcyLjIgMTY1LjkgNzQuNmMtMi44LTMtNy40LTMuNC0xMC43LTF6Il0KICAgIH07CiAgICBmYVRvaWxldCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0b2lsZXQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjg3MDFdLCAiZjdkOCIsICJNMjQgMEMxMC43IDAgMCAxMC43IDAgMjRTMTAuNyA0OCAyNCA0OGw4IDAgMCAxNDguOWMtMS45IDEuNC0zLjggMi45LTUuNiA0LjQtMTUuNSAxMy4yLTI2LjQgMzEuNi0yNi40IDU0LjYgMCA0Ni45IDE0LjMgODQuMSAzNyAxMTIuNSAxNC4yIDE3LjcgMzEuMSAzMS4zIDQ4LjUgNDEuOEw2NS42IDQ2OS45Yy0zLjMgOS44LTEuNiAyMC41IDQuNCAyOC44Uzg1LjcgNTEyIDk2IDUxMmwyNTYgMGMxMC4zIDAgMTkuOS00LjkgMjYtMTMuM3M3LjctMTkuMSA0LjQtMjguOGwtMTkuOC01OS41YzE3LjQtMTAuNSAzNC4zLTI0LjEgNDguNS00MS44IDIyLjctMjguNCAzNy02NS41IDM3LTExMi41IDAtMjMuMS0xMC45LTQxLjUtMjYuNC01NC42LTEuOC0xLjUtMy43LTMtNS42LTQuNGwwLTE0OC45IDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNFM0MzcuMyAwIDQyNCAwTDI0IDB6TTk2IDgwYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNnMtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZ6TTIyNCAyODhjLTg4LjQgMC0xNjAtMTQuMy0xNjAtMzJzNzEuNi0zMiAxNjAtMzIgMTYwIDE0LjMgMTYwIDMyLTcxLjYgMzItMTYwIDMyeiJdCiAgICB9OwogICAgZmFTaW5nbGVRdW90ZUxlZnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2luZ2xlLXF1b3RlLWxlZnQiLAogICAgICBpY29uOiBbMTkyLCA1MTIsIFtdLCAiZTgxYiIsICJNMTI4IDk2YzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC04IDBjLTMwLjkgMC01NiAyNS4xLTU2IDU2bDAgOCA2NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgNjRjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTY0IDBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMjE2QzAgMTQ5LjcgNTMuNyA5NiAxMjAgOTZsOCAweiJdCiAgICB9OwogICAgZmFNb25leUJpbGxzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vbmV5LWJpbGxzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImUxZjMiLCAiTTE2MCAzMmMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCAyMjRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzUyIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yMjRjMC0zNS4zLTI4LjctNjQtNjQtNjRMMTYwIDMyem0xNzYgOTZhODAgODAgMCAxIDEgMCAxNjAgODAgODAgMCAxIDEgMC0xNjB6TTE2MCAxNTJsMC00OGMwLTQuNCAzLjYtOCA4LThsNDggMGM0LjQgMCA4LjEgMy42IDcuNSA4LTMuNiAyOS0yNi42IDUxLjktNTUuNSA1NS41LTQuNCAuNS04LTMuMS04LTcuNXptMCAxMTJjMC00LjQgMy42LTguMSA4LTcuNSAyOSAzLjYgNTEuOSAyNi42IDU1LjUgNTUuNSAuNSA0LjQtMy4xIDgtNy41IDhsLTQ4IDBjLTQuNCAwLTgtMy42LTgtOGwwLTQ4ek01MDQgMTU5LjVjLTI5LTMuNi01MS45LTI2LjYtNTUuNS01NS41LS41LTQuNCAzLjEtOCA3LjUtOGw0OCAwYzQuNCAwIDggMy42IDggOGwwIDQ4YzAgNC40LTMuNiA4LjEtOCA3LjV6TTUxMiAyNjRsMCA0OGMwIDQuNC0zLjYgOC04IDhsLTQ4IDBjLTQuNCAwLTguMS0zLjYtNy41LTggMy42LTI5IDI2LjYtNTEuOSA1NS41LTU1LjUgNC40LS41IDggMy4xIDggNy41ek00OCAxNTJjMC0xMy4zLTEwLjctMjQtMjQtMjRTMCAxMzguNyAwIDE1MkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzOTIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNEw2NCA0MzJjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTI2NHoiXQogICAgfTsKICAgIGZhVGFibGV0QnV0dG9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRhYmxldC1idXR0b24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjEwYSIsICJNNjQgMEMyOC43IDAgMCAyOC43IDAgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zODRjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMHpNMjI0IDQwMGEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYVJlY3RhbmdsZVhtYXJrMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyZWN0YW5nbGUteG1hcmsiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MjE2NCwgInJlY3RhbmdsZS10aW1lcyIsICJ0aW1lcy1yZWN0YW5nbGUiLCAid2luZG93LWNsb3NlIl0sICJmNDEwIiwgIk02NCA2NEMyOC43IDY0IDAgOTIuNyAwIDEyOEwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwzODQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI1NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCA2NHpNMTY3IDE2N2M5LjQtOS40IDI0LjYtOS40IDMzLjkgMGw1NSA1NSA1NS01NWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjlsLTU1IDU1IDU1IDU1YzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTU1LTU1LTU1IDU1Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45bDU1LTU1LTU1LTU1Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXoiXQogICAgfTsKICAgIGZhUmVjdGFuZ2xlVGltZXMyID0gZmFSZWN0YW5nbGVYbWFyazI7CiAgICBmYVRpbWVzUmVjdGFuZ2xlMiA9IGZhUmVjdGFuZ2xlWG1hcmsyOwogICAgZmFXaW5kb3dDbG9zZTIgPSBmYVJlY3RhbmdsZVhtYXJrMjsKICAgIGZhV3JlbmNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIndyZW5jaCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyODI5NV0sICJmMGFkIiwgIk01MDkuNCA5OC42YzcuNi03LjYgMjAuMy01LjcgMjQuMSA0LjMgNi44IDE3LjcgMTAuNSAzNyAxMC41IDU3LjEgMCA4OC40LTcxLjYgMTYwLTE2MCAxNjAtMTcuNSAwLTM0LjQtMi44LTUwLjItOEwxNDYuOSA0OTguOWMtMjguMSAyOC4xLTczLjcgMjguMS0xMDEuOCAwcy0yOC4xLTczLjcgMC0xMDEuOEwyMzIgMjEwLjJjLTUuMi0xNS44LTgtMzIuNi04LTUwLjIgMC04OC40IDcxLjYtMTYwIDE2MC0xNjAgMjAuMSAwIDM5LjQgMy43IDU3LjEgMTAuNSAxMCAzLjggMTEuOCAxNi41IDQuMyAyNC4xbC04OC43IDg4LjdjLTMgMy00LjcgNy4xLTQuNyAxMS4zbDAgNDEuNGMwIDguOCA3LjIgMTYgMTYgMTZsNDEuNCAwYzQuMiAwIDguMy0xLjcgMTEuMy00LjdsODguNy04OC43eiJdCiAgICB9OwogICAgZmFUcmFzaENhbjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHJhc2gtY2FuIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbNjE0NjAsICJ0cmFzaC1hbHQiXSwgImYyZWQiLCAiTTEzNi43IDUuOUMxNDEuMS03LjIgMTUzLjMtMTYgMTY3LjEtMTZsMTEzLjkgMGMxMy44IDAgMjYgOC44IDMwLjQgMjEuOUwzMjAgMzIgNDE2IDMyYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDk2QzE0LjMgOTYgMCA4MS43IDAgNjRTMTQuMyAzMiAzMiAzMmw5NiAwIDguNy0yNi4xek0zMiAxNDRsMzg0IDAgMCAzMDRjMCAzNS4zLTI4LjcgNjQtNjQgNjRMOTYgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTMwNHptODggNjRjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMTkyYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xOTJjMC0xMy4zLTEwLjctMjQtMjQtMjR6bTEwNCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDE5MmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTkyYzAtMTMuMy0xMC43LTI0LTI0LTI0em0xMDQgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAxOTJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTE5MmMwLTEzLjMtMTAuNy0yNC0yNC0yNHoiXQogICAgfTsKICAgIGZhVHJhc2hBbHQyID0gZmFUcmFzaENhbjI7CiAgICBmYVRhYmxlQ2VsbHMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGFibGUtY2VsbHMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsidGgiXSwgImYwMGEiLCAiTTM4NCA5NmwwIDY0LTY0IDAgMC02NCA2NCAwem0wIDEyOGwwIDY0LTY0IDAgMC02NCA2NCAwem0wIDEyOGwwIDY0LTY0IDAgMC02NCA2NCAwek0yNTYgMjg4bC02NCAwIDAtNjQgNjQgMCAwIDY0em0tNjQgNjRsNjQgMCAwIDY0LTY0IDAgMC02NHptLTY0LTY0bC02NCAwIDAtNjQgNjQgMCAwIDY0ek02NCAzNTJsNjQgMCAwIDY0LTY0IDAgMC02NHptMC0xOTJsMC02NCA2NCAwIDAgNjQtNjQgMHptMTI4IDBsMC02NCA2NCAwIDAgNjQtNjQgMHpNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnoiXQogICAgfTsKICAgIGZhVGggPSBmYVRhYmxlQ2VsbHM7CiAgICBmYVJpYmJvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyaWJib24iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjc4OTVdLCAiZjRkNiIsICJNMjM1LjEgMGMzMy40IDAgNjQuNSAxNy40IDgxLjkgNDUuOSAxLjIgMiAxMyAyMS4zIDM1LjMgNTcuOCAyMS4xIDM0LjUgMTguMyA3OC41LTcgMTEwTDI3OC4zIDI5Ny43IDM2NC41IDQwNmM1LjUgNi45IDQuNCAxNi45LTIuNSAyMi41bC04MCA2NGMtNi45IDUuNS0xNyA0LjQtMjIuNS0yLjVMMzguNiAyMTMuOEMxMy4zIDE4Mi4zIDEwLjUgMTM4LjMgMzEuNiAxMDMuOCA1NCA2Ny4yIDY1LjcgNDcuOSA2NyA0NS45IDg0LjQgMTcuNCAxMTUuNCAwIDE0OC45IDBsODYuMyAwek0xOTIgMTg5LjJsNDguNi02MS4yLTk3LjMgMCA0OC42IDYxLjJ6TTc1IDMzNi4ybDg2LjIgMTA3LjgtMzYuOCA0NmMtNS41IDYuOS0xNS42IDgtMjIuNSAyLjVsLTgwLTY0Yy02LjktNS41LTgtMTUuNi0yLjUtMjIuNUw3NSAzMzYuMnoiXQogICAgfTsKICAgIGZhTGFuZG1hcmtGbGFnID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxhbmRtYXJrLWZsYWciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTUxYyIsICJNMzUyLTMyTDI0MC0zMmMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMTQ0LTE3NiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDE2IDAgMCAyMjQtNTEuMiAzOC40QzQuNyA0NjAuNCAwIDQ2OS45IDAgNDgwIDAgNDk3LjcgMTQuMyA1MTIgMzIgNTEybDQ0OCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMyIDAtMTAuMS00LjctMTkuNi0xMi44LTI1LjZsLTUxLjItMzguNCAwLTIyNCAxNiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0xOTIgMCAwLTY0IDgwIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtNjRjMC04LjgtNy4yLTE2LTE2LTE2em00OCAyMjRsMCAyMjQtNjQgMCAwLTIyNCA2NCAwem0tMTEyIDBsMCAyMjQtNjQgMCAwLTIyNCA2NCAwem0tMTEyIDBsMCAyMjQtNjQgMCAwLTIyNCA2NCAweiJdCiAgICB9OwogICAgZmFVcERvd25MZWZ0UmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXAtZG93bi1sZWZ0LXJpZ2h0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImFycm93cy1hbHQiXSwgImYwYjIiLCAiTTI3OC42IDkuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTY0IDY0Yy05LjIgOS4yLTExLjkgMjIuOS02LjkgMzQuOVMxNzkuMSAxMjggMTkyIDEyOGwzMiAwIDAgOTYtOTYgMCAwLTMyYzAtMTIuOS03LjgtMjQuNi0xOS44LTI5LjZzLTI1LjctMi4yLTM0LjkgNi45bC02NCA2NGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNsNjQgNjRjOS4yIDkuMiAyMi45IDExLjkgMzQuOSA2LjlTMTI4IDMzMi45IDEyOCAzMjBsMC0zMiA5NiAwIDAgOTYtMzIgMGMtMTIuOSAwLTI0LjYgNy44LTI5LjYgMTkuOHMtMi4yIDI1LjcgNi45IDM0LjlsNjQgNjRjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsNjQtNjRjOS4yLTkuMiAxMS45LTIyLjkgNi45LTM0LjlTMzMyLjkgMzg0IDMyMCAzODRsLTMyIDAgMC05NiA5NiAwIDAgMzJjMCAxMi45IDcuOCAyNC42IDE5LjggMjkuNnMyNS43IDIuMiAzNC45LTYuOWw2NC02NGMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM2wtNjQtNjRjLTkuMi05LjItMjIuOS0xMS45LTM0LjktNi45UzM4NCAxNzkuMSAzODQgMTkybDAgMzItOTYgMCAwLTk2IDMyIDBjMTIuOSAwIDI0LjYtNy44IDI5LjYtMTkuOHMyLjItMjUuNy02LjktMzQuOWwtNjQtNjR6Il0KICAgIH07CiAgICBmYUFycm93c0FsdCA9IGZhVXBEb3duTGVmdFJpZ2h0OwogICAgZmFDYXJTaWRlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhci1zaWRlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI4NjYzXSwgImY1ZTQiLCAiTTE0NyAxMDYuN2wtMjkuOCA4NS4zIDEyMi45IDAgMC05Ni03Ny45IDBjLTYuOCAwLTEyLjkgNC4zLTE1LjEgMTAuN3pNNDguNiAxOTMuOUw4Ni41IDg1LjZDOTcuOCA1My41IDEyOC4xIDMyIDE2Mi4xIDMyTDM2MCAzMmMyNS4yIDAgNDguOSAxMS45IDY0IDMybDk2LjIgMTI4LjNDNTg3LjEgMTk2LjUgNjQwIDI1Mi4xIDY0MCAzMjBsMCAxNmMwIDM1LjMtMjguNyA2NC02NCA2NGwtMTYuNCAwYy00IDQ0LjktNDEuNyA4MC04Ny42IDgwcy04My42LTM1LjEtODcuNi04MGwtMTQ0LjcgMGMtNCA0NC45LTQxLjcgODAtODcuNiA4MHMtODMuNi0zNS4xLTg3LjYtODBsLS40IDBjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtODBjMC0zMC4xIDIwLjctNTUuMyA0OC42LTYyLjF6TTQ0MCAxOTJsLTY3LjItODkuNmMtMy00LTcuOC02LjQtMTIuOC02LjRsLTcyIDAgMCA5NiAxNTIgMHpNMTUyIDQzMmE0MCA0MCAwIDEgMCAwLTgwIDQwIDQwIDAgMSAwIDAgODB6bTM2MC00MGE0MCA0MCAwIDEgMCAtODAgMCA0MCA0MCAwIDEgMCA4MCAweiJdCiAgICB9OwogICAgZmFUcmFzaEFycm93VXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHJhc2gtYXJyb3ctdXAiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsidHJhc2gtcmVzdG9yZSJdLCAiZjgyOSIsICJNMTY3LjEtMTZsMTEzLjkgMGMxMy44IDAgMjYgOC44IDMwLjQgMjEuOUwzMjAgMzIgNDE2IDMyYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDk2QzE0LjMgOTYgMCA4MS43IDAgNjRTMTQuMyAzMiAzMiAzMmw5NiAwIDguNy0yNi4xQzE0MS4xLTcuMiAxNTMuMy0xNiAxNjcuMS0xNnpNMzIgMTQ0bDM4NCAwLTIxLjEgMzIzLjFDMzkzLjMgNDkyLjQgMzcyLjMgNTEyIDM0NyA1MTJMMTAxIDUxMmMtMjUuMyAwLTQ2LjMtMTkuNi00Ny45LTQ0LjlMMzIgMTQ0em0yMDkgNzljLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwbC03MiA3MmMtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDMxLTMxIDAgMTAyLjFjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTEwMi4xIDMxIDMxYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNzItNzJ6Il0KICAgIH07CiAgICBmYVRyYXNoUmVzdG9yZSA9IGZhVHJhc2hBcnJvd1VwOwogICAgZmFMaWZlUmluZzIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGlmZS1yaW5nIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxY2QiLCAiTTM2Ny4yIDQxMi41QzMzNS45IDQzNC45IDI5Ny41IDQ0OCAyNTYgNDQ4cy03OS45LTEzLjEtMTExLjItMzUuNWw1OC01OGMxNS44IDguNiAzNCAxMy41IDUzLjMgMTMuNXMzNy40LTQuOSA1My4zLTEzLjVsNTggNTh6bTkwLjcgLjhjMzMuOC00My40IDU0LTk4IDU0LTE1Ny4zUzQ5MS44IDE0Mi4xIDQ1OCA5OC43YzktMTIuNSA3LjktMzAuMS0zLjQtNDEuM1M0MjUuOCA0NSA0MTMuMyA1NEMzNjkuOSAyMC4yIDMxNS4zIDAgMjU2IDBTMTQyLjEgMjAuMiA5OC43IDU0Yy0xMi41LTktMzAuMS03LjktNDEuMyAzLjRTNDUgODYuMiA1NCA5OC43QzIwLjIgMTQyLjEgMCAxOTYuNyAwIDI1NlMyMC4yIDM2OS45IDU0IDQxMy4zYy05IDEyLjUtNy45IDMwLjEgMy40IDQxLjNTODYuMiA0NjcgOTguNyA0NThjNDMuNCAzMy44IDk4IDU0IDE1Ny4zIDU0czExMy45LTIwLjIgMTU3LjMtNTRjMTIuNSA5IDMwLjEgNy45IDQxLjMtMy40czEyLjQtMjguOCAzLjQtNDEuM3ptLTQ1LjUtNDYuMWwtNTgtNThjOC42LTE1LjggMTMuNS0zNCAxMy41LTUzLjNzLTQuOS0zNy40LTEzLjUtNTMuM2w1OC01OEM0MzQuOSAxNzYuMSA0NDggMjE0LjUgNDQ4IDI1NnMtMTMuMSA3OS45LTM1LjUgMTExLjJ6TTM2Ny4yIDk5LjVsLTU4IDU4Yy0xNS44LTguNi0zNC0xMy41LTUzLjMtMTMuNXMtMzcuNCA0LjktNTMuMyAxMy41bC01OC01OEMxNzYuMSA3Ny4xIDIxNC41IDY0IDI1NiA2NHM3OS45IDEzLjEgMTExLjIgMzUuNXpNMTU3LjUgMzA5LjNsLTU4IDU4Qzc3LjEgMzM1LjkgNjQgMjk3LjUgNjQgMjU2czEzLjEtNzkuOSAzNS41LTExMS4ybDU4IDU4Yy04LjYgMTUuOC0xMy41IDM0LTEzLjUgNTMuM3M0LjkgMzcuNCAxMy41IDUzLjN6TTIwOCAyNTZhNDggNDggMCAxIDEgOTYgMCA0OCA0OCAwIDEgMSAtOTYgMHoiXQogICAgfTsKICAgIGZhQ29weXJpZ2h0MiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjb3B5cmlnaHQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxNjldLCAiZjFmOSIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTIwNS4xIDMwNi45YzI4LjEgMjguMSA3My43IDI4LjEgMTAxLjggMCA5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjljLTQ2LjkgNDYuOS0xMjIuOCA0Ni45LTE2OS43IDBzLTQ2LjktMTIyLjggMC0xNjkuNyAxMjIuOC00Ni45IDE2OS43IDBjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGMtMjguMS0yOC4xLTczLjctMjguMS0xMDEuOCAwcy0yOC4xIDczLjcgMCAxMDEuOHoiXQogICAgfTsKICAgIGZhRmlsZVByZXNjcmlwdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLXByZXNjcmlwdGlvbiIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmNTcyIiwgIk0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwyMTMuNSAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDM2NS4zIDEyNS4zYzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNMMzg0IDQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6bTIwOC01LjVsMCA5My41YzAgMTMuMyAxMC43IDI0IDI0IDI0TDMyNS41IDE3NiAyMDggNTguNXpNODggMTkyYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDE0NGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNDAgMjIuNSAwIDU4LjQgNTUtMzMuNCAzMS42Yy05LjYgOS4xLTEwLjEgMjQuMy0uOSAzMy45czI0LjMgMTAuMSAzMy45IC45bDM1LjQtMzMuNSAzNS42IDMzLjVjOS43IDkuMSAyNC44IDguNiAzMy45LTFzOC42LTI0LjgtMS0zMy45bC0zMy42LTMxLjYgMzMuNi0zMS44YzkuNi05LjEgMTAuMS0yNC4zIC45LTMzLjlzLTI0LjMtMTAuMS0zMy45LS45bC0zNS43IDMzLjctNDAuOS0zOC41YzEyLjktMTEuNyAyMS4xLTI4LjYgMjEuMS00Ny41IDAtMzUuMy0yOC43LTY0LTY0LTY0bC01NiAwem0zMiA4MGwtOCAwIDAtMzIgMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZzLTcuMiAxNi0xNiAxNmwtMjQgMHoiXQogICAgfTsKICAgIGZhRXJhc2VyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImVyYXNlciIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMTJkIiwgIk0xNzguNSA0MTZsMTIzIDAgNjUuMy02NS4zLTE3My41LTE3My41LTEyNi43IDEyNi43IDExMiAxMTJ6TTIyNCA0ODBsLTQ1LjUgMGMtMTcgMC0zMy4zLTYuNy00NS4zLTE4LjdMMTcgMzQ1QzYuMSAzMzQuMSAwIDMxOS40IDAgMzA0czYuMS0zMC4xIDE3LTQxTDI2MyAxN0MyNzMuOSA2LjEgMjg4LjYgMCAzMDQgMHMzMC4xIDYuMSA0MSAxN0w1MjcgMTk5YzEwLjkgMTAuOSAxNyAyNS42IDE3IDQxcy02LjEgMzAuMS0xNyA0MWwtMTM1IDEzNSAxMjAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMjg4IDB6Il0KICAgIH07CiAgICBmYUhvdXJnbGFzc1N0YXJ0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXJnbGFzcy1zdGFydCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJob3VyZ2xhc3MtMSJdLCAiZjI1MSIsICJNMzIgMEMxNC4zIDAgMCAxNC4zIDAgMzJTMTQuMyA2NCAzMiA2NGwwIDExYzAgNDIuNCAxNi45IDgzLjEgNDYuOSAxMTMuMWw2Ny45IDY3LjktNjcuOSA2Ny45QzQ4LjkgMzUzLjkgMzIgMzk0LjYgMzIgNDM3bDAgMTFjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzIwIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsMC0xMWMwLTQyLjQtMTYuOS04My4xLTQ2LjktMTEzLjFsLTY3LjktNjcuOSA2Ny45LTY3LjljMzAtMzAgNDYuOS03MC43IDQ2LjktMTEzLjFsMC0xMWMxNy43IDAgMzItMTQuMyAzMi0zMlMzNjkuNyAwIDM1MiAwTDMyIDB6TTI4OCA0MzdsMCAxMS0xOTIgMCAwLTExYzAtMjUuNSAxMC4xLTQ5LjkgMjguMS02Ny45bDY3LjktNjcuOSA2Ny45IDY3LjljMTggMTggMjguMSA0Mi40IDI4LjEgNjcuOXoiXQogICAgfTsKICAgIGZhSG91cmdsYXNzMSA9IGZhSG91cmdsYXNzU3RhcnQ7CiAgICBmYUNpcmNsZUxlZnQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1sZWZ0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjE4NDAsICJhcnJvdy1hbHQtY2lyY2xlLWxlZnQiXSwgImYzNTkiLCAiTTUxMiAyNTZhMjU2IDI1NiAwIDEgMCAtNTEyIDAgMjU2IDI1NiAwIDEgMCA1MTIgMHpNMTI0LjcgMjQ0LjdsMTA0LTEwNGM0LjYtNC42IDExLjUtNS45IDE3LjQtMy41czkuOSA4LjMgOS45IDE0LjhsMCA1NiA5NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJsLTk2IDAgMCA1NmMwIDYuNS0zLjkgMTIuMy05LjkgMTQuOHMtMTIuOSAxLjEtMTcuNC0zLjVsLTEwNC0xMDRjLTYuMi02LjItNi4yLTE2LjQgMC0yMi42eiJdCiAgICB9OwogICAgZmFBcnJvd0FsdENpcmNsZUxlZnQyID0gZmFDaXJjbGVMZWZ0MjsKICAgIGZhQ3J1emVpcm9TaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNydXplaXJvLXNpZ24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTE1MiIsICJNMjQwIDk2Yy04OC40IDAtMTYwIDcxLjYtMTYwIDE2MCAwIDcxLjYgNDcuMSAxMzIuMyAxMTIgMTUyLjdMMTkyIDI1NmMwLTEzLjMgMTAuNy0yNCAyNC0yNCAxMi44IDAgMjMuMyAxMC4xIDI0IDIyLjcgMTUuNS05LjUgMzMuNS0xNC43IDUyLjMtMTQuN2wxMS44IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTExLjggMGMtMTguOCAwLTM2LjEgMTAtNDUuNCAyNi4zLTQuNSA3LjktNi45IDE2LjgtNi45IDI1LjlsMCA3NS44YzQyLjUgMCA4MS4xLTE2LjYgMTA5LjgtNDMuNiAxMi45LTEyLjEgMzMuMS0xMS41IDQ1LjIgMS4zczExLjUgMzMuMS0xLjMgNDUuMkMzNTMuNyA0NTYuOCAyOTkuNSA0ODAgMjQwIDQ4MCAxMTYuMyA0ODAgMTYgMzc5LjcgMTYgMjU2UzExNi4zIDMyIDI0MCAzMmM1OS41IDAgMTEzLjcgMjMuMiAxNTMuNyA2MS4xIDEyLjkgMTIuMSAxMy40IDMyLjQgMS4zIDQ1LjJzLTMyLjQgMTMuNC00NS4yIDEuM0MzMjEuMSAxMTIuNiAyODIuNSA5NiAyNDAgOTZ6Il0KICAgIH07CiAgICBmYVNtb2tpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic21va2luZyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyODY4NF0sICJmNDhkIiwgIk0zNjAgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDE5YzAgNDAuMyAxNiA3OSA0NC41IDEwNy41bDIxIDIxQzQ2OSAxOTEgNDgwIDIxNy40IDQ4MCAyNDVsMCAxOWMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTE5YzAtMTQuOS01LjktMjkuMS0xNi40LTM5LjZsLTIxLTIxQzM1Ny4xIDE0Ni45IDMzNiA5NiAzMzYgNDNsMC0xOWMwLTEzLjMgMTAuNy0yNCAyNC0yNHpNNTUyIDI4OGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC0xOWMwLTQwLjMtMTYtNzktNDQuNS0xMDcuNWwtMjEtMjFDNDQzIDk3IDQzMiA3MC42IDQzMiA0M2wwLTE5YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCAxOWMwIDE0LjkgNS45IDI5LjEgMTYuNCAzOS42bDIxIDIxQzU1NC45IDE0MS4xIDU3NiAxOTIgNTc2IDI0NWwwIDE5YzAgMTMuMy0xMC43IDI0LTI0IDI0ek0zMjAgNDQ4bDk2IDAgMC0zMi05NiAwIDAgMzJ6TTAgNDE2YzAtMzUuMyAyOC43LTY0IDY0LTY0bDM4NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgOTZjMCAxNy43LTE0LjMgMzItMzIgMzJMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTMyem01NzYtNDBsMCAxMTJjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0xMTJjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNHoiXQogICAgfTsKICAgIGZhU3F1YXJlUG9sbFZlcnRpY2FsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1wb2xsLXZlcnRpY2FsIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInBvbGwiXSwgImY2ODEiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6bTU2IDE5MmMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDExMmMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTExMmMwLTEzLjMgMTAuNy0yNCAyNC0yNHptMTg0IDg4YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA0OGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTQ4ek0yMjQgMTI4YzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgMjA4YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMjA4YzAtMTMuMyAxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFQb2xsID0gZmFTcXVhcmVQb2xsVmVydGljYWw7CiAgICBmYVBlcnNvbkNpcmNsZU1pbnVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1jaXJjbGUtbWludXMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU0MCIsICJNMjgwIDI0YTU2IDU2IDAgMSAwIC0xMTIgMCA1NiA1NiAwIDEgMCAxMTIgMHptMjQgMjEyLjdMMzQxIDI4Ni42YzEyLjgtMTcuNSAyOC41LTMyLjcgNDYuMy00NWwtNTYuMi03NS43QzMwNiAxMzIgMjY2LjMgMTEyIDIyNCAxMTJzLTgyIDIwLTEwNy4yIDUzLjlsLTcwLjUgOTVjLTEwLjUgMTQuMi03LjYgMzQuMiA2LjYgNDQuOHMzNC4yIDcuNiA0NC44LTYuNkwxNDQgMjM2LjcgMTQ0IDUxMmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTYwYzAtOC44IDcuMi0xNiAxNi0xNnMxNiA3LjIgMTYgMTZsMCAxNjBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTI3NS4zek02NDAgNDAwYTE0NCAxNDQgMCAxIDAgLTI4OCAwIDE0NCAxNDQgMCAxIDAgMjg4IDB6bS02NCAwYzAgOC44LTcuMiAxNi0xNiAxNmwtMTI4IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsMTI4IDBjOC44IDAgMTYgNy4yIDE2IDE2eiJdCiAgICB9OwogICAgZmFCaW9oYXphcmQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmlvaGF6YXJkIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbOTc2M10sICJmNzgwIiwgIk0yNjAgMTIuNmMwLTguMy03LjYtMTQuNS0xNS41LTEyLjEtNjAuOSAxOC44LTEwNS4xIDc1LjgtMTA1LjEgMTQzLjEgMCAyNS4xIDYuMSA0OC43IDE3IDY5LjUtMjEgMS44LTQyIDguMi02MS41IDE5LjUtNTcuOSAzMy42LTg0LjggMTAwLjItNzAuOSAxNjIuNSAxLjkgOC40IDExLjQgMTIgMTguOSA3LjYgNS0yLjkgNy42LTguNiA3LjEtMTQuNC0uMy0zLjMtLjQtNi42LS40LTEwLjEgMC0xMjMuNSAxODQuNC0xMjMuNSAxODQuNCAwIDAgODguNC05NC41IDExMy42LTE0OC4yIDc1LjQtNC41LTMuMi0xMC41LTMuOS0xNS4zLTEuMS03IDQuMS04LjYgMTMuNi0yLjcgMTkuMSA0Ni42IDQzLjggMTE4IDUzLjkgMTc2LjEgMjAuMiAxNy45LTEwLjQgMzIuOC0yMy45IDQ0LjUtMzkuNCAxMS43IDE1LjYgMjYuNiAyOS4xIDQ0LjUgMzkuNCA1OC4xIDMzLjcgMTI5LjUgMjMuNiAxNzYuMS0yMC4yIDUuOS01LjUgNC4zLTE1LjEtMi43LTE5LjEtNC44LTIuOC0xMC44LTIuMS0xNS4zIDEuMS01My43IDM4LjItMTQ4LjIgMTMtMTQ4LjItNzUuNCAwLTEyMy41IDE4NC40LTEyMy41IDE4NC40IDAgMCAzLjQtLjEgNi44LS40IDEwLjEtLjUgNS44IDIuMSAxMS41IDcuMSAxNC40IDcuNCA0LjMgMTcgLjggMTguOS03LjYgMTMuOS02Mi4yLTEzLTEyOC45LTcwLjktMTYyLjUtMTkuNS0xMS4zLTQwLjQtMTcuNy02MS41LTE5LjUgMTAuOS0yMC44IDE3LTQ0LjQgMTctNjkuNSAwLTY3LjMtNDQuMi0xMjQuMy0xMDUuMS0xNDMuMS03LjktMi40LTE1LjUgMy44LTE1LjUgMTIuMSAwIDUuOSA0IDExIDkuNSAxMy4yIDgzLjQgMzMuNiA3MC44IDE3OC40LTM3LjggMTc4LjRTMTY3LjEgNTkuNCAyNTAuNSAyNS44YzUuNS0yLjIgOS41LTcuMyA5LjUtMTMuMnpNMjQ4LjQgMjg4YTQwIDQwIDAgMSAxIDgwIDAgNDAgNDAgMCAxIDEgLTgwIDB6TTQzNSAzMTcuN2MtMTYuMiAwLTMxLjQgNS41LTQyLjEgMTUtMTAuMSA5LjEtMTguMSAyMy40LTE4LjEgNDUuNiAwIDIxLjEgNy4yIDM1IDE2LjUgNDQuMSAzMi4yLTI0LjYgNTUuNS02MC41IDYzLjktMTAxLjgtNi4zLTEuOS0xMy4yLTMtMjAuMi0zek0yMDIgMzc4LjNjMC0yMi4zLTgtMzYuNi0xOC4xLTQ1LjYtMTAuNy05LjYtMjUuOS0xNS00Mi4xLTE1LTcgMC0xMy45IDEtMjAuMiAzIDguNCA0MS4zIDMxLjYgNzcuMiA2My45IDEwMS44IDkuNC05LjEgMTYuNS0yMy4xIDE2LjUtNDQuMnptNDEuMi0yMjQuM2M5IDEwLjIgMjMuMiAxOC4yIDQ1LjIgMTguMnMzNi4yLTggNDUuMi0xOC4yYzYuNy03LjYgMTEuNS0xNy41IDEzLjYtMjguNC0xOC4zLTYuOC0zOC4yLTEwLjUtNTguOC0xMC41cy00MC41IDMuNy01OC44IDEwLjVjMi4yIDEwLjkgNi45IDIwLjggMTMuNiAyOC41eiJdCiAgICB9OwogICAgZmFCZWxsQ29uY2llcmdlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJlbGwtY29uY2llcmdlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NzE4LCAiY29uY2llcmdlLWJlbGwiXSwgImY1NjIiLCAiTTIxNiA2NGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNiAwIDAgMzMuM0MxMjQuOCAxNTYuNyA0MC4yIDI0My43IDMyLjYgMzUybDQ0Ni45IDBDNDcxLjggMjQzLjcgMzg3LjIgMTU2LjcgMjgwIDE0NS4zbDAtMzMuMyAxNiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC04MCAwek0yNCA0MDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDY0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRMMjQgNDAweiJdCiAgICB9OwogICAgZmFDb25jaWVyZ2VCZWxsID0gZmFCZWxsQ29uY2llcmdlOwogICAgZmFSdWxlckhvcml6b250YWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicnVsZXItaG9yaXpvbnRhbCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNTQ3IiwgIk00OCAzODRjLTI2LjUgMC00OC0yMS41LTQ4LTQ4TDAgMTc2YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDI0IDAgMCAxMDRjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTEwNCA0OCAwIDAgNzJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTcyIDQ4IDAgMCAxMDRjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTEwNCA0OCAwIDAgNzJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTcyIDQ4IDAgMCAxMDRjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTEwNCAyNCAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMTYwYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDQ4IDM4NHoiXQogICAgfTsKICAgIGZhSG9yc2UgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG9yc2UiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgwMTRdLCAiZjZmMCIsICJNNDQ4IDIzOC4xbDAtNzguMSAxNiAwIDkuOCAxOS42YzEyLjUgMjUuMSA0Mi4yIDM2LjQgNjguMyAyNiAyMC41LTguMiAzMy45LTI4IDMzLjktNTAuMUw1NzYgODBjMC0xOS4xLTguNC0zNi4zLTIxLjctNDhsNS43IDBjOC44IDAgMTYtNy4yIDE2LTE2UzU2OC44IDAgNTYwIDBMNDQ4IDBDMzc3LjMgMCAzMjAgNTcuMyAzMjAgMTI4bC0xNzEuMiAwQzExOC4xIDEyOCA5MS4yIDE0NC4zIDc2LjMgMTY4LjggMzMuMiAxNzQuNSAwIDIxMS40IDAgMjU2bDAgNTZjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTU2YzAtMTMuNCA2LjYtMjUuMiAxNi43LTMyLjUgMS42IDEzIDYuMyAyNS40IDEzLjYgMzYuNGwyOC4yIDQyLjRjOC4zIDEyLjQgNi40IDI4LjctMS4yIDQxLjYtMTYuNSAyOC0yMC42IDYyLjItMTAgOTMuOWwxNy41IDUyLjRjNC40IDEzLjEgMTYuNiAyMS45IDMwLjQgMjEuOWwzMy43IDBjMjEuOCAwIDM3LjMtMjEuNCAzMC40LTQyLjFsLTIwLjgtNjIuNWMtMi4xLTYuNC0uNS0xMy40IDQuMy0xOC4ybDEyLjctMTIuN2MxMy4yLTEzLjIgMjAuNi0zMS4xIDIwLjYtNDkuNyAwLTIuMy0uMS00LjYtLjMtNi45bDg0IDI0YzQuMSAxLjIgOC4yIDIuMSAxMi4zIDIuOEwzMjAgNDgwYzAgMTcuNyAxNC4zIDMyIDMyIDMybDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0xNjQuM2MxOS4yLTE5LjIgMzEuNS00NS43IDMyLTc1LjdsMCAwIDAtMS45ek00OTYgNjRhMTYgMTYgMCAxIDEgMCAzMiAxNiAxNiAwIDEgMSAwLTMyeiJdCiAgICB9OwogICAgZmFDYWxlbmRhcjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FsZW5kYXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjgxOTcsIDEyODE5OF0sICJmMTMzIiwgIk0xMjggMEMxMTAuMyAwIDk2IDE0LjMgOTYgMzJsMCAzMi0zMiAwQzI4LjcgNjQgMCA5Mi43IDAgMTI4bDAgNDggNDQ4IDAgMC00OGMwLTM1LjMtMjguNy02NC02NC02NGwtMzIgMCAwLTMyYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMzItMTI4IDAgMC0zMmMwLTE3LjctMTQuMy0zMi0zMi0zMnpNMCAyMjRMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xOTItNDQ4IDB6Il0KICAgIH07CiAgICBmYUhhbmRzSG9sZGluZ0NoaWxkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbmRzLWhvbGRpbmctY2hpbGQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTRmYSIsICJNMzIwLTMyYTQwIDQwIDAgMSAxIDAgODAgNDAgNDAgMCAxIDEgMC04MHpNNDAgNjRjMjIuMSAwIDQwIDE3LjkgNDAgNDBsMCAxNjAuMmMwIDE3IDYuNyAzMy4zIDE4LjcgNDUuM2w1MS4xIDUxLjFjOC4zIDguMyAyMS4zIDkuNiAzMSAzLjEgMTIuOS04LjYgMTQuNy0yNi45IDMuNy0zNy44LTcuMy03LjMtMjMuMS0yMy4xLTQ3LjItNDcuMi0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM3MzMi44LTEyLjUgNDUuMyAwYzI0LjEgMjQuMSAzOS45IDM5LjkgNDcuMiA0Ny4ybDAgMCAyNS4zIDI1LjNjMjEgMjEgMzIuOCA0OS41IDMyLjggNzkuMmwwIDc4LjljMCAyNi41LTIxLjUgNDgtNDggNDhsLTY2LjcgMGMtMTcgMC0zMy4zLTYuNy00NS4zLTE4LjdMMjguMSAzOTMuNEMxMC4xIDM3NS40IDAgMzUxIDAgMzI1LjVMMCAxMDRDMCA4MS45IDE3LjkgNjQgNDAgNjR6bTU2MCAwYzIyLjEgMCA0MCAxNy45IDQwIDQwbDAgMjIxLjVjMCAyNS41LTEwLjEgNDkuOS0yOC4xIDY3LjlMNTEyIDQ5My4zYy0xMiAxMi0yOC4zIDE4LjctNDUuMyAxOC43TDQwMCA1MTJjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtNzguOWMwLTI5LjcgMTEuOC01OC4yIDMyLjgtNzkuMmwyNS4zLTI1LjMgMCAwYzcuMy03LjMgMjMuMS0yMy4xIDQ3LjItNDcuMiAxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zYy0yNC4xIDI0LjEtMzkuOSAzOS45LTQ3LjIgNDcuMi0xMSAxMS05LjIgMjkuMiAzLjcgMzcuOCA5LjcgNi41IDIyLjcgNS4yIDMxLTMuMWw1MS4xLTUxLjFjMTItMTIgMTguNy0yOC4zIDE4LjctNDUuM0w1NjAgMTA0YzAtMjIuMSAxNy45LTQwIDQwLTQwek0zODQuNSAxNDlsLTE5LjgtMTYuNyAxMS4xIDg4LjhjMS42IDEzLjItNy43IDI1LjEtMjAuOCAyNi44cy0yNS4xLTcuNy0yNi44LTIwLjhsLTQuNC0zNS03LjYgMC00LjQgMzVjLTEuNiAxMy4yLTEzLjYgMjIuNS0yNi44IDIwLjhzLTIyLjUtMTMuNi0yMC44LTI2LjhsMTEuMS04OC44LTE5LjggMTYuN2MtMTAuMSA4LjYtMjUuMyA3LjMtMzMuOC0yLjhzLTcuMy0yNS4zIDIuOC0zMy44bDI3LjktMjMuNkMyNzEuMyA3Mi44IDI5NS4zIDY0IDMyMCA2NHM0OC43IDguOCA2Ny42IDI0LjdsMjcuOSAyMy42YzEwLjEgOC42IDExLjQgMjMuNyAyLjggMzMuOHMtMjMuNyAxMS40LTMzLjggMi44eiJdCiAgICB9OwogICAgZmFJdGFsaWMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaXRhbGljIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYwMzMiLCAiTTEyOCA2NGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwxOTIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtNTguNyAwLTEzMy4zIDMyMCA2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDQ4MGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw1OC43IDAgMTMzLjMtMzIwLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyeiJdCiAgICB9OwogICAgZmFLaGFuZGEgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAia2hhbmRhIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTc3Ml0sICJmNjZkIiwgIk0yNDAuNyA4YzguOS03LjQgMjEuOC03LjQgMzAuNyAwbDM3LjggMzEuNWM4LjcgNy4zIDExLjEgMTkuNiA2IDI5LjYtMS4yIDIuNC0yLjggNS41LTQuNiA5LjIgMzQuMiAxOS4yIDU3LjMgNTUuOCA1Ny4zIDk3LjhzLTIzLjEgNzguNi01Ny4zIDk3LjhjMS44IDMuNyAzLjMgNi44IDQuNiA5LjIgNS4xIDEwIDIuNyAyMi4zLTYgMjkuNmwtMzcuMiAzMSAwIDE5LjhjMjIuOS0xNS43IDQ4LjQtMzMuMyA3Ni43LTUyLjcgNDIuOC0yOS40IDY4LjQtNzggNjguNC0xMzBsMC0xMS4xYzAtMjMuOS03LjEtNDcuMy0yMC40LTY3LjItNS4xLTcuNy00LjYtMTcuOCAxLjctMjQuNiA2LjYtNy4xIDE3LjItOC4xIDI1LjItMi44IDI3LjUgMTguMSA4OS40IDY3LjUgODkuNCAxNDkuMSAwIDQ2LjUtMjAuMiA4OC42LTQxLjggMTIwLjQtMjEuNiAzMi00NS42IDU1LTU1LjMgNjMuOC03LjggNy4xLTE5IDcuOS0yNy42IDNsLTcwLjgtNDAuMy0zMi43IDIyLjUgNDUuNSAzMS4zYzEuOC0uNCAzLjctLjcgNS43LS43IDEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0Yy0xMi4yIDAtMjIuMy05LjEtMjMuOC0yMWwtNDAuMi0yNy42IDAgMjguOWM5LjYgNS41IDE2IDE1LjkgMTYgMjcuNyAwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmMwLTExLjggNi40LTIyLjIgMTYtMjcuN2wwLTI4LjEtNDAuMyAyNy43Yy0xLjggMTEuNC0xMS44IDIwLjEtMjMuNyAyMC4xLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRjMi4yIDAgNC40IC4zIDYuNSAuOWw0NS44LTMxLjUtMzIuNy0yMi41LTcwLjggNDAuM2MtOC43IDQuOS0xOS44IDQuMS0yNy42LTMtOS43LTguOC0zMy43LTMxLjktNTUuMy02My44LTIxLjUtMzEuOC00MS44LTczLjktNDEuOC0xMjAuNCAwLTgxLjcgNjEuOS0xMzEuMSA4OS40LTE0OS4xIDguMS01LjMgMTguNi00LjMgMjUuMiAyLjggNi40IDYuOSA2LjggMTcgMS43IDI0LjYtMTMuMyAxOS45LTIwLjQgNDMuMy0yMC40IDY3LjJsMCAxMS4xYzAgNTEuOSAyNS42IDEwMC42IDY4LjQgMTMwIDI4LjQgMTkuNiA1My43IDM2LjkgNzUuNiA1MmwwLTE5LjEtMzcuMi0zMWMtOC43LTcuMy0xMS4xLTE5LjYtNi0yOS42IDEuMi0yLjQgMi44LTUuNSA0LjYtOS4yLTM0LjItMTkuMi01Ny4zLTU1LjgtNTcuMy05Ny44czIzLjEtNzguNiA1Ny4zLTk3LjhjLTEuOC0zLjctMy4zLTYuOC00LjYtOS4yLTUuMS0xMC0yLjctMjIuMyA2LTI5LjZMMjQwLjcgOHpNMjIwLjMgMTIyLjljLTE3IDExLjUtMjguMiAzMS0yOC4yIDUzLjFzMTEuMiA0MS42IDI4LjIgNTMuMWM2LjgtMTkuMiAxMS44LTM4LjQgMTEuOC01My4xcy00LjktMzMuOS0xMS44LTUzLjF6bTcxLjUgMTA2LjJjMTctMTEuNSAyOC4yLTMxIDI4LjItNTMuMXMtMTEuMi00MS42LTI4LjItNTMuMWMtNi44IDE5LjItMTEuOCAzOC40LTExLjggNTMuMXM0LjkgMzMuOSAxMS44IDUzLjF6Il0KICAgIH07CiAgICBmYUZhY2VGcm93bk9wZW4yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZnJvd24tb3BlbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU1MCwgImZyb3duLW9wZW4iXSwgImY1N2EiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0xNzYgMTc2YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHptMTI4IDMyYTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6TTE4Mi40IDM4Mi41Yy0xMi40IDUuMi0yNi41LTQuMS0yMS4xLTE2LjQgMTYtMzYuNiA1Mi40LTYyLjEgOTQuOC02Mi4xczc4LjggMjUuNiA5NC44IDYyLjFjNS40IDEyLjMtOC43IDIxLjYtMjEuMSAxNi40LTIyLjQtOS41LTQ3LjQtMTQuOC03My43LTE0LjhzLTUxLjMgNS4zLTczLjcgMTQuOHoiXQogICAgfTsKICAgIGZhRnJvd25PcGVuMiA9IGZhRmFjZUZyb3duT3BlbjI7CiAgICBmYUNoZWNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoZWNrIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTAwMDMsIDEwMDA0XSwgImYwMGMiLCAiTTQzNC44IDcwLjFjMTQuMyAxMC40IDE3LjUgMzAuNCA3LjEgNDQuN2wtMjU2IDM1MmMtNS41IDcuNi0xNCAxMi4zLTIzLjQgMTMuMXMtMTguNS0yLjctMjUuMS05LjNsLTEyOC0xMjhjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zczMyLjgtMTIuNSA0NS4zIDBsMTAxLjUgMTAxLjUgMjM0LTMyMS43YzEwLjQtMTQuMyAzMC40LTE3LjUgNDQuNy03LjF6Il0KICAgIH07CiAgICBmYUZpbmdlcnByaW50ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbmdlcnByaW50IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1NzciLCAiTTQ4IDI1NmMwLTExNC45IDkzLjEtMjA4IDIwOC0yMDggNjMuMSAwIDExOS42IDI4LjEgMTU3LjggNzIuNSA4LjYgMTAuMSAyMy44IDExLjIgMzMuOCAyLjZzMTEuMi0yMy44IDIuNi0zMy44QzQwMy4zIDM0LjYgMzMzLjcgMCAyNTYgMCAxMTQuNiAwIDAgMTE0LjYgMCAyNTZsMCA0MGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNDB6bTQ1OC41LTUyLjljLTIuNy0xMy0xNS41LTIxLjMtMjguNC0xOC41cy0yMS4zIDE1LjUtMTguNSAyOC40YzIuOSAxMy45IDQuNSAyOC4zIDQuNSA0My4xbDAgNDBjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTQwYzAtMTguMS0xLjktMzUuOC01LjUtNTIuOXpNMjU2IDgwYy0xOSAwLTM3LjQgMy01NC41IDguNi0xNS4yIDUtMTguNyAyMy43LTguMyAzNS45IDcuMSA4LjMgMTguOCAxMC44IDI5LjQgNy45IDEwLjYtMi45IDIxLjgtNC40IDMzLjQtNC40IDcwLjcgMCAxMjggNTcuMyAxMjggMTI4bDAgMjQuOWMwIDI1LjItMS41IDUwLjMtNC40IDc1LjMtMS43IDE0LjYgOS40IDI3LjggMjQuMiAyNy44IDExLjggMCAyMS45LTguNiAyMy4zLTIwLjMgMy4zLTI3LjQgNS01NSA1LTgyLjdsMC0yNC45YzAtOTcuMi03OC44LTE3Ni0xNzYtMTc2ek0xNTAuNyAxNDguN2MtOS4xLTEwLjYtMjUuMy0xMS40LTMzLjktLjQtMjMuMSAyOS44LTM2LjggNjcuMS0zNi44IDEwNy43bDAgMjQuOWMwIDI0LjItMi42IDQ4LjQtNy44IDcxLjktMy40IDE1LjYgNy45IDMxLjEgMjMuOSAzMS4xIDEwLjUgMCAxOS45LTcgMjIuMi0xNy4zIDYuNC0yOC4xIDkuNy01Ni44IDkuNy04NS44bDAtMjQuOWMwLTI3LjIgOC41LTUyLjQgMjIuOS03My4xIDcuMi0xMC40IDgtMjQuNi0uMi0zNC4yek0yNTYgMTYwYy01MyAwLTk2IDQzLTk2IDk2bDAgMjQuOWMwIDM1LjktNC42IDcxLjUtMTMuOCAxMDYuMS0zLjggMTQuMyA2LjcgMjkgMjEuNSAyOSA5LjUgMCAxNy45LTYuMiAyMC40LTE1LjQgMTAuNS0zOSAxNS45LTc5LjIgMTUuOS0xMTkuN2wwLTI0LjljMC0yOC43IDIzLjMtNTIgNTItNTJzNTIgMjMuMyA1MiA1MmwwIDI0LjljMCAzNi4zLTMuNSA3Mi40LTEwLjQgMTA3LjktMi43IDEzLjkgNy43IDI3LjIgMjEuOCAyNy4yIDEwLjIgMCAxOS03IDIxLTE3IDcuNy0zOC44IDExLjYtNzguMyAxMS42LTExOC4xbDAtMjQuOWMwLTUzLTQzLTk2LTk2LTk2em0yNCA5NmMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDI0LjljMCA1OS45LTExIDExOS4zLTMyLjUgMTc1LjJsLTUuOSAxNS4zYy00LjggMTIuNCAxLjQgMjYuMyAxMy44IDMxczI2LjMtMS40IDMxLTEzLjhsNS45LTE1LjNDMjY3LjkgNDExLjkgMjgwIDM0Ni43IDI4MCAyODAuOWwwLTI0Ljl6Il0KICAgIH07CiAgICBmYUNoYXJnaW5nU3RhdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGFyZ2luZy1zdGF0aW9uIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY1ZTciLCAiTTY0IDY0QzY0IDI4LjcgOTIuNyAwIDEyOCAwTDI4OCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjI0YzQ0LjIgMCA4MCAzNS44IDgwIDgwbDAgMTJjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC0xMjcuN2MtMzIuNS0xMC4yLTU2LTQwLjUtNTYtNzYuM2wwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmwxNiAwIDAtNDhjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDQ4IDMyIDAgMC00OGMwLTguOCA3LjItMTYgMTYtMTZzMTYgNy4yIDE2IDE2bDAgNDggMTYgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDM1LjgtMjMuNSA2Ni4xLTU2IDc2LjNMNTIwIDM4MGMwIDM3LjYtMzAuNCA2OC02OCA2OHMtNjgtMzAuNC02OC02OGwwLTEyYzAtMTcuNy0xNC4zLTMyLTMyLTMybDAgMTI5LjRjOS4zIDMuMyAxNiAxMi4yIDE2IDIyLjYgMCAxMy4zLTEwLjcgMjQtMjQgMjRMNzIgNTEyYy0xMy4zIDAtMjQtMTAuNy0yNC0yNCAwLTEwLjUgNi43LTE5LjMgMTYtMjIuNkw2NCA2NHptODIuNyAxMjUuN2wzOSAwLTIwLjkgNjYuOWMtMi40IDcuNiAzLjMgMTUuNCAxMS4zIDE1LjQgMi45IDAgNS42LTEgNy44LTIuOWw5NC42LTgyYzMuMS0yLjcgNC45LTYuNiA0LjktMTAuNyAwLTcuOC02LjMtMTQuMS0xNC4xLTE0LjFsLTM5IDAgMjAuOS02Ni45YzIuNC03LjYtMy4zLTE1LjQtMTEuMy0xNS40LTIuOSAwLTUuNiAxLTcuOCAyLjlsLTk0LjYgODJjLTMuMSAyLjctNC45IDYuNi00LjkgMTAuNyAwIDcuOCA2LjMgMTQuMSAxNC4xIDE0LjF6Il0KICAgIH07CiAgICBmYVVzZXJMb2NrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXItbG9jayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNTAyIiwgIk0yMjQgOGExMjAgMTIwIDAgMSAxIDAgMjQwIDEyMCAxMjAgMCAxIDEgMC0yNDB6TTE5NC4zIDMwNGw1OS40IDBjMjkuNyAwIDU3LjcgNy4zIDgyLjMgMjAuMWwwIDQuM2MtMTkuNiAxNy42LTMyIDQzLjEtMzIgNzEuNWwwIDk2YzAgNS41IC41IDEwLjkgMS4zIDE2LjFMNDUuNyA1MTJDMjkuMyA1MTIgMTYgNDk4LjcgMTYgNDgyLjMgMTYgMzgzLjggOTUuOCAzMDQgMTk0LjMgMzA0em0zMDEuNyAuMWMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDQ3LjkgNjQgMCAwLTQ3Ljl6TTM1MiA0MDBjMC0yMC45IDEzLjQtMzguNyAzMi00NS4zbDAtNTAuNmMwLTQ0LjIgMzUuOC04MCA4MC04MHM4MCAzNS44IDgwIDgwbDAgNTAuNmMxOC42IDYuNiAzMiAyNC40IDMyIDQ1LjNsMCA5NmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTI4IDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtOTZ6Il0KICAgIH07CiAgICBmYU1vYmlsZVNjcmVlbkJ1dHRvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb2JpbGUtc2NyZWVuLWJ1dHRvbiIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJtb2JpbGUtYWx0Il0sICJmM2NkIiwgIk0xNiA2NEMxNiAyOC43IDQ0LjcgMCA4MCAwTDMwNCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzg0YzAgMzUuMy0yOC43IDY0LTY0IDY0TDgwIDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMTYgNjR6bTY0IDBsMCAzMDQgMjI0IDAgMC0zMDQtMjI0IDB6TTE5MiA0NzJjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzItMzIgMTQuMy0zMiAzMiAxNC4zIDMyIDMyIDMyeiJdCiAgICB9OwogICAgZmFNb2JpbGVBbHQgPSBmYU1vYmlsZVNjcmVlbkJ1dHRvbjsKICAgIGZhQW5jaG9yQ2lyY2xlQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYW5jaG9yLWNpcmNsZS1jaGVjayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNGFhIiwgIk0zMjAgOTZhMzIgMzIgMCAxIDEgLTY0IDAgMzIgMzIgMCAxIDEgNjQgMHpNMjg4IDBjLTUzIDAtOTYgNDMtOTYgOTYgMCA0MS44IDI2LjcgNzcuNCA2NCA5MC41bDAgMjU3LjljLTYyLjktMTQuMy0xMTAuMi02OS43LTExMS45LTEzNi41bDE2LjEgMTQuMWMxMCA4LjcgMjUuMSA3LjcgMzMuOS0yLjNzNy43LTI1LjEtMi4zLTMzLjlsLTY0LTU2Yy05LTcuOS0yMi42LTcuOS0zMS42IDBsLTY0IDU2Yy0xMCA4LjctMTEgMjMuOS0yLjMgMzMuOXMyMy45IDExIDMzLjkgMi4zTDgwIDMwNy45YzIuMSAxMTMuMSA5NC40IDIwNC4xIDIwOCAyMDQuMSAxNi42IDAgMzIuNy0xLjkgNDguMi01LjYtMjAuMy0zMC41LTMyLjItNjctMzIuMi0xMDYuNCAwLTI3LjMgNS43LTUzLjMgMTYtNzYuOWwwLTEzNi42YzM3LjMtMTMuMiA2NC00OC43IDY0LTkwLjUgMC01My00My05Ni05Ni05NnpNNjQwIDQwMGExNDQgMTQ0IDAgMSAwIC0yODggMCAxNDQgMTQ0IDAgMSAwIDI4OCAwem0tODYuNi02MC45YzcuMSA1LjIgOC43IDE1LjIgMy41IDIyLjNsLTY0IDg4Yy0yLjggMy44LTcgNi4yLTExLjcgNi41cy05LjMtMS4zLTEyLjYtNC42bC00MC00MGMtNi4yLTYuMi02LjItMTYuNCAwLTIyLjZzMTYuNC02LjIgMjIuNiAwbDI2LjggMjYuOCA1My03Mi45YzUuMi03LjEgMTUuMi04LjcgMjIuNC0zLjV6Il0KICAgIH07CiAgICBmYVBlcnNvbldhbGtpbmdXaXRoQ2FuZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24td2Fsa2luZy13aXRoLWNhbmUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsiYmxpbmQiXSwgImYyOWQiLCAiTTIyNC0zMmE1NiA1NiAwIDEgMSAwIDExMiA1NiA1NiAwIDEgMSAwLTExMnpNMTYwIDIwNS4zbC0yMi42IDIyLjZjLTYgNi05LjQgMTQuMS05LjQgMjIuNmwwIDM3LjVjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0zNy41YzAtMjUuNSAxMC4xLTQ5LjkgMjguMS02Ny45bDM0LjQtMzQuNGMyMy4yLTIzLjIgNTQuNi0zNi4yIDg3LjMtMzYuMiAzNi4xIDAgNzAuMyAxNS44IDkzLjggNDMuMWw2OC42IDgwYzExLjUgMTMuNCA5LjkgMzMuNi0zLjUgNDUuMXMtMzMuNiA5LjktNDUuMS0zLjVsLTU1LjctNjUgMCAxMTguNiAzNC41IDI5LjZjMTcuNyAxNS4yIDI5LjMgMzYuMiAzMi42IDU5LjNsMTIuNiA4OC4xYzIuNSAxNy41LTkuNyAzMy43LTI3LjIgMzYuMnMtMzMuNy05LjctMzYuMi0yNy4ybC0xMi42LTg4LjFjLTEuMS03LjctNS0xNC43LTEwLjktMTkuOGwtNzEuNC02MS4yYy0yMS4zLTE4LjItMzMuNS00NC45LTMzLjUtNzIuOWwwLTY5LjN6bS4xIDE2NS44YzIuNCAyLjMgNC44IDQuNiA3LjQgNi44bDQ2IDM5LjQtMi4yIDcuNmMtNC41IDE1LjctMTIuOSAzMC0yNC40IDQxLjVsLTY4LjMgNjguM2MtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNsNjguMy02OC4zYzMuOC0zLjggNi42LTguNiA4LjEtMTMuOEwxNjAuMSAzNzF6bTIzMy41LTYyLjJjMTAuNi04IDI1LjYtNS44IDMzLjYgNC44bDE0NCAxOTJjOCAxMC42IDUuOCAyNS42LTQuOCAzMy42cy0yNS42IDUuOC0zMy42LTQuOGwtMTQ0LTE5MmMtOC0xMC42LTUuOC0yNS42IDQuOC0zMy42eiJdCiAgICB9OwogICAgZmFCbGluZCA9IGZhUGVyc29uV2Fsa2luZ1dpdGhDYW5lOwogICAgZmFGaWxlV2F2ZWZvcm0gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS13YXZlZm9ybSIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJmaWxlLW1lZGljYWwtYWx0Il0sICJmNDc4IiwgIk0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwyMTMuNSAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDM2NS4zIDEyNS4zYzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNMMzg0IDQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtOTYgNjAuMyAwIDQ4LjggNjIuN2M1LjEgNi42IDEzLjMgMTAgMjEuNiA5LjFzMTUuNS02LjEgMTkuMS0xMy42bDQyLjktOTEuMiA5LjkgMTkuOGM0LjEgOC4xIDEyLjQgMTMuMyAyMS41IDEzLjNsNzIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNTcuMiAwLTI1LjQtNTAuN2MtNC4xLTguMi0xMi42LTEzLjQtMjEuOC0xMy4zcy0xNy41IDUuNS0yMS40IDEzLjhsLTQ3LjMgMTAwLjYtMzItNDEuMUM4Ni40IDMwNy40IDc5LjQgMzA0IDcyIDMwNEwwIDMwNCAwIDY0em0yMDgtNS41bDAgOTMuNWMwIDEzLjMgMTAuNyAyNCAyNCAyNEwzMjUuNSAxNzYgMjA4IDU4LjV6Il0KICAgIH07CiAgICBmYUZpbGVNZWRpY2FsQWx0ID0gZmFGaWxlV2F2ZWZvcm07CiAgICBmYUhvdXNlQ3JhY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG91c2UtY3JhY2siLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTNiMSIsICJNMjc3LjggOC42Yy0xMi4zLTExLjQtMzEuMy0xMS40LTQzLjUgMGwtMjI0IDIwOGMtOS42IDktMTIuOCAyMi45LTggMzUuMVMxOC44IDI3MiAzMiAyNzJsMTYgMCAwIDE3NmMwIDM1LjMgMjguNyA2NCA2NCA2NGw4Ni40IDAtMzEuMy01Mi4yYy00LjEtNi44LTIuNi0xNS41IDMuNS0yMC41TDI1NiAzNjggMTk1LjggMjg1LjJjLTEwLjktMTUgOC4yLTMzLjUgMjIuOC0yMmwxMTcuOSA5Mi42YzggNi4zIDguMiAxOC40IC40IDI0LjlMMjU2IDQ0OCAyOTQuNCA1MTIgNDAwIDUxMmMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTE3NiAxNiAwYzEzLjIgMCAyNS04LjEgMjkuOC0yMC4zczEuNi0yNi4yLTgtMzUuMWwtMjI0LTIwOHoiXQogICAgfTsKICAgIGZhSGF0V2l6YXJkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhdC13aXphcmQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjZlOCIsICJNNjQgNDAwbDg1LjctMjA4LjJjMTctNDEuMyA0Ny44LTc1LjMgODcuMi05Ni4zTDM4My44IDE3LjJjMTIuMy02LjYgMjYuNSA0LjcgMjMgMTguMkwzNjkuNiAxNzcuOGMtMS4xIDQuMS0xLjYgOC4zLTEuNiAxMi42IDAgNi4zIDEuMiAxMi42IDMuNiAxOC41bDc2LjQgMTkxLjEtMjA3LjEgMCAxMS44LTM1LjQgNDAuNC0xMy41YzYuNS0yLjIgMTAuOS04LjMgMTAuOS0xNS4ycy00LjQtMTMtMTAuOS0xNS4ybC00MC40LTEzLjUtMTMuNS00MC40QzIzNyAyNjAuNCAyMzAuOSAyNTYgMjI0IDI1NnMtMTMgNC40LTE1LjIgMTAuOWwtMTMuNSA0MC40LTQwLjQgMTMuNUMxNDguNCAzMjMgMTQ0IDMyOS4xIDE0NCAzMzZzNC40IDEzIDEwLjkgMTUuMmw0MC40IDEzLjUgMTEuOCAzNS40LTE0My4xIDB6TTI3OS42IDE0MS41Yy0xLjEtMy4zLTQuMS01LjUtNy42LTUuNXMtNi41IDIuMi03LjYgNS41bC02LjcgMjAuMi0yMC4yIDYuN2MtMy4zIDEuMS01LjUgNC4xLTUuNSA3LjZzMi4yIDYuNSA1LjUgNy42bDIwLjIgNi43IDYuNyAyMC4yYzEuMSAzLjMgNC4xIDUuNSA3LjYgNS41czYuNS0yLjIgNy42LTUuNWw2LjctMjAuMiAyMC4yLTYuN2MzLjMtMS4xIDUuNS00LjEgNS41LTcuNnMtMi4yLTYuNS01LjUtNy42bC0yMC4yLTYuNy02LjctMjAuMnpNMzIgNDQ4bDQ0OCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDUxMmMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMnoiXQogICAgfTsKICAgIGZhVXNlckRvY3RvciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1c2VyLWRvY3RvciIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJ1c2VyLW1kIl0sICJmMGYwIiwgIk0yMjQgOGExMjAgMTIwIDAgMSAwIDAgMjQwIDEyMCAxMjAgMCAxIDAgMC0yNDB6bTYwIDMxMi44Yy01LjQtLjUtMTEtLjgtMTYuNi0uOGwtODYuOSAwYy01LjYgMC0xMS4xIC4zLTE2LjYgLjhsMCA2Ny41YzE2LjUgNy42IDI4IDI0LjMgMjggNDMuNiAwIDI2LjUtMjEuNSA0OC00OCA0OHMtNDgtMjEuNS00OC00OGMwLTE5LjQgMTEuNS0zNi4xIDI4LTQzLjZsMC01OC40QzYxIDM1MyAxNiA0MTMuNiAxNiA0ODQuNiAxNiA0OTkuNyAyOC4zIDUxMiA0My40IDUxMmwzNjEuMSAwYzE1LjEgMCAyNy40LTEyLjMgMjcuNC0yNy40IDAtNzEtNDUtMTMxLjUtMTA4LTE1NC42bDAgMzcuNGMyMy4zIDguMiA0MCAzMC41IDQwIDU2LjZsMCAzMmMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC0zMmMwLTExLTktMjAtMjAtMjBzLTIwIDktMjAgMjBsMCAzMmMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC0zMmMwLTI2LjEgMTYuNy00OC4zIDQwLTU2LjZsMC00Ni42eiJdCiAgICB9OwogICAgZmFVc2VyTWQgPSBmYVVzZXJEb2N0b3I7CiAgICBmYUNoYXJ0QmFyMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGFydC1iYXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiYmFyLWNoYXJ0Il0sICJmMDgwIiwgIk0zMiAzMmMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDMzNmMwIDguOCA3LjIgMTYgMTYgMTZsNDAwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMODAgNDgwYy00NC4yIDAtODAtMzUuOC04MC04MEwwIDY0QzAgNDYuMyAxNC4zIDMyIDMyIDMyem05NiA2NGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwxOTIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTkyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyem0zMiA4MGwxMjggMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTI4IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJ6bTAgMTEybDI1NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0yNTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMnoiXQogICAgfTsKICAgIGZhQmFyQ2hhcnQyID0gZmFDaGFydEJhcjI7CiAgICBmYVNwcmF5Q2FuU3BhcmtsZXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3ByYXktY2FuLXNwYXJrbGVzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImFpci1mcmVzaGVuZXIiXSwgImY1ZDAiLCAiTTE2MCAzMmwwIDgwIDEyOCAwIDAtODBjMC0xNy43LTE0LjMtMzItMzItMzJMMTkyIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyem0wIDEyOGMtNTMgMC05NiA0My05NiA5NmwwIDIwOGMwIDI2LjUgMjEuNSA0OCA0OCA0OGwyMjQgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTIwOGMwLTUzLTQzLTk2LTk2LTk2bC0xMjggMHptNjQgOTZhODAgODAgMCAxIDEgMCAxNjAgODAgODAgMCAxIDEgMC0xNjB6TTQ0OCA0OGMwLTEuNC0xLTMtMi4yLTMuNkw0MTYgMzIgNDAzLjYgMi4yQzQwMyAxIDQwMS40IDAgNDAwIDBzLTMgMS0zLjYgMi4yTDM4NCAzMiAzNTQuMiA0NC40Yy0xLjIgLjYtMi4yIDIuMi0yLjIgMy42IDAgMS40IDEgMyAyLjIgMy42TDM4NCA2NCAzOTYuNCA5My44QzM5NyA5NSAzOTguNiA5NiA0MDAgOTZzMy0xIDMuNi0yLjJMNDE2IDY0IDQ0NS44IDUxLjZDNDQ3IDUxIDQ0OCA0OS40IDQ0OCA0OHptNzYuNCA0NS44QzUyNSA5NSA1MjYuNiA5NiA1MjggOTZzMy0xIDMuNi0yLjJMNTQ0IDY0IDU3My44IDUxLjZjMS4yLS42IDIuMi0yLjIgMi4yLTMuNiAwLTEuNC0xLTMtMi4yLTMuNkw1NDQgMzIgNTMxLjYgMi4yQzUzMSAxIDUyOS40IDAgNTI4IDBzLTMgMS0zLjYgMi4yTDUxMiAzMiA0ODIuMiA0NC40Yy0xLjIgLjYtMi4yIDIuMi0yLjIgMy42IDAgMS40IDEgMyAyLjIgMy42TDUxMiA2NCA1MjQuNCA5My44em03LjIgMTAwLjRjLS42LTEuMi0yLjItMi4yLTMuNi0yLjJzLTMgMS0zLjYgMi4yTDUxMiAyMjQgNDgyLjIgMjM2LjRjLTEuMiAuNi0yLjIgMi4yLTIuMiAzLjYgMCAxLjQgMSAzIDIuMiAzLjZMNTEyIDI1NiA1MjQuNCAyODUuOGMuNiAxLjIgMi4yIDIuMiAzLjYgMi4yczMtMSAzLjYtMi4yTDU0NCAyNTYgNTczLjggMjQzLjZjMS4yLS42IDIuMi0yLjIgMi4yLTMuNiAwLTEuNC0xLTMtMi4yLTMuNkw1NDQgMjI0IDUzMS42IDE5NC4yek01MTIgMTQ0YzAtMS40LTEtMy0yLjItMy42TDQ4MCAxMjggNDY3LjYgOTguMkM0NjcgOTcgNDY1LjQgOTYgNDY0IDk2cy0zIDEtMy42IDIuMkw0NDggMTI4IDQxOC4yIDE0MC40Yy0xLjIgLjYtMi4yIDIuMi0yLjIgMy42IDAgMS40IDEgMyAyLjIgMy42TDQ0OCAxNjAgNDYwLjQgMTg5LjhjLjYgMS4yIDIuMiAyLjIgMy42IDIuMnMzLTEgMy42LTIuMkw0ODAgMTYwIDUwOS44IDE0Ny42YzEuMi0uNiAyLjItMi4yIDIuMi0zLjZ6Il0KICAgIH07CiAgICBmYUFpckZyZXNoZW5lciA9IGZhU3ByYXlDYW5TcGFya2xlczsKICAgIGZhQmFodFNpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmFodC1zaWduIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbXSwgImUwYWMiLCAiTTEzNiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDQwLTc0LjQgMEMxNi44IDY0IDAgODAuOCAwIDEwMS42TDAgNDA2LjNjMCAyMyAxOC43IDQxLjcgNDEuNyA0MS43bDcwLjMgMCAwIDQwYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC00MCA0OCAwYzYxLjkgMCAxMTItNTAuMSAxMTItMTEyIDAtNDAuMS0yMS4xLTc1LjMtNTIuNy05NS4xIDEzLjEtMTguMyAyMC43LTQwLjcgMjAuNy02NC45IDAtNjEuOS01MC4xLTExMi0xMTItMTEybC0xNiAwIDAtNDBjMC0xMy4zLTEwLjctMjQtMjQtMjR6TTExMiAxMjhsMCA5Ni00OCAwIDAtOTYgNDggMHptNDggOTZsMC05NiAxNiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4cy0yMS41IDQ4LTQ4IDQ4bC0xNiAwem0tNDggNjRsMCA5Ni00OCAwIDAtOTYgNDggMHptNDggOTZsMC05NiA0OCAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4cy0yMS41IDQ4LTQ4IDQ4bC00OCAweiJdCiAgICB9OwogICAgZmFUZW1wZXJhdHVyZUFycm93VXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGVtcGVyYXR1cmUtYXJyb3ctdXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsidGVtcGVyYXR1cmUtdXAiXSwgImUwNDAiLCAiTTY0LjUgOTZjMC01MyA0My05NiA5Ni05NnM5NiA0MyA5NiA5NmwwIDE2NC43YzI5LjUgMjYuNCA0OCA2NC43IDQ4IDEwNy4zIDAgNzkuNS02NC41IDE0NC0xNDQgMTQ0cy0xNDQtNjQuNS0xNDQtMTQ0YzAtNDIuNiAxOC41LTgxIDQ4LTEwNy4zTDY0LjUgOTZ6bTk2IDMzNmMzNS4zIDAgNjQtMjguNyA2NC02NCAwLTI2LjktMTYuNS00OS45LTQwLTU5LjNsMC0yMTIuN2MwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDIxMi43Yy0yMy41IDkuNS00MCAzMi41LTQwIDU5LjMgMCAzNS4zIDI4LjcgNjQgNjQgNjR6TTQzOS4xIDkuNGw2NCA2NGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMGwtOS40LTkuNCAwIDE3OC43YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTc4LjctOS40IDkuNGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNsNjQtNjRjNi02IDE0LjEtOS40IDIyLjYtOS40czE2LjYgMy40IDIyLjYgOS40eiJdCiAgICB9OwogICAgZmFUZW1wZXJhdHVyZVVwID0gZmFUZW1wZXJhdHVyZUFycm93VXA7CiAgICBmYVdlYkF3ZXNvbWUyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIndlYi1hd2Vzb21lIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU2ODIiLCAiTTM3Mi4yIDUyYzAgMjAuOS0xMi40IDM5LTMwLjIgNDcuMkw0NDggMTkyIDU1Mi40IDE3MS4xYy01LjMtNy43LTguNC0xNy4xLTguNC0yNy4xIDAtMjYuNSAyMS41LTQ4IDQ4LTQ4czQ4IDIxLjUgNDggNDhjMCAyNi0yMC42IDQ3LjEtNDYuNCA0OEw0ODEgNDQyLjNjLTEwLjMgMjMtMzMuMiAzNy43LTU4LjQgMzcuN2wtMjA1LjIgMGMtMjUuMiAwLTQ4LTE0LjgtNTguNC0zNy43TDQ2LjQgMTkyQzIwLjYgMTkxLjEgMCAxNzAgMCAxNDQgMCAxMTcuNSAyMS41IDk2IDQ4IDk2czQ4IDIxLjUgNDggNDhjMCAxMC4xLTMuMSAxOS40LTguNCAyNy4xTDE5MiAxOTIgMjk4LjEgOTkuMWMtMTcuNy04LjMtMzAtMjYuMy0zMC00Ny4xIDAtMjguNyAyMy4zLTUyIDUyLTUyczUyIDIzLjMgNTIgNTJ6Il0KICAgIH07CiAgICBmYU5vbkJpbmFyeSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJub24tYmluYXJ5IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImU4MDciLCAiTTE5MiA1NDRjLTk3LjIgMC0xNzYtNzguOC0xNzYtMTc2IDAtODYuMyA2Mi4xLTE1OCAxNDQtMTczbDAtNDcuMi00OS43IDI0LjgtMyAxLjNjLTE1LjIgNS43LTMyLjUtLjgtMzkuOS0xNS43LTcuNC0xNC44LTIuMi0zMi42IDExLjUtNDEuM2wyLjgtMS42IDM4LjgtMTkuNC0zOC44LTE5LjRjLTE1LjgtNy45LTIyLjItMjcuMS0xNC4zLTQyLjkgNy40LTE0LjggMjQuOC0yMS40IDQwLTE1LjZsMyAxLjMgNDkuNyAyNC44IDAtNDQuMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgNDQuMiA0OS43LTI0LjggMy0xLjNjMTUuMi01LjggMzIuNSAuOCAzOS45IDE1LjZzMi4yIDMyLjctMTEuNSA0MS4zbC0yLjggMS42LTM4LjcgMTkuNCAzOC43IDE5LjNjMTUuOCA3LjkgMjIuMiAyNy4xIDE0LjMgNDIuOS03LjQgMTQuOC0yNC43IDIxLjQtMzkuOSAxNS42bC0zLTEuMy00OS43LTI0LjggMCA0Ny4yYzgxLjkgMTUuMSAxNDQgODYuOCAxNDQgMTczIDAgOTcuMi03OC44IDE3Ni0xNzYgMTc2em0wLTY0YTExMiAxMTIgMCAxIDAgMC0yMjQgMTEyIDExMiAwIDEgMCAwIDIyNHoiXQogICAgfTsKICAgIGZhTiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJuIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTEwXSwgIjRlIiwgIk0yMS4xIDMzLjljMTIuNy00LjYgMjYuOS0uNyAzNS41IDkuNkwzMjAgMzU5LjYgMzIwIDY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAzODRjMCAxMy41LTguNCAyNS41LTIxLjEgMzAuMXMtMjYuOSAuNy0zNS41LTkuNkw2NCAxNTIuNCA2NCA0NDhjMCAxNy43LTE0LjMgMzItMzIgMzJTMCA0NjUuNyAwIDQ0OEwwIDY0QzAgNTAuNSA4LjQgMzguNSAyMS4xIDMzLjl6Il0KICAgIH07CiAgICBmYUFycm93c1VwRG93bkxlZnRSaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvd3MtdXAtZG93bi1sZWZ0LXJpZ2h0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImFycm93cyJdLCAiZjA0NyIsICJNMjc4LjYgOS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMGwtNjQgNjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBsOS40LTkuNCAwIDExNC43LTExNC43IDAgOS40LTkuNGMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMGwtNjQgNjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zbDY0IDY0YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTkuNC05LjQgMTE0LjcgMCAwIDExNC43LTkuNC05LjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zbDY0IDY0YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwbDY0LTY0YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwbC05LjQgOS40IDAtMTE0LjcgMTE0LjcgMC05LjQgOS40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwbDY0LTY0YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zbC02NC02NGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNsOS40IDkuNC0xMTQuNyAwIDAtMTE0LjcgOS40IDkuNGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zbC02NC02NHoiXQogICAgfTsKICAgIGZhQXJyb3dzID0gZmFBcnJvd3NVcERvd25MZWZ0UmlnaHQ7CiAgICBmYUhvdXNlMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VzZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyNzk2OCwgNjM0OTgsIDYzNTAwLCAiaG9tZSIsICJob21lLWFsdCIsICJob21lLWxnLWFsdCJdLCAiZjAxNSIsICJNMjc3LjggOC42Yy0xMi4zLTExLjQtMzEuMy0xMS40LTQzLjUgMGwtMjI0IDIwOGMtOS42IDktMTIuOCAyMi45LTggMzUuMVMxOC44IDI3MiAzMiAyNzJsMTYgMCAwIDE3NmMwIDM1LjMgMjguNyA2NCA2NCA2NGwyODggMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTE3NiAxNiAwYzEzLjIgMCAyNS04LjEgMjkuOC0yMC4zczEuNi0yNi4yLTgtMzUuMWwtMjI0LTIwOHpNMjQwIDMyMGwzMiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgOTYtMTI4IDAgMC05NmMwLTI2LjUgMjEuNS00OCA0OC00OHoiXQogICAgfTsKICAgIGZhSG9tZTIgPSBmYUhvdXNlMjsKICAgIGZhSG9tZUFsdDIgPSBmYUhvdXNlMjsKICAgIGZhSG9tZUxnQWx0MiA9IGZhSG91c2UyOwogICAgZmFTcGlubmVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNwaW5uZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjExMCIsICJNMjA4IDQ4YTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6bTAgNDE2YTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6TTQ4IDIwOGE0OCA0OCAwIDEgMSAwIDk2IDQ4IDQ4IDAgMSAxIDAtOTZ6bTM2OCA0OGE0OCA0OCAwIDEgMSA5NiAwIDQ4IDQ4IDAgMSAxIC05NiAwek03NSAzNjkuMUE0OCA0OCAwIDEgMSAxNDIuOSA0MzcgNDggNDggMCAxIDEgNzUgMzY5LjF6TTc1IDc1QTQ4IDQ4IDAgMSAxIDE0Mi45IDE0Mi45IDQ4IDQ4IDAgMSAxIDc1IDc1ek00MzcgMzY5LjFBNDggNDggMCAxIDEgMzY5LjEgNDM3IDQ4IDQ4IDAgMSAxIDQzNyAzNjkuMXoiXQogICAgfTsKICAgIGZhR2F2ZWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ2F2ZWwiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsibGVnYWwiXSwgImYwZTMiLCAiTTE2OS42IDE1My40bC0xOC43LTE4LjdjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zTDI2NS42LTI1LjRjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBMMzI5LjYtNi42YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zTDIxNC45IDE1My40Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHpNMjc2IDIxMS43bC0zMS40LTMxLjQgMTEyLTExMiAxMTkuNCAxMTkuNC0xMTIgMTEyLTMxLjQtMzEuNC0yMzIgMjMyYy0xNS42IDE1LjYtNDAuOSAxNS42LTU2LjYgMHMtMTUuNi00MC45IDAtNTYuNmwyMzItMjMyek0zOTAuOSAzNzQuNmMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNMNTA1LjYgMjE0LjZjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBsMTguNyAxOC43YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zTDQ1NC45IDM5My40Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMGwtMTguNy0xOC43eiJdCiAgICB9OwogICAgZmFMZWdhbCA9IGZhR2F2ZWw7CiAgICBmYVRpY2tldFNpbXBsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0aWNrZXQtc2ltcGxlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInRpY2tldC1hbHQiXSwgImYzZmYiLCAiTTAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDQ0OCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgNjRjMCA4LjgtNy40IDE1LjctMTUuNyAxOC42LTE4LjggNi41LTMyLjMgMjQuNC0zMi4zIDQ1LjRzMTMuNSAzOC45IDMyLjMgNDUuNGM4LjMgMi45IDE1LjcgOS44IDE1LjcgMTguNmwwIDY0YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC02NEMwIDMxMS4yIDcuNCAzMDQuMyAxNS43IDMwMS40IDM0LjUgMjk0LjkgNDggMjc3IDQ4IDI1NnMtMTMuNS0zOC45LTMyLjMtNDUuNEM3LjQgMjA3LjcgMCAyMDAuOCAwIDE5MmwwLTY0eiJdCiAgICB9OwogICAgZmFUaWNrZXRBbHQgPSBmYVRpY2tldFNpbXBsZTsKICAgIGZhRG92ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkb3ZlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MzMwXSwgImY0YmEiLCAiTTQ5NiA2NGMxMy4yIDAgMjAuNyAxNS4xIDEyLjggMjUuNkw0ODAgMTI4IDQ4MCAzMDRjMCA3OS41LTY0LjUgMTQ0LTE0NCAxNDRsLTExMiAwLTQ2LjMgNDYuM2MtMTAuNCAxMC40LTI2LjUgMTIuNC0zOS4xIDQuOEw0MS41IDQ0MC45Yy0xNy0xMC4yLTE1LTM1LjUgMy40LTQyLjlMMTYwIDM1MkMyMy44IDMxMS4xIDcuNSAxNjkuOCAyMiA5NS43IDI1LjYgNzcuOSA0NS4zIDcxLjQgNjEuMyA4MC4yTDMyMCAyMjQgMzIwIDE0NGMwLTQ0LjIgMzUuOC04MCA4MC04MGw5NiAwem0tOTYgNTZhMjQgMjQgMCAxIDAgMCA0OCAyNCAyNCAwIDEgMCAwLTQ4ek0xODIuNS05LjZjMTIuNC0xMy43IDMzLjMtOC45IDQyLjUgNy4xbDU2LjQgOTguM2MtNS44IDE0LjQtOS4yIDMwLjEtOS40IDQ2LjVMMTM4LjEgNjhjMTAuMS0zMS42IDI3LTU4LjQgNDQuNC03Ny42eiJdCiAgICB9OwogICAgZmFUYXJwRHJvcGxldCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YXJwLWRyb3BsZXQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTU3YyIsICJNMjU2IDE2MGMzNS4zIDAgNjQtMjYuOSA2NC02MCAwLTI0LTMzLjctNzAuMS01Mi4yLTkzLjUtNi4xLTcuNy0xNy41LTcuNy0yMy42IDAtMTguNSAyMy40LTUyLjIgNjkuNS01Mi4yIDkzLjUgMCAzMy4xIDI4LjcgNjAgNjQgNjB6TTM2OCA5NmMwIDYxLjktNTAuMSAxMTItMTEyIDExMlMxNDQgMTU3LjkgMTQ0IDk2YzAtMTEuMSAxLjYtMjEuOSA0LjYtMzJMNjQgNjRDMjguNyA2NCAwIDkyLjcgMCAxMjhMMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjc3LjUgMGMxNyAwIDMzLjMtNi43IDQ1LjMtMTguN0w0OTMuMyAzMjIuN2MxMi0xMiAxOC43LTI4LjMgMTguNy00NS4zTDUxMiAxMjhjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTg0LjYgMGMzIDEwLjEgNC42IDIwLjkgNC42IDMyem04NS41IDE3NkwzMzYgMzg5LjUgMzM2IDI5NmMwLTEzLjMgMTAuNy0yNCAyNC0yNGw5My41IDB6TTk2IDEyOGEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYVRyZWVDaXR5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRyZWUtY2l0eSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTg3IiwgIk0yODggNDhjMC0yNi41IDIxLjUtNDggNDgtNDhsOTYgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDQ4IDQ4IDAgMC03MmMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgNzIgMTYgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDMyMGMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMjU2IDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtNDE2em02NCA2NGwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2em0xNiA4MGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwek0zNTIgMzA0bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6TTUyOCAxOTJjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHpNNTEyIDMwNGwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2ek05NiA0ODBsMC0xNjAtMTYgMGMtNDQuMiAwLTgwLTM1LjgtODAtODAgMC0yNi43IDEzLjEtNTAuMyAzMy4yLTY0LjktLjgtNC45LTEuMi0xMC0xLjItMTUuMSAwLTUzIDQzLTk2IDk2LTk2czk2IDQzIDk2IDk2bDAgOTZjMCAzNS4zLTI4LjcgNjQtNjQgNjRsMCAxNjBjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJ6Il0KICAgIH07CiAgICBmYVR1cm5VcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0dXJuLXVwIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTA1NDgsICJsZXZlbC11cC1hbHQiXSwgImYzYmYiLCAiTTE2OS40IDkuNGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMGwxMjggMTI4YzkuMiA5LjIgMTEuOSAyMi45IDYuOSAzNC45UzMzMi45IDE5MiAzMjAgMTkybC02NCAwIDAgMTYwYzAgODguNC03MS42IDE2MC0xNjAgMTYwbC02NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTY0YzAtMTcuNyAxNC4zLTMyIDMyLTMybDY0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0xNjAtNjQgMGMtMTIuOSAwLTI0LjYtNy44LTI5LjYtMTkuOHMtMi4yLTI1LjcgNi45LTM0LjlsMTI4LTEyOHoiXQogICAgfTsKICAgIGZhTGV2ZWxVcEFsdCA9IGZhVHVyblVwOwogICAgZmFUZW1wZXJhdHVyZVF1YXJ0ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGVtcGVyYXR1cmUtcXVhcnRlciIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWyJ0ZW1wZXJhdHVyZS0xIiwgInRoZXJtb21ldGVyLTEiLCAidGhlcm1vbWV0ZXItcXVhcnRlciJdLCAiZjJjYSIsICJNMTYwIDBDMTA3IDAgNjQgNDMgNjQgOTZsMCAxNjQuN0MzNC41IDI4NyAxNiAzMjUuNCAxNiAzNjggMTYgNDQ3LjUgODAuNSA1MTIgMTYwIDUxMnMxNDQtNjQuNSAxNDQtMTQ0YzAtNDIuNi0xOC41LTgxLTQ4LTEwNy4zTDI1NiA5NmMwLTUzLTQzLTk2LTk2LTk2em02NCAzNjhjMCAzNS4zLTI4LjcgNjQtNjQgNjRzLTY0LTI4LjctNjQtNjRjMC0yNi45IDE2LjUtNDkuOSA0MC01OS4zbDAtMjguN2MwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgMjguN2MyMy41IDkuNSA0MCAzMi41IDQwIDU5LjN6Il0KICAgIH07CiAgICBmYVRlbXBlcmF0dXJlMSA9IGZhVGVtcGVyYXR1cmVRdWFydGVyOwogICAgZmFUaGVybW9tZXRlcjEgPSBmYVRlbXBlcmF0dXJlUXVhcnRlcjsKICAgIGZhVGhlcm1vbWV0ZXJRdWFydGVyID0gZmFUZW1wZXJhdHVyZVF1YXJ0ZXI7CiAgICBmYVNsaWRlcnMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2xpZGVycyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJzbGlkZXJzLWgiXSwgImYxZGUiLCAiTTMyIDY0QzE0LjMgNjQgMCA3OC4zIDAgOTZzMTQuMyAzMiAzMiAzMmw4Ni43IDBjMTIuMyAyOC4zIDQwLjUgNDggNzMuMyA0OHM2MS0xOS43IDczLjMtNDhMNDgwIDEyOGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwyNjUuMyA2NEMyNTMgMzUuNyAyMjQuOCAxNiAxOTIgMTZzLTYxIDE5LjctNzMuMyA0OEwzMiA2NHptMCAxNjBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMjQ2LjcgMGMxMi4zIDI4LjMgNDAuNSA0OCA3My4zIDQ4czYxLTE5LjcgNzMuMy00OGw1NC43IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTU0LjcgMGMtMTIuMy0yOC4zLTQwLjUtNDgtNzMuMy00OHMtNjEgMTkuNy03My4zIDQ4TDMyIDIyNHptMCAxNjBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNTQuNyAwYzEyLjMgMjguMyA0MC41IDQ4IDczLjMgNDhzNjEtMTkuNyA3My4zLTQ4TDQ4MCA0NDhjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTI0Ni43IDBjLTEyLjMtMjguMy00MC41LTQ4LTczLjMtNDhzLTYxIDE5LjctNzMuMyA0OEwzMiAzODR6Il0KICAgIH07CiAgICBmYVNsaWRlcnNIID0gZmFTbGlkZXJzOwogICAgZmFNb3NxdWUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibW9zcXVlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4MzMyXSwgImY2NzgiLCAiTTE3NC44IDIyNGwyMjYuNCAwYzQzLjUgMCA3OC44LTM1LjMgNzguOC03OC44IDAtMjUuNS0xMi4zLTQ5LjQtMzMuMS02NC4yTDI5Ny4zLTI1LjRjLTUuNi0zLjktMTMtMy45LTE4LjUgMEwxMjkuMSA4MUMxMDguMyA5NS44IDk2IDExOS43IDk2IDE0NS4yIDk2IDE4OC43IDEzMS4zIDIyNCAxNzQuOCAyMjR6TTUxMiA1MTJjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yMjRjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA0OC00NDggMCAwLTQ4YzAtMTcuNy0xNC4zLTMyLTMyLTMyUzAgMjA2LjMgMCAyMjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsNDQ4IDB6TTI0MCAzODRjMC0yNi41IDIxLjUtNDggNDgtNDhzNDggMjEuNSA0OCA0OGwwIDgwLTk2IDAgMC04MHoiXQogICAgfTsKICAgIGZhSCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTA0XSwgIjQ4IiwgIk0zMjAgMjg4bDAgMTYwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zODRjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAxNjAtMjU2IDAgMC0xNjBjMC0xNy43LTE0LjMtMzItMzItMzJTMCA0Ni4zIDAgNjRMMCA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE2MCAyNTYgMHoiXQogICAgfTsKICAgIGZhSW5mbyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJpbmZvIiwKICAgICAgaWNvbjogWzE5MiwgNTEyLCBbXSwgImYxMjkiLCAiTTQ4IDQ4YTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6TTAgMTkyYzAtMTcuNyAxNC4zLTMyIDMyLTMybDY0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAyNTYgMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA1MTJjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMzIgMCAwLTIyNC0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnoiXQogICAgfTsKICAgIGZhUGVyc29uV2Fsa2luZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24td2Fsa2luZyIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyODY5NCwgIndhbGtpbmciXSwgImY1NTQiLCAiTTE5MiA4MGE1NiA1NiAwIDEgMCAwLTExMiA1NiA1NiAwIDEgMCAwIDExMnpNMTA1LjQgMjI3LjlsMjIuNi0yMi42IDAgNjkuM2MwIDI4IDEyLjIgNTQuNyAzMy41IDcyLjlsNzEuNCA2MS4yYzUuOSA1LjEgOS44IDEyLjEgMTAuOSAxOS44bDEyLjYgODguMWMyLjUgMTcuNSAxOC43IDI5LjcgMzYuMiAyNy4yczI5LjctMTguNyAyNy4yLTM2LjJsLTEyLjYtODguMWMtMy4zLTIzLjEtMTQuOS00NC4xLTMyLjYtNTkuM2wtMzQuNS0yOS42IDAtMTE1LjIgMy44IDQuN2MxOC4yIDIyLjggNDUuOCAzNiA3NSAzNmwzMy4yIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTMzLjIgMGMtOS43IDAtMTguOS00LjQtMjUtMTJsLTE3LjktMjIuNGMtMjMtMjguOC01Ny45LTQ1LjYtOTQuOC00NS42LTMyLjIgMC02My4xIDEyLjgtODUuOCAzNS42TDYwLjEgMTgyLjZDNDIuMSAyMDAuNiAzMiAyMjUgMzIgMjUwLjVMMzIgMjg4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zNy41YzAtOC41IDMuNC0xNi42IDkuNC0yMi42em0xMi40IDE3OS40Yy0xLjUgNS4yLTQuMyAxMC04LjEgMTMuOEw0MS40IDQ4OS40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwbDY4LjMtNjguM2MxMS41LTExLjUgMTkuOS0yNS44IDI0LjQtNDEuNWwyLjItNy42LTQ2LTM5LjRjLTIuNS0yLjItNS00LjQtNy40LTYuOGwtMTAuNCAzNi4yeiJdCiAgICB9OwogICAgZmFXYWxraW5nID0gZmFQZXJzb25XYWxraW5nOwogICAgZmFBcnJvd1R1cm5Eb3duID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXR1cm4tZG93biIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJsZXZlbC1kb3duIl0sICJmMTQ5IiwgIk0zMiA2NEMxNC4zIDY0IDAgNDkuNyAwIDMyUzE0LjMgMCAzMiAwbDk2IDBjNTMgMCA5NiA0MyA5NiA5NmwwIDMwNi43IDczLjQtNzMuNGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zbC0xMjggMTI4Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMGwtMTI4LTEyOGMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMEwxNjAgNDAyLjcgMTYwIDk2YzAtMTcuNy0xNC4zLTMyLTMyLTMyTDMyIDY0eiJdCiAgICB9OwogICAgZmFMZXZlbERvd24gPSBmYUFycm93VHVybkRvd247CiAgICBmYVJvYWQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicm9hZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODczOV0sICJmMDE4IiwgIk0yMjMuOSAzMmwtNzYuMiAwYy0yOS40IDAtNTUuMSAyMC4xLTYyLjEgNDguNkwxLjQgNDIwLjVDLTYuMSA0NTAuNyAxNi44IDQ4MCA0OCA0ODBsMTc1LjkgMCAwLTY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCA2NCAxNzYuMSAwYzMxLjIgMCA1NC4xLTI5LjMgNDYuNi01OS41TDQyNi41IDgwLjZDNDE5LjQgNTIuMSAzOTMuOCAzMiAzNjQuMyAzMmwtNzYuNCAwIDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02NHptNjQgMTkybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02NGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMyeiJdCiAgICB9OwogICAgZmFTcGlyYWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3BpcmFsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU4MGEiLCAiTTExNS41IDcuNGMxMy42LTExLjMgMzMuOC05LjUgNDUuMSA0LjFzOS41IDMzLjgtNC4xIDQ1LjFDMTAwLjIgMTAzLjUgNjQgMTc1LjIgNjQgMjU2IDY0IDM2MiAxNTAgNDQ4IDI1NiA0NDhzMTkyLTg2IDE5Mi0xOTJjMC03NS4xLTYwLjktMTM2LTEzNi0xMzZTMTc2IDE4MC45IDE3NiAyNTZjMCA0NC4yIDM1LjggODAgODAgODBzODAtMzUuOCA4MC04MGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmMwLTQ4LjYgMzkuNC04OCA4OC04OHM4OCAzOS40IDg4IDg4YzAgNzkuNS02NC41IDE0NC0xNDQgMTQ0UzExMiAzMzUuNSAxMTIgMjU2YzAtMTEwLjUgODkuNS0yMDAgMjAwLTIwMHMyMDAgODkuNSAyMDAgMjAwYzAgMTQxLjQtMTE0LjYgMjU2LTI1NiAyNTZTMCAzOTcuNCAwIDI1NkMwIDE1NS44IDQ1IDY2LjEgMTE1LjUgNy40eiJdCiAgICB9OwogICAgZmFGYWNlRnJvd24yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZnJvd24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5Nzg1LCAiZnJvd24iXSwgImYxMTkiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyem05MC42LTExMy45Yy0yMC40LTI4LTUzLjQtNDYuMS05MC42LTQ2LjFzLTcwLjIgMTguMS05MC42IDQ2LjFjLTcuOCAxMC43LTIyLjggMTMuMS0zMy41IDUuM3MtMTMuMS0yMi44LTUuMy0zMy41QzE1NS43IDMzMCAyMDIuOCAzMDQgMjU2IDMwNHMxMDAuMyAyNiAxMjkuNCA2NS45YzcuOCAxMC43IDUuNCAyNS43LTUuMyAzMy41cy0yNS43IDUuNC0zMy41LTUuM3pNMTQ0IDIwOGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0xOTItMzJhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFGcm93bjIgPSBmYUZhY2VGcm93bjI7CiAgICBmYVdpbmVHbGFzc0VtcHR5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIndpbmUtZ2xhc3MtZW1wdHkiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFsid2luZS1nbGFzcy1hbHQiXSwgImY1Y2UiLCAiTTY0IDBDNDguNyAwIDM1LjYgMTAuOCAzMi42IDI1LjdMMy4yIDE3M0MxLjEgMTgzLjUgMCAxOTQuMiAwIDIwNWwwIDNjMCA3Ny40IDU1IDE0MiAxMjggMTU2LjhsMCAxMTUuMi02NCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDE5MiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC02NCAwIDAtMTE1LjJDMjY1IDM1MCAzMjAgMjg1LjQgMzIwIDIwOGwwLTNjMC0xMC43LTEuMS0yMS40LTMuMi0zMkwyODcuNCAyNS43QzI4NC40IDEwLjggMjcxLjMgMCAyNTYgMEw2NCAwem0xLjkgMTg1LjZMOTAuMiA2NCAyMjkuOCA2NCAyNTQuMSAxODUuNmMxLjMgNi40IDEuOSAxMi45IDEuOSAxOS40bDAgM2MwIDUzLTQzIDk2LTk2IDk2cy05Ni00My05Ni05NmwwLTNjMC02LjUgLjYtMTMgMS45LTE5LjR6Il0KICAgIH07CiAgICBmYVdpbmVHbGFzc0FsdCA9IGZhV2luZUdsYXNzRW1wdHk7CiAgICBmYUNsYXBwZXJib2FyZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjbGFwcGVyYm9hcmQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTEzMSIsICJNNDQ4IDY0YzIgMCAzLjkgLjEgNS44IC4zbC05NS43IDk1LjcgNjcuOSAwIDcyLTcyYzguOCAxMSAxNCAyNC45IDE0IDQwbDAgMjU2YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsNzAuMSAwLTk2IDk2IDY3LjkgMCA5NS05NSAxLTEgOTIuMSAwLTk2IDk2IDY3LjkgMCA5NS05NSAxLTEgODYuMSAweiJdCiAgICB9OwogICAgZmFGb3J3YXJkU3RlcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmb3J3YXJkLXN0ZXAiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsic3RlcC1mb3J3YXJkIl0sICJmMDUxIiwgIk0yMSAzNi44YzEyLjktNyAyOC43LTYuMyA0MSAxLjhMMzIwIDIwOC4xIDMyMCA2NGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMzg0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTQ0LjEtMjU4IDE2OS42Yy0xMi4zIDguMS0yOCA4LjgtNDEgMS44UzAgNDU0LjcgMCA0NDBMMCA3MkMwIDU3LjMgOC4xIDQzLjggMjEgMzYuOHoiXQogICAgfTsKICAgIGZhU3RlcEZvcndhcmQgPSBmYUZvcndhcmRTdGVwOwogICAgZmFTcXVhcmVVcFJpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS11cC1yaWdodCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzg1OTksICJleHRlcm5hbC1saW5rLXNxdWFyZS1hbHQiXSwgImYzNjAiLCAiTTM4NCAzMmMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMzIwIDB6TTE2OCAxNjBjLTkuNyAwLTE4LjUgNS44LTIyLjIgMTQuOHMtMS43IDE5LjMgNS4yIDI2LjJsMzUgMzUtNjcgNjdjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45bDI0IDI0YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwbDY3LTY3IDM1IDM1YzYuOSA2LjkgMTcuMiA4LjkgMjYuMiA1LjJTMzIwIDMyMS43IDMyMCAzMTJsMC0xMjhjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTEyOCAweiJdCiAgICB9OwogICAgZmFFeHRlcm5hbExpbmtTcXVhcmVBbHQgPSBmYVNxdWFyZVVwUmlnaHQ7CiAgICBmYUJvb2tKb3VybmFsV2hpbGxzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvb2stam91cm5hbC13aGlsbHMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiam91cm5hbC13aGlsbHMiXSwgImY2NmEiLCAiTTk2IDUxMmwzMjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwwLTY2LjdjMTguNi02LjYgMzItMjQuNCAzMi00NS4zbDAtMjg4YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4TDk2IDBDNDMgMCAwIDQzIDAgOTZMMCA0MTZjMCA1MyA0MyA5NiA5NiA5NnpNNjQgNDE2YzAtMTcuNyAxNC4zLTMyIDMyLTMybDI1NiAwIDAgNjQtMjU2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyek0yNzQuMSA5OS4yYzIuNi0yLjYgNi43LTMuMSA5LjktMS4xIDMyLjEgMjAgNTMuNCA1NS42IDUzLjQgOTYuMiAwIDYyLjYtNTAuNyAxMTMuMy0xMTMuMyAxMTMuM1MxMTAuNyAyNTYuOSAxMTAuNyAxOTQuM2MwLTQwLjYgMjEuNC03Ni4yIDUzLjQtOTYuMiAzLjEtMiA3LjItMS41IDkuOSAxLjFzMy4xIDYuNyAxLjIgOS44Yy01LjIgOC42LTguMiAxOC43LTguMiAyOS41IDAgMTUuMSA1LjkgMjguOCAxNS41IDM5LjEgMi41IDIuNyAyLjkgNi43IC45IDkuNy00LjcgNy40LTcuNCAxNi4xLTcuNCAyNS41IDAgMjEuNiAxNC4zIDM5LjkgMzQgNDUuOWwxLTI0LjhjLTcuMS00LjQtMTEuOC0xMi4yLTExLjgtMjEuMSAwLTkuNiA1LjUtMTggMTMuNS0yMi4xbDMuMy04MS44Yy4yLTQuMyAzLjctNy43IDgtNy43czcuOCAzLjQgOCA3LjdsMy4zIDgxLjhjOCA0LjEgMTMuNSAxMi40IDEzLjUgMjIuMSAwIDguOS00LjcgMTYuNy0xMS44IDIxLjFsMSAyNC44YzE5LjYtNiAzMy45LTI0LjEgMzQtNDUuNmwwLS42Yy0uMS05LjMtMi43LTE3LjktNy40LTI1LjItMS45LTMuMS0xLjYtNy4xIC45LTkuNyA5LjYtMTAuMiAxNS41LTIzLjkgMTUuNS0zOS4xIDAtMTAuOC0zLTIwLjktOC4yLTI5LjUtMS45LTMuMi0xLjQtNy4yIDEuMi05Ljh6Il0KICAgIH07CiAgICBmYUpvdXJuYWxXaGlsbHMgPSBmYUJvb2tKb3VybmFsV2hpbGxzOwogICAgZmFDaGFtcGFnbmVHbGFzc2VzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoYW1wYWduZS1nbGFzc2VzIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbMTI5MzQ2LCAiZ2xhc3MtY2hlZXJzIl0sICJmNzlmIiwgIk0xNTUuNiAxNy4zQzE2MyAzIDE3OS45LTMuNiAxOTUgMS45bDEyNSA0NS42IDEyNS00NS42YzE1LjEtNS41IDMyIDEuMSAzOS40IDE1LjRsNzguOCAxNTIuOWMyOC44IDU1LjggMTAuMyAxMjIuMy0zOC41IDE1Ni42bDMxLjMgODYuMiA0MS0xNWMxNi42LTYgMzUgMi41IDQxIDE5LjFzLTIuNSAzNS0xOS4xIDQxYy00Ny40IDE3LjMtOTQuOCAzNC41LTE0Mi4yIDUxLjgtMTYuNiA2LjEtMzUtMi41LTQxLTE5LjFzMi41LTM1IDE5LjEtNDFsNDEtMTUtMzEuMy04Ni4yYy01OS40IDUuMi0xMTYuMi0zMy45LTEzMC05NS4ybC0xNC42LTY0LjctMTQuNiA2NC43Yy0xMy44IDYxLjMtNzAuNiAxMDAuNC0xMzAgOTUuMmwtMzEuMyA4Ni4yIDQxIDE1YzE2LjYgNi4xIDI1LjIgMjQuNCAxOS4xIDQxcy0yNC40IDI1LjItNDEgMTkuMWMtNDcuNC0xNy4zLTk0LjgtMzQuNi0xNDIuMi01MS44LTE2LjYtNi4xLTI1LjItMjQuNC0xOS4xLTQxUzI2LjMgMzkyIDQyLjkgMzk4bDQxIDE1IDMxLjMtODYuMkM2Ni41IDI5Mi41IDQ4LjEgMjI2IDc2LjkgMTcwLjJMMTU1LjYgMTcuM3ptNDQgNTQuNGwtMjcuMiA1Mi44IDg5LjIgMzIuNSAxMy4xLTU3LjktNzUuMS0yNy40em0yNDAuOSAwbC03NS4xIDI3LjQgMTMuMSA1Ny45IDg5LjItMzIuNS0yNy4yLTUyLjh6Il0KICAgIH07CiAgICBmYUdsYXNzQ2hlZXJzID0gZmFDaGFtcGFnbmVHbGFzc2VzOwogICAgZmFEdW1wc3RlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkdW1wc3RlciIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNzkzIiwgIk0xMzIuMyA2NEwxMDYuNyAxOTIgMjQgMTkyYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTQuMWMwLTIuNiAuNC01LjEgMS4yLTcuNkwyNi41IDgwLjRDMjkuOCA3MC42IDM5IDY0IDQ5LjMgNjRsODMgMHptMjMuNCAxMjhsMjUuNi0xMjggODIuNyAwIDAgMTI4LTEwOC4zIDB6TTMxMiA2NGw4Mi43IDAgMjUuNiAxMjgtMTA4LjMgMCAwLTEyOHptMTMxLjcgMGw4MyAwYzEwLjMgMCAxOS41IDYuNiAyMi44IDE2LjRsMjUuMyA3NS45Yy44IDIuNCAxLjIgNSAxLjIgNy42bDAgNC4xYzAgMTMuMy0xMC43IDI0LTI0IDI0bC04Mi43IDAtMjUuNi0xMjh6TTI1LjcgMjQwbDUyNC43IDBjLS40IDIuMS0xMy4zIDczLjQtMzguOSAyMTMuNy0zIDE2LjMtMTcuOSAyNy42LTM0LjQgMjYuMVM0NDggNDY0LjYgNDQ4IDQ0OGwwLTE2LTMyMCAwIDAgMTZjMCAxNi42LTEyLjYgMzAuNC0yOS4xIDMxLjlTNjcuNSA0NzAgNjQuNSA0NTMuN0MzOSAzMTMuMyAyNiAyNDIuMSAyNS43IDI0MHoiXQogICAgfTsKICAgIGZhSGVhcnRDaXJjbGVYbWFyayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoZWFydC1jaXJjbGUteG1hcmsiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUwMSIsICJNMjQxIDg3LjFsMTUgMjAuNyAxNS0yMC43QzI5NiA1Mi41IDMzNi4yIDMyIDM3OC45IDMyIDQ1Mi40IDMyIDUxMiA5MS42IDUxMiAxNjUuMWwwIDIuNmMwIDE3LjYtMy40IDM1LjYtOS41IDUzLjctMjEuOC04LjYtNDUuNi0xMy40LTcwLjUtMTMuNC0xMDYgMC0xOTIgODYtMTkyIDE5MiAwIDI4LjUgNi4yIDU1LjYgMTcuNCA4MC0uNSAwLS45IDAtMS40IDAtMTUuNSAwLTMwLjgtNC42LTQzLjEtMTQuMS03My01NS43LTIxMi45LTE4Ni0yMTIuOS0yOTguMmwwLTIuNkMwIDkxLjYgNTkuNiAzMiAxMzMuMSAzMiAxNzUuOCAzMiAyMTYgNTIuNSAyNDEgODcuMXpNNDMyIDI1NmExNDQgMTQ0IDAgMSAxIDAgMjg4IDE0NCAxNDQgMCAxIDEgMC0yODh6bTU5LjMgMTA3LjNjNi4yLTYuMiA2LjItMTYuNCAwLTIyLjZzLTE2LjQtNi4yLTIyLjYgMGwtMzYuNyAzNi43LTM2LjctMzYuN2MtNi4yLTYuMi0xNi40LTYuMi0yMi42IDBzLTYuMiAxNi40IDAgMjIuNmwzNi43IDM2LjctMzYuNyAzNi43Yy02LjIgNi4yLTYuMiAxNi40IDAgMjIuNnMxNi40IDYuMiAyMi42IDBsMzYuNy0zNi43IDM2LjcgMzYuN2M2LjIgNi4yIDE2LjQgNi4yIDIyLjYgMHM2LjItMTYuNCAwLTIyLjZsLTM2LjctMzYuNyAzNi43LTM2Ljd6Il0KICAgIH07CiAgICBmYUNvbXB1dGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvbXB1dGVyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU0ZTUiLCAiTTM0OC44IDMyQzM0MC43IDQ2LjEgMzM2IDYyLjUgMzM2IDgwbDAgMTYtMjcyIDAgMCAyMjQgMjcyIDAgMCA2NC0yNzIgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwyODQuOCAwek0zMzYgNDMyYzAgMTcuNSA0LjcgMzMuOSAxMi44IDQ4TDEyMCA0ODBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMjE2IDB6TTQzMiAzMmw5NiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMzUyYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC05NiAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTM1MmMwLTI2LjUgMjEuNS00OCA0OC00OHptMjQgNjRjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNDggMHptMCA5NmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw0OCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC00OCAwem01NiAxNDRhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHoiXQogICAgfTsKICAgIGZhV2FuZE1hZ2ljID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIndhbmQtbWFnaWMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsibWFnaWMiXSwgImYwZDAiLCAiTTM5OC41IDEyLjJsLTg4LjIgODguMiAxMDEuMyAxMDEuMyA4OC4yLTg4LjJDNTA3LjYgMTA1LjYgNTEyIDk1IDUxMiA4NHMtNC40LTIxLjYtMTIuMi0yOS41TDQ1Ny41IDEyLjJDNDQ5LjYgNC40IDQzOSAwIDQyOCAwcy0yMS42IDQuNC0yOS41IDEyLjJ6TTI3Ni40IDEzNC4zTDEyLjIgMzk4LjVDNC40IDQwNi40IDAgNDE3IDAgNDI4czQuNCAyMS42IDEyLjIgMjkuNWw0Mi4zIDQyLjNDNjIuNCA1MDcuNiA3MyA1MTIgODQgNTEyczIxLjYtNC40IDI5LjUtMTIuMkwzNzcuNyAyMzUuNiAyNzYuNCAxMzQuM3oiXQogICAgfTsKICAgIGZhTWFnaWMgPSBmYVdhbmRNYWdpYzsKICAgIGZhQnJhaW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnJhaW4iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjk1MDRdLCAiZjVkYyIsICJNMTIwIDU2YzAtMzAuOSAyNS4xLTU2IDU2LTU2bDI0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA0NDhjMCAxNy43LTE0LjMgMzItMzIgMzJsLTMyIDBjLTI5LjggMC01NC45LTIwLjQtNjItNDgtLjcgMC0xLjMgMC0yIDAtNDQuMiAwLTgwLTM1LjgtODAtODAgMC0xOCA2LTM0LjYgMTYtNDgtMTkuNC0xNC42LTMyLTM3LjgtMzItNjQgMC0zMC45IDE3LjYtNTcuOCA0My4yLTcxLjEtNy4xLTEyLTExLjItMjYtMTEuMi00MC45IDAtNDQuMiAzNS44LTgwIDgwLTgwbDAtMjR6bTI3MiAwbDAgMjRjNDQuMiAwIDgwIDM1LjggODAgODAgMCAxNS00LjEgMjktMTEuMiA0MC45IDI1LjcgMTMuMyA0My4yIDQwLjEgNDMuMiA3MS4xIDAgMjYuMi0xMi42IDQ5LjQtMzIgNjQgMTAgMTMuNCAxNiAzMCAxNiA0OCAwIDQ0LjItMzUuOCA4MC04MCA4MC0uNyAwLTEuMyAwLTIgMC03LjEgMjcuNi0zMi4yIDQ4LTYyIDQ4bC0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTQ0OGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwyNCAwYzMwLjkgMCA1NiAyNS4xIDU2IDU2eiJdCiAgICB9OwogICAgZmFCcmllZmNhc2VNZWRpY2FsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJyaWVmY2FzZS1tZWRpY2FsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0NjkiLCAiTTIwMCA0OGwxMTIgMGM0LjQgMCA4IDMuNiA4IDhsMCA0MC0xMjggMCAwLTQwYzAtNC40IDMuNi04IDgtOHptLTU2IDhsMCA0MC04MCAwQzI4LjcgOTYgMCAxMjQuNyAwIDE2MEwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzODQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI1NmMwLTM1LjMtMjguNy02NC02NC02NGwtODAgMCAwLTQwYzAtMzAuOS0yNS4xLTU2LTU2LTU2TDIwMCAwYy0zMC45IDAtNTYgMjUuMS01NiA1NnptODAgMTYwYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDQwIDQwIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC00MCAwIDAgNDBjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC00MC00MCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsNDAgMCAwLTQweiJdCiAgICB9OwogICAgZmFIb3VzZU1lZGljYWxDaXJjbGVFeGNsYW1hdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VzZS1tZWRpY2FsLWNpcmNsZS1leGNsYW1hdGlvbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTEyIiwgIk0zMDkuOCA4LjZjLTEyLjMtMTEuNC0zMS4zLTExLjQtNDMuNSAwbC0yMjQgMjA4Yy05LjYgOS0xMi44IDIyLjktOCAzNS4xUzUwLjggMjcyIDY0IDI3MmwxNiAwIDAgMTc2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE5NiAwYy0yMS4yLTI5LjUtMzQuMy02NS4zLTM1LjktMTA0TDI3MiA0MDhjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTQwLTQwIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmw0MCAwIDAtNDBjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgNDAgMjAgMGMzNC45LTQ4LjUgOTEuNy04MCAxNTYtODAgMTAuNyAwIDIxLjEgLjkgMzEuMyAyLjVMMzA5LjggOC42ek00OTYgNTQ0YTE0NCAxNDQgMCAxIDAgMC0yODggMTQ0IDE0NCAwIDEgMCAwIDI4OHptMC0xMDBhMjAgMjAgMCAxIDEgMCA0MCAyMCAyMCAwIDEgMSAwLTQwem0wLTE0MGM4LjggMCAxNiA3LjIgMTYgMTZsMCA4MGMwIDguOC03LjIgMTYtMTYgMTZzLTE2LTcuMi0xNi0xNmwwLTgwYzAtOC44IDcuMi0xNiAxNi0xNnoiXQogICAgfTsKICAgIGZhQ29kZUNvbW1pdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjb2RlLWNvbW1pdCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMzg2IiwgIk0yODggMzM2YTgwIDgwIDAgMSAwIDAtMTYwIDgwIDgwIDAgMSAwIDAgMTYwem0xNTYuOC00OEM0MzAgMzYxIDM2NS40IDQxNiAyODggNDE2UzE0NiAzNjEgMTMxLjIgMjg4TDMyIDI4OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw5OS4yIDBDMTQ2IDE1MSAyMTAuNiA5NiAyODggOTZzMTQyIDU1IDE1Ni44IDEyOGw5OS4yIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTk5LjIgMHoiXQogICAgfTsKICAgIGZhUGVyc29uQnJlYXN0ZmVlZGluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tYnJlYXN0ZmVlZGluZyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNTNhIiwgIk0yMjQgMGE4MCA4MCAwIDEgMSAwIDE2MCA4MCA4MCAwIDEgMSAwLTE2MHpNNDM2LjggMzgyLjhMMzczLjUgNDYyYy0xNi42IDIwLjctNDYuOCAyNC4xLTY3LjUgNy41LTE3LjYtMTQuMS0yMi43LTM4LjEtMTMuNS01Ny43bC0uNy0uMWMtMzguOS01LjYtNzQuMy0yNS4xLTk5LjctNTQuOGwwLTM2LjhjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA0OGMwIC44IDAgMS42IC4xIDIuNGwxMDEuNCA1MC43YzIzLjcgMTEuOSAzMy4zIDQwLjcgMjEuNSA2NC40cy00MC43IDMzLjMtNjQuNCAyMS41TDI3LjIgNDI3LjNjLTEuMS0uNS0yLjItMS4xLTMuMy0xLjctNC45LTIuOC05LjItNi40LTEyLjYtMTAuNi00LjYtNS40LTcuOC0xMS43LTkuNi0xOC40LTMuMy0xMi0xLjktMjUuMiA0LjgtMzYuNiAuNi0xLjEgMS4zLTIuMiAyLTMuMkw3NS42IDI1Ni4xYzI2LjctNDAuMSA3MS43LTY0LjEgMTE5LjgtNjQuMWw3NS4yIDBjNDYuNSAwIDkwLjEgMjIuNSAxMTcuMiA2MC4zbDUwLjcgNzAuOWMyLjIgMyA0IDYuMSA1LjUgOS40IDIuOSA2LjcgNC4zIDEzLjggNCAyMC44LS4zIDEwLjYtNC4yIDIxLTExLjIgMjkuNHpNMzIwIDMzMmE0NCA0NCAwIDEgMCAtODggMCA0NCA0NCAwIDEgMCA4OCAweiJdCiAgICB9OwogICAgZmFQZXJzb25SYXlzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1yYXlzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1NGQiLCAiTTMxMi41IDI0YTU2IDU2IDAgMSAwIC0xMTIgMCA1NiA1NiAwIDEgMCAxMTIgMHptMjQgMjEyLjdsNDYuMyA2Mi40YzEwLjUgMTQuMiAzMC42IDE3LjIgNDQuOCA2LjZzMTcuMi0zMC42IDYuNi00NC44bC03MC41LTk1QzMzOC41IDEzMiAyOTguOCAxMTIgMjU2LjUgMTEycy04MiAyMC0xMDcuMiA1My45bC03MC41IDk1Yy0xMC41IDE0LjItNy42IDM0LjIgNi42IDQ0LjhzMzQuMiA3LjYgNDQuOC02LjZsNDYuMy02Mi40IDAgMjc1LjNjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE2MGMwLTguOCA3LjItMTYgMTYtMTZzMTYgNy4yIDE2IDE2bDAgMTYwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yNzUuM3pNNy41IDdjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45bDgwIDgwYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOUw0MS41IDdDMzIuMS0yLjMgMTYuOS0yLjMgNy41IDd6bTQ2NCAwbC04MCA4MGMtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDgwLTgwYzkuNC05LjQgOS40LTI0LjYgMC0zMy45cy0yNC42LTkuNC0zMy45IDB6TTcuNSA1MDVjOS40IDkuNCAyNC42IDkuNCAzMy45IDBsODAtODBjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMGwtODAgODBjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45em00NjQgMGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTgwLTgwYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDgwIDgweiJdCiAgICB9OwogICAgZmFNYW5hdFNpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFuYXQtc2lnbiIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlMWQ1IiwgIk0xOTIgMzJjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgNDEuNUM3My4zIDEwOS4zIDAgMTkwLjEgMCAyODhMMCA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE2MGMwLTYyLjUgNDQuOC0xMTQuNSAxMDQtMTI1LjhMMTY4IDQ1NmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMjkzLjhjNTkuMiAxMS4yIDEwNCA2My4zIDEwNCAxMjUuOGwwIDE2MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTYwYzAtOTcuOS03My4zLTE3OC43LTE2OC0xOTAuNUwyMTYgNTZjMC0xMy4zLTEwLjctMjQtMjQtMjR6Il0KICAgIH07CiAgICBmYVNvcnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic29ydCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJ1bnNvcnRlZCJdLCAiZjBkYyIsICJNMi40IDIwNC4yYzUgMTIgMTYuNiAxOS44IDI5LjYgMTkuOGwzMjAgMGMxMi45IDAgMjQuNi03LjggMjkuNi0xOS44czIuMi0yNS43LTYuOS0zNC45bC0xNjAtMTYwYy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMGwtMTYwIDE2MGMtOS4yIDkuMi0xMS45IDIyLjktNi45IDM0Ljl6bTAgMTAzLjVjLTUgMTItMi4yIDI1LjcgNi45IDM0LjlsMTYwIDE2MGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGwxNjAtMTYwYzkuMi05LjIgMTEuOS0yMi45IDYuOS0zNC45UzM2NC45IDI4OCAzNTIgMjg4TDMyIDI4OGMtMTIuOSAwLTI0LjYgNy44LTI5LjYgMTkuOHoiXQogICAgfTsKICAgIGZhVW5zb3J0ZWQgPSBmYVNvcnQ7CiAgICBmYUNpcmNsZVJhZGlhdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtcmFkaWF0aW9uIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTc2MiwgInJhZGlhdGlvbi1hbHQiXSwgImY3YmEiLCAiTTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTgwIDBsNjQuMyAwYzguNyAwIDE1LjctNy4xIDE3LjMtMTUuNiA0LjQtMjQuNCAxOC4xLTQ1LjUgMzcuMi01OS43IDcuNC01LjUgMTAuNi0xNS42IDYtMjMuNmwtMzIuNS01Ni4zYy00LjMtNy41LTEzLjktMTAuMy0yMS4yLTUuNS00OC4yIDMxLjUtODEuMyA4NC4yLTg2LjMgMTQ0LjgtLjcgOC44IDYuNSAxNiAxNS4zIDE2em0xMzcuOSA4OS44Yy04LjUtMy43LTE4LjgtMS40LTIzLjUgNi42bC0zMSA1My44Yy00LjMgNy41LTEuOSAxNy4yIDUuOCAyMS4xIDI2LjEgMTMuMiA1NS41IDIwLjcgODYuOCAyMC43czYwLjctNy41IDg2LjgtMjAuN2M3LjctMy45IDEwLjEtMTMuNiA1LjgtMjEuMWwtMzEtNTMuOGMtNC42LTgtMTUtMTAuMy0yMy41LTYuNi0xMS43IDUtMjQuNSA3LjgtMzguMSA3LjhzLTI2LjQtMi44LTM4LjEtNy44ek0zNTAuNCAyNDAuNGMxLjYgOC42IDguNSAxNS42IDE3LjMgMTUuNmw2NC4zIDBjOC44IDAgMTYuMS03LjIgMTUuMy0xNi01LTYwLjYtMzguMS0xMTMuMi04Ni4zLTE0NC44LTcuMy00LjgtMTYuOC0yLTIxLjIgNS41TDMwNy4zIDE1N2MtNC42IDgtMS40IDE4LjEgNiAyMy42IDE5LjEgMTQuMiAzMi43IDM1LjQgMzcuMiA1OS43ek0yNTYgMzA1LjdhNDggNDggMCAxIDAgMC05NiA0OCA0OCAwIDEgMCAwIDk2eiJdCiAgICB9OwogICAgZmFSYWRpYXRpb25BbHQgPSBmYUNpcmNsZVJhZGlhdGlvbjsKICAgIGZhTGFwdG9wQ29kZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsYXB0b3AtY29kZSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNWZjIiwgIk02NCA5NmMwLTM1LjMgMjguNy02NCA2NC02NGwzODQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI0MC02NCAwIDAtMjQwLTM4NCAwIDAgMjQwLTY0IDAgMC0yNDB6TTAgNDAzLjJDMCAzOTIuNiA4LjYgMzg0IDE5LjIgMzg0bDYwMS42IDBjMTAuNiAwIDE5LjIgOC42IDE5LjIgMTkuMiAwIDQyLjQtMzQuNCA3Ni44LTc2LjggNzYuOEw3Ni44IDQ4MEMzNC40IDQ4MCAwIDQ0NS42IDAgNDAzLjJ6TTI4MSAyMDlsLTMxIDMxIDMxIDMxYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTQ4LTQ4Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOWw0OC00OGM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjl6TTM5MyAxNzVsNDggNDhjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlsLTQ4IDQ4Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45bDMxLTMxLTMxLTMxYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDB6Il0KICAgIH07CiAgICBmYVNpbmsgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2luayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMDZkIiwgIk0yODggOTZjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMiAxNC4zIDMyIDMyIDMyIDMyLTE0LjMgMzItMzJjMC01My00My05Ni05Ni05NnMtOTYgNDMtOTYgOTZsMCAxOTItNjQgMCAwLTQwYzAtMzAuOS0yNS4xLTU2LTU2LTU2bC00OCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDQ4IDBjNC40IDAgOCAzLjYgOCA4bDAgNDAtODAgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwwIDY0YzAgNTMgNDMgOTYgOTYgOTZsMjU2IDBjNTMgMCA5Ni00MyA5Ni05NmwwLTY0YzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC04MCAwIDAtNDBjMC00LjQgMy42LTggOC04bDU2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTU2IDBjLTMwLjkgMC01NiAyNS4xLTU2IDU2bDAgNDAtNjQgMCAwLTE5MnoiXQogICAgfTsKICAgIGZhQXJyb3dVcEZyb21XYXRlclB1bXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctdXAtZnJvbS13YXRlci1wdW1wIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU0YjYiLCAiTTE0NCAzMmMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCAxNzYtMTYgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCA3OS42YzE3LjYtMiAzNiAyLjUgNTEuMyAxNCAzLjQgMi42IDYuMSAxLjQgOS44LS4zbC44LS40YzUuNy0yLjYgMTIuOS02LjkgMjEuNy0xMy41IDI3LjUtMjAuNyA1OS45LTMxLjIgOTIuMy0zMS40IDMzLjEtLjIgNjYuMyAxMC4yIDk0LjQgMzEuNCAyMi4xIDE2LjYgMjkuMSAxNi42IDUxLjIgMCAyNy41LTIwLjcgNTkuOS0zMS4yIDkyLjQtMzEuNCAzMy4xLS4yIDY2LjMgMTAuMiA5NC40IDMxLjQgNi45IDUuMiAxMi44IDkgMTggMTEuNyAuNiAuMyAxLjIgLjYgMS44IDEgNC4yIDIuMyA4LjUgNC42IDEyLjYgMS41IDEwLjctOC4xIDIyLjktMTIuNyAzNS4zLTE0LjFsMC03OS41YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC01NiAwIDAtMTQyLjEgNDcgNDdjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45TDQ5NyAzOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBsLTg4IDg4Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBsNDctNDcgMCAxNDIuMS0xMzYgMCAwLTE3NmMwLTI2LjUtMjEuNS00OC00OC00OEwxNDQgMzJ6TTQ3NC42IDQ3Ni4xYzE5IDE0LjQgNDEuOSAyOC4yIDY3LjIgMzMuMyAyNi41IDUuNCA1NC4zIC44IDgwLjctMTkuMSAxMC42LTggMTIuNy0yMyA0LjctMzMuNnMtMjMtMTIuNy0zMy42LTQuN2MtMTQuOSAxMS4yLTI4LjYgMTMuMS00Mi4zIDEwLjMtMTQuOS0zLTMwLjktMTEuOS00Ny44LTI0LjYtMzguNC0yOS05MC41LTI5LTEyOSAwLTI0IDE4LjEtNDAuNyAyNi4zLTU0LjUgMjYuM3MtMzAuNS04LjItNTQuNS0yNi4zYy0zOC40LTI5LTkwLjUtMjktMTI5IDAtMjEuNiAxNi4zLTQxLjMgMjUuOC01OC45IDI1LjctOS42LS4xLTE5LjktMy0zMS4yLTExLjUtMTAuNi04LTI1LjYtNS45LTMzLjYgNC43UzcgNDgyLjMgMTcuNiA0OTAuM2MxOS4xIDE0LjQgMzkuNCAyMSA1OS44IDIxLjEgMzMuOSAuMiA2NC4zLTE3LjQgODguMS0zNS4zIDIxLjMtMTYuMSA0OS45LTE2LjEgNzEuMiAwIDI0LjIgMTguMyA1Mi4zIDM1LjkgODMuNCAzNS45czU5LjEtMTcuNyA4My40LTM1LjljMjEuMy0xNi4xIDQ5LjktMTYuMSA3MS4yIDB6Il0KICAgIH07CiAgICBmYU1pY3JvcGhvbmVMaW5lc1NsYXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1pY3JvcGhvbmUtbGluZXMtc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsibWljcm9waG9uZS1hbHQtc2xhc2giXSwgImY1MzkiLCAiTTctMjQuOWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMGwxNTEgMTUxIDAtMzAuMmMwLTUzIDQzLTk2IDk2LTk2IDUwLjMgMCA5MS42IDM4LjcgOTUuNyA4OEwzMjggODhjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNTYgMCAwIDQ4LTU2IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNTUuNyAwYy0xLjkgMjIuOS0xMS44IDQzLjQtMjYuOSA1OWwzMy45IDMzLjljMjUuNS0yNiA0MS4zLTYxLjYgNDEuMy0xMDAuOWwwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA0MGMwIDUyLjYtMjEuMSAxMDAuMi01NS4zIDEzNC44TDU2OSA1MDMuMWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwTDcgOS4xQy0yLjMtLjMtMi4zLTE1LjUgNy0yNC45ek0yOTcuOCAzNjcuN2w0MS40IDQxLjRjLTguOCAyLjQtMTcuOSA0LjMtMjcuMyA1LjRsMCA0OS41IDQ4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE0NCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDQ4IDAgMC00OS41QzE2OS4zIDQwMi43IDk2IDMyMS45IDk2IDIyNGwwLTQwYzAtNS4xIDEuNi05LjkgNC40LTEzLjhsNDMuNiA0My42IDAgMTAuMmMwIDc5LjUgNjQuNSAxNDQgMTQ0IDE0NCAzLjMgMCA2LjYtLjEgOS44LS4zeiJdCiAgICB9OwogICAgZmFNaWNyb3Bob25lQWx0U2xhc2ggPSBmYU1pY3JvcGhvbmVMaW5lc1NsYXNoOwogICAgZmFTZXJ2ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2VydmVyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyMzMiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZsMCA2NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTY0YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyem0yMTYgNzJhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4em01NiAyNGEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwek02NCAyODhjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgNjRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC02NGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAyODh6bTIxNiA3MmEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6bTU2IDI0YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6Il0KICAgIH07CiAgICBmYVVzZXIyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXIiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjgxMDAsIDYyMTQ0LCA2MjQ3MCwgInVzZXItYWx0IiwgInVzZXItbGFyZ2UiXSwgImYwMDciLCAiTTIyNCAyNDhhMTIwIDEyMCAwIDEgMCAwLTI0MCAxMjAgMTIwIDAgMSAwIDAgMjQwem0tMjkuNyA1NkM5NS44IDMwNCAxNiAzODMuOCAxNiA0ODIuMyAxNiA0OTguNyAyOS4zIDUxMiA0NS43IDUxMmwzNTYuNiAwYzE2LjQgMCAyOS43LTEzLjMgMjkuNy0yOS43IDAtOTguNS03OS44LTE3OC4zLTE3OC4zLTE3OC4zbC01OS40IDB6Il0KICAgIH07CiAgICBmYVVzZXJBbHQyID0gZmFVc2VyMjsKICAgIGZhVXNlckxhcmdlMiA9IGZhVXNlcjI7CiAgICBmYVNub3dmbGFrZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic25vd2ZsYWtlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTAwNTIsIDEwMDU0XSwgImYyZGMiLCAiTTI4OC4yIDBjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA2Mi4xLTE1LTE1Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDQ5IDQ5IDAgNzAuNi02MS4yLTM1LjMtMTcuOS02Ni45Yy0zLjQtMTIuOC0xNi42LTIwLjQtMjkuNC0xN1M5NS4zIDk4IDk4LjcgMTEwLjhsNS41IDIwLjUtNTMuNy0zMUMzNS4yIDkxLjUgMTUuNiA5Ni43IDYuOCAxMTJzLTMuNiAzNC45IDExLjcgNDMuN2w1My43IDMxLTIwLjUgNS41Yy0xMi44IDMuNC0yMC40IDE2LjYtMTcgMjkuNHMxNi42IDIwLjQgMjkuNCAxN2w2Ni45LTE3LjkgNjEuMiAzNS4zLTYxLjIgMzUuMy02Ni45LTE3LjljLTEyLjgtMy40LTI2IDQuMi0yOS40IDE3czQuMiAyNiAxNyAyOS40bDIwLjUgNS41LTUzLjcgMzFDMy4yIDM2NS4xLTIgMzg0LjcgNi44IDQwMHMyOC40IDIwLjYgNDMuNyAxMS43bDUzLjctMzEtNS41IDIwLjVjLTMuNCAxMi44IDQuMiAyNiAxNyAyOS40czI2LTQuMiAyOS40LTE3bDE3LjktNjYuOSA2MS4yLTM1LjMgMCA3MC42LTQ5IDQ5Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBsMTUtMTUgMCA2Mi4xYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC02Mi4xIDE1IDE1YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNDktNDkgMC03MC42IDYxLjIgMzUuMyAxNy45IDY2LjljMy40IDEyLjggMTYuNiAyMC40IDI5LjQgMTdzMjAuNC0xNi42IDE3LTI5LjRsLTUuNS0yMC41IDUzLjcgMzFjMTUuMyA4LjggMzQuOSAzLjYgNDMuNy0xMS43czMuNi0zNC45LTExLjctNDMuN2wtNTMuNy0zMSAyMC41LTUuNWMxMi44LTMuNCAyMC40LTE2LjYgMTctMjkuNHMtMTYuNi0yMC40LTI5LjQtMTdsLTY2LjkgMTcuOS02MS4yLTM1LjMgNjEuMi0zNS4zIDY2LjkgMTcuOWMxMi44IDMuNCAyNi00LjIgMjkuNC0xN3MtNC4yLTI2LTE3LTI5LjRsLTIwLjUtNS41IDUzLjctMzFjMTUuMy04LjggMjAuNi0yOC40IDExLjctNDMuN3MtMjguNC0yMC41LTQzLjctMTEuN2wtNTMuNyAzMSA1LjUtMjAuNWMzLjQtMTIuOC00LjItMjYtMTctMjkuNHMtMjYgNC4yLTI5LjQgMTdsLTE3LjkgNjYuOS02MS4yIDM1LjMgMC03MC42IDQ5LTQ5YzkuNC05LjQgOS40LTI0LjYgMC0zMy45cy0yNC42LTkuNC0zMy45IDBsLTE1IDE1IDAtNjIuMXoiXQogICAgfTsKICAgIGZhVGF1cnVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRhdXJ1cyIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlODRmIiwgIk0zMzYtMTZjMTcuNyAwIDMyIDE0LjMgMzIgMzIgMCA1OC41LTI4LjYgMTEwLjMtNzIuNSAxNDIuMyA1My4yIDM0LjEgODguNSA5My44IDg4LjUgMTYxLjcgMCAxMDYtODYgMTkyLTE5MiAxOTJTMCA0MjYgMCAzMjBDMCAyNTIuMSAzNS4zIDE5Mi40IDg4LjUgMTU4LjMgNDQuNiAxMjYuMyAxNiA3NC41IDE2IDE2IDE2LTEuNyAzMC4zLTE2IDQ4LTE2UzgwLTEuNyA4MCAxNmMwIDYxLjkgNTAuMSAxMTIgMTEyIDExMlMzMDQgNzcuOSAzMDQgMTZjMC0xNy43IDE0LjMtMzIgMzItMzJ6TTE5MiAxOTJhMTI4IDEyOCAwIDEgMCAwIDI1NiAxMjggMTI4IDAgMSAwIDAtMjU2eiJdCiAgICB9OwogICAgZmFTa3VsbENyb3NzYm9uZXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2t1bGwtY3Jvc3Nib25lcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyODM2OSwgOTc2MF0sICJmNzE0IiwgIk0zODQgMTQ0QzM4NCA2NC41IDMxMi40IDAgMjI0IDBTNjQgNjQuNSA2NCAxNDRjMCA0Ny4xIDI1LjEgODguOSA2NCAxMTUuMmwwIDI4LjhjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTI4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0yOC44YzM4LjktMjYuMyA2NC02OC4xIDY0LTExNS4yek0xNjAgMTI4YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHptOTYgMzJhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHpNNDQ1LjUgMzM5LjdjLTYuOC0xNi4zLTI1LjUtMjQtNDEuOC0xNy4yTDIyNCAzOTcuMyA0NC4zIDMyMi41Yy0xNi4zLTYuOC0zNSAuOS00MS44IDE3LjJzLjkgMzUgMTcuMiA0MS44TDE0MC44IDQzMiAxOS43IDQ4Mi41QzMuNCA0ODkuMy00LjMgNTA4IDIuNSA1MjQuM3MyNS41IDI0IDQxLjggMTcuMkwyMjQgNDY2LjcgNDAzLjcgNTQxLjVjMTYuMyA2LjggMzUtLjkgNDEuOC0xNy4ycy0uOS0zNS0xNy4yLTQxLjhMMzA3LjIgNDMyIDQyOC4zIDM4MS41YzE2LjMtNi44IDI0LTI1LjUgMTcuMi00MS44eiJdCiAgICB9OwogICAgZmFQZXNvU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXNvLXNpZ24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTIyMiIsICJNMTEyIDMyQzk0LjMgMzIgODAgNDYuMyA4MCA2NGwwIDY0LTI0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMjQgMCAwIDMyLTI0IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMjQgMCAwIDE5MmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtOTYgOTYgMGM2NS42IDAgMTIyLTM5LjUgMTQ2LjctOTZsMzcuMyAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0yNC44IDBjLjUtNS4zIC44LTEwLjYgLjgtMTZzLS4zLTEwLjctLjgtMTZsMjQuOCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0zNy4zIDBDMzYyIDcxLjUgMzA1LjYgMzIgMjQwIDMyTDExMiAzMnptMTk5LjYgOTZsLTE2Ny42IDAgMC0zMiA5NiAwYzI4LjQgMCA1NCAxMi40IDcxLjYgMzJ6TTE0NCAxNzZsMTkwLjcgMGMuOSA1LjIgMS4zIDEwLjUgMS4zIDE2cy0uNSAxMC44LTEuMyAxNmwtMTkwLjcgMCAwLTMyem0xNjcuNiA4MGMtMTcuNiAxOS42LTQzLjEgMzItNzEuNiAzMmwtOTYgMCAwLTMyIDE2Ny42IDB6Il0KICAgIH07CiAgICBmYVdpbmVHbGFzcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3aW5lLWdsYXNzIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbMTI3ODYzXSwgImY0ZTMiLCAiTTMyLjYgMjUuN0MzNS42IDEwLjggNDguNyAwIDY0IDBMMjU2IDBjMTUuMyAwIDI4LjQgMTAuOCAzMS40IDI1LjdMMzE2LjggMTczYzIuMSAxMC41IDMuMiAyMS4yIDMuMiAzMmwwIDNjMCA3Ny40LTU1IDE0Mi0xMjggMTU2LjhsMCAxMTUuMiA2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDY0IDU0NGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw2NCAwIDAtMTE1LjJDNTUgMzUwIDAgMjg1LjQgMCAyMDhsMC0zYzAtMTAuNyAxLjEtMjEuNCAzLjItMzJMMzIuNiAyNS43ek03Ny40IDEyOGwxNjUuMSAwLTEyLjgtNjQtMTM5LjUgMC0xMi44IDY0eiJdCiAgICB9OwogICAgZmFUZW1wZXJhdHVyZUhhbGYgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGVtcGVyYXR1cmUtaGFsZiIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWzEyNzc3NywgInRlbXBlcmF0dXJlLTIiLCAidGhlcm1vbWV0ZXItMiIsICJ0aGVybW9tZXRlci1oYWxmIl0sICJmMmM5IiwgIk0xNjAgMEMxMDcgMCA2NCA0MyA2NCA5NmwwIDE2NC43QzM0LjUgMjg3IDE2IDMyNS40IDE2IDM2OCAxNiA0NDcuNSA4MC41IDUxMiAxNjAgNTEyczE0NC02NC41IDE0NC0xNDRjMC00Mi42LTE4LjUtODEtNDgtMTA3LjNMMjU2IDk2YzAtNTMtNDMtOTYtOTYtOTZ6bTY0IDM2OGMwIDM1LjMtMjguNyA2NC02NCA2NHMtNjQtMjguNy02NC02NGMwLTI2LjkgMTYuNS00OS45IDQwLTU5LjNsMC05Mi43YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA5Mi43YzIzLjUgOS41IDQwIDMyLjUgNDAgNTkuM3oiXQogICAgfTsKICAgIGZhVGVtcGVyYXR1cmUyID0gZmFUZW1wZXJhdHVyZUhhbGY7CiAgICBmYVRoZXJtb21ldGVyMiA9IGZhVGVtcGVyYXR1cmVIYWxmOwogICAgZmFUaGVybW9tZXRlckhhbGYgPSBmYVRlbXBlcmF0dXJlSGFsZjsKICAgIGZhVGlja2V0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRpY2tldCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyNzkwM10sICJmMTQ1IiwgIk02NCA2NEMyOC43IDY0IDAgOTIuNyAwIDEyOGwwIDY0QzAgMjAwLjggNy40IDIwNy43IDE1LjcgMjEwLjYgMzQuNSAyMTcuMSA0OCAyMzUgNDggMjU2cy0xMy41IDM4LjktMzIuMyA0NS40QzcuNCAzMDQuMyAwIDMxMS4yIDAgMzIwbDAgNjRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsNDQ4IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC02NGMwLTguOC03LjQtMTUuNy0xNS43LTE4LjYtMTguOC02LjUtMzIuMy0yNC40LTMyLjMtNDUuNHMxMy41LTM4LjkgMzIuMy00NS40YzguMy0yLjkgMTUuNy05LjggMTUuNy0xOC42bDAtNjRjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgNjR6TTQxNiAzMzZsMC0xNjAtMjU2IDAgMCAxNjAgMjU2IDB6TTExMiAxNjBjMC0xNy43IDE0LjMtMzIgMzItMzJsMjg4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxOTJjMCAxNy43LTE0LjMgMzItMzIgMzJsLTI4OCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTE5MnoiXQogICAgfTsKICAgIGZhV2hlYXRBd25DaXJjbGVFeGNsYW1hdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3aGVhdC1hd24tY2lyY2xlLWV4Y2xhbWF0aW9uIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1OTgiLCAiTTQ5NiA1NzZhMTQ0IDE0NCAwIDEgMSAwLTI4OCAxNDQgMTQ0IDAgMSAxIDAgMjg4ek04MSA1MjljLTkuNCA5LjMtMjQuNSA5LjMtMzMuOSAwLTkuNC05LjQtOS40LTI0LjYgMC0zMy45TDgxIDUyOXptMzAuMi0yOTQuNGM2LjItNC4xIDE0LjctMy40IDIwLjEgMi4xbDQ2LjEgNDYuMSA2LjEgNi43YzE5LjcgMjMuOCAyNi4zIDU1IDE5LjMgODMuOSAzMS43LTcuNyA2Ni4yIDEgOTAuNiAyNS4zbDEyIDEyYy0uOCA3LTEuMiAxNC4yLTEuMiAyMS40IDAgMjAgMyAzOS4zIDguNyA1Ny40LTM2LjggMjEuOC04NSAxNy0xMTYuNi0xNC43TDE2NS42IDQ0NC4zIDgxIDUyOUM2OS43IDUxNy43IDU4LjQgNTA2LjMgNDcgNDk1bDg0LjctODQuNy0zMC41LTMwLjVjLTM3LjUtMzcuNS0zNy41LTk4LjMgMC0xMzUuN2w3LjQtNy40IDIuNS0yLjF6TTQ5NiA0NzZhMjAgMjAgMCAxIDAgMCA0MCAyMCAyMCAwIDEgMCAwLTQwem0wLTE0MGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgODBjMCA4LjggNy4yIDE2IDE2IDE2IDguOCAwIDE2LTcuMiAxNi0xNmwwLTgwYzAtOC44LTcuMi0xNi0xNi0xNnpNMjE1LjIgMTMwLjZjNi4yLTQuMSAxNC43LTMuNCAyMC4xIDIuMWw0Ni4xIDQ2LjEgNi4xIDYuN2MxOS43IDIzLjggMjYuMyA1NSAxOS4zIDgzLjkgMjQuMi01LjkgNTAuMS0yLjEgNzEuOSAxMC44LTMyLjIgMjQuOS01Ni4yIDU5LjgtNjcuNCAxMDAuMS0zLjgtMi44LTcuNS02LTExLTkuNWwtOTQuOS05NC45Yy0zNy41LTM3LjUtMzcuNS05OC4zIDAtMTM1LjdsNy40LTcuNCAyLjUtMi4xek01MjYuNyAxNWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMCA4LjggOC44IDkuMyAyMi43IDEuNyAzMi4xTDU2MC42IDQ5IDQ0Ni4yIDE2My40YzcuNyAxIDE1LjMgMyAyMi41IDUuOUw1MjcgMTExYzkuNC05LjQgMjQuNi05LjQgMzQgMCA4LjggOC44IDkuMyAyMi43IDEuNiAzMi4xbC0xLjcgMS44LTUyLjcgNTIuNyAzOSAzOWMzLjIgMy4yIDQuNyA3LjQgNC43IDExLjYtMTcuNy01LjQtMzYuNS04LjMtNTUuOS04LjMtMzQuMiAwLTY2LjMgOC45LTk0LjEgMjQuNmwtOTIuNy05Mi43Yy0zNy41LTM3LjUtMzcuNS05OC4zIDAtMTM1LjhsNy40LTcuNCAyLjUtMi4xYzYuMi00LjEgMTQuNy0zLjQgMjAuMSAyLjFsMzkgMzkgNTIuNy01Mi43YzkuNC05LjQgMjQuNi05LjQgMzQgMCA4LjggOC44IDkuMyAyMi43IDEuNiAzMi4xTDQ2NSA0OSA0MDYuNyAxMDcuM2MyLjggNy4xIDQuNyAxNC41IDUuOCAyMi4xTDUyNi43IDE1eiJdCiAgICB9OwogICAgZmFBcnJvd3NUdXJuUmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3dzLXR1cm4tcmlnaHQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTRjMCIsICJNMzEzLjQtNi42YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDgwIDgwYzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zbC04MCA4MGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNMMzM4LjcgMTI4IDEyOCAxMjhjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJTMCAyNDEuNyAwIDIyNGwwLTMyQzAgMTIxLjMgNTcuMyA2NCAxMjggNjRsMjEwLjcgMC0yNS40LTI1LjRjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zem0tOTYgMjU2YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDgwIDgwYzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zbC04MCA4MGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNMMjQyLjcgMzg0IDk2IDM4NGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAzMmMwIDE3LjctMTQuMyAzMi0zMiAzMlMwIDQ2NS43IDAgNDQ4bDAtMzJjMC01MyA0My05NiA5Ni05NmwxNDYuNyAwLTI1LjQtMjUuNGMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjN6Il0KICAgIH07CiAgICBmYUNhbmR5Q2FuZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYW5keS1jYW5lIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY3ODYiLCAiTTQyMS44IDM5LjZDNDUyIDg1LjIgNDU2LjUgMTQyLjkgNDM1LjEgMTkybC0xNjUuNCAwIDQxLjQtNDEuNGMuOC0uOCAxLjUtMS42IDIuMi0yLjRMNDIxLjggMzkuNnpNMjY4IDEwMi45Yy0uOCAuNy0xLjYgMS40LTIuNCAyLjJsLTI4LjEgMjguMWMtMjUgMjUtNjUuNSAyNS05MC41IDBzLTI1LTY1LjUgMC05MC41TDE3NSAxNC42QzIyOS45LTQwLjIgMzE0LjUtNDYuNyAzNzYuNS01LjZMMjY4IDEwMi45ek0xMjUuNyAzMzZsODAtODAgMTgxIDAtODIuNSA4Mi41IDAtMi41LTE3OC41IDB6bTExNyA2NEwxNDEuNCA1MDEuM2MtMjUgMjUtNjUuNSAyNS05MC41IDBzLTI1LTY1LjUgMC05MC41bDEwLjctMTAuNyAxODEgMHoiXQogICAgfTsKICAgIGZhV2hlZWxjaGFpciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3aGVlbGNoYWlyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxOTMiLCAiTTEzNiA0MGE1NiA1NiAwIDEgMSAxMTIgMCA1NiA1NiAwIDEgMSAtMTEyIDB6TTExNy45IDE5Ny42bDEyLjYgNjNjLTM4LjYgMTIuNC02Ni41IDQ4LjctNjYuNSA5MS40IDAgNTMgNDMgOTYgOTYgOTYgMzUuNiAwIDY2LjctMTkuNCA4My4zLTQ4LjIgMi4zIC4xIDQuNiAuMiA3IC4ybDQuMSAwYzEgMCAyLjEgMCAzLjEgMGw1NS4yIDBjLTIwLjQgNjQuOS04MSAxMTItMTUyLjcgMTEyLTg4LjQgMC0xNjAtNzEuNi0xNjAtMTYwIDAtNzMuOCA1MC0xMzUuOSAxMTcuOS0xNTQuNHptMTQ4LjYtMjguMWwyMy43IDExOC41IDYwLjUgMGMzMy4zIDAgNjMuMiAyMC43IDc0LjkgNTEuOWwyNS41IDY4IDE4LjctNi4yYzE2LjgtNS42IDM0LjkgMy41IDQwLjUgMjAuMnMtMy41IDM0LjktMjAuMiA0MC41bC00OCAxNmMtMTYuMyA1LjQtMzQtMy00MC4xLTE5LjFsLTM2LjMtOTYuOWMtMi4zLTYuMi04LjMtMTAuNC0xNS0xMC40bC04Ni4xIDBjLS40IDAtLjggMC0xLjMgMGwtMTMuMSAwYy0zMC41IDAtNTYuOC0yMS41LTYyLjgtNTEuNEwxNjUuMyAxODkuN2MtNi40LTMxLjkgMTgtNjEuNyA1MC42LTYxLjcgMjQuNiAwIDQ1LjggMTcuNCA1MC42IDQxLjV6Il0KICAgIH07CiAgICBmYVNwZWxsQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3BlbGwtY2hlY2siLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjg5MSIsICJNMTIwIDMyYy00OC42IDAtODggMzkuNC04OCA4OGwwIDE2OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtNjQgNjQgMCAwIDY0YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xNjhjMC00OC42LTM5LjQtODgtODgtODhsLTE2IDB6bTQwIDEyOGwtNjQgMCAwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0bDE2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA0MHpNMzA0IDMyYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDIyNGMwIDE3LjcgMTQuMyAzMiAzMiAzMmw3MiAwYzQ4LjYgMCA4OC0zOS40IDg4LTg4IDAtMjMuNi05LjMtNDUtMjQuNC02MC44IDEwLjMtMTQuNCAxNi40LTMyLjEgMTYuNC01MS4yIDAtNDguNi0zOS40LTg4LTg4LTg4bC02NCAwem02NCAxMTJsLTMyIDAgMC00OCAzMiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0ek0zMzYgMjU2bDAtNDggNDAgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNDAgMHptMjMzIDg0YzExLTEzLjggOC44LTMzLjktNS00NXMtMzMuOS04LjgtNDUgNWwtMTA1LjcgMTMyLjEtMzguNy0zOC43Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2w2NCA2NGM2LjQgNi40IDE1LjMgOS44IDI0LjQgOS4zczE3LjUtNC45IDIzLjItMTJMNTY5IDM0MHoiXQogICAgfTsKICAgIGZhVm9sdW1lT2ZmID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZvbHVtZS1vZmYiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZjAyNiIsICJNOTYgMzUybC00OCAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTk2YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDQ4IDAgMTM0LjEtMTE5LjJjNi40LTUuNyAxNC42LTguOCAyMy4xLTguOCAxOS4yIDAgMzQuOCAxNS42IDM0LjggMzQuOGwwIDM3OC40YzAgMTkuMi0xNS42IDM0LjgtMzQuOCAzNC44LTguNSAwLTE2LjctMy4xLTIzLjEtOC44TDk2IDM1MnoiXQogICAgfTsKICAgIGZhTHVuZ3MgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibHVuZ3MiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjk3MjldLCAiZjYwNCIsICJNMzIwIDMyYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMTQxLjktMzIgMTkuMiAwLTExNi43YzAtMjQuNS0xOS45LTQ0LjQtNDQuNC00NC40LTEyLjUgMC0yNC40IDUuMy0zMi44IDE0LjVsLTI2LjQgMjlDNDIuOSAxNjAuOCAwIDI3MS44IDAgMzg3bDAgMzAuNWMwIDUyLjIgNDIuMyA5NC41IDk0LjUgOTQuNSAyMiAwIDQzLjctNS4xIDYzLjQtMTVsNS0yLjVjMzcuNC0xOC43IDYxLTU2LjkgNjEtOTguOGwwLTEyOCA2NC0zOC40IDY0IDM4LjQgMCAxMjhjMCA0MS44IDIzLjYgODAuMSA2MSA5OC44bDUgMi41YzE5LjcgOS44IDQxLjQgMTUgNjMuNCAxNSA1Mi4yIDAgOTQuNS00Mi4zIDk0LjUtOTQuNWwwLTYuMmMwLTExMS4xLTM2LjctMjE5LTEwNC40LTMwN0w0MjguOSA0OC43Yy04LjEtMTAuNi0yMC43LTE2LjctMzQtMTYuNy0yMy43IDAtNDIuOSAxOS4yLTQyLjkgNDIuOWwwIDExOC4yLTMyLTE5LjIgMC0xNDEuOXoiXQogICAgfTsKICAgIGZhQm9va21hcmsyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvb2ttYXJrIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4Mjc4LCA2MTU5MV0sICJmMDJlIiwgIk02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NEwwIDQ4MGMwIDExLjUgNi4yIDIyLjIgMTYuMiAyNy44czIyLjMgNS41IDMyLjItLjRMMTkyIDQyMS4zIDMzNS41IDUwNy40YzkuOSA1LjkgMjIuMiA2LjEgMzIuMiAuNFMzODQgNDkxLjUgMzg0IDQ4MGwwLTQxNmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAweiJdCiAgICB9OwogICAgZmFCYXJjb2RlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhcmNvZGUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjAyYSIsICJNMzIgMzJDMTQuMyAzMiAwIDQ2LjMgMCA2NEwwIDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMyTDY0IDY0YzAtMTcuNy0xNC4zLTMyLTMyLTMyem04OCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDQwMGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNDAwYzAtMTMuMy0xMC43LTI0LTI0LTI0em03MiAzMmwwIDM4NGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzg0YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMyem0yMDgtOGwwIDQwMGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNDAwYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0em0tOTYgMGwwIDQwMGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNDAwYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0eiJdCiAgICB9OwogICAgZmFMaXN0T2wgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGlzdC1vbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJsaXN0LTEtMiIsICJsaXN0LW51bWVyaWMiXSwgImYwY2IiLCAiTTAgNzJDMCA1OC44IDEwLjcgNDggMjQgNDhsNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDEwNCAyNCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC05NiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDI0IDAgMC04MC0yNCAwQzEwLjcgOTYgMCA4NS4zIDAgNzJ6TTMwLjQgMzAxLjJDNDEuOCAyOTIuNiA1NS43IDI4OCA3MCAyODhsNC45IDBjMzMuNyAwIDYxLjEgMjcuNCA2MS4xIDYxLjEgMCAxOS42LTkuNCAzNy45LTI1LjIgNDkuNGwtMjQgMTcuNSAzMy4yIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTkwLjcgMEMxMy4xIDQ2NCAwIDQ1MC45IDAgNDM0LjcgMCA0MjUuMyA0LjUgNDE2LjUgMTIuMSA0MTFsNzAuNS01MS4zYzMuNC0yLjUgNS40LTYuNCA1LjQtMTAuNiAwLTcuMi01LjktMTMuMS0xMy4xLTEzLjFMNzAgMzM2Yy0zLjkgMC03LjcgMS4zLTEwLjggMy42TDM4LjQgMzU1LjJjLTEwLjYgOC0yNS42IDUuOC0zMy42LTQuOFMtMSAzMjQuOCA5LjYgMzE2LjhsMjAuOC0xNS42ek0yMjQgNjRsMjU2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTI1NiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMyem0wIDE2MGwyNTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMjU2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJ6bTAgMTYwbDI1NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0yNTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMnoiXQogICAgfTsKICAgIGZhTGlzdDEyID0gZmFMaXN0T2w7CiAgICBmYUxpc3ROdW1lcmljID0gZmFMaXN0T2w7CiAgICBmYUZpbGVDaXJjbGVYbWFyayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLWNpcmNsZS14bWFyayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNWExIiwgIk05NiAwQzYwLjcgMCAzMiAyOC43IDMyIDY0bDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE4MCAwYy0yMi43LTMxLjUtMzYtNzAuMi0zNi0xMTIgMC0xMDAuNiA3Ny40LTE4My4yIDE3Ni0xOTEuM2wwLTM4LjFjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNMMjkwLjcgMTguN0MyNzguNyA2LjcgMjYyLjUgMCAyNDUuNSAwTDk2IDB6TTM1Ny41IDE3NkwyNjQgMTc2Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNEwyNDAgNTguNSAzNTcuNSAxNzZ6TTQzMiA1NDRhMTQ0IDE0NCAwIDEgMCAwLTI4OCAxNDQgMTQ0IDAgMSAwIDAgMjg4em01OS4zLTE4MC43bC0zNi43IDM2LjcgMzYuNyAzNi43YzYuMiA2LjIgNi4yIDE2LjQgMCAyMi42cy0xNi40IDYuMi0yMi42IDBsLTM2LjctMzYuNy0zNi43IDM2LjdjLTYuMiA2LjItMTYuNCA2LjItMjIuNiAwcy02LjItMTYuNCAwLTIyLjZsMzYuNy0zNi43LTM2LjctMzYuN2MtNi4yLTYuMi02LjItMTYuNCAwLTIyLjZzMTYuNC02LjIgMjIuNiAwbDM2LjcgMzYuNyAzNi43LTM2LjdjNi4yLTYuMiAxNi40LTYuMiAyMi42IDBzNi4yIDE2LjQgMCAyMi42eiJdCiAgICB9OwogICAgZmFDdWJlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImN1YmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjFiMiIsICJNMjI0LjMtMi41YzE5LjgtMTEuNCA0NC4yLTExLjQgNjQgMEw0NjQuMiA5OWMxOS44IDExLjQgMzIgMzIuNiAzMiA1NS40bDAgMjAzYzAgMjIuOS0xMi4yIDQ0LTMyIDU1LjRMMjg4LjMgNTE0LjVjLTE5LjggMTEuNC00NC4yIDExLjQtNjQgMEw0OC41IDQxM2MtMTkuOC0xMS40LTMyLTMyLjYtMzItNTUuNGwwLTIwM2MwLTIyLjkgMTIuMi00NCAzMi01NS40TDIyNC4zLTIuNXptMjA3LjggMzYwbDAtMTY2LjEtMTQzLjggODMgMCAxNjYuMSAxNDMuOC04M3oiXQogICAgfTsKICAgIGZhVGFwZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YXBlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY0ZGIiLCAiTTQxMi44IDQxNmM0MS41LTQwLjcgNjcuMi05Ny4zIDY3LjItMTYwIDAtMTIzLjctMTAwLjMtMjI0LTIyNC0yMjRTMzIgMTMyLjMgMzIgMjU2IDEzMi4zIDQ4MCAyNTYgNDgwbDI4OCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0xMzEuMiAwek0yNTYgMTYwYTk2IDk2IDAgMSAxIDAgMTkyIDk2IDk2IDAgMSAxIDAtMTkyem00OCA5NmE0OCA0OCAwIDEgMCAtOTYgMCA0OCA0OCAwIDEgMCA5NiAweiJdCiAgICB9OwogICAgZmFCb21iID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvbWIiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgxNjNdLCAiZjFlMiIsICJNNDgwLTE2YzYuOSAwIDEzIDQuNCAxNS4yIDEwLjlsMTMuNSA0MC40IDQwLjQgMTMuNUM1NTUuNiA1MSA1NjAgNTcuMSA1NjAgNjRzLTQuNCAxMy0xMC45IDE1LjJsLTQwLjQgMTMuNS0xMy41IDQwLjRDNDkzIDEzOS42IDQ4Ni45IDE0NCA0ODAgMTQ0cy0xMy00LjQtMTUuMi0xMC45bC0xMy41LTQwLjQtNDAuNC0xMy41QzQwNC40IDc3IDQwMCA3MC45IDQwMCA2NHM0LjQtMTMgMTAuOS0xNS4ybDQwLjQtMTMuNSAxMy41LTQwLjRDNDY3LTExLjYgNDczLjEtMTYgNDgwLTE2ek0zMjEuNCA5Ny40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDgwIDgwYzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zbC0xMC45IDEwLjljNy45IDIyIDEyLjIgNDUuNyAxMi4yIDcwLjUgMCAxMTQuOS05My4xIDIwOC0yMDggMjA4UzMyIDQxOC45IDMyIDMwNCAxMjUuMSA5NiAyNDAgOTZjMjQuNyAwIDQ4LjUgNC4zIDcwLjUgMTIuM2wxMC45LTEwLjl6TTE0NCAzMDRjMC01MyA0My05NiA5Ni05NiAxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGMtNzkuNSAwLTE0NCA2NC41LTE0NCAxNDQgMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNHoiXQogICAgfTsKICAgIGZhU2NhbGVVbmJhbGFuY2VkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNjYWxlLXVuYmFsYW5jZWQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsiYmFsYW5jZS1zY2FsZS1sZWZ0Il0sICJmNTE1IiwgIk01MTkuOCA2Mi40YzE2LjgtNS42IDI1LjgtMjMuNyAyMC4yLTQwLjVTNTE2LjMtMy45IDQ5OS42IDEuNmwtMTEzIDM3LjdjLTEzLjktMjMuNS0zOS42LTM5LjMtNjguOS0zOS4zLTQ0LjIgMC04MCAzNS44LTgwIDgwIDAgMyAuMiA1LjkgLjUgOC44TDExNS42IDEyOS42Yy0xNi44IDUuNi0yNS44IDIzLjctMjAuMiA0MC41czIzLjcgMjUuOCA0MC41IDIwLjJsMTM1LjUtNDUuMmM0LjUgMy4yIDkuMyA1LjkgMTQuNCA4LjJsMCAzMjYuN2MwIDE3LjcgMTQuMyAzMiAzMiAzMmwxOTIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTYwIDAgMC0yOTQuN2MyMS05LjIgMzcuMi0yNyA0NC4yLTQ5bDEyNS45LTQyek00MzcuMyAyODhsNzIuNC0xMjQuMiA3Mi40IDEyNC4yLTE0NC45IDB6bTcyLjQgOTZjNjIuOSAwIDExNS4yLTM0IDEyNi03OC45IDIuNi0xMS0xLTIyLjMtNi43LTMyLjFMNTMzLjggMTA5LjhjLTUtOC42LTE0LjItMTMuOC0yNC4xLTEzLjhzLTE5LjEgNS4zLTI0LjEgMTMuOEwzOTAuNCAyNzMuMWMtNS43IDkuOC05LjMgMjEuMS02LjcgMzIuMSAxMC44IDQ0LjggNjMuMSA3OC45IDEyNiA3OC45ek0xMjYuOCAyOTEuOGw3Mi40IDEyNC4yLTE0NC45IDAgNzIuNC0xMjQuMnpNLjkgNDMzLjFDMTEuNyA0NzggNjQgNTEyIDEyNi44IDUxMnMxMTUuMi0zNCAxMjYtNzguOWMyLjYtMTEtMS0yMi4zLTYuNy0zMi4xTDE1MC45IDIzNy44Yy01LTguNi0xNC4yLTEzLjgtMjQuMS0xMy44cy0xOS4xIDUuMy0yNC4xIDEzLjhMNy42IDQwMS4xYy01LjcgOS44LTkuMyAyMS4xLTYuNyAzMi4xeiJdCiAgICB9OwogICAgZmFCYWxhbmNlU2NhbGVMZWZ0ID0gZmFTY2FsZVVuYmFsYW5jZWQ7CiAgICBmYVNxdWFyZUNhcmV0TGVmdDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLWNhcmV0LWxlZnQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiY2FyZXQtc3F1YXJlLWxlZnQiXSwgImYxOTEiLCAiTTAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZ6TTEyOCAyNTZjMC02LjcgMi44LTEzIDcuNy0xNy42bDExMi0xMDRjNy02LjUgMTcuMi04LjIgMjUuOS00LjRTMjg4IDE0Mi41IDI4OCAxNTJsMCAyMDhjMCA5LjUtNS43IDE4LjItMTQuNCAyMnMtMTguOSAyLjEtMjUuOS00LjRsLTExMi0xMDRjLTQuOS00LjUtNy43LTEwLjktNy43LTE3LjZ6Il0KICAgIH07CiAgICBmYUNhcmV0U3F1YXJlTGVmdDIgPSBmYVNxdWFyZUNhcmV0TGVmdDI7CiAgICBmYVJ1bGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJ1bGVyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4MjA3XSwgImY1NDUiLCAiTTIwOS4xIDUxNi4yYy0xOC43IDE4LjctNDkuMSAxOC43LTY3LjkgMEwyOC4xIDQwMy4xYy0xOC43LTE4LjctMTguNy00OS4xIDAtNjcuOWwxNy0xNyA3My41IDczLjVjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC03My41LTczLjUgMzMuOS0zMy45IDUwLjkgNTAuOWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTUwLjktNTAuOSAzMy45LTMzLjkgNzMuNSA3My41YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNzMuNS03My41IDMzLjktMzMuOSA1MC45IDUwLjljOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC01MC45LTUwLjkgMzMuOS0zMy45IDczLjUgNzMuNWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTczLjUtNzMuNSAxNy0xN2MxOC43LTE4LjcgNDkuMS0xOC43IDY3LjkgMEw1NDguNSAxMDguOWMxOC43IDE4LjcgMTguNyA0OS4xIDAgNjcuOUwyMDkuMSA1MTYuMnoiXQogICAgfTsKICAgIGZhSSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJpIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbMTA1XSwgIjQ5IiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0UzE0LjMgOTYgMzIgOTZsOTYgMCAwIDMyMC05NiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDI1NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC05NiAwIDAtMzIwIDk2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgMzJ6Il0KICAgIH07CiAgICBmYVZvbHVtZVhtYXJrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZvbHVtZS14bWFyayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJ2b2x1bWUtbXV0ZSIsICJ2b2x1bWUtdGltZXMiXSwgImY2YTkiLCAiTTQ4IDM1Mmw0OCAwIDEzNC4xIDExOS4yYzYuNCA1LjcgMTQuNiA4LjggMjMuMSA4LjggMTkuMiAwIDM0LjgtMTUuNiAzNC44LTM0LjhsMC0zNzguNGMwLTE5LjItMTUuNi0zNC44LTM0LjgtMzQuOC04LjUgMC0xNi43IDMuMS0yMy4xIDguOEw5NiAxNjAgNDggMTYwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDk2YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4ek0zNjcgMTc1Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOWw0NyA0Ny00NyA0N2MtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDQ3LTQ3IDQ3IDQ3YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNDctNDcgNDctNDdjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMGwtNDcgNDctNDctNDdjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAweiJdCiAgICB9OwogICAgZmFWb2x1bWVNdXRlID0gZmFWb2x1bWVYbWFyazsKICAgIGZhVm9sdW1lVGltZXMgPSBmYVZvbHVtZVhtYXJrOwogICAgZmFBcmNod2F5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFyY2h3YXkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjU1NyIsICJNMzIgMzJDMTQuMyAzMiAwIDQ2LjMgMCA2NFMxNC4zIDk2IDMyIDk2bDQ0OCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDMyIDMyem0wIDM4NGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwxMjggMCAwLTEyOGMwLTUzIDQzLTk2IDk2LTk2czk2IDQzIDk2IDk2bDAgMTI4IDEyOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybDAtMjcyLTQ0OCAwIDAgMjcyeiJdCiAgICB9OwogICAgZmFQZXJzb25EaWdnaW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1kaWdnaW5nIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImRpZ2dpbmciXSwgImY4NWUiLCAiTTIwOCA0MGE1NiA1NiAwIDEgMSAxMTIgMCA1NiA1NiAwIDEgMSAtMTEyIDB6TTEwLjUgMTgxLjNjNS45LTExLjkgMjAuMy0xNi43IDMyLjItMTAuN2wyNC42IDEyLjMgMTIuMi0yMC40YzE4LjktMzEuNSA1My4yLTUwLjUgODkuNi01MC41IDQ2LjIgMCA4Ny43IDMwLjUgMTAwLjUgNzUuNGwzMi4yIDExMi43IDkyLjkgNDYuNCAyNS44LTQzYzUuOC05LjYgMTYuMi0xNS41IDI3LjQtMTUuNXMyMS43IDUuOSAyNy40IDE1LjVsOTYgMTYwYzUuOSA5LjkgNi4xIDIyLjIgLjQgMzIuMlM1NTUuNSA1MTIgNTQ0IDUxMmwtMTkyIDBjLTExLjUgMC0yMi4yLTYuMi0yNy44LTE2LjJzLTUuNS0yMi4zIC40LTMyLjJMMzcwIDM4Ny44IDIxLjMgMjEzLjVjLTExLjktNS45LTE2LjctMjAuMy0xMC43LTMyLjJ6TTk0LjMgMzA3LjRsMTEyIDU2YzEwLjggNS40IDE3LjcgMTYuNSAxNy43IDI4LjZsMCA4OGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY4LjItNjEuMy0zMC43LTM2LjMgMTA5Yy01LjYgMTYuOC0yMy43IDI1LjgtNDAuNSAyMC4yUy0zLjkgNDg2LjYgMS43IDQ2OS45bDQ4LTE0NGMyLjktOC44IDkuNS0xNS45IDE4LjEtMTkuNHMxOC4zLTMuMiAyNi42IC45eiJdCiAgICB9OwogICAgZmFEaWdnaW5nID0gZmFQZXJzb25EaWdnaW5nOwogICAgZmFHYXVnZUhpZ2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ2F1Z2UtaGlnaCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYyNDYxLCAidGFjaG9tZXRlci1hbHQiLCAidGFjaG9tZXRlci1hbHQtZmFzdCJdLCAiZjYyNSIsICJNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHpNMjg4IDk2YTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6TTI1NiA0MTZjMzUuMyAwIDY0LTI4LjcgNjQtNjQgMC0xNi4yLTYtMzEuMS0xNi00Mi4zbDY5LjUtMTM4LjljNS45LTExLjkgMS4xLTI2LjMtMTAuNy0zMi4ycy0yNi4zLTEuMS0zMi4yIDEwLjdMMjYxLjEgMjg4LjJjLTEuNy0uMS0zLjQtLjItNS4xLS4yLTM1LjMgMC02NCAyOC43LTY0IDY0czI4LjcgNjQgNjQgNjR6TTE3NiAxNDRhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHpNOTYgMjg4YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHptMzUyLTMyYTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6Il0KICAgIH07CiAgICBmYVRhY2hvbWV0ZXJBbHQgPSBmYUdhdWdlSGlnaDsKICAgIGZhVGFjaG9tZXRlckFsdEZhc3QgPSBmYUdhdWdlSGlnaDsKICAgIGZhR2VuZGVybGVzcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnZW5kZXJsZXNzIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYyMmQiLCAiTTE5MiAxMjhhMTI4IDEyOCAwIDEgMSAwIDI1NiAxMjggMTI4IDAgMSAxIDAtMjU2em0wIDMyMGExOTIgMTkyIDAgMSAwIDAtMzg0IDE5MiAxOTIgMCAxIDAgMCAzODR6Il0KICAgIH07CiAgICBmYUNsb3VkU3VuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNsb3VkLXN1biIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzk5MjVdLCAiZjZjNCIsICJNMjA4LjMgMTkyYzQzLjEgMCA4MC41IDI0LjQgOTkuMiA2MC4xIDE0LjctMTcuMiAzNi40LTI4LjEgNjAuOC0yOC4xIDQ0LjIgMCA4MCAzNS44IDgwIDgwIDAgNS41LS42IDEwLjktMS42IDE2IC41IDAgMS4xIDAgMS42IDAgNTMgMCA5NiA0MyA5NiA5NnMtNDMgOTYtOTYgOTZsLTMyMCAwYy01MyAwLTk2LTQzLTk2LTk2IDAtNDIuNSAyNy43LTc4LjUgNjYtOTEuMi0xLjMtNi44LTItMTMuNy0yLTIwLjggMC02MS45IDUwLjEtMTEyIDExMi0xMTJ6bTE5Mi0yMjMuOGM1LjMgMCAxMC4zIDIuNyAxMy4zIDcuMWw0Ny4zIDcwLjQgODMuMy0xNi4zYzUuMi0xIDEwLjYgLjcgMTQuMyA0LjQgMy44IDMuOCA1LjQgOS4yIDQuNCAxNC40bC0xNi4zIDgzLjMgNzAuNCA0Ny4zYzQuNCAzIDcuMSA4IDcuMSAxMy4zIDAgNS4zLTIuNiAxMC4zLTcgMTMuMmwtNzAuNCA0Ny4zIDE0LjUgNzQuMmMtMTcuMi0yMS43LTQwLjQtMzguNC02Ny4yLTQ3LjMtMi41LTEyLjctNi45LTI0LjYtMTIuOC0zNS43IDkuNi0xNC45IDE1LjItMzIuNyAxNS4yLTUxLjcgMC01My00My05Ni05Ni05Ni00Ny45IDAtODcuNiAzNS4xLTk0LjggODAuOS0yMC45LTE2LTQ1LjktMjctNzMuMS0zMS4xbDIxLjUtMTQuNS0xNi4zLTgzLjItLjMtMmMtLjMtNC42IDEuMy05LjEgNC42LTEyLjQgMy44LTMuOCA5LjItNS40IDE0LjQtNC40bDgzLjMgMTYuMyA0Ny4zLTcwLjQgMS4yLTEuNmMzLTMuNSA3LjQtNS41IDEyLjEtNS41em0wIDE3NS44YzI2LjUgMCA0OCAyMS41IDQ4IDQ4IDAgMy44LS41IDcuNi0xLjQgMTEuMS0yMS43LTE2LjktNDguOS0yNy4xLTc4LjYtMjcuMS00LjYgMC05LjEgLjItMTMuNSAuNyA2LjQtMTkgMjQuMy0zMi43IDQ1LjUtMzIuN3oiXQogICAgfTsKICAgIGZhQXJyb3dSaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy1yaWdodCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzg1OTRdLCAiZjA2MSIsICJNNTAyLjYgMjc4LjZjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNsLTE2MC0xNjBjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zTDQwMi43IDIyNCAzMiAyMjRjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzcwLjcgMC0xMDUuNCAxMDUuNGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMGwxNjAtMTYweiJdCiAgICB9OwogICAgZmFIYW5kc2hha2UyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbmRzaGFrZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyOTMwOSwgNjI2NjIsICJoYW5kc2hha2UtYWx0IiwgImhhbmRzaGFrZS1zaW1wbGUiXSwgImYyYjUiLCAiTTI2OC45IDg1LjJMMTUyLjMgMjE0LjhjLTQuNiA1LjEtNC40IDEzIC41IDE3LjkgMzAuNSAzMC41IDgwIDMwLjUgMTEwLjUgMGwzMS44LTMxLjhjNC4yLTQuMiA5LjUtNi41IDE0LjktNi45IDYuOC0uNiAxMy44IDEuNyAxOSA2LjlMNTA1LjYgMzc2IDU3NiAzMjAgNTc2IDMyIDQ2NCA5NiA0NDAuMiA4MC4xQzQyNC40IDY5LjYgNDA1LjkgNjQgMzg2LjkgNjRsLTcwLjQgMGMtMS4xIDAtMi4zIDAtMy40IC4xLTE2LjkgLjktMzIuOCA4LjUtNDQuMiAyMS4xek0xMTYuNiAxODIuN0wyMjMuNCA2NCAxODMuOCA2NGMtMjUuNSAwLTQ5LjkgMTAuMS02Ny45IDI4LjFMMTEyIDk2IDAgMzIgMCAzMjAgMTU2LjQgNDUwLjNjMjMgMTkuMiA1MiAyOS43IDgxLjkgMjkuN2wxNS43IDAtNy03Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBsNDEgNDEgOSAwYzE5LjEgMCAzNy44LTQuMyA1NC44LTEyLjNMMzU5IDQ0MWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDMyIDMyIDE3LjUtMTcuNWM4LjktOC45IDExLjUtMjEuOCA3LjYtMzMuMWwtMTM3LjktMTM2LjgtMTQuOSAxNC45Yy00OS4zIDQ5LjMtMTI5LjEgNDkuMy0xNzguNCAwLTIzLTIzLTIzLjktNTkuOS0yLjItODR6Il0KICAgIH07CiAgICBmYUhhbmRzaGFrZUFsdDIgPSBmYUhhbmRzaGFrZTI7CiAgICBmYUhhbmRzaGFrZVNpbXBsZTIgPSBmYUhhbmRzaGFrZTI7CiAgICBmYVBlcnNvblNraWluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tc2tpaW5nIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbOTk3NSwgInNraWluZyJdLCAiZjdjOSIsICJNNDE2IDU2YTU2IDU2IDAgMSAxIDExMiAwIDU2IDU2IDAgMSAxIC0xMTIgMHpNMi43IDMwMC45YzYuMS0xMS44IDIwLjYtMTYuMyAzMi40LTEwLjJsMTk3LjggMTAyLjcgNjIuMy04Ny4yLTgyLTkyLjJjLTExLTEyLjQtMTYuMi0yNy41LTE2LjItNDIuNGwxMTEuNiA1My40IDQyLjkgNDguMmMxNC45IDE2LjcgMTYuMiA0MS42IDMuMiA1OS44bC02NC40IDkwLjIgMTI4LjMgNjYuNmMxMy42IDcuMSAyOS44IDcuMiA0My42IC4zbDE1LjItNy42YzExLjktNS45IDI2LjMtMS4xIDMyLjIgMTAuN3MxLjEgMjYuMy0xMC43IDMyLjJsLTE1LjIgNy42Yy0yNy41IDEzLjctNTkuOSAxMy41LTg3LjItLjdMMTIuOSAzMzMuM0MxLjIgMzI3LjItMy40IDMxMi43IDIuNyAzMDAuOXpNMTAzIDQ5LjZsMTggOC43IDguNy0xNy40YzQtNy45IDEzLjYtMTEuMSAyMS41LTcuMnMxMS4xIDEzLjYgNy4yIDIxLjVsLTguNSAxNyA4NC44IDQxIC40LS4yIDc2LjEtMzMuOGMzMS4zLTEzLjkgNjcuOS0uNyA4My4yIDI5LjlsMjguOSA1Ny44IDY4LjcgMjcuNWMxNi40IDYuNiAyNC40IDI1LjIgMTcuOCA0MS42cy0yNS4yIDI0LjQtNDEuNiAxNy44TDM5My44IDIyNGMtMTAuOS00LjQtMTkuOC0xMi42LTI1LjEtMjMuMWwtMTEuNS0yMy4xYy0xNi40IDkuNC0yNS45IDE0LjgtMjguNSAxNi4zbC03LjYtMy43LTE4NS42LTg5LjYtOS4yIDE4LjNjLTQgNy45LTEzLjYgMTEuMS0yMS41IDcuMnMtMTEuMS0xMy42LTcuMi0yMS41bDktMTcuOS0xNy42LTguNUM4MS4xIDc0LjYgNzcuOCA2NSA4MS42IDU3Uzk1IDQ1LjcgMTAzIDQ5LjZ6Il0KICAgIH07CiAgICBmYVNraWluZyA9IGZhUGVyc29uU2tpaW5nOwogICAgZmFCcmlkZ2VXYXRlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJicmlkZ2Utd2F0ZXIiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTRjZSIsICJNNjQgNjRsNTEyIDAgMCAxMTJjLTM3LjYgOS40LTY0IDQzLjItNjQgODJsMCA3Ni40Yy0yMS05LjctNDMuNS0xNC41LTY2LTE0LjQtMTAgLjEtMjAuMSAxLjEtMzAgMy4xbDAtMzUuMWMwLTUzLTQzLTk2LTk2LTk2cy05NiA0My05NiA5NmwwIDMyLjdjLTUuMy0uNS0xMC43LS44LTE2LS43LTI3LjcgLjItNTUuNCA3LjgtODAgMjNsMC04NWMwLTM4LjgtMjYuNC03Mi42LTY0LTgyTDY0IDY0ek00MDMuNCA0NDQuMUMzNzkuMSA0NjIuMyAzNTEuMSA0ODAgMzIwIDQ4MHMtNTkuMS0xNy43LTgzLjQtMzUuOWMtMjEuMy0xNi4xLTQ5LjktMTYuMS03MS4yIDAtMjMuOCAxNy45LTU0LjEgMzUuNS04OC4xIDM1LjMtMjAuNC0uMS00MC43LTYuNy01OS44LTIxLjEtMTAuNi04LTEyLjctMjMtNC43LTMzLjZzMjMtMTIuNyAzMy42LTQuN2MxMS4zIDguNSAyMS42IDExLjQgMzEuMiAxMS41IDE3LjYgLjEgMzcuMy05LjQgNTguOS0yNS43IDM4LjQtMjkgOTAuNS0yOSAxMjkgMCAyNCAxOC4xIDQwLjcgMjYuMyA1NC41IDI2LjNzMzAuNS04LjIgNTQuNS0yNi4zYzM4LjQtMjkgOTAuNS0yOSAxMjkgMCAxNi45IDEyLjcgMzIuOSAyMS41IDQ3LjggMjQuNiAxMy43IDIuOCAyNy40IC45IDQyLjMtMTAuMyAxMC42LTggMjUuNi01LjkgMzMuNiA0LjdzNS45IDI1LjYtNC43IDMzLjZjLTI2LjQgMTkuOS01NC4yIDI0LjQtODAuNyAxOS4xLTI1LjMtNS4xLTQ4LjEtMTguOS02Ny4yLTMzLjMtMjEuMy0xNi4xLTQ5LjktMTYuMS03MS4yIDB6Il0KICAgIH07CiAgICBmYUJ1aWxkaW5nTmdvID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJ1aWxkaW5nLW5nbyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNGQ3IiwgIk0xMjggMEM5Mi43IDAgNjQgMjguNyA2NCA2NGwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGw0OCAwIDAtMTEyYzAtMzUuMyAyOC43LTY0IDY0LTY0bDIwOCAwIDAtMjcyYzAtMzUuMy0yOC43LTY0LTY0LTY0TDEyOCAwem0zMiAxMTJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMnpNMzA0IDk2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZ6TTE2MCAyNDBjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMnptMTQ0LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZ6TTUyMCAzODBjLTI0LjMgMC00NCAxOS43LTQ0IDQ0bDAgODBjMCAyNC4zIDE5LjcgNDQgNDQgNDRsMTYgMGMyNC4zIDAgNDQtMTkuNyA0NC00NGwwLTgwYzAtMjQuMy0xOS43LTQ0LTQ0LTQ0bC0xNiAwem0tNCA0NGMwLTIuMiAxLjgtNCA0LTRsMTYgMGMyLjIgMCA0IDEuOCA0IDRsMCA4MGMwIDIuMi0xLjggNC00IDRsLTE2IDBjLTIuMiAwLTQtMS44LTQtNGwwLTgwem0tMTY4IDBsMCA4MGMwIDI0LjMgMTkuNyA0NCA0NCA0NGwxNiAwYzI0LjMgMCA0NC0xOS43IDQ0LTQ0bDAtMjRjMC0xMS05LTIwLTIwLTIwbC04IDBjLTExIDAtMjAgOS0yMCAyMCAwIDYuNSAzLjEgMTIuNCA4IDE2bDAgOGMwIDIuMi0xLjggNC00IDRsLTE2IDBjLTIuMiAwLTQtMS44LTQtNGwwLTgwYzAtMi4yIDEuOC00IDQtNGwyMC40IDBjMS45IDkuMSA5LjkgMTYgMTkuNiAxNiAxMSAwIDIwLTkgMjAtMjAgMC0xOS45LTE2LjEtMzYtMzYtMzZsLTI0IDBjLTI0LjMgMC00NCAxOS43LTQ0IDQ0em0tOTAuMS0zMi45Yy00LjEtOC4zLTEzLjUtMTIuNy0yMi41LTEwLjVTMjIwIDM5MC43IDIyMCA0MDBsMCAxMjhjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC00My4zIDI2LjEgNTIuMmM0LjEgOC4zIDEzLjUgMTIuNyAyMi41IDEwLjVTMzI0IDUzNy4zIDMyNCA1MjhsMC0xMjhjMC0xMS05LTIwLTIwLTIwcy0yMCA5LTIwIDIwbDAgNDMuMy0yNi4xLTUyLjJ6Il0KICAgIH07CiAgICBmYUlnbG9vID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImlnbG9vIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY3YWUiLCAiTTMyMCAzMy44bDAgMTI2LjItMjcxLjUgMGM1MS43LTc3LjIgMTM5LjYtMTI4IDIzOS41LTEyOCAxMC44IDAgMjEuNSAuNiAzMiAxLjh6TTM2OCAxNjBsMC0xMTYuN2M2NiAxOSAxMjIuMiA2MSAxNTkuNSAxMTYuN0wzNjggMTYwek0yMi42IDIwOGw3My40IDAgMCAxMTItOTYgMGMwLTM5LjcgOC03Ny42IDIyLjYtMTEyek0xNzYgMzIwbC0zMiAwIDAtMTEyIDI4OCAwIDAgMTEyLTMyIDAgMCA0OCAxNzYgMCAwIDY0YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDQ4IDQ4MGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC02NCAxNzYgMCAwLTQ4em0zMDQgMGwwLTExMiA3My40IDBDNTY4IDI0Mi40IDU3NiAyODAuMyA1NzYgMzIwbC05NiAwek0yODggMjg4Yy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDgwIDEyOCAwIDAtODBjMC0zNS4zLTI4LjctNjQtNjQtNjR6Il0KICAgIH07CiAgICBmYUNpcmNsZURvbGxhclRvU2xvdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtZG9sbGFyLXRvLXNsb3QiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsiZG9uYXRlIl0sICJmNGI5IiwgIk05NiAyMjRhMTkyIDE5MiAwIDEgMSAzODQgMCAxOTIgMTkyIDAgMSAxIC0zODQgMHptMTc2LTkybDAgNGMtMjguOCAuMy01MiAyMy43LTUyIDUyLjUgMCAyNS43IDE4LjUgNDcuNiA0My45IDUxLjhsNDEuNyA3YzYgMSAxMC40IDYuMiAxMC40IDEyLjMgMCA2LjktNS42IDEyLjUtMTIuNSAxMi41TDI0OCAyNzJjLTExIDAtMjAgOS0yMCAyMHM5IDIwIDIwIDIwbDI0IDAgMCA0YzAgMTEgOSAyMCAyMCAyMHMyMC05IDIwLTIwbDAtNC43YzI1LTQuMSA0NC0yNS43IDQ0LTUxLjggMC0yNS43LTE4LjUtNDcuNi00My45LTUxLjhsLTQxLjctN2MtNi0xLTEwLjQtNi4yLTEwLjQtMTIuMyAwLTYuOSA1LjYtMTIuNSAxMi41LTEyLjVsNDcuNSAwYzExIDAgMjAtOSAyMC0yMHMtOS0yMC0yMC0yMGwtOCAwIDAtNGMwLTExLTktMjAtMjAtMjBzLTIwIDktMjAgMjB6TTQ4IDM0NGwwIDEwNGMwIDguOCA3LjIgMTYgMTYgMTZsNDQ4IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMTA0YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCAxMDRjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDM0NGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0eiJdCiAgICB9OwogICAgZmFEb25hdGUgPSBmYUNpcmNsZURvbGxhclRvU2xvdDsKICAgIGZhWSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ5IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTIxXSwgIjU5IiwgIk01OCA0NS40QzQ3LjggMzEgMjcuOCAyNy43IDEzLjQgMzhTLTQuMyA2OC4yIDYgODIuNkwxNjAgMjk4LjMgMTYwIDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTQ5LjcgMTU0LTIxNS43YzEwLjMtMTQuNCA2LjktMzQuNC03LjQtNDQuNlMzMzYuMiAzMSAzMjYgNDUuNEwxOTIgMjMyLjkgNTggNDUuNHoiXQogICAgfTsKICAgIGZhRmFjZVNtaWxlV2luazIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1zbWlsZS13aW5rIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTIxLCAic21pbGUtd2luayJdLCAiZjRkYSIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTE2NS40IDMyMS45YzIwLjQgMjggNTMuNCA0Ni4xIDkwLjYgNDYuMXM3MC4yLTE4LjEgOTAuNi00Ni4xYzcuOC0xMC43IDIyLjgtMTMuMSAzMy41LTUuM3MxMy4xIDIyLjggNS4zIDMzLjVDMzU2LjMgMzkwIDMwOS4yIDQxNiAyNTYgNDE2cy0xMDAuMy0yNi0xMjkuNC02NS45Yy03LjgtMTAuNy01LjQtMjUuNyA1LjMtMzMuNXMyNS43LTUuNCAzMy41IDUuM3pNMTQ0IDIwOGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0xNjQgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBjMC0zMy4xIDI2LjktNjAgNjAtNjBsMTYgMGMzMy4xIDAgNjAgMjYuOSA2MCA2MCAwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjAtOS0yMC0yMC0yMGwtMTYgMGMtMTEgMC0yMCA5LTIwIDIweiJdCiAgICB9OwogICAgZmFTbWlsZVdpbmsyID0gZmFGYWNlU21pbGVXaW5rMjsKICAgIGZhRGljZUZvdXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZGljZS1mb3VyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbOTg1OV0sICJmNTI0IiwgIk0wIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NnptMTYwIDY0YTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6TTEyOCAzODRhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0ek0zNTIgMTYwYTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6TTMyMCAzODRhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFGYWNlR3JpblNxdWludFRlYXJzMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWdyaW4tc3F1aW50LXRlYXJzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI5MzE1LCAiZ3Jpbi1zcXVpbnQtdGVhcnMiXSwgImY1ODYiLCAiTTU2MCAzNS40YzAgMjUuNi0xOC44IDQ3LjMtNDQuMSA1MC45TDQ2OS4xIDkzYy0xMC42IDEuNS0xOS42LTcuNS0xOC4xLTE4LjFsNi43LTQ2LjdDNDYxLjMgMi44IDQ4My0xNiA1MDguNi0xNiA1MzctMTYgNTYwIDcgNTYwIDM1LjR6TTQwMy41IDY4LjFjLTYgNDIuMiAzMC4yIDc4LjQgNzIuNCA3Mi40bDM3LjgtNS40QzU2NS43IDIzMiA1NTAuOCAzNTUuMyA0NjkgNDM3cy0yMDUgOTYuNi0zMDEuOSA0NC43bDUuNC0zNy44YzYtNDIuMi0zMC4yLTc4LjQtNzIuNC03Mi40bC0zNy44IDUuNEMxMC4zIDI4MCAyNS4yIDE1Ni43IDEwNyA3NVMzMTItMjEuNyA0MDguOSAzMC4zbC01LjQgMzcuOHpNNDE3LjggMjAxYy0xOS4xIDM2LjQtNDUuNiA3Mi43LTc4LjkgMTA2cy02OS42IDU5LjgtMTA2IDc4LjljLTExLjEgNS44LTEyLjQgMjEuNC0xLjEgMjYuNiA1OS4yIDI3LjUgMTMxLjggMTYuOCAxODAuNi0zMnM1OS41LTEyMS40IDMyLTE4MC42Yy01LjMtMTEuMy0yMC44LTEwLTI2LjYgMS4xek0xMTMuOSAyNzAuNmMxLjcgOCA5IDEzLjQgMTcuMSAxMi43bDQzLjEtMy45LTMuOSA0My4xYy0uNyA4LjEgNC43IDE1LjUgMTIuNyAxNy4xczE1LjktMi45IDE4LjQtMTAuNmwyOC04NC42YzEuOS01LjcgLjQtMTIuMS0zLjktMTYuM3MtMTAuNi01LjgtMTYuMy0zLjlsLTg0LjYgMjhjLTcuNyAyLjYtMTIuMyAxMC41LTEwLjYgMTguNXpNMzE1LjIgOTkuMWMuNy04LjEtNC43LTE1LjUtMTIuNy0xNy4xcy0xNS45IDIuOS0xOC41IDEwLjZsLTI4IDg0LjZjLTEuOSA1LjctLjQgMTIuMSAzLjkgMTYuM3MxMC42IDUuOCAxNi4zIDMuOWw4NC42LTI4YzcuNy0yLjYgMTIuMy0xMC41IDEwLjYtMTguNHMtOS0xMy40LTE3LjEtMTIuN2wtNDMuMSAzLjkgMy45LTQzLjF6TTYwLjEgNDI1LjdsNDYuNy02LjdjMTAuNi0xLjUgMTkuNiA3LjUgMTguMSAxOC4xbC02LjcgNDYuN0MxMTQuNyA1MDkuMiA5MyA1MjggNjcuNCA1MjggMzkgNTI4IDE2IDUwNSAxNiA0NzYuNiAxNiA0NTEgMzQuOCA0MjkuMyA2MC4xIDQyNS43eiJdCiAgICB9OwogICAgZmFHcmluU3F1aW50VGVhcnMyID0gZmFGYWNlR3JpblNxdWludFRlYXJzMjsKICAgIGZhRmlsZUF1ZGlvMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLWF1ZGlvIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYxYzciLCAiTTAgNjRDMCAyOC43IDI4LjcgMCA2NCAwTDIxMy41IDBjMTcgMCAzMy4zIDYuNyA0NS4zIDE4LjdMMzY1LjMgMTI1LjNjMTIgMTIgMTguNyAyOC4zIDE4LjcgNDUuM0wzODQgNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA2NHptMjA4LTUuNWwwIDkzLjVjMCAxMy4zIDEwLjcgMjQgMjQgMjRMMzI1LjUgMTc2IDIwOCA1OC41em01My44IDE4NS4yYy05LjEtNi4zLTIxLjUtNC4xLTI3LjggNXMtNC4xIDIxLjUgNSAyNy44YzIzLjkgMTYuNyAzOS40IDQ0LjMgMzkuNCA3NS41cy0xNS42IDU4LjktMzkuNCA3NS41Yy05LjEgNi4zLTExLjMgMTguOC01IDI3LjhzMTguOCAxMS4zIDI3LjggNWMzNC4xLTIzLjggNTYuNi02My41IDU2LjYtMTA4LjNTMjk2IDI2Ny41IDI2MS44IDI0My43ek04MCAzMTJjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDQ4YzAgOC44IDcuMiAxNiAxNiAxNmwyNCAwIDI3LjIgMzRjMyAzLjggNy42IDYgMTIuNSA2bC4zIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMTI4YzAtOC44LTcuMi0xNi0xNi0xNmwtLjMgMGMtNC45IDAtOS41IDIuMi0xMi41IDZsLTI3LjIgMzQtMjQgMHptMTI4IDcyLjJjMCAxMC43IDEwLjUgMTguMiAxOC45IDExLjYgMTIuOS0xMC4zIDIxLjEtMjYuMSAyMS4xLTQzLjhzLTguMi0zMy41LTIxLjEtNDMuOGMtOC40LTYuNy0xOC45IC45LTE4LjkgMTEuNmwwIDY0LjV6Il0KICAgIH07CiAgICBmYUFycm93c0Rvd25Ub0xpbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3dzLWRvd24tdG8tbGluZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNGI4IiwgIk0yMTQuNiAzMTAuNmwtNjQgNjRjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwbC02NC02NGMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMEw5NiAyNzQuNyA5NiAzMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMjQyLjcgOS40LTkuNGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zem0yNTYgMGwtNjQgNjRjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwbC02NC02NGMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMGw5LjQgOS40IDAtMjQyLjdjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDI0Mi43IDkuNC05LjRjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM3pNMzIgNTEyYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDQ0OCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDUxMnoiXQogICAgfTsKICAgIGZhRyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTAzXSwgIjQ3IiwgIk0yMjQgOTZDMTM1LjYgOTYgNjQgMTY3LjYgNjQgMjU2czcxLjYgMTYwIDE2MCAxNjBjNzcuNCAwIDE0Mi01NSAxNTYuOC0xMjhMMjU2IDI4OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxNDQgMGMyNS44IDAgNDkuNiAyMS40IDQ3LjIgNTAuNi05LjUgMTE1LTEwNS44IDIwNS40LTIyMy4yIDIwNS40LTEyMy43IDAtMjI0LTEwMC4zLTIyNC0yMjRTMTAwLjMgMzIgMjI0IDMyYzU3LjQgMCAxMDkuNyAyMS42IDE0OS4zIDU3IDEzLjIgMTEuOCAxNC4zIDMyIDIuNSA0NS4ycy0zMiAxNC4zLTQ1LjIgMi41QzMwMi4zIDExMS40IDI2NSA5NiAyMjQgOTZ6Il0KICAgIH07CiAgICBmYVZpaGFyYSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ2aWhhcmEiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjZhNyIsICJNMjczLjYtMy4yYzguNS02LjQgMjAuMy02LjQgMjguOCAwTDQ0My4yIDEwMi40YzguMyA2LjIgMTguNCA5LjYgMjguOCA5LjYgMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTI0IDAgMCA0OCA1OC43IDY0IDEzLjMgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtOCAwIDAgNDggMjQuNCAzMiAxNS42IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTQwIDAgMCAzMmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTMyLTEyOCAwIDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0zMi0xMjggMCAwIDMyYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMzItNDAgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwyMi4xIDAgMTcuOS0zMiAwLTQ4LTggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxMy4zIDAgNTguNy02NCAwLTQ4LTI0IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRjMTAuNCAwIDIwLjUtMy40IDI4LjgtOS42TDI3My42LTMuMnpNMTI4IDM2OGwzMjAgMCAwLTQ4LTMyMCAwIDAgNDh6TTM4NCAxNjBsLTE5MiAwIDAgNDggMTkyIDAgMC00OHoiXQogICAgfTsKICAgIGZhRmxhZ0NoZWNrZXJlZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmbGFnLWNoZWNrZXJlZCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyNzkzN10sICJmMTFlIiwgIk0zMiAwQzQ5LjcgMCA2NCAxNC4zIDY0IDMybDAgMTYgNjktMTcuMmMzOC4xLTkuNSA3OC4zLTUuMSAxMTMuNSAxMi41IDQ2LjMgMjMuMiAxMDAuOCAyMy4yIDE0Ny4xIDBsOS42LTQuOEM0MjMuOCAyOC4xIDQ0OCA0My4xIDQ0OCA2Ni4xbDAgMjc5LjdjMCAxMy4zLTguMyAyNS4zLTIwLjggMzBsLTM0LjcgMTNjLTQ2LjIgMTcuMy05Ny42IDE0LjYtMTQxLjctNy40LTM3LjktMTktODEuNC0yMy43LTEyMi41LTEzLjRMNjQgMzg0IDY0IDQ4MGMwIDE3LjctMTQuMyAzMi0zMiAzMlMwIDQ5Ny43IDAgNDgwTDAgMzJDMCAxNC4zIDE0LjMgMCAzMiAwek02NCAxODcuMWw2NC0xMy45IDAgNjUuNS02NCAxMy45IDAgNjUuNSA0OC44LTEyLjJjNS4xLTEuMyAxMC4xLTIuNCAxNS4yLTMuM2wwLTYzLjkgMzguOS04LjRjOC4zLTEuOCAxNi43LTIuNSAyNS4xLTIuMWwwLTY0YzEzLjYgLjQgMjcuMiAyLjYgNDAuNCA2LjRsMjMuNiA2LjkgMCA2Ni43LTQxLjctMTIuM2MtNy4zLTIuMS0xNC44LTMuNC0yMi4zLTMuOGwwIDcxLjRjMjEuOCAxLjkgNDMuMyA2LjcgNjQgMTQuNGwwLTY5LjggMjIuNyA2LjdjMTMuNSA0IDI3LjMgNi40IDQxLjMgNy40bDAtNjQuMmMtNy44LS44LTE1LjYtMi4zLTIzLjItNC41bC00MC44LTEyIDAtNjJjLTEzLTMuOC0yNS44LTguOC0zOC4yLTE1LTguMi00LjEtMTYuOS03LTI1LjgtOC44bDAgNzIuNGMtMTMtLjQtMjYgLjgtMzguNyAzLjZsLTI1LjMgNS41IDAtNzUuMi02NCAxNiAwIDczLjF6TTMyMCAzMzUuN2MxNi44IDEuNSAzMy45LS43IDUwLTYuOGwxNC01LjIgMC03MS43LTcuOSAxLjhjLTE4LjQgNC4zLTM3LjMgNS43LTU2LjEgNC41bDAgNzcuNHptNjQtMTQ5LjRsMC03MC44Yy0yMC45IDYuMS00Mi40IDkuMS02NCA5LjFsMCA2OS40YzEzLjkgMS40IDI4IC41IDQxLjctMi42bDIyLjMtNS4yeiJdCiAgICB9OwogICAgZmFHYXVnZVNpbXBsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnYXVnZS1zaW1wbGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiZ2F1Z2Utc2ltcGxlLW1lZCIsICJ0YWNob21ldGVyLWF2ZXJhZ2UiXSwgImY2MjkiLCAiTTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTMyMCA5NmMwLTI2LjktMTYuNS00OS45LTQwLTU5LjNMMjgwIDEyMGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDE3Mi43Yy0yMy41IDkuNS00MCAzMi41LTQwIDU5LjMgMCAzNS4zIDI4LjcgNjQgNjQgNjRzNjQtMjguNyA2NC02NHoiXQogICAgfTsKICAgIGZhR2F1Z2VTaW1wbGVNZWQgPSBmYUdhdWdlU2ltcGxlOwogICAgZmFUYWNob21ldGVyQXZlcmFnZSA9IGZhR2F1Z2VTaW1wbGU7CiAgICBmYVJpZ2h0TGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyaWdodC1sZWZ0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImV4Y2hhbmdlLWFsdCJdLCAiZjM2MiIsICJNNTAyLjYgMTUwLjZsLTk2IDk2Yy05LjIgOS4yLTIyLjkgMTEuOS0zNC45IDYuOVMzNTIgMjM2LjkgMzUyIDIyNGwwLTY0LTMyMCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMlMxNC4zIDk2IDMyIDk2bDMyMCAwIDAtNjRjMC0xMi45IDcuOC0yNC42IDE5LjgtMjkuNnMyNS43LTIuMiAzNC45IDYuOWw5NiA5NmMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3ptLTM5Ny4zIDM1MmwtOTYtOTZjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zbDk2LTk2YzkuMi05LjIgMjIuOS0xMS45IDM0LjktNi45UzE2MCAyNzUuMSAxNjAgMjg4bDAgNjQgMzIwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTMyMCAwIDAgNjRjMCAxMi45LTcuOCAyNC42LTE5LjggMjkuNnMtMjUuNyAyLjItMzQuOS02Ljl6Il0KICAgIH07CiAgICBmYUV4Y2hhbmdlQWx0ID0gZmFSaWdodExlZnQ7CiAgICBmYVBpbGxzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBpbGxzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0ODQiLCAiTTY0IDExMmMwLTI2LjUgMjEuNS00OCA0OC00OHM0OCAyMS41IDQ4IDQ4bDAgMTEyLTk2IDAgMC0xMTJ6TTE3NiAzNjhjMC00OC43IDE4LjEtOTMuMiA0OC0xMjdsMC0xMjlDMjI0IDUwLjEgMTczLjkgMCAxMTIgMFMwIDUwLjEgMCAxMTJMMCA0MDBjMCA2MS45IDUwLjEgMTEyIDExMiAxMTIgMzcuMyAwIDcwLjMtMTguMiA5MC43LTQ2LjMtMTctMjguNi0yNi43LTYyLTI2LjctOTcuN3ptNjQuNyA2Ny40YzQuNiA4LjcgMTYuMyA5LjcgMjMuMyAyLjdMNDM4LjEgMjY0YzctNyA2LTE4LjctMi43LTIzLjMtMjAuMS0xMC43LTQzLTE2LjctNjcuNC0xNi43LTc5LjUgMC0xNDQgNjQuNS0xNDQgMTQ0IDAgMjQuMyA2IDQ3LjMgMTYuNyA2Ny40ek0yOTcuOSA0NzJjLTcgNy02IDE4LjcgMi43IDIzLjMgMjAuMSAxMC43IDQzIDE2LjcgNjcuNCAxNi43IDc5LjUgMCAxNDQtNjQuNSAxNDQtMTQ0IDAtMjQuMy02LTQ3LjMtMTYuNy02Ny40LTQuNi04LjctMTYuMy05LjctMjMuMy0yLjdMMjk3LjkgNDcyeiJdCiAgICB9OwogICAgZmFFeHBsb3Npb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZXhwbG9zaW9uIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU0ZTkiLCAiTTI1Ni0zMmMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNDhjMC0xMy4zIDEwLjctMjQgMjQtMjR6bTAgMTYwYzEyLjQgMCAyMi43IDkuNCAyMy45IDIxLjdMMjkzLjQgMjkxLjYgNDY3LjYgMTEuM2M2LjctMTAuNyAyMC41LTE0LjUgMzEuNy04LjVzMTUuOCAxOS41IDEwLjYgMzFMMzcyLjggMzM4LjZjMi4yIDIuMyA0LjMgNC43IDYuMyA3LjFsOTcuMi01NC43YzEwLjUtNS45IDIzLjYtMy4xIDMwLjkgNi40czYuMyAyMy0yLjIgMzEuNWwtODcgODctNzEuNCAwYy0xMy4yLTM3LjMtNDguNy02NC05MC41LTY0cy03Ny40IDI2LjctOTAuNSA2NGwtNzkuNiAwLTc1LjUtNTIuM0MuNiAzNTctMi44IDM0NC4xIDIuNCAzMzMuNXMxNy40LTE1LjkgMjguNy0xMi40bDk3LjIgMzAuNGMzLTMuOSA2LjEtNy42IDkuNC0xMS4zTDc1LjQgMjM2LjNjLTYuMS0xMC4xLTMuOS0yMy4xIDUuMS0zMC43czIyLjItNy41IDMxLjEgLjFMMjE0IDI5My42YzEuNS0uNCAzLS44IDQuNS0xLjFsMTMuNi0xNDIuN2MxLjItMTIuMyAxMS41LTIxLjcgMjMuOS0yMS43ek0zMiA0NjRsNDU2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRMMjQgNTEyYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDggMHoiXQogICAgfTsKICAgIGZhQXJyb3dzRG93blRvUGVvcGxlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93cy1kb3duLXRvLXBlb3BsZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNGI5IiwgIk0xMTMgMTUzYy05LjQgOS40LTI0LjYgOS40LTMzLjkgMEwxNSA4OUM1LjcgNzkuNiA1LjcgNjQuNCAxNSA1NVMzOS42IDQ1LjcgNDkgNTVMNzIgNzguMSA3Mi04YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA4Ni4xIDIzLTIzYzkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOWwtNjQgNjR6bTMyMCAwYy05LjQgOS40LTI0LjYgOS40LTMzLjkgMEwzMzUgODljLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGwyMyAyMyAwLTg2LjFjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDg2LjEgMjMtMjNjOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45bC02NCA2NHpNMjU2IDE5MmE1NiA1NiAwIDEgMSAwIDExMiA1NiA1NiAwIDEgMSAwLTExMnptMCAxNjBjNTMgMCA5NiA0MyA5NiA5NmwwIDMyYzAgMTcuNy0xNC4zIDMyLTMyIDMybC0xMjggMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0zMmMwLTUzIDQzLTk2IDk2LTk2ek0zMiAyODhhNDggNDggMCAxIDEgOTYgMCA0OCA0OCAwIDEgMSAtOTYgMHptMzUyIDBhNDggNDggMCAxIDEgOTYgMCA0OCA0OCAwIDEgMSAtOTYgMHpNODAgMzY4YzE1LjMgMCAyOS42IDQuMyA0MS44IDExLjgtNi4zIDE2LjItOS44IDMzLjgtOS44IDUyLjJsMCA0OGMwIDExLjQgMi40IDIyLjIgNi43IDMybC04Ny44IDBDMTMuOCA1MTIgMCA0OTguMiAwIDQ4MS4xTDAgNDQ4YzAtNDQuMiAzNS44LTgwIDgwLTgwek0zOTMuMyA1MTJjNC4zLTkuOCA2LjctMjAuNiA2LjctMzJsMC00OGMwLTE4LjQtMy41LTM2LTkuOC01Mi4yIDEyLjItNy41IDI2LjUtMTEuOCA0MS44LTExLjggNDQuMiAwIDgwIDM1LjggODAgODBsMCAzMy4xYzAgMTctMTMuOCAzMC45LTMwLjkgMzAuOWwtODcuOCAweiJdCiAgICB9OwogICAgZmFVc2Vyc1ZpZXdmaW5kZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlcnMtdmlld2ZpbmRlciIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTk1IiwgIk02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NGwwIDcyYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC03MmMwLTguOCA3LjItMTYgMTYtMTZsNzIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNFMxNDkuMyAwIDEzNiAwTDY0IDB6TTQ0MCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDcyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgNzJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTcyYzAtMzUuMy0yOC43LTY0LTY0LTY0TDQ0MCAwek00OCAzNzZjMC0xMy4zLTEwLjctMjQtMjQtMjRTMCAzNjIuNyAwIDM3NmwwIDcyYzAgMzUuMyAyOC43IDY0IDY0IDY0bDcyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTcyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTcyem01MjggMGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDcyYzAgOC44LTcuMiAxNi0xNiAxNmwtNzIgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw3MiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtNzJ6TTI4OCAyMTZhNTYgNTYgMCAxIDAgMC0xMTIgNTYgNTYgMCAxIDAgMCAxMTJ6bTAgNDBjLTUzIDAtOTYgNDMtOTYgOTZsMCAyNGMwIDEzLjMgMTAuNyAyNCAyNCAyNGwxNDQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTI0YzAtNTMtNDMtOTYtOTYtOTZ6bTE5Mi02NGE0OCA0OCAwIDEgMCAtOTYgMCA0OCA0OCAwIDEgMCA5NiAwek0xNjggMjcyLjNjLTQ5LjMgNC4xLTg4IDQ1LjMtODggOTUuN2wwIDEwLjdjMCAxMS44IDkuNiAyMS4zIDIxLjMgMjEuM2w0Ni44IDBjLTIuNy03LjUtNC4xLTE1LjYtNC4xLTI0bDAtMjRjMC0yOS41IDguOC01Ni45IDI0LTc5Ljd6TTQyNy45IDQwMGw0Ni44IDBjMTEuOCAwIDIxLjMtOS42IDIxLjMtMjEuM2wwLTEwLjdjMC01MC4zLTM4LjctOTEuNi04OC05NS43IDE1LjIgMjIuOCAyNCA1MC4yIDI0IDc5LjdsMCAyNGMwIDguNC0xLjQgMTYuNS00LjEgMjR6TTE5MiAxOTJhNDggNDggMCAxIDAgLTk2IDAgNDggNDggMCAxIDAgOTYgMHoiXQogICAgfTsKICAgIGZhQ2FyT24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FyLW9uIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU0ZGQiLCAiTTI0OC04YzAtMTMuMy0xMC43LTI0LTI0LTI0UzIwMC0yMS4zIDIwMC04bDAgNjRjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTY0ek0xNDUuMyAyMDhsMTU3LjUgMGM2LjcgMCAxMi42IDQuMSAxNSAxMC40bDI2LjEgNjkuNi0yMzkuNiAwIDI2LjEtNjkuNmMyLjMtNi4yIDguMy0xMC40IDE1LTEwLjR6TTM0IDI5Mi44bC0xLjMgMy40QzEzLjIgMzA3LjEgMCAzMjggMCAzNTJMMCA0ODBjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTMyIDI4OCAwIDAgMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTEyOGMwLTI0LTEzLjItNDQuOS0zMi44LTU1LjlsLTEuMy0zLjQtMzYuMy05Ni45Yy0xMS43LTMxLjItNDEuNi01MS45LTc0LjktNTEuOWwtMTU3LjUgMGMtMzMuMyAwLTYzLjIgMjAuNy03NC45IDUxLjlMMzQgMjkyLjh6TTk2IDMzNmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6bTIyNCAzMmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwek03IDdDLTIuMyAxNi40LTIuMyAzMS42IDcgNDFMNTUgODljOS40IDkuNCAyNC42IDkuNCAzMy45IDBTOTguMyA2NC40IDg5IDU1TDQxIDdDMzEuNi0yLjMgMTYuNC0yLjMgNyA3ek00MDcgN0wzNTkgNTVjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMGw0OC00OGM5LjQtOS40IDkuNC0yNC42IDAtMzMuOVM0MTYuNC0yLjMgNDA3IDd6Il0KICAgIH07CiAgICBmYVNsZWlnaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzbGVpZ2giLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjdjYyIsICJNNjQgMzJDNDYuMyAzMiAzMiA0Ni4zIDMyIDY0UzQ2LjMgOTYgNjQgOTZsMCAxNjBjMCA0MS44IDI2LjcgNzcuNCA2NCA5MC41bDAgNjkuNS03MiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDUwNCAwYzQ0LjIgMCA4MC0zNS44IDgwLTgwbDAtOGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDhjMCAxNy43LTE0LjMgMzItMzIgMzJsLTgwIDAgMC02NGM1MyAwIDk2LTQzIDk2LTk2bDAtOTZjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTMyIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgMzJjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTQ4LjkgMGMtNDguNSAwLTkyLjgtMjcuNC0xMTQuNS03MC44bC0yNS4yLTUwLjVDMjM3LjcgNTkuNCAxOTMuNCAzMiAxNDQuOSAzMkw2NCAzMnpNNDMyIDQxNmwtMjU2IDAgMC02NCAyNTYgMCAwIDY0eiJdCiAgICB9OwogICAgZmFEdW1iYmVsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkdW1iYmVsbCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNDRiIiwgIk05NiAxMTJjMC0yNi41IDIxLjUtNDggNDgtNDhzNDggMjEuNSA0OCA0OGwwIDExMiAyNTYgMCAwLTExMmMwLTI2LjUgMjEuNS00OCA0OC00OHM0OCAyMS41IDQ4IDQ4bDAgMTYgMTYgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDQ4YzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybDAgNDhjMCAyNi41LTIxLjUgNDgtNDggNDhsLTE2IDAgMCAxNmMwIDI2LjUtMjEuNSA0OC00OCA0OHMtNDgtMjEuNS00OC00OGwwLTExMi0yNTYgMCAwIDExMmMwIDI2LjUtMjEuNSA0OC00OCA0OHMtNDgtMjEuNS00OC00OGwwLTE2LTE2IDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtNDhjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMC00OGMwLTI2LjUgMjEuNS00OCA0OC00OGwxNiAwIDAtMTZ6Il0KICAgIH07CiAgICBmYUJhYnlDYXJyaWFnZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYWJ5LWNhcnJpYWdlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImNhcnJpYWdlLWJhYnkiXSwgImY3N2QiLCAiTTY0IDIwOGwwIDgwYzAgNTMgNDMgOTYgOTYgOTZsMTkyIDBjNTMgMCA5Ni00MyA5Ni05NmwwLTExMiA0MCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC02NCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDU2LTMzNiAwem0uMi00OGwyMjMuOCAwIDAtMTI4YzAtMTcuNy0xNC4zLTMyLTMyLTMyTDIzMiAwQzE0MS45IDAgNjguNCA3MC45IDY0LjIgMTYwek0xNjAgNDY0YTQ4IDQ4IDAgMSAwIC05NiAwIDQ4IDQ4IDAgMSAwIDk2IDB6bTI4OCAwYTQ4IDQ4IDAgMSAwIC05NiAwIDQ4IDQ4IDAgMSAwIDk2IDB6Il0KICAgIH07CiAgICBmYUNhcnJpYWdlQmFieSA9IGZhQmFieUNhcnJpYWdlOwogICAgZmFLaXdpQmlyZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJraXdpLWJpcmQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjUzNSIsICJNMjkxLjIgMzg4LjRjMzEuMi0xOC44IDY0LjctMzYuNCAxMDEuMS0zNi40bDU1LjcgMGM0LjYgMCA5LjEtLjIgMTMuNi0uN2w4NS4zIDEyMS45YzQgNS43IDExLjMgOC4yIDE3LjkgNi4xUzU3NiA0NzEgNTc2IDQ2NGwwLTI0MGMwLTcwLjctNTcuMy0xMjgtMTI4LTEyOGwtNTUuNyAwQzM1NS45IDk2IDMyMi40IDc4LjQgMjkxLjIgNTkuNiAyNjIuMyA0Mi4xIDIyOC4zIDMyIDE5MiAzMiA4NiAzMiAwIDExOCAwIDIyNCAwIDI5NS4xIDM4LjYgMzU3LjEgOTYgMzkwLjNMOTYgNDU2YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC00NmMxNS4zIDMuOSAzMS40IDYgNDggNiA1LjQgMCAxMC43LS4yIDE2LS43bDAgNDAuN2MwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNTAuOWMxMi40LTQuNCAyNC4yLTEwIDM1LjItMTYuN3pNNDQ4IDIwMGEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6Il0KICAgIH07CiAgICBmYUNhbGVuZGFyWG1hcmsyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhbGVuZGFyLXhtYXJrIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImNhbGVuZGFyLXRpbWVzIl0sICJmMjczIiwgIk0xMjggMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDMyIDEyOCAwIDAtMzJjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDMyIDMyIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyODhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGwzMiAwIDAtMzJjMC0xNy43IDE0LjMtMzIgMzItMzJ6TTI5MS45IDIyMC4xYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMGwtMzMuOSAzMy45LTMzLjktMzMuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWwzMy45IDMzLjktMzMuOSAzMy45Yy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBsMzMuOS0zMy45IDMzLjkgMzMuOWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTMzLjktMzMuOSAzMy45LTMzLjljOS40LTkuNCA5LjQtMjQuNiAwLTMzLjl6Il0KICAgIH07CiAgICBmYUNhbGVuZGFyVGltZXMyID0gZmFDYWxlbmRhclhtYXJrMjsKICAgIGZhQ2lyY2xlRG93bjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLWRvd24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MTQ2NiwgImFycm93LWFsdC1jaXJjbGUtZG93biJdLCAiZjM1OCIsICJNMjU2IDBhMjU2IDI1NiAwIDEgMCAwIDUxMiAyNTYgMjU2IDAgMSAwIDAtNTEyek0yNDQuNyAzODcuM2wtMTA0LTEwNGMtNC42LTQuNi01LjktMTEuNS0zLjUtMTcuNHM4LjMtOS45IDE0LjgtOS45bDU2IDAgMC05NmMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgOTYgNTYgMGM2LjUgMCAxMi4zIDMuOSAxNC44IDkuOXMxLjEgMTIuOS0zLjUgMTcuNGwtMTA0IDEwNGMtNi4yIDYuMi0xNi40IDYuMi0yMi42IDB6Il0KICAgIH07CiAgICBmYUFycm93QWx0Q2lyY2xlRG93bjIgPSBmYUNpcmNsZURvd24yOwogICAgZmFGaWxlTWVkaWNhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLW1lZGljYWwiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjQ3NyIsICJNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMMjEzLjUgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN0wzNjUuMyAxMjUuM2MxMiAxMiAxOC43IDI4LjMgMTguNyA0NS4zTDM4NCA0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDY0em0yMDgtNS41bDAgOTMuNWMwIDEzLjMgMTAuNyAyNCAyNCAyNEwzMjUuNSAxNzYgMjA4IDU4LjV6TTE2MCAyODBsMCA0MC00MCAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsNDAgMCAwIDQwYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTQwIDQwIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC00MCAwIDAtNDBjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6Il0KICAgIH07CiAgICBmYVhtYXJrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInhtYXJrIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4NDczLCAxMDAwNSwgMTAwMDYsIDEwMDYwLCAyMTUsICJjbG9zZSIsICJtdWx0aXBseSIsICJyZW1vdmUiLCAidGltZXMiXSwgImYwMGQiLCAiTTU1LjEgNzMuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNMMTQ3LjIgMjU2IDkuOSAzOTMuNGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMEwxOTIuNSAzMDEuMyAzMjkuOSA0MzguNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zTDIzNy44IDI1NiAzNzUuMSAxMTguNmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMEwxOTIuNSAyMTAuNyA1NS4xIDczLjR6Il0KICAgIH07CiAgICBmYUNsb3NlID0gZmFYbWFyazsKICAgIGZhTXVsdGlwbHkgPSBmYVhtYXJrOwogICAgZmFSZW1vdmUgPSBmYVhtYXJrOwogICAgZmFUaW1lcyA9IGZhWG1hcms7CiAgICBmYVNoYXBlcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaGFwZXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsidHJpYW5nbGUtY2lyY2xlLXNxdWFyZSJdLCAiZjYxZiIsICJNMjU2IDBjMTEuMiAwIDIxLjcgNS45IDI3LjQgMTUuNWw5NiAxNjBjNS45IDkuOSA2LjEgMjIuMiAuNCAzMi4yUzM2My41IDIyNCAzNTIgMjI0bC0xOTIgMGMtMTEuNSAwLTIyLjItNi4yLTI3LjgtMTYuMnMtNS41LTIyLjMgLjQtMzIuMmw5Ni0xNjBDMjM0LjMgNS45IDI0NC44IDAgMjU2IDB6TTEyOCAyNzJhMTEyIDExMiAwIDEgMSAwIDIyNCAxMTIgMTEyIDAgMSAxIDAtMjI0em0yMDAgMTZsMTEyIDBjMjIuMSAwIDQwIDE3LjkgNDAgNDBsMCAxMTJjMCAyMi4xLTE3LjkgNDAtNDAgNDBsLTExMiAwYy0yMi4xIDAtNDAtMTcuOS00MC00MGwwLTExMmMwLTIyLjEgMTcuOS00MCA0MC00MHoiXQogICAgfTsKICAgIGZhVHJpYW5nbGVDaXJjbGVTcXVhcmUgPSBmYVNoYXBlczsKICAgIGZhRGljZU9uZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkaWNlLW9uZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzk4NTZdLCAiZjUyNSIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnpNMjI0IDIyNGEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYUxvY2tPcGVuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxvY2stb3BlbiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmM2MxIiwgIk0zODQgOTZjMC0zNS4zIDI4LjctNjQgNjQtNjRzNjQgMjguNyA2NCA2NGwwIDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zMmMwLTcwLjctNTcuMy0xMjgtMTI4LTEyOFMzMjAgMjUuMyAzMjAgOTZsMCA2NC0xNjAgMGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCAyMjRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjU2IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yMjRjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTMyIDAgMC02NHoiXQogICAgfTsKICAgIGZhUGVwcGVySG90ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcHBlci1ob3QiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjc3OThdLCAiZjgxNiIsICJNNTQ1IDY1YzkuNC05LjQgOS40LTI0LjYgMC0zMy45cy0yNC42LTkuNC0zMy45IDBMNDc4LjkgNjMuMkM0NTIuMyA0My42IDQxOS41IDMyIDM4NCAzMiAzNDguOSAzMiAzMTYuNSA0My4zIDI5MC4xIDYyLjQgMjc0LjEgNzQuMSAyODQuMiA5NiAzMDQgOTZsMjQgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDgwYzAgMTMuMyAxMC43IDI0IDI0IDI0bDgwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCAyNGMwIDE5LjggMjEuOSAyOS45IDMzLjYgMTMuOSAxOS4xLTI2LjQgMzAuNC01OC44IDMwLjQtOTMuOSAwLTM1LjUtMTEuNi02OC4zLTMxLjItOTQuOUw1NDUgNjV6TTI3MCAxMzUuNWwtMTU5LjYgMjI4QzEwMS4zIDM3Ni40IDg2LjcgMzg0IDcxIDM4NGwtNyAwYy0yNi41IDAtNDggMjEuNS00OCA0OHMyMS41IDQ4IDQ4IDQ4bDI3LjEgMGM2NS43IDAgMTI5LjctMjAuMiAxODMuNS01Ny44TDQ0MC41IDMwNi4xQzQzNSAyOTUuOSA0MzIgMjg0LjIgNDMyIDI3MmwtNTYgMGMtMzkuOCAwLTcyLTMyLjItNzItNzJsMC01NmMtMTIuMiAwLTIzLjktMy0zNC04LjV6Il0KICAgIH07CiAgICBmYURyb3BsZXRTbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkcm9wbGV0LXNsYXNoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInRpbnQtc2xhc2giXSwgImY1YzciLCAiTTQxLTI0LjljLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwUy0yLjMtLjMgNyA5LjFsNTI4IDUyOGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlMNDYzLjYgMzk3LjhjMTAuNS0yMy44IDE2LjQtNTAuMSAxNi40LTc3LjggMC05MS4yLTEzMC4yLTI3NC4xLTE2Ni42LTMyMy41LTUuOS04LTE1LjItMTIuNS0yNS4yLTEyLjVsLS40IDBjLTEwIDAtMTkuMyA0LjUtMjUuMiAxMi41LTE1LjYgMjEuMi00OC41IDY2LjktODAuOSAxMTkuNEw0MS0yNC45em05MiAyMjcuN2MtMjEuNiA0My44LTM3IDg1LjktMzcgMTE3LjIgMCAxMDYgODYgMTkyIDE5MiAxOTIgNDMuNCAwIDgzLjQtMTQuNCAxMTUuNS0zOC42TDEzMyAyMDIuOHoiXQogICAgfTsKICAgIGZhVGludFNsYXNoID0gZmFEcm9wbGV0U2xhc2g7CiAgICBmYURyb3BsZXQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZHJvcGxldCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyODE2NywgInRpbnQiXSwgImYwNDMiLCAiTTE5MiA1MTJDODYgNTEyIDAgNDI2IDAgMzIwIDAgMjI4LjggMTMwLjIgNDUuOSAxNjYuNi0zLjUgMTcyLjUtMTEuNSAxODEuOC0xNiAxOTEuOC0xNmwuNCAwYzEwIDAgMTkuMyA0LjUgMjUuMiAxMi41IDM2LjQgNDkuNCAxNjYuNiAyMzIuMyAxNjYuNiAzMjMuNSAwIDEwNi04NiAxOTItMTkyIDE5MnpNMTEyIDMxMmMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGMwIDc1LjEgNjAuOSAxMzYgMTM2IDEzNiAxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGMtNDguNiAwLTg4LTM5LjQtODgtODh6Il0KICAgIH07CiAgICBmYVRpbnQgPSBmYURyb3BsZXQ7CiAgICBmYUZpbGVMaW5lczIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1saW5lcyIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyODQ0MSwgMTI4NDYyLCA2MTY4NiwgImZpbGUtYWx0IiwgImZpbGUtdGV4dCJdLCAiZjE1YyIsICJNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMMjEzLjUgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN0wzNjUuMyAxMjUuM2MxMiAxMiAxOC43IDI4LjMgMTguNyA0NS4zTDM4NCA0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDY0em0yMDgtNS41bDAgOTMuNWMwIDEzLjMgMTAuNyAyNCAyNCAyNEwzMjUuNSAxNzYgMjA4IDU4LjV6TTEyMCAyNTZjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTQ0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE0NCAwem0wIDk2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDE0NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xNDQgMHoiXQogICAgfTsKICAgIGZhRmlsZUFsdDIgPSBmYUZpbGVMaW5lczI7CiAgICBmYUZpbGVUZXh0MiA9IGZhRmlsZUxpbmVzMjsKICAgIGZhQ29tbWVudHNEb2xsYXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY29tbWVudHMtZG9sbGFyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY2NTMiLCAiTTE5MiAzMjBjMTA2IDAgMTkyLTc4LjggMTkyLTE3NlMyOTgtMzIgMTkyLTMyIDAgNDYuOCAwIDE0NGMwIDM5LjYgMTQuMyA3Ni4yIDM4LjQgMTA1LjZMMi44IDMxNi44Qy0yLjEgMzI2LjEtLjQgMzM3LjUgNyAzNDVzMTguOSA5LjIgMjguMiA0LjJMMTE2LjggMzA2YzIzLjEgOSA0OC41IDE0IDc1LjIgMTR6bTMuMiA0OGMxNi40IDgxLjkgOTQuNyAxNDQgMTg4LjggMTQ0IDI2LjcgMCA1Mi4xLTUgNzUuMi0xNGw4MS42IDQzLjJjOS4zIDQuOSAyMC43IDMuMiAyOC4yLTQuMnM5LjItMTguOSA0LjItMjguMmwtMzUuNi02Ny4yYzI0LjEtMjkuNCAzOC40LTY2IDM4LjQtMTA1LjYgMC04Mi40LTYxLjctMTUxLjUtMTQ1LTE3MC43LTExLjUgMTE1LjgtMTE1LjggMjAxLjItMjM1LjggMjAyLjd6TTE5NiAzMmMxMSAwIDIwIDkgMjAgMjBsMCA0IDggMGMxMSAwIDIwIDkgMjAgMjBzLTkgMjAtMjAgMjBsLTQ3LjUgMGMtNi45IDAtMTIuNSA1LjYtMTIuNSAxMi41IDAgNi4xIDQuNCAxMS4zIDEwLjQgMTIuM2w0MS43IDdjMjUuMyA0LjIgNDMuOSAyNi4xIDQzLjkgNTEuOCAwIDI2LjEtMTkgNDcuNy00NCA1MS44bDAgNC43YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLTQtMjQgMGMtMTEgMC0yMC05LTIwLTIwczktMjAgMjAtMjBsNTUuNSAwYzYuOSAwIDEyLjUtNS42IDEyLjUtMTIuNSAwLTYuMS00LjQtMTEuMy0xMC40LTEyLjNsLTQxLjctN2MtMjUuMy00LjItNDMuOS0yNi4xLTQzLjktNTEuOCAwLTI4LjggMjMuMi01Mi4yIDUyLTUyLjVsMC00YzAtMTEgOS0yMCAyMC0yMHoiXQogICAgfTsKICAgIGZhTWFnbmlmeWluZ0dsYXNzTG9jYXRpb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFnbmlmeWluZy1nbGFzcy1sb2NhdGlvbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJzZWFyY2gtbG9jYXRpb24iXSwgImY2ODkiLCAiTTQxNiAyMDhjMCA0NS45LTE0LjkgODguMy00MCAxMjIuN0w1MDIuNiA0NTcuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMEwzMzAuNyAzNzZDMjk2LjMgNDAxLjEgMjUzLjkgNDE2IDIwOCA0MTYgOTMuMSA0MTYgMCAzMjIuOSAwIDIwOFM5My4xIDAgMjA4IDAgNDE2IDkzLjEgNDE2IDIwOHpNMjg4IDE3NmMwLTQ0LjItMzUuOC04MC04MC04MHMtODAgMzUuOC04MCA4MGMwIDQ4LjggNDYuNSAxMTEuNiA2OC42IDEzOC42IDYgNy4zIDE2LjggNy4zIDIyLjcgMCAyMi4xLTI3IDY4LjYtODkuOCA2OC42LTEzOC42em0tMTEyIDBhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHoiXQogICAgfTsKICAgIGZhU2VhcmNoTG9jYXRpb24gPSBmYU1hZ25pZnlpbmdHbGFzc0xvY2F0aW9uOwogICAgZmFGaWxlSW52b2ljZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLWludm9pY2UiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjU3MCIsICJNNjQgMEMyOC43IDAgMCAyOC43IDAgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjU2IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNzcuNWMwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0wyNTguNyAxOC43QzI0Ni43IDYuNyAyMzAuNSAwIDIxMy41IDBMNjQgMHpNMzI1LjUgMTc2TDIzMiAxNzZjLTEzLjMgMC0yNC0xMC43LTI0LTI0TDIwOCA1OC41IDMyNS41IDE3NnpNNjQgMzg0bDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJsMTkyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMkw5NiA0MTZjLTE3LjcgMC0zMi0xNC4zLTMyLTMyek04OCA2NGw0OCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC00OCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNFM3NC43IDY0IDg4IDY0em0wIDk2bDQ4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTQ4IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYVBlbnRhZ29uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlbnRhZ29uIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU3OTAiLCAiTTMxNi40LTMuMWMtMTYuOC0xMi4yLTM5LjYtMTIuMi01Ni40IDBMMzUuMyAxNjAuMmMtMTYuOCAxMi4yLTIzLjkgMzMuOS0xNy40IDUzLjdsODUuOCAyNjQuMWM2LjQgMTkuOCAyNC45IDMzLjIgNDUuNyAzMy4ybDI3Ny43IDBjMjAuOCAwIDM5LjItMTMuNCA0NS43LTMzLjJsODUuOC0yNjQuMWM2LjQtMTkuOC0uNi00MS40LTE3LjQtNTMuN0wzMTYuNC0zLjF6Il0KICAgIH07CiAgICBmYVJlcHVibGljYW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicmVwdWJsaWNhbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNzVlIiwgIk0wIDE5MkMwIDEwMy42IDcxLjYgMzIgMTYwIDMybDIyNCAwYzg4LjQgMCAxNjAgNzEuNiAxNjAgMTYwbDAgNjQtNTQ0IDAgMC02NHptMTUyLTMyYTI0IDI0IDAgMSAwIC00OCAwIDI0IDI0IDAgMSAwIDQ4IDB6bTIzMiAyNGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6TTI4MCAxNjBhMjQgMjQgMCAxIDAgLTQ4IDAgMjQgMjQgMCAxIDAgNDggMHpNMTI4IDI4OGw0MTYgMCAwIDExMmMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtNDhjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDQ4YzAgNDQuMi0zNS44IDgwLTgwIDgwcy04MC0zNS44LTgwLTgwbDAtNDgtMzIgMCAwIDk2YzAgMTcuNy0xNC4zIDMyLTMyIDMybC02NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTY0LTE5MiAwIDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTYwIDEyOCAweiJdCiAgICB9OwogICAgZmFTaG9wID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNob3AiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsic3RvcmUtYWx0Il0sICJmNTRmIiwgIk0yMS41IDE4MS4xTDc4LjMgNjcuNEM4OS4yIDQ1LjcgMTExLjMgMzIgMTM1LjYgMzJsMzA0LjkgMGMyNC4yIDAgNDYuNCAxMy43IDU3LjIgMzUuNGw1Ni44IDExMy43YzMuNiA3LjIgNS41IDE1LjEgNS41IDIzLjIgMCAyNy4zLTIxLjIgNDkuNy00OCA1MS42TDUxMiA0NDhjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xOTItOTYgMCAwIDE3NmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTkyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMTc2LjFjLTI2LjgtMS45LTQ4LTI0LjMtNDgtNTEuNiAwLTggMS45LTE2IDUuNS0yMy4yek0xMjggMjU2bDAgMTEyYzAgOC44IDcuMiAxNiAxNiAxNmwxMjggMGM4LjggMCAxNi03LjIgMTYtMTZsMC0xMTItMTYwIDB6Il0KICAgIH07CiAgICBmYVN0b3JlQWx0ID0gZmFTaG9wOwogICAgZmFGaWxtID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbG0iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjc5MDIsIDYyMzY4LCAiZmlsbS1hbHQiLCAiZmlsbS1zaW1wbGUiXSwgImYwMDgiLCAiTTAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMzIwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2ek00OCAzNjhsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnptMzA0LTE2Yy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDB6TTQ4IDI0MGwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2em0zMDQtMTZjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHpNNDggMTEybDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2TDY0IDk2Yy04LjggMC0xNiA3LjItMTYgMTZ6TTM1MiA5NmMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAweiJdCiAgICB9OwogICAgZmFGaWxtQWx0ID0gZmFGaWxtOwogICAgZmFGaWxtU2ltcGxlID0gZmFGaWxtOwogICAgZmFCdWlsZGluZ0NpcmNsZVhtYXJrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJ1aWxkaW5nLWNpcmNsZS14bWFyayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNGQ0IiwgIk05NiAwQzYwLjcgMCAzMiAyOC43IDMyIDY0bDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE4MCAwYy0xMC41LTE0LjYtMTktMzAuNy0yNS4xLTQ4bC03NC45IDAgMC04MGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzMiAwYzIgMCA0IC4yIDUuOSAuNSA2LTIzLjYgMTYuMy00NS40IDMwLjEtNjQuNWwtNCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCA0YzI3LjUtMTkuOCA2MC4zLTMyLjQgOTYtMzUuNEw0MTYgNjRjMC0zNS4zLTI4LjctNjQtNjQtNjRMOTYgMHptMzIgMTEyYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJ6TTI3MiA5NmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2ek0xMjggMjQwYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJ6TTQzMiA1NDRhMTQ0IDE0NCAwIDEgMCAwLTI4OCAxNDQgMTQ0IDAgMSAwIDAgMjg4em0yMi42LTE0NGwzNi43IDM2LjdjNi4yIDYuMiA2LjIgMTYuNCAwIDIyLjZzLTE2LjQgNi4yLTIyLjYgMGwtMzYuNy0zNi43LTM2LjcgMzYuN2MtNi4yIDYuMi0xNi40IDYuMi0yMi42IDBzLTYuMi0xNi40IDAtMjIuNmwzNi43LTM2LjctMzYuNy0zNi43Yy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBsMzYuNyAzNi43IDM2LjctMzYuN2M2LjItNi4yIDE2LjQtNi4yIDIyLjYgMHM2LjIgMTYuNCAwIDIyLjZMNDU0LjYgNDAweiJdCiAgICB9OwogICAgZmFDb21tZW50czIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY29tbWVudHMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjg0OTAsIDYxNjcwXSwgImYwODYiLCAiTTM4NCAxNDRjMCA5Ny4yLTg2IDE3Ni0xOTIgMTc2LTI2LjcgMC01Mi4xLTUtNzUuMi0xNEwzNS4yIDM0OS4yYy05LjMgNC45LTIwLjcgMy4yLTI4LjItNC4ycy05LjItMTguOS00LjItMjguMmwzNS42LTY3LjJDMTQuMyAyMjAuMiAwIDE4My42IDAgMTQ0IDAgNDYuOCA4Ni0zMiAxOTItMzJTMzg0IDQ2LjggMzg0IDE0NHptMCAzNjhjLTk0LjEgMC0xNzIuNC02Mi4xLTE4OC44LTE0NCAxMjAtMS41IDIyNC4zLTg2LjkgMjM1LjgtMjAyLjcgODMuMyAxOS4yIDE0NSA4OC4zIDE0NSAxNzAuNyAwIDM5LjYtMTQuMyA3Ni4yLTM4LjQgMTA1LjZsMzUuNiA2Ny4yYzQuOSA5LjMgMy4yIDIwLjctNC4yIDI4LjJzLTE4LjkgOS4yLTI4LjIgNC4yTDQ1OS4yIDQ5OGMtMjMuMSA5LTQ4LjUgMTQtNzUuMiAxNHoiXQogICAgfTsKICAgIGZhVGFncyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWdzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYwMmMiLCAiTTQwMS4yIDM5LjFMNTQ5LjQgMTg5LjRjMjcuNyAyOC4xIDI3LjcgNzMuMSAwIDEwMS4yTDM5MyA0NDguOWMtOS4zIDkuNC0yNC41IDkuNS0zMy45IC4ycy05LjUtMjQuNS0uMi0zMy45TDUxNS4zIDI1Ni44YzkuMi05LjMgOS4yLTI0LjQgMC0zMy43TDM2NyA3Mi45Yy05LjMtOS40LTkuMi0yNC42IC4yLTMzLjlzMjQuNi05LjIgMzMuOSAuMnpNMzIuMSAyMjkuNUwzMi4xIDk2YzAtMzUuMyAyOC43LTY0IDY0LTY0bDEzMy41IDBjMTcgMCAzMy4zIDYuNyA0NS4zIDE4LjdsMTQ0IDE0NGMyNSAyNSAyNSA2NS41IDAgOTAuNUwyODUuNCA0MTguN2MtMjUgMjUtNjUuNSAyNS05MC41IDBsLTE0NC0xNDRjLTEyLTEyLTE4LjctMjguMy0xOC43LTQ1LjN6bTE0NC04NS41YTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6Il0KICAgIH07CiAgICBmYUd1biA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJndW4iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTE5YiIsICJNNTI4IDU2YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgOC00NDggMEMxNC4zIDY0IDAgNzguMyAwIDk2TDAgMjA4YzAgMTcuNyAxNC4zIDMyIDMyIDMybDEwIDBjMjAuOCAwIDM2LjEgMTkuNiAzMSAzOS44TDMzIDQ0MC4yYy0yLjQgOS42LS4yIDE5LjcgNS44IDI3LjVTNTQuMSA0ODAgNjQgNDgwbDk2IDBjMTQuNyAwIDI3LjUtMTAgMzEtMjQuMkwyMTcgMzUyIDMyMS40IDM1MmMyMy43IDAgNDQuOC0xNC45IDUyLjctMzcuMmwyNi43LTc0LjggMzEuMSAwYzguNSAwIDE2LjYtMy40IDIyLjYtOS40bDIyLjYtMjIuNiA2Ni43IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC04MGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtMTYgMCAwLTh6TTMyMS40IDMwNGwtOTIuNSAwIDE2LTY0IDEwNSAwLTIxIDU4LjdjLTEuMSAzLjItNC4yIDUuMy03LjUgNS4zek04MCAxMjhsMzg0IDBjOC44IDAgMTYgNy4yIDE2IDE2cy03LjIgMTYtMTYgMTZMODAgMTYwYy04LjggMC0xNi03LjItMTYtMTZzNy4yLTE2IDE2LTE2eiJdCiAgICB9OwogICAgZmFDaXJjbGVDaGVjazIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLWNoZWNrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjE1MzMsICJjaGVjay1jaXJjbGUiXSwgImYwNTgiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMSAwLTUxMiAyNTYgMjU2IDAgMSAxIDAgNTEyek0zNzQgMTQ1LjdjLTEwLjctNy44LTI1LjctNS40LTMzLjUgNS4zTDIyMS4xIDMxNS4yIDE2OSAyNjMuMWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWw3MiA3MmM1IDUgMTEuOCA3LjUgMTguOCA3czEzLjQtNC4xIDE3LjUtOS44TDM3OS4zIDE3OS4yYzcuOC0xMC43IDUuNC0yNS43LTUuMy0zMy41eiJdCiAgICB9OwogICAgZmFDaGVja0NpcmNsZTIgPSBmYUNpcmNsZUNoZWNrMjsKICAgIGZhU2NvcnBpbyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzY29ycGlvIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU4NGUiLCAiTTM2OCAzMmM2MS45IDAgMTEyIDUwLjEgMTEyIDExMmwwIDI4OS43YzAgNy45IDYuNCAxNC4zIDE0LjMgMTQuMyAzLjkgMCA3LjYtMS42IDEwLjItNC4zbDQwLjEtNDEuMS05LjctOS43Yy02LjktNi45LTguOS0xNy4yLTUuMi0yNi4yUzU0Mi4zIDM1MiA1NTIgMzUybDY0IDAgMi41IC4xYzEyLjEgMS4yIDIxLjUgMTEuNSAyMS41IDIzLjlsMCA2NC0uMyAzLjZjLTEuMiA4LjItNi43IDE1LjMtMTQuNSAxOC42LTkgMy43LTE5LjMgMS42LTI2LjItNS4ybC05LjEtOS4xLTM5LjYgNDAuNmMtMTQuNyAxNS4xLTM0LjkgMjMuNi01NiAyMy42LTQzLjMgMC03OC4zLTM1LjEtNzguMy03OC4zTDQxNiAxNDRjMC0yNi41LTIxLjUtNDgtNDgtNDhzLTQ4IDIxLjUtNDggNDhsMCAzMDRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0zMDRjMC0yNi41LTIxLjUtNDgtNDgtNDhzLTQ4IDIxLjUtNDggNDhsMCAzMDRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0zMjBjMC0xNi42LTEyLjYtMzAuMi0yOC43LTMxLjhsLTYuNi0uM0M0NC42IDk0LjIgMzIgODAuNiAzMiA2NCAzMiA0Ni4zIDQ2LjMgMzIgNjQgMzIgOTEgMzIgMTE1LjMgNDMuMSAxMzIuNyA2MSAxNTIuNiA0MyAxNzkgMzIgMjA4IDMyIDIzOS4zIDMyIDI2Ny43IDQ0LjkgMjg4IDY1LjcgMzA4LjMgNDQuOSAzMzYuNiAzMiAzNjggMzJ6Il0KICAgIH07CiAgICBmYUlkQ2FyZENsaXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaWQtY2FyZC1jbGlwIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImlkLWNhcmQtYWx0Il0sICJmNDdmIiwgIk0yNTYtMzJsNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDY0LTEyOCAwIDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJ6TTY0IDMybDExMiAwIDAgMzJjMCAyNi41IDIxLjUgNDggNDggNDhsMTI4IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0zMiAxMTIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDMyMGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJ6TTE3NiA0MDBjMCA4LjggNy4yIDE2IDE2IDE2bDE5MiAwYzguOCAwIDE2LTcuMiAxNi0xNiAwLTQ0LjItMzUuOC04MC04MC04MGwtNjQgMGMtNDQuMiAwLTgwIDM1LjgtODAgODB6TTI4OCAyODBhNTYgNTYgMCAxIDAgMC0xMTIgNTYgNTYgMCAxIDAgMCAxMTJ6Il0KICAgIH07CiAgICBmYUlkQ2FyZEFsdCA9IGZhSWRDYXJkQ2xpcDsKICAgIGZhTW9vbjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibW9vbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyNzc2OSwgOTIxNF0sICJmMTg2IiwgIk0yNTYgMEMxMTQuNiAwIDAgMTE0LjYgMCAyNTZTMTE0LjYgNTEyIDI1NiA1MTJjNjguOCAwIDEzMS4zLTI3LjIgMTc3LjMtNzEuNCA3LjMtNyA5LjQtMTcuOSA1LjMtMjcuMXMtMTMuNy0xNC45LTIzLjgtMTQuMWMtNC45IC40LTkuOCAuNi0xNC44IC42LTEwMS42IDAtMTg0LTgyLjQtMTg0LTE4NCAwLTcyLjEgNDEuNS0xMzQuNiAxMDIuMS0xNjQuOCA5LjEtNC41IDE0LjMtMTQuMyAxMy4xLTI0LjRTMzIyLjYgOC41IDMxMi43IDYuM0MyOTQuNCAyLjIgMjc1LjQgMCAyNTYgMHoiXQogICAgfTsKICAgIGZhT2lsV2VsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJvaWwtd2VsbCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTMyIiwgIk01MjguMyA2MS4zYy0xMS40LTQyLjctNTUuMy02OC05OC01Ni42TDQxNC45IDguOEMzOTcuOCAxMy40IDM4Ny43IDMxIDM5Mi4zIDQ4bDI0LjUgOTEuNC0xMDguMiAyOC4xLTYuMy0xOC4xQzI5Ny43IDEzNi42IDI4NS42IDEyOCAyNzIgMTI4cy0yNS43IDguNi0zMC4yIDIxLjRsLTEzLjYgMzktMTMyLjIgMzQuMyAwLTM4LjZjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAyNjQtMTYgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmw1MTIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTM3LjMgMC02MS40LTE3NS40LTYyLjIgMTYuMSAyMi4xIDYzLjItNjYuNiAwIDE5LjktNTYuOS03NC42IDE5LjMtNDYuNyAxMzMuNS00MS4zIDAgMC0xNTkuMiAzMzcuNC04Ny41IDI1LjIgOTRjNC42IDE3LjEgMjIuMSAyNy4yIDM5LjIgMjIuNmwxNS41LTQuMWM0Mi43LTExLjQgNjgtNTUuMyA1Ni42LTk4TDUyOC4zIDYxLjN6TTIwNS4xIDQ0OGwxNi44LTQ4IDEwMC4yIDAgMTYuOCA0OC0xMzMuOCAweiJdCiAgICB9OwogICAgZmFUYWNob2dyYXBoRGlnaXRhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWNob2dyYXBoLWRpZ2l0YWwiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsiZGlnaXRhbC10YWNob2dyYXBoIl0sICJmNTY2IiwgIk0wIDEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGw0NDggMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI1NmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0NDhjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTI4em02NCAzMmwwIDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMybDE2MCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMzJjMC0xNy43LTE0LjMtMzItMzItMzJMOTYgMTI4Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnpNODggMzUyYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDEzNiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0TDg4IDM1MnptMjU2IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTQ0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE0NCAwek00OTYgMTkyYTY0IDY0IDAgMSAwIC0xMjggMCA2NCA2NCAwIDEgMCAxMjggMHpNODggMzEyYTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHptMTA0LTI0YTI0IDI0IDAgMSAwIC00OCAwIDI0IDI0IDAgMSAwIDQ4IDB6bTU2IDI0YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiXQogICAgfTsKICAgIGZhRGlnaXRhbFRhY2hvZ3JhcGggPSBmYVRhY2hvZ3JhcGhEaWdpdGFsOwogICAgZmFUYWJsZXQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGFibGV0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInRhYmxldC1hbmRyb2lkIl0sICJmM2ZiIiwgIk02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTM4NGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAwek0xODQgNDAwbDgwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTgwIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6Il0KICAgIH07CiAgICBmYVRhYmxldEFuZHJvaWQgPSBmYVRhYmxldDsKICAgIGZhUnVibGVTaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJ1YmxlLXNpZ24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs4MzgxLCAicm91YmxlIiwgInJ1YiIsICJydWJsZSJdLCAiZjE1OCIsICJNMTEyIDMyQzk0LjMgMzIgODAgNDYuMyA4MCA2NGwwIDIwOC00MCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDQwIDAgMCA0OC00MCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDQwIDAgMCAzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzIgMTUyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE1MiAwIDAtNDggMTEyIDBjNzkuNSAwIDE0NC02NC41IDE0NC0xNDRTMzM1LjUgMzIgMjU2IDMyTDExMiAzMnpNMjU2IDI1NmwtMTEyIDAgMC0xNjAgMTEyIDBjNDQuMiAwIDgwIDM1LjggODAgODBzLTM1LjggODAtODAgODB6Il0KICAgIH07CiAgICBmYVJvdWJsZSA9IGZhUnVibGVTaWduOwogICAgZmFSdWIgPSBmYVJ1YmxlU2lnbjsKICAgIGZhUnVibGUgPSBmYVJ1YmxlU2lnbjsKICAgIGZhQ2xvc2VkQ2FwdGlvbmluZzIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2xvc2VkLWNhcHRpb25pbmciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjIwYSIsICJNMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyNTZjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDQ4Yy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDEyOHptMTUyIDgwbDMyIDBjNC40IDAgOCAzLjYgOCA4IDAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRjMC0zMC45LTI1LjEtNTYtNTYtNTZsLTMyIDBjLTMwLjkgMC01NiAyNS4xLTU2IDU2bDAgODBjMCAzMC45IDI1LjEgNTYgNTYgNTZsMzIgMGMzMC45IDAgNTYtMjUuMSA1Ni01NiAwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGMwIDQuNC0zLjYgOC04IDhsLTMyIDBjLTQuNCAwLTgtMy42LTgtOGwwLTgwYzAtNC40IDMuNi04IDgtOHptMTY4IDhjMC00LjQgMy42LTggOC04bDMyIDBjNC40IDAgOCAzLjYgOCA4IDAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRjMC0zMC45LTI1LjEtNTYtNTYtNTZsLTMyIDBjLTMwLjkgMC01NiAyNS4xLTU2IDU2bDAgODBjMCAzMC45IDI1LjEgNTYgNTYgNTZsMzIgMGMzMC45IDAgNTYtMjUuMSA1Ni01NiAwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGMwIDQuNC0zLjYgOC04IDhsLTMyIDBjLTQuNCAwLTgtMy42LTgtOGwwLTgweiJdCiAgICB9OwogICAgZmFQZW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVuIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4Mzk0XSwgImYzMDQiLCAiTTM1Mi45IDIxLjJMMzA4IDY2LjEgNDQ1LjkgMjA0IDQ5MC44IDE1OS4xQzUwNC40IDE0NS42IDUxMiAxMjcuMiA1MTIgMTA4cy03LjYtMzcuNi0yMS4yLTUxLjFMNDU1LjEgMjEuMkM0NDEuNiA3LjYgNDIzLjIgMCA0MDQgMHMtMzcuNiA3LjYtNTEuMSAyMS4yek0yNzQuMSAxMDBMNTguOSAzMTUuMWMtMTAuNyAxMC43LTE4LjUgMjQuMS0yMi42IDM4LjdMLjkgNDgxLjZjLTIuMyA4LjMgMCAxNy4zIDYuMiAyMy40czE1LjEgOC41IDIzLjQgNi4ybDEyNy44LTM1LjVjMTQuNi00LjEgMjcuOS0xMS44IDM4LjctMjIuNkw0MTIgMjM3LjkgMjc0LjEgMTAweiJdCiAgICB9OwogICAgZmFQbGFuZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwbGFuZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMDcyIiwgIk01MjAgMjAwYzMwLjkgMCA1NiAyNS4xIDU2IDU2cy0yNS4xIDU2LTU2IDU2bC0xMjcuMyAwLTE1OS4yIDE3My42Yy02LjEgNi42LTE0LjYgMTAuNC0yMy42IDEwLjRsLTQzLjcgMGMtMTAuOSAwLTE4LjYtMTAuNy0xNS4yLTIxLjFsNTQuMy0xNjIuOS05OS43IDAtNTIuOCA2NmMtMyAzLjgtNy42IDYtMTIuNSA2bC0xOS44IDBjLTEwLjQgMC0xOC05LjgtMTUuNS0xOS45TDMyIDI1NiA1IDE0Ny45QzIuNCAxMzcuOCAxMC4xIDEyOCAyMC41IDEyOGwxOS44IDBjNC45IDAgOS41IDIuMiAxMi41IDZsNTIuOCA2NiA5OS43IDAtNTQuMy0xNjIuOUMxNDcuNiAyNi43IDE1NS4zIDE2IDE2Ni4yIDE2bDQzLjcgMGM5IDAgMTcuNSAzLjggMjMuNiAxMC40TDM5Mi43IDIwMCA1MjAgMjAweiJdCiAgICB9OwogICAgZmFJbWFnZXMyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImltYWdlcyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMzAyIiwgIk05NiA5NmMwLTM1LjMgMjguNy02NCA2NC02NGwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI1NmMwIDM1LjMtMjguNyA2NC02NCA2NGwtMzIwIDBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDk2IDk2ek0yNCAxMjhjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCAyOTZjMCA4LjggNy4yIDE2IDE2IDE2bDM2MCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxNTJjMC0xMy4zIDEwLjctMjQgMjQtMjR6bTE2OCAzMmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6bTE5Ni41IDExLjVjLTQuNC03LjEtMTIuMS0xMS41LTIwLjUtMTEuNXMtMTYuMSA0LjQtMjAuNSAxMS41bC01Ni4zIDkyLjEtMjQuNS0zMC42Yy00LjYtNS43LTExLjQtOS0xOC43LTlzLTE0LjIgMy4zLTE4LjcgOWwtNjQgODBjLTUuOCA3LjItNi45IDE3LjEtMi45IDI1LjRTMTc0LjggMzUyIDE4NCAzNTJsMjcyIDBjOC43IDAgMTYuNy00LjcgMjAuOS0xMi4zczQuMS0xNi44LS41LTI0LjNsLTg4LTE0NHoiXQogICAgfTsKICAgIGZhTW9iaWxlU2NyZWVuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vYmlsZS1zY3JlZW4iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsibW9iaWxlLWFuZHJvaWQtYWx0Il0sICJmM2NmIiwgIk0xNiA2NEMxNiAyOC43IDQ0LjcgMCA4MCAwTDMwNCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzg0YzAgMzUuMy0yOC43IDY0LTY0IDY0TDgwIDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMTYgNjR6TTEyOCA0NDBjMCAxMy4zIDEwLjcgMjQgMjQgMjRsODAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtODAgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjR6TTMwNCA2NGwtMjI0IDAgMCAzMDQgMjI0IDAgMC0zMDR6Il0KICAgIH07CiAgICBmYU1vYmlsZUFuZHJvaWRBbHQgPSBmYU1vYmlsZVNjcmVlbjsKICAgIGZhR3VhcmFuaVNpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ3VhcmFuaS1zaWduIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImUxOWEiLCAiTTE5MiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDQxLjVDNzMuMyA3Ny4zIDAgMTU4LjEgMCAyNTZTNzMuMyA0MzQuNyAxNjggNDQ2LjVsMCA0MS41YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC00MS41Yzk0LjctMTEuOCAxNjgtOTIuNiAxNjgtMTkwLjUgMC0xNy43LTE0LjMtMzItMzItMzJsLTEzNiAwIDAtOTMuOGMyNS4zIDQuOCA0Ny45IDE3IDY1LjYgMzQuMyAxMi42IDEyLjQgMzIuOSAxMi4yIDQ1LjMtLjRzMTIuMi0zMi45LS41LTQ1LjNDMjk3LjIgOTAuMiAyNTguOCA3MC44IDIxNiA2NS41TDIxNiAyNGMwLTEzLjMtMTAuNy0yNC0yNC0yNHpNMTY4IDEzMC4ybDAgMjUxLjVDMTA4LjggMzcwLjUgNjQgMzE4LjUgNjQgMjU2czQ0LjgtMTE0LjUgMTA0LTEyNS44em00OCAyNTEuNWwwLTkzLjggMTAwIDBjLTEyLjMgNDcuNi01MS4yIDg0LjUtMTAwIDkzLjh6Il0KICAgIH07CiAgICBmYUJhZ1Nob3BwaW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhZy1zaG9wcGluZyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJzaG9wcGluZy1iYWciXSwgImYyOTAiLCAiTTE2MCA4MGMwLTM1LjMgMjguNy02NCA2NC02NHM2NCAyOC43IDY0IDY0bDAgNDgtMTI4IDAgMC00OHptLTQ4IDQ4bC02NCAwYy0yNi41IDAtNDggMjEuNS00OCA0OEwwIDM4NGMwIDUzIDQzIDk2IDk2IDk2bDI1NiAwYzUzIDAgOTYtNDMgOTYtOTZsMC0yMDhjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTY0IDAgMC00OGMwLTYxLjktNTAuMS0xMTItMTEyLTExMlMxMTIgMTguMSAxMTIgODBsMCA0OHptMjQgNDhhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4em0xNTIgMjRhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHoiXQogICAgfTsKICAgIGZhU2hvcHBpbmdCYWcgPSBmYUJhZ1Nob3BwaW5nOwogICAgZmFDaXJjbGVSaWdodDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLXJpZ2h0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjE4MzgsICJhcnJvdy1hbHQtY2lyY2xlLXJpZ2h0Il0sICJmMzVhIiwgIk0wIDI1NmEyNTYgMjU2IDAgMSAwIDUxMiAwIDI1NiAyNTYgMCAxIDAgLTUxMiAwem0zODcuMyAxMS4zbC0xMDQgMTA0Yy00LjYgNC42LTExLjUgNS45LTE3LjQgMy41UzI1NiAzNjYuNSAyNTYgMzYwbDAtNTYtOTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMmw5NiAwIDAtNTZjMC02LjUgMy45LTEyLjMgOS45LTE0LjhzMTIuOS0xLjEgMTcuNCAzLjVsMTA0IDEwNGM2LjIgNi4yIDYuMiAxNi40IDAgMjIuNnoiXQogICAgfTsKICAgIGZhQXJyb3dBbHRDaXJjbGVSaWdodDIgPSBmYUNpcmNsZVJpZ2h0MjsKICAgIGZhUGhvbmVWb2x1bWUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGhvbmUtdm9sdW1lIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInZvbHVtZS1jb250cm9sLXBob25lIl0sICJmMmEwIiwgIk0zNDQtMzJjMTI4LjEgMCAyMzIgMTAzLjkgMjMyIDIzMiAwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGMwLTEwMS42LTgyLjQtMTg0LTE4NC0xODQtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHptOCAxOTJhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0ek0zMjAgODhjMC0xMy4zIDEwLjctMjQgMjQtMjQgNzUuMSAwIDEzNiA2MC45IDEzNiAxMzYgMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRjMC00OC42LTM5LjQtODgtODgtODgtMTMuMyAwLTI0LTEwLjctMjQtMjR6TTE0NC4xIDEuNGMxOS43LTUuNCA0MC4zIDQuNyA0OC4xIDIzLjVsNDAuNSA5Ny4zYzYuOSAxNi41IDIuMSAzNS42LTExLjggNDdsLTQ0LjEgMzYuMWMzMi41IDcxLjYgODkgMTMwIDE1OS4zIDE2NC45TDM3NC43IDMyM2MxMS4zLTEzLjkgMzAuNC0xOC42IDQ3LTExLjhMNTE5IDM1MS44YzE4LjggNy44IDI4LjkgMjguNCAyMy41IDQ4LjFsLTEuNSA1LjVDNTIzLjQgNDcwLjEgNDYwLjkgNTI1LjMgMzg0LjYgNTA5LjIgMjA5LjYgNDcyLjEgNzEuOSAzMzQuNCAzNC44IDE1OS40IDE4LjcgODMuMSA3My45IDIwLjYgMTM4LjUgMi45bDUuNS0xLjV6Il0KICAgIH07CiAgICBmYVZvbHVtZUNvbnRyb2xQaG9uZSA9IGZhUGhvbmVWb2x1bWU7CiAgICBmYUN1YmVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImN1YmVzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxYjMiLCAiTTI4NC0xLjNjLTE3LjMtMTAtMzguNy0xMC01NiAwTDE0My44IDQ3LjNjLTE3LjMgMTAtMjggMjguNS0yOCA0OC41bDAgMTAxLjktODguMyA1MWMtMTcuMyAxMC0yOCAyOC41LTI4IDQ4LjVsMCA5Ny4zYzAgMjAgMTAuNyAzOC41IDI4IDQ4LjVsODQuMyA0OC42YzE3LjMgMTAgMzguNyAxMCA1NiAwbDg4LjMtNTEgODguMyA1MWMxNy4zIDEwIDM4LjcgMTAgNTYgMEw0ODQuNSA0NDNjMTcuMy0xMCAyOC0yOC41IDI4LTQ4LjVsMC05Ny4zYzAtMjAtMTAuNy0zOC41LTI4LTQ4LjVsLTg4LjMtNTEgMC0xMDEuOWMwLTIwLTEwLjctMzguNS0yOC00OC41TDI4NC0xLjN6TTIzMiAyOTIuNmwwIDEwNi41LTg4LjMgNTFjLTEuMiAuNy0yLjYgMS4xLTQgMS4xbDAtMTA1LjMgOTIuMy01My4zem0yMzEuNCAuNmMuNyAxLjIgMS4xIDIuNiAxLjEgNGwwIDk3LjNjMCAyLjktMS41IDUuNS00IDYuOWwtODQuMyA0OC42Yy0xLjIgLjctMi42IDEuMS00IDEuMWwwLTEwNS4zIDkxLjItNTIuNnpNMzQ4LjMgOTUuOGwwIDEwMS45LTkyLjMgNTMuMyAwLTEwNi41IDkxLjItNTIuNmMuNyAxLjIgMS4xIDIuNiAxLjEgNHoiXQogICAgfTsKICAgIGZhUGhvbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGhvbmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgyMjIsIDEyODM3OV0sICJmMDk1IiwgIk0xNjAuMiAyNUMxNTIuMyA2LjEgMTMxLjctMy45IDExMi4xIDEuNGwtNS41IDEuNWMtNjQuNiAxNy42LTExOS44IDgwLjItMTAzLjcgMTU2LjQgMzcuMSAxNzUgMTc0LjggMzEyLjcgMzQ5LjggMzQ5LjggNzYuMyAxNi4yIDEzOC44LTM5LjEgMTU2LjQtMTAzLjdsMS41LTUuNWM1LjQtMTkuNy00LjctNDAuMy0yMy41LTQ4LjFsLTk3LjMtNDAuNWMtMTYuNS02LjktMzUuNi0yLjEtNDcgMTEuOGwtMzguNiA0Ny4yQzIzMy45IDMzNS40IDE3Ny4zIDI3NyAxNDQuOCAyMDUuM0wxODkgMTY5LjNjMTMuOS0xMS4zIDE4LjYtMzAuNCAxMS44LTQ3TDE2MC4yIDI1eiJdCiAgICB9OwogICAgZmFUb3JpaUdhdGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidG9yaWktZ2F0ZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzk5NjFdLCAiZjZhMSIsICJNMCA5NkwwIDI4LjVDMCAyMS42IDUuNiAxNiAxMi41IDE2IDE0LjggMTYgMTcgMTYuNiAxOSAxNy44TDU4IDQxLjJDODIuOSA1Ni4xIDExMS4zIDY0IDE0MC4zIDY0bDE2Ny40IDBjMjkgMCA1Ny41LTcuOSA4Mi4zLTIyLjhsMzktMjMuNGMxLjktMS4yIDQuMi0xLjggNi40LTEuOCA2LjkgMCAxMi41IDUuNiAxMi41IDEyLjVMNDQ4IDk2YzAgMzUuMy0yOC43IDY0LTY0IDY0bDAgNjQgMTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTYgMCAwIDE5MmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTE5Mi0xOTIgMCAwIDE5MmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTE5Mi0xNiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDE2IDAgMC02NEMyOC43IDE2MCAwIDEzMS4zIDAgOTZ6TTEyOCAyMjRsNjQgMCAwLTY0LTY0IDAgMCA2NHptMTI4IDBsNjQgMCAwLTY0LTY0IDAgMCA2NHoiXQogICAgfTsKICAgIGZhQmFjb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmFjb24iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjkzNjNdLCAiZjdlNSIsICJNNTU3IDk2LjdjMTQuNCAxNC40IDEyLjQgMzguNC00LjMgNTAuMmwtNjQuNiA0NS43Yy00My43IDMwLjktNzkuMiA3MS45LTEwMy40IDExOS42bC0yNS4zIDQ5LjhjLTI1LjEgNDkuMy02Mi4xIDkxLjUtMTA3LjggMTIyLjZsLTc0LjEgNTAuNmMtMTMuMSA4LjktMzAuNyA3LjMtNDEuOC0zLjlsLTQ0LjktNDQuOSA4Ni41LTY2LjVjNDIuMy0zMi41IDc2LjctNzQuMyAxMDAuNi0xMjJsMjQuNS00OS4xYzI0LjUtNDkgNjEuOC05MC42IDEwNy45LTEyMC4ybDEwOC43LTY5LjkgMzggMzh6TTQ4NC4yIDIzLjlMMzg0LjMgODguMmMtNTMuNCAzNC4zLTk2LjUgODIuNC0xMjQuOSAxMzkuMWwtMjQuNSA0OS4xYy0yMC42IDQxLjMtNTAuMyA3Ny4zLTg2LjkgMTA1LjRsLTkxLjQgNzAuMy0zNi45LTM2LjljLTE0LjQtMTQuNC0xMi40LTM4LjQgNC4zLTUwLjJsNjQuNi00NS43YzQzLjctMzAuOSA3OS4yLTcxLjkgMTAzLjQtMTE5LjZsMjUuMy00OS44QzI0Mi4zIDEwMC44IDI3OS4zIDU4LjYgMzI1IDI3LjRsNzQuMS01MC42YzEzLjEtOC45IDMwLjYtNy4zIDQxLjggMy45bDQzLjMgNDMuM3oiXQogICAgfTsKICAgIGZhUGVyc29uRmFsbGluZ0J1cnN0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1mYWxsaW5nLWJ1cnN0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1NDciLCAiTTI1NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNS40YzAgNTUuMi0yMy43IDEwNy02My45IDE0My4xbDYyLjkgNzUuNSA4OSAwYzE1LjEgMCAyOS4zIDcuMSAzOC40IDE5LjJsNDMuMiA1Ny42YzEwLjYgMTQuMSA3LjcgMzQuMi02LjQgNDQuOHMtMzQuMiA3LjctNDQuOC02LjRMMzY4IDMyMCAyNjMuMiAzMjAgMzc2LjggNDU5LjhjMTEuMSAxMy43IDkuMSAzMy45LTQuNyA0NXMtMzMuOSA5LjEtNDUtNC43TDEzNy40IDI2Ni42Yy02LjEgMTUtOS40IDMxLjMtOS40IDQ4bDAgNjkuNGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY5LjRjMC02Ny40IDM1LjQtMTI5LjkgOTMuMi0xNjQuNmw0LjYtMi44QzIwMC40IDEyNCAyMjQgODIuNCAyMjQgMzcuNGwwLTUuNGMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNMTYgODhBNTYgNTYgMCAxIDEgMTI4IDg4IDU2IDU2IDAgMSAxIDE2IDg4em0zNzYtNy45YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNDhjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDQ4em0xMDQgMTUyYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDQ4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTQ4IDB6bS01NC41LTk3LjVjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45bDMzLjktMzMuOWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjlsLTMzLjkgMzMuOWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDB6Il0KICAgIH07CiAgICBmYVF1b3RlUmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicXVvdGUtcmlnaHQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs4MjIxLCAicXVvdGUtcmlnaHQtYWx0Il0sICJmMTBlIiwgIk00NDggMjk2YzAgNjYuMy01My43IDEyMC0xMjAgMTIwbC04IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsOCAwYzMwLjkgMCA1Ni0yNS4xIDU2LTU2bDAtOC02NCAwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTY0YzAtMzUuMyAyOC43LTY0IDY0LTY0bDY0IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAxMzZ6bS0yNTYgMGMwIDY2LjMtNTMuNyAxMjAtMTIwIDEyMGwtOCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDggMGMzMC45IDAgNTYtMjUuMSA1Ni01NmwwLTgtNjQgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC02NGMwLTM1LjMgMjguNy02NCA2NC02NGw2NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMTM2eiJdCiAgICB9OwogICAgZmFRdW90ZVJpZ2h0QWx0ID0gZmFRdW90ZVJpZ2h0OwogICAgZmFIb3VzZU1lZGljYWxGbGFnID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLW1lZGljYWwtZmxhZyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTE0IiwgIk00ODAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmw5NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgOTZjMCAxNy43LTE0LjMgMzItMzIgMzJsLTk2IDAgMCAyODhjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC00NDhjMC0xNy43IDE0LjMtMzIgMzItMzJ6TTI2Ny41IDU5LjFMNDAwIDE4Ni45IDQwMCA1MDMuNGMtOS40IDUuNC0yMC4zIDguNi0zMiA4LjZsLTI1NiAwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTE0NC0xOS45IDBDMTIuNiAzMDQgMCAyOTEuNCAwIDI3NS45IDAgMjY4LjMgMy4xIDI2MSA4LjYgMjU1LjdMMjEyLjUgNTkuMUMyMTkuOSA1MiAyMjkuNyA0OCAyNDAgNDhzMjAuMSA0IDI3LjUgMTEuMXpNMjA0LjggMjU2LjhsMCA0NC00NCAwYy05LjcgMC0xNy42IDcuOS0xNy42IDE3LjZsMCAzNS4yYzAgOS43IDcuOSAxNy42IDE3LjYgMTcuNmw0NCAwIDAgNDRjMCA5LjcgNy45IDE3LjYgMTcuNiAxNy42bDM1LjIgMGM5LjcgMCAxNy42LTcuOSAxNy42LTE3LjZsMC00NCA0NCAwYzkuNyAwIDE3LjYtNy45IDE3LjYtMTcuNmwwLTM1LjJjMC05LjctNy45LTE3LjYtMTcuNi0xNy42bC00NCAwIDAtNDRjMC05LjctNy45LTE3LjYtMTcuNi0xNy42bC0zNS4yIDBjLTkuNyAwLTE3LjYgNy45LTE3LjYgMTcuNnoiXQogICAgfTsKICAgIGZhUHJlc2NyaXB0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInByZXNjcmlwdGlvbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNWIxIiwgIk0zMiAwQzE0LjMgMCAwIDE0LjMgMCAzMkwwIDI4OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtNjQgNTAuNyAwIDEyOCAxMjgtMTA1LjQgMTA1LjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBMMjg4IDM5Ny4zIDM5My40IDUwMi42YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNMMzMzLjMgMzUyIDQzOC42IDI0Ni42YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwTDI4OCAzMDYuNyAyMDIuMiAyMjAuOUMyNTEuNCAyMDkuMSAyODggMTY0LjggMjg4IDExMiAyODggNTAuMSAyMzcuOSAwIDE3NiAwTDMyIDB6TTE3NiAxNjBsLTExMiAwIDAtOTYgMTEyIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhzLTIxLjUgNDgtNDggNDh6Il0KICAgIH07CiAgICBmYURpY2VUaHJlZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkaWNlLXRocmVlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbOTg1OF0sICJmNTI3IiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyem02NCA5NmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6bTY0IDEyOGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0xMjggNjRhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFCdWlsZGluZ0xvY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnVpbGRpbmctbG9jayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNGQ2IiwgIk0zMiA2NEMzMiAyOC43IDYwLjcgMCA5NiAwTDM1MiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMTIxLjNjLTQ2LjkgMTktODAgNjUtODAgMTE4LjdsMCAyNC40Yy0xOS42IDE3LjYtMzIgNDMuMS0zMiA3MS41bDAgOTZjMCA1LjUgLjUgMTAuOSAxLjMgMTYuMUw5NiA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDMyIDY0ek0xNzYgMzg0bDAgODAgODAgMCAwLTY0LjFjMC0xMy43IDEuOS0yNyA1LjUtMzkuNi01LjctNS4yLTEzLjItOC4zLTIxLjUtOC4zbC0zMiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnpNMzA3IDIyNC4zYy0xLS4yLTItLjMtMy0uM2wtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDE2LjcgMGMyLjEtMjIuOCA4LjQtNDQuMyAxOC4zLTYzLjd6TTE0NCA5NmMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwem0xMTIgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnpNMTQ0IDIyNGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwem0zNTIgODAuMWMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDQ3LjkgNjQgMCAwLTQ3Ljl6TTM1MiA0MDBjMC0yMC45IDEzLjQtMzguNyAzMi00NS4zbDAtNTAuNmMwLTQ0LjIgMzUuOC04MCA4MC04MHM4MCAzNS44IDgwIDgwbDAgNTAuNmMxOC42IDYuNiAzMiAyNC40IDMyIDQ1LjNsMCA5NmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTI4IDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtOTZ6Il0KICAgIH07CiAgICBmYUlkQ2FyZDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaWQtY2FyZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzYyMTQ3LCAiZHJpdmVycy1saWNlbnNlIl0sICJmMmMyIiwgIk0wIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDQ0OCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0TDAgOTZ6bTAgNDhsNTc2IDAgMCAyNzJjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDE0NHpNMjQ3LjMgNDE2YzIwLjIgMCAzNS4zLTE5LjQgMjIuNC0zNS0xNC43LTE3LjctMzYuOS0yOS02MS43LTI5bC02NCAwYy0yNC44IDAtNDcgMTEuMy02MS43IDI5LTEyLjkgMTUuNiAyLjIgMzUgMjIuNCAzNWwxNDIuNSAwek0xNzYgMzEyYTU2IDU2IDAgMSAwIDAtMTEyIDU2IDU2IDAgMSAwIDAgMTEyek0zNjAgMjA4Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDExMiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0xMTIgMHptMCA5NmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxMTIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTEyIDB6Il0KICAgIH07CiAgICBmYURyaXZlcnNMaWNlbnNlMiA9IGZhSWRDYXJkMjsKICAgIGZhQ2lyY2xlUGxheTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLXBsYXkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs2MTQ2OSwgInBsYXktY2lyY2xlIl0sICJmMTQ0IiwgIk0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwek0xODguMyAxNDcuMWMtNy42IDQuMi0xMi4zIDEyLjMtMTIuMyAyMC45bDAgMTc2YzAgOC43IDQuNyAxNi43IDEyLjMgMjAuOXMxNi44IDQuMSAyNC4zLS41bDE0NC04OGM3LjEtNC40IDExLjUtMTIuMSAxMS41LTIwLjVzLTQuNC0xNi4xLTExLjUtMjAuNWwtMTQ0LTg4Yy03LjQtNC41LTE2LjctNC43LTI0LjMtLjV6Il0KICAgIH07CiAgICBmYVBsYXlDaXJjbGUyID0gZmFDaXJjbGVQbGF5MjsKICAgIGZhRmFjZUxhdWdoQmVhbTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1sYXVnaC1iZWFtIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTEzLCAibGF1Z2gtYmVhbSJdLCAiZjU5YSIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTEwMS42IDMxNGMtMy43LTEzLjcgNy41LTI2IDIxLjctMjZsMjY1LjQgMGMxNC4yIDAgMjUuNCAxMi4zIDIxLjcgMjYtMTguNSA2OC04MC42IDExOC0xNTQuNCAxMThTMTIwIDM4MiAxMDEuNiAzMTR6TTE3NiAxNjRjLTE1LjUgMC0yOCAxMi41LTI4IDI4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMzcuNiAzMC40LTY4IDY4LTY4czY4IDMwLjQgNjggNjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0xNS41LTEyLjUtMjgtMjgtMjh6bTEzMiAyOGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTM3LjYgMzAuNC02OCA2OC02OHM2OCAzMC40IDY4IDY4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMTUuNS0xMi41LTI4LTI4LTI4cy0yOCAxMi41LTI4IDI4eiJdCiAgICB9OwogICAgZmFMYXVnaEJlYW0yID0gZmFGYWNlTGF1Z2hCZWFtMjsKICAgIGZhTGVhZiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsZWFmIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYwNmMiLCAiTTQ3MS4zIDYuN0M0NzcuNyAuNiA0ODctMS42IDQ5NS42IDEuMiA1MDUuNCA0LjUgNTEyIDEzLjcgNTEyIDI0bDAgMTg2LjljMCAxMzEuMi0xMDguMSAyMzcuMS0yMzguOCAyMzcuMS03NyAwLTE0My40LTQ5LjUtMTY3LjUtMTE4LjctMzUuNCAzMC44LTU3LjcgNzYuMS01Ny43IDEyNi43IDAgMTMuMy0xMC43IDI0LTI0IDI0UzAgNDY5LjMgMCA0NTZDMCAzODEuMSAzOC4yIDMxNS4xIDk2LjEgMjc2LjMgMTMxLjQgMjUyLjcgMTczLjUgMjQwIDIxNiAyNDBsODAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtODAgMGMtMzkuNyAwLTc3LjMgOC44LTExMSAyNC41IDIzLjMtNzAgODkuMi0xMjAuNSAxNjctMTIwLjUgNjYuNCAwIDExNS44LTIyLjEgMTQ4LjctNDQgMTkuMi0xMi44IDM1LjUtMjguMSA1MC43LTQ1LjN6Il0KICAgIH07CiAgICBmYUhvdXNlQ2hpbW5leVVzZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG91c2UtY2hpbW5leS11c2VyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUwNjUiLCAiTTIzNC4yIDguNmMxMi4zLTExLjQgMzEuMy0xMS40IDQzLjUgMEwzNjggOTIuMyAzNjggODBjMC0xNy43IDE0LjMtMzIgMzItMzJsMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDEwMS41IDM3LjggMzUuMWM5LjYgOSAxMi44IDIyLjkgOCAzNS4xUzQ5My4yIDI3MiA0ODAgMjcybC0xNiAwIDAgMTc2YzAgMzUuMy0yOC43IDY0LTY0IDY0bC0yODggMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0xNzYtMTYgMGMtMTMuMiAwLTI1LTguMS0yOS44LTIwLjNzLTEuNi0yNi4yIDgtMzUuMWwyMjQtMjA4ek0zMTIgMjU2YTU2IDU2IDAgMSAwIC0xMTIgMCA1NiA1NiAwIDEgMCAxMTIgMHpNMTQ0IDQzMmMwIDguOCA3LjIgMTYgMTYgMTZsMTkyIDBjOC44IDAgMTYtNy4yIDE2LTE2IDAtNDQuMi0zNS44LTgwLTgwLTgwbC02NCAwYy00NC4yIDAtODAgMzUuOC04MCA4MHoiXQogICAgfTsKICAgIGZhUm90YXRlUmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicm90YXRlLXJpZ2h0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInJlZG8tYWx0IiwgInJvdGF0ZS1mb3J3YXJkIl0sICJmMmY5IiwgIk00ODggMTkybC0xNDQgMGMtOS43IDAtMTguNS01LjgtMjIuMi0xNC44cy0xLjctMTkuMyA1LjItMjYuMmw0Ni43LTQ2LjdjLTc1LjMtNTguNi0xODQuMy01My4zLTI1My41IDE1LjktNzUgNzUtNzUgMTk2LjUgMCAyNzEuNXMxOTYuNSA3NSAyNzEuNSAwYzguMi04LjIgMTUuNS0xNi45IDIxLjktMjYuMSAxMC4xLTE0LjUgMzAuMS0xOCA0NC42LTcuOXMxOCAzMC4xIDcuOSA0NC42Yy04LjUgMTIuMi0xOC4yIDIzLjgtMjkuMSAzNC43LTEwMCAxMDAtMjYyLjEgMTAwLTM2MiAwUy0yNSAxNzUgNzUgNzVjOTQuMy05NC4zIDI0My43LTk5LjYgMzQ0LjMtMTYuMkw0NzEgN2M2LjktNi45IDE3LjItOC45IDI2LjItNS4yUzUxMiAxNC4zIDUxMiAyNGwwIDE0NGMwIDEzLjMtMTAuNyAyNC0yNCAyNHoiXQogICAgfTsKICAgIGZhUmVkb0FsdCA9IGZhUm90YXRlUmlnaHQ7CiAgICBmYVJvdGF0ZUZvcndhcmQgPSBmYVJvdGF0ZVJpZ2h0OwogICAgZmFUb290aCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0b290aCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyOTQ2M10sICJmNWM5IiwgIk0xNDUgNS43TDIyNCAzMiAzMDMgNS43QzMxNC4zIDEuOSAzMjYgMCAzMzcuOSAwIDM5OC43IDAgNDQ4IDQ5LjMgNDQ4IDExMC4xbDAgNjguNWMwIDI5LjQtOS41IDU4LjEtMjcuMiA4MS42bC0xLjEgMS41Yy0xMi45IDE3LjItMjEuMyAzNy40LTI0LjMgNTguN0wzNzMuNyA0NzEuOWMtMy4zIDIzLTIzIDQwLjEtNDYuMiA0MC4xLTIyLjggMC00Mi4zLTE2LjUtNDYtMzlMMjYxLjMgMzUxLjZjLTMtMTguMi0xOC44LTMxLjYtMzcuMy0zMS42cy0zNC4yIDEzLjQtMzcuMyAzMS42TDE2Ni41IDQ3M2MtMy44IDIyLjUtMjMuMiAzOS00NiAzOS0yMy4yIDAtNDIuOS0xNy4xLTQ2LjItNDAuMUw1Mi42IDMyMC41Yy0zLTIxLjMtMTEuNC00MS41LTI0LjMtNTguN2wtMS4xLTEuNUM5LjUgMjM2LjcgMCAyMDguMSAwIDE3OC43bDAtNjguNUMwIDQ5LjMgNDkuMyAwIDExMC4xIDAgMTIyIDAgMTMzLjcgMS45IDE0NSA1Ljd6Il0KICAgIH07CiAgICBmYUhvdXNlQ2hpbW5leVdpbmRvdyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VzZS1jaGltbmV5LXdpbmRvdyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMDBkIiwgIk0yMzQuMiA4LjZjMTIuMy0xMS40IDMxLjMtMTEuNCA0My41IDBMMzY4IDkyLjMgMzY4IDgwYzAtMTcuNyAxNC4zLTMyIDMyLTMybDMyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxMDEuNSAzNy44IDM1LjFjOS42IDkgMTIuOCAyMi45IDggMzUuMVM0OTMuMiAyNzIgNDgwIDI3MmwtMTYgMCAwIDE3NmMwIDM1LjMtMjguNyA2NC02NCA2NGwtMjg4IDBjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMTc2LTE2IDBjLTEzLjIgMC0yNS04LjEtMjkuOC0yMC4zcy0xLjYtMjYuMiA4LTM1LjFsMjI0LTIwOHpNMjE2IDIyNGMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCA4MGMwIDEzLjMgMTAuNyAyNCAyNCAyNGw4MCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtODBjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTgwIDB6Il0KICAgIH07CiAgICBmYU1vdG9yY3ljbGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibW90b3JjeWNsZSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzEyNzk0OV0sICJmMjFjIiwgIk0yODAgMTZjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNTYuNiAwIDIyLjUgNDguNy05NS4xIDcxLjNjLTMzLjQtMjUuMS03NS00MC0xMjAtNDBsLTU2IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNTYgMGM3OC41IDAgMTQzLjIgNTkuNiAxNTEuMiAxMzZsLTI1LjQgMGMtMTEuMi01OS4yLTYzLjMtMTA0LTEyNS44LTEwNC03MC43IDAtMTI4IDU3LjMtMTI4IDEyOFM3My4zIDQ4MCAxNDQgNDgwYzYyLjUgMCAxMTQuNS00NC44IDEyNS44LTEwNGw1MC4yIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC0yMi41YzAtNDUuMSAyNS43LTg1LjQgNjUuNS0xMDcuN2wxMi4xIDI2LjFjLTMyLjQgMjMuMi01My41IDYxLjItNTMuNSAxMDQuMSAwIDcwLjcgNTcuMyAxMjggMTI4IDEyOHMxMjgtNTcuMyAxMjgtMTI4LTU3LjMtMTI4LTEyOC0xMjhjLTEwLjcgMC0yMSAxLjMtMzAuOSAzLjhMNDMzLjggMTYwIDQ4OCAxNjBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC00OGMwLTEzLjMtMTAuNy0yNC0yNC0yNGwtNTMuMyAwYy02LjkgMC0xMy43IDIuMi0xOS4yIDYuNGwtMTcuMSAxMi44LTI0LjYtNTMuM0MzNjkuOSAyMS40IDM2MS40IDE2IDM1MiAxNmwtNzIgMHpNNDQ1LjggMzAwLjRsMjguNCA2MS42YzUuNiAxMiAxOS44IDE3LjMgMzEuOCAxMS43czE3LjMtMTkuOCAxMS43LTMxLjhsLTI4LjUtNjEuNmMyLjItLjIgNC40LS4zIDYuNy0uMyAzOS44IDAgNzIgMzIuMiA3MiA3MnMtMzIuMiA3Mi03MiA3Mi03Mi0zMi4yLTcyLTcyYzAtMjAuMiA4LjMtMzguNSAyMS44LTUxLjZ6TTE0NCA0MjRjLTM5LjggMC03Mi0zMi4yLTcyLTcyczMyLjItNzIgNzItNzJjMzEuMyAwIDU4IDIwIDY3LjkgNDhMMTQ0IDMyOGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw2Ny45IDBjLTkuOSAyOC0zNi42IDQ4LTY3LjkgNDh6Il0KICAgIH07CiAgICBmYUJhY2t3YXJkRmFzdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYWNrd2FyZC1mYXN0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTE5OCwgImZhc3QtYmFja3dhcmQiXSwgImYwNDkiLCAiTTQ5Mi4yIDQ3Ny42Yy0xMiA1LTI1LjcgMi4yLTM0LjktNi45TDI4OCAzMDEuMyAyODggNDQ4YzAgMTIuOS03LjggMjQuNi0xOS44IDI5LjZzLTI1LjcgMi4yLTM0LjktNi45TDY0IDMwMS4zIDY0IDQ0OGMwIDE3LjctMTQuMyAzMi0zMiAzMlMwIDQ2NS43IDAgNDQ4TDAgNjRDMCA0Ni4zIDE0LjMgMzIgMzIgMzJTNjQgNDYuMyA2NCA2NEw2NCAyMTAuNyAyMzMuNCA0MS40YzkuMi05LjIgMjIuOS0xMS45IDM0LjktNi45UzI4OCA1MS4xIDI4OCA2NGwwIDE0Ni43IDE2OS40LTE2OS40YzkuMi05LjIgMjIuOS0xMS45IDM0LjktNi45UzUxMiA1MS4xIDUxMiA2NGwwIDM4NGMwIDEyLjktNy44IDI0LjYtMTkuOCAyOS42eiJdCiAgICB9OwogICAgZmFGYXN0QmFja3dhcmQgPSBmYUJhY2t3YXJkRmFzdDsKICAgIGZhQWRkcmVzc0Jvb2syID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFkZHJlc3MtYm9vayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYyMTM4LCAiY29udGFjdC1ib29rIl0sICJmMmI5IiwgIk05NiAwQzYwLjcgMCAzMiAyOC43IDMyIDY0bDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI4OCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzg0YzAtMzUuMy0yOC43LTY0LTY0LTY0TDk2IDB6TTIwOCAyODhsNjQgMGM0NC4yIDAgODAgMzUuOCA4MCA4MCAwIDguOC03LjIgMTYtMTYgMTZsLTE5MiAwYy04LjggMC0xNi03LjItMTYtMTYgMC00NC4yIDM1LjgtODAgODAtODB6bS0yNC05NmE1NiA1NiAwIDEgMSAxMTIgMCA1NiA1NiAwIDEgMSAtMTEyIDB6TTUxMiA4MGMwLTguOC03LjItMTYtMTYtMTZzLTE2IDcuMi0xNiAxNmwwIDY0YzAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZsMC02NHptMCAxMjhjMC04LjgtNy4yLTE2LTE2LTE2cy0xNiA3LjItMTYgMTZsMCA2NGMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtNjR6TTQ5NiAzMjBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDY0YzAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZsMC02NGMwLTguOC03LjItMTYtMTYtMTZ6Il0KICAgIH07CiAgICBmYUNvbnRhY3RCb29rMiA9IGZhQWRkcmVzc0Jvb2syOwogICAgZmFTYWlsYm9hdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzYWlsYm9hdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNDQ1IiwgIk0yNDAgMzUuOWwwIDM0OC4xLTIyNCAwYy04LjggMC0xNiA3LjItMTYgMTYgMCA2MS45IDUwLjEgMTEyIDExMiAxMTJsMjg4IDBjNjEuOSAwIDExMi01MC4xIDExMi0xMTIgMC04LjgtNy4yLTE2LTE2LTE2bC0yMDggMCAwLTQ4IDE2MS43IDBjMTIuOSAwIDIwLjUtMTQuNCAxMy4yLTI1TDI2OS4yIDI2LjljLTguOS0xMy0yOS4yLTYuNy0yOS4yIDl6TTE5MiAzMjBsMC0xODQuMmMwLTE2LjEtMjEtMjIuMS0yOS42LTguNUw0Ny4zIDMxMS41Yy02LjcgMTAuNyAxIDI0LjUgMTMuNiAyNC41TDE3NiAzMzZjOC44IDAgMTYtNy4yIDE2LTE2eiJdCiAgICB9OwogICAgZmFCb29rQm9va21hcmsgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm9vay1ib29rbWFyayIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlMGJiIiwgIk05NiA1MTJsMzIwIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsMC02Ni43YzE4LjYtNi42IDMyLTI0LjQgMzItNDUuM2wwLTI4OGMwLTI2LjUtMjEuNS00OC00OC00OGwtNDggMCAwIDE2OS40YzAgMTIuNS0xMC4xIDIyLjYtMjIuNiAyMi42LTYgMC0xMS44LTIuNC0xNi02LjZMMjcyIDE0NCAyMzAuNiAxODUuNGMtNC4yIDQuMi0xMCA2LjYtMTYgNi42LTEyLjUgMC0yMi42LTEwLjEtMjIuNi0yMi42TDE5MiAwIDk2IDBDNDMgMCAwIDQzIDAgOTZMMCA0MTZjMCA1MyA0MyA5NiA5NiA5NnpNNjQgNDE2YzAtMTcuNyAxNC4zLTMyIDMyLTMybDI1NiAwIDAgNjQtMjU2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyeiJdCiAgICB9OwogICAgZmFNYWduaWZ5aW5nR2xhc3NBcnJvd1JpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hZ25pZnlpbmctZ2xhc3MtYXJyb3ctcmlnaHQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTUyMSIsICJNNDE2IDIwOGMwIDQ1LjktMTQuOSA4OC4zLTQwIDEyMi43TDUwMi42IDQ1Ny40YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zcy0zMi44IDEyLjUtNDUuMyAwTDMzMC43IDM3NkMyOTYuMyA0MDEuMSAyNTMuOSA0MTYgMjA4IDQxNiA5My4xIDQxNiAwIDMyMi45IDAgMjA4UzkzLjEgMCAyMDggMCA0MTYgOTMuMSA0MTYgMjA4ek0zMDUgMjI1YzkuNC05LjQgOS40LTI0LjYgMC0zMy45bC03Mi03MmMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWwzMSAzMS0xMDIuMSAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDEwMi4xIDAtMzEgMzFjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMGw3Mi03MnoiXQogICAgfTsKICAgIGZhTWljcm9waG9uZUxpbmVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1pY3JvcGhvbmUtbGluZXMiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjc4OTcsICJtaWNyb3Bob25lLWFsdCJdLCAiZjNjOSIsICJNOTYgOTZjMC01MyA0My05NiA5Ni05NiA1MC4zIDAgOTEuNiAzOC43IDk1LjcgODhMMjMyIDg4Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDU2IDAgMCA0OC01NiAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDU1LjcgMGMtNC4xIDQ5LjMtNDUuMyA4OC05NS43IDg4LTUzIDAtOTYtNDMtOTYtOTZMOTYgOTZ6TTI0IDE2MGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDQwYzAgNzkuNSA2NC41IDE0NCAxNDQgMTQ0czE0NC02NC41IDE0NC0xNDRsMC00MGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgNDBjMCA5Ny45LTczLjMgMTc4LjctMTY4IDE5MC41bDAgNDkuNSA0OCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNDQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGw0OCAwIDAtNDkuNUM3My4zIDQwMi43IDAgMzIxLjkgMCAyMjRsMC00MGMwLTEzLjMgMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhTWljcm9waG9uZUFsdCA9IGZhTWljcm9waG9uZUxpbmVzOwogICAgZmFSZXBseUFsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyZXBseS1hbGwiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsibWFpbC1yZXBseS1hbGwiXSwgImYxMjIiLCAiTTMzMi4yIDE4LjRjMTIgNSAxOS44IDE2LjYgMTkuOCAyOS42bDAgODAgNDggMGM5Ny4yIDAgMTc2IDc4LjggMTc2IDE3NiAwIDExMy4zLTgxLjUgMTYzLjktMTAwLjIgMTc0LjEtMi41IDEuNC01LjMgMS45LTguMSAxLjktMTAuOSAwLTE5LjctOC45LTE5LjctMTkuNyAwLTcuNSA0LjMtMTQuNCA5LjgtMTkuNSA5LjQtOC44IDIyLjItMjYuNCAyMi4yLTU2LjcgMC01My00My05Ni05Ni05NmwtMzIgMCAwIDgwYzAgMTIuOS03LjggMjQuNi0xOS44IDI5LjZzLTI1LjcgMi4yLTM0LjktNi45bC0xNjAtMTYwYy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM2wxNjAtMTYwYzkuMi05LjIgMjIuOS0xMS45IDM0LjktNi45ek0yMDUuNiAyMy4xYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45TDU0LjYgMjA4IDIwNS42IDM1OC45YzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBMMTAgMjMxLjJjLTYuNC02LTEwLTE0LjQtMTAtMjMuMnMzLjYtMTcuMiAxMC0yMy4yTDE3MS42IDIzLjFjOS40LTkuNCAyNC42LTkuNCAzMy45IDB6Il0KICAgIH07CiAgICBmYU1haWxSZXBseUFsbCA9IGZhUmVwbHlBbGw7CiAgICBmYVVuaXZlcnNhbEFjY2VzcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1bml2ZXJzYWwtYWNjZXNzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYyOWEiLCAiTTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTE2MS41LTg2LjFjLTEyLjItNS4yLTI2LjMgLjQtMzEuNSAxMi42cy40IDI2LjMgMTIuNiAzMS41bDExLjkgNS4xYzE3LjMgNy40IDM1LjIgMTIuOSA1My42IDE2LjNsMCA1MC4xYzAgNC4zLS43IDguNi0yLjEgMTIuNmwtMjguNyA4Ni4xYy00LjIgMTIuNiAyLjYgMjYuMiAxNS4yIDMwLjRzMjYuMi0yLjYgMzAuNC0xNS4ybDI0LjQtNzMuMmMxLjMtMy44IDQuOC02LjQgOC44LTYuNHM3LjYgMi42IDguOCA2LjRsMjQuNCA3My4yYzQuMiAxMi42IDE3LjggMTkuNCAzMC40IDE1LjJTMzM5IDM5NyAzMzQuOCAzODQuNGwtMjguNy04Ni4xYy0xLjQtNC4xLTIuMS04LjMtMi4xLTEyLjZsMC01MC4xYzE4LjQtMy41IDM2LjMtOC45IDUzLjYtMTYuM2wxMS45LTUuMWMxMi4yLTUuMiAxNy44LTE5LjMgMTIuNi0zMS41cy0xOS4zLTE3LjgtMzEuNS0xMi42TDMzOC43IDE3NWMtMjYuMSAxMS4yLTU0LjIgMTctODIuNyAxN3MtNTYuNS01LjgtODIuNy0xN2wtMTEuOS01LjF6TTI1NiAxNjBhNDAgNDAgMCAxIDAgMC04MCA0MCA0MCAwIDEgMCAwIDgweiJdCiAgICB9OwogICAgZmFUb2lsZXRQYXBlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0b2lsZXQtcGFwZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjk1MzEsIDYzMjYzLCAidG9pbGV0LXBhcGVyLWFsdCIsICJ0b2lsZXQtcGFwZXItYmxhbmsiXSwgImY3MWUiLCAiTTMyNy4xIDMyYy04LjggMTEuMS0xNiAyMy4xLTIxLjkgMzQuOC0yMS40IDQyLjctMzMuMiA5OC40LTMzLjIgMTU3LjJsMCAyNjRjMCAzMC45LTI1LjEgNTYtNTYgNTZMNTYgNTQ0Yy0zMC45IDAtNTYtMjUuMS01Ni01NkwwIDIyNEMwIDExOCA0MyAzMiA5NiAzMmwyMzEuMSAwek00MTYgNDE2Yy01MyAwLTk2LTg2LTk2LTE5MnM0My0xOTIgOTYtMTkyIDk2IDg2IDk2IDE5Mi00MyAxOTItOTYgMTkyem0wLTEyOGMxNy43IDAgMzItMjguNyAzMi02NHMtMTQuMy02NC0zMi02NC0zMiAyOC43LTMyIDY0IDE0LjMgNjQgMzIgNjR6Il0KICAgIH07CiAgICBmYVRvaWxldFBhcGVyQWx0ID0gZmFUb2lsZXRQYXBlcjsKICAgIGZhVG9pbGV0UGFwZXJCbGFuayA9IGZhVG9pbGV0UGFwZXI7CiAgICBmYVZyQ2FyZGJvYXJkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZyLWNhcmRib2FyZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNzI5IiwgIk01MTIgOTZMNjQgOTZDMjguNyA5NiAwIDEyNC43IDAgMTYwTDAgMzUyYzAgMzUuMyAyOC43IDY0IDY0IDY0bDExNy41IDBjMTcgMCAzMy4zLTYuNyA0NS4zLTE4LjdsMzMuOS0zMy45YzcuMi03LjIgMTcuMS0xMS4zIDI3LjMtMTEuM3MyMC4xIDQuMSAyNy4zIDExLjNsMzMuOSAzMy45YzEyIDEyIDI4LjMgMTguNyA0NS4zIDE4LjdMNTEyIDQxNmMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTE5MmMwLTM1LjMtMjguNy02NC02NC02NHpNODAgMjQwYTY0IDY0IDAgMSAxIDEyOCAwIDY0IDY0IDAgMSAxIC0xMjggMHptMzUyLTY0YTY0IDY0IDAgMSAxIDAgMTI4IDY0IDY0IDAgMSAxIDAtMTI4eiJdCiAgICB9OwogICAgZmFQaXp6YVNsaWNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBpenphLXNsaWNlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY4MTgiLCAiTTE2OS43IC45Yy0yMi44LTEuNi00MS45IDE0LTQ3LjUgMzQuN0wxMTIuNSA3MkMyOTMuMyA3Mi4zIDQzOS43IDIxOC43IDQ0MCAzOTkuNWwzNi40LTkuN2MyMC44LTUuNSAzNi4zLTI0LjcgMzQuNy00Ny41LTEyLjYtMTgyLjgtMTU4LjYtMzI4LjgtMzQxLjQtMzQxLjR6bTIyMiA0MTEuNWMuMi00LjEgLjMtOC4yIC4zLTEyLjQgMC0xNTQuNi0xMjUuNC0yODAtMjgwLTI4MC00LjEgMC04LjMgLjEtMTIuNCAuM0wuNSA0OTEuOWMtMS41IDUuNSAuMSAxMS40IDQuMSAxNS40czkuOSA1LjYgMTUuNCA0LjFsMzcxLjYtOTkuMXpNMTc2IDIwOGEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6bTY0IDEyOGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwek05NiAzODRhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHoiXQogICAgfTsKICAgIGZhU3ByYXlDYW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3ByYXktY2FuIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY1YmQiLCAiTTE5MiAwbDY0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA4MC0xMjggMCAwLTgwYzAtMTcuNyAxNC4zLTMyIDMyLTMyek02NCAyNTZjMC01MyA0My05NiA5Ni05NmwxMjggMGM1MyAwIDk2IDQzIDk2IDk2bDAgMjA4YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0yMjQgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC0yMDh6bTI0MCA4MGE4MCA4MCAwIDEgMCAtMTYwIDAgODAgODAgMCAxIDAgMTYwIDB6TTMyMCA2NGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwek00NDggMzJhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em02NCAzMmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0zMiA2NGEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6TTUxMiAyNTZhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHpNNDQ4IDEyOGEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYVZvbHVtZUxvdyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ2b2x1bWUtbG93IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI4MjY0LCAidm9sdW1lLWRvd24iXSwgImYwMjciLCAiTTQ4IDM1Mmw0OCAwIDEzNC4xIDExOS4yYzYuNCA1LjcgMTQuNiA4LjggMjMuMSA4LjggMTkuMiAwIDM0LjgtMTUuNiAzNC44LTM0LjhsMC0zNzguNGMwLTE5LjItMTUuNi0zNC44LTM0LjgtMzQuOC04LjUgMC0xNi43IDMuMS0yMy4xIDguOEw5NiAxNjAgNDggMTYwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDk2YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4ek0zODAuNiAxODEuNWMtMTAuMy04LjQtMjUuNC02LjgtMzMuOCAzLjVzLTYuOCAyNS40IDMuNSAzMy44QzM2MS4xIDIyNy42IDM2OCAyNDEgMzY4IDI1NnMtNi45IDI4LjQtMTcuNyAzNy4zYy0xMC4zIDguNC0xMS44IDIzLjUtMy41IDMzLjhzMjMuNSAxMS44IDMzLjggMy41QzQwMi4xIDMxMi45IDQxNiAyODYuMSA0MTYgMjU2cy0xMy45LTU2LjktMzUuNS03NC41eiJdCiAgICB9OwogICAgZmFWb2x1bWVEb3duID0gZmFWb2x1bWVMb3c7CiAgICBmYUNyb3NzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNyb3NzIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4MzI3LCAxMDAxM10sICJmNjU0IiwgIk0xNzYgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCA4MC04MCAwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDMyYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDgwIDAgMCAyMDhjMCAyNi41IDIxLjUgNDggNDggNDhsMzIgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTIwOCA4MCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMzJjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTgwIDAgMC04MGMwLTI2LjUtMjEuNS00OC00OC00OEwxNzYgMHoiXQogICAgfTsKICAgIGZhUGVyc29uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbiIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyOTQ4NSwgIm1hbGUiXSwgImYxODMiLCAiTTI0OCAyNGE1NiA1NiAwIDEgMCAtMTEyIDAgNTYgNTYgMCAxIDAgMTEyIDB6bTI0IDIxMi43bDQ2LjMgNjIuNGMxMC41IDE0LjIgMzAuNiAxNy4yIDQ0LjggNi42czE3LjItMzAuNiA2LjYtNDQuOGwtNzAuNS05NUMyNzQgMTMyIDIzNC4zIDExMiAxOTIgMTEycy04MiAyMC0xMDcuMiA1My45bC03MC41IDk1Yy0xMC41IDE0LjItNy42IDM0LjIgNi42IDQ0LjhzMzQuMiA3LjYgNDQuOC02LjZMMTEyIDIzNi43IDExMiA1MTJjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE2MGMwLTguOCA3LjItMTYgMTYtMTZzMTYgNy4yIDE2IDE2bDAgMTYwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yNzUuM3oiXQogICAgfTsKICAgIGZhTWFsZSA9IGZhUGVyc29uOwogICAgZmFIb3VyZ2xhc3MzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXJnbGFzcyIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzkyMDMsIDYyMDMyLCAiaG91cmdsYXNzLWVtcHR5Il0sICJmMjU0IiwgIk0wIDMyQzAgMTQuMyAxNC4zIDAgMzIgMEwzNTIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwwIDExYzAgNDIuNC0xNi45IDgzLjEtNDYuOSAxMTMuMWwtNjcuOSA2Ny45IDY3LjkgNjcuOWMzMCAzMCA0Ni45IDcwLjcgNDYuOSAxMTMuMWwwIDExYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDUxMmMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwwLTExYzAtNDIuNCAxNi45LTgzLjEgNDYuOS0xMTMuMWw2Ny45LTY3LjktNjcuOS02Ny45QzQ4LjkgMTU4LjEgMzIgMTE3LjQgMzIgNzVsMC0xMUMxNC4zIDY0IDAgNDkuNyAwIDMyek05NiA2NGwwIDExYzAgMjUuNSAxMC4xIDQ5LjkgMjguMSA2Ny45bDY3LjkgNjcuOSA2Ny45LTY3LjljMTgtMTggMjguMS00Mi40IDI4LjEtNjcuOWwwLTExLTE5MiAwem0wIDM4NGwxOTIgMCAwLTExYzAtMjUuNS0xMC4xLTQ5LjktMjguMS02Ny45bC02Ny45LTY3LjktNjcuOSA2Ny45Yy0xOCAxOC0yOC4xIDQyLjQtMjguMSA2Ny45bDAgMTF6Il0KICAgIH07CiAgICBmYUhvdXJnbGFzc0VtcHR5MiA9IGZhSG91cmdsYXNzMzsKICAgIGZhRmlzaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaXNoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4MDMxXSwgImY1NzgiLCAiTTE4MC41IDE0MS41QzIxOS43IDEwOC41IDI3Mi42IDgwIDMzNiA4MHMxMTYuMyAyOC41IDE1NS41IDYxLjVjMzkuMSAzMyA2Ni45IDcyLjQgODEgOTkuOCA0LjcgOS4yIDQuNyAyMC4xIDAgMjkuMy0xNC4xIDI3LjQtNDEuOSA2Ni44LTgxIDk5LjgtMzkuMiAzMy4xLTkyIDYxLjUtMTU1LjUgNjEuNXMtMTE2LjMtMjguNS0xNTUuNS02MS41Yy0xNi4yLTEzLjctMzAuNS0yOC41LTQyLjctNDMuMUw0OC4xIDM3OS42Yy0xMi41IDcuMy0yOC40IDUuMy0zOC43LTQuOXMtMTIuNC0yNi01LjMtMzguNkw1MCAyNTYgNC4yIDE3NS45Yy03LjItMTIuNi01LTI4LjQgNS4zLTM4LjZzMjYuMS0xMi4yIDM4LjctNC45bDg5LjcgNTIuM2MxMi4yLTE0LjYgMjYuNS0yOS40IDQyLjctNDMuMXpNNDQ4IDI1NmEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAweiJdCiAgICB9OwogICAgZmFEcnVtc3RpY2tCaXRlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRydW1zdGljay1iaXRlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY2ZDciLCAiTTE2MCAyNjUuMmMwIDguNS0zLjQgMTYuNi05LjQgMjIuNmwtMjYuOCAyNi44Yy0xMi4zIDEyLjMtMzIuNSAxMS40LTQ5LjQgNy4yLTQuNi0xLjEtOS41LTEuOC0xNC41LTEuOC0zMy4xIDAtNjAgMjYuOS02MCA2MHMyNi45IDYwIDYwIDYwYzYuMyAwIDEyIDUuNyAxMiAxMiAwIDMzLjEgMjYuOSA2MCA2MCA2MHM2MC0yNi45IDYwLTYwYzAtNS0uNi05LjgtMS44LTE0LjUtNC4yLTE2LjktNS4yLTM3LjEgNy4yLTQ5LjRsMjYuOC0yNi44YzYtNiAxNC4xLTkuNCAyMi42LTkuNGw4OS4yIDBjNi4zIDAgMTIuNC0uMyAxOC41LTEgMTEuOS0xLjIgMTYuNC0xNS41IDEwLjgtMjYtOC41LTE1LjgtMTMuMy0zMy44LTEzLjMtNTMgMC02MS45IDUwLjEtMTEyIDExMi0xMTIgOCAwIDE1LjcgLjggMjMuMiAyLjQgMTEuNyAyLjUgMjQuMS01LjkgMjItMTcuNi0xNC43LTgyLjMtODYuNy0xNDQuOC0xNzMuMi0xNDQuOC05Ny4yIDAtMTc2IDc4LjgtMTc2IDE3NmwwIDg5LjJ6Il0KICAgIH07CiAgICBmYUNoYXJ0U2ltcGxlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoYXJ0LXNpbXBsZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNDczIiwgIk0xOTIgODBjMC0yNi41IDIxLjUtNDggNDgtNDhsMzIgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDM1MmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMzIgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC0zNTJ6TTAgMjcyYzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDMyIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAxNjBjMCAyNi41LTIxLjUgNDgtNDggNDhsLTMyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4TDAgMjcyek00MzIgOTZsMzIgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDI4OGMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMzIgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC0yODhjMC0yNi41IDIxLjUtNDggNDgtNDh6Il0KICAgIH07CiAgICBmYUF0b20gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXRvbSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzk4ODNdLCAiZjVkMiIsICJNMjI0IDM5OC44Yy0xMS44IDUuMS0yMy40IDkuNy0zNC45IDEzLjUgMTYuNyAzMy44IDMxIDM1LjcgMzQuOSAzNS43czE4LjEtMS45IDM0LjktMzUuN2MtMTEuNC0zLjktMjMuMS04LjQtMzQuOS0xMy41ek00MTQgMjU2YzMzIDQ1LjIgNDQuMyA5MC45IDIzLjYgMTI4LTIwLjIgMzYuMy02Mi41IDQ5LjMtMTE1LjIgNDMuMi0yMiA1Mi4xLTU1LjcgODQuOC05OC40IDg0LjhzLTc2LjQtMzIuNy05OC40LTg0LjhDNzIuOSA0MzMuMyAzMC42IDQyMC4zIDEwLjQgMzg0LTEwLjMgMzQ2LjkgMSAzMDEuMiAzNCAyNTYgMSAyMTAuOC0xMC4zIDE2NS4xIDEwLjQgMTI4IDMwLjYgOTEuNyA3Mi45IDc4LjcgMTI1LjYgODQuOCAxNDcuNiAzMi43IDE4MS4yIDAgMjI0IDBzNzYuNCAzMi43IDk4LjQgODQuOGM1Mi43LTYuMSA5NSA2LjggMTE1LjIgNDMuMiAyMC43IDM3LjEgOS40IDgyLjgtMjMuNiAxMjh6bS02NS44IDY3LjRjLTEuNyAxNC4yLTMuOSAyOC02LjcgNDEuMiAzMS44IDEuNCAzOC42LTguNyA0MC4yLTExLjcgMi4zLTQuMiA3LTE3LjktMTEuOS00OC4xLTYuOCA2LjMtMTQgMTIuNS0yMS42IDE4LjZ6bS02LjctMTc1LjljMi44IDEzLjEgNSAyNi45IDYuNyA0MS4yIDcuNiA2LjEgMTQuOCAxMi4zIDIxLjYgMTguNiAxOC45LTMwLjIgMTQuMi00NCAxMS45LTQ4LjEtMS42LTIuOS04LjQtMTMtNDAuMi0xMS43ek0yNTguOSA5OS43QzI0Mi4xIDY1LjkgMjI3LjkgNjQgMjI0IDY0cy0xOC4xIDEuOS0zNC45IDM1LjdjMTEuNCAzLjkgMjMuMSA4LjQgMzQuOSAxMy41IDExLjgtNS4xIDIzLjQtOS43IDM0LjktMTMuNXptLTE1OSA4OC45YzEuNy0xNC4zIDMuOS0yOCA2LjctNDEuMi0zMS44LTEuNC0zOC42IDguNy00MC4yIDExLjctMi4zIDQuMi03IDE3LjkgMTEuOSA0OC4xIDYuOC02LjMgMTQtMTIuNSAyMS42LTE4LjZ6TTc4LjIgMzA0LjhjLTE4LjkgMzAuMi0xNC4yIDQ0LTExLjkgNDguMSAxLjYgMi45IDguNCAxMyA0MC4yIDExLjctMi44LTEzLjEtNS0yNi45LTYuNy00MS4yLTcuNi02LjEtMTQuOC0xMi4zLTIxLjYtMTguNnpNMzA0IDI1NmE4MCA4MCAwIDEgMCAtMTYwIDAgODAgODAgMCAxIDAgMTYwIDB6bS04MC0zMmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYVAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicCIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWzExMl0sICI1MCIsICJNMCA2NEMwIDQ2LjMgMTQuMyAzMiAzMiAzMmwxMjggMGM4OC40IDAgMTYwIDcxLjYgMTYwIDE2MFMyNDguNCAzNTIgMTYwIDM1MmwtOTYgMCAwIDk2YzAgMTcuNy0xNC4zIDMyLTMyIDMyUzAgNDY1LjcgMCA0NDhMMCA2NHpNNjQgMjg4bDk2IDBjNTMgMCA5Ni00MyA5Ni05NnMtNDMtOTYtOTYtOTZsLTk2IDAgMCAxOTJ6Il0KICAgIH07CiAgICBmYUpldEZpZ2h0ZXJVcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJqZXQtZmlnaHRlci11cCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTE4IiwgIk0yMDYuOCA0Ny44QzIwMi4zIDU4LjUgMjAwIDcwIDIwMCA4MS42bDAgMTAwLjQtMTUyIDExNCAwLTQ4YzAtMTMuMy0xMC43LTI0LTI0LTI0UzAgMjM0LjcgMCAyNDhMMCAzOTJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTggMTUyIDAgMCA1NC40LTY2IDUyLjhjLTMuOCAzLTYgNy42LTYgMTIuNWwwIDI0LjNjMCA4LjggNy4yIDE2IDE2IDE2bDg4IDAgMC00MGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgNDAgODggMGM4LjggMCAxNi03LjIgMTYtMTZsMC0yNC4zYzAtNC45LTIuMi05LjUtNi0xMi41bC02Ni01Mi44IDAtNTQuNCAxNTIgMCAwIDhjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTE0NGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDQ4LTE1Mi0xMTQgMC0xMDAuNGMwLTExLjYtMi4zLTIzLjEtNi44LTMzLjhsLTI3LjEtNjVDMjc0LjQtMjYuMiAyNjUuNy0zMiAyNTYtMzJzLTE4LjQgNS44LTIyLjIgMTQuOGwtMjcuMSA2NXoiXQogICAgfTsKICAgIGZhUGx1Z0NpcmNsZVhtYXJrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBsdWctY2lyY2xlLXhtYXJrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NjAiLCAiTTE5Mi0zMmMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDk2IDEyOCAwIDAtOTZjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDk2IDY0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsMCA0OC43Yy05OC42IDguMS0xNzYgOTAuNy0xNzYgMTkxLjMgMCAyNy4zIDUuNyA1My4zIDE2IDc2LjlsMCAzLjFjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02Ni43QzE2NS4yIDM5OC4xIDk2IDMxOS4xIDk2IDIyNGwwLTY0Yy0xNy43IDAtMzItMTQuMy0zMi0zMlM3OC4zIDk2IDk2IDk2bDY0IDAgMC05NmMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNNDk2IDI1NmExNDQgMTQ0IDAgMSAxIDAgMjg4IDE0NCAxNDQgMCAxIDEgMC0yODh6bTU5LjMgMTA3LjNjNi4yLTYuMiA2LjItMTYuNCAwLTIyLjZzLTE2LjQtNi4yLTIyLjYgMGwtMzYuNyAzNi43LTM2LjctMzYuN2MtNi4yLTYuMi0xNi40LTYuMi0yMi42IDBzLTYuMiAxNi40IDAgMjIuNmwzNi43IDM2LjctMzYuNyAzNi43Yy02LjIgNi4yLTYuMiAxNi40IDAgMjIuNnMxNi40IDYuMiAyMi42IDBsMzYuNy0zNi43IDM2LjcgMzYuN2M2LjIgNi4yIDE2LjQgNi4yIDIyLjYgMHM2LjItMTYuNCAwLTIyLjZsLTM2LjctMzYuNyAzNi43LTM2Ljd6Il0KICAgIH07CiAgICBmYVNoZWV0UGxhc3RpYyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaGVldC1wbGFzdGljIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImU1NzEiLCAiTTAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE0OS41IDBjMTcgMCAzMy4zLTYuNyA0NS4zLTE4LjdMMzY1LjMgMzg2LjdjMTItMTIgMTguNy0yOC4zIDE4LjctNDUuM0wzODQgNjRjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMEMyOC43IDAgMCAyOC43IDAgNjRMMCA0NDh6bTIwOCA1LjVsMC05My41YzAtMTMuMyAxMC43LTI0IDI0LTI0bDkzLjUgMC0xMTcuNSAxMTcuNXpNMTUzIDEwNWwtNDggNDhjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsNDgtNDhjOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45em05NiAzMkwxMzcgMjQ5Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45TDIxNSAxMDNjOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45eiJdCiAgICB9OwogICAgZmFWID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInYiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMThdLCAiNTYiLCAiTTE5LjcgMzQuNWMxNi4zLTYuOCAzNSAuOSA0MS44IDE3LjJMMTkyIDM2NC44IDMyMi41IDUxLjdjNi44LTE2LjMgMjUuNS0yNCA0MS44LTE3LjJzMjQgMjUuNSAxNy4yIDQxLjhsLTE2MCAzODRjLTUgMTEuOS0xNi42IDE5LjctMjkuNSAxOS43cy0yNC42LTcuOC0yOS41LTE5LjdMMi41IDc2LjNjLTYuOC0xNi4zIC45LTM1IDE3LjItNDEuOHoiXQogICAgfTsKICAgIGZhTGlzdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsaXN0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImxpc3Qtc3F1YXJlcyJdLCAiZjAzYSIsICJNNDAgNDhDMjYuNyA0OCAxNiA1OC43IDE2IDcybDAgNDhjMCAxMy4zIDEwLjcgMjQgMjQgMjRsNDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTQ4YzAtMTMuMy0xMC43LTI0LTI0LTI0TDQwIDQ4ek0xOTIgNjRjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMjg4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMTkyIDY0em0wIDE2MGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwyODggMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMjg4IDB6bTAgMTYwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDI4OCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0yODggMHpNMTYgMjMybDAgNDhjMCAxMy4zIDEwLjcgMjQgMjQgMjRsNDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTQ4YzAtMTMuMy0xMC43LTI0LTI0LTI0bC00OCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHpNNDAgMzY4Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDQ4YzAgMTMuMyAxMC43IDI0IDI0IDI0bDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC00OGMwLTEzLjMtMTAuNy0yNC0yNC0yNGwtNDggMHoiXQogICAgfTsKICAgIGZhTGlzdFNxdWFyZXMgPSBmYUxpc3Q7CiAgICBmYVBpc2NlcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwaXNjZXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTg0YyIsICJNNDAuNCAxMC40YzExLjktMTMgMzIuMi0xMy45IDQ1LjItMiAyLjkgMi43IDI4LjMgMjYuNyA1My42IDY3LjggMjIuMyAzNi4yIDQ1IDg2LjYgNTEuMSAxNDcuOGw2Ny4zIDBjNi4xLTYxLjEgMjguOC0xMTEuNiA1MS4xLTE0Ny44IDI1LjMtNDEuMSA1MC43LTY1LjEgNTMuNi02Ny44IDEzLTExLjkgMzMuMy0xMS4xIDQ1LjIgMiAxMS45IDEzIDExIDMzLjMtMiA0NS4yLTEuNCAxLjMtMjIgMjEuMS00Mi40IDU0LjItMTcuOSAyOS4xLTM1LjQgNjgtNDEuMiAxMTQuMmw5NCAwIDMuMyAuMmMxNi4xIDEuNiAyOC43IDE1LjMgMjguNyAzMS44cy0xMi42IDMwLjItMjguNyAzMS44bC0zLjMgLjItOTQgMGM1LjggNDYuMiAyMy4zIDg1LjEgNDEuMiAxMTQuMiAyMC40IDMzLjEgNDEgNTIuOSA0Mi40IDU0LjIgMTMgMTEuOSAxMy45IDMyLjIgMiA0NS4yLTExLjkgMTMtMzIuMiAxMy45LTQ1LjIgMi0yLjktMi43LTI4LjMtMjYuNy01My42LTY3LjgtMjIuMy0zNi4yLTQ1LTg2LjYtNTEuMS0xNDcuOGwtNjcuMyAwYy02LjEgNjEuMS0yOC44IDExMS42LTUxLjEgMTQ3LjgtMjUuMyA0MS4xLTUwLjcgNjUuMS01My42IDY3LjgtMTMgMTEuOS0zMy4zIDExLjEtNDUuMi0yLTExLjktMTMtMTEtMzMuMyAyLTQ1LjIgMS40LTEuMyAyMi0yMS4xIDQyLjQtNTQuMiAxNy45LTI5LjEgMzUuNC02OCA0MS4yLTExNC4ybC05NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDk0IDBjLTUuOC00Ni4yLTIzLjMtODUuMS00MS4yLTExNC4yLTIwLjQtMzMuMS00MS01Mi45LTQyLjQtNTQuMi0xMy0xMS45LTEzLjktMzIuMi0yLTQ1LjJ6Il0KICAgIH07CiAgICBmYVNvbGFyUGFuZWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic29sYXItcGFuZWwiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjViYSIsICJNMTIxLjggMzJjLTMwIDAtNTYgMjAuOC02Mi41IDUwLjFMOS42IDMwNi4xQy43IDM0Ni4xIDMxLjEgMzg0IDcyIDM4NGwxODQuMSAwIDAgNjQtNjQgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwxOTIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNjQgMCAwLTY0IDE4NC4xIDBjNDAuOSAwIDcxLjQtMzcuOSA2Mi41LTc3LjlsLTQ5LjgtMjI0QzUxMC40IDUyLjggNDg0LjUgMzIgNDU0LjUgMzJMMTIxLjggMzJ6TTI0NS42IDk2bDg1LjIgMCA3LjMgODgtOTkuOCAwIDcuMy04OHptLTU1LjUgODhsLTg3LjggMCAxOS42LTg4IDc1LjYgMC03LjMgODh6TTkxLjYgMjMybDk0LjUgMC03LjMgODgtMTA2LjcgMCAxOS42LTg4em0xNDIuNiAwbDEwNy44IDAgNy4zIDg4LTEyMi41IDAgNy4zLTg4em0xNTYgMGw5NC41IDAgMTkuNiA4OC0xMDYuNyAwLTcuMy04OHpNNDc0IDE4NGwtODcuOCAwLTcuMy04OCA3NS42IDAgMTkuNiA4OHoiXQogICAgfTsKICAgIGZhTGFuZE1pbmVPbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsYW5kLW1pbmUtb24iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUxYiIsICJNMzEyIDBsMCAxMjhjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRMMjY0IDBjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNHpNMTYwIDI4OGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwxOTIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDMyIDgwIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA5NmMwIDI2LjUtMjEuNSA0OC00OCA0OEw4MCA1MTJjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtOTZjMC0yNi41IDIxLjUtNDggNDgtNDhsODAgMCAwLTMyek0xMiAxMTQuN2M3LjQtMTEgMjIuMy0xNCAzMy4zLTYuN2w5NiA2NGMxMSA3LjQgMTQgMjIuMyA2LjcgMzMuM3MtMjIuMyAxNC0zMy4zIDYuN2wtOTYtNjRjLTExLTcuNC0xNC0yMi4zLTYuNy0zMy4zek01MzAuNyAxMDhjMTEtNy40IDI1LjktNC40IDMzLjMgNi43czQuNCAyNS45LTYuNyAzMy4zbC05NiA2NGMtMTEgNy40LTI1LjkgNC40LTMzLjMtNi43cy00LjQtMjUuOSA2LjctMzMuM2w5Ni02NHoiXQogICAgfTsKICAgIGZhSGVhZHBob25lczIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGVhZHBob25lcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyNzkxMSwgNjI4NjMsICJoZWFkcGhvbmVzLWFsdCIsICJoZWFkcGhvbmVzLXNpbXBsZSJdLCAiZjAyNSIsICJNNjQgMjI0YzAtODguNCA3MS42LTE2MCAxNjAtMTYwczE2MCA3MS42IDE2MCAxNjBsMCAzNy41Yy0xMC0zLjUtMjAuOC01LjUtMzItNS41bC0xNiAwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDEyOGMwIDI2LjUgMjEuNSA0OCA0OCA0OGwxNiAwYzUzIDAgOTYtNDMgOTYtOTZsMC0xNjBDNDQ4IDEwMC4zIDM0Ny43IDAgMjI0IDBTMCAxMDAuMyAwIDIyNEwwIDM4NGMwIDUzIDQzIDk2IDk2IDk2bDE2IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0xMjhjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTE2IDBjLTExLjIgMC0yMiAxLjktMzIgNS41TDY0IDIyNHoiXQogICAgfTsKICAgIGZhSGVhZHBob25lc0FsdDIgPSBmYUhlYWRwaG9uZXMyOwogICAgZmFIZWFkcGhvbmVzU2ltcGxlMiA9IGZhSGVhZHBob25lczI7CiAgICBmYUJ1cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJidXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjg2NTNdLCAiZjIwNyIsICJNOTYgMEM0MyAwIDAgNDMgMCA5NkwwIDM4NGMwIDI5LjggMjAuNCA1NC45IDQ4IDYybDAgMzRjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTMyIDE5MiAwIDAgMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTM0YzI3LjYtNy4xIDQ4LTMyLjIgNDgtNjJsMC0yODhjMC01My00My05Ni05Ni05Nkw5NiAwek02NCAxNzZjMC0xNy43IDE0LjMtMzIgMzItMzJsMTA0IDAgMCAxMTItMTA0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNDh6bTE4NCA4MGwwLTExMiAxMDQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDQ4YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0xMDQgMHpNOTYgMzIwYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHptMjU2IDBhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0ek0xNTIgNzJjMC0xMy4zIDEwLjctMjQgMjQtMjRsOTYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtOTYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjR6Il0KICAgIH07CiAgICBmYUZpbGVQb3dlcnBvaW50MiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLXBvd2VycG9pbnQiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjFjNCIsICJNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMMjEzLjUgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN0wzNjUuMyAxMjUuM2MxMiAxMiAxOC43IDI4LjMgMTguNyA0NS4zTDM4NCA0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDY0em0yMDgtNS41bDAgOTMuNWMwIDEzLjMgMTAuNyAyNCAyNCAyNEwzMjUuNSAxNzYgMjA4IDU4LjV6TTE1MiAyNTZjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMTQ0YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0yNCAyNCAwYzM5LjggMCA3Mi0zMi4yIDcyLTcycy0zMi4yLTcyLTcyLTcybC00OCAwem00OCA5NmwtMjQgMCAwLTQ4IDI0IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjR6Il0KICAgIH07CiAgICBmYVF1b3RlTGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJxdW90ZS1sZWZ0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbODIyMCwgInF1b3RlLWxlZnQtYWx0Il0sICJmMTBkIiwgIk0wIDIxNkMwIDE0OS43IDUzLjcgOTYgMTIwIDk2bDggMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtOCAwYy0zMC45IDAtNTYgMjUuMS01NiA1NmwwIDggNjQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDY0YzAgMzUuMy0yOC43IDY0LTY0IDY0bC02NCAwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDIxNnptMjU2IDBjMC02Ni4zIDUzLjctMTIwIDEyMC0xMjBsOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC04IDBjLTMwLjkgMC01NiAyNS4xLTU2IDU2bDAgOCA2NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgNjRjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTY0IDBjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMTM2eiJdCiAgICB9OwogICAgZmFRdW90ZUxlZnRBbHQgPSBmYVF1b3RlTGVmdDsKICAgIGZhQ2hldnJvbkRvd24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hldnJvbi1kb3duIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYwNzgiLCAiTTIwMS40IDQwNi42YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwbDE5Mi0xOTJjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBMMjI0IDMzOC43IDU0LjYgMTY5LjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zbDE5MiAxOTJ6Il0KICAgIH07CiAgICBmYUVhcnRoQXNpYSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJlYXJ0aC1hc2lhIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3NzU5LCAiZ2xvYmUtYXNpYSJdLCAiZjU3ZSIsICJNNTAgMjg0LjhjNC4yIDIuMSA5IDMuMiAxNCAzLjJsNTAuNyAwYzguNSAwIDE2LjYgMy40IDIyLjYgOS40bDEzLjMgMTMuM2M2IDYgMTQuMSA5LjQgMjIuNiA5LjRsMTguNyAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNDBjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQtMTAuNyAyNC0yNGwwLTQyLjdjMC04LjUgMy40LTE2LjYgOS40LTIyLjZsMTMuMy0xMy4zYzYtNiA5LjQtMTQuMSA5LjQtMjIuNkwzMDQgNTdjMC0xLjItLjEtMi4zLS4yLTMuNS0xNS40LTMuNi0zMS40LTUuNS00Ny44LTUuNS0xMTQuOSAwLTIwOCA5My4xLTIwOCAyMDggMCA5LjggLjcgMTkuNCAyIDI4Ljh6bTQwMy4zIDM3LjNjLTMuMi0xLjQtNi43LTIuMS0xMC41LTIuMUw0MzIgMzIwYy04LjggMC0xNi03LjItMTYtMTZzLTcuMi0xNi0xNi0xNmwtMzQuNyAwYy04LjUgMC0xNi42IDMuNC0yMi42IDkuNGwtNDUuMyA0NS4zYy02IDYtOS40IDE0LjEtOS40IDIyLjZsMCAxOC43YzAgMTcuNyAxNC4zIDMyIDMyIDMybDE4LjcgMGM4LjUgMCAxNi42IDMuNCAyMi42IDkuNCAyLjIgMi4yIDQuNyA0LjEgNy4zIDUuNSAzOS4zLTI1LjQgNjkuNS02My42IDg0LjYtMTA4Ljh6TTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6TTEyOCAzNjhjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2cy03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnpNMjcyIDI1NmMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNnptNDgtMTEybDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNnMtMTYgNy4yLTE2IDE2eiJdCiAgICB9OwogICAgZmFHbG9iZUFzaWEgPSBmYUVhcnRoQXNpYTsKICAgIGZhQ2VudFNpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2VudC1zaWduIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImUzZjUiLCAiTTIwOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMjUuNGM0My42IDUuMiA4MyAyNC41IDExMy4zIDUzLjEgMTIuOSAxMi4xIDEzLjQgMzIuNCAxLjMgNDUuMnMtMzIuNCAxMy40LTQ1LjIgMS4zYy0yNC40LTIzLTU3LjItMzcuMS05My4zLTM3LjEtNzUuMSAwLTEzNiA2MC45LTEzNiAxMzZzNjAuOSAxMzYgMTM2IDEzNmMzNi4yIDAgNjktMTQuMSA5My4zLTM3LjEgMTIuOS0xMi4xIDMzLjEtMTEuNSA0NS4yIDEuM3MxMS41IDMzLjEtMS4zIDQ1LjJDMzIzIDQzMC4xIDI4My42IDQ0OS40IDI0MCA0NTQuNmwwIDI1LjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0yOEM4NC43IDQzMy41IDE2IDM1Mi44IDE2IDI1NlM4NC43IDc4LjUgMTc2IDYwbDAtMjhjMC0xNy43IDE0LjMtMzIgMzItMzJ6Il0KICAgIH07CiAgICBmYVNoaWVsZENhdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaGllbGQtY2F0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1NzIiLCAiTTI2OS40IDIuOUMyNjUuMiAxIDI2MC43IDAgMjU2IDBzLTkuMiAxLTEzLjQgMi45TDU0LjMgODIuOGMtMjIgOS4zLTM4LjQgMzEtMzguMyA1Ny4yIC41IDk5LjIgNDEuMyAyODAuNyAyMTMuNiAzNjMuMiAxNi43IDggMzYuMSA4IDUyLjggMCAxNzIuNC04Mi41IDIxMy4yLTI2NCAyMTMuNi0zNjMuMiAuMS0yNi4yLTE2LjMtNDcuOS0zOC4zLTU3LjJMMjY5LjQgMi45ek0xNjAgMTU0LjRjMC01LjggNC43LTEwLjQgMTAuNC0xMC40bC4yIDBjMy40IDAgNi41IDEuNiA4LjUgNC4zbDQwIDUzLjNjMyA0IDcuOCA2LjQgMTIuOCA2LjRsNDggMGM1IDAgOS44LTIuNCAxMi44LTYuNGw0MC01My4zYzItMi43IDUuMi00LjMgOC41LTQuM2wuMiAwYzUuOCAwIDEwLjQgNC43IDEwLjQgMTAuNEwzNTIgMjcyYzAgNTMtNDMgOTYtOTYgOTZzLTk2LTQzLTk2LTk2bDAtMTE3LjZ6TTIxNiAyODhhMTYgMTYgMCAxIDAgMC0zMiAxNiAxNiAwIDEgMCAwIDMyem05Ni0xNmExNiAxNiAwIDEgMCAtMzIgMCAxNiAxNiAwIDEgMCAzMiAweiJdCiAgICB9OwogICAgZmFTY2hvb2xDaXJjbGVDaGVjayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzY2hvb2wtY2lyY2xlLWNoZWNrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NmIiLCAiTTY0IDEyOGMtMzUuMyAwLTY0IDI4LjctNjQgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjc2IDBjLTEwLjUtMTQuNi0xOS0zMC43LTI1LjEtNDhsLTkwLjkgMCAwLTg4YzAtMjIuMSAxNy45LTQwIDQwLTQwbDQ4IDBjMSAwIDEuOSAwIDIuOSAuMSAyNi4zLTc0LjYgOTcuNS0xMjguMSAxODEuMS0xMjguMSAyOC42IDAgNTUuNiA2LjIgODAgMTcuNGwwLTMzLjRjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTY0IDAtMTI3LjktMTE1LjFjLTE4LjMtMTYuNC00Ni0xNi40LTY0LjIgMEwxMjggMTI4IDY0IDEyOHptNjQgMjQwYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJ6TTExMiAyNTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNnpNMjg4IDEyOGE2NCA2NCAwIDEgMSAwIDEyOCA2NCA2NCAwIDEgMSAwLTEyOHpNNjQwIDQwMGExNDQgMTQ0IDAgMSAwIC0yODggMCAxNDQgMTQ0IDAgMSAwIDI4OCAwem0tODYuNi02MC45YzcuMSA1LjIgOC43IDE1LjIgMy41IDIyLjNsLTY0IDg4Yy0yLjggMy44LTcgNi4yLTExLjcgNi41cy05LjMtMS4zLTEyLjYtNC42bC00MC00MGMtNi4yLTYuMi02LjItMTYuNCAwLTIyLjZzMTYuNC02LjIgMjIuNiAwbDI2LjggMjYuOCA1My03Mi45YzUuMi03LjEgMTUuMi04LjcgMjIuNC0zLjV6Il0KICAgIH07CiAgICBmYU1hcnRpbmlHbGFzcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtYXJ0aW5pLWdsYXNzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3ODY0LCAiZ2xhc3MtbWFydGluaS1hbHQiXSwgImY1N2IiLCAiTTIuNCA1MS44QzcuNCAzOS44IDE5LjEgMzIgMzIgMzJsNDQ4IDBjMTIuOSAwIDI0LjYgNy44IDI5LjYgMTkuOHMyLjIgMjUuNy02LjkgMzQuOUwyODggMzAxLjMgMjg4IDQ0OCAzNTIgNDQ4YzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0xOTIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw2NCAwIDAtMTQ2LjctMjE0LjYtMjE0LjZDLjIgNzcuNS0yLjUgNjMuNyAyLjQgNTEuOHpNMzU0LjcgMTQ0bDQ4LTQ4LTI5My41IDAgNDggNDggMTk3LjUgMHoiXQogICAgfTsKICAgIGZhR2xhc3NNYXJ0aW5pQWx0ID0gZmFNYXJ0aW5pR2xhc3M7CiAgICBmYVBsdWcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGx1ZyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyODI2OF0sICJmMWU2IiwgIk0xMjgtMzJjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA5NiAxMjggMCAwLTk2YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCA5NiA2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybDAgNjRjMCA5NS4xLTY5LjIgMTc0LjEtMTYwIDE4OS4zbDAgNjYuN2MwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY2LjdDMTAxLjIgMzk4LjEgMzIgMzE5LjEgMzIgMjI0bDAtNjRjLTE3LjcgMC0zMi0xNC4zLTMyLTMyUzE0LjMgOTYgMzIgOTZsNjQgMCAwLTk2YzAtMTcuNyAxNC4zLTMyIDMyLTMyeiJdCiAgICB9OwogICAgZmFQYW5vcmFtYSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwYW5vcmFtYSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlMjA5IiwgIk00My45IDQ4QzE5LjcgNDggMCA2Ny43IDAgOTEuOUwwIDQyMC4xYzAgMjQuMyAxOS43IDQzLjkgNDMuOSA0My45IDUuNSAwIDEwLjctMSAxNS43LTIuOSAxMi45LTQuOSAxMDMuNC0zNy4xIDIyOC40LTM3LjFzMjE1LjUgMzIuMyAyMjguNCAzNy4xYzUgMS45IDEwLjIgMi45IDE1LjcgMi45IDI0LjMgMCA0My45LTE5LjcgNDMuOS00My45bDAtMzI4LjJjMC0yNC4zLTE5LjctNDMuOS00My45LTQzLjktNS41IDAtMTAuNyAxLTE1LjcgMi45LTEyLjkgNC45LTEwMy40IDM3LjEtMjI4LjQgMzcuMVM3Mi41IDU1LjcgNTkuNiA1MC45QzU0LjYgNDkgNDkuNCA0OCA0My45IDQ4ek03MiAxNzZhNDAgNDAgMCAxIDEgODAgMCA0MCA0MCAwIDEgMSAtODAgMHptMjY0LjEtMTZjNy41IDAgMTQuNiAzLjYgMTkuMSA5LjZMNDc5LjcgMzM2LjJjNS45IDcuOSA2LjQgMTguNSAxLjMgMjYuOXMtMTQuOCAxMi44LTI0LjUgMTEuMWMtNDUuOC03LjgtMTAzLjMtMTQuMi0xNjguNC0xNC4yLTY1LjYgMC0xMjMuNCA2LjUtMTY5LjMgMTQuNC05LjggMS43LTE5LjctMi45LTI0LjctMTEuNXMtNC4zLTE5LjQgMS45LTI3LjJMMTY1LjMgMjQ5YzQuNi01LjcgMTEuNS05IDE4LjctOXMxNC4yIDMuMyAxOC43IDlsMjcuNSAzNC40IDg2LjctMTEzLjljNC42LTYgMTEuNy05LjUgMTkuMi05LjV6Il0KICAgIH07CiAgICBmYUNsb2NrUm90YXRlTGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjbG9jay1yb3RhdGUtbGVmdCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJoaXN0b3J5Il0sICJmMWRhIiwgIk0yODggNjRjMTA2IDAgMTkyIDg2IDE5MiAxOTJTMzk0IDQ0OCAyODggNDQ4Yy02NS4yIDAtMTIyLjktMzIuNS0xNTcuNi04Mi4zLTEwLjEtMTQuNS0zMC4xLTE4LTQ0LjYtNy45cy0xOCAzMC4xLTcuOSA0NC42QzEyNC4xIDQ2OC42IDIwMSA1MTIgMjg4IDUxMiA0MjkuNCA1MTIgNTQ0IDM5Ny40IDU0NCAyNTZTNDI5LjQgMCAyODggMEMyMDIuMyAwIDEyNi41IDQyLjEgODAgMTA2LjdMODAgODBjMC0xNy43LTE0LjMtMzItMzItMzJTMTYgNjIuMyAxNiA4MGwwIDExMmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwyNC42IDBjLjUgMCAxIDAgMS41IDBsODYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMzguMyAwQzE1NC45IDEwMi42IDIxNyA2NCAyODggNjR6bTI0IDg4YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTA0YzAgNi40IDIuNSAxMi41IDcgMTdsNzIgNzJjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45bC02NS02NSAwLTk0LjF6Il0KICAgIH07CiAgICBmYUhpc3RvcnkgPSBmYUNsb2NrUm90YXRlTGVmdDsKICAgIGZhSmFyV2hlYXQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiamFyLXdoZWF0IiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbXSwgImU1MTciLCAiTTMyLThjMC0xMy4zIDEwLjctMjQgMjQtMjRsMjA4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRMNTYgMTZDNDIuNyAxNiAzMiA1LjMgMzItOHpNMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsMTkyIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDEyOHptMTEyIDMybC00Mi4yIDBjLTMuMiAwLTUuOCAyLjYtNS44IDUuOCAwIDMyLjEgMjYgNTguMiA1OC4yIDU4LjJsNzUuNiAwYzMyLjEgMCA1OC4yLTI2IDU4LjItNTguMiAwLTMuMi0yLjYtNS44LTUuOC01LjhMMjA4IDE2MGMtMTkuMSAwLTM2LjMgOC40LTQ4IDIxLjctMTEuNy0xMy4zLTI4LjktMjEuNy00OC0yMS43em00OCAxMTcuN2MtMTEuNy0xMy4zLTI4LjktMjEuNy00OC0yMS43bC00Mi4yIDBjLTMuMiAwLTUuOCAyLjYtNS44IDUuOCAwIDMyLjEgMjYgNTguMiA1OC4yIDU4LjJsNzUuNiAwYzMyLjEgMCA1OC4yLTI2IDU4LjItNTguMiAwLTMuMi0yLjYtNS44LTUuOC01LjhMMjA4IDI1NmMtMTkuMSAwLTM2LjMgOC40LTQ4IDIxLjd6TTExMiAzNTJsLTQyLjIgMGMtMy4yIDAtNS44IDIuNi01LjggNS44IDAgMzIuMSAyNiA1OC4yIDU4LjIgNTguMmwyMS44IDAgMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtMzIgMjEuOCAwYzMyLjEgMCA1OC4yLTI2IDU4LjItNTguMiAwLTMuMi0yLjYtNS44LTUuOC01LjhMMjA4IDM1MmMtMTkuMSAwLTM2LjMgOC40LTQ4IDIxLjctMTEuNy0xMy4zLTI4LjktMjEuNy00OC0yMS43eiJdCiAgICB9OwogICAgZmFDbG91ZEFycm93RG93biA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjbG91ZC1hcnJvdy1kb3duIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbNjIzMzcsICJjbG91ZC1kb3dubG9hZCIsICJjbG91ZC1kb3dubG9hZC1hbHQiXSwgImYwZWQiLCAiTTE0NCA0ODBjLTc5LjUgMC0xNDQtNjQuNS0xNDQtMTQ0IDAtNjMuNCA0MS0xMTcuMiA5Ny45LTEzNi41LTEuMy03LjctMS45LTE1LjUtMS45LTIzLjUgMC03OS41IDY0LjUtMTQ0IDE0NC0xNDQgNTUuNCAwIDEwMy41IDMxLjMgMTI3LjYgNzcuMSAxNC4yLTguMyAzMC44LTEzLjEgNDguNC0xMy4xIDUzIDAgOTYgNDMgOTYgOTYgMCAxNS43LTMuOCAzMC42LTEwLjUgNDMuNyA0NCAyMC4zIDc0LjUgNjQuNyA3NC41IDExNi4zIDAgNzAuNy01Ny4zIDEyOC0xMjggMTI4bC0zMDQgMHpNMzc3IDMxM2M5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwbC0zMSAzMSAwLTEwMi4xYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMTAyLjEtMzEtMzFjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwcy05LjQgMjQuNiAwIDMzLjlsNzIgNzJjOS40IDkuNCAyNC42IDkuNCAzMy45IDBsNzItNzJ6Il0KICAgIH07CiAgICBmYUNsb3VkRG93bmxvYWQgPSBmYUNsb3VkQXJyb3dEb3duOwogICAgZmFDbG91ZERvd25sb2FkQWx0ID0gZmFDbG91ZEFycm93RG93bjsKICAgIGZhVHJ1Y2tSYW1wQm94ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRydWNrLXJhbXAtYm94IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInRydWNrLWxvYWRpbmciXSwgImY0ZGUiLCAiTTQwMCAzMmMtNDQuMiAwLTgwIDM1LjgtODAgODBsMCAyNDguMi0yOTcuMiA4OS4yQzUuOSA0NTQuNC0zLjcgNDcyLjMgMS40IDQ4OS4yczIyLjkgMjYuNSAzOS44IDIxLjVsMzE1LjUtOTQuNiA0My43IDBjLS4yIDIuNi0uNCA1LjMtLjQgOCAwIDQ4LjYgMzkuNCA4OCA4OCA4OHM4OC0zOS40IDg4LTg4bDAtMzkyLTE3NiAwek01MjggNDI0YzAgMjIuMS0xNy45IDQwLTQwIDQwcy00MC0xNy45LTQwLTQwIDE3LjktNDAgNDAtNDBjMjIuMSAwIDM5LjkgMTcuOSA0MCAzOS45bDAgLjF6TTUxLjkgMTQ5LjVDMTguMSAxNTkuOC0uOSAxOTUuNiA5LjQgMjI5LjRsMjguMSA5MS44QzQ3LjggMzU1IDgzLjYgMzc0IDExNy40IDM2My43bDkxLjgtMjguMWMzMy44LTEwLjMgNTIuOC00Ni4xIDQyLjUtNzkuOWwtMjguMS05MS44Yy0xMC4zLTMzLjgtNDYuMS01Mi44LTc5LjktNDIuNUw1MS45IDE0OS41eiJdCiAgICB9OwogICAgZmFUcnVja0xvYWRpbmcgPSBmYVRydWNrUmFtcEJveDsKICAgIGZhQW5nbGVEb3duID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFuZ2xlLWRvd24iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFs4OTY0XSwgImYxMDciLCAiTTE2OS40IDM3NC42YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwbDE2MC0xNjBjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBMMTkyIDMwNi43IDU0LjYgMTY5LjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zbDE2MCAxNjB6Il0KICAgIH07CiAgICBmYVBsdWdDaXJjbGVDaGVjayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwbHVnLWNpcmNsZS1jaGVjayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTVjIiwgIk0xOTItMzJjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA5NiAxMjggMCAwLTk2YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCA5NiA2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybDAgNDguN2MtOTguNiA4LjEtMTc2IDkwLjctMTc2IDE5MS4zIDAgMjcuMyA1LjcgNTMuMyAxNiA3Ni45bDAgMy4xYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNjYuN0MxNjUuMiAzOTguMSA5NiAzMTkuMSA5NiAyMjRsMC02NGMtMTcuNyAwLTMyLTE0LjMtMzItMzJTNzguMyA5NiA5NiA5Nmw2NCAwIDAtOTZjMC0xNy43IDE0LjMtMzIgMzItMzJ6TTM1MiA0MDBhMTQ0IDE0NCAwIDEgMSAyODggMCAxNDQgMTQ0IDAgMSAxIC0yODggMHptMjAxLjQtNjAuOWMtNy4xLTUuMi0xNy4yLTMuNi0yMi40IDMuNWwtNTMgNzIuOS0yNi44LTI2LjhjLTYuMi02LjItMTYuNC02LjItMjIuNiAwcy02LjIgMTYuNCAwIDIyLjZsNDAgNDBjMy4zIDMuMyA3LjkgNSAxMi42IDQuNnM4LjktMi44IDExLjctNi41bDY0LTg4YzUuMi03LjEgMy42LTE3LjItMy41LTIyLjN6Il0KICAgIH07CiAgICBmYVdpbmRvd01heGltaXplMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3aW5kb3ctbWF4aW1pemUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg0NzBdLCAiZjJkMCIsICJNNjQgNjRDMjguNyA2NCAwIDkyLjcgMCAxMjhMMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgNjR6bTI0IDY0bDMzNiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0TDg4IDE3NmMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhSGFuZHNIb2xkaW5nQ2lyY2xlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbmRzLWhvbGRpbmctY2lyY2xlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU0ZmIiLCAiTTMyMCAwYTEyOCAxMjggMCAxIDEgMCAyNTYgMTI4IDEyOCAwIDEgMSAwLTI1NnpNNDAgNjRjMjIuMSAwIDQwIDE3LjkgNDAgNDBsMCAxNjAuMmMwIDE3IDYuNyAzMy4zIDE4LjcgNDUuM2w1MS4xIDUxLjFjOC4zIDguMyAyMS4zIDkuNiAzMSAzLjEgMTIuOS04LjYgMTQuNy0yNi45IDMuNy0zNy44LTcuMy03LjMtMjMuMS0yMy4xLTQ3LjItNDcuMi0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM3MzMi44LTEyLjUgNDUuMyAwYzI0LjEgMjQuMSAzOS45IDM5LjkgNDcuMiA0Ny4ybDAgMCAyNS4zIDI1LjNjMjEgMjEgMzIuOCA0OS41IDMyLjggNzkuMmwwIDc4LjljMCAyNi41LTIxLjUgNDgtNDggNDhsLTY2LjcgMGMtMTcgMC0zMy4zLTYuNy00NS4zLTE4LjdMMjguMSAzOTMuNEMxMC4xIDM3NS40IDAgMzUxIDAgMzI1LjVMMCAxMDRDMCA4MS45IDE3LjkgNjQgNDAgNjR6bTU2MCAwYzIyLjEgMCA0MCAxNy45IDQwIDQwbDAgMjIxLjVjMCAyNS41LTEwLjEgNDkuOS0yOC4xIDY3LjlMNTEyIDQ5My4zYy0xMiAxMi0yOC4zIDE4LjctNDUuMyAxOC43TDQwMCA1MTJjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtNzguOWMwLTI5LjcgMTEuOC01OC4yIDMyLjgtNzkuMmwyNS4zLTI1LjMgMCAwYzcuMy03LjMgMjMuMS0yMy4xIDQ3LjItNDcuMiAxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zYy0yNC4xIDI0LjEtMzkuOSAzOS45LTQ3LjIgNDcuMi0xMSAxMS05LjIgMjkuMiAzLjcgMzcuOCA5LjcgNi41IDIyLjcgNS4yIDMxLTMuMWw1MS4xLTUxLjFjMTItMTIgMTguNy0yOC4zIDE4LjctNDUuM0w1NjAgMTA0YzAtMjIuMSAxNy45LTQwIDQwLTQweiJdCiAgICB9OwogICAgZmFMb2NhdGlvblBpbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsb2NhdGlvbi1waW4iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsibWFwLW1hcmtlciJdLCAiZjA0MSIsICJNMTkyIDBDODYgMCAwIDg0LjQgMCAxODguNiAwIDMwNy45IDEyMC4yIDQ1MC45IDE3MC40IDUwNS40IDE4Mi4yIDUxOC4yIDIwMS44IDUxOC4yIDIxMy42IDUwNS40IDI2My44IDQ1MC45IDM4NCAzMDcuOSAzODQgMTg4LjYgMzg0IDg0LjQgMjk4IDAgMTkyIDB6Il0KICAgIH07CiAgICBmYU1hcE1hcmtlciA9IGZhTG9jYXRpb25QaW47CiAgICBmYUJvd2xpbmdCYWxsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvd2xpbmctYmFsbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNDM2IiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMjQwIDgwYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHpNMjA4IDIwOGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0tNjQtNjRhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFDYXJ0RmxhdGJlZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYXJ0LWZsYXRiZWQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsiZG9sbHktZmxhdGJlZCJdLCAiZjQ3NCIsICJNMzIgMEMxNC4zIDAgMCAxNC4zIDAgMzJTMTQuMyA2NCAzMiA2NGwxNiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDI4OGMwIDM5LjggMjkuMSA3Mi44IDY3LjEgNzktMiA1LjMtMy4xIDExLTMuMSAxNyAwIDI2LjUgMjEuNSA0OCA0OCA0OHM0OC0yMS41IDQ4LTQ4YzAtNS42LTEtMTEtMi43LTE2bDE5Ny41IDBjLTEuOCA1LTIuNyAxMC40LTIuNyAxNiAwIDI2LjUgMjEuNSA0OCA0OCA0OHM0OC0yMS41IDQ4LTQ4YzAtNS42LTEtMTEtMi43LTE2bDM0LjcgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNDAwIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTI4OEMxMjggMzUuOCA5Mi4yIDAgNDggMEwzMiAwek0yMjQgNjRjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgMTc2YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDI0MCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMTc2YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4TDIyNCA2NHoiXQogICAgfTsKICAgIGZhRG9sbHlGbGF0YmVkID0gZmFDYXJ0RmxhdGJlZDsKICAgIGZhSG91c2VVc2VyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLXVzZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiaG9tZS11c2VyIl0sICJlMWIwIiwgIk0yNzcuOCA4LjZjLTEyLjMtMTEuNC0zMS4zLTExLjQtNDMuNSAwbC0yMjQgMjA4Yy05LjYgOS0xMi44IDIyLjktOCAzNS4xUzE4LjggMjcyIDMyIDI3MmwxNiAwIDAgMTc2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDI4OCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTc2IDE2IDBjMTMuMiAwIDI1LTguMSAyOS44LTIwLjNzMS42LTI2LjItOC0zNS4xbC0yMjQtMjA4ek0yMDAgMjU2YTU2IDU2IDAgMSAxIDExMiAwIDU2IDU2IDAgMSAxIC0xMTIgMHpNMTQ0IDQzMmMwLTQ0LjIgMzUuOC04MCA4MC04MGw2NCAwYzQ0LjIgMCA4MCAzNS44IDgwIDgwIDAgOC44LTcuMiAxNi0xNiAxNmwtMTkyIDBjLTguOCAwLTE2LTcuMi0xNi0xNnoiXQogICAgfTsKICAgIGZhSG9tZVVzZXIgPSBmYUhvdXNlVXNlcjsKICAgIGZhR2hvc3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ2hvc3QiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFsxMjgxMjNdLCAiZjZlMiIsICJNNDAuMSA0NjcuMWwtMTEuMiA5QzI1LjcgNDc4LjYgMjEuOCA0ODAgMTcuOCA0ODAgOCA0ODAgMCA0NzIgMCA0NjIuMkwwIDE5MkMwIDg2IDg2IDAgMTkyIDBTMzg0IDg2IDM4NCAxOTJsMCAyNzAuMmMwIDkuOC04IDE3LjgtMTcuOCAxNy44LTQgMC03LjktMS40LTExLjEtMy45bC0xMS4yLTljLTEzLjQtMTAuNy0zMi44LTktNDQuMSAzLjlMMjY5LjMgNTA2Yy0zLjMgMy44LTguMiA2LTEzLjMgNnMtOS45LTIuMi0xMy4zLTZsLTI2LjYtMzAuNWMtMTIuNy0xNC42LTM1LjQtMTQuNi00OC4yIDBMMTQxLjMgNTA2Yy0zLjMgMy44LTguMiA2LTEzLjMgNnMtOS45LTIuMi0xMy4zLTZMODQuMiA0NzFjLTExLjMtMTIuOS0zMC43LTE0LjYtNDQuMS0zLjl6TTE2MCAxOTJhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHptOTYgMzJhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFDb21tZW50Tm9kZXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY29tbWVudC1ub2RlcyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNjk2IiwgIk00ODAgMjA4QzUwMy43IDIwOCA1MjUuNiAyMTUuMyA1NDMuNyAyMjcuOSA1MzYuOSAxMDAuOSA0MjUgMCAyODggMCAxNDYuNiAwIDMyIDEwNy41IDMyIDI0MCAzMiAyOTQuMyA1MS4yIDM0NC4zIDgzLjYgMzg0LjVMMzQuOCA0NzYuOGMtNC44IDktMy4zIDIwIDMuNiAyNy41czE3LjggOS44IDI3LjEgNS44bDExOC40LTUwLjdjMjcuMiAxMS40IDU2LjkgMTguNCA4OC4xIDIwLjIgLjEtMTguOSA0LjktMzggMTUtNTUuNSAxNy4xLTI5LjcgNDUuOC00OC41IDc3LTU0LjJsOS4yLTE2Yy0zLjQtMTAuNy01LjItMjItNS4yLTMzLjggMC02MS45IDUwLjEtMTEyIDExMi0xMTJ6TTMyOC42IDQ0OGMtMTcuNyAzMC42LTcuMiA2OS43IDIzLjQgODcuNHM2OS43IDcuMiA4Ny40LTIzLjRjMS41LTIuNiAyLjgtNS4zIDMuOS04bDczLjMgMGMxLjEgMi43IDIuNCA1LjQgMy45IDggMTcuNyAzMC42IDU2LjggNDEuMSA4Ny40IDIzLjRzNDEuMS01Ni44IDIzLjQtODcuNGMtMTMuNC0yMy4yLTM5LjEtMzQuOC02NC0zMS40bC0xNy42LTMwLjdjLTExIDExLjctMjUgMjAuNi00MC42IDI1LjZsMTYuNSAyOC45Yy0zLjggNC44LTYuOCAxMC05IDE1LjZsLTczLjQgMGMtMi4yLTUuNi01LjMtMTAuOC05LTE1LjZsMzMtNTcuN2M0LjEgLjggOC40IDEuMyAxMi44IDEuMyAzNS4zIDAgNjQtMjguNyA2NC02NHMtMjguNy02NC02NC02NC02NCAyOC43LTY0IDY0YzAgMTMuNCA0LjEgMjUuOCAxMS4yIDM2LjFsLTM0LjYgNjAuNWMtMjUtMy40LTUwLjYgOC4zLTY0IDMxLjR6Il0KICAgIH07CiAgICBmYVBlcnNvbkFycm93RG93blRvTGluZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tYXJyb3ctZG93bi10by1saW5lIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1MzgiLCAiTTE5Mi0zMmE1NiA1NiAwIDEgMSAwIDExMiA1NiA1NiAwIDEgMSAwLTExMnpNMzE4LjMgMjk5LjFsLTQ2LjMtNjIuNCAwIDI0My4zIDI3MiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDU0NGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw4MCAwIDAtMjQzLjMtNDYuMyA2Mi40Yy0xMC41IDE0LjItMzAuNiAxNy4yLTQ0LjggNi42cy0xNy4yLTMwLjYtNi42LTQ0LjhsNzAuNS05NUMxMTAgMTMyIDE0OS43IDExMiAxOTIgMTEyczgyIDIwIDEwNy4yIDUzLjlsNzAuNSA5NWMxMC41IDE0LjIgNy42IDM0LjItNi42IDQ0LjhzLTM0LjIgNy42LTQ0LjgtNi42ek0xNzYgNDgwbDMyIDAgMC0xMjhjMC04LjgtNy4yLTE2LTE2LTE2cy0xNiA3LjItMTYgMTZsMCAxMjh6TTU2Ni42IDE2Ni42bC04MCA4MGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBsLTgwLTgwYy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM3MzMi44LTEyLjUgNDUuMyAwTDQzMiAxNDYuNyA0MzIgMGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMTQ2LjcgMjUuNC0yNS40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwczEyLjUgMzIuOCAwIDQ1LjN6Il0KICAgIH07CiAgICBmYVBsdWdDaXJjbGVQbHVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBsdWctY2lyY2xlLXBsdXMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU1ZiIsICJNMTkyLTMyYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgOTYgMTI4IDAgMC05NmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgOTYgNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwwIDQ4LjdjLTk4LjYgOC4xLTE3NiA5MC43LTE3NiAxOTEuMyAwIDI3LjMgNS43IDUzLjMgMTYgNzYuOWwwIDMuMWMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY2LjdDMTY1LjIgMzk4LjEgOTYgMzE5LjEgOTYgMjI0bDAtNjRjLTE3LjcgMC0zMi0xNC4zLTMyLTMyUzc4LjMgOTYgOTYgOTZsNjQgMCAwLTk2YzAtMTcuNyAxNC4zLTMyIDMyLTMyek00OTYgMjU2YTE0NCAxNDQgMCAxIDEgMCAyODggMTQ0IDE0NCAwIDEgMSAwLTI4OHptMTYgODBjMC04LjgtNy4yLTE2LTE2LTE2cy0xNiA3LjItMTYgMTZsMCA0OC00OCAwYy04LjggMC0xNiA3LjItMTYgMTZzNy4yIDE2IDE2IDE2bDQ4IDAgMCA0OGMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtNDggNDggMGM4LjggMCAxNi03LjIgMTYtMTZzLTcuMi0xNi0xNi0xNmwtNDggMCAwLTQ4eiJdCiAgICB9OwogICAgZmFQZXJzb25Td2ltbWluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tc3dpbW1pbmciLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjc5NDYsICJzd2ltbWVyIl0sICJmNWM0IiwgIk01NTIgMTUyYTU2IDU2IDAgMSAwIC0xMTIgMCA1NiA1NiAwIDEgMCAxMTIgMHpNMjkzLjQgMTk4LjJsLTg4LjYgNzMuOWMxLjEgMCAyLjItLjEgMy4zLS4xIDMzLjEtLjIgNjYuMyAxMC4yIDk0LjQgMzEuNCAyMi4xIDE2LjYgMjkuMSAxNi42IDUxLjIgMCAyNy41LTIwLjcgNTkuOS0zMS4yIDkyLjQtMzEuNCA0LjggMCA5LjcgLjIgMTQuNSAuNi04LjMtMzAtMjQuMy01Ny43LTQ2LjgtODAuMi0xOC40LTE4LjQtNDAuNi0zMi43LTY1LTQxLjhsLTY4LjYtMjUuN2MtMjcuNC0xMC4zLTU4LTcuNS04My4xIDcuNmwtNTMuNSAzMi4xYy0xNS4yIDkuMS0yMC4xIDI4LjctMTEgNDMuOXMyOC43IDIwLjEgNDMuOSAxMUwyMzAgMTg3LjNjOC40LTUgMTguNi01LjkgMjcuNy0yLjVsMzUuNyAxMy40em0xMTAgMTgxLjljMjEuMy0xNi4xIDQ5LjktMTYuMSA3MS4yIDAgMTkgMTQuNCA0MS45IDI4LjIgNjcuMiAzMy4zIDI2LjUgNS40IDU0LjMgLjggODAuNy0xOS4xIDEwLjYtOCAxMi43LTIzIDQuNy0zMy42cy0yMy0xMi43LTMzLjYtNC43Yy0xNC45IDExLjItMjguNiAxMy4xLTQyLjMgMTAuMy0xNC45LTMtMzAuOS0xMS45LTQ3LjgtMjQuNi0zOC40LTI5LTkwLjUtMjktMTI5IDAtMjQgMTguMS00MC43IDI2LjMtNTQuNSAyNi4zcy0zMC41LTguMi01NC41LTI2LjNjLTM4LjQtMjktOTAuNS0yOS0xMjkgMC0yMS42IDE2LjMtNDEuMyAyNS44LTU4LjkgMjUuNy05LjYtLjEtMTkuOS0zLTMxLjItMTEuNS0xMC42LTgtMjUuNi01LjktMzMuNiA0LjdTNyAzODYuMyAxNy42IDM5NC4zYzE5LjEgMTQuNCAzOS40IDIxIDU5LjggMjEuMSAzMy45IC4yIDY0LjMtMTcuNCA4OC4xLTM1LjMgMjEuMy0xNi4xIDQ5LjktMTYuMSA3MS4yIDAgMjQuMiAxOC4zIDUyLjMgMzUuOSA4My40IDM1LjlzNTkuMS0xNy43IDgzLjQtMzUuOXoiXQogICAgfTsKICAgIGZhU3dpbW1lciA9IGZhUGVyc29uU3dpbW1pbmc7CiAgICBmYUNvbW1lbnREb3RzMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjb21tZW50LWRvdHMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgxNzIsIDYyMDc1LCAiY29tbWVudGluZyJdLCAiZjRhZCIsICJNMjU2IDQ4MGMxNDEuNCAwIDI1Ni0xMDcuNSAyNTYtMjQwUzM5Ny40IDAgMjU2IDAgMCAxMDcuNSAwIDI0MGMwIDU0LjMgMTkuMiAxMDQuMyA1MS42IDE0NC41TDIuOCA0NzYuOGMtNC44IDktMy4zIDIwIDMuNiAyNy41czE3LjggOS44IDI3LjEgNS44bDExOC40LTUwLjdDMTgzLjcgNDcyLjYgMjE4LjkgNDgwIDI1NiA0ODB6TTEyOCAyMDhhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em0xMjggMGEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6bTk2IDMyYTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6Il0KICAgIH07CiAgICBmYUNvbW1lbnRpbmcyID0gZmFDb21tZW50RG90czI7CiAgICBmYUNoYXJ0UGllID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoYXJ0LXBpZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJwaWUtY2hhcnQiXSwgImYyMDAiLCAiTTUxMi40IDI0MGwtMTc2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTc2YzAtMTcuNyAxNC40LTMyLjIgMzEuOS0yOS45IDEwNyAxNC4yIDE5MS44IDk5IDIwNiAyMDYgMi4zIDE3LjUtMTIuMiAzMS45LTI5LjkgMzEuOXpNMjIyLjYgMzcuMmMxOC4xLTMuOCAzMy44IDExIDMzLjggMjkuNWwwIDE5Ny4zYzAgNS42IDIgMTEgNS41IDE1LjNMMzk0IDQzOC43YzExLjcgMTQuMSA5LjIgMzUuNC02LjkgNDQuMS0zNC4xIDE4LjYtNzMuMiAyOS4yLTExNC43IDI5LjItMTMyLjUgMC0yNDAtMTA3LjUtMjQwLTI0MCAwLTExNS41IDgxLjUtMjExLjkgMTkwLjItMjM0Ljh6TTQ3Ny44IDI4OGw2NCAwYzE4LjUgMCAzMy4zIDE1LjcgMjkuNSAzMy44LTEwLjIgNDguNC0zNSA5MS40LTY5LjYgMTI0LjItMTIuMyAxMS43LTMxLjYgOS4yLTQyLjQtMy45TDM3NC45IDM0MC40Yy0xNy4zLTIwLjktMi40LTUyLjQgMjQuNi01Mi40bDc4LjIgMHoiXQogICAgfTsKICAgIGZhUGllQ2hhcnQgPSBmYUNoYXJ0UGllOwogICAgZmFGcm9nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZyb2ciLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjUyZSIsICJNMzY4IDMyYzQxLjcgMCA3NS45IDMxLjggNzkuNyA3Mi41bDg1LjYgMjYuM2MyNS40IDcuOCA0Mi44IDMxLjMgNDIuOCA1Ny45IDAgMjEuOC0xMS43IDQxLjktMzAuNyA1Mi43bC0xNDQuNSA4Mi4xIDkyLjUgOTIuNSA1MC43IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTY0IDBjLTguNSAwLTE2LjYtMy40LTIyLjYtOS40TDM0Ni45IDM2MC4yYzExLjctMzYgMy4yLTc3LjEtMjUuNC0xMDUuNy00MC42LTQwLjYtMTA2LjMtNDAuNi0xNDYuOS0uMUwxMDEgMzI0LjRjLTYuNCA2LjEtNi43IDE2LjItLjYgMjIuNnMxNi4yIDYuNiAyMi42IC42bDczLjgtNzAuMiAuMS0uMSAuMS0uMWMzLjUtMy41IDcuMy02LjYgMTEuMy05LjIgMjcuOS0xOC41IDY1LjktMTUuNCA5MC41IDkuMiAyNC43IDI0LjcgMjcuNyA2Mi45IDkgOTAuOS0yLjYgMy44LTUuNiA3LjUtOSAxMC45TDI2MS44IDQxNiAzNTIgNDE2YzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDY0IDQ4MEMyOC43IDQ4MCAwIDQ1MS4zIDAgNDE2IDAgMjQ5LjYgMTI3IDExMi45IDI4OS4zIDk3LjUgMjk2LjIgNjAuMiAzMjguOCAzMiAzNjggMzJ6bTAgMTA0YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHoiXQogICAgfTsKICAgIGZhV2luZUJvdHRsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3aW5lLWJvdHRsZSIsCiAgICAgIGljb246IFszMjAsIDUxMiwgW10sICJmNzJmIiwgIk04MC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMmw5NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMyIDAgMTEuOC02LjQgMjIuMi0xNiAyNy43bDAgMTQ1LjZjNTYuNSAyNC43IDk2IDgxLjEgOTYgMTQ2LjdsMCAyMjRjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTc2Yy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDI4OGMwLTY1LjYgMzkuNS0xMjIgOTYtMTQ2LjdMOTYtNC4zQzg2LjQtOS44IDgwLTIwLjIgODAtMzJ6TTk2IDI4OGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAxMjhjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTI4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0xMjhjMC0xNy43LTE0LjMtMzItMzItMzJMOTYgMjg4eiJdCiAgICB9OwogICAgZmFJbmJveCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJpbmJveCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMDFjIiwgIk05MS44IDMyQzU5LjkgMzIgMzIuOSA1NS40IDI4LjQgODYuOUwuNiAyODEuMmMtLjQgMy0uNiA2LS42IDkuMUwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzODQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTEyNS43YzAtMy0uMi02LjEtLjYtOS4xTDQ4My42IDg2LjlDNDc5LjEgNTUuNCA0NTIuMSAzMiA0MjAuMiAzMkw5MS44IDMyem0wIDY0bDMyOC41IDAgMjcuNCAxOTItNTkuOSAwYy0xMi4xIDAtMjMuMiA2LjgtMjguNiAxNy43bC0xNC4zIDI4LjZjLTUuNCAxMC44LTE2LjUgMTcuNy0yOC42IDE3LjdsLTEyMC40IDBjLTEyLjEgMC0yMy4yLTYuOC0yOC42LTE3LjdsLTE0LjMtMjguNmMtNS40LTEwLjgtMTYuNS0xNy43LTI4LjYtMTcuN0w2NC4zIDI4OCA5MS44IDk2eiJdCiAgICB9OwogICAgZmFTcXVhcmVIID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1oIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImgtc3F1YXJlIl0sICJmMGZkIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyek0zMjAgMTY4bDAgMTc2YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNjQtOTYgMCAwIDY0YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMTc2YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA2NCA5NiAwIDAtNjRjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNHoiXQogICAgfTsKICAgIGZhSFNxdWFyZSA9IGZhU3F1YXJlSDsKICAgIGZhSG91c2VNZWRpY2FsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLW1lZGljYWwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTNiMiIsICJNMjc3LjggOC42Yy0xMi4zLTExLjQtMzEuMy0xMS40LTQzLjUgMGwtMjI0IDIwOGMtOS42IDktMTIuOCAyMi45LTggMzUuMVMxOC44IDI3MiAzMiAyNzJsMTYgMCAwIDE3NmMwIDM1LjMgMjguNyA2NCA2NCA2NGwyODggMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTE3NiAxNiAwYzEzLjIgMCAyNS04LjEgMjkuOC0yMC4zczEuNi0yNi4yLTgtMzUuMWwtMjI0LTIwOHpNMjI0IDI0OGMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCA0MCA0MCAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtNDAgMCAwIDQwYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtNDAtNDAgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDQwIDAgMC00MHoiXQogICAgfTsKICAgIGZhQ2lyY2xlQ2hldnJvblJpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1jaGV2cm9uLXJpZ2h0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImNoZXZyb24tY2lyY2xlLXJpZ2h0Il0sICJmMTM4IiwgIk0wIDI1NmEyNTYgMjU2IDAgMSAwIDUxMiAwIDI1NiAyNTYgMCAxIDAgLTUxMiAwek0yNDEgMzc3Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45bDg3LTg3LTg3LTg3Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBMMzQ1IDIzOWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOUwyNDEgMzc3eiJdCiAgICB9OwogICAgZmFDaGV2cm9uQ2lyY2xlUmlnaHQgPSBmYUNpcmNsZUNoZXZyb25SaWdodDsKICAgIGZhRmlsZUNzdiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLWNzdiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNmRkIiwgIk05NiAwQzYwLjcgMCAzMiAyOC43IDMyIDY0bDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDgwIDAgMC0xMTJjMC0zNS4zIDI4LjctNjQgNjQtNjRsMTc2IDAgMC0xNjUuNWMwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0wyOTAuNyAxOC43QzI3OC43IDYuNyAyNjIuNSAwIDI0NS41IDBMOTYgMHpNMzU3LjUgMTc2TDI2NCAxNzZjLTEzLjMgMC0yNC0xMC43LTI0LTI0TDI0MCA1OC41IDM1Ny41IDE3NnpNMjY0IDM4MGMtMjQuMyAwLTQ0IDE5LjctNDQgNDRsMCA4MGMwIDI0LjMgMTkuNyA0NCA0NCA0NGwxNiAwYzI0LjMgMCA0NC0xOS43IDQ0LTQ0bDAtOGMwLTExLTktMjAtMjAtMjBzLTIwIDktMjAgMjBsMCA4YzAgMi4yLTEuOCA0LTQgNGwtMTYgMGMtMi4yIDAtNC0xLjgtNC00bDAtODBjMC0yLjIgMS44LTQgNC00bDE2IDBjMi4yIDAgNCAxLjggNCA0bDAgOGMwIDExIDkgMjAgMjAgMjBzMjAtOSAyMC0yMGwwLThjMC0yNC4zLTE5LjctNDQtNDQtNDRsLTE2IDB6bTEzNiAwYy0yOC43IDAtNTIgMjMuMy01MiA1MnMyMy4zIDUyIDUyIDUyYzYuNiAwIDEyIDUuNCAxMiAxMnMtNS40IDEyLTEyIDEybC0zMiAwYy0xMSAwLTIwIDktMjAgMjBzOSAyMCAyMCAyMGwzMiAwYzI4LjcgMCA1Mi0yMy4zIDUyLTUycy0yMy4zLTUyLTUyLTUyYy02LjYgMC0xMi01LjQtMTItMTJzNS40LTEyIDEyLTEybDI0IDBjMTEgMCAyMC05IDIwLTIwcy05LTIwLTIwLTIwbC0yNCAwem05NiAwYy0xMSAwLTIwIDktMjAgMjBsMCAzMS42YzAgMzUuNSAxMC41IDcwLjMgMzAuMiA5OS44bDUuMSA3LjdjMy43IDUuNiAxMCA4LjkgMTYuNiA4LjlzMTIuOS0zLjMgMTYuNi04LjlsNS4xLTcuN2MxOS43LTI5LjYgMzAuMi02NC4zIDMwLjItOTkuOGwwLTMxLjZjMC0xMS05LTIwLTIwLTIwcy0yMCA5LTIwIDIwbDAgMzEuNmMwIDE5LjYtNC4xIDM4LjktMTIgNTYuNy03LjktMTcuOC0xMi0zNy4xLTEyLTU2LjdsMC0zMS42YzAtMTEtOS0yMC0yMC0yMHoiXQogICAgfTsKICAgIGZhSGF0Q293Ym95ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhdC1jb3dib3kiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjhjMCIsICJNMTgyLjIgNzYuMUwxMzAuOCAzMDcuNUMxNDUuNSAzMjQuOSAxNjcuNCAzMzYgMTkyIDMzNmwyNTYgMGMyNC42IDAgNDYuNS0xMS4xIDYxLjItMjguNUw0NTcuOCA3Ni4xYy01LjctMjUuOC0yOC42LTQ0LjEtNTUtNDQuMS0xMi4yIDAtMjQuMSA0LTMzLjggMTEuM2wtNC43IDMuNWMtMjYuMyAxOS43LTYyLjQgMTkuNy04OC42IDBMMjcxIDQzLjNjLTkuOC03LjMtMjEuNi0xMS4zLTMzLjgtMTEuMy0yNi40IDAtNDkuMyAxOC4zLTU1IDQ0LjF6TTY0IDI1NmMwLTE3LjctMTQuMy0zMi0zMi0zMlMwIDIzOC4zIDAgMjU2QzAgMzYyIDg2IDQ0OCAxOTIgNDQ4bDI1NiAwYzEwNiAwIDE5Mi04NiAxOTItMTkyIDAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMyYzAgNzAuNy01Ny4zIDEyOC0xMjggMTI4bC0yNTYgMGMtNzAuNyAwLTEyOC01Ny4zLTEyOC0xMjh6Il0KICAgIH07CiAgICBmYUZhY2VHcmluVG9uZ3VlV2luazIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1ncmluLXRvbmd1ZS13aW5rIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTQwLCAiZ3Jpbi10b25ndWUtd2luayJdLCAiZjU4YiIsICJNMTUyLjIgNDkwLjFDNjIuNSA0NTAuMiAwIDM2MC40IDAgMjU2IDAgMTE0LjYgMTE0LjYgMCAyNTYgMFM1MTIgMTE0LjYgNTEyIDI1NmMwIDEwNC40LTYyLjUgMTk0LjItMTUyLjIgMjM0LjEgNS4zLTEzIDguMi0yNy4yIDguMi00Mi4xbDAtNjEuN2MxNi45LTE2LjUgMzAuMS0zNi43IDM4LjMtNTkuMyA0LjMtMTEuOC03LjctMjEuOC0xOS42LTE4LjEtMzkuMiAxMi4yLTgzLjcgMTkuMS0xMzAuNyAxOS4xcy05MS41LTYuOS0xMzAuNy0xOS4xYy0xMS45LTMuNy0yMy45IDYuMy0xOS42IDE4LjEgOC4zIDIyLjYgMjEuNSA0Mi44IDM4LjMgNTkuM2wwIDYxLjdjMCAxNC45IDIuOSAyOS4xIDguMiA0Mi4xek0xNTIgMjEybDE2IDBjMTEgMCAyMCA5IDIwIDIwczkgMjAgMjAgMjAgMjAtOSAyMC0yMGMwLTMzLjEtMjYuOS02MC02MC02MGwtMTYgMGMtMzMuMSAwLTYwIDI2LjktNjAgNjAgMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjAgOS0yMCAyMC0yMHptMTg0IDYwYTY0IDY0IDAgMSAwIDAtMTI4IDY0IDY0IDAgMSAwIDAgMTI4ek0zMjAgNDAyLjZsMCA0NS40YzAgMzUuMy0yOC43IDY0LTY0IDY0cy02NC0yOC43LTY0LTY0bDAtNDUuNGMwLTE0LjcgMTEuOS0yNi42IDI2LjYtMjYuNmwyIDBjMTEuMyAwIDIxLjEgNy45IDIzLjYgMTguOSAyLjggMTIuNiAyMC44IDEyLjYgMjMuNiAwIDIuNS0xMS4xIDEyLjMtMTguOSAyMy42LTE4LjlsMiAwYzE0LjcgMCAyNi42IDExLjkgMjYuNiAyNi42ek0zMzYgMTg0YTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHoiXQogICAgfTsKICAgIGZhR3JpblRvbmd1ZVdpbmsyID0gZmFGYWNlR3JpblRvbmd1ZVdpbmsyOwogICAgZmFMID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImwiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFsxMDhdLCAiNGMiLCAiTTY0IDMyYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzUyIDE5MiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDY0IDQ4MGMtMTcuNyAwLTMyLTE0LjMtMzItMzJMMzIgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJ6Il0KICAgIH07CiAgICBmYUFycm93RG93blNob3J0V2lkZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy1kb3duLXNob3J0LXdpZGUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsic29ydC1hbW91bnQtZGVzYyIsICJzb3J0LWFtb3VudC1kb3duLWFsdCJdLCAiZjg4NCIsICJNMjQ2LjYgMzc0LjZsLTk2IDk2Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMGwtOTYtOTZjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zczMyLjgtMTIuNSA0NS4zIDBMOTYgMzcwLjcgOTYgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDMwNi43IDQxLjQtNDEuNGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zek0zMjAgMzJsMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMnptMCAxMjhsOTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtOTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMnptMCAxMjhsMTYwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTE2MCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMyem0wIDEyOGwyMjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMjI0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJ6Il0KICAgIH07CiAgICBmYVNvcnRBbW91bnREZXNjID0gZmFBcnJvd0Rvd25TaG9ydFdpZGU7CiAgICBmYVNvcnRBbW91bnREb3duQWx0ID0gZmFBcnJvd0Rvd25TaG9ydFdpZGU7CiAgICBmYUhvdXJnbGFzc0hhbGYyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXJnbGFzcy1oYWxmIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbImhvdXJnbGFzcy0yIl0sICJmMjUyIiwgIk0zMiAwQzE0LjMgMCAwIDE0LjMgMCAzMlMxNC4zIDY0IDMyIDY0bDAgMTFjMCA0Mi40IDE2LjkgODMuMSA0Ni45IDExMy4xbDY3LjkgNjcuOS02Ny45IDY3LjlDNDguOSAzNTMuOSAzMiAzOTQuNiAzMiA0MzdsMCAxMWMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzMjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwwLTExYzAtNDIuNC0xNi45LTgzLjEtNDYuOS0xMTMuMWwtNjcuOS02Ny45IDY3LjktNjcuOWMzMC0zMCA0Ni45LTcwLjcgNDYuOS0xMTMuMWwwLTExYzE3LjcgMCAzMi0xNC4zIDMyLTMyUzM2OS43IDAgMzUyIDBMMzIgMHpNOTYgNzVsMC0xMSAxOTIgMCAwIDExYzAgMTktNS42IDM3LjQtMTYgNTNMMTEyIDEyOGMtMTAuMy0xNS42LTE2LTM0LTE2LTUzem0xNiAzMDljMy41LTUuMyA3LjYtMTAuMyAxMi4xLTE0LjlsNjcuOS02Ny45IDY3LjkgNjcuOWM0LjYgNC42IDguNiA5LjYgMTIuMiAxNC45TDExMiAzODR6Il0KICAgIH07CiAgICBmYUhvdXJnbGFzczIyID0gZmFIb3VyZ2xhc3NIYWxmMjsKICAgIGZhU3Bvb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3Bvb24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjkzNDgsIDYxODczLCAidXRlbnNpbC1zcG9vbiJdLCAiZjJlNSIsICJNMjQ1LjggMjIwLjljLTE0LjUtMTcuNi0yMS44LTM5LjItMjEuOC02MC44IDAtODAuMiA5Ni0xNjAuMiAxOTItMTYwLjIgNTMgMCA5NiA0MyA5NiA5NiAwIDk2LTgwIDE5Mi0xNjAuMiAxOTItMjEuNiAwLTQzLjItNy4zLTYwLjgtMjEuOEw1NC42IDUwMi42Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM0wyNDUuOCAyMjAuOXoiXQogICAgfTsKICAgIGZhVXRlbnNpbFNwb29uID0gZmFTcG9vbjsKICAgIGZhQ3JlZGl0Q2FyZDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY3JlZGl0LWNhcmQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgxNzksIDYyMDgzLCAiY3JlZGl0LWNhcmQtYWx0Il0sICJmMDlkIiwgIk0wIDEyOGwwIDMyIDUxMiAwIDAtMzJjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgNjRDMjguNyA2NCAwIDkyLjcgMCAxMjh6bTAgODBMMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xNzYtNTEyIDB6TTY0IDM2MGMwLTEzLjMgMTAuNy0yNCAyNC0yNGw0OCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC00OCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHptMTQ0IDBjMC0xMy4zIDEwLjctMjQgMjQtMjRsNjQgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNjQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjR6Il0KICAgIH07CiAgICBmYUNyZWRpdENhcmRBbHQyID0gZmFDcmVkaXRDYXJkMjsKICAgIGZhRmlsZUludm9pY2VEb2xsYXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1pbnZvaWNlLWRvbGxhciIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmNTcxIiwgIk0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwyMTMuNSAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDM2NS4zIDEyNS4zYzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNMMzg0IDQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6bTIwOC01LjVsMCA5My41YzAgMTMuMyAxMC43IDI0IDI0IDI0TDMyNS41IDE3NiAyMDggNTguNXpNNjQgODhjMCAxMy4zIDEwLjcgMjQgMjQgMjRsNDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNEw4OCA2NEM3NC43IDY0IDY0IDc0LjcgNjQgODh6bTAgOTZjMCAxMy4zIDEwLjcgMjQgMjQgMjRsNDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNDggMGMtMTMuMyAwLTI0IDEwLjctMjQgMjR6bTExMiA3NmwwIDRjLTI4LjggLjMtNTIgMjMuNy01MiA1Mi41IDAgMjUuNyAxOC41IDQ3LjYgNDMuOSA1MS44bDQxLjcgN2M2IDEgMTAuNCA2LjIgMTAuNCAxMi4zIDAgNi45LTUuNiAxMi41LTEyLjUgMTIuNUwxNTIgNDAwYy0xMSAwLTIwIDktMjAgMjBzOSAyMCAyMCAyMGwyNCAwIDAgNGMwIDExIDkgMjAgMjAgMjBzMjAtOSAyMC0yMGwwLTQuN2MyNS00LjEgNDQtMjUuNyA0NC01MS44IDAtMjUuNy0xOC41LTQ3LjYtNDMuOS01MS44bC00MS43LTdjLTYtMS0xMC40LTYuMi0xMC40LTEyLjMgMC02LjkgNS42LTEyLjUgMTIuNS0xMi41bDQ3LjUgMGMxMSAwIDIwLTkgMjAtMjBzLTktMjAtMjAtMjBsLTggMCAwLTRjMC0xMS05LTIwLTIwLTIwcy0yMCA5LTIwIDIweiJdCiAgICB9OwogICAgZmFTcGFnaGV0dGlNb25zdGVyRmx5aW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNwYWdoZXR0aS1tb25zdGVyLWZseWluZyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWyJwYXN0YWZhcmlhbmlzbSJdLCAiZjY3YiIsICJNMjA4IDY0YTE2IDE2IDAgMSAwIC0zMiAwIDE2IDE2IDAgMSAwIDMyIDB6bTQ4IDBjMCAxNi4yLTYgMzEuMS0xNiA0Mi4zbDE1LjYgMzEuMmMxOC43LTYgMzkuOS05LjUgNjQuNC05LjVzNDUuOCAzLjUgNjQuNCA5LjVMNDAwIDEwNi4zYy0xMC0xMS4zLTE2LTI2LjEtMTYtNDIuMyAwLTM1LjMgMjguNy02NCA2NC02NHM2NCAyOC43IDY0IDY0LTI4LjcgNjQtNjQgNjRjLTEuNyAwLTMuNC0uMS01LjEtLjJMNDI3LjggMTU4YzIxLjEgMTMuNiAzNy43IDMwLjIgNTEuNCA0Ni40IDcuMSA4LjMgMTMuNSAxNi42IDE5LjMgMjRsMS40IDEuOGM2LjMgOC4xIDExLjYgMTQuOCAxNi43IDIwLjQgMTAuNyAxMS43IDE2LjEgMTMuNCAxOS40IDEzLjQgMi41IDAgNC4zLS42IDcuMS0zLjMgMy43LTMuNSA3LjEtOC44IDEyLjUtMTcuNGwuNi0uOWM0LjYtNy40IDExLTE3LjYgMTkuNC0yNS43IDkuNy05LjMgMjIuOS0xNi43IDQwLjQtMTYuNyAxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGMtMi41IDAtNC4zIC42LTcuMSAzLjMtMy43IDMuNS03LjEgOC44LTEyLjUgMTcuNGwtLjYgLjljLTQuNiA3LjQtMTEgMTcuNi0xOS40IDI1LjctOS43IDkuMy0yMi45IDE2LjctNDAuNCAxNi43LTE4LjUgMC0zMi45LTguNS00NC4zLTE4LjYtMy4xIDQtNi42IDguMy0xMC41IDEyLjcgMS40IDQuMyAyLjggOC41IDQgMTIuNSAuOSAzIDEuOCA1LjggMi42IDguNiAzIDkuOCA1LjUgMTguMiA4LjYgMjUuOSAzLjkgOS44IDcuNCAxNS40IDEwLjggMTguNSAyLjYgMi40IDUuOSA0LjMgMTIuOCA0LjMgOC43IDAgMTYuOS00LjIgMzMuNy0xMy4yIDE1LTggMzUuNy0xOC44IDYyLjMtMTguOCAxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGMtMTMuNCAwLTI0LjcgNS4yLTM5LjcgMTMuMi0xIC42LTIuMSAxLjEtMy4yIDEuNy0xMy4xIDcuMS0zMS42IDE3LjEtNTMuMSAxNy4xLTE4LjQgMC0zMy42LTYuMS00NS41LTE3LjItMTEuMS0xMC4zLTE3LjktMjMuNy0yMi43LTM2LTMuNi05LTYuNy0xOS4xLTkuNS0yOC41LTE2LjQgMTIuMy0zNi4xIDIzLjYtNTguOSAzMS4zIDMuNiAxMC44IDguNCAyMy41IDE0LjQgMzYuMiA3LjUgMTUuOSAxNi4yIDMwLjQgMjUuOCA0MC41IDkuNiAxMC4yIDE3LjcgMTMuNyAyNC41IDEzLjcgMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRjLTI1LjIgMC00NS0xMy41LTU5LjUtMjguOC0xNC41LTE1LjQtMjUuNy0zNC45LTM0LjItNTMtOC0xNy0xNC4xLTMzLjgtMTguMy00Ni45LTUuMiAuNC0xMC42IC42LTE2IC42cy0xMC44LS4yLTE2LS42Yy00LjIgMTMtMTAuMyAyOS45LTE4LjMgNDYuOS04LjUgMTguMS0xOS44IDM3LjYtMzQuMiA1My0xNC40IDE1LjMtMzQuMyAyOC44LTU5LjUgMjguOC0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0YzYuOCAwIDE1LTMuNSAyNC41LTEzLjcgOS41LTEwLjEgMTguMy0yNC42IDI1LjgtNDAuNSA1LjktMTIuNiAxMC43LTI1LjQgMTQuNC0zNi4yLTIyLjgtNy43LTQyLjUtMTktNTguOS0zMS4zLTIuOSA5LjQtNiAxOS41LTkuNSAyOC41LTQuOCAxMi4yLTExLjYgMjUuNi0yMi43IDM2LTExLjkgMTEuMS0yNy4xIDE3LjItNDUuNSAxNy4yLTEzLjEgMC0yNC41LTQuMS0zMy44LTguOS03LjktNC0xNS43LTkuMi0yMi4xLTEzLjVsMCAwLTIuNC0xLjZjLTE1LjMtMTAuMi0yNS44LTE2LTM3LjctMTYtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGMyOC4xIDAgNDkuNiAxNC4yIDY0LjMgMjRsMi40IDEuNmM2LjkgNC42IDEyLjEgOC4xIDE3LjIgMTAuNyA1LjUgMi44IDkuMSAzLjYgMTIgMy42IDYuOCAwIDEwLjItMS45IDEyLjgtNC4zIDMuNC0zLjIgNy04LjggMTAuOC0xOC41IDMtNy43IDUuNi0xNi4xIDguNi0yNS45IC44LTIuNyAxLjctNS42IDIuNi04LjYgMS4yLTQgMi42LTguMiA0LTEyLjUtMy45LTQuNS03LjQtOC44LTEwLjUtMTIuNy0xMS40IDEwLjEtMjUuOSAxOC42LTQ0LjMgMTguNi0xNy41IDAtMzAuNy03LjQtNDAuNC0xNi43LTguNC04LjEtMTQuOC0xOC4zLTE5LjQtMjUuN2wtLjYtLjljLTUuNC04LjYtOC44LTEzLjktMTIuNS0xNy40LTIuOC0yLjctNC42LTMuMy03LjEtMy4zLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRjMTcuNSAwIDMwLjcgNy40IDQwLjQgMTYuNyA4LjQgOC4xIDE0LjggMTguMyAxOS40IDI1LjdsLjYgLjljNS40IDguNiA4LjggMTMuOSAxMi41IDE3LjQgMi44IDIuNyA0LjYgMy4zIDcuMSAzLjMgMy4zIDAgOC43LTEuNyAxOS40LTEzLjQgNS4xLTUuNiAxMC40LTEyLjMgMTYuNy0yMC40bDEuNC0xLjhjNS44LTcuNCAxMi4yLTE1LjcgMTkuMy0yNCAxMy44LTE2LjIgMzAuMy0zMi44IDUxLjQtNDYuNGwtMTUuMS0zMC4yYy0xLjcgLjEtMy40IC4yLTUuMSAuMi0zNS4zIDAtNjQtMjguNy02NC02NHMyOC43LTY0IDY0LTY0IDY0IDI4LjcgNjQgNjR6bTIwOCAwYTE2IDE2IDAgMSAwIC0zMiAwIDE2IDE2IDAgMSAwIDMyIDB6Il0KICAgIH07CiAgICBmYVBhc3RhZmFyaWFuaXNtID0gZmFTcGFnaGV0dGlNb25zdGVyRmx5aW5nOwogICAgZmFNYXJ0aW5pR2xhc3NDaXRydXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFydGluaS1nbGFzcy1jaXRydXMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsiY29ja3RhaWwiXSwgImY1NjEiLCAiTTU3NiA4MGMwLTQ0LjItMzUuOC04MC04MC04MC0xOCAwLTM0LjYgNi00OCAxNmwtODEgMGMyMy42LTQ3LjQgNzIuNS04MCAxMjktODAgNzkuNSAwIDE0NCA2NC41IDE0NCAxNDRTNTc1LjUgMjI0IDQ5NiAyMjRjLTYuNSAwLTEzLS40LTE5LjMtMS4zbDY0LTc0LjdjMS4xLTEuMyAyLjItMi43IDMuMy00LjEgMTkuNC0xNC42IDMyLTM3LjggMzItNjR6TTY2LjkgODIuNkM3Mi4yIDcxLjMgODMuNSA2NCA5NiA2NGwzODQgMGMxMi41IDAgMjMuOCA3LjMgMjkuMSAxOC42czMuNCAyNC43LTQuOCAzNC4ybC0xODQuMyAyMTUgMCAxMTYuMiA2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0xOTIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw2NCAwIDAtMTE2LjItMTg0LjMtMjE1Yy04LjEtOS41LTEwLTIyLjgtNC44LTM0LjJ6TTE2NS42IDEyOEwyODggMjcwLjggNDEwLjQgMTI4IDE2NS42IDEyOHoiXQogICAgfTsKICAgIGZhQ29ja3RhaWwgPSBmYU1hcnRpbmlHbGFzc0NpdHJ1czsKICAgIGZhQnVsbGhvcm4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnVsbGhvcm4iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgyMjYsIDEyODM2M10sICJmMGExIiwgIk00NjEuMiAxOC45QzQ3Mi43IDI0IDQ4MCAzNS40IDQ4MCA0OGwwIDQxNmMwIDEyLjYtNy4zIDI0LTE4LjggMjkuMXMtMjQuOCAzLjItMzQuMy01LjFsLTQ2LjYtNDAuN2MtNDMuNi0zOC4xLTk4LjctNjAuMy0xNTYuNC02M2wwIDk1LjdjMCAxNy43LTE0LjMgMzItMzIgMzJsLTMyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtOTZDNTcuMyAzODQgMCAzMjYuNyAwIDI1NlM1Ny4zIDEyOCAxMjggMTI4bDg0LjUgMGM2MS44LS4yIDEyMS40LTIyLjcgMTY3LjktNjMuM2w0Ni42LTQwLjdjOS40LTguMyAyMi45LTEwLjIgMzQuMy01LjF6TTIyNCAzMjBsMCAuMmM3MC4zIDIuNyAxMzcuOCAyOC41IDE5MiA3My40bDAtMjc1LjNjLTU0LjIgNDQuOS0xMjEuNyA3MC43LTE5MiA3My40TDIyNCAzMjB6Il0KICAgIH07CiAgICBmYUJveFRpc3N1ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib3gtdGlzc3VlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUwNWIiLCAiTTEwMy45IDMybDE2MSAwYzEzLjggMCAyNiA4LjggMzAuNCAyMS45bDE3LjQgNTIuMmM0LjQgMTMuMSAxNi42IDIxLjkgMzAuNCAyMS45bDYwLjUgMGMyMS44IDAgMzcuMyAyMS40IDMwLjQgNDIuMUwzODQgMzIwIDEyOCAzMjAgNzIuNyA3MC45QzY4LjIgNTEgODMuNCAzMiAxMDMuOSAzMnpNNDggMjU2bDE2LjYgMCAxNi41IDc0LjRDODYgMzUyLjQgMTA1LjUgMzY4IDEyOCAzNjhsMjU2IDBjMjAuNyAwIDM5LTEzLjIgNDUuNS0zMi44bDI2LjQtNzkuMiA4LjEgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDEyOGMwIDI2LjUtMjEuNSA0OC00OCA0OEw0OCA0ODBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4TDAgMzA0YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4eiJdCiAgICB9OwogICAgZmFNYXR0cmVzc1BpbGxvdyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtYXR0cmVzcy1waWxsb3ciLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUyNSIsICJNMjU2IDY0TDY0IDY0QzI4LjcgNjQgMCA5Mi43IDAgMTI4TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE5MiAwIDAtMzg0em00OCAzODRsMjA4IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNTZjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTIwOCAwIDAgMzg0ek02NCAxNjBjMC0xNy43IDE0LjMtMzIgMzItMzJsNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDE5MmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtNjQgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0xOTJ6Il0KICAgIH07CiAgICBmYUNoZXZyb25MZWZ0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoZXZyb24tbGVmdCIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWzkwMDFdLCAiZjA1MyIsICJNOS40IDIzMy40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM2wxOTIgMTkyYzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNMNzcuMyAyNTYgMjQ2LjYgODYuNmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMGwtMTkyIDE5MnoiXQogICAgfTsKICAgIGZhQ2xvdWRNb29uUmFpbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjbG91ZC1tb29uLXJhaW4iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjczYyIsICJNNDQ4IDBjLTY4LjYgMC0xMjcuMSA0My4xLTE0OS44IDEwMy44IDE3LjEgMTQuMSAyOS42IDMzLjUgMzQuOSA1NS44IDM5LjkgMjEuNyA2Ni45IDYzLjkgNjYuOSAxMTIuNSAwIDEzLjUtMi4xIDI2LjUtNS45IDM4LjcgMTYuOSA2IDM1IDkuMyA1My45IDkuMyA0MyAwIDgyLjEtMTcgMTEwLjgtNDQuNiA0LjYtNC40IDUuOS0xMS4yIDMuMy0xN3MtOC42LTkuMy0xNC45LTguOGMtMyAuMi02LjEgLjQtOS4yIC40LTYzLjUgMC0xMTUtNTEuNS0xMTUtMTE1IDAtNDUuMSAyNi04NC4yIDYzLjgtMTAzIDUuNy0yLjggOS04LjkgOC4yLTE1LjJTNDg5LjYgNS4zIDQ4My40IDMuOUM0NzIgMS40IDQ2MC4yIDAgNDQ4IDB6TTI3MiAzNTJjNDQuMiAwIDgwLTM1LjggODAtODAgMC0zOS0yNy45LTcxLjUtNjQuOC03OC42IC41LTMuMSAuOC02LjIgLjgtOS40IDAtMzAuOS0yNS4xLTU2LTU2LTU2LTEyLjQgMC0yMy45IDQtMzMuMSAxMC44LTEzLjQtMjUuNS00MC4xLTQyLjgtNzAuOS00Mi44LTQ0LjIgMC04MCAzNS44LTgwIDgwIDAgNy40IDEgMTQuNiAyLjkgMjEuNS0yOS44IDExLjYtNTAuOSA0MC42LTUwLjkgNzQuNSAwIDQ0LjIgMzUuOCA4MCA4MCA4MGwxOTIgMHpNNjkgNDAxLjFjLTEyLjYtNC4yLTI2LjIgMi42LTMwLjQgMTUuMkwxNy4yIDQ4MC40QzEzIDQ5MyAxOS44IDUwNi42IDMyLjQgNTEwLjhzMjYuMi0yLjYgMzAuNC0xNS4ybDIxLjQtNjQuMWM0LjItMTIuNi0yLjYtMjYuMi0xNS4yLTMwLjR6bTEyMCAwYy0xMi42LTQuMi0yNi4yIDIuNi0zMC40IDE1LjJsLTIxLjQgNjQuMWMtNC4yIDEyLjYgMi42IDI2LjIgMTUuMiAzMC40czI2LjItMi42IDMwLjQtMTUuMmwyMS40LTY0LjFjNC4yLTEyLjYtMi42LTI2LjItMTUuMi0zMC40em0xMjAgMGMtMTIuNi00LjItMjYuMiAyLjYtMzAuNCAxNS4ybC0yMS40IDY0LjFjLTQuMiAxMi42IDIuNiAyNi4yIDE1LjIgMzAuNHMyNi4yLTIuNiAzMC40LTE1LjJsMjEuNC02NC4xYzQuMi0xMi42LTIuNi0yNi4yLTE1LjItMzAuNHoiXQogICAgfTsKICAgIGZhQXJyb3dEb3duMTkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctZG93bi0xLTkiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsic29ydC1udW1lcmljLWFzYyIsICJzb3J0LW51bWVyaWMtZG93biJdLCAiZjE2MiIsICJNNDE4LjcgMzhjOC4zIDYgMTMuMyAxNS43IDEzLjMgMjZsMCA5NiAxNiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC05NiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDE2IDAgMC01MS42LTUuOSAyYy0xNi44IDUuNi0zNC45LTMuNS00MC41LTIwLjJzMy41LTM0LjkgMjAuMi00MC41bDQ4LTE2YzkuOC0zLjMgMjAuNS0xLjYgMjguOCA0LjR6TTM2NS4xIDQzMC42bDExLjctMThjLTMyLjktOS45LTU2LjgtNDAuNS01Ni44LTc2LjYgMC00NC4yIDM1LjgtODAgODAtODBzODAgMzUuOCA4MCA4MGMwIDIyLjktNi42IDQ1LjMtMTkuMSA2NC41bC00Mi4xIDY0LjljLTkuNiAxNC44LTI5LjQgMTkuMS00NC4zIDkuNHMtMTkuMS0yOS40LTkuNC00NC4zek00MjQgMzM2YTI0IDI0IDAgMSAwIC00OCAwIDI0IDI0IDAgMSAwIDQ4IDB6TTE1MC42IDQ3MC42Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMGwtOTYtOTZjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zczMyLjgtMTIuNSA0NS4zIDBMOTYgMzcwLjcgOTYgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDMwNi43IDQxLjQtNDEuNGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zbC05NiA5NnoiXQogICAgfTsKICAgIGZhU29ydE51bWVyaWNBc2MgPSBmYUFycm93RG93bjE5OwogICAgZmFTb3J0TnVtZXJpY0Rvd24gPSBmYUFycm93RG93bjE5OwogICAgZmFIYW5kU3BvY2syID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbmQtc3BvY2siLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg0MDZdLCAiZjI1OSIsICJNMjE0LjkgMjMuN0MyMTAuMyA2LjYgMTkyLjgtMy41IDE3NS43IDEuMXMtMjcuMiAyMi4xLTIyLjYgMzkuMkwyMDYgMjM3LjhjMi41IDkuMi00LjUgMTguMi0xNCAxOC4yLTYuNCAwLTEyLTQuMi0xMy45LTEwLjNMMTM0LjYgMTAyLjdjLTUuMS0xNi45LTIzLTI2LjQtMzkuOS0yMS4zcy0yNi40IDIzLTIxLjMgMzkuOWw2Mi44IDIwNi40YzIuNCA3LjktNy4yIDEzLjgtMTMuMiA4LjFMNjcuNiAyODNjLTE2LTE1LjItNDEuMy0xNC42LTU2LjYgMS40Uy0zLjYgMzI1LjcgMTIuNCAzNDFMMTI0LjggNDQ4YzQzLjEgNDEuMSAxMDAuNCA2NCAxNjAgNjRsMTkuMSAwYy4xIDAgLjEtLjEgLjEtLjFzLjEtLjEgLjEtLjFjNTguMy0zLjUgMTA4LjYtNDMuMiAxMjUuMy05OS43bDgxLjItMjc1YzUtMTYuOS00LjctMzQuNy0yMS42LTM5LjhzLTM0LjcgNC43LTM5LjggMjEuNkw0MTEuNSAyNDcuMWMtMS42IDUuMy02LjQgOC45LTEyIDguOS03LjkgMC0xMy44LTcuMy0xMi4yLTE1LjFsMzYtMTcwLjNjMy43LTE3LjMtNy40LTM0LjMtMjQuNy0zNy45cy0zNC4zIDcuNC0zNy45IDI0LjdMMzIzLjEgMjM1LjFjLTIuNiAxMi4yLTEzLjMgMjAuOS0yNS44IDIwLjktMTEuOSAwLTIyLjQtOC0yNS40LTE5LjVsLTU3LTIxMi44eiJdCiAgICB9OwogICAgZmFXYW5kTWFnaWNTcGFya2xlcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3YW5kLW1hZ2ljLXNwYXJrbGVzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbIm1hZ2ljLXdhbmQtc3BhcmtsZXMiXSwgImUyY2EiLCAiTTI2My40LTI3TDI3OC4yIDkuOCAzMTUgMjQuNmMzIDEuMiA1IDQuMiA1IDcuNHMtMiA2LjItNSA3LjRMMjc4LjIgNTQuMiAyNjMuNCA5MWMtMS4yIDMtNC4yIDUtNy40IDVzLTYuMi0yLTcuNC01TDIzMy44IDU0LjIgMTk3IDM5LjRjLTMtMS4yLTUtNC4yLTUtNy40czItNi4yIDUtNy40TDIzMy44IDkuOCAyNDguNi0yN2MxLjItMyA0LjItNSA3LjQtNXM2LjIgMiA3LjQgNXpNMTEwLjcgNDEuN2wyMS41IDUwLjEgNTAuMSAyMS41YzUuOSAyLjUgOS43IDguMyA5LjcgMTQuN3MtMy44IDEyLjItOS43IDE0LjdsLTUwLjEgMjEuNS0yMS41IDUwLjFjLTIuNSA1LjktOC4zIDkuNy0xNC43IDkuN3MtMTIuMi0zLjgtMTQuNy05LjdMNTkuOCAxNjQuMiA5LjcgMTQyLjdDMy44IDE0MC4yIDAgMTM0LjQgMCAxMjhzMy44LTEyLjIgOS43LTE0LjdMNTkuOCA5MS44IDgxLjMgNDEuN0M4My44IDM1LjggODkuNiAzMiA5NiAzMnMxMi4yIDMuOCAxNC43IDkuN3pNNDY0IDMwNGM2LjQgMCAxMi4yIDMuOCAxNC43IDkuN2wyMS41IDUwLjEgNTAuMSAyMS41YzUuOSAyLjUgOS43IDguMyA5LjcgMTQuN3MtMy44IDEyLjItOS43IDE0LjdsLTUwLjEgMjEuNS0yMS41IDUwLjFjLTIuNSA1LjktOC4zIDkuNy0xNC43IDkuN3MtMTIuMi0zLjgtMTQuNy05LjdsLTIxLjUtNTAuMS01MC4xLTIxLjVjLTUuOS0yLjUtOS43LTguMy05LjctMTQuN3MzLjgtMTIuMiA5LjctMTQuN2w1MC4xLTIxLjUgMjEuNS01MC4xYzIuNS01LjkgOC4zLTkuNyAxNC43LTkuN3pNNDYwIDBjMTEgMCAyMS42IDQuNCAyOS41IDEyLjJsNDIuMyA0Mi4zQzUzOS42IDYyLjQgNTQ0IDczIDU0NCA4NHMtNC40IDIxLjYtMTIuMiAyOS41bC04OC4yIDg4LjItMTAxLjMtMTAxLjMgODguMi04OC4yQzQzOC40IDQuNCA0NDkgMCA0NjAgMHpNNDQuMiAzOTguNUwzMDguNCAxMzQuMyA0MDkuNyAyMzUuNiAxNDUuNSA0OTkuOEMxMzcuNiA1MDcuNiAxMjcgNTEyIDExNiA1MTJzLTIxLjYtNC40LTI5LjUtMTIuMkw0NC4yIDQ1Ny41QzM2LjQgNDQ5LjYgMzIgNDM5IDMyIDQyOHM0LjQtMjEuNiAxMi4yLTI5LjV6Il0KICAgIH07CiAgICBmYU1hZ2ljV2FuZFNwYXJrbGVzID0gZmFXYW5kTWFnaWNTcGFya2xlczsKICAgIGZhQ29tbWVudE1lZGljYWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY29tbWVudC1tZWRpY2FsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY3ZjUiLCAiTTI1NiA0ODBjMTQxLjQgMCAyNTYtMTA3LjUgMjU2LTI0MFMzOTcuNCAwIDI1NiAwIDAgMTA3LjUgMCAyNDBjMCA1NC4zIDE5LjIgMTA0LjMgNTEuNiAxNDQuNUwyLjggNDc2LjhjLTQuOCA5LTMuMyAyMCAzLjYgMjcuNXMxNy44IDkuOCAyNy4xIDUuOGwxMTguNC01MC43QzE4My43IDQ3Mi42IDIxOC45IDQ4MCAyNTYgNDgwek0yMTcuNiAxNTMuNmMwLTEwLjYgOC42LTE5LjIgMTkuMi0xOS4ybDM4LjQgMGMxMC42IDAgMTkuMiA4LjYgMTkuMiAxOS4ybDAgNDggNDggMGMxMC42IDAgMTkuMiA4LjYgMTkuMiAxOS4ybDAgMzguNGMwIDEwLjYtOC42IDE5LjItMTkuMiAxOS4ybC00OCAwIDAgNDhjMCAxMC42LTguNiAxOS4yLTE5LjIgMTkuMmwtMzguNCAwYy0xMC42IDAtMTkuMi04LjYtMTkuMi0xOS4ybDAtNDgtNDggMGMtMTAuNiAwLTE5LjItOC42LTE5LjItMTkuMmwwLTM4LjRjMC0xMC42IDguNi0xOS4yIDE5LjItMTkuMmw0OCAwIDAtNDh6Il0KICAgIH07CiAgICBmYUJlbGxTbGFzaDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmVsbC1zbGFzaCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyODI3NywgNjE5NDNdLCAiZjFmNiIsICJNNDEtMjQuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTLTIuMy0uMyA3IDkuMWw1MjggNTI4YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtODcuNS04Ny41YzE3LjItMi40IDMwLjUtMTcuMyAzMC41LTM1LjIgMC04LjEtMi43LTE1LjktNy44LTIyLjJsLTkuOC0xMi4yQzQ2NC40IDMwOC41IDQ0OCAyNjEuOCA0NDggMjEzLjdsMC0yMS43YzAtNzcuNC01NS0xNDItMTI4LTE1Ni44bDAtMy4yYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMy4yYy0zOC42IDcuOC03Mi4yIDI5LjYtOTUuMiA1OS43TDQxLTI0Ljl6bTg3IDIzOC41YzAgNDguMS0xNi40IDk0LjgtNDYuNCAxMzIuNGwtOS44IDEyLjJjLTUgNi4zLTcuOCAxNC4xLTcuOCAyMi4yIDAgMTkuNiAxNS45IDM1LjUgMzUuNSAzNS41bDIzNS4zIDAtMjA2LjktMjA2LjkgMCA0LjV6TTI4OCA1MTJjMjkuOCAwIDU0LjktMjAuNCA2Mi00OGwtMTI0IDBjNy4xIDI3LjYgMzIuMiA0OCA2MiA0OHoiXQogICAgfTsKICAgIGZhSGFuZHNoYWtlU2xhc2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZHNoYWtlLXNsYXNoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbNTc0MzksICJoYW5kc2hha2UtYWx0LXNsYXNoIiwgImhhbmRzaGFrZS1zaW1wbGUtc2xhc2giXSwgImUwNjAiLCAiTTQxLTI0LjljLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwUy0yLjMtLjMgNyA5LjFsNTI4IDUyOGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTI4OC0yODggMTQuMi0xNC4yYzQuMi00LjIgOS41LTYuNSAxNC45LTYuOSA2LjgtLjYgMTMuOCAxLjcgMTkgNi45TDUwNS42IDM3NiA1NzYgMzIwIDU3NiAzMiA0NjQgOTYgNDQwLjIgODAuMUM0MjQuNCA2OS42IDQwNS45IDY0IDM4Ni45IDY0bC03MC40IDBjLTEuMSAwLTIuMyAwLTMuNCAuMS0xNi45IC45LTMyLjggOC41LTQ0LjIgMjEuMWwtNTUuOCA2Mi4xLTM0LTM0IDQ0LjMtNDkuMi0zOS43IDBjLTE1LjMgMC0zMC4xIDMuNi00My41IDEwLjRMNDEtMjQuOXpNMCA2OS44TDAgMzIwIDE1Ni40IDQ1MC4zYzIzIDE5LjIgNTIgMjkuNyA4MS45IDI5LjdsMTUuNyAwLTctN2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDQxIDQxIDkgMGMyMi4yIDAgNDMuOC01LjggNjIuOC0xNi40TDAgNjkuOHoiXQogICAgfTsKICAgIGZhSGFuZHNoYWtlQWx0U2xhc2ggPSBmYUhhbmRzaGFrZVNsYXNoOwogICAgZmFIYW5kc2hha2VTaW1wbGVTbGFzaCA9IGZhSGFuZHNoYWtlU2xhc2g7CiAgICBmYUJvdHRsZVdhdGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvdHRsZS13YXRlciIsCiAgICAgIGljb246IFszMjAsIDUxMiwgW10sICJlNGM1IiwgIk0xMTItMzJsOTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtOTYgMEM5NC4zIDMyIDgwIDE3LjcgODAgMHMxNC4zLTMyIDMyLTMyek0xNiAxNDRjMC0zNS4zIDI4LjctNjQgNjQtNjRsMTYwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjQgMCAyNC4xLTEzLjMgNDUuMS0zMyA1NiAxOS43IDEwLjkgMzMgMzEuOSAzMyA1NnMtMTMuMyA0NS4xLTMzIDU2YzE5LjcgMTAuOSAzMyAzMS45IDMzIDU2cy0xMy4zIDQ1LjEtMzMgNTZjMTkuNyAxMC45IDMzIDMxLjkgMzMgNTYgMCAzNS4zLTI4LjcgNjQtNjQgNjRMODAgNTQ0Yy0zNS4zIDAtNjQtMjguNy02NC02NCAwLTI0LjEgMTMuMy00NS4xIDMzLTU2LTE5LjctMTAuOS0zMy0zMS45LTMzLTU2czEzLjMtNDUuMSAzMy01NmMtMTkuNy0xMC45LTMzLTMxLjktMzMtNTZzMTMuMy00NS4xIDMzLTU2Yy0xOS43LTEwLjktMzMtMzEuOS0zMy01NnoiXQogICAgfTsKICAgIGZhRGljZUQyMCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkaWNlLWQyMCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNmNmIiwgIk0yMjQuNC04LjJjMTkuNi0xMS4xIDQzLjYtMTEuMSA2My4xIDBsMTkyIDEwOC44YzIwIDExLjQgMzIuNCAzMi42IDMyLjQgNTUuN2wwIDIxNS42YzAgMjMtMTIuNCA0NC4zLTMyLjQgNTUuN2wtMTkyIDEwOC44Yy0xOS42IDExLjEtNDMuNiAxMS4xLTYzLjEgMEwzMi40IDQyNy41QzEyLjQgNDE2LjEgMCAzOTQuOCAwIDM3MS44TDAgMTU2LjJjMC0yMyAxMi40LTQ0LjMgMzIuNC01NS43TDIyNC40LTguMnptNTIgNzMuMkMyNjcgNDkuOCAyNDUgNDkuOCAyMzUuNiA2NWwtNzYuNiAxMjMuNy04NS40LTQ2LjMtMy44LTEuNmMtOC45LTIuNy0xOC44IDEuMS0yMy40IDkuNnMtMi40IDE4LjkgNC43IDI0LjhsMy4zIDIuMyA4My40IDQ1LjItNzQuNiAxMjAuNkM1NS4zIDM1Ni4yIDYxIDM3MyA3NSAzNzguNGwxNjEgNjEuOSAwIDM5LjdjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC0zOS43IDE2MS02MS45YzE0LTUuNCAxOS43LTIyLjIgMTEuOC0zNWwtNzQuNy0xMjAuNiA4My40LTQ1LjJjOS43LTUuMyAxMy4zLTE3LjQgOC4xLTI3LjFzLTE3LjQtMTMuMy0yNy4xLTguMUwzNTMgMTg4LjcgMjc2LjQgNjV6bS00NyAzMjkuOWwtMTIyLTQ2LjkgNTQuNS04OC4xIDY3LjUgMTM1ek00MDQuNiAzNDhsLTEyMiA0Ni45IDY3LjUtMTM1IDU0LjUgODguMXpNMzE5LjMgMjMyTDI1NiAzNTguNiAxOTIuNyAyMzIgMzE5LjMgMjMyek0zMDggMTkybC0xMDQuMSAwIDUyLTg0IDUyIDg0eiJdCiAgICB9OwogICAgZmFBcnJvd0Rvd25aQSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy1kb3duLXotYSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJzb3J0LWFscGhhLWRlc2MiLCAic29ydC1hbHBoYS1kb3duLWFsdCJdLCAiZjg4MSIsICJNMjMwLjYgMzkwLjZsLTgwIDgwYy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMGwtODAtODBjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zczMyLjgtMTIuNSA0NS4zIDBMOTYgMzcwLjcgOTYgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDMwNi43IDI1LjQtMjUuNGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zek0yODggNjRjMC0xNy43IDE0LjMtMzIgMzItMzJsMTI4IDBjMTIuOSAwIDI0LjYgNy44IDI5LjYgMTkuOHMyLjIgMjUuNy02LjkgMzQuOUwzOTcuMyAxNjAgNDQ4IDE2MGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTI4IDBjLTEyLjkgMC0yNC42LTcuOC0yOS42LTE5LjhzLTIuMi0yNS43IDYuOS0zNC45TDM3MC44IDk2IDMyMCA5NmMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6TTQxMi42IDI3My43bDgwIDE2MGM3LjkgMTUuOCAxLjUgMzUtMTQuMyA0Mi45cy0zNSAxLjUtNDIuOS0xNC4zbC03LjItMTQuMy04OC40IDAtNy4yIDE0LjNjLTcuOSAxNS44LTI3LjEgMjIuMi00Mi45IDE0LjNzLTIyLjItMjcuMS0xNC4zLTQyLjlsODAtMTYwYzUuNC0xMC44IDE2LjUtMTcuNyAyOC42LTE3LjdzMjMuMiA2LjggMjguNiAxNy43ek0zODQgMzU5LjZsLTIwLjIgNDAuNCA0MC40IDAtMjAuMi00MC40eiJdCiAgICB9OwogICAgZmFTb3J0QWxwaGFEZXNjID0gZmFBcnJvd0Rvd25aQTsKICAgIGZhU29ydEFscGhhRG93bkFsdCA9IGZhQXJyb3dEb3duWkE7CiAgICBmYUJydXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJydXNoIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY1NWQiLCAiTTE2Mi40IDZjLTEuNS0zLjYtNS02LTguOS02bC0xOSAwYy0zLjkgMC03LjUgMi40LTguOSA2TDEwNC45IDU3LjdjLTMuMiA4LTE0LjYgOC0xNy44IDBMNjYuNCA2Yy0xLjUtMy42LTUtNi04LjktNkw0OCAwQzIxLjUgMCAwIDIxLjUgMCA0OGwwIDIwOCAzODQgMCAwLTIwOGMwLTI2LjUtMjEuNS00OC00OC00OEwyMzAuNSAwYy0zLjkgMC03LjUgMi40LTguOSA2TDIwMC45IDU3LjdjLTMuMiA4LTE0LjYgOC0xNy44IDBMMTYyLjQgNnpNMCAzMDRsMCAxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGw2NCAwIDAgNjRjMCAzNS4zIDI4LjcgNjQgNjQgNjRzNjQtMjguNyA2NC02NGwwLTY0IDY0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xNi0zODQgMHpNMTkyIDQ2NGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNiAxNiA3LjIgMTYgMTYtNy4yIDE2LTE2IDE2eiJdCiAgICB9OwogICAgZmFQZXJzb25XYWxraW5nRGFzaGVkTGluZUFycm93UmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLXdhbGtpbmctZGFzaGVkLWxpbmUtYXJyb3ctcmlnaHQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU1MyIsICJNMTYwIDgwYTU2IDU2IDAgMSAwIDAtMTEyIDU2IDU2IDAgMSAwIDAgMTEyek03My40IDIyNy45bDIyLjYtMjIuNiAwIDY5LjNjMCAyOCAxMi4yIDU0LjcgMzMuNSA3Mi45bDcxLjQgNjEuMmM1LjkgNS4xIDkuOCAxMi4xIDEwLjkgMTkuOGwxMi42IDg4LjFjMi41IDE3LjUgMTguNyAyOS43IDM2LjIgMjcuMnMyOS43LTE4LjcgMjcuMi0zNi4ybC0xMi42LTg4LjFjLTMuMy0yMy4xLTE0LjktNDQuMS0zMi42LTU5LjNsLTM0LjUtMjkuNiAwLTExNS4yIDMuOCA0LjdjMTguMiAyMi44IDQ1LjggMzYgNzUgMzZsMzMuMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0zMy4yIDBjLTkuNyAwLTE4LjktNC40LTI1LTEybC0xNy45LTIyLjRjLTIzLTI4LjgtNTcuOS00NS42LTk0LjgtNDUuNi0zMi4yIDAtNjMuMSAxMi44LTg1LjggMzUuNkwyOC4xIDE4Mi42QzEwLjEgMjAwLjYgMCAyMjUgMCAyNTAuNUwwIDI4OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzcuNWMwLTguNSAzLjQtMTYuNiA5LjQtMjIuNnpNODUuOCA0MDcuM2MtMS41IDUuMi00LjMgMTAtOC4xIDEzLjhMOS40IDQ4OS40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwbDY4LjMtNjguM2MxMS41LTExLjUgMTkuOS0yNS44IDI0LjQtNDEuNWwyLjItNy42LTQ2LTM5LjRjLTIuNS0yLjItNS00LjQtNy40LTYuOEw4NS44IDQwNy4zek00MzIgOGMwLTEzLjMtMTAuNy0yNC0yNC0yNFMzODQtNS4zIDM4NCA4bDAgMzJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTMyem0wIDEyOGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDMyYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0zMnpNNDA4IDMyMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAzMmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMzJjMC0xMy4zLTEwLjctMjQtMjQtMjR6bTI0IDE1MmMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDMyYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0zMnpNNjA5IDI3M2M5LjQtOS40IDkuNC0yNC42IDAtMzMuOWwtNzItNzJjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwcy05LjQgMjQuNiAwIDMzLjlsMzEgMzEtMTAyLjEgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxMDIuMSAwLTMxIDMxYy05LjQgOS40LTkuNCAyNC42IDAgMzMuOXMyNC42IDkuNCAzMy45IDBsNzItNzJ6Il0KICAgIH07CiAgICBmYUFycm93VXBTaG9ydFdpZGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctdXAtc2hvcnQtd2lkZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJzb3J0LWFtb3VudC11cC1hbHQiXSwgImY4ODUiLCAiTTMyMCAzMmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0zMiAwem0wIDEyOGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmw5NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC05NiAwem0wIDEyOGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwxNjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTYwIDB6bTAgMTI4Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDIyNCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0yMjQgMHpNMTUwLjYgNDEuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTk2IDk2Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwTDk2IDE0MS4zIDk2IDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzA2LjcgNDEuNCA0MS40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTk2LTk2eiJdCiAgICB9OwogICAgZmFTb3J0QW1vdW50VXBBbHQgPSBmYUFycm93VXBTaG9ydFdpZGU7CiAgICBmYUdyaXBWZXJ0aWNhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJncmlwLXZlcnRpY2FsIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbImdyaWQtdmVydGljYWwiXSwgImY1OGUiLCAiTTEyOCA0MGMwLTIyLjEtMTcuOS00MC00MC00MEw0MCAwQzE3LjkgMCAwIDE3LjkgMCA0MEwwIDg4YzAgMjIuMSAxNy45IDQwIDQwIDQwbDQ4IDBjMjIuMSAwIDQwLTE3LjkgNDAtNDBsMC00OHptMCAxOTJjMC0yMi4xLTE3LjktNDAtNDAtNDBsLTQ4IDBjLTIyLjEgMC00MCAxNy45LTQwIDQwbDAgNDhjMCAyMi4xIDE3LjkgNDAgNDAgNDBsNDggMGMyMi4xIDAgNDAtMTcuOSA0MC00MGwwLTQ4ek0wIDQyNGwwIDQ4YzAgMjIuMSAxNy45IDQwIDQwIDQwbDQ4IDBjMjIuMSAwIDQwLTE3LjkgNDAtNDBsMC00OGMwLTIyLjEtMTcuOS00MC00MC00MGwtNDggMGMtMjIuMSAwLTQwIDE3LjktNDAgNDB6TTMyMCA0MGMwLTIyLjEtMTcuOS00MC00MC00MEwyMzIgMGMtMjIuMSAwLTQwIDE3LjktNDAgNDBsMCA0OGMwIDIyLjEgMTcuOSA0MCA0MCA0MGw0OCAwYzIyLjEgMCA0MC0xNy45IDQwLTQwbDAtNDh6TTE5MiAyMzJsMCA0OGMwIDIyLjEgMTcuOSA0MCA0MCA0MGw0OCAwYzIyLjEgMCA0MC0xNy45IDQwLTQwbDAtNDhjMC0yMi4xLTE3LjktNDAtNDAtNDBsLTQ4IDBjLTIyLjEgMC00MCAxNy45LTQwIDQwek0zMjAgNDI0YzAtMjIuMS0xNy45LTQwLTQwLTQwbC00OCAwYy0yMi4xIDAtNDAgMTcuOS00MCA0MGwwIDQ4YzAgMjIuMSAxNy45IDQwIDQwIDQwbDQ4IDBjMjIuMSAwIDQwLTE3LjkgNDAtNDBsMC00OHoiXQogICAgfTsKICAgIGZhR3JpZFZlcnRpY2FsID0gZmFHcmlwVmVydGljYWw7CiAgICBmYUNhclR1bm5lbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYXItdHVubmVsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU0ZGUiLCAiTTI1NiAwQzExNC42IDAgMCAxMTQuNiAwIDI1NkwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGw0Mi44IDBjLTYuNi01LjktMTAuOC0xNC40LTEwLjgtMjRsMC0xMTMuMWMwLTEzLjUgMy4xLTI2LjggOS0zOC45bDM5LjctODAuOGM5LjQtMTkuMSAyOC45LTMxLjMgNTAuMi0zMS4zTDMxNyAyMjRjMjEuMyAwIDQwLjggMTIuMSA1MC4yIDMxLjNMNDA3IDMzNmM1LjkgMTIuMSA5IDI1LjQgOSAzOC45TDQxNiA0ODhjMCA5LjYtNC4yIDE4LjEtMTAuOCAyNGw0Mi44IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xOTJDNTEyIDExNC42IDM5Ny40IDAgMjU2IDB6TTM2Mi44IDUxMmMtNi42LTUuOS0xMC44LTE0LjQtMTAuOC0yNGwwLTI0LTE5MiAwIDAgMjRjMCA5LjYtNC4yIDE4LjEtMTAuOCAyNGwyMTMuNyAwem0tMTc1LTIzNS41bC0yOS4zIDU5LjUgMTk0LjkgMC0yOS4zLTU5LjVjLTEuMy0yLjctNC4xLTQuNS03LjItNC41TDE5NSAyNzJjLTMgMC01LjggMS43LTcuMiA0LjV6TTE3NiA0MjRhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4em0xODQtMjRhMjQgMjQgMCAxIDAgLTQ4IDAgMjQgMjQgMCAxIDAgNDggMHoiXQogICAgfTsKICAgIGZhQ2hhcnRDb2x1bW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hhcnQtY29sdW1uIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUwZTMiLCAiTTMyIDMyYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzM2YzAgOC44IDcuMiAxNiAxNiAxNmw0MDAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkw4MCA0ODBjLTQ0LjIgMC04MC0zNS44LTgwLTgwTDAgNjRDMCA0Ni4zIDE0LjMgMzIgMzIgMzJ6TTE0NCAyMjRjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyem0xNDQtNjRsMCAxNjBjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xNjBjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMnptODAgMzJjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA5NmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTk2YzAtMTcuNyAxNC4zLTMyIDMyLTMyek01MTIgOTZsMCAyMjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0yMjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMnoiXQogICAgfTsKICAgIGZhQ2Fwcmljb3JuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhcHJpY29ybiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlODQ4IiwgIk0yNDAgMzJjNzkuNSAwIDE0NCA2NC41IDE0NCAxNDRsMCA2NS4yYzE4LjgtMTAuOSA0MC43LTE3LjIgNjQtMTcuMiA3MC43IDAgMTI4IDU3LjMgMTI4IDEyOFM1MTguNyA0ODAgNDQ4IDQ4MGMtMzUuOCAwLTY4LjItMTQuNy05MS40LTM4LjQtMjguOCA0Mi41LTc3LjQgNzAuNC0xMzIuNiA3MC40LTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJjNTMgMCA5Ni00MyA5Ni05NmwwLTE3NmMwLTQ0LjItMzUuOC04MC04MC04MHMtODAgMzUuOC04MCA4MGwwIDIwOGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTIyNGMwLTM1LjMtMjguNy02NC02NC02NC0xNy43IDAtMzItMTQuMy0zMi0zMlMxNC4zIDMyIDMyIDMyQzcyLjYgMzIgMTA4LjggNTEgMTMyLjIgODAuNSAxNTguNiA1MC43IDE5Ny4xIDMyIDI0MCAzMnpNNDQ4IDI4OGE2NCA2NCAwIDEgMCAwIDEyOCA2NCA2NCAwIDEgMCAwLTEyOHoiXQogICAgfTsKICAgIGZhVHJ1Y2tBcnJvd1JpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRydWNrLWFycm93LXJpZ2h0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1OGIiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMy4zIDBjMTAuNCAzNi45IDQ0LjQgNjQgODQuNyA2NHM3NC4yLTI3LjEgODQuNy02NGwxMDIuNiAwYzEwLjQgMzYuOSA0NC40IDY0IDg0LjcgNjRzNzQuMi0yNy4xIDg0LjctNjRsMy4zIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xNDYuN2MwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0w1MTIgMTQ2LjdjLTEyLTEyLTI4LjMtMTguNy00NS4zLTE4LjdsLTUwLjcgMCAwLTMyYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyek01MTIgMjM3LjNsMCA1MC43LTk2IDAgMC05NiA1MC43IDAgNDUuMyA0NS4zek0xNTIgMzg0YTQwIDQwIDAgMSAxIDAgODAgNDAgNDAgMCAxIDEgMC04MHptMjMyIDQwYTQwIDQwIDAgMSAxIDgwIDAgNDAgNDAgMCAxIDEgLTgwIDB6TTMwNSAyMjVsLTcyIDcyYy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45bDMxLTMxLTEwMi4xIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMTAyLjEgMC0zMS0zMWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDcyIDcyYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45eiJdCiAgICB9OwogICAgZmFUdiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0diIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzYzNzE3LCAidGVsZXZpc2lvbiIsICJ0di1hbHQiXSwgImYyNmMiLCAiTTY0IDk2bDAgMjQwIDQ0OCAwIDAtMjQwLTQ0OCAwek0wIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDQ0OCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjQwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQwMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NnpNMTYwIDQ0OGwyNTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMjU2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJ6Il0KICAgIH07CiAgICBmYVRlbGV2aXNpb24gPSBmYVR2OwogICAgZmFUdkFsdCA9IGZhVHY7CiAgICBmYVNlY3Rpb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2VjdGlvbiIsCiAgICAgIGljb246IFsyNTYsIDUxMiwgW10sICJlNDQ3IiwgIk0xMTAgMEM0OS4yIDAgMCA0OS4yIDAgMTEwIDAgMTMzLjcgNy42IDE1NS44IDIwLjUgMTc0IDcuNiAxOTIgMCAyMTQuMSAwIDIzOCAwIDI5MS43IDM4LjkgMzM3LjYgOTEuOSAzNDYuNGw2MS43IDEwLjNjMjIuMiAzLjcgMzguNCAyMi45IDM4LjQgNDUuMyAwIDI1LjQtMjAuNiA0Ni00NiA0NmwtOTggMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmw5OCAwYzYwLjcgMCAxMTAtNDkuMiAxMTAtMTEwIDAtMjMuNy03LjYtNDUuOS0yMC41LTY0IDEyLjktMTggMjAuNS00MC4xIDIwLjUtNjQgMC01My44LTM4LjktOTkuNi05MS45LTEwOC41bC02MS43LTEwLjNDODAuMiAxNTEuNiA2NCAxMzIuNCA2NCAxMTAgNjQgODQuNiA4NC42IDY0IDExMCA2NGw5OCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMyUzIyNS43IDAgMjA4IDBMMTEwIDB6bTc0LjcgMjk5LjFjLTYuNS0yLjQtMTMuNC00LjMtMjAuNS01LjVsLTYxLjctMTAuM2MtMjIuMi0zLjctMzguNC0yMi45LTM4LjQtNDUuMyAwLTkuMiAyLjctMTcuOCA3LjQtMjUgNi41IDIuNCAxMy40IDQuMyAyMC41IDUuNWw2MS43IDEwLjNjMjIuMiAzLjcgMzguNCAyMi45IDM4LjQgNDUuMyAwIDkuMi0yLjcgMTcuOC03LjQgMjV6Il0KICAgIH07CiAgICBmYVBlYWNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlYWNlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTc3NF0sICJmNjdjIiwgIk0yMjQgNDQ1LjNsMC0xMjEuOC05NC4zIDc3LjFjMjYuMSAyMi44IDU4LjUgMzguNyA5NC4zIDQ0Ljd6TTg5LjIgMzUxLjFMMjI0IDI0MC44IDIyNCA2Ni43Yy05MC44IDE1LjItMTYwIDk0LjItMTYwIDE4OS4zIDAgMzQuNiA5LjIgNjcuMSAyNS4yIDk1LjF6bTI5My4xIDQ5LjVsLTk0LjMtNzcuMSAwIDEyMS44YzM1LjctNiA2OC4xLTIxLjkgOTQuMy00NC43em00MC42LTQ5LjVjMTYtMjggMjUuMi02MC41IDI1LjItOTUuMSAwLTk1LjEtNjkuMi0xNzQuMS0xNjAtMTg5LjNsMCAxNzQuMiAxMzQuOCAxMTAuM3pNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHoiXQogICAgfTsKICAgIGZhU3RhcjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3RhciIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzExMDg4LCA2MTQ0Nl0sICJmMDA1IiwgIk0zMDkuNS0xOC45Yy00LjEtOC0xMi40LTEzLjEtMjEuNC0xMy4xcy0xNy4zIDUuMS0yMS40IDEzLjFMMTkzLjEgMTI1LjMgMzMuMiAxNTAuN2MtOC45IDEuNC0xNi4zIDcuNy0xOS4xIDE2LjNzLS41IDE4IDUuOCAyNC40bDExNC40IDExNC41LTI1LjIgMTU5LjljLTEuNCA4LjkgMi4zIDE3LjkgOS42IDIzLjJzMTYuOSA2LjEgMjUgMkwyODguMSA0MTcuNiA0MzIuNCA0OTFjOCA0LjEgMTcuNyAzLjMgMjUtMnMxMS0xNC4yIDkuNi0yMy4yTDQ0MS43IDMwNS45IDU1Ni4xIDE5MS40YzYuNC02LjQgOC42LTE1LjggNS44LTI0LjRzLTEwLjEtMTQuOS0xOS4xLTE2LjNMMzgzIDEyNS4zIDMwOS41LTE4Ljl6Il0KICAgIH07CiAgICBmYUZsYWcyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZsYWciLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjc5ODgsIDYxNzI1XSwgImYwMjQiLCAiTTY0IDMyQzY0IDE0LjMgNDkuNyAwIDMyIDBTMCAxNC4zIDAgMzJMMCA0ODBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTEyMS42IDYyLjctMTguOGM0MS45LTEyLjYgODcuMS04LjcgMTI2LjIgMTAuOSA0Mi43IDIxLjQgOTIuNSAyNCAxMzcuMiA3LjJsMzcuMS0xMy45YzEyLjUtNC43IDIwLjgtMTYuNiAyMC44LTMwbDAtMjQ3LjdjMC0yMy0yNC4yLTM4LTQ0LjgtMjcuN2wtMTEuOCA1LjljLTQ0LjkgMjIuNS05Ny44IDIyLjUtMTQyLjggMC0zNi40LTE4LjItNzguMy0yMS44LTExNy4yLTEwLjFMNjQgNTQuNCA2NCAzMnoiXQogICAgfTsKICAgIGZhVHJpYW5nbGVFeGNsYW1hdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cmlhbmdsZS1leGNsYW1hdGlvbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzk4ODgsICJleGNsYW1hdGlvbi10cmlhbmdsZSIsICJ3YXJuaW5nIl0sICJmMDcxIiwgIk0yNTYgMGMxNC43IDAgMjguMiA4LjEgMzUuMiAyMWwyMTYgNDAwYzYuNyAxMi40IDYuNCAyNy40LS44IDM5LjVTNDg2LjEgNDgwIDQ3MiA0ODBMNDAgNDgwYy0xNC4xIDAtMjcuMi03LjQtMzQuNC0xOS41cy03LjUtMjcuMS0uOC0zOS41bDIxNi00MDBjNy0xMi45IDIwLjUtMjEgMzUuMi0yMXptMCAzNTJhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDEgMCAwLTY0em0wLTE5MmMtMTguMiAwLTMyLjcgMTUuNS0zMS40IDMzLjdsNy40IDEwNGMuOSAxMi41IDExLjQgMjIuMyAyMy45IDIyLjMgMTIuNiAwIDIzLTkuNyAyMy45LTIyLjNsNy40LTEwNGMxLjMtMTguMi0xMy4xLTMzLjctMzEuNC0zMy43eiJdCiAgICB9OwogICAgZmFFeGNsYW1hdGlvblRyaWFuZ2xlID0gZmFUcmlhbmdsZUV4Y2xhbWF0aW9uOwogICAgZmFXYXJuaW5nID0gZmFUcmlhbmdsZUV4Y2xhbWF0aW9uOwogICAgZmFTY2hvb2xDaXJjbGVFeGNsYW1hdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzY2hvb2wtY2lyY2xlLWV4Y2xhbWF0aW9uIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NmMiLCAiTTY0IDEyOGMtMzUuMyAwLTY0IDI4LjctNjQgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjc2IDBjLTEwLjUtMTQuNi0xOS0zMC43LTI1LjEtNDhsLTkwLjkgMCAwLTg4YzAtMjIuMSAxNy45LTQwIDQwLTQwbDQ4IDBjMSAwIDEuOSAwIDIuOSAuMSAyNi4zLTc0LjYgOTcuNS0xMjguMSAxODEuMS0xMjguMSAyOC42IDAgNTUuNiA2LjIgODAgMTcuNGwwLTMzLjRjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTY0IDAtMTI3LjktMTE1LjFjLTE4LjMtMTYuNC00Ni0xNi40LTY0LjIgMEwxMjggMTI4IDY0IDEyOHptNjQgMjQwYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJ6TTExMiAyNTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNnpNMjg4IDEyOGE2NCA2NCAwIDEgMSAwIDEyOCA2NCA2NCAwIDEgMSAwLTEyOHpNNDk2IDU0NGExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6bTAtMTAwYTIwIDIwIDAgMSAxIDAgNDAgMjAgMjAgMCAxIDEgMC00MHptMC0xNDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgODBjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC04MGMwLTguOCA3LjItMTYgMTYtMTZ6Il0KICAgIH07CiAgICBmYUdyYWR1YXRpb25DYXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ3JhZHVhdGlvbi1jYXAiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjc4OTEsICJtb3J0YXItYm9hcmQiXSwgImYxOWQiLCAiTTQ4IDE5NS44bDIwOS4yIDg2LjFjOS44IDQgMjAuMiA2LjEgMzAuOCA2LjFzMjEtMi4xIDMwLjgtNi4xbDI0Mi40LTk5LjhjOS0zLjcgMTQuOC0xMi40IDE0LjgtMjIuMXMtNS44LTE4LjQtMTQuOC0yMi4xTDMxOC44IDM4LjFDMzA5IDM0LjEgMjk4LjYgMzIgMjg4IDMycy0yMSAyLjEtMzAuOCA2LjFMMTQuOCAxMzcuOUM1LjggMTQxLjYgMCAxNTAuMyAwIDE2MEwwIDQ1NmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMjYwLjJ6bTQ4IDcxLjdMOTYgMzg0YzAgNTMgODYgOTYgMTkyIDk2czE5Mi00MyAxOTItOTZsMC0xMTYuNi0xNDIuOSA1OC45Yy0xNS42IDYuNC0zMi4yIDkuNy00OS4xIDkuN3MtMzMuNS0zLjMtNDkuMS05LjdMOTYgMjY3LjR6Il0KICAgIH07CiAgICBmYU1vcnRhckJvYXJkID0gZmFHcmFkdWF0aW9uQ2FwOwogICAgZmFTdG9yZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzdG9yZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNTRlIiwgIk0zMC43IDcyLjNDMzcuNiA0OC40IDU5LjUgMzIgODQuNCAzMmwzNDQgMGMyNC45IDAgNDYuOCAxNi40IDUzLjggNDAuM2wyMy40IDgwLjJjMTIuOCA0My43LTIwLjEgODcuNS02NS42IDg3LjUtMjYuMyAwLTQ5LjQtMTQuOS02MC44LTM3LjEtMTEuNiAyMS45LTM0LjYgMzcuMS02MS40IDM3LjEtMjYuNiAwLTQ5LjctMTUtNjEuMy0zNy0xMS42IDIyLTM0LjcgMzctNjEuMyAzNy0yNi44IDAtNDkuOC0xNS4xLTYxLjQtMzcuMS0xMS40IDIyLjEtMzQuNSAzNy4xLTYwLjggMzcuMS00NS42IDAtNzguNC00My43LTY1LjYtODcuNUwzMC43IDcyLjN6TTk2LjQgMzUybDMyMCAwIDAtNjYuNGM3LjYgMS42IDE1LjUgMi40IDIzLjUgMi40IDE0LjMgMCAyOC0yLjYgNDAuNS03LjJsMCAxNTEuMmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMzUyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMTUxLjJjMTIuNSA0LjYgMjYuMSA3LjIgNDAuNSA3LjIgOC4xIDAgMTUuOS0uOCAyMy41LTIuNGwwIDY2LjR6Il0KICAgIH07CiAgICBmYVVzZXJBc3Ryb25hdXQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlci1hc3Ryb25hdXQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjRmYiIsICJNMjI0IDMzNmM3NC42IDAgMTM4LjQtNDYuNCAxNjQtMTEybDQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTgwYzAtMTMuMy0xMC43LTI0LTI0LTI0bC00IDBDMzYyLjQgMzAuNCAyOTguNi0xNiAyMjQtMTZTODUuNiAzMC40IDYwIDk2bC00IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgODBjMCAxMy4zIDEwLjcgMjQgMjQgMjRsNCAwYzI1LjYgNjUuNiA4OS40IDExMiAxNjQgMTEyek0yMDggODBsMzIgMGM1MyAwIDk2IDQzIDk2IDk2cy00MyA5Ni05NiA5NmwtMzIgMGMtNTMgMC05Ni00My05Ni05NnM0My05NiA5Ni05NnpNMTYgNDg0LjZDMTYgNDk5LjcgMjguMyA1MTIgNDMuNCA1MTJsNTIuNiAwIDAtNDhjMC0xNy43IDE0LjMtMzIgMzItMzJsMTkyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA0OCA1Mi42IDBjMTUuMSAwIDI3LjQtMTIuMyAyNy40LTI3LjQgMC01OS44LTMxLjktMTEyLjItNzkuNi0xNDEtMzYuNCAyNS41LTgwLjYgNDAuNC0xMjguNCA0MC40cy05Mi0xNC45LTEyOC40LTQwLjRDNDcuOSAzNzIuNCAxNiA0MjQuOCAxNiA0ODQuNnpNMTgzLjMgMTQxLjVjLS45LTMuMy0zLjktNS41LTcuMy01LjVzLTYuNCAyLjItNy4zIDUuNWwtNiAyMS4yLTIxLjIgNmMtMy4zIC45LTUuNSAzLjktNS41IDcuM3MyLjIgNi40IDUuNSA3LjNsMjEuMiA2IDYgMjEuMmMuOSAzLjMgMy45IDUuNSA3LjMgNS41czYuNC0yLjIgNy4zLTUuNWw2LTIxLjIgMjEuMi02YzMuMy0uOSA1LjUtMy45IDUuNS03LjNzLTIuMi02LjQtNS41LTcuM2wtMjEuMi02LTYtMjEuMnpNMTUyIDQ4OGwwIDI0IDQ4IDAgMC0yNGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNHptMTIwLTI0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDI0IDQ4IDAgMC0yNGMwLTEzLjMtMTAuNy0yNC0yNC0yNHoiXQogICAgfTsKICAgIGZhQnVpbGRpbmdGbGFnID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJ1aWxkaW5nLWZsYWciLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTRkNSIsICJNNjQgMEMyOC43IDAgMCAyOC43IDAgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjU2IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zODRjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMHpNMTc2IDM1MmwzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgODAtOTYgMCAwLTgwYzAtMTcuNyAxNC4zLTMyIDMyLTMyek05NiAxMTJjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMnpNMjQwIDk2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZ6TTk2IDI0MGMwLTguOCA3LjItMTYgMTYtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyem0xNDQtMTZsMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZsMCAzMmMwIDguOC03LjIgMTYtMTYgMTZsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNnpNNDY0IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgNDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yODggMTEyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC05NmMwLTE3LjctMTQuMy0zMi0zMi0zMkw0OTYgMzJjMC0xNy43LTE0LjMtMzItMzItMzJ6Il0KICAgIH07CiAgICBmYU11Z1NhdWNlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtdWctc2F1Y2VyIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImNvZmZlZSJdLCAiZjBmNCIsICJNNjQgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJsMzUyIDBjNzAuNyAwIDEyOCA1Ny4zIDEyOCAxMjhTNTE4LjcgMjg4IDQ0OCAyODhjMCA1My00MyA5Ni05NiA5NmwtMTkyIDBjLTUzIDAtOTYtNDMtOTYtOTZMNjQgNjR6bTQ0OCA5NmMwLTM1LjMtMjguNy02NC02NC02NGwwIDEyOGMzNS4zIDAgNjQtMjguNyA2NC02NHpNNjQgNDQ4bDM4NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDY0IDUxMmMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMnoiXQogICAgfTsKICAgIGZhQ29mZmVlID0gZmFNdWdTYXVjZXI7CiAgICBmYUxlbW9uMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsZW1vbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyNzgxOV0sICJmMDk0IiwgIk00NDggOTZjMC0zNS4zLTI4LjctNjQtNjQtNjQtNi42IDAtMTMgMS0xOSAyLjktMjIuNSA3LTQ4LjEgMTQuOS03MSA5LTc1LjItMTkuMS0xNTYuNCAxMS0yMTMuNyA2OC4zUy03LjIgMjUwLjggMTEuOSAzMjZjNS44IDIyLjktMiA0OC40LTkgNzEtMS45IDYtMi45IDEyLjQtMi45IDE5IDAgMzUuMyAyOC43IDY0IDY0IDY0IDYuNiAwIDEzLTEgMTkuMS0yLjkgMjIuNS03IDQ4LjEtMTQuOSA3MS05IDc1LjIgMTkuMSAxNTYuNC0xMSAyMTMuNy02OC4zUzQ1NS4yIDI2MS4yIDQzNi4xIDE4NmMtNS44LTIyLjkgMi00OC40IDktNzEgMS45LTYgMi45LTEyLjQgMi45LTE5LjF6TTIyMi43IDE0M2MtNTIgMTUuMi05Ni41IDU5LjctMTExLjcgMTExLjctMy43IDEyLjctMTcuMSAyMC0yOS44IDE2LjNTNjEuMiAyNTQgNjUgMjQxLjNjMTkuOC02Ny43IDc2LjYtMTI0LjUgMTQ0LjMtMTQ0LjMgMTIuNy0zLjcgMjYuMSAzLjYgMjkuOCAxNi4zcy0zLjYgMjYuMS0xNi4zIDI5Ljh6Il0KICAgIH07CiAgICBmYUNhcmF2YW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FyYXZhbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmOGZmIiwgIk0zMiA5NmMwLTM1LjMgMjguNy02NCA2NC02NGwzMjAgMGM3MC43IDAgMTI4IDU3LjMgMTI4IDEyOGwwIDE5MiA2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0yOTYuNCAwYy4yIDIuNiAuNCA1LjMgLjQgOCAwIDQ4LjYtMzkuNCA4OC04OCA4OHMtODgtMzkuNC04OC04OGMwLTIuNyAuMS01LjQgLjQtOEw5NiA0MTZjLTM1LjMgMC02NC0yOC43LTY0LTY0TDMyIDk2ek0zNTIgMzUybDY0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC00OC0yNCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDI0IDAgMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtNjQgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAxNjBjMCAxNy43IDE0LjMgMzIgMzIgMzJ6TTE2MCAxMjhjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgNjRjMCAxNy43IDE0LjMgMzIgMzIgMzJsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTY0YzAtMTcuNy0xNC4zLTMyLTMyLTMybC02NCAwem02NCAzMzZhNDAgNDAgMCAxIDAgMC04MCA0MCA0MCAwIDEgMCAwIDgweiJdCiAgICB9OwogICAgZmFRID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInEiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMTNdLCAiNTEiLCAiTTY0IDI1NmMwIDg4LjQgNzEuNiAxNjAgMTYwIDE2MCAyOC45IDAgNTYtNy43IDc5LjQtMjEuMWwtNzItODYuNGMtMTEuMy0xMy42LTkuNS0zMy44IDQuMS00NS4xczMzLjgtOS41IDQ1LjEgNC4xbDcwLjkgODUuMWMyMC40LTI2LjggMzIuNS02MC4zIDMyLjUtOTYuNiAwLTg4LjQtNzEuNi0xNjAtMTYwLTE2MFM2NCAxNjcuNiA2NCAyNTZ6TTM0NC45IDQ0NC42QzMxMCA0NjcgMjY4LjUgNDgwIDIyNCA0ODAgMTAwLjMgNDgwIDAgMzc5LjcgMCAyNTZTMTAwLjMgMzIgMjI0IDMyIDQ0OCAxMzIuMyA0NDggMjU2YzAgNTYuMS0yMC42IDEwNy40LTU0LjcgMTQ2LjdsNDcuMyA1Ni44YzExLjMgMTMuNiA5LjUgMzMuOC00LjEgNDUuMXMtMzMuOCA5LjUtNDUuMS00LjFsLTQ2LjYtNTUuOXoiXQogICAgfTsKICAgIGZhTG9jayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsb2NrIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4Mjc0XSwgImYwMjMiLCAiTTEyOCA5NmwwIDY0IDEyOCAwIDAtNjRjMC0zNS4zLTI4LjctNjQtNjQtNjRzLTY0IDI4LjctNjQgNjR6TTY0IDE2MGwwLTY0QzY0IDI1LjMgMTIxLjMtMzIgMTkyLTMyUzMyMCAyNS4zIDMyMCA5NmwwIDY0YzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjI0YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAyMjRjMC0zNS4zIDI4LjctNjQgNjQtNjR6Il0KICAgIH07CiAgICBmYVBhaW50Um9sbGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBhaW50LXJvbGxlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNWFhIiwgIk0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwzNTIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwxNiAwYzQ0LjIgMCA4MCAzNS44IDgwIDgwbDAgOTZjMCA0NC4yLTM1LjggODAtODAgODBsLTE2MCAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAxOC43YzE4LjYgNi42IDMyIDI0LjQgMzIgNDUuM2wwIDk2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0zMiAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTk2YzAtMjAuOSAxMy40LTM4LjcgMzItNDUuM2wwLTE4LjdjMC00NC4yIDM1LjgtODAgODAtODBsMTYwIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtOTZjMC04LjgtNy4yLTE2LTE2LTE2bC0xNiAwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDE5MmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA2NHoiXQogICAgfTsKICAgIGZhVm9sdW1lSGlnaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ2b2x1bWUtaGlnaCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzEyODI2NiwgInZvbHVtZS11cCJdLCAiZjAyOCIsICJNNTMzLjYgMzIuNWMtMTAuMy04LjQtMjUuNC02LjgtMzMuOCAzLjVzLTYuOCAyNS40IDMuNSAzMy44QzU1Ny41IDExMy44IDU5MiAxODAuOCA1OTIgMjU2cy0zNC41IDE0Mi4yLTg4LjcgMTg2LjNjLTEwLjMgOC40LTExLjggMjMuNS0zLjUgMzMuOHMyMy41IDExLjggMzMuOCAzLjVDNTk4LjUgNDI2LjcgNjQwIDM0Ni4yIDY0MCAyNTZTNTk4LjUgODUuMiA1MzMuNiAzMi41ek00NzMuMSAxMDdjLTEwLjMtOC40LTI1LjQtNi44LTMzLjggMy41cy02LjggMjUuNCAzLjUgMzMuOEM0NzUuMyAxNzAuNyA0OTYgMjEwLjkgNDk2IDI1NnMtMjAuNyA4NS4zLTUzLjIgMTExLjhjLTEwLjMgOC40LTExLjggMjMuNS0zLjUgMzMuOHMyMy41IDExLjggMzMuOCAzLjVjNDMuMi0zNS4yIDcwLjktODguOSA3MC45LTE0OXMtMjcuNy0xMTMuOC03MC45LTE0OXptLTYwLjUgNzQuNWMtMTAuMy04LjQtMjUuNC02LjgtMzMuOCAzLjVzLTYuOCAyNS40IDMuNSAzMy44QzM5My4xIDIyNy42IDQwMCAyNDEgNDAwIDI1NnMtNi45IDI4LjQtMTcuNyAzNy4zYy0xMC4zIDguNC0xMS44IDIzLjUtMy41IDMzLjhzMjMuNSAxMS44IDMzLjggMy41QzQzNC4xIDMxMi45IDQ0OCAyODYuMSA0NDggMjU2cy0xMy45LTU2LjktMzUuNC03NC41ek04MCAzNTJsNDggMCAxMzQuMSAxMTkuMmM2LjQgNS43IDE0LjYgOC44IDIzLjEgOC44IDE5LjIgMCAzNC44LTE1LjYgMzQuOC0zNC44bDAtMzc4LjRjMC0xOS4yLTE1LjYtMzQuOC0zNC44LTM0LjgtOC41IDAtMTYuNyAzLjEtMjMuMSA4LjhMMTI4IDE2MCA4MCAxNjBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgOTZjMCAyNi41IDIxLjUgNDggNDggNDh6Il0KICAgIH07CiAgICBmYVZvbHVtZVVwID0gZmFWb2x1bWVIaWdoOwogICAgZmFGb2xkZXJQbHVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZvbGRlci1wbHVzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY2NWUiLCAiTTUxMiAzODRjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDQ4Yy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDEzOC43IDBjMTMuOCAwIDI3LjMgNC41IDM4LjQgMTIuOGwzOC40IDI4LjhjNS41IDQuMiAxMi4zIDYuNCAxOS4yIDYuNEw0NDggODBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyNDB6TTI1NiAxNjBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgNDgtNDggMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw0OCAwIDAgNDhjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTQ4IDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTQ4IDAgMC00OGMwLTEzLjMtMTAuNy0yNC0yNC0yNHoiXQogICAgfTsKICAgIGZhTWVyY3VyeSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtZXJjdXJ5IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbOTc5MV0sICJmMjIzIiwgIk0xMTctNEMxMDYtMTcuOCA4NS44LTIwIDcyLjEtOXMtMTYgMzEuMi01IDQ1Qzc0LjkgNDUuNyA4My43IDU0LjUgOTMuNSA2Mi4xIDQ2LjcgOTMuNyAxNiAxNDcuMyAxNiAyMDggMTYgMjk0LjMgNzguMSAzNjYuMSAxNjAgMzgxLjFsMCAzNC45LTMyIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzIgMCAwIDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zMiAzMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0zMiAwIDAtMzQuOWM4MS45LTE1IDE0NC04Ni44IDE0NC0xNzMuMSAwLTYwLjctMzAuNy0xMTQuMy03Ny41LTE0NS45IDkuOC03LjcgMTguNy0xNi40IDI2LjQtMjYuMSAxMS4xLTEzLjggOC44LTMzLjktNS00NVMyNzgtMTcuOCAyNjctNGMtMTcuNiAyMi00NC43IDM2LTc1IDM2UzEzNC43IDE4IDExNy00em03NSAzMjRjLTYxLjkgMC0xMTItNTAuMS0xMTItMTEyUzEzMC4xIDk2IDE5MiA5NiAzMDQgMTQ2LjEgMzA0IDIwOGMwIDYxLjgtNTAuMSAxMTItMTExLjkgMTEybC0uMSAweiJdCiAgICB9OwogICAgZmFBbmNob3IgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYW5jaG9yIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbOTg3NV0sICJmMTNkIiwgIk0yODggNjRhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDEgMCAwLTY0ek0xOTIgOTZjMC01MyA0My05NiA5Ni05NnM5NiA0MyA5NiA5NmMwIDQxLjgtMjYuNyA3Ny40LTY0IDkwLjVsMCAyNTcuOWM2Mi45LTE0LjMgMTEwLjItNjkuNyAxMTEuOS0xMzYuNWwtMTYuMSAxNC4xYy0xMCA4LjctMjUuMSA3LjctMzMuOS0yLjNzLTcuNy0yNS4xIDIuMy0zMy45bDY0LTU2YzktNy45IDIyLjYtNy45IDMxLjYgMGw2NCA1NmMxMCA4LjcgMTEgMjMuOSAyLjMgMzMuOXMtMjMuOSAxMS0zMy45IDIuM0w0OTYgMzA3LjlDNDkzLjkgNDIxIDQwMS42IDUxMiAyODggNTEyUzgyLjEgNDIxIDgwIDMwNy45TDYzLjggMzIyLjFjLTEwIDguNy0yNS4xIDcuNy0zMy45LTIuM3MtNy43LTI1LjEgMi4zLTMzLjlsNjQtNTZjOS03LjkgMjIuNi03LjkgMzEuNiAwbDY0IDU2YzEwIDguNyAxMSAyMy45IDIuMyAzMy45cy0yMy45IDExLTMzLjkgMi4zbC0xNi4xLTE0LjFjMS44IDY2LjggNDkuMSAxMjIuMiAxMTEuOSAxMzYuNWwwLTI1Ny45Yy0zNy4zLTEzLjItNjQtNDguNy02NC05MC41eiJdCiAgICB9OwogICAgZmFTcXVhcmVQYXJraW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1wYXJraW5nIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI3MzU5LCAicGFya2luZyJdLCAiZjU0MCIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnpNMTkyIDI1Nmw0OCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC00OCAwIDAgNjR6bTQ4IDY0bC00OCAwIDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xODRjMC0yMi4xIDE3LjktNDAgNDAtNDBsNzIgMGM1MyAwIDk2IDQzIDk2IDk2cy00MyA5Ni05NiA5NnoiXQogICAgfTsKICAgIGZhUGFya2luZyA9IGZhU3F1YXJlUGFya2luZzsKICAgIGZhSGFudWtpYWggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFudWtpYWgiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjgzMzRdLCAiZjZlNiIsICJNMzE0LjIgMy4zYy01LjEgOC44LTE4LjIgMzMuMy0xOC4yIDUyLjcgMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGMwLTE5LjQtMTMuMS00My45LTE4LjItNTIuNy0xLjItMi4xLTMuNC0zLjMtNS44LTMuM3MtNC42IDEuMi01LjggMy4zem0tMjg4IDQ4QzIxLjEgNjAuMSA4IDg0LjYgOCAxMDQgOCAxMTcuMyAxOC43IDEyOCAzMiAxMjhzMjQtMTAuNyAyNC0yNGMwLTE5LjQtMTMuMS00My45LTE4LjItNTIuNy0xLjItMi4xLTMuNC0zLjMtNS44LTMuM3MtNC42IDEuMi01LjggMy4zek04OCAxMDRjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGMwLTE5LjQtMTMuMS00My45LTE4LjItNTIuNy0xLjItMi4xLTMuNC0zLjMtNS44LTMuM3MtNC42IDEuMi01LjggMy4zQzEwMS4xIDYwLjEgODggODQuNiA4OCAxMDR6bTgyLjItNTIuN2MtNS4xIDguOC0xOC4yIDMzLjMtMTguMiA1Mi43IDAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRjMC0xOS40LTEzLjEtNDMuOS0xOC4yLTUyLjctMS4yLTIuMS0zLjQtMy4zLTUuOC0zLjNzLTQuNiAxLjItNS44IDMuM3pNMjE2IDEwNGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0YzAtMTkuNC0xMy4xLTQzLjktMTguMi01Mi43LTEuMi0yLjEtMy40LTMuMy01LjgtMy4zcy00LjYgMS4yLTUuOCAzLjNDMjI5LjEgNjAuMSAyMTYgODQuNiAyMTYgMTA0ek0zOTQuMiA1MS4zYy01LjEgOC44LTE4LjIgMzMuMy0xOC4yIDUyLjcgMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGMwLTE5LjQtMTMuMS00My45LTE4LjItNTIuNy0xLjItMi4xLTMuNC0zLjMtNS44LTMuM3MtNC42IDEuMi01LjggMy4zek00NDAgMTA0YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRjMC0xOS40LTEzLjEtNDMuOS0xOC4yLTUyLjctMS4yLTIuMS0zLjQtMy4zLTUuOC0zLjNzLTQuNiAxLjItNS44IDMuM0M0NTMuMSA2MC4xIDQ0MCA4NC42IDQ0MCAxMDR6bTgyLjItNTIuN2MtNS4xIDguOC0xOC4yIDMzLjMtMTguMiA1Mi43IDAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRjMC0xOS40LTEzLjEtNDMuOS0xOC4yLTUyLjctMS4yLTIuMS0zLjQtMy4zLTUuOC0zLjNzLTQuNiAxLjItNS44IDMuM3pNNTg0IDEwNGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0YzAtMTkuNC0xMy4xLTQzLjktMTguMi01Mi43LTEuMi0yLjEtMy40LTMuMy01LjgtMy4zcy00LjYgMS4yLTUuOCAzLjNDNTk3LjEgNjAuMSA1ODQgODQuNiA1ODQgMTA0ek0xMTIgMTYwYy04LjggMC0xNiA3LjItMTYgMTZsMCAxMTIgMzIgMCAwLTExMmMwLTguOC03LjItMTYtMTYtMTZ6bTY0IDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDExMiAzMiAwIDAtMTEyYzAtOC44LTcuMi0xNi0xNi0xNnptNjQgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMTEyIDMyIDAgMC0xMTJjMC04LjgtNy4yLTE2LTE2LTE2em0xNjAgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMTEyIDMyIDAgMC0xMTJjMC04LjgtNy4yLTE2LTE2LTE2em02NCAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAxMTIgMzIgMCAwLTExMmMwLTguOC03LjItMTYtMTYtMTZ6bTY0IDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDExMiAzMiAwIDAtMTEyYzAtOC44LTcuMi0xNi0xNi0xNnpNMzUyIDE0NGMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDE3Ni0xOTIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC05NmMwLTE3LjctMTQuMy0zMi0zMi0zMlMwIDE3NC4zIDAgMTkybDAgOTZjMCA1MyA0MyA5NiA5NiA5NmwxOTIgMCAwIDY0LTEyOCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDMyMCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0xMjggMCAwLTY0IDE5MiAwYzUzIDAgOTYtNDMgOTYtOTZsMC05NmMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDk2YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0xOTIgMCAwLTE3NnoiXQogICAgfTsKICAgIGZhUm90YXRlTGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyb3RhdGUtbGVmdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJyb3RhdGUtYmFjayIsICJyb3RhdGUtYmFja3dhcmQiLCAidW5kby1hbHQiXSwgImYyZWEiLCAiTTI0IDE5MmwxNDQgMGM5LjcgMCAxOC41LTUuOCAyMi4yLTE0LjhzMS43LTE5LjMtNS4yLTI2LjJsLTQ2LjctNDYuN2M3NS4zLTU4LjYgMTg0LjMtNTMuMyAyNTMuNSAxNS45IDc1IDc1IDc1IDE5Ni41IDAgMjcxLjVzLTE5Ni41IDc1LTI3MS41IDBjLTEwLjItMTAuMi0xOS0yMS4zLTI2LjQtMzMtOS41LTE0LjktMjkuMy0xOS4zLTQ0LjItOS44cy0xOS4zIDI5LjMtOS44IDQ0LjJDNDkuNyA0MDguNyA2MS40IDQyMy41IDc1IDQzNyAxNzUgNTM3IDMzNyA1MzcgNDM3IDQzN1M1MzcgMTc1IDQzNyA3NUMzNDIuOC0xOS4zIDE5My4zLTI0LjcgOTIuNyA1OC44TDQxIDdDMzQuMSAuMiAyMy44LTEuOSAxNC44IDEuOFMwIDE0LjMgMCAyNEwwIDE2OGMwIDEzLjMgMTAuNyAyNCAyNCAyNHoiXQogICAgfTsKICAgIGZhUm90YXRlQmFjayA9IGZhUm90YXRlTGVmdDsKICAgIGZhUm90YXRlQmFja3dhcmQgPSBmYVJvdGF0ZUxlZnQ7CiAgICBmYVVuZG9BbHQgPSBmYVJvdGF0ZUxlZnQ7CiAgICBmYUhlYWRpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGVhZGluZyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJoZWFkZXIiXSwgImYxZGMiLCAiTTAgNjRDMCA0Ni4zIDE0LjMgMzIgMzIgMzJsOTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTYgMCAwIDExMiAyMjQgMCAwLTExMi0xNiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDk2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTE2IDAgMCAzMjAgMTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtOTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxNiAwIDAtMTQ0LTIyNCAwIDAgMTQ0IDE2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTk2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMTYgMCAwLTMyMC0xNiAwQzE0LjMgOTYgMCA4MS43IDAgNjR6Il0KICAgIH07CiAgICBmYUhlYWRlciA9IGZhSGVhZGluZzsKICAgIGZhQ3Jvc3NoYWlycyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjcm9zc2hhaXJzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYwNWIiLCAiTTI4OC0xNmMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDE4LjNjOTguMSAxNCAxNzUuNyA5MS42IDE4OS43IDE4OS43bDE4LjMgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTguMyAwYy0xNCA5OC4xLTkxLjYgMTc1LjctMTg5LjcgMTg5LjdsMCAxOC4zYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTguM0MxNTcuOSA0NjMuNyA4MC4zIDM4Ni4xIDY2LjMgMjg4TDQ4IDI4OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxOC4zIDBDODAuMyAxMjUuOSAxNTcuOSA0OC4zIDI1NiAzNC4zTDI1NiAxNmMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNMTMxLjIgMjg4YzEyLjcgNjIuNyA2Mi4xIDExMi4xIDEyNC44IDEyNC44bDAtMTIuOGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMTIuOGM2Mi43LTEyLjcgMTEyLjEtNjIuMSAxMjQuOC0xMjQuOEw0MzIgMjg4Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDEyLjggMEM0MzIuMSAxNjEuMyAzODIuNyAxMTEuOSAzMjAgOTkuMmwwIDEyLjhjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xMi44QzE5My4zIDExMS45IDE0My45IDE2MS4zIDEzMS4yIDIyNGwxMi44IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTEyLjggMHpNMjg4IDIwOGE0OCA0OCAwIDEgMSAwIDk2IDQ4IDQ4IDAgMSAxIDAtOTZ6Il0KICAgIH07CiAgICBmYUNpcmNsZU5vZGVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNpcmNsZS1ub2RlcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNGUyIiwgIk00MTguNCAxNTcuOWMzNS4zLTguMyA2MS42LTQwIDYxLjYtNzcuOSAwLTQ0LjItMzUuOC04MC04MC04MC00My40IDAtNzguNyAzNC41LTgwIDc3LjVMMTM2LjIgMTUxLjFDMTIxLjcgMTM2LjggMTAxLjkgMTI4IDgwIDEyOCAzNS44IDEyOCAwIDE2My44IDAgMjA4czM1LjggODAgODAgODBjMTIuMiAwIDIzLjgtMi43IDM0LjEtNy42TDI1OS43IDQwNy44Yy0yLjQgNy42LTMuNyAxNS44LTMuNyAyNC4yIDAgNDQuMiAzNS44IDgwIDgwIDgwczgwLTM1LjggODAtODBjMC0yNy43LTE0LTUyLjEtMzUuNC02Ni40bDM3LjgtMjA3Ljd6TTE1Ni4zIDIzMi4yYzIuMi02LjkgMy41LTE0LjIgMy43LTIxLjdsMTgzLjgtNzMuNWMzLjYgMy41IDcuNCA2LjcgMTEuNiA5LjVMMzE3LjYgMzU0LjFjLTUuNSAxLjMtMTAuOCAzLjEtMTUuOCA1LjVMMTU2LjMgMjMyLjJ6Il0KICAgIH07CiAgICBmYVdpbmRvd1Jlc3RvcmUyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIndpbmRvdy1yZXN0b3JlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYyZDIiLCAiTTUxMiA5NkwxNjAgOTZjMC0zNS4zIDI4LjctNjQgNjQtNjRsMjg4IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAxOTJjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTQ4IDAgMC02NCA0OCAwIDAtMTkyek0wIDIyNGMwLTM1LjMgMjguNy02NCA2NC02NGwyODggMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDE5MmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMjI0em02NCA0MGMwIDEzLjMgMTAuNyAyNCAyNCAyNGwyNDAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNEw4OCAyNDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0eiJdCiAgICB9OwogICAgZmFSID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInIiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFsxMTRdLCAiNTIiLCAiTTMyIDMyQzE0LjMgMzIgMCA0Ni4zIDAgNjRMMCA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTEyOCA5NS4zIDAgMTAyLjQgMTQ2LjRjMTAuMSAxNC41IDMwLjEgMTggNDQuNiA3LjlzMTgtMzAuMSA3LjktNDQuNkwyMzAuMSAzMDkuNUMyODIuOCAyODguMSAzMjAgMjM2LjQgMzIwIDE3NiAzMjAgOTYuNSAyNTUuNSAzMiAxNzYgMzJMMzIgMzJ6TTE3NiAyNTZsLTExMiAwIDAtMTYwIDExMiAwYzQ0LjIgMCA4MCAzNS44IDgwIDgwcy0zNS44IDgwLTgwIDgweiJdCiAgICB9OwogICAgZmFGaWx0ZXJDaXJjbGVYbWFyayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWx0ZXItY2lyY2xlLXhtYXJrIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImUxN2IiLCAiTTMyIDY0QzE5LjEgNjQgNy40IDcxLjggMi40IDgzLjhTLjIgMTA5LjUgOS40IDExOC42TDE5MiAzMDEuMyAxOTIgNDE2YzAgOC41IDMuNCAxNi42IDkuNCAyMi42bDY0IDY0YzIuNSAyLjUgNS4zIDQuNSA4LjMgNi0yMS4yLTMwLjktMzMuNi02OC4zLTMzLjYtMTA4LjYgMC05OS40IDc1LjUtMTgxLjEgMTcyLjMtMTkxbDkwLjQtOTAuNGM5LjItOS4yIDExLjktMjIuOSA2LjktMzQuOVM0OTIuOSA2NCA0ODAgNjRMMzIgNjR6TTQzMiA1NDRhMTQ0IDE0NCAwIDEgMCAwLTI4OCAxNDQgMTQ0IDAgMSAwIDAgMjg4em01OS4zLTE4MC43bC0zNi43IDM2LjcgMzYuNyAzNi43YzYuMiA2LjIgNi4yIDE2LjQgMCAyMi42cy0xNi40IDYuMi0yMi42IDBsLTM2LjctMzYuNy0zNi43IDM2LjdjLTYuMiA2LjItMTYuNCA2LjItMjIuNiAwcy02LjItMTYuNCAwLTIyLjZsMzYuNy0zNi43LTM2LjctMzYuN2MtNi4yLTYuMi02LjItMTYuNCAwLTIyLjZzMTYuNC02LjIgMjIuNiAwbDM2LjcgMzYuNyAzNi43LTM2LjdjNi4yLTYuMiAxNi40LTYuMiAyMi42IDBzNi4yIDE2LjQgMCAyMi42eiJdCiAgICB9OwogICAgZmFHb3B1cmFtID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImdvcHVyYW0iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjY2NCIsICJNMTIwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA4IDQwIDAgMC04YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA4IDQ4IDAgMC04YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA4IDQwIDAgMC04YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCAxMzZjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA4MGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDEyOGMwIDI2LjUtMjEuNSA0OC00OCA0OGwtNDggMCAwLTIyNC0zMiAwIDAtMTI4LTQ4IDAgMCAxMjggMzIgMCAwIDIyNC0yMjQgMCAwLTIyNCAzMiAwIDAtMTI4LTQ4IDAgMCAxMjgtMzIgMCAwIDIyNC00OCAwYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDMzNmMwLTI2LjUgMjEuNS00OCA0OC00OGwwLTgwYzAtMjYuNSAyMS41LTQ4IDQ4LTQ4TDk2IDI0YzAtMTMuMyAxMC43LTI0IDI0LTI0ek0yNTYgMjA4Yy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDQ4IDY0IDAgMC00OGMwLTE3LjctMTQuMy0zMi0zMi0zMnpNMjA4IDQwMGwwIDY0IDk2IDAgMC02NGMwLTI2LjUtMjEuNS00OC00OC00OHMtNDggMjEuNS00OCA0OHpNMjU2IDk2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDMyIDY0IDAgMC0zMmMwLTE3LjctMTQuMy0zMi0zMi0zMnoiXQogICAgfTsKICAgIGZhSGVhcnRDaXJjbGVNaW51cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoZWFydC1jaXJjbGUtbWludXMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRmZiIsICJNMjQxIDg3LjFsMTUgMjAuNyAxNS0yMC43QzI5NiA1Mi41IDMzNi4yIDMyIDM3OC45IDMyIDQ1Mi40IDMyIDUxMiA5MS42IDUxMiAxNjUuMWwwIDIuNmMwIDE3LjYtMy40IDM1LjYtOS41IDUzLjctMjEuOC04LjYtNDUuNi0xMy40LTcwLjUtMTMuNC0xMDYgMC0xOTIgODYtMTkyIDE5MiAwIDI4LjUgNi4yIDU1LjYgMTcuNCA4MC0uNSAwLS45IDAtMS40IDAtMTUuNSAwLTMwLjgtNC42LTQzLjEtMTQuMS03My01NS43LTIxMi45LTE4Ni0yMTIuOS0yOTguMmwwLTIuNkMwIDkxLjYgNTkuNiAzMiAxMzMuMSAzMiAxNzUuOCAzMiAyMTYgNTIuNSAyNDEgODcuMXpNMjg4IDQwMGExNDQgMTQ0IDAgMSAxIDI4OCAwIDE0NCAxNDQgMCAxIDEgLTI4OCAwem0yMjQgMGMwLTguOC03LjItMTYtMTYtMTZsLTEyOCAwYy04LjggMC0xNiA3LjItMTYgMTZzNy4yIDE2IDE2IDE2bDEyOCAwYzguOCAwIDE2LTcuMiAxNi0xNnoiXQogICAgfTsKICAgIGZhU3Rhck9mTGlmZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzdGFyLW9mLWxpZmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjYyMSIsICJNMjA4LjUgMzJjMC0xNy43IDE0LjMtMzIgMzItMzJsMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDE0MC45IDEyMi03MC40YzE1LjMtOC44IDM0LjktMy42IDQzLjcgMTEuN2wxNiAyNy43YzguOCAxNS4zIDMuNiAzNC45LTExLjcgNDMuN2wtMTIyIDcwLjQgMTIyIDcwLjRjMTUuMyA4LjggMjAuNiAyOC40IDExLjcgNDMuN2wtMTYgMjcuN2MtOC44IDE1LjMtMjguNCAyMC42LTQzLjcgMTEuN2wtMTIyLTcwLjQgMCAxNDAuOWMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMzIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0xNDAuOS0xMjIgNzAuNGMtMTUuMyA4LjgtMzQuOSAzLjYtNDMuNy0xMS43bC0xNi0yNy43Yy04LjgtMTUuMy0zLjYtMzQuOSAxMS43LTQzLjdsMTIyLTcwLjQtMTIyLTcwLjRjLTE1LjMtOC44LTIwLjUtMjguNC0xMS43LTQzLjdsMTYtMjcuN2M4LjgtMTUuMyAyOC40LTIwLjUgNDMuNy0xMS43bDEyMiA3MC40IDAtMTQwLjl6Il0KICAgIH07CiAgICBmYUJ1c2luZXNzVGltZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJidXNpbmVzcy10aW1lIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbImJyaWVmY2FzZS1jbG9jayJdLCAiZjY0YSIsICJNMjY0IDQ4bDExMiAwYzQuNCAwIDggMy42IDggOGwwIDQwLTEyOCAwIDAtNDBjMC00LjQgMy42LTggOC04em0tNTYgOGwwIDQwLTgwIDBjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgOTYgMzA1IDBjMzMuOC0yOS45IDc4LjMtNDggMTI3LTQ4IDI4LjYgMCA1NS42IDYuMiA4MCAxNy40bDAtNjUuNGMwLTM1LjMtMjguNy02NC02NC02NGwtODAgMCAwLTQwYzAtMzAuOS0yNS4xLTU2LTU2LTU2TDI2NCAwYy0zMC45IDAtNTYgMjUuMS01NiA1NnptODAgMjk2Yy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTE2LTE5MiAwIDAgMTEyYzAgMzUuMyAyOC43IDY0IDY0IDY0bDE5My40IDBjLTExLjItMjQuNC0xNy40LTUxLjQtMTcuNC04MCAwLTE2LjYgMi4xLTMyLjcgNi00OGwtMjIgMHptMzUyIDQ4YTE0NCAxNDQgMCAxIDAgLTI4OCAwIDE0NCAxNDQgMCAxIDAgMjg4IDB6TTQ5NiAzMjBjOC44IDAgMTYgNy4yIDE2IDE2bDAgNDggMzIgMGM4LjggMCAxNiA3LjIgMTYgMTZzLTcuMiAxNi0xNiAxNmwtNDggMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtNjRjMC04LjggNy4yLTE2IDE2LTE2eiJdCiAgICB9OwogICAgZmFCcmllZmNhc2VDbG9jayA9IGZhQnVzaW5lc3NUaW1lOwogICAgZmFGaXJlRXh0aW5ndWlzaGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpcmUtZXh0aW5ndWlzaGVyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI5NTE5XSwgImYxMzQiLCAiTTUxMiAzMmMwLTkuNi00LjMtMTguNy0xMS43LTI0LjdTNDgzLjEtMS4zIDQ3My43IC42bC0xNjAgMzJDMzAxLjUgMzUuMSAyOTIgNDQuMyAyODkgNTZsLTY1IDAgMC0yNGMwLTE3LjctMTQuMy0zMi0zMi0zMkwxNjAgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAyOC40Yy01NS4zIDEyLjMtMTAxLjMgNDkuNS0xMjUuNSA5OS4xLTUuOCAxMS45LS45IDI2LjMgMTEuMSAzMi4xczI2LjMgLjkgMzIuMS0xMS4xQzYyIDE0Ni45IDkxLjggMTIxLjEgMTI4IDExMGwwIDI4LjhjLTM3LjggMTgtNjQgNTYuNS02NCAxMDEuMmwwIDEyOCAyMjQgMCAwLTEyOGMwLTQ0LjctMjYuMi04My4yLTY0LTEwMS4ybDAtMzQuOCA2NSAwYzMgMTEuNyAxMi41IDIwLjkgMjQuNyAyMy40bDE2MCAzMmM5LjQgMS45IDE5LjEtLjYgMjYuNi02LjZTNTEyIDEzNy42IDUxMiAxMjhsMC05NnpNMjg4IDQ0OGwwLTMyLTIyNCAwIDAgMzJjMCAzNS4zIDI4LjcgNjQgNjQgNjRsOTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NHoiXQogICAgfTsKICAgIGZhQXJyb3dEb3duTG9uZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy1kb3duLWxvbmciLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFsibG9uZy1hcnJvdy1kb3duIl0sICJmMTc1IiwgIk0xMzcuNCA1MzQuNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGwxMjgtMTI4YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwTDE5MiA0MzQuNyAxOTIgMGMwLTE3LjctMTQuMy0zMi0zMi0zMlMxMjgtMTcuNyAxMjggMGwwIDQzNC43LTczLjQtNzMuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNsMTI4IDEyOHoiXQogICAgfTsKICAgIGZhTG9uZ0Fycm93RG93biA9IGZhQXJyb3dEb3duTG9uZzsKICAgIGZhVXNlck1pbnVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXItbWludXMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjUwMyIsICJNMjg1LjcgMzA0Yzk4LjUgMCAxNzguMyA3OS44IDE3OC4zIDE3OC4zIDAgMTYuNC0xMy4zIDI5LjctMjkuNyAyOS43TDc3LjcgNTEyQzYxLjMgNTEyIDQ4IDQ5OC43IDQ4IDQ4Mi4zIDQ4IDM4My44IDEyNy44IDMwNCAyMjYuMyAzMDRsNTkuNCAwek0yNTYgMjQ4YTEyMCAxMjAgMCAxIDEgMC0yNDAgMTIwIDEyMCAwIDEgMSAwIDI0MHptMzQ0LTk2YzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNDQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxNDQgMHoiXQogICAgfTsKICAgIGZhTW9uZXlDaGVjayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb25leS1jaGVjayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNTNjIiwgIk0wIDEyOEMwIDkyLjcgMjguNyA2NCA2NCA2NGwzODQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI1NmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0NDhjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTI4ek05NiAzMTJjMCAxMy4zIDEwLjcgMjQgMjQgMjRsMTQ0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE0NCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHptMjQtMTM2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDI3MiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0yNzIgMHoiXQogICAgfTsKICAgIGZhSG91c2VMYXB0b3AgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG91c2UtbGFwdG9wIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbImxhcHRvcC1ob3VzZSJdLCAiZTA2NiIsICJNNDQ4IDI0MGwxOS45IDBjMTUuNSAwIDI4LjEtMTIuNiAyOC4xLTI4LjEgMC03LjYtMy4xLTE0LjktOC42LTIwLjJMMjgzLjUtNC45QzI3Ni4xLTEyIDI2Ni4zLTE2IDI1Ni0xNnMtMjAuMSA0LTI3LjUgMTEuMUwyNC42IDE5MS43QzE5LjEgMTk3IDE2IDIwNC4zIDE2IDIxMS45IDE2IDIyNy40IDI4LjYgMjQwIDQ0LjEgMjQwbDE5LjkgMCAwIDE0NGMwIDM1LjMgMjguNyA2NCA2NCA2NGw4NS43IDBjNy40LTYuNiAxNi40LTExLjQgMjYuMy0xNGwwLTEzMGMwLTUuNSAuNy0xMC45IDItMTZsLTEwIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtNDhjMC0xMy4zIDEwLjctMjQgMjQtMjRsNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDI0IDE0NCAwek0zNTIgMzUybDE2MCAwIDAgMTI4LTE2MCAwIDAtMTI4em0tNjQtMzJsMCAxNjAtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2IDAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDI4OCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4IDAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMCAwLTE2MGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtMjI0IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyeiJdCiAgICB9OwogICAgZmFMYXB0b3BIb3VzZSA9IGZhSG91c2VMYXB0b3A7CiAgICBmYURvd25sb2FkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRvd25sb2FkIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYwMTkiLCAiTTI1NiAzMmMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDIxMC43LTQxLjQtNDEuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNsOTYgOTZjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsOTYtOTZjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBMMjU2IDI0Mi43IDI1NiAzMnpNNjQgMzIwYy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDMyYzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzJjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTQ2LjkgMC01Ni42IDU2LjZjLTMxLjIgMzEuMi04MS45IDMxLjItMTEzLjEgMEwxMTAuOSAzMjAgNjQgMzIwem0zMDQgNTZhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4eiJdCiAgICB9OwogICAgZmFTYWdpdHRhcml1cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzYWdpdHRhcml1cyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlODRkIiwgIk00MTYgMzJjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxNjBjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC04Mi44LTE0Ni44IDE0Ni44IDQxLjQgNDEuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuMnMtMzIuOCAxMi41LTQ1LjMgMEwxOTIgMzMzLjMgNTQuNiA0NzAuNmMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4yIDBzLTEyLjUtMzIuOCAwLTQ1LjJMMTQ2LjggMjg4IDEwNS40IDI0Ni42Yy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuMnMzMi44LTEyLjUgNDUuMiAwTDE5MiAyNDIuOCAzMzguOCA5NiAyNTYgOTZjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMTYwIDB6Il0KICAgIH07CiAgICBmYUNvdWNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvdWNoIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY0YjgiLCAiTTE0NCAyNzJDMTQ0IDIyNC43IDEwOS44IDE4NS40IDY0LjggMTc3LjUgNzIgMTEzLjYgMTI2LjIgNjQgMTkyIDY0bDI1NiAwYzY1LjggMCAxMjAgNDkuNiAxMjcuMiAxMTMuNS00NSA4LTc5LjIgNDcuMi03OS4yIDk0LjVsMCAzMi0zNTIgMCAwLTMyek0wIDM4NEwwIDI3MmMwLTI2LjUgMjEuNS00OCA0OC00OHM0OCAyMS41IDQ4IDQ4bDAgODAgNDQ4IDAgMC04MGMwLTI2LjUgMjEuNS00OCA0OC00OHM0OCAyMS41IDQ4IDQ4bDAgMTEyYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjR6Il0KICAgIH07CiAgICBmYVJvYWRMb2NrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJvYWQtbG9jayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTY3IiwgIk0yNTYgMzJsLTc2LjMgMGMtMjkuNCAwLTU1LjEgMjAuMS02Mi4xIDQ4LjZMMzMuNCA0MjAuNUMyNS45IDQ1MC43IDQ4LjggNDgwIDgwIDQ4MGwxNzUuOSAwIDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzIgNi4xIDAgMTEuOCAxLjcgMTYuNyA0LjcgMi44LTIzLjkgMTQuMy00NS4xIDMxLjQtNjAuM2wwLTI0LjRjMC03MC43IDU3LjMtMTI4IDEyOC0xMjggNi4yIDAgMTIuNCAuNCAxOC40IDEuM0w0NTguNSA4MC42QzQ1MS40IDUyLjEgNDI1LjggMzIgMzk2LjMgMzJsLTc2LjQgMCAwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNjR6bTY0IDE5MmwwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMnptMTc2IDgwLjFsMCA0Ny45LTY0IDAgMC00Ny45YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJ6TTM1MiA0MDBsMCA5NmMwIDI2LjUgMjEuNSA0OCA0OCA0OGwxMjggMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTk2YzAtMjAuOS0xMy40LTM4LjctMzItNDUuM2wwLTUwLjZjMC00NC4yLTM1LjgtODAtODAtODBzLTgwIDM1LjgtODAgODBsMCA1MC42Yy0xOC42IDYuNi0zMiAyNC40LTMyIDQ1LjN6Il0KICAgIH07CiAgICBmYVNjaXNzb3JzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNjaXNzb3JzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbOTk4NCwgOTk4NiwgOTk4OCwgImN1dCJdLCAiZjBjNCIsICJNMTkyIDI1NmwtMzkuNSAzOS41Yy0xMi42LTQuOS0yNi4yLTcuNS00MC41LTcuNS02MS45IDAtMTEyIDUwLjEtMTEyIDExMnM1MC4xIDExMiAxMTIgMTEyIDExMi01MC4xIDExMi0xMTJjMC0xNC4zLTIuNy0yNy45LTcuNS00MC41TDQ5OS4yIDc2LjhjNy4xLTcuMSA3LjEtMTguNSAwLTI1LjYtMjguMy0yOC4zLTc0LjEtMjguMy0xMDIuNCAwTDI1NiAxOTIgMjE2LjUgMTUyLjVjNC45LTEyLjYgNy41LTI2LjIgNy41LTQwLjUgMC02MS45LTUwLjEtMTEyLTExMi0xMTJTMCA1MC4xIDAgMTEyIDUwLjEgMjI0IDExMiAyMjRjMTQuMyAwIDI3LjktMi43IDQwLjUtNy41TDE5MiAyNTZ6bTk3LjkgOTcuOUwzOTYuOCA0NjAuOGMyOC4zIDI4LjMgNzQuMSAyOC4zIDEwMi40IDAgNy4xLTcuMSA3LjEtMTguNSAwLTI1LjZsLTE0NS4zLTE0NS4zLTY0IDY0ek02NCAxMTJhNDggNDggMCAxIDEgOTYgMCA0OCA0OCAwIDEgMSAtOTYgMHptNDggMjQwYTQ4IDQ4IDAgMSAxIDAgOTYgNDggNDggMCAxIDEgMC05NnoiXQogICAgfTsKICAgIGZhQ3V0ID0gZmFTY2lzc29yczsKICAgIGZhQnVnID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJ1ZyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMTg4IiwgIk0xOTIgOTZjMC01MyA0My05NiA5Ni05NnM5NiA0MyA5NiA5NmwwIDMuNmMwIDE1LjctMTIuNyAyOC40LTI4LjQgMjguNGwtMTM1LjEgMGMtMTUuNyAwLTI4LjQtMTIuNy0yOC40LTI4LjRsMC0zLjZ6bTM0NS42IDEyLjhjMTAuNiAxNC4xIDcuNyAzNC4yLTYuNCA0NC44bC05Ny44IDczLjNjNS4zIDguOSA5LjMgMTguNyAxMS44IDI5LjFsOTguOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC05NiAwIDAgMzJjMCAyLjYtLjEgNS4zLS4yIDcuOWw4My40IDYyLjVjMTQuMSAxMC42IDE3IDMwLjcgNi40IDQ0LjhzLTMwLjcgMTctNDQuOCA2LjRsLTYzLjEtNDcuM2MtMjMuMiA0NC4yLTY2LjUgNzYuMi0xMTcuNyA4My45TDMxMiAyODBjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAyMzAuMmMtNTEuMi03LjctOTQuNS0zOS43LTExNy43LTgzLjlMODMuMiA0NzMuNmMtMTQuMSAxMC42LTM0LjIgNy43LTQ0LjgtNi40cy03LjctMzQuMiA2LjQtNDQuOGw4My40LTYyLjVjLS4xLTIuNi0uMi01LjItLjItNy45bDAtMzItOTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw5OC44IDBjMi41LTEwLjQgNi41LTIwLjIgMTEuOC0yOS4xTDQ0LjggMTUzLjZjLTE0LjEtMTAuNi0xNy0zMC43LTYuNC00NC44czMwLjctMTcgNDQuOC02LjRMMTkyIDE4NGMxMi4zLTUuMSAyNS44LTggNDAtOGwxMTIgMGMxNC4yIDAgMjcuNyAyLjggNDAgOGwxMDguOC04MS42YzE0LjEtMTAuNiAzNC4yLTcuNyA0NC44IDYuNHoiXQogICAgfTsKICAgIGZhQXJyb3dSaWdodEZyb21CcmFja2V0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXJpZ2h0LWZyb20tYnJhY2tldCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJzaWduLW91dCJdLCAiZjA4YiIsICJNMTYwIDk2YzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDk2IDMyQzQzIDMyIDAgNzUgMCAxMjhMMCAzODRjMCA1MyA0MyA5NiA5NiA5Nmw2NCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC02NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTI1NmMwLTE3LjcgMTQuMy0zMiAzMi0zMmw2NCAwek01MDIuNiAyNzguNmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM2wtMTI4LTEyOGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNMNDAyLjcgMjI0IDE5MiAyMjRjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMjEwLjcgMC03My40IDczLjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBsMTI4LTEyOHoiXQogICAgfTsKICAgIGZhU2lnbk91dCA9IGZhQXJyb3dSaWdodEZyb21CcmFja2V0OwogICAgZmFIYW5kSG9sZGluZ0hhbmQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1ob2xkaW5nLWhhbmQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRmNyIsICJNNDY2LjggMTg2LjVsNDIuNS00Mi41IDM0LjcgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTY0YzAtMTcuNy0xNC4zLTMyLTMyLTMyTDIyMy42IDE2Yy0yOSAwLTU3LjMgOS4zLTgwLjcgMjYuNUwxNi4zIDEzNS44Yy0xNy44IDEzLjEtMjEuNiAzOC4xLTguNSA1NS45czM4LjEgMjEuNiA1NS45IDguNUwxODMuNCAxMTIgMjk2IDExMmMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNzIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwxNTIuMiAwYzMzLjkgMCA2Ni41LTEzLjUgOTAuNS0zNy41em0tMzU3LjUgMTM5TDY2LjcgMzY4IDMyIDM2OGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMjAuNSAwYzI5IDAgNTcuMy05LjMgODAuNy0yNi41bDEyNi42LTkzLjNjMTcuOC0xMy4xIDIxLjYtMzguMSA4LjUtNTUuOXMtMzguMS0yMS42LTU1LjktOC41TDM5Mi42IDQwMCAyODAgNDAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDcyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTE1Mi4yIDBjLTMzLjkgMC02Ni41IDEzLjUtOTAuNSAzNy41eiJdCiAgICB9OwogICAgZmFTdHJvb3B3YWZlbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzdHJvb3B3YWZlbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNTUxIiwgIk0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwek0zMTIuNiA2My43Yy02LjItNi4yLTE2LjQtNi4yLTIyLjYgMEwyNTYgOTcuNiAyMjIuMSA2My43Yy02LjItNi4yLTE2LjQtNi4yLTIyLjYgMHMtNi4yIDE2LjQgMCAyMi42bDMzLjkgMzMuOS00NS4zIDQ1LjMtNTYuNi01Ni42Yy02LjItNi4yLTE2LjQtNi4yLTIyLjYgMHMtNi4yIDE2LjQgMCAyMi42bDU2LjYgNTYuNi00NS4zIDQ1LjMtMzMuOS0zMy45Yy02LjItNi4yLTE2LjQtNi4yLTIyLjYgMHMtNi4yIDE2LjQgMCAyMi42TDk3LjYgMjU2IDYzLjcgMjg5LjljLTYuMiA2LjItNi4yIDE2LjQgMCAyMi42czE2LjQgNi4yIDIyLjYgMGwzMy45LTMzLjkgNDUuMyA0NS4zLTU2LjYgNTYuNmMtNi4yIDYuMi02LjIgMTYuNCAwIDIyLjZzMTYuNCA2LjIgMjIuNiAwbDU2LjYtNTYuNiA0NS4zIDQ1LjMtMzMuOSAzMy45Yy02LjIgNi4yLTYuMiAxNi40IDAgMjIuNnMxNi40IDYuMiAyMi42IDBsMzMuOS0zMy45IDMzLjkgMzMuOWM2LjIgNi4yIDE2LjQgNi4yIDIyLjYgMHM2LjItMTYuNCAwLTIyLjZsLTMzLjktMzMuOSA0NS4zLTQ1LjMgNTYuNiA1Ni42YzYuMiA2LjIgMTYuNCA2LjIgMjIuNiAwczYuMi0xNi40IDAtMjIuNmwtNTYuNi01Ni42IDQ1LjMtNDUuMyAzMy45IDMzLjljNi4yIDYuMiAxNi40IDYuMiAyMi42IDBzNi4yLTE2LjQgMC0yMi42bC0zMy45LTMzLjkgMzMuOS0zMy45YzYuMi02LjIgNi4yLTE2LjQgMC0yMi42cy0xNi40LTYuMi0yMi42IDBsLTMzLjkgMzMuOS00NS4zLTQ1LjMgNTYuNi01Ni42YzYuMi02LjIgNi4yLTE2LjQgMC0yMi42cy0xNi40LTYuMi0yMi42IDBsLTU2LjYgNTYuNi00NS4zLTQ1LjMgMzMuOS0zMy45YzYuMi02LjIgNi4yLTE2LjQgMC0yMi42ek0xNDIuOSAyNTZsNDUuMy00NS4zIDQ1LjMgNDUuMy00NS4zIDQ1LjMtNDUuMy00NS4zem02Ny45IDY3LjlsNDUuMy00NS4zIDQ1LjMgNDUuMy00NS4zIDQ1LjMtNDUuMy00NS4zek0yNzguNiAyNTZsNDUuMy00NS4zIDQ1LjMgNDUuMy00NS4zIDQ1LjMtNDUuMy00NS4zem0yMi42LTY3LjlsLTQ1LjMgNDUuMy00NS4zLTQ1LjMgNDUuMy00NS4zIDQ1LjMgNDUuM3oiXQogICAgfTsKICAgIGZhQ2hpbGQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2hpbGQiLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZjFhZSIsICJNOTYgNjRBNjQgNjQgMCAxIDEgMjI0IDY0IDY0IDY0IDAgMSAxIDk2IDY0em00OCAzMjBsMCA5NmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMkw4MCAyODcuOCA1OS4xIDMyMWMtOS40IDE1LTI5LjIgMTkuNC00NC4xIDEwUy00LjUgMzAxLjkgNC45IDI4N2wzOS45LTYzLjNDNjkuNyAxODQgMTEzLjIgMTYwIDE2MCAxNjBzOTAuMyAyNCAxMTUuMiA2My42TDMxNS4xIDI4N2M5LjQgMTUgNC45IDM0LjctMTAgNDQuMXMtMzQuNyA0LjktNDQuMS0xMEwyNDAgMjg3LjggMjQwIDQ4MGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTk2LTMyIDB6Il0KICAgIH07CiAgICBmYUljZUNyZWFtID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImljZS1jcmVhbSIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEyNzg0OF0sICJmODEwIiwgIk0zMzUuMSAxNjBjLjYtNS4zIC45LTEwLjYgLjktMTYgMC03OS41LTY0LjUtMTQ0LTE0NC0xNDRTNDggNjQuNSA0OCAxNDRjMCA1LjQgLjMgMTAuNyAuOSAxNmwtLjkgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhzMjEuNSA0OCA0OCA0OGwyODggMGMyNi41IDAgNDgtMjEuNSA0OC00OHMtMjEuNS00OC00OC00OGwtLjkgMHpNNjQgMzA0TDE2OS4yIDUyOS41YzQuMSA4LjggMTMgMTQuNSAyMi44IDE0LjVzMTguNi01LjcgMjIuOC0xNC41TDMyMCAzMDQgNjQgMzA0eiJdCiAgICB9OwogICAgZmFDb21wdXRlck1vdXNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvbXB1dGVyLW1vdXNlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4NDMzLCAibW91c2UiXSwgImY4Y2MiLCAiTTAgMTkybDE2OCAwIDAtMTkyLTggMEM3MS42IDAgMCA3MS42IDAgMTYwbDAgMzJ6bTAgNDhMMCAzNTJjMCA4OC40IDcxLjYgMTYwIDE2MCAxNjBsNjQgMGM4OC40IDAgMTYwLTcxLjYgMTYwLTE2MGwwLTExMi0zODQgMHptMzg0LTQ4bDAtMzJDMzg0IDcxLjYgMzEyLjQgMCAyMjQgMGwtOCAwIDAgMTkyIDE2OCAweiJdCiAgICB9OwogICAgZmFNb3VzZSA9IGZhQ29tcHV0ZXJNb3VzZTsKICAgIGZhRmF1Y2V0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhdWNldCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMDA1IiwgIk0xOTIgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmw5NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC05NiAwIDAgNjQgMTguNyAwYzguNSAwIDE2LjYgMy40IDIyLjYgOS40bDIyLjYgMjIuNiAzMiAwYzg4LjQgMCAxNjAgNzEuNiAxNjAgMTYwIDAgMTcuNy0xNC4zIDMyLTMyIDMybC02NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMtMTQuMy0zMi0zMi0zMmwtMzYuMSAwYy0yMC4yIDI5LTUzLjkgNDgtOTEuOSA0OHMtNzEuNy0xOS05MS45LTQ4TDMyIDM1MmMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC02NGMwLTE3LjcgMTQuMy0zMiAzMi0zMmw5NiAwIDIyLjYtMjIuNmM2LTYgMTQuMS05LjQgMjIuNi05LjRsMTguNyAwIDAtNjQtOTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJTNzguMyA2NCA5NiA2NGw5NiAweiJdCiAgICB9OwogICAgZmFBd2FyZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhd2FyZCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNTU5IiwgIk0yNDUuOS0yNS45Yy0xMy40LTguMi0zMC4zLTguMi00My43IDAtMjQuNCAxNC45LTM5LjUgMTguOS02OC4xIDE4LjMtMTUuNy0uNC0zMC4zIDguMS0zNy45IDIxLjktMTMuNyAyNS4xLTI0LjggMzYuMi00OS45IDQ5LjktMTMuOCA3LjUtMjIuMiAyMi4yLTIxLjkgMzcuOSAuNyAyOC42LTMuNCA0My43LTE4LjMgNjguMS04LjIgMTMuNC04LjIgMzAuMyAwIDQzLjcgMTQuOSAyNC40IDE4LjkgMzkuNSAxOC4zIDY4LjEtLjQgMTUuNyA4LjEgMzAuMyAyMS45IDM3LjkgMjIuMSAxMi4xIDMzLjMgMjIuMSA0NS4xIDQxLjVMNDIuNyA0NTguNWMtNS45IDExLjktMS4xIDI2LjMgMTAuNyAzMi4ybDg2IDQzYzExLjUgNS43IDI1LjUgMS40IDMxLjctOS44bDUyLjgtOTUuMSA1Mi44IDk1LjFjNi4yIDExLjIgMjAuMiAxNS42IDMxLjcgOS44bDg2LTQzYzExLjktNS45IDE2LjctMjAuMyAxMC43LTMyLjJsLTQ4LjYtOTcuMmMxMS43LTE5LjQgMjMtMjkuNCA0NS4xLTQxLjUgMTMuOC03LjUgMjIuMi0yMi4yIDIxLjktMzcuOS0uNy0yOC42IDMuNC00My43IDE4LjMtNjguMSA4LjItMTMuNCA4LjItMzAuMyAwLTQzLjctMTQuOS0yNC40LTE4LjktMzkuNS0xOC4zLTY4LjEgLjQtMTUuNy04LjEtMzAuMy0yMS45LTM3LjktMjUuMS0xMy43LTM2LjItMjQuOC00OS45LTQ5LjktNy41LTEzLjgtMjIuMi0yMi4yLTM3LjktMjEuOS0yOC42IC43LTQzLjctMy40LTY4LjEtMTguM3pNMjI0IDk2YTk2IDk2IDAgMSAxIDAgMTkyIDk2IDk2IDAgMSAxIDAtMTkyeiJdCiAgICB9OwogICAgZmFQZXJzb25Ecm93bmluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tZHJvd25pbmciLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU0NSIsICJNMjY0IDg4YTU2IDU2IDAgMSAxIDExMiAwIDU2IDU2IDAgMSAxIC0xMTIgMHpNMTMzLjkgNjUuNmMxNi44LTUuNiAzNC45IDMuNSA0MC41IDIwLjJsMTAuOSAzMi44YzkuNCAyOC4zIDMzLjIgNDkuNSA2Mi41IDU1LjYgNS42IDEuMiAxMS4zIDEuOCAxNy4xIDEuOGw4OCAwYzE3LjIgMCAzNC4zLTIuOCA1MC42LTguMmwxMTQuNC0zOC4xYzE2LjgtNS42IDM0LjkgMy41IDQwLjUgMjAuMnMtMy41IDM0LjktMjAuMiA0MC41TDQyMy43IDIyOC41Yy04LjQgMi44LTE3IDUuMS0yNS43IDYuOWwtMjYuNSA4OC4zYy02LjEgMy40LTEyLjEgNy4zLTE3LjkgMTEuNy0yMi4xIDE2LjYtMjkuMSAxNi42LTUxLjIgMC0yNi4yLTE5LjctNTYuOS0zMC4yLTg3LjgtMzEuM2wyMC4yLTY3LjJjLTUxLjUtMTAuNy05My41LTQ4LjEtMTEwLjItOThsLTEwLjktMzIuOGMtNS42LTE2LjggMy41LTM0LjkgMjAuMi00MC41ek00MDMuNCA0MTIuMUMzNzkuMSA0MzAuMyAzNTEuMSA0NDggMzIwIDQ0OHMtNTkuMS0xNy43LTgzLjQtMzUuOWMtMjEuMy0xNi4xLTQ5LjktMTYuMS03MS4yIDAtMjMuOCAxNy45LTU0LjEgMzUuNS04OC4xIDM1LjMtMjAuNC0uMS00MC43LTYuNy01OS44LTIxLjEtMTAuNi04LTEyLjctMjMtNC43LTMzLjZzMjMtMTIuNyAzMy42LTQuN2MxMS4zIDguNSAyMS42IDExLjQgMzEuMiAxMS41IDE3LjYgLjEgMzcuMy05LjQgNTguOS0yNS43IDM4LjQtMjkgOTAuNS0yOSAxMjkgMCAyNCAxOC4xIDQwLjcgMjYuMyA1NC41IDI2LjNzMzAuNS04LjIgNTQuNS0yNi4zYzM4LjQtMjkgOTAuNS0yOSAxMjkgMCAxNi45IDEyLjcgMzIuOSAyMS41IDQ3LjggMjQuNiAxMy43IDIuOCAyNy40IC45IDQyLjMtMTAuMyAxMC42LTggMjUuNi01LjkgMzMuNiA0LjdzNS45IDI1LjYtNC43IDMzLjZjLTI2LjQgMTkuOS01NC4yIDI0LjQtODAuNyAxOS4xLTI1LjMtNS4xLTQ4LjEtMTguOS02Ny4yLTMzLjMtMjEuMy0xNi4xLTQ5LjktMTYuMS03MS4yIDB6Il0KICAgIH07CiAgICBmYUNhbWVyYVJvdGF0ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYW1lcmEtcm90YXRlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUwZDgiLCAiTTEzOC43IDk2bDEwLjQtMzEuMkMxNTUuNiA0NS4yIDE3My45IDMyIDE5NC42IDMybDEyMi44IDBjMjAuNyAwIDM5IDEzLjIgNDUuNSAzMi44TDM3My4zIDk2IDQ0OCA5NmMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI1NmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTYwYzAtMzUuMyAyOC43LTY0IDY0LTY0bDc0LjcgMHpNOTYgMzA1LjljMCAzLjkgMS40IDcuNyA0IDEwLjZsNDggNTRjNi40IDcuMiAxNy42IDcuMiAyMy45IDBsNDgtNTRjMi42LTIuOSA0LTYuNyA0LTEwLjZsMC0xLjljMC04LjgtNy4yLTE2LTE2LTE2bC0yNCAwYzAtMzkuOCAzMi4yLTcyIDcyLTcyIDQuNCAwIDguNyAuNCAxMi45IDEuMmwzNC45LTM5LjNjLTE0LjYtNi40LTMwLjgtOS45LTQ3LjgtOS45LTY2LjMgMC0xMjAgNTMuNy0xMjAgMTIwbC0yNCAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAxLjl6bTE5Ni00Ni41Yy0yLjYgMi45LTQgNi43LTQgMTAuNmwwIDEuOWMwIDguOCA3LjIgMTYgMTYgMTZsMjQgMGMwIDM5LjgtMzIuMiA3Mi03MiA3Mi00LjQgMC04LjctLjQtMTIuOS0xLjJsLTM0LjkgMzkuM2MxNC43IDYuNCAzMC44IDkuOSA0Ny44IDkuOSA2Ni4zIDAgMTIwLTUzLjcgMTIwLTEyMGwyNCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTEuOWMwLTMuOS0xLjQtNy43LTQtMTAuNmwtNDgtNTRjLTYuNC03LjItMTcuNi03LjItMjMuOSAwbC00OCA1NHoiXQogICAgfTsKICAgIGZhRmFjZUdyaW5IZWFydHMyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi1oZWFydHMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MjUsICJncmluLWhlYXJ0cyJdLCAiZjU4NCIsICJNMjU2IDUxMmMxNDEuNCAwIDI1Ni0xMTQuNiAyNTYtMjU2IDAtMjMuMy0zLjEtNDUuOS04LjktNjcuMyA1LjUtMTMuNSA4LjktMjguNCA4LjktNDQuNyAwLTUzLTQzLTk2LTk2LTk2bC0yLjkgMGMtMi41IDAtNSAuMS03LjQgLjMtNDIuMS0zMC40LTkzLjgtNDguMy0xNDkuNy00OC4zUzE0OC40IDE3LjkgMTA2LjMgNDguM2MtMi41LS4yLTQuOS0uMy03LjQtLjNMOTYgNDhjLTUzIDAtOTYgNDMtOTYgOTYgMCAxNi4zIDMuNSAzMS4yIDguOSA0NC43LTUuOCAyMS40LTguOSA0NC04LjkgNjcuMyAwIDE0MS40IDExNC42IDI1NiAyNTYgMjU2ek0zODYuNyAzMjQuOWMxMS45LTMuNyAyMy45IDYuMyAxOS42IDE4LjEtMjIuNCA2MS4zLTgxLjMgMTA1LjEtMTUwLjMgMTA1LjFTMTI4LjEgNDA0LjIgMTA1LjcgMzQyLjljLTQuMy0xMS44IDcuNy0yMS44IDE5LjYtMTguMSAzOS4yIDEyLjIgODMuNyAxOS4xIDEzMC43IDE5LjFzOTEuNS02LjkgMTMwLjctMTkuMXpNMzIyLjkgOTZjMTMuNSAwIDI2LjUgNS40IDM2IDE0LjlsOS4xIDkuMSA5LjEtOS4xYzkuNS05LjUgMjIuNS0xNC45IDM2LTE0LjlsMi45IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDggMCA1My40LTY2LjkgOTUuNy04OSAxMDguMi00LjQgMi41LTkuNiAyLjUtMTQgMC0yMi4xLTEyLjUtODktNTQuOC04OS0xMDguMiAwLTI2LjUgMjEuNS00OCA0OC00OGwyLjkgMHptLTE4OCAxNC45bDkuMSA5LjEgOS4xLTkuMWM5LjUtOS41IDIyLjUtMTQuOSAzNi0xNC45bDIuOSAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4IDAgNTMuNC02Ni45IDk1LjctODkgMTA4LjItNC40IDIuNS05LjYgMi41LTE0IDAtMjIuMS0xMi41LTg5LTU0LjgtODktMTA4LjIgMC0yNi41IDIxLjUtNDggNDgtNDhsMi45IDBjMTMuNSAwIDI2LjUgNS40IDM2IDE0Ljl6Il0KICAgIH07CiAgICBmYUdyaW5IZWFydHMyID0gZmFGYWNlR3JpbkhlYXJ0czI7CiAgICBmYUZpbGVGcmFnbWVudCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLWZyYWdtZW50IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImU2OTciLCAiTTY0IDBDMjguNyAwIDAgMjguNyAwIDY0bDAgMjQwIDEyOCAwYzQ0LjIgMCA4MCAzNS44IDgwIDgwbDAgMTI4IDExMiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjc3LjVjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNMMjU4LjcgMTguN0MyNDYuNyA2LjcgMjMwLjUgMCAyMTMuNSAwTDY0IDB6TTMyNS41IDE3NkwyMzIgMTc2Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNEwyMDggNTguNSAzMjUuNSAxNzZ6TTMyIDM1MmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA5NmMwIDE3LjcgMTQuMyAzMiAzMiAzMmw5NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtOTZjMC0xNy43LTE0LjMtMzItMzItMzJsLTk2IDB6Il0KICAgIH07CiAgICBmYVBlcnNvbk1pbGl0YXJ5UmlmbGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLW1pbGl0YXJ5LXJpZmxlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU1NGIiLCAiTTEyOCAzOWMwLTEzIDEwLTIzLjggMjIuOS0yNC45TDMwMi43IDEuNEMzMTIgLjcgMzIwIDggMzIwIDE3LjRMMzIwIDQ4YzAgOC44LTcuMiAxNi0xNiAxNkwxNTMgNjRjLTEzLjggMC0yNS0xMS4yLTI1LTI1em0xNy42IDU3bDE1Ni44IDBjMSA1LjIgMS42IDEwLjUgMS42IDE2IDAgNDQuMi0zNS44IDgwLTgwIDgwcy04MC0zNS44LTgwLTgwYzAtNS41IC42LTEwLjggMS42LTE2em0yMjggMzY0LjNMMzIwIDM2OS43IDMyMCA0ODBjMCAxLjMtLjEgMi41LS4yIDMuOEwxNDUuNSAyMzQuOWMxNi42LTcuMSAzNC42LTEwLjkgNTMuMy0xMC45bDUwLjQgMGMxNS45IDAgMzEuMyAyLjggNDUuOCA3LjlMMzg5LjkgNjcuN2MtNy43LTQuNC0xMC4zLTE0LjItNS45LTIxLjlzMTQuMi0xMC4zIDIxLjktNS45bDI3LjcgMTZjNy43IDQuNCAxMC4zIDE0LjIgNS45IDIxLjlsLTU1LjUgOTYuMSAxLjYgLjljMTUuMyA4LjggMjAuNiAyOC40IDExLjcgNDMuN0wzNjAuNyAyODJjMiAyLjggMy45IDUuOCA1LjcgOC44bDc2LjEgMTI4LjhjMTEuMiAxOSA0LjkgNDMuNS0xNC4xIDU0LjhzLTQzLjUgNC45LTU0LjgtMTQuMXpNMjg4IDUxMmwtMTI4IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTEwLjMtNTMuNiA5MC42Yy0xMS4yIDE5LTM1LjggMjUuMy01NC44IDE0LjFTLTUuNyA0MzguNyA1LjYgNDE5LjdMODEuNyAyOTAuOGM5LjQtMTUuOCAyMS43LTI5LjMgMzYtNDBMMjk5LjEgNTEwYy0zLjUgMS4zLTcuMiAyLTExLjEgMnpNMjY0IDMyMGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6Il0KICAgIH07CiAgICBmYVRvZ2dsZU9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRvZ2dsZS1vbiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMjA1IiwgIk0xOTIgNjRDODYgNjQgMCAxNTAgMCAyNTZTODYgNDQ4IDE5MiA0NDhsMTkyIDBjMTA2IDAgMTkyLTg2IDE5Mi0xOTJTNDkwIDY0IDM4NCA2NEwxOTIgNjR6bTE5MiA5NmE5NiA5NiAwIDEgMSAwIDE5MiA5NiA5NiAwIDEgMSAwLTE5MnoiXQogICAgfTsKICAgIGZhTHVuZ3NWaXJ1cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsdW5ncy12aXJ1cyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlMDY3IiwgIk0yODggMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAxNTEuM2M5LjYtNC44IDIwLjUtNy41IDMyLTcuNXMyMi40IDIuNyAzMiA3LjVMMzIwIDMyYzAtMTcuNy0xNC4zLTMyLTMyLTMyek00NTAuMSA0NTFjOCAxOC4zIDguMSAzOS4yIC4yIDU3LjUgMTAuMiAyLjMgMjAuNiAzLjUgMzEuMiAzLjUgNTIuMiAwIDk0LjUtNDIuMyA5NC41LTk0LjVsMC02LjJjMC0xMTEuMS0zNi43LTIxOS0xMDQuNC0zMDdMNDI4LjkgNDguN2MtOC4xLTEwLjYtMjAuNy0xNi43LTM0LTE2LjctMjMuNyAwLTQyLjkgMTkuMi00Mi45IDQyLjlsMCAxMzkuOWMxLjIgMi4yIDIuMiA0LjYgMy4xIDYuOSAyNi40LTExLjYgNTguMy02LjYgNzkuOSAxNXMyNi42IDUzLjYgMTUgNzkuOUM0NzcgMzI3LjIgNDk2IDM1My4zIDQ5NiAzODMuOHMtMTkgNTYuNy00NS45IDY3LjF6TTIyMC45IDIyMS44Yy45LTIuNCAyLTQuNyAzLjEtNi45bDAtMTM4LjVjMC0yNC41LTE5LjktNDQuNC00NC40LTQ0LjQtMTIuNSAwLTI0LjQgNS4zLTMyLjggMTQuNWwtMjYuNCAyOUM0Mi45IDE2MC44IDAgMjcxLjggMCAzODdsMCAzMC41YzAgNTIuMiA0Mi4zIDk0LjUgOTQuNSA5NC41IDEwLjUgMCAyMS0xLjIgMzEuMi0zLjUtNy45LTE4LjMtNy44LTM5LjMgLjItNTcuNS0yNi45LTEwLjQtNDUuOS0zNi42LTQ1LjktNjcuMXMxOS01Ni43IDQ1LjktNjcuMWMtMTEuNi0yNi40LTYuNi01OC4zIDE1LTc5LjlzNTMuNi0yNi42IDc5LjktMTV6TTE1MiA0MDhjMjguOCAwIDQzLjIgMzQuOCAyMi45IDU1LjItOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwYzIwLjQtMjAuNCA1NS4yLTUuOSA1NS4yIDIyLjkgMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGMwLTI4LjggMzQuOC00My4yIDU1LjItMjIuOSA5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjljLTIwLjQtMjAuNC01LjktNTUuMiAyMi45LTU1LjIgMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRjLTI4LjggMC00My4yLTM0LjgtMjIuOS01NS4yIDkuNC05LjQgOS40LTI0LjYgMC0zMy45cy0yNC42LTkuNC0zMy45IDBjLTIwLjQgMjAuNC01NS4yIDUuOS01NS4yLTIyLjkgMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRjMCAyOC44LTM0LjggNDMuMi01NS4yIDIyLjktOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWMyMC40IDIwLjQgNS45IDU1LjItMjIuOSA1NS4yLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjR6bTEwNC04MGEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6bTQwIDg4YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6Il0KICAgIH07CiAgICBmYVRhYmxlVGVubmlzUGFkZGxlQmFsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWJsZS10ZW5uaXMtcGFkZGxlLWJhbGwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjc5NTUsICJwaW5nLXBvbmctcGFkZGxlLWJhbGwiLCAidGFibGUtdGVubmlzIl0sICJmNDVkIiwgIk05NyAxMjdsNjcuNC02Ny40YzM4LjItMzguMiA5MC01OS42IDE0NC01OS42IDExMi41IDAgMjAzLjcgOTEuMiAyMDMuNyAyMDMuNiAwIDQ2LjQtMTUuOCA5MS4xLTQ0LjUgMTI3LTIzLjYtMTYuOC01Mi40LTI2LjctODMuNS0yNi43LTMxLjEgMC01OS45IDkuOS04My40IDI2LjZMOTcgMTI3ek0yNDAgNDQ4YzAgOS43IDEgMTkuMSAyLjggMjguMi0xOS44LTUuMi0zOC0xNS41LTUyLjctMzAuMi0xMi4yLTEyLjItMzEuOS0xMi4yLTQ0LjEgMEw5Ni42IDQ5NS40Yy0xMC42IDEwLjYtMjUgMTYuNi00MCAxNi42LTMxLjIgMC01Ni42LTI1LjMtNTYuNi01Ni42IDAtMTUgNi0yOS40IDE2LjYtNDBsNDkuNC00OS40YzEyLjItMTIuMiAxMi4yLTMxLjkgMC00NC4xLTIxLjctMjEuNy0zMy45LTUxLjItMzMuOS04MS45IDAtMjkuNCAxMS4xLTU3LjYgMzEuMS03OUwyNjYuNiAzNjQuNkMyNDkuOSAzODguMSAyNDAgNDE2LjkgMjQwIDQ0OHptMTQ0LTk2YTk2IDk2IDAgMSAxIDAgMTkyIDk2IDk2IDAgMSAxIDAtMTkyeiJdCiAgICB9OwogICAgZmFQaW5nUG9uZ1BhZGRsZUJhbGwgPSBmYVRhYmxlVGVubmlzUGFkZGxlQmFsbDsKICAgIGZhVGFibGVUZW5uaXMgPSBmYVRhYmxlVGVubmlzUGFkZGxlQmFsbDsKICAgIGZhQm94ZXNQYWNraW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJveGVzLXBhY2tpbmciLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRjNyIsICJNMjA4IDBsODAgMCAwIDU2YzAgMTMuMyAxMC43IDI0IDI0IDI0bDgwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC01NiA4MCAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgNDE2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xMDguOCAwYzguMi0xNC4xIDEyLjgtMzAuNSAxMi44LTQ4bDAtMTYwYzEwLTEzLjQgMTYtMzAgMTYtNDhsMC0zMmMwLTQ0LjItMzUuOC04MC04MC04MGwtMTc2IDAgMC05NmMwLTI2LjUgMjEuNS00OCA0OC00OHpNMzIgMzM2bDMyMCAwIDAgMTI4YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDgwIDUxMmMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC0xMjh6TTQ4IDE5MmwyODggMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDMyYzAgMTcuNy0xNC4zIDMyLTMyIDMyTDQ4IDI4OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnoiXQogICAgfTsKICAgIGZhUGVyc29uQ2hhbGtib2FyZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tY2hhbGtib2FyZCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTNkIiwgIk0xOTIgODBhNTYgNTYgMCAxIDAgMC0xMTIgNTYgNTYgMCAxIDAgMCAxMTJ6TTE3NiA1MTJsMC0xNjBjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDE2MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzM2IDEyOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0xNiAwIDAtNDggMTkyIDAgMCAxOTItMTkyIDAgMC0zMi02NCAwIDAgNDhjMCAyNi41IDIxLjUgNDggNDggNDhsMjI0IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0yMjRjMC0yNi41LTIxLjUtNDgtNDgtNDhMMzY4IDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgNjQtMTIyLjcgMGMtNDUuNiAwLTg4LjUgMjEuNi0xMTUuNiA1OC4yTDE0LjMgMjYwLjljLTEwLjUgMTQuMi03LjYgMzQuMiA2LjYgNDQuOHMzNC4yIDcuNiA0NC44LTYuNkwxMTIgMjM2LjcgMTEyIDUxMmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMyeiJdCiAgICB9OwogICAgZmFEaWNlVHdvID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRpY2UtdHdvIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbOTg1N10sICJmNTI4IiwgIk0wIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NnpNMzUyIDM1MmEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwek0xMjggMTkyYTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHoiXQogICAgfTsKICAgIGZhQXJyb3dSaWdodEFycm93TGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy1yaWdodC1hcnJvdy1sZWZ0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbODY0NCwgImV4Y2hhbmdlIl0sICJmMGVjIiwgIk01MDIuNiAxNTAuNmwtOTYgOTZjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwcy0xMi41LTMyLjggMC00NS4zTDQwMi43IDE2MCAzMiAxNjBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyUzE0LjMgOTYgMzIgOTZsMzcwLjcgMC00MS40LTQxLjRjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zczMyLjgtMTIuNSA0NS4zIDBsOTYgOTZjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjN6bS0zOTcuMyAzNTJsLTk2LTk2Yy0xMi41LTEyLjUtMTIuNS0zMi44IDAtNDUuM2w5Ni05NmMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zTDEwOS4zIDM1MiA0ODAgMzUyYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0zNzAuNyAwIDQxLjQgNDEuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMHoiXQogICAgfTsKICAgIGZhRXhjaGFuZ2UgPSBmYUFycm93UmlnaHRBcnJvd0xlZnQ7CiAgICBmYUZvb3RiYWxsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZvb3RiYWxsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3OTQ0LCAiZm9vdGJhbGwtYmFsbCJdLCAiZjQ0ZSIsICJNMjYxLjEgMjIuNmMtODkgMTgtMTUwLjUgNjMuNC0xOTAgMTIzLjktMjMuMyAzNS42LTM4LjEgNzUuMy00Ni43IDExNS41TDI1MS45IDQ4OS40Yzg5LTE4IDE1MC41LTYzLjQgMTkwLjEtMTIzLjkgMjMuMy0zNS42IDM4LjEtNzUuMyA0Ni43LTExNS41TDI2MS4xIDIyLjZ6bTIzNiAxNjguMWMzLjItNDIuMyAuNy04My4zLTQuOC0xMTguNy00LjQtMjcuOC0yNi44LTQ4LTUzLjEtNTEuNi00My01LjktODIuMi03LjUtMTE3LjgtNS40TDQ5Ny4xIDE5MC42ek0xOTEuNyA0OTcuMUwxNS45IDMyMS40Yy0zLjIgNDIuMy0uNyA4My4zIDQuOCAxMTguNyA0LjQgMjcuOCAyNi44IDQ4IDUzLjEgNTEuNiA0MyA1LjkgODIuMiA3LjUgMTE3LjggNS40ek0yNzEuNSAxNDNjOS40LTkuNCAyNC42LTkuNCAzMy45IDBsNjQgNjRjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtNjQtNjRjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45em0tNjQgNjRjOS40LTkuNCAyNC42LTkuNCAzMy45IDBsNjQgNjRjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtNjQtNjRjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45em0tNjQgNjRjOS40LTkuNCAyNC42LTkuNCAzMy45IDBsNjQgNjRjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMGwtNjQtNjRjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45eiJdCiAgICB9OwogICAgZmFGb290YmFsbEJhbGwgPSBmYUZvb3RiYWxsOwogICAgZmFUcnVja01vbnN0ZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHJ1Y2stbW9uc3RlciIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNjNiIiwgIk0zMzYgOTZsNDggNjQtMTI4IDAgMC02NCA4MCAwem0xMjggNjRMMzg3LjIgNTcuNkMzNzUuMSA0MS41IDM1Ni4xIDMyIDMzNiAzMkwyMjQgMzJjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgOTYtMTQ0IDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgNjRjMCAxOC4xIDEwLjEgMzMuOSAyNC45IDQyLjEtLjUgNS43IDEuMSAxMS42IDQuNyAxNi40LTMuNyA2LjktNi44IDE0LjEtOSAyMS44LTExLjYgMS43LTIwLjYgMTEuNy0yMC42IDIzLjhsMCAxNmMwIDEyLjEgOC45IDIyLjEgMjAuNiAyMy44IDIuMiA3LjYgNS4zIDE0LjkgOSAyMS44LTcgOS40LTYuMyAyMi44IDIuMyAzMS4zbDExLjMgMTEuM2M4LjYgOC42IDIxLjkgOS4zIDMxLjMgMi4yIDYuOCAzLjcgMTQuMSA2LjggMjEuNyA5IDEuNyAxMS42IDExLjcgMjAuNiAyMy44IDIwLjZsMTYgMGMxMi4xIDAgMjIuMS04LjkgMjMuOC0yMC42IDcuNi0yLjIgMTQuOS01LjMgMjEuNy05IDkuNCA3IDIyLjggNi4zIDMxLjMtMi4ybDExLjMtMTEuM2M4LjYtOC42IDkuMy0yMS45IDIuMy0zMS4zIDMuNy02LjggNi44LTE0LjEgOS0yMS43IDExLjYtMS43IDIwLjYtMTEuNyAyMC42LTIzLjhsMC0xNmMwLTEyLjEtOC45LTIyLjEtMjAuNi0yMy44LTIuMi03LjYtNS4zLTE0LjktOS0yMS43IDIuNC0zLjIgMy45LTYuOCA0LjUtMTAuNWwxMTQuMiAwYy42IDMuNyAyLjEgNy4zIDQuNSAxMC41LTMuNyA2LjktNi44IDE0LjEtOSAyMS44LTExLjYgMS43LTIwLjYgMTEuNy0yMC42IDIzLjhsMCAxNmMwIDEyLjEgOC45IDIyLjEgMjAuNiAyMy44IDIuMiA3LjYgNS4zIDE0LjkgOSAyMS44LTcgOS40LTYuMyAyMi44IDIuMiAzMS4zbDExLjMgMTEuM2M4LjUgOC42IDIxLjkgOS4zIDMxLjMgMi4yIDYuOCAzLjcgMTQuMSA2LjggMjEuNyA5IDEuNyAxMS42IDExLjcgMjAuNiAyMy44IDIwLjZsMTYgMGMxMi4xIDAgMjIuMS04LjkgMjMuOC0yMC42IDcuNi0yLjIgMTQuOS01LjMgMjEuOC05IDkuNCA3IDIyLjggNi4zIDMxLjMtMi4ybDExLjMtMTEuM2M4LjYtOC42IDkuMy0yMS45IDIuMi0zMS4zIDMuNy02LjggNi44LTE0LjEgOS0yMS43IDExLjYtMS43IDIwLjYtMTEuNyAyMC42LTIzLjhsMC0xNmMwLTEyLjEtOC45LTIyLjEtMjAuNi0yMy44LTIuMi03LjYtNS4zLTE0LjktOS0yMS43IDMuNi00LjggNS4yLTEwLjcgNC43LTE2LjQgMTQuOC04LjIgMjQuOS0yMy45IDI0LjktNDIuMWwwLTY0YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC02NCAwek0xMjggMzM2YTQ4IDQ4IDAgMSAxIDAgOTYgNDggNDggMCAxIDEgMC05NnptMjcyIDQ4YTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6Il0KICAgIH07CiAgICBmYUFzdGVyaXNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFzdGVyaXNrIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTAwMzMsIDYxNTQ1XSwgIjJhIiwgIk0yMjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDE2OC42IDE0NC04My4xYzE1LjMtOC44IDM0LjktMy42IDQzLjcgMTEuN3MzLjYgMzQuOS0xMS43IDQzLjdMMjg4IDI1NiA0MzIgMzM5LjFjMTUuMyA4LjggMjAuNiAyOC40IDExLjcgNDMuN3MtMjguNCAyMC42LTQzLjcgMTEuN0wyNTYgMzExLjQgMjU2IDQ4MGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTE2OC42LTE0NCA4My4xYy0xNS4zIDguOC0zNC45IDMuNi00My43LTExLjdTLjcgMzQ4IDE2IDMzOS4xTDE2MCAyNTYgMTYgMTcyLjlDLjcgMTY0LTQuNSAxNDQuNSA0LjMgMTI5LjFTMzIuNyAxMDguNiA0OCAxMTcuNEwxOTIgMjAwLjYgMTkyIDMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyeiJdCiAgICB9OwogICAgZmFCYXR0ZXJ5RnVsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYXR0ZXJ5LWZ1bGwiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjgyNjcsICJiYXR0ZXJ5IiwgImJhdHRlcnktNSJdLCAiZjI0MCIsICJNNTI4IDEyOGM4LjggMCAxNiA3LjIgMTYgMTZsMCAyMjRjMCA4LjgtNy4yIDE2LTE2IDE2bC00MTYgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMjI0YzAtOC44IDcuMi0xNiAxNi0xNmw0MTYgMHpNMTEyIDY0Yy00NC4yIDAtODAgMzUuOC04MCA4MGwwIDIyNGMwIDQ0LjIgMzUuOCA4MCA4MCA4MGw0MTYgMGM0NC4yIDAgODAtMzUuOCA4MC04MGwwLTQ4YzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNjRjMC0xNy43LTE0LjMtMzItMzItMzJsMC00OGMwLTQ0LjItMzUuOC04MC04MC04MEwxMTIgNjR6bTU2IDExMmMtMTMuMyAwLTI0IDEwLjctMjQgMjRsMCAxMTJjMCAxMy4zIDEwLjcgMjQgMjQgMjRsMzA0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC0xMTJjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTMwNCAweiJdCiAgICB9OwogICAgZmFCYXR0ZXJ5ID0gZmFCYXR0ZXJ5RnVsbDsKICAgIGZhQmF0dGVyeTUgPSBmYUJhdHRlcnlGdWxsOwogICAgZmFDaGlsZERyZXNzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoaWxkLWRyZXNzIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbXSwgImU1OWMiLCAiTTIyNCA2NEE2NCA2NCAwIDEgMCA5NiA2NCA2NCA2NCAwIDEgMCAyMjQgNjR6TTg4IDQwMGwwIDgwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC04MCAxNiAwIDAgODBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTgwIDE3LjggMGMxMC45IDAgMTguNi0xMC43IDE1LjItMjEuMWwtMzEuMS05My40IDI4LjcgMzcuOGMxMC43IDE0LjEgMzAuOCAxNi44IDQ0LjggNi4yczE2LjgtMzAuNyA2LjItNDQuOEwyNTQuNiAyMDdjLTIyLjQtMjkuNi01Ny41LTQ3LTk0LjYtNDdzLTcyLjIgMTcuNC05NC42IDQ3TDYuNSAyODQuN2MtMTAuNyAxNC4xLTcuOSAzNC4yIDYuMiA0NC44czM0LjIgNy45IDQ0LjgtNi4yTDg2LjIgMjg1LjUgNTUgMzc4LjlDNTEuNiAzODkuMyA1OS4zIDQwMCA3MC4yIDQwMEw4OCA0MDB6Il0KICAgIH07CiAgICBmYUZhY2VLaXNzQmVhbTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1raXNzLWJlYW0iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg1MzcsICJraXNzLWJlYW0iXSwgImY1OTciLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0yNDAgMjg4bDMyIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDggMCAxMi4zLTQuNiAyMy41LTEyLjIgMzIgNy42IDguNSAxMi4yIDE5LjcgMTIuMiAzMiAwIDI2LjUtMjEuNSA0OC00OCA0OGwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNmwxNiAwYzguOCAwIDE2LTcuMiAxNi0xNnMtNy4yLTE2LTE2LTE2bC0xNiAwYy04LjggMC0xNi03LjItMTYtMTZzNy4yLTE2IDE2LTE2bDE2IDBjOC44IDAgMTYtNy4yIDE2LTE2cy03LjItMTYtMTYtMTZsLTE2IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZ6TTE3NiAxODBjLTE1LjUgMC0yOCAxMi41LTI4IDI4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMzcuNiAzMC40LTY4IDY4LTY4czY4IDMwLjQgNjggNjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0xNS41LTEyLjUtMjgtMjgtMjh6bTEzMiAyOGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTM3LjYgMzAuNC02OCA2OC02OHM2OCAzMC40IDY4IDY4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMTUuNS0xMi41LTI4LTI4LTI4cy0yOCAxMi41LTI4IDI4eiJdCiAgICB9OwogICAgZmFLaXNzQmVhbTIgPSBmYUZhY2VLaXNzQmVhbTI7CiAgICBmYVRyYXNoQ2FuQXJyb3dVcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cmFzaC1jYW4tYXJyb3ctdXAiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsidHJhc2gtcmVzdG9yZS1hbHQiXSwgImY4MmEiLCAiTTE2Ny4xLTE2bDExMy45IDBjMTMuOCAwIDI2IDguOCAzMC40IDIxLjlMMzIwIDMyIDQxNiAzMmMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA5NkMxNC4zIDk2IDAgODEuNyAwIDY0UzE0LjMgMzIgMzIgMzJsOTYgMCA4LjctMjYuMUMxNDEuMS03LjIgMTUzLjMtMTYgMTY3LjEtMTZ6TTMyIDE0NGwzODQgMCAwIDMwNGMwIDM1LjMtMjguNyA2NC02NCA2NEw5NiA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMzA0em0yMDkgNzljLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwbC03MiA3MmMtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDMxLTMxIDAgMTAyLjFjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTEwMi4xIDMxIDMxYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNzItNzJ6Il0KICAgIH07CiAgICBmYVRyYXNoUmVzdG9yZUFsdCA9IGZhVHJhc2hDYW5BcnJvd1VwOwogICAgZmFGb250ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZvbnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjAzMSIsICJNMjg1LjEgNTAuN0MyNzkuOSAzOS4zIDI2OC41IDMyIDI1NiAzMnMtMjMuOSA3LjMtMjkuMSAxOC43TDU5LjUgNDE2IDQ4IDQxNmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmw4OCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC02LjEgMCAyMi00OCAyMDguMyAwIDIyIDQ4LTYuMSAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDg4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTExLjUgMC0xNjcuNC0zNjUuM3pNMzMwLjggMzA0TDE4MS4yIDMwNCAyNTYgMTQwLjggMzMwLjggMzA0eiJdCiAgICB9OwogICAgZmFCb3JlSG9sZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib3JlLWhvbGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTRjMyIsICJNMjU2IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgMjMyLjZjLTE5LjEgMTEuMS0zMiAzMS43LTMyIDU1LjQgMCAzNS4zIDI4LjcgNjQgNjQgNjRzNjQtMjguNyA2NC02NGMwLTIzLjctMTIuOS00NC40LTMyLTU1LjRMMjg4IDMyYzAtMTcuNy0xNC4zLTMyLTMyLTMyek0wIDM4NGwwIDY0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjcyYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC00OCAwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDE0NGMwIDYxLjktNTAuMSAxMTItMTEyIDExMlMxNDQgMzgxLjkgMTQ0IDMyMGwwLTE0NGMwLTI2LjUtMjEuNS00OC00OC00OGwtNDggMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhMMCAzODR6Il0KICAgIH07CiAgICBmYVZpcnVzQ292aWQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidmlydXMtY292aWQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTRhOCIsICJNMTkyIDI0YzAtMTMuMyAxMC43LTI0IDI0LTI0bDgwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE2IDAgMCAzMy42YzMwLjcgNC4yIDU4LjggMTYuMyA4Mi4zIDM0LjFMMzg2LjEgOTIgMzc0LjggODAuNmMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDU2LjYgNTYuNmM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwbC0xMS4zLTExLjMtMjMuOCAyMy44YzE3LjkgMjMuNSAyOS45IDUxLjcgMzQuMSA4Mi4zbDMzLjYgMCAwLTE2YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA4MGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTE2LTMzLjYgMGMtNC4yIDMwLjctMTYuMyA1OC44LTM0LjEgODIuM2wyMy44IDIzLjggMTEuMy0xMS4zYzkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOWwtNTYuNiA1Ni42Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45bDExLjMtMTEuMy0yMy44LTIzLjhjLTIzLjUgMTcuOS01MS43IDI5LjktODIuMyAzNC4xbDAgMzMuNiAxNiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC04MCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDE2IDAgMC0zMy42Yy0zMC43LTQuMi01OC44LTE2LjMtODIuMy0zNC4xbC0yMy44IDIzLjggMTEuMyAxMS4zYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBMNDYuNyA0MDguN2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDExLjMgMTEuMyAyMy44LTIzLjhDOTcuOSAzMzguOCA4NS44IDMxMC43IDgxLjYgMjgwbC0zMy42IDAgMCAxNmMwIDEzLjMtMTAuNyAyNC0yNCAyNFMwIDMwOS4zIDAgMjk2bDAtODBjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDE2IDMzLjYgMGM0LjItMzAuNyAxNi4zLTU4LjggMzQuMS04Mi4zTDkyIDEyNS45IDgwLjYgMTM3LjJjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsNTYuNi01Ni42YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOUwxMjUuOSA5MiAxNDkuNyAxMTUuN2MyMy41LTE3LjkgNTEuNy0yOS45IDgyLjMtMzQuMWwwLTMzLjYtMTYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjR6bTMyIDIwMGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem05NiA5NmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6Il0KICAgIH07CiAgICBmYUZpbGVQZGYyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbGUtcGRmIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYxYzEiLCAiTTk2IDBDNjAuNyAwIDMyIDI4LjcgMzIgNjRsMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsODAgMCAwLTExMmMwLTM1LjMgMjguNy02NCA2NC02NGwxNzYgMCAwLTE2NS41YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI5MC43IDE4LjdDMjc4LjcgNi43IDI2Mi41IDAgMjQ1LjUgMEw5NiAwek0zNTcuNSAxNzZMMjY0IDE3NmMtMTMuMyAwLTI0LTEwLjctMjQtMjRMMjQwIDU4LjUgMzU3LjUgMTc2ek0yNDAgMzgwYy0xMSAwLTIwIDktMjAgMjBsMCAxMjhjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC0yOCAxMiAwYzMzLjEgMCA2MC0yNi45IDYwLTYwcy0yNi45LTYwLTYwLTYwbC0zMiAwem0zMiA4MGwtMTIgMCAwLTQwIDEyIDBjMTEgMCAyMCA5IDIwIDIwcy05IDIwLTIwIDIwem05Ni04MGMtMTEgMC0yMCA5LTIwIDIwbDAgMTI4YzAgMTEgOSAyMCAyMCAyMGwzMiAwYzI4LjcgMCA1Mi0yMy4zIDUyLTUybDAtNjRjMC0yOC43LTIzLjMtNTItNTItNTJsLTMyIDB6bTIwIDEyOGwwLTg4IDEyIDBjNi42IDAgMTIgNS40IDEyIDEybDAgNjRjMCA2LjYtNS40IDEyLTEyIDEybC0xMiAwem04OC0xMDhsMCAxMjhjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC00NCAyOCAwYzExIDAgMjAtOSAyMC0yMHMtOS0yMC0yMC0yMGwtMjggMCAwLTI0IDI4IDBjMTEgMCAyMC05IDIwLTIwcy05LTIwLTIwLTIwbC00OCAwYy0xMSAwLTIwIDktMjAgMjB6Il0KICAgIH07CiAgICBmYUxhbmd1YWdlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxhbmd1YWdlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYxYWIiLCAiTTE2MCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzIgMTI4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTkuNiAwLTguNCAyMy4xYy0xNi40IDQ1LjItNDEuMSA4Ni41LTcyLjIgMTIyIDE0LjIgOC44IDI5IDE2LjYgNDQuNCAyMy41bDUwLjQgMjIuNCA2Mi4yLTE0MGM1LjEtMTEuNiAxNi42LTE5IDI5LjItMTlzMjQuMSA3LjQgMjkuMiAxOWwxMjggMjg4YzcuMiAxNi4yLS4xIDM1LjEtMTYuMiA0Mi4ycy0zNS4xLS4xLTQyLjItMTYuMmwtMjAtNDUtMTU3LjUgMC0yMCA0NWMtNy4yIDE2LjItMjYuMSAyMy40LTQyLjIgMTYuMnMtMjMuNC0yNi4xLTE2LjItNDIuMmwzOS44LTg5LjUtNTAuNC0yMi40Yy0yMy0xMC4yLTQ1LTIyLjQtNjUuOC0zNi40LTIxLjMgMTcuMi00NC42IDMyLjItNjkuNSA0NC43TDc4LjMgMzgwLjZjLTE1LjggNy45LTM1IDEuNS00Mi45LTE0LjNzLTEuNS0zNSAxNC4zLTQyLjlsMzQuNS0xNy4zYzE2LjMtOC4yIDMxLjgtMTcuNyA0Ni40LTI4LjMtMTMuOC0xMi43LTI2LjgtMjYuNC0zOC45LTQwLjlMODEuNiAyMjQuN2MtMTEuMy0xMy42LTkuNS0zMy44IDQuMS00NS4xczMzLjgtOS41IDQ1LjEgNC4xbDEwLjIgMTIuMmMxMS41IDEzLjkgMjQuMSAyNi44IDM3LjQgMzguNyAyNy41LTMwLjQgNDkuMi02Ni4xIDYzLjUtMTA1LjRsLjUtMS4yLTIxMC4zIDBDMTQuMyAxMjggMCAxMTMuNyAwIDk2UzE0LjMgNjQgMzIgNjRsOTYgMCAwLTMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyek00MTYgMjcwLjhMMzY1LjcgMzg0IDQ2Ni4zIDM4NCA0MTYgMjcwLjh6Il0KICAgIH07CiAgICBmYVNoaWVsZEhhbHZlZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaGllbGQtaGFsdmVkIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNoaWVsZC1hbHQiXSwgImYzZWQiLCAiTTI1NiAwYzQuNiAwIDkuMiAxIDEzLjQgMi45TDQ1Ny44IDgyLjhjMjIgOS4zIDM4LjQgMzEgMzguMyA1Ny4yLS41IDk5LjItNDEuMyAyODAuNy0yMTMuNiAzNjMuMi0xNi43IDgtMzYuMSA4LTUyLjggMC0xNzIuNC04Mi41LTIxMy4xLTI2NC0yMTMuNi0zNjMuMi0uMS0yNi4yIDE2LjMtNDcuOSAzOC4zLTU3LjJMMjQyLjcgMi45QzI0Ni45IDEgMjUxLjQgMCAyNTYgMHptMCA2Ni44bDAgMzc4LjFjMTM4LTY2LjggMTc1LjEtMjE0LjggMTc2LTMwMy40bC0xNzYtNzQuNiAwIDB6Il0KICAgIH07CiAgICBmYVNoaWVsZEFsdCA9IGZhU2hpZWxkSGFsdmVkOwogICAgZmFDYXJldFVwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhcmV0LXVwIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbXSwgImYwZDgiLCAiTTE0MC4zIDEzNS4yYzEyLjYtMTAuMyAzMS4xLTkuNSA0Mi44IDIuMmwxMjggMTI4YzkuMiA5LjIgMTEuOSAyMi45IDYuOSAzNC45UzMwMS40IDMyMCAyODguNSAzMjBsLTI1NiAwYy0xMi45IDAtMjQuNi03LjgtMjkuNi0xOS44Uy43IDI3NC41IDkuOSAyNjUuNGwxMjgtMTI4IDIuNC0yLjJ6Il0KICAgIH07CiAgICBmYUZpbGVQZW4gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1wZW4iLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjgyMjEsICJmaWxlLWVkaXQiXSwgImYzMWMiLCAiTTEyOC4xIDBjLTM1LjMgMC02NCAyOC43LTY0IDY0bDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDE0Ni4yIDAgMTAuOS01NC41YzQuMy0yMS43IDE1LTQxLjYgMzAuNi01Ny4ybDEzMi4yLTEzMi4yIDAtOTcuNWMwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0wzMjIuOCAxOC43QzMxMC44IDYuNyAyOTQuNSAwIDI3Ny42IDBMMTI4LjEgMHpNMzg5LjYgMTc2bC05My41IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtOTMuNSAxMTcuNSAxMTcuNXpNMzMyLjMgNDY2LjlsLTExLjkgNTkuNmMtLjIgLjktLjMgMS45LS4zIDIuOSAwIDggNi41IDE0LjYgMTQuNiAxNC42IDEgMCAxLjktLjEgMi45LS4zbDU5LjYtMTEuOWMxMi40LTIuNSAyMy44LTguNiAzMi43LTE3LjVsMTE4LjktMTE4LjktODAtODAtMTE4LjkgMTE4LjljLTguOSA4LjktMTUgMjAuMy0xNy41IDMyLjd6bTI2Ny44LTEyM2MyMi4xLTIyLjEgMjIuMS01Ny45IDAtODBzLTU3LjktMjIuMS04MCAwbC0yOC44IDI4LjggODAgODAgMjguOC0yOC44eiJdCiAgICB9OwogICAgZmFGaWxlRWRpdCA9IGZhRmlsZVBlbjsKICAgIGZhUGVyc29uQmlraW5nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1iaWtpbmciLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjg2OTIsICJiaWtpbmciXSwgImY4NGEiLCAiTTM2OCA5NmE0OCA0OCAwIDEgMCAwLTk2IDQ4IDQ4IDAgMSAwIDAgOTZ6bTI3LjIgNjRsLTYxLjgtNDguOGMtMTcuMy0xMy42LTQxLjctMTMuOC01OS4xLS4zbC04My4xIDY0LjJjLTMwLjcgMjMuOC0yOC41IDcwLjggNC4zIDkxLjZMMjU2IDMwNS4xIDI1NiA0MTZjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTEyOGMwLTEwLjctNS4zLTIwLjctMTQuMi0yNi42TDI2MyAyMzIuOSAzMjMuMyAxODQuNCAzNjQgMjE3YzUuNyA0LjUgMTIuNyA3IDIwIDdsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNTIuOCAwek0xMTIgNTEyYTExMiAxMTIgMCAxIDAgMC0yMjQgMTEyIDExMiAwIDEgMCAwIDIyNHptMzUyIDBhMTEyIDExMiAwIDEgMCAwLTIyNCAxMTIgMTEyIDAgMSAwIDAgMjI0eiJdCiAgICB9OwogICAgZmFCaWtpbmcgPSBmYVBlcnNvbkJpa2luZzsKICAgIGZhQm9va09wZW5SZWFkZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm9vay1vcGVuLXJlYWRlciIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJib29rLXJlYWRlciJdLCAiZjVkYSIsICJNMjU2IDE1MmE4OCA4OCAwIDEgMCAwLTE3NiA4OCA4OCAwIDEgMCAwIDE3NnptMCAyOTguN2wwLTE0OS4zYzE2LjMtNi44IDMyLjktMTMuNyA0OS43LTIwLjcgMzktMTYuMiA4MC44LTI0LjYgMTIzLjEtMjQuNmwxOS4yIDAgMCAxNjAtMTkuMiAwYy01OS4xIDAtMTE3LjcgMTEuNy0xNzIuMyAzNC41bC0uNSAuMnpNMjU2IDIzMmwtMjUuMS0xMC41QzE4NC4xIDIwMiAxMzMuOSAxOTIgODMuMiAxOTJMNDggMTkyYy0yNi41IDAtNDggMjEuNS00OCA0OEwwIDQzMmMwIDI2LjUgMjEuNSA0OCA0OCA0OGwzNS4yIDBjNTAuNyAwIDEwMC45IDEwIDE0Ny43IDI5LjVsMTIuOCA1LjNjNy45IDMuMyAxNi43IDMuMyAyNC42IDBsMTIuOC01LjNjNDYuOC0xOS41IDk3LTI5LjUgMTQ3LjctMjkuNWwzNS4yIDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0xOTJjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTM1LjIgMGMtNTAuNyAwLTEwMC45IDEwLTE0Ny43IDI5LjVMMjU2IDIzMnoiXQogICAgfTsKICAgIGZhQm9va1JlYWRlciA9IGZhQm9va09wZW5SZWFkZXI7CiAgICBmYUdsYXNzV2F0ZXJEcm9wbGV0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImdsYXNzLXdhdGVyLWRyb3BsZXQiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZTRmNSIsICJNMzIgMEMyMy4xIDAgMTQuNiAzLjcgOC42IDEwLjJTLS42IDI1LjQgLjEgMzQuM0wyOC45IDQzNy43YzMgNDEuOSAzNy44IDc0LjMgNzkuOCA3NC4zbDE2Ni42IDBjNDIgMCA3Ni44LTMyLjQgNzkuOC03NC4zTDM4My45IDM0LjNjLjYtOC45LTIuNC0xNy42LTguNS0yNC4xUzM2MC45IDAgMzUyIDBMMzIgMHpNODMgMjk3LjVMNjYuNCA2NCAzMTcuNiA2NCAzMDEgMjk3LjUgMjg4IDMwNGMtMjAuMSAxMC4xLTQzLjkgMTAuMS02NCAwcy00My45LTEwLjEtNjQgMC00My45IDEwLjEtNjQgMGwtMTMtNi41ek0yNTYgMTk2YzAtMjQtMzMuNy03MC4xLTUyLjItOTMuNS02LjEtNy43LTE3LjUtNy43LTIzLjYgMC0xOC41IDIzLjQtNTIuMiA2OS41LTUyLjIgOTMuNSAwIDMzLjEgMjguNyA2MCA2NCA2MHM2NC0yNi45IDY0LTYweiJdCiAgICB9OwogICAgZmFUb3dlckJyb2FkY2FzdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0b3dlci1icm9hZGNhc3QiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsiYnJvYWRjYXN0LXRvd2VyIl0sICJmNTE5IiwgIk04Ny45IDExLjVjLTExLjMtNi45LTI2LjEtMy4yLTMzIDguMS0yNC44IDQxLTM5IDg5LjEtMzkgMTQwLjRzMTQuMiA5OS40IDM5IDE0MC40YzYuOSAxMS4zIDIxLjYgMTUgMzMgOC4xczE1LTIxLjYgOC4xLTMzQzc1LjcgMjQxLjkgNjQgMjAyLjMgNjQgMTYwUzc1LjcgNzguMSA5Ni4xIDQ0LjRjNi45LTExLjMgMy4yLTI2LjEtOC4xLTMzem00MDAuMSAwYy0xMS4zIDYuOS0xNSAyMS42LTguMSAzMyAyMC40IDMzLjcgMzIuMSA3My4zIDMyLjEgMTE1LjZzLTExLjcgODEuOS0zMi4xIDExNS42Yy02LjkgMTEuMy0zLjIgMjYuMSA4LjEgMzNzMjYuMSAzLjIgMzMtOC4xYzI0LjgtNDEgMzktODkuMSAzOS0xNDAuNFM1NDUuOCA2MC42IDUyMSAxOS42Yy02LjktMTEuMy0yMS42LTE1LTMzLTguMXpNMzIwIDIxNS40YzE5LjEtMTEuMSAzMi0zMS43IDMyLTU1LjQgMC0zNS4zLTI4LjctNjQtNjQtNjRzLTY0IDI4LjctNjQgNjRjMCAyMy43IDEyLjkgNDQuNCAzMiA1NS40TDI1NiA0ODBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTI2NC42ek0xODAuMiA5MWM3LjItMTEuMiAzLjktMjYtNy4yLTMzLjJzLTI2LTMuOS0zMy4yIDcuMmMtMTcuNiAyNy40LTI3LjggNjAtMjcuOCA5NXMxMC4yIDY3LjYgMjcuOCA5NWM3LjIgMTEuMiAyMiAxNC40IDMzLjIgNy4yczE0LjQtMjIgNy4yLTMzLjJjLTEyLjgtMTkuOS0yMC4yLTQzLjYtMjAuMi02OXM3LjQtNDkuMSAyMC4yLTY5ek00MzYuMiA2NWMtNy4yLTExLjItMjItMTQuNC0zMy4yLTcuMnMtMTQuNCAyMi03LjIgMzMuMmMxMi44IDE5LjkgMjAuMiA0My42IDIwLjIgNjlzLTcuNCA0OS4xLTIwLjIgNjljLTcuMiAxMS4yLTMuOSAyNiA3LjIgMzMuMnMyNiAzLjkgMzMuMi03LjJjMTcuNi0yNy40IDI3LjgtNjAgMjcuOC05NXMtMTAuMi02Ny42LTI3LjgtOTV6Il0KICAgIH07CiAgICBmYUJyb2FkY2FzdFRvd2VyID0gZmFUb3dlckJyb2FkY2FzdDsKICAgIGZhTWluaW1pemUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWluaW1pemUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiY29tcHJlc3MtYXJyb3dzLWFsdCJdLCAiZjc4YyIsICJNNDU2IDIyNGwtMTQ0IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtMTQ0YzAtOS43IDUuOC0xOC41IDE0LjgtMjIuMlMzMjIuMSAzMi4yIDMyOSAzOWw0MCA0MCA3My40LTczLjRDNDQ2IDIgNDUwLjkgMCA0NTYgMHMxMCAyIDEzLjcgNS43bDM2LjcgMzYuN0M1MTAgNDYgNTEyIDUwLjkgNTEyIDU2cy0yIDEwLTUuNyAxMy43TDQzMyAxNDMgNDczIDE4M2M2LjkgNi45IDguOSAxNy4yIDUuMiAyNi4yUzQ2NS43IDIyNCA0NTYgMjI0em0wIDY0YzkuNyAwIDE4LjUgNS44IDIyLjIgMTQuOHMxLjcgMTkuMy01LjIgMjYuMmwtNDAgNDAgNzMuNCA3My40YzMuNiAzLjYgNS43IDguNSA1LjcgMTMuN3MtMiAxMC01LjcgMTMuN2wtMzYuNyAzNi43QzQ2NiA1MTAgNDYxLjEgNTEyIDQ1NiA1MTJzLTEwLTItMTMuNy01LjdMMzY5IDQzMyAzMjkgNDczYy02LjkgNi45LTE3LjIgOC45LTI2LjIgNS4yUzI4OCA0NjUuNyAyODggNDU2bDAtMTQ0YzAtMTMuMyAxMC43LTI0IDI0LTI0bDE0NCAwem0tMjU2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCAxNDRjMCA5LjctNS44IDE4LjUtMTQuOCAyMi4ycy0xOS4zIDEuNy0yNi4yLTUuMmwtNDAtNDAtNzMuNCA3My40QzY2IDUxMCA2MS4xIDUxMiA1NiA1MTJzLTEwLTItMTMuNy01LjdMNS43IDQ2OS43QzIgNDY2IDAgNDYxLjEgMCA0NTZzMi0xMCA1LjctMTMuN0w3OSAzNjkgMzkgMzI5Yy02LjktNi45LTguOS0xNy4yLTUuMi0yNi4yUzQ2LjMgMjg4IDU2IDI4OGwxNDQgMHpNNTYgMjI0Yy05LjcgMC0xOC41LTUuOC0yMi4yLTE0LjhTMzIuMiAxODkuOSAzOSAxODNMNzkgMTQzIDUuNyA2OS43QzIgNjYgMCA2MS4xIDAgNTZTMiA0NiA1LjcgNDIuM0w0Mi4zIDUuN0M0NiAyIDUwLjkgMCA1NiAwUzY2IDIgNjkuNyA1LjdMMTQzIDc5IDE4MyAzOWM2LjktNi45IDE3LjItOC45IDI2LjItNS4yUzIyNCA0Ni4zIDIyNCA1NmwwIDE0NGMwIDEzLjMtMTAuNyAyNC0yNCAyNEw1NiAyMjR6Il0KICAgIH07CiAgICBmYUNvbXByZXNzQXJyb3dzQWx0ID0gZmFNaW5pbWl6ZTsKICAgIGZhQXJyb3dSaWdodFRvQ2l0eSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy1yaWdodC10by1jaXR5IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU0YjMiLCAiTTI4OCA0OGMwLTI2LjUgMjEuNS00OCA0OC00OGw5NiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgODAgNDggMCAwLTcyYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA3MiAxNiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMjg4YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0yNTYgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC00MTZ6bTY0IDY0bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6bTE2IDgwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDB6TTM1MiAzMDRsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnptMTc2LTgwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDB6TTUxMiAzMzZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnpNMTUzIDE2N2w3MiA3MmM5LjQgOS40IDkuNCAyNC42IDAgMzMuOWwtNzIgNzJjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsMzEtMzEtMTAyLjEgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxMDIuMSAwLTMxLTMxYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDB6Il0KICAgIH07CiAgICBmYUxhcHRvcE1lZGljYWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGFwdG9wLW1lZGljYWwiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjgxMiIsICJNNjQgOTZjMC0zNS4zIDI4LjctNjQgNjQtNjRsMzg0IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyNDAtNjQgMCAwLTI0MC0zODQgMCAwIDI0MC02NCAwIDAtMjQwek0wIDQwMy4yQzAgMzkyLjYgOC42IDM4NCAxOS4yIDM4NGw2MDEuNiAwYzEwLjYgMCAxOS4yIDguNiAxOS4yIDE5LjIgMCA0Mi40LTM0LjQgNzYuOC03Ni44IDc2LjhMNzYuOCA0ODBDMzQuNCA0ODAgMCA0NDUuNiAwIDQwMy4yek0yODggMTYwYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDQwIDQwIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC00MCAwIDAgNDBjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC00MC00MCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsNDAgMCAwLTQweiJdCiAgICB9OwogICAgZmFCcmVhZFNsaWNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJyZWFkLXNsaWNlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY3ZWMiLCAiTTY0IDQzMmwwLTE3NmMtMzUuMyAwLTY0LTI4LjctNjQtNjQgMC0yMTYuNSA1MTItMjE2LjUgNTEyIDAgMCAzNS4zLTI4LjcgNjQtNjQgNjRsMCAxNzZjMCAyNi41LTIxLjUgNDgtNDggNDhsLTI4OCAwYy0yNi41IDAtNDgtMjEuNS00OC00OHoiXQogICAgfTsKICAgIGZhR2xvYmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZ2xvYmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjc3NjBdLCAiZjBhYyIsICJNMzUxLjkgMjgwbC0xOTAuOSAwYzIuOSA2NC41IDE3LjIgMTIzLjkgMzcuNSAxNjcuNCAxMS40IDI0LjUgMjMuNyA0MS44IDM1LjEgNTIuNCAxMS4yIDEwLjUgMTguOSAxMi4yIDIyLjkgMTIuMnMxMS43LTEuNyAyMi45LTEyLjJjMTEuNC0xMC42IDIzLjctMjggMzUuMS01Mi40IDIwLjMtNDMuNSAzNC42LTEwMi45IDM3LjUtMTY3LjR6TTE2MC45IDIzMmwxOTAuOSAwQzM0OSAxNjcuNSAzMzQuNyAxMDguMSAzMTQuNCA2NC42IDMwMyA0MC4yIDI5MC43IDIyLjggMjc5LjMgMTIuMiAyNjguMSAxLjcgMjYwLjQgMCAyNTYuNCAwcy0xMS43IDEuNy0yMi45IDEyLjJjLTExLjQgMTAuNi0yMy43IDI4LTM1LjEgNTIuNC0yMC4zIDQzLjUtMzQuNiAxMDIuOS0zNy41IDE2Ny40em0tNDggMEMxMTYuNCAxNDYuNCAxMzguNSA2Ni45IDE3MC44IDE0LjcgNzguNyA0Ny4zIDEwLjkgMTMxLjIgMS41IDIzMmwxMTEuNCAwek0xLjUgMjgwYzkuNCAxMDAuOCA3Ny4yIDE4NC43IDE2OS4zIDIxNy4zLTMyLjMtNTIuMi01NC40LTEzMS43LTU3LjktMjE3LjNMMS41IDI4MHptMzk4LjQgMGMtMy41IDg1LjYtMjUuNiAxNjUuMS01Ny45IDIxNy4zIDkyLjEtMzIuNyAxNTkuOS0xMTYuNSAxNjkuMy0yMTcuM2wtMTExLjQgMHptMTExLjQtNDhDNTAxLjkgMTMxLjIgNDM0LjEgNDcuMyAzNDIgMTQuNyAzNzQuMyA2Ni45IDM5Ni40IDE0Ni40IDM5OS45IDIzMmwxMTEuNCAweiJdCiAgICB9OwogICAgZmFGb2xkZXJNaW51cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmb2xkZXItbWludXMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjY1ZCIsICJNNDQ4IDQ0OEw2NCA0NDhjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMTM4LjcgMGMxMy44IDAgMjcuMyA0LjUgMzguNCAxMi44bDM4LjQgMjguOGM1LjUgNC4yIDEyLjMgNi40IDE5LjIgNi40TDQ0OCA4MGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDI0MGMwIDM1LjMtMjguNyA2NC02NCA2NHpNMTg0IDI0MGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNDQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTQ0IDB6Il0KICAgIH07CiAgICBmYU1hc2tGYWNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hc2stZmFjZSIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlMWQ3IiwgIk0zMjAgNjRjLTI3LjIgMC01My44IDgtNzYuNCAyMy4xbC0zNy4xIDI0LjhjLTE1LjggMTAuNS0zNC4zIDE2LjEtNTMuMyAxNi4xTDY0IDEyOGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCA3OC43YzAgNjIuNiA0NS4yIDExNiAxMDcgMTI2LjNsOTcuOSAxNi4zYzMzIDIyIDcyLjYgMzQuNyAxMTUuMSAzNC43czgyLjItMTIuOCAxMTUuMS0zNC43TDUzMyAzOTYuOWM2MS43LTEwLjMgMTA3LTYzLjcgMTA3LTEyNi4zbDAtNzguN2MwLTM1LjMtMjguNy02NC02NC02NGwtODkuMiAwYy0xOSAwLTM3LjUtNS42LTUzLjMtMTYuMUwzOTYuNCA4Ny4xQzM3My44IDcyIDM0Ny4yIDY0IDMyMCA2NHpNMTM1LjkgMzM2LjlsLTE4LjQtMy4xQzg2LjYgMzI4LjcgNjQgMzAyIDY0IDI3MC43bDAtNzguNyA0OCAwIDAgNDhjMCAzNSA4LjYgNjcuOSAyMy45IDk2Ljl6bTM4Ni42LTMuMWwtMTguNCAzLjFDNTE5LjQgMzA3LjkgNTI4IDI3NSA1MjggMjQwbDAtNDggNDggMCAwIDc4LjdjMCAzMS4zLTIyLjYgNTgtNTMuNSA2My4xek0xOTIgMjMyYzAtMTMuMyAxMC43LTI0IDI0LTI0bDIwOCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0yMDggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjR6bTU2IDU2bDE0NCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNDQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhQm9uZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib25nIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1NWMiLCAiTTQ0OC41IDM4NGMwIDQxLjUtMTMuMSA3OS45LTM1LjUgMTExLjMtNy45IDExLjEtMjEuMiAxNi43LTM0LjggMTYuN2wtMjQzLjMgMGMtMTMuNyAwLTI2LjktNS42LTM0LjgtMTYuNy0yMi40LTMxLjQtMzUuNS02OS44LTM1LjUtMTExLjMgMC03MS4xIDM4LjYtMTMzLjEgOTYtMTY2LjNsMC0xNTMuN2MtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxOTIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwwIDE1My43YzE0LjIgOC4yIDI3LjIgMTguMiAzOC44IDI5LjZsMzkuMy0zOS4zLTctN2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwYzE2IDE2IDMyIDMyIDQ4IDQ4IDkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTctNy00My4zIDQzLjNjMTcuMyAyOC45IDI3LjMgNjIuNiAyNy4zIDk4Ljh6TTI4OC41IDY0bC02NCAwIDAgMTkwLjYtMzIgMTguNWMtMTkuNSAxMS4zLTM1LjcgMjcuNS00Ni45IDQ2LjlsMjIxLjggMGMtMTEuMi0xOS40LTI3LjQtMzUuNi00Ni45LTQ2LjlsLTMyLTE4LjUgMC0xOTAuNnoiXQogICAgfTsKICAgIGZhUm9hZEJyaWRnZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyb2FkLWJyaWRnZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTYzIiwgIk0zMiAzMmwyMDggMCAwIDY0LTI0IDAgMCA2NCAyNCAwIDAgMTI5LjNjLTQ1LjQgNy42LTgwIDQ3LjEtODAgOTQuN2wwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMybC0zMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTk0YzAtMzguOC0yNi40LTcyLjYtNjQtODJsMC0xMTIgNDAgMCAwLTY0LTggMEMxNC4zIDk2IDAgODEuNyAwIDY0UzE0LjMgMzIgMzIgMzJ6TTg4IDk2bDAgNjQgODAgMCAwLTY0LTgwIDB6TTMzNiAzMmw3MiAwIDAgNzJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTcyIDcyIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAzNTJjMCAyNi41LTIxLjUgNDgtNDggNDhsLTcyIDAgMC03MmMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDcyLTcyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMzUyYzAtMjYuNSAyMS41LTQ4IDQ4LTQ4em05NiAxNjBjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgODBjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTgwYzAtMTMuMy0xMC43LTI0LTI0LTI0eiJdCiAgICB9OwogICAgZmFBcnJvd1VwOTEgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctdXAtOS0xIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNvcnQtbnVtZXJpYy11cC1hbHQiXSwgImY4ODciLCAiTTE1MC42IDQxLjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwbC05NiA5NmMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMEw5NiAxNDEuMyA5NiA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTMwNi43IDQxLjQgNDEuNGMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zbC05Ni05NnpNMzY1LjEgMjA2LjZjLTkuNiAxNC44LTUuNCAzNC42IDkuNCA0NC4zczM0LjYgNS40IDQ0LjMtOS40bDQyLjEtNjQuOWMxMi40LTE5LjIgMTkuMS00MS42IDE5LjEtNjQuNSAwLTQ0LjItMzUuOC04MC04MC04MHMtODAgMzUuOC04MCA4MGMwIDM2LjEgMjMuOSA2Ni43IDU2LjggNzYuNmwtMTEuNyAxOHpNMzc2IDExMmEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwem00Mi43IDE4MmMtOC4zLTYtMTkuMS03LjctMjguOC00LjRsLTQ4IDE2Yy0xNi44IDUuNi0yNS44IDIzLjctMjAuMiA0MC41czIzLjcgMjUuOCA0MC41IDIwLjJsNS45LTIgMCA1MS42LTE2IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsOTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTYgMCAwLTk2YzAtMTAuMy00LjktMTkuOS0xMy4zLTI2eiJdCiAgICB9OwogICAgZmFTb3J0TnVtZXJpY1VwQWx0ID0gZmFBcnJvd1VwOTE7CiAgICBmYU1vdW50YWluQ2l0eSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb3VudGFpbi1jaXR5IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1MmUiLCAiTTI1Ni4zIDQ4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDk2IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA0OCA0OCAwIDAtNzJjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDcyIDE2IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAzMjBjMCAyNi41LTIxLjUgNDgtNDggNDhsLTc3LjggMGM0LTE1LjQgMi40LTMyLjYtNi43LTQ4LjJMMzU0LjYgMjU2IDM2OC4zIDI1NmM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTYuMSAwLTExLjQgMy40LTE0LjEgOC41bC00Mi42LTczYy02LTEwLjItMTQuMS0xOC0yMy4zLTIzLjNsMC01Ni4yem02NCA2NGwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2em0xNjAgOTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0zMmMwLTguOC03LjItMTYtMTYtMTZsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNnptMTYgODBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHptLTI3Mi02NC43bC02NS4xIDExMS42IDMzLjEgMzMuMSA0OC00OCA0MC40IDAtNTYuNC05Ni43em0tMjcuNi00Ny45YzEyLjMtMjEuMiA0Mi45LTIxLjIgNTUuMyAwTDQyMC4zIDQ2My45YzEyLjQgMjEuMy0yLjkgNDguMS0yNy42IDQ4LjFMNTYgNTEyYy0yNC43IDAtNDAuMS0yNi44LTI3LjYtNDguMUwxOTYuNyAxNzUuNHoiXQogICAgfTsKICAgIGZhQXJyb3dEb3duOTEgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctZG93bi05LTEiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsic29ydC1udW1lcmljLWRlc2MiLCAic29ydC1udW1lcmljLWRvd24tYWx0Il0sICJmODg2IiwgIk0yMzAuNiAzOTAuNmwtODAgODBjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwbC04MC04MGMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMEw5NiAzNzAuNyA5NiA2NGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMzA2LjcgMjUuNC0yNS40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwczEyLjUgMzIuOCAwIDQ1LjN6bTEzNC41LTE4NGwxMS43LTE4Yy0zMi45LTkuOS01Ni44LTQwLjUtNTYuOC03Ni42IDAtNDQuMiAzNS44LTgwIDgwLTgwczgwIDM1LjggODAgODBjMCAyMi45LTYuNiA0NS4zLTE5LjEgNjQuNWwtNDIuMSA2NC45Yy05LjYgMTQuOC0yOS40IDE5LjEtNDQuMyA5LjRzLTE5LjEtMjkuNC05LjQtNDQuM3pNNDI0IDExMmEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAwem0tNS4zIDE4MmM4LjMgNiAxMy4zIDE1LjcgMTMuMyAyNmwwIDk2IDE2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTk2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMTYgMCAwLTUxLjYtNS45IDJjLTE2LjggNS42LTM0LjktMy41LTQwLjUtMjAuMnMzLjUtMzQuOSAyMC4yLTQwLjVsNDgtMTZjOS44LTMuMyAyMC41LTEuNiAyOC44IDQuNHoiXQogICAgfTsKICAgIGZhU29ydE51bWVyaWNEZXNjID0gZmFBcnJvd0Rvd245MTsKICAgIGZhU29ydE51bWVyaWNEb3duQWx0ID0gZmFBcnJvd0Rvd245MTsKICAgIGZhRmFjZUdyaW5XaWRlMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLWdyaW4td2lkZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODUxNSwgImdyaW4tYWx0Il0sICJmNTgxIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMzg2LjcgMzA4LjljMTEuOS0zLjcgMjMuOSA2LjMgMTkuNiAxOC4xLTIyLjQgNjEuMy04MS4zIDEwNS4xLTE1MC4zIDEwNS4xUzEyOC4xIDM4OC4yIDEwNS43IDMyNi45Yy00LjMtMTEuOCA3LjctMjEuOCAxOS42LTE4LjEgMzkuMiAxMi4yIDgzLjcgMTkuMSAxMzAuNyAxOS4xczkxLjUtNi45IDEzMC43LTE5LjF6TTIwOCAxOTJjMCAzNS4zLTE0LjMgNjQtMzIgNjRzLTMyLTI4LjctMzItNjQgMTQuMy02NCAzMi02NCAzMiAyOC43IDMyIDY0em0xMjggNjRjLTE3LjcgMC0zMi0yOC43LTMyLTY0czE0LjMtNjQgMzItNjQgMzIgMjguNyAzMiA2NC0xNC4zIDY0LTMyIDY0eiJdCiAgICB9OwogICAgZmFHcmluQWx0MiA9IGZhRmFjZUdyaW5XaWRlMjsKICAgIGZhUG9vcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwb29wIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY2MTkiLCAiTTI1NC40IDYuNmMzLjUtNC4zIDktNi41IDE0LjUtNS43IDQ2LjkgNi4zIDgzLjEgNDYuNSA4My4xIDk1LjEgMCAxMS4yLTEuOSAyMi01LjUgMzJsNS41IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjQgMCAxOS4xLTguNCAzNi4zLTIxLjcgNDhsMTMuNyAwYzM5LjggMCA3MiAzMi4yIDcyIDcyIDAgMjMuMi0xMSA0My44LTI4IDU3IDM0LjEgNS43IDYwIDM1LjMgNjAgNzEgMCAzOS44LTMyLjIgNzItNzIgNzJMNzIgNTEyYy0zOS44IDAtNzItMzIuMi03Mi03MiAwLTM1LjcgMjUuOS02NS4zIDYwLTcxLTE3LTEzLjItMjgtMzMuOC0yOC01NyAwLTM5LjggMzIuMi03MiA3Mi03MmwxMy43IDBjLTEzLjMtMTEuNy0yMS43LTI4LjktMjEuNy00OCAwLTM1LjMgMjguNy02NCA2NC02NGwxNi4yIDBjNDQuMS0uMSA3OS44LTM1LjkgNzkuOC04MCAwLTkuMi0xLjUtMTcuOS00LjMtMjYuMS0xLjgtNS4yLS44LTExLjEgMi44LTE1LjR6Il0KICAgIH07CiAgICBmYURoYXJtYWNoYWtyYSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkaGFybWFjaGFrcmEiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5Nzg0XSwgImY2NTUiLCAiTTMzNy44IDIwNS43bDQ4LjYtNDIuNWMxMy44IDE5LjMgMjMuNCA0MS45IDI3LjQgNjYuMmwtNjQuNCA0LjNjLTIuNC0xMC4xLTYuNC0xOS41LTExLjYtMjh6bTE0MC4xIDE5LjVjLTUuMy0zOC44LTIwLjYtNzQuNS00My4yLTEwNC4zbC44LS43QzQ0OSAxMDguNCA0NDkuNyA4Ny42IDQzNyA3NXMtMzMuNC0xMi00NS4yIDEuNWwtLjcgLjhjLTI5LjgtMjIuNi02NS41LTM3LjktMTA0LjMtNDMuMmwuMS0xLjFjMS4yLTE3LjktMTMtMzMtMzAuOS0zM3MtMzIuMSAxNS4yLTMwLjkgMzNsLjEgMS4xYy0zOC44IDUuMy03NC41IDIwLjYtMTA0LjMgNDMuMmwtLjctLjhDMTA4LjQgNjMgODcuNiA2Mi4zIDc1IDc1cy0xMiAzMy40IDEuNSA0NS4ybC44IC43Yy0yMi42IDI5LjgtMzcuOSA2NS41LTQzLjIgMTA0LjNsLTEuMS0uMWMtMTcuOS0xLjItMzMgMTMtMzMgMzAuOXMxNS4yIDMyLjEgMzMgMzAuOWwxLjEtLjFjNS4zIDM4LjggMjAuNiA3NC41IDQzLjIgMTA0LjNsLS44IC43QzYzIDQwMy42IDYyLjMgNDI0LjQgNzUgNDM3czMzLjQgMTIgNDUuMi0xLjVsLjctLjhjMjkuOCAyMi42IDY1LjUgMzcuOSAxMDQuMyA0My4ybC0uMSAxLjFjLTEuMiAxNy45IDEzIDMzIDMwLjkgMzNzMzIuMS0xNS4yIDMwLjktMzNsLS4xLTEuMWMzOC44LTUuMyA3NC41LTIwLjYgMTA0LjMtNDMuMmwuNyAuOGMxMS44IDEzLjUgMzIuNSAxNC4yIDQ1LjIgMS41czEyLTMzLjQtMS41LTQ1LjJsLS44LS43YzIyLjYtMjkuOCAzNy45LTY1LjUgNDMuMi0xMDQuM2wxLjEgLjFjMTcuOSAxLjIgMzMtMTMgMzMtMzAuOXMtMTUuMi0zMi4xLTMzLTMwLjlsLTEuMSAuMXpNMTYzLjIgMTI1LjZjMTkuMy0xMy44IDQxLjktMjMuNCA2Ni4yLTI3LjVsNC4zIDY0LjRjLTEwIDIuNC0xOS41IDYuNC0yOCAxMS42bC00Mi41LTQ4LjZ6bS02NSAxMDMuOGM0LjEtMjQuNCAxMy43LTQ2LjkgMjcuNS02Ni4ybDQ4LjYgNDIuNWMtNS4zIDguNS05LjIgMTgtMTEuNiAyOGwtNjQuNC00LjN6bTI3LjUgMTE5LjRjLTEzLjgtMTkuMy0yMy40LTQxLjktMjcuNS02Ni4ybDY0LjQtNC4zYzIuNCAxMC4xIDYuNCAxOS41IDExLjYgMjhsLTQ4LjYgNDIuNXptMTAzLjggNjVjLTI0LjQtNC4xLTQ2LjktMTMuNy02Ni4yLTI3LjRsNDIuNS00OC42YzguNSA1LjMgMTggOS4yIDI4IDExLjZsLTQuMyA2NC40em0xMTkuNC0yNy40Yy0xOS4zIDEzLjgtNDEuOSAyMy40LTY2LjIgMjcuNGwtNC4zLTY0LjRjMTAtMi40IDE5LjUtNi40IDI4LTExLjZsNDIuNSA0OC42em02NS0xMDMuOGMtNC4xIDI0LjQtMTMuNyA0Ni45LTI3LjQgNjYuMmwtNDguNi00Mi41YzUuMy04LjYgOS4yLTE4IDExLjYtMjhsNjQuNCA0LjN6bS02NS0xNTYuOWwtNDIuNSA0OC42Yy04LjYtNS4zLTE4LTkuMi0yOC0xMS42bDQuMy02NC40YzI0LjQgNC4xIDQ2LjkgMTMuNyA2Ni4yIDI3LjV6TTI1NiAyMjRhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFCYXR0ZXJ5UXVhcnRlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYXR0ZXJ5LXF1YXJ0ZXIiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsiYmF0dGVyeS0yIl0sICJmMjQzIiwgIk01MjggMTI4YzguOCAwIDE2IDcuMiAxNiAxNmwwIDIyNGMwIDguOC03LjIgMTYtMTYgMTZsLTQxNiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0yMjRjMC04LjggNy4yLTE2IDE2LTE2bDQxNiAwek0xMTIgNjRjLTQ0LjIgMC04MCAzNS44LTgwIDgwbDAgMjI0YzAgNDQuMiAzNS44IDgwIDgwIDgwbDQxNiAwYzQ0LjIgMCA4MC0zNS44IDgwLTgwbDAtNDhjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMmwwLTQ4YzAtNDQuMi0zNS44LTgwLTgwLTgwTDExMiA2NHptNTYgMTEyYy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDExMmMwIDEzLjMgMTAuNyAyNCAyNCAyNGw2NCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtMTEyYzAtMTMuMy0xMC43LTI0LTI0LTI0bC02NCAweiJdCiAgICB9OwogICAgZmFCYXR0ZXJ5MiA9IGZhQmF0dGVyeVF1YXJ0ZXI7CiAgICBmYUFua2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYW5raCIsCiAgICAgIGljb246IFszMjAsIDUxMiwgWzk3NjVdLCAiZjY0NCIsICJNOTYgMTI4YzAtMzUuMyAyOC43LTY0IDY0LTY0czY0IDI4LjcgNjQgNjRjMCA0MS42LTIwLjcgNzYuNi00Ni42IDEwNC4xLTUuOSA2LjItMTEuOCAxMS44LTE3LjQgMTYuNy01LjYtNC45LTExLjUtMTAuNS0xNy40LTE2LjctMjUuOS0yNy41LTQ2LjYtNjIuNi00Ni42LTEwNC4xek0xNjAgMEM4OS4zIDAgMzIgNTcuMyAzMiAxMjggMzIgMTgwLjQgNTMuNSAyMjMuNSA3OC44IDI1NkwzMiAyNTZjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsOTYgMCAwIDE2MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTYwIDk2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTQ2LjggMEMyNjYuNSAyMjMuNSAyODggMTgwLjQgMjg4IDEyOCAyODggNTcuMyAyMzAuNyAwIDE2MCAweiJdCiAgICB9OwogICAgZmFEaWFtb25kID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRpYW1vbmQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs5ODMwXSwgImYyMTkiLCAiTTE3IDIxNUwyMTUgMTdDMjI1LjkgNi4xIDI0MC42IDAgMjU2IDBzMzAuMSA2LjEgNDEgMTdMNDk1IDIxNWMxMC45IDEwLjkgMTcgMjUuNiAxNyA0MXMtNi4xIDMwLjEtMTcgNDFMMjk3IDQ5NWMtMTAuOSAxMC45LTI1LjYgMTctNDEgMTdzLTMwLjEtNi4xLTQxLTE3TDE3IDI5N0M2LjEgMjg2LjEgMCAyNzEuNCAwIDI1NnM2LjEtMzAuMSAxNy00MXoiXQogICAgfTsKICAgIGZhU3Vic2NyaXB0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN1YnNjcmlwdCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmMTJjIiwgIk05NiA2NEM3OC4zIDY0IDY0IDc4LjMgNjQgOTZzMTQuMyAzMiAzMiAzMmwxNS4zIDAgODkuNiAxMjgtODkuNiAxMjgtMTUuMyAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDMyIDBjMTAuNCAwIDIwLjItNS4xIDI2LjItMTMuNkwyNDAgMzExLjggMzI1LjggNDM0LjRjNiA4LjYgMTUuOCAxMy42IDI2LjIgMTMuNmwzMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0xNS4zIDAtODkuNi0xMjggODkuNi0xMjggMTUuMyAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0zMiAwYy0xMC40IDAtMjAuMiA1LjEtMjYuMiAxMy42TDI0MCAyMDAuMiAxNTQuMiA3Ny42QzE0OC4yIDY5LjEgMTM4LjQgNjQgMTI4IDY0TDk2IDY0ek01NDQgMzIwYzAtMTEuMS01LjctMjEuNC0xNS4yLTI3LjJzLTIxLjItNi40LTMxLjEtMS40bC0zMiAxNmMtMTUuOCA3LjktMjIuMiAyNy4xLTE0LjMgNDIuOSA1LjYgMTEuMiAxNi45IDE3LjcgMjguNiAxNy43bDAgODBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwwLTEyOHoiXQogICAgfTsKICAgIGZhUnVwZWVTaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJ1cGVlLXNpZ24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFs4MzYwLCAicnVwZWUiXSwgImYxNTYiLCAiTTAgNjRDMCA0Ni4zIDE0LjMgMzIgMzIgMzJsODAgMGM3OS41IDAgMTQ0IDY0LjUgMTQ0IDE0NCAwIDU0LjMtMzAgMTAxLjUtNzQuNCAxMjYuMWw0MSAxMzYuN2M1LjEgMTYuOS00LjUgMzQuOC0yMS41IDM5LjhzLTM0LjgtNC41LTM5LjgtMjEuNUwxMjAuMSAzMTkuOGMtMi43IC4xLTUuNCAuMi04LjEgLjJsLTQ4IDAgMCAxMjhjMCAxNy43LTE0LjMgMzItMzIgMzJTMCA0NjUuNyAwIDQ0OEwwIDY0ek02NCAyNTZsNDggMGM0NC4yIDAgODAtMzUuOCA4MC04MHMtMzUuOC04MC04MC04MGwtNDggMCAwIDE2MHptMjg1LjEtMzJsMzQuOSAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0zNC45IDBjLTcuMiAwLTEzLjEgNS45LTEzLjEgMTMuMSAwIDUuNyAzLjcgMTAuNyA5LjEgMTIuNWw0OS40IDE1LjljMzEuOSAxMC4zIDUzLjUgMzkuOSA1My41IDczLjQgMCA0Mi42LTM0LjUgNzcuMS03Ny4xIDc3LjFMMzIwIDQ4MGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmw1MC45IDBjNy4yIDAgMTMuMS01LjkgMTMuMS0xMy4xIDAtNS43LTMuNy0xMC43LTkuMS0xMi41bC00OS40LTE1LjljLTMxLjktMTAuMy01My41LTM5LjktNTMuNS03My40IDAtNDIuNiAzNC41LTc3LjEgNzcuMS03Ny4xeiJdCiAgICB9OwogICAgZmFSdXBlZSA9IGZhUnVwZWVTaWduOwogICAgZmFQZXJzb25SaWZsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tcmlmbGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTU0ZSIsICJNNDE2IDBMMzg0IDBjLTguOCAwLTE2IDcuMi0xNiAxNnM3LjIgMTYgMTYgMTZsMCAxMDAuM2MtOS42IDUuNS0xNiAxNS45LTE2IDI3LjdsMCAzMmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAxNDRjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTYgMCAwIDk2YzAgOC44IDcuMiAxNiAxNiAxNmw1OS41IDBjMTAuNCAwIDE4LTkuOCAxNS41LTE5LjlsLTIzLTkyLjEgNDQgMGM4LjggMCAxNi03LjIgMTYtMTZsMC0xNmMwLTguOC03LjItMTYtMTYtMTZsLTQ4IDAgMC0yNi43IDUzLjEtMTcuN2M2LjUtMi4yIDEwLjktOC4zIDEwLjktMTUuMmwwLTg0LjVjMC04LjgtNy4yLTE2LTE2LTE2bC0xNiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCA1Ni0xNiA1LjMgMC0xMDkuM2MwLTExLjgtNi40LTIyLjItMTYtMjcuN0w0MzIgMTZjMC04LjgtNy4yLTE2LTE2LTE2ek0yMjQgMjA4QzExOCAyMDggMzIgMjk0IDMyIDQwMGwwIDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC00OGMwLTMyLjUgMTIuMS02Mi4xIDMyLTg0LjdsMCAxOTYuNyAxNjAgMCAwLTI5My4xYy0yMC03LjEtNDEuNi0xMC45LTY0LTEwLjl6TTI4MCA4OGE3MiA3MiAwIDEgMCAtMTQ0IDAgNzIgNzIgMCAxIDAgMTQ0IDB6Il0KICAgIH07CiAgICBmYUQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzEwMF0sICI0NCIsICJNMCA2NEMwIDQ2LjMgMTQuMyAzMiAzMiAzMmwxMjggMGMxMjMuNyAwIDIyNCAxMDAuMyAyMjQgMjI0UzI4My43IDQ4MCAxNjAgNDgwTDMyIDQ4MGMtMTcuNyAwLTMyLTE0LjMtMzItMzJMMCA2NHpNNjQgOTZsMCAzMjAgOTYgMGM4OC40IDAgMTYwLTcxLjYgMTYwLTE2MFMyNDguNCA5NiAxNjAgOTZMNjQgOTZ6Il0KICAgIH07CiAgICBmYVNxdWFyZU5maSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzcXVhcmUtbmZpIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImU1NzYiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6TTkzIDE3Mi4zbDM1IDYzIDAtNTEuNGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgMTQ0YzAgMTAuOS03LjQgMjAuNS0xOCAyMy4ycy0yMS43LTItMjctMTEuNmwtMzUtNjMgMCA1MS40YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMTQ0YzAtMTAuOSA3LjQtMjAuNSAxOC0yMy4yczIxLjcgMiAyNyAxMS42ek0yMDggMTg0YzAtMTMuMyAxMC43LTI0IDI0LTI0bDgwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTU2IDAgMCAzMiA0MCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC00MCAwIDAgNDBjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0xNDR6bTE5MiAwbDAgMTQ0YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMTQ0YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjR6Il0KICAgIH07CiAgICBmYVRlZXRoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRlZXRoIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY2MmUiLCAiTTAgOTZDMCA2MC43IDI4LjcgMzIgNjQgMzJsMzg0IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAzMjBjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2ek0xNDQgMjA4bDAgMjRjMCAxMy4zIDEwLjcgMjQgMjQgMjRsNDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTI0YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4cy00OCAyMS41LTQ4IDQ4em0xMjggMGwwIDI0YzAgMTMuMyAxMC43IDI0IDI0IDI0bDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC0yNGMwLTI2LjUtMjEuNS00OC00OC00OHMtNDggMjEuNS00OCA0OHpNODAgMTc2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDI0YzAgMTMuMyAxMC43IDI0IDI0IDI0bDE2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC0yNGMwLTE3LjctMTQuMy0zMi0zMi0zMnptMzIwIDMybDAgMjRjMCAxMy4zIDEwLjcgMjQgMjQgMjRsMTYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTI0YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMyek00OCAzMzZjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE2YzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMTZ6bTE0NCA0OGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTE2YzAtOC44LTcuMi0xNi0xNi0xNmwtNjQgMGMtOC44IDAtMTYgNy4yLTE2IDE2bDAgMTZjMCAyNi41IDIxLjUgNDggNDggNDh6bTEyOCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMTZjMC04LjgtNy4yLTE2LTE2LTE2bC02NCAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAxNmMwIDI2LjUgMjEuNSA0OCA0OCA0OHptMTEyLTE2YzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMTZjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAxNmMwIDE3LjcgMTQuMyAzMiAzMiAzMnoiXQogICAgfTsKICAgIGZhTWFnbmlmeWluZ0dsYXNzRG9sbGFyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hZ25pZnlpbmctZ2xhc3MtZG9sbGFyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNlYXJjaC1kb2xsYXIiXSwgImY2ODgiLCAiTTQxNiAyMDhjMCA0NS45LTE0LjkgODguMy00MCAxMjIuN0w1MDIuNiA0NTcuNGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMEwzMzAuNyAzNzZDMjk2LjMgNDAxLjEgMjUzLjkgNDE2IDIwOCA0MTYgOTMuMSA0MTYgMCAzMjIuOSAwIDIwOFM5My4xIDAgMjA4IDAgNDE2IDkzLjEgNDE2IDIwOHpNMjEyIDk2Yy0xMSAwLTIwIDktMjAgMjBsMCA0Yy0yOC44IC4zLTUyIDIzLjctNTIgNTIuNSAwIDI1LjcgMTguNSA0Ny42IDQzLjkgNTEuOGw0MS43IDdjNiAxIDEwLjQgNi4yIDEwLjQgMTIuMyAwIDYuOS01LjYgMTIuNS0xMi41IDEyLjVMMTY4IDI1NmMtMTEgMC0yMCA5LTIwIDIwczkgMjAgMjAgMjBsMjQgMCAwIDRjMCAxMSA5IDIwIDIwIDIwczIwLTkgMjAtMjBsMC00LjdjMjUtNC4xIDQ0LTI1LjcgNDQtNTEuOCAwLTI1LjctMTguNS00Ny42LTQzLjktNTEuOGwtNDEuNy03Yy02LTEtMTAuNC02LjItMTAuNC0xMi4zIDAtNi45IDUuNi0xMi41IDEyLjUtMTIuNWw0Ny41IDBjMTEgMCAyMC05IDIwLTIwcy05LTIwLTIwLTIwbC04IDAgMC00YzAtMTEtOS0yMC0yMC0yMHoiXQogICAgfTsKICAgIGZhU2VhcmNoRG9sbGFyID0gZmFNYWduaWZ5aW5nR2xhc3NEb2xsYXI7CiAgICBmYUR1bXBzdGVyRmlyZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkdW1wc3Rlci1maXJlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImY3OTQiLCAiTTE2NC4zIDY0TDEzOC43IDE5MiA1NiAxOTJjLTEzLjMgMC0yNC0xMC43LTI0LTI0bDAtNC4xYzAtMi42IC40LTUuMSAxLjItNy42TDU4LjUgODAuNEM2MS44IDcwLjYgNzEgNjQgODEuMyA2NGw4MyAwem0yMy40IDEyOGwyNS42LTEyOCA4Mi43IDAgMCAxMjgtMTA4LjMgMHpNMzQ0IDY0bDgyLjcgMCAxNiA4MGMtMTQuNyAuMi0yOS4zIDUuNS00MC45IDE1LjktMTEuNSAxMC4zLTIyLjUgMjEtMzIuOCAzMi4xbC0yNC45IDAgMC0xMjh6TTk2IDI0MGwyMzMuMiAwYy02LjQgOC44LTEyLjMgMTcuNi0xNy43IDI2LjMtMjEuNCAzNC43LTM5LjUgNzYuMS0zOS41IDExNS44IDAgMTcuMSAyLjEgMzMuOCA2IDQ5LjlsLTEyMC40IDAgMS45IDEwLjNjMy4yIDE3LjQtOC40IDM0LTI1LjggMzcuMnMtMzQtOC40LTM3LjItMjUuOEM3MSAzMTMuMyA1OCAyNDIuMSA1Ny43IDI0MEw5NiAyNDB6bTUxMi03MmMwIDExLTcuNCAyMC4zLTE3LjUgMjMuMS0uOS0uOC0xLjctMS42LTIuNi0yLjQtMjEuOC0yMC01NC4zLTIxLjgtNzgtNS41LTQuMi00LjMtOC41LTguNS0xMi45LTEyLjZsLTIxLjMtMTA2LjYgODMgMGMxMC4zIDAgMTkuNSA2LjYgMjIuOCAxNi40bDI1LjMgNzUuOWMuOCAyLjQgMS4yIDUgMS4yIDcuNmwwIDQuMXpNNTA1LjcgMjQwLjNMNTE4IDIyNi41YzUuNC02LjEgMTMuMy04LjggMjAuOS04LjkgNy4yIDAgMTQuMyAyLjYgMTkuOSA3LjggMTkuNyAxOC4zIDM5LjggNDMuMiA1NSA3MC42IDE1LjEgMjcuMiAyNi4yIDU4LjEgMjYuMiA4OC4xIDAgODguNy03MS4zIDE1OS44LTE2MCAxNTkuOC04OS42IDAtMTYwLTcxLjMtMTYwLTE1OS44IDAtMzcuMyAxNi03My40IDM2LjgtMTA0LjUgMjAuOS0zMS4zIDQ3LjUtNTkgNzAuOS04MC4yIDUuNy01LjIgMTMuMS03LjcgMjAuMy03LjVzMTMuNCAzLjIgMTguOCA3LjVjMTQuNCAxMS40IDM4LjkgNDAuNyAzOC45IDQwLjd6TTU0NCA0MzIuMmMwLTM2LjUtMzctNzMtNTQuOC04OC40LTUuNC00LjctMTMuMS00LjctMTguNSAwLTE3LjcgMTUuNC01NC44IDUxLjktNTQuOCA4OC40IDAgMzUuMyAyOC43IDY0IDY0IDY0czY0LTI4LjcgNjQtNjR6Il0KICAgIH07CiAgICBmYVVwbG9hZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1cGxvYWQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjA5MyIsICJNMjU2IDEwOS4zTDI1NiAzMjBjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0yMTAuNy00MS40IDQxLjRjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwcy0xMi41LTMyLjggMC00NS4zbDk2LTk2YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDk2IDk2YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zcy0zMi44IDEyLjUtNDUuMyAwTDI1NiAxMDkuM3pNMjI0IDQwMGM0NC4yIDAgODAtMzUuOCA4MC04MGw4MCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzJjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNDgwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTMyYzAtMzUuMyAyOC43LTY0IDY0LTY0bDgwIDBjMCA0NC4yIDM1LjggODAgODAgODB6bTE0NCAyNGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6Il0KICAgIH07CiAgICBmYVVzZXJTbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1c2VyLXNsYXNoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbNjI3MTQsICJ1c2VyLWFsdC1zbGFzaCIsICJ1c2VyLWxhcmdlLXNsYXNoIl0sICJmNTA2IiwgIk00MS0yNC45Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMFMtMi4zLS4zIDcgOS4xbDUyOCA1MjhjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45TDMxMS41IDI0NS43YzU1LTEwLjkgOTYuNS01OS41IDk2LjUtMTE3LjcgMC02Ni4zLTUzLjctMTIwLTEyMC0xMjAtNTguMiAwLTEwNi44IDQxLjUtMTE3LjcgOTYuNUw0MS0yNC45ek0yMzUuNiAzMDUuNEMxNDcuOSAzMTYuNiA4MCAzOTEuNSA4MCA0ODIuMyA4MCA0OTguNyA5My4zIDUxMiAxMDkuNyA1MTJsMzMyLjUgMC0yMDYuNi0yMDYuNnoiXQogICAgfTsKICAgIGZhVXNlckFsdFNsYXNoID0gZmFVc2VyU2xhc2g7CiAgICBmYVVzZXJMYXJnZVNsYXNoID0gZmFVc2VyU2xhc2g7CiAgICBmYUFycm93TGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy1sZWZ0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbODU5Ml0sICJmMDYwIiwgIk05LjQgMjMzLjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zbDE2MCAxNjBjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBzMTIuNS0zMi44IDAtNDUuM0wxMDkuMyAyODggNDgwIDI4OGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMzcwLjcgMCAxMDUuNC0xMDUuNGMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMGwtMTYwIDE2MHoiXQogICAgfTsKICAgIGZhVmlhbFZpcnVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZpYWwtdmlydXMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTU5NyIsICJNNjQgMzJDNjQgMTQuMyA3OC4zIDAgOTYgMEwzMjAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwwIDE1MS43Yy0xOC41IDAtMzcgNy01MS4xIDIxLjEtMjEuNiAyMS42LTI2LjYgNTMuNi0xNSA3OS45LTI2LjkgMTAuNC00NS45IDM2LjYtNDUuOSA2Ny4xczE5IDU2LjcgNDUuOSA2Ny4xYy03LjMgMTYuNS04IDM1LjItMi4zIDUyLjItMTMuNCA1LjctMjguMiA4LjgtNDMuNiA4LjgtNjEuOSAwLTExMi01MC4xLTExMi0xMTJMOTYgNjRDNzguMyA2NCA2NCA0OS43IDY0IDMyem05NiAzMmwwIDEyOCA5NiAwIDAtMTI4LTk2IDB6TTI4MCA0MDhjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRjMjguOCAwIDQzLjItMzQuOCAyMi45LTU1LjItOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwYzIwLjQgMjAuNCA1NS4yIDUuOSA1NS4yLTIyLjkgMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGMwIDI4LjggMzQuOCA0My4yIDU1LjIgMjIuOSA5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjljLTIwLjQgMjAuNC01LjkgNTUuMiAyMi45IDU1LjIgMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRjLTI4LjggMC00My4yIDM0LjgtMjIuOSA1NS4yIDkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBjLTIwLjQtMjAuNC01NS4yLTUuOS01NS4yIDIyLjkgMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRjMC0yOC44LTM0LjgtNDMuMi01NS4yLTIyLjktOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWMyMC40LTIwLjQgNS45LTU1LjItMjIuOS01NS4yem0xMDQtMzJhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4em04OCA0MGEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAweiJdCiAgICB9OwogICAgZmFDaGVja0RvdWJsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGVjay1kb3VibGUiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjU2MCIsICJNMjQ5LjkgNjYuOGMxMC40LTE0LjMgNy4yLTM0LjMtNy4xLTQ0LjdzLTM0LjMtNy4yLTQ0LjcgNy4xbC0xMDYgMTQ1LjctMzcuNS0zNy41Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2w2NCA2NGM2LjYgNi42IDE1LjggMTAgMjUuMSA5LjNzMTcuOS01LjUgMjMuNC0xMy4xbDEyOC0xNzZ6bTEyOCAxMzZjMTAuNC0xNC4zIDcuMi0zNC4zLTcuMS00NC43cy0zNC4zLTcuMi00NC43IDcuMWwtMTcwIDIzMy43LTY5LjUtNjkuNWMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNsOTYgOTZjNi42IDYuNiAxNS44IDEwIDI1LjEgOS4zczE3LjktNS41IDIzLjQtMTMuMWwxOTItMjY0eiJdCiAgICB9OwogICAgZmFQYXcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGF3IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxYjAiLCAiTTIzNC41IDkyLjljMTQuMyA0Mi45LS4zIDg2LjItMzIuNiA5Ni44cy03MC4xLTE1LjYtODQuNC01OC41IC4zLTg2LjIgMzIuNi05Ni44IDcwLjEgMTUuNiA4NC40IDU4LjV6TTEwMC40IDE5OC42YzE4LjkgMzIuNCAxNC4zIDcwLjEtMTAuMiA4NC4xcy01OS43LS45LTc4LjUtMzMuMy0xNC4zLTcwLjEgMTAuMi04NC4xIDU5LjcgLjkgNzguNSAzMy4zek02OS4yIDQwMS4yQzEyMS42IDI1OS45IDIxNC43IDIyNCAyNTYgMjI0czEzNC40IDM1LjkgMTg2LjggMTc3LjJjMy42IDkuNyA1LjIgMjAuMSA1LjIgMzAuNWwwIDEuNmMwIDI1LjgtMjAuOSA0Ni43LTQ2LjcgNDYuNy0xMS41IDAtMjIuOS0xLjQtMzQtNC4ybC04OC0yMmMtMTUuMy0zLjgtMzEuMy0zLjgtNDYuNiAwbC04OCAyMmMtMTEuMSAyLjgtMjIuNSA0LjItMzQgNC4yLTI1LjggMC00Ni43LTIwLjktNDYuNy00Ni43bDAtMS42YzAtMTAuNCAxLjYtMjAuOCA1LjItMzAuNXpNNDIxLjggMjgyLjdjLTI0LjUtMTQtMjkuMS01MS43LTEwLjItODQuMXM1NC00Ny4zIDc4LjUtMzMuMyAyOS4xIDUxLjcgMTAuMiA4NC4xLTU0IDQ3LjMtNzguNSAzMy4zek0zMTAuMSAxODkuN2MtMzIuMy0xMC42LTQ2LjktNTMuOS0zMi42LTk2LjhzNTIuMS02OS4xIDg0LjQtNTguNSA0Ni45IDUzLjkgMzIuNiA5Ni44LTUyLjEgNjkuMS04NC40IDU4LjV6Il0KICAgIH07CiAgICBmYUhlbG1ldFNhZmV0eSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoZWxtZXQtc2FmZXR5IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImhhcmQtaGF0IiwgImhhdC1oYXJkIl0sICJmODA3IiwgIk0zNTIgMjY0bDAtMjAwYzAtMTcuNy0xNC4zLTMyLTMyLTMybC02NCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDIwMGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTE4NS45QzkwIDEwOS44IDMyIDE5MS44IDMyIDI4OGwwIDY0IDUxMiAwIDAtNjRjLTEtOTUuMi01OC40LTE3Ny43LTE0NC0yMDkuOEw0MDAgMjY0YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0ek00MCA0MDBjLTIyLjEgMC00MCAxNy45LTQwIDQwczE3LjkgNDAgNDAgNDBsNDk2IDBjMjIuMSAwIDQwLTE3LjkgNDAtNDBzLTE3LjktNDAtNDAtNDBMNDAgNDAweiJdCiAgICB9OwogICAgZmFIYXJkSGF0ID0gZmFIZWxtZXRTYWZldHk7CiAgICBmYUhhdEhhcmQgPSBmYUhlbG1ldFNhZmV0eTsKICAgIGZhRSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJlIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbMTAxXSwgIjQ1IiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0TDAgNDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMybDI1NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0yMjQgMCAwLTEyOCAxNjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTYwIDAgMC0xMjggMjI0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgMzJ6Il0KICAgIH07CiAgICBmYUZhY2VMYXVnaFNxdWludDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1sYXVnaC1zcXVpbnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsibGF1Z2gtc3F1aW50Il0sICJmNTliIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMTA3LjcgMzMyLjFDMTAyIDMxOCAxMTMuNCAzMDQgMTI4LjYgMzA0bDI1NC45IDBjMTUuMiAwIDI2LjYgMTQgMjAuOSAyOC4xLTIzLjggNTguNi04MS4yIDk5LjktMTQ4LjMgOTkuOXMtMTI0LjYtNDEuMy0xNDguMy05OS45em0xNS0xODguOGM0LjUtNi44IDEzLjMtOS4yIDIwLjYtNS41bDc5LjYgNDBjNS40IDIuNyA4LjggOC4yIDguOCAxNC4zcy0zLjQgMTEuNi04LjggMTQuM2wtNzkuNiA0MGMtNy4zIDMuNi0xNi4xIDEuMy0yMC42LTUuNXMtMy4xLTE1LjkgMy4xLTIxLjFMMTU5IDE5MiAxMjUuOCAxNjQuM2MtNi4yLTUuMi03LjYtMTQuMy0zLjEtMjEuMXptMjYzLjYgMjEuMUwzNTMgMTkyIDM4Ni4yIDIxOS43YzYuMiA1LjIgNy42IDE0LjMgMy4xIDIxLjFzLTEzLjMgOS4yLTIwLjYgNS41bC03OS42LTQwYy01LjQtMi43LTguOC04LjItOC44LTE0LjNzMy40LTExLjYgOC44LTE0LjNsNzkuNi00MGM3LjMtMy42IDE2LjEtMS4zIDIwLjYgNS41czMuMSAxNS45LTMuMSAyMS4xeiJdCiAgICB9OwogICAgZmFMYXVnaFNxdWludDIgPSBmYUZhY2VMYXVnaFNxdWludDI7CiAgICBmYURvd25MZWZ0QW5kVXBSaWdodFRvQ2VudGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRvd24tbGVmdC1hbmQtdXAtcmlnaHQtdG8tY2VudGVyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImNvbXByZXNzLWFsdCJdLCAiZjQyMiIsICJNNDM5LjUgN2M5LjQtOS40IDI0LjYtOS40IDMzLjkgMGwzMiAzMmM5LjQgOS40IDkuNCAyNC42IDAgMzMuOWwtODcgODcgMzkgMzljNi45IDYuOSA4LjkgMTcuMiA1LjIgMjYuMlM0NTAuMiAyNDAgNDQwLjUgMjQwbC0xNDQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC0xNDRjMC05LjcgNS44LTE4LjUgMTQuOC0yMi4yczE5LjMtMS43IDI2LjIgNS4ybDM5IDM5IDg3LTg3ek03Mi41IDI3MmwxNDQgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDE0NGMwIDkuNy01LjggMTguNS0xNC44IDIyLjJzLTE5LjMgMS43LTI2LjItNS4ybC0zOS0zOS04NyA4N2MtOS40IDkuNC0yNC42IDkuNC0zMy45IDBsLTMyLTMyYy05LjQtOS40LTkuNC0yNC42IDAtMzMuOWw4Ny04Ny0zOS0zOWMtNi45LTYuOS04LjktMTcuMi01LjItMjYuMlM2Mi44IDI3MiA3Mi41IDI3MnoiXQogICAgfTsKICAgIGZhQ29tcHJlc3NBbHQgPSBmYURvd25MZWZ0QW5kVXBSaWdodFRvQ2VudGVyOwogICAgZmFHaWZ0cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnaWZ0cyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNzljIiwgIk0yMDItMzAuNmMxMi41IDQuNCAxOSAxOC4xIDE0LjYgMzAuNmwtOC4yIDIzLjEgMjUuNC0xOC41YzEwLjctNy44IDI1LjctNS40IDMzLjUgNS4zczUuNCAyNS43LTUuMyAzMy41TDIzMy44IDY0IDI3MiA2NGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDIuMWMtNTQuNyAxMC40LTk2IDU4LjQtOTYgMTE2bDAgMS45YzAgOC45IDEgMTcuNSAyLjggMjUuOS0xMS45IDE3LjgtMTguOCAzOS4xLTE4LjggNjIuMWwwIDEyOGMwIDIzLjggNy40IDQ1LjkgMjAuMSA2NEw0OCA1MTJjLTI2LjUgMC00OC0yMS41LTQ4LTQ4TDAgMTEyQzAgODUuNSAyMS41IDY0IDQ4IDY0bDM4LjIgMC0yOC4zLTIwLjZDNDcuMiAzNS42IDQ0LjggMjAuNiA1Mi42IDkuOVM3NS40LTMuMiA4Ni4xIDQuNmwyNy40IDIwLTguMy0yNUMxMDEtMTMgMTA3LjgtMjYuNiAxMjAuNC0zMC44czI2LjIgMi42IDMwLjQgMTUuMmw5LjkgMjkuOCAxMC43LTMwLjJjNC40LTEyLjUgMTguMS0xOSAzMC42LTE0LjZ6TTQ4OS45IDIwOGMtNy41IDAtMTQuNSAzLjgtMTguNiAxMC4xTDQ0Ni45IDI1NiA0ODggMjU2YzEzLjMgMCAyNC0xMC43IDI0LTI0bDAtMS45YzAtMTIuMi05LjktMjIuMS0yMi4xLTIyLjF6TTM4NS4xIDI1NmwtMjQuNC0zNy45Yy00LjEtNi4zLTExLjEtMTAuMS0xOC42LTEwLjEtMTIuMiAwLTIyLjEgOS45LTIyLjEgMjIuMWwwIDEuOWMwIDEzLjMgMTAuNyAyNCAyNCAyNGw0MS4xIDB6TTI4MS45IDI2OC41Yy02LjMtMTAuNy05LjktMjMuMi05LjktMzYuNWwwLTEuOWMwLTM4LjcgMzEuNC03MC4xIDcwLjEtNzAuMSAyMy44IDAgNDYgMTIuMSA1OC45IDMyLjFsMTUgMjMuMiAxNS0yMy4yYzEyLjktMjAgMzUuMS0zMi4xIDU4LjktMzIuMSAzOC43IDAgNzAuMSAzMS40IDcwLjEgNzAuMWwwIDEuOWMwIDEzLjMtMy42IDI1LjgtOS45IDM2LjUgMTUuNyAxMS43IDI1LjkgMzAuNCAyNS45IDUxLjVsMCAxMjhjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTcyIDAgMC0yMDgtNDggMCAwIDIwOC03MiAwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTEyOGMwLTIxLjEgMTAuMi0zOS44IDI1LjktNTEuNXoiXQogICAgfTsKICAgIGZhQmVkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJlZCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyODcxNl0sICJmMjM2IiwgIk0zMiAzMmMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDIyNCAyMjQgMCAwLTEyOGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwxNjAgMGM1MyAwIDk2IDQzIDk2IDk2bDAgMjI0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNjQtNDQ4IDAgMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMlMwIDQ2NS43IDAgNDQ4TDAgNjRDMCA0Ni4zIDE0LjMgMzIgMzIgMzJ6bTgwIDE2MGE2NCA2NCAwIDEgMSAxMjggMCA2NCA2NCAwIDEgMSAtMTI4IDB6Il0KICAgIH07CiAgICBmYU1vbmV5QmlsbFRyYW5zZmVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vbmV5LWJpbGwtdHJhbnNmZXIiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTUyOCIsICJNMzEgMTA1Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOUwxMDMtMWM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHM5LjQgMjQuNiAwIDMzLjlsLTMxIDMxIDY3LjcgMCAwIDAgMzM4LjMgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDE3OC4yLTUuMS01LjFjLTI4LjEtMjguMS03My43LTI4LjEtMTAxLjggMC0yNy4yIDI3LjItMjguMSA3MC42LTIuOCA5OC45bDY3LjcgMC0zMS0zMWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDcyIDcyYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45bC03MiA3MmMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWwzMS0zMS00MDYuMSAwYy0zNS4zIDAtNjQtMjguNy02NC02NGwwLTE3OC4yIDUuMSA1LjFjMjguMSAyOC4xIDczLjcgMjguMSAxMDEuOCAwIDI3LjItMjcuMiAyOC4xLTcwLjYgMi44LTk4LjlsLTY3LjcgMCAzMSAzMWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwTDMxIDEwNXpNNDE2IDI1NmE5NiA5NiAwIDEgMCAtMTkyIDAgOTYgOTYgMCAxIDAgMTkyIDB6bTg4LTY0LjVjNC40IC41IDgtMy4xIDgtNy41bDAtNDhjMC00LjQtMy42LTgtOC04bC00OCAwYy00LjQgMC04LjEgMy42LTcuNSA4IDMuNiAyOSAyNi42IDUxLjkgNTUuNSA1NS41em0tMzY4IDEyOWMtNC40LS41LTggMy4xLTggNy41bDAgNDhjMCA0LjQgMy42IDggOCA4bDQ4IDBjNC40IDAgOC4xLTMuNiA3LjUtOC0zLjYtMjktMjYuNi01MS45LTU1LjUtNTUuNXoiXQogICAgfTsKICAgIGZhUGVyc29uUnVubmluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tcnVubmluZyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyNzkzOSwgInJ1bm5pbmciXSwgImY3MGMiLCAiTTI1Ni41LTMyYTU2IDU2IDAgMSAxIDAgMTEyIDU2IDU2IDAgMSAxIDAtMTEyek0xMjMuNiAxNzZjLTMuMyAwLTYuMiAyLTcuNCA1TDk0LjIgMjM1LjljLTYuNiAxNi40LTI1LjIgMjQuNC00MS42IDE3LjhzLTI0LjQtMjUuMi0xNy44LTQxLjZsMjEuOS01NC45QzY3LjcgMTI5LjkgOTQuMSAxMTIgMTIzLjYgMTEybDk3LjMgMGMyOC41IDAgNTQuOCAxNS4xIDY5LjEgMzkuN2wzMi44IDU2LjMgNjEuNiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC02MS42IDBjLTIyLjggMC00My44LTEyLjEtNTUuMy0zMS44bC0xMC0xNy4xLTIwLjcgNzAuNCA3NS40IDIyLjZjMjcuNyA4LjMgNDEuOCAzOSAzMC4xIDY1LjVMMjg1LjcgNTA5Yy03LjIgMTYuMi0yNi4xIDIzLjQtNDIuMiAxNi4ycy0yMy40LTI2LjEtMTYuMi00Mi4ybDQ5LjItMTEwLjgtOTUuOS0yOC44Yy0zMi43LTkuOC01Mi00My43LTQzLjctNzYuOGwyMi43LTkwLjYtMzUuOSAwem0tOCAxODFjMTMuMyAxNC45IDMwLjcgMjYuMyA1MS4yIDMyLjRsNC43IDEuNC02LjkgMTkuM2MtNS44IDE2LjMtMTYgMzAuOC0yOS4zIDQxLjhMNTIuOSA1MTkuOGMtMTMuNiAxMS4yLTMzLjggOS4zLTQ1LTQuM3MtOS4zLTMzLjggNC4zLTQ1bDgyLjQtNjcuOWM0LjUtMy43IDcuOC04LjUgOS44LTEzLjlMMTE1LjYgMzU3eiJdCiAgICB9OwogICAgZmFSdW5uaW5nID0gZmFQZXJzb25SdW5uaW5nOwogICAgZmFDaXJjbGVDaGV2cm9uRG93biA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtY2hldnJvbi1kb3duIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImNoZXZyb24tY2lyY2xlLWRvd24iXSwgImYxM2EiLCAiTTI1NiAwYTI1NiAyNTYgMCAxIDAgMCA1MTIgMjU2IDI1NiAwIDEgMCAwLTUxMnpNMTM1IDI0MWMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDg3IDg3IDg3LTg3YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOUwyNzMgMzQ1Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMEwxMzUgMjQxeiJdCiAgICB9OwogICAgZmFDaGV2cm9uQ2lyY2xlRG93biA9IGZhQ2lyY2xlQ2hldnJvbkRvd247CiAgICBmYVVzZXJOdXJzZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1c2VyLW51cnNlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY4MmYiLCAiTTk2IDQ0LjljMC0xMi43IDcuNS0yNC4yIDE5LjItMjkuM2w5Ni00MmM4LjItMy42IDE3LjUtMy42IDI1LjcgMGw5NiA0MkMzNDQuNSAyMC43IDM1MiAzMi4yIDM1MiA0NC45bDAgOTkuMWMwIDcwLjctNTcuMyAxMjgtMTI4IDEyOFM5NiAyMTQuNyA5NiAxNDRsMC05OS4xek0zMDQgMTI4bC0xMTEuNiAwLS40IDAtNDggMCAwIDE2YzAgNDQuMiAzNS44IDgwIDgwIDgwczgwLTM1LjggODAtODBsMC0xNnpNMjA4IDE2bDAgMTYtMTYgMGMtNC40IDAtOCAzLjYtOCA4bDAgMTZjMCA0LjQgMy42IDggOCA4bDE2IDAgMCAxNmMwIDQuNCAzLjYgOCA4IDhsMTYgMGM0LjQgMCA4LTMuNiA4LThsMC0xNiAxNiAwYzQuNCAwIDgtMy42IDgtOGwwLTE2YzAtNC40LTMuNi04LTgtOGwtMTYgMCAwLTE2YzAtNC40LTMuNi04LTgtOEwyMTYgOGMtNC40IDAtOCAzLjYtOCA4ek0xNDIuNiAzMjNjLTYuNS00LjktMTUuMi02LjItMjIuNi0yLjgtNjEuNCAyOC4yLTEwNC4xIDkwLjItMTA0LjEgMTYyLjEgMCAxNi40IDEzLjMgMjkuNyAyOS43IDI5LjdsMzU2LjYgMGMxNi40IDAgMjkuNy0xMy4zIDI5LjctMjkuNyAwLTcyLTQyLjctMTM0LTEwNC4xLTE2Mi4xLTcuNC0zLjQtMTYuMS0yLjEtMjIuNiAyLjhsLTY3IDUwLjJjLTguNSA2LjQtMjAuMyA2LjQtMjguOCAwbC02Ny01MC4yeiJdCiAgICB9OwogICAgZmFGYWNlS2lzc1dpbmtIZWFydDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1raXNzLXdpbmstaGVhcnQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjg1MzYsICJraXNzLXdpbmstaGVhcnQiXSwgImY1OTgiLCAiTTU0My43IDI2OC4zYy4yLTQuMSAuMy04LjIgLjMtMTIuMyAwLTE0MS40LTExNC42LTI1Ni0yNTYtMjU2UzMyIDExNC42IDMyIDI1NiAxNDYuNiA1MTIgMjg4IDUxMmM0MS40IDAgODAuNS05LjggMTE1LjEtMjcuMy03LjYtMTcuMS0xNi4xLTM4LjgtMjEuOC02MS43LTcuNy0zMC41LTE0LjEtNzYuMiA4LjItMTE0LjdsMi43LTQuNmMyOS41LTUxIDk0LjctNjguNSAxNDUuNy0zOSAyIDEuMiA0IDIuNCA1LjkgMy43ek0yNDAgMzA0YzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4IDAgMTIuMy00LjYgMjMuNS0xMi4yIDMyIDcuNiA4LjUgMTIuMiAxOS43IDEyLjIgMzIgMCAyNi41LTIxLjUgNDgtNDggNDhsLTMyIDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsMTYgMGM4LjggMCAxNi03LjIgMTYtMTZzLTcuMi0xNi0xNi0xNmwtMTYgMGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNmwxNiAwYzguOCAwIDE2LTcuMiAxNi0xNnMtNy4yLTE2LTE2LTE2bC0xNiAwYy04LjggMC0xNi03LjItMTYtMTZ6TTIwOCAxNzZhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em0xNTIgMjBjLTExIDAtMjAgOS0yMCAyMHMtOSAyMC0yMCAyMC0yMC05LTIwLTIwYzAtMzMuMSAyNi45LTYwIDYwLTYwbDE2IDBjMzMuMSAwIDYwIDI2LjkgNjAgNjAgMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwLTktMjAtMjAtMjBsLTE2IDB6TTU0Mi44IDM1MGMtMi4yLTE4LjMtMTIuOS0zNC42LTI4LjktNDMuOC0yOC4xLTE2LjItNjMuOS02LjYtODAuMSAyMS41bC0yLjcgNC42Yy0yNC41IDQyLjUgNy45IDExNy45IDI0LjQgMTUwLjggNS4xIDEwLjEgMTUuNSAxNi4xIDI2LjggMTUuNSAzNi43LTIuMiAxMTguMi0xMS43IDE0Mi44LTU0LjJsMi43LTQuNmMxNi4yLTI4LjEgNi42LTYzLjktMjEuNS04MC4xLTE2LTkuMi0zNS40LTEwLjQtNTIuNC0zLjFsLTkuOCA0LjItMS4zLTEwLjZ6Il0KICAgIH07CiAgICBmYUtpc3NXaW5rSGVhcnQyID0gZmFGYWNlS2lzc1dpbmtIZWFydDI7CiAgICBmYUZpbGwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsbCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNTc1IiwgIk0yOTYgNjRjNi45IDAgMTMuNSAyLjcgMTguMyA3LjZMNDQwLjQgMTk3LjdjNC45IDQuOSA3LjYgMTEuNSA3LjYgMTguM3MtMi43IDEzLjUtNy42IDE4LjNMMzg2LjcgMjg4IDY1LjMgMjg4YzEuMy0zLjkgMy40LTcuNCA2LjMtMTAuM2w5Ni40LTk2LjQgMzMuNCAzMy40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNMMjEzLjMgMTM2IDI3Ny43IDcxLjZjNC45LTQuOSAxMS41LTcuNiAxOC4zLTcuNnpNMTIyLjcgMTM2TDI2LjMgMjMyLjRDOS41IDI0OS4zIDAgMjcyLjEgMCAyOTZzOS41IDQ2LjcgMjYuMyA2My42TDE1Mi40IDQ4NS43QzE2OS4zIDUwMi41IDE5Mi4xIDUxMiAyMTYgNTEyczQ2LjctOS41IDYzLjYtMjYuM0w0ODUuNyAyNzkuNkM1MDIuNSAyNjIuNyA1MTIgMjM5LjkgNTEyIDIxNnMtOS41LTQ2LjctMjYuMy02My42TDM1OS42IDI2LjNDMzQyLjcgOS41IDMxOS45IDAgMjk2IDBzLTQ2LjcgOS41LTYzLjYgMjYuM0wxNjggOTAuNyAxMTguNiA0MS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM0wxMjIuNyAxMzZ6Il0KICAgIH07CiAgICBmYU1vbmV5QmlsbDFXYXZlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vbmV5LWJpbGwtMS13YXZlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbIm1vbmV5LWJpbGwtd2F2ZS1hbHQiXSwgImY1M2IiLCAiTTAgMTA5LjVMMCA0MTkuNmMwIDE5LjQgMTEuOCAzNy4zIDMwLjMgNDMuMyA5NCAzMCAxNTguOCA4LjQgMjIzLjMtMTMuMSA2Mi40LTIwLjggMTI0LjQtNDEuNSAyMTIuMS0xNS4zIDIyLjIgNi42IDQ2LjItOC44IDQ2LjItMzJsMC0zMTAuMWMwLTE5LjQtMTEuOC0zNy4zLTMwLjMtNDMuMy05NC0zMC0xNTguOC04LjQtMjIzLjMgMTMuMS02Mi40IDIwLjgtMTI0LjQgNDEuNS0yMTIuMSAxNS4zLTIyLjItNi42LTQ2LjMgOC44LTQ2LjMgMzJ6TTI1NiAzNjhjLTUzIDAtOTYtNTAuMS05Ni0xMTJzNDMtMTEyIDk2LTExMiA5NiA1MC4xIDk2IDExMi00MyAxMTItOTYgMTEyek0xMjcuMSA0MDUuNWMuNyA0LjQtMi44IDguMS03LjIgOC4xLTE1LjcgMC0zMi4xLTEuOC01MC02LjEtMy41LS44LTYtNC02LTcuN0w2NCAzNjBjMC00LjQgMy42LTguMSA4LTcuNSAyOC4xIDMuNSA1MC42IDI1LjIgNTUuMiA1M3pNNDQ4IDM1NC42YzAgNS00LjYgOC44LTkuNSA4LTE1LjQtMi41LTMwLjItMy45LTQ0LjQtNC4zLTQuOS0uMS04LjctNC41LTcuMi05LjIgNy4zLTIzLjcgMjgtNDEuNCA1My4yLTQ0LjYgNC40LS41IDggMy4xIDggNy41bDAgNDIuNnptLTgtMTk1LjFjLTI4LjEtMy41LTUwLjYtMjUuMi01NS4yLTUzLS43LTQuNCAyLjgtOC4xIDcuMi04LjEgMTUuNyAwIDMyLjEgMS44IDUwIDYuMSAzLjUgLjggNiA0IDYgNy43bDAgMzkuOWMwIDQuNC0zLjYgOC4xLTggNy41em0tMzIyLjEtNS44YzQuOSAuMSA4LjcgNC41IDcuMiA5LjItNy4zIDIzLjctMjggNDEuNC01My4yIDQ0LjYtNC40IC41LTgtMy4xLTgtNy41bDAtNDIuNmMwLTUgNC42LTguOCA5LjUtOCAxNS40IDIuNSAzMC4yIDMuOSA0NC40IDQuM3pNMjQwIDE4OGMtMTEgMC0yMCA5LTIwIDIwIDAgOS43IDYuOSAxNy43IDE2IDE5LjZsMCA0OC40LTQgMGMtMTEgMC0yMCA5LTIwIDIwczkgMjAgMjAgMjBsNDggMGMxMSAwIDIwLTkgMjAtMjBzLTktMjAtMjAtMjBsLTQgMCAwLTY4YzAtMTEtOS0yMC0yMC0yMGwtMTYgMHoiXQogICAgfTsKICAgIGZhTW9uZXlCaWxsV2F2ZUFsdCA9IGZhTW9uZXlCaWxsMVdhdmU7CiAgICBmYUxhbmRtYXJrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxhbmRtYXJrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3OTYzXSwgImY2NmYiLCAiTTIzOC43IDUuMWMxMC41LTYuOCAyNC4xLTYuOCAzNC42IDBsMjI0IDE0NGMxMS45IDcuNyAxNy40IDIyLjMgMTMuNCAzNS45cy0xNi41IDIzLTMwLjcgMjNsLTMyIDAgMCAyMDggNTEuMiAzOC40YzguMSA2IDEyLjggMTUuNSAxMi44IDI1LjYgMCAxNy43LTE0LjMgMzItMzIgMzJMMzIgNTEyYy0xNy43IDAtMzItMTQuMy0zMi0zMiAwLTEwLjEgNC43LTE5LjYgMTIuOC0yNS42bDUxLjItMzguNCAwIDAgMC0yMDgtMzIgMGMtMTQuMiAwLTI2LjctOS40LTMwLjctMjNzMS41LTI4LjMgMTMuNC0zNS45bDIyNC0xNDR6TTMzNiAyMDhsMCAyMDggNjQgMCAwLTIwOC02NCAwek0yMjQgNDE2bDY0IDAgMC0yMDgtNjQgMCAwIDIwOHpNMTEyIDIwOGwwIDIwOCA2NCAwIDAtMjA4LTY0IDB6Il0KICAgIH07CiAgICBmYU11c2ljID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm11c2ljIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI3OTI1XSwgImYwMDEiLCAiTTQ2OCA3YzcuNiA2LjEgMTIgMTUuMyAxMiAyNWwwIDMwNGMwIDQ0LjItNDMgODAtOTYgODBzLTk2LTM1LjgtOTYtODAgNDMtODAgOTYtODBjMTEuMiAwIDIyIDEuNiAzMiA0LjZsMC0xMTYuNy0yMjQgNDkuOCAwIDIwNi4zYzAgNDQuMi00MyA4MC05NiA4MHMtOTYtMzUuOC05Ni04MCA0My04MCA5Ni04MGMxMS4yIDAgMjIgMS42IDMyIDQuNkwxMjggOTZjMC0xNSAxMC40LTI4IDI1LjEtMzEuMmwyODgtNjRjOS41LTIuMSAxOS40IC4yIDI3IDYuM3oiXQogICAgfTsKICAgIGZhQm9va01lZGljYWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm9vay1tZWRpY2FsIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY3ZTYiLCAiTTk2IDUxMmwzMjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwwLTY2LjdjMTguNi02LjYgMzItMjQuNCAzMi00NS4zbDAtMjg4YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4TDk2IDBDNDMgMCAwIDQzIDAgOTZMMCA0MTZjMCA1MyA0MyA5NiA5NiA5NnpNNjQgNDE2YzAtMTcuNyAxNC4zLTMyIDMyLTMybDI1NiAwIDAgNjQtMjU2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyek0xOTIgMTIwYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDQwIDQwIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC00MCAwIDAgNDBjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC00MC00MCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsNDAgMCAwLTQweiJdCiAgICB9OwogICAgZmFTaHVmZmxlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNodWZmbGUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgyNTYsICJyYW5kb20iXSwgImYwNzQiLCAiTTQwMy44IDM0LjRjMTItNSAyNS43LTIuMiAzNC45IDYuOWw2NCA2NGM2IDYgOS40IDE0LjEgOS40IDIyLjZzLTMuNCAxNi42LTkuNCAyMi42bC02NCA2NGMtOS4yIDkuMi0yMi45IDExLjktMzQuOSA2LjlTMzg0IDIwNC45IDM4NCAxOTJsMC0zMi0zMiAwYy0xMC4xIDAtMTkuNiA0LjctMjUuNiAxMi44bC0zMi40IDQzLjItNDAtNTMuMyAyMS4yLTI4LjNDMjkzLjMgMTEwLjIgMzIxLjggOTYgMzUyIDk2bDMyIDAgMC0zMmMwLTEyLjkgNy44LTI0LjYgMTkuOC0yOS42ek0xNTQgMjk2bDQwIDUzLjMtMjEuMiAyOC4zQzE1NC43IDQwMS44IDEyNi4yIDQxNiA5NiA0MTZsLTY0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsNjQgMGMxMC4xIDAgMTkuNi00LjcgMjUuNi0xMi44TDE1NCAyOTZ6TTQzOC42IDQ3MC42Yy05LjIgOS4yLTIyLjkgMTEuOS0zNC45IDYuOVMzODQgNDYwLjkgMzg0IDQ0OGwwLTMyLTMyIDBjLTMwLjIgMC01OC43LTE0LjItNzYuOC0zOC40TDEyMS42IDE3Mi44Yy02LTguMS0xNS41LTEyLjgtMjUuNi0xMi44bC02NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMlMxNC4zIDk2IDMyIDk2bDY0IDBjMzAuMiAwIDU4LjcgMTQuMiA3Ni44IDM4LjRMMzI2LjQgMzM5LjJjNiA4LjEgMTUuNSAxMi44IDI1LjYgMTIuOGwzMiAwIDAtMzJjMC0xMi45IDcuOC0yNC42IDE5LjgtMjkuNnMyNS43LTIuMiAzNC45IDYuOWw2NCA2NGM2IDYgOS40IDE0LjEgOS40IDIyLjZzLTMuNCAxNi42LTkuNCAyMi42bC02NCA2NHoiXQogICAgfTsKICAgIGZhUmFuZG9tID0gZmFTaHVmZmxlOwogICAgZmFVbmRlcmxpbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidW5kZXJsaW5lIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYwY2QiLCAiTTAgMzJDMCAxNC4zIDE0LjMgMCAzMiAwTDk2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJTMTEzLjcgNjQgOTYgNjRsMCAxNjBjMCA1MyA0MyA5NiA5NiA5NnM5Ni00MyA5Ni05NmwwLTE2MGMtMTcuNyAwLTMyLTE0LjMtMzItMzJTMjcwLjMgMCAyODggMGw2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybDAgMTYwYzAgODguNC03MS42IDE2MC0xNjAgMTYwUzMyIDMxMi40IDMyIDIyNEwzMiA2NEMxNC4zIDY0IDAgNDkuNyAwIDMyek0wIDQ4MGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzMjAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA1MTJjLTE3LjcgMC0zMi0xNC4zLTMyLTMyeiJdCiAgICB9OwogICAgZmFCdWlsZGluZ1VzZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnVpbGRpbmctdXNlciIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNGRhIiwgIk02NCA2NEM2NCAyOC43IDkyLjcgMCAxMjggMEwzODQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDEyMS4zYy00Ni45IDE5LTgwIDY1LTgwIDExOC43IDAgMjcuNyA4LjggNTMuNCAyMy44IDc0LjQtNTEuNSAyMS04Ny44IDcxLjYtODcuOCAxMzAuNyAwIDEgMCAxLjkgMCAyLjlsLTE3NiAwYy0zNS4zIDAtNjQtMjguNy02NC02NEw2NCA2NHpNMjA4IDQwMGwwIDY0IDUzLjQgMGM3LjItMjkuNCAyMS4zLTU2LjEgNDAuNC03OC4zLTYuMS0xOS41LTI0LjMtMzMuNy00NS44LTMzLjctMjYuNSAwLTQ4IDIxLjUtNDggNDh6TTMzOSAyMjQuM2MtMS0uMi0yLS4zLTMtLjNsLTMyIDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwxNi43IDBjMi4xLTIyLjggOC40LTQ0LjMgMTguMy02My43ek0xNzYgOTZjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHptMTEyIDE2bDAgMzJjMCA4LjggNy4yIDE2IDE2IDE2bDMyIDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZ6TTE3NiAyMjRjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDMyYzAgOC44IDcuMiAxNiAxNiAxNmwzMiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTMyYzAtOC44LTcuMi0xNi0xNi0xNmwtMzIgMHptMjQwIDgwYTgwIDgwIDAgMSAxIDE2MCAwIDgwIDgwIDAgMSAxIC0xNjAgMHpNMzUyIDUxMmMwLTUzIDQzLTk2IDk2LTk2bDk2IDBjNTMgMCA5NiA0MyA5NiA5NiAwIDE3LjctMTQuMyAzMi0zMiAzMmwtMjI0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyeiJdCiAgICB9OwogICAgZmFSb2JvdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyb2JvdCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzEyOTMwMl0sICJmNTQ0IiwgIk0zNTIgMGMwLTE3LjctMTQuMy0zMi0zMi0zMlMyODgtMTcuNyAyODggMGwwIDY0LTk2IDBjLTUzIDAtOTYgNDMtOTYgOTZsMCAyMjRjMCA1MyA0MyA5NiA5NiA5NmwyNTYgMGM1MyAwIDk2LTQzIDk2LTk2bDAtMjI0YzAtNTMtNDMtOTYtOTYtOTZsLTk2IDAgMC02NHpNMTYwIDM2OGMwLTEzLjMgMTAuNy0yNCAyNC0yNGwzMiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0zMiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHptMTIwIDBjMC0xMy4zIDEwLjctMjQgMjQtMjRsMzIgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMzIgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjR6bTEyMCAwYzAtMTMuMyAxMC43LTI0IDI0LTI0bDMyIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTMyIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0ek0yMjQgMTc2YTQ4IDQ4IDAgMSAxIDAgOTYgNDggNDggMCAxIDEgMC05NnptMTQ0IDQ4YTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6TTY0IDIyNGMwLTE3LjctMTQuMy0zMi0zMi0zMlMwIDIwNi4zIDAgMjI0bDAgOTZjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTk2em01NDQtMzJjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgOTZjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTk2YzAtMTcuNy0xNC4zLTMyLTMyLTMyeiJdCiAgICB9OwogICAgZmFQbHVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBsdXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMDEzMywgNjE1NDMsICJhZGQiXSwgIjJiIiwgIk0yNTYgNjRjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAxNjAtMTYwIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMTYwIDAgMCAxNjBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTE2MCAxNjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTYwIDAgMC0xNjB6Il0KICAgIH07CiAgICBmYUFkZCA9IGZhUGx1czsKICAgIGZhQ29weTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY29weSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMGM1IiwgIk0xOTIgMGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCAyNTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTkyIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yMDAuNmMwLTE3LjQtNy4xLTM0LjEtMTkuNy00Ni4yTDM3MC42IDE3LjhDMzU4LjcgNi40IDM0Mi44IDAgMzI2LjMgMEwxOTIgMHpNNjQgMTI4Yy0zNS4zIDAtNjQgMjguNy02NCA2NEwwIDQ0OGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxOTIgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTE2LTY0IDAgMCAxNi0xOTIgMCAwLTI1NiAxNiAwIDAtNjQtMTYgMHoiXQogICAgfTsKICAgIGZhQ2hlc3NLaW5nMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGVzcy1raW5nIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbOTgxOF0sICJmNDNmIiwgIk0yMjQtMzJjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAzMiAzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0zMiAwIDAgNjQgMTUzLjggMGMyMS4xIDAgMzguMiAxNy4xIDM4LjIgMzguMiAwIDYuNC0xLjYgMTIuNy00LjcgMTguM0wzNTIgMzg0IDQwOC4yIDQ1NC4zYzUgNi4zIDcuOCAxNC4xIDcuOCAyMi4yIDAgMTkuNi0xNS45IDM1LjUtMzUuNSAzNS41TDY3LjUgNTEyYy0xOS42IDAtMzUuNS0xNS45LTM1LjUtMzUuNSAwLTguMSAyLjctMTUuOSA3LjgtMjIuMkw5NiAzODQgNC43IDIxNi42QzEuNiAyMTAuOSAwIDIwNC42IDAgMTk4LjIgMCAxNzcuMSAxNy4xIDE2MCAzOC4yIDE2MGwxNTMuOCAwIDAtNjQtMzIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwzMiAwIDAtMzJjMC0xNy43IDE0LjMtMzIgMzItMzJ6Il0KICAgIH07CiAgICBmYUhvdXNlRmxvb2RXYXRlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3VzZS1mbG9vZC13YXRlciIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTBlIiwgIk00OTYgMjA4bDQuNSAwYzE1LjIgMCAyNy41LTEyLjMgMjcuNS0yNy41IDAtNy45LTMuNC0xNS41LTkuNC0yMC43TDM0OCAxMC41QzM0MC4zIDMuNyAzMzAuMyAwIDMyMCAwcy0yMC4zIDMuNy0yOCAxMC41TDEyMS40IDE1OS44Yy02IDUuMi05LjQgMTIuOC05LjQgMjAuNyAwIDE1LjIgMTIuMyAyNy41IDI3LjUgMjcuNWw0LjUgMCAwIDk0LjRjMjAuMy05LjQgNDIuMS0xNC4yIDY0LTE0LjQgMzMuMS0uMiA2Ni4zIDEwLjIgOTQuNCAzMS40IDIyLjEgMTYuNiAyOS4xIDE2LjYgNTEuMiAwIDI3LjUtMjAuNyA1OS45LTMxLjIgOTIuNC0zMS40IDE2LjktLjEgMzMuOCAyLjYgNTAgOGwwLTg4em0tMjI0LThjMC0xMy4zIDEwLjctMjQgMjQtMjRsNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0bC00OCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTQ4ek00NzQuNiA0MTIuMWMxOSAxNC40IDQxLjkgMjguMiA2Ny4yIDMzLjMgMjYuNSA1LjQgNTQuMyAuOCA4MC43LTE5LjEgMTAuNi04IDEyLjctMjMgNC43LTMzLjZzLTIzLTEyLjctMzMuNi00LjdjLTE0LjkgMTEuMi0yOC42IDEzLjEtNDIuMyAxMC4zLTE0LjktMy0zMC45LTExLjktNDcuOC0yNC42LTM4LjQtMjktOTAuNS0yOS0xMjkgMC0yNCAxOC4xLTQwLjcgMjYuMy01NC41IDI2LjNzLTMwLjUtOC4yLTU0LjUtMjYuM2MtMzguNC0yOS05MC41LTI5LTEyOSAwLTIxLjYgMTYuMy00MS4zIDI1LjgtNTguOSAyNS43LTkuNi0uMS0xOS45LTMtMzEuMi0xMS41LTEwLjYtOC0yNS42LTUuOS0zMy42IDQuN1M3IDQxOC4zIDE3LjYgNDI2LjNjMTkuMSAxNC40IDM5LjQgMjEgNTkuOCAyMS4xIDMzLjkgLjIgNjQuMy0xNy40IDg4LjEtMzUuMyAyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAyNC4yIDE4LjMgNTIuMyAzNS45IDgzLjQgMzUuOXM1OS4xLTE3LjcgODMuNC0zNS45YzIxLjMtMTYuMSA0OS45LTE2LjEgNzEuMiAwem0tNzEuMiA5NmMyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAxOSAxNC40IDQxLjkgMjguMiA2Ny4yIDMzLjMgMjYuNSA1LjQgNTQuMyAuOCA4MC43LTE5LjEgMTAuNi04IDEyLjctMjMgNC43LTMzLjZzLTIzLTEyLjctMzMuNi00LjdjLTE0LjkgMTEuMi0yOC42IDEzLjEtNDIuMyAxMC4zLTE0LjktMy0zMC45LTExLjktNDcuOC0yNC42LTM4LjQtMjktOTAuNS0yOS0xMjkgMC0yNCAxOC4xLTQwLjcgMjYuMy01NC41IDI2LjNzLTMwLjUtOC4yLTU0LjUtMjYuM2MtMzguNC0yOS05MC41LTI5LTEyOSAwLTIxLjYgMTYuMy00MS4zIDI1LjgtNTguOSAyNS43LTkuNi0uMS0xOS45LTMtMzEuMi0xMS41LTEwLjYtOC0yNS42LTUuOS0zMy42IDQuN1M3IDUxNC4zIDE3LjYgNTIyLjNjMTkuMSAxNC40IDM5LjQgMjEgNTkuOCAyMS4xIDMzLjkgLjIgNjQuMy0xNy40IDg4LjEtMzUuMyAyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAyNC4yIDE4LjMgNTIuMyAzNS45IDgzLjQgMzUuOXM1OS4xLTE3LjcgODMuNC0zNS45eiJdCiAgICB9OwogICAgZmFCaXRjb2luU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiaXRjb2luLXNpZ24iLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZTBiNCIsICJNNjQgMjRDNjQgMTAuNyA3NC43IDAgODggMHMyNCAxMC43IDI0IDI0bDAgNDAgMzIgMCAwLTQwYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA0MS4xYzU0LjMgNy44IDk2IDU0LjQgOTYgMTEwLjkgMCAyNC4yLTcuNyA0Ni42LTIwLjcgNjQuOSAzMS43IDE5LjggNTIuNyA1NSA1Mi43IDk1LjEgMCA2MS45LTUwLjEgMTEyLTExMiAxMTJsLTE2IDAgMCA0MGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTQwLTMyIDAgMCA0MGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTQwLTIyLjMgMEMxOC43IDQ0OCAwIDQyOS4zIDAgNDA2LjNMMCAxMDEuNkMwIDgwLjggMTYuOCA2NCAzNy42IDY0TDY0IDY0IDY0IDI0em0wIDIwMGwxMTIgMGMyNi41IDAgNDgtMjEuNSA0OC00OHMtMjEuNS00OC00OC00OGwtMTEyIDAgMCA5NnptMTEyIDY0bC0xMTIgMCAwIDk2IDE0NCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4cy0yMS41LTQ4LTQ4LTQ4bC0zMiAweiJdCiAgICB9OwogICAgZmFCb3ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm94IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI4MjMwXSwgImY0NjYiLCAiTTM2OS40IDEyOGwtMzQuMy00OC0yMjIuMSAwLTM0LjMgNDggMjkwLjcgMHpNMCAxNDguNWMwLTEzLjMgNC4yLTI2LjMgMTEuOS0zNy4yTDYwLjkgNDIuOEM3Mi45IDI2IDkyLjMgMTYgMTEyLjkgMTZsMjIyLjEgMGMyMC43IDAgNDAuMSAxMCA1Mi4xIDI2LjhsNDguOSA2OC41YzcuOCAxMC45IDExLjkgMjMuOSAxMS45IDM3LjJMNDQ4IDQxNmMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTQ4LjV6Il0KICAgIH07CiAgICBmYVNxdWFyZVBsdXMyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1wbHVzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbNjE4NDYsICJwbHVzLXNxdWFyZSJdLCAiZjBmZSIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnpNMjAwIDM0NGwwLTY0LTY0IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsNjQgMCAwLTY0YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA2NCA2NCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC02NCAwIDAgNjRjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjR6Il0KICAgIH07CiAgICBmYVBsdXNTcXVhcmUyID0gZmFTcXVhcmVQbHVzMjsKICAgIGZhQXJyb3dzTGVmdFJpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93cy1sZWZ0LXJpZ2h0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImFycm93cy1oIl0sICJmMDdlIiwgIk00NzAuNiAzNzQuNmw5Ni05NmMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM2wtOTYtOTZjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zbDQxLjQgNDEuNC0zNTcuNSAwIDQxLjQtNDEuNGMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMGwtOTYgOTZjLTYgNi05LjQgMTQuMS05LjQgMjIuNnMzLjQgMTYuNiA5LjQgMjIuNmw5NiA5NmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zbC00MS40LTQxLjQgMzU3LjUgMC00MS40IDQxLjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDB6Il0KICAgIH07CiAgICBmYUFycm93c0ggPSBmYUFycm93c0xlZnRSaWdodDsKICAgIGZhRmFuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmODYzIiwgIk0xNjAgMTQ0YzAtNzkuNSA2NC41LTE0NCAxNDQtMTQ0IDguOCAwIDE2IDcuMiAxNiAxNmwwIDE1Mi4yYzE1LTUuMyAzMS4yLTguMiA0OC04LjIgNzkuNSAwIDE0NCA2NC41IDE0NCAxNDQgMCA4LjgtNy4yIDE2LTE2IDE2bC0xNTIuMiAwYzUuMyAxNSA4LjIgMzEuMiA4LjIgNDggMCA3OS41LTY0LjUgMTQ0LTE0NCAxNDQtOC44IDAtMTYtNy4yLTE2LTE2bDAtMTUyLjJjLTE1IDUuMy0zMS4yIDguMi00OCA4LjItNzkuNSAwLTE0NC02NC41LTE0NC0xNDQgMC04LjggNy4yLTE2IDE2LTE2bDE1Mi4yIDBjLTUuMy0xNS04LjItMzEuMi04LjItNDh6bTk2IDE0NGEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6Il0KICAgIH07CiAgICBmYUNyb3cgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY3JvdyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNTIwIiwgIk00NTYuNSAwYy00OC42IDAtODggMzkuNC04OCA4OGwwIDM2LTM1NS4yIDI2Ni40Qy0uOCA0MDEtMy43IDQyMSA2LjkgNDM1LjJzMzAuNiAxNyA0NC44IDYuNGw3Ni44LTU3LjYgMTMxLjMgMCA0Ni42IDExMy4xIDEgMi4yYzUuNyAxMC43IDE4LjggMTUuNSAzMC4zIDEwLjhzMTcuMy0xNy4zIDEzLjktMjlsLS44LTIuMy0zOS4xLTk0LjkgNDAuOSAwYzEuMSAwIDIuMiAwIDMuMiAwbDQ2LjYgMTEzLjIgMSAyLjJjNS43IDEwLjcgMTguOCAxNS41IDMwLjMgMTAuOHMxNy4zLTE3LjMgMTMuOS0yOWwtLjgtMi4zLTQyLTEwMkM0ODUuMyAzNTQuMSA1NDQuNSAyODAgNTQ0LjUgMTkybDAtNzIgODAuNS0yMC4xYzguNi0yLjEgMTMuOC0xMC44IDExLjYtMTkuNC03LjEtMjguNS0zMi43LTQ4LjUtNjIuMS00OC41bC01MC4xIDBDNTA4LjIgMTIuNSA0ODMuOCAwIDQ1Ni41IDB6bTAgNjRhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4eiJdCiAgICB9OwogICAgZmFGaWxlQ2lyY2xlQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1jaXJjbGUtY2hlY2siLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTVhMCIsICJNOTYgMEM2MC43IDAgMzIgMjguNyAzMiA2NGwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxODAgMGMtMjIuNy0zMS41LTM2LTcwLjItMzYtMTEyIDAtMTAwLjYgNzcuNC0xODMuMiAxNzYtMTkxLjNsMC0zOC4xYzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI5MC43IDE4LjdDMjc4LjcgNi43IDI2Mi41IDAgMjQ1LjUgMEw5NiAwek0zNTcuNSAxNzZMMjY0IDE3NmMtMTMuMyAwLTI0LTEwLjctMjQtMjRMMjQwIDU4LjUgMzU3LjUgMTc2ek01NzYgNDAwYTE0NCAxNDQgMCAxIDAgLTI4OCAwIDE0NCAxNDQgMCAxIDAgMjg4IDB6bS04Ni42LTYwLjljNy4xIDUuMiA4LjcgMTUuMiAzLjUgMjIuM2wtNjQgODhjLTIuOCAzLjgtNyA2LjItMTEuNyA2LjVzLTkuMy0xLjMtMTIuNi00LjZsLTQwLTQwYy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBsMjYuOCAyNi44IDUzLTcyLjljNS4yLTcuMSAxNS4yLTguNyAyMi40LTMuNXoiXQogICAgfTsKICAgIGZhTGlua1NsYXNoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxpbmstc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsiY2hhaW4tYnJva2VuIiwgImNoYWluLXNsYXNoIiwgInVubGluayJdLCAiZjEyNyIsICJNNDEtMjQuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTLTIuMy0uMyA3IDkuMWw1MjggNTI4YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtMTIyLTEyMmM0LjItMy40IDguMy03LjEgMTIuMS0xMC45bDcxLjEtNzEuMWMyOS4zLTI5LjMgNDUuOC02OS4xIDQ1LjgtMTEwLjYgMC04Ni40LTcwLTE1Ni41LTE1Ni41LTE1Ni41LTM3LjMgMC03My4xIDEzLjMtMTAxLjMgMzcuMiAyMC4zIDEwLjEgMzguNyAyMy41IDU0LjUgMzkuNSAxNC4xLTguMyAzMC4yLTEyLjcgNDYuOC0xMi43IDUxLjEgMCA5Mi41IDQxLjQgOTIuNSA5Mi41IDAgMjQuNS05LjcgNDgtMjcuMSA2NS40bC03MS4xIDcxLjFjLTMuOSAzLjktOC4xIDcuNC0xMi42IDEwLjVsLTQ3LjUtNDcuNWMxNi41LS45IDI5LjctMTQuNCAzMC4yLTMxLjEgMC0xLjMgMC0yLjYgMC0zLjkgMC04Ni4zLTY5LjktMTU2LjktMTU2LjUtMTU2LjktMTkuMiAwLTM3LjkgMy41LTU1LjUgMTAuMkw0MS0yNC45ek0yMjUuOSAxNjBjLjYgMCAxLjEgMCAxLjcgMCAxNS4xIDAgMjkuNSAzLjcgNDIuMSAxMC4yIDEuOCAxLjIgMy42IDIuMyA1LjUgMy4xIDI2LjggMTYuMyA0NC44IDQ1LjkgNDQuOCA3OS42IDAgLjQgMCAuOCAwIDEuMkwyMjUuOSAxNjB6TTM0Ni4yIDQxNkwxOTIgMjYxLjhjMS4yIDg0LjYgNjkuNiAxNTIuOSAxNTQuMSAxNTQuMXpNMTM5LjcgMjA5LjVsLTQ1LjMtNDUuMy00OC42IDQ4LjZjLTI5LjMgMjkuMy00NS44IDY5LjEtNDUuOCAxMTAuNiAwIDg2LjQgNzAgMTU2LjUgMTU2LjUgMTU2LjUgMzcuMiAwIDczLjEtMTMuMyAxMDEuMy0zNy4yLTIwLjMtMTAuMS0zOC44LTIzLjUtNTQuNi0zOS41LTE0IDguMi0zMC4xIDEyLjYtNDYuNyAxMi42LTUxLjEgMC05Mi41LTQxLjQtOTIuNS05Mi41IDAtMjQuNSA5LjctNDggMjcuMS02NS40bDQ4LjYtNDguNnoiXQogICAgfTsKICAgIGZhQ2hhaW5Ccm9rZW4gPSBmYUxpbmtTbGFzaDsKICAgIGZhQ2hhaW5TbGFzaCA9IGZhTGlua1NsYXNoOwogICAgZmFVbmxpbmsgPSBmYUxpbmtTbGFzaDsKICAgIGZhQXJyb3dSb3RhdGVSaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy1yb3RhdGUtcmlnaHQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs4NjM1LCAiYXJyb3ctcmlnaHQtcm90YXRlIiwgImFycm93LXJvdGF0ZS1mb3J3YXJkIiwgInJlZG8iXSwgImYwMWUiLCAiTTQzNi43IDc0LjdMNDQ4IDg1LjQgNDQ4IDMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAxMjhjMCAxNy43LTE0LjMgMzItMzIgMzJsLTEyOCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDQ3LjkgMC03LjYtNy4yYy0uMi0uMi0uNC0uNC0uNi0uNi03NS03NS0xOTYuNS03NS0yNzEuNSAwcy03NSAxOTYuNSAwIDI3MS41IDE5Ni41IDc1IDI3MS41IDBjOC4yLTguMiAxNS41LTE2LjkgMjEuOS0yNi4xIDEwLjEtMTQuNSAzMC4xLTE4IDQ0LjYtNy45czE4IDMwLjEgNy45IDQ0LjZjLTguNSAxMi4yLTE4LjIgMjMuOC0yOS4xIDM0LjctMTAwIDEwMC0yNjIuMSAxMDAtMzYyIDBTLTI1IDE3NSA3NSA3NWM5OS45LTk5LjkgMjYxLjctMTAwIDM2MS43LS4zeiJdCiAgICB9OwogICAgZmFBcnJvd1JpZ2h0Um90YXRlID0gZmFBcnJvd1JvdGF0ZVJpZ2h0OwogICAgZmFBcnJvd1JvdGF0ZUZvcndhcmQgPSBmYUFycm93Um90YXRlUmlnaHQ7CiAgICBmYVJlZG8gPSBmYUFycm93Um90YXRlUmlnaHQ7CiAgICBmYVBlbkNsaXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVuLWNsaXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsicGVuLWFsdCJdLCAiZjMwNSIsICJNNDA0IDBjMTkuMiAwIDM3LjYgNy42IDUxLjEgMjEuMmwzNS43IDM1LjdDNTA0LjQgNzAuNCA1MTIgODguOCA1MTIgMTA4cy03LjYgMzcuNi0yMS4yIDUxLjFMNDQ1LjkgMjA0IDMwOCA2Ni4xIDM1Mi45IDIxLjJDMzY2LjQgNy42IDM4NC44IDAgNDA0IDB6TTI3NC4xIDEwMGwwIDAgMTM3LjkgMTM3LjktMjE1LjEgMjE1LjFjLTEwLjcgMTAuNy0yNC4xIDE4LjUtMzguNyAyMi42TDMwLjQgNTExLjFjLTguMyAyLjMtMTcuMyAwLTIzLjQtNi4ycy04LjUtMTUuMS02LjItMjMuNEwzNi40IDM1My44YzQuMS0xNC42IDExLjgtMjcuOSAyMi42LTM4LjdMMjQwLjEgMTMzLjkgMjIzIDExNi45Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMEw4OSAyMTdjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlMMTU1LjEgODIuOWMyOC4xLTI4LjEgNzMuNy0yOC4xIDEwMS44IDBMMjc0LjEgMTAweiJdCiAgICB9OwogICAgZmFQZW5BbHQgPSBmYVBlbkNsaXA7CiAgICBmYURvb3JDbG9zZWQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZG9vci1jbG9zZWQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjg2ODJdLCAiZjUyYSIsICJNMzIgNjRDMzIgMjguNyA2MC43IDAgOTYgMEwzNTIgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDM4NGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA1MTJjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJMMzIgNjR6TTMyMCAyODhhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFBcnJvd0Rvd25XaWRlU2hvcnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctZG93bi13aWRlLXNob3J0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInNvcnQtYW1vdW50LWFzYyIsICJzb3J0LWFtb3VudC1kb3duIl0sICJmMTYwIiwgIk0yNDYuNiAzNzQuNmwtOTYgOTZjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwbC05Ni05NmMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMEw5NiAzNzAuNyA5NiA2NGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMzA2LjcgNDEuNC00MS40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwczEyLjUgMzIuOCAwIDQ1LjN6TTMyMCA0ODBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIgMHptMC0xMjhjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsOTYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtOTYgMHptMC0xMjhjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMTYwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTE2MCAwem0wLTEyOGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwyMjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMjAgOTZ6Il0KICAgIH07CiAgICBmYVNvcnRBbW91bnRBc2MgPSBmYUFycm93RG93bldpZGVTaG9ydDsKICAgIGZhU29ydEFtb3VudERvd24gPSBmYUFycm93RG93bldpZGVTaG9ydDsKICAgIGZhQ2FyZXREb3duID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhcmV0LWRvd24iLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFtdLCAiZjBkNyIsICJNMTQwLjMgMzc2LjhjMTIuNiAxMC4yIDMxLjEgOS41IDQyLjgtMi4ybDEyOC0xMjhjOS4yLTkuMiAxMS45LTIyLjkgNi45LTM0LjlTMzAxLjQgMTkyIDI4OC41IDE5MmwtMjU2IDBjLTEyLjkgMC0yNC42IDcuOC0yOS42IDE5LjhTLjcgMjM3LjUgOS45IDI0Ni42bDEyOCAxMjggMi40IDIuMnoiXQogICAgfTsKICAgIGZhSyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJrIiwKICAgICAgaWNvbjogWzMyMCwgNTEyLCBbMTA3XSwgIjRiIiwgIk0zMTEgODYuM2MxMi4zLTEyLjcgMTItMzIuOS0uNy00NS4ycy0zMi45LTEyLTQ1LjIgLjdDMTQzLjQgMTY3LjIgNzYuNCAyMzYuMyA2NCAyNDlMNjQgNjRjMC0xNy43LTE0LjMtMzItMzItMzJTMCA0Ni4zIDAgNjRMMCA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTEwNyA2NC43LTY2LjcgMTMzIDE5MmMxMC4xIDE0LjUgMzAgMTguMSA0NC41IDguMXMxOC4xLTMwIDguMS00NC41TDE3NC4xIDIyNy40IDMxMSA4Ni4zeiJdCiAgICB9OwogICAgZmFDaGVja1RvU2xvdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGVjay10by1zbG90IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInZvdGUteWVhIl0sICJmNzcyIiwgIk01NTIgMjg4YzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgMTA0YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAzMTJjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDEwNGMwIDguOCA3LjIgMTYgMTYgMTZsNDQ4IDBjOC44IDAgMTYtNy4yIDE2LTE2bDAtMTA0YzAtMTMuMyAxMC43LTI0IDI0LTI0ek00MTYgMzJjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAyMjRjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTI1NiAwYy0zNS4zIDAtNjQtMjguNy02NC02NEw5NiA5NmMwLTM1LjMgMjguNy02NCA2NC02NGwyNTYgMHptLTM3LjEgODQuNmMtMTAuNy03LjgtMjUuNy01LjQtMzMuNSA1LjNsLTg1LjYgMTE3LjctMjYuNS0yNy40Yy05LjItOS41LTI0LjQtOS44LTMzLjktLjYtOS41IDkuMi05LjggMjQuNC0uNiAzMy45bDQ2LjQgNDhjNC45IDUuMSAxMS44IDcuOCAxOC45IDcuM3MxMy42LTQuMSAxNy44LTkuOEwzODQuMiAxNTAuMWM3LjgtMTAuNyA1LjQtMjUuNy01LjMtMzMuNXoiXQogICAgfTsKICAgIGZhVm90ZVllYSA9IGZhQ2hlY2tUb1Nsb3Q7CiAgICBmYUZpc2hGaW5zID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpc2gtZmlucyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNGYyIiwgIk0yNzUuMiAzOC40Yy0xMC42LTgtMjUtOC41LTM2LjMtMS41UzIyMiA1Ny4zIDIyNC42IDcwLjNsOS43IDQ4LjZjLTE5LjQgOS0zNi45IDE5LjktNTIuNCAzMS41LTE1LjMgMTEuNS0yOSAyMy45LTQwLjcgMzYuM0w0OC4xIDEzMi40Yy0xMi41LTcuMy0yOC40LTUuMy0zOC43IDQuOXMtMTIuNCAyNi01LjMgMzguNkw1MCAyNTYgNC4yIDMzNi4xYy03LjIgMTIuNi01IDI4LjQgNS4zIDM4LjZzMjYuMSAxMi4yIDM4LjcgNC45bDkzLjEtNTQuM2MxMS44IDEyLjMgMjUuNCAyNC44IDQwLjcgMzYuMyAxNS41IDExLjYgMzMgMjIuNSA1Mi40IDMxLjVsLTkuNyA0OC42Yy0yLjYgMTMgMy4xIDI2LjMgMTQuMyAzMy4zczI1LjYgNi41IDM2LjMtMS41bDc3LjYtNTguMmM1NC45LTQgMTAxLjUtMjcgMTM3LjItNTMuOCAzOS4yLTI5LjQgNjcuMi02NC43IDgxLjYtODkuNSA1LjgtOS45IDUuOC0yMi4yIDAtMzIuMS0xNC40LTI0LjgtNDIuNS02MC4xLTgxLjYtODkuNS0zNS44LTI2LjgtODIuMy00OS44LTEzNy4yLTUzLjhMMjc1LjIgMzguNHpNMzg0IDI1NmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAweiJdCiAgICB9OwogICAgZmFDb21wcmVzcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjb21wcmVzcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMDY2IiwgIk0xNjAgNjRjMC0xNy43LTE0LjMtMzItMzItMzJTOTYgNDYuMyA5NiA2NGwwIDY0LTY0IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsOTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTk2ek0zMiAzMjBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsNjQgMCAwIDY0YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC05NmMwLTE3LjctMTQuMy0zMi0zMi0zMmwtOTYgMHpNMzUyIDY0YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgOTZjMCAxNy43IDE0LjMgMzIgMzIgMzJsOTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtNjQgMCAwLTY0ek0zMjAgMzIwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDk2YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC02NCA2NCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC05NiAweiJdCiAgICB9OwogICAgZmFBcnJvd1VwQVogPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctdXAtYS16IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNvcnQtYWxwaGEtdXAiXSwgImYxNWUiLCAiTTQxMi42IDQ5LjdDNDA3LjIgMzguOCAzOTYuMSAzMiAzODQgMzJzLTIzLjIgNi44LTI4LjYgMTcuN2MtNTAuNyAxMDEuMy03Ny4zIDE1NC43LTgwIDE2MC03LjkgMTUuOC0xLjUgMzUgMTQuMyA0Mi45czM1IDEuNSA0Mi45LTE0LjNsNy4yLTE0LjMgODguNCAwIDcuMiAxNC4zYzcuOSAxNS44IDI3LjEgMjIuMiA0Mi45IDE0LjNzMjIuMi0yNy4xIDE0LjMtNDIuOWMtMi43LTUuMy0yOS4zLTU4LjctODAtMTYwek0zODQgMTM1LjZsMjAuMiA0MC40LTQwLjQgMCAyMC4yLTQwLjR6TTI4OCAzMjBjMCAxNy43IDE0LjMgMzIgMzIgMzJsNTAuNyAwLTczLjQgNzMuNGMtOS4yIDkuMi0xMS45IDIyLjktNi45IDM0LjlTMzA3LjEgNDgwIDMyMCA0ODBsMTI4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTUwLjcgMCA3My40LTczLjRjOS4yLTkuMiAxMS45LTIyLjkgNi45LTM0LjlTNDYwLjkgMjg4IDQ0OCAyODhsLTEyOCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnpNMTUwLjYgNDEuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTgwIDgwYy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwTDk2IDE0MS4zIDk2IDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzA2LjcgMjUuNCAyNS40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTgwLTgweiJdCiAgICB9OwogICAgZmFTb3J0QWxwaGFVcCA9IGZhQXJyb3dVcEFaOwogICAgZmFVc2VyR3JhZHVhdGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidXNlci1ncmFkdWF0ZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNTAxIiwgIk0yNDEuMy0xM2MtMTEuNC0yLjMtMjMuMS0yLjMtMzQuNSAwTDE5LjMgMjQuNUM4LjEgMjYuNyAwIDM2LjYgMCA0OCAwIDU4LjMgNi41IDY3LjMgMTYgNzAuNkwxNiAxNDQgLjMgMjIyLjZjLS4yIC45LS4zIDEuOS0uMyAyLjkgMCA4IDYuNSAxNC42IDE0LjYgMTQuNmwzNC45IDBjOCAwIDE0LjYtNi41IDE0LjYtMTQuNiAwLTEtLjEtMS45LS4zLTIuOUw0OCAxNDQgNDggNzcuMyA5NiA4Ni45IDk2IDE0NGMwIDcwLjcgNTcuMyAxMjggMTI4IDEyOHMxMjgtNTcuMyAxMjgtMTI4bDAtNTcuMSA3Ni43LTE1LjNDNDM5LjkgNjkuMyA0NDggNTkuNCA0NDggNDhzLTguMS0yMS4zLTE5LjMtMjMuNUwyNDEuMy0xM3pNMjI0IDIyNGMtNDQuMiAwLTgwLTM1LjgtODAtODBsMTYwIDBjMCA0NC4yLTM1LjggODAtODAgODB6TTEyMC4xIDMyMC4xQzU4LjcgMzQ4LjMgMTYgNDEwLjMgMTYgNDgyLjMgMTYgNDk4LjcgMjkuMyA1MTIgNDUuNyA1MTJsMTU0LjMgMCAwLTE0Ni01Ny40LTQzYy02LjUtNC45LTE1LjItNi4yLTIyLjYtMi44ek0yNDggNTEybDE1NC4zIDBjMTYuNCAwIDI5LjctMTMuMyAyOS43LTI5LjcgMC03Mi00Mi43LTEzNC0xMDQuMS0xNjIuMS03LjQtMy40LTE2LjEtMi4xLTIyLjYgMi44bC01Ny40IDQzIDAgMTQ2eiJdCiAgICB9OwogICAgZmFGaWxlQ29kZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1jb2RlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYxYzkiLCAiTTAgNjRDMCAyOC43IDI4LjcgMCA2NCAwTDIxMy41IDBjMTcgMCAzMy4zIDYuNyA0NS4zIDE4LjdMMzY1LjMgMTI1LjNjMTIgMTIgMTguNyAyOC4zIDE4LjcgNDUuM0wzODQgNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA2NHptMjA4LTUuNWwwIDkzLjVjMCAxMy4zIDEwLjcgMjQgMjQgMjRMMzI1LjUgMTc2IDIwOCA1OC41ek0xNTQuMiAyOTUuNmM4LjYtMTAuMSA3LjUtMjUuMi0yLjYtMzMuOHMtMjUuMi03LjUtMzMuOCAyLjZsLTQ4IDU2Yy03LjcgOS03LjcgMjIuMiAwIDMxLjJsNDggNTZjOC42IDEwLjEgMjMuOCAxMS4yIDMzLjggMi42czExLjItMjMuOCAyLjYtMzMuOGwtMzQuNi00MC40IDM0LjYtNDAuNHptMTEyLTMxLjJjLTguNi0xMC4xLTIzLjgtMTEuMi0zMy44LTIuNnMtMTEuMiAyMy44LTIuNiAzMy44bDM0LjYgNDAuNC0zNC42IDQwLjRjLTguNiAxMC4xLTcuNSAyNS4yIDIuNiAzMy44czI1LjIgNy41IDMzLjgtMi42bDQ4LTU2YzcuNy05IDcuNy0yMi4yIDAtMzEuMmwtNDgtNTZ6Il0KICAgIH07CiAgICBmYVNvYXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic29hcCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyOTUzMl0sICJlMDZlIiwgIk0yMDgtMzJhNDggNDggMCAxIDEgMCA5NiA0OCA0OCAwIDEgMSAwLTk2ek0zMjAgOTZhNjQgNjQgMCAxIDEgMCAxMjggNjQgNjQgMCAxIDEgMC0xMjh6TTM1MiAwYTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6TTk2IDE2MGwxMTIgMGMwIDIzLjggNy40IDQ1LjkgMjAuMSA2NEwxNjAgMjI0Yy01MyAwLTk2IDQzLTk2IDk2czQzIDk2IDk2IDk2bDE5MiAwYzUzIDAgOTYtNDMgOTYtOTYgMC0zNS4xLTE4LjktNjUuOS00Ny04Mi42IDE5LTE5LjggMzAuNy00Ni42IDMxLTc2LjEgNDUuNCA3LjYgODAgNDcuMSA4MCA5NC43bDAgMTI4YzAgNTMtNDMgOTYtOTYgOTZMOTYgNDgwYy01MyAwLTk2LTQzLTk2LTk2TDAgMjU2YzAtNTMgNDMtOTYgOTYtOTZ6bTY0IDExMmwxOTIgMGMyNi41IDAgNDggMjEuNSA0OCA0OHMtMjEuNSA0OC00OCA0OGwtMTkyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4czIxLjUtNDggNDgtNDh6Il0KICAgIH07CiAgICBmYVJlY3ljbGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicmVjeWNsZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzk4NDIsIDk4NTAsIDk4NTFdLCAiZjFiOCIsICJNMTUyLjMgNjBDMTk4LjUtMjAgMzE0LTIwIDM2MC4yIDYwbDM3LjMgNjQuNiAyNy43LTE2YzguNC00LjkgMTguOS00LjIgMjYuNiAxLjdzMTEuMSAxNS45IDguNiAyNS4zTDQzNi45IDIyM2MtMy40IDEyLjgtMTYuNiAyMC40LTI5LjQgMTdsLTg3LjQtMjMuNGMtOS40LTIuNS0xNi4zLTEwLjQtMTcuNi0yMHMzLjQtMTkuMSAxMS44LTIzLjlsMjcuNy0xNi0zNy4zLTY0LjZjLTIxLjYtMzcuMy03NS40LTM3LjMtOTcgMGwtNS4zIDkuMWMtOC44IDE1LjMtMjguNCAyMC41LTQzLjcgMTEuN1MxMzguMiA4NC41IDE0NyA2OS4xbDUuMy05LjF6TTQ0OS43IDI3OS4xYzE1LjMtOC44IDM0LjktMy42IDQzLjcgMTEuN2w1LjMgOS4xYzQ2LjIgODAtMTEuNSAxODAtMTAzLjkgMTgwbC03NC42IDAgMCAzMmMwIDkuNy01LjggMTguNS0xNC44IDIyLjJzLTE5LjMgMS43LTI2LjItNS4ybC02NC02NGMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlsNjQtNjRjNi45LTYuOSAxNy4yLTguOSAyNi4yLTUuMnMxNC44IDEyLjUgMTQuOCAyMi4ybDAgMzIgNzQuNiAwYzQzLjEgMCA3MC4xLTQ2LjcgNDguNS04NGwtNS4zLTkuMWMtOC44LTE1LjMtMy42LTM0LjkgMTEuNy00My43ek01MSAyMzUuNGwtMjcuNy0xNmMtOC40LTQuOS0xMy4xLTE0LjMtMTEuOC0yMy45czguMi0xNy41IDE3LjYtMjBMMTE2LjUgMTUyYzEyLjgtMy40IDI2IDQuMiAyOS40IDE3bDIzLjQgODcuNGMyLjUgOS40LS45IDE5LjMtOC42IDI1LjNzLTE4LjIgNi42LTI2LjYgMS43bC0yNy43LTE2LTM3LjMgNjQuNmMtMjEuNiAzNy4zIDUuNCA4NCA0OC41IDg0bDEwLjYgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTAuNiAwQzI1LjMgNDgwLTMyLjQgMzgwIDEzLjggMzAwTDUxIDIzNS40eiJdCiAgICB9OwogICAgZmFGYWNlR3JpbldpbmsyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi13aW5rIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImdyaW4td2luayJdLCAiZjU4YyIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTM4Ni43IDMwOC45YzExLjktMy43IDIzLjkgNi4zIDE5LjYgMTguMS0yMi40IDYxLjMtODEuMyAxMDUuMS0xNTAuMyAxMDUuMVMxMjguMSAzODguMiAxMDUuNyAzMjYuOWMtNC4zLTExLjggNy43LTIxLjggMTkuNi0xOC4xIDM5LjIgMTIuMiA4My43IDE5LjEgMTMwLjcgMTkuMXM5MS41LTYuOSAxMzAuNy0xOS4xek0zMjggMTk2Yy0xMSAwLTIwIDktMjAgMjBzLTkgMjAtMjAgMjAtMjAtOS0yMC0yMGMwLTMzLjEgMjYuOS02MCA2MC02MGwxNiAwYzMzLjEgMCA2MCAyNi45IDYwIDYwIDAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMC05LTIwLTIwLTIwbC0xNiAwek0xNzYgMTc2YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhR3JpbldpbmsyID0gZmFGYWNlR3JpbldpbmsyOwogICAgZmFXYXRlckxhZGRlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ3YXRlci1sYWRkZXIiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsibGFkZGVyLXdhdGVyIiwgInN3aW1taW5nLXBvb2wiXSwgImY1YzUiLCAiTTM3NC41IDQwNS43YzM4LjQtMjkgOTAuNS0yOSAxMjkgMCAxNi45IDEyLjcgMzIuOSAyMS41IDQ3LjggMjQuNiAxMy43IDIuOCAyNy40IC45IDQyLjMtMTAuMyAxMC42LTggMjUuNi01LjkgMzMuNiA0LjdzNS44IDI1LjctNC44IDMzLjZjLTI2LjQgMTkuOS01NC4yIDI0LjQtODAuNyAxOS4xLTI1LjMtNS4xLTQ4LjEtMTguOS02Ny4yLTMzLjMtMjEuMy0xNi4xLTQ5LjktMTYuMS03MS4yIDAtMjQuMiAxOC4zLTUyLjMgMzUuOS04My40IDM1LjlzLTU5LjEtMTcuNy04My4zLTM1LjljLTIxLjMtMTYuMS00OS45LTE2LjEtNzEuMiAwLTIzLjggMTcuOS01NC4xIDM1LjUtODguMSAzNS4zLTIwLjQtLjEtNDAuNy02LjctNTkuOC0yMS4xLTEwLjYtOC0xMi43LTIzLTQuNy0zMy42czIzLTEyLjcgMzMuNi00LjdjMTEuMyA4LjUgMjEuNiAxMS40IDMxLjIgMTEuNSAxNy42IC4xIDM3LjMtOS40IDU4LjktMjUuNyAzOC40LTI5IDkwLjYtMjkgMTI5IDAgMjQgMTguMSA0MC43IDI2LjMgNTQuNSAyNi4zczMwLjUtOC4yIDU0LjUtMjYuM3pNNTExLjggMzJjNDguMyAwIDg5IDM2IDk1IDgzLjlsMSA4LjJjMi4yIDE3LjUtMTAuMiAzMy41LTI3LjggMzUuN3MtMzMuNS0xMC4yLTM1LjctMjcuOGwtMS04LjJjLTItMTUuOS0xNS41LTI3LjgtMzEuNS0yNy44LTE3LjUgMC0zMS44IDE0LjItMzEuOCAzMS44bDAgMjExLjhjLTIzLjEtNS4xLTQ0LjktNC40LTY0LS40bDAtNTEuMi0xOTIgMCAwIDQ4LjdjLTUuMy0uNS0xMC43LS44LTE2LS43LTE2LjIgLjEtMzIuNCAyLjctNDggOGwwLTIxNi4yYzAtNTIuOSA0Mi45LTk1LjggOTUuNy05NS44IDQ4LjMgMCA4OSAzNiA5NSA4My45bDEgOC4yYzIuMiAxNy41LTEwLjIgMzMuNS0yNy44IDM1LjdzLTMzLjUtMTAuMi0zNS43LTI3LjhsLTEtOC4yYy0yLTE1LjktMTUuNS0yNy44LTMxLjUtMjcuOC0xNy41IDAtMzEuNyAxNC4yLTMxLjcgMzEuOGwwIDk2LjIgMTkyIDAgMC05Ni4yQzQxNiA3NC45IDQ1OC45IDMyIDUxMS44IDMyeiJdCiAgICB9OwogICAgZmFMYWRkZXJXYXRlciA9IGZhV2F0ZXJMYWRkZXI7CiAgICBmYVN3aW1taW5nUG9vbCA9IGZhV2F0ZXJMYWRkZXI7CiAgICBmYUdlbWluaSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnZW1pbmkiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTg0OSIsICJNMzk1LjQgOGMxMy4yLTExLjcgMzMuMy0xMC41IDQ1LjEgMi43IDExLjcgMTMuMiAxMC41IDMzLjQtMi43IDQ1LjItMi43IDIuNC0yMy4xIDE5LjgtNTguMyAzNi44LTguMiA0LTE3LjIgNy45LTI3IDExLjZsMCAzMDMuMmM5LjggMy44IDE4LjggNy42IDI3IDExLjYgMTguMiA4LjggMzIuNCAxNy43IDQyLjIgMjQuNSAzIDIuMSA1LjUgNC4xIDcuNyA1LjcgMS4yIC45IDIuMyAxLjYgMy4yIDIuNCAuMiAuMSAuMyAuMiAuNSAuNCAxLjMgMS4xIDIuNCAyIDMuMiAyLjYgLjQgLjMgLjcgLjYgLjkgLjggLjEgLjEgLjMgLjIgLjMgLjMgMCAwIC4xIC4xIC4xIC4xbC4xIDAgMCAwIDAgMGMzLjMgMi45IDUuOSA2LjQgNy43IDEwLjIgNS40IDExLjMgMy44IDI1LjEtNSAzNS0uMyAuNC0uNyAuNy0xLjEgMS4xLTExLjkgMTIuMi0zMS4yIDEzLjEtNDQgMS43LS4zLS4zLTEuNS0xLjMtMy41LTIuOC0uNC0uMy0uOS0uNy0xLjUtMS4xLTEuOS0xLjQtNC4yLTMuMS03LjEtNS4xLTIuMi0xLjUtNC43LTMuMS03LjQtNC44LTYuNi00LjEtMTQuOC04LjgtMjQuNC0xMy41LTcuNC0zLjYtMTUuNi03LjItMjQuNy0xMC41LTEzLjYtNS4xLTI5LTkuNi00Ni4xLTEyLjktNS43LTEuMS0xMS42LTIuMS0xNy43LTIuOC0xMi4xLTEuNi0yNS0yLjUtMzguNi0yLjUtNTQuMiAwLTk3LjQgMTQuNC0xMjcgMjguOC0zLjQgMS42LTYuNSAzLjMtOS41IDQuOS01LjEgMi44LTkuNyA1LjQtMTMuOCA3LjktMy4zIDIuMS02LjMgNC04LjkgNS43LTEuNyAxLjItMy4yIDIuMy00LjYgMy4zLTEuOSAxLjQtMy41IDIuNS00LjYgMy40LTEuNCAxLjEtMi4yIDEuOC0yLjUgMi0xMy4yIDExLjctMzMuMyAxMC41LTQ1LjEtMi44LTIuMi0yLjUtNC01LjItNS4yLTguMXMtMi4xLTUuOS0yLjUtOC45Yy0xLjQtMTAuMiAyLjItMjAuOCAxMC40LTI4LjIgLjItLjIgLjYtLjUgMS4yLTEgLjEtLjEgLjItLjIgLjMtLjNsMy4yLTIuNmMxLjctMS4zIDMuNy0yLjggNi4yLTQuNiAxLjYtMS4yIDMuMy0yLjUgNS4yLTMuOCA5LjgtNi44IDI0LTE1LjcgNDIuMi0yNC41IDguMi00IDE3LjItNy45IDI3LTExLjZsMC0zMDMuMkM4Ni43IDEwMC42IDc3LjcgOTYuNyA2OS41IDkyLjggMzQuMyA3NS43IDE0IDU4LjMgMTEuMyA1NS45LTEuOSA0NC4yLTMuMSAyNCA4LjYgMTAuNyAyMC4zLTIuNSA0MC41LTMuNyA1My43IDggNTUuMSA5LjIgNzAuNyAyMi4yIDk3LjUgMzUuMiAxMjcuMSA0OS42IDE3MC4zIDY0IDIyNC41IDY0czk3LjQtMTQuNCAxMjctMjguOGMyNi44LTEzIDQyLjQtMjYgNDMuOC0yNy4yek0yODguNSAxMjIuM2MtMTkuNyAzLjUtNDEgNS43LTY0IDUuN3MtNDQuMy0yLjItNjQtNS43bDAgMjY3LjRjMTIuNi0yLjMgMjUuOS00IDM5LjktNC45IDcuOC0uNSAxNS44LS44IDI0LS44IDIzIDAgNDQuNCAyLjIgNjQgNS43bDAtMjY3LjR6Il0KICAgIH07CiAgICBmYVRvd2VyQ2VsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0b3dlci1jZWxsIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1ODUiLCAiTTU5LjYgOS44QzQ3LjMgNC44IDMzLjMgMTAuNyAyOC40IDIzIDE1LjIgNTUuNSA4IDkwLjkgOCAxMjhzNy4yIDcyLjUgMjAuNCAxMDVjNSAxMi4zIDE5IDE4LjIgMzEuMyAxMy4yczE4LjItMTkgMTMuMi0zMS4zQzYyIDE4OC4yIDU2IDE1OC44IDU2IDEyOHM2LTYwLjIgMTYuOS04N2M1LTEyLjMtMS0yNi4zLTEzLjItMzEuM3ptNDU2LjggMGMtMTIuMyA1LTE4LjIgMTktMTMuMiAzMS4zIDEwLjkgMjYuOCAxNi45IDU2LjIgMTYuOSA4N3MtNiA2MC4yLTE2LjkgODdjLTUgMTIuMyAxIDI2LjMgMTMuMiAzMS4zczI2LjMtMSAzMS4zLTEzLjJjMTMuMS0zMi41IDIwLjQtNjcuOSAyMC40LTEwNXMtNy4yLTcyLjUtMjAuNC0xMDVjLTUtMTIuMy0xOS0xOC4yLTMxLjMtMTMuMnpNMzQwLjEgMTY1LjJjNy41LTEwLjUgMTEuOS0yMy4zIDExLjktMzcuMiAwLTM1LjMtMjguNy02NC02NC02NHMtNjQgMjguNy02NCA2NGMwIDEzLjkgNC40IDI2LjcgMTEuOSAzNy4yTDk4LjkgNDY2LjhjLTcuMyAxNi4xLS4yIDM1LjEgMTUuOSA0Mi40czM1LjEgLjIgNDIuNC0xNS45bDIwLjYtNDUuMiAyMjAuNiAwIDIwLjYgNDUuMmM3LjMgMTYuMSAyNi4zIDIzLjIgNDIuNCAxNS45czIzLjItMjYuMyAxNS45LTQyLjRMMzQwLjEgMTY1LjJ6TTM3Ni41IDQwMGwtMTc3IDAgMjEuOC00OCAxMzMuMyAwIDIxLjggNDh6TTI4OCAyMDUuM2w0NC44IDk4LjctODkuNyAwIDQ0LjgtOTguN3pNMTYzLjMgNzMuNmM1LjMtMTIuMS0uMi0yNi4zLTEyLjQtMzEuNnMtMjYuMyAuMi0zMS42IDEyLjRDMTA5LjUgNzcgMTA0IDEwMS45IDEwNCAxMjhzNS41IDUxIDE1LjMgNzMuNmM1LjMgMTIuMSAxOS41IDE3LjcgMzEuNiAxMi40czE3LjctMTkuNSAxMi40LTMxLjZDMTU2IDE2NS44IDE1MiAxNDcuNCAxNTIgMTI4czQtMzcuOCAxMS4zLTU0LjR6TTQ1Ni43IDU0LjRjLTUuMy0xMi4xLTE5LjUtMTcuNy0zMS42LTEyLjRzLTE3LjcgMTkuNS0xMi40IDMxLjZDNDIwIDkwLjIgNDI0IDEwOC42IDQyNCAxMjhzLTQgMzcuOC0xMS4zIDU0LjRjLTUuMyAxMi4xIC4yIDI2LjMgMTIuNCAzMS42czI2LjMtLjIgMzEuNi0xMi40QzQ2Ni41IDE3OSA0NzIgMTU0LjEgNDcyIDEyOHMtNS41LTUxLTE1LjMtNzMuNnoiXQogICAgfTsKICAgIGZhQ29sb25TaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvbG9uLXNpZ24iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZTE0MCIsICJNMjEzLjggOC43YzEyLjkgMy4yIDIwLjcgMTYuMiAxNy41IDI5LjFsLTQuNiAxOC41YzE1LjQgLjggMzAuNCAzLjQgNDQuNyA3LjVsOS40LTM3LjZDMjgzLjkgMTMuMyAyOTcgNS41IDMwOS44IDguN1MzMzAuNSAyNSAzMjcuMyAzNy44TDMxNiA4Mi44YzEzLjUgNy44IDI2IDE3LjEgMzcuMiAyNy44IDEyLjkgMTIuMSAxMy40IDMyLjQgMS4zIDQ1LjJzLTMyLjQgMTMuNC00NS4yIDEuM2MtMy4xLTIuOS02LjQtNS44LTkuOC04LjRMMjM5LjIgMzkwYzI2LjktNC42IDUxLjEtMTcuMSA3MC4xLTM1LjEgMTIuOS0xMi4xIDMzLjEtMTEuNSA0NS4yIDEuM3MxMS41IDMzLjEtMS4zIDQ1LjJjLTM0LjMgMzIuMy04MCA1Mi44LTEzMC41IDU0LjRsLTcuNSAyOS45Yy0zLjIgMTIuOS0xNi4yIDIwLjctMjkuMSAxNy41cy0yMC43LTE2LjItMTcuNS0yOS4xbDUuNi0yMi41Yy0xNS0zLjItMjkuNC04LTQyLjktMTQuNGwtMTIuMSA0OC41Yy0zLjIgMTIuOS0xNi4yIDIwLjctMjkuMSAxNy41UzY5LjUgNDg3IDcyLjcgNDc0LjJsMTYtNjMuOUM0NC4zIDM3My42IDE2IDMxOC4xIDE2IDI1NiAxNiAxNTkuMiA4NC44IDc4LjQgMTc2LjMgNjBsOC40LTMzLjhDMTg3LjkgMTMuMyAyMDEgNS41IDIxMy44IDguN3pNMTU4IDEzMi45Yy00Ni4xIDIxLjgtNzggNjguNy03OCAxMjMuMSAwIDMwLjUgMTAgNTguNiAyNi45IDgxLjNMMTU4IDEzMi45ek0xNDcuNCAzNzMuNGMxMyA3LjYgMjcuMyAxMy4xIDQyLjUgMTYuMWw2NS45LTI2My42Yy0xMi42LTMuOC0yNS45LTUuOS0zOS44LTUuOS0xLjggMC0zLjUgMC01LjMgLjFMMTQ3LjQgMzczLjR6Il0KICAgIH07CiAgICBmYUxhcHRvcEZpbGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGFwdG9wLWZpbGUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUxZCIsICJNNjQgNjRDNjQgMjguNyA5Mi43IDAgMTI4IDBMNDE2IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCA0OC02NCAwIDAtNDgtMjg4IDAgMCAxOTIgMTEyIDAgMCA5Ni0xNjMuMiAwQzM0LjQgMzUyIDAgMzE3LjYgMCAyNzUuMiAwIDI2NC42IDguNiAyNTYgMTkuMiAyNTZMNjQgMjU2IDY0IDY0ek01MjkuOSAyNTcuOWM5IDkgMTQuMSAyMS4yIDE0LjEgMzMuOUw1NDQgNDY0YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xNjAgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC0yNTZjMC0yNi41IDIxLjUtNDggNDgtNDhsNzYuMSAwYzEyLjcgMCAyNC45IDUuMSAzMy45IDE0LjEgMjAgMjAgNDcuOSA0Ny45IDgzLjkgODMuOXpNNDE2IDI3MmMwIDguOCA3LjIgMTYgMTYgMTZsNjAuMSAwLTc2LjEtNzYuMSAwIDYwLjF6Il0KICAgIH07CiAgICBmYUJhaGFpID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhaGFpIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImhheWthbCJdLCAiZjY2NiIsICJNMjg4LjQtOGMxMy4yIDAgMjUgOC4xIDI5LjggMjAuNGwzMS45IDgyIDc3LjItNDIuM2MxMS42LTYuMyAyNS44LTQuOSAzNS45IDMuNXMxNCAyMi4zIDkuNyAzNC44bC0yOC4yIDgzLjMgODYuMyAxNy4yYzEyLjkgMi42IDIzIDEyLjggMjUuMyAyNS44cy0zLjYgMjYuMS0xNC45IDMyLjlsLTc1LjIgNDUuNyA1NSA2OC42YzguMyAxMC4zIDkuMyAyNC42IDIuNyAzNnMtMTkuNSAxNy42LTMyLjYgMTUuNmwtODctMTMuMy0yIDg4Yy0uMyAxMy4yLTguNiAyNC44LTIxIDI5LjRzLTI2LjMgMS0zNS05bC01OC02Ni4xLTU4IDY2LjFjLTguNyA5LjktMjIuNiAxMy41LTM1IDlzLTIwLjgtMTYuMi0yMS0yOS40bC0yLTg4LTg3IDEzLjNjLTEzIDItMjYtNC4yLTMyLjYtMTUuNnMtNS41LTI1LjcgMi43LTM2bDU1LTY4LjYtNzUuMi00NS43Yy0xMS4zLTYuOC0xNy4yLTE5LjktMTQuOS0zMi45czEyLjMtMjMuMiAyNS4zLTI1LjhsODYuMy0xNy4yLTI4LjItODMuM2MtNC4yLTEyLjUtLjQtMjYuMyA5LjctMzQuOHMyNC40LTkuOSAzNS45LTMuNWw3Ny4xIDQyLjMgMzEuOS04MkMyNjMuMyAuMSAyNzUuMi04IDI4OC40LTh6bTAgMTIwLjJMMjczIDE1MS42Yy0zLjMgOC42LTEwLjIgMTUuMy0xOC45IDE4LjVzLTE4LjIgMi40LTI2LjMtMmwtMzctMjAuMyAxMy42IDQwYzMgOC43IDIgMTguMy0yLjYgMjYuM3MtMTIuNCAxMy42LTIxLjUgMTUuNGwtNDEuNCA4LjMgMzYuMSAyMS45YzcuOSA0LjggMTMuMyAxMi43IDE0LjkgMjEuOHMtLjggMTguNC02LjUgMjUuNmwtMjYuNCAzMyA0MS44LTYuNGM5LjEtMS40IDE4LjQgMS4yIDI1LjQgNy4xczExLjIgMTQuNiAxMS40IDIzLjhsLjkgNDIuMiAyNy45LTMxLjhjNi4xLTYuOSAxNC44LTEwLjkgMjQuMS0xMC45czE4IDQgMjQuMSAxMC45bDI3LjkgMzEuOCAuOS00Mi4yYy4yLTkuMiA0LjQtMTcuOSAxMS40LTIzLjhzMTYuMy04LjUgMjUuNC03LjFsNDEuOCA2LjQtMjYuNC0zM2MtNS44LTcuMi04LjItMTYuNS02LjYtMjUuNnM3LTE3IDE0LjktMjEuOGwzNi4xLTIxLjktNDEuNC04LjNjLTktMS44LTE2LjktNy40LTIxLjUtMTUuNHMtNS41LTE3LjYtMi42LTI2LjNsMTMuNi00MC0zNyAyMC4zYy04LjEgNC40LTE3LjcgNS4yLTI2LjMgMnMtMTUuNS05LjktMTguOS0xOC41bC0xNS4zLTM5LjR6Il0KICAgIH07CiAgICBmYUhheWthbCA9IGZhQmFoYWk7CiAgICBmYU1vbmV5QmlsbDEyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1vbmV5LWJpbGwtMSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJtb25leS1iaWxsLWFsdCJdLCAiZjNkMSIsICJNNjQgNjRDMjguNyA2NCAwIDkyLjcgMCAxMjhMMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgNjR6bTE5MiA4MGExMTIgMTEyIDAgMSAxIDAgMjI0IDExMiAxMTIgMCAxIDEgMC0yMjR6TTY0IDE4NGwwLTQ4YzAtNC40IDMuNi04IDgtOGw0OCAwYzQuNCAwIDguMSAzLjYgNy41IDgtMy42IDI5LTI2LjYgNTEuOS01NS41IDU1LjUtNC40IC41LTgtMy4xLTgtNy41em0wIDE0NGMwLTQuNCAzLjYtOC4xIDgtNy41IDI5IDMuNiA1MS45IDI2LjYgNTUuNSA1NS41IC41IDQuNC0zLjEgOC03LjUgOGwtNDggMGMtNC40IDAtOC0zLjYtOC04bDAtNDh6TTQ0MCAxOTEuNWMtMjktMy42LTUxLjktMjYuNi01NS41LTU1LjUtLjUtNC40IDMuMS04IDcuNS04bDQ4IDBjNC40IDAgOCAzLjYgOCA4bDAgNDhjMCA0LjQtMy42IDguMS04IDcuNXpNNDQ4IDMyOGwwIDQ4YzAgNC40LTMuNiA4LTggOGwtNDggMGMtNC40IDAtOC4xLTMuNi03LjUtOCAzLjYtMjkgMjYuNi01MS45IDU1LjUtNTUuNSA0LjQtLjUgOCAzLjEgOCA3LjV6TTI0MCAxODhjLTExIDAtMjAgOS0yMCAyMCAwIDkuNyA2LjkgMTcuNyAxNiAxOS42bDAgNDguNC00IDBjLTExIDAtMjAgOS0yMCAyMHM5IDIwIDIwIDIwbDQ4IDBjMTEgMCAyMC05IDIwLTIwcy05LTIwLTIwLTIwbC00IDAgMC02OGMwLTExLTktMjAtMjAtMjBsLTE2IDB6Il0KICAgIH07CiAgICBmYU1vbmV5QmlsbEFsdDIgPSBmYU1vbmV5QmlsbDEyOwogICAgZmFDbG91ZEJvbHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2xvdWQtYm9sdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyNzc4NSwgInRodW5kZXJzdG9ybSJdLCAiZjc2YyIsICJNMCAyMjRjMCA1MyA0MyA5NiA5NiA5NmwzOC42IDAgMTI0LjEtMTExYzEyLjItMTAuOSAyOC0xNyA0NC40LTE3IDQ0LjYgMCA3Ni41IDQzIDYzLjcgODUuN0wzNTQuMSAzMjAgNDE2IDMyMGM1MyAwIDk2LTQzIDk2LTk2cy00My05Ni05Ni05NmMtLjUgMC0xLjEgMC0xLjYgMCAxLjEtNS4yIDEuNi0xMC41IDEuNi0xNiAwLTQ0LjItMzUuOC04MC04MC04MC0yNC4zIDAtNDYuMSAxMC45LTYwLjggMjgtMTguNy0zNS43LTU2LjEtNjAtOTkuMi02MC02MS45IDAtMTEyIDUwLjEtMTEyIDExMiAwIDcuMSAuNyAxNC4xIDEuOSAyMC44LTM4LjMgMTIuNi02NS45IDQ4LjctNjUuOSA5MS4yek0xNjAuNiA0MDBsNjEuOCAwLTMxLjIgMTA0LjFjLTMuNiAxMS45IDUuMyAyMy45IDE3LjggMjMuOSA0LjYgMCA5LTEuNyAxMi40LTQuN0wzNjIuNSAzOTYuOWMzLjUtMy4xIDUuNS03LjYgNS41LTEyLjQgMC05LjItNy40LTE2LjYtMTYuNi0xNi42bC02MS44IDAgMzEuMi0xMDQuMWMzLjYtMTEuOS01LjMtMjMuOS0xNy44LTIzLjktNC42IDAtOSAxLjctMTIuNCA0LjdMMTQ5LjUgMzcxLjFjLTMuNSAzLjEtNS41IDcuNi01LjUgMTIuNCAwIDkuMiA3LjQgMTYuNiAxNi42IDE2LjZ6Il0KICAgIH07CiAgICBmYVRodW5kZXJzdG9ybSA9IGZhQ2xvdWRCb2x0OwogICAgZmFFdGhlcm5ldCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJldGhlcm5ldCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNzk2IiwgIk0wIDIyNEwwIDQxNmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMiAwIDAtMTA0YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCAxMDQgNjQgMCAwLTEwNGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0bDAgMTA0IDY0IDAgMC0xMDRjMC0xMy4zIDEwLjctMjQgMjQtMjRzMjQgMTAuNyAyNCAyNGwwIDEwNCA2NCAwIDAtMTA0YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCAxMDQgMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTE5MmMwLTE3LjctMTQuMy0zMi0zMi0zMmwtMzIgMCAwLTMyYzAtMTcuNy0xNC4zLTMyLTMyLTMybC0zMiAwIDAtMzJjMC0xNy43LTE0LjMtMzItMzItMzJMMTYwIDY0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDMyLTMyIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgMzItMzIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6Il0KICAgIH07CiAgICBmYUhyeXZuaWFTaWduID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhyeXZuaWEtc2lnbiIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzgzNzIsICJocnl2bmlhIl0sICJmNmYyIiwgIk0zMzYgMTQ5LjRDMzM2IDc3IDI2OC41IDIzLjUgMTk4IDQwLjFMOTMuMiA2NC45Qzc2IDY4LjkgNjUuNCA4Ni4yIDY5LjQgMTAzLjRzMjEuMyAyNy45IDM4LjUgMjMuOGwxMDQuOC0yNC43YzMwLjMtNy4xIDU5LjMgMTUuOCA1OS4zIDQ2LjkgMCAxNy42LTkuNiAzMy44LTI1IDQyLjNsLS43IC40LTIyMi4zIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMzM2IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTMyLjQgMGM1LjUtMTMuMyA4LjQtMjcuOCA4LjQtNDIuNnpNMzYwIDI3MkwyNCAyNzJjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMzMuMyAwYy02LjEgMTMuNC05LjMgMjguMS05LjMgNDMuMyAwIDY0LjEgNTYuOSAxMTMuNCAxMjAuNCAxMDQuMmwxMzcuOS0xOS45YzE3LjUtMi41IDI5LjYtMTguNyAyNy4xLTM2LjJzLTE4LjgtMjkuNi0zNi4yLTI3LjFMMTU5LjIgNDA0LjJjLTI0LjkgMy42LTQ3LjItMTUuNy00Ny4yLTQwLjkgMC0xNS4xIDguMi0yOC45IDIxLjQtMzYuMmwxMy03LjEgMjEzLjYgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNHoiXQogICAgfTsKICAgIGZhSHJ5dm5pYSA9IGZhSHJ5dm5pYVNpZ247CiAgICBmYUV5ZVNsYXNoMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJleWUtc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjA3MCIsICJNNDEtMjQuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTLTIuMy0uMyA3IDkuMWw1MjggNTI4YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtOTYuNC05Ni40YzIuNy0yLjQgNS40LTQuOCA4LTcuMiA0Ni44LTQzLjUgNzguMS05NS40IDkzLTEzMS4xIDMuMy03LjkgMy4zLTE2LjcgMC0yNC42LTE0LjktMzUuNy00Ni4yLTg3LjctOTMtMTMxLjEtNDcuMS00My43LTExMS44LTgwLjYtMTkyLjYtODAuNi01Ni44IDAtMTA1LjYgMTguMi0xNDYgNDQuMkw0MS0yNC45ek0yMDQuNSAxMzguN2MyMy41LTE2LjggNTIuNC0yNi43IDgzLjUtMjYuNyA3OS41IDAgMTQ0IDY0LjUgMTQ0IDE0NCAwIDMxLjEtOS45IDU5LjktMjYuNyA4My41bC0zNC43LTM0LjdjMTIuNy0yMS40IDE3LTQ3LjcgMTAuMS03My43LTEzLjctNTEuMi02Ni40LTgxLjYtMTE3LjYtNjcuOS04LjYgMi4zLTE2LjcgNS43LTI0IDEwbC0zNC43LTM0Ljd6TTMyNS4zIDM5NS4xYy0xMS45IDMuMi0yNC40IDQuOS0zNy4zIDQuOS03OS41IDAtMTQ0LTY0LjUtMTQ0LTE0NCAwLTEyLjkgMS43LTI1LjQgNC45LTM3LjNMNjkuNCAxMzkuMmMtMzIuNiAzNi44LTU1IDc1LjgtNjYuOSAxMDQuNS0zLjMgNy45LTMuMyAxNi43IDAgMjQuNiAxNC45IDM1LjcgNDYuMiA4Ny43IDkzIDEzMS4xIDQ3LjEgNDMuNyAxMTEuOCA4MC42IDE5Mi42IDgwLjYgMzcuMyAwIDcxLjItNy45IDEwMS41LTIwLjZsLTY0LjItNjQuMnoiXQogICAgfTsKICAgIGZhQ2FydEZsYXRiZWRTdWl0Y2FzZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYXJ0LWZsYXRiZWQtc3VpdGNhc2UiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsibHVnZ2FnZS1jYXJ0Il0sICJmNTlkIiwgIk0wIDMyQzAgMTQuMyAxNC4zIDAgMzIgMEw0OCAwYzQ0LjIgMCA4MCAzNS44IDgwIDgwbDAgMjg4YzAgOC44IDcuMiAxNiAxNiAxNmw0MDAgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzQuNyAwYzEuOCA1IDIuNyAxMC40IDIuNyAxNiAwIDI2LjUtMjEuNSA0OC00OCA0OHMtNDgtMjEuNS00OC00OGMwLTUuNiAxLTExIDIuNy0xNmwtMTk3LjUgMGMxLjggNSAyLjcgMTAuNCAyLjcgMTYgMCAyNi41LTIxLjUgNDgtNDggNDhzLTQ4LTIxLjUtNDgtNDhjMC02IDEuMS0xMS43IDMuMS0xNy0zOC4xLTYuMi02Ny4xLTM5LjItNjcuMS03OUw2NCA4MGMwLTguOC03LjItMTYtMTYtMTZMMzIgNjRDMTQuMyA2NCAwIDQ5LjcgMCAzMnpNMTc2IDE0NGMwLTI2LjUgMjEuNS00OCA0OC00OGwzMiAwIDAtMjRjMC0zMC45IDI1LjEtNTYgNTYtNTZsNjQgMGMzMC45IDAgNTYgMjUuMSA1NiA1NmwwIDI0IDMyIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAxNDRjMCAyNi41LTIxLjUgNDgtNDggNDhsLTI0MCAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTE0NHpNMzg0IDk2bDAtMjRjMC00LjQtMy42LTgtOC04bC02NCAwYy00LjQgMC04IDMuNi04IDhsMCAyNCA4MCAweiJdCiAgICB9OwogICAgZmFMdWdnYWdlQ2FydCA9IGZhQ2FydEZsYXRiZWRTdWl0Y2FzZTsKICAgIGZhUmFkaWF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJhZGlhdGlvbiIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmN2I5IiwgIk00NDYuMiAzNC41Yy0xNC4yLTEwLjEtMzMuNS00LjYtNDIuMiAxMC41TDMzMS42IDE3MC4zYzMxLjMgMTUuOCA1Mi44IDQ4LjMgNTIuOCA4NS43bDE0NCAwYzE3LjcgMCAzMi4yLTE0LjQgMzAuMS0zMS45LTkuMS03OC4xLTUxLjQtMTQ2LjEtMTEyLjMtMTg5LjZ6TTE3Mi43IDQ0LjlDMTY0IDI5LjggMTQ0LjcgMjQuMyAxMzAuNSAzNC41IDY5LjYgNzcuOSAyNy4zIDE0NS45IDE4LjIgMjI0LjEgMTYuMSAyNDEuNiAzMC43IDI1NiA0OC4zIDI1NmwxNDQgMGMwLTM3LjUgMjEuNS02OS45IDUyLjgtODUuN0wxNzIuNyA0NC45em0tOS40IDQxNi44Yy04LjcgMTUuMS0zLjggMzQuNSAxMiA0MS44IDM0LjQgMTUuNyA3Mi43IDI0LjUgMTEzIDI0LjVzNzguNi04LjggMTEzLTI0LjVjMTUuOC03LjIgMjAuNy0yNi43IDEyLTQxLjhMMzQxIDMzNi4zYy0xNS4xIDkuOS0zMy4yIDE1LjctNTIuNiAxNS43cy0zNy41LTUuOC01Mi42LTE1LjdMMTYzLjMgNDYxLjd6TTI4OC4zIDMwNGE0OCA0OCAwIDEgMCAtLjctOTYgNDggNDggMCAxIDAgLjcgOTZ6Il0KICAgIH07CiAgICBmYUZpbGVXb3JkMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLXdvcmQiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZjFjMiIsICJNMCA2NEMwIDI4LjcgMjguNyAwIDY0IDBMMjEzLjUgMGMxNyAwIDMzLjMgNi43IDQ1LjMgMTguN0wzNjUuMyAxMjUuM2MxMiAxMiAxOC43IDI4LjMgMTguNyA0NS4zTDM4NCA0NDhjMCAzNS4zLTI4LjcgNjQtNjQgNjRMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDY0em0yMDgtNS41bDAgOTMuNWMwIDEzLjMgMTAuNyAyNCAyNCAyNEwzMjUuNSAxNzYgMjA4IDU4LjV6TTEzNS40IDI3NC44Yy0yLjktMTIuOS0xNS43LTIxLjEtMjguNi0xOC4ycy0yMS4xIDE1LjctMTguMiAyOC42bDMyIDE0NGMyLjMgMTAuNSAxMS40IDE4LjIgMjIuMiAxOC44czIwLjYtNi4xIDI0LTE2LjRsMjUuMi03NS43IDI1LjIgNzUuN2MzLjQgMTAuMiAxMy4yIDE2LjkgMjQgMTYuNHMxOS45LTguMiAyMi4yLTE4LjhsMzItMTQ0YzIuOS0xMi45LTUuMy0yNS44LTE4LjItMjguNnMtMjUuOCA1LjMtMjguNiAxOC4ybC0xMy4yIDU5LjQtMjAuNi02MS44Yy0zLjMtOS44LTEyLjQtMTYuNC0yMi44LTE2LjRzLTE5LjUgNi42LTIyLjggMTYuNGwtMjAuNiA2MS44LTEzLjItNTkuNHoiXQogICAgfTsKICAgIGZhQmVkUHVsc2UgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmVkLXB1bHNlIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbInByb2NlZHVyZXMiXSwgImY0ODciLCAiTTUzMS4yLTIyLjRMNTcyIDMyIDYxNiAzMmMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtNTYgMGMtNy42IDAtMTQuNy0zLjYtMTkuMi05LjZsLTI0LjEtMzIuMS00NyA5OS45Yy0zLjcgNy44LTExLjMgMTMuMS0xOS45IDEzLjdzLTE2LjktMy40LTIxLjctMTAuNkwzODcuMiA4MCAzNDQgODBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsNTYgMGM4IDAgMTUuNSA0IDIwIDEwLjdsMjQuNCAzNi42IDQ1LjktOTcuNWMzLjYtNy42IDEwLjktMTIuOCAxOS4zLTEzLjdzMTYuNiAyLjcgMjEuNiA5LjV6TTMyMCAxNjBjMC0xNy43IDE0LjMtMzIgMzItMzJsOS41IDAgMjYuNiAzOS45YzE0LjQgMjEuNiAzOS4zIDMzLjggNjUuMiAzMS45czQ4LjgtMTcuNiA1OS44LTQxLjFMNTI3IDEyOS4yYzQ1LjkgNy4yIDgxIDQ2LjkgODEgOTQuOGwwIDIyNGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY0LTQ0OCAwIDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJMMzIgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJTOTYgNDYuMyA5NiA2NGwwIDIyNCAyMjQgMCAwLTEyOHpNMTQ0IDE5MmE2NCA2NCAwIDEgMSAxMjggMCA2NCA2NCAwIDEgMSAtMTI4IDB6Il0KICAgIH07CiAgICBmYVByb2NlZHVyZXMgPSBmYUJlZFB1bHNlOwogICAgZmFUZW50cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0ZW50cyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTgyIiwgIk01MzkuOSAzNTJsLTk1LjYgMC04LjQtNjYuMWMtMi45LTIzLjItMTUuOS00My45LTM1LjQtNTYuOEwyNTIuMiAxMzEuNWMtMTgtMTEuOS0zOS43LTE1LjctNjAuMS0xMS41IDIuNS00LjMgNS45LTcuOSAxMC4xLTEwLjdMMzUwLjYgMTEuNmMxMC43LTcgMjQuNS03IDM1LjIgMGwxNDguNCA5Ny43YzcuOCA1LjEgMTMgMTMuNCAxNC4yIDIyLjdsMjMuMyAxODRjMi40IDE5LjEtMTIuNSAzNi0zMS43IDM2ek00LjggNDc2bDIzLjMtMTg0YzEuMi05LjMgNi4zLTE3LjYgMTQuMi0yMi43bDE0OC40LTk3LjdjMTAuNy03IDI0LjUtNyAzNS4yIDBsMTQ4LjQgOTcuN2M3LjggNS4xIDEzIDEzLjQgMTQuMiAyMi43bDIzLjMgMTg0YzIuNCAxOS4xLTEyLjUgMzYtMzEuNyAzNmwtNDkuNyAwYy0xMS4yIDAtMjEuNS01LjgtMjcuMy0xNS40bC03Ny0xMjYuN2MtMS43LTIuOC00LjgtNC42LTguMS00LjYtNS4zIDAtOS41IDQuMy05LjUgOS41bDAgMTA1LjJjMCAxNy43LTE0LjMgMzItMzIgMzJMMzYuNSA1MTJjLTE5LjMgMC0zNC4yLTE2LjktMzEuNy0zNnoiXQogICAgfTsKICAgIGZhTXVnSG90ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm11Zy1ob3QiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFs5NzQ5XSwgImY3YjYiLCAiTTE1Mi0xNmMtMTMuMyAwLTI0IDEwLjctMjQgMjQgMCAzOC45IDIzLjQgNTkuNCAzOS4xIDczLjFsMS4xIDFjMTYuMyAxNC4zIDIzLjggMjEuOCAyMy44IDM3LjkgMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGMwLTM4LjktMjMuNC01OS40LTM5LjEtNzMuMWwtMS4xLTFDMTgzLjUgMzEuNyAxNzYgMjQuMSAxNzYgOCAxNzYtNS4zIDE2NS4zLTE2IDE1Mi0xNnpNOTYgMTkyYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDE5MmMwIDUzIDQzIDk2IDk2IDk2bDE5MiAwYzQxLjggMCA3Ny40LTI2LjcgOTAuNS02NGw1LjUgMGM3MC43IDAgMTI4LTU3LjMgMTI4LTEyOFM1MTguNyAxOTIgNDQ4IDE5Mkw5NiAxOTJ6TTQ0OCAzODRsMC0xMjhjMzUuMyAwIDY0IDI4LjcgNjQgNjRzLTI4LjcgNjQtNjQgNjR6TTI4OCA4YzAtMTMuMy0xMC43LTI0LTI0LTI0UzI0MC01LjMgMjQwIDhjMCAzOC45IDIzLjQgNTkuNCAzOS4xIDczLjFsMS4xIDFjMTYuMyAxNC4zIDIzLjggMjEuOCAyMy44IDM3LjkgMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGMwLTM4LjktMjMuNC01OS40LTM5LjEtNzMuMWwtMS4xLTFDMjk1LjUgMzEuNyAyODggMjQuMSAyODggOHoiXQogICAgfTsKICAgIGZhQm9sdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib2x0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbOTg4OSwgInphcCJdLCAiZjBlNyIsICJNMzM4LjgtOS45YzExLjkgOC42IDE2LjMgMjQuMiAxMC45IDM3LjhMMjcxLjMgMjI0IDQxNiAyMjRjMTMuNSAwIDI1LjUgOC40IDMwLjEgMjEuMXMuNyAyNi45LTkuNiAzNS41bC0yODggMjQwYy0xMS4zIDkuNC0yNy40IDkuOS0zOS4zIDEuM3MtMTYuMy0yNC4yLTEwLjktMzcuOEwxNzYuNyAyODggMzIgMjg4Yy0xMy41IDAtMjUuNS04LjQtMzAuMS0yMS4xcy0uNy0yNi45IDkuNi0zNS41bDI4OC0yNDBjMTEuMy05LjQgMjcuNC05LjkgMzkuMy0xLjN6Il0KICAgIH07CiAgICBmYVphcCA9IGZhQm9sdDsKICAgIGZhSmFyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImphciIsCiAgICAgIGljb246IFszMjAsIDUxMiwgW10sICJlNTE2IiwgIk0zMi04YzAtMTMuMyAxMC43LTI0IDI0LTI0bDIwOCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0TDU2IDE2QzQyLjcgMTYgMzIgNS4zIDMyLTh6TTAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDE5MiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjh6bTk2IDY0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDEyOGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxMjggMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTEyOGMwLTE3LjctMTQuMy0zMi0zMi0zMkw5NiAxOTJ6Il0KICAgIH07CiAgICBmYVRydWNrUGxhbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHJ1Y2stcGxhbmUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU4ZiIsICJNMTQ0IDQ4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4czQ4IDIxLjUgNDggNDhsMCAzMjBjMCAzMi41IDEyLjEgNjIuMSAzMiA4NC43bDAgMjcuM2MwIDcuMSAuOSAxNC4xIDIuNyAyMC43TDE5MiA0ODAgODMuOSA1MDdDNzMuOCA1MDkuNiA2NCA1MDEuOSA2NCA0OTEuNWwwLTE5LjhjMC00LjkgMi4yLTkuNSA2LTEyLjVsNzQtNTkuMiAwLTU3LjYtMTIyLjEgNDguOEMxMS40IDM5NS40IDAgMzg3LjcgMCAzNzYuNGwwLTQ0YzAtOCAzLTE1LjYgOC4zLTIxLjVMMTQ0IDE2MS42IDE0NCA0OHptMjI0IDgwbDE5MiAwYzQ0LjIgMCA4MCAzNS44IDgwIDgwbDAgMTYwYzAgMjYuMi0xMi42IDQ5LjQtMzIgNjRsMCA0OGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTMyLTE2MCAwIDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC00OGMtMTkuNC0xNC42LTMyLTM3LjgtMzItNjRsMC0xNjBjMC00NC4yIDM1LjgtODAgODAtODB6bTAgMTc2bDE5MiAwIDAtMzJjMC0xNy43LTE0LjMtMzItMzItMzJsLTEyOCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDMyem0wIDg4YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHptMjE2LTI0YTI0IDI0IDAgMSAwIC00OCAwIDI0IDI0IDAgMSAwIDQ4IDB6Il0KICAgIH07CiAgICBmYUhhbmRIb2xkaW5nSGVhcnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1ob2xkaW5nLWhlYXJ0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY0YmUiLCAiTTI3OS42IDMxQzI2NS41IDExLjUgMjQyLjkgMCAyMTguOSAwIDE3Ny41IDAgMTQ0IDMzLjUgMTQ0IDc0LjlsMCAyLjRjMCA2NC40IDgyIDEzMy40IDEyMi4yIDE2My4zIDEzIDkuNyAzMC41IDkuNyA0My41IDAgNDAuMi0zMCAxMjIuMi05OC45IDEyMi4yLTE2My4zbDAtMi40YzAtNDEuNC0zMy41LTc0LjktNzQuOS03NC45LTI0IDAtNDYuNiAxMS41LTYwLjcgMzFMMjg4IDQyLjcgMjc5LjYgMzF6TTEwOS4zIDM0MS41TDY2LjcgMzg0IDMyIDM4NGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwzMjAuNSAwYzI5IDAgNTcuMy05LjMgODAuNy0yNi41bDEyNi42LTkzLjNjMTcuOC0xMy4xIDIxLjYtMzguMSA4LjUtNTUuOXMtMzguMS0yMS42LTU1LjktOC41TDM5Mi42IDQxNiAyODAgNDE2Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDcyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTE1Mi4yIDBjLTMzLjkgMC02Ni41IDEzLjUtOTAuNSAzNy41eiJdCiAgICB9OwogICAgZmFBcnJvd1JvdGF0ZUxlZnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctcm90YXRlLWxlZnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs4NjM0LCAiYXJyb3ctbGVmdC1yb3RhdGUiLCAiYXJyb3ctcm90YXRlLWJhY2siLCAiYXJyb3ctcm90YXRlLWJhY2t3YXJkIiwgInVuZG8iXSwgImYwZTIiLCAiTTI1NiA2NGMtNTYuOCAwLTEwNy45IDI0LjctMTQzLjEgNjRsNDcuMSAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDE5MmMtMTcuNyAwLTMyLTE0LjMtMzItMzJMMCAzMkMwIDE0LjMgMTQuMyAwIDMyIDBTNjQgMTQuMyA2NCAzMmwwIDU0LjdDMTEwLjkgMzMuNiAxNzkuNSAwIDI1NiAwIDM5Ny40IDAgNTEyIDExNC42IDUxMiAyNTZTMzk3LjQgNTEyIDI1NiA1MTJjLTg3IDAtMTYzLjktNDMuNC0yMTAuMS0xMDkuNy0xMC4xLTE0LjUtNi42LTM0LjQgNy45LTQ0LjZzMzQuNC02LjYgNDQuNiA3LjljMzQuOCA0OS44IDkyLjQgODIuMyAxNTcuNiA4Mi4zIDEwNiAwIDE5Mi04NiAxOTItMTkyUzM2MiA2NCAyNTYgNjR6Il0KICAgIH07CiAgICBmYUFycm93TGVmdFJvdGF0ZSA9IGZhQXJyb3dSb3RhdGVMZWZ0OwogICAgZmFBcnJvd1JvdGF0ZUJhY2sgPSBmYUFycm93Um90YXRlTGVmdDsKICAgIGZhQXJyb3dSb3RhdGVCYWNrd2FyZCA9IGZhQXJyb3dSb3RhdGVMZWZ0OwogICAgZmFVbmRvID0gZmFBcnJvd1JvdGF0ZUxlZnQ7CiAgICBmYUZhY2VBbmdyeTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1hbmdyeSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU0NCwgImFuZ3J5Il0sICJmNTU2IiwgIk0wIDI1NmEyNTYgMjU2IDAgMSAxIDUxMiAwIDI1NiAyNTYgMCAxIDEgLTUxMiAwek0yNTYgMzY4YzI0LjEgMCA0NS40IDExLjggNTguNSAzMCA3LjcgMTAuOCAyMi43IDEzLjIgMzMuNSA1LjVzMTMuMi0yMi43IDUuNS0zMy41Yy0yMS43LTMwLjItNTcuMy01MC05Ny41LTUwcy03NS43IDE5LjgtOTcuNSA1MGMtNy43IDEwLjgtNS4zIDI1LjggNS41IDMzLjVzMjUuOCA1LjMgMzMuNS01LjVjMTMuMS0xOC4yIDM0LjQtMzAgNTguNS0zMHptLTgwLTk2YzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtLjMgOS43IDMuMmMxMC41IDMuNSAyMS44LTIuMiAyNS4zLTEyLjZzLTIuMi0yMS44LTEyLjYtMjUuM2wtOTYtMzJjLTEwLjUtMy41LTIxLjggMi4yLTI1LjMgMTIuNnMyLjIgMjEuOCAxMi42IDI1LjNsMjguOSA5LjZjLTQuMSA1LjQtNi42IDEyLjEtNi42IDE5LjQgMCAxNy43IDE0LjMgMzIgMzIgMzJ6bTE5Mi0zMmMwLTcuMy0yLjQtMTQtNi42LTE5LjRsMjguOS05LjZjMTAuNS0zLjUgMTYuMS0xNC44IDEyLjYtMjUuM3MtMTQuOC0xNi4xLTI1LjMtMTIuNmwtOTYgMzJjLTEwLjUgMy41LTE2LjEgMTQuOC0xMi42IDI1LjNzMTQuOCAxNi4xIDI1LjMgMTIuNmw5LjctMy4yIDAgLjNjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMnoiXQogICAgfTsKICAgIGZhQW5ncnkyID0gZmFGYWNlQW5ncnkyOwogICAgZmFCdXJzdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJidXJzdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNGRjIiwgIk0zNy42IDQuMkMyOC0yLjMgMTUuMi0xLjEgNyA3Uy0yLjMgMjggNC4yIDM3LjZsMTEyIDE2My4zLTk5LjYgMzIuM0M2LjcgMjM2LjQgMCAyNDUuNiAwIDI1NnM2LjcgMTkuNiAxNi42IDIyLjhsMTAzLjEgMzMuNC01Mi45IDEwMC42Yy00LjkgOS4zLTMuMiAyMC43IDQuMyAyOC4xczE4LjggOS4yIDI4LjEgNC4zbDEwMC42LTUyLjkgMzMuNCAxMDMuMWMzLjIgOS45IDEyLjQgMTYuNiAyMi44IDE2LjZzMTkuNi02LjcgMjIuOC0xNi42bDMzLjQtMTAzLjEgMTAwLjYgNTIuOWM5LjMgNC45IDIwLjcgMy4yIDI4LjEtNC4zczkuMi0xOC44IDQuMy0yOC4xbC01Mi45LTEwMC42IDEwMy4xLTMzLjRjOS45LTMuMiAxNi42LTEyLjQgMTYuNi0yMi44cy02LjctMTkuNi0xNi42LTIyLjhsLTEwNi41LTM0LjUgMjUuNy03MC40YzMuMi04LjggMS0xOC42LTUuNi0yNS4ycy0xNi40LTguOC0yNS4yLTUuNmwtNzAuNCAyNS43LTM0LjUtMTA2LjVDMjc1LjYgNi43IDI2Ni40IDAgMjU2IDBzLTE5LjYgNi43LTIyLjggMTYuNkwyMDAuOSAxMTYuMiAzNy42IDQuMnoiXQogICAgfTsKICAgIGZhWiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ6IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTIyXSwgIjVhIiwgIk0wIDY0QzAgNDYuMyAxNC4zIDMyIDMyIDMybDMyMCAwYzEyLjQgMCAyMy43IDcuMiAyOSAxOC40czMuNiAyNC41LTQuNCAzNC4xTDEwMC4zIDQxNiAzNTIgNDE2YzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDQ4MGMtMTIuNCAwLTIzLjctNy4yLTI5LTE4LjRzLTMuNi0yNC41IDQuNC0zNC4xTDI4My43IDk2IDMyIDk2QzE0LjMgOTYgMCA4MS43IDAgNjR6Il0KICAgIH07CiAgICBmYUJhbmRhZ2UgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYmFuZGFnZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzEyOTY1NywgImJhbmQtYWlkIl0sICJmNDYyIiwgIk00NjQgNDE2bDQ4IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0xOTJjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTQ4IDAgMCAzMjB6TTQxNiA5NmwtMjU2IDAgMCAzMjAgMjU2IDAgMC0zMjB6TTY0IDk2QzI4LjcgOTYgMCAxMjQuNyAwIDE2MEwwIDM1MmMwIDM1LjMgMjguNyA2NCA2NCA2NGw0OCAwIDAtMzIwLTQ4IDB6TTIxNiAyMDhhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHptMTIwLTI0YTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHpNMjE2IDMwNGEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwem0xMjAtMjRhMjQgMjQgMCAxIDEgMCA0OCAyNCAyNCAwIDEgMSAwLTQ4eiJdCiAgICB9OwogICAgZmFCYW5kQWlkID0gZmFCYW5kYWdlOwogICAgZmFQbGFuZUNpcmNsZUV4Y2xhbWF0aW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBsYW5lLWNpcmNsZS1leGNsYW1hdGlvbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTU2IiwgIk0yMzIgMjRjMC0zMC45IDI1LjEtNTYgNTYtNTZzNTYgMjUuMSA1NiA1NmwwIDEyNy4zIDc4IDcxLjVjLTY5LjMgMjktMTE4IDk3LjQtMTE4IDE3Ny4yIDAgNDkuMyAxOC42IDk0LjMgNDkuMSAxMjguM0wyODggNTEyIDE3OS45IDUzOWMtMTAuMSAyLjUtMTkuOS01LjEtMTkuOS0xNS41bDAtMTkuOGMwLTQuOSAyLjItOS41IDYtMTIuNWw2Ni01Mi44IDAtOTkuNy0xNjIuOSA1NC4zQzU4LjcgMzk2LjQgNDggMzg4LjcgNDggMzc3LjhsMC00My43YzAtOSAzLjgtMTcuNSAxMC40LTIzLjZMMjMyIDE1MS4zIDIzMiAyNHpNNDk2IDI1NmExNDQgMTQ0IDAgMSAxIDAgMjg4IDE0NCAxNDQgMCAxIDEgMC0yODh6bTAgMjI4YTIwIDIwIDAgMSAwIDAtNDAgMjAgMjAgMCAxIDAgMCA0MHptMC0xODBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDgwYzAgOC44IDcuMiAxNiAxNiAxNnMxNi03LjIgMTYtMTZsMC04MGMwLTguOC03LjItMTYtMTYtMTZ6Il0KICAgIH07CiAgICBmYUJ1c1NpZGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnVzLXNpZGUiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTgxZCIsICJNNDgwIDBjODguNCAwIDE2MCA3MS42IDE2MCAxNjBsMCAyMjRjMCAzNS4zLTI4LjcgNjQtNjQgNjRsLTUuNiAwYy0xMy4yIDM3LjMtNDguNiA2NC05MC40IDY0cy03Ny4zLTI2LjctOTAuNC02NGwtMTM5LjEgMGMtMTMuMiAzNy4zLTQ4LjcgNjQtOTAuNCA2NHMtNzcuMi0yNi43LTkwLjQtNjRMNjQgNDQ4Yy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2QzAgNDMgNDMgMCA5NiAwTDQ4MCAwek0xNjAgMzY4YTQ4IDQ4IDAgMSAwIDAgOTYgNDggNDggMCAxIDAgMC05NnptMzIwIDBhNDggNDggMCAxIDAgMCA5NiA0OCA0OCAwIDEgMCAwLTk2em0wLTMwNGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCAxOTJjMCAxNy43IDE0LjMgMzIgMzIgMzJsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTEyOGMwLTUzLTQzLTk2LTk2LTk2ek0yNDggMjI0bDEwNCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtOTZjMC0xNy43LTE0LjMtMzItMzItMzJsLTEwNCAwIDAgMTYwek05NiA2NEM3OC4zIDY0IDY0IDc4LjMgNjQgOTZsMCA5NmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxMDQgMCAwLTE2MC0xMDQgMHoiXQogICAgfTsKICAgIGZhQnVncyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJidWdzIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU0ZDAiLCAiTTQ0Ny41IDE3NC42YzguOC04LjQgMjIuNy04LjkgMzIuMi0uOHMxMSAyMS45IDQuMSAzMS45bC0xLjUgMS45LTIzIDI2LjdjMjYuNyAxMy41IDQ2LjMgMzkuMSA1MS40IDY5LjZsMjUuMyAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0yNCAwIDAgMzIgMjQgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMjUuMyAwYy03LjYgNDUuNC00Ny4xIDgwLTk0LjcgODBzLTg3LTM0LjYtOTQuNy04MEwyOTYgNDMyYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDI0IDAgMC0zMi0yNCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDI1LjMgMGM1LjEtMzAuNSAyNC43LTU2LjEgNTEuNC02OS42bC0yMi45LTI2LjdjLTguNi0xMC4xLTcuNS0yNS4yIDIuNi0zMy44czI1LjItNy41IDMzLjggMi42bDI5LjggMzQuOCAyOS44LTM0LjggMS43LTEuOHptLTI1Ni0xOTJjOC44LTguNCAyMi43LTguOSAzMi4yLS44czExIDIxLjkgNC4xIDMxLjlsLTEuNSAxLjktMjMgMjYuN0MyMzAgNTUuOSAyNDkuNSA4MS41IDI1NC43IDExMmwyNS4zIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTI0IDAgMCAzMiAyNCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0yNS4zIDBjLTcuNiA0NS40LTQ3LjEgODAtOTQuNyA4MHMtODctMzQuNi05NC43LTgwTDQwIDI0MGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwyNCAwIDAtMzItMjQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwyNS4zIDBDNzAuNSA4MS41IDkwIDU1LjkgMTE2LjcgNDIuNEw5My44IDE1LjZDODUuMiA1LjYgODYuMy05LjYgOTYuNC0xOC4yczI1LjItNy41IDMzLjggMi42bDI5LjggMzQuOCAyOS44LTM0LjggMS43LTEuOHoiXQogICAgfTsKICAgIGZhQmVlck11Z0VtcHR5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJlZXItbXVnLWVtcHR5IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImJlZXIiXSwgImYwZmMiLCAiTTY0IDgwYzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDI4OCAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMTYgNjQgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDEwOC4yYzAgMjQuMi0xMy43IDQ2LjQtMzUuNCA1Ny4yTDQ0OCAzNzEuOCA0NDggMzg0YzAgNTMtNDMgOTYtOTYgOTZsLTE5MiAwYy01MyAwLTk2LTQzLTk2LTk2TDY0IDgwek00NDggMzAwLjJsNjQtMzIgMC0xMDguMi02NCAwIDAgMTQwLjJ6TTE5MiAxNTJjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCAyMDhjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTIwOHptODggMGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDIwOGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMjA4em04OCAwYzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMjA4YzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0yMDh6Il0KICAgIH07CiAgICBmYUJlZXIgPSBmYUJlZXJNdWdFbXB0eTsKICAgIGZhUGVyc29uQ2lyY2xlQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLWNpcmNsZS1jaGVjayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTNlIiwgIk0yODAgMjRhNTYgNTYgMCAxIDAgLTExMiAwIDU2IDU2IDAgMSAwIDExMiAwem0yNCAyMTIuN0wzNDEgMjg2LjZjMTIuOC0xNy41IDI4LjUtMzIuNyA0Ni4zLTQ1bC01Ni4yLTc1LjdDMzA2IDEzMiAyNjYuMyAxMTIgMjI0IDExMnMtODIgMjAtMTA3LjIgNTMuOWwtNzAuNSA5NWMtMTAuNSAxNC4yLTcuNiAzNC4yIDYuNiA0NC44czM0LjIgNy42IDQ0LjgtNi42TDE0NCAyMzYuNyAxNDQgNTEyYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xNjBjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDE2MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjc1LjN6TTY0MCA0MDBhMTQ0IDE0NCAwIDEgMCAtMjg4IDAgMTQ0IDE0NCAwIDEgMCAyODggMHptLTg2LjYtNjAuOWM3LjEgNS4yIDguNyAxNS4yIDMuNSAyMi4zbC02NCA4OGMtMi44IDMuOC03IDYuMi0xMS43IDYuNXMtOS4zLTEuMy0xMi42LTQuNmwtNDAtNDBjLTYuMi02LjItNi4yLTE2LjQgMC0yMi42czE2LjQtNi4yIDIyLjYgMGwyNi44IDI2LjggNTMtNzIuOWM1LjItNy4xIDE1LjItOC43IDIyLjQtMy41eiJdCiAgICB9OwogICAgZmFTdGFwbGVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN0YXBsZXIiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTVhZiIsICJNNjQwIDI5OS4zTDY0MCA0MzJjMCAyNi41LTIxLjUgNDgtNDggNDhMNjQgNDgwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDM4NCAwIDAtNDgtMzUyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTE2LjYtMzAuMi01LjRjLTE5LjYtMy41LTMzLjgtMjAuNS0zMy44LTQwLjQgMC04LjkgMi45LTE3LjUgOC4yLTI0LjZsMzUuNi00Ny41YzMyLjgtNDMuOCA4NC40LTY5LjYgMTM5LjEtNjkuNiAyNyAwIDUzLjYgNi4zIDc3LjggMTguNEw1ODYuOSAyMTMuNUM2MTkuNSAyMjkuNyA2NDAgMjYzIDY0MCAyOTkuM3pNNDQ4IDMwNGwwLTE2LTMyMC01Ny4xIDAgNzMuMSAzMjAgMHoiXQogICAgfTsKICAgIGZhSG91c2VNZWRpY2FsQ2lyY2xlQ2hlY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG91c2UtbWVkaWNhbC1jaXJjbGUtY2hlY2siLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTUxMSIsICJNMzA5LjggOC42Yy0xMi4zLTExLjQtMzEuMy0xMS40LTQzLjUgMGwtMjI0IDIwOGMtOS42IDktMTIuOCAyMi45LTggMzUuMVM1MC44IDI3MiA2NCAyNzJsMTYgMCAwIDE3NmMwIDM1LjMgMjguNyA2NCA2NCA2NGwxOTYgMGMtMjEuMi0yOS41LTM0LjMtNjUuMy0zNS45LTEwNEwyNzIgNDA4Yy04LjggMC0xNi03LjItMTYtMTZsMC00MC00MCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsNDAgMCAwLTQwYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDQwIDIwIDBjMzQuOS00OC41IDkxLjctODAgMTU2LTgwIDEwLjcgMCAyMS4xIC45IDMxLjMgMi41TDMwOS44IDguNnpNNjQwIDQwMGExNDQgMTQ0IDAgMSAwIC0yODggMCAxNDQgMTQ0IDAgMSAwIDI4OCAwem0tODYuNi02MC45YzcuMSA1LjIgOC43IDE1LjIgMy41IDIyLjNsLTY0IDg4Yy0yLjggMy44LTcgNi4yLTExLjcgNi41cy05LjMtMS4zLTEyLjYtNC42bC00MC00MGMtNi4yLTYuMi02LjItMTYuNCAwLTIyLjZzMTYuNC02LjIgMjIuNiAwbDI2LjggMjYuOCA1My03Mi45YzUuMi03LjEgMTUuMi04LjcgMjIuNC0zLjV6Il0KICAgIH07CiAgICBmYU5haXJhU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJuYWlyYS1zaWduIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImUxZjYiLCAiTTEyMi42IDQ2LjNjLTcuOC0xMS43LTIyLjQtMTctMzUuOS0xMi45UzY0IDQ5LjkgNjQgNjRsMCAxOTItMzIgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwzMiAwIDAgMTQ0YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xNDQgODkuNSAwIDEwNy44IDE2MS44YzcuOCAxMS43IDIyLjQgMTcgMzUuOSAxMi45UzM4NCA0NjIuMSAzODQgNDQ4bDAtMTQ0IDMyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTMyIDAgMC0xOTJjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAxOTItNTcuNSAwLTEzOS44LTIwOS43ek0yOTQuNSAzMDRsMjUuNSAwIDAgMzguMy0yNS41LTM4LjN6TTE4NS41IDI1NmwtNTcuNSAwIDAtODYuMyA1Ny41IDg2LjN6Il0KICAgIH07CiAgICBmYVdpZmkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid2lmaSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJ3aWZpLTMiLCAid2lmaS1zdHJvbmciXSwgImYxZWIiLCAiTTI4OCA5NmMtOTAuOSAwLTE3My4yIDM2LTIzMy43IDk0LjYtMTIuNyAxMi4zLTMzIDEyLTQ1LjItLjdzLTEyLTMzIC43LTQ1LjJDODEuNyA3NC45IDE3OS45IDMyIDI4OCAzMlM0OTQuMyA3NC45IDU2Ni4zIDE0NC43YzEyLjcgMTIuMyAxMyAzMi42IC43IDQ1LjJzLTMyLjYgMTMtNDUuMiAuN0M0NjEuMiAxMzIgMzc4LjkgOTYgMjg4IDk2ek0yNDAgNDMyYTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6TTE2OCAzMjYuMmMtMTEuNyAxMy4zLTMxLjkgMTQuNS00NS4yIDIuOHMtMTQuNS0zMS45LTIuOC00NS4yQzE2MSAyMzcuNCAyMjEuMSAyMDggMjg4IDIwOHMxMjcgMjkuNCAxNjggNzUuOGMxMS43IDEzLjMgMTAuNCAzMy41LTIuOCA0NS4ycy0zMy41IDEwLjQtNDUuMi0yLjhDMzc4LjYgMjkyLjkgMzM1LjggMjcyIDI4OCAyNzJzLTkwLjYgMjAuOS0xMjAgNTQuMnoiXQogICAgfTsKICAgIGZhV2lmaTMgPSBmYVdpZmk7CiAgICBmYVdpZmlTdHJvbmcgPSBmYVdpZmk7CiAgICBmYU1vbmV5Q2hlY2tEb2xsYXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibW9uZXktY2hlY2stZG9sbGFyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbIm1vbmV5LWNoZWNrLWFsdCJdLCAiZjUzZCIsICJNNjQgNjRDMjguNyA2NCAwIDkyLjcgMCAxMjhMMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgNjR6TTI5NiAyODhsMTI4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTEyOCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0em0tMjQtODhjMC0xMy4zIDEwLjctMjQgMjQtMjRsMTI4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTEyOCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHpNMTQ4IDE0NGMxMSAwIDIwIDkgMjAgMjBsMCA0IDggMGMxMSAwIDIwIDkgMjAgMjBzLTkgMjAtMjAgMjBsLTQ3LjUgMGMtNi45IDAtMTIuNSA1LjYtMTIuNSAxMi41IDAgNi4xIDQuNCAxMS4zIDEwLjQgMTIuM2w0MS43IDdjMjUuMyA0LjIgNDMuOSAyNi4xIDQzLjkgNTEuOCAwIDI2LjEtMTkgNDcuNy00NCA1MS44bDAgNC43YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLTQtMjQgMGMtMTEgMC0yMC05LTIwLTIwczktMjAgMjAtMjBsNTUuNSAwYzYuOSAwIDEyLjUtNS42IDEyLjUtMTIuNSAwLTYuMS00LjQtMTEuMy0xMC40LTEyLjNsLTQxLjctN0M5NC41IDI2OCA3NiAyNDYuMSA3NiAyMjAuNSA3NiAxOTEuNyA5OS4yIDE2OC4zIDEyOCAxNjhsMC00YzAtMTEgOS0yMCAyMC0yMHoiXQogICAgfTsKICAgIGZhTW9uZXlDaGVja0FsdCA9IGZhTW9uZXlDaGVja0RvbGxhcjsKICAgIGZhRXllTG93VmlzaW9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImV5ZS1sb3ctdmlzaW9uIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImxvdy12aXNpb24iXSwgImYyYTgiLCAiTTQxLTI0LjljLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwUy0yLjMtLjMgNyA5LjFsNTI4IDUyOGM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlsLTk2LjQtOTYuNGMyLjctMi40IDUuNC00LjggOC03LjIgNDYuOC00My41IDc4LjEtOTUuNCA5My0xMzEuMSAzLjMtNy45IDMuMy0xNi43IDAtMjQuNi0xNC45LTM1LjctNDYuMi04Ny43LTkzLTEzMS4xLTQ3LjEtNDMuNy0xMTEuOC04MC42LTE5Mi42LTgwLjYtNTYuOCAwLTEwNS42IDE4LjItMTQ2IDQ0LjJMNDEtMjQuOXpNMjA0LjUgMTM4LjdjMjMuNS0xNi44IDUyLjQtMjYuNyA4My41LTI2LjcgNzkuNSAwIDE0NCA2NC41IDE0NCAxNDQgMCAzMS4xLTkuOSA1OS45LTI2LjcgODMuNWwtMzQuNy0zNC43YzEyLjctMjEuNCAxNy00Ny43IDEwLjEtNzMuNy0xMy43LTUxLjItNjYuNC04MS42LTExNy42LTY3LjktOC42IDIuMy0xNi43IDUuNy0yNCAxMGwtMzQuNy0zNC43ek04OCAxNTcuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOUwzMjguMiA0NjZjOS40IDkuNCAyNC42IDkuNCAzMy45IDBzOS40LTI0LjYgMC0zMy45TDg4IDE1Ny45ek00NS43IDI1MS4zYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45TDE4MS45IDQ1NS41YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOUw0NS43IDI1MS4zeiJdCiAgICB9OwogICAgZmFMb3dWaXNpb24gPSBmYUV5ZUxvd1Zpc2lvbjsKICAgIGZhQ2lyY2xlQXJyb3dVcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtYXJyb3ctdXAiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiYXJyb3ctY2lyY2xlLXVwIl0sICJmMGFhIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnptMTctMzc3bDgwIDgwYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTM5LTM5IDAgMTUwLjFjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0xNTAuMS0zOSAzOWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWw4MC04MGM5LjQtOS40IDI0LjYtOS40IDMzLjkgMHoiXQogICAgfTsKICAgIGZhQXJyb3dDaXJjbGVVcCA9IGZhQ2lyY2xlQXJyb3dVcDsKICAgIGZhQ2FtZXJhUmV0cm8gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FtZXJhLXJldHJvIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MjQ3XSwgImYwODMiLCAiTTAgNDE2bDAtMjA4IDEzNi4yIDBjMTMuNS0yMC4yIDMyLTM2LjggNTMuNy00OEwwIDE2MCAwIDEyNS43YzAtMzUuMyAyOC43LTY0IDY0LTY0bC4xIDBDNjUuMyA0NS4xIDc5LjEgMzIgOTYgMzJsMzIgMGMxNi45IDAgMzAuNyAxMy4xIDMxLjkgMjkuN2wzMi4xIDAgNTEuMi0yMy44YzguNC0zLjkgMTcuNi02IDI2LjktNkw0NDggMzJjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCA2NC0xOTAgMGMyMS43IDExLjIgNDAuMiAyNy44IDUzLjcgNDhsMTM2LjIgMCAwIDIwOGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0ek0yNTYgMTkyYTk2LjEgOTYuMSAwIDEgMCAwIDE5Mi4xIDk2LjEgOTYuMSAwIDEgMCAwLTE5Mi4xeiJdCiAgICB9OwogICAgZmFDYXBzdWxlcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYXBzdWxlcyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJmNDZiIiwgIk05NiAxMTJjMC0yNi41IDIxLjUtNDggNDgtNDhzNDggMjEuNSA0OCA0OGwwIDExMi05NiAwIDAtMTEyem0tNjQgMGwwIDI4OGMwIDYxLjkgNTAuMSAxMTIgMTEyIDExMnMxMTItNTAuMSAxMTItMTEybDAtMTA1LjggMTE2LjMgMTY5LjVjMzUuNSA1MS43IDEwNS4zIDY0LjMgMTU2IDI4LjFzNjMtMTA3LjUgMjcuNS0xNTkuMkw0MjcuMyAxNDUuM2MtMzUuNS01MS43LTEwNS4zLTY0LjMtMTU2LTI4LjEtNS42IDQtMTAuNyA4LjQtMTUuMyAxMy4xbDAtMTguM0MyNTYgNTAuMSAyMDUuOSAwIDE0NCAwUzMyIDUwLjEgMzIgMTEyek0yOTYuNiAyNDAuMmMtMTYtMjMuMy0xMC01NS4zIDExLjktNzEgMjEuMi0xNS4xIDUwLjUtMTAuMyA2NiAxMi4ybDY3IDk3LjYtNzkuOSA1NS45LTY1LTk0Ljh6Il0KICAgIH07CiAgICBmYVBvbyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwb28iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgxNjldLCAiZjJmZSIsICJNMjY4LjkgLjljLTUuNS0uNy0xMSAxLjQtMTQuNSA1LjdzLTQuNiAxMC4xLTIuOCAxNS40YzIuOCA4LjIgNC4zIDE2LjkgNC4zIDI2LjEgMCA0NC4xLTM1LjcgNzkuOS03OS44IDgwTDE2MCAxMjhjLTM1LjMgMC02NCAyOC43LTY0IDY0IDAgMTkuMSA4LjQgMzYuMyAyMS43IDQ4TDEwNCAyNDBjLTM5LjggMC03MiAzMi4yLTcyIDcyIDAgMjMuMiAxMSA0My44IDI4IDU3LTM0LjEgNS43LTYwIDM1LjMtNjAgNzEgMCAzOS44IDMyLjIgNzIgNzIgNzJsMzY4IDBjMzkuOCAwIDcyLTMyLjIgNzItNzIgMC0zNS43LTI1LjktNjUuMy02MC03MSAxNy0xMy4yIDI4LTMzLjggMjgtNTcgMC0zOS44LTMyLjItNzItNzItNzJsLTEzLjcgMGMxMy4zLTExLjcgMjEuNy0yOC45IDIxLjctNDggMC0zNS4zLTI4LjctNjQtNjQtNjRsLTUuNSAwYzMuNS0xMCA1LjUtMjAuOCA1LjUtMzIgMC00OC42LTM2LjItODguOC04My4xLTk1LjF6TTE5MiAyNTZhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0em05NiAzMmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem02NCAxMDguM2MwIDIuNC0uNyA0LjgtMi4yIDYuNy04LjIgMTAuNS0zOS41IDQ1LTkzLjggNDVzLTg1LjYtMzQuNi05My44LTQ1Yy0xLjUtMS45LTIuMi00LjMtMi4yLTYuNyAwLTYuOCA1LjUtMTIuMyAxMi4zLTEyLjNsMTY3LjQgMGM2LjggMCAxMi4zIDUuNSAxMi4zIDEyLjN6Il0KICAgIH07CiAgICBmYVZvbHVtZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ2b2x1bWUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgyNjUsICJ2b2x1bWUtbWVkaXVtIl0sICJmNmE4IiwgIk00OCAzNTJsNDggMCAxMzQuMSAxMTkuMmM2LjQgNS43IDE0LjYgOC44IDIzLjEgOC44IDE5LjIgMCAzNC44LTE1LjYgMzQuOC0zNC44bDAtMzc4LjRjMC0xOS4yLTE1LjYtMzQuOC0zNC44LTM0LjgtOC41IDAtMTYuNyAzLjEtMjMuMSA4LjhMOTYgMTYwIDQ4IDE2MGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCA5NmMwIDI2LjUgMjEuNSA0OCA0OCA0OHpNNDQxLjEgMTA3Yy0xMC4zLTguNC0yNS40LTYuOC0zMy44IDMuNXMtNi44IDI1LjQgMy41IDMzLjhDNDQzLjMgMTcwLjcgNDY0IDIxMC45IDQ2NCAyNTZzLTIwLjcgODUuMy01My4yIDExMS44Yy0xMC4zIDguNC0xMS44IDIzLjUtMy41IDMzLjhzMjMuNSAxMS44IDMzLjggMy41YzQzLjItMzUuMiA3MC45LTg4LjkgNzAuOS0xNDlzLTI3LjctMTEzLjgtNzAuOS0xNDl6bS02MC41IDc0LjVjLTEwLjMtOC40LTI1LjQtNi44LTMzLjggMy41cy02LjggMjUuNCAzLjUgMzMuOEMzNjEuMSAyMjcuNiAzNjggMjQxIDM2OCAyNTZzLTYuOSAyOC40LTE3LjcgMzcuM2MtMTAuMyA4LjQtMTEuOCAyMy41LTMuNSAzMy44czIzLjUgMTEuOCAzMy44IDMuNUM0MDIuMSAzMTIuOSA0MTYgMjg2LjEgNDE2IDI1NnMtMTMuOS01Ni45LTM1LjUtNzQuNXoiXQogICAgfTsKICAgIGZhVm9sdW1lTWVkaXVtID0gZmFWb2x1bWU7CiAgICBmYUVsZXZhdG9yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImVsZXZhdG9yIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUxNmQiLCAiTTI5Mi43LTQuN2w2NCA2NGM2LjIgNi4yIDE2LjQgNi4yIDIyLjYgMGw2NC02NGM0LjYtNC42IDUuOS0xMS41IDMuNS0xNy40UzQzOC41LTMyIDQzMi0zMkwzMDQtMzJjLTYuNSAwLTEyLjMgMy45LTE0LjggOS45cy0xLjEgMTIuOSAzLjUgMTcuNHptLTE2MC0yMi42bC02NCA2NGMtNC42IDQuNi01LjkgMTEuNS0zLjUgMTcuNFM3My41IDY0IDgwIDY0bDEyOCAwYzYuNSAwIDEyLjMtMy45IDE0LjgtOS45czEuMS0xMi45LTMuNS0xNy40bC02NC02NGMtNi4yLTYuMi0xNi40LTYuMi0yMi42IDB6TTY0IDEyOGMtMzUuMyAwLTY0IDI4LjctNjQgNjRMMCA0NDhjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMTI4em05NiA5NmE0OCA0OCAwIDEgMSAwIDk2IDQ4IDQ4IDAgMSAxIDAtOTZ6TTgwIDQwMGMwLTI2LjUgMjEuNS00OCA0OC00OGw2NCAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgMTZjMCAxNy43LTE0LjMgMzItMzIgMzJsLTk2IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtMTZ6bTE5MiAwYzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDY0IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCAxNmMwIDE3LjctMTQuMyAzMi0zMiAzMmwtOTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0xNnptMzItMTI4YTQ4IDQ4IDAgMSAxIDk2IDAgNDggNDggMCAxIDEgLTk2IDB6Il0KICAgIH07CiAgICBmYVRhZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjc5OTFdLCAiZjAyYiIsICJNMzIuNSA5NmwwIDE0OS41YzAgMTcgNi43IDMzLjMgMTguNyA0NS4zbDE5MiAxOTJjMjUgMjUgNjUuNSAyNSA5MC41IDBMNDgzLjIgMzMzLjNjMjUtMjUgMjUtNjUuNSAwLTkwLjVsLTE5Mi0xOTJDMjc5LjIgMzguNyAyNjMgMzIgMjQ2IDMyTDk2LjUgMzJjLTM1LjMgMC02NCAyOC43LTY0IDY0em0xMTIgMTZhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFGaWxlQ2lyY2xlTWludXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1jaXJjbGUtbWludXMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRlZCIsICJNOTYgMEM2MC43IDAgMzIgMjguNyAzMiA2NGwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxODAgMGMtMjIuNy0zMS41LTM2LTcwLjItMzYtMTEyIDAtMTAwLjYgNzcuNC0xODMuMiAxNzYtMTkxLjNsMC0zOC4xYzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI5MC43IDE4LjdDMjc4LjcgNi43IDI2Mi41IDAgMjQ1LjUgMEw5NiAwek0zNTcuNSAxNzZMMjY0IDE3NmMtMTMuMyAwLTI0LTEwLjctMjQtMjRMMjQwIDU4LjUgMzU3LjUgMTc2ek01NzYgNDAwYTE0NCAxNDQgMCAxIDAgLTI4OCAwIDE0NCAxNDQgMCAxIDAgMjg4IDB6bS02NCAwYzAgOC44LTcuMiAxNi0xNiAxNmwtMTI4IDBjLTguOCAwLTE2LTcuMi0xNi0xNnM3LjItMTYgMTYtMTZsMTI4IDBjOC44IDAgMTYgNy4yIDE2IDE2eiJdCiAgICB9OwogICAgZmFEb3duTG9uZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkb3duLWxvbmciLAogICAgICBpY29uOiBbMzIwLCA1MTIsIFsibG9uZy1hcnJvdy1hbHQtZG93biJdLCAiZjMwOSIsICJNMTM3LjQgNTM0LjZjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsMTI4LTEyOGM5LjItOS4yIDExLjktMjIuOSA2LjktMzQuOVMzMDAuOSAzNTIgMjg4IDM1MmwtNjQgMCAwLTMzNmMwLTI2LjUtMjEuNS00OC00OC00OGwtMzIgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCAzMzYtNjQgMGMtMTIuOSAwLTI0LjYgNy44LTI5LjYgMTkuOFMuMiAzOTcuNSA5LjQgNDA2LjZsMTI4IDEyOHoiXQogICAgfTsKICAgIGZhTG9uZ0Fycm93QWx0RG93biA9IGZhRG93bkxvbmc7CiAgICBmYUNvbXBhY3REaXNjID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvbXBhY3QtZGlzYyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODE5MSwgMTI4MTkyLCAxMjg0NDBdLCAiZjUxZiIsICJNMCAyNTZhMjU2IDI1NiAwIDEgMSA1MTIgMCAyNTYgMjU2IDAgMSAxIC01MTIgMHptMjU2IDMyYTMyIDMyIDAgMSAxIDAtNjQgMzIgMzIgMCAxIDEgMCA2NHptLTk2LTMyYTk2IDk2IDAgMSAwIDE5MiAwIDk2IDk2IDAgMSAwIC0xOTIgMHptLTU2LTE2YzAtMzIuNCAxNi4zLTY2LjYgNDIuOC05My4yUzIwNy42IDEwNCAyNDAgMTA0YzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0Yy00Ny45IDAtOTMuNyAyMy41LTEyNy4xIDU2LjlTNTYgMTkyLjEgNTYgMjQwYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjR6Il0KICAgIH07CiAgICBmYVN1aXRjYXNlUm9sbGluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzdWl0Y2FzZS1yb2xsaW5nIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY1YzEiLCAiTTE0NCAyNGMwLTQuNCAzLjYtOCA4LThsODAgMGM0LjQgMCA4IDMuNiA4IDhsMCA3Mi05NiAwIDAtNzJ6TTMyMCA5NmwtMzIgMCAwLTcyYzAtMzAuOS0yNS4xLTU2LTU2LTU2bC04MCAwQzEyMS4xLTMyIDk2LTYuOSA5NiAyNGwwIDcyLTMyIDBDMjguNyA5NiAwIDEyNC43IDAgMTYwTDAgNDQ4YzAgMzUuMyAyOC43IDY0IDY0IDY0IDAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMTI4IDBjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI4OGMwLTM1LjMtMjguNy02NC02NC02NHpNMTIwIDIwOGwxNDQgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTQ0IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6bTAgMTI4bDE0NCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNDQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhQm9va1F1cmFuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvb2stcXVyYW4iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsicXVyYW4iXSwgImY2ODciLCAiTTY0IDUxMmwyODggMGM1MyAwIDk2LTQzIDk2LTk2bDAtMzIwYzAtNTMtNDMtOTYtOTYtOTZMNDggMEMyMS41IDAgMCAyMS41IDAgNDhMMCAzMzZjMCAyMC45IDEzLjQgMzguNyAzMiA0NS4zTDMyIDQ0OGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwzMiAwek0zNTIgMzg0YzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC0yNTYgMCAwLTY0IDI1NiAwek0yNzMuMSAxNDQuNGMyLjUtNi4xIDExLjItNi4xIDEzLjcgMGwxMC4zIDI0LjggMjYuOCAyLjFjNi42IC41IDkuMiA4LjcgNC4yIDEzTDMwNy44IDIwMS45IDMxNCAyMjhjMS41IDYuNC01LjUgMTEuNS0xMS4xIDguMWwtMjIuOS0xNC0yMi45IDE0Yy01LjYgMy40LTEyLjYtMS42LTExLjEtOC4xbDYuMi0yNi4xLTIwLjQtMTcuNWMtNS00LjMtMi4zLTEyLjUgNC4yLTEzbDI2LjgtMi4xIDEwLjMtMjQuOHpNMTAwIDE5MmMwLTY4LjUgNTUuNS0xMjQgMTI0LTEyNCAyMy44IDAgNDYuMSA2LjcgNjUgMTguNCA0LjggMi45IDYuOSA4LjggNSAxNC4xcy03LjEgOC42LTEyLjcgOGMtMy4xLS4zLTYuMi0uNS05LjQtLjUtNDYuNCAwLTg0IDM3LjYtODQgODRzMzcuNiA4NCA4NCA4NGMzLjIgMCA2LjMtLjIgOS40LS41IDUuNi0uNiAxMC44IDIuNyAxMi43IDhzLS4zIDExLjItNSAxNC4xYy0xOC45IDExLjctNDEuMiAxOC40LTY1IDE4LjQtNjguNSAwLTEyNC01NS41LTEyNC0xMjR6Il0KICAgIH07CiAgICBmYVF1cmFuID0gZmFCb29rUXVyYW47CiAgICBmYVBob25lU2xhc2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGhvbmUtc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjNkZCIsICJNNTM1LTI0LjljOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45TDQxIDUzNy4xYy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45TDE0MS41IDM2OC42Qzg5LjIgMzEwLjUgNTEuNiAyMzguOCAzNC44IDE1OS40IDE4LjcgODMuMSA3My45IDIwLjYgMTM4LjUgMi45bDUuNS0xLjVjMTkuNy01LjQgNDAuMyA0LjcgNDguMSAyMy41bDQwLjUgOTcuM2M2LjkgMTYuNSAyLjEgMzUuNi0xMS44IDQ3bC00NC4xIDM2LjFjMTIuOSAyOC41IDI5LjYgNTQuOCA0OS41IDc4LjVMNTM1LTI0Ljl6bS0xNTAuNCA1MzRjLTYzLTEzLjQtMTIxLjMtMzkuOC0xNzEuNy03Ni4zTDI5Ny44IDM0OGMxMi4yIDguMiAyNSAxNS42IDM4LjMgMjIuMkwzNzQuNyAzMjNjMTEuMy0xMy45IDMwLjQtMTguNiA0Ny0xMS44TDUxOSAzNTEuOGMxOC44IDcuOCAyOC45IDI4LjQgMjMuNSA0OC4xbC0xLjUgNS41Yy0xNy42IDY0LjYtODAuMiAxMTkuOC0xNTYuNCAxMDMuN3oiXQogICAgfTsKICAgIGZhUm9hZENpcmNsZUNoZWNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJvYWQtY2lyY2xlLWNoZWNrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NjQiLCAiTTI4OCAzMmwtNzYuMyAwYy0yOS40IDAtNTUuMSAyMC4xLTYyLjEgNDguNkw2NS40IDQyMC41QzU3LjkgNDUwLjcgODAuOCA0ODAgMTEyIDQ4MGwyMDkuNCAwYy0xMS4yLTI0LjQtMTcuNC01MS40LTE3LjQtODAgMC0yOC42IDYuMi01NS43IDE3LjQtODAtLjUgMC0xIDAtMS41IDAtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC02NGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgNDljMzUuMi0zOS45IDg2LjctNjUgMTQ0LTY1IDkgMCAxNy44IC42IDI2LjUgMS44bC0zMi0xMjkuMkM0ODMuNCA1Mi4xIDQ1Ny44IDMyIDQyOC4zIDMybC03Ni40IDAgMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTY0ek02NDAgNDAwYTE0NCAxNDQgMCAxIDAgLTI4OCAwIDE0NCAxNDQgMCAxIDAgMjg4IDB6bS04Ni42LTYwLjljNy4xIDUuMiA4LjcgMTUuMiAzLjUgMjIuM2wtNjQgODhjLTIuOCAzLjgtNyA2LjItMTEuNyA2LjVzLTkuMy0xLjMtMTIuNi00LjZsLTQwLTQwYy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBsMjYuOCAyNi44IDUzLTcyLjljNS4yLTcuMSAxNS4yLTguNyAyMi40LTMuNXoiXQogICAgfTsKICAgIGZhU2hvcExvY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2hvcC1sb2NrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU0YTUiLCAiTTIxLjUgMTgxLjFMNzguMyA2Ny40Qzg5LjIgNDUuNyAxMTEuMyAzMiAxMzUuNiAzMmwzMDQuOSAwYzI0LjIgMCA0Ni40IDEzLjcgNTcuMiAzNS40bDU1LjYgMTExLjFjLTguMi0xLjYtMTYuNi0yLjUtMjUuMi0yLjUtNTMuNyAwLTk5LjcgMzMuMS0xMTguNyA4MGwtNTcuMyAwIDAgMTc2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xOTIgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC0xNzYuMWMtMjYuOC0xLjktNDgtMjQuMy00OC01MS42IDAtOCAxLjktMTYgNS41LTIzLjJ6TTEyOCAyNTZsMCAxMTJjMCA4LjggNy4yIDE2IDE2IDE2bDEyOCAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTExMi0xNjAgMHptNDMyIDQ4LjFjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA0Ny45IDY0IDAgMC00Ny45ek00MTYgNDAwYzAtMjAuOSAxMy40LTM4LjcgMzItNDUuM2wwLTUwLjZjMC00NC4yIDM1LjgtODAgODAtODBzODAgMzUuOCA4MCA4MGwwIDUwLjZjMTguNiA2LjYgMzIgMjQuNCAzMiA0NS4zbDAgOTZjMCAyNi41LTIxLjUgNDgtNDggNDhsLTEyOCAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTk2eiJdCiAgICB9OwogICAgZmFJbWFnZVBvcnRyYWl0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImltYWdlLXBvcnRyYWl0IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbInBvcnRyYWl0Il0sICJmM2UwIiwgIk0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDM4NGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6TTgwIDM2OGMwIDguOCA3LjIgMTYgMTYgMTZsMTkyIDBjOC44IDAgMTYtNy4yIDE2LTE2IDAtNDQuMi0zNS44LTgwLTgwLTgwbC02NCAwYy00NC4yIDAtODAgMzUuOC04MCA4MHpNMTkyIDI0OGE1NiA1NiAwIDEgMCAwLTExMiA1NiA1NiAwIDEgMCAwIDExMnoiXQogICAgfTsKICAgIGZhUG9ydHJhaXQgPSBmYUltYWdlUG9ydHJhaXQ7CiAgICBmYUJyaWRnZUxvY2sgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYnJpZGdlLWxvY2siLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTRjYyIsICJNMCA2NEMwIDQ2LjMgMTQuMyAzMiAzMiAzMmw0NDggMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtOCAwIDAgMzIuMmMxMy44IC42IDI3LjIgMi44IDQwIDYuNGwwIDUwLjdjLTE0LjgtNi0zMS05LjMtNDgtOS4zLTcwLjcgMC0xMjggNTcuMy0xMjggMTI4bDAgMjQuNGMtLjQgLjMtLjcgLjYtMS4xIDEtMTcuMy0yNS00Ni4yLTQxLjMtNzguOS00MS4zLTUzIDAtOTYgNDMtOTYgOTZsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMzIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC05NGMwLTM4LjgtMjYuNC03Mi42LTY0LTgybDAtMTEyIDQwIDAgMC02NC04IDBDMTQuMyA5NiAwIDgxLjcgMCA2NHptNDI0IDY4LjZsMC0zNi42LTgwIDAgMCA2NCAxOC44IDBjMTguMi0xMi44IDM4LjktMjIuMiA2MS4yLTI3LjR6TTIxNiA5NmwwIDY0IDgwIDAgMC02NC04MCAwem0tNDggMGwtODAgMCAwIDY0IDgwIDAgMC02NHpNNDk2IDMwNC4xYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgNDcuOSA2NCAwIDAtNDcuOXpNMzUyIDQwMGMwLTIwLjkgMTMuNC0zOC43IDMyLTQ1LjNsMC01MC42YzAtNDQuMiAzNS44LTgwIDgwLTgwczgwIDM1LjggODAgODBsMCA1MC42YzE4LjYgNi42IDMyIDI0LjQgMzIgNDUuM2wwIDk2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0xMjggMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC05NnoiXQogICAgfTsKICAgIGZhSGFtbWVyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhhbW1lciIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzEyODI5Nl0sICJmNmUzIiwgIk0yNDYuOSAxOC4zTDI3MSAzLjhjMjEuNi0xMyA0Ni4zLTE5LjggNzEuNS0xOS44IDM2LjggMCA3Mi4yIDE0LjYgOTguMiA0MC43bDYzLjkgNjMuOWMxNSAxNSAyMy40IDM1LjQgMjMuNCA1Ni42bDAgMzAuOSAxOS43IDE5LjcgMCAwYzE1LjYtMTUuNiA0MC45LTE1LjYgNTYuNiAwczE1LjYgNDAuOSAwIDU2LjZsLTY0IDY0Yy0xNS42IDE1LjYtNDAuOSAxNS42LTU2LjYgMHMtMTUuNi00MC45IDAtNTYuNkw0NjQgMjQwIDQzMy4xIDI0MGMtMjEuMiAwLTQxLjYtOC40LTU2LjYtMjMuNGwtNDkuMS00OS4xYy0xNS0xNS0yMy40LTM1LjQtMjMuNC01Ni42bDAtMTIuN2MwLTExLjItNS45LTIxLjctMTUuNS0yNy40bC00MS42LTI1Yy0xMC40LTYuMi0xMC40LTIxLjIgMC0yNy40ek01MC43IDQwMi43bDIyMi4xLTIyMi4xIDkwLjUgOTAuNS0yMjIuMSAyMjIuMWMtMjUgMjUtNjUuNSAyNS05MC41IDBzLTI1LTY1LjUgMC05MC41eiJdCiAgICB9OwogICAgZmFBcnJvd1VwMTkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctdXAtMS05IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNvcnQtbnVtZXJpYy11cCJdLCAiZjE2MyIsICJNMTUwLjYgNDEuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTk2IDk2Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwTDk2IDE0MS4zIDk2IDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzA2LjcgNDEuNCA0MS40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTk2LTk2ek00MTguNyAzOGMtOC4zLTYtMTkuMS03LjctMjguOC00LjRsLTQ4IDE2Yy0xNi44IDUuNi0yNS44IDIzLjctMjAuMiA0MC41czIzLjcgMjUuOCA0MC41IDIwLjJsNS45LTIgMCA1MS42LTE2IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsOTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTYgMCAwLTk2YzAtMTAuMy00LjktMTkuOS0xMy4zLTI2ek0zNjUuMSA0MzAuNmMtOS42IDE0LjgtNS40IDM0LjYgOS40IDQ0LjNzMzQuNiA1LjQgNDQuMy05LjRsNDIuMS02NC45YzEyLjQtMTkuMiAxOS4xLTQxLjYgMTkuMS02NC41IDAtNDQuMi0zNS44LTgwLTgwLTgwcy04MCAzNS44LTgwIDgwYzAgMzYuMSAyMy45IDY2LjcgNTYuOCA3Ni42bC0xMS43IDE4ek0zNzYgMzM2YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6Il0KICAgIH07CiAgICBmYVNvcnROdW1lcmljVXAgPSBmYUFycm93VXAxOTsKICAgIGZhQ2hlc3NLbmlnaHQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNoZXNzLWtuaWdodCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzk4MjJdLCAiZjQ0MSIsICJNMTkyLTMyYzEwNiAwIDE5MiA4NiAxOTIgMTkybDAgMTMzLjVjMCAxNy02LjggMzMuMi0xOC43IDQ1LjJMMzIwIDM4NCAzNzAuOCA0MzQuN2M4LjUgOC41IDEzLjIgMjAgMTMuMiAzMiAwIDI1LTIwLjMgNDUuMi00NS4yIDQ1LjNMNDUuMyA1MTJjLTI1IDAtNDUuMi0yMC4zLTQ1LjItNDUuMyAwLTEyIDQuOC0yMy41IDEzLjItMzJMNjQgMzg0IDY0IDM0OS40YzAtMTguNyA4LjItMzYuNCAyMi4zLTQ4LjZsODkuNy03Ni44LTQ4IDAtMTIuMSAxMi4xYy0xMi43IDEyLjctMzAgMTkuOS00OCAxOS45LTM3LjUgMC02Ny45LTMwLjQtNjcuOS02Ny45bDAtOC43YzAtMjIuOCA4LjItNDQuOSAyMy4xLTYyLjNMOTYgMzIgOTYgMGMwLTE3LjcgMTQuMy0zMiAzMi0zMmw2NCAwek0xNjAgNzJhMjQgMjQgMCAxIDAgMCA0OCAyNCAyNCAwIDEgMCAwLTQ4eiJdCiAgICB9OwogICAgZmFIb3VzZUZsb29kV2F0ZXJDaXJjbGVBcnJvd1JpZ2h0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLWZsb29kLXdhdGVyLWNpcmNsZS1hcnJvdy1yaWdodCIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTBmIiwgIk0yODguNSAxMTJhMTQ0IDE0NCAwIDEgMCAtMjg4IDAgMTQ0IDE0NCAwIDEgMCAyODggMHpNMTQxLjIgNDQuN2M2LjItNi4yIDE2LjQtNi4yIDIyLjYgMGw1NiA1NmM2LjIgNi4yIDYuMiAxNi40IDAgMjIuNmwtNTYgNTZjLTYuMiA2LjItMTYuNCA2LjItMjIuNiAwcy02LjItMTYuNCAwLTIyLjZsMjguNy0yOC43LTg5LjQgMGMtOC44IDAtMTYtNy4yLTE2LTE2czcuMi0xNiAxNi0xNmw4OS40IDAtMjguNy0yOC43Yy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnpNMzM2LjUgMTEyYzAgNzEuMS0zOC42IDEzMy4xLTk2IDE2Ni4zbDAgMTIuOGMyMi4xIDQuNSA0My40IDEzLjkgNjIuNCAyOC4yIDIyLjEgMTYuNiAyOS4xIDE2LjYgNTEuMiAwIDI3LjUtMjAuNyA1OS45LTMxLjIgOTIuNC0zMS40IDMzLjEtLjIgNjYuMyAxMC4yIDk0LjQgMzEuNCA2LjkgNS4yIDEyLjggOSAxOCAxMS43IC42IC4zIDEuMiAuNiAxLjggMSA0LjIgMi4zIDguNSA0LjYgMTIuNiAxLjUgNi00LjUgMTIuNi04IDE5LjMtMTAuNGwwLTExNS4yIDQuNSAwYzE1LjIgMCAyNy41LTEyLjMgMjcuNS0yNy41IDAtNy45LTMuNC0xNS41LTkuNC0yMC43TDQ0NC41IDEwLjVDNDM2LjggMy43IDQyNi44IDAgNDE2LjUgMHMtMjAuMyAzLjctMjggMTAuNUwzMjkuOSA2MS44YzQuMyAxNiA2LjYgMzIuOCA2LjYgNTAuMnptMzIgODhjMC0xMy4zIDEwLjctMjQgMjQtMjRsNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0bC00OCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTQ4ek00NzUuMSA0MTIuMWMxOSAxNC40IDQxLjkgMjguMiA2Ny4yIDMzLjMgMjYuNSA1LjQgNTQuMyAuOCA4MC43LTE5LjEgMTAuNi04IDEyLjctMjMgNC43LTMzLjZzLTIzLTEyLjctMzMuNi00LjdjLTE0LjkgMTEuMi0yOC42IDEzLjEtNDIuMyAxMC4zLTE0LjktMy0zMC45LTExLjktNDcuOC0yNC42LTM4LjQtMjktOTAuNS0yOS0xMjkgMC0yNCAxOC4xLTQwLjcgMjYuMy01NC41IDI2LjNTMjkwIDM5MS44IDI2NiAzNzMuN2MtMzguNC0yOS05MC41LTI5LTEyOSAwLTIxLjYgMTYuMy00MS4zIDI1LjgtNTguOSAyNS43LTkuNi0uMS0xOS45LTMtMzEuMi0xMS41LTEwLjYtOC0yNS42LTUuOS0zMy42IDQuN3MtNS45IDI1LjYgNC43IDMzLjZjMTkuMSAxNC40IDM5LjQgMjEgNTkuOCAyMS4xIDMzLjkgLjIgNjQuMy0xNy40IDg4LjEtMzUuMyAyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAyNC4yIDE4LjMgNTIuMyAzNS45IDgzLjQgMzUuOXM1OS4xLTE3LjcgODMuNC0zNS45YzIxLjMtMTYuMSA0OS45LTE2LjEgNzEuMiAwem0tNzEuMiA5NmMyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAxOSAxNC40IDQxLjkgMjguMiA2Ny4yIDMzLjMgMjYuNSA1LjQgNTQuMyAuOCA4MC43LTE5LjEgMTAuNi04IDEyLjctMjMgNC43LTMzLjZzLTIzLTEyLjctMzMuNi00LjdjLTE0LjkgMTEuMi0yOC42IDEzLjEtNDIuMyAxMC4zLTE0LjktMy0zMC45LTExLjktNDcuOC0yNC42LTM4LjQtMjktOTAuNS0yOS0xMjkgMC0yNCAxOC4xLTQwLjcgMjYuMy01NC41IDI2LjNTMjkwIDQ4Ny44IDI2NiA0NjkuN2MtMzguNC0yOS05MC41LTI5LTEyOSAwLTIxLjYgMTYuMy00MS4zIDI1LjgtNTguOSAyNS43LTkuNi0uMS0xOS45LTMtMzEuMi0xMS41LTEwLjYtOC0yNS42LTUuOS0zMy42IDQuN3MtNS45IDI1LjYgNC43IDMzLjZjMTkuMSAxNC40IDM5LjQgMjEgNTkuOCAyMS4xIDMzLjkgLjIgNjQuMy0xNy40IDg4LjEtMzUuMyAyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAyNC4yIDE4LjMgNTIuMyAzNS45IDgzLjQgMzUuOXM1OS4xLTE3LjcgODMuNC0zNS45eiJdCiAgICB9OwogICAgZmFBcnJvd1VwUmlnaHRGcm9tU3F1YXJlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXVwLXJpZ2h0LWZyb20tc3F1YXJlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbImV4dGVybmFsLWxpbmsiXSwgImYwOGUiLCAiTTMyMCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDgyLjcgMC0yMDEuNCAyMDEuNGMtMTIuNSAxMi41LTEyLjUgMzIuOCAwIDQ1LjNzMzIuOCAxMi41IDQ1LjMgMEw0NDggMTA5LjMgNDQ4IDE5MmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTYwYzAtMTcuNy0xNC4zLTMyLTMyLTMyTDMyMCAwek04MCA5NkMzNS44IDk2IDAgMTMxLjggMCAxNzZMMCA0MzJjMCA0NC4yIDM1LjggODAgODAgODBsMjU2IDBjNDQuMiAwIDgwLTM1LjggODAtODBsMC04MGMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDgwYzAgOC44LTcuMiAxNi0xNiAxNkw4MCA0NDhjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTI1NmMwLTguOCA3LjItMTYgMTYtMTZsODAgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkw4MCA5NnoiXQogICAgfTsKICAgIGZhRXh0ZXJuYWxMaW5rID0gZmFBcnJvd1VwUmlnaHRGcm9tU3F1YXJlOwogICAgZmFBcnJvd0Rvd25VcEFjcm9zc0xpbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctZG93bi11cC1hY3Jvc3MtbGluZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNGFmIiwgIk0yNjUuNCAxMDUuNGw5Ni05NmMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMGw5NiA5NmMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMGwtNDEuNC00MS40IDAgMTE0LjcgNjQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzIwIDAgMCAxMTQuNyA0MS40LTQxLjRjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM2wtOTYgOTZjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwbC05Ni05NmMtMTIuNS0xMi41LTEyLjUtMzIuOCAwLTQ1LjNzMzIuOC0xMi41IDQ1LjMgMEw5NiA0MDIuNyA5NiAyODggMzIgMjg4Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDMyMCAwIDAtMTE0LjctNDEuNCA0MS40Yy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMHMtMTIuNS0zMi44IDAtNDUuM3pNNDE2IDMzNmwwIDE0NGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTE0NCA2NCAwek05NiAxNzZMOTYgMzJjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDE0NC02NCAweiJdCiAgICB9OwogICAgZmFGYWNlR3JpbkJlYW0yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3Jpbi1iZWFtIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTE2LCAiZ3Jpbi1iZWFtIl0sICJmNTgyIiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMzg2LjcgMzA4LjljMTEuOS0zLjcgMjMuOSA2LjMgMTkuNiAxOC4xLTIyLjQgNjEuMy04MS4zIDEwNS4xLTE1MC4zIDEwNS4xUzEyOC4xIDM4OC4yIDEwNS43IDMyNi45Yy00LjMtMTEuOCA3LjctMjEuOCAxOS42LTE4LjEgMzkuMiAxMi4yIDgzLjcgMTkuMSAxMzAuNyAxOS4xczkxLjUtNi45IDEzMC43LTE5LjF6TTE3NiAxODBjLTE1LjUgMC0yOCAxMi41LTI4IDI4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMzcuNiAzMC40LTY4IDY4LTY4czY4IDMwLjQgNjggNjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0xNS41LTEyLjUtMjgtMjgtMjh6bTEzMiAyOGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTM3LjYgMzAuNC02OCA2OC02OHM2OCAzMC40IDY4IDY4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMTUuNS0xMi41LTI4LTI4LTI4cy0yOCAxMi41LTI4IDI4eiJdCiAgICB9OwogICAgZmFHcmluQmVhbTIgPSBmYUZhY2VHcmluQmVhbTI7CiAgICBmYVJlY3RhbmdsZUFkID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJlY3RhbmdsZS1hZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJhZCJdLCAiZjY0MSIsICJNNjQgNjRDMjguNyA2NCAwIDkyLjcgMCAxMjhMMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzg0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0yNTZjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgNjR6TTQxNiAxODRsMCAxNDRjMCAxMy4zLTEwLjcgMjQtMjQgMjQtNy4xIDAtMTMuNS0zLjEtMTcuOS04LTEwLjIgNS4xLTIxLjggOC0zNC4xIDgtNDIgMC03Ni0zNC03Ni03NnMzNC03NiA3Ni03NmM5LjkgMCAxOS4zIDEuOSAyOCA1LjNsMC0yMS4zYzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjR6bS00OCA5MmEyOCAyOCAwIDEgMCAtNTYgMCAyOCAyOCAwIDEgMCA1NiAwek0xNjAgMjA4Yy04LjggMC0xNiA3LjItMTYgMTZsMCAzMiA0OCAwIDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0xNiAwem0zMiA5NmwtNDggMCAwIDI0YzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtMTA0YzAtMzUuMyAyOC43LTY0IDY0LTY0bDE2IDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAxMDRjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0yNHoiXQogICAgfTsKICAgIGZhQWQgPSBmYVJlY3RhbmdsZUFkOwogICAgZmFCb29rVGFuYWtoID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJvb2stdGFuYWtoIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInRhbmFraCJdLCAiZjgyNyIsICJNMzUyIDUxMkwzMiA1MTJjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMC02Ni43QzEzLjQgMzc0LjcgMCAzNTYuOSAwIDMzNkwwIDQ4QzAgMjEuNSAyMS41IDAgNDggMEwzNTIgMGM1MyAwIDk2IDQzIDk2IDk2bDAgMzIwYzAgNTMtNDMgOTYtOTYgOTZ6bTMyLTk2YzAtMTcuNy0xNC4zLTMyLTMyLTMybC0yNTYgMCAwIDY0IDI1NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMyek0xMTMuOSAyMjljLTEuMiAyLTEuOSA0LjItMS45IDYuNiAwIDYuOSA1LjYgMTIuNSAxMi41IDEyLjVsNTYuOSAwIDMwLjUgNDkuMmMyLjYgNC4yIDcuMiA2LjggMTIuMiA2LjhzOS42LTIuNiAxMi4yLTYuOGwzMC41LTQ5LjIgNTYuOSAwYzYuOSAwIDEyLjUtNS42IDEyLjUtMTIuNSAwLTIuMy0uNi00LjYtMS45LTYuNmwtMjcuOC00NSAyNy44LTQ1YzEuMi0yIDEuOS00LjIgMS45LTYuNiAwLTYuOS01LjYtMTIuNS0xMi41LTEyLjVsLTU2LjkgMC0zMC41LTQ5LjJDMjMzLjYgNjYuNiAyMjkgNjQgMjI0IDY0cy05LjYgMi42LTEyLjIgNi44bC0zMC41IDQ5LjItNTYuOSAwYy02LjkgMC0xMi41IDUuNi0xMi41IDEyLjUgMCAyLjMgLjYgNC42IDEuOSA2LjZsMjcuOCA0NS0yNy44IDQ1eiJdCiAgICB9OwogICAgZmFUYW5ha2ggPSBmYUJvb2tUYW5ha2g7CiAgICBmYUhvdFR1YlBlcnNvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJob3QtdHViLXBlcnNvbiIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJob3QtdHViIl0sICJmNTkzIiwgIk0yNDAgNDBjMCAxMy42IDUuOCAyNi41IDE1LjggMzUuNmwyNi41IDIzLjhjMjQgMjEuNiAzNy43IDUyLjMgMzcuNyA4NC42IDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtMTguNy03LjktMzYuNC0yMS44LTQ4LjlsLTI2LjUtMjMuOEMyMDMuNSA5My4xIDE5MiA2Ny4yIDE5MiA0MCAxOTIgMjYuNyAyMDIuNyAxNiAyMTYgMTZzMjQgMTAuNyAyNCAyNHpNMCAzMzZsMC04MGMwLTM1LjMgMjguNy02NCA2NC02NGwxOS43IDBjOC4xIDAgMTYuMiAxLjYgMjMuOCA0LjZsMTM3LjEgNTQuOGM3LjYgMyAxNS42IDQuNiAyMy44IDQuNkwzODQgMjU2YzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMTI4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAzMzZ6bTk2LTE2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDgwYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC04MGMwLTEzLjMtMTAuNy0yNC0yNC0yNHptMTUyIDI0YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgODBjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTgwem0xMDQtMjRjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgODBjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTgwYzAtMTMuMy0xMC43LTI0LTI0LTI0ek0zMjggMTZjMTMuMyAwIDI0IDEwLjcgMjQgMjQgMCAxMy42IDUuOCAyNi41IDE1LjggMzUuNmwyNi41IDIzLjhjMjQgMjEuNiAzNy43IDUyLjMgMzcuNyA4NC42IDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtMTguNy03LjktMzYuNC0yMS44LTQ4LjlsLTI2LjUtMjMuOEMzMTUuNSA5My4xIDMwNCA2Ny4yIDMwNCA0MCAzMDQgMjYuNyAzMTQuNyAxNiAzMjggMTZ6TTY0IDQwYTU2IDU2IDAgMSAxIDAgMTEyIDU2IDU2IDAgMSAxIDAtMTEyeiJdCiAgICB9OwogICAgZmFIb3RUdWIgPSBmYUhvdFR1YlBlcnNvbjsKICAgIGZhRmlsZUhhbGZEYXNoZWQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1oYWxmLWRhc2hlZCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJlNjk4IiwgIk02NCAwQzI4LjcgMCAwIDI4LjcgMCA2NGwwIDI1NiAzODQgMCAwLTE0OS41YzAtMTctNi43LTMzLjMtMTguNy00NS4zTDI1OC43IDE4LjdDMjQ2LjcgNi43IDIzMC41IDAgMjEzLjUgMEw2NCAwek0zMjUuNSAxNzZMMjMyIDE3NmMtMTMuMyAwLTI0LTEwLjctMjQtMjRMMjA4IDU4LjUgMzI1LjUgMTc2ek0wIDM1MmwwIDY0IDY0IDAgMC02NC02NCAwek02NCA1MTJsMC02NC02NCAwYzAgMzUuMyAyOC43IDY0IDY0IDY0em0zMiAwbDgwIDAgMC02NC04MCAwIDAgNjR6bTExMiAwbDgwIDAgMC02NC04MCAwIDAgNjR6bTExMiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bC02NCAwIDAgNjR6bTY0LTE2MGwtNjQgMCAwIDY0IDY0IDAgMC02NHoiXQogICAgfTsKICAgIGZhT3V0ZGVudCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJvdXRkZW50IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbImRlZGVudCJdLCAiZjAzYiIsICJNLjQgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJsMzg0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTM4NCAwQzE0LjggOTYgLjQgODEuNyAuNCA2NHptMTkyIDEyOGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwxOTIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTkyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyem0zMiA5NmwxOTIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTkyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJ6TS40IDQ0OGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzODQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMzg0IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyek0uNyAyNjguNmMtOC4yLTYuNC04LjItMTguOSAwLTI1LjNsMTAxLjktNzkuM2MxMC41LTguMiAyNS44LS43IDI1LjggMTIuNmwwIDE1OC42YzAgMTMuMy0xNS4zIDIwLjgtMjUuOCAxMi42TC43IDI2OC42eiJdCiAgICB9OwogICAgZmFEZWRlbnQgPSBmYU91dGRlbnQ7CiAgICBmYUhhbmRQZWFjZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1wZWFjZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzk5OTZdLCAiZjI1YiIsICJNMTkyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAyMDgtNjQgMCAwLTIwOGMwLTE3LjcgMTQuMy0zMiAzMi0zMnptOTYgMTYwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02NGMwLTE3LjcgMTQuMy0zMiAzMi0zMnptNjQgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNjR6TTYxLjMgNTEuMkwxNDMuOSAyNDAgNzQuMSAyNDAgMi43IDc2LjhDLTQuNCA2MC42IDMgNDEuOCAxOS4yIDM0LjdTNTQuMiAzNSA2MS4zIDUxLjJ6bTI3IDIyMS4zbC0uMi0uNSA5NS45IDBjMjIuMSAwIDQwIDE3LjkgNDAgNDBzLTE3LjkgNDAtNDAgNDBsLTU2IDBjLTguOCAwLTE2IDcuMi0xNiAxNnM3LjIgMTYgMTYgMTZsNTYgMGMzOS44IDAgNzItMzIuMiA3Mi03MmwwLS42YzkuNCA1LjQgMjAuMyA4LjYgMzIgOC42IDEzLjIgMCAyNS40LTQgMzUuNi0xMC44IDguNyAyNC45IDMyLjUgNDIuOCA2MC40IDQyLjggMTEuNyAwIDIyLjYtMy4xIDMyLTguNmwwIDguNmMwIDg4LjQtNzEuNiAxNjAtMTYwIDE2MGwtNjEuNyAwYy00Mi40IDAtODMuMS0xNi45LTExMy4xLTQ2LjlMNjkuNSA0NTMuNUM0NS41IDQyOS41IDMyIDM5Ni45IDMyIDM2M2wwLTI3YzAtMzIuNyAyNC42LTU5LjcgNTYuMy02My41eiJdCiAgICB9OwogICAgZmFIZWFkU2lkZVZpcnVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhlYWQtc2lkZS12aXJ1cyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMDY0IiwgIk0zMjkuNyA0NDhjLTUuMSAwLTkuNyAzLjctOS43IDguOGwwIDcuMmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTYwIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtNjMuNmMwLTEyLjYtNS4xLTI0LjUtMTMuMS0zNC4yLTMxLjgtMzguNy01MC45LTg4LjItNTAuOS0xNDIuMiAwLTEyMy43IDEwMC4zLTIyNCAyMjQtMjI0IDExMi43IDAgMjA2IDgzLjMgMjIxLjcgMTkxLjcgLjQgMyAxLjcgNS45IDMuNiA4LjNsMzUuOCA0Mi45YzcgOC40IDEwLjkgMTkuMSAxMC45IDMwLjEgMCAyNS45LTIxIDQ3LTQ3IDQ3bC0xIDBjLTguOCAwLTE2IDcuMi0xNiAxNmwwIDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0bC0zOC4zIDB6TTIyNCA2NGMtMTMuMyAwLTI0IDEwLjctMjQgMjQgMCAyMi45LTI3LjcgMzQuNC00My45IDE4LjItOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWMxNi4yIDE2LjIgNC43IDQzLjktMTguMiA0My45LTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRjMjIuOSAwIDM0LjQgMjcuNyAxOC4yIDQzLjktOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwYzE2LjItMTYuMiA0My45LTQuNyA0My45IDE4LjIgMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGMwLTIyLjkgMjcuNy0zNC40IDQzLjktMTguMiA5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjljLTE2LjItMTYuMi00LjctNDMuOSAxOC4yLTQzLjkgMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRjLTIyLjkgMC0zNC40LTI3LjctMTguMi00My45IDkuNC05LjQgOS40LTI0LjYgMC0zMy45cy0yNC42LTkuNC0zMy45IDBjLTE2LjIgMTYuMi00My45IDQuNy00My45LTE4LjIgMC0xMy4zLTEwLjctMjQtMjQtMjR6bS0zMiA4OGEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6bTQwIDg4YTI0IDI0IDAgMSAxIDQ4IDAgMjQgMjQgMCAxIDEgLTQ4IDB6Il0KICAgIH07CiAgICBmYUNvbXBhc3MyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvbXBhc3MiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjk1MTddLCAiZjE0ZSIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6bTUwLjctMTg2LjlMMTYyLjQgMzgwLjZjLTE5LjQgNy41LTM4LjUtMTEuNi0zMS0zMWw1NS41LTE0NC4zYzMuMy04LjUgOS45LTE1LjEgMTguNC0xOC40bDE0NC4zLTU1LjVjMTkuNC03LjUgMzguNSAxMS42IDMxIDMxTDMyNS4xIDMwNi43Yy0zLjIgOC41LTkuOSAxNS4xLTE4LjQgMTguNHpNMjg4IDI1NmEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAweiJdCiAgICB9OwogICAgZmFQZW5OaWIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVuLW5pYiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEwMDAxXSwgImY1YWQiLCAiTTM2OC41IDE4LjNsLTUwLjEgNTAuMSAxMjUuMyAxMjUuMyA1MC4xLTUwLjFjMjEuOS0yMS45IDIxLjktNTcuMyAwLTc5LjJMNDQ3LjcgMTguM2MtMjEuOS0yMS45LTU3LjMtMjEuOS03OS4yIDB6TTI3OS4zIDk3LjJsLS41IC4xLTE0NC4xIDQzLjJjLTE5LjkgNi0zNS43IDIxLjItNDIuMyA0MUwzLjggNDQ1LjhjLTIuOSA4LjctMS45IDE4LjIgMi41IDI2TDE2MS43IDMxNi40Yy0xLjEtNC0xLjYtOC4xLTEuNi0xMi40IDAtMjYuNSAyMS41LTQ4IDQ4LTQ4czQ4IDIxLjUgNDggNDgtMjEuNSA0OC00OCA0OGMtNC4zIDAtOC41LS42LTEyLjQtMS42TDQwLjMgNTA1LjdjNy44IDQuNCAxNy4yIDUuNCAyNiAyLjVsMjY0LjMtODguNmMxOS43LTYuNiAzNS0yMi40IDQxLTQyLjNsNDMuMi0xNDQuMSAuMS0uNS0xMzUuNS0xMzUuNXoiXQogICAgfTsKICAgIGZhVGVudEFycm93c0Rvd24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGVudC1hcnJvd3MtZG93biIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTgxIiwgIk0xODUuNSAxMjFjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMGwtMzEgMzEgMC0xMDIuMWMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDEwMi4xLTMxLTMxYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDcyIDcyYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwbDcyLTcyem0yNDggNzJsNzItNzJjOS40LTkuNCA5LjQtMjQuNiAwLTMzLjlzLTI0LjYtOS40LTMzLjkgMGwtMzEgMzEgMC0xMDIuMWMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDEwMi4xLTMxLTMxYy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDcyIDcyYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwek02MC4zIDI5Mi42TDM3LjEgNDc2Yy0yLjQgMTkuMSAxMi41IDM2IDMxLjcgMzZsMTU0LjUgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTExNy40YzAtNS45IDQuNy0xMC42IDEwLjYtMTAuNiA0IDAgNy43IDIuMyA5LjUgNS45bDY4LjIgMTM2LjVjNS40IDEwLjggMTYuNSAxNy43IDI4LjYgMTcuN2w3MS45IDBjMTkuMyAwIDM0LjItMTYuOSAzMS43LTM2TDQ1Mi43IDI5Mi43Yy0xLjItOS43LTYuOS0xOC40LTE1LjMtMjMuNEwyNzEuOSAxNjkuOWMtMTAuMi02LjEtMjIuOS02LjEtMzMuMSAuMUw3NS40IDI2OS4zYy04LjMgNS4xLTEzLjkgMTMuNy0xNS4xIDIzLjN6Il0KICAgIH07CiAgICBmYUZvcndhcmRGYXN0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZvcndhcmQtZmFzdCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzkxOTcsICJmYXN0LWZvcndhcmQiXSwgImYwNTAiLCAiTTE5LjggNDc3LjZjMTIgNSAyNS43IDIuMiAzNC45LTYuOUwyMjQgMzAxLjMgMjI0IDQ0OGMwIDEyLjkgNy44IDI0LjYgMTkuOCAyOS42czI1LjcgMi4yIDM0LjktNi45TDQ0OCAzMDEuMyA0NDggNDQ4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0zODRjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAxNDYuNy0xNjkuNC0xNjkuNGMtOS4yLTkuMi0yMi45LTExLjktMzQuOS02LjlTMjI0IDUxLjEgMjI0IDY0TDIyNCAyMTAuNyA1NC42IDQxLjRjLTkuMi05LjItMjIuOS0xMS45LTM0LjktNi45UzAgNTEuMSAwIDY0TDAgNDQ4YzAgMTIuOSA3LjggMjQuNiAxOS44IDI5LjZ6Il0KICAgIH07CiAgICBmYUZhc3RGb3J3YXJkID0gZmFGb3J3YXJkRmFzdDsKICAgIGZhQ3JvcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjcm9wIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYxMjUiLCAiTTQ0OCAxMDkuM2w1NC42LTU0LjZjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBMNDAyLjcgNjQgMTc2IDY0IDE3NiAxMjggMzM4LjcgMTI4IDEyOCAzMzguNyAxMjggMzJjMC0xNy43LTE0LjMtMzItMzItMzJTNjQgMTQuMyA2NCAzMmwwIDMyLTMyIDBDMTQuMyA2NCAwIDc4LjMgMCA5NnMxNC4zIDMyIDMyIDMybDMyIDAgMCAyNTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjA4IDAgMC02NC0xNjIuNyAwIDIxMC43LTIxMC43IDAgMzA2LjdjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTMyIDMyIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTMyIDAgMC0yNzQuN3oiXQogICAgfTsKICAgIGZhV2hpc2tleUdsYXNzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIndoaXNrZXktZ2xhc3MiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjkzNDcsICJnbGFzcy13aGlza2V5Il0sICJmN2EwIiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0TDAgMzUyYzAgNzAuNyA1Ny4zIDEyOCAxMjggMTI4bDE5MiAwYzcwLjcgMCAxMjgtNTcuMyAxMjgtMTI4bDAtMjg4YzAtMTcuNy0xNC4zLTMyLTMyLTMyTDMyIDMyek02NCAyNTZsMC0xNjAgMzIwIDAgMCAxNjAtMzIwIDB6Il0KICAgIH07CiAgICBmYUdsYXNzV2hpc2tleSA9IGZhV2hpc2tleUdsYXNzOwogICAgZmFTcXVhcmUyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzk2MzIsIDk3MjMsIDk3MjQsIDYxNTkwXSwgImYwYzgiLCAiTTY0IDMybDMyMCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzIwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMnoiXQogICAgfTsKICAgIGZhRmFjZUdyaW4yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3JpbiIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODUxMiwgImdyaW4iXSwgImY1ODAiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0zODYuNyAzMDguOWMxMS45LTMuNyAyMy45IDYuMyAxOS42IDE4LjEtMjIuNCA2MS4zLTgxLjMgMTA1LjEtMTUwLjMgMTA1LjFTMTI4LjEgMzg4LjIgMTA1LjcgMzI2LjljLTQuMy0xMS44IDcuNy0yMS44IDE5LjYtMTguMSAzOS4yIDEyLjIgODMuNyAxOS4xIDEzMC43IDE5LjFzOTEuNS02LjkgMTMwLjctMTkuMXpNMTQ0IDIwOGEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0xOTItMzJhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFHcmluMiA9IGZhRmFjZUdyaW4yOwogICAgZmFGaWxlQ29udHJhY3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlsZS1jb250cmFjdCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmNTZjIiwgIk0wIDY0QzAgMjguNyAyOC43IDAgNjQgMEwyMTMuNSAwYzE3IDAgMzMuMyA2LjcgNDUuMyAxOC43TDM2NS4zIDEyNS4zYzEyIDEyIDE4LjcgMjguMyAxOC43IDQ1LjNMMzg0IDQ0OGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA1MTJjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgNjR6bTIwOC01LjVsMCA5My41YzAgMTMuMyAxMC43IDI0IDI0IDI0TDMyNS41IDE3NiAyMDggNTguNXpNODggNjRDNzQuNyA2NCA2NCA3NC43IDY0IDg4czEwLjcgMjQgMjQgMjRsNDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNEw4OCA2NHptMCA5NmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGw0OCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC00OCAwem03MC4zIDE2MGMtMTEuMyAwLTIxLjkgNS4xLTI4LjkgMTMuOUw2OS4zIDQwOWMtOC4zIDEwLjMtNi42IDI1LjUgMy43IDMzLjdzMjUuNSA2LjYgMzMuNy0zLjhsNDcuMS01OC44IDE1LjIgNTAuN2MzIDEwLjIgMTIuNCAxNy4xIDIzIDE3LjFsMTA0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTg2LjEgMC0xNi4xLTUzLjZjLTQuNy0xNS43LTE5LjEtMjYuNC0zNS41LTI2LjR6Il0KICAgIH07CiAgICBmYUFuZ2xlVXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYW5nbGUtdXAiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFs4OTYzXSwgImYxMDYiLCAiTTE2OS40IDEzNy40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwbDE2MCAxNjBjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNzLTMyLjggMTIuNS00NS4zIDBMMTkyIDIwNS4zIDU0LjYgMzQyLjZjLTEyLjUgMTIuNS0zMi44IDEyLjUtNDUuMyAwcy0xMi41LTMyLjggMC00NS4zbDE2MC0xNjB6Il0KICAgIH07CiAgICBmYUZhY2VTbWlsZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1zbWlsZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU3OCwgInNtaWxlIl0sICJmMTE4IiwgIk0yNTYgNTEyYTI1NiAyNTYgMCAxIDAgMC01MTIgMjU2IDI1NiAwIDEgMCAwIDUxMnpNMTY1LjQgMzIxLjljMjAuNCAyOCA1My40IDQ2LjEgOTAuNiA0Ni4xczcwLjItMTguMSA5MC42LTQ2LjFjNy44LTEwLjcgMjIuOC0xMy4xIDMzLjUtNS4zczEzLjEgMjIuOCA1LjMgMzMuNUMzNTYuMyAzOTAgMzA5LjIgNDE2IDI1NiA0MTZzLTEwMC4zLTI2LTEyOS40LTY1LjljLTcuOC0xMC43LTUuNC0yNS43IDUuMy0zMy41czI1LjctNS40IDMzLjUgNS4zek0xNDQgMjA4YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTE5Mi0zMmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYVNtaWxlMiA9IGZhRmFjZVNtaWxlMjsKICAgIGZhUGVyc29uRHJlc3NCdXJzdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tZHJlc3MtYnVyc3QiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU0NCIsICJNMjA4IDQwLjFjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC00OGMwLTEzLjMtMTAuNy0yNC0yNC0yNHMtMjQgMTAuNy0yNCAyNGwwIDQ4YzAgMTMuMyAxMC43IDI0IDI0IDI0ek04IDE0NC4xYzAgMTMuMyAxMC43IDI0IDI0IDI0bDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTQ4IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0em05Mi41IDE0MS40bDMzLjktMzMuOWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwTDY2LjYgMjUxLjZjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMHpNNjYuNiAyLjdjLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45bDMzLjkgMzMuOWM5LjQgOS40IDI0LjYgOS40IDMzLjkgMHM5LjQtMjQuNiAwLTMzLjlMMTAwLjUgMi43QzkxLjEtNi43IDc2LTYuNyA2Ni42IDIuN3pNMzUyIDgwYTU2IDU2IDAgMSAwIDAtMTEyIDU2IDU2IDAgMSAwIDAgMTEyek0yNDYuMiAzODRsMjUuOCAwIDAgMTI4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xMjggMzIgMCAwIDEyOGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTI4IDI1LjggMGMxMC45IDAgMTguNi0xMC43IDE1LjItMjEuMWwtNDMtMTI5IDQ4LjMgNjUuMWMxMC41IDE0LjIgMzAuNiAxNy4yIDQ0LjggNi42czE3LjItMzAuNiA2LjYtNDQuOGwtNzAuNS05NUM0MzQgMTMyIDM5NC4zIDExMiAzNTIgMTEycy04MiAyMC0xMDcuMiA1My45bC03MC41IDk1Yy0xMC41IDE0LjItNy42IDM0LjIgNi42IDQ0LjhzMzQuMiA3LjYgNDQuOC02LjZsNDguMy02NS4xLTQzIDEyOWMtMy41IDEwLjQgNC4zIDIxLjEgMTUuMiAyMS4xeiJdCiAgICB9OwogICAgZmFEaXZpZGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZGl2aWRlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTAxMzUsIDI0N10sICJmNTI5IiwgIk0yMjQgNDhhNTYgNTYgMCAxIDEgMCAxMTIgNTYgNTYgMCAxIDEgMC0xMTJ6TTAgMjU2YzAtMTcuNyAxNC4zLTMyIDMyLTMybDM4NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDI4OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJ6TTE2OCA0MDhhNTYgNTYgMCAxIDEgMTEyIDAgNTYgNTYgMCAxIDEgLTExMiAweiJdCiAgICB9OwogICAgZmFDb2RlRm9yayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjb2RlLWZvcmsiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTEzYiIsICJNODAgMTA0YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHptODAtMjRjMCAzMi44LTE5LjcgNjEtNDggNzMuM2wwIDIyLjdjMCAyNi41IDIxLjUgNDggNDggNDhsMTI4IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0yMi43Yy0yOC4zLTEyLjMtNDgtNDAuNS00OC03My4zIDAtNDQuMiAzNS44LTgwIDgwLTgwczgwIDM1LjggODAgODBjMCAzMi44LTE5LjcgNjEtNDggNzMuM2wwIDIyLjdjMCA2MS45LTUwLjEgMTEyLTExMiAxMTJsLTMyIDAgMCA3MC43YzI4LjMgMTIuMyA0OCA0MC41IDQ4IDczLjMgMCA0NC4yLTM1LjggODAtODAgODBzLTgwLTM1LjgtODAtODBjMC0zMi44IDE5LjctNjEgNDgtNzMuM2wwLTcwLjctMzIgMEM5OC4xIDI4OCA0OCAyMzcuOSA0OCAxNzZsMC0yMi43QzE5LjcgMTQxIDAgMTEyLjggMCA4MCAwIDM1LjggMzUuOCAwIDgwIDBzODAgMzUuOCA4MCA4MHptMjA4IDI0YTI0IDI0IDAgMSAwIDAtNDggMjQgMjQgMCAxIDAgMCA0OHpNMjQ4IDQzMmEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAweiJdCiAgICB9OwogICAgZmFIb3VzZUZsYWcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG91c2UtZmxhZyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTBkIiwgIk00NzIgMGMxNy43IDAgMzIgMTQuMyAzMiAzMmw5NiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgOTZjMCAxNy43LTE0LjMgMzItMzIgMzJsLTk2IDAgMCAyODhjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC00NDhjMC0xNy43IDE0LjMtMzIgMzItMzJ6TTI4My41IDU5LjFsMTAwLjUgOTYuOSAwIDM1Ni0yNTYgMGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0xNDQtMTkuOSAwYy0xNS41IDAtMjguMS0xMi42LTI4LjEtMjguMSAwLTcuNiAzLjEtMTQuOSA4LjYtMjAuMkwyMjguNSA1OS4xQzIzNS45IDUyIDI0NS43IDQ4IDI1NiA0OHMyMC4xIDQgMjcuNSAxMS4xek0yMzIgMjU2Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDQ4YzAgMTMuMyAxMC43IDI0IDI0IDI0bDQ4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRsMC00OGMwLTEzLjMtMTAuNy0yNC0yNC0yNGwtNDggMHoiXQogICAgfTsKICAgIGZhQnVpbGRpbmdDb2x1bW5zID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJ1aWxkaW5nLWNvbHVtbnMiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiYmFuayIsICJpbnN0aXR1dGlvbiIsICJtdXNldW0iLCAidW5pdmVyc2l0eSJdLCAiZjE5YyIsICJNMjcxLjkgMjAuMmMtOS44LTUuNi0yMS45LTUuNi0zMS44IDBsLTIyNCAxMjhjLTEyLjYgNy4yLTE4LjggMjItMTUuMSAzNlMxNy41IDIwOCAzMiAyMDhsMzIgMCAwIDIwOCAwIDAtNTEuMiAzOC40QzQuNyA0NjAuNCAwIDQ2OS45IDAgNDgwIDAgNDk3LjcgMTQuMyA1MTIgMzIgNTEybDQ0OCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMyIDAtMTAuMS00LjctMTkuNi0xMi44LTI1LjZsLTUxLjItMzguNCAwLTIwOCAzMiAwYzE0LjUgMCAyNy4yLTkuOCAzMC45LTIzLjhzLTIuNS0yOC44LTE1LjEtMzZsLTIyNC0xMjh6TTQwMCAyMDhsMCAyMDgtNjQgMCAwLTIwOCA2NCAwem0tMTEyIDBsMCAyMDgtNjQgMCAwLTIwOCA2NCAwem0tMTEyIDBsMCAyMDgtNjQgMCAwLTIwOCA2NCAwek0yNTYgOTZhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFCYW5rID0gZmFCdWlsZGluZ0NvbHVtbnM7CiAgICBmYUluc3RpdHV0aW9uID0gZmFCdWlsZGluZ0NvbHVtbnM7CiAgICBmYU11c2V1bSA9IGZhQnVpbGRpbmdDb2x1bW5zOwogICAgZmFVbml2ZXJzaXR5ID0gZmFCdWlsZGluZ0NvbHVtbnM7CiAgICBmYVJ1ZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJydWciLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTU2OSIsICJNMjQgNjRsNTYgMCAwIDM4NC01NiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDggMCAwLTQwLTggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGw4IDAgMC0zMi04IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsOCAwIDAtMzItOCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDggMCAwLTQwLTggMEMxMC43IDExMiAwIDEwMS4zIDAgODhTMTAuNyA2NCAyNCA2NHptMTA0IDBsMzIwIDAgMCAzODQtMzIwIDAgMC0zODR6TTU3NiA4OGMwIDEzLjMtMTAuNyAyNC0yNCAyNGwtOCAwIDAgNDAgOCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC04IDAgMCAzMiA4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTggMCAwIDMyIDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtOCAwIDAgNDAgOCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC01NiAwIDAtMzg0IDU2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjR6Il0KICAgIH07CiAgICBmYUNvZGVNZXJnZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjb2RlLW1lcmdlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYzODciLCAiTTgwIDU2YTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHptMzIuNCA5Ny4yYzI4LTEyLjQgNDcuNi00MC41IDQ3LjYtNzMuMiAwLTQ0LjItMzUuOC04MC04MC04MFMwIDM1LjggMCA4MGMwIDMyLjggMTkuNyA2MSA0OCA3My4zbDAgMjA1LjNDMTkuNyAzNzEgMCAzOTkuMiAwIDQzMiAwIDQ3Ni4yIDM1LjggNTEyIDgwIDUxMnM4MC0zNS44IDgwLTgwYzAtMzIuOC0xOS43LTYxLTQ4LTczLjNsMC04Ni42YzI2LjcgMjAuMSA2MCAzMiA5NiAzMmw4Ni43IDBjMTIuMyAyOC4zIDQwLjUgNDggNzMuMyA0OCA0NC4yIDAgODAtMzUuOCA4MC04MHMtMzUuOC04MC04MC04MGMtMzIuOCAwLTYxIDE5LjctNzMuMyA0OEwyMDggMjQwYy00OS45IDAtOTEtMzguMS05NS42LTg2Ljh6TTgwIDQwOGEyNCAyNCAwIDEgMSAwIDQ4IDI0IDI0IDAgMSAxIDAtNDh6TTM0NCAyNzJhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHoiXQogICAgfTsKICAgIGZhSG91c2VUc3VuYW1pID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhvdXNlLXRzdW5hbWkiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTUxNSIsICJNMjg4IDE2QzE1NS41IDE2IDQ4IDEyMy41IDQ4IDI1NlMxNTUuNSA0OTYgMjg4IDQ5NmM3LjQgMCAxOS43LTIuMyAzMy43LTcuMyAxMy44LTQuOSAyNy4xLTExLjcgMzYuNy0xOC45IDM4LjQtMjkgOTAuNS0yOSAxMjkgMCAxNS40IDExLjYgMzUuMyAyMS4xIDU1IDI0LjQgMTkuNSAzLjMgMzcgLjQgNTEuMS0xMC4yIDEwLjYtOCAyNS42LTUuOSAzMy42IDQuN3M1LjkgMjUuNi00LjcgMzMuNmMtMjcuMyAyMC41LTU5LjIgMjQtODcuOSAxOS4yLTI4LjUtNC44LTU1LjQtMTgtNzUuOS0zMy40LTIxLjMtMTYuMS00OS45LTE2LjEtNzEuMiAwLTE0LjUgMTAuOS0zMi40IDE5LjctNDkuNSAyNS44LTE2LjggNi0zNC45IDEwLjEtNDkuOSAxMC4xbC0uMSAwQzEyOC45IDU0My45IDAgNDE1IDAgMjU2IDAgOTYuOSAxMjguOS0zMiAyODgtMzIgMzAxLjMtMzIgMzEyLTIxLjMgMzEyLThzLTEwLjcgMjQtMjQgMjR6bTQ0LjggMTY2LjRsOTYtNzJjMTEuNC04LjUgMjcuMS04LjUgMzguNSAwbDk1LjUgNzJjOCA2IDEyLjcgMTUuNSAxMi43IDI1LjVsLjMgMTIxLjVjLTIuMiAxLjMtNC4zIDIuNi02LjQgNC4yLTQuMyAzLjEtOC43IC44LTEzLjItMS41bC0xLjItLjYtLjctLjNjLTUuNC0yLjctMTEuNy02LjYtMTguOS0xMS43LTI5LjUtMjEuMS02NC4zLTMxLjYtOTkuMS0zMS40LTM0LjEgLjItNjguMSAxMC43LTk3IDMxLjQtNy44IDUuNi0xMy44IDkuMy0xOS4zIDExLjJMMzIwIDIwOGMwLTEwLjEgNC43LTE5LjYgMTIuOC0yNS42em01NC42IDIyOS43Yy0xNC41IDEwLjktMzIuNCAxOS43LTQ5LjUgMjUuOC0xNi44IDYtMzQuOSAxMC4xLTQ5LjkgMTAuMS0xMDYgMC0xOTItODYtMTkyLTE5MlMxODIgNjQgMjg4IDY0YzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0Yy03OS41IDAtMTQ0IDY0LjUtMTQ0IDE0NHM2NC41IDE0NCAxNDQgMTQ0YzcuNCAwIDE5LjctMi4zIDMzLjctNy4zIDEzLjgtNC45IDI3LjEtMTEuNyAzNi43LTE4LjkgMzguNC0yOSA5MC41LTI5IDEyOSAwIDE1LjQgMTEuNiAzNS4zIDIxLjEgNTUgMjQuNCAxOS41IDMuMyAzNyAuNCA1MS4xLTEwLjIgMTAuNi04IDI1LjYtNS45IDMzLjYgNC43czUuOSAyNS42LTQuNyAzMy42Yy0yNy4zIDIwLjUtNTkuMiAyNC04Ny45IDE5LjItMjguNS00LjgtNTUuNC0xOC03NS45LTMzLjQtMjEuMy0xNi4xLTQ5LjktMTYuMS03MS4yIDB6Il0KICAgIH07CiAgICBmYU1hZ25pZnlpbmdHbGFzc0NoYXJ0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1hZ25pZnlpbmctZ2xhc3MtY2hhcnQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTUyMiIsICJNNDE2IDIwOGMwIDQ1LjktMTQuOSA4OC4zLTQwIDEyMi43TDUwMi42IDQ1Ny40YzEyLjUgMTIuNSAxMi41IDMyLjggMCA0NS4zcy0zMi44IDEyLjUtNDUuMyAwTDMzMC43IDM3NkMyOTYuMyA0MDEuMSAyNTMuOSA0MTYgMjA4IDQxNiA5My4xIDQxNiAwIDMyMi45IDAgMjA4UzkzLjEgMCAyMDggMCA0MTYgOTMuMSA0MTYgMjA4em0tMzEyIDhsMCA2NGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNjRjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjR6bTgwLTk2bDAgMTYwYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xNjBjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjR6bTgwIDY0bDAgOTZjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTk2YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0eiJdCiAgICB9OwogICAgZmFVbWJyZWxsYSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ1bWJyZWxsYSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMGU5IiwgIk0yNTYtMzJjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAyYzEyNi4zIDE1LjcgMjI0IDEyMy41IDIyNCAyNTQgMCAzLjgtLjEgNy41LS4yIDExLjMtLjMgNi45LTUgMTIuOC0xMS43IDE0LjdzLTEzLjgtLjctMTcuNi02LjVjLTE0LjQtMjEuNC0zOC44LTM1LjUtNjYuNS0zNS41LTI5LjMgMC01NC45IDE1LjctNjguOSAzOS4zLTIuNyA0LjYtNy42IDcuNi0xMyA3LjhzLTEwLjUtMi4yLTEzLjctNi41Yy0xNC42LTE5LjgtMzgtMzIuNi02NC41LTMyLjZzLTQ5LjkgMTIuOC02NC41IDMyLjZjLTMuMiA0LjMtOC4zIDYuOC0xMy43IDYuNXMtMTAuMi0zLjItMTMtNy44Yy0xNC0yMy42LTM5LjYtMzkuMy02OC45LTM5LjMtMjcuNyAwLTUyLjEgMTQuMS02Ni41IDM1LjUtMy45IDUuNy0xMSA4LjQtMTcuNiA2LjVTLjUgMjc0LjIgLjIgMjY3LjNDLjEgMjYzLjUgMCAyNTkuOCAwIDI1NiAwIDEyNS41IDk3LjcgMTcuNyAyMjQgMmwwLTJjMC0xNy43IDE0LjMtMzIgMzItMzJ6bTMyIDM2MGwwIDEwMi42YzAgNDUtMzYuNSA4MS40LTgxLjQgODEuNC0zMC44IDAtNTktMTcuNC03Mi44LTQ1bC0yLjMtNC43Yy03LjktMTUuOC0xLjUtMzUgMTQuMy00Mi45czM1LTEuNSA0Mi45IDE0LjNsMi4zIDQuN2MzIDUuOSA5IDkuNiAxNS42IDkuNiA5LjYgMCAxNy40LTcuOCAxNy40LTE3LjRMMjI0IDMyOGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMyeiJdCiAgICB9OwogICAgZmFIaWxsUm9ja3NsaWRlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhpbGwtcm9ja3NsaWRlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImU1MDgiLCAiTTI1Mi40IDEwMy44bDI3IDQ4YzIuOCA1IDguMiA4LjIgMTMuOSA4LjJsNTMuMyAwYzUuOCAwIDExLjEtMy4xIDEzLjktOC4ybDI3LTQ4YzIuNy00LjkgMi43LTEwLjggMC0xNS43bC0yNy00OGMtMi44LTUtOC4yLTguMi0xMy45LTguMmwtNTMuMyAwYy01LjggMC0xMS4xIDMuMS0xMy45IDguMmwtMjcgNDhjLTIuNyA0LjktMi43IDEwLjggMCAxNS43ek02OC4zIDg3QzQzLjEgNjEuOCAwIDc5LjcgMCAxMTUuM0wwIDQzMmMwIDQ0LjIgMzUuOCA4MCA4MCA4MGwzMTYuNyAwYzM1LjYgMCA1My41LTQzLjEgMjguMy02OC4zTDY4LjMgODd6TTUwNC4yIDQwMy42YzQuOSAyLjcgMTAuOCAyLjcgMTUuNyAwbDQ4LTI3YzUtMi44IDguMi04LjIgOC4yLTEzLjlsMC01My4zYzAtNS44LTMuMS0xMS4xLTguMi0xMy45bC00OC0yN2MtNC45LTIuNy0xMC44LTIuNy0xNS43IDBsLTQ4IDI3Yy01IDIuOC04LjIgOC4yLTguMiAxMy45bDAgNTMuM2MwIDUuOCAzLjEgMTEuMSA4LjIgMTMuOWw0OCAyN3pNMTkyIDY0YTMyIDMyIDAgMSAwIC02NCAwIDMyIDMyIDAgMSAwIDY0IDB6TTM4NCAyODhhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFVc2VyU2VjcmV0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXItc2VjcmV0IiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbMTI4MzczXSwgImYyMWIiLCAiTTE3MS0xNmMtMzYuNCAwLTU3LjggNTguMy02OC4zIDExMkw3MiA5NmMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwyNCAwIDAgMzJjMCAxNyAzLjMgMzMuMiA5LjMgNDhsLTkuMyAwIDAgMC0yMC41IDBjLTE1LjIgMC0yNy41IDEyLjMtMjcuNSAyNy41IDAgMyAuNSA1LjkgMS40IDguN2wyOC45IDg2LjZDNDAuMiAzNzkuNiAxNiA0MjguMSAxNiA0ODIuMyAxNiA0OTguNyAyOS4zIDUxMiA0NS43IDUxMmwzNTYuNiAwYzE2LjQgMCAyOS43LTEzLjMgMjkuNy0yOS43IDAtNTQuMi0yNC4yLTEwMi43LTYyLjMtMTM1LjRsMjguOS04Ni42Yy45LTIuOCAxLjQtNS43IDEuNC04LjcgMC0xNS4yLTEyLjMtMjcuNS0yNy41LTI3LjVsLTIwLjUgMCAwIDAtOS4zIDBjNi0xNC44IDkuMy0zMSA5LjMtNDhsMC0zMiAyNCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC0zMC43IDBjLTEwLjQtNTMuNy0zMS45LTExMi02OC4zLTExMi05LjYgMC0xOSAzLjktMjcuNSA4LjItOC4yIDQuMS0xOC40IDcuOC0yNS41IDcuOHMtMTcuMy0zLjctMjUuNS03LjhDMTkwLTEyLjEgMTgwLjYtMTYgMTcxLTE2em05My43IDQ4NC40bC0yNC44LTcwLjkgMjcuOS0zMi41YzIuNy0zLjIgNC4yLTcuMiA0LjItMTEuNCAwLTkuNy03LjgtMTcuNS0xNy41LTE3LjVsLTYxIDBjLTkuNyAwLTE3LjUgNy44LTE3LjUgMTcuNSAwIDQuMiAxLjUgOC4yIDQuMiAxMS40bDI3LjkgMzIuNS0yNC44IDcwLjktNTctMTgwLjQgMzUuNyAwYzE4LjQgMTAuMiAzOS41IDE2IDYyIDE2czQzLjYtNS44IDYyLTE2bDM1LjcgMC01NyAxODAuNHpNMjI0IDI1NmMtMzQuNyAwLTY0LjItMjIuMS03NS4zLTUzIDUuNyAzLjIgMTIuMyA1IDE5LjMgNWwxMi40IDBjMTYuNSAwIDMxLjEtMTAuNiAzNi4zLTI2LjIgMi4zLTcgMTIuMi03IDE0LjUgMCA1LjIgMTUuNiAxOS45IDI2LjIgMzYuMyAyNi4ybDEyLjQgMGM3IDAgMTMuNi0xLjggMTkuMy01LTExLjEgMzAuOS00MC42IDUzLTc1LjMgNTN6Il0KICAgIH07CiAgICBmYVBhZ2VyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBhZ2VyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MjIzXSwgImY4MTUiLCAiTTAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjU2YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ0OGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjh6bTY0IDMybDAgNjRjMCAxNy43IDE0LjMgMzIgMzIgMzJsMzIwIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMkw5NiAxMjhjLTE3LjcgMC0zMiAxNC4zLTMyIDMyek04OCAzMjBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNDggMHptMTI4IDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNDggMHoiXQogICAgfTsKICAgIGZhQnJpZWZjYXNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJyaWVmY2FzZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODE4OF0sICJmMGIxIiwgIk0yMDAgNDhsMTEyIDBjNC40IDAgOCAzLjYgOCA4bDAgNDAtMTI4IDAgMC00MGMwLTQuNCAzLjYtOCA4LTh6bS01NiA4bDAgNDAtODAgMEMyOC43IDk2IDAgMTI0LjcgMCAxNjBsMCA5NiA1MTIgMCAwLTk2YzAtMzUuMy0yOC43LTY0LTY0LTY0bC04MCAwIDAtNDBjMC0zMC45LTI1LjEtNTYtNTYtNTZMMjAwIDBjLTMwLjkgMC01NiAyNS4xLTU2IDU2ek01MTIgMzA0bC0xOTIgMCAwIDE2YzAgMTcuNy0xNC4zIDMyLTMyIDMybC02NCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTE2LTE5MiAwIDAgMTEyYzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTEyeiJdCiAgICB9OwogICAgZmFUcm93ZWxCcmlja3MgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidHJvd2VsLWJyaWNrcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNThhIiwgIk0yMjQgMzJjMC0xMS41LTYuMi0yMi4yLTE2LjItMjcuOHMtMjIuMy01LjUtMzIuMiAuNGwtMTYwIDk2QzUuOSAxMDYuMyAwIDExNi44IDAgMTI4czUuOSAyMS43IDE1LjUgMjcuNGwxNjAgOTZjOS45IDUuOSAyMi4yIDYuMSAzMi4yIC40UzIyNCAyMzUuNSAyMjQgMjI0bDAtNjQgMjU2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTI1NiAwIDAtNjR6bTk2IDE5MmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxNjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTY0YzAtMTcuNy0xNC4zLTMyLTMyLTMybC0xNjAgMHpNMCA0MTZsMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmw5NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtNjRjMC0xNy43LTE0LjMtMzItMzItMzJsLTk2IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyem0yMjQtMzJjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgNjRjMCAxNy43IDE0LjMgMzIgMzIgMzJsMjU2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC02NGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtMjU2IDB6Il0KICAgIH07CiAgICBmYVNvY2tzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNvY2tzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI5NTEwXSwgImY2OTYiLCAiTTI1Mi44IDBMMTc2IDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgMTYgMTEyIDAgMC0xNmMwLTE3LjUgNC43LTMzLjkgMTIuOC00OHpNMTI4IDExMmwwIDEyOGMwIDIwLjEtOS41IDM5LjEtMjUuNiA1MS4ybC02NCA0OGMtMjQuMiAxOC4xLTM4LjQgNDYuNi0zOC40IDc2LjggMCA1MyA0MyA5NiA5NiA5NiAxNS40IDAgMzAuNS0zLjcgNDQtMTAuNy0xNy42LTIzLjktMjgtNTMuNC0yOC04NS4zIDAtNDUuMyAyMS4zLTg4IDU3LjYtMTE1LjJsNjQtNDhjNC0zIDYuNC03LjggNi40LTEyLjhsMC0xMjgtMTEyIDB6bTE2MCAwbDAgMTI4YzAgMjAuMS05LjUgMzkuMS0yNS42IDUxLjJsLTY0IDQ4Yy0yNC4yIDE4LjEtMzguNCA0Ni42LTM4LjQgNzYuOCAwIDUzIDQzIDk2IDk2IDk2IDIwLjggMCA0MS02LjcgNTcuNi0xOS4ybDExNS4yLTg2LjRDNDYxIDM4Mi4yIDQ4MCAzNDQuMyA0ODAgMzA0bDAtMTkyLTE5MiAwek00ODAgNjRsMC0xNmMwLTI2LjUtMjEuNS00OC00OC00OEwzMzYgMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCAxNiAxOTIgMHoiXQogICAgfTsKICAgIGZhVCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0IiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTE2XSwgIjU0IiwgIk0zMiAzMkMxNC4zIDMyIDAgNDYuMyAwIDY0UzE0LjMgOTYgMzIgOTZsMTI4IDAgMCAzNTJjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTM1MiAxMjggMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwzMiAzMnoiXQogICAgfTsKICAgIGZhTWljcm9jaGlwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm1pY3JvY2hpcCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmMmRiIiwgIk0xNzYgMjRjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCA0MGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsLTQwIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDAgMCAwIDU2LTQwIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDAgMCAwIDU2LTQwIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDAgMGMwIDM1LjMgMjguNyA2NCA2NCA2NGwwIDQwYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC00MCA1NiAwIDAgNDBjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTQwIDU2IDAgMCA0MGMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtNDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsNDAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNDAgMCAwLTU2IDQwIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTQwIDAgMC01NiA0MCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC00MCAwYzAtMzUuMy0yOC43LTY0LTY0LTY0bDAtNDBjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCA0MC01NiAwIDAtNDBjMC0xMy4zLTEwLjctMjQtMjQtMjRzLTI0IDEwLjctMjQgMjRsMCA0MC01NiAwIDAtNDB6TTE2MCAxMjhsMTkyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxOTJjMCAxNy43LTE0LjMgMzItMzIgMzJsLTE5MiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTE5MmMwLTE3LjcgMTQuMy0zMiAzMi0zMnptMTYgNDhsMCAxNjAgMTYwIDAgMC0xNjAtMTYwIDB6Il0KICAgIH07CiAgICBmYVRydWNrTWVkaWNhbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cnVjay1tZWRpY2FsIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbMTI4NjU3LCAiYW1idWxhbmNlIl0sICJmMGY5IiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMuMyAwYzEwLjQgMzYuOSA0NC40IDY0IDg0LjcgNjRzNzQuMi0yNy4xIDg0LjctNjRsMTAyLjYgMGMxMC40IDM2LjkgNDQuNCA2NCA4NC43IDY0czc0LjItMjcuMSA4NC43LTY0bDMuMyAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTQ2LjdjMC0xNy02LjctMzMuMy0xOC43LTQ1LjNMNTEyIDE0Ni43Yy0xMi0xMi0yOC4zLTE4LjctNDUuMy0xOC43bC01MC43IDAgMC0zMmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnpNNTEyIDIzNy4zbDAgNTAuNy05NiAwIDAtOTYgNTAuNyAwIDQ1LjMgNDUuM3pNMTUyIDM4NGE0MCA0MCAwIDEgMSAwIDgwIDQwIDQwIDAgMSAxIDAtODB6bTIzMiA0MGE0MCA0MCAwIDEgMSA4MCAwIDQwIDQwIDAgMSAxIC04MCAwek0xNzYgMTM2YzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDQwIDQwIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC00MCAwIDAgNDBjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC00MC00MCAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZsNDAgMCAwLTQweiJdCiAgICB9OwogICAgZmFBbWJ1bGFuY2UgPSBmYVRydWNrTWVkaWNhbDsKICAgIGZhT20gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAib20iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgzMjldLCAiZjY3OSIsICJNMzg4LjcgNC43YzYuMi02LjIgMTYuNC02LjIgMjIuNiAwbDE2IDE2YzYuMiA2LjIgNi4yIDE2LjQgMCAyMi42bC0xNiAxNmMtNi4yIDYuMi0xNi40IDYuMi0yMi42IDBsLTE2LTE2Yy02LjItNi4yLTYuMi0xNi40IDAtMjIuNmwxNi0xNnpNMTc2IDE2MGMtMTAuOCAwLTIwLjggMy42LTI4LjggOS42LTE0LjEgMTAuNi0zNC4yIDcuOC00NC44LTYuNHMtNy44LTM0LjIgNi40LTQ0LjhjMTguNy0xNC4xIDQyLTIyLjQgNjcuMi0yMi40IDYxLjkgMCAxMTIgNTAuMSAxMTIgMTEyIDAgMTcuMi0zLjkgMzMuNS0xMC44IDQ4bDQ5LjcgMGMxMi43IDAgMjQuOS01IDMzLjktMTQuMWwyMC43LTIwLjdjMTguNy0xOC43IDQ0LjEtMjkuMyA3MC42LTI5LjMgNTUuMiAwIDk5LjkgNDQuNyA5OS45IDk5LjlsMCA5Ni4xYzAgNTUuMi00NC44IDEwMC0xMDAgMTAwUzM1MiA0NDMuMiAzNTIgMzg4bDAtNGMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgNGMwIDE5LjkgMTYuMSAzNiAzNiAzNnMzNi0xNi4xIDM2LTM2bDAtOTYuMWMwLTE5LjgtMTYuMS0zNS45LTM1LjktMzUuOS05LjUgMC0xOC42IDMuOC0yNS40IDEwLjVsLTIwLjcgMjAuN2MtMjEgMjEtNDkuNCAzMi44LTc5LjEgMzIuOGwtMjYuOCAwYzEyLjYgMTkuNiAxOS45IDQyLjggMTkuOSA2OCAwIDc1LjItNjUgMTMyLTE0MCAxMzJTNDAgNDYzLjIgNDAgMzg4YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJjMCAzNS4zIDMxLjcgNjggNzYgNjhzNzYtMzIuNyA3Ni02OC0zMS43LTY4LTc2LTY4bC0yMCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDE2IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhzLTIxLjUtNDgtNDgtNDh6TTMzNy4xIDYwLjFjLTExLTEzLjgtMzEuMS0xNi4yLTQ1LTUuMnMtMTYuMiAzMS4xLTUuMiA0NUMzMTIuNiAxMzIuMiAzNTQuNCAxNTIgNDAwIDE1MnM4Ny40LTE5LjggMTEzLjEtNTIuMWMxMS0xMy44IDguNy0zNC01LjItNDVzLTM0LTguNy00NSA1LjJDNDUwLjMgNzYgNDI3LjUgODggNDAwIDg4cy01MC4zLTEyLTYyLjktMjcuOXoiXQogICAgfTsKICAgIGZhTW9zcXVpdG9OZXQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibW9zcXVpdG8tbmV0IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1MmMiLCAiTTU3NiAzNTJjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCAxNiAxNiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNiAwIDAgNDggMTYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTYgMCAwIDE2LS4xIDIuNUM1OTguNiA1NjYuNiA1ODguNCA1NzYgNTc2IDU3NnMtMjIuNi05LjQtMjMuOS0yMS41bC0uMS0yLjUgMC0xNi00OCAwIDAgMTYtLjEgMi41QzUwMi42IDU2Ni42IDQ5Mi40IDU3NiA0ODAgNTc2cy0yMi42LTkuNC0yMy45LTIxLjVsLS4xLTIuNSAwLTE2LTE2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMTYgMCAwLTQ4LTE2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMTYgMCAwLTE2YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCAxNiA0OCAwIDAtMTZjMC0xMy4zIDEwLjctMjQgMjQtMjR6TTQyOS45IDE2LjNjNy43LTkuNCAyMS4zLTExLjUgMzEuNC00LjMgMTAuMSA3LjEgMTMuMSAyMC45IDcuNCAzMS43bC0xLjMgMi4xLTI1LjkgMzguOSAxMy4zIDUzLjRjMiA4LS4xIDE2LjMtNS4zIDIyLjNsLTIuNCAyLjQtNDQuNyAzOC4zIDEzMC41IDE0LjVjNDIuOCA0LjggNzUuMSA0MC45IDc1LjEgODMuOSAwIDMuOS0uNCA3LjctLjkgMTEuNS03LjMtMy41LTE1LjMtNS44LTIzLjgtNi43TDU3NiAzMDRjLTE4LjUgMC0zNS4zIDctNDggMTguNC0xMS05LjktMjUuMS0xNi41LTQwLjYtMTguMUw0ODAgMzA0Yy0zMC4zIDAtNTYuMSAxOC43LTY2LjggNDUuMi0xMi41IDUtMjMuMiAxMy40LTMxLjEgMjRsLTMwLjItNDAuMSAwIDc0LjdjMCAxNy43LTE0LjMgMzItMzIgMzItMTYuNiAwLTMwLjItMTIuNi0zMS44LTI4LjdsLS4yLTMuMyAwLTc0LjYtMzIuMyA0MyAwIDM5LjhjMCAzLjUtLjcgNi45LTIuMSAxMC4xbC0xLjYgMy4xLTQwIDY0LTEuNCAyYy03LjUgOS42LTIxIDEyLjEtMzEuMyA1LjMtMTAuMy02LjgtMTMuNy0yMC41LTguMy0zMS41bDEuMi0yLjIgMzYuMi01OCAwLTQxIC4zLTRjLjYtMy45IDIuMi03LjcgNC42LTEwLjlsMzkuMy01Mi4yLTY2LjIgNTkuNWMtMTcgMTUuMy0zOSAyMy43LTYxLjkgMjMuOGwtOC4xIDBjLTQ2LjYgMC04NC40LTM3LjgtODQuNC04NC40IDAtNDMgMzIuNC03OS4yIDc1LjEtODMuOWwxMzAuNS0xNC41LTQ0LjctMzguMy0yLjQtMi40Yy01LjItNi03LjMtMTQuNC01LjMtMjIuM2wxMy4zLTUzLjQtMjUuOS0zOC45LTEuMi0yLjFjLTUuNy0xMC44LTIuNy0yNC42IDcuNC0zMS43IDEwLjEtNy4xIDIzLjctNS4xIDMxLjQgNC4zbDEuNSAyIDMyIDQ4IDEuNCAyLjJjMi44IDUuMyAzLjUgMTEuNiAyLjEgMTcuNmwtMTIuMyA0OS4yIDUzLjMgNDUuNyAwLTI4LjggLjItMy4yYzEuMS0xMC40IDcuMi0xOS40IDE1LjgtMjQuNGwwLTYwLjUgLjMtMy4yYzEuNS03LjMgOC0xMi43IDE1LjctMTIuOCA3LjcgMCAxNC4yIDUuNSAxNS43IDEyLjhsLjMgMy4yIDAgNjAuNWM4LjcgNSAxNC44IDE0IDE1LjggMjQuNGwuMiAzLjIgMCAyOC45IDUzLjQtNDUuNy0xMi4zLTQ5LjJjLTEuNS01LjktLjctMTIuMiAyLjEtMTcuNmwxLjQtMi4yIDMyLTQ4IDEuNS0yek01MDQgNDg4bDQ4IDAgMC00OC00OCAwIDAgNDh6Il0KICAgIH07CiAgICBmYVByZXNjcmlwdGlvbkJvdHRsZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwcmVzY3JpcHRpb24tYm90dGxlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImY0ODUiLCAiTTAgMzJDMCAxNC4zIDE0LjMgMCAzMiAwTDM1MiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgMzJjMCAxNy43LTE0LjMgMzItMzIgMzJMMzIgOTZDMTQuMyA5NiAwIDgxLjcgMCA2NEwwIDMyek0zMiAxNDRsMzIwIDAgMCAzMDRjMCAzNS4zLTI4LjcgNjQtNjQgNjRMOTYgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NGw3MiAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC03MiAwIDAtNDggNzIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNzIgMCAwLTQ4IDcyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTcyIDAgMC02NHoiXQogICAgfTsKICAgIGZhVXNlcnNHZWFyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXJzLWdlYXIiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsidXNlcnMtY29nIl0sICJmNTA5IiwgIk0zMjAgMjI0YTEwNCAxMDQgMCAxIDAgMC0yMDggMTA0IDEwNCAwIDEgMCAwIDIwOHpNOTYgMjMyYTcyIDcyIDAgMSAwIDAtMTQ0IDcyIDcyIDAgMSAwIDAgMTQ0ek0wIDQxNmwwIDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMybDg2LjcgMGMtNC4zLTkuOC02LjctMjAuNi02LjctMzJsMC0xNmMwLTUzLjIgMjAtMTAxLjggNTIuOS0xMzguNi0xMS43LTMuNS0yNC4xLTUuNC0zNi45LTUuNC03MC43IDAtMTI4IDU3LjMtMTI4IDEyOHpNNjE2IDE2MGE3MiA3MiAwIDEgMCAtMTQ0IDAgNzIgNzIgMCAxIDAgMTQ0IDB6TTE2MCA0MzJsMCAxNmMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxNTYuOCAwYy03LjEtMjEuNi02LjMtNDQuNCAxMC43LTY0LTE0LTE2LjItMjAuNS0zOS43LTExLjQtNjMuMyA2LjYtMTcuMSAxNS45LTMzLjEgMjcuNC00Ny4zIDUuNC02LjYgMTEuNi0xMS43IDE4LjMtMTUuNC0yMi4xLTExLjUtNDcuMi0xOC03My44LTE4LTg4LjQgMC0xNjAgNzEuNi0xNjAgMTYwem00NjQuNi00NC4xYzYuMy0zLjYgOS41LTExLjEgNi44LTE4LTQuOC0xMi40LTExLjUtMjQuMS0xOS45LTM0LjQtNC42LTUuNy0xMi43LTYuNy0xOS0zLTIxLjggMTIuNi00OC42LTIuOC00OC42LTI4LjEgMC03LjMtNC45LTEzLjgtMTIuMS0xNC45LTEyLjktMi0yNi44LTItMzkuNyAwLTcuMiAxLjEtMTIuMSA3LjYtMTIuMSAxNC45IDAgMjUuMi0yNi44IDQwLjctNDguNiAyOC4xLTYuMy0zLjYtMTQuNC0yLjYtMTkgMy04LjQgMTAuMy0xNS4xIDIyLTE5LjkgMzQuNC0yLjYgNi44IC41IDE0LjMgNi44IDE3LjkgMjEuOSAxMi42IDIxLjkgNDMuNSAwIDU2LjItNi4zIDMuNi05LjUgMTEuMS02LjggMTcuOSA0LjggMTIuNCAxMS41IDI0LjEgMTkuOSAzNC40IDQuNiA1LjcgMTIuNyA2LjcgMTkgMyAyMS44LTEyLjYgNDguNiAyLjkgNDguNiAyOC4xIDAgNy4zIDQuOSAxMy44IDEyLjEgMTQuOSAxMi45IDIgMjYuOCAyIDM5LjcgMCA3LjItMS4xIDEyLjEtNy42IDEyLjEtMTQuOSAwLTI1LjIgMjYuOC00MC43IDQ4LjYtMjguMSA2LjMgMy42IDE0LjQgMi42IDE5LTMgOC40LTEwLjMgMTUuMS0yMiAxOS45LTM0LjQgMi42LTYuOC0uNS0xNC4zLTYuOC0xNy45LTIxLjktMTIuNi0yMS45LTQzLjUgMC01Ni4yek00NzIgNDE2YTQwIDQwIDAgMSAxIDgwIDAgNDAgNDAgMCAxIDEgLTgwIDB6Il0KICAgIH07CiAgICBmYVVzZXJzQ29nID0gZmFVc2Vyc0dlYXI7CiAgICBmYVJvYWRDaXJjbGVFeGNsYW1hdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyb2FkLWNpcmNsZS1leGNsYW1hdGlvbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTY1IiwgIk0yODggMzJsLTc2LjMgMGMtMjkuNCAwLTU1LjEgMjAuMS02Mi4xIDQ4LjZMNjUuNCA0MjAuNUM1Ny45IDQ1MC43IDgwLjggNDgwIDExMiA0ODBsMjA5LjQgMGMtMTEuMi0yNC40LTE3LjQtNTEuNC0xNy40LTgwIDAtMjguNiA2LjItNTUuNyAxNy40LTgwLS41IDAtMSAwLTEuNSAwLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDQ5YzM1LjItMzkuOSA4Ni43LTY1IDE0NC02NSA5IDAgMTcuOCAuNiAyNi41IDEuOGwtMzItMTI5LjJDNDgzLjQgNTIuMSA0NTcuOCAzMiA0MjguMyAzMmwtNzYuNCAwIDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02NHpNNDk2IDU0NGExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6bTAtMTAwYTIwIDIwIDAgMSAxIDAgNDAgMjAgMjAgMCAxIDEgMC00MHptMC0xNDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgODBjMCA4LjgtNy4yIDE2LTE2IDE2cy0xNi03LjItMTYtMTZsMC04MGMwLTguOCA3LjItMTYgMTYtMTZ6Il0KICAgIH07CiAgICBmYVBhdXNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBhdXNlIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbOTIwOF0sICJmMDRjIiwgIk00OCAzMkMyMS41IDMyIDAgNTMuNSAwIDgwTDAgNDMyYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDY0IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC0zNTJjMC0yNi41LTIxLjUtNDgtNDgtNDhMNDggMzJ6bTIyNCAwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDM1MmMwIDI2LjUgMjEuNSA0OCA0OCA0OGw2NCAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtMzUyYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4bC02NCAweiJdCiAgICB9OwogICAgZmFTdGFmZlNuYWtlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInN0YWZmLXNuYWtlIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInJvZC1hc2NsZXBpdXMiLCAicm9kLXNuYWtlIiwgInN0YWZmLWFlc2N1bGFwaXVzIl0sICJlNTc5IiwgIk0xOTIgMzJsMC0zMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMybDAgMzIgNjQgMGM1MyAwIDk2IDQzIDk2IDk2cy00MyA5Ni05NiA5NmwtMTYgMCAwLTY0IDE2IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTY0IDAgMCAxOTIgMzIgMGM1MyAwIDk2IDQzIDk2IDk2IDAgNDcuNi0zNC42IDg3LjEtODAgOTQuN2wwLTY3YzkuNi01LjUgMTYtMTUuOSAxNi0yNy43IDAtMTcuNy0xNC4zLTMyLTMyLTMybC0zMiAwIDAgMTYwYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMzItMzIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwzMiAwIDAtNjQtMzIgMGMtNTMgMC05Ni00My05Ni05NiAwLTQ3LjYgMzQuNi04Ny4xIDgwLTk0LjdsMCA2N2MtOS42IDUuNS0xNiAxNS45LTE2IDI3LjcgMCAxNy43IDE0LjMgMzIgMzIgMzJsMzIgMCAwLTE5Mi03Mi42IDBjLTExLjEgMTkuMS0zMS43IDMyLTU1LjQgMzJsLTE2IDBDMjEuNSAxMjggMCAxMDYuNSAwIDgwUzIxLjUgMzIgNDggMzJsMTQ0IDB6Il0KICAgIH07CiAgICBmYVJvZEFzY2xlcGl1cyA9IGZhU3RhZmZTbmFrZTsKICAgIGZhUm9kU25ha2UgPSBmYVN0YWZmU25ha2U7CiAgICBmYVN0YWZmQWVzY3VsYXBpdXMgPSBmYVN0YWZmU25ha2U7CiAgICBmYVBpZ2d5QmFuayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwaWdneS1iYW5rIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY0ZDMiLCAiTTI4OC0zMmE5NiA5NiAwIDEgMSAwIDE5MiA5NiA5NiAwIDEgMSAwLTE5MnpNNDggMzA0YzAtNzAuMSA0Ny0xMzEuNCAxMTcuMS0xNjQuOSAyNS4zIDQxLjMgNzAuOSA2OC45IDEyMi45IDY4LjkgNTUuNyAwIDEwNC4xLTMxLjcgMTI4LTc4IDE1LjgtMTEuMyAzNS4xLTE4IDU2LTE4bDE5LjUgMGMxMC40IDAgMTggOS44IDE1LjUgMTkuOWwtMTcuMSA2OC4zYzkuOSAxMi40IDE4LjIgMjUuNyAyNC40IDM5LjhsMjEuNyAwYzEzLjMgMCAyNCAxMC43IDI0IDI0bDAgMTEyYzAgMTMuMy0xMC43IDI0LTI0IDI0bC00MCAwYy0xNi41IDIyLTM4LjUgMzkuNi02NCA1MC43bDAgMjkuM2MwIDE3LjctMTQuMyAzMi0zMiAzMmwtMzMgMGMtMTQuMyAwLTI2LjgtOS41LTMwLjgtMjMuMmwtNy4xLTI0LjgtODIuMyAwLTcuMSAyNC44QzIzNS44IDUwMi41IDIyMy4zIDUxMiAyMDkgNTEybC0zMyAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTI5LjNDODcuNSA0MjYgNDggMzY5LjYgNDggMzA0em0zNzYgMTZhMjQgMjQgMCAxIDAgMC00OCAyNCAyNCAwIDEgMCAwIDQ4eiJdCiAgICB9OwogICAgZmFNb251bWVudCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb251bWVudCIsCiAgICAgIGljb246IFszODQsIDUxMiwgW10sICJmNWE2IiwgIk0yMDktMzNjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwTDk1IDQ3Yy00LjEgNC4xLTYuNSA5LjQtNyAxNS4xTDU4LjQgNDQ4IDQ4IDQ0OGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwyODggMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMTAuNCAwLTI5LjctMzg1LjhjLS40LTUuNy0yLjktMTEuMS03LTE1LjFMMjA5LTMzek0xMjggMjk2YzAtMTMuMyAxMC43LTI0IDI0LTI0bDgwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTgwIDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0eiJdCiAgICB9OwogICAgZmFBbmdsZXNSaWdodCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhbmdsZXMtcmlnaHQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxODcsICJhbmdsZS1kb3VibGUtcmlnaHQiXSwgImYxMDEiLCAiTTQzOS4xIDI3OC42YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zbC0xNjAtMTYwYy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM0wzNzEuMiAyNTYgMjMzLjkgMzkzLjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBsMTYwLTE2MHptLTM1MiAxNjBsMTYwLTE2MGMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM2wtMTYwLTE2MGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBzLTEyLjUgMzIuOCAwIDQ1LjNMMTc5LjIgMjU2IDQxLjkgMzkzLjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDB6Il0KICAgIH07CiAgICBmYUFuZ2xlRG91YmxlUmlnaHQgPSBmYUFuZ2xlc1JpZ2h0OwogICAgZmFEZXNrdG9wID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRlc2t0b3AiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg0MjEsIDYxNzA0LCAiZGVza3RvcC1hbHQiXSwgImYzOTAiLCAiTTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCAzNTJjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMTQ0IDAtMTYgNDgtNzIgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwyNzIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNzIgMC0xNi00OCAxNDQgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTI1NmMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnpNOTYgOTZsMzIwIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAxNjBjMCAxNy43LTE0LjMgMzItMzIgMzJMOTYgMzIwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTE2MGMwLTE3LjcgMTQuMy0zMiAzMi0zMnoiXQogICAgfTsKICAgIGZhRGVza3RvcEFsdCA9IGZhRGVza3RvcDsKICAgIGZhUGxhbmVDaXJjbGVYbWFyayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwbGFuZS1jaXJjbGUteG1hcmsiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU1NyIsICJNMjMyIDI0YzAtMzAuOSAyNS4xLTU2IDU2LTU2czU2IDI1LjEgNTYgNTZsMCAxMjcuMyA3OCA3MS41Yy02OS4zIDI5LTExOCA5Ny40LTExOCAxNzcuMiAwIDQ5LjMgMTguNiA5NC4zIDQ5LjEgMTI4LjNMMjg4IDUxMiAxNzkuOSA1MzljLTEwLjEgMi41LTE5LjktNS4xLTE5LjktMTUuNWwwLTE5LjhjMC00LjkgMi4yLTkuNSA2LTEyLjVsNjYtNTIuOCAwLTk5LjctMTYyLjkgNTQuM0M1OC43IDM5Ni40IDQ4IDM4OC43IDQ4IDM3Ny44bDAtNDMuN2MwLTkgMy44LTE3LjUgMTAuNC0yMy42TDIzMiAxNTEuMyAyMzIgMjR6TTQ5NiAyNTZhMTQ0IDE0NCAwIDEgMSAwIDI4OCAxNDQgMTQ0IDAgMSAxIDAtMjg4em01OS4zIDEwNy4zYzYuMi02LjIgNi4yLTE2LjQgMC0yMi42cy0xNi40LTYuMi0yMi42IDBsLTM2LjcgMzYuNy0zNi43LTM2LjdjLTYuMi02LjItMTYuNC02LjItMjIuNiAwcy02LjIgMTYuNCAwIDIyLjZsMzYuNyAzNi43LTM2LjcgMzYuN2MtNi4yIDYuMi02LjIgMTYuNCAwIDIyLjZzMTYuNCA2LjIgMjIuNiAwbDM2LjctMzYuNyAzNi43IDM2LjdjNi4yIDYuMiAxNi40IDYuMiAyMi42IDBzNi4yLTE2LjQgMC0yMi42bC0zNi43LTM2LjcgMzYuNy0zNi43eiJdCiAgICB9OwogICAgZmFSZXR3ZWV0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJldHdlZXQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjA3OSIsICJNMTE4LjYgNDEuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTY0IDY0Yy05LjIgOS4yLTExLjkgMjIuOS02LjkgMzQuOVMxOS4xIDE2MCAzMiAxNjBsMzIgMCAwIDIyNGMwIDUzIDQzIDk2IDk2IDk2bDEyOCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0xMjggMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0yMjQgMzIgMGMxMi45IDAgMjQuNi03LjggMjkuNi0xOS44czIuMi0yNS43LTYuOS0zNC45bC02NC02NHpNNDU3LjQgNDcwLjZjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsNjQtNjRjOS4yLTkuMiAxMS45LTIyLjkgNi45LTM0LjlTNTU2LjkgMzUyIDU0NCAzNTJsLTMyIDAgMC0yMjRjMC01My00My05Ni05Ni05NkwyODggMzJjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMTI4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAyMjQtMzIgMGMtMTIuOSAwLTI0LjYgNy44LTI5LjYgMTkuOHMtMi4yIDI1LjcgNi45IDM0LjlsNjQgNjR6Il0KICAgIH07CiAgICBmYVVzZXJHZWFyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVzZXItZ2VhciIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWyJ1c2VyLWNvZyJdLCAiZjRmZSIsICJNMjU2LjUgOGExMjAgMTIwIDAgMSAxIDAgMjQwIDEyMCAxMjAgMCAxIDEgMC0yNDB6TTIyNi43IDMwNGw1OS40IDAgMS41IDBjLTEyLjkgMjYuOC03LjggNTguMiAxMS41IDc5LjUtMjAuMiAyMi4zLTI0LjggNTUuOC05LjQgODMuNGwyMi41IDQwLjRjLjkgMS42IDEuOSAzLjIgMi45IDQuN2wtMjM3IDBjLTE2LjQgMC0yOS43LTEzLjMtMjkuNy0yOS43IDAtOTguNSA3OS44LTE3OC4zIDE3OC4zLTE3OC4zem0yMDUuOS01Ni40YzAtMTMuMyAxMC43LTI0IDI0LTI0bDQ4IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCA2LjFjMCAxOC45IDI0LjEgMzIuOCA0MC41IDIzLjRsNS0yLjljMTEuNi02LjcgMjYuNS0yLjYgMzMgOS4xbDIyLjQgNDAuMmM2LjIgMTEuMiAyLjYgMjUuMi04LjIgMzJsLTQuNyAyLjljLTE2LjIgMTAuMS0xNi4yIDM5LjkgMCA1MC4xbDQuNiAyLjljMTAuOCA2LjggMTQuNSAyMC44IDguMyAzMkw2MDcgNDgzLjhjLTYuNSAxMS43LTIxLjQgMTUuOS0zMyA5LjFsLTQuOS0yLjljLTE2LjQtOS41LTQwLjUgNC41LTQwLjUgMjMuNGwwIDYuMWMwIDEzLjMtMTAuNyAyNC0yNCAyNGwtNDggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRsMC01LjljMC0xOS0yNC4yLTMzLTQwLjctMjMuNWwtNC44IDIuOGMtMTEuNiA2LjctMjYuNCAyLjYtMzMtOS4xbC0yMi42LTQwLjRjLTYuMi0xMS4yLTIuNi0yNS4zIDguMy0zMi4xbDQuNC0yLjdjMTYuMy0xMC4xIDE2LjMtNDAuMSAwLTUwLjJsLTQuNS0yLjhjLTEwLjktNi44LTE0LjUtMjAuOS04LjMtMzIuMWwyMi41LTQwLjNjNi41LTExLjcgMjEuNC0xNS44IDMyLjktOS4xbDQuOCAyLjhjMTYuNSA5LjUgNDAuNy00LjUgNDAuNy0yMy41bDAtNS45em05OS45IDEzNi4yYTUyIDUyIDAgMSAwIC0xMDQgMCA1MiA1MiAwIDEgMCAxMDQgMHoiXQogICAgfTsKICAgIGZhVXNlckNvZyA9IGZhVXNlckdlYXI7CiAgICBmYUJvcmRlckFsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib3JkZXItYWxsIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY4NGMiLCAiTTM4NCA5NmwwIDEyOC0xMjggMCAwLTEyOCAxMjggMHptMCAxOTJsMCAxMjgtMTI4IDAgMC0xMjggMTI4IDB6TTE5MiAyMjRsLTEyOCAwIDAtMTI4IDEyOCAwIDAgMTI4ek02NCAyODhsMTI4IDAgMCAxMjgtMTI4IDAgMC0xMjh6TTY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0MTZjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMzIwIDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zMjBjMC0zNS4zLTI4LjctNjQtNjQtNjRMNjQgMzJ6Il0KICAgIH07CiAgICBmYUNvaW5zID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvaW5zIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1MWUiLCAiTTEyOCA5NmwwLTE2YzAtNDQuMiA4Ni04MCAxOTItODBTNTEyIDM1LjggNTEyIDgwbDAgMTZjMCAzMC42LTQxLjMgNTcuMi0xMDIgNzAuNy0yLjQtMi44LTQuOS01LjUtNy40LTgtMTUuNS0xNS4zLTM1LjUtMjYuOS01Ni40LTM1LjUtNDEuOS0xNy41LTk2LjUtMjcuMS0xNTQuMi0yNy4xLTIxLjkgMC00My4zIDEuNC02My44IDQuMS0uMi0xLjMtLjItMi43LS4yLTQuMXpNNDMyIDM1M2wwLTQ2LjJjMTUuMS0zLjkgMjkuMy04LjUgNDIuMi0xMy45IDEzLjItNS41IDI2LjEtMTIuMiAzNy44LTIwLjNsMCAxNS40YzAgMjYuOC0zMS41IDUwLjUtODAgNjV6bTAtOTZsMC0zM2MwLTQuNS0uNC04LjgtMS0xMyAxNS41LTMuOSAzMC04LjYgNDMuMi0xNC4yczI2LjEtMTIuMiAzNy44LTIwLjNsMCAxNS40YzAgMjYuOC0zMS41IDUwLjUtODAgNjV6TTAgMjQwbDAtMTZjMC00NC4yIDg2LTgwIDE5Mi04MHMxOTIgMzUuOCAxOTIgODBsMCAxNmMwIDQ0LjItODYgODAtMTkyIDgwUzAgMjg0LjIgMCAyNDB6bTM4NCA5NmMwIDQ0LjItODYgODAtMTkyIDgwUzAgMzgwLjIgMCAzMzZsMC0xNS40YzExLjYgOC4xIDI0LjUgMTQuNyAzNy44IDIwLjMgNDEuOSAxNy41IDk2LjUgMjcuMSAxNTQuMiAyNy4xczExMi4zLTkuNyAxNTQuMi0yNy4xYzEzLjItNS41IDI2LjEtMTIuMiAzNy44LTIwLjNsMCAxNS40em0wIDgwLjZsMCAxNS40YzAgNDQuMi04NiA4MC0xOTIgODBTMCA0NzYuMiAwIDQzMmwwLTE1LjRjMTEuNiA4LjEgMjQuNSAxNC43IDM3LjggMjAuMyA0MS45IDE3LjUgOTYuNSAyNy4xIDE1NC4yIDI3LjFzMTEyLjMtOS43IDE1NC4yLTI3LjFjMTMuMi01LjUgMjYuMS0xMi4yIDM3LjgtMjAuM3oiXQogICAgfTsKICAgIGZhTWFyc1N0cm9rZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtYXJzLXN0cm9rZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWzk4OTRdLCAiZjIyOSIsICJNNDE2LTMyYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDUwLjcgMC01OC43IDU4LjctMTcuNC0xNy40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2wxNy40IDE3LjQtMjMgMjNjLTI4LjQtMTkuNS02Mi43LTMxLTk5LjgtMzEtOTcuMiAwLTE3NiA3OC44LTE3NiAxNzZzNzguOCAxNzYgMTc2IDE3NiAxNzYtNzguOCAxNzYtMTc2YzAtMzctMTEuNC03MS40LTMxLTk5LjhsMjMtMjMgMTcuNCAxNy40YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNMNDUzLjMgMTM2IDUxMiA3Ny4zIDUxMiAxMjhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMkw1NzYgMGMwLTE3LjctMTQuMy0zMi0zMi0zMkw0MTYtMzJ6TTEyOCAzMDRhMTEyIDExMiAwIDEgMSAyMjQgMCAxMTIgMTEyIDAgMSAxIC0yMjQgMHoiXQogICAgfTsKICAgIGZhSGFuZHNoYWtlQW5nbGUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZHNoYWtlLWFuZ2xlIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImhhbmRzLWhlbHBpbmciXSwgImY0YzQiLCAiTTI2OC45IDUzLjJMMTUyLjMgMTgyLjhjLTQuNiA1LjEtNC40IDEzIC41IDE3LjkgMzAuNSAzMC41IDgwIDMwLjUgMTEwLjUgMGwzMS44LTMxLjhjNC4yLTQuMiA5LjUtNi41IDE0LjktNi45IDYuOC0uNiAxMy44IDEuNyAxOSA2LjlMNTA1LjYgMzQ0IDU3NiAyODggNTc2IDAgNDY0IDY0IDQ0MC4yIDQ4LjFDNDI0LjQgMzcuNiA0MDUuOSAzMiAzODYuOSAzMmwtNzAuNCAwYy0xLjEgMC0yLjMgMC0zLjQgLjEtMTYuOSAuOS0zMi44IDguNS00NC4yIDIxLjF6TTExNi42IDE1MC43TDIyMy40IDMyIDE4My44IDMyYy0yNS41IDAtNDkuOSAxMC4xLTY3LjkgMjguMUwwIDE5MiAwIDU0NCAxNDQgNDA4IDE1Ni40IDQxOC4zYzIzIDE5LjIgNTIgMjkuNyA4MS45IDI5LjdsMTUuNyAwLTctN2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDQxIDQxIDkgMGMxOS4xIDAgMzcuOC00LjMgNTQuOC0xMi4zTDM1OSA0MDljLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGwzMiAzMiAxNy41LTE3LjVjOC45LTguOSAxMS41LTIxLjggNy42LTMzLjFsLTEzNy45LTEzNi44LTE0LjkgMTQuOWMtNDkuMyA0OS4zLTEyOS4xIDQ5LjMtMTc4LjQgMC0yMy0yMy0yMy45LTU5LjktMi4yLTg0eiJdCiAgICB9OwogICAgZmFIYW5kc0hlbHBpbmcgPSBmYUhhbmRzaGFrZUFuZ2xlOwogICAgZmFBcnJvd0Rvd24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYXJyb3ctZG93biIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzg1OTVdLCAiZjA2MyIsICJNMTY5LjQgNTAyLjZjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBsMTYwLTE2MGMxMi41LTEyLjUgMTIuNS0zMi44IDAtNDUuM3MtMzIuOC0xMi41LTQ1LjMgMEwyMjQgNDAyLjcgMjI0IDMyYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgMzcwLjctMTA1LjQtMTA1LjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zbDE2MCAxNjB6Il0KICAgIH07CiAgICBmYUxvY2F0aW9uRG90ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxvY2F0aW9uLWRvdCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJtYXAtbWFya2VyLWFsdCJdLCAiZjNjNSIsICJNMCAxODguNkMwIDg0LjQgODYgMCAxOTIgMFMzODQgODQuNCAzODQgMTg4LjZjMCAxMTkuMy0xMjAuMiAyNjIuMy0xNzAuNCAzMTYuOC0xMS44IDEyLjgtMzEuNSAxMi44LTQzLjMgMC01MC4yLTU0LjUtMTcwLjQtMTk3LjUtMTcwLjQtMzE2Ljh6TTE5MiAyNTZhNjQgNjQgMCAxIDAgMC0xMjggNjQgNjQgMCAxIDAgMCAxMjh6Il0KICAgIH07CiAgICBmYU1hcE1hcmtlckFsdCA9IGZhTG9jYXRpb25Eb3Q7CiAgICBmYVBsdWdDaXJjbGVFeGNsYW1hdGlvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwbHVnLWNpcmNsZS1leGNsYW1hdGlvbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTVkIiwgIk0xOTItMzJjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA5NiAxMjggMCAwLTk2YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCA5NiA2NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybDAgNDguN2MtOTguNiA4LjEtMTc2IDkwLjctMTc2IDE5MS4zIDAgMjcuMyA1LjcgNTMuMyAxNiA3Ni45bDAgMy4xYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtNjYuN0MxNjUuMiAzOTguMSA5NiAzMTkuMSA5NiAyMjRsMC02NGMtMTcuNyAwLTMyLTE0LjMtMzItMzJTNzguMyA5NiA5NiA5Nmw2NCAwIDAtOTZjMC0xNy43IDE0LjMtMzIgMzItMzJ6TTQ5NiAyNTZhMTQ0IDE0NCAwIDEgMSAwIDI4OCAxNDQgMTQ0IDAgMSAxIDAtMjg4em0wIDIyOGEyMCAyMCAwIDEgMCAwLTQwIDIwIDIwIDAgMSAwIDAgNDB6bTAtMTgwYy04LjggMC0xNiA3LjItMTYgMTZsMCA4MGMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtODBjMC04LjgtNy4yLTE2LTE2LTE2eiJdCiAgICB9OwogICAgZmFDb29raWVCaXRlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNvb2tpZS1iaXRlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1NjQiLCAiTTI1Ny41IDI3LjZjLS44LTUuNC00LjktOS44LTEwLjMtMTAuNi0yMi4xLTMuMS00NC42IC45LTY0LjQgMTEuNGwtNzQgMzkuNUM4OS4xIDc4LjQgNzMuMiA5NC45IDYzLjQgMTE1TDI2LjcgMTkwLjZjLTkuOCAyMC4xLTEzIDQyLjktOS4xIDY0LjlsMTQuNSA4Mi44YzMuOSAyMi4xIDE0LjYgNDIuMyAzMC43IDU3LjlsNjAuMyA1OC40YzE2LjEgMTUuNiAzNi42IDI1LjYgNTguNyAyOC43bDgzIDExLjdjMjIuMSAzLjEgNDQuNi0uOSA2NC40LTExLjRsNzQtMzkuNWMxOS43LTEwLjUgMzUuNi0yNyA0NS40LTQ3LjJsMzYuNy03NS41YzkuOC0yMC4xIDEzLTQyLjkgOS4xLTY0LjktLjktNS4zLTUuMy05LjMtMTAuNi0xMC4xLTUxLjUtOC4yLTkyLjgtNDcuMS0xMDQuNS05Ny40LTEuOC03LjYtOC0xMy40LTE1LjctMTQuNi01NC42LTguNy05Ny43LTUyLTEwNi4yLTEwNi44ek0yMDggMTQ0YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHpNMTQ0IDMzNmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0yMjQtNjRhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFTY3Jld2RyaXZlcldyZW5jaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzY3Jld2RyaXZlci13cmVuY2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsidG9vbHMiXSwgImY3ZDkiLCAiTTcwLjgtNi43YzUuNC01LjQgMTMuOC02LjIgMjAuMi0yTDIwOS45IDcwLjVjOC45IDUuOSAxNC4yIDE1LjkgMTQuMiAyNi42bDAgNDkuNiA5MC44IDkwLjhjMzMuMy0xNSA3My45LTguOSAxMDEuMiAxOC41TDU0Mi4yIDM4Mi4xYzE4LjcgMTguNyAxOC43IDQ5LjEgMCA2Ny45bC02MC4xIDYwLjFjLTE4LjcgMTguNy00OS4xIDE4LjctNjcuOSAwTDI4OC4xIDM4NGMtMjcuNC0yNy40LTMzLjUtNjcuOS0xOC41LTEwMS4ybC05MC44LTkwLjgtNDkuNiAwYy0xMC43IDAtMjAuNy01LjMtMjYuNi0xNC4yTDIzLjQgNTguOWMtNC4yLTYuMy0zLjQtMTQuOCAyLTIwLjJMNzAuOC02Ljd6bTE0NSAzMDMuNWMtNi4zIDM2LjkgMi4zIDc1LjkgMjYuMiAxMDcuMmwtOTQuOSA5NWMtMjguMSAyOC4xLTczLjcgMjguMS0xMDEuOCAwcy0yOC4xLTczLjcgMC0xMDEuOGwxMzUuNC0xMzUuNSAzNS4yIDM1LjF6TTM4NC4xIDBjMjAuMSAwIDM5LjQgMy43IDU3LjEgMTAuNSAxMCAzLjggMTEuOCAxNi41IDQuMyAyNC4xTDM4OC44IDkxLjNjLTMgMy00LjcgNy4xLTQuNyAxMS4zbDAgNDEuNGMwIDguOCA3LjIgMTYgMTYgMTZsNDEuNCAwYzQuMiAwIDguMy0xLjcgMTEuMy00LjdsNTYuNy01Ni43YzcuNi03LjUgMjAuMy01LjcgMjQuMSA0LjMgNi44IDE3LjcgMTAuNSAzNyAxMC41IDU3LjEgMCA0My4yLTE3LjIgODIuMy00NSAxMTEuMWwtNDkuMS00OS4xYy0zMy4xLTMzLTc4LjUtNDUuNy0xMjEuMS0zOC40bC01Ni44LTU2LjggMC0yOS43LS4yLTVjLS44LTEyLjQtNC40LTI0LjMtMTAuNS0zNC45IDI5LjQtMzUgNzMuNC01Ny4yIDEyMi43LTU3LjN6Il0KICAgIH07CiAgICBmYVRvb2xzID0gZmFTY3Jld2RyaXZlcldyZW5jaDsKICAgIGZhSW5kZW50ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImluZGVudCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmMDNjIiwgIk0wIDY0QzAgNDYuMyAxNC4zIDMyIDMyIDMybDM4NCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMyTDMyIDk2QzE0LjMgOTYgMCA4MS43IDAgNjR6TTE5MiAxOTJjMC0xNy43IDE0LjMtMzIgMzItMzJsMTkyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTE5MiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnptMzIgOTZsMTkyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTE5MiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMyek0wIDQ0OGMwLTE3LjcgMTQuMy0zMiAzMi0zMmwzODQgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMkwzMiA0ODBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyek0xMjcuOCAyNjguNkwyNS44IDM0Ny45QzE1LjMgMzU2LjEgMCAzNDguNiAwIDMzNS4zTDAgMTc2LjdjMC0xMy4zIDE1LjMtMjAuOCAyNS44LTEyLjZsMTAxLjkgNzkuM2M4LjIgNi40IDguMiAxOC45IDAgMjUuM3oiXQogICAgfTsKICAgIGZhQmFycyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYXJzIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbIm5hdmljb24iXSwgImYwYzkiLCAiTTAgOTZDMCA3OC4zIDE0LjMgNjQgMzIgNjRsMzg0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgMTI4QzE0LjMgMTI4IDAgMTEzLjcgMCA5NnpNMCAyNTZjMC0xNy43IDE0LjMtMzIgMzItMzJsMzg0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgMjg4Yy0xNy43IDAtMzItMTQuMy0zMi0zMnpNNDQ4IDQxNmMwIDE3LjctMTQuMyAzMi0zMiAzMkwzMiA0NDhjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsMzg0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJ6Il0KICAgIH07CiAgICBmYU5hdmljb24gPSBmYUJhcnM7CiAgICBmYUhhbmRzUHJheWluZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kcy1wcmF5aW5nIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbInByYXlpbmctaGFuZHMiXSwgImY2ODQiLCAiTTIyNCAyOTZjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0xMTIuNiA4OC4yLTExOS43YzEzLjEtMTcuOCA5LjMtNDIuOC04LjUtNTUuOXMtNDIuOC05LjMtNTUuOSA4LjVMMTA2LjUgMTQyLjlDODkuMyAxNjYuMiA4MCAxOTQuNSA4MCAyMjMuNmwwIDExMC43LTU4LjEgMTkuNEM4LjggMzU4IDAgMzcwLjIgMCAzODRsMCA5NmMwIDEwIDQuNyAxOS41IDEyLjcgMjUuNXMxOC40IDggMjguMSA1LjJsMTU0LjQtNDQuMWM1NS0xNS43IDkyLjgtNjUuOSA5Mi44LTEyMy4xTDI4OCAyMjRjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA3MnptMTkyIDBsMC03MmMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDExOS42YzAgNTcuMiAzNy45IDEwNy40IDkyLjggMTIzLjFsMTU0LjQgNDQuMWM5LjcgMi44IDIwIC44IDI4LjEtNS4yUzY0MCA0OTAgNjQwIDQ4MGwwLTk2YzAtMTMuOC04LjgtMjYtMjEuOS0zMC40bC01OC4xLTE5LjQgMC0xMTAuN2MwLTI5LTkuMy01Ny4zLTI2LjUtODAuN0w0NDAuMiAxNi4zQzQyNy4xLTEuNSA0MDIuMS01LjMgMzg0LjMgNy44cy0yMS42IDM4LjEtOC41IDU1LjlMNDY0IDE4My40IDQ2NCAyOTZjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjR6Il0KICAgIH07CiAgICBmYVByYXlpbmdIYW5kcyA9IGZhSGFuZHNQcmF5aW5nOwogICAgZmFWaXJ1c2VzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZpcnVzZXMiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTA3NiIsICJNMTkyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzIgMCAzMC41IDM2LjkgNDUuOCA1OC41IDI0LjIgMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM2MtMjEuNiAyMS42LTYuMyA1OC41IDI0LjIgNTguNSAxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmMtMzAuNSAwLTQ1LjggMzYuOS0yNC4yIDU4LjUgMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjNzLTMyLjggMTIuNS00NS4zIDBjLTIxLjYtMjEuNi01OC41LTYuMy01OC41IDI0LjIgMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJjMC0zMC41LTM2LjktNDUuOC01OC41LTI0LjItMTIuNSAxMi41LTMyLjggMTIuNS00NS4zIDBzLTEyLjUtMzIuOCAwLTQ1LjNDNzcuOCAyNjAuOSA2Mi41IDIyNCAzMiAyMjQgMTQuMyAyMjQgMCAyMDkuNyAwIDE5MnMxNC4zLTMyIDMyLTMyYzMwLjUgMCA0NS44LTM2LjkgMjQuMi01OC41LTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zczMyLjgtMTIuNSA0NS4zIDBDMTIzLjEgNzcuOCAxNjAgNjIuNSAxNjAgMzIgMTYwIDE0LjMgMTc0LjMgMCAxOTIgMHpNMTQ0IDE3NmEzMiAzMiAwIDEgMCAwLTY0IDMyIDMyIDAgMSAwIDAgNjR6bTEyOCA2NGEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwem0yNDggNDBjMCAyMi45IDI3LjcgMzQuNCA0My45IDE4LjIgOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45Yy0xNi4yIDE2LjItNC43IDQzLjkgMTguMiA0My45IDEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0Yy0yMi45IDAtMzQuNCAyNy43LTE4LjIgNDMuOSA5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwYy0xNi4yLTE2LjItNDMuOS00LjctNDMuOSAxOC4yIDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtMjIuOS0yNy43LTM0LjQtNDMuOS0xOC4yLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjljMTYuMi0xNi4yIDQuNy00My45LTE4LjItNDMuOS0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0YzIyLjkgMCAzNC40LTI3LjcgMTguMi00My45LTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGMxNi4yIDE2LjIgNDMuOSA0LjcgNDMuOS0xOC4yIDAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjR6TTUwNCAzODRhMjQgMjQgMCAxIDAgLTQ4IDAgMjQgMjQgMCAxIDAgNDggMHoiXQogICAgfTsKICAgIGZhU2Nob29sRmxhZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzY2hvb2wtZmxhZyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNTZlIiwgIk0yNTYtOGMwLTEzLjMgMTAuNy0yNCAyNC0yNGwxMTIgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDQ4YzAgMTMuMy0xMC43IDI0LTI0IDI0bC03MiAwIDAgMTkuMiAxMjggNzYuOCA2NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjI0YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAyMjRjMC0zNS4zIDI4LjctNjQgNjQtNjRsNjQgMCAxMjgtNzYuOCAwLTkxLjJ6TTI0MCAzODRsMCA4MCA5NiAwIDAtODBjMC0yNi41LTIxLjUtNDgtNDgtNDhzLTQ4IDIxLjUtNDggNDh6TTExMiA0MTZjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMHptMTYtMTQ0bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZ6TTQ5NiA0MTZjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMHptMTYtMTQ0bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZ6bS0yMjQgMGE0OCA0OCAwIDEgMCAwLTk2IDQ4IDQ4IDAgMSAwIDAgOTZ6Il0KICAgIH07CiAgICBmYVRyYWRlbWFyayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0cmFkZW1hcmsiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFs4NDgyXSwgImYyNWMiLCAiTTM0Ni42IDExMC4yYy03LjgtMTEuNy0yMi40LTE3LTM1LjktMTIuOVMyODggMTEzLjkgMjg4IDEyOGwwIDI1NmMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTUwLjMgNjkuNCAxMDQuMWM1LjkgOC45IDE1LjkgMTQuMiAyNi42IDE0LjJzMjAuNy01LjMgMjYuNi0xNC4yTDU0NCAyMzMuNyA1NDQgMzg0YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yNTZjMC0xNC4xLTkuMi0yNi41LTIyLjctMzAuNnMtMjguMSAxLjEtMzUuOSAxMi45TDQ0OCAyNjIuMyAzNDYuNiAxMTAuMnpNMzIgOTZDMTQuMyA5NiAwIDExMC4zIDAgMTI4czE0LjMgMzIgMzIgMzJsNjQgMCAwIDIyNGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjI0IDY0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgOTZ6Il0KICAgIH07CiAgICBmYUZpcmVCdXJuZXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmlyZS1idXJuZXIiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTRmMSIsICJNMjgxLjcgNDguM0wyOTQgMzQuNWM1LjQtNi4xIDEzLjMtOC44IDIwLjktOC45IDcuMiAwIDE0LjMgMi42IDE5LjkgNy44IDE5LjcgMTguMyAzOS44IDQzLjIgNTUgNzAuNiAxNS4xIDI3LjIgMjYuMiA1OC4xIDI2LjIgODguMSAwIDg4LjctNzEuMyAxNTkuOC0xNjAgMTU5LjgtODkuNiAwLTE2MC03MS4zLTE2MC0xNTkuOCAwLTM3LjMgMTYtNzMuNCAzNi44LTEwNC41IDIwLjktMzEuMyA0Ny41LTU5IDcwLjktODAuMiA1LjctNS4yIDEzLjEtNy43IDIwLjMtNy41czEzLjQgMy4yIDE4LjggNy41YzE0LjQgMTEuNCAzOC45IDQwLjcgMzguOSA0MC43ek0zMjAgMjQwLjJjMC0zNi41LTM3LTczLTU0LjgtODguNC01LjQtNC43LTEzLjEtNC43LTE4LjUgMC0xNy43IDE1LjQtNTQuOCA1MS45LTU0LjggODguNCAwIDM1LjMgMjguNyA2NCA2NCA2NHM2NC0yOC43IDY0LTY0ek05Mi44IDMyMGMzNy43IDQ4LjMgOTYuMSA4MCAxNjMuMiA4MCA2Ni41IDAgMTI1LjEtMzEuNyAxNjMtODBsNDUgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDY0YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4TDQ4IDQ4MGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC02NGMwLTI2LjUgMjEuNS00OCA0OC00OGw0NC44IDB6TTQ1NiA0MDBhMjQgMjQgMCAxIDAgLTQ4IDAgMjQgMjQgMCAxIDAgNDggMHoiXQogICAgfTsKICAgIGZhRmFjZVNtaWxlQmVhbTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1zbWlsZS1iZWFtIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NTIyLCAic21pbGUtYmVhbSJdLCAiZjViOCIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTE2NS40IDMyMS45YzIwLjQgMjggNTMuNCA0Ni4xIDkwLjYgNDYuMXM3MC4yLTE4LjEgOTAuNi00Ni4xYzcuOC0xMC43IDIyLjgtMTMuMSAzMy41LTUuM3MxMy4xIDIyLjggNS4zIDMzLjVDMzU2LjMgMzkwIDMwOS4yIDQxNiAyNTYgNDE2cy0xMDAuMy0yNi0xMjkuNC02NS45Yy03LjgtMTAuNy01LjQtMjUuNyA1LjMtMzMuNXMyNS43LTUuNCAzMy41IDUuM3pNMTc2IDE4MGMtMTUuNSAwLTI4IDEyLjUtMjggMjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0zNy42IDMwLjQtNjggNjgtNjhzNjggMzAuNCA2OCA2OGwwIDhjMCAxMS05IDIwLTIwIDIwcy0yMC05LTIwLTIwbDAtOGMwLTE1LjUtMTIuNS0yOC0yOC0yOHptMTMyIDI4bDAgOGMwIDExLTkgMjAtMjAgMjBzLTIwLTktMjAtMjBsMC04YzAtMzcuNiAzMC40LTY4IDY4LTY4czY4IDMwLjQgNjggNjhsMCA4YzAgMTEtOSAyMC0yMCAyMHMtMjAtOS0yMC0yMGwwLThjMC0xNS41LTEyLjUtMjgtMjgtMjhzLTI4IDEyLjUtMjggMjh6Il0KICAgIH07CiAgICBmYVNtaWxlQmVhbTIgPSBmYUZhY2VTbWlsZUJlYW0yOwogICAgZmFUZW50QXJyb3dMZWZ0UmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGVudC1hcnJvdy1sZWZ0LXJpZ2h0IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU1N2YiLCAiTS0uNSAxMTNjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45bDcyLTcyYzkuNC05LjQgMjQuNi05LjQgMzMuOSAwczkuNCAyNC42IDAgMzMuOWwtMzEgMzEgMzEwLjEgMCA1NC4xIDAtMzEtMzFjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45czI0LjYtOS40IDMzLjkgMGw3MiA3MmM5LjQgOS40IDkuNCAyNC42IDAgMzMuOWwtNzIgNzJjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwcy05LjQtMjQuNiAwLTMzLjlsMzEtMzEtMTAyLjEgMC0uMSAwLTI2MiAwIDMxIDMxYzkuNCA5LjQgOS40IDI0LjYgMCAzMy45cy0yNC42IDkuNC0zMy45IDBsLTcyLTcyek0zNy4xIDQ3Nkw2MC4zIDI5Mi42YzEuMi05LjcgNi44LTE4LjMgMTUuMS0yMy4zTDIzOC44IDE3MGMxMC4yLTYuMiAyMi45LTYuMiAzMy4xLS4xbDE2NS41IDk5LjRjOC40IDUgMTQgMTMuNyAxNS4zIDIzLjRMNDc1LjkgNDc2YzIuNCAxOS4xLTEyLjUgMzYtMzEuNyAzNmwtNzEuOSAwYy0xMi4xIDAtMjMuMi02LjgtMjguNi0xNy43TDI3NS40IDM1Ny45Yy0xLjgtMy42LTUuNS01LjktOS41LTUuOS01LjkgMC0xMC42IDQuNy0xMC42IDEwLjZsMCAxMTcuNGMwIDE3LjctMTQuMyAzMi0zMiAzMkw2OC44IDUxMmMtMTkuMyAwLTM0LjItMTYuOS0zMS43LTM2eiJdCiAgICB9OwogICAgZmFSb3V0ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJyb3V0ZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJmNGQ3IiwgIk01MTIgOTZjMCA1MC4yLTU5LjEgMTI1LjEtODQuNiAxNTUtMy44IDQuNC05LjQgNi4xLTE0LjUgNUwzMjAgMjU2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDk2IDBjNTMgMCA5NiA0MyA5NiA5NnMtNDMgOTYtOTYgOTZsLTI3Ni40IDBjOC43LTkuOSAxOS4zLTIyLjYgMzAtMzYuOCA2LjMtOC40IDEyLjgtMTcuNiAxOS0yNy4yTDQxNiA0NDhjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTk2IDBjLTUzIDAtOTYtNDMtOTYtOTZzNDMtOTYgOTYtOTZsMzkuOCAwYy0yMS0zMS41LTM5LjgtNjcuNy0zOS44LTk2IDAtNTMgNDMtOTYgOTYtOTZzOTYgNDMgOTYgOTZ6TTExNy4xIDQ4OS4xYy0zLjggNC4zLTcuMiA4LjEtMTAuMSAxMS4zbC0xLjggMi0uMi0uMmMtNiA0LjYtMTQuNiA0LTIwLTEuOC0yNS4yLTI3LjQtODUtOTcuOS04NS0xNDguNCAwLTUzIDQzLTk2IDk2LTk2czk2IDQzIDk2IDk2YzAgMzAtMjEuMSA2Ny00My41IDk3LjktMTAuNyAxNC43LTIxLjcgMjgtMzAuOCAzOC41bC0uNiAuN3pNMTI4IDM1MmEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwek00MTYgMTI4YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHoiXQogICAgfTsKICAgIGZhQW5nbGVzVXAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYW5nbGVzLXVwIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbImFuZ2xlLWRvdWJsZS11cCJdLCAiZjEwMiIsICJNMjE0LjYgNDEuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTE2MCAxNjBjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBMMTkyIDEwOS4zIDMyOS40IDI0Ni42YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNsLTE2MC0xNjB6bTE2MCAzNTJsLTE2MC0xNjBjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwbC0xNjAgMTYwYy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwTDE5MiAzMDEuMyAzMjkuNCA0MzguNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zeiJdCiAgICB9OwogICAgZmFBbmdsZURvdWJsZVVwID0gZmFBbmdsZXNVcDsKICAgIGZhQnVja2V0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJ1Y2tldCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJlNGNmIiwgIk00NDMuNyAyMDhjMi43IDQuNyA0LjMgMTAuMiA0LjMgMTYgMCAxNy43LTE0LjMgMzItMzIgMzJsLTUuMSAwLTIyLjQgMjEzYy0yLjYgMjQuNC0yMy4yIDQzLTQ3LjggNDNsLTIzMy42IDBjLTI0LjYgMC00NS4yLTE4LjUtNDcuOC00M0wzNy4xIDI1NiAzMiAyNTZjLTE3LjcgMC0zMi0xNC4zLTMyLTMyIDAtNS44IDEuNi0xMS4zIDQuMy0xNmw0MzkuNCAwek0yMjQtMTZjNzkuNSAwIDE0NCA2NC41IDE0NCAxNDRsMCAzMi00OCAwIDAtMzJjMC01My00My05Ni05Ni05NnMtOTYgNDMtOTYgOTZsMCAzMi00OCAwIDAtMzJDODAgNDguNSAxNDQuNS0xNiAyMjQtMTZ6Il0KICAgIH07CiAgICBmYUxlc3NUaGFuRXF1YWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGVzcy10aGFuLWVxdWFsIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImY1MzciLCAiTTQyNi4xIDk0LjRjMTYuOC01LjYgMjUuOC0yMy43IDIwLjItNDAuNXMtMjMuNy0yNS44LTQwLjUtMjAuMmwtMzg0IDEyOEM4LjggMTY2IDAgMTc4LjIgMCAxOTJzOC44IDI2IDIxLjkgMzAuNGwzODQgMTI4YzE2LjggNS42IDM0LjktMy41IDQwLjUtMjAuMnMtMy41LTM0LjktMjAuMi00MC41TDEzMy4yIDE5MiA0MjYuMSA5NC40ek0zMiA0MTZjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzg0IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMzIgNDE2eiJdCiAgICB9OwogICAgZmFGb2xkZXJDbG9zZWQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZvbGRlci1jbG9zZWQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZTE4NSIsICJNNDQ4IDQ0OEw2NCA0NDhjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtMTc2IDUxMiAwIDAgMTc2YzAgMzUuMy0yOC43IDY0LTY0IDY0em02NC0yODhMMCAxNjAgMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwxMzguNyAwYzEzLjggMCAyNy4zIDQuNSAzOC40IDEyLjhsMzguNCAyOC44YzUuNSA0LjIgMTIuMyA2LjQgMTkuMiA2LjRMNDQ4IDgwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMTZ6Il0KICAgIH07CiAgICBmYVBlcnNvblRocm91Z2hXaW5kb3cgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLXRocm91Z2gtd2luZG93IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1YTkiLCAiTTY0IDY0bDIyNCAwIDAgOS44YzAgMzktMjMuNyA3NC01OS45IDg4LjQtNjAuNSAyNC4yLTEwMC4xIDgyLjctMTAwLjEgMTQ3LjlsMCA3My44LTY0IDAgMC0zMjB6bTI4OCAwbDIyNCAwIDAgMzIwLTY3LjcgMC0zLjctNC41LTc1LjItOTAuMmMtOS4xLTEwLjktMjIuNi0xNy4zLTM2LjktMTcuM2wtNzEuMSAwLTQxLTYzLjFjLS4zLS41LS42LTEtMS0xLjQgNDQuNy0yOSA3Mi41LTc5IDcyLjUtMTMzLjZsMC05Ljh6bTczIDMyMGwtMjYuNiAwIDQyLjcgNjQgMTUwLjkgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTM1MmMwLTI2LjUtMjEuNS00OC00OC00OEw0OCAwQzIxLjUgMCAwIDIxLjUgMCA0OEwwIDQwMGMwIDI2LjUgMjEuNSA0OCA0OCA0OGwyNjAuMiAwIDMzLjIgNDkuOGM5LjggMTQuNyAyOS43IDE4LjcgNDQuNCA4LjlzMTguNy0yOS43IDguOS00NC40bC04NC4yLTEyNi4yIDc0LjYgMCA0MCA0OHptLTE1OS41IDBsLTczLjUgMCAwLTczLjhjMC0xMC4yIDEuNi0yMC4xIDQuNy0yOS41TDI2NS41IDM4NHpNMTkyIDEyOGE0OCA0OCAwIDEgMCAtOTYgMCA0OCA0OCAwIDEgMCA5NiAweiJdCiAgICB9OwogICAgZmFTY2hvb2xMb2NrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNjaG9vbC1sb2NrIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1NmYiLCAiTTAgMTkyYzAtMzUuMyAyOC43LTY0IDY0LTY0bDY0IDAgMTI3LjktMTE1LjFjMTguMy0xNi40IDQ2LTE2LjQgNjQuMiAwTDQ0OCAxMjggNTEyIDEyOGMzMyAwIDYwLjIgMjUgNjMuNiA1Ny4yLTE0LjctNS45LTMwLjgtOS4yLTQ3LjYtOS4yLTcwLjcgMC0xMjggNTcuMy0xMjggMTI4bDAgMjQuNGMtMTkuNiAxNy42LTMyIDQzLjEtMzIgNzEuNWwwIDk2YzAgNS41IC41IDEwLjkgMS4zIDE2LjFMNjQgNTEyYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDE5MnpNMzMyLjMgMzQxLjVjLTYtMy41LTEyLjktNS41LTIwLjMtNS41bC00OCAwYy0yMi4xIDAtNDAgMTcuOS00MCA0MGwwIDg4IDk2IDAgMC02NC4xYzAtMjAuOCA0LjQtNDAuNSAxMi4zLTU4LjR6TTExMiAzODRjOC44IDAgMTYtNy4yIDE2LTE2bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMHptMTYtMTQ0bDAtMzJjMC04LjgtNy4yLTE2LTE2LTE2bC0zMiAwYy04LjggMC0xNiA3LjItMTYgMTZsMCAzMmMwIDguOCA3LjIgMTYgMTYgMTZsMzIgMGM4LjggMCAxNi03LjIgMTYtMTZ6bTIyNC00OGE2NCA2NCAwIDEgMCAtMTI4IDAgNjQgNjQgMCAxIDAgMTI4IDB6TTU2MCAzNTJsMC00Ny45YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgNDcuOSA2NCAwem0tMTEyIDIuN2wwLTUwLjZjMC00NC4yIDM1LjgtODAgODAtODBzODAgMzUuOCA4MCA4MGwwIDUwLjZjMTguNiA2LjYgMzIgMjQuNCAzMiA0NS4zbDAgOTZjMCAyNi41LTIxLjUgNDgtNDggNDhsLTEyOCAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTk2YzAtMjAuOSAxMy40LTM4LjcgMzItNDUuM3oiXQogICAgfTsKICAgIGZhUGVyc29uQnVyc3QgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLWJ1cnN0IiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU1M2IiLCAiTTIwNCA0MC4xYy0xMy4zIDAtMjQtMTAuNy0yNC0yNGwwLTQ4YzAtMTMuMyAxMC43LTI0IDI0LTI0czI0IDEwLjcgMjQgMjRsMCA0OGMwIDEzLjMtMTAuNyAyNC0yNCAyNHpNNCAxNDQuMWMwLTEzLjMgMTAuNy0yNCAyNC0yNGw0OCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC00OCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHpNOTYuNSAyODUuNWMtOS40IDkuNC0yNC42IDkuNC0zMy45IDBzLTkuNC0yNC42IDAtMzMuOWwzMy45LTMzLjljOS40LTkuNCAyNC42LTkuNCAzMy45IDBzOS40IDI0LjYgMCAzMy45TDk2LjUgMjg1LjV6TTYyLjYgMi43YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwbDMzLjkgMzMuOWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOXMtMjQuNiA5LjQtMzMuOSAwTDYyLjYgMzYuNmMtOS40LTkuNC05LjQtMjQuNiAwLTMzLjl6TTM1Mi40LTMyYTU2IDU2IDAgMSAxIDAgMTEyIDU2IDU2IDAgMSAxIDAtMTEyek00NzguNyAyOTkuMWwtNDYuMy02Mi40IDAgMjc1LjNjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0xNjBjMC04LjgtNy4yLTE2LTE2LTE2cy0xNiA3LjItMTYgMTZsMCAxNjBjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC0yNzUuMy00Ni4zIDYyLjRjLTEwLjUgMTQuMi0zMC42IDE3LjItNDQuOCA2LjZzLTE3LjItMzAuNi02LjYtNDQuOGw3MC41LTk1YzI1LjItMzMuOSA2NS01My45IDEwNy4yLTUzLjlzODIgMjAgMTA3LjIgNTMuOWw3MC41IDk1YzEwLjUgMTQuMiA3LjYgMzQuMi02LjYgNDQuOHMtMzQuMiA3LjYtNDQuOC02LjZ6Il0KICAgIH07CiAgICBmYUxlZnRMb25nID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxlZnQtbG9uZyIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJsb25nLWFycm93LWFsdC1sZWZ0Il0sICJmMzBhIiwgIk05LjQgMjc4LjZjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zbDEyOC0xMjhjOS4yLTkuMiAyMi45LTExLjkgMzQuOS02LjlTMTkyIDExNS4xIDE5MiAxMjhsMCA2NCAzMzYgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDMyYzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC0zMzYgMCAwIDY0YzAgMTIuOS03LjggMjQuNi0xOS44IDI5LjZzLTI1LjcgMi4yLTM0LjktNi45bC0xMjgtMTI4eiJdCiAgICB9OwogICAgZmFMb25nQXJyb3dBbHRMZWZ0ID0gZmFMZWZ0TG9uZzsKICAgIGZhTG9jYXRpb25Dcm9zc2hhaXJzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxvY2F0aW9uLWNyb3NzaGFpcnMiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsibG9jYXRpb24iXSwgImY2MDEiLCAiTTI4OC0xNmMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDE4LjNjOTguMSAxNCAxNzUuNyA5MS42IDE4OS43IDE4OS43bDE4LjMgMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMTguMyAwYy0xNCA5OC4xLTkxLjYgMTc1LjctMTg5LjcgMTg5LjdsMCAxOC4zYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTguM0MxNTcuOSA0NjMuNyA4MC4zIDM4Ni4xIDY2LjMgMjg4TDQ4IDI4OGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxOC4zIDBDODAuMyAxMjUuOSAxNTcuOSA0OC4zIDI1NiAzNC4zTDI1NiAxNmMwLTE3LjcgMTQuMy0zMiAzMi0zMnpNMTI4IDI1NmExNjAgMTYwIDAgMSAwIDMyMCAwIDE2MCAxNjAgMCAxIDAgLTMyMCAwem0xNjAtOTZhOTYgOTYgMCAxIDEgMCAxOTIgOTYgOTYgMCAxIDEgMC0xOTJ6Il0KICAgIH07CiAgICBmYUxvY2F0aW9uID0gZmFMb2NhdGlvbkNyb3NzaGFpcnM7CiAgICBmYVBlcnNvbkRvdHNGcm9tTGluZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwZXJzb24tZG90cy1mcm9tLWxpbmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiZGlhZ25vc2VzIl0sICJmNDcwIiwgIk0xODQgNzJhNzIgNzIgMCAxIDEgMTQ0IDAgNzIgNzIgMCAxIDEgLTE0NCAwek0xNjAgMjk5LjNjLTE5LjkgMjIuNi0zMiA1Mi4yLTMyIDg0LjdsMCAzMi02NCAwIDAtMzJjMC0xMDYgODYtMTkyIDE5Mi0xOTJzMTkyIDg2IDE5MiAxOTJsMCAzMi02NCAwIDAtMzJjMC0zMi41LTEyLjEtNjIuMS0zMi04NC43bDAgMTE2LjctMTkyIDAgMC0xMTYuN3pNMjMyIDM4NGEyNCAyNCAwIDEgMCAwLTQ4IDI0IDI0IDAgMSAwIDAgNDh6bTg4LTEwNGEyNCAyNCAwIDEgMCAtNDggMCAyNCAyNCAwIDEgMCA0OCAwek0yNCA0NjRsNDY0IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRMMjQgNTEyYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0ek02NCAxODRhMjQgMjQgMCAxIDEgNDggMCAyNCAyNCAwIDEgMSAtNDggMHptNDI0IDcyYTI0IDI0IDAgMSAxIDAgNDggMjQgMjQgMCAxIDEgMC00OHoiXQogICAgfTsKICAgIGZhRGlhZ25vc2VzID0gZmFQZXJzb25Eb3RzRnJvbUxpbmU7CiAgICBmYUdhdWdlU2ltcGxlSGlnaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnYXVnZS1zaW1wbGUtaGlnaCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzYxNjY4LCAidGFjaG9tZXRlciIsICJ0YWNob21ldGVyLWZhc3QiXSwgImY2MmEiLCAiTTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6bTMyMCA5NmMwLTE2LjItNi0zMS4xLTE2LTQyLjNsNjkuNS0xMzguOWM1LjktMTEuOSAxLjEtMjYuMy0xMC43LTMyLjJzLTI2LjMtMS4xLTMyLjIgMTAuN0wyNjEuMSAyODguMmMtMS43LS4xLTMuNC0uMi01LjEtLjItMzUuMyAwLTY0IDI4LjctNjQgNjRzMjguNyA2NCA2NCA2NCA2NC0yOC43IDY0LTY0eiJdCiAgICB9OwogICAgZmFUYWNob21ldGVyID0gZmFHYXVnZVNpbXBsZUhpZ2g7CiAgICBmYVRhY2hvbWV0ZXJGYXN0ID0gZmFHYXVnZVNpbXBsZUhpZ2g7CiAgICBmYUFuZ2xlc0xlZnQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYW5nbGVzLWxlZnQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxNzEsICJhbmdsZS1kb3VibGUtbGVmdCJdLCAiZjEwMCIsICJNOS40IDIzMy40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM2wxNjAgMTYwYzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNMNzcuMyAyNTYgMjE0LjYgMTE4LjZjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBsLTE2MCAxNjB6bTM1Mi0xNjBsLTE2MCAxNjBjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zbDE2MCAxNjBjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDBzMTIuNS0zMi44IDAtNDUuM0wyNjkuMyAyNTYgNDA2LjYgMTE4LjZjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDB6Il0KICAgIH07CiAgICBmYUFuZ2xlRG91YmxlTGVmdCA9IGZhQW5nbGVzTGVmdDsKICAgIGZhVXBEb3duID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInVwLWRvd24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFs4NTk3LCAxMTAyMSwgImFycm93cy1hbHQtdiJdLCAiZjMzOCIsICJNNDA2LjYgNTAyLjZsOTYtOTZjOS4yLTkuMiAxMS45LTIyLjkgNi45LTM0LjlTNDkyLjkgMzUyIDQ4MCAzNTJsLTY0IDAgMC0zMjBjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCAzMjAtNjQgMGMtMTIuOSAwLTI0LjYgNy44LTI5LjYgMTkuOHMtMi4yIDI1LjcgNi45IDM0LjlsOTYgOTZjMTIuNSAxMi41IDMyLjggMTIuNSA0NS4zIDB6TTE1MC42IDkuNGMtMTIuNS0xMi41LTMyLjgtMTIuNS00NS4zIDBsLTk2IDk2Yy05LjIgOS4yLTExLjkgMjIuOS02LjkgMzQuOVMxOS4xIDE2MCAzMiAxNjBsNjQgMCAwIDMyMGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzIwIDY0IDBjMTIuOSAwIDI0LjYtNy44IDI5LjYtMTkuOHMyLjItMjUuNy02LjktMzQuOWwtOTYtOTZ6Il0KICAgIH07CiAgICBmYUFycm93c0FsdFYgPSBmYVVwRG93bjsKICAgIGZhQmF0dGVyeUVtcHR5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhdHRlcnktZW1wdHkiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsiYmF0dGVyeS0wIl0sICJmMjQ0IiwgIk0xMTIgMTYwYy04LjggMC0xNiA3LjItMTYgMTZsMCAyMjRjMCA4LjggNy4yIDE2IDE2IDE2bDQxNiAwYzguOCAwIDE2LTcuMiAxNi0xNmwwLTIyNGMwLTguOC03LjItMTYtMTYtMTZsLTQxNiAwek0zMiAxNzZjMC00NC4yIDM1LjgtODAgODAtODBsNDE2IDBjNDQuMiAwIDgwIDM1LjggODAgODBsMCA0OGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDY0YzAgMTcuNy0xNC4zIDMyLTMyIDMybDAgNDhjMCA0NC4yLTM1LjggODAtODAgODBsLTQxNiAwYy00NC4yIDAtODAtMzUuOC04MC04MGwwLTIyNHoiXQogICAgfTsKICAgIGZhQmF0dGVyeTAgPSBmYUJhdHRlcnlFbXB0eTsKICAgIGZhS2V5Ym9hcmQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImtleWJvYXJkIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbOWUzXSwgImYxMWMiLCAiTTY0IDY0QzI4LjcgNjQgMCA5Mi43IDAgMTI4TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDQ0OCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDY0em0xNiA2NGwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2ek02NCAyNDBjMC04LjggNy4yLTE2IDE2LTE2bDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMnpNMTc2IDEyOGwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJjMC04LjggNy4yLTE2IDE2LTE2ek0xNjAgMjQwYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJ6bTE2IDgwbDIyNCAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMjI0IDBjLTguOCAwLTE2LTcuMi0xNi0xNmwwLTMyYzAtOC44IDcuMi0xNiAxNi0xNnptODAtMTc2YzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJ6bTE2IDgwbDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZ6bTgwLTgwYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJ6bTE2IDgwbDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZ6bTgwLTgwYzAtOC44IDcuMi0xNiAxNi0xNmwzMiAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDMyYzAgOC44LTcuMiAxNi0xNiAxNmwtMzIgMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMzJ6bTE2IDgwbDMyIDBjOC44IDAgMTYgNy4yIDE2IDE2bDAgMzJjMCA4LjgtNy4yIDE2LTE2IDE2bC0zMiAwYy04LjggMC0xNi03LjItMTYtMTZsMC0zMmMwLTguOCA3LjItMTYgMTYtMTZ6Il0KICAgIH07CiAgICBmYUNvb2tpZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjb29raWUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjc4NTBdLCAiZjU2MyIsICJNMjQ3LjIgMTdjLTIyLjEtMy4xLTQ0LjYgLjktNjQuNCAxMS40bC03NCAzOS41Qzg5LjEgNzguNCA3My4yIDk0LjkgNjMuNCAxMTVMMjYuNyAxOTAuNmMtOS44IDIwLjEtMTMgNDIuOS05LjEgNjQuOWwxNC41IDgyLjhjMy45IDIyLjEgMTQuNiA0Mi4zIDMwLjcgNTcuOWw2MC4zIDU4LjRjMTYuMSAxNS42IDM2LjYgMjUuNiA1OC43IDI4LjdsODMgMTEuN2MyMi4xIDMuMSA0NC42LS45IDY0LjQtMTEuNGw3NC0zOS41YzE5LjctMTAuNSAzNS42LTI3IDQ1LjQtNDcuMmwzNi43LTc1LjVjOS44LTIwLjEgMTMtNDIuOSA5LjEtNjQuOWwtMTQuNi04Mi44Yy0zLjktMjIuMS0xNC42LTQyLjMtMzAuNy01Ny45TDM4OC45IDU3LjVjLTE2LjEtMTUuNi0zNi42LTI1LjYtNTguNy0yOC43TDI0Ny4yIDE3ek0yMDggMTQ0YTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHpNMTQ0IDMzNmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAwem0yMjQtNjRhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0eiJdCiAgICB9OwogICAgZmFTdG9wd2F0Y2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3RvcHdhdGNoIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbOTIwMV0sICJmMmYyIiwgIk0xNjguNSAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDMyIDAgMCAyNS4zYy0xMDggMTEuOS0xOTIgMTAzLjUtMTkyIDIxNC43IDAgMTE5LjMgOTYuNyAyMTYgMjE2IDIxNnMyMTYtOTYuNyAyMTYtMjE2YzAtMzkuOC0xMC44LTc3LjEtMjkuNi0xMDkuMmwyOC4yLTI4LjJjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBsLTIzLjQgMjMuNGMtMzIuOS0zMC4yLTc1LjItNTAuMy0xMjItNTUuNWwwLTI1LjMgMzIgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTEyIDB6bTgwIDE4NGwwIDEwNGMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTEwNGMwLTEzLjMgMTAuNy0yNCAyNC0yNHMyNCAxMC43IDI0IDI0eiJdCiAgICB9OwogICAgZmFFamVjdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJlamVjdCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzkxNjddLCAiZjA1MiIsICJNMjI0IDMyYzEzLjUgMCAyNi4zIDUuNiAzNS40IDE1LjZsMTc2IDE5MmMxMi45IDE0IDE2LjIgMzQuMyA4LjYgNTEuOFM0MTkgMzIwIDQwMCAzMjBMNDggMzIwYy0xOSAwLTM2LjMtMTEuMi00My45LTI4LjdzLTQuMy0zNy43IDguNi01MS44bDE3Ni0xOTJDMTk3LjcgMzcuNiAyMTAuNSAzMiAyMjQgMzJ6TTAgNDMyYzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDM1MiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4cy0yMS41IDQ4LTQ4IDQ4TDQ4IDQ4MGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDh6Il0KICAgIH07CiAgICBmYVNhdGVsbGl0ZURpc2ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2F0ZWxsaXRlLWRpc2giLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgyMjVdLCAiZjdjMCIsICJNMjMyIDBjMTU0LjYgMCAyODAgMTI1LjQgMjgwIDI4MCAwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGMwLTEyOC4xLTEwMy45LTIzMi0yMzItMjMyLTEzLjMgMC0yNC0xMC43LTI0LTI0UzIxOC43IDAgMjMyIDB6TTIwOCAxMjBjMC0xMy4zIDEwLjctMjQgMjQtMjQgMTAxLjYgMCAxODQgODIuNCAxODQgMTg0IDAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0YzAtNzUuMS02MC45LTEzNi0xMzYtMTM2LTEzLjMgMC0yNC0xMC43LTI0LTI0ek0yNi40IDE0Mi43YzguOC0xNy45IDMyLjQtMTkuOSA0Ni41LTUuOGwxMjguNSAxMjguNSAzMi0zMmMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zbC0zMiAzMiAxMjguNSAxMjguNWMxNC4xIDE0LjEgMTIgMzcuNi01LjggNDYuNS0zNC4yIDE2LjktNzIuNiAyNi40LTExMy4zIDI2LjQtMTQxLjQgMC0yNTYtMTE0LjYtMjU2LTI1NiAwLTQwLjcgOS41LTc5LjIgMjYuNC0xMTMuM3oiXQogICAgfTsKICAgIGZhRmFjZVJvbGxpbmdFeWVzMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmYWNlLXJvbGxpbmctZXllcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU4MCwgIm1laC1yb2xsaW5nLWV5ZXMiXSwgImY1YTUiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek0xOTIgMzUybDEyOCAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xMjggMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHptMzItMTI4YzAgMzUuMy0yOC43IDY0LTY0IDY0cy02NC0yOC43LTY0LTY0YzAtMjYgMTUuNS00OC40IDM3LjgtNTguNC0zLjcgNS4yLTUuOCAxMS42LTUuOCAxOC40IDAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJjMC02LjktMi4yLTEzLjItNS44LTE4LjQgMjIuMyAxMCAzNy44IDMyLjQgMzcuOCA1OC40em0xMjggNjRjLTM1LjMgMC02NC0yOC43LTY0LTY0IDAtMjYgMTUuNS00OC40IDM3LjgtNTguNC0zLjcgNS4yLTUuOCAxMS42LTUuOCAxOC40IDAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJjMC02LjktMi4yLTEzLjItNS44LTE4LjQgMjIuMyAxMCAzNy44IDMyLjQgMzcuOCA1OC40IDAgMzUuMy0yOC43IDY0LTY0IDY0eiJdCiAgICB9OwogICAgZmFNZWhSb2xsaW5nRXllczIgPSBmYUZhY2VSb2xsaW5nRXllczI7CiAgICBmYUxpc3RDaGVjayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJsaXN0LWNoZWNrIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInRhc2tzIl0sICJmMGFlIiwgIk0xMzMuOCAzNi4zYzEwLjkgNy42IDEzLjUgMjIuNiA1LjkgMzMuNGwtNTYgODBjLTQuMSA1LjgtMTAuNSA5LjUtMTcuNiAxMC4xUzUyIDE1OCA0NyAxNTNMNyAxMTNDLTIuMyAxMDMuNi0yLjMgODguNCA3IDc5UzMxLjYgNjkuNyA0MSA3OWwxOS44IDE5LjggMzkuNi01Ni42YzcuNi0xMC45IDIyLjYtMTMuNSAzMy40LTUuOXptMCAxNjBjMTAuOSA3LjYgMTMuNSAyMi42IDUuOSAzMy40bC01NiA4MGMtNC4xIDUuOC0xMC41IDkuNS0xNy42IDEwLjFTNTIgMzE4IDQ3IDMxM0w3IDI3M2MtOS40LTkuNC05LjQtMjQuNiAwLTMzLjlzMjQuNi05LjQgMzMuOSAwbDE5LjggMTkuOCAzOS42LTU2LjZjNy42LTEwLjkgMjIuNi0xMy41IDMzLjQtNS45ek0yMjQgOTZjMC0xNy43IDE0LjMtMzIgMzItMzJsMjI0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTIyNCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnptMCAxNjBjMC0xNy43IDE0LjMtMzIgMzItMzJsMjI0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTIyNCAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnpNMTYwIDQxNmMwLTE3LjcgMTQuMy0zMiAzMi0zMmwyODggMGMxNy43IDAgMzIgMTQuMyAzMiAzMnMtMTQuMyAzMi0zMiAzMmwtMjg4IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyek02NCAzNzZhNDAgNDAgMCAxIDEgMCA4MCA0MCA0MCAwIDEgMSAwLTgweiJdCiAgICB9OwogICAgZmFUYXNrcyA9IGZhTGlzdENoZWNrOwogICAgZmFTYWNrWG1hcmsgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2Fjay14bWFyayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTZhIiwgIk0zMjggMTEybC0xNDQgMC0zNy4zLTc0LjVjLTEuOC0zLjYtMi43LTcuNi0yLjctMTEuNiAwLTE0LjMgMTEuNi0yNS45IDI1LjktMjUuOUwzNDIuMSAwYzE0LjMgMCAyNS45IDExLjYgMjUuOSAyNS45IDAgNC0uOSA4LTIuNyAxMS42TDMyOCAxMTJ6TTE2OS42IDE2MGwxNzIuOCAwIDQ4LjcgNDAuNkM0NTcuNiAyNTYgNDk2IDMzOCA0OTYgNDI0LjUgNDk2IDQ3Mi44IDQ1Ni44IDUxMiA0MDguNSA1MTJsLTMwNS4xIDBDNTUuMiA1MTIgMTYgNDcyLjggMTYgNDI0LjUgMTYgMzM4IDU0LjQgMjU2IDEyMC45IDIwMC42TDE2OS42IDE2MHpNMzIzLjkgMjg0LjFjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwbC0zMy45IDMzLjktMzMuOS0zMy45Yy05LjQtOS40LTI0LjYtOS40LTMzLjkgMHMtOS40IDI0LjYgMCAzMy45bDMzLjkgMzMuOS0zMy45IDMzLjljLTkuNCA5LjQtOS40IDI0LjYgMCAzMy45czI0LjYgOS40IDMzLjkgMGwzMy45LTMzLjkgMzMuOSAzMy45YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtMzMuOS0zMy45IDMzLjktMzMuOWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXoiXQogICAgfTsKICAgIGZhSGFzaHRhZyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYXNodGFnIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNjIwOThdLCAiMjMiLCAiTTIxNC43IC43YzE3LjMgMy43IDI4LjMgMjAuNyAyNC42IDM4bC0xOS4xIDg5LjMgMTI2LjUgMCAyMi0xMDIuN0MzNzIuNCA4IDM4OS40LTMgNDA2LjcgLjdzMjguMyAyMC43IDI0LjYgMzhMNDEyLjIgMTI4IDQ4MCAxMjhjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTgxLjYgMC0yNy40IDEyOCA2Ny44IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTgxLjYgMC0yMiAxMDIuN2MtMy43IDE3LjMtMjAuNyAyOC4zLTM4IDI0LjZzLTI4LjMtMjAuNy0yNC42LTM4bDE5LjEtODkuMy0xMjYuNSAwLTIyIDEwMi43Yy0zLjcgMTcuMy0yMC43IDI4LjMtMzggMjQuNnMtMjguMy0yMC43LTI0LjYtMzhMOTkuOCAzODQgMzIgMzg0Yy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDgxLjYgMCAyNy40LTEyOC02Ny44IDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMyczE0LjMtMzIgMzItMzJsODEuNiAwIDIyLTEwMi43QzE4MC40IDggMTk3LjQtMyAyMTQuNyAuN3pNMjA2LjQgMTkybC0yNy40IDEyOCAxMjYuNSAwIDI3LjQtMTI4LTEyNi41IDB6Il0KICAgIH07CiAgICBmYVRyYWluID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRyYWluIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbMTI4NjQ2XSwgImYyMzgiLCAiTTAgOTZDMCA0MyA0MyAwIDk2IDBMMjg4IDBjNTMgMCA5NiA0MyA5NiA5NmwwIDI1NmMwIDQwLjEtMjQuNiA3NC41LTU5LjUgODguOGw1My45IDYzLjdjOC42IDEwLjEgNy4zIDI1LjMtMi44IDMzLjhzLTI1LjMgNy4zLTMzLjgtMi44bC03NC04Ny41LTE1MS4zIDAtNzQgODcuNWMtOC42IDEwLjEtMjMuNyAxMS40LTMzLjggMi44cy0xMS40LTIzLjctMi44LTMzLjhsNTMuOS02My43QzI0LjYgNDI2LjUgMCAzOTIuMSAwIDM1MkwwIDk2em02NCAzMmwwIDk2YzAgMTcuNyAxNC4zIDMyIDMyIDMybDE5MiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtOTZjMC0xNy43LTE0LjMtMzItMzItMzJMOTYgOTZjLTE3LjcgMC0zMiAxNC4zLTMyIDMyek0xOTIgMzg0YTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHoiXQogICAgfTsKICAgIGZhR2FtZXBhZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJnYW1lcGFkIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImYxMWIiLCAiTTQ0OCA2NGMxMDYgMCAxOTIgODYgMTkyIDE5MlM1NTQgNDQ4IDQ0OCA0NDhsLTI1NiAwQzg2IDQ0OCAwIDM2MiAwIDI1NlM4NiA2NCAxOTIgNjRsMjU2IDB6TTE5MiAxNzZjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMzItMzIgMGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwzMiAwIDAgMzJjMCAxMy4zIDEwLjcgMjQgMjQgMjRzMjQtMTAuNyAyNC0yNGwwLTMyIDMyIDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTMyIDAgMC0zMmMwLTEzLjMtMTAuNy0yNC0yNC0yNHptMjQwIDk2YTMyIDMyIDAgMSAwIDAgNjQgMzIgMzIgMCAxIDAgMC02NHptNjQtOTZhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDEgMCAwLTY0eiJdCiAgICB9OwogICAgZmFGaWxlRXhwb3J0ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZpbGUtZXhwb3J0IiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbImFycm93LXJpZ2h0LWZyb20tZmlsZSJdLCAiZjU2ZSIsICJNOTYuNSAwYy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDM4NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwyNTYgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTk2IDc4LjEgMC0zMSAzMWMtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlzMjQuNiA5LjQgMzMuOSAwbDcyLTcyYzkuNC05LjQgOS40LTI0LjYgMC0zMy45bC03Mi03MmMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBzLTkuNCAyNC42IDAgMzMuOWwzMSAzMS03OC4xIDAgMC0xMzMuNWMwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0wyOTEuMiAxOC43QzI3OS4yIDYuNyAyNjMgMCAyNDYgMEw5Ni41IDB6TTM1OCAxNzZsLTkzLjUgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRMMjQwLjUgNTguNSAzNTggMTc2ek0yMjQuNSAzMjhjMC0xMy4zIDEwLjctMjQgMjQtMjRsMTA0IDAgMCA0OC0xMDQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjR6Il0KICAgIH07CiAgICBmYUFycm93UmlnaHRGcm9tRmlsZSA9IGZhRmlsZUV4cG9ydDsKICAgIGZhRmFjZUdyaW1hY2UyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZ3JpbWFjZSIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU1NiwgImdyaW1hY2UiXSwgImY1N2YiLCAiTTI1NiA1MTJhMjU2IDI1NiAwIDEgMCAwLTUxMiAyNTYgMjU2IDAgMSAwIDAgNTEyek00MDAgMzUyYzAgMjUuMi0xOS40IDQ1LjgtNDQgNDcuOGwwLTk1LjdjMjQuNiAyIDQ0IDIyLjcgNDQgNDcuOHpNMjc2IDMwNGw0MCAwIDAgOTYtNDAgMCAwLTk2em0tODAgOTZsMC05NiA0MCAwIDAgOTYtNDAgMHptLTQwLTk1LjhsMCA5NS43Yy0yNC42LTItNDQtMjIuNy00NC00Ny44czE5LjQtNDUuOCA0NC00Ny44ek0xNDQgMjA4YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTE5Mi0zMmEzMiAzMiAwIDEgMSAwIDY0IDMyIDMyIDAgMSAxIDAtNjR6Il0KICAgIH07CiAgICBmYUdyaW1hY2UyID0gZmFGYWNlR3JpbWFjZTI7CiAgICBmYVRyYWluU3Vid2F5ID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRyYWluLXN1YndheSIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJzdWJ3YXkiXSwgImYyMzkiLCAiTTAgOTZDMCA0MyA0MyAwIDk2IDBMMjg4IDBjNTMgMCA5NiA0MyA5NiA5NmwwIDI1NmMwIDQwLjEtMjQuNiA3NC41LTU5LjUgODguOGw1My45IDYzLjdjOC42IDEwLjEgNy4zIDI1LjMtMi44IDMzLjhzLTI1LjMgNy4zLTMzLjgtMi44bC03NC04Ny41LTE1MS4zIDAtNzQgODcuNWMtOC42IDEwLjEtMjMuNyAxMS40LTMzLjggMi44cy0xMS40LTIzLjctMi44LTMzLjhsNTMuOS02My43QzI0LjYgNDI2LjUgMCAzOTIuMSAwIDM1MkwwIDk2em02NCAzMmwwIDk2YzAgMTcuNyAxNC4zIDMyIDMyIDMybDcyIDAgMC0xNjAtNzIgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6TTIxNiAyNTZsNzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTk2YzAtMTcuNy0xNC4zLTMyLTMyLTMybC03MiAwIDAgMTYwek05NiAzODRhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0em0yMjQtMzJhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHoiXQogICAgfTsKICAgIGZhU3Vid2F5ID0gZmFUcmFpblN1YndheTsKICAgIGZhQ2lyY2xlRG90MiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtZG90IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4MjgwLCAiZG90LWNpcmNsZSJdLCAiZjE5MiIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6bTAtMzUyYTk2IDk2IDAgMSAxIDAgMTkyIDk2IDk2IDAgMSAxIDAtMTkyeiJdCiAgICB9OwogICAgZmFEb3RDaXJjbGUyID0gZmFDaXJjbGVEb3QyOwogICAgZmFPYmplY3RHcm91cDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAib2JqZWN0LWdyb3VwIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImYyNDciLCAiTTMyIDExOS40QzEyLjkgMTA4LjQgMCA4Ny43IDAgNjQgMCAyOC43IDI4LjcgMCA2NCAwIDg3LjcgMCAxMDguNCAxMi45IDExOS40IDMybDMzNy4xIDBjMTEuMS0xOS4xIDMxLjctMzIgNTUuNC0zMiAzNS4zIDAgNjQgMjguNyA2NCA2NCAwIDIzLjctMTIuOSA0NC40LTMyIDU1LjRsMCAyNzMuMWMxOS4xIDExLjEgMzIgMzEuNyAzMiA1NS40IDAgMzUuMy0yOC43IDY0LTY0IDY0LTIzLjcgMC00NC40LTEyLjktNTUuNC0zMmwtMzM3LjEgMGMtMTEuMSAxOS4xLTMxLjcgMzItNTUuNCAzMi0zNS4zIDAtNjQtMjguNy02NC02NCAwLTIzLjcgMTIuOS00NC40IDMyLTU1LjRsMC0yNzMuMXptNDQ4IDBjLTkuNy01LjYtMTcuOC0xMy43LTIzLjQtMjMuNEwxMTkuNCA5NmMtNS42IDkuNy0xMy43IDE3LjgtMjMuNCAyMy40bDAgMjczLjFjOS43IDUuNiAxNy44IDEzLjcgMjMuNCAyMy40bDMzNy4xIDBjNS42LTkuNyAxMy43LTE3LjggMjMuNC0yMy40bDAtMjczLjF6TTE0NCAxNzZjMC0xNy43IDE0LjMtMzIgMzItMzJsMTEyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMmwtMTEyIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjR6TTI1NiAzMjBsMzIgMGM0NC4yIDAgODAtMzUuOCA4MC04MGwzMiAwYzE3LjcgMCAzMiAxNC4zIDMyIDMybDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJsLTExMiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTE2eiJdCiAgICB9OwogICAgZmFTaGlwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNoaXAiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFsxMjg2NzRdLCAiZjIxYSIsICJNMjcyIDBjLTI2LjUgMC00OCAyMS41LTQ4IDQ4bDAgMTYtMTYgMGMtNDQuMiAwLTgwIDM1LjgtODAgODBsMCAxMDguOC0yMS42IDguNmMtMTQuOCA1LjktMjIuNSAyMi40LTE3LjQgMzcuNSAxMC40IDMxLjMgMjYuOCA1OS4zIDQ3LjcgODMuMSAyMC4xLTkuMiA0MS43LTEzLjkgNjMuMy0xNCAzMy4xLS4yIDY2LjMgMTAuMiA5NC40IDMxLjRsMS42IDEuMiAwLTIxNS0xMDQgNDEuNiAwLTgzLjJjMC04LjggNy4yLTE2IDE2LTE2bDIyNCAwYzguOCAwIDE2IDcuMiAxNiAxNmwwIDgzLjItMTA0LTQxLjYgMCAyMTUgMS42LTEuMmMyNy41LTIwLjcgNTkuOS0zMS4yIDkyLjQtMzEuNCAyMi4zLS4xIDQ0LjYgNC41IDY1LjMgMTQgMjAuOS0yMy43IDM3LjMtNTEuOCA0Ny43LTgzLjEgNS0xNS4yLTIuNi0zMS42LTE3LjQtMzcuNUw1MTIgMjUyLjggNTEyIDE0NGMwLTQ0LjItMzUuOC04MC04MC04MGwtMTYgMCAwLTE2YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4TDI3MiAwek00MDMuNCA0NzYuMWMyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAxOSAxNC40IDQxLjkgMjguMiA2Ny4yIDMzLjMgMjYuNSA1LjQgNTQuMyAuOCA4MC43LTE5LjEgMTAuNi04IDEyLjctMjMgNC43LTMzLjZzLTIzLTEyLjctMzMuNi00LjdjLTE0LjkgMTEuMi0yOC42IDEzLjEtNDIuMyAxMC4zLTE0LjktMy0zMC45LTExLjktNDcuOC0yNC42LTM4LjQtMjktOTAuNS0yOS0xMjkgMC0yNCAxOC4xLTQwLjcgMjYuMy01NC41IDI2LjNzLTMwLjUtOC4yLTU0LjUtMjYuM2MtMzguNC0yOS05MC41LTI5LTEyOSAwLTIxLjYgMTYuMy00MS4zIDI1LjgtNTguOSAyNS43LTkuNi0uMS0xOS45LTMtMzEuMi0xMS41LTEwLjYtOC0yNS42LTUuOS0zMy42IDQuN1M3IDQ4Mi4zIDE3LjYgNDkwLjNjMTkuMSAxNC40IDM5LjQgMjEgNTkuOCAyMS4xIDMzLjkgLjIgNjQuMy0xNy40IDg4LjEtMzUuMyAyMS4zLTE2LjEgNDkuOS0xNi4xIDcxLjIgMCAyNC4yIDE4LjMgNTIuMyAzNS45IDgzLjQgMzUuOXM1OS4xLTE3LjcgODMuNC0zNS45eiJdCiAgICB9OwogICAgZmFDID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImMiLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFs5OV0sICI0MyIsICJNMzI5LjEgMTQyLjljLTYyLjUtNjIuNS0xNTUuOC02Mi41LTIxOC4zIDBzLTYyLjUgMTYzLjggMCAyMjYuMyAxNTUuOCA2Mi41IDIxOC4zIDBjMTIuNS0xMi41IDMyLjgtMTIuNSA0NS4zIDBzMTIuNSAzMi44IDAgNDUuM2MtODcuNSA4Ny41LTIyMS4zIDg3LjUtMzA4LjggMHMtODcuNS0yMjkuMyAwLTMxNi44IDIyMS4zLTg3LjUgMzA4LjggMGMxMi41IDEyLjUgMTIuNSAzMi44IDAgNDUuM3MtMzIuOCAxMi41LTQ1LjMgMHoiXQogICAgfTsKICAgIGZhU3F1YXJlUGhvbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3F1YXJlLXBob25lIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInBob25lLXNxdWFyZSJdLCAiZjA5OCIsICJNNjQgMzJDMjguNyAzMiAwIDYwLjcgMCA5NkwwIDQxNmMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTMyMGMwLTM1LjMtMjguNy02NC02NC02NEw2NCAzMnptODggOTYuN2M5LjgtMi43IDIwLjEgMi40IDI0IDExLjhsMjAuMyA0OC43YzMuNCA4LjMgMS4xIDE3LjgtNS45IDIzLjVsLTIyLjEgMThjMTYuMiAzNS44IDQ0LjUgNjUgNzkuNiA4Mi40bDE5LjMtMjMuNmM1LjctNi45IDE1LjItOS4zIDIzLjUtNS45bDQ4LjcgMjAuM2M5LjQgMy45IDE0LjQgMTQuMiAxMS44IDI0bC0uOCAyLjhjLTguOCAzMi4zLTQwLjEgNTkuOS03OC4yIDUxLjgtODcuNS0xOC41LTE1Ni4zLTg3LjQtMTc0LjktMTc0LjktOC4xLTM4LjEgMTkuNS02OS40IDUxLjgtNzguMmwyLjgtLjh6Il0KICAgIH07CiAgICBmYVBob25lU3F1YXJlID0gZmFTcXVhcmVQaG9uZTsKICAgIGZhUnVsZXJDb21iaW5lZCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJydWxlci1jb21iaW5lZCIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgW10sICJmNTQ2IiwgIk0xIDQ0MS43QzUuNSA0NjMuNSAyNC44IDQ4MCA0OCA0ODBsMzUyIDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC05NmMwLTI2LjUtMjEuNS00OC00OC00OGwtNDggMCAwIDcyYzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNzItNjQgMCAwIDcyYzAgMTMuMy0xMC43IDI0LTI0IDI0cy0yNC0xMC43LTI0LTI0bDAtNzItNzIgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGw3MiAwIDAtNjQtNzIgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGw3MiAwIDAtNDhjMC0yNi41LTIxLjUtNDgtNDgtNDhMNDggMzJDMjEuNSAzMiAwIDUzLjUgMCA4MEwwIDQzMmMwIDMuMyAuMyA2LjYgMSA5Ljd6Il0KICAgIH07CiAgICBmYUFycm93c1JvdGF0ZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvd3Mtcm90YXRlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NDcyLCAicmVmcmVzaCIsICJzeW5jIl0sICJmMDIxIiwgIk02NS45IDIyOC41YzEzLjMtOTMgOTMuNC0xNjQuNSAxOTAuMS0xNjQuNSA1MyAwIDEwMSAyMS41IDEzNS44IDU2LjIgLjIgLjIgLjQgLjQgLjYgLjZsNy42IDcuMi00Ny45IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMTI4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJsMC0xMjhjMC0xNy43LTE0LjMtMzItMzItMzJzLTMyIDE0LjMtMzIgMzJsMCA1My40LTExLjMtMTAuN0MzOTAuNSAyOC42IDMyNi41IDAgMjU2IDAgMTI3IDAgMjAuMyA5NS40IDIuNiAyMTkuNSAuMSAyMzcgMTIuMiAyNTMuMiAyOS43IDI1NS43czMzLjctOS43IDM2LjItMjcuMXptNDQzLjUgNjRjMi41LTE3LjUtOS43LTMzLjctMjcuMS0zNi4ycy0zMy43IDkuNy0zNi4yIDI3LjFjLTEzLjMgOTMtOTMuNCAxNjQuNS0xOTAuMSAxNjQuNS01MyAwLTEwMS0yMS41LTEzNS44LTU2LjItLjItLjItLjQtLjQtLjYtLjZsLTcuNi03LjIgNDcuOSAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDMyIDMyMGMtOC41IDAtMTYuNyAzLjQtMjIuNyA5LjVTLS4xIDM0My43IDAgMzUyLjNsMSAxMjdjLjEgMTcuNyAxNC42IDMxLjkgMzIuMyAzMS43UzY1LjIgNDk2LjQgNjUgNDc4LjdsLS40LTUxLjUgMTAuNyAxMC4xYzQ2LjMgNDYuMSAxMTAuMiA3NC43IDE4MC43IDc0LjcgMTI5IDAgMjM1LjctOTUuNCAyNTMuNC0yMTkuNXoiXQogICAgfTsKICAgIGZhUmVmcmVzaCA9IGZhQXJyb3dzUm90YXRlOwogICAgZmFTeW5jID0gZmFBcnJvd3NSb3RhdGU7CiAgICBmYVBlcnNvbkRyZXNzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInBlcnNvbi1kcmVzcyIsCiAgICAgIGljb246IFszODQsIDUxMiwgWyJmZW1hbGUiXSwgImYxODIiLCAiTTEzNiAyNGE1NiA1NiAwIDEgMSAxMTIgMCA1NiA1NiAwIDEgMSAtMTEyIDB6TTExMiAzODRsLTI1LjggMGMtMTAuOSAwLTE4LjYtMTAuNy0xNS4yLTIxLjFsNDMtMTI5LTQ4LjMgNjUuMWMtMTAuNSAxNC4yLTMwLjYgMTcuMi00NC44IDYuNnMtMTcuMi0zMC42LTYuNi00NC44bDcwLjUtOTVDMTEwIDEzMiAxNDkuNyAxMTIgMTkyIDExMnM4MiAyMCAxMDcuMiA1My45bDcwLjUgOTVjMTAuNSAxNC4yIDcuNiAzNC4yLTYuNiA0NC44cy0zNC4yIDcuNi00NC44LTYuNkwyNzAgMjM0IDMxMyAzNjIuOWMzLjUgMTAuNC00LjMgMjEuMS0xNS4yIDIxLjFsLTI1LjggMCAwIDEyOGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTEyOC0zMiAwIDAgMTI4YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTI4eiJdCiAgICB9OwogICAgZmFGZW1hbGUgPSBmYVBlcnNvbkRyZXNzOwogICAgZmFCb29rT3BlbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib29rLW9wZW4iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjgyMTQsIDEyODM2Nl0sICJmNTE4IiwgIk0yNTYgMTQxLjNsMCAzMDkuMyAuNS0uMkMzMTEuMSA0MjcuNyAzNjkuNyA0MTYgNDI4LjggNDE2bDE5LjIgMCAwLTMyMC0xOS4yIDBjLTQyLjIgMC04NC4xIDguNC0xMjMuMSAyNC42LTE2LjggNy0zMy40IDEzLjktNDkuNyAyMC43ek0yMzAuOSA2MS41TDI1NiA3MiAyODEuMSA2MS41QzMyNy45IDQyIDM3OC4xIDMyIDQyOC44IDMyTDQ2NCAzMmMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDM1MmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMzUuMiAwYy01MC43IDAtMTAwLjkgMTAtMTQ3LjcgMjkuNWwtMTIuOCA1LjNjLTcuOSAzLjMtMTYuNyAzLjMtMjQuNiAwbC0xMi44LTUuM0MxODQuMSA0OTAgMTMzLjkgNDgwIDgzLjIgNDgwTDQ4IDQ4MGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhMMCA4MEMwIDUzLjUgMjEuNSAzMiA0OCAzMmwzNS4yIDBjNTAuNyAwIDEwMC45IDEwIDE0Ny43IDI5LjV6Il0KICAgIH07CiAgICBmYUZvbGRlclRyZWUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZm9sZGVyLXRyZWUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjgwMiIsICJNNDggMjRDNDggMTAuNyAzNy4zIDAgMjQgMFMwIDEwLjcgMCAyNEwwIDM5MmMwIDMwLjkgMjUuMSA1NiA1NiA1NmwxODQgMCAwLTQ4LTE4NCAwYy00LjQgMC04LTMuNi04LThsMC0yMzIgMTkyIDAgMC00OC0xOTIgMCAwLTg4ek0zMzYgMjI0bDE5MiAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtOTZjMC0yNi41LTIxLjUtNDgtNDgtNDhsLTgyLjcgMGMtOC41IDAtMTYuNi0zLjQtMjIuNi05LjRsLTguNi04LjZjLTktOS0yMS4yLTE0LjEtMzMuOS0xNC4xTDMzNiAwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDEyOGMwIDI2LjUgMjEuNSA0OCA0OCA0OHptMCAyODhsMTkyIDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhsMC05NmMwLTI2LjUtMjEuNS00OC00OC00OGwtODIuNyAwYy04LjUgMC0xNi42LTMuNC0yMi42LTkuNGwtOC42LTguNmMtOS05LTIxLjItMTQuMS0zMy45LTE0LjFMMzM2IDI4OGMtMjYuNSAwLTQ4IDIxLjUtNDggNDhsMCAxMjhjMCAyNi41IDIxLjUgNDggNDggNDh6Il0KICAgIH07CiAgICBmYVZpcmdvID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInZpcmdvIiwKICAgICAgaWNvbjogWzY0MCwgNTEyLCBbXSwgImU4NTAiLCAiTTM2OCAzMmM2MS45IDAgMTEyIDUwLjEgMTEyIDExMmwwIDI2LjhjMTQuNS02LjkgMzAuOC0xMC44IDQ4LTEwLjggNjEuOSAwIDExMiA1MC4xIDExMiAxMTJTNTg5LjkgMzg0IDUyOCAzODRsLTQ4IDAgMCAzMmMwIDE2LjYgMTIuNiAzMC4yIDI4LjcgMzEuOGw2LjYgLjNjMTYuMSAxLjYgMjguNyAxNS4zIDI4LjcgMzEuOCAwIDE3LjctMTQuMyAzMi0zMiAzMi01MyAwLTk2LTQzLTk2LTk2bDAtMzItMTYgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMmwxNiAwIDAtMTc2YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4cy00OCAyMS41LTQ4IDQ4bDAgMzA0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMzA0YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4cy00OCAyMS41LTQ4IDQ4bDAgMzA0YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMzIwYzAtMTYuNi0xMi42LTMwLjItMjguNy0zMS44bC02LjYtLjNDNDQuNiA5NC4yIDMyIDgwLjYgMzIgNjQgMzIgNDYuMyA0Ni4zIDMyIDY0IDMyIDkxIDMyIDExNS4zIDQzLjEgMTMyLjcgNjEgMTUyLjYgNDMgMTc5IDMyIDIwOCAzMiAyMzkuMyAzMiAyNjcuNyA0NC45IDI4OCA2NS43IDMwOC4zIDQ0LjkgMzM2LjYgMzIgMzY4IDMyek01MjggMjI0Yy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDQ4IDQ4IDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhzLTIxLjUtNDgtNDgtNDh6Il0KICAgIH07CiAgICBmYUJveEFyY2hpdmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm94LWFyY2hpdmUiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsiYXJjaGl2ZSJdLCAiZjE4NyIsICJNMCA2NEMwIDQ2LjMgMTQuMyAzMiAzMiAzMmw0NDggMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDMyYzAgMTcuNy0xNC4zIDMyLTMyIDMyTDMyIDEyOEMxNC4zIDEyOCAwIDExMy43IDAgOTZMMCA2NHpNMzIgMTc2bDQ0OCAwIDAgMjQwYzAgMzUuMy0yOC43IDY0LTY0IDY0TDk2IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRsMC0yNDB6bTE1MiA2NGMtMTMuMyAwLTI0IDEwLjctMjQgMjRzMTAuNyAyNCAyNCAyNGwxNDQgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtMTQ0IDB6Il0KICAgIH07CiAgICBmYUFyY2hpdmUgPSBmYUJveEFyY2hpdmU7CiAgICBmYVRlbnRBcnJvd0Rvd25Ub0xpbmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGVudC1hcnJvdy1kb3duLXRvLWxpbmUiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTU3ZSIsICJNMTg1IDEyMWM5LjQtOS40IDkuNC0yNC42IDAtMzMuOXMtMjQuNi05LjQtMzMuOSAwbC0zMSAzMSAwLTEwMi4xQzEyMCAyLjcgMTA5LjMtOCA5Ni04UzcyIDIuNyA3MiAxNmwwIDEwMi4xLTMxLTMxQzMxLjYgNzcuNyAxNi40IDc3LjcgNyA4N1MtMi4zIDExMS42IDcgMTIxbDcyIDcyYzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwbDcyLTcyek0xNTUuOCAyNjAuNkwxMzIuMSA0NDggMzIgNDQ4Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDUxMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMyIDAtMi44LS40LTUuNS0xLThMNTQ4LjIgMjYwLjdjLTEuMi05LjctNi45LTE4LjQtMTUuMy0yMy40TDM2Ny40IDEzNy45Yy0xMC4yLTYuMS0yMi45LTYuMS0zMy4xIC4xTDE3MC45IDIzNy4zYy04LjMgNS4xLTEzLjkgMTMuNy0xNS4xIDIzLjN6TTQ0OCA0NDhsLTk3LjEgMCAwLTE0OS40YzAtNS45IDQuNy0xMC42IDEwLjYtMTAuNiA0IDAgNy43IDIuMyA5LjUgNS45TDQ0OCA0NDh6Il0KICAgIH07CiAgICBmYVFyY29kZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJxcmNvZGUiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjAyOSIsICJNNjQgMTYwbDY0IDAgMC02NC02NCAwIDAgNjR6TTAgODBDMCA1My41IDIxLjUgMzIgNDggMzJsOTYgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDk2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC05NiAwYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDgwek02NCA0MTZsNjQgMCAwLTY0LTY0IDAgMCA2NHpNMCAzMzZjMC0yNi41IDIxLjUtNDggNDgtNDhsOTYgMGMyNi41IDAgNDggMjEuNSA0OCA0OGwwIDk2YzAgMjYuNS0yMS41IDQ4LTQ4IDQ4bC05NiAwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTk2ek0zMjAgOTZsMCA2NCA2NCAwIDAtNjQtNjQgMHpNMzA0IDMybDk2IDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA5NmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtOTYgMGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhsMC05NmMwLTI2LjUgMjEuNS00OCA0OC00OHpNMjg4IDM1MmEzMiAzMiAwIDEgMSAwLTY0IDMyIDMyIDAgMSAxIDAgNjR6bTAgNjRjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzItMzItMTQuMy0zMi0zMiAxNC4zLTMyIDMyLTMyem05NiAzMmMwLTE3LjcgMTQuMy0zMiAzMi0zMnMzMiAxNC4zIDMyIDMyLTE0LjMgMzItMzIgMzItMzItMTQuMy0zMi0zMnptMzItOTZhMzIgMzIgMCAxIDEgMC02NCAzMiAzMiAwIDEgMSAwIDY0em0tMzIgMzJhMzIgMzIgMCAxIDEgLTY0IDAgMzIgMzIgMCAxIDEgNjQgMHoiXQogICAgfTsKICAgIGZhRHJhZ29uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRyYWdvbiIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzEyODAwOV0sICJmNmQ1IiwgIk0zNTIgMTI0LjVsLTUxLjktMTNjLTYuNS0xLjYtMTEuMy03LjEtMTItMTMuOHMyLjgtMTMuMSA4LjctMTYuMWw0MC44LTIwLjQtNDMuMy0zMi41Yy01LjUtNC4xLTcuOC0xMS4zLTUuNi0xNy45UzI5Ny4xIDAgMzA0IDBMNDY0IDBjMzAuMiAwIDU4LjcgMTQuMiA3Ni44IDM4LjRsNTcuNiA3Ni44YzYuMiA4LjMgOS42IDE4LjQgOS42IDI4LjggMCAyNi41LTIxLjUgNDgtNDggNDhsLTIxLjUgMGMtMTcgMC0zMy4zLTYuNy00NS4zLTE4LjdsLTEzLjMtMTMuMy0zMiAwIDAgMjEuNWMwIDI0LjggMTIuOCA0Ny45IDMzLjggNjEuMWwxMDYuNiA2Ni42YzMyLjEgMjAuMSA1MS42IDU1LjIgNTEuNiA5My4xIDAgNjAuNi00OS4xIDEwOS44LTEwOS44IDEwOS44TDMyLjMgNTEyYy0zLjMgMC02LjYtLjQtOS42LTEuNC05LjItMi44LTE2LjctOS42LTIwLjQtMTguNi0xLjMtMy4zLTIuMi02LjktMi4zLTEwLjctLjItMy43IC4zLTcuMyAxLjMtMTAuNyAyLjgtOS4yIDkuNi0xNi43IDE4LjYtMjAuNCAzLTEuMiA2LjItMiA5LjUtMi4yTDQzMy4zIDQxMmM4LjMtLjcgMTQuNy03LjcgMTQuNy0xNi4xIDAtNC4zLTEuNy04LjQtNC43LTExLjRsLTQ0LjQtNDQuNGMtMzAtMzAtNDYuOS03MC43LTQ2LjktMTEzLjFsMC0xMDIuNXpNNTEyIDcyLjNjMC0uMSAwLS4yIDAtLjNzMC0uMiAwLS4zbDAgLjZ6bS0xLjMgNy40TDQ2NC4zIDY4LjFjLS4yIDEuMy0uMyAyLjYtLjMgMy45IDAgMTMuMyAxMC43IDI0IDI0IDI0IDEwLjYgMCAxOS41LTYuOCAyMi43LTE2LjN6TTEzMC45IDExNi41YzE2LjMtMTQuNSA0MC40LTE2LjIgNTguNS00LjFsMTMwLjYgODcgMCAyNy41YzAgMzIuOCA4LjQgNjQuOCAyNCA5M2wtMjMyIDBjLTYuNyAwLTEyLjctNC4yLTE1LTEwLjRzLS41LTEzLjMgNC42LTE3LjdMMTcxIDIzMi4zIDE4LjQgMjU1LjhjLTcgMS4xLTEzLjktMi42LTE2LjktOVMuMSAyMzIuOCA1LjQgMjI4TDEzMC45IDExNi41eiJdCiAgICB9OwogICAgZmFIb3VyZ2xhc3NFbmQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG91cmdsYXNzLWVuZCIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzg5ODcsICJob3VyZ2xhc3MtMyJdLCAiZjI1MyIsICJNMzIgMEMxNC4zIDAgMCAxNC4zIDAgMzJTMTQuMyA2NCAzMiA2NGwwIDExYzAgNDIuNCAxNi45IDgzLjEgNDYuOSAxMTMuMWw2Ny45IDY3LjktNjcuOSA2Ny45QzQ4LjkgMzUzLjkgMzIgMzk0LjYgMzIgNDM3bDAgMTFjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzIwIDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsMC0xMWMwLTQyLjQtMTYuOS04My4xLTQ2LjktMTEzLjFsLTY3LjktNjcuOSA2Ny45LTY3LjljMzAtMzAgNDYuOS03MC43IDQ2LjktMTEzLjFsMC0xMWMxNy43IDAgMzItMTQuMyAzMi0zMlMzNjkuNyAwIDM1MiAwTDMyIDB6TTk2IDc1bDAtMTEgMTkyIDAgMCAxMWMwIDI1LjUtMTAuMSA0OS45LTI4LjEgNjcuOWwtNjcuOSA2Ny45LTY3LjktNjcuOUMxMDYuMSAxMjQuOSA5NiAxMDAuNCA5NiA3NXoiXQogICAgfTsKICAgIGZhSG91cmdsYXNzMzIgPSBmYUhvdXJnbGFzc0VuZDsKICAgIGZhR3JpcCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJncmlwIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbNTgxMTksICJncmlkLWhvcml6b250YWwiLCAiZ3JpcC1ob3Jpem9udGFsIl0sICJmNThkIiwgIk04OCA5NmMyMi4xIDAgNDAgMTcuOSA0MCA0MGwwIDQ4YzAgMjIuMS0xNy45IDQwLTQwIDQwbC00OCAwYy0yMi4xIDAtNDAtMTcuOS00MC00MGwwLTQ4YzAtMjIuMSAxNy45LTQwIDQwLTQwbDQ4IDB6TTI4MCAyMjRsLTQ4IDBjLTIyLjEgMC00MC0xNy45LTQwLTQwbDAtNDhjMC0yMi4xIDE3LjktNDAgNDAtNDBsNDggMGMyMi4xIDAgNDAgMTcuOSA0MCA0MGwwIDQ4YzAgMjIuMS0xNy45IDQwLTQwIDQwem0xOTIgMGwtNDggMGMtMjIuMSAwLTQwLTE3LjktNDAtNDBsMC00OGMwLTIyLjEgMTcuOS00MCA0MC00MGw0OCAwYzIyLjEgMCA0MCAxNy45IDQwIDQwbDAgNDhjMCAyMi4xLTE3LjkgNDAtNDAgNDB6bTAgMTkybC00OCAwYy0yMi4xIDAtNDAtMTcuOS00MC00MGwwLTQ4YzAtMjIuMSAxNy45LTQwIDQwLTQwbDQ4IDBjMjIuMSAwIDQwIDE3LjkgNDAgNDBsMCA0OGMwIDIyLjEtMTcuOSA0MC00MCA0MHpNMjgwIDI4OGMyMi4xIDAgNDAgMTcuOSA0MCA0MGwwIDQ4YzAgMjIuMS0xNy45IDQwLTQwIDQwbC00OCAwYy0yMi4xIDAtNDAtMTcuOS00MC00MGwwLTQ4YzAtMjIuMSAxNy45LTQwIDQwLTQwbDQ4IDB6TTg4IDQxNmwtNDggMGMtMjIuMSAwLTQwLTE3LjktNDAtNDBsMC00OGMwLTIyLjEgMTcuOS00MCA0MC00MGw0OCAwYzIyLjEgMCA0MCAxNy45IDQwIDQwbDAgNDhjMCAyMi4xLTE3LjkgNDAtNDAgNDB6Il0KICAgIH07CiAgICBmYUdyaWRIb3Jpem9udGFsID0gZmFHcmlwOwogICAgZmFHcmlwSG9yaXpvbnRhbCA9IGZhR3JpcDsKICAgIGZhQm9yZGVyVG9wTGVmdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJib3JkZXItdG9wLWxlZnQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsiYm9yZGVyLXN0eWxlIl0sICJmODUzIiwgIk0wIDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMzUyIDM1MiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyTDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZMMCA0NDh6bTEyOCAwYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzItMTQuMy0zMi0zMi0zMi0zMiAxNC4zLTMyIDMyem0xMjggMGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMyLTE0LjMtMzItMzItMzItMzIgMTQuMy0zMiAzMnptMTYwIDMyYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMyLTMyIDE0LjMtMzIgMzIgMTQuMyAzMiAzMiAzMnpNMzg0IDE5MmEzMiAzMiAwIDEgMCA2NCAwIDMyIDMyIDAgMSAwIC02NCAwem0zMiAxNjBhMzIgMzIgMCAxIDAgMC02NCAzMiAzMiAwIDEgMCAwIDY0eiJdCiAgICB9OwogICAgZmFCb3JkZXJTdHlsZSA9IGZhQm9yZGVyVG9wTGVmdDsKICAgIGZhTGlzdFVsID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxpc3QtdWwiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsibGlzdC1kb3RzIl0sICJmMGNhIiwgIk00OCAxNDRhNDggNDggMCAxIDAgMC05NiA0OCA0OCAwIDEgMCAwIDk2ek0xOTIgNjRjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMjg4IDBjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJMMTkyIDY0em0wIDE2MGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwyODggMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMjg4IDB6bTAgMTYwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDI4OCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0yODggMHpNNDggNDY0YTQ4IDQ4IDAgMSAwIDAtOTYgNDggNDggMCAxIDAgMCA5NnpNOTYgMjU2YTQ4IDQ4IDAgMSAwIC05NiAwIDQ4IDQ4IDAgMSAwIDk2IDB6Il0KICAgIH07CiAgICBmYUxpc3REb3RzID0gZmFMaXN0VWw7CiAgICBmYVBlb3BsZVJvYmJlcnkgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVvcGxlLXJvYmJlcnkiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTUzNiIsICJNNDg4LjIgNTkuMUM0NzguMSA5OS42IDQ0MS43IDEyOCA0MDAgMTI4cy03OC4xLTI4LjQtODguMi02OC45TDMwMyAyNC4yQzI5OC44IDcuMSAyODEuNC0zLjMgMjY0LjIgMVMyMzYuNyAyMi42IDI0MSAzOS44bDguNyAzNC45YzExIDQ0IDQwLjIgNzkuNiA3OC4zIDk5LjZMMzI4IDQ4MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMTI4IDE2IDAgMCAxMjhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTMwNS43YzM4LjEtMjAgNjcuMy01NS42IDc4LjMtOTkuNkw1NTkgMzkuOGM0LjMtMTcuMS02LjEtMzQuNS0yMy4zLTM4LjhTNTAxLjIgNy4xIDQ5NyAyNC4ybC04LjcgMzQuOXpNNDAwIDk2YTQ4IDQ4IDAgMSAwIDAtOTYgNDggNDggMCAxIDAgMCA5NnpNODAgOTZhNDggNDggMCAxIDAgMC05NiA0OCA0OCAwIDEgMCAwIDk2em0tOCAzMmMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCA5NiAwIC42IDAgMTkxLjRjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTEyOCAxNiAwIDAgMTI4YzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0yMjcuMyAxMyAyMC41YzUuOSA5LjIgMTYuMSAxNC45IDI3IDE0LjlsNDggMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtMzAuNCAwLTM3LjQtNTguOUMxNTcuNiAxNDIgMTMyLjEgMTI4IDEwNC43IDEyOEw3MiAxMjh6Il0KICAgIH07CiAgICBmYU1vYmlsZUJ1dHRvbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb2JpbGUtYnV0dG9uIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYxMGIiLCAiTTgwIDBDNDQuNyAwIDE2IDI4LjcgMTYgNjRsMCAzODRjMCAzNS4zIDI4LjcgNjQgNjQgNjRsMjI0IDBjMzUuMyAwIDY0LTI4LjcgNjQtNjRsMC0zODRjMC0zNS4zLTI4LjctNjQtNjQtNjRMODAgMHpNMTkyIDQ2NGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMiAzMiAxNC4zIDMyIDMyLTE0LjMgMzItMzIgMzJ6Il0KICAgIH07CiAgICBmYUFycm93RG93bkFaID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LWRvd24tYS16IiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInNvcnQtYWxwaGEtYXNjIiwgInNvcnQtYWxwaGEtZG93biJdLCAiZjE1ZCIsICJNMjMwLjYgMzkwLjZsLTgwIDgwYy0xMi41IDEyLjUtMzIuOCAxMi41LTQ1LjMgMGwtODAtODBjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zczMyLjgtMTIuNSA0NS4zIDBMOTYgMzcwLjcgOTYgNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDMwNi43IDI1LjQtMjUuNGMxMi41LTEyLjUgMzIuOC0xMi41IDQ1LjMgMHMxMi41IDMyLjggMCA0NS4zem0xODItMzQwLjljNTAuNyAxMDEuMyA3Ny4zIDE1NC43IDgwIDE2MCA3LjkgMTUuOCAxLjUgMzUtMTQuMyA0Mi45cy0zNSAxLjUtNDIuOS0xNC4zbC03LjItMTQuMy04OC40IDAtNy4yIDE0LjNjLTcuOSAxNS44LTI3LjEgMjIuMi00Mi45IDE0LjNzLTIyLjItMjcuMS0xNC4zLTQyLjljMi43LTUuMyAyOS4zLTU4LjcgODAtMTYwIDUuNC0xMC44IDE2LjUtMTcuNyAyOC42LTE3LjdzMjMuMiA2LjggMjguNiAxNy43ek0zODQgMTM1LjZsLTIwLjIgNDAuNCA0MC40IDAtMjAuMi00MC40ek0yODggMzIwYzAtMTcuNyAxNC4zLTMyIDMyLTMybDEyOCAwYzEyLjkgMCAyNC42IDcuOCAyOS42IDE5LjhzMi4yIDI1LjctNi45IDM0LjlMMzk3LjMgNDE2IDQ0OCA0MTZjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTEyOCAwYy0xMi45IDAtMjQuNi03LjgtMjkuNi0xOS44cy0yLjItMjUuNyA2LjktMzQuOWw3My40LTczLjQtNTAuNyAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnoiXQogICAgfTsKICAgIGZhU29ydEFscGhhQXNjID0gZmFBcnJvd0Rvd25BWjsKICAgIGZhU29ydEFscGhhRG93biA9IGZhQXJyb3dEb3duQVo7CiAgICBmYU1vbmV5QmlsbCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtb25leS1iaWxsIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImYwZDYiLCAiTTY0IDY0QzI4LjcgNjQgMCA5Mi43IDAgMTI4TDAgMzg0YzAgMzUuMyAyOC43IDY0IDY0IDY0bDM4NCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMjU2YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDY0em0xOTIgOTZhOTYgOTYgMCAxIDEgMCAxOTIgOTYgOTYgMCAxIDEgMC0xOTJ6bTE5MiAyNGMwIDQuNC0zLjYgOC4xLTggNy41LTI5LTMuNi01MS45LTI2LjYtNTUuNS01NS41LS41LTQuNCAzLjEtOCA3LjUtOGw0OCAwYzQuNCAwIDggMy42IDggOGwwIDQ4ek02NCAzMjhjMC00LjQgMy42LTguMSA4LTcuNSAyOSAzLjYgNTEuOSAyNi42IDU1LjUgNTUuNSAuNSA0LjQtMy4xIDgtNy41IDhsLTQ4IDBjLTQuNCAwLTgtMy42LTgtOGwwLTQ4em04LTEzNi41Yy00LjQgLjUtOC0zLjEtOC03LjVsMC00OGMwLTQuNCAzLjYtOCA4LThsNDggMGM0LjQgMCA4LjEgMy42IDcuNSA4LTMuNiAyOS0yNi42IDUxLjktNTUuNSA1NS41em0zNjggMTI5YzQuNC0uNSA4IDMuMSA4IDcuNWwwIDQ4YzAgNC40LTMuNiA4LTggOGwtNDggMGMtNC40IDAtOC4xLTMuNi03LjUtOCAzLjYtMjkgMjYuNi01MS45IDU1LjUtNTUuNXoiXQogICAgfTsKICAgIGZhQ2lyY2xlTWludXMgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2lyY2xlLW1pbnVzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbIm1pbnVzLWNpcmNsZSJdLCAiZjA1NiIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTE2OCAyMzJsMTc2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE3NiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFNaW51c0NpcmNsZSA9IGZhQ2lyY2xlTWludXM7CiAgICBmYUFycm93UG9pbnRlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcnJvdy1wb2ludGVyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbIm1vdXNlLXBvaW50ZXIiXSwgImYyNDUiLCAiTTc3LjMgMi41YzguMS00LjEgMTcuOS0zLjIgMjUuMSAyLjNsMzIwIDIzOS45YzguMyA2LjIgMTEuNiAxNyA4LjQgMjYuOHMtMTIuNCAxNi40LTIyLjggMTYuNGwtMTUyLjMgMCA4OC45IDE3Ny43YzcuOSAxNS44IDEuNSAzNS0xNC4zIDQyLjlzLTM1IDEuNS00Mi45LTE0LjNsLTg4LjktMTc3LjctOTEuMyAxMjEuOGMtNi4yIDguMy0xNyAxMS42LTI2LjggOC40UzY0IDQzNC4zIDY0IDQyNEw2NCAyNGMwLTkuMSA1LjEtMTcuNCAxMy4zLTIxLjV6Il0KICAgIH07CiAgICBmYU1vdXNlUG9pbnRlciA9IGZhQXJyb3dQb2ludGVyOwogICAgZmFTcXVhcmVTaGFyZU5vZGVzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInNxdWFyZS1zaGFyZS1ub2RlcyIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJzaGFyZS1hbHQtc3F1YXJlIl0sICJmMWUxIiwgIk02NCAzMkMyOC43IDMyIDAgNjAuNyAwIDk2TDAgNDE2YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMzIwYzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyek0zNjggMTYwYzAgMzUuMy0yOC43IDY0LTY0IDY0LTE1LjQgMC0yOS41LTUuNC00MC42LTE0LjVsLTg1LjMgNDYuNSA4NS4zIDQ2LjVjMTEtOS4xIDI1LjItMTQuNSA0MC42LTE0LjUgMzUuMyAwIDY0IDI4LjcgNjQgNjRzLTI4LjcgNjQtNjQgNjQtNjQtMjguNy02NC02NGMwLTIuNSAuMS00LjkgLjQtNy4zTDE1OC41IDMwMGMtMTEuNyAxMi4zLTI4LjIgMjAtNDYuNSAyMC0zNS4zIDAtNjQtMjguNy02NC02NHMyOC43LTY0IDY0LTY0YzE4LjMgMCAzNC44IDcuNyA0Ni41IDIwbDgxLjktNDQuN2MtLjMtMi40LS40LTQuOS0uNC03LjMgMC0zNS4zIDI4LjctNjQgNjQtNjRzNjQgMjguNyA2NCA2NHoiXQogICAgfTsKICAgIGZhU2hhcmVBbHRTcXVhcmUgPSBmYVNxdWFyZVNoYXJlTm9kZXM7CiAgICBmYVRhYmxlQ2VsbHNMYXJnZSA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWJsZS1jZWxscy1sYXJnZSIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWyJ0aC1sYXJnZSJdLCAiZjAwOSIsICJNMzg0IDk2bC0xMjggMCAwIDEyOCAxMjggMCAwLTEyOHptNjQgMTI4bDAgMTkyYzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA5NkMwIDYwLjcgMjguNyAzMiA2NCAzMmwzMjAgMGMzNS4zIDAgNjQgMjguNyA2NCA2NGwwIDEyOHpNNjQgMjg4bDAgMTI4IDEyOCAwIDAtMTI4LTEyOCAwem0xMjgtNjRsMC0xMjgtMTI4IDAgMCAxMjggMTI4IDB6bTY0IDY0bDAgMTI4IDEyOCAwIDAtMTI4LTEyOCAweiJdCiAgICB9OwogICAgZmFUaExhcmdlID0gZmFUYWJsZUNlbGxzTGFyZ2U7CiAgICBmYUNhdCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYXQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFsxMjgwMDhdLCAiZjZiZSIsICJNNjQgOTZjNTMgMCA5NiA0MyA5NiA5NmwwIDg1LjhjMjkuNy00NC43IDc3LjgtNzYuMiAxMzMuNC04NCAyNS42IDYwIDg1LjIgMTAyLjEgMTU0LjYgMTAyLjEgMTAuOSAwIDIxLjYtMS4xIDMyLTMuMUw0ODAgNDgwYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMTQwLjgtMTM2IDEwOC44IDU2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTE0NCAwYy01MyAwLTk2LTQzLTk2LTk2bDAtMjI0YzAtMTYuNi0xMi42LTMwLjItMjguNy0zMS44bC02LjYtLjNDNDQuNiAxNTguMiAzMiAxNDQuNiAzMiAxMjggMzIgMTEwLjMgNDYuMyA5NiA2NCA5NnpNNTMzLjggMy4yQzU0NC4yLTUuNSA1NjAgMS45IDU2MCAxNS41TDU2MCAxMjhjMCA2MS45LTUwLjEgMTEyLTExMiAxMTJTMzM2IDE4OS45IDMzNiAxMjhsMC0xMTIuNWMwLTEzLjYgMTUuOC0yMSAyNi4yLTEyLjNMNDE2IDQ4IDQ4MCA0OCA1MzMuOCAzLjJ6TTQwMCAxMDhhMjAgMjAgMCAxIDAgMCA0MCAyMCAyMCAwIDEgMCAwLTQwem05NiAwYTIwIDIwIDAgMSAwIDAgNDAgMjAgMjAgMCAxIDAgMC00MHoiXQogICAgfTsKICAgIGZhQ2FsZW5kYXJXZWVrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImNhbGVuZGFyLXdlZWsiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZjc4NCIsICJNMTI4IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAzMiAxMjggMCAwLTMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAzMiAzMiAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMjg4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDQ4MGMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCAxMjhDMCA5Mi43IDI4LjcgNjQgNjQgNjRsMzIgMCAwLTMyYzAtMTcuNyAxNC4zLTMyIDMyLTMyem0wIDI1NmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJsMCA2NGMwIDE3LjcgMTQuMyAzMiAzMiAzMmwxOTIgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTY0YzAtMTcuNy0xNC4zLTMyLTMyLTMybC0xOTIgMHoiXQogICAgfTsKICAgIGZhQ29kZUNvbXBhcmUgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY29kZS1jb21wYXJlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUxM2EiLCAiTTE5OC44IDEuOGM5LTMuNyAxOS4zLTEuNyAyNi4yIDUuMmw1NiA1NmM5LjQgOS40IDkuNCAyNC42IDAgMzMuOWwtNTYgNTZjLTYuOSA2LjktMTcuMiA4LjktMjYuMiA1LjJTMTg0IDE0NS43IDE4NCAxMzZsMC0yNC0yNCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMmwwIDIxNC43YzI4LjMgMTIuMyA0OCA0MC41IDQ4IDczLjMgMCA0NC4yLTM1LjggODAtODAgODBzLTgwLTM1LjgtODAtODBjMC0zMi44IDE5LjctNjEgNDgtNzMuM0w2NCAxNDRjMC01MyA0My05NiA5Ni05NmwyNCAwIDAtMjRjMC05LjcgNS44LTE4LjUgMTQuOC0yMi4yek0zOTIgODBhMjQgMjQgMCAxIDAgNDggMCAyNCAyNCAwIDEgMCAtNDggMHptLTggNzMuM2MtMjguMy0xMi4zLTQ4LTQwLjUtNDgtNzMuMyAwLTQ0LjIgMzUuOC04MCA4MC04MHM4MCAzNS44IDgwIDgwYzAgMzIuOC0xOS43IDYxLTQ4IDczLjNMNDQ4IDM2OGMwIDUzLTQzIDk2LTk2IDk2bC0yNCAwIDAgMjRjMCA5LjctNS44IDE4LjUtMTQuOCAyMi4ycy0xOS4zIDEuNy0yNi4yLTUuMmwtNTYtNTZjLTkuNC05LjQtOS40LTI0LjYgMC0zMy45bDU2LTU2YzYuOS02LjkgMTcuMi04LjkgMjYuMi01LjJTMzI4IDM2Ni4zIDMyOCAzNzZsMCAyNCAyNCAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMjE0Ljd6TTcyIDQzMmEyNCAyNCAwIDEgMCA0OCAwIDI0IDI0IDAgMSAwIC00OCAweiJdCiAgICB9OwogICAgZmFMZW8gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibGVvIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImU4NGEiLCAiTTI2MCAwYzcyLjkgMCAxMzIgNTkuMSAxMzIgMTMybDAgNS40LS4xIDEuNC0yMy44IDI3MGMuNCAyMS43IDE4LjIgMzkuMiA0MCAzOS4yIDIyLjEgMCA0MC0xNy45IDQwLTQwbDAtNDBjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDQwYzAgNTcuNC00Ni42IDEwNC0xMDQgMTA0UzMwNCA0NjUuNCAzMDQgNDA4bDAtMS40IC4xLTEuNCAyMy45LTI3MC42IDAtMi42YzAtMzcuNi0zMC40LTY4LTY4LTY4cy02OCAzMC40LTY4IDY4bDAgNGMwIDMuNyAuMyA3LjMgLjggMTFsMjkuNyAxOTMuNGMuOSA2LjEgMS40IDEyLjIgMS40IDE4LjRsMCA5LjJjMCA2MS45LTUwLjEgMTEyLTExMiAxMTJTMCA0MjkuOSAwIDM2OCA1MC4xIDI1NiAxMTIgMjU2YzExLjcgMCAyMyAxLjggMzMuNyA1LjFMMTI5LjYgMTU2LjdjLTEuMS02LjgtMS42LTEzLjgtMS42LTIwLjdsMC00QzEyOCA1OS4xIDE4Ny4xIDAgMjYwIDB6TTExMiAzMjBhNDggNDggMCAxIDAgMCA5NiA0OCA0OCAwIDEgMCAwLTk2eiJdCiAgICB9OwogICAgZmFSb2FkQ2lyY2xlWG1hcmsgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicm9hZC1jaXJjbGUteG1hcmsiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTU2NiIsICJNMjg3LjkgMzJsLTc2LjIgMGMtMjkuNCAwLTU1LjEgMjAuMS02Mi4xIDQ4LjZMNjUuNCA0MjAuNUM1Ny45IDQ1MC43IDgwLjggNDgwIDExMiA0ODBsMjA5LjQgMGMtMTEuMi0yNC40LTE3LjQtNTEuNC0xNy40LTgwIDAtMjguNiA2LjItNTUuNyAxNy40LTgwLS41IDAtMSAwLTEuNiAwLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtNjRjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDQ5LjJjMzUuMi00MCA4Ni43LTY1LjIgMTQ0LjItNjUuMiA5IDAgMTcuOCAuNiAyNi40IDEuOGwtMzItMTI5LjJDNDgzLjQgNTIuMSA0NTcuOCAzMiA0MjguMyAzMmwtNzYuNSAwIDAgNjRjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC02NHpNNDk2IDU0NGExNDQgMTQ0IDAgMSAwIDAtMjg4IDE0NCAxNDQgMCAxIDAgMCAyODh6bTU5LjMtMTgwLjdsLTM2LjcgMzYuNyAzNi43IDM2LjdjNi4yIDYuMiA2LjIgMTYuNCAwIDIyLjZzLTE2LjQgNi4yLTIyLjYgMGwtMzYuNy0zNi43LTM2LjcgMzYuN2MtNi4yIDYuMi0xNi40IDYuMi0yMi42IDBzLTYuMi0xNi40IDAtMjIuNmwzNi43LTM2LjctMzYuNy0zNi43Yy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBsMzYuNyAzNi43IDM2LjctMzYuN2M2LjItNi4yIDE2LjQtNi4yIDIyLjYgMHM2LjIgMTYuNCAwIDIyLjZ6Il0KICAgIH07CiAgICBmYVBhbGxldCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJwYWxsZXQiLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZjQ4MiIsICJNMzIgMzIwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDMyIDAgMCA2NC0zMiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDUxMiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0zMiAwIDAtNjQgMzIgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwzMiAzMjB6bTk2IDY0bDEyOCAwIDAgNjQtMTI4IDAgMC02NHptMTkyIDBsMTI4IDAgMCA2NC0xMjggMCAwLTY0eiJdCiAgICB9OwogICAgZmFDYWtlQ2FuZGxlcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjYWtlLWNhbmRsZXMiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsxMjc4NzQsICJiaXJ0aGRheS1jYWtlIiwgImNha2UiXSwgImYxZmQiLCAiTTg2LjQtMTAuNUw2MS44IDMxLjZDNTggMzguMSA1NiA0NS42IDU2IDUzLjJMNTYgNTZjMCAyMi4xIDE3LjkgNDAgNDAgNDBzNDAtMTcuOSA0MC00MGwwLTIuOGMwLTcuNi0yLTE1LTUuOC0yMS42TDEwNS42LTEwLjVjLTItMy40LTUuNy01LjUtOS42LTUuNXMtNy42IDIuMS05LjYgNS41em0xMjggMEwxODkuOCAzMS42Yy0zLjggNi41LTUuOCAxNC01LjggMjEuNmwwIDIuOGMwIDIyLjEgMTcuOSA0MCA0MCA0MHM0MC0xNy45IDQwLTQwbDAtMi44YzAtNy42LTItMTUtNS44LTIxLjZMMjMzLjYtMTAuNWMtMi0zLjQtNS43LTUuNS05LjYtNS41cy03LjYgMi4xLTkuNiA1LjV6TTMxNy44IDMxLjZjLTMuOCA2LjUtNS44IDE0LTUuOCAyMS42bDAgMi44YzAgMjIuMSAxNy45IDQwIDQwIDQwczQwLTE3LjkgNDAtNDBsMC0yLjhjMC03LjYtMi0xNS01LjgtMjEuNkwzNjEuNi0xMC41Yy0yLTMuNC01LjctNS41LTkuNi01LjVzLTcuNiAyLjEtOS42IDUuNUwzMTcuOCAzMS42ek0xMjggMTYwYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgNTMuNUMyNi43IDIyNi42IDAgMjYyLjIgMCAzMDRsMCAyMC44YzIwLjkgMS4zIDQxLjYgNy4zIDYwLjMgMThsNy4xIDQuMWMyNi4zIDE1IDU4LjkgMTMuNCA4My42LTQuMiA0My43LTMxLjIgMTAyLjMtMzEuMiAxNDYgMCAyNC42IDE3LjYgNTcuMyAxOS4zIDgzLjYgNC4ybDcuMS00LjFjMTguNy0xMC43IDM5LjMtMTYuNyA2MC4zLTE4bDAtMjAuOGMwLTQxLjgtMjYuNy03Ny40LTY0LTkwLjVsMC01My41YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgNDgtNjQgMCAwLTQ4YzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMybDAgNDgtNjQgMCAwLTQ4ek00NDggMzczYy0xMi43IDEuMi0yNS4xIDUtMzYuNSAxMS41bC03LjEgNC4xYy00Mi42IDI0LjMtOTUuNCAyMS43LTEzNS4zLTYuOC0yNy0xOS4zLTYzLjItMTkuMy05MC4yIDAtMzkuOSAyOC41LTkyLjcgMzEuMi0xMzUuMyA2LjhsLTcuMS00LjFDMjUuMSAzNzggMTIuNyAzNzQuMSAwIDM3M2wwIDc1YzAgMzUuMyAyOC43IDY0IDY0IDY0bDMyMCAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtNzV6Il0KICAgIH07CiAgICBmYUJpcnRoZGF5Q2FrZSA9IGZhQ2FrZUNhbmRsZXM7CiAgICBmYUNha2UgPSBmYUNha2VDYW5kbGVzOwogICAgZmFCdWdTbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJidWctc2xhc2giLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTQ5MCIsICJNNy0yNC45YzkuNC05LjQgMjQuNi05LjQgMzMuOSAwTDI0MS44IDE3NiAzNDQgMTc2YzE0LjIgMCAyNy43IDIuOCA0MCA4bDEwOC44LTgxLjZjMTQuMS0xMC42IDM0LjItNy43IDQ0LjggNi40czcuNyAzNC4yLTYuNCA0NC44bC05Ny44IDczLjNjNS4zIDguOSA5LjMgMTguNyAxMS44IDI5LjFsOTguOCAwYzE3LjcgMCAzMiAxNC4zIDMyIDMycy0xNC4zIDMyLTMyIDMybC05NiAwIDAgMzJjMCA5LjUtLjggMTguNy0yLjQgMjcuOEw1NjkgNTAzLjFjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlzLTI0LjYgOS40LTMzLjkgMEw3IDkuMUMtMi4zLS4zLTIuMy0xNS41IDctMjQuOXpNMzk4LjIgNDY4Yy0yMy4yIDIyLjEtNTMgMzcuMi04Ni4yIDQyLjJsMC0xMjguNCA4Ni4yIDg2LjJ6TTI2NCAzMzMuOGwwIDE3Ni40Yy01MS4yLTcuNy05NC41LTM5LjctMTE3LjctODMuOUw4My4yIDQ3My42Yy0xNC4xIDEwLjYtMzQuMiA3LjctNDQuOC02LjRzLTcuNy0zNC4yIDYuNC00NC44bDgzLjQtNjIuNWMtLjEtMi42LS4yLTUuMi0uMi03LjlsMC0zMi05NiAwYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDk4LjggMGMzLjMtMTMuOSA5LjMtMjYuNyAxNy42LTM3LjhMMjY0IDMzMy44ek0zNTUuNiAxMjhsLTgyLjQgMC03Mi4zLTcyLjNDMjE2LjEgMjIuOCAyNDkuNCAwIDI4OCAwIDM0MSAwIDM4NCA0MyAzODQgOTZsMCAzLjZjMCAxNS43LTEyLjcgMjguNC0yOC40IDI4LjR6Il0KICAgIH07CiAgICBmYVRhcnAgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidGFycCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlNTdiIiwgIk00NDggNjRjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCAxNDkuNWMwIDE3LTYuNyAzMy4zLTE4LjcgNDUuM0wzODYuNyA0MjkuM2MtMTIgMTItMjguMyAxOC43LTQ1LjMgMTguN0w2NCA0NDhjLTM1LjMgMC02NC0yOC43LTY0LTY0TDAgMTI4QzAgOTIuNyAyOC43IDY0IDY0IDY0bDM4NCAwem01LjUgMjA4TDM2MCAyNzJjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgOTMuNSAxMTcuNS0xMTcuNXpNOTYgMTkyYTMyIDMyIDAgMSAwIDAtNjQgMzIgMzIgMCAxIDAgMCA2NHoiXQogICAgfTsKICAgIGZhRGlhZ3JhbVByZWRlY2Vzc29yID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRpYWdyYW0tcHJlZGVjZXNzb3IiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTQ3NyIsICJNMjg5LjIgMTM3LjljMi41LTYgOC4zLTkuOSAxNC44LTkuOWw0MCAwIDAtMjRjMC0xMy4zLTEwLjctMjQtMjQtMjRsLTk4IDBjMS4zIDUuMSAyIDEwLjUgMiAxNmwwIDY0YzAgMzUuMy0yOC43IDY0LTY0IDY0bC05NiAwYy0zNS4zIDAtNjQtMjguNy02NC02NEwwIDk2QzAgNjAuNyAyOC43IDMyIDY0IDMybDI1NiAwYzM5LjggMCA3MiAzMi4yIDcyIDcybDAgMjQgNDAgMGM2LjUgMCAxMi4zIDMuOSAxNC44IDkuOXMxLjEgMTIuOS0zLjUgMTcuNGwtNjQgNjRjLTYuMiA2LjItMTYuNCA2LjItMjIuNiAwbC02NC02NGMtNC42LTQuNi01LjktMTEuNS0zLjUtMTcuNHpNMzg0IDM1MmwtMzIwIDAgMCA2NCAzMjAgMCAwLTY0em02NCA2NGMwIDM1LjMtMjguNyA2NC02NCA2NEw2NCA0ODBjLTM1LjMgMC02NC0yOC43LTY0LTY0bDAtNjRjMC0zNS4zIDI4LjctNjQgNjQtNjRsMzIwIDBjMzUuMyAwIDY0IDI4LjcgNjQgNjRsMCA2NHoiXQogICAgfTsKICAgIGZhRmFjZUZsdXNoZWQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhY2UtZmx1c2hlZCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWzEyODU2MywgImZsdXNoZWQiXSwgImY1NzkiLCAiTTAgMjU2YTI1NiAyNTYgMCAxIDEgNTEyIDAgMjU2IDI1NiAwIDEgMSAtNTEyIDB6TTE2OCAzOTJjMCAxMy4zIDEwLjcgMjQgMjQgMjRsMTI4IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTEyOCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHptLTgtOTZhNzIgNzIgMCAxIDAgMC0xNDQgNzIgNzIgMCAxIDAgMCAxNDR6bTI2NC03MmE3MiA3MiAwIDEgMCAtMTQ0IDAgNzIgNzIgMCAxIDAgMTQ0IDB6bS0yODggMGEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAwem0xOTIgMGEyNCAyNCAwIDEgMSA0OCAwIDI0IDI0IDAgMSAxIC00OCAweiJdCiAgICB9OwogICAgZmFGbHVzaGVkMiA9IGZhRmFjZUZsdXNoZWQyOwogICAgZmFEaWFncmFtTmV4dCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJkaWFncmFtLW5leHQiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTQ3NiIsICJNMzg0IDIyNGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTY0YzAtMzUuMy0yOC43LTY0LTY0LTY0TDY0IDMyQzI4LjcgMzIgMCA2MC43IDAgOTZsMCA2NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwxMjggMCAwIDY0LTMyIDBjLTYuNSAwLTEyLjMgMy45LTE0LjggOS45cy0xLjEgMTIuOSAzLjUgMTcuNGw2NCA2NGM2LjIgNi4yIDE2LjQgNi4yIDIyLjYgMGw2NC02NGM0LjYtNC42IDUuOS0xMS41IDMuNS0xNy40UzI5NC41IDI4OCAyODggMjg4bC0zMiAwIDAtNjQgMTI4IDB6TTY0IDI4OGMtMzUuMyAwLTY0IDI4LjctNjQgNjRsMCA2NGMwIDM1LjMgMjguNyA2NCA2NCA2NGwzMjAgMGMzNS4zIDAgNjQtMjguNyA2NC02NGwwLTY0YzAtMzUuMy0yOC43LTY0LTY0LTY0bC0zNCAwYzUuNiAyMS43LS41IDQ1LjEtMTYuNyA2MS4zbC02NCA2NGMtMjUgMjUtNjUuNSAyNS05MC41IDBsLTY0LTY0Qzk4LjYgMzMzLjEgOTIuNCAzMDkuNyA5OCAyODhsLTM0IDB6Il0KICAgIH07CiAgICBmYUFuY2hvckNpcmNsZVhtYXJrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFuY2hvci1jaXJjbGUteG1hcmsiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTRhYyIsICJNMzIwLjUgOTZhMzIgMzIgMCAxIDEgLTY0IDAgMzIgMzIgMCAxIDEgNjQgMHptLTMyLTk2Yy01MyAwLTk2IDQzLTk2IDk2IDAgNDEuOCAyNi43IDc3LjQgNjQgOTAuNWwwIDI1Ny45Yy02Mi45LTE0LjMtMTEwLjItNjkuNy0xMTEuOS0xMzYuNWwxNi4xIDE0LjFjMTAgOC43IDI1LjEgNy43IDMzLjktMi4zczcuNy0yNS4xLTIuMy0zMy45bC02NC01NmMtOS03LjktMjIuNi03LjktMzEuNiAwbC02NCA1NmMtMTAgOC43LTExIDIzLjktMi4zIDMzLjlzMjMuOSAxMSAzMy45IDIuM2wxNi4yLTE0LjJjMi4xIDExMy4xIDk0LjQgMjA0LjEgMjA4IDIwNC4xIDE2LjYgMCAzMi43LTEuOSA0OC4yLTUuNi0yMC4zLTMwLjUtMzIuMi02Ny0zMi4yLTEwNi40IDAtMjcuMyA1LjctNTMuMyAxNi03Ni45bDAtMTM2LjZjMzcuMy0xMy4yIDY0LTQ4LjcgNjQtOTAuNSAwLTUzLTQzLTk2LTk2LTk2em0yMDggNTQ0YTE0NCAxNDQgMCAxIDAgMC0yODggMTQ0IDE0NCAwIDEgMCAwIDI4OHptNTkuMy0xODAuN2wtMzYuNyAzNi43IDM2LjcgMzYuN2M2LjIgNi4yIDYuMiAxNi40IDAgMjIuNnMtMTYuNCA2LjItMjIuNiAwbC0zNi43LTM2LjctMzYuNyAzNi43Yy02LjIgNi4yLTE2LjQgNi4yLTIyLjYgMHMtNi4yLTE2LjQgMC0yMi42bDM2LjctMzYuNy0zNi43LTM2LjdjLTYuMi02LjItNi4yLTE2LjQgMC0yMi42czE2LjQtNi4yIDIyLjYgMGwzNi43IDM2LjcgMzYuNy0zNi43YzYuMi02LjIgMTYuNC02LjIgMjIuNiAwczYuMiAxNi40IDAgMjIuNnoiXQogICAgfTsKICAgIGZhUGVyc29uQ2lyY2xlWG1hcmsgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVyc29uLWNpcmNsZS14bWFyayIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJlNTQzIiwgIk0yODAgMjRhNTYgNTYgMCAxIDAgLTExMiAwIDU2IDU2IDAgMSAwIDExMiAwem0yNCAyMTIuN0wzNDEgMjg2LjZjMTIuOC0xNy41IDI4LjUtMzIuNyA0Ni4zLTQ1bC01Ni4yLTc1LjdDMzA2IDEzMiAyNjYuMyAxMTIgMjI0IDExMnMtODIgMjAtMTA3LjIgNTMuOWwtNzAuNSA5NWMtMTAuNSAxNC4yLTcuNiAzNC4yIDYuNiA0NC44czM0LjIgNy42IDQ0LjgtNi42TDE0NCAyMzYuNyAxNDQgNTEyYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xNjBjMC04LjggNy4yLTE2IDE2LTE2czE2IDcuMiAxNiAxNmwwIDE2MGMwIDE3LjcgMTQuMyAzMiAzMiAzMnMzMi0xNC4zIDMyLTMybDAtMjc1LjN6TTQ5NiA1NDRhMTQ0IDE0NCAwIDEgMCAwLTI4OCAxNDQgMTQ0IDAgMSAwIDAgMjg4em0yMi42LTE0NGwzNi43IDM2LjdjNi4yIDYuMiA2LjIgMTYuNCAwIDIyLjZzLTE2LjQgNi4yLTIyLjYgMGwtMzYuNy0zNi43LTM2LjcgMzYuN2MtNi4yIDYuMi0xNi40IDYuMi0yMi42IDBzLTYuMi0xNi40IDAtMjIuNmwzNi43LTM2LjctMzYuNy0zNi43Yy02LjItNi4yLTYuMi0xNi40IDAtMjIuNnMxNi40LTYuMiAyMi42IDBsMzYuNyAzNi43IDM2LjctMzYuN2M2LjItNi4yIDE2LjQtNi4yIDIyLjYgMHM2LjIgMTYuNCAwIDIyLjZMNTE4LjYgNDAweiJdCiAgICB9OwogICAgZmFTcGEgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3BhIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImY1YmIiLCAiTTE2OS43IDIyNy41YzM0LjMgMTguNyA2NC41IDQ0LjEgODguOCA3NC41IDExLjEgMTMuOSAyMSAyOC45IDI5LjQgNDQuOCA4LjUtMTUuOSAxOC4zLTMwLjggMjkuNC00NC44IDI0LjMtMzAuNSA1NC41LTU1LjkgODguOC03NC41IDQxLjctMjIuNyA4OS40LTM1LjUgMTM5LjctMzUuNWw5LjkgMGMxMS4xIDAgMjAuMSA5IDIwLjEgMjAuMSAwIDE0OC0xMTkuOSAyNjcuOS0yNjcuOSAyNjcuOWwtNDAuMiAwQzExOS45IDQ4MCAwIDM2MC4xIDAgMjEyLjEgMCAyMDEgOSAxOTIgMjAuMSAxOTJsOS45IDBjNTAuNCAwIDk4LjEgMTIuOCAxMzkuNyAzNS41ek0zMDMuOSAzOGMxNi45IDE1LjkgNjEuNCA2My40IDg5IDE0Mi4zLTQwLjEgMjAuMi03NS44IDQ4LjItMTA0LjkgODIuMS0yOS4yLTMzLjktNjQuOC02MS44LTEwNC45LTgyLjEgMjcuNi03OC45IDcyLjItMTI2LjQgODktMTQyLjMgNC4zLTQuMSAxMC02IDE1LjktNnMxMS42IDIgMTUuOSA2eiJdCiAgICB9OwogICAgZmFBcmllcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJhcmllcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlODQ2IiwgIk00MDEuNiAwYzYxLjMgMCAxMTAuNCA1MC4zIDExMC40IDExMSAwIDI5LjQtMTEuNiA1Ny45LTMyLjYgNzguOGwtOC44IDguOGMtMTIuNSAxMi41LTMyLjggMTIuNS00NS4yIDBzLTEyLjUtMzIuOCAwLTQ1LjJsOC44LTguOGM4LjgtOC44IDEzLjgtMjEgMTMuOC0zMy42IDAtMjUuOS0yMS4xLTQ3LTQ2LjQtNDctMjIuNSAwLTQxLjcgMTYuMS00NS43IDM4LjJMMjg3LjUgNDg1LjZjMCAuMS0uMSAuMy0uMSAuNC0uMiAuOC0uMyAxLjYtLjUgMi4zLS4xIC4zLS4xIC41LS4yIC43LS4yIC42LS40IDEuMy0uNyAxLjktLjIgLjUtLjQgMS0uNiAxLjUtLjEgLjMtLjMgLjYtLjQgLjktMS42IDMuNS0zLjggNi41LTYuNCA5LjItMiAyLTQuMiAzLjctNi42IDUuMS0uMiAuMS0uMyAuMi0uNSAuMy0uNyAuNC0xLjQgLjctMi4xIDEtLjMgLjEtLjYgLjMtLjkgLjQtLjUgLjItMSAuNC0xLjUgLjYtLjYgLjItMS4yIC41LTEuOSAuNy0uMiAuMS0uNSAuMi0uNyAuMi0uOCAuMi0xLjYgLjQtMi4zIC41LS4yIDAtLjMgLjEtLjQgLjEtLjIgMC0uNCAwLS42IC4xLS43IC4xLTEuMyAuMi0yIC4yLS40IDAtLjggLjEtMS4yIC4xLS42IDAtMS4yIC4xLTEuOCAuMS0uNiAwLTEuMiAwLTEuOC0uMS0uNCAwLS44LS4xLTEuMi0uMS0uNy0uMS0xLjQtLjEtMi0uMi0uMiAwLS40IDAtLjYtLjEtLjIgMC0uMy0uMS0uNS0uMS0uOC0uMi0xLjYtLjMtMi4zLS41LS4zLS4xLS41LS4xLS44LS4yLS42LS4yLTEuMy0uNC0xLjktLjctLjUtLjItMS0uNC0xLjUtLjYtLjMtLjEtLjYtLjMtLjktLjQtLjctLjMtMS40LS43LTIuMS0xLS4yLS4xLS4zLS4yLS41LS4zLTIuNC0xLjQtNC43LTMuMS02LjYtNS4xLTIuNi0yLjYtNC44LTUuNy02LjQtOS4yLS4xLS4yLS4yLS4zLS4yLS41bC0uNS0xLjFjLS4xLS4zLS4yLS41LS4zLS44LS4yLS42LS41LTEuMi0uNy0xLjktLjEtLjItLjItLjUtLjItLjctLjItLjgtLjQtMS42LS41LTIuMyAwLS4xLS4xLS4zLS4xLS40TDE1NiAxMDIuMmMtNC0yMi4xLTIzLjItMzguMi00NS43LTM4LjItMjUuMyAwLTQ2LjQgMjEuMS00Ni40IDQ3IDAgMTIuNiA1IDI0LjggMTMuOCAzMy42bDguOCA4LjhjMTIuNSAxMi41IDEyLjUgMzIuOCAwIDQ1LjJzLTMyLjggMTIuNS00NS4yIDBsLTguOC04LjhDMTEuNiAxNjguOSAwIDE0MC4zIDAgMTExIDAgNTAuMyA0OS4xIDAgMTEwLjQgMCAxNjMuOCAwIDIwOS42IDM4LjMgMjE5IDkxbDM3IDIwNyAzNy0yMDdjOS40LTUyLjYgNTUuMi05MSAxMDguNy05MXoiXQogICAgfTsKICAgIGZhQmFyc1Byb2dyZXNzID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImJhcnMtcHJvZ3Jlc3MiLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFsidGFza3MtYWx0Il0sICJmODI4IiwgIk0yODggMTYwbDk2IDAgMC02NC05NiAwIDAgNjR6TTAgMTYwTDAgODBDMCA1My41IDIxLjUgMzIgNDggMzJsMzUyIDBjMjYuNSAwIDQ4IDIxLjUgNDggNDhsMCA5NmMwIDI2LjUtMjEuNSA0OC00OCA0OEw0OCAyMjRjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMTZ6TTE2MCA0MTZsMjI0IDAgMC02NC0yMjQgMCAwIDY0ek0wIDQxNmwwLTgwYzAtMjYuNSAyMS41LTQ4IDQ4LTQ4bDM1MiAwYzI2LjUgMCA0OCAyMS41IDQ4IDQ4bDAgOTZjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNDgwYy0yNi41IDAtNDgtMjEuNS00OC00OGwwLTE2eiJdCiAgICB9OwogICAgZmFUYXNrc0FsdCA9IGZhQmFyc1Byb2dyZXNzOwogICAgZmFIZWFydENpcmNsZUNoZWNrID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImhlYXJ0LWNpcmNsZS1jaGVjayIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgW10sICJlNGZkIiwgIk0yNDEgODcuMWwxNSAyMC43IDE1LTIwLjdDMjk2IDUyLjUgMzM2LjIgMzIgMzc4LjkgMzIgNDUyLjQgMzIgNTEyIDkxLjYgNTEyIDE2NS4xbDAgMi42YzAgMTcuNi0zLjQgMzUuNi05LjUgNTMuNy0yMS44LTguNi00NS42LTEzLjQtNzAuNS0xMy40LTEwNiAwLTE5MiA4Ni0xOTIgMTkyIDAgMjguNSA2LjIgNTUuNiAxNy40IDgwLS41IDAtLjkgMC0xLjQgMC0xNS41IDAtMzAuOC00LjYtNDMuMS0xNC4xLTczLTU1LjctMjEyLjktMTg2LTIxMi45LTI5OC4ybDAtMi42QzAgOTEuNiA1OS42IDMyIDEzMy4xIDMyIDE3NS44IDMyIDIxNiA1Mi41IDI0MSA4Ny4xek0yODggNDAwYTE0NCAxNDQgMCAxIDEgMjg4IDAgMTQ0IDE0NCAwIDEgMSAtMjg4IDB6bTIwMS40LTYwLjljLTcuMS01LjItMTcuMi0zLjYtMjIuNCAzLjVsLTUzIDcyLjktMjYuOC0yNi44Yy02LjItNi4yLTE2LjQtNi4yLTIyLjYgMHMtNi4yIDE2LjQgMCAyMi42bDQwIDQwYzMuMyAzLjMgNy45IDUgMTIuNiA0LjZzOC45LTIuOCAxMS43LTYuNWw2NC04OGM1LjItNy4xIDMuNi0xNy4yLTMuNS0yMi4zeiJdCiAgICB9OwogICAgZmFNYXJzU3Ryb2tlUmlnaHQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAibWFycy1zdHJva2UtcmlnaHQiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFs5ODk3LCAibWFycy1zdHJva2UtaCJdLCAiZjIyYiIsICJNMzIwLjUgMjU2YTExMiAxMTIgMCAxIDAgLTIyNCAwIDExMiAxMTIgMCAxIDAgMjI0IDB6TTIwOC41IDgwYzg2LjMgMCAxNTguMSA2Mi4xIDE3My4xIDE0NC4xIDEtLjEgMS45LS4xIDIuOS0uMWwxNiAwIDAtMzJjMC0xNy43IDE0LjMtMzIgMzItMzJzMzIgMTQuMyAzMiAzMmwwIDMyIDYxLjQgMC0yMi40LTI4Yy0xMS0xMy44LTguOC0zMy45IDUtNDVzMzMuOS04LjggNDUgNWw2NCA4MGM5LjMgMTEuNyA5LjMgMjguMyAwIDQwbC02NCA4MGMtMTEgMTMuOC0zMS4yIDE2LTQ1IDVzLTE2LTMxLjItNS00NWwyMi40LTI4LTYxLjQgMCAwIDMyYzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtMzItMTYgMGMtMSAwLTEuOSAwLTIuOS0uMS0xNSA4Mi04Ni44IDE0NC4xLTE3My4xIDE0NC4xLTk3LjIgMC0xNzYtNzguOC0xNzYtMTc2czc4LjgtMTc2IDE3Ni0xNzZ6Il0KICAgIH07CiAgICBmYU1hcnNTdHJva2VIID0gZmFNYXJzU3Ryb2tlUmlnaHQ7CiAgICBmYVRvd2VyT2JzZXJ2YXRpb24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAidG93ZXItb2JzZXJ2YXRpb24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTU4NiIsICJNMjA5LjcgMy40YzktNC41IDE5LjYtNC41IDI4LjYgMGwxNjAgODBjMTUuOCA3LjkgMjIuMiAyNy4xIDE0LjMgNDIuOS01LjYgMTEuMi0xNi45IDE3LjctMjguNiAxNy43bDAgODBjMCAxNy43LTE0LjMgMzItMzIgMzJsLTEzIDAgMzIgMTkyIDQ1IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJMMzIgNTEyYy0xNy43IDAtMzItMTQuMy0zMi0zMnMxNC4zLTMyIDMyLTMybDQ1IDAgMzItMTkyLTEzIDBjLTE3LjcgMC0zMi0xNC4zLTMyLTMybDAtODBjLTExLjcgMC0yMy02LjUtMjguNi0xNy43LTcuOS0xNS44LTEuNS0zNSAxNC4zLTQyLjlsMTYwLTgwek0zMTAuNyA0NDhsLTg2LjctNjEuOS04Ni43IDYxLjkgMTczLjQgMHptLTE1My0xOTJsLTMuNSAyMS4yIDY5LjkgNDkuOSA2OS45LTQ5LjktMy41LTIxLjItMTMyLjcgMHptLTEyLjMgNzMuOWwtMTAuMSA2MC42IDQ3LjUtMzMuOS0zNy40LTI2Ljd6bTExOS45IDI2LjdsNDcuNSAzMy45LTEwLjEtNjAuNi0zNy40IDI2Ljd6TTE1MiAxMjhjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsMTQ0IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTE0NCAweiJdCiAgICB9OwogICAgZmFTdGVybGluZ1NpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3Rlcmxpbmctc2lnbiIsCiAgICAgIGljb246IFszODQsIDUxMiwgWzE2MywgImdicCIsICJwb3VuZC1zaWduIl0sICJmMTU0IiwgIk05MS4zIDI4OGwtMzQuOCAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDIxLjQgMEMzNy4zIDE0Ny4zIDEwNS4xIDQyIDIwNy42IDQybDguMiAwYzMzLjYgMCA2Ni4yIDExLjMgOTIuNSAzMi4ybDE2LjEgMTIuN2MxMy45IDExIDE2LjIgMzEuMSA1LjIgNDVzLTMxLjEgMTYuMi00NSA1LjJsLTE2LjEtMTIuN2MtMTUtMTEuOS0zMy42LTE4LjQtNTIuOC0xOC40bC04LjIgMGMtNTcuMyAwLTk0LjcgNTkuOS02OS43IDExMS40IDMuNiA3LjQgNi42IDE0LjkgOS4xIDIyLjZsMTQ5LjUgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTQxLjIgMGMxIDM1LjMtOC43IDcwLjYtMjguOSAxMDAuOWwtMTguMSAyNy4xIDIxMi4yIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTI3MiAwYy0xMS44IDAtMjIuNi02LjUtMjguMi0xNi45cy01LTIzIDEuNi0zMi45bDUxLjItNzYuOGMxMy4xLTE5LjYgMTkuMi00Mi42IDE4LjItNjUuNHoiXQogICAgfTsKICAgIGZhR2JwID0gZmFTdGVybGluZ1NpZ247CiAgICBmYVBvdW5kU2lnbiA9IGZhU3RlcmxpbmdTaWduOwogICAgZmFGYXVjZXREcmlwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImZhdWNldC1kcmlwIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4Njg4XSwgImUwMDYiLCAiTTIyNCAzMmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJMOTYgNjRDNzguMyA2NCA2NCA3OC4zIDY0IDk2czE0LjMgMzIgMzIgMzJsOTYgMCAwIDY0LTE4LjcgMGMtOC41IDAtMTYuNiAzLjQtMjIuNiA5LjRMMTI4IDIyNCAzMiAyMjRjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgNjRjMCAxNy43IDE0LjMgMzIgMzIgMzJsMTAwLjEgMGMyMC4yIDI5IDUzLjkgNDggOTEuOSA0OHM3MS43LTE5IDkxLjktNDhsMzYuMSAwYzE3LjcgMCAzMiAxNC4zIDMyIDMyczE0LjMgMzIgMzIgMzJsNjQgMGMxNy43IDAgMzItMTQuMyAzMi0zMiAwLTg4LjQtNzEuNi0xNjAtMTYwLTE2MGwtMzIgMC0yMi42LTIyLjZjLTYtNi0xNC4xLTkuNC0yMi42LTkuNGwtMTguNyAwIDAtNjQgOTYgMGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMmwtOTYgMGMwLTE3LjctMTQuMy0zMi0zMi0zMnpNNDM2LjggNDU1LjRsLTE4LjIgNDIuNGMtMS44IDQuMS0yLjcgOC42LTIuNyAxMy4xbDAgMS4yYzAgMTcuNyAxNC4zIDMyIDMyIDMyczMyLTE0LjMgMzItMzJsMC0xLjJjMC00LjUtLjktOC45LTIuNy0xMy4xbC0xOC4yLTQyLjRjLTEuOS00LjUtNi4zLTcuNC0xMS4yLTcuNHMtOS4yIDIuOS0xMS4yIDcuNHoiXQogICAgfTsKICAgIGZhQ2lyY2xlSW5mbyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaXJjbGUtaW5mbyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJpbmZvLWNpcmNsZSJdLCAiZjA1YSIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTIyNCAxNjBhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptLTggNjRsNDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNGwwIDg4IDggMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtODAgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwyNCAwIDAtNjQtMjQgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHoiXQogICAgfTsKICAgIGZhSW5mb0NpcmNsZSA9IGZhQ2lyY2xlSW5mbzsKICAgIGZhRmVhdGhlciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmZWF0aGVyIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI5NzE4XSwgImY1MmQiLCAiTTM1MiAwYzQxIDAgODAuMyAxNi4zIDEwOS4yIDQ1LjJsNS41IDUuNWMyOSAyOSA0NS4zIDY4LjMgNDUuMyAxMDkuMiAwIDI0LjEtNS43IDQ3LjYtMTYuMiA2OC44LTEuOSAzLjctNS4zIDYuNS05LjMgNy43TDM3NC41IDI3MGMtMy45IDEuMi02LjUgNC43LTYuNSA4LjggMCA1LjEgNC4xIDkuMiA5LjIgOS4ybDMyLjIgMGMxNC4zIDAgMjEuNCAxNy4yIDExLjMgMjcuM2wtMjIuNCAyMi40Yy0xLjkgMS45LTQuMiAzLjItNi43IDRsLTgxIDI0LjNjLTMuOSAxLjItNi41IDQuNy02LjUgOC44IDAgNS4xIDQuMSA5LjIgOS4yIDkuMiAxMy4yIDAgMTguOSAxNS43IDcuOCAyMi45LTQxLjEgMjYuNi04OS4zIDQxLjEtMTM5IDQxLjFsLTg2IDAtNDggNDhjLTguOCA4LjgtMjMuMiA4LjgtMzIgMHMtOC44LTIzLjIgMC0zMkwyNTYgMjI0YzguOC04LjggOC44LTIzLjIgMC0zMnMtMjMuMi04LjgtMzIgMEw3OS41IDMzNi41Yy01LjcgNS43LTE1LjUgMS43LTE1LjUtNi40IDAtNjcuOSAyNy0xMzMgNzUtMTgxTDI0Mi44IDQ1LjJDMjcxLjcgMTYuMyAzMTEgMCAzNTIgMHoiXQogICAgfTsKICAgIGZhQm93bFJpY2UgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiYm93bC1yaWNlIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImUyZWIiLCAiTTE3NiA0MGMwLTEzLjMgMTAuNy0yNCAyNC0yNGwxNiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHptMjQgNDhsMTYgMGMxMy4zIDAgMjQgMTAuNyAyNCAyNHMtMTAuNyAyNC0yNCAyNGwtMTYgMGMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHpNNTYgMTYwbDE2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6TTAgMjgzLjRDMCAyNjguMyAxMi4zIDI1NiAyNy40IDI1Nmw0NTcuMSAwYzE1LjEgMCAyNy40IDEyLjMgMjcuNCAyNy40IDAgNzAuNS00NC40IDEzMC43LTEwNi43IDE1NC4xTDQwMy41IDQ1MmMtMiAxNi0xNS42IDI4LTMxLjggMjhsLTIzMS41IDBjLTE2LjEgMC0yOS44LTEyLTMxLjgtMjhsLTEuOC0xNC40QzQ0LjQgNDE0LjEgMCAzNTMuOSAwIDI4My40ek0yMjQgMTg0YzAtMTMuMyAxMC43LTI0IDI0LTI0bDE2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0em0tOTYgMGMwLTEzLjMgMTAuNy0yNCAyNC0yNGwxNiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHpNMTA0IDg4bDE2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6bTIxNiA5NmMwLTEzLjMgMTAuNy0yNCAyNC0yNGwxNiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHpNMjk2IDg4bDE2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6bTEyMCA5NmMwLTEzLjMgMTAuNy0yNCAyNC0yNGwxNiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHpNMzkyIDg4bDE2IDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRsLTE2IDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjR6TTI5NiAxNmwxNiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC0xNiAwYy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0eiJdCiAgICB9OwogICAgZmFTdGFySGFsZlN0cm9rZTIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic3Rhci1oYWxmLXN0cm9rZSIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJzdGFyLWhhbGYtYWx0Il0sICJmNWMwIiwgIk0yODguMSAzNTMuNmMxMCAwIDE5LjkgMi4zIDI5IDdsNzQuNCAzNy45LTEzLTgyLjVjLTMuMi0yMC4yIDMuNS00MC43IDE3LjktNTUuMmw1OS01OS4xLTgyLjUtMTMuMWMtMjAuMi0zLjItMzcuNy0xNS45LTQ3LTM0LjFsLTM4LTc0LjQgMCAyNzMuNnpNNDU3LjQgNDg5Yy03LjMgNS4zLTE3IDYuMS0yNSAyTDI4OC4xIDQxNy42IDE0My44IDQ5MWMtOCA0LjEtMTcuNyAzLjMtMjUtMnMtMTEtMTQuMi05LjYtMjMuMkwxMzQuNCAzMDUuOSAyMCAxOTEuNGMtNi40LTYuNC04LjYtMTUuOC01LjgtMjQuNHMxMC4xLTE0LjkgMTkuMS0xNi4zbDE1OS45LTI1LjQgNzMuNi0xNDQuMmM0LjEtOCAxMi40LTEzLjEgMjEuNC0xMy4xczE3LjMgNS4xIDIxLjQgMTMuMUwzODMgMTI1LjMgNTQyLjkgMTUwLjdjOC45IDEuNCAxNi4zIDcuNyAxOS4xIDE2LjNzLjUgMTgtNS44IDI0LjRMNDQxLjcgMzA1LjkgNDY3IDQ2NS44YzEuNCA4LjktMi4zIDE3LjktOS42IDIzLjJ6Il0KICAgIH07CiAgICBmYVN0YXJIYWxmQWx0MiA9IGZhU3RhckhhbGZTdHJva2UyOwogICAgZmFUZW1wZXJhdHVyZUFycm93RG93biA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0ZW1wZXJhdHVyZS1hcnJvdy1kb3duIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbInRlbXBlcmF0dXJlLWRvd24iXSwgImUwM2YiLCAiTTY0LjUgOTZjMC01MyA0My05NiA5Ni05NnM5NiA0MyA5NiA5NmwwIDE2NC43YzI5LjUgMjYuNCA0OCA2NC43IDQ4IDEwNy4zIDAgNzkuNS02NC41IDE0NC0xNDQgMTQ0cy0xNDQtNjQuNS0xNDQtMTQ0YzAtNDIuNiAxOC41LTgxIDQ4LTEwNy4zTDY0LjUgOTZ6bTk2IDMzNmMzNS4zIDAgNjQtMjguNyA2NC02NCAwLTI2LjktMTYuNS00OS45LTQwLTU5LjNsMC0yOC43YzAtMTMuMy0xMC43LTI0LTI0LTI0cy0yNCAxMC43LTI0IDI0bDAgMjguN2MtMjMuNSA5LjUtNDAgMzIuNS00MCA1OS4zIDAgMzUuMyAyOC43IDY0IDY0IDY0ek00MzkuMSAzMTAuNmMtNiA2LTE0LjEgOS40LTIyLjYgOS40cy0xNi42LTMuNC0yMi42LTkuNGwtNjQtNjRjLTEyLjUtMTIuNS0xMi41LTMyLjggMC00NS4zczMyLjgtMTIuNSA0NS4zIDBsOS40IDkuNCAwLTE3OC43YzAtMTcuNyAxNC4zLTMyIDMyLTMyczMyIDE0LjMgMzIgMzJsMCAxNzguNyA5LjQtOS40YzEyLjUtMTIuNSAzMi44LTEyLjUgNDUuMyAwczEyLjUgMzIuOCAwIDQ1LjNsLTY0IDY0eiJdCiAgICB9OwogICAgZmFUZW1wZXJhdHVyZURvd24gPSBmYVRlbXBlcmF0dXJlQXJyb3dEb3duOwogICAgZmFNYXNrVmVudGlsYXRvciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJtYXNrLXZlbnRpbGF0b3IiLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZTUyNCIsICJNMTUyLjIgMTkyYy0xNS40IDM4LjMtMjQuMiA3Ny4yLTI0LjIgMTA4LjggMCAxMy4zIDEuNSAyNi4yIDQuNCAzOC43bC0xNy0zLjRjLTI5LjktNi01MS40LTMyLjItNTEuNC02Mi44bDAtODEuMyA4OC4yIDB6bTMyLjktNjRMNjQgMTI4Yy0zNS4zIDAtNjQgMjguNy02NCA2NGwwIDgxLjNjMCA2MSA0My4xIDExMy41IDEwMi45IDEyNS41bDY2LjMgMTMuM2MxOC43IDIyLjEgNDIuOSA0MCA3MC44IDUxLjhsMC04Ny44Yy0xMC4xLTE0LjItMTYtMzEuMy0xNi00OS43IDAtNDkuNSA0My0xMzQuNCA5Ni0xMzQuNCA1Mi41IDAgOTYgODQuOSA5NiAxMzQuNCAwIDE4LjQtNS45IDM1LjQtMTYgNDkuNmwwIDg3LjdjMjcuNi0xMS44IDUxLjctMjkuNiA3MC40LTUxLjZsNjYuNy0xMy4zYzU5LjgtMTIgMTAyLjktNjQuNSAxMDIuOS0xMjUuNWwwLTgxLjNjMC0zNS4zLTI4LjctNjQtNjQtNjRsLTEyMS41IDBjLTM0LjgtNTQuMi04Mi41LTk2LTEzNC41LTk2LTUyLjYgMC0xMDAuMiA0MS44LTEzNC45IDk2em0zMDIuNSA2NGw4OC40IDAgMCA4MS4zYzAgMzAuNS0yMS41IDU2LjgtNTEuNCA2Mi44bC0xNyAzLjRjMi45LTEyLjQgNC41LTI1LjQgNC41LTM4LjcgMC0zMS42LTguOS03MC41LTI0LjQtMTA4Ljh6TTI4OCAzMjBsMCAxOTIgNjQgMCAwLTE5MmMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMnoiXQogICAgfTsKICAgIGZhRmlsZVZpZGVvMiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJmaWxlLXZpZGVvIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbXSwgImYxYzgiLCAiTTAgNjRDMCAyOC43IDI4LjcgMCA2NCAwTDIxMy41IDBjMTcgMCAzMy4zIDYuNyA0NS4zIDE4LjdMMzY1LjMgMTI1LjNjMTIgMTIgMTguNyAyOC4zIDE4LjcgNDUuM0wzODQgNDQ4YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA2NHptMjA4LTUuNWwwIDkzLjVjMCAxMy4zIDEwLjcgMjQgMjQgMjRMMzI1LjUgMTc2IDIwOCA1OC41ek04MCAzMDRsMCA5NmMwIDE3LjcgMTQuMyAzMiAzMiAzMmw5NiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMybDAtMjQgMzUgMzVjMy4yIDMuMiA3LjUgNSAxMiA1IDkuNCAwIDE3LTcuNiAxNy0xN2wwLTk0LjFjMC05LjQtNy42LTE3LTE3LTE3LTQuNSAwLTguOCAxLjgtMTIgNWwtMzUgMzUgMC0yNGMwLTE3LjctMTQuMy0zMi0zMi0zMmwtOTYgMGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ6Il0KICAgIH07CiAgICBmYUFycm93VHJlbmREb3duID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImFycm93LXRyZW5kLWRvd24iLAogICAgICBpY29uOiBbNTc2LCA1MTIsIFtdLCAiZTA5NyIsICJNMzg0IDM1MmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJzMTQuMyAzMiAzMiAzMmwxNjAgMGMxNy43IDAgMzItMTQuMyAzMi0zMmwwLTE2MGMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMmwwIDgyLjctMTY5LjQtMTY5LjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwTDE5MiAyNDIuNyA1NC42IDEwNS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2wxNjAgMTYwYzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwTDMyMCAyMDUuMyA0NjYuNyAzNTIgMzg0IDM1MnoiXQogICAgfTsKICAgIGZhT2lsQ2FuID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm9pbC1jYW4iLAogICAgICBpY29uOiBbNjQwLCA1MTIsIFtdLCAiZjYxMyIsICJNMzIwIDEyOGMxNy43IDAgMzItMTQuMyAzMi0zMnMtMTQuMy0zMi0zMi0zMkwxOTIgNjRjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzIgMCAwIDMyLTE3NiAwYy0yNi41IDAtNDggMjEuNS00OCA0OGwwIDY0LjhjMCAxOSAxMS4yIDM2LjIgMjguNSA0My45bDY3LjUgMzAgMCAyMS4zYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDI1OS4xIDBjMTguNCAwIDM1LjgtNy45IDQ4LTIxLjdMNjMzLjUgMTg3LjdjMTIuMy0xMy45LS4zLTM1LjQtMTguNC0zMS41TDQ0OCAxOTIgMzk3LjUgMTY2LjhjLTguOS00LjQtMTguNy02LjgtMjguNi02LjhsLTgwLjkgMCAwLTMyIDMyIDB6TTk2IDIwOGwwIDg2LjEtNDgtMjEuMyAwLTY0LjggNDggMHoiXQogICAgfTsKICAgIGZhUGVvcGxlQ2FycnlCb3ggPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVvcGxlLWNhcnJ5LWJveCIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJwZW9wbGUtY2FycnkiXSwgImY0Y2UiLCAiTTY0LTMyQTU2IDU2IDAgMSAxIDY0IDgwIDU2IDU2IDAgMSAxIDY0LTMyek0wIDE3MS4xYzAtMzIuNiAyNi41LTU5LjEgNTkuMS01OS4xIDIzLjUgMCA0NS41IDExLjMgNTkuMSAzMC40bDQ4LjcgNjguMmM1LjggOC4yIDE1LjEgMTMuMSAyNS4xIDEzLjRsMC05NmMwLTE3LjcgMTQuMy0zMiAzMi0zMmwxMjggMGMxNy43IDAgMzIgMTQuMyAzMiAzMmwwIDk2YzEwLS4zIDE5LjMtNS4yIDI1LjEtMTMuNGw0OC43LTY4LjJjMTMuNi0xOS4xIDM1LjYtMzAuNCA1OS4xLTMwLjQgMzIuNiAwIDU5LjEgMjYuNSA1OS4xIDU5LjFMNTc2IDI3MmMwIDMwLjItMTQuMiA1OC43LTM4LjQgNzYuOGwtNzYuOCA1Ny42Yy04LjEgNi0xMi44IDE1LjUtMTIuOCAyNS42bDAgODBjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC04MGMwLTMwLjIgMTQuMi01OC43IDM4LjQtNzYuOGw0MS42LTMxLjIgMC04MC4xLTIuOCAzLjljLTE4IDI1LjItNDcuMSA0MC4yLTc4LjEgNDAuMkwzNTIgMjg4Yy0uNiAwLTEuMyAwLTEuOS0uMS0uNiAwLTEuMyAuMS0xLjkgLjFsLTEyMC40IDBjLS42IDAtMS4zIDAtMS45LS4xLS42IDAtMS4zIC4xLTEuOSAuMWwtMzEuMSAwYy0zMSAwLTYwLjEtMTUtNzguMS00MC4ybC0yLjgtMy45IDAgODAuMSA0MS42IDMxLjJDMTc3LjggMzczLjMgMTkyIDQwMS44IDE5MiA0MzJsMCA4MGMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTgwYzAtMTAuMS00LjctMTkuNi0xMi44LTI1LjZMMzguNCAzNDguOEMxNC4yIDMzMC43IDAgMzAyLjIgMCAyNzJMMCAxNzEuMXpNMCAzNzkuM2MzLjEgMi43IDYuMyA1LjQgOS42IDcuOUw2NCA0MjggNjQgNTEyYzAgMTcuNy0xNC4zIDMyLTMyIDMyUzAgNTI5LjcgMCA1MTJMMCAzNzkuM3pNNTY4IDI0YTU2IDU2IDAgMSAxIC0xMTIgMCA1NiA1NiAwIDEgMSAxMTIgMHptOCA0ODhjMCAxNy43LTE0LjMgMzItMzIgMzJzLTMyLTE0LjMtMzItMzJsMC04NCA1NC40LTQwLjhjMy4zLTIuNSA2LjUtNS4xIDkuNi03LjlMNTc2IDUxMnoiXQogICAgfTsKICAgIGZhUGVvcGxlQ2FycnkgPSBmYVBlb3BsZUNhcnJ5Qm94OwogICAgZmFDaGFpciA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJjaGFpciIsCiAgICAgIGljb246IFs0NDgsIDUxMiwgWzEyOTY4MV0sICJmNmMwIiwgIk0xNTIgMjU2bDAtMTgxLjhjLTI0LjUgMjAuNS00MCA1MS40LTQwIDg1LjhsMCA5NiA0MCAwem00OCAwbDQ4IDAgMC0yMDUuNGMtNy43LTEuNy0xNS44LTIuNi0yNC0yLjZzLTE2LjMgLjktMjQgMi42TDIwMCAyNTZ6TTI5NiA3NC4ybDAgMTgxLjggNDAgMCAwLTk2YzAtMzQuNC0xNS41LTY1LjItNDAtODUuOHpNMzIgMjU2bDMyIDAgMC05NkM2NCA3MS42IDEzNS42IDAgMjI0IDBTMzg0IDcxLjYgMzg0IDE2MGwwIDk2IDMyIDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCA2NGMwIDE3LjctMTQuMyAzMi0zMiAzMmwwIDk2YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMybDAtOTYtMjU2IDAgMCA5NmMwIDE3LjctMTQuMyAzMi0zMiAzMnMtMzItMTQuMy0zMi0zMmwwLTk2Yy0xNy43IDAtMzItMTQuMy0zMi0zMmwwLTY0YzAtMTcuNyAxNC4zLTMyIDMyLTMyeiJdCiAgICB9OwogICAgZmFXaW5kID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIndpbmQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjcyZSIsICJNMjg4IDMyYzAgMTcuNyAxNC4zIDMyIDMyIDMybDQwIDBjMTMuMyAwIDI0IDEwLjcgMjQgMjRzLTEwLjcgMjQtMjQgMjRMMzIgMTEyYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDMyOCAwYzQ4LjYgMCA4OC0zOS40IDg4LTg4UzQwOC42IDAgMzYwIDBMMzIwIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyem02NCAzNTJjMCAxNy43IDE0LjMgMzIgMzIgMzJsMzIgMGM1MyAwIDk2LTQzIDk2LTk2cy00My05Ni05Ni05NkwzMiAyMjRjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzg0IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJzLTE0LjMgMzItMzIgMzJsLTMyIDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMyek0xMjggNTEybDQwIDBjNDguNiAwIDg4LTM5LjQgODgtODhzLTM5LjQtODgtODgtODhMMzIgMzM2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDEzNiAwYzEzLjMgMCAyNCAxMC43IDI0IDI0cy0xMC43IDI0LTI0IDI0bC00MCAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMyeiJdCiAgICB9OwogICAgZmFMYXllckdyb3VwID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImxheWVyLWdyb3VwIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY1ZmQiLCAiTTIzMi41IDUuMmMxNC45LTYuOSAzMi4xLTYuOSA0NyAwbDIxOC42IDEwMWM4LjUgMy45IDEzLjkgMTIuNCAxMy45IDIxLjhzLTUuNCAxNy45LTEzLjkgMjEuOGwtMjE4LjYgMTAxYy0xNC45IDYuOS0zMi4xIDYuOS00NyAwTDEzLjkgMTQ5LjhDNS40IDE0NS44IDAgMTM3LjMgMCAxMjhzNS40LTE3LjkgMTMuOS0yMS44TDIzMi41IDUuMnpNNDguMSAyMTguNGwxNjQuMyA3NS45YzI3LjcgMTIuOCA1OS42IDEyLjggODcuMyAwbDE2NC4zLTc1LjkgMzQuMSAxNS44YzguNSAzLjkgMTMuOSAxMi40IDEzLjkgMjEuOHMtNS40IDE3LjktMTMuOSAyMS44bC0yMTguNiAxMDFjLTE0LjkgNi45LTMyLjEgNi45LTQ3IDBMMTMuOSAyNzcuOEM1LjQgMjczLjggMCAyNjUuMyAwIDI1NnM1LjQtMTcuOSAxMy45LTIxLjhsMzQuMS0xNS44ek0xMy45IDM2Mi4ybDM0LjEtMTUuOCAxNjQuMyA3NS45YzI3LjcgMTIuOCA1OS42IDEyLjggODcuMyAwbDE2NC4zLTc1LjkgMzQuMSAxNS44YzguNSAzLjkgMTMuOSAxMi40IDEzLjkgMjEuOHMtNS40IDE3LjktMTMuOSAyMS44bC0yMTguNiAxMDFjLTE0LjkgNi45LTMyLjEgNi45LTQ3IDBMMTMuOSA0MDUuOEM1LjQgNDAxLjggMCAzOTMuMyAwIDM4NHM1LjQtMTcuOSAxMy45LTIxLjh6Il0KICAgIH07CiAgICBmYUhlYWRTaWRlTWFzayA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoZWFkLXNpZGUtbWFzayIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgW10sICJlMDYzIiwgIk00NDUuOSAxOTNjLS4xLS40LS4yLS45LS4yLTEuMy0xNS43LTEwOC40LTEwOC45LTE5MS43LTIyMS43LTE5MS43LTg1IDAtMTU5IDQ3LjQtMTk2LjkgMTE3LjJMMjgzLjMgMjg4IDQ1NiAyODggNDQyLjkgMzM2IDMzNiAzMzZjLTguOCAwLTE2IDcuMi0xNiAxNnM3LjIgMTYgMTYgMTZsOTguMiAwLTguNyAzMi04OS41IDBjLTguOCAwLTE2IDcuMi0xNiAxNnM3LjIgMTYgMTYgMTZsODAuNiAwYy02LjcgMTkuMS0yNC44IDMyLTQ1LjMgMzJMMjg4IDQ2NGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0xMDQuNS0yNDcuNS0xNjVDMyAxODIuMSAwIDIwMi43IDAgMjI0IDAgMjc4IDE5LjEgMzI3LjUgNTAuOSAzNjYuMiA1OC45IDM3NS45IDY0IDM4Ny44IDY0IDQwMC40TDY0IDQ2NGMwIDI2LjUgMjEuNSA0OCA0OCA0OGwxMjcuMyAwIC43IDAgMTMxLjMgMGM0NC45IDAgODMuOC0zMS4xIDkzLjYtNzQuOWwzMy45LTE1MC4zYzMuMy0xNC40LS4zLTI5LjUtOS43LTQxTDQ0NS45IDE5M3pNMjg4IDE5MmEzMiAzMiAwIDEgMSA2NCAwIDMyIDMyIDAgMSAxIC02NCAweiJdCiAgICB9OwogICAgZmFIYW5kcyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJoYW5kcyIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJzaWduLWxhbmd1YWdlIiwgInNpZ25pbmciXSwgImYyYTciLCAiTTUxMiAxNjBsLS4xIDcyLjZjMCA0NC44LTE3LjYgODcuMS00Ny45IDExOC40LS4zLTc3LTQwLjEtMTQ4LjQtMTA1LjQtMTg5LjNsLTEuOS0xLjJjMi41LTMuNyAyLjgtOC42IC40LTEyLjdsLTYyLTEwNy40Yy02LjYtMTEuNS0yLjctMjYuMiA4LjgtMzIuOFMzMzAgNSAzMzYuNiAxNi41bDY4IDExNy44IDAgMCAwIDAgNDMuMyA3NSAuMS00OS4zYzAtMTcuNyAxNC40LTMyIDMyLTMyczMyIDE0LjQgMzIgMzJ6TTI5OC40IDEyNC4yYy0xNC4xLTguOC0yOS44LTEyLjctNDUuMi0xMi4xTDIxNi43IDQ4LjhjLTYuNi0xMS41LTIuNy0yNi4yIDguOC0zMi44czI2LjItMi43IDMyLjggOC44bDY3LjEgMTE2LjItMjctMTYuOXpNMjExLjkgODguNWwxNi40IDI4LjRjLTE1LjEgNS41LTI4LjYgMTUuNi0zOC4zIDI5LjdsLTE5LjctMzQuMmMtNi42LTExLjUtMi43LTI2LjIgOC44LTMyLjhzMjYuMi0yLjcgMzIuOCA4Ljh6bS00Ni40IDYzLjdsMTIuNSAyMS43Yy0yIDguNi0yLjUgMTcuNS0xLjcgMjYuMWwtNC4zIDAgMCAwLTM0LjQgMC0xMy43LTIzLjhjLTYuNi0xMS41LTIuNy0yNi4yIDguOC0zMi44czI2LjItMi43IDMyLjggOC44ek0yMjguOSAxNzVjOS40LTE1IDI5LjEtMTkuNSA0NC4xLTEwLjJsNjAuMiAzNy42QzM4NC43IDIzNC43IDQxNiAyOTEuMiA0MTYgMzUybDAgOGMwIDgzLjktNjguMSAxNTItMTUyIDE1Mkw4OCA1MTJjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsOTIgMGM2LjYgMCAxMi01LjQgMTItMTJzLTUuNC0xMi0xMi0xMkw1NiA0NDBjLTEzLjMgMC0yNC0xMC43LTI0LTI0czEwLjctMjQgMjQtMjRsMTI0IDBjNi42IDAgMTItNS40IDEyLTEycy01LjQtMTItMTItMTJMMjQgMzY4Yy0xMy4zIDAtMjQtMTAuNy0yNC0yNHMxMC43LTI0IDI0LTI0bDE1NiAwYzYuNiAwIDEyLTUuNCAxMi0xMnMtNS40LTEyLTEyLTEyTDU2IDI5NmMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGwxMzYgMCAwIDAgMCAwIDkzLjIgMC00Ni4yLTI4LjljLTE1LTkuNC0xOS41LTI5LjEtMTAuMi00NC4xeiJdCiAgICB9OwogICAgZmFTaWduTGFuZ3VhZ2UgPSBmYUhhbmRzOwogICAgZmFTaWduaW5nID0gZmFIYW5kczsKICAgIGZhVGFibGV0cyA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJ0YWJsZXRzIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbXSwgImY0OTAiLCAiTTQ5NS4zIDc2LjZjLTQuNi04LjctMTYuMy05LjctMjMuMy0yLjdMMjk3LjkgMjQ4Yy03IDctNiAxOC43IDIuNyAyMy4zIDIwLjEgMTAuNyA0MyAxNi43IDY3LjQgMTYuNyA3OS41IDAgMTQ0LTY0LjUgMTQ0LTE0NCAwLTI0LjMtNi00Ny4zLTE2LjctNjcuNHpNMjQwLjcgMjExLjRjNC42IDguNyAxNi4zIDkuNyAyMy4zIDIuN0w0MzguMSA0MGM3LTcgNi0xOC43LTIuNy0yMy4zLTIwLjEtMTAuNy00My0xNi43LTY3LjQtMTYuNy03OS41IDAtMTQ0IDY0LjUtMTQ0IDE0NCAwIDI0LjMgNiA0Ny4zIDE2LjcgNjcuNHpNMTQ0IDIyNEM3OS4yIDIyNCAyNC40IDI2Ni44IDYuMyAzMjUuNiAzLjQgMzM1LjEgMTEgMzQ0IDIwLjkgMzQ0bDI0Ni4yIDBjOS45IDAgMTcuNS04LjkgMTQuNi0xOC40LS45LTMtMS45LTUuOS0zLTguNy0zNy40LTE4LjEtNjgtNDgtODctODQuOC0xNC45LTUuMi0zMC45LTguMS00Ny42LTguMXpNMjgxLjcgNDEwLjRjMi45LTkuNS00LjctMTguNC0xNC42LTE4LjRMMjAuOSAzOTJDMTEgMzkyIDMuNCA0MDAuOSA2LjMgNDEwLjQgMjQuNCA0NjkuMiA3OS4yIDUxMiAxNDQgNTEyczExOS42LTQyLjggMTM3LjctMTAxLjZ6Il0KICAgIH07CiAgICBmYVdlaWdodEhhbmdpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAid2VpZ2h0LWhhbmdpbmciLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFtdLCAiZjVjZCIsICJNMjI0IDk2YTMyIDMyIDAgMSAxIDY0IDAgMzIgMzIgMCAxIDEgLTY0IDB6bTEyMi41IDMyYzMuNS0xMCA1LjUtMjAuOCA1LjUtMzIgMC01My00My05Ni05Ni05NnMtOTYgNDMtOTYgOTZjMCAxMS4yIDEuOSAyMiA1LjUgMzJsLTIxLjggMGMtMjguMyAwLTUzLjIgMTguNS02MS4zIDQ1LjZMMi40IDQ0MC4yQy44IDQ0NS40IDAgNDUwLjggMCA0NTYuMiAwIDQ4NyAyNSA1MTIgNTUuOCA1MTJsNDAwLjQgMGMzMC44IDAgNTUuOC0yNSA1NS44LTU1LjggMC01LjQtLjgtMTAuOC0yLjQtMTZsLTgwLTI2Ni41Yy04LjEtMjcuMS0zMy00NS42LTYxLjMtNDUuNmwtMjEuOCAweiJdCiAgICB9OwogICAgZmFEaWNlID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogImRpY2UiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjc5MjJdLCAiZjUyMiIsICJNMTQxLjQgMi4zQzEwMy04IDYzLjUgMTQuOCA1My4zIDUzLjJMMi41IDI0Mi43Qy03LjggMjgxLjEgMTUgMzIwLjYgNTMuNCAzMzAuOWwxODkuNSA1MC44YzM4LjQgMTAuMyA3Ny45LTEyLjUgODguMi01MC45bDUwLjgtMTg5LjVjMTAuMy0zOC40LTEyLjUtNzcuOS01MC45LTg4LjJMMTQxLjQgMi4zem0yMyAyMDUuN2EzMiAzMiAwIDEgMSA1NS40LTMyIDMyIDMyIDAgMSAxIC01NS40IDMyek03OS4yIDIyMC4zYTMyIDMyIDAgMSAxIDMyIDU1LjQgMzIgMzIgMCAxIDEgLTMyLTU1LjR6bTE4NSA5Ni40YTMyIDMyIDAgMSAxIC0zMi01NS40IDMyIDMyIDAgMSAxIDMyIDU1LjR6bTktMjA4LjRhMzIgMzIgMCAxIDEgMzIgNTUuNCAzMiAzMiAwIDEgMSAtMzItNTUuNHptLTEyMSAxNC40YTMyIDMyIDAgMSAxIC0zMi01NS40IDMyIDMyIDAgMSAxIDMyIDU1LjR6TTQxOCAxOTJMMzc3LjQgMzQzLjJjLTE3LjIgNjQtODMgMTAyLTE0NyA4NC45bC0zOC4zLTEwLjMgMCAzMC4yYzAgMzUuMyAyOC43IDY0IDY0IDY0bDE5MiAwYzM1LjMgMCA2NC0yOC43IDY0LTY0bDAtMTkyYzAtMzUuMy0yOC43LTY0LTY0LTY0TDQxOCAxOTJ6Il0KICAgIH07CiAgICBmYVNob3BTbGFzaCA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJzaG9wLXNsYXNoIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbInN0b3JlLWFsdC1zbGFzaCJdLCAiZTA3MCIsICJNNDEtMjQuOWMtOS40LTkuNC0yNC42LTkuNC0zMy45IDBTLTIuMy0uMyA3IDkuMWw1MjggNTI4YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwczkuNC0yNC42IDAtMzMuOWwtNTctNTcgMC0xOTAuM2MyNi44LTEuOSA0OC0yNC4zIDQ4LTUxLjYgMC04LTEuOS0xNi01LjUtMjMuMkw0OTcuNyA2Ny40QzQ4Ni44IDQ1LjcgNDY0LjcgMzIgNDQwLjQgMzJMMTM1LjYgMzJjLTEwLjcgMC0yMSAyLjctMzAuMiA3LjZMNDEtMjQuOXpNMzIxLjggMjU2TDQ0OCAyNTYgNDQ4IDM4Mi4yIDMyMS44IDI1NnpNMzUyIDQyMS44bC02NC02NCAwIDEwLjJjMCA4LjgtNy4yIDE2LTE2IDE2bC0xMjggMGMtOC44IDAtMTYtNy4yLTE2LTE2bDAtMTEyIDU4LjIgMC0xMzQuOC0xMzQuOC0yOS45IDU5LjljLTMuNiA3LjItNS41IDE1LjEtNS41IDIzLjIgMCAyNy4zIDIxLjIgNDkuNyA0OCA1MS42TDY0IDQzMmMwIDI2LjUgMjEuNSA0OCA0OCA0OGwxOTIgMGMyNi41IDAgNDgtMjEuNSA0OC00OGwwLTEwLjJ6Il0KICAgIH07CiAgICBmYVN0b3JlQWx0U2xhc2ggPSBmYVNob3BTbGFzaDsKICAgIGZhU29ydERvd24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic29ydC1kb3duIiwKICAgICAgaWNvbjogWzM4NCwgNTEyLCBbInNvcnQtZGVzYyJdLCAiZjBkZCIsICJNMzIgMjg4Yy0xMi45IDAtMjQuNiA3LjgtMjkuNiAxOS44Uy4yIDMzMy41IDkuNCAzNDIuNmwxNjAgMTYwYzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwbDE2MC0xNjBjOS4yLTkuMiAxMS45LTIyLjkgNi45LTM0LjlTMzY0LjkgMjg4IDM1MiAyODhMMzIgMjg4eiJdCiAgICB9OwogICAgZmFTb3J0RGVzYyA9IGZhU29ydERvd247CiAgICBmYVBlc2V0YVNpZ24gPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAicGVzZXRhLXNpZ24iLAogICAgICBpY29uOiBbNDQ4LCA1MTIsIFtdLCAiZTIyMSIsICJNMTEyIDMyQzk0LjMgMzIgODAgNDYuMyA4MCA2NGwwIDEwNC0yNCAwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHMxMC43IDI0IDI0IDI0bDI0IDAgMCAyMzJjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMmwwLTk2IDk2IDBjODAuMiAwIDE0Ni42LTU5IDE1OC4yLTEzNmwyNS44IDBjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTI1LjggMEMzODYuNiA5MSAzMjAuMiAzMiAyNDAgMzJMMTEyIDMyek0zMzMgMTY4bC0xODkgMCAwLTcyIDk2IDBjNDQuNyAwIDgyLjMgMzAuNiA5MyA3MnpNMTQ0IDIxNmwxODkgMGMtMTAuNyA0MS40LTQ4LjIgNzItOTMgNzJsLTk2IDAgMC03MnoiXQogICAgfTsKICAgIGZhVGFibGV0U2NyZWVuQnV0dG9uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInRhYmxldC1zY3JlZW4tYnV0dG9uIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbInRhYmxldC1hbHQiXSwgImYzZmEiLCAiTTAgNjRDMCAyOC43IDI4LjcgMCA2NCAwTDM4NCAwYzM1LjMgMCA2NCAyOC43IDY0IDY0bDAgMzg0YzAgMzUuMy0yOC43IDY0LTY0IDY0TDY0IDUxMmMtMzUuMyAwLTY0LTI4LjctNjQtNjRMMCA2NHpNMjU2IDQzMmEzMiAzMiAwIDEgMCAtNjQgMCAzMiAzMiAwIDEgMCA2NCAwek0zODQgNjRsLTMyMCAwIDAgMjg4IDMyMCAwIDAtMjg4eiJdCiAgICB9OwogICAgZmFUYWJsZXRBbHQgPSBmYVRhYmxldFNjcmVlbkJ1dHRvbjsKICAgIGZhSGFuZEhvbGRpbmdEb2xsYXIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1ob2xkaW5nLWRvbGxhciIsCiAgICAgIGljb246IFs1NzYsIDUxMiwgWyJoYW5kLWhvbGRpbmctdXNkIl0sICJmNGMwIiwgIk0yODgtMTZjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgMTItMS44IDBjLTM2LjYgMC02Ni4yIDI5LjctNjYuMiA2Ni4yIDAgMzMuNCAyNC45IDYxLjYgNTggNjUuN2w2MSA3LjZjNS4xIC42IDkgNSA5IDEwLjIgMCA1LjctNC42IDEwLjItMTAuMiAxMC4yTDI0MCAxODBjLTE1LjUgMC0yOCAxMi41LTI4IDI4czEyLjUgMjggMjggMjhsMjQgMCAwIDEyYzAgMTMuMyAxMC43IDI0IDI0IDI0czI0LTEwLjcgMjQtMjRsMC0xMiAxLjggMGMzNi42IDAgNjYuMi0yOS43IDY2LjItNjYuMiAwLTMzLjQtMjQuOS02MS42LTU4LTY1LjdsLTYxLTcuNmMtNS4xLS42LTktNS05LTEwLjIgMC01LjcgNC42LTEwLjIgMTAuMi0xMC4yTDMyOCA3NmMxNS41IDAgMjgtMTIuNSAyOC0yOHMtMTIuNS0yOC0yOC0yOGwtMTYgMCAwLTEyYzAtMTMuMy0xMC43LTI0LTI0LTI0ek0xMDkuMyAzNDEuNUw2Ni43IDM4NCAzMiAzODRjLTE3LjcgMC0zMiAxNC4zLTMyIDMybDAgNjRjMCAxNy43IDE0LjMgMzIgMzIgMzJsMzIwLjUgMGMyOSAwIDU3LjMtOS4zIDgwLjctMjYuNWwxMjYuNi05My4zYzE3LjgtMTMuMSAyMS42LTM4LjEgOC41LTU1LjlzLTM4LjEtMjEuNi01NS45LTguNUwzOTIuNiA0MTYgMjgwIDQxNmMtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNGw3MiAwYzE3LjcgMCAzMi0xNC4zIDMyLTMycy0xNC4zLTMyLTMyLTMybC0xNTIuMiAwYy0zMy45IDAtNjYuNSAxMy41LTkwLjUgMzcuNXoiXQogICAgfTsKICAgIGZhSGFuZEhvbGRpbmdVc2QgPSBmYUhhbmRIb2xkaW5nRG9sbGFyOwogICAgZmFTaGllbGQgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAic2hpZWxkIiwKICAgICAgaWNvbjogWzUxMiwgNTEyLCBbMTI4NzM3LCAic2hpZWxkLWJsYW5rIl0sICJmMTMyIiwgIk0yNTYgMGM0LjYgMCA5LjIgMSAxMy40IDIuOUw0NTcuOCA4Mi44YzIyIDkuMyAzOC40IDMxIDM4LjMgNTcuMi0uNSA5OS4yLTQxLjMgMjgwLjctMjEzLjYgMzYzLjItMTYuNyA4LTM2LjEgOC01Mi44IDAtMTcyLjQtODIuNS0yMTMuMS0yNjQtMjEzLjYtMzYzLjItLjEtMjYuMiAxNi4zLTQ3LjkgMzguMy01Ny4yTDI0Mi43IDIuOUMyNDYuOSAxIDI1MS40IDAgMjU2IDB6Il0KICAgIH07CiAgICBmYVNoaWVsZEJsYW5rID0gZmFTaGllbGQ7CiAgICBmYUZhY2VMYXVnaDIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiZmFjZS1sYXVnaCIsCiAgICAgIGljb246IFs1MTIsIDUxMiwgWyJsYXVnaCJdLCAiZjU5OSIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTEwMS42IDMxNGMtMy43LTEzLjcgNy41LTI2IDIxLjctMjZsMjY1LjQgMGMxNC4yIDAgMjUuNCAxMi4zIDIxLjcgMjYtMTguNSA2OC04MC42IDExOC0xNTQuNCAxMThTMTIwIDM4MiAxMDEuNiAzMTR6TTE0NCAxOTJhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHptMTkyLTMyYTMyIDMyIDAgMSAxIDAgNjQgMzIgMzIgMCAxIDEgMC02NHoiXQogICAgfTsKICAgIGZhTGF1Z2gyID0gZmFGYWNlTGF1Z2gyOwogICAgZmFIYW5kc0hvbGRpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZHMtaG9sZGluZyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgW10sICJmNGMyIiwgIk04MCAxMDRjMC0yMi4xLTE3LjktNDAtNDAtNDBTMCA4MS45IDAgMTA0TDAgMzI1LjVjMCAyNS41IDEwLjEgNDkuOSAyOC4xIDY3LjlMMTI4IDQ5My4zYzEyIDEyIDI4LjMgMTguNyA0NS4zIDE4LjdsNjYuNyAwYzI2LjUgMCA0OC0yMS41IDQ4LTQ4bDAtNzguOWMwLTI5LjctMTEuOC01OC4yLTMyLjgtNzkuMmwtMjUuMy0yNS4zIDAgMGMtNy4zLTcuMy0yMy4xLTIzLjEtNDcuMi00Ny4yLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zYzI0LjEgMjQuMSAzOS45IDM5LjkgNDcuMiA0Ny4yIDExIDExIDkuMiAyOS4yLTMuNyAzNy44LTkuNyA2LjUtMjIuNyA1LjItMzEtMy4xTDk4LjcgMzA5LjVjLTEyLTEyLTE4LjctMjguMy0xOC43LTQ1LjNMODAgMTA0em00ODAgMGwwIDE2MC4yYzAgMTctNi43IDMzLjMtMTguNyA0NS4zbC01MS4xIDUxLjFjLTguMyA4LjMtMjEuMyA5LjYtMzEgMy4xLTEyLjktOC42LTE0LjctMjYuOS0zLjctMzcuOCA3LjMtNy4zIDIzLjEtMjMuMSA0Ny4yLTQ3LjIgMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNzLTMyLjgtMTIuNS00NS4zIDBjLTI0LjEgMjQuMS0zOS45IDM5LjktNDcuMiA0Ny4ybDAgMC0yNS4zIDI1LjNjLTIxIDIxLTMyLjggNDkuNS0zMi44IDc5LjJsMCA3OC45YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4bDY2LjcgMGMxNyAwIDMzLjMtNi43IDQ1LjMtMTguN2w5OS45LTk5LjljMTgtMTggMjguMS00Mi40IDI4LjEtNjcuOUw2NDAgMTA0YzAtMjIuMS0xNy45LTQwLTQwLTQwcy00MCAxNy45LTQwIDQweiJdCiAgICB9OwogICAgZmFDYXJ0U2hvcHBpbmcgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiY2FydC1zaG9wcGluZyIsCiAgICAgIGljb246IFs2NDAsIDUxMiwgWzEyODcyMiwgInNob3BwaW5nLWNhcnQiXSwgImYwN2EiLCAiTTI0LTE2QzEwLjctMTYgMC01LjMgMCA4UzEwLjcgMzIgMjQgMzJsNDUuMyAwYzMuOSAwIDcuMiAyLjggNy45IDYuNmw1Mi4xIDI4Ni4zYzYuMiAzNC4yIDM2IDU5LjEgNzAuOCA1OS4xTDQ1NiAzODRjMTMuMyAwIDI0LTEwLjcgMjQtMjRzLTEwLjctMjQtMjQtMjRsLTI1NS45IDBjLTExLjYgMC0yMS41LTguMy0yMy42LTE5LjdsLTUuMS0yOC4zIDMwMy42IDBjMzAuOCAwIDU3LjItMjEuOSA2Mi45LTUyLjJMNTY4LjkgNjkuOUM1NzIuNiA1MC4yIDU1Ny41IDMyIDUzNy40IDMybC00MTIuNyAwLS40LTJjLTQuOC0yNi42LTI4LTQ2LTU1LjEtNDZMMjQtMTZ6TTIwOCA1MTJhNDggNDggMCAxIDAgMC05NiA0OCA0OCAwIDEgMCAwIDk2em0yMjQgMGE0OCA0OCAwIDEgMCAwLTk2IDQ4IDQ4IDAgMSAwIDAgOTZ6Il0KICAgIH07CiAgICBmYVNob3BwaW5nQ2FydCA9IGZhQ2FydFNob3BwaW5nOwogICAgZmFPY3RhZ29uID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogIm9jdGFnb24iLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxMjg3MjFdLCAiZjMwNiIsICJNMTg4LjYgLjFjLTE3IDAtMzMuMyA2LjctNDUuMyAxOC43TDE5LjIgMTQzQzcuMiAxNTUgLjUgMTcxLjIgLjUgMTg4LjJsMCAxMzUuNmMwIDE3IDYuNyAzMy4zIDE4LjcgNDUuM0wxNDMuNCA0OTMuMmMxMiAxMiAyOC4zIDE4LjcgNDUuMyAxOC43bDEzNS42IDBjMTcgMCAzMy4zLTYuNyA0NS4zLTE4LjdMNDkzLjYgMzY5YzEyLTEyIDE4LjctMjguMyAxOC43LTQ1LjNsMC0xMzUuNmMwLTE3LTYuNy0zMy4zLTE4LjctNDUuM0wzNjkuNSAxOC44Yy0xMi0xMi0yOC4zLTE4LjctNDUuMy0xOC43TDE4OC42IC4xeiJdCiAgICB9OwogICAgZmFIYW5kUG9pbnRlcjIgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaGFuZC1wb2ludGVyIiwKICAgICAgaWNvbjogWzQ0OCwgNTEyLCBbXSwgImYyNWEiLCAiTTEyOCA0MGMwLTIyLjEgMTcuOS00MCA0MC00MHM0MCAxNy45IDQwIDQwbDAgMTQ4LjJjOC41LTcuNiAxOS43LTEyLjIgMzItMTIuMiAyMC42IDAgMzguMiAxMyA0NSAzMS4yIDguOC05LjMgMjEuMi0xNS4yIDM1LTE1LjIgMjUuMyAwIDQ2IDE5LjUgNDcuOSA0NC4zIDguNS03LjcgMTkuOC0xMi4zIDMyLjEtMTIuMyAyNi41IDAgNDggMjEuNSA0OCA0OGwwIDExMmMwIDcwLjctNTcuMyAxMjgtMTI4IDEyOGwtODUuMyAwYy01IDAtOS45LS4zLTE0LjctMS01NS4zLTUuNi0xMDYuMi0zNC0xNDAtNzlMOCAzMzZjLTEzLjMtMTcuNy05LjctNDIuNyA4LTU2czQyLjctOS43IDU2IDhsNTYgNzQuNyAwLTMyMi43ek0yNDAgMzA0YzAtOC44LTcuMi0xNi0xNi0xNnMtMTYgNy4yLTE2IDE2bDAgOTZjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTk2em00OC0xNmMtOC44IDAtMTYgNy4yLTE2IDE2bDAgOTZjMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNmwwLTk2YzAtOC44LTcuMi0xNi0xNi0xNnptODAgMTZjMC04LjgtNy4yLTE2LTE2LTE2cy0xNiA3LjItMTYgMTZsMCA5NmMwIDguOCA3LjIgMTYgMTYgMTZzMTYtNy4yIDE2LTE2bDAtOTZ6Il0KICAgIH07CiAgICBmYVJlZ2lzdGVyZWQyID0gewogICAgICBwcmVmaXg6ICJmYXMiLAogICAgICBpY29uTmFtZTogInJlZ2lzdGVyZWQiLAogICAgICBpY29uOiBbNTEyLCA1MTIsIFsxNzRdLCAiZjI1ZCIsICJNMjU2IDUxMmEyNTYgMjU2IDAgMSAwIDAtNTEyIDI1NiAyNTYgMCAxIDAgMCA1MTJ6TTIwMCAxNDRsODAgMGMzOS44IDAgNzIgMzIuMiA3MiA3MiAwIDI4LjktMTcgNTMuOC00MS42IDY1LjNsMzAuMiA1MC4zYzYuOCAxMS40IDMuMSAyNi4xLTguMiAzMi45cy0yNi4xIDMuMS0zMi45LTguMmwtNDEtNjguMy0zNC40IDAgMCA1NmMwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGwwLTE3NmMwLTEzLjMgMTAuNy0yNCAyNC0yNHptNzIgOTZsOCAwYzEzLjMgMCAyNC0xMC43IDI0LTI0cy0xMC43LTI0LTI0LTI0bC01NiAwIDAgNDggNDggMHoiXQogICAgfTsKICAgIGZhSG91c2VTaWduYWwgPSB7CiAgICAgIHByZWZpeDogImZhcyIsCiAgICAgIGljb25OYW1lOiAiaG91c2Utc2lnbmFsIiwKICAgICAgaWNvbjogWzU3NiwgNTEyLCBbXSwgImUwMTIiLCAiTTUxNS45IDI0MGwtMTkuOSAwIDAgMTQ0YzAgMzUuMy0yOC43IDY0LTY0IDY0bC0xMzcgMGMtMjQtOTEuNy05My41LTE2NS0xODMtMTk0LjNsMC0xMy43LTE5LjkgMGMtMTUuNSAwLTI4LjEtMTIuNi0yOC4xLTI4LjEgMC03LjYgMy4xLTE0LjkgOC42LTIwLjJMMjc2LjUtNC45QzI4My45LTEyIDI5My43LTE2IDMwNC0xNnMyMC4xIDQgMjcuNSAxMS4xTDUzNS40IDE5MS43YzUuNSA1LjMgOC42IDEyLjYgOC42IDIwLjIgMCAxNS41LTEyLjYgMjguMS0yOC4xIDI4LjF6TTI4MCAxOTJjLTEzLjMgMC0yNCAxMC43LTI0IDI0bDAgNDhjMCAxMy4zIDEwLjcgMjQgMjQgMjRsNDggMGMxMy4zIDAgMjQtMTAuNyAyNC0yNGwwLTQ4YzAtMTMuMy0xMC43LTI0LTI0LTI0bC00OCAwek0yNCAyODhjMTI4LjEgMCAyMzIgMTAzLjkgMjMyIDIzMiAwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGMwLTEwMS42LTgyLjQtMTg0LTE4NC0xODQtMTMuMyAwLTI0LTEwLjctMjQtMjRzMTAuNy0yNCAyNC0yNHptOCAxOTJhMzIgMzIgMCAxIDEgMCA2NCAzMiAzMiAwIDEgMSAwLTY0ek0wIDQwOGMwLTEzLjMgMTAuNy0yNCAyNC0yNCA3NS4xIDAgMTM2IDYwLjkgMTM2IDEzNiAwIDEzLjMtMTAuNyAyNC0yNCAyNHMtMjQtMTAuNy0yNC0yNGMwLTQ4LjYtMzkuNC04OC04OC04OC0xMy4zIDAtMjQtMTAuNy0yNC0yNHoiXQogICAgfTsKICAgIGZhQmFuZ2xhZGVzaGlUYWthU2lnbiA9IHsKICAgICAgcHJlZml4OiAiZmFzIiwKICAgICAgaWNvbk5hbWU6ICJiYW5nbGFkZXNoaS10YWthLXNpZ24iLAogICAgICBpY29uOiBbMzg0LCA1MTIsIFtdLCAiZTJlNiIsICJNMzYgMzIuM0MxOC40IDMwLjEgMi40IDQyLjUgLjMgNjBTMTAuNSA5My42IDI4IDk1LjhsNy45IDFjMTYgMiAyOCAxNS42IDI4IDMxLjhsMCAzMS41LTQwIDBjLTEzLjMgMC0yNCAxMC43LTI0IDI0czEwLjcgMjQgMjQgMjRsNDAgMCAwIDE3NmMwIDUzIDQzIDk2IDk2IDk2bDMyIDBjMTA2IDAgMTkyLTg2IDE5Mi0xOTJsMC0zMmMwLTUzLTQzLTk2LTk2LTk2bC0xNiAwYy0xNy43IDAtMzIgMTQuMy0zMiAzMnMxNC4zIDMyIDMyIDMybDE2IDBjMTcuNyAwIDMyIDE0LjMgMzIgMzJsMCAzMmMwIDcwLjctNTcuMyAxMjgtMTI4IDEyOGwtMzIgMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJsMC0xNzYgNDAgMGMxMy4zIDAgMjQtMTAuNyAyNC0yNHMtMTAuNy0yNC0yNC0yNGwtNDAgMCAwLTMxLjVDMTI4IDgwLjEgOTIgMzkuMiA0My45IDMzLjJsLTcuOS0xeiJdCiAgICB9OwogICAgaWNvbnMzID0gewogICAgICBmYTAsCiAgICAgIGZhMSwKICAgICAgZmEyLAogICAgICBmYTMsCiAgICAgIGZhNCwKICAgICAgZmE1LAogICAgICBmYTYsCiAgICAgIGZhNywKICAgICAgZmE4LAogICAgICBmYTksCiAgICAgIGZhRG9sbGFyU2lnbiwKICAgICAgZmFEb2xsYXIsCiAgICAgIGZhVXNkLAogICAgICBmYURvZywKICAgICAgZmFUcnVja01vdmluZywKICAgICAgZmFSb3RhdGUsCiAgICAgIGZhU3luY0FsdCwKICAgICAgZmFTcXVhcmVNaW51czogZmFTcXVhcmVNaW51czIsCiAgICAgIGZhTWludXNTcXVhcmU6IGZhTWludXNTcXVhcmUyLAogICAgICBmYUFsaWduSnVzdGlmeSwKICAgICAgZmFDYWxlbmRhckNoZWNrOiBmYUNhbGVuZGFyQ2hlY2syLAogICAgICBmYUZhY2VLaXNzOiBmYUZhY2VLaXNzMiwKICAgICAgZmFLaXNzOiBmYUtpc3MyLAogICAgICBmYUtpdGNoZW5TZXQsCiAgICAgIGZhRG5hLAogICAgICBmYUNoaWxkUmVhY2hpbmcsCiAgICAgIGZhUGFzdGU6IGZhUGFzdGUyLAogICAgICBmYUZpbGVDbGlwYm9hcmQ6IGZhRmlsZUNsaXBib2FyZDIsCiAgICAgIGZhTWV0ZW9yLAogICAgICBmYUdlYXJzLAogICAgICBmYUNvZ3MsCiAgICAgIGZhRmlsZUNpcmNsZVBsdXMsCiAgICAgIGZhSWNpY2xlcywKICAgICAgZmFBcnJvd1RyZW5kVXAsCiAgICAgIGZhSGV4YWdvbk5vZGVzQm9sdCwKICAgICAgZmFRdWVzdGlvbiwKICAgICAgZmFIYW5kc0JvdW5kLAogICAgICBmYVBlcnNvbldhbGtpbmdMdWdnYWdlLAogICAgICBmYUZpbGVBcnJvd0Rvd24sCiAgICAgIGZhRmlsZURvd25sb2FkLAogICAgICBmYVBlcnNvbkJvb3RoLAogICAgICBmYUxvY3VzdCwKICAgICAgZmFSaWdodExvbmcsCiAgICAgIGZhTG9uZ0Fycm93QWx0UmlnaHQsCiAgICAgIGZhVHJ1Y2tEcm9wbGV0LAogICAgICBmYUhhbmRIb2xkaW5nTWVkaWNhbCwKICAgICAgZmFIYW5kUG9pbnRMZWZ0OiBmYUhhbmRQb2ludExlZnQyLAogICAgICBmYUNhbGN1bGF0b3IsCiAgICAgIGZhTWludXMsCiAgICAgIGZhU3VidHJhY3QsCiAgICAgIGZhQXJyb3dVcFpBLAogICAgICBmYVNvcnRBbHBoYVVwQWx0LAogICAgICBmYU1pY3JvcGhvbmVTbGFzaCwKICAgICAgZmFTcXVhcmVQZW4sCiAgICAgIGZhUGVuU3F1YXJlLAogICAgICBmYVBlbmNpbFNxdWFyZSwKICAgICAgZmFIYW5kRmlzdCwKICAgICAgZmFGaXN0UmFpc2VkLAogICAgICBmYUNvbW1lbnRTbXMsCiAgICAgIGZhU21zLAogICAgICBmYVNpbUNhcmQsCiAgICAgIGZhU2NhbGVCYWxhbmNlZCwKICAgICAgZmFCYWxhbmNlU2NhbGUsCiAgICAgIGZhQ2FyLAogICAgICBmYUF1dG9tb2JpbGUsCiAgICAgIGZhQ3JvcFNpbXBsZSwKICAgICAgZmFDcm9wQWx0LAogICAgICBmYU1lZGFsLAogICAgICBmYVNjcm9sbCwKICAgICAgZmFGaWxlRXhjZWw6IGZhRmlsZUV4Y2VsMiwKICAgICAgZmFGaWx0ZXIsCiAgICAgIGZhRHJ1bSwKICAgICAgZmFNYXBQaW4sCiAgICAgIGZhU2NhbGVVbmJhbGFuY2VkRmxpcCwKICAgICAgZmFCYWxhbmNlU2NhbGVSaWdodCwKICAgICAgZmFBcnJvd3NUb0NpcmNsZSwKICAgICAgZmFFbnZlbG9wZTogZmFFbnZlbG9wZTIsCiAgICAgIGZhQmFieSwKICAgICAgZmFTcXVhcmVDYXJldERvd246IGZhU3F1YXJlQ2FyZXREb3duMiwKICAgICAgZmFDYXJldFNxdWFyZURvd246IGZhQ2FyZXRTcXVhcmVEb3duMiwKICAgICAgZmFUZW50LAogICAgICBmYUEsCiAgICAgIGZhUGFyYWNodXRlQm94LAogICAgICBmYUNhcnRBcnJvd0Rvd24sCiAgICAgIGZhQnJpZGdlQ2lyY2xlRXhjbGFtYXRpb24sCiAgICAgIGZhQ2xvdWRBcnJvd1VwLAogICAgICBmYUNsb3VkVXBsb2FkLAogICAgICBmYUNsb3VkVXBsb2FkQWx0LAogICAgICBmYUF0LAogICAgICBmYUluZGlhblJ1cGVlU2lnbiwKICAgICAgZmFJbmRpYW5SdXBlZSwKICAgICAgZmFJbnIsCiAgICAgIGZhVHJ1Y2s6IGZhVHJ1Y2syLAogICAgICBmYUNoYWxrYm9hcmRVc2VyLAogICAgICBmYUNoYWxrYm9hcmRUZWFjaGVyLAogICAgICBmYVVzZXJDaGVjaywKICAgICAgZmFVc2VyTmluamEsCiAgICAgIGZhUGxhbnRXaWx0LAogICAgICBmYVdlaWdodFNjYWxlLAogICAgICBmYVdlaWdodCwKICAgICAgZmFDYXJldFJpZ2h0LAogICAgICBmYUZsb3JpblNpZ24sCiAgICAgIGZhQmVsbDogZmFCZWxsMiwKICAgICAgZmFMYXJpU2lnbiwKICAgICAgZmFNaWxsU2lnbiwKICAgICAgZmFQZXJzb25Tbm93Ym9hcmRpbmcsCiAgICAgIGZhU25vd2JvYXJkaW5nLAogICAgICBmYVR0eSwKICAgICAgZmFUZWxldHlwZSwKICAgICAgZmFVc2Vyc1JlY3RhbmdsZSwKICAgICAgZmFNb2JpbGUsCiAgICAgIGZhTW9iaWxlQW5kcm9pZCwKICAgICAgZmFNb2JpbGVQaG9uZSwKICAgICAgZmFBcnJvd3NUdXJuVG9Eb3RzLAogICAgICBmYUV4Y2xhbWF0aW9uLAogICAgICBmYUNodXJjaCwKICAgICAgZmFUb2dnbGVPZmYsCiAgICAgIGZhU2hvZVByaW50cywKICAgICAgZmFGaWxlQ2lyY2xlRXhjbGFtYXRpb24sCiAgICAgIGZhV2FsbGV0LAogICAgICBmYU1lc3NhZ2U6IGZhTWVzc2FnZTIsCiAgICAgIGZhQ29tbWVudEFsdDogZmFDb21tZW50QWx0MiwKICAgICAgZmFUcm9waHksCiAgICAgIGZhRmFjZURpenp5OiBmYUZhY2VEaXp6eTIsCiAgICAgIGZhRGl6enk6IGZhRGl6enkyLAogICAgICBmYUJhY3RlcmlhLAogICAgICBmYUVhckRlYWYsCiAgICAgIGZhRGVhZiwKICAgICAgZmFEZWFmbmVzcywKICAgICAgZmFIYXJkT2ZIZWFyaW5nLAogICAgICBmYVBlb3BsZUFycm93cywKICAgICAgZmFQZW9wbGVBcnJvd3NMZWZ0UmlnaHQsCiAgICAgIGZhSGFuZHNDbGFwcGluZywKICAgICAgZmFWaXJ1c0NvdmlkU2xhc2gsCiAgICAgIGZhQ2FsZW5kYXJEYXlzOiBmYUNhbGVuZGFyRGF5czIsCiAgICAgIGZhQ2FsZW5kYXJBbHQ6IGZhQ2FsZW5kYXJBbHQyLAogICAgICBmYURpYW1vbmRUdXJuUmlnaHQsCiAgICAgIGZhRGlyZWN0aW9ucywKICAgICAgZmFIYW5kUG9pbnRVcDogZmFIYW5kUG9pbnRVcDIsCiAgICAgIGZhQmV6aWVyQ3VydmUsCiAgICAgIGZhUGVyc29uSGFsZkRyZXNzLAogICAgICBmYVNxdWFyZVBvbGxIb3Jpem9udGFsLAogICAgICBmYVBvbGxILAogICAgICBmYVNjaG9vbENpcmNsZVhtYXJrLAogICAgICBmYUhhbmRMaXphcmQ6IGZhSGFuZExpemFyZDIsCiAgICAgIGZhQ2hhbGtib2FyZCwKICAgICAgZmFCbGFja2JvYXJkLAogICAgICBmYVVwUmlnaHRGcm9tU3F1YXJlLAogICAgICBmYUV4dGVybmFsTGlua0FsdCwKICAgICAgZmFTcXVhcmVGdWxsOiBmYVNxdWFyZUZ1bGwyLAogICAgICBmYUNsb3ZlciwKICAgICAgZmFUZWV0aE9wZW4sCiAgICAgIGZhQmFyc1N0YWdnZXJlZCwKICAgICAgZmFSZW9yZGVyLAogICAgICBmYVN0cmVhbSwKICAgICAgZmFXYXJlaG91c2UsCiAgICAgIGZhU3dhdGNoYm9vaywKICAgICAgZmFDYW1wZ3JvdW5kLAogICAgICBmYVBlcnNvbldhbGtpbmdBcnJvd1JpZ2h0LAogICAgICBmYUdsYXNzZXMsCiAgICAgIGZhQ2lyY2xlUGF1c2U6IGZhQ2lyY2xlUGF1c2UyLAogICAgICBmYVBhdXNlQ2lyY2xlOiBmYVBhdXNlQ2lyY2xlMiwKICAgICAgZmFNZW1vcnksCiAgICAgIGZhR2lmdCwKICAgICAgZmFNb25leUJpbGxXaGVhdCwKICAgICAgZmFEdW5nZW9uLAogICAgICBmYVN1aXRjYXNlTWVkaWNhbCwKICAgICAgZmFNZWRraXQsCiAgICAgIGZhUGVyc29uQ2FuZSwKICAgICAgZmFHYXVnZSwKICAgICAgZmFEYXNoYm9hcmQsCiAgICAgIGZhR2F1Z2VNZWQsCiAgICAgIGZhVGFjaG9tZXRlckFsdEF2ZXJhZ2UsCiAgICAgIGZhRW52ZWxvcGVPcGVuVGV4dCwKICAgICAgZmFUb29sYm94LAogICAgICBmYVBvd2VyT2ZmLAogICAgICBmYVNpZ25hbCwKICAgICAgZmFTaWduYWw1LAogICAgICBmYVNpZ25hbFBlcmZlY3QsCiAgICAgIGZhQXJyb3dzU3BpbiwKICAgICAgZmFKb2ludCwKICAgICAgZmFCcmFpbGxlLAogICAgICBmYUJhc2tldFNob3BwaW5nLAogICAgICBmYVNob3BwaW5nQmFza2V0LAogICAgICBmYUJyaWRnZSwKICAgICAgZmFQbGFuZUFycml2YWwsCiAgICAgIGZhQ2FzaFJlZ2lzdGVyLAogICAgICBmYVJpbmcsCiAgICAgIGZhQXF1YXJpdXMsCiAgICAgIGZhU2hhcmVOb2RlcywKICAgICAgZmFTaGFyZUFsdCwKICAgICAgZmFQZXJzb25DaXJjbGVFeGNsYW1hdGlvbiwKICAgICAgZmFCaW5vY3VsYXJzLAogICAgICBmYUtpcFNpZ24sCiAgICAgIGZhSGFyZERyaXZlOiBmYUhhcmREcml2ZTIsCiAgICAgIGZhSGRkOiBmYUhkZDIsCiAgICAgIGZhUmFua2luZ1N0YXIsCiAgICAgIGZhVXNlclRpZSwKICAgICAgZmFFbGxpcHNpcywKICAgICAgZmFFbGxpcHNpc0gsCiAgICAgIGZhU3RvcmVTbGFzaCwKICAgICAgZmFQZXJjZW50LAogICAgICBmYVBlcmNlbnRhZ2UsCiAgICAgIGZhRmlsZVppcHBlcjogZmFGaWxlWmlwcGVyMiwKICAgICAgZmFGaWxlQXJjaGl2ZTogZmFGaWxlQXJjaGl2ZTIsCiAgICAgIGZhRGlzcGxheSwKICAgICAgZmFJY29ucywKICAgICAgZmFIZWFydE11c2ljQ2FtZXJhQm9sdCwKICAgICAgZmFSdWxlclZlcnRpY2FsLAogICAgICBmYU1hcExvY2F0aW9uRG90LAogICAgICBmYU1hcE1hcmtlZEFsdCwKICAgICAgZmFIZWFydENyYWNrLAogICAgICBmYUhlYXJ0QnJva2VuLAogICAgICBmYUNvdywKICAgICAgZmFSc3MsCiAgICAgIGZhRmVlZCwKICAgICAgZmFNYWduaWZ5aW5nR2xhc3MsCiAgICAgIGZhU2VhcmNoLAogICAgICBmYUNsb3VkTW9vbiwKICAgICAgZmFCb3hlc1N0YWNrZWQsCiAgICAgIGZhQm94ZXMsCiAgICAgIGZhQm94ZXNBbHQsCiAgICAgIGZhQ29kZUJyYW5jaCwKICAgICAgZmFCYW4sCiAgICAgIGZhQ2FuY2VsLAogICAgICBmYUp1Z0RldGVyZ2VudCwKICAgICAgZmFSZXBseSwKICAgICAgZmFNYWlsUmVwbHksCiAgICAgIGZhU3VuUGxhbnRXaWx0LAogICAgICBmYUJhY3Rlcml1bSwKICAgICAgZmFSZWNvcmRWaW55bCwKICAgICAgZmFGbG9wcHlEaXNrOiBmYUZsb3BweURpc2syLAogICAgICBmYVNhdmU6IGZhU2F2ZTIsCiAgICAgIGZhVG9pbGV0c1BvcnRhYmxlLAogICAgICBmYU8sCiAgICAgIGZhUGFsZXR0ZSwKICAgICAgZmFVbmxvY2ssCiAgICAgIGZhRWFyTGlzdGVuLAogICAgICBmYUFzc2lzdGl2ZUxpc3RlbmluZ1N5c3RlbXMsCiAgICAgIGZhQ29kZVB1bGxSZXF1ZXN0LAogICAgICBmYUtleSwKICAgICAgZmFTa3VsbCwKICAgICAgZmFNYXJzU3Ryb2tlVXAsCiAgICAgIGZhTWFyc1N0cm9rZVYsCiAgICAgIGZhRmlyZUZsYW1lU2ltcGxlLAogICAgICBmYUJ1cm4sCiAgICAgIGZhVHJlZSwKICAgICAgZmFTbW9nLAogICAgICBmYVMsCiAgICAgIGZhSmVkaSwKICAgICAgZmFQZXJzb25IaWtpbmcsCiAgICAgIGZhSGlraW5nLAogICAgICBmYUFycm93c1VwVG9MaW5lLAogICAgICBmYU1hcnNEb3VibGUsCiAgICAgIGZhVGhlcm1vbWV0ZXIsCiAgICAgIGZhUGFpbnRicnVzaCwKICAgICAgZmFQYWludEJydXNoLAogICAgICBmYU5ldXRlciwKICAgICAgZmFTcXVhcmVQaG9uZUZsaXAsCiAgICAgIGZhUGhvbmVTcXVhcmVBbHQsCiAgICAgIGZhRmFjZUdyaW5Ub25ndWVTcXVpbnQ6IGZhRmFjZUdyaW5Ub25ndWVTcXVpbnQyLAogICAgICBmYUdyaW5Ub25ndWVTcXVpbnQ6IGZhR3JpblRvbmd1ZVNxdWludDIsCiAgICAgIGZhQ29tbWVudERvbGxhciwKICAgICAgZmFIaXBwbywKICAgICAgZmFCb3dsRm9vZCwKICAgICAgZmFTcXVhcmVWaXJ1cywKICAgICAgZmFDbG91ZFN1blJhaW4sCiAgICAgIGZhQXJyb3dSaWdodExvbmcsCiAgICAgIGZhTG9uZ0Fycm93UmlnaHQsCiAgICAgIGZhQnVpbGRpbmdVbiwKICAgICAgZmFUZW1wZXJhdHVyZUxvdywKICAgICAgZmFEb29yT3BlbiwKICAgICAgZmFBbGlnbkxlZnQsCiAgICAgIGZhQ2FtZXJhOiBmYUNhbWVyYTIsCiAgICAgIGZhQ2FtZXJhQWx0OiBmYUNhbWVyYUFsdDIsCiAgICAgIGZhVXNlcnNSYXlzLAogICAgICBmYVJhaW5ib3csCiAgICAgIGZhU2l0ZW1hcCwKICAgICAgZmFGYWNlR3JpblN0YXJzOiBmYUZhY2VHcmluU3RhcnMyLAogICAgICBmYUdyaW5TdGFyczogZmFHcmluU3RhcnMyLAogICAgICBmYVNvcnRVcCwKICAgICAgZmFTb3J0QXNjLAogICAgICBmYUV5ZTogZmFFeWUyLAogICAgICBmYUNhcmV0TGVmdCwKICAgICAgZmFBcHBsZVdob2xlLAogICAgICBmYUFwcGxlQWx0LAogICAgICBmYVNjcm9sbFRvcmFoLAogICAgICBmYVRvcmFoLAogICAgICBmYUhvdXNlTG9jaywKICAgICAgZmFBcnJvd3NMZWZ0UmlnaHRUb0xpbmUsCiAgICAgIGZhVHJhc2gsCiAgICAgIGZhRmFjZVNhZFRlYXI6IGZhRmFjZVNhZFRlYXIyLAogICAgICBmYVNhZFRlYXI6IGZhU2FkVGVhcjIsCiAgICAgIGZhRmF4LAogICAgICBmYVBlcnNvbkNpcmNsZVBsdXMsCiAgICAgIGZhSGFtc2EsCiAgICAgIGZhUGVyc29uQ2lyY2xlUXVlc3Rpb24sCiAgICAgIGZhQ2xpcGJvYXJkQ2hlY2ssCiAgICAgIGZhU2hhcmVGcm9tU3F1YXJlOiBmYVNoYXJlRnJvbVNxdWFyZTIsCiAgICAgIGZhU2hhcmVTcXVhcmU6IGZhU2hhcmVTcXVhcmUyLAogICAgICBmYVJlY2VpcHQsCiAgICAgIGZhRXF1YWxzLAogICAgICBmYUNoZXZyb25VcCwKICAgICAgZmFWaXJ1c1NsYXNoLAogICAgICBmYVNsYXNoLAogICAgICBmYUV4cGFuZCwKICAgICAgZmFOb3RlU3RpY2t5OiBmYU5vdGVTdGlja3kyLAogICAgICBmYVN0aWNreU5vdGU6IGZhU3RpY2t5Tm90ZTIsCiAgICAgIGZhVGFibGVDb2x1bW5zLAogICAgICBmYUNvbHVtbnMsCiAgICAgIGZhUGVyc29uU2hlbHRlciwKICAgICAgZmFDaXJjbGVOb3RjaCwKICAgICAgZmFXYXRlciwKICAgICAgZmFEZWxldGVMZWZ0LAogICAgICBmYUJhY2tzcGFjZSwKICAgICAgZmFCcm9vbUJhbGwsCiAgICAgIGZhUXVpZGRpdGNoLAogICAgICBmYVF1aWRkaXRjaEJyb29tQmFsbCwKICAgICAgZmFKLAogICAgICBmYVNodXR0bGVTcGFjZSwKICAgICAgZmFTcGFjZVNodXR0bGUsCiAgICAgIGZhWWluWWFuZywKICAgICAgZmFTdG9wLAogICAgICBmYVRyb3dlbCwKICAgICAgZmFIYW5kQmFja0Zpc3Q6IGZhSGFuZEJhY2tGaXN0MiwKICAgICAgZmFIYW5kUm9jazogZmFIYW5kUm9jazIsCiAgICAgIGZhVGVtcGVyYXR1cmVIaWdoLAogICAgICBmYUdyZWF0ZXJUaGFuLAogICAgICBmYUNydXRjaCwKICAgICAgZmFTZXB0YWdvbiwKICAgICAgZmFIZXB0YWdvbiwKICAgICAgZmFTdHJlZXRWaWV3LAogICAgICBmYVdhdmVTcXVhcmUsCiAgICAgIGZhQW5nbGVMZWZ0LAogICAgICBmYVNjcmV3ZHJpdmVyLAogICAgICBmYVRyYWN0b3IsCiAgICAgIGZhQnJpZGdlQ2lyY2xlWG1hcmssCiAgICAgIGZhVmlhbHMsCiAgICAgIGZhU3RldGhvc2NvcGUsCiAgICAgIGZhUG9kY2FzdCwKICAgICAgZmFBcnJvd1VwUmlnaHREb3RzLAogICAgICBmYUNoZXNzUXVlZW46IGZhQ2hlc3NRdWVlbjIsCiAgICAgIGZhQW5jaG9yQ2lyY2xlRXhjbGFtYXRpb24sCiAgICAgIGZhRWxsaXBzaXNWZXJ0aWNhbCwKICAgICAgZmFFbGxpcHNpc1YsCiAgICAgIGZhSGVhcnRDaXJjbGVFeGNsYW1hdGlvbiwKICAgICAgZmFCdWlsZGluZ0NpcmNsZUV4Y2xhbWF0aW9uLAogICAgICBmYVBlcnNvbkFycm93VXBGcm9tTGluZSwKICAgICAgZmFOb3RFcXVhbCwKICAgICAgZmFUcmFpblRyYW0sCiAgICAgIGZhUGxhbmVEZXBhcnR1cmUsCiAgICAgIGZhUmlnaHRUb0JyYWNrZXQsCiAgICAgIGZhU2lnbkluQWx0LAogICAgICBmYVNkQ2FyZCwKICAgICAgZmFIb3VzZUNpcmNsZUV4Y2xhbWF0aW9uLAogICAgICBmYVNoZWtlbFNpZ24sCiAgICAgIGZhSWxzLAogICAgICBmYVNoZWtlbCwKICAgICAgZmFTaGVxZWwsCiAgICAgIGZhU2hlcWVsU2lnbiwKICAgICAgZmFSYWRpbywKICAgICAgZmFIYW5kRG90cywKICAgICAgZmFBbGxlcmdpZXMsCiAgICAgIGZhQm9va1NrdWxsLAogICAgICBmYUJvb2tEZWFkLAogICAgICBmYVVubG9ja0tleWhvbGUsCiAgICAgIGZhVW5sb2NrQWx0LAogICAgICBmYUZpbGVBcnJvd1VwLAogICAgICBmYUZpbGVVcGxvYWQsCiAgICAgIGZhRmFjZUdyaW5UZWFyczogZmFGYWNlR3JpblRlYXJzMiwKICAgICAgZmFHcmluVGVhcnM6IGZhR3JpblRlYXJzMiwKICAgICAgZmFQZW5Ub1NxdWFyZTogZmFQZW5Ub1NxdWFyZTIsCiAgICAgIGZhRWRpdDogZmFFZGl0MiwKICAgICAgZmFFYXJ0aEV1cm9wZSwKICAgICAgZmFHbG9iZUV1cm9wZSwKICAgICAgZmFGYWNlR3JpbkJlYW1Td2VhdDogZmFGYWNlR3JpbkJlYW1Td2VhdDIsCiAgICAgIGZhR3JpbkJlYW1Td2VhdDogZmFHcmluQmVhbVN3ZWF0MiwKICAgICAgZmFDaXJjbGVIYWxmU3Ryb2tlLAogICAgICBmYUFkanVzdCwKICAgICAgZmFQZXJzb25NaWxpdGFyeVRvUGVyc29uLAogICAgICBmYVRhYmxlQ2VsbHNDb2x1bW5Mb2NrLAogICAgICBmYVRydWNrRmllbGRVbiwKICAgICAgZmFDbG9jazogZmFDbG9jazIsCiAgICAgIGZhQ2xvY2tGb3VyOiBmYUNsb2NrRm91cjIsCiAgICAgIGZhQm9vaywKICAgICAgZmFGYWNlTGF1Z2hXaW5rOiBmYUZhY2VMYXVnaFdpbmsyLAogICAgICBmYUxhdWdoV2luazogZmFMYXVnaFdpbmsyLAogICAgICBmYUNsb3VkTWVhdGJhbGwsCiAgICAgIGZhQ2hhcnRBcmVhLAogICAgICBmYUFyZWFDaGFydCwKICAgICAgZmFSdXBpYWhTaWduLAogICAgICBmYVRleHRXaWR0aCwKICAgICAgZmFTYXRlbGxpdGUsCiAgICAgIGZhTWFnbmlmeWluZ0dsYXNzTWludXMsCiAgICAgIGZhU2VhcmNoTWludXMsCiAgICAgIGZhUGVvcGxlR3JvdXAsCiAgICAgIGZhU3F1YXJlQmluYXJ5LAogICAgICBmYU1hc2tzVGhlYXRlciwKICAgICAgZmFUaGVhdGVyTWFza3MsCiAgICAgIGZhQ2FydFBsdXMsCiAgICAgIGZhSGFuZHNBc2xJbnRlcnByZXRpbmcsCiAgICAgIGZhQW1lcmljYW5TaWduTGFuZ3VhZ2VJbnRlcnByZXRpbmcsCiAgICAgIGZhQXNsSW50ZXJwcmV0aW5nLAogICAgICBmYUhhbmRzQW1lcmljYW5TaWduTGFuZ3VhZ2VJbnRlcnByZXRpbmcsCiAgICAgIGZhVGFibGVDZWxsc1Jvd1VubG9jaywKICAgICAgZmFSb2NrZXQsCiAgICAgIGZhU2hyaW1wLAogICAgICBmYVRlbmdlU2lnbiwKICAgICAgZmFUZW5nZSwKICAgICAgZmFIb3VzZUNoaW1uZXlNZWRpY2FsLAogICAgICBmYUNsaW5pY01lZGljYWwsCiAgICAgIGZhVXNlcnNTbGFzaCwKICAgICAgZmFQYXBlclBsYW5lOiBmYVBhcGVyUGxhbmUyLAogICAgICBmYUJvb2tBdGxhcywKICAgICAgZmFBdGxhcywKICAgICAgZmFUYWJsZSwKICAgICAgZmFIZWFydDogZmFIZWFydDIsCiAgICAgIGZhQ2lyY2xlQ2hldnJvblVwLAogICAgICBmYUNoZXZyb25DaXJjbGVVcCwKICAgICAgZmFCYXR0ZXJ5SGFsZiwKICAgICAgZmFCYXR0ZXJ5MywKICAgICAgZmFGb250QXdlc29tZTogZmFGb250QXdlc29tZTMsCiAgICAgIGZhRm9udEF3ZXNvbWVGbGFnOiBmYUZvbnRBd2Vzb21lRmxhZzMsCiAgICAgIGZhRm9udEF3ZXNvbWVMb2dvRnVsbDogZmFGb250QXdlc29tZUxvZ29GdWxsMywKICAgICAgZmFIYW5kY3VmZnMsCiAgICAgIGZhSGF0Q293Ym95U2lkZSwKICAgICAgZmFJbmR1c3RyeSwKICAgICAgZmFMaW5lc0xlYW5pbmcsCiAgICAgIGZhUGFzc3BvcnQsCiAgICAgIGZhSW5maW5pdHksCiAgICAgIGZhQ2xvbmU6IGZhQ2xvbmUyLAogICAgICBmYUZvcndhcmQsCiAgICAgIGZhTSwKICAgICAgZmFSb2FkU3Bpa2VzLAogICAgICBmYU1vdW50YWluLAogICAgICBmYUNoZXNzLAogICAgICBmYVRlbXBlcmF0dXJlVGhyZWVRdWFydGVycywKICAgICAgZmFUZW1wZXJhdHVyZTMsCiAgICAgIGZhVGhlcm1vbWV0ZXIzLAogICAgICBmYVRoZXJtb21ldGVyVGhyZWVRdWFydGVycywKICAgICAgZmFCLAogICAgICBmYVNoaWVsZFZpcnVzLAogICAgICBmYUxpdGVjb2luU2lnbiwKICAgICAgZmFEaWNlRDYsCiAgICAgIGZhR3JpcExpbmVzVmVydGljYWwsCiAgICAgIGZhR29sZkJhbGxUZWUsCiAgICAgIGZhR29sZkJhbGwsCiAgICAgIGZhSGV4YWdvbiwKICAgICAgZmFGb2xkZXJPcGVuOiBmYUZvbGRlck9wZW4yLAogICAgICBmYUthYWJhLAogICAgICBmYUhhbmRIb2xkaW5nLAogICAgICBmYVNpbmdsZVF1b3RlUmlnaHQsCiAgICAgIGZhQm90dGxlRHJvcGxldCwKICAgICAgZmFXaW5kb3dNaW5pbWl6ZTogZmFXaW5kb3dNaW5pbWl6ZTIsCiAgICAgIGZhQ2hldnJvblJpZ2h0LAogICAgICBmYUVnZywKICAgICAgZmFMYW5kbWFya0RvbWUsCiAgICAgIGZhTGFuZG1hcmtBbHQsCiAgICAgIGZhV29ybSwKICAgICAgZmFVc2VySW5qdXJlZCwKICAgICAgZmFTdHJpa2V0aHJvdWdoLAogICAgICBmYUJsb2csCiAgICAgIGZhU3RvcHdhdGNoMjAsCiAgICAgIGZhVHJ1Y2tQaWNrdXAsCiAgICAgIGZhU2VlZGxpbmcsCiAgICAgIGZhU3Byb3V0LAogICAgICBmYVRyYW5zZ2VuZGVyLAogICAgICBmYVRyYW5zZ2VuZGVyQWx0LAogICAgICBmYVN0YXJIYWxmOiBmYVN0YXJIYWxmMiwKICAgICAgZmFQaG90b0ZpbG0sCiAgICAgIGZhUGhvdG9WaWRlbywKICAgICAgZmFQaWN0dXJlSW5QaWN0dXJlLAogICAgICBmYVB1bXBNZWRpY2FsLAogICAgICBmYUZpcmUsCiAgICAgIGZhTWFnbmlmeWluZ0dsYXNzUGx1cywKICAgICAgZmFTZWFyY2hQbHVzLAogICAgICBmYUZsYXNrLAogICAgICBmYUFsaWduUmlnaHQsCiAgICAgIGZhQ2FibGVDYXIsCiAgICAgIGZhVHJhbSwKICAgICAgZmFLaXRNZWRpY2FsLAogICAgICBmYUZpcnN0QWlkLAogICAgICBmYUdyaXBMaW5lcywKICAgICAgZmFCdXJnZXIsCiAgICAgIGZhSGFtYnVyZ2VyLAogICAgICBmYVNub3dtYW4sCiAgICAgIGZhSG90ZWwsCiAgICAgIGZhUHJpbnQsCiAgICAgIGZhVm9sbGV5YmFsbCwKICAgICAgZmFWb2xsZXliYWxsQmFsbCwKICAgICAgZmFUcmFmZmljTGlnaHQsCiAgICAgIGZhUGxhbmVDaXJjbGVDaGVjaywKICAgICAgZmFVc2VycywKICAgICAgZmFDZXJ0aWZpY2F0ZSwKICAgICAgZmFBbGFybUNsb2NrOiBmYUFsYXJtQ2xvY2syLAogICAgICBmYUhlbGljb3B0ZXJTeW1ib2wsCiAgICAgIGZhSG91c2VDaGltbmV5Q3JhY2ssCiAgICAgIGZhSG91c2VEYW1hZ2UsCiAgICAgIGZhUGVyc29uTWlsaXRhcnlQb2ludGluZywKICAgICAgZmFEYXRhYmFzZSwKICAgICAgZmFOZXdzcGFwZXI6IGZhTmV3c3BhcGVyMiwKICAgICAgZmFDbG91ZFJhaW4sCiAgICAgIGZhTWF4aW1pemUsCiAgICAgIGZhRXhwYW5kQXJyb3dzQWx0LAogICAgICBmYUxvY2F0aW9uQXJyb3csCiAgICAgIGZhQ2l0eSwKICAgICAgZmFYUmF5LAogICAgICBmYVVtYnJlbGxhQmVhY2gsCiAgICAgIGZhQXJyb3dSaWdodFRvQnJhY2tldCwKICAgICAgZmFTaWduSW4sCiAgICAgIGZhSGVhZHNldCwKICAgICAgZmFTcGxvdGNoLAogICAgICBmYVVwTG9uZywKICAgICAgZmFMb25nQXJyb3dBbHRVcCwKICAgICAgZmFIZXhhZ29uTm9kZXMsCiAgICAgIGZhSG9zcGl0YWw6IGZhSG9zcGl0YWwyLAogICAgICBmYUhvc3BpdGFsQWx0OiBmYUhvc3BpdGFsQWx0MiwKICAgICAgZmFIb3NwaXRhbFdpZGU6IGZhSG9zcGl0YWxXaWRlMiwKICAgICAgZmFQZXJzb25IYXJhc3NpbmcsCiAgICAgIGZhTW9uZXlCaWxsVHJlbmRVcCwKICAgICAgZmFQZW5SdWxlciwKICAgICAgZmFQZW5jaWxSdWxlciwKICAgICAgZmFSZXBlYXQsCiAgICAgIGZhQm9uZSwKICAgICAgZmFGaXJlRmxhbWVDdXJ2ZWQsCiAgICAgIGZhRmlyZUFsdCwKICAgICAgZmFCdXNTaW1wbGUsCiAgICAgIGZhQnVzQWx0LAogICAgICBmYVZlbnVzTWFycywKICAgICAgZmFCbGVuZGVyLAogICAgICBmYVUsCiAgICAgIGZhU2hhcmUsCiAgICAgIGZhTWFpbEZvcndhcmQsCiAgICAgIGZhUGhvbmVGbGlwLAogICAgICBmYVBob25lQWx0LAogICAgICBmYVRvaWxldFBvcnRhYmxlLAogICAgICBmYVBlcnNvblByZWduYW50LAogICAgICBmYUxlc3NUaGFuLAogICAgICBmYVN1cGVyc2NyaXB0LAogICAgICBmYUNpcmNsZVN0b3A6IGZhQ2lyY2xlU3RvcDIsCiAgICAgIGZhU3RvcENpcmNsZTogZmFTdG9wQ2lyY2xlMiwKICAgICAgZmFBcnJvd3NVcERvd24sCiAgICAgIGZhQXJyb3dzViwKICAgICAgZmFQb29TdG9ybSwKICAgICAgZmFQb29Cb2x0LAogICAgICBmYVZpZGVvU2xhc2gsCiAgICAgIGZhU3F1YXJlWG1hcmssCiAgICAgIGZhVGltZXNTcXVhcmUsCiAgICAgIGZhWG1hcmtTcXVhcmUsCiAgICAgIGZhSGFuZEhvbGRpbmdEcm9wbGV0LAogICAgICBmYUhhbmRIb2xkaW5nV2F0ZXIsCiAgICAgIGZhV29uU2lnbiwKICAgICAgZmFLcncsCiAgICAgIGZhV29uLAogICAgICBmYU9iamVjdFVuZ3JvdXA6IGZhT2JqZWN0VW5ncm91cDIsCiAgICAgIGZhQ29tbWVudDogZmFDb21tZW50MiwKICAgICAgZmFIaWxsQXZhbGFuY2hlLAogICAgICBmYUFycm93c1RvRXllLAogICAgICBmYVNub3dwbG93LAogICAgICBmYUNoYXJ0R2FudHQsCiAgICAgIGZhVmlkZW8sCiAgICAgIGZhVmlkZW9DYW1lcmEsCiAgICAgIGZhQ2hlc3NQYXduOiBmYUNoZXNzUGF3bjIsCiAgICAgIGZhU3luYWdvZ3VlLAogICAgICBmYUJ1aWxkaW5nQ2lyY2xlQ2hlY2ssCiAgICAgIGZhQ2FsZW5kYXJQbHVzOiBmYUNhbGVuZGFyUGx1czIsCiAgICAgIGZhV2hlZWxjaGFpck1vdmUsCiAgICAgIGZhV2hlZWxjaGFpckFsdCwKICAgICAgZmFVc2VyU2hpZWxkLAogICAgICBmYUJvbGQsCiAgICAgIGZhSGVhcnRQdWxzZSwKICAgICAgZmFIZWFydGJlYXQsCiAgICAgIGZhU3F1YXJlUm9vdFZhcmlhYmxlLAogICAgICBmYVNxdWFyZVJvb3RBbHQsCiAgICAgIGZhSGFuZHNCdWJibGVzLAogICAgICBmYUhhbmRzV2FzaCwKICAgICAgZmFNYXJrZXIsCiAgICAgIGZhQ2xpcGJvYXJkOiBmYUNsaXBib2FyZDIsCiAgICAgIGZhUGxhY2VPZldvcnNoaXAsCiAgICAgIGZhQ2FubmFiaXMsCiAgICAgIGZhUGVvcGxlUm9vZiwKICAgICAgZmFEaXNlYXNlLAogICAgICBmYUJvb2tCaWJsZSwKICAgICAgZmFCaWJsZSwKICAgICAgZmFDaGVzc0JvYXJkLAogICAgICBmYU1hcnMsCiAgICAgIGZhTGFwdG9wLAogICAgICBmYVVzZXJYbWFyaywKICAgICAgZmFVc2VyVGltZXMsCiAgICAgIGZhRmxhZ1VzYSwKICAgICAgZmFIYW5kTWlkZGxlRmluZ2VyLAogICAgICBmYU1vcnRhclBlc3RsZSwKICAgICAgZmFIZWFkU2lkZUNvdWdoLAogICAgICBmYVBsYW5lTG9jaywKICAgICAgZmFCYXR0ZXJ5VGhyZWVRdWFydGVycywKICAgICAgZmFCYXR0ZXJ5NCwKICAgICAgZmFGcmFuY1NpZ24sCiAgICAgIGZhRmlsdGVyQ2lyY2xlRG9sbGFyLAogICAgICBmYUZ1bm5lbERvbGxhciwKICAgICAgZmFDaGVlc2UsCiAgICAgIGZhQ2lyY2xlSCwKICAgICAgZmFIb3NwaXRhbFN5bWJvbCwKICAgICAgZmFTY2hvb2wsCiAgICAgIGZhRGljZUZpdmUsCiAgICAgIGZhVG9ybmFkbywKICAgICAgZmFKZXRGaWdodGVyLAogICAgICBmYUZpZ2h0ZXJKZXQsCiAgICAgIGZhVGh1bWJzRG93bjogZmFUaHVtYnNEb3duMiwKICAgICAgZmFCcm9vbSwKICAgICAgZmFGaWxlSW1wb3J0LAogICAgICBmYUFycm93UmlnaHRUb0ZpbGUsCiAgICAgIGZhVXRlbnNpbHMsCiAgICAgIGZhQ3V0bGVyeSwKICAgICAgZmFJZEJhZGdlOiBmYUlkQmFkZ2UyLAogICAgICBmYVNwaWRlciwKICAgICAgZmFNb2JpbGVSZXRybywKICAgICAgZmFTaWduc1Bvc3QsCiAgICAgIGZhTWFwU2lnbnMsCiAgICAgIGZhR3JvdXBBcnJvd3NSb3RhdGUsCiAgICAgIGZhQXJyb3dzU3BsaXRVcEFuZExlZnQsCiAgICAgIGZhRmlsbERyaXAsCiAgICAgIGZhU2hpZWxkSGVhcnQsCiAgICAgIGZhUGVyc29uU2tpaW5nTm9yZGljLAogICAgICBmYVNraWluZ05vcmRpYywKICAgICAgZmFTcXVhcmVDaGVjazogZmFTcXVhcmVDaGVjazIsCiAgICAgIGZhQ2hlY2tTcXVhcmU6IGZhQ2hlY2tTcXVhcmUyLAogICAgICBmYUJhdGgsCiAgICAgIGZhQmF0aHR1YiwKICAgICAgZmFDaGVzc0Jpc2hvcDogZmFDaGVzc0Jpc2hvcDIsCiAgICAgIGZhUHJlc2NyaXB0aW9uQm90dGxlTWVkaWNhbCwKICAgICAgZmFQcmVzY3JpcHRpb25Cb3R0bGVBbHQsCiAgICAgIGZhRHJhd1BvbHlnb24sCiAgICAgIGZhVmVjdG9yUG9seWdvbiwKICAgICAgZmFJQ3Vyc29yLAogICAgICBmYUhlYXJ0Q2lyY2xlUGx1cywKICAgICAgZmFTaGllbGREb2csCiAgICAgIGZhR3JlYXRlclRoYW5FcXVhbCwKICAgICAgZmFFbnZlbG9wZU9wZW46IGZhRW52ZWxvcGVPcGVuMiwKICAgICAgZmFNb3VuZCwKICAgICAgZmFWb2ljZW1haWwsCiAgICAgIGZhVmVzdCwKICAgICAgZmFBdWRpb0Rlc2NyaXB0aW9uLAogICAgICBmYVcsCiAgICAgIGZhRXllRHJvcHBlciwKICAgICAgZmFFeWVEcm9wcGVyRW1wdHksCiAgICAgIGZhRXllZHJvcHBlciwKICAgICAgZmFDaXJjbGVYbWFyazogZmFDaXJjbGVYbWFyazIsCiAgICAgIGZhVGltZXNDaXJjbGU6IGZhVGltZXNDaXJjbGUyLAogICAgICBmYVhtYXJrQ2lyY2xlOiBmYVhtYXJrQ2lyY2xlMiwKICAgICAgZmFUcmFpbGVyLAogICAgICBmYVR1cmtpc2hMaXJhU2lnbiwKICAgICAgZmFUcnksCiAgICAgIGZhVHVya2lzaExpcmEsCiAgICAgIGZhVm9sY2FubywKICAgICAgZmFXYW5kU3BhcmtsZXMsCiAgICAgIGZhTWljcm9waG9uZSwKICAgICAgZmFDcm93biwKICAgICAgZmFUZW50QXJyb3dUdXJuTGVmdCwKICAgICAgZmFUcnVja0Zhc3QsCiAgICAgIGZhU2hpcHBpbmdGYXN0LAogICAgICBmYVVzZXJQZW4sCiAgICAgIGZhVXNlckVkaXQsCiAgICAgIGZhVXNlckNsb2NrLAogICAgICBmYVNob3dlciwKICAgICAgZmFTcXVhcmVDYXJldFVwOiBmYVNxdWFyZUNhcmV0VXAyLAogICAgICBmYUNhcmV0U3F1YXJlVXA6IGZhQ2FyZXRTcXVhcmVVcDIsCiAgICAgIGZhTWFwTG9jYXRpb24sCiAgICAgIGZhTWFwTWFya2VkLAogICAgICBmYVBlbkZhbmN5LAogICAgICBmYUV1cm9TaWduLAogICAgICBmYUV1ciwKICAgICAgZmFFdXJvLAogICAgICBmYUhvdXNlQ2lyY2xlWG1hcmssCiAgICAgIGZhTGlyYVNpZ24sCiAgICAgIGZhWWVuU2lnbiwKICAgICAgZmFDbnksCiAgICAgIGZhSnB5LAogICAgICBmYVJtYiwKICAgICAgZmFZZW4sCiAgICAgIGZhQm94T3BlbiwKICAgICAgZmFUcnVja0ZpZWxkLAogICAgICBmYUxvY2F0aW9uUGluTG9jaywKICAgICAgZmFQZXJzb25QcmF5aW5nLAogICAgICBmYVByYXksCiAgICAgIGZhQ2xpcGJvYXJkTGlzdCwKICAgICAgZmFTYWNrRG9sbGFyLAogICAgICBmYU1vdW50YWluU3VuLAogICAgICBmYUFycm93VXBXaWRlU2hvcnQsCiAgICAgIGZhU29ydEFtb3VudFVwLAogICAgICBmYVVzZXJzTGluZSwKICAgICAgZmFTdGFyT2ZEYXZpZCwKICAgICAgZmFOb3Rlc01lZGljYWwsCiAgICAgIGZhQXVzdHJhbFNpZ24sCiAgICAgIGZhQ2xpcGJvYXJkVXNlciwKICAgICAgZmFGaWxlSW1hZ2U6IGZhRmlsZUltYWdlMiwKICAgICAgZmFTcXVhcmVDYXJldFJpZ2h0OiBmYVNxdWFyZUNhcmV0UmlnaHQyLAogICAgICBmYUNhcmV0U3F1YXJlUmlnaHQ6IGZhQ2FyZXRTcXVhcmVSaWdodDIsCiAgICAgIGZhVmlhbCwKICAgICAgZmFIZWxpY29wdGVyLAogICAgICBmYU1pdHRlbiwKICAgICAgZmFHYXNQdW1wLAogICAgICBmYUVudmVsb3BlQ2lyY2xlQ2hlY2ssCiAgICAgIGZhUGVyc29uU2thdGluZywKICAgICAgZmFTa2F0aW5nLAogICAgICBmYVN1bjogZmFTdW4yLAogICAgICBmYUJhc2ViYWxsLAogICAgICBmYUJhc2ViYWxsQmFsbCwKICAgICAgZmFJbWFnZTogZmFJbWFnZTIsCiAgICAgIGZhTm90ZGVmLAogICAgICBmYUJhc2tldGJhbGwsCiAgICAgIGZhQmFza2V0YmFsbEJhbGwsCiAgICAgIGZhUGVuY2lsLAogICAgICBmYVBlbmNpbEFsdCwKICAgICAgZmFQZXJzb25XYWxraW5nQXJyb3dMb29wTGVmdCwKICAgICAgZmFEaWNlU2l4LAogICAgICBmYUFuZ2xlc0Rvd24sCiAgICAgIGZhQW5nbGVEb3VibGVEb3duLAogICAgICBmYVN5cmluZ2UsCiAgICAgIGZhV2hlYXRBd24sCiAgICAgIGZhV2hlYXRBbHQsCiAgICAgIGZhUGxhbmVVcCwKICAgICAgZmFBbGlnbkNlbnRlciwKICAgICAgZmFIb2NrZXlQdWNrLAogICAgICBmYUNpcmNsZUFycm93TGVmdCwKICAgICAgZmFBcnJvd0NpcmNsZUxlZnQsCiAgICAgIGZhUGx1Z0NpcmNsZUJvbHQsCiAgICAgIGZhUmVzdHJvb20sCiAgICAgIGZhQW5jaG9yTG9jaywKICAgICAgZmFUaW1lbGluZSwKICAgICAgZmFMaWdodGJ1bGI6IGZhTGlnaHRidWxiMiwKICAgICAgZmFDaXJjbGVBcnJvd1JpZ2h0LAogICAgICBmYUFycm93Q2lyY2xlUmlnaHQsCiAgICAgIGZhTWFyc0FuZFZlbnVzLAogICAgICBmYU5ldHdvcmtXaXJlZCwKICAgICAgZmFCdWlsZGluZ1NoaWVsZCwKICAgICAgZmFDb2RlLAogICAgICBmYUZlYXRoZXJQb2ludGVkLAogICAgICBmYUZlYXRoZXJBbHQsCiAgICAgIGZhRmlsZUNpcmNsZVF1ZXN0aW9uLAogICAgICBmYVNpZ25hdHVyZSwKICAgICAgZmFFYXJ0aEFtZXJpY2FzLAogICAgICBmYUVhcnRoLAogICAgICBmYUVhcnRoQW1lcmljYSwKICAgICAgZmFHbG9iZUFtZXJpY2FzLAogICAgICBmYUNhcnJvdCwKICAgICAgZmFUZW1wZXJhdHVyZUZ1bGwsCiAgICAgIGZhVGVtcGVyYXR1cmU0LAogICAgICBmYVRoZXJtb21ldGVyNCwKICAgICAgZmFUaGVybW9tZXRlckZ1bGwsCiAgICAgIGZhVGFibGVDZWxsc1Jvd0xvY2ssCiAgICAgIGZhQm9sdExpZ2h0bmluZywKICAgICAgZmFDbG91ZFNob3dlcnNXYXRlciwKICAgICAgZmFBcnJvd1VwTG9uZywKICAgICAgZmFMb25nQXJyb3dVcCwKICAgICAgZmFBZGRyZXNzQ2FyZDogZmFBZGRyZXNzQ2FyZDIsCiAgICAgIGZhQ29udGFjdENhcmQ6IGZhQ29udGFjdENhcmQyLAogICAgICBmYVZjYXJkOiBmYVZjYXJkMiwKICAgICAgZmFBbmdsZVJpZ2h0LAogICAgICBmYUZhY2VNZWg6IGZhRmFjZU1laDIsCiAgICAgIGZhTWVoOiBmYU1laDIsCiAgICAgIGZhQXJyb3dVcEZyb21Hcm91bmRXYXRlciwKICAgICAgZmFNYXA6IGZhTWFwMiwKICAgICAgZmFVc2VyUGx1cywKICAgICAgZmFWZW51cywKICAgICAgZmFEaWFncmFtU3VjY2Vzc29yLAogICAgICBmYUhlYWRTaWRlQ291Z2hTbGFzaCwKICAgICAgZmFEaWFncmFtUHJvamVjdCwKICAgICAgZmFQcm9qZWN0RGlhZ3JhbSwKICAgICAgZmFUZXJtaW5hbCwKICAgICAgZmFIb3VzZUZpcmUsCiAgICAgIGZhTWFzaywKICAgICAgZmFIdXJyaWNhbmUsCiAgICAgIGZhRWFydGhBZnJpY2EsCiAgICAgIGZhR2xvYmVBZnJpY2EsCiAgICAgIGZhVGh1bWJ0YWNrLAogICAgICBmYVRodW1iVGFjaywKICAgICAgZmFIYW5kUG9pbnREb3duOiBmYUhhbmRQb2ludERvd24yLAogICAgICBmYUZhY2VNZWhCbGFuazogZmFGYWNlTWVoQmxhbmsyLAogICAgICBmYU1laEJsYW5rOiBmYU1laEJsYW5rMiwKICAgICAgZmFUZW1wZXJhdHVyZUVtcHR5LAogICAgICBmYVRlbXBlcmF0dXJlMCwKICAgICAgZmFUaGVybW9tZXRlcjAsCiAgICAgIGZhVGhlcm1vbWV0ZXJFbXB0eSwKICAgICAgZmFCb3JkZXJOb25lLAogICAgICBmYUhpZ2hsaWdodGVyLAogICAgICBmYU1vbmV5QmlsbFdhdmUsCiAgICAgIGZhVG9pbGV0UGFwZXJTbGFzaCwKICAgICAgZmFGaWxlU2hpZWxkLAogICAgICBmYVRleHRIZWlnaHQsCiAgICAgIGZhRmFjZUdyaW5Ub25ndWU6IGZhRmFjZUdyaW5Ub25ndWUyLAogICAgICBmYUdyaW5Ub25ndWU6IGZhR3JpblRvbmd1ZTIsCiAgICAgIGZhRmlsZVNpZ25hdHVyZSwKICAgICAgZmFCdWlsZGluZ1doZWF0LAogICAgICBmYVBsdWdDaXJjbGVNaW51cywKICAgICAgZmFGdXRib2w6IGZhRnV0Ym9sMiwKICAgICAgZmFGdXRib2xCYWxsOiBmYUZ1dGJvbEJhbGwyLAogICAgICBmYVNvY2NlckJhbGw6IGZhU29jY2VyQmFsbDIsCiAgICAgIGZhQ2lyY2xlUGx1cywKICAgICAgZmFQbHVzQ2lyY2xlLAogICAgICBmYUJyYXppbGlhblJlYWxTaWduLAogICAgICBmYVN0YXJBbmRDcmVzY2VudCwKICAgICAgZmFGYWNlU3VycHJpc2U6IGZhRmFjZVN1cnByaXNlMiwKICAgICAgZmFTdXJwcmlzZTogZmFTdXJwcmlzZTIsCiAgICAgIGZhSG9zcGl0YWxVc2VyLAogICAgICBmYUFycm93RG93blVwTG9jaywKICAgICAgZmFGb2xkZXI6IGZhRm9sZGVyMiwKICAgICAgZmFGb2xkZXJCbGFuazogZmFGb2xkZXJCbGFuazIsCiAgICAgIGZhSG9sbHlCZXJyeSwKICAgICAgZmFWZW51c0RvdWJsZSwKICAgICAgZmFDbGlwYm9hcmRRdWVzdGlvbiwKICAgICAgZmFIb3Rkb2csCiAgICAgIGZhQXJyb3dVcEZyb21CcmFja2V0LAogICAgICBmYU1pY3Jvc2NvcGUsCiAgICAgIGZhQ2xvdWQ6IGZhQ2xvdWQyLAogICAgICBmYUJhc2ViYWxsQmF0QmFsbCwKICAgICAgZmFDYXJSZWFyLAogICAgICBmYUNhckFsdCwKICAgICAgZmFUaHVtYnRhY2tTbGFzaCwKICAgICAgZmFUaHVtYlRhY2tTbGFzaCwKICAgICAgZmFQbHVzTWludXMsCiAgICAgIGZhSG91c2VDaXJjbGVDaGVjaywKICAgICAgZmFDYWxlbmRhckRheSwKICAgICAgZmFMaWJyYSwKICAgICAgZmFDaXJjbGU6IGZhQ2lyY2xlMiwKICAgICAgZmFNb2JpbGVWaWJyYXRlLAogICAgICBmYUZhY2VHcmluU3F1aW50OiBmYUZhY2VHcmluU3F1aW50MiwKICAgICAgZmFHcmluU3F1aW50OiBmYUdyaW5TcXVpbnQyLAogICAgICBmYVVzZXJzQmV0d2VlbkxpbmVzLAogICAgICBmYUhvdXNlTWVkaWNhbENpcmNsZVhtYXJrLAogICAgICBmYVRhYmxlTGlzdCwKICAgICAgZmFUaExpc3QsCiAgICAgIGZhRmxhc2tWaWFsLAogICAgICBmYUNpcmNsZUV4Y2xhbWF0aW9uLAogICAgICBmYUV4Y2xhbWF0aW9uQ2lyY2xlLAogICAgICBmYVRheGksCiAgICAgIGZhQ2FiLAogICAgICBmYVRleHRTbGFzaCwKICAgICAgZmFSZW1vdmVGb3JtYXQsCiAgICAgIGZhUGVvcGxlUHVsbGluZywKICAgICAgZmFCYWNrd2FyZCwKICAgICAgZmFDYXJCdXJzdCwKICAgICAgZmFDYXJDcmFzaCwKICAgICAgZmFMaW5rLAogICAgICBmYUNoYWluLAogICAgICBmYUJhY2t3YXJkU3RlcCwKICAgICAgZmFTdGVwQmFja3dhcmQsCiAgICAgIGZhWCwKICAgICAgZmFDaXJjbGVVc2VyOiBmYUNpcmNsZVVzZXIyLAogICAgICBmYVVzZXJDaXJjbGU6IGZhVXNlckNpcmNsZTIsCiAgICAgIGZhUmVjdGFuZ2xlTGlzdDogZmFSZWN0YW5nbGVMaXN0MiwKICAgICAgZmFMaXN0QWx0OiBmYUxpc3RBbHQyLAogICAgICBmYUhhbmQ6IGZhSGFuZDIsCiAgICAgIGZhSGFuZFBhcGVyOiBmYUhhbmRQYXBlcjIsCiAgICAgIGZhQ2FuY2VyLAogICAgICBmYVZhblNodXR0bGUsCiAgICAgIGZhU2h1dHRsZVZhbiwKICAgICAgZmFTdGFpcnMsCiAgICAgIGZhSG9yc2VIZWFkLAogICAgICBmYVZhdWx0LAogICAgICBmYUNsb3NlZENhcHRpb25pbmdTbGFzaCwKICAgICAgZmFEcnVtU3RlZWxwYW4sCiAgICAgIGZhVGh1bWJzVXA6IGZhVGh1bWJzVXAyLAogICAgICBmYVN0YW1wLAogICAgICBmYU1lbm9yYWgsCiAgICAgIGZhQ2hpbGRyZW4sCiAgICAgIGZhQ2hhcnRMaW5lLAogICAgICBmYUxpbmVDaGFydCwKICAgICAgZmFTcXVhcmVFbnZlbG9wZSwKICAgICAgZmFFbnZlbG9wZVNxdWFyZSwKICAgICAgZmFCYW5TbW9raW5nLAogICAgICBmYVNtb2tpbmdCYW4sCiAgICAgIGZhVHJ1Y2tGcm9udCwKICAgICAgZmFCdWlsZGluZzogZmFCdWlsZGluZzIsCiAgICAgIGZhQnVsbHNleWUsCiAgICAgIGZhQXJyb3dMZWZ0TG9uZywKICAgICAgZmFMb25nQXJyb3dMZWZ0LAogICAgICBmYUNoZXNzUm9vazogZmFDaGVzc1Jvb2syLAogICAgICBmYUJsZW5kZXJQaG9uZSwKICAgICAgZmFBcnJvd1R1cm5VcCwKICAgICAgZmFMZXZlbFVwLAogICAgICBmYUJpY3ljbGUsCiAgICAgIGZhQ2lyY2xlQXJyb3dEb3duLAogICAgICBmYUFycm93Q2lyY2xlRG93biwKICAgICAgZmFHZWFyLAogICAgICBmYUNvZywKICAgICAgZmFNYXJzQW5kVmVudXNCdXJzdCwKICAgICAgZmFPdHRlciwKICAgICAgZmFDaXJjbGVDaGV2cm9uTGVmdCwKICAgICAgZmFDaGV2cm9uQ2lyY2xlTGVmdCwKICAgICAgZmFDaXJjbGVRdWVzdGlvbjogZmFDaXJjbGVRdWVzdGlvbjIsCiAgICAgIGZhUXVlc3Rpb25DaXJjbGU6IGZhUXVlc3Rpb25DaXJjbGUyLAogICAgICBmYVdhbGtpZVRhbGtpZSwKICAgICAgZmFVc2VyR3JvdXAsCiAgICAgIGZhVXNlckZyaWVuZHMsCiAgICAgIGZhSG91c2VDaGltbmV5LAogICAgICBmYUhvbWVMZywKICAgICAgZmFSaWdodEZyb21CcmFja2V0LAogICAgICBmYVNpZ25PdXRBbHQsCiAgICAgIGZhRmlsZTogZmFGaWxlMiwKICAgICAgZmFQbGFuZVNsYXNoLAogICAgICBmYUNsb3VkU2hvd2Vyc0hlYXZ5LAogICAgICBmYVBlcnNvbkZhbGxpbmcsCiAgICAgIGZhVHVybkRvd24sCiAgICAgIGZhTGV2ZWxEb3duQWx0LAogICAgICBmYVVwUmlnaHRBbmREb3duTGVmdEZyb21DZW50ZXIsCiAgICAgIGZhRXhwYW5kQWx0LAogICAgICBmYVVzZXJUYWcsCiAgICAgIGZhSGFuZFNwYXJrbGVzLAogICAgICBmYUFycm93c1RvRG90LAogICAgICBmYUZhY2VTYWRDcnk6IGZhRmFjZVNhZENyeTIsCiAgICAgIGZhU2FkQ3J5OiBmYVNhZENyeTIsCiAgICAgIGZhRG9uZ1NpZ24sCiAgICAgIGZhUGVvcGxlTGluZSwKICAgICAgZmFTcXVhcmVSc3MsCiAgICAgIGZhUnNzU3F1YXJlLAogICAgICBmYUNhbGVuZGFyTWludXM6IGZhQ2FsZW5kYXJNaW51czIsCiAgICAgIGZhQ2hhcnREaWFncmFtLAogICAgICBmYUZhY2VUaXJlZDogZmFGYWNlVGlyZWQyLAogICAgICBmYVRpcmVkOiBmYVRpcmVkMiwKICAgICAgZmFIYW5kUG9pbnRSaWdodDogZmFIYW5kUG9pbnRSaWdodDIsCiAgICAgIGZhQXJyb3dVcCwKICAgICAgZmFDdWJlc1N0YWNrZWQsCiAgICAgIGZhQ2hpbGRDb21iYXRhbnQsCiAgICAgIGZhQ2hpbGRSaWZsZSwKICAgICAgZmFWZXN0UGF0Y2hlcywKICAgICAgZmFNYXJ0aW5pR2xhc3NFbXB0eSwKICAgICAgZmFHbGFzc01hcnRpbmksCiAgICAgIGZhTWFnbmV0LAogICAgICBmYVJvYWRCYXJyaWVyLAogICAgICBmYUNvbXBhc3NEcmFmdGluZywKICAgICAgZmFEcmFmdGluZ0NvbXBhc3MsCiAgICAgIGZhU3F1YXJlUGVyc29uQ29uZmluZWQsCiAgICAgIGZhUGxhdGVXaGVhdCwKICAgICAgZmFTaWduSGFuZ2luZywKICAgICAgZmFTaWduLAogICAgICBmYUNhckJhdHRlcnksCiAgICAgIGZhQmF0dGVyeUNhciwKICAgICAgZmFTaGlydCwKICAgICAgZmFUU2hpcnQsCiAgICAgIGZhVHNoaXJ0LAogICAgICBmYVBhcmFncmFwaCwKICAgICAgZmFFbnZlbG9wZXNCdWxrLAogICAgICBmYU1haWxCdWxrLAogICAgICBmYUd1aXRhciwKICAgICAgZmFTdWl0Y2FzZSwKICAgICAgZmFDaXJjbGVVcDogZmFDaXJjbGVVcDIsCiAgICAgIGZhQXJyb3dBbHRDaXJjbGVVcDogZmFBcnJvd0FsdENpcmNsZVVwMiwKICAgICAgZmFGLAogICAgICBmYVhtYXJrc0xpbmVzLAogICAgICBmYUVhcnRoT2NlYW5pYSwKICAgICAgZmFHbG9iZU9jZWFuaWEsCiAgICAgIGZhQ29tbWVudFNsYXNoLAogICAgICBmYVBsYXksCiAgICAgIGZhVmlhbENpcmNsZUNoZWNrLAogICAgICBmYUJyaWRnZUNpcmNsZUNoZWNrLAogICAgICBmYUNlZGlTaWduLAogICAgICBmYVB1enpsZVBpZWNlLAogICAgICBmYUhlbG1ldFVuLAogICAgICBmYUdsYXNzV2F0ZXIsCiAgICAgIGZhSGVhcnRDaXJjbGVCb2x0LAogICAgICBmYVB1bXBTb2FwLAogICAgICBmYUhhbmRTY2lzc29yczogZmFIYW5kU2Npc3NvcnMyLAogICAgICBmYURvbGx5LAogICAgICBmYURvbGx5Qm94LAogICAgICBmYVBhcGVyY2xpcCwKICAgICAgZmFEZW1vY3JhdCwKICAgICAgZmFTcXVhcmVBcnJvd1VwUmlnaHQsCiAgICAgIGZhRXh0ZXJuYWxMaW5rU3F1YXJlLAogICAgICBmYUZlcnJ5LAogICAgICBmYU1vc3F1aXRvLAogICAgICBmYUJ1aWxkaW5nQ2lyY2xlQXJyb3dSaWdodCwKICAgICAgZmFMZWZ0UmlnaHQsCiAgICAgIGZhQXJyb3dzQWx0SCwKICAgICAgZmFWaXJ1cywKICAgICAgZmFHZW06IGZhR2VtMiwKICAgICAgZmFUb2lsZXQsCiAgICAgIGZhU2luZ2xlUXVvdGVMZWZ0LAogICAgICBmYU1vbmV5QmlsbHMsCiAgICAgIGZhVGFibGV0QnV0dG9uLAogICAgICBmYVJlY3RhbmdsZVhtYXJrOiBmYVJlY3RhbmdsZVhtYXJrMiwKICAgICAgZmFSZWN0YW5nbGVUaW1lczogZmFSZWN0YW5nbGVUaW1lczIsCiAgICAgIGZhVGltZXNSZWN0YW5nbGU6IGZhVGltZXNSZWN0YW5nbGUyLAogICAgICBmYVdpbmRvd0Nsb3NlOiBmYVdpbmRvd0Nsb3NlMiwKICAgICAgZmFXcmVuY2gsCiAgICAgIGZhVHJhc2hDYW46IGZhVHJhc2hDYW4yLAogICAgICBmYVRyYXNoQWx0OiBmYVRyYXNoQWx0MiwKICAgICAgZmFUYWJsZUNlbGxzLAogICAgICBmYVRoLAogICAgICBmYVJpYmJvbiwKICAgICAgZmFMYW5kbWFya0ZsYWcsCiAgICAgIGZhVXBEb3duTGVmdFJpZ2h0LAogICAgICBmYUFycm93c0FsdCwKICAgICAgZmFDYXJTaWRlLAogICAgICBmYVRyYXNoQXJyb3dVcCwKICAgICAgZmFUcmFzaFJlc3RvcmUsCiAgICAgIGZhTGlmZVJpbmc6IGZhTGlmZVJpbmcyLAogICAgICBmYUNvcHlyaWdodDogZmFDb3B5cmlnaHQyLAogICAgICBmYUZpbGVQcmVzY3JpcHRpb24sCiAgICAgIGZhRXJhc2VyLAogICAgICBmYUhvdXJnbGFzc1N0YXJ0LAogICAgICBmYUhvdXJnbGFzczEsCiAgICAgIGZhQ2lyY2xlTGVmdDogZmFDaXJjbGVMZWZ0MiwKICAgICAgZmFBcnJvd0FsdENpcmNsZUxlZnQ6IGZhQXJyb3dBbHRDaXJjbGVMZWZ0MiwKICAgICAgZmFDcnV6ZWlyb1NpZ24sCiAgICAgIGZhU21va2luZywKICAgICAgZmFTcXVhcmVQb2xsVmVydGljYWwsCiAgICAgIGZhUG9sbCwKICAgICAgZmFQZXJzb25DaXJjbGVNaW51cywKICAgICAgZmFCaW9oYXphcmQsCiAgICAgIGZhQmVsbENvbmNpZXJnZSwKICAgICAgZmFDb25jaWVyZ2VCZWxsLAogICAgICBmYVJ1bGVySG9yaXpvbnRhbCwKICAgICAgZmFIb3JzZSwKICAgICAgZmFDYWxlbmRhcjogZmFDYWxlbmRhcjIsCiAgICAgIGZhSGFuZHNIb2xkaW5nQ2hpbGQsCiAgICAgIGZhSXRhbGljLAogICAgICBmYUtoYW5kYSwKICAgICAgZmFGYWNlRnJvd25PcGVuOiBmYUZhY2VGcm93bk9wZW4yLAogICAgICBmYUZyb3duT3BlbjogZmFGcm93bk9wZW4yLAogICAgICBmYUNoZWNrLAogICAgICBmYUZpbmdlcnByaW50LAogICAgICBmYUNoYXJnaW5nU3RhdGlvbiwKICAgICAgZmFVc2VyTG9jaywKICAgICAgZmFNb2JpbGVTY3JlZW5CdXR0b24sCiAgICAgIGZhTW9iaWxlQWx0LAogICAgICBmYUFuY2hvckNpcmNsZUNoZWNrLAogICAgICBmYVBlcnNvbldhbGtpbmdXaXRoQ2FuZSwKICAgICAgZmFCbGluZCwKICAgICAgZmFGaWxlV2F2ZWZvcm0sCiAgICAgIGZhRmlsZU1lZGljYWxBbHQsCiAgICAgIGZhSG91c2VDcmFjaywKICAgICAgZmFIYXRXaXphcmQsCiAgICAgIGZhVXNlckRvY3RvciwKICAgICAgZmFVc2VyTWQsCiAgICAgIGZhQ2hhcnRCYXI6IGZhQ2hhcnRCYXIyLAogICAgICBmYUJhckNoYXJ0OiBmYUJhckNoYXJ0MiwKICAgICAgZmFTcHJheUNhblNwYXJrbGVzLAogICAgICBmYUFpckZyZXNoZW5lciwKICAgICAgZmFCYWh0U2lnbiwKICAgICAgZmFUZW1wZXJhdHVyZUFycm93VXAsCiAgICAgIGZhVGVtcGVyYXR1cmVVcCwKICAgICAgZmFXZWJBd2Vzb21lOiBmYVdlYkF3ZXNvbWUyLAogICAgICBmYU5vbkJpbmFyeSwKICAgICAgZmFOLAogICAgICBmYUFycm93c1VwRG93bkxlZnRSaWdodCwKICAgICAgZmFBcnJvd3MsCiAgICAgIGZhSG91c2U6IGZhSG91c2UyLAogICAgICBmYUhvbWU6IGZhSG9tZTIsCiAgICAgIGZhSG9tZUFsdDogZmFIb21lQWx0MiwKICAgICAgZmFIb21lTGdBbHQ6IGZhSG9tZUxnQWx0MiwKICAgICAgZmFTcGlubmVyLAogICAgICBmYUdhdmVsLAogICAgICBmYUxlZ2FsLAogICAgICBmYVRpY2tldFNpbXBsZSwKICAgICAgZmFUaWNrZXRBbHQsCiAgICAgIGZhRG92ZSwKICAgICAgZmFUYXJwRHJvcGxldCwKICAgICAgZmFUcmVlQ2l0eSwKICAgICAgZmFUdXJuVXAsCiAgICAgIGZhTGV2ZWxVcEFsdCwKICAgICAgZmFUZW1wZXJhdHVyZVF1YXJ0ZXIsCiAgICAgIGZhVGVtcGVyYXR1cmUxLAogICAgICBmYVRoZXJtb21ldGVyMSwKICAgICAgZmFUaGVybW9tZXRlclF1YXJ0ZXIsCiAgICAgIGZhU2xpZGVycywKICAgICAgZmFTbGlkZXJzSCwKICAgICAgZmFNb3NxdWUsCiAgICAgIGZhSCwKICAgICAgZmFJbmZvLAogICAgICBmYVBlcnNvbldhbGtpbmcsCiAgICAgIGZhV2Fsa2luZywKICAgICAgZmFBcnJvd1R1cm5Eb3duLAogICAgICBmYUxldmVsRG93biwKICAgICAgZmFSb2FkLAogICAgICBmYVNwaXJhbCwKICAgICAgZmFGYWNlRnJvd246IGZhRmFjZUZyb3duMiwKICAgICAgZmFGcm93bjogZmFGcm93bjIsCiAgICAgIGZhV2luZUdsYXNzRW1wdHksCiAgICAgIGZhV2luZUdsYXNzQWx0LAogICAgICBmYUNsYXBwZXJib2FyZCwKICAgICAgZmFGb3J3YXJkU3RlcCwKICAgICAgZmFTdGVwRm9yd2FyZCwKICAgICAgZmFTcXVhcmVVcFJpZ2h0LAogICAgICBmYUV4dGVybmFsTGlua1NxdWFyZUFsdCwKICAgICAgZmFCb29rSm91cm5hbFdoaWxscywKICAgICAgZmFKb3VybmFsV2hpbGxzLAogICAgICBmYUNoYW1wYWduZUdsYXNzZXMsCiAgICAgIGZhR2xhc3NDaGVlcnMsCiAgICAgIGZhRHVtcHN0ZXIsCiAgICAgIGZhSGVhcnRDaXJjbGVYbWFyaywKICAgICAgZmFDb21wdXRlciwKICAgICAgZmFXYW5kTWFnaWMsCiAgICAgIGZhTWFnaWMsCiAgICAgIGZhQnJhaW4sCiAgICAgIGZhQnJpZWZjYXNlTWVkaWNhbCwKICAgICAgZmFIb3VzZU1lZGljYWxDaXJjbGVFeGNsYW1hdGlvbiwKICAgICAgZmFDb2RlQ29tbWl0LAogICAgICBmYVBlcnNvbkJyZWFzdGZlZWRpbmcsCiAgICAgIGZhUGVyc29uUmF5cywKICAgICAgZmFNYW5hdFNpZ24sCiAgICAgIGZhU29ydCwKICAgICAgZmFVbnNvcnRlZCwKICAgICAgZmFDaXJjbGVSYWRpYXRpb24sCiAgICAgIGZhUmFkaWF0aW9uQWx0LAogICAgICBmYUxhcHRvcENvZGUsCiAgICAgIGZhU2luaywKICAgICAgZmFBcnJvd1VwRnJvbVdhdGVyUHVtcCwKICAgICAgZmFNaWNyb3Bob25lTGluZXNTbGFzaCwKICAgICAgZmFNaWNyb3Bob25lQWx0U2xhc2gsCiAgICAgIGZhU2VydmVyLAogICAgICBmYVVzZXI6IGZhVXNlcjIsCiAgICAgIGZhVXNlckFsdDogZmFVc2VyQWx0MiwKICAgICAgZmFVc2VyTGFyZ2U6IGZhVXNlckxhcmdlMiwKICAgICAgZmFTbm93Zmxha2U6IGZhU25vd2ZsYWtlMiwKICAgICAgZmFUYXVydXMsCiAgICAgIGZhU2t1bGxDcm9zc2JvbmVzLAogICAgICBmYVBlc29TaWduLAogICAgICBmYVdpbmVHbGFzcywKICAgICAgZmFUZW1wZXJhdHVyZUhhbGYsCiAgICAgIGZhVGVtcGVyYXR1cmUyLAogICAgICBmYVRoZXJtb21ldGVyMiwKICAgICAgZmFUaGVybW9tZXRlckhhbGYsCiAgICAgIGZhVGlja2V0LAogICAgICBmYVdoZWF0QXduQ2lyY2xlRXhjbGFtYXRpb24sCiAgICAgIGZhQXJyb3dzVHVyblJpZ2h0LAogICAgICBmYUNhbmR5Q2FuZSwKICAgICAgZmFXaGVlbGNoYWlyLAogICAgICBmYVNwZWxsQ2hlY2ssCiAgICAgIGZhVm9sdW1lT2ZmLAogICAgICBmYUx1bmdzLAogICAgICBmYUJvb2ttYXJrOiBmYUJvb2ttYXJrMiwKICAgICAgZmFCYXJjb2RlLAogICAgICBmYUxpc3RPbCwKICAgICAgZmFMaXN0MTIsCiAgICAgIGZhTGlzdE51bWVyaWMsCiAgICAgIGZhRmlsZUNpcmNsZVhtYXJrLAogICAgICBmYUN1YmUsCiAgICAgIGZhVGFwZSwKICAgICAgZmFCb21iLAogICAgICBmYVNjYWxlVW5iYWxhbmNlZCwKICAgICAgZmFCYWxhbmNlU2NhbGVMZWZ0LAogICAgICBmYVNxdWFyZUNhcmV0TGVmdDogZmFTcXVhcmVDYXJldExlZnQyLAogICAgICBmYUNhcmV0U3F1YXJlTGVmdDogZmFDYXJldFNxdWFyZUxlZnQyLAogICAgICBmYVJ1bGVyLAogICAgICBmYUksCiAgICAgIGZhVm9sdW1lWG1hcmssCiAgICAgIGZhVm9sdW1lTXV0ZSwKICAgICAgZmFWb2x1bWVUaW1lcywKICAgICAgZmFBcmNod2F5LAogICAgICBmYVBlcnNvbkRpZ2dpbmcsCiAgICAgIGZhRGlnZ2luZywKICAgICAgZmFHYXVnZUhpZ2gsCiAgICAgIGZhVGFjaG9tZXRlckFsdCwKICAgICAgZmFUYWNob21ldGVyQWx0RmFzdCwKICAgICAgZmFHZW5kZXJsZXNzLAogICAgICBmYUNsb3VkU3VuLAogICAgICBmYUFycm93UmlnaHQsCiAgICAgIGZhSGFuZHNoYWtlOiBmYUhhbmRzaGFrZTIsCiAgICAgIGZhSGFuZHNoYWtlQWx0OiBmYUhhbmRzaGFrZUFsdDIsCiAgICAgIGZhSGFuZHNoYWtlU2ltcGxlOiBmYUhhbmRzaGFrZVNpbXBsZTIsCiAgICAgIGZhUGVyc29uU2tpaW5nLAogICAgICBmYVNraWluZywKICAgICAgZmFCcmlkZ2VXYXRlciwKICAgICAgZmFCdWlsZGluZ05nbywKICAgICAgZmFJZ2xvbywKICAgICAgZmFDaXJjbGVEb2xsYXJUb1Nsb3QsCiAgICAgIGZhRG9uYXRlLAogICAgICBmYVksCiAgICAgIGZhRmFjZVNtaWxlV2luazogZmFGYWNlU21pbGVXaW5rMiwKICAgICAgZmFTbWlsZVdpbms6IGZhU21pbGVXaW5rMiwKICAgICAgZmFEaWNlRm91ciwKICAgICAgZmFGYWNlR3JpblNxdWludFRlYXJzOiBmYUZhY2VHcmluU3F1aW50VGVhcnMyLAogICAgICBmYUdyaW5TcXVpbnRUZWFyczogZmFHcmluU3F1aW50VGVhcnMyLAogICAgICBmYUZpbGVBdWRpbzogZmFGaWxlQXVkaW8yLAogICAgICBmYUFycm93c0Rvd25Ub0xpbmUsCiAgICAgIGZhRywKICAgICAgZmFWaWhhcmEsCiAgICAgIGZhRmxhZ0NoZWNrZXJlZCwKICAgICAgZmFHYXVnZVNpbXBsZSwKICAgICAgZmFHYXVnZVNpbXBsZU1lZCwKICAgICAgZmFUYWNob21ldGVyQXZlcmFnZSwKICAgICAgZmFSaWdodExlZnQsCiAgICAgIGZhRXhjaGFuZ2VBbHQsCiAgICAgIGZhUGlsbHMsCiAgICAgIGZhRXhwbG9zaW9uLAogICAgICBmYUFycm93c0Rvd25Ub1Blb3BsZSwKICAgICAgZmFVc2Vyc1ZpZXdmaW5kZXIsCiAgICAgIGZhQ2FyT24sCiAgICAgIGZhU2xlaWdoLAogICAgICBmYUR1bWJiZWxsLAogICAgICBmYUJhYnlDYXJyaWFnZSwKICAgICAgZmFDYXJyaWFnZUJhYnksCiAgICAgIGZhS2l3aUJpcmQsCiAgICAgIGZhQ2FsZW5kYXJYbWFyazogZmFDYWxlbmRhclhtYXJrMiwKICAgICAgZmFDYWxlbmRhclRpbWVzOiBmYUNhbGVuZGFyVGltZXMyLAogICAgICBmYUNpcmNsZURvd246IGZhQ2lyY2xlRG93bjIsCiAgICAgIGZhQXJyb3dBbHRDaXJjbGVEb3duOiBmYUFycm93QWx0Q2lyY2xlRG93bjIsCiAgICAgIGZhRmlsZU1lZGljYWwsCiAgICAgIGZhWG1hcmssCiAgICAgIGZhQ2xvc2UsCiAgICAgIGZhTXVsdGlwbHksCiAgICAgIGZhUmVtb3ZlLAogICAgICBmYVRpbWVzLAogICAgICBmYVNoYXBlcywKICAgICAgZmFUcmlhbmdsZUNpcmNsZVNxdWFyZSwKICAgICAgZmFEaWNlT25lLAogICAgICBmYUxvY2tPcGVuLAogICAgICBmYVBlcHBlckhvdCwKICAgICAgZmFEcm9wbGV0U2xhc2gsCiAgICAgIGZhVGludFNsYXNoLAogICAgICBmYURyb3BsZXQsCiAgICAgIGZhVGludCwKICAgICAgZmFGaWxlTGluZXM6IGZhRmlsZUxpbmVzMiwKICAgICAgZmFGaWxlQWx0OiBmYUZpbGVBbHQyLAogICAgICBmYUZpbGVUZXh0OiBmYUZpbGVUZXh0MiwKICAgICAgZmFDb21tZW50c0RvbGxhciwKICAgICAgZmFNYWduaWZ5aW5nR2xhc3NMb2NhdGlvbiwKICAgICAgZmFTZWFyY2hMb2NhdGlvbiwKICAgICAgZmFGaWxlSW52b2ljZSwKICAgICAgZmFQZW50YWdvbiwKICAgICAgZmFSZXB1YmxpY2FuLAogICAgICBmYVNob3AsCiAgICAgIGZhU3RvcmVBbHQsCiAgICAgIGZhRmlsbSwKICAgICAgZmFGaWxtQWx0LAogICAgICBmYUZpbG1TaW1wbGUsCiAgICAgIGZhQnVpbGRpbmdDaXJjbGVYbWFyaywKICAgICAgZmFDb21tZW50czogZmFDb21tZW50czIsCiAgICAgIGZhVGFncywKICAgICAgZmFHdW4sCiAgICAgIGZhQ2lyY2xlQ2hlY2s6IGZhQ2lyY2xlQ2hlY2syLAogICAgICBmYUNoZWNrQ2lyY2xlOiBmYUNoZWNrQ2lyY2xlMiwKICAgICAgZmFTY29ycGlvLAogICAgICBmYUlkQ2FyZENsaXAsCiAgICAgIGZhSWRDYXJkQWx0LAogICAgICBmYU1vb246IGZhTW9vbjIsCiAgICAgIGZhT2lsV2VsbCwKICAgICAgZmFUYWNob2dyYXBoRGlnaXRhbCwKICAgICAgZmFEaWdpdGFsVGFjaG9ncmFwaCwKICAgICAgZmFUYWJsZXQsCiAgICAgIGZhVGFibGV0QW5kcm9pZCwKICAgICAgZmFSdWJsZVNpZ24sCiAgICAgIGZhUm91YmxlLAogICAgICBmYVJ1YiwKICAgICAgZmFSdWJsZSwKICAgICAgZmFDbG9zZWRDYXB0aW9uaW5nOiBmYUNsb3NlZENhcHRpb25pbmcyLAogICAgICBmYVBlbiwKICAgICAgZmFQbGFuZSwKICAgICAgZmFJbWFnZXM6IGZhSW1hZ2VzMiwKICAgICAgZmFNb2JpbGVTY3JlZW4sCiAgICAgIGZhTW9iaWxlQW5kcm9pZEFsdCwKICAgICAgZmFHdWFyYW5pU2lnbiwKICAgICAgZmFCYWdTaG9wcGluZywKICAgICAgZmFTaG9wcGluZ0JhZywKICAgICAgZmFDaXJjbGVSaWdodDogZmFDaXJjbGVSaWdodDIsCiAgICAgIGZhQXJyb3dBbHRDaXJjbGVSaWdodDogZmFBcnJvd0FsdENpcmNsZVJpZ2h0MiwKICAgICAgZmFQaG9uZVZvbHVtZSwKICAgICAgZmFWb2x1bWVDb250cm9sUGhvbmUsCiAgICAgIGZhQ3ViZXMsCiAgICAgIGZhUGhvbmUsCiAgICAgIGZhVG9yaWlHYXRlLAogICAgICBmYUJhY29uLAogICAgICBmYVBlcnNvbkZhbGxpbmdCdXJzdCwKICAgICAgZmFRdW90ZVJpZ2h0LAogICAgICBmYVF1b3RlUmlnaHRBbHQsCiAgICAgIGZhSG91c2VNZWRpY2FsRmxhZywKICAgICAgZmFQcmVzY3JpcHRpb24sCiAgICAgIGZhRGljZVRocmVlLAogICAgICBmYUJ1aWxkaW5nTG9jaywKICAgICAgZmFJZENhcmQ6IGZhSWRDYXJkMiwKICAgICAgZmFEcml2ZXJzTGljZW5zZTogZmFEcml2ZXJzTGljZW5zZTIsCiAgICAgIGZhQ2lyY2xlUGxheTogZmFDaXJjbGVQbGF5MiwKICAgICAgZmFQbGF5Q2lyY2xlOiBmYVBsYXlDaXJjbGUyLAogICAgICBmYUZhY2VMYXVnaEJlYW06IGZhRmFjZUxhdWdoQmVhbTIsCiAgICAgIGZhTGF1Z2hCZWFtOiBmYUxhdWdoQmVhbTIsCiAgICAgIGZhTGVhZiwKICAgICAgZmFIb3VzZUNoaW1uZXlVc2VyLAogICAgICBmYVJvdGF0ZVJpZ2h0LAogICAgICBmYVJlZG9BbHQsCiAgICAgIGZhUm90YXRlRm9yd2FyZCwKICAgICAgZmFUb290aCwKICAgICAgZmFIb3VzZUNoaW1uZXlXaW5kb3csCiAgICAgIGZhTW90b3JjeWNsZSwKICAgICAgZmFCYWNrd2FyZEZhc3QsCiAgICAgIGZhRmFzdEJhY2t3YXJkLAogICAgICBmYUFkZHJlc3NCb29rOiBmYUFkZHJlc3NCb29rMiwKICAgICAgZmFDb250YWN0Qm9vazogZmFDb250YWN0Qm9vazIsCiAgICAgIGZhU2FpbGJvYXQsCiAgICAgIGZhQm9va0Jvb2ttYXJrLAogICAgICBmYU1hZ25pZnlpbmdHbGFzc0Fycm93UmlnaHQsCiAgICAgIGZhTWljcm9waG9uZUxpbmVzLAogICAgICBmYU1pY3JvcGhvbmVBbHQsCiAgICAgIGZhUmVwbHlBbGwsCiAgICAgIGZhTWFpbFJlcGx5QWxsLAogICAgICBmYVVuaXZlcnNhbEFjY2VzcywKICAgICAgZmFUb2lsZXRQYXBlciwKICAgICAgZmFUb2lsZXRQYXBlckFsdCwKICAgICAgZmFUb2lsZXRQYXBlckJsYW5rLAogICAgICBmYVZyQ2FyZGJvYXJkLAogICAgICBmYVBpenphU2xpY2UsCiAgICAgIGZhU3ByYXlDYW4sCiAgICAgIGZhVm9sdW1lTG93LAogICAgICBmYVZvbHVtZURvd24sCiAgICAgIGZhQ3Jvc3MsCiAgICAgIGZhUGVyc29uLAogICAgICBmYU1hbGUsCiAgICAgIGZhSG91cmdsYXNzOiBmYUhvdXJnbGFzczMsCiAgICAgIGZhSG91cmdsYXNzRW1wdHk6IGZhSG91cmdsYXNzRW1wdHkyLAogICAgICBmYUZpc2gsCiAgICAgIGZhRHJ1bXN0aWNrQml0ZSwKICAgICAgZmFDaGFydFNpbXBsZSwKICAgICAgZmFBdG9tLAogICAgICBmYVAsCiAgICAgIGZhSmV0RmlnaHRlclVwLAogICAgICBmYVBsdWdDaXJjbGVYbWFyaywKICAgICAgZmFTaGVldFBsYXN0aWMsCiAgICAgIGZhViwKICAgICAgZmFMaXN0LAogICAgICBmYUxpc3RTcXVhcmVzLAogICAgICBmYVBpc2NlcywKICAgICAgZmFTb2xhclBhbmVsLAogICAgICBmYUxhbmRNaW5lT24sCiAgICAgIGZhSGVhZHBob25lczogZmFIZWFkcGhvbmVzMiwKICAgICAgZmFIZWFkcGhvbmVzQWx0OiBmYUhlYWRwaG9uZXNBbHQyLAogICAgICBmYUhlYWRwaG9uZXNTaW1wbGU6IGZhSGVhZHBob25lc1NpbXBsZTIsCiAgICAgIGZhQnVzLAogICAgICBmYUZpbGVQb3dlcnBvaW50OiBmYUZpbGVQb3dlcnBvaW50MiwKICAgICAgZmFRdW90ZUxlZnQsCiAgICAgIGZhUXVvdGVMZWZ0QWx0LAogICAgICBmYUNoZXZyb25Eb3duLAogICAgICBmYUVhcnRoQXNpYSwKICAgICAgZmFHbG9iZUFzaWEsCiAgICAgIGZhQ2VudFNpZ24sCiAgICAgIGZhU2hpZWxkQ2F0LAogICAgICBmYVNjaG9vbENpcmNsZUNoZWNrLAogICAgICBmYU1hcnRpbmlHbGFzcywKICAgICAgZmFHbGFzc01hcnRpbmlBbHQsCiAgICAgIGZhUGx1ZywKICAgICAgZmFQYW5vcmFtYSwKICAgICAgZmFDbG9ja1JvdGF0ZUxlZnQsCiAgICAgIGZhSGlzdG9yeSwKICAgICAgZmFKYXJXaGVhdCwKICAgICAgZmFDbG91ZEFycm93RG93biwKICAgICAgZmFDbG91ZERvd25sb2FkLAogICAgICBmYUNsb3VkRG93bmxvYWRBbHQsCiAgICAgIGZhVHJ1Y2tSYW1wQm94LAogICAgICBmYVRydWNrTG9hZGluZywKICAgICAgZmFBbmdsZURvd24sCiAgICAgIGZhUGx1Z0NpcmNsZUNoZWNrLAogICAgICBmYVdpbmRvd01heGltaXplOiBmYVdpbmRvd01heGltaXplMiwKICAgICAgZmFIYW5kc0hvbGRpbmdDaXJjbGUsCiAgICAgIGZhTG9jYXRpb25QaW4sCiAgICAgIGZhTWFwTWFya2VyLAogICAgICBmYUJvd2xpbmdCYWxsLAogICAgICBmYUNhcnRGbGF0YmVkLAogICAgICBmYURvbGx5RmxhdGJlZCwKICAgICAgZmFIb3VzZVVzZXIsCiAgICAgIGZhSG9tZVVzZXIsCiAgICAgIGZhR2hvc3QsCiAgICAgIGZhQ29tbWVudE5vZGVzLAogICAgICBmYVBlcnNvbkFycm93RG93blRvTGluZSwKICAgICAgZmFQbHVnQ2lyY2xlUGx1cywKICAgICAgZmFQZXJzb25Td2ltbWluZywKICAgICAgZmFTd2ltbWVyLAogICAgICBmYUNvbW1lbnREb3RzOiBmYUNvbW1lbnREb3RzMiwKICAgICAgZmFDb21tZW50aW5nOiBmYUNvbW1lbnRpbmcyLAogICAgICBmYUNoYXJ0UGllLAogICAgICBmYVBpZUNoYXJ0LAogICAgICBmYUZyb2csCiAgICAgIGZhV2luZUJvdHRsZSwKICAgICAgZmFJbmJveCwKICAgICAgZmFTcXVhcmVILAogICAgICBmYUhTcXVhcmUsCiAgICAgIGZhSG91c2VNZWRpY2FsLAogICAgICBmYUNpcmNsZUNoZXZyb25SaWdodCwKICAgICAgZmFDaGV2cm9uQ2lyY2xlUmlnaHQsCiAgICAgIGZhRmlsZUNzdiwKICAgICAgZmFIYXRDb3dib3ksCiAgICAgIGZhRmFjZUdyaW5Ub25ndWVXaW5rOiBmYUZhY2VHcmluVG9uZ3VlV2luazIsCiAgICAgIGZhR3JpblRvbmd1ZVdpbms6IGZhR3JpblRvbmd1ZVdpbmsyLAogICAgICBmYUwsCiAgICAgIGZhQXJyb3dEb3duU2hvcnRXaWRlLAogICAgICBmYVNvcnRBbW91bnREZXNjLAogICAgICBmYVNvcnRBbW91bnREb3duQWx0LAogICAgICBmYUhvdXJnbGFzc0hhbGY6IGZhSG91cmdsYXNzSGFsZjIsCiAgICAgIGZhSG91cmdsYXNzMjogZmFIb3VyZ2xhc3MyMiwKICAgICAgZmFTcG9vbiwKICAgICAgZmFVdGVuc2lsU3Bvb24sCiAgICAgIGZhQ3JlZGl0Q2FyZDogZmFDcmVkaXRDYXJkMiwKICAgICAgZmFDcmVkaXRDYXJkQWx0OiBmYUNyZWRpdENhcmRBbHQyLAogICAgICBmYUZpbGVJbnZvaWNlRG9sbGFyLAogICAgICBmYVNwYWdoZXR0aU1vbnN0ZXJGbHlpbmcsCiAgICAgIGZhUGFzdGFmYXJpYW5pc20sCiAgICAgIGZhTWFydGluaUdsYXNzQ2l0cnVzLAogICAgICBmYUNvY2t0YWlsLAogICAgICBmYUJ1bGxob3JuLAogICAgICBmYUJveFRpc3N1ZSwKICAgICAgZmFNYXR0cmVzc1BpbGxvdywKICAgICAgZmFDaGV2cm9uTGVmdCwKICAgICAgZmFDbG91ZE1vb25SYWluLAogICAgICBmYUFycm93RG93bjE5LAogICAgICBmYVNvcnROdW1lcmljQXNjLAogICAgICBmYVNvcnROdW1lcmljRG93biwKICAgICAgZmFIYW5kU3BvY2s6IGZhSGFuZFNwb2NrMiwKICAgICAgZmFXYW5kTWFnaWNTcGFya2xlcywKICAgICAgZmFNYWdpY1dhbmRTcGFya2xlcywKICAgICAgZmFDb21tZW50TWVkaWNhbCwKICAgICAgZmFCZWxsU2xhc2g6IGZhQmVsbFNsYXNoMiwKICAgICAgZmFIYW5kc2hha2VTbGFzaCwKICAgICAgZmFIYW5kc2hha2VBbHRTbGFzaCwKICAgICAgZmFIYW5kc2hha2VTaW1wbGVTbGFzaCwKICAgICAgZmFCb3R0bGVXYXRlciwKICAgICAgZmFEaWNlRDIwLAogICAgICBmYUFycm93RG93blpBLAogICAgICBmYVNvcnRBbHBoYURlc2MsCiAgICAgIGZhU29ydEFscGhhRG93bkFsdCwKICAgICAgZmFCcnVzaCwKICAgICAgZmFQZXJzb25XYWxraW5nRGFzaGVkTGluZUFycm93UmlnaHQsCiAgICAgIGZhQXJyb3dVcFNob3J0V2lkZSwKICAgICAgZmFTb3J0QW1vdW50VXBBbHQsCiAgICAgIGZhR3JpcFZlcnRpY2FsLAogICAgICBmYUdyaWRWZXJ0aWNhbCwKICAgICAgZmFDYXJUdW5uZWwsCiAgICAgIGZhQ2hhcnRDb2x1bW4sCiAgICAgIGZhQ2Fwcmljb3JuLAogICAgICBmYVRydWNrQXJyb3dSaWdodCwKICAgICAgZmFUdiwKICAgICAgZmFUZWxldmlzaW9uLAogICAgICBmYVR2QWx0LAogICAgICBmYVNlY3Rpb24sCiAgICAgIGZhUGVhY2UsCiAgICAgIGZhU3RhcjogZmFTdGFyMiwKICAgICAgZmFGbGFnOiBmYUZsYWcyLAogICAgICBmYVRyaWFuZ2xlRXhjbGFtYXRpb24sCiAgICAgIGZhRXhjbGFtYXRpb25UcmlhbmdsZSwKICAgICAgZmFXYXJuaW5nLAogICAgICBmYVNjaG9vbENpcmNsZUV4Y2xhbWF0aW9uLAogICAgICBmYUdyYWR1YXRpb25DYXAsCiAgICAgIGZhTW9ydGFyQm9hcmQsCiAgICAgIGZhU3RvcmUsCiAgICAgIGZhVXNlckFzdHJvbmF1dCwKICAgICAgZmFCdWlsZGluZ0ZsYWcsCiAgICAgIGZhTXVnU2F1Y2VyLAogICAgICBmYUNvZmZlZSwKICAgICAgZmFMZW1vbjogZmFMZW1vbjIsCiAgICAgIGZhQ2FyYXZhbiwKICAgICAgZmFRLAogICAgICBmYUxvY2ssCiAgICAgIGZhUGFpbnRSb2xsZXIsCiAgICAgIGZhVm9sdW1lSGlnaCwKICAgICAgZmFWb2x1bWVVcCwKICAgICAgZmFGb2xkZXJQbHVzLAogICAgICBmYU1lcmN1cnksCiAgICAgIGZhQW5jaG9yLAogICAgICBmYVNxdWFyZVBhcmtpbmcsCiAgICAgIGZhUGFya2luZywKICAgICAgZmFIYW51a2lhaCwKICAgICAgZmFSb3RhdGVMZWZ0LAogICAgICBmYVJvdGF0ZUJhY2ssCiAgICAgIGZhUm90YXRlQmFja3dhcmQsCiAgICAgIGZhVW5kb0FsdCwKICAgICAgZmFIZWFkaW5nLAogICAgICBmYUhlYWRlciwKICAgICAgZmFDcm9zc2hhaXJzLAogICAgICBmYUNpcmNsZU5vZGVzLAogICAgICBmYVdpbmRvd1Jlc3RvcmU6IGZhV2luZG93UmVzdG9yZTIsCiAgICAgIGZhUiwKICAgICAgZmFGaWx0ZXJDaXJjbGVYbWFyaywKICAgICAgZmFHb3B1cmFtLAogICAgICBmYUhlYXJ0Q2lyY2xlTWludXMsCiAgICAgIGZhU3Rhck9mTGlmZSwKICAgICAgZmFCdXNpbmVzc1RpbWUsCiAgICAgIGZhQnJpZWZjYXNlQ2xvY2ssCiAgICAgIGZhRmlyZUV4dGluZ3Vpc2hlciwKICAgICAgZmFBcnJvd0Rvd25Mb25nLAogICAgICBmYUxvbmdBcnJvd0Rvd24sCiAgICAgIGZhVXNlck1pbnVzLAogICAgICBmYU1vbmV5Q2hlY2ssCiAgICAgIGZhSG91c2VMYXB0b3AsCiAgICAgIGZhTGFwdG9wSG91c2UsCiAgICAgIGZhRG93bmxvYWQsCiAgICAgIGZhU2FnaXR0YXJpdXMsCiAgICAgIGZhQ291Y2gsCiAgICAgIGZhUm9hZExvY2ssCiAgICAgIGZhU2Npc3NvcnMsCiAgICAgIGZhQ3V0LAogICAgICBmYUJ1ZywKICAgICAgZmFBcnJvd1JpZ2h0RnJvbUJyYWNrZXQsCiAgICAgIGZhU2lnbk91dCwKICAgICAgZmFIYW5kSG9sZGluZ0hhbmQsCiAgICAgIGZhU3Ryb29wd2FmZWwsCiAgICAgIGZhQ2hpbGQsCiAgICAgIGZhSWNlQ3JlYW0sCiAgICAgIGZhQ29tcHV0ZXJNb3VzZSwKICAgICAgZmFNb3VzZSwKICAgICAgZmFGYXVjZXQsCiAgICAgIGZhQXdhcmQsCiAgICAgIGZhUGVyc29uRHJvd25pbmcsCiAgICAgIGZhQ2FtZXJhUm90YXRlLAogICAgICBmYUZhY2VHcmluSGVhcnRzOiBmYUZhY2VHcmluSGVhcnRzMiwKICAgICAgZmFHcmluSGVhcnRzOiBmYUdyaW5IZWFydHMyLAogICAgICBmYUZpbGVGcmFnbWVudCwKICAgICAgZmFQZXJzb25NaWxpdGFyeVJpZmxlLAogICAgICBmYVRvZ2dsZU9uLAogICAgICBmYUx1bmdzVmlydXMsCiAgICAgIGZhVGFibGVUZW5uaXNQYWRkbGVCYWxsLAogICAgICBmYVBpbmdQb25nUGFkZGxlQmFsbCwKICAgICAgZmFUYWJsZVRlbm5pcywKICAgICAgZmFCb3hlc1BhY2tpbmcsCiAgICAgIGZhUGVyc29uQ2hhbGtib2FyZCwKICAgICAgZmFEaWNlVHdvLAogICAgICBmYUFycm93UmlnaHRBcnJvd0xlZnQsCiAgICAgIGZhRXhjaGFuZ2UsCiAgICAgIGZhRm9vdGJhbGwsCiAgICAgIGZhRm9vdGJhbGxCYWxsLAogICAgICBmYVRydWNrTW9uc3RlciwKICAgICAgZmFBc3RlcmlzaywKICAgICAgZmFCYXR0ZXJ5RnVsbCwKICAgICAgZmFCYXR0ZXJ5LAogICAgICBmYUJhdHRlcnk1LAogICAgICBmYUNoaWxkRHJlc3MsCiAgICAgIGZhRmFjZUtpc3NCZWFtOiBmYUZhY2VLaXNzQmVhbTIsCiAgICAgIGZhS2lzc0JlYW06IGZhS2lzc0JlYW0yLAogICAgICBmYVRyYXNoQ2FuQXJyb3dVcCwKICAgICAgZmFUcmFzaFJlc3RvcmVBbHQsCiAgICAgIGZhRm9udCwKICAgICAgZmFCb3JlSG9sZSwKICAgICAgZmFWaXJ1c0NvdmlkLAogICAgICBmYUZpbGVQZGY6IGZhRmlsZVBkZjIsCiAgICAgIGZhTGFuZ3VhZ2UsCiAgICAgIGZhU2hpZWxkSGFsdmVkLAogICAgICBmYVNoaWVsZEFsdCwKICAgICAgZmFDYXJldFVwLAogICAgICBmYUZpbGVQZW4sCiAgICAgIGZhRmlsZUVkaXQsCiAgICAgIGZhUGVyc29uQmlraW5nLAogICAgICBmYUJpa2luZywKICAgICAgZmFCb29rT3BlblJlYWRlciwKICAgICAgZmFCb29rUmVhZGVyLAogICAgICBmYUdsYXNzV2F0ZXJEcm9wbGV0LAogICAgICBmYVRvd2VyQnJvYWRjYXN0LAogICAgICBmYUJyb2FkY2FzdFRvd2VyLAogICAgICBmYU1pbmltaXplLAogICAgICBmYUNvbXByZXNzQXJyb3dzQWx0LAogICAgICBmYUFycm93UmlnaHRUb0NpdHksCiAgICAgIGZhTGFwdG9wTWVkaWNhbCwKICAgICAgZmFCcmVhZFNsaWNlLAogICAgICBmYUdsb2JlLAogICAgICBmYUZvbGRlck1pbnVzLAogICAgICBmYU1hc2tGYWNlLAogICAgICBmYUJvbmcsCiAgICAgIGZhUm9hZEJyaWRnZSwKICAgICAgZmFBcnJvd1VwOTEsCiAgICAgIGZhU29ydE51bWVyaWNVcEFsdCwKICAgICAgZmFNb3VudGFpbkNpdHksCiAgICAgIGZhQXJyb3dEb3duOTEsCiAgICAgIGZhU29ydE51bWVyaWNEZXNjLAogICAgICBmYVNvcnROdW1lcmljRG93bkFsdCwKICAgICAgZmFGYWNlR3JpbldpZGU6IGZhRmFjZUdyaW5XaWRlMiwKICAgICAgZmFHcmluQWx0OiBmYUdyaW5BbHQyLAogICAgICBmYVBvb3AsCiAgICAgIGZhRGhhcm1hY2hha3JhLAogICAgICBmYUJhdHRlcnlRdWFydGVyLAogICAgICBmYUJhdHRlcnkyLAogICAgICBmYUFua2gsCiAgICAgIGZhRGlhbW9uZCwKICAgICAgZmFTdWJzY3JpcHQsCiAgICAgIGZhUnVwZWVTaWduLAogICAgICBmYVJ1cGVlLAogICAgICBmYVBlcnNvblJpZmxlLAogICAgICBmYUQsCiAgICAgIGZhU3F1YXJlTmZpLAogICAgICBmYVRlZXRoLAogICAgICBmYU1hZ25pZnlpbmdHbGFzc0RvbGxhciwKICAgICAgZmFTZWFyY2hEb2xsYXIsCiAgICAgIGZhRHVtcHN0ZXJGaXJlLAogICAgICBmYVVwbG9hZCwKICAgICAgZmFVc2VyU2xhc2gsCiAgICAgIGZhVXNlckFsdFNsYXNoLAogICAgICBmYVVzZXJMYXJnZVNsYXNoLAogICAgICBmYUFycm93TGVmdCwKICAgICAgZmFWaWFsVmlydXMsCiAgICAgIGZhQ2hlY2tEb3VibGUsCiAgICAgIGZhUGF3LAogICAgICBmYUhlbG1ldFNhZmV0eSwKICAgICAgZmFIYXJkSGF0LAogICAgICBmYUhhdEhhcmQsCiAgICAgIGZhRSwKICAgICAgZmFGYWNlTGF1Z2hTcXVpbnQ6IGZhRmFjZUxhdWdoU3F1aW50MiwKICAgICAgZmFMYXVnaFNxdWludDogZmFMYXVnaFNxdWludDIsCiAgICAgIGZhRG93bkxlZnRBbmRVcFJpZ2h0VG9DZW50ZXIsCiAgICAgIGZhQ29tcHJlc3NBbHQsCiAgICAgIGZhR2lmdHMsCiAgICAgIGZhQmVkLAogICAgICBmYU1vbmV5QmlsbFRyYW5zZmVyLAogICAgICBmYVBlcnNvblJ1bm5pbmcsCiAgICAgIGZhUnVubmluZywKICAgICAgZmFDaXJjbGVDaGV2cm9uRG93biwKICAgICAgZmFDaGV2cm9uQ2lyY2xlRG93biwKICAgICAgZmFVc2VyTnVyc2UsCiAgICAgIGZhRmFjZUtpc3NXaW5rSGVhcnQ6IGZhRmFjZUtpc3NXaW5rSGVhcnQyLAogICAgICBmYUtpc3NXaW5rSGVhcnQ6IGZhS2lzc1dpbmtIZWFydDIsCiAgICAgIGZhRmlsbCwKICAgICAgZmFNb25leUJpbGwxV2F2ZSwKICAgICAgZmFNb25leUJpbGxXYXZlQWx0LAogICAgICBmYUxhbmRtYXJrLAogICAgICBmYU11c2ljLAogICAgICBmYUJvb2tNZWRpY2FsLAogICAgICBmYVNodWZmbGUsCiAgICAgIGZhUmFuZG9tLAogICAgICBmYVVuZGVybGluZSwKICAgICAgZmFCdWlsZGluZ1VzZXIsCiAgICAgIGZhUm9ib3QsCiAgICAgIGZhUGx1cywKICAgICAgZmFBZGQsCiAgICAgIGZhQ29weTogZmFDb3B5MiwKICAgICAgZmFDaGVzc0tpbmc6IGZhQ2hlc3NLaW5nMiwKICAgICAgZmFIb3VzZUZsb29kV2F0ZXIsCiAgICAgIGZhQml0Y29pblNpZ24sCiAgICAgIGZhQm94LAogICAgICBmYVNxdWFyZVBsdXM6IGZhU3F1YXJlUGx1czIsCiAgICAgIGZhUGx1c1NxdWFyZTogZmFQbHVzU3F1YXJlMiwKICAgICAgZmFBcnJvd3NMZWZ0UmlnaHQsCiAgICAgIGZhQXJyb3dzSCwKICAgICAgZmFGYW4sCiAgICAgIGZhQ3JvdywKICAgICAgZmFGaWxlQ2lyY2xlQ2hlY2ssCiAgICAgIGZhTGlua1NsYXNoLAogICAgICBmYUNoYWluQnJva2VuLAogICAgICBmYUNoYWluU2xhc2gsCiAgICAgIGZhVW5saW5rLAogICAgICBmYUFycm93Um90YXRlUmlnaHQsCiAgICAgIGZhQXJyb3dSaWdodFJvdGF0ZSwKICAgICAgZmFBcnJvd1JvdGF0ZUZvcndhcmQsCiAgICAgIGZhUmVkbywKICAgICAgZmFQZW5DbGlwLAogICAgICBmYVBlbkFsdCwKICAgICAgZmFEb29yQ2xvc2VkLAogICAgICBmYUFycm93RG93bldpZGVTaG9ydCwKICAgICAgZmFTb3J0QW1vdW50QXNjLAogICAgICBmYVNvcnRBbW91bnREb3duLAogICAgICBmYUNhcmV0RG93biwKICAgICAgZmFLLAogICAgICBmYUNoZWNrVG9TbG90LAogICAgICBmYVZvdGVZZWEsCiAgICAgIGZhRmlzaEZpbnMsCiAgICAgIGZhQ29tcHJlc3MsCiAgICAgIGZhQXJyb3dVcEFaLAogICAgICBmYVNvcnRBbHBoYVVwLAogICAgICBmYVVzZXJHcmFkdWF0ZSwKICAgICAgZmFGaWxlQ29kZTogZmFGaWxlQ29kZTIsCiAgICAgIGZhU29hcCwKICAgICAgZmFSZWN5Y2xlLAogICAgICBmYUZhY2VHcmluV2luazogZmFGYWNlR3JpbldpbmsyLAogICAgICBmYUdyaW5XaW5rOiBmYUdyaW5XaW5rMiwKICAgICAgZmFXYXRlckxhZGRlciwKICAgICAgZmFMYWRkZXJXYXRlciwKICAgICAgZmFTd2ltbWluZ1Bvb2wsCiAgICAgIGZhR2VtaW5pLAogICAgICBmYVRvd2VyQ2VsbCwKICAgICAgZmFDb2xvblNpZ24sCiAgICAgIGZhTGFwdG9wRmlsZSwKICAgICAgZmFCYWhhaSwKICAgICAgZmFIYXlrYWwsCiAgICAgIGZhTW9uZXlCaWxsMTogZmFNb25leUJpbGwxMiwKICAgICAgZmFNb25leUJpbGxBbHQ6IGZhTW9uZXlCaWxsQWx0MiwKICAgICAgZmFDbG91ZEJvbHQsCiAgICAgIGZhVGh1bmRlcnN0b3JtLAogICAgICBmYUV0aGVybmV0LAogICAgICBmYUhyeXZuaWFTaWduLAogICAgICBmYUhyeXZuaWEsCiAgICAgIGZhRXllU2xhc2g6IGZhRXllU2xhc2gyLAogICAgICBmYUNhcnRGbGF0YmVkU3VpdGNhc2UsCiAgICAgIGZhTHVnZ2FnZUNhcnQsCiAgICAgIGZhUmFkaWF0aW9uLAogICAgICBmYUZpbGVXb3JkOiBmYUZpbGVXb3JkMiwKICAgICAgZmFCZWRQdWxzZSwKICAgICAgZmFQcm9jZWR1cmVzLAogICAgICBmYVRlbnRzLAogICAgICBmYU11Z0hvdCwKICAgICAgZmFCb2x0LAogICAgICBmYVphcCwKICAgICAgZmFKYXIsCiAgICAgIGZhVHJ1Y2tQbGFuZSwKICAgICAgZmFIYW5kSG9sZGluZ0hlYXJ0LAogICAgICBmYUFycm93Um90YXRlTGVmdCwKICAgICAgZmFBcnJvd0xlZnRSb3RhdGUsCiAgICAgIGZhQXJyb3dSb3RhdGVCYWNrLAogICAgICBmYUFycm93Um90YXRlQmFja3dhcmQsCiAgICAgIGZhVW5kbywKICAgICAgZmFGYWNlQW5ncnk6IGZhRmFjZUFuZ3J5MiwKICAgICAgZmFBbmdyeTogZmFBbmdyeTIsCiAgICAgIGZhQnVyc3QsCiAgICAgIGZhWiwKICAgICAgZmFCYW5kYWdlLAogICAgICBmYUJhbmRBaWQsCiAgICAgIGZhUGxhbmVDaXJjbGVFeGNsYW1hdGlvbiwKICAgICAgZmFCdXNTaWRlLAogICAgICBmYUJ1Z3MsCiAgICAgIGZhQmVlck11Z0VtcHR5LAogICAgICBmYUJlZXIsCiAgICAgIGZhUGVyc29uQ2lyY2xlQ2hlY2ssCiAgICAgIGZhU3RhcGxlciwKICAgICAgZmFIb3VzZU1lZGljYWxDaXJjbGVDaGVjaywKICAgICAgZmFOYWlyYVNpZ24sCiAgICAgIGZhV2lmaSwKICAgICAgZmFXaWZpMywKICAgICAgZmFXaWZpU3Ryb25nLAogICAgICBmYU1vbmV5Q2hlY2tEb2xsYXIsCiAgICAgIGZhTW9uZXlDaGVja0FsdCwKICAgICAgZmFFeWVMb3dWaXNpb24sCiAgICAgIGZhTG93VmlzaW9uLAogICAgICBmYUNpcmNsZUFycm93VXAsCiAgICAgIGZhQXJyb3dDaXJjbGVVcCwKICAgICAgZmFDYW1lcmFSZXRybywKICAgICAgZmFDYXBzdWxlcywKICAgICAgZmFQb28sCiAgICAgIGZhVm9sdW1lLAogICAgICBmYVZvbHVtZU1lZGl1bSwKICAgICAgZmFFbGV2YXRvciwKICAgICAgZmFUYWcsCiAgICAgIGZhRmlsZUNpcmNsZU1pbnVzLAogICAgICBmYURvd25Mb25nLAogICAgICBmYUxvbmdBcnJvd0FsdERvd24sCiAgICAgIGZhQ29tcGFjdERpc2MsCiAgICAgIGZhU3VpdGNhc2VSb2xsaW5nLAogICAgICBmYUJvb2tRdXJhbiwKICAgICAgZmFRdXJhbiwKICAgICAgZmFQaG9uZVNsYXNoLAogICAgICBmYVJvYWRDaXJjbGVDaGVjaywKICAgICAgZmFTaG9wTG9jaywKICAgICAgZmFJbWFnZVBvcnRyYWl0LAogICAgICBmYVBvcnRyYWl0LAogICAgICBmYUJyaWRnZUxvY2ssCiAgICAgIGZhSGFtbWVyLAogICAgICBmYUFycm93VXAxOSwKICAgICAgZmFTb3J0TnVtZXJpY1VwLAogICAgICBmYUNoZXNzS25pZ2h0OiBmYUNoZXNzS25pZ2h0MiwKICAgICAgZmFIb3VzZUZsb29kV2F0ZXJDaXJjbGVBcnJvd1JpZ2h0LAogICAgICBmYUFycm93VXBSaWdodEZyb21TcXVhcmUsCiAgICAgIGZhRXh0ZXJuYWxMaW5rLAogICAgICBmYUFycm93RG93blVwQWNyb3NzTGluZSwKICAgICAgZmFGYWNlR3JpbkJlYW06IGZhRmFjZUdyaW5CZWFtMiwKICAgICAgZmFHcmluQmVhbTogZmFHcmluQmVhbTIsCiAgICAgIGZhUmVjdGFuZ2xlQWQsCiAgICAgIGZhQWQsCiAgICAgIGZhQm9va1RhbmFraCwKICAgICAgZmFUYW5ha2gsCiAgICAgIGZhSG90VHViUGVyc29uLAogICAgICBmYUhvdFR1YiwKICAgICAgZmFGaWxlSGFsZkRhc2hlZCwKICAgICAgZmFPdXRkZW50LAogICAgICBmYURlZGVudCwKICAgICAgZmFIYW5kUGVhY2U6IGZhSGFuZFBlYWNlMiwKICAgICAgZmFIZWFkU2lkZVZpcnVzLAogICAgICBmYUNvbXBhc3M6IGZhQ29tcGFzczIsCiAgICAgIGZhUGVuTmliLAogICAgICBmYVRlbnRBcnJvd3NEb3duLAogICAgICBmYUZvcndhcmRGYXN0LAogICAgICBmYUZhc3RGb3J3YXJkLAogICAgICBmYUNyb3AsCiAgICAgIGZhV2hpc2tleUdsYXNzLAogICAgICBmYUdsYXNzV2hpc2tleSwKICAgICAgZmFTcXVhcmU6IGZhU3F1YXJlMiwKICAgICAgZmFGYWNlR3JpbjogZmFGYWNlR3JpbjIsCiAgICAgIGZhR3JpbjogZmFHcmluMiwKICAgICAgZmFGaWxlQ29udHJhY3QsCiAgICAgIGZhQW5nbGVVcCwKICAgICAgZmFGYWNlU21pbGU6IGZhRmFjZVNtaWxlMiwKICAgICAgZmFTbWlsZTogZmFTbWlsZTIsCiAgICAgIGZhUGVyc29uRHJlc3NCdXJzdCwKICAgICAgZmFEaXZpZGUsCiAgICAgIGZhQ29kZUZvcmssCiAgICAgIGZhSG91c2VGbGFnLAogICAgICBmYUJ1aWxkaW5nQ29sdW1ucywKICAgICAgZmFCYW5rLAogICAgICBmYUluc3RpdHV0aW9uLAogICAgICBmYU11c2V1bSwKICAgICAgZmFVbml2ZXJzaXR5LAogICAgICBmYVJ1ZywKICAgICAgZmFDb2RlTWVyZ2UsCiAgICAgIGZhSG91c2VUc3VuYW1pLAogICAgICBmYU1hZ25pZnlpbmdHbGFzc0NoYXJ0LAogICAgICBmYVVtYnJlbGxhLAogICAgICBmYUhpbGxSb2Nrc2xpZGUsCiAgICAgIGZhVXNlclNlY3JldCwKICAgICAgZmFQYWdlciwKICAgICAgZmFCcmllZmNhc2UsCiAgICAgIGZhVHJvd2VsQnJpY2tzLAogICAgICBmYVNvY2tzLAogICAgICBmYVQsCiAgICAgIGZhTWljcm9jaGlwLAogICAgICBmYVRydWNrTWVkaWNhbCwKICAgICAgZmFBbWJ1bGFuY2UsCiAgICAgIGZhT20sCiAgICAgIGZhTW9zcXVpdG9OZXQsCiAgICAgIGZhUHJlc2NyaXB0aW9uQm90dGxlLAogICAgICBmYVVzZXJzR2VhciwKICAgICAgZmFVc2Vyc0NvZywKICAgICAgZmFSb2FkQ2lyY2xlRXhjbGFtYXRpb24sCiAgICAgIGZhUGF1c2UsCiAgICAgIGZhU3RhZmZTbmFrZSwKICAgICAgZmFSb2RBc2NsZXBpdXMsCiAgICAgIGZhUm9kU25ha2UsCiAgICAgIGZhU3RhZmZBZXNjdWxhcGl1cywKICAgICAgZmFQaWdneUJhbmssCiAgICAgIGZhTW9udW1lbnQsCiAgICAgIGZhQW5nbGVzUmlnaHQsCiAgICAgIGZhQW5nbGVEb3VibGVSaWdodCwKICAgICAgZmFEZXNrdG9wLAogICAgICBmYURlc2t0b3BBbHQsCiAgICAgIGZhUGxhbmVDaXJjbGVYbWFyaywKICAgICAgZmFSZXR3ZWV0LAogICAgICBmYVVzZXJHZWFyLAogICAgICBmYVVzZXJDb2csCiAgICAgIGZhQm9yZGVyQWxsLAogICAgICBmYUNvaW5zLAogICAgICBmYU1hcnNTdHJva2UsCiAgICAgIGZhSGFuZHNoYWtlQW5nbGUsCiAgICAgIGZhSGFuZHNIZWxwaW5nLAogICAgICBmYUFycm93RG93biwKICAgICAgZmFMb2NhdGlvbkRvdCwKICAgICAgZmFNYXBNYXJrZXJBbHQsCiAgICAgIGZhUGx1Z0NpcmNsZUV4Y2xhbWF0aW9uLAogICAgICBmYUNvb2tpZUJpdGUsCiAgICAgIGZhU2NyZXdkcml2ZXJXcmVuY2gsCiAgICAgIGZhVG9vbHMsCiAgICAgIGZhSW5kZW50LAogICAgICBmYUJhcnMsCiAgICAgIGZhTmF2aWNvbiwKICAgICAgZmFIYW5kc1ByYXlpbmcsCiAgICAgIGZhUHJheWluZ0hhbmRzLAogICAgICBmYVZpcnVzZXMsCiAgICAgIGZhU2Nob29sRmxhZywKICAgICAgZmFUcmFkZW1hcmssCiAgICAgIGZhRmlyZUJ1cm5lciwKICAgICAgZmFGYWNlU21pbGVCZWFtOiBmYUZhY2VTbWlsZUJlYW0yLAogICAgICBmYVNtaWxlQmVhbTogZmFTbWlsZUJlYW0yLAogICAgICBmYVRlbnRBcnJvd0xlZnRSaWdodCwKICAgICAgZmFSb3V0ZSwKICAgICAgZmFBbmdsZXNVcCwKICAgICAgZmFBbmdsZURvdWJsZVVwLAogICAgICBmYUJ1Y2tldCwKICAgICAgZmFMZXNzVGhhbkVxdWFsLAogICAgICBmYUZvbGRlckNsb3NlZDogZmFGb2xkZXJDbG9zZWQyLAogICAgICBmYVBlcnNvblRocm91Z2hXaW5kb3csCiAgICAgIGZhU2Nob29sTG9jaywKICAgICAgZmFQZXJzb25CdXJzdCwKICAgICAgZmFMZWZ0TG9uZywKICAgICAgZmFMb25nQXJyb3dBbHRMZWZ0LAogICAgICBmYUxvY2F0aW9uQ3Jvc3NoYWlycywKICAgICAgZmFMb2NhdGlvbiwKICAgICAgZmFQZXJzb25Eb3RzRnJvbUxpbmUsCiAgICAgIGZhRGlhZ25vc2VzLAogICAgICBmYUdhdWdlU2ltcGxlSGlnaCwKICAgICAgZmFUYWNob21ldGVyLAogICAgICBmYVRhY2hvbWV0ZXJGYXN0LAogICAgICBmYUFuZ2xlc0xlZnQsCiAgICAgIGZhQW5nbGVEb3VibGVMZWZ0LAogICAgICBmYVVwRG93biwKICAgICAgZmFBcnJvd3NBbHRWLAogICAgICBmYUJhdHRlcnlFbXB0eSwKICAgICAgZmFCYXR0ZXJ5MCwKICAgICAgZmFLZXlib2FyZDogZmFLZXlib2FyZDIsCiAgICAgIGZhQ29va2llLAogICAgICBmYVN0b3B3YXRjaCwKICAgICAgZmFFamVjdCwKICAgICAgZmFTYXRlbGxpdGVEaXNoLAogICAgICBmYUZhY2VSb2xsaW5nRXllczogZmFGYWNlUm9sbGluZ0V5ZXMyLAogICAgICBmYU1laFJvbGxpbmdFeWVzOiBmYU1laFJvbGxpbmdFeWVzMiwKICAgICAgZmFMaXN0Q2hlY2ssCiAgICAgIGZhVGFza3MsCiAgICAgIGZhU2Fja1htYXJrLAogICAgICBmYUhhc2h0YWcsCiAgICAgIGZhVHJhaW4sCiAgICAgIGZhR2FtZXBhZCwKICAgICAgZmFGaWxlRXhwb3J0LAogICAgICBmYUFycm93UmlnaHRGcm9tRmlsZSwKICAgICAgZmFGYWNlR3JpbWFjZTogZmFGYWNlR3JpbWFjZTIsCiAgICAgIGZhR3JpbWFjZTogZmFHcmltYWNlMiwKICAgICAgZmFUcmFpblN1YndheSwKICAgICAgZmFTdWJ3YXksCiAgICAgIGZhQ2lyY2xlRG90OiBmYUNpcmNsZURvdDIsCiAgICAgIGZhRG90Q2lyY2xlOiBmYURvdENpcmNsZTIsCiAgICAgIGZhT2JqZWN0R3JvdXA6IGZhT2JqZWN0R3JvdXAyLAogICAgICBmYVNoaXAsCiAgICAgIGZhQywKICAgICAgZmFTcXVhcmVQaG9uZSwKICAgICAgZmFQaG9uZVNxdWFyZSwKICAgICAgZmFSdWxlckNvbWJpbmVkLAogICAgICBmYUFycm93c1JvdGF0ZSwKICAgICAgZmFSZWZyZXNoLAogICAgICBmYVN5bmMsCiAgICAgIGZhUGVyc29uRHJlc3MsCiAgICAgIGZhRmVtYWxlLAogICAgICBmYUJvb2tPcGVuLAogICAgICBmYUZvbGRlclRyZWUsCiAgICAgIGZhVmlyZ28sCiAgICAgIGZhQm94QXJjaGl2ZSwKICAgICAgZmFBcmNoaXZlLAogICAgICBmYVRlbnRBcnJvd0Rvd25Ub0xpbmUsCiAgICAgIGZhUXJjb2RlLAogICAgICBmYURyYWdvbiwKICAgICAgZmFIb3VyZ2xhc3NFbmQsCiAgICAgIGZhSG91cmdsYXNzMzogZmFIb3VyZ2xhc3MzMiwKICAgICAgZmFHcmlwLAogICAgICBmYUdyaWRIb3Jpem9udGFsLAogICAgICBmYUdyaXBIb3Jpem9udGFsLAogICAgICBmYUJvcmRlclRvcExlZnQsCiAgICAgIGZhQm9yZGVyU3R5bGUsCiAgICAgIGZhTGlzdFVsLAogICAgICBmYUxpc3REb3RzLAogICAgICBmYVBlb3BsZVJvYmJlcnksCiAgICAgIGZhTW9iaWxlQnV0dG9uLAogICAgICBmYUFycm93RG93bkFaLAogICAgICBmYVNvcnRBbHBoYUFzYywKICAgICAgZmFTb3J0QWxwaGFEb3duLAogICAgICBmYU1vbmV5QmlsbCwKICAgICAgZmFDaXJjbGVNaW51cywKICAgICAgZmFNaW51c0NpcmNsZSwKICAgICAgZmFBcnJvd1BvaW50ZXIsCiAgICAgIGZhTW91c2VQb2ludGVyLAogICAgICBmYVNxdWFyZVNoYXJlTm9kZXMsCiAgICAgIGZhU2hhcmVBbHRTcXVhcmUsCiAgICAgIGZhVGFibGVDZWxsc0xhcmdlLAogICAgICBmYVRoTGFyZ2UsCiAgICAgIGZhQ2F0LAogICAgICBmYUNhbGVuZGFyV2VlaywKICAgICAgZmFDb2RlQ29tcGFyZSwKICAgICAgZmFMZW8sCiAgICAgIGZhUm9hZENpcmNsZVhtYXJrLAogICAgICBmYVBhbGxldCwKICAgICAgZmFDYWtlQ2FuZGxlcywKICAgICAgZmFCaXJ0aGRheUNha2UsCiAgICAgIGZhQ2FrZSwKICAgICAgZmFCdWdTbGFzaCwKICAgICAgZmFUYXJwLAogICAgICBmYURpYWdyYW1QcmVkZWNlc3NvciwKICAgICAgZmFGYWNlRmx1c2hlZDogZmFGYWNlRmx1c2hlZDIsCiAgICAgIGZhRmx1c2hlZDogZmFGbHVzaGVkMiwKICAgICAgZmFEaWFncmFtTmV4dCwKICAgICAgZmFBbmNob3JDaXJjbGVYbWFyaywKICAgICAgZmFQZXJzb25DaXJjbGVYbWFyaywKICAgICAgZmFTcGEsCiAgICAgIGZhQXJpZXMsCiAgICAgIGZhQmFyc1Byb2dyZXNzLAogICAgICBmYVRhc2tzQWx0LAogICAgICBmYUhlYXJ0Q2lyY2xlQ2hlY2ssCiAgICAgIGZhTWFyc1N0cm9rZVJpZ2h0LAogICAgICBmYU1hcnNTdHJva2VILAogICAgICBmYVRvd2VyT2JzZXJ2YXRpb24sCiAgICAgIGZhU3RlcmxpbmdTaWduLAogICAgICBmYUdicCwKICAgICAgZmFQb3VuZFNpZ24sCiAgICAgIGZhRmF1Y2V0RHJpcCwKICAgICAgZmFDaXJjbGVJbmZvLAogICAgICBmYUluZm9DaXJjbGUsCiAgICAgIGZhRmVhdGhlciwKICAgICAgZmFCb3dsUmljZSwKICAgICAgZmFTdGFySGFsZlN0cm9rZTogZmFTdGFySGFsZlN0cm9rZTIsCiAgICAgIGZhU3RhckhhbGZBbHQ6IGZhU3RhckhhbGZBbHQyLAogICAgICBmYVRlbXBlcmF0dXJlQXJyb3dEb3duLAogICAgICBmYVRlbXBlcmF0dXJlRG93biwKICAgICAgZmFNYXNrVmVudGlsYXRvciwKICAgICAgZmFGaWxlVmlkZW86IGZhRmlsZVZpZGVvMiwKICAgICAgZmFBcnJvd1RyZW5kRG93biwKICAgICAgZmFPaWxDYW4sCiAgICAgIGZhUGVvcGxlQ2FycnlCb3gsCiAgICAgIGZhUGVvcGxlQ2FycnksCiAgICAgIGZhQ2hhaXIsCiAgICAgIGZhV2luZCwKICAgICAgZmFMYXllckdyb3VwLAogICAgICBmYUhlYWRTaWRlTWFzaywKICAgICAgZmFIYW5kcywKICAgICAgZmFTaWduTGFuZ3VhZ2UsCiAgICAgIGZhU2lnbmluZywKICAgICAgZmFUYWJsZXRzLAogICAgICBmYVdlaWdodEhhbmdpbmcsCiAgICAgIGZhRGljZSwKICAgICAgZmFTaG9wU2xhc2gsCiAgICAgIGZhU3RvcmVBbHRTbGFzaCwKICAgICAgZmFTb3J0RG93biwKICAgICAgZmFTb3J0RGVzYywKICAgICAgZmFQZXNldGFTaWduLAogICAgICBmYVRhYmxldFNjcmVlbkJ1dHRvbiwKICAgICAgZmFUYWJsZXRBbHQsCiAgICAgIGZhSGFuZEhvbGRpbmdEb2xsYXIsCiAgICAgIGZhSGFuZEhvbGRpbmdVc2QsCiAgICAgIGZhU2hpZWxkLAogICAgICBmYVNoaWVsZEJsYW5rLAogICAgICBmYUZhY2VMYXVnaDogZmFGYWNlTGF1Z2gyLAogICAgICBmYUxhdWdoOiBmYUxhdWdoMiwKICAgICAgZmFIYW5kc0hvbGRpbmcsCiAgICAgIGZhQ2FydFNob3BwaW5nLAogICAgICBmYVNob3BwaW5nQ2FydCwKICAgICAgZmFPY3RhZ29uLAogICAgICBmYUhhbmRQb2ludGVyOiBmYUhhbmRQb2ludGVyMiwKICAgICAgZmFSZWdpc3RlcmVkOiBmYVJlZ2lzdGVyZWQyLAogICAgICBmYUhvdXNlU2lnbmFsLAogICAgICBmYUJhbmdsYWRlc2hpVGFrYVNpZ24KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2RlZmF1bHRBdHRyaWJ1dGVzLmpzCnZhciBkZWZhdWx0QXR0cmlidXRlczsKdmFyIGluaXRfZGVmYXVsdEF0dHJpYnV0ZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2RlZmF1bHRBdHRyaWJ1dGVzLmpzIigpIHsKICAgIGRlZmF1bHRBdHRyaWJ1dGVzID0gewogICAgICB4bWxuczogImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwKICAgICAgd2lkdGg6IDI0LAogICAgICBoZWlnaHQ6IDI0LAogICAgICB2aWV3Qm94OiAiMCAwIDI0IDI0IiwKICAgICAgZmlsbDogIm5vbmUiLAogICAgICBzdHJva2U6ICJjdXJyZW50Q29sb3IiLAogICAgICAic3Ryb2tlLXdpZHRoIjogMiwKICAgICAgInN0cm9rZS1saW5lY2FwIjogInJvdW5kIiwKICAgICAgInN0cm9rZS1saW5lam9pbiI6ICJyb3VuZCIKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2NyZWF0ZUVsZW1lbnQuanMKdmFyIGNyZWF0ZVNWR0VsZW1lbnQsIGNyZWF0ZUVsZW1lbnQyOwp2YXIgaW5pdF9jcmVhdGVFbGVtZW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9jcmVhdGVFbGVtZW50LmpzIigpIHsKICAgIGluaXRfZGVmYXVsdEF0dHJpYnV0ZXMoKTsKICAgIGNyZWF0ZVNWR0VsZW1lbnQgPSAoW3RhZywgYXR0cnMsIGNoaWxkcmVuMl0pID0+IHsKICAgICAgY29uc3QgZWxlbWVudDQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwgdGFnKTsKICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goKG5hbWUpID0+IHsKICAgICAgICBlbGVtZW50NC5zZXRBdHRyaWJ1dGUobmFtZSwgU3RyaW5nKGF0dHJzW25hbWVdKSk7CiAgICAgIH0pOwogICAgICBpZiAoY2hpbGRyZW4yPy5sZW5ndGgpIHsKICAgICAgICBjaGlsZHJlbjIuZm9yRWFjaCgoY2hpbGQpID0+IHsKICAgICAgICAgIGNvbnN0IGNoaWxkRWxlbWVudCA9IGNyZWF0ZVNWR0VsZW1lbnQoY2hpbGQpOwogICAgICAgICAgZWxlbWVudDQuYXBwZW5kQ2hpbGQoY2hpbGRFbGVtZW50KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gZWxlbWVudDQ7CiAgICB9OwogICAgY3JlYXRlRWxlbWVudDIgPSAoaWNvbk5vZGUsIGN1c3RvbUF0dHJzID0ge30pID0+IHsKICAgICAgY29uc3QgdGFnID0gInN2ZyI7CiAgICAgIGNvbnN0IGF0dHJzID0gewogICAgICAgIC4uLmRlZmF1bHRBdHRyaWJ1dGVzLAogICAgICAgIC4uLmN1c3RvbUF0dHJzCiAgICAgIH07CiAgICAgIHJldHVybiBjcmVhdGVTVkdFbGVtZW50KFt0YWcsIGF0dHJzLCBpY29uTm9kZV0pOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vc2hhcmVkL3NyYy91dGlscy9oYXNBMTF5UHJvcC5qcwp2YXIgaGFzQTExeVByb3A7CnZhciBpbml0X2hhc0ExMXlQcm9wID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9zaGFyZWQvc3JjL3V0aWxzL2hhc0ExMXlQcm9wLmpzIigpIHsKICAgIGhhc0ExMXlQcm9wID0gKHByb3BzKSA9PiB7CiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwcm9wcykgewogICAgICAgIGlmIChwcm9wLnN0YXJ0c1dpdGgoImFyaWEtIikgfHwgcHJvcCA9PT0gInJvbGUiIHx8IHByb3AgPT09ICJ0aXRsZSIpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9zaGFyZWQvc3JjL3V0aWxzL21lcmdlQ2xhc3Nlcy5qcwp2YXIgbWVyZ2VDbGFzc2VzOwp2YXIgaW5pdF9tZXJnZUNsYXNzZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL3NoYXJlZC9zcmMvdXRpbHMvbWVyZ2VDbGFzc2VzLmpzIigpIHsKICAgIG1lcmdlQ2xhc3NlcyA9ICguLi5jbGFzc2VzKSA9PiBjbGFzc2VzLmZpbHRlcigoY2xhc3NOYW1lLCBpbmRleDIsIGFycmF5KSA9PiB7CiAgICAgIHJldHVybiBCb29sZWFuKGNsYXNzTmFtZSkgJiYgY2xhc3NOYW1lLnRyaW0oKSAhPT0gIiIgJiYgYXJyYXkuaW5kZXhPZihjbGFzc05hbWUpID09PSBpbmRleDI7CiAgICB9KS5qb2luKCIgIikudHJpbSgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9zaGFyZWQvc3JjL3V0aWxzL3RvQ2FtZWxDYXNlLmpzCnZhciB0b0NhbWVsQ2FzZTsKdmFyIGluaXRfdG9DYW1lbENhc2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL3NoYXJlZC9zcmMvdXRpbHMvdG9DYW1lbENhc2UuanMiKCkgewogICAgdG9DYW1lbENhc2UgPSAoc3RyaW5nMykgPT4gc3RyaW5nMy5yZXBsYWNlKAogICAgICAvXihbQS1aXSl8W1xzLV9dKyhcdykvZywKICAgICAgKG1hdGNoMiwgcDEsIHAyMikgPT4gcDIyID8gcDIyLnRvVXBwZXJDYXNlKCkgOiBwMS50b0xvd2VyQ2FzZSgpCiAgICApOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9zaGFyZWQvc3JjL3V0aWxzL3RvUGFzY2FsQ2FzZS5qcwp2YXIgdG9QYXNjYWxDYXNlOwp2YXIgaW5pdF90b1Bhc2NhbENhc2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL3NoYXJlZC9zcmMvdXRpbHMvdG9QYXNjYWxDYXNlLmpzIigpIHsKICAgIGluaXRfdG9DYW1lbENhc2UoKTsKICAgIHRvUGFzY2FsQ2FzZSA9IChzdHJpbmczKSA9PiB7CiAgICAgIGNvbnN0IGNhbWVsQ2FzZSA9IHRvQ2FtZWxDYXNlKHN0cmluZzMpOwogICAgICByZXR1cm4gY2FtZWxDYXNlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgY2FtZWxDYXNlLnNsaWNlKDEpOwogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vcmVwbGFjZUVsZW1lbnQuanMKdmFyIGdldEF0dHJzLCBnZXRDbGFzc05hbWVzLCByZXBsYWNlRWxlbWVudDsKdmFyIGluaXRfcmVwbGFjZUVsZW1lbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL3JlcGxhY2VFbGVtZW50LmpzIigpIHsKICAgIGluaXRfY3JlYXRlRWxlbWVudCgpOwogICAgaW5pdF9kZWZhdWx0QXR0cmlidXRlcygpOwogICAgaW5pdF9oYXNBMTF5UHJvcCgpOwogICAgaW5pdF9tZXJnZUNsYXNzZXMoKTsKICAgIGluaXRfdG9QYXNjYWxDYXNlKCk7CiAgICBnZXRBdHRycyA9IChlbGVtZW50NCkgPT4gQXJyYXkuZnJvbShlbGVtZW50NC5hdHRyaWJ1dGVzKS5yZWR1Y2UoKGF0dHJzLCBhdHRyKSA9PiB7CiAgICAgIGF0dHJzW2F0dHIubmFtZV0gPSBhdHRyLnZhbHVlOwogICAgICByZXR1cm4gYXR0cnM7CiAgICB9LCB7fSk7CiAgICBnZXRDbGFzc05hbWVzID0gKGF0dHJzKSA9PiB7CiAgICAgIGlmICh0eXBlb2YgYXR0cnMgPT09ICJzdHJpbmciKSByZXR1cm4gYXR0cnM7CiAgICAgIGlmICghYXR0cnMgfHwgIWF0dHJzLmNsYXNzKSByZXR1cm4gIiI7CiAgICAgIGlmIChhdHRycy5jbGFzcyAmJiB0eXBlb2YgYXR0cnMuY2xhc3MgPT09ICJzdHJpbmciKSB7CiAgICAgICAgcmV0dXJuIGF0dHJzLmNsYXNzLnNwbGl0KCIgIik7CiAgICAgIH0KICAgICAgaWYgKGF0dHJzLmNsYXNzICYmIEFycmF5LmlzQXJyYXkoYXR0cnMuY2xhc3MpKSB7CiAgICAgICAgcmV0dXJuIGF0dHJzLmNsYXNzOwogICAgICB9CiAgICAgIHJldHVybiAiIjsKICAgIH07CiAgICByZXBsYWNlRWxlbWVudCA9IChlbGVtZW50NCwgeyBuYW1lQXR0ciwgaWNvbnM6IGljb25zNSwgYXR0cnMgfSkgPT4gewogICAgICBjb25zdCBpY29uTmFtZSA9IGVsZW1lbnQ0LmdldEF0dHJpYnV0ZShuYW1lQXR0cik7CiAgICAgIGlmIChpY29uTmFtZSA9PSBudWxsKSByZXR1cm47CiAgICAgIGNvbnN0IENvbXBvbmVudE5hbWUgPSB0b1Bhc2NhbENhc2UoaWNvbk5hbWUpOwogICAgICBjb25zdCBpY29uTm9kZSA9IGljb25zNVtDb21wb25lbnROYW1lXTsKICAgICAgaWYgKCFpY29uTm9kZSkgewogICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oCiAgICAgICAgICBgJHtlbGVtZW50NC5vdXRlckhUTUx9IGljb24gbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBwcm92aWRlZCBpY29ucyBvYmplY3QuYAogICAgICAgICk7CiAgICAgIH0KICAgICAgY29uc3QgZWxlbWVudEF0dHJzID0gZ2V0QXR0cnMoZWxlbWVudDQpOwogICAgICBjb25zdCBhcmlhUHJvcHMgPSBoYXNBMTF5UHJvcChlbGVtZW50QXR0cnMpID8ge30gOiB7ICJhcmlhLWhpZGRlbiI6ICJ0cnVlIiB9OwogICAgICBjb25zdCBpY29uQXR0cnMgPSB7CiAgICAgICAgLi4uZGVmYXVsdEF0dHJpYnV0ZXMsCiAgICAgICAgImRhdGEtbHVjaWRlIjogaWNvbk5hbWUsCiAgICAgICAgLi4uYXJpYVByb3BzLAogICAgICAgIC4uLmF0dHJzLAogICAgICAgIC4uLmVsZW1lbnRBdHRycwogICAgICB9OwogICAgICBjb25zdCBlbGVtZW50Q2xhc3NOYW1lcyA9IGdldENsYXNzTmFtZXMoZWxlbWVudEF0dHJzKTsKICAgICAgY29uc3QgY2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lcyhhdHRycyk7CiAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBtZXJnZUNsYXNzZXMoCiAgICAgICAgImx1Y2lkZSIsCiAgICAgICAgYGx1Y2lkZS0ke2ljb25OYW1lfWAsCiAgICAgICAgLi4uZWxlbWVudENsYXNzTmFtZXMsCiAgICAgICAgLi4uY2xhc3NOYW1lCiAgICAgICk7CiAgICAgIGlmIChjbGFzc05hbWVzKSB7CiAgICAgICAgT2JqZWN0LmFzc2lnbihpY29uQXR0cnMsIHsKICAgICAgICAgIGNsYXNzOiBjbGFzc05hbWVzCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgY29uc3Qgc3ZnRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQyKGljb25Ob2RlLCBpY29uQXR0cnMpOwogICAgICByZXR1cm4gZWxlbWVudDQucGFyZW50Tm9kZT8ucmVwbGFjZUNoaWxkKHN2Z0VsZW1lbnQsIGVsZW1lbnQ0KTsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2EtYXJyb3ctZG93bi5qcwp2YXIgQUFycm93RG93bjsKdmFyIGluaXRfYV9hcnJvd19kb3duID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hLWFycm93LWRvd24uanMiKCkgewogICAgQUFycm93RG93biA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDEyIDQgNCA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTZWNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDE2IDQuMDM5LTkuNjlhLjUuNSAwIDAgMSAuOTIzIDBMMTEgMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy4zMDQgMTNoNi4zOTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hLWFycm93LXVwLmpzCnZhciBBQXJyb3dVcDsKdmFyIGluaXRfYV9hcnJvd191cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYS1hcnJvdy11cC5qcyIoKSB7CiAgICBBQXJyb3dVcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDExIDQtNCA0IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTZWNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDE2IDQuMDM5LTkuNjlhLjUuNSAwIDAgMSAuOTIzIDBMMTEgMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy4zMDQgMTNoNi4zOTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hLWxhcmdlLXNtYWxsLmpzCnZhciBBTGFyZ2VTbWFsbDsKdmFyIGluaXRfYV9sYXJnZV9zbWFsbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYS1sYXJnZS1zbWFsbC5qcyIoKSB7CiAgICBBTGFyZ2VTbWFsbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDE2IDIuNTM2LTcuMzI4YTEuMDIgMS4wMiAxIDAgMSAxLjkyOCAwTDIyIDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1LjY5NyAxNGg1LjYwNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDE2IDQuMDM5LTkuNjlhLjUuNSAwIDAgMSAuOTIzIDBMMTEgMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy4zMDQgMTNoNi4zOTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hY2Nlc3NpYmlsaXR5LmpzCnZhciBBY2Nlc3NpYmlsaXR5Owp2YXIgaW5pdF9hY2Nlc3NpYmlsaXR5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hY2Nlc3NpYmlsaXR5LmpzIigpIHsKICAgIEFjY2Vzc2liaWxpdHkgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE2IiwgY3k6ICI0IiwgcjogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMTkgMS03LTYgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01IDggMy0zIDUuNSAzLTIuMzYgMy41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQuMjQgMTQuNWE1IDUgMCAwIDAgNi44OCA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjc2IDE3LjVhNSA1IDAgMCAwLTYuODgtNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FjdGl2aXR5LmpzCnZhciBBY3Rpdml0eTsKdmFyIGluaXRfYWN0aXZpdHkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FjdGl2aXR5LmpzIigpIHsKICAgIEFjdGl2aXR5ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjIgMTJoLTIuNDhhMiAyIDAgMCAwLTEuOTMgMS40NmwtMi4zNSA4LjM2YS4yNS4yNSAwIDAgMS0uNDggMEw5LjI0IDIuMThhLjI1LjI1IDAgMCAwLS40OCAwbC0yLjM1IDguMzZBMiAyIDAgMCAxIDQuNDkgMTJIMiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fpci12ZW50LmpzCnZhciBBaXJWZW50Owp2YXIgaW5pdF9haXJfdmVudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWlyLXZlbnQuanMiKCkgewogICAgQWlyVmVudCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE3LjVhMi41IDIuNSAwIDEgMS00IDIuMDNWMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxMkg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ2NWEyIDIgMCAwIDEtMiAyaC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgOGgxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjYgMTUuNTcyQTIgMiAwIDEgMCAxMCAxN3YtNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FpcnBsYXkuanMKdmFyIEFpcnBsYXk7CnZhciBpbml0X2FpcnBsYXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FpcnBsYXkuanMiKCkgewogICAgQWlycGxheSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTdINGEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmgxNmEyIDIgMCAwIDEgMiAydjEwYTIgMiAwIDAgMS0yIDJoLTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIgMTUgNSA2SDdaIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxhcm0tY2xvY2stbWludXMuanMKdmFyIEFsYXJtQ2xvY2tNaW51czsKdmFyIGluaXRfYWxhcm1fY2xvY2tfbWludXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsYXJtLWNsb2NrLW1pbnVzLmpzIigpIHsKICAgIEFsYXJtQ2xvY2tNaW51cyA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEzIiwgcjogIjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAzIDIgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiA2LTMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjM4IDE4LjcgNCAyMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy42NCAxOC42NyAyMCAyMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDEzaDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGFybS1jbG9jay1jaGVjay5qcwp2YXIgQWxhcm1DbG9ja0NoZWNrOwp2YXIgaW5pdF9hbGFybV9jbG9ja19jaGVjayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxhcm0tY2xvY2stY2hlY2suanMiKCkgewogICAgQWxhcm1DbG9ja0NoZWNrID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTMiLCByOiAiOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDMgMiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDYtMy0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMzggMTguNyA0IDIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjY0IDE4LjY3IDIwIDIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTMgMiAyIDQtNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsYXJtLWNsb2NrLW9mZi5qcwp2YXIgQWxhcm1DbG9ja09mZjsKdmFyIGluaXRfYWxhcm1fY2xvY2tfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGFybS1jbG9jay1vZmYuanMiKCkgewogICAgQWxhcm1DbG9ja09mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuODcgNi44N2E4IDggMCAxIDAgMTEuMjYgMTEuMjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkuOSAxNC4yNWE4IDggMCAwIDAtOS4xNS05LjE1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDYtMy0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMjYgMTguNjcgNCAyMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA0IDIgNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsYXJtLWNsb2NrLmpzCnZhciBBbGFybUNsb2NrOwp2YXIgaW5pdF9hbGFybV9jbG9jayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxhcm0tY2xvY2suanMiKCkgewogICAgQWxhcm1DbG9jayA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEzIiwgcjogIjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOXY0bDIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDMgMiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDYtMy0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMzggMTguNyA0IDIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjY0IDE4LjY3IDIwIDIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxhcm0tY2xvY2stcGx1cy5qcwp2YXIgQWxhcm1DbG9ja1BsdXM7CnZhciBpbml0X2FsYXJtX2Nsb2NrX3BsdXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsYXJtLWNsb2NrLXBsdXMuanMiKCkgewogICAgQWxhcm1DbG9ja1BsdXMgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMyIsIHI6ICI4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMyAyIDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgNi0zLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi4zOCAxOC43IDQgMjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuNjQgMTguNjcgMjAgMjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTB2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDEzaDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGFybS1zbW9rZS5qcwp2YXIgQWxhcm1TbW9rZTsKdmFyIGluaXRfYWxhcm1fc21va2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsYXJtLXNtb2tlLmpzIigpIHsKICAgIEFsYXJtU21va2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAyMWMwLTIuNSAyLTIuNSAyLTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMjFjMC0yLjUgMi0yLjUgMi01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5IDgtLjggM2ExLjI1IDEuMjUgMCAwIDEtMS4yIDFIN2ExLjI1IDEuMjUgMCAwIDEtMS4yLTFMNSA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDNhMSAxIDAgMCAxIDEgMXYyYTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjRhMSAxIDAgMCAxIDEtMXoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAyMWMwLTIuNSAyLTIuNSAyLTUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGJ1bS5qcwp2YXIgQWxidW07CnZhciBpbml0X2FsYnVtID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGJ1bS5qcyIoKSB7CiAgICBBbGJ1bSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiwgcnk6ICIyIiB9XSwKICAgICAgWyJwb2x5bGluZSIsIHsgcG9pbnRzOiAiMTEgMyAxMSAxMSAxNCA4IDE3IDExIDE3IDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi1jZW50ZXItaG9yaXpvbnRhbC5qcwp2YXIgQWxpZ25DZW50ZXJIb3Jpem9udGFsOwp2YXIgaW5pdF9hbGlnbl9jZW50ZXJfaG9yaXpvbnRhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24tY2VudGVyLWhvcml6b250YWwuanMiKCkgewogICAgQWxpZ25DZW50ZXJIb3Jpem9udGFsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmgyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxNnY0YTIgMiAwIDAgMS0yIDJINmEyIDIgMCAwIDEtMi0ydi00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDhWNGEyIDIgMCAwIDAtMi0ySDZhMiAyIDAgMCAwLTIgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE2djFhMiAyIDAgMCAxLTIgMmgtMmEyIDIgMCAwIDEtMi0ydi0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDhWN2MwLTEuMS45LTIgMi0yaDJhMiAyIDAgMCAxIDIgMnYxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24tY2VudGVyLXZlcnRpY2FsLmpzCnZhciBBbGlnbkNlbnRlclZlcnRpY2FsOwp2YXIgaW5pdF9hbGlnbl9jZW50ZXJfdmVydGljYWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLWNlbnRlci12ZXJ0aWNhbC5qcyIoKSB7CiAgICBBbGlnbkNlbnRlclZlcnRpY2FsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnYyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEwSDRhMiAyIDAgMCAxLTItMlY2YzAtMS4xLjktMiAyLTJoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMGg0YTIgMiAwIDAgMCAyLTJWNmEyIDIgMCAwIDAtMi0yaC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjBIN2EyIDIgMCAwIDEtMi0ydi0yYzAtMS4xLjktMiAyLTJoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNGgxYTIgMiAwIDAgMSAyIDJ2MmEyIDIgMCAwIDEtMiAyaC0xIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24tZW5kLWhvcml6b250YWwuanMKdmFyIEFsaWduRW5kSG9yaXpvbnRhbDsKdmFyIGluaXRfYWxpZ25fZW5kX2hvcml6b250YWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLWVuZC1ob3Jpem9udGFsLmpzIigpIHsKICAgIEFsaWduRW5kSG9yaXpvbnRhbCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjYiLCBoZWlnaHQ6ICIxNiIsIHg6ICI0IiwgeTogIjIiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNiIsIGhlaWdodDogIjkiLCB4OiAiMTQiLCB5OiAiOSIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAyMkgyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24tZW5kLXZlcnRpY2FsLmpzCnZhciBBbGlnbkVuZFZlcnRpY2FsOwp2YXIgaW5pdF9hbGlnbl9lbmRfdmVydGljYWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLWVuZC12ZXJ0aWNhbC5qcyIoKSB7CiAgICBBbGlnbkVuZFZlcnRpY2FsID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTYiLCBoZWlnaHQ6ICI2IiwgeDogIjIiLCB5OiAiNCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI5IiwgaGVpZ2h0OiAiNiIsIHg6ICI5IiwgeTogIjE0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDIyVjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi1ob3Jpem9udGFsLWRpc3RyaWJ1dGUtY2VudGVyLmpzCnZhciBBbGlnbkhvcml6b250YWxEaXN0cmlidXRlQ2VudGVyOwp2YXIgaW5pdF9hbGlnbl9ob3Jpem9udGFsX2Rpc3RyaWJ1dGVfY2VudGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi1ob3Jpem9udGFsLWRpc3RyaWJ1dGUtY2VudGVyLmpzIigpIHsKICAgIEFsaWduSG9yaXpvbnRhbERpc3RyaWJ1dGVDZW50ZXIgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI2IiwgaGVpZ2h0OiAiMTQiLCB4OiAiNCIsIHk6ICI1Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjYiLCBoZWlnaHQ6ICIxMCIsIHg6ICIxNCIsIHk6ICI3Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDIydi01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDdWMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIydi0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNVYyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24taG9yaXpvbnRhbC1kaXN0cmlidXRlLWVuZC5qcwp2YXIgQWxpZ25Ib3Jpem9udGFsRGlzdHJpYnV0ZUVuZDsKdmFyIGluaXRfYWxpZ25faG9yaXpvbnRhbF9kaXN0cmlidXRlX2VuZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24taG9yaXpvbnRhbC1kaXN0cmlidXRlLWVuZC5qcyIoKSB7CiAgICBBbGlnbkhvcml6b250YWxEaXN0cmlidXRlRW5kID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNiIsIGhlaWdodDogIjE0IiwgeDogIjQiLCB5OiAiNSIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI2IiwgaGVpZ2h0OiAiMTAiLCB4OiAiMTQiLCB5OiAiNyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAydjIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDJ2MjAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi1ob3Jpem9udGFsLWRpc3RyaWJ1dGUtc3RhcnQuanMKdmFyIEFsaWduSG9yaXpvbnRhbERpc3RyaWJ1dGVTdGFydDsKdmFyIGluaXRfYWxpZ25faG9yaXpvbnRhbF9kaXN0cmlidXRlX3N0YXJ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi1ob3Jpem9udGFsLWRpc3RyaWJ1dGUtc3RhcnQuanMiKCkgewogICAgQWxpZ25Ib3Jpem9udGFsRGlzdHJpYnV0ZVN0YXJ0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNiIsIGhlaWdodDogIjE0IiwgeDogIjQiLCB5OiAiNSIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI2IiwgaGVpZ2h0OiAiMTAiLCB4OiAiMTQiLCB5OiAiNyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDJ2MjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnYyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLWhvcml6b250YWwtanVzdGlmeS1jZW50ZXIuanMKdmFyIEFsaWduSG9yaXpvbnRhbEp1c3RpZnlDZW50ZXI7CnZhciBpbml0X2FsaWduX2hvcml6b250YWxfanVzdGlmeV9jZW50ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLWhvcml6b250YWwtanVzdGlmeS1jZW50ZXIuanMiKCkgewogICAgQWxpZ25Ib3Jpem9udGFsSnVzdGlmeUNlbnRlciA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjYiLCBoZWlnaHQ6ICIxNCIsIHg6ICIyIiwgeTogIjUiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNiIsIGhlaWdodDogIjEwIiwgeDogIjE2IiwgeTogIjciLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnYyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLWhvcml6b250YWwtanVzdGlmeS1lbmQuanMKdmFyIEFsaWduSG9yaXpvbnRhbEp1c3RpZnlFbmQ7CnZhciBpbml0X2FsaWduX2hvcml6b250YWxfanVzdGlmeV9lbmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLWhvcml6b250YWwtanVzdGlmeS1lbmQuanMiKCkgewogICAgQWxpZ25Ib3Jpem9udGFsSnVzdGlmeUVuZCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjYiLCBoZWlnaHQ6ICIxNCIsIHg6ICIyIiwgeTogIjUiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNiIsIGhlaWdodDogIjEwIiwgeDogIjEyIiwgeTogIjciLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMnYyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLWhvcml6b250YWwtanVzdGlmeS1zdGFydC5qcwp2YXIgQWxpZ25Ib3Jpem9udGFsSnVzdGlmeVN0YXJ0Owp2YXIgaW5pdF9hbGlnbl9ob3Jpem9udGFsX2p1c3RpZnlfc3RhcnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLWhvcml6b250YWwtanVzdGlmeS1zdGFydC5qcyIoKSB7CiAgICBBbGlnbkhvcml6b250YWxKdXN0aWZ5U3RhcnQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI2IiwgaGVpZ2h0OiAiMTQiLCB4OiAiNiIsIHk6ICI1Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjYiLCBoZWlnaHQ6ICIxMCIsIHg6ICIxNiIsIHk6ICI3Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMnYyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLWhvcml6b250YWwtc3BhY2UtYXJvdW5kLmpzCnZhciBBbGlnbkhvcml6b250YWxTcGFjZUFyb3VuZDsKdmFyIGluaXRfYWxpZ25faG9yaXpvbnRhbF9zcGFjZV9hcm91bmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLWhvcml6b250YWwtc3BhY2UtYXJvdW5kLmpzIigpIHsKICAgIEFsaWduSG9yaXpvbnRhbFNwYWNlQXJvdW5kID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNiIsIGhlaWdodDogIjEwIiwgeDogIjkiLCB5OiAiNyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDIyVjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMjJWMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLWhvcml6b250YWwtc3BhY2UtYmV0d2Vlbi5qcwp2YXIgQWxpZ25Ib3Jpem9udGFsU3BhY2VCZXR3ZWVuOwp2YXIgaW5pdF9hbGlnbl9ob3Jpem9udGFsX3NwYWNlX2JldHdlZW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLWhvcml6b250YWwtc3BhY2UtYmV0d2Vlbi5qcyIoKSB7CiAgICBBbGlnbkhvcml6b250YWxTcGFjZUJldHdlZW4gPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI2IiwgaGVpZ2h0OiAiMTQiLCB4OiAiMyIsIHk6ICI1Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjYiLCBoZWlnaHQ6ICIxMCIsIHg6ICIxNSIsIHk6ICI3Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMnYyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAydjIwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24tc3RhcnQtaG9yaXpvbnRhbC5qcwp2YXIgQWxpZ25TdGFydEhvcml6b250YWw7CnZhciBpbml0X2FsaWduX3N0YXJ0X2hvcml6b250YWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLXN0YXJ0LWhvcml6b250YWwuanMiKCkgewogICAgQWxpZ25TdGFydEhvcml6b250YWwgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI2IiwgaGVpZ2h0OiAiMTYiLCB4OiAiNCIsIHk6ICI2Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjYiLCBoZWlnaHQ6ICI5IiwgeDogIjE0IiwgeTogIjYiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMkgyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24tc3RhcnQtdmVydGljYWwuanMKdmFyIEFsaWduU3RhcnRWZXJ0aWNhbDsKdmFyIGluaXRfYWxpZ25fc3RhcnRfdmVydGljYWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLXN0YXJ0LXZlcnRpY2FsLmpzIigpIHsKICAgIEFsaWduU3RhcnRWZXJ0aWNhbCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjkiLCBoZWlnaHQ6ICI2IiwgeDogIjYiLCB5OiAiMTQiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTYiLCBoZWlnaHQ6ICI2IiwgeDogIjYiLCB5OiAiNCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDJ2MjAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi12ZXJ0aWNhbC1kaXN0cmlidXRlLWNlbnRlci5qcwp2YXIgQWxpZ25WZXJ0aWNhbERpc3RyaWJ1dGVDZW50ZXI7CnZhciBpbml0X2FsaWduX3ZlcnRpY2FsX2Rpc3RyaWJ1dGVfY2VudGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi12ZXJ0aWNhbC1kaXN0cmlidXRlLWNlbnRlci5qcyIoKSB7CiAgICBBbGlnblZlcnRpY2FsRGlzdHJpYnV0ZUNlbnRlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE3aC0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDdoLTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxN0gyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgN0gyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiNSIsIHk6ICIxNCIsIHdpZHRoOiAiMTQiLCBoZWlnaHQ6ICI2Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiNyIsIHk6ICI0Iiwgd2lkdGg6ICIxMCIsIGhlaWdodDogIjYiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi12ZXJ0aWNhbC1kaXN0cmlidXRlLWVuZC5qcwp2YXIgQWxpZ25WZXJ0aWNhbERpc3RyaWJ1dGVFbmQ7CnZhciBpbml0X2FsaWduX3ZlcnRpY2FsX2Rpc3RyaWJ1dGVfZW5kID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi12ZXJ0aWNhbC1kaXN0cmlidXRlLWVuZC5qcyIoKSB7CiAgICBBbGlnblZlcnRpY2FsRGlzdHJpYnV0ZUVuZCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE0IiwgaGVpZ2h0OiAiNiIsIHg6ICI1IiwgeTogIjE0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjEwIiwgaGVpZ2h0OiAiNiIsIHg6ICI3IiwgeTogIjQiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMGgyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEwaDIwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24tdmVydGljYWwtZGlzdHJpYnV0ZS1zdGFydC5qcwp2YXIgQWxpZ25WZXJ0aWNhbERpc3RyaWJ1dGVTdGFydDsKdmFyIGluaXRfYWxpZ25fdmVydGljYWxfZGlzdHJpYnV0ZV9zdGFydCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24tdmVydGljYWwtZGlzdHJpYnV0ZS1zdGFydC5qcyIoKSB7CiAgICBBbGlnblZlcnRpY2FsRGlzdHJpYnV0ZVN0YXJ0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTQiLCBoZWlnaHQ6ICI2IiwgeDogIjUiLCB5OiAiMTQiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTAiLCBoZWlnaHQ6ICI2IiwgeDogIjciLCB5OiAiNCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE0aDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgNGgyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLXZlcnRpY2FsLWp1c3RpZnktY2VudGVyLmpzCnZhciBBbGlnblZlcnRpY2FsSnVzdGlmeUNlbnRlcjsKdmFyIGluaXRfYWxpZ25fdmVydGljYWxfanVzdGlmeV9jZW50ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLXZlcnRpY2FsLWp1c3RpZnktY2VudGVyLmpzIigpIHsKICAgIEFsaWduVmVydGljYWxKdXN0aWZ5Q2VudGVyID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTQiLCBoZWlnaHQ6ICI2IiwgeDogIjUiLCB5OiAiMTYiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTAiLCBoZWlnaHQ6ICI2IiwgeDogIjciLCB5OiAiMiIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEyaDIwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24tdmVydGljYWwtanVzdGlmeS1lbmQuanMKdmFyIEFsaWduVmVydGljYWxKdXN0aWZ5RW5kOwp2YXIgaW5pdF9hbGlnbl92ZXJ0aWNhbF9qdXN0aWZ5X2VuZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24tdmVydGljYWwtanVzdGlmeS1lbmQuanMiKCkgewogICAgQWxpZ25WZXJ0aWNhbEp1c3RpZnlFbmQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNCIsIGhlaWdodDogIjYiLCB4OiAiNSIsIHk6ICIxMiIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxMCIsIGhlaWdodDogIjYiLCB4OiAiNyIsIHk6ICIyIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjJoMjAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi12ZXJ0aWNhbC1qdXN0aWZ5LXN0YXJ0LmpzCnZhciBBbGlnblZlcnRpY2FsSnVzdGlmeVN0YXJ0Owp2YXIgaW5pdF9hbGlnbl92ZXJ0aWNhbF9qdXN0aWZ5X3N0YXJ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi12ZXJ0aWNhbC1qdXN0aWZ5LXN0YXJ0LmpzIigpIHsKICAgIEFsaWduVmVydGljYWxKdXN0aWZ5U3RhcnQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNCIsIGhlaWdodDogIjYiLCB4OiAiNSIsIHk6ICIxNiIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxMCIsIGhlaWdodDogIjYiLCB4OiAiNyIsIHk6ICI2Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMmgyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLXZlcnRpY2FsLXNwYWNlLWFyb3VuZC5qcwp2YXIgQWxpZ25WZXJ0aWNhbFNwYWNlQXJvdW5kOwp2YXIgaW5pdF9hbGlnbl92ZXJ0aWNhbF9zcGFjZV9hcm91bmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLXZlcnRpY2FsLXNwYWNlLWFyb3VuZC5qcyIoKSB7CiAgICBBbGlnblZlcnRpY2FsU3BhY2VBcm91bmQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxMCIsIGhlaWdodDogIjYiLCB4OiAiNyIsIHk6ICI5Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDIwSDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgNEgyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24tdmVydGljYWwtc3BhY2UtYmV0d2Vlbi5qcwp2YXIgQWxpZ25WZXJ0aWNhbFNwYWNlQmV0d2VlbjsKdmFyIGluaXRfYWxpZ25fdmVydGljYWxfc3BhY2VfYmV0d2VlbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24tdmVydGljYWwtc3BhY2UtYmV0d2Vlbi5qcyIoKSB7CiAgICBBbGlnblZlcnRpY2FsU3BhY2VCZXR3ZWVuID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTQiLCBoZWlnaHQ6ICI2IiwgeDogIjUiLCB5OiAiMTUiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTAiLCBoZWlnaHQ6ICI2IiwgeDogIjciLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIxaDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgM2gyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FtcGVyc2FuZC5qcwp2YXIgQW1wZXJzYW5kOwp2YXIgaW5pdF9hbXBlcnNhbmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FtcGVyc2FuZC5qcyIoKSB7CiAgICBBbXBlcnNhbmQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMmgzIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE3LjUgMTJhOCA4IDAgMCAxLTggOEE0LjUgNC41IDAgMCAxIDUgMTUuNWMwLTYgOC00IDgtOC41YTMgMyAwIDEgMC02IDBjMCAzIDIuNSA4LjUgMTIgMTMiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbWJ1bGFuY2UuanMKdmFyIEFtYnVsYW5jZTsKdmFyIGluaXRfYW1idWxhbmNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbWJ1bGFuY2UuanMiKCkgewogICAgQW1idWxhbmNlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTBINiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxOFY2YTIgMiAwIDAgMC0yLTJINGEyIDIgMCAwIDAtMiAydjExYTEgMSAwIDAgMCAxIDFoMiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOSAxOGgyYTEgMSAwIDAgMCAxLTF2LTMuMjhhMSAxIDAgMCAwLS42ODQtLjk0OGwtMS45MjMtLjY0MWExIDEgMCAwIDEtLjU3OC0uNTAybC0xLjUzOS0zLjA3NkExIDEgMCAwIDAgMTYuMzgyIDhIMTQiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA4djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxOGg2IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTciLCBjeTogIjE4IiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI3IiwgY3k6ICIxOCIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYW1wZXJzYW5kcy5qcwp2YXIgQW1wZXJzYW5kczsKdmFyIGluaXRfYW1wZXJzYW5kcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYW1wZXJzYW5kcy5qcyIoKSB7CiAgICBBbXBlcnNhbmRzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk0xMCAxN2MtNS0zLTctNy03LTlhMiAyIDAgMCAxIDQgMGMwIDIuNS01IDIuNS01IDYgMCAxLjcgMS4zIDMgMyAzIDIuOCAwIDUtMi4yIDUtNSIgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk0yMiAxN2MtNS0zLTctNy03LTlhMiAyIDAgMCAxIDQgMGMwIDIuNS01IDIuNS01IDYgMCAxLjcgMS4zIDMgMyAzIDIuOCAwIDUtMi4yIDUtNSIgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbXBob3JhLmpzCnZhciBBbXBob3JhOwp2YXIgaW5pdF9hbXBob3JhID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbXBob3JhLmpzIigpIHsKICAgIEFtcGhvcmEgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAydjUuNjMyYzAgLjQyNC0uMjcyLjc5NS0uNjUzLjk4MkE2IDYgMCAwIDAgNiAxNGMuMDA2IDQgMyA3IDUgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA1SDhhMiAyIDAgMCAwIDAgNGguNjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1LjYzMmMwIC40MjQuMjcyLjc5NS42NTIuOTgyQTYgNiAwIDAgMSAxOCAxNGMwIDQtMyA3LTUgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA1aDJhMiAyIDAgMCAxIDAgNGgtLjY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDIySDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAyaDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbmNob3IuanMKdmFyIEFuY2hvcjsKdmFyIGluaXRfYW5jaG9yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbmNob3IuanMiKCkgewogICAgQW5jaG9yID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOSAxMyAyLTFhOSA5IDAgMCAxLTE4IDBsMiAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTFoNiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICI0IiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbmdyeS5qcwp2YXIgQW5ncnk7CnZhciBpbml0X2FuZ3J5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbmdyeS5qcyIoKSB7CiAgICBBbmdyeSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE2cy0xLjUtMi00LTItNCAyLTQgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03LjUgOCAxMCA5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDkgMi41LTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTBoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYW5ub3llZC5qcwp2YXIgQW5ub3llZDsKdmFyIGluaXRfYW5ub3llZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYW5ub3llZC5qcyIoKSB7CiAgICBBbm5veWVkID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNWg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggOWgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDloMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FudGVubmEuanMKdmFyIEFudGVubmE7CnZhciBpbml0X2FudGVubmEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FudGVubmEuanMiKCkgewogICAgQW50ZW5uYSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTIgNyAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMTIgNS0xMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMiAxMiA1LTEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDEyIDUtMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC41IDdoMTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTZ2NiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FudmlsLmpzCnZhciBBbnZpbDsKdmFyIGluaXRfYW52aWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FudmlsLmpzIigpIHsKICAgIEFudmlsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMEg2YTQgNCAwIDAgMS00LTQgMSAxIDAgMCAxIDEtMWg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNWExIDEgMCAwIDEgMS0xaDEzYTEgMSAwIDAgMSAxIDEgNyA3IDAgMCAxLTcgN0g4YTEgMSAwIDAgMS0xLTF6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTJ2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxMnY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMjBhMyAzIDAgMCAxIDMtM2g4YTMgMyAwIDAgMSAzIDMgMSAxIDAgMCAxLTEgMUg2YTEgMSAwIDAgMS0xLTEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcGVydHVyZS5qcwp2YXIgQXBlcnR1cmU7CnZhciBpbml0X2FwZXJ0dXJlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcGVydHVyZS5qcyIoKSB7CiAgICBBcGVydHVyZSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0LjMxIDggNS43NCA5Ljk0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuNjkgOGgxMS40OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03LjM4IDEyIDUuNzQtOS45NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjY5IDE2IDMuOTUgNi4wNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNC4zMSAxNkgyLjgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2LjYyIDEyLTUuNzQgOS45NCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FwcC13aW5kb3ctbWFjLmpzCnZhciBBcHBXaW5kb3dNYWM7CnZhciBpbml0X2FwcF93aW5kb3dfbWFjID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcHAtd2luZG93LW1hYy5qcyIoKSB7CiAgICBBcHBXaW5kb3dNYWMgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE2IiwgeDogIjIiLCB5OiAiNCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDhoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDhoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDhoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXBwLXdpbmRvdy5qcwp2YXIgQXBwV2luZG93Owp2YXIgaW5pdF9hcHBfd2luZG93ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcHAtd2luZG93LmpzIigpIHsKICAgIEFwcFdpbmRvdyA9IFsKICAgICAgWyJyZWN0IiwgeyB4OiAiMiIsIHk6ICI0Iiwgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE2Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDR2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDhoMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA0djQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcHBsZS5qcwp2YXIgQXBwbGU7CnZhciBpbml0X2FwcGxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcHBsZS5qcyIoKSB7CiAgICBBcHBsZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDYuNTI4VjNhMSAxIDAgMCAxIDEtMWgwIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE4LjIzNyAyMUExNSAxNSAwIDAgMCAyMiAxMWE2IDYgMCAwIDAtMTAtNC40NzJBNiA2IDAgMCAwIDIgMTFhMTUuMSAxNS4xIDAgMCAwIDMuNzYzIDEwIDMgMyAwIDAgMCAzLjY0OC42NDggNS41IDUuNSAwIDAgMSA1LjE3OCAwQTMgMyAwIDAgMCAxOC4yMzcgMjEiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcmNoaXZlLXJlc3RvcmUuanMKdmFyIEFyY2hpdmVSZXN0b3JlOwp2YXIgaW5pdF9hcmNoaXZlX3Jlc3RvcmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FyY2hpdmUtcmVzdG9yZS5qcyIoKSB7CiAgICBBcmNoaXZlUmVzdG9yZSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiNSIsIHg6ICIyIiwgeTogIjMiLCByeDogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA4djExYTIgMiAwIDAgMCAyIDJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCA4djExYTIgMiAwIDAgMS0yIDJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxNSAzLTMgMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEydjkiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcmNoaXZlLXguanMKdmFyIEFyY2hpdmVYOwp2YXIgaW5pdF9hcmNoaXZlX3ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FyY2hpdmUteC5qcyIoKSB7CiAgICBBcmNoaXZlWCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiNSIsIHg6ICIyIiwgeTogIjMiLCByeDogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA4djExYTIgMiAwIDAgMCAyIDJoMTJhMiAyIDAgMCAwIDItMlY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkuNSAxNyA1LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOS41IDEyIDUgNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FyY2hpdmUuanMKdmFyIEFyY2hpdmU7CnZhciBpbml0X2FyY2hpdmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FyY2hpdmUuanMiKCkgewogICAgQXJjaGl2ZSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiNSIsIHg6ICIyIiwgeTogIjMiLCByeDogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA4djExYTIgMiAwIDAgMCAyIDJoMTJhMiAyIDAgMCAwIDItMlY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEyaDQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcm1jaGFpci5qcwp2YXIgQXJtY2hhaXI7CnZhciBpbml0X2FybWNoYWlyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcm1jaGFpci5qcyIoKSB7CiAgICBBcm1jaGFpciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDlWNmEyIDIgMCAwIDAtMi0ySDdhMiAyIDAgMCAwLTIgMnYzIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMgMTZhMiAyIDAgMCAwIDIgMmgxNGEyIDIgMCAwIDAgMi0ydi01YTIgMiAwIDAgMC00IDB2MS41YS41LjUgMCAwIDEtLjUuNWgtOWEuNS41IDAgMCAxLS41LS41VjExYTIgMiAwIDAgMC00IDB6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTh2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxOHYyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctYmlnLWRvd24tZGFzaC5qcwp2YXIgQXJyb3dCaWdEb3duRGFzaDsKdmFyIGluaXRfYXJyb3dfYmlnX2Rvd25fZGFzaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctYmlnLWRvd24tZGFzaC5qcyIoKSB7CiAgICBBcnJvd0JpZ0Rvd25EYXNoID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTUgMTFhMSAxIDAgMCAwIDEgMWgyLjkzOWExIDEgMCAwIDEgLjc1IDEuODExbC02LjgzNSA2LjgzNmExLjIwNyAxLjIwNyAwIDAgMS0xLjcwNyAwTDQuMzEgMTMuODFhMSAxIDAgMCAxIC43NS0xLjgxMUg4YTEgMSAwIDAgMCAxLTFWOWExIDEgMCAwIDEgMS0xaDRhMSAxIDAgMCAxIDEgMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA0aDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1iaWctZG93bi5qcwp2YXIgQXJyb3dCaWdEb3duOwp2YXIgaW5pdF9hcnJvd19iaWdfZG93biA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctYmlnLWRvd24uanMiKCkgewogICAgQXJyb3dCaWdEb3duID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTUgMTFhMSAxIDAgMCAwIDEgMWgyLjkzOWExIDEgMCAwIDEgLjc1IDEuODExbC02LjgzNSA2LjgzNmExLjIwNyAxLjIwNyAwIDAgMS0xLjcwNyAwTDQuMzEgMTMuODFhMSAxIDAgMCAxIC43NS0xLjgxMUg4YTEgMSAwIDAgMCAxLTFWNWExIDEgMCAwIDEgMS0xaDRhMSAxIDAgMCAxIDEgMXoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1iaWctbGVmdC1kYXNoLmpzCnZhciBBcnJvd0JpZ0xlZnREYXNoOwp2YXIgaW5pdF9hcnJvd19iaWdfbGVmdF9kYXNoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1iaWctbGVmdC1kYXNoLmpzIigpIHsKICAgIEFycm93QmlnTGVmdERhc2ggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMyA5YTEgMSAwIDAgMS0xLTFWNS4wNjFhMSAxIDAgMCAwLTEuODExLS43NWwtNi44MzUgNi44MzZhMS4yMDcgMS4yMDcgMCAwIDAgMCAxLjcwN2w2LjgzNSA2LjgzNWExIDEgMCAwIDAgMS44MTEtLjc1VjE2YTEgMSAwIDAgMSAxLTFoMmExIDEgMCAwIDAgMS0xdi00YTEgMSAwIDAgMC0xLTF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDl2NiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LWJpZy1sZWZ0LmpzCnZhciBBcnJvd0JpZ0xlZnQ7CnZhciBpbml0X2Fycm93X2JpZ19sZWZ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1iaWctbGVmdC5qcyIoKSB7CiAgICBBcnJvd0JpZ0xlZnQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMyA5YTEgMSAwIDAgMS0xLTFWNS4wNjFhMSAxIDAgMCAwLTEuODExLS43NWwtNi44MzUgNi44MzZhMS4yMDcgMS4yMDcgMCAwIDAgMCAxLjcwN2w2LjgzNSA2LjgzNWExIDEgMCAwIDAgMS44MTEtLjc1VjE2YTEgMSAwIDAgMSAxLTFoNmExIDEgMCAwIDAgMS0xdi00YTEgMSAwIDAgMC0xLTF6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctYmlnLXJpZ2h0LWRhc2guanMKdmFyIEFycm93QmlnUmlnaHREYXNoOwp2YXIgaW5pdF9hcnJvd19iaWdfcmlnaHRfZGFzaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctYmlnLXJpZ2h0LWRhc2guanMiKCkgewogICAgQXJyb3dCaWdSaWdodERhc2ggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMSA5YTEgMSAwIDAgMCAxLTFWNS4wNjFhMSAxIDAgMCAxIDEuODExLS43NWw2LjgzNiA2LjgzNmExLjIwNyAxLjIwNyAwIDAgMSAwIDEuNzA3bC02LjgzNiA2LjgzNWExIDEgMCAwIDEtMS44MTEtLjc1VjE2YTEgMSAwIDAgMC0xLTFIOWExIDEgMCAwIDEtMS0xdi00YTEgMSAwIDAgMSAxLTF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgOXY2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctYmlnLXJpZ2h0LmpzCnZhciBBcnJvd0JpZ1JpZ2h0Owp2YXIgaW5pdF9hcnJvd19iaWdfcmlnaHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LWJpZy1yaWdodC5qcyIoKSB7CiAgICBBcnJvd0JpZ1JpZ2h0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEgOWExIDEgMCAwIDAgMS0xVjUuMDYxYTEgMSAwIDAgMSAxLjgxMS0uNzVsNi44MzYgNi44MzZhMS4yMDcgMS4yMDcgMCAwIDEgMCAxLjcwN2wtNi44MzYgNi44MzVhMSAxIDAgMCAxLTEuODExLS43NVYxNmExIDEgMCAwIDAtMS0xSDVhMSAxIDAgMCAxLTEtMXYtNGExIDEgMCAwIDEgMS0xeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LWJpZy11cC1kYXNoLmpzCnZhciBBcnJvd0JpZ1VwRGFzaDsKdmFyIGluaXRfYXJyb3dfYmlnX3VwX2Rhc2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LWJpZy11cC1kYXNoLmpzIigpIHsKICAgIEFycm93QmlnVXBEYXNoID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOSAxM2ExIDEgMCAwIDAtMS0xSDUuMDYxYTEgMSAwIDAgMS0uNzUtMS44MTFsNi44MzYtNi44MzVhMS4yMDcgMS4yMDcgMCAwIDEgMS43MDcgMGw2LjgzNSA2LjgzNWExIDEgMCAwIDEtLjc1IDEuODExSDE2YTEgMSAwIDAgMC0xIDF2MmExIDEgMCAwIDEtMSAxaC00YTEgMSAwIDAgMS0xLTF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMjBoNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LWRvd24tMC0xLmpzCnZhciBBcnJvd0Rvd24wMTsKdmFyIGluaXRfYXJyb3dfZG93bl8wXzEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LWRvd24tMC0xLmpzIigpIHsKICAgIEFycm93RG93bjAxID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMyAxNiA0IDQgNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjBWNCIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjE1IiwgeTogIjQiLCB3aWR0aDogIjQiLCBoZWlnaHQ6ICI2Iiwgcnk6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDIwdi02aC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDIwaDQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1iaWctdXAuanMKdmFyIEFycm93QmlnVXA7CnZhciBpbml0X2Fycm93X2JpZ191cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctYmlnLXVwLmpzIigpIHsKICAgIEFycm93QmlnVXAgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk05IDEzYTEgMSAwIDAgMC0xLTFINS4wNjFhMSAxIDAgMCAxLS43NS0xLjgxMWw2LjgzNi02LjgzNWExLjIwNyAxLjIwNyAwIDAgMSAxLjcwNyAwbDYuODM1IDYuODM1YTEgMSAwIDAgMS0uNzUgMS44MTFIMTZhMSAxIDAgMCAwLTEgMXY2YTEgMSAwIDAgMS0xIDFoLTRhMSAxIDAgMCAxLTEtMXoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1kb3duLTEtMC5qcwp2YXIgQXJyb3dEb3duMTA7CnZhciBpbml0X2Fycm93X2Rvd25fMV8wID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1kb3duLTEtMC5qcyIoKSB7CiAgICBBcnJvd0Rvd24xMCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgMTYgNCA0IDQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIwVjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTBWNGgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxMGg0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMTUiLCB5OiAiMTQiLCB3aWR0aDogIjQiLCBoZWlnaHQ6ICI2Iiwgcnk6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctZG93bi1hLXouanMKdmFyIEFycm93RG93bkFaOwp2YXIgaW5pdF9hcnJvd19kb3duX2FfeiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctZG93bi1hLXouanMiKCkgewogICAgQXJyb3dEb3duQVogPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDE2IDQgNCA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMFY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDhoLTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTBWNi41YTIuNSAyLjUgMCAwIDEgNSAwVjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDE0aDVsLTUgNmg1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctZG93bi1mcm9tLWxpbmUuanMKdmFyIEFycm93RG93bkZyb21MaW5lOwp2YXIgaW5pdF9hcnJvd19kb3duX2Zyb21fbGluZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctZG93bi1mcm9tLWxpbmUuanMiKCkgewogICAgQXJyb3dEb3duRnJvbUxpbmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAzSDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjFWNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02IDE1IDYgNiA2LTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1kb3duLWxlZnQuanMKdmFyIEFycm93RG93bkxlZnQ7CnZhciBpbml0X2Fycm93X2Rvd25fbGVmdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctZG93bi1sZWZ0LmpzIigpIHsKICAgIEFycm93RG93bkxlZnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyA3IDcgMTciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTdIN1Y3IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctZG93bi1uYXJyb3ctd2lkZS5qcwp2YXIgQXJyb3dEb3duTmFycm93V2lkZTsKdmFyIGluaXRfYXJyb3dfZG93bl9uYXJyb3dfd2lkZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctZG93bi1uYXJyb3ctd2lkZS5qcyIoKSB7CiAgICBBcnJvd0Rvd25OYXJyb3dXaWRlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMyAxNiA0IDQgNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjBWNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSA0aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgOGg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDEyaDEwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctZG93bi1yaWdodC5qcwp2YXIgQXJyb3dEb3duUmlnaHQ7CnZhciBpbml0X2Fycm93X2Rvd25fcmlnaHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LWRvd24tcmlnaHQuanMiKCkgewogICAgQXJyb3dEb3duUmlnaHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm03IDcgMTAgMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgN3YxMEg3IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctZG93bi10by1kb3QuanMKdmFyIEFycm93RG93blRvRG90Owp2YXIgaW5pdF9hcnJvd19kb3duX3RvX2RvdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctZG93bi10by1kb3QuanMiKCkgewogICAgQXJyb3dEb3duVG9Eb3QgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5IDktNyA3LTctNyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIyMSIsIHI6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctZG93bi10by1saW5lLmpzCnZhciBBcnJvd0Rvd25Ub0xpbmU7CnZhciBpbml0X2Fycm93X2Rvd25fdG9fbGluZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctZG93bi10by1saW5lLmpzIigpIHsKICAgIEFycm93RG93blRvTGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3VjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNiAxMSA2IDYgNi02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDIxSDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1kb3duLXVwLmpzCnZhciBBcnJvd0Rvd25VcDsKdmFyIGluaXRfYXJyb3dfZG93bl91cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctZG93bi11cC5qcyIoKSB7CiAgICBBcnJvd0Rvd25VcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgMTYgNCA0IDQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIwVjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgOC00LTQtNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDR2MTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1kb3duLXdpZGUtbmFycm93LmpzCnZhciBBcnJvd0Rvd25XaWRlTmFycm93Owp2YXIgaW5pdF9hcnJvd19kb3duX3dpZGVfbmFycm93ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1kb3duLXdpZGUtbmFycm93LmpzIigpIHsKICAgIEFycm93RG93bldpZGVOYXJyb3cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDE2IDQgNCA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMFY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDRoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgOGg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDEyaDQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1kb3duLXotYS5qcwp2YXIgQXJyb3dEb3duWkE7CnZhciBpbml0X2Fycm93X2Rvd25fel9hID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1kb3duLXotYS5qcyIoKSB7CiAgICBBcnJvd0Rvd25aQSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgMTYgNCA0IDQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDR2MTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgNGg1bC01IDZoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAyMHYtMy41YTIuNSAyLjUgMCAwIDEgNSAwVjIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE4aC01IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctZG93bi5qcwp2YXIgQXJyb3dEb3duOwp2YXIgaW5pdF9hcnJvd19kb3duID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1kb3duLmpzIigpIHsKICAgIEFycm93RG93biA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDV2MTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkgMTItNyA3LTctNyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LWxlZnQtZnJvbS1saW5lLmpzCnZhciBBcnJvd0xlZnRGcm9tTGluZTsKdmFyIGluaXRfYXJyb3dfbGVmdF9mcm9tX2xpbmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LWxlZnQtZnJvbS1saW5lLmpzIigpIHsKICAgIEFycm93TGVmdEZyb21MaW5lID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtOSA2LTYgNiA2IDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmgxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxOVY1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctbGVmdC1yaWdodC5qcwp2YXIgQXJyb3dMZWZ0UmlnaHQ7CnZhciBpbml0X2Fycm93X2xlZnRfcmlnaHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LWxlZnQtcmlnaHQuanMiKCkgewogICAgQXJyb3dMZWZ0UmlnaHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDMgNCA3bDQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDdoMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMjEgNC00LTQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxN0g0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctbGVmdC10by1saW5lLmpzCnZhciBBcnJvd0xlZnRUb0xpbmU7CnZhciBpbml0X2Fycm93X2xlZnRfdG9fbGluZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctbGVmdC10by1saW5lLmpzIigpIHsKICAgIEFycm93TGVmdFRvTGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTlWNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMyA2LTYgNiA2IDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMmgxNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LWxlZnQuanMKdmFyIEFycm93TGVmdDsKdmFyIGluaXRfYXJyb3dfbGVmdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctbGVmdC5qcyIoKSB7CiAgICBBcnJvd0xlZnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMiAxOS03LTcgNy03IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDEySDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1yaWdodC1mcm9tLWxpbmUuanMKdmFyIEFycm93UmlnaHRGcm9tTGluZTsKdmFyIGluaXRfYXJyb3dfcmlnaHRfZnJvbV9saW5lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1yaWdodC1mcm9tLWxpbmUuanMiKCkgewogICAgQXJyb3dSaWdodEZyb21MaW5lID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA1djE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEySDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgMTggNi02LTYtNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LXJpZ2h0LWxlZnQuanMKdmFyIEFycm93UmlnaHRMZWZ0Owp2YXIgaW5pdF9hcnJvd19yaWdodF9sZWZ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1yaWdodC1sZWZ0LmpzIigpIHsKICAgIEFycm93UmlnaHRMZWZ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMyA0IDQtNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDdINCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDIxLTQtNCA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxN2gxNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LXJpZ2h0LXRvLWxpbmUuanMKdmFyIEFycm93UmlnaHRUb0xpbmU7CnZhciBpbml0X2Fycm93X3JpZ2h0X3RvX2xpbmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LXJpZ2h0LXRvLWxpbmUuanMiKCkgewogICAgQXJyb3dSaWdodFRvTGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDEySDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTEgMTggNi02LTYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA1djE0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctcmlnaHQuanMKdmFyIEFycm93UmlnaHQ7CnZhciBpbml0X2Fycm93X3JpZ2h0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1yaWdodC5qcyIoKSB7CiAgICBBcnJvd1JpZ2h0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxMmgxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMiA1IDcgNy03IDciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC0wLTEuanMKdmFyIEFycm93VXAwMTsKdmFyIGluaXRfYXJyb3dfdXBfMF8xID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC0wLTEuanMiKCkgewogICAgQXJyb3dVcDAxID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMyA4IDQtNCA0IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyA0djE2IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMTUiLCB5OiAiNCIsIHdpZHRoOiAiNCIsIGhlaWdodDogIjYiLCByeTogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMjB2LTZoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMjBoNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LXVwLTEtMC5qcwp2YXIgQXJyb3dVcDEwOwp2YXIgaW5pdF9hcnJvd191cF8xXzAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LXVwLTEtMC5qcyIoKSB7CiAgICBBcnJvd1VwMTAgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDggNC00IDQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDR2MTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTBWNGgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxMGg0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMTUiLCB5OiAiMTQiLCB3aWR0aDogIjQiLCBoZWlnaHQ6ICI2Iiwgcnk6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctdXAtYS16LmpzCnZhciBBcnJvd1VwQVo7CnZhciBpbml0X2Fycm93X3VwX2FfeiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctdXAtYS16LmpzIigpIHsKICAgIEFycm93VXBBWiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgOCA0LTQgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCA4aC01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEwVjYuNWEyLjUgMi41IDAgMCAxIDUgMFYxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxNGg1bC01IDZoNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LXVwLWRvd24uanMKdmFyIEFycm93VXBEb3duOwp2YXIgaW5pdF9hcnJvd191cF9kb3duID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC1kb3duLmpzIigpIHsKICAgIEFycm93VXBEb3duID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMTYtNCA0LTQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAyMFY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgOCA0LTQgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNHYxNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LXVwLWZyb20tZG90LmpzCnZhciBBcnJvd1VwRnJvbURvdDsKdmFyIGluaXRfYXJyb3dfdXBfZnJvbV9kb3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LXVwLWZyb20tZG90LmpzIigpIHsKICAgIEFycm93VXBGcm9tRG90ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtNSA5IDctNyA3IDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTZWMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIyMSIsIHI6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctdXAtZnJvbS1saW5lLmpzCnZhciBBcnJvd1VwRnJvbUxpbmU7CnZhciBpbml0X2Fycm93X3VwX2Zyb21fbGluZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctdXAtZnJvbS1saW5lLmpzIigpIHsKICAgIEFycm93VXBGcm9tTGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE4IDktNi02LTYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAzdjE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMjFoMTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC1sZWZ0LmpzCnZhciBBcnJvd1VwTGVmdDsKdmFyIGluaXRfYXJyb3dfdXBfbGVmdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctdXAtbGVmdC5qcyIoKSB7CiAgICBBcnJvd1VwTGVmdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTdWN2gxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxNyA3IDciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC1uYXJyb3ctd2lkZS5qcwp2YXIgQXJyb3dVcE5hcnJvd1dpZGU7CnZhciBpbml0X2Fycm93X3VwX25hcnJvd193aWRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC1uYXJyb3ctd2lkZS5qcyIoKSB7CiAgICBBcnJvd1VwTmFycm93V2lkZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgOCA0LTQgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxMmg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDE2aDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMjBoMTAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC1yaWdodC5qcwp2YXIgQXJyb3dVcFJpZ2h0Owp2YXIgaW5pdF9hcnJvd191cF9yaWdodCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctdXAtcmlnaHQuanMiKCkgewogICAgQXJyb3dVcFJpZ2h0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNyA3aDEwdjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTcgMTcgNyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LXVwLXRvLWxpbmUuanMKdmFyIEFycm93VXBUb0xpbmU7CnZhciBpbml0X2Fycm93X3VwX3RvX2xpbmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LXVwLXRvLWxpbmUuanMiKCkgewogICAgQXJyb3dVcFRvTGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgM2gxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOCAxMy02LTYtNiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2MTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC13aWRlLW5hcnJvdy5qcwp2YXIgQXJyb3dVcFdpZGVOYXJyb3c7CnZhciBpbml0X2Fycm93X3VwX3dpZGVfbmFycm93ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC13aWRlLW5hcnJvdy5qcyIoKSB7CiAgICBBcnJvd1VwV2lkZU5hcnJvdyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgOCA0LTQgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxMmgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxNmg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDIwaDQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC16LWEuanMKdmFyIEFycm93VXBaQTsKdmFyIGluaXRfYXJyb3dfdXBfel9hID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC16LWEuanMiKCkgewogICAgQXJyb3dVcFpBID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMyA4IDQtNCA0IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyA0djE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDRoNWwtNSA2aDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMjB2LTMuNWEyLjUgMi41IDAgMCAxIDUgMFYyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxOGgtNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LXVwLmpzCnZhciBBcnJvd1VwOwp2YXIgaW5pdF9hcnJvd191cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctdXAuanMiKCkgewogICAgQXJyb3dVcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTUgMTIgNy03IDcgNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOVY1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3dzLXVwLWZyb20tbGluZS5qcwp2YXIgQXJyb3dzVXBGcm9tTGluZTsKdmFyIGluaXRfYXJyb3dzX3VwX2Zyb21fbGluZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3dzLXVwLWZyb20tbGluZS5qcyIoKSB7CiAgICBBcnJvd3NVcEZyb21MaW5lID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtNCA2IDMtMyAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxN1YzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDYgMy0zIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxN1YzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMjFoMTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hdC1zaWduLmpzCnZhciBBdFNpZ247CnZhciBpbml0X2F0X3NpZ24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2F0LXNpZ24uanMiKCkgewogICAgQXRTaWduID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA4djVhMyAzIDAgMCAwIDYgMHYtMWExMCAxMCAwIDEgMC00IDgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hc3Rlcmlzay5qcwp2YXIgQXN0ZXJpc2s7CnZhciBpbml0X2FzdGVyaXNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hc3Rlcmlzay5qcyIoKSB7CiAgICBBc3RlcmlzayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZ2MTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuMTk2IDkgNi44MDQgMTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNi44MDQgOSAxMC4zOTIgNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2F0b20uanMKdmFyIEF0b207CnZhciBpbml0X2F0b20gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2F0b20uanMiKCkgewogICAgQXRvbSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAuMiAyMC4yYzIuMDQtMi4wMy4wMi03LjM2LTQuNS0xMS45LTQuNTQtNC41Mi05Ljg3LTYuNTQtMTEuOS00LjUtMi4wNCAyLjAzLS4wMiA3LjM2IDQuNSAxMS45IDQuNTQgNC41MiA5Ljg3IDYuNTQgMTEuOSA0LjVaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE1LjcgMTUuN2M0LjUyLTQuNTQgNi41NC05Ljg3IDQuNS0xMS45LTIuMDMtMi4wNC03LjM2LS4wMi0xMS45IDQuNS00LjUyIDQuNTQtNi41NCA5Ljg3LTQuNSAxMS45IDIuMDMgMi4wNCA3LjM2LjAyIDExLjktNC41WiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2F1ZGlvLWxpbmVzLmpzCnZhciBBdWRpb0xpbmVzOwp2YXIgaW5pdF9hdWRpb19saW5lcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXVkaW8tbGluZXMuanMiKCkgewogICAgQXVkaW9MaW5lcyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTB2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDZ2MTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgM3YxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA4djciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggNXYxMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxMHYzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYXVkaW8td2F2ZWZvcm0uanMKdmFyIEF1ZGlvV2F2ZWZvcm07CnZhciBpbml0X2F1ZGlvX3dhdmVmb3JtID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hdWRpby13YXZlZm9ybS5qcyIoKSB7CiAgICBBdWRpb1dhdmVmb3JtID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMiAxM2EyIDIgMCAwIDAgMi0yVjdhMiAyIDAgMCAxIDQgMHYxM2EyIDIgMCAwIDAgNCAwVjRhMiAyIDAgMCAxIDQgMHYxM2EyIDIgMCAwIDAgNCAwdi00YTIgMiAwIDAgMSAyLTIiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hd2FyZC5qcwp2YXIgQXdhcmQ7CnZhciBpbml0X2F3YXJkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9hd2FyZC5qcyIoKSB7CiAgICBBd2FyZCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTE1LjQ3NyAxMi44OSAxLjUxNSA4LjUyNmEuNS41IDAgMCAxLS44MS40N2wtMy41OC0yLjY4N2ExIDEgMCAwIDAtMS4xOTcgMGwtMy41ODYgMi42ODZhLjUuNSAwIDAgMS0uODEtLjQ2OWwxLjUxNC04LjUyNiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICI4IiwgcjogIjYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9heGUuanMKdmFyIEF4ZTsKdmFyIGluaXRfYXhlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9heGUuanMiKCkgewogICAgQXhlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgMTItOC4zODEgOC4zOGExIDEgMCAwIDEtMy4wMDEtM0wxMSA5IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE1IDE1LjVhLjUuNSAwIDAgMCAuNS41QTYuNSA2LjUgMCAwIDAgMjIgOS41YS41LjUgMCAwIDAtLjUtLjVoLTEuNjcyYTIgMiAwIDAgMS0xLjQxNC0uNTg2bC01LjA2Mi01LjA2MmExLjIwNSAxLjIwNSAwIDAgMC0xLjcwNCAwTDkuMzUyIDUuNjQ4YTEuMjA1IDEuMjA1IDAgMCAwIDAgMS43MDRsNS4wNjIgNS4wNjJBMiAyIDAgMCAxIDE1IDEzLjgyOHoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9heGlzLTNkLmpzCnZhciBBeGlzM2Q7CnZhciBpbml0X2F4aXNfM2QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2F4aXMtM2QuanMiKCkgewogICAgQXhpczNkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMuNSAxMC41IDE1IDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA0djE1YTEgMSAwIDAgMCAxIDFoMTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC4yOTMgMTkuNzA3IDYgMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxNSAxLjUtMS41IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFieS5qcwp2YXIgQmFieTsKdmFyIGluaXRfYmFieSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFieS5qcyIoKSB7CiAgICBCYWJ5ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTZjLjUuMyAxLjIuNSAyIC41czEuNS0uMiAyLS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEyaC4wMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOS4zOCA2LjgxM0E5IDkgMCAwIDEgMjAuOCAxMC4yYTIgMiAwIDAgMSAwIDMuNiA5IDkgMCAwIDEtMTcuNiAwIDIgMiAwIDAgMSAwLTMuNkE5IDkgMCAwIDEgMTIgM2MyIDAgMy41IDEuMSAzLjUgMi41cy0uOSAyLjUtMiAyLjVjLS44IDAtMS41LS40LTEuNS0xIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTJoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFja3BhY2suanMKdmFyIEJhY2twYWNrOwp2YXIgaW5pdF9iYWNrcGFjayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFja3BhY2suanMiKCkgewogICAgQmFja3BhY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEwYTQgNCAwIDAgMSA0LTRoOGE0IDQgMCAwIDEgNCA0djEwYTIgMiAwIDAgMS0yIDJINmEyIDIgMCAwIDEtMi0yeiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEwaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxOGg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjJ2LTZhMiAyIDAgMCAxIDItMmg0YTIgMiAwIDAgMSAyIDJ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDZWNGEyIDIgMCAwIDEgMi0yaDJhMiAyIDAgMCAxIDIgMnYyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFkZ2UtYWxlcnQuanMKdmFyIEJhZGdlQWxlcnQ7CnZhciBpbml0X2JhZGdlX2FsZXJ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS1hbGVydC5qcyIoKSB7CiAgICBCYWRnZUFsZXJ0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy44NSA4LjYyYTQgNCAwIDAgMSA0Ljc4LTQuNzcgNCA0IDAgMCAxIDYuNzQgMCA0IDQgMCAwIDEgNC43OCA0Ljc4IDQgNCAwIDAgMSAwIDYuNzQgNCA0IDAgMCAxLTQuNzcgNC43OCA0IDQgMCAwIDEtNi43NSAwIDQgNCAwIDAgMS00Ljc4LTQuNzcgNCA0IDAgMCAxIDAtNi43NloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICI4IiwgeTI6ICIxMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTIuMDEiLCB5MTogIjE2IiwgeTI6ICIxNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZGdlLWNlbnQuanMKdmFyIEJhZGdlQ2VudDsKdmFyIGluaXRfYmFkZ2VfY2VudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFkZ2UtY2VudC5qcyIoKSB7CiAgICBCYWRnZUNlbnQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0zLjg1IDguNjJhNCA0IDAgMCAxIDQuNzgtNC43NyA0IDQgMCAwIDEgNi43NCAwIDQgNCAwIDAgMSA0Ljc4IDQuNzggNCA0IDAgMCAxIDAgNi43NCA0IDQgMCAwIDEtNC43NyA0Ljc4IDQgNCAwIDAgMS02Ljc1IDAgNCA0IDAgMCAxLTQuNzgtNC43NyA0IDQgMCAwIDEgMC02Ljc2WiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA3djEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1LjQgMTBhNCA0IDAgMSAwIDAgNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZGdlLWNoZWNrLmpzCnZhciBCYWRnZUNoZWNrOwp2YXIgaW5pdF9iYWRnZV9jaGVjayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFkZ2UtY2hlY2suanMiKCkgewogICAgQmFkZ2VDaGVjayA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMuODUgOC42MmE0IDQgMCAwIDEgNC43OC00Ljc3IDQgNCAwIDAgMSA2Ljc0IDAgNCA0IDAgMCAxIDQuNzggNC43OCA0IDQgMCAwIDEgMCA2Ljc0IDQgNCAwIDAgMS00Ljc3IDQuNzggNCA0IDAgMCAxLTYuNzUgMCA0IDQgMCAwIDEtNC43OC00Ljc3IDQgNCAwIDAgMSAwLTYuNzZaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTIgMiAyIDQtNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZGdlLWV1cm8uanMKdmFyIEJhZGdlRXVybzsKdmFyIGluaXRfYmFkZ2VfZXVybyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFkZ2UtZXVyby5qcyIoKSB7CiAgICBCYWRnZUV1cm8gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0zLjg1IDguNjJhNCA0IDAgMCAxIDQuNzgtNC43NyA0IDQgMCAwIDEgNi43NCAwIDQgNCAwIDAgMSA0Ljc4IDQuNzggNCA0IDAgMCAxIDAgNi43NCA0IDQgMCAwIDEtNC43NyA0Ljc4IDQgNCAwIDAgMS02Ljc1IDAgNCA0IDAgMCAxLTQuNzgtNC43NyA0IDQgMCAwIDEgMC02Ljc2WiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEyaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgOS40YTQgNCAwIDEgMCAwIDUuMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZGdlLWRvbGxhci1zaWduLmpzCnZhciBCYWRnZURvbGxhclNpZ247CnZhciBpbml0X2JhZGdlX2RvbGxhcl9zaWduID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS1kb2xsYXItc2lnbi5qcyIoKSB7CiAgICBCYWRnZURvbGxhclNpZ24gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0zLjg1IDguNjJhNCA0IDAgMCAxIDQuNzgtNC43NyA0IDQgMCAwIDEgNi43NCAwIDQgNCAwIDAgMSA0Ljc4IDQuNzggNCA0IDAgMCAxIDAgNi43NCA0IDQgMCAwIDEtNC43NyA0Ljc4IDQgNCAwIDAgMS02Ljc1IDAgNCA0IDAgMCAxLTQuNzgtNC43NyA0IDQgMCAwIDEgMC02Ljc2WiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA4aC02YTIgMiAwIDEgMCAwIDRoNGEyIDIgMCAxIDEgMCA0SDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMThWNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZGdlLWluZGlhbi1ydXBlZS5qcwp2YXIgQmFkZ2VJbmRpYW5SdXBlZTsKdmFyIGluaXRfYmFkZ2VfaW5kaWFuX3J1cGVlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS1pbmRpYW4tcnVwZWUuanMiKCkgewogICAgQmFkZ2VJbmRpYW5SdXBlZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMuODUgOC42MmE0IDQgMCAwIDEgNC43OC00Ljc3IDQgNCAwIDAgMSA2Ljc0IDAgNCA0IDAgMCAxIDQuNzggNC43OCA0IDQgMCAwIDEgMCA2Ljc0IDQgNCAwIDAgMS00Ljc3IDQuNzggNCA0IDAgMCAxLTYuNzUgMCA0IDQgMCAwIDEtNC43OC00Ljc3IDQgNCAwIDAgMSAwLTYuNzZaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggOGg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMyAxNy01LTFoMWE0IDQgMCAwIDAgMC04IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFkZ2UtaW5mby5qcwp2YXIgQmFkZ2VJbmZvOwp2YXIgaW5pdF9iYWRnZV9pbmZvID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS1pbmZvLmpzIigpIHsKICAgIEJhZGdlSW5mbyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMuODUgOC42MmE0IDQgMCAwIDEgNC43OC00Ljc3IDQgNCAwIDAgMSA2Ljc0IDAgNCA0IDAgMCAxIDQuNzggNC43OCA0IDQgMCAwIDEgMCA2Ljc0IDQgNCAwIDAgMS00Ljc3IDQuNzggNCA0IDAgMCAxLTYuNzUgMCA0IDQgMCAwIDEtNC43OC00Ljc3IDQgNCAwIDAgMSAwLTYuNzZaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEyIiwgeDI6ICIxMiIsIHkxOiAiMTYiLCB5MjogIjEyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEyIiwgeDI6ICIxMi4wMSIsIHkxOiAiOCIsIHkyOiAiOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZGdlLWphcGFuZXNlLXllbi5qcwp2YXIgQmFkZ2VKYXBhbmVzZVllbjsKdmFyIGluaXRfYmFkZ2VfamFwYW5lc2VfeWVuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS1qYXBhbmVzZS15ZW4uanMiKCkgewogICAgQmFkZ2VKYXBhbmVzZVllbiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMuODUgOC42MmE0IDQgMCAwIDEgNC43OC00Ljc3IDQgNCAwIDAgMSA2Ljc0IDAgNCA0IDAgMCAxIDQuNzggNC43OCA0IDQgMCAwIDEgMCA2Ljc0IDQgNCAwIDAgMS00Ljc3IDQuNzggNCA0IDAgMCAxLTYuNzUgMCA0IDQgMCAwIDEtNC43OC00Ljc3IDQgNCAwIDAgMSAwLTYuNzZaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgOCAzIDN2NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMiAxMSAzLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMmg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTZoNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZGdlLW1pbnVzLmpzCnZhciBCYWRnZU1pbnVzOwp2YXIgaW5pdF9iYWRnZV9taW51cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFkZ2UtbWludXMuanMiKCkgewogICAgQmFkZ2VNaW51cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMuODUgOC42MmE0IDQgMCAwIDEgNC43OC00Ljc3IDQgNCAwIDAgMSA2Ljc0IDAgNCA0IDAgMCAxIDQuNzggNC43OCA0IDQgMCAwIDEgMCA2Ljc0IDQgNCAwIDAgMS00Ljc3IDQuNzggNCA0IDAgMCAxLTYuNzUgMCA0IDQgMCAwIDEtNC43OC00Ljc3IDQgNCAwIDAgMSAwLTYuNzZaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjgiLCB4MjogIjE2IiwgeTE6ICIxMiIsIHkyOiAiMTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS1wZXJjZW50LmpzCnZhciBCYWRnZVBlcmNlbnQ7CnZhciBpbml0X2JhZGdlX3BlcmNlbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZGdlLXBlcmNlbnQuanMiKCkgewogICAgQmFkZ2VQZXJjZW50ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy44NSA4LjYyYTQgNCAwIDAgMSA0Ljc4LTQuNzcgNCA0IDAgMCAxIDYuNzQgMCA0IDQgMCAwIDEgNC43OCA0Ljc4IDQgNCAwIDAgMSAwIDYuNzQgNCA0IDAgMCAxLTQuNzcgNC43OCA0IDQgMCAwIDEtNi43NSAwIDQgNCAwIDAgMS00Ljc4LTQuNzcgNCA0IDAgMCAxIDAtNi43NloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgOS02IDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA5aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxNWguMDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS1wb3VuZC1zdGVybGluZy5qcwp2YXIgQmFkZ2VQb3VuZFN0ZXJsaW5nOwp2YXIgaW5pdF9iYWRnZV9wb3VuZF9zdGVybGluZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFkZ2UtcG91bmQtc3RlcmxpbmcuanMiKCkgewogICAgQmFkZ2VQb3VuZFN0ZXJsaW5nID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy44NSA4LjYyYTQgNCAwIDAgMSA0Ljc4LTQuNzcgNCA0IDAgMCAxIDYuNzQgMCA0IDQgMCAwIDEgNC43OCA0Ljc4IDQgNCAwIDAgMSAwIDYuNzQgNCA0IDAgMCAxLTQuNzcgNC43OCA0IDQgMCAwIDEtNi43NSAwIDQgNCAwIDAgMS00Ljc4LTQuNzcgNCA0IDAgMCAxIDAtNi43NloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE2VjkuNWEyLjUgMi41IDAgMCAxIDUgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE2aDciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS1wbHVzLmpzCnZhciBCYWRnZVBsdXM7CnZhciBpbml0X2JhZGdlX3BsdXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZGdlLXBsdXMuanMiKCkgewogICAgQmFkZ2VQbHVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy44NSA4LjYyYTQgNCAwIDAgMSA0Ljc4LTQuNzcgNCA0IDAgMCAxIDYuNzQgMCA0IDQgMCAwIDEgNC43OCA0Ljc4IDQgNCAwIDAgMSAwIDYuNzQgNCA0IDAgMCAxLTQuNzcgNC43OCA0IDQgMCAwIDEtNi43NSAwIDQgNCAwIDAgMS00Ljc4LTQuNzcgNCA0IDAgMCAxIDAtNi43NloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICI4IiwgeTI6ICIxNiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI4IiwgeDI6ICIxNiIsIHkxOiAiMTIiLCB5MjogIjEyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFkZ2UtcXVlc3Rpb24tbWFyay5qcwp2YXIgQmFkZ2VRdWVzdGlvbk1hcms7CnZhciBpbml0X2JhZGdlX3F1ZXN0aW9uX21hcmsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZGdlLXF1ZXN0aW9uLW1hcmsuanMiKCkgewogICAgQmFkZ2VRdWVzdGlvbk1hcmsgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0zLjg1IDguNjJhNCA0IDAgMCAxIDQuNzgtNC43NyA0IDQgMCAwIDEgNi43NCAwIDQgNCAwIDAgMSA0Ljc4IDQuNzggNCA0IDAgMCAxIDAgNi43NCA0IDQgMCAwIDEtNC43NyA0Ljc4IDQgNCAwIDAgMS02Ljc1IDAgNCA0IDAgMCAxLTQuNzgtNC43NyA0IDQgMCAwIDEgMC02Ljc2WiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjA5IDlhMyAzIDAgMCAxIDUuODMgMWMwIDItMyAzLTMgMyIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTIuMDEiLCB5MTogIjE3IiwgeTI6ICIxNyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZGdlLXJ1c3NpYW4tcnVibGUuanMKdmFyIEJhZGdlUnVzc2lhblJ1YmxlOwp2YXIgaW5pdF9iYWRnZV9ydXNzaWFuX3J1YmxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS1ydXNzaWFuLXJ1YmxlLmpzIigpIHsKICAgIEJhZGdlUnVzc2lhblJ1YmxlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy44NSA4LjYyYTQgNCAwIDAgMSA0Ljc4LTQuNzcgNCA0IDAgMCAxIDYuNzQgMCA0IDQgMCAwIDEgNC43OCA0Ljc4IDQgNCAwIDAgMSAwIDYuNzQgNCA0IDAgMCAxLTQuNzcgNC43OCA0IDQgMCAwIDEtNi43NSAwIDQgNCAwIDAgMS00Ljc4LTQuNzcgNCA0IDAgMCAxIDAtNi43NloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNmg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTJoNWEyIDIgMCAxIDAgMC00aC0zdjkiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS1zd2lzcy1mcmFuYy5qcwp2YXIgQmFkZ2VTd2lzc0ZyYW5jOwp2YXIgaW5pdF9iYWRnZV9zd2lzc19mcmFuYyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFkZ2Utc3dpc3MtZnJhbmMuanMiKCkgewogICAgQmFkZ2VTd2lzc0ZyYW5jID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy44NSA4LjYyYTQgNCAwIDAgMSA0Ljc4LTQuNzcgNCA0IDAgMCAxIDYuNzQgMCA0IDQgMCAwIDEgNC43OCA0Ljc4IDQgNCAwIDAgMSAwIDYuNzQgNCA0IDAgMCAxLTQuNzcgNC43OCA0IDQgMCAwIDEtNi43NSAwIDQgNCAwIDAgMS00Ljc4LTQuNzcgNCA0IDAgMCAxIDAtNi43NloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTdWOGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDEyaDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNmg0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFkZ2UtdHVya2lzaC1saXJhLmpzCnZhciBCYWRnZVR1cmtpc2hMaXJhOwp2YXIgaW5pdF9iYWRnZV90dXJraXNoX2xpcmEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZGdlLXR1cmtpc2gtbGlyYS5qcyIoKSB7CiAgICBCYWRnZVR1cmtpc2hMaXJhID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgN3YxMGE1IDUgMCAwIDAgNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDgtNiAzIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMuODUgOC42MmE0IDQgMCAwIDEgNC43OC00Ljc3IDQgNCAwIDAgMSA2Ljc0IDAgNCA0IDAgMCAxIDQuNzggNC43OCA0IDQgMCAwIDEgMCA2Ljc0IDQgNCAwIDAgMS00Ljc3IDQuNzggNCA0IDAgMCAxLTYuNzUgMCA0IDQgMCAwIDEtNC43OC00Ljc3IDQgNCAwIDAgMSAwLTYuNzYiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS14LmpzCnZhciBCYWRnZVg7CnZhciBpbml0X2JhZGdlX3ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZGdlLXguanMiKCkgewogICAgQmFkZ2VYID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy44NSA4LjYyYTQgNCAwIDAgMSA0Ljc4LTQuNzcgNCA0IDAgMCAxIDYuNzQgMCA0IDQgMCAwIDEgNC43OCA0Ljc4IDQgNCAwIDAgMSAwIDYuNzQgNCA0IDAgMCAxLTQuNzcgNC43OCA0IDQgMCAwIDEtNi43NSAwIDQgNCAwIDAgMS00Ljc4LTQuNzcgNCA0IDAgMCAxIDAtNi43NloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTUiLCB4MjogIjkiLCB5MTogIjkiLCB5MjogIjE1IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjkiLCB4MjogIjE1IiwgeTE6ICI5IiwgeTI6ICIxNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZGdlLmpzCnZhciBCYWRnZTsKdmFyIGluaXRfYmFkZ2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZGdlLmpzIigpIHsKICAgIEJhZGdlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy44NSA4LjYyYTQgNCAwIDAgMSA0Ljc4LTQuNzcgNCA0IDAgMCAxIDYuNzQgMCA0IDQgMCAwIDEgNC43OCA0Ljc4IDQgNCAwIDAgMSAwIDYuNzQgNCA0IDAgMCAxLTQuNzcgNC43OCA0IDQgMCAwIDEtNi43NSAwIDQgNCAwIDAgMS00Ljc4LTQuNzcgNCA0IDAgMCAxIDAtNi43NloiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWdnYWdlLWNsYWltLmpzCnZhciBCYWdnYWdlQ2xhaW07CnZhciBpbml0X2JhZ2dhZ2VfY2xhaW0gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZ2dhZ2UtY2xhaW0uanMiKCkgewogICAgQmFnZ2FnZUNsYWltID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMThINmEyIDIgMCAwIDEtMi0yVjdhMiAyIDAgMCAwLTItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxNFY0YTIgMiAwIDAgMC0yLTJoLTFhMiAyIDAgMCAwLTIgMnYxMCIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxMyIsIGhlaWdodDogIjgiLCB4OiAiOCIsIHk6ICI2Iiwgcng6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjIwIiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICIyMCIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFsbG9vbi5qcwp2YXIgQmFsbG9vbjsKdmFyIGluaXRfYmFsbG9vbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFsbG9vbi5qcyIoKSB7CiAgICBCYWxsb29uID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTZ2MWEyIDIgMCAwIDAgMiAyaDFhMiAyIDAgMCAxIDIgMnYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZhMiAyIDAgMCAxIDIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA4YzAgNC0zLjUgOC02IDhzLTYtNC02LThhNiA2IDAgMCAxIDEyIDAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYW4uanMKdmFyIEJhbjsKdmFyIGluaXRfYmFuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYW4uanMiKCkgewogICAgQmFuID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC45MjkgNC45MjkgMTkuMDcgMTkuMDcxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFuYW5hLmpzCnZhciBCYW5hbmE7CnZhciBpbml0X2JhbmFuYSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFuYW5hLmpzIigpIHsKICAgIEJhbmFuYSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTNjMy41LTIgOC0yIDEwIDJhNS41IDUuNSAwIDAgMSA4IDUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNS4xNSAxNy44OWM1LjUyLTEuNTIgOC42NS02Ljg5IDctMTJDMTEuNTUgNCAxMS41IDIgMTMgMmMzLjIyIDAgNSA1LjUgNSA4IDAgNi41LTQuMiAxMi0xMC40OSAxMkM1LjExIDIyIDIgMjIgMiAyMGMwLTEuNSAxLjE0LTEuNTUgMy4xNS0yLjExWiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhbmRhZ2UuanMKdmFyIEJhbmRhZ2U7CnZhciBpbml0X2JhbmRhZ2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhbmRhZ2UuanMiKCkgewogICAgQmFuZGFnZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEwLjAxaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxNC4wMWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTAuMDFoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE0LjAxaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA2djEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgNnYxMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjIiLCB5OiAiNiIsIHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxMiIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jhbmtub3RlLWFycm93LWRvd24uanMKdmFyIEJhbmtub3RlQXJyb3dEb3duOwp2YXIgaW5pdF9iYW5rbm90ZV9hcnJvd19kb3duID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYW5rbm90ZS1hcnJvdy1kb3duLmpzIigpIHsKICAgIEJhbmtub3RlQXJyb3dEb3duID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMThINGEyIDIgMCAwIDEtMi0yVjhhMiAyIDAgMCAxIDItMmgxNmEyIDIgMCAwIDEgMiAydjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTkgMyAzIDMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMTZ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEyaC4wMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFua25vdGUtYXJyb3ctdXAuanMKdmFyIEJhbmtub3RlQXJyb3dVcDsKdmFyIGluaXRfYmFua25vdGVfYXJyb3dfdXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jhbmtub3RlLWFycm93LXVwLmpzIigpIHsKICAgIEJhbmtub3RlQXJyb3dVcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4SDRhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDEyaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAyMnYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiAxOS0zLTMtMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTJoLjAxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYW5rbm90ZS14LmpzCnZhciBCYW5rbm90ZVg7CnZhciBpbml0X2Jhbmtub3RlX3ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jhbmtub3RlLXguanMiKCkgewogICAgQmFua25vdGVYID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMThINGEyIDIgMCAwIDEtMi0yVjhhMiAyIDAgMCAxIDItMmgxNmEyIDIgMCAwIDEgMiAydjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMTcgNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDEyaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiAxNy01IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxMmguMDEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jhbmtub3RlLmpzCnZhciBCYW5rbm90ZTsKdmFyIGluaXRfYmFua25vdGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jhbmtub3RlLmpzIigpIHsKICAgIEJhbmtub3RlID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxMiIsIHg6ICIyIiwgeTogIjYiLCByeDogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEyaC4wMU0xOCAxMmguMDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYXJjb2RlLmpzCnZhciBCYXJjb2RlOwp2YXIgaW5pdF9iYXJjb2RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYXJjb2RlLmpzIigpIHsKICAgIEJhcmNvZGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDV2MTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA1djE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDV2MTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgNXYxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA1djE0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFycmVsLmpzCnZhciBCYXJyZWw7CnZhciBpbml0X2JhcnJlbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFycmVsLmpzIigpIHsKICAgIEJhcnJlbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDNhNDEgNDEgMCAwIDAgMCAxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAzYTQxIDQxIDAgMCAxIDAgMTgiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTcgM2EyIDIgMCAwIDEgMS42OC45MiAxNS4yNSAxNS4yNSAwIDAgMSAwIDE2LjE2QTIgMiAwIDAgMSAxNyAyMUg3YTIgMiAwIDAgMS0xLjY4LS45MiAxNS4yNSAxNS4yNSAwIDAgMSAwLTE2LjE2QTIgMiAwIDAgMSA3IDN6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuODQgMTdoMTYuMzIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy44NCA3aDE2LjMyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFzZWxpbmUuanMKdmFyIEJhc2VsaW5lOwp2YXIgaW5pdF9iYXNlbGluZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFzZWxpbmUuanMiKCkgewogICAgQmFzZWxpbmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDIwaDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYgMTYgNi0xMiA2IDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJoOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhdGguanMKdmFyIEJhdGg7CnZhciBpbml0X2JhdGggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhdGguanMiKCkgewogICAgQmF0aCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDQgOCA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDE5djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmgyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE5djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA1IDcuNjIxIDMuNjIxQTIuMTIxIDIuMTIxIDAgMCAwIDQgNXYxMmEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAyLTJ2LTUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYXR0ZXJ5LWNoYXJnaW5nLmpzCnZhciBCYXR0ZXJ5Q2hhcmdpbmc7CnZhciBpbml0X2JhdHRlcnlfY2hhcmdpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhdHRlcnktY2hhcmdpbmcuanMiKCkgewogICAgQmF0dGVyeUNoYXJnaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTEgNy0zIDVoNGwtMyA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0Ljg1NiA2SDE2YTIgMiAwIDAgMSAyIDJ2OGEyIDIgMCAwIDEtMiAyaC0yLjkzNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxNHYtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01LjE0IDE4SDRhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoMi45MzYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYXR0ZXJ5LWZ1bGwuanMKdmFyIEJhdHRlcnlGdWxsOwp2YXIgaW5pdF9iYXR0ZXJ5X2Z1bGwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhdHRlcnktZnVsbC5qcyIoKSB7CiAgICBCYXR0ZXJ5RnVsbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEwdjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTB2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxNHYtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEwdjQiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjYiLCB3aWR0aDogIjE2IiwgaGVpZ2h0OiAiMTIiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYXR0ZXJ5LWxvdy5qcwp2YXIgQmF0dGVyeUxvdzsKdmFyIGluaXRfYmF0dGVyeV9sb3cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhdHRlcnktbG93LmpzIigpIHsKICAgIEJhdHRlcnlMb3cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxNHYtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE0di00IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMiIsIHk6ICI2Iiwgd2lkdGg6ICIxNiIsIGhlaWdodDogIjEyIiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmF0dGVyeS1tZWRpdW0uanMKdmFyIEJhdHRlcnlNZWRpdW07CnZhciBpbml0X2JhdHRlcnlfbWVkaXVtID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYXR0ZXJ5LW1lZGl1bS5qcyIoKSB7CiAgICBCYXR0ZXJ5TWVkaXVtID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTR2LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTR2LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxNHYtNCIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjIiLCB5OiAiNiIsIHdpZHRoOiAiMTYiLCBoZWlnaHQ6ICIxMiIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhdHRlcnktcGx1cy5qcwp2YXIgQmF0dGVyeVBsdXM7CnZhciBpbml0X2JhdHRlcnlfcGx1cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmF0dGVyeS1wbHVzLmpzIigpIHsKICAgIEJhdHRlcnlQbHVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOXY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyLjU0MyA2SDE2YTIgMiAwIDAgMSAyIDJ2OGEyIDIgMCAwIDEtMiAyaC0zLjYwNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxNHYtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEyaDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNy42MDYgMThINGEyIDIgMCAwIDEtMi0yVjhhMiAyIDAgMCAxIDItMmgzLjYwNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhdHRlcnktd2FybmluZy5qcwp2YXIgQmF0dGVyeVdhcm5pbmc7CnZhciBpbml0X2JhdHRlcnlfd2FybmluZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmF0dGVyeS13YXJuaW5nLmpzIigpIHsKICAgIEJhdHRlcnlXYXJuaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTdoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDd2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA2aDJhMiAyIDAgMCAxIDIgMnY4YTIgMiAwIDAgMS0yIDJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTR2LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOEg0YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYXR0ZXJ5LmpzCnZhciBCYXR0ZXJ5Owp2YXIgaW5pdF9iYXR0ZXJ5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYXR0ZXJ5LmpzIigpIHsKICAgIEJhdHRlcnkgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0gMjIgMTQgTCAyMiAxMCIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjIiLCB5OiAiNiIsIHdpZHRoOiAiMTYiLCBoZWlnaHQ6ICIxMiIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlYWtlci5qcwp2YXIgQmVha2VyOwp2YXIgaW5pdF9iZWFrZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlYWtlci5qcyIoKSB7CiAgICBCZWFrZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00LjUgM2gxNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDN2MTZhMiAyIDAgMCAwIDIgMmg4YTIgMiAwIDAgMCAyLTJWMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE0aDEyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmVhbi1vZmYuanMKdmFyIEJlYW5PZmY7CnZhciBpbml0X2JlYW5fb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZWFuLW9mZi5qcyIoKSB7CiAgICBCZWFuT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA5Yy0uNjQuNjQtMS41MjEuOTU0LTIuNDAyIDEuMTY1QTYgNiAwIDAgMCA4IDIyYTEzLjk2IDEzLjk2IDAgMCAwIDkuOS00LjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAuNzUgNS4wOTNBNiA2IDAgMCAxIDIyIDhjMCAyLjQxMS0uNjEgNC42OC0xLjY4MyA2LjY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUuMzQxIDEwLjYyYTQgNCAwIDAgMCA2LjQ4NyAxLjIwOE0xMC42MiA1LjM0MWE0LjAxNSA0LjAxNSAwIDAgMSAyLjAzOSAyLjA0IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjIiLCB4MjogIjIyIiwgeTE6ICIyIiwgeTI6ICIyMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlYW4uanMKdmFyIEJlYW47CnZhciBpbml0X2JlYW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlYW4uanMiKCkgewogICAgQmVhbiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwLjE2NSA2LjU5OEM5Ljk1NCA3LjQ3OCA5LjY0IDguMzYgOSA5Yy0uNjQuNjQtMS41MjEuOTU0LTIuNDAyIDEuMTY1QTYgNiAwIDAgMCA4IDIyYzcuNzMyIDAgMTQtNi4yNjggMTQtMTRhNiA2IDAgMCAwLTExLjgzNS0xLjQwMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNS4zNDEgMTAuNjJhNCA0IDAgMSAwIDUuMjc5LTUuMjgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZWQtZG91YmxlLmpzCnZhciBCZWREb3VibGU7CnZhciBpbml0X2JlZF9kb3VibGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlZC1kb3VibGUuanMiKCkgewogICAgQmVkRG91YmxlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMHYtOGEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ2OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEwVjZhMiAyIDAgMCAxIDItMmgxMmEyIDIgMCAwIDEgMiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNHY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMThoMjAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZWQtc2luZ2xlLmpzCnZhciBCZWRTaW5nbGU7CnZhciBpbml0X2JlZF9zaW5nbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlZC1zaW5nbGUuanMiKCkgewogICAgQmVkU2luZ2xlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAyMHYtOGEyIDIgMCAwIDEgMi0yaDE0YTIgMiAwIDAgMSAyIDJ2OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDEwVjZhMiAyIDAgMCAxIDItMmgxMGEyIDIgMCAwIDEgMiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxOGgxOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlZC5qcwp2YXIgQmVkOwp2YXIgaW5pdF9iZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlZC5qcyIoKSB7CiAgICBCZWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDR2MTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA4aDE4YTIgMiAwIDAgMSAyIDJ2MTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxN2gyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDh2OSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlZWYuanMKdmFyIEJlZWY7CnZhciBpbml0X2JlZWYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlZWYuanMiKCkgewogICAgQmVlZiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE2LjQgMTMuN0E2LjUgNi41IDAgMSAwIDYuMjggNi42Yy0xLjEgMy4xMy0uNzggMy45LTMuMTggNi4wOEEzIDMgMCAwIDAgNSAxOGM0IDAgOC40LTEuOCAxMS40LTQuMyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xOC41IDYgMi4xOSA0LjVhNi40OCA2LjQ4IDAgMCAxLTIuMjkgNy4yQzE1LjQgMjAuMiAxMSAyMiA3IDIyYTMgMyAwIDAgMS0yLjY4LTEuNjZMMi40IDE2LjUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMi41IiwgY3k6ICI4LjUiLCByOiAiMi41IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmVlci1vZmYuanMKdmFyIEJlZXJPZmY7CnZhciBpbml0X2JlZXJfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZWVyLW9mZi5qcyIoKSB7CiAgICBCZWVyT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMTN2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxMS40N1Y4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDExaDFhMyAzIDAgMCAxIDIuNzQ1IDQuMjExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDh2MTJhMiAyIDAgMCAwIDIgMmg4YTIgMiAwIDAgMCAyLTJ2LTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNy41MzYgNy41MzVDNi43NjYgNy42NDkgNi4xNTQgOCA1LjUgOGEyLjUgMi41IDAgMCAxLTEuNzY4LTQuMjY4IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTguNzI3IDMuMjA0QzkuMzA2IDIuNzY3IDkuODg1IDIgMTEgMmMxLjU2IDAgMiAxLjUgMyAxLjVzMS43Mi0uNSAyLjUtLjVhMSAxIDAgMSAxIDAgNWMtLjc4IDAtMS41LS41LTIuNS0uNWEzLjE0OSAzLjE0OSAwIDAgMC0uODQyLjEyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTQuNlYxOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlZXIuanMKdmFyIEJlZXI7CnZhciBpbml0X2JlZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlZXIuanMiKCkgewogICAgQmVlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDExaDFhMyAzIDAgMCAxIDAgNmgtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDEydjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMTJ2NiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNCA3LjVjLTEgMC0xLjQ0LjUtMyAuNXMtMi0uNS0zLS41LTEuNzIuNS0yLjUuNWEyLjUgMi41IDAgMCAxIDAtNWMuNzggMCAxLjU3LjUgMi41LjVTOS40NCAyIDExIDJzMiAxLjUgMyAxLjUgMS43Mi0uNSAyLjUtLjVhMi41IDIuNSAwIDAgMSAwIDVjLS43OCAwLTEuNS0uNS0yLjUtLjVaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgOHYxMmEyIDIgMCAwIDAgMiAyaDhhMiAyIDAgMCAwIDItMlY4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmVsbC1kb3QuanMKdmFyIEJlbGxEb3Q7CnZhciBpbml0X2JlbGxfZG90ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZWxsLWRvdC5qcyIoKSB7CiAgICBCZWxsRG90ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAuMjY4IDIxYTIgMiAwIDAgMCAzLjQ2NCAwIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTExLjY4IDIuMDA5QTYgNiAwIDAgMCA2IDhjMCA0LjQ5OS0xLjQxMSA1Ljk1Ni0yLjczOCA3LjMyNkExIDEgMCAwIDAgNCAxN2gxNmExIDEgMCAwIDAgLjc0LTEuNjczYy0uODI0LS44NS0xLjY3OC0xLjczMS0yLjIxLTMuMzQ4IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjUiLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlbGwtb2ZmLmpzCnZhciBCZWxsT2ZmOwp2YXIgaW5pdF9iZWxsX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmVsbC1vZmYuanMiKCkgewogICAgQmVsbE9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjI2OCAyMWEyIDIgMCAwIDAgMy40NjQgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxN0g0YTEgMSAwIDAgMS0uNzQtMS42NzNDNC41OSAxMy45NTYgNiAxMi40OTkgNiA4YTYgNiAwIDAgMSAuMjU4LTEuNzQyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjY2OCAzLjAxQTYgNiAwIDAgMSAxOCA4YzAgMi42ODcuNzcgNC42NTMgMS43MDcgNi4wNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlbGwtZWxlY3RyaWMuanMKdmFyIEJlbGxFbGVjdHJpYzsKdmFyIGluaXRfYmVsbF9lbGVjdHJpYyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmVsbC1lbGVjdHJpYy5qcyIoKSB7CiAgICBCZWxsRWxlY3RyaWMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOC41MTggMTcuMzQ3QTcgNyAwIDAgMSAxNCAxOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOC44IDRBMTEgMTEgMCAwIDEgMjAgOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDloLjAxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMjAiLCBjeTogIjE2IiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICI5IiwgcjogIjciIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI0IiwgeTogIjE2Iiwgd2lkdGg6ICIxMCIsIGhlaWdodDogIjYiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZWxsLW1pbnVzLmpzCnZhciBCZWxsTWludXM7CnZhciBpbml0X2JlbGxfbWludXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlbGwtbWludXMuanMiKCkgewogICAgQmVsbE1pbnVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAuMjY4IDIxYTIgMiAwIDAgMCAzLjQ2NCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDhoNiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNi4yNDMgMy43NTdBNiA2IDAgMCAwIDYgOGMwIDQuNDk5LTEuNDExIDUuOTU2LTIuNzM4IDcuMzI2QTEgMSAwIDAgMCA0IDE3aDE2YTEgMSAwIDAgMCAuNzQtMS42NzNBOS40IDkuNCAwIDAgMSAxOC42NjcgMTIiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZWxsLXBsdXMuanMKdmFyIEJlbGxQbHVzOwp2YXIgaW5pdF9iZWxsX3BsdXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlbGwtcGx1cy5qcyIoKSB7CiAgICBCZWxsUGx1cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjI2OCAyMWEyIDIgMCAwIDAgMy40NjQgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA4aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggNXY2IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwLjAwMiAxNC40NjRhOSA5IDAgMCAwIC43MzguODYzQTEgMSAwIDAgMSAyMCAxN0g0YTEgMSAwIDAgMS0uNzQtMS42NzNDNC41OSAxMy45NTYgNiAxMi40OTkgNiA4YTYgNiAwIDAgMSA4Ljc1LTUuMzMyIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmVsbC1yaW5nLmpzCnZhciBCZWxsUmluZzsKdmFyIGluaXRfYmVsbF9yaW5nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZWxsLXJpbmcuanMiKCkgewogICAgQmVsbFJpbmcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC4yNjggMjFhMiAyIDAgMCAwIDMuNDY0IDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgOGMwLTIuMy0uOC00LjMtMi02IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMuMjYyIDE1LjMyNkExIDEgMCAwIDAgNCAxN2gxNmExIDEgMCAwIDAgLjc0LTEuNjczQzE5LjQxIDEzLjk1NiAxOCAxMi40OTkgMTggOEE2IDYgMCAwIDAgNiA4YzAgNC40OTktMS40MTEgNS45NTYtMi43MzggNy4zMjYiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAyQzIuOCAzLjcgMiA1LjcgMiA4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmVsbC5qcwp2YXIgQmVsbDsKdmFyIGluaXRfYmVsbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmVsbC5qcyIoKSB7CiAgICBCZWxsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAuMjY4IDIxYTIgMiAwIDAgMCAzLjQ2NCAwIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMuMjYyIDE1LjMyNkExIDEgMCAwIDAgNCAxN2gxNmExIDEgMCAwIDAgLjc0LTEuNjczQzE5LjQxIDEzLjk1NiAxOCAxMi40OTkgMTggOEE2IDYgMCAwIDAgNiA4YzAgNC40OTktMS40MTEgNS45NTYtMi43MzggNy4zMjYiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZXR3ZWVuLWhvcml6b250YWwtZW5kLmpzCnZhciBCZXR3ZWVuSG9yaXpvbnRhbEVuZDsKdmFyIGluaXRfYmV0d2Vlbl9ob3Jpem9udGFsX2VuZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmV0d2Vlbi1ob3Jpem9udGFsLWVuZC5qcyIoKSB7CiAgICBCZXR3ZWVuSG9yaXpvbnRhbEVuZCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjEzIiwgaGVpZ2h0OiAiNyIsIHg6ICIzIiwgeTogIjMiLCByeDogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgMTUtMy0zIDMtMyIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxMyIsIGhlaWdodDogIjciLCB4OiAiMyIsIHk6ICIxNCIsIHJ4OiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JldHdlZW4tdmVydGljYWwtZW5kLmpzCnZhciBCZXR3ZWVuVmVydGljYWxFbmQ7CnZhciBpbml0X2JldHdlZW5fdmVydGljYWxfZW5kID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZXR3ZWVuLXZlcnRpY2FsLWVuZC5qcyIoKSB7CiAgICBCZXR3ZWVuVmVydGljYWxFbmQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiMTMiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMjIgMy0zIDMgMyIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiMTMiLCB4OiAiMTQiLCB5OiAiMyIsIHJ4OiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JldHdlZW4taG9yaXpvbnRhbC1zdGFydC5qcwp2YXIgQmV0d2Vlbkhvcml6b250YWxTdGFydDsKdmFyIGluaXRfYmV0d2Vlbl9ob3Jpem9udGFsX3N0YXJ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZXR3ZWVuLWhvcml6b250YWwtc3RhcnQuanMiKCkgewogICAgQmV0d2Vlbkhvcml6b250YWxTdGFydCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjEzIiwgaGVpZ2h0OiAiNyIsIHg6ICI4IiwgeTogIjMiLCByeDogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiA5IDMgMy0zIDMiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTMiLCBoZWlnaHQ6ICI3IiwgeDogIjgiLCB5OiAiMTQiLCByeDogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZXR3ZWVuLXZlcnRpY2FsLXN0YXJ0LmpzCnZhciBCZXR3ZWVuVmVydGljYWxTdGFydDsKdmFyIGluaXRfYmV0d2Vlbl92ZXJ0aWNhbF9zdGFydCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmV0d2Vlbi12ZXJ0aWNhbC1zdGFydC5qcyIoKSB7CiAgICBCZXR3ZWVuVmVydGljYWxTdGFydCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjciLCBoZWlnaHQ6ICIxMyIsIHg6ICIzIiwgeTogIjgiLCByeDogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgMi0zIDMtMy0zIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjciLCBoZWlnaHQ6ICIxMyIsIHg6ICIxNCIsIHk6ICI4Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmlrZS5qcwp2YXIgQmlrZTsKdmFyIGluaXRfYmlrZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmlrZS5qcyIoKSB7CiAgICBCaWtlID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOC41IiwgY3k6ICIxNy41IiwgcjogIjMuNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUuNSIsIGN5OiAiMTcuNSIsIHI6ICIzLjUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNSIsIGN5OiAiNSIsIHI6ICIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3LjVWMTRsLTMtMyA0LTMgMiAzaDIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iaWNlcHMtZmxleGVkLmpzCnZhciBCaWNlcHNGbGV4ZWQ7CnZhciBpbml0X2JpY2Vwc19mbGV4ZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JpY2Vwcy1mbGV4ZWQuanMiKCkgewogICAgQmljZXBzRmxleGVkID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTIuNDA5IDEzLjAxN0E1IDUgMCAwIDEgMjIgMTVjMCAzLjg2Ni00IDctOSA3LTQuMDc3IDAtOC4xNTMtLjgyLTEwLjM3MS0yLjQ2Mi0uNDI2LS4zMTYtLjYzMS0uODMyLS42Mi0xLjM2MkMyLjExOCAxMi43MjMgMi42MjcgMiAxMCAyYTMgMyAwIDAgMSAzIDMgMiAyIDAgMCAxLTIgMmMtMS4xMDUgMC0xLjY0LS40NDQtMi0xIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDE0YTUgNSAwIDAgMC03LjU4NCAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuOTY0IDYuODI1QzguMDE5IDcuOTc3IDkuNSAxMyA4IDE1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmluYXJ5LmpzCnZhciBCaW5hcnk7CnZhciBpbml0X2JpbmFyeSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmluYXJ5LmpzIigpIHsKICAgIEJpbmFyeSA9IFsKICAgICAgWyJyZWN0IiwgeyB4OiAiMTQiLCB5OiAiMTQiLCB3aWR0aDogIjQiLCBoZWlnaHQ6ICI2Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiNiIsIHk6ICI0Iiwgd2lkdGg6ICI0IiwgaGVpZ2h0OiAiNiIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDIwaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTBoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE0aDJ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA0aDJ2NiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jpb2hhemFyZC5qcwp2YXIgQmlvaGF6YXJkOwp2YXIgaW5pdF9iaW9oYXphcmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jpb2hhemFyZC5qcyIoKSB7CiAgICBCaW9oYXphcmQgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMS45IiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi43IDMuNGMtLjkgMi41IDAgNS4yIDIuMiA2LjdDNi41IDkgMy43IDkuNiAyIDExLjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOC45IDEwLjEgMS40LjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuMyAzLjRjLjkgMi41IDAgNS4yLTIuMiA2LjcgMi40LTEuMiA1LjItLjYgNi45IDEuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNS4xIDEwLjEtMS40LjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYuNyAyMC44Yy0yLjYtLjQtNC42LTIuNi00LjctNS4zLS4yIDIuNi0yLjEgNC44LTQuNyA1LjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTMuOXYxLjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMuNSA1LjRjLTEtLjItMi0uMi0zIDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTYuNGMuNy0uNyAxLjItMS42IDEuNS0yLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNS41IDEzLjljLjMuOS44IDEuOCAxLjUgMi41IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmlub2N1bGFycy5qcwp2YXIgQmlub2N1bGFyczsKdmFyIGluaXRfYmlub2N1bGFycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmlub2N1bGFycy5qcyIoKSB7CiAgICBCaW5vY3VsYXJzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTBoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSA3VjRhMSAxIDAgMCAwLTEtMWgtMmExIDEgMCAwIDAtMSAxdjMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMjFhMiAyIDAgMCAwIDItMnYtMy44NTFjMC0xLjM5LTItMi45NjItMi00LjgyOVY4YTEgMSAwIDAgMC0xLTFoLTRhMSAxIDAgMCAwLTEgMXYxMWEyIDIgMCAwIDAgMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0gMjIgMTYgTCAyIDE2IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQgMjFhMiAyIDAgMCAxLTItMnYtMy44NTFjMC0xLjM5IDItMi45NjIgMi00LjgyOVY4YTEgMSAwIDAgMSAxLTFoNGExIDEgMCAwIDEgMSAxdjExYTIgMiAwIDAgMS0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgN1Y0YTEgMSAwIDAgMC0xLTFINmExIDEgMCAwIDAtMSAxdjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iaXJkLmpzCnZhciBCaXJkOwp2YXIgaW5pdF9iaXJkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9iaXJkLmpzIigpIHsKICAgIEJpcmQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA3aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zLjQgMThIMTJhOCA4IDAgMCAwIDgtOFY3YTQgNCAwIDAgMC03LjI4LTIuM0wyIDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwIDcgMiAuNS0yIC41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE4djMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTcuNzVWMjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxOGE2IDYgMCAwIDAgMy44NC0xMC42MSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JpdGNvaW4uanMKdmFyIEJpdGNvaW47CnZhciBpbml0X2JpdGNvaW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JpdGNvaW4uanMiKCkgewogICAgQml0Y29pbiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTExLjc2NyAxOS4wODljNC45MjQuODY4IDYuMTQtNi4wMjUgMS4yMTYtNi44OTRtLTEuMjE2IDYuODk0TDUuODYgMTguMDQ3bTUuOTA4IDEuMDQyLS4zNDcgMS45N20xLjU2My04Ljg2NGM0LjkyNC44NjkgNi4xNC02LjAyNSAxLjIxNS02Ljg5M20tMS4yMTUgNi44OTMtMy45NC0uNjk0bTUuMTU1LTYuMkw4LjI5IDQuMjZtNS45MDggMS4wNDIuMzQ4LTEuOTdNNy40OCAyMC4zNjRsMy4xMjYtMTcuNzI3IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmlyZGhvdXNlLmpzCnZhciBCaXJkaG91c2U7CnZhciBpbml0X2JpcmRob3VzZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmlyZGhvdXNlLmpzIigpIHsKICAgIEJpcmRob3VzZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMTggMS45NTYtMTEuNDY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgOCA3LjgyLTUuNjE1YTIgMiAwIDAgMSAyLjM2IDBMMjEgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE4aDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTggNS4wNDQgNi41MzIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTAiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JsZW5kLmpzCnZhciBCbGVuZDsKdmFyIGluaXRfYmxlbmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JsZW5kLmpzIigpIHsKICAgIEJsZW5kID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICI5IiwgcjogIjciIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNSIsIGN5OiAiMTUiLCByOiAiNyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JsaW5kcy5qcwp2YXIgQmxpbmRzOwp2YXIgaW5pdF9ibGluZHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JsaW5kcy5qcyIoKSB7CiAgICBCbGluZHMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDNoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgN0g4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDExSDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTloMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNWgxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDN2MTQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI0IiwgY3k6ICIxOSIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmxvY2tzLmpzCnZhciBCbG9ja3M7CnZhciBpbml0X2Jsb2NrcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmxvY2tzLmpzIigpIHsKICAgIEJsb2NrcyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwIDIyVjdhMSAxIDAgMCAwLTEtMUg0YTIgMiAwIDAgMC0yIDJ2MTJhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0ydi01YTEgMSAwIDAgMC0xLTFIMiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicmVjdCIsIHsgeDogIjE0IiwgeTogIjIiLCB3aWR0aDogIjgiLCBoZWlnaHQ6ICI4Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmx1ZXRvb3RoLWNvbm5lY3RlZC5qcwp2YXIgQmx1ZXRvb3RoQ29ubmVjdGVkOwp2YXIgaW5pdF9ibHVldG9vdGhfY29ubmVjdGVkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ibHVldG9vdGgtY29ubmVjdGVkLmpzIigpIHsKICAgIEJsdWV0b290aENvbm5lY3RlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgNyAxMCAxMC01IDVWMmw1IDVMNyAxNyIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxOCIsIHgyOiAiMjEiLCB5MTogIjEyIiwgeTI6ICIxMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIzIiwgeDI6ICI2IiwgeTE6ICIxMiIsIHkyOiAiMTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ibHVldG9vdGgtb2ZmLmpzCnZhciBCbHVldG9vdGhPZmY7CnZhciBpbml0X2JsdWV0b290aF9vZmYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JsdWV0b290aC1vZmYuanMiKCkgewogICAgQmx1ZXRvb3RoT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMTctNSA1VjEybC01IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0LjUgOS41IDE3IDdsLTUtNXY0LjUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ibHVldG9vdGgtc2VhcmNoaW5nLmpzCnZhciBCbHVldG9vdGhTZWFyY2hpbmc7CnZhciBpbml0X2JsdWV0b290aF9zZWFyY2hpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JsdWV0b290aC1zZWFyY2hpbmcuanMiKCkgewogICAgQmx1ZXRvb3RoU2VhcmNoaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtNyA3IDEwIDEwLTUgNVYybDUgNUw3IDE3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwLjgzIDE0LjgzYTQgNCAwIDAgMCAwLTUuNjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTJoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmx1ZXRvb3RoLmpzCnZhciBCbHVldG9vdGg7CnZhciBpbml0X2JsdWV0b290aCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYmx1ZXRvb3RoLmpzIigpIHsKICAgIEJsdWV0b290aCA9IFtbInBhdGgiLCB7IGQ6ICJtNyA3IDEwIDEwLTUgNVYybDUgNUw3IDE3IiB9XV07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JvbGQuanMKdmFyIEJvbGQ7CnZhciBpbml0X2JvbGQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JvbGQuanMiKCkgewogICAgQm9sZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTJoOWE0IDQgMCAwIDEgMCA4SDdhMSAxIDAgMCAxLTEtMVY1YTEgMSAwIDAgMSAxLTFoN2E0IDQgMCAwIDEgMCA4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9sdC5qcwp2YXIgQm9sdDsKdmFyIGluaXRfYm9sdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9sdC5qcyIoKSB7CiAgICBCb2x0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEgMTZWOGEyIDIgMCAwIDAtMS0xLjczbC03LTRhMiAyIDAgMCAwLTIgMGwtNyA0QTIgMiAwIDAgMCAzIDh2OGEyIDIgMCAwIDAgMSAxLjczbDcgNGEyIDIgMCAwIDAgMiAwbDctNEEyIDIgMCAwIDAgMjEgMTZ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib21iLmpzCnZhciBCb21iOwp2YXIgaW5pdF9ib21iID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib21iLmpzIigpIHsKICAgIEJvbWIgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjExIiwgY3k6ICIxMyIsIHI6ICI5IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTQuMzUgNC42NSAxNi4zIDIuN2EyLjQxIDIuNDEgMCAwIDEgMy40IDBsMS42IDEuNmEyLjQgMi40IDAgMCAxIDAgMy40bC0xLjk1IDEuOTUiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDItMS41IDEuNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JvbmUuanMKdmFyIEJvbmU7CnZhciBpbml0X2JvbmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JvbmUuanMiKCkgewogICAgQm9uZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE3IDEwYy43LS43IDEuNjkgMCAyLjUgMGEyLjUgMi41IDAgMSAwIDAtNSAuNS41IDAgMCAxLS41LS41IDIuNSAyLjUgMCAxIDAtNSAwYzAgLjgxLjcgMS44IDAgMi41bC03IDdjLS43LjctMS42OSAwLTIuNSAwYTIuNSAyLjUgMCAwIDAgMCA1Yy4yOCAwIC41LjIyLjUuNWEyLjUgMi41IDAgMSAwIDUgMGMwLS44MS0uNy0xLjggMC0yLjVaIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1hLmpzCnZhciBCb29rQTsKdmFyIGluaXRfYm9va19hID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLWEuanMiKCkgewogICAgQm9va0EgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTQgMTkuNXYtMTVBMi41IDIuNSAwIDAgMSA2LjUgMkgxOWExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDFINi41YTEgMSAwIDAgMSAwLTVIMjAiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggMTMgNC03IDQgNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjEgMTFoNS43IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1hbGVydC5qcwp2YXIgQm9va0FsZXJ0Owp2YXIgaW5pdF9ib29rX2FsZXJ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLWFsZXJ0LmpzIigpIHsKICAgIEJvb2tBbGVydCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEzaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2djMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk00IDE5LjV2LTE1QTIuNSAyLjUgMCAwIDEgNi41IDJIMTlhMSAxIDAgMCAxIDEgMXYxOGExIDEgMCAwIDEtMSAxSDYuNWExIDEgMCAwIDEgMC01SDIwIiB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2stYXVkaW8uanMKdmFyIEJvb2tBdWRpbzsKdmFyIGluaXRfYm9va19hdWRpbyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1hdWRpby5qcyIoKSB7CiAgICBCb29rQXVkaW8gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2djciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgOHYzIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNNCAxOS41di0xNUEyLjUgMi41IDAgMCAxIDYuNSAySDE5YTEgMSAwIDAgMSAxIDF2MThhMSAxIDAgMCAxLTEgMUg2LjVhMSAxIDAgMCAxIDAtNUgyMCIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA4djMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLWNoZWNrLmpzCnZhciBCb29rQ2hlY2s7CnZhciBpbml0X2Jvb2tfY2hlY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2stY2hlY2suanMiKCkgewogICAgQm9va0NoZWNrID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk00IDE5LjV2LTE1QTIuNSAyLjUgMCAwIDEgNi41IDJIMTlhMSAxIDAgMCAxIDEgMXYxOGExIDEgMCAwIDEtMSAxSDYuNWExIDEgMCAwIDEgMC01SDIwIiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDkuNSAyIDIgNC00IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1kYXNoZWQuanMKdmFyIEJvb2tEYXNoZWQ7CnZhciBpbml0X2Jvb2tfZGFzaGVkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLWRhc2hlZC5qcyIoKSB7CiAgICBCb29rRGFzaGVkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTdoMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIyaDEuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyaDEuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy41IDIySDE5YTEgMSAwIDAgMCAxLTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuNSAySDE5YTEgMSAwIDAgMSAxIDF2MS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE0djNoLTIuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCA4LjVWMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMFY4LjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxOS41VjE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgNC41QTIuNSAyLjUgMCAwIDEgNi41IDJIOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIySDYuNWExIDEgMCAwIDEgMC01SDgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLWNvcHkuanMKdmFyIEJvb2tDb3B5Owp2YXIgaW5pdF9ib29rX2NvcHkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2stY29weS5qcyIoKSB7CiAgICBCb29rQ29weSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgN2EyIDIgMCAwIDAtMiAydjExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUuODAzIDE4SDVhMiAyIDAgMCAwIDAgNGg5LjVhLjUuNSAwIDAgMCAuNS0uNVYyMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTkgMTVWNGEyIDIgMCAwIDEgMi0yaDkuNWEuNS41IDAgMCAxIC41LjV2MTRhLjUuNSAwIDAgMS0uNS41SDExYTIgMiAwIDAgMSAwLTRoMTAiIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1kb3duLmpzCnZhciBCb29rRG93bjsKdmFyIGluaXRfYm9va19kb3duID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLWRvd24uanMiKCkgewogICAgQm9va0Rvd24gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxM1Y3IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNNCAxOS41di0xNUEyLjUgMi41IDAgMCAxIDYuNSAySDE5YTEgMSAwIDAgMSAxIDF2MThhMSAxIDAgMCAxLTEgMUg2LjVhMSAxIDAgMCAxIDAtNUgyMCIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxMCAzIDMgMy0zIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1oZWFkcGhvbmVzLmpzCnZhciBCb29rSGVhZHBob25lczsKdmFyIGluaXRfYm9va19oZWFkcGhvbmVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLWhlYWRwaG9uZXMuanMiKCkgewogICAgQm9va0hlYWRwaG9uZXMgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTQgMTkuNXYtMTVBMi41IDIuNSAwIDAgMSA2LjUgMkgxOWExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDFINi41YTEgMSAwIDAgMSAwLTVIMjAiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJ2LTJhNCA0IDAgMCAxIDggMHYyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTUiLCBjeTogIjEyIiwgcjogIjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICIxMiIsIHI6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1oZWFydC5qcwp2YXIgQm9va0hlYXJ0Owp2YXIgaW5pdF9ib29rX2hlYXJ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLWhlYXJ0LmpzIigpIHsKICAgIEJvb2tIZWFydCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNNCAxOS41di0xNUEyLjUgMi41IDAgMCAxIDYuNSAySDE5YTEgMSAwIDAgMSAxIDF2MThhMSAxIDAgMCAxLTEgMUg2LjVhMSAxIDAgMCAxIDAtNUgyMCIgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOC42MiA5LjhBMi4yNSAyLjI1IDAgMSAxIDEyIDYuODM2YTIuMjUgMi4yNSAwIDEgMSAzLjM4IDIuOTY2bC0yLjYyNiAyLjg1NmEuOTk4Ljk5OCAwIDAgMS0xLjUwNyAweiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2staW1hZ2UuanMKdmFyIEJvb2tJbWFnZTsKdmFyIGluaXRfYm9va19pbWFnZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1pbWFnZS5qcyIoKSB7CiAgICBCb29rSW1hZ2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMCAxMy43LTIuMS0yLjFhMiAyIDAgMCAwLTIuOCAwTDkuNyAxNyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTQgMTkuNXYtMTVBMi41IDIuNSAwIDAgMSA2LjUgMkgxOWExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDFINi41YTEgMSAwIDAgMSAwLTVIMjAiIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTAiLCBjeTogIjgiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2sta2V5LmpzCnZhciBCb29rS2V5Owp2YXIgaW5pdF9ib29rX2tleSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1rZXkuanMiKCkgewogICAgQm9va0tleSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDJINi41QTIuNSAyLjUgMCAwIDAgNCA0LjV2MTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDRoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxNS4yVjIxYTEgMSAwIDAgMS0xIDFINi41YTEgMSAwIDAgMSAwLTVIMjAiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNyIsIGN5OiAiMTAiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2stbWFya2VkLmpzCnZhciBCb29rTWFya2VkOwp2YXIgaW5pdF9ib29rX21hcmtlZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1tYXJrZWQuanMiKCkgewogICAgQm9va01hcmtlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDJ2OGwzLTMgMyAzVjIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk00IDE5LjV2LTE1QTIuNSAyLjUgMCAwIDEgNi41IDJIMTlhMSAxIDAgMCAxIDEgMXYxOGExIDEgMCAwIDEtMSAxSDYuNWExIDEgMCAwIDEgMC01SDIwIiB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2stbG9jay5qcwp2YXIgQm9va0xvY2s7CnZhciBpbml0X2Jvb2tfbG9jayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1sb2NrLmpzIigpIHsKICAgIEJvb2tMb2NrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggNlY0YTIgMiAwIDEgMC00IDB2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxNXY2YTEgMSAwIDAgMS0xIDFINi41YTEgMSAwIDAgMSAwLTVIMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxOS41di0xNUEyLjUgMi41IDAgMCAxIDYuNSAySDEwIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMTIiLCB5OiAiNiIsIHdpZHRoOiAiOCIsIGhlaWdodDogIjUiLCByeDogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLW1pbnVzLmpzCnZhciBCb29rTWludXM7CnZhciBpbml0X2Jvb2tfbWludXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2stbWludXMuanMiKCkgewogICAgQm9va01pbnVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk00IDE5LjV2LTE1QTIuNSAyLjUgMCAwIDEgNi41IDJIMTlhMSAxIDAgMCAxIDEgMXYxOGExIDEgMCAwIDEtMSAxSDYuNWExIDEgMCAwIDEgMC01SDIwIiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDEwaDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLW9wZW4tY2hlY2suanMKdmFyIEJvb2tPcGVuQ2hlY2s7CnZhciBpbml0X2Jvb2tfb3Blbl9jaGVjayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1vcGVuLWNoZWNrLmpzIigpIHsKICAgIEJvb2tPcGVuQ2hlY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMVY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDEyIDIgMiA0LTQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjIgNlY0YTEgMSAwIDAgMC0xLTFoLTVhNCA0IDAgMCAwLTQgNCA0IDQgMCAwIDAtNC00SDNhMSAxIDAgMCAwLTEgMXYxM2ExIDEgMCAwIDAgMSAxaDZhMyAzIDAgMCAxIDMgMyAzIDMgMCAwIDEgMy0zaDZhMSAxIDAgMCAwIDEtMXYtMS4zIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1vcGVuLXRleHQuanMKdmFyIEJvb2tPcGVuVGV4dDsKdmFyIGluaXRfYm9va19vcGVuX3RleHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2stb3Blbi10ZXh0LmpzIigpIHsKICAgIEJvb2tPcGVuVGV4dCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2MTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA4aDIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMyAxOGExIDEgMCAwIDEtMS0xVjRhMSAxIDAgMCAxIDEtMWg1YTQgNCAwIDAgMSA0IDQgNCA0IDAgMCAxIDQtNGg1YTEgMSAwIDAgMSAxIDF2MTNhMSAxIDAgMCAxLTEgMWgtNmEzIDMgMCAwIDAtMyAzIDMgMyAwIDAgMC0zLTN6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDhoMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2stb3Blbi5qcwp2YXIgQm9va09wZW47CnZhciBpbml0X2Jvb2tfb3BlbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1vcGVuLmpzIigpIHsKICAgIEJvb2tPcGVuID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgN3YxNCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0zIDE4YTEgMSAwIDAgMS0xLTFWNGExIDEgMCAwIDEgMS0xaDVhNCA0IDAgMCAxIDQgNCA0IDQgMCAwIDEgNC00aDVhMSAxIDAgMCAxIDEgMXYxM2ExIDEgMCAwIDEtMSAxaC02YTMgMyAwIDAgMC0zIDMgMyAzIDAgMCAwLTMtM3oiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLXBsdXMuanMKdmFyIEJvb2tQbHVzOwp2YXIgaW5pdF9ib29rX3BsdXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2stcGx1cy5qcyIoKSB7CiAgICBCb29rUGx1cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2NiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTQgMTkuNXYtMTVBMi41IDIuNSAwIDAgMSA2LjUgMkgxOWExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDFINi41YTEgMSAwIDAgMSAwLTVIMjAiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTBoNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2stc2VhcmNoLmpzCnZhciBCb29rU2VhcmNoOwp2YXIgaW5pdF9ib29rX3NlYXJjaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1zZWFyY2guanMiKCkgewogICAgQm9va1NlYXJjaCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDIySDUuNWExIDEgMCAwIDEgMC01aDQuNTAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDIyLTEuODc5LTEuODc4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTkuNXYtMTVBMi41IDIuNSAwIDAgMSA1LjUgMkgxOGExIDEgMCAwIDEgMSAxdjgiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNyIsIGN5OiAiMTgiLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2stdGV4dC5qcwp2YXIgQm9va1RleHQ7CnZhciBpbml0X2Jvb2tfdGV4dCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay10ZXh0LmpzIigpIHsKICAgIEJvb2tUZXh0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk00IDE5LjV2LTE1QTIuNSAyLjUgMCAwIDEgNi41IDJIMTlhMSAxIDAgMCAxIDEgMXYxOGExIDEgMCAwIDEtMSAxSDYuNWExIDEgMCAwIDEgMC01SDIwIiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDExaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA3aDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLXVwLTIuanMKdmFyIEJvb2tVcDI7CnZhciBpbml0X2Jvb2tfdXBfMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay11cC0yLmpzIigpIHsKICAgIEJvb2tVcDIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxM1Y3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDJoMWExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDFINi41YTEgMSAwIDAgMSAwLTVIMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxOS41di0xNUEyLjUgMi41IDAgMCAxIDYuNSAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTAgMy0zIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDUgMy0zIDMgMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2stdHlwZS5qcwp2YXIgQm9va1R5cGU7CnZhciBpbml0X2Jvb2tfdHlwZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay10eXBlLmpzIigpIHsKICAgIEJvb2tUeXBlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTNoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2djciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgOFY2SDh2MiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTQgMTkuNXYtMTVBMi41IDIuNSAwIDAgMSA2LjUgMkgxOWExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDFINi41YTEgMSAwIDAgMSAwLTVIMjAiIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay11cC5qcwp2YXIgQm9va1VwOwp2YXIgaW5pdF9ib29rX3VwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLXVwLmpzIigpIHsKICAgIEJvb2tVcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEzVjciIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk00IDE5LjV2LTE1QTIuNSAyLjUgMCAwIDEgNi41IDJIMTlhMSAxIDAgMCAxIDEgMXYxOGExIDEgMCAwIDEtMSAxSDYuNWExIDEgMCAwIDEgMC01SDIwIiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDEwIDMtMyAzIDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLXVzZXIuanMKdmFyIEJvb2tVc2VyOwp2YXIgaW5pdF9ib29rX3VzZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2stdXNlci5qcyIoKSB7CiAgICBCb29rVXNlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEzYTMgMyAwIDEgMC02IDAiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk00IDE5LjV2LTE1QTIuNSAyLjUgMCAwIDEgNi41IDJIMTlhMSAxIDAgMCAxIDEgMXYxOGExIDEgMCAwIDEtMSAxSDYuNWExIDEgMCAwIDEgMC01SDIwIiB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICI4IiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLXguanMKdmFyIEJvb2tYOwp2YXIgaW5pdF9ib29rX3ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2steC5qcyIoKSB7CiAgICBCb29rWCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0LjUgNy01IDUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk00IDE5LjV2LTE1QTIuNSAyLjUgMCAwIDEgNi41IDJIMTlhMSAxIDAgMCAxIDEgMXYxOGExIDEgMCAwIDEtMSAxSDYuNWExIDEgMCAwIDEgMC01SDIwIiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05LjUgNyA1IDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLmpzCnZhciBCb29rOwp2YXIgaW5pdF9ib29rID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLmpzIigpIHsKICAgIEJvb2sgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTQgMTkuNXYtMTVBMi41IDIuNSAwIDAgMSA2LjUgMkgxOWExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDFINi41YTEgMSAwIDAgMSAwLTVIMjAiIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9va21hcmstY2hlY2suanMKdmFyIEJvb2ttYXJrQ2hlY2s7CnZhciBpbml0X2Jvb2ttYXJrX2NoZWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rbWFyay1jaGVjay5qcyIoKSB7CiAgICBCb29rbWFya0NoZWNrID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTcgM2EyIDIgMCAwIDEgMiAydjE1YTEgMSAwIDAgMS0xLjQ5Ni44NjhsLTQuNTEyLTIuNTc4YTIgMiAwIDAgMC0xLjk4NCAwbC00LjUxMiAyLjU3OEExIDEgMCAwIDEgNSAyMFY1YTIgMiAwIDAgMSAyLTJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTAgMiAyIDQtNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2ttYXJrLW1pbnVzLmpzCnZhciBCb29rbWFya01pbnVzOwp2YXIgaW5pdF9ib29rbWFya19taW51cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9va21hcmstbWludXMuanMiKCkgewogICAgQm9va21hcmtNaW51cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEwSDkiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTcgM2EyIDIgMCAwIDEgMiAydjE1YTEgMSAwIDAgMS0xLjQ5Ni44NjhsLTQuNTEyLTIuNTc4YTIgMiAwIDAgMC0xLjk4NCAwbC00LjUxMiAyLjU3OEExIDEgMCAwIDEgNSAyMFY1YTIgMiAwIDAgMSAyLTJ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9va21hcmstcGx1cy5qcwp2YXIgQm9va21hcmtQbHVzOwp2YXIgaW5pdF9ib29rbWFya19wbHVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rbWFyay1wbHVzLmpzIigpIHsKICAgIEJvb2ttYXJrUGx1cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxMEg5IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE3IDNhMiAyIDAgMCAxIDIgMnYxNWExIDEgMCAwIDEtMS40OTYuODY4bC00LjUxMi0yLjU3OGEyIDIgMCAwIDAtMS45ODQgMGwtNC41MTIgMi41NzhBMSAxIDAgMCAxIDUgMjBWNWEyIDIgMCAwIDEgMi0yeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2ttYXJrLXguanMKdmFyIEJvb2ttYXJrWDsKdmFyIGluaXRfYm9va21hcmtfeCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9va21hcmsteC5qcyIoKSB7CiAgICBCb29rbWFya1ggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC41IDcuNS01IDUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTcgM2EyIDIgMCAwIDEgMiAydjE1YTEgMSAwIDAgMS0xLjQ5Ni44NjhsLTQuNTEyLTIuNTc4YTIgMiAwIDAgMC0xLjk4NCAwbC00LjUxMiAyLjU3OEExIDEgMCAwIDEgNSAyMFY1YTIgMiAwIDAgMSAyLTJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkuNSA3LjUgNSA1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9va21hcmsuanMKdmFyIEJvb2ttYXJrOwp2YXIgaW5pdF9ib29rbWFyayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9va21hcmsuanMiKCkgewogICAgQm9va21hcmsgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNyAzYTIgMiAwIDAgMSAyIDJ2MTVhMSAxIDAgMCAxLTEuNDk2Ljg2OGwtNC41MTItMi41NzhhMiAyIDAgMCAwLTEuOTg0IDBsLTQuNTEyIDIuNTc4QTEgMSAwIDAgMSA1IDIwVjVhMiAyIDAgMCAxIDItMnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29tLWJveC5qcwp2YXIgQm9vbUJveDsKdmFyIGluaXRfYm9vbV9ib3ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb20tYm94LmpzIigpIHsKICAgIEJvb21Cb3ggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDlWNWEyIDIgMCAwIDEgMi0yaDEyYTIgMiAwIDAgMSAyIDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDh2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA4djEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgOHYxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTIiLCB4OiAiMiIsIHk6ICI5Iiwgcng6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOCIsIGN5OiAiMTUiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE2IiwgY3k6ICIxNSIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm90LW1lc3NhZ2Utc3F1YXJlLmpzCnZhciBCb3RNZXNzYWdlU3F1YXJlOwp2YXIgaW5pdF9ib3RfbWVzc2FnZV9zcXVhcmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JvdC1tZXNzYWdlLXNxdWFyZS5qcyIoKSB7CiAgICBCb3RNZXNzYWdlU3F1YXJlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNlYySDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTF2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEyaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTJoMiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAxNmEyIDIgMCAwIDEtMiAySDguODI4YTIgMiAwIDAgMC0xLjQxNC41ODZsLTIuMjAyIDIuMjAyQS43MS43MSAwIDAgMSA0IDIwLjI4NlY4YTIgMiAwIDAgMSAyLTJoMTJhMiAyIDAgMCAxIDIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMXYyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYm90LW9mZi5qcwp2YXIgQm90T2ZmOwp2YXIgaW5pdF9ib3Rfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib3Qtb2ZmLmpzIigpIHsKICAgIEJvdE9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjY3IDhIMThhMiAyIDAgMCAxIDIgMnY0LjMzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTRoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxNGgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDIyIDIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDhINmEyIDIgMCAwIDAtMiAydjhhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMS40MTQtLjU4NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDEzdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS42NyA0SDEydjIuMzMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib3QuanMKdmFyIEJvdDsKdmFyIGluaXRfYm90ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib3QuanMiKCkgewogICAgQm90ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOFY0SDgiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTYiLCBoZWlnaHQ6ICIxMiIsIHg6ICI0IiwgeTogIjgiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxNGgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE0aDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTN2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDEzdjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib3ctYXJyb3cuanMKdmFyIEJvd0Fycm93Owp2YXIgaW5pdF9ib3dfYXJyb3cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvdy1hcnJvdy5qcyIoKSB7CiAgICBCb3dBcnJvdyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDNoNHY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4LjU3NSAxMS4wODJhMTMgMTMgMCAwIDEgMS4wNDggOS4wMjcgMS4xNyAxLjE3IDAgMCAxLTEuOTE0LjU5N0wxNCAxNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEwIDMuMjkgNi4yOWExLjE3IDEuMTcgMCAwIDEgLjYtMS45MSAxMyAxMyAwIDAgMSA5LjAzIDEuMDUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNyAxNGExLjcgMS43IDAgMCAwLTEuMjA3LjVsLTIuNjQ2IDIuNjQ2QS41LjUgMCAwIDAgMy41IDE4SDVhMSAxIDAgMCAxIDEgMXYxLjVhLjUuNSAwIDAgMCAuODU0LjM1NEw5LjUgMTguMjA3QTEuNyAxLjcgMCAwIDAgMTAgMTd2LTJhMSAxIDAgMCAwLTEtMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS43MDcgMTQuMjkzIDIxIDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib3R0bGUtd2luZS5qcwp2YXIgQm90dGxlV2luZTsKdmFyIGluaXRfYm90dGxlX3dpbmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JvdHRsZS13aW5lLmpzIigpIHsKICAgIEJvdHRsZVdpbmUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMCAzYTEgMSAwIDAgMSAxLTFoMmExIDEgMCAwIDEgMSAxdjJhNiA2IDAgMCAwIDEuMiAzLjZsLjYuOEE2IDYgMCAwIDEgMTcgMTN2OGExIDEgMCAwIDEtMSAxSDhhMSAxIDAgMCAxLTEtMXYtOGE2IDYgMCAwIDEgMS4yLTMuNmwuNi0uOEE2IDYgMCAwIDAgMTAgNXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTNoLTRhMSAxIDAgMCAwLTEgMXYzYTEgMSAwIDAgMCAxIDFoNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JveC5qcwp2YXIgQm94Owp2YXIgaW5pdF9ib3ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JveC5qcyIoKSB7CiAgICBCb3ggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMSA4YTIgMiAwIDAgMC0xLTEuNzNsLTctNGEyIDIgMCAwIDAtMiAwbC03IDRBMiAyIDAgMCAwIDMgOHY4YTIgMiAwIDAgMCAxIDEuNzNsNyA0YTIgMiAwIDAgMCAyIDBsNy00QTIgMiAwIDAgMCAyMSAxNloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMy4zIDcgOC43IDUgOC43LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjJWMTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib3hlcy5qcwp2YXIgQm94ZXM7CnZhciBpbml0X2JveGVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib3hlcy5qcyIoKSB7CiAgICBCb3hlcyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuOTcgMTIuOTJBMiAyIDAgMCAwIDIgMTQuNjN2My4yNGEyIDIgMCAwIDAgLjk3IDEuNzFsMyAxLjhhMiAyIDAgMCAwIDIuMDYgMEwxMiAxOXYtNS41bC01LTMtNC4wMyAyLjQyWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03IDE2LjUtNC43NC0yLjg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMTYuNSA1LTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxNi41djUuMTciIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTIgMTMuNVYxOWwzLjk3IDIuMzhhMiAyIDAgMCAwIDIuMDYgMGwzLTEuOGEyIDIgMCAwIDAgLjk3LTEuNzF2LTMuMjRhMiAyIDAgMCAwLS45Ny0xLjcxTDE3IDEwLjVsLTUgM1oiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMTYuNS01LTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMTYuNSA0Ljc0LTIuODUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTYuNXY1LjE3IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTcuOTcgNC40MkEyIDIgMCAwIDAgNyA2LjEzdjQuMzdsNSAzIDUtM1Y2LjEzYTIgMiAwIDAgMC0uOTctMS43MWwtMy0xLjhhMiAyIDAgMCAwLTIuMDYgMGwtMyAxLjhaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDggNy4yNiA1LjE1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDggNC43NC0yLjg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEzLjVWOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JyYWNlcy5qcwp2YXIgQnJhY2VzOwp2YXIgaW5pdF9icmFjZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JyYWNlcy5qcyIoKSB7CiAgICBCcmFjZXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDNIN2EyIDIgMCAwIDAtMiAydjVhMiAyIDAgMCAxLTIgMiAyIDIgMCAwIDEgMiAydjVjMCAxLjEuOSAyIDIgMmgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDIxaDFhMiAyIDAgMCAwIDItMnYtNWMwLTEuMS45LTIgMi0yYTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDAtMi0yaC0xIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYnJhY2tldHMuanMKdmFyIEJyYWNrZXRzOwp2YXIgaW5pdF9icmFja2V0cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYnJhY2tldHMuanMiKCkgewogICAgQnJhY2tldHMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAzaDNhMSAxIDAgMCAxIDEgMXYxNmExIDEgMCAwIDEtMSAxaC0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjFINWExIDEgMCAwIDEtMS0xVjRhMSAxIDAgMCAxIDEtMWgzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYnJhaW4tY2lyY3VpdC5qcwp2YXIgQnJhaW5DaXJjdWl0Owp2YXIgaW5pdF9icmFpbl9jaXJjdWl0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9icmFpbi1jaXJjdWl0LmpzIigpIHsKICAgIEJyYWluQ2lyY3VpdCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTIgNWEzIDMgMCAxIDAtNS45OTcuMTI1IDQgNCAwIDAgMC0yLjUyNiA1Ljc3IDQgNCAwIDAgMCAuNTU2IDYuNTg4QTQgNCAwIDEgMCAxMiAxOFoiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTNhNC41IDQuNSAwIDAgMCAzLTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi4wMDMgNS4xMjVBMyAzIDAgMCAwIDYuNDAxIDYuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zLjQ3NyAxMC44OTZhNCA0IDAgMCAxIC41ODUtLjM5NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE4YTQgNCAwIDAgMS0xLjk2Ny0uNTE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEzaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMThoNmEyIDIgMCAwIDEgMiAydjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOGg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDhWNWEyIDIgMCAwIDEgMi0yIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYiLCBjeTogIjEzIiwgcjogIi41IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjMiLCByOiAiLjUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIyMCIsIGN5OiAiMjEiLCByOiAiLjUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIyMCIsIGN5OiAiOCIsIHI6ICIuNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JyYWluLmpzCnZhciBCcmFpbjsKdmFyIGluaXRfYnJhaW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JyYWluLmpzIigpIHsKICAgIEJyYWluID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMThWNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxM2E0LjE3IDQuMTcgMCAwIDEtMy00IDQuMTcgNC4xNyAwIDAgMS0zIDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuNTk4IDYuNUEzIDMgMCAxIDAgMTIgNWEzIDMgMCAxIDAtNS41OTggMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3Ljk5NyA1LjEyNWE0IDQgMCAwIDEgMi41MjYgNS43NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxOGE0IDQgMCAwIDAgMi03LjQ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOS45NjcgMTcuNDgzQTQgNCAwIDEgMSAxMiAxOGE0IDQgMCAxIDEtNy45NjctLjUxNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE4YTQgNCAwIDAgMS0yLTcuNDY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMDAzIDUuMTI1YTQgNCAwIDAgMC0yLjUyNiA1Ljc3IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYnJhaW4tY29nLmpzCnZhciBCcmFpbkNvZzsKdmFyIGluaXRfYnJhaW5fY29nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9icmFpbi1jb2cuanMiKCkgewogICAgQnJhaW5Db2cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMC44NTIgMTQuNzcyLS4zODMuOTIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEwLjg1MiA5LjIyOC0uMzgzLS45MjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMuMTQ4IDE0Ljc3Mi4zODIuOTI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEzLjUzMSA4LjMwNS0uMzgzLjkyMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC43NzIgMTAuODUyLjkyMy0uMzgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0Ljc3MiAxMy4xNDguOTIzLjM4MyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNy41OTggNi41QTMgMyAwIDEgMCAxMiA1YTMgMyAwIDAgMC01LjYzLTEuNDQ2IDMgMyAwIDAgMC0uMzY4IDEuNTcxIDQgNCAwIDAgMC0yLjUyNSA1Ljc3MSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy45OTggNS4xMjVhNCA0IDAgMCAxIDIuNTI1IDUuNzcxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5LjUwNSAxMC4yOTRhNCA0IDAgMCAxLTEuNSA3LjcwNiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTQuMDMyIDE3LjQ4M0E0IDQgMCAwIDAgMTEuNDY0IDIwYy4xOC0uMzExLjg5Mi0uMzExIDEuMDcyIDBhNCA0IDAgMCAwIDcuNDMyLTIuNTE2IiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00LjUgMTAuMjkxQTQgNCAwIDAgMCA2IDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMDAyIDUuMTI1YTMgMyAwIDAgMCAuNCAxLjM3NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05LjIyOCAxMC44NTItLjkyMy0uMzgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkuMjI4IDEzLjE0OC0uOTIzLjM4MyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYnJpY2std2FsbC1maXJlLmpzCnZhciBCcmlja1dhbGxGaXJlOwp2YXIgaW5pdF9icmlja193YWxsX2ZpcmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JyaWNrLXdhbGwtZmlyZS5qcyIoKSB7CiAgICBCcmlja1dhbGxGaXJlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgM3YyLjEwNyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNyA5YzEgMyAyLjUgMy41IDMuNSA0LjVBNSA1IDAgMCAxIDIyIDE3YTUgNSAwIDAgMS0xMCAwYzAtLjMgMC0uNi4xLS45YTIgMiAwIDEgMCAzLjMtMkMxMyAxMS41IDE2IDkgMTcgOSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA4LjI3NFY1YTIgMiAwIDAgMC0yLTJINWEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoMy45MzgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxNWg1LjI1MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDloOC4yMjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNXY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggM3Y2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYnJpY2std2FsbC1zaGllbGQuanMKdmFyIEJyaWNrV2FsbFNoaWVsZDsKdmFyIGluaXRfYnJpY2tfd2FsbF9zaGllbGQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JyaWNrLXdhbGwtc2hpZWxkLmpzIigpIHsKICAgIEJyaWNrV2FsbFNoaWVsZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDl2MS4yNTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgM3Y1LjQ2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDkuMTE4VjVhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg1Ljc1IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIyIDE3LjVjMCAyLjQ5OS0xLjc1IDMuNzQ5LTMuODMgNC40NzRhLjUuNSAwIDAgMS0uMzM1LS4wMDVjLTIuMDg1LS43Mi0zLjgzNS0xLjk3LTMuODM1LTQuNDdWMTRhLjUuNSAwIDAgMSAuNS0uNDk5YzEgMCAyLjI1LS42IDMuMTItMS4zNmEuNi42IDAgMCAxIC43Ni0uMDAxYy44NzUuNzY1IDIuMTIgMS4zNiAzLjEyIDEuMzZhLjUuNSAwIDAgMSAuNS41eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE1aDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA5aDEyLjE0MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE1djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAzdjYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9icmljay13YWxsLmpzCnZhciBCcmlja1dhbGw7CnZhciBpbml0X2JyaWNrX3dhbGwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JyaWNrLXdhbGwuanMiKCkgewogICAgQnJpY2tXYWxsID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOXY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE1djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgM3Y2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTVoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA5aDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTV2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDN2NiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JyaWVmY2FzZS1idXNpbmVzcy5qcwp2YXIgQnJpZWZjYXNlQnVzaW5lc3M7CnZhciBpbml0X2JyaWVmY2FzZV9idXNpbmVzcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYnJpZWZjYXNlLWJ1c2luZXNzLmpzIigpIHsKICAgIEJyaWVmY2FzZUJ1c2luZXNzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDZWNGEyIDIgMCAwIDAtMi0yaC00YTIgMiAwIDAgMC0yIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxM2ExOC4xNSAxOC4xNSAwIDAgMS0yMCAwIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTQiLCB4OiAiMiIsIHk6ICI2Iiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYnJpZWZjYXNlLWNvbnZleW9yLWJlbHQuanMKdmFyIEJyaWVmY2FzZUNvbnZleW9yQmVsdDsKdmFyIGluaXRfYnJpZWZjYXNlX2NvbnZleW9yX2JlbHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JyaWVmY2FzZS1jb252ZXlvci1iZWx0LmpzIigpIHsKICAgIEJyaWVmY2FzZUNvbnZleW9yQmVsdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDIwdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjB2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAyMHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDIwSDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAyMHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTZWNGEyIDIgMCAwIDEgMi0yaDRhMiAyIDAgMCAxIDIgMnYxMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjQiLCB5OiAiNiIsIHdpZHRoOiAiMTYiLCBoZWlnaHQ6ICIxMCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JyaWVmY2FzZS1tZWRpY2FsLmpzCnZhciBCcmllZmNhc2VNZWRpY2FsOwp2YXIgaW5pdF9icmllZmNhc2VfbWVkaWNhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYnJpZWZjYXNlLW1lZGljYWwuanMiKCkgewogICAgQnJpZWZjYXNlTWVkaWNhbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDExdjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTNoLTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNlY0YTIgMiAwIDAgMC0yLTJoLTRhMiAyIDAgMCAwLTIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDZ2MTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA2djE0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTQiLCB4OiAiMiIsIHk6ICI2Iiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYnJpZWZjYXNlLmpzCnZhciBCcmllZmNhc2U7CnZhciBpbml0X2JyaWVmY2FzZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYnJpZWZjYXNlLmpzIigpIHsKICAgIEJyaWVmY2FzZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDIwVjRhMiAyIDAgMCAwLTItMmgtNGEyIDIgMCAwIDAtMiAydjE2IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTQiLCB4OiAiMiIsIHk6ICI2Iiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYnJpbmctdG8tZnJvbnQuanMKdmFyIEJyaW5nVG9Gcm9udDsKdmFyIGluaXRfYnJpbmdfdG9fZnJvbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JyaW5nLXRvLWZyb250LmpzIigpIHsKICAgIEJyaW5nVG9Gcm9udCA9IFsKICAgICAgWyJyZWN0IiwgeyB4OiAiOCIsIHk6ICI4Iiwgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiOCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEwYTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDRhMiAyIDAgMCAxIDIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAyMGEyIDIgMCAwIDAgMiAyaDRhMiAyIDAgMCAwIDItMnYtNGEyIDIgMCAwIDAtMi0yIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYnJ1c2gtY2xlYW5pbmcuanMKdmFyIEJydXNoQ2xlYW5pbmc7CnZhciBpbml0X2JydXNoX2NsZWFuaW5nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9icnVzaC1jbGVhbmluZy5qcyIoKSB7CiAgICBCcnVzaENsZWFuaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMjItMS00IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE5IDE0YTEgMSAwIDAgMCAxLTF2LTFhMiAyIDAgMCAwLTItMmgtM2ExIDEgMCAwIDEtMS0xVjRhMiAyIDAgMCAwLTQgMHY1YTEgMSAwIDAgMS0xIDFINmEyIDIgMCAwIDAtMiAydjFhMSAxIDAgMCAwIDEgMSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxNEg1bC0xLjk3MyA2Ljc2N0ExIDEgMCAwIDAgNCAyMmgxNmExIDEgMCAwIDAgLjk3My0xLjIzM3oiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAyMiAxLTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9icnVzaC5qcwp2YXIgQnJ1c2g7CnZhciBpbml0X2JydXNoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9icnVzaC5qcyIoKSB7CiAgICBCcnVzaCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTExIDEwIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjUgMjFBMy41IDMuNSAwIDEgMCAzIDE3LjVhMi42MiAyLjYyIDAgMCAxLS43MDggMS43OTJBMSAxIDAgMCAwIDMgMjF6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuOTY5IDE3LjAzMSAyMS4zNzggNS42MjRhMSAxIDAgMCAwLTMuMDAyLTMuMDAyTDYuOTY3IDE0LjAzMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2J1Zy1vZmYuanMKdmFyIEJ1Z09mZjsKdmFyIGluaXRfYnVnX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYnVnLW9mZi5qcyIoKSB7CiAgICBCdWdPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMHYtOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMi42NTYgN0gxNGE0IDQgMCAwIDEgNCA0djEuMzQ0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0LjEyIDMuODggMTYgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy4xMjMgMTcuMTIzQTYgNiAwIDAgMSA2IDE0di0zYTQgNCAwIDAgMSAxLjcyLTMuMjg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA1YTQgNCAwIDAgMS0zLjU1IDMuOTciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTNoLTMuMzQ0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMjFhNCA0IDAgMCAxIDMuODEtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDVhNCA0IDAgMCAwIDMuNTUgMy45NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEzSDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAyIDEuODggMS44OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjcxMiA0LjA2QTMgMyAwIDAgMSAxNSA2djEuMTMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9idWJibGVzLmpzCnZhciBCdWJibGVzOwp2YXIgaW5pdF9idWJibGVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9idWJibGVzLmpzIigpIHsKICAgIEJ1YmJsZXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk03LjAwMSAxNS4wODVBMS41IDEuNSAwIDAgMSA5IDE2LjUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOC41IiwgY3k6ICI4LjUiLCByOiAiMy41IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNy41IiwgY3k6ICIxNi41IiwgcjogIjUuNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjcuNSIsIGN5OiAiNC41IiwgcjogIjIuNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2J1Zy1wbGF5LmpzCnZhciBCdWdQbGF5Owp2YXIgaW5pdF9idWdfcGxheSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYnVnLXBsYXkuanMiKCkgewogICAgQnVnUGxheSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE5LjY1NUE2IDYgMCAwIDEgNiAxNHYtM2E0IDQgMCAwIDEgNC00aDRhNCA0IDAgMCAxIDQgMy45NyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNCAxNS4wMDNhMSAxIDAgMCAxIDEuNTE3LS44NTlsNC45OTcgMi45OTdhMSAxIDAgMCAxIDAgMS43MThsLTQuOTk3IDIuOTk3YTEgMSAwIDAgMS0xLjUxNy0uODZ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0LjEyIDMuODggMTYgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA1YTQgNCAwIDAgMS0zLjU1IDMuOTciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAyMWE0IDQgMCAwIDEgMy44MS00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgNWE0IDQgMCAwIDAgMy41NSAzLjk3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTNIMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDIgMS44OCAxLjg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgNy4xM1Y2YTMgMyAwIDEgMSA2IDB2MS4xMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2J1Zy5qcwp2YXIgQnVnOwp2YXIgaW5pdF9idWcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2J1Zy5qcyIoKSB7CiAgICBCdWcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMHYtOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA3YTQgNCAwIDAgMSA0IDR2M2E2IDYgMCAwIDEtMTIgMHYtM2E0IDQgMCAwIDEgNC00eiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNC4xMiAzLjg4IDE2IDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMjFhNCA0IDAgMCAwLTMuODEtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA1YTQgNCAwIDAgMS0zLjU1IDMuOTciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTNoLTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAyMWE0IDQgMCAwIDEgMy44MS00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgNWE0IDQgMCAwIDAgMy41NSAzLjk3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTNIMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDIgMS44OCAxLjg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgNy4xM1Y2YTMgMyAwIDEgMSA2IDB2MS4xMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2J1aWxkaW5nLTIuanMKdmFyIEJ1aWxkaW5nMjsKdmFyIGluaXRfYnVpbGRpbmdfMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYnVpbGRpbmctMi5qcyIoKSB7CiAgICBCdWlsZGluZzIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMmg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDhoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAyMXYtM2EyIDIgMCAwIDAtNCAwdjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxMEg0YTIgMiAwIDAgMC0yIDJ2N2EyIDIgMCAwIDAgMiAyaDE2YTIgMiAwIDAgMCAyLTJWOWEyIDIgMCAwIDAtMi0yaC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMjFWNWEyIDIgMCAwIDEgMi0yaDhhMiAyIDAgMCAxIDIgMnYxNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2J1aWxkaW5nLmpzCnZhciBCdWlsZGluZzsKdmFyIGluaXRfYnVpbGRpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2J1aWxkaW5nLmpzIigpIHsKICAgIEJ1aWxkaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTBoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE0aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTRoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDZoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTBoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTRoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggNmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAyMnYtM2ExIDEgMCAwIDEgMS0xaDRhMSAxIDAgMCAxIDEgMXYzIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiNCIsIHk6ICIyIiwgd2lkdGg6ICIxNiIsIGhlaWdodDogIjIwIiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvYnVzLWZyb250LmpzCnZhciBCdXNGcm9udDsKdmFyIGluaXRfYnVzX2Zyb250ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9idXMtZnJvbnQuanMiKCkgewogICAgQnVzRnJvbnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDYgMiA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDZoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiA3LTItMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNiIsIGhlaWdodDogIjE2IiwgeDogIjQiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDExaDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTVoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE1aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE5djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMjF2LTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9idXMuanMKdmFyIEJ1czsKdmFyIGluaXRfYnVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9idXMuanMiKCkgewogICAgQnVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA2djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgNnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJoMTkuNiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOCAxOGgzcy41LTEuNy44LTIuOGMuMS0uNC4yLS44LjItMS4yIDAtLjQtLjEtLjgtLjItMS4ybC0xLjQtNUMyMC4xIDYuOCAxOS4xIDYgMTggNkg0YTIgMiAwIDAgMC0yIDJ2MTBoMyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjciLCBjeTogIjE4IiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxOGg1IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYiLCBjeTogIjE4IiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWJsZS1jYXIuanMKdmFyIENhYmxlQ2FyOwp2YXIgaW5pdF9jYWJsZV9jYXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhYmxlLWNhci5qcyIoKSB7CiAgICBDYWJsZUNhciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDNoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgOSAyMC01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEyVjYuNSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNiIsIGhlaWdodDogIjEwIiwgeDogIjQiLCB5OiAiMTIiLCByeDogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMnY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEydjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxN2gxNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhYmxlLmpzCnZhciBDYWJsZTsKdmFyIGluaXRfY2FibGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhYmxlLmpzIigpIHsKICAgIENhYmxlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTlhMSAxIDAgMCAxLTEtMXYtMmEyIDIgMCAwIDEgMi0yaDJhMiAyIDAgMCAxIDIgMnYyYTEgMSAwIDAgMS0xIDF6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDIxdi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE0VjYuNWExIDEgMCAwIDAtNyAwdjExYTEgMSAwIDAgMS03IDBWMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMjF2LTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA1VjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMGEyIDIgMCAwIDEtMi0yVjZhMSAxIDAgMCAxIDEtMWg0YTEgMSAwIDAgMSAxIDF2MmEyIDIgMCAwIDEtMiAyeiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDVWMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nha2Utc2xpY2UuanMKdmFyIENha2VTbGljZTsKdmFyIGluaXRfY2FrZV9zbGljZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FrZS1zbGljZS5qcyIoKSB7CiAgICBDYWtlU2xpY2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxM0gzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE3SDMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtNy4yIDcuOS0zLjM4OCAyLjVBMiAyIDAgMCAwIDMgMTIuMDFWMjBhMSAxIDAgMCAwIDEgMWgxNmExIDEgMCAwIDAgMS0xdi04LjY1NGMwLTItMi40NC02LjAyNi02LjQ0LTguMDI2YTEgMSAwIDAgMC0xLjA4Mi4wNTdMMTAuNCA1LjYiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICI3IiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWtlLmpzCnZhciBDYWtlOwp2YXIgaW5pdF9jYWtlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWtlLmpzIigpIHsKICAgIENha2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAyMXYtOGEyIDIgMCAwIDAtMi0ySDZhMiAyIDAgMCAwLTIgMnY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTZzLjUtMSAyLTEgMi41IDIgNCAyIDIuNS0yIDQtMiAyLjUgMiA0IDIgMi0xIDItMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIxaDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgOHYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDh2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyA4djMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyA0aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA0aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyA0aC4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGN1bGF0b3IuanMKdmFyIENhbGN1bGF0b3I7CnZhciBpbml0X2NhbGN1bGF0b3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGN1bGF0b3IuanMiKCkgewogICAgQ2FsY3VsYXRvciA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE2IiwgaGVpZ2h0OiAiMjAiLCB4OiAiNCIsIHk6ICIyIiwgcng6ICIyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjgiLCB4MjogIjE2IiwgeTE6ICI2IiwgeTI6ICI2IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE2IiwgeDI6ICIxNiIsIHkxOiAiMTQiLCB5MjogIjE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEwaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTRoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTRoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE4aC4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLTEuanMKdmFyIENhbGVuZGFyMTsKdmFyIGluaXRfY2FsZW5kYXJfMSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXItMS5qcyIoKSB7CiAgICBDYWxlbmRhcjEgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxNGgxdjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTBoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAydjQiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIzIiwgeTogIjQiLCB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWxlbmRhci1hcnJvdy1kb3duLmpzCnZhciBDYWxlbmRhckFycm93RG93bjsKdmFyIGluaXRfY2FsZW5kYXJfYXJyb3dfZG93biA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXItYXJyb3ctZG93bi5qcyIoKSB7CiAgICBDYWxlbmRhckFycm93RG93biA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDE4IDQgNCA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE0djgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTEuMzU0VjZhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg3LjM0MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEwaDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMnY0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXItYXJyb3ctdXAuanMKdmFyIENhbGVuZGFyQXJyb3dVcDsKdmFyIGluaXRfY2FsZW5kYXJfYXJyb3dfdXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLWFycm93LXVwLmpzIigpIHsKICAgIENhbGVuZGFyQXJyb3dVcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDE4IDQtNCA0IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDIydi04IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDExLjM0M1Y2YTIgMiAwIDAgMC0yLTJINWEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEwaDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMnY0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXItY2hlY2stMi5qcwp2YXIgQ2FsZW5kYXJDaGVjazI7CnZhciBpbml0X2NhbGVuZGFyX2NoZWNrXzIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLWNoZWNrLTIuanMiKCkgewogICAgQ2FsZW5kYXJDaGVjazIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTRWNmEyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAyMCAyIDIgNC00IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXItY2hlY2suanMKdmFyIENhbGVuZGFyQ2hlY2s7CnZhciBpbml0X2NhbGVuZGFyX2NoZWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWxlbmRhci1jaGVjay5qcyIoKSB7CiAgICBDYWxlbmRhckNoZWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICI0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTBoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxNiAyIDIgNC00IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXItY2xvY2suanMKdmFyIENhbGVuZGFyQ2xvY2s7CnZhciBpbml0X2NhbGVuZGFyX2Nsb2NrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWxlbmRhci1jbG9jay5qcyIoKSB7CiAgICBDYWxlbmRhckNsb2NrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTR2Mi4ybDEuNiAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA3LjVWNmEyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDMuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEwaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAydjQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNiIsIGN5OiAiMTYiLCByOiAiNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLWNvZy5qcwp2YXIgQ2FsZW5kYXJDb2c7CnZhciBpbml0X2NhbGVuZGFyX2NvZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXItY29nLmpzIigpIHsKICAgIENhbGVuZGFyQ29nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUuMjI4IDE2Ljg1Mi0uOTIzLS4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUuMjI4IDE5LjE0OC0uOTIzLjM4MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYuNDcgMTQuMzA1LjM4Mi45MjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYuODUyIDIwLjc3Mi0uMzgzLjkyNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOS4xNDggMTUuMjI4LjM4My0uOTIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5LjUzIDIxLjY5Ni0uMzgyLS45MjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAuNzcyIDE2Ljg1Mi45MjQtLjM4MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMC43NzIgMTkuMTQ4LjkyNC4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTAuNTkyVjZhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTBoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAydjQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiMTgiLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLWRheXMuanMKdmFyIENhbGVuZGFyRGF5czsKdmFyIGluaXRfY2FsZW5kYXJfZGF5cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXItZGF5cy5qcyIoKSB7CiAgICBDYWxlbmRhckRheXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjQiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjQiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE0aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTRoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMThoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxOGguMDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWxlbmRhci1mb2xkLmpzCnZhciBDYWxlbmRhckZvbGQ7CnZhciBpbml0X2NhbGVuZGFyX2ZvbGQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLWZvbGQuanMiKCkgewogICAgQ2FsZW5kYXJGb2xkID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMyAyMGEyIDIgMCAwIDAgMiAyaDEwYTIuNCAyLjQgMCAwIDAgMS43MDYtLjcwNmwzLjU4OC0zLjU4OEEyLjQgMi40IDAgMCAwIDIxIDE2VjZhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDIydi01YTEgMSAwIDAgMSAxLTFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGgxOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLWhlYXJ0LmpzCnZhciBDYWxlbmRhckhlYXJ0Owp2YXIgaW5pdF9jYWxlbmRhcl9oZWFydCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXItaGVhcnQuanMiKCkgewogICAgQ2FsZW5kYXJIZWFydCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyLjEyNyAyMkg1YTIgMiAwIDAgMS0yLTJWNmEyIDIgMCAwIDEgMi0yaDE0YTIgMiAwIDAgMSAyIDJ2NS4xMjUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTQuNjIgMTguOEEyLjI1IDIuMjUgMCAxIDEgMTggMTUuODM2YTIuMjUgMi4yNSAwIDEgMSAzLjM4IDIuOTY2bC0yLjYyNiAyLjg1NmEuOTk4Ljk5OCAwIDAgMS0xLjUwNyAweiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2NCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLW1pbnVzLTIuanMKdmFyIENhbGVuZGFyTWludXMyOwp2YXIgaW5pdF9jYWxlbmRhcl9taW51c18yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWxlbmRhci1taW51cy0yLmpzIigpIHsKICAgIENhbGVuZGFyTWludXMyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICI0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTBoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTZoNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLW1pbnVzLmpzCnZhciBDYWxlbmRhck1pbnVzOwp2YXIgaW5pdF9jYWxlbmRhcl9taW51cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXItbWludXMuanMiKCkgewogICAgQ2FsZW5kYXJNaW51cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE5aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE1VjZhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg4LjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2NCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLW9mZi5qcwp2YXIgQ2FsZW5kYXJPZmY7CnZhciBpbml0X2NhbGVuZGFyX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXItb2ZmLmpzIigpIHsKICAgIENhbGVuZGFyT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNC4yIDQuMkEyIDIgMCAwIDAgMyA2djE0YTIgMiAwIDAgMCAyIDJoMTRhMiAyIDAgMCAwIDEuODItMS4xOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNS41VjZhMiAyIDAgMCAwLTItMkg5LjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTBoNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMGgtNS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLXBsdXMtMi5qcwp2YXIgQ2FsZW5kYXJQbHVzMjsKdmFyIGluaXRfY2FsZW5kYXJfcGx1c18yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWxlbmRhci1wbHVzLTIuanMiKCkgewogICAgQ2FsZW5kYXJQbHVzMiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDJ2NCIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiNCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEwaDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE2aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTR2NCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLXBsdXMuanMKdmFyIENhbGVuZGFyUGx1czsKdmFyIGluaXRfY2FsZW5kYXJfcGx1cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXItcGx1cy5qcyIoKSB7CiAgICBDYWxlbmRhclBsdXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxOWg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxNnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEyLjU5OFY2YTIgMiAwIDAgMC0yLTJINWEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoOC41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTBoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAydjQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWxlbmRhci1yYW5nZS5qcwp2YXIgQ2FsZW5kYXJSYW5nZTsKdmFyIGluaXRfY2FsZW5kYXJfcmFuZ2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLXJhbmdlLmpzIigpIHsKICAgIENhbGVuZGFyUmFuZ2UgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiNCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxNGgtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxOEg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTRoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDE4aC4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLXNlYXJjaC5qcwp2YXIgQ2FsZW5kYXJTZWFyY2g7CnZhciBpbml0X2NhbGVuZGFyX3NlYXJjaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXItc2VhcmNoLmpzIigpIHsKICAgIENhbGVuZGFyU2VhcmNoID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDExLjc1VjZhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg3LjI1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDIyLTEuODc1LTEuODc1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTBoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAydjQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiMTgiLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLXN5bmMuanMKdmFyIENhbGVuZGFyU3luYzsKdmFyIGluaXRfY2FsZW5kYXJfc3luYyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXItc3luYy5qcyIoKSB7CiAgICBDYWxlbmRhclN5bmMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxMHY0aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTEgMTQgMS41MzUtMS42MDVhNSA1IDAgMCAxIDggMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAxOC0xLjUzNSAxLjYwNWE1IDUgMCAwIDEtOC0xLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMjJ2LTRoLTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgOC41VjZhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg0LjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMnY0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXIteC0yLmpzCnZhciBDYWxlbmRhclgyOwp2YXIgaW5pdF9jYWxlbmRhcl94XzIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLXgtMi5qcyIoKSB7CiAgICBDYWxlbmRhclgyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEzVjZhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTBoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMjIgNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDE3IDUgNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLXguanMKdmFyIENhbGVuZGFyWDsKdmFyIGluaXRfY2FsZW5kYXJfeCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXIteC5qcyIoKSB7CiAgICBDYWxlbmRhclggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjQiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjQiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAxNC00IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgMTQgNCA0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXIuanMKdmFyIENhbGVuZGFyOwp2YXIgaW5pdF9jYWxlbmRhciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXIuanMiKCkgewogICAgQ2FsZW5kYXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjQiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjQiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMGgxOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFycy5qcwp2YXIgQ2FsZW5kYXJzOwp2YXIgaW5pdF9jYWxlbmRhcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFycy5qcyIoKSB7CiAgICBDYWxlbmRhcnMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUuNzI2IDIxLjAxQTIgMiAwIDAgMSAxNCAyMkg0YTIgMiAwIDAgMS0yLTJWMTBhMiAyIDAgMCAxIDItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAydjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxM2gyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggOGgxNCIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjgiLCB5OiAiMyIsIHdpZHRoOiAiMTQiLCBoZWlnaHQ6ICIxNCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbWVyYS1vZmYuanMKdmFyIENhbWVyYU9mZjsKdmFyIGluaXRfY2FtZXJhX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FtZXJhLW9mZi5qcyIoKSB7CiAgICBDYW1lcmFPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNC41NjQgMTQuNTU4YTMgMyAwIDEgMS00LjEyMi00LjEyMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMjBINGEyIDIgMCAwIDEtMi0yVjlhMiAyIDAgMCAxIDItMmgxLjk5N2EyIDIgMCAwIDAgLjgxOS0uMTc1IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTkuNjk1IDQuMDI0QTIgMiAwIDAgMSAxMC4wMDQgNGgzLjk5M2EyIDIgMCAwIDEgMS43NiAxLjA1bC40ODYuOUEyIDIgMCAwIDAgMTguMDAzIDdIMjBhMiAyIDAgMCAxIDIgMnY3LjM0NCIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbWVyYS5qcwp2YXIgQ2FtZXJhOwp2YXIgaW5pdF9jYW1lcmEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbWVyYS5qcyIoKSB7CiAgICBDYW1lcmEgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMy45OTcgNGEyIDIgMCAwIDEgMS43NiAxLjA1bC40ODYuOUEyIDIgMCAwIDAgMTguMDAzIDdIMjBhMiAyIDAgMCAxIDIgMnY5YTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjlhMiAyIDAgMCAxIDItMmgxLjk5N2EyIDIgMCAwIDAgMS43NTktMS4wNDhsLjQ4OS0uOTA0QTIgMiAwIDAgMSAxMC4wMDQgNHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTMiLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbmR5LWNhbmUuanMKdmFyIENhbmR5Q2FuZTsKdmFyIGluaXRfY2FuZHlfY2FuZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FuZHktY2FuZS5qcyIoKSB7CiAgICBDYW5keUNhbmUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTUuNyAyMWEyIDIgMCAwIDEtMy41LTJsOC42LTE0YTYgNiAwIDAgMSAxMC40IDYgMiAyIDAgMSAxLTMuNDY0LTIgMiAyIDAgMSAwLTMuNDY0LTJaIiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy43NSA3IDE1IDIuMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC45IDQuOCAxMyA5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcuOSA5LjcgMiA0LjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC45IDE0LjcgNyAxOC45IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FuZHktb2ZmLmpzCnZhciBDYW5keU9mZjsKdmFyIGluaXRfY2FuZHlfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYW5keS1vZmYuanMiKCkgewogICAgQ2FuZHlPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMHY3LjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEuODAyIDYuMTQ1YTUgNSAwIDAgMSA2LjA1MyA2LjA1MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA2LjF2Mi4yNDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUuNSAxNS41NzEtLjk2NC45NjRhNSA1IDAgMCAxLTcuMDcxIDAgNSA1IDAgMCAxIDAtNy4wN2wuOTY0LS45NjUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTYgN1YzYTEgMSAwIDAgMSAxLjcwNy0uNzA3IDIuNSAyLjUgMCAwIDAgMi4xNTIuNzE3IDEgMSAwIDAgMSAxLjEzMSAxLjEzMSAyLjUgMi41IDAgMCAwIC43MTcgMi4xNTJBMSAxIDAgMCAxIDIxIDhoLTQiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTggMTd2NGExIDEgMCAwIDEtMS43MDcuNzA3IDIuNSAyLjUgMCAwIDAtMi4xNTItLjcxNyAxIDEgMCAwIDEtMS4xMzEtMS4xMzEgMi41IDIuNSAwIDAgMC0uNzE3LTIuMTUyQTEgMSAwIDAgMSAzIDE2aDQiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYW5uYWJpcy1vZmYuanMKdmFyIENhbm5hYmlzT2ZmOwp2YXIgaW5pdF9jYW5uYWJpc19vZmYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nhbm5hYmlzLW9mZi5qcyIoKSB7CiAgICBDYW5uYWJpc09mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIydi00YzEuNSAxLjUgMy41IDMgNiAzIDAtMS41LS41LTMuNS0yLTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMuOTg4IDguMzI3QzEzLjkwMiA2LjA1NCAxMy4zNjUgMy44MiAxMiAyYTkuMyA5LjMgMCAwIDAtMS40NDUgMi45IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjM3NSAxMS43MjVDMTguODgyIDEwLjUzIDIxIDcuODQxIDIxIDZjLTIuMzI0IDAtNS4wOCAxLjI5Ni02LjY2MiAyLjY4NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEuMDI0IDE1LjM3OEExNSAxNSAwIDAgMCAyMiAxNWMtLjQyNi0xLjI3OS0yLjY3LTIuNTU3LTQuMjUtMi45MDciIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNi45OTUgNi45OTJDNS43MTQgNi40IDQuMjkgNiAzIDZjMCAyIDIuNSA1IDQgNi0xLjUgMC00LjUgMS41LTUgMyAzLjUgMS41IDYgMSA2IDEtMS41IDEuNS0yIDMuNS0yIDUgMi41IDAgNC41LTEuNSA2LTMiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYW5uYWJpcy5qcwp2YXIgQ2FubmFiaXM7CnZhciBpbml0X2Nhbm5hYmlzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYW5uYWJpcy5qcyIoKSB7CiAgICBDYW5uYWJpcyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIydi00IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTcgMTJjLTEuNSAwLTQuNSAxLjUtNSAzIDMuNSAxLjUgNiAxIDYgMS0xLjUgMS41LTIgMy41LTIgNSAyLjUgMCA0LjUtMS41IDYtMyAxLjUgMS41IDMuNSAzIDYgMyAwLTEuNS0uNS0zLjUtMi01IDAgMCAyLjUuNSA2LTEtLjUtMS41LTMuNS0zLTUtMyAxLjUtMSA0LTQgNC02LTIuNSAwLTUuNSAxLjUtNyAzIDAtMi41LS41LTUtMi03LTEuNSAyLTIgNC41LTIgNy0xLjUtMS41LTQuNS0zLTctMyAwIDIgMi41IDUgNCA2IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FuZHkuanMKdmFyIENhbmR5Owp2YXIgaW5pdF9jYW5keSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FuZHkuanMiKCkgewogICAgQ2FuZHkgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA3djEwLjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgNi4xVjE3IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE2IDdWM2ExIDEgMCAwIDEgMS43MDctLjcwNyAyLjUgMi41IDAgMCAwIDIuMTUyLjcxNyAxIDEgMCAwIDEgMS4xMzEgMS4xMzEgMi41IDIuNSAwIDAgMCAuNzE3IDIuMTUyQTEgMSAwIDAgMSAyMSA4aC00IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE2LjUzNiA3LjQ2NWE1IDUgMCAwIDAtNy4wNzIgMGwtMiAyYTUgNSAwIDAgMCAwIDcuMDcgNSA1IDAgMCAwIDcuMDcyIDBsMi0yYTUgNSAwIDAgMCAwLTcuMDciCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOCAxN3Y0YTEgMSAwIDAgMS0xLjcwNy43MDcgMi41IDIuNSAwIDAgMC0yLjE1Mi0uNzE3IDEgMSAwIDAgMS0xLjEzMS0xLjEzMSAyLjUgMi41IDAgMCAwLS43MTctMi4xNTJBMSAxIDAgMCAxIDMgMTZoNCIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhcHRpb25zLW9mZi5qcwp2YXIgQ2FwdGlvbnNPZmY7CnZhciBpbml0X2NhcHRpb25zX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FwdGlvbnMtb2ZmLmpzIigpIHsKICAgIENhcHRpb25zT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAuNSA1SDE5YTIgMiAwIDAgMSAyIDJ2OC41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDExaC0uNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxOUg1YTIgMiAwIDAgMS0yLTJWN2EyIDIgMCAwIDEgMi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDExaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxNWgyLjUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYXB0aW9ucy5qcwp2YXIgQ2FwdGlvbnM7CnZhciBpbml0X2NhcHRpb25zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYXB0aW9ucy5qcyIoKSB7CiAgICBDYXB0aW9ucyA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTQiLCB4OiAiMyIsIHk6ICI1Iiwgcng6ICIyIiwgcnk6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTVoNE0xNSAxNWgyTTcgMTFoMk0xMyAxMWg0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FyLWZyb250LmpzCnZhciBDYXJGcm9udDsKdmFyIGluaXRfY2FyX2Zyb250ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYXItZnJvbnQuanMiKCkgewogICAgQ2FyRnJvbnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSA4LTIgMi0xLjUtMy43QTIgMiAwIDAgMCAxNS42NDYgNUg4LjRhMiAyIDAgMCAwLTEuOTAzIDEuMjU3TDUgMTAgMyA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTRoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDE0aC4wMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjgiLCB4OiAiMyIsIHk6ICIxMCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE4djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMTh2MiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nhci10YXhpLWZyb250LmpzCnZhciBDYXJUYXhpRnJvbnQ7CnZhciBpbml0X2Nhcl90YXhpX2Zyb250ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYXItdGF4aS1mcm9udC5qcyIoKSB7CiAgICBDYXJUYXhpRnJvbnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAyaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgOC0yIDItMS41LTMuN0EyIDIgMCAwIDAgMTUuNjQ2IDVIOC40YTIgMiAwIDAgMC0xLjkwMyAxLjI1N0w1IDEwIDMgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE0aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxNGguMDEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICI4IiwgeDogIjMiLCB5OiAiMTAiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxOHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE4djIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYXIuanMKdmFyIENhcjsKdmFyIGluaXRfY2FyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYXIuanMiKCkgewogICAgQ2FyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTkgMTdoMmMuNiAwIDEtLjQgMS0xdi0zYzAtLjktLjctMS43LTEuNS0xLjlDMTguNyAxMC42IDE2IDEwIDE2IDEwcy0xLjMtMS40LTIuMi0yLjNjLS41LS40LTEuMS0uNy0xLjgtLjdINWMtLjYgMC0xLjEuNC0xLjQuOWwtMS40IDIuOUEzLjcgMy43IDAgMCAwIDIgMTJ2NGMwIC42LjQgMSAxIDFoMiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjciLCBjeTogIjE3IiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxN2g2IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTciLCBjeTogIjE3IiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYXJhdmFuLmpzCnZhciBDYXJhdmFuOwp2YXIgaW5pdF9jYXJhdmFuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYXJhdmFuLmpzIigpIHsKICAgIENhcmF2YW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxOVY5YTQgNCAwIDAgMC00LTRINmE0IDQgMCAwIDAtNCA0djhhMiAyIDAgMCAwIDIgMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgOWgzYTEgMSAwIDAgMSAxIDF2MmExIDEgMCAwIDEtMSAxSDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTd2MWExIDEgMCAwIDEtMSAxSDEwdi05YTEgMSAwIDAgMSAxLTFoMmExIDEgMCAwIDEgMSAxdjkiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI4IiwgY3k6ICIxOSIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2Fycm90LmpzCnZhciBDYXJyb3Q7CnZhciBpbml0X2NhcnJvdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2Fycm90LmpzIigpIHsKICAgIENhcnJvdCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuMjcgMjEuN3M5Ljg3LTMuNSAxMi43My02LjM2YTQuNSA0LjUgMCAwIDAtNi4zNi02LjM3QzUuNzcgMTEuODQgMi4yNyAyMS43IDIuMjcgMjEuN3pNOC42NCAxNGwtMi4wNS0yLjA0TTE1LjM0IDE1bC0yLjQ2LTIuNDYiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgOXMtMS4zMy0yLTMuNS0yQzE2Ljg2IDcgMTUgOSAxNSA5czEuMzMgMiAzLjUgMlMyMiA5IDIyIDl6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDJzLTIgMS4zMy0yIDMuNVMxNSA5IDE1IDlzMi0xLjg0IDItMy41QzE3IDMuMzMgMTUgMiAxNSAyeiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhcmQtc2ltLmpzCnZhciBDYXJkU2ltOwp2YXIgaW5pdF9jYXJkX3NpbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FyZC1zaW0uanMiKCkgewogICAgQ2FyZFNpbSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE0djQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTQuMTcyIDJhMiAyIDAgMCAxIDEuNDE0LjU4NmwzLjgyOCAzLjgyOEEyIDIgMCAwIDEgMjAgNy44MjhWMjBhMiAyIDAgMCAxLTIgMkg2YTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE0aDgiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI4IiwgeTogIjEwIiwgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiOCIsIHJ4OiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nhc2UtbG93ZXIuanMKdmFyIENhc2VMb3dlcjsKdmFyIGluaXRfY2FzZV9sb3dlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FzZS1sb3dlci5qcyIoKSB7CiAgICBDYXNlTG93ZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA5djciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgNnYxMCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE3LjUiLCBjeTogIjEyLjUiLCByOiAiMy41IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNi41IiwgY3k6ICIxMi41IiwgcjogIjMuNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nhc2Utc2Vuc2l0aXZlLmpzCnZhciBDYXNlU2Vuc2l0aXZlOwp2YXIgaW5pdF9jYXNlX3NlbnNpdGl2ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FzZS1zZW5zaXRpdmUuanMiKCkgewogICAgQ2FzZVNlbnNpdGl2ZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMTYgNC4wMzktOS42OWEuNS41IDAgMCAxIC45MjMgMEwxMSAxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiA5djciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy4zMDQgMTNoNi4zOTIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOC41IiwgY3k6ICIxMi41IiwgcjogIjMuNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nhc2UtdXBwZXIuanMKdmFyIENhc2VVcHBlcjsKdmFyIGluaXRfY2FzZV91cHBlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FzZS11cHBlci5qcyIoKSB7CiAgICBDYXNlVXBwZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTE1IDExaDQuNWExIDEgMCAwIDEgMCA1aC00YS41LjUgMCAwIDEtLjUtLjV2LTlhLjUuNSAwIDAgMSAuNS0uNWgzYTEgMSAwIDAgMSAwIDUiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMTYgNC4wMzktOS42OWEuNS41IDAgMCAxIC45MjMgMEwxMSAxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zLjMwNCAxM2g2LjM5MiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nhc3NldHRlLXRhcGUuanMKdmFyIENhc3NldHRlVGFwZTsKdmFyIGluaXRfY2Fzc2V0dGVfdGFwZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2Fzc2V0dGUtdGFwZS5qcyIoKSB7CiAgICBDYXNzZXR0ZVRhcGUgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE2IiwgeDogIjIiLCB5OiAiNCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjgiLCBjeTogIjEwIiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmg4IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYiLCBjeTogIjEwIiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNiAyMCAuNy0yLjlBMS40IDEuNCAwIDAgMSA4LjEgMTZoNy44YTEuNCAxLjQgMCAwIDEgMS40IDFsLjcgMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nhc3QuanMKdmFyIENhc3Q7CnZhciBpbml0X2Nhc3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nhc3QuanMiKCkgewogICAgQ2FzdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgOFY2YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnYxMmEyIDIgMCAwIDEtMiAyaC02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJhOSA5IDAgMCAxIDggOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE2YTUgNSAwIDAgMSA0IDQiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMiIsIHgyOiAiMi4wMSIsIHkxOiAiMjAiLCB5MjogIjIwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2F0LmpzCnZhciBDYXQ7CnZhciBpbml0X2NhdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2F0LmpzIigpIHsKICAgIENhdCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyIDVjLjY3IDAgMS4zNS4wOSAyIC4yNiAxLjc4LTIgNS4wMy0yLjg0IDYuNDItMi4yNiAxLjQuNTgtLjQyIDctLjQyIDcgLjU3IDEuMDcgMSAyLjI0IDEgMy40NEMyMSAxNy45IDE2Ljk3IDIxIDEyIDIxcy05LTMtOS03LjU2YzAtMS4yNS41LTIuNCAxLTMuNDQgMCAwLTEuODktNi40Mi0uNS03IDEuMzktLjU4IDQuNzIuMjMgNi41IDIuMjNBOS4wNCA5LjA0IDAgMCAxIDEyIDVaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTR2LjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTR2LjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEuMjUgMTYuMjVoMS41TDEyIDE3bC0uNzUtLjc1WiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nhc3RsZS5qcwp2YXIgQ2FzdGxlOwp2YXIgaW5pdF9jYXN0bGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nhc3RsZS5qcyIoKSB7CiAgICBDYXN0bGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA1VjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgNVYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDIxdi0zYTMgMyAwIDAgMC02IDB2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAzdjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggNUg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDExSDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgOXYxMGEyIDIgMCAwIDEtMiAySDRhMiAyIDAgMCAxLTItMlY5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgM3Y4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2N0di5qcwp2YXIgQ2N0djsKdmFyIGluaXRfY2N0diA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2N0di5qcyIoKSB7CiAgICBDY3R2ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk0xNi43NSAxMmgzLjYzMmExIDEgMCAwIDEgLjg5NCAxLjQ0N2wtMi4wMzQgNC4wNjlhMSAxIDAgMCAxLTEuNzA4LjEzNGwtMi4xMjQtMi45NyIgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTcuMTA2IDkuMDUzYTEgMSAwIDAgMSAuNDQ3IDEuMzQxbC0zLjEwNiA2LjIxMWExIDEgMCAwIDEtMS4zNDIuNDQ3TDMuNjEgMTIuM2EyLjkyIDIuOTIgMCAwIDEtMS4zLTMuOTFMMy42OSA1LjZhMi45MiAyLjkyIDAgMCAxIDMuOTItMS4zeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE5aDMuNzZhMiAyIDAgMCAwIDEuOC0xLjFMOSAxNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIxdi00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgOWguMDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1hcmVhLmpzCnZhciBDaGFydEFyZWE7CnZhciBpbml0X2NoYXJ0X2FyZWEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LWFyZWEuanMiKCkgewogICAgQ2hhcnRBcmVhID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjE2YTIgMiAwIDAgMCAyIDJoMTYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNyAxMS4yMDdhLjUuNSAwIDAgMSAuMTQ2LS4zNTNsMi0yYS41LjUgMCAwIDEgLjcwOCAwbDMuMjkyIDMuMjkyYS41LjUgMCAwIDAgLjcwOCAwbDQuMjkyLTQuMjkyYS41LjUgMCAwIDEgLjg1NC4zNTNWMTZhMSAxIDAgMCAxLTEgMUg4YTEgMSAwIDAgMS0xLTF6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtYmFyLWJpZy5qcwp2YXIgQ2hhcnRCYXJCaWc7CnZhciBpbml0X2NoYXJ0X2Jhcl9iaWcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LWJhci1iaWcuanMiKCkgewogICAgQ2hhcnRCYXJCaWcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDN2MTZhMiAyIDAgMCAwIDIgMmgxNiIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjciLCB5OiAiMTMiLCB3aWR0aDogIjkiLCBoZWlnaHQ6ICI0Iiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiNyIsIHk6ICI1Iiwgd2lkdGg6ICIxMiIsIGhlaWdodDogIjQiLCByeDogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1iYXItZGVjcmVhc2luZy5qcwp2YXIgQ2hhcnRCYXJEZWNyZWFzaW5nOwp2YXIgaW5pdF9jaGFydF9iYXJfZGVjcmVhc2luZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtYmFyLWRlY3JlYXNpbmcuanMiKCkgewogICAgQ2hhcnRCYXJEZWNyZWFzaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjE2YTIgMiAwIDAgMCAyIDJoMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMWg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTZoMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDZoMTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1iYXItaW5jcmVhc2luZy5qcwp2YXIgQ2hhcnRCYXJJbmNyZWFzaW5nOwp2YXIgaW5pdF9jaGFydF9iYXJfaW5jcmVhc2luZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtYmFyLWluY3JlYXNpbmcuanMiKCkgewogICAgQ2hhcnRCYXJJbmNyZWFzaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjE2YTIgMiAwIDAgMCAyIDJoMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMWg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTZoMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyA2aDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1iYXItc3RhY2tlZC5qcwp2YXIgQ2hhcnRCYXJTdGFja2VkOwp2YXIgaW5pdF9jaGFydF9iYXJfc3RhY2tlZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtYmFyLXN0YWNrZWQuanMiKCkgewogICAgQ2hhcnRCYXJTdGFja2VkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTN2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA1djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjE2YTIgMiAwIDAgMCAyIDJoMTYiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI3IiwgeTogIjEzIiwgd2lkdGg6ICI5IiwgaGVpZ2h0OiAiNCIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjciLCB5OiAiNSIsIHdpZHRoOiAiMTIiLCBoZWlnaHQ6ICI0Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtYmFyLmpzCnZhciBDaGFydEJhcjsKdmFyIGluaXRfY2hhcnRfYmFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1iYXIuanMiKCkgewogICAgQ2hhcnRCYXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDN2MTZhMiAyIDAgMCAwIDIgMmgxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE2aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMWgxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDZoMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LWNhbmRsZXN0aWNrLmpzCnZhciBDaGFydENhbmRsZXN0aWNrOwp2YXIgaW5pdF9jaGFydF9jYW5kbGVzdGljayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtY2FuZGxlc3RpY2suanMiKCkgewogICAgQ2hhcnRDYW5kbGVzdGljayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgNXY0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjQiLCBoZWlnaHQ6ICI2IiwgeDogIjciLCB5OiAiOSIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE1djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgM3YyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjQiLCBoZWlnaHQ6ICI4IiwgeDogIjE1IiwgeTogIjUiLCByeDogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTN2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDN2MTZhMiAyIDAgMCAwIDIgMmgxNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LWNvbHVtbi1iaWcuanMKdmFyIENoYXJ0Q29sdW1uQmlnOwp2YXIgaW5pdF9jaGFydF9jb2x1bW5fYmlnID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1jb2x1bW4tYmlnLmpzIigpIHsKICAgIENoYXJ0Q29sdW1uQmlnID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjE2YTIgMiAwIDAgMCAyIDJoMTYiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIxNSIsIHk6ICI1Iiwgd2lkdGg6ICI0IiwgaGVpZ2h0OiAiMTIiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI3IiwgeTogIjgiLCB3aWR0aDogIjQiLCBoZWlnaHQ6ICI5Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtY29sdW1uLWRlY3JlYXNpbmcuanMKdmFyIENoYXJ0Q29sdW1uRGVjcmVhc2luZzsKdmFyIGluaXRfY2hhcnRfY29sdW1uX2RlY3JlYXNpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LWNvbHVtbi1kZWNyZWFzaW5nLmpzIigpIHsKICAgIENoYXJ0Q29sdW1uRGVjcmVhc2luZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDE3VjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTd2LTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjE2YTIgMiAwIDAgMCAyIDJoMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxN1Y1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtY29sdW1uLWluY3JlYXNpbmcuanMKdmFyIENoYXJ0Q29sdW1uSW5jcmVhc2luZzsKdmFyIGluaXRfY2hhcnRfY29sdW1uX2luY3JlYXNpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LWNvbHVtbi1pbmNyZWFzaW5nLmpzIigpIHsKICAgIENoYXJ0Q29sdW1uSW5jcmVhc2luZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDE3VjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTdWNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDN2MTZhMiAyIDAgMCAwIDIgMmgxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE3di0zIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtY29sdW1uLmpzCnZhciBDaGFydENvbHVtbjsKdmFyIGluaXRfY2hhcnRfY29sdW1uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1jb2x1bW4uanMiKCkgewogICAgQ2hhcnRDb2x1bW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDN2MTZhMiAyIDAgMCAwIDIgMmgxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxN1Y5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDE3VjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxN3YtMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LWNvbHVtbi1zdGFja2VkLmpzCnZhciBDaGFydENvbHVtblN0YWNrZWQ7CnZhciBpbml0X2NoYXJ0X2NvbHVtbl9zdGFja2VkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1jb2x1bW4tc3RhY2tlZC5qcyIoKSB7CiAgICBDaGFydENvbHVtblN0YWNrZWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxM0g3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDloLTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjE2YTIgMiAwIDAgMCAyIDJoMTYiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIxNSIsIHk6ICI1Iiwgd2lkdGg6ICI0IiwgaGVpZ2h0OiAiMTIiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI3IiwgeTogIjgiLCB3aWR0aDogIjQiLCBoZWlnaHQ6ICI5Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtZ2FudHQuanMKdmFyIENoYXJ0R2FudHQ7CnZhciBpbml0X2NoYXJ0X2dhbnR0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1nYW50dC5qcyIoKSB7CiAgICBDaGFydEdhbnR0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgNmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE2aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjE2YTIgMiAwIDAgMCAyIDJoMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMWg3IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtbGluZS5qcwp2YXIgQ2hhcnRMaW5lOwp2YXIgaW5pdF9jaGFydF9saW5lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1saW5lLmpzIigpIHsKICAgIENoYXJ0TGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgM3YxNmEyIDIgMCAwIDAgMiAyaDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5IDktNSA1LTQtNC0zIDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1uZXR3b3JrLmpzCnZhciBDaGFydE5ldHdvcms7CnZhciBpbml0X2NoYXJ0X25ldHdvcmsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LW5ldHdvcmsuanMiKCkgewogICAgQ2hhcnROZXR3b3JrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMuMTEgNy42NjQgMS43OCAyLjY3MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC4xNjIgMTIuNzg4LTMuMzI0IDEuNDI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwIDQtNi4wNiAxLjUxNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDN2MTZhMiAyIDAgMCAwIDIgMmgxNiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICI2IiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNiIsIGN5OiAiMTIiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjE1IiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1uby1heGVzLWNvbHVtbi1kZWNyZWFzaW5nLmpzCnZhciBDaGFydE5vQXhlc0NvbHVtbkRlY3JlYXNpbmc7CnZhciBpbml0X2NoYXJ0X25vX2F4ZXNfY29sdW1uX2RlY3JlYXNpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LW5vLWF4ZXMtY29sdW1uLWRlY3JlYXNpbmcuanMiKCkgewogICAgQ2hhcnROb0F4ZXNDb2x1bW5EZWNyZWFzaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMVYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIxVjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMjF2LTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1uby1heGVzLWNvbHVtbi1pbmNyZWFzaW5nLmpzCnZhciBDaGFydE5vQXhlc0NvbHVtbkluY3JlYXNpbmc7CnZhciBpbml0X2NoYXJ0X25vX2F4ZXNfY29sdW1uX2luY3JlYXNpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LW5vLWF4ZXMtY29sdW1uLWluY3JlYXNpbmcuanMiKCkgewogICAgQ2hhcnROb0F4ZXNDb2x1bW5JbmNyZWFzaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMXYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMVY5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDIxVjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1uby1heGVzLWNvbHVtbi5qcwp2YXIgQ2hhcnROb0F4ZXNDb2x1bW47CnZhciBpbml0X2NoYXJ0X25vX2F4ZXNfY29sdW1uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1uby1heGVzLWNvbHVtbi5qcyIoKSB7CiAgICBDaGFydE5vQXhlc0NvbHVtbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMjF2LTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjFWMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAyMVY5IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtbm8tYXhlcy1jb21iaW5lZC5qcwp2YXIgQ2hhcnROb0F4ZXNDb21iaW5lZDsKdmFyIGluaXRfY2hhcnRfbm9fYXhlc19jb21iaW5lZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtbm8tYXhlcy1jb21iaW5lZC5qcyIoKSB7CiAgICBDaGFydE5vQXhlc0NvbWJpbmVkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTZ2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNHY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDEwdjExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDMtOC42NDYgOC42NDZhLjUuNSAwIDAgMS0uNzA4IDBMOS4zNTQgOC4zNTRhLjUuNSAwIDAgMC0uNzA3IDBMMiAxNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE4djMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNHY3IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtbm8tYXhlcy1nYW50dC5qcwp2YXIgQ2hhcnROb0F4ZXNHYW50dDsKdmFyIGluaXRfY2hhcnRfbm9fYXhlc19nYW50dCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtbm8tYXhlcy1nYW50dC5qcyIoKSB7CiAgICBDaGFydE5vQXhlc0dhbnR0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA1aDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTJoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTloOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LXBpZS5qcwp2YXIgQ2hhcnRQaWU7CnZhciBpbml0X2NoYXJ0X3BpZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtcGllLmpzIigpIHsKICAgIENoYXJ0UGllID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEgMTJjLjU1MiAwIDEuMDA1LS40NDkuOTUtLjk5OGExMCAxMCAwIDAgMC04Ljk1My04Ljk1MWMtLjU1LS4wNTUtLjk5OC4zOTgtLjk5OC45NXY4YTEgMSAwIDAgMCAxIDF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxLjIxIDE1Ljg5QTEwIDEwIDAgMSAxIDggMi44MyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LXNwbGluZS5qcwp2YXIgQ2hhcnRTcGxpbmU7CnZhciBpbml0X2NoYXJ0X3NwbGluZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtc3BsaW5lLmpzIigpIHsKICAgIENoYXJ0U3BsaW5lID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjE2YTIgMiAwIDAgMCAyIDJoMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxNmMuNS0yIDEuNS03IDQtNyAyIDAgMiAzIDQgMyAyLjUgMCA0LjUtNSA1LTciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1zY2F0dGVyLmpzCnZhciBDaGFydFNjYXR0ZXI7CnZhciBpbml0X2NoYXJ0X3NjYXR0ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LXNjYXR0ZXIuanMiKCkgewogICAgQ2hhcnRTY2F0dGVyID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICI3LjUiLCBjeTogIjcuNSIsIHI6ICIuNSIsIGZpbGw6ICJjdXJyZW50Q29sb3IiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOC41IiwgY3k6ICI1LjUiLCByOiAiLjUiLCBmaWxsOiAiY3VycmVudENvbG9yIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTEuNSIsIGN5OiAiMTEuNSIsIHI6ICIuNSIsIGZpbGw6ICJjdXJyZW50Q29sb3IiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI3LjUiLCBjeTogIjE2LjUiLCByOiAiLjUiLCBmaWxsOiAiY3VycmVudENvbG9yIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTcuNSIsIGN5OiAiMTQuNSIsIHI6ICIuNSIsIGZpbGw6ICJjdXJyZW50Q29sb3IiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjE2YTIgMiAwIDAgMCAyIDJoMTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGVjay1jaGVjay5qcwp2YXIgQ2hlY2tDaGVjazsKdmFyIGluaXRfY2hlY2tfY2hlY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZWNrLWNoZWNrLmpzIigpIHsKICAgIENoZWNrQ2hlY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA2IDcgMTdsLTUtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiAxMC03LjUgNy41TDEzIDE2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hlY2stbGluZS5qcwp2YXIgQ2hlY2tMaW5lOwp2YXIgaW5pdF9jaGVja19saW5lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGVjay1saW5lLmpzIigpIHsKICAgIENoZWNrTGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDRMOSAxNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxOUwzIDE5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTVMNCAxMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZWNrLmpzCnZhciBDaGVjazsKdmFyIGluaXRfY2hlY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZWNrLmpzIigpIHsKICAgIENoZWNrID0gW1sicGF0aCIsIHsgZDogIk0yMCA2IDkgMTdsLTUtNSIgfV1dOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGVmLWhhdC5qcwp2YXIgQ2hlZkhhdDsKdmFyIGluaXRfY2hlZl9oYXQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZWYtaGF0LmpzIigpIHsKICAgIENoZWZIYXQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNyAyMWExIDEgMCAwIDAgMS0xdi01LjM1YzAtLjQ1Ny4zMTYtLjg0NC43MjctMS4wNDFhNCA0IDAgMCAwLTIuMTM0LTcuNTg5IDUgNSAwIDAgMC05LjE4NiAwIDQgNCAwIDAgMC0yLjEzNCA3LjU4OGMuNDExLjE5OC43MjcuNTg1LjcyNyAxLjA0MVYyMGExIDEgMCAwIDAgMSAxWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE3aDEyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hlcnJ5LmpzCnZhciBDaGVycnk7CnZhciBpbml0X2NoZXJyeSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hlcnJ5LmpzIigpIHsKICAgIENoZXJyeSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTdhNSA1IDAgMCAwIDEwIDBjMC0yLjc2LTIuNS01LTUtMy0yLjUtMi01IC4yNC01IDNaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3YTUgNSAwIDAgMCAxMCAwYzAtMi43Ni0yLjUtNS01LTMtMi41LTItNSAuMjQtNSAzWiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE0YzMuMjItMi45MSA0LjI5LTguNzUgNS0xMiAxLjY2IDIuMzggNC45NCA5IDUgMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgOWMtNC4yOSAwLTcuMTQtMi4zMy0xMC03IDUuNzEgMCAxMCA0LjY3IDEwIDdaIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hlc3Mta2luZy5qcwp2YXIgQ2hlc3NLaW5nOwp2YXIgaW5pdF9jaGVzc19raW5nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGVzcy1raW5nLmpzIigpIHsKICAgIENoZXNzS2luZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMjBhMiAyIDAgMCAxIDItMmgxMmEyIDIgMCAwIDEgMiAydjFhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMS0xLTF6IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTYuNyAxOC0xLTFDNC4zNSAxNS42ODIgMyAxNC4wOSAzIDEyYTUgNSAwIDAgMSA0Ljk1LTVjMS41ODQgMCAyLjcuNDU1IDQuMDUgMS44MThDMTMuMzUgNy40NTUgMTQuNDY2IDcgMTYuMDUgN0E1IDUgMCAwIDEgMjEgMTJjMCAyLjA4Mi0xLjM1OSAzLjY3My0yLjcgNWwtMSAxIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDRoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjYuODE4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hlc3MtYmlzaG9wLmpzCnZhciBDaGVzc0Jpc2hvcDsKdmFyIGluaXRfY2hlc3NfYmlzaG9wID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGVzcy1iaXNob3AuanMiKCkgewogICAgQ2hlc3NCaXNob3AgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDIwYTIgMiAwIDAgMSAyLTJoMTBhMiAyIDAgMCAxIDIgMnYxYTEgMSAwIDAgMS0xIDFINmExIDEgMCAwIDEtMS0xeiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNSAxOGMxLjUtLjYxNSAzLTIuNDYxIDMtNC45MjNDMTggOC43NjkgMTQuNSA0LjQ2MiAxMiAyIDkuNSA0LjQ2MiA2IDguNzcgNiAxMy4wNzcgNiAxNS41MzkgNy41IDE3LjM4NSA5IDE4IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDctMi41IDIuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDJoNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXNzLWtuaWdodC5qcwp2YXIgQ2hlc3NLbmlnaHQ7CnZhciBpbml0X2NoZXNzX2tuaWdodCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hlc3Mta25pZ2h0LmpzIigpIHsKICAgIENoZXNzS25pZ2h0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMGEyIDIgMCAwIDEgMi0yaDEwYTIgMiAwIDAgMSAyIDJ2MWExIDEgMCAwIDEtMSAxSDZhMSAxIDAgMCAxLTEtMXoiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTYuNSAxOGMxLTIgMi41LTUgMi41LTlhNyA3IDAgMCAwLTctN0g2LjYzNWExIDEgMCAwIDAtLjc2OCAxLjY0TDcgNWwtMi4zMiA1LjgwMmEyIDIgMCAwIDAgLjk1IDIuNTI2bDIuODcgMS40NTYiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgNSAxLjQyNS0xLjQyNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyA4IDEuNTMtMS41MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjcxMyAxMi4xODUgNyAxOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXNzLXBhd24uanMKdmFyIENoZXNzUGF3bjsKdmFyIGluaXRfY2hlc3NfcGF3biA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hlc3MtcGF3bi5qcyIoKSB7CiAgICBDaGVzc1Bhd24gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDIwYTIgMiAwIDAgMSAyLTJoMTBhMiAyIDAgMCAxIDIgMnYxYTEgMSAwIDAgMS0xIDFINmExIDEgMCAwIDEtMS0xeiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC41IDEwIDEuNSA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTBoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAxOCAxLjUtOCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICI2IiwgcjogIjQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGVzcy1xdWVlbi5qcwp2YXIgQ2hlc3NRdWVlbjsKdmFyIGluaXRfY2hlc3NfcXVlZW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXNzLXF1ZWVuLmpzIigpIHsKICAgIENoZXNzUXVlZW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDIwYTIgMiAwIDAgMSAyLTJoMTJhMiAyIDAgMCAxIDIgMnYxYTEgMSAwIDAgMS0xIDFINWExIDEgMCAwIDEtMS0xeiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMi40NzQgNS45NDMgMS41NjcgNS4zNGExIDEgMCAwIDAgMS43NS4zMjhsMi42MTYtMy40MDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAgOS0zIDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNS41OTQgOC4yMDkgMi42MTUgMy40MDNhMSAxIDAgMCAwIDEuNzUtLjMyOWwxLjU2Ny01LjM0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTggNCA5IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjQiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjIwIiwgY3k6ICI3IiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI0IiwgY3k6ICI3IiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGVzcy1yb29rLmpzCnZhciBDaGVzc1Jvb2s7CnZhciBpbml0X2NoZXNzX3Jvb2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXNzLXJvb2suanMiKCkgewogICAgQ2hlc3NSb29rID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMGEyIDIgMCAwIDEgMi0yaDEwYTIgMiAwIDAgMSAyIDJ2MWExIDEgMCAwIDEtMSAxSDZhMSAxIDAgMCAxLTEtMXoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAxOC0xLTkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAydjVhMiAyIDAgMCAwIDIgMmg4YTIgMiAwIDAgMCAyLTJWMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDRoMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNyAxOCAxLTkiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGV2cm9uLWRvd24uanMKdmFyIENoZXZyb25Eb3duOwp2YXIgaW5pdF9jaGV2cm9uX2Rvd24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXZyb24tZG93bi5qcyIoKSB7CiAgICBDaGV2cm9uRG93biA9IFtbInBhdGgiLCB7IGQ6ICJtNiA5IDYgNiA2LTYiIH1dXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hldnJvbi1maXJzdC5qcwp2YXIgQ2hldnJvbkZpcnN0Owp2YXIgaW5pdF9jaGV2cm9uX2ZpcnN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGV2cm9uLWZpcnN0LmpzIigpIHsKICAgIENoZXZyb25GaXJzdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDE4LTYtNiA2LTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyA2djEyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hldnJvbi1sYXN0LmpzCnZhciBDaGV2cm9uTGFzdDsKdmFyIGluaXRfY2hldnJvbl9sYXN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGV2cm9uLWxhc3QuanMiKCkgewogICAgQ2hldnJvbkxhc3QgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm03IDE4IDYtNi02LTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgNnYxMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXZyb24tcmlnaHQuanMKdmFyIENoZXZyb25SaWdodDsKdmFyIGluaXRfY2hldnJvbl9yaWdodCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hldnJvbi1yaWdodC5qcyIoKSB7CiAgICBDaGV2cm9uUmlnaHQgPSBbWyJwYXRoIiwgeyBkOiAibTkgMTggNi02LTYtNiIgfV1dOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGV2cm9uLWxlZnQuanMKdmFyIENoZXZyb25MZWZ0Owp2YXIgaW5pdF9jaGV2cm9uX2xlZnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXZyb24tbGVmdC5qcyIoKSB7CiAgICBDaGV2cm9uTGVmdCA9IFtbInBhdGgiLCB7IGQ6ICJtMTUgMTgtNi02IDYtNiIgfV1dOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGV2cm9uLXVwLmpzCnZhciBDaGV2cm9uVXA7CnZhciBpbml0X2NoZXZyb25fdXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXZyb24tdXAuanMiKCkgewogICAgQ2hldnJvblVwID0gW1sicGF0aCIsIHsgZDogIm0xOCAxNS02LTYtNiA2IiB9XV07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXZyb25zLWRvd24tdXAuanMKdmFyIENoZXZyb25zRG93blVwOwp2YXIgaW5pdF9jaGV2cm9uc19kb3duX3VwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGV2cm9ucy1kb3duLXVwLmpzIigpIHsKICAgIENoZXZyb25zRG93blVwID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtNyAyMCA1LTUgNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgNCA1IDUgNS01IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hldnJvbnMtZG93bi5qcwp2YXIgQ2hldnJvbnNEb3duOwp2YXIgaW5pdF9jaGV2cm9uc19kb3duID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGV2cm9ucy1kb3duLmpzIigpIHsKICAgIENoZXZyb25zRG93biA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgNiA1IDUgNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMTMgNSA1IDUtNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXZyb25zLWxlZnQtcmlnaHQtZWxsaXBzaXMuanMKdmFyIENoZXZyb25zTGVmdFJpZ2h0RWxsaXBzaXM7CnZhciBpbml0X2NoZXZyb25zX2xlZnRfcmlnaHRfZWxsaXBzaXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXZyb25zLWxlZnQtcmlnaHQtZWxsaXBzaXMuanMiKCkgewogICAgQ2hldnJvbnNMZWZ0UmlnaHRFbGxpcHNpcyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEyaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgNyA1IDUtNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgNy01IDUgNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hldnJvbnMtbGVmdC1yaWdodC5qcwp2YXIgQ2hldnJvbnNMZWZ0UmlnaHQ7CnZhciBpbml0X2NoZXZyb25zX2xlZnRfcmlnaHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXZyb25zLWxlZnQtcmlnaHQuanMiKCkgewogICAgQ2hldnJvbnNMZWZ0UmlnaHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDctNSA1IDUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA3IDUgNS01IDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGV2cm9ucy1sZWZ0LmpzCnZhciBDaGV2cm9uc0xlZnQ7CnZhciBpbml0X2NoZXZyb25zX2xlZnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXZyb25zLWxlZnQuanMiKCkgewogICAgQ2hldnJvbnNMZWZ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTEgMTctNS01IDUtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOCAxNy01LTUgNS01IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hldnJvbnMtcmlnaHQtbGVmdC5qcwp2YXIgQ2hldnJvbnNSaWdodExlZnQ7CnZhciBpbml0X2NoZXZyb25zX3JpZ2h0X2xlZnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXZyb25zLXJpZ2h0LWxlZnQuanMiKCkgewogICAgQ2hldnJvbnNSaWdodExlZnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMCAxNy01LTUgNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTQgMTcgNS01LTUtNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXZyb25zLXJpZ2h0LmpzCnZhciBDaGV2cm9uc1JpZ2h0Owp2YXIgaW5pdF9jaGV2cm9uc19yaWdodCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hldnJvbnMtcmlnaHQuanMiKCkgewogICAgQ2hldnJvbnNSaWdodCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTYgMTcgNS01LTUtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMyAxNyA1LTUtNS01IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hldnJvbnMtdXAtZG93bi5qcwp2YXIgQ2hldnJvbnNVcERvd247CnZhciBpbml0X2NoZXZyb25zX3VwX2Rvd24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXZyb25zLXVwLWRvd24uanMiKCkgewogICAgQ2hldnJvbnNVcERvd24gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm03IDE1IDUgNSA1LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNyA5IDUtNSA1IDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGV2cm9ucy11cC5qcwp2YXIgQ2hldnJvbnNVcDsKdmFyIGluaXRfY2hldnJvbnNfdXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXZyb25zLXVwLmpzIigpIHsKICAgIENoZXZyb25zVXAgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAxMS01LTUtNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDE4LTUtNS01IDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaHJvbWl1bS5qcwp2YXIgQ2hyb21pdW07CnZhciBpbml0X2Nocm9taXVtID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaHJvbWl1bS5qcyIoKSB7CiAgICBDaHJvbWl1bSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjg4IDIxLjk0IDE1LjQ2IDE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxLjE3IDhIMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy45NSA2LjA2IDguNTQgMTQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpZ2FyZXR0ZS1vZmYuanMKdmFyIENpZ2FyZXR0ZU9mZjsKdmFyIGluaXRfY2lnYXJldHRlX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lnYXJldHRlLW9mZi5qcyIoKSB7CiAgICBDaWdhcmV0dGVPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMkgzYTEgMSAwIDAgMC0xIDF2MmExIDEgMCAwIDAgMSAxaDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDhjMC0yLjUtMi0yLjUtMi01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMmExIDEgMCAwIDEgMSAxdjJhMSAxIDAgMCAxLS41Ljg2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiA4YzAtMi41LTItMi41LTItNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEydjQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaHVyY2guanMKdmFyIENodXJjaDsKdmFyIGluaXRfY2h1cmNoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaHVyY2guanMiKCkgewogICAgQ2h1cmNoID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOWg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAyMXYtM2EyIDIgMCAwIDAtNCAwdjMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTggOSAzLjUyIDIuMTQ3YTEgMSAwIDAgMSAuNDguODU0VjE5YTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0ydi02Ljk5OWExIDEgMCAwIDEgLjQ4LS44NTRMNiA5IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMjFWN2ExIDEgMCAwIDEgLjM3Ni0uNzgybDUtMy45OTlhMSAxIDAgMCAxIDEuMjQ5LjAwMWw1IDRBMSAxIDAgMCAxIDE4IDd2MTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaWdhcmV0dGUuanMKdmFyIENpZ2FyZXR0ZTsKdmFyIGluaXRfY2lnYXJldHRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaWdhcmV0dGUuanMiKCkgewogICAgQ2lnYXJldHRlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTJIM2ExIDEgMCAwIDAtMSAxdjJhMSAxIDAgMCAwIDEgMWgxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA4YzAtMi41LTItMi41LTItNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNmExIDEgMCAwIDAgMS0xdi0yYTEgMSAwIDAgMC0xLTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgOGMwLTIuNS0yLTIuNS0yLTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMnY0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWFsZXJ0LmpzCnZhciBDaXJjbGVBbGVydDsKdmFyIGluaXRfY2lyY2xlX2FsZXJ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtYWxlcnQuanMiKCkgewogICAgQ2lyY2xlQWxlcnQgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTIiLCB5MTogIjgiLCB5MjogIjEyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEyIiwgeDI6ICIxMi4wMSIsIHkxOiAiMTYiLCB5MjogIjE2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWFycm93LWRvd24uanMKdmFyIENpcmNsZUFycm93RG93bjsKdmFyIGluaXRfY2lyY2xlX2Fycm93X2Rvd24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1hcnJvdy1kb3duLmpzIigpIHsKICAgIENpcmNsZUFycm93RG93biA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDh2OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDEyIDQgNCA0LTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtYXJyb3ctbGVmdC5qcwp2YXIgQ2lyY2xlQXJyb3dMZWZ0Owp2YXIgaW5pdF9jaXJjbGVfYXJyb3dfbGVmdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWFycm93LWxlZnQuanMiKCkgewogICAgQ2lyY2xlQXJyb3dMZWZ0ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIgOC00IDQgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEySDgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtYXJyb3ctb3V0LWRvd24tbGVmdC5qcwp2YXIgQ2lyY2xlQXJyb3dPdXREb3duTGVmdDsKdmFyIGluaXRfY2lyY2xlX2Fycm93X291dF9kb3duX2xlZnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1hcnJvdy1vdXQtZG93bi1sZWZ0LmpzIigpIHsKICAgIENpcmNsZUFycm93T3V0RG93bkxlZnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEyYTEwIDEwIDAgMSAxIDEwIDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMjIgMTAtMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAyMkgydi02IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWFycm93LW91dC1kb3duLXJpZ2h0LmpzCnZhciBDaXJjbGVBcnJvd091dERvd25SaWdodDsKdmFyIGluaXRfY2lyY2xlX2Fycm93X291dF9kb3duX3JpZ2h0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtYXJyb3ctb3V0LWRvd24tcmlnaHQuanMiKCkgewogICAgQ2lyY2xlQXJyb3dPdXREb3duUmlnaHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMmExMCAxMCAwIDEgMSAxMC0xMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAyMiAxMiAxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxNnY2aC02IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWFycm93LW91dC11cC1sZWZ0LmpzCnZhciBDaXJjbGVBcnJvd091dFVwTGVmdDsKdmFyIGluaXRfY2lyY2xlX2Fycm93X291dF91cF9sZWZ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtYXJyb3ctb3V0LXVwLWxlZnQuanMiKCkgewogICAgQ2lyY2xlQXJyb3dPdXRVcExlZnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDhWMmg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAxMCAxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyQTEwIDEwIDAgMSAxIDIgMTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtYXJyb3ctb3V0LXVwLXJpZ2h0LmpzCnZhciBDaXJjbGVBcnJvd091dFVwUmlnaHQ7CnZhciBpbml0X2NpcmNsZV9hcnJvd19vdXRfdXBfcmlnaHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1hcnJvdy1vdXQtdXAtcmlnaHQuanMiKCkgewogICAgQ2lyY2xlQXJyb3dPdXRVcFJpZ2h0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTJBMTAgMTAgMCAxIDEgMTIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAyIDEyIDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDJoNnY2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWFycm93LXJpZ2h0LmpzCnZhciBDaXJjbGVBcnJvd1JpZ2h0Owp2YXIgaW5pdF9jaXJjbGVfYXJyb3dfcmlnaHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1hcnJvdy1yaWdodC5qcyIoKSB7CiAgICBDaXJjbGVBcnJvd1JpZ2h0ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIgMTYgNC00LTQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEyaDgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtYXJyb3ctdXAuanMKdmFyIENpcmNsZUFycm93VXA7CnZhciBpbml0X2NpcmNsZV9hcnJvd191cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWFycm93LXVwLmpzIigpIHsKICAgIENpcmNsZUFycm93VXAgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAxMi00LTQtNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE2VjgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtY2hlY2stYmlnLmpzCnZhciBDaXJjbGVDaGVja0JpZzsKdmFyIGluaXRfY2lyY2xlX2NoZWNrX2JpZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWNoZWNrLWJpZy5qcyIoKSB7CiAgICBDaXJjbGVDaGVja0JpZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxLjgwMSAxMEExMCAxMCAwIDEgMSAxNyAzLjMzNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDExIDMgM0wyMiA0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWNoZWNrLmpzCnZhciBDaXJjbGVDaGVjazsKdmFyIGluaXRfY2lyY2xlX2NoZWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtY2hlY2suanMiKCkgewogICAgQ2lyY2xlQ2hlY2sgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDEyIDIgMiA0LTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtY2hldnJvbi1kb3duLmpzCnZhciBDaXJjbGVDaGV2cm9uRG93bjsKdmFyIGluaXRfY2lyY2xlX2NoZXZyb25fZG93biA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWNoZXZyb24tZG93bi5qcyIoKSB7CiAgICBDaXJjbGVDaGV2cm9uRG93biA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDEwLTQgNC00LTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtY2hldnJvbi1sZWZ0LmpzCnZhciBDaXJjbGVDaGV2cm9uTGVmdDsKdmFyIGluaXRfY2lyY2xlX2NoZXZyb25fbGVmdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWNoZXZyb24tbGVmdC5qcyIoKSB7CiAgICBDaXJjbGVDaGV2cm9uTGVmdCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDE2LTQtNCA0LTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtY2hldnJvbi1yaWdodC5qcwp2YXIgQ2lyY2xlQ2hldnJvblJpZ2h0Owp2YXIgaW5pdF9jaXJjbGVfY2hldnJvbl9yaWdodCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWNoZXZyb24tcmlnaHQuanMiKCkgewogICAgQ2lyY2xlQ2hldnJvblJpZ2h0ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgOCA0IDQtNCA0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWNoZXZyb24tdXAuanMKdmFyIENpcmNsZUNoZXZyb25VcDsKdmFyIGluaXRfY2lyY2xlX2NoZXZyb25fdXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1jaGV2cm9uLXVwLmpzIigpIHsKICAgIENpcmNsZUNoZXZyb25VcCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggMTQgNC00IDQgNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1kYXNoZWQuanMKdmFyIENpcmNsZURhc2hlZDsKdmFyIGluaXRfY2lyY2xlX2Rhc2hlZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWRhc2hlZC5qcyIoKSB7CiAgICBDaXJjbGVEYXNoZWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC4xIDIuMTgyYTEwIDEwIDAgMCAxIDMuOCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjkgMjEuODE4YTEwIDEwIDAgMCAxLTMuOCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjYwOSAzLjcyMWExMCAxMCAwIDAgMSAyLjY5IDIuNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yLjE4MiAxMy45YTEwIDEwIDAgMCAxIDAtMy44IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwLjI3OSAxNy42MDlhMTAgMTAgMCAwIDEtMi43IDIuNjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEuODE4IDEwLjFhMTAgMTAgMCAwIDEgMCAzLjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy43MjEgNi4zOTFhMTAgMTAgMCAwIDEgMi43LTIuNjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi4zOTEgMjAuMjc5YTEwIDEwIDAgMCAxLTIuNjktMi43IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWRpdmlkZS5qcwp2YXIgQ2lyY2xlRGl2aWRlOwp2YXIgaW5pdF9jaXJjbGVfZGl2aWRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtZGl2aWRlLmpzIigpIHsKICAgIENpcmNsZURpdmlkZSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjgiLCB4MjogIjE2IiwgeTE6ICIxMiIsIHkyOiAiMTIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICIxNiIsIHkyOiAiMTYiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICI4IiwgeTI6ICI4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWRvbGxhci1zaWduLmpzCnZhciBDaXJjbGVEb2xsYXJTaWduOwp2YXIgaW5pdF9jaXJjbGVfZG9sbGFyX3NpZ24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1kb2xsYXItc2lnbi5qcyIoKSB7CiAgICBDaXJjbGVEb2xsYXJTaWduID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgOGgtNmEyIDIgMCAxIDAgMCA0aDRhMiAyIDAgMSAxIDAgNEg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4VjYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtZG90LWRhc2hlZC5qcwp2YXIgQ2lyY2xlRG90RGFzaGVkOwp2YXIgaW5pdF9jaXJjbGVfZG90X2Rhc2hlZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWRvdC1kYXNoZWQuanMiKCkgewogICAgQ2lyY2xlRG90RGFzaGVkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAuMSAyLjE4YTkuOTMgOS45MyAwIDAgMSAzLjggMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy42IDMuNzFhOS45NSA5Ljk1IDAgMCAxIDIuNjkgMi43IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxLjgyIDEwLjFhOS45MyA5LjkzIDAgMCAxIDAgMy44IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwLjI5IDE3LjZhOS45NSA5Ljk1IDAgMCAxLTIuNyAyLjY5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjkgMjEuODJhOS45NCA5Ljk0IDAgMCAxLTMuOCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuNCAyMC4yOWE5Ljk1IDkuOTUgMCAwIDEtMi42OS0yLjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMi4xOCAxMy45YTkuOTMgOS45MyAwIDAgMSAwLTMuOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zLjcxIDYuNGE5Ljk1IDkuOTUgMCAwIDEgMi43LTIuNjkiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1kb3QuanMKdmFyIENpcmNsZURvdDsKdmFyIGluaXRfY2lyY2xlX2RvdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWRvdC5qcyIoKSB7CiAgICBDaXJjbGVEb3QgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWVsbGlwc2lzLmpzCnZhciBDaXJjbGVFbGxpcHNpczsKdmFyIGluaXRfY2lyY2xlX2VsbGlwc2lzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtZWxsaXBzaXMuanMiKCkgewogICAgQ2lyY2xlRWxsaXBzaXMgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTJoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWVxdWFsLmpzCnZhciBDaXJjbGVFcXVhbDsKdmFyIGluaXRfY2lyY2xlX2VxdWFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtZXF1YWwuanMiKCkgewogICAgQ2lyY2xlRXF1YWwgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEwaDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTRoMTAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtZmFkaW5nLWFycm93LXVwLmpzCnZhciBDaXJjbGVGYWRpbmdBcnJvd1VwOwp2YXIgaW5pdF9jaXJjbGVfZmFkaW5nX2Fycm93X3VwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtZmFkaW5nLWFycm93LXVwLmpzIigpIHsKICAgIENpcmNsZUZhZGluZ0Fycm93VXAgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyYTEwIDEwIDAgMCAxIDcuMzggMTYuNzUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTItNC00LTQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNlY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIuNSA4Ljg3NWExMCAxMCAwIDAgMC0uNSAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIuODMgMTZhMTAgMTAgMCAwIDAgMi40MyAzLjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC42MzYgNS4yMzVhMTAgMTAgMCAwIDEgLjg5MS0uODU3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguNjQ0IDIxLjQyYTEwIDEwIDAgMCAwIDcuNjMxLS4zOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1mYWRpbmctcGx1cy5qcwp2YXIgQ2lyY2xlRmFkaW5nUGx1czsKdmFyIGluaXRfY2lyY2xlX2ZhZGluZ19wbHVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtZmFkaW5nLXBsdXMuanMiKCkgewogICAgQ2lyY2xlRmFkaW5nUGx1cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJhMTAgMTAgMCAwIDEgNy4zOCAxNi43NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA4djgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTJIOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yLjUgOC44NzVhMTAgMTAgMCAwIDAtLjUgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yLjgzIDE2YTEwIDEwIDAgMCAwIDIuNDMgMy40IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQuNjM2IDUuMjM1YTEwIDEwIDAgMCAxIC44OTEtLjg1NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjY0NCAyMS40MmExMCAxMCAwIDAgMCA3LjYzMS0uMzgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtZ2F1Z2UuanMKdmFyIENpcmNsZUdhdWdlOwp2YXIgaW5pdF9jaXJjbGVfZ2F1Z2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1nYXVnZS5qcyIoKSB7CiAgICBDaXJjbGVHYXVnZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1LjYgMi43YTEwIDEwIDAgMSAwIDUuNyA1LjciIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMy40IDEwLjYgMTkgNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1taW51cy5qcwp2YXIgQ2lyY2xlTWludXM7CnZhciBpbml0X2NpcmNsZV9taW51cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLW1pbnVzLmpzIigpIHsKICAgIENpcmNsZU1pbnVzID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmg4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLW9mZi5qcwp2YXIgQ2lyY2xlT2ZmOwp2YXIgaW5pdF9jaXJjbGVfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtb2ZmLmpzIigpIHsKICAgIENpcmNsZU9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjM1IDIuNjlBMTAgMTAgMCAwIDEgMjEuMyAxNS42NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOS4wOCAxOS4wOEExMCAxMCAwIDEgMSA0LjkyIDQuOTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtcGFya2luZy5qcwp2YXIgQ2lyY2xlUGFya2luZzsKdmFyIGluaXRfY2lyY2xlX3BhcmtpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1wYXJraW5nLmpzIigpIHsKICAgIENpcmNsZVBhcmtpbmcgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE3VjdoNGEzIDMgMCAwIDEgMCA2SDkiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtcGFya2luZy1vZmYuanMKdmFyIENpcmNsZVBhcmtpbmdPZmY7CnZhciBpbml0X2NpcmNsZV9wYXJraW5nX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXBhcmtpbmctb2ZmLmpzIigpIHsKICAgIENpcmNsZVBhcmtpbmdPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMi42NTYgN0gxM2EzIDMgMCAwIDEgMi45ODQgMy4zMDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMTNIOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOS4wNzEgMTkuMDcxQTEgMSAwIDAgMSA0LjkzIDQuOTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguMzU3IDIuNjg3YTEwIDEwIDAgMCAxIDEyLjk1NiAxMi45NTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxN1Y5IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXBhdXNlLmpzCnZhciBDaXJjbGVQYXVzZTsKdmFyIGluaXRfY2lyY2xlX3BhdXNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtcGF1c2UuanMiKCkgewogICAgQ2lyY2xlUGF1c2UgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMCIsIHgyOiAiMTAiLCB5MTogIjE1IiwgeTI6ICI5IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE0IiwgeDI6ICIxNCIsIHkxOiAiMTUiLCB5MjogIjkiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtcGVyY2VudC5qcwp2YXIgQ2lyY2xlUGVyY2VudDsKdmFyIGluaXRfY2lyY2xlX3BlcmNlbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1wZXJjZW50LmpzIigpIHsKICAgIENpcmNsZVBlcmNlbnQgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA5LTYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDloLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDE1aC4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1waWxlLmpzCnZhciBDaXJjbGVQaWxlOwp2YXIgaW5pdF9jaXJjbGVfcGlsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXBpbGUuanMiKCkgewogICAgQ2lyY2xlUGlsZSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjE5IiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiNSIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYiLCBjeTogIjEyIiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIyMCIsIGN5OiAiMTkiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjQiLCBjeTogIjE5IiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI4IiwgY3k6ICIxMiIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXBsYXkuanMKdmFyIENpcmNsZVBsYXk7CnZhciBpbml0X2NpcmNsZV9wbGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtcGxheS5qcyIoKSB7CiAgICBDaXJjbGVQbGF5ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOSA5LjAwM2ExIDEgMCAwIDEgMS41MTctLjg1OWw0Ljk5NyAyLjk5N2ExIDEgMCAwIDEgMCAxLjcxOGwtNC45OTcgMi45OTdBMSAxIDAgMCAxIDkgMTQuOTk2eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1wbHVzLmpzCnZhciBDaXJjbGVQbHVzOwp2YXIgaW5pdF9jaXJjbGVfcGx1cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXBsdXMuanMiKCkgewogICAgQ2lyY2xlUGx1cyA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA4djgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtcG91bmQtc3RlcmxpbmcuanMKdmFyIENpcmNsZVBvdW5kU3Rlcmxpbmc7CnZhciBpbml0X2NpcmNsZV9wb3VuZF9zdGVybGluZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXBvdW5kLXN0ZXJsaW5nLmpzIigpIHsKICAgIENpcmNsZVBvdW5kU3RlcmxpbmcgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxNlY5LjVhMSAxIDAgMCAxIDUgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEyaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNmg3IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXBvd2VyLmpzCnZhciBDaXJjbGVQb3dlcjsKdmFyIGluaXRfY2lyY2xlX3Bvd2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtcG93ZXIuanMiKCkgewogICAgQ2lyY2xlUG93ZXIgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA3djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNy45OTggOS4wMDNhNSA1IDAgMSAwIDgtLjAwNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1xdWVzdGlvbi1tYXJrLmpzCnZhciBDaXJjbGVRdWVzdGlvbk1hcms7CnZhciBpbml0X2NpcmNsZV9xdWVzdGlvbl9tYXJrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtcXVlc3Rpb24tbWFyay5qcyIoKSB7CiAgICBDaXJjbGVRdWVzdGlvbk1hcmsgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjA5IDlhMyAzIDAgMCAxIDUuODMgMWMwIDItMyAzLTMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN2guMDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtc2xhc2gtMi5qcwp2YXIgQ2lyY2xlU2xhc2gyOwp2YXIgaW5pdF9jaXJjbGVfc2xhc2hfMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXNsYXNoLTIuanMiKCkgewogICAgQ2lyY2xlU2xhc2gyID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMiAyIDIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXNsYXNoLmpzCnZhciBDaXJjbGVTbGFzaDsKdmFyIGluaXRfY2lyY2xlX3NsYXNoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtc2xhc2guanMiKCkgewogICAgQ2lyY2xlU2xhc2ggPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI5IiwgeDI6ICIxNSIsIHkxOiAiMTUiLCB5MjogIjkiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtc21hbGwuanMKdmFyIENpcmNsZVNtYWxsOwp2YXIgaW5pdF9jaXJjbGVfc21hbGwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1zbWFsbC5qcyIoKSB7CiAgICBDaXJjbGVTbWFsbCA9IFtbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiNiIgfV1dOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtc3Rhci5qcwp2YXIgQ2lyY2xlU3RhcjsKdmFyIGluaXRfY2lyY2xlX3N0YXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1zdGFyLmpzIigpIHsKICAgIENpcmNsZVN0YXIgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMS4wNTEgNy42MTZhMSAxIDAgMCAxIDEuOTA5LjAyNGwuNzM3IDEuNDUyYTEgMSAwIDAgMCAuNzM3LjUzNWwxLjYzNC4yNTZhMSAxIDAgMCAxIC41ODggMS44MDZsLTEuMTcyIDEuMTY4YTEgMSAwIDAgMC0uMjgyLjg2NmwuMjU5IDEuNjEzYTEgMSAwIDAgMS0xLjU0MSAxLjEzNGwtMS40NjUtLjc1YTEgMSAwIDAgMC0uOTEyIDBsLTEuNDY1Ljc1YTEgMSAwIDAgMS0xLjUzOS0xLjEzM2wuMjU4LTEuNjEzYTEgMSAwIDAgMC0uMjgyLS44NjdsLTEuMTU2LTEuMTUyYTEgMSAwIDAgMSAuNTcyLTEuODIybDEuNjMzLS4yNTZhMSAxIDAgMCAwIC43MzctLjUzNXoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtc3RvcC5qcwp2YXIgQ2lyY2xlU3RvcDsKdmFyIGluaXRfY2lyY2xlX3N0b3AgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1zdG9wLmpzIigpIHsKICAgIENpcmNsZVN0b3AgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjkiLCB5OiAiOSIsIHdpZHRoOiAiNiIsIGhlaWdodDogIjYiLCByeDogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtdXNlci1yb3VuZC5qcwp2YXIgQ2lyY2xlVXNlclJvdW5kOwp2YXIgaW5pdF9jaXJjbGVfdXNlcl9yb3VuZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXVzZXItcm91bmQuanMiKCkgewogICAgQ2lyY2xlVXNlclJvdW5kID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMjBhNiA2IDAgMCAwLTEyIDAiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTAiLCByOiAiNCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS11c2VyLmpzCnZhciBDaXJjbGVVc2VyOwp2YXIgaW5pdF9jaXJjbGVfdXNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXVzZXIuanMiKCkgewogICAgQ2lyY2xlVXNlciA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEwIiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMC42NjJWMTlhMiAyIDAgMCAxIDItMmg2YTIgMiAwIDAgMSAyIDJ2MS42NjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUteC5qcwp2YXIgQ2lyY2xlWDsKdmFyIGluaXRfY2lyY2xlX3ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS14LmpzIigpIHsKICAgIENpcmNsZVggPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA5LTYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDkgNiA2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLmpzCnZhciBDaXJjbGU7CnZhciBpbml0X2NpcmNsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLmpzIigpIHsKICAgIENpcmNsZSA9IFtbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY3VpdC1ib2FyZC5qcwp2YXIgQ2lyY3VpdEJvYXJkOwp2YXIgaW5pdF9jaXJjdWl0X2JvYXJkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjdWl0LWJvYXJkLmpzIigpIHsKICAgIENpcmN1aXRCb2FyZCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDloNGEyIDIgMCAwIDAgMi0yVjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICI5IiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMXYtNGEyIDIgMCAwIDEgMi0yaDQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNSIsIGN5OiAiMTUiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpdHJ1cy5qcwp2YXIgQ2l0cnVzOwp2YXIgaW5pdF9jaXRydXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpdHJ1cy5qcyIoKSB7CiAgICBDaXRydXMgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTIxLjY2IDE3LjY3YTEuMDggMS4wOCAwIDAgMS0uMDQgMS42QTEyIDEyIDAgMCAxIDQuNzMgMi4zOGExLjEgMS4xIDAgMCAxIDEuNjEtLjA0eiIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkuNjUgMTUuNjZBOCA4IDAgMCAxIDguMzUgNC4zNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAxMC01LjUgNS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE3Ljg1VjEwSDYuMTUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbGFwcGVyYm9hcmQuanMKdmFyIENsYXBwZXJib2FyZDsKdmFyIGluaXRfY2xhcHBlcmJvYXJkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbGFwcGVyYm9hcmQuanMiKCkgewogICAgQ2xhcHBlcmJvYXJkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIuMjk2IDMuNDY0IDMuMDIgMy45NTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAuMiA2IDMgMTFsLS45LTIuNGMtLjMtMS4xLjMtMi4yIDEuMy0yLjVsMTMuNS00YzEuMS0uMyAyLjIuMyAyLjUgMS4zeiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDExaDE4djhhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYuMTggNS4yNzYgMy4xIDMuODk5IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xpcGJvYXJkLWNoZWNrLmpzCnZhciBDbGlwYm9hcmRDaGVjazsKdmFyIGluaXRfY2xpcGJvYXJkX2NoZWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbGlwYm9hcmQtY2hlY2suanMiKCkgewogICAgQ2xpcGJvYXJkQ2hlY2sgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiNCIsIHg6ICI4IiwgeTogIjIiLCByeDogIjEiLCByeTogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNGgyYTIgMiAwIDAgMSAyIDJ2MTRhMiAyIDAgMCAxLTIgMkg2YTIgMiAwIDAgMS0yLTJWNmEyIDIgMCAwIDEgMi0yaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxNCAyIDIgNC00IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xpcGJvYXJkLWNsb2NrLmpzCnZhciBDbGlwYm9hcmRDbG9jazsKdmFyIGluaXRfY2xpcGJvYXJkX2Nsb2NrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbGlwYm9hcmQtY2xvY2suanMiKCkgewogICAgQ2xpcGJvYXJkQ2xvY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNHYyLjJsMS42IDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNGgyYTIgMiAwIDAgMSAyIDJ2LjgzMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDRINmEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE2IiwgY3k6ICIxNiIsIHI6ICI2IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiOCIsIHk6ICIyIiwgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiNCIsIHJ4OiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NsaXBib2FyZC1jb3B5LmpzCnZhciBDbGlwYm9hcmRDb3B5Owp2YXIgaW5pdF9jbGlwYm9hcmRfY29weSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xpcGJvYXJkLWNvcHkuanMiKCkgewogICAgQ2xpcGJvYXJkQ29weSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICI0IiwgeDogIjgiLCB5OiAiMiIsIHJ4OiAiMSIsIHJ5OiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDRINmEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoMTJhMiAyIDAgMCAwIDItMnYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA0aDJhMiAyIDAgMCAxIDIgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE0SDExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDEwLTQgNCA0IDQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbGlwYm9hcmQtbGlzdC5qcwp2YXIgQ2xpcGJvYXJkTGlzdDsKdmFyIGluaXRfY2xpcGJvYXJkX2xpc3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NsaXBib2FyZC1saXN0LmpzIigpIHsKICAgIENsaXBib2FyZExpc3QgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiNCIsIHg6ICI4IiwgeTogIjIiLCByeDogIjEiLCByeTogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNGgyYTIgMiAwIDAgMSAyIDJ2MTRhMiAyIDAgMCAxLTIgMkg2YTIgMiAwIDAgMS0yLTJWNmEyIDIgMCAwIDEgMi0yaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTFoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNmg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTFoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTZoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xpcGJvYXJkLW1pbnVzLmpzCnZhciBDbGlwYm9hcmRNaW51czsKdmFyIGluaXRfY2xpcGJvYXJkX21pbnVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbGlwYm9hcmQtbWludXMuanMiKCkgewogICAgQ2xpcGJvYXJkTWludXMgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiNCIsIHg6ICI4IiwgeTogIjIiLCByeDogIjEiLCByeTogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNGgyYTIgMiAwIDAgMSAyIDJ2MTRhMiAyIDAgMCAxLTIgMkg2YTIgMiAwIDAgMS0yLTJWNmEyIDIgMCAwIDEgMi0yaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNGg2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xpcGJvYXJkLXBhc3RlLmpzCnZhciBDbGlwYm9hcmRQYXN0ZTsKdmFyIGluaXRfY2xpcGJvYXJkX3Bhc3RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbGlwYm9hcmQtcGFzdGUuanMiKCkgewogICAgQ2xpcGJvYXJkUGFzdGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxNGgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA0aDJhMiAyIDAgMCAxIDIgMnYxLjM0NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAxOCA0LTQtNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggNEg2YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMS43OTMtMS4xMTMiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI4IiwgeTogIjIiLCB3aWR0aDogIjgiLCBoZWlnaHQ6ICI0Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xpcGJvYXJkLXBlbi1saW5lLmpzCnZhciBDbGlwYm9hcmRQZW5MaW5lOwp2YXIgaW5pdF9jbGlwYm9hcmRfcGVuX2xpbmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NsaXBib2FyZC1wZW4tbGluZS5qcyIoKSB7CiAgICBDbGlwYm9hcmRQZW5MaW5lID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiOCIsIGhlaWdodDogIjQiLCB4OiAiOCIsIHk6ICIyIiwgcng6ICIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggNEg2YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0ydi0uNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA0aDJhMiAyIDAgMCAxIDEuNzMgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE4aDEiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEuMzc4IDEyLjYyNmExIDEgMCAwIDAtMy4wMDQtMy4wMDRsLTQuMDEgNC4wMTJhMiAyIDAgMCAwLS41MDYuODU0bC0uODM3IDIuODdhLjUuNSAwIDAgMCAuNjIuNjJsMi44Ny0uODM3YTIgMiAwIDAgMCAuODU0LS41MDZ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xpcGJvYXJkLXBlbi5qcwp2YXIgQ2xpcGJvYXJkUGVuOwp2YXIgaW5pdF9jbGlwYm9hcmRfcGVuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbGlwYm9hcmQtcGVuLmpzIigpIHsKICAgIENsaXBib2FyZFBlbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDRoMmEyIDIgMCAwIDEgMiAydjIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEuMzQgMTUuNjY0YTEgMSAwIDEgMC0zLjAwNC0zLjAwNGwtNS4wMSA1LjAxMmEyIDIgMCAwIDAtLjUwNi44NTRsLS44MzcgMi44N2EuNS41IDAgMCAwIC42Mi42MmwyLjg3LS44MzdhMiAyIDAgMCAwIC44NTQtLjUwNnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAyMkg2YTIgMiAwIDAgMS0yLTJWNmEyIDIgMCAwIDEgMi0yaDIiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI4IiwgeTogIjIiLCB3aWR0aDogIjgiLCBoZWlnaHQ6ICI0Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xpcGJvYXJkLXBsdXMuanMKdmFyIENsaXBib2FyZFBsdXM7CnZhciBpbml0X2NsaXBib2FyZF9wbHVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbGlwYm9hcmQtcGx1cy5qcyIoKSB7CiAgICBDbGlwYm9hcmRQbHVzID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiOCIsIGhlaWdodDogIjQiLCB4OiAiOCIsIHk6ICIyIiwgcng6ICIxIiwgcnk6ICIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDRoMmEyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDJINmEyIDIgMCAwIDEtMi0yVjZhMiAyIDAgMCAxIDItMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTRoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN3YtNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NsaXBib2FyZC10eXBlLmpzCnZhciBDbGlwYm9hcmRUeXBlOwp2YXIgaW5pdF9jbGlwYm9hcmRfdHlwZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xpcGJvYXJkLXR5cGUuanMiKCkgewogICAgQ2xpcGJvYXJkVHlwZSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICI0IiwgeDogIjgiLCB5OiAiMiIsIHJ4OiAiMSIsIHJ5OiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA0aDJhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEtMiAySDZhMiAyIDAgMCAxLTItMlY2YTIgMiAwIDAgMSAyLTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDEydi0xaDZ2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxN2gyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDExdjYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbGlwYm9hcmQteC5qcwp2YXIgQ2xpcGJvYXJkWDsKdmFyIGluaXRfY2xpcGJvYXJkX3ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NsaXBib2FyZC14LmpzIigpIHsKICAgIENsaXBib2FyZFggPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiNCIsIHg6ICI4IiwgeTogIjIiLCByeDogIjEiLCByeTogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNGgyYTIgMiAwIDAgMSAyIDJ2MTRhMiAyIDAgMCAxLTIgMkg2YTIgMiAwIDAgMS0yLTJWNmEyIDIgMCAwIDEgMi0yaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgMTEtNiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTEgNiA2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xpcGJvYXJkLmpzCnZhciBDbGlwYm9hcmQ7CnZhciBpbml0X2NsaXBib2FyZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xpcGJvYXJkLmpzIigpIHsKICAgIENsaXBib2FyZCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICI0IiwgeDogIjgiLCB5OiAiMiIsIHJ4OiAiMSIsIHJ5OiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA0aDJhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEtMiAySDZhMiAyIDAgMCAxLTItMlY2YTIgMiAwIDAgMSAyLTJoMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb2NrLTEuanMKdmFyIENsb2NrMTsKdmFyIGluaXRfY2xvY2tfMSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stMS5qcyIoKSB7CiAgICBDbG9jazEgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2djZsMi00IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stMTAuanMKdmFyIENsb2NrMTA7CnZhciBpbml0X2Nsb2NrXzEwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9jay0xMC5qcyIoKSB7CiAgICBDbG9jazEwID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnY2bC00LTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9jay0xMS5qcwp2YXIgQ2xvY2sxMTsKdmFyIGluaXRfY2xvY2tfMTEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb2NrLTExLmpzIigpIHsKICAgIENsb2NrMTEgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2djZsLTItNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb2NrLTEyLmpzCnZhciBDbG9jazEyOwp2YXIgaW5pdF9jbG9ja18xMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stMTIuanMiKCkgewogICAgQ2xvY2sxMiA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZ2NiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb2NrLTMuanMKdmFyIENsb2NrMzsKdmFyIGluaXRfY2xvY2tfMyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stMy5qcyIoKSB7CiAgICBDbG9jazMgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2djZoNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb2NrLTIuanMKdmFyIENsb2NrMjsKdmFyIGluaXRfY2xvY2tfMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stMi5qcyIoKSB7CiAgICBDbG9jazIgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2djZsNC0yIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stNC5qcwp2YXIgQ2xvY2s0Owp2YXIgaW5pdF9jbG9ja180ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9jay00LmpzIigpIHsKICAgIENsb2NrNCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZ2Nmw0IDIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9jay01LmpzCnZhciBDbG9jazU7CnZhciBpbml0X2Nsb2NrXzUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb2NrLTUuanMiKCkgewogICAgQ2xvY2s1ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnY2bDIgNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb2NrLTYuanMKdmFyIENsb2NrNjsKdmFyIGluaXRfY2xvY2tfNiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stNi5qcyIoKSB7CiAgICBDbG9jazYgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2djEwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stNy5qcwp2YXIgQ2xvY2s3Owp2YXIgaW5pdF9jbG9ja183ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9jay03LmpzIigpIHsKICAgIENsb2NrNyA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZ2NmwtMiA0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stOS5qcwp2YXIgQ2xvY2s5Owp2YXIgaW5pdF9jbG9ja185ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9jay05LmpzIigpIHsKICAgIENsb2NrOSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZ2Nkg4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stOC5qcwp2YXIgQ2xvY2s4Owp2YXIgaW5pdF9jbG9ja184ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9jay04LmpzIigpIHsKICAgIENsb2NrOCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZ2NmwtNCAyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stYWxlcnQuanMKdmFyIENsb2NrQWxlcnQ7CnZhciBpbml0X2Nsb2NrX2FsZXJ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9jay1hbGVydC5qcyIoKSB7CiAgICBDbG9ja0FsZXJ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnY2bDQgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxMnY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDIxaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMS4yNSA4LjJBMTAgMTAgMCAxIDAgMTYgMjEuMTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9jay1hcnJvdy1kb3duLmpzCnZhciBDbG9ja0Fycm93RG93bjsKdmFyIGluaXRfY2xvY2tfYXJyb3dfZG93biA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stYXJyb3ctZG93bi5qcyIoKSB7CiAgICBDbG9ja0Fycm93RG93biA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZ2NmwyIDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIuMzM3IDIxLjk5NGExMCAxMCAwIDEgMSA5LjU4OC04Ljc2NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAxOCA0IDQgNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE0djgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9jay1hcnJvdy11cC5qcwp2YXIgQ2xvY2tBcnJvd1VwOwp2YXIgaW5pdF9jbG9ja19hcnJvd191cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stYXJyb3ctdXAuanMiKCkgewogICAgQ2xvY2tBcnJvd1VwID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnY2bDEuNTYuNzgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMuMjI3IDIxLjkyNWExMCAxMCAwIDEgMSA4Ljc2Ny05LjU4OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAxOCA0LTQgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDIydi04IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stY2hlY2suanMKdmFyIENsb2NrQ2hlY2s7CnZhciBpbml0X2Nsb2NrX2NoZWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9jay1jaGVjay5qcyIoKSB7CiAgICBDbG9ja0NoZWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnY2bDQgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxMmExMCAxMCAwIDEgMC0xMSA5Ljk1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDE2LTUuNSA1LjVMMTQgMTkiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9jay1mYWRpbmcuanMKdmFyIENsb2NrRmFkaW5nOwp2YXIgaW5pdF9jbG9ja19mYWRpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb2NrLWZhZGluZy5qcyIoKSB7CiAgICBDbG9ja0ZhZGluZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJhMTAgMTAgMCAwIDEgNy4zOCAxNi43NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2djZsNCAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIuNSA4Ljg3NWExMCAxMCAwIDAgMC0uNSAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIuODMgMTZhMTAgMTAgMCAwIDAgMi40MyAzLjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC42MzYgNS4yMzVhMTAgMTAgMCAwIDEgLjg5MS0uODU3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguNjQ0IDIxLjQyYTEwIDEwIDAgMCAwIDcuNjMxLS4zOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb2NrLXBsdXMuanMKdmFyIENsb2NrUGx1czsKdmFyIGluaXRfY2xvY2tfcGx1cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stcGx1cy5qcyIoKSB7CiAgICBDbG9ja1BsdXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2djZsMy42NDQgMS44MjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTloNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxNnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxLjkyIDEzLjI2N2ExMCAxMCAwIDEgMC04LjY1MyA4LjY1MyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb2NrLmpzCnZhciBDbG9jazsKdmFyIGluaXRfY2xvY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb2NrLmpzIigpIHsKICAgIENsb2NrID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnY2bDQgMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb3VkLWFsZXJ0LmpzCnZhciBDbG91ZEFsZXJ0Owp2YXIgaW5pdF9jbG91ZF9hbGVydCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtYWxlcnQuanMiKCkgewogICAgQ2xvdWRBbGVydCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjBoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguMTI4IDE2Ljk0OUE3IDcgMCAxIDEgMTUuNzEgOGgxLjc5YTEgMSAwIDAgMSAwIDloLTEuNjQyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvc2VkLWNhcHRpb24uanMKdmFyIENsb3NlZENhcHRpb247CnZhciBpbml0X2Nsb3NlZF9jYXB0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9zZWQtY2FwdGlvbi5qcyIoKSB7CiAgICBDbG9zZWRDYXB0aW9uID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOS4xN2EzIDMgMCAxIDAgMCA1LjY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDkuMTdhMyAzIDAgMSAwIDAgNS42NiIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjIiLCB5OiAiNSIsIHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxNCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb3VkLWJhY2t1cC5qcwp2YXIgQ2xvdWRCYWNrdXA7CnZhciBpbml0X2Nsb3VkX2JhY2t1cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtYmFja3VwLmpzIigpIHsKICAgIENsb3VkQmFja3VwID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTUuMjUxQTQuNSA0LjUgMCAwIDAgMTcuNSA4aC0xLjc5QTcgNyAwIDEgMCAzIDEzLjYwNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDExdjRoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE5YTUgNSAwIDAgMCA5LTMgNC41IDQuNSAwIDAgMC00LjUtNC41IDQuODIgNC44MiAwIDAgMC0zLjQxIDEuNDFMNyAxNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb3VkLWNoZWNrLmpzCnZhciBDbG91ZENoZWNrOwp2YXIgaW5pdF9jbG91ZF9jaGVjayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtY2hlY2suanMiKCkgewogICAgQ2xvdWRDaGVjayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDE1LTUuNSA1LjVMOSAxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01LjUxNiAxNi4wN0E3IDcgMCAxIDEgMTUuNzEgOGgxLjc5YTQuNSA0LjUgMCAwIDEgMy41MDEgNy4zMjciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC1jb2cuanMKdmFyIENsb3VkQ29nOwp2YXIgaW5pdF9jbG91ZF9jb2cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb3VkLWNvZy5qcyIoKSB7CiAgICBDbG91ZENvZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEwLjg1MiAxOS43NzItLjM4My45MjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMuMTQ4IDE0LjIyOC4zODMtLjkyMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMy4xNDggMTkuNzcyYTMgMyAwIDEgMC0yLjI5Ni01LjU0NGwtLjM4My0uOTIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEzLjUzIDIwLjY5Ni0uMzgyLS45MjRhMyAzIDAgMSAxLTIuMjk2LTUuNTQ0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0Ljc3MiAxNS44NTIuOTIzLS4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuNzcyIDE4LjE0OC45MjMuMzgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQuMiAxNS4xYTcgNyAwIDEgMSA5LjkzLTkuODU4QTcgNyAwIDAgMSAxNS43MSA4aDEuNzlhNC41IDQuNSAwIDAgMSAyLjUgOC4yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkuMjI4IDE1Ljg1Mi0uOTIzLS4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOS4yMjggMTguMTQ4LS45MjMuMzgzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtZG93bmxvYWQuanMKdmFyIENsb3VkRG93bmxvYWQ7CnZhciBpbml0X2Nsb3VkX2Rvd25sb2FkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC1kb3dubG9hZC5qcyIoKSB7CiAgICBDbG91ZERvd25sb2FkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTN2OGwtNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDIxIDQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00LjM5MyAxNS4yNjlBNyA3IDAgMSAxIDE1LjcxIDhoMS43OWE0LjUgNC41IDAgMCAxIDIuNDM2IDguMjg0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtZHJpenpsZS5qcwp2YXIgQ2xvdWREcml6emxlOwp2YXIgaW5pdF9jbG91ZF9kcml6emxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC1kcml6emxlLmpzIigpIHsKICAgIENsb3VkRHJpenpsZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTQuODk5QTcgNyAwIDEgMSAxNS43MSA4aDEuNzlhNC41IDQuNSAwIDAgMSAyLjUgOC4yNDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxOXYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTR2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxOXYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE0djEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjF2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNnYxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtZm9nLmpzCnZhciBDbG91ZEZvZzsKdmFyIGluaXRfY2xvdWRfZm9nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC1mb2cuanMiKCkgewogICAgQ2xvdWRGb2cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE0Ljg5OUE3IDcgMCAxIDEgMTUuNzEgOGgxLjc5YTQuNSA0LjUgMCAwIDEgMi41IDguMjQyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE3SDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMjFIOSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb3VkLWhhaWwuanMKdmFyIENsb3VkSGFpbDsKdmFyIGluaXRfY2xvdWRfaGFpbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtaGFpbC5qcyIoKSB7CiAgICBDbG91ZEhhaWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE0Ljg5OUE3IDcgMCAxIDEgMTUuNzEgOGgxLjc5YTQuNSA0LjUgMCAwIDEgMi41IDguMjQyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE0djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDIwaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIwaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIyaC4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb3VkLWxpZ2h0bmluZy5qcwp2YXIgQ2xvdWRMaWdodG5pbmc7CnZhciBpbml0X2Nsb3VkX2xpZ2h0bmluZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtbGlnaHRuaW5nLmpzIigpIHsKICAgIENsb3VkTGlnaHRuaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxNi4zMjZBNyA3IDAgMSAxIDE1LjcxIDhoMS43OWE0LjUgNC41IDAgMCAxIC41IDguOTczIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEzIDEyLTMgNWg0bC0zIDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC1tb29uLXJhaW4uanMKdmFyIENsb3VkTW9vblJhaW47CnZhciBpbml0X2Nsb3VkX21vb25fcmFpbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtbW9vbi1yYWluLmpzIigpIHsKICAgIENsb3VkTW9vblJhaW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAyMHYyIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE4LjM3NiAxNC41MTJhNiA2IDAgMCAwIDMuNDYxLTQuMTI3Yy4xNDgtLjYyNS0uNjU5LS45Ny0xLjI0OC0uNzE0YTQgNCAwIDAgMS01LjI1OS01LjI2Yy4yNTUtLjU4OS0uMDktMS4zOTUtLjcxNi0xLjI0OGE2IDYgMCAwIDAtNC41OTQgNS4zNiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDIwYTUgNSAwIDEgMSA4LjktNEgxM2EzIDMgMCAwIDEgMiA1LjI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTl2MiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb3VkLW1vb24uanMKdmFyIENsb3VkTW9vbjsKdmFyIGluaXRfY2xvdWRfbW9vbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtbW9vbi5qcyIoKSB7CiAgICBDbG91ZE1vb24gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxNmEzIDMgMCAwIDEgMCA2SDdhNSA1IDAgMSAxIDQuOS02eiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOC4zNzYgMTQuNTEyYTYgNiAwIDAgMCAzLjQ2MS00LjEyN2MuMTQ4LS42MjUtLjY1OS0uOTctMS4yNDgtLjcxNGE0IDQgMCAwIDEtNS4yNTktNS4yNmMuMjU1LS41ODktLjA5LTEuMzk1LS43MTYtMS4yNDhhNiA2IDAgMCAwLTQuNTk0IDUuMzYiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC1vZmYuanMKdmFyIENsb3VkT2ZmOwp2YXIgaW5pdF9jbG91ZF9vZmYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb3VkLW9mZi5qcyIoKSB7CiAgICBDbG91ZE9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjk0IDUuMjc0QTcgNyAwIDAgMSAxNS43MSAxMGgxLjc5YTQuNSA0LjUgMCAwIDEgNC4yMjIgNi4wNTciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTguNzk2IDE4LjgxQTQuNSA0LjUgMCAwIDEgMTcuNSAxOUg5QTcgNyAwIDAgMSA1Ljc5IDUuNzgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtcmFpbi13aW5kLmpzCnZhciBDbG91ZFJhaW5XaW5kOwp2YXIgaW5pdF9jbG91ZF9yYWluX3dpbmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb3VkLXJhaW4td2luZC5qcyIoKSB7CiAgICBDbG91ZFJhaW5XaW5kID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxNC44OTlBNyA3IDAgMSAxIDE1LjcxIDhoMS43OWE0LjUgNC41IDAgMCAxIDIuNSA4LjI0MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05LjIgMjIgMy03IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTMtMyA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDEzLTMgNyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb3VkLXJhaW4uanMKdmFyIENsb3VkUmFpbjsKdmFyIGluaXRfY2xvdWRfcmFpbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtcmFpbi5qcyIoKSB7CiAgICBDbG91ZFJhaW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE0Ljg5OUE3IDcgMCAxIDEgMTUuNzEgOGgxLjc5YTQuNSA0LjUgMCAwIDEgMi41IDguMjQyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE0djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNHY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE2djYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC1zbm93LmpzCnZhciBDbG91ZFNub3c7CnZhciBpbml0X2Nsb3VkX3Nub3cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb3VkLXNub3cuanMiKCkgewogICAgQ2xvdWRTbm93ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxNC44OTlBNyA3IDAgMSAxIDE1LjcxIDhoMS43OWE0LjUgNC41IDAgMCAxIDIuNSA4LjI0MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE1aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE5aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjFoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE1aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxOWguMDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC1zdW4tcmFpbi5qcwp2YXIgQ2xvdWRTdW5SYWluOwp2YXIgaW5pdF9jbG91ZF9zdW5fcmFpbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtc3VuLXJhaW4uanMiKCkgewogICAgQ2xvdWRTdW5SYWluID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTQuOTMgNC45MyAxLjQxIDEuNDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOS4wNyA0LjkzLTEuNDEgMS40MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNS45NDcgMTIuNjVhNCA0IDAgMCAwLTUuOTI1LTQuMTI4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMjBhNSA1IDAgMSAxIDguOS00SDEzYTMgMyAwIDAgMSAyIDUuMjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMjB2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE5djIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC1zeW5jLmpzCnZhciBDbG91ZFN5bmM7CnZhciBpbml0X2Nsb3VkX3N5bmMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb3VkLXN5bmMuanMiKCkgewogICAgQ2xvdWRTeW5jID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMTgtMS41MzUgMS42MDVhNSA1IDAgMCAxLTgtMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDIydi00aC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwLjk5NiAxNS4yNTFBNC41IDQuNSAwIDAgMCAxNy40OTUgOGgtMS43OWE3IDcgMCAxIDAtMTIuNzA5IDUuNjA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTB2NGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMTQgMS41MzUtMS42MDVhNSA1IDAgMCAxIDggMS41IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtc3VuLmpzCnZhciBDbG91ZFN1bjsKdmFyIGluaXRfY2xvdWRfc3VuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC1zdW4uanMiKCkgewogICAgQ2xvdWRTdW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNC45MyA0LjkzIDEuNDEgMS40MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5LjA3IDQuOTMtMS40MSAxLjQxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1Ljk0NyAxMi42NWE0IDQgMCAwIDAtNS45MjUtNC4xMjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMjJIN2E1IDUgMCAxIDEgNC45LTZIMTNhMyAzIDAgMCAxIDAgNloiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC5qcwp2YXIgQ2xvdWQ7CnZhciBpbml0X2Nsb3VkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC5qcyIoKSB7CiAgICBDbG91ZCA9IFtbInBhdGgiLCB7IGQ6ICJNMTcuNSAxOUg5YTcgNyAwIDEgMSA2LjcxLTloMS43OWE0LjUgNC41IDAgMSAxIDAgOVoiIH1dXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtdXBsb2FkLmpzCnZhciBDbG91ZFVwbG9hZDsKdmFyIGluaXRfY2xvdWRfdXBsb2FkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC11cGxvYWQuanMiKCkgewogICAgQ2xvdWRVcGxvYWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxM3Y4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTQuODk5QTcgNyAwIDEgMSAxNS43MSA4aDEuNzlhNC41IDQuNSAwIDAgMSAyLjUgOC4yNDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAxNyA0LTQgNCA0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWR5LmpzCnZhciBDbG91ZHk7CnZhciBpbml0X2Nsb3VkeSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWR5LmpzIigpIHsKICAgIENsb3VkeSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjUgMTJhMSAxIDAgMSAxIDAgOUg5LjAwNmE3IDcgMCAxIDEgNi43MDItOXoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEuODMyIDlBMyAzIDAgMCAwIDE5IDdoLTIuMjA3YTUuNSA1LjUgMCAwIDAtMTAuNzIuNjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG92ZXIuanMKdmFyIENsb3ZlcjsKdmFyIGluaXRfY2xvdmVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG92ZXIuanMiKCkgewogICAgQ2xvdmVyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYuMTcgNy44MyAyIDIyIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQuMDIgMTJhMi44MjcgMi44MjcgMCAxIDEgMy44MS00LjE3QTIuODI3IDIuODI3IDAgMSAxIDEyIDQuMDJhMi44MjcgMi44MjcgMCAxIDEgNC4xNyAzLjgxQTIuODI3IDIuODI3IDAgMSAxIDE5Ljk4IDEyYTIuODI3IDIuODI3IDAgMSAxLTMuODEgNC4xN0EyLjgyNyAyLjgyNyAwIDEgMSAxMiAxOS45OGEyLjgyNyAyLjgyNyAwIDEgMS00LjE3LTMuODFBMSAxIDAgMSAxIDQgMTIiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNy44MyA3LjgzIDguMzQgOC4zNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NsdWIuanMKdmFyIENsdWI7CnZhciBpbml0X2NsdWIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NsdWIuanMiKCkgewogICAgQ2x1YiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTcuMjggOS4wNWE1LjUgNS41IDAgMSAwLTEwLjU2IDBBNS41IDUuNSAwIDEgMCAxMiAxNy42NmE1LjUgNS41IDAgMSAwIDUuMjgtOC42WiIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTcuNjZMMTIgMjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb2RlLXhtbC5qcwp2YXIgQ29kZVhtbDsKdmFyIGluaXRfY29kZV94bWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvZGUteG1sLmpzIigpIHsKICAgIENvZGVYbWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOCAxNiA0LTQtNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYgOC00IDQgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0LjUgNC01IDE2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29kZS5qcwp2YXIgQ29kZTsKdmFyIGluaXRfY29kZTQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvZGUuanMiKCkgewogICAgQ29kZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDE4IDYtNi02LTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCA2LTYgNiA2IDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb2RlcGVuLmpzCnZhciBDb2RlcGVuOwp2YXIgaW5pdF9jb2RlcGVuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb2RlcGVuLmpzIigpIHsKICAgIENvZGVwZW4gPSBbCiAgICAgIFsicG9seWdvbiIsIHsgcG9pbnRzOiAiMTIgMiAyMiA4LjUgMjIgMTUuNSAxMiAyMiAyIDE1LjUgMiA4LjUgMTIgMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTIiLCB5MTogIjIyIiwgeTI6ICIxNS41IiB9XSwKICAgICAgWyJwb2x5bGluZSIsIHsgcG9pbnRzOiAiMjIgOC41IDEyIDE1LjUgMiA4LjUiIH1dLAogICAgICBbInBvbHlsaW5lIiwgeyBwb2ludHM6ICIyIDE1LjUgMTIgOC41IDIyIDE1LjUiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICIyIiwgeTI6ICI4LjUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb2Rlc2FuZGJveC5qcwp2YXIgQ29kZXNhbmRib3g7CnZhciBpbml0X2NvZGVzYW5kYm94ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb2Rlc2FuZGJveC5qcyIoKSB7CiAgICBDb2Rlc2FuZGJveCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxIDE2VjhhMiAyIDAgMCAwLTEtMS43M2wtNy00YTIgMiAwIDAgMC0yIDBsLTcgNEEyIDIgMCAwIDAgMyA4djhhMiAyIDAgMCAwIDEgMS43M2w3IDRhMiAyIDAgMCAwIDIgMGw3LTRBMiAyIDAgMCAwIDIxIDE2eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicG9seWxpbmUiLCB7IHBvaW50czogIjcuNSA0LjIxIDEyIDYuODEgMTYuNSA0LjIxIiB9XSwKICAgICAgWyJwb2x5bGluZSIsIHsgcG9pbnRzOiAiNy41IDE5Ljc5IDcuNSAxNC42IDMgMTIiIH1dLAogICAgICBbInBvbHlsaW5lIiwgeyBwb2ludHM6ICIyMSAxMiAxNi41IDE0LjYgMTYuNSAxOS43OSIgfV0sCiAgICAgIFsicG9seWxpbmUiLCB7IHBvaW50czogIjMuMjcgNi45NiAxMiAxMi4wMSAyMC43MyA2Ljk2IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEyIiwgeDI6ICIxMiIsIHkxOiAiMjIuMDgiLCB5MjogIjEyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29mZmVlLmpzCnZhciBDb2ZmZWU7CnZhciBpbml0X2NvZmZlZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29mZmVlLmpzIigpIHsKICAgIENvZmZlZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTYgOGExIDEgMCAwIDEgMSAxdjhhNCA0IDAgMCAxLTQgNEg3YTQgNCAwIDAgMS00LTRWOWExIDEgMCAwIDEgMS0xaDE0YTQgNCAwIDEgMSAwIDhoLTEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAydjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb2cuanMKdmFyIENvZzsKdmFyIGluaXRfY29nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb2cuanMiKCkgewogICAgQ29nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTAuMjcgNyAzLjM0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTExIDEzLjczLTQgNi45MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMnYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTJoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAyMC42Ni0xLTEuNzMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMy4zNC0xIDEuNzMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwLjY2IDE3LTEuNzMtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMC42NiA3LTEuNzMgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0zLjM0IDE3IDEuNzMtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0zLjM0IDcgMS43MyAxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvaW5zLmpzCnZhciBDb2luczsKdmFyIGluaXRfY29pbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvaW5zLmpzIigpIHsKICAgIENvaW5zID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMuNzQ0IDE3LjczNmE2IDYgMCAxIDEtNy40OC03LjQ4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDZoMXY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYuMTM0IDE0Ljc2OC44NjYtLjUgMiAzLjQ2NCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE2IiwgY3k6ICI4IiwgcjogIjYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb2x1bW5zLTIuanMKdmFyIENvbHVtbnMyOwp2YXIgaW5pdF9jb2x1bW5zXzIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvbHVtbnMtMi5qcyIoKSB7CiAgICBDb2x1bW5zMiA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDN2MTgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb2x1bW5zLTMtY29nLmpzCnZhciBDb2x1bW5zM0NvZzsKdmFyIGluaXRfY29sdW1uc18zX2NvZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29sdW1ucy0zLWNvZy5qcyIoKSB7CiAgICBDb2x1bW5zM0NvZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjUgMjFINWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmgxNGEyIDIgMCAwIDEgMiAydjUuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC4zIDE5LjYgMS0uNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAzdjcuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNS4yIDE2LjktLjktLjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYuNiAyMS43LjMtLjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYuOCAxNS4zLS40LTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkuMSAxNS4yLjMtLjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkuNiAyMS43LS40LTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAuNyAxNi44IDEtLjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEuNyAxOS40LS45LS4zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgM3YxOCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICIxOCIsIHI6ICIzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29sdW1ucy0zLmpzCnZhciBDb2x1bW5zMzsKdmFyIGluaXRfY29sdW1uc18zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb2x1bW5zLTMuanMiKCkgewogICAgQ29sdW1uczMgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDN2MTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgM3YxOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvbHVtbnMtNC5qcwp2YXIgQ29sdW1uczQ7CnZhciBpbml0X2NvbHVtbnNfNCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29sdW1ucy00LmpzIigpIHsKICAgIENvbHVtbnM0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNy41IDN2MTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgM3YxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNi41IDN2MTgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb21iaW5lLmpzCnZhciBDb21iaW5lOwp2YXIgaW5pdF9jb21iaW5lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb21iaW5lLmpzIigpIHsKICAgIENvbWJpbmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAzYTEgMSAwIDAgMSAxIDF2NWExIDEgMCAwIDEtMSAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDNhMSAxIDAgMCAxIDEgMXY1YTEgMSAwIDAgMS0xIDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNyAxNSAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNyAyMSAzLTNINWEyIDIgMCAwIDEtMi0ydi0yIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMTQiLCB5OiAiMTQiLCB3aWR0aDogIjciLCBoZWlnaHQ6ICI3Iiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICIzIiwgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiNyIsIHJ4OiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvbW1hbmQuanMKdmFyIENvbW1hbmQ7CnZhciBpbml0X2NvbW1hbmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvbW1hbmQuanMiKCkgewogICAgQ29tbWFuZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDZ2MTJhMyAzIDAgMSAwIDMtM0g2YTMgMyAwIDEgMCAzIDNWNmEzIDMgMCAxIDAtMyAzaDEyYTMgMyAwIDEgMC0zLTMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb21wYXNzLmpzCnZhciBDb21wYXNzOwp2YXIgaW5pdF9jb21wYXNzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb21wYXNzLmpzIigpIHsKICAgIENvbXBhc3MgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xNi4yNCA3Ljc2LTEuODA0IDUuNDExYTIgMiAwIDAgMS0xLjI2NSAxLjI2NUw3Ljc2IDE2LjI0bDEuODA0LTUuNDExYTIgMiAwIDAgMSAxLjI2NS0xLjI2NXoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb21wb25lbnQuanMKdmFyIENvbXBvbmVudDsKdmFyIGluaXRfY29tcG9uZW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb21wb25lbnQuanMiKCkgewogICAgQ29tcG9uZW50ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTUuNTM2IDExLjI5M2ExIDEgMCAwIDAgMCAxLjQxNGwyLjM3NiAyLjM3N2ExIDEgMCAwIDAgMS40MTQgMGwyLjM3Ny0yLjM3N2ExIDEgMCAwIDAgMC0xLjQxNGwtMi4zNzctMi4zNzdhMSAxIDAgMCAwLTEuNDE0IDB6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuMjk3IDExLjI5M2ExIDEgMCAwIDAgMCAxLjQxNGwyLjM3NyAyLjM3N2ExIDEgMCAwIDAgMS40MTQgMGwyLjM3Ny0yLjM3N2ExIDEgMCAwIDAgMC0xLjQxNEw2LjA4OCA4LjkxNmExIDEgMCAwIDAtMS40MTQgMHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOC45MTYgMTcuOTEyYTEgMSAwIDAgMCAwIDEuNDE1bDIuMzc3IDIuMzc2YTEgMSAwIDAgMCAxLjQxNCAwbDIuMzc3LTIuMzc2YTEgMSAwIDAgMCAwLTEuNDE1bC0yLjM3Ny0yLjM3NmExIDEgMCAwIDAtMS40MTQgMHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOC45MTYgNC42NzRhMSAxIDAgMCAwIDAgMS40MTRsMi4zNzcgMi4zNzZhMSAxIDAgMCAwIDEuNDE0IDBsMi4zNzctMi4zNzZhMSAxIDAgMCAwIDAtMS40MTRsLTIuMzc3LTIuMzc3YTEgMSAwIDAgMC0xLjQxNCAweiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvbmNpZXJnZS1iZWxsLmpzCnZhciBDb25jaWVyZ2VCZWxsOwp2YXIgaW5pdF9jb25jaWVyZ2VfYmVsbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29uY2llcmdlLWJlbGwuanMiKCkgewogICAgQ29uY2llcmdlQmVsbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMjBhMSAxIDAgMCAxLTEtMXYtMWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ2MWExIDEgMCAwIDEtMSAxWiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxNmE4IDggMCAxIDAtMTYgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA0djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgNGg0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29tcHV0ZXIuanMKdmFyIENvbXB1dGVyOwp2YXIgaW5pdF9jb21wdXRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29tcHV0ZXIuanMiKCkgewogICAgQ29tcHV0ZXIgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNCIsIGhlaWdodDogIjgiLCB4OiAiNSIsIHk6ICIyIiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiOCIsIHg6ICIyIiwgeTogIjE0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMThoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOGg2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29uZS5qcwp2YXIgQ29uZTsKdmFyIGluaXRfY29uZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29uZS5qcyIoKSB7CiAgICBDb25lID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAuOSAxOC41NS04LTE1Ljk4YTEgMSAwIDAgMC0xLjggMGwtOCAxNS45OCIgfV0sCiAgICAgIFsiZWxsaXBzZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTkiLCByeDogIjkiLCByeTogIjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb25zdHJ1Y3Rpb24uanMKdmFyIENvbnN0cnVjdGlvbjsKdmFyIGluaXRfY29uc3RydWN0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb25zdHJ1Y3Rpb24uanMiKCkgewogICAgQ29uc3RydWN0aW9uID0gWwogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjYiLCB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiOCIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxNHY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTR2NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAzdjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAzdjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTQgMi4zIDYuMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCA2IDcuNyA3LjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCA2IDggOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvbnRhY3Qtcm91bmQuanMKdmFyIENvbnRhY3RSb3VuZDsKdmFyIGluaXRfY29udGFjdF9yb3VuZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29udGFjdC1yb3VuZC5qcyIoKSB7CiAgICBDb250YWN0Um91bmQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuOTE1IDIyYTYgNiAwIDAgMC0xMiAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMnYyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjQiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIzIiwgeTogIjQiLCB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb250YWN0LmpzCnZhciBDb250YWN0Owp2YXIgaW5pdF9jb250YWN0MiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29udGFjdC5qcyIoKSB7CiAgICBDb250YWN0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjJ2LTJhMiAyIDAgMCAxIDItMmg2YTIgMiAwIDAgMSAyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2MiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMSIsIHI6ICIzIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICI0Iiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4Iiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29udGFpbmVyLmpzCnZhciBDb250YWluZXI7CnZhciBpbml0X2NvbnRhaW5lcjMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvbnRhaW5lci5qcyIoKSB7CiAgICBDb250YWluZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMiA3LjdjMC0uNi0uNC0xLjItLjgtMS41bC02LjMtMy45YTEuNzIgMS43MiAwIDAgMC0xLjcgMGwtMTAuMyA2Yy0uNS4yLS45LjgtLjkgMS40djYuNmMwIC41LjQgMS4yLjggMS41bDYuMyAzLjlhMS43MiAxLjcyIDAgMCAwIDEuNyAwbDEwLjMtNmMuNS0uMy45LTEgLjktMS41WiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAyMS45VjE0TDIuMSA5LjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgMTQgMTEuOS02LjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTkuOHYtOC4xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE3LjVWOS40IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29udHJhc3QuanMKdmFyIENvbnRyYXN0Owp2YXIgaW5pdF9jb250cmFzdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29udHJhc3QuanMiKCkgewogICAgQ29udHJhc3QgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOGE2IDYgMCAwIDAgMC0xMnYxMnoiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb29raWUuanMKdmFyIENvb2tpZTsKdmFyIGluaXRfY29va2llID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb29raWUuanMiKCkgewogICAgQ29va2llID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMmExMCAxMCAwIDEgMCAxMCAxMCA0IDQgMCAwIDEtNS01IDQgNCAwIDAgMS01LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC41IDguNXYuMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTUuNXYuMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJ2LjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDE3di4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE0di4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nvb2tpbmctcG90LmpzCnZhciBDb29raW5nUG90Owp2YXIgaW5pdF9jb29raW5nX3BvdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29va2luZy1wb3QuanMiKCkgewogICAgQ29va2luZ1BvdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJoMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTJ2OGEyIDIgMCAwIDEtMiAySDZhMiAyIDAgMCAxLTItMnYtOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm00IDggMTYtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04Ljg2IDYuNzgtLjQ1LTEuODFhMiAyIDAgMCAxIDEuNDUtMi40M2wxLjk0LS40OGEyIDIgMCAwIDEgMi40MyAxLjQ2bC40NSAxLjgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3B5LWNoZWNrLmpzCnZhciBDb3B5Q2hlY2s7CnZhciBpbml0X2NvcHlfY2hlY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvcHktY2hlY2suanMiKCkgewogICAgQ29weUNoZWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIgMTUgMiAyIDQtNCIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNCIsIGhlaWdodDogIjE0IiwgeDogIjgiLCB5OiAiOCIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE2Yy0xLjEgMC0yLS45LTItMlY0YzAtMS4xLjktMiAyLTJoMTBjMS4xIDAgMiAuOSAyIDIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3B5LW1pbnVzLmpzCnZhciBDb3B5TWludXM7CnZhciBpbml0X2NvcHlfbWludXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvcHktbWludXMuanMiKCkgewogICAgQ29weU1pbnVzID0gWwogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjE4IiwgeTE6ICIxNSIsIHkyOiAiMTUiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTQiLCBoZWlnaHQ6ICIxNCIsIHg6ICI4IiwgeTogIjgiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29weS1wbHVzLmpzCnZhciBDb3B5UGx1czsKdmFyIGluaXRfY29weV9wbHVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3B5LXBsdXMuanMiKCkgewogICAgQ29weVBsdXMgPSBbCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNSIsIHgyOiAiMTUiLCB5MTogIjEyIiwgeTI6ICIxOCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTgiLCB5MTogIjE1IiwgeTI6ICIxNSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNCIsIGhlaWdodDogIjE0IiwgeDogIjgiLCB5OiAiOCIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE2Yy0xLjEgMC0yLS45LTItMlY0YzAtMS4xLjktMiAyLTJoMTBjMS4xIDAgMiAuOSAyIDIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3B5LXNsYXNoLmpzCnZhciBDb3B5U2xhc2g7CnZhciBpbml0X2NvcHlfc2xhc2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvcHktc2xhc2guanMiKCkgewogICAgQ29weVNsYXNoID0gWwogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjE4IiwgeTE6ICIxOCIsIHkyOiAiMTIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTQiLCBoZWlnaHQ6ICIxNCIsIHg6ICI4IiwgeTogIjgiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29weS14LmpzCnZhciBDb3B5WDsKdmFyIGluaXRfY29weV94ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3B5LXguanMiKCkgewogICAgQ29weVggPSBbCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTgiLCB5MTogIjEyIiwgeTI6ICIxOCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTgiLCB5MTogIjE4IiwgeTI6ICIxMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNCIsIGhlaWdodDogIjE0IiwgeDogIjgiLCB5OiAiOCIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE2Yy0xLjEgMC0yLS45LTItMlY0YzAtMS4xLjktMiAyLTJoMTBjMS4xIDAgMiAuOSAyIDIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3B5LmpzCnZhciBDb3B5Owp2YXIgaW5pdF9jb3B5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3B5LmpzIigpIHsKICAgIENvcHkgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNCIsIGhlaWdodDogIjE0IiwgeDogIjgiLCB5OiAiOCIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE2Yy0xLjEgMC0yLS45LTItMlY0YzAtMS4xLjktMiAyLTJoMTBjMS4xIDAgMiAuOSAyIDIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3B5bGVmdC5qcwp2YXIgQ29weWxlZnQ7CnZhciBpbml0X2NvcHlsZWZ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3B5bGVmdC5qcyIoKSB7CiAgICBDb3B5bGVmdCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuMTcgMTQuODNhNCA0IDAgMSAwIDAtNS42NiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvcHlyaWdodC5qcwp2YXIgQ29weXJpZ2h0Owp2YXIgaW5pdF9jb3B5cmlnaHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvcHlyaWdodC5qcyIoKSB7CiAgICBDb3B5cmlnaHQgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNC44MyAxNC44M2E0IDQgMCAxIDEgMC01LjY2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29ybmVyLWRvd24tbGVmdC5qcwp2YXIgQ29ybmVyRG93bkxlZnQ7CnZhciBpbml0X2Nvcm5lcl9kb3duX2xlZnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nvcm5lci1kb3duLWxlZnQuanMiKCkgewogICAgQ29ybmVyRG93bkxlZnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCA0djdhNCA0IDAgMCAxLTQgNEg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTAtNSA1IDUgNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nvcm5lci1kb3duLXJpZ2h0LmpzCnZhciBDb3JuZXJEb3duUmlnaHQ7CnZhciBpbml0X2Nvcm5lcl9kb3duX3JpZ2h0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3JuZXItZG93bi1yaWdodC5qcyIoKSB7CiAgICBDb3JuZXJEb3duUmlnaHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxMCA1IDUtNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgNHY3YTQgNCAwIDAgMCA0IDRoMTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3JuZXItbGVmdC1kb3duLmpzCnZhciBDb3JuZXJMZWZ0RG93bjsKdmFyIGluaXRfY29ybmVyX2xlZnRfZG93biA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29ybmVyLWxlZnQtZG93bi5qcyIoKSB7CiAgICBDb3JuZXJMZWZ0RG93biA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDE1LTUgNS01LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgNGgtN2E0IDQgMCAwIDAtNCA0djEyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29ybmVyLWxlZnQtdXAuanMKdmFyIENvcm5lckxlZnRVcDsKdmFyIGluaXRfY29ybmVyX2xlZnRfdXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nvcm5lci1sZWZ0LXVwLmpzIigpIHsKICAgIENvcm5lckxlZnRVcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDkgOSA0IDQgOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAyMGgtN2E0IDQgMCAwIDEtNC00VjQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3JuZXItcmlnaHQtZG93bi5qcwp2YXIgQ29ybmVyUmlnaHREb3duOwp2YXIgaW5pdF9jb3JuZXJfcmlnaHRfZG93biA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29ybmVyLXJpZ2h0LWRvd24uanMiKCkgewogICAgQ29ybmVyUmlnaHREb3duID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgMTUgNSA1IDUtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDRoN2E0IDQgMCAwIDEgNCA0djEyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29ybmVyLXJpZ2h0LXVwLmpzCnZhciBDb3JuZXJSaWdodFVwOwp2YXIgaW5pdF9jb3JuZXJfcmlnaHRfdXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nvcm5lci1yaWdodC11cC5qcyIoKSB7CiAgICBDb3JuZXJSaWdodFVwID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgOSA1LTUgNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMjBoN2E0IDQgMCAwIDAgNC00VjQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3JuZXItdXAtbGVmdC5qcwp2YXIgQ29ybmVyVXBMZWZ0Owp2YXIgaW5pdF9jb3JuZXJfdXBfbGVmdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY29ybmVyLXVwLWxlZnQuanMiKCkgewogICAgQ29ybmVyVXBMZWZ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMjB2LTdhNCA0IDAgMCAwLTQtNEg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTQgNCA5bDUtNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NwdS5qcwp2YXIgQ3B1Owp2YXIgaW5pdF9jcHUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NwdS5qcyIoKSB7CiAgICBDcHUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAyMHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEyaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxN2gyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgN2gyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDEyaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTdoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCA3aDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMnYyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiNCIsIHk6ICI0Iiwgd2lkdGg6ICIxNiIsIGhlaWdodDogIjE2Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiOCIsIHk6ICI4Iiwgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiOCIsIHJ4OiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nvcm5lci11cC1yaWdodC5qcwp2YXIgQ29ybmVyVXBSaWdodDsKdmFyIGluaXRfY29ybmVyX3VwX3JpZ2h0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3JuZXItdXAtcmlnaHQuanMiKCkgewogICAgQ29ybmVyVXBSaWdodCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDE0IDUtNS01LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAyMHYtN2E0IDQgMCAwIDEgNC00aDEyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY3JlYXRpdmUtY29tbW9ucy5qcwp2YXIgQ3JlYXRpdmVDb21tb25zOwp2YXIgaW5pdF9jcmVhdGl2ZV9jb21tb25zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jcmVhdGl2ZS1jb21tb25zLmpzIigpIHsKICAgIENyZWF0aXZlQ29tbW9ucyA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDkuM2EyLjggMi44IDAgMCAwLTMuNSAxIDMuMSAzLjEgMCAwIDAgMCAzLjQgMi43IDIuNyAwIDAgMCAzLjUgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyA5LjNhMi44IDIuOCAwIDAgMC0zLjUgMSAzLjEgMy4xIDAgMCAwIDAgMy40IDIuNyAyLjcgMCAwIDAgMy41IDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jcmVkaXQtY2FyZC5qcwp2YXIgQ3JlZGl0Q2FyZDsKdmFyIGluaXRfY3JlZGl0X2NhcmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NyZWRpdC1jYXJkLmpzIigpIHsKICAgIENyZWRpdENhcmQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE0IiwgeDogIjIiLCB5OiAiNSIsIHJ4OiAiMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIyIiwgeDI6ICIyMiIsIHkxOiAiMTAiLCB5MjogIjEwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY3JvaXNzYW50LmpzCnZhciBDcm9pc3NhbnQ7CnZhciBpbml0X2Nyb2lzc2FudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY3JvaXNzYW50LmpzIigpIHsKICAgIENyb2lzc2FudCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjIgMThINC43NzRhMS41IDEuNSAwIDAgMS0xLjM1Mi0uOTcgMTEgMTEgMCAwIDEgLjEzMi02LjQ4NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMC4yVjQuNzc0YTEuNSAxLjUgMCAwIDAtLjk3LTEuMzUyIDExIDExIDAgMCAwLTYuNDg2LjEzMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA1YTQgMyAwIDAgMSA0IDMgMiAyIDAgMCAxLTIgMiAxMCAxMCAwIDAgMC01LjEzOSAxLjQyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMThhMyA0IDAgMCAwIDMgNCAyIDIgMCAwIDAgMi0yIDEwIDEwIDAgMCAxIDEuNDItNS4xNCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk04LjcwOSAyLjU1NGExMCAxMCAwIDAgMC02LjE1NSA2LjE1NSAxLjUgMS41IDAgMCAwIC42NzYgMS42MjZsOS44MDcgNS40MmEyIDIgMCAwIDAgMi43MTgtMi43MThsLTUuNDItOS44MDdhMS41IDEuNSAwIDAgMC0xLjYyNi0uNjc2IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY3JvcC5qcwp2YXIgQ3JvcDsKdmFyIGluaXRfY3JvcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY3JvcC5qcyIoKSB7CiAgICBDcm9wID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAydjE0YTIgMiAwIDAgMCAyIDJoMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMjJWOGEyIDIgMCAwIDAtMi0ySDIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jcm9zcy5qcwp2YXIgQ3Jvc3M7CnZhciBpbml0X2Nyb3NzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jcm9zcy5qcyIoKSB7CiAgICBDcm9zcyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQgOWEyIDIgMCAwIDAtMiAydjJhMiAyIDAgMCAwIDIgMmg0YTEgMSAwIDAgMSAxIDF2NGEyIDIgMCAwIDAgMiAyaDJhMiAyIDAgMCAwIDItMnYtNGExIDEgMCAwIDEgMS0xaDRhMiAyIDAgMCAwIDItMnYtMmEyIDIgMCAwIDAtMi0yaC00YTEgMSAwIDAgMS0xLTFWNGEyIDIgMCAwIDAtMi0yaC0yYTIgMiAwIDAgMC0yIDJ2NGExIDEgMCAwIDEtMSAxeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nyb3NzaGFpci5qcwp2YXIgQ3Jvc3NoYWlyOwp2YXIgaW5pdF9jcm9zc2hhaXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nyb3NzaGFpci5qcyIoKSB7CiAgICBDcm9zc2hhaXIgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIyMiIsIHgyOiAiMTgiLCB5MTogIjEyIiwgeTI6ICIxMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI2IiwgeDI6ICIyIiwgeTE6ICIxMiIsIHkyOiAiMTIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICI2IiwgeTI6ICIyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEyIiwgeDI6ICIxMiIsIHkxOiAiMjIiLCB5MjogIjE4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY3Jvd24uanMKdmFyIENyb3duOwp2YXIgaW5pdF9jcm93biA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY3Jvd24uanMiKCkgewogICAgQ3Jvd24gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMS41NjIgMy4yNjZhLjUuNSAwIDAgMSAuODc2IDBMMTUuMzkgOC44N2ExIDEgMCAwIDAgMS41MTYuMjk0TDIxLjE4MyA1LjVhLjUuNSAwIDAgMSAuNzk4LjUxOWwtMi44MzQgMTAuMjQ2YTEgMSAwIDAgMS0uOTU2LjczNEg1LjgxYTEgMSAwIDAgMS0uOTU3LS43MzRMMi4wMiA2LjAyYS41LjUgMCAwIDEgLjc5OC0uNTE5bDQuMjc2IDMuNjY0YTEgMSAwIDAgMCAxLjUxNi0uMjk0eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDIxaDE0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY3VwLXNvZGEuanMKdmFyIEN1cFNvZGE7CnZhciBpbml0X2N1cF9zb2RhID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jdXAtc29kYS5qcyIoKSB7CiAgICBDdXBTb2RhID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtNiA4IDEuNzUgMTIuMjhhMiAyIDAgMCAwIDIgMS43Mmg0LjU0YTIgMiAwIDAgMCAyLTEuNzJMMTggOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDhoMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxNWE2LjQ3IDYuNDcgMCAwIDEgNSAwIDYuNDcgNi40NyAwIDAgMCA1IDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIgOCAxLTZoMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2N1Ym9pZC5qcwp2YXIgQ3Vib2lkOwp2YXIgaW5pdF9jdWJvaWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2N1Ym9pZC5qcyIoKSB7CiAgICBDdWJvaWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAyMnYtOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yLjMzNiA4Ljg5IDEwIDE0bDExLjcxNS03LjAyOSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMiAxNGEyIDIgMCAwIDEtLjk3MSAxLjcxNWwtMTAgNmEyIDIgMCAwIDEtMi4xMzgtLjA1bC02LTRBMiAyIDAgMCAxIDIgMTZ2LTZhMiAyIDAgMCAxIC45NzEtMS43MTVsMTAtNmEyIDIgMCAwIDEgMi4xMzguMDVsNiA0QTIgMiAwIDAgMSAyMiA4eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2N1cnJlbmN5LmpzCnZhciBDdXJyZW5jeTsKdmFyIGluaXRfY3VycmVuY3kyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9jdXJyZW5jeS5qcyIoKSB7CiAgICBDdXJyZW5jeSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjgiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMyIsIHgyOiAiNiIsIHkxOiAiMyIsIHkyOiAiNiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIyMSIsIHgyOiAiMTgiLCB5MTogIjMiLCB5MjogIjYiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMyIsIHgyOiAiNiIsIHkxOiAiMjEiLCB5MjogIjE4IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjIxIiwgeDI6ICIxOCIsIHkxOiAiMjEiLCB5MjogIjE4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY3lsaW5kZXIuanMKdmFyIEN5bGluZGVyOwp2YXIgaW5pdF9jeWxpbmRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvY3lsaW5kZXIuanMiKCkgewogICAgQ3lsaW5kZXIgPSBbCiAgICAgIFsiZWxsaXBzZSIsIHsgY3g6ICIxMiIsIGN5OiAiNSIsIHJ4OiAiOSIsIHJ5OiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDV2MTRhOSAzIDAgMCAwIDE4IDBWNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RhbS5qcwp2YXIgRGFtOwp2YXIgaW5pdF9kYW0gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RhbS5qcyIoKSB7CiAgICBEYW0gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxMS4zMWMxLjE3LjU2IDEuNTQgMS42OSAzLjUgMS42OSAyLjUgMCAyLjUtMiA1LTIgMS4zIDAgMS45LjUgMi41IDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEuNzUgMThjLjM1LjUgMS40NSAxIDIuNzUgMSAyLjUgMCAyLjUtMiA1LTIgMS4zIDAgMS45LjUgMi41IDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTRoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE4aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA2aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAzYTEgMSAwIDAgMC0xIDF2MTZhMSAxIDAgMCAwIDEgMWg0YTEgMSAwIDAgMCAxLTFMMTAgNGExIDEgMCAwIDAtMS0xeiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RhdGFiYXNlLWJhY2t1cC5qcwp2YXIgRGF0YWJhc2VCYWNrdXA7CnZhciBpbml0X2RhdGFiYXNlX2JhY2t1cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGF0YWJhc2UtYmFja3VwLmpzIigpIHsKICAgIERhdGFiYXNlQmFja3VwID0gWwogICAgICBbImVsbGlwc2UiLCB7IGN4OiAiMTIiLCBjeTogIjUiLCByeDogIjkiLCByeTogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmE5IDMgMCAwIDAgNSAyLjY5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDkuM1Y1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgNXYxNGE5IDMgMCAwIDAgNi40NyAyLjg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEydjRoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAyMGE1IDUgMCAwIDAgOS0zIDQuNSA0LjUgMCAwIDAtNC41LTQuNWMtMS4zMyAwLTIuNTQuNTQtMy40MSAxLjQxTDEyIDE2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGF0YWJhc2UtemFwLmpzCnZhciBEYXRhYmFzZVphcDsKdmFyIGluaXRfZGF0YWJhc2VfemFwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kYXRhYmFzZS16YXAuanMiKCkgewogICAgRGF0YWJhc2VaYXAgPSBbCiAgICAgIFsiZWxsaXBzZSIsIHsgY3g6ICIxMiIsIGN5OiAiNSIsIHJ4OiAiOSIsIHJ5OiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDVWMTlBOSAzIDAgMCAwIDE1IDIxLjg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDVWOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMkwxOCAxN0gyMkwxOSAyMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyQTkgMyAwIDAgMCAxNC41OSAxNC44NyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RhdGFiYXNlLXNlYXJjaC5qcwp2YXIgRGF0YWJhc2VTZWFyY2g7CnZhciBpbml0X2RhdGFiYXNlX3NlYXJjaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGF0YWJhc2Utc2VhcmNoLmpzIigpIHsKICAgIERhdGFiYXNlU2VhcmNoID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTEuNjkzVjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgMjItMS44NzUtMS44NzUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmE5IDMgMCAwIDAgOC42OTcgMi45OTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA1djE0YTkgMyAwIDAgMCA5LjI4IDIuOTk5IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjE4IiwgcjogIjMiIH1dLAogICAgICBbImVsbGlwc2UiLCB7IGN4OiAiMTIiLCBjeTogIjUiLCByeDogIjkiLCByeTogIjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kZWNpbWFscy1hcnJvdy1sZWZ0LmpzCnZhciBEZWNpbWFsc0Fycm93TGVmdDsKdmFyIGluaXRfZGVjaW1hbHNfYXJyb3dfbGVmdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGVjaW1hbHMtYXJyb3ctbGVmdC5qcyIoKSB7CiAgICBEZWNpbWFsc0Fycm93TGVmdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEzIDIxLTMtMyAzLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMThIMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMWguMDEiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI2IiwgeTogIjMiLCB3aWR0aDogIjUiLCBoZWlnaHQ6ICI4Iiwgcng6ICIyLjUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kYXRhYmFzZS5qcwp2YXIgRGF0YWJhc2U7CnZhciBpbml0X2RhdGFiYXNlMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGF0YWJhc2UuanMiKCkgewogICAgRGF0YWJhc2UgPSBbCiAgICAgIFsiZWxsaXBzZSIsIHsgY3g6ICIxMiIsIGN5OiAiNSIsIHJ4OiAiOSIsIHJ5OiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDVWMTlBOSAzIDAgMCAwIDIxIDE5VjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMkE5IDMgMCAwIDAgMjEgMTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kZWNpbWFscy1hcnJvdy1yaWdodC5qcwp2YXIgRGVjaW1hbHNBcnJvd1JpZ2h0Owp2YXIgaW5pdF9kZWNpbWFsc19hcnJvd19yaWdodCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGVjaW1hbHMtYXJyb3ctcmlnaHQuanMiKCkgewogICAgRGVjaW1hbHNBcnJvd1JpZ2h0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMThoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMjEgMy0zLTMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDExaC4wMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjE1IiwgeTogIjMiLCB3aWR0aDogIjUiLCBoZWlnaHQ6ICI4Iiwgcng6ICIyLjUiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI2IiwgeTogIjMiLCB3aWR0aDogIjUiLCBoZWlnaHQ6ICI4Iiwgcng6ICIyLjUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kZWxldGUuanMKdmFyIERlbGV0ZTsKdmFyIGluaXRfZGVsZXRlMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGVsZXRlLmpzIigpIHsKICAgIERlbGV0ZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwIDVhMiAyIDAgMCAwLTEuMzQ0LjUxOWwtNi4zMjggNS43NGExIDEgMCAwIDAgMCAxLjQ4MWw2LjMyOCA1Ljc0MUEyIDIgMCAwIDAgMTAgMTloMTBhMiAyIDAgMCAwIDItMlY3YTIgMiAwIDAgMC0yLTJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDkgNiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE4IDktNiA2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGlhbWV0ZXIuanMKdmFyIERpYW1ldGVyOwp2YXIgaW5pdF9kaWFtZXRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGlhbWV0ZXIuanMiKCkgewogICAgRGlhbWV0ZXIgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE5IiwgY3k6ICIxOSIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNSIsIGN5OiAiNSIsIHI6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuNDggMy42NmExMCAxMCAwIDAgMSAxMy44NiAxMy44NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02LjQxIDYuNDEgMTEuMTggMTEuMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy42NiA2LjQ4YTEwIDEwIDAgMCAwIDEzLjg2IDEzLjg2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGVzc2VydC5qcwp2YXIgRGVzc2VydDsKdmFyIGluaXRfZGVzc2VydCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGVzc2VydC5qcyIoKSB7CiAgICBEZXNzZXJ0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTAuMTYyIDMuMTY3QTEwIDEwIDAgMCAwIDIgMTNhMiAyIDAgMCAwIDQgMHYtMWEyIDIgMCAwIDEgNCAwdjRhMiAyIDAgMCAwIDQgMHYtNGEyIDIgMCAwIDEgNCAwdjFhMiAyIDAgMCAwIDQtLjAwNiAxMCAxMCAwIDAgMC04LjE2MS05LjgyNiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC44MDQgMTQuODY5YTkgOSAwIDAgMS0xNy42MDggMCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICI0IiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kaWFtb25kLW1pbnVzLmpzCnZhciBEaWFtb25kTWludXM7CnZhciBpbml0X2RpYW1vbmRfbWludXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RpYW1vbmQtbWludXMuanMiKCkgewogICAgRGlhbW9uZE1pbnVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMi43IDEwLjNhMi40MSAyLjQxIDAgMCAwIDAgMy40MWw3LjU5IDcuNTlhMi40MSAyLjQxIDAgMCAwIDMuNDEgMGw3LjU5LTcuNTlhMi40MSAyLjQxIDAgMCAwIDAtMy40MUwxMy43IDIuNzFhMi40MSAyLjQxIDAgMCAwLTMuNDEgMHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmg4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGlhbW9uZC1wZXJjZW50LmpzCnZhciBEaWFtb25kUGVyY2VudDsKdmFyIGluaXRfZGlhbW9uZF9wZXJjZW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kaWFtb25kLXBlcmNlbnQuanMiKCkgewogICAgRGlhbW9uZFBlcmNlbnQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yLjcgMTAuM2EyLjQxIDIuNDEgMCAwIDAgMCAzLjQxbDcuNTkgNy41OWEyLjQxIDIuNDEgMCAwIDAgMy40MSAwbDcuNTktNy41OWEyLjQxIDIuNDEgMCAwIDAgMC0zLjQxTDEzLjcgMi43MWEyLjQxIDIuNDEgMCAwIDAtMy40MSAwWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjIgOS4yaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC41IDkuNS01IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQuNyAxNC44aC4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RpYW1vbmQtcGx1cy5qcwp2YXIgRGlhbW9uZFBsdXM7CnZhciBpbml0X2RpYW1vbmRfcGx1cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGlhbW9uZC1wbHVzLmpzIigpIHsKICAgIERpYW1vbmRQbHVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOHY4IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuNyAxMC4zYTIuNDEgMi40MSAwIDAgMCAwIDMuNDFsNy41OSA3LjU5YTIuNDEgMi40MSAwIDAgMCAzLjQxIDBsNy41OS03LjU5YTIuNDEgMi40MSAwIDAgMCAwLTMuNDFMMTMuNyAyLjcxYTIuNDEgMi40MSAwIDAgMC0zLjQxIDB6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJoOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RpYW1vbmQuanMKdmFyIERpYW1vbmQ7CnZhciBpbml0X2RpYW1vbmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RpYW1vbmQuanMiKCkgewogICAgRGlhbW9uZCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuNyAxMC4zYTIuNDEgMi40MSAwIDAgMCAwIDMuNDFsNy41OSA3LjU5YTIuNDEgMi40MSAwIDAgMCAzLjQxIDBsNy41OS03LjU5YTIuNDEgMi40MSAwIDAgMCAwLTMuNDFsLTcuNTktNy41OWEyLjQxIDIuNDEgMCAwIDAtMy40MSAwWiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RpY2UtMS5qcwp2YXIgRGljZTE7CnZhciBpbml0X2RpY2VfMSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGljZS0xLmpzIigpIHsKICAgIERpY2UxID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGljZS0yLmpzCnZhciBEaWNlMjsKdmFyIGluaXRfZGljZV8yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kaWNlLTIuanMiKCkgewogICAgRGljZTIgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA5aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE1aC4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RpY2UtMy5qcwp2YXIgRGljZTM7CnZhciBpbml0X2RpY2VfMyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGljZS0zLmpzIigpIHsKICAgIERpY2UzID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgOGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTZoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGljZS00LmpzCnZhciBEaWNlNDsKdmFyIGluaXRfZGljZV80ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kaWNlLTQuanMiKCkgewogICAgRGljZTQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA4aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDhoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTZoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE2aC4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RpY2UtNS5qcwp2YXIgRGljZTU7CnZhciBpbml0X2RpY2VfNSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGljZS01LmpzIigpIHsKICAgIERpY2U1ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgOGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA4aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE2aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGljZS02LmpzCnZhciBEaWNlNjsKdmFyIGluaXRfZGljZV82ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kaWNlLTYuanMiKCkgewogICAgRGljZTYgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA4aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTZoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggOGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNmguMDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kaWNlcy5qcwp2YXIgRGljZXM7CnZhciBpbml0X2RpY2VzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kaWNlcy5qcyIoKSB7CiAgICBEaWNlcyA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjEyIiwgaGVpZ2h0OiAiMTIiLCB4OiAiMiIsIHk6ICIxMCIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNy45MiAxNCAzLjUtMy41YTIuMjQgMi4yNCAwIDAgMCAwLTNsLTUtNC45MmEyLjI0IDIuMjQgMCAwIDAtMyAwTDEwIDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTRoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDZoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDloLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGlmZi5qcwp2YXIgRGlmZjsKdmFyIGluaXRfZGlmZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGlmZi5qcyIoKSB7CiAgICBEaWZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgM3YxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDEwaDE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMjFoMTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kaXNjLTIuanMKdmFyIERpc2MyOwp2YXIgaW5pdF9kaXNjXzIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Rpc2MtMi5qcyIoKSB7CiAgICBEaXNjMiA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGlzYy1hbGJ1bS5qcwp2YXIgRGlzY0FsYnVtOwp2YXIgaW5pdF9kaXNjX2FsYnVtID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kaXNjLWFsYnVtLmpzIigpIHsKICAgIERpc2NBbGJ1bSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZGlzYy0zLmpzCnZhciBEaXNjMzsKdmFyIGluaXRfZGlzY18zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kaXNjLTMuanMiKCkgewogICAgRGlzYzMgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEyYzAtMS43LjctMy4yIDEuOC00LjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMmMwIDEuNy0uNyAzLjItMS44IDQuMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Rpc2MuanMKdmFyIERpc2M7CnZhciBpbml0X2Rpc2MgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Rpc2MuanMiKCkgewogICAgRGlzYyA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kaXZpZGUuanMKdmFyIERpdmlkZTsKdmFyIGluaXRfZGl2aWRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kaXZpZGUuanMiKCkgewogICAgRGl2aWRlID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiNiIsIHI6ICIxIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjUiLCB4MjogIjE5IiwgeTE6ICIxMiIsIHkyOiAiMTIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTgiLCByOiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RuYS1vZmYuanMKdmFyIERuYU9mZjsKdmFyIGluaXRfZG5hX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZG5hLW9mZi5qcyIoKSB7CiAgICBEbmFPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAyYy0xLjM1IDEuNS0yLjA5MiAzLTIuNSA0LjVMMTQgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyA2LTIuODkxLTIuODkxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTVjMy4zMzMtMyA2LjY2Ny0zIDEwLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwIDkgLjg5MS44OTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgOWMtMS41IDEuMzUtMyAyLjA5Mi00LjUgMi41bC0xLTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy4xMDkgMTQuMTA5IDQgMTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNi41IDEyLjUgMSAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMTggMi44OTEgMi44OTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAyMmMxLjM1LTEuNSAyLjA5Mi0zIDIuNS00LjVMMTAgMTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kb2NrLmpzCnZhciBEb2NrOwp2YXIgaW5pdF9kb2NrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kb2NrLmpzIigpIHsKICAgIERvY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDhoMjAiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxNiIsIHg6ICIyIiwgeTogIjQiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxNmgxMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RuYS5qcwp2YXIgRG5hOwp2YXIgaW5pdF9kbmEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RuYS5qcyIoKSB7CiAgICBEbmEgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCAxNiAxLjUgMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDgtMS41LTEuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAyYy0xLjc5OCAxLjk5OC0yLjUxOCAzLjk5NS0yLjgwNyA1Ljk5MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNi41IDEwLjUgMSAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDYtMi44OTEtMi44OTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxNWM2LjY2Ny02IDEzLjMzMyAwIDIwLTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAgOSAuODkxLjg5MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zLjEwOSAxNC4xMDkgNCAxNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02LjUgMTIuNSAxIDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNyAxOCAyLjg5MSAyLjg5MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDIyYzEuNzk4LTEuOTk4IDIuNTE4LTMuOTk1IDIuODA3LTUuOTkzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZG9nLmpzCnZhciBEb2c7CnZhciBpbml0X2RvZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZG9nLmpzIigpIHsKICAgIERvZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExLjI1IDE2LjI1aDEuNUwxMiAxN3oiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTR2LjUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNC40MiAxMS4yNDdBMTMuMTUyIDEzLjE1MiAwIDAgMCA0IDE0LjU1NkM0IDE4LjcyOCA3LjU4MiAyMSAxMiAyMXM4LTIuMjcyIDgtNi40NDRhMTEuNzAyIDExLjcwMiAwIDAgMC0uNDkzLTMuMzA5IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTR2LjUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOC41IDguNWMtLjM4NCAxLjA1LTEuMDgzIDIuMDI4LTIuMzQ0IDIuNS0xLjkzMS43MjItMy41NzYtLjI5Ny0zLjY1Ni0xLS4xMTMtLjk5NCAxLjE3Ny02LjUzIDQtNyAxLjkyMy0uMzIxIDMuNjUxLjg0NSAzLjY1MSAyLjIzNUE3LjQ5NyA3LjQ5NyAwIDAgMSAxNCA1LjI3N2MwLTEuMzkgMS44NDQtMi41OTggMy43NjctMi4yNzcgMi44MjMuNDcgNC4xMTMgNi4wMDYgNCA3LS4wOC43MDMtMS43MjUgMS43MjItMy42NTYgMS0xLjI2MS0uNDcyLTEuODU1LTEuNDUtMi4yMzktMi41IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZG9sbGFyLXNpZ24uanMKdmFyIERvbGxhclNpZ247CnZhciBpbml0X2RvbGxhcl9zaWduID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kb2xsYXItc2lnbi5qcyIoKSB7CiAgICBEb2xsYXJTaWduID0gWwogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICIyIiwgeTI6ICIyMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyA1SDkuNWEzLjUgMy41IDAgMCAwIDAgN2g1YTMuNSAzLjUgMCAwIDEgMCA3SDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kb251dC5qcwp2YXIgRG9udXQ7CnZhciBpbml0X2RvbnV0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kb251dC5qcyIoKSB7CiAgICBEb251dCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwLjUgMTBhMi41IDIuNSAwIDAgMS0yLjQtM0gxOGEyLjk1IDIuOTUgMCAwIDEtMi42LTQuNCAxMCAxMCAwIDEgMCA2LjMgNy4xYy0uMy4yLS44LjMtMS4yLjMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Rvb3ItY2xvc2VkLmpzCnZhciBEb29yQ2xvc2VkOwp2YXIgaW5pdF9kb29yX2Nsb3NlZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZG9vci1jbG9zZWQuanMiKCkgewogICAgRG9vckNsb3NlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEyaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAyMFY2YTIgMiAwIDAgMC0yLTJIOGEyIDIgMCAwIDAtMiAydjE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjBoMjAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kb29yLWNsb3NlZC1sb2NrZWQuanMKdmFyIERvb3JDbG9zZWRMb2NrZWQ7CnZhciBpbml0X2Rvb3JfY2xvc2VkX2xvY2tlZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZG9vci1jbG9zZWQtbG9ja2VkLmpzIigpIHsKICAgIERvb3JDbG9zZWRMb2NrZWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggOVY2YTIgMiAwIDAgMC0yLTJIOGEyIDIgMCAwIDAtMiAydjE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjBoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxN3YtMmEyIDIgMCAxIDAtNCAwdjIiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIxNCIsIHk6ICIxNyIsIHdpZHRoOiAiOCIsIGhlaWdodDogIjUiLCByeDogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kb29yLW9wZW4uanMKdmFyIERvb3JPcGVuOwp2YXIgaW5pdF9kb29yX29wZW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Rvb3Itb3Blbi5qcyIoKSB7CiAgICBEb29yT3BlbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDIwSDIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEgNC41NjJ2MTYuMTU3YTEgMSAwIDAgMCAxLjI0Mi45N0wxOSAyMFY1LjU2MmEyIDIgMCAwIDAtMS41MTUtMS45NGwtNC0xQTIgMiAwIDAgMCAxMSA0LjU2MXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgNEg4YTIgMiAwIDAgMC0yIDJ2MTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDIwaC0zIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZG90LmpzCnZhciBEb3Q7CnZhciBpbml0X2RvdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZG90LmpzIigpIHsKICAgIERvdCA9IFtbImNpcmNsZSIsIHsgY3g6ICIxMi4xIiwgY3k6ICIxMi4xIiwgcjogIjEiIH1dXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZG93bmxvYWQuanMKdmFyIERvd25sb2FkOwp2YXIgaW5pdF9kb3dubG9hZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZG93bmxvYWQuanMiKCkgewogICAgRG93bmxvYWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNVYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE1djRhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ2LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNyAxMCA1IDUgNS01IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZHJhbWEuanMKdmFyIERyYW1hOwp2YXIgaW5pdF9kcmFtYSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZHJhbWEuanMiKCkgewogICAgRHJhbWEgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgNmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggNmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi41IDEzLjFoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDVjMCA5LTQgMTItNiAxMnMtNi0zLTYtMTJjMC0yIDItMyA2LTNzNiAxIDYgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy40IDkuOWMtLjguOC0yIC44LTIuOCAwIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwLjEgNy4xQzkgNy4yIDcuNyA3LjcgNiA4LjZjLTMuNSAyLTQuNyAzLjktMy43IDUuNiA0LjUgNy44IDkuNSA4LjQgMTEuMiA3LjQuOS0uNSAxLjktMi4xIDEuOS00LjciCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS4xIDE2LjVjLjMtMS4xIDEuNC0xLjcgMi40LTEuNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RyYWZ0aW5nLWNvbXBhc3MuanMKdmFyIERyYWZ0aW5nQ29tcGFzczsKdmFyIGluaXRfZHJhZnRpbmdfY29tcGFzcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZHJhZnRpbmctY29tcGFzcy5qcyIoKSB7CiAgICBEcmFmdGluZ0NvbXBhc3MgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMi45OSA2Ljc0IDEuOTMgMy40NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOS4xMzYgMTJhMTAgMTAgMCAwIDEtMTQuMjcxIDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMjEtMi4xNi0zLjg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgMjEgOC4wMi0xNC4yNiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICI1IiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kcmliYmJsZS5qcwp2YXIgRHJpYmJibGU7CnZhciBpbml0X2RyaWJiYmxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kcmliYmJsZS5qcyIoKSB7CiAgICBEcmliYmJsZSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5LjEzIDUuMDlDMTUuMjIgOS4xNCAxMCAxMC40NCAyLjI1IDEwLjk0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxLjc1IDEyLjg0Yy02LjYyLTEuNDEtMTIuMTQgMS0xNi4zOCA2LjMyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguNTYgMi43NWM0LjM3IDYgNiA5LjQyIDggMTcuNzIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kcmlsbC5qcwp2YXIgRHJpbGw7CnZhciBpbml0X2RyaWxsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kcmlsbC5qcyIoKSB7CiAgICBEcmlsbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE4YTEgMSAwIDAgMSAxIDF2MmExIDEgMCAwIDEtMSAxSDVhMyAzIDAgMCAxLTMtMyAxIDEgMCAwIDEgMS0xeiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMyAxMEg0YTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDlhMSAxIDAgMCAxIDEgMXY2YTEgMSAwIDAgMS0xIDFsLS44MSAzLjI0MmExIDEgMCAwIDEtLjk3Ljc1OEg4IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDRoM2ExIDEgMCAwIDEgMSAxdjJhMSAxIDAgMCAxLTEgMWgtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA2aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNSAxMC0yIDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNyAxOCAyLTgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kcm9uZS5qcwp2YXIgRHJvbmU7CnZhciBpbml0X2Ryb25lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kcm9uZS5qcyIoKSB7CiAgICBEcm9uZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEwIDcgNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCAxNC0zIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgMTAgMy0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDE0IDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNC4yMDUgNC4xMzlhNCA0IDAgMSAxIDUuNDM5IDUuODYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5LjYzNyAxNGE0IDQgMCAxIDEtNS40MzIgNS44NjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC4zNjcgMTBhNCA0IDAgMSAxIDUuNDM4LTUuODYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuNzk1IDE5Ljg2MmE0IDQgMCAxIDEtNS40MjktNS44NzMiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIxMCIsIHk6ICI4Iiwgd2lkdGg6ICI0IiwgaGVpZ2h0OiAiOCIsIHJ4OiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Ryb3BsZXQuanMKdmFyIERyb3BsZXQ7CnZhciBpbml0X2Ryb3BsZXQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Ryb3BsZXQuanMiKCkgewogICAgRHJvcGxldCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyIDIyYTcgNyAwIDAgMCA3LTdjMC0yLTEtMy45LTMtNS41cy0zLjUtNC00LTYuNWMtLjUgMi41LTIgNC45LTQgNi41QzYgMTEuMSA1IDEzIDUgMTVhNyA3IDAgMCAwIDcgN3oiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kcm9wbGV0LW9mZi5qcwp2YXIgRHJvcGxldE9mZjsKdmFyIGluaXRfZHJvcGxldF9vZmYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Ryb3BsZXQtb2ZmLmpzIigpIHsKICAgIERyb3BsZXRPZmYgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOC43MTUgMTMuMTg2QzE4LjI5IDExLjg1OCAxNy4zODQgMTAuNjA3IDE2IDkuNWMtMi0xLjYtMy41LTQtNC02LjVhMTAuNyAxMC43IDAgMCAxLS44ODQgMi41ODYiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguNzk1IDguNzk3QTExIDExIDAgMCAxIDggOS41QzYgMTEuMSA1IDEzIDUgMTVhNyA3IDAgMCAwIDEzLjIyMiAzLjIwOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Ryb3BsZXRzLmpzCnZhciBEcm9wbGV0czsKdmFyIGluaXRfZHJvcGxldHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Ryb3BsZXRzLmpzIigpIHsKICAgIERyb3BsZXRzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNyAxNi4zYzIuMiAwIDQtMS44MyA0LTQuMDUgMC0xLjE2LS41Ny0yLjI2LTEuNzEtMy4xOVM3LjI5IDYuNzUgNyA1LjNjLS4yOSAxLjQ1LTEuMTQgMi44NC0yLjI5IDMuNzZTMyAxMS4xIDMgMTIuMjVjMCAyLjIyIDEuOCA0LjA1IDQgNC4wNXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTIuNTYgNi42QTEwLjk3IDEwLjk3IDAgMCAwIDE0IDMuMDJjLjUgMi41IDIgNC45IDQgNi41czMgMy41IDMgNS41YTYuOTggNi45OCAwIDAgMS0xMS45MSA0Ljk3IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZHJ1bS5qcwp2YXIgRHJ1bTsKdmFyIGluaXRfZHJ1bSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZHJ1bS5qcyIoKSB7CiAgICBEcnVtID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDggOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiAyLTggOCIgfV0sCiAgICAgIFsiZWxsaXBzZSIsIHsgY3g6ICIxMiIsIGN5OiAiOSIsIHJ4OiAiMTAiLCByeTogIjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMy40djcuOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNHY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDEzLjR2Ny45IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgOXY4YTEwIDUgMCAwIDAgMjAgMFY5IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZHJ1bXN0aWNrLmpzCnZhciBEcnVtc3RpY2s7CnZhciBpbml0X2RydW1zdGljayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZHJ1bXN0aWNrLmpzIigpIHsKICAgIERydW1zdGljayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1LjQgMTUuNjNhNy44NzUgNiAxMzUgMSAxIDYuMjMtNi4yMyA0LjUgMy40MyAxMzUgMCAwLTYuMjMgNi4yMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04LjI5IDEyLjcxLTIuNiAyLjZhMi41IDIuNSAwIDEgMC0xLjY1IDQuNjVBMi41IDIuNSAwIDEgMCA4LjcgMTguM2wyLjU5LTIuNTkiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kdW1iYmVsbC5qcwp2YXIgRHVtYmJlbGw7CnZhciBpbml0X2R1bWJiZWxsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9kdW1iYmVsbC5qcyIoKSB7CiAgICBEdW1iYmVsbCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE3LjU5NiAxMi43NjhhMiAyIDAgMSAwIDIuODI5LTIuODI5bC0xLjc2OC0xLjc2N2EyIDIgMCAwIDAgMi44MjgtMi44MjlsLTIuODI4LTIuODI4YTIgMiAwIDAgMC0yLjgyOSAyLjgyOGwtMS43NjctMS43NjhhMiAyIDAgMSAwLTIuODI5IDIuODI5eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yLjUgMjEuNSAxLjQtMS40IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwLjEgMy45IDEuNC0xLjQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNS4zNDMgMjEuNDg1YTIgMiAwIDEgMCAyLjgyOS0yLjgyOGwxLjc2NyAxLjc2OGEyIDIgMCAxIDAgMi44MjktMi44MjlsLTYuMzY0LTYuMzY0YTIgMiAwIDEgMC0yLjgyOSAyLjgyOWwxLjc2OCAxLjc2N2EyIDIgMCAwIDAtMi44MjggMi44Mjl6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkuNiAxNC40IDQuOC00LjgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9lYXItb2ZmLmpzCnZhciBFYXJPZmY7CnZhciBpbml0X2Vhcl9vZmYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Vhci1vZmYuanMiKCkgewogICAgRWFyT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOC41YTMuNSAzLjUgMCAxIDAgNyAwYzAtMS41Ny45Mi0yLjUyIDIuMDQtMy40NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDguNWMwLS43NS4xMy0xLjQ3LjM2LTIuMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC44IDMuMTVBNi41IDYuNSAwIDAgMSAxOSA4LjVjMCAxLjYzLS40NCAyLjgxLTEuMDkgMy43NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMi41IDZBMi41IDIuNSAwIDAgMSAxNSA4LjVNMTAgMTNhMiAyIDAgMCAwIDEuODItMS4xOCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIyIiwgeDI6ICIyMiIsIHkxOiAiMiIsIHkyOiAiMjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9lYXIuanMKdmFyIEVhcjsKdmFyIGluaXRfZWFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9lYXIuanMiKCkgewogICAgRWFyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA4LjVhNi41IDYuNSAwIDEgMSAxMyAwYzAgNi02IDYtNiAxMGEzLjUgMy41IDAgMSAxLTcgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA4LjVhMi41IDIuNSAwIDAgMC01IDB2MWEyIDIgMCAxIDEgMCA0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZWFydGguanMKdmFyIEVhcnRoOwp2YXIgaW5pdF9lYXJ0aCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZWFydGguanMiKCkgewogICAgRWFydGggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMS41NCAxNUgxN2EyIDIgMCAwIDAtMiAydjQuNTQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk03IDMuMzRWNWEzIDMgMCAwIDAgMyAzYTIgMiAwIDAgMSAyIDJjMCAxLjEuOSAyIDIgMmEyIDIgMCAwIDAgMi0yYzAtMS4xLjktMiAyLTJoMy4xNyIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMjEuOTVWMThhMiAyIDAgMCAwLTItMmEyIDIgMCAwIDEtMi0ydi0xYTIgMiAwIDAgMC0yLTJIMi4wNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2VhcnRoLWxvY2suanMKdmFyIEVhcnRoTG9jazsKdmFyIGluaXRfZWFydGhfbG9jayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZWFydGgtbG9jay5qcyIoKSB7CiAgICBFYXJ0aExvY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDMuMzRWNWEzIDMgMCAwIDAgMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDIxLjk1VjE4YTIgMiAwIDAgMC0yLTIgMiAyIDAgMCAxLTItMnYtMWEyIDIgMCAwIDAtMi0ySDIuMDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEuNTQgMTVIMTdhMiAyIDAgMCAwLTIgMnY0LjU0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJhMTAgMTAgMCAxIDAgOS41NCAxMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCA2VjRhMiAyIDAgMSAwLTQgMHYyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICI1IiwgeDogIjE0IiwgeTogIjYiLCByeDogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9lY2xpcHNlLmpzCnZhciBFY2xpcHNlOwp2YXIgaW5pdF9lY2xpcHNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9lY2xpcHNlLmpzIigpIHsKICAgIEVjbGlwc2UgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyYTcgNyAwIDEgMCAxMCAxMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2VnZy1vZmYuanMKdmFyIEVnZ09mZjsKdmFyIGluaXRfZWdnX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZWdnLW9mZi5qcyIoKSB7CiAgICBFZ2dPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTQuMzQ3VjE0YzAtNi00LTEyLTgtMTItMS4wNzggMC0yLjE1Ny40MzYtMy4xNTcgMS4xOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjIwNiA2LjIxQzQuODcxIDguNCA0IDExLjIgNCAxNGE4IDggMCAwIDAgMTQuNTY4IDQuNTY4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZWdnLWZyaWVkLmpzCnZhciBFZ2dGcmllZDsKdmFyIGluaXRfZWdnX2ZyaWVkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9lZ2ctZnJpZWQuanMiKCkgewogICAgRWdnRnJpZWQgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjExLjUiLCBjeTogIjEyLjUiLCByOiAiMy41IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMgOGMwLTMuNSAyLjUtNiA2LjUtNiA1IDAgNC44MyAzIDcuNSA1czUgMiA1IDZjMCA0LjUtMi41IDYuNS03IDYuNS0yLjUgMC0yLjUgMi41LTYgMi41cy03LTItNy01LjVjMC0zIDEuNS0zIDEuNS01QzMuNSAxMCAzIDkgMyA4WiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2VnZy5qcwp2YXIgRWdnOwp2YXIgaW5pdF9lZ2cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2VnZy5qcyIoKSB7CiAgICBFZ2cgPSBbWyJwYXRoIiwgeyBkOiAiTTEyIDJDOCAyIDQgOCA0IDE0YTggOCAwIDAgMCAxNiAwYzAtNi00LTEyLTgtMTIiIH1dXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZWxsaXBzZS5qcwp2YXIgRWxsaXBzZTsKdmFyIGluaXRfZWxsaXBzZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZWxsaXBzZS5qcyIoKSB7CiAgICBFbGxpcHNlID0gW1siZWxsaXBzZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByeDogIjEwIiwgcnk6ICI2IiB9XV07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2VsbGlwc2lzLXZlcnRpY2FsLmpzCnZhciBFbGxpcHNpc1ZlcnRpY2FsOwp2YXIgaW5pdF9lbGxpcHNpc192ZXJ0aWNhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZWxsaXBzaXMtdmVydGljYWwuanMiKCkgewogICAgRWxsaXBzaXNWZXJ0aWNhbCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiNSIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjE5IiwgcjogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9lbGxpcHNpcy5qcwp2YXIgRWxsaXBzaXM7CnZhciBpbml0X2VsbGlwc2lzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9lbGxpcHNpcy5qcyIoKSB7CiAgICBFbGxpcHNpcyA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiMTIiLCByOiAiMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjEyIiwgcjogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9lcXVhbC1hcHByb3hpbWF0ZWx5LmpzCnZhciBFcXVhbEFwcHJveGltYXRlbHk7CnZhciBpbml0X2VxdWFsX2FwcHJveGltYXRlbHkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2VxdWFsLWFwcHJveGltYXRlbHkuanMiKCkgewogICAgRXF1YWxBcHByb3hpbWF0ZWx5ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxNWE2LjUgNi41IDAgMCAxIDcgMCA2LjUgNi41IDAgMCAwIDcgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDlhNi41IDYuNSAwIDAgMSA3IDAgNi41IDYuNSAwIDAgMCA3IDAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9lcXVhbC1ub3QuanMKdmFyIEVxdWFsTm90Owp2YXIgaW5pdF9lcXVhbF9ub3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2VxdWFsLW5vdC5qcyIoKSB7CiAgICBFcXVhbE5vdCA9IFsKICAgICAgWyJsaW5lIiwgeyB4MTogIjUiLCB4MjogIjE5IiwgeTE6ICI5IiwgeTI6ICI5IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjUiLCB4MjogIjE5IiwgeTE6ICIxNSIsIHkyOiAiMTUiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTkiLCB4MjogIjUiLCB5MTogIjUiLCB5MjogIjE5IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZXF1YWwuanMKdmFyIEVxdWFsOwp2YXIgaW5pdF9lcXVhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZXF1YWwuanMiKCkgewogICAgRXF1YWwgPSBbCiAgICAgIFsibGluZSIsIHsgeDE6ICI1IiwgeDI6ICIxOSIsIHkxOiAiOSIsIHkyOiAiOSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI1IiwgeDI6ICIxOSIsIHkxOiAiMTUiLCB5MjogIjE1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZXJhc2VyLmpzCnZhciBFcmFzZXI7CnZhciBpbml0X2VyYXNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZXJhc2VyLmpzIigpIHsKICAgIEVyYXNlciA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxIDIxSDhhMiAyIDAgMCAxLTEuNDItLjU4N2wtMy45OTQtMy45OTlhMiAyIDAgMCAxIDAtMi44MjhsMTAtMTBhMiAyIDAgMCAxIDIuODI5IDBsNS45OTkgNmEyIDIgMCAwIDEgMCAyLjgyOEwxMi44MzQgMjEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNS4wODIgMTEuMDkgOC44MjggOC44MjgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ldGhlcm5ldC1wb3J0LmpzCnZhciBFdGhlcm5ldFBvcnQ7CnZhciBpbml0X2V0aGVybmV0X3BvcnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2V0aGVybmV0LXBvcnQuanMiKCkgewogICAgRXRoZXJuZXRQb3J0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIm0xNSAyMCAzLTNoMmEyIDIgMCAwIDAgMi0yVjZhMiAyIDAgMCAwLTItMkg0YTIgMiAwIDAgMC0yIDJ2OWEyIDIgMCAwIDAgMiAyaDJsMyAzeiIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA4djEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOHYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDh2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA4djEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ldXJvLmpzCnZhciBFdXJvOwp2YXIgaW5pdF9ldXJvID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ldXJvLmpzIigpIHsKICAgIEV1cm8gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEwaDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTRoOSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTE5IDZhNy43IDcuNyAwIDAgMC01LjItMkE3LjkgNy45IDAgMCAwIDYgMTJjMCA0LjQgMy41IDggNy44IDggMiAwIDMuOC0uOCA1LjItMiIgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9leHBhbmQuanMKdmFyIEV4cGFuZDsKdmFyIGluaXRfZXhwYW5kMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZXhwYW5kLmpzIigpIHsKICAgIEV4cGFuZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDE1IDYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA5IDYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNnY1aC01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDhWM2gtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE2djVoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDIxIDYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDhWM2g1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgOSAzIDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ldi1jaGFyZ2VyLmpzCnZhciBFdkNoYXJnZXI7CnZhciBpbml0X2V2X2NoYXJnZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2V2LWNoYXJnZXIuanMiKCkgewogICAgRXZDaGFyZ2VyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTNoMmEyIDIgMCAwIDEgMiAydjJhMiAyIDAgMCAwIDQgMHYtNi45OThhMiAyIDAgMCAwLS41OS0xLjQyTDE4IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjFWNWEyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIxaDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgN2gxMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDExLTIgM2gzbC0yIDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9leHRlcm5hbC1saW5rLmpzCnZhciBFeHRlcm5hbExpbms7CnZhciBpbml0X2V4dGVybmFsX2xpbmsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2V4dGVybmFsLWxpbmsuanMiKCkgewogICAgRXh0ZXJuYWxMaW5rID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgM2g2djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTQgMjEgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxM3Y2YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yVjhhMiAyIDAgMCAxIDItMmg2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZXllLW9mZi5qcwp2YXIgRXllT2ZmOwp2YXIgaW5pdF9leWVfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9leWUtb2ZmLmpzIigpIHsKICAgIEV5ZU9mZiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwLjczMyA1LjA3NmExMC43NDQgMTAuNzQ0IDAgMCAxIDExLjIwNSA2LjU3NSAxIDEgMCAwIDEgMCAuNjk2IDEwLjc0NyAxMC43NDcgMCAwIDEtMS40NDQgMi40OSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNC4wODQgMTQuMTU4YTMgMyAwIDAgMS00LjI0Mi00LjI0MiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNy40NzkgMTcuNDk5YTEwLjc1IDEwLjc1IDAgMCAxLTE1LjQxNy01LjE1MSAxIDEgMCAwIDEgMC0uNjk2IDEwLjc1IDEwLjc1IDAgMCAxIDQuNDQ2LTUuMTQzIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2V5ZS1jbG9zZWQuanMKdmFyIEV5ZUNsb3NlZDsKdmFyIGluaXRfZXllX2Nsb3NlZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZXllLWNsb3NlZC5qcyIoKSB7CiAgICBFeWVDbG9zZWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxOC0uNzIyLTMuMjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA4YTEwLjY0NSAxMC42NDUgMCAwIDAgMjAgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMCAxNS0xLjcyNi0yLjA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTQgMTUgMS43MjYtMi4wNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDE4IC43MjItMy4yNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2V5ZS5qcwp2YXIgRXllOwp2YXIgaW5pdF9leWUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2V5ZS5qcyIoKSB7CiAgICBFeWUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yLjA2MiAxMi4zNDhhMSAxIDAgMCAxIDAtLjY5NiAxMC43NSAxMC43NSAwIDAgMSAxOS44NzYgMCAxIDEgMCAwIDEgMCAuNjk2IDEwLjc1IDEwLjc1IDAgMCAxLTE5Ljg3NiAwIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mYWNlYm9vay5qcwp2YXIgRmFjZWJvb2s7CnZhciBpbml0X2ZhY2Vib29rID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mYWNlYm9vay5qcyIoKSB7CiAgICBGYWNlYm9vayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDJoLTNhNSA1IDAgMCAwLTUgNXYzSDd2NGgzdjhoNHYtOGgzbDEtNGgtNFY3YTEgMSAwIDAgMSAxLTFoM3oiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mYWN0b3J5LmpzCnZhciBGYWN0b3J5Owp2YXIgaW5pdF9mYWN0b3J5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mYWN0b3J5LmpzIigpIHsKICAgIEZhY3RvcnkgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTZoLjAxIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMgMTlhMiAyIDAgMCAwIDIgMmgxNGEyIDIgMCAwIDAgMi0yVjguNWEuNS41IDAgMCAwLS43NjktLjQyMmwtNC40NjIgMi44NDRBLjUuNSAwIDAgMSAxNSAxMC41di0yYS41LjUgMCAwIDAtLjc2OS0uNDIyTDkuNzcgMTAuOTIyQS41LjUgMCAwIDEgOSAxMC41VjVhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTZoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmFuLmpzCnZhciBGYW47CnZhciBpbml0X2ZhbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmFuLmpzIigpIHsKICAgIEZhbiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwLjgyNyAxNi4zNzlhNi4wODIgNi4wODIgMCAwIDEtOC42MTgtNy4wMDJsNS40MTIgMS40NWE2LjA4MiA2LjA4MiAwIDAgMSA3LjAwMi04LjYxOGwtMS40NSA1LjQxMmE2LjA4MiA2LjA4MiAwIDAgMSA4LjYxOCA3LjAwMmwtNS40MTItMS40NWE2LjA4MiA2LjA4MiAwIDAgMS03LjAwMiA4LjYxOGwxLjQ1LTUuNDEyWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMnYuMDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mYXN0LWZvcndhcmQuanMKdmFyIEZhc3RGb3J3YXJkOwp2YXIgaW5pdF9mYXN0X2ZvcndhcmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Zhc3QtZm9yd2FyZC5qcyIoKSB7CiAgICBGYXN0Rm9yd2FyZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZhMiAyIDAgMCAxIDMuNDE0LTEuNDE0bDYgNmEyIDIgMCAwIDEgMCAyLjgyOGwtNiA2QTIgMiAwIDAgMSAxMiAxOHoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA2YTIgMiAwIDAgMSAzLjQxNC0xLjQxNGw2IDZhMiAyIDAgMCAxIDAgMi44MjhsLTYgNkEyIDIgMCAwIDEgMiAxOHoiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mZWF0aGVyLmpzCnZhciBGZWF0aGVyOwp2YXIgaW5pdF9mZWF0aGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mZWF0aGVyLmpzIigpIHsKICAgIEZlYXRoZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMi42NyAxOWEyIDIgMCAwIDAgMS40MTYtLjU4OGw2LjE1NC02LjE3MmE2IDYgMCAwIDAtOC40OS04LjQ5TDUuNTg2IDkuOTE0QTIgMiAwIDAgMCA1IDExLjMyOFYxOGExIDEgMCAwIDAgMSAxeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA4IDIgMjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuNSAxNUg5IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmVuY2UuanMKdmFyIEZlbmNlOwp2YXIgaW5pdF9mZW5jZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmVuY2UuanMiKCkgewogICAgRmVuY2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDMgMiA1djE1YzAgLjYuNCAxIDEgMWgyYy42IDAgMS0uNCAxLTFWNVoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA4aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDMtMiAydjE1YzAgLjYuNCAxIDEgMWgyYy42IDAgMS0uNCAxLTFWNVoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgOGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE4aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAgMy0yIDJ2MTVjMCAuNi40IDEgMSAxaDJjLjYgMCAxLS40IDEtMVY1WiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZlcnJpcy13aGVlbC5qcwp2YXIgRmVycmlzV2hlZWw7CnZhciBpbml0X2ZlcnJpc193aGVlbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmVycmlzLXdoZWVsLmpzIigpIHsKICAgIEZlcnJpc1doZWVsID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNi44IDE1LTMuNSAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwLjcgNy0zLjUgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjggOSAzLjMgNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMC43IDE3LTMuNS0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMjIgMy04IDMgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIyaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTguN2E5IDkgMCAxIDAtMTIgMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpZ21hLmpzCnZhciBGaWdtYTsKdmFyIGluaXRfZmlnbWEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpZ21hLmpzIigpIHsKICAgIEZpZ21hID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSA1LjVBMy41IDMuNSAwIDAgMSA4LjUgMkgxMnY3SDguNUEzLjUgMy41IDAgMCAxIDUgNS41eiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyaDMuNWEzLjUgMy41IDAgMSAxIDAgN0gxMlYyeiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMi41YTMuNSAzLjUgMCAxIDEgNyAwIDMuNSAzLjUgMCAxIDEtNyAweiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE5LjVBMy41IDMuNSAwIDAgMSA4LjUgMTZIMTJ2My41YTMuNSAzLjUgMCAxIDEtNyAweiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDEyLjVBMy41IDMuNSAwIDAgMSA4LjUgOUgxMnY3SDguNUEzLjUgMy41IDAgMCAxIDUgMTIuNXoiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWFyY2hpdmUuanMKdmFyIEZpbGVBcmNoaXZlOwp2YXIgaW5pdF9maWxlX2FyY2hpdmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtYXJjaGl2ZS5qcyIoKSB7CiAgICBGaWxlQXJjaGl2ZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEzLjY1OSAyMkgxOGEyIDIgMCAwIDAgMi0yVjhhMi40IDIuNCAwIDAgMC0uNzA2LTEuNzA2bC0zLjU4OC0zLjU4OEEyLjQgMi40IDAgMCAwIDE0IDJINmEyIDIgMCAwIDAtMiAydjExLjUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEydi0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTh2LTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA3VjYiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI4IiwgY3k6ICIyMCIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1heGlzLTNkLmpzCnZhciBGaWxlQXhpczNkOwp2YXIgaW5pdF9maWxlX2F4aXNfM2QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtYXhpcy0zZC5qcyIoKSB7CiAgICBGaWxlQXhpczNkID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggMTggNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTB2OGg4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1iYWRnZS5qcwp2YXIgRmlsZUJhZGdlOwp2YXIgaW5pdF9maWxlX2JhZGdlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWJhZGdlLmpzIigpIHsKICAgIEZpbGVCYWRnZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEzIDIyaDVhMiAyIDAgMCAwIDItMlY4YTIuNCAyLjQgMCAwIDAtLjcwNi0xLjcwNmwtMy41ODgtMy41ODhBMi40IDIuNCAwIDAgMCAxNCAySDZhMiAyIDAgMCAwLTIgMnYzLjMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm03LjY5IDE2LjQ3OSAxLjI5IDQuODhhLjUuNSAwIDAgMS0uNjk4LjU5MWwtMS44NDMtLjg0OWExIDEgMCAwIDAtLjg3OS4wMDFsLTEuODQ2Ljg1YS41LjUgMCAwIDEtLjY5Mi0uNTkzbDEuMjktNC44OCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYiLCBjeTogIjE0IiwgcjogIjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWJveC5qcwp2YXIgRmlsZUJveDsKdmFyIGluaXRfZmlsZV9ib3ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtYm94LmpzIigpIHsKICAgIEZpbGVCb3ggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNC41IDIySDE4YTIgMiAwIDAgMCAyLTJWOGEyLjQgMi40IDAgMCAwLS43MDYtMS43MDZsLTMuNTg4LTMuNTg4QTIuNCAyLjQgMCAwIDAgMTQgMkg2YTIgMiAwIDAgMC0yIDJ2My44IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEuNyAxNC4yIDcgMTdsLTQuNy0yLjgiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMyAxMy4xYTIgMiAwIDAgMC0uOTk5IDEuNzZ2My4yNGEyIDIgMCAwIDAgLjk2OSAxLjc4TDYgMjEuN2EyIDIgMCAwIDAgMi4wMy4wMUwxMSAxOS45YTIgMiAwIDAgMCAxLTEuNzZWMTQuOWEyIDIgMCAwIDAtLjk3LTEuNzhMOCAxMS4zYTIgMiAwIDAgMC0yLjAzLS4wMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxN3Y1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1icmFjZXMtY29ybmVyLmpzCnZhciBGaWxlQnJhY2VzQ29ybmVyOwp2YXIgaW5pdF9maWxlX2JyYWNlc19jb3JuZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtYnJhY2VzLWNvcm5lci5qcyIoKSB7CiAgICBGaWxlQnJhY2VzQ29ybmVyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTQgMjJoNGEyIDIgMCAwIDAgMi0yVjhhMi40IDIuNCAwIDAgMC0uNzA2LTEuNzA2bC0zLjU4OC0zLjU4OEEyLjQgMi40IDAgMCAwIDE0IDJINmEyIDIgMCAwIDAtMiAydjYiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE0YTEgMSAwIDAgMC0xIDF2MmExIDEgMCAwIDEtMSAxIDEgMSAwIDAgMSAxIDF2MmExIDEgMCAwIDAgMSAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMjJhMSAxIDAgMCAwIDEtMXYtMmExIDEgMCAwIDEgMS0xIDEgMSAwIDAgMS0xLTF2LTJhMSAxIDAgMCAwLTEtMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtYnJhY2VzLmpzCnZhciBGaWxlQnJhY2VzOwp2YXIgaW5pdF9maWxlX2JyYWNlcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1icmFjZXMuanMiKCkgewogICAgRmlsZUJyYWNlcyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYgMjJhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA0LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMmExIDEgMCAwIDAtMSAxdjFhMSAxIDAgMCAxLTEgMSAxIDEgMCAwIDEgMSAxdjFhMSAxIDAgMCAwIDEgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxOGExIDEgMCAwIDAgMS0xdi0xYTEgMSAwIDAgMSAxLTEgMSAxIDAgMCAxLTEtMXYtMWExIDEgMCAwIDAtMS0xIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1jaGFydC1jb2x1bW4taW5jcmVhc2luZy5qcwp2YXIgRmlsZUNoYXJ0Q29sdW1uSW5jcmVhc2luZzsKdmFyIGluaXRfZmlsZV9jaGFydF9jb2x1bW5faW5jcmVhc2luZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1jaGFydC1jb2x1bW4taW5jcmVhc2luZy5qcyIoKSB7CiAgICBGaWxlQ2hhcnRDb2x1bW5JbmNyZWFzaW5nID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTh2LTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTh2LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTh2LTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWNoYXJ0LWNvbHVtbi5qcwp2YXIgRmlsZUNoYXJ0Q29sdW1uOwp2YXIgaW5pdF9maWxlX2NoYXJ0X2NvbHVtbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1jaGFydC1jb2x1bW4uanMiKCkgewogICAgRmlsZUNoYXJ0Q29sdW1uID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTh2LTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTh2LTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTh2LTMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWNoYXJ0LWxpbmUuanMKdmFyIEZpbGVDaGFydExpbmU7CnZhciBpbml0X2ZpbGVfY2hhcnRfbGluZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1jaGFydC1saW5lLmpzIigpIHsKICAgIEZpbGVDaGFydExpbmUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02IDIyYTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNC43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTMtMy41IDMuNS0yLTJMOCAxNyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtY2hhcnQtcGllLmpzCnZhciBGaWxlQ2hhcnRQaWU7CnZhciBpbml0X2ZpbGVfY2hhcnRfcGllID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWNoYXJ0LXBpZS5qcyIoKSB7CiAgICBGaWxlQ2hhcnRQaWUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNS45NDEgMjJIMThhMiAyIDAgMCAwIDItMlY4YTIuNCAyLjQgMCAwIDAtLjcwNi0xLjcwNGwtMy41ODgtMy41ODhBMi40IDIuNCAwIDAgMCAxNCAySDZhMiAyIDAgMCAwLTIgMnYzLjUxMiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQuMDE3IDExLjUxMmE2IDYgMCAxIDAgOC40NjYgOC40NzUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOSAxNmExIDEgMCAwIDEtMS0xdi00YzAtLjU1Mi40NS0xLjAwOC45OTUtLjkxN2E2IDYgMCAwIDEgNC45MjIgNC45MjJjLjA5MS41NDQtLjM2NS45OTUtLjkxNy45OTV6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1jaGVjay1jb3JuZXIuanMKdmFyIEZpbGVDaGVja0Nvcm5lcjsKdmFyIGluaXRfZmlsZV9jaGVja19jb3JuZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtY2hlY2stY29ybmVyLmpzIigpIHsKICAgIEZpbGVDaGVja0Nvcm5lciA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwLjUgMjJINmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDYuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHY2IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgMjAgMiAyIDQtNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtY2hlY2suanMKdmFyIEZpbGVDaGVjazsKdmFyIGluaXRfZmlsZV9jaGVjayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1jaGVjay5qcyIoKSB7CiAgICBGaWxlQ2hlY2sgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02IDIyYTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNC43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxNSAyIDIgNC00IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1jb2RlLWNvcm5lci5qcwp2YXIgRmlsZUNvZGVDb3JuZXI7CnZhciBpbml0X2ZpbGVfY29kZV9jb3JuZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtY29kZS1jb3JuZXIuanMiKCkgewogICAgRmlsZUNvZGVDb3JuZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDEyLjE1VjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDYuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyaC0zLjM1IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNSAxNi0zIDMgMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMjIgMy0zLTMtMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtY2xvY2suanMKdmFyIEZpbGVDbG9jazsKdmFyIGluaXRfZmlsZV9jbG9jayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1jbG9jay5qcyIoKSB7CiAgICBGaWxlQ2xvY2sgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNiAyMmgyYTIgMiAwIDAgMCAyLTJWOGEyLjQgMi40IDAgMCAwLS43MDYtMS43MDZsLTMuNTg4LTMuNTg4QTIuNCAyLjQgMCAwIDAgMTQgMkg2YTIgMiAwIDAgMC0yIDJ2Mi44NSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTR2Mi4ybDEuNiAxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOCIsIGN5OiAiMTYiLCByOiAiNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtY29kZS5qcwp2YXIgRmlsZUNvZGU7CnZhciBpbml0X2ZpbGVfY29kZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1jb2RlLmpzIigpIHsKICAgIEZpbGVDb2RlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEyLjUgOCAxNWwyIDIuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAxMi41IDIgMi41LTIgMi41IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1jb2cuanMKdmFyIEZpbGVDb2c7CnZhciBpbml0X2ZpbGVfY29nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWNvZy5qcyIoKSB7CiAgICBGaWxlQ29nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgOGExIDEgMCAwIDEtMS0xVjJhMi40IDIuNCAwIDAgMSAxLjcwNC43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4eiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCA4djEyYTIgMiAwIDAgMS0yIDJoLTQuMTgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMuMzA1IDE5LjUzLjkyMy0uMzgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTAuNTkyVjRhMiAyIDAgMCAxIDItMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTQuMjI4IDE2Ljg1Mi0uOTI0LS4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNS44NTIgMTUuMjI4LS4zODMtLjkyMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01Ljg1MiAyMC43NzItLjM4My45MjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOC4xNDggMTUuMjI4LjM4My0uOTIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTguNTMgMjEuNjk2LS4zODItLjkyNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05Ljc3MyAxNi44NTIuOTIyLS4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOS43NzMgMTkuMTQ4LjkyMi4zODMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI3IiwgY3k6ICIxOCIsIHI6ICIzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1kaWdpdC5qcwp2YXIgRmlsZURpZ2l0Owp2YXIgaW5pdF9maWxlX2RpZ2l0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWRpZ2l0LmpzIigpIHsKICAgIEZpbGVEaWdpdCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQgMTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNi43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDIiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxNmgydjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMjJoNCIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjIiLCB5OiAiMTYiLCB3aWR0aDogIjQiLCBoZWlnaHQ6ICI2Iiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1kaWZmLmpzCnZhciBGaWxlRGlmZjsKdmFyIGluaXRfZmlsZV9kaWZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWRpZmYuanMiKCkgewogICAgRmlsZURpZmYgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02IDIyYTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNC43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTBoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxM1Y3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTdoNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtZG93bi5qcwp2YXIgRmlsZURvd247CnZhciBpbml0X2ZpbGVfZG93biA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1kb3duLmpzIigpIHsKICAgIEZpbGVEb3duID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4di02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTUgMyAzIDMtMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtZXhjbGFtYXRpb24tcG9pbnQuanMKdmFyIEZpbGVFeGNsYW1hdGlvblBvaW50Owp2YXIgaW5pdF9maWxlX2V4Y2xhbWF0aW9uX3BvaW50ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWV4Y2xhbWF0aW9uLXBvaW50LmpzIigpIHsKICAgIEZpbGVFeGNsYW1hdGlvblBvaW50ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA5djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTdoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1oZWFkcGhvbmUuanMKdmFyIEZpbGVIZWFkcGhvbmU7CnZhciBpbml0X2ZpbGVfaGVhZHBob25lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWhlYWRwaG9uZS5qcyIoKSB7CiAgICBGaWxlSGVhZHBob25lID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNCA2LjgzNVY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA2LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMmgtLjM0MyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMiAxOWEyIDIgMCAwIDEgNCAwdjFhMiAyIDAgMCAxLTQgMHYtNGE2IDYgMCAwIDEgMTIgMHY0YTIgMiAwIDAgMS00IDB2LTFhMiAyIDAgMCAxIDQgMCIgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWhlYXJ0LmpzCnZhciBGaWxlSGVhcnQ7CnZhciBpbml0X2ZpbGVfaGVhcnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtaGVhcnQuanMiKCkgewogICAgRmlsZUhlYXJ0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTMgMjJoNWEyIDIgMCAwIDAgMi0yVjhhMi40IDIuNCAwIDAgMC0uNzA2LTEuNzA2bC0zLjU4OC0zLjU4OEEyLjQgMi40IDAgMCAwIDE0IDJINmEyIDIgMCAwIDAtMiAydjciCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0zLjYyIDE4LjhBMi4yNSAyLjI1IDAgMSAxIDcgMTUuODM2YTIuMjUgMi4yNSAwIDEgMSAzLjM4IDIuOTY2bC0yLjYyNiAyLjg1NmExIDEgMCAwIDEtMS41MDcgMHoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWltYWdlLmpzCnZhciBGaWxlSW1hZ2U7CnZhciBpbml0X2ZpbGVfaW1hZ2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtaW1hZ2UuanMiKCkgewogICAgRmlsZUltYWdlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTAiLCBjeTogIjEyIiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAgMTctMS4yOTYtMS4yOTZhMi40MSAyLjQxIDAgMCAwLTMuNDA4IDBMOSAyMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtaW5wdXQuanMKdmFyIEZpbGVJbnB1dDsKdmFyIGluaXRfZmlsZV9pbnB1dCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1pbnB1dC5qcyIoKSB7CiAgICBGaWxlSW5wdXQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDExVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDYuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAySDZhMiAyIDAgMCAxLTItMnYtMSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTVoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxOCAzLTMtMy0zIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1sb2NrLmpzCnZhciBGaWxlTG9jazsKdmFyIGluaXRfZmlsZV9sb2NrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWxvY2suanMiKCkgewogICAgRmlsZUxvY2sgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDkuOFY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA2LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMmgtMyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTd2LTJhMiAyIDAgMCAwLTQgMHYyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICI1IiwgeDogIjMiLCB5OiAiMTciLCByeDogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWtleS5qcwp2YXIgRmlsZUtleTsKdmFyIGluaXRfZmlsZV9rZXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUta2V5LmpzIigpIHsKICAgIEZpbGVLZXkgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTJ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE0aDIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOS42NSAyMkgxOGEyIDIgMCAwIDAgMi0yVjhhMi40IDIuNCAwIDAgMC0uNzA2LTEuNzA2bC0zLjU4OC0zLjU4OEEyLjQgMi40IDAgMCAwIDE0IDJINmEyIDIgMCAwIDAtMiAydjQiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI0IiwgY3k6ICIyMCIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1taW51cy1jb3JuZXIuanMKdmFyIEZpbGVNaW51c0Nvcm5lcjsKdmFyIGluaXRfZmlsZV9taW51c19jb3JuZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtbWludXMtY29ybmVyLmpzIigpIHsKICAgIEZpbGVNaW51c0Nvcm5lciA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDE0VjhhMi40IDIuNCAwIDAgMC0uNzA2LTEuNzA2bC0zLjU4OC0zLjU4OEEyLjQgMi40IDAgMCAwIDE0IDJINmEyIDIgMCAwIDAtMiAydjE2YTIgMiAwIDAgMCAyIDJoMTIiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxOGg2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1taW51cy5qcwp2YXIgRmlsZU1pbnVzOwp2YXIgaW5pdF9maWxlX21pbnVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLW1pbnVzLmpzIigpIHsKICAgIEZpbGVNaW51cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYgMjJhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA0LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE1aDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLW11c2ljLmpzCnZhciBGaWxlTXVzaWM7CnZhciBpbml0X2ZpbGVfbXVzaWMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtbXVzaWMuanMiKCkgewogICAgRmlsZU11c2ljID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEuNjUgMjJIMThhMiAyIDAgMCAwIDItMlY4YTIuNCAyLjQgMCAwIDAtLjcwNi0xLjcwNmwtMy41ODgtMy41ODhBMi40IDIuNCAwIDAgMCAxNCAySDZhMiAyIDAgMCAwLTIgMnYxMC4zNSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjB2LTdsMyAxLjQ3NCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYiLCBjeTogIjIwIiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLW91dHB1dC5qcwp2YXIgRmlsZU91dHB1dDsKdmFyIGluaXRfZmlsZV9vdXRwdXQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtb3V0cHV0LmpzIigpIHsKICAgIEZpbGVPdXRwdXQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00LjIyNiAyMC45MjVBMiAyIDAgMCAwIDYgMjJoMTJhMiAyIDAgMCAwIDItMlY4YTIuNCAyLjQgMCAwIDAtLjcwNi0xLjcwNmwtMy41ODgtMy41ODhBMi40IDIuNCAwIDAgMCAxNCAySDZhMiAyIDAgMCAwLTIgMnYzLjEyNyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTUgMTEtMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTUgMTctMy0zaDEwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1wZW4tbGluZS5qcwp2YXIgRmlsZVBlbkxpbmU7CnZhciBpbml0X2ZpbGVfcGVuX2xpbmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtcGVuLWxpbmUuanMiKCkgewogICAgRmlsZVBlbkxpbmUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNC4zNjQgMTMuNjM0YTIgMiAwIDAgMC0uNTA2Ljg1NGwtLjgzNyAyLjg3YS41LjUgMCAwIDAgLjYyLjYybDIuODctLjgzN2EyIDIgMCAwIDAgLjg1NC0uNTA2bDQuMDEzLTQuMDA5YTEgMSAwIDAgMC0zLjAwNC0zLjAwNHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQuNDg3IDcuODU4QTEgMSAwIDAgMSAxNCA3VjIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMTkuNjQ1VjIwYTIgMiAwIDAgMS0yIDJINmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDIuNTE2IDIuNTE2IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMThoMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtcGVuLmpzCnZhciBGaWxlUGVuOwp2YXIgaW5pdF9maWxlX3BlbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1wZW4uanMiKCkgewogICAgRmlsZVBlbiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyLjY1OSAyMkgxOGEyIDIgMCAwIDAgMi0yVjhhMi40IDIuNCAwIDAgMC0uNzA2LTEuNzA2bC0zLjU4OC0zLjU4OEEyLjQgMi40IDAgMCAwIDE0IDJINmEyIDIgMCAwIDAtMiAydjkuMzQiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMC4zNzggMTIuNjIyYTEgMSAwIDAgMSAzIDMuMDAzTDguMzYgMjAuNjM3YTIgMiAwIDAgMS0uODU0LjUwNmwtMi44NjcuODM3YS41LjUgMCAwIDEtLjYyLS42MmwuODM2LTIuODY5YTIgMiAwIDAgMSAuNTA2LS44NTN6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1wbGF5LmpzCnZhciBGaWxlUGxheTsKdmFyIGluaXRfZmlsZV9wbGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXBsYXkuanMiKCkgewogICAgRmlsZVBsYXkgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02IDIyYTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNC43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTUuMDMzIDEzLjQ0YS42NDcuNjQ3IDAgMCAxIDAgMS4xMmwtNC4wNjUgMi4zNTJhLjY0NS42NDUgMCAwIDEtLjk2OC0uNTZ2LTQuNzA0YS42NDUuNjQ1IDAgMCAxIC45NjctLjU2eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtcGx1cy1jb3JuZXIuanMKdmFyIEZpbGVQbHVzQ29ybmVyOwp2YXIgaW5pdF9maWxlX3BsdXNfY29ybmVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXBsdXMtY29ybmVyLmpzIigpIHsKICAgIEZpbGVQbHVzQ29ybmVyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEuMzUgMjJINmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDYuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHY1LjM1IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTloNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxNnY2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1wbHVzLmpzCnZhciBGaWxlUGx1czsKdmFyIGluaXRfZmlsZV9wbHVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXBsdXMuanMiKCkgewogICAgRmlsZVBsdXMgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02IDIyYTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNC43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNWg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4di02IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1xdWVzdGlvbi1tYXJrLmpzCnZhciBGaWxlUXVlc3Rpb25NYXJrOwp2YXIgaW5pdF9maWxlX3F1ZXN0aW9uX21hcmsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtcXVlc3Rpb24tbWFyay5qcyIoKSB7CiAgICBGaWxlUXVlc3Rpb25NYXJrID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS4xIDlhMyAzIDAgMCAxIDUuODIgMWMwIDItMyAzLTMgMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtc2Nhbi5qcwp2YXIgRmlsZVNjYW47CnZhciBpbml0X2ZpbGVfc2NhbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1zY2FuLmpzIigpIHsKICAgIEZpbGVTY2FuID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMTBWOGEyLjQgMi40IDAgMCAwLS43MDYtMS43MDRsLTMuNTg4LTMuNTg4QTIuNCAyLjQgMCAwIDAgMTQgMkg2YTIgMiAwIDAgMC0yIDJ2MTZhMiAyIDAgMCAwIDIgMmg0LjM1IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTRhMiAyIDAgMCAwLTIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAyMmEyIDIgMCAwIDEtMi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE0YTIgMiAwIDAgMSAyIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMjJhMiAyIDAgMCAwIDItMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtc2VhcmNoLWNvcm5lci5qcwp2YXIgRmlsZVNlYXJjaENvcm5lcjsKdmFyIGluaXRfZmlsZV9zZWFyY2hfY29ybmVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXNlYXJjaC1jb3JuZXIuanMiKCkgewogICAgRmlsZVNlYXJjaENvcm5lciA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTExLjEgMjJINmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDYuNzA2bDMuNTg5IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYzLjI1IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMjItMi44OC0yLjg4IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYiLCBjeTogIjE3IiwgcjogIjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXNlYXJjaC5qcwp2YXIgRmlsZVNlYXJjaDsKdmFyIGluaXRfZmlsZV9zZWFyY2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtc2VhcmNoLmpzIigpIHsKICAgIEZpbGVTZWFyY2ggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02IDIyYTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNC43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMS41IiwgY3k6ICIxNC41IiwgcjogIjIuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMy4zIDE2LjMgMTUgMTgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXNpZ25hbC5qcwp2YXIgRmlsZVNpZ25hbDsKdmFyIGluaXRfZmlsZV9zaWduYWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtc2lnbmFsLmpzIigpIHsKICAgIEZpbGVTaWduYWwgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02IDIyYTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNC43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEuNSAxMy41YTIuNSAyLjUgMCAwIDEgMCAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEyYTUgNSAwIDAgMSAwIDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXNsaWRlcnMuanMKdmFyIEZpbGVTbGlkZXJzOwp2YXIgaW5pdF9maWxlX3NsaWRlcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtc2xpZGVycy5qcyIoKSB7CiAgICBGaWxlU2xpZGVycyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYgMjJhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA0LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEyaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTF2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE3aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTZ2MiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtc3ByZWFkc2hlZXQuanMKdmFyIEZpbGVTcHJlYWRzaGVldDsKdmFyIGluaXRfZmlsZV9zcHJlYWRzaGVldCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1zcHJlYWRzaGVldC5qcyIoKSB7CiAgICBGaWxlU3ByZWFkc2hlZXQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02IDIyYTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNC43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxM2gyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDEzaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxN2gyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE3aDIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXN0YWNrLmpzCnZhciBGaWxlU3RhY2s7CnZhciBpbml0X2ZpbGVfc3RhY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtc3RhY2suanMiKCkgewogICAgRmlsZVN0YWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMjFhMSAxIDAgMCAxLTEgMUg0YTEgMSAwIDAgMS0xLTF2LThhMSAxIDAgMCAxIDEtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNmExIDEgMCAwIDEtMSAxSDlhMSAxIDAgMCAxLTEtMVY4YTEgMSAwIDAgMSAxLTEiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEgNmEyIDIgMCAwIDAtLjU4Ni0xLjQxNGwtMi0yQTIgMiAwIDAgMCAxNyAyaC0zYTEgMSAwIDAgMC0xIDF2OGExIDEgMCAwIDAgMSAxaDZhMSAxIDAgMCAwIDEtMXoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXN5bWxpbmsuanMKdmFyIEZpbGVTeW1saW5rOwp2YXIgaW5pdF9maWxlX3N5bWxpbmsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtc3ltbGluay5qcyIoKSB7CiAgICBGaWxlU3ltbGluayA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQgMTFWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNi43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJINmEyIDIgMCAwIDEtMi0ydi0zYTIgMiAwIDAgMSAyLTJoNyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEwIDE4IDMtMy0zLTMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXRleHQuanMKdmFyIEZpbGVUZXh0Owp2YXIgaW5pdF9maWxlX3RleHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtdGV4dC5qcyIoKSB7CiAgICBGaWxlVGV4dCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYgMjJhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA0LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA5SDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTNIOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxN0g4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS10eXBlLmpzCnZhciBGaWxlVHlwZTsKdmFyIGluaXRfZmlsZV90eXBlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXR5cGUuanMiKCkgewogICAgRmlsZVR5cGUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02IDIyYTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNC43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMThoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTN2LS41YS41LjUgMCAwIDEgLjUtLjVoNWEuNS41IDAgMCAxIC41LjV2LjUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXRlcm1pbmFsLmpzCnZhciBGaWxlVGVybWluYWw7CnZhciBpbml0X2ZpbGVfdGVybWluYWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtdGVybWluYWwuanMiKCkgewogICAgRmlsZVRlcm1pbmFsID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggMTYgMi0yLTItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOGg0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS10eXBlLWNvcm5lci5qcwp2YXIgRmlsZVR5cGVDb3JuZXI7CnZhciBpbml0X2ZpbGVfdHlwZV9jb3JuZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtdHlwZS1jb3JuZXIuanMiKCkgewogICAgRmlsZVR5cGVDb3JuZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMiAyMmg2YTIgMiAwIDAgMCAyLTJWOGEyLjQgMi40IDAgMCAwLS43MDYtMS43MDZsLTMuNTg4LTMuNTg4QTIuNCAyLjQgMCAwIDAgMTQgMkg2YTIgMiAwIDAgMC0yIDJ2NiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTZ2LTEuNWEuNS41IDAgMCAxIC41LS41aDdhLjUuNSAwIDAgMSAuNS41VjE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMjJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE0djgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXVwLmpzCnZhciBGaWxlVXA7CnZhciBpbml0X2ZpbGVfdXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtdXAuanMiKCkgewogICAgRmlsZVVwID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEydjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgMTUtMy0zLTMgMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtdXNlci5qcwp2YXIgRmlsZVVzZXI7CnZhciBpbml0X2ZpbGVfdXNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS11c2VyLmpzIigpIHsKICAgIEZpbGVVc2VyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDIyYTQgNCAwIDAgMC04IDAiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTUiLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtdmlkZW8tY2FtZXJhLmpzCnZhciBGaWxlVmlkZW9DYW1lcmE7CnZhciBpbml0X2ZpbGVfdmlkZW9fY2FtZXJhID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXZpZGVvLWNhbWVyYS5qcyIoKSB7CiAgICBGaWxlVmlkZW9DYW1lcmEgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDEyVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDYuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIm0xMCAxNy44NDMgMy4wMzMtMS43NTVhLjY0LjY0IDAgMCAxIC45NjcuNTZ2NC43MDRhLjY1LjY1IDAgMCAxLS45NjcuNTZMMTAgMjAuMTU3IiB9CiAgICAgIF0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiNiIsIHg6ICIzIiwgeTogIjE2Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS14LWNvcm5lci5qcwp2YXIgRmlsZVhDb3JuZXI7CnZhciBpbml0X2ZpbGVfeF9jb3JuZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUteC1jb3JuZXIuanMiKCkgewogICAgRmlsZVhDb3JuZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMSAyMkg2YTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNi43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxNyA1IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAgMTctNSA1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS12b2x1bWUuanMKdmFyIEZpbGVWb2x1bWU7CnZhciBpbml0X2ZpbGVfdm9sdW1lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXZvbHVtZS5qcyIoKSB7CiAgICBGaWxlVm9sdW1lID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNCAxMS41NVY0YTIgMiAwIDAgMSAyLTJoOGEyLjQgMi40IDAgMCAxIDEuNzA2LjcwNmwzLjU4OCAzLjU4OEEyLjQgMi40IDAgMCAxIDIwIDh2MTJhMiAyIDAgMCAxLTIgMmgtMS45NSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAydjVhMSAxIDAgMCAwIDEgMWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE1YTUgNSAwIDAgMSAwIDYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOCAxNC41MDJhLjUuNSAwIDAgMC0uODI2LS4zODFsLTEuODkzIDEuNjMxYTEgMSAwIDAgMS0uNjUxLjI0M0gzLjVhLjUuNSAwIDAgMC0uNS41MDF2My4wMDZhLjUuNSAwIDAgMCAuNS41MDFoMS4xMjlhMSAxIDAgMCAxIC42NTIuMjQzbDEuODkzIDEuNjMzYS41LjUgMCAwIDAgLjgyNi0uMzh6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS14LmpzCnZhciBGaWxlWDsKdmFyIGluaXRfZmlsZV94ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXguanMiKCkgewogICAgRmlsZVggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02IDIyYTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNC43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuNSAxMi41LTUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05LjUgMTIuNSA1IDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLmpzCnZhciBGaWxlOwp2YXIgaW5pdF9maWxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLmpzIigpIHsKICAgIEZpbGUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02IDIyYTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNC43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djEyYTIgMiAwIDAgMS0yIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlcy5qcwp2YXIgRmlsZXM7CnZhciBpbml0X2ZpbGVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlcy5qcyIoKSB7CiAgICBGaWxlcyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDJoLTRhMiAyIDAgMCAwLTIgMnYxMWEyIDIgMCAwIDAgMiAyaDhhMiAyIDAgMCAwIDItMlY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2LjcwNiAyLjcwNkEyLjQgMi40IDAgMCAwIDE1IDJ2NWExIDEgMCAwIDAgMSAxaDVhMi40IDIuNCAwIDAgMC0uNzA2LTEuNzA2eiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDdhMiAyIDAgMCAwLTIgMnYxMWEyIDIgMCAwIDAgMiAyaDhhMiAyIDAgMCAwIDEuNzMyLTEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxtLmpzCnZhciBGaWxtOwp2YXIgaW5pdF9maWxtID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxtLmpzIigpIHsKICAgIEZpbG0gPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDN2MTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA3LjVoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyaDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTYuNWg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDN2MTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgNy41aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTYuNWg0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmluZ2VycHJpbnQtcGF0dGVybi5qcwp2YXIgRmluZ2VycHJpbnRQYXR0ZXJuOwp2YXIgaW5pdF9maW5nZXJwcmludF9wYXR0ZXJuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maW5nZXJwcmludC1wYXR0ZXJuLmpzIigpIHsKICAgIEZpbmdlcnByaW50UGF0dGVybiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEwYTIgMiAwIDAgMC0yIDJjMCAxLjAyLS4xIDIuNTEtLjI2IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTMuMTJjMCAyLjM4IDAgNi4zOC0xIDguODgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuMjkgMjEuMDJjLjEyLS42LjQzLTIuMy41LTMuMDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmExMCAxMCAwIDAgMSAxOC02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTZoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxLjggMTZjLjItMiAuMTMxLTUuMzU0IDAtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE5LjVDNS41IDE4IDYgMTUgNiAxMmE2IDYgMCAwIDEgLjM0LTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC42NSAyMmMuMjEtLjY2LjQ1LTEuMzIuNTctMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDYuOGE2IDYgMCAwIDEgOSA1LjJ2MiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpcmUtZXh0aW5ndWlzaGVyLmpzCnZhciBGaXJlRXh0aW5ndWlzaGVyOwp2YXIgaW5pdF9maXJlX2V4dGluZ3Vpc2hlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlyZS1leHRpbmd1aXNoZXIuanMiKCkgewogICAgRmlyZUV4dGluZ3Vpc2hlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDYuNVYzYTEgMSAwIDAgMC0xLTFoLTJhMSAxIDAgMCAwLTEgMXYzLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxOGg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDNoLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgM2E2IDYgMCAwIDAtNiA2djExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTNoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxMGE0IDQgMCAwIDAtOCAwdjEwYTIgMiAwIDAgMCAyIDJoNGEyIDIgMCAwIDAgMi0yWiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Zpc2gtb2ZmLmpzCnZhciBGaXNoT2ZmOwp2YXIgaW5pdF9maXNoX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlzaC1vZmYuanMiKCkgewogICAgRmlzaE9mZiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE4IDEyLjQ3di4wM20wLS41di40N20tLjQ3NSA1LjA1NkE2Ljc0NCA2Ljc0NCAwIDAgMSAxNSAxOGMtMy41NiAwLTcuNTYtMi41My04LjUtNiAuMzQ4LTEuMjggMS4xMTQtMi40MzMgMi4xMjEtMy4zOG0zLjQ0NC0yLjA4OEE4LjgwMiA4LjgwMiAwIDAgMSAxNSA2YzMuNTYgMCA2LjA2IDIuNTQgNyA2LS4zMDkgMS4xNC0uNzg2IDIuMTc3LTEuNDEzIDMuMDU4IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTcgMTAuNjdDNyA4IDUuNTggNS45NyAyLjczIDUuNWMtMSAxLjUtMSA1IC4yMyA2LjUtMS4yNCAxLjUtMS4yNCA1LS4yMyA2LjVDNS41OCAxOC4wMyA3IDE2IDcgMTMuMzNtNy40OC00LjM3MkE5Ljc3IDkuNzcgMCAwIDEgMTYgNi4wN20wIDExLjg2YTkuNzcgOS43NyAwIDAgMS0xLjcyOC0zLjYxOCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xNi4wMSAxNy45My0uMjMgMS40QTIgMiAwIDAgMSAxMy44IDIxSDkuNWE1Ljk2IDUuOTYgMCAwIDAgMS40OS0zLjk4TTguNTMgM2g1LjI3YTIgMiAwIDAgMSAxLjk4IDEuNjdsLjIzIDEuNE0yIDJsMjAgMjAiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maXNoLXN5bWJvbC5qcwp2YXIgRmlzaFN5bWJvbDsKdmFyIGluaXRfZmlzaF9zeW1ib2wgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Zpc2gtc3ltYm9sLmpzIigpIHsKICAgIEZpc2hTeW1ib2wgPSBbWyJwYXRoIiwgeyBkOiAiTTIgMTZzOS0xNSAyMC00QzExIDIzIDIgOCAyIDgiIH1dXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlzaC5qcwp2YXIgRmlzaDsKdmFyIGluaXRfZmlzaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlzaC5qcyIoKSB7CiAgICBGaXNoID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNi41IDEyYy45NC0zLjQ2IDQuOTQtNiA4LjUtNiAzLjU2IDAgNi4wNiAyLjU0IDcgNi0uOTQgMy40Ny0zLjQ0IDYtNyA2cy03LjU2LTIuNTMtOC41LTZaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDEydi41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE3LjkzYTkuNzcgOS43NyAwIDAgMSAwLTExLjg2IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTcgMTAuNjdDNyA4IDUuNTggNS45NyAyLjczIDUuNWMtMSAxLjUtMSA1IC4yMyA2LjUtMS4yNCAxLjUtMS4yNCA1LS4yMyA2LjVDNS41OCAxOC4wMyA3IDE2IDcgMTMuMzMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAuNDYgNy4yNkMxMC4yIDUuODggOS4xNyA0LjI0IDggM2g1LjhhMiAyIDAgMCAxIDEuOTggMS42N2wuMjMgMS40IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2LjAxIDE3LjkzLS4yMyAxLjRBMiAyIDAgMCAxIDEzLjggMjFIOS41YTUuOTYgNS45NiAwIDAgMCAxLjQ5LTMuOTgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maXNoaW5nLWhvb2suanMKdmFyIEZpc2hpbmdIb29rOwp2YXIgaW5pdF9maXNoaW5nX2hvb2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Zpc2hpbmctaG9vay5qcyIoKSB7CiAgICBGaXNoaW5nSG9vayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3LjU4NiAxMS40MTQtNS45MyA1LjkzYTEgMSAwIDAgMS04LThsMy4xMzctMy4xMzdhLjcwNy43MDcgMCAwIDEgMS4yMDcuNVYxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC40MTQgOC41ODYgMjIgNyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE5IiwgY3k6ICIxMCIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlzaGluZy1yb2QuanMKdmFyIEZpc2hpbmdSb2Q7CnZhciBpbml0X2Zpc2hpbmdfcm9kID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9maXNoaW5nLXJvZC5qcyIoKSB7CiAgICBGaXNoaW5nUm9kID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMWgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTVhMiAyIDAgMCAxLTQgMFYzYTEgMSAwIDAgMSAxLTFoLjVDMTQgMiAyMCA5IDIwIDE4djQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiMTgiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZsYWctdHJpYW5nbGUtbGVmdC5qcwp2YXIgRmxhZ1RyaWFuZ2xlTGVmdDsKdmFyIGluaXRfZmxhZ190cmlhbmdsZV9sZWZ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mbGFnLXRyaWFuZ2xlLWxlZnQuanMiKCkgewogICAgRmxhZ1RyaWFuZ2xlTGVmdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDIyVjIuOGEuOC44IDAgMCAwLTEuMTctLjcxTDUuNDUgNy43OGEuOC44IDAgMCAwIDAgMS40NEwxOCAxNS41IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxhZy1vZmYuanMKdmFyIEZsYWdPZmY7CnZhciBpbml0X2ZsYWdfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mbGFnLW9mZi5qcyIoKSB7CiAgICBGbGFnT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTZjLTMgMC01LTItOC0yYTYgNiAwIDAgMC00IDEuNTI4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDIyVjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNy42NTYgMkg4YzMgMCA1IDIgNy4zMzMgMnEyIDAgMy4wNjctLjhBMSAxIDAgMCAxIDIwIDR2MTAuMzQ3IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxhZy10cmlhbmdsZS1yaWdodC5qcwp2YXIgRmxhZ1RyaWFuZ2xlUmlnaHQ7CnZhciBpbml0X2ZsYWdfdHJpYW5nbGVfcmlnaHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZsYWctdHJpYW5nbGUtcmlnaHQuanMiKCkgewogICAgRmxhZ1RyaWFuZ2xlUmlnaHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDIyVjIuOGEuOC44IDAgMCAxIDEuMTctLjcxbDExLjM4IDUuNjlhLjguOCAwIDAgMSAwIDEuNDRMNiAxNS41IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxhZy5qcwp2YXIgRmxhZzsKdmFyIGluaXRfZmxhZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxhZy5qcyIoKSB7CiAgICBGbGFnID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNCAyMlY0YTEgMSAwIDAgMSAuNC0uOEE2IDYgMCAwIDEgOCAyYzMgMCA1IDIgNy4zMzMgMnEyIDAgMy4wNjctLjhBMSAxIDAgMCAxIDIwIDR2MTBhMSAxIDAgMCAxLS40LjhBNiA2IDAgMCAxIDE2IDE2Yy0zIDAtNS0yLTgtMmE2IDYgMCAwIDAtNCAxLjUyOCIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZsYW1lLWtpbmRsaW5nLmpzCnZhciBGbGFtZUtpbmRsaW5nOwp2YXIgaW5pdF9mbGFtZV9raW5kbGluZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxhbWUta2luZGxpbmcuanMiKCkgewogICAgRmxhbWVLaW5kbGluZyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyIDJjMSAzIDIuNSAzLjUgMy41IDQuNUE1IDUgMCAwIDEgMTcgMTBhNSA1IDAgMSAxLTEwIDBjMC0uMyAwLS42LjEtLjlhMiAyIDAgMSAwIDMuMy0yQzggNC41IDExIDIgMTIgMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNSAyMiAxNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTUgMTggMTQgNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZsYW1lLmpzCnZhciBGbGFtZTsKdmFyIGluaXRfZmxhbWUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZsYW1lLmpzIigpIHsKICAgIEZsYW1lID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTIgM3ExIDQgNCA2LjV0MyA1LjVhMSAxIDAgMCAxLTE0IDAgNSA1IDAgMCAxIDEtMyAxIDEgMCAwIDAgNSAwYzAtMi0xLjUtMy0xLjUtNXEwLTIgMi41LTQiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mbGFzaGxpZ2h0LW9mZi5qcwp2YXIgRmxhc2hsaWdodE9mZjsKdmFyIGluaXRfZmxhc2hsaWdodF9vZmYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZsYXNobGlnaHQtb2ZmLmpzIigpIHsKICAgIEZsYXNobGlnaHRPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMS42NTIgNkgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxM3YxIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTYgMTZ2NGEyIDIgMCAwIDEtMiAyaC00YTIgMiAwIDAgMS0yLTJ2LThhNCA0IDAgMCAwLS44LTIuNGwtLjYtLjhBMyAzIDAgMCAxIDYgN1Y2IiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNy42NDkgMkgxN2ExIDEgMCAwIDEgMSAxdjRhMyAzIDAgMCAxLS42IDEuOGwtLjYuOGE0IDQgMCAwIDAtLjU1IDEuMDA3IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxhc2hsaWdodC5qcwp2YXIgRmxhc2hsaWdodDsKdmFyIGluaXRfZmxhc2hsaWdodCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxhc2hsaWdodC5qcyIoKSB7CiAgICBGbGFzaGxpZ2h0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTN2MSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNyAyYTEgMSAwIDAgMSAxIDF2NGEzIDMgMCAwIDEtLjYgMS44bC0uNi44QTQgNCAwIDAgMCAxNiAxMnY4YTIgMiAwIDAgMS0yIDJIMTBhMiAyIDAgMCAxLTItMnYtOGE0IDQgMCAwIDAtLjgtMi40bC0uNi0uOEEzIDMgMCAwIDEgNiA3VjNhMSAxIDAgMCAxIDEtMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA2aDEyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxhc2stY29uaWNhbC5qcwp2YXIgRmxhc2tDb25pY2FsOwp2YXIgaW5pdF9mbGFza19jb25pY2FsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mbGFzay1jb25pY2FsLmpzIigpIHsKICAgIEZsYXNrQ29uaWNhbCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE0IDJ2NmEyIDIgMCAwIDAgLjI0NS45Nmw1LjUxIDEwLjA4QTIgMiAwIDAgMSAxOCAyMkg2YTIgMiAwIDAgMS0xLjc1NS0yLjk2bDUuNTEtMTAuMDhBMiAyIDAgMCAwIDEwIDhWMiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjQ1MyAxNWgxMS4wOTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC41IDJoNyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZsYXNrLWNvbmljYWwtb2ZmLmpzCnZhciBGbGFza0NvbmljYWxPZmY7CnZhciBpbml0X2ZsYXNrX2NvbmljYWxfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mbGFzay1jb25pY2FsLW9mZi5qcyIoKSB7CiAgICBGbGFza0NvbmljYWxPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAydjIuMzQzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2Ni4zNDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDIwYTIgMiAwIDAgMS0yIDJINmEyIDIgMCAwIDEtMS43NTUtMi45Nmw1LjIyNy05LjU2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjQ1MyAxNUgxNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjUgMmg3IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxhc2stcm91bmQuanMKdmFyIEZsYXNrUm91bmQ7CnZhciBpbml0X2ZsYXNrX3JvdW5kID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mbGFzay1yb3VuZC5qcyIoKSB7CiAgICBGbGFza1JvdW5kID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMnY2LjI5MmE3IDcgMCAxIDAgNCAwVjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxNWgxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjUgMmg3IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxpcC1ob3Jpem9udGFsLTIuanMKdmFyIEZsaXBIb3Jpem9udGFsMjsKdmFyIGluaXRfZmxpcF9ob3Jpem9udGFsXzIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZsaXAtaG9yaXpvbnRhbC0yLmpzIigpIHsKICAgIEZsaXBIb3Jpem9udGFsMiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgNyA1IDUtNSA1VjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgNy01IDUgNSA1VjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjB2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDh2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mbGlwLXZlcnRpY2FsLTIuanMKdmFyIEZsaXBWZXJ0aWNhbDI7CnZhciBpbml0X2ZsaXBfdmVydGljYWxfMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxpcC12ZXJ0aWNhbC0yLmpzIigpIHsKICAgIEZsaXBWZXJ0aWNhbDIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAzLTUgNS01LTVoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMjEtNS01LTUgNWgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEySDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTJIOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMmgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxMmgtMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Zsb3dlci0yLmpzCnZhciBGbG93ZXIyOwp2YXIgaW5pdF9mbG93ZXJfMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxvd2VyLTIuanMiKCkgewogICAgRmxvd2VyMiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyIDVhMyAzIDAgMSAxIDMgM20tMy0zYTMgMyAwIDEgMC0zIDNtMy0zdjFNOSA4YTMgMyAwIDEgMCAzIDNNOSA4aDFtNSAwYTMgMyAwIDEgMS0zIDNtMy0zaC0xbS0yIDN2LTEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiOCIsIHI6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEwdjEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIyYzQuMiAwIDctMS42NjcgNy01LTQuMiAwLTcgMS42NjctNyA1WiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMmMtNC4yIDAtNy0xLjY2Ny03LTUgNC4yIDAgNyAxLjY2NyA3IDVaIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxvd2VyLmpzCnZhciBGbG93ZXI7CnZhciBpbml0X2Zsb3dlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxvd2VyLmpzIigpIHsKICAgIEZsb3dlciA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTIgMTYuNUE0LjUgNC41IDAgMSAxIDcuNSAxMiA0LjUgNC41IDAgMSAxIDEyIDcuNWE0LjUgNC41IDAgMSAxIDQuNSA0LjUgNC41IDQuNSAwIDEgMS00LjUgNC41IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDcuNVY5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcuNSAxMkg5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2LjUgMTJIMTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTYuNVYxNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDggMS44OCAxLjg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0LjEyIDkuODggMTYgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDE2IDEuODgtMS44OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNC4xMiAxNC4xMiAxNiAxNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvY3VzLmpzCnZhciBGb2N1czsKdmFyIGluaXRfZm9jdXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvY3VzLmpzIigpIHsKICAgIEZvY3VzID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDdWNWEyIDIgMCAwIDEgMi0yaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgM2gyYTIgMiAwIDAgMSAyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxN3YyYTIgMiAwIDAgMS0yIDJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMUg1YTIgMiAwIDAgMS0yLTJ2LTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkLWhvcml6b250YWwuanMKdmFyIEZvbGRIb3Jpem9udGFsOwp2YXIgaW5pdF9mb2xkX2hvcml6b250YWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGQtaG9yaXpvbnRhbC5qcyIoKSB7CiAgICBGb2xkSG9yaXpvbnRhbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxMmgtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE0djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjB2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOSA5LTMgMyAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNSAxNSAzLTMtMy0zIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZC12ZXJ0aWNhbC5qcwp2YXIgRm9sZFZlcnRpY2FsOwp2YXIgaW5pdF9mb2xkX3ZlcnRpY2FsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkLXZlcnRpY2FsLmpzIigpIHsKICAgIEZvbGRWZXJ0aWNhbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIydi02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDhWMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEySDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTJIOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMmgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxMmgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxOS0zLTMtMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDUtMyAzLTMtMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1hcmNoaXZlLmpzCnZhciBGb2xkZXJBcmNoaXZlOwp2YXIgaW5pdF9mb2xkZXJfYXJjaGl2ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLWFyY2hpdmUuanMiKCkgewogICAgRm9sZGVyQXJjaGl2ZSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTUiLCBjeTogIjE5IiwgcjogIjIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAuOSAxOS44QTIgMiAwIDAgMCAyMiAxOFY4YTIgMiAwIDAgMC0yLTJoLTcuOWEyIDIgMCAwIDEtMS42OS0uOUw5LjYgMy45QTIgMiAwIDAgMCA3LjkzIDNINGEyIDIgMCAwIDAtMiAydjEzYTIgMiAwIDAgMCAyIDJoNS4xIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDExdi0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDE3di0yIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLWNoZWNrLmpzCnZhciBGb2xkZXJDaGVjazsKdmFyIGluaXRfZm9sZGVyX2NoZWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItY2hlY2suanMiKCkgewogICAgRm9sZGVyQ2hlY2sgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAyMGEyIDIgMCAwIDAgMi0yVjhhMiAyIDAgMCAwLTItMmgtNy45YTIgMiAwIDAgMS0xLjY5LS45TDkuNiAzLjlBMiAyIDAgMCAwIDcuOTMgM0g0YTIgMiAwIDAgMC0yIDJ2MTNhMiAyIDAgMCAwIDIgMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxMyAyIDIgNC00IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLWNsb2NrLmpzCnZhciBGb2xkZXJDbG9jazsKdmFyIGluaXRfZm9sZGVyX2Nsb2NrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItY2xvY2suanMiKCkgewogICAgRm9sZGVyQ2xvY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNHYyLjJsMS42IDEiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNyAyMEg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDMuOWEyIDIgMCAwIDEgMS42OS45bC44MSAxLjJhMiAyIDAgMCAwIDEuNjcuOUgyMGEyIDIgMCAwIDEgMiAyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYiLCBjeTogIjE2IiwgcjogIjYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItY2xvc2VkLmpzCnZhciBGb2xkZXJDbG9zZWQ7CnZhciBpbml0X2ZvbGRlcl9jbG9zZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1jbG9zZWQuanMiKCkgewogICAgRm9sZGVyQ2xvc2VkID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMjBhMiAyIDAgMCAwIDItMlY4YTIgMiAwIDAgMC0yLTJoLTcuOWEyIDIgMCAwIDEtMS42OS0uOUw5LjYgMy45QTIgMiAwIDAgMCA3LjkzIDNINGEyIDIgMCAwIDAtMiAydjEzYTIgMiAwIDAgMCAyIDJaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTBoMjAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItY29kZS5qcwp2YXIgRm9sZGVyQ29kZTsKdmFyIGluaXRfZm9sZGVyX2NvZGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1jb2RlLmpzIigpIHsKICAgIEZvbGRlckNvZGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMC41IDggMTNsMiAyLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgMTAuNSAyIDIuNS0yIDIuNSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAyMGEyIDIgMCAwIDAgMi0yVjhhMiAyIDAgMCAwLTItMmgtNy45YTIgMiAwIDAgMS0xLjY5LS45TDkuNiAzLjlBMiAyIDAgMCAwIDcuOTMgM0g0YTIgMiAwIDAgMC0yIDJ2MTNhMiAyIDAgMCAwIDIgMnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItY29nLmpzCnZhciBGb2xkZXJDb2c7CnZhciBpbml0X2ZvbGRlcl9jb2cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1jb2cuanMiKCkgewogICAgRm9sZGVyQ29nID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTAuMyAyMEg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDMuOThhMiAyIDAgMCAxIDEuNjkuOWwuNjYgMS4yQTIgMiAwIDAgMCAxMiA2aDhhMiAyIDAgMCAxIDIgMnYzLjMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuMzA1IDE5LjUzLjkyMy0uMzgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1LjIyOCAxNi44NTItLjkyMy0uMzgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2Ljg1MiAxNS4yMjgtLjM4My0uOTIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2Ljg1MiAyMC43NzItLjM4My45MjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkuMTQ4IDE1LjIyOC4zODMtLjkyMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOS41MyAyMS42OTYtLjM4Mi0uOTI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwLjc3MiAxNi44NTIuOTI0LS4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAuNzcyIDE5LjE0OC45MjQuMzgzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjE4IiwgcjogIjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItZG90LmpzCnZhciBGb2xkZXJEb3Q7CnZhciBpbml0X2ZvbGRlcl9kb3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1kb3QuanMiKCkgewogICAgRm9sZGVyRG90ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNCAyMGgxNmEyIDIgMCAwIDAgMi0yVjhhMiAyIDAgMCAwLTItMmgtNy45M2EyIDIgMCAwIDEtMS42Ni0uOWwtLjgyLTEuMkEyIDIgMCAwIDAgNy45MyAzSDRhMiAyIDAgMCAwLTIgMnYxM2MwIDEuMS45IDIgMiAyWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMyIsIHI6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLWRvd24uanMKdmFyIEZvbGRlckRvd247CnZhciBpbml0X2ZvbGRlcl9kb3duID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItZG93bi5qcyIoKSB7CiAgICBGb2xkZXJEb3duID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMjBhMiAyIDAgMCAwIDItMlY4YTIgMiAwIDAgMC0yLTJoLTcuOWEyIDIgMCAwIDEtMS42OS0uOUw5LjYgMy45QTIgMiAwIDAgMCA3LjkzIDNINGEyIDIgMCAwIDAtMiAydjEzYTIgMiAwIDAgMCAyIDJaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEwdjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgMTMtMyAzLTMtMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1naXQtMi5qcwp2YXIgRm9sZGVyR2l0MjsKdmFyIGluaXRfZm9sZGVyX2dpdF8yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItZ2l0LTIuanMiKCkgewogICAgRm9sZGVyR2l0MiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE5YTUgNSAwIDAgMS01LTV2OCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk05IDIwSDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMy45YTIgMiAwIDAgMSAxLjY5LjlsLjgxIDEuMmEyIDIgMCAwIDAgMS42Ny45SDIwYTIgMiAwIDAgMSAyIDJ2NSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEzIiwgY3k6ICIxMiIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMjAiLCBjeTogIjE5IiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItZ2l0LmpzCnZhciBGb2xkZXJHaXQ7CnZhciBpbml0X2ZvbGRlcl9naXQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1naXQuanMiKCkgewogICAgRm9sZGVyR2l0ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTMiLCByOiAiMiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAyMGEyIDIgMCAwIDAgMi0yVjhhMiAyIDAgMCAwLTItMmgtNy45YTIgMiAwIDAgMS0xLjY5LS45TDkuNiAzLjlBMiAyIDAgMCAwIDcuOTMgM0g0YTIgMiAwIDAgMC0yIDJ2MTNhMiAyIDAgMCAwIDIgMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTNoMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEzaDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItaGVhcnQuanMKdmFyIEZvbGRlckhlYXJ0Owp2YXIgaW5pdF9mb2xkZXJfaGVhcnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1oZWFydC5qcyIoKSB7CiAgICBGb2xkZXJIZWFydCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwLjYzOCAyMEg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDMuOWEyIDIgMCAwIDEgMS42OS45bC44MSAxLjJhMiAyIDAgMCAwIDEuNjcuOUgyMGEyIDIgMCAwIDEgMiAydjMuNDE3IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE0LjYyIDE4LjhBMi4yNSAyLjI1IDAgMSAxIDE4IDE1LjgzNmEyLjI1IDIuMjUgMCAxIDEgMy4zOCAyLjk2NmwtMi42MjYgMi44NTZhLjk5OC45OTggMCAwIDEtMS41MDcgMHoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItaW5wdXQuanMKdmFyIEZvbGRlcklucHV0Owp2YXIgaW5pdF9mb2xkZXJfaW5wdXQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1pbnB1dC5qcyIoKSB7CiAgICBGb2xkZXJJbnB1dCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIgOVY1YTIgMiAwIDAgMSAyLTJoMy45YTIgMiAwIDAgMSAxLjY5LjlsLjgxIDEuMmEyIDIgMCAwIDAgMS42Ny45SDIwYTIgMiAwIDAgMSAyIDJ2MTBhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJ2LTEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxM2gxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDE2IDMtMy0zLTMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXIta2FuYmFuLmpzCnZhciBGb2xkZXJLYW5iYW47CnZhciBpbml0X2ZvbGRlcl9rYW5iYW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1rYW5iYW4uanMiKCkgewogICAgRm9sZGVyS2FuYmFuID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNCAyMGgxNmEyIDIgMCAwIDAgMi0yVjhhMiAyIDAgMCAwLTItMmgtNy45M2EyIDIgMCAwIDEtMS42Ni0uOWwtLjgyLTEuMkEyIDIgMCAwIDAgNy45MyAzSDRhMiAyIDAgMCAwLTIgMnYxM2MwIDEuMS45IDIgMiAyWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEwdjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTB2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMHY2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLWtleS5qcwp2YXIgRm9sZGVyS2V5Owp2YXIgaW5pdF9mb2xkZXJfa2V5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXIta2V5LmpzIigpIHsKICAgIEZvbGRlcktleSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEzIDIwSDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMy45YTIgMiAwIDAgMSAxLjY5LjlsLjgxIDEuMmEyIDIgMCAwIDAgMS42Ny45SDIwYTIgMiAwIDAgMSAyIDJ2MS4zNiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxMnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE0aDIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiMjAiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1sb2NrLmpzCnZhciBGb2xkZXJMb2NrOwp2YXIgaW5pdF9mb2xkZXJfbG9jayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLWxvY2suanMiKCkgewogICAgRm9sZGVyTG9jayA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICI1IiwgeDogIjE0IiwgeTogIjE3Iiwgcng6ICIxIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwIDIwSDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMy45YTIgMiAwIDAgMSAxLjY5LjlsLjgxIDEuMmEyIDIgMCAwIDAgMS42Ny45SDIwYTIgMiAwIDAgMSAyIDJ2Mi41IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE3di0yYTIgMiAwIDEgMC00IDB2MiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1taW51cy5qcwp2YXIgRm9sZGVyTWludXM7CnZhciBpbml0X2ZvbGRlcl9taW51cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLW1pbnVzLmpzIigpIHsKICAgIEZvbGRlck1pbnVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxM2g2IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDIwYTIgMiAwIDAgMCAyLTJWOGEyIDIgMCAwIDAtMi0yaC03LjlhMiAyIDAgMCAxLTEuNjktLjlMOS42IDMuOUEyIDIgMCAwIDAgNy45MyAzSDRhMiAyIDAgMCAwLTIgMnYxM2EyIDIgMCAwIDAgMiAyWiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1vcGVuLWRvdC5qcwp2YXIgRm9sZGVyT3BlbkRvdDsKdmFyIGluaXRfZm9sZGVyX29wZW5fZG90ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItb3Blbi1kb3QuanMiKCkgewogICAgRm9sZGVyT3BlbkRvdCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTYgMTQgMS40NS0yLjlBMiAyIDAgMCAxIDkuMjQgMTBIMjBhMiAyIDAgMCAxIDEuOTQgMi41bC0xLjU1IDZhMiAyIDAgMCAxLTEuOTQgMS41SDRhMiAyIDAgMCAxLTItMlY1YzAtMS4xLjktMiAyLTJoMy45M2EyIDIgMCAwIDEgMS42Ni45bC44MiAxLjJhMiAyIDAgMCAwIDEuNjYuOUgxOGEyIDIgMCAwIDEgMiAydjIiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNCIsIGN5OiAiMTUiLCByOiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1vcGVuLmpzCnZhciBGb2xkZXJPcGVuOwp2YXIgaW5pdF9mb2xkZXJfb3BlbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLW9wZW4uanMiKCkgewogICAgRm9sZGVyT3BlbiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTYgMTQgMS41LTIuOUEyIDIgMCAwIDEgOS4yNCAxMEgyMGEyIDIgMCAwIDEgMS45NCAyLjVsLTEuNTQgNmEyIDIgMCAwIDEtMS45NSAxLjVINGEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmgzLjlhMiAyIDAgMCAxIDEuNjkuOWwuODEgMS4yYTIgMiAwIDAgMCAxLjY3LjlIMThhMiAyIDAgMCAxIDIgMnYyIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLXBlbi5qcwp2YXIgRm9sZGVyUGVuOwp2YXIgaW5pdF9mb2xkZXJfcGVuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItcGVuLmpzIigpIHsKICAgIEZvbGRlclBlbiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIgMTEuNVY1YTIgMiAwIDAgMSAyLTJoMy45Yy43IDAgMS4zLjMgMS43LjlsLjggMS4yYy40LjYgMSAuOSAxLjcuOUgyMGEyIDIgMCAwIDEgMiAydjEwYTIgMiAwIDAgMS0yIDJoLTkuNSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMS4zNzggMTMuNjI2YTEgMSAwIDEgMC0zLjAwNC0zLjAwNGwtNS4wMSA1LjAxMmEyIDIgMCAwIDAtLjUwNi44NTRsLS44MzcgMi44N2EuNS41IDAgMCAwIC42Mi42MmwyLjg3LS44MzdhMiAyIDAgMCAwIC44NTQtLjUwNnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItb3V0cHV0LmpzCnZhciBGb2xkZXJPdXRwdXQ7CnZhciBpbml0X2ZvbGRlcl9vdXRwdXQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1vdXRwdXQuanMiKCkgewogICAgRm9sZGVyT3V0cHV0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMiA3LjVWNWEyIDIgMCAwIDEgMi0yaDMuOWEyIDIgMCAwIDEgMS42OS45bC44MSAxLjJhMiAyIDAgMCAwIDEuNjcuOUgyMGEyIDIgMCAwIDEgMiAydjEwYTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0xLjUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxM2gxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01IDEwLTMgMyAzIDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItcGx1cy5qcwp2YXIgRm9sZGVyUGx1czsKdmFyIGluaXRfZm9sZGVyX3BsdXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1wbHVzLmpzIigpIHsKICAgIEZvbGRlclBsdXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMHY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTNoNiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAyMGEyIDIgMCAwIDAgMi0yVjhhMiAyIDAgMCAwLTItMmgtNy45YTIgMiAwIDAgMS0xLjY5LS45TDkuNiAzLjlBMiAyIDAgMCAwIDcuOTMgM0g0YTIgMiAwIDAgMC0yIDJ2MTNhMiAyIDAgMCAwIDIgMloiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItcm9vdC5qcwp2YXIgRm9sZGVyUm9vdDsKdmFyIGluaXRfZm9sZGVyX3Jvb3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1yb290LmpzIigpIHsKICAgIEZvbGRlclJvb3QgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDIwaDE2YTIgMiAwIDAgMCAyLTJWOGEyIDIgMCAwIDAtMi0yaC03LjkzYTIgMiAwIDAgMS0xLjY2LS45bC0uODItMS4yQTIgMiAwIDAgMCA3LjkzIDNINGEyIDIgMCAwIDAtMiAydjEzYzAgMS4xLjkgMiAyIDJaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEzIiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTV2NSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1zZWFyY2gtMi5qcwp2YXIgRm9sZGVyU2VhcmNoMjsKdmFyIGluaXRfZm9sZGVyX3NlYXJjaF8yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItc2VhcmNoLTIuanMiKCkgewogICAgRm9sZGVyU2VhcmNoMiA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTEuNSIsIGN5OiAiMTIuNSIsIHI6ICIyLjUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMjBhMiAyIDAgMCAwIDItMlY4YTIgMiAwIDAgMC0yLTJoLTcuOWEyIDIgMCAwIDEtMS42OS0uOUw5LjYgMy45QTIgMiAwIDAgMCA3LjkzIDNINGEyIDIgMCAwIDAtMiAydjEzYTIgMiAwIDAgMCAyIDJaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjMgMTQuMyAxNSAxNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1zZWFyY2guanMKdmFyIEZvbGRlclNlYXJjaDsKdmFyIGluaXRfZm9sZGVyX3NlYXJjaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLXNlYXJjaC5qcyIoKSB7CiAgICBGb2xkZXJTZWFyY2ggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMC43IDIwSDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMy45YTIgMiAwIDAgMSAxLjY5LjlsLjgxIDEuMmEyIDIgMCAwIDAgMS42Ny45SDIwYTIgMiAwIDAgMSAyIDJ2NC4xIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDIxLTEuOS0xLjkiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNyIsIGN5OiAiMTciLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1zeW1saW5rLmpzCnZhciBGb2xkZXJTeW1saW5rOwp2YXIgaW5pdF9mb2xkZXJfc3ltbGluayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLXN5bWxpbmsuanMiKCkgewogICAgRm9sZGVyU3ltbGluayA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIgOS4zNVY1YTIgMiAwIDAgMSAyLTJoMy45YTIgMiAwIDAgMSAxLjY5LjlsLjgxIDEuMmEyIDIgMCAwIDAgMS42Ny45SDIwYTIgMiAwIDAgMSAyIDJ2MTBhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJ2LTNhMiAyIDAgMCAxIDItMmg3IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggMTYgMy0zLTMtMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1zeW5jLmpzCnZhciBGb2xkZXJTeW5jOwp2YXIgaW5pdF9mb2xkZXJfc3luYyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLXN5bmMuanMiKCkgewogICAgRm9sZGVyU3luYyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTkgMjBINGEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmgzLjlhMiAyIDAgMCAxIDEuNjkuOWwuODEgMS4yYTIgMiAwIDAgMCAxLjY3LjlIMjBhMiAyIDAgMCAxIDIgMnYuNSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMHY0aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIgMTQgMS41MzUtMS42MDVhNSA1IDAgMCAxIDggMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDIydi00aC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDE4LTEuNTM1IDEuNjA1YTUgNSAwIDAgMS04LTEuNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci10cmVlLmpzCnZhciBGb2xkZXJUcmVlOwp2YXIgaW5pdF9mb2xkZXJfdHJlZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLXRyZWUuanMiKCkgewogICAgRm9sZGVyVHJlZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDEwYTEgMSAwIDAgMCAxLTFWNmExIDEgMCAwIDAtMS0xaC0yLjVhMSAxIDAgMCAxLS44LS40bC0uOS0xLjJBMSAxIDAgMCAwIDE1IDNoLTJhMSAxIDAgMCAwLTEgMXY1YTEgMSAwIDAgMCAxIDFaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDIxYTEgMSAwIDAgMCAxLTF2LTNhMSAxIDAgMCAwLTEtMWgtMi45YTEgMSAwIDAgMS0uODgtLjU1bC0uNDItLjg1YTEgMSAwIDAgMC0uOTItLjZIMTNhMSAxIDAgMCAwLTEgMXY1YTEgMSAwIDAgMCAxIDFaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgNWEyIDIgMCAwIDAgMiAyaDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjEzYTIgMiAwIDAgMCAyIDJoMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci11cC5qcwp2YXIgRm9sZGVyVXA7CnZhciBpbml0X2ZvbGRlcl91cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLXVwLmpzIigpIHsKICAgIEZvbGRlclVwID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMjBhMiAyIDAgMCAwIDItMlY4YTIgMiAwIDAgMC0yLTJoLTcuOWEyIDIgMCAwIDEtMS42OS0uOUw5LjYgMy45QTIgMiAwIDAgMCA3LjkzIDNINGEyIDIgMCAwIDAtMiAydjEzYTIgMiAwIDAgMCAyIDJaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEwdjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxMyAzLTMgMyAzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLXguanMKdmFyIEZvbGRlclg7CnZhciBpbml0X2ZvbGRlcl94ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXIteC5qcyIoKSB7CiAgICBGb2xkZXJYID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMjBhMiAyIDAgMCAwIDItMlY4YTIgMiAwIDAgMC0yLTJoLTcuOWEyIDIgMCAwIDEtMS42OS0uOUw5LjYgMy45QTIgMiAwIDAgMCA3LjkzIDNINGEyIDIgMCAwIDAtMiAydjEzYTIgMiAwIDAgMCAyIDJaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkuNSAxMC41IDUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC41IDEwLjUtNSA1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLmpzCnZhciBGb2xkZXI7CnZhciBpbml0X2ZvbGRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLmpzIigpIHsKICAgIEZvbGRlciA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDIwYTIgMiAwIDAgMCAyLTJWOGEyIDIgMCAwIDAtMi0yaC03LjlhMiAyIDAgMCAxLTEuNjktLjlMOS42IDMuOUEyIDIgMCAwIDAgNy45MyAzSDRhMiAyIDAgMCAwLTIgMnYxM2EyIDIgMCAwIDAgMiAyWiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlcnMuanMKdmFyIEZvbGRlcnM7CnZhciBpbml0X2ZvbGRlcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlcnMuanMiKCkgewogICAgRm9sZGVycyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDVhMiAyIDAgMCAxIDIgMnY3YTIgMiAwIDAgMS0yIDJIOWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmgyLjVhMS41IDEuNSAwIDAgMSAxLjIuNmwuNi44YTEuNSAxLjUgMCAwIDAgMS4yLjZ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOC4yNjhhMiAyIDAgMCAwLTEgMS43MzhWMTlhMiAyIDAgMCAwIDIgMmgxMWEyIDIgMCAwIDAgMS43MzItMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Zvb3RwcmludHMuanMKdmFyIEZvb3RwcmludHM7CnZhciBpbml0X2Zvb3RwcmludHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Zvb3RwcmludHMuanMiKCkgewogICAgRm9vdHByaW50cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQgMTZ2LTIuMzhDNCAxMS41IDIuOTcgMTAuNSAzIDhjLjAzLTIuNzIgMS40OS02IDQuNS02QzkuMzcgMiAxMCAzLjggMTAgNS41YzAgMy4xMS0yIDUuNjYtMiA4LjY4VjE2YTIgMiAwIDEgMS00IDBaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDIwdi0yLjM4YzAtMi4xMiAxLjAzLTMuMTIgMS01LjYyLS4wMy0yLjcyLTEuNDktNi00LjUtNkMxNC42MyA2IDE0IDcuOCAxNCA5LjVjMCAzLjExIDIgNS42NiAyIDguNjhWMjBhMiAyIDAgMSAwIDQgMFoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTdoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEzaDQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb3JtLmpzCnZhciBGb3JtOwp2YXIgaW5pdF9mb3JtID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb3JtLmpzIigpIHsKICAgIEZvcm0gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE0aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAyaDEwIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiNCIsIHk6ICIxOCIsIHdpZHRoOiAiMTYiLCBoZWlnaHQ6ICI0Iiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiNCIsIHk6ICI2Iiwgd2lkdGg6ICIxNiIsIGhlaWdodDogIjQiLCByeDogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb3JrbGlmdC5qcwp2YXIgRm9ya2xpZnQ7CnZhciBpbml0X2ZvcmtsaWZ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb3JrbGlmdC5qcyIoKSB7CiAgICBGb3JrbGlmdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEySDVhMiAyIDAgMCAwLTIgMnY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDE5aDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTlWMiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTYgMTJWN2EyIDIgMCAwIDEgMi0yaDIuMTcyYTIgMiAwIDAgMSAxLjQxNC41ODZsMy44MjggMy44MjhBMiAyIDAgMCAxIDE2IDEwLjgyOCIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxOWg0IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTMiLCBjeTogIjE5IiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI1IiwgY3k6ICIxOSIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZnJhbWUuanMKdmFyIEZyYW1lOwp2YXIgaW5pdF9mcmFtZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZnJhbWUuanMiKCkgewogICAgRnJhbWUgPSBbCiAgICAgIFsibGluZSIsIHsgeDE6ICIyMiIsIHgyOiAiMiIsIHkxOiAiNiIsIHkyOiAiNiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIyMiIsIHgyOiAiMiIsIHkxOiAiMTgiLCB5MjogIjE4IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjYiLCB4MjogIjYiLCB5MTogIjIiLCB5MjogIjIyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE4IiwgeDI6ICIxOCIsIHkxOiAiMiIsIHkyOiAiMjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb3J3YXJkLmpzCnZhciBGb3J3YXJkOwp2YXIgaW5pdF9mb3J3YXJkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb3J3YXJkLmpzIigpIHsKICAgIEZvcndhcmQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxNyA1LTUtNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTh2LTJhNCA0IDAgMCAxIDQtNGgxMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZyYW1lci5qcwp2YXIgRnJhbWVyOwp2YXIgaW5pdF9mcmFtZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZyYW1lci5qcyIoKSB7CiAgICBGcmFtZXIgPSBbWyJwYXRoIiwgeyBkOiAiTTUgMTZWOWgxNFYySDVsMTQgMTRoLTdtLTcgMCA3IDd2LTdtLTcgMGg3IiB9XV07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Zyb3duLmpzCnZhciBGcm93bjsKdmFyIGluaXRfZnJvd24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Zyb3duLmpzIigpIHsKICAgIEZyb3duID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTZzLTEuNS0yLTQtMi00IDItNCAyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjkiLCB4MjogIjkuMDEiLCB5MTogIjkiLCB5MjogIjkiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTUiLCB4MjogIjE1LjAxIiwgeTE6ICI5IiwgeTI6ICI5IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZnVlbC5qcwp2YXIgRnVlbDsKdmFyIGluaXRfZnVlbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZnVlbC5qcyIoKSB7CiAgICBGdWVsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTNoMmEyIDIgMCAwIDEgMiAydjJhMiAyIDAgMCAwIDQgMHYtNi45OThhMiAyIDAgMCAwLS41OS0xLjQyTDE4IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjFWNWEyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIxaDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOWgxMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Z1bGxzY3JlZW4uanMKdmFyIEZ1bGxzY3JlZW47CnZhciBpbml0X2Z1bGxzY3JlZW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Z1bGxzY3JlZW4uanMiKCkgewogICAgRnVsbHNjcmVlbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgN1Y1YTIgMiAwIDAgMSAyLTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAzaDJhMiAyIDAgMCAxIDIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE3djJhMiAyIDAgMCAxLTIgMmgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIxSDVhMiAyIDAgMCAxLTItMnYtMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxMCIsIGhlaWdodDogIjgiLCB4OiAiNyIsIHk6ICI4Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZnVubmVsLXBsdXMuanMKdmFyIEZ1bm5lbFBsdXM7CnZhciBpbml0X2Z1bm5lbF9wbHVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mdW5uZWwtcGx1cy5qcyIoKSB7CiAgICBGdW5uZWxQbHVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTMuMzU0IDNIM2ExIDEgMCAwIDAtLjc0MiAxLjY3bDcuMjI1IDcuOTg5QTIgMiAwIDAgMSAxMCAxNHY2YTEgMSAwIDAgMCAuNTUzLjg5NWwyIDFBMSAxIDAgMCAwIDE0IDIxdi03YTIgMiAwIDAgMSAuNTE3LTEuMzQxbDEuMjE4LTEuMzQ4IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDZoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAzdjYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mdW5uZWwteC5qcwp2YXIgRnVubmVsWDsKdmFyIGluaXRfZnVubmVsX3ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Z1bm5lbC14LmpzIigpIHsKICAgIEZ1bm5lbFggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMi41MzEgM0gzYTEgMSAwIDAgMC0uNzQyIDEuNjdsNy4yMjUgNy45ODlBMiAyIDAgMCAxIDEwIDE0djZhMSAxIDAgMCAwIC41NTMuODk1bDIgMUExIDEgMCAwIDAgMTQgMjF2LTdhMiAyIDAgMCAxIC41MTctMS4zNDFsLjQyNy0uNDczIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2LjUgMy41IDUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMS41IDMuNS01IDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mdW5uZWwuanMKdmFyIEZ1bm5lbDsKdmFyIGluaXRfZnVubmVsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9mdW5uZWwuanMiKCkgewogICAgRnVubmVsID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTAgMjBhMSAxIDAgMCAwIC41NTMuODk1bDIgMUExIDEgMCAwIDAgMTQgMjF2LTdhMiAyIDAgMCAxIC41MTctMS4zNDFMMjEuNzQgNC42N0ExIDEgMCAwIDAgMjEgM0gzYTEgMSAwIDAgMC0uNzQyIDEuNjdsNy4yMjUgNy45ODlBMiAyIDAgMCAxIDEwIDE0eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dhbGxlcnktaG9yaXpvbnRhbC1lbmQuanMKdmFyIEdhbGxlcnlIb3Jpem9udGFsRW5kOwp2YXIgaW5pdF9nYWxsZXJ5X2hvcml6b250YWxfZW5kID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9nYWxsZXJ5LWhvcml6b250YWwtZW5kLmpzIigpIHsKICAgIEdhbGxlcnlIb3Jpem9udGFsRW5kID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA3djEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgNXYxNCIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxMiIsIGhlaWdodDogIjE4IiwgeDogIjEwIiwgeTogIjMiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9nYWxsZXJ5LWhvcml6b250YWwuanMKdmFyIEdhbGxlcnlIb3Jpem9udGFsOwp2YXIgaW5pdF9nYWxsZXJ5X2hvcml6b250YWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dhbGxlcnktaG9yaXpvbnRhbC5qcyIoKSB7CiAgICBHYWxsZXJ5SG9yaXpvbnRhbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgM3YxOCIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxMiIsIGhlaWdodDogIjE4IiwgeDogIjYiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAzdjE4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2FsbGVyeS10aHVtYm5haWxzLmpzCnZhciBHYWxsZXJ5VGh1bWJuYWlsczsKdmFyIGluaXRfZ2FsbGVyeV90aHVtYm5haWxzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9nYWxsZXJ5LXRodW1ibmFpbHMuanMiKCkgewogICAgR2FsbGVyeVRodW1ibmFpbHMgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE0IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDIxaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAyMWgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDIxaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMjFoMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dhbGxlcnktdmVydGljYWwtZW5kLmpzCnZhciBHYWxsZXJ5VmVydGljYWxFbmQ7CnZhciBpbml0X2dhbGxlcnlfdmVydGljYWxfZW5kID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9nYWxsZXJ5LXZlcnRpY2FsLWVuZC5qcyIoKSB7CiAgICBHYWxsZXJ5VmVydGljYWxFbmQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDJoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSA2aDE0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTIiLCB4OiAiMyIsIHk6ICIxMCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dhbGxlcnktdmVydGljYWwuanMKdmFyIEdhbGxlcnlWZXJ0aWNhbDsKdmFyIGluaXRfZ2FsbGVyeV92ZXJ0aWNhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2FsbGVyeS12ZXJ0aWNhbC5qcyIoKSB7CiAgICBHYWxsZXJ5VmVydGljYWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDJoMTgiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxMiIsIHg6ICIzIiwgeTogIjYiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAyMmgxOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dhbWVwYWQtMi5qcwp2YXIgR2FtZXBhZDI7CnZhciBpbml0X2dhbWVwYWRfMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2FtZXBhZC0yLmpzIigpIHsKICAgIEdhbWVwYWQyID0gWwogICAgICBbImxpbmUiLCB7IHgxOiAiNiIsIHgyOiAiMTAiLCB5MTogIjExIiwgeTI6ICIxMSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI4IiwgeDI6ICI4IiwgeTE6ICI5IiwgeTI6ICIxMyIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNSIsIHgyOiAiMTUuMDEiLCB5MTogIjEyIiwgeTI6ICIxMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxOCIsIHgyOiAiMTguMDEiLCB5MTogIjEwIiwgeTI6ICIxMCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNy4zMiA1SDYuNjhhNCA0IDAgMCAwLTMuOTc4IDMuNTljLS4wMDYuMDUyLS4wMS4xMDEtLjAxNy4xNTJDMi42MDQgOS40MTYgMiAxNC40NTYgMiAxNmEzIDMgMCAwIDAgMyAzYzEgMCAxLjUtLjUgMi0xbDEuNDE0LTEuNDE0QTIgMiAwIDAgMSA5LjgyOCAxNmg0LjM0NGEyIDIgMCAwIDEgMS40MTQuNTg2TDE3IDE4Yy41LjUgMSAxIDIgMWEzIDMgMCAwIDAgMy0zYzAtMS41NDUtLjYwNC02LjU4NC0uNjg1LTcuMjU4LS4wMDctLjA1LS4wMTEtLjEtLjAxNy0uMTUxQTQgNCAwIDAgMCAxNy4zMiA1eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dhbWVwYWQtZGlyZWN0aW9uYWwuanMKdmFyIEdhbWVwYWREaXJlY3Rpb25hbDsKdmFyIGluaXRfZ2FtZXBhZF9kaXJlY3Rpb25hbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2FtZXBhZC1kaXJlY3Rpb25hbC5qcyIoKSB7CiAgICBHYW1lcGFkRGlyZWN0aW9uYWwgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMS4xNDYgMTUuODU0YTEuMjA3IDEuMjA3IDAgMCAxIDEuNzA4IDBsMS41NiAxLjU2QTIgMiAwIDAgMSAxNSAxOC44MjhWMjFhMSAxIDAgMCAxLTEgMWgtNGExIDEgMCAwIDEtMS0xdi0yLjE3MmEyIDIgMCAwIDEgLjU4Ni0xLjQxNHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTguODI4IDE1YTIgMiAwIDAgMS0xLjQxNC0uNTg2bC0xLjU2LTEuNTZhMS4yMDcgMS4yMDcgMCAwIDEgMC0xLjcwOGwxLjU2LTEuNTZBMiAyIDAgMCAxIDE4LjgyOCA5SDIxYTEgMSAwIDAgMSAxIDF2NGExIDEgMCAwIDEtMSAxeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02LjU4NiAxNC40MTRBMiAyIDAgMCAxIDUuMTcyIDE1SDNhMSAxIDAgMCAxLTEtMXYtNGExIDEgMCAwIDEgMS0xaDIuMTcyYTIgMiAwIDAgMSAxLjQxNC41ODZsMS41NiAxLjU2YTEuMjA3IDEuMjA3IDAgMCAxIDAgMS43MDh6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTkgM2ExIDEgMCAwIDEgMS0xaDRhMSAxIDAgMCAxIDEgMXYyLjE3MmEyIDIgMCAwIDEtLjU4NiAxLjQxNGwtMS41NiAxLjU2YTEuMjA3IDEuMjA3IDAgMCAxLTEuNzA4IDBsLTEuNTYtMS41NkEyIDIgMCAwIDEgOSA1LjE3MnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9nYW1lcGFkLmpzCnZhciBHYW1lcGFkOwp2YXIgaW5pdF9nYW1lcGFkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9nYW1lcGFkLmpzIigpIHsKICAgIEdhbWVwYWQgPSBbCiAgICAgIFsibGluZSIsIHsgeDE6ICI2IiwgeDI6ICIxMCIsIHkxOiAiMTIiLCB5MjogIjEyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjgiLCB4MjogIjgiLCB5MTogIjEwIiwgeTI6ICIxNCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNSIsIHgyOiAiMTUuMDEiLCB5MTogIjEzIiwgeTI6ICIxMyIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxOCIsIHgyOiAiMTguMDEiLCB5MTogIjExIiwgeTI6ICIxMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjEyIiwgeDogIjIiLCB5OiAiNiIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dhdWdlLmpzCnZhciBHYXVnZTsKdmFyIGluaXRfZ2F1Z2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dhdWdlLmpzIigpIHsKICAgIEdhdWdlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIgMTQgNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuMzQgMTlhMTAgMTAgMCAxIDEgMTcuMzIgMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dhdmVsLmpzCnZhciBHYXZlbDsKdmFyIGluaXRfZ2F2ZWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dhdmVsLmpzIigpIHsKICAgIEdhdmVsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgMTMtOC4zODEgOC4zOGExIDEgMCAwIDEtMy4wMDEtM2w4LjM4NC04LjM4MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAxNiA2LTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEuNSAxMC41LTgtOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDggNi02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTguNSA3LjUgOCA4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2VvcmdpYW4tbGFyaS5qcwp2YXIgR2VvcmdpYW5MYXJpOwp2YXIgaW5pdF9nZW9yZ2lhbl9sYXJpID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9nZW9yZ2lhbi1sYXJpLmpzIigpIHsKICAgIEdlb3JnaWFuTGFyaSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExLjUgMjFhNy41IDcuNSAwIDEgMSA3LjM1LTkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMTJWMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDIxaDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTJWMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dlbS5qcwp2YXIgR2VtOwp2YXIgaW5pdF9nZW0gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dlbS5qcyIoKSB7CiAgICBHZW0gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC41IDMgOCA5bDQgMTMgNC0xMy0yLjUtNiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNyAzYTIgMiAwIDAgMSAxLjYuOGwzIDRhMiAyIDAgMCAxIC4wMTMgMi4zODJsLTcuOTkgMTAuOTg2YTIgMiAwIDAgMS0zLjI0NyAwbC03Ljk5LTEwLjk4NkEyIDIgMCAwIDEgMi40IDcuOGwyLjk5OC0zLjk5N0EyIDIgMCAwIDEgNyAzeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDloMjAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9naG9zdC5qcwp2YXIgR2hvc3Q7CnZhciBpbml0X2dob3N0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9naG9zdC5qcyIoKSB7CiAgICBHaG9zdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTBoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEwaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyYTggOCAwIDAgMC04IDh2MTJsMy0zIDIuNSAyLjVMMTIgMTlsMi41IDIuNUwxNyAxOWwzIDNWMTBhOCA4IDAgMCAwLTgtOHoiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9naWZ0LmpzCnZhciBHaWZ0Owp2YXIgaW5pdF9naWZ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9naWZ0LmpzIigpIHsKICAgIEdpZnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA3djE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDExdjhhMiAyIDAgMCAxLTIgMkg2YTIgMiAwIDAgMS0yLTJ2LTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNy41IDdhMSAxIDAgMCAxIDAtNUE0LjggOCAwIDAgMSAxMiA3YTQuOCA4IDAgMCAxIDQuNS01IDEgMSAwIDAgMSAwIDUiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIzIiwgeTogIjciLCB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiNCIsIHJ4OiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dpdC1icmFuY2gtbWludXMuanMKdmFyIEdpdEJyYW5jaE1pbnVzOwp2YXIgaW5pdF9naXRfYnJhbmNoX21pbnVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXQtYnJhbmNoLW1pbnVzLmpzIigpIHsKICAgIEdpdEJyYW5jaE1pbnVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgNmE5IDkgMCAwIDAtOSA5VjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMThoLTYiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiNiIsIHI6ICIzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNiIsIGN5OiAiMTgiLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dpdC1icmFuY2gtcGx1cy5qcwp2YXIgR2l0QnJhbmNoUGx1czsKdmFyIGluaXRfZ2l0X2JyYW5jaF9wbHVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXQtYnJhbmNoLXBsdXMuanMiKCkgewogICAgR2l0QnJhbmNoUGx1cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgM3YxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA5YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAyMWEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDZhOSA5IDAgMCAwLTkgOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxNXY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE4aC02IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0LWJyYW5jaC5qcwp2YXIgR2l0QnJhbmNoOwp2YXIgaW5pdF9naXRfYnJhbmNoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXQtYnJhbmNoLmpzIigpIHsKICAgIEdpdEJyYW5jaCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDZhOSA5IDAgMCAwLTkgOVYzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjYiLCByOiAiMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYiLCBjeTogIjE4IiwgcjogIjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXQtY29tbWl0LWhvcml6b250YWwuanMKdmFyIEdpdENvbW1pdEhvcml6b250YWw7CnZhciBpbml0X2dpdF9jb21taXRfaG9yaXpvbnRhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0LWNvbW1pdC1ob3Jpem9udGFsLmpzIigpIHsKICAgIEdpdENvbW1pdEhvcml6b250YWwgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIzIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjMiLCB4MjogIjkiLCB5MTogIjEyIiwgeTI6ICIxMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNSIsIHgyOiAiMjEiLCB5MTogIjEyIiwgeTI6ICIxMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dpdC1jb21taXQtdmVydGljYWwuanMKdmFyIEdpdENvbW1pdFZlcnRpY2FsOwp2YXIgaW5pdF9naXRfY29tbWl0X3ZlcnRpY2FsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXQtY29tbWl0LXZlcnRpY2FsLmpzIigpIHsKICAgIEdpdENvbW1pdFZlcnRpY2FsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgM3Y2IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTV2NiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dpdC1jb21wYXJlLWFycm93cy5qcwp2YXIgR2l0Q29tcGFyZUFycm93czsKdmFyIGluaXRfZ2l0X2NvbXBhcmVfYXJyb3dzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXQtY29tcGFyZS1hcnJvd3MuanMiKCkgewogICAgR2l0Q29tcGFyZUFycm93cyA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNSIsIGN5OiAiNiIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZoNWEyIDIgMCAwIDEgMiAydjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgOS0zLTMgMy0zIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTkiLCBjeTogIjE4IiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMThIN2EyIDIgMCAwIDEtMi0yVjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxNSAzIDMtMyAzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0LWNvbXBhcmUuanMKdmFyIEdpdENvbXBhcmU7CnZhciBpbml0X2dpdF9jb21wYXJlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXQtY29tcGFyZS5qcyIoKSB7CiAgICBHaXRDb21wYXJlID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiMTgiLCByOiAiMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYiLCBjeTogIjYiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyA2aDNhMiAyIDAgMCAxIDIgMnY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDE4SDhhMiAyIDAgMCAxLTItMlY5IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0LWdyYXBoLmpzCnZhciBHaXRHcmFwaDsKdmFyIGluaXRfZ2l0X2dyYXBoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXQtZ3JhcGguanMiKCkgewogICAgR2l0R3JhcGggPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjYiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDl2NiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjE4IiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgM3YxOCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE5IiwgY3k6ICI2IiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTUuN0E5IDkgMCAwIDAgMTkgOSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dpdC1mb3JrLmpzCnZhciBHaXRGb3JrOwp2YXIgaW5pdF9naXRfZm9yayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0LWZvcmsuanMiKCkgewogICAgR2l0Rm9yayA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjE4IiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI2IiwgY3k6ICI2IiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiNiIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDl2MmMwIC42LS40IDEtMSAxSDdjLS42IDAtMS0uNC0xLTFWOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMnYzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0LW1lcmdlLWNvbmZsaWN0LmpzCnZhciBHaXRNZXJnZUNvbmZsaWN0Owp2YXIgaW5pdF9naXRfbWVyZ2VfY29uZmxpY3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dpdC1tZXJnZS1jb25mbGljdC5qcyIoKSB7CiAgICBHaXRNZXJnZUNvbmZsaWN0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNmg0YTIgMiAwIDAgMSAyIDJ2NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEydjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAzIDMgOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDkgMyAzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjE4IiwgcjogIjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXQtbWVyZ2UuanMKdmFyIEdpdE1lcmdlOwp2YXIgaW5pdF9naXRfbWVyZ2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dpdC1tZXJnZS5qcyIoKSB7CiAgICBHaXRNZXJnZSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjE4IiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI2IiwgY3k6ICI2IiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAyMVY5YTkgOSAwIDAgMCA5IDkiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXQtcHVsbC1yZXF1ZXN0LWFycm93LmpzCnZhciBHaXRQdWxsUmVxdWVzdEFycm93Owp2YXIgaW5pdF9naXRfcHVsbF9yZXF1ZXN0X2Fycm93ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXQtcHVsbC1yZXF1ZXN0LWFycm93LmpzIigpIHsKICAgIEdpdFB1bGxSZXF1ZXN0QXJyb3cgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjYiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDl2MTIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiMTgiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA5LTMtMyAzLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNmg1YTIgMiAwIDAgMSAyIDJ2NyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dpdC1wdWxsLXJlcXVlc3QtY2xvc2VkLmpzCnZhciBHaXRQdWxsUmVxdWVzdENsb3NlZDsKdmFyIGluaXRfZ2l0X3B1bGxfcmVxdWVzdF9jbG9zZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dpdC1wdWxsLXJlcXVlc3QtY2xvc2VkLmpzIigpIHsKICAgIEdpdFB1bGxSZXF1ZXN0Q2xvc2VkID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICI2IiwgY3k6ICI2IiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA5djEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDMtNiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDktNi02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDExLjVWMTUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiMTgiLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dpdC1wdWxsLXJlcXVlc3QtY3JlYXRlLWFycm93LmpzCnZhciBHaXRQdWxsUmVxdWVzdENyZWF0ZUFycm93Owp2YXIgaW5pdF9naXRfcHVsbF9yZXF1ZXN0X2NyZWF0ZV9hcnJvdyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0LXB1bGwtcmVxdWVzdC1jcmVhdGUtYXJyb3cuanMiKCkgewogICAgR2l0UHVsbFJlcXVlc3RDcmVhdGVBcnJvdyA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNSIsIGN5OiAiNiIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgOXYxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA5LTMtMyAzLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNmg1YTIgMiAwIDAgMSAyIDJ2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxNXY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE4aC02IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0LXB1bGwtcmVxdWVzdC1jcmVhdGUuanMKdmFyIEdpdFB1bGxSZXF1ZXN0Q3JlYXRlOwp2YXIgaW5pdF9naXRfcHVsbF9yZXF1ZXN0X2NyZWF0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0LXB1bGwtcmVxdWVzdC1jcmVhdGUuanMiKCkgewogICAgR2l0UHVsbFJlcXVlc3RDcmVhdGUgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYiLCBjeTogIjYiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDl2MTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgNmgzYTIgMiAwIDAgMSAyIDJ2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxNXY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE4aC02IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0LXB1bGwtcmVxdWVzdC1kcmFmdC5qcwp2YXIgR2l0UHVsbFJlcXVlc3REcmFmdDsKdmFyIGluaXRfZ2l0X3B1bGxfcmVxdWVzdF9kcmFmdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0LXB1bGwtcmVxdWVzdC1kcmFmdC5qcyIoKSB7CiAgICBHaXRQdWxsUmVxdWVzdERyYWZ0ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiMTgiLCByOiAiMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYiLCBjeTogIjYiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA2VjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTF2LTEiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiNiIsIHgyOiAiNiIsIHkxOiAiOSIsIHkyOiAiMjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXQtcHVsbC1yZXF1ZXN0LmpzCnZhciBHaXRQdWxsUmVxdWVzdDsKdmFyIGluaXRfZ2l0X3B1bGxfcmVxdWVzdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0LXB1bGwtcmVxdWVzdC5qcyIoKSB7CiAgICBHaXRQdWxsUmVxdWVzdCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjE4IiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI2IiwgY3k6ICI2IiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgNmgzYTIgMiAwIDAgMSAyIDJ2NyIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI2IiwgeDI6ICI2IiwgeTE6ICI5IiwgeTI6ICIyMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dpdGh1Yi5qcwp2YXIgR2l0aHViOwp2YXIgaW5pdF9naXRodWIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dpdGh1Yi5qcyIoKSB7CiAgICBHaXRodWIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNSAyMnYtNGE0LjggNC44IDAgMCAwLTEtMy41YzMgMCA2LTIgNi01LjUuMDgtMS4yNS0uMjctMi40OC0xLTMuNS4yOC0xLjE1LjI4LTIuMzUgMC0zLjUgMCAwLTEgMC0zIDEuNS0yLjY0LS41LTUuMzYtLjUtOCAwQzYgMiA1IDIgNSAyYy0uMyAxLjE1LS4zIDIuMzUgMCAzLjVBNS40MDMgNS40MDMgMCAwIDAgNCA5YzAgMy41IDMgNS41IDYgNS41LS4zOS40OS0uNjggMS4wNS0uODUgMS42NS0uMTcuNi0uMjIgMS4yMy0uMTUgMS44NXY0IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMThjLTQuNTEgMi01LTItNy0yIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0bGFiLmpzCnZhciBHaXRsYWI7CnZhciBpbml0X2dpdGxhYiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0bGFiLmpzIigpIHsKICAgIEdpdGxhYiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTIyIDEzLjI5LTMuMzMtMTBhLjQyLjQyIDAgMCAwLS4xNC0uMTguMzguMzggMCAwIDAtLjIyLS4xMS4zOS4zOSAwIDAgMC0uMjMuMDcuNDIuNDIgMCAwIDAtLjE0LjE4bC0yLjI2IDYuNjdIOC4zMkw2LjEgMy4yNmEuNDIuNDIgMCAwIDAtLjEtLjE4LjM4LjM4IDAgMCAwLS4yNi0uMDguMzkuMzkgMCAwIDAtLjIzLjA3LjQyLjQyIDAgMCAwLS4xNC4xOEwyIDEzLjI5YS43NC43NCAwIDAgMCAuMjcuODNMMTIgMjFsOS42OS02Ljg4YS43MS43MSAwIDAgMCAuMzEtLjgzWiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dsYXNzLXdhdGVyLmpzCnZhciBHbGFzc1dhdGVyOwp2YXIgaW5pdF9nbGFzc193YXRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2xhc3Mtd2F0ZXIuanMiKCkgewogICAgR2xhc3NXYXRlciA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTUuMTE2IDQuMTA0QTEgMSAwIDAgMSA2LjExIDNoMTEuNzhhMSAxIDAgMCAxIC45OTQgMS4xMDVMMTcuMTkgMjAuMjFBMiAyIDAgMCAxIDE1LjIgMjJIOC44YTIgMiAwIDAgMS0yLTEuNzl6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTJhNSA1IDAgMCAxIDYgMCA1IDUgMCAwIDAgNiAwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2xvYmUtbG9jay5qcwp2YXIgR2xvYmVMb2NrOwp2YXIgaW5pdF9nbG9iZV9sb2NrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9nbG9iZS1sb2NrLmpzIigpIHsKICAgIEdsb2JlTG9jayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1LjY4NiAxNUExNC41IDE0LjUgMCAwIDEgMTIgMjJhMTQuNSAxNC41IDAgMCAxIDAtMjAgMTAgMTAgMCAxIDAgOS41NDIgMTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmg4LjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgNlY0YTIgMiAwIDEgMC00IDB2MiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiNSIsIHg6ICIxNCIsIHk6ICI2Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2xhc3Nlcy5qcwp2YXIgR2xhc3NlczsKdmFyIGluaXRfZ2xhc3NlcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2xhc3Nlcy5qcyIoKSB7CiAgICBHbGFzc2VzID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICI2IiwgY3k6ICIxNSIsIHI6ICI0IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjE1IiwgcjogIjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTVhMiAyIDAgMCAwLTItMiAyIDIgMCAwIDAtMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIuNSAxMyA1IDdjLjctMS4zIDEuNC0yIDMtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMS41IDEzIDE5IDdjLS43LTEuMy0xLjUtMi0zLTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9nbG9iZS14LmpzCnZhciBHbG9iZVg7CnZhciBpbml0X2dsb2JlX3ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dsb2JlLXguanMiKCkgewogICAgR2xvYmVYID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMyA1IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmgyMEExMCAxMCAwIDEgMSAxMiAyYTE0LjUgMTQuNSAwIDAgMCAwIDIwIDE0LjUgMTQuNSAwIDAgMCA0LTEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDMtNSA1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2xvYmUtb2ZmLmpzCnZhciBHbG9iZU9mZjsKdmFyIGluaXRfZ2xvYmVfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9nbG9iZS1vZmYuanMiKCkgewogICAgR2xvYmVPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC4xMTQgNC40NjJBMTQuNSAxNC41IDAgMCAxIDEyIDJhMTAgMTAgMCAwIDEgOS4zMTMgMTMuNjQzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1LjU1NyAxNS41NTZBMTQuNSAxNC41IDAgMCAxIDEyIDIyIDEwIDEwIDAgMCAxIDQuOTI5IDQuOTI5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1Ljg5MiAxMC4yMzRBMTQuNSAxNC41IDAgMCAwIDEyIDJhMTAgMTAgMCAwIDAtMy42NDMuNjg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjY1NiAxMkgyMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOS4wNzEgMTkuMDcxQTEwIDEwIDAgMCAxIDEyIDIyIDE0LjUgMTQuNSAwIDAgMSA4LjQ0IDguNDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9nbG9iZS5qcwp2YXIgR2xvYmU7CnZhciBpbml0X2dsb2JlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9nbG9iZS5qcyIoKSB7CiAgICBHbG9iZSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJhMTQuNSAxNC41IDAgMCAwIDAgMjAgMTQuNSAxNC41IDAgMCAwIDAtMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmgyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dvYWwuanMKdmFyIEdvYWw7CnZhciBpbml0X2dvYWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dvYWwuanMiKCkgewogICAgR29hbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEzVjJsOCA0LTggNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC41NjEgMTAuMjIyYTkgOSAwIDEgMS0xMi41NS01LjI5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguMDAyIDkuOTk3YTUgNSAwIDEgMCA4LjkgMi4wMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dwdS5qcwp2YXIgR3B1Owp2YXIgaW5pdF9ncHUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dwdS5qcyIoKSB7CiAgICBHcHUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIxVjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA1aDE4YTIgMiAwIDAgMSAyIDJ2OGEyIDIgMCAwIDEtMiAySDIuMjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxN3YzYTEgMSAwIDAgMCAxIDFoNWExIDEgMCAwIDAgMS0xdi0zIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYiLCBjeTogIjExIiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI4IiwgY3k6ICIxMSIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ3JhZHVhdGlvbi1jYXAuanMKdmFyIEdyYWR1YXRpb25DYXA7CnZhciBpbml0X2dyYWR1YXRpb25fY2FwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ncmFkdWF0aW9uLWNhcC5qcyIoKSB7CiAgICBHcmFkdWF0aW9uQ2FwID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEuNDIgMTAuOTIyYTEgMSAwIDAgMC0uMDE5LTEuODM4TDEyLjgzIDUuMThhMiAyIDAgMCAwLTEuNjYgMEwyLjYgOS4wOGExIDEgMCAwIDAgMCAxLjgzMmw4LjU3IDMuOTA4YTIgMiAwIDAgMCAxLjY2IDB6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDEwdjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxMi41VjE2YTYgMyAwIDAgMCAxMiAwdi0zLjUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ncmlkLTJ4Mi1jaGVjay5qcwp2YXIgR3JpZDJ4MkNoZWNrOwp2YXIgaW5pdF9ncmlkXzJ4Ml9jaGVjayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ3JpZC0yeDItY2hlY2suanMiKCkgewogICAgR3JpZDJ4MkNoZWNrID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTIgM3YxN2ExIDEgMCAwIDEtMSAxSDVhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMTRhMiAyIDAgMCAxIDIgMnY2YTEgMSAwIDAgMS0xIDFIMyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAxOSAyIDIgNC00IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ3JpZC0yeDItcGx1cy5qcwp2YXIgR3JpZDJ4MlBsdXM7CnZhciBpbml0X2dyaWRfMngyX3BsdXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dyaWQtMngyLXBsdXMuanMiKCkgewogICAgR3JpZDJ4MlBsdXMgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMiAzdjE3YTEgMSAwIDAgMS0xIDFINWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmgxNGEyIDIgMCAwIDEgMiAydjZhMSAxIDAgMCAxLTEgMUgzIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE5aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMjJ2LTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ncmFwZS5qcwp2YXIgR3JhcGU7CnZhciBpbml0X2dyYXBlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ncmFwZS5qcyIoKSB7CiAgICBHcmFwZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDVWMmwtNS44OSA1Ljg5IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYuNiIsIGN5OiAiMTUuODkiLCByOiAiMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjguMTEiLCBjeTogIjcuNCIsIHI6ICIzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIuMzUiLCBjeTogIjExLjY1IiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMy45MSIsIGN5OiAiNS44NSIsIHI6ICIzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTguMTUiLCBjeTogIjEwLjA5IiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI2LjU2IiwgY3k6ICIxMy4yIiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMC44IiwgY3k6ICIxNy40NCIsIHI6ICIzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNSIsIGN5OiAiMTkiLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dyaWQtMngyLXguanMKdmFyIEdyaWQyeDJYOwp2YXIgaW5pdF9ncmlkXzJ4Ml94ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ncmlkLTJ4Mi14LmpzIigpIHsKICAgIEdyaWQyeDJYID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTIgM3YxN2ExIDEgMCAwIDEtMSAxSDVhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMTRhMiAyIDAgMCAxIDIgMnY2YTEgMSAwIDAgMS0xIDFIMyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAxNiA1IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMjEgNS01IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ3JpZC0yeDIuanMKdmFyIEdyaWQyeDI7CnZhciBpbml0X2dyaWRfMngyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ncmlkLTJ4Mi5qcyIoKSB7CiAgICBHcmlkMngyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgM3YxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyaDE4IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICIzIiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4Iiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ3JpZC0zeDIuanMKdmFyIEdyaWQzeDI7CnZhciBpbml0X2dyaWRfM3gyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ncmlkLTN4Mi5qcyIoKSB7CiAgICBHcmlkM3gyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgM3YxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyaDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgM3YxOCIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjMiLCB5OiAiMyIsIHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dyaWQtM3gzLmpzCnZhciBHcmlkM3gzOwp2YXIgaW5pdF9ncmlkXzN4MyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ3JpZC0zeDMuanMiKCkgewogICAgR3JpZDN4MyA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOWgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE1aDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgM3YxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAzdjE4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ3JpcC1ob3Jpem9udGFsLmpzCnZhciBHcmlwSG9yaXpvbnRhbDsKdmFyIGluaXRfZ3JpcF9ob3Jpem9udGFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ncmlwLWhvcml6b250YWwuanMiKCkgewogICAgR3JpcEhvcml6b250YWwgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICI5IiwgcjogIjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiOSIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNSIsIGN5OiAiOSIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjE1IiwgcjogIjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiMTUiLCByOiAiMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjE1IiwgcjogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ncmlwLXZlcnRpY2FsLmpzCnZhciBHcmlwVmVydGljYWw7CnZhciBpbml0X2dyaXBfdmVydGljYWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dyaXAtdmVydGljYWwuanMiKCkgewogICAgR3JpcFZlcnRpY2FsID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICIxMiIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOSIsIGN5OiAiNSIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOSIsIGN5OiAiMTkiLCByOiAiMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE1IiwgY3k6ICIxMiIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTUiLCBjeTogIjUiLCByOiAiMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE1IiwgY3k6ICIxOSIsIHI6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ3JpcC5qcwp2YXIgR3JpcDsKdmFyIGluaXRfZ3JpcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ3JpcC5qcyIoKSB7CiAgICBHcmlwID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiNSIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTkiLCBjeTogIjUiLCByOiAiMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjUiLCByOiAiMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTkiLCBjeTogIjEyIiwgcjogIjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI1IiwgY3k6ICIxMiIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjE5IiwgcjogIjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiMTkiLCByOiAiMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjE5IiwgcjogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ncm91cC5qcwp2YXIgR3JvdXA7CnZhciBpbml0X2dyb3VwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ncm91cC5qcyIoKSB7CiAgICBHcm91cCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgN1Y1YzAtMS4xLjktMiAyLTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAzaDJjMS4xIDAgMiAuOSAyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxN3YyYzAgMS4xLS45IDItMiAyaC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjFINWMtMS4xIDAtMi0uOS0yLTJ2LTIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNyIsIGhlaWdodDogIjUiLCB4OiAiNyIsIHk6ICI3Iiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjciLCBoZWlnaHQ6ICI1IiwgeDogIjEwIiwgeTogIjEyIiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ3VpdGFyLmpzCnZhciBHdWl0YXI7CnZhciBpbml0X2d1aXRhciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvZ3VpdGFyLmpzIigpIHsKICAgIEd1aXRhciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTExLjkgMTIuMSA0LjUxNC00LjUxNCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMC4xIDIuM2ExIDEgMCAwIDAtMS40IDBsLTEuMTE0IDEuMTE0QTIgMiAwIDAgMCAxNyA0LjgyOHYxLjM0NGEyIDIgMCAwIDEtLjU4NiAxLjQxNEEyIDIgMCAwIDEgMTcuODI4IDdoMS4zNDRhMiAyIDAgMCAwIDEuNDE0LS41ODZMMjEuNyA1LjNhMSAxIDAgMCAwIDAtMS40eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02IDE2IDIgMiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk04LjIzIDkuODVBMyAzIDAgMCAxIDExIDhhNSA1IDAgMCAxIDUgNSAzIDMgMCAwIDEtMS44NSAyLjc3bC0uOTIuMzhBMiAyIDAgMCAwIDEyIDE4YTQgNCAwIDAgMS00IDQgNiA2IDAgMCAxLTYtNiA0IDQgMCAwIDEgNC00IDIgMiAwIDAgMCAxLjg1LTEuMjN6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFtLmpzCnZhciBIYW07CnZhciBpbml0X2hhbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFtLmpzIigpIHsKICAgIEhhbSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjE0NCAyMS4xNDRBNy4yNzQgMTAuNDQ1IDQ1IDEgMCAyLjg1NiAxMC44NTYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk0xMy4xNDQgMjEuMTQ0QTcuMjc0IDQuMzY1IDQ1IDAgMCAyLjg1NiAxMC44NTZhNy4yNzQgNC4zNjUgNDUgMCAwIDEwLjI4OCAxMC4yODgiIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE2LjU2NSAxMC40MzUgMTguNiA4LjRhMi41MDEgMi41MDEgMCAxIDAgMS42NS00LjY1IDIuNSAyLjUgMCAxIDAtNC42NiAxLjY2bC0yLjAyNCAyLjAyNSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04LjUgMTYuNS0xLTEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oYW1idXJnZXIuanMKdmFyIEhhbWJ1cmdlcjsKdmFyIGluaXRfaGFtYnVyZ2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oYW1idXJnZXIuanMiKCkgewogICAgSGFtYnVyZ2VyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTZINGEyIDIgMCAxIDEgMC00aDE2YTIgMiAwIDEgMSAwIDRoLTQuMjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxMmEyIDIgMCAwIDEtMi0yIDkgNyAwIDAgMSAxOCAwIDIgMiAwIDAgMS0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxNmEyIDIgMCAwIDAtMiAyIDMgMyAwIDAgMCAzIDNoMTJhMyAzIDAgMCAwIDMtMyAyIDIgMCAwIDAtMi0ycTAgMCAwIDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNi42NyAxMiA2LjEzIDQuNmEyIDIgMCAwIDAgMi44LS40bDMuMTUtNC4yIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFtbWVyLmpzCnZhciBIYW1tZXI7CnZhciBpbml0X2hhbW1lciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFtbWVyLmpzIigpIHsKICAgIEhhbW1lciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDEyLTkuMzczIDkuMzczYTEgMSAwIDAgMS0zLjAwMS0zTDEyIDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMTUgNC00IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTIxLjUgMTEuNS0xLjkxNC0xLjkxNEEyIDIgMCAwIDEgMTkgOC4xNzJ2LS4zNDRhMiAyIDAgMCAwLS41ODYtMS40MTRsLTEuNjU3LTEuNjU3QTYgNiAwIDAgMCAxMi41MTYgM0g5bDEuMjQzIDEuMjQzQTYgNiAwIDAgMSAxMiA4LjQ4NVYxMGwyIDJoMS4xNzJhMiAyIDAgMCAxIDEuNDE0LjU4NkwxOC41IDE0LjUiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oYW5kLWNvaW5zLmpzCnZhciBIYW5kQ29pbnM7CnZhciBpbml0X2hhbmRfY29pbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhbmQtY29pbnMuanMiKCkgewogICAgSGFuZENvaW5zID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTVoMmEyIDIgMCAxIDAgMC00aC0zYy0uNiAwLTEuMS4yLTEuNC42TDMgMTciIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtNyAyMSAxLjYtMS40Yy4zLS40LjgtLjYgMS40LS42aDRjMS4xIDAgMi4xLS40IDIuOC0xLjJsNC42LTQuNGEyIDIgMCAwIDAtMi43NS0yLjkxbC00LjIgMy45IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMTYgNiA2IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYiLCBjeTogIjkiLCByOiAiMi45IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNiIsIGN5OiAiNSIsIHI6ICIzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFuZC1maXN0LmpzCnZhciBIYW5kRmlzdDsKdmFyIGluaXRfaGFuZF9maXN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oYW5kLWZpc3QuanMiKCkgewogICAgSGFuZEZpc3QgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMi4wMzUgMTcuMDEyYTMgMyAwIDAgMC0zLTNsLS4zMTEtLjAwMmEuNzIuNzIgMCAwIDEtLjUwNS0xLjIyOWwxLjE5NS0xLjE5NUEyIDIgMCAwIDEgMTAuODI4IDExSDEyYTIgMiAwIDAgMCAwLTRIOS4yNDNhMyAzIDAgMCAwLTIuMTIyLjg3OWwtMi43MDcgMi43MDdBNC44MyA0LjgzIDAgMCAwIDMgMTRhOCA4IDAgMCAwIDggOGgyYTggOCAwIDAgMCA4LThWN2EyIDIgMCAxIDAtNCAwdjJhMiAyIDAgMSAwIDQgMCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMy44ODggOS42NjJBMiAyIDAgMCAwIDE3IDhWNUEyIDIgMCAxIDAgMTMgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDVBMiAyIDAgMSAwIDUgNVYxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDdWNEEyIDIgMCAxIDEgMTMgNFY3LjI2OCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhbmQtZ3JhYi5qcwp2YXIgSGFuZEdyYWI7CnZhciBpbml0X2hhbmRfZ3JhYiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFuZC1ncmFiLmpzIigpIHsKICAgIEhhbmRHcmFiID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTEuNVY5YTIgMiAwIDAgMC0yLTJhMiAyIDAgMCAwLTIgMnYxLjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTBWOGEyIDIgMCAwIDAtMi0yYTIgMiAwIDAgMC0yIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA5LjlWOWEyIDIgMCAwIDAtMi0yYTIgMiAwIDAgMC0yIDJ2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE0YTIgMiAwIDAgMC0yLTJhMiAyIDAgMCAwLTIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMWEyIDIgMCAxIDEgNCAwdjNhOCA4IDAgMCAxLTggOGgtNGE4IDggMCAwIDEtOC04IDIgMiAwIDEgMSA0IDAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oYW5kLWhlYXJ0LmpzCnZhciBIYW5kSGVhcnQ7CnZhciBpbml0X2hhbmRfaGVhcnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhbmQtaGVhcnQuanMiKCkgewogICAgSGFuZEhlYXJ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTRoMmEyIDIgMCAwIDAgMC00aC0zYy0uNiAwLTEuMS4yLTEuNC42TDMgMTYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTQuNDUgMTMuMzkgNS4wNS00LjY5NEMyMC4xOTYgOCAyMSA2Ljg1IDIxIDUuNzVhMi43NSAyLjc1IDAgMCAwLTQuNzk3LTEuODM3LjI3Ni4yNzYgMCAwIDEtLjQwNiAwQTIuNzUgMi43NSAwIDAgMCAxMSA1Ljc1YzAgMS4yLjgwMiAyLjI0OCAxLjUgMi45NDZMMTYgMTEuOTUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAxNSA2IDYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIm03IDIwIDEuNi0xLjRjLjMtLjQuOC0uNiAxLjQtLjZoNGMxLjEgMCAyLjEtLjQgMi44LTEuMmw0LjYtNC40YTEgMSAwIDAgMC0yLjc1LTIuOTEiIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFuZC1oZWxwaW5nLmpzCnZhciBIYW5kSGVscGluZzsKdmFyIGluaXRfaGFuZF9oZWxwaW5nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oYW5kLWhlbHBpbmcuanMiKCkgewogICAgSGFuZEhlbHBpbmcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxMmgyYTIgMiAwIDEgMCAwLTRoLTNjLS42IDAtMS4xLjItMS40LjZMMyAxNCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm03IDE4IDEuNi0xLjRjLjMtLjQuOC0uNiAxLjQtLjZoNGMxLjEgMCAyLjEtLjQgMi44LTEuMmw0LjYtNC40YTIgMiAwIDAgMC0yLjc1LTIuOTFsLTQuMiAzLjkiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAxMyA2IDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oYW5kLW1ldGFsLmpzCnZhciBIYW5kTWV0YWw7CnZhciBpbml0X2hhbmRfbWV0YWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhbmQtbWV0YWwuanMiKCkgewogICAgSGFuZE1ldGFsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTIuNVYxMGEyIDIgMCAwIDAtMi0yYTIgMiAwIDAgMC0yIDJ2MS40IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDExVjlhMiAyIDAgMSAwLTQgMHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEwLjVWNWEyIDIgMCAxIDAtNCAwdjkiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtNyAxNS0xLjc2LTEuNzZhMiAyIDAgMCAwLTIuODMgMi44MmwzLjYgMy42QzcuNSAyMS4xNCA5LjIgMjIgMTIgMjJoMmE4IDggMCAwIDAgOC04VjdhMiAyIDAgMSAwLTQgMHY1IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFuZC1wbGF0dGVyLmpzCnZhciBIYW5kUGxhdHRlcjsKdmFyIGluaXRfaGFuZF9wbGF0dGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oYW5kLXBsYXR0ZXIuanMiKCkgewogICAgSGFuZFBsYXR0ZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAzVjIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTUuNCAxNy40IDMuMi0yLjhhMiAyIDAgMSAxIDIuOCAyLjlsLTMuNiAzLjNjLS43LjgtMS43IDEuMi0yLjggMS4yaC00Yy0xLjEgMC0yLjEtLjQtMi44LTEuMmwtMS4zMDItMS40NjRBMSAxIDAgMCAwIDYuMTUxIDE5SDUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxNGgxMmEyIDIgMCAwIDEgMCA0aC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTBoMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxMGE3IDcgMCAwIDEgMTQgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE0djZhMSAxIDAgMCAxLTEgMUgyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFuZGJhZy5qcwp2YXIgSGFuZGJhZzsKdmFyIGluaXRfaGFuZGJhZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFuZGJhZy5qcyIoKSB7CiAgICBIYW5kYmFnID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMi4wNDggMTguNTY2QTIgMiAwIDAgMCA0IDIxaDE2YTIgMiAwIDAgMCAxLjk1Mi0yLjQzNGwtMi05QTIgMiAwIDAgMCAxOCA4SDZhMiAyIDAgMCAwLTEuOTUyIDEuNTY2eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDExVjZhNCA0IDAgMCAxIDggMHY1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFuZC5qcwp2YXIgSGFuZDsKdmFyIGluaXRfaGFuZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFuZC5qcyIoKSB7CiAgICBIYW5kID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTFWNmEyIDIgMCAwIDAtMi0yYTIgMiAwIDAgMC0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTBWNGEyIDIgMCAwIDAtMi0yYTIgMiAwIDAgMC0yIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMC41VjZhMiAyIDAgMCAwLTItMmEyIDIgMCAwIDAtMiAydjgiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTggOGEyIDIgMCAxIDEgNCAwdjZhOCA4IDAgMCAxLTggOGgtMmMtMi44IDAtNC41LS44Ni01Ljk5LTIuMzRsLTMuNi0zLjZhMiAyIDAgMCAxIDIuODMtMi44Mkw3IDE1IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFyZC1kcml2ZS1kb3dubG9hZC5qcwp2YXIgSGFyZERyaXZlRG93bmxvYWQ7CnZhciBpbml0X2hhcmRfZHJpdmVfZG93bmxvYWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhcmQtZHJpdmUtZG93bmxvYWQuanMiKCkgewogICAgSGFyZERyaXZlRG93bmxvYWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgNi00IDQtNC00IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiOCIsIHg6ICIyIiwgeTogIjE0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMThoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE4aC4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhcmQtZHJpdmUuanMKdmFyIEhhcmREcml2ZTsKdmFyIGluaXRfaGFyZF9kcml2ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFyZC1kcml2ZS5qcyIoKSB7CiAgICBIYXJkRHJpdmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxNmguMDEiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMi4yMTIgMTEuNTc3YTIgMiAwIDAgMC0uMjEyLjg5NlYxOGEyIDIgMCAwIDAgMiAyaDE2YTIgMiAwIDAgMCAyLTJ2LTUuNTI3YTIgMiAwIDAgMC0uMjEyLS44OTZMMTguNTUgNS4xMUEyIDIgMCAwIDAgMTYuNzYgNEg3LjI0YTIgMiAwIDAgMC0xLjc5IDEuMTF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxLjk0NiAxMi4wMTNIMi4wNTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxNmguMDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oYW5kc2hha2UuanMKdmFyIEhhbmRzaGFrZTsKdmFyIGluaXRfaGFuZHNoYWtlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oYW5kc2hha2UuanMiKCkgewogICAgSGFuZHNoYWtlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTEgMTcgMiAyYTEgMSAwIDEgMCAzLTMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTQgMTQgMi41IDIuNWExIDEgMCAxIDAgMy0zbC0zLjg4LTMuODhhMyAzIDAgMCAwLTQuMjQgMGwtLjg4Ljg4YTEgMSAwIDEgMS0zLTNsMi44MS0yLjgxYTUuNzkgNS43OSAwIDAgMSA3LjA2LS44N2wuNDcuMjhhMiAyIDAgMCAwIDEuNDIuMjVMMjEgNCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAzIDEgMTFoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzIDIgMTRsNi41IDYuNWExIDEgMCAxIDAgMy0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgNGg4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFyZC1kcml2ZS11cGxvYWQuanMKdmFyIEhhcmREcml2ZVVwbG9hZDsKdmFyIGluaXRfaGFyZF9kcml2ZV91cGxvYWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhcmQtZHJpdmUtdXBsb2FkLmpzIigpIHsKICAgIEhhcmREcml2ZVVwbG9hZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDYtNC00LTQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjgiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICI4IiwgeDogIjIiLCB5OiAiMTQiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMThoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFyZC1oYXQuanMKdmFyIEhhcmRIYXQ7CnZhciBpbml0X2hhcmRfaGF0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oYXJkLWhhdC5qcyIoKSB7CiAgICBIYXJkSGF0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTBWNWExIDEgMCAwIDEgMS0xaDJhMSAxIDAgMCAxIDEgMXY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDZhNiA2IDAgMCAxIDYgNnYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTV2LTNhNiA2IDAgMCAxIDYtNiIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjIiLCB5OiAiMTUiLCB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiNCIsIHJ4OiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhc2guanMKdmFyIEhhc2g7CnZhciBpbml0X2hhc2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhc2guanMiKCkgewogICAgSGFzaCA9IFsKICAgICAgWyJsaW5lIiwgeyB4MTogIjQiLCB4MjogIjIwIiwgeTE6ICI5IiwgeTI6ICI5IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjQiLCB4MjogIjIwIiwgeTE6ICIxNSIsIHkyOiAiMTUiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTAiLCB4MjogIjgiLCB5MTogIjMiLCB5MjogIjIxIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE2IiwgeDI6ICIxNCIsIHkxOiAiMyIsIHkyOiAiMjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oYXQtZ2xhc3Nlcy5qcwp2YXIgSGF0R2xhc3NlczsKdmFyIGluaXRfaGF0X2dsYXNzZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhdC1nbGFzc2VzLmpzIigpIHsKICAgIEhhdEdsYXNzZXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxOGEyIDIgMCAwIDAtNCAwIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTE5IDExLTIuMTEtNi42NTdhMiAyIDAgMCAwLTIuNzUyLTEuMTQ4bC0xLjI3Ni42MUEyIDIgMCAwIDEgMTIgNEg4LjVhMiAyIDAgMCAwLTEuOTI1IDEuNDU2TDUgMTEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMWgyMCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE3IiwgY3k6ICIxOCIsIHI6ICIzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNyIsIGN5OiAiMTgiLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhemUuanMKdmFyIEhhemU7CnZhciBpbml0X2hhemUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhemUuanMiKCkgewogICAgSGF6ZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTUuMiA2LjIgMS40IDEuNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEzaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTNoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNy40IDcuNiAxLjQtMS40IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE3SDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMjFIMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxM2E0IDQgMCAwIDAtOCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDVWMi41IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGQuanMKdmFyIEhkOwp2YXIgaW5pdF9oZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGQuanMiKCkgewogICAgSGQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMkg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE1VjkiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTQgMTQuNWEuNS41IDAgMCAwIC41LjVoMWEyLjUgMi41IDAgMCAwIDIuNS0yLjV2LTFBMi41IDIuNSAwIDAgMCAxNS41IDloLTFhLjUuNSAwIDAgMC0uNS41eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE1VjkiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjUiLCB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTQiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oZG1pLXBvcnQuanMKdmFyIEhkbWlQb3J0Owp2YXIgaW5pdF9oZG1pX3BvcnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hkbWktcG9ydC5qcyIoKSB7CiAgICBIZG1pUG9ydCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMjIgOWExIDEgMCAwIDAtMS0xSDNhMSAxIDAgMCAwLTEgMXY0YTEgMSAwIDAgMCAxIDFoMWwyIDJoMTJsMi0yaDFhMSAxIDAgMCAwIDEtMVoiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcuNSAxMmg5IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhZGluZy0xLmpzCnZhciBIZWFkaW5nMTsKdmFyIGluaXRfaGVhZGluZ18xID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oZWFkaW5nLTEuanMiKCkgewogICAgSGVhZGluZzEgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEyaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxOFY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4VjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMTIgMy0ydjgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oZWFkaW5nLTIuanMKdmFyIEhlYWRpbmcyOwp2YXIgaW5pdF9oZWFkaW5nXzIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlYWRpbmctMi5qcyIoKSB7CiAgICBIZWFkaW5nMiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTJoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE4VjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMThWNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxOGgtNGMwLTQgNC0zIDQtNiAwLTEuNS0yLTIuNS00LTEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oZWFkaW5nLTMuanMKdmFyIEhlYWRpbmczOwp2YXIgaW5pdF9oZWFkaW5nXzMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlYWRpbmctMy5qcyIoKSB7CiAgICBIZWFkaW5nMyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTJoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE4VjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMThWNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy41IDEwLjVjMS43LTEgMy41IDAgMy41IDEuNWEyIDIgMCAwIDEtMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDE3LjVjMiAxLjUgNCAuMyA0LTEuNWEyIDIgMCAwIDAtMi0yIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhZGluZy00LmpzCnZhciBIZWFkaW5nNDsKdmFyIGluaXRfaGVhZGluZ180ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oZWFkaW5nLTQuanMiKCkgewogICAgSGVhZGluZzQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOFY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDEwdjNhMSAxIDAgMCAwIDEgMWgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEwdjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMThWNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlYWRpbmctNS5qcwp2YXIgSGVhZGluZzU7CnZhciBpbml0X2hlYWRpbmdfNSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhZGluZy01LmpzIigpIHsKICAgIEhlYWRpbmc1ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMThWNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOFY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDEzdi0zaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTcuN2MuNC4yLjguMyAxLjMuMyAxLjUgMCAyLjctMS4xIDIuNy0yLjVTMTkuOCAxMyAxOC4zIDEzSDE3IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhZGluZy5qcwp2YXIgSGVhZGluZzsKdmFyIGluaXRfaGVhZGluZzMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlYWRpbmcuanMiKCkgewogICAgSGVhZGluZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTJoMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAyMFY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDIwVjQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oZWFkaW5nLTYuanMKdmFyIEhlYWRpbmc2Owp2YXIgaW5pdF9oZWFkaW5nXzYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlYWRpbmctNi5qcyIoKSB7CiAgICBIZWFkaW5nNiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTJoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE4VjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMThWNiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE5IiwgY3k6ICIxNiIsIHI6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDEwYy0yIDItMyAzLjUtMyA2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhZHBob25lcy5qcwp2YXIgSGVhZHBob25lczsKdmFyIGluaXRfaGVhZHBob25lcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhZHBob25lcy5qcyIoKSB7CiAgICBIZWFkcGhvbmVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMyAxNGgzYTIgMiAwIDAgMSAyIDJ2M2EyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtN2E5IDkgMCAwIDEgMTggMHY3YTIgMiAwIDAgMS0yIDJoLTFhMiAyIDAgMCAxLTItMnYtM2EyIDIgMCAwIDEgMi0yaDMiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oZWFkcGhvbmUtb2ZmLmpzCnZhciBIZWFkcGhvbmVPZmY7CnZhciBpbml0X2hlYWRwaG9uZV9vZmYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlYWRwaG9uZS1vZmYuanMiKCkgewogICAgSGVhZHBob25lT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTRoLTEuMzQzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuMTI4IDMuNDdBOSA5IDAgMCAxIDIxIDEydjMuMzQzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC40MTQgMjAuNDE0QTIgMiAwIDAgMSAxOSAyMWgtMWEyIDIgMCAwIDEtMi0ydi0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTRoM2EyIDIgMCAwIDEgMiAydjNhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ2LTdhOSA5IDAgMCAxIDIuNjM2LTYuMzY0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhZHNldC5qcwp2YXIgSGVhZHNldDsKdmFyIGluaXRfaGVhZHNldCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhZHNldC5qcyIoKSB7CiAgICBIZWFkc2V0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMyAxMWgzYTIgMiAwIDAgMSAyIDJ2M2EyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNVptMCAwYTkgOSAwIDEgMSAxOCAwbTAgMHY1YTIgMiAwIDAgMS0yIDJoLTFhMiAyIDAgMCAxLTItMnYtM2EyIDIgMCAwIDEgMi0yaDNaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE2djJhNCA0IDAgMCAxLTQgNGgtNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlYXJ0LWhhbmRzaGFrZS5qcwp2YXIgSGVhcnRIYW5kc2hha2U7CnZhciBpbml0X2hlYXJ0X2hhbmRzaGFrZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhcnQtaGFuZHNoYWtlLmpzIigpIHsKICAgIEhlYXJ0SGFuZHNoYWtlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTkuNDE0IDE0LjQxNEMyMSAxMi44MjggMjIgMTEuNSAyMiA5LjVhNS41IDUuNSAwIDAgMC05LjU5MS0zLjY3Ni42LjYgMCAwIDEtLjgxOC4wMDFBNS41IDUuNSAwIDAgMCAyIDkuNWMwIDIuMyAxLjUgNCAzIDUuNWw1LjUzNSA1LjM2MmEyIDIgMCAwIDAgMi44NzkuMDUyIDIuMTIgMi4xMiAwIDAgMC0uMDA0LTMgMi4xMjQgMi4xMjQgMCAxIDAgMy0zIDIuMTI0IDIuMTI0IDAgMCAwIDMuMDA0IDAgMiAyIDAgMCAwIDAtMi44MjhsLTEuODgxLTEuODgyYTIuNDEgMi40MSAwIDAgMC0zLjQwOSAwbC0xLjcxIDEuNzFhMiAyIDAgMCAxLTIuODI4IDAgMiAyIDAgMCAxIDAtMi44MjhsMi44MjMtMi43NjIiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oZWFydC1jcmFjay5qcwp2YXIgSGVhcnRDcmFjazsKdmFyIGluaXRfaGVhcnRfY3JhY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlYXJ0LWNyYWNrLmpzIigpIHsKICAgIEhlYXJ0Q3JhY2sgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMi40MDkgNS44MjRjLS43MDIuNzkyLTEuMTUgMS40OTYtMS40MTUgMi4xNjZsMi4xNTMgMi4xNTZhLjUuNSAwIDAgMSAwIC43MDdsLTIuMjkzIDIuMjkzYS41LjUgMCAwIDAgMCAuNzA3TDEyIDE1IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEzLjUwOCAyMC4zMTNhMiAyIDAgMCAxLTMgLjAxOUw1IDE1Yy0xLjUtMS41LTMtMy4yLTMtNS41YTUuNSA1LjUgMCAwIDEgOS41OTEtMy42NzcuNi42IDAgMCAwIC44MTguMDAxQTUuNSA1LjUgMCAwIDEgMjIgOS41YzAgMi4yOS0xLjUgNC0zIDUuNXoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oZWFydC1vZmYuanMKdmFyIEhlYXJ0T2ZmOwp2YXIgaW5pdF9oZWFydF9vZmYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlYXJ0LW9mZi5qcyIoKSB7CiAgICBIZWFydE9mZiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwLjUgNC44OTNhNS41IDUuNSAwIDAgMSAxLjA5MS45MzEuNTYuNTYgMCAwIDAgLjgxOCAwQTUuNDkgNS40OSAwIDAgMSAyMiA5LjVjMCAxLjg3Mi0xLjAwMiAzLjM1Ni0yLjE4NyA0LjY1NSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xNi45NjcgMTYuOTY3LTMuNDU5IDMuMzQ2YTIgMiAwIDAgMS0zIC4wMTlMNSAxNWMtMS41LTEuNS0zLTMuMi0zLTUuNWE1LjUgNS41IDAgMCAxIDIuNzQ3LTQuNzYxIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlYXJ0LW1pbnVzLmpzCnZhciBIZWFydE1pbnVzOwp2YXIgaW5pdF9oZWFydF9taW51cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhcnQtbWludXMuanMiKCkgewogICAgSGVhcnRNaW51cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTE0Ljg3NiAxOC45OS0xLjM2OCAxLjMyM2EyIDIgMCAwIDEtMyAuMDE5TDUgMTVjLTEuNS0xLjUtMy0zLjItMy01LjVhNS41IDUuNSAwIDAgMSA5LjU5MS0zLjY3Ni41Ni41NiAwIDAgMCAuODE4IDBBNS40OSA1LjQ5IDAgMCAxIDIyIDkuNWE1LjIgNS4yIDAgMCAxLS4yNDQgMS41NzIiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTVoNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlYXJ0LXBsdXMuanMKdmFyIEhlYXJ0UGx1czsKdmFyIGluaXRfaGVhcnRfcGx1cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhcnQtcGx1cy5qcyIoKSB7CiAgICBIZWFydFBsdXMgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xNC40NzkgMTkuMzc0LS45NzEuOTM5YTIgMiAwIDAgMS0zIC4wMTlMNSAxNWMtMS41LTEuNS0zLTMuMi0zLTUuNWE1LjUgNS41IDAgMCAxIDkuNTkxLTMuNjc2LjU2LjU2IDAgMCAwIC44MTggMEE1LjQ5IDUuNDkgMCAwIDEgMjIgOS41YTUuMiA1LjIgMCAwIDEtLjIxOSAxLjQ5IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDE1aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTJ2NiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlYXJ0LXB1bHNlLmpzCnZhciBIZWFydFB1bHNlOwp2YXIgaW5pdF9oZWFydF9wdWxzZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhcnQtcHVsc2UuanMiKCkgewogICAgSGVhcnRQdWxzZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIgOS41YTUuNSA1LjUgMCAwIDEgOS41OTEtMy42NzYuNTYuNTYgMCAwIDAgLjgxOCAwQTUuNDkgNS40OSAwIDAgMSAyMiA5LjVjMCAyLjI5LTEuNSA0LTMgNS41bC01LjQ5MiA1LjMxM2EyIDIgMCAwIDEtMyAuMDE5TDUgMTVjLTEuNS0xLjUtMy0zLjItMy01LjUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy4yMiAxM0g5LjVsLjUtMSAyIDQuNSAyLTcgMS41IDMuNWg1LjI3IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhcnQuanMKdmFyIEhlYXJ0Owp2YXIgaW5pdF9oZWFydCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhcnQuanMiKCkgewogICAgSGVhcnQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yIDkuNWE1LjUgNS41IDAgMCAxIDkuNTkxLTMuNjc2LjU2LjU2IDAgMCAwIC44MTggMEE1LjQ5IDUuNDkgMCAwIDEgMjIgOS41YzAgMi4yOS0xLjUgNC0zIDUuNWwtNS40OTIgNS4zMTNhMiAyIDAgMCAxLTMgLjAxOUw1IDE1Yy0xLjUtMS41LTMtMy4yLTMtNS41IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhdGVyLmpzCnZhciBIZWF0ZXI7CnZhciBpbml0X2hlYXRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhdGVyLmpzIigpIHsKICAgIEhlYXRlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDhjMi0zLTItMyAwLTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUuNSA4YzItMy0yLTMgMC02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTBoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTRoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE2di00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE2di00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE2di00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDZhMiAyIDAgMCAxIDIgMnYxMGEyIDIgMCAwIDEtMiAySDRhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDIwdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMjB2MiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlbGljb3B0ZXIuanMKdmFyIEhlbGljb3B0ZXI7CnZhciBpbml0X2hlbGljb3B0ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlbGljb3B0ZXIuanMiKCkgewogICAgSGVsaWNvcHRlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDE3djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgM3Y4YTIgMiAwIDAgMCAyIDJoNS44NjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTd2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxN2E0IDQgMCAwIDAgNC00IDggNiAwIDAgMC04LTYgNiA1IDAgMCAwLTYgNXYzYTIgMiAwIDAgMCAyIDJ6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTB2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDNoMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMWgxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEzSDIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oZXhhZ29uLmpzCnZhciBIZXhhZ29uOwp2YXIgaW5pdF9oZXhhZ29uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oZXhhZ29uLmpzIigpIHsKICAgIEhleGFnb24gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMSAxNlY4YTIgMiAwIDAgMC0xLTEuNzNsLTctNGEyIDIgMCAwIDAtMiAwbC03IDRBMiAyIDAgMCAwIDMgOHY4YTIgMiAwIDAgMCAxIDEuNzNsNyA0YTIgMiAwIDAgMCAyIDBsNy00QTIgMiAwIDAgMCAyMSAxNnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oaWdobGlnaHRlci5qcwp2YXIgSGlnaGxpZ2h0ZXI7CnZhciBpbml0X2hpZ2hsaWdodGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oaWdobGlnaHRlci5qcyIoKSB7CiAgICBIaWdobGlnaHRlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTEtNiA2djNoOWwzLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgMTItNC42IDQuNmEyIDIgMCAwIDEtMi44IDBsLTUuMi01LjJhMiAyIDAgMCAxIDAtMi44TDE0IDQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oaXN0b3J5LmpzCnZhciBIaXN0b3J5Owp2YXIgaW5pdF9oaXN0b3J5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9oaXN0b3J5LmpzIigpIHsKICAgIEhpc3RvcnkgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyYTkgOSAwIDEgMCA5LTkgOS43NSA5Ljc1IDAgMCAwLTYuNzQgMi43NEwzIDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjVoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA3djVsNCAyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaG9wLW9mZi5qcwp2YXIgSG9wT2ZmOwp2YXIgaW5pdF9ob3Bfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ob3Atb2ZmLmpzIigpIHsKICAgIEhvcE9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjgyIDE2LjEyYzEuNjkuNiAzLjkxLjc5IDUuMTguODUuMjguMDEuNTMtLjA5LjctLjI3IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTEuMTQgMjAuNTdjLjUyLjI0IDIuNDQgMS4xMiA0LjA4IDEuMzcuNDYuMDYuODYtLjI1LjktLjcxLjEyLTEuNTItLjMtMy40My0uNS00LjI4IiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNi4xMyAyMS4wNWMxLjY1LjYzIDMuNjguODQgNC44Ny45MWEuOS45IDAgMCAwIC43LS4yNiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTE3Ljk5IDUuNTJhMjAuODMgMjAuODMgMCAwIDEgMy4xNSA0LjUuOC44IDAgMCAxLS42OCAxLjEzYy0xLjE3LjEtMi41LjAyLTMuOS0uMjUiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwLjU3IDExLjE0Yy4yNC41MiAxLjEyIDIuNDQgMS4zNyA0LjA4LjA0LjMtLjA4LjU5LS4zMS43NSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00LjkzIDQuOTNhMTAgMTAgMCAwIDAtLjY3IDEzLjRjLjM1LjQzLjk2LjQgMS4xNy0uMTIuNjktMS43MSAxLjA3LTUuMDcgMS4wNy02LjcxIDEuMzQuNDUgMy4xLjkgNC44OC42MmEuODUuODUgMCAwIDAgLjQ4LS4yNCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTUuNTIgMTcuOTljMS4wNS45NSAyLjkxIDIuNDIgNC41IDMuMTVhLjguOCAwIDAgMCAxLjEzLS42OGMuMi0yLjM0LS4zMy01LjMtMS41Ny04LjI4IiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjM1IDIuNjhhMTAgMTAgMCAwIDEgOS45OCAxLjU4Yy40My4zNS40Ljk2LS4xMiAxLjE3LTEuNS42LTQuMy45OC02LjA3IDEuMDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaG9zcGl0YWwuanMKdmFyIEhvc3BpdGFsOwp2YXIgaW5pdF9ob3NwaXRhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaG9zcGl0YWwuanMiKCkgewogICAgSG9zcGl0YWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA3djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjF2LTNhMiAyIDAgMCAwLTQgMHYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDloLTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTFoMmEyIDIgMCAwIDEgMiAydjZhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJ2LTlhMiAyIDAgMCAxIDItMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDIxVjVhMiAyIDAgMCAwLTItMkg4YTIgMiAwIDAgMC0yIDJ2MTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ob3AuanMKdmFyIEhvcDsKdmFyIGluaXRfaG9wID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ob3AuanMiKCkgewogICAgSG9wID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk0xMC44MiAxNi4xMmMxLjY5LjYgMy45MS43OSA1LjE4Ljg1LjU1LjAzIDEtLjQyLjk3LS45Ny0uMDYtMS4yNy0uMjYtMy41LS44NS01LjE4IiB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMS41IDYuNWMxLjY0IDAgNS0uMzggNi43MS0xLjA3LjUyLS4yLjU1LS44Mi4xMi0xLjE3QTEwIDEwIDAgMCAwIDQuMjYgMTguMzNjLjM1LjQzLjk2LjQgMS4xNy0uMTIuNjktMS43MSAxLjA3LTUuMDcgMS4wNy02LjcxIDEuMzQuNDUgMy4xLjkgNC44OC42MmEuODguODggMCAwIDAgLjczLS43NGMuMy0yLjE0LS4xNS0zLjUtLjYxLTQuODgiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk0xNS42MiAxNi45NWMuMi44NS42MiAyLjc2LjUgNC4yOGEuNzcuNzcgMCAwIDEtLjkuNyAxNi42NCAxNi42NCAwIDAgMS00LjA4LTEuMzYiIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTYuMTMgMjEuMDVjMS42NS42MyAzLjY4Ljg0IDQuODcuOTFhLjkuOSAwIDAgMCAuOTYtLjk2IDE3LjY4IDE3LjY4IDAgMCAwLS45LTQuODciIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTYuOTQgMTUuNjJjLjg2LjIgMi43Ny42MiA0LjI5LjVhLjc3Ljc3IDAgMCAwIC43LS45IDE2LjY0IDE2LjY0IDAgMCAwLTEuMzYtNC4wOCIgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk0xNy45OSA1LjUyYTIwLjgyIDIwLjgyIDAgMCAxIDMuMTUgNC41LjguOCAwIDAgMS0uNjggMS4xM2MtMi4zMy4yLTUuMy0uMzItOC4yNy0xLjU3IiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00LjkzIDQuOTMgMyAzYS43LjcgMCAwIDEgMC0xIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTkuNTggMTIuMThjMS4yNCAyLjk4IDEuNzcgNS45NSAxLjU3IDguMjhhLjguOCAwIDAgMS0xLjEzLjY4IDIwLjgyIDIwLjgyIDAgMCAxLTQuNS0zLjE1IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaG90ZWwuanMKdmFyIEhvdGVsOwp2YXIgaW5pdF9ob3RlbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaG90ZWwuanMiKCkgewogICAgSG90ZWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAyMnYtNi41NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgN2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTUuNDNWMjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTZhNSA1IDAgMCAwLTYgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgN2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA3aC4wMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjQiLCB5OiAiMiIsIHdpZHRoOiAiMTYiLCBoZWlnaHQ6ICIyMCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hvdXJnbGFzcy5qcwp2YXIgSG91cmdsYXNzOwp2YXIgaW5pdF9ob3VyZ2xhc3MgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hvdXJnbGFzcy5qcyIoKSB7CiAgICBIb3VyZ2xhc3MgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDIyaDE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMmgxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAyMnYtNC4xNzJhMiAyIDAgMCAwLS41ODYtMS40MTRMMTIgMTJsLTQuNDE0IDQuNDE0QTIgMiAwIDAgMCA3IDE3LjgyOFYyMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDJ2NC4xNzJhMiAyIDAgMCAwIC41ODYgMS40MTRMMTIgMTJsNC40MTQtNC40MTRBMiAyIDAgMCAwIDE3IDYuMTcyVjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ob3VzZS1oZWFydC5qcwp2YXIgSG91c2VIZWFydDsKdmFyIGluaXRfaG91c2VfaGVhcnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hvdXNlLWhlYXJ0LmpzIigpIHsKICAgIEhvdXNlSGVhcnQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk04LjYyIDEzLjhBMi4yNSAyLjI1IDAgMSAxIDEyIDEwLjgzNmEyLjI1IDIuMjUgMCAxIDEgMy4zOCAyLjk2NmwtMi42MjYgMi44NTZhLjk5OC45OTggMCAwIDEtMS41MDcgMHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMyAxMGEyIDIgMCAwIDEgLjcwOS0xLjUyOGw3LTZhMiAyIDAgMCAxIDIuNTgyIDBsNyA2QTIgMiAwIDAgMSAyMSAxMHY5YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hvdXNlLXBsdXMuanMKdmFyIEhvdXNlUGx1czsKdmFyIGluaXRfaG91c2VfcGx1cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaG91c2UtcGx1cy5qcyIoKSB7CiAgICBIb3VzZVBsdXMgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMi4zNSAyMUg1YTIgMiAwIDAgMS0yLTJ2LTlhMiAyIDAgMCAxIC43MS0xLjUzbDctNmEyIDIgMCAwIDEgMi41OCAwbDcgNkEyIDIgMCAwIDEgMjEgMTB2Mi4zNSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNC44IDEyLjRBMSAxIDAgMCAwIDE0IDEyaC00YTEgMSAwIDAgMC0xIDF2OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxOGg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE1djYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ob3VzZS1wbHVnLmpzCnZhciBIb3VzZVBsdWc7CnZhciBpbml0X2hvdXNlX3BsdWcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hvdXNlLXBsdWcuanMiKCkgewogICAgSG91c2VQbHVnID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTJWOC45NjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTJWOC45NjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTJhMSAxIDAgMCAxIDEgMXYyYTIgMiAwIDAgMS0yIDJoLTRhMiAyIDAgMCAxLTItMnYtMmExIDEgMCAwIDEgMS0xeiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk04LjUgMjFINWEyIDIgMCAwIDEtMi0ydi05YTIgMiAwIDAgMSAuNzA5LTEuNTI4bDctNmEyIDIgMCAwIDEgMi41ODIgMGw3IDZBMiAyIDAgMCAxIDIxIDEwdjlhMiAyIDAgMCAxLTIgMmgtNWEyIDIgMCAwIDEtMi0ydi0yIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaG91c2Utd2lmaS5qcwp2YXIgSG91c2VXaWZpOwp2YXIgaW5pdF9ob3VzZV93aWZpID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ob3VzZS13aWZpLmpzIigpIHsKICAgIEhvdXNlV2lmaSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuNSAxMy44NjZhNCA0IDAgMCAxIDUgLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3aC4wMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0zIDEwYTIgMiAwIDAgMSAuNzA5LTEuNTI4bDctNmEyIDIgMCAwIDEgMi41ODIgMGw3IDZBMiAyIDAgMCAxIDIxIDEwdjlhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTAuNzU0YTggOCAwIDAgMSAxMCAwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaWNlLWNyZWFtLWJvd2wuanMKdmFyIEljZUNyZWFtQm93bDsKdmFyIGluaXRfaWNlX2NyZWFtX2Jvd2wgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ljZS1jcmVhbS1ib3dsLmpzIigpIHsKICAgIEljZUNyZWFtQm93bCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTIgMTdjNSAwIDgtMi42OSA4LTZINGMwIDMuMzEgMyA2IDggNm0tNCA0aDhtLTQtM3YzTTUuMTQgMTFhMy41IDMuNSAwIDEgMSA2LjcxIDAiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyLjE0IDExYTMuNSAzLjUgMCAxIDEgNi43MSAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1LjUgNi41YTMuNSAzLjUgMCAxIDAtNyAwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaG91c2UuanMKdmFyIEhvdXNlOwp2YXIgaW5pdF9ob3VzZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaG91c2UuanMiKCkgewogICAgSG91c2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAyMXYtOGExIDEgMCAwIDAtMS0xaC00YTEgMSAwIDAgMC0xIDF2OCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0zIDEwYTIgMiAwIDAgMSAuNzA5LTEuNTI4bDctNmEyIDIgMCAwIDEgMi41ODIgMGw3IDZBMiAyIDAgMCAxIDIxIDEwdjlhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaWNlLWNyZWFtLWNvbmUuanMKdmFyIEljZUNyZWFtQ29uZTsKdmFyIGluaXRfaWNlX2NyZWFtX2NvbmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ljZS1jcmVhbS1jb25lLmpzIigpIHsKICAgIEljZUNyZWFtQ29uZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMTEgNC4wOCAxMC4zNWExIDEgMCAwIDAgMS44NCAwTDE3IDExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDdBNSA1IDAgMCAwIDcgNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyA3YTIgMiAwIDAgMSAwIDRIN2EyIDIgMCAwIDEgMC00IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaWQtY2FyZC5qcwp2YXIgSWRDYXJkOwp2YXIgaW5pdF9pZF9jYXJkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9pZC1jYXJkLmpzIigpIHsKICAgIElkQ2FyZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEwaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTRoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjE3IDE1YTMgMyAwIDAgMSA1LjY2IDAiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICIxMSIsIHI6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMiIsIHk6ICI1Iiwgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE0Iiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaWQtY2FyZC1sYW55YXJkLmpzCnZhciBJZENhcmRMYW55YXJkOwp2YXIgaW5pdF9pZF9jYXJkX2xhbnlhcmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2lkLWNhcmQtbGFueWFyZC5qcyIoKSB7CiAgICBJZENhcmRMYW55YXJkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMuNSA4aC0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDItMSAyaDNhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEtMiAySDdhMiAyIDAgMCAxLTItMlY2YTIgMiAwIDAgMSAyLTJoMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNi44OTkgMjJBNSA1IDAgMCAwIDcuMSAyMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDIgMyA2IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjE1IiwgcjogIjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9pbWFnZS1kb3duLmpzCnZhciBJbWFnZURvd247CnZhciBpbml0X2ltYWdlX2Rvd24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ltYWdlLWRvd24uanMiKCkgewogICAgSW1hZ2VEb3duID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTAuMyAyMUg1YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDE0YTIgMiAwIDAgMSAyIDJ2MTBsLTMuMS0zLjFhMiAyIDAgMCAwLTIuODE0LjAxNEw2IDIxIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDE5IDMgM3YtNS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDIyIDMtMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjkiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ltYWdlLW1pbnVzLmpzCnZhciBJbWFnZU1pbnVzOwp2YXIgaW5pdF9pbWFnZV9taW51cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaW1hZ2UtbWludXMuanMiKCkgewogICAgSW1hZ2VNaW51cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDl2MTBhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDciIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTYiLCB4MjogIjIyIiwgeTE6ICI1IiwgeTI6ICI1IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOSIsIGN5OiAiOSIsIHI6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDE1LTMuMDg2LTMuMDg2YTIgMiAwIDAgMC0yLjgyOCAwTDYgMjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9pbWFnZS1vZmYuanMKdmFyIEltYWdlT2ZmOwp2YXIgaW5pdF9pbWFnZV9vZmYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ltYWdlLW9mZi5qcyIoKSB7CiAgICBJbWFnZU9mZiA9IFsKICAgICAgWyJsaW5lIiwgeyB4MTogIjIiLCB4MjogIjIyIiwgeTE6ICIyIiwgeTI6ICIyMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC40MSAxMC40MWEyIDIgMCAxIDEtMi44My0yLjgzIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEzLjUiLCB4MjogIjYiLCB5MTogIjEzLjUiLCB5MjogIjIxIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE4IiwgeDI6ICIyMSIsIHkxOiAiMTIiLCB5MjogIjE1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuNTkgMy41OUExLjk5IDEuOTkgMCAwIDAgMyA1djE0YTIgMiAwIDAgMCAyIDJoMTRjLjU1IDAgMS4wNTItLjIyIDEuNDEtLjU5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE1VjVhMiAyIDAgMCAwLTItMkg5IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaW1hZ2UtcGxheS5qcwp2YXIgSW1hZ2VQbGF5Owp2YXIgaW5pdF9pbWFnZV9wbGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9pbWFnZS1wbGF5LmpzIigpIHsKICAgIEltYWdlUGxheSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE1IDE1LjAwM2ExIDEgMCAwIDEgMS41MTctLjg1OWw0Ljk5NyAyLjk5N2ExIDEgMCAwIDEgMCAxLjcxOGwtNC45OTcgMi45OTdhMSAxIDAgMCAxLTEuNTE3LS44NnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTIuMTdWNWEyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNiAyMSA1LTUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICI5IiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9pbWFnZS1wbHVzLmpzCnZhciBJbWFnZVBsdXM7CnZhciBpbml0X2ltYWdlX3BsdXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ltYWdlLXBsdXMuanMiKCkgewogICAgSW1hZ2VQbHVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNWg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDJ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMS41VjE5YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmg3LjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMTUtMy4wODYtMy4wODZhMiAyIDAgMCAwLTIuODI4IDBMNiAyMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjkiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ltYWdlLXVwLmpzCnZhciBJbWFnZVVwOwp2YXIgaW5pdF9pbWFnZV91cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaW1hZ2UtdXAuanMiKCkgewogICAgSW1hZ2VVcCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEwLjMgMjFINWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmgxNGEyIDIgMCAwIDEgMiAydjEwbC0zLjEtMy4xYTIgMiAwIDAgMC0yLjgxNC4wMTRMNiAyMSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAxOS41IDMtMyAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMjJ2LTUuNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjkiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ltYWdlLXVwc2NhbGUuanMKdmFyIEltYWdlVXBzY2FsZTsKdmFyIGluaXRfaW1hZ2VfdXBzY2FsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaW1hZ2UtdXBzY2FsZS5qcyIoKSB7CiAgICBJbWFnZVVwc2NhbGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAzaDV2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAyMWgyYTIgMiAwIDAgMCAyLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTJ2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAzLTUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDdWNWEyIDIgMCAwIDEgMi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTUgMjEgNC4xNDQtNC4xNDRhMS4yMSAxLjIxIDAgMCAxIDEuNzEyIDBMMTMgMTkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAzaDMiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIzIiwgeTogIjExIiwgd2lkdGg6ICIxMCIsIGhlaWdodDogIjEwIiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaW1hZ2UuanMKdmFyIEltYWdlMjsKdmFyIGluaXRfaW1hZ2UzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9pbWFnZS5qcyIoKSB7CiAgICBJbWFnZTIgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjkiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAxNS0zLjA4Ni0zLjA4NmEyIDIgMCAwIDAtMi44MjggMEw2IDIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaW1hZ2VzLmpzCnZhciBJbWFnZXM7CnZhciBpbml0X2ltYWdlcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaW1hZ2VzLmpzIigpIHsKICAgIEltYWdlcyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDExLTEuMjk2LTEuMjk2YTIuNCAyLjQgMCAwIDAtMy40MDggMEwxMSAxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDhhMiAyIDAgMCAwLTIgMnYxMGEyIDIgMCAwIDAgMiAyaDEwYTIgMiAwIDAgMCAyLTIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMyIsIGN5OiAiNyIsIHI6ICIxIiwgZmlsbDogImN1cnJlbnRDb2xvciIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjgiLCB5OiAiMiIsIHdpZHRoOiAiMTQiLCBoZWlnaHQ6ICIxNCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ltcG9ydC5qcwp2YXIgSW1wb3J0Owp2YXIgaW5pdF9pbXBvcnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ltcG9ydC5qcyIoKSB7CiAgICBJbXBvcnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAzdjEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggMTEgNCA0IDQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDVINGEyIDIgMCAwIDAtMiAydjEwYTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMlY3YTIgMiAwIDAgMC0yLTJoLTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9pbmJveC5qcwp2YXIgSW5ib3g7CnZhciBpbml0X2luYm94ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9pbmJveC5qcyIoKSB7CiAgICBJbmJveCA9IFsKICAgICAgWyJwb2x5bGluZSIsIHsgcG9pbnRzOiAiMjIgMTIgMTYgMTIgMTQgMTUgMTAgMTUgOCAxMiAyIDEyIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTUuNDUgNS4xMSAyIDEydjZhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0ydi02bC0zLjQ1LTYuODlBMiAyIDAgMCAwIDE2Ljc2IDRINy4yNGEyIDIgMCAwIDAtMS43OSAxLjExeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2luZmluaXR5LmpzCnZhciBJbmZpbml0eTI7CnZhciBpbml0X2luZmluaXR5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9pbmZpbml0eS5qcyIoKSB7CiAgICBJbmZpbml0eTIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE2YzUgMCA3LTggMTItOGE0IDQgMCAwIDEgMCA4Yy01IDAtNy04LTEyLThhNCA0IDAgMSAwIDAgOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2luZGlhbi1ydXBlZS5qcwp2YXIgSW5kaWFuUnVwZWU7CnZhciBpbml0X2luZGlhbl9ydXBlZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaW5kaWFuLXJ1cGVlLmpzIigpIHsKICAgIEluZGlhblJ1cGVlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAzaDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgOGgxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02IDEzIDguNSA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTNoMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDEzYzYuNjY3IDAgNi42NjctMTAgMC0xMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2luZm8uanMKdmFyIEluZm8yOwp2YXIgaW5pdF9pbmZvMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaW5mby5qcyIoKSB7CiAgICBJbmZvMiA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE2di00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDhoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaW5zcGVjdGlvbi1wYW5lbC5qcwp2YXIgSW5zcGVjdGlvblBhbmVsOwp2YXIgaW5pdF9pbnNwZWN0aW9uX3BhbmVsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9pbnNwZWN0aW9uLXBhbmVsLmpzIigpIHsKICAgIEluc3BlY3Rpb25QYW5lbCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgN2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgN2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxN2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTdoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaW5zdGFncmFtLmpzCnZhciBJbnN0YWdyYW07CnZhciBpbml0X2luc3RhZ3JhbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaW5zdGFncmFtLmpzIigpIHsKICAgIEluc3RhZ3JhbSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMjAiLCB4OiAiMiIsIHk6ICIyIiwgcng6ICI1Iiwgcnk6ICI1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDExLjM3QTQgNCAwIDEgMSAxMi42MyA4IDQgNCAwIDAgMSAxNiAxMS4zN3oiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTcuNSIsIHgyOiAiMTcuNTEiLCB5MTogIjYuNSIsIHkyOiAiNi41IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaXRhbGljLmpzCnZhciBJdGFsaWM7CnZhciBpbml0X2l0YWxpYyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaXRhbGljLmpzIigpIHsKICAgIEl0YWxpYyA9IFsKICAgICAgWyJsaW5lIiwgeyB4MTogIjE5IiwgeDI6ICIxMCIsIHkxOiAiNCIsIHkyOiAiNCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNCIsIHgyOiAiNSIsIHkxOiAiMjAiLCB5MjogIjIwIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE1IiwgeDI6ICI5IiwgeTE6ICI0IiwgeTI6ICIyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2l0ZXJhdGlvbi1jdy5qcwp2YXIgSXRlcmF0aW9uQ3c7CnZhciBpbml0X2l0ZXJhdGlvbl9jdyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaXRlcmF0aW9uLWN3LmpzIigpIHsKICAgIEl0ZXJhdGlvbkN3ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMGE4IDggMCAxIDEgOCA4SDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAyMi00LTQgNC00IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvaXRlcmF0aW9uLWNjdy5qcwp2YXIgSXRlcmF0aW9uQ2N3Owp2YXIgaW5pdF9pdGVyYXRpb25fY2N3ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9pdGVyYXRpb24tY2N3LmpzIigpIHsKICAgIEl0ZXJhdGlvbkNjdyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDE0IDQgNC00IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTBhOCA4IDAgMSAwLTggOGg4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvam95c3RpY2suanMKdmFyIEpveXN0aWNrOwp2YXIgaW5pdF9qb3lzdGljayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvam95c3RpY2suanMiKCkgewogICAgSm95c3RpY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxN2EyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYyYTIgMiAwIDAgMCAyIDJoMTRhMiAyIDAgMCAwIDItMnYtMloiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxNXYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNVY5IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjYiLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2phcGFuZXNlLXllbi5qcwp2YXIgSmFwYW5lc2VZZW47CnZhciBpbml0X2phcGFuZXNlX3llbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvamFwYW5lc2UteWVuLmpzIigpIHsKICAgIEphcGFuZXNlWWVuID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOS41VjIxbTAtMTEuNUw2IDNtNiA2LjVMMTggMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE1aDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTFoMTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9rYW5iYW4uanMKdmFyIEthbmJhbjsKdmFyIGluaXRfa2FuYmFuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9rYW5iYW4uanMiKCkgewogICAgS2FuYmFuID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAzdjE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDN2OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAzdjE4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMva2F5YWsuanMKdmFyIEtheWFrOwp2YXIgaW5pdF9rYXlhayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMva2F5YWsuanMiKCkgewogICAgS2F5YWsgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxN2ExIDEgMCAwIDAtMSAxdjFhMiAyIDAgMSAwIDItMnoiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAuOTcgMy42MWEuNDUuNDUgMCAwIDAtLjU4LS41OEMxMC4yIDYuNiA2LjYgMTAuMiAzLjAzIDIwLjM5YS40NS40NSAwIDAgMCAuNTguNThDMTMuOCAxNy40IDE3LjQgMTMuOCAyMC45NyAzLjYxIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYuNzA3IDYuNzA3IDEwLjU4NiAxMC41ODYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyA1YTIgMiAwIDEgMC0yIDJoMWExIDEgMCAwIDAgMS0xeiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2tleS1zcXVhcmUuanMKdmFyIEtleVNxdWFyZTsKdmFyIGluaXRfa2V5X3NxdWFyZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMva2V5LXNxdWFyZS5qcyIoKSB7CiAgICBLZXlTcXVhcmUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMi40IDIuN2EyLjUgMi41IDAgMCAxIDMuNCAwbDUuNSA1LjVhMi41IDIuNSAwIDAgMSAwIDMuNGwtMy43IDMuN2EyLjUgMi41IDAgMCAxLTMuNCAwTDguNyA5LjhhMi41IDIuNSAwIDAgMSAwLTMuNHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgNyAzIDMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtOS40IDEwLjYtNi44MTQgNi44MTRBMiAyIDAgMCAwIDIgMTguODI4VjIxYTEgMSAwIDAgMCAxIDFoM2ExIDEgMCAwIDAgMS0xdi0xYTEgMSAwIDAgMSAxLTFoMWExIDEgMCAwIDAgMS0xdi0xYTEgMSAwIDAgMSAxLTFoLjE3MmEyIDIgMCAwIDAgMS40MTQtLjU4NmwuODE0LS44MTQiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9rZXktcm91bmQuanMKdmFyIEtleVJvdW5kOwp2YXIgaW5pdF9rZXlfcm91bmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2tleS1yb3VuZC5qcyIoKSB7CiAgICBLZXlSb3VuZCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuNTg2IDE3LjQxNEEyIDIgMCAwIDAgMiAxOC44MjhWMjFhMSAxIDAgMCAwIDEgMWgzYTEgMSAwIDAgMCAxLTF2LTFhMSAxIDAgMCAxIDEtMWgxYTEgMSAwIDAgMCAxLTF2LTFhMSAxIDAgMCAxIDEtMWguMTcyYTIgMiAwIDAgMCAxLjQxNC0uNTg2bC44MTQtLjgxNGE2LjUgNi41IDAgMSAwLTQtNHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNi41IiwgY3k6ICI3LjUiLCByOiAiLjUiLCBmaWxsOiAiY3VycmVudENvbG9yIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMva2V5LmpzCnZhciBLZXkyOwp2YXIgaW5pdF9rZXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2tleS5qcyIoKSB7CiAgICBLZXkyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUuNSA3LjUgMi4zIDIuM2ExIDEgMCAwIDAgMS40IDBsMi4xLTIuMWExIDEgMCAwIDAgMC0xLjRMMTkgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAyLTkuNiA5LjYiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI3LjUiLCBjeTogIjE1LjUiLCByOiAiNS41IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMva2V5Ym9hcmQtb2ZmLmpzCnZhciBLZXlib2FyZE9mZjsKdmFyIGluaXRfa2V5Ym9hcmRfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9rZXlib2FyZC1vZmYuanMiKCkgewogICAgS2V5Ym9hcmRPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0gMjAgNCBBMiAyIDAgMCAxIDIyIDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNIDIyIDYgTCAyMiAxNi40MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0gNyAxNiBMIDE2IDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTSA5LjY5IDQgTCAyMCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDhoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDhoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAyMEg0YTIgMiAwIDAgMS0yLTJWNmEyIDIgMCAwIDEgMi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgOGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmguMDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9rZXlib2FyZC5qcwp2YXIgS2V5Ym9hcmQyOwp2YXIgaW5pdF9rZXlib2FyZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMva2V5Ym9hcmQuanMiKCkgewogICAgS2V5Ym9hcmQyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDhoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEyaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA4aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDhoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTZoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmguMDEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxNiIsIHg6ICIyIiwgeTogIjQiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9rZXlib2FyZC1tdXNpYy5qcwp2YXIgS2V5Ym9hcmRNdXNpYzsKdmFyIGluaXRfa2V5Ym9hcmRfbXVzaWMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2tleWJvYXJkLW11c2ljLmpzIigpIHsKICAgIEtleWJvYXJkTXVzaWMgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE2IiwgeDogIjIiLCB5OiAiNCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDhoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA4aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA4aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEyaDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDEydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTJ2NCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xhbXAtY2VpbGluZy5qcwp2YXIgTGFtcENlaWxpbmc7CnZhciBpbml0X2xhbXBfY2VpbGluZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGFtcC1jZWlsaW5nLmpzIigpIHsKICAgIExhbXBDZWlsaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0LjgyOSAxNS45OThhMyAzIDAgMSAxLTUuNjU4IDAiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAuOTIgMTQuNjA2QTEgMSAwIDAgMSAyMCAxNkg0YTEgMSAwIDAgMS0uOTItMS4zOTRsMy03QTEgMSAwIDAgMSA3IDdoMTBhMSAxIDAgMCAxIC45Mi42MDZ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGFtcC1kZXNrLmpzCnZhciBMYW1wRGVzazsKdmFyIGluaXRfbGFtcF9kZXNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYW1wLWRlc2suanMiKCkgewogICAgTGFtcERlc2sgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMC4yOTMgMi4yOTNhMSAxIDAgMCAxIDEuNDE0IDBsMi41IDIuNSA1Ljk5NCAxLjIyN2ExIDEgMCAwIDEgLjUwNiAxLjY4N2wtNyA3YTEgMSAwIDAgMS0xLjY4Ny0uNTA2bC0xLjIyNy01Ljk5NC0yLjUtMi41YTEgMSAwIDAgMSAwLTEuNDE0eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC4yMDcgNC43OTMtMy40MTQgMy40MTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAyMGEyIDIgMCAwIDEgMi0yaDRhMiAyIDAgMCAxIDIgMnYxYTEgMSAwIDAgMS0xIDFINGExIDEgMCAwIDEtMS0xeiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05LjA4NiA2LjUtNC43OTMgNC43OTNhMSAxIDAgMCAwLS4xOCAxLjE3TDcgMTgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYW1wLWZsb29yLmpzCnZhciBMYW1wRmxvb3I7CnZhciBpbml0X2xhbXBfZmxvb3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xhbXAtZmxvb3IuanMiKCkgewogICAgTGFtcEZsb29yID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTB2MTIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTcuOTI5IDcuNjI5QTEgMSAwIDAgMSAxNyA5SDdhMSAxIDAgMCAxLS45MjgtMS4zNzFsMi01QTEgMSAwIDAgMSA5IDJoNmExIDEgMCAwIDEgLjkyOC42Mjl6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMjJoNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xhbXAtd2FsbC1kb3duLmpzCnZhciBMYW1wV2FsbERvd247CnZhciBpbml0X2xhbXBfd2FsbF9kb3duID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYW1wLXdhbGwtZG93bi5qcyIoKSB7CiAgICBMYW1wV2FsbERvd24gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOS45MjkgMTguNjI5QTEgMSAwIDAgMSAxOSAyMEg5YTEgMSAwIDAgMS0uOTI4LTEuMzcxbDItNUExIDEgMCAwIDEgMTEgMTNoNmExIDEgMCAwIDEgLjkyOC42Mjl6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgM2EyIDIgMCAwIDEgMiAydjJhMiAyIDAgMCAxLTIgMkg1YTEgMSAwIDAgMS0xLTFWNGExIDEgMCAwIDEgMS0xeiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDZoNGEyIDIgMCAwIDEgMiAydjUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYW1wLXdhbGwtdXAuanMKdmFyIExhbXBXYWxsVXA7CnZhciBpbml0X2xhbXBfd2FsbF91cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGFtcC13YWxsLXVwLmpzIigpIHsKICAgIExhbXBXYWxsVXAgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOS45MjkgOS42MjlBMSAxIDAgMCAxIDE5IDExSDlhMSAxIDAgMCAxLS45MjgtMS4zNzFsMi01QTEgMSAwIDAgMSAxMSA0aDZhMSAxIDAgMCAxIC45MjguNjI5eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE1YTIgMiAwIDAgMSAyIDJ2MmEyIDIgMCAwIDEtMiAySDVhMSAxIDAgMCAxLTEtMXYtNGExIDEgMCAwIDEgMS0xeiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE4aDRhMiAyIDAgMCAwIDItMnYtNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xhbmQtcGxvdC5qcwp2YXIgTGFuZFBsb3Q7CnZhciBpbml0X2xhbmRfcGxvdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGFuZC1wbG90LmpzIigpIHsKICAgIExhbmRQbG90ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIgOCA2LTMtNi0zdjEwIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTggMTEuOTktNS41IDMuMTRhMSAxIDAgMCAwIDAgMS43NGw4LjUgNC44NmEyIDIgMCAwIDAgMiAwbDguNS00Ljg2YTEgMSAwIDAgMCAwLTEuNzRMMTYgMTIiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNi40OSAxMi44NSAxMS4wMiA2LjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuNTEgMTIuODUgNi41IDE5LjE1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGFtcC5qcwp2YXIgTGFtcDsKdmFyIGluaXRfbGFtcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGFtcC5qcyIoKSB7CiAgICBMYW1wID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJ2NiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00LjA3NyAxMC42MTVBMSAxIDAgMCAwIDUgMTJoMTRhMSAxIDAgMCAwIC45MjMtMS4zODVsLTMuMDc3LTcuMzg0QTIgMiAwIDAgMCAxNSAySDlhMiAyIDAgMCAwLTEuODQ2IDEuMjNaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjBhMiAyIDAgMCAxIDItMmg0YTIgMiAwIDAgMSAyIDJ2MWExIDEgMCAwIDEtMSAxSDlhMSAxIDAgMCAxLTEtMXoiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYW5kbWFyay5qcwp2YXIgTGFuZG1hcms7CnZhciBpbml0X2xhbmRtYXJrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYW5kbWFyay5qcyIoKSB7CiAgICBMYW5kbWFyayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE4di03IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTExLjEyIDIuMTk4YTIgMiAwIDAgMSAxLjc2LjAwNmw3Ljg2NiAzLjg0N2MuNDc2LjIzMy4zMS45NDktLjIyLjk0OUgzLjQ3NGMtLjUzIDAtLjY5NS0uNzE2LS4yMi0uOTQ5eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxOHYtNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxOHYtNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDIyaDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTh2LTciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYW5ndWFnZXMuanMKdmFyIExhbmd1YWdlczsKdmFyIGluaXRfbGFuZ3VhZ2VzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYW5ndWFnZXMuanMiKCkgewogICAgTGFuZ3VhZ2VzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtNSA4IDYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm00IDE0IDYtNiAyLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA1aDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMmgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDIyLTUtMTAtNSAxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxOGg2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGFwdG9wLW1pbmltYWwtY2hlY2suanMKdmFyIExhcHRvcE1pbmltYWxDaGVjazsKdmFyIGluaXRfbGFwdG9wX21pbmltYWxfY2hlY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xhcHRvcC1taW5pbWFsLWNoZWNrLmpzIigpIHsKICAgIExhcHRvcE1pbmltYWxDaGVjayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjBoMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxMCAyIDIgNC00IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICI0Iiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjEyIiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGFwdG9wLW1pbmltYWwuanMKdmFyIExhcHRvcE1pbmltYWw7CnZhciBpbml0X2xhcHRvcF9taW5pbWFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYXB0b3AtbWluaW1hbC5qcyIoKSB7CiAgICBMYXB0b3BNaW5pbWFsID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxMiIsIHg6ICIzIiwgeTogIjQiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMiIsIHgyOiAiMjIiLCB5MTogIjIwIiwgeTI6ICIyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xhcHRvcC5qcwp2YXIgTGFwdG9wOwp2YXIgaW5pdF9sYXB0b3AgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xhcHRvcC5qcyIoKSB7CiAgICBMYXB0b3AgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOCA1YTIgMiAwIDAgMSAyIDJ2OC41MjZhMiAyIDAgMCAwIC4yMTIuODk3bDEuMDY4IDIuMTI3YTEgMSAwIDAgMS0uOSAxLjQ1SDMuNjJhMSAxIDAgMCAxLS45LTEuNDVsMS4wNjgtMi4xMjdBMiAyIDAgMCAwIDQgMTUuNTI2VjdhMiAyIDAgMCAxIDItMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAuMDU0IDE1Ljk4N0gzLjk0NiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xhc3NvLXNlbGVjdC5qcwp2YXIgTGFzc29TZWxlY3Q7CnZhciBpbml0X2xhc3NvX3NlbGVjdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGFzc28tc2VsZWN0LmpzIigpIHsKICAgIExhc3NvU2VsZWN0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMmE1IDUgMCAwIDEtMi00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTYuOTNjLjk2LjQzIDEuOTYuNzQgMi45OS45MSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTMuMzQgMTRBNi44IDYuOCAwIDAgMSAyIDEwYzAtNC40MiA0LjQ4LTggMTAtOHMxMCAzLjU4IDEwIDhhNy4xOSA3LjE5IDAgMCAxLS4zMyAyIiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE4YTIgMiAwIDEgMCAwLTQgMiAyIDAgMCAwIDAgNHoiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTQuMzMgMjJoLS4wOWEuMzUuMzUgMCAwIDEtLjI0LS4zMnYtMTBhLjM0LjM0IDAgMCAxIC4zMy0uMzRjLjA4IDAgLjE1LjAzLjIxLjA4bDcuMzQgNmEuMzMuMzMgMCAwIDEtLjIxLjU5aC00LjQ5bC0yLjU3IDMuODVhLjM1LjM1IDAgMCAxLS4yOC4xNHoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYXNzby5qcwp2YXIgTGFzc287CnZhciBpbml0X2xhc3NvID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYXNzby5qcyIoKSB7CiAgICBMYXNzbyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuNzA0IDE0LjQ2N2ExMCA4IDAgMSAxIDMuMTE1IDIuMzc1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjJhNSA1IDAgMCAxLTItMy45OTQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI1IiwgY3k6ICIxNiIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGF1Z2guanMKdmFyIExhdWdoOwp2YXIgaW5pdF9sYXVnaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGF1Z2guanMiKCkgewogICAgTGF1Z2ggPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxM2E2IDYgMCAwIDEtNiA1IDYgNiAwIDAgMS02LTVoMTJaIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjkiLCB4MjogIjkuMDEiLCB5MTogIjkiLCB5MjogIjkiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTUiLCB4MjogIjE1LjAxIiwgeTE6ICI5IiwgeTI6ICI5IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGF5ZXJzLTIuanMKdmFyIExheWVyczI7CnZhciBpbml0X2xheWVyc18yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYXllcnMtMi5qcyIoKSB7CiAgICBMYXllcnMyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTMgMTMuNzRhMiAyIDAgMCAxLTIgMEwyLjUgOC44N2ExIDEgMCAwIDEgMC0xLjc0TDExIDIuMjZhMiAyIDAgMCAxIDIgMGw4LjUgNC44N2ExIDEgMCAwIDEgMCAxLjc0eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0yMCAxNC4yODUgMS41Ljg0NWExIDEgMCAwIDEgMCAxLjc0TDEzIDIxLjc0YTIgMiAwIDAgMS0yIDBsLTguNS00Ljg3YTEgMSAwIDAgMSAwLTEuNzRsMS41LS44NDUiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYXllcnMtcGx1cy5qcwp2YXIgTGF5ZXJzUGx1czsKdmFyIGluaXRfbGF5ZXJzX3BsdXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xheWVycy1wbHVzLmpzIigpIHsKICAgIExheWVyc1BsdXMgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMi44MyAyLjE4YTIgMiAwIDAgMC0xLjY2IDBMMi42IDYuMDhhMSAxIDAgMCAwIDAgMS44M2w4LjU4IDMuOTFhMiAyIDAgMCAwIC44My4xOCAyIDIgMCAwIDAgLjgzLS4xOGw4LjU4LTMuOWExIDEgMCAwIDAgMC0xLjgzMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTdoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxNHY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJhMSAxIDAgMCAwIC41OC45MWw4LjYgMy45MWEyIDIgMCAwIDAgLjgyNS4xNzgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxN2ExIDEgMCAwIDAgLjU4LjkxbDguNiAzLjkxYTIgMiAwIDAgMCAxLjY1IDBsMi4xMTYtLjk2MiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xheWVycy5qcwp2YXIgTGF5ZXJzMzsKdmFyIGluaXRfbGF5ZXJzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYXllcnMuanMiKCkgewogICAgTGF5ZXJzMyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyLjgzIDIuMThhMiAyIDAgMCAwLTEuNjYgMEwyLjYgNi4wOGExIDEgMCAwIDAgMCAxLjgzbDguNTggMy45MWEyIDIgMCAwIDAgMS42NiAwbDguNTgtMy45YTEgMSAwIDAgMCAwLTEuODN6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJhMSAxIDAgMCAwIC41OC45MWw4LjYgMy45MWEyIDIgMCAwIDAgMS42NSAwbDguNTgtMy45QTEgMSAwIDAgMCAyMiAxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE3YTEgMSAwIDAgMCAuNTguOTFsOC42IDMuOTFhMiAyIDAgMCAwIDEuNjUgMGw4LjU4LTMuOUExIDEgMCAwIDAgMjIgMTciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYXlvdXQtZ3JpZC5qcwp2YXIgTGF5b3V0R3JpZDsKdmFyIGluaXRfbGF5b3V0X2dyaWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xheW91dC1ncmlkLmpzIigpIHsKICAgIExheW91dEdyaWQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiNyIsIHg6ICIzIiwgeTogIjMiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNyIsIGhlaWdodDogIjciLCB4OiAiMTQiLCB5OiAiMyIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiNyIsIHg6ICIxNCIsIHk6ICIxNCIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiNyIsIHg6ICIzIiwgeTogIjE0Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGF5b3V0LWRhc2hib2FyZC5qcwp2YXIgTGF5b3V0RGFzaGJvYXJkOwp2YXIgaW5pdF9sYXlvdXRfZGFzaGJvYXJkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYXlvdXQtZGFzaGJvYXJkLmpzIigpIHsKICAgIExheW91dERhc2hib2FyZCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjciLCBoZWlnaHQ6ICI5IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiNSIsIHg6ICIxNCIsIHk6ICIzIiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjciLCBoZWlnaHQ6ICI5IiwgeDogIjE0IiwgeTogIjEyIiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjciLCBoZWlnaHQ6ICI1IiwgeDogIjMiLCB5OiAiMTYiLCByeDogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYXlvdXQtbGlzdC5qcwp2YXIgTGF5b3V0TGlzdDsKdmFyIGluaXRfbGF5b3V0X2xpc3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xheW91dC1saXN0LmpzIigpIHsKICAgIExheW91dExpc3QgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiNyIsIHg6ICIzIiwgeTogIjMiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNyIsIGhlaWdodDogIjciLCB4OiAiMyIsIHk6ICIxNCIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA0aDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgOWg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE1aDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjBoNyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xheW91dC1wYW5lbC1sZWZ0LmpzCnZhciBMYXlvdXRQYW5lbExlZnQ7CnZhciBpbml0X2xheW91dF9wYW5lbF9sZWZ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYXlvdXQtcGFuZWwtbGVmdC5qcyIoKSB7CiAgICBMYXlvdXRQYW5lbExlZnQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjciLCBoZWlnaHQ6ICI3IiwgeDogIjE0IiwgeTogIjMiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNyIsIGhlaWdodDogIjciLCB4OiAiMTQiLCB5OiAiMTQiLCByeDogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYXlvdXQtcGFuZWwtdG9wLmpzCnZhciBMYXlvdXRQYW5lbFRvcDsKdmFyIGluaXRfbGF5b3V0X3BhbmVsX3RvcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGF5b3V0LXBhbmVsLXRvcC5qcyIoKSB7CiAgICBMYXlvdXRQYW5lbFRvcCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiNyIsIHg6ICIzIiwgeTogIjMiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNyIsIGhlaWdodDogIjciLCB4OiAiMyIsIHk6ICIxNCIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI3IiwgaGVpZ2h0OiAiNyIsIHg6ICIxNCIsIHk6ICIxNCIsIHJ4OiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xheW91dC10ZW1wbGF0ZS5qcwp2YXIgTGF5b3V0VGVtcGxhdGU7CnZhciBpbml0X2xheW91dF90ZW1wbGF0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGF5b3V0LXRlbXBsYXRlLmpzIigpIHsKICAgIExheW91dFRlbXBsYXRlID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICI3IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI5IiwgaGVpZ2h0OiAiNyIsIHg6ICIzIiwgeTogIjE0Iiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjUiLCBoZWlnaHQ6ICI3IiwgeDogIjE2IiwgeTogIjE0Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGVhZnktZ3JlZW4uanMKdmFyIExlYWZ5R3JlZW47CnZhciBpbml0X2xlYWZ5X2dyZWVuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sZWFmeS1ncmVlbi5qcyIoKSB7CiAgICBMZWFmeUdyZWVuID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMiAyMmMxLjI1LS45ODcgMi4yNy0xLjk3NSAzLjktMi4yYTUuNTYgNS41NiAwIDAgMSAzLjggMS41IDQgNCAwIDAgMCA2LjE4Ny0yLjM1MyAzLjUgMy41IDAgMCAwIDMuNjktNS4xMTZBMy41IDMuNSAwIDAgMCAyMC45NSA4IDMuNSAzLjUgMCAxIDAgMTYgMy4wNWEzLjUgMy41IDAgMCAwLTUuODMxIDEuMzczIDMuNSAzLjUgMCAwIDAtNS4xMTYgMy42OSA0IDQgMCAwIDAtMi4zNDggNi4xNTVDMy40OTkgMTUuNDIgNC40MDkgMTYuNzEyIDQuMiAxOC4xIDMuOTI2IDE5Ljc0MyAzLjAxNCAyMC43MzIgMiAyMiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIyIDE3IDciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sZWN0ZXJuLmpzCnZhciBMZWN0ZXJuOwp2YXIgaW5pdF9sZWN0ZXJuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sZWN0ZXJuLmpzIigpIHsKICAgIExlY3Rlcm4gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNiAxMmgzYTIgMiAwIDAgMCAxLjkwMi0xLjM4bDEuMDU2LTMuMzMzQTEgMSAwIDAgMCAyMSA2SDNhMSAxIDAgMCAwLS45NTggMS4yODdsMS4wNTYgMy4zMzRBMiAyIDAgMCAwIDUgMTJoMyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA2VjNhMSAxIDAgMCAwLTEtMWgtMyIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiMTIiLCB4OiAiOCIsIHk6ICIxMCIsIHJ4OiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xlYWYuanMKdmFyIExlYWY7CnZhciBpbml0X2xlYWYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xlYWYuanMiKCkgewogICAgTGVhZiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTEgMjBBNyA3IDAgMCAxIDkuOCA2LjFDMTUuNSA1IDE3IDQuNDggMTkgMmMxIDIgMiA0LjE4IDIgOCAwIDUuNS00Ljc4IDEwLTEwIDEwWiIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMWMwLTMgMS44NS01LjM2IDUuMDgtNkM5LjUgMTQuNTIgMTIgMTMgMTMgMTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sZW5zLWNvbmNhdmUuanMKdmFyIExlbnNDb25jYXZlOwp2YXIgaW5pdF9sZW5zX2NvbmNhdmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xlbnMtY29uY2F2ZS5qcyIoKSB7CiAgICBMZW5zQ29uY2F2ZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTcgMmExIDEgMCAwIDAtLjggMS42IDE0IDE0IDAgMCAxIDAgMTYuOEExIDEgMCAwIDAgNyAyMmgxMGExIDEgMCAwIDAgLjgtMS42IDE0IDE0IDAgMCAxIDAtMTYuOEExIDEgMCAwIDAgMTcgMnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sZW5zLWNvbnZleC5qcwp2YXIgTGVuc0NvbnZleDsKdmFyIGluaXRfbGVuc19jb252ZXggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xlbnMtY29udmV4LmpzIigpIHsKICAgIExlbnNDb252ZXggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMy40MzMgMmExIDEgMCAwIDEgLjgyNC40NDggMTggMTggMCAwIDEgMCAxOS4xMDQgMSAxIDAgMCAxLS44MjQuNDQ4aC0yLjg2NmExIDEgMCAwIDEtLjgyNC0uNDQ4IDE4IDE4IDAgMCAxIDAtMTkuMTA0QTEgMSAwIDAgMSAxMC41NjcgMnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saWJyYXJ5LWJpZy5qcwp2YXIgTGlicmFyeUJpZzsKdmFyIGluaXRfbGlicmFyeV9iaWcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpYnJhcnktYmlnLmpzIigpIHsKICAgIExpYnJhcnlCaWcgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgM3YxOCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMC40IDE4LjljLjIuNS0uMSAxLjEtLjYgMS4zbC0xLjkuN2MtLjUuMi0xLjEtLjEtMS4zLS42TDExLjEgNS4xYy0uMi0uNS4xLTEuMS42LTEuM2wxLjktLjdjLjUtLjIgMS4xLjEgMS4zLjZaIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlicmFyeS5qcwp2YXIgTGlicmFyeTI7CnZhciBpbml0X2xpYnJhcnkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpYnJhcnkuanMiKCkgewogICAgTGlicmFyeTIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiA2IDQgMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnYxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDh2MTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA0djE2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlmZS1idW95LmpzCnZhciBMaWZlQnVveTsKdmFyIGluaXRfbGlmZV9idW95ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saWZlLWJ1b3kuanMiKCkgewogICAgTGlmZUJ1b3kgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm00LjkzIDQuOTMgNC4yNCA0LjI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0LjgzIDkuMTcgNC4yNC00LjI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0LjgzIDE0LjgzIDQuMjQgNC4yNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05LjE3IDE0LjgzLTQuMjQgNC4yNCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICI0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlnYXR1cmUuanMKdmFyIExpZ2F0dXJlOwp2YXIgaW5pdF9saWdhdHVyZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlnYXR1cmUuanMiKCkgewogICAgTGlnYXR1cmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxMmgydjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjBoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEyaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAyMGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjBWOGE0IDQgMCAwIDEgNy40NjQtMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpZ2h0YnVsYi5qcwp2YXIgTGlnaHRidWxiOwp2YXIgaW5pdF9saWdodGJ1bGIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpZ2h0YnVsYi5qcyIoKSB7CiAgICBMaWdodGJ1bGIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNSAxNGMuMi0xIC43LTEuNyAxLjUtMi41IDEtLjkgMS41LTIuMiAxLjUtMy41QTYgNiAwIDAgMCA2IDhjMCAxIC4yIDIuMiAxLjUgMy41LjcuNyAxLjMgMS41IDEuNSAyLjUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxOGg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDIyaDQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saW5lLWRvdC1yaWdodC1ob3Jpem9udGFsLmpzCnZhciBMaW5lRG90UmlnaHRIb3Jpem9udGFsOwp2YXIgaW5pdF9saW5lX2RvdF9yaWdodF9ob3Jpem9udGFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saW5lLWRvdC1yaWdodC1ob3Jpem9udGFsLmpzIigpIHsKICAgIExpbmVEb3RSaWdodEhvcml6b250YWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0gMyAxMiBMIDE1IDEyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjEyIiwgcjogIjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saWdodGJ1bGItb2ZmLmpzCnZhciBMaWdodGJ1bGJPZmY7CnZhciBpbml0X2xpZ2h0YnVsYl9vZmYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpZ2h0YnVsYi1vZmYuanMiKCkgewogICAgTGlnaHRidWxiT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYuOCAxMS4yYy44LS45IDEuMi0yIDEuMi0zLjJhNiA2IDAgMCAwLTkuMy01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjMgNi4zYTQuNjcgNC42NyAwIDAgMCAxLjIgNS4yYy43LjcgMS4zIDEuNSAxLjUgMi41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMThoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAyMmg0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGluZS1zcXVpZ2dsZS5qcwp2YXIgTGluZVNxdWlnZ2xlOwp2YXIgaW5pdF9saW5lX3NxdWlnZ2xlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saW5lLXNxdWlnZ2xlLmpzIigpIHsKICAgIExpbmVTcXVpZ2dsZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNNyAzLjVjNS0yIDcgMi41IDMgNEMxLjUgMTAgMiAxNSA1IDE2YzUgMiA5LTEwIDE0LTdzLjUgMTMuNS00IDEyYy01LTIuNS41LTExIDYtMiIgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saW5rLTItb2ZmLmpzCnZhciBMaW5rMk9mZjsKdmFyIGluaXRfbGlua18yX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGluay0yLW9mZi5qcyIoKSB7CiAgICBMaW5rMk9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTdIN0E1IDUgMCAwIDEgNyA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDdoMmE1IDUgMCAwIDEgNCA4IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjgiLCB4MjogIjEyIiwgeTE6ICIxMiIsIHkyOiAiMTIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMiIsIHgyOiAiMjIiLCB5MTogIjIiLCB5MjogIjIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGluay0yLmpzCnZhciBMaW5rMjsKdmFyIGluaXRfbGlua18yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saW5rLTIuanMiKCkgewogICAgTGluazIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE3SDdBNSA1IDAgMCAxIDcgN2gyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDdoMmE1IDUgMCAxIDEgMCAxMGgtMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI4IiwgeDI6ICIxNiIsIHkxOiAiMTIiLCB5MjogIjEyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGluay5qcwp2YXIgTGluazsKdmFyIGluaXRfbGluazQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpbmsuanMiKCkgewogICAgTGluayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEzYTUgNSAwIDAgMCA3LjU0LjU0bDMtM2E1IDUgMCAwIDAtNy4wNy03LjA3bC0xLjcyIDEuNzEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTFhNSA1IDAgMCAwLTcuNTQtLjU0bC0zIDNhNSA1IDAgMCAwIDcuMDcgNy4wN2wxLjcxLTEuNzEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saW5rZWRpbi5qcwp2YXIgTGlua2VkaW47CnZhciBpbml0X2xpbmtlZGluID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saW5rZWRpbi5qcyIoKSB7CiAgICBMaW5rZWRpbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDhhNiA2IDAgMCAxIDYgNnY3aC00di03YTIgMiAwIDAgMC0yLTIgMiAyIDAgMCAwLTIgMnY3aC00di03YTYgNiAwIDAgMSA2LTZ6IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjQiLCBoZWlnaHQ6ICIxMiIsIHg6ICIyIiwgeTogIjkiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI0IiwgY3k6ICI0IiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LWNoZWNrLmpzCnZhciBMaXN0Q2hlY2s7CnZhciBpbml0X2xpc3RfY2hlY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QtY2hlY2suanMiKCkgewogICAgTGlzdENoZWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNUgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEySDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTlIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxOCAyIDIgNC00IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC1jaGVja3MuanMKdmFyIExpc3RDaGVja3M7CnZhciBpbml0X2xpc3RfY2hlY2tzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LWNoZWNrcy5qcyIoKSB7CiAgICBMaXN0Q2hlY2tzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgNWg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDEyaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMTloOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDE3IDIgMiA0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMyA3IDIgMiA0LTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LWNoZXZyb25zLWRvd24tdXAuanMKdmFyIExpc3RDaGV2cm9uc0Rvd25VcDsKdmFyIGluaXRfbGlzdF9jaGV2cm9uc19kb3duX3VwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LWNoZXZyb25zLWRvd24tdXAuanMiKCkgewogICAgTGlzdENoZXZyb25zRG93blVwID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA1aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTloOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA1IDMgMyAzLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgMTkgMy0zIDMgMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QtY29sbGFwc2UuanMKdmFyIExpc3RDb2xsYXBzZTsKdmFyIGluaXRfbGlzdF9jb2xsYXBzZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC1jb2xsYXBzZS5qcyIoKSB7CiAgICBMaXN0Q29sbGFwc2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA1aDExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEyaDExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE5aDExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgMTAgMy0zLTMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDIwIDMtMy0zLTMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LWNoZXZyb25zLXVwLWRvd24uanMKdmFyIExpc3RDaGV2cm9uc1VwRG93bjsKdmFyIGluaXRfbGlzdF9jaGV2cm9uc191cF9kb3duID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LWNoZXZyb25zLXVwLWRvd24uanMiKCkgewogICAgTGlzdENoZXZyb25zVXBEb3duID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA1aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTloOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA4IDMtMyAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgMTYgMyAzIDMtMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QtZW5kLmpzCnZhciBMaXN0RW5kOwp2YXIgaW5pdF9saXN0X2VuZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC1lbmQuanMiKCkgewogICAgTGlzdEVuZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDVIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMkgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTlIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAxNi0zIDMgMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDV2MTJhMiAyIDAgMCAxLTIgMmgtNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QtZmlsdGVyLXBsdXMuanMKdmFyIExpc3RGaWx0ZXJQbHVzOwp2YXIgaW5pdF9saXN0X2ZpbHRlcl9wbHVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LWZpbHRlci1wbHVzLmpzIigpIHsKICAgIExpc3RGaWx0ZXJQbHVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNUgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTJoMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxOWg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDVoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSA4VjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LWZpbHRlci5qcwp2YXIgTGlzdEZpbHRlcjsKdmFyIGluaXRfbGlzdF9maWx0ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QtZmlsdGVyLmpzIigpIHsKICAgIExpc3RGaWx0ZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDVoMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxMmgxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE5aDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LWluZGVudC1kZWNyZWFzZS5qcwp2YXIgTGlzdEluZGVudERlY3JlYXNlOwp2YXIgaW5pdF9saXN0X2luZGVudF9kZWNyZWFzZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC1pbmRlbnQtZGVjcmVhc2UuanMiKCkgewogICAgTGlzdEluZGVudERlY3JlYXNlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgNUgxMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMkgxMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxOUgxMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03IDgtNCA0IDQgNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QtaW5kZW50LWluY3JlYXNlLmpzCnZhciBMaXN0SW5kZW50SW5jcmVhc2U7CnZhciBpbml0X2xpc3RfaW5kZW50X2luY3JlYXNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LWluZGVudC1pbmNyZWFzZS5qcyIoKSB7CiAgICBMaXN0SW5kZW50SW5jcmVhc2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA1SDExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEySDExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE5SDExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgOCA0IDQtNCA0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC1tdXNpYy5qcwp2YXIgTGlzdE11c2ljOwp2YXIgaW5pdF9saXN0X211c2ljID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LW11c2ljLmpzIigpIHsKICAgIExpc3RNdXNpYyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDVIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxMkgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDE5SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTZWNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICIxNiIsIHI6ICIzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC1taW51cy5qcwp2YXIgTGlzdE1pbnVzOwp2YXIgaW5pdF9saXN0X21pbnVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LW1pbnVzLmpzIigpIHsKICAgIExpc3RNaW51cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDVIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxMkgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE5SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTJoLTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LW9yZGVyZWQuanMKdmFyIExpc3RPcmRlcmVkOwp2YXIgaW5pdF9saXN0X29yZGVyZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3Qtb3JkZXJlZC5qcyIoKSB7CiAgICBMaXN0T3JkZXJlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDVoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTJoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTloMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA0aDF2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDloMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjUgMjBIMy40YzAtMSAyLjYtMS45MjUgMi42LTMuNWExLjUgMS41IDAgMCAwLTIuNi0xLjAyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC1yZXN0YXJ0LmpzCnZhciBMaXN0UmVzdGFydDsKdmFyIGluaXRfbGlzdF9yZXN0YXJ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LXJlc3RhcnQuanMiKCkgewogICAgTGlzdFJlc3RhcnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA1SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMkgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTlIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOGE1IDUgMCAwIDAgOS0zIDQuNSA0LjUgMCAwIDAtNC41LTQuNWMtMS4zMyAwLTIuNTQuNTQtMy40MSAxLjQxTDExIDE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDEwdjRoNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QtcGx1cy5qcwp2YXIgTGlzdFBsdXM7CnZhciBpbml0X2xpc3RfcGx1cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC1wbHVzLmpzIigpIHsKICAgIExpc3RQbHVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNUgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDEySDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTlIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA5djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTJoLTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LXN0YXJ0LmpzCnZhciBMaXN0U3RhcnQ7CnZhciBpbml0X2xpc3Rfc3RhcnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3Qtc3RhcnQuanMiKCkgewogICAgTGlzdFN0YXJ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA1aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmgxMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE5aDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDgtMy0zIDMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxOVY3YTIgMiAwIDAgMC0yLTJoLTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LXRvZG8uanMKdmFyIExpc3RUb2RvOwp2YXIgaW5pdF9saXN0X3RvZG8gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QtdG9kby5qcyIoKSB7CiAgICBMaXN0VG9kbyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDVoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDE5aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMyAxNyAyIDIgNC00IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICI0Iiwgd2lkdGg6ICI2IiwgaGVpZ2h0OiAiNiIsIHJ4OiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QtdHJlZS5qcwp2YXIgTGlzdFRyZWU7CnZhciBpbml0X2xpc3RfdHJlZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC10cmVlLmpzIigpIHsKICAgIExpc3RUcmVlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA1aDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDEyaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMTloOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEwYTIgMiAwIDAgMCAyIDJoMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDV2MTJhMiAyIDAgMCAwIDIgMmgzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC12aWRlby5qcwp2YXIgTGlzdFZpZGVvOwp2YXIgaW5pdF9saXN0X3ZpZGVvID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LXZpZGVvLmpzIigpIHsKICAgIExpc3RWaWRlbyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDVIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMkgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE5SDMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTUgMTIuMDAzYTEgMSAwIDAgMSAxLjUxNy0uODU5bDQuOTk3IDIuOTk3YTEgMSAwIDAgMSAwIDEuNzE4bC00Ljk5NyAyLjk5N2ExIDEgMCAwIDEtMS41MTctLjg2eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QteC5qcwp2YXIgTGlzdFg7CnZhciBpbml0X2xpc3RfeCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC14LmpzIigpIHsKICAgIExpc3RYID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNUgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDEySDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTlIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNS41IDkuNSA1IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAuNSA5LjUtNSA1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC5qcwp2YXIgTGlzdDsKdmFyIGluaXRfbGlzdDQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QuanMiKCkgewogICAgTGlzdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgNWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxOWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA1aDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJoMTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxOWgxMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xvYWRlci1jaXJjbGUuanMKdmFyIExvYWRlckNpcmNsZTsKdmFyIGluaXRfbG9hZGVyX2NpcmNsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbG9hZGVyLWNpcmNsZS5qcyIoKSB7CiAgICBMb2FkZXJDaXJjbGUgPSBbWyJwYXRoIiwgeyBkOiAiTTIxIDEyYTkgOSAwIDEgMS02LjIxOS04LjU2IiB9XV07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xvYWRlci1waW53aGVlbC5qcwp2YXIgTG9hZGVyUGlud2hlZWw7CnZhciBpbml0X2xvYWRlcl9waW53aGVlbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbG9hZGVyLXBpbndoZWVsLmpzIigpIHsKICAgIExvYWRlclBpbndoZWVsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTJhMSAxIDAgMCAxLTEwIDAgMSAxIDAgMCAwLTEwIDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMC43YTEgMSAwIDEgMSA1LTguNyAxIDEgMCAxIDAgNS04LjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAzLjNhMSAxIDAgMSAxIDUgOC42IDEgMSAwIDEgMCA1IDguNiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xvYWRlci5qcwp2YXIgTG9hZGVyOwp2YXIgaW5pdF9sb2FkZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xvYWRlci5qcyIoKSB7CiAgICBMb2FkZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYuMiA3LjggMi45LTIuOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMmg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2LjIgMTYuMiAyLjkgMi45IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNC45IDE5LjEgMi45LTIuOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEyaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNC45IDQuOSAyLjkgMi45IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbG9jYXRlLWZpeGVkLmpzCnZhciBMb2NhdGVGaXhlZDsKdmFyIGluaXRfbG9jYXRlX2ZpeGVkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sb2NhdGUtZml4ZWQuanMiKCkgewogICAgTG9jYXRlRml4ZWQgPSBbCiAgICAgIFsibGluZSIsIHsgeDE6ICIyIiwgeDI6ICI1IiwgeTE6ICIxMiIsIHkyOiAiMTIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTkiLCB4MjogIjIyIiwgeTE6ICIxMiIsIHkyOiAiMTIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICIyIiwgeTI6ICI1IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEyIiwgeDI6ICIxMiIsIHkxOiAiMTkiLCB5MjogIjIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjciIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xvY2F0ZS1vZmYuanMKdmFyIExvY2F0ZU9mZjsKdmFyIGluaXRfbG9jYXRlX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbG9jYXRlLW9mZi5qcyIoKSB7CiAgICBMb2NhdGVPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOXYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOC44OSAxMy4yNGE3IDcgMCAwIDAtOC4xMy04LjEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDEyaDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03LjA1IDcuMDVhNyA3IDAgMCAwIDkuOSA5LjkiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sb2NhdGUuanMKdmFyIExvY2F0ZTsKdmFyIGluaXRfbG9jYXRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sb2NhdGUuanMiKCkgewogICAgTG9jYXRlID0gWwogICAgICBbImxpbmUiLCB7IHgxOiAiMiIsIHgyOiAiNSIsIHkxOiAiMTIiLCB5MjogIjEyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE5IiwgeDI6ICIyMiIsIHkxOiAiMTIiLCB5MjogIjEyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEyIiwgeDI6ICIxMiIsIHkxOiAiMiIsIHkyOiAiNSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTIiLCB5MTogIjE5IiwgeTI6ICIyMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICI3IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbG9jay1rZXlob2xlLW9wZW4uanMKdmFyIExvY2tLZXlob2xlT3BlbjsKdmFyIGluaXRfbG9ja19rZXlob2xlX29wZW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xvY2sta2V5aG9sZS1vcGVuLmpzIigpIHsKICAgIExvY2tLZXlob2xlT3BlbiA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjE2IiwgcjogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxMiIsIHg6ICIzIiwgeTogIjEwIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTBWN2E1IDUgMCAwIDEgOS4zMy0yLjUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sb2NrLWtleWhvbGUuanMKdmFyIExvY2tLZXlob2xlOwp2YXIgaW5pdF9sb2NrX2tleWhvbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xvY2sta2V5aG9sZS5qcyIoKSB7CiAgICBMb2NrS2V5aG9sZSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjE2IiwgcjogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIzIiwgeTogIjEwIiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjEyIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTBWN2E1IDUgMCAwIDEgMTAgMHYzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbG9jay1vcGVuLmpzCnZhciBMb2NrT3BlbjsKdmFyIGluaXRfbG9ja19vcGVuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sb2NrLW9wZW4uanMiKCkgewogICAgTG9ja09wZW4gPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjExIiwgeDogIjMiLCB5OiAiMTEiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMVY3YTUgNSAwIDAgMSA5LjktMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xvZy1pbi5qcwp2YXIgTG9nSW47CnZhciBpbml0X2xvZ19pbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbG9nLWluLmpzIigpIHsKICAgIExvZ0luID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgMTcgNS01LTUtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxMkgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDNoNGEyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDJoLTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sb2NrLmpzCnZhciBMb2NrOwp2YXIgaW5pdF9sb2NrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sb2NrLmpzIigpIHsKICAgIExvY2sgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjExIiwgeDogIjMiLCB5OiAiMTEiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMVY3YTUgNSAwIDAgMSAxMCAwdjQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sb2ctb3V0LmpzCnZhciBMb2dPdXQ7CnZhciBpbml0X2xvZ19vdXQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xvZy1vdXQuanMiKCkgewogICAgTG9nT3V0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTcgNS01LTUtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMkg5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMjFINWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmg0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbG9ncy5qcwp2YXIgTG9nczsKdmFyIGluaXRfbG9ncyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbG9ncy5qcyIoKSB7CiAgICBMb2dzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA1aDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTloMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDVoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEyaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxOWgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDVoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDE5aDgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sb2xsaXBvcC5qcwp2YXIgTG9sbGlwb3A7CnZhciBpbml0X2xvbGxpcG9wID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sb2xsaXBvcC5qcyIoKSB7CiAgICBMb2xsaXBvcCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTEiLCBjeTogIjExIiwgcjogIjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMjEtNC4zLTQuMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxMWEyIDIgMCAwIDAgNCAwIDQgNCAwIDAgMC04IDAgNiA2IDAgMCAwIDEyIDAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sdWdnYWdlLmpzCnZhciBMdWdnYWdlOwp2YXIgaW5pdF9sdWdnYWdlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9sdWdnYWdlLmpzIigpIHsKICAgIEx1Z2dhZ2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDIwYTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDEyYTIgMiAwIDAgMSAyIDJ2MTBhMiAyIDAgMCAxLTIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE4VjRhMiAyIDAgMCAxIDItMmg0YTIgMiAwIDAgMSAyIDJ2MTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMjBoNCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE2IiwgY3k6ICIyMCIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOCIsIGN5OiAiMjAiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hZ25ldC5qcwp2YXIgTWFnbmV0Owp2YXIgaW5pdF9tYWduZXQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hZ25ldC5qcyIoKSB7CiAgICBNYWduZXQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMiAxNSA0IDQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMi4zNTIgMTAuNjQ4YTEuMjA1IDEuMjA1IDAgMCAwIDAgMS43MDRsMi4yOTYgMi4yOTZhMS4yMDUgMS4yMDUgMCAwIDAgMS43MDQgMGw2LjAyOS02LjAyOWExIDEgMCAxIDEgMyAzbC02LjAyOSA2LjAyOWExLjIwNSAxLjIwNSAwIDAgMCAwIDEuNzA0bDIuMjk2IDIuMjk2YTEuMjA1IDEuMjA1IDAgMCAwIDEuNzA0IDBsNi4zNjUtNi4zNjdBMSAxIDAgMCAwIDguNzE2IDQuMjgyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01IDggNCA0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFpbC1jaGVjay5qcwp2YXIgTWFpbENoZWNrOwp2YXIgaW5pdF9tYWlsX2NoZWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYWlsLWNoZWNrLmpzIigpIHsKICAgIE1haWxDaGVjayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDEzVjZhMiAyIDAgMCAwLTItMkg0YTIgMiAwIDAgMC0yIDJ2MTJjMCAxLjEuOSAyIDIgMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDctOC45NyA1LjdhMS45NCAxLjk0IDAgMCAxLTIuMDYgMEwyIDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTkgMiAyIDQtNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21haWwtbWludXMuanMKdmFyIE1haWxNaW51czsKdmFyIGluaXRfbWFpbF9taW51cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFpbC1taW51cy5qcyIoKSB7CiAgICBNYWlsTWludXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxNVY2YTIgMiAwIDAgMC0yLTJINGEyIDIgMCAwIDAtMiAydjEyYzAgMS4xLjkgMiAyIDJoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiA3LTguOTcgNS43YTEuOTQgMS45NCAwIDAgMS0yLjA2IDBMMiA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE5aDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYWlsLW9wZW4uanMKdmFyIE1haWxPcGVuOwp2YXIgaW5pdF9tYWlsX29wZW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21haWwtb3Blbi5qcyIoKSB7CiAgICBNYWlsT3BlbiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxLjIgOC40Yy41LjM4LjguOTcuOCAxLjZ2MTBhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJWMTBhMiAyIDAgMCAxIC44LTEuNmw4LTZhMiAyIDAgMCAxIDIuNCAwbDggNloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgMTAtOC45NyA1LjdhMS45NCAxLjk0IDAgMCAxLTIuMDYgMEwyIDEwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFpbC1wbHVzLmpzCnZhciBNYWlsUGx1czsKdmFyIGluaXRfbWFpbF9wbHVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYWlsLXBsdXMuanMiKCkgewogICAgTWFpbFBsdXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxM1Y2YTIgMiAwIDAgMC0yLTJINGEyIDIgMCAwIDAtMiAydjEyYzAgMS4xLjkgMiAyIDJoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiA3LTguOTcgNS43YTEuOTQgMS45NCAwIDAgMS0yLjA2IDBMMiA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE2djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTloNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21haWwtcXVlc3Rpb24tbWFyay5qcwp2YXIgTWFpbFF1ZXN0aW9uTWFyazsKdmFyIGluaXRfbWFpbF9xdWVzdGlvbl9tYXJrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYWlsLXF1ZXN0aW9uLW1hcmsuanMiKCkgewogICAgTWFpbFF1ZXN0aW9uTWFyayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDEwLjVWNmEyIDIgMCAwIDAtMi0ySDRhMiAyIDAgMCAwLTIgMnYxMmMwIDEuMS45IDIgMiAyaDEyLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgNy04Ljk3IDUuN2ExLjk0IDEuOTQgMCAwIDEtMi4wNiAwTDIgNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxNS4yOGMuMi0uNC41LS44LjktMWEyLjEgMi4xIDAgMCAxIDIuNi40Yy4zLjQuNS44LjUgMS4zIDAgMS4zLTIgMi0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMjJ2LjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFpbC1zZWFyY2guanMKdmFyIE1haWxTZWFyY2g7CnZhciBpbml0X21haWxfc2VhcmNoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYWlsLXNlYXJjaC5qcyIoKSB7CiAgICBNYWlsU2VhcmNoID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTIuNVY2YTIgMiAwIDAgMC0yLTJINGEyIDIgMCAwIDAtMiAydjEyYzAgMS4xLjkgMiAyIDJoNy41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDctOC45NyA1LjdhMS45NCAxLjk0IDAgMCAxLTIuMDYgMEwyIDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMjFhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2WiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICIxOCIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDIyLTEuNS0xLjUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYWlsLXdhcm5pbmcuanMKdmFyIE1haWxXYXJuaW5nOwp2YXIgaW5pdF9tYWlsX3dhcm5pbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21haWwtd2FybmluZy5qcyIoKSB7CiAgICBNYWlsV2FybmluZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDEwLjVWNmEyIDIgMCAwIDAtMi0ySDRhMiAyIDAgMCAwLTIgMnYxMmMwIDEuMS45IDIgMiAyaDEyLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgNy04Ljk3IDUuN2ExLjk0IDEuOTQgMCAwIDEtMi4wNiAwTDIgNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxNHY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDIydi4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21haWwteC5qcwp2YXIgTWFpbFg7CnZhciBpbml0X21haWxfeCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFpbC14LmpzIigpIHsKICAgIE1haWxYID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTNWNmEyIDIgMCAwIDAtMi0ySDRhMiAyIDAgMCAwLTIgMnYxMmMwIDEuMS45IDIgMiAyaDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgNy04Ljk3IDUuN2ExLjk0IDEuOTQgMCAwIDEtMi4wNiAwTDIgNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAxNyA0IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMTctNCA0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFpbC5qcwp2YXIgTWFpbDsKdmFyIGluaXRfbWFpbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFpbC5qcyIoKSB7CiAgICBNYWlsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgNy04Ljk5MSA1LjcyN2EyIDIgMCAwIDEtMi4wMDkgMEwyIDciIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjQiLCB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTYiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYWlsYm94LmpzCnZhciBNYWlsYm94Owp2YXIgaW5pdF9tYWlsYm94ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYWlsYm94LmpzIigpIHsKICAgIE1haWxib3ggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxN2EyIDIgMCAwIDEtMiAySDRhMiAyIDAgMCAxLTItMlY5LjVDMiA3IDQgNSA2LjUgNUgxOGMyLjIgMCA0IDEuOCA0IDR2OFoiIH1dLAogICAgICBbInBvbHlsaW5lIiwgeyBwb2ludHM6ICIxNSw5IDE4LDkgMTgsMTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi41IDVDOSA1IDExIDcgMTEgOS41VjE3YTIgMiAwIDAgMS0yIDIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiNiIsIHgyOiAiNyIsIHkxOiAiMTAiLCB5MjogIjEwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFpbHMuanMKdmFyIE1haWxzOwp2YXIgaW5pdF9tYWlscyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFpbHMuanMiKCkgewogICAgTWFpbHMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxOWEyIDIgMCAwIDEtMiAySDRhMiAyIDAgMCAxLTItMnYtOGEyIDIgMCAwIDEgMS0xLjczMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiA1LjUtNi40MTkgNC4xNzlhMiAyIDAgMCAxLTIuMTYyIDBMNyA1LjUiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI3IiwgeTogIjMiLCB3aWR0aDogIjE1IiwgaGVpZ2h0OiAiMTIiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXAtbWludXMuanMKdmFyIE1hcE1pbnVzOwp2YXIgaW5pdF9tYXBfbWludXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcC1taW51cy5qcyIoKSB7CiAgICBNYXBNaW51cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTExIDE5LTEuMTA2LS41NTJhMiAyIDAgMCAwLTEuNzg4IDBsLTMuNjU5IDEuODNBMSAxIDAgMCAxIDMgMTkuMzgxVjYuNjE4YTEgMSAwIDAgMSAuNTUzLS44OTRsNC41NTMtMi4yNzdhMiAyIDAgMCAxIDEuNzg4IDBsNC4yMTIgMi4xMDZhMiAyIDAgMCAwIDEuNzg4IDBsMy42NTktMS44M0ExIDEgMCAwIDEgMjEgNC42MTlWMTQiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgNS43NjRWMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMThoLTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAzLjIzNnYxNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcC1waW4tY2hlY2staW5zaWRlLmpzCnZhciBNYXBQaW5DaGVja0luc2lkZTsKdmFyIGluaXRfbWFwX3Bpbl9jaGVja19pbnNpZGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcC1waW4tY2hlY2staW5zaWRlLmpzIigpIHsKICAgIE1hcFBpbkNoZWNrSW5zaWRlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMTBjMCA0Ljk5My01LjUzOSAxMC4xOTMtNy4zOTkgMTEuNzk5YTEgMSAwIDAgMS0xLjIwMiAwQzkuNTM5IDIwLjE5MyA0IDE0Ljk5MyA0IDEwYTggOCAwIDAgMSAxNiAwIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTAgMiAyIDQtNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcC1waW4taG91c2UuanMKdmFyIE1hcFBpbkhvdXNlOwp2YXIgaW5pdF9tYXBfcGluX2hvdXNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXAtcGluLWhvdXNlLmpzIigpIHsKICAgIE1hcFBpbkhvdXNlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTUgMjJhMSAxIDAgMCAxLTEtMXYtNGExIDEgMCAwIDEgLjQ0NS0uODMybDMtMmExIDEgMCAwIDEgMS4xMSAwbDMgMkExIDEgMCAwIDEgMjIgMTd2NGExIDEgMCAwIDEtMSAxeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMGE4IDggMCAwIDAtMTYgMGMwIDQuOTkzIDUuNTM5IDEwLjE5MyA3LjM5OSAxMS43OTlhMSAxIDAgMCAwIC42MDEuMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAyMnYtMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEwIiwgY3k6ICIxMCIsIHI6ICIzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFwLXBpbi1jaGVjay5qcwp2YXIgTWFwUGluQ2hlY2s7CnZhciBpbml0X21hcF9waW5fY2hlY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcC1waW4tY2hlY2suanMiKCkgewogICAgTWFwUGluQ2hlY2sgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOS40MyAxMi45MzVjLjM1Ny0uOTY3LjU3LTEuOTU1LjU3LTIuOTM1YTggOCAwIDAgMC0xNiAwYzAgNC45OTMgNS41MzkgMTAuMTkzIDcuMzk5IDExLjc5OWExIDEgMCAwIDAgMS4yMDIgMCAzMi4xOTcgMzIuMTk3IDAgMCAwIC44MTMtLjcyOCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMCIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDE4IDIgMiA0LTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXAtcGluLW1pbnVzLWluc2lkZS5qcwp2YXIgTWFwUGluTWludXNJbnNpZGU7CnZhciBpbml0X21hcF9waW5fbWludXNfaW5zaWRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXAtcGluLW1pbnVzLWluc2lkZS5qcyIoKSB7CiAgICBNYXBQaW5NaW51c0luc2lkZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDEwYzAgNC45OTMtNS41MzkgMTAuMTkzLTcuMzk5IDExLjc5OWExIDEgMCAwIDEtMS4yMDIgMEM5LjUzOSAyMC4xOTMgNCAxNC45OTMgNCAxMGE4IDggMCAwIDEgMTYgMCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDEwaDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXAtcGluLW1pbnVzLmpzCnZhciBNYXBQaW5NaW51czsKdmFyIGluaXRfbWFwX3Bpbl9taW51cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFwLXBpbi1taW51cy5qcyIoKSB7CiAgICBNYXBQaW5NaW51cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE4Ljk3NyAxNEMxOS42IDEyLjcwMSAyMCAxMS4zNDMgMjAgMTBhOCA4IDAgMCAwLTE2IDBjMCA0Ljk5MyA1LjUzOSAxMC4xOTMgNy4zOTkgMTEuNzk5YTEgMSAwIDAgMCAxLjIwMiAwIDMyIDMyIDAgMCAwIC44MjQtLjczOCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMCIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE4aDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXAtcGluLW9mZi5qcwp2YXIgTWFwUGluT2ZmOwp2YXIgaW5pdF9tYXBfcGluX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFwLXBpbi1vZmYuanMiKCkgewogICAgTWFwUGluT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIuNzUgNy4wOWEzIDMgMCAwIDEgMi4xNiAyLjE2IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE3LjA3MiAxNy4wNzJjLTEuNjM0IDIuMTctMy41MjcgMy45MTItNC40NzEgNC43MjdhMSAxIDAgMCAxLTEuMjAyIDBDOS41MzkgMjAuMTkzIDQgMTQuOTkzIDQgMTBhOCA4IDAgMCAxIDEuNDMyLTQuNTY4IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjQ3NSAyLjgxOEE4IDggMCAwIDEgMjAgMTBjMCAxLjE4My0uMzEgMi4zNzctLjgxIDMuNTMzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuMTMgOS4xM2EzIDMgMCAwIDAgMy43NCAzLjc0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFwLXBpbi1wZW4uanMKdmFyIE1hcFBpblBlbjsKdmFyIGluaXRfbWFwX3Bpbl9wZW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcC1waW4tcGVuLmpzIigpIHsKICAgIE1hcFBpblBlbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3Ljk3IDkuMzA0QTggOCAwIDAgMCAyIDEwYzAgNC42OSA0Ljg4NyA5LjU2MiA3LjAyMiAxMS40NjgiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEuMzc4IDE2LjYyNmExIDEgMCAwIDAtMy4wMDQtMy4wMDRsLTQuMDEgNC4wMTJhMiAyIDAgMCAwLS41MDYuODU0bC0uODM3IDIuODdhLjUuNSAwIDAgMCAuNjIuNjJsMi44Ny0uODM3YTIgMiAwIDAgMCAuODU0LS41MDZ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTAiLCBjeTogIjEwIiwgcjogIjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXAtcGluLXBsdXMuanMKdmFyIE1hcFBpblBsdXM7CnZhciBpbml0X21hcF9waW5fcGx1cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFwLXBpbi1wbHVzLmpzIigpIHsKICAgIE1hcFBpblBsdXMgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOS45MTQgMTEuMTA1QTcuMjk4IDcuMjk4IDAgMCAwIDIwIDEwYTggOCAwIDAgMC0xNiAwYzAgNC45OTMgNS41MzkgMTAuMTkzIDcuMzk5IDExLjc5OWExIDEgMCAwIDAgMS4yMDIgMCAzMiAzMiAwIDAgMCAuODI0LS43MzgiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTAiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxOGg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE1djYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXAtcGluLXBsdXMtaW5zaWRlLmpzCnZhciBNYXBQaW5QbHVzSW5zaWRlOwp2YXIgaW5pdF9tYXBfcGluX3BsdXNfaW5zaWRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXAtcGluLXBsdXMtaW5zaWRlLmpzIigpIHsKICAgIE1hcFBpblBsdXNJbnNpZGUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAxMGMwIDQuOTkzLTUuNTM5IDEwLjE5My03LjM5OSAxMS43OTlhMSAxIDAgMCAxLTEuMjAyIDBDOS41MzkgMjAuMTkzIDQgMTQuOTkzIDQgMTBhOCA4IDAgMCAxIDE2IDAiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgN3Y2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTBoNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcC1waW4teC1pbnNpZGUuanMKdmFyIE1hcFBpblhJbnNpZGU7CnZhciBpbml0X21hcF9waW5feF9pbnNpZGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcC1waW4teC1pbnNpZGUuanMiKCkgewogICAgTWFwUGluWEluc2lkZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDEwYzAgNC45OTMtNS41MzkgMTAuMTkzLTcuMzk5IDExLjc5OWExIDEgMCAwIDEtMS4yMDIgMEM5LjUzOSAyMC4xOTMgNCAxNC45OTMgNCAxMGE4IDggMCAwIDEgMTYgMCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC41IDcuNS01IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOS41IDcuNSA1IDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXAtcGluLXguanMKdmFyIE1hcFBpblg7CnZhciBpbml0X21hcF9waW5feCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFwLXBpbi14LmpzIigpIHsKICAgIE1hcFBpblggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOS43NTIgMTEuOTAxQTcuNzggNy43OCAwIDAgMCAyMCAxMGE4IDggMCAwIDAtMTYgMGMwIDQuOTkzIDUuNTM5IDEwLjE5MyA3LjM5OSAxMS43OTlhMSAxIDAgMCAwIDEuMjAyIDAgMTkgMTkgMCAwIDAgLjA5LS4wNzciCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTAiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMS41IDE1LjUtNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxLjUgMjAuNS01LTUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXAtcGluLmpzCnZhciBNYXBQaW47CnZhciBpbml0X21hcF9waW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcC1waW4uanMiKCkgewogICAgTWFwUGluID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMTBjMCA0Ljk5My01LjUzOSAxMC4xOTMtNy4zOTkgMTEuNzk5YTEgMSAwIDAgMS0xLjIwMiAwQzkuNTM5IDIwLjE5MyA0IDE0Ljk5MyA0IDEwYTggOCAwIDAgMSAxNiAwIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEwIiwgcjogIjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXAtcGlubmVkLmpzCnZhciBNYXBQaW5uZWQ7CnZhciBpbml0X21hcF9waW5uZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcC1waW5uZWQuanMiKCkgewogICAgTWFwUGlubmVkID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTggOGMwIDMuNjEzLTMuODY5IDcuNDI5LTUuMzkzIDguNzk1YTEgMSAwIDAgMS0xLjIxNCAwQzkuODcgMTUuNDI5IDYgMTEuNjEzIDYgOGE2IDYgMCAwIDEgMTIgMCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICI4IiwgcjogIjIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOC43MTQgMTRoLTMuNzFhMSAxIDAgMCAwLS45NDguNjgzbC0yLjAwNCA2QTEgMSAwIDAgMCAzIDIyaDE4YTEgMSAwIDAgMCAuOTQ4LTEuMzE2bC0yLTZhMSAxIDAgMCAwLS45NDktLjY4NGgtMy43MTIiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXAtcGx1cy5qcwp2YXIgTWFwUGx1czsKdmFyIGluaXRfbWFwX3BsdXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcC1wbHVzLmpzIigpIHsKICAgIE1hcFBsdXMgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xMSAxOS0xLjEwNi0uNTUyYTIgMiAwIDAgMC0xLjc4OCAwbC0zLjY1OSAxLjgzQTEgMSAwIDAgMSAzIDE5LjM4MVY2LjYxOGExIDEgMCAwIDEgLjU1My0uODk0bDQuNTUzLTIuMjc3YTIgMiAwIDAgMSAxLjc4OCAwbDQuMjEyIDIuMTA2YTIgMiAwIDAgMCAxLjc4OCAwbDMuNjU5LTEuODNBMSAxIDAgMCAxIDIxIDQuNjE5VjEyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDUuNzY0VjEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE1djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMThoLTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAzLjIzNnYxNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcnMtc3Ryb2tlLmpzCnZhciBNYXJzU3Ryb2tlOwp2YXIgaW5pdF9tYXJzX3N0cm9rZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFycy1zdHJva2UuanMiKCkgewogICAgTWFyc1N0cm9rZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDYgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDNoNHY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDMtNy43NSA3Ljc1IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOSIsIGN5OiAiMTUiLCByOiAiNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcC5qcwp2YXIgTWFwMjsKdmFyIGluaXRfbWFwMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFwLmpzIigpIHsKICAgIE1hcDIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNC4xMDYgNS41NTNhMiAyIDAgMCAwIDEuNzg4IDBsMy42NTktMS44M0ExIDEgMCAwIDEgMjEgNC42MTl2MTIuNzY0YTEgMSAwIDAgMS0uNTUzLjg5NGwtNC41NTMgMi4yNzdhMiAyIDAgMCAxLTEuNzg4IDBsLTQuMjEyLTIuMTA2YTIgMiAwIDAgMC0xLjc4OCAwbC0zLjY1OSAxLjgzQTEgMSAwIDAgMSAzIDE5LjM4MVY2LjYxOGExIDEgMCAwIDEgLjU1My0uODk0bDQuNTUzLTIuMjc3YTIgMiAwIDAgMSAxLjc4OCAweiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA1Ljc2NHYxNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDMuMjM2djE1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFycy5qcwp2YXIgTWFyczsKdmFyIGluaXRfbWFycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFycy5qcyIoKSB7CiAgICBNYXJzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgM2g1djUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMy02Ljc1IDYuNzUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMCIsIGN5OiAiMTQiLCByOiAiNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcnRpbmkuanMKdmFyIE1hcnRpbmk7CnZhciBpbml0X21hcnRpbmkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcnRpbmkuanMiKCkgewogICAgTWFydGluaSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjJoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMXYxMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOSAzLTcgOC03LThaIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWF4aW1pemUtMi5qcwp2YXIgTWF4aW1pemUyOwp2YXIgaW5pdF9tYXhpbWl6ZV8yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXhpbWl6ZS0yLmpzIigpIHsKICAgIE1heGltaXplMiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDNoNnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDMtNyA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgMjEgNy03IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMjFIM3YtNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21heGltaXplLmpzCnZhciBNYXhpbWl6ZTsKdmFyIGluaXRfbWF4aW1pemUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21heGltaXplLmpzIigpIHsKICAgIE1heGltaXplID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAzSDVhMiAyIDAgMCAwLTIgMnYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDhWNWEyIDIgMCAwIDAtMi0yaC0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTZ2M2EyIDIgMCAwIDAgMiAyaDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMjFoM2EyIDIgMCAwIDAgMi0ydi0zIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVnYXBob25lLW9mZi5qcwp2YXIgTWVnYXBob25lT2ZmOwp2YXIgaW5pdF9tZWdhcGhvbmVfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZWdhcGhvbmUtb2ZmLmpzIigpIHsKICAgIE1lZ2FwaG9uZU9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExLjYzNiA2QTEzIDEzIDAgMCAwIDE5LjQgMy4yIDEgMSAwIDAgMSAyMSA0djExLjM0NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNC4zNzggMTQuMzU3QTEzIDEzIDAgMCAwIDExIDE0SDVhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxNGExMiAxMiAwIDAgMCAyLjQgNy4yIDIgMiAwIDAgMCAzLjItMi40QTggOCAwIDAgMSAxMCAxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDh2NiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lZGFsLmpzCnZhciBNZWRhbDsKdmFyIGluaXRfbWVkYWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lZGFsLmpzIigpIHsKICAgIE1lZGFsID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNy4yMSAxNSAyLjY2IDcuMTRhMiAyIDAgMCAxIC4xMy0yLjJMNC40IDIuOEEyIDIgMCAwIDEgNiAyaDEyYTIgMiAwIDAgMSAxLjYuOGwxLjYgMi4xNGEyIDIgMCAwIDEgLjE0IDIuMkwxNi43OSAxNSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxMiA1LjEyIDIuMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMyAxMiA1Ljg4LTkuOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDdoOCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxNyIsIHI6ICI1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4di0yaC0uNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lZ2FwaG9uZS5qcwp2YXIgTWVnYXBob25lOwp2YXIgaW5pdF9tZWdhcGhvbmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lZ2FwaG9uZS5qcyIoKSB7CiAgICBNZWdhcGhvbmUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMSA2YTEzIDEzIDAgMCAwIDguNC0yLjhBMSAxIDAgMCAxIDIxIDR2MTJhMSAxIDAgMCAxLTEuNi44QTEzIDEzIDAgMCAwIDExIDE0SDVhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTRhMTIgMTIgMCAwIDAgMi40IDcuMiAyIDIgMCAwIDAgMy4yLTIuNEE4IDggMCAwIDEgMTAgMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA2djgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZWguanMKdmFyIE1laDsKdmFyIGluaXRfbWVoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZWguanMiKCkgewogICAgTWVoID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiOCIsIHgyOiAiMTYiLCB5MTogIjE1IiwgeTI6ICIxNSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI5IiwgeDI6ICI5LjAxIiwgeTE6ICI5IiwgeTI6ICI5IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE1IiwgeDI6ICIxNS4wMSIsIHkxOiAiOSIsIHkyOiAiOSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lbnUuanMKdmFyIE1lbnU7CnZhciBpbml0X21lbnUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lbnUuanMiKCkgewogICAgTWVudSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgNWgxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEyaDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTloMTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZW1vcnktc3RpY2suanMKdmFyIE1lbW9yeVN0aWNrOwp2YXIgaW5pdF9tZW1vcnlfc3RpY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lbW9yeS1zdGljay5qcyIoKSB7CiAgICBNZW1vcnlTdGljayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEydi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4di0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEydi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE4di0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTFoMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE4di0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwLjUgMTFIMjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxOHYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEydi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTh2LTIiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjYiLCB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTAiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXJnZS5qcwp2YXIgTWVyZ2U7CnZhciBpbml0X21lcmdlNCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVyZ2UuanMiKCkgewogICAgTWVyZ2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDYgNC00IDQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjEwLjNhNCA0IDAgMCAxLTEuMTcyIDIuODcyTDQgMjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAgMjItNS01IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1jaXJjbGUtY2hlY2suanMKdmFyIE1lc3NhZ2VDaXJjbGVDaGVjazsKdmFyIGluaXRfbWVzc2FnZV9jaXJjbGVfY2hlY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2UtY2lyY2xlLWNoZWNrLmpzIigpIHsKICAgIE1lc3NhZ2VDaXJjbGVDaGVjayA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuOTkyIDE2LjM0MmEyIDIgMCAwIDEgLjA5NCAxLjE2N2wtMS4wNjUgMy4yOWExIDEgMCAwIDAgMS4yMzYgMS4xNjhsMy40MTMtLjk5OGEyIDIgMCAwIDEgMS4wOTkuMDkyIDEwIDEwIDAgMSAwLTQuNzc3LTQuNzE5IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTIgMiAyIDQtNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2UtY2lyY2xlLWNvZGUuanMKdmFyIE1lc3NhZ2VDaXJjbGVDb2RlOwp2YXIgaW5pdF9tZXNzYWdlX2NpcmNsZV9jb2RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLWNpcmNsZS1jb2RlLmpzIigpIHsKICAgIE1lc3NhZ2VDaXJjbGVDb2RlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgOS0zIDMgMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDE1IDMtMy0zLTMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMi45OTIgMTYuMzQyYTIgMiAwIDAgMSAuMDk0IDEuMTY3bC0xLjA2NSAzLjI5YTEgMSAwIDAgMCAxLjIzNiAxLjE2OGwzLjQxMy0uOTk4YTIgMiAwIDAgMSAxLjA5OS4wOTIgMTAgMTAgMCAxIDAtNC43NzctNC43MTkiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLWNpcmNsZS1kYXNoZWQuanMKdmFyIE1lc3NhZ2VDaXJjbGVEYXNoZWQ7CnZhciBpbml0X21lc3NhZ2VfY2lyY2xlX2Rhc2hlZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1jaXJjbGUtZGFzaGVkLmpzIigpIHsKICAgIE1lc3NhZ2VDaXJjbGVEYXNoZWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC4xIDIuMTgyYTEwIDEwIDAgMCAxIDMuOCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjkgMjEuODE4YTEwIDEwIDAgMCAxLTMuOCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjYwOSAzLjcyYTEwIDEwIDAgMCAxIDIuNjkgMi43IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIuMTgyIDEzLjlhMTAgMTAgMCAwIDEgMC0zLjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAuMjggMTcuNjFhMTAgMTAgMCAwIDEtMi43IDIuNjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEuODE4IDEwLjFhMTAgMTAgMCAwIDEgMCAzLjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy43MjEgNi4zOTFhMTAgMTAgMCAwIDEgMi43LTIuNjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNi4xNjMgMjEuMTE3LTIuOTA2Ljg1YTEgMSAwIDAgMS0xLjIzNi0xLjE2OWwuOTY1LTIuOTgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLWNpcmNsZS1oZWFydC5qcwp2YXIgTWVzc2FnZUNpcmNsZUhlYXJ0Owp2YXIgaW5pdF9tZXNzYWdlX2NpcmNsZV9oZWFydCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1jaXJjbGUtaGVhcnQuanMiKCkgewogICAgTWVzc2FnZUNpcmNsZUhlYXJ0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMi45OTIgMTYuMzQyYTIgMiAwIDAgMSAuMDk0IDEuMTY3bC0xLjA2NSAzLjI5YTEgMSAwIDAgMCAxLjIzNiAxLjE2OGwzLjQxMy0uOTk4YTIgMiAwIDAgMSAxLjA5OS4wOTIgMTAgMTAgMCAxIDAtNC43NzctNC43MTkiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNy44MjggMTMuMDdBMyAzIDAgMCAxIDEyIDguNzY0YTMgMyAwIDAgMSA1LjAwNCAyLjIyNCAzIDMgMCAwIDEtLjgzMiAyLjA4M2wtMy40NDcgMy42MmExIDEgMCAwIDEtMS40NS0uMDAxeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2UtY2lyY2xlLW1vcmUuanMKdmFyIE1lc3NhZ2VDaXJjbGVNb3JlOwp2YXIgaW5pdF9tZXNzYWdlX2NpcmNsZV9tb3JlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLWNpcmNsZS1tb3JlLmpzIigpIHsKICAgIE1lc3NhZ2VDaXJjbGVNb3JlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMi45OTIgMTYuMzQyYTIgMiAwIDAgMSAuMDk0IDEuMTY3bC0xLjA2NSAzLjI5YTEgMSAwIDAgMCAxLjIzNiAxLjE2OGwzLjQxMy0uOTk4YTIgMiAwIDAgMSAxLjA5OS4wOTIgMTAgMTAgMCAxIDAtNC43NzctNC43MTkiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEyaC4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2UtY2lyY2xlLW9mZi5qcwp2YXIgTWVzc2FnZUNpcmNsZU9mZjsKdmFyIGluaXRfbWVzc2FnZV9jaXJjbGVfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLWNpcmNsZS1vZmYuanMiKCkgewogICAgTWVzc2FnZUNpcmNsZU9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00LjkzIDQuOTI5YTEwIDEwIDAgMCAwLTEuOTM4IDExLjQxMiAyIDIgMCAwIDEgLjA5NCAxLjE2N2wtMS4wNjUgMy4yOWExIDEgMCAwIDAgMS4yMzYgMS4xNjhsMy40MTMtLjk5OGEyIDIgMCAwIDEgMS4wOTkuMDkyIDEwIDEwIDAgMCAwIDExLjMwMi0xLjk4OSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjM1IDIuNjlBMTAgMTAgMCAwIDEgMjEuMyAxNS42NSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2UtY2lyY2xlLXBsdXMuanMKdmFyIE1lc3NhZ2VDaXJjbGVQbHVzOwp2YXIgaW5pdF9tZXNzYWdlX2NpcmNsZV9wbHVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLWNpcmNsZS1wbHVzLmpzIigpIHsKICAgIE1lc3NhZ2VDaXJjbGVQbHVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMi45OTIgMTYuMzQyYTIgMiAwIDAgMSAuMDk0IDEuMTY3bC0xLjA2NSAzLjI5YTEgMSAwIDAgMCAxLjIzNiAxLjE2OGwzLjQxMy0uOTk4YTIgMiAwIDAgMSAxLjA5OS4wOTIgMTAgMTAgMCAxIDAtNC43NzctNC43MTkiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDh2OCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2UtY2lyY2xlLXF1ZXN0aW9uLW1hcmsuanMKdmFyIE1lc3NhZ2VDaXJjbGVRdWVzdGlvbk1hcms7CnZhciBpbml0X21lc3NhZ2VfY2lyY2xlX3F1ZXN0aW9uX21hcmsgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2UtY2lyY2xlLXF1ZXN0aW9uLW1hcmsuanMiKCkgewogICAgTWVzc2FnZUNpcmNsZVF1ZXN0aW9uTWFyayA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuOTkyIDE2LjM0MmEyIDIgMCAwIDEgLjA5NCAxLjE2N2wtMS4wNjUgMy4yOWExIDEgMCAwIDAgMS4yMzYgMS4xNjhsMy40MTMtLjk5OGEyIDIgMCAwIDEgMS4wOTkuMDkyIDEwIDEwIDAgMSAwLTQuNzc3LTQuNzE5IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuMDkgOWEzIDMgMCAwIDEgNS44MyAxYzAgMi0zIDMtMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3aC4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2UtY2lyY2xlLXJlcGx5LmpzCnZhciBNZXNzYWdlQ2lyY2xlUmVwbHk7CnZhciBpbml0X21lc3NhZ2VfY2lyY2xlX3JlcGx5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLWNpcmNsZS1yZXBseS5qcyIoKSB7CiAgICBNZXNzYWdlQ2lyY2xlUmVwbHkgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yLjk5MiAxNi4zNDJhMiAyIDAgMCAxIC4wOTQgMS4xNjdsLTEuMDY1IDMuMjlhMSAxIDAgMCAwIDEuMjM2IDEuMTY4bDMuNDEzLS45OThhMiAyIDAgMCAxIDEuMDk5LjA5MiAxMCAxMCAwIDEgMC00Ljc3Ny00LjcxOSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCAxNS0zLTMgMy0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTJoOGEyIDIgMCAwIDEgMiAydjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLWNpcmNsZS13YXJuaW5nLmpzCnZhciBNZXNzYWdlQ2lyY2xlV2FybmluZzsKdmFyIGluaXRfbWVzc2FnZV9jaXJjbGVfd2FybmluZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1jaXJjbGUtd2FybmluZy5qcyIoKSB7CiAgICBNZXNzYWdlQ2lyY2xlV2FybmluZyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuOTkyIDE2LjM0MmEyIDIgMCAwIDEgLjA5NCAxLjE2N2wtMS4wNjUgMy4yOWExIDEgMCAwIDAgMS4yMzYgMS4xNjhsMy40MTMtLjk5OGEyIDIgMCAwIDEgMS4wOTkuMDkyIDEwIDEwIDAgMSAwLTQuNzc3LTQuNzE5IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDh2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNmguMDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLWNpcmNsZS14LmpzCnZhciBNZXNzYWdlQ2lyY2xlWDsKdmFyIGluaXRfbWVzc2FnZV9jaXJjbGVfeCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1jaXJjbGUteC5qcyIoKSB7CiAgICBNZXNzYWdlQ2lyY2xlWCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuOTkyIDE2LjM0MmEyIDIgMCAwIDEgLjA5NCAxLjE2N2wtMS4wNjUgMy4yOWExIDEgMCAwIDAgMS4yMzYgMS4xNjhsMy40MTMtLjk5OGEyIDIgMCAwIDEgMS4wOTkuMDkyIDEwIDEwIDAgMSAwLTQuNzc3LTQuNzE5IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDktNiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgOSA2IDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLWNpcmNsZS5qcwp2YXIgTWVzc2FnZUNpcmNsZTsKdmFyIGluaXRfbWVzc2FnZV9jaXJjbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2UtY2lyY2xlLmpzIigpIHsKICAgIE1lc3NhZ2VDaXJjbGUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yLjk5MiAxNi4zNDJhMiAyIDAgMCAxIC4wOTQgMS4xNjdsLTEuMDY1IDMuMjlhMSAxIDAgMCAwIDEuMjM2IDEuMTY4bDMuNDEzLS45OThhMiAyIDAgMCAxIDEuMDk5LjA5MiAxMCAxMCAwIDEgMC00Ljc3Ny00LjcxOSIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLWNoZWNrLmpzCnZhciBNZXNzYWdlU3F1YXJlQ2hlY2s7CnZhciBpbml0X21lc3NhZ2Vfc3F1YXJlX2NoZWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLXNxdWFyZS1jaGVjay5qcyIoKSB7CiAgICBNZXNzYWdlU3F1YXJlQ2hlY2sgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMiAxN2EyIDIgMCAwIDEtMiAySDYuODI4YTIgMiAwIDAgMC0xLjQxNC41ODZsLTIuMjAyIDIuMjAyQS43LjcgMCAwIDEgMiAyMS4yODZWNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTEgMiAyIDQtNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLWNvZGUuanMKdmFyIE1lc3NhZ2VTcXVhcmVDb2RlOwp2YXIgaW5pdF9tZXNzYWdlX3NxdWFyZV9jb2RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLXNxdWFyZS1jb2RlLmpzIigpIHsKICAgIE1lc3NhZ2VTcXVhcmVDb2RlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjIgMTdhMiAyIDAgMCAxLTIgMkg2LjgyOGEyIDIgMCAwIDAtMS40MTQuNTg2bC0yLjIwMiAyLjIwMkEuNzEuNzEgMCAwIDEgMiAyMS4yODZWNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEwIDgtMyAzIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAxNCAzLTMtMy0zIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1zcXVhcmUtZGFzaGVkLmpzCnZhciBNZXNzYWdlU3F1YXJlRGFzaGVkOwp2YXIgaW5pdF9tZXNzYWdlX3NxdWFyZV9kYXNoZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLWRhc2hlZC5qcyIoKSB7CiAgICBNZXNzYWdlU3F1YXJlRGFzaGVkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgM2gyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE5aC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJ2LTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxNnY1LjI4NmEuNzEuNzEgMCAwIDAgMS4yMTIuNTAybDEuMTQ5LTEuMTQ5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE5YTIgMiAwIDAgMCAyLTJ2LTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTB2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiA2VjVhMiAyIDAgMCAwLTItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDNhMiAyIDAgMCAwLTIgMnYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTloMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDNoMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLWRpZmYuanMKdmFyIE1lc3NhZ2VTcXVhcmVEaWZmOwp2YXIgaW5pdF9tZXNzYWdlX3NxdWFyZV9kaWZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLXNxdWFyZS1kaWZmLmpzIigpIHsKICAgIE1lc3NhZ2VTcXVhcmVEaWZmID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjIgMTdhMiAyIDAgMCAxLTIgMkg2LjgyOGEyIDIgMCAwIDAtMS40MTQuNTg2bC0yLjIwMiAyLjIwMkEuNzEuNzEgMCAwIDEgMiAyMS4yODZWNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE1aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOWg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2NCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLWRvdC5qcwp2YXIgTWVzc2FnZVNxdWFyZURvdDsKdmFyIGluaXRfbWVzc2FnZV9zcXVhcmVfZG90ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLXNxdWFyZS1kb3QuanMiKCkgewogICAgTWVzc2FnZVNxdWFyZURvdCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyLjcgM0g0YTIgMiAwIDAgMC0yIDJ2MTYuMjg2YS43MS43MSAwIDAgMCAxLjIxMi41MDJsMi4yMDItMi4yMDJBMiAyIDAgMCAxIDYuODI4IDE5SDIwYTIgMiAwIDAgMCAyLTJ2LTQuNyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE5IiwgY3k6ICI2IiwgcjogIjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLXNxdWFyZS1oZWFydC5qcwp2YXIgTWVzc2FnZVNxdWFyZUhlYXJ0Owp2YXIgaW5pdF9tZXNzYWdlX3NxdWFyZV9oZWFydCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1zcXVhcmUtaGVhcnQuanMiKCkgewogICAgTWVzc2FnZVNxdWFyZUhlYXJ0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjIgMTdhMiAyIDAgMCAxLTIgMkg2LjgyOGEyIDIgMCAwIDAtMS40MTQuNTg2bC0yLjIwMiAyLjIwMkEuNzEuNzEgMCAwIDEgMiAyMS4yODZWNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTcuNSA5LjVjMCAuNjg3LjI2NSAxLjM4My42OTcgMS44NDRsMy4wMDkgMy4yNjRhMS4xNCAxLjE0IDAgMCAwIC40MDcuMzE0IDEgMSAwIDAgMCAuNzgzLS4wMDQgMS4xNCAxLjE0IDAgMCAwIC4zOTgtLjMxbDMuMDA4LTMuMjY0QTIuNzcgMi43NyAwIDAgMCAxNi41IDkuNSAyLjUgMi41IDAgMCAwIDEyIDhhMi41IDIuNSAwIDAgMC00LjUgMS41IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1zcXVhcmUtbG9jay5qcwp2YXIgTWVzc2FnZVNxdWFyZUxvY2s7CnZhciBpbml0X21lc3NhZ2Vfc3F1YXJlX2xvY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLWxvY2suanMiKCkgewogICAgTWVzc2FnZVNxdWFyZUxvY2sgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMiA4LjVWNWEyIDIgMCAwIDAtMi0ySDRhMiAyIDAgMCAwLTIgMnYxNi4yODZhLjcxLjcxIDAgMCAwIDEuMjEyLjUwMmwyLjIwMi0yLjIwMkEyIDIgMCAwIDEgNi44MjggMTlIMTAiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTV2LTJhMiAyIDAgMCAwLTQgMHYyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMTQiLCB5OiAiMTUiLCB3aWR0aDogIjgiLCBoZWlnaHQ6ICI1Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1zcXVhcmUtbW9yZS5qcwp2YXIgTWVzc2FnZVNxdWFyZU1vcmU7CnZhciBpbml0X21lc3NhZ2Vfc3F1YXJlX21vcmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLW1vcmUuanMiKCkgewogICAgTWVzc2FnZVNxdWFyZU1vcmUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMiAxN2EyIDIgMCAwIDEtMiAySDYuODI4YTIgMiAwIDAgMC0xLjQxNC41ODZsLTIuMjAyIDIuMjAyQS43MS43MSAwIDAgMSAyIDIxLjI4NlY1YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTFoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDExaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDExaC4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLW9mZi5qcwp2YXIgTWVzc2FnZVNxdWFyZU9mZjsKdmFyIGluaXRfbWVzc2FnZV9zcXVhcmVfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLXNxdWFyZS1vZmYuanMiKCkgewogICAgTWVzc2FnZVNxdWFyZU9mZiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE5IDE5SDYuODI4YTIgMiAwIDAgMC0xLjQxNC41ODZsLTIuMjAyIDIuMjAyQS43LjcgMCAwIDEgMiAyMS4yODZWNWEyIDIgMCAwIDEgMS4xODQtMS44MjYiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguNjU2IDNIMjBhMiAyIDAgMCAxIDIgMnYxMS4zNDQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLXNxdWFyZS1wbHVzLmpzCnZhciBNZXNzYWdlU3F1YXJlUGx1czsKdmFyIGluaXRfbWVzc2FnZV9zcXVhcmVfcGx1cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1zcXVhcmUtcGx1cy5qcyIoKSB7CiAgICBNZXNzYWdlU3F1YXJlUGx1cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIyIDE3YTIgMiAwIDAgMS0yIDJINi44MjhhMiAyIDAgMCAwLTEuNDE0LjU4NmwtMi4yMDIgMi4yMDJBLjcxLjcxIDAgMCAxIDIgMjEuMjg2VjVhMiAyIDAgMCAxIDItMmgxNmEyIDIgMCAwIDEgMiAyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA4djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMWg2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1zcXVhcmUtcXVvdGUuanMKdmFyIE1lc3NhZ2VTcXVhcmVRdW90ZTsKdmFyIGluaXRfbWVzc2FnZV9zcXVhcmVfcXVvdGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLXF1b3RlLmpzIigpIHsKICAgIE1lc3NhZ2VTcXVhcmVRdW90ZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE0YTIgMiAwIDAgMCAyLTJWOGgtMiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMiAxN2EyIDIgMCAwIDEtMiAySDYuODI4YTIgMiAwIDAgMC0xLjQxNC41ODZsLTIuMjAyIDIuMjAyQS43MS43MSAwIDAgMSAyIDIxLjI4NlY1YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNGEyIDIgMCAwIDAgMi0yVjhIOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLXJlcGx5LmpzCnZhciBNZXNzYWdlU3F1YXJlUmVwbHk7CnZhciBpbml0X21lc3NhZ2Vfc3F1YXJlX3JlcGx5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLXNxdWFyZS1yZXBseS5qcyIoKSB7CiAgICBNZXNzYWdlU3F1YXJlUmVwbHkgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMiAxN2EyIDIgMCAwIDEtMiAySDYuODI4YTIgMiAwIDAgMC0xLjQxNC41ODZsLTIuMjAyIDIuMjAyQS43MS43MSAwIDAgMSAyIDIxLjI4NlY1YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgOC0zIDMgMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDE0di0xYTIgMiAwIDAgMC0yLTJINyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLXNoYXJlLmpzCnZhciBNZXNzYWdlU3F1YXJlU2hhcmU7CnZhciBpbml0X21lc3NhZ2Vfc3F1YXJlX3NoYXJlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLXNxdWFyZS1zaGFyZS5qcyIoKSB7CiAgICBNZXNzYWdlU3F1YXJlU2hhcmUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMiAzSDRhMiAyIDAgMCAwLTIgMnYxNi4yODZhLjcxLjcxIDAgMCAwIDEuMjEyLjUwMmwyLjIwMi0yLjIwMkEyIDIgMCAwIDEgNi44MjggMTlIMjBhMiAyIDAgMCAwIDItMnYtNCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAzaDZ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiA5IDYtNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLXRleHQuanMKdmFyIE1lc3NhZ2VTcXVhcmVUZXh0Owp2YXIgaW5pdF9tZXNzYWdlX3NxdWFyZV90ZXh0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLXNxdWFyZS10ZXh0LmpzIigpIHsKICAgIE1lc3NhZ2VTcXVhcmVUZXh0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjIgMTdhMiAyIDAgMCAxLTIgMkg2LjgyOGEyIDIgMCAwIDAtMS40MTQuNTg2bC0yLjIwMiAyLjIwMkEuNzEuNzEgMCAwIDEgMiAyMS4yODZWNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTFoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxNWg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgN2g4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1zcXVhcmUtd2FybmluZy5qcwp2YXIgTWVzc2FnZVNxdWFyZVdhcm5pbmc7CnZhciBpbml0X21lc3NhZ2Vfc3F1YXJlX3dhcm5pbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLXdhcm5pbmcuanMiKCkgewogICAgTWVzc2FnZVNxdWFyZVdhcm5pbmcgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMiAxN2EyIDIgMCAwIDEtMiAySDYuODI4YTIgMiAwIDAgMC0xLjQxNC41ODZsLTIuMjAyIDIuMjAyQS43MS43MSAwIDAgMSAyIDIxLjI4NlY1YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTVoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2NCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLXguanMKdmFyIE1lc3NhZ2VTcXVhcmVYOwp2YXIgaW5pdF9tZXNzYWdlX3NxdWFyZV94ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLXNxdWFyZS14LmpzIigpIHsKICAgIE1lc3NhZ2VTcXVhcmVYID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjIgMTdhMiAyIDAgMCAxLTIgMkg2LjgyOGEyIDIgMCAwIDAtMS40MTQuNTg2bC0yLjIwMiAyLjIwMkEuNzEuNzEgMCAwIDEgMiAyMS4yODZWNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0LjUgOC41LTUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05LjUgOC41IDUgNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLmpzCnZhciBNZXNzYWdlU3F1YXJlOwp2YXIgaW5pdF9tZXNzYWdlX3NxdWFyZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1zcXVhcmUuanMiKCkgewogICAgTWVzc2FnZVNxdWFyZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIyIDE3YTIgMiAwIDAgMS0yIDJINi44MjhhMiAyIDAgMCAwLTEuNDE0LjU4NmwtMi4yMDIgMi4yMDJBLjcxLjcxIDAgMCAxIDIgMjEuMjg2VjVhMiAyIDAgMCAxIDItMmgxNmEyIDIgMCAwIDEgMiAyeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2VzLXNxdWFyZS5qcwp2YXIgTWVzc2FnZXNTcXVhcmU7CnZhciBpbml0X21lc3NhZ2VzX3NxdWFyZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZXMtc3F1YXJlLmpzIigpIHsKICAgIE1lc3NhZ2VzU3F1YXJlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTYgMTBhMiAyIDAgMCAxLTIgMkg2LjgyOGEyIDIgMCAwIDAtMS40MTQuNTg2bC0yLjIwMiAyLjIwMkEuNzEuNzEgMCAwIDEgMiAxNC4yODZWNGEyIDIgMCAwIDEgMi0yaDEwYTIgMiAwIDAgMSAyIDJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDlhMiAyIDAgMCAxIDIgMnYxMC4yODZhLjcxLjcxIDAgMCAxLTEuMjEyLjUwMmwtMi4yMDItMi4yMDJBMiAyIDAgMCAwIDE3LjE3MiAxOUgxMGEyIDIgMCAwIDEtMi0ydi0xIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWV0cm9ub21lLmpzCnZhciBNZXRyb25vbWU7CnZhciBpbml0X21ldHJvbm9tZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWV0cm9ub21lLmpzIigpIHsKICAgIE1ldHJvbm9tZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDExLjRWOS4xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDE3IDYuNTktNi41OSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xNS4wNSA1LjctLjIxOC0uNjkxYTMgMyAwIDAgMC01LjY2MyAwTDQuNDE4IDE5LjY5NUExIDEgMCAwIDAgNS4zNyAyMWgxMy4yNTNhMSAxIDAgMCAwIC45NTEtMS4zMUwxOC40NSAxNi4yIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMjAiLCBjeTogIjkiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21pYy1vZmYuanMKdmFyIE1pY09mZjsKdmFyIGluaXRfbWljX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWljLW9mZi5qcyIoKSB7CiAgICBNaWNPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOXYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDkuMzRWNWEzIDMgMCAwIDAtNS42OC0xLjMzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2Ljk1IDE2Ljk1QTcgNyAwIDAgMSA1IDEydi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4Ljg5IDEzLjIzQTcgNyAwIDAgMCAxOSAxMnYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA5djNhMyAzIDAgMCAwIDUuMTIgMi4xMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21pYy12b2NhbC5qcwp2YXIgTWljVm9jYWw7CnZhciBpbml0X21pY192b2NhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWljLXZvY2FsLmpzIigpIHsKICAgIE1pY1ZvY2FsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTEgNy42MDEtNS45OTQgOC4xOWExIDEgMCAwIDAgLjEgMS4yOThsLjgxNy44MThhMSAxIDAgMCAwIDEuMzE0LjA4N0wxNS4wOSAxMiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNi41IDIxLjE3NEMxNS41IDIwLjUgMTQuMzcyIDIwIDEzIDIwYy0yLjA1OCAwLTMuOTI4IDIuMzU2LTYgMi0yLjA3Mi0uMzU2LTIuNzc1LTMuMzY5LTEuNS00LjUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNiIsIGN5OiAiNyIsIHI6ICI1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWljLmpzCnZhciBNaWM7CnZhciBpbml0X21pYyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWljLmpzIigpIHsKICAgIE1pYyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE5djMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMTB2MmE3IDcgMCAwIDEtMTQgMHYtMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjkiLCB5OiAiMiIsIHdpZHRoOiAiNiIsIGhlaWdodDogIjEzIiwgcng6ICIzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWljcm9jaGlwLmpzCnZhciBNaWNyb2NoaXA7CnZhciBpbml0X21pY3JvY2hpcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWljcm9jaGlwLmpzIigpIHsKICAgIE1pY3JvY2hpcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEyaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTdoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA3aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxOGgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDZoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEyaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxOGgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgNmgyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiNiIsIHk6ICIyIiwgd2lkdGg6ICIxMiIsIGhlaWdodDogIjIwIiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWljcm93YXZlLmpzCnZhciBNaWNyb3dhdmU7CnZhciBpbml0X21pY3Jvd2F2ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWljcm93YXZlLmpzIigpIHsKICAgIE1pY3Jvd2F2ZSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTUiLCB4OiAiMiIsIHk6ICI0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICI3IiwgeDogIjYiLCB5OiAiOCIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA4djciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOXYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE5djIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9taWxlc3RvbmUuanMKdmFyIE1pbGVzdG9uZTsKdmFyIGluaXRfbWlsZXN0b25lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9taWxlc3RvbmUuanMiKCkgewogICAgTWlsZXN0b25lID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTN2OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAzdjMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNCA2YTEgMSAwIDAgMC0xIDF2NWExIDEgMCAwIDAgMSAxaDEzYTIgMiAwIDAgMCAxLjE1Mi0uMzY1bDMuNDI0LTIuMzE3YTEgMSAwIDAgMCAwLTEuNjM1bC0zLjQyNC0yLjMxOEEyIDIgMCAwIDAgMTcgNnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9taWNyb3Njb3BlLmpzCnZhciBNaWNyb3Njb3BlOwp2YXIgaW5pdF9taWNyb3Njb3BlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9taWNyb3Njb3BlLmpzIigpIHsKICAgIE1pY3Jvc2NvcGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE4aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAyMmgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAyMmE3IDcgMCAxIDAgMC0xNGgtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE0aDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMmEyIDIgMCAwIDEtMi0yVjZoNnY0YTIgMiAwIDAgMS0yIDJaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZWM2ExIDEgMCAwIDAtMS0xSDlhMSAxIDAgMCAwLTEgMXYzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWlsay1vZmYuanMKdmFyIE1pbGtPZmY7CnZhciBpbml0X21pbGtfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9taWxrLW9mZi5qcyIoKSB7CiAgICBNaWxrT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAyaDgiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOSAydjEuMzQzTTE1IDJ2Mi43ODlhNCA0IDAgMCAwIC42NzIgMi4yMTlsLjY1Ni45ODRhNCA0IDAgMCAxIC42NzIgMi4yMnYxLjEzMU03LjggNy44bC0uMTI4LjE5MkE0IDQgMCAwIDAgNyAxMC4yMTJWMjBhMiAyIDAgMCAwIDIgMmg2YTIgMiAwIDAgMCAyLTJ2LTMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxNWE2LjQ3IDYuNDcgMCAwIDEgNSAwIDYuNDcyIDYuNDcyIDAgMCAwIDMuNDM1LjQzNSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIyIiwgeDI6ICIyMiIsIHkxOiAiMiIsIHkyOiAiMjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9taW5pbWl6ZS0yLmpzCnZhciBNaW5pbWl6ZTI7CnZhciBpbml0X21pbmltaXplXzIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21pbmltaXplLTIuanMiKCkgewogICAgTWluaW1pemUyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgMTAgNy03IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDEwaC02VjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMyAyMSA3LTciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxNGg2djYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9taWxrLmpzCnZhciBNaWxrOwp2YXIgaW5pdF9taWxrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9taWxrLmpzIigpIHsKICAgIE1pbGsgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJoOCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk05IDJ2Mi43ODlhNCA0IDAgMCAxLS42NzIgMi4yMTlsLS42NTYuOTg0QTQgNCAwIDAgMCA3IDEwLjIxMlYyMGEyIDIgMCAwIDAgMiAyaDZhMiAyIDAgMCAwIDItMnYtOS43ODlhNCA0IDAgMCAwLS42NzItMi4yMTlsLS42NTYtLjk4NEE0IDQgMCAwIDEgMTUgNC43ODhWMiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE1YTYuNDcyIDYuNDcyIDAgMCAxIDUgMCA2LjQ3IDYuNDcgMCAwIDAgNSAwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWluaW1pemUuanMKdmFyIE1pbmltaXplOwp2YXIgaW5pdF9taW5pbWl6ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWluaW1pemUuanMiKCkgewogICAgTWluaW1pemUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDN2M2EyIDIgMCAwIDEtMiAySDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgOGgtM2EyIDIgMCAwIDEtMi0yVjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxNmgzYTIgMiAwIDAgMSAyIDJ2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAyMXYtM2EyIDIgMCAwIDEgMi0yaDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9taW51cy5qcwp2YXIgTWludXM7CnZhciBpbml0X21pbnVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9taW51cy5qcyIoKSB7CiAgICBNaW51cyA9IFtbInBhdGgiLCB7IGQ6ICJNNSAxMmgxNCIgfV1dOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9taXJyb3ItcmVjdGFuZ3VsYXIuanMKdmFyIE1pcnJvclJlY3Rhbmd1bGFyOwp2YXIgaW5pdF9taXJyb3JfcmVjdGFuZ3VsYXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21pcnJvci1yZWN0YW5ndWxhci5qcyIoKSB7CiAgICBNaXJyb3JSZWN0YW5ndWxhciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDYgOCA5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDctOCA4IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiNCIsIHk6ICIyIiwgd2lkdGg6ICIxNiIsIGhlaWdodDogIjIwIiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbWlycm9yLXJvdW5kLmpzCnZhciBNaXJyb3JSb3VuZDsKdmFyIGluaXRfbWlycm9yX3JvdW5kID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9taXJyb3Itcm91bmQuanMiKCkgewogICAgTWlycm9yUm91bmQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA2LjYgOC42IDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTh2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA3LjUgOS41IDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjJoMTAiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTAiLCByOiAiOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vbml0b3ItY2hlY2suanMKdmFyIE1vbml0b3JDaGVjazsKdmFyIGluaXRfbW9uaXRvcl9jaGVjayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW9uaXRvci1jaGVjay5qcyIoKSB7CiAgICBNb25pdG9yQ2hlY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDEwIDIgMiA0LTQiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxNCIsIHg6ICIyIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTd2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIxaDgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb25pdG9yLWNsb3VkLmpzCnZhciBNb25pdG9yQ2xvdWQ7CnZhciBpbml0X21vbml0b3JfY2xvdWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vbml0b3ItY2xvdWQuanMiKCkgewogICAgTW9uaXRvckNsb3VkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTNhMyAzIDAgMSAxIDIuODMtNEgxNGEyIDIgMCAwIDEgMCA0eiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN3Y0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjFoOCIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjIiLCB5OiAiMyIsIHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxNCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vbml0b3ItY29nLmpzCnZhciBNb25pdG9yQ29nOwp2YXIgaW5pdF9tb25pdG9yX2NvZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW9uaXRvci1jb2cuanMiKCkgewogICAgTW9uaXRvckNvZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuMzA1IDcuNTMuOTIzLS4zODIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUuMjI4IDQuODUyLS45MjMtLjM4MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNi44NTIgMy4yMjgtLjM4My0uOTI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2Ljg1MiA4Ljc3Mi0uMzgzLjkyMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOS4xNDggMy4yMjguMzgzLS45MjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkuNTMgOS42OTYtLjM4Mi0uOTI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwLjc3MiA0Ljg1Mi45MjQtLjM4MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMC43NzIgNy4xNDguOTI0LjM4MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxM3YyYTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjFoOCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICI2IiwgcjogIjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb25pdG9yLWRvdC5qcwp2YXIgTW9uaXRvckRvdDsKdmFyIGluaXRfbW9uaXRvcl9kb3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vbml0b3ItZG90LmpzIigpIHsKICAgIE1vbml0b3JEb3QgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN3Y0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDEyLjMwN1YxNWEyIDIgMCAwIDEtMiAySDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoOC42OTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAyMWg4IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTkiLCBjeTogIjYiLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vbml0b3ItZG93bi5qcwp2YXIgTW9uaXRvckRvd247CnZhciBpbml0X21vbml0b3JfZG93biA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW9uaXRvci1kb3duLmpzIigpIHsKICAgIE1vbml0b3JEb3duID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTNWNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxMC0zIDMtMy0zIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTQiLCB4OiAiMiIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAyMWg4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW9uaXRvci1vZmYuanMKdmFyIE1vbml0b3JPZmY7CnZhciBpbml0X21vbml0b3Jfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb25pdG9yLW9mZi5qcyIoKSB7CiAgICBNb25pdG9yT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTd2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxN0g0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMS4xODQtMS44MjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjFoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjY1NiAzSDIwYTIgMiAwIDAgMSAyIDJ2MTBhMiAyIDAgMCAxLS4yOTMgMS4wNDIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb25pdG9yLXBhdXNlLmpzCnZhciBNb25pdG9yUGF1c2U7CnZhciBpbml0X21vbml0b3JfcGF1c2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vbml0b3ItcGF1c2UuanMiKCkgewogICAgTW9uaXRvclBhdXNlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTNWNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxM1Y3IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTQiLCB4OiAiMiIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAyMWg4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW9uaXRvci1wbGF5LmpzCnZhciBNb25pdG9yUGxheTsKdmFyIGluaXRfbW9uaXRvcl9wbGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb25pdG9yLXBsYXkuanMiKCkgewogICAgTW9uaXRvclBsYXkgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNS4wMzMgOS40NGEuNjQ3LjY0NyAwIDAgMSAwIDEuMTJsLTQuMDY1IDIuMzUyYS42NDUuNjQ1IDAgMCAxLS45NjgtLjU2VjcuNjQ4YS42NDUuNjQ1IDAgMCAxIC45NjctLjU2eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN3Y0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjFoOCIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjIiLCB5OiAiMyIsIHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxNCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vbml0b3Itc21hcnRwaG9uZS5qcwp2YXIgTW9uaXRvclNtYXJ0cGhvbmU7CnZhciBpbml0X21vbml0b3Jfc21hcnRwaG9uZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW9uaXRvci1zbWFydHBob25lLmpzIigpIHsKICAgIE1vbml0b3JTbWFydHBob25lID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggOFY2YTIgMiAwIDAgMC0yLTJINGEyIDIgMCAwIDAtMiAydjdhMiAyIDAgMCAwIDIgMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE5di0zLjk2IDMuMTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxOWg1IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjYiLCBoZWlnaHQ6ICIxMCIsIHg6ICIxNiIsIHk6ICIxMiIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vbml0b3Itc3BlYWtlci5qcwp2YXIgTW9uaXRvclNwZWFrZXI7CnZhciBpbml0X21vbml0b3Jfc3BlYWtlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW9uaXRvci1zcGVha2VyLmpzIigpIHsKICAgIE1vbml0b3JTcGVha2VyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNS41IDIwSDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgOWguMDEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTAiLCBoZWlnaHQ6ICIxNiIsIHg6ICIxMiIsIHk6ICI0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggNkg0YTIgMiAwIDAgMC0yIDJ2NmEyIDIgMCAwIDAgMiAyaDQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNyIsIGN5OiAiMTUiLCByOiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vbml0b3Itc3RvcC5qcwp2YXIgTW9uaXRvclN0b3A7CnZhciBpbml0X21vbml0b3Jfc3RvcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW9uaXRvci1zdG9wLmpzIigpIHsKICAgIE1vbml0b3JTdG9wID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTd2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIxaDgiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjMiLCB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTQiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI5IiwgeTogIjciLCB3aWR0aDogIjYiLCBoZWlnaHQ6ICI2Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW9uaXRvci11cC5qcwp2YXIgTW9uaXRvclVwOwp2YXIgaW5pdF9tb25pdG9yX3VwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb25pdG9yLXVwLmpzIigpIHsKICAgIE1vbml0b3JVcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTAgMy0zIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxM1Y3IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTQiLCB4OiAiMiIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAyMWg4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW9uaXRvci14LmpzCnZhciBNb25pdG9yWDsKdmFyIGluaXRfbW9uaXRvcl94ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb25pdG9yLXguanMiKCkgewogICAgTW9uaXRvclggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC41IDEyLjUtNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkuNSAxMi41IDUtNSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE0IiwgeDogIjIiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN3Y0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjFoOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vbml0b3IuanMKdmFyIE1vbml0b3I7CnZhciBpbml0X21vbml0b3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vbml0b3IuanMiKCkgewogICAgTW9uaXRvciA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTQiLCB4OiAiMiIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjgiLCB4MjogIjE2IiwgeTE6ICIyMSIsIHkyOiAiMjEiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICIxNyIsIHkyOiAiMjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb29uLXN0YXIuanMKdmFyIE1vb25TdGFyOwp2YXIgaW5pdF9tb29uX3N0YXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vb24tc3Rhci5qcyIoKSB7CiAgICBNb29uU3RhciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDVoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAzdjQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAuOTg1IDEyLjQ4NmE5IDkgMCAxIDEtOS40NzMtOS40NzJjLjQwNS0uMDIyLjYxNy40Ni40MDIuODAzYTYgNiAwIDAgMCA4LjI2OCA4LjI2OGMuMzQ0LS4yMTUuODI1LS4wMDQuODAzLjQwMSIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vb24uanMKdmFyIE1vb247CnZhciBpbml0X21vb24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vb24uanMiKCkgewogICAgTW9vbiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwLjk4NSAxMi40ODZhOSA5IDAgMSAxLTkuNDczLTkuNDcyYy40MDUtLjAyMi42MTcuNDYuNDAyLjgwM2E2IDYgMCAwIDAgOC4yNjggOC4yNjhjLjM0NC0uMjE1LjgyNS0uMDA0LjgwMy40MDEiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3RvcmJpa2UuanMKdmFyIE1vdG9yYmlrZTsKdmFyIGluaXRfbW90b3JiaWtlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3RvcmJpa2UuanMiKCkgewogICAgTW90b3JiaWtlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMTQtMS0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgOSA2IDJhMiAyIDAgMCAxIDItMmgyYTIgMiAwIDAgMSAxLjk5IDEuODEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxN2gzYTEgMSAwIDAgMCAxLTEgNiA2IDAgMCAxIDYtNiAxIDEgMCAwIDAgMS0xdi0uNzVBNSA1IDAgMCAwIDE3IDUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiMTciLCByOiAiMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjE3IiwgcjogIjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3VudGFpbi1zbm93LmpzCnZhciBNb3VudGFpblNub3c7CnZhciBpbml0X21vdW50YWluX3Nub3cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdW50YWluLXNub3cuanMiKCkgewogICAgTW91bnRhaW5Tbm93ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAzIDQgOCA1LTUgNSAxNUgyTDggM3oiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC4xNCAxNS4wOGMyLjYyLTEuNTcgNS4yNC0xLjQzIDcuODYuNDIgMi43NCAxLjk0IDUuNDkgMiA4LjIzLjE5IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW91bnRhaW4uanMKdmFyIE1vdW50YWluOwp2YXIgaW5pdF9tb3VudGFpbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW91bnRhaW4uanMiKCkgewogICAgTW91bnRhaW4gPSBbWyJwYXRoIiwgeyBkOiAibTggMyA0IDggNS01IDUgMTVIMkw4IDN6IiB9XV07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdXNlLWxlZnQuanMKdmFyIE1vdXNlTGVmdDsKdmFyIGluaXRfbW91c2VfbGVmdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW91c2UtbGVmdC5qcyIoKSB7CiAgICBNb3VzZUxlZnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA3LjMxOFYxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDEwdjVhNyA3IDAgMCAwIDE0IDBWOWMwLTMuNTI3LTIuNjA4LTYuNTE1LTYtNyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjciLCBjeTogIjQiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdXNlLW9mZi5qcwp2YXIgTW91c2VPZmY7CnZhciBpbml0X21vdXNlX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW91c2Utb2ZmLmpzIigpIHsKICAgIE1vdXNlT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNnYuMzQzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4LjIxOCAxOC4yMThBNyA3IDAgMCAxIDUgMTVWOWE3IDcgMCAwIDEgLjc4Mi0zLjIxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxMy4zNDNWOUE3IDcgMCAwIDAgOC41NiAyLjkwMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAyMiAyIDIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3VzZS1wb2ludGVyLTItb2ZmLmpzCnZhciBNb3VzZVBvaW50ZXIyT2ZmOwp2YXIgaW5pdF9tb3VzZV9wb2ludGVyXzJfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3VzZS1wb2ludGVyLTItb2ZmLmpzIigpIHsKICAgIE1vdXNlUG9pbnRlcjJPZmYgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xNS41NSA4LjQ1IDUuMTM4IDIuMDg3YS41LjUgMCAwIDEtLjA2My45NDdsLTYuMTI0IDEuNThhMiAyIDAgMCAwLTEuNDM4IDEuNDM1bC0xLjU3OSA2LjEyNmEuNS41IDAgMCAxLS45NDcuMDYzTDguNDUgMTUuNTUxIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDIgMiAyMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02LjgxNiAxMS41MjgtMi43NzktNi44NGEuNDk1LjQ5NSAwIDAgMSAuNjUxLS42NTFsNi44NCAyLjc3OSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdXNlLXBvaW50ZXItMi5qcwp2YXIgTW91c2VQb2ludGVyMjsKdmFyIGluaXRfbW91c2VfcG9pbnRlcl8yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3VzZS1wb2ludGVyLTIuanMiKCkgewogICAgTW91c2VQb2ludGVyMiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQuMDM3IDQuNjg4YS40OTUuNDk1IDAgMCAxIC42NTEtLjY1MWwxNiA2LjVhLjUuNSAwIDAgMS0uMDYzLjk0N2wtNi4xMjQgMS41OGEyIDIgMCAwIDAtMS40MzggMS40MzVsLTEuNTc5IDYuMTI2YS41LjUgMCAwIDEtLjk0Ny4wNjN6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW91c2UtcG9pbnRlci1iYW4uanMKdmFyIE1vdXNlUG9pbnRlckJhbjsKdmFyIGluaXRfbW91c2VfcG9pbnRlcl9iYW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdXNlLXBvaW50ZXItYmFuLmpzIigpIHsKICAgIE1vdXNlUG9pbnRlckJhbiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuMDM0IDIuNjgxYS40OTguNDk4IDAgMCAxIC42NDctLjY0N2w5IDMuNWEuNS41IDAgMCAxLS4wMzMuOTQ0TDguMjA0IDcuNTQ1YTEgMSAwIDAgMC0uNjYuNjZsLTEuMDY2IDMuNDQzYS41LjUgMCAwIDEtLjk0NC4wMzN6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYiLCBjeTogIjE2IiwgcjogIjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTEuOCAxMS44IDguNCA4LjQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3VzZS1wb2ludGVyLWNsaWNrLmpzCnZhciBNb3VzZVBvaW50ZXJDbGljazsKdmFyIGluaXRfbW91c2VfcG9pbnRlcl9jbGljayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW91c2UtcG9pbnRlci1jbGljay5qcyIoKSB7CiAgICBNb3VzZVBvaW50ZXJDbGljayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDQuMSAxMiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTUuMSA4LTIuOS0uOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02IDEyLTEuOSAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcuMiAyLjIgOCA1LjEiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOS4wMzcgOS42OWEuNDk4LjQ5OCAwIDAgMSAuNjUzLS42NTNsMTEgNC41YS41LjUgMCAwIDEtLjA3NC45NDlsLTQuMzQ5IDEuMDQxYTEgMSAwIDAgMC0uNzQuNzM5bC0xLjA0IDQuMzVhLjUuNSAwIDAgMS0uOTUuMDc0eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdXNlLXBvaW50ZXIuanMKdmFyIE1vdXNlUG9pbnRlcjsKdmFyIGluaXRfbW91c2VfcG9pbnRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW91c2UtcG9pbnRlci5qcyIoKSB7CiAgICBNb3VzZVBvaW50ZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMi41ODYgMTIuNTg2IDE5IDE5IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMuNjg4IDMuMDM3YS40OTcuNDk3IDAgMCAwLS42NTEuNjUxbDYuNSAxNS45OTlhLjUwMS41MDEgMCAwIDAgLjk0Ny0uMDYybDEuNTY5LTYuMDgzYTIgMiAwIDAgMSAxLjQ0OC0xLjQ3OWw2LjEyNC0xLjU3OWEuNS41IDAgMCAwIC4wNjMtLjk0N3oiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3VzZS1yaWdodC5qcwp2YXIgTW91c2VSaWdodDsKdmFyIGluaXRfbW91c2VfcmlnaHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdXNlLXJpZ2h0LmpzIigpIHsKICAgIE1vdXNlUmlnaHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA3LjMxOFYxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxMHY1YTcgNyAwIDAgMS0xNCAwVjljMC0zLjUyNyAyLjYwOC02LjUxNSA2LTciIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNyIsIGN5OiAiNCIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW92ZS0zZC5qcwp2YXIgTW92ZTNkOwp2YXIgaW5pdF9tb3ZlXzNkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3ZlLTNkLmpzIigpIHsKICAgIE1vdmUzZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgM3YxNmgxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01IDE5IDYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDYgMy0zIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOCAxNiAzIDMtMyAzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW91c2UuanMKdmFyIE1vdXNlOwp2YXIgaW5pdF9tb3VzZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW91c2UuanMiKCkgewogICAgTW91c2UgPSBbCiAgICAgIFsicmVjdCIsIHsgeDogIjUiLCB5OiAiMiIsIHdpZHRoOiAiMTQiLCBoZWlnaHQ6ICIyMCIsIHJ4OiAiNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2djQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3ZlLWRpYWdvbmFsLTIuanMKdmFyIE1vdmVEaWFnb25hbDI7CnZhciBpbml0X21vdmVfZGlhZ29uYWxfMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW92ZS1kaWFnb25hbC0yLmpzIigpIHsKICAgIE1vdmVEaWFnb25hbDIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxM3Y2aC02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTFWNWg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTUgNSAxNCAxNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdmUtZGlhZ29uYWwuanMKdmFyIE1vdmVEaWFnb25hbDsKdmFyIGluaXRfbW92ZV9kaWFnb25hbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW92ZS1kaWFnb25hbC5qcyIoKSB7CiAgICBNb3ZlRGlhZ29uYWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxOUg1di02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDVoNnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDUgNSAxOSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdmUtZG93bi1yaWdodC5qcwp2YXIgTW92ZURvd25SaWdodDsKdmFyIGluaXRfbW92ZV9kb3duX3JpZ2h0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3ZlLWRvd24tcmlnaHQuanMiKCkgewogICAgTW92ZURvd25SaWdodCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDEzVjE5SDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgNUwxOSAxOSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdmUtZG93bi1sZWZ0LmpzCnZhciBNb3ZlRG93bkxlZnQ7CnZhciBpbml0X21vdmVfZG93bl9sZWZ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3ZlLWRvd24tbGVmdC5qcyIoKSB7CiAgICBNb3ZlRG93bkxlZnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxOUg1VjEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDVMNSAxOSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdmUtZG93bi5qcwp2YXIgTW92ZURvd247CnZhciBpbml0X21vdmVfZG93biA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW92ZS1kb3duLmpzIigpIHsKICAgIE1vdmVEb3duID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxOEwxMiAyMkwxNiAxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyVjIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW92ZS1ob3Jpem9udGFsLmpzCnZhciBNb3ZlSG9yaXpvbnRhbDsKdmFyIGluaXRfbW92ZV9ob3Jpem9udGFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3ZlLWhvcml6b250YWwuanMiKCkgewogICAgTW92ZUhvcml6b250YWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOCA4IDQgNC00IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmgyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02IDgtNCA0IDQgNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdmUtcmlnaHQuanMKdmFyIE1vdmVSaWdodDsKdmFyIGluaXRfbW92ZV9yaWdodCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW92ZS1yaWdodC5qcyIoKSB7CiAgICBNb3ZlUmlnaHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA4TDIyIDEyTDE4IDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJIMjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3ZlLWxlZnQuanMKdmFyIE1vdmVMZWZ0Owp2YXIgaW5pdF9tb3ZlX2xlZnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdmUtbGVmdC5qcyIoKSB7CiAgICBNb3ZlTGVmdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgOEwyIDEyTDYgMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMkgyMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdmUtdXAtbGVmdC5qcwp2YXIgTW92ZVVwTGVmdDsKdmFyIGluaXRfbW92ZV91cF9sZWZ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3ZlLXVwLWxlZnQuanMiKCkgewogICAgTW92ZVVwTGVmdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTFWNUgxMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDVMMTkgMTkiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3ZlLXVwLXJpZ2h0LmpzCnZhciBNb3ZlVXBSaWdodDsKdmFyIGluaXRfbW92ZV91cF9yaWdodCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW92ZS11cC1yaWdodC5qcyIoKSB7CiAgICBNb3ZlVXBSaWdodCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDVIMTlWMTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgNUw1IDE5IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW92ZS11cC5qcwp2YXIgTW92ZVVwOwp2YXIgaW5pdF9tb3ZlX3VwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3ZlLXVwLmpzIigpIHsKICAgIE1vdmVVcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggNkwxMiAyTDE2IDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMlYyMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdmUtdmVydGljYWwuanMKdmFyIE1vdmVWZXJ0aWNhbDsKdmFyIGluaXRfbW92ZV92ZXJ0aWNhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbW92ZS12ZXJ0aWNhbC5qcyIoKSB7CiAgICBNb3ZlVmVydGljYWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggMTggNCA0IDQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDYgNC00IDQgNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdmUuanMKdmFyIE1vdmU7CnZhciBpbml0X21vdmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdmUuanMiKCkgewogICAgTW92ZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgMTktMyAzLTMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOSA5IDMgMy0zIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmgyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01IDktMyAzIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDUgMy0zIDMgMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL211c2ljLTIuanMKdmFyIE11c2ljMjsKdmFyIGluaXRfbXVzaWNfMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbXVzaWMtMi5qcyIoKSB7CiAgICBNdXNpYzIgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjgiLCBjeTogIjE4IiwgcjogIjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMThWMmw3IDQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tdXNpYy0zLmpzCnZhciBNdXNpYzM7CnZhciBpbml0X211c2ljXzMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL211c2ljLTMuanMiKCkgewogICAgTXVzaWMzID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTgiLCByOiAiNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxOFYyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbXVzaWMtNC5qcwp2YXIgTXVzaWM0Owp2YXIgaW5pdF9tdXNpY180ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9tdXNpYy00LmpzIigpIHsKICAgIE11c2ljNCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMThWNWwxMi0ydjEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgOSAxMi0yIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNiIsIGN5OiAiMTgiLCByOiAiMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICIxNiIsIHI6ICIzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbXVzaWMuanMKdmFyIE11c2ljOwp2YXIgaW5pdF9tdXNpYyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbXVzaWMuanMiKCkgewogICAgTXVzaWMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE4VjVsMTItMnYxMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYiLCBjeTogIjE4IiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiMTYiLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL25hdmlnYXRpb24tMi1vZmYuanMKdmFyIE5hdmlnYXRpb24yT2ZmOwp2YXIgaW5pdF9uYXZpZ2F0aW9uXzJfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9uYXZpZ2F0aW9uLTItb2ZmLmpzIigpIHsKICAgIE5hdmlnYXRpb24yT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOS4zMSA5LjMxIDUgMjFsNy00IDcgNC0xLjE3LTMuMTciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQuNTMgOC44OCAxMiAybC0xLjE3IDMuMTciIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMiIsIHgyOiAiMjIiLCB5MTogIjIiLCB5MjogIjIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbmF2aWdhdGlvbi0yLmpzCnZhciBOYXZpZ2F0aW9uMjsKdmFyIGluaXRfbmF2aWdhdGlvbl8yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9uYXZpZ2F0aW9uLTIuanMiKCkgewogICAgTmF2aWdhdGlvbjIgPSBbWyJwb2x5Z29uIiwgeyBwb2ludHM6ICIxMiAyIDE5IDIxIDEyIDE3IDUgMjEgMTIgMiIgfV1dOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9uYXZpZ2F0aW9uLW9mZi5qcwp2YXIgTmF2aWdhdGlvbk9mZjsKdmFyIGluaXRfbmF2aWdhdGlvbl9vZmYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL25hdmlnYXRpb24tb2ZmLmpzIigpIHsKICAgIE5hdmlnYXRpb25PZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjQzIDguNDMgMyAxMWw4IDIgMiA4IDIuNTctNS40MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy4zOSAxMS43MyAyMiAybC05LjczIDQuNjEiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMiIsIHgyOiAiMjIiLCB5MTogIjIiLCB5MjogIjIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbmF2aWdhdGlvbi5qcwp2YXIgTmF2aWdhdGlvbjsKdmFyIGluaXRfbmF2aWdhdGlvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbmF2aWdhdGlvbi5qcyIoKSB7CiAgICBOYXZpZ2F0aW9uID0gW1sicG9seWdvbiIsIHsgcG9pbnRzOiAiMyAxMSAyMiAyIDEzIDIxIDExIDEzIDMgMTEiIH1dXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbmV0d29yay5qcwp2YXIgTmV0d29yazsKdmFyIGluaXRfbmV0d29yazIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL25ldHdvcmsuanMiKCkgewogICAgTmV0d29yayA9IFsKICAgICAgWyJyZWN0IiwgeyB4OiAiMTYiLCB5OiAiMTYiLCB3aWR0aDogIjYiLCBoZWlnaHQ6ICI2Iiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMiIsIHk6ICIxNiIsIHdpZHRoOiAiNiIsIGhlaWdodDogIjYiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI5IiwgeTogIjIiLCB3aWR0aDogIjYiLCBoZWlnaHQ6ICI2Iiwgcng6ICIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTZ2LTNhMSAxIDAgMCAxIDEtMWgxMmExIDEgMCAwIDEgMSAxdjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJWOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL25mYy5qcwp2YXIgTmZjOwp2YXIgaW5pdF9uZmMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL25mYy5qcyIoKSB7CiAgICBOZmMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDguMzJhNy40MyA3LjQzIDAgMCAxIDAgNy4zNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjQ2IDYuMjFhMTEuNzYgMTEuNzYgMCAwIDEgMCAxMS41OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMi45MSA0LjFhMTUuOTEgMTUuOTEgMCAwIDEgLjAxIDE1LjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYuMzcgMmEyMC4xNiAyMC4xNiAwIDAgMSAwIDIwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbmV3c3BhcGVyLmpzCnZhciBOZXdzcGFwZXI7CnZhciBpbml0X25ld3NwYXBlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbmV3c3BhcGVyLmpzIigpIHsKICAgIE5ld3NwYXBlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDE4aC01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE0aC04IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQgMjJoMTZhMiAyIDAgMCAwIDItMlY0YTIgMiAwIDAgMC0yLTJIOGEyIDIgMCAwIDAtMiAydjE2YTIgMiAwIDAgMS00IDB2LTlhMiAyIDAgMCAxIDItMmgyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICI0IiwgeDogIjEwIiwgeTogIjYiLCByeDogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ub24tYmluYXJ5LmpzCnZhciBOb25CaW5hcnk7CnZhciBpbml0X25vbl9iaW5hcnkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL25vbi1iaW5hcnkuanMiKCkgewogICAgTm9uQmluYXJ5ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnYxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04LjUgNCA3IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOC41IDggNy00IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjE3IiwgcjogIjUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ub3RlYm9vay1wZW4uanMKdmFyIE5vdGVib29rUGVuOwp2YXIgaW5pdF9ub3RlYm9va19wZW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL25vdGVib29rLXBlbi5qcyIoKSB7CiAgICBOb3RlYm9va1BlbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjQgMkg2YTIgMiAwIDAgMC0yIDJ2MTZhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0ydi03LjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA2aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTRoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE4aDQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEuMzc4IDUuNjI2YTEgMSAwIDEgMC0zLjAwNC0zLjAwNGwtNS4wMSA1LjAxMmEyIDIgMCAwIDAtLjUwNi44NTRsLS44MzcgMi44N2EuNS41IDAgMCAwIC42Mi42MmwyLjg3LS44MzdhMiAyIDAgMCAwIC44NTQtLjUwNnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ub3RlYm9vay10YWJzLmpzCnZhciBOb3RlYm9va1RhYnM7CnZhciBpbml0X25vdGVib29rX3RhYnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL25vdGVib29rLXRhYnMuanMiKCkgewogICAgTm90ZWJvb2tUYWJzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA2aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTRoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE4aDQiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTYiLCBoZWlnaHQ6ICIyMCIsIHg6ICI0IiwgeTogIjIiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMnYyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA3aDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTJoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxN2g1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbm90ZWJvb2stdGV4dC5qcwp2YXIgTm90ZWJvb2tUZXh0Owp2YXIgaW5pdF9ub3RlYm9va190ZXh0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ub3RlYm9vay10ZXh0LmpzIigpIHsKICAgIE5vdGVib29rVGV4dCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgNmg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTBoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE0aDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxOGg0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE2IiwgaGVpZ2h0OiAiMjAiLCB4OiAiNCIsIHk6ICIyIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuNSA4aDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS41IDEySDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuNSAxNkgxNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL25vdGVwYWQtdGV4dC1kYXNoZWQuanMKdmFyIE5vdGVwYWRUZXh0RGFzaGVkOwp2YXIgaW5pdF9ub3RlcGFkX3RleHRfZGFzaGVkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ub3RlcGFkLXRleHQtZGFzaGVkLmpzIigpIHsKICAgIE5vdGVwYWRUZXh0RGFzaGVkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA0aDJhMiAyIDAgMCAxIDIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDEydjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTh2MmEyIDIgMCAwIDEtMiAyaC0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDIyaC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjJINmEyIDIgMCAwIDEtMi0ydi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTR2LTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA4VjZhMiAyIDAgMCAxIDItMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTBoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE0aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxOGg1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbm90ZXBhZC10ZXh0LmpzCnZhciBOb3RlcGFkVGV4dDsKdmFyIGluaXRfbm90ZXBhZF90ZXh0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ub3RlcGFkLXRleHQuanMiKCkgewogICAgTm90ZXBhZFRleHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMnY0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE2IiwgaGVpZ2h0OiAiMTgiLCB4OiAiNCIsIHk6ICI0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTBoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE0aDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxOGg1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbm90ZWJvb2suanMKdmFyIE5vdGVib29rOwp2YXIgaW5pdF9ub3RlYm9vayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbm90ZWJvb2suanMiKCkgewogICAgTm90ZWJvb2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDZoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEwaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxNGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMThoNCIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNiIsIGhlaWdodDogIjIwIiwgeDogIjQiLCB5OiAiMiIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAydjIwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbnV0LW9mZi5qcwp2YXIgTnV0T2ZmOwp2YXIgaW5pdF9udXRfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9udXQtb2ZmLmpzIigpIHsKICAgIE51dE9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDRWMiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk01IDEwdjRhNy4wMDQgNy4wMDQgMCAwIDAgNS4yNzcgNi43ODdjLjQxMi4xMDQuODAyLjI5MiAxLjEwMi41OTJMMTIgMjJsLjYyMS0uNjIxYy4zLS4zLjY5LS40ODggMS4xMDItLjU5MmE3LjAxIDcuMDEgMCAwIDAgNC4xMjUtMi45MzkiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMTB2My4zNDMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTIgMTJjLTEuMzQ5LS41NzMtMS45MDUtMS4wMDUtMi41LTItLjU0Ni45MDItMS4wNDggMS4zNTMtMi41IDItMS4wMTgtLjY0NC0xLjQ2LTEuMDgtMi0yLTEuMDI4LjcxLTEuNjkuOTE4LTMgMSAxLjA4MS0xLjA0OCAxLjc1Ny0yLjAzIDItMyAuMTk0LS43NzYuODQtMS41NTEgMS43OS0yLjIxbTExLjY1NCA1Ljk5N2MuODg3LS40NTcgMS4yOC0uODkxIDEuNTU2LTEuNzg3IDEuMDMyLjkxNiAxLjY4MyAxLjE1NyAzIDEtMS4yOTctMS4wMzYtMS43NTgtMi4wMy0yLTMtLjUtMi00LTQtOC00LS43NCAwLTEuNDYxLjA2OC0yLjE1LjE5MiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIyIiwgeDI6ICIyMiIsIHkxOiAiMiIsIHkyOiAiMjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9vY3RhZ29uLW1pbnVzLmpzCnZhciBPY3RhZ29uTWludXM7CnZhciBpbml0X29jdGFnb25fbWludXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL29jdGFnb24tbWludXMuanMiKCkgewogICAgT2N0YWdvbk1pbnVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMi41ODYgMTYuNzI2QTIgMiAwIDAgMSAyIDE1LjMxMlY4LjY4OGEyIDIgMCAwIDEgLjU4Ni0xLjQxNGw0LjY4OC00LjY4OEEyIDIgMCAwIDEgOC42ODggMmg2LjYyNGEyIDIgMCAwIDEgMS40MTQuNTg2bDQuNjg4IDQuNjg4QTIgMiAwIDAgMSAyMiA4LjY4OHY2LjYyNGEyIDIgMCAwIDEtLjU4NiAxLjQxNGwtNC42ODggNC42ODhhMiAyIDAgMCAxLTEuNDE0LjU4Nkg4LjY4OGEyIDIgMCAwIDEtMS40MTQtLjU4NnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmg4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbnV0LmpzCnZhciBOdXQ7CnZhciBpbml0X251dCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvbnV0LmpzIigpIHsKICAgIE51dCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDRWMiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk01IDEwdjRhNy4wMDQgNy4wMDQgMCAwIDAgNS4yNzcgNi43ODdjLjQxMi4xMDQuODAyLjI5MiAxLjEwMi41OTJMMTIgMjJsLjYyMS0uNjIxYy4zLS4zLjY5LS40ODggMS4xMDItLjU5MkE3LjAwMyA3LjAwMyAwIDAgMCAxOSAxNHYtNCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMiA0QzggNCA0LjUgNiA0IDhjLS4yNDMuOTctLjkxOSAxLjk1Mi0yIDMgMS4zMS0uMDgyIDEuOTcyLS4yOSAzLTEgLjU0LjkyLjk4MiAxLjM1NiAyIDIgMS40NTItLjY0NyAxLjk1NC0xLjA5OCAyLjUtMiAuNTk1Ljk5NSAxLjE1MSAxLjQyNyAyLjUgMiAxLjMxLS42MjEgMS44NjItMS4wNTggMi41LTIgLjYyOS45NzcgMS4xNjIgMS40MjMgMi41IDIgMS4yMDktLjU0OCAxLjY4LS45NjcgMi0yIDEuMDMyLjkxNiAxLjY4MyAxLjE1NyAzIDEtMS4yOTctMS4wMzYtMS43NTgtMi4wMy0yLTMtLjUtMi00LTQtOC00WiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL29jdGFnb24tYWxlcnQuanMKdmFyIE9jdGFnb25BbGVydDsKdmFyIGluaXRfb2N0YWdvbl9hbGVydCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvb2N0YWdvbi1hbGVydC5qcyIoKSB7CiAgICBPY3RhZ29uQWxlcnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOHY0IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE1LjMxMiAyYTIgMiAwIDAgMSAxLjQxNC41ODZsNC42ODggNC42ODhBMiAyIDAgMCAxIDIyIDguNjg4djYuNjI0YTIgMiAwIDAgMS0uNTg2IDEuNDE0bC00LjY4OCA0LjY4OGEyIDIgMCAwIDEtMS40MTQuNTg2SDguNjg4YTIgMiAwIDAgMS0xLjQxNC0uNTg2bC00LjY4OC00LjY4OEEyIDIgMCAwIDEgMiAxNS4zMTJWOC42ODhhMiAyIDAgMCAxIC41ODYtMS40MTRsNC42ODgtNC42ODhBMiAyIDAgMCAxIDguNjg4IDJ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvb2N0YWdvbi1wYXVzZS5qcwp2YXIgT2N0YWdvblBhdXNlOwp2YXIgaW5pdF9vY3RhZ29uX3BhdXNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9vY3RhZ29uLXBhdXNlLmpzIigpIHsKICAgIE9jdGFnb25QYXVzZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE1VjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTVWOSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yLjU4NiAxNi43MjZBMiAyIDAgMCAxIDIgMTUuMzEyVjguNjg4YTIgMiAwIDAgMSAuNTg2LTEuNDE0bDQuNjg4LTQuNjg4QTIgMiAwIDAgMSA4LjY4OCAyaDYuNjI0YTIgMiAwIDAgMSAxLjQxNC41ODZsNC42ODggNC42ODhBMiAyIDAgMCAxIDIyIDguNjg4djYuNjI0YTIgMiAwIDAgMS0uNTg2IDEuNDE0bC00LjY4OCA0LjY4OGEyIDIgMCAwIDEtMS40MTQuNTg2SDguNjg4YTIgMiAwIDAgMS0xLjQxNC0uNTg2eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL29jdGFnb24teC5qcwp2YXIgT2N0YWdvblg7CnZhciBpbml0X29jdGFnb25feCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvb2N0YWdvbi14LmpzIigpIHsKICAgIE9jdGFnb25YID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgOS02IDYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMi41ODYgMTYuNzI2QTIgMiAwIDAgMSAyIDE1LjMxMlY4LjY4OGEyIDIgMCAwIDEgLjU4Ni0xLjQxNGw0LjY4OC00LjY4OEEyIDIgMCAwIDEgOC42ODggMmg2LjYyNGEyIDIgMCAwIDEgMS40MTQuNTg2bDQuNjg4IDQuNjg4QTIgMiAwIDAgMSAyMiA4LjY4OHY2LjYyNGEyIDIgMCAwIDEtLjU4NiAxLjQxNGwtNC42ODggNC42ODhhMiAyIDAgMCAxLTEuNDE0LjU4Nkg4LjY4OGEyIDIgMCAwIDEtMS40MTQtLjU4NnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSA5IDYgNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL29jdGFnb24uanMKdmFyIE9jdGFnb247CnZhciBpbml0X29jdGFnb24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL29jdGFnb24uanMiKCkgewogICAgT2N0YWdvbiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIuNTg2IDE2LjcyNkEyIDIgMCAwIDEgMiAxNS4zMTJWOC42ODhhMiAyIDAgMCAxIC41ODYtMS40MTRsNC42ODgtNC42ODhBMiAyIDAgMCAxIDguNjg4IDJoNi42MjRhMiAyIDAgMCAxIDEuNDE0LjU4Nmw0LjY4OCA0LjY4OEEyIDIgMCAwIDEgMjIgOC42ODh2Ni42MjRhMiAyIDAgMCAxLS41ODYgMS40MTRsLTQuNjg4IDQuNjg4YTIgMiAwIDAgMS0xLjQxNC41ODZIOC42ODhhMiAyIDAgMCAxLTEuNDE0LS41ODZ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvb21lZ2EuanMKdmFyIE9tZWdhOwp2YXIgaW5pdF9vbWVnYSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvb21lZ2EuanMiKCkgewogICAgT21lZ2EgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0zIDIwaDQuNWEuNS41IDAgMCAwIC41LS41di0uMjgyYS41Mi41MiAwIDAgMC0uMjQ3LS40MzcgOCA4IDAgMSAxIDguNDk0LS4wMDEuNTIuNTIgMCAwIDAtLjI0Ny40Mzh2LjI4MmEuNS41IDAgMCAwIC41LjVIMjEiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9vcHRpb24uanMKdmFyIE9wdGlvbjsKdmFyIGluaXRfb3B0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9vcHRpb24uanMiKCkgewogICAgT3B0aW9uID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzaDZsNiAxOGg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDNoNyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL29yYml0LmpzCnZhciBPcmJpdDsKdmFyIGluaXRfb3JiaXQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL29yYml0LmpzIigpIHsKICAgIE9yYml0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAuMzQxIDYuNDg0QTEwIDEwIDAgMCAxIDEwLjI2NiAyMS44NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zLjY1OSAxNy41MTZBMTAgMTAgMCAwIDEgMTMuNzQgMi4xNTIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE5IiwgY3k6ICI1IiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI1IiwgY3k6ICIxOSIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvb3JpZ2FtaS5qcwp2YXIgT3JpZ2FtaTsKdmFyIGluaXRfb3JpZ2FtaSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvb3JpZ2FtaS5qcyIoKSB7CiAgICBPcmlnYW1pID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJWNGExIDEgMCAwIDEgMS0xaDYuMjk3YTEgMSAwIDAgMSAuNjUxIDEuNzU5bC00LjY5NiA0LjAyNSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAibTEyIDIxLTcuNDE0LTcuNDE0QTIgMiAwIDAgMSA0IDEyLjE3MlY2LjQxNWExLjAwMiAxLjAwMiAwIDAgMSAxLjcwNy0uNzA3TDIwIDIwLjAwOSIgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTIuMjE0IDMuMzgxIDguNDE0IDE0Ljk2NmExIDEgMCAwIDEtLjE2NyAxLjE5OWwtMS4xNjggMS4xNjNhMSAxIDAgMCAxLS43MDYuMjkxSDYuMzUxYTEgMSAwIDAgMS0uNjI1LS4yMTlMMy4yNSAxOC44YTEgMSAwIDAgMSAuNjMxLTEuNzgxbDQuMTY1LjAyNyIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhY2thZ2UtMi5qcwp2YXIgUGFja2FnZTI7CnZhciBpbml0X3BhY2thZ2VfMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFja2FnZS0yLmpzIigpIHsKICAgIFBhY2thZ2UyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgM3Y2IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE2Ljc2IDNhMiAyIDAgMCAxIDEuOCAxLjFsMi4yMyA0LjQ3OWEyIDIgMCAwIDEgLjIxLjg5MVYxOWEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMlY5LjQ3MmEyIDIgMCAwIDEgLjIxMS0uODk0TDUuNDUgNC4xQTIgMiAwIDAgMSA3LjI0IDN6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuMDU0IDkuMDEzaDE3Ljg5MyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhY2thZ2UtY2hlY2suanMKdmFyIFBhY2thZ2VDaGVjazsKdmFyIGluaXRfcGFja2FnZV9jaGVjayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFja2FnZS1jaGVjay5qcyIoKSB7CiAgICBQYWNrYWdlQ2hlY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMlYxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAxNyAyIDIgNC00IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxIDExLjEyN1Y4YTIgMiAwIDAgMC0xLTEuNzNsLTctNGEyIDIgMCAwIDAtMiAwbC03IDRBMiAyIDAgMCAwIDMgOHY4YTIgMiAwIDAgMCAxIDEuNzI5bDcgNGEyIDIgMCAwIDAgMiAuMDAxbDEuMzItLjc1MyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zLjI5IDcgMTIgMTJsOC43MS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcuNSA0LjI3IDguOTk3IDUuMTQ4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFja2FnZS1taW51cy5qcwp2YXIgUGFja2FnZU1pbnVzOwp2YXIgaW5pdF9wYWNrYWdlX21pbnVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYWNrYWdlLW1pbnVzLmpzIigpIHsKICAgIFBhY2thZ2VNaW51cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIyVjEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE3aDYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEgMTNWOGEyIDIgMCAwIDAtMS0xLjczbC03LTRhMiAyIDAgMCAwLTIgMGwtNyA0QTIgMiAwIDAgMCAzIDh2OGEyIDIgMCAwIDAgMSAxLjcyOWw3IDRhMiAyIDAgMCAwIDIgLjAwMWwxLjY3NS0uOTU1IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuMjkgNyAxMiAxMmw4LjcxLTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNy41IDQuMjcgOC45OTcgNS4xNDgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYWNrYWdlLW9wZW4uanMKdmFyIFBhY2thZ2VPcGVuOwp2YXIgaW5pdF9wYWNrYWdlX29wZW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhY2thZ2Utb3Blbi5qcyIoKSB7CiAgICBQYWNrYWdlT3BlbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIydi05IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE1LjE3IDIuMjFhMS42NyAxLjY3IDAgMCAxIDEuNjMgMEwyMSA0LjU3YTEuOTMgMS45MyAwIDAgMSAwIDMuMzZMOC44MiAxNC43OWExLjY1NSAxLjY1NSAwIDAgMS0xLjY0IDBMMyAxMi40M2ExLjkzIDEuOTMgMCAwIDEgMC0zLjM2eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAxM3YzLjg3YTIuMDYgMi4wNiAwIDAgMS0xLjExIDEuODNsLTYgMy4wOGExLjkzIDEuOTMgMCAwIDEtMS43OCAwbC02LTMuMDhBMi4wNiAyLjA2IDAgMCAxIDQgMTYuODdWMTMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEgMTIuNDNhMS45MyAxLjkzIDAgMCAwIDAtMy4zNkw4LjgzIDIuMmExLjY0IDEuNjQgMCAwIDAtMS42MyAwTDMgNC41N2ExLjkzIDEuOTMgMCAwIDAgMCAzLjM2bDEyLjE4IDYuODZhMS42MzYgMS42MzYgMCAwIDAgMS42MyAweiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhY2thZ2UtcGx1cy5qcwp2YXIgUGFja2FnZVBsdXM7CnZhciBpbml0X3BhY2thZ2VfcGx1cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFja2FnZS1wbHVzLmpzIigpIHsKICAgIFBhY2thZ2VQbHVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjJWMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTdoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxNHY2IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxIDEwLjUzNVY4YTIgMiAwIDAgMC0xLTEuNzNsLTctNGEyIDIgMCAwIDAtMiAwbC03IDRBMiAyIDAgMCAwIDMgOHY4YTIgMiAwIDAgMCAxIDEuNzI5bDcgNGEyIDIgMCAwIDAgMiAuMDAxbDEuNjc1LS45NTUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy4yOSA3IDEyIDEybDguNzEtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03LjUgNC4yNyA4Ljk5NyA1LjE0OCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhY2thZ2Utc2VhcmNoLmpzCnZhciBQYWNrYWdlU2VhcmNoOwp2YXIgaW5pdF9wYWNrYWdlX3NlYXJjaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFja2FnZS1zZWFyY2guanMiKCkgewogICAgUGFja2FnZVNlYXJjaCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIyVjEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwLjI3IDE4LjI3IDIyIDIwIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxIDEwLjQ5OFY4YTIgMiAwIDAgMC0xLTEuNzNsLTctNGEyIDIgMCAwIDAtMiAwbC03IDRBMiAyIDAgMCAwIDMgOHY4YTIgMiAwIDAgMCAxIDEuNzI5bDcgNGEyIDIgMCAwIDAgMiAuMDAxbC45OC0uNTU5IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuMjkgNyAxMiAxMmw4LjcxLTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNy41IDQuMjcgOC45OTcgNS4xNDgiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOC41IiwgY3k6ICIxNi41IiwgcjogIjIuNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhY2thZ2UteC5qcwp2YXIgUGFja2FnZVg7CnZhciBpbml0X3BhY2thZ2VfeCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFja2FnZS14LmpzIigpIHsKICAgIFBhY2thZ2VYID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjJWMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYuNSAxNC41IDUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNi41IDE5LjUgNS01IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxIDEwLjVWOGEyIDIgMCAwIDAtMS0xLjczbC03LTRhMiAyIDAgMCAwLTIgMGwtNyA0QTIgMiAwIDAgMCAzIDh2OGEyIDIgMCAwIDAgMSAxLjcyOWw3IDRhMiAyIDAgMCAwIDIgLjAwMWwuMTMtLjA3NCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zLjI5IDcgMTIgMTJsOC43MS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcuNSA0LjI3IDguOTk3IDUuMTQ4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFja2FnZS5qcwp2YXIgUGFja2FnZTsKdmFyIGluaXRfcGFja2FnZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFja2FnZS5qcyIoKSB7CiAgICBQYWNrYWdlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEgMjEuNzNhMiAyIDAgMCAwIDIgMGw3LTRBMiAyIDAgMCAwIDIxIDE2VjhhMiAyIDAgMCAwLTEtMS43M2wtNy00YTIgMiAwIDAgMC0yIDBsLTcgNEEyIDIgMCAwIDAgMyA4djhhMiAyIDAgMCAwIDEgMS43M3oiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjJWMTIiIH1dLAogICAgICBbInBvbHlsaW5lIiwgeyBwb2ludHM6ICIzLjI5IDcgMTIgMTIgMjAuNzEgNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03LjUgNC4yNyA5IDUuMTUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYWludC1idWNrZXQuanMKdmFyIFBhaW50QnVja2V0Owp2YXIgaW5pdF9wYWludF9idWNrZXQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhaW50LWJ1Y2tldC5qcyIoKSB7CiAgICBQYWludEJ1Y2tldCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDcgNiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4Ljk5MiAxMkgyLjA0MSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMS4xNDUgMTguMzhBMy4zNCAzLjM0IDAgMCAxIDIwIDE2LjVhMy4zIDMuMyAwIDAgMS0xLjE0NSAxLjg4Yy0uNTc1LjQ2LS44NTUgMS4wMi0uODU1IDEuNTk1QTIgMiAwIDAgMCAyMCAyMmEyIDIgMCAwIDAgMi0yLjAyNWMwLS41OC0uMjg1LTEuMTMtLjg1NS0xLjU5NSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm04LjUgNC41IDIuMTQ4LTIuMTQ4YTEuMjA1IDEuMjA1IDAgMCAxIDEuNzA0IDBsNy4yOTYgNy4yOTZhMS4yMDUgMS4yMDUgMCAwIDEgMCAxLjcwNGwtNy41OTIgNy41OTJhMy42MTUgMy42MTUgMCAwIDEtNS4xMTIgMGwtMy44ODgtMy44ODhhMy42MTUgMy42MTUgMCAwIDEgMC01LjExMkw1LjY3IDcuMzMiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYWludC1yb2xsZXIuanMKdmFyIFBhaW50Um9sbGVyOwp2YXIgaW5pdF9wYWludF9yb2xsZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhaW50LXJvbGxlci5qcyIoKSB7CiAgICBQYWludFJvbGxlciA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE2IiwgaGVpZ2h0OiAiNiIsIHg6ICIyIiwgeTogIjIiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTZ2LTJhMiAyIDAgMCAxIDItMmg4YTIgMiAwIDAgMCAyLTJWN2EyIDIgMCAwIDAtMi0yaC0yIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjQiLCBoZWlnaHQ6ICI2IiwgeDogIjgiLCB5OiAiMTYiLCByeDogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYWludGJydXNoLXZlcnRpY2FsLmpzCnZhciBQYWludGJydXNoVmVydGljYWw7CnZhciBpbml0X3BhaW50YnJ1c2hfdmVydGljYWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhaW50YnJ1c2gtdmVydGljYWwuanMiKCkgewogICAgUGFpbnRicnVzaFZlcnRpY2FsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAyYTEgMSAwIDAgMSAxIDF2OUg2VjNhMSAxIDAgMCAxIDEtMXoiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNiAxMmExIDEgMCAwIDAtMSAxdjFhMiAyIDAgMCAwIDIgMmgyYTEgMSAwIDAgMSAxIDF2Mi45YTIgMiAwIDEgMCA0IDBWMTdhMSAxIDAgMCAxIDEtMWgyYTIgMiAwIDAgMCAyLTJ2LTFhMSAxIDAgMCAwLTEtMSIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhaW50YnJ1c2guanMKdmFyIFBhaW50YnJ1c2g7CnZhciBpbml0X3BhaW50YnJ1c2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhaW50YnJ1c2guanMiKCkgewogICAgUGFpbnRicnVzaCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0LjYyMiAxNy44OTctMTAuNjgtMi45MTMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTguMzc2IDIuNjIyYTEgMSAwIDEgMSAzLjAwMiAzLjAwMkwxNy4zNiA5LjY0M2EuNS41IDAgMCAwIDAgLjcwN2wuOTQ0Ljk0NGEyLjQxIDIuNDEgMCAwIDEgMCAzLjQwOGwtLjk0NC45NDRhLjUuNSAwIDAgMS0uNzA3IDBMOC4zNTQgNy4zNDhhLjUuNSAwIDAgMSAwLS43MDdsLjk0NC0uOTQ0YTIuNDEgMi40MSAwIDAgMSAzLjQwOCAwbC45NDQuOTQ0YS41LjUgMCAwIDAgLjcwNyAweiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk05IDhjLTEuODA0IDIuNzEtMy45NyAzLjQ2LTYuNTgzIDMuOTQ4YS41MDcuNTA3IDAgMCAwLS4zMDIuODE5bDcuMzIgOC44ODNhMSAxIDAgMCAwIDEuMTg1LjIwNEMxMi43MzUgMjAuNDA1IDE2IDE2Ljc5MiAxNiAxNSIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbGV0dGUuanMKdmFyIFBhbGV0dGU7CnZhciBpbml0X3BhbGV0dGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbGV0dGUuanMiKCkgewogICAgUGFsZXR0ZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyIDIyYTEgMSAwIDAgMSAwLTIwIDEwIDkgMCAwIDEgMTAgOSA1IDUgMCAwIDEtNSA1aC0yLjI1YTEuNzUgMS43NSAwIDAgMC0xLjQgMi44bC4zLjRhMS43NSAxLjc1IDAgMCAxLTEuNCAyLjh6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTMuNSIsIGN5OiAiNi41IiwgcjogIi41IiwgZmlsbDogImN1cnJlbnRDb2xvciIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE3LjUiLCBjeTogIjEwLjUiLCByOiAiLjUiLCBmaWxsOiAiY3VycmVudENvbG9yIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNi41IiwgY3k6ICIxMi41IiwgcjogIi41IiwgZmlsbDogImN1cnJlbnRDb2xvciIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjguNSIsIGN5OiAiNy41IiwgcjogIi41IiwgZmlsbDogImN1cnJlbnRDb2xvciIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmRhLmpzCnZhciBQYW5kYTsKdmFyIGluaXRfcGFuZGEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmRhLmpzIigpIHsKICAgIFBhbmRhID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEuMjUgMTcuMjVoMS41TDEyIDE4eiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxMiAyIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggNi41YS41LjUgMCAwIDAtLjUtLjUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAuNjkgOS42N2E0LjUgNC41IDAgMSAwLTcuMDQtNS41IDguMzUgOC4zNSAwIDAgMC0zLjMgMCA0LjUgNC41IDAgMSAwLTcuMDQgNS41QzIuNDkgMTEuMiAyIDEyLjg4IDIgMTQuNSAyIDE5LjQ3IDYuNDggMjIgMTIgMjJzMTAtMi41MyAxMC03LjVjMC0xLjYyLS40OC0zLjMtMS4zLTQuODMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA2LjVhLjQ5NS40OTUgMCAwIDEgLjUtLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxMi0yIDIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbC1ib3R0b20tY2xvc2UuanMKdmFyIFBhbmVsQm90dG9tQ2xvc2U7CnZhciBpbml0X3BhbmVsX2JvdHRvbV9jbG9zZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtYm90dG9tLWNsb3NlLmpzIigpIHsKICAgIFBhbmVsQm90dG9tQ2xvc2UgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE1aDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDgtMyAzLTMtMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmVsLWJvdHRvbS1kYXNoZWQuanMKdmFyIFBhbmVsQm90dG9tRGFzaGVkOwp2YXIgaW5pdF9wYW5lbF9ib3R0b21fZGFzaGVkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbC1ib3R0b20tZGFzaGVkLmpzIigpIHsKICAgIFBhbmVsQm90dG9tRGFzaGVkID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTVoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxNWgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTVoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE1aDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbC1ib3R0b20tb3Blbi5qcwp2YXIgUGFuZWxCb3R0b21PcGVuOwp2YXIgaW5pdF9wYW5lbF9ib3R0b21fb3BlbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtYm90dG9tLW9wZW4uanMiKCkgewogICAgUGFuZWxCb3R0b21PcGVuID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxNWgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDEwIDMtMyAzIDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbC1ib3R0b20uanMKdmFyIFBhbmVsQm90dG9tOwp2YXIgaW5pdF9wYW5lbF9ib3R0b20gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmVsLWJvdHRvbS5qcyIoKSB7CiAgICBQYW5lbEJvdHRvbSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTVoMTgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbC1sZWZ0LWNsb3NlLmpzCnZhciBQYW5lbExlZnRDbG9zZTsKdmFyIGluaXRfcGFuZWxfbGVmdF9jbG9zZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtbGVmdC1jbG9zZS5qcyIoKSB7CiAgICBQYW5lbExlZnRDbG9zZSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgM3YxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAxNS0zLTMgMy0zIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtbGVmdC1kYXNoZWQuanMKdmFyIFBhbmVsTGVmdERhc2hlZDsKdmFyIGluaXRfcGFuZWxfbGVmdF9kYXNoZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmVsLWxlZnQtZGFzaGVkLmpzIigpIHsKICAgIFBhbmVsTGVmdERhc2hlZCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTR2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE5djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAzdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA5djEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbC1sZWZ0LW9wZW4uanMKdmFyIFBhbmVsTGVmdE9wZW47CnZhciBpbml0X3BhbmVsX2xlZnRfb3BlbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtbGVmdC1vcGVuLmpzIigpIHsKICAgIFBhbmVsTGVmdE9wZW4gPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDN2MTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgOSAzIDMtMyAzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtbGVmdC1yaWdodC1kYXNoZWQuanMKdmFyIFBhbmVsTGVmdFJpZ2h0RGFzaGVkOwp2YXIgaW5pdF9wYW5lbF9sZWZ0X3JpZ2h0X2Rhc2hlZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtbGVmdC1yaWdodC1kYXNoZWQuanMiKCkgewogICAgUGFuZWxMZWZ0UmlnaHREYXNoZWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxMFY5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDE1di0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDIxdi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDVWMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDEwVjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNXYtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDIxdi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgNVYzIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICIzIiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4Iiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtbGVmdC5qcwp2YXIgUGFuZWxMZWZ0Owp2YXIgaW5pdF9wYW5lbF9sZWZ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbC1sZWZ0LmpzIigpIHsKICAgIFBhbmVsTGVmdCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgM3YxOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmVsLXJpZ2h0LWNsb3NlLmpzCnZhciBQYW5lbFJpZ2h0Q2xvc2U7CnZhciBpbml0X3BhbmVsX3JpZ2h0X2Nsb3NlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbC1yaWdodC1jbG9zZS5qcyIoKSB7CiAgICBQYW5lbFJpZ2h0Q2xvc2UgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAzdjE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggOSAzIDMtMyAzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtcmlnaHQtZGFzaGVkLmpzCnZhciBQYW5lbFJpZ2h0RGFzaGVkOwp2YXIgaW5pdF9wYW5lbF9yaWdodF9kYXNoZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmVsLXJpZ2h0LWRhc2hlZC5qcyIoKSB7CiAgICBQYW5lbFJpZ2h0RGFzaGVkID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTR2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxOXYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDN2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA5djEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbC1yaWdodC1vcGVuLmpzCnZhciBQYW5lbFJpZ2h0T3BlbjsKdmFyIGluaXRfcGFuZWxfcmlnaHRfb3BlbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtcmlnaHQtb3Blbi5qcyIoKSB7CiAgICBQYW5lbFJpZ2h0T3BlbiA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDN2MTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgMTUtMy0zIDMtMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmVsLXJpZ2h0LmpzCnZhciBQYW5lbFJpZ2h0Owp2YXIgaW5pdF9wYW5lbF9yaWdodCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtcmlnaHQuanMiKCkgewogICAgUGFuZWxSaWdodCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDN2MTgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbC10b3AtYm90dG9tLWRhc2hlZC5qcwp2YXIgUGFuZWxUb3BCb3R0b21EYXNoZWQ7CnZhciBpbml0X3BhbmVsX3RvcF9ib3R0b21fZGFzaGVkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbC10b3AtYm90dG9tLWRhc2hlZC5qcyIoKSB7CiAgICBQYW5lbFRvcEJvdHRvbURhc2hlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE1aDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgOWgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE1aDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgOWgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTVoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDloMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE1aDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA5aDEiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIzIiwgeTogIjMiLCB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbC10b3AtY2xvc2UuanMKdmFyIFBhbmVsVG9wQ2xvc2U7CnZhciBpbml0X3BhbmVsX3RvcF9jbG9zZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtdG9wLWNsb3NlLmpzIigpIHsKICAgIFBhbmVsVG9wQ2xvc2UgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDloMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxNiAzLTMgMyAzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtdG9wLW9wZW4uanMKdmFyIFBhbmVsVG9wT3BlbjsKdmFyIGluaXRfcGFuZWxfdG9wX29wZW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmVsLXRvcC1vcGVuLmpzIigpIHsKICAgIFBhbmVsVG9wT3BlbiA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOWgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxNC0zIDMtMy0zIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtdG9wLWRhc2hlZC5qcwp2YXIgUGFuZWxUb3BEYXNoZWQ7CnZhciBpbml0X3BhbmVsX3RvcF9kYXNoZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmVsLXRvcC1kYXNoZWQuanMiKCkgewogICAgUGFuZWxUb3BEYXNoZWQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA5aDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgOWgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOWgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgOWgxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtdG9wLmpzCnZhciBQYW5lbFRvcDsKdmFyIGluaXRfcGFuZWxfdG9wID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbC10b3AuanMiKCkgewogICAgUGFuZWxUb3AgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDloMTgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbHMtbGVmdC1ib3R0b20uanMKdmFyIFBhbmVsc0xlZnRCb3R0b207CnZhciBpbml0X3BhbmVsc19sZWZ0X2JvdHRvbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWxzLWxlZnQtYm90dG9tLmpzIigpIHsKICAgIFBhbmVsc0xlZnRCb3R0b20gPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDN2MTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNWgxMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmVscy1yaWdodC1ib3R0b20uanMKdmFyIFBhbmVsc1JpZ2h0Qm90dG9tOwp2YXIgaW5pdF9wYW5lbHNfcmlnaHRfYm90dG9tID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbHMtcmlnaHQtYm90dG9tLmpzIigpIHsKICAgIFBhbmVsc1JpZ2h0Qm90dG9tID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxNWgxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAzdjE4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWxzLXRvcC1sZWZ0LmpzCnZhciBQYW5lbHNUb3BMZWZ0Owp2YXIgaW5pdF9wYW5lbHNfdG9wX2xlZnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmVscy10b3AtbGVmdC5qcyIoKSB7CiAgICBQYW5lbHNUb3BMZWZ0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA5aDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMjFWOSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhcGVyY2xpcC5qcwp2YXIgUGFwZXJjbGlwOwp2YXIgaW5pdF9wYXBlcmNsaXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhcGVyY2xpcC5qcyIoKSB7CiAgICBQYXBlcmNsaXAgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xNiA2LTguNDE0IDguNTg2YTIgMiAwIDAgMCAyLjgyOSAyLjgyOWw4LjQxNC04LjU4NmE0IDQgMCAxIDAtNS42NTctNS42NTdsLTguMzc5IDguNTUxYTYgNiAwIDEgMCA4LjQ4NSA4LjQ4NWw4LjM3OS04LjU1MSIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhcmVudGhlc2VzLmpzCnZhciBQYXJlbnRoZXNlczsKdmFyIGluaXRfcGFyZW50aGVzZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhcmVudGhlc2VzLmpzIigpIHsKICAgIFBhcmVudGhlc2VzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAyMXMtNC0zLTQtOSA0LTkgNC05IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDNzNCAzIDQgOS00IDktNCA5IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFya2luZy1tZXRlci5qcwp2YXIgUGFya2luZ01ldGVyOwp2YXIgaW5pdF9wYXJraW5nX21ldGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYXJraW5nLW1ldGVyLmpzIigpIHsKICAgIFBhcmtpbmdNZXRlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDE1aDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJ2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOXYzIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE1LjI4MiAxOWExIDEgMCAwIDAgLjk0OC0uNjhsMi4zNy02Ljk4OGE3IDcgMCAxIDAtMTMuMiAwbDIuMzcgNi45ODhhMSAxIDAgMCAwIC45NDguNjh6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgOWEzIDMgMCAxIDEgNiAwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFydHktcG9wcGVyLmpzCnZhciBQYXJ0eVBvcHBlcjsKdmFyIGluaXRfcGFydHlfcG9wcGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYXJ0eS1wb3BwZXIuanMiKCkgewogICAgUGFydHlQb3BwZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk01LjggMTEuMyAyIDIybDEwLjctMy43OSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDNoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDhoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDIwaC4wMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0yMiAyLTIuMjQuNzVhMi45IDIuOSAwIDAgMC0xLjk2IDMuMTJjLjEuODYtLjU3IDEuNjMtMS40NSAxLjYzaC0uMzhjLS44NiAwLTEuNi42LTEuNzYgMS40NEwxNCAxMCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiAxMy0uODItLjMzYy0uODYtLjM0LTEuODIuMi0xLjk4IDEuMTFjLS4xMS43LS43MiAxLjIyLTEuNDMgMS4yMkgxNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMSAyIC4zMy44MmMuMzQuODYtLjIgMS44Mi0xLjExIDEuOThDOS41MiA0LjkgOSA1LjUyIDkgNi4yM1Y3IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTExIDEzYzEuOTMgMS45MyAyLjgzIDQuMTcgMiA1LS44My44My0zLjA3LS4wNy01LTItMS45My0xLjkzLTIuODMtNC4xNy0yLTUgLjgzLS44MyAzLjA3LjA3IDUgMloiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYXVzZS5qcwp2YXIgUGF1c2U7CnZhciBpbml0X3BhdXNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYXVzZS5qcyIoKSB7CiAgICBQYXVzZSA9IFsKICAgICAgWyJyZWN0IiwgeyB4OiAiMTQiLCB5OiAiMyIsIHdpZHRoOiAiNSIsIGhlaWdodDogIjE4Iiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiNSIsIHk6ICIzIiwgd2lkdGg6ICI1IiwgaGVpZ2h0OiAiMTgiLCByeDogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYXctcHJpbnQuanMKdmFyIFBhd1ByaW50Owp2YXIgaW5pdF9wYXdfcHJpbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Bhdy1wcmludC5qcyIoKSB7CiAgICBQYXdQcmludCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTEiLCBjeTogIjQiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICI4IiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIyMCIsIGN5OiAiMTYiLCByOiAiMiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk05IDEwYTUgNSAwIDAgMSA1IDV2My41YTMuNSAzLjUgMCAwIDEtNi44NCAxLjA0NVE2LjUyIDE3LjQ4IDQuNDYgMTYuODRBMy41IDMuNSAwIDAgMSA1LjUgMTBaIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGMtY2FzZS5qcwp2YXIgUGNDYXNlOwp2YXIgaW5pdF9wY19jYXNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYy1jYXNlLmpzIigpIHsKICAgIFBjQ2FzZSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE0IiwgaGVpZ2h0OiAiMjAiLCB4OiAiNSIsIHk6ICIyIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDE0aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDZoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDEwaDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wZW4tbGluZS5qcwp2YXIgUGVuTGluZTsKdmFyIGluaXRfcGVuX2xpbmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Blbi1saW5lLmpzIigpIHsKICAgIFBlbkxpbmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAyMWg4IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxLjE3NCA2LjgxMmExIDEgMCAwIDAtMy45ODYtMy45ODdMMy44NDIgMTYuMTc0YTIgMiAwIDAgMC0uNS44M2wtMS4zMjEgNC4zNTJhLjUuNSAwIDAgMCAuNjIzLjYyMmw0LjM1My0xLjMyYTIgMiAwIDAgMCAuODMtLjQ5N3oiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wZW4tb2ZmLmpzCnZhciBQZW5PZmY7CnZhciBpbml0X3Blbl9vZmYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Blbi1vZmYuanMiKCkgewogICAgUGVuT2ZmID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTAgMTAtNi4xNTcgNi4xNjJhMiAyIDAgMCAwLS41LjgzM2wtMS4zMjIgNC4zNmEuNS41IDAgMCAwIC42MjIuNjI0bDQuMzU4LTEuMzIzYTIgMiAwIDAgMCAuODMtLjVMMTQgMTMuOTgyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyLjgyOSA3LjE3MiA0LjM1OS00LjM0NmExIDEgMCAxIDEgMy45ODYgMy45ODZsLTQuMzUzIDQuMzUzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Blbi10b29sLmpzCnZhciBQZW5Ub29sOwp2YXIgaW5pdF9wZW5fdG9vbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGVuLXRvb2wuanMiKCkgewogICAgUGVuVG9vbCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE1LjcwNyAyMS4yOTNhMSAxIDAgMCAxLTEuNDE0IDBsLTEuNTg2LTEuNTg2YTEgMSAwIDAgMSAwLTEuNDE0bDUuNTg2LTUuNTg2YTEgMSAwIDAgMSAxLjQxNCAwbDEuNTg2IDEuNTg2YTEgMSAwIDAgMSAwIDEuNDE0eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xOCAxMy0xLjM3NS02Ljg3NGExIDEgMCAwIDAtLjc0Ni0uNzc2TDMuMjM1IDIuMDI4YTEgMSAwIDAgMC0xLjIwNyAxLjIwN0w1LjM1IDE1Ljg3OWExIDEgMCAwIDAgLjc3Ni43NDZMMTMgMTgiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMi4zIDIuMyA3LjI4NiA3LjI4NiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjExIiwgY3k6ICIxMSIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGVuLmpzCnZhciBQZW47CnZhciBpbml0X3BlbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGVuLmpzIigpIHsKICAgIFBlbiA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxLjE3NCA2LjgxMmExIDEgMCAwIDAtMy45ODYtMy45ODdMMy44NDIgMTYuMTc0YTIgMiAwIDAgMC0uNS44M2wtMS4zMjEgNC4zNTJhLjUuNSAwIDAgMCAuNjIzLjYyMmw0LjM1My0xLjMyYTIgMiAwIDAgMCAuODMtLjQ5N3oiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wZW5jaWwtbGluZS5qcwp2YXIgUGVuY2lsTGluZTsKdmFyIGluaXRfcGVuY2lsX2xpbmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BlbmNpbC1saW5lLmpzIigpIHsKICAgIFBlbmNpbExpbmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAyMWg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDUgNCA0IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxLjE3NCA2LjgxMmExIDEgMCAwIDAtMy45ODYtMy45ODdMMy44NDIgMTYuMTc0YTIgMiAwIDAgMC0uNS44M2wtMS4zMjEgNC4zNTJhLjUuNSAwIDAgMCAuNjIzLjYyMmw0LjM1My0xLjMyYTIgMiAwIDAgMCAuODMtLjQ5N3oiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wZW5jaWwtb2ZmLmpzCnZhciBQZW5jaWxPZmY7CnZhciBpbml0X3BlbmNpbF9vZmYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BlbmNpbC1vZmYuanMiKCkgewogICAgUGVuY2lsT2ZmID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTAgMTAtNi4xNTcgNi4xNjJhMiAyIDAgMCAwLS41LjgzM2wtMS4zMjIgNC4zNmEuNS41IDAgMCAwIC42MjIuNjI0bDQuMzU4LTEuMzIzYTIgMiAwIDAgMCAuODMtLjVMMTQgMTMuOTgyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyLjgyOSA3LjE3MiA0LjM1OS00LjM0NmExIDEgMCAxIDEgMy45ODYgMy45ODZsLTQuMzUzIDQuMzUzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDUgNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BlbmNpbC1ydWxlci5qcwp2YXIgUGVuY2lsUnVsZXI7CnZhciBpbml0X3BlbmNpbF9ydWxlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGVuY2lsLXJ1bGVyLmpzIigpIHsKICAgIFBlbmNpbFJ1bGVyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgNyA4LjcgMi43YTIuNDEgMi40MSAwIDAgMC0zLjQgMEwyLjcgNS4zYTIuNDEgMi40MSAwIDAgMCAwIDMuNEw3IDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggNiAyLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMTYgMi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDExIDQuMyA0LjNjLjk0Ljk0Ljk0IDIuNDYgMCAzLjRsLTIuNiAyLjZjLS45NC45NC0yLjQ2Ljk0LTMuNCAwTDExIDE3IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxLjE3NCA2LjgxMmExIDEgMCAwIDAtMy45ODYtMy45ODdMMy44NDIgMTYuMTc0YTIgMiAwIDAgMC0uNS44M2wtMS4zMjEgNC4zNTJhLjUuNSAwIDAgMCAuNjIzLjYyMmw0LjM1My0xLjMyYTIgMiAwIDAgMCAuODMtLjQ5N3oiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgNSA0IDQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wZW5jaWwuanMKdmFyIFBlbmNpbDsKdmFyIGluaXRfcGVuY2lsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wZW5jaWwuanMiKCkgewogICAgUGVuY2lsID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEuMTc0IDYuODEyYTEgMSAwIDAgMC0zLjk4Ni0zLjk4N0wzLjg0MiAxNi4xNzRhMiAyIDAgMCAwLS41LjgzbC0xLjMyMSA0LjM1MmEuNS41IDAgMCAwIC42MjMuNjIybDQuMzUzLTEuMzJhMiAyIDAgMCAwIC44My0uNDk3eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA1IDQgNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BlcmNlbnQuanMKdmFyIFBlcmNlbnQ7CnZhciBpbml0X3BlcmNlbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BlcmNlbnQuanMiKCkgewogICAgUGVyY2VudCA9IFsKICAgICAgWyJsaW5lIiwgeyB4MTogIjE5IiwgeDI6ICI1IiwgeTE6ICI1IiwgeTI6ICIxOSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYuNSIsIGN5OiAiNi41IiwgcjogIjIuNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE3LjUiLCBjeTogIjE3LjUiLCByOiAiMi41IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGVudGFnb24uanMKdmFyIFBlbnRhZ29uOwp2YXIgaW5pdF9wZW50YWdvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGVudGFnb24uanMiKCkgewogICAgUGVudGFnb24gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMC44MyAyLjM4YTIgMiAwIDAgMSAyLjM0IDBsOCA1Ljc0YTIgMiAwIDAgMSAuNzMgMi4yNWwtMy4wNCA5LjI2YTIgMiAwIDAgMS0xLjkgMS4zN0g3LjA0YTIgMiAwIDAgMS0xLjktMS4zN0wyLjEgMTAuMzdhMiAyIDAgMCAxIC43My0yLjI1eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BlcnNvbi1zdGFuZGluZy5qcwp2YXIgUGVyc29uU3RhbmRpbmc7CnZhciBpbml0X3BlcnNvbl9zdGFuZGluZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGVyc29uLXN0YW5kaW5nLmpzIigpIHsKICAgIFBlcnNvblN0YW5kaW5nID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiNSIsIHI6ICIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMjAgMy02IDMgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02IDggNiAyIDYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMHY0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGhpbGlwcGluZS1wZXNvLmpzCnZhciBQaGlsaXBwaW5lUGVzbzsKdmFyIGluaXRfcGhpbGlwcGluZV9wZXNvID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9waGlsaXBwaW5lLXBlc28uanMiKCkgewogICAgUGhpbGlwcGluZVBlc28gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxMUg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDdINCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIxVjRhMSAxIDAgMCAxIDEtMWg0YTEgMSAwIDAgMSAwIDEySDciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9waG9uZS1jYWxsLmpzCnZhciBQaG9uZUNhbGw7CnZhciBpbml0X3Bob25lX2NhbGwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Bob25lLWNhbGwuanMiKCkgewogICAgUGhvbmVDYWxsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMmE5IDkgMCAwIDEgOSA5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDZhNSA1IDAgMCAxIDUgNSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMy44MzIgMTYuNTY4YTEgMSAwIDAgMCAxLjIxMy0uMzAzbC4zNTUtLjQ2NUEyIDIgMCAwIDEgMTcgMTVoM2EyIDIgMCAwIDEgMiAydjNhMiAyIDAgMCAxLTIgMkExOCAxOCAwIDAgMSAyIDRhMiAyIDAgMCAxIDItMmgzYTIgMiAwIDAgMSAyIDJ2M2EyIDIgMCAwIDEtLjggMS42bC0uNDY4LjM1MWExIDEgMCAwIDAtLjI5MiAxLjIzMyAxNCAxNCAwIDAgMCA2LjM5MiA2LjM4NCIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Bob25lLWZvcndhcmRlZC5qcwp2YXIgUGhvbmVGb3J3YXJkZWQ7CnZhciBpbml0X3Bob25lX2ZvcndhcmRlZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGhvbmUtZm9yd2FyZGVkLmpzIigpIHsKICAgIFBob25lRm9yd2FyZGVkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgNmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE4IDIgNCA0LTQgNCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMy44MzIgMTYuNTY4YTEgMSAwIDAgMCAxLjIxMy0uMzAzbC4zNTUtLjQ2NUEyIDIgMCAwIDEgMTcgMTVoM2EyIDIgMCAwIDEgMiAydjNhMiAyIDAgMCAxLTIgMkExOCAxOCAwIDAgMSAyIDRhMiAyIDAgMCAxIDItMmgzYTIgMiAwIDAgMSAyIDJ2M2EyIDIgMCAwIDEtLjggMS42bC0uNDY4LjM1MWExIDEgMCAwIDAtLjI5MiAxLjIzMyAxNCAxNCAwIDAgMCA2LjM5MiA2LjM4NCIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Bob25lLWluY29taW5nLmpzCnZhciBQaG9uZUluY29taW5nOwp2YXIgaW5pdF9waG9uZV9pbmNvbWluZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGhvbmUtaW5jb21pbmcuanMiKCkgewogICAgUGhvbmVJbmNvbWluZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDJ2Nmg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDItNiA2IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEzLjgzMiAxNi41NjhhMSAxIDAgMCAwIDEuMjEzLS4zMDNsLjM1NS0uNDY1QTIgMiAwIDAgMSAxNyAxNWgzYTIgMiAwIDAgMSAyIDJ2M2EyIDIgMCAwIDEtMiAyQTE4IDE4IDAgMCAxIDIgNGEyIDIgMCAwIDEgMi0yaDNhMiAyIDAgMCAxIDIgMnYzYTIgMiAwIDAgMS0uOCAxLjZsLS40NjguMzUxYTEgMSAwIDAgMC0uMjkyIDEuMjMzIDE0IDE0IDAgMCAwIDYuMzkyIDYuMzg0IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGhvbmUtbWlzc2VkLmpzCnZhciBQaG9uZU1pc3NlZDsKdmFyIGluaXRfcGhvbmVfbWlzc2VkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9waG9uZS1taXNzZWQuanMiKCkgewogICAgUGhvbmVNaXNzZWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAyIDYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiAyLTYgNiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMy44MzIgMTYuNTY4YTEgMSAwIDAgMCAxLjIxMy0uMzAzbC4zNTUtLjQ2NUEyIDIgMCAwIDEgMTcgMTVoM2EyIDIgMCAwIDEgMiAydjNhMiAyIDAgMCAxLTIgMkExOCAxOCAwIDAgMSAyIDRhMiAyIDAgMCAxIDItMmgzYTIgMiAwIDAgMSAyIDJ2M2EyIDIgMCAwIDEtLjggMS42bC0uNDY4LjM1MWExIDEgMCAwIDAtLjI5MiAxLjIzMyAxNCAxNCAwIDAgMCA2LjM5MiA2LjM4NCIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Bob25lLW9mZi5qcwp2YXIgUGhvbmVPZmY7CnZhciBpbml0X3Bob25lX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGhvbmUtb2ZmLmpzIigpIHsKICAgIFBob25lT2ZmID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTAuMSAxMy45YTE0IDE0IDAgMCAwIDMuNzMyIDIuNjY4IDEgMSAwIDAgMCAxLjIxMy0uMzAzbC4zNTUtLjQ2NUEyIDIgMCAwIDEgMTcgMTVoM2EyIDIgMCAwIDEgMiAydjNhMiAyIDAgMCAxLTIgMiAxOCAxOCAwIDAgMS0xMi43MjgtNS4yNzIiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMiAyIDIyIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQuNzYgMTMuNTgyQTE4IDE4IDAgMCAxIDIgNGEyIDIgMCAwIDEgMi0yaDNhMiAyIDAgMCAxIDIgMnYzYTIgMiAwIDAgMS0uOCAxLjZsLS40NjguMzUxYTEgMSAwIDAgMC0uMjkyIDEuMjMzIDE0IDE0IDAgMCAwIC4yNDQuNDczIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGhvbmUtb3V0Z29pbmcuanMKdmFyIFBob25lT3V0Z29pbmc7CnZhciBpbml0X3Bob25lX291dGdvaW5nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9waG9uZS1vdXRnb2luZy5qcyIoKSB7CiAgICBQaG9uZU91dGdvaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgOCA2LTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgOFYyaC02IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEzLjgzMiAxNi41NjhhMSAxIDAgMCAwIDEuMjEzLS4zMDNsLjM1NS0uNDY1QTIgMiAwIDAgMSAxNyAxNWgzYTIgMiAwIDAgMSAyIDJ2M2EyIDIgMCAwIDEtMiAyQTE4IDE4IDAgMCAxIDIgNGEyIDIgMCAwIDEgMi0yaDNhMiAyIDAgMCAxIDIgMnYzYTIgMiAwIDAgMS0uOCAxLjZsLS40NjguMzUxYTEgMSAwIDAgMC0uMjkyIDEuMjMzIDE0IDE0IDAgMCAwIDYuMzkyIDYuMzg0IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGhvbmUuanMKdmFyIFBob25lOwp2YXIgaW5pdF9waG9uZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGhvbmUuanMiKCkgewogICAgUGhvbmUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMy44MzIgMTYuNTY4YTEgMSAwIDAgMCAxLjIxMy0uMzAzbC4zNTUtLjQ2NUEyIDIgMCAwIDEgMTcgMTVoM2EyIDIgMCAwIDEgMiAydjNhMiAyIDAgMCAxLTIgMkExOCAxOCAwIDAgMSAyIDRhMiAyIDAgMCAxIDItMmgzYTIgMiAwIDAgMSAyIDJ2M2EyIDIgMCAwIDEtLjggMS42bC0uNDY4LjM1MWExIDEgMCAwIDAtLjI5MiAxLjIzMyAxNCAxNCAwIDAgMCA2LjM5MiA2LjM4NCIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BpLmpzCnZhciBQaTsKdmFyIGluaXRfcGkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BpLmpzIigpIHsKICAgIFBpID0gWwogICAgICBbImxpbmUiLCB7IHgxOiAiOSIsIHgyOiAiOSIsIHkxOiAiNCIsIHkyOiAiMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA3YzAtMS43IDEuMy0zIDMtM2gxMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAyMGMtMS43IDAtMy0xLjMtMy0zVjQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9waWFuby5qcwp2YXIgUGlhbm87CnZhciBpbml0X3BpYW5vID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9waWFuby5qcyIoKSB7CiAgICBQaWFubyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE4LjUgOGMtMS40IDAtMi42LS44LTMuMi0yQTYuODcgNi44NyAwIDAgMCAyIDl2MTFhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0ydi04LjVDMjIgOS42IDIwLjQgOCAxOC41IDgiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxNGgyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE0djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTR2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxNHY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDE0djQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9waWNrYXhlLmpzCnZhciBQaWNrYXhlOwp2YXIgaW5pdF9waWNrYXhlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9waWNrYXhlLmpzIigpIHsKICAgIFBpY2theGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAxMy04LjM4MSA4LjM4YTEgMSAwIDAgMS0zLjAwMS0zTDExIDkuOTk5IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE1Ljk3MyA0LjAyN0ExMyAxMyAwIDAgMCA1LjkwMiAyLjM3M2MtMS4zOTguMzQyLTEuMDkyIDIuMTU4LjI3NyAyLjYwMWExOS45IDE5LjkgMCAwIDEgNS44MjIgMy4wMjQiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTYuMDAxIDExLjk5OWExOS45IDE5LjkgMCAwIDEgMy4wMjQgNS44MjRjLjQ0NCAxLjM2OSAyLjI2IDEuNjc2IDIuNjAzLjI3OEExMyAxMyAwIDAgMCAyMCA4LjA2OSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOC4zNTIgMy4zNTJhMS4yMDUgMS4yMDUgMCAwIDAtMS43MDQgMGwtNS4yOTYgNS4yOTZhMS4yMDUgMS4yMDUgMCAwIDAgMCAxLjcwNGwyLjI5NiAyLjI5NmExLjIwNSAxLjIwNSAwIDAgMCAxLjcwNCAwbDUuMjk2LTUuMjk2YTEuMjA1IDEuMjA1IDAgMCAwIDAtMS43MDR6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGljdHVyZS1pbi1waWN0dXJlLTIuanMKdmFyIFBpY3R1cmVJblBpY3R1cmUyOwp2YXIgaW5pdF9waWN0dXJlX2luX3BpY3R1cmVfMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGljdHVyZS1pbi1waWN0dXJlLTIuanMiKCkgewogICAgUGljdHVyZUluUGljdHVyZTIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA5VjZhMiAyIDAgMCAwLTItMkg0YTIgMiAwIDAgMC0yIDJ2MTBjMCAxLjEuOSAyIDIgMmg0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjEwIiwgaGVpZ2h0OiAiNyIsIHg6ICIxMiIsIHk6ICIxMyIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BpY3R1cmUtaW4tcGljdHVyZS5qcwp2YXIgUGljdHVyZUluUGljdHVyZTsKdmFyIGluaXRfcGljdHVyZV9pbl9waWN0dXJlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9waWN0dXJlLWluLXBpY3R1cmUuanMiKCkgewogICAgUGljdHVyZUluUGljdHVyZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTBoNlY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgNCA2IDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTBWN2EyIDIgMCAwIDAtMi0yaC03IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTR2MmEyIDIgMCAwIDAgMiAyaDMiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIxMiIsIHk6ICIxNCIsIHdpZHRoOiAiMTAiLCBoZWlnaHQ6ICI3Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGlnZ3ktYmFuay5qcwp2YXIgUGlnZ3lCYW5rOwp2YXIgaW5pdF9waWdneV9iYW5rID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9waWdneS1iYW5rLmpzIigpIHsKICAgIFBpZ2d5QmFuayA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTExIDE3aDN2MmExIDEgMCAwIDAgMSAxaDJhMSAxIDAgMCAwIDEtMXYtM2EzLjE2IDMuMTYgMCAwIDAgMi0yaDFhMSAxIDAgMCAwIDEtMXYtMmExIDEgMCAwIDAtMS0xaC0xYTUgNSAwIDAgMC0yLTRWM2E0IDQgMCAwIDAtMy4yIDEuNmwtLjMuNEgxMWE2IDYgMCAwIDAtNiA2djFhNSA1IDAgMCAwIDIgNHYzYTEgMSAwIDAgMCAxIDFoMmExIDEgMCAwIDAgMS0xeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA4djFhMiAyIDAgMCAwIDIgMmgxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGlsY3Jvdy1sZWZ0LmpzCnZhciBQaWxjcm93TGVmdDsKdmFyIGluaXRfcGlsY3Jvd19sZWZ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9waWxjcm93LWxlZnQuanMiKCkgewogICAgUGlsY3Jvd0xlZnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAzdjExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDloLTNhMyAzIDAgMCAxIDAtNmg5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDN2MTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMThIMmw0LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNiAyMi00LTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9waWxjcm93LXJpZ2h0LmpzCnZhciBQaWxjcm93UmlnaHQ7CnZhciBpbml0X3BpbGNyb3dfcmlnaHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BpbGNyb3ctcmlnaHQuanMiKCkgewogICAgUGlsY3Jvd1JpZ2h0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgM3YxMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA5SDdhMSAxIDAgMCAxIDAtNmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDN2MTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMTQgNCA0SDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgMTgtNCA0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGlsY3Jvdy5qcwp2YXIgUGlsY3JvdzsKdmFyIGluaXRfcGlsY3JvdyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGlsY3Jvdy5qcyIoKSB7CiAgICBQaWxjcm93ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyA0djE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDRIOS41YTQuNSA0LjUgMCAwIDAgMCA5SDEzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGlsbC1ib3R0bGUuanMKdmFyIFBpbGxCb3R0bGU7CnZhciBpbml0X3BpbGxfYm90dGxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9waWxsLWJvdHRsZS5qcyIoKSB7CiAgICBQaWxsQm90dGxlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTFoLTRhMSAxIDAgMCAwLTEgMXY1YTEgMSAwIDAgMCAxIDFoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDd2MTNhMiAyIDAgMCAwIDIgMmg4YTIgMiAwIDAgMCAyLTJWNyIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNiIsIGhlaWdodDogIjUiLCB4OiAiNCIsIHk6ICIyIiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGlsbC5qcwp2YXIgUGlsbDsKdmFyIGluaXRfcGlsbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGlsbC5qcyIoKSB7CiAgICBQaWxsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAuNSAyMC41IDEwLTEwYTQuOTUgNC45NSAwIDEgMC03LTdsLTEwIDEwYTQuOTUgNC45NSAwIDEgMCA3IDdaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTguNSA4LjUgNyA3IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGluLW9mZi5qcwp2YXIgUGluT2ZmOwp2YXIgaW5pdF9waW5fb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9waW4tb2ZmLmpzIigpIHsKICAgIFBpbk9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3djUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgOS4zNFY3YTEgMSAwIDAgMSAxLTEgMiAyIDAgMCAwIDAtNEg3Ljg5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDl2MS43NmEyIDIgMCAwIDEtMS4xMSAxLjc5bC0xLjc4LjlBMiAyIDAgMCAwIDUgMTUuMjRWMTZhMSAxIDAgMCAwIDEgMWgxMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Bpbi5qcwp2YXIgUGluOwp2YXIgaW5pdF9waW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Bpbi5qcyIoKSB7CiAgICBQaW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN3Y1IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTkgMTAuNzZhMiAyIDAgMCAxLTEuMTEgMS43OWwtMS43OC45QTIgMiAwIDAgMCA1IDE1LjI0VjE2YTEgMSAwIDAgMCAxIDFoMTJhMSAxIDAgMCAwIDEtMXYtLjc2YTIgMiAwIDAgMC0xLjExLTEuNzlsLTEuNzgtLjlBMiAyIDAgMCAxIDE1IDEwLjc2VjdhMSAxIDAgMCAxIDEtMSAyIDIgMCAwIDAgMC00SDhhMiAyIDAgMCAwIDAgNCAxIDEgMCAwIDEgMSAxeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BpcGV0dGUuanMKdmFyIFBpcGV0dGU7CnZhciBpbml0X3BpcGV0dGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BpcGV0dGUuanMiKCkgewogICAgUGlwZXR0ZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTEyIDktOC40MTQgOC40MTRBMiAyIDAgMCAwIDMgMTguODI4djEuMzQ0YTIgMiAwIDAgMS0uNTg2IDEuNDE0QTIgMiAwIDAgMSAzLjgyOCAyMWgxLjM0NGEyIDIgMCAwIDAgMS40MTQtLjU4NkwxNSAxMiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOCA5IC40LjRhMSAxIDAgMSAxLTMgM2wtMy44LTMuOGExIDEgMCAxIDEgMy0zbC40LjQgMy40LTMuNGExIDEgMCAxIDEgMyAzeiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIyIC40MTQtLjQxNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BpenphLmpzCnZhciBQaXp6YTsKdmFyIGluaXRfcGl6emEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BpenphLmpzIigpIHsKICAgIFBpenphID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIgMTQtMSAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEzLjc1IDE4LjI1LTEuMjUgMS40MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy43NzUgNS42NTRhMTUuNjggMTUuNjggMCAwIDAtMTIuMTIxIDEyLjEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4LjggOS4zYTEgMSAwIDAgMCAyLjEgNy43IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxLjk2NCAyMC43MzJhMSAxIDAgMCAxLTEuMjMyIDEuMjMybC0xOC01YTEgMSAwIDAgMS0uNjk1LTEuMjMyQTE5LjY4IDE5LjY4IDAgMCAxIDE1LjczMiAyLjAzN2ExIDEgMCAwIDEgMS4yMzIuNjk1eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BsYW5lLWxhbmRpbmcuanMKdmFyIFBsYW5lTGFuZGluZzsKdmFyIGluaXRfcGxhbmVfbGFuZGluZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGxhbmUtbGFuZGluZy5qcyIoKSB7CiAgICBQbGFuZUxhbmRpbmcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIyaDIwIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTMuNzcgMTAuNzcgMiA5bDItNC41IDEuMS41NWMuNTUuMjguOS44NC45IDEuNDVzLjM1IDEuMTcuOSAxLjQ1TDggOC41bDMtNiAxLjA1LjUzYTIgMiAwIDAgMSAxLjA5IDEuNTJsLjcyIDUuNGEyIDIgMCAwIDAgMS4wOSAxLjUybDQuNCAyLjJjLjQyLjIyLjc4LjU1IDEuMDEuOTZsLjYgMS4wM2MuNDkuODgtLjA2IDEuOTgtMS4wNiAyLjFsLTEuMTguMTVjLS40Ny4wNi0uOTUtLjAyLTEuMzctLjI0TDQuMjkgMTEuMTVhMiAyIDAgMCAxLS41Mi0uMzhaIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGxhbmUtdGFrZW9mZi5qcwp2YXIgUGxhbmVUYWtlb2ZmOwp2YXIgaW5pdF9wbGFuZV90YWtlb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wbGFuZS10YWtlb2ZmLmpzIigpIHsKICAgIFBsYW5lVGFrZW9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjJoMjAiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNi4zNiAxNy40IDQgMTdsLTItNCAxLjEtLjU1YTIgMiAwIDAgMSAxLjggMGwuMTcuMWEyIDIgMCAwIDAgMS44IDBMOCAxMiA1IDZsLjktLjQ1YTIgMiAwIDAgMSAyLjA5LjJsNC4wMiAzYTIgMiAwIDAgMCAyLjEuMmw0LjE5LTIuMDZhMi40MSAyLjQxIDAgMCAxIDEuNzMtLjE3TDIxIDdhMS40IDEuNCAwIDAgMSAuODcgMS45OWwtLjM4Ljc2Yy0uMjMuNDYtLjYuODQtMS4wNyAxLjA4TDcuNTggMTcuMmEyIDIgMCAwIDEtMS4yMi4xOFoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wbGFuZS5qcwp2YXIgUGxhbmU7CnZhciBpbml0X3BsYW5lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wbGFuZS5qcyIoKSB7CiAgICBQbGFuZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE3LjggMTkuMiAxNiAxMWwzLjUtMy41QzIxIDYgMjEuNSA0IDIxIDNjLTEtLjUtMyAwLTQuNSAxLjVMMTMgOCA0LjggNi4yYy0uNS0uMS0uOS4xLTEuMS41bC0uMy41Yy0uMi41LS4xIDEgLjMgMS4zTDkgMTJsLTIgM0g0bC0xIDEgMyAyIDIgMyAxLTF2LTNsMy0yIDMuNSA1LjNjLjMuNC44LjUgMS4zLjNsLjUtLjJjLjQtLjMuNi0uNy41LTEuMnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wbGF5LmpzCnZhciBQbGF5Owp2YXIgaW5pdF9wbGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wbGF5LmpzIigpIHsKICAgIFBsYXkgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTUgNWEyIDIgMCAwIDEgMy4wMDgtMS43MjhsMTEuOTk3IDYuOTk4YTIgMiAwIDAgMSAuMDAzIDMuNDU4bC0xMiA3QTIgMiAwIDAgMSA1IDE5eiIgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wbHVnLTIuanMKdmFyIFBsdWcyOwp2YXIgaW5pdF9wbHVnXzIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BsdWctMi5qcyIoKSB7CiAgICBQbHVnMiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDJ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN3Y1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgOGgxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDExVjhoMTJ2M2E2IDYgMCAxIDEtMTIgMFoiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wbHVnLXphcC5qcwp2YXIgUGx1Z1phcDsKdmFyIGluaXRfcGx1Z196YXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BsdWctemFwLmpzIigpIHsKICAgIFBsdWdaYXAgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjMgMjAuM2EyLjQgMi40IDAgMCAwIDMuNCAwTDEyIDE4bC02LTYtMi4zIDIuM2EyLjQgMi40IDAgMCAwIDAgMy40WiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIyIDMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03LjUgMTMuNSAxMCAxMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC41IDE2LjUgMTMgMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMy00IDRoNmwtNCA0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGx1Zy5qcwp2YXIgUGx1ZzsKdmFyIGluaXRfcGx1ZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGx1Zy5qcyIoKSB7CiAgICBQbHVnID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjJ2LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgOFYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDhhMSAxIDAgMCAxIDEgMXY0YTQgNCAwIDAgMS00IDRoLTRhNCA0IDAgMCAxLTQtNFY5YTEgMSAwIDAgMSAxLTF6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgOFYyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGx1cy5qcwp2YXIgUGx1czsKdmFyIGluaXRfcGx1cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcGx1cy5qcyIoKSB7CiAgICBQbHVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxMmgxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA1djE0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcG9ja2V0LWtuaWZlLmpzCnZhciBQb2NrZXRLbmlmZTsKdmFyIGluaXRfcG9ja2V0X2tuaWZlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wb2NrZXQta25pZmUuanMiKCkgewogICAgUG9ja2V0S25pZmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDJ2MWMwIDEgMiAxIDIgMlMzIDYgMyA3czIgMSAyIDItMiAxLTIgMiAyIDEgMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDZoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMThoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwLjgzIDguODNhNCA0IDAgMCAwLTUuNjYtNS42NmwtMTIgMTJhNCA0IDAgMSAwIDUuNjYgNS42NloiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTEuNjZWMjJhNCA0IDAgMCAwIDQtNFY2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcG9ja2V0LmpzCnZhciBQb2NrZXQ7CnZhciBpbml0X3BvY2tldCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcG9ja2V0LmpzIigpIHsKICAgIFBvY2tldCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDNhMiAyIDAgMCAxIDIgMnY2YTEgMSAwIDAgMS0yMCAwVjVhMiAyIDAgMCAxIDItMnoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAxMCA0IDQgNC00IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcG9kY2FzdC5qcwp2YXIgUG9kY2FzdDsKdmFyIGluaXRfcG9kY2FzdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcG9kY2FzdC5qcyIoKSB7CiAgICBQb2RjYXN0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMTdhMSAxIDAgMSAwLTIgMGwuNSA0LjVhMC41IDAuNSAwIDAgMCAxIDB6IiwgZmlsbDogImN1cnJlbnRDb2xvciIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNi44NSAxOC41OGE5IDkgMCAxIDAtOS43IDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNGE1IDUgMCAxIDEgOCAwIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjExIiwgcjogIjEiLCBmaWxsOiAiY3VycmVudENvbG9yIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcG9pbnRlci5qcwp2YXIgUG9pbnRlcjsKdmFyIGluaXRfcG9pbnRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcG9pbnRlci5qcyIoKSB7CiAgICBQb2ludGVyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTRhOCA4IDAgMCAxLTggOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxMXYtMWEyIDIgMCAwIDAtMi0yYTIgMiAwIDAgMC0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTBWOWEyIDIgMCAwIDAtMi0yYTIgMiAwIDAgMC0yIDJ2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA5LjVWNGEyIDIgMCAwIDAtMi0yYTIgMiAwIDAgMC0yIDJ2MTAiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTggMTFhMiAyIDAgMSAxIDQgMHYzYTggOCAwIDAgMS04IDhoLTJjLTIuOCAwLTQuNS0uODYtNS45OS0yLjM0bC0zLjYtMy42YTIgMiAwIDAgMSAyLjgzLTIuODJMNyAxNSIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BvaW50ZXItb2ZmLmpzCnZhciBQb2ludGVyT2ZmOwp2YXIgaW5pdF9wb2ludGVyX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcG9pbnRlci1vZmYuanMiKCkgewogICAgUG9pbnRlck9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDQuNVY0YTIgMiAwIDAgMC0yLjQxLTEuOTU3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjkgOC40YTIgMiAwIDAgMC0xLjI2LTEuMjk1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxLjcgMTYuMkE4IDggMCAwIDAgMjIgMTR2LTNhMiAyIDAgMSAwLTQgMHYtMWEyIDIgMCAwIDAtMy42My0xLjE1OCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAibTcgMTUtMS44LTEuOGEyIDIgMCAwIDAtMi43OSAyLjg2TDYgMTkuN2E3Ljc0IDcuNzQgMCAwIDAgNiAyLjNoMmE4IDggMCAwIDAgNS42NTctMi4zNDMiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgNnY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BvcGNvcm4uanMKdmFyIFBvcGNvcm47CnZhciBpbml0X3BvcGNvcm4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BvcGNvcm4uanMiKCkgewogICAgUG9wY29ybiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDhhMiAyIDAgMCAwIDAtNCAyIDIgMCAwIDAtNCAwIDIgMiAwIDAgMC00IDAgMiAyIDAgMCAwLTQgMCAyIDIgMCAwIDAgMCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDIyIDkgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAyMiAxLTE0IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDhjLjUgMCAuOS40LjggMWwtMi42IDEyYy0uMS41LS43IDEtMS4yIDFIN2MtLjYgMC0xLjEtLjQtMS4yLTFMMy4yIDljLS4xLS42LjMtMSAuOC0xWiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BvcHNpY2xlLmpzCnZhciBQb3BzaWNsZTsKdmFyIGluaXRfcG9wc2ljbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BvcHNpY2xlLmpzIigpIHsKICAgIFBvcHNpY2xlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk0xOC42IDE0LjRjLjgtLjguOC0yIDAtMi44bC04LjEtOC4xYTQuOTUgNC45NSAwIDEgMC03LjEgNy4xbDguMSA4LjFjLjkuNyAyLjEuNyAyLjktLjFaIiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiAyMi01LjUtNS41IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcG91bmQtc3RlcmxpbmcuanMKdmFyIFBvdW5kU3Rlcmxpbmc7CnZhciBpbml0X3BvdW5kX3N0ZXJsaW5nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wb3VuZC1zdGVybGluZy5qcyIoKSB7CiAgICBQb3VuZFN0ZXJsaW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggN2MwLTUuMzMzLTgtNS4zMzMtOCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDd2MTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAyMWgxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEzaDEwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcG93ZXItb2ZmLmpzCnZhciBQb3dlck9mZjsKdmFyIGluaXRfcG93ZXJfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wb3dlci1vZmYuanMiKCkgewogICAgUG93ZXJPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOC4zNiA2LjY0QTkgOSAwIDAgMSAyMC43NyAxNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjE2IDYuMTZhOSA5IDAgMSAwIDEyLjY4IDEyLjY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wb3dlci5qcwp2YXIgUG93ZXI7CnZhciBpbml0X3Bvd2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wb3dlci5qcyIoKSB7CiAgICBQb3dlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTguNCA2LjZhOSA5IDAgMSAxLTEyLjc3LjA0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcHJlc2VudGF0aW9uLmpzCnZhciBQcmVzZW50YXRpb247CnZhciBpbml0X3ByZXNlbnRhdGlvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcHJlc2VudGF0aW9uLmpzIigpIHsKICAgIFByZXNlbnRhdGlvbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgM2gyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAzdjExYTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yVjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNyAyMSA1LTUgNSA1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcHJpbnRlci1jaGVjay5qcwp2YXIgUHJpbnRlckNoZWNrOwp2YXIgaW5pdF9wcmludGVyX2NoZWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wcmludGVyLWNoZWNrLmpzIigpIHsKICAgIFByaW50ZXJDaGVjayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjUgMjJIN2ExIDEgMCAwIDEtMS0xdi02YTEgMSAwIDAgMSAxLTFoMTBhMSAxIDAgMCAxIDEgMXYuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAxOSAyIDIgNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMThINGEyIDIgMCAwIDEtMi0ydi01YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgOVYzYTEgMSAwIDAgMSAxLTFoMTBhMSAxIDAgMCAxIDEgMXY2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcHJpbnRlci14LmpzCnZhciBQcmludGVyWDsKdmFyIGluaXRfcHJpbnRlcl94ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wcmludGVyLXguanMiKCkgewogICAgUHJpbnRlclggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMi41MzEgMjJIN2ExIDEgMCAwIDEtMS0xdi02YTEgMSAwIDAgMSAxLTFoNi4zNzciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYuNSAxNi41IDUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNi41IDIxLjUgNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMThINGEyIDIgMCAwIDEtMi0ydi01YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnYxLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA5VjNhMSAxIDAgMCAxIDEtMWgxMGExIDEgMCAwIDEgMSAxdjYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wcmludGVyLmpzCnZhciBQcmludGVyOwp2YXIgaW5pdF9wcmludGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9wcmludGVyLmpzIigpIHsKICAgIFByaW50ZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE4SDRhMiAyIDAgMCAxLTItMnYtNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ2NWEyIDIgMCAwIDEtMiAyaC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgOVYzYTEgMSAwIDAgMSAxLTFoMTBhMSAxIDAgMCAxIDEgMXY2IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiNiIsIHk6ICIxNCIsIHdpZHRoOiAiMTIiLCBoZWlnaHQ6ICI4Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcHJvamVjdG9yLmpzCnZhciBQcm9qZWN0b3I7CnZhciBpbml0X3Byb2plY3RvciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcHJvamVjdG9yLmpzIigpIHsKICAgIFByb2plY3RvciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgNyAzIDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA2VjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMgNyAyLTIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICIxMyIsIHI6ICIzIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTEuODMgMTJIMjBhMiAyIDAgMCAxIDIgMnY0YTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0ydi00YTIgMiAwIDAgMSAyLTJoMi4xNyIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTZoMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Byb3BvcnRpb25zLmpzCnZhciBQcm9wb3J0aW9uczsKdmFyIGluaXRfcHJvcG9ydGlvbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Byb3BvcnRpb25zLmpzIigpIHsKICAgIFByb3BvcnRpb25zID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxNiIsIHg6ICIyIiwgeTogIjQiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOXYxMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDloMTNhMiAyIDAgMCAxIDIgMnY5IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcHV6emxlLmpzCnZhciBQdXp6bGU7CnZhciBpbml0X3B1enpsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcHV6emxlLmpzIigpIHsKICAgIFB1enpsZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE1LjM5IDQuMzlhMSAxIDAgMCAwIDEuNjgtLjQ3NCAyLjUgMi41IDAgMSAxIDMuMDE0IDMuMDE1IDEgMSAwIDAgMC0uNDc0IDEuNjhsMS42ODMgMS42ODJhMi40MTQgMi40MTQgMCAwIDEgMCAzLjQxNEwxOS42MSAxNS4zOWExIDEgMCAwIDEtMS42OC0uNDc0IDIuNSAyLjUgMCAxIDAtMy4wMTQgMy4wMTUgMSAxIDAgMCAxIC40NzQgMS42OGwtMS42ODMgMS42ODJhMi40MTQgMi40MTQgMCAwIDEtMy40MTQgMEw4LjYxIDE5LjYxYTEgMSAwIDAgMC0xLjY4LjQ3NCAyLjUgMi41IDAgMSAxLTMuMDE0LTMuMDE1IDEgMSAwIDAgMCAuNDc0LTEuNjhsLTEuNjgzLTEuNjgyYTIuNDE0IDIuNDE0IDAgMCAxIDAtMy40MTRMNC4zOSA4LjYxYTEgMSAwIDAgMSAxLjY4LjQ3NCAyLjUgMi41IDAgMSAwIDMuMDE0LTMuMDE1IDEgMSAwIDAgMS0uNDc0LTEuNjhsMS42ODMtMS42ODJhMi40MTQgMi40MTQgMCAwIDEgMy40MTQgMHoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9weXJhbWlkLmpzCnZhciBQeXJhbWlkOwp2YXIgaW5pdF9weXJhbWlkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9weXJhbWlkLmpzIigpIHsKICAgIFB5cmFtaWQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yLjUgMTYuODhhMSAxIDAgMCAxLS4zMi0xLjQzbDktMTMuMDJhMSAxIDAgMCAxIDEuNjQgMGw5IDEzLjAxYTEgMSAwIDAgMS0uMzIgMS40NGwtOC41MSA0Ljg2YTIgMiAwIDAgMS0xLjk4IDBaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MjAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9xci1jb2RlLmpzCnZhciBRckNvZGU7CnZhciBpbml0X3FyX2NvZGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3FyLWNvZGUuanMiKCkgewogICAgUXJDb2RlID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNSIsIGhlaWdodDogIjUiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjUiLCBoZWlnaHQ6ICI1IiwgeDogIjE2IiwgeTogIjMiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNSIsIGhlaWdodDogIjUiLCB4OiAiMyIsIHk6ICIxNiIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNmgtM2EyIDIgMCAwIDAtMiAydjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMjF2LjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2M2EyIDIgMCAwIDEtMiAySDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgM2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTZ2LjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEyaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTJ2LjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIxdi0xIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmFiYml0LmpzCnZhciBSYWJiaXQ7CnZhciBpbml0X3JhYmJpdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmFiYml0LmpzIigpIHsKICAgIFJhYmJpdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzIDE2YTMgMyAwIDAgMSAyLjI0IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTJoLjAxIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE4IDIxaC04YTQgNCAwIDAgMS00LTQgNyA3IDAgMCAxIDctN2guMkw5LjYgNi40YTEgMSAwIDEgMSAyLjgtMi44TDE1LjggN2guMmMzLjMgMCA2IDIuNyA2IDZ2MWEyIDIgMCAwIDEtMiAyaC0xYTMgMyAwIDAgMC0zIDMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgOC41NFY0YTIgMiAwIDEgMC00IDB2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03LjYxMiAxMi41MjRhMyAzIDAgMSAwLTEuNiA0LjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9xdW90ZS5qcwp2YXIgUXVvdGU7CnZhciBpbml0X3F1b3RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9xdW90ZS5qcyIoKSB7CiAgICBRdW90ZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE2IDNhMiAyIDAgMCAwLTIgMnY2YTIgMiAwIDAgMCAyIDIgMSAxIDAgMCAxIDEgMXYxYTIgMiAwIDAgMS0yIDIgMSAxIDAgMCAwLTEgMXYyYTEgMSAwIDAgMCAxIDEgNiA2IDAgMCAwIDYtNlY1YTIgMiAwIDAgMC0yLTJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTUgM2EyIDIgMCAwIDAtMiAydjZhMiAyIDAgMCAwIDIgMiAxIDEgMCAwIDEgMSAxdjFhMiAyIDAgMCAxLTIgMiAxIDEgMCAwIDAtMSAxdjJhMSAxIDAgMCAwIDEgMSA2IDYgMCAwIDAgNi02VjVhMiAyIDAgMCAwLTItMnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yYWRhci5qcwp2YXIgUmFkYXI7CnZhciBpbml0X3JhZGFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yYWRhci5qcyIoKSB7CiAgICBSYWRhciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5LjA3IDQuOTNBMTAgMTAgMCAwIDAgNi45OSAzLjM0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgNmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMi4yOSA5LjYyQTEwIDEwIDAgMSAwIDIxLjMxIDguMzUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYuMjQgNy43NkE2IDYgMCAxIDAgOC4yMyAxNi42NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuOTkgMTEuNjZBNiA2IDAgMCAxIDE1Ljc3IDE2LjY3IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMuNDEgMTAuNTkgNS42Ni01LjY2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmFkaWF0aW9uLmpzCnZhciBSYWRpYXRpb247CnZhciBpbml0X3JhZGlhdGlvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmFkaWF0aW9uLmpzIigpIHsKICAgIFJhZGlhdGlvbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEyaC4wMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNCAxNS40NjQxYTQgNCAwIDAgMS00IDBMNy41Mjc4NiAxOS43NDU5NyBBIDEgMSAwIDAgMCA3Ljk5MzAzIDIxLjE2MjExIDEwIDEwIDAgMCAwIDE2LjAwNjk3IDIxLjE2MjExIDEgMSAwIDAgMCAxNi40NzIxNCAxOS43NDU5N3oiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTYgMTJhNCA0IDAgMCAwLTItMy40NjRsMi40NzItNC4yODJhMSAxIDAgMCAxIDEuNDYtLjMwNSAxMCAxMCAwIDAgMSA0LjAwNiA2Ljk0QTEgMSAwIDAgMSAyMSAxMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOCAxMmE0IDQgMCAwIDEgMi0zLjQ2NEw3LjUyOCA0LjI1NGExIDEgMCAwIDAtMS40Ni0uMzA1IDEwIDEwIDAgMCAwLTQuMDA2IDYuOTRBMSAxIDAgMCAwIDMgMTJ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmFkaWNhbC5qcwp2YXIgUmFkaWNhbDsKdmFyIGluaXRfcmFkaWNhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmFkaWNhbC5qcyIoKSB7CiAgICBSYWRpY2FsID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMyAxMmgzLjI4YTEgMSAwIDAgMSAuOTQ4LjY4NGwyLjI5OCA3LjkzNGEuNS41IDAgMCAwIC45Ni0uMDQ0TDEzLjgyIDQuNzcxQTEgMSAwIDAgMSAxNC43OTIgNEgyMSIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JhZGlvLXJlY2VpdmVyLmpzCnZhciBSYWRpb1JlY2VpdmVyOwp2YXIgaW5pdF9yYWRpb19yZWNlaXZlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmFkaW8tcmVjZWl2ZXIuanMiKCkgewogICAgUmFkaW9SZWNlaXZlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTZ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxNnYyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiOCIsIHg6ICIyIiwgeTogIjgiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTJoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmFkaW8uanMKdmFyIFJhZGlvOwp2YXIgaW5pdF9yYWRpbyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmFkaW8uanMiKCkgewogICAgUmFkaW8gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNi4yNDcgNy43NjFhNiA2IDAgMCAxIDAgOC40NzgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkuMDc1IDQuOTMzYTEwIDEwIDAgMCAxIDAgMTQuMTM0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQuOTI1IDE5LjA2N2ExMCAxMCAwIDAgMSAwLTE0LjEzNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03Ljc1MyAxNi4yMzlhNiA2IDAgMCAxIDAtOC40NzgiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JhZGlvLXRvd2VyLmpzCnZhciBSYWRpb1Rvd2VyOwp2YXIgaW5pdF9yYWRpb190b3dlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmFkaW8tdG93ZXIuanMiKCkgewogICAgUmFkaW9Ub3dlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQuOSAxNi4xQzEgMTIuMiAxIDUuOCA0LjkgMS45IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcuOCA0LjdhNi4xNCA2LjE0IDAgMCAwLS44IDcuNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICI5IiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYuMiA0LjhjMiAyIDIuMjYgNS4xMS44IDcuNDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkuMSAxLjlhOS45NiA5Ljk2IDAgMCAxIDAgMTQuMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjUgMThoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDIyIDQtMTEgNCAxMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JhZGl1cy5qcwp2YXIgUmFkaXVzOwp2YXIgaW5pdF9yYWRpdXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JhZGl1cy5qcyIoKSB7CiAgICBSYWRpdXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC4zNCAxNy41MmExMCAxMCAwIDEgMC0yLjgyIDIuODIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiMTkiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMy40MSAxMy40MSA0LjE4IDQuMTgiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JhaWwtc3ltYm9sLmpzCnZhciBSYWlsU3ltYm9sOwp2YXIgaW5pdF9yYWlsX3N5bWJvbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmFpbC1zeW1ib2wuanMiKCkgewogICAgUmFpbFN5bWJvbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTVoMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSA5aDE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDIwLTUtNSA2LTYtNS01IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmFpbmJvdy5qcwp2YXIgUmFpbmJvdzsKdmFyIGluaXRfcmFpbmJvdyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmFpbmJvdy5qcyIoKSB7CiAgICBSYWluYm93ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTdhMTAgMTAgMCAwIDAtMjAgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE3YTYgNiAwIDAgMSAxMiAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE3YTIgMiAwIDAgMSA0IDAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yYXQuanMKdmFyIFJhdDsKdmFyIGluaXRfcmF0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yYXQuanMiKCkgewogICAgUmF0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMjJINGEyIDIgMCAwIDEgMC00aDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjIzNiAxOGEzIDMgMCAwIDAtMi4yLTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgOWguMDEiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTYuODIgMy45NGEzIDMgMCAxIDEgMy4yMzcgNC44NjhsMS44MTUgMi41ODdhMS41IDEuNSAwIDAgMS0xLjUgMi4xbC0yLjg3Mi0uNDUzYTMgMyAwIDAgMC0zLjUgMyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyA0Ljk4OGEzIDMgMCAxIDAtNS4yIDIuMDUyQTcgNyAwIDAgMCA0IDE0LjAxNSA0IDQgMCAwIDAgOCAxOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JhdGlvLmpzCnZhciBSYXRpbzsKdmFyIGluaXRfcmF0aW8gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JhdGlvLmpzIigpIHsKICAgIFJhdGlvID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTIiLCBoZWlnaHQ6ICIyMCIsIHg6ICI2IiwgeTogIjIiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxMiIsIHg6ICIyIiwgeTogIjYiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWNlaXB0LWV1cm8uanMKdmFyIFJlY2VpcHRFdXJvOwp2YXIgaW5pdF9yZWNlaXB0X2V1cm8gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY2VpcHQtZXVyby5qcyIoKSB7CiAgICBSZWNlaXB0RXVybyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1LjgyOCAxNC44MjlhNCA0IDAgMCAxLTUuNjU2IDAgNCA0IDAgMCAxIDAtNS42NTcgNCA0IDAgMCAxIDUuNjU2IDAiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNCAzYTEgMSAwIDAgMSAxLTEgMS4zIDEuMyAwIDAgMSAuNy4ybC45MzMuNmExLjMgMS4zIDAgMCAwIDEuNCAwbC45MzQtLjZhMS4zIDEuMyAwIDAgMSAxLjQgMGwuOTMzLjZhMS4zIDEuMyAwIDAgMCAxLjQgMGwuOTMzLS42YTEuMyAxLjMgMCAwIDEgMS40IDBsLjkzNC42YTEuMyAxLjMgMCAwIDAgMS40IDBsLjkzMy0uNkExLjMgMS4zIDAgMCAxIDE5IDJhMSAxIDAgMCAxIDEgMXYxOGExIDEgMCAwIDEtMSAxIDEuMyAxLjMgMCAwIDEtLjctLjJsLS45MzMtLjZhMS4zIDEuMyAwIDAgMC0xLjQgMGwtLjkzNC42YTEuMyAxLjMgMCAwIDEtMS40IDBsLS45MzMtLjZhMS4zIDEuMyAwIDAgMC0xLjQgMGwtLjkzMy42YTEuMyAxLjMgMCAwIDEtMS40IDBsLS45MzQtLjZhMS4zIDEuMyAwIDAgMC0xLjQgMGwtLjkzMy42YTEuMyAxLjMgMCAwIDEtLjcuMiAxIDEgMCAwIDEtMS0xeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEyaDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWNlaXB0LWNlbnQuanMKdmFyIFJlY2VpcHRDZW50Owp2YXIgaW5pdF9yZWNlaXB0X2NlbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY2VpcHQtY2VudC5qcyIoKSB7CiAgICBSZWNlaXB0Q2VudCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2MTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQuODI4IDE0LjgyOWE0IDQgMCAwIDEtNS42NTYgMCA0IDQgMCAwIDEgMC01LjY1NyA0IDQgMCAwIDEgNS42NTYgMCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDNhMSAxIDAgMCAxIDEtMSAxLjMgMS4zIDAgMCAxIC43LjJsLjkzMy42YTEuMyAxLjMgMCAwIDAgMS40IDBsLjkzNC0uNmExLjMgMS4zIDAgMCAxIDEuNCAwbC45MzMuNmExLjMgMS4zIDAgMCAwIDEuNCAwbC45MzMtLjZhMS4zIDEuMyAwIDAgMSAxLjQgMGwuOTM0LjZhMS4zIDEuMyAwIDAgMCAxLjQgMGwuOTMzLS42QTEuMyAxLjMgMCAwIDEgMTkgMmExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDEgMS4zIDEuMyAwIDAgMS0uNy0uMmwtLjkzMy0uNmExLjMgMS4zIDAgMCAwLTEuNCAwbC0uOTM0LjZhMS4zIDEuMyAwIDAgMS0xLjQgMGwtLjkzMy0uNmExLjMgMS4zIDAgMCAwLTEuNCAwbC0uOTMzLjZhMS4zIDEuMyAwIDAgMS0xLjQgMGwtLjkzNC0uNmExLjMgMS4zIDAgMCAwLTEuNCAwbC0uOTMzLjZhMS4zIDEuMyAwIDAgMS0uNy4yIDEgMSAwIDAgMS0xLTF6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVjZWlwdC1pbmRpYW4tcnVwZWUuanMKdmFyIFJlY2VpcHRJbmRpYW5SdXBlZTsKdmFyIGluaXRfcmVjZWlwdF9pbmRpYW5fcnVwZWUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY2VpcHQtaW5kaWFuLXJ1cGVlLmpzIigpIHsKICAgIFJlY2VpcHRJbmRpYW5SdXBlZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQgM2ExIDEgMCAwIDEgMS0xIDEuMyAxLjMgMCAwIDEgLjcuMmwuOTMzLjZhMS4zIDEuMyAwIDAgMCAxLjQgMGwuOTM0LS42YTEuMyAxLjMgMCAwIDEgMS40IDBsLjkzMy42YTEuMyAxLjMgMCAwIDAgMS40IDBsLjkzMy0uNmExLjMgMS4zIDAgMCAxIDEuNCAwbC45MzQuNmExLjMgMS4zIDAgMCAwIDEuNCAwbC45MzMtLjZBMS4zIDEuMyAwIDAgMSAxOSAyYTEgMSAwIDAgMSAxIDF2MThhMSAxIDAgMCAxLTEgMSAxLjMgMS4zIDAgMCAxLS43LS4ybC0uOTMzLS42YTEuMyAxLjMgMCAwIDAtMS40IDBsLS45MzQuNmExLjMgMS4zIDAgMCAxLTEuNCAwbC0uOTMzLS42YTEuMyAxLjMgMCAwIDAtMS40IDBsLS45MzMuNmExLjMgMS4zIDAgMCAxLTEuNCAwbC0uOTM0LS42YTEuMyAxLjMgMCAwIDAtMS40IDBsLS45MzMuNmExLjMgMS4zIDAgMCAxLS43LjIgMSAxIDAgMCAxLTEtMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMWg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggN2g4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgN2E0IDQgMCAwIDEgMCA4SDhsMyAyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVjZWlwdC1qYXBhbmVzZS15ZW4uanMKdmFyIFJlY2VpcHRKYXBhbmVzZVllbjsKdmFyIGluaXRfcmVjZWlwdF9qYXBhbmVzZV95ZW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY2VpcHQtamFwYW5lc2UteWVuLmpzIigpIHsKICAgIFJlY2VpcHRKYXBhbmVzZVllbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDEwIDMtMyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDNhMSAxIDAgMCAxIDEtMSAxLjMgMS4zIDAgMCAxIC43LjJsLjkzMy42YTEuMyAxLjMgMCAwIDAgMS40IDBsLjkzNC0uNmExLjMgMS4zIDAgMCAxIDEuNCAwbC45MzMuNmExLjMgMS4zIDAgMCAwIDEuNCAwbC45MzMtLjZhMS4zIDEuMyAwIDAgMSAxLjQgMGwuOTM0LjZhMS4zIDEuMyAwIDAgMCAxLjQgMGwuOTMzLS42QTEuMyAxLjMgMCAwIDEgMTkgMmExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDEgMS4zIDEuMyAwIDAgMS0uNy0uMmwtLjkzMy0uNmExLjMgMS4zIDAgMCAwLTEuNCAwbC0uOTM0LjZhMS4zIDEuMyAwIDAgMS0xLjQgMGwtLjkzMy0uNmExLjMgMS4zIDAgMCAwLTEuNCAwbC0uOTMzLjZhMS4zIDEuMyAwIDAgMS0xLjQgMGwtLjkzNC0uNmExLjMgMS4zIDAgMCAwLTEuNCAwbC0uOTMzLjZhMS4zIDEuMyAwIDAgMS0uNy4yIDEgMSAwIDAgMS0xLTF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTFoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE1aDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSA3IDMgM3Y3IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVjZWlwdC1wb3VuZC1zdGVybGluZy5qcwp2YXIgUmVjZWlwdFBvdW5kU3Rlcmxpbmc7CnZhciBpbml0X3JlY2VpcHRfcG91bmRfc3RlcmxpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY2VpcHQtcG91bmQtc3RlcmxpbmcuanMiKCkgewogICAgUmVjZWlwdFBvdW5kU3RlcmxpbmcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxN1Y5LjVhMSAxIDAgMCAxIDUgMCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDNhMSAxIDAgMCAxIDEtMSAxLjMgMS4zIDAgMCAxIC43LjJsLjkzMy42YTEuMyAxLjMgMCAwIDAgMS40IDBsLjkzNC0uNmExLjMgMS4zIDAgMCAxIDEuNCAwbC45MzMuNmExLjMgMS4zIDAgMCAwIDEuNCAwbC45MzMtLjZhMS4zIDEuMyAwIDAgMSAxLjQgMGwuOTM0LjZhMS4zIDEuMyAwIDAgMCAxLjQgMGwuOTMzLS42QTEuMyAxLjMgMCAwIDEgMTkgMmExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDEgMS4zIDEuMyAwIDAgMS0uNy0uMmwtLjkzMy0uNmExLjMgMS4zIDAgMCAwLTEuNCAwbC0uOTM0LjZhMS4zIDEuMyAwIDAgMS0xLjQgMGwtLjkzMy0uNmExLjMgMS4zIDAgMCAwLTEuNCAwbC0uOTMzLjZhMS4zIDEuMyAwIDAgMS0xLjQgMGwtLjkzNC0uNmExLjMgMS4zIDAgMCAwLTEuNCAwbC0uOTMzLjZhMS4zIDEuMyAwIDAgMS0uNy4yIDEgMSAwIDAgMS0xLTF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTNoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE3aDciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWNlaXB0LXJ1c3NpYW4tcnVibGUuanMKdmFyIFJlY2VpcHRSdXNzaWFuUnVibGU7CnZhciBpbml0X3JlY2VpcHRfcnVzc2lhbl9ydWJsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVjZWlwdC1ydXNzaWFuLXJ1YmxlLmpzIigpIHsKICAgIFJlY2VpcHRSdXNzaWFuUnVibGUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDNhMSAxIDAgMCAxIDEtMSAxLjMgMS4zIDAgMCAxIC43LjJsLjkzMy42YTEuMyAxLjMgMCAwIDAgMS40IDBsLjkzNC0uNmExLjMgMS4zIDAgMCAxIDEuNCAwbC45MzMuNmExLjMgMS4zIDAgMCAwIDEuNCAwbC45MzMtLjZhMS4zIDEuMyAwIDAgMSAxLjQgMGwuOTM0LjZhMS4zIDEuMyAwIDAgMCAxLjQgMGwuOTMzLS42QTEuMyAxLjMgMCAwIDEgMTkgMmExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDEgMS4zIDEuMyAwIDAgMS0uNy0uMmwtLjkzMy0uNmExLjMgMS4zIDAgMCAwLTEuNCAwbC0uOTM0LjZhMS4zIDEuMyAwIDAgMS0xLjQgMGwtLjkzMy0uNmExLjMgMS4zIDAgMCAwLTEuNCAwbC0uOTMzLjZhMS4zIDEuMyAwIDAgMS0xLjQgMGwtLjkzNC0uNmExLjMgMS4zIDAgMCAwLTEuNCAwbC0uOTMzLjZhMS4zIDEuMyAwIDAgMS0uNy4yIDEgMSAwIDAgMS0xLTF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTFoNWEyIDIgMCAwIDAgMC00aC0zdjEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTVoNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY2VpcHQtdGV4dC5qcwp2YXIgUmVjZWlwdFRleHQ7CnZhciBpbml0X3JlY2VpcHRfdGV4dCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVjZWlwdC10ZXh0LmpzIigpIHsKICAgIFJlY2VpcHRUZXh0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMTZIOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA4SDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTJIOCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDNhMSAxIDAgMCAxIDEtMSAxLjMgMS4zIDAgMCAxIC43LjJsLjkzMy42YTEuMyAxLjMgMCAwIDAgMS40IDBsLjkzNC0uNmExLjMgMS4zIDAgMCAxIDEuNCAwbC45MzMuNmExLjMgMS4zIDAgMCAwIDEuNCAwbC45MzMtLjZhMS4zIDEuMyAwIDAgMSAxLjQgMGwuOTM0LjZhMS4zIDEuMyAwIDAgMCAxLjQgMGwuOTMzLS42QTEuMyAxLjMgMCAwIDEgMTkgMmExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDEgMS4zIDEuMyAwIDAgMS0uNy0uMmwtLjkzMy0uNmExLjMgMS4zIDAgMCAwLTEuNCAwbC0uOTM0LjZhMS4zIDEuMyAwIDAgMS0xLjQgMGwtLjkzMy0uNmExLjMgMS4zIDAgMCAwLTEuNCAwbC0uOTMzLjZhMS4zIDEuMyAwIDAgMS0xLjQgMGwtLjkzNC0uNmExLjMgMS4zIDAgMCAwLTEuNCAwbC0uOTMzLjZhMS4zIDEuMyAwIDAgMS0uNy4yIDEgMSAwIDAgMS0xLTF6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVjZWlwdC1zd2lzcy1mcmFuYy5qcwp2YXIgUmVjZWlwdFN3aXNzRnJhbmM7CnZhciBpbml0X3JlY2VpcHRfc3dpc3NfZnJhbmMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY2VpcHQtc3dpc3MtZnJhbmMuanMiKCkgewogICAgUmVjZWlwdFN3aXNzRnJhbmMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMWg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE3VjdoNSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDNhMSAxIDAgMCAxIDEtMSAxLjMgMS4zIDAgMCAxIC43LjJsLjkzMy42YTEuMyAxLjMgMCAwIDAgMS40IDBsLjkzNC0uNmExLjMgMS4zIDAgMCAxIDEuNCAwbC45MzMuNmExLjMgMS4zIDAgMCAwIDEuNCAwbC45MzMtLjZhMS4zIDEuMyAwIDAgMSAxLjQgMGwuOTM0LjZhMS4zIDEuMyAwIDAgMCAxLjQgMGwuOTMzLS42QTEuMyAxLjMgMCAwIDEgMTkgMmExIDEgMCAwIDEgMSAxdjE4YTEgMSAwIDAgMS0xIDEgMS4zIDEuMyAwIDAgMS0uNy0uMmwtLjkzMy0uNmExLjMgMS4zIDAgMCAwLTEuNCAwbC0uOTM0LjZhMS4zIDEuMyAwIDAgMS0xLjQgMGwtLjkzMy0uNmExLjMgMS4zIDAgMCAwLTEuNCAwbC0uOTMzLjZhMS4zIDEuMyAwIDAgMS0xLjQgMGwtLjkzNC0uNmExLjMgMS4zIDAgMCAwLTEuNCAwbC0uOTMzLjZhMS4zIDEuMyAwIDAgMS0uNy4yIDEgMSAwIDAgMS0xLTF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTVoNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY2VpcHQtdHVya2lzaC1saXJhLmpzCnZhciBSZWNlaXB0VHVya2lzaExpcmE7CnZhciBpbml0X3JlY2VpcHRfdHVya2lzaF9saXJhID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWNlaXB0LXR1cmtpc2gtbGlyYS5qcyIoKSB7CiAgICBSZWNlaXB0VHVya2lzaExpcmEgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA3djEwYTUgNSAwIDAgMCA1LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgOC02IDMiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNCAzYTEgMSAwIDAgMSAxLTEgMS4zIDEuMyAwIDAgMSAuNy4ybC45MzMuNmExLjMgMS4zIDAgMCAwIDEuNCAwbC45MzQtLjZhMS4zIDEuMyAwIDAgMSAxLjQgMGwuOTMzLjZhMS4zIDEuMyAwIDAgMCAxLjQgMGwuOTMzLS42YTEuMyAxLjMgMCAwIDEgMS40IDBsLjkzNC42YTEuMyAxLjMgMCAwIDAgMS40IDBsLjkzMy0uNkExLjMgMS4zIDAgMCAxIDE5IDJhMSAxIDAgMCAxIDEgMXYxOGExIDEgMCAwIDEtMSAxIDEuMyAxLjMgMCAwIDEtLjctLjJsLS45MzMtLjZhMS4zIDEuMyAwIDAgMC0xLjQgMGwtLjkzNC42YTEuMyAxLjMgMCAwIDEtMS40IDBsLS45MzMtLjZhMS4zIDEuMyAwIDAgMC0xLjQgMGwtLjkzMy42YTEuMyAxLjMgMCAwIDEtMS40IDBsLS45MzQtLjZhMS4zIDEuMyAwIDAgMC0xLjQgMGwtLjkzMy42YTEuMyAxLjMgMCAwIDEtLjcuMiAxIDEgMCAwIDEtMS0xeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY2VpcHQuanMKdmFyIFJlY2VpcHQ7CnZhciBpbml0X3JlY2VpcHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY2VpcHQuanMiKCkgewogICAgUmVjZWlwdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3VjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgOGgtNmEyIDIgMCAwIDAgMCA0aDRhMiAyIDAgMCAxIDAgNEg4IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQgM2ExIDEgMCAwIDEgMS0xIDEuMyAxLjMgMCAwIDEgLjcuMmwuOTMzLjZhMS4zIDEuMyAwIDAgMCAxLjQgMGwuOTM0LS42YTEuMyAxLjMgMCAwIDEgMS40IDBsLjkzMy42YTEuMyAxLjMgMCAwIDAgMS40IDBsLjkzMy0uNmExLjMgMS4zIDAgMCAxIDEuNCAwbC45MzQuNmExLjMgMS4zIDAgMCAwIDEuNCAwbC45MzMtLjZBMS4zIDEuMyAwIDAgMSAxOSAyYTEgMSAwIDAgMSAxIDF2MThhMSAxIDAgMCAxLTEgMSAxLjMgMS4zIDAgMCAxLS43LS4ybC0uOTMzLS42YTEuMyAxLjMgMCAwIDAtMS40IDBsLS45MzQuNmExLjMgMS4zIDAgMCAxLTEuNCAwbC0uOTMzLS42YTEuMyAxLjMgMCAwIDAtMS40IDBsLS45MzMuNmExLjMgMS4zIDAgMCAxLTEuNCAwbC0uOTM0LS42YTEuMyAxLjMgMCAwIDAtMS40IDBsLS45MzMuNmExLjMgMS4zIDAgMCAxLS43LjIgMSAxIDAgMCAxLTEtMXoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWN0YW5nbGUtY2lyY2xlLmpzCnZhciBSZWN0YW5nbGVDaXJjbGU7CnZhciBpbml0X3JlY3RhbmdsZV9jaXJjbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY3RhbmdsZS1jaXJjbGUuanMiKCkgewogICAgUmVjdGFuZ2xlQ2lyY2xlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgNHYxNkgzYTEgMSAwIDAgMS0xLTFWNWExIDEgMCAwIDEgMS0xeiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE0IiwgY3k6ICIxMiIsIHI6ICI4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVjdGFuZ2xlLWVsbGlwc2lzLmpzCnZhciBSZWN0YW5nbGVFbGxpcHNpczsKdmFyIGluaXRfcmVjdGFuZ2xlX2VsbGlwc2lzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWN0YW5nbGUtZWxsaXBzaXMuanMiKCkgewogICAgUmVjdGFuZ2xlRWxsaXBzaXMgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjEyIiwgeDogIjIiLCB5OiAiNiIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTJoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVjdGFuZ2xlLWdvZ2dsZXMuanMKdmFyIFJlY3RhbmdsZUdvZ2dsZXM7CnZhciBpbml0X3JlY3RhbmdsZV9nb2dnbGVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWN0YW5nbGUtZ29nZ2xlcy5qcyIoKSB7CiAgICBSZWN0YW5nbGVHb2dnbGVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgNmEyIDIgMCAwIDEgMiAydjhhMiAyIDAgMCAxLTIgMmgtNGEyIDIgMCAwIDEtMS42LS44bC0xLjYtMi4xM2ExIDEgMCAwIDAtMS42IDBMOS42IDE3LjJBMiAyIDAgMCAxIDggMThINGEyIDIgMCAwIDEtMi0yVjhhMiAyIDAgMCAxIDItMnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWN0YW5nbGUtaG9yaXpvbnRhbC5qcwp2YXIgUmVjdGFuZ2xlSG9yaXpvbnRhbDsKdmFyIGluaXRfcmVjdGFuZ2xlX2hvcml6b250YWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY3RhbmdsZS1ob3Jpem9udGFsLmpzIigpIHsKICAgIFJlY3RhbmdsZUhvcml6b250YWwgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjEyIiwgeDogIjIiLCB5OiAiNiIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY3ljbGUuanMKdmFyIFJlY3ljbGU7CnZhciBpbml0X3JlY3ljbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY3ljbGUuanMiKCkgewogICAgUmVjeWNsZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTlINC44MTVhMS44MyAxLjgzIDAgMCAxLTEuNTctLjg4MSAxLjc4NSAxLjc4NSAwIDAgMS0uMDA0LTEuNzg0TDcuMTk2IDkuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxOWg4LjIwM2ExLjgzIDEuODMgMCAwIDAgMS41NTYtLjg5IDEuNzg0IDEuNzg0IDAgMCAwIDAtMS43NzVsLTEuMjI2LTIuMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgMTYtMyAzIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjI5MyAxMy41OTYgNy4xOTYgOS41IDMuMSAxMC41OTgiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtOS4zNDQgNS44MTEgMS4wOTMtMS44OTJBMS44MyAxLjgzIDAgMCAxIDExLjk4NSAzYTEuNzg0IDEuNzg0IDAgMCAxIDEuNTQ2Ljg4OGwzLjk0MyA2Ljg0MyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMy4zNzggOS42MzMgNC4wOTYgMS4wOTggMS4wOTctNC4wOTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWN0YW5nbGUtdmVydGljYWwuanMKdmFyIFJlY3RhbmdsZVZlcnRpY2FsOwp2YXIgaW5pdF9yZWN0YW5nbGVfdmVydGljYWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY3RhbmdsZS12ZXJ0aWNhbC5qcyIoKSB7CiAgICBSZWN0YW5nbGVWZXJ0aWNhbCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjEyIiwgaGVpZ2h0OiAiMjAiLCB4OiAiNiIsIHk6ICIyIiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVkby0yLmpzCnZhciBSZWRvMjsKdmFyIGluaXRfcmVkb18yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWRvLTIuanMiKCkgewogICAgUmVkbzIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxNCA1LTUtNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDlIOS41QTUuNSA1LjUgMCAwIDAgNCAxNC41QTUuNSA1LjUgMCAwIDAgOS41IDIwSDEzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVkby1kb3QuanMKdmFyIFJlZG9Eb3Q7CnZhciBpbml0X3JlZG9fZG90ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWRvLWRvdC5qcyIoKSB7CiAgICBSZWRvRG90ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTciLCByOiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA3djZoLTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxN2E5IDkgMCAwIDEgOS05IDkgOSAwIDAgMSA2IDIuM2wzIDIuNyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlZG8uanMKdmFyIFJlZG87CnZhciBpbml0X3JlZG8gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlZG8uanMiKCkgewogICAgUmVkbyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDd2NmgtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE3YTkgOSAwIDAgMSA5LTkgOSA5IDAgMCAxIDYgMi4zbDMgMi43IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVmcmVzaC1jY3ctZG90LmpzCnZhciBSZWZyZXNoQ2N3RG90Owp2YXIgaW5pdF9yZWZyZXNoX2Njd19kb3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlZnJlc2gtY2N3LWRvdC5qcyIoKSB7CiAgICBSZWZyZXNoQ2N3RG90ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTJhOSA5IDAgMCAwLTktOSA5Ljc1IDkuNzUgMCAwIDAtNi43NCAyLjc0TDMgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDN2NWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTJhOSA5IDAgMCAwIDkgOSA5Ljc1IDkuNzUgMCAwIDAgNi43NC0yLjc0TDIxIDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE2aDV2NSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVmcmVzaC1jY3cuanMKdmFyIFJlZnJlc2hDY3c7CnZhciBpbml0X3JlZnJlc2hfY2N3ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWZyZXNoLWNjdy5qcyIoKSB7CiAgICBSZWZyZXNoQ2N3ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTJhOSA5IDAgMCAwLTktOSA5Ljc1IDkuNzUgMCAwIDAtNi43NCAyLjc0TDMgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDN2NWg1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTJhOSA5IDAgMCAwIDkgOSA5Ljc1IDkuNzUgMCAwIDAgNi43NC0yLjc0TDIxIDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE2aDV2NSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlZnJlc2gtY3ctb2ZmLmpzCnZhciBSZWZyZXNoQ3dPZmY7CnZhciBpbml0X3JlZnJlc2hfY3dfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWZyZXNoLWN3LW9mZi5qcyIoKSB7CiAgICBSZWZyZXNoQ3dPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA4TDE4Ljc0IDUuNzRBOS43NSA5Ljc1IDAgMCAwIDEyIDNDMTEgMyAxMC4wMyAzLjE2IDkuMTMgMy40NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE2SDN2NSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyQzMgOS41MSA0IDcuMjYgNS42NCA1LjY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgMTYgMi4yNiAyLjI2QTkuNzUgOS43NSAwIDAgMCAxMiAyMWMyLjQ5IDAgNC43NC0xIDYuMzYtMi42NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMmMwIDEtLjE2IDEuOTctLjQ3IDIuODciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgM3Y1aC01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDIyIDIgMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlZnJlc2gtY3cuanMKdmFyIFJlZnJlc2hDdzsKdmFyIGluaXRfcmVmcmVzaF9jdyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVmcmVzaC1jdy5qcyIoKSB7CiAgICBSZWZyZXNoQ3cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyYTkgOSAwIDAgMSA5LTkgOS43NSA5Ljc1IDAgMCAxIDYuNzQgMi43NEwyMSA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDN2NWgtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMmE5IDkgMCAwIDEtOSA5IDkuNzUgOS43NSAwIDAgMS02Ljc0LTIuNzRMMyAxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE2SDN2NSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlZnJpZ2VyYXRvci5qcwp2YXIgUmVmcmlnZXJhdG9yOwp2YXIgaW5pdF9yZWZyaWdlcmF0b3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlZnJpZ2VyYXRvci5qcyIoKSB7CiAgICBSZWZyaWdlcmF0b3IgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDZhNCA0IDAgMCAxIDQtNGg2YTQgNCAwIDAgMSA0IDR2MTRhMiAyIDAgMCAxLTIgMkg3YTIgMiAwIDAgMS0yLTJWNloiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxMGgxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA3djYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWdleC5qcwp2YXIgUmVnZXg7CnZhciBpbml0X3JlZ2V4ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWdleC5qcyIoKSB7CiAgICBSZWdleCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDN2MTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTIuNjcgNS41IDguNjYgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMi42NyAxMC41IDguNjYtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE3YTIgMiAwIDAgMC0yLTJINWEyIDIgMCAwIDAtMiAydjJhMiAyIDAgMCAwIDIgMmgyYTIgMiAwIDAgMCAyLTJ2LTJ6IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVtb3ZlLWZvcm1hdHRpbmcuanMKdmFyIFJlbW92ZUZvcm1hdHRpbmc7CnZhciBpbml0X3JlbW92ZV9mb3JtYXR0aW5nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZW1vdmUtZm9ybWF0dGluZy5qcyIoKSB7CiAgICBSZW1vdmVGb3JtYXR0aW5nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA3VjRoMTZ2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDIwaDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgNCA4IDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDE1IDUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMCAxNS01IDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZXBlYXQtMS5qcwp2YXIgUmVwZWF0MTsKdmFyIGluaXRfcmVwZWF0XzEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlcGVhdC0xLmpzIigpIHsKICAgIFJlcGVhdDEgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAyIDQgNC00IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMXYtMWE0IDQgMCAwIDEgNC00aDE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMjItNC00IDQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxM3YxYTQgNCAwIDAgMS00IDRIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxMGgxdjQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZXBlYXQtMi5qcwp2YXIgUmVwZWF0MjsKdmFyIGluaXRfcmVwZWF0XzIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlcGVhdC0yLmpzIigpIHsKICAgIFJlcGVhdDIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDkgMy0zIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxOEg3YTIgMiAwIDAgMS0yLTJWNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiAxNS0zIDMtMy0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDZoNmEyIDIgMCAwIDEgMiAydjEwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVwZWF0LmpzCnZhciBSZXBlYXQ7CnZhciBpbml0X3JlcGVhdDQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlcGVhdC5qcyIoKSB7CiAgICBSZXBlYXQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAyIDQgNC00IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMXYtMWE0IDQgMCAwIDEgNC00aDE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMjItNC00IDQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxM3YxYTQgNCAwIDAgMS00IDRIMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlcGxhY2UtYWxsLmpzCnZhciBSZXBsYWNlQWxsOwp2YXIgaW5pdF9yZXBsYWNlX2FsbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVwbGFjZS1hbGwuanMiKCkgewogICAgUmVwbGFjZUFsbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE0YTEgMSAwIDAgMSAxIDF2NWExIDEgMCAwIDEtMSAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDRhMSAxIDAgMCAxIDEtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxMGExIDEgMCAwIDEtMS0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE0YTEgMSAwIDAgMSAxIDF2NWExIDEgMCAwIDEtMSAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDRhMSAxIDAgMCAwLTEtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA5YTEgMSAwIDAgMS0xIDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMyA3IDMgMyAzLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxMFY1YTIgMiAwIDAgMSAyLTJoMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjMiLCB5OiAiMTQiLCB3aWR0aDogIjciLCBoZWlnaHQ6ICI3Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVwbGFjZS5qcwp2YXIgUmVwbGFjZTsKdmFyIGluaXRfcmVwbGFjZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVwbGFjZS5qcyIoKSB7CiAgICBSZXBsYWNlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgNGExIDEgMCAwIDEgMS0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEwYTEgMSAwIDAgMS0xLTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgNGExIDEgMCAwIDAtMS0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDlhMSAxIDAgMCAxLTEgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDcgMyAzIDMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEwVjVhMiAyIDAgMCAxIDItMmgyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICIxNCIsIHdpZHRoOiAiNyIsIGhlaWdodDogIjciLCByeDogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZXBseS1hbGwuanMKdmFyIFJlcGx5QWxsOwp2YXIgaW5pdF9yZXBseV9hbGwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlcGx5LWFsbC5qcyIoKSB7CiAgICBSZXBseUFsbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDE3LTUtNSA1LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTh2LTJhNCA0IDAgMCAwLTQtNEg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMTctNS01IDUtNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Jld2luZC5qcwp2YXIgUmV3aW5kOwp2YXIgaW5pdF9yZXdpbmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Jld2luZC5qcyIoKSB7CiAgICBSZXdpbmQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2YTIgMiAwIDAgMC0zLjQxNC0xLjQxNGwtNiA2YTIgMiAwIDAgMCAwIDIuODI4bDYgNkEyIDIgMCAwIDAgMTIgMTh6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDZhMiAyIDAgMCAwLTMuNDE0LTEuNDE0bC02IDZhMiAyIDAgMCAwIDAgMi44MjhsNiA2QTIgMiAwIDAgMCAyMiAxOHoiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZXBseS5qcwp2YXIgUmVwbHk7CnZhciBpbml0X3JlcGx5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZXBseS5qcyIoKSB7CiAgICBSZXBseSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE4di0yYTQgNCAwIDAgMC00LTRINCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDE3LTUtNSA1LTUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yaWJib24uanMKdmFyIFJpYmJvbjsKdmFyIGluaXRfcmliYm9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yaWJib24uanMiKCkgewogICAgUmliYm9uID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTEuMjJDMTEgOS45OTcgMTAgOSAxMCA4YTIgMiAwIDAgMSA0IDBjMCAxLS45OTggMi4wMDItMi4wMSAzLjIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDE4IDIuNTctMy41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMjQzIDkuMDE2YTcgNyAwIDAgMSAxMS41MDctLjAwOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjM1IDE0LjUzIDEyIDExLjIyIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTkuMzUgMTQuNTNDNy43MjggMTIuMjQ2IDYgMTAuMjIxIDYgN2E2IDUgMCAwIDEgMTIgMGMtLjAwNSAzLjIyLTEuNzc4IDUuMjM1LTMuNDMgNy41bDMuNTU3IDQuNTI3YTEgMSAwIDAgMS0uMjAzIDEuNDNsLTEuODk0IDEuMzZhMSAxIDAgMCAxLTEuMzg0LS4yMTVMMTIgMThsLTIuNjc5IDMuNTkzYTEgMSAwIDAgMS0xLjM5LjIxM2wtMS44NjUtMS4zNTNhMSAxIDAgMCAxLS4yMDMtMS40MjJ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcm9ja2V0LmpzCnZhciBSb2NrZXQ7CnZhciBpbml0X3JvY2tldCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcm9ja2V0LmpzIigpIHsKICAgIFJvY2tldCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE1djVzMy4wMy0uNTUgNC0yYzEuMDgtMS42MiAwLTUgMC01IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQuNSAxNi41Yy0xLjUgMS4yNi0yIDUtMiA1czMuNzQtLjUgNS0yYy43MS0uODQuNy0yLjEzLS4wOS0yLjkxYTIuMTggMi4xOCAwIDAgMC0yLjkxLS4wOSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk05IDEyYTIyIDIyIDAgMCAxIDItMy45NUExMi44OCAxMi44OCAwIDAgMSAyMiAyYzAgMi43Mi0uNzggNy41LTYgMTFhMjIuNCAyMi40IDAgMCAxLTQgMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMkg0cy41NS0zLjAzIDItNGMxLjYyLTEuMDggNSAuMDUgNSAuMDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yb2NraW5nLWNoYWlyLmpzCnZhciBSb2NraW5nQ2hhaXI7CnZhciBpbml0X3JvY2tpbmdfY2hhaXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JvY2tpbmctY2hhaXIuanMiKCkgewogICAgUm9ja2luZ0NoYWlyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgMTMgMy43MDggNy40MTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxOWExNSAxNSAwIDAgMCAxOCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMgMiAzLjIxIDkuNjMzQTIgMiAwIDAgMCA4LjEwOSAxM0gxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDEzLTMuNzA4IDcuNDE2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcm9sbGVyLWNvYXN0ZXIuanMKdmFyIFJvbGxlckNvYXN0ZXI7CnZhciBpbml0X3JvbGxlcl9jb2FzdGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yb2xsZXItY29hc3Rlci5qcyIoKSB7CiAgICBSb2xsZXJDb2FzdGVyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOVY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE5VjYuOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxOXYtNy44IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDV2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxOXYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxOVY5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTlWOWE0IDQgMCAwIDEgNC00YzIgMCA0IDEuMzMgNiA0czQgNCA2IDRhNCA0IDAgMSAwLTMtNi42NSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Jvc2UuanMKdmFyIFJvc2U7CnZhciBpbml0X3Jvc2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Jvc2UuanMiKCkgewogICAgUm9zZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDEwaC0xYTQgNCAwIDEgMSA0LTR2LjUzNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyA2aDFhNCA0IDAgMCAxIDEuNDIgNy43NGwtMi4yOS44N2E2IDYgMCAwIDEtNS4zMzktMTAuNjhsMi4wNjktMS4zMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTQuNSAxN2MyLjgtLjUgNC40IDAgNS41LjhzMS44IDIuMiAyLjMgMy43Yy0yIC40LTMuNS40LTQuOC0uMy0xLjItLjYtMi4zLTEuOS0zLTQuMiIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS43NyAxMkM0IDE1IDIgMjIgMiAyMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE3IiwgY3k6ICI4IiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yb3RhdGUtM2QuanMKdmFyIFJvdGF0ZTNkOwp2YXIgaW5pdF9yb3RhdGVfM2QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JvdGF0ZS0zZC5qcyIoKSB7CiAgICBSb3RhdGUzZCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE2LjQ2NiA3LjVDMTUuNjQzIDQuMjM3IDEzLjk1MiAyIDEyIDIgOS4yMzkgMiA3IDYuNDc3IDcgMTJzMi4yMzkgMTAgNSAxMGMuMzQyIDAgLjY3Ny0uMDY5IDEtLjIiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUuMTk0IDEzLjcwNyAzLjgxNCAxLjg2LTEuODYgMy44MTQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTkgMTUuNTdjLTEuODA0Ljg4NS00LjI3NCAxLjQzLTcgMS40My01LjUyMyAwLTEwLTIuMjM5LTEwLTVzNC40NzctNSAxMC01YzQuODM4IDAgOC44NzMgMS43MTggOS44IDQiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yb3RhdGUtY2N3LWtleS5qcwp2YXIgUm90YXRlQ2N3S2V5Owp2YXIgaW5pdF9yb3RhdGVfY2N3X2tleSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcm90YXRlLWNjdy1rZXkuanMiKCkgewogICAgUm90YXRlQ2N3S2V5ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgN3Y2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDloMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyYTkgOSAwIDEgMCA5LTkgOS43NCA5Ljc0IDAgMCAwLTYuNzQgMi43NEwzIDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjVoNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxNSIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcm90YXRlLWNjdy1zcXVhcmUuanMKdmFyIFJvdGF0ZUNjd1NxdWFyZTsKdmFyIGluaXRfcm90YXRlX2Njd19zcXVhcmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JvdGF0ZS1jY3ctc3F1YXJlLmpzIigpIHsKICAgIFJvdGF0ZUNjd1NxdWFyZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDlWN2EyIDIgMCAwIDAtMi0yaC02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDItMyAzIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxM3Y1YTIgMiAwIDAgMS0yIDJINmEyIDIgMCAwIDEtMi0yVjdhMiAyIDAgMCAxIDItMmgyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcm90YXRlLWNjdy5qcwp2YXIgUm90YXRlQ2N3Owp2YXIgaW5pdF9yb3RhdGVfY2N3ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yb3RhdGUtY2N3LmpzIigpIHsKICAgIFJvdGF0ZUNjdyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTJhOSA5IDAgMSAwIDktOSA5Ljc1IDkuNzUgMCAwIDAtNi43NCAyLjc0TDMgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDN2NWg1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcm90YXRlLWN3LmpzCnZhciBSb3RhdGVDdzsKdmFyIGluaXRfcm90YXRlX2N3ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yb3RhdGUtY3cuanMiKCkgewogICAgUm90YXRlQ3cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMmE5IDkgMCAxIDEtOS05YzIuNTIgMCA0LjkzIDEgNi43NCAyLjc0TDIxIDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgM3Y1aC01IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcm90YXRlLWN3LXNxdWFyZS5qcwp2YXIgUm90YXRlQ3dTcXVhcmU7CnZhciBpbml0X3JvdGF0ZV9jd19zcXVhcmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JvdGF0ZS1jdy1zcXVhcmUuanMiKCkgewogICAgUm90YXRlQ3dTcXVhcmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA1SDZhMiAyIDAgMCAwLTIgMnYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgOCAzLTMtMy0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTR2NGEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAyLTJWN2EyIDIgMCAwIDAtMi0yaC0yIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcm91dGUuanMKdmFyIFJvdXRlOwp2YXIgaW5pdF9yb3V0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcm91dGUuanMiKCkgewogICAgUm91dGUgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjYiLCBjeTogIjE5IiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxOWg4LjVhMy41IDMuNSAwIDAgMCAwLTdoLTExYTMuNSAzLjUgMCAwIDEgMC03SDE1IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjUiLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JvdXRlLW9mZi5qcwp2YXIgUm91dGVPZmY7CnZhciBpbml0X3JvdXRlX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcm91dGUtb2ZmLmpzIigpIHsKICAgIFJvdXRlT2ZmID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICI2IiwgY3k6ICIxOSIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTloOC41Yy40IDAgLjktLjEgMS4zLS4yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUuMiA1LjJBMy41IDMuNTMgMCAwIDAgNi41IDEySDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNS4zYTMuNSAzLjUgMCAwIDAtMy4zLTMuMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA1aC00LjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiNSIsIHI6ICIzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcm91dGVyLmpzCnZhciBSb3V0ZXI7CnZhciBpbml0X3JvdXRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcm91dGVyLmpzIigpIHsKICAgIFJvdXRlciA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiOCIsIHg6ICIyIiwgeTogIjE0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMDEgMThINiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC4wMSAxOEgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxMHY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3Ljg0IDcuMTdhNCA0IDAgMCAwLTUuNjYgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC42NiA0LjM0YTggOCAwIDAgMC0xMS4zMSAwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcm93cy0yLmpzCnZhciBSb3dzMjsKdmFyIGluaXRfcm93c18yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yb3dzLTIuanMiKCkgewogICAgUm93czIgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyaDE4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcm93cy0zLmpzCnZhciBSb3dzMzsKdmFyIGluaXRfcm93c18zID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yb3dzLTMuanMiKCkgewogICAgUm93czMgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA5SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTVIMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Jvd3MtNC5qcwp2YXIgUm93czQ7CnZhciBpbml0X3Jvd3NfNCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcm93cy00LmpzIigpIHsKICAgIFJvd3M0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgNy41SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTJIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNi41SDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yc3MuanMKdmFyIFJzczsKdmFyIGluaXRfcnNzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9yc3MuanMiKCkgewogICAgUnNzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMWE5IDkgMCAwIDEgOSA5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgNGExNiAxNiAwIDAgMSAxNiAxNiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjE5IiwgcjogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ydWxlci1kaW1lbnNpb24tbGluZS5qcwp2YXIgUnVsZXJEaW1lbnNpb25MaW5lOwp2YXIgaW5pdF9ydWxlcl9kaW1lbnNpb25fbGluZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcnVsZXItZGltZW5zaW9uLWxpbmUuanMiKCkgewogICAgUnVsZXJEaW1lbnNpb25MaW5lID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTV2LTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTV2LTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTV2LTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA4VjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgNkgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDhWNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE1di0zIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMiIsIHk6ICIxMiIsIHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICI4Iiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcnVsZXIuanMKdmFyIFJ1bGVyOwp2YXIgaW5pdF9ydWxlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcnVsZXIuanMiKCkgewogICAgUnVsZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMS4zIDE1LjNhMi40IDIuNCAwIDAgMSAwIDMuNGwtMi42IDIuNmEyLjQgMi40IDAgMCAxLTMuNCAwTDIuNyA4LjdhMi40MSAyLjQxIDAgMCAxIDAtMy40bDIuNi0yLjZhMi40MSAyLjQxIDAgMCAxIDMuNCAwWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC41IDEyLjUgMi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTExLjUgOS41IDItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04LjUgNi41IDItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNy41IDE1LjUgMi0yIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvcnVzc2lhbi1ydWJsZS5qcwp2YXIgUnVzc2lhblJ1YmxlOwp2YXIgaW5pdF9ydXNzaWFuX3J1YmxlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9ydXNzaWFuLXJ1YmxlLmpzIigpIHsKICAgIFJ1c3NpYW5SdWJsZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTFoOGE0IDQgMCAwIDAgMC04SDl2MTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxNWg4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2FpbGJvYXQuanMKdmFyIFNhaWxib2F0Owp2YXIgaW5pdF9zYWlsYm9hdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2FpbGJvYXQuanMiKCkgewogICAgU2FpbGJvYXQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAydjE1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjJhNCA0IDAgMCAxLTQtNCAxIDEgMCAwIDEgMS0xaDE2YTEgMSAwIDAgMSAxIDEgNCA0IDAgMCAxLTQgNHoiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk05LjE1OSAyLjQ2YTEgMSAwIDAgMSAxLjUyMS0uMTkzbDkuOTc3IDguOThBMSAxIDAgMCAxIDIwIDEzSDRhMSAxIDAgMCAxLS44MjQtMS41Njd6IiB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NhbGFkLmpzCnZhciBTYWxhZDsKdmFyIGluaXRfc2FsYWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NhbGFkLmpzIigpIHsKICAgIFNhbGFkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMWgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMWE5IDkgMCAwIDAgOS05SDNhOSA5IDAgMCAwIDkgOVoiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEuMzggMTJhMi40IDIuNCAwIDAgMS0uNC00Ljc3IDIuNCAyLjQgMCAwIDEgMy4yLTIuNzcgMi40IDIuNCAwIDAgMSAzLjQ3LS42MyAyLjQgMi40IDAgMCAxIDMuMzcgMy4zNyAyLjQgMi40IDAgMCAxLTEuMSAzLjcgMi41MSAyLjUxIDAgMCAxIC4wMyAxLjEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMgMTIgNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjkgNy4yNUEzLjk5IDMuOTkgMCAwIDAgNCAxMGMwIC43My4yIDEuNDEuNTQgMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NhbmR3aWNoLmpzCnZhciBTYW5kd2ljaDsKdmFyIGluaXRfc2FuZHdpY2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NhbmR3aWNoLmpzIigpIHsKICAgIFNhbmR3aWNoID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMi4zNyAxMS4yMjMgOC4zNzItNi43NzdhMiAyIDAgMCAxIDIuNTE2IDBsOC4zNzEgNi43NzciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTVhMSAxIDAgMCAxIDEgMXYyYTEgMSAwIDAgMS0xIDFoLTUuMjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxNWExIDEgMCAwIDAtMSAxdjJhMSAxIDAgMCAwIDEgMWg5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYuNjcgMTUgNi4xMyA0LjZhMiAyIDAgMCAwIDIuOC0uNGwzLjE1LTQuMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjQiLCB4OiAiMiIsIHk6ICIxMSIsIHJ4OiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NhdGVsbGl0ZS1kaXNoLmpzCnZhciBTYXRlbGxpdGVEaXNoOwp2YXIgaW5pdF9zYXRlbGxpdGVfZGlzaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2F0ZWxsaXRlLWRpc2guanMiKCkgewogICAgU2F0ZWxsaXRlRGlzaCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTBhNy4zMSA3LjMxIDAgMCAwIDEwIDEwWiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDE1IDMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxM2E2IDYgMCAwIDAtNi02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEzQTEwIDEwIDAgMCAwIDExIDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zYXRlbGxpdGUuanMKdmFyIFNhdGVsbGl0ZTsKdmFyIGluaXRfc2F0ZWxsaXRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zYXRlbGxpdGUuanMiKCkgewogICAgU2F0ZWxsaXRlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTMuNSA2LjUtMy4xNDgtMy4xNDhhMS4yMDUgMS4yMDUgMCAwIDAtMS43MDQgMEw2LjM1MiA1LjY0OGExLjIwNSAxLjIwNSAwIDAgMCAwIDEuNzA0TDkuNSAxMC41IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2LjUgNy41IDE5IDUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTcuNSAxMC41IDMuMTQ4IDMuMTQ4YTEuMjA1IDEuMjA1IDAgMCAxIDAgMS43MDRsLTIuMjk2IDIuMjk2YTEuMjA1IDEuMjA1IDAgMCAxLTEuNzA0IDBMMTMuNSAxNC41IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMjFhNiA2IDAgMCAwLTYtNiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk05LjM1MiAxMC42NDhhMS4yMDUgMS4yMDUgMCAwIDAgMCAxLjcwNGwyLjI5NiAyLjI5NmExLjIwNSAxLjIwNSAwIDAgMCAxLjcwNCAwbDQuMjk2LTQuMjk2YTEuMjA1IDEuMjA1IDAgMCAwIDAtMS43MDRsLTIuMjk2LTIuMjk2YTEuMjA1IDEuMjA1IDAgMCAwLTEuNzA0IDB6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2F1ZGktcml5YWwuanMKdmFyIFNhdWRpUml5YWw7CnZhciBpbml0X3NhdWRpX3JpeWFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zYXVkaS1yaXlhbC5qcyIoKSB7CiAgICBTYXVkaVJpeWFsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAgMTkuNS01LjUgMS4yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0LjUgNHYxMS4yMmExIDEgMCAwIDAgMS4yNDIuOTdMMjAgMTUuMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yLjk3OCAxOS4zNTEgNS41NDktMS4zNjNBMiAyIDAgMCAwIDEwIDE2VjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTAgNCAxMy41IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2F2ZS1vZmYuanMKdmFyIFNhdmVPZmY7CnZhciBpbml0X3NhdmVfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zYXZlLW9mZi5qcyIoKSB7CiAgICBTYXZlT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMTNIOGExIDEgMCAwIDAtMSAxdjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgOGgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDIxdi00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC40MSAyMC40MUEyIDIgMCAwIDEgMTkgMjFINWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIC41OS0xLjQxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTI5LjUgMTEuNXM1IDUgNCA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgM2g2LjJhMiAyIDAgMCAxIDEuNC42bDMuOCAzLjhhMiAyIDAgMCAxIC42IDEuNFYxNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NhdmUtYWxsLmpzCnZhciBTYXZlQWxsOwp2YXIgaW5pdF9zYXZlX2FsbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2F2ZS1hbGwuanMiKCkgewogICAgU2F2ZUFsbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDJ2M2ExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTh2LTZhMSAxIDAgMCAwLTEtMWgtNmExIDEgMCAwIDAtMSAxdjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMjJINGEyIDIgMCAwIDEtMi0yVjYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOCAxOGEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg5LjE3MmEyIDIgMCAwIDEgMS40MTQuNTg2bDIuODI4IDIuODI4QTIgMiAwIDAgMSAyMiA2LjgyOFYxNmEyIDIgMCAwIDEtMi4wMSAyeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NhdmUuanMKdmFyIFNhdmU7CnZhciBpbml0X3NhdmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NhdmUuanMiKCkgewogICAgU2F2ZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE1LjIgM2EyIDIgMCAwIDEgMS40LjZsMy44IDMuOGEyIDIgMCAwIDEgLjYgMS40VjE5YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMjF2LTdhMSAxIDAgMCAwLTEtMUg4YTEgMSAwIDAgMC0xIDF2NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDN2NGExIDEgMCAwIDAgMSAxaDciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2FsZS0zZC5qcwp2YXIgU2NhbGUzZDsKdmFyIGluaXRfc2NhbGVfM2QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjYWxlLTNkLmpzIigpIHsKICAgIFNjYWxlM2QgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDd2MTFhMSAxIDAgMCAwIDEgMWgxMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01LjI5MyAxOC43MDcgMTEgMTMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiMTkiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjUiLCBjeTogIjUiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjYWxlLmpzCnZhciBTY2FsZTsKdmFyIGluaXRfc2NhbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjYWxlLmpzIigpIHsKICAgIFNjYWxlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgM3YxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOSA4IDMgOGE1IDUgMCAwIDEtNiAwelY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgN2gxYTE3IDE3IDAgMCAwIDgtMiAxNyAxNyAwIDAgMCA4IDJoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01IDggMyA4YTUgNSAwIDAgMS02IDB6VjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMWgxMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjYWxpbmcuanMKdmFyIFNjYWxpbmc7CnZhciBpbml0X3NjYWxpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjYWxpbmcuanMiKCkgewogICAgU2NhbGluZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDNINWEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoMTRhMiAyIDAgMCAwIDItMnYtNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxNUg5di01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDNoNXY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDMgOSAxNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjYW4tYmFyY29kZS5qcwp2YXIgU2NhbkJhcmNvZGU7CnZhciBpbml0X3NjYW5fYmFyY29kZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2Nhbi1iYXJjb2RlLmpzIigpIHsKICAgIFNjYW5CYXJjb2RlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA3VjVhMiAyIDAgMCAxIDItMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDNoMmEyIDIgMCAwIDEgMiAydjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTd2MmEyIDIgMCAwIDEtMiAyaC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjFINWEyIDIgMCAwIDEtMi0ydi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggN3YxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA3djEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDd2MTAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2FuLWV5ZS5qcwp2YXIgU2NhbkV5ZTsKdmFyIGluaXRfc2Nhbl9leWUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjYW4tZXllLmpzIigpIHsKICAgIFNjYW5FeWUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDdWNWEyIDIgMCAwIDEgMi0yaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgM2gyYTIgMiAwIDAgMSAyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxN3YyYTIgMiAwIDAgMS0yIDJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMUg1YTIgMiAwIDAgMS0yLTJ2LTIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOC45NDQgMTIuMzNhMSAxIDAgMCAwIDAtLjY2IDcuNSA3LjUgMCAwIDAtMTMuODg4IDAgMSAxIDAgMCAwIDAgLjY2IDcuNSA3LjUgMCAwIDAgMTMuODg4IDAiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2FuLWZhY2UuanMKdmFyIFNjYW5GYWNlOwp2YXIgaW5pdF9zY2FuX2ZhY2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjYW4tZmFjZS5qcyIoKSB7CiAgICBTY2FuRmFjZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgN1Y1YTIgMiAwIDAgMSAyLTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAzaDJhMiAyIDAgMCAxIDIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE3djJhMiAyIDAgMCAxLTIgMmgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIxSDVhMiAyIDAgMCAxLTItMnYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE0czEuNSAyIDQgMiA0LTIgNC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgOWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgOWguMDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2FuLWhlYXJ0LmpzCnZhciBTY2FuSGVhcnQ7CnZhciBpbml0X3NjYW5faGVhcnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjYW4taGVhcnQuanMiKCkgewogICAgU2NhbkhlYXJ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgM2gyYTIgMiAwIDAgMSAyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxN3YyYTIgMiAwIDAgMS0yIDJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA3VjVhMiAyIDAgMCAxIDItMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjFINWEyIDIgMCAwIDEtMi0ydi0yIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNNy44MjggMTMuMDdBMyAzIDAgMCAxIDEyIDguNzY0YTMgMyAwIDAgMSA0LjE3MiA0LjMwNmwtMy40NDcgMy42MmExIDEgMCAwIDEtMS40NDkgMHoiIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2Nhbi1saW5lLmpzCnZhciBTY2FuTGluZTsKdmFyIGluaXRfc2Nhbl9saW5lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2FuLWxpbmUuanMiKCkgewogICAgU2NhbkxpbmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDdWNWEyIDIgMCAwIDEgMi0yaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgM2gyYTIgMiAwIDAgMSAyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxN3YyYTIgMiAwIDAgMS0yIDJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMUg1YTIgMiAwIDAgMS0yLTJ2LTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMmgxMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjYW4tcXItY29kZS5qcwp2YXIgU2NhblFyQ29kZTsKdmFyIGluaXRfc2Nhbl9xcl9jb2RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2FuLXFyLWNvZGUuanMiKCkgewogICAgU2NhblFyQ29kZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDEydjRhMSAxIDAgMCAxLTEgMWgtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAzaDJhMiAyIDAgMCAxIDIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDhWNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxN3YyYTIgMiAwIDAgMS0yIDJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA3VjVhMiAyIDAgMCAxIDItMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTdoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjFINWEyIDIgMCAwIDEtMi0ydi0yIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiNyIsIHk6ICI3Iiwgd2lkdGg6ICI1IiwgaGVpZ2h0OiAiNSIsIHJ4OiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjYW4tc2VhcmNoLmpzCnZhciBTY2FuU2VhcmNoOwp2YXIgaW5pdF9zY2FuX3NlYXJjaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2Nhbi1zZWFyY2guanMiKCkgewogICAgU2NhblNlYXJjaCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgN1Y1YTIgMiAwIDAgMSAyLTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAzaDJhMiAyIDAgMCAxIDIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE3djJhMiAyIDAgMCAxLTIgMmgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIxSDVhMiAyIDAgMCAxLTItMnYtMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDE2LTEuOS0xLjkiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2FuLXRleHQuanMKdmFyIFNjYW5UZXh0Owp2YXIgaW5pdF9zY2FuX3RleHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjYW4tdGV4dC5qcyIoKSB7CiAgICBTY2FuVGV4dCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgN1Y1YTIgMiAwIDAgMSAyLTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAzaDJhMiAyIDAgMCAxIDIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE3djJhMiAyIDAgMCAxLTIgMmgtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIxSDVhMiAyIDAgMCAxLTItMnYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDhoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEyaDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTZoNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjYW4uanMKdmFyIFNjYW47CnZhciBpbml0X3NjYW4yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2FuLmpzIigpIHsKICAgIFNjYW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDdWNWEyIDIgMCAwIDEgMi0yaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgM2gyYTIgMiAwIDAgMSAyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxN3YyYTIgMiAwIDAgMS0yIDJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMUg1YTIgMiAwIDAgMS0yLTJ2LTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2hvb2wuanMKdmFyIFNjaG9vbDsKdmFyIGluaXRfc2Nob29sID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2hvb2wuanMiKCkgewogICAgU2Nob29sID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjF2LTNhMiAyIDAgMCAwLTQgMHYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDV2MTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNCA2IDcuMTA2LTMuNzlhMiAyIDAgMCAxIDEuNzg4IDBMMjAgNiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm02IDExLTMuNTIgMi4xNDdhMSAxIDAgMCAwLS40OC44NTRWMTlhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0ydi01YTEgMSAwIDAgMC0uNDgtLjg1M0wxOCAxMSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDV2MTYiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiOSIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2Npc3NvcnMtbGluZS1kYXNoZWQuanMKdmFyIFNjaXNzb3JzTGluZURhc2hlZDsKdmFyIGluaXRfc2Npc3NvcnNfbGluZV9kYXNoZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjaXNzb3JzLWxpbmUtZGFzaGVkLmpzIigpIHsKICAgIFNjaXNzb3JzTGluZURhc2hlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUuNDIgOS40MiA4IDEyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNCIsIGN5OiAiOCIsIHI6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDYtOC41OCA4LjU4IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNCIsIGN5OiAiMTYiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC44IDE0LjggMTQgMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTJoLTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2lzc29ycy5qcwp2YXIgU2Npc3NvcnM7CnZhciBpbml0X3NjaXNzb3JzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2lzc29ycy5qcyIoKSB7CiAgICBTY2lzc29ycyA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNiIsIGN5OiAiNiIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguMTIgOC4xMiAxMiAxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCA0IDguMTIgMTUuODgiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI2IiwgY3k6ICIxOCIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0LjggMTQuOCAyMCAyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Njb290ZXIuanMKdmFyIFNjb290ZXI7CnZhciBpbml0X3Njb290ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Njb290ZXIuanMiKCkgewogICAgU2Nvb3RlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDRoLTMuNWwyIDExLjA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuOTUgMTdoNS4xNDJjLjUyMyAwIC45NS0uNDA2IDEuMDYzLS45MTZhNi41IDYuNSAwIDAgMSA1LjM0NS01LjAwOSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE5LjUiLCBjeTogIjE3LjUiLCByOiAiMi41IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNC41IiwgY3k6ICIxNy41IiwgcjogIjIuNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjcmVlbi1zaGFyZS1vZmYuanMKdmFyIFNjcmVlblNoYXJlT2ZmOwp2YXIgaW5pdF9zY3JlZW5fc2hhcmVfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY3JlZW4tc2hhcmUtb2ZmLmpzIigpIHsKICAgIFNjcmVlblNoYXJlT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgM0g0YTIgMiAwIDAgMC0yIDJ2MTBhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0ydi0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMjFoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN3Y0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDMtNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDMgNSA1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2NyZWVuLXNoYXJlLmpzCnZhciBTY3JlZW5TaGFyZTsKdmFyIGluaXRfc2NyZWVuX3NoYXJlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY3JlZW4tc2hhcmUuanMiKCkgewogICAgU2NyZWVuU2hhcmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAzSDRhMiAyIDAgMCAwLTIgMnYxMGEyIDIgMCAwIDAgMiAyaDE2YTIgMiAwIDAgMCAyLTJ2LTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAyMWg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgOCA1LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgM2g1djUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY3JvbGwtdGV4dC5qcwp2YXIgU2Nyb2xsVGV4dDsKdmFyIGluaXRfc2Nyb2xsX3RleHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Njcm9sbC10ZXh0LmpzIigpIHsKICAgIFNjcm9sbFRleHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxMmgtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA4aC01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE3VjVhMiAyIDAgMCAwLTItMkg0IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTggMjFoMTJhMiAyIDAgMCAwIDItMnYtMWExIDEgMCAwIDAtMS0xSDExYTEgMSAwIDAgMC0xIDF2MWEyIDIgMCAxIDEtNCAwVjVhMiAyIDAgMSAwLTQgMHYyYTEgMSAwIDAgMCAxIDFoMyIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Njcm9sbC5qcwp2YXIgU2Nyb2xsOwp2YXIgaW5pdF9zY3JvbGwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Njcm9sbC5qcyIoKSB7CiAgICBTY3JvbGwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxN1Y1YTIgMiAwIDAgMC0yLTJINCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk04IDIxaDEyYTIgMiAwIDAgMCAyLTJ2LTFhMSAxIDAgMCAwLTEtMUgxMWExIDEgMCAwIDAtMSAxdjFhMiAyIDAgMSAxLTQgMFY1YTIgMiAwIDEgMC00IDB2MmExIDEgMCAwIDAgMSAxaDMiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zZWFyY2gtYWxlcnQuanMKdmFyIFNlYXJjaEFsZXJ0Owp2YXIgaW5pdF9zZWFyY2hfYWxlcnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlYXJjaC1hbGVydC5qcyIoKSB7CiAgICBTZWFyY2hBbGVydCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTEiLCBjeTogIjExIiwgcjogIjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMjEtNC4zLTQuMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSA3djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMTVoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2VhcmNoLWNoZWNrLmpzCnZhciBTZWFyY2hDaGVjazsKdmFyIGluaXRfc2VhcmNoX2NoZWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zZWFyY2gtY2hlY2suanMiKCkgewogICAgU2VhcmNoQ2hlY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDExIDIgMiA0LTQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMSIsIGN5OiAiMTEiLCByOiAiOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAyMS00LjMtNC4zIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2VhcmNoLWNvZGUuanMKdmFyIFNlYXJjaENvZGU7CnZhciBpbml0X3NlYXJjaF9jb2RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zZWFyY2gtY29kZS5qcyIoKSB7CiAgICBTZWFyY2hDb2RlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMgMTMuNSAyLTIuNS0yLTIuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAyMS00LjMtNC4zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgOC41IDcgMTFsMiAyLjUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMSIsIGN5OiAiMTEiLCByOiAiOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlYXJjaC14LmpzCnZhciBTZWFyY2hYOwp2YXIgaW5pdF9zZWFyY2hfeCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2VhcmNoLXguanMiKCkgewogICAgU2VhcmNoWCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEzLjUgOC41LTUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04LjUgOC41IDUgNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjExIiwgY3k6ICIxMSIsIHI6ICI4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDIxLTQuMy00LjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zZWFyY2gtc2xhc2guanMKdmFyIFNlYXJjaFNsYXNoOwp2YXIgaW5pdF9zZWFyY2hfc2xhc2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlYXJjaC1zbGFzaC5qcyIoKSB7CiAgICBTZWFyY2hTbGFzaCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEzLjUgOC41LTUgNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjExIiwgY3k6ICIxMSIsIHI6ICI4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDIxLTQuMy00LjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zZWN0aW9uLmpzCnZhciBTZWN0aW9uOwp2YXIgaW5pdF9zZWN0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zZWN0aW9uLmpzIigpIHsKICAgIFNlY3Rpb24gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA1YTQgMyAwIDAgMC04IDBjMCA0IDggMyA4IDdhNCAzIDAgMCAxLTggMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE5YTQgMyAwIDAgMCA4IDBjMC00LTgtMy04LTdhNCAzIDAgMCAxIDggMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlYXJjaC5qcwp2YXIgU2VhcmNoOwp2YXIgaW5pdF9zZWFyY2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlYXJjaC5qcyIoKSB7CiAgICBTZWFyY2ggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAyMS00LjM0LTQuMzQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMSIsIGN5OiAiMTEiLCByOiAiOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlbmQtaG9yaXpvbnRhbC5qcwp2YXIgU2VuZEhvcml6b250YWw7CnZhciBpbml0X3NlbmRfaG9yaXpvbnRhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2VuZC1ob3Jpem9udGFsLmpzIigpIHsKICAgIFNlbmRIb3Jpem9udGFsID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy43MTQgMy4wNDhhLjQ5OC40OTggMCAwIDAtLjY4My42MjdsMi44NDMgNy42MjdhMiAyIDAgMCAxIDAgMS4zOTZsLTIuODQyIDcuNjI3YS40OTguNDk4IDAgMCAwIC42ODIuNjI3bDE4LTguNWEuNS41IDAgMCAwIDAtLjkwNHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxMmgxNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlbmQtdG8tYmFjay5qcwp2YXIgU2VuZFRvQmFjazsKdmFyIGluaXRfc2VuZF90b19iYWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zZW5kLXRvLWJhY2suanMiKCkgewogICAgU2VuZFRvQmFjayA9IFsKICAgICAgWyJyZWN0IiwgeyB4OiAiMTQiLCB5OiAiMTQiLCB3aWR0aDogIjgiLCBoZWlnaHQ6ICI4Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMiIsIHk6ICIyIiwgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiOCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE0djFhMiAyIDAgMCAwIDIgMmgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDdoMWEyIDIgMCAwIDEgMiAydjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zZW5kLmpzCnZhciBTZW5kOwp2YXIgaW5pdF9zZW5kID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zZW5kLmpzIigpIHsKICAgIFNlbmQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNC41MzYgMjEuNjg2YS41LjUgMCAwIDAgLjkzNy0uMDI0bDYuNS0xOWEuNDk2LjQ5NiAwIDAgMC0uNjM1LS42MzVsLTE5IDYuNWEuNS41IDAgMCAwLS4wMjQuOTM3bDcuOTMgMy4xOGEyIDIgMCAwIDEgMS4xMTIgMS4xMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEuODU0IDIuMTQ3LTEwLjk0IDEwLjkzOSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlcGFyYXRvci1ob3Jpem9udGFsLmpzCnZhciBTZXBhcmF0b3JIb3Jpem9udGFsOwp2YXIgaW5pdF9zZXBhcmF0b3JfaG9yaXpvbnRhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2VwYXJhdG9yLWhvcml6b250YWwuanMiKCkgewogICAgU2VwYXJhdG9ySG9yaXpvbnRhbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDE2LTQgNC00LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDggNC00IDQgNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlcGFyYXRvci12ZXJ0aWNhbC5qcwp2YXIgU2VwYXJhdG9yVmVydGljYWw7CnZhciBpbml0X3NlcGFyYXRvcl92ZXJ0aWNhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2VwYXJhdG9yLXZlcnRpY2FsLmpzIigpIHsKICAgIFNlcGFyYXRvclZlcnRpY2FsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgM3YxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAxNiA0LTQtNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTggOC00IDQgNCA0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2VydmVyLWNvZy5qcwp2YXIgU2VydmVyQ29nOwp2YXIgaW5pdF9zZXJ2ZXJfY29nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zZXJ2ZXItY29nLmpzIigpIHsKICAgIFNlcnZlckNvZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEwLjg1MiAxNC43NzItLjM4My45MjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMuMTQ4IDE0Ljc3MmEzIDMgMCAxIDAtMi4yOTYtNS41NDRsLS4zODMtLjkyMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMy4xNDggOS4yMjguMzgzLS45MjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMuNTMgMTUuNjk2LS4zODItLjkyNGEzIDMgMCAxIDEtMi4yOTYtNS41NDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuNzcyIDEwLjg1Mi45MjMtLjM4MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC43NzIgMTMuMTQ4LjkyMy4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC41IDEwSDRhMiAyIDAgMCAxLTItMlY0YTIgMiAwIDAgMSAyLTJoMTZhMiAyIDAgMCAxIDIgMnY0YTIgMiAwIDAgMS0yIDJoLS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQuNSAxNEg0YTIgMiAwIDAgMC0yIDJ2NGEyIDIgMCAwIDAgMiAyaDE2YTIgMiAwIDAgMCAyLTJ2LTRhMiAyIDAgMCAwLTItMmgtLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA2aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05LjIyOCAxMC44NTItLjkyMy0uMzgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkuMjI4IDEzLjE0OC0uOTIzLjM4MyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlcnZlci1jcmFzaC5qcwp2YXIgU2VydmVyQ3Jhc2g7CnZhciBpbml0X3NlcnZlcl9jcmFzaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2VydmVyLWNyYXNoLmpzIigpIHsKICAgIFNlcnZlckNyYXNoID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxMEg0YTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ2NGEyIDIgMCAwIDEtMiAyaC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTRINGEyIDIgMCAwIDAtMiAydjRhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0ydi00YTIgMiAwIDAgMC0yLTJoLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA2aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE4aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMyA2LTQgNmg2bC00IDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zZXJ2ZXItb2ZmLmpzCnZhciBTZXJ2ZXJPZmY7CnZhciBpbml0X3NlcnZlcl9vZmYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlcnZlci1vZmYuanMiKCkgewogICAgU2VydmVyT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyaDEzYTIgMiAwIDAgMSAyIDJ2NGEyIDIgMCAwIDEtMiAyaC01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEwIDIuNSAyLjVDMiAyIDIgMi41IDIgNXYzYTIgMiAwIDAgMCAyIDJoNnoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTd2LTFhMiAyIDAgMCAwLTItMmgtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE0YTIgMiAwIDAgMC0yIDJ2NGEyIDIgMCAwIDAgMiAyaDE2LjVsMS0uNS41LjUtOC04SDR6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMThoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlcnZlci5qcwp2YXIgU2VydmVyOwp2YXIgaW5pdF9zZXJ2ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlcnZlci5qcyIoKSB7CiAgICBTZXJ2ZXIgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjgiLCB4OiAiMiIsIHk6ICIyIiwgcng6ICIyIiwgcnk6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiOCIsIHg6ICIyIiwgeTogIjE0Iiwgcng6ICIyIiwgcnk6ICIyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjYiLCB4MjogIjYuMDEiLCB5MTogIjYiLCB5MjogIjYiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiNiIsIHgyOiAiNi4wMSIsIHkxOiAiMTgiLCB5MjogIjE4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2V0dGluZ3MtMi5qcwp2YXIgU2V0dGluZ3MyOwp2YXIgaW5pdF9zZXR0aW5nc18yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zZXR0aW5ncy0yLmpzIigpIHsKICAgIFNldHRpbmdzMiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE3SDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgN2gtOSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE3IiwgY3k6ICIxNyIsIHI6ICIzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNyIsIGN5OiAiNyIsIHI6ICIzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2V0dGluZ3MuanMKdmFyIFNldHRpbmdzOwp2YXIgaW5pdF9zZXR0aW5ncyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2V0dGluZ3MuanMiKCkgewogICAgU2V0dGluZ3MgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk05LjY3MSA0LjEzNmEyLjM0IDIuMzQgMCAwIDEgNC42NTkgMCAyLjM0IDIuMzQgMCAwIDAgMy4zMTkgMS45MTUgMi4zNCAyLjM0IDAgMCAxIDIuMzMgNC4wMzMgMi4zNCAyLjM0IDAgMCAwIDAgMy44MzEgMi4zNCAyLjM0IDAgMCAxLTIuMzMgNC4wMzMgMi4zNCAyLjM0IDAgMCAwLTMuMzE5IDEuOTE1IDIuMzQgMi4zNCAwIDAgMS00LjY1OSAwIDIuMzQgMi4zNCAwIDAgMC0zLjMyLTEuOTE1IDIuMzQgMi4zNCAwIDAgMS0yLjMzLTQuMDMzIDIuMzQgMi4zNCAwIDAgMCAwLTMuODMxQTIuMzQgMi4zNCAwIDAgMSA2LjM1IDYuMDUxYTIuMzQgMi4zNCAwIDAgMCAzLjMxOS0xLjkxNSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hhcGVzLmpzCnZhciBTaGFwZXM7CnZhciBpbml0X3NoYXBlcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hhcGVzLmpzIigpIHsKICAgIFNoYXBlcyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTguMyAxMGEuNy43IDAgMCAxLS42MjYtMS4wNzlMMTEuNCAzYS43LjcgMCAwIDEgMS4xOTgtLjA0M0wxNi4zIDguOWEuNy43IDAgMCAxLS41NzIgMS4xWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicmVjdCIsIHsgeDogIjMiLCB5OiAiMTQiLCB3aWR0aDogIjciLCBoZWlnaHQ6ICI3Iiwgcng6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTcuNSIsIGN5OiAiMTcuNSIsIHI6ICIzLjUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaGFyZS0yLmpzCnZhciBTaGFyZTI7CnZhciBpbml0X3NoYXJlXzIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoYXJlLTIuanMiKCkgewogICAgU2hhcmUyID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiNSIsIHI6ICIzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNiIsIGN5OiAiMTIiLCByOiAiMyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICIxOSIsIHI6ICIzIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjguNTkiLCB4MjogIjE1LjQyIiwgeTE6ICIxMy41MSIsIHkyOiAiMTcuNDkiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTUuNDEiLCB4MjogIjguNTkiLCB5MTogIjYuNTEiLCB5MjogIjEwLjQ5IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hhcmUuanMKdmFyIFNoYXJlOwp2YXIgaW5pdF9zaGFyZTIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoYXJlLmpzIigpIHsKICAgIFNoYXJlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnYxMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiA2LTQtNC00IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMnY4YTIgMiAwIDAgMCAyIDJoMTJhMiAyIDAgMCAwIDItMnYtOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoZWV0LmpzCnZhciBTaGVldDsKdmFyIGluaXRfc2hlZXQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoZWV0LmpzIigpIHsKICAgIFNoZWV0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMyIsIHgyOiAiMjEiLCB5MTogIjkiLCB5MjogIjkiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMyIsIHgyOiAiMjEiLCB5MTogIjE1IiwgeTI6ICIxNSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI5IiwgeDI6ICI5IiwgeTE6ICI5IiwgeTI6ICIyMSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNSIsIHgyOiAiMTUiLCB5MTogIjkiLCB5MjogIjIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hlbGwuanMKdmFyIFNoZWxsOwp2YXIgaW5pdF9zaGVsbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hlbGwuanMiKCkgewogICAgU2hlbGwgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNCAxMWEyIDIgMCAxIDEtNCAwIDQgNCAwIDAgMSA4IDAgNiA2IDAgMCAxLTEyIDAgOCA4IDAgMCAxIDE2IDAgMTAgMTAgMCAxIDEtMjAgMCAxMS45MyAxMS45MyAwIDAgMSAyLjQyLTcuMjIgMiAyIDAgMSAxIDMuMTYgMi40NCIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoZWx2aW5nLXVuaXQuanMKdmFyIFNoZWx2aW5nVW5pdDsKdmFyIGluaXRfc2hlbHZpbmdfdW5pdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hlbHZpbmctdW5pdC5qcyIoKSB7CiAgICBTaGVsdmluZ1VuaXQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMlY5YTEgMSAwIDAgMC0xLTFIOWExIDEgMCAwIDAtMSAxdjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMjB2LTNhMSAxIDAgMCAwLTEtMWgtMmExIDEgMCAwIDAtMSAxdjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMjJWMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEyaDE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMjBoMTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAydjIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgNGgxNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaWVsZC1hbGVydC5qcwp2YXIgU2hpZWxkQWxlcnQ7CnZhciBpbml0X3NoaWVsZF9hbGVydCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hpZWxkLWFsZXJ0LmpzIigpIHsKICAgIFNoaWVsZEFsZXJ0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMTNjMCA1LTMuNSA3LjUtNy42NiA4Ljk1YTEgMSAwIDAgMS0uNjctLjAxQzcuNSAyMC41IDQgMTggNCAxM1Y2YTEgMSAwIDAgMSAxLTFjMiAwIDQuNS0xLjIgNi4yNC0yLjcyYTEuMTcgMS4xNyAwIDAgMSAxLjUyIDBDMTQuNTEgMy44MSAxNyA1IDE5IDVhMSAxIDAgMCAxIDEgMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOHY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE2aC4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaWVsZC1iYW4uanMKdmFyIFNoaWVsZEJhbjsKdmFyIGluaXRfc2hpZWxkX2JhbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hpZWxkLWJhbi5qcyIoKSB7CiAgICBTaGllbGRCYW4gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAxM2MwIDUtMy41IDcuNS03LjY2IDguOTVhMSAxIDAgMCAxLS42Ny0uMDFDNy41IDIwLjUgNCAxOCA0IDEzVjZhMSAxIDAgMCAxIDEtMWMyIDAgNC41LTEuMiA2LjI0LTIuNzJhMS4xNyAxLjE3IDAgMCAxIDEuNTIgMEMxNC41MSAzLjgxIDE3IDUgMTkgNWExIDEgMCAwIDEgMSAxeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm00LjI0MyA1LjIxIDE0LjM5IDEyLjQ3MiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaWVsZC1lbGxpcHNpcy5qcwp2YXIgU2hpZWxkRWxsaXBzaXM7CnZhciBpbml0X3NoaWVsZF9lbGxpcHNpcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hpZWxkLWVsbGlwc2lzLmpzIigpIHsKICAgIFNoaWVsZEVsbGlwc2lzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMTNjMCA1LTMuNSA3LjUtNy42NiA4Ljk1YTEgMSAwIDAgMS0uNjctLjAxQzcuNSAyMC41IDQgMTggNCAxM1Y2YTEgMSAwIDAgMSAxLTFjMiAwIDQuNS0xLjIgNi4yNC0yLjcyYTEuMTcgMS4xNyAwIDAgMSAxLjUyIDBDMTQuNTEgMy44MSAxNyA1IDE5IDVhMSAxIDAgMCAxIDEgMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEyaC4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaWVsZC1jaGVjay5qcwp2YXIgU2hpZWxkQ2hlY2s7CnZhciBpbml0X3NoaWVsZF9jaGVjayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hpZWxkLWNoZWNrLmpzIigpIHsKICAgIFNoaWVsZENoZWNrID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMTNjMCA1LTMuNSA3LjUtNy42NiA4Ljk1YTEgMSAwIDAgMS0uNjctLjAxQzcuNSAyMC41IDQgMTggNCAxM1Y2YTEgMSAwIDAgMSAxLTFjMiAwIDQuNS0xLjIgNi4yNC0yLjcyYTEuMTcgMS4xNyAwIDAgMSAxLjUyIDBDMTQuNTEgMy44MSAxNyA1IDE5IDVhMSAxIDAgMCAxIDEgMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxMiAyIDIgNC00IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hpZWxkLWhhbGYuanMKdmFyIFNoaWVsZEhhbGY7CnZhciBpbml0X3NoaWVsZF9oYWxmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaGllbGQtaGFsZi5qcyIoKSB7CiAgICBTaGllbGRIYWxmID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMTNjMCA1LTMuNSA3LjUtNy42NiA4Ljk1YTEgMSAwIDAgMS0uNjctLjAxQzcuNSAyMC41IDQgMTggNCAxM1Y2YTEgMSAwIDAgMSAxLTFjMiAwIDQuNS0xLjIgNi4yNC0yLjcyYTEuMTcgMS4xNyAwIDAgMSAxLjUyIDBDMTQuNTEgMy44MSAxNyA1IDE5IDVhMSAxIDAgMCAxIDEgMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjJWMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaWVsZC1taW51cy5qcwp2YXIgU2hpZWxkTWludXM7CnZhciBpbml0X3NoaWVsZF9taW51cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hpZWxkLW1pbnVzLmpzIigpIHsKICAgIFNoaWVsZE1pbnVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMTNjMCA1LTMuNSA3LjUtNy42NiA4Ljk1YTEgMSAwIDAgMS0uNjctLjAxQzcuNSAyMC41IDQgMTggNCAxM1Y2YTEgMSAwIDAgMSAxLTFjMiAwIDQuNS0xLjIgNi4yNC0yLjcyYTEuMTcgMS4xNyAwIDAgMSAxLjUyIDBDMTQuNTEgMy44MSAxNyA1IDE5IDVhMSAxIDAgMCAxIDEgMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMmg2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hpZWxkLW9mZi5qcwp2YXIgU2hpZWxkT2ZmOwp2YXIgaW5pdF9zaGllbGRfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaGllbGQtb2ZmLmpzIigpIHsKICAgIFNoaWVsZE9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk01IDVhMSAxIDAgMCAwLTEgMXY3YzAgNSAzLjUgNy41IDcuNjcgOC45NGExIDEgMCAwIDAgLjY3LjAxYzIuMzUtLjgyIDQuNDgtMS45NyA1LjktMy43MSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk05LjMwOSAzLjY1MkExMi4yNTIgMTIuMjUyIDAgMCAwIDExLjI0IDIuMjhhMS4xNyAxLjE3IDAgMCAxIDEuNTIgMEMxNC41MSAzLjgxIDE3IDUgMTkgNWExIDEgMCAwIDEgMSAxdjdhOS43ODQgOS43ODQgMCAwIDEtLjA4IDEuMjY0IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hpZWxkLXBsdXMuanMKdmFyIFNoaWVsZFBsdXM7CnZhciBpbml0X3NoaWVsZF9wbHVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaGllbGQtcGx1cy5qcyIoKSB7CiAgICBTaGllbGRQbHVzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjAgMTNjMCA1LTMuNSA3LjUtNy42NiA4Ljk1YTEgMSAwIDAgMS0uNjctLjAxQzcuNSAyMC41IDQgMTggNCAxM1Y2YTEgMSAwIDAgMSAxLTFjMiAwIDQuNS0xLjIgNi4yNC0yLjcyYTEuMTcgMS4xNyAwIDAgMSAxLjUyIDBDMTQuNTEgMy44MSAxNyA1IDE5IDVhMSAxIDAgMCAxIDEgMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxMmg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDl2NiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaWVsZC1xdWVzdGlvbi1tYXJrLmpzCnZhciBTaGllbGRRdWVzdGlvbk1hcms7CnZhciBpbml0X3NoaWVsZF9xdWVzdGlvbl9tYXJrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaGllbGQtcXVlc3Rpb24tbWFyay5qcyIoKSB7CiAgICBTaGllbGRRdWVzdGlvbk1hcmsgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAxM2MwIDUtMy41IDcuNS03LjY2IDguOTVhMSAxIDAgMCAxLS42Ny0uMDFDNy41IDIwLjUgNCAxOCA0IDEzVjZhMSAxIDAgMCAxIDEtMWMyIDAgNC41LTEuMiA2LjI0LTIuNzJhMS4xNyAxLjE3IDAgMCAxIDEuNTIgMEMxNC41MSAzLjgxIDE3IDUgMTkgNWExIDEgMCAwIDEgMSAxeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjEgOWEzIDMgMCAwIDEgNS44MiAxYzAgMi0zIDMtMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE3aC4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaWVsZC11c2VyLmpzCnZhciBTaGllbGRVc2VyOwp2YXIgaW5pdF9zaGllbGRfdXNlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hpZWxkLXVzZXIuanMiKCkgewogICAgU2hpZWxkVXNlciA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDEzYzAgNS0zLjUgNy41LTcuNjYgOC45NWExIDEgMCAwIDEtLjY3LS4wMUM3LjUgMjAuNSA0IDE4IDQgMTNWNmExIDEgMCAwIDEgMS0xYzIgMCA0LjUtMS4yIDYuMjQtMi43MmExLjE3IDEuMTcgMCAwIDEgMS41MiAwQzE0LjUxIDMuODEgMTcgNSAxOSA1YTEgMSAwIDAgMSAxIDF6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMzc2IDE4LjkxYTYgNiAwIDAgMSAxMS4yNDkuMDAzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjExIiwgcjogIjQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaGllbGQteC5qcwp2YXIgU2hpZWxkWDsKdmFyIGluaXRfc2hpZWxkX3ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaWVsZC14LmpzIigpIHsKICAgIFNoaWVsZFggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAxM2MwIDUtMy41IDcuNS03LjY2IDguOTVhMSAxIDAgMCAxLS42Ny0uMDFDNy41IDIwLjUgNCAxOCA0IDEzVjZhMSAxIDAgMCAxIDEtMWMyIDAgNC41LTEuMiA2LjI0LTIuNzJhMS4xNyAxLjE3IDAgMCAxIDEuNTIgMEMxNC41MSAzLjgxIDE3IDUgMTkgNWExIDEgMCAwIDEgMSAxeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC41IDkuNS01IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOS41IDkuNSA1IDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaGlwLXdoZWVsLmpzCnZhciBTaGlwV2hlZWw7CnZhciBpbml0X3NoaXBfd2hlZWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaXAtd2hlZWwuanMiKCkgewogICAgU2hpcFdoZWVsID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjcuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOSA1LTUuMjMgNS4yMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxMmgtNy41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5IDE5LTUuMjMtNS4yMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNC41VjIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjIzIDEzLjc3IDUgMTkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS41IDEySDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAuMjMgMTAuMjMgNSA1IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjIuNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaWVsZC5qcwp2YXIgU2hpZWxkOwp2YXIgaW5pdF9zaGllbGQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaWVsZC5qcyIoKSB7CiAgICBTaGllbGQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAxM2MwIDUtMy41IDcuNS03LjY2IDguOTVhMSAxIDAgMCAxLS42Ny0uMDFDNy41IDIwLjUgNCAxOCA0IDEzVjZhMSAxIDAgMCAxIDEtMWMyIDAgNC41LTEuMiA2LjI0LTIuNzJhMS4xNyAxLjE3IDAgMCAxIDEuNTIgMEMxNC41MSAzLjgxIDE3IDUgMTkgNWExIDEgMCAwIDEgMSAxeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaXAuanMKdmFyIFNoaXA7CnZhciBpbml0X3NoaXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaXAuanMiKCkgewogICAgU2hpcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEwLjE4OVYxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMTNWN2EyIDIgMCAwIDAtMi0ySDdhMiAyIDAgMCAwLTIgMnY2IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE5LjM4IDIwQTExLjYgMTEuNiAwIDAgMCAyMSAxNGwtOC4xODgtMy42MzlhMiAyIDAgMCAwLTEuNjI0IDBMMyAxNGExMS42IDExLjYgMCAwIDAgMi44MSA3Ljc2IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIgMjFjLjYuNSAxLjIgMSAyLjUgMSAyLjUgMCAyLjUtMiA1LTIgMS4zIDAgMS45LjUgMi41IDFzMS4yIDEgMi41IDFjMi41IDAgMi41LTIgNS0yIDEuMyAwIDEuOS41IDIuNSAxIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hpcnQuanMKdmFyIFNoaXJ0Owp2YXIgaW5pdF9zaGlydCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hpcnQuanMiKCkgewogICAgU2hpcnQgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMC4zOCAzLjQ2IDE2IDJhNCA0IDAgMCAxLTggMEwzLjYyIDMuNDZhMiAyIDAgMCAwLTEuMzQgMi4yM2wuNTggMy40N2ExIDEgMCAwIDAgLjk5Ljg0SDZ2MTBjMCAxLjEuOSAyIDIgMmg4YTIgMiAwIDAgMCAyLTJWMTBoMi4xNWExIDEgMCAwIDAgLjk5LS44NGwuNTgtMy40N2EyIDIgMCAwIDAtMS4zNC0yLjIzeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Nob3BwaW5nLWJhZy5qcwp2YXIgU2hvcHBpbmdCYWc7CnZhciBpbml0X3Nob3BwaW5nX2JhZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hvcHBpbmctYmFnLmpzIigpIHsKICAgIFNob3BwaW5nQmFnID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTBhNCA0IDAgMCAxLTggMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zLjEwMyA2LjAzNGgxNy43OTQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMy40IDUuNDY3YTIgMiAwIDAgMC0uNCAxLjJWMjBhMiAyIDAgMCAwIDIgMmgxNGEyIDIgMCAwIDAgMi0yVjYuNjY3YTIgMiAwIDAgMC0uNC0xLjJsLTItMi42NjdBMiAyIDAgMCAwIDE3IDJIN2EyIDIgMCAwIDAtMS42Ljh6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hvcHBpbmctYmFza2V0LmpzCnZhciBTaG9wcGluZ0Jhc2tldDsKdmFyIGluaXRfc2hvcHBpbmdfYmFza2V0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaG9wcGluZy1iYXNrZXQuanMiKCkgewogICAgU2hvcHBpbmdCYXNrZXQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxMS0xIDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkgMTEtNC03IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTFoMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMy41IDExIDEuNiA3LjRhMiAyIDAgMCAwIDIgMS42aDkuOGEyIDIgMCAwIDAgMi0xLjZsMS43LTcuNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00LjUgMTUuNWgxNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01IDExIDQtNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDExIDEgOSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Nob3BwaW5nLWNhcnQuanMKdmFyIFNob3BwaW5nQ2FydDsKdmFyIGluaXRfc2hvcHBpbmdfY2FydCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hvcHBpbmctY2FydC5qcyIoKSB7CiAgICBTaG9wcGluZ0NhcnQgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjgiLCBjeTogIjIxIiwgcjogIjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiMjEiLCByOiAiMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTIuMDUgMi4wNWgybDIuNjYgMTIuNDJhMiAyIDAgMCAwIDIgMS41OGg5Ljc4YTIgMiAwIDAgMCAxLjk1LTEuNTdsMS42NS03LjQzSDUuMTIiIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hvdmVsLmpzCnZhciBTaG92ZWw7CnZhciBpbml0X3Nob3ZlbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hvdmVsLmpzIigpIHsKICAgIFNob3ZlbCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxLjU2IDQuNTZhMS41IDEuNSAwIDAgMSAwIDIuMTIybC0uNDcuNDdhMyAzIDAgMCAxLTQuMjEyLS4wMyAzIDMgMCAwIDEgMC00LjI0M2wuNDQtLjQ0YTEuNSAxLjUgMCAwIDEgMi4xMjEgMHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMyAyMmExIDEgMCAwIDEtMS0xdi0zLjU4NmExIDEgMCAwIDEgLjI5My0uNzA3bDMuMzU1LTMuMzU1YTEuMjA1IDEuMjA1IDAgMCAxIDEuNzA0IDBsMy4yOTYgMy4yOTZhMS4yMDUgMS4yMDUgMCAwIDEgMCAxLjcwNGwtMy4zNTUgMy4zNTVhMSAxIDAgMCAxLS43MDcuMjkzeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDE1IDcuODc5LTcuODc4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hvd2VyLWhlYWQuanMKdmFyIFNob3dlckhlYWQ7CnZhciBpbml0X3Nob3dlcl9oZWFkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaG93ZXItaGVhZC5qcyIoKSB7CiAgICBTaG93ZXJIZWFkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtNCA0IDIuNSAyLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMuNSA2LjVhNC45NSA0Ljk1IDAgMCAwLTcgNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA1IDUgMTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTd2LjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE2di4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxM3YuMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTB2LjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDIwdi4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxNHYuMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTF2LjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hyZWRkZXIuanMKdmFyIFNocmVkZGVyOwp2YXIgaW5pdF9zaHJlZGRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hyZWRkZXIuanMiKCkgewogICAgU2hyZWRkZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTQgMTNWNGEyIDIgMCAwIDEgMi0yaDhhMi40IDIuNCAwIDAgMSAxLjcwNi43MDZsMy41ODggMy41ODhBMi40IDIuNCAwIDAgMSAyMCA4djUiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2NWExIDEgMCAwIDAgMSAxaDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMjJ2LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTl2LTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMjB2LTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxM2gyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDIwdi0zIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hyaW1wLmpzCnZhciBTaHJpbXA7CnZhciBpbml0X3NocmltcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hyaW1wLmpzIigpIHsKICAgIFNocmltcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDEyaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAyMmMuNS0uNSAxLjEyLTEgMi41LTEtMS4zOCAwLTItLjUtMi41LTEiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTQgMmEzLjI4IDMuMjggMCAwIDEtMy4yMjcgMS43OThsLTYuMTctLjU2MUEyLjM4NyAyLjM4NyAwIDEgMCA0LjM4NyA4SDE1LjVhMSAxIDAgMCAxIDAgMTMgMSAxIDAgMCAwIDAtNUgxMmE3IDcgMCAwIDEtNy03VjgiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgOGE4LjUgOC41IDAgMCAxIDAgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNmMyIDAgNC41LTQgNC02IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hyaW5rLmpzCnZhciBTaHJpbms7CnZhciBpbml0X3NocmluayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hyaW5rLmpzIigpIHsKICAgIFNocmluayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDE1IDYgNm0tNi02djQuOG0wLTQuOGg0LjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxOS44VjE1bTAgMEg0LjJNOSAxNWwtNiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDQuMlY5bTAgMGg0LjhNMTUgOWw2LTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA0LjJWOW0wIDBINC4yTTkgOSAzIDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaHJ1Yi5qcwp2YXIgU2hydWI7CnZhciBpbml0X3NocnViID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaHJ1Yi5qcyIoKSB7CiAgICBTaHJ1YiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIydi01LjE3MmEyIDIgMCAwIDAtLjU4Ni0xLjQxNEw5LjUgMTMuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNC41IDE0LjUgMTIgMTciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgOC44QTYgNiAwIDAgMSAxMy44IDIwSDEwQTYuNSA2LjUgMCAwIDEgNyA4YTUgNSAwIDAgMSAxMCAweiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NodWZmbGUuanMKdmFyIFNodWZmbGU7CnZhciBpbml0X3NodWZmbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NodWZmbGUuanMiKCkgewogICAgU2h1ZmZsZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE4IDE0IDQgNC00IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMiA0IDQtNCA0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMThoMS45NzNhNCA0IDAgMCAwIDMuMy0xLjdsNS40NTQtOC42YTQgNCAwIDAgMSAzLjMtMS43SDIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgNmgxLjk3MmE0IDQgMCAwIDEgMy42IDIuMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxOGgtNi4wNDFhNCA0IDAgMCAxLTMuMy0xLjhsLS4zNTktLjQ1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2lnbWEuanMKdmFyIFNpZ21hOwp2YXIgaW5pdF9zaWdtYSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2lnbWEuanMiKCkgewogICAgU2lnbWEgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOCA3VjVhMSAxIDAgMCAwLTEtMUg2LjVhLjUuNSAwIDAgMC0uNC44bDQuNSA2YTIgMiAwIDAgMSAwIDIuNGwtNC41IDZhLjUuNSAwIDAgMCAuNC44SDE3YTEgMSAwIDAgMCAxLTF2LTIiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaWduYWwtaGlnaC5qcwp2YXIgU2lnbmFsSGlnaDsKdmFyIGluaXRfc2lnbmFsX2hpZ2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NpZ25hbC1oaWdoLmpzIigpIHsKICAgIFNpZ25hbEhpZ2ggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIwaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIwdi00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIwdi04IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDIwVjgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaWduYWwtbG93LmpzCnZhciBTaWduYWxMb3c7CnZhciBpbml0X3NpZ25hbF9sb3cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NpZ25hbC1sb3cuanMiKCkgewogICAgU2lnbmFsTG93ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMHYtNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NpZ25hbC1tZWRpdW0uanMKdmFyIFNpZ25hbE1lZGl1bTsKdmFyIGluaXRfc2lnbmFsX21lZGl1bSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2lnbmFsLW1lZGl1bS5qcyIoKSB7CiAgICBTaWduYWxNZWRpdW0gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIwaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIwdi00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIwdi04IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2lnbmFsLXplcm8uanMKdmFyIFNpZ25hbFplcm87CnZhciBpbml0X3NpZ25hbF96ZXJvID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaWduYWwtemVyby5qcyIoKSB7CiAgICBTaWduYWxaZXJvID0gW1sicGF0aCIsIHsgZDogIk0yIDIwaC4wMSIgfV1dOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaWduYWwuanMKdmFyIFNpZ25hbDsKdmFyIGluaXRfc2lnbmFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaWduYWwuanMiKCkgewogICAgU2lnbmFsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMHYtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMHYtOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAyMFY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDR2MTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaWduYXR1cmUuanMKdmFyIFNpZ25hdHVyZTsKdmFyIGluaXRfc2lnbmF0dXJlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaWduYXR1cmUuanMiKCkgewogICAgU2lnbmF0dXJlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMjEgMTctMi4xNTYtMS44NjhBLjUuNSAwIDAgMCAxOCAxNS41di41YTEgMSAwIDAgMS0xIDFoLTJhMSAxIDAgMCAxLTEtMWMwLTIuNTQ1LTMuOTkxLTMuOTctOC41LTRhMSAxIDAgMCAwIDAgNWM0LjE1MyAwIDQuNzQ1LTExLjI5NSA1LjcwOC0xMy41YTIuNSAyLjUgMCAxIDEgMy4zMSAzLjI4NCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDIxaDE4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2lnbnBvc3QuanMKdmFyIFNpZ25wb3N0Owp2YXIgaW5pdF9zaWducG9zdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2lnbnBvc3QuanMiKCkgewogICAgU2lnbnBvc3QgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxM3Y4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDN2MyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOCA2YTIgMiAwIDAgMSAxLjM4Ny41NmwyLjMwNyAyLjIyYTEgMSAwIDAgMSAwIDEuNDRsLTIuMzA3IDIuMjJBMiAyIDAgMCAxIDE4IDEzSDZhMiAyIDAgMCAxLTEuMzg3LS41NmwtMi4zMDYtMi4yMmExIDEgMCAwIDEgMC0xLjQ0bDIuMzA2LTIuMjJBMiAyIDAgMCAxIDYgNnoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaXJlbi5qcwp2YXIgU2lyZW47CnZhciBpbml0X3NpcmVuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaXJlbi5qcyIoKSB7CiAgICBTaXJlbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTh2LTZhNSA1IDAgMSAxIDEwIDB2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDIxYTEgMSAwIDAgMCAxIDFoMTJhMSAxIDAgMCAwIDEtMXYtMWEyIDIgMCAwIDAtMi0ySDdhMiAyIDAgMCAwLTIgMnoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTJoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOC41IDQuNSAxOCA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTJoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNC45MjkgNC45MjkuNzA3LjcwNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMnY2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2lnbnBvc3QtYmlnLmpzCnZhciBTaWducG9zdEJpZzsKdmFyIGluaXRfc2lnbnBvc3RfYmlnID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaWducG9zdC1iaWcuanMiKCkgewogICAgU2lnbnBvc3RCaWcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA5SDRMMiA3bDItMmg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDVoNmwyIDItMiAyaC02IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDIyVjRhMiAyIDAgMSAxIDQgMHYxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIyaDgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9za2lwLWJhY2suanMKdmFyIFNraXBCYWNrOwp2YXIgaW5pdF9za2lwX2JhY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NraXAtYmFjay5qcyIoKSB7CiAgICBTa2lwQmFjayA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE3Ljk3MSA0LjI4NUEyIDIgMCAwIDEgMjEgNnYxMmEyIDIgMCAwIDEtMy4wMjkgMS43MTVsLTkuOTk3LTUuOTk4YTIgMiAwIDAgMS0uMDAzLTMuNDMyeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDIwVjQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9za2lwLWZvcndhcmQuanMKdmFyIFNraXBGb3J3YXJkOwp2YXIgaW5pdF9za2lwX2ZvcndhcmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NraXAtZm9yd2FyZC5qcyIoKSB7CiAgICBTa2lwRm9yd2FyZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDR2MTYiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk02LjAyOSA0LjI4NUEyIDIgMCAwIDAgMyA2djEyYTIgMiAwIDAgMCAzLjAyOSAxLjcxNWw5Ljk5Ny01Ljk5OGEyIDIgMCAwIDAgLjAwMy0zLjQzMnoiIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2xhY2suanMKdmFyIFNsYWNrOwp2YXIgaW5pdF9zbGFjayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2xhY2suanMiKCkgewogICAgU2xhY2sgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIzIiwgaGVpZ2h0OiAiOCIsIHg6ICIxMyIsIHk6ICIyIiwgcng6ICIxLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgOC41VjEwaDEuNUExLjUgMS41IDAgMSAwIDE5IDguNSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIzIiwgaGVpZ2h0OiAiOCIsIHg6ICI4IiwgeTogIjE0Iiwgcng6ICIxLjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxNS41VjE0SDMuNUExLjUgMS41IDAgMSAwIDUgMTUuNSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiMyIsIHg6ICIxNCIsIHk6ICIxMyIsIHJ4OiAiMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1LjUgMTlIMTR2MS41YTEuNSAxLjUgMCAxIDAgMS41LTEuNSIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiMyIsIHg6ICIyIiwgeTogIjgiLCByeDogIjEuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjUgNUgxMFYzLjVBMS41IDEuNSAwIDEgMCA4LjUgNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NsYXNoLmpzCnZhciBTbGFzaDsKdmFyIGluaXRfc2xhc2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NsYXNoLmpzIigpIHsKICAgIFNsYXNoID0gW1sicGF0aCIsIHsgZDogIk0yMiAyIDIgMjIiIH1dXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2t1bGwuanMKdmFyIFNrdWxsOwp2YXIgaW5pdF9za3VsbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2t1bGwuanMiKCkgewogICAgU2t1bGwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMi41IDE3LS41LTEtLjUgMWgxeiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNSAyMmExIDEgMCAwIDAgMS0xdi0xYTIgMiAwIDAgMCAxLjU2LTMuMjUgOCA4IDAgMSAwLTExLjEyIDBBMiAyIDAgMCAwIDggMjB2MWExIDEgMCAwIDAgMSAxeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE1IiwgY3k6ICIxMiIsIHI6ICIxIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOSIsIGN5OiAiMTIiLCByOiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NsaWNlLmpzCnZhciBTbGljZTsKdmFyIGluaXRfc2xpY2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NsaWNlLmpzIigpIHsKICAgIFNsaWNlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEgMTYuNTg2VjE5YTEgMSAwIDAgMS0xIDFIMkwxOC4zNyAzLjYzYTEgMSAwIDEgMSAzIDNsLTkuNjYzIDkuNjYzYTEgMSAwIDAgMS0xLjQxNCAwTDggMTQiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zbGlkZXJzLXZlcnRpY2FsLmpzCnZhciBTbGlkZXJzVmVydGljYWw7CnZhciBpbml0X3NsaWRlcnNfdmVydGljYWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NsaWRlcnMtdmVydGljYWwuanMiKCkgewogICAgU2xpZGVyc1ZlcnRpY2FsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIxdi05IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDhWMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxNmg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDEyVjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMjF2LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxNGg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTBWMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDIxdi03IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc2xpZGVycy1ob3Jpem9udGFsLmpzCnZhciBTbGlkZXJzSG9yaXpvbnRhbDsKdmFyIGluaXRfc2xpZGVyc19ob3Jpem9udGFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zbGlkZXJzLWhvcml6b250YWwuanMiKCkgewogICAgU2xpZGVyc0hvcml6b250YWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA1SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTlIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAzdjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTd2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMmgtOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxOWgtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA1aC03IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTB2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEySDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zbWFydHBob25lLWNoYXJnaW5nLmpzCnZhciBTbWFydHBob25lQ2hhcmdpbmc7CnZhciBpbml0X3NtYXJ0cGhvbmVfY2hhcmdpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NtYXJ0cGhvbmUtY2hhcmdpbmcuanMiKCkgewogICAgU21hcnRwaG9uZUNoYXJnaW5nID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTQiLCBoZWlnaHQ6ICIyMCIsIHg6ICI1IiwgeTogIjIiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIuNjY3IDggMTAgMTJoNGwtMi42NjcgNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NtYXJ0cGhvbmUtbmZjLmpzCnZhciBTbWFydHBob25lTmZjOwp2YXIgaW5pdF9zbWFydHBob25lX25mYyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc21hcnRwaG9uZS1uZmMuanMiKCkgewogICAgU21hcnRwaG9uZU5mYyA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjciLCBoZWlnaHQ6ICIxMiIsIHg6ICIyIiwgeTogIjYiLCByeDogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgOC4zMmE3LjQzIDcuNDMgMCAwIDEgMCA3LjM2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2LjQ2IDYuMjFhMTEuNzYgMTEuNzYgMCAwIDEgMCAxMS41OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOS45MSA0LjFhMTUuOTEgMTUuOTEgMCAwIDEgLjAxIDE1LjgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zbWFydHBob25lLmpzCnZhciBTbWFydHBob25lOwp2YXIgaW5pdF9zbWFydHBob25lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zbWFydHBob25lLmpzIigpIHsKICAgIFNtYXJ0cGhvbmUgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNCIsIGhlaWdodDogIjIwIiwgeDogIjUiLCB5OiAiMiIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOGguMDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zbWlsZS1wbHVzLmpzCnZhciBTbWlsZVBsdXM7CnZhciBpbml0X3NtaWxlX3BsdXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NtaWxlLXBsdXMuanMiKCkgewogICAgU21pbGVQbHVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTF2MWExMCAxMCAwIDEgMS05LTEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTRzMS41IDIgNCAyIDQtMiA0LTIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiOSIsIHgyOiAiOS4wMSIsIHkxOiAiOSIsIHkyOiAiOSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNSIsIHgyOiAiMTUuMDEiLCB5MTogIjkiLCB5MjogIjkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNWg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDJ2NiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NtaWxlLmpzCnZhciBTbWlsZTsKdmFyIGluaXRfc21pbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NtaWxlLmpzIigpIHsKICAgIFNtaWxlID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNHMxLjUgMiA0IDIgNC0yIDQtMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI5IiwgeDI6ICI5LjAxIiwgeTE6ICI5IiwgeTI6ICI5IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE1IiwgeDI6ICIxNS4wMSIsIHkxOiAiOSIsIHkyOiAiOSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Nub3dmbGFrZS5qcwp2YXIgU25vd2ZsYWtlOwp2YXIgaW5pdF9zbm93Zmxha2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Nub3dmbGFrZS5qcyIoKSB7CiAgICBTbm93Zmxha2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCAyMC0xLjI1LTIuNUw2IDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDQgOC43NSA2LjUgNiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDIwIDEuMjUtMi41TDE4IDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDQgMS4yNSAyLjVMMTggNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAyMS0zLTZoLTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMy0zIDYgMS41IDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmg2LjVMMTAgOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMCAxMC0xLjUgMiAxLjUgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxMmgtNi41TDE0IDE1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTQgMTAgMS41IDJMNCAxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03IDIxIDMtNi0xLjUtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm03IDMgMyA2aDQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zb2FwLWRpc3BlbnNlci1kcm9wbGV0LmpzCnZhciBTb2FwRGlzcGVuc2VyRHJvcGxldDsKdmFyIGluaXRfc29hcF9kaXNwZW5zZXJfZHJvcGxldCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc29hcC1kaXNwZW5zZXItZHJvcGxldC5qcyIoKSB7CiAgICBTb2FwRGlzcGVuc2VyRHJvcGxldCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjUgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJIN2EyIDIgMCAwIDAtMiAyIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE5LjI5IDE0Ljc2QTYuNjcgNi42NyAwIDAgMSAxNyAxMWE2LjYgNi42IDAgMCAxLTIuMjkgMy43NmMtMS4xNS45Mi0xLjcxIDIuMDQtMS43MSAzLjE5IDAgMi4yMiAxLjggNC4wNSA0IDQuMDVzNC0xLjgzIDQtNC4wNWMwLTEuMTYtLjU3LTIuMjYtMS43MS0zLjE5IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuNjA3IDIxSDZhMiAyIDAgMCAxLTItMnYtN2EyIDIgMCAwIDEgMi0yaDdWN2ExIDEgMCAwIDAtMS0xSDlhMSAxIDAgMCAwLTEgMXYzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc25haWwuanMKdmFyIFNuYWlsOwp2YXIgaW5pdF9zbmFpbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc25haWwuanMiKCkgewogICAgU25haWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEzYTYgNiAwIDEgMCAxMiAwIDQgNCAwIDEgMC04IDAgMiAyIDAgMCAwIDQgMCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEwIiwgY3k6ICIxMyIsIHI6ICI4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjFoMTJjNC40IDAgOC0zLjYgOC04VjdhMiAyIDAgMSAwLTQgMHY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDMgMTkuMSA1LjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMyAyMC45IDUuMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NvZmEuanMKdmFyIFNvZmE7CnZhciBpbml0X3NvZmEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NvZmEuanMiKCkgewogICAgU29mYSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDlWNmEyIDIgMCAwIDAtMi0ySDZhMiAyIDAgMCAwLTIgMnYzIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIgMTZhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0ydi01YTIgMiAwIDAgMC00IDB2MS41YS41LjUgMCAwIDEtLjUuNWgtMTFhLjUuNSAwIDAgMS0uNS0uNVYxMWEyIDIgMCAwIDAtNCAweiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDE4djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTh2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA0djkiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zb2xhci1wYW5lbC5qcwp2YXIgU29sYXJQYW5lbDsKdmFyIGluaXRfc29sYXJfcGFuZWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NvbGFyLXBhbmVsLmpzIigpIHsKICAgIFNvbGFyUGFuZWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAyaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuMjggMTQtNC41NiA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDIyLTEuNTU4LTRINC41NTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMHYyIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTYuMjQ1IDE1LjA0QTIgMiAwIDAgMSA4IDE0aDEyYTEgMSAwIDAgMSAuODY0IDEuNTA1bC0zLjExIDUuNDU3QTIgMiAwIDAgMSAxNiAyMkg0YTEgMSAwIDAgMS0uODYzLTEuNTA2eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDJhNCA0IDAgMCAxLTQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04LjY2IDcuNjYgMS40MSAxLjQxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc291cC5qcwp2YXIgU291cDsKdmFyIGluaXRfc291cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc291cC5qcyIoKSB7CiAgICBTb3VwID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjFhOSA5IDAgMCAwIDktOUgzYTkgOSAwIDAgMCA5IDlaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjFoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkuNSAxMiAyMiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2LjI1IDNjLjI3LjEuOC41My43NSAxLjM2LS4wNi44My0uOTMgMS4yLTEgMi4wMi0uMDUuNzguMzQgMS4yNC43MyAxLjYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExLjI1IDNjLjI3LjEuOC41My43NCAxLjM2LS4wNS44My0uOTMgMS4yLS45OCAyLjAyLS4wNi43OC4zMyAxLjI0LjcyIDEuNjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi4yNSAzYy4yNy4xLjguNTMuNzUgMS4zNi0uMDYuODMtLjkzIDEuMi0xIDIuMDItLjA1Ljc4LjM0IDEuMjQuNzQgMS42MiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NwYWNlLmpzCnZhciBTcGFjZTsKdmFyIGluaXRfc3BhY2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NwYWNlLmpzIigpIHsKICAgIFNwYWNlID0gW1sicGF0aCIsIHsgZDogIk0yMiAxN3YxYzAgLjUtLjUgMS0xIDFIM2MtLjUgMC0xLS41LTEtMXYtMSIgfV1dOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcGFkZS5qcwp2YXIgU3BhZGU7CnZhciBpbml0X3NwYWRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcGFkZS5qcyIoKSB7CiAgICBTcGFkZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE4djQiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMiAxNC40OTlhNS41IDUuNSAwIDAgMCA5LjU5MSAzLjY3NS42LjYgMCAwIDEgLjgxOC4wMDFBNS41IDUuNSAwIDAgMCAyMiAxNC41YzAtMi4yOS0xLjUtNC0zLTUuNWwtNS40OTItNS4zMTJhMiAyIDAgMCAwLTMtLjAyTDUgOC45OTljLTEuNSAxLjUtMyAzLjItMyA1LjUiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcGFya2xlLmpzCnZhciBTcGFya2xlOwp2YXIgaW5pdF9zcGFya2xlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcGFya2xlLmpzIigpIHsKICAgIFNwYXJrbGUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMS4wMTcgMi44MTRhMSAxIDAgMCAxIDEuOTY2IDBsMS4wNTEgNS41NThhMiAyIDAgMCAwIDEuNTk0IDEuNTk0bDUuNTU4IDEuMDUxYTEgMSAwIDAgMSAwIDEuOTY2bC01LjU1OCAxLjA1MWEyIDIgMCAwIDAtMS41OTQgMS41OTRsLTEuMDUxIDUuNTU4YTEgMSAwIDAgMS0xLjk2NiAwbC0xLjA1MS01LjU1OGEyIDIgMCAwIDAtMS41OTQtMS41OTRsLTUuNTU4LTEuMDUxYTEgMSAwIDAgMSAwLTEuOTY2bDUuNTU4LTEuMDUxYTIgMiAwIDAgMCAxLjU5NC0xLjU5NHoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcGFya2xlcy5qcwp2YXIgU3BhcmtsZXM7CnZhciBpbml0X3NwYXJrbGVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcGFya2xlcy5qcyIoKSB7CiAgICBTcGFya2xlcyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTExLjAxNyAyLjgxNGExIDEgMCAwIDEgMS45NjYgMGwxLjA1MSA1LjU1OGEyIDIgMCAwIDAgMS41OTQgMS41OTRsNS41NTggMS4wNTFhMSAxIDAgMCAxIDAgMS45NjZsLTUuNTU4IDEuMDUxYTIgMiAwIDAgMC0xLjU5NCAxLjU5NGwtMS4wNTEgNS41NThhMSAxIDAgMCAxLTEuOTY2IDBsLTEuMDUxLTUuNTU4YTIgMiAwIDAgMC0xLjU5NC0xLjU5NGwtNS41NTgtMS4wNTFhMSAxIDAgMCAxIDAtMS45NjZsNS41NTgtMS4wNTFhMiAyIDAgMCAwIDEuNTk0LTEuNTk0eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAydjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgNGgtNCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjQiLCBjeTogIjIwIiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcGVha2VyLmpzCnZhciBTcGVha2VyOwp2YXIgaW5pdF9zcGVha2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcGVha2VyLmpzIigpIHsKICAgIFNwZWFrZXIgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNiIsIGhlaWdodDogIjIwIiwgeDogIjQiLCB5OiAiMiIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA2aC4wMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxNCIsIHI6ICI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE0aC4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NwZWVjaC5qcwp2YXIgU3BlZWNoOwp2YXIgaW5pdF9zcGVlY2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NwZWVjaC5qcyIoKSB7CiAgICBTcGVlY2ggPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk04LjggMjB2LTQuMWwxLjkuMmEyLjMgMi4zIDAgMCAwIDIuMTY0LTIuMVY4LjNBNS4zNyA1LjM3IDAgMCAwIDIgOC4yNWMwIDIuOC42NTYgMy4wNTQgMSA0LjU1YTUuNzcgNS43NyAwIDAgMSAuMDI5IDIuNzU4TDIgMjAiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkuOCAxNy44YTcuNSA3LjUgMCAwIDAgLjAwMy0xMC42MDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTVhMy41IDMuNSAwIDAgMC0uMDI1LTQuOTc1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3BlbGwtY2hlY2stMi5qcwp2YXIgU3BlbGxDaGVjazI7CnZhciBpbml0X3NwZWxsX2NoZWNrXzIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NwZWxsLWNoZWNrLTIuanMiKCkgewogICAgU3BlbGxDaGVjazIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm02IDE2IDYtMTIgNiAxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEyaDgiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNCAyMWMxLjEgMCAxLjEtMSAyLjMtMXMxLjEgMSAyLjMgMWMxLjEgMCAxLjEtMSAyLjMtMSAxLjEgMCAxLjEgMSAyLjMgMSAxLjEgMCAxLjEtMSAyLjMtMSAxLjEgMCAxLjEgMSAyLjMgMSAxLjEgMCAxLjEtMSAyLjMtMSIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NwbGluZS1wb2ludGVyLmpzCnZhciBTcGxpbmVQb2ludGVyOwp2YXIgaW5pdF9zcGxpbmVfcG9pbnRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3BsaW5lLXBvaW50ZXIuanMiKCkgewogICAgU3BsaW5lUG9pbnRlciA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyLjAzNCAxMi42ODFhLjQ5OC40OTggMCAwIDEgLjY0Ny0uNjQ3bDkgMy41YS41LjUgMCAwIDEtLjAzMy45NDNsLTMuNDQ0IDEuMDY4YTEgMSAwIDAgMC0uNjYuNjZsLTEuMDY3IDMuNDQzYS41LjUgMCAwIDEtLjk0My4wMzN6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTdBMTIgMTIgMCAwIDEgMTcgNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE5IiwgY3k6ICI1IiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI1IiwgY3k6ICIxOSIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3BlbGwtY2hlY2suanMKdmFyIFNwZWxsQ2hlY2s7CnZhciBpbml0X3NwZWxsX2NoZWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcGVsbC1jaGVjay5qcyIoKSB7CiAgICBTcGVsbENoZWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtNiAxNiA2LTEyIDYgMTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDIwIDIgMiA0LTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcGxpbmUuanMKdmFyIFNwbGluZTsKdmFyIGluaXRfc3BsaW5lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcGxpbmUuanMiKCkgewogICAgU3BsaW5lID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiNSIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNSIsIGN5OiAiMTkiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE3QTEyIDEyIDAgMCAxIDE3IDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcGxpdC5qcwp2YXIgU3BsaXQ7CnZhciBpbml0X3NwbGl0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcGxpdC5qcyIoKSB7CiAgICBTcGxpdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDNoNXY1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggM0gzdjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjJ2LTguM2E0IDQgMCAwIDAtMS4xNzItMi44NzJMMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDkgNi02IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3Bvb2wuanMKdmFyIFNwb29sOwp2YXIgaW5pdF9zcG9vbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3Bvb2wuanMiKCkgewogICAgU3Bvb2wgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNyAxMy40NCA0LjQ0MiAxNy4wODJBMiAyIDAgMCAwIDQuOTgyIDIxSDE5YTIgMiAwIDAgMCAuNTU4LTMuOTIxbC0xLjExNS0uMzJBMiAyIDAgMCAxIDE3IDE0LjgzN1Y3LjY2IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTcgMTAuNTYgMTIuNTU4LTMuNjQyQTIgMiAwIDAgMCAxOS4wMTggM0g1YTIgMiAwIDAgMC0uNTU4IDMuOTIxbDEuMTE1LjMyQTIgMiAwIDAgMSA3IDkuMTYzdjcuMTc4IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3ByYXktY2FuLmpzCnZhciBTcHJheUNhbjsKdmFyIGluaXRfc3ByYXlfY2FuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcHJheS1jYW4uanMiKCkgewogICAgU3ByYXlDYW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDNoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgNWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgN2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA3aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDloLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTFoLjAxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjQiLCBoZWlnaHQ6ICI0IiwgeDogIjE1IiwgeTogIjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkgOSAyIDJ2MTBjMCAuNi0uNCAxLTEgMWgtNmMtLjYgMC0xLS40LTEtMVYxMWwyLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMgMTQgOC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEzIDE5IDgtMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Nwb3RsaWdodC5qcwp2YXIgU3BvdGxpZ2h0Owp2YXIgaW5pdF9zcG90bGlnaHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Nwb3RsaWdodC5qcyIoKSB7CiAgICBTcG90bGlnaHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNS4yOTUgMTkuNTYyIDE2IDIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDE2IDMuNzU4IDIuMDk4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5IDEyLjUgMy4wMjYtLjU5OCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk03LjYxIDYuM2EzIDMgMCAwIDAtMy45MiAxLjNsLTEuMzggMi43OWEzIDMgMCAwIDAgMS4zIDMuOTFsNi44OSAzLjU5N2ExIDEgMCAwIDAgMS4zNDItLjQ0N2wzLjEwNi02LjIxMWExIDEgMCAwIDAtLjQ0Ny0xLjM0MXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA5VjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcHJvdXQuanMKdmFyIFNwcm91dDsKdmFyIGluaXRfc3Byb3V0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcHJvdXQuanMiKCkgewogICAgU3Byb3V0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTQgOS41MzZWN2E0IDQgMCAwIDEgNC00aDEuNWEuNS41IDAgMCAxIC41LjVWNWE0IDQgMCAwIDEtNCA0IDQgNCAwIDAgMC00IDRjMCAyIDEgMyAxIDVhNSA1IDAgMCAxLTEgMyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDlhNSA1IDAgMCAxIDggNCA1IDUgMCAwIDEtOC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMjFoMTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYXJyb3ctZG93bi1sZWZ0LmpzCnZhciBTcXVhcmVBcnJvd0Rvd25MZWZ0Owp2YXIgaW5pdF9zcXVhcmVfYXJyb3dfZG93bl9sZWZ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYXJyb3ctZG93bi1sZWZ0LmpzIigpIHsKICAgIFNxdWFyZUFycm93RG93bkxlZnQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiA4LTggOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNkg4VjgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYWN0aXZpdHkuanMKdmFyIFNxdWFyZUFjdGl2aXR5Owp2YXIgaW5pdF9zcXVhcmVfYWN0aXZpdHkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1hY3Rpdml0eS5qcyIoKSB7CiAgICBTcXVhcmVBY3Rpdml0eSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDEyaC0ybC0yIDUtMi0xMC0yIDVINyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1hcnJvdy1kb3duLXJpZ2h0LmpzCnZhciBTcXVhcmVBcnJvd0Rvd25SaWdodDsKdmFyIGluaXRfc3F1YXJlX2Fycm93X2Rvd25fcmlnaHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1hcnJvdy1kb3duLXJpZ2h0LmpzIigpIHsKICAgIFNxdWFyZUFycm93RG93blJpZ2h0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCA4IDggOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA4djhIOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1hcnJvdy1kb3duLmpzCnZhciBTcXVhcmVBcnJvd0Rvd247CnZhciBpbml0X3NxdWFyZV9hcnJvd19kb3duID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYXJyb3ctZG93bi5qcyIoKSB7CiAgICBTcXVhcmVBcnJvd0Rvd24gPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA4djgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAxMiA0IDQgNC00IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWFycm93LWxlZnQuanMKdmFyIFNxdWFyZUFycm93TGVmdDsKdmFyIGluaXRfc3F1YXJlX2Fycm93X2xlZnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1hcnJvdy1sZWZ0LmpzIigpIHsKICAgIFNxdWFyZUFycm93TGVmdCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDgtNCA0IDQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMkg4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWFycm93LW91dC1kb3duLWxlZnQuanMKdmFyIFNxdWFyZUFycm93T3V0RG93bkxlZnQ7CnZhciBpbml0X3NxdWFyZV9hcnJvd19vdXRfZG93bl9sZWZ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYXJyb3ctb3V0LWRvd24tbGVmdC5qcyIoKSB7CiAgICBTcXVhcmVBcnJvd091dERvd25MZWZ0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMjFoNmEyIDIgMCAwIDAgMi0yVjVhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDIxIDktOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDIxSDN2LTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYXJyb3ctb3V0LWRvd24tcmlnaHQuanMKdmFyIFNxdWFyZUFycm93T3V0RG93blJpZ2h0Owp2YXIgaW5pdF9zcXVhcmVfYXJyb3dfb3V0X2Rvd25fcmlnaHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1hcnJvdy1vdXQtZG93bi1yaWdodC5qcyIoKSB7CiAgICBTcXVhcmVBcnJvd091dERvd25SaWdodCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDExVjVhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxIDIxLTktOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNXY2aC02IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWFycm93LW91dC11cC1sZWZ0LmpzCnZhciBTcXVhcmVBcnJvd091dFVwTGVmdDsKdmFyIGluaXRfc3F1YXJlX2Fycm93X291dF91cF9sZWZ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYXJyb3ctb3V0LXVwLWxlZnQuanMiKCkgewogICAgU3F1YXJlQXJyb3dPdXRVcExlZnQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAzaDZhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDMgOSA5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOVYzaDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYXJyb3ctb3V0LXVwLXJpZ2h0LmpzCnZhciBTcXVhcmVBcnJvd091dFVwUmlnaHQ7CnZhciBpbml0X3NxdWFyZV9hcnJvd19vdXRfdXBfcmlnaHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1hcnJvdy1vdXQtdXAtcmlnaHQuanMiKCkgewogICAgU3F1YXJlQXJyb3dPdXRVcFJpZ2h0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTN2NmEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAzLTkgOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAzaDZ2NiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1hcnJvdy1yaWdodC1lbnRlci5qcwp2YXIgU3F1YXJlQXJyb3dSaWdodEVudGVyOwp2YXIgaW5pdF9zcXVhcmVfYXJyb3dfcmlnaHRfZW50ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1hcnJvdy1yaWdodC1lbnRlci5qcyIoKSB7CiAgICBTcXVhcmVBcnJvd1JpZ2h0RW50ZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCAxNiA0LTQtNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTJoMTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA4VjVhMiAyIDAgMCAxIDItMmgxNGEyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi0zIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWFycm93LXJpZ2h0LWV4aXQuanMKdmFyIFNxdWFyZUFycm93UmlnaHRFeGl0Owp2YXIgaW5pdF9zcXVhcmVfYXJyb3dfcmlnaHRfZXhpdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWFycm93LXJpZ2h0LWV4aXQuanMiKCkgewogICAgU3F1YXJlQXJyb3dSaWdodEV4aXQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMmgxMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAxNiA0LTQtNC00IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMjEgNi4zNDRWNWEyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDE0YTIgMiAwIDAgMCAyLTJ2LTEuMzQ0IiB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1hcnJvdy1yaWdodC5qcwp2YXIgU3F1YXJlQXJyb3dSaWdodDsKdmFyIGluaXRfc3F1YXJlX2Fycm93X3JpZ2h0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYXJyb3ctcmlnaHQuanMiKCkgewogICAgU3F1YXJlQXJyb3dSaWdodCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMiAxNiA0LTQtNC00IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWFycm93LXVwLWxlZnQuanMKdmFyIFNxdWFyZUFycm93VXBMZWZ0Owp2YXIgaW5pdF9zcXVhcmVfYXJyb3dfdXBfbGVmdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWFycm93LXVwLWxlZnQuanMiKCkgewogICAgU3F1YXJlQXJyb3dVcExlZnQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE2VjhoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxNiA4IDgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYXJyb3ctdXAtcmlnaHQuanMKdmFyIFNxdWFyZUFycm93VXBSaWdodDsKdmFyIGluaXRfc3F1YXJlX2Fycm93X3VwX3JpZ2h0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYXJyb3ctdXAtcmlnaHQuanMiKCkgewogICAgU3F1YXJlQXJyb3dVcFJpZ2h0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA4aDh2OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDE2IDgtOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1hcnJvdy11cC5qcwp2YXIgU3F1YXJlQXJyb3dVcDsKdmFyIGluaXRfc3F1YXJlX2Fycm93X3VwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYXJyb3ctdXAuanMiKCkgewogICAgU3F1YXJlQXJyb3dVcCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDEyLTQtNC00IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTZWOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1jZW50ZXJsaW5lLWRhc2hlZC1ob3Jpem9udGFsLmpzCnZhciBTcXVhcmVDZW50ZXJsaW5lRGFzaGVkSG9yaXpvbnRhbDsKdmFyIGluaXRfc3F1YXJlX2NlbnRlcmxpbmVfZGFzaGVkX2hvcml6b250YWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1jZW50ZXJsaW5lLWRhc2hlZC1ob3Jpem9udGFsLmpzIigpIHsKICAgIFNxdWFyZUNlbnRlcmxpbmVEYXNoZWRIb3Jpem9udGFsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAzSDVhMiAyIDAgMCAwLTIgMnYxNGMwIDEuMS45IDIgMiAyaDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgM2gzYTIgMiAwIDAgMSAyIDJ2MTRhMiAyIDAgMCAxLTIgMmgtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE0djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1hc3Rlcmlzay5qcwp2YXIgU3F1YXJlQXN0ZXJpc2s7CnZhciBpbml0X3NxdWFyZV9hc3RlcmlzayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWFzdGVyaXNrLmpzIigpIHsKICAgIFNxdWFyZUFzdGVyaXNrID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOHY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTguNSAxNCA3LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOC41IDEwIDcgNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1ib3R0b20tZGFzaGVkLXNjaXNzb3JzLmpzCnZhciBTcXVhcmVCb3R0b21EYXNoZWRTY2lzc29yczsKdmFyIGluaXRfc3F1YXJlX2JvdHRvbV9kYXNoZWRfc2Npc3NvcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1ib3R0b20tZGFzaGVkLXNjaXNzb3JzLmpzIigpIHsKICAgIFNxdWFyZUJvdHRvbURhc2hlZFNjaXNzb3JzID0gWwogICAgICBbImxpbmUiLCB7IHgxOiAiNSIsIHkxOiAiMyIsIHgyOiAiMTkiLCB5MjogIjMiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMyIsIHkxOiAiNSIsIHgyOiAiMyIsIHkyOiAiMTkiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMjEiLCB5MTogIjUiLCB4MjogIjIxIiwgeTI6ICIxOSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI5IiwgeTE6ICIyMSIsIHgyOiAiMTAiLCB5MjogIjIxIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE0IiwgeTE6ICIyMSIsIHgyOiAiMTUiLCB5MjogIjIxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTSAzIDUgQTIgMiAwIDAgMSA1IDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNIDE5IDMgQTIgMiAwIDAgMSAyMSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTSA1IDIxIEEyIDIgMCAwIDEgMyAxOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0gMjEgMTkgQTIgMiAwIDAgMSAxOSAyMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjguNSIsIGN5OiAiOC41IiwgcjogIjEuNSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI5LjU2MDY2IiwgeTE6ICI5LjU2MDY2IiwgeDI6ICIxMiIsIHkyOiAiMTIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTciLCB5MTogIjE3IiwgeDI6ICIxNC44MiIsIHkyOiAiMTQuODIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI4LjUiLCBjeTogIjE1LjUiLCByOiAiMS41IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjkuNTYwNjYiLCB5MTogIjE0LjQzOTM0IiwgeDI6ICIxNyIsIHkyOiAiNyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1jZW50ZXJsaW5lLWRhc2hlZC12ZXJ0aWNhbC5qcwp2YXIgU3F1YXJlQ2VudGVybGluZURhc2hlZFZlcnRpY2FsOwp2YXIgaW5pdF9zcXVhcmVfY2VudGVybGluZV9kYXNoZWRfdmVydGljYWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1jZW50ZXJsaW5lLWRhc2hlZC12ZXJ0aWNhbC5qcyIoKSB7CiAgICBTcXVhcmVDZW50ZXJsaW5lRGFzaGVkVmVydGljYWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA4VjVhMiAyIDAgMCAwLTItMkg1YTIgMiAwIDAgMC0yIDJ2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNnYzYTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTJIMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMkg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEyaC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDEyaC0yIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWNoYXJ0LWdhbnR0LmpzCnZhciBTcXVhcmVDaGFydEdhbnR0Owp2YXIgaW5pdF9zcXVhcmVfY2hhcnRfZ2FudHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1jaGFydC1nYW50dC5qcyIoKSB7CiAgICBTcXVhcmVDaGFydEdhbnR0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA4aDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDE2aDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtY2hlY2stYmlnLmpzCnZhciBTcXVhcmVDaGVja0JpZzsKdmFyIGluaXRfc3F1YXJlX2NoZWNrX2JpZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWNoZWNrLWJpZy5qcyIoKSB7CiAgICBTcXVhcmVDaGVja0JpZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEwLjY1NlYxOWEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMTIuMzQ0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTEgMyAzTDIyIDQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtY2hlY2suanMKdmFyIFNxdWFyZUNoZWNrOwp2YXIgaW5pdF9zcXVhcmVfY2hlY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1jaGVjay5qcyIoKSB7CiAgICBTcXVhcmVDaGVjayA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTIgMiAyIDQtNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1jaGV2cm9uLWRvd24uanMKdmFyIFNxdWFyZUNoZXZyb25Eb3duOwp2YXIgaW5pdF9zcXVhcmVfY2hldnJvbl9kb3duID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtY2hldnJvbi1kb3duLmpzIigpIHsKICAgIFNxdWFyZUNoZXZyb25Eb3duID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTAtNCA0LTQtNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1jaGV2cm9uLWxlZnQuanMKdmFyIFNxdWFyZUNoZXZyb25MZWZ0Owp2YXIgaW5pdF9zcXVhcmVfY2hldnJvbl9sZWZ0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtY2hldnJvbi1sZWZ0LmpzIigpIHsKICAgIFNxdWFyZUNoZXZyb25MZWZ0ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgMTYtNC00IDQtNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1jaGV2cm9uLXJpZ2h0LmpzCnZhciBTcXVhcmVDaGV2cm9uUmlnaHQ7CnZhciBpbml0X3NxdWFyZV9jaGV2cm9uX3JpZ2h0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtY2hldnJvbi1yaWdodC5qcyIoKSB7CiAgICBTcXVhcmVDaGV2cm9uUmlnaHQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCA4IDQgNC00IDQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtY2hldnJvbi11cC5qcwp2YXIgU3F1YXJlQ2hldnJvblVwOwp2YXIgaW5pdF9zcXVhcmVfY2hldnJvbl91cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWNoZXZyb24tdXAuanMiKCkgewogICAgU3F1YXJlQ2hldnJvblVwID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAxNCA0LTQgNCA0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWNvZGUuanMKdmFyIFNxdWFyZUNvZGU7CnZhciBpbml0X3NxdWFyZV9jb2RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtY29kZS5qcyIoKSB7CiAgICBTcXVhcmVDb2RlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTAgOS0zIDMgMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDE1IDMtMy0zLTMiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIzIiwgeTogIjMiLCB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtZGFzaGVkLWJvdHRvbS1jb2RlLmpzCnZhciBTcXVhcmVEYXNoZWRCb3R0b21Db2RlOwp2YXIgaW5pdF9zcXVhcmVfZGFzaGVkX2JvdHRvbV9jb2RlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtZGFzaGVkLWJvdHRvbS1jb2RlLmpzIigpIHsKICAgIFNxdWFyZURhc2hlZEJvdHRvbUNvZGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA5LjUgOCAxMmwyIDIuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAyMWgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDkuNSAyIDIuNS0yIDIuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDIxYTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDE0YTIgMiAwIDAgMSAyIDJ2MTRhMiAyIDAgMCAxLTIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDIxaDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtZGFzaGVkLWJvdHRvbS5qcwp2YXIgU3F1YXJlRGFzaGVkQm90dG9tOwp2YXIgaW5pdF9zcXVhcmVfZGFzaGVkX2JvdHRvbSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWRhc2hlZC1ib3R0b20uanMiKCkgewogICAgU3F1YXJlRGFzaGVkQm90dG9tID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmgxNGEyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAyMWgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDIxaDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtZGFzaGVkLWthbmJhbi5qcwp2YXIgU3F1YXJlRGFzaGVkS2FuYmFuOwp2YXIgaW5pdF9zcXVhcmVfZGFzaGVkX2thbmJhbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWRhc2hlZC1rYW5iYW4uanMiKCkgewogICAgU3F1YXJlRGFzaGVkS2FuYmFuID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA3djciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgN3Y0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDd2OSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDNhMiAyIDAgMCAwLTIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDNoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAzaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgM2EyIDIgMCAwIDEgMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDl2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNHYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE5YTIgMiAwIDAgMS0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjFoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDIxaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMWEyIDIgMCAwIDEtMi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTR2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDl2MSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1kYXNoZWQtbW91c2UtcG9pbnRlci5qcwp2YXIgU3F1YXJlRGFzaGVkTW91c2VQb2ludGVyOwp2YXIgaW5pdF9zcXVhcmVfZGFzaGVkX21vdXNlX3BvaW50ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1kYXNoZWQtbW91c2UtcG9pbnRlci5qcyIoKSB7CiAgICBTcXVhcmVEYXNoZWRNb3VzZVBvaW50ZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMi4wMzQgMTIuNjgxYS40OTguNDk4IDAgMCAxIC42NDctLjY0N2w5IDMuNWEuNS41IDAgMCAxLS4wMzMuOTQzbC0zLjQ0NCAxLjA2OGExIDEgMCAwIDAtLjY2LjY2bC0xLjA2NyAzLjQ0M2EuNS41IDAgMCAxLS45NDMuMDMzeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDNhMiAyIDAgMCAwLTIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAzYTIgMiAwIDAgMSAyIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMWEyIDIgMCAwIDEtMi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgM2gxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMjFoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAzaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA5djEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgOXYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTR2MSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1kYXNoZWQtdG9wLXNvbGlkLmpzCnZhciBTcXVhcmVEYXNoZWRUb3BTb2xpZDsKdmFyIGluaXRfc3F1YXJlX2Rhc2hlZF90b3Bfc29saWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1kYXNoZWQtdG9wLXNvbGlkLmpzIigpIHsKICAgIFNxdWFyZURhc2hlZFRvcFNvbGlkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjFoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNHYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE5YTIgMiAwIDAgMS0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgOXYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTR2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDVhMiAyIDAgMCAxIDItMmgxNGEyIDIgMCAwIDEgMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOXYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMjFhMiAyIDAgMCAxLTItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDIxaDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtZGFzaGVkLmpzCnZhciBTcXVhcmVEYXNoZWQ7CnZhciBpbml0X3NxdWFyZV9kYXNoZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1kYXNoZWQuanMiKCkgewogICAgU3F1YXJlRGFzaGVkID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAzYTIgMiAwIDAgMC0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgM2EyIDIgMCAwIDEgMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE5YTIgMiAwIDAgMS0yIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAyMWEyIDIgMCAwIDEtMi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgM2gxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMjFoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAzaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjFoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDl2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA5djEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxNHYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE0djEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtZGl2aWRlLmpzCnZhciBTcXVhcmVEaXZpZGU7CnZhciBpbml0X3NxdWFyZV9kaXZpZGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1kaXZpZGUuanMiKCkgewogICAgU3F1YXJlRGl2aWRlID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiOCIsIHgyOiAiMTYiLCB5MTogIjEyIiwgeTI6ICIxMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTIiLCB5MTogIjE2IiwgeTI6ICIxNiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTIiLCB5MTogIjgiLCB5MjogIjgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtZG90LmpzCnZhciBTcXVhcmVEb3Q7CnZhciBpbml0X3NxdWFyZV9kb3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1kb3QuanMiKCkgewogICAgU3F1YXJlRG90ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1lcXVhbC5qcwp2YXIgU3F1YXJlRXF1YWw7CnZhciBpbml0X3NxdWFyZV9lcXVhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWVxdWFsLmpzIigpIHsKICAgIFNxdWFyZUVxdWFsID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMGgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE0aDEwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWZ1bmN0aW9uLmpzCnZhciBTcXVhcmVGdW5jdGlvbjsKdmFyIGluaXRfc3F1YXJlX2Z1bmN0aW9uID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtZnVuY3Rpb24uanMiKCkgewogICAgU3F1YXJlRnVuY3Rpb24gPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE3YzIgMCAyLjgtMSAyLjgtMi44VjEwYzAtMiAxLTMuMyAzLjItMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDExLjJoNS43IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWthbmJhbi5qcwp2YXIgU3F1YXJlS2FuYmFuOwp2YXIgaW5pdF9zcXVhcmVfa2FuYmFuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUta2FuYmFuLmpzIigpIHsKICAgIFNxdWFyZUthbmJhbiA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggN3Y3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA3djkiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtbGlicmFyeS5qcwp2YXIgU3F1YXJlTGlicmFyeTsKdmFyIGluaXRfc3F1YXJlX2xpYnJhcnkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1saWJyYXJ5LmpzIigpIHsKICAgIFNxdWFyZUxpYnJhcnkgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDd2MTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgN3YxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA3IDIgMTAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtbS5qcwp2YXIgU3F1YXJlTTsKdmFyIGluaXRfc3F1YXJlX20gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1tLmpzIigpIHsKICAgIFNxdWFyZU0gPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTggMTZWOC41YS41LjUgMCAwIDEgLjktLjNsMi43IDMuNTk5YS41LjUgMCAwIDAgLjggMGwyLjctMy42YS41LjUgMCAwIDEgLjkuM1YxNiIgfQogICAgICBdLAogICAgICBbInJlY3QiLCB7IHg6ICIzIiwgeTogIjMiLCB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtbWVudS5qcwp2YXIgU3F1YXJlTWVudTsKdmFyIGluaXRfc3F1YXJlX21lbnUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1tZW51LmpzIigpIHsKICAgIFNxdWFyZU1lbnUgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDhoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMmgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE2aDEwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLW1pbnVzLmpzCnZhciBTcXVhcmVNaW51czsKdmFyIGluaXRfc3F1YXJlX21pbnVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtbWludXMuanMiKCkgewogICAgU3F1YXJlTWludXMgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEyaDgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtbW91c2UtcG9pbnRlci5qcwp2YXIgU3F1YXJlTW91c2VQb2ludGVyOwp2YXIgaW5pdF9zcXVhcmVfbW91c2VfcG9pbnRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLW1vdXNlLXBvaW50ZXIuanMiKCkgewogICAgU3F1YXJlTW91c2VQb2ludGVyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTIuMDM0IDEyLjY4MWEuNDk4LjQ5OCAwIDAgMSAuNjQ3LS42NDdsOSAzLjVhLjUuNSAwIDAgMS0uMDMzLjk0M2wtMy40NDQgMS4wNjhhMSAxIDAgMCAwLS42Ni42NmwtMS4wNjcgMy40NDNhLjUuNSAwIDAgMS0uOTQzLjAzM3oiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTFWNWEyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtcGFya2luZy1vZmYuanMKdmFyIFNxdWFyZVBhcmtpbmdPZmY7CnZhciBpbml0X3NxdWFyZV9wYXJraW5nX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXBhcmtpbmctb2ZmLmpzIigpIHsKICAgIFNxdWFyZVBhcmtpbmdPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0zLjYgMy42QTIgMiAwIDAgMSA1IDNoMTRhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEtLjU5IDEuNDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA4LjdWMTlhMiAyIDAgMCAwIDIgMmgxMC4zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxM2EzIDMgMCAxIDAgMC02SDl2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE3di0yLjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtcGFya2luZy5qcwp2YXIgU3F1YXJlUGFya2luZzsKdmFyIGluaXRfc3F1YXJlX3BhcmtpbmcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1wYXJraW5nLmpzIigpIHsKICAgIFNxdWFyZVBhcmtpbmcgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDE3VjdoNGEzIDMgMCAwIDEgMCA2SDkiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtcGF1c2UuanMKdmFyIFNxdWFyZVBhdXNlOwp2YXIgaW5pdF9zcXVhcmVfcGF1c2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1wYXVzZS5qcyIoKSB7CiAgICBTcXVhcmVQYXVzZSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEwIiwgeDI6ICIxMCIsIHkxOiAiMTUiLCB5MjogIjkiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTQiLCB4MjogIjE0IiwgeTE6ICIxNSIsIHkyOiAiOSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1wZW4uanMKdmFyIFNxdWFyZVBlbjsKdmFyIGluaXRfc3F1YXJlX3BlbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXBlbi5qcyIoKSB7CiAgICBTcXVhcmVQZW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAzSDVhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDE0YTIgMiAwIDAgMCAyLTJ2LTciIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTguMzc1IDIuNjI1YTEgMSAwIDAgMSAzIDNsLTkuMDEzIDkuMDE0YTIgMiAwIDAgMS0uODUzLjUwNWwtMi44NzMuODRhLjUuNSAwIDAgMS0uNjItLjYybC44NC0yLjg3M2EyIDIgMCAwIDEgLjUwNi0uODUyeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1wZXJjZW50LmpzCnZhciBTcXVhcmVQZXJjZW50Owp2YXIgaW5pdF9zcXVhcmVfcGVyY2VudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXBlcmNlbnQuanMiKCkgewogICAgU3F1YXJlUGVyY2VudCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDktNiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgOWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMTVoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXBpLmpzCnZhciBTcXVhcmVQaTsKdmFyIGluaXRfc3F1YXJlX3BpID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtcGkuanMiKCkgewogICAgU3F1YXJlUGkgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDdoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgN3YxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxN2EyIDIgMCAwIDEtMi0yVjciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtcGlsY3Jvdy5qcwp2YXIgU3F1YXJlUGlsY3JvdzsKdmFyIGluaXRfc3F1YXJlX3BpbGNyb3cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1waWxjcm93LmpzIigpIHsKICAgIFNxdWFyZVBpbGNyb3cgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMkg5LjVhMi41IDIuNSAwIDAgMSAwLTVIMTciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgN3YxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA3djEwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXBsYXkuanMKdmFyIFNxdWFyZVBsYXk7CnZhciBpbml0X3NxdWFyZV9wbGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtcGxheS5qcyIoKSB7CiAgICBTcXVhcmVQbGF5ID0gWwogICAgICBbInJlY3QiLCB7IHg6ICIzIiwgeTogIjMiLCB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCByeDogIjIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOSA5LjAwM2ExIDEgMCAwIDEgMS41MTctLjg1OWw0Ljk5NyAyLjk5N2ExIDEgMCAwIDEgMCAxLjcxOGwtNC45OTcgMi45OTdBMSAxIDAgMCAxIDkgMTQuOTk2eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1wbHVzLmpzCnZhciBTcXVhcmVQbHVzOwp2YXIgaW5pdF9zcXVhcmVfcGx1cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXBsdXMuanMiKCkgewogICAgU3F1YXJlUGx1cyA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTJoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA4djgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtcG93ZXIuanMKdmFyIFNxdWFyZVBvd2VyOwp2YXIgaW5pdF9zcXVhcmVfcG93ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1wb3dlci5qcyIoKSB7CiAgICBTcXVhcmVQb3dlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDd2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03Ljk5OCA5LjAwM2E1IDUgMCAxIDAgOC0uMDA1IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICIzIiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4Iiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXJhZGljYWwuanMKdmFyIFNxdWFyZVJhZGljYWw7CnZhciBpbml0X3NxdWFyZV9yYWRpY2FsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtcmFkaWNhbC5qcyIoKSB7CiAgICBTcXVhcmVSYWRpY2FsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMmgybDIgNSAyLTEwaDQiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIzIiwgeTogIjMiLCB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtcm91bmQtY29ybmVyLmpzCnZhciBTcXVhcmVSb3VuZENvcm5lcjsKdmFyIGluaXRfc3F1YXJlX3JvdW5kX2Nvcm5lciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXJvdW5kLWNvcm5lci5qcyIoKSB7CiAgICBTcXVhcmVSb3VuZENvcm5lciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDExYTggOCAwIDAgMC04LTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1zY2lzc29ycy5qcwp2YXIgU3F1YXJlU2Npc3NvcnM7CnZhciBpbml0X3NxdWFyZV9zY2lzc29ycyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXNjaXNzb3JzLmpzIigpIHsKICAgIFNxdWFyZVNjaXNzb3JzID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI4LjUiLCBjeTogIjguNSIsIHI6ICIxLjUiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiOS41NjA2NiIsIHkxOiAiOS41NjA2NiIsIHgyOiAiMTIiLCB5MjogIjEyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE3IiwgeTE6ICIxNyIsIHgyOiAiMTQuODIiLCB5MjogIjE0LjgyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOC41IiwgY3k6ICIxNS41IiwgcjogIjEuNSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI5LjU2MDY2IiwgeTE6ICIxNC40MzkzNCIsIHgyOiAiMTciLCB5MjogIjciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtc2lnbWEuanMKdmFyIFNxdWFyZVNpZ21hOwp2YXIgaW5pdF9zcXVhcmVfc2lnbWEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1zaWdtYS5qcyIoKSB7CiAgICBTcXVhcmVTaWdtYSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDguOVY3SDhsNCA1LTQgNWg4di0xLjkiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtc2xhc2guanMKdmFyIFNxdWFyZVNsYXNoOwp2YXIgaW5pdF9zcXVhcmVfc2xhc2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1zbGFzaC5qcyIoKSB7CiAgICBTcXVhcmVTbGFzaCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjkiLCB4MjogIjE1IiwgeTE6ICIxNSIsIHkyOiAiOSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1zcGxpdC1ob3Jpem9udGFsLmpzCnZhciBTcXVhcmVTcGxpdEhvcml6b250YWw7CnZhciBpbml0X3NxdWFyZV9zcGxpdF9ob3Jpem9udGFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtc3BsaXQtaG9yaXpvbnRhbC5qcyIoKSB7CiAgICBTcXVhcmVTcGxpdEhvcml6b250YWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE5SDVjLTEgMC0yLTEtMi0yVjdjMC0xIDEtMiAyLTJoMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA1aDNjMSAwIDIgMSAyIDJ2MTBjMCAxLTEgMi0yIDJoLTMiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTIiLCB4MjogIjEyIiwgeTE6ICI0IiwgeTI6ICIyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1zcGxpdC12ZXJ0aWNhbC5qcwp2YXIgU3F1YXJlU3BsaXRWZXJ0aWNhbDsKdmFyIGluaXRfc3F1YXJlX3NwbGl0X3ZlcnRpY2FsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtc3BsaXQtdmVydGljYWwuanMiKCkgewogICAgU3F1YXJlU3BsaXRWZXJ0aWNhbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgOFY1YzAtMSAxLTIgMi0yaDEwYzEgMCAyIDEgMiAydjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMTZ2M2MwIDEtMSAyLTIgMkg3Yy0xIDAtMi0xLTItMnYtMyIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI0IiwgeDI6ICIyMCIsIHkxOiAiMTIiLCB5MjogIjEyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXNxdWFyZS5qcwp2YXIgU3F1YXJlU3F1YXJlOwp2YXIgaW5pdF9zcXVhcmVfc3F1YXJlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtc3F1YXJlLmpzIigpIHsKICAgIFNxdWFyZVNxdWFyZSA9IFsKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICIzIiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiOCIsIHk6ICI4Iiwgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiOCIsIHJ4OiAiMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1zdGFjay5qcwp2YXIgU3F1YXJlU3RhY2s7CnZhciBpbml0X3NxdWFyZV9zdGFjayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXN0YWNrLmpzIigpIHsKICAgIFNxdWFyZVN0YWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMGMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDRjMS4xIDAgMiAuOSAyIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTZjLTEuMSAwLTItLjktMi0ydi00YzAtMS4xLjktMiAyLTJoNGMxLjEgMCAyIC45IDIgMiIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICI4IiwgaGVpZ2h0OiAiOCIsIHg6ICIxNCIsIHk6ICIxNCIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1zdGFyLmpzCnZhciBTcXVhcmVTdGFyOwp2YXIgaW5pdF9zcXVhcmVfc3RhciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXN0YXIuanMiKCkgewogICAgU3F1YXJlU3RhciA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTExLjAzNSA3LjY5YTEgMSAwIDAgMSAxLjkwOS4wMjRsLjczNyAxLjQ1MmExIDEgMCAwIDAgLjczNy41MzVsMS42MzQuMjU2YTEgMSAwIDAgMSAuNTg4IDEuODA2bC0xLjE3MiAxLjE2OGExIDEgMCAwIDAtLjI4Mi44NjZsLjI1OSAxLjYxM2ExIDEgMCAwIDEtMS41NDEgMS4xMzRsLTEuNDY1LS43NWExIDEgMCAwIDAtLjkxMiAwbC0xLjQ2NS43NWExIDEgMCAwIDEtMS41MzktMS4xMzNsLjI1OC0xLjYxM2ExIDEgMCAwIDAtLjI4Mi0uODY2bC0xLjE1Ni0xLjE1M2ExIDEgMCAwIDEgLjU3Mi0xLjgyMmwxLjYzMy0uMjU2YTEgMSAwIDAgMCAuNzM3LS41MzV6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMyIsIHk6ICIzIiwgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4Iiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXN0b3AuanMKdmFyIFNxdWFyZVN0b3A7CnZhciBpbml0X3NxdWFyZV9zdG9wID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtc3RvcC5qcyIoKSB7CiAgICBTcXVhcmVTdG9wID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICI5IiwgeTogIjkiLCB3aWR0aDogIjYiLCBoZWlnaHQ6ICI2Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXVzZXItcm91bmQuanMKdmFyIFNxdWFyZVVzZXJSb3VuZDsKdmFyIGluaXRfc3F1YXJlX3VzZXJfcm91bmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS11c2VyLXJvdW5kLmpzIigpIHsKICAgIFNxdWFyZVVzZXJSb3VuZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDIxYTYgNiAwIDAgMC0xMiAwIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjExIiwgcjogIjQiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtdGVybWluYWwuanMKdmFyIFNxdWFyZVRlcm1pbmFsOwp2YXIgaW5pdF9zcXVhcmVfdGVybWluYWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS10ZXJtaW5hbC5qcyIoKSB7CiAgICBTcXVhcmVUZXJtaW5hbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTcgMTEgMi0yLTItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMSAxM2g0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiwgcnk6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXVzZXIuanMKdmFyIFNxdWFyZVVzZXI7CnZhciBpbml0X3NxdWFyZV91c2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtdXNlci5qcyIoKSB7CiAgICBTcXVhcmVVc2VyID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTAiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIxdi0yYTIgMiAwIDAgMSAyLTJoNmEyIDIgMCAwIDEgMiAydjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUteC5qcwp2YXIgU3F1YXJlWDsKdmFyIGluaXRfc3F1YXJlX3ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS14LmpzIigpIHsKICAgIFNxdWFyZVggPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA5LTYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDkgNiA2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLmpzCnZhciBTcXVhcmU7CnZhciBpbml0X3NxdWFyZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLmpzIigpIHsKICAgIFNxdWFyZSA9IFtbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlcy1leGNsdWRlLmpzCnZhciBTcXVhcmVzRXhjbHVkZTsKdmFyIGluaXRfc3F1YXJlc19leGNsdWRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmVzLWV4Y2x1ZGUuanMiKCkgewogICAgU3F1YXJlc0V4Y2x1ZGUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNiAxMnYyYTIgMiAwIDAgMS0yIDJIOWExIDEgMCAwIDAtMSAxdjNhMiAyIDAgMCAwIDIgMmgxMGEyIDIgMCAwIDAgMi0yVjEwYTIgMiAwIDAgMC0yLTJoMCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDE2YTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDEwYTIgMiAwIDAgMSAyIDJ2M2ExIDEgMCAwIDEtMSAxaC01YTIgMiAwIDAgMC0yIDJ2MiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZXMtaW50ZXJzZWN0LmpzCnZhciBTcXVhcmVzSW50ZXJzZWN0Owp2YXIgaW5pdF9zcXVhcmVzX2ludGVyc2VjdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlcy1pbnRlcnNlY3QuanMiKCkgewogICAgU3F1YXJlc0ludGVyc2VjdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDIyYTIgMiAwIDAgMS0yLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMmEyIDIgMCAwIDEgMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDIyaC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTBWOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDRhMiAyIDAgMCAxIDItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCA4YTIgMiAwIDAgMSAyIDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTR2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAyMGEyIDIgMCAwIDEtMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTZhMiAyIDAgMCAxLTItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEwYTIgMiAwIDAgMSAyLTJoNWExIDEgMCAwIDEgMSAxdjVhMiAyIDAgMCAxLTIgMkg5YTEgMSAwIDAgMS0xLTF6IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMmgyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlcy1zdWJ0cmFjdC5qcwp2YXIgU3F1YXJlc1N1YnRyYWN0Owp2YXIgaW5pdF9zcXVhcmVzX3N1YnRyYWN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmVzLXN1YnRyYWN0LmpzIigpIHsKICAgIFNxdWFyZXNTdWJ0cmFjdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDIyYTIgMiAwIDAgMS0yLTIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMjJoLTIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTYgNGEyIDIgMCAwIDAtMi0ySDRhMiAyIDAgMCAwLTIgMnYxMGEyIDIgMCAwIDAgMiAyaDNhMSAxIDAgMCAwIDEtMXYtNWEyIDIgMCAwIDEgMi0yaDVhMSAxIDAgMCAwIDEtMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgOGEyIDIgMCAwIDEgMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE0djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMjBhMiAyIDAgMCAxLTIgMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZXMtdW5pdGUuanMKdmFyIFNxdWFyZXNVbml0ZTsKdmFyIGluaXRfc3F1YXJlc191bml0ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlcy11bml0ZS5qcyIoKSB7CiAgICBTcXVhcmVzVW5pdGUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk00IDE2YTIgMiAwIDAgMS0yLTJWNGEyIDIgMCAwIDEgMi0yaDEwYTIgMiAwIDAgMSAyIDJ2M2ExIDEgMCAwIDAgMSAxaDNhMiAyIDAgMCAxIDIgMnYxMGEyIDIgMCAwIDEtMiAySDEwYTIgMiAwIDAgMS0yLTJ2LTNhMSAxIDAgMCAwLTEtMXoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVpcmNsZS1kYXNoZWQuanMKdmFyIFNxdWlyY2xlRGFzaGVkOwp2YXIgaW5pdF9zcXVpcmNsZV9kYXNoZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWlyY2xlLWRhc2hlZC5qcyIoKSB7CiAgICBTcXVpcmNsZURhc2hlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEzLjc3IDMuMDQzYTM0IDM0IDAgMCAwLTMuNTQgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMy43NzEgMjAuOTU2YTMzIDMzIDAgMCAxLTMuNTQxLjAwMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC4xOCAxNy43NGMtLjUxIDEuMTUtMS4yOSAxLjkzLTIuNDM5IDIuNDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAuMTggNi4yNTljLS41MS0xLjE0OC0xLjI5MS0xLjkyOS0yLjQ0LTIuNDM4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwLjk1NyAxMC4yM2EzMyAzMyAwIDAgMSAwIDMuNTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMy4wNDMgMTAuMjNhMzQgMzQgMCAwIDAgLjAwMSAzLjU0MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjI2IDIwLjE3OWMtMS4xNS0uNTA4LTEuOTMtMS4yOS0yLjQ0LTIuNDM4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMjYgMy44MmMtMS4xNDkuNTEtMS45MyAxLjI5MS0yLjQ0IDIuNDQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVpcmNsZS5qcwp2YXIgU3F1aXJjbGU7CnZhciBpbml0X3NxdWlyY2xlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVpcmNsZS5qcyIoKSB7CiAgICBTcXVpcmNsZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDNjNy4yIDAgOSAxLjggOSA5cy0xLjggOS05IDktOS0xLjgtOS05IDEuOC05IDktOSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N0YW1wLmpzCnZhciBTdGFtcDsKdmFyIGluaXRfc3RhbXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N0YW1wLmpzIigpIHsKICAgIFN0YW1wID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTNWOC41QzE0IDcgMTUgNyAxNSA1YTMgMyAwIDAgMC02IDBjMCAyIDEgMiAxIDMuNVYxMyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAxNS41YTIuNSAyLjUgMCAwIDAtMi41LTIuNWgtMTFBMi41IDIuNSAwIDAgMCA0IDE1LjVWMTdhMSAxIDAgMCAwIDEgMWgxNGExIDEgMCAwIDAgMS0xeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDIyaDE0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1aXJyZWwuanMKdmFyIFNxdWlycmVsOwp2YXIgaW5pdF9zcXVpcnJlbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1aXJyZWwuanMiKCkgewogICAgU3F1aXJyZWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNS4yMzYgMjJhMyAzIDAgMCAwLTIuMi01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDIwYTMgMyAwIDAgMSAzLTNoMWEyIDIgMCAwIDAgMi0ydi0yYTQgNCAwIDAgMC00LTRWNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxM2guMDEiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTggNmE0IDQgMCAwIDAtNCA0IDcgNyAwIDAgMC03IDdjMC01IDQtNSA0LTEwLjVhNC41IDQuNSAwIDEgMC05IDAgMi41IDIuNSAwIDAgMCA1IDBDNyAxMCAzIDExIDMgMTdjMCAyLjggMi4yIDUgNSA1aDEwIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3Rhci1oYWxmLmpzCnZhciBTdGFySGFsZjsKdmFyIGluaXRfc3Rhcl9oYWxmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdGFyLWhhbGYuanMiKCkgewogICAgU3RhckhhbGYgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMiAxOC4zMzhhMi4xIDIuMSAwIDAgMC0uOTg3LjI0NEw2LjM5NiAyMS4wMWEuNTMuNTMgMCAwIDEtLjc3LS41NmwuODgxLTUuMTM5YTIuMTIgMi4xMiAwIDAgMC0uNjExLTEuODc5TDIuMTYgOS43OTVhLjUzLjUzIDAgMCAxIC4yOTQtLjkwNmw1LjE2NS0uNzU1YTIuMTIgMi4xMiAwIDAgMCAxLjU5Ny0xLjE2bDIuMzA5LTQuNjc5QS41My41MyAwIDAgMSAxMiAyIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3Rhci1vZmYuanMKdmFyIFN0YXJPZmY7CnZhciBpbml0X3N0YXJfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdGFyLW9mZi5qcyIoKSB7CiAgICBTdGFyT2ZmID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTAuMzQ0IDQuNjg4IDEuMTgxLTIuMzkzYS41My41MyAwIDAgMSAuOTUgMGwyLjMxIDQuNjc5YTIuMTIgMi4xMiAwIDAgMCAxLjU5NSAxLjE2bDUuMTY2Ljc1NmEuNTMuNTMgMCAwIDEgLjI5NC45MDRsLTMuMjM3IDMuMTUyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTE3Ljk0NSAxNy45NDUuNDMgMi41MDVhLjUzLjUzIDAgMCAxLS43NzEuNTZsLTQuNjE4LTIuNDI4YTIuMTIgMi4xMiAwIDAgMC0xLjk3MyAwTDYuMzk2IDIxLjAxYS41My41MyAwIDAgMS0uNzctLjU2bC44ODEtNS4xMzlhMi4xMiAyLjEyIDAgMCAwLS42MTEtMS44NzlMMi4xNiA5Ljc5NWEuNTMuNTMgMCAwIDEgLjI5NC0uOTA2bDUuMTY1LS43NTVhOCA4IDAgMCAwIC40LS4wOTkiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3Rhci5qcwp2YXIgU3RhcjsKdmFyIGluaXRfc3RhciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3Rhci5qcyIoKSB7CiAgICBTdGFyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEuNTI1IDIuMjk1YS41My41MyAwIDAgMSAuOTUgMGwyLjMxIDQuNjc5YTIuMTIzIDIuMTIzIDAgMCAwIDEuNTk1IDEuMTZsNS4xNjYuNzU2YS41My41MyAwIDAgMSAuMjk0LjkwNGwtMy43MzYgMy42MzhhMi4xMjMgMi4xMjMgMCAwIDAtLjYxMSAxLjg3OGwuODgyIDUuMTRhLjUzLjUzIDAgMCAxLS43NzEuNTZsLTQuNjE4LTIuNDI4YTIuMTIyIDIuMTIyIDAgMCAwLTEuOTczIDBMNi4zOTYgMjEuMDFhLjUzLjUzIDAgMCAxLS43Ny0uNTZsLjg4MS01LjEzOWEyLjEyMiAyLjEyMiAwIDAgMC0uNjExLTEuODc5TDIuMTYgOS43OTVhLjUzLjUzIDAgMCAxIC4yOTQtLjkwNmw1LjE2NS0uNzU1YTIuMTIyIDIuMTIyIDAgMCAwIDEuNTk3LTEuMTZ6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3RlcC1iYWNrLmpzCnZhciBTdGVwQmFjazsKdmFyIGluaXRfc3RlcF9iYWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdGVwLWJhY2suanMiKCkgewogICAgU3RlcEJhY2sgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMy45NzEgNC4yODVBMiAyIDAgMCAxIDE3IDZ2MTJhMiAyIDAgMCAxLTMuMDI5IDEuNzE1bC05Ljk5Ny01Ljk5OGEyIDIgMCAwIDEtLjAwMy0zLjQzMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMjBWNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N0ZXAtZm9yd2FyZC5qcwp2YXIgU3RlcEZvcndhcmQ7CnZhciBpbml0X3N0ZXBfZm9yd2FyZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3RlcC1mb3J3YXJkLmpzIigpIHsKICAgIFN0ZXBGb3J3YXJkID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk0xMC4wMjkgNC4yODVBMiAyIDAgMCAwIDcgNnYxMmEyIDIgMCAwIDAgMy4wMjkgMS43MTVsOS45OTctNS45OThhMiAyIDAgMCAwIC4wMDMtMy40MzJ6IiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDR2MTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdGV0aG9zY29wZS5qcwp2YXIgU3RldGhvc2NvcGU7CnZhciBpbml0X3N0ZXRob3Njb3BlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdGV0aG9zY29wZS5qcyIoKSB7CiAgICBTdGV0aG9zY29wZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDNINGEyIDIgMCAwIDAtMiAydjRhNiA2IDAgMCAwIDEyIDBWNWEyIDIgMCAwIDAtMi0yaC0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTVhNiA2IDAgMCAwIDEyIDB2LTMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIyMCIsIGN5OiAiMTAiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N0aWNrZXIuanMKdmFyIFN0aWNrZXI7CnZhciBpbml0X3N0aWNrZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N0aWNrZXIuanMiKCkgewogICAgU3RpY2tlciA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxIDlhMi40IDIuNCAwIDAgMC0uNzA2LTEuNzA2bC0zLjU4OC0zLjU4OEEyLjQgMi40IDAgMCAwIDE1IDNINWEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoMTRhMiAyIDAgMCAwIDItMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgM3Y1YTEgMSAwIDAgMCAxIDFoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEzaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxM2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTZzLjggMSAyIDFjMS4zIDAgMi0xIDItMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N0aWNreS1ub3RlLmpzCnZhciBTdGlja3lOb3RlOwp2YXIgaW5pdF9zdGlja3lfbm90ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3RpY2t5LW5vdGUuanMiKCkgewogICAgU3RpY2t5Tm90ZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIxIDlhMi40IDIuNCAwIDAgMC0uNzA2LTEuNzA2bC0zLjU4OC0zLjU4OEEyLjQgMi40IDAgMCAwIDE1IDNINWEyIDIgMCAwIDAtMiAydjE0YTIgMiAwIDAgMCAyIDJoMTRhMiAyIDAgMCAwIDItMnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgM3Y1YTEgMSAwIDAgMCAxIDFoNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N0b25lLmpzCnZhciBTdG9uZTsKdmFyIGluaXRfc3RvbmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N0b25lLmpzIigpIHsKICAgIFN0b25lID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEuMjY0IDIuMjA1QTQgNCAwIDAgMCA2LjQyIDQuMjExbC00IDhhNCA0IDAgMCAwIDEuMzU5IDUuMTE3bDYgNGE0IDQgMCAwIDAgNC40MzggMGw2LTRhNCA0IDAgMCAwIDEuNTc2LTQuNTkybC0yLTZhNCA0IDAgMCAwLTIuNTMtMi41M3oiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEuOTkgMjIgMTQgMTJsNy44MjIgMy4xODQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTIgOC40NyAyLjMwMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N0b3JlLmpzCnZhciBTdG9yZTsKdmFyIGluaXRfc3RvcmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N0b3JlLmpzIigpIHsKICAgIFN0b3JlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMjF2LTVhMSAxIDAgMCAwLTEtMWgtNGExIDEgMCAwIDAtMSAxdjUiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTcuNzc0IDEwLjMxYTEuMTIgMS4xMiAwIDAgMC0xLjU0OSAwIDIuNSAyLjUgMCAwIDEtMy40NTEgMCAxLjEyIDEuMTIgMCAwIDAtMS41NDggMCAyLjUgMi41IDAgMCAxLTMuNDUyIDAgMS4xMiAxLjEyIDAgMCAwLTEuNTQ5IDAgMi41IDIuNSAwIDAgMS0zLjc3LTMuMjQ4bDIuODg5LTQuMTg0QTIgMiAwIDAgMSA3IDJoMTBhMiAyIDAgMCAxIDEuNjUzLjg3M2wyLjg5NSA0LjE5MmEyLjUgMi41IDAgMCAxLTMuNzc0IDMuMjQ0IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTAuOTVWMTlhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0ydi04LjA1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3RyZXRjaC1ob3Jpem9udGFsLmpzCnZhciBTdHJldGNoSG9yaXpvbnRhbDsKdmFyIGluaXRfc3RyZXRjaF9ob3Jpem9udGFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdHJldGNoLWhvcml6b250YWwuanMiKCkgewogICAgU3RyZXRjaEhvcml6b250YWwgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjYiLCB4OiAiMiIsIHk6ICI0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiNiIsIHg6ICIyIiwgeTogIjE0Iiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3RyZXRjaC12ZXJ0aWNhbC5qcwp2YXIgU3RyZXRjaFZlcnRpY2FsOwp2YXIgaW5pdF9zdHJldGNoX3ZlcnRpY2FsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdHJldGNoLXZlcnRpY2FsLmpzIigpIHsKICAgIFN0cmV0Y2hWZXJ0aWNhbCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjYiLCBoZWlnaHQ6ICIyMCIsIHg6ICI0IiwgeTogIjIiLCByeDogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiNiIsIGhlaWdodDogIjIwIiwgeDogIjE0IiwgeTogIjIiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdHJpa2V0aHJvdWdoLmpzCnZhciBTdHJpa2V0aHJvdWdoOwp2YXIgaW5pdF9zdHJpa2V0aHJvdWdoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdHJpa2V0aHJvdWdoLmpzIigpIHsKICAgIFN0cmlrZXRocm91Z2ggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA0SDlhMyAzIDAgMCAwLTIuODMgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxMmE0IDQgMCAwIDEgMCA4SDYiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiNCIsIHgyOiAiMjAiLCB5MTogIjEyIiwgeTI6ICIxMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N1YnNjcmlwdC5qcwp2YXIgU3Vic2NyaXB0Owp2YXIgaW5pdF9zdWJzY3JpcHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N1YnNjcmlwdC5qcyIoKSB7CiAgICBTdWJzY3JpcHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm00IDUgOCA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDUtOCA4IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIwIDE5aC00YzAtMS41LjQ0LTIgMS41LTIuNVMyMCAxNS4zMyAyMCAxNGMwLS40Ny0uMTctLjkzLS40OC0xLjI5YTIuMTEgMi4xMSAwIDAgMC0yLjYyLS40NGMtLjQyLjI0LS43NC42Mi0uOSAxLjA3IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3VuLWRpbS5qcwp2YXIgU3VuRGltOwp2YXIgaW5pdF9zdW5fZGltID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdW4tZGltLmpzIigpIHsKICAgIFN1bkRpbSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgNGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTJoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIwaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEyaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy42NTcgNi4zNDNoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjY1NyAxNy42NTdoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMzQzIDE3LjY1N2guMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNi4zNDMgNi4zNDNoLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3VuLW1lZGl1bS5qcwp2YXIgU3VuTWVkaXVtOwp2YXIgaW5pdF9zdW5fbWVkaXVtID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdW4tbWVkaXVtLmpzIigpIHsKICAgIFN1bk1lZGl1bSA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgM3YxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIwdjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDEyaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTguMzY0IDUuNjM2LS43MDcuNzA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYuMzQzIDE3LjY1Ny0uNzA3LjcwNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01LjYzNiA1LjYzNi43MDcuNzA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3LjY1NyAxNy42NTcuNzA3LjcwNyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N1bi1tb29uLmpzCnZhciBTdW5Nb29uOwp2YXIgaW5pdF9zdW5fbW9vbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3VuLW1vb24uanMiKCkgewogICAgU3VuTW9vbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNC44MzcgMTYuMzg1YTYgNiAwIDEgMS03LjIyMy03LjIyMmMuNjI0LS4xNDcuOTcuNjYuNzE1IDEuMjQ4YTQgNCAwIDAgMCA1LjI2IDUuMjU5Yy41ODktLjI1NSAxLjM5Ni4wOSAxLjI0OC43MTUiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTJhNCA0IDAgMCAwLTQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOSA1LTEuMjU2IDEuMjU2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDEyaDIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdW4tc25vdy5qcwp2YXIgU3VuU25vdzsKdmFyIGluaXRfc3VuX3Nub3cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N1bi1zbm93LmpzIigpIHsKICAgIFN1blNub3cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAyMXYtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA0VjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOWEzIDMgMCAwIDAgMCA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDIwIDEuMjUtMi41TDE4IDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDQgMS4yNSAyLjVMMTggNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNyAyMS0zLTYgMS41LTNIMjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMy0zIDYgMS41IDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwIDEwLTEuNSAyIDEuNSAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTMuNjQgMTguMzYuNy0uNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm00LjM0IDYuMzQtLjctLjciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdW4uanMKdmFyIFN1bjsKdmFyIGluaXRfc3VuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdW4uanMiKCkgewogICAgU3VuID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjB2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm00LjkzIDQuOTMgMS40MSAxLjQxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3LjY2IDE3LjY2IDEuNDEgMS40MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEyaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMTJoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02LjM0IDE3LjY2LTEuNDEgMS40MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOS4wNyA0LjkzLTEuNDEgMS40MSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N1bnJpc2UuanMKdmFyIFN1bnJpc2U7CnZhciBpbml0X3N1bnJpc2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N1bnJpc2UuanMiKCkgewogICAgU3VucmlzZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm00LjkzIDEwLjkzIDEuNDEgMS40MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE4aDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMThoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOS4wNyAxMC45My0xLjQxIDEuNDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMjJIMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDYgNC00IDQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxOGE0IDQgMCAwIDAtOCAwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3Vuc2V0LmpzCnZhciBTdW5zZXQ7CnZhciBpbml0X3N1bnNldCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3Vuc2V0LmpzIigpIHsKICAgIFN1bnNldCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEwVjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNC45MyAxMC45MyAxLjQxIDEuNDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxOGgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE4aDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkuMDcgMTAuOTMtMS40MSAxLjQxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDIySDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgNi00IDQtNC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE4YTQgNCAwIDAgMC04IDAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdXBlcnNjcmlwdC5qcwp2YXIgU3VwZXJzY3JpcHQ7CnZhciBpbml0X3N1cGVyc2NyaXB0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdXBlcnNjcmlwdC5qcyIoKSB7CiAgICBTdXBlcnNjcmlwdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTQgMTkgOC04IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDE5LTgtOCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMCAxMmgtNGMwLTEuNS40NDItMiAxLjUtMi41UzIwIDguMzM0IDIwIDcuMDAyYzAtLjQ3Mi0uMTctLjkzLS40ODQtMS4yOWEyLjEwNSAyLjEwNSAwIDAgMC0yLjYxNy0uNDM2Yy0uNDIuMjM5LS43MzguNjE0LS44OTkgMS4wNiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N3YXRjaC1ib29rLmpzCnZhciBTd2F0Y2hCb29rOwp2YXIgaW5pdF9zd2F0Y2hfYm9vayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3dhdGNoLWJvb2suanMiKCkgewogICAgU3dhdGNoQm9vayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDE3YTQgNCAwIDAgMS04IDBWNWEyIDIgMCAwIDEgMi0yaDRhMiAyIDAgMCAxIDIgMloiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYuNyAxM0gxOWEyIDIgMCAwIDEgMiAydjRhMiAyIDAgMCAxLTIgMkg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTSA3IDE3aC4wMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAibTExIDggMi4zLTIuM2EyLjQgMi40IDAgMCAxIDMuNDA0LjAwNEwxOC42IDcuNmEyLjQgMi40IDAgMCAxIC4wMjYgMy40MzRMOS45IDE5LjgiIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3dpdGNoLWNhbWVyYS5qcwp2YXIgU3dpdGNoQ2FtZXJhOwp2YXIgaW5pdF9zd2l0Y2hfY2FtZXJhID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zd2l0Y2gtY2FtZXJhLmpzIigpIHsKICAgIFN3aXRjaENhbWVyYSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDE5SDRhMiAyIDAgMCAxLTItMlY3YTIgMiAwIDAgMSAyLTJoNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyA1aDdhMiAyIDAgMCAxIDIgMnYxMGEyIDIgMCAwIDEtMiAyaC01IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMjItMy0zIDMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02IDIgMyAzLTMgMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N3aXNzLWZyYW5jLmpzCnZhciBTd2lzc0ZyYW5jOwp2YXIgaW5pdF9zd2lzc19mcmFuYyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3dpc3MtZnJhbmMuanMiKCkgewogICAgU3dpc3NGcmFuYyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDIxVjNoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE2aDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOS41aDciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zd29yZC5qcwp2YXIgU3dvcmQ7CnZhciBpbml0X3N3b3JkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy9zd29yZC5qcyIoKSB7CiAgICBTd29yZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTExIDE5LTYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01IDIxLTItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDE2LTQgNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjUgMTcuNSAyMSA2VjNoLTNMNi41IDE0LjUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWJsZS0yLmpzCnZhciBUYWJsZTI7CnZhciBpbml0X3RhYmxlXzIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhYmxlLTIuanMiKCkgewogICAgVGFibGUyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOSAzSDVhMiAyIDAgMCAwLTIgMnY0bTYtNmgxMGEyIDIgMCAwIDEgMiAydjRNOSAzdjE4bTAgMGgxMGEyIDIgMCAwIDAgMi0yVjlNOSAyMUg1YTIgMiAwIDAgMS0yLTJWOW0wIDBoMTgiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWJsZS1jZWxscy1tZXJnZS5qcwp2YXIgVGFibGVDZWxsc01lcmdlOwp2YXIgaW5pdF90YWJsZV9jZWxsc19tZXJnZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGFibGUtY2VsbHMtbWVyZ2UuanMiKCkgewogICAgVGFibGVDZWxsc01lcmdlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjF2LTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOVYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTVoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA5aDE4IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3dvcmRzLmpzCnZhciBTd29yZHM7CnZhciBpbml0X3N3b3JkcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3dvcmRzLmpzIigpIHsKICAgIFN3b3JkcyA9IFsKICAgICAgWyJwb2x5bGluZSIsIHsgcG9pbnRzOiAiMTQuNSAxNy41IDMgNiAzIDMgNiAzIDE3LjUgMTQuNSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMyIsIHgyOiAiMTkiLCB5MTogIjE5IiwgeTI6ICIxMyIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNiIsIHgyOiAiMjAiLCB5MTogIjE2IiwgeTI6ICIyMCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxOSIsIHgyOiAiMjEiLCB5MTogIjIxIiwgeTI6ICIxOSIgfV0sCiAgICAgIFsicG9seWxpbmUiLCB7IHBvaW50czogIjE0LjUgNi41IDE4IDMgMjEgMyAyMSA2IDE3LjUgOS41IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjUiLCB4MjogIjkiLCB5MTogIjE0IiwgeTI6ICIxOCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI3IiwgeDI6ICI0IiwgeTE6ICIxNyIsIHkyOiAiMjAiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMyIsIHgyOiAiNSIsIHkxOiAiMTkiLCB5MjogIjIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3lyaW5nZS5qcwp2YXIgU3lyaW5nZTsKdmFyIGluaXRfc3lyaW5nZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvc3lyaW5nZS5qcyIoKSB7CiAgICBTeXJpbmdlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMiA0IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgNyAzLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgOSA4LjcgMTkuM2MtMSAxLTIuNSAxLTMuNCAwbC0uNi0uNmMtMS0xLTEtMi41IDAtMy40TDE1IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxMSA0IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNSAxOS0zIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgNCA2IDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWJsZS1jZWxscy1zcGxpdC5qcwp2YXIgVGFibGVDZWxsc1NwbGl0Owp2YXIgaW5pdF90YWJsZV9jZWxsc19zcGxpdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGFibGUtY2VsbHMtc3BsaXQuanMiKCkgewogICAgVGFibGVDZWxsc1NwbGl0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTVWOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDE1aDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOWgxOCIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhYmxlLWNvbHVtbnMtc3BsaXQuanMKdmFyIFRhYmxlQ29sdW1uc1NwbGl0Owp2YXIgaW5pdF90YWJsZV9jb2x1bW5zX3NwbGl0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWJsZS1jb2x1bW5zLXNwbGl0LmpzIigpIHsKICAgIFRhYmxlQ29sdW1uc1NwbGl0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMTR2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAyMHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA4djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxNWg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgM2g2YTIgMiAwIDAgMSAyIDJ2MTRhMiAyIDAgMCAxLTIgMkgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgOWg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE1aC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDNoLTJhMiAyIDAgMCAwLTIgMnYxNGEyIDIgMCAwIDAgMiAyaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgOWgtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDN2MTgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWJsZS1vZi1jb250ZW50cy5qcwp2YXIgVGFibGVPZkNvbnRlbnRzOwp2YXIgaW5pdF90YWJsZV9vZl9jb250ZW50cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGFibGUtb2YtY29udGVudHMuanMiKCkgewogICAgVGFibGVPZkNvbnRlbnRzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgNUgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEySDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTlIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA1aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxMmguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTloLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGFibGUtcHJvcGVydGllcy5qcwp2YXIgVGFibGVQcm9wZXJ0aWVzOwp2YXIgaW5pdF90YWJsZV9wcm9wZXJ0aWVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWJsZS1wcm9wZXJ0aWVzLmpzIigpIHsKICAgIFRhYmxlUHJvcGVydGllcyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDN2MTgiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgOUgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE1SDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWJsZS1yb3dzLXNwbGl0LmpzCnZhciBUYWJsZVJvd3NTcGxpdDsKdmFyIGluaXRfdGFibGVfcm93c19zcGxpdCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGFibGUtcm93cy1zcGxpdC5qcyIoKSB7CiAgICBUYWJsZVJvd3NTcGxpdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDEwaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMjJ2LTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgMnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTBoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxMGgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTloMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAyMnYtNmEyIDIgMTM1IDAgMSAyLTJoMTRhMiAyIDQ1IDAgMSAyIDJ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDJ2MmEyIDIgNDUgMCAwIDIgMmgxNGEyIDIgMTM1IDAgMCAyLTJWMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEwaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAyMnYtOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDJ2NCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhYmxlLmpzCnZhciBUYWJsZTsKdmFyIGluaXRfdGFibGUyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWJsZS5qcyIoKSB7CiAgICBUYWJsZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDN2MTgiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA5aDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTVoMTgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWJsZXQtc21hcnRwaG9uZS5qcwp2YXIgVGFibGV0U21hcnRwaG9uZTsKdmFyIGluaXRfdGFibGV0X3NtYXJ0cGhvbmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhYmxldC1zbWFydHBob25lLmpzIigpIHsKICAgIFRhYmxldFNtYXJ0cGhvbmUgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxMCIsIGhlaWdodDogIjE0IiwgeDogIjMiLCB5OiAiOCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDRhMiAyIDAgMCAxIDItMmgxMmEyIDIgMCAwIDEgMiAydjE2YTIgMiAwIDAgMS0yIDJoLTIuNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE4aC4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhYmxldC5qcwp2YXIgVGFibGV0Owp2YXIgaW5pdF90YWJsZXQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhYmxldC5qcyIoKSB7CiAgICBUYWJsZXQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxNiIsIGhlaWdodDogIjIwIiwgeDogIjQiLCB5OiAiMiIsIHJ4OiAiMiIsIHJ5OiAiMiIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxMiIsIHgyOiAiMTIuMDEiLCB5MTogIjE4IiwgeTI6ICIxOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhYmxldHMuanMKdmFyIFRhYmxldHM7CnZhciBpbml0X3RhYmxldHMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhYmxldHMuanMiKCkgewogICAgVGFibGV0cyA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNyIsIGN5OiAiNyIsIHI6ICI1IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTciLCBjeTogIjE3IiwgcjogIjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTdoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMy40NiAxMC41NCA3LjA4LTcuMDgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWcuanMKdmFyIFRhZzI7CnZhciBpbml0X3RhZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGFnLmpzIigpIHsKICAgIFRhZzIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMi41ODYgMi41ODZBMiAyIDAgMCAwIDExLjE3MiAySDRhMiAyIDAgMCAwLTIgMnY3LjE3MmEyIDIgMCAwIDAgLjU4NiAxLjQxNGw4LjcwNCA4LjcwNGEyLjQyNiAyLjQyNiAwIDAgMCAzLjQyIDBsNi41OC02LjU4YTIuNDI2IDIuNDI2IDAgMCAwIDAtMy40MnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI3LjUiLCBjeTogIjcuNSIsIHI6ICIuNSIsIGZpbGw6ICJjdXJyZW50Q29sb3IiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWdzLmpzCnZhciBUYWdzOwp2YXIgaW5pdF90YWdzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWdzLmpzIigpIHsKICAgIFRhZ3MgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMy4xNzIgMmEyIDIgMCAwIDEgMS40MTQuNTg2bDYuNzEgNi43MWEyLjQgMi40IDAgMCAxIDAgMy40MDhsLTQuNTkyIDQuNTkyYTIuNCAyLjQgMCAwIDEtMy40MDggMGwtNi43MS02LjcxQTIgMiAwIDAgMSA2IDkuMTcyVjNhMSAxIDAgMCAxIDEtMXoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA3djYuMTcyYTIgMiAwIDAgMCAuNTg2IDEuNDE0bDYuNzEgNi43MWEyLjQgMi40IDAgMCAwIDMuMTkxLjE5MyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEwLjUiLCBjeTogIjYuNSIsIHI6ICIuNSIsIGZpbGw6ICJjdXJyZW50Q29sb3IiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWxseS0xLmpzCnZhciBUYWxseTE7CnZhciBpbml0X3RhbGx5XzEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhbGx5LTEuanMiKCkgewogICAgVGFsbHkxID0gW1sicGF0aCIsIHsgZDogIk00IDR2MTYiIH1dXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGFsbHktMi5qcwp2YXIgVGFsbHkyOwp2YXIgaW5pdF90YWxseV8yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWxseS0yLmpzIigpIHsKICAgIFRhbGx5MiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDR2MTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWxseS0zLmpzCnZhciBUYWxseTM7CnZhciBpbml0X3RhbGx5XzMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhbGx5LTMuanMiKCkgewogICAgVGFsbHkzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNCA0djE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCA0djE2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGFsbHktNC5qcwp2YXIgVGFsbHk0Owp2YXIgaW5pdF90YWxseV80ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWxseS00LmpzIigpIHsKICAgIFRhbGx5NCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDR2MTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSA0djE2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGFsbHktNS5qcwp2YXIgVGFsbHk1Owp2YXIgaW5pdF90YWxseV81ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWxseS01LmpzIigpIHsKICAgIFRhbGx5NSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDR2MTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgNHYxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSA0djE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDYgMiAxOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhbmdlbnQuanMKdmFyIFRhbmdlbnQ7CnZhciBpbml0X3RhbmdlbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhbmdlbnQuanMiKCkgewogICAgVGFuZ2VudCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTciLCBjeTogIjQiLCByOiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNS41OSA1LjQxIDUuNDEgMTUuNTkiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI0IiwgY3k6ICIxNyIsIHI6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIycy00LTktMS41LTExLjVTMjIgMTIgMjIgMTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YXJnZXQuanMKdmFyIFRhcmdldDsKdmFyIGluaXRfdGFyZ2V0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90YXJnZXQuanMiKCkgewogICAgVGFyZ2V0ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiMTAiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiNiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGVsZXNjb3BlLmpzCnZhciBUZWxlc2NvcGU7CnZhciBpbml0X3RlbGVzY29wZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGVsZXNjb3BlLmpzIigpIHsKICAgIFRlbGVzY29wZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTEwLjA2NSAxMi40OTMtNi4xOCAxLjMxOGEuOTM0LjkzNCAwIDAgMS0xLjEwOC0uNzAybC0uNTM3LTIuMTVhMS4wNyAxLjA3IDAgMCAxIC42OTEtMS4yNjVsMTMuNTA0LTQuNDQiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMuNTYgMTEuNzQ3IDQuMzMyLS45MjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMjEtMy4xMDUtNi4yMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNi40ODUgNS45NGEyIDIgMCAwIDEgMS40NTUtMi40MjVsMS4wOS0uMjcyYTEgMSAwIDAgMSAxLjIxMi43MjdsMS41MTUgNi4wNmExIDEgMCAwIDEtLjcyNyAxLjIxM2wtMS4wOS4yNzJhMiAyIDAgMCAxLTIuNDI1LTEuNDU1eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02LjE1OCA4LjYzMyAxLjExNCA0LjQ1NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDIxIDMuMTA1LTYuMjEiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTMiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RlbnQtdHJlZS5qcwp2YXIgVGVudFRyZWU7CnZhciBpbml0X3RlbnRfdHJlZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGVudC10cmVlLmpzIigpIHsKICAgIFRlbnRUcmVlID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICI0IiwgY3k6ICI0IiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQgNSAzLTMgMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDEwIDMtMyAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgMTRWMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxNEg3bC01IDhoMjBaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTR2OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDE0IDUgOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RlbnQuanMKdmFyIFRlbnQ7CnZhciBpbml0X3RlbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RlbnQuanMiKCkgewogICAgVGVudCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuNSAyMSAxNCAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwLjUgMjEgMTAgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNS41IDIxIDEyIDE1bC0zLjUgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIxaDIwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGVybWluYWwuanMKdmFyIFRlcm1pbmFsOwp2YXIgaW5pdF90ZXJtaW5hbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGVybWluYWwuanMiKCkgewogICAgVGVybWluYWwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOWg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTQgMTcgNi02LTYtNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Rlc3QtdHViZS1kaWFnb25hbC5qcwp2YXIgVGVzdFR1YmVEaWFnb25hbDsKdmFyIGluaXRfdGVzdF90dWJlX2RpYWdvbmFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90ZXN0LXR1YmUtZGlhZ29uYWwuanMiKCkgewogICAgVGVzdFR1YmVEaWFnb25hbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDcgNi44MiAyMS4xOGEyLjgzIDIuODMgMCAwIDEtMy45OS0uMDFhMi44MyAyLjgzIDAgMCAxIDAtNEwxNyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDIgNiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE2SDQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90ZXN0LXR1YmUuanMKdmFyIFRlc3RUdWJlOwp2YXIgaW5pdF90ZXN0X3R1YmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Rlc3QtdHViZS5qcyIoKSB7CiAgICBUZXN0VHViZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0LjUgMnYxNy41YzAgMS40LTEuMSAyLjUtMi41IDIuNWMtMS40IDAtMi41LTEuMS0yLjUtMi41VjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC41IDJoNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNC41IDE2aC01IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGVzdC10dWJlcy5qcwp2YXIgVGVzdFR1YmVzOwp2YXIgaW5pdF90ZXN0X3R1YmVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90ZXN0LXR1YmVzLmpzIigpIHsKICAgIFRlc3RUdWJlcyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMnYxNy41QTIuNSAyLjUgMCAwIDEgNi41IDIyQTIuNSAyLjUgMCAwIDEgNCAxOS41VjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMnYxNy41YTIuNSAyLjUgMCAwIDEtMi41IDIuNWEyLjUgMi41IDAgMCAxLTIuNS0yLjVWMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDJoNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAyaDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNkg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE2aC01IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGV4dC1hbGlnbi1jZW50ZXIuanMKdmFyIFRleHRBbGlnbkNlbnRlcjsKdmFyIGluaXRfdGV4dF9hbGlnbl9jZW50ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RleHQtYWxpZ24tY2VudGVyLmpzIigpIHsKICAgIFRleHRBbGlnbkNlbnRlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDVIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxMkg3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE5SDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90ZXh0LWFsaWduLWVuZC5qcwp2YXIgVGV4dEFsaWduRW5kOwp2YXIgaW5pdF90ZXh0X2FsaWduX2VuZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGV4dC1hbGlnbi1lbmQuanMiKCkgewogICAgVGV4dEFsaWduRW5kID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgNUgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDEySDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTlINyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RleHQtYWxpZ24tanVzdGlmeS5qcwp2YXIgVGV4dEFsaWduSnVzdGlmeTsKdmFyIGluaXRfdGV4dF9hbGlnbl9qdXN0aWZ5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90ZXh0LWFsaWduLWp1c3RpZnkuanMiKCkgewogICAgVGV4dEFsaWduSnVzdGlmeSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgNWgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDEyaDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTloMTgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90ZXh0LWFsaWduLXN0YXJ0LmpzCnZhciBUZXh0QWxpZ25TdGFydDsKdmFyIGluaXRfdGV4dF9hbGlnbl9zdGFydCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGV4dC1hbGlnbi1zdGFydC5qcyIoKSB7CiAgICBUZXh0QWxpZ25TdGFydCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDVIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxMkgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDE5SDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90ZXh0LWN1cnNvci1pbnB1dC5qcwp2YXIgVGV4dEN1cnNvcklucHV0Owp2YXIgaW5pdF90ZXh0X2N1cnNvcl9pbnB1dCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGV4dC1jdXJzb3ItaW5wdXQuanMiKCkgewogICAgVGV4dEN1cnNvcklucHV0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjBoLTFhMiAyIDAgMCAxLTItMiAyIDIgMCAwIDEtMiAySDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgOGg3YTIgMiAwIDAgMSAyIDJ2NGEyIDIgMCAwIDEtMiAyaC03IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTZINGEyIDIgMCAwIDEtMi0ydi00YTIgMiAwIDAgMSAyLTJoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDRoMWEyIDIgMCAwIDEgMiAyIDIgMiAwIDAgMSAyLTJoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDZ2MTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90ZXh0LWN1cnNvci5qcwp2YXIgVGV4dEN1cnNvcjsKdmFyIGluaXRfdGV4dF9jdXJzb3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RleHQtY3Vyc29yLmpzIigpIHsKICAgIFRleHRDdXJzb3IgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAyMmgtMWE0IDQgMCAwIDEtNC00VjZhNCA0IDAgMCAxIDQtNGgxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjJoMWE0IDQgMCAwIDAgNC00di0xIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMmgxYTQgNCAwIDAgMSA0IDR2MSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RleHQtaW5pdGlhbC5qcwp2YXIgVGV4dEluaXRpYWw7CnZhciBpbml0X3RleHRfaW5pdGlhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGV4dC1pbml0aWFsLmpzIigpIHsKICAgIFRleHRJbml0aWFsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgNWg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDEyaDYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxOWgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0zIDEyIDMuNTUzLTcuNzI0YS41LjUgMCAwIDEgLjg5NCAwTDExIDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMuOTIgMTBoNi4xNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RleHQtcXVvdGUuanMKdmFyIFRleHRRdW90ZTsKdmFyIGluaXRfdGV4dF9xdW90ZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGV4dC1xdW90ZS5qcyIoKSB7CiAgICBUZXh0UXVvdGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyA1SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTJIOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxOUg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTJ2NyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RleHQtc2VhcmNoLmpzCnZhciBUZXh0U2VhcmNoOwp2YXIgaW5pdF90ZXh0X3NlYXJjaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGV4dC1zZWFyY2guanMiKCkgewogICAgVGV4dFNlYXJjaCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDVIMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMkgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE5SDMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNyIsIGN5OiAiMTUiLCByOiAiMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAxOS0xLjktMS45IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGV4dC1zZWxlY3QuanMKdmFyIFRleHRTZWxlY3Q7CnZhciBpbml0X3RleHRfc2VsZWN0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90ZXh0LXNlbGVjdC5qcyIoKSB7CiAgICBUZXh0U2VsZWN0ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjFoMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAzaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgM2EyIDIgMCAwIDEgMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE0djEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTlhMiAyIDAgMCAxLTIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA5djEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxNHYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgOXYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMjFhMiAyIDAgMCAxLTItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDNhMiAyIDAgMCAwLTIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEyaDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTZoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDhoOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDIxaDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAzaDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90ZXh0LXdyYXAuanMKdmFyIFRleHRXcmFwOwp2YXIgaW5pdF90ZXh0X3dyYXAgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RleHQtd3JhcC5qcyIoKSB7CiAgICBUZXh0V3JhcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDE2LTMgMyAzIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxMmgxNC41YTEgMSAwIDAgMSAwIDdIMTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAxOWg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgNWgxOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RoZWF0ZXIuanMKdmFyIFRoZWF0ZXI7CnZhciBpbml0X3RoZWF0ZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RoZWF0ZXIuanMiKCkgewogICAgVGhlYXRlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMTBzMy0zIDMtOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxMHMtMy0zLTMtOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAyYzAgNC40LTMuNiA4LTggOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAyYzAgNC40IDMuNiA4IDggOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEwczIgMiAyIDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTBzLTIgMi0yIDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxNWg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjJ2LTFhMiAyIDAgMCAxIDItMmg0YTIgMiAwIDAgMSAyIDJ2MSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAyMnYtMWEyIDIgMCAwIDEgMi0yaDRhMiAyIDAgMCAxIDIgMnYxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGhlcm1vbWV0ZXItc25vd2ZsYWtlLmpzCnZhciBUaGVybW9tZXRlclNub3dmbGFrZTsKdmFyIGluaXRfdGhlcm1vbWV0ZXJfc25vd2ZsYWtlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90aGVybW9tZXRlci1zbm93Zmxha2UuanMiKCkgewogICAgVGhlcm1vbWV0ZXJTbm93Zmxha2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCAyMC0xLjI1LTIuNUw2IDE4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDQgOC43NSA2LjUgNiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjU4NSAxNUgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDEyaDYuNUwxMCA5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE0LjU0YTQgNCAwIDEgMS00IDBWNGEyIDIgMCAwIDEgNCAweiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm00IDEwIDEuNSAyTDQgMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNyAyMSAzLTYtMS41LTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNyAzIDMgNmgyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGhlcm1vbWV0ZXItc3VuLmpzCnZhciBUaGVybW9tZXRlclN1bjsKdmFyIGluaXRfdGhlcm1vbWV0ZXJfc3VuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90aGVybW9tZXRlci1zdW4uanMiKCkgewogICAgVGhlcm1vbWV0ZXJTdW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAydjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOGE0IDQgMCAwIDAtMS42NDUgNy42NDciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDE0LjU0YTQgNCAwIDEgMS00IDBWNGEyIDIgMCAwIDEgNCAweiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm00LjkzIDQuOTMgMS40MSAxLjQxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYuMzQgMTcuNjYtMS40MSAxLjQxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGhlcm1vbWV0ZXIuanMKdmFyIFRoZXJtb21ldGVyOwp2YXIgaW5pdF90aGVybW9tZXRlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGhlcm1vbWV0ZXIuanMiKCkgewogICAgVGhlcm1vbWV0ZXIgPSBbWyJwYXRoIiwgeyBkOiAiTTE0IDR2MTAuNTRhNCA0IDAgMSAxLTQgMFY0YTIgMiAwIDAgMSA0IDBaIiB9XV07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RodW1icy1kb3duLmpzCnZhciBUaHVtYnNEb3duOwp2YXIgaW5pdF90aHVtYnNfZG93biA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGh1bWJzLWRvd24uanMiKCkgewogICAgVGh1bWJzRG93biA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTkgMTguMTIgMTAgMTRINC4xN2EyIDIgMCAwIDEtMS45Mi0yLjU2bDIuMzMtOEEyIDIgMCAwIDEgNi41IDJIMjBhMiAyIDAgMCAxIDIgMnY4YTIgMiAwIDAgMS0yIDJoLTIuNzZhMiAyIDAgMCAwLTEuNzkgMS4xMUwxMiAyMmEzLjEzIDMuMTMgMCAwIDEtMy0zLjg4WiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxNFYyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGh1bWJzLXVwLmpzCnZhciBUaHVtYnNVcDsKdmFyIGluaXRfdGh1bWJzX3VwID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90aHVtYnMtdXAuanMiKCkgewogICAgVGh1bWJzVXAgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNSA1Ljg4IDE0IDEwaDUuODNhMiAyIDAgMCAxIDEuOTIgMi41NmwtMi4zMyA4QTIgMiAwIDAgMSAxNy41IDIySDRhMiAyIDAgMCAxLTItMnYtOGEyIDIgMCAwIDEgMi0yaDIuNzZhMiAyIDAgMCAwIDEuNzktMS4xMUwxMiAyYTMuMTMgMy4xMyAwIDAgMSAzIDMuODhaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTB2MTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90aWNrZXQtY2hlY2suanMKdmFyIFRpY2tldENoZWNrOwp2YXIgaW5pdF90aWNrZXRfY2hlY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RpY2tldC1jaGVjay5qcyIoKSB7CiAgICBUaWNrZXRDaGVjayA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIgOWEzIDMgMCAwIDEgMCA2djJhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0ydi0yYTMgMyAwIDAgMSAwLTZWN2EyIDIgMCAwIDAtMi0ySDRhMiAyIDAgMCAwLTIgMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxMiAyIDIgNC00IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGlja2V0LW1pbnVzLmpzCnZhciBUaWNrZXRNaW51czsKdmFyIGluaXRfdGlja2V0X21pbnVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90aWNrZXQtbWludXMuanMiKCkgewogICAgVGlja2V0TWludXMgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yIDlhMyAzIDAgMCAxIDAgNnYyYTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMnYtMmEzIDMgMCAwIDEgMC02VjdhMiAyIDAgMCAwLTItMkg0YTIgMiAwIDAgMC0yIDJaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTJoNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RpY2tldC1wZXJjZW50LmpzCnZhciBUaWNrZXRQZXJjZW50Owp2YXIgaW5pdF90aWNrZXRfcGVyY2VudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGlja2V0LXBlcmNlbnQuanMiKCkgewogICAgVGlja2V0UGVyY2VudCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIgOWEzIDMgMCAxIDEgMCA2djJhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0ydi0yYTMgMyAwIDEgMSAwLTZWN2EyIDIgMCAwIDAtMi0ySDRhMiAyIDAgMCAwLTIgMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA5aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSA5LTYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxNWguMDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90aWNrZXQtcGx1cy5qcwp2YXIgVGlja2V0UGx1czsKdmFyIGluaXRfdGlja2V0X3BsdXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RpY2tldC1wbHVzLmpzIigpIHsKICAgIFRpY2tldFBsdXMgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yIDlhMyAzIDAgMCAxIDAgNnYyYTIgMiAwIDAgMCAyIDJoMTZhMiAyIDAgMCAwIDItMnYtMmEzIDMgMCAwIDEgMC02VjdhMiAyIDAgMCAwLTItMkg0YTIgMiAwIDAgMC0yIDJaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTJoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA5djYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90aWNrZXQtc2xhc2guanMKdmFyIFRpY2tldFNsYXNoOwp2YXIgaW5pdF90aWNrZXRfc2xhc2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RpY2tldC1zbGFzaC5qcyIoKSB7CiAgICBUaWNrZXRTbGFzaCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIgOWEzIDMgMCAwIDEgMCA2djJhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0ydi0yYTMgMyAwIDAgMSAwLTZWN2EyIDIgMCAwIDAtMi0ySDRhMiAyIDAgMCAwLTIgMloiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOS41IDE0LjUgNS01IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGlja2V0LXguanMKdmFyIFRpY2tldFg7CnZhciBpbml0X3RpY2tldF94ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90aWNrZXQteC5qcyIoKSB7CiAgICBUaWNrZXRYID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMiA5YTMgMyAwIDAgMSAwIDZ2MmEyIDIgMCAwIDAgMiAyaDE2YTIgMiAwIDAgMCAyLTJ2LTJhMyAzIDAgMCAxIDAtNlY3YTIgMiAwIDAgMC0yLTJINGEyIDIgMCAwIDAtMiAyWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05LjUgMTQuNSA1LTUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOS41IDkuNSA1IDUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90aWNrZXQuanMKdmFyIFRpY2tldDsKdmFyIGluaXRfdGlja2V0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90aWNrZXQuanMiKCkgewogICAgVGlja2V0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMiA5YTMgMyAwIDAgMSAwIDZ2MmEyIDIgMCAwIDAgMiAyaDE2YTIgMiAwIDAgMCAyLTJ2LTJhMyAzIDAgMCAxIDAtNlY3YTIgMiAwIDAgMC0yLTJINGEyIDIgMCAwIDAtMiAyWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyA1djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMgMTd2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxMXYyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGlja2V0cy1wbGFuZS5qcwp2YXIgVGlja2V0c1BsYW5lOwp2YXIgaW5pdF90aWNrZXRzX3BsYW5lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90aWNrZXRzLXBsYW5lLmpzIigpIHsKICAgIFRpY2tldHNQbGFuZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjUgMTdoMS4yMjdhMiAyIDAgMCAwIDEuMzQ1LS41MkwxOCAxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMiAxMy41IDMuNzk0LjUwNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0zLjE3MyA4LjE4IDExLTVhMiAyIDAgMCAxIDIuNjQ3Ljk5M0wxOC41NiA4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTBWOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE0djEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOXYyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMiIsIHk6ICI4Iiwgd2lkdGg6ICIyMCIsIGhlaWdodDogIjEzIiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGlja2V0cy5qcwp2YXIgVGlja2V0czsKdmFyIGluaXRfdGlja2V0cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGlja2V0cy5qcyIoKSB7CiAgICBUaWNrZXRzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMy4xNzMgOC4xOCAxMS01YTIgMiAwIDAgMSAyLjY0Ny45OTNMMTguNTYgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEwVjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxNHYxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTl2MiIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjIiLCB5OiAiOCIsIHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxMyIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RpbWVyLXJlc2V0LmpzCnZhciBUaW1lclJlc2V0Owp2YXIgaW5pdF90aW1lcl9yZXNldCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGltZXItcmVzZXQuanMiKCkgewogICAgVGltZXJSZXNldCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDJoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNHYtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDEzYTggOCAwIDAgMSA4LTcgOCA4IDAgMSAxLTUuMyAxNEw0IDE3LjYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxN0g0djUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90aW1lci1vZmYuanMKdmFyIFRpbWVyT2ZmOwp2YXIgaW5pdF90aW1lcl9vZmYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RpbWVyLW9mZi5qcyIoKSB7CiAgICBUaW1lck9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDJoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00LjYgMTFhOCA4IDAgMCAwIDEuNyA4LjcgOCA4IDAgMCAwIDguNyAxLjciIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNy40IDcuNGE4IDggMCAwIDEgMTAuMyAxIDggOCAwIDAgMSAuOSAxMC4yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxMnYtMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RpbWVyLmpzCnZhciBUaW1lcjM7CnZhciBpbml0X3RpbWVyMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdGltZXIuanMiKCkgewogICAgVGltZXIzID0gWwogICAgICBbImxpbmUiLCB7IHgxOiAiMTAiLCB4MjogIjE0IiwgeTE6ICIyIiwgeTI6ICIyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjEyIiwgeDI6ICIxNSIsIHkxOiAiMTQiLCB5MjogIjExIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjE0IiwgcjogIjgiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90b2dnbGUtbGVmdC5qcwp2YXIgVG9nZ2xlTGVmdDsKdmFyIGluaXRfdG9nZ2xlX2xlZnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RvZ2dsZS1sZWZ0LmpzIigpIHsKICAgIFRvZ2dsZUxlZnQgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjEyIiwgcjogIjMiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxNCIsIHg6ICIyIiwgeTogIjUiLCByeDogIjciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90b2lsZXQuanMKdmFyIFRvaWxldDsKdmFyIGluaXRfdG9pbGV0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90b2lsZXQuanMiKCkgewogICAgVG9pbGV0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNyAxMmgxM2ExIDEgMCAwIDEgMSAxIDUgNSAwIDAgMS01IDVoLS41OThhLjUuNSAwIDAgMC0uNDI0Ljc2NWwxLjU0NCAyLjQ3YS41LjUgMCAwIDEtLjQyNC43NjVINS40MDJhLjUuNSAwIDAgMS0uNDI0LS43NjVMNyAxOCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE4YTUgNSAwIDAgMS01LTVWNGEyIDIgMCAwIDEgMi0yaDhhMiAyIDAgMCAxIDIgMnY4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdG9nZ2xlLXJpZ2h0LmpzCnZhciBUb2dnbGVSaWdodDsKdmFyIGluaXRfdG9nZ2xlX3JpZ2h0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90b2dnbGUtcmlnaHQuanMiKCkgewogICAgVG9nZ2xlUmlnaHQgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE1IiwgY3k6ICIxMiIsIHI6ICIzIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTQiLCB4OiAiMiIsIHk6ICI1Iiwgcng6ICI3IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdG9vbC1jYXNlLmpzCnZhciBUb29sQ2FzZTsKdmFyIGluaXRfdG9vbF9jYXNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90b29sLWNhc2UuanMiKCkgewogICAgVG9vbENhc2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxNWg0IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTE0LjgxNyAxMC45OTUtLjk3MS0xLjQ1IDEuMDM0LTEuMjMyYTIgMiAwIDAgMC0yLjAyNS0zLjIzOGwtMS44Mi4zNjRMOS45MSAzLjg4NWEyIDIgMCAwIDAtMy42MjUuNzQ4TDYuMTQxIDYuNTVsLTEuNzI1LjQyNmEyIDIgMCAwIDAtLjE5IDMuNzU2bC42NTcuMjciCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMTguODIyIDEwLjk5NSAyLjI2LTUuMzhhMSAxIDAgMCAwLS41NTctMS4zMThMMTYuOTU0IDIuOWExIDEgMCAwIDAtMS4yODEuNTMzbC0uOTI0IDIuMTIyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTIuMDA2QTEgMSAwIDAgMSA0Ljk5NCAxMUgxOWExIDEgMCAwIDEgMSAxdjdhMiAyIDAgMCAxLTIgMkg2YTIgMiAwIDAgMS0yLTJ6IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdG9vbGJveC5qcwp2YXIgVG9vbGJveDsKdmFyIGluaXRfdG9vbGJveCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdG9vbGJveC5qcyIoKSB7CiAgICBUb29sYm94ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTJ2NCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNiA2YTIgMiAwIDAgMSAxLjQxNC41ODZsNCA0QTIgMiAwIDAgMSAyMiAxMnY3YTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAuNTg2LTEuNDE0bDQtNEEyIDIgMCAwIDEgOCA2eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA2VjRhMiAyIDAgMCAwLTItMmgtNGEyIDIgMCAwIDAtMiAydjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxNGgyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEydjQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90b3JuYWRvLmpzCnZhciBUb3JuYWRvOwp2YXIgaW5pdF90b3JuYWRvID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90b3JuYWRvLmpzIigpIHsKICAgIFRvcm5hZG8gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSA0SDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggOEg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDEySDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTZoLTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMjBIOSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RvcnVzLmpzCnZhciBUb3J1czsKdmFyIGluaXRfdG9ydXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RvcnVzLmpzIigpIHsKICAgIFRvcnVzID0gWwogICAgICBbImVsbGlwc2UiLCB7IGN4OiAiMTIiLCBjeTogIjExIiwgcng6ICIzIiwgcnk6ICIyIiB9XSwKICAgICAgWyJlbGxpcHNlIiwgeyBjeDogIjEyIiwgY3k6ICIxMi41Iiwgcng6ICIxMCIsIHJ5OiAiOC41IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdG91Y2hwYWQtb2ZmLmpzCnZhciBUb3VjaHBhZE9mZjsKdmFyIGluaXRfdG91Y2hwYWRfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90b3VjaHBhZC1vZmYuanMiKCkgewogICAgVG91Y2hwYWRPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMHYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOS42NTYgMTRIMjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxNGgxMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMjBINGEyIDIgMCAwIDEtMi0yVjZhMiAyIDAgMCAxIDItMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjY1NiA0SDIwYTIgMiAwIDAgMSAyIDJ2MTAuMzQ0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdG91Y2hwYWQuanMKdmFyIFRvdWNocGFkOwp2YXIgaW5pdF90b3VjaHBhZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdG91Y2hwYWQuanMiKCkgewogICAgVG91Y2hwYWQgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE2IiwgeDogIjIiLCB5OiAiNCIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE0aDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIwdi02IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdG93ZWwtcmFjay5qcwp2YXIgVG93ZWxSYWNrOwp2YXIgaW5pdF90b3dlbF9yYWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90b3dlbC1yYWNrLmpzIigpIHsKICAgIFRvd2VsUmFjayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDdoLTIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNi41IDNoMTFBMi41IDIuNSAwIDAgMSAyMCA1LjVWMjBhMSAxIDAgMCAxLTEgMWgtOWExIDEgMCAwIDEtMS0xVjUuNWExIDEgMCAwIDAtNSAwVjE3YTEgMSAwIDAgMCAxIDFoNCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05IDdIMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Rvd2VyLWNvbnRyb2wuanMKdmFyIFRvd2VyQ29udHJvbDsKdmFyIGluaXRfdG93ZXJfY29udHJvbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdG93ZXItY29udHJvbC5qcyIoKSB7CiAgICBUb3dlckNvbnRyb2wgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOC4yIDEyLjI3IDIwIDZINGwxLjggNi4yN2ExIDEgMCAwIDAgLjk1LjczaDEwLjVhMSAxIDAgMCAwIC45Ni0uNzNaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTN2OSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAyMnYtOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDYgMSA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDYtMSA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDZWMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAyaC0yIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdG95LWJyaWNrLmpzCnZhciBUb3lCcmljazsKdmFyIGluaXRfdG95X2JyaWNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90b3ktYnJpY2suanMiKCkgewogICAgVG95QnJpY2sgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjEyIiwgeDogIjMiLCB5OiAiOCIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCA4VjVjMC0uNi0uNC0xLTEtMUg2YTEgMSAwIDAgMC0xIDF2MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSA4VjVjMC0uNi0uNC0xLTEtMWgtM2ExIDEgMCAwIDAtMSAxdjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmFjdG9yLmpzCnZhciBUcmFjdG9yOwp2YXIgaW5pdF90cmFjdG9yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmFjdG9yLmpzIigpIHsKICAgIFRyYWN0b3IgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCAxMSAxMSAuOWExIDEgMCAwIDEgLjggMS4xbC0uNjY1IDQuMTU4YTEgMSAwIDAgMS0uOTg4Ljg0MkgyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxOGgtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA1YTEgMSAwIDAgMC0xIDF2NS41NzMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA0aDguMTI5YTEgMSAwIDAgMSAuOTkuODYzTDEzIDExLjI0NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDExVjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxNWguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMC4xVjQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOCIsIGN5OiAiMTgiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjciLCBjeTogIjE1IiwgcjogIjUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmFmZmljLWNvbmUuanMKdmFyIFRyYWZmaWNDb25lOwp2YXIgaW5pdF90cmFmZmljX2NvbmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyYWZmaWMtY29uZS5qcyIoKSB7CiAgICBUcmFmZmljQ29uZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2LjA1IDEwLjk2NmE1IDIuNSAwIDAgMS04LjEgMCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xNi45MjMgMTQuMDQ5IDQuNDggMi4wNGExIDEgMCAwIDEgLjAwMSAxLjgzMWwtOC41NzQgMy45YTIgMiAwIDAgMS0xLjY2IDBsLTguNTc0LTMuOTFhMSAxIDAgMCAxIDAtMS44M2w0LjQ4NC0yLjA0IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2Ljk0OSAxNC4xNGE1IDIuNSAwIDEgMS05LjkgMEwxMC4wNjMgMy41YTIgMiAwIDAgMSAzLjg3NCAweiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjE5NCA2LjU3YTUgMi41IDAgMCAwIDUuNjEgMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyYWluLWZyb250LXR1bm5lbC5qcwp2YXIgVHJhaW5Gcm9udFR1bm5lbDsKdmFyIGluaXRfdHJhaW5fZnJvbnRfdHVubmVsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmFpbi1mcm9udC10dW5uZWwuanMiKCkgewogICAgVHJhaW5Gcm9udFR1bm5lbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjJWMTJhMTAgMTAgMCAxIDEgMjAgMHYxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSA2Ljh2MS40YTMgMi44IDAgMSAxLTYgMFY2LjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTVoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0IDE1aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxOWE0IDQgMCAwIDEtNC00di0zYTYgNiAwIDEgMSAxMiAwdjNhNCA0IDAgMCAxLTQgNFoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxOS0yIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgMTkgMiAzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJhaW4tZnJvbnQuanMKdmFyIFRyYWluRnJvbnQ7CnZhciBpbml0X3RyYWluX2Zyb250ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmFpbi1mcm9udC5qcyIoKSB7CiAgICBUcmFpbkZyb250ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAzLjFWN2E0IDQgMCAwIDAgOCAwVjMuMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm05IDE1LTEtMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNSAxNSAxLTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxOWMtMi44IDAtNS0yLjItNS01di00YTggOCAwIDAgMSAxNiAwdjRjMCAyLjgtMi4yIDUtNSA1WiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm04IDE5LTIgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAxOSAyIDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmFpbi10cmFjay5qcwp2YXIgVHJhaW5UcmFjazsKdmFyIGluaXRfdHJhaW5fdHJhY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyYWluLXRyYWNrLmpzIigpIHsKICAgIFRyYWluVHJhY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDE3IDE3IDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAxNCA4IDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNSAxMSA4IDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCA4IDggOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMSA1IDggOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNCAyIDggOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDIyIDIyIDciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmFtLWZyb250LmpzCnZhciBUcmFtRnJvbnQ7CnZhciBpbml0X3RyYW1fZnJvbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyYW0tZnJvbnQuanMiKCkgewogICAgVHJhbUZyb250ID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTYiLCBoZWlnaHQ6ICIxNiIsIHg6ICI0IiwgeTogIjMiLCByeDogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAxMWgxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAzdjgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCAxOS0yIDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTggMjItMi0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggMTVoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE1aC4wMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyYW5zZ2VuZGVyLmpzCnZhciBUcmFuc2dlbmRlcjsKdmFyIGluaXRfdHJhbnNnZW5kZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyYW5zZ2VuZGVyLmpzIigpIHsKICAgIFRyYW5zZ2VuZGVyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTZ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAyMGgtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAyaDR2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgNy4xNyA3LjE3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgNS4zNTVWMmgzLjM1NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiAyLTcuMTcgNy4xNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDUgNSA4IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmFzaC0yLmpzCnZhciBUcmFzaDI7CnZhciBpbml0X3RyYXNoXzIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyYXNoLTIuanMiKCkgewogICAgVHJhc2gyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTF2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxMXY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDZ2MTRhMiAyIDAgMCAxLTIgMkg3YTIgMiAwIDAgMS0yLTJWNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDZoMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCA2VjRhMiAyIDAgMCAxIDItMmg0YTIgMiAwIDAgMSAyIDJ2MiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyYXNoLmpzCnZhciBUcmFzaDsKdmFyIGluaXRfdHJhc2ggPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyYXNoLmpzIigpIHsKICAgIFRyYXNoID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgNnYxNGEyIDIgMCAwIDEtMiAySDdhMiAyIDAgMCAxLTItMlY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgNmgxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDZWNGEyIDIgMCAwIDEgMi0yaDRhMiAyIDAgMCAxIDIgMnYyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJlZS1wYWxtLmpzCnZhciBUcmVlUGFsbTsKdmFyIGluaXRfdHJlZV9wYWxtID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmVlLXBhbG0uanMiKCkgewogICAgVHJlZVBhbG0gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyA4YzAtMi43Ni0yLjQ2LTUtNS41LTVTMiA1LjI0IDIgOGgybDEtMSAxIDFoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyA3LjE0QTUuODIgNS44MiAwIDAgMSAxNi41IDZjMy4wNCAwIDUuNSAyLjI0IDUuNSA1aC0zbC0xLTEtMSAxaC0zIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTUuODkgOS43MWMtMi4xNSAyLjE1LTIuMyA1LjQ3LS4zNSA3LjQzbDQuMjQtNC4yNS43LS43LjcxLS43MSAyLjEyLTIuMTJjLTEuOTUtMS45Ni01LjI3LTEuOC03LjQyLjM1IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDE1LjVjLjUgMi41LS4xNyA0LjUtMSA2LjVoNGMyLTUuNS0uNS0xMi0xLTE0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJlZS1kZWNpZHVvdXMuanMKdmFyIFRyZWVEZWNpZHVvdXM7CnZhciBpbml0X3RyZWVfZGVjaWR1b3VzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmVlLWRlY2lkdW91cy5qcyIoKSB7CiAgICBUcmVlRGVjaWR1b3VzID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNOCAxOWE0IDQgMCAwIDEtMi4yNC03LjMyQTMuNSAzLjUgMCAwIDEgOSA2LjAzVjZhMyAzIDAgMSAxIDYgMHYuMDRhMy41IDMuNSAwIDAgMSAzLjI0IDUuNjVBNCA0IDAgMCAxIDE2IDE5WiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxOXYzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJlZS1waW5lLmpzCnZhciBUcmVlUGluZTsKdmFyIGluaXRfdHJlZV9waW5lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmVlLXBpbmUuanMiKCkgewogICAgVHJlZVBpbmUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIm0xNyAxNCAzIDMuM2ExIDEgMCAwIDEtLjcgMS43SDQuN2ExIDEgMCAwIDEtLjctMS43TDcgMTRoLS4zYTEgMSAwIDAgMS0uNy0xLjdMOSA5aC0uMkExIDEgMCAwIDEgOCA3LjNMMTIgM2w0IDQuM2ExIDEgMCAwIDEtLjggMS43SDE1bDMgMy4zYTEgMSAwIDAgMS0uNyAxLjdIMTdaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIydi0zIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJlZXMuanMKdmFyIFRyZWVzOwp2YXIgaW5pdF90cmVlcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJlZXMuanMiKCkgewogICAgVHJlZXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMHYuMkEzIDMgMCAwIDEgOC45IDE2SDVhMyAzIDAgMCAxLTEtNS44VjEwYTMgMyAwIDAgMSA2IDBaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTZ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMyAxOXYzIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTEyIDE5aDguM2ExIDEgMCAwIDAgLjctMS43TDE4IDE0aC4zYTEgMSAwIDAgMCAuNy0xLjdMMTYgOWguMmExIDEgMCAwIDAgLjgtMS43TDEzIDNsLTEuNCAxLjUiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmVsbG8uanMKdmFyIFRyZWxsbzsKdmFyIGluaXRfdHJlbGxvID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmVsbG8uanMiKCkgewogICAgVHJlbGxvID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMTgiLCBoZWlnaHQ6ICIxOCIsIHg6ICIzIiwgeTogIjMiLCByeDogIjIiLCByeTogIjIiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMyIsIGhlaWdodDogIjkiLCB4OiAiNyIsIHk6ICI3IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjMiLCBoZWlnaHQ6ICI1IiwgeDogIjE0IiwgeTogIjciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmVuZGluZy1kb3duLmpzCnZhciBUcmVuZGluZ0Rvd247CnZhciBpbml0X3RyZW5kaW5nX2Rvd24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyZW5kaW5nLWRvd24uanMiKCkgewogICAgVHJlbmRpbmdEb3duID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTdoNnYtNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMiAxNy04LjUtOC41LTUgNUwyIDciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmVuZGluZy11cC1kb3duLmpzCnZhciBUcmVuZGluZ1VwRG93bjsKdmFyIGluaXRfdHJlbmRpbmdfdXBfZG93biA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJlbmRpbmctdXAtZG93bi5qcyIoKSB7CiAgICBUcmVuZGluZ1VwRG93biA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE0LjgyOCAxNC44MjggMjEgMjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTZ2NWgtNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAzLTkgOS00LTQtNiA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDhWM2gtNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyZW5kaW5nLXVwLmpzCnZhciBUcmVuZGluZ1VwOwp2YXIgaW5pdF90cmVuZGluZ191cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJlbmRpbmctdXAuanMiKCkgewogICAgVHJlbmRpbmdVcCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDdoNnY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDctOC41IDguNS01LTVMMiAxNyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyaWFuZ2xlLWFsZXJ0LmpzCnZhciBUcmlhbmdsZUFsZXJ0Owp2YXIgaW5pdF90cmlhbmdsZV9hbGVydCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJpYW5nbGUtYWxlcnQuanMiKCkgewogICAgVHJpYW5nbGVBbGVydCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTIxLjczIDE4LTgtMTRhMiAyIDAgMCAwLTMuNDggMGwtOCAxNEEyIDIgMCAwIDAgNCAyMWgxNmEyIDIgMCAwIDAgMS43My0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDl2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxN2guMDEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmlhbmdsZS1kYXNoZWQuanMKdmFyIFRyaWFuZ2xlRGFzaGVkOwp2YXIgaW5pdF90cmlhbmdsZV9kYXNoZWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyaWFuZ2xlLWRhc2hlZC5qcyIoKSB7CiAgICBUcmlhbmdsZURhc2hlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjE3IDQuMTkzYTIgMiAwIDAgMSAzLjY2Ni4wMTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjFoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNS44NzQgNy43NDMgMSAxLjczMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOC44NDkgMTIuOTUyIDEgMS43MzIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEuODI0IDE4LjE4YTIgMiAwIDAgMS0xLjgzNSAyLjgyNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00LjAyNCAyMWEyIDIgMCAwIDEtMS44MzktMi44MzkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNS4xMzYgMTIuOTUyLTEgMS43MzIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAyMWgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTguMTAyIDcuNzQzLTEgMS43MzIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmlhbmdsZS1yaWdodC5qcwp2YXIgVHJpYW5nbGVSaWdodDsKdmFyIGluaXRfdHJpYW5nbGVfcmlnaHQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyaWFuZ2xlLXJpZ2h0LmpzIigpIHsKICAgIFRyaWFuZ2xlUmlnaHQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAxOGEyIDIgMCAwIDEtMiAySDNjLTEuMSAwLTEuMy0uNi0uNC0xLjNMMjAuNCA0LjNjLjktLjcgMS42LS40IDEuNi43WiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyaWFuZ2xlLmpzCnZhciBUcmlhbmdsZTsKdmFyIGluaXRfdHJpYW5nbGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyaWFuZ2xlLmpzIigpIHsKICAgIFRyaWFuZ2xlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTMuNzMgNGEyIDIgMCAwIDAtMy40NiAwbC04IDE0QTIgMiAwIDAgMCA0IDIxaDE2YTIgMiAwIDAgMCAxLjczLTNaIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJvcGh5LmpzCnZhciBUcm9waHk7CnZhciBpbml0X3Ryb3BoeSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJvcGh5LmpzIigpIHsKICAgIFRyb3BoeSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE0LjY2djEuNjI2YTIgMiAwIDAgMS0uOTc2IDEuNjk2QTUgNSAwIDAgMCA3IDIxLjk3OCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxNC42NnYxLjYyNmEyIDIgMCAwIDAgLjk3NiAxLjY5NkE1IDUgMCAwIDEgMTcgMjEuOTc4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDloMS41YTEgMSAwIDAgMCAwLTVIMTgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAyMmgxNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDlhNiA2IDAgMCAwIDEyIDBWM2ExIDEgMCAwIDAtMS0xSDdhMSAxIDAgMCAwLTEgMXoiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiA5SDQuNWExIDEgMCAwIDEgMC01SDYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90cnVjay1lbGVjdHJpYy5qcwp2YXIgVHJ1Y2tFbGVjdHJpYzsKdmFyIGluaXRfdHJ1Y2tfZWxlY3RyaWMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RydWNrLWVsZWN0cmljLmpzIigpIHsKICAgIFRydWNrRWxlY3RyaWMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxOVY3YTIgMiAwIDAgMC0yLTJIOSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxOUg5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE5aDJhMSAxIDAgMCAwIDEtMXYtMy42NWExIDEgMCAwIDAtLjIyLS42MkwxOC4zIDkuMzhhMSAxIDAgMCAwLS43OC0uMzhIMTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAxM3Y1YTEgMSAwIDAgMCAxIDFoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk00IDMgMi4xNSA1LjE1YS40OTUuNDk1IDAgMCAwIC4zNS44NmgyLjE1YS40Ny40NyAwIDAgMSAuMzUuODZMMyA5LjAyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTciLCBjeTogIjE5IiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI3IiwgY3k6ICIxOSIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJ1Y2suanMKdmFyIFRydWNrOwp2YXIgaW5pdF90cnVjayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJ1Y2suanMiKCkgewogICAgVHJ1Y2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNCAxOFY2YTIgMiAwIDAgMC0yLTJINGEyIDIgMCAwIDAtMiAydjExYTEgMSAwIDAgMCAxIDFoMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxOEg5IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMTkgMThoMmExIDEgMCAwIDAgMS0xdi0zLjY1YTEgMSAwIDAgMC0uMjItLjYyNGwtMy40OC00LjM1QTEgMSAwIDAgMCAxNy41MiA4SDE0IiB9CiAgICAgIF0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE3IiwgY3k6ICIxOCIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNyIsIGN5OiAiMTgiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3R1cmtpc2gtbGlyYS5qcwp2YXIgVHVya2lzaExpcmE7CnZhciBpbml0X3R1cmtpc2hfbGlyYSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHVya2lzaC1saXJhLmpzIigpIHsKICAgIFR1cmtpc2hMaXJhID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUgNCA1IDkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgOC41LTEwIDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggMTJhOSA5IDAgMCAxLTkgOVYzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHVybnRhYmxlLmpzCnZhciBUdXJudGFibGU7CnZhciBpbml0X3R1cm50YWJsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHVybnRhYmxlLmpzIigpIHsKICAgIFR1cm50YWJsZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDEyLjAxaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCA4djRhOCA4IDAgMCAxLTEuMDcgNCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEwIiwgY3k6ICIxMiIsIHI6ICI0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMiIsIHk6ICI0Iiwgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE2Iiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHVydGxlLmpzCnZhciBUdXJ0bGU7CnZhciBpbml0X3R1cnRsZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHVydGxlLmpzIigpIHsKICAgIFR1cnRsZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTEyIDEwIDIgNHYzYTEgMSAwIDAgMCAxIDFoMmExIDEgMCAwIDAgMS0xdi0zYTggOCAwIDEgMC0xNiAwdjNhMSAxIDAgMCAwIDEgMWgyYTEgMSAwIDAgMCAxLTF2LTNsMi00aDRaIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQuODIgNy45IDggMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTUuMTggNy45IDEyIDEwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2LjkzIDEwSDIwYTIgMiAwIDAgMSAwIDRIMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3R2LW1pbmltYWwtcGxheS5qcwp2YXIgVHZNaW5pbWFsUGxheTsKdmFyIGluaXRfdHZfbWluaW1hbF9wbGF5ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90di1taW5pbWFsLXBsYXkuanMiKCkgewogICAgVHZNaW5pbWFsUGxheSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE1LjAzMyA5LjQ0YS42NDcuNjQ3IDAgMCAxIDAgMS4xMmwtNC4wNjUgMi4zNTJhLjY0NS42NDUgMCAwIDEtLjk2OC0uNTZWNy42NDhhLjY0NS42NDUgMCAwIDEgLjk2Ny0uNTZ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjFoMTAiIH1dLAogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiMjAiLCBoZWlnaHQ6ICIxNCIsIHg6ICIyIiwgeTogIjMiLCByeDogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90di1taW5pbWFsLmpzCnZhciBUdk1pbmltYWw7CnZhciBpbml0X3R2X21pbmltYWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3R2LW1pbmltYWwuanMiKCkgewogICAgVHZNaW5pbWFsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAyMWgxMCIgfV0sCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE0IiwgeDogIjIiLCB5OiAiMyIsIHJ4OiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3R2LmpzCnZhciBUdjsKdmFyIGluaXRfdHYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3R2LmpzIigpIHsKICAgIFR2ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMi01IDUtNS01IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTUiLCB4OiAiMiIsIHk6ICI3Iiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHdpdGNoLmpzCnZhciBUd2l0Y2g7CnZhciBpbml0X3R3aXRjaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHdpdGNoLmpzIigpIHsKICAgIFR3aXRjaCA9IFtbInBhdGgiLCB7IGQ6ICJNMjEgMkgzdjE2aDV2NGw0LTRoNWw0LTRWMnptLTEwIDlWN201IDRWNyIgfV1dOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90d2l0dGVyLmpzCnZhciBUd2l0dGVyOwp2YXIgaW5pdF90d2l0dGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90d2l0dGVyLmpzIigpIHsKICAgIFR3aXR0ZXIgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMiA0cy0uNyAyLjEtMiAzLjRjMS42IDEwLTkuNCAxNy4zLTE4IDExLjYgMi4yLjEgNC40LS42IDYtMkMzIDE1LjUuNSA5LjYgMyA1YzIuMiAyLjYgNS42IDQuMSA5IDQtLjktNC4yIDQtNi42IDctMy44IDEuMSAwIDMtMS4yIDMtMS4yeiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3R5cGUtb3V0bGluZS5qcwp2YXIgVHlwZU91dGxpbmU7CnZhciBpbml0X3R5cGVfb3V0bGluZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdHlwZS1vdXRsaW5lLmpzIigpIHsKICAgIFR5cGVPdXRsaW5lID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTQgMTYuNWEuNS41IDAgMCAwIC41LjVoLjVhMiAyIDAgMCAxIDAgNEg5YTIgMiAwIDAgMSAwLTRoLjVhLjUuNSAwIDAgMCAuNS0uNXYtOWEuNS41IDAgMCAwLS41LS41aC0zYS41LjUgMCAwIDAtLjUuNVY4YTIgMiAwIDAgMS00IDBWNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ2M2EyIDIgMCAwIDEtNCAwdi0uNWEuNS41IDAgMCAwLS41LS41aC0zYS41LjUgMCAwIDAtLjUuNVoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90eXBlLmpzCnZhciBUeXBlOwp2YXIgaW5pdF90eXBlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy90eXBlLmpzIigpIHsKICAgIFR5cGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA0djE2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgN1Y1YTEgMSAwIDAgMSAxLTFoMTRhMSAxIDAgMCAxIDEgMXYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMjBoNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VtYnJlbGxhLmpzCnZhciBVbWJyZWxsYTsKdmFyIGluaXRfdW1icmVsbGEgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VtYnJlbGxhLmpzIigpIHsKICAgIFVtYnJlbGxhID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTN2N2EyIDIgMCAwIDAgNCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC45OTIgMTNhMSAxIDAgMCAwIC45Ny0xLjI3NCAxMC4yODQgMTAuMjg0IDAgMCAwLTE5LjkyMyAwQTEgMSAwIDAgMCAzIDEzeiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VtYnJlbGxhLW9mZi5qcwp2YXIgVW1icmVsbGFPZmY7CnZhciBpbml0X3VtYnJlbGxhX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdW1icmVsbGEtb2ZmLmpzIigpIHsKICAgIFVtYnJlbGxhT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTN2N2EyIDIgMCAwIDAgNCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDJ2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOC42NTYgMTNoMi4zMzZhMSAxIDAgMCAwIC45Ny0xLjI3NCAxMC4yODQgMTAuMjg0IDAgMCAwLTEyLjA3LTcuNTEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUuOTYxIDUuOTU3YTEwLjI4IDEwLjI4IDAgMCAwLTMuOTIyIDUuNzY5QTEgMSAwIDAgMCAzIDEzaDEwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5kZXJsaW5lLmpzCnZhciBVbmRlcmxpbmU7CnZhciBpbml0X3VuZGVybGluZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5kZXJsaW5lLmpzIigpIHsKICAgIFVuZGVybGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgNHY2YTYgNiAwIDAgMCAxMiAwVjQiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiNCIsIHgyOiAiMjAiLCB5MTogIjIwIiwgeTI6ICIyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VuZG8tMi5qcwp2YXIgVW5kbzI7CnZhciBpbml0X3VuZG9fMiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5kby0yLmpzIigpIHsKICAgIFVuZG8yID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOSAxNCA0IDlsNS01IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgOWgxMC41YTUuNSA1LjUgMCAwIDEgNS41IDUuNWE1LjUgNS41IDAgMCAxLTUuNSA1LjVIMTEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91bmRvLWRvdC5qcwp2YXIgVW5kb0RvdDsKdmFyIGluaXRfdW5kb19kb3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VuZG8tZG90LmpzIigpIHsKICAgIFVuZG9Eb3QgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxN2E5IDkgMCAwIDAtMTUtNi43TDMgMTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA3djZoNiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxNyIsIHI6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5kby5qcwp2YXIgVW5kbzsKdmFyIGluaXRfdW5kbyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5kby5qcyIoKSB7CiAgICBVbmRvID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA3djZoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxN2E5IDkgMCAwIDAtOS05IDkgOSAwIDAgMC02IDIuM0wzIDEzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5mb2xkLWhvcml6b250YWwuanMKdmFyIFVuZm9sZEhvcml6b250YWw7CnZhciBpbml0X3VuZm9sZF9ob3Jpem9udGFsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91bmZvbGQtaG9yaXpvbnRhbC5qcyIoKSB7CiAgICBVbmZvbGRIb3Jpem9udGFsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTJoNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDEySDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDh2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIwdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkgMTUgMy0zLTMtMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm01IDktMyAzIDMgMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VuZm9sZC12ZXJ0aWNhbC5qcwp2YXIgVW5mb2xkVmVydGljYWw7CnZhciBpbml0X3VuZm9sZF92ZXJ0aWNhbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5mb2xkLXZlcnRpY2FsLmpzIigpIHsKICAgIFVuZm9sZFZlcnRpY2FsID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjJ2LTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgOFYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTQgMTJIMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMCAxMkg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDEyaC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDEyaC0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1IDE5LTMgMy0zLTMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUgNS0zLTMtMyAzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5ncm91cC5qcwp2YXIgVW5ncm91cDsKdmFyIGluaXRfdW5ncm91cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5ncm91cC5qcyIoKSB7CiAgICBVbmdyb3VwID0gWwogICAgICBbInJlY3QiLCB7IHdpZHRoOiAiOCIsIGhlaWdodDogIjYiLCB4OiAiNSIsIHk6ICI0Iiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICI2IiwgeDogIjExIiwgeTogIjE0Iiwgcng6ICIxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5pdmVyc2l0eS5qcwp2YXIgVW5pdmVyc2l0eTsKdmFyIGluaXRfdW5pdmVyc2l0eSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5pdmVyc2l0eS5qcyIoKSB7CiAgICBVbml2ZXJzaXR5ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgMjF2LTNhMiAyIDAgMCAwLTQgMHYzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDEyaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxNmguMDEiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjIgN2ExIDEgMCAwIDAtMS0xaC0yYTIgMiAwIDAgMS0xLjE0My0uMzU5TDEzLjE0MyAyLjM2YTIgMiAwIDAgMC0yLjI4Ni0uMDAxTDYuMTQzIDUuNjRBMiAyIDAgMCAxIDUgNkgzYTEgMSAwIDAgMC0xIDF2MTJhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0yeiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEyaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDE2aC4wMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMCIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5saW5rLmpzCnZhciBVbmxpbms7CnZhciBpbml0X3VubGluayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5saW5rLmpzIigpIHsKICAgIFVubGluayA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTE4Ljg0IDEyLjI1IDEuNzItMS43MWgtLjAyYTUuMDA0IDUuMDA0IDAgMCAwLS4xMi03LjA3IDUuMDA2IDUuMDA2IDAgMCAwLTYuOTUgMGwtMS43MiAxLjcxIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJtNS4xNyAxMS43NS0xLjcxIDEuNzFhNS4wMDQgNS4wMDQgMCAwIDAgLjEyIDcuMDcgNS4wMDYgNS4wMDYgMCAwIDAgNi45NSAwbDEuNzEtMS43MSIgfQogICAgICBdLAogICAgICBbImxpbmUiLCB7IHgxOiAiOCIsIHgyOiAiOCIsIHkxOiAiMiIsIHkyOiAiNSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIyIiwgeDI6ICI1IiwgeTE6ICI4IiwgeTI6ICI4IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE2IiwgeDI6ICIxNiIsIHkxOiAiMTkiLCB5MjogIjIyIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE5IiwgeDI6ICIyMiIsIHkxOiAiMTYiLCB5MjogIjE2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5wbHVnLmpzCnZhciBVbnBsdWc7CnZhciBpbml0X3VucGx1ZyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5wbHVnLmpzIigpIHsKICAgIFVucGx1ZyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5IDUgMy0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMjIgMy0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYuMyAyMC4zYTIuNCAyLjQgMCAwIDAgMy40IDBMMTIgMThsLTYtNi0yLjMgMi4zYTIuNCAyLjQgMCAwIDAgMCAzLjRaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcuNSAxMy41IDEwIDExIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjUgMTYuNSAxMyAxNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMiA2IDYgNiAyLjMtMi4zYTIuNCAyLjQgMCAwIDAgMC0zLjRsLTIuNi0yLjZhMi40IDIuNCAwIDAgMC0zLjQgMFoiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91bmxpbmstMi5qcwp2YXIgVW5saW5rMjsKdmFyIGluaXRfdW5saW5rXzIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VubGluay0yLmpzIigpIHsKICAgIFVubGluazIgPSBbWyJwYXRoIiwgeyBkOiAiTTE1IDdoMmE1IDUgMCAwIDEgMCAxMGgtMm0tNiAwSDdBNSA1IDAgMCAxIDcgN2gyIiB9XV07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VwbG9hZC5qcwp2YXIgVXBsb2FkOwp2YXIgaW5pdF91cGxvYWQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VwbG9hZC5qcyIoKSB7CiAgICBVcGxvYWQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAzdjEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE3IDgtNS01LTUgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNiLmpzCnZhciBVc2I7CnZhciBpbml0X3VzYiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNiLmpzIigpIHsKICAgIFVzYiA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTAiLCBjeTogIjciLCByOiAiMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjQiLCBjeTogIjIwIiwgcjogIjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC43IDE5LjMgMTkgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAzLTMgMSAyIDJaIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuMjYgNy42OCA1IDEybDIgNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMCAxNCA1IDIgMy41LTMuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOCAxMiAxLTEgMSAxLTEgMVoiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2VyLWNoZWNrLmpzCnZhciBVc2VyQ2hlY2s7CnZhciBpbml0X3VzZXJfY2hlY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXItY2hlY2suanMiKCkgewogICAgVXNlckNoZWNrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTEgMiAyIDQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAyMXYtMmE0IDQgMCAwIDAtNC00SDZhNCA0IDAgMCAwLTQgNHYyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOSIsIGN5OiAiNyIsIHI6ICI0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1jb2cuanMKdmFyIFVzZXJDb2c7CnZhciBpbml0X3VzZXJfY29nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2VyLWNvZy5qcyIoKSB7CiAgICBVc2VyQ29nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTVINmE0IDQgMCAwIDAtNCA0djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuMzA1IDE2LjUzLjkyMy0uMzgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1LjIyOCAxMy44NTItLjkyMy0uMzgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2Ljg1MiAxMi4yMjgtLjM4My0uOTIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2Ljg1MiAxNy43NzItLjM4My45MjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkuMTQ4IDEyLjIyOC4zODMtLjkyMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOS41MyAxOC42OTYtLjM4Mi0uOTI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwLjc3MiAxMy44NTIuOTI0LS4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAuNzcyIDE2LjE0OC45MjQuMzgzIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjE1IiwgcjogIjMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI5IiwgY3k6ICI3IiwgcjogIjQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2VyLWtleS5qcwp2YXIgVXNlcktleTsKdmFyIGluaXRfdXNlcl9rZXkgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXIta2V5LmpzIigpIHsKICAgIFVzZXJLZXkgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxMXY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDEzaDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAyMXYtMmE0IDQgMCAwIDEgNC00aDZhNCA0IDAgMCAxIDIuMDcyLjU3OCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEwIiwgY3k6ICI3IiwgcjogIjQiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIyMCIsIGN5OiAiMTkiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXItbG9jay5qcwp2YXIgVXNlckxvY2s7CnZhciBpbml0X3VzZXJfbG9jayA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1sb2NrLmpzIigpIHsKICAgIFVzZXJMb2NrID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMTZ2LTJhMiAyIDAgMCAwLTQgMHYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkuNSAxNUg3YTQgNCAwIDAgMC00IDR2MiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEwIiwgY3k6ICI3IiwgcjogIjQiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIxMyIsIHk6ICIxNiIsIHdpZHRoOiAiOCIsIGhlaWdodDogIjUiLCByeDogIi44OTkiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2VyLW1pbnVzLmpzCnZhciBVc2VyTWludXM7CnZhciBpbml0X3VzZXJfbWludXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXItbWludXMuanMiKCkgewogICAgVXNlck1pbnVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMjF2LTJhNCA0IDAgMCAwLTQtNEg2YTQgNCAwIDAgMC00IDR2MiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjciLCByOiAiNCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIyMiIsIHgyOiAiMTYiLCB5MTogIjExIiwgeTI6ICIxMSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXItcGx1cy5qcwp2YXIgVXNlclBsdXM7CnZhciBpbml0X3VzZXJfcGx1cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1wbHVzLmpzIigpIHsKICAgIFVzZXJQbHVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMjF2LTJhNCA0IDAgMCAwLTQtNEg2YTQgNCAwIDAgMC00IDR2MiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjciLCByOiAiNCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxOSIsIHgyOiAiMTkiLCB5MTogIjgiLCB5MjogIjE0IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjIyIiwgeDI6ICIxNiIsIHkxOiAiMTEiLCB5MjogIjExIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1wZW4uanMKdmFyIFVzZXJQZW47CnZhciBpbml0X3VzZXJfcGVuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2VyLXBlbi5qcyIoKSB7CiAgICBVc2VyUGVuID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEuNSAxNUg3YTQgNCAwIDAgMC00IDR2MiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMS4zNzggMTYuNjI2YTEgMSAwIDAgMC0zLjAwNC0zLjAwNGwtNC4wMSA0LjAxMmEyIDIgMCAwIDAtLjUwNi44NTRsLS44MzcgMi44N2EuNS41IDAgMCAwIC42Mi42MmwyLjg3LS44MzdhMiAyIDAgMCAwIC44NTQtLjUwNnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMCIsIGN5OiAiNyIsIHI6ICI0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1yb3VuZC1jaGVjay5qcwp2YXIgVXNlclJvdW5kQ2hlY2s7CnZhciBpbml0X3VzZXJfcm91bmRfY2hlY2sgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXItcm91bmQtY2hlY2suanMiKCkgewogICAgVXNlclJvdW5kQ2hlY2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIxYTggOCAwIDAgMSAxMy4yOTItNiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEwIiwgY3k6ICI4IiwgcjogIjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTkgMiAyIDQtNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXItcm91bmQtY29nLmpzCnZhciBVc2VyUm91bmRDb2c7CnZhciBpbml0X3VzZXJfcm91bmRfY29nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2VyLXJvdW5kLWNvZy5qcyIoKSB7CiAgICBVc2VyUm91bmRDb2cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNC4zMDUgMTkuNTMuOTIzLS4zODIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTUuMjI4IDE2Ljg1Mi0uOTIzLS4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYuODUyIDE1LjIyOC0uMzgzLS45MjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYuODUyIDIwLjc3Mi0uMzgzLjkyNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOS4xNDggMTUuMjI4LjM4My0uOTIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE5LjUzIDIxLjY5Ni0uMzgyLS45MjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMWE4IDggMCAwIDEgMTAuNDM0LTcuNjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAuNzcyIDE2Ljg1Mi45MjQtLjM4MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMC43NzIgMTkuMTQ4LjkyNC4zODMiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMCIsIGN5OiAiOCIsIHI6ICI1IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjE4IiwgcjogIjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2VyLXJvdW5kLWtleS5qcwp2YXIgVXNlclJvdW5kS2V5Owp2YXIgaW5pdF91c2VyX3JvdW5kX2tleSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1yb3VuZC1rZXkuanMiKCkgewogICAgVXNlclJvdW5kS2V5ID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMTF2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAxM2gyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjFhOCA4IDAgMCAxIDEyLjg2OC02LjM0OSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEwIiwgY3k6ICI4IiwgcjogIjUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxOSIsIGN5OiAiMTkiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXItcm91bmQtbWludXMuanMKdmFyIFVzZXJSb3VuZE1pbnVzOwp2YXIgaW5pdF91c2VyX3JvdW5kX21pbnVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2VyLXJvdW5kLW1pbnVzLmpzIigpIHsKICAgIFVzZXJSb3VuZE1pbnVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMWE4IDggMCAwIDEgMTMuMjkyLTYiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMCIsIGN5OiAiOCIsIHI6ICI1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE5aC02IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1yb3VuZC1wZW4uanMKdmFyIFVzZXJSb3VuZFBlbjsKdmFyIGluaXRfdXNlcl9yb3VuZF9wZW4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXItcm91bmQtcGVuLmpzIigpIHsKICAgIFVzZXJSb3VuZFBlbiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjFhOCA4IDAgMCAxIDEwLjgyMS03LjQ4NyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMS4zNzggMTYuNjI2YTEgMSAwIDAgMC0zLjAwNC0zLjAwNGwtNC4wMSA0LjAxMmEyIDIgMCAwIDAtLjUwNi44NTRsLS44MzcgMi44N2EuNS41IDAgMCAwIC42Mi42MmwyLjg3LS44MzdhMiAyIDAgMCAwIC44NTQtLjUwNnoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMCIsIGN5OiAiOCIsIHI6ICI1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1yb3VuZC1wbHVzLmpzCnZhciBVc2VyUm91bmRQbHVzOwp2YXIgaW5pdF91c2VyX3JvdW5kX3BsdXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXItcm91bmQtcGx1cy5qcyIoKSB7CiAgICBVc2VyUm91bmRQbHVzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiAyMWE4IDggMCAwIDEgMTMuMjkyLTYiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMCIsIGN5OiAiOCIsIHI6ICI1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE2djYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTloLTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2VyLXJvdW5kLXNlYXJjaC5qcwp2YXIgVXNlclJvdW5kU2VhcmNoOwp2YXIgaW5pdF91c2VyX3JvdW5kX3NlYXJjaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1yb3VuZC1zZWFyY2guanMiKCkgewogICAgVXNlclJvdW5kU2VhcmNoID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMCIsIGN5OiAiOCIsIHI6ICI1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjFhOCA4IDAgMCAxIDEwLjQzNC03LjYyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTgiLCBjeTogIjE4IiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjIgMjItMS45LTEuOSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXItcm91bmQuanMKdmFyIFVzZXJSb3VuZDsKdmFyIGluaXRfdXNlcl9yb3VuZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1yb3VuZC5qcyIoKSB7CiAgICBVc2VyUm91bmQgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICI4IiwgcjogIjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgMjFhOCA4IDAgMCAwLTE2IDAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2VyLXJvdW5kLXguanMKdmFyIFVzZXJSb3VuZFg7CnZhciBpbml0X3VzZXJfcm91bmRfeCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1yb3VuZC14LmpzIigpIHsKICAgIFVzZXJSb3VuZFggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDIxYTggOCAwIDAgMSAxMS44NzMtNyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEwIiwgY3k6ICI4IiwgcjogIjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTcgMTcgNSA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDE3LTUgNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXItc2VhcmNoLmpzCnZhciBVc2VyU2VhcmNoOwp2YXIgaW5pdF91c2VyX3NlYXJjaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1zZWFyY2guanMiKCkgewogICAgVXNlclNlYXJjaCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTAiLCBjeTogIjciLCByOiAiNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC4zIDE1SDdhNCA0IDAgMCAwLTQgNHYyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTciLCBjeTogIjE3IiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjEgMjEtMS45LTEuOSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXItc3Rhci5qcwp2YXIgVXNlclN0YXI7CnZhciBpbml0X3VzZXJfc3RhciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1zdGFyLmpzIigpIHsKICAgIFVzZXJTdGFyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTYuMDUxIDEyLjYxNmExIDEgMCAwIDEgMS45MDkuMDI0bC43MzcgMS40NTJhMSAxIDAgMCAwIC43MzcuNTM1bDEuNjM0LjI1NmExIDEgMCAwIDEgLjU4OCAxLjgwNmwtMS4xNzIgMS4xNjhhMSAxIDAgMCAwLS4yODIuODY2bC4yNTkgMS42MTNhMSAxIDAgMCAxLTEuNTQxIDEuMTM0bC0xLjQ2NS0uNzVhMSAxIDAgMCAwLS45MTIgMGwtMS40NjUuNzVhMSAxIDAgMCAxLTEuNTM5LTEuMTMzbC4yNTgtMS42MTNhMSAxIDAgMCAwLS4yODItLjg2NmwtMS4xNTYtMS4xNTNhMSAxIDAgMCAxIC41NzItMS44MjJsMS42MzMtLjI1NmExIDEgMCAwIDAgLjczNy0uNTM1eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDE1SDdhNCA0IDAgMCAwLTQgNHYyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTAiLCBjeTogIjciLCByOiAiNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXIteC5qcwp2YXIgVXNlclg7CnZhciBpbml0X3VzZXJfeCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci14LmpzIigpIHsKICAgIFVzZXJYID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMjF2LTJhNCA0IDAgMCAwLTQtNEg2YTQgNCAwIDAgMC00IDR2MiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjciLCByOiAiNCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNyIsIHgyOiAiMjIiLCB5MTogIjgiLCB5MjogIjEzIiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjIyIiwgeDI6ICIxNyIsIHkxOiAiOCIsIHkyOiAiMTMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2VyLmpzCnZhciBVc2VyOwp2YXIgaW5pdF91c2VyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2VyLmpzIigpIHsKICAgIFVzZXIgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOSAyMXYtMmE0IDQgMCAwIDAtNC00SDlhNCA0IDAgMCAwLTQgNHYyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjciLCByOiAiNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXJzLXJvdW5kLmpzCnZhciBVc2Vyc1JvdW5kOwp2YXIgaW5pdF91c2Vyc19yb3VuZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlcnMtcm91bmQuanMiKCkgewogICAgVXNlcnNSb3VuZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDIxYTggOCAwIDAgMC0xNiAwIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTAiLCBjeTogIjgiLCByOiAiNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMiAyMGMwLTMuMzctMi02LjUtNC04YTUgNSAwIDAgMC0uNDUtOC4zIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXRlbnNpbHMtY3Jvc3NlZC5qcwp2YXIgVXRlbnNpbHNDcm9zc2VkOwp2YXIgaW5pdF91dGVuc2lsc19jcm9zc2VkID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91dGVuc2lscy1jcm9zc2VkLmpzIigpIHsKICAgIFV0ZW5zaWxzQ3Jvc3NlZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2IDItMi4zIDIuM2EzIDMgMCAwIDAgMCA0LjJsMS44IDEuOGEzIDMgMCAwIDAgNC4yIDBMMjIgOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxNSAzLjMgMy4zYTQuMiA0LjIgMCAwIDAgMCA2bDcuMyA3LjNjLjcuNyAyIC43IDIuOCAwTDE1IDE1Wm0wIDAgNyA3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIuMSAyMS44IDYuNC02LjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkgNS03IDciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2Vycy5qcwp2YXIgVXNlcnM7CnZhciBpbml0X3VzZXJzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2Vycy5qcyIoKSB7CiAgICBVc2VycyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDIxdi0yYTQgNCAwIDAgMC00LTRINmE0IDQgMCAwIDAtNCA0djIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMy4xMjhhNCA0IDAgMCAxIDAgNy43NDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMjF2LTJhNCA0IDAgMCAwLTMtMy44NyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjkiLCBjeTogIjciLCByOiAiNCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3V0aWxpdHktcG9sZS5qcwp2YXIgVXRpbGl0eVBvbGU7CnZhciBpbml0X3V0aWxpdHlfcG9sZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdXRpbGl0eS1wb2xlLmpzIigpIHsKICAgIFV0aWxpdHlQb2xlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnYyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDVoMjAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyAzdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAzdjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcgM3YyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDN2MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOSA1LTcgNy03LTciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91dGVuc2lscy5qcwp2YXIgVXRlbnNpbHM7CnZhciBpbml0X3V0ZW5zaWxzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy91dGVuc2lscy5qcyIoKSB7CiAgICBVdGVuc2lscyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMnY3YzAgMS4xLjkgMiAyIDJoNGEyIDIgMCAwIDAgMi0yVjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAydjIwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE1VjJhNSA1IDAgMCAwLTUgNXY2YzAgMS4xLjkgMiAyIDJoM1ptMCAwdjciIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy92YW4uanMKdmFyIFZhbjsKdmFyIGluaXRfdmFuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy92YW4uanMiKCkgewogICAgVmFuID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTMgNnY1YTEgMSAwIDAgMCAxIDFoNi4xMDJhMSAxIDAgMCAxIC43MTIuMjk4bC44OTguOTFhMSAxIDAgMCAxIC4yODguNzAyVjE3YTEgMSAwIDAgMS0xIDFoLTMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxOEgzYTEgMSAwIDAgMS0xLTFWOGEyIDIgMCAwIDEgMi0yaDEyYzEuMSAwIDIuMS44IDIuNCAxLjhsMS4xNzYgNC4yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMThoNSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE2IiwgY3k6ICIxOCIsIHI6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNyIsIGN5OiAiMTgiLCByOiAiMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZhcmlhYmxlLmpzCnZhciBWYXJpYWJsZTsKdmFyIGluaXRfdmFyaWFibGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZhcmlhYmxlLmpzIigpIHsKICAgIFZhcmlhYmxlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAyMXMtNC0zLTQtOSA0LTkgNC05IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDNzNCAzIDQgOS00IDktNCA5IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjE1IiwgeDI6ICI5IiwgeTE6ICI5IiwgeTI6ICIxNSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI5IiwgeDI6ICIxNSIsIHkxOiAiOSIsIHkyOiAiMTUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy92ZWN0b3Itc3F1YXJlLmpzCnZhciBWZWN0b3JTcXVhcmU7CnZhciBpbml0X3ZlY3Rvcl9zcXVhcmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZlY3Rvci1zcXVhcmUuanMiKCkgewogICAgVmVjdG9yU3F1YXJlID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkuNSA3YTI0IDI0IDAgMCAxIDAgMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNC41IDdhMjQgMjQgMCAwIDAgMCAxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE5LjVhMjQgMjQgMCAwIDAgMTAgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDQuNWEyNCAyNCAwIDAgMSAxMCAwIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMTciLCB5OiAiMTciLCB3aWR0aDogIjUiLCBoZWlnaHQ6ICI1Iiwgcng6ICIxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMTciLCB5OiAiMiIsIHdpZHRoOiAiNSIsIGhlaWdodDogIjUiLCByeDogIjEiIH1dLAogICAgICBbInJlY3QiLCB7IHg6ICIyIiwgeTogIjE3Iiwgd2lkdGg6ICI1IiwgaGVpZ2h0OiAiNSIsIHJ4OiAiMSIgfV0sCiAgICAgIFsicmVjdCIsIHsgeDogIjIiLCB5OiAiMiIsIHdpZHRoOiAiNSIsIGhlaWdodDogIjUiLCByeDogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy92YXVsdC5qcwp2YXIgVmF1bHQ7CnZhciBpbml0X3ZhdWx0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy92YXVsdC5qcyIoKSB7CiAgICBWYXVsdCA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMTgiLCB4OiAiMyIsIHk6ICIzIiwgcng6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNy41IiwgY3k6ICI3LjUiLCByOiAiLjUiLCBmaWxsOiAiY3VycmVudENvbG9yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcuOSA3LjkgMi43IDIuNyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE2LjUiLCBjeTogIjcuNSIsIHI6ICIuNSIsIGZpbGw6ICJjdXJyZW50Q29sb3IiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTMuNCAxMC42IDIuNy0yLjciIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI3LjUiLCBjeTogIjE2LjUiLCByOiAiLjUiLCBmaWxsOiAiY3VycmVudENvbG9yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTcuOSAxNi4xIDIuNy0yLjciIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxNi41IiwgY3k6ICIxNi41IiwgcjogIi41IiwgZmlsbDogImN1cnJlbnRDb2xvciIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMy40IDEzLjQgMi43IDIuNyIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMiIsIHI6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdmVnYW4uanMKdmFyIFZlZ2FuOwp2YXIgaW5pdF92ZWdhbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdmVnYW4uanMiKCkgewogICAgVmVnYW4gPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA4cTYgMCA2LTYtNiAwLTYgNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy40MSAzLjU5YTEwIDEwIDAgMSAwIDMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDJhMjYuNiAyNi42IDAgMCAxIDEwIDIwYy45LTYuODIgMS41LTkuNSA0LTE0IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdmVuZXRpYW4tbWFzay5qcwp2YXIgVmVuZXRpYW5NYXNrOwp2YXIgaW5pdF92ZW5ldGlhbl9tYXNrID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy92ZW5ldGlhbi1tYXNrLmpzIigpIHsKICAgIFZlbmV0aWFuTWFzayA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDExYy0xLjUgMC0yLjUuNS0zIDIiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNCA2YTIgMiAwIDAgMC0yIDJ2NGE1IDUgMCAwIDAgNSA1IDggOCAwIDAgMSA1IDIgOCA4IDAgMCAxIDUtMiA1IDUgMCAwIDAgNS01VjhhMiAyIDAgMCAwLTItMmgtM2E4IDggMCAwIDAtNSAyIDggOCAwIDAgMC01LTJ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTFjMS41IDAgMi41LjUgMyAyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdmVudXMtYW5kLW1hcnMuanMKdmFyIFZlbnVzQW5kTWFyczsKdmFyIGluaXRfdmVudXNfYW5kX21hcnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZlbnVzLWFuZC1tYXJzLmpzIigpIHsKICAgIFZlbnVzQW5kTWFycyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDIwaDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTZ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAyaDR2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yMSAyLTUuNDYgNS40NiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMSIsIHI6ICI1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdmVudXMuanMKdmFyIFZlbnVzOwp2YXIgaW5pdF92ZW51cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdmVudXMuanMiKCkgewogICAgVmVudXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNXY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMTloNiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICI5IiwgcjogIjYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy92aWJyYXRlLW9mZi5qcwp2YXIgVmlicmF0ZU9mZjsKdmFyIGluaXRfdmlicmF0ZV9vZmYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZpYnJhdGUtb2ZmLmpzIigpIHsKICAgIFZpYnJhdGVPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDggMiAyLTIgMiAyIDItMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDgtMiAyIDIgMi0yIDIgMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggOHYxMGMwIC41NS40NSAxIDEgMWg2Yy41NSAwIDEtLjQ1IDEtMXYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiAxMC4zNFY2YzAtLjU1LS40NS0xLTEtMWgtNC4zNCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIyIiwgeDI6ICIyMiIsIHkxOiAiMiIsIHkyOiAiMjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy92aWJyYXRlLmpzCnZhciBWaWJyYXRlOwp2YXIgaW5pdF92aWJyYXRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy92aWJyYXRlLmpzIigpIHsKICAgIFZpYnJhdGUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDggMiAyLTIgMiAyIDItMiAyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDgtMiAyIDIgMi0yIDIgMiAyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICIxNCIsIHg6ICI4IiwgeTogIjUiLCByeDogIjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy92aWRlby1vZmYuanMKdmFyIFZpZGVvT2ZmOwp2YXIgaW5pdF92aWRlb19vZmYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZpZGVvLW9mZi5qcyIoKSB7CiAgICBWaWRlb09mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjY2IDZIMTRhMiAyIDAgMCAxIDIgMnYyLjVsNS4yNDgtMy4wNjJBLjUuNSAwIDAgMSAyMiA3Ljg3djguMTk2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDE2YTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjhhMiAyIDAgMCAxIDItMmgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIgMiAyMCAyMCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZpZGVvLmpzCnZhciBWaWRlbzsKdmFyIGluaXRfdmlkZW8gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZpZGVvLmpzIigpIHsKICAgIFZpZGVvID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTYgMTMgNS4yMjMgMy40ODJhLjUuNSAwIDAgMCAuNzc3LS40MTZWNy44N2EuNS41IDAgMCAwLS43NTItLjQzMkwxNiAxMC41IiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMiIsIHk6ICI2Iiwgd2lkdGg6ICIxNCIsIGhlaWdodDogIjEyIiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdmlkZW90YXBlLmpzCnZhciBWaWRlb3RhcGU7CnZhciBpbml0X3ZpZGVvdGFwZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdmlkZW90YXBlLmpzIigpIHsKICAgIFZpZGVvdGFwZSA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjIwIiwgaGVpZ2h0OiAiMTYiLCB4OiAiMiIsIHk6ICI0Iiwgcng6ICIyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgOGgyMCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjgiLCBjeTogIjE0IiwgcjogIjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAxMmg4IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTYiLCBjeTogIjE0IiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy92aWV3LmpzCnZhciBWaWV3Owp2YXIgaW5pdF92aWV3ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy92aWV3LmpzIigpIHsKICAgIFZpZXcgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAxN3YyYTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi0yIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDdWNWEyIDIgMCAwIDAtMi0ySDVhMiAyIDAgMCAwLTIgMnYyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTguOTQ0IDEyLjMzYTEgMSAwIDAgMCAwLS42NiA3LjUgNy41IDAgMCAwLTEzLjg4OCAwIDEgMSAwIDAgMCAwIC42NiA3LjUgNy41IDAgMCAwIDEzLjg4OCAwIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdm9pY2VtYWlsLmpzCnZhciBWb2ljZW1haWw7CnZhciBpbml0X3ZvaWNlbWFpbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdm9pY2VtYWlsLmpzIigpIHsKICAgIFZvaWNlbWFpbCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNiIsIGN5OiAiMTIiLCByOiAiNCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICIxMiIsIHI6ICI0IiB9XSwKICAgICAgWyJsaW5lIiwgeyB4MTogIjYiLCB4MjogIjE4IiwgeTE6ICIxNiIsIHkyOiAiMTYiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy92b2xsZXliYWxsLmpzCnZhciBWb2xsZXliYWxsOwp2YXIgaW5pdF92b2xsZXliYWxsID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy92b2xsZXliYWxsLmpzIigpIHsKICAgIFZvbGxleWJhbGwgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMS4xIDcuMWExNi41NSAxNi41NSAwIDAgMSAxMC45IDQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTJhMTIuNiAxMi42IDAgMCAxLTguNyA1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2LjggMTMuNmExNi41NSAxNi41NSAwIDAgMS05IDcuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC43IDE3YTEyLjggMTIuOCAwIDAgMC04LjctNSAxMy4zIDEzLjMgMCAwIDEgMC0xMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02LjMgMy44YTE2LjU1IDE2LjU1IDAgMCAwIDEuOSAxMS41IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEyIiwgcjogIjEwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdm9sdW1lLTEuanMKdmFyIFZvbHVtZTE7CnZhciBpbml0X3ZvbHVtZV8xID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy92b2x1bWUtMS5qcyIoKSB7CiAgICBWb2x1bWUxID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEgNC43MDJhLjcwNS43MDUgMCAwIDAtMS4yMDMtLjQ5OEw2LjQxMyA3LjU4N0ExLjQgMS40IDAgMCAxIDUuNDE2IDhIM2ExIDEgMCAwIDAtMSAxdjZhMSAxIDAgMCAwIDEgMWgyLjQxNmExLjQgMS40IDAgMCAxIC45OTcuNDEzbDMuMzgzIDMuMzg0QS43MDUuNzA1IDAgMCAwIDExIDE5LjI5OHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgOWE1IDUgMCAwIDEgMCA2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdm9sdW1lLTIuanMKdmFyIFZvbHVtZTI7CnZhciBpbml0X3ZvbHVtZV8yID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy92b2x1bWUtMi5qcyIoKSB7CiAgICBWb2x1bWUyID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEgNC43MDJhLjcwNS43MDUgMCAwIDAtMS4yMDMtLjQ5OEw2LjQxMyA3LjU4N0ExLjQgMS40IDAgMCAxIDUuNDE2IDhIM2ExIDEgMCAwIDAtMSAxdjZhMSAxIDAgMCAwIDEgMWgyLjQxNmExLjQgMS40IDAgMCAxIC45OTcuNDEzbDMuMzgzIDMuMzg0QS43MDUuNzA1IDAgMCAwIDExIDE5LjI5OHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgOWE1IDUgMCAwIDEgMCA2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5LjM2NCAxOC4zNjRhOSA5IDAgMCAwIDAtMTIuNzI4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdm9sdW1lLXguanMKdmFyIFZvbHVtZVg7CnZhciBpbml0X3ZvbHVtZV94ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy92b2x1bWUteC5qcyIoKSB7CiAgICBWb2x1bWVYID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTEgNC43MDJhLjcwNS43MDUgMCAwIDAtMS4yMDMtLjQ5OEw2LjQxMyA3LjU4N0ExLjQgMS40IDAgMCAxIDUuNDE2IDhIM2ExIDEgMCAwIDAtMSAxdjZhMSAxIDAgMCAwIDEgMWgyLjQxNmExLjQgMS40IDAgMCAxIC45OTcuNDEzbDMuMzgzIDMuMzg0QS43MDUuNzA1IDAgMCAwIDExIDE5LjI5OHoiCiAgICAgICAgfQogICAgICBdLAogICAgICBbImxpbmUiLCB7IHgxOiAiMjIiLCB4MjogIjE2IiwgeTE6ICI5IiwgeTI6ICIxNSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIxNiIsIHgyOiAiMjIiLCB5MTogIjkiLCB5MjogIjE1IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdm9sdW1lLW9mZi5qcwp2YXIgVm9sdW1lT2ZmOwp2YXIgaW5pdF92b2x1bWVfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy92b2x1bWUtb2ZmLmpzIigpIHsKICAgIFZvbHVtZU9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE2IDlhNSA1IDAgMCAxIC45NSAyLjI5MyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOS4zNjQgNS42MzZhOSA5IDAgMCAxIDEuODg5IDkuOTYiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTcgNy0uNTg3LjU4N0ExLjQgMS40IDAgMCAxIDUuNDE2IDhIM2ExIDEgMCAwIDAtMSAxdjZhMSAxIDAgMCAwIDEgMWgyLjQxNmExLjQgMS40IDAgMCAxIC45OTcuNDEzbDMuMzgzIDMuMzg0QS43MDUuNzA1IDAgMCAwIDExIDE5LjI5OFYxMSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk05LjgyOCA0LjE3MkEuNjg2LjY4NiAwIDAgMSAxMSA0LjY1N3YuNjg2IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdm9sdW1lLmpzCnZhciBWb2x1bWU7CnZhciBpbml0X3ZvbHVtZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvdm9sdW1lLmpzIigpIHsKICAgIFZvbHVtZSA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTExIDQuNzAyYS43MDUuNzA1IDAgMCAwLTEuMjAzLS40OThMNi40MTMgNy41ODdBMS40IDEuNCAwIDAgMSA1LjQxNiA4SDNhMSAxIDAgMCAwLTEgMXY2YTEgMSAwIDAgMCAxIDFoMi40MTZhMS40IDEuNCAwIDAgMSAuOTk3LjQxM2wzLjM4MyAzLjM4NEEuNzA1LjcwNSAwIDAgMCAxMSAxOS4yOTh6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2FsbGV0LWNhcmRzLmpzCnZhciBXYWxsZXRDYXJkczsKdmFyIGluaXRfd2FsbGV0X2NhcmRzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93YWxsZXQtY2FyZHMuanMiKCkgewogICAgV2FsbGV0Q2FyZHMgPSBbCiAgICAgIFsicmVjdCIsIHsgd2lkdGg6ICIxOCIsIGhlaWdodDogIjE4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDlhMiAyIDAgMCAxIDItMmgxNGEyIDIgMCAwIDEgMiAyIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMyAxMWgzYy44IDAgMS42LjMgMi4xLjlsMS4xLjljMS42IDEuNiA0LjEgMS42IDUuNyAwbDEuMS0uOWMuNS0uNSAxLjMtLjkgMi4xLS45SDIxIiB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZvdGUuanMKdmFyIFZvdGU7CnZhciBpbml0X3ZvdGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZvdGUuanMiKCkgewogICAgVm90ZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTkgMTIgMiAyIDQtNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDdjMC0xLjEuOS0yIDItMmgxMGEyIDIgMCAwIDEgMiAydjEySDVWN1oiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgMTlIMiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dhbGxldC1taW5pbWFsLmpzCnZhciBXYWxsZXRNaW5pbWFsOwp2YXIgaW5pdF93YWxsZXRfbWluaW1hbCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2FsbGV0LW1pbmltYWwuanMiKCkgewogICAgV2FsbGV0TWluaW1hbCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDE0aC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDdoMTJhMiAyIDAgMCAxIDIgMnYxMGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93YWxsZXQuanMKdmFyIFdhbGxldDsKdmFyIGluaXRfd2FsbGV0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93YWxsZXQuanMiKCkgewogICAgV2FsbGV0ID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMTkgN1Y0YTEgMSAwIDAgMC0xLTFINWEyIDIgMCAwIDAgMCA0aDE1YTEgMSAwIDAgMSAxIDF2NGgtM2EyIDIgMCAwIDAgMCA0aDNhMSAxIDAgMCAwIDEtMXYtMmExIDEgMCAwIDAtMS0xIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgNXYxNGEyIDIgMCAwIDAgMiAyaDE1YTEgMSAwIDAgMCAxLTF2LTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93YWxscGFwZXIuanMKdmFyIFdhbGxwYXBlcjsKdmFyIGluaXRfd2FsbHBhcGVyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93YWxscGFwZXIuanMiKCkgewogICAgV2FsbHBhcGVyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTd2NCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIxaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSAxNyA2LjEtNi4xYTIgMiAwIDAgMSAyLjgxLjAxTDIyIDE1IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiOCIsIGN5OiAiOSIsIHI6ICIyIiB9XSwKICAgICAgWyJyZWN0IiwgeyB4OiAiMiIsIHk6ICIzIiwgd2lkdGg6ICIyMCIsIGhlaWdodDogIjE0Iiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2FuZC1zcGFya2xlcy5qcwp2YXIgV2FuZFNwYXJrbGVzOwp2YXIgaW5pdF93YW5kX3NwYXJrbGVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93YW5kLXNwYXJrbGVzLmpzIigpIHsKICAgIFdhbmRTcGFya2xlcyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTIxLjY0IDMuNjQtMS4yOC0xLjI4YTEuMjEgMS4yMSAwIDAgMC0xLjcyIDBMMi4zNiAxOC42NGExLjIxIDEuMjEgMCAwIDAgMCAxLjcybDEuMjggMS4yOGExLjIgMS4yIDAgMCAwIDEuNzIgMEwyMS42NCA1LjM2YTEuMiAxLjIgMCAwIDAgMC0xLjcyIgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE0IDcgMyAzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgNnY0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDE0djQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMnYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgOEgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxIDE2aC00IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDNIOSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dhbmQuanMKdmFyIFdhbmQ7CnZhciBpbml0X3dhbmQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dhbmQuanMiKCkgewogICAgV2FuZCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDRWMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAxNnYtMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDloMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCA5aDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuOCAxMS44IDE5IDEzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE1IDloLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3LjggNi4yIDE5IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMyAyMSA5LTkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIuMiA2LjIgMTEgNSIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dhcmVob3VzZS5qcwp2YXIgV2FyZWhvdXNlOwp2YXIgaW5pdF93YXJlaG91c2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dhcmVob3VzZS5qcyIoKSB7CiAgICBXYXJlaG91c2UgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAyMVYxMGExIDEgMCAwIDAtMS0xSDdhMSAxIDAgMCAwLTEgMXYxMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yMiAxOWEyIDIgMCAwIDEtMiAySDRhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAxLjEzMi0xLjgwM2w3Ljk1LTMuOTc0YTIgMiAwIDAgMSAxLjgzNyAwbDcuOTQ4IDMuOTc0QTIgMiAwIDAgMSAyMiA4eiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDEzaDEyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTdoMTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93YXNoaW5nLW1hY2hpbmUuanMKdmFyIFdhc2hpbmdNYWNoaW5lOwp2YXIgaW5pdF93YXNoaW5nX21hY2hpbmUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dhc2hpbmctbWFjaGluZS5qcyIoKSB7CiAgICBXYXNoaW5nTWFjaGluZSA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgNmgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE3IDZoLjAxIiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjE4IiwgaGVpZ2h0OiAiMjAiLCB4OiAiMyIsIHk6ICIyIiwgcng6ICIyIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjEzIiwgcjogIjUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMThhMi41IDIuNSAwIDAgMCAwLTUgMi41IDIuNSAwIDAgMSAwLTUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93YXRjaC5qcwp2YXIgV2F0Y2g7CnZhciBpbml0X3dhdGNoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93YXRjaC5qcyIoKSB7CiAgICBXYXRjaCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDEwdjIuMmwxLjYgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNi4xMyA3LjY2LS44MS00LjA1YTIgMiAwIDAgMC0yLTEuNjFoLTIuNjhhMiAyIDAgMCAwLTIgMS42MWwtLjc4IDQuMDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNy44OCAxNi4zNi44IDRhMiAyIDAgMCAwIDIgMS42MWgyLjcyYTIgMiAwIDAgMCAyLTEuNjFsLjgxLTQuMDUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTIiLCByOiAiNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dhdmVzLWFycm93LWRvd24uanMKdmFyIFdhdmVzQXJyb3dEb3duOwp2YXIgaW5pdF93YXZlc19hcnJvd19kb3duID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93YXZlcy1hcnJvdy1kb3duLmpzIigpIHsKICAgIFdhdmVzQXJyb3dEb3duID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMTBMMTIgMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA2TDEyIDEwTDggNiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yIDE1QzIuNiAxNS41IDMuMiAxNiA0LjUgMTZDNyAxNiA3IDE0IDkuNSAxNEMxMi4xIDE0IDExLjkgMTYgMTQuNSAxNkMxNyAxNiAxNyAxNCAxOS41IDE0QzIwLjggMTQgMjEuNCAxNC41IDIyIDE1IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIgMjFDMi42IDIxLjUgMy4yIDIyIDQuNSAyMkM3IDIyIDcgMjAgOS41IDIwQzEyLjEgMjAgMTEuOSAyMiAxNC41IDIyQzE3IDIyIDE3IDIwIDE5LjUgMjBDMjAuOCAyMCAyMS40IDIwLjUgMjIgMjEiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93YXZlcy1sYWRkZXIuanMKdmFyIFdhdmVzTGFkZGVyOwp2YXIgaW5pdF93YXZlc19sYWRkZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dhdmVzLWxhZGRlci5qcyIoKSB7CiAgICBXYXZlc0xhZGRlciA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDVhMiAyIDAgMCAwLTIgMnYxMSIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yIDE4Yy42LjUgMS4yIDEgMi41IDEgMi41IDAgMi41LTIgNS0yIDIuNiAwIDIuNCAyIDUgMiAyLjUgMCAyLjUtMiA1LTIgMS4zIDAgMS45LjUgMi41IDEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxM2gxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDloMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOSA1YTIgMiAwIDAgMC0yIDJ2MTEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93YXZlcy1hcnJvdy11cC5qcwp2YXIgV2F2ZXNBcnJvd1VwOwp2YXIgaW5pdF93YXZlc19hcnJvd191cCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2F2ZXMtYXJyb3ctdXAuanMiKCkgewogICAgV2F2ZXNBcnJvd1VwID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMnY4IiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTIgMTVjLjYuNSAxLjIgMSAyLjUgMSAyLjUgMCAyLjUtMiA1LTIgMi42IDAgMi40IDIgNSAyIDIuNSAwIDIuNS0yIDUtMiAxLjMgMCAxLjkuNSAyLjUgMSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yIDIxYy42LjUgMS4yIDEgMi41IDEgMi41IDAgMi41LTIgNS0yIDIuNiAwIDIuNCAyIDUgMiAyLjUgMCAyLjUtMiA1LTIgMS4zIDAgMS45LjUgMi41IDEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCA2IDQtNCA0IDQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93YXZlcy5qcwp2YXIgV2F2ZXM7CnZhciBpbml0X3dhdmVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93YXZlcy5qcyIoKSB7CiAgICBXYXZlcyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7IGQ6ICJNMiA2Yy42LjUgMS4yIDEgMi41IDFDNyA3IDcgNSA5LjUgNWMyLjYgMCAyLjQgMiA1IDIgMi41IDAgMi41LTIgNS0yIDEuMyAwIDEuOS41IDIuNSAxIiB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yIDEyYy42LjUgMS4yIDEgMi41IDEgMi41IDAgMi41LTIgNS0yIDIuNiAwIDIuNCAyIDUgMiAyLjUgMCAyLjUtMiA1LTIgMS4zIDAgMS45LjUgMi41IDEiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMiAxOGMuNi41IDEuMiAxIDIuNSAxIDIuNSAwIDIuNS0yIDUtMiAyLjYgMCAyLjQgMiA1IDIgMi41IDAgMi41LTIgNS0yIDEuMyAwIDEuOS41IDIuNSAxIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2F5cG9pbnRzLmpzCnZhciBXYXlwb2ludHM7CnZhciBpbml0X3dheXBvaW50cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2F5cG9pbnRzLmpzIigpIHsKICAgIFdheXBvaW50cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAibTEwLjU4NiA1LjQxNC01LjE3MiA1LjE3MiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOC41ODYgMTMuNDE0LTUuMTcyIDUuMTcyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTYgMTJoMTIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMjAiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICI0IiwgcjogIjIiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICIyMCIsIGN5OiAiMTIiLCByOiAiMiIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjQiLCBjeTogIjEyIiwgcjogIjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93ZWJjYW0uanMKdmFyIFdlYmNhbTsKdmFyIGluaXRfd2ViY2FtID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93ZWJjYW0uanMiKCkgewogICAgV2ViY2FtID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTAiLCByOiAiOCIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjEyIiwgY3k6ICIxMCIsIHI6ICIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMjJoMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjJ2LTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93ZWJob29rLW9mZi5qcwp2YXIgV2ViaG9va09mZjsKdmFyIGluaXRfd2ViaG9va19vZmYgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dlYmhvb2stb2ZmLmpzIigpIHsKICAgIFdlYmhvb2tPZmYgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNyAxN2gtNWMtMS4wOS0uMDItMS45NC45Mi0yLjUgMS45QTMgMyAwIDEgMSAyLjU3IDE1IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTkgMy40YTQgNCAwIDAgMSA2LjUyLjY2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTYgMTcgMy4xLTUuOGEyLjUgMi41IDAgMCAwIC4wNTctMi4wNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMC4zIDIwLjNhNCA0IDAgMCAxLTIuMy43IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4LjYgMTNhNCA0IDAgMCAxIDMuMzU3IDMuNDE0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEyIDYgLjYgMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0yIDIgMjAgMjAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93ZWJob29rLmpzCnZhciBXZWJob29rOwp2YXIgaW5pdF93ZWJob29rID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93ZWJob29rLmpzIigpIHsKICAgIFdlYmhvb2sgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAxNi45OGgtNS45OWMtMS4xIDAtMS45NS45NC0yLjQ4IDEuOUE0IDQgMCAwIDEgMiAxN2MuMDEtLjcuMi0xLjQuNTctMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02IDE3IDMuMTMtNS43OGMuNTMtLjk3LjEtMi4xOC0uNS0zLjFhNCA0IDAgMSAxIDYuODktNC4wNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xMiA2IDMuMTMgNS43M0MxNS42NiAxMi43IDE2LjkgMTMgMTggMTNhNCA0IDAgMCAxIDAgOCIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dlaWdodC10aWxkZS5qcwp2YXIgV2VpZ2h0VGlsZGU7CnZhciBpbml0X3dlaWdodF90aWxkZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2VpZ2h0LXRpbGRlLmpzIigpIHsKICAgIFdlaWdodFRpbGRlID0gWwogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNi41IDhhMiAyIDAgMCAwLTEuOTA2IDEuNDZMMi4xIDE4LjVBMiAyIDAgMCAwIDQgMjFoMTZhMiAyIDAgMCAwIDEuOTI1LTIuNTRMMTkuNCA5LjVBMiAyIDAgMCAwIDE3LjQ4IDh6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcuOTk5IDE1YTIuNSAyLjUgMCAwIDEgNCAwIDIuNSAyLjUgMCAwIDAgNCAwIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjUiLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3doZWF0LW9mZi5qcwp2YXIgV2hlYXRPZmY7CnZhciBpbml0X3doZWF0X29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2hlYXQtb2ZmLmpzIigpIHsKICAgIFdoZWF0T2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyMiAxMC0xMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiA4LTEuMTcgMS4xNyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTMuNDcgMTIuNTMgNSAxMWwxLjUzIDEuNTNhMy41IDMuNSAwIDAgMSAwIDQuOTRMNSAxOWwtMS41My0xLjUzYTMuNSAzLjUgMCAwIDEgMC00Ljk0WiIgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOCA4LS41My41M2EzLjUgMy41IDAgMCAwIDAgNC45NEw5IDE1bDEuNTMtMS41M2MuNTUtLjU1Ljg4LTEuMjUuOTgtMS45NyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMC45MSA1LjI2Yy4xNS0uMjYuMzQtLjUxLjU2LS43M0wxMyAzbDEuNTMgMS41M2EzLjUgMy41IDAgMCAxIC4yOCA0LjYyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDJoMnYyYTQgNCAwIDAgMS00IDRoLTJWNmE0IDQgMCAwIDEgNC00WiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMS40NyAxNy40NyAxMyAxOWwtMS41MyAxLjUzYTMuNSAzLjUgMCAwIDEtNC45NCAwTDUgMTlsMS41My0xLjUzYTMuNSAzLjUgMCAwIDEgNC45NCAwWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xNiAxNi0uNTMuNTNhMy41IDMuNSAwIDAgMS00Ljk0IDBMOSAxNWwxLjUzLTEuNTNhMy40OSAzLjQ5IDAgMCAxIDEuOTctLjk4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4Ljc0IDEzLjA5Yy4yNi0uMTUuNTEtLjM0LjczLS41NkwyMSAxMWwtMS41My0xLjUzYTMuNSAzLjUgMCAwIDAtNC42Mi0uMjgiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMiIsIHgyOiAiMjIiLCB5MTogIjIiLCB5MjogIjIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2VpZ2h0LmpzCnZhciBXZWlnaHQ7CnZhciBpbml0X3dlaWdodCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2VpZ2h0LmpzIigpIHsKICAgIFdlaWdodCA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTIiLCBjeTogIjUiLCByOiAiMyIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk02LjUgOGEyIDIgMCAwIDAtMS45MDUgMS40NkwyLjEgMTguNUEyIDIgMCAwIDAgNCAyMWgxNmEyIDIgMCAwIDAgMS45MjUtMi41NEwxOS40IDkuNUEyIDIgMCAwIDAgMTcuNDggOFoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93aGVhdC5qcwp2YXIgV2hlYXQ7CnZhciBpbml0X3doZWF0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93aGVhdC5qcyIoKSB7CiAgICBXaGVhdCA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgMjIgMTYgOCIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTMuNDcgMTIuNTMgNSAxMWwxLjUzIDEuNTNhMy41IDMuNSAwIDAgMSAwIDQuOTRMNSAxOWwtMS41My0xLjUzYTMuNSAzLjUgMCAwIDEgMC00Ljk0WiIgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsgZDogIk03LjQ3IDguNTMgOSA3bDEuNTMgMS41M2EzLjUgMy41IDAgMCAxIDAgNC45NEw5IDE1bC0xLjUzLTEuNTNhMy41IDMuNSAwIDAgMSAwLTQuOTRaIiB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTExLjQ3IDQuNTMgMTMgM2wxLjUzIDEuNTNhMy41IDMuNSAwIDAgMSAwIDQuOTRMMTMgMTFsLTEuNTMtMS41M2EzLjUgMy41IDAgMCAxIDAtNC45NFoiIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIwIDJoMnYyYTQgNCAwIDAgMS00IDRoLTJWNmE0IDQgMCAwIDEgNC00WiIgfV0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xMS40NyAxNy40NyAxMyAxOWwtMS41MyAxLjUzYTMuNSAzLjUgMCAwIDEtNC45NCAwTDUgMTlsMS41My0xLjUzYTMuNSAzLjUgMCAwIDEgNC45NCAwWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xNS40NyAxMy40NyAxNyAxNWwtMS41MyAxLjUzYTMuNSAzLjUgMCAwIDEtNC45NCAwTDkgMTVsMS41My0xLjUzYTMuNSAzLjUgMCAwIDEgNC45NCAwWiIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0xOS40NyA5LjQ3IDIxIDExbC0xLjUzIDEuNTNhMy41IDMuNSAwIDAgMS00Ljk0IDBMMTMgMTFsMS41My0xLjUzYTMuNSAzLjUgMCAwIDEgNC45NCAwWiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dob2xlLXdvcmQuanMKdmFyIFdob2xlV29yZDsKdmFyIGluaXRfd2hvbGVfd29yZCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2hvbGUtd29yZC5qcyIoKSB7CiAgICBXaG9sZVdvcmQgPSBbCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjciLCBjeTogIjEyIiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgOXY2IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTciLCBjeTogIjEyIiwgcjogIjMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTQgN3Y4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIyIDE3djFjMCAuNS0uNSAxLTEgMUgzYy0uNSAwLTEtLjUtMS0xdi0xIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2lmaS1jb2cuanMKdmFyIFdpZmlDb2c7CnZhciBpbml0X3dpZmlfY29nID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93aWZpLWNvZy5qcyIoKSB7CiAgICBXaWZpQ29nID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTQuMzA1IDE5LjUzLjkyMy0uMzgyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE1LjIyOCAxNi44NTItLjkyMy0uMzgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2Ljg1MiAxNS4yMjgtLjM4My0uOTIzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTE2Ljg1MiAyMC43NzItLjM4My45MjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkuMTQ4IDE1LjIyOC4zODMtLjkyMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm0xOS41MyAyMS42OTYtLjM4Mi0uOTI0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgNy44MmExNSAxNSAwIDAgMSAyMCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIwLjc3MiAxNi44NTIuOTI0LS4zODMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMjAuNzcyIDE5LjE0OC45MjQuMzgzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTEuODU4YTEwIDEwIDAgMCAxIDExLjUtMS43ODUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC41IDE1LjQyOWE1IDUgMCAwIDEgMi40MTMtMS4zMSIgfV0sCiAgICAgIFsiY2lyY2xlIiwgeyBjeDogIjE4IiwgY3k6ICIxOCIsIHI6ICIzIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2lmaS1oaWdoLmpzCnZhciBXaWZpSGlnaDsKdmFyIGluaXRfd2lmaV9oaWdoID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93aWZpLWhpZ2guanMiKCkgewogICAgV2lmaUhpZ2ggPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxMi44NTlhMTAgMTAgMCAwIDEgMTQgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjUgMTYuNDI5YTUgNSAwIDAgMSA3IDAiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93aWZpLWxvdy5qcwp2YXIgV2lmaUxvdzsKdmFyIGluaXRfd2lmaV9sb3cgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dpZmktbG93LmpzIigpIHsKICAgIFdpZmlMb3cgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAyMGguMDEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC41IDE2LjQyOWE1IDUgMCAwIDEgNyAwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2lmaS1wZW4uanMKdmFyIFdpZmlQZW47CnZhciBpbml0X3dpZmlfcGVuID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93aWZpLXBlbi5qcyIoKSB7CiAgICBXaWZpUGVuID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMiA4LjgyYTE1IDE1IDAgMCAxIDIwIDAiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNMjEuMzc4IDE2LjYyNmExIDEgMCAwIDAtMy4wMDQtMy4wMDRsLTQuMDEgNC4wMTJhMiAyIDAgMCAwLS41MDYuODU0bC0uODM3IDIuODdhLjUuNSAwIDAgMCAuNjIuNjJsMi44Ny0uODM3YTIgMiAwIDAgMCAuODU0LS41MDZ6IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTIuODU5YTEwIDEwIDAgMCAxIDEwLjUtMi4yMjIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC41IDE2LjQyOWE1IDUgMCAwIDEgMy0xLjQwNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dpZmktb2ZmLmpzCnZhciBXaWZpT2ZmOwp2YXIgaW5pdF93aWZpX29mZiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2lmaS1vZmYuanMiKCkgewogICAgV2lmaU9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDIwaC4wMSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk04LjUgMTYuNDI5YTUgNSAwIDAgMSA3IDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxMi44NTlhMTAgMTAgMCAwIDEgNS4xNy0yLjY5IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE5IDEyLjg1OWExMCAxMCAwIDAgMC0yLjAwNy0xLjUyMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yIDguODJhMTUgMTUgMCAwIDEgNC4xNzctMi42NDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjIgOC44MmExNSAxNSAwIDAgMC0xMS4yODgtMy43NjQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2lmaS16ZXJvLmpzCnZhciBXaWZpWmVybzsKdmFyIGluaXRfd2lmaV96ZXJvID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93aWZpLXplcm8uanMiKCkgewogICAgV2lmaVplcm8gPSBbWyJwYXRoIiwgeyBkOiAiTTEyIDIwaC4wMSIgfV1dOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93aWZpLXN5bmMuanMKdmFyIFdpZmlTeW5jOwp2YXIgaW5pdF93aWZpX3N5bmMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dpZmktc3luYy5qcyIoKSB7CiAgICBXaWZpU3luYyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExLjk2NSAxMC4xMDV2NEwxMy41IDEyLjVhNSA1IDAgMCAxIDggMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExLjk2NSAxNC4xMDVoNCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy45NjUgMTguMTA1aDRMMjAuNDMgMTkuNzFhNSA1IDAgMCAxLTgtMS41IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgOC44MmExNSAxNSAwIDAgMSAyMCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIxLjk2NSAyMi4xMDV2LTQiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNSAxMi44NmExMCAxMCAwIDAgMSAzLTIuMDMyIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTguNSAxNi40MjloLjAxIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2lmaS5qcwp2YXIgV2lmaTsKdmFyIGluaXRfd2lmaSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2lmaS5qcyIoKSB7CiAgICBXaWZpID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTIgMjBoLjAxIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTIgOC44MmExNSAxNSAwIDAgMSAyMCAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgMTIuODU5YTEwIDEwIDAgMCAxIDE0IDAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOC41IDE2LjQyOWE1IDUgMCAwIDEgNyAwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2luZC1hcnJvdy1kb3duLmpzCnZhciBXaW5kQXJyb3dEb3duOwp2YXIgaW5pdF93aW5kX2Fycm93X2Rvd24gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dpbmQtYXJyb3ctZG93bi5qcyIoKSB7CiAgICBXaW5kQXJyb3dEb3duID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMnY4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyLjggMjEuNkEyIDIgMCAxIDAgMTQgMThIMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNy41IDEwYTIuNSAyLjUgMCAxIDEgMiA0SDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtNiA2IDQgNCA0LTQiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93aW5kLmpzCnZhciBXaW5kOwp2YXIgaW5pdF93aW5kID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93aW5kLmpzIigpIHsKICAgIFdpbmQgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMi44IDE5LjZBMiAyIDAgMSAwIDE0IDE2SDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTcuNSA4YTIuNSAyLjUgMCAxIDEgMiA0SDIiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNOS44IDQuNEEyIDIgMCAxIDEgMTEgOEgyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd2luZS1vZmYuanMKdmFyIFdpbmVPZmY7CnZhciBpbml0X3dpbmVfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93aW5lLW9mZi5qcyIoKSB7CiAgICBXaW5lT2ZmID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNOCAyMmg4IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTcgMTBoM203IDBoLTEuMzQzIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE1djciIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNy4zMDcgNy4zMDdBMTIuMzMgMTIuMzMgMCAwIDAgNyAxMGE1IDUgMCAwIDAgNy4zOTEgNC4zOTFNOC42MzggMi45ODFDOC43NSAyLjY2OCA4Ljg3MiAyLjM0IDkgMmg2YzEuNSA0IDIgNiAyIDggMCAuNDA3LS4wNS44MDktLjE0NSAxLjE5OCIKICAgICAgICB9CiAgICAgIF0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIyIiwgeDI6ICIyMiIsIHkxOiAiMiIsIHkyOiAiMjIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93aW5lLmpzCnZhciBXaW5lOwp2YXIgaW5pdF93aW5lID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93aW5lLmpzIigpIHsKICAgIFdpbmUgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk04IDIyaDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNyAxMGgxMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiAxNXY3IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEyIDE1YTUgNSAwIDAgMCA1LTVjMC0yLS41LTQtMi04SDljLTEuNSA0LTIgNi0yIDhhNSA1IDAgMCAwIDUgNVoiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93b3JrZmxvdy5qcwp2YXIgV29ya2Zsb3c7CnZhciBpbml0X3dvcmtmbG93ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy93b3JrZmxvdy5qcyIoKSB7CiAgICBXb3JrZmxvdyA9IFsKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICI4IiwgeDogIjMiLCB5OiAiMyIsIHJ4OiAiMiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDExdjRhMiAyIDAgMCAwIDIgMmg0IiB9XSwKICAgICAgWyJyZWN0IiwgeyB3aWR0aDogIjgiLCBoZWlnaHQ6ICI4IiwgeDogIjEzIiwgeTogIjEzIiwgcng6ICIyIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd29ybS5qcwp2YXIgV29ybTsKdmFyIGluaXRfd29ybSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd29ybS5qcyIoKSB7CiAgICBXb3JtID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJtMTkgMTItMS41IDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkuNjMgMTguODEgMjIgMjAiIH1dLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJNNi40NyA4LjIzYTEuNjggMS42OCAwIDAgMSAyLjQ0IDEuOTNsLS42NCAyLjA4YTYuNzYgNi43NiAwIDAgMCAxMC4xNiA3LjY3bC40Mi0uMjdhMSAxIDAgMSAwLTIuNzMtNC4yMWwtLjQyLjI3YTEuNzYgMS43NiAwIDAgMS0yLjYzLTEuOTlsLjY0LTIuMDhBNi42NiA2LjY2IDAgMCAwIDMuOTQgMy45bC0uNy40YTEgMSAwIDEgMCAyLjU1IDQuMzR6IgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd3JlbmNoLmpzCnZhciBXcmVuY2g7CnZhciBpbml0X3dyZW5jaCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvd3JlbmNoLmpzIigpIHsKICAgIFdyZW5jaCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE0LjcgNi4zYTEgMSAwIDAgMCAwIDEuNGwxLjYgMS42YTEgMSAwIDAgMCAxLjQgMGwzLjEwNi0zLjEwNWMuMzItLjMyMi44NjMtLjIyLjk4My4yMThhNiA2IDAgMCAxLTguMjU5IDcuMDU3bC03LjkxIDcuOTFhMSAxIDAgMCAxLTIuOTk5LTNsNy45MS03LjkxYTYgNiAwIDAgMSA3LjA1Ny04LjI1OWMuNDM4LjEyLjU0LjY2Mi4yMTkuOTg0eiIKICAgICAgICB9CiAgICAgIF0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3gtbGluZS10b3AuanMKdmFyIFhMaW5lVG9wOwp2YXIgaW5pdF94X2xpbmVfdG9wID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy94LWxpbmUtdG9wLmpzIigpIHsKICAgIFhMaW5lVG9wID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTggNEg2IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDggNiAyMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02IDggMTIgMTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy94LmpzCnZhciBYMjsKdmFyIGluaXRfeCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMveC5qcyIoKSB7CiAgICBYMiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTE4IDYgNiAxOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIm02IDYgMTIgMTIiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy95b3V0dWJlLmpzCnZhciBZb3V0dWJlOwp2YXIgaW5pdF95b3V0dWJlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy95b3V0dWJlLmpzIigpIHsKICAgIFlvdXR1YmUgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgewogICAgICAgICAgZDogIk0yLjUgMTdhMjQuMTIgMjQuMTIgMCAwIDEgMC0xMCAyIDIgMCAwIDEgMS40LTEuNCA0OS41NiA0OS41NiAwIDAgMSAxNi4yIDBBMiAyIDAgMCAxIDIxLjUgN2EyNC4xMiAyNC4xMiAwIDAgMSAwIDEwIDIgMiAwIDAgMS0xLjQgMS40IDQ5LjU1IDQ5LjU1IDAgMCAxLTE2LjIgMEEyIDIgMCAwIDEgMi41IDE3IgogICAgICAgIH0KICAgICAgXSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTEwIDE1IDUtMy01LTN6IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvemFwLW9mZi5qcwp2YXIgWmFwT2ZmOwp2YXIgaW5pdF96YXBfb2ZmID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy96YXAtb2ZmLmpzIigpIHsKICAgIFphcE9mZiA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwLjUxMyA0Ljg1NiAxMy4xMiAyLjE3YS41LjUgMCAwIDEgLjg2LjQ2bC0xLjM3NyA0LjMxNyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNS42NTYgMTBIMjBhMSAxIDAgMCAxIC43OCAxLjYzbC0xLjcyIDEuNzczIiB9XSwKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTE2LjI3MyAxNi4yNzMgMTAuODggMjEuODNhLjUuNSAwIDAgMS0uODYtLjQ2bDEuOTItNi4wMkExIDEgMCAwIDAgMTEgMTRINGExIDEgMCAwIDEtLjc4LTEuNjNsNC41MDctNC42NDMiCiAgICAgICAgfQogICAgICBdLAogICAgICBbInBhdGgiLCB7IGQ6ICJtMiAyIDIwIDIwIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvemFwLmpzCnZhciBaYXA7CnZhciBpbml0X3phcCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvemFwLmpzIigpIHsKICAgIFphcCA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAiTTQgMTRhMSAxIDAgMCAxLS43OC0xLjYzbDkuOS0xMC4yYS41LjUgMCAwIDEgLjg2LjQ2bC0xLjkyIDYuMDJBMSAxIDAgMCAwIDEzIDEwaDdhMSAxIDAgMCAxIC43OCAxLjYzbC05LjkgMTAuMmEuNS41IDAgMCAxLS44Ni0uNDZsMS45Mi02LjAyQTEgMSAwIDAgMCAxMSAxNHoiCiAgICAgICAgfQogICAgICBdCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy96b2RpYWMtYXF1YXJpdXMuanMKdmFyIFpvZGlhY0FxdWFyaXVzOwp2YXIgaW5pdF96b2RpYWNfYXF1YXJpdXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3pvZGlhYy1hcXVhcml1cy5qcyIoKSB7CiAgICBab2RpYWNBcXVhcml1cyA9IFsKICAgICAgWwogICAgICAgICJwYXRoIiwKICAgICAgICB7CiAgICAgICAgICBkOiAibTIgMTAgMi40NTYtMy42ODRhLjcuNyAwIDAgMSAxLjEwNi0uMDEzbDIuMzkgMy40MTNhLjcuNyAwIDAgMCAxLjA5Ni0uMDAxbDIuNDAyLTMuNDMyYS43LjcgMCAwIDEgMS4wOTggMGwyLjQwMiAzLjQzMmEuNy43IDAgMCAwIDEuMDk4IDBsMi4zODktMy40MTNhLjcuNyAwIDAgMSAxLjEwNi4wMTNMMjIgMTAiCiAgICAgICAgfQogICAgICBdLAogICAgICBbCiAgICAgICAgInBhdGgiLAogICAgICAgIHsKICAgICAgICAgIGQ6ICJtMiAxOC4wMDIgMi40NTYtMy42ODRhLjcuNyAwIDAgMSAxLjEwNi0uMDEzbDIuMzkgMy40MTNhLjcuNyAwIDAgMCAxLjA5NyAwbDIuNDAyLTMuNDMyYS43LjcgMCAwIDEgMS4wOTggMGwyLjQwMiAzLjQzMmEuNy43IDAgMCAwIDEuMDk4IDBsMi4zODktMy40MTNhLjcuNyAwIDAgMSAxLjEwNi4wMTNMMjIgMTguMDAyIgogICAgICAgIH0KICAgICAgXQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvem9kaWFjLWFyaWVzLmpzCnZhciBab2RpYWNBcmllczsKdmFyIGluaXRfem9kaWFjX2FyaWVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy96b2RpYWMtYXJpZXMuanMiKCkgewogICAgWm9kaWFjQXJpZXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xMiA3LjVhNC41IDQuNSAwIDEgMSA1IDQuNSIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDEyYTQuNSA0LjUgMCAxIDEgNS00LjVWMjEiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy96b2RpYWMtY2FuY2VyLmpzCnZhciBab2RpYWNDYW5jZXI7CnZhciBpbml0X3pvZGlhY19jYW5jZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3pvZGlhYy1jYW5jZXIuanMiKCkgewogICAgWm9kaWFjQ2FuY2VyID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMjEgMTQuNUE5IDYuNSAwIDAgMSA1LjUgMTkiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMyA5LjVBOSA2LjUgMCAwIDEgMTguNSA1IiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTcuNSIsIGN5OiAiMTQuNSIsIHI6ICIzLjUiIH1dLAogICAgICBbImNpcmNsZSIsIHsgY3g6ICI2LjUiLCBjeTogIjkuNSIsIHI6ICIzLjUiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy96b2RpYWMtY2Fwcmljb3JuLmpzCnZhciBab2RpYWNDYXByaWNvcm47CnZhciBpbml0X3pvZGlhY19jYXByaWNvcm4gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3pvZGlhYy1jYXByaWNvcm4uanMiKCkgewogICAgWm9kaWFjQ2Fwcmljb3JuID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTEgMjFhMyAzIDAgMCAwIDMtM1Y2LjVhMSAxIDAgMCAwLTcgMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk03IDE5VjZhMyAzIDAgMCAwLTMtM2gwIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTciLCBjeTogIjE3IiwgcjogIjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy96b2RpYWMtbGVvLmpzCnZhciBab2RpYWNMZW87CnZhciBpbml0X3pvZGlhY19sZW8gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3pvZGlhYy1sZW8uanMiKCkgewogICAgWm9kaWFjTGVvID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTAgMTZjMC00LTMtNC41LTMtOGE1IDUgMCAwIDEgMTAgMGMwIDMuNDY2LTMgNi4xOTYtMyAxMGEzIDMgMCAwIDAgNiAwIiB9XSwKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiNyIsIGN5OiAiMTYiLCByOiAiMyIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3pvZGlhYy1nZW1pbmkuanMKdmFyIFpvZGlhY0dlbWluaTsKdmFyIGluaXRfem9kaWFjX2dlbWluaSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvem9kaWFjLWdlbWluaS5qcyIoKSB7CiAgICBab2RpYWNHZW1pbmkgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNiA0LjUyNXYxNC45NDgiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMjAgM0ExNyAxNyAwIDAgMSA0IDMiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNCAyMWExNyAxNyAwIDAgMSAxNiAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTggNC41MjV2MTQuOTQ4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvem9kaWFjLWxpYnJhLmpzCnZhciBab2RpYWNMaWJyYTsKdmFyIGluaXRfem9kaWFjX2xpYnJhID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy96b2RpYWMtbGlicmEuanMiKCkgewogICAgWm9kaWFjTGlicmEgPSBbCiAgICAgIFsKICAgICAgICAicGF0aCIsCiAgICAgICAgeyBkOiAiTTMgMTZoNi44NTdjLjE2Mi0uMDEyLjE5LS4zMjMuMDM4LS4zOGE2IDYgMCAxIDEgNC4yMTIgMGMtLjE1My4wNTctLjEyNS4zNjguMDM4LjM4SDIxIiB9CiAgICAgIF0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0zIDIwaDE4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvem9kaWFjLW9waGl1Y2h1cy5qcwp2YXIgWm9kaWFjT3BoaXVjaHVzOwp2YXIgaW5pdF96b2RpYWNfb3BoaXVjaHVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy96b2RpYWMtb3BoaXVjaHVzLmpzIigpIHsKICAgIFpvZGlhY09waGl1Y2h1cyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTMgMTBBNi4wNiA2LjA2IDAgMCAxIDEyIDEwIEE2LjA2IDYuMDYgMCAwIDAgMjEgMTAiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAzdjEyYTYgNiAwIDAgMCAxMiAwVjMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy96b2RpYWMtcGlzY2VzLmpzCnZhciBab2RpYWNQaXNjZXM7CnZhciBpbml0X3pvZGlhY19waXNjZXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3pvZGlhYy1waXNjZXMuanMiKCkgewogICAgWm9kaWFjUGlzY2VzID0gWwogICAgICBbInBhdGgiLCB7IGQ6ICJNMTkgMjFhMTUgMTUgMCAwIDEgMC0xOCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMCAxMkg0IiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgM2ExNSAxNSAwIDAgMSAwIDE4IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvem9kaWFjLXNhZ2l0dGFyaXVzLmpzCnZhciBab2RpYWNTYWdpdHRhcml1czsKdmFyIGluaXRfem9kaWFjX3NhZ2l0dGFyaXVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy96b2RpYWMtc2FnaXR0YXJpdXMuanMiKCkgewogICAgWm9kaWFjU2FnaXR0YXJpdXMgPSBbCiAgICAgIFsicGF0aCIsIHsgZDogIk0xNSAzaDZ2NiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0yMSAzIDMgMjEiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJtOSA5IDYgNiIgfV0KICAgIF07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3pvZGlhYy1zY29ycGlvLmpzCnZhciBab2RpYWNTY29ycGlvOwp2YXIgaW5pdF96b2RpYWNfc2NvcnBpbyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvem9kaWFjLXNjb3JwaW8uanMiKCkgewogICAgWm9kaWFjU2NvcnBpbyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTEwIDE5VjUuNWExIDEgMCAwIDEgNSAwVjE3YTIgMiAwIDAgMCAyIDJoNWwtMy0zIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAibTIyIDE5LTMgMyIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk01IDE5VjUuNWExIDEgMCAwIDEgNSAwIiB9XSwKICAgICAgWyJwYXRoIiwgeyBkOiAiTTUgNS41QTIuNSAyLjUgMCAwIDAgMi41IDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy96b2RpYWMtdGF1cnVzLmpzCnZhciBab2RpYWNUYXVydXM7CnZhciBpbml0X3pvZGlhY190YXVydXMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3pvZGlhYy10YXVydXMuanMiKCkgewogICAgWm9kaWFjVGF1cnVzID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMiIsIGN5OiAiMTUiLCByOiAiNiIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk0xOCAzQTYgNiAwIDAgMSA2IDMiIH1dCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy96b2RpYWMtdmlyZ28uanMKdmFyIFpvZGlhY1ZpcmdvOwp2YXIgaW5pdF96b2RpYWNfdmlyZ28gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3pvZGlhYy12aXJnby5qcyIoKSB7CiAgICBab2RpYWNWaXJnbyA9IFsKICAgICAgWyJwYXRoIiwgeyBkOiAiTTExIDUuNWExIDEgMCAwIDEgNSAwVjE2YTUgNSAwIDAgMCA1IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNMTYgMTEuNWExIDEgMCAwIDEgNSAwVjE2YTUgNSAwIDAgMS01IDUiIH1dLAogICAgICBbInBhdGgiLCB7IGQ6ICJNNiAxOVY2YTMgMyAwIDAgMC0zLTNoMCIgfV0sCiAgICAgIFsicGF0aCIsIHsgZDogIk02IDUuNWExIDEgMCAwIDEgNSAwVjE5IiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvem9vbS1pbi5qcwp2YXIgWm9vbUluOwp2YXIgaW5pdF96b29tX2luID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy96b29tLWluLmpzIigpIHsKICAgIFpvb21JbiA9IFsKICAgICAgWyJjaXJjbGUiLCB7IGN4OiAiMTEiLCBjeTogIjExIiwgcjogIjgiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMjEiLCB4MjogIjE2LjY1IiwgeTE6ICIyMSIsIHkyOiAiMTYuNjUiIH1dLAogICAgICBbImxpbmUiLCB7IHgxOiAiMTEiLCB4MjogIjExIiwgeTE6ICI4IiwgeTI6ICIxNCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI4IiwgeDI6ICIxNCIsIHkxOiAiMTEiLCB5MjogIjExIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnMvem9vbS1vdXQuanMKdmFyIFpvb21PdXQ7CnZhciBpbml0X3pvb21fb3V0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29ucy96b29tLW91dC5qcyIoKSB7CiAgICBab29tT3V0ID0gWwogICAgICBbImNpcmNsZSIsIHsgY3g6ICIxMSIsIGN5OiAiMTEiLCByOiAiOCIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICIyMSIsIHgyOiAiMTYuNjUiLCB5MTogIjIxIiwgeTI6ICIxNi42NSIgfV0sCiAgICAgIFsibGluZSIsIHsgeDE6ICI4IiwgeDI6ICIxNCIsIHkxOiAiMTEiLCB5MjogIjExIiB9XQogICAgXTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2x1Y2lkZUAwLjU3Ny4wL25vZGVfbW9kdWxlcy9sdWNpZGUvZGlzdC9lc20vaWNvbnNBbmRBbGlhc2VzLmpzCnZhciBpY29uc0FuZEFsaWFzZXNfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChpY29uc0FuZEFsaWFzZXNfZXhwb3J0cywgewogIEFBcnJvd0Rvd246ICgpID0+IEFBcnJvd0Rvd24sCiAgQUFycm93VXA6ICgpID0+IEFBcnJvd1VwLAogIEFMYXJnZVNtYWxsOiAoKSA9PiBBTGFyZ2VTbWFsbCwKICBBY2Nlc3NpYmlsaXR5OiAoKSA9PiBBY2Nlc3NpYmlsaXR5LAogIEFjdGl2aXR5OiAoKSA9PiBBY3Rpdml0eSwKICBBY3Rpdml0eVNxdWFyZTogKCkgPT4gU3F1YXJlQWN0aXZpdHksCiAgQWlyVmVudDogKCkgPT4gQWlyVmVudCwKICBBaXJwbGF5OiAoKSA9PiBBaXJwbGF5LAogIEFsYXJtQ2hlY2s6ICgpID0+IEFsYXJtQ2xvY2tDaGVjaywKICBBbGFybUNsb2NrOiAoKSA9PiBBbGFybUNsb2NrLAogIEFsYXJtQ2xvY2tDaGVjazogKCkgPT4gQWxhcm1DbG9ja0NoZWNrLAogIEFsYXJtQ2xvY2tNaW51czogKCkgPT4gQWxhcm1DbG9ja01pbnVzLAogIEFsYXJtQ2xvY2tPZmY6ICgpID0+IEFsYXJtQ2xvY2tPZmYsCiAgQWxhcm1DbG9ja1BsdXM6ICgpID0+IEFsYXJtQ2xvY2tQbHVzLAogIEFsYXJtTWludXM6ICgpID0+IEFsYXJtQ2xvY2tNaW51cywKICBBbGFybVBsdXM6ICgpID0+IEFsYXJtQ2xvY2tQbHVzLAogIEFsYXJtU21va2U6ICgpID0+IEFsYXJtU21va2UsCiAgQWxidW06ICgpID0+IEFsYnVtLAogIEFsZXJ0Q2lyY2xlOiAoKSA9PiBDaXJjbGVBbGVydCwKICBBbGVydE9jdGFnb246ICgpID0+IE9jdGFnb25BbGVydCwKICBBbGVydFRyaWFuZ2xlOiAoKSA9PiBUcmlhbmdsZUFsZXJ0LAogIEFsaWduQ2VudGVyOiAoKSA9PiBUZXh0QWxpZ25DZW50ZXIsCiAgQWxpZ25DZW50ZXJIb3Jpem9udGFsOiAoKSA9PiBBbGlnbkNlbnRlckhvcml6b250YWwsCiAgQWxpZ25DZW50ZXJWZXJ0aWNhbDogKCkgPT4gQWxpZ25DZW50ZXJWZXJ0aWNhbCwKICBBbGlnbkVuZEhvcml6b250YWw6ICgpID0+IEFsaWduRW5kSG9yaXpvbnRhbCwKICBBbGlnbkVuZFZlcnRpY2FsOiAoKSA9PiBBbGlnbkVuZFZlcnRpY2FsLAogIEFsaWduSG9yaXpvbnRhbERpc3RyaWJ1dGVDZW50ZXI6ICgpID0+IEFsaWduSG9yaXpvbnRhbERpc3RyaWJ1dGVDZW50ZXIsCiAgQWxpZ25Ib3Jpem9udGFsRGlzdHJpYnV0ZUVuZDogKCkgPT4gQWxpZ25Ib3Jpem9udGFsRGlzdHJpYnV0ZUVuZCwKICBBbGlnbkhvcml6b250YWxEaXN0cmlidXRlU3RhcnQ6ICgpID0+IEFsaWduSG9yaXpvbnRhbERpc3RyaWJ1dGVTdGFydCwKICBBbGlnbkhvcml6b250YWxKdXN0aWZ5Q2VudGVyOiAoKSA9PiBBbGlnbkhvcml6b250YWxKdXN0aWZ5Q2VudGVyLAogIEFsaWduSG9yaXpvbnRhbEp1c3RpZnlFbmQ6ICgpID0+IEFsaWduSG9yaXpvbnRhbEp1c3RpZnlFbmQsCiAgQWxpZ25Ib3Jpem9udGFsSnVzdGlmeVN0YXJ0OiAoKSA9PiBBbGlnbkhvcml6b250YWxKdXN0aWZ5U3RhcnQsCiAgQWxpZ25Ib3Jpem9udGFsU3BhY2VBcm91bmQ6ICgpID0+IEFsaWduSG9yaXpvbnRhbFNwYWNlQXJvdW5kLAogIEFsaWduSG9yaXpvbnRhbFNwYWNlQmV0d2VlbjogKCkgPT4gQWxpZ25Ib3Jpem9udGFsU3BhY2VCZXR3ZWVuLAogIEFsaWduSnVzdGlmeTogKCkgPT4gVGV4dEFsaWduSnVzdGlmeSwKICBBbGlnbkxlZnQ6ICgpID0+IFRleHRBbGlnblN0YXJ0LAogIEFsaWduUmlnaHQ6ICgpID0+IFRleHRBbGlnbkVuZCwKICBBbGlnblN0YXJ0SG9yaXpvbnRhbDogKCkgPT4gQWxpZ25TdGFydEhvcml6b250YWwsCiAgQWxpZ25TdGFydFZlcnRpY2FsOiAoKSA9PiBBbGlnblN0YXJ0VmVydGljYWwsCiAgQWxpZ25WZXJ0aWNhbERpc3RyaWJ1dGVDZW50ZXI6ICgpID0+IEFsaWduVmVydGljYWxEaXN0cmlidXRlQ2VudGVyLAogIEFsaWduVmVydGljYWxEaXN0cmlidXRlRW5kOiAoKSA9PiBBbGlnblZlcnRpY2FsRGlzdHJpYnV0ZUVuZCwKICBBbGlnblZlcnRpY2FsRGlzdHJpYnV0ZVN0YXJ0OiAoKSA9PiBBbGlnblZlcnRpY2FsRGlzdHJpYnV0ZVN0YXJ0LAogIEFsaWduVmVydGljYWxKdXN0aWZ5Q2VudGVyOiAoKSA9PiBBbGlnblZlcnRpY2FsSnVzdGlmeUNlbnRlciwKICBBbGlnblZlcnRpY2FsSnVzdGlmeUVuZDogKCkgPT4gQWxpZ25WZXJ0aWNhbEp1c3RpZnlFbmQsCiAgQWxpZ25WZXJ0aWNhbEp1c3RpZnlTdGFydDogKCkgPT4gQWxpZ25WZXJ0aWNhbEp1c3RpZnlTdGFydCwKICBBbGlnblZlcnRpY2FsU3BhY2VBcm91bmQ6ICgpID0+IEFsaWduVmVydGljYWxTcGFjZUFyb3VuZCwKICBBbGlnblZlcnRpY2FsU3BhY2VCZXR3ZWVuOiAoKSA9PiBBbGlnblZlcnRpY2FsU3BhY2VCZXR3ZWVuLAogIEFtYnVsYW5jZTogKCkgPT4gQW1idWxhbmNlLAogIEFtcGVyc2FuZDogKCkgPT4gQW1wZXJzYW5kLAogIEFtcGVyc2FuZHM6ICgpID0+IEFtcGVyc2FuZHMsCiAgQW1waG9yYTogKCkgPT4gQW1waG9yYSwKICBBbmNob3I6ICgpID0+IEFuY2hvciwKICBBbmdyeTogKCkgPT4gQW5ncnksCiAgQW5ub3llZDogKCkgPT4gQW5ub3llZCwKICBBbnRlbm5hOiAoKSA9PiBBbnRlbm5hLAogIEFudmlsOiAoKSA9PiBBbnZpbCwKICBBcGVydHVyZTogKCkgPT4gQXBlcnR1cmUsCiAgQXBwV2luZG93OiAoKSA9PiBBcHBXaW5kb3csCiAgQXBwV2luZG93TWFjOiAoKSA9PiBBcHBXaW5kb3dNYWMsCiAgQXBwbGU6ICgpID0+IEFwcGxlLAogIEFyY2hpdmU6ICgpID0+IEFyY2hpdmUsCiAgQXJjaGl2ZVJlc3RvcmU6ICgpID0+IEFyY2hpdmVSZXN0b3JlLAogIEFyY2hpdmVYOiAoKSA9PiBBcmNoaXZlWCwKICBBcmVhQ2hhcnQ6ICgpID0+IENoYXJ0QXJlYSwKICBBcm1jaGFpcjogKCkgPT4gQXJtY2hhaXIsCiAgQXJyb3dCaWdEb3duOiAoKSA9PiBBcnJvd0JpZ0Rvd24sCiAgQXJyb3dCaWdEb3duRGFzaDogKCkgPT4gQXJyb3dCaWdEb3duRGFzaCwKICBBcnJvd0JpZ0xlZnQ6ICgpID0+IEFycm93QmlnTGVmdCwKICBBcnJvd0JpZ0xlZnREYXNoOiAoKSA9PiBBcnJvd0JpZ0xlZnREYXNoLAogIEFycm93QmlnUmlnaHQ6ICgpID0+IEFycm93QmlnUmlnaHQsCiAgQXJyb3dCaWdSaWdodERhc2g6ICgpID0+IEFycm93QmlnUmlnaHREYXNoLAogIEFycm93QmlnVXA6ICgpID0+IEFycm93QmlnVXAsCiAgQXJyb3dCaWdVcERhc2g6ICgpID0+IEFycm93QmlnVXBEYXNoLAogIEFycm93RG93bjogKCkgPT4gQXJyb3dEb3duLAogIEFycm93RG93bjAxOiAoKSA9PiBBcnJvd0Rvd24wMSwKICBBcnJvd0Rvd24xMDogKCkgPT4gQXJyb3dEb3duMTAsCiAgQXJyb3dEb3duQVo6ICgpID0+IEFycm93RG93bkFaLAogIEFycm93RG93bkF6OiAoKSA9PiBBcnJvd0Rvd25BWiwKICBBcnJvd0Rvd25DaXJjbGU6ICgpID0+IENpcmNsZUFycm93RG93biwKICBBcnJvd0Rvd25Gcm9tTGluZTogKCkgPT4gQXJyb3dEb3duRnJvbUxpbmUsCiAgQXJyb3dEb3duTGVmdDogKCkgPT4gQXJyb3dEb3duTGVmdCwKICBBcnJvd0Rvd25MZWZ0RnJvbUNpcmNsZTogKCkgPT4gQ2lyY2xlQXJyb3dPdXREb3duTGVmdCwKICBBcnJvd0Rvd25MZWZ0RnJvbVNxdWFyZTogKCkgPT4gU3F1YXJlQXJyb3dPdXREb3duTGVmdCwKICBBcnJvd0Rvd25MZWZ0U3F1YXJlOiAoKSA9PiBTcXVhcmVBcnJvd0Rvd25MZWZ0LAogIEFycm93RG93bk5hcnJvd1dpZGU6ICgpID0+IEFycm93RG93bk5hcnJvd1dpZGUsCiAgQXJyb3dEb3duUmlnaHQ6ICgpID0+IEFycm93RG93blJpZ2h0LAogIEFycm93RG93blJpZ2h0RnJvbUNpcmNsZTogKCkgPT4gQ2lyY2xlQXJyb3dPdXREb3duUmlnaHQsCiAgQXJyb3dEb3duUmlnaHRGcm9tU3F1YXJlOiAoKSA9PiBTcXVhcmVBcnJvd091dERvd25SaWdodCwKICBBcnJvd0Rvd25SaWdodFNxdWFyZTogKCkgPT4gU3F1YXJlQXJyb3dEb3duUmlnaHQsCiAgQXJyb3dEb3duU3F1YXJlOiAoKSA9PiBTcXVhcmVBcnJvd0Rvd24sCiAgQXJyb3dEb3duVG9Eb3Q6ICgpID0+IEFycm93RG93blRvRG90LAogIEFycm93RG93blRvTGluZTogKCkgPT4gQXJyb3dEb3duVG9MaW5lLAogIEFycm93RG93blVwOiAoKSA9PiBBcnJvd0Rvd25VcCwKICBBcnJvd0Rvd25XaWRlTmFycm93OiAoKSA9PiBBcnJvd0Rvd25XaWRlTmFycm93LAogIEFycm93RG93blpBOiAoKSA9PiBBcnJvd0Rvd25aQSwKICBBcnJvd0Rvd25aYTogKCkgPT4gQXJyb3dEb3duWkEsCiAgQXJyb3dMZWZ0OiAoKSA9PiBBcnJvd0xlZnQsCiAgQXJyb3dMZWZ0Q2lyY2xlOiAoKSA9PiBDaXJjbGVBcnJvd0xlZnQsCiAgQXJyb3dMZWZ0RnJvbUxpbmU6ICgpID0+IEFycm93TGVmdEZyb21MaW5lLAogIEFycm93TGVmdFJpZ2h0OiAoKSA9PiBBcnJvd0xlZnRSaWdodCwKICBBcnJvd0xlZnRTcXVhcmU6ICgpID0+IFNxdWFyZUFycm93TGVmdCwKICBBcnJvd0xlZnRUb0xpbmU6ICgpID0+IEFycm93TGVmdFRvTGluZSwKICBBcnJvd1JpZ2h0OiAoKSA9PiBBcnJvd1JpZ2h0LAogIEFycm93UmlnaHRDaXJjbGU6ICgpID0+IENpcmNsZUFycm93UmlnaHQsCiAgQXJyb3dSaWdodEZyb21MaW5lOiAoKSA9PiBBcnJvd1JpZ2h0RnJvbUxpbmUsCiAgQXJyb3dSaWdodExlZnQ6ICgpID0+IEFycm93UmlnaHRMZWZ0LAogIEFycm93UmlnaHRTcXVhcmU6ICgpID0+IFNxdWFyZUFycm93UmlnaHQsCiAgQXJyb3dSaWdodFRvTGluZTogKCkgPT4gQXJyb3dSaWdodFRvTGluZSwKICBBcnJvd1VwOiAoKSA9PiBBcnJvd1VwLAogIEFycm93VXAwMTogKCkgPT4gQXJyb3dVcDAxLAogIEFycm93VXAxMDogKCkgPT4gQXJyb3dVcDEwLAogIEFycm93VXBBWjogKCkgPT4gQXJyb3dVcEFaLAogIEFycm93VXBBejogKCkgPT4gQXJyb3dVcEFaLAogIEFycm93VXBDaXJjbGU6ICgpID0+IENpcmNsZUFycm93VXAsCiAgQXJyb3dVcERvd246ICgpID0+IEFycm93VXBEb3duLAogIEFycm93VXBGcm9tRG90OiAoKSA9PiBBcnJvd1VwRnJvbURvdCwKICBBcnJvd1VwRnJvbUxpbmU6ICgpID0+IEFycm93VXBGcm9tTGluZSwKICBBcnJvd1VwTGVmdDogKCkgPT4gQXJyb3dVcExlZnQsCiAgQXJyb3dVcExlZnRGcm9tQ2lyY2xlOiAoKSA9PiBDaXJjbGVBcnJvd091dFVwTGVmdCwKICBBcnJvd1VwTGVmdEZyb21TcXVhcmU6ICgpID0+IFNxdWFyZUFycm93T3V0VXBMZWZ0LAogIEFycm93VXBMZWZ0U3F1YXJlOiAoKSA9PiBTcXVhcmVBcnJvd1VwTGVmdCwKICBBcnJvd1VwTmFycm93V2lkZTogKCkgPT4gQXJyb3dVcE5hcnJvd1dpZGUsCiAgQXJyb3dVcFJpZ2h0OiAoKSA9PiBBcnJvd1VwUmlnaHQsCiAgQXJyb3dVcFJpZ2h0RnJvbUNpcmNsZTogKCkgPT4gQ2lyY2xlQXJyb3dPdXRVcFJpZ2h0LAogIEFycm93VXBSaWdodEZyb21TcXVhcmU6ICgpID0+IFNxdWFyZUFycm93T3V0VXBSaWdodCwKICBBcnJvd1VwUmlnaHRTcXVhcmU6ICgpID0+IFNxdWFyZUFycm93VXBSaWdodCwKICBBcnJvd1VwU3F1YXJlOiAoKSA9PiBTcXVhcmVBcnJvd1VwLAogIEFycm93VXBUb0xpbmU6ICgpID0+IEFycm93VXBUb0xpbmUsCiAgQXJyb3dVcFdpZGVOYXJyb3c6ICgpID0+IEFycm93VXBXaWRlTmFycm93LAogIEFycm93VXBaQTogKCkgPT4gQXJyb3dVcFpBLAogIEFycm93VXBaYTogKCkgPT4gQXJyb3dVcFpBLAogIEFycm93c1VwRnJvbUxpbmU6ICgpID0+IEFycm93c1VwRnJvbUxpbmUsCiAgQXN0ZXJpc2s6ICgpID0+IEFzdGVyaXNrLAogIEFzdGVyaXNrU3F1YXJlOiAoKSA9PiBTcXVhcmVBc3RlcmlzaywKICBBdFNpZ246ICgpID0+IEF0U2lnbiwKICBBdG9tOiAoKSA9PiBBdG9tLAogIEF1ZGlvTGluZXM6ICgpID0+IEF1ZGlvTGluZXMsCiAgQXVkaW9XYXZlZm9ybTogKCkgPT4gQXVkaW9XYXZlZm9ybSwKICBBd2FyZDogKCkgPT4gQXdhcmQsCiAgQXhlOiAoKSA9PiBBeGUsCiAgQXhpczNEOiAoKSA9PiBBeGlzM2QsCiAgQXhpczNkOiAoKSA9PiBBeGlzM2QsCiAgQmFieTogKCkgPT4gQmFieSwKICBCYWNrcGFjazogKCkgPT4gQmFja3BhY2ssCiAgQmFkZ2U6ICgpID0+IEJhZGdlLAogIEJhZGdlQWxlcnQ6ICgpID0+IEJhZGdlQWxlcnQsCiAgQmFkZ2VDZW50OiAoKSA9PiBCYWRnZUNlbnQsCiAgQmFkZ2VDaGVjazogKCkgPT4gQmFkZ2VDaGVjaywKICBCYWRnZURvbGxhclNpZ246ICgpID0+IEJhZGdlRG9sbGFyU2lnbiwKICBCYWRnZUV1cm86ICgpID0+IEJhZGdlRXVybywKICBCYWRnZUhlbHA6ICgpID0+IEJhZGdlUXVlc3Rpb25NYXJrLAogIEJhZGdlSW5kaWFuUnVwZWU6ICgpID0+IEJhZGdlSW5kaWFuUnVwZWUsCiAgQmFkZ2VJbmZvOiAoKSA9PiBCYWRnZUluZm8sCiAgQmFkZ2VKYXBhbmVzZVllbjogKCkgPT4gQmFkZ2VKYXBhbmVzZVllbiwKICBCYWRnZU1pbnVzOiAoKSA9PiBCYWRnZU1pbnVzLAogIEJhZGdlUGVyY2VudDogKCkgPT4gQmFkZ2VQZXJjZW50LAogIEJhZGdlUGx1czogKCkgPT4gQmFkZ2VQbHVzLAogIEJhZGdlUG91bmRTdGVybGluZzogKCkgPT4gQmFkZ2VQb3VuZFN0ZXJsaW5nLAogIEJhZGdlUXVlc3Rpb25NYXJrOiAoKSA9PiBCYWRnZVF1ZXN0aW9uTWFyaywKICBCYWRnZVJ1c3NpYW5SdWJsZTogKCkgPT4gQmFkZ2VSdXNzaWFuUnVibGUsCiAgQmFkZ2VTd2lzc0ZyYW5jOiAoKSA9PiBCYWRnZVN3aXNzRnJhbmMsCiAgQmFkZ2VUdXJraXNoTGlyYTogKCkgPT4gQmFkZ2VUdXJraXNoTGlyYSwKICBCYWRnZVg6ICgpID0+IEJhZGdlWCwKICBCYWdnYWdlQ2xhaW06ICgpID0+IEJhZ2dhZ2VDbGFpbSwKICBCYWxsb29uOiAoKSA9PiBCYWxsb29uLAogIEJhbjogKCkgPT4gQmFuLAogIEJhbmFuYTogKCkgPT4gQmFuYW5hLAogIEJhbmRhZ2U6ICgpID0+IEJhbmRhZ2UsCiAgQmFua25vdGU6ICgpID0+IEJhbmtub3RlLAogIEJhbmtub3RlQXJyb3dEb3duOiAoKSA9PiBCYW5rbm90ZUFycm93RG93biwKICBCYW5rbm90ZUFycm93VXA6ICgpID0+IEJhbmtub3RlQXJyb3dVcCwKICBCYW5rbm90ZVg6ICgpID0+IEJhbmtub3RlWCwKICBCYXJDaGFydDogKCkgPT4gQ2hhcnROb0F4ZXNDb2x1bW5JbmNyZWFzaW5nLAogIEJhckNoYXJ0MjogKCkgPT4gQ2hhcnROb0F4ZXNDb2x1bW4sCiAgQmFyQ2hhcnQzOiAoKSA9PiBDaGFydENvbHVtbiwKICBCYXJDaGFydDQ6ICgpID0+IENoYXJ0Q29sdW1uSW5jcmVhc2luZywKICBCYXJDaGFydEJpZzogKCkgPT4gQ2hhcnRDb2x1bW5CaWcsCiAgQmFyQ2hhcnRIb3Jpem9udGFsOiAoKSA9PiBDaGFydEJhciwKICBCYXJDaGFydEhvcml6b250YWxCaWc6ICgpID0+IENoYXJ0QmFyQmlnLAogIEJhcmNvZGU6ICgpID0+IEJhcmNvZGUsCiAgQmFycmVsOiAoKSA9PiBCYXJyZWwsCiAgQmFzZWxpbmU6ICgpID0+IEJhc2VsaW5lLAogIEJhdGg6ICgpID0+IEJhdGgsCiAgQmF0dGVyeTogKCkgPT4gQmF0dGVyeSwKICBCYXR0ZXJ5Q2hhcmdpbmc6ICgpID0+IEJhdHRlcnlDaGFyZ2luZywKICBCYXR0ZXJ5RnVsbDogKCkgPT4gQmF0dGVyeUZ1bGwsCiAgQmF0dGVyeUxvdzogKCkgPT4gQmF0dGVyeUxvdywKICBCYXR0ZXJ5TWVkaXVtOiAoKSA9PiBCYXR0ZXJ5TWVkaXVtLAogIEJhdHRlcnlQbHVzOiAoKSA9PiBCYXR0ZXJ5UGx1cywKICBCYXR0ZXJ5V2FybmluZzogKCkgPT4gQmF0dGVyeVdhcm5pbmcsCiAgQmVha2VyOiAoKSA9PiBCZWFrZXIsCiAgQmVhbjogKCkgPT4gQmVhbiwKICBCZWFuT2ZmOiAoKSA9PiBCZWFuT2ZmLAogIEJlZDogKCkgPT4gQmVkLAogIEJlZERvdWJsZTogKCkgPT4gQmVkRG91YmxlLAogIEJlZFNpbmdsZTogKCkgPT4gQmVkU2luZ2xlLAogIEJlZWY6ICgpID0+IEJlZWYsCiAgQmVlcjogKCkgPT4gQmVlciwKICBCZWVyT2ZmOiAoKSA9PiBCZWVyT2ZmLAogIEJlbGw6ICgpID0+IEJlbGwsCiAgQmVsbERvdDogKCkgPT4gQmVsbERvdCwKICBCZWxsRWxlY3RyaWM6ICgpID0+IEJlbGxFbGVjdHJpYywKICBCZWxsTWludXM6ICgpID0+IEJlbGxNaW51cywKICBCZWxsT2ZmOiAoKSA9PiBCZWxsT2ZmLAogIEJlbGxQbHVzOiAoKSA9PiBCZWxsUGx1cywKICBCZWxsUmluZzogKCkgPT4gQmVsbFJpbmcsCiAgQmV0d2Vlbkhvcml6b25hbEVuZDogKCkgPT4gQmV0d2Vlbkhvcml6b250YWxFbmQsCiAgQmV0d2Vlbkhvcml6b25hbFN0YXJ0OiAoKSA9PiBCZXR3ZWVuSG9yaXpvbnRhbFN0YXJ0LAogIEJldHdlZW5Ib3Jpem9udGFsRW5kOiAoKSA9PiBCZXR3ZWVuSG9yaXpvbnRhbEVuZCwKICBCZXR3ZWVuSG9yaXpvbnRhbFN0YXJ0OiAoKSA9PiBCZXR3ZWVuSG9yaXpvbnRhbFN0YXJ0LAogIEJldHdlZW5WZXJ0aWNhbEVuZDogKCkgPT4gQmV0d2VlblZlcnRpY2FsRW5kLAogIEJldHdlZW5WZXJ0aWNhbFN0YXJ0OiAoKSA9PiBCZXR3ZWVuVmVydGljYWxTdGFydCwKICBCaWNlcHNGbGV4ZWQ6ICgpID0+IEJpY2Vwc0ZsZXhlZCwKICBCaWtlOiAoKSA9PiBCaWtlLAogIEJpbmFyeTogKCkgPT4gQmluYXJ5LAogIEJpbm9jdWxhcnM6ICgpID0+IEJpbm9jdWxhcnMsCiAgQmlvaGF6YXJkOiAoKSA9PiBCaW9oYXphcmQsCiAgQmlyZDogKCkgPT4gQmlyZCwKICBCaXJkaG91c2U6ICgpID0+IEJpcmRob3VzZSwKICBCaXRjb2luOiAoKSA9PiBCaXRjb2luLAogIEJsZW5kOiAoKSA9PiBCbGVuZCwKICBCbGluZHM6ICgpID0+IEJsaW5kcywKICBCbG9ja3M6ICgpID0+IEJsb2NrcywKICBCbHVldG9vdGg6ICgpID0+IEJsdWV0b290aCwKICBCbHVldG9vdGhDb25uZWN0ZWQ6ICgpID0+IEJsdWV0b290aENvbm5lY3RlZCwKICBCbHVldG9vdGhPZmY6ICgpID0+IEJsdWV0b290aE9mZiwKICBCbHVldG9vdGhTZWFyY2hpbmc6ICgpID0+IEJsdWV0b290aFNlYXJjaGluZywKICBCb2xkOiAoKSA9PiBCb2xkLAogIEJvbHQ6ICgpID0+IEJvbHQsCiAgQm9tYjogKCkgPT4gQm9tYiwKICBCb25lOiAoKSA9PiBCb25lLAogIEJvb2s6ICgpID0+IEJvb2ssCiAgQm9va0E6ICgpID0+IEJvb2tBLAogIEJvb2tBbGVydDogKCkgPT4gQm9va0FsZXJ0LAogIEJvb2tBdWRpbzogKCkgPT4gQm9va0F1ZGlvLAogIEJvb2tDaGVjazogKCkgPT4gQm9va0NoZWNrLAogIEJvb2tDb3B5OiAoKSA9PiBCb29rQ29weSwKICBCb29rRGFzaGVkOiAoKSA9PiBCb29rRGFzaGVkLAogIEJvb2tEb3duOiAoKSA9PiBCb29rRG93biwKICBCb29rSGVhZHBob25lczogKCkgPT4gQm9va0hlYWRwaG9uZXMsCiAgQm9va0hlYXJ0OiAoKSA9PiBCb29rSGVhcnQsCiAgQm9va0ltYWdlOiAoKSA9PiBCb29rSW1hZ2UsCiAgQm9va0tleTogKCkgPT4gQm9va0tleSwKICBCb29rTG9jazogKCkgPT4gQm9va0xvY2ssCiAgQm9va01hcmtlZDogKCkgPT4gQm9va01hcmtlZCwKICBCb29rTWludXM6ICgpID0+IEJvb2tNaW51cywKICBCb29rT3BlbjogKCkgPT4gQm9va09wZW4sCiAgQm9va09wZW5DaGVjazogKCkgPT4gQm9va09wZW5DaGVjaywKICBCb29rT3BlblRleHQ6ICgpID0+IEJvb2tPcGVuVGV4dCwKICBCb29rUGx1czogKCkgPT4gQm9va1BsdXMsCiAgQm9va1NlYXJjaDogKCkgPT4gQm9va1NlYXJjaCwKICBCb29rVGVtcGxhdGU6ICgpID0+IEJvb2tEYXNoZWQsCiAgQm9va1RleHQ6ICgpID0+IEJvb2tUZXh0LAogIEJvb2tUeXBlOiAoKSA9PiBCb29rVHlwZSwKICBCb29rVXA6ICgpID0+IEJvb2tVcCwKICBCb29rVXAyOiAoKSA9PiBCb29rVXAyLAogIEJvb2tVc2VyOiAoKSA9PiBCb29rVXNlciwKICBCb29rWDogKCkgPT4gQm9va1gsCiAgQm9va21hcms6ICgpID0+IEJvb2ttYXJrLAogIEJvb2ttYXJrQ2hlY2s6ICgpID0+IEJvb2ttYXJrQ2hlY2ssCiAgQm9va21hcmtNaW51czogKCkgPT4gQm9va21hcmtNaW51cywKICBCb29rbWFya1BsdXM6ICgpID0+IEJvb2ttYXJrUGx1cywKICBCb29rbWFya1g6ICgpID0+IEJvb2ttYXJrWCwKICBCb29tQm94OiAoKSA9PiBCb29tQm94LAogIEJvdDogKCkgPT4gQm90LAogIEJvdE1lc3NhZ2VTcXVhcmU6ICgpID0+IEJvdE1lc3NhZ2VTcXVhcmUsCiAgQm90T2ZmOiAoKSA9PiBCb3RPZmYsCiAgQm90dGxlV2luZTogKCkgPT4gQm90dGxlV2luZSwKICBCb3dBcnJvdzogKCkgPT4gQm93QXJyb3csCiAgQm94OiAoKSA9PiBCb3gsCiAgQm94U2VsZWN0OiAoKSA9PiBTcXVhcmVEYXNoZWQsCiAgQm94ZXM6ICgpID0+IEJveGVzLAogIEJyYWNlczogKCkgPT4gQnJhY2VzLAogIEJyYWNrZXRzOiAoKSA9PiBCcmFja2V0cywKICBCcmFpbjogKCkgPT4gQnJhaW4sCiAgQnJhaW5DaXJjdWl0OiAoKSA9PiBCcmFpbkNpcmN1aXQsCiAgQnJhaW5Db2c6ICgpID0+IEJyYWluQ29nLAogIEJyaWNrV2FsbDogKCkgPT4gQnJpY2tXYWxsLAogIEJyaWNrV2FsbEZpcmU6ICgpID0+IEJyaWNrV2FsbEZpcmUsCiAgQnJpY2tXYWxsU2hpZWxkOiAoKSA9PiBCcmlja1dhbGxTaGllbGQsCiAgQnJpZWZjYXNlOiAoKSA9PiBCcmllZmNhc2UsCiAgQnJpZWZjYXNlQnVzaW5lc3M6ICgpID0+IEJyaWVmY2FzZUJ1c2luZXNzLAogIEJyaWVmY2FzZUNvbnZleW9yQmVsdDogKCkgPT4gQnJpZWZjYXNlQ29udmV5b3JCZWx0LAogIEJyaWVmY2FzZU1lZGljYWw6ICgpID0+IEJyaWVmY2FzZU1lZGljYWwsCiAgQnJpbmdUb0Zyb250OiAoKSA9PiBCcmluZ1RvRnJvbnQsCiAgQnJ1c2g6ICgpID0+IEJydXNoLAogIEJydXNoQ2xlYW5pbmc6ICgpID0+IEJydXNoQ2xlYW5pbmcsCiAgQnViYmxlczogKCkgPT4gQnViYmxlcywKICBCdWc6ICgpID0+IEJ1ZywKICBCdWdPZmY6ICgpID0+IEJ1Z09mZiwKICBCdWdQbGF5OiAoKSA9PiBCdWdQbGF5LAogIEJ1aWxkaW5nOiAoKSA9PiBCdWlsZGluZywKICBCdWlsZGluZzI6ICgpID0+IEJ1aWxkaW5nMiwKICBCdXM6ICgpID0+IEJ1cywKICBCdXNGcm9udDogKCkgPT4gQnVzRnJvbnQsCiAgQ2FibGU6ICgpID0+IENhYmxlLAogIENhYmxlQ2FyOiAoKSA9PiBDYWJsZUNhciwKICBDYWtlOiAoKSA9PiBDYWtlLAogIENha2VTbGljZTogKCkgPT4gQ2FrZVNsaWNlLAogIENhbGN1bGF0b3I6ICgpID0+IENhbGN1bGF0b3IsCiAgQ2FsZW5kYXI6ICgpID0+IENhbGVuZGFyLAogIENhbGVuZGFyMTogKCkgPT4gQ2FsZW5kYXIxLAogIENhbGVuZGFyQXJyb3dEb3duOiAoKSA9PiBDYWxlbmRhckFycm93RG93biwKICBDYWxlbmRhckFycm93VXA6ICgpID0+IENhbGVuZGFyQXJyb3dVcCwKICBDYWxlbmRhckNoZWNrOiAoKSA9PiBDYWxlbmRhckNoZWNrLAogIENhbGVuZGFyQ2hlY2syOiAoKSA9PiBDYWxlbmRhckNoZWNrMiwKICBDYWxlbmRhckNsb2NrOiAoKSA9PiBDYWxlbmRhckNsb2NrLAogIENhbGVuZGFyQ29nOiAoKSA9PiBDYWxlbmRhckNvZywKICBDYWxlbmRhckRheXM6ICgpID0+IENhbGVuZGFyRGF5cywKICBDYWxlbmRhckZvbGQ6ICgpID0+IENhbGVuZGFyRm9sZCwKICBDYWxlbmRhckhlYXJ0OiAoKSA9PiBDYWxlbmRhckhlYXJ0LAogIENhbGVuZGFyTWludXM6ICgpID0+IENhbGVuZGFyTWludXMsCiAgQ2FsZW5kYXJNaW51czI6ICgpID0+IENhbGVuZGFyTWludXMyLAogIENhbGVuZGFyT2ZmOiAoKSA9PiBDYWxlbmRhck9mZiwKICBDYWxlbmRhclBsdXM6ICgpID0+IENhbGVuZGFyUGx1cywKICBDYWxlbmRhclBsdXMyOiAoKSA9PiBDYWxlbmRhclBsdXMyLAogIENhbGVuZGFyUmFuZ2U6ICgpID0+IENhbGVuZGFyUmFuZ2UsCiAgQ2FsZW5kYXJTZWFyY2g6ICgpID0+IENhbGVuZGFyU2VhcmNoLAogIENhbGVuZGFyU3luYzogKCkgPT4gQ2FsZW5kYXJTeW5jLAogIENhbGVuZGFyWDogKCkgPT4gQ2FsZW5kYXJYLAogIENhbGVuZGFyWDI6ICgpID0+IENhbGVuZGFyWDIsCiAgQ2FsZW5kYXJzOiAoKSA9PiBDYWxlbmRhcnMsCiAgQ2FtZXJhOiAoKSA9PiBDYW1lcmEsCiAgQ2FtZXJhT2ZmOiAoKSA9PiBDYW1lcmFPZmYsCiAgQ2FuZGxlc3RpY2tDaGFydDogKCkgPT4gQ2hhcnRDYW5kbGVzdGljaywKICBDYW5keTogKCkgPT4gQ2FuZHksCiAgQ2FuZHlDYW5lOiAoKSA9PiBDYW5keUNhbmUsCiAgQ2FuZHlPZmY6ICgpID0+IENhbmR5T2ZmLAogIENhbm5hYmlzOiAoKSA9PiBDYW5uYWJpcywKICBDYW5uYWJpc09mZjogKCkgPT4gQ2FubmFiaXNPZmYsCiAgQ2FwdGlvbnM6ICgpID0+IENhcHRpb25zLAogIENhcHRpb25zT2ZmOiAoKSA9PiBDYXB0aW9uc09mZiwKICBDYXI6ICgpID0+IENhciwKICBDYXJGcm9udDogKCkgPT4gQ2FyRnJvbnQsCiAgQ2FyVGF4aUZyb250OiAoKSA9PiBDYXJUYXhpRnJvbnQsCiAgQ2FyYXZhbjogKCkgPT4gQ2FyYXZhbiwKICBDYXJkU2ltOiAoKSA9PiBDYXJkU2ltLAogIENhcnJvdDogKCkgPT4gQ2Fycm90LAogIENhc2VMb3dlcjogKCkgPT4gQ2FzZUxvd2VyLAogIENhc2VTZW5zaXRpdmU6ICgpID0+IENhc2VTZW5zaXRpdmUsCiAgQ2FzZVVwcGVyOiAoKSA9PiBDYXNlVXBwZXIsCiAgQ2Fzc2V0dGVUYXBlOiAoKSA9PiBDYXNzZXR0ZVRhcGUsCiAgQ2FzdDogKCkgPT4gQ2FzdCwKICBDYXN0bGU6ICgpID0+IENhc3RsZSwKICBDYXQ6ICgpID0+IENhdCwKICBDY3R2OiAoKSA9PiBDY3R2LAogIENoYXJ0QXJlYTogKCkgPT4gQ2hhcnRBcmVhLAogIENoYXJ0QmFyOiAoKSA9PiBDaGFydEJhciwKICBDaGFydEJhckJpZzogKCkgPT4gQ2hhcnRCYXJCaWcsCiAgQ2hhcnRCYXJEZWNyZWFzaW5nOiAoKSA9PiBDaGFydEJhckRlY3JlYXNpbmcsCiAgQ2hhcnRCYXJJbmNyZWFzaW5nOiAoKSA9PiBDaGFydEJhckluY3JlYXNpbmcsCiAgQ2hhcnRCYXJTdGFja2VkOiAoKSA9PiBDaGFydEJhclN0YWNrZWQsCiAgQ2hhcnRDYW5kbGVzdGljazogKCkgPT4gQ2hhcnRDYW5kbGVzdGljaywKICBDaGFydENvbHVtbjogKCkgPT4gQ2hhcnRDb2x1bW4sCiAgQ2hhcnRDb2x1bW5CaWc6ICgpID0+IENoYXJ0Q29sdW1uQmlnLAogIENoYXJ0Q29sdW1uRGVjcmVhc2luZzogKCkgPT4gQ2hhcnRDb2x1bW5EZWNyZWFzaW5nLAogIENoYXJ0Q29sdW1uSW5jcmVhc2luZzogKCkgPT4gQ2hhcnRDb2x1bW5JbmNyZWFzaW5nLAogIENoYXJ0Q29sdW1uU3RhY2tlZDogKCkgPT4gQ2hhcnRDb2x1bW5TdGFja2VkLAogIENoYXJ0R2FudHQ6ICgpID0+IENoYXJ0R2FudHQsCiAgQ2hhcnRMaW5lOiAoKSA9PiBDaGFydExpbmUsCiAgQ2hhcnROZXR3b3JrOiAoKSA9PiBDaGFydE5ldHdvcmssCiAgQ2hhcnROb0F4ZXNDb2x1bW46ICgpID0+IENoYXJ0Tm9BeGVzQ29sdW1uLAogIENoYXJ0Tm9BeGVzQ29sdW1uRGVjcmVhc2luZzogKCkgPT4gQ2hhcnROb0F4ZXNDb2x1bW5EZWNyZWFzaW5nLAogIENoYXJ0Tm9BeGVzQ29sdW1uSW5jcmVhc2luZzogKCkgPT4gQ2hhcnROb0F4ZXNDb2x1bW5JbmNyZWFzaW5nLAogIENoYXJ0Tm9BeGVzQ29tYmluZWQ6ICgpID0+IENoYXJ0Tm9BeGVzQ29tYmluZWQsCiAgQ2hhcnROb0F4ZXNHYW50dDogKCkgPT4gQ2hhcnROb0F4ZXNHYW50dCwKICBDaGFydFBpZTogKCkgPT4gQ2hhcnRQaWUsCiAgQ2hhcnRTY2F0dGVyOiAoKSA9PiBDaGFydFNjYXR0ZXIsCiAgQ2hhcnRTcGxpbmU6ICgpID0+IENoYXJ0U3BsaW5lLAogIENoZWNrOiAoKSA9PiBDaGVjaywKICBDaGVja0NoZWNrOiAoKSA9PiBDaGVja0NoZWNrLAogIENoZWNrQ2lyY2xlOiAoKSA9PiBDaXJjbGVDaGVja0JpZywKICBDaGVja0NpcmNsZTI6ICgpID0+IENpcmNsZUNoZWNrLAogIENoZWNrTGluZTogKCkgPT4gQ2hlY2tMaW5lLAogIENoZWNrU3F1YXJlOiAoKSA9PiBTcXVhcmVDaGVja0JpZywKICBDaGVja1NxdWFyZTI6ICgpID0+IFNxdWFyZUNoZWNrLAogIENoZWZIYXQ6ICgpID0+IENoZWZIYXQsCiAgQ2hlcnJ5OiAoKSA9PiBDaGVycnksCiAgQ2hlc3NCaXNob3A6ICgpID0+IENoZXNzQmlzaG9wLAogIENoZXNzS2luZzogKCkgPT4gQ2hlc3NLaW5nLAogIENoZXNzS25pZ2h0OiAoKSA9PiBDaGVzc0tuaWdodCwKICBDaGVzc1Bhd246ICgpID0+IENoZXNzUGF3biwKICBDaGVzc1F1ZWVuOiAoKSA9PiBDaGVzc1F1ZWVuLAogIENoZXNzUm9vazogKCkgPT4gQ2hlc3NSb29rLAogIENoZXZyb25Eb3duOiAoKSA9PiBDaGV2cm9uRG93biwKICBDaGV2cm9uRG93bkNpcmNsZTogKCkgPT4gQ2lyY2xlQ2hldnJvbkRvd24sCiAgQ2hldnJvbkRvd25TcXVhcmU6ICgpID0+IFNxdWFyZUNoZXZyb25Eb3duLAogIENoZXZyb25GaXJzdDogKCkgPT4gQ2hldnJvbkZpcnN0LAogIENoZXZyb25MYXN0OiAoKSA9PiBDaGV2cm9uTGFzdCwKICBDaGV2cm9uTGVmdDogKCkgPT4gQ2hldnJvbkxlZnQsCiAgQ2hldnJvbkxlZnRDaXJjbGU6ICgpID0+IENpcmNsZUNoZXZyb25MZWZ0LAogIENoZXZyb25MZWZ0U3F1YXJlOiAoKSA9PiBTcXVhcmVDaGV2cm9uTGVmdCwKICBDaGV2cm9uUmlnaHQ6ICgpID0+IENoZXZyb25SaWdodCwKICBDaGV2cm9uUmlnaHRDaXJjbGU6ICgpID0+IENpcmNsZUNoZXZyb25SaWdodCwKICBDaGV2cm9uUmlnaHRTcXVhcmU6ICgpID0+IFNxdWFyZUNoZXZyb25SaWdodCwKICBDaGV2cm9uVXA6ICgpID0+IENoZXZyb25VcCwKICBDaGV2cm9uVXBDaXJjbGU6ICgpID0+IENpcmNsZUNoZXZyb25VcCwKICBDaGV2cm9uVXBTcXVhcmU6ICgpID0+IFNxdWFyZUNoZXZyb25VcCwKICBDaGV2cm9uc0Rvd246ICgpID0+IENoZXZyb25zRG93biwKICBDaGV2cm9uc0Rvd25VcDogKCkgPT4gQ2hldnJvbnNEb3duVXAsCiAgQ2hldnJvbnNMZWZ0OiAoKSA9PiBDaGV2cm9uc0xlZnQsCiAgQ2hldnJvbnNMZWZ0UmlnaHQ6ICgpID0+IENoZXZyb25zTGVmdFJpZ2h0LAogIENoZXZyb25zTGVmdFJpZ2h0RWxsaXBzaXM6ICgpID0+IENoZXZyb25zTGVmdFJpZ2h0RWxsaXBzaXMsCiAgQ2hldnJvbnNSaWdodDogKCkgPT4gQ2hldnJvbnNSaWdodCwKICBDaGV2cm9uc1JpZ2h0TGVmdDogKCkgPT4gQ2hldnJvbnNSaWdodExlZnQsCiAgQ2hldnJvbnNVcDogKCkgPT4gQ2hldnJvbnNVcCwKICBDaGV2cm9uc1VwRG93bjogKCkgPT4gQ2hldnJvbnNVcERvd24sCiAgQ2hyb21lOiAoKSA9PiBDaHJvbWl1bSwKICBDaHJvbWl1bTogKCkgPT4gQ2hyb21pdW0sCiAgQ2h1cmNoOiAoKSA9PiBDaHVyY2gsCiAgQ2lnYXJldHRlOiAoKSA9PiBDaWdhcmV0dGUsCiAgQ2lnYXJldHRlT2ZmOiAoKSA9PiBDaWdhcmV0dGVPZmYsCiAgQ2lyY2xlOiAoKSA9PiBDaXJjbGUsCiAgQ2lyY2xlQWxlcnQ6ICgpID0+IENpcmNsZUFsZXJ0LAogIENpcmNsZUFycm93RG93bjogKCkgPT4gQ2lyY2xlQXJyb3dEb3duLAogIENpcmNsZUFycm93TGVmdDogKCkgPT4gQ2lyY2xlQXJyb3dMZWZ0LAogIENpcmNsZUFycm93T3V0RG93bkxlZnQ6ICgpID0+IENpcmNsZUFycm93T3V0RG93bkxlZnQsCiAgQ2lyY2xlQXJyb3dPdXREb3duUmlnaHQ6ICgpID0+IENpcmNsZUFycm93T3V0RG93blJpZ2h0LAogIENpcmNsZUFycm93T3V0VXBMZWZ0OiAoKSA9PiBDaXJjbGVBcnJvd091dFVwTGVmdCwKICBDaXJjbGVBcnJvd091dFVwUmlnaHQ6ICgpID0+IENpcmNsZUFycm93T3V0VXBSaWdodCwKICBDaXJjbGVBcnJvd1JpZ2h0OiAoKSA9PiBDaXJjbGVBcnJvd1JpZ2h0LAogIENpcmNsZUFycm93VXA6ICgpID0+IENpcmNsZUFycm93VXAsCiAgQ2lyY2xlQ2hlY2s6ICgpID0+IENpcmNsZUNoZWNrLAogIENpcmNsZUNoZWNrQmlnOiAoKSA9PiBDaXJjbGVDaGVja0JpZywKICBDaXJjbGVDaGV2cm9uRG93bjogKCkgPT4gQ2lyY2xlQ2hldnJvbkRvd24sCiAgQ2lyY2xlQ2hldnJvbkxlZnQ6ICgpID0+IENpcmNsZUNoZXZyb25MZWZ0LAogIENpcmNsZUNoZXZyb25SaWdodDogKCkgPT4gQ2lyY2xlQ2hldnJvblJpZ2h0LAogIENpcmNsZUNoZXZyb25VcDogKCkgPT4gQ2lyY2xlQ2hldnJvblVwLAogIENpcmNsZURhc2hlZDogKCkgPT4gQ2lyY2xlRGFzaGVkLAogIENpcmNsZURpdmlkZTogKCkgPT4gQ2lyY2xlRGl2aWRlLAogIENpcmNsZURvbGxhclNpZ246ICgpID0+IENpcmNsZURvbGxhclNpZ24sCiAgQ2lyY2xlRG90OiAoKSA9PiBDaXJjbGVEb3QsCiAgQ2lyY2xlRG90RGFzaGVkOiAoKSA9PiBDaXJjbGVEb3REYXNoZWQsCiAgQ2lyY2xlRWxsaXBzaXM6ICgpID0+IENpcmNsZUVsbGlwc2lzLAogIENpcmNsZUVxdWFsOiAoKSA9PiBDaXJjbGVFcXVhbCwKICBDaXJjbGVGYWRpbmdBcnJvd1VwOiAoKSA9PiBDaXJjbGVGYWRpbmdBcnJvd1VwLAogIENpcmNsZUZhZGluZ1BsdXM6ICgpID0+IENpcmNsZUZhZGluZ1BsdXMsCiAgQ2lyY2xlR2F1Z2U6ICgpID0+IENpcmNsZUdhdWdlLAogIENpcmNsZUhlbHA6ICgpID0+IENpcmNsZVF1ZXN0aW9uTWFyaywKICBDaXJjbGVNaW51czogKCkgPT4gQ2lyY2xlTWludXMsCiAgQ2lyY2xlT2ZmOiAoKSA9PiBDaXJjbGVPZmYsCiAgQ2lyY2xlUGFya2luZzogKCkgPT4gQ2lyY2xlUGFya2luZywKICBDaXJjbGVQYXJraW5nT2ZmOiAoKSA9PiBDaXJjbGVQYXJraW5nT2ZmLAogIENpcmNsZVBhdXNlOiAoKSA9PiBDaXJjbGVQYXVzZSwKICBDaXJjbGVQZXJjZW50OiAoKSA9PiBDaXJjbGVQZXJjZW50LAogIENpcmNsZVBpbGU6ICgpID0+IENpcmNsZVBpbGUsCiAgQ2lyY2xlUGxheTogKCkgPT4gQ2lyY2xlUGxheSwKICBDaXJjbGVQbHVzOiAoKSA9PiBDaXJjbGVQbHVzLAogIENpcmNsZVBvdW5kU3Rlcmxpbmc6ICgpID0+IENpcmNsZVBvdW5kU3RlcmxpbmcsCiAgQ2lyY2xlUG93ZXI6ICgpID0+IENpcmNsZVBvd2VyLAogIENpcmNsZVF1ZXN0aW9uTWFyazogKCkgPT4gQ2lyY2xlUXVlc3Rpb25NYXJrLAogIENpcmNsZVNsYXNoOiAoKSA9PiBDaXJjbGVTbGFzaCwKICBDaXJjbGVTbGFzaDI6ICgpID0+IENpcmNsZVNsYXNoMiwKICBDaXJjbGVTbGFzaGVkOiAoKSA9PiBDaXJjbGVTbGFzaDIsCiAgQ2lyY2xlU21hbGw6ICgpID0+IENpcmNsZVNtYWxsLAogIENpcmNsZVN0YXI6ICgpID0+IENpcmNsZVN0YXIsCiAgQ2lyY2xlU3RvcDogKCkgPT4gQ2lyY2xlU3RvcCwKICBDaXJjbGVVc2VyOiAoKSA9PiBDaXJjbGVVc2VyLAogIENpcmNsZVVzZXJSb3VuZDogKCkgPT4gQ2lyY2xlVXNlclJvdW5kLAogIENpcmNsZVg6ICgpID0+IENpcmNsZVgsCiAgQ2lyY3VpdEJvYXJkOiAoKSA9PiBDaXJjdWl0Qm9hcmQsCiAgQ2l0cnVzOiAoKSA9PiBDaXRydXMsCiAgQ2xhcHBlcmJvYXJkOiAoKSA9PiBDbGFwcGVyYm9hcmQsCiAgQ2xpcGJvYXJkOiAoKSA9PiBDbGlwYm9hcmQsCiAgQ2xpcGJvYXJkQ2hlY2s6ICgpID0+IENsaXBib2FyZENoZWNrLAogIENsaXBib2FyZENsb2NrOiAoKSA9PiBDbGlwYm9hcmRDbG9jaywKICBDbGlwYm9hcmRDb3B5OiAoKSA9PiBDbGlwYm9hcmRDb3B5LAogIENsaXBib2FyZEVkaXQ6ICgpID0+IENsaXBib2FyZFBlbiwKICBDbGlwYm9hcmRMaXN0OiAoKSA9PiBDbGlwYm9hcmRMaXN0LAogIENsaXBib2FyZE1pbnVzOiAoKSA9PiBDbGlwYm9hcmRNaW51cywKICBDbGlwYm9hcmRQYXN0ZTogKCkgPT4gQ2xpcGJvYXJkUGFzdGUsCiAgQ2xpcGJvYXJkUGVuOiAoKSA9PiBDbGlwYm9hcmRQZW4sCiAgQ2xpcGJvYXJkUGVuTGluZTogKCkgPT4gQ2xpcGJvYXJkUGVuTGluZSwKICBDbGlwYm9hcmRQbHVzOiAoKSA9PiBDbGlwYm9hcmRQbHVzLAogIENsaXBib2FyZFNpZ25hdHVyZTogKCkgPT4gQ2xpcGJvYXJkUGVuTGluZSwKICBDbGlwYm9hcmRUeXBlOiAoKSA9PiBDbGlwYm9hcmRUeXBlLAogIENsaXBib2FyZFg6ICgpID0+IENsaXBib2FyZFgsCiAgQ2xvY2s6ICgpID0+IENsb2NrLAogIENsb2NrMTogKCkgPT4gQ2xvY2sxLAogIENsb2NrMTA6ICgpID0+IENsb2NrMTAsCiAgQ2xvY2sxMTogKCkgPT4gQ2xvY2sxMSwKICBDbG9jazEyOiAoKSA9PiBDbG9jazEyLAogIENsb2NrMjogKCkgPT4gQ2xvY2syLAogIENsb2NrMzogKCkgPT4gQ2xvY2szLAogIENsb2NrNDogKCkgPT4gQ2xvY2s0LAogIENsb2NrNTogKCkgPT4gQ2xvY2s1LAogIENsb2NrNjogKCkgPT4gQ2xvY2s2LAogIENsb2NrNzogKCkgPT4gQ2xvY2s3LAogIENsb2NrODogKCkgPT4gQ2xvY2s4LAogIENsb2NrOTogKCkgPT4gQ2xvY2s5LAogIENsb2NrQWxlcnQ6ICgpID0+IENsb2NrQWxlcnQsCiAgQ2xvY2tBcnJvd0Rvd246ICgpID0+IENsb2NrQXJyb3dEb3duLAogIENsb2NrQXJyb3dVcDogKCkgPT4gQ2xvY2tBcnJvd1VwLAogIENsb2NrQ2hlY2s6ICgpID0+IENsb2NrQ2hlY2ssCiAgQ2xvY2tGYWRpbmc6ICgpID0+IENsb2NrRmFkaW5nLAogIENsb2NrUGx1czogKCkgPT4gQ2xvY2tQbHVzLAogIENsb3NlZENhcHRpb246ICgpID0+IENsb3NlZENhcHRpb24sCiAgQ2xvdWQ6ICgpID0+IENsb3VkLAogIENsb3VkQWxlcnQ6ICgpID0+IENsb3VkQWxlcnQsCiAgQ2xvdWRCYWNrdXA6ICgpID0+IENsb3VkQmFja3VwLAogIENsb3VkQ2hlY2s6ICgpID0+IENsb3VkQ2hlY2ssCiAgQ2xvdWRDb2c6ICgpID0+IENsb3VkQ29nLAogIENsb3VkRG93bmxvYWQ6ICgpID0+IENsb3VkRG93bmxvYWQsCiAgQ2xvdWREcml6emxlOiAoKSA9PiBDbG91ZERyaXp6bGUsCiAgQ2xvdWRGb2c6ICgpID0+IENsb3VkRm9nLAogIENsb3VkSGFpbDogKCkgPT4gQ2xvdWRIYWlsLAogIENsb3VkTGlnaHRuaW5nOiAoKSA9PiBDbG91ZExpZ2h0bmluZywKICBDbG91ZE1vb246ICgpID0+IENsb3VkTW9vbiwKICBDbG91ZE1vb25SYWluOiAoKSA9PiBDbG91ZE1vb25SYWluLAogIENsb3VkT2ZmOiAoKSA9PiBDbG91ZE9mZiwKICBDbG91ZFJhaW46ICgpID0+IENsb3VkUmFpbiwKICBDbG91ZFJhaW5XaW5kOiAoKSA9PiBDbG91ZFJhaW5XaW5kLAogIENsb3VkU25vdzogKCkgPT4gQ2xvdWRTbm93LAogIENsb3VkU3VuOiAoKSA9PiBDbG91ZFN1biwKICBDbG91ZFN1blJhaW46ICgpID0+IENsb3VkU3VuUmFpbiwKICBDbG91ZFN5bmM6ICgpID0+IENsb3VkU3luYywKICBDbG91ZFVwbG9hZDogKCkgPT4gQ2xvdWRVcGxvYWQsCiAgQ2xvdWR5OiAoKSA9PiBDbG91ZHksCiAgQ2xvdmVyOiAoKSA9PiBDbG92ZXIsCiAgQ2x1YjogKCkgPT4gQ2x1YiwKICBDb2RlOiAoKSA9PiBDb2RlLAogIENvZGUyOiAoKSA9PiBDb2RlWG1sLAogIENvZGVTcXVhcmU6ICgpID0+IFNxdWFyZUNvZGUsCiAgQ29kZVhtbDogKCkgPT4gQ29kZVhtbCwKICBDb2RlcGVuOiAoKSA9PiBDb2RlcGVuLAogIENvZGVzYW5kYm94OiAoKSA9PiBDb2Rlc2FuZGJveCwKICBDb2ZmZWU6ICgpID0+IENvZmZlZSwKICBDb2c6ICgpID0+IENvZywKICBDb2luczogKCkgPT4gQ29pbnMsCiAgQ29sdW1uczogKCkgPT4gQ29sdW1uczIsCiAgQ29sdW1uczI6ICgpID0+IENvbHVtbnMyLAogIENvbHVtbnMzOiAoKSA9PiBDb2x1bW5zMywKICBDb2x1bW5zM0NvZzogKCkgPT4gQ29sdW1uczNDb2csCiAgQ29sdW1uczQ6ICgpID0+IENvbHVtbnM0LAogIENvbHVtbnNTZXR0aW5nczogKCkgPT4gQ29sdW1uczNDb2csCiAgQ29tYmluZTogKCkgPT4gQ29tYmluZSwKICBDb21tYW5kOiAoKSA9PiBDb21tYW5kLAogIENvbXBhc3M6ICgpID0+IENvbXBhc3MsCiAgQ29tcG9uZW50OiAoKSA9PiBDb21wb25lbnQsCiAgQ29tcHV0ZXI6ICgpID0+IENvbXB1dGVyLAogIENvbmNpZXJnZUJlbGw6ICgpID0+IENvbmNpZXJnZUJlbGwsCiAgQ29uZTogKCkgPT4gQ29uZSwKICBDb25zdHJ1Y3Rpb246ICgpID0+IENvbnN0cnVjdGlvbiwKICBDb250YWN0OiAoKSA9PiBDb250YWN0LAogIENvbnRhY3QyOiAoKSA9PiBDb250YWN0Um91bmQsCiAgQ29udGFjdFJvdW5kOiAoKSA9PiBDb250YWN0Um91bmQsCiAgQ29udGFpbmVyOiAoKSA9PiBDb250YWluZXIsCiAgQ29udHJhc3Q6ICgpID0+IENvbnRyYXN0LAogIENvb2tpZTogKCkgPT4gQ29va2llLAogIENvb2tpbmdQb3Q6ICgpID0+IENvb2tpbmdQb3QsCiAgQ29weTogKCkgPT4gQ29weSwKICBDb3B5Q2hlY2s6ICgpID0+IENvcHlDaGVjaywKICBDb3B5TWludXM6ICgpID0+IENvcHlNaW51cywKICBDb3B5UGx1czogKCkgPT4gQ29weVBsdXMsCiAgQ29weVNsYXNoOiAoKSA9PiBDb3B5U2xhc2gsCiAgQ29weVg6ICgpID0+IENvcHlYLAogIENvcHlsZWZ0OiAoKSA9PiBDb3B5bGVmdCwKICBDb3B5cmlnaHQ6ICgpID0+IENvcHlyaWdodCwKICBDb3JuZXJEb3duTGVmdDogKCkgPT4gQ29ybmVyRG93bkxlZnQsCiAgQ29ybmVyRG93blJpZ2h0OiAoKSA9PiBDb3JuZXJEb3duUmlnaHQsCiAgQ29ybmVyTGVmdERvd246ICgpID0+IENvcm5lckxlZnREb3duLAogIENvcm5lckxlZnRVcDogKCkgPT4gQ29ybmVyTGVmdFVwLAogIENvcm5lclJpZ2h0RG93bjogKCkgPT4gQ29ybmVyUmlnaHREb3duLAogIENvcm5lclJpZ2h0VXA6ICgpID0+IENvcm5lclJpZ2h0VXAsCiAgQ29ybmVyVXBMZWZ0OiAoKSA9PiBDb3JuZXJVcExlZnQsCiAgQ29ybmVyVXBSaWdodDogKCkgPT4gQ29ybmVyVXBSaWdodCwKICBDcHU6ICgpID0+IENwdSwKICBDcmVhdGl2ZUNvbW1vbnM6ICgpID0+IENyZWF0aXZlQ29tbW9ucywKICBDcmVkaXRDYXJkOiAoKSA9PiBDcmVkaXRDYXJkLAogIENyb2lzc2FudDogKCkgPT4gQ3JvaXNzYW50LAogIENyb3A6ICgpID0+IENyb3AsCiAgQ3Jvc3M6ICgpID0+IENyb3NzLAogIENyb3NzaGFpcjogKCkgPT4gQ3Jvc3NoYWlyLAogIENyb3duOiAoKSA9PiBDcm93biwKICBDdWJvaWQ6ICgpID0+IEN1Ym9pZCwKICBDdXBTb2RhOiAoKSA9PiBDdXBTb2RhLAogIEN1cmx5QnJhY2VzOiAoKSA9PiBCcmFjZXMsCiAgQ3VycmVuY3k6ICgpID0+IEN1cnJlbmN5LAogIEN5bGluZGVyOiAoKSA9PiBDeWxpbmRlciwKICBEYW06ICgpID0+IERhbSwKICBEYXRhYmFzZTogKCkgPT4gRGF0YWJhc2UsCiAgRGF0YWJhc2VCYWNrdXA6ICgpID0+IERhdGFiYXNlQmFja3VwLAogIERhdGFiYXNlU2VhcmNoOiAoKSA9PiBEYXRhYmFzZVNlYXJjaCwKICBEYXRhYmFzZVphcDogKCkgPT4gRGF0YWJhc2VaYXAsCiAgRGVjaW1hbHNBcnJvd0xlZnQ6ICgpID0+IERlY2ltYWxzQXJyb3dMZWZ0LAogIERlY2ltYWxzQXJyb3dSaWdodDogKCkgPT4gRGVjaW1hbHNBcnJvd1JpZ2h0LAogIERlbGV0ZTogKCkgPT4gRGVsZXRlLAogIERlc3NlcnQ6ICgpID0+IERlc3NlcnQsCiAgRGlhbWV0ZXI6ICgpID0+IERpYW1ldGVyLAogIERpYW1vbmQ6ICgpID0+IERpYW1vbmQsCiAgRGlhbW9uZE1pbnVzOiAoKSA9PiBEaWFtb25kTWludXMsCiAgRGlhbW9uZFBlcmNlbnQ6ICgpID0+IERpYW1vbmRQZXJjZW50LAogIERpYW1vbmRQbHVzOiAoKSA9PiBEaWFtb25kUGx1cywKICBEaWNlMTogKCkgPT4gRGljZTEsCiAgRGljZTI6ICgpID0+IERpY2UyLAogIERpY2UzOiAoKSA9PiBEaWNlMywKICBEaWNlNDogKCkgPT4gRGljZTQsCiAgRGljZTU6ICgpID0+IERpY2U1LAogIERpY2U2OiAoKSA9PiBEaWNlNiwKICBEaWNlczogKCkgPT4gRGljZXMsCiAgRGlmZjogKCkgPT4gRGlmZiwKICBEaXNjOiAoKSA9PiBEaXNjLAogIERpc2MyOiAoKSA9PiBEaXNjMiwKICBEaXNjMzogKCkgPT4gRGlzYzMsCiAgRGlzY0FsYnVtOiAoKSA9PiBEaXNjQWxidW0sCiAgRGl2aWRlOiAoKSA9PiBEaXZpZGUsCiAgRGl2aWRlQ2lyY2xlOiAoKSA9PiBDaXJjbGVEaXZpZGUsCiAgRGl2aWRlU3F1YXJlOiAoKSA9PiBTcXVhcmVEaXZpZGUsCiAgRG5hOiAoKSA9PiBEbmEsCiAgRG5hT2ZmOiAoKSA9PiBEbmFPZmYsCiAgRG9jazogKCkgPT4gRG9jaywKICBEb2c6ICgpID0+IERvZywKICBEb2xsYXJTaWduOiAoKSA9PiBEb2xsYXJTaWduLAogIERvbnV0OiAoKSA9PiBEb251dCwKICBEb29yQ2xvc2VkOiAoKSA9PiBEb29yQ2xvc2VkLAogIERvb3JDbG9zZWRMb2NrZWQ6ICgpID0+IERvb3JDbG9zZWRMb2NrZWQsCiAgRG9vck9wZW46ICgpID0+IERvb3JPcGVuLAogIERvdDogKCkgPT4gRG90LAogIERvdFNxdWFyZTogKCkgPT4gU3F1YXJlRG90LAogIERvd25sb2FkOiAoKSA9PiBEb3dubG9hZCwKICBEb3dubG9hZENsb3VkOiAoKSA9PiBDbG91ZERvd25sb2FkLAogIERyYWZ0aW5nQ29tcGFzczogKCkgPT4gRHJhZnRpbmdDb21wYXNzLAogIERyYW1hOiAoKSA9PiBEcmFtYSwKICBEcmliYmJsZTogKCkgPT4gRHJpYmJibGUsCiAgRHJpbGw6ICgpID0+IERyaWxsLAogIERyb25lOiAoKSA9PiBEcm9uZSwKICBEcm9wbGV0OiAoKSA9PiBEcm9wbGV0LAogIERyb3BsZXRPZmY6ICgpID0+IERyb3BsZXRPZmYsCiAgRHJvcGxldHM6ICgpID0+IERyb3BsZXRzLAogIERydW06ICgpID0+IERydW0sCiAgRHJ1bXN0aWNrOiAoKSA9PiBEcnVtc3RpY2ssCiAgRHVtYmJlbGw6ICgpID0+IER1bWJiZWxsLAogIEVhcjogKCkgPT4gRWFyLAogIEVhck9mZjogKCkgPT4gRWFyT2ZmLAogIEVhcnRoOiAoKSA9PiBFYXJ0aCwKICBFYXJ0aExvY2s6ICgpID0+IEVhcnRoTG9jaywKICBFY2xpcHNlOiAoKSA9PiBFY2xpcHNlLAogIEVkaXQ6ICgpID0+IFNxdWFyZVBlbiwKICBFZGl0MjogKCkgPT4gUGVuLAogIEVkaXQzOiAoKSA9PiBQZW5MaW5lLAogIEVnZzogKCkgPT4gRWdnLAogIEVnZ0ZyaWVkOiAoKSA9PiBFZ2dGcmllZCwKICBFZ2dPZmY6ICgpID0+IEVnZ09mZiwKICBFbGxpcHNlOiAoKSA9PiBFbGxpcHNlLAogIEVsbGlwc2lzOiAoKSA9PiBFbGxpcHNpcywKICBFbGxpcHNpc1ZlcnRpY2FsOiAoKSA9PiBFbGxpcHNpc1ZlcnRpY2FsLAogIEVxdWFsOiAoKSA9PiBFcXVhbCwKICBFcXVhbEFwcHJveGltYXRlbHk6ICgpID0+IEVxdWFsQXBwcm94aW1hdGVseSwKICBFcXVhbE5vdDogKCkgPT4gRXF1YWxOb3QsCiAgRXF1YWxTcXVhcmU6ICgpID0+IFNxdWFyZUVxdWFsLAogIEVyYXNlcjogKCkgPT4gRXJhc2VyLAogIEV0aGVybmV0UG9ydDogKCkgPT4gRXRoZXJuZXRQb3J0LAogIEV1cm86ICgpID0+IEV1cm8sCiAgRXZDaGFyZ2VyOiAoKSA9PiBFdkNoYXJnZXIsCiAgRXhwYW5kOiAoKSA9PiBFeHBhbmQsCiAgRXh0ZXJuYWxMaW5rOiAoKSA9PiBFeHRlcm5hbExpbmssCiAgRXllOiAoKSA9PiBFeWUsCiAgRXllQ2xvc2VkOiAoKSA9PiBFeWVDbG9zZWQsCiAgRXllT2ZmOiAoKSA9PiBFeWVPZmYsCiAgRmFjZWJvb2s6ICgpID0+IEZhY2Vib29rLAogIEZhY3Rvcnk6ICgpID0+IEZhY3RvcnksCiAgRmFuOiAoKSA9PiBGYW4sCiAgRmFzdEZvcndhcmQ6ICgpID0+IEZhc3RGb3J3YXJkLAogIEZlYXRoZXI6ICgpID0+IEZlYXRoZXIsCiAgRmVuY2U6ICgpID0+IEZlbmNlLAogIEZlcnJpc1doZWVsOiAoKSA9PiBGZXJyaXNXaGVlbCwKICBGaWdtYTogKCkgPT4gRmlnbWEsCiAgRmlsZTogKCkgPT4gRmlsZSwKICBGaWxlQXJjaGl2ZTogKCkgPT4gRmlsZUFyY2hpdmUsCiAgRmlsZUF1ZGlvOiAoKSA9PiBGaWxlSGVhZHBob25lLAogIEZpbGVBdWRpbzI6ICgpID0+IEZpbGVIZWFkcGhvbmUsCiAgRmlsZUF4aXMzRDogKCkgPT4gRmlsZUF4aXMzZCwKICBGaWxlQXhpczNkOiAoKSA9PiBGaWxlQXhpczNkLAogIEZpbGVCYWRnZTogKCkgPT4gRmlsZUJhZGdlLAogIEZpbGVCYWRnZTI6ICgpID0+IEZpbGVCYWRnZSwKICBGaWxlQmFyQ2hhcnQ6ICgpID0+IEZpbGVDaGFydENvbHVtbkluY3JlYXNpbmcsCiAgRmlsZUJhckNoYXJ0MjogKCkgPT4gRmlsZUNoYXJ0Q29sdW1uLAogIEZpbGVCb3g6ICgpID0+IEZpbGVCb3gsCiAgRmlsZUJyYWNlczogKCkgPT4gRmlsZUJyYWNlcywKICBGaWxlQnJhY2VzQ29ybmVyOiAoKSA9PiBGaWxlQnJhY2VzQ29ybmVyLAogIEZpbGVDaGFydENvbHVtbjogKCkgPT4gRmlsZUNoYXJ0Q29sdW1uLAogIEZpbGVDaGFydENvbHVtbkluY3JlYXNpbmc6ICgpID0+IEZpbGVDaGFydENvbHVtbkluY3JlYXNpbmcsCiAgRmlsZUNoYXJ0TGluZTogKCkgPT4gRmlsZUNoYXJ0TGluZSwKICBGaWxlQ2hhcnRQaWU6ICgpID0+IEZpbGVDaGFydFBpZSwKICBGaWxlQ2hlY2s6ICgpID0+IEZpbGVDaGVjaywKICBGaWxlQ2hlY2syOiAoKSA9PiBGaWxlQ2hlY2tDb3JuZXIsCiAgRmlsZUNoZWNrQ29ybmVyOiAoKSA9PiBGaWxlQ2hlY2tDb3JuZXIsCiAgRmlsZUNsb2NrOiAoKSA9PiBGaWxlQ2xvY2ssCiAgRmlsZUNvZGU6ICgpID0+IEZpbGVDb2RlLAogIEZpbGVDb2RlMjogKCkgPT4gRmlsZUNvZGVDb3JuZXIsCiAgRmlsZUNvZGVDb3JuZXI6ICgpID0+IEZpbGVDb2RlQ29ybmVyLAogIEZpbGVDb2c6ICgpID0+IEZpbGVDb2csCiAgRmlsZUNvZzI6ICgpID0+IEZpbGVDb2csCiAgRmlsZURpZmY6ICgpID0+IEZpbGVEaWZmLAogIEZpbGVEaWdpdDogKCkgPT4gRmlsZURpZ2l0LAogIEZpbGVEb3duOiAoKSA9PiBGaWxlRG93biwKICBGaWxlRWRpdDogKCkgPT4gRmlsZVBlbiwKICBGaWxlRXhjbGFtYXRpb25Qb2ludDogKCkgPT4gRmlsZUV4Y2xhbWF0aW9uUG9pbnQsCiAgRmlsZUhlYWRwaG9uZTogKCkgPT4gRmlsZUhlYWRwaG9uZSwKICBGaWxlSGVhcnQ6ICgpID0+IEZpbGVIZWFydCwKICBGaWxlSW1hZ2U6ICgpID0+IEZpbGVJbWFnZSwKICBGaWxlSW5wdXQ6ICgpID0+IEZpbGVJbnB1dCwKICBGaWxlSnNvbjogKCkgPT4gRmlsZUJyYWNlcywKICBGaWxlSnNvbjI6ICgpID0+IEZpbGVCcmFjZXNDb3JuZXIsCiAgRmlsZUtleTogKCkgPT4gRmlsZUtleSwKICBGaWxlS2V5MjogKCkgPT4gRmlsZUtleSwKICBGaWxlTGluZUNoYXJ0OiAoKSA9PiBGaWxlQ2hhcnRMaW5lLAogIEZpbGVMb2NrOiAoKSA9PiBGaWxlTG9jaywKICBGaWxlTG9jazI6ICgpID0+IEZpbGVMb2NrLAogIEZpbGVNaW51czogKCkgPT4gRmlsZU1pbnVzLAogIEZpbGVNaW51czI6ICgpID0+IEZpbGVNaW51c0Nvcm5lciwKICBGaWxlTWludXNDb3JuZXI6ICgpID0+IEZpbGVNaW51c0Nvcm5lciwKICBGaWxlTXVzaWM6ICgpID0+IEZpbGVNdXNpYywKICBGaWxlT3V0cHV0OiAoKSA9PiBGaWxlT3V0cHV0LAogIEZpbGVQZW46ICgpID0+IEZpbGVQZW4sCiAgRmlsZVBlbkxpbmU6ICgpID0+IEZpbGVQZW5MaW5lLAogIEZpbGVQaWVDaGFydDogKCkgPT4gRmlsZUNoYXJ0UGllLAogIEZpbGVQbGF5OiAoKSA9PiBGaWxlUGxheSwKICBGaWxlUGx1czogKCkgPT4gRmlsZVBsdXMsCiAgRmlsZVBsdXMyOiAoKSA9PiBGaWxlUGx1c0Nvcm5lciwKICBGaWxlUGx1c0Nvcm5lcjogKCkgPT4gRmlsZVBsdXNDb3JuZXIsCiAgRmlsZVF1ZXN0aW9uOiAoKSA9PiBGaWxlUXVlc3Rpb25NYXJrLAogIEZpbGVRdWVzdGlvbk1hcms6ICgpID0+IEZpbGVRdWVzdGlvbk1hcmssCiAgRmlsZVNjYW46ICgpID0+IEZpbGVTY2FuLAogIEZpbGVTZWFyY2g6ICgpID0+IEZpbGVTZWFyY2gsCiAgRmlsZVNlYXJjaDI6ICgpID0+IEZpbGVTZWFyY2hDb3JuZXIsCiAgRmlsZVNlYXJjaENvcm5lcjogKCkgPT4gRmlsZVNlYXJjaENvcm5lciwKICBGaWxlU2lnbmFsOiAoKSA9PiBGaWxlU2lnbmFsLAogIEZpbGVTaWduYXR1cmU6ICgpID0+IEZpbGVQZW5MaW5lLAogIEZpbGVTbGlkZXJzOiAoKSA9PiBGaWxlU2xpZGVycywKICBGaWxlU3ByZWFkc2hlZXQ6ICgpID0+IEZpbGVTcHJlYWRzaGVldCwKICBGaWxlU3RhY2s6ICgpID0+IEZpbGVTdGFjaywKICBGaWxlU3ltbGluazogKCkgPT4gRmlsZVN5bWxpbmssCiAgRmlsZVRlcm1pbmFsOiAoKSA9PiBGaWxlVGVybWluYWwsCiAgRmlsZVRleHQ6ICgpID0+IEZpbGVUZXh0LAogIEZpbGVUeXBlOiAoKSA9PiBGaWxlVHlwZSwKICBGaWxlVHlwZTI6ICgpID0+IEZpbGVUeXBlQ29ybmVyLAogIEZpbGVUeXBlQ29ybmVyOiAoKSA9PiBGaWxlVHlwZUNvcm5lciwKICBGaWxlVXA6ICgpID0+IEZpbGVVcCwKICBGaWxlVXNlcjogKCkgPT4gRmlsZVVzZXIsCiAgRmlsZVZpZGVvOiAoKSA9PiBGaWxlUGxheSwKICBGaWxlVmlkZW8yOiAoKSA9PiBGaWxlVmlkZW9DYW1lcmEsCiAgRmlsZVZpZGVvQ2FtZXJhOiAoKSA9PiBGaWxlVmlkZW9DYW1lcmEsCiAgRmlsZVZvbHVtZTogKCkgPT4gRmlsZVZvbHVtZSwKICBGaWxlVm9sdW1lMjogKCkgPT4gRmlsZVNpZ25hbCwKICBGaWxlV2FybmluZzogKCkgPT4gRmlsZUV4Y2xhbWF0aW9uUG9pbnQsCiAgRmlsZVg6ICgpID0+IEZpbGVYLAogIEZpbGVYMjogKCkgPT4gRmlsZVhDb3JuZXIsCiAgRmlsZVhDb3JuZXI6ICgpID0+IEZpbGVYQ29ybmVyLAogIEZpbGVzOiAoKSA9PiBGaWxlcywKICBGaWxtOiAoKSA9PiBGaWxtLAogIEZpbHRlcjogKCkgPT4gRnVubmVsLAogIEZpbHRlclg6ICgpID0+IEZ1bm5lbFgsCiAgRmluZ2VycHJpbnQ6ICgpID0+IEZpbmdlcnByaW50UGF0dGVybiwKICBGaW5nZXJwcmludFBhdHRlcm46ICgpID0+IEZpbmdlcnByaW50UGF0dGVybiwKICBGaXJlRXh0aW5ndWlzaGVyOiAoKSA9PiBGaXJlRXh0aW5ndWlzaGVyLAogIEZpc2g6ICgpID0+IEZpc2gsCiAgRmlzaE9mZjogKCkgPT4gRmlzaE9mZiwKICBGaXNoU3ltYm9sOiAoKSA9PiBGaXNoU3ltYm9sLAogIEZpc2hpbmdIb29rOiAoKSA9PiBGaXNoaW5nSG9vaywKICBGaXNoaW5nUm9kOiAoKSA9PiBGaXNoaW5nUm9kLAogIEZsYWc6ICgpID0+IEZsYWcsCiAgRmxhZ09mZjogKCkgPT4gRmxhZ09mZiwKICBGbGFnVHJpYW5nbGVMZWZ0OiAoKSA9PiBGbGFnVHJpYW5nbGVMZWZ0LAogIEZsYWdUcmlhbmdsZVJpZ2h0OiAoKSA9PiBGbGFnVHJpYW5nbGVSaWdodCwKICBGbGFtZTogKCkgPT4gRmxhbWUsCiAgRmxhbWVLaW5kbGluZzogKCkgPT4gRmxhbWVLaW5kbGluZywKICBGbGFzaGxpZ2h0OiAoKSA9PiBGbGFzaGxpZ2h0LAogIEZsYXNobGlnaHRPZmY6ICgpID0+IEZsYXNobGlnaHRPZmYsCiAgRmxhc2tDb25pY2FsOiAoKSA9PiBGbGFza0NvbmljYWwsCiAgRmxhc2tDb25pY2FsT2ZmOiAoKSA9PiBGbGFza0NvbmljYWxPZmYsCiAgRmxhc2tSb3VuZDogKCkgPT4gRmxhc2tSb3VuZCwKICBGbGlwSG9yaXpvbnRhbDogKCkgPT4gU3F1YXJlQ2VudGVybGluZURhc2hlZEhvcml6b250YWwsCiAgRmxpcEhvcml6b250YWwyOiAoKSA9PiBGbGlwSG9yaXpvbnRhbDIsCiAgRmxpcFZlcnRpY2FsOiAoKSA9PiBTcXVhcmVDZW50ZXJsaW5lRGFzaGVkVmVydGljYWwsCiAgRmxpcFZlcnRpY2FsMjogKCkgPT4gRmxpcFZlcnRpY2FsMiwKICBGbG93ZXI6ICgpID0+IEZsb3dlciwKICBGbG93ZXIyOiAoKSA9PiBGbG93ZXIyLAogIEZvY3VzOiAoKSA9PiBGb2N1cywKICBGb2xkSG9yaXpvbnRhbDogKCkgPT4gRm9sZEhvcml6b250YWwsCiAgRm9sZFZlcnRpY2FsOiAoKSA9PiBGb2xkVmVydGljYWwsCiAgRm9sZGVyOiAoKSA9PiBGb2xkZXIsCiAgRm9sZGVyQXJjaGl2ZTogKCkgPT4gRm9sZGVyQXJjaGl2ZSwKICBGb2xkZXJDaGVjazogKCkgPT4gRm9sZGVyQ2hlY2ssCiAgRm9sZGVyQ2xvY2s6ICgpID0+IEZvbGRlckNsb2NrLAogIEZvbGRlckNsb3NlZDogKCkgPT4gRm9sZGVyQ2xvc2VkLAogIEZvbGRlckNvZGU6ICgpID0+IEZvbGRlckNvZGUsCiAgRm9sZGVyQ29nOiAoKSA9PiBGb2xkZXJDb2csCiAgRm9sZGVyQ29nMjogKCkgPT4gRm9sZGVyQ29nLAogIEZvbGRlckRvdDogKCkgPT4gRm9sZGVyRG90LAogIEZvbGRlckRvd246ICgpID0+IEZvbGRlckRvd24sCiAgRm9sZGVyRWRpdDogKCkgPT4gRm9sZGVyUGVuLAogIEZvbGRlckdpdDogKCkgPT4gRm9sZGVyR2l0LAogIEZvbGRlckdpdDI6ICgpID0+IEZvbGRlckdpdDIsCiAgRm9sZGVySGVhcnQ6ICgpID0+IEZvbGRlckhlYXJ0LAogIEZvbGRlcklucHV0OiAoKSA9PiBGb2xkZXJJbnB1dCwKICBGb2xkZXJLYW5iYW46ICgpID0+IEZvbGRlckthbmJhbiwKICBGb2xkZXJLZXk6ICgpID0+IEZvbGRlcktleSwKICBGb2xkZXJMb2NrOiAoKSA9PiBGb2xkZXJMb2NrLAogIEZvbGRlck1pbnVzOiAoKSA9PiBGb2xkZXJNaW51cywKICBGb2xkZXJPcGVuOiAoKSA9PiBGb2xkZXJPcGVuLAogIEZvbGRlck9wZW5Eb3Q6ICgpID0+IEZvbGRlck9wZW5Eb3QsCiAgRm9sZGVyT3V0cHV0OiAoKSA9PiBGb2xkZXJPdXRwdXQsCiAgRm9sZGVyUGVuOiAoKSA9PiBGb2xkZXJQZW4sCiAgRm9sZGVyUGx1czogKCkgPT4gRm9sZGVyUGx1cywKICBGb2xkZXJSb290OiAoKSA9PiBGb2xkZXJSb290LAogIEZvbGRlclNlYXJjaDogKCkgPT4gRm9sZGVyU2VhcmNoLAogIEZvbGRlclNlYXJjaDI6ICgpID0+IEZvbGRlclNlYXJjaDIsCiAgRm9sZGVyU3ltbGluazogKCkgPT4gRm9sZGVyU3ltbGluaywKICBGb2xkZXJTeW5jOiAoKSA9PiBGb2xkZXJTeW5jLAogIEZvbGRlclRyZWU6ICgpID0+IEZvbGRlclRyZWUsCiAgRm9sZGVyVXA6ICgpID0+IEZvbGRlclVwLAogIEZvbGRlclg6ICgpID0+IEZvbGRlclgsCiAgRm9sZGVyczogKCkgPT4gRm9sZGVycywKICBGb290cHJpbnRzOiAoKSA9PiBGb290cHJpbnRzLAogIEZvcmtLbmlmZTogKCkgPT4gVXRlbnNpbHMsCiAgRm9ya0tuaWZlQ3Jvc3NlZDogKCkgPT4gVXRlbnNpbHNDcm9zc2VkLAogIEZvcmtsaWZ0OiAoKSA9PiBGb3JrbGlmdCwKICBGb3JtOiAoKSA9PiBGb3JtLAogIEZvcm1JbnB1dDogKCkgPT4gUmVjdGFuZ2xlRWxsaXBzaXMsCiAgRm9yd2FyZDogKCkgPT4gRm9yd2FyZCwKICBGcmFtZTogKCkgPT4gRnJhbWUsCiAgRnJhbWVyOiAoKSA9PiBGcmFtZXIsCiAgRnJvd246ICgpID0+IEZyb3duLAogIEZ1ZWw6ICgpID0+IEZ1ZWwsCiAgRnVsbHNjcmVlbjogKCkgPT4gRnVsbHNjcmVlbiwKICBGdW5jdGlvblNxdWFyZTogKCkgPT4gU3F1YXJlRnVuY3Rpb24sCiAgRnVubmVsOiAoKSA9PiBGdW5uZWwsCiAgRnVubmVsUGx1czogKCkgPT4gRnVubmVsUGx1cywKICBGdW5uZWxYOiAoKSA9PiBGdW5uZWxYLAogIEdhbGxlcnlIb3Jpem9udGFsOiAoKSA9PiBHYWxsZXJ5SG9yaXpvbnRhbCwKICBHYWxsZXJ5SG9yaXpvbnRhbEVuZDogKCkgPT4gR2FsbGVyeUhvcml6b250YWxFbmQsCiAgR2FsbGVyeVRodW1ibmFpbHM6ICgpID0+IEdhbGxlcnlUaHVtYm5haWxzLAogIEdhbGxlcnlWZXJ0aWNhbDogKCkgPT4gR2FsbGVyeVZlcnRpY2FsLAogIEdhbGxlcnlWZXJ0aWNhbEVuZDogKCkgPT4gR2FsbGVyeVZlcnRpY2FsRW5kLAogIEdhbWVwYWQ6ICgpID0+IEdhbWVwYWQsCiAgR2FtZXBhZDI6ICgpID0+IEdhbWVwYWQyLAogIEdhbWVwYWREaXJlY3Rpb25hbDogKCkgPT4gR2FtZXBhZERpcmVjdGlvbmFsLAogIEdhbnR0Q2hhcnQ6ICgpID0+IENoYXJ0Tm9BeGVzR2FudHQsCiAgR2FudHRDaGFydFNxdWFyZTogKCkgPT4gU3F1YXJlQ2hhcnRHYW50dCwKICBHYXVnZTogKCkgPT4gR2F1Z2UsCiAgR2F1Z2VDaXJjbGU6ICgpID0+IENpcmNsZUdhdWdlLAogIEdhdmVsOiAoKSA9PiBHYXZlbCwKICBHZW06ICgpID0+IEdlbSwKICBHZW9yZ2lhbkxhcmk6ICgpID0+IEdlb3JnaWFuTGFyaSwKICBHaG9zdDogKCkgPT4gR2hvc3QsCiAgR2lmdDogKCkgPT4gR2lmdCwKICBHaXRCcmFuY2g6ICgpID0+IEdpdEJyYW5jaCwKICBHaXRCcmFuY2hNaW51czogKCkgPT4gR2l0QnJhbmNoTWludXMsCiAgR2l0QnJhbmNoUGx1czogKCkgPT4gR2l0QnJhbmNoUGx1cywKICBHaXRDb21taXQ6ICgpID0+IEdpdENvbW1pdEhvcml6b250YWwsCiAgR2l0Q29tbWl0SG9yaXpvbnRhbDogKCkgPT4gR2l0Q29tbWl0SG9yaXpvbnRhbCwKICBHaXRDb21taXRWZXJ0aWNhbDogKCkgPT4gR2l0Q29tbWl0VmVydGljYWwsCiAgR2l0Q29tcGFyZTogKCkgPT4gR2l0Q29tcGFyZSwKICBHaXRDb21wYXJlQXJyb3dzOiAoKSA9PiBHaXRDb21wYXJlQXJyb3dzLAogIEdpdEZvcms6ICgpID0+IEdpdEZvcmssCiAgR2l0R3JhcGg6ICgpID0+IEdpdEdyYXBoLAogIEdpdE1lcmdlOiAoKSA9PiBHaXRNZXJnZSwKICBHaXRNZXJnZUNvbmZsaWN0OiAoKSA9PiBHaXRNZXJnZUNvbmZsaWN0LAogIEdpdFB1bGxSZXF1ZXN0OiAoKSA9PiBHaXRQdWxsUmVxdWVzdCwKICBHaXRQdWxsUmVxdWVzdEFycm93OiAoKSA9PiBHaXRQdWxsUmVxdWVzdEFycm93LAogIEdpdFB1bGxSZXF1ZXN0Q2xvc2VkOiAoKSA9PiBHaXRQdWxsUmVxdWVzdENsb3NlZCwKICBHaXRQdWxsUmVxdWVzdENyZWF0ZTogKCkgPT4gR2l0UHVsbFJlcXVlc3RDcmVhdGUsCiAgR2l0UHVsbFJlcXVlc3RDcmVhdGVBcnJvdzogKCkgPT4gR2l0UHVsbFJlcXVlc3RDcmVhdGVBcnJvdywKICBHaXRQdWxsUmVxdWVzdERyYWZ0OiAoKSA9PiBHaXRQdWxsUmVxdWVzdERyYWZ0LAogIEdpdGh1YjogKCkgPT4gR2l0aHViLAogIEdpdGxhYjogKCkgPT4gR2l0bGFiLAogIEdsYXNzV2F0ZXI6ICgpID0+IEdsYXNzV2F0ZXIsCiAgR2xhc3NlczogKCkgPT4gR2xhc3NlcywKICBHbG9iZTogKCkgPT4gR2xvYmUsCiAgR2xvYmUyOiAoKSA9PiBFYXJ0aCwKICBHbG9iZUxvY2s6ICgpID0+IEdsb2JlTG9jaywKICBHbG9iZU9mZjogKCkgPT4gR2xvYmVPZmYsCiAgR2xvYmVYOiAoKSA9PiBHbG9iZVgsCiAgR29hbDogKCkgPT4gR29hbCwKICBHcHU6ICgpID0+IEdwdSwKICBHcmFiOiAoKSA9PiBIYW5kR3JhYiwKICBHcmFkdWF0aW9uQ2FwOiAoKSA9PiBHcmFkdWF0aW9uQ2FwLAogIEdyYXBlOiAoKSA9PiBHcmFwZSwKICBHcmlkOiAoKSA9PiBHcmlkM3gzLAogIEdyaWQyWDI6ICgpID0+IEdyaWQyeDIsCiAgR3JpZDJYMkNoZWNrOiAoKSA9PiBHcmlkMngyQ2hlY2ssCiAgR3JpZDJYMlBsdXM6ICgpID0+IEdyaWQyeDJQbHVzLAogIEdyaWQyWDJYOiAoKSA9PiBHcmlkMngyWCwKICBHcmlkMngyOiAoKSA9PiBHcmlkMngyLAogIEdyaWQyeDJDaGVjazogKCkgPT4gR3JpZDJ4MkNoZWNrLAogIEdyaWQyeDJQbHVzOiAoKSA9PiBHcmlkMngyUGx1cywKICBHcmlkMngyWDogKCkgPT4gR3JpZDJ4MlgsCiAgR3JpZDNYMzogKCkgPT4gR3JpZDN4MywKICBHcmlkM3gyOiAoKSA9PiBHcmlkM3gyLAogIEdyaWQzeDM6ICgpID0+IEdyaWQzeDMsCiAgR3JpcDogKCkgPT4gR3JpcCwKICBHcmlwSG9yaXpvbnRhbDogKCkgPT4gR3JpcEhvcml6b250YWwsCiAgR3JpcFZlcnRpY2FsOiAoKSA9PiBHcmlwVmVydGljYWwsCiAgR3JvdXA6ICgpID0+IEdyb3VwLAogIEd1aXRhcjogKCkgPT4gR3VpdGFyLAogIEhhbTogKCkgPT4gSGFtLAogIEhhbWJ1cmdlcjogKCkgPT4gSGFtYnVyZ2VyLAogIEhhbW1lcjogKCkgPT4gSGFtbWVyLAogIEhhbmQ6ICgpID0+IEhhbmQsCiAgSGFuZENvaW5zOiAoKSA9PiBIYW5kQ29pbnMsCiAgSGFuZEZpc3Q6ICgpID0+IEhhbmRGaXN0LAogIEhhbmRHcmFiOiAoKSA9PiBIYW5kR3JhYiwKICBIYW5kSGVhcnQ6ICgpID0+IEhhbmRIZWFydCwKICBIYW5kSGVscGluZzogKCkgPT4gSGFuZEhlbHBpbmcsCiAgSGFuZE1ldGFsOiAoKSA9PiBIYW5kTWV0YWwsCiAgSGFuZFBsYXR0ZXI6ICgpID0+IEhhbmRQbGF0dGVyLAogIEhhbmRiYWc6ICgpID0+IEhhbmRiYWcsCiAgSGFuZHNoYWtlOiAoKSA9PiBIYW5kc2hha2UsCiAgSGFyZERyaXZlOiAoKSA9PiBIYXJkRHJpdmUsCiAgSGFyZERyaXZlRG93bmxvYWQ6ICgpID0+IEhhcmREcml2ZURvd25sb2FkLAogIEhhcmREcml2ZVVwbG9hZDogKCkgPT4gSGFyZERyaXZlVXBsb2FkLAogIEhhcmRIYXQ6ICgpID0+IEhhcmRIYXQsCiAgSGFzaDogKCkgPT4gSGFzaCwKICBIYXRHbGFzc2VzOiAoKSA9PiBIYXRHbGFzc2VzLAogIEhhemU6ICgpID0+IEhhemUsCiAgSGQ6ICgpID0+IEhkLAogIEhkbWlQb3J0OiAoKSA9PiBIZG1pUG9ydCwKICBIZWFkaW5nOiAoKSA9PiBIZWFkaW5nLAogIEhlYWRpbmcxOiAoKSA9PiBIZWFkaW5nMSwKICBIZWFkaW5nMjogKCkgPT4gSGVhZGluZzIsCiAgSGVhZGluZzM6ICgpID0+IEhlYWRpbmczLAogIEhlYWRpbmc0OiAoKSA9PiBIZWFkaW5nNCwKICBIZWFkaW5nNTogKCkgPT4gSGVhZGluZzUsCiAgSGVhZGluZzY6ICgpID0+IEhlYWRpbmc2LAogIEhlYWRwaG9uZU9mZjogKCkgPT4gSGVhZHBob25lT2ZmLAogIEhlYWRwaG9uZXM6ICgpID0+IEhlYWRwaG9uZXMsCiAgSGVhZHNldDogKCkgPT4gSGVhZHNldCwKICBIZWFydDogKCkgPT4gSGVhcnQsCiAgSGVhcnRDcmFjazogKCkgPT4gSGVhcnRDcmFjaywKICBIZWFydEhhbmRzaGFrZTogKCkgPT4gSGVhcnRIYW5kc2hha2UsCiAgSGVhcnRNaW51czogKCkgPT4gSGVhcnRNaW51cywKICBIZWFydE9mZjogKCkgPT4gSGVhcnRPZmYsCiAgSGVhcnRQbHVzOiAoKSA9PiBIZWFydFBsdXMsCiAgSGVhcnRQdWxzZTogKCkgPT4gSGVhcnRQdWxzZSwKICBIZWF0ZXI6ICgpID0+IEhlYXRlciwKICBIZWxpY29wdGVyOiAoKSA9PiBIZWxpY29wdGVyLAogIEhlbHBDaXJjbGU6ICgpID0+IENpcmNsZVF1ZXN0aW9uTWFyaywKICBIZWxwaW5nSGFuZDogKCkgPT4gSGFuZEhlbHBpbmcsCiAgSGV4YWdvbjogKCkgPT4gSGV4YWdvbiwKICBIaWdobGlnaHRlcjogKCkgPT4gSGlnaGxpZ2h0ZXIsCiAgSGlzdG9yeTogKCkgPT4gSGlzdG9yeSwKICBIb21lOiAoKSA9PiBIb3VzZSwKICBIb3A6ICgpID0+IEhvcCwKICBIb3BPZmY6ICgpID0+IEhvcE9mZiwKICBIb3NwaXRhbDogKCkgPT4gSG9zcGl0YWwsCiAgSG90ZWw6ICgpID0+IEhvdGVsLAogIEhvdXJnbGFzczogKCkgPT4gSG91cmdsYXNzLAogIEhvdXNlOiAoKSA9PiBIb3VzZSwKICBIb3VzZUhlYXJ0OiAoKSA9PiBIb3VzZUhlYXJ0LAogIEhvdXNlUGx1ZzogKCkgPT4gSG91c2VQbHVnLAogIEhvdXNlUGx1czogKCkgPT4gSG91c2VQbHVzLAogIEhvdXNlV2lmaTogKCkgPT4gSG91c2VXaWZpLAogIEljZUNyZWFtOiAoKSA9PiBJY2VDcmVhbUNvbmUsCiAgSWNlQ3JlYW0yOiAoKSA9PiBJY2VDcmVhbUJvd2wsCiAgSWNlQ3JlYW1Cb3dsOiAoKSA9PiBJY2VDcmVhbUJvd2wsCiAgSWNlQ3JlYW1Db25lOiAoKSA9PiBJY2VDcmVhbUNvbmUsCiAgSWRDYXJkOiAoKSA9PiBJZENhcmQsCiAgSWRDYXJkTGFueWFyZDogKCkgPT4gSWRDYXJkTGFueWFyZCwKICBJbWFnZTogKCkgPT4gSW1hZ2UyLAogIEltYWdlRG93bjogKCkgPT4gSW1hZ2VEb3duLAogIEltYWdlTWludXM6ICgpID0+IEltYWdlTWludXMsCiAgSW1hZ2VPZmY6ICgpID0+IEltYWdlT2ZmLAogIEltYWdlUGxheTogKCkgPT4gSW1hZ2VQbGF5LAogIEltYWdlUGx1czogKCkgPT4gSW1hZ2VQbHVzLAogIEltYWdlVXA6ICgpID0+IEltYWdlVXAsCiAgSW1hZ2VVcHNjYWxlOiAoKSA9PiBJbWFnZVVwc2NhbGUsCiAgSW1hZ2VzOiAoKSA9PiBJbWFnZXMsCiAgSW1wb3J0OiAoKSA9PiBJbXBvcnQsCiAgSW5ib3g6ICgpID0+IEluYm94LAogIEluZGVudDogKCkgPT4gTGlzdEluZGVudEluY3JlYXNlLAogIEluZGVudERlY3JlYXNlOiAoKSA9PiBMaXN0SW5kZW50RGVjcmVhc2UsCiAgSW5kZW50SW5jcmVhc2U6ICgpID0+IExpc3RJbmRlbnRJbmNyZWFzZSwKICBJbmRpYW5SdXBlZTogKCkgPT4gSW5kaWFuUnVwZWUsCiAgSW5maW5pdHk6ICgpID0+IEluZmluaXR5MiwKICBJbmZvOiAoKSA9PiBJbmZvMiwKICBJbnNwZWN0OiAoKSA9PiBTcXVhcmVNb3VzZVBvaW50ZXIsCiAgSW5zcGVjdGlvblBhbmVsOiAoKSA9PiBJbnNwZWN0aW9uUGFuZWwsCiAgSW5zdGFncmFtOiAoKSA9PiBJbnN0YWdyYW0sCiAgSXRhbGljOiAoKSA9PiBJdGFsaWMsCiAgSXRlcmF0aW9uQ2N3OiAoKSA9PiBJdGVyYXRpb25DY3csCiAgSXRlcmF0aW9uQ3c6ICgpID0+IEl0ZXJhdGlvbkN3LAogIEphcGFuZXNlWWVuOiAoKSA9PiBKYXBhbmVzZVllbiwKICBKb3lzdGljazogKCkgPT4gSm95c3RpY2ssCiAgS2FuYmFuOiAoKSA9PiBLYW5iYW4sCiAgS2FuYmFuU3F1YXJlOiAoKSA9PiBTcXVhcmVLYW5iYW4sCiAgS2FuYmFuU3F1YXJlRGFzaGVkOiAoKSA9PiBTcXVhcmVEYXNoZWRLYW5iYW4sCiAgS2F5YWs6ICgpID0+IEtheWFrLAogIEtleTogKCkgPT4gS2V5MiwKICBLZXlSb3VuZDogKCkgPT4gS2V5Um91bmQsCiAgS2V5U3F1YXJlOiAoKSA9PiBLZXlTcXVhcmUsCiAgS2V5Ym9hcmQ6ICgpID0+IEtleWJvYXJkMiwKICBLZXlib2FyZE11c2ljOiAoKSA9PiBLZXlib2FyZE11c2ljLAogIEtleWJvYXJkT2ZmOiAoKSA9PiBLZXlib2FyZE9mZiwKICBMYW1wOiAoKSA9PiBMYW1wLAogIExhbXBDZWlsaW5nOiAoKSA9PiBMYW1wQ2VpbGluZywKICBMYW1wRGVzazogKCkgPT4gTGFtcERlc2ssCiAgTGFtcEZsb29yOiAoKSA9PiBMYW1wRmxvb3IsCiAgTGFtcFdhbGxEb3duOiAoKSA9PiBMYW1wV2FsbERvd24sCiAgTGFtcFdhbGxVcDogKCkgPT4gTGFtcFdhbGxVcCwKICBMYW5kUGxvdDogKCkgPT4gTGFuZFBsb3QsCiAgTGFuZG1hcms6ICgpID0+IExhbmRtYXJrLAogIExhbmd1YWdlczogKCkgPT4gTGFuZ3VhZ2VzLAogIExhcHRvcDogKCkgPT4gTGFwdG9wLAogIExhcHRvcDI6ICgpID0+IExhcHRvcE1pbmltYWwsCiAgTGFwdG9wTWluaW1hbDogKCkgPT4gTGFwdG9wTWluaW1hbCwKICBMYXB0b3BNaW5pbWFsQ2hlY2s6ICgpID0+IExhcHRvcE1pbmltYWxDaGVjaywKICBMYXNzbzogKCkgPT4gTGFzc28sCiAgTGFzc29TZWxlY3Q6ICgpID0+IExhc3NvU2VsZWN0LAogIExhdWdoOiAoKSA9PiBMYXVnaCwKICBMYXllcnM6ICgpID0+IExheWVyczMsCiAgTGF5ZXJzMjogKCkgPT4gTGF5ZXJzMiwKICBMYXllcnMzOiAoKSA9PiBMYXllcnMzLAogIExheWVyc1BsdXM6ICgpID0+IExheWVyc1BsdXMsCiAgTGF5b3V0OiAoKSA9PiBQYW5lbHNUb3BMZWZ0LAogIExheW91dERhc2hib2FyZDogKCkgPT4gTGF5b3V0RGFzaGJvYXJkLAogIExheW91dEdyaWQ6ICgpID0+IExheW91dEdyaWQsCiAgTGF5b3V0TGlzdDogKCkgPT4gTGF5b3V0TGlzdCwKICBMYXlvdXRQYW5lbExlZnQ6ICgpID0+IExheW91dFBhbmVsTGVmdCwKICBMYXlvdXRQYW5lbFRvcDogKCkgPT4gTGF5b3V0UGFuZWxUb3AsCiAgTGF5b3V0VGVtcGxhdGU6ICgpID0+IExheW91dFRlbXBsYXRlLAogIExlYWY6ICgpID0+IExlYWYsCiAgTGVhZnlHcmVlbjogKCkgPT4gTGVhZnlHcmVlbiwKICBMZWN0ZXJuOiAoKSA9PiBMZWN0ZXJuLAogIExlbnNDb25jYXZlOiAoKSA9PiBMZW5zQ29uY2F2ZSwKICBMZW5zQ29udmV4OiAoKSA9PiBMZW5zQ29udmV4LAogIExldHRlclRleHQ6ICgpID0+IFRleHRJbml0aWFsLAogIExpYnJhcnk6ICgpID0+IExpYnJhcnkyLAogIExpYnJhcnlCaWc6ICgpID0+IExpYnJhcnlCaWcsCiAgTGlicmFyeVNxdWFyZTogKCkgPT4gU3F1YXJlTGlicmFyeSwKICBMaWZlQnVveTogKCkgPT4gTGlmZUJ1b3ksCiAgTGlnYXR1cmU6ICgpID0+IExpZ2F0dXJlLAogIExpZ2h0YnVsYjogKCkgPT4gTGlnaHRidWxiLAogIExpZ2h0YnVsYk9mZjogKCkgPT4gTGlnaHRidWxiT2ZmLAogIExpbmVDaGFydDogKCkgPT4gQ2hhcnRMaW5lLAogIExpbmVEb3RSaWdodEhvcml6b250YWw6ICgpID0+IExpbmVEb3RSaWdodEhvcml6b250YWwsCiAgTGluZVNxdWlnZ2xlOiAoKSA9PiBMaW5lU3F1aWdnbGUsCiAgTGluazogKCkgPT4gTGluaywKICBMaW5rMjogKCkgPT4gTGluazIsCiAgTGluazJPZmY6ICgpID0+IExpbmsyT2ZmLAogIExpbmtlZGluOiAoKSA9PiBMaW5rZWRpbiwKICBMaXN0OiAoKSA9PiBMaXN0LAogIExpc3RDaGVjazogKCkgPT4gTGlzdENoZWNrLAogIExpc3RDaGVja3M6ICgpID0+IExpc3RDaGVja3MsCiAgTGlzdENoZXZyb25zRG93blVwOiAoKSA9PiBMaXN0Q2hldnJvbnNEb3duVXAsCiAgTGlzdENoZXZyb25zVXBEb3duOiAoKSA9PiBMaXN0Q2hldnJvbnNVcERvd24sCiAgTGlzdENvbGxhcHNlOiAoKSA9PiBMaXN0Q29sbGFwc2UsCiAgTGlzdEVuZDogKCkgPT4gTGlzdEVuZCwKICBMaXN0RmlsdGVyOiAoKSA9PiBMaXN0RmlsdGVyLAogIExpc3RGaWx0ZXJQbHVzOiAoKSA9PiBMaXN0RmlsdGVyUGx1cywKICBMaXN0SW5kZW50RGVjcmVhc2U6ICgpID0+IExpc3RJbmRlbnREZWNyZWFzZSwKICBMaXN0SW5kZW50SW5jcmVhc2U6ICgpID0+IExpc3RJbmRlbnRJbmNyZWFzZSwKICBMaXN0TWludXM6ICgpID0+IExpc3RNaW51cywKICBMaXN0TXVzaWM6ICgpID0+IExpc3RNdXNpYywKICBMaXN0T3JkZXJlZDogKCkgPT4gTGlzdE9yZGVyZWQsCiAgTGlzdFBsdXM6ICgpID0+IExpc3RQbHVzLAogIExpc3RSZXN0YXJ0OiAoKSA9PiBMaXN0UmVzdGFydCwKICBMaXN0U3RhcnQ6ICgpID0+IExpc3RTdGFydCwKICBMaXN0VG9kbzogKCkgPT4gTGlzdFRvZG8sCiAgTGlzdFRyZWU6ICgpID0+IExpc3RUcmVlLAogIExpc3RWaWRlbzogKCkgPT4gTGlzdFZpZGVvLAogIExpc3RYOiAoKSA9PiBMaXN0WCwKICBMb2FkZXI6ICgpID0+IExvYWRlciwKICBMb2FkZXIyOiAoKSA9PiBMb2FkZXJDaXJjbGUsCiAgTG9hZGVyQ2lyY2xlOiAoKSA9PiBMb2FkZXJDaXJjbGUsCiAgTG9hZGVyUGlud2hlZWw6ICgpID0+IExvYWRlclBpbndoZWVsLAogIExvY2F0ZTogKCkgPT4gTG9jYXRlLAogIExvY2F0ZUZpeGVkOiAoKSA9PiBMb2NhdGVGaXhlZCwKICBMb2NhdGVPZmY6ICgpID0+IExvY2F0ZU9mZiwKICBMb2NhdGlvbkVkaXQ6ICgpID0+IE1hcFBpblBlbiwKICBMb2NrOiAoKSA9PiBMb2NrLAogIExvY2tLZXlob2xlOiAoKSA9PiBMb2NrS2V5aG9sZSwKICBMb2NrS2V5aG9sZU9wZW46ICgpID0+IExvY2tLZXlob2xlT3BlbiwKICBMb2NrT3BlbjogKCkgPT4gTG9ja09wZW4sCiAgTG9nSW46ICgpID0+IExvZ0luLAogIExvZ091dDogKCkgPT4gTG9nT3V0LAogIExvZ3M6ICgpID0+IExvZ3MsCiAgTG9sbGlwb3A6ICgpID0+IExvbGxpcG9wLAogIEx1Z2dhZ2U6ICgpID0+IEx1Z2dhZ2UsCiAgTVNxdWFyZTogKCkgPT4gU3F1YXJlTSwKICBNYWduZXQ6ICgpID0+IE1hZ25ldCwKICBNYWlsOiAoKSA9PiBNYWlsLAogIE1haWxDaGVjazogKCkgPT4gTWFpbENoZWNrLAogIE1haWxNaW51czogKCkgPT4gTWFpbE1pbnVzLAogIE1haWxPcGVuOiAoKSA9PiBNYWlsT3BlbiwKICBNYWlsUGx1czogKCkgPT4gTWFpbFBsdXMsCiAgTWFpbFF1ZXN0aW9uOiAoKSA9PiBNYWlsUXVlc3Rpb25NYXJrLAogIE1haWxRdWVzdGlvbk1hcms6ICgpID0+IE1haWxRdWVzdGlvbk1hcmssCiAgTWFpbFNlYXJjaDogKCkgPT4gTWFpbFNlYXJjaCwKICBNYWlsV2FybmluZzogKCkgPT4gTWFpbFdhcm5pbmcsCiAgTWFpbFg6ICgpID0+IE1haWxYLAogIE1haWxib3g6ICgpID0+IE1haWxib3gsCiAgTWFpbHM6ICgpID0+IE1haWxzLAogIE1hcDogKCkgPT4gTWFwMiwKICBNYXBNaW51czogKCkgPT4gTWFwTWludXMsCiAgTWFwUGluOiAoKSA9PiBNYXBQaW4sCiAgTWFwUGluQ2hlY2s6ICgpID0+IE1hcFBpbkNoZWNrLAogIE1hcFBpbkNoZWNrSW5zaWRlOiAoKSA9PiBNYXBQaW5DaGVja0luc2lkZSwKICBNYXBQaW5Ib3VzZTogKCkgPT4gTWFwUGluSG91c2UsCiAgTWFwUGluTWludXM6ICgpID0+IE1hcFBpbk1pbnVzLAogIE1hcFBpbk1pbnVzSW5zaWRlOiAoKSA9PiBNYXBQaW5NaW51c0luc2lkZSwKICBNYXBQaW5PZmY6ICgpID0+IE1hcFBpbk9mZiwKICBNYXBQaW5QZW46ICgpID0+IE1hcFBpblBlbiwKICBNYXBQaW5QbHVzOiAoKSA9PiBNYXBQaW5QbHVzLAogIE1hcFBpblBsdXNJbnNpZGU6ICgpID0+IE1hcFBpblBsdXNJbnNpZGUsCiAgTWFwUGluWDogKCkgPT4gTWFwUGluWCwKICBNYXBQaW5YSW5zaWRlOiAoKSA9PiBNYXBQaW5YSW5zaWRlLAogIE1hcFBpbm5lZDogKCkgPT4gTWFwUGlubmVkLAogIE1hcFBsdXM6ICgpID0+IE1hcFBsdXMsCiAgTWFyczogKCkgPT4gTWFycywKICBNYXJzU3Ryb2tlOiAoKSA9PiBNYXJzU3Ryb2tlLAogIE1hcnRpbmk6ICgpID0+IE1hcnRpbmksCiAgTWF4aW1pemU6ICgpID0+IE1heGltaXplLAogIE1heGltaXplMjogKCkgPT4gTWF4aW1pemUyLAogIE1lZGFsOiAoKSA9PiBNZWRhbCwKICBNZWdhcGhvbmU6ICgpID0+IE1lZ2FwaG9uZSwKICBNZWdhcGhvbmVPZmY6ICgpID0+IE1lZ2FwaG9uZU9mZiwKICBNZWg6ICgpID0+IE1laCwKICBNZW1vcnlTdGljazogKCkgPT4gTWVtb3J5U3RpY2ssCiAgTWVudTogKCkgPT4gTWVudSwKICBNZW51U3F1YXJlOiAoKSA9PiBTcXVhcmVNZW51LAogIE1lcmdlOiAoKSA9PiBNZXJnZSwKICBNZXNzYWdlQ2lyY2xlOiAoKSA9PiBNZXNzYWdlQ2lyY2xlLAogIE1lc3NhZ2VDaXJjbGVDaGVjazogKCkgPT4gTWVzc2FnZUNpcmNsZUNoZWNrLAogIE1lc3NhZ2VDaXJjbGVDb2RlOiAoKSA9PiBNZXNzYWdlQ2lyY2xlQ29kZSwKICBNZXNzYWdlQ2lyY2xlRGFzaGVkOiAoKSA9PiBNZXNzYWdlQ2lyY2xlRGFzaGVkLAogIE1lc3NhZ2VDaXJjbGVIZWFydDogKCkgPT4gTWVzc2FnZUNpcmNsZUhlYXJ0LAogIE1lc3NhZ2VDaXJjbGVNb3JlOiAoKSA9PiBNZXNzYWdlQ2lyY2xlTW9yZSwKICBNZXNzYWdlQ2lyY2xlT2ZmOiAoKSA9PiBNZXNzYWdlQ2lyY2xlT2ZmLAogIE1lc3NhZ2VDaXJjbGVQbHVzOiAoKSA9PiBNZXNzYWdlQ2lyY2xlUGx1cywKICBNZXNzYWdlQ2lyY2xlUXVlc3Rpb246ICgpID0+IE1lc3NhZ2VDaXJjbGVRdWVzdGlvbk1hcmssCiAgTWVzc2FnZUNpcmNsZVF1ZXN0aW9uTWFyazogKCkgPT4gTWVzc2FnZUNpcmNsZVF1ZXN0aW9uTWFyaywKICBNZXNzYWdlQ2lyY2xlUmVwbHk6ICgpID0+IE1lc3NhZ2VDaXJjbGVSZXBseSwKICBNZXNzYWdlQ2lyY2xlV2FybmluZzogKCkgPT4gTWVzc2FnZUNpcmNsZVdhcm5pbmcsCiAgTWVzc2FnZUNpcmNsZVg6ICgpID0+IE1lc3NhZ2VDaXJjbGVYLAogIE1lc3NhZ2VTcXVhcmU6ICgpID0+IE1lc3NhZ2VTcXVhcmUsCiAgTWVzc2FnZVNxdWFyZUNoZWNrOiAoKSA9PiBNZXNzYWdlU3F1YXJlQ2hlY2ssCiAgTWVzc2FnZVNxdWFyZUNvZGU6ICgpID0+IE1lc3NhZ2VTcXVhcmVDb2RlLAogIE1lc3NhZ2VTcXVhcmVEYXNoZWQ6ICgpID0+IE1lc3NhZ2VTcXVhcmVEYXNoZWQsCiAgTWVzc2FnZVNxdWFyZURpZmY6ICgpID0+IE1lc3NhZ2VTcXVhcmVEaWZmLAogIE1lc3NhZ2VTcXVhcmVEb3Q6ICgpID0+IE1lc3NhZ2VTcXVhcmVEb3QsCiAgTWVzc2FnZVNxdWFyZUhlYXJ0OiAoKSA9PiBNZXNzYWdlU3F1YXJlSGVhcnQsCiAgTWVzc2FnZVNxdWFyZUxvY2s6ICgpID0+IE1lc3NhZ2VTcXVhcmVMb2NrLAogIE1lc3NhZ2VTcXVhcmVNb3JlOiAoKSA9PiBNZXNzYWdlU3F1YXJlTW9yZSwKICBNZXNzYWdlU3F1YXJlT2ZmOiAoKSA9PiBNZXNzYWdlU3F1YXJlT2ZmLAogIE1lc3NhZ2VTcXVhcmVQbHVzOiAoKSA9PiBNZXNzYWdlU3F1YXJlUGx1cywKICBNZXNzYWdlU3F1YXJlUXVvdGU6ICgpID0+IE1lc3NhZ2VTcXVhcmVRdW90ZSwKICBNZXNzYWdlU3F1YXJlUmVwbHk6ICgpID0+IE1lc3NhZ2VTcXVhcmVSZXBseSwKICBNZXNzYWdlU3F1YXJlU2hhcmU6ICgpID0+IE1lc3NhZ2VTcXVhcmVTaGFyZSwKICBNZXNzYWdlU3F1YXJlVGV4dDogKCkgPT4gTWVzc2FnZVNxdWFyZVRleHQsCiAgTWVzc2FnZVNxdWFyZVdhcm5pbmc6ICgpID0+IE1lc3NhZ2VTcXVhcmVXYXJuaW5nLAogIE1lc3NhZ2VTcXVhcmVYOiAoKSA9PiBNZXNzYWdlU3F1YXJlWCwKICBNZXNzYWdlc1NxdWFyZTogKCkgPT4gTWVzc2FnZXNTcXVhcmUsCiAgTWV0cm9ub21lOiAoKSA9PiBNZXRyb25vbWUsCiAgTWljOiAoKSA9PiBNaWMsCiAgTWljMjogKCkgPT4gTWljVm9jYWwsCiAgTWljT2ZmOiAoKSA9PiBNaWNPZmYsCiAgTWljVm9jYWw6ICgpID0+IE1pY1ZvY2FsLAogIE1pY3JvY2hpcDogKCkgPT4gTWljcm9jaGlwLAogIE1pY3Jvc2NvcGU6ICgpID0+IE1pY3Jvc2NvcGUsCiAgTWljcm93YXZlOiAoKSA9PiBNaWNyb3dhdmUsCiAgTWlsZXN0b25lOiAoKSA9PiBNaWxlc3RvbmUsCiAgTWlsazogKCkgPT4gTWlsaywKICBNaWxrT2ZmOiAoKSA9PiBNaWxrT2ZmLAogIE1pbmltaXplOiAoKSA9PiBNaW5pbWl6ZSwKICBNaW5pbWl6ZTI6ICgpID0+IE1pbmltaXplMiwKICBNaW51czogKCkgPT4gTWludXMsCiAgTWludXNDaXJjbGU6ICgpID0+IENpcmNsZU1pbnVzLAogIE1pbnVzU3F1YXJlOiAoKSA9PiBTcXVhcmVNaW51cywKICBNaXJyb3JSZWN0YW5ndWxhcjogKCkgPT4gTWlycm9yUmVjdGFuZ3VsYXIsCiAgTWlycm9yUm91bmQ6ICgpID0+IE1pcnJvclJvdW5kLAogIE1vbml0b3I6ICgpID0+IE1vbml0b3IsCiAgTW9uaXRvckNoZWNrOiAoKSA9PiBNb25pdG9yQ2hlY2ssCiAgTW9uaXRvckNsb3VkOiAoKSA9PiBNb25pdG9yQ2xvdWQsCiAgTW9uaXRvckNvZzogKCkgPT4gTW9uaXRvckNvZywKICBNb25pdG9yRG90OiAoKSA9PiBNb25pdG9yRG90LAogIE1vbml0b3JEb3duOiAoKSA9PiBNb25pdG9yRG93biwKICBNb25pdG9yT2ZmOiAoKSA9PiBNb25pdG9yT2ZmLAogIE1vbml0b3JQYXVzZTogKCkgPT4gTW9uaXRvclBhdXNlLAogIE1vbml0b3JQbGF5OiAoKSA9PiBNb25pdG9yUGxheSwKICBNb25pdG9yU21hcnRwaG9uZTogKCkgPT4gTW9uaXRvclNtYXJ0cGhvbmUsCiAgTW9uaXRvclNwZWFrZXI6ICgpID0+IE1vbml0b3JTcGVha2VyLAogIE1vbml0b3JTdG9wOiAoKSA9PiBNb25pdG9yU3RvcCwKICBNb25pdG9yVXA6ICgpID0+IE1vbml0b3JVcCwKICBNb25pdG9yWDogKCkgPT4gTW9uaXRvclgsCiAgTW9vbjogKCkgPT4gTW9vbiwKICBNb29uU3RhcjogKCkgPT4gTW9vblN0YXIsCiAgTW9yZUhvcml6b250YWw6ICgpID0+IEVsbGlwc2lzLAogIE1vcmVWZXJ0aWNhbDogKCkgPT4gRWxsaXBzaXNWZXJ0aWNhbCwKICBNb3RvcmJpa2U6ICgpID0+IE1vdG9yYmlrZSwKICBNb3VudGFpbjogKCkgPT4gTW91bnRhaW4sCiAgTW91bnRhaW5Tbm93OiAoKSA9PiBNb3VudGFpblNub3csCiAgTW91c2U6ICgpID0+IE1vdXNlLAogIE1vdXNlTGVmdDogKCkgPT4gTW91c2VMZWZ0LAogIE1vdXNlT2ZmOiAoKSA9PiBNb3VzZU9mZiwKICBNb3VzZVBvaW50ZXI6ICgpID0+IE1vdXNlUG9pbnRlciwKICBNb3VzZVBvaW50ZXIyOiAoKSA9PiBNb3VzZVBvaW50ZXIyLAogIE1vdXNlUG9pbnRlcjJPZmY6ICgpID0+IE1vdXNlUG9pbnRlcjJPZmYsCiAgTW91c2VQb2ludGVyQmFuOiAoKSA9PiBNb3VzZVBvaW50ZXJCYW4sCiAgTW91c2VQb2ludGVyQ2xpY2s6ICgpID0+IE1vdXNlUG9pbnRlckNsaWNrLAogIE1vdXNlUG9pbnRlclNxdWFyZURhc2hlZDogKCkgPT4gU3F1YXJlRGFzaGVkTW91c2VQb2ludGVyLAogIE1vdXNlUmlnaHQ6ICgpID0+IE1vdXNlUmlnaHQsCiAgTW92ZTogKCkgPT4gTW92ZSwKICBNb3ZlM0Q6ICgpID0+IE1vdmUzZCwKICBNb3ZlM2Q6ICgpID0+IE1vdmUzZCwKICBNb3ZlRGlhZ29uYWw6ICgpID0+IE1vdmVEaWFnb25hbCwKICBNb3ZlRGlhZ29uYWwyOiAoKSA9PiBNb3ZlRGlhZ29uYWwyLAogIE1vdmVEb3duOiAoKSA9PiBNb3ZlRG93biwKICBNb3ZlRG93bkxlZnQ6ICgpID0+IE1vdmVEb3duTGVmdCwKICBNb3ZlRG93blJpZ2h0OiAoKSA9PiBNb3ZlRG93blJpZ2h0LAogIE1vdmVIb3Jpem9udGFsOiAoKSA9PiBNb3ZlSG9yaXpvbnRhbCwKICBNb3ZlTGVmdDogKCkgPT4gTW92ZUxlZnQsCiAgTW92ZVJpZ2h0OiAoKSA9PiBNb3ZlUmlnaHQsCiAgTW92ZVVwOiAoKSA9PiBNb3ZlVXAsCiAgTW92ZVVwTGVmdDogKCkgPT4gTW92ZVVwTGVmdCwKICBNb3ZlVXBSaWdodDogKCkgPT4gTW92ZVVwUmlnaHQsCiAgTW92ZVZlcnRpY2FsOiAoKSA9PiBNb3ZlVmVydGljYWwsCiAgTXVzaWM6ICgpID0+IE11c2ljLAogIE11c2ljMjogKCkgPT4gTXVzaWMyLAogIE11c2ljMzogKCkgPT4gTXVzaWMzLAogIE11c2ljNDogKCkgPT4gTXVzaWM0LAogIE5hdmlnYXRpb246ICgpID0+IE5hdmlnYXRpb24sCiAgTmF2aWdhdGlvbjI6ICgpID0+IE5hdmlnYXRpb24yLAogIE5hdmlnYXRpb24yT2ZmOiAoKSA9PiBOYXZpZ2F0aW9uMk9mZiwKICBOYXZpZ2F0aW9uT2ZmOiAoKSA9PiBOYXZpZ2F0aW9uT2ZmLAogIE5ldHdvcms6ICgpID0+IE5ldHdvcmssCiAgTmV3c3BhcGVyOiAoKSA9PiBOZXdzcGFwZXIsCiAgTmZjOiAoKSA9PiBOZmMsCiAgTm9uQmluYXJ5OiAoKSA9PiBOb25CaW5hcnksCiAgTm90ZWJvb2s6ICgpID0+IE5vdGVib29rLAogIE5vdGVib29rUGVuOiAoKSA9PiBOb3RlYm9va1BlbiwKICBOb3RlYm9va1RhYnM6ICgpID0+IE5vdGVib29rVGFicywKICBOb3RlYm9va1RleHQ6ICgpID0+IE5vdGVib29rVGV4dCwKICBOb3RlcGFkVGV4dDogKCkgPT4gTm90ZXBhZFRleHQsCiAgTm90ZXBhZFRleHREYXNoZWQ6ICgpID0+IE5vdGVwYWRUZXh0RGFzaGVkLAogIE51dDogKCkgPT4gTnV0LAogIE51dE9mZjogKCkgPT4gTnV0T2ZmLAogIE9jdGFnb246ICgpID0+IE9jdGFnb24sCiAgT2N0YWdvbkFsZXJ0OiAoKSA9PiBPY3RhZ29uQWxlcnQsCiAgT2N0YWdvbk1pbnVzOiAoKSA9PiBPY3RhZ29uTWludXMsCiAgT2N0YWdvblBhdXNlOiAoKSA9PiBPY3RhZ29uUGF1c2UsCiAgT2N0YWdvblg6ICgpID0+IE9jdGFnb25YLAogIE9tZWdhOiAoKSA9PiBPbWVnYSwKICBPcHRpb246ICgpID0+IE9wdGlvbiwKICBPcmJpdDogKCkgPT4gT3JiaXQsCiAgT3JpZ2FtaTogKCkgPT4gT3JpZ2FtaSwKICBPdXRkZW50OiAoKSA9PiBMaXN0SW5kZW50RGVjcmVhc2UsCiAgUGFja2FnZTogKCkgPT4gUGFja2FnZSwKICBQYWNrYWdlMjogKCkgPT4gUGFja2FnZTIsCiAgUGFja2FnZUNoZWNrOiAoKSA9PiBQYWNrYWdlQ2hlY2ssCiAgUGFja2FnZU1pbnVzOiAoKSA9PiBQYWNrYWdlTWludXMsCiAgUGFja2FnZU9wZW46ICgpID0+IFBhY2thZ2VPcGVuLAogIFBhY2thZ2VQbHVzOiAoKSA9PiBQYWNrYWdlUGx1cywKICBQYWNrYWdlU2VhcmNoOiAoKSA9PiBQYWNrYWdlU2VhcmNoLAogIFBhY2thZ2VYOiAoKSA9PiBQYWNrYWdlWCwKICBQYWludEJ1Y2tldDogKCkgPT4gUGFpbnRCdWNrZXQsCiAgUGFpbnRSb2xsZXI6ICgpID0+IFBhaW50Um9sbGVyLAogIFBhaW50YnJ1c2g6ICgpID0+IFBhaW50YnJ1c2gsCiAgUGFpbnRicnVzaDI6ICgpID0+IFBhaW50YnJ1c2hWZXJ0aWNhbCwKICBQYWludGJydXNoVmVydGljYWw6ICgpID0+IFBhaW50YnJ1c2hWZXJ0aWNhbCwKICBQYWxldHRlOiAoKSA9PiBQYWxldHRlLAogIFBhbG10cmVlOiAoKSA9PiBUcmVlUGFsbSwKICBQYW5kYTogKCkgPT4gUGFuZGEsCiAgUGFuZWxCb3R0b206ICgpID0+IFBhbmVsQm90dG9tLAogIFBhbmVsQm90dG9tQ2xvc2U6ICgpID0+IFBhbmVsQm90dG9tQ2xvc2UsCiAgUGFuZWxCb3R0b21EYXNoZWQ6ICgpID0+IFBhbmVsQm90dG9tRGFzaGVkLAogIFBhbmVsQm90dG9tSW5hY3RpdmU6ICgpID0+IFBhbmVsQm90dG9tRGFzaGVkLAogIFBhbmVsQm90dG9tT3BlbjogKCkgPT4gUGFuZWxCb3R0b21PcGVuLAogIFBhbmVsTGVmdDogKCkgPT4gUGFuZWxMZWZ0LAogIFBhbmVsTGVmdENsb3NlOiAoKSA9PiBQYW5lbExlZnRDbG9zZSwKICBQYW5lbExlZnREYXNoZWQ6ICgpID0+IFBhbmVsTGVmdERhc2hlZCwKICBQYW5lbExlZnRJbmFjdGl2ZTogKCkgPT4gUGFuZWxMZWZ0RGFzaGVkLAogIFBhbmVsTGVmdE9wZW46ICgpID0+IFBhbmVsTGVmdE9wZW4sCiAgUGFuZWxMZWZ0UmlnaHREYXNoZWQ6ICgpID0+IFBhbmVsTGVmdFJpZ2h0RGFzaGVkLAogIFBhbmVsUmlnaHQ6ICgpID0+IFBhbmVsUmlnaHQsCiAgUGFuZWxSaWdodENsb3NlOiAoKSA9PiBQYW5lbFJpZ2h0Q2xvc2UsCiAgUGFuZWxSaWdodERhc2hlZDogKCkgPT4gUGFuZWxSaWdodERhc2hlZCwKICBQYW5lbFJpZ2h0SW5hY3RpdmU6ICgpID0+IFBhbmVsUmlnaHREYXNoZWQsCiAgUGFuZWxSaWdodE9wZW46ICgpID0+IFBhbmVsUmlnaHRPcGVuLAogIFBhbmVsVG9wOiAoKSA9PiBQYW5lbFRvcCwKICBQYW5lbFRvcEJvdHRvbURhc2hlZDogKCkgPT4gUGFuZWxUb3BCb3R0b21EYXNoZWQsCiAgUGFuZWxUb3BDbG9zZTogKCkgPT4gUGFuZWxUb3BDbG9zZSwKICBQYW5lbFRvcERhc2hlZDogKCkgPT4gUGFuZWxUb3BEYXNoZWQsCiAgUGFuZWxUb3BJbmFjdGl2ZTogKCkgPT4gUGFuZWxUb3BEYXNoZWQsCiAgUGFuZWxUb3BPcGVuOiAoKSA9PiBQYW5lbFRvcE9wZW4sCiAgUGFuZWxzTGVmdEJvdHRvbTogKCkgPT4gUGFuZWxzTGVmdEJvdHRvbSwKICBQYW5lbHNMZWZ0UmlnaHQ6ICgpID0+IENvbHVtbnMzLAogIFBhbmVsc1JpZ2h0Qm90dG9tOiAoKSA9PiBQYW5lbHNSaWdodEJvdHRvbSwKICBQYW5lbHNUb3BCb3R0b206ICgpID0+IFJvd3MzLAogIFBhbmVsc1RvcExlZnQ6ICgpID0+IFBhbmVsc1RvcExlZnQsCiAgUGFwZXJjbGlwOiAoKSA9PiBQYXBlcmNsaXAsCiAgUGFyZW50aGVzZXM6ICgpID0+IFBhcmVudGhlc2VzLAogIFBhcmtpbmdDaXJjbGU6ICgpID0+IENpcmNsZVBhcmtpbmcsCiAgUGFya2luZ0NpcmNsZU9mZjogKCkgPT4gQ2lyY2xlUGFya2luZ09mZiwKICBQYXJraW5nTWV0ZXI6ICgpID0+IFBhcmtpbmdNZXRlciwKICBQYXJraW5nU3F1YXJlOiAoKSA9PiBTcXVhcmVQYXJraW5nLAogIFBhcmtpbmdTcXVhcmVPZmY6ICgpID0+IFNxdWFyZVBhcmtpbmdPZmYsCiAgUGFydHlQb3BwZXI6ICgpID0+IFBhcnR5UG9wcGVyLAogIFBhdXNlOiAoKSA9PiBQYXVzZSwKICBQYXVzZUNpcmNsZTogKCkgPT4gQ2lyY2xlUGF1c2UsCiAgUGF1c2VPY3RhZ29uOiAoKSA9PiBPY3RhZ29uUGF1c2UsCiAgUGF3UHJpbnQ6ICgpID0+IFBhd1ByaW50LAogIFBjQ2FzZTogKCkgPT4gUGNDYXNlLAogIFBlbjogKCkgPT4gUGVuLAogIFBlbkJveDogKCkgPT4gU3F1YXJlUGVuLAogIFBlbkxpbmU6ICgpID0+IFBlbkxpbmUsCiAgUGVuT2ZmOiAoKSA9PiBQZW5PZmYsCiAgUGVuU3F1YXJlOiAoKSA9PiBTcXVhcmVQZW4sCiAgUGVuVG9vbDogKCkgPT4gUGVuVG9vbCwKICBQZW5jaWw6ICgpID0+IFBlbmNpbCwKICBQZW5jaWxMaW5lOiAoKSA9PiBQZW5jaWxMaW5lLAogIFBlbmNpbE9mZjogKCkgPT4gUGVuY2lsT2ZmLAogIFBlbmNpbFJ1bGVyOiAoKSA9PiBQZW5jaWxSdWxlciwKICBQZW50YWdvbjogKCkgPT4gUGVudGFnb24sCiAgUGVyY2VudDogKCkgPT4gUGVyY2VudCwKICBQZXJjZW50Q2lyY2xlOiAoKSA9PiBDaXJjbGVQZXJjZW50LAogIFBlcmNlbnREaWFtb25kOiAoKSA9PiBEaWFtb25kUGVyY2VudCwKICBQZXJjZW50U3F1YXJlOiAoKSA9PiBTcXVhcmVQZXJjZW50LAogIFBlcnNvblN0YW5kaW5nOiAoKSA9PiBQZXJzb25TdGFuZGluZywKICBQaGlsaXBwaW5lUGVzbzogKCkgPT4gUGhpbGlwcGluZVBlc28sCiAgUGhvbmU6ICgpID0+IFBob25lLAogIFBob25lQ2FsbDogKCkgPT4gUGhvbmVDYWxsLAogIFBob25lRm9yd2FyZGVkOiAoKSA9PiBQaG9uZUZvcndhcmRlZCwKICBQaG9uZUluY29taW5nOiAoKSA9PiBQaG9uZUluY29taW5nLAogIFBob25lTWlzc2VkOiAoKSA9PiBQaG9uZU1pc3NlZCwKICBQaG9uZU9mZjogKCkgPT4gUGhvbmVPZmYsCiAgUGhvbmVPdXRnb2luZzogKCkgPT4gUGhvbmVPdXRnb2luZywKICBQaTogKCkgPT4gUGksCiAgUGlTcXVhcmU6ICgpID0+IFNxdWFyZVBpLAogIFBpYW5vOiAoKSA9PiBQaWFubywKICBQaWNrYXhlOiAoKSA9PiBQaWNrYXhlLAogIFBpY3R1cmVJblBpY3R1cmU6ICgpID0+IFBpY3R1cmVJblBpY3R1cmUsCiAgUGljdHVyZUluUGljdHVyZTI6ICgpID0+IFBpY3R1cmVJblBpY3R1cmUyLAogIFBpZUNoYXJ0OiAoKSA9PiBDaGFydFBpZSwKICBQaWdneUJhbms6ICgpID0+IFBpZ2d5QmFuaywKICBQaWxjcm93OiAoKSA9PiBQaWxjcm93LAogIFBpbGNyb3dMZWZ0OiAoKSA9PiBQaWxjcm93TGVmdCwKICBQaWxjcm93UmlnaHQ6ICgpID0+IFBpbGNyb3dSaWdodCwKICBQaWxjcm93U3F1YXJlOiAoKSA9PiBTcXVhcmVQaWxjcm93LAogIFBpbGw6ICgpID0+IFBpbGwsCiAgUGlsbEJvdHRsZTogKCkgPT4gUGlsbEJvdHRsZSwKICBQaW46ICgpID0+IFBpbiwKICBQaW5PZmY6ICgpID0+IFBpbk9mZiwKICBQaXBldHRlOiAoKSA9PiBQaXBldHRlLAogIFBpenphOiAoKSA9PiBQaXp6YSwKICBQbGFuZTogKCkgPT4gUGxhbmUsCiAgUGxhbmVMYW5kaW5nOiAoKSA9PiBQbGFuZUxhbmRpbmcsCiAgUGxhbmVUYWtlb2ZmOiAoKSA9PiBQbGFuZVRha2VvZmYsCiAgUGxheTogKCkgPT4gUGxheSwKICBQbGF5Q2lyY2xlOiAoKSA9PiBDaXJjbGVQbGF5LAogIFBsYXlTcXVhcmU6ICgpID0+IFNxdWFyZVBsYXksCiAgUGx1ZzogKCkgPT4gUGx1ZywKICBQbHVnMjogKCkgPT4gUGx1ZzIsCiAgUGx1Z1phcDogKCkgPT4gUGx1Z1phcCwKICBQbHVnWmFwMjogKCkgPT4gUGx1Z1phcCwKICBQbHVzOiAoKSA9PiBQbHVzLAogIFBsdXNDaXJjbGU6ICgpID0+IENpcmNsZVBsdXMsCiAgUGx1c1NxdWFyZTogKCkgPT4gU3F1YXJlUGx1cywKICBQb2NrZXQ6ICgpID0+IFBvY2tldCwKICBQb2NrZXRLbmlmZTogKCkgPT4gUG9ja2V0S25pZmUsCiAgUG9kY2FzdDogKCkgPT4gUG9kY2FzdCwKICBQb2ludGVyOiAoKSA9PiBQb2ludGVyLAogIFBvaW50ZXJPZmY6ICgpID0+IFBvaW50ZXJPZmYsCiAgUG9wY29ybjogKCkgPT4gUG9wY29ybiwKICBQb3BzaWNsZTogKCkgPT4gUG9wc2ljbGUsCiAgUG91bmRTdGVybGluZzogKCkgPT4gUG91bmRTdGVybGluZywKICBQb3dlcjogKCkgPT4gUG93ZXIsCiAgUG93ZXJDaXJjbGU6ICgpID0+IENpcmNsZVBvd2VyLAogIFBvd2VyT2ZmOiAoKSA9PiBQb3dlck9mZiwKICBQb3dlclNxdWFyZTogKCkgPT4gU3F1YXJlUG93ZXIsCiAgUHJlc2VudGF0aW9uOiAoKSA9PiBQcmVzZW50YXRpb24sCiAgUHJpbnRlcjogKCkgPT4gUHJpbnRlciwKICBQcmludGVyQ2hlY2s6ICgpID0+IFByaW50ZXJDaGVjaywKICBQcmludGVyWDogKCkgPT4gUHJpbnRlclgsCiAgUHJvamVjdG9yOiAoKSA9PiBQcm9qZWN0b3IsCiAgUHJvcG9ydGlvbnM6ICgpID0+IFByb3BvcnRpb25zLAogIFB1enpsZTogKCkgPT4gUHV6emxlLAogIFB5cmFtaWQ6ICgpID0+IFB5cmFtaWQsCiAgUXJDb2RlOiAoKSA9PiBRckNvZGUsCiAgUXVvdGU6ICgpID0+IFF1b3RlLAogIFJhYmJpdDogKCkgPT4gUmFiYml0LAogIFJhZGFyOiAoKSA9PiBSYWRhciwKICBSYWRpYXRpb246ICgpID0+IFJhZGlhdGlvbiwKICBSYWRpY2FsOiAoKSA9PiBSYWRpY2FsLAogIFJhZGlvOiAoKSA9PiBSYWRpbywKICBSYWRpb1JlY2VpdmVyOiAoKSA9PiBSYWRpb1JlY2VpdmVyLAogIFJhZGlvVG93ZXI6ICgpID0+IFJhZGlvVG93ZXIsCiAgUmFkaXVzOiAoKSA9PiBSYWRpdXMsCiAgUmFpbFN5bWJvbDogKCkgPT4gUmFpbFN5bWJvbCwKICBSYWluYm93OiAoKSA9PiBSYWluYm93LAogIFJhdDogKCkgPT4gUmF0LAogIFJhdGlvOiAoKSA9PiBSYXRpbywKICBSZWNlaXB0OiAoKSA9PiBSZWNlaXB0LAogIFJlY2VpcHRDZW50OiAoKSA9PiBSZWNlaXB0Q2VudCwKICBSZWNlaXB0RXVybzogKCkgPT4gUmVjZWlwdEV1cm8sCiAgUmVjZWlwdEluZGlhblJ1cGVlOiAoKSA9PiBSZWNlaXB0SW5kaWFuUnVwZWUsCiAgUmVjZWlwdEphcGFuZXNlWWVuOiAoKSA9PiBSZWNlaXB0SmFwYW5lc2VZZW4sCiAgUmVjZWlwdFBvdW5kU3Rlcmxpbmc6ICgpID0+IFJlY2VpcHRQb3VuZFN0ZXJsaW5nLAogIFJlY2VpcHRSdXNzaWFuUnVibGU6ICgpID0+IFJlY2VpcHRSdXNzaWFuUnVibGUsCiAgUmVjZWlwdFN3aXNzRnJhbmM6ICgpID0+IFJlY2VpcHRTd2lzc0ZyYW5jLAogIFJlY2VpcHRUZXh0OiAoKSA9PiBSZWNlaXB0VGV4dCwKICBSZWNlaXB0VHVya2lzaExpcmE6ICgpID0+IFJlY2VpcHRUdXJraXNoTGlyYSwKICBSZWN0YW5nbGVDaXJjbGU6ICgpID0+IFJlY3RhbmdsZUNpcmNsZSwKICBSZWN0YW5nbGVFbGxpcHNpczogKCkgPT4gUmVjdGFuZ2xlRWxsaXBzaXMsCiAgUmVjdGFuZ2xlR29nZ2xlczogKCkgPT4gUmVjdGFuZ2xlR29nZ2xlcywKICBSZWN0YW5nbGVIb3Jpem9udGFsOiAoKSA9PiBSZWN0YW5nbGVIb3Jpem9udGFsLAogIFJlY3RhbmdsZVZlcnRpY2FsOiAoKSA9PiBSZWN0YW5nbGVWZXJ0aWNhbCwKICBSZWN5Y2xlOiAoKSA9PiBSZWN5Y2xlLAogIFJlZG86ICgpID0+IFJlZG8sCiAgUmVkbzI6ICgpID0+IFJlZG8yLAogIFJlZG9Eb3Q6ICgpID0+IFJlZG9Eb3QsCiAgUmVmcmVzaENjdzogKCkgPT4gUmVmcmVzaENjdywKICBSZWZyZXNoQ2N3RG90OiAoKSA9PiBSZWZyZXNoQ2N3RG90LAogIFJlZnJlc2hDdzogKCkgPT4gUmVmcmVzaEN3LAogIFJlZnJlc2hDd09mZjogKCkgPT4gUmVmcmVzaEN3T2ZmLAogIFJlZnJpZ2VyYXRvcjogKCkgPT4gUmVmcmlnZXJhdG9yLAogIFJlZ2V4OiAoKSA9PiBSZWdleCwKICBSZW1vdmVGb3JtYXR0aW5nOiAoKSA9PiBSZW1vdmVGb3JtYXR0aW5nLAogIFJlcGVhdDogKCkgPT4gUmVwZWF0LAogIFJlcGVhdDE6ICgpID0+IFJlcGVhdDEsCiAgUmVwZWF0MjogKCkgPT4gUmVwZWF0MiwKICBSZXBsYWNlOiAoKSA9PiBSZXBsYWNlLAogIFJlcGxhY2VBbGw6ICgpID0+IFJlcGxhY2VBbGwsCiAgUmVwbHk6ICgpID0+IFJlcGx5LAogIFJlcGx5QWxsOiAoKSA9PiBSZXBseUFsbCwKICBSZXdpbmQ6ICgpID0+IFJld2luZCwKICBSaWJib246ICgpID0+IFJpYmJvbiwKICBSb2NrZXQ6ICgpID0+IFJvY2tldCwKICBSb2NraW5nQ2hhaXI6ICgpID0+IFJvY2tpbmdDaGFpciwKICBSb2xsZXJDb2FzdGVyOiAoKSA9PiBSb2xsZXJDb2FzdGVyLAogIFJvc2U6ICgpID0+IFJvc2UsCiAgUm90YXRlM0Q6ICgpID0+IFJvdGF0ZTNkLAogIFJvdGF0ZTNkOiAoKSA9PiBSb3RhdGUzZCwKICBSb3RhdGVDY3c6ICgpID0+IFJvdGF0ZUNjdywKICBSb3RhdGVDY3dLZXk6ICgpID0+IFJvdGF0ZUNjd0tleSwKICBSb3RhdGVDY3dTcXVhcmU6ICgpID0+IFJvdGF0ZUNjd1NxdWFyZSwKICBSb3RhdGVDdzogKCkgPT4gUm90YXRlQ3csCiAgUm90YXRlQ3dTcXVhcmU6ICgpID0+IFJvdGF0ZUN3U3F1YXJlLAogIFJvdXRlOiAoKSA9PiBSb3V0ZSwKICBSb3V0ZU9mZjogKCkgPT4gUm91dGVPZmYsCiAgUm91dGVyOiAoKSA9PiBSb3V0ZXIsCiAgUm93czogKCkgPT4gUm93czIsCiAgUm93czI6ICgpID0+IFJvd3MyLAogIFJvd3MzOiAoKSA9PiBSb3dzMywKICBSb3dzNDogKCkgPT4gUm93czQsCiAgUnNzOiAoKSA9PiBSc3MsCiAgUnVsZXI6ICgpID0+IFJ1bGVyLAogIFJ1bGVyRGltZW5zaW9uTGluZTogKCkgPT4gUnVsZXJEaW1lbnNpb25MaW5lLAogIFJ1c3NpYW5SdWJsZTogKCkgPT4gUnVzc2lhblJ1YmxlLAogIFNhaWxib2F0OiAoKSA9PiBTYWlsYm9hdCwKICBTYWxhZDogKCkgPT4gU2FsYWQsCiAgU2FuZHdpY2g6ICgpID0+IFNhbmR3aWNoLAogIFNhdGVsbGl0ZTogKCkgPT4gU2F0ZWxsaXRlLAogIFNhdGVsbGl0ZURpc2g6ICgpID0+IFNhdGVsbGl0ZURpc2gsCiAgU2F1ZGlSaXlhbDogKCkgPT4gU2F1ZGlSaXlhbCwKICBTYXZlOiAoKSA9PiBTYXZlLAogIFNhdmVBbGw6ICgpID0+IFNhdmVBbGwsCiAgU2F2ZU9mZjogKCkgPT4gU2F2ZU9mZiwKICBTY2FsZTogKCkgPT4gU2NhbGUsCiAgU2NhbGUzRDogKCkgPT4gU2NhbGUzZCwKICBTY2FsZTNkOiAoKSA9PiBTY2FsZTNkLAogIFNjYWxpbmc6ICgpID0+IFNjYWxpbmcsCiAgU2NhbjogKCkgPT4gU2NhbiwKICBTY2FuQmFyY29kZTogKCkgPT4gU2NhbkJhcmNvZGUsCiAgU2NhbkV5ZTogKCkgPT4gU2NhbkV5ZSwKICBTY2FuRmFjZTogKCkgPT4gU2NhbkZhY2UsCiAgU2NhbkhlYXJ0OiAoKSA9PiBTY2FuSGVhcnQsCiAgU2NhbkxpbmU6ICgpID0+IFNjYW5MaW5lLAogIFNjYW5RckNvZGU6ICgpID0+IFNjYW5RckNvZGUsCiAgU2NhblNlYXJjaDogKCkgPT4gU2NhblNlYXJjaCwKICBTY2FuVGV4dDogKCkgPT4gU2NhblRleHQsCiAgU2NhdHRlckNoYXJ0OiAoKSA9PiBDaGFydFNjYXR0ZXIsCiAgU2Nob29sOiAoKSA9PiBTY2hvb2wsCiAgU2Nob29sMjogKCkgPT4gVW5pdmVyc2l0eSwKICBTY2lzc29yczogKCkgPT4gU2Npc3NvcnMsCiAgU2Npc3NvcnNMaW5lRGFzaGVkOiAoKSA9PiBTY2lzc29yc0xpbmVEYXNoZWQsCiAgU2Npc3NvcnNTcXVhcmU6ICgpID0+IFNxdWFyZVNjaXNzb3JzLAogIFNjaXNzb3JzU3F1YXJlRGFzaGVkQm90dG9tOiAoKSA9PiBTcXVhcmVCb3R0b21EYXNoZWRTY2lzc29ycywKICBTY29vdGVyOiAoKSA9PiBTY29vdGVyLAogIFNjcmVlblNoYXJlOiAoKSA9PiBTY3JlZW5TaGFyZSwKICBTY3JlZW5TaGFyZU9mZjogKCkgPT4gU2NyZWVuU2hhcmVPZmYsCiAgU2Nyb2xsOiAoKSA9PiBTY3JvbGwsCiAgU2Nyb2xsVGV4dDogKCkgPT4gU2Nyb2xsVGV4dCwKICBTZWFyY2g6ICgpID0+IFNlYXJjaCwKICBTZWFyY2hBbGVydDogKCkgPT4gU2VhcmNoQWxlcnQsCiAgU2VhcmNoQ2hlY2s6ICgpID0+IFNlYXJjaENoZWNrLAogIFNlYXJjaENvZGU6ICgpID0+IFNlYXJjaENvZGUsCiAgU2VhcmNoU2xhc2g6ICgpID0+IFNlYXJjaFNsYXNoLAogIFNlYXJjaFg6ICgpID0+IFNlYXJjaFgsCiAgU2VjdGlvbjogKCkgPT4gU2VjdGlvbiwKICBTZW5kOiAoKSA9PiBTZW5kLAogIFNlbmRIb3Jpem9uYWw6ICgpID0+IFNlbmRIb3Jpem9udGFsLAogIFNlbmRIb3Jpem9udGFsOiAoKSA9PiBTZW5kSG9yaXpvbnRhbCwKICBTZW5kVG9CYWNrOiAoKSA9PiBTZW5kVG9CYWNrLAogIFNlcGFyYXRvckhvcml6b250YWw6ICgpID0+IFNlcGFyYXRvckhvcml6b250YWwsCiAgU2VwYXJhdG9yVmVydGljYWw6ICgpID0+IFNlcGFyYXRvclZlcnRpY2FsLAogIFNlcnZlcjogKCkgPT4gU2VydmVyLAogIFNlcnZlckNvZzogKCkgPT4gU2VydmVyQ29nLAogIFNlcnZlckNyYXNoOiAoKSA9PiBTZXJ2ZXJDcmFzaCwKICBTZXJ2ZXJPZmY6ICgpID0+IFNlcnZlck9mZiwKICBTZXR0aW5nczogKCkgPT4gU2V0dGluZ3MsCiAgU2V0dGluZ3MyOiAoKSA9PiBTZXR0aW5nczIsCiAgU2hhcGVzOiAoKSA9PiBTaGFwZXMsCiAgU2hhcmU6ICgpID0+IFNoYXJlLAogIFNoYXJlMjogKCkgPT4gU2hhcmUyLAogIFNoZWV0OiAoKSA9PiBTaGVldCwKICBTaGVsbDogKCkgPT4gU2hlbGwsCiAgU2hlbHZpbmdVbml0OiAoKSA9PiBTaGVsdmluZ1VuaXQsCiAgU2hpZWxkOiAoKSA9PiBTaGllbGQsCiAgU2hpZWxkQWxlcnQ6ICgpID0+IFNoaWVsZEFsZXJ0LAogIFNoaWVsZEJhbjogKCkgPT4gU2hpZWxkQmFuLAogIFNoaWVsZENoZWNrOiAoKSA9PiBTaGllbGRDaGVjaywKICBTaGllbGRDbG9zZTogKCkgPT4gU2hpZWxkWCwKICBTaGllbGRFbGxpcHNpczogKCkgPT4gU2hpZWxkRWxsaXBzaXMsCiAgU2hpZWxkSGFsZjogKCkgPT4gU2hpZWxkSGFsZiwKICBTaGllbGRNaW51czogKCkgPT4gU2hpZWxkTWludXMsCiAgU2hpZWxkT2ZmOiAoKSA9PiBTaGllbGRPZmYsCiAgU2hpZWxkUGx1czogKCkgPT4gU2hpZWxkUGx1cywKICBTaGllbGRRdWVzdGlvbjogKCkgPT4gU2hpZWxkUXVlc3Rpb25NYXJrLAogIFNoaWVsZFF1ZXN0aW9uTWFyazogKCkgPT4gU2hpZWxkUXVlc3Rpb25NYXJrLAogIFNoaWVsZFVzZXI6ICgpID0+IFNoaWVsZFVzZXIsCiAgU2hpZWxkWDogKCkgPT4gU2hpZWxkWCwKICBTaGlwOiAoKSA9PiBTaGlwLAogIFNoaXBXaGVlbDogKCkgPT4gU2hpcFdoZWVsLAogIFNoaXJ0OiAoKSA9PiBTaGlydCwKICBTaG9wcGluZ0JhZzogKCkgPT4gU2hvcHBpbmdCYWcsCiAgU2hvcHBpbmdCYXNrZXQ6ICgpID0+IFNob3BwaW5nQmFza2V0LAogIFNob3BwaW5nQ2FydDogKCkgPT4gU2hvcHBpbmdDYXJ0LAogIFNob3ZlbDogKCkgPT4gU2hvdmVsLAogIFNob3dlckhlYWQ6ICgpID0+IFNob3dlckhlYWQsCiAgU2hyZWRkZXI6ICgpID0+IFNocmVkZGVyLAogIFNocmltcDogKCkgPT4gU2hyaW1wLAogIFNocmluazogKCkgPT4gU2hyaW5rLAogIFNocnViOiAoKSA9PiBTaHJ1YiwKICBTaHVmZmxlOiAoKSA9PiBTaHVmZmxlLAogIFNpZGViYXI6ICgpID0+IFBhbmVsTGVmdCwKICBTaWRlYmFyQ2xvc2U6ICgpID0+IFBhbmVsTGVmdENsb3NlLAogIFNpZGViYXJPcGVuOiAoKSA9PiBQYW5lbExlZnRPcGVuLAogIFNpZ21hOiAoKSA9PiBTaWdtYSwKICBTaWdtYVNxdWFyZTogKCkgPT4gU3F1YXJlU2lnbWEsCiAgU2lnbmFsOiAoKSA9PiBTaWduYWwsCiAgU2lnbmFsSGlnaDogKCkgPT4gU2lnbmFsSGlnaCwKICBTaWduYWxMb3c6ICgpID0+IFNpZ25hbExvdywKICBTaWduYWxNZWRpdW06ICgpID0+IFNpZ25hbE1lZGl1bSwKICBTaWduYWxaZXJvOiAoKSA9PiBTaWduYWxaZXJvLAogIFNpZ25hdHVyZTogKCkgPT4gU2lnbmF0dXJlLAogIFNpZ25wb3N0OiAoKSA9PiBTaWducG9zdCwKICBTaWducG9zdEJpZzogKCkgPT4gU2lnbnBvc3RCaWcsCiAgU2lyZW46ICgpID0+IFNpcmVuLAogIFNraXBCYWNrOiAoKSA9PiBTa2lwQmFjaywKICBTa2lwRm9yd2FyZDogKCkgPT4gU2tpcEZvcndhcmQsCiAgU2t1bGw6ICgpID0+IFNrdWxsLAogIFNsYWNrOiAoKSA9PiBTbGFjaywKICBTbGFzaDogKCkgPT4gU2xhc2gsCiAgU2xhc2hTcXVhcmU6ICgpID0+IFNxdWFyZVNsYXNoLAogIFNsaWNlOiAoKSA9PiBTbGljZSwKICBTbGlkZXJzOiAoKSA9PiBTbGlkZXJzVmVydGljYWwsCiAgU2xpZGVyc0hvcml6b250YWw6ICgpID0+IFNsaWRlcnNIb3Jpem9udGFsLAogIFNsaWRlcnNWZXJ0aWNhbDogKCkgPT4gU2xpZGVyc1ZlcnRpY2FsLAogIFNtYXJ0cGhvbmU6ICgpID0+IFNtYXJ0cGhvbmUsCiAgU21hcnRwaG9uZUNoYXJnaW5nOiAoKSA9PiBTbWFydHBob25lQ2hhcmdpbmcsCiAgU21hcnRwaG9uZU5mYzogKCkgPT4gU21hcnRwaG9uZU5mYywKICBTbWlsZTogKCkgPT4gU21pbGUsCiAgU21pbGVQbHVzOiAoKSA9PiBTbWlsZVBsdXMsCiAgU25haWw6ICgpID0+IFNuYWlsLAogIFNub3dmbGFrZTogKCkgPT4gU25vd2ZsYWtlLAogIFNvYXBEaXNwZW5zZXJEcm9wbGV0OiAoKSA9PiBTb2FwRGlzcGVuc2VyRHJvcGxldCwKICBTb2ZhOiAoKSA9PiBTb2ZhLAogIFNvbGFyUGFuZWw6ICgpID0+IFNvbGFyUGFuZWwsCiAgU29ydEFzYzogKCkgPT4gQXJyb3dVcE5hcnJvd1dpZGUsCiAgU29ydERlc2M6ICgpID0+IEFycm93RG93bldpZGVOYXJyb3csCiAgU291cDogKCkgPT4gU291cCwKICBTcGFjZTogKCkgPT4gU3BhY2UsCiAgU3BhZGU6ICgpID0+IFNwYWRlLAogIFNwYXJrbGU6ICgpID0+IFNwYXJrbGUsCiAgU3BhcmtsZXM6ICgpID0+IFNwYXJrbGVzLAogIFNwZWFrZXI6ICgpID0+IFNwZWFrZXIsCiAgU3BlZWNoOiAoKSA9PiBTcGVlY2gsCiAgU3BlbGxDaGVjazogKCkgPT4gU3BlbGxDaGVjaywKICBTcGVsbENoZWNrMjogKCkgPT4gU3BlbGxDaGVjazIsCiAgU3BsaW5lOiAoKSA9PiBTcGxpbmUsCiAgU3BsaW5lUG9pbnRlcjogKCkgPT4gU3BsaW5lUG9pbnRlciwKICBTcGxpdDogKCkgPT4gU3BsaXQsCiAgU3BsaXRTcXVhcmVIb3Jpem9udGFsOiAoKSA9PiBTcXVhcmVTcGxpdEhvcml6b250YWwsCiAgU3BsaXRTcXVhcmVWZXJ0aWNhbDogKCkgPT4gU3F1YXJlU3BsaXRWZXJ0aWNhbCwKICBTcG9vbDogKCkgPT4gU3Bvb2wsCiAgU3BvdGxpZ2h0OiAoKSA9PiBTcG90bGlnaHQsCiAgU3ByYXlDYW46ICgpID0+IFNwcmF5Q2FuLAogIFNwcm91dDogKCkgPT4gU3Byb3V0LAogIFNxdWFyZTogKCkgPT4gU3F1YXJlLAogIFNxdWFyZUFjdGl2aXR5OiAoKSA9PiBTcXVhcmVBY3Rpdml0eSwKICBTcXVhcmVBcnJvd0Rvd246ICgpID0+IFNxdWFyZUFycm93RG93biwKICBTcXVhcmVBcnJvd0Rvd25MZWZ0OiAoKSA9PiBTcXVhcmVBcnJvd0Rvd25MZWZ0LAogIFNxdWFyZUFycm93RG93blJpZ2h0OiAoKSA9PiBTcXVhcmVBcnJvd0Rvd25SaWdodCwKICBTcXVhcmVBcnJvd0xlZnQ6ICgpID0+IFNxdWFyZUFycm93TGVmdCwKICBTcXVhcmVBcnJvd091dERvd25MZWZ0OiAoKSA9PiBTcXVhcmVBcnJvd091dERvd25MZWZ0LAogIFNxdWFyZUFycm93T3V0RG93blJpZ2h0OiAoKSA9PiBTcXVhcmVBcnJvd091dERvd25SaWdodCwKICBTcXVhcmVBcnJvd091dFVwTGVmdDogKCkgPT4gU3F1YXJlQXJyb3dPdXRVcExlZnQsCiAgU3F1YXJlQXJyb3dPdXRVcFJpZ2h0OiAoKSA9PiBTcXVhcmVBcnJvd091dFVwUmlnaHQsCiAgU3F1YXJlQXJyb3dSaWdodDogKCkgPT4gU3F1YXJlQXJyb3dSaWdodCwKICBTcXVhcmVBcnJvd1JpZ2h0RW50ZXI6ICgpID0+IFNxdWFyZUFycm93UmlnaHRFbnRlciwKICBTcXVhcmVBcnJvd1JpZ2h0RXhpdDogKCkgPT4gU3F1YXJlQXJyb3dSaWdodEV4aXQsCiAgU3F1YXJlQXJyb3dVcDogKCkgPT4gU3F1YXJlQXJyb3dVcCwKICBTcXVhcmVBcnJvd1VwTGVmdDogKCkgPT4gU3F1YXJlQXJyb3dVcExlZnQsCiAgU3F1YXJlQXJyb3dVcFJpZ2h0OiAoKSA9PiBTcXVhcmVBcnJvd1VwUmlnaHQsCiAgU3F1YXJlQXN0ZXJpc2s6ICgpID0+IFNxdWFyZUFzdGVyaXNrLAogIFNxdWFyZUJvdHRvbURhc2hlZFNjaXNzb3JzOiAoKSA9PiBTcXVhcmVCb3R0b21EYXNoZWRTY2lzc29ycywKICBTcXVhcmVDZW50ZXJsaW5lRGFzaGVkSG9yaXpvbnRhbDogKCkgPT4gU3F1YXJlQ2VudGVybGluZURhc2hlZEhvcml6b250YWwsCiAgU3F1YXJlQ2VudGVybGluZURhc2hlZFZlcnRpY2FsOiAoKSA9PiBTcXVhcmVDZW50ZXJsaW5lRGFzaGVkVmVydGljYWwsCiAgU3F1YXJlQ2hhcnRHYW50dDogKCkgPT4gU3F1YXJlQ2hhcnRHYW50dCwKICBTcXVhcmVDaGVjazogKCkgPT4gU3F1YXJlQ2hlY2ssCiAgU3F1YXJlQ2hlY2tCaWc6ICgpID0+IFNxdWFyZUNoZWNrQmlnLAogIFNxdWFyZUNoZXZyb25Eb3duOiAoKSA9PiBTcXVhcmVDaGV2cm9uRG93biwKICBTcXVhcmVDaGV2cm9uTGVmdDogKCkgPT4gU3F1YXJlQ2hldnJvbkxlZnQsCiAgU3F1YXJlQ2hldnJvblJpZ2h0OiAoKSA9PiBTcXVhcmVDaGV2cm9uUmlnaHQsCiAgU3F1YXJlQ2hldnJvblVwOiAoKSA9PiBTcXVhcmVDaGV2cm9uVXAsCiAgU3F1YXJlQ29kZTogKCkgPT4gU3F1YXJlQ29kZSwKICBTcXVhcmVEYXNoZWQ6ICgpID0+IFNxdWFyZURhc2hlZCwKICBTcXVhcmVEYXNoZWRCb3R0b206ICgpID0+IFNxdWFyZURhc2hlZEJvdHRvbSwKICBTcXVhcmVEYXNoZWRCb3R0b21Db2RlOiAoKSA9PiBTcXVhcmVEYXNoZWRCb3R0b21Db2RlLAogIFNxdWFyZURhc2hlZEthbmJhbjogKCkgPT4gU3F1YXJlRGFzaGVkS2FuYmFuLAogIFNxdWFyZURhc2hlZE1vdXNlUG9pbnRlcjogKCkgPT4gU3F1YXJlRGFzaGVkTW91c2VQb2ludGVyLAogIFNxdWFyZURhc2hlZFRvcFNvbGlkOiAoKSA9PiBTcXVhcmVEYXNoZWRUb3BTb2xpZCwKICBTcXVhcmVEaXZpZGU6ICgpID0+IFNxdWFyZURpdmlkZSwKICBTcXVhcmVEb3Q6ICgpID0+IFNxdWFyZURvdCwKICBTcXVhcmVFcXVhbDogKCkgPT4gU3F1YXJlRXF1YWwsCiAgU3F1YXJlRnVuY3Rpb246ICgpID0+IFNxdWFyZUZ1bmN0aW9uLAogIFNxdWFyZUdhbnR0Q2hhcnQ6ICgpID0+IFNxdWFyZUNoYXJ0R2FudHQsCiAgU3F1YXJlS2FuYmFuOiAoKSA9PiBTcXVhcmVLYW5iYW4sCiAgU3F1YXJlTGlicmFyeTogKCkgPT4gU3F1YXJlTGlicmFyeSwKICBTcXVhcmVNOiAoKSA9PiBTcXVhcmVNLAogIFNxdWFyZU1lbnU6ICgpID0+IFNxdWFyZU1lbnUsCiAgU3F1YXJlTWludXM6ICgpID0+IFNxdWFyZU1pbnVzLAogIFNxdWFyZU1vdXNlUG9pbnRlcjogKCkgPT4gU3F1YXJlTW91c2VQb2ludGVyLAogIFNxdWFyZVBhcmtpbmc6ICgpID0+IFNxdWFyZVBhcmtpbmcsCiAgU3F1YXJlUGFya2luZ09mZjogKCkgPT4gU3F1YXJlUGFya2luZ09mZiwKICBTcXVhcmVQYXVzZTogKCkgPT4gU3F1YXJlUGF1c2UsCiAgU3F1YXJlUGVuOiAoKSA9PiBTcXVhcmVQZW4sCiAgU3F1YXJlUGVyY2VudDogKCkgPT4gU3F1YXJlUGVyY2VudCwKICBTcXVhcmVQaTogKCkgPT4gU3F1YXJlUGksCiAgU3F1YXJlUGlsY3JvdzogKCkgPT4gU3F1YXJlUGlsY3JvdywKICBTcXVhcmVQbGF5OiAoKSA9PiBTcXVhcmVQbGF5LAogIFNxdWFyZVBsdXM6ICgpID0+IFNxdWFyZVBsdXMsCiAgU3F1YXJlUG93ZXI6ICgpID0+IFNxdWFyZVBvd2VyLAogIFNxdWFyZVJhZGljYWw6ICgpID0+IFNxdWFyZVJhZGljYWwsCiAgU3F1YXJlUm91bmRDb3JuZXI6ICgpID0+IFNxdWFyZVJvdW5kQ29ybmVyLAogIFNxdWFyZVNjaXNzb3JzOiAoKSA9PiBTcXVhcmVTY2lzc29ycywKICBTcXVhcmVTaWdtYTogKCkgPT4gU3F1YXJlU2lnbWEsCiAgU3F1YXJlU2xhc2g6ICgpID0+IFNxdWFyZVNsYXNoLAogIFNxdWFyZVNwbGl0SG9yaXpvbnRhbDogKCkgPT4gU3F1YXJlU3BsaXRIb3Jpem9udGFsLAogIFNxdWFyZVNwbGl0VmVydGljYWw6ICgpID0+IFNxdWFyZVNwbGl0VmVydGljYWwsCiAgU3F1YXJlU3F1YXJlOiAoKSA9PiBTcXVhcmVTcXVhcmUsCiAgU3F1YXJlU3RhY2s6ICgpID0+IFNxdWFyZVN0YWNrLAogIFNxdWFyZVN0YXI6ICgpID0+IFNxdWFyZVN0YXIsCiAgU3F1YXJlU3RvcDogKCkgPT4gU3F1YXJlU3RvcCwKICBTcXVhcmVUZXJtaW5hbDogKCkgPT4gU3F1YXJlVGVybWluYWwsCiAgU3F1YXJlVXNlcjogKCkgPT4gU3F1YXJlVXNlciwKICBTcXVhcmVVc2VyUm91bmQ6ICgpID0+IFNxdWFyZVVzZXJSb3VuZCwKICBTcXVhcmVYOiAoKSA9PiBTcXVhcmVYLAogIFNxdWFyZXNFeGNsdWRlOiAoKSA9PiBTcXVhcmVzRXhjbHVkZSwKICBTcXVhcmVzSW50ZXJzZWN0OiAoKSA9PiBTcXVhcmVzSW50ZXJzZWN0LAogIFNxdWFyZXNTdWJ0cmFjdDogKCkgPT4gU3F1YXJlc1N1YnRyYWN0LAogIFNxdWFyZXNVbml0ZTogKCkgPT4gU3F1YXJlc1VuaXRlLAogIFNxdWlyY2xlOiAoKSA9PiBTcXVpcmNsZSwKICBTcXVpcmNsZURhc2hlZDogKCkgPT4gU3F1aXJjbGVEYXNoZWQsCiAgU3F1aXJyZWw6ICgpID0+IFNxdWlycmVsLAogIFN0YW1wOiAoKSA9PiBTdGFtcCwKICBTdGFyOiAoKSA9PiBTdGFyLAogIFN0YXJIYWxmOiAoKSA9PiBTdGFySGFsZiwKICBTdGFyT2ZmOiAoKSA9PiBTdGFyT2ZmLAogIFN0YXJzOiAoKSA9PiBTcGFya2xlcywKICBTdGVwQmFjazogKCkgPT4gU3RlcEJhY2ssCiAgU3RlcEZvcndhcmQ6ICgpID0+IFN0ZXBGb3J3YXJkLAogIFN0ZXRob3Njb3BlOiAoKSA9PiBTdGV0aG9zY29wZSwKICBTdGlja2VyOiAoKSA9PiBTdGlja2VyLAogIFN0aWNreU5vdGU6ICgpID0+IFN0aWNreU5vdGUsCiAgU3RvbmU6ICgpID0+IFN0b25lLAogIFN0b3BDaXJjbGU6ICgpID0+IENpcmNsZVN0b3AsCiAgU3RvcmU6ICgpID0+IFN0b3JlLAogIFN0cmV0Y2hIb3Jpem9udGFsOiAoKSA9PiBTdHJldGNoSG9yaXpvbnRhbCwKICBTdHJldGNoVmVydGljYWw6ICgpID0+IFN0cmV0Y2hWZXJ0aWNhbCwKICBTdHJpa2V0aHJvdWdoOiAoKSA9PiBTdHJpa2V0aHJvdWdoLAogIFN1YnNjcmlwdDogKCkgPT4gU3Vic2NyaXB0LAogIFN1YnRpdGxlczogKCkgPT4gQ2FwdGlvbnMsCiAgU3VuOiAoKSA9PiBTdW4sCiAgU3VuRGltOiAoKSA9PiBTdW5EaW0sCiAgU3VuTWVkaXVtOiAoKSA9PiBTdW5NZWRpdW0sCiAgU3VuTW9vbjogKCkgPT4gU3VuTW9vbiwKICBTdW5Tbm93OiAoKSA9PiBTdW5Tbm93LAogIFN1bnJpc2U6ICgpID0+IFN1bnJpc2UsCiAgU3Vuc2V0OiAoKSA9PiBTdW5zZXQsCiAgU3VwZXJzY3JpcHQ6ICgpID0+IFN1cGVyc2NyaXB0LAogIFN3YXRjaEJvb2s6ICgpID0+IFN3YXRjaEJvb2ssCiAgU3dpc3NGcmFuYzogKCkgPT4gU3dpc3NGcmFuYywKICBTd2l0Y2hDYW1lcmE6ICgpID0+IFN3aXRjaENhbWVyYSwKICBTd29yZDogKCkgPT4gU3dvcmQsCiAgU3dvcmRzOiAoKSA9PiBTd29yZHMsCiAgU3lyaW5nZTogKCkgPT4gU3lyaW5nZSwKICBUYWJsZTogKCkgPT4gVGFibGUsCiAgVGFibGUyOiAoKSA9PiBUYWJsZTIsCiAgVGFibGVDZWxsc01lcmdlOiAoKSA9PiBUYWJsZUNlbGxzTWVyZ2UsCiAgVGFibGVDZWxsc1NwbGl0OiAoKSA9PiBUYWJsZUNlbGxzU3BsaXQsCiAgVGFibGVDb2x1bW5zU3BsaXQ6ICgpID0+IFRhYmxlQ29sdW1uc1NwbGl0LAogIFRhYmxlQ29uZmlnOiAoKSA9PiBDb2x1bW5zM0NvZywKICBUYWJsZU9mQ29udGVudHM6ICgpID0+IFRhYmxlT2ZDb250ZW50cywKICBUYWJsZVByb3BlcnRpZXM6ICgpID0+IFRhYmxlUHJvcGVydGllcywKICBUYWJsZVJvd3NTcGxpdDogKCkgPT4gVGFibGVSb3dzU3BsaXQsCiAgVGFibGV0OiAoKSA9PiBUYWJsZXQsCiAgVGFibGV0U21hcnRwaG9uZTogKCkgPT4gVGFibGV0U21hcnRwaG9uZSwKICBUYWJsZXRzOiAoKSA9PiBUYWJsZXRzLAogIFRhZzogKCkgPT4gVGFnMiwKICBUYWdzOiAoKSA9PiBUYWdzLAogIFRhbGx5MTogKCkgPT4gVGFsbHkxLAogIFRhbGx5MjogKCkgPT4gVGFsbHkyLAogIFRhbGx5MzogKCkgPT4gVGFsbHkzLAogIFRhbGx5NDogKCkgPT4gVGFsbHk0LAogIFRhbGx5NTogKCkgPT4gVGFsbHk1LAogIFRhbmdlbnQ6ICgpID0+IFRhbmdlbnQsCiAgVGFyZ2V0OiAoKSA9PiBUYXJnZXQsCiAgVGVsZXNjb3BlOiAoKSA9PiBUZWxlc2NvcGUsCiAgVGVudDogKCkgPT4gVGVudCwKICBUZW50VHJlZTogKCkgPT4gVGVudFRyZWUsCiAgVGVybWluYWw6ICgpID0+IFRlcm1pbmFsLAogIFRlcm1pbmFsU3F1YXJlOiAoKSA9PiBTcXVhcmVUZXJtaW5hbCwKICBUZXN0VHViZTogKCkgPT4gVGVzdFR1YmUsCiAgVGVzdFR1YmUyOiAoKSA9PiBUZXN0VHViZURpYWdvbmFsLAogIFRlc3RUdWJlRGlhZ29uYWw6ICgpID0+IFRlc3RUdWJlRGlhZ29uYWwsCiAgVGVzdFR1YmVzOiAoKSA9PiBUZXN0VHViZXMsCiAgVGV4dDogKCkgPT4gVGV4dEFsaWduU3RhcnQsCiAgVGV4dEFsaWduQ2VudGVyOiAoKSA9PiBUZXh0QWxpZ25DZW50ZXIsCiAgVGV4dEFsaWduRW5kOiAoKSA9PiBUZXh0QWxpZ25FbmQsCiAgVGV4dEFsaWduSnVzdGlmeTogKCkgPT4gVGV4dEFsaWduSnVzdGlmeSwKICBUZXh0QWxpZ25TdGFydDogKCkgPT4gVGV4dEFsaWduU3RhcnQsCiAgVGV4dEN1cnNvcjogKCkgPT4gVGV4dEN1cnNvciwKICBUZXh0Q3Vyc29ySW5wdXQ6ICgpID0+IFRleHRDdXJzb3JJbnB1dCwKICBUZXh0SW5pdGlhbDogKCkgPT4gVGV4dEluaXRpYWwsCiAgVGV4dFF1b3RlOiAoKSA9PiBUZXh0UXVvdGUsCiAgVGV4dFNlYXJjaDogKCkgPT4gVGV4dFNlYXJjaCwKICBUZXh0U2VsZWN0OiAoKSA9PiBUZXh0U2VsZWN0LAogIFRleHRTZWxlY3Rpb246ICgpID0+IFRleHRTZWxlY3QsCiAgVGV4dFdyYXA6ICgpID0+IFRleHRXcmFwLAogIFRoZWF0ZXI6ICgpID0+IFRoZWF0ZXIsCiAgVGhlcm1vbWV0ZXI6ICgpID0+IFRoZXJtb21ldGVyLAogIFRoZXJtb21ldGVyU25vd2ZsYWtlOiAoKSA9PiBUaGVybW9tZXRlclNub3dmbGFrZSwKICBUaGVybW9tZXRlclN1bjogKCkgPT4gVGhlcm1vbWV0ZXJTdW4sCiAgVGh1bWJzRG93bjogKCkgPT4gVGh1bWJzRG93biwKICBUaHVtYnNVcDogKCkgPT4gVGh1bWJzVXAsCiAgVGlja2V0OiAoKSA9PiBUaWNrZXQsCiAgVGlja2V0Q2hlY2s6ICgpID0+IFRpY2tldENoZWNrLAogIFRpY2tldE1pbnVzOiAoKSA9PiBUaWNrZXRNaW51cywKICBUaWNrZXRQZXJjZW50OiAoKSA9PiBUaWNrZXRQZXJjZW50LAogIFRpY2tldFBsdXM6ICgpID0+IFRpY2tldFBsdXMsCiAgVGlja2V0U2xhc2g6ICgpID0+IFRpY2tldFNsYXNoLAogIFRpY2tldFg6ICgpID0+IFRpY2tldFgsCiAgVGlja2V0czogKCkgPT4gVGlja2V0cywKICBUaWNrZXRzUGxhbmU6ICgpID0+IFRpY2tldHNQbGFuZSwKICBUaW1lcjogKCkgPT4gVGltZXIzLAogIFRpbWVyT2ZmOiAoKSA9PiBUaW1lck9mZiwKICBUaW1lclJlc2V0OiAoKSA9PiBUaW1lclJlc2V0LAogIFRvZ2dsZUxlZnQ6ICgpID0+IFRvZ2dsZUxlZnQsCiAgVG9nZ2xlUmlnaHQ6ICgpID0+IFRvZ2dsZVJpZ2h0LAogIFRvaWxldDogKCkgPT4gVG9pbGV0LAogIFRvb2xDYXNlOiAoKSA9PiBUb29sQ2FzZSwKICBUb29sYm94OiAoKSA9PiBUb29sYm94LAogIFRvcm5hZG86ICgpID0+IFRvcm5hZG8sCiAgVG9ydXM6ICgpID0+IFRvcnVzLAogIFRvdWNocGFkOiAoKSA9PiBUb3VjaHBhZCwKICBUb3VjaHBhZE9mZjogKCkgPT4gVG91Y2hwYWRPZmYsCiAgVG93ZWxSYWNrOiAoKSA9PiBUb3dlbFJhY2ssCiAgVG93ZXJDb250cm9sOiAoKSA9PiBUb3dlckNvbnRyb2wsCiAgVG95QnJpY2s6ICgpID0+IFRveUJyaWNrLAogIFRyYWN0b3I6ICgpID0+IFRyYWN0b3IsCiAgVHJhZmZpY0NvbmU6ICgpID0+IFRyYWZmaWNDb25lLAogIFRyYWluOiAoKSA9PiBUcmFtRnJvbnQsCiAgVHJhaW5Gcm9udDogKCkgPT4gVHJhaW5Gcm9udCwKICBUcmFpbkZyb250VHVubmVsOiAoKSA9PiBUcmFpbkZyb250VHVubmVsLAogIFRyYWluVHJhY2s6ICgpID0+IFRyYWluVHJhY2ssCiAgVHJhbUZyb250OiAoKSA9PiBUcmFtRnJvbnQsCiAgVHJhbnNnZW5kZXI6ICgpID0+IFRyYW5zZ2VuZGVyLAogIFRyYXNoOiAoKSA9PiBUcmFzaCwKICBUcmFzaDI6ICgpID0+IFRyYXNoMiwKICBUcmVlRGVjaWR1b3VzOiAoKSA9PiBUcmVlRGVjaWR1b3VzLAogIFRyZWVQYWxtOiAoKSA9PiBUcmVlUGFsbSwKICBUcmVlUGluZTogKCkgPT4gVHJlZVBpbmUsCiAgVHJlZXM6ICgpID0+IFRyZWVzLAogIFRyZWxsbzogKCkgPT4gVHJlbGxvLAogIFRyZW5kaW5nRG93bjogKCkgPT4gVHJlbmRpbmdEb3duLAogIFRyZW5kaW5nVXA6ICgpID0+IFRyZW5kaW5nVXAsCiAgVHJlbmRpbmdVcERvd246ICgpID0+IFRyZW5kaW5nVXBEb3duLAogIFRyaWFuZ2xlOiAoKSA9PiBUcmlhbmdsZSwKICBUcmlhbmdsZUFsZXJ0OiAoKSA9PiBUcmlhbmdsZUFsZXJ0LAogIFRyaWFuZ2xlRGFzaGVkOiAoKSA9PiBUcmlhbmdsZURhc2hlZCwKICBUcmlhbmdsZVJpZ2h0OiAoKSA9PiBUcmlhbmdsZVJpZ2h0LAogIFRyb3BoeTogKCkgPT4gVHJvcGh5LAogIFRydWNrOiAoKSA9PiBUcnVjaywKICBUcnVja0VsZWN0cmljOiAoKSA9PiBUcnVja0VsZWN0cmljLAogIFR1cmtpc2hMaXJhOiAoKSA9PiBUdXJraXNoTGlyYSwKICBUdXJudGFibGU6ICgpID0+IFR1cm50YWJsZSwKICBUdXJ0bGU6ICgpID0+IFR1cnRsZSwKICBUdjogKCkgPT4gVHYsCiAgVHYyOiAoKSA9PiBUdk1pbmltYWwsCiAgVHZNaW5pbWFsOiAoKSA9PiBUdk1pbmltYWwsCiAgVHZNaW5pbWFsUGxheTogKCkgPT4gVHZNaW5pbWFsUGxheSwKICBUd2l0Y2g6ICgpID0+IFR3aXRjaCwKICBUd2l0dGVyOiAoKSA9PiBUd2l0dGVyLAogIFR5cGU6ICgpID0+IFR5cGUsCiAgVHlwZU91dGxpbmU6ICgpID0+IFR5cGVPdXRsaW5lLAogIFVtYnJlbGxhOiAoKSA9PiBVbWJyZWxsYSwKICBVbWJyZWxsYU9mZjogKCkgPT4gVW1icmVsbGFPZmYsCiAgVW5kZXJsaW5lOiAoKSA9PiBVbmRlcmxpbmUsCiAgVW5kbzogKCkgPT4gVW5kbywKICBVbmRvMjogKCkgPT4gVW5kbzIsCiAgVW5kb0RvdDogKCkgPT4gVW5kb0RvdCwKICBVbmZvbGRIb3Jpem9udGFsOiAoKSA9PiBVbmZvbGRIb3Jpem9udGFsLAogIFVuZm9sZFZlcnRpY2FsOiAoKSA9PiBVbmZvbGRWZXJ0aWNhbCwKICBVbmdyb3VwOiAoKSA9PiBVbmdyb3VwLAogIFVuaXZlcnNpdHk6ICgpID0+IFVuaXZlcnNpdHksCiAgVW5saW5rOiAoKSA9PiBVbmxpbmssCiAgVW5saW5rMjogKCkgPT4gVW5saW5rMiwKICBVbmxvY2s6ICgpID0+IExvY2tPcGVuLAogIFVubG9ja0tleWhvbGU6ICgpID0+IExvY2tLZXlob2xlT3BlbiwKICBVbnBsdWc6ICgpID0+IFVucGx1ZywKICBVcGxvYWQ6ICgpID0+IFVwbG9hZCwKICBVcGxvYWRDbG91ZDogKCkgPT4gQ2xvdWRVcGxvYWQsCiAgVXNiOiAoKSA9PiBVc2IsCiAgVXNlcjogKCkgPT4gVXNlciwKICBVc2VyMjogKCkgPT4gVXNlclJvdW5kLAogIFVzZXJDaGVjazogKCkgPT4gVXNlckNoZWNrLAogIFVzZXJDaGVjazI6ICgpID0+IFVzZXJSb3VuZENoZWNrLAogIFVzZXJDaXJjbGU6ICgpID0+IENpcmNsZVVzZXIsCiAgVXNlckNpcmNsZTI6ICgpID0+IENpcmNsZVVzZXJSb3VuZCwKICBVc2VyQ29nOiAoKSA9PiBVc2VyQ29nLAogIFVzZXJDb2cyOiAoKSA9PiBVc2VyUm91bmRDb2csCiAgVXNlcktleTogKCkgPT4gVXNlcktleSwKICBVc2VyTG9jazogKCkgPT4gVXNlckxvY2ssCiAgVXNlck1pbnVzOiAoKSA9PiBVc2VyTWludXMsCiAgVXNlck1pbnVzMjogKCkgPT4gVXNlclJvdW5kTWludXMsCiAgVXNlclBlbjogKCkgPT4gVXNlclBlbiwKICBVc2VyUGx1czogKCkgPT4gVXNlclBsdXMsCiAgVXNlclBsdXMyOiAoKSA9PiBVc2VyUm91bmRQbHVzLAogIFVzZXJSb3VuZDogKCkgPT4gVXNlclJvdW5kLAogIFVzZXJSb3VuZENoZWNrOiAoKSA9PiBVc2VyUm91bmRDaGVjaywKICBVc2VyUm91bmRDb2c6ICgpID0+IFVzZXJSb3VuZENvZywKICBVc2VyUm91bmRLZXk6ICgpID0+IFVzZXJSb3VuZEtleSwKICBVc2VyUm91bmRNaW51czogKCkgPT4gVXNlclJvdW5kTWludXMsCiAgVXNlclJvdW5kUGVuOiAoKSA9PiBVc2VyUm91bmRQZW4sCiAgVXNlclJvdW5kUGx1czogKCkgPT4gVXNlclJvdW5kUGx1cywKICBVc2VyUm91bmRTZWFyY2g6ICgpID0+IFVzZXJSb3VuZFNlYXJjaCwKICBVc2VyUm91bmRYOiAoKSA9PiBVc2VyUm91bmRYLAogIFVzZXJTZWFyY2g6ICgpID0+IFVzZXJTZWFyY2gsCiAgVXNlclNxdWFyZTogKCkgPT4gU3F1YXJlVXNlciwKICBVc2VyU3F1YXJlMjogKCkgPT4gU3F1YXJlVXNlclJvdW5kLAogIFVzZXJTdGFyOiAoKSA9PiBVc2VyU3RhciwKICBVc2VyWDogKCkgPT4gVXNlclgsCiAgVXNlclgyOiAoKSA9PiBVc2VyUm91bmRYLAogIFVzZXJzOiAoKSA9PiBVc2VycywKICBVc2VyczI6ICgpID0+IFVzZXJzUm91bmQsCiAgVXNlcnNSb3VuZDogKCkgPT4gVXNlcnNSb3VuZCwKICBVdGVuc2lsczogKCkgPT4gVXRlbnNpbHMsCiAgVXRlbnNpbHNDcm9zc2VkOiAoKSA9PiBVdGVuc2lsc0Nyb3NzZWQsCiAgVXRpbGl0eVBvbGU6ICgpID0+IFV0aWxpdHlQb2xlLAogIFZhbjogKCkgPT4gVmFuLAogIFZhcmlhYmxlOiAoKSA9PiBWYXJpYWJsZSwKICBWYXVsdDogKCkgPT4gVmF1bHQsCiAgVmVjdG9yU3F1YXJlOiAoKSA9PiBWZWN0b3JTcXVhcmUsCiAgVmVnYW46ICgpID0+IFZlZ2FuLAogIFZlbmV0aWFuTWFzazogKCkgPT4gVmVuZXRpYW5NYXNrLAogIFZlbnVzOiAoKSA9PiBWZW51cywKICBWZW51c0FuZE1hcnM6ICgpID0+IFZlbnVzQW5kTWFycywKICBWZXJpZmllZDogKCkgPT4gQmFkZ2VDaGVjaywKICBWaWJyYXRlOiAoKSA9PiBWaWJyYXRlLAogIFZpYnJhdGVPZmY6ICgpID0+IFZpYnJhdGVPZmYsCiAgVmlkZW86ICgpID0+IFZpZGVvLAogIFZpZGVvT2ZmOiAoKSA9PiBWaWRlb09mZiwKICBWaWRlb3RhcGU6ICgpID0+IFZpZGVvdGFwZSwKICBWaWV3OiAoKSA9PiBWaWV3LAogIFZvaWNlbWFpbDogKCkgPT4gVm9pY2VtYWlsLAogIFZvbGxleWJhbGw6ICgpID0+IFZvbGxleWJhbGwsCiAgVm9sdW1lOiAoKSA9PiBWb2x1bWUsCiAgVm9sdW1lMTogKCkgPT4gVm9sdW1lMSwKICBWb2x1bWUyOiAoKSA9PiBWb2x1bWUyLAogIFZvbHVtZU9mZjogKCkgPT4gVm9sdW1lT2ZmLAogIFZvbHVtZVg6ICgpID0+IFZvbHVtZVgsCiAgVm90ZTogKCkgPT4gVm90ZSwKICBXYWxsZXQ6ICgpID0+IFdhbGxldCwKICBXYWxsZXQyOiAoKSA9PiBXYWxsZXRNaW5pbWFsLAogIFdhbGxldENhcmRzOiAoKSA9PiBXYWxsZXRDYXJkcywKICBXYWxsZXRNaW5pbWFsOiAoKSA9PiBXYWxsZXRNaW5pbWFsLAogIFdhbGxwYXBlcjogKCkgPT4gV2FsbHBhcGVyLAogIFdhbmQ6ICgpID0+IFdhbmQsCiAgV2FuZDI6ICgpID0+IFdhbmRTcGFya2xlcywKICBXYW5kU3BhcmtsZXM6ICgpID0+IFdhbmRTcGFya2xlcywKICBXYXJlaG91c2U6ICgpID0+IFdhcmVob3VzZSwKICBXYXNoaW5nTWFjaGluZTogKCkgPT4gV2FzaGluZ01hY2hpbmUsCiAgV2F0Y2g6ICgpID0+IFdhdGNoLAogIFdhdmVzOiAoKSA9PiBXYXZlcywKICBXYXZlc0Fycm93RG93bjogKCkgPT4gV2F2ZXNBcnJvd0Rvd24sCiAgV2F2ZXNBcnJvd1VwOiAoKSA9PiBXYXZlc0Fycm93VXAsCiAgV2F2ZXNMYWRkZXI6ICgpID0+IFdhdmVzTGFkZGVyLAogIFdheXBvaW50czogKCkgPT4gV2F5cG9pbnRzLAogIFdlYmNhbTogKCkgPT4gV2ViY2FtLAogIFdlYmhvb2s6ICgpID0+IFdlYmhvb2ssCiAgV2ViaG9va09mZjogKCkgPT4gV2ViaG9va09mZiwKICBXZWlnaHQ6ICgpID0+IFdlaWdodCwKICBXZWlnaHRUaWxkZTogKCkgPT4gV2VpZ2h0VGlsZGUsCiAgV2hlYXQ6ICgpID0+IFdoZWF0LAogIFdoZWF0T2ZmOiAoKSA9PiBXaGVhdE9mZiwKICBXaG9sZVdvcmQ6ICgpID0+IFdob2xlV29yZCwKICBXaWZpOiAoKSA9PiBXaWZpLAogIFdpZmlDb2c6ICgpID0+IFdpZmlDb2csCiAgV2lmaUhpZ2g6ICgpID0+IFdpZmlIaWdoLAogIFdpZmlMb3c6ICgpID0+IFdpZmlMb3csCiAgV2lmaU9mZjogKCkgPT4gV2lmaU9mZiwKICBXaWZpUGVuOiAoKSA9PiBXaWZpUGVuLAogIFdpZmlTeW5jOiAoKSA9PiBXaWZpU3luYywKICBXaWZpWmVybzogKCkgPT4gV2lmaVplcm8sCiAgV2luZDogKCkgPT4gV2luZCwKICBXaW5kQXJyb3dEb3duOiAoKSA9PiBXaW5kQXJyb3dEb3duLAogIFdpbmU6ICgpID0+IFdpbmUsCiAgV2luZU9mZjogKCkgPT4gV2luZU9mZiwKICBXb3JrZmxvdzogKCkgPT4gV29ya2Zsb3csCiAgV29ybTogKCkgPT4gV29ybSwKICBXcmFwVGV4dDogKCkgPT4gVGV4dFdyYXAsCiAgV3JlbmNoOiAoKSA9PiBXcmVuY2gsCiAgWDogKCkgPT4gWDIsCiAgWENpcmNsZTogKCkgPT4gQ2lyY2xlWCwKICBYTGluZVRvcDogKCkgPT4gWExpbmVUb3AsCiAgWE9jdGFnb246ICgpID0+IE9jdGFnb25YLAogIFhTcXVhcmU6ICgpID0+IFNxdWFyZVgsCiAgWW91dHViZTogKCkgPT4gWW91dHViZSwKICBaYXA6ICgpID0+IFphcCwKICBaYXBPZmY6ICgpID0+IFphcE9mZiwKICBab2RpYWNBcXVhcml1czogKCkgPT4gWm9kaWFjQXF1YXJpdXMsCiAgWm9kaWFjQXJpZXM6ICgpID0+IFpvZGlhY0FyaWVzLAogIFpvZGlhY0NhbmNlcjogKCkgPT4gWm9kaWFjQ2FuY2VyLAogIFpvZGlhY0NhcHJpY29ybjogKCkgPT4gWm9kaWFjQ2Fwcmljb3JuLAogIFpvZGlhY0dlbWluaTogKCkgPT4gWm9kaWFjR2VtaW5pLAogIFpvZGlhY0xlbzogKCkgPT4gWm9kaWFjTGVvLAogIFpvZGlhY0xpYnJhOiAoKSA9PiBab2RpYWNMaWJyYSwKICBab2RpYWNPcGhpdWNodXM6ICgpID0+IFpvZGlhY09waGl1Y2h1cywKICBab2RpYWNQaXNjZXM6ICgpID0+IFpvZGlhY1Bpc2NlcywKICBab2RpYWNTYWdpdHRhcml1czogKCkgPT4gWm9kaWFjU2FnaXR0YXJpdXMsCiAgWm9kaWFjU2NvcnBpbzogKCkgPT4gWm9kaWFjU2NvcnBpbywKICBab2RpYWNUYXVydXM6ICgpID0+IFpvZGlhY1RhdXJ1cywKICBab2RpYWNWaXJnbzogKCkgPT4gWm9kaWFjVmlyZ28sCiAgWm9vbUluOiAoKSA9PiBab29tSW4sCiAgWm9vbU91dDogKCkgPT4gWm9vbU91dAp9KTsKdmFyIGluaXRfaWNvbnNBbmRBbGlhc2VzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vbHVjaWRlQDAuNTc3LjAvbm9kZV9tb2R1bGVzL2x1Y2lkZS9kaXN0L2VzbS9pY29uc0FuZEFsaWFzZXMuanMiKCkgewogICAgaW5pdF9hX2Fycm93X2Rvd24oKTsKICAgIGluaXRfYV9hcnJvd191cCgpOwogICAgaW5pdF9hX2xhcmdlX3NtYWxsKCk7CiAgICBpbml0X2FjY2Vzc2liaWxpdHkoKTsKICAgIGluaXRfYWN0aXZpdHkoKTsKICAgIGluaXRfYWlyX3ZlbnQoKTsKICAgIGluaXRfYWlycGxheSgpOwogICAgaW5pdF9hbGFybV9jbG9ja19taW51cygpOwogICAgaW5pdF9hbGFybV9jbG9ja19jaGVjaygpOwogICAgaW5pdF9hbGFybV9jbG9ja19vZmYoKTsKICAgIGluaXRfYWxhcm1fY2xvY2soKTsKICAgIGluaXRfYWxhcm1fY2xvY2tfcGx1cygpOwogICAgaW5pdF9hbGFybV9zbW9rZSgpOwogICAgaW5pdF9hbGJ1bSgpOwogICAgaW5pdF9hbGlnbl9jZW50ZXJfaG9yaXpvbnRhbCgpOwogICAgaW5pdF9hbGlnbl9jZW50ZXJfdmVydGljYWwoKTsKICAgIGluaXRfYWxpZ25fZW5kX2hvcml6b250YWwoKTsKICAgIGluaXRfYWxpZ25fZW5kX3ZlcnRpY2FsKCk7CiAgICBpbml0X2FsaWduX2hvcml6b250YWxfZGlzdHJpYnV0ZV9jZW50ZXIoKTsKICAgIGluaXRfYWxpZ25faG9yaXpvbnRhbF9kaXN0cmlidXRlX2VuZCgpOwogICAgaW5pdF9hbGlnbl9ob3Jpem9udGFsX2Rpc3RyaWJ1dGVfc3RhcnQoKTsKICAgIGluaXRfYWxpZ25faG9yaXpvbnRhbF9qdXN0aWZ5X2NlbnRlcigpOwogICAgaW5pdF9hbGlnbl9ob3Jpem9udGFsX2p1c3RpZnlfZW5kKCk7CiAgICBpbml0X2FsaWduX2hvcml6b250YWxfanVzdGlmeV9zdGFydCgpOwogICAgaW5pdF9hbGlnbl9ob3Jpem9udGFsX3NwYWNlX2Fyb3VuZCgpOwogICAgaW5pdF9hbGlnbl9ob3Jpem9udGFsX3NwYWNlX2JldHdlZW4oKTsKICAgIGluaXRfYWxpZ25fc3RhcnRfaG9yaXpvbnRhbCgpOwogICAgaW5pdF9hbGlnbl9zdGFydF92ZXJ0aWNhbCgpOwogICAgaW5pdF9hbGlnbl92ZXJ0aWNhbF9kaXN0cmlidXRlX2NlbnRlcigpOwogICAgaW5pdF9hbGlnbl92ZXJ0aWNhbF9kaXN0cmlidXRlX2VuZCgpOwogICAgaW5pdF9hbGlnbl92ZXJ0aWNhbF9kaXN0cmlidXRlX3N0YXJ0KCk7CiAgICBpbml0X2FsaWduX3ZlcnRpY2FsX2p1c3RpZnlfY2VudGVyKCk7CiAgICBpbml0X2FsaWduX3ZlcnRpY2FsX2p1c3RpZnlfZW5kKCk7CiAgICBpbml0X2FsaWduX3ZlcnRpY2FsX2p1c3RpZnlfc3RhcnQoKTsKICAgIGluaXRfYWxpZ25fdmVydGljYWxfc3BhY2VfYXJvdW5kKCk7CiAgICBpbml0X2FsaWduX3ZlcnRpY2FsX3NwYWNlX2JldHdlZW4oKTsKICAgIGluaXRfYW1wZXJzYW5kKCk7CiAgICBpbml0X2FtYnVsYW5jZSgpOwogICAgaW5pdF9hbXBlcnNhbmRzKCk7CiAgICBpbml0X2FtcGhvcmEoKTsKICAgIGluaXRfYW5jaG9yKCk7CiAgICBpbml0X2FuZ3J5KCk7CiAgICBpbml0X2Fubm95ZWQoKTsKICAgIGluaXRfYW50ZW5uYSgpOwogICAgaW5pdF9hbnZpbCgpOwogICAgaW5pdF9hcGVydHVyZSgpOwogICAgaW5pdF9hcHBfd2luZG93X21hYygpOwogICAgaW5pdF9hcHBfd2luZG93KCk7CiAgICBpbml0X2FwcGxlKCk7CiAgICBpbml0X2FyY2hpdmVfcmVzdG9yZSgpOwogICAgaW5pdF9hcmNoaXZlX3goKTsKICAgIGluaXRfYXJjaGl2ZSgpOwogICAgaW5pdF9hcm1jaGFpcigpOwogICAgaW5pdF9hcnJvd19iaWdfZG93bl9kYXNoKCk7CiAgICBpbml0X2Fycm93X2JpZ19kb3duKCk7CiAgICBpbml0X2Fycm93X2JpZ19sZWZ0X2Rhc2goKTsKICAgIGluaXRfYXJyb3dfYmlnX2xlZnQoKTsKICAgIGluaXRfYXJyb3dfYmlnX3JpZ2h0X2Rhc2goKTsKICAgIGluaXRfYXJyb3dfYmlnX3JpZ2h0KCk7CiAgICBpbml0X2Fycm93X2JpZ191cF9kYXNoKCk7CiAgICBpbml0X2Fycm93X2Rvd25fMF8xKCk7CiAgICBpbml0X2Fycm93X2JpZ191cCgpOwogICAgaW5pdF9hcnJvd19kb3duXzFfMCgpOwogICAgaW5pdF9hcnJvd19kb3duX2FfeigpOwogICAgaW5pdF9hcnJvd19kb3duX2Zyb21fbGluZSgpOwogICAgaW5pdF9hcnJvd19kb3duX2xlZnQoKTsKICAgIGluaXRfYXJyb3dfZG93bl9uYXJyb3dfd2lkZSgpOwogICAgaW5pdF9hcnJvd19kb3duX3JpZ2h0KCk7CiAgICBpbml0X2Fycm93X2Rvd25fdG9fZG90KCk7CiAgICBpbml0X2Fycm93X2Rvd25fdG9fbGluZSgpOwogICAgaW5pdF9hcnJvd19kb3duX3VwKCk7CiAgICBpbml0X2Fycm93X2Rvd25fd2lkZV9uYXJyb3coKTsKICAgIGluaXRfYXJyb3dfZG93bl96X2EoKTsKICAgIGluaXRfYXJyb3dfZG93bigpOwogICAgaW5pdF9hcnJvd19sZWZ0X2Zyb21fbGluZSgpOwogICAgaW5pdF9hcnJvd19sZWZ0X3JpZ2h0KCk7CiAgICBpbml0X2Fycm93X2xlZnRfdG9fbGluZSgpOwogICAgaW5pdF9hcnJvd19sZWZ0KCk7CiAgICBpbml0X2Fycm93X3JpZ2h0X2Zyb21fbGluZSgpOwogICAgaW5pdF9hcnJvd19yaWdodF9sZWZ0KCk7CiAgICBpbml0X2Fycm93X3JpZ2h0X3RvX2xpbmUoKTsKICAgIGluaXRfYXJyb3dfcmlnaHQoKTsKICAgIGluaXRfYXJyb3dfdXBfMF8xKCk7CiAgICBpbml0X2Fycm93X3VwXzFfMCgpOwogICAgaW5pdF9hcnJvd191cF9hX3ooKTsKICAgIGluaXRfYXJyb3dfdXBfZG93bigpOwogICAgaW5pdF9hcnJvd191cF9mcm9tX2RvdCgpOwogICAgaW5pdF9hcnJvd191cF9mcm9tX2xpbmUoKTsKICAgIGluaXRfYXJyb3dfdXBfbGVmdCgpOwogICAgaW5pdF9hcnJvd191cF9uYXJyb3dfd2lkZSgpOwogICAgaW5pdF9hcnJvd191cF9yaWdodCgpOwogICAgaW5pdF9hcnJvd191cF90b19saW5lKCk7CiAgICBpbml0X2Fycm93X3VwX3dpZGVfbmFycm93KCk7CiAgICBpbml0X2Fycm93X3VwX3pfYSgpOwogICAgaW5pdF9hcnJvd191cCgpOwogICAgaW5pdF9hcnJvd3NfdXBfZnJvbV9saW5lKCk7CiAgICBpbml0X2F0X3NpZ24oKTsKICAgIGluaXRfYXN0ZXJpc2soKTsKICAgIGluaXRfYXRvbSgpOwogICAgaW5pdF9hdWRpb19saW5lcygpOwogICAgaW5pdF9hdWRpb193YXZlZm9ybSgpOwogICAgaW5pdF9hd2FyZCgpOwogICAgaW5pdF9heGUoKTsKICAgIGluaXRfYXhpc18zZCgpOwogICAgaW5pdF9iYWJ5KCk7CiAgICBpbml0X2JhY2twYWNrKCk7CiAgICBpbml0X2JhZGdlX2FsZXJ0KCk7CiAgICBpbml0X2JhZGdlX2NlbnQoKTsKICAgIGluaXRfYmFkZ2VfY2hlY2soKTsKICAgIGluaXRfYmFkZ2VfZXVybygpOwogICAgaW5pdF9iYWRnZV9kb2xsYXJfc2lnbigpOwogICAgaW5pdF9iYWRnZV9pbmRpYW5fcnVwZWUoKTsKICAgIGluaXRfYmFkZ2VfaW5mbygpOwogICAgaW5pdF9iYWRnZV9qYXBhbmVzZV95ZW4oKTsKICAgIGluaXRfYmFkZ2VfbWludXMoKTsKICAgIGluaXRfYmFkZ2VfcGVyY2VudCgpOwogICAgaW5pdF9iYWRnZV9wb3VuZF9zdGVybGluZygpOwogICAgaW5pdF9iYWRnZV9wbHVzKCk7CiAgICBpbml0X2JhZGdlX3F1ZXN0aW9uX21hcmsoKTsKICAgIGluaXRfYmFkZ2VfcnVzc2lhbl9ydWJsZSgpOwogICAgaW5pdF9iYWRnZV9zd2lzc19mcmFuYygpOwogICAgaW5pdF9iYWRnZV90dXJraXNoX2xpcmEoKTsKICAgIGluaXRfYmFkZ2VfeCgpOwogICAgaW5pdF9iYWRnZSgpOwogICAgaW5pdF9iYWdnYWdlX2NsYWltKCk7CiAgICBpbml0X2JhbGxvb24oKTsKICAgIGluaXRfYmFuKCk7CiAgICBpbml0X2JhbmFuYSgpOwogICAgaW5pdF9iYW5kYWdlKCk7CiAgICBpbml0X2Jhbmtub3RlX2Fycm93X2Rvd24oKTsKICAgIGluaXRfYmFua25vdGVfYXJyb3dfdXAoKTsKICAgIGluaXRfYmFua25vdGVfeCgpOwogICAgaW5pdF9iYW5rbm90ZSgpOwogICAgaW5pdF9iYXJjb2RlKCk7CiAgICBpbml0X2JhcnJlbCgpOwogICAgaW5pdF9iYXNlbGluZSgpOwogICAgaW5pdF9iYXRoKCk7CiAgICBpbml0X2JhdHRlcnlfY2hhcmdpbmcoKTsKICAgIGluaXRfYmF0dGVyeV9mdWxsKCk7CiAgICBpbml0X2JhdHRlcnlfbG93KCk7CiAgICBpbml0X2JhdHRlcnlfbWVkaXVtKCk7CiAgICBpbml0X2JhdHRlcnlfcGx1cygpOwogICAgaW5pdF9iYXR0ZXJ5X3dhcm5pbmcoKTsKICAgIGluaXRfYmF0dGVyeSgpOwogICAgaW5pdF9iZWFrZXIoKTsKICAgIGluaXRfYmVhbl9vZmYoKTsKICAgIGluaXRfYmVhbigpOwogICAgaW5pdF9iZWRfZG91YmxlKCk7CiAgICBpbml0X2JlZF9zaW5nbGUoKTsKICAgIGluaXRfYmVkKCk7CiAgICBpbml0X2JlZWYoKTsKICAgIGluaXRfYmVlcl9vZmYoKTsKICAgIGluaXRfYmVlcigpOwogICAgaW5pdF9iZWxsX2RvdCgpOwogICAgaW5pdF9iZWxsX29mZigpOwogICAgaW5pdF9iZWxsX2VsZWN0cmljKCk7CiAgICBpbml0X2JlbGxfbWludXMoKTsKICAgIGluaXRfYmVsbF9wbHVzKCk7CiAgICBpbml0X2JlbGxfcmluZygpOwogICAgaW5pdF9iZWxsKCk7CiAgICBpbml0X2JldHdlZW5faG9yaXpvbnRhbF9lbmQoKTsKICAgIGluaXRfYmV0d2Vlbl92ZXJ0aWNhbF9lbmQoKTsKICAgIGluaXRfYmV0d2Vlbl9ob3Jpem9udGFsX3N0YXJ0KCk7CiAgICBpbml0X2JldHdlZW5fdmVydGljYWxfc3RhcnQoKTsKICAgIGluaXRfYmlrZSgpOwogICAgaW5pdF9iaWNlcHNfZmxleGVkKCk7CiAgICBpbml0X2JpbmFyeSgpOwogICAgaW5pdF9iaW9oYXphcmQoKTsKICAgIGluaXRfYmlub2N1bGFycygpOwogICAgaW5pdF9iaXJkKCk7CiAgICBpbml0X2JpdGNvaW4oKTsKICAgIGluaXRfYmlyZGhvdXNlKCk7CiAgICBpbml0X2JsZW5kKCk7CiAgICBpbml0X2JsaW5kcygpOwogICAgaW5pdF9ibG9ja3MoKTsKICAgIGluaXRfYmx1ZXRvb3RoX2Nvbm5lY3RlZCgpOwogICAgaW5pdF9ibHVldG9vdGhfb2ZmKCk7CiAgICBpbml0X2JsdWV0b290aF9zZWFyY2hpbmcoKTsKICAgIGluaXRfYmx1ZXRvb3RoKCk7CiAgICBpbml0X2JvbGQoKTsKICAgIGluaXRfYm9sdCgpOwogICAgaW5pdF9ib21iKCk7CiAgICBpbml0X2JvbmUoKTsKICAgIGluaXRfYm9va19hKCk7CiAgICBpbml0X2Jvb2tfYWxlcnQoKTsKICAgIGluaXRfYm9va19hdWRpbygpOwogICAgaW5pdF9ib29rX2NoZWNrKCk7CiAgICBpbml0X2Jvb2tfZGFzaGVkKCk7CiAgICBpbml0X2Jvb2tfY29weSgpOwogICAgaW5pdF9ib29rX2Rvd24oKTsKICAgIGluaXRfYm9va19oZWFkcGhvbmVzKCk7CiAgICBpbml0X2Jvb2tfaGVhcnQoKTsKICAgIGluaXRfYm9va19pbWFnZSgpOwogICAgaW5pdF9ib29rX2tleSgpOwogICAgaW5pdF9ib29rX21hcmtlZCgpOwogICAgaW5pdF9ib29rX2xvY2soKTsKICAgIGluaXRfYm9va19taW51cygpOwogICAgaW5pdF9ib29rX29wZW5fY2hlY2soKTsKICAgIGluaXRfYm9va19vcGVuX3RleHQoKTsKICAgIGluaXRfYm9va19vcGVuKCk7CiAgICBpbml0X2Jvb2tfcGx1cygpOwogICAgaW5pdF9ib29rX3NlYXJjaCgpOwogICAgaW5pdF9ib29rX3RleHQoKTsKICAgIGluaXRfYm9va191cF8yKCk7CiAgICBpbml0X2Jvb2tfdHlwZSgpOwogICAgaW5pdF9ib29rX3VwKCk7CiAgICBpbml0X2Jvb2tfdXNlcigpOwogICAgaW5pdF9ib29rX3goKTsKICAgIGluaXRfYm9vaygpOwogICAgaW5pdF9ib29rbWFya19jaGVjaygpOwogICAgaW5pdF9ib29rbWFya19taW51cygpOwogICAgaW5pdF9ib29rbWFya19wbHVzKCk7CiAgICBpbml0X2Jvb2ttYXJrX3goKTsKICAgIGluaXRfYm9va21hcmsoKTsKICAgIGluaXRfYm9vbV9ib3goKTsKICAgIGluaXRfYm90X21lc3NhZ2Vfc3F1YXJlKCk7CiAgICBpbml0X2JvdF9vZmYoKTsKICAgIGluaXRfYm90KCk7CiAgICBpbml0X2Jvd19hcnJvdygpOwogICAgaW5pdF9ib3R0bGVfd2luZSgpOwogICAgaW5pdF9ib3goKTsKICAgIGluaXRfYm94ZXMoKTsKICAgIGluaXRfYnJhY2VzKCk7CiAgICBpbml0X2JyYWNrZXRzKCk7CiAgICBpbml0X2JyYWluX2NpcmN1aXQoKTsKICAgIGluaXRfYnJhaW4oKTsKICAgIGluaXRfYnJhaW5fY29nKCk7CiAgICBpbml0X2JyaWNrX3dhbGxfZmlyZSgpOwogICAgaW5pdF9icmlja193YWxsX3NoaWVsZCgpOwogICAgaW5pdF9icmlja193YWxsKCk7CiAgICBpbml0X2JyaWVmY2FzZV9idXNpbmVzcygpOwogICAgaW5pdF9icmllZmNhc2VfY29udmV5b3JfYmVsdCgpOwogICAgaW5pdF9icmllZmNhc2VfbWVkaWNhbCgpOwogICAgaW5pdF9icmllZmNhc2UoKTsKICAgIGluaXRfYnJpbmdfdG9fZnJvbnQoKTsKICAgIGluaXRfYnJ1c2hfY2xlYW5pbmcoKTsKICAgIGluaXRfYnJ1c2goKTsKICAgIGluaXRfYnVnX29mZigpOwogICAgaW5pdF9idWJibGVzKCk7CiAgICBpbml0X2J1Z19wbGF5KCk7CiAgICBpbml0X2J1ZygpOwogICAgaW5pdF9idWlsZGluZ18yKCk7CiAgICBpbml0X2J1aWxkaW5nKCk7CiAgICBpbml0X2J1c19mcm9udCgpOwogICAgaW5pdF9idXMoKTsKICAgIGluaXRfY2FibGVfY2FyKCk7CiAgICBpbml0X2NhYmxlKCk7CiAgICBpbml0X2Nha2Vfc2xpY2UoKTsKICAgIGluaXRfY2FrZSgpOwogICAgaW5pdF9jYWxjdWxhdG9yKCk7CiAgICBpbml0X2NhbGVuZGFyXzEoKTsKICAgIGluaXRfY2FsZW5kYXJfYXJyb3dfZG93bigpOwogICAgaW5pdF9jYWxlbmRhcl9hcnJvd191cCgpOwogICAgaW5pdF9jYWxlbmRhcl9jaGVja18yKCk7CiAgICBpbml0X2NhbGVuZGFyX2NoZWNrKCk7CiAgICBpbml0X2NhbGVuZGFyX2Nsb2NrKCk7CiAgICBpbml0X2NhbGVuZGFyX2NvZygpOwogICAgaW5pdF9jYWxlbmRhcl9kYXlzKCk7CiAgICBpbml0X2NhbGVuZGFyX2ZvbGQoKTsKICAgIGluaXRfY2FsZW5kYXJfaGVhcnQoKTsKICAgIGluaXRfY2FsZW5kYXJfbWludXNfMigpOwogICAgaW5pdF9jYWxlbmRhcl9taW51cygpOwogICAgaW5pdF9jYWxlbmRhcl9vZmYoKTsKICAgIGluaXRfY2FsZW5kYXJfcGx1c18yKCk7CiAgICBpbml0X2NhbGVuZGFyX3BsdXMoKTsKICAgIGluaXRfY2FsZW5kYXJfcmFuZ2UoKTsKICAgIGluaXRfY2FsZW5kYXJfc2VhcmNoKCk7CiAgICBpbml0X2NhbGVuZGFyX3N5bmMoKTsKICAgIGluaXRfY2FsZW5kYXJfeF8yKCk7CiAgICBpbml0X2NhbGVuZGFyX3goKTsKICAgIGluaXRfY2FsZW5kYXIoKTsKICAgIGluaXRfY2FsZW5kYXJzKCk7CiAgICBpbml0X2NhbWVyYV9vZmYoKTsKICAgIGluaXRfY2FtZXJhKCk7CiAgICBpbml0X2NhbmR5X2NhbmUoKTsKICAgIGluaXRfY2FuZHlfb2ZmKCk7CiAgICBpbml0X2Nhbm5hYmlzX29mZigpOwogICAgaW5pdF9jYW5uYWJpcygpOwogICAgaW5pdF9jYW5keSgpOwogICAgaW5pdF9jYXB0aW9uc19vZmYoKTsKICAgIGluaXRfY2FwdGlvbnMoKTsKICAgIGluaXRfY2FyX2Zyb250KCk7CiAgICBpbml0X2Nhcl90YXhpX2Zyb250KCk7CiAgICBpbml0X2NhcigpOwogICAgaW5pdF9jYXJhdmFuKCk7CiAgICBpbml0X2NhcnJvdCgpOwogICAgaW5pdF9jYXJkX3NpbSgpOwogICAgaW5pdF9jYXNlX2xvd2VyKCk7CiAgICBpbml0X2Nhc2Vfc2Vuc2l0aXZlKCk7CiAgICBpbml0X2Nhc2VfdXBwZXIoKTsKICAgIGluaXRfY2Fzc2V0dGVfdGFwZSgpOwogICAgaW5pdF9jYXN0KCk7CiAgICBpbml0X2NhdCgpOwogICAgaW5pdF9jYXN0bGUoKTsKICAgIGluaXRfY2N0digpOwogICAgaW5pdF9jaGFydF9hcmVhKCk7CiAgICBpbml0X2NoYXJ0X2Jhcl9iaWcoKTsKICAgIGluaXRfY2hhcnRfYmFyX2RlY3JlYXNpbmcoKTsKICAgIGluaXRfY2hhcnRfYmFyX2luY3JlYXNpbmcoKTsKICAgIGluaXRfY2hhcnRfYmFyX3N0YWNrZWQoKTsKICAgIGluaXRfY2hhcnRfYmFyKCk7CiAgICBpbml0X2NoYXJ0X2NhbmRsZXN0aWNrKCk7CiAgICBpbml0X2NoYXJ0X2NvbHVtbl9iaWcoKTsKICAgIGluaXRfY2hhcnRfY29sdW1uX2RlY3JlYXNpbmcoKTsKICAgIGluaXRfY2hhcnRfY29sdW1uX2luY3JlYXNpbmcoKTsKICAgIGluaXRfY2hhcnRfY29sdW1uKCk7CiAgICBpbml0X2NoYXJ0X2NvbHVtbl9zdGFja2VkKCk7CiAgICBpbml0X2NoYXJ0X2dhbnR0KCk7CiAgICBpbml0X2NoYXJ0X2xpbmUoKTsKICAgIGluaXRfY2hhcnRfbmV0d29yaygpOwogICAgaW5pdF9jaGFydF9ub19heGVzX2NvbHVtbl9kZWNyZWFzaW5nKCk7CiAgICBpbml0X2NoYXJ0X25vX2F4ZXNfY29sdW1uX2luY3JlYXNpbmcoKTsKICAgIGluaXRfY2hhcnRfbm9fYXhlc19jb2x1bW4oKTsKICAgIGluaXRfY2hhcnRfbm9fYXhlc19jb21iaW5lZCgpOwogICAgaW5pdF9jaGFydF9ub19heGVzX2dhbnR0KCk7CiAgICBpbml0X2NoYXJ0X3BpZSgpOwogICAgaW5pdF9jaGFydF9zcGxpbmUoKTsKICAgIGluaXRfY2hhcnRfc2NhdHRlcigpOwogICAgaW5pdF9jaGVja19jaGVjaygpOwogICAgaW5pdF9jaGVja19saW5lKCk7CiAgICBpbml0X2NoZWNrKCk7CiAgICBpbml0X2NoZWZfaGF0KCk7CiAgICBpbml0X2NoZXJyeSgpOwogICAgaW5pdF9jaGVzc19raW5nKCk7CiAgICBpbml0X2NoZXNzX2Jpc2hvcCgpOwogICAgaW5pdF9jaGVzc19rbmlnaHQoKTsKICAgIGluaXRfY2hlc3NfcGF3bigpOwogICAgaW5pdF9jaGVzc19xdWVlbigpOwogICAgaW5pdF9jaGVzc19yb29rKCk7CiAgICBpbml0X2NoZXZyb25fZG93bigpOwogICAgaW5pdF9jaGV2cm9uX2ZpcnN0KCk7CiAgICBpbml0X2NoZXZyb25fbGFzdCgpOwogICAgaW5pdF9jaGV2cm9uX3JpZ2h0KCk7CiAgICBpbml0X2NoZXZyb25fbGVmdCgpOwogICAgaW5pdF9jaGV2cm9uX3VwKCk7CiAgICBpbml0X2NoZXZyb25zX2Rvd25fdXAoKTsKICAgIGluaXRfY2hldnJvbnNfZG93bigpOwogICAgaW5pdF9jaGV2cm9uc19sZWZ0X3JpZ2h0X2VsbGlwc2lzKCk7CiAgICBpbml0X2NoZXZyb25zX2xlZnRfcmlnaHQoKTsKICAgIGluaXRfY2hldnJvbnNfbGVmdCgpOwogICAgaW5pdF9jaGV2cm9uc19yaWdodF9sZWZ0KCk7CiAgICBpbml0X2NoZXZyb25zX3JpZ2h0KCk7CiAgICBpbml0X2NoZXZyb25zX3VwX2Rvd24oKTsKICAgIGluaXRfY2hldnJvbnNfdXAoKTsKICAgIGluaXRfY2hyb21pdW0oKTsKICAgIGluaXRfY2lnYXJldHRlX29mZigpOwogICAgaW5pdF9jaHVyY2goKTsKICAgIGluaXRfY2lnYXJldHRlKCk7CiAgICBpbml0X2NpcmNsZV9hbGVydCgpOwogICAgaW5pdF9jaXJjbGVfYXJyb3dfZG93bigpOwogICAgaW5pdF9jaXJjbGVfYXJyb3dfbGVmdCgpOwogICAgaW5pdF9jaXJjbGVfYXJyb3dfb3V0X2Rvd25fbGVmdCgpOwogICAgaW5pdF9jaXJjbGVfYXJyb3dfb3V0X2Rvd25fcmlnaHQoKTsKICAgIGluaXRfY2lyY2xlX2Fycm93X291dF91cF9sZWZ0KCk7CiAgICBpbml0X2NpcmNsZV9hcnJvd19vdXRfdXBfcmlnaHQoKTsKICAgIGluaXRfY2lyY2xlX2Fycm93X3JpZ2h0KCk7CiAgICBpbml0X2NpcmNsZV9hcnJvd191cCgpOwogICAgaW5pdF9jaXJjbGVfY2hlY2tfYmlnKCk7CiAgICBpbml0X2NpcmNsZV9jaGVjaygpOwogICAgaW5pdF9jaXJjbGVfY2hldnJvbl9kb3duKCk7CiAgICBpbml0X2NpcmNsZV9jaGV2cm9uX2xlZnQoKTsKICAgIGluaXRfY2lyY2xlX2NoZXZyb25fcmlnaHQoKTsKICAgIGluaXRfY2lyY2xlX2NoZXZyb25fdXAoKTsKICAgIGluaXRfY2lyY2xlX2Rhc2hlZCgpOwogICAgaW5pdF9jaXJjbGVfZGl2aWRlKCk7CiAgICBpbml0X2NpcmNsZV9kb2xsYXJfc2lnbigpOwogICAgaW5pdF9jaXJjbGVfZG90X2Rhc2hlZCgpOwogICAgaW5pdF9jaXJjbGVfZG90KCk7CiAgICBpbml0X2NpcmNsZV9lbGxpcHNpcygpOwogICAgaW5pdF9jaXJjbGVfZXF1YWwoKTsKICAgIGluaXRfY2lyY2xlX2ZhZGluZ19hcnJvd191cCgpOwogICAgaW5pdF9jaXJjbGVfZmFkaW5nX3BsdXMoKTsKICAgIGluaXRfY2lyY2xlX2dhdWdlKCk7CiAgICBpbml0X2NpcmNsZV9taW51cygpOwogICAgaW5pdF9jaXJjbGVfb2ZmKCk7CiAgICBpbml0X2NpcmNsZV9wYXJraW5nKCk7CiAgICBpbml0X2NpcmNsZV9wYXJraW5nX29mZigpOwogICAgaW5pdF9jaXJjbGVfcGF1c2UoKTsKICAgIGluaXRfY2lyY2xlX3BlcmNlbnQoKTsKICAgIGluaXRfY2lyY2xlX3BpbGUoKTsKICAgIGluaXRfY2lyY2xlX3BsYXkoKTsKICAgIGluaXRfY2lyY2xlX3BsdXMoKTsKICAgIGluaXRfY2lyY2xlX3BvdW5kX3N0ZXJsaW5nKCk7CiAgICBpbml0X2NpcmNsZV9wb3dlcigpOwogICAgaW5pdF9jaXJjbGVfcXVlc3Rpb25fbWFyaygpOwogICAgaW5pdF9jaXJjbGVfc2xhc2hfMigpOwogICAgaW5pdF9jaXJjbGVfc2xhc2goKTsKICAgIGluaXRfY2lyY2xlX3NtYWxsKCk7CiAgICBpbml0X2NpcmNsZV9zdGFyKCk7CiAgICBpbml0X2NpcmNsZV9zdG9wKCk7CiAgICBpbml0X2NpcmNsZV91c2VyX3JvdW5kKCk7CiAgICBpbml0X2NpcmNsZV91c2VyKCk7CiAgICBpbml0X2NpcmNsZV94KCk7CiAgICBpbml0X2NpcmNsZSgpOwogICAgaW5pdF9jaXJjdWl0X2JvYXJkKCk7CiAgICBpbml0X2NpdHJ1cygpOwogICAgaW5pdF9jbGFwcGVyYm9hcmQoKTsKICAgIGluaXRfY2xpcGJvYXJkX2NoZWNrKCk7CiAgICBpbml0X2NsaXBib2FyZF9jbG9jaygpOwogICAgaW5pdF9jbGlwYm9hcmRfY29weSgpOwogICAgaW5pdF9jbGlwYm9hcmRfbGlzdCgpOwogICAgaW5pdF9jbGlwYm9hcmRfbWludXMoKTsKICAgIGluaXRfY2xpcGJvYXJkX3Bhc3RlKCk7CiAgICBpbml0X2NsaXBib2FyZF9wZW5fbGluZSgpOwogICAgaW5pdF9jbGlwYm9hcmRfcGVuKCk7CiAgICBpbml0X2NsaXBib2FyZF9wbHVzKCk7CiAgICBpbml0X2NsaXBib2FyZF90eXBlKCk7CiAgICBpbml0X2NsaXBib2FyZF94KCk7CiAgICBpbml0X2NsaXBib2FyZCgpOwogICAgaW5pdF9jbG9ja18xKCk7CiAgICBpbml0X2Nsb2NrXzEwKCk7CiAgICBpbml0X2Nsb2NrXzExKCk7CiAgICBpbml0X2Nsb2NrXzEyKCk7CiAgICBpbml0X2Nsb2NrXzMoKTsKICAgIGluaXRfY2xvY2tfMigpOwogICAgaW5pdF9jbG9ja180KCk7CiAgICBpbml0X2Nsb2NrXzUoKTsKICAgIGluaXRfY2xvY2tfNigpOwogICAgaW5pdF9jbG9ja183KCk7CiAgICBpbml0X2Nsb2NrXzkoKTsKICAgIGluaXRfY2xvY2tfOCgpOwogICAgaW5pdF9jbG9ja19hbGVydCgpOwogICAgaW5pdF9jbG9ja19hcnJvd19kb3duKCk7CiAgICBpbml0X2Nsb2NrX2Fycm93X3VwKCk7CiAgICBpbml0X2Nsb2NrX2NoZWNrKCk7CiAgICBpbml0X2Nsb2NrX2ZhZGluZygpOwogICAgaW5pdF9jbG9ja19wbHVzKCk7CiAgICBpbml0X2Nsb2NrKCk7CiAgICBpbml0X2Nsb3VkX2FsZXJ0KCk7CiAgICBpbml0X2Nsb3NlZF9jYXB0aW9uKCk7CiAgICBpbml0X2Nsb3VkX2JhY2t1cCgpOwogICAgaW5pdF9jbG91ZF9jaGVjaygpOwogICAgaW5pdF9jbG91ZF9jb2coKTsKICAgIGluaXRfY2xvdWRfZG93bmxvYWQoKTsKICAgIGluaXRfY2xvdWRfZHJpenpsZSgpOwogICAgaW5pdF9jbG91ZF9mb2coKTsKICAgIGluaXRfY2xvdWRfaGFpbCgpOwogICAgaW5pdF9jbG91ZF9saWdodG5pbmcoKTsKICAgIGluaXRfY2xvdWRfbW9vbl9yYWluKCk7CiAgICBpbml0X2Nsb3VkX21vb24oKTsKICAgIGluaXRfY2xvdWRfb2ZmKCk7CiAgICBpbml0X2Nsb3VkX3JhaW5fd2luZCgpOwogICAgaW5pdF9jbG91ZF9yYWluKCk7CiAgICBpbml0X2Nsb3VkX3Nub3coKTsKICAgIGluaXRfY2xvdWRfc3VuX3JhaW4oKTsKICAgIGluaXRfY2xvdWRfc3luYygpOwogICAgaW5pdF9jbG91ZF9zdW4oKTsKICAgIGluaXRfY2xvdWQoKTsKICAgIGluaXRfY2xvdWRfdXBsb2FkKCk7CiAgICBpbml0X2Nsb3VkeSgpOwogICAgaW5pdF9jbG92ZXIoKTsKICAgIGluaXRfY2x1YigpOwogICAgaW5pdF9jb2RlX3htbCgpOwogICAgaW5pdF9jb2RlNCgpOwogICAgaW5pdF9jb2RlcGVuKCk7CiAgICBpbml0X2NvZGVzYW5kYm94KCk7CiAgICBpbml0X2NvZmZlZSgpOwogICAgaW5pdF9jb2coKTsKICAgIGluaXRfY29pbnMoKTsKICAgIGluaXRfY29sdW1uc18yKCk7CiAgICBpbml0X2NvbHVtbnNfM19jb2coKTsKICAgIGluaXRfY29sdW1uc18zKCk7CiAgICBpbml0X2NvbHVtbnNfNCgpOwogICAgaW5pdF9jb21iaW5lKCk7CiAgICBpbml0X2NvbW1hbmQoKTsKICAgIGluaXRfY29tcGFzcygpOwogICAgaW5pdF9jb21wb25lbnQoKTsKICAgIGluaXRfY29uY2llcmdlX2JlbGwoKTsKICAgIGluaXRfY29tcHV0ZXIoKTsKICAgIGluaXRfY29uZSgpOwogICAgaW5pdF9jb25zdHJ1Y3Rpb24oKTsKICAgIGluaXRfY29udGFjdF9yb3VuZCgpOwogICAgaW5pdF9jb250YWN0MigpOwogICAgaW5pdF9jb250YWluZXIzKCk7CiAgICBpbml0X2NvbnRyYXN0KCk7CiAgICBpbml0X2Nvb2tpZSgpOwogICAgaW5pdF9jb29raW5nX3BvdCgpOwogICAgaW5pdF9jb3B5X2NoZWNrKCk7CiAgICBpbml0X2NvcHlfbWludXMoKTsKICAgIGluaXRfY29weV9wbHVzKCk7CiAgICBpbml0X2NvcHlfc2xhc2goKTsKICAgIGluaXRfY29weV94KCk7CiAgICBpbml0X2NvcHkoKTsKICAgIGluaXRfY29weWxlZnQoKTsKICAgIGluaXRfY29weXJpZ2h0KCk7CiAgICBpbml0X2Nvcm5lcl9kb3duX2xlZnQoKTsKICAgIGluaXRfY29ybmVyX2Rvd25fcmlnaHQoKTsKICAgIGluaXRfY29ybmVyX2xlZnRfZG93bigpOwogICAgaW5pdF9jb3JuZXJfbGVmdF91cCgpOwogICAgaW5pdF9jb3JuZXJfcmlnaHRfZG93bigpOwogICAgaW5pdF9jb3JuZXJfcmlnaHRfdXAoKTsKICAgIGluaXRfY29ybmVyX3VwX2xlZnQoKTsKICAgIGluaXRfY3B1KCk7CiAgICBpbml0X2Nvcm5lcl91cF9yaWdodCgpOwogICAgaW5pdF9jcmVhdGl2ZV9jb21tb25zKCk7CiAgICBpbml0X2NyZWRpdF9jYXJkKCk7CiAgICBpbml0X2Nyb2lzc2FudCgpOwogICAgaW5pdF9jcm9wKCk7CiAgICBpbml0X2Nyb3NzKCk7CiAgICBpbml0X2Nyb3NzaGFpcigpOwogICAgaW5pdF9jcm93bigpOwogICAgaW5pdF9jdXBfc29kYSgpOwogICAgaW5pdF9jdWJvaWQoKTsKICAgIGluaXRfY3VycmVuY3kyKCk7CiAgICBpbml0X2N5bGluZGVyKCk7CiAgICBpbml0X2RhbSgpOwogICAgaW5pdF9kYXRhYmFzZV9iYWNrdXAoKTsKICAgIGluaXRfZGF0YWJhc2VfemFwKCk7CiAgICBpbml0X2RhdGFiYXNlX3NlYXJjaCgpOwogICAgaW5pdF9kZWNpbWFsc19hcnJvd19sZWZ0KCk7CiAgICBpbml0X2RhdGFiYXNlMigpOwogICAgaW5pdF9kZWNpbWFsc19hcnJvd19yaWdodCgpOwogICAgaW5pdF9kZWxldGUyKCk7CiAgICBpbml0X2RpYW1ldGVyKCk7CiAgICBpbml0X2Rlc3NlcnQoKTsKICAgIGluaXRfZGlhbW9uZF9taW51cygpOwogICAgaW5pdF9kaWFtb25kX3BlcmNlbnQoKTsKICAgIGluaXRfZGlhbW9uZF9wbHVzKCk7CiAgICBpbml0X2RpYW1vbmQoKTsKICAgIGluaXRfZGljZV8xKCk7CiAgICBpbml0X2RpY2VfMigpOwogICAgaW5pdF9kaWNlXzMoKTsKICAgIGluaXRfZGljZV80KCk7CiAgICBpbml0X2RpY2VfNSgpOwogICAgaW5pdF9kaWNlXzYoKTsKICAgIGluaXRfZGljZXMoKTsKICAgIGluaXRfZGlmZigpOwogICAgaW5pdF9kaXNjXzIoKTsKICAgIGluaXRfZGlzY19hbGJ1bSgpOwogICAgaW5pdF9kaXNjXzMoKTsKICAgIGluaXRfZGlzYygpOwogICAgaW5pdF9kaXZpZGUoKTsKICAgIGluaXRfZG5hX29mZigpOwogICAgaW5pdF9kb2NrKCk7CiAgICBpbml0X2RuYSgpOwogICAgaW5pdF9kb2coKTsKICAgIGluaXRfZG9sbGFyX3NpZ24oKTsKICAgIGluaXRfZG9udXQoKTsKICAgIGluaXRfZG9vcl9jbG9zZWQoKTsKICAgIGluaXRfZG9vcl9jbG9zZWRfbG9ja2VkKCk7CiAgICBpbml0X2Rvb3Jfb3BlbigpOwogICAgaW5pdF9kb3QoKTsKICAgIGluaXRfZG93bmxvYWQoKTsKICAgIGluaXRfZHJhbWEoKTsKICAgIGluaXRfZHJhZnRpbmdfY29tcGFzcygpOwogICAgaW5pdF9kcmliYmJsZSgpOwogICAgaW5pdF9kcmlsbCgpOwogICAgaW5pdF9kcm9uZSgpOwogICAgaW5pdF9kcm9wbGV0KCk7CiAgICBpbml0X2Ryb3BsZXRfb2ZmKCk7CiAgICBpbml0X2Ryb3BsZXRzKCk7CiAgICBpbml0X2RydW0oKTsKICAgIGluaXRfZHJ1bXN0aWNrKCk7CiAgICBpbml0X2R1bWJiZWxsKCk7CiAgICBpbml0X2Vhcl9vZmYoKTsKICAgIGluaXRfZWFyKCk7CiAgICBpbml0X2VhcnRoKCk7CiAgICBpbml0X2VhcnRoX2xvY2soKTsKICAgIGluaXRfZWNsaXBzZSgpOwogICAgaW5pdF9lZ2dfb2ZmKCk7CiAgICBpbml0X2VnZ19mcmllZCgpOwogICAgaW5pdF9lZ2coKTsKICAgIGluaXRfZWxsaXBzZSgpOwogICAgaW5pdF9lbGxpcHNpc192ZXJ0aWNhbCgpOwogICAgaW5pdF9lbGxpcHNpcygpOwogICAgaW5pdF9lcXVhbF9hcHByb3hpbWF0ZWx5KCk7CiAgICBpbml0X2VxdWFsX25vdCgpOwogICAgaW5pdF9lcXVhbCgpOwogICAgaW5pdF9lcmFzZXIoKTsKICAgIGluaXRfZXRoZXJuZXRfcG9ydCgpOwogICAgaW5pdF9ldXJvKCk7CiAgICBpbml0X2V4cGFuZDIoKTsKICAgIGluaXRfZXZfY2hhcmdlcigpOwogICAgaW5pdF9leHRlcm5hbF9saW5rKCk7CiAgICBpbml0X2V5ZV9vZmYoKTsKICAgIGluaXRfZXllX2Nsb3NlZCgpOwogICAgaW5pdF9leWUoKTsKICAgIGluaXRfZmFjZWJvb2soKTsKICAgIGluaXRfZmFjdG9yeSgpOwogICAgaW5pdF9mYW4oKTsKICAgIGluaXRfZmFzdF9mb3J3YXJkKCk7CiAgICBpbml0X2ZlYXRoZXIoKTsKICAgIGluaXRfZmVuY2UoKTsKICAgIGluaXRfZmVycmlzX3doZWVsKCk7CiAgICBpbml0X2ZpZ21hKCk7CiAgICBpbml0X2ZpbGVfYXJjaGl2ZSgpOwogICAgaW5pdF9maWxlX2F4aXNfM2QoKTsKICAgIGluaXRfZmlsZV9iYWRnZSgpOwogICAgaW5pdF9maWxlX2JveCgpOwogICAgaW5pdF9maWxlX2JyYWNlc19jb3JuZXIoKTsKICAgIGluaXRfZmlsZV9icmFjZXMoKTsKICAgIGluaXRfZmlsZV9jaGFydF9jb2x1bW5faW5jcmVhc2luZygpOwogICAgaW5pdF9maWxlX2NoYXJ0X2NvbHVtbigpOwogICAgaW5pdF9maWxlX2NoYXJ0X2xpbmUoKTsKICAgIGluaXRfZmlsZV9jaGFydF9waWUoKTsKICAgIGluaXRfZmlsZV9jaGVja19jb3JuZXIoKTsKICAgIGluaXRfZmlsZV9jaGVjaygpOwogICAgaW5pdF9maWxlX2NvZGVfY29ybmVyKCk7CiAgICBpbml0X2ZpbGVfY2xvY2soKTsKICAgIGluaXRfZmlsZV9jb2RlKCk7CiAgICBpbml0X2ZpbGVfY29nKCk7CiAgICBpbml0X2ZpbGVfZGlnaXQoKTsKICAgIGluaXRfZmlsZV9kaWZmKCk7CiAgICBpbml0X2ZpbGVfZG93bigpOwogICAgaW5pdF9maWxlX2V4Y2xhbWF0aW9uX3BvaW50KCk7CiAgICBpbml0X2ZpbGVfaGVhZHBob25lKCk7CiAgICBpbml0X2ZpbGVfaGVhcnQoKTsKICAgIGluaXRfZmlsZV9pbWFnZSgpOwogICAgaW5pdF9maWxlX2lucHV0KCk7CiAgICBpbml0X2ZpbGVfbG9jaygpOwogICAgaW5pdF9maWxlX2tleSgpOwogICAgaW5pdF9maWxlX21pbnVzX2Nvcm5lcigpOwogICAgaW5pdF9maWxlX21pbnVzKCk7CiAgICBpbml0X2ZpbGVfbXVzaWMoKTsKICAgIGluaXRfZmlsZV9vdXRwdXQoKTsKICAgIGluaXRfZmlsZV9wZW5fbGluZSgpOwogICAgaW5pdF9maWxlX3BlbigpOwogICAgaW5pdF9maWxlX3BsYXkoKTsKICAgIGluaXRfZmlsZV9wbHVzX2Nvcm5lcigpOwogICAgaW5pdF9maWxlX3BsdXMoKTsKICAgIGluaXRfZmlsZV9xdWVzdGlvbl9tYXJrKCk7CiAgICBpbml0X2ZpbGVfc2NhbigpOwogICAgaW5pdF9maWxlX3NlYXJjaF9jb3JuZXIoKTsKICAgIGluaXRfZmlsZV9zZWFyY2goKTsKICAgIGluaXRfZmlsZV9zaWduYWwoKTsKICAgIGluaXRfZmlsZV9zbGlkZXJzKCk7CiAgICBpbml0X2ZpbGVfc3ByZWFkc2hlZXQoKTsKICAgIGluaXRfZmlsZV9zdGFjaygpOwogICAgaW5pdF9maWxlX3N5bWxpbmsoKTsKICAgIGluaXRfZmlsZV90ZXh0KCk7CiAgICBpbml0X2ZpbGVfdHlwZSgpOwogICAgaW5pdF9maWxlX3Rlcm1pbmFsKCk7CiAgICBpbml0X2ZpbGVfdHlwZV9jb3JuZXIoKTsKICAgIGluaXRfZmlsZV91cCgpOwogICAgaW5pdF9maWxlX3VzZXIoKTsKICAgIGluaXRfZmlsZV92aWRlb19jYW1lcmEoKTsKICAgIGluaXRfZmlsZV94X2Nvcm5lcigpOwogICAgaW5pdF9maWxlX3ZvbHVtZSgpOwogICAgaW5pdF9maWxlX3goKTsKICAgIGluaXRfZmlsZSgpOwogICAgaW5pdF9maWxlcygpOwogICAgaW5pdF9maWxtKCk7CiAgICBpbml0X2ZpbmdlcnByaW50X3BhdHRlcm4oKTsKICAgIGluaXRfZmlyZV9leHRpbmd1aXNoZXIoKTsKICAgIGluaXRfZmlzaF9vZmYoKTsKICAgIGluaXRfZmlzaF9zeW1ib2woKTsKICAgIGluaXRfZmlzaCgpOwogICAgaW5pdF9maXNoaW5nX2hvb2soKTsKICAgIGluaXRfZmlzaGluZ19yb2QoKTsKICAgIGluaXRfZmxhZ190cmlhbmdsZV9sZWZ0KCk7CiAgICBpbml0X2ZsYWdfb2ZmKCk7CiAgICBpbml0X2ZsYWdfdHJpYW5nbGVfcmlnaHQoKTsKICAgIGluaXRfZmxhZygpOwogICAgaW5pdF9mbGFtZV9raW5kbGluZygpOwogICAgaW5pdF9mbGFtZSgpOwogICAgaW5pdF9mbGFzaGxpZ2h0X29mZigpOwogICAgaW5pdF9mbGFzaGxpZ2h0KCk7CiAgICBpbml0X2ZsYXNrX2NvbmljYWwoKTsKICAgIGluaXRfZmxhc2tfY29uaWNhbF9vZmYoKTsKICAgIGluaXRfZmxhc2tfcm91bmQoKTsKICAgIGluaXRfZmxpcF9ob3Jpem9udGFsXzIoKTsKICAgIGluaXRfZmxpcF92ZXJ0aWNhbF8yKCk7CiAgICBpbml0X2Zsb3dlcl8yKCk7CiAgICBpbml0X2Zsb3dlcigpOwogICAgaW5pdF9mb2N1cygpOwogICAgaW5pdF9mb2xkX2hvcml6b250YWwoKTsKICAgIGluaXRfZm9sZF92ZXJ0aWNhbCgpOwogICAgaW5pdF9mb2xkZXJfYXJjaGl2ZSgpOwogICAgaW5pdF9mb2xkZXJfY2hlY2soKTsKICAgIGluaXRfZm9sZGVyX2Nsb2NrKCk7CiAgICBpbml0X2ZvbGRlcl9jbG9zZWQoKTsKICAgIGluaXRfZm9sZGVyX2NvZGUoKTsKICAgIGluaXRfZm9sZGVyX2NvZygpOwogICAgaW5pdF9mb2xkZXJfZG90KCk7CiAgICBpbml0X2ZvbGRlcl9kb3duKCk7CiAgICBpbml0X2ZvbGRlcl9naXRfMigpOwogICAgaW5pdF9mb2xkZXJfZ2l0KCk7CiAgICBpbml0X2ZvbGRlcl9oZWFydCgpOwogICAgaW5pdF9mb2xkZXJfaW5wdXQoKTsKICAgIGluaXRfZm9sZGVyX2thbmJhbigpOwogICAgaW5pdF9mb2xkZXJfa2V5KCk7CiAgICBpbml0X2ZvbGRlcl9sb2NrKCk7CiAgICBpbml0X2ZvbGRlcl9taW51cygpOwogICAgaW5pdF9mb2xkZXJfb3Blbl9kb3QoKTsKICAgIGluaXRfZm9sZGVyX29wZW4oKTsKICAgIGluaXRfZm9sZGVyX3BlbigpOwogICAgaW5pdF9mb2xkZXJfb3V0cHV0KCk7CiAgICBpbml0X2ZvbGRlcl9wbHVzKCk7CiAgICBpbml0X2ZvbGRlcl9yb290KCk7CiAgICBpbml0X2ZvbGRlcl9zZWFyY2hfMigpOwogICAgaW5pdF9mb2xkZXJfc2VhcmNoKCk7CiAgICBpbml0X2ZvbGRlcl9zeW1saW5rKCk7CiAgICBpbml0X2ZvbGRlcl9zeW5jKCk7CiAgICBpbml0X2ZvbGRlcl90cmVlKCk7CiAgICBpbml0X2ZvbGRlcl91cCgpOwogICAgaW5pdF9mb2xkZXJfeCgpOwogICAgaW5pdF9mb2xkZXIoKTsKICAgIGluaXRfZm9sZGVycygpOwogICAgaW5pdF9mb290cHJpbnRzKCk7CiAgICBpbml0X2Zvcm0oKTsKICAgIGluaXRfZm9ya2xpZnQoKTsKICAgIGluaXRfZnJhbWUoKTsKICAgIGluaXRfZm9yd2FyZCgpOwogICAgaW5pdF9mcmFtZXIoKTsKICAgIGluaXRfZnJvd24oKTsKICAgIGluaXRfZnVlbCgpOwogICAgaW5pdF9mdWxsc2NyZWVuKCk7CiAgICBpbml0X2Z1bm5lbF9wbHVzKCk7CiAgICBpbml0X2Z1bm5lbF94KCk7CiAgICBpbml0X2Z1bm5lbCgpOwogICAgaW5pdF9nYWxsZXJ5X2hvcml6b250YWxfZW5kKCk7CiAgICBpbml0X2dhbGxlcnlfaG9yaXpvbnRhbCgpOwogICAgaW5pdF9nYWxsZXJ5X3RodW1ibmFpbHMoKTsKICAgIGluaXRfZ2FsbGVyeV92ZXJ0aWNhbF9lbmQoKTsKICAgIGluaXRfZ2FsbGVyeV92ZXJ0aWNhbCgpOwogICAgaW5pdF9nYW1lcGFkXzIoKTsKICAgIGluaXRfZ2FtZXBhZF9kaXJlY3Rpb25hbCgpOwogICAgaW5pdF9nYW1lcGFkKCk7CiAgICBpbml0X2dhdWdlKCk7CiAgICBpbml0X2dhdmVsKCk7CiAgICBpbml0X2dlb3JnaWFuX2xhcmkoKTsKICAgIGluaXRfZ2VtKCk7CiAgICBpbml0X2dob3N0KCk7CiAgICBpbml0X2dpZnQoKTsKICAgIGluaXRfZ2l0X2JyYW5jaF9taW51cygpOwogICAgaW5pdF9naXRfYnJhbmNoX3BsdXMoKTsKICAgIGluaXRfZ2l0X2JyYW5jaCgpOwogICAgaW5pdF9naXRfY29tbWl0X2hvcml6b250YWwoKTsKICAgIGluaXRfZ2l0X2NvbW1pdF92ZXJ0aWNhbCgpOwogICAgaW5pdF9naXRfY29tcGFyZV9hcnJvd3MoKTsKICAgIGluaXRfZ2l0X2NvbXBhcmUoKTsKICAgIGluaXRfZ2l0X2dyYXBoKCk7CiAgICBpbml0X2dpdF9mb3JrKCk7CiAgICBpbml0X2dpdF9tZXJnZV9jb25mbGljdCgpOwogICAgaW5pdF9naXRfbWVyZ2UoKTsKICAgIGluaXRfZ2l0X3B1bGxfcmVxdWVzdF9hcnJvdygpOwogICAgaW5pdF9naXRfcHVsbF9yZXF1ZXN0X2Nsb3NlZCgpOwogICAgaW5pdF9naXRfcHVsbF9yZXF1ZXN0X2NyZWF0ZV9hcnJvdygpOwogICAgaW5pdF9naXRfcHVsbF9yZXF1ZXN0X2NyZWF0ZSgpOwogICAgaW5pdF9naXRfcHVsbF9yZXF1ZXN0X2RyYWZ0KCk7CiAgICBpbml0X2dpdF9wdWxsX3JlcXVlc3QoKTsKICAgIGluaXRfZ2l0aHViKCk7CiAgICBpbml0X2dpdGxhYigpOwogICAgaW5pdF9nbGFzc193YXRlcigpOwogICAgaW5pdF9nbG9iZV9sb2NrKCk7CiAgICBpbml0X2dsYXNzZXMoKTsKICAgIGluaXRfZ2xvYmVfeCgpOwogICAgaW5pdF9nbG9iZV9vZmYoKTsKICAgIGluaXRfZ2xvYmUoKTsKICAgIGluaXRfZ29hbCgpOwogICAgaW5pdF9ncHUoKTsKICAgIGluaXRfZ3JhZHVhdGlvbl9jYXAoKTsKICAgIGluaXRfZ3JpZF8yeDJfY2hlY2soKTsKICAgIGluaXRfZ3JpZF8yeDJfcGx1cygpOwogICAgaW5pdF9ncmFwZSgpOwogICAgaW5pdF9ncmlkXzJ4Ml94KCk7CiAgICBpbml0X2dyaWRfMngyKCk7CiAgICBpbml0X2dyaWRfM3gyKCk7CiAgICBpbml0X2dyaWRfM3gzKCk7CiAgICBpbml0X2dyaXBfaG9yaXpvbnRhbCgpOwogICAgaW5pdF9ncmlwX3ZlcnRpY2FsKCk7CiAgICBpbml0X2dyaXAoKTsKICAgIGluaXRfZ3JvdXAoKTsKICAgIGluaXRfZ3VpdGFyKCk7CiAgICBpbml0X2hhbSgpOwogICAgaW5pdF9oYW1idXJnZXIoKTsKICAgIGluaXRfaGFtbWVyKCk7CiAgICBpbml0X2hhbmRfY29pbnMoKTsKICAgIGluaXRfaGFuZF9maXN0KCk7CiAgICBpbml0X2hhbmRfZ3JhYigpOwogICAgaW5pdF9oYW5kX2hlYXJ0KCk7CiAgICBpbml0X2hhbmRfaGVscGluZygpOwogICAgaW5pdF9oYW5kX21ldGFsKCk7CiAgICBpbml0X2hhbmRfcGxhdHRlcigpOwogICAgaW5pdF9oYW5kYmFnKCk7CiAgICBpbml0X2hhbmQoKTsKICAgIGluaXRfaGFyZF9kcml2ZV9kb3dubG9hZCgpOwogICAgaW5pdF9oYXJkX2RyaXZlKCk7CiAgICBpbml0X2hhbmRzaGFrZSgpOwogICAgaW5pdF9oYXJkX2RyaXZlX3VwbG9hZCgpOwogICAgaW5pdF9oYXJkX2hhdCgpOwogICAgaW5pdF9oYXNoKCk7CiAgICBpbml0X2hhdF9nbGFzc2VzKCk7CiAgICBpbml0X2hhemUoKTsKICAgIGluaXRfaGQoKTsKICAgIGluaXRfaGRtaV9wb3J0KCk7CiAgICBpbml0X2hlYWRpbmdfMSgpOwogICAgaW5pdF9oZWFkaW5nXzIoKTsKICAgIGluaXRfaGVhZGluZ18zKCk7CiAgICBpbml0X2hlYWRpbmdfNCgpOwogICAgaW5pdF9oZWFkaW5nXzUoKTsKICAgIGluaXRfaGVhZGluZzMoKTsKICAgIGluaXRfaGVhZGluZ182KCk7CiAgICBpbml0X2hlYWRwaG9uZXMoKTsKICAgIGluaXRfaGVhZHBob25lX29mZigpOwogICAgaW5pdF9oZWFkc2V0KCk7CiAgICBpbml0X2hlYXJ0X2hhbmRzaGFrZSgpOwogICAgaW5pdF9oZWFydF9jcmFjaygpOwogICAgaW5pdF9oZWFydF9vZmYoKTsKICAgIGluaXRfaGVhcnRfbWludXMoKTsKICAgIGluaXRfaGVhcnRfcGx1cygpOwogICAgaW5pdF9oZWFydF9wdWxzZSgpOwogICAgaW5pdF9oZWFydCgpOwogICAgaW5pdF9oZWF0ZXIoKTsKICAgIGluaXRfaGVsaWNvcHRlcigpOwogICAgaW5pdF9oZXhhZ29uKCk7CiAgICBpbml0X2hpZ2hsaWdodGVyKCk7CiAgICBpbml0X2hpc3RvcnkoKTsKICAgIGluaXRfaG9wX29mZigpOwogICAgaW5pdF9ob3NwaXRhbCgpOwogICAgaW5pdF9ob3AoKTsKICAgIGluaXRfaG90ZWwoKTsKICAgIGluaXRfaG91cmdsYXNzKCk7CiAgICBpbml0X2hvdXNlX2hlYXJ0KCk7CiAgICBpbml0X2hvdXNlX3BsdXMoKTsKICAgIGluaXRfaG91c2VfcGx1ZygpOwogICAgaW5pdF9ob3VzZV93aWZpKCk7CiAgICBpbml0X2ljZV9jcmVhbV9ib3dsKCk7CiAgICBpbml0X2hvdXNlKCk7CiAgICBpbml0X2ljZV9jcmVhbV9jb25lKCk7CiAgICBpbml0X2lkX2NhcmQoKTsKICAgIGluaXRfaWRfY2FyZF9sYW55YXJkKCk7CiAgICBpbml0X2ltYWdlX2Rvd24oKTsKICAgIGluaXRfaW1hZ2VfbWludXMoKTsKICAgIGluaXRfaW1hZ2Vfb2ZmKCk7CiAgICBpbml0X2ltYWdlX3BsYXkoKTsKICAgIGluaXRfaW1hZ2VfcGx1cygpOwogICAgaW5pdF9pbWFnZV91cCgpOwogICAgaW5pdF9pbWFnZV91cHNjYWxlKCk7CiAgICBpbml0X2ltYWdlMygpOwogICAgaW5pdF9pbWFnZXMoKTsKICAgIGluaXRfaW1wb3J0KCk7CiAgICBpbml0X2luYm94KCk7CiAgICBpbml0X2luZmluaXR5KCk7CiAgICBpbml0X2luZGlhbl9ydXBlZSgpOwogICAgaW5pdF9pbmZvMigpOwogICAgaW5pdF9pbnNwZWN0aW9uX3BhbmVsKCk7CiAgICBpbml0X2luc3RhZ3JhbSgpOwogICAgaW5pdF9pdGFsaWMoKTsKICAgIGluaXRfaXRlcmF0aW9uX2N3KCk7CiAgICBpbml0X2l0ZXJhdGlvbl9jY3coKTsKICAgIGluaXRfam95c3RpY2soKTsKICAgIGluaXRfamFwYW5lc2VfeWVuKCk7CiAgICBpbml0X2thbmJhbigpOwogICAgaW5pdF9rYXlhaygpOwogICAgaW5pdF9rZXlfc3F1YXJlKCk7CiAgICBpbml0X2tleV9yb3VuZCgpOwogICAgaW5pdF9rZXkoKTsKICAgIGluaXRfa2V5Ym9hcmRfb2ZmKCk7CiAgICBpbml0X2tleWJvYXJkKCk7CiAgICBpbml0X2tleWJvYXJkX211c2ljKCk7CiAgICBpbml0X2xhbXBfY2VpbGluZygpOwogICAgaW5pdF9sYW1wX2Rlc2soKTsKICAgIGluaXRfbGFtcF9mbG9vcigpOwogICAgaW5pdF9sYW1wX3dhbGxfZG93bigpOwogICAgaW5pdF9sYW1wX3dhbGxfdXAoKTsKICAgIGluaXRfbGFuZF9wbG90KCk7CiAgICBpbml0X2xhbXAoKTsKICAgIGluaXRfbGFuZG1hcmsoKTsKICAgIGluaXRfbGFuZ3VhZ2VzKCk7CiAgICBpbml0X2xhcHRvcF9taW5pbWFsX2NoZWNrKCk7CiAgICBpbml0X2xhcHRvcF9taW5pbWFsKCk7CiAgICBpbml0X2xhcHRvcCgpOwogICAgaW5pdF9sYXNzb19zZWxlY3QoKTsKICAgIGluaXRfbGFzc28oKTsKICAgIGluaXRfbGF1Z2goKTsKICAgIGluaXRfbGF5ZXJzXzIoKTsKICAgIGluaXRfbGF5ZXJzX3BsdXMoKTsKICAgIGluaXRfbGF5ZXJzKCk7CiAgICBpbml0X2xheW91dF9ncmlkKCk7CiAgICBpbml0X2xheW91dF9kYXNoYm9hcmQoKTsKICAgIGluaXRfbGF5b3V0X2xpc3QoKTsKICAgIGluaXRfbGF5b3V0X3BhbmVsX2xlZnQoKTsKICAgIGluaXRfbGF5b3V0X3BhbmVsX3RvcCgpOwogICAgaW5pdF9sYXlvdXRfdGVtcGxhdGUoKTsKICAgIGluaXRfbGVhZnlfZ3JlZW4oKTsKICAgIGluaXRfbGVjdGVybigpOwogICAgaW5pdF9sZWFmKCk7CiAgICBpbml0X2xlbnNfY29uY2F2ZSgpOwogICAgaW5pdF9sZW5zX2NvbnZleCgpOwogICAgaW5pdF9saWJyYXJ5X2JpZygpOwogICAgaW5pdF9saWJyYXJ5KCk7CiAgICBpbml0X2xpZmVfYnVveSgpOwogICAgaW5pdF9saWdhdHVyZSgpOwogICAgaW5pdF9saWdodGJ1bGIoKTsKICAgIGluaXRfbGluZV9kb3RfcmlnaHRfaG9yaXpvbnRhbCgpOwogICAgaW5pdF9saWdodGJ1bGJfb2ZmKCk7CiAgICBpbml0X2xpbmVfc3F1aWdnbGUoKTsKICAgIGluaXRfbGlua18yX29mZigpOwogICAgaW5pdF9saW5rXzIoKTsKICAgIGluaXRfbGluazQoKTsKICAgIGluaXRfbGlua2VkaW4oKTsKICAgIGluaXRfbGlzdF9jaGVjaygpOwogICAgaW5pdF9saXN0X2NoZWNrcygpOwogICAgaW5pdF9saXN0X2NoZXZyb25zX2Rvd25fdXAoKTsKICAgIGluaXRfbGlzdF9jb2xsYXBzZSgpOwogICAgaW5pdF9saXN0X2NoZXZyb25zX3VwX2Rvd24oKTsKICAgIGluaXRfbGlzdF9lbmQoKTsKICAgIGluaXRfbGlzdF9maWx0ZXJfcGx1cygpOwogICAgaW5pdF9saXN0X2ZpbHRlcigpOwogICAgaW5pdF9saXN0X2luZGVudF9kZWNyZWFzZSgpOwogICAgaW5pdF9saXN0X2luZGVudF9pbmNyZWFzZSgpOwogICAgaW5pdF9saXN0X211c2ljKCk7CiAgICBpbml0X2xpc3RfbWludXMoKTsKICAgIGluaXRfbGlzdF9vcmRlcmVkKCk7CiAgICBpbml0X2xpc3RfcmVzdGFydCgpOwogICAgaW5pdF9saXN0X3BsdXMoKTsKICAgIGluaXRfbGlzdF9zdGFydCgpOwogICAgaW5pdF9saXN0X3RvZG8oKTsKICAgIGluaXRfbGlzdF90cmVlKCk7CiAgICBpbml0X2xpc3RfdmlkZW8oKTsKICAgIGluaXRfbGlzdF94KCk7CiAgICBpbml0X2xpc3Q0KCk7CiAgICBpbml0X2xvYWRlcl9jaXJjbGUoKTsKICAgIGluaXRfbG9hZGVyX3BpbndoZWVsKCk7CiAgICBpbml0X2xvYWRlcigpOwogICAgaW5pdF9sb2NhdGVfZml4ZWQoKTsKICAgIGluaXRfbG9jYXRlX29mZigpOwogICAgaW5pdF9sb2NhdGUoKTsKICAgIGluaXRfbG9ja19rZXlob2xlX29wZW4oKTsKICAgIGluaXRfbG9ja19rZXlob2xlKCk7CiAgICBpbml0X2xvY2tfb3BlbigpOwogICAgaW5pdF9sb2dfaW4oKTsKICAgIGluaXRfbG9jaygpOwogICAgaW5pdF9sb2dfb3V0KCk7CiAgICBpbml0X2xvZ3MoKTsKICAgIGluaXRfbG9sbGlwb3AoKTsKICAgIGluaXRfbHVnZ2FnZSgpOwogICAgaW5pdF9tYWduZXQoKTsKICAgIGluaXRfbWFpbF9jaGVjaygpOwogICAgaW5pdF9tYWlsX21pbnVzKCk7CiAgICBpbml0X21haWxfb3BlbigpOwogICAgaW5pdF9tYWlsX3BsdXMoKTsKICAgIGluaXRfbWFpbF9xdWVzdGlvbl9tYXJrKCk7CiAgICBpbml0X21haWxfc2VhcmNoKCk7CiAgICBpbml0X21haWxfd2FybmluZygpOwogICAgaW5pdF9tYWlsX3goKTsKICAgIGluaXRfbWFpbCgpOwogICAgaW5pdF9tYWlsYm94KCk7CiAgICBpbml0X21haWxzKCk7CiAgICBpbml0X21hcF9taW51cygpOwogICAgaW5pdF9tYXBfcGluX2NoZWNrX2luc2lkZSgpOwogICAgaW5pdF9tYXBfcGluX2hvdXNlKCk7CiAgICBpbml0X21hcF9waW5fY2hlY2soKTsKICAgIGluaXRfbWFwX3Bpbl9taW51c19pbnNpZGUoKTsKICAgIGluaXRfbWFwX3Bpbl9taW51cygpOwogICAgaW5pdF9tYXBfcGluX29mZigpOwogICAgaW5pdF9tYXBfcGluX3BlbigpOwogICAgaW5pdF9tYXBfcGluX3BsdXMoKTsKICAgIGluaXRfbWFwX3Bpbl9wbHVzX2luc2lkZSgpOwogICAgaW5pdF9tYXBfcGluX3hfaW5zaWRlKCk7CiAgICBpbml0X21hcF9waW5feCgpOwogICAgaW5pdF9tYXBfcGluKCk7CiAgICBpbml0X21hcF9waW5uZWQoKTsKICAgIGluaXRfbWFwX3BsdXMoKTsKICAgIGluaXRfbWFyc19zdHJva2UoKTsKICAgIGluaXRfbWFwMigpOwogICAgaW5pdF9tYXJzKCk7CiAgICBpbml0X21hcnRpbmkoKTsKICAgIGluaXRfbWF4aW1pemVfMigpOwogICAgaW5pdF9tYXhpbWl6ZSgpOwogICAgaW5pdF9tZWdhcGhvbmVfb2ZmKCk7CiAgICBpbml0X21lZGFsKCk7CiAgICBpbml0X21lZ2FwaG9uZSgpOwogICAgaW5pdF9tZWgoKTsKICAgIGluaXRfbWVudSgpOwogICAgaW5pdF9tZW1vcnlfc3RpY2soKTsKICAgIGluaXRfbWVyZ2U0KCk7CiAgICBpbml0X21lc3NhZ2VfY2lyY2xlX2NoZWNrKCk7CiAgICBpbml0X21lc3NhZ2VfY2lyY2xlX2NvZGUoKTsKICAgIGluaXRfbWVzc2FnZV9jaXJjbGVfZGFzaGVkKCk7CiAgICBpbml0X21lc3NhZ2VfY2lyY2xlX2hlYXJ0KCk7CiAgICBpbml0X21lc3NhZ2VfY2lyY2xlX21vcmUoKTsKICAgIGluaXRfbWVzc2FnZV9jaXJjbGVfb2ZmKCk7CiAgICBpbml0X21lc3NhZ2VfY2lyY2xlX3BsdXMoKTsKICAgIGluaXRfbWVzc2FnZV9jaXJjbGVfcXVlc3Rpb25fbWFyaygpOwogICAgaW5pdF9tZXNzYWdlX2NpcmNsZV9yZXBseSgpOwogICAgaW5pdF9tZXNzYWdlX2NpcmNsZV93YXJuaW5nKCk7CiAgICBpbml0X21lc3NhZ2VfY2lyY2xlX3goKTsKICAgIGluaXRfbWVzc2FnZV9jaXJjbGUoKTsKICAgIGluaXRfbWVzc2FnZV9zcXVhcmVfY2hlY2soKTsKICAgIGluaXRfbWVzc2FnZV9zcXVhcmVfY29kZSgpOwogICAgaW5pdF9tZXNzYWdlX3NxdWFyZV9kYXNoZWQoKTsKICAgIGluaXRfbWVzc2FnZV9zcXVhcmVfZGlmZigpOwogICAgaW5pdF9tZXNzYWdlX3NxdWFyZV9kb3QoKTsKICAgIGluaXRfbWVzc2FnZV9zcXVhcmVfaGVhcnQoKTsKICAgIGluaXRfbWVzc2FnZV9zcXVhcmVfbG9jaygpOwogICAgaW5pdF9tZXNzYWdlX3NxdWFyZV9tb3JlKCk7CiAgICBpbml0X21lc3NhZ2Vfc3F1YXJlX29mZigpOwogICAgaW5pdF9tZXNzYWdlX3NxdWFyZV9wbHVzKCk7CiAgICBpbml0X21lc3NhZ2Vfc3F1YXJlX3F1b3RlKCk7CiAgICBpbml0X21lc3NhZ2Vfc3F1YXJlX3JlcGx5KCk7CiAgICBpbml0X21lc3NhZ2Vfc3F1YXJlX3NoYXJlKCk7CiAgICBpbml0X21lc3NhZ2Vfc3F1YXJlX3RleHQoKTsKICAgIGluaXRfbWVzc2FnZV9zcXVhcmVfd2FybmluZygpOwogICAgaW5pdF9tZXNzYWdlX3NxdWFyZV94KCk7CiAgICBpbml0X21lc3NhZ2Vfc3F1YXJlKCk7CiAgICBpbml0X21lc3NhZ2VzX3NxdWFyZSgpOwogICAgaW5pdF9tZXRyb25vbWUoKTsKICAgIGluaXRfbWljX29mZigpOwogICAgaW5pdF9taWNfdm9jYWwoKTsKICAgIGluaXRfbWljKCk7CiAgICBpbml0X21pY3JvY2hpcCgpOwogICAgaW5pdF9taWNyb3dhdmUoKTsKICAgIGluaXRfbWlsZXN0b25lKCk7CiAgICBpbml0X21pY3Jvc2NvcGUoKTsKICAgIGluaXRfbWlsa19vZmYoKTsKICAgIGluaXRfbWluaW1pemVfMigpOwogICAgaW5pdF9taWxrKCk7CiAgICBpbml0X21pbmltaXplKCk7CiAgICBpbml0X21pbnVzKCk7CiAgICBpbml0X21pcnJvcl9yZWN0YW5ndWxhcigpOwogICAgaW5pdF9taXJyb3Jfcm91bmQoKTsKICAgIGluaXRfbW9uaXRvcl9jaGVjaygpOwogICAgaW5pdF9tb25pdG9yX2Nsb3VkKCk7CiAgICBpbml0X21vbml0b3JfY29nKCk7CiAgICBpbml0X21vbml0b3JfZG90KCk7CiAgICBpbml0X21vbml0b3JfZG93bigpOwogICAgaW5pdF9tb25pdG9yX29mZigpOwogICAgaW5pdF9tb25pdG9yX3BhdXNlKCk7CiAgICBpbml0X21vbml0b3JfcGxheSgpOwogICAgaW5pdF9tb25pdG9yX3NtYXJ0cGhvbmUoKTsKICAgIGluaXRfbW9uaXRvcl9zcGVha2VyKCk7CiAgICBpbml0X21vbml0b3Jfc3RvcCgpOwogICAgaW5pdF9tb25pdG9yX3VwKCk7CiAgICBpbml0X21vbml0b3JfeCgpOwogICAgaW5pdF9tb25pdG9yKCk7CiAgICBpbml0X21vb25fc3RhcigpOwogICAgaW5pdF9tb29uKCk7CiAgICBpbml0X21vdG9yYmlrZSgpOwogICAgaW5pdF9tb3VudGFpbl9zbm93KCk7CiAgICBpbml0X21vdW50YWluKCk7CiAgICBpbml0X21vdXNlX2xlZnQoKTsKICAgIGluaXRfbW91c2Vfb2ZmKCk7CiAgICBpbml0X21vdXNlX3BvaW50ZXJfMl9vZmYoKTsKICAgIGluaXRfbW91c2VfcG9pbnRlcl8yKCk7CiAgICBpbml0X21vdXNlX3BvaW50ZXJfYmFuKCk7CiAgICBpbml0X21vdXNlX3BvaW50ZXJfY2xpY2soKTsKICAgIGluaXRfbW91c2VfcG9pbnRlcigpOwogICAgaW5pdF9tb3VzZV9yaWdodCgpOwogICAgaW5pdF9tb3ZlXzNkKCk7CiAgICBpbml0X21vdXNlKCk7CiAgICBpbml0X21vdmVfZGlhZ29uYWxfMigpOwogICAgaW5pdF9tb3ZlX2RpYWdvbmFsKCk7CiAgICBpbml0X21vdmVfZG93bl9yaWdodCgpOwogICAgaW5pdF9tb3ZlX2Rvd25fbGVmdCgpOwogICAgaW5pdF9tb3ZlX2Rvd24oKTsKICAgIGluaXRfbW92ZV9ob3Jpem9udGFsKCk7CiAgICBpbml0X21vdmVfcmlnaHQoKTsKICAgIGluaXRfbW92ZV9sZWZ0KCk7CiAgICBpbml0X21vdmVfdXBfbGVmdCgpOwogICAgaW5pdF9tb3ZlX3VwX3JpZ2h0KCk7CiAgICBpbml0X21vdmVfdXAoKTsKICAgIGluaXRfbW92ZV92ZXJ0aWNhbCgpOwogICAgaW5pdF9tb3ZlKCk7CiAgICBpbml0X211c2ljXzIoKTsKICAgIGluaXRfbXVzaWNfMygpOwogICAgaW5pdF9tdXNpY180KCk7CiAgICBpbml0X211c2ljKCk7CiAgICBpbml0X25hdmlnYXRpb25fMl9vZmYoKTsKICAgIGluaXRfbmF2aWdhdGlvbl8yKCk7CiAgICBpbml0X25hdmlnYXRpb25fb2ZmKCk7CiAgICBpbml0X25hdmlnYXRpb24oKTsKICAgIGluaXRfbmV0d29yazIoKTsKICAgIGluaXRfbmZjKCk7CiAgICBpbml0X25ld3NwYXBlcigpOwogICAgaW5pdF9ub25fYmluYXJ5KCk7CiAgICBpbml0X25vdGVib29rX3BlbigpOwogICAgaW5pdF9ub3RlYm9va190YWJzKCk7CiAgICBpbml0X25vdGVib29rX3RleHQoKTsKICAgIGluaXRfbm90ZXBhZF90ZXh0X2Rhc2hlZCgpOwogICAgaW5pdF9ub3RlcGFkX3RleHQoKTsKICAgIGluaXRfbm90ZWJvb2soKTsKICAgIGluaXRfbnV0X29mZigpOwogICAgaW5pdF9vY3RhZ29uX21pbnVzKCk7CiAgICBpbml0X251dCgpOwogICAgaW5pdF9vY3RhZ29uX2FsZXJ0KCk7CiAgICBpbml0X29jdGFnb25fcGF1c2UoKTsKICAgIGluaXRfb2N0YWdvbl94KCk7CiAgICBpbml0X29jdGFnb24oKTsKICAgIGluaXRfb21lZ2EoKTsKICAgIGluaXRfb3B0aW9uKCk7CiAgICBpbml0X29yYml0KCk7CiAgICBpbml0X29yaWdhbWkoKTsKICAgIGluaXRfcGFja2FnZV8yKCk7CiAgICBpbml0X3BhY2thZ2VfY2hlY2soKTsKICAgIGluaXRfcGFja2FnZV9taW51cygpOwogICAgaW5pdF9wYWNrYWdlX29wZW4oKTsKICAgIGluaXRfcGFja2FnZV9wbHVzKCk7CiAgICBpbml0X3BhY2thZ2Vfc2VhcmNoKCk7CiAgICBpbml0X3BhY2thZ2VfeCgpOwogICAgaW5pdF9wYWNrYWdlKCk7CiAgICBpbml0X3BhaW50X2J1Y2tldCgpOwogICAgaW5pdF9wYWludF9yb2xsZXIoKTsKICAgIGluaXRfcGFpbnRicnVzaF92ZXJ0aWNhbCgpOwogICAgaW5pdF9wYWludGJydXNoKCk7CiAgICBpbml0X3BhbGV0dGUoKTsKICAgIGluaXRfcGFuZGEoKTsKICAgIGluaXRfcGFuZWxfYm90dG9tX2Nsb3NlKCk7CiAgICBpbml0X3BhbmVsX2JvdHRvbV9kYXNoZWQoKTsKICAgIGluaXRfcGFuZWxfYm90dG9tX29wZW4oKTsKICAgIGluaXRfcGFuZWxfYm90dG9tKCk7CiAgICBpbml0X3BhbmVsX2xlZnRfY2xvc2UoKTsKICAgIGluaXRfcGFuZWxfbGVmdF9kYXNoZWQoKTsKICAgIGluaXRfcGFuZWxfbGVmdF9vcGVuKCk7CiAgICBpbml0X3BhbmVsX2xlZnRfcmlnaHRfZGFzaGVkKCk7CiAgICBpbml0X3BhbmVsX2xlZnQoKTsKICAgIGluaXRfcGFuZWxfcmlnaHRfY2xvc2UoKTsKICAgIGluaXRfcGFuZWxfcmlnaHRfZGFzaGVkKCk7CiAgICBpbml0X3BhbmVsX3JpZ2h0X29wZW4oKTsKICAgIGluaXRfcGFuZWxfcmlnaHQoKTsKICAgIGluaXRfcGFuZWxfdG9wX2JvdHRvbV9kYXNoZWQoKTsKICAgIGluaXRfcGFuZWxfdG9wX2Nsb3NlKCk7CiAgICBpbml0X3BhbmVsX3RvcF9vcGVuKCk7CiAgICBpbml0X3BhbmVsX3RvcF9kYXNoZWQoKTsKICAgIGluaXRfcGFuZWxfdG9wKCk7CiAgICBpbml0X3BhbmVsc19sZWZ0X2JvdHRvbSgpOwogICAgaW5pdF9wYW5lbHNfcmlnaHRfYm90dG9tKCk7CiAgICBpbml0X3BhbmVsc190b3BfbGVmdCgpOwogICAgaW5pdF9wYXBlcmNsaXAoKTsKICAgIGluaXRfcGFyZW50aGVzZXMoKTsKICAgIGluaXRfcGFya2luZ19tZXRlcigpOwogICAgaW5pdF9wYXJ0eV9wb3BwZXIoKTsKICAgIGluaXRfcGF1c2UoKTsKICAgIGluaXRfcGF3X3ByaW50KCk7CiAgICBpbml0X3BjX2Nhc2UoKTsKICAgIGluaXRfcGVuX2xpbmUoKTsKICAgIGluaXRfcGVuX29mZigpOwogICAgaW5pdF9wZW5fdG9vbCgpOwogICAgaW5pdF9wZW4oKTsKICAgIGluaXRfcGVuY2lsX2xpbmUoKTsKICAgIGluaXRfcGVuY2lsX29mZigpOwogICAgaW5pdF9wZW5jaWxfcnVsZXIoKTsKICAgIGluaXRfcGVuY2lsKCk7CiAgICBpbml0X3BlcmNlbnQoKTsKICAgIGluaXRfcGVudGFnb24oKTsKICAgIGluaXRfcGVyc29uX3N0YW5kaW5nKCk7CiAgICBpbml0X3BoaWxpcHBpbmVfcGVzbygpOwogICAgaW5pdF9waG9uZV9jYWxsKCk7CiAgICBpbml0X3Bob25lX2ZvcndhcmRlZCgpOwogICAgaW5pdF9waG9uZV9pbmNvbWluZygpOwogICAgaW5pdF9waG9uZV9taXNzZWQoKTsKICAgIGluaXRfcGhvbmVfb2ZmKCk7CiAgICBpbml0X3Bob25lX291dGdvaW5nKCk7CiAgICBpbml0X3Bob25lKCk7CiAgICBpbml0X3BpKCk7CiAgICBpbml0X3BpYW5vKCk7CiAgICBpbml0X3BpY2theGUoKTsKICAgIGluaXRfcGljdHVyZV9pbl9waWN0dXJlXzIoKTsKICAgIGluaXRfcGljdHVyZV9pbl9waWN0dXJlKCk7CiAgICBpbml0X3BpZ2d5X2JhbmsoKTsKICAgIGluaXRfcGlsY3Jvd19sZWZ0KCk7CiAgICBpbml0X3BpbGNyb3dfcmlnaHQoKTsKICAgIGluaXRfcGlsY3JvdygpOwogICAgaW5pdF9waWxsX2JvdHRsZSgpOwogICAgaW5pdF9waWxsKCk7CiAgICBpbml0X3Bpbl9vZmYoKTsKICAgIGluaXRfcGluKCk7CiAgICBpbml0X3BpcGV0dGUoKTsKICAgIGluaXRfcGl6emEoKTsKICAgIGluaXRfcGxhbmVfbGFuZGluZygpOwogICAgaW5pdF9wbGFuZV90YWtlb2ZmKCk7CiAgICBpbml0X3BsYW5lKCk7CiAgICBpbml0X3BsYXkoKTsKICAgIGluaXRfcGx1Z18yKCk7CiAgICBpbml0X3BsdWdfemFwKCk7CiAgICBpbml0X3BsdWcoKTsKICAgIGluaXRfcGx1cygpOwogICAgaW5pdF9wb2NrZXRfa25pZmUoKTsKICAgIGluaXRfcG9ja2V0KCk7CiAgICBpbml0X3BvZGNhc3QoKTsKICAgIGluaXRfcG9pbnRlcigpOwogICAgaW5pdF9wb2ludGVyX29mZigpOwogICAgaW5pdF9wb3Bjb3JuKCk7CiAgICBpbml0X3BvcHNpY2xlKCk7CiAgICBpbml0X3BvdW5kX3N0ZXJsaW5nKCk7CiAgICBpbml0X3Bvd2VyX29mZigpOwogICAgaW5pdF9wb3dlcigpOwogICAgaW5pdF9wcmVzZW50YXRpb24oKTsKICAgIGluaXRfcHJpbnRlcl9jaGVjaygpOwogICAgaW5pdF9wcmludGVyX3goKTsKICAgIGluaXRfcHJpbnRlcigpOwogICAgaW5pdF9wcm9qZWN0b3IoKTsKICAgIGluaXRfcHJvcG9ydGlvbnMoKTsKICAgIGluaXRfcHV6emxlKCk7CiAgICBpbml0X3B5cmFtaWQoKTsKICAgIGluaXRfcXJfY29kZSgpOwogICAgaW5pdF9yYWJiaXQoKTsKICAgIGluaXRfcXVvdGUoKTsKICAgIGluaXRfcmFkYXIoKTsKICAgIGluaXRfcmFkaWF0aW9uKCk7CiAgICBpbml0X3JhZGljYWwoKTsKICAgIGluaXRfcmFkaW9fcmVjZWl2ZXIoKTsKICAgIGluaXRfcmFkaW8oKTsKICAgIGluaXRfcmFkaW9fdG93ZXIoKTsKICAgIGluaXRfcmFkaXVzKCk7CiAgICBpbml0X3JhaWxfc3ltYm9sKCk7CiAgICBpbml0X3JhaW5ib3coKTsKICAgIGluaXRfcmF0KCk7CiAgICBpbml0X3JhdGlvKCk7CiAgICBpbml0X3JlY2VpcHRfZXVybygpOwogICAgaW5pdF9yZWNlaXB0X2NlbnQoKTsKICAgIGluaXRfcmVjZWlwdF9pbmRpYW5fcnVwZWUoKTsKICAgIGluaXRfcmVjZWlwdF9qYXBhbmVzZV95ZW4oKTsKICAgIGluaXRfcmVjZWlwdF9wb3VuZF9zdGVybGluZygpOwogICAgaW5pdF9yZWNlaXB0X3J1c3NpYW5fcnVibGUoKTsKICAgIGluaXRfcmVjZWlwdF90ZXh0KCk7CiAgICBpbml0X3JlY2VpcHRfc3dpc3NfZnJhbmMoKTsKICAgIGluaXRfcmVjZWlwdF90dXJraXNoX2xpcmEoKTsKICAgIGluaXRfcmVjZWlwdCgpOwogICAgaW5pdF9yZWN0YW5nbGVfY2lyY2xlKCk7CiAgICBpbml0X3JlY3RhbmdsZV9lbGxpcHNpcygpOwogICAgaW5pdF9yZWN0YW5nbGVfZ29nZ2xlcygpOwogICAgaW5pdF9yZWN0YW5nbGVfaG9yaXpvbnRhbCgpOwogICAgaW5pdF9yZWN5Y2xlKCk7CiAgICBpbml0X3JlY3RhbmdsZV92ZXJ0aWNhbCgpOwogICAgaW5pdF9yZWRvXzIoKTsKICAgIGluaXRfcmVkb19kb3QoKTsKICAgIGluaXRfcmVkbygpOwogICAgaW5pdF9yZWZyZXNoX2Njd19kb3QoKTsKICAgIGluaXRfcmVmcmVzaF9jY3coKTsKICAgIGluaXRfcmVmcmVzaF9jd19vZmYoKTsKICAgIGluaXRfcmVmcmVzaF9jdygpOwogICAgaW5pdF9yZWZyaWdlcmF0b3IoKTsKICAgIGluaXRfcmVnZXgoKTsKICAgIGluaXRfcmVtb3ZlX2Zvcm1hdHRpbmcoKTsKICAgIGluaXRfcmVwZWF0XzEoKTsKICAgIGluaXRfcmVwZWF0XzIoKTsKICAgIGluaXRfcmVwZWF0NCgpOwogICAgaW5pdF9yZXBsYWNlX2FsbCgpOwogICAgaW5pdF9yZXBsYWNlKCk7CiAgICBpbml0X3JlcGx5X2FsbCgpOwogICAgaW5pdF9yZXdpbmQoKTsKICAgIGluaXRfcmVwbHkoKTsKICAgIGluaXRfcmliYm9uKCk7CiAgICBpbml0X3JvY2tldCgpOwogICAgaW5pdF9yb2NraW5nX2NoYWlyKCk7CiAgICBpbml0X3JvbGxlcl9jb2FzdGVyKCk7CiAgICBpbml0X3Jvc2UoKTsKICAgIGluaXRfcm90YXRlXzNkKCk7CiAgICBpbml0X3JvdGF0ZV9jY3dfa2V5KCk7CiAgICBpbml0X3JvdGF0ZV9jY3dfc3F1YXJlKCk7CiAgICBpbml0X3JvdGF0ZV9jY3coKTsKICAgIGluaXRfcm90YXRlX2N3KCk7CiAgICBpbml0X3JvdGF0ZV9jd19zcXVhcmUoKTsKICAgIGluaXRfcm91dGUoKTsKICAgIGluaXRfcm91dGVfb2ZmKCk7CiAgICBpbml0X3JvdXRlcigpOwogICAgaW5pdF9yb3dzXzIoKTsKICAgIGluaXRfcm93c18zKCk7CiAgICBpbml0X3Jvd3NfNCgpOwogICAgaW5pdF9yc3MoKTsKICAgIGluaXRfcnVsZXJfZGltZW5zaW9uX2xpbmUoKTsKICAgIGluaXRfcnVsZXIoKTsKICAgIGluaXRfcnVzc2lhbl9ydWJsZSgpOwogICAgaW5pdF9zYWlsYm9hdCgpOwogICAgaW5pdF9zYWxhZCgpOwogICAgaW5pdF9zYW5kd2ljaCgpOwogICAgaW5pdF9zYXRlbGxpdGVfZGlzaCgpOwogICAgaW5pdF9zYXRlbGxpdGUoKTsKICAgIGluaXRfc2F1ZGlfcml5YWwoKTsKICAgIGluaXRfc2F2ZV9vZmYoKTsKICAgIGluaXRfc2F2ZV9hbGwoKTsKICAgIGluaXRfc2F2ZSgpOwogICAgaW5pdF9zY2FsZV8zZCgpOwogICAgaW5pdF9zY2FsZSgpOwogICAgaW5pdF9zY2FsaW5nKCk7CiAgICBpbml0X3NjYW5fYmFyY29kZSgpOwogICAgaW5pdF9zY2FuX2V5ZSgpOwogICAgaW5pdF9zY2FuX2ZhY2UoKTsKICAgIGluaXRfc2Nhbl9oZWFydCgpOwogICAgaW5pdF9zY2FuX2xpbmUoKTsKICAgIGluaXRfc2Nhbl9xcl9jb2RlKCk7CiAgICBpbml0X3NjYW5fc2VhcmNoKCk7CiAgICBpbml0X3NjYW5fdGV4dCgpOwogICAgaW5pdF9zY2FuMigpOwogICAgaW5pdF9zY2hvb2woKTsKICAgIGluaXRfc2Npc3NvcnNfbGluZV9kYXNoZWQoKTsKICAgIGluaXRfc2Npc3NvcnMoKTsKICAgIGluaXRfc2Nvb3RlcigpOwogICAgaW5pdF9zY3JlZW5fc2hhcmVfb2ZmKCk7CiAgICBpbml0X3NjcmVlbl9zaGFyZSgpOwogICAgaW5pdF9zY3JvbGxfdGV4dCgpOwogICAgaW5pdF9zY3JvbGwoKTsKICAgIGluaXRfc2VhcmNoX2FsZXJ0KCk7CiAgICBpbml0X3NlYXJjaF9jaGVjaygpOwogICAgaW5pdF9zZWFyY2hfY29kZSgpOwogICAgaW5pdF9zZWFyY2hfeCgpOwogICAgaW5pdF9zZWFyY2hfc2xhc2goKTsKICAgIGluaXRfc2VjdGlvbigpOwogICAgaW5pdF9zZWFyY2goKTsKICAgIGluaXRfc2VuZF9ob3Jpem9udGFsKCk7CiAgICBpbml0X3NlbmRfdG9fYmFjaygpOwogICAgaW5pdF9zZW5kKCk7CiAgICBpbml0X3NlcGFyYXRvcl9ob3Jpem9udGFsKCk7CiAgICBpbml0X3NlcGFyYXRvcl92ZXJ0aWNhbCgpOwogICAgaW5pdF9zZXJ2ZXJfY29nKCk7CiAgICBpbml0X3NlcnZlcl9jcmFzaCgpOwogICAgaW5pdF9zZXJ2ZXJfb2ZmKCk7CiAgICBpbml0X3NlcnZlcigpOwogICAgaW5pdF9zZXR0aW5nc18yKCk7CiAgICBpbml0X3NldHRpbmdzKCk7CiAgICBpbml0X3NoYXBlcygpOwogICAgaW5pdF9zaGFyZV8yKCk7CiAgICBpbml0X3NoYXJlMigpOwogICAgaW5pdF9zaGVldCgpOwogICAgaW5pdF9zaGVsbCgpOwogICAgaW5pdF9zaGVsdmluZ191bml0KCk7CiAgICBpbml0X3NoaWVsZF9hbGVydCgpOwogICAgaW5pdF9zaGllbGRfYmFuKCk7CiAgICBpbml0X3NoaWVsZF9lbGxpcHNpcygpOwogICAgaW5pdF9zaGllbGRfY2hlY2soKTsKICAgIGluaXRfc2hpZWxkX2hhbGYoKTsKICAgIGluaXRfc2hpZWxkX21pbnVzKCk7CiAgICBpbml0X3NoaWVsZF9vZmYoKTsKICAgIGluaXRfc2hpZWxkX3BsdXMoKTsKICAgIGluaXRfc2hpZWxkX3F1ZXN0aW9uX21hcmsoKTsKICAgIGluaXRfc2hpZWxkX3VzZXIoKTsKICAgIGluaXRfc2hpZWxkX3goKTsKICAgIGluaXRfc2hpcF93aGVlbCgpOwogICAgaW5pdF9zaGllbGQoKTsKICAgIGluaXRfc2hpcCgpOwogICAgaW5pdF9zaGlydCgpOwogICAgaW5pdF9zaG9wcGluZ19iYWcoKTsKICAgIGluaXRfc2hvcHBpbmdfYmFza2V0KCk7CiAgICBpbml0X3Nob3BwaW5nX2NhcnQoKTsKICAgIGluaXRfc2hvdmVsKCk7CiAgICBpbml0X3Nob3dlcl9oZWFkKCk7CiAgICBpbml0X3NocmVkZGVyKCk7CiAgICBpbml0X3NocmltcCgpOwogICAgaW5pdF9zaHJpbmsoKTsKICAgIGluaXRfc2hydWIoKTsKICAgIGluaXRfc2h1ZmZsZSgpOwogICAgaW5pdF9zaWdtYSgpOwogICAgaW5pdF9zaWduYWxfaGlnaCgpOwogICAgaW5pdF9zaWduYWxfbG93KCk7CiAgICBpbml0X3NpZ25hbF9tZWRpdW0oKTsKICAgIGluaXRfc2lnbmFsX3plcm8oKTsKICAgIGluaXRfc2lnbmFsKCk7CiAgICBpbml0X3NpZ25hdHVyZSgpOwogICAgaW5pdF9zaWducG9zdCgpOwogICAgaW5pdF9zaXJlbigpOwogICAgaW5pdF9zaWducG9zdF9iaWcoKTsKICAgIGluaXRfc2tpcF9iYWNrKCk7CiAgICBpbml0X3NraXBfZm9yd2FyZCgpOwogICAgaW5pdF9zbGFjaygpOwogICAgaW5pdF9zbGFzaCgpOwogICAgaW5pdF9za3VsbCgpOwogICAgaW5pdF9zbGljZSgpOwogICAgaW5pdF9zbGlkZXJzX3ZlcnRpY2FsKCk7CiAgICBpbml0X3NsaWRlcnNfaG9yaXpvbnRhbCgpOwogICAgaW5pdF9zbWFydHBob25lX2NoYXJnaW5nKCk7CiAgICBpbml0X3NtYXJ0cGhvbmVfbmZjKCk7CiAgICBpbml0X3NtYXJ0cGhvbmUoKTsKICAgIGluaXRfc21pbGVfcGx1cygpOwogICAgaW5pdF9zbWlsZSgpOwogICAgaW5pdF9zbm93Zmxha2UoKTsKICAgIGluaXRfc29hcF9kaXNwZW5zZXJfZHJvcGxldCgpOwogICAgaW5pdF9zbmFpbCgpOwogICAgaW5pdF9zb2ZhKCk7CiAgICBpbml0X3NvbGFyX3BhbmVsKCk7CiAgICBpbml0X3NvdXAoKTsKICAgIGluaXRfc3BhY2UoKTsKICAgIGluaXRfc3BhZGUoKTsKICAgIGluaXRfc3BhcmtsZSgpOwogICAgaW5pdF9zcGFya2xlcygpOwogICAgaW5pdF9zcGVha2VyKCk7CiAgICBpbml0X3NwZWVjaCgpOwogICAgaW5pdF9zcGVsbF9jaGVja18yKCk7CiAgICBpbml0X3NwbGluZV9wb2ludGVyKCk7CiAgICBpbml0X3NwZWxsX2NoZWNrKCk7CiAgICBpbml0X3NwbGluZSgpOwogICAgaW5pdF9zcGxpdCgpOwogICAgaW5pdF9zcG9vbCgpOwogICAgaW5pdF9zcHJheV9jYW4oKTsKICAgIGluaXRfc3BvdGxpZ2h0KCk7CiAgICBpbml0X3Nwcm91dCgpOwogICAgaW5pdF9zcXVhcmVfYXJyb3dfZG93bl9sZWZ0KCk7CiAgICBpbml0X3NxdWFyZV9hY3Rpdml0eSgpOwogICAgaW5pdF9zcXVhcmVfYXJyb3dfZG93bl9yaWdodCgpOwogICAgaW5pdF9zcXVhcmVfYXJyb3dfZG93bigpOwogICAgaW5pdF9zcXVhcmVfYXJyb3dfbGVmdCgpOwogICAgaW5pdF9zcXVhcmVfYXJyb3dfb3V0X2Rvd25fbGVmdCgpOwogICAgaW5pdF9zcXVhcmVfYXJyb3dfb3V0X2Rvd25fcmlnaHQoKTsKICAgIGluaXRfc3F1YXJlX2Fycm93X291dF91cF9sZWZ0KCk7CiAgICBpbml0X3NxdWFyZV9hcnJvd19vdXRfdXBfcmlnaHQoKTsKICAgIGluaXRfc3F1YXJlX2Fycm93X3JpZ2h0X2VudGVyKCk7CiAgICBpbml0X3NxdWFyZV9hcnJvd19yaWdodF9leGl0KCk7CiAgICBpbml0X3NxdWFyZV9hcnJvd19yaWdodCgpOwogICAgaW5pdF9zcXVhcmVfYXJyb3dfdXBfbGVmdCgpOwogICAgaW5pdF9zcXVhcmVfYXJyb3dfdXBfcmlnaHQoKTsKICAgIGluaXRfc3F1YXJlX2Fycm93X3VwKCk7CiAgICBpbml0X3NxdWFyZV9jZW50ZXJsaW5lX2Rhc2hlZF9ob3Jpem9udGFsKCk7CiAgICBpbml0X3NxdWFyZV9hc3RlcmlzaygpOwogICAgaW5pdF9zcXVhcmVfYm90dG9tX2Rhc2hlZF9zY2lzc29ycygpOwogICAgaW5pdF9zcXVhcmVfY2VudGVybGluZV9kYXNoZWRfdmVydGljYWwoKTsKICAgIGluaXRfc3F1YXJlX2NoYXJ0X2dhbnR0KCk7CiAgICBpbml0X3NxdWFyZV9jaGVja19iaWcoKTsKICAgIGluaXRfc3F1YXJlX2NoZWNrKCk7CiAgICBpbml0X3NxdWFyZV9jaGV2cm9uX2Rvd24oKTsKICAgIGluaXRfc3F1YXJlX2NoZXZyb25fbGVmdCgpOwogICAgaW5pdF9zcXVhcmVfY2hldnJvbl9yaWdodCgpOwogICAgaW5pdF9zcXVhcmVfY2hldnJvbl91cCgpOwogICAgaW5pdF9zcXVhcmVfY29kZSgpOwogICAgaW5pdF9zcXVhcmVfZGFzaGVkX2JvdHRvbV9jb2RlKCk7CiAgICBpbml0X3NxdWFyZV9kYXNoZWRfYm90dG9tKCk7CiAgICBpbml0X3NxdWFyZV9kYXNoZWRfa2FuYmFuKCk7CiAgICBpbml0X3NxdWFyZV9kYXNoZWRfbW91c2VfcG9pbnRlcigpOwogICAgaW5pdF9zcXVhcmVfZGFzaGVkX3RvcF9zb2xpZCgpOwogICAgaW5pdF9zcXVhcmVfZGFzaGVkKCk7CiAgICBpbml0X3NxdWFyZV9kaXZpZGUoKTsKICAgIGluaXRfc3F1YXJlX2RvdCgpOwogICAgaW5pdF9zcXVhcmVfZXF1YWwoKTsKICAgIGluaXRfc3F1YXJlX2Z1bmN0aW9uKCk7CiAgICBpbml0X3NxdWFyZV9rYW5iYW4oKTsKICAgIGluaXRfc3F1YXJlX2xpYnJhcnkoKTsKICAgIGluaXRfc3F1YXJlX20oKTsKICAgIGluaXRfc3F1YXJlX21lbnUoKTsKICAgIGluaXRfc3F1YXJlX21pbnVzKCk7CiAgICBpbml0X3NxdWFyZV9tb3VzZV9wb2ludGVyKCk7CiAgICBpbml0X3NxdWFyZV9wYXJraW5nX29mZigpOwogICAgaW5pdF9zcXVhcmVfcGFya2luZygpOwogICAgaW5pdF9zcXVhcmVfcGF1c2UoKTsKICAgIGluaXRfc3F1YXJlX3BlbigpOwogICAgaW5pdF9zcXVhcmVfcGVyY2VudCgpOwogICAgaW5pdF9zcXVhcmVfcGkoKTsKICAgIGluaXRfc3F1YXJlX3BpbGNyb3coKTsKICAgIGluaXRfc3F1YXJlX3BsYXkoKTsKICAgIGluaXRfc3F1YXJlX3BsdXMoKTsKICAgIGluaXRfc3F1YXJlX3Bvd2VyKCk7CiAgICBpbml0X3NxdWFyZV9yYWRpY2FsKCk7CiAgICBpbml0X3NxdWFyZV9yb3VuZF9jb3JuZXIoKTsKICAgIGluaXRfc3F1YXJlX3NjaXNzb3JzKCk7CiAgICBpbml0X3NxdWFyZV9zaWdtYSgpOwogICAgaW5pdF9zcXVhcmVfc2xhc2goKTsKICAgIGluaXRfc3F1YXJlX3NwbGl0X2hvcml6b250YWwoKTsKICAgIGluaXRfc3F1YXJlX3NwbGl0X3ZlcnRpY2FsKCk7CiAgICBpbml0X3NxdWFyZV9zcXVhcmUoKTsKICAgIGluaXRfc3F1YXJlX3N0YWNrKCk7CiAgICBpbml0X3NxdWFyZV9zdGFyKCk7CiAgICBpbml0X3NxdWFyZV9zdG9wKCk7CiAgICBpbml0X3NxdWFyZV91c2VyX3JvdW5kKCk7CiAgICBpbml0X3NxdWFyZV90ZXJtaW5hbCgpOwogICAgaW5pdF9zcXVhcmVfdXNlcigpOwogICAgaW5pdF9zcXVhcmVfeCgpOwogICAgaW5pdF9zcXVhcmUoKTsKICAgIGluaXRfc3F1YXJlc19leGNsdWRlKCk7CiAgICBpbml0X3NxdWFyZXNfaW50ZXJzZWN0KCk7CiAgICBpbml0X3NxdWFyZXNfc3VidHJhY3QoKTsKICAgIGluaXRfc3F1YXJlc191bml0ZSgpOwogICAgaW5pdF9zcXVpcmNsZV9kYXNoZWQoKTsKICAgIGluaXRfc3F1aXJjbGUoKTsKICAgIGluaXRfc3RhbXAoKTsKICAgIGluaXRfc3F1aXJyZWwoKTsKICAgIGluaXRfc3Rhcl9oYWxmKCk7CiAgICBpbml0X3N0YXJfb2ZmKCk7CiAgICBpbml0X3N0YXIoKTsKICAgIGluaXRfc3RlcF9iYWNrKCk7CiAgICBpbml0X3N0ZXBfZm9yd2FyZCgpOwogICAgaW5pdF9zdGV0aG9zY29wZSgpOwogICAgaW5pdF9zdGlja2VyKCk7CiAgICBpbml0X3N0aWNreV9ub3RlKCk7CiAgICBpbml0X3N0b25lKCk7CiAgICBpbml0X3N0b3JlKCk7CiAgICBpbml0X3N0cmV0Y2hfaG9yaXpvbnRhbCgpOwogICAgaW5pdF9zdHJldGNoX3ZlcnRpY2FsKCk7CiAgICBpbml0X3N0cmlrZXRocm91Z2goKTsKICAgIGluaXRfc3Vic2NyaXB0KCk7CiAgICBpbml0X3N1bl9kaW0oKTsKICAgIGluaXRfc3VuX21lZGl1bSgpOwogICAgaW5pdF9zdW5fbW9vbigpOwogICAgaW5pdF9zdW5fc25vdygpOwogICAgaW5pdF9zdW4oKTsKICAgIGluaXRfc3VucmlzZSgpOwogICAgaW5pdF9zdW5zZXQoKTsKICAgIGluaXRfc3VwZXJzY3JpcHQoKTsKICAgIGluaXRfc3dhdGNoX2Jvb2soKTsKICAgIGluaXRfc3dpdGNoX2NhbWVyYSgpOwogICAgaW5pdF9zd2lzc19mcmFuYygpOwogICAgaW5pdF9zd29yZCgpOwogICAgaW5pdF90YWJsZV8yKCk7CiAgICBpbml0X3RhYmxlX2NlbGxzX21lcmdlKCk7CiAgICBpbml0X3N3b3JkcygpOwogICAgaW5pdF9zeXJpbmdlKCk7CiAgICBpbml0X3RhYmxlX2NlbGxzX3NwbGl0KCk7CiAgICBpbml0X3RhYmxlX2NvbHVtbnNfc3BsaXQoKTsKICAgIGluaXRfdGFibGVfb2ZfY29udGVudHMoKTsKICAgIGluaXRfdGFibGVfcHJvcGVydGllcygpOwogICAgaW5pdF90YWJsZV9yb3dzX3NwbGl0KCk7CiAgICBpbml0X3RhYmxlMigpOwogICAgaW5pdF90YWJsZXRfc21hcnRwaG9uZSgpOwogICAgaW5pdF90YWJsZXQoKTsKICAgIGluaXRfdGFibGV0cygpOwogICAgaW5pdF90YWcoKTsKICAgIGluaXRfdGFncygpOwogICAgaW5pdF90YWxseV8xKCk7CiAgICBpbml0X3RhbGx5XzIoKTsKICAgIGluaXRfdGFsbHlfMygpOwogICAgaW5pdF90YWxseV80KCk7CiAgICBpbml0X3RhbGx5XzUoKTsKICAgIGluaXRfdGFuZ2VudCgpOwogICAgaW5pdF90YXJnZXQoKTsKICAgIGluaXRfdGVsZXNjb3BlKCk7CiAgICBpbml0X3RlbnRfdHJlZSgpOwogICAgaW5pdF90ZW50KCk7CiAgICBpbml0X3Rlcm1pbmFsKCk7CiAgICBpbml0X3Rlc3RfdHViZV9kaWFnb25hbCgpOwogICAgaW5pdF90ZXN0X3R1YmUoKTsKICAgIGluaXRfdGVzdF90dWJlcygpOwogICAgaW5pdF90ZXh0X2FsaWduX2NlbnRlcigpOwogICAgaW5pdF90ZXh0X2FsaWduX2VuZCgpOwogICAgaW5pdF90ZXh0X2FsaWduX2p1c3RpZnkoKTsKICAgIGluaXRfdGV4dF9hbGlnbl9zdGFydCgpOwogICAgaW5pdF90ZXh0X2N1cnNvcl9pbnB1dCgpOwogICAgaW5pdF90ZXh0X2N1cnNvcigpOwogICAgaW5pdF90ZXh0X2luaXRpYWwoKTsKICAgIGluaXRfdGV4dF9xdW90ZSgpOwogICAgaW5pdF90ZXh0X3NlYXJjaCgpOwogICAgaW5pdF90ZXh0X3NlbGVjdCgpOwogICAgaW5pdF90ZXh0X3dyYXAoKTsKICAgIGluaXRfdGhlYXRlcigpOwogICAgaW5pdF90aGVybW9tZXRlcl9zbm93Zmxha2UoKTsKICAgIGluaXRfdGhlcm1vbWV0ZXJfc3VuKCk7CiAgICBpbml0X3RoZXJtb21ldGVyKCk7CiAgICBpbml0X3RodW1ic19kb3duKCk7CiAgICBpbml0X3RodW1ic191cCgpOwogICAgaW5pdF90aWNrZXRfY2hlY2soKTsKICAgIGluaXRfdGlja2V0X21pbnVzKCk7CiAgICBpbml0X3RpY2tldF9wZXJjZW50KCk7CiAgICBpbml0X3RpY2tldF9wbHVzKCk7CiAgICBpbml0X3RpY2tldF9zbGFzaCgpOwogICAgaW5pdF90aWNrZXRfeCgpOwogICAgaW5pdF90aWNrZXQoKTsKICAgIGluaXRfdGlja2V0c19wbGFuZSgpOwogICAgaW5pdF90aWNrZXRzKCk7CiAgICBpbml0X3RpbWVyX3Jlc2V0KCk7CiAgICBpbml0X3RpbWVyX29mZigpOwogICAgaW5pdF90aW1lcjIoKTsKICAgIGluaXRfdG9nZ2xlX2xlZnQoKTsKICAgIGluaXRfdG9pbGV0KCk7CiAgICBpbml0X3RvZ2dsZV9yaWdodCgpOwogICAgaW5pdF90b29sX2Nhc2UoKTsKICAgIGluaXRfdG9vbGJveCgpOwogICAgaW5pdF90b3JuYWRvKCk7CiAgICBpbml0X3RvcnVzKCk7CiAgICBpbml0X3RvdWNocGFkX29mZigpOwogICAgaW5pdF90b3VjaHBhZCgpOwogICAgaW5pdF90b3dlbF9yYWNrKCk7CiAgICBpbml0X3Rvd2VyX2NvbnRyb2woKTsKICAgIGluaXRfdG95X2JyaWNrKCk7CiAgICBpbml0X3RyYWN0b3IoKTsKICAgIGluaXRfdHJhZmZpY19jb25lKCk7CiAgICBpbml0X3RyYWluX2Zyb250X3R1bm5lbCgpOwogICAgaW5pdF90cmFpbl9mcm9udCgpOwogICAgaW5pdF90cmFpbl90cmFjaygpOwogICAgaW5pdF90cmFtX2Zyb250KCk7CiAgICBpbml0X3RyYW5zZ2VuZGVyKCk7CiAgICBpbml0X3RyYXNoXzIoKTsKICAgIGluaXRfdHJhc2goKTsKICAgIGluaXRfdHJlZV9wYWxtKCk7CiAgICBpbml0X3RyZWVfZGVjaWR1b3VzKCk7CiAgICBpbml0X3RyZWVfcGluZSgpOwogICAgaW5pdF90cmVlcygpOwogICAgaW5pdF90cmVsbG8oKTsKICAgIGluaXRfdHJlbmRpbmdfZG93bigpOwogICAgaW5pdF90cmVuZGluZ191cF9kb3duKCk7CiAgICBpbml0X3RyZW5kaW5nX3VwKCk7CiAgICBpbml0X3RyaWFuZ2xlX2FsZXJ0KCk7CiAgICBpbml0X3RyaWFuZ2xlX2Rhc2hlZCgpOwogICAgaW5pdF90cmlhbmdsZV9yaWdodCgpOwogICAgaW5pdF90cmlhbmdsZSgpOwogICAgaW5pdF90cm9waHkoKTsKICAgIGluaXRfdHJ1Y2tfZWxlY3RyaWMoKTsKICAgIGluaXRfdHJ1Y2soKTsKICAgIGluaXRfdHVya2lzaF9saXJhKCk7CiAgICBpbml0X3R1cm50YWJsZSgpOwogICAgaW5pdF90dXJ0bGUoKTsKICAgIGluaXRfdHZfbWluaW1hbF9wbGF5KCk7CiAgICBpbml0X3R2X21pbmltYWwoKTsKICAgIGluaXRfdHYoKTsKICAgIGluaXRfdHdpdGNoKCk7CiAgICBpbml0X3R3aXR0ZXIoKTsKICAgIGluaXRfdHlwZV9vdXRsaW5lKCk7CiAgICBpbml0X3R5cGUoKTsKICAgIGluaXRfdW1icmVsbGEoKTsKICAgIGluaXRfdW1icmVsbGFfb2ZmKCk7CiAgICBpbml0X3VuZGVybGluZSgpOwogICAgaW5pdF91bmRvXzIoKTsKICAgIGluaXRfdW5kb19kb3QoKTsKICAgIGluaXRfdW5kbygpOwogICAgaW5pdF91bmZvbGRfaG9yaXpvbnRhbCgpOwogICAgaW5pdF91bmZvbGRfdmVydGljYWwoKTsKICAgIGluaXRfdW5ncm91cCgpOwogICAgaW5pdF91bml2ZXJzaXR5KCk7CiAgICBpbml0X3VubGluaygpOwogICAgaW5pdF91bnBsdWcoKTsKICAgIGluaXRfdW5saW5rXzIoKTsKICAgIGluaXRfdXBsb2FkKCk7CiAgICBpbml0X3VzYigpOwogICAgaW5pdF91c2VyX2NoZWNrKCk7CiAgICBpbml0X3VzZXJfY29nKCk7CiAgICBpbml0X3VzZXJfa2V5KCk7CiAgICBpbml0X3VzZXJfbG9jaygpOwogICAgaW5pdF91c2VyX21pbnVzKCk7CiAgICBpbml0X3VzZXJfcGx1cygpOwogICAgaW5pdF91c2VyX3BlbigpOwogICAgaW5pdF91c2VyX3JvdW5kX2NoZWNrKCk7CiAgICBpbml0X3VzZXJfcm91bmRfY29nKCk7CiAgICBpbml0X3VzZXJfcm91bmRfa2V5KCk7CiAgICBpbml0X3VzZXJfcm91bmRfbWludXMoKTsKICAgIGluaXRfdXNlcl9yb3VuZF9wZW4oKTsKICAgIGluaXRfdXNlcl9yb3VuZF9wbHVzKCk7CiAgICBpbml0X3VzZXJfcm91bmRfc2VhcmNoKCk7CiAgICBpbml0X3VzZXJfcm91bmQoKTsKICAgIGluaXRfdXNlcl9yb3VuZF94KCk7CiAgICBpbml0X3VzZXJfc2VhcmNoKCk7CiAgICBpbml0X3VzZXJfc3RhcigpOwogICAgaW5pdF91c2VyX3goKTsKICAgIGluaXRfdXNlcigpOwogICAgaW5pdF91c2Vyc19yb3VuZCgpOwogICAgaW5pdF91dGVuc2lsc19jcm9zc2VkKCk7CiAgICBpbml0X3VzZXJzKCk7CiAgICBpbml0X3V0aWxpdHlfcG9sZSgpOwogICAgaW5pdF91dGVuc2lscygpOwogICAgaW5pdF92YW4oKTsKICAgIGluaXRfdmFyaWFibGUoKTsKICAgIGluaXRfdmVjdG9yX3NxdWFyZSgpOwogICAgaW5pdF92YXVsdCgpOwogICAgaW5pdF92ZWdhbigpOwogICAgaW5pdF92ZW5ldGlhbl9tYXNrKCk7CiAgICBpbml0X3ZlbnVzX2FuZF9tYXJzKCk7CiAgICBpbml0X3ZlbnVzKCk7CiAgICBpbml0X3ZpYnJhdGVfb2ZmKCk7CiAgICBpbml0X3ZpYnJhdGUoKTsKICAgIGluaXRfdmlkZW9fb2ZmKCk7CiAgICBpbml0X3ZpZGVvKCk7CiAgICBpbml0X3ZpZGVvdGFwZSgpOwogICAgaW5pdF92aWV3KCk7CiAgICBpbml0X3ZvaWNlbWFpbCgpOwogICAgaW5pdF92b2xsZXliYWxsKCk7CiAgICBpbml0X3ZvbHVtZV8xKCk7CiAgICBpbml0X3ZvbHVtZV8yKCk7CiAgICBpbml0X3ZvbHVtZV94KCk7CiAgICBpbml0X3ZvbHVtZV9vZmYoKTsKICAgIGluaXRfdm9sdW1lKCk7CiAgICBpbml0X3dhbGxldF9jYXJkcygpOwogICAgaW5pdF92b3RlKCk7CiAgICBpbml0X3dhbGxldF9taW5pbWFsKCk7CiAgICBpbml0X3dhbGxldCgpOwogICAgaW5pdF93YWxscGFwZXIoKTsKICAgIGluaXRfd2FuZF9zcGFya2xlcygpOwogICAgaW5pdF93YW5kKCk7CiAgICBpbml0X3dhcmVob3VzZSgpOwogICAgaW5pdF93YXNoaW5nX21hY2hpbmUoKTsKICAgIGluaXRfd2F0Y2goKTsKICAgIGluaXRfd2F2ZXNfYXJyb3dfZG93bigpOwogICAgaW5pdF93YXZlc19sYWRkZXIoKTsKICAgIGluaXRfd2F2ZXNfYXJyb3dfdXAoKTsKICAgIGluaXRfd2F2ZXMoKTsKICAgIGluaXRfd2F5cG9pbnRzKCk7CiAgICBpbml0X3dlYmNhbSgpOwogICAgaW5pdF93ZWJob29rX29mZigpOwogICAgaW5pdF93ZWJob29rKCk7CiAgICBpbml0X3dlaWdodF90aWxkZSgpOwogICAgaW5pdF93aGVhdF9vZmYoKTsKICAgIGluaXRfd2VpZ2h0KCk7CiAgICBpbml0X3doZWF0KCk7CiAgICBpbml0X3dob2xlX3dvcmQoKTsKICAgIGluaXRfd2lmaV9jb2coKTsKICAgIGluaXRfd2lmaV9oaWdoKCk7CiAgICBpbml0X3dpZmlfbG93KCk7CiAgICBpbml0X3dpZmlfcGVuKCk7CiAgICBpbml0X3dpZmlfb2ZmKCk7CiAgICBpbml0X3dpZmlfemVybygpOwogICAgaW5pdF93aWZpX3N5bmMoKTsKICAgIGluaXRfd2lmaSgpOwogICAgaW5pdF93aW5kX2Fycm93X2Rvd24oKTsKICAgIGluaXRfd2luZCgpOwogICAgaW5pdF93aW5lX29mZigpOwogICAgaW5pdF93aW5lKCk7CiAgICBpbml0X3dvcmtmbG93KCk7CiAgICBpbml0X3dvcm0oKTsKICAgIGluaXRfd3JlbmNoKCk7CiAgICBpbml0X3hfbGluZV90b3AoKTsKICAgIGluaXRfeCgpOwogICAgaW5pdF95b3V0dWJlKCk7CiAgICBpbml0X3phcF9vZmYoKTsKICAgIGluaXRfemFwKCk7CiAgICBpbml0X3pvZGlhY19hcXVhcml1cygpOwogICAgaW5pdF96b2RpYWNfYXJpZXMoKTsKICAgIGluaXRfem9kaWFjX2NhbmNlcigpOwogICAgaW5pdF96b2RpYWNfY2Fwcmljb3JuKCk7CiAgICBpbml0X3pvZGlhY19sZW8oKTsKICAgIGluaXRfem9kaWFjX2dlbWluaSgpOwogICAgaW5pdF96b2RpYWNfbGlicmEoKTsKICAgIGluaXRfem9kaWFjX29waGl1Y2h1cygpOwogICAgaW5pdF96b2RpYWNfcGlzY2VzKCk7CiAgICBpbml0X3pvZGlhY19zYWdpdHRhcml1cygpOwogICAgaW5pdF96b2RpYWNfc2NvcnBpbygpOwogICAgaW5pdF96b2RpYWNfdGF1cnVzKCk7CiAgICBpbml0X3pvZGlhY192aXJnbygpOwogICAgaW5pdF96b29tX2luKCk7CiAgICBpbml0X3pvb21fb3V0KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2x1Y2lkZS5qcwp2YXIgbHVjaWRlX2V4cG9ydHMgPSB7fTsKX19leHBvcnQobHVjaWRlX2V4cG9ydHMsIHsKICBBQXJyb3dEb3duOiAoKSA9PiBBQXJyb3dEb3duLAogIEFBcnJvd1VwOiAoKSA9PiBBQXJyb3dVcCwKICBBTGFyZ2VTbWFsbDogKCkgPT4gQUxhcmdlU21hbGwsCiAgQWNjZXNzaWJpbGl0eTogKCkgPT4gQWNjZXNzaWJpbGl0eSwKICBBY3Rpdml0eTogKCkgPT4gQWN0aXZpdHksCiAgQWN0aXZpdHlTcXVhcmU6ICgpID0+IFNxdWFyZUFjdGl2aXR5LAogIEFpclZlbnQ6ICgpID0+IEFpclZlbnQsCiAgQWlycGxheTogKCkgPT4gQWlycGxheSwKICBBbGFybUNoZWNrOiAoKSA9PiBBbGFybUNsb2NrQ2hlY2ssCiAgQWxhcm1DbG9jazogKCkgPT4gQWxhcm1DbG9jaywKICBBbGFybUNsb2NrQ2hlY2s6ICgpID0+IEFsYXJtQ2xvY2tDaGVjaywKICBBbGFybUNsb2NrTWludXM6ICgpID0+IEFsYXJtQ2xvY2tNaW51cywKICBBbGFybUNsb2NrT2ZmOiAoKSA9PiBBbGFybUNsb2NrT2ZmLAogIEFsYXJtQ2xvY2tQbHVzOiAoKSA9PiBBbGFybUNsb2NrUGx1cywKICBBbGFybU1pbnVzOiAoKSA9PiBBbGFybUNsb2NrTWludXMsCiAgQWxhcm1QbHVzOiAoKSA9PiBBbGFybUNsb2NrUGx1cywKICBBbGFybVNtb2tlOiAoKSA9PiBBbGFybVNtb2tlLAogIEFsYnVtOiAoKSA9PiBBbGJ1bSwKICBBbGVydENpcmNsZTogKCkgPT4gQ2lyY2xlQWxlcnQsCiAgQWxlcnRPY3RhZ29uOiAoKSA9PiBPY3RhZ29uQWxlcnQsCiAgQWxlcnRUcmlhbmdsZTogKCkgPT4gVHJpYW5nbGVBbGVydCwKICBBbGlnbkNlbnRlcjogKCkgPT4gVGV4dEFsaWduQ2VudGVyLAogIEFsaWduQ2VudGVySG9yaXpvbnRhbDogKCkgPT4gQWxpZ25DZW50ZXJIb3Jpem9udGFsLAogIEFsaWduQ2VudGVyVmVydGljYWw6ICgpID0+IEFsaWduQ2VudGVyVmVydGljYWwsCiAgQWxpZ25FbmRIb3Jpem9udGFsOiAoKSA9PiBBbGlnbkVuZEhvcml6b250YWwsCiAgQWxpZ25FbmRWZXJ0aWNhbDogKCkgPT4gQWxpZ25FbmRWZXJ0aWNhbCwKICBBbGlnbkhvcml6b250YWxEaXN0cmlidXRlQ2VudGVyOiAoKSA9PiBBbGlnbkhvcml6b250YWxEaXN0cmlidXRlQ2VudGVyLAogIEFsaWduSG9yaXpvbnRhbERpc3RyaWJ1dGVFbmQ6ICgpID0+IEFsaWduSG9yaXpvbnRhbERpc3RyaWJ1dGVFbmQsCiAgQWxpZ25Ib3Jpem9udGFsRGlzdHJpYnV0ZVN0YXJ0OiAoKSA9PiBBbGlnbkhvcml6b250YWxEaXN0cmlidXRlU3RhcnQsCiAgQWxpZ25Ib3Jpem9udGFsSnVzdGlmeUNlbnRlcjogKCkgPT4gQWxpZ25Ib3Jpem9udGFsSnVzdGlmeUNlbnRlciwKICBBbGlnbkhvcml6b250YWxKdXN0aWZ5RW5kOiAoKSA9PiBBbGlnbkhvcml6b250YWxKdXN0aWZ5RW5kLAogIEFsaWduSG9yaXpvbnRhbEp1c3RpZnlTdGFydDogKCkgPT4gQWxpZ25Ib3Jpem9udGFsSnVzdGlmeVN0YXJ0LAogIEFsaWduSG9yaXpvbnRhbFNwYWNlQXJvdW5kOiAoKSA9PiBBbGlnbkhvcml6b250YWxTcGFjZUFyb3VuZCwKICBBbGlnbkhvcml6b250YWxTcGFjZUJldHdlZW46ICgpID0+IEFsaWduSG9yaXpvbnRhbFNwYWNlQmV0d2VlbiwKICBBbGlnbkp1c3RpZnk6ICgpID0+IFRleHRBbGlnbkp1c3RpZnksCiAgQWxpZ25MZWZ0OiAoKSA9PiBUZXh0QWxpZ25TdGFydCwKICBBbGlnblJpZ2h0OiAoKSA9PiBUZXh0QWxpZ25FbmQsCiAgQWxpZ25TdGFydEhvcml6b250YWw6ICgpID0+IEFsaWduU3RhcnRIb3Jpem9udGFsLAogIEFsaWduU3RhcnRWZXJ0aWNhbDogKCkgPT4gQWxpZ25TdGFydFZlcnRpY2FsLAogIEFsaWduVmVydGljYWxEaXN0cmlidXRlQ2VudGVyOiAoKSA9PiBBbGlnblZlcnRpY2FsRGlzdHJpYnV0ZUNlbnRlciwKICBBbGlnblZlcnRpY2FsRGlzdHJpYnV0ZUVuZDogKCkgPT4gQWxpZ25WZXJ0aWNhbERpc3RyaWJ1dGVFbmQsCiAgQWxpZ25WZXJ0aWNhbERpc3RyaWJ1dGVTdGFydDogKCkgPT4gQWxpZ25WZXJ0aWNhbERpc3RyaWJ1dGVTdGFydCwKICBBbGlnblZlcnRpY2FsSnVzdGlmeUNlbnRlcjogKCkgPT4gQWxpZ25WZXJ0aWNhbEp1c3RpZnlDZW50ZXIsCiAgQWxpZ25WZXJ0aWNhbEp1c3RpZnlFbmQ6ICgpID0+IEFsaWduVmVydGljYWxKdXN0aWZ5RW5kLAogIEFsaWduVmVydGljYWxKdXN0aWZ5U3RhcnQ6ICgpID0+IEFsaWduVmVydGljYWxKdXN0aWZ5U3RhcnQsCiAgQWxpZ25WZXJ0aWNhbFNwYWNlQXJvdW5kOiAoKSA9PiBBbGlnblZlcnRpY2FsU3BhY2VBcm91bmQsCiAgQWxpZ25WZXJ0aWNhbFNwYWNlQmV0d2VlbjogKCkgPT4gQWxpZ25WZXJ0aWNhbFNwYWNlQmV0d2VlbiwKICBBbWJ1bGFuY2U6ICgpID0+IEFtYnVsYW5jZSwKICBBbXBlcnNhbmQ6ICgpID0+IEFtcGVyc2FuZCwKICBBbXBlcnNhbmRzOiAoKSA9PiBBbXBlcnNhbmRzLAogIEFtcGhvcmE6ICgpID0+IEFtcGhvcmEsCiAgQW5jaG9yOiAoKSA9PiBBbmNob3IsCiAgQW5ncnk6ICgpID0+IEFuZ3J5LAogIEFubm95ZWQ6ICgpID0+IEFubm95ZWQsCiAgQW50ZW5uYTogKCkgPT4gQW50ZW5uYSwKICBBbnZpbDogKCkgPT4gQW52aWwsCiAgQXBlcnR1cmU6ICgpID0+IEFwZXJ0dXJlLAogIEFwcFdpbmRvdzogKCkgPT4gQXBwV2luZG93LAogIEFwcFdpbmRvd01hYzogKCkgPT4gQXBwV2luZG93TWFjLAogIEFwcGxlOiAoKSA9PiBBcHBsZSwKICBBcmNoaXZlOiAoKSA9PiBBcmNoaXZlLAogIEFyY2hpdmVSZXN0b3JlOiAoKSA9PiBBcmNoaXZlUmVzdG9yZSwKICBBcmNoaXZlWDogKCkgPT4gQXJjaGl2ZVgsCiAgQXJlYUNoYXJ0OiAoKSA9PiBDaGFydEFyZWEsCiAgQXJtY2hhaXI6ICgpID0+IEFybWNoYWlyLAogIEFycm93QmlnRG93bjogKCkgPT4gQXJyb3dCaWdEb3duLAogIEFycm93QmlnRG93bkRhc2g6ICgpID0+IEFycm93QmlnRG93bkRhc2gsCiAgQXJyb3dCaWdMZWZ0OiAoKSA9PiBBcnJvd0JpZ0xlZnQsCiAgQXJyb3dCaWdMZWZ0RGFzaDogKCkgPT4gQXJyb3dCaWdMZWZ0RGFzaCwKICBBcnJvd0JpZ1JpZ2h0OiAoKSA9PiBBcnJvd0JpZ1JpZ2h0LAogIEFycm93QmlnUmlnaHREYXNoOiAoKSA9PiBBcnJvd0JpZ1JpZ2h0RGFzaCwKICBBcnJvd0JpZ1VwOiAoKSA9PiBBcnJvd0JpZ1VwLAogIEFycm93QmlnVXBEYXNoOiAoKSA9PiBBcnJvd0JpZ1VwRGFzaCwKICBBcnJvd0Rvd246ICgpID0+IEFycm93RG93biwKICBBcnJvd0Rvd24wMTogKCkgPT4gQXJyb3dEb3duMDEsCiAgQXJyb3dEb3duMTA6ICgpID0+IEFycm93RG93bjEwLAogIEFycm93RG93bkFaOiAoKSA9PiBBcnJvd0Rvd25BWiwKICBBcnJvd0Rvd25BejogKCkgPT4gQXJyb3dEb3duQVosCiAgQXJyb3dEb3duQ2lyY2xlOiAoKSA9PiBDaXJjbGVBcnJvd0Rvd24sCiAgQXJyb3dEb3duRnJvbUxpbmU6ICgpID0+IEFycm93RG93bkZyb21MaW5lLAogIEFycm93RG93bkxlZnQ6ICgpID0+IEFycm93RG93bkxlZnQsCiAgQXJyb3dEb3duTGVmdEZyb21DaXJjbGU6ICgpID0+IENpcmNsZUFycm93T3V0RG93bkxlZnQsCiAgQXJyb3dEb3duTGVmdEZyb21TcXVhcmU6ICgpID0+IFNxdWFyZUFycm93T3V0RG93bkxlZnQsCiAgQXJyb3dEb3duTGVmdFNxdWFyZTogKCkgPT4gU3F1YXJlQXJyb3dEb3duTGVmdCwKICBBcnJvd0Rvd25OYXJyb3dXaWRlOiAoKSA9PiBBcnJvd0Rvd25OYXJyb3dXaWRlLAogIEFycm93RG93blJpZ2h0OiAoKSA9PiBBcnJvd0Rvd25SaWdodCwKICBBcnJvd0Rvd25SaWdodEZyb21DaXJjbGU6ICgpID0+IENpcmNsZUFycm93T3V0RG93blJpZ2h0LAogIEFycm93RG93blJpZ2h0RnJvbVNxdWFyZTogKCkgPT4gU3F1YXJlQXJyb3dPdXREb3duUmlnaHQsCiAgQXJyb3dEb3duUmlnaHRTcXVhcmU6ICgpID0+IFNxdWFyZUFycm93RG93blJpZ2h0LAogIEFycm93RG93blNxdWFyZTogKCkgPT4gU3F1YXJlQXJyb3dEb3duLAogIEFycm93RG93blRvRG90OiAoKSA9PiBBcnJvd0Rvd25Ub0RvdCwKICBBcnJvd0Rvd25Ub0xpbmU6ICgpID0+IEFycm93RG93blRvTGluZSwKICBBcnJvd0Rvd25VcDogKCkgPT4gQXJyb3dEb3duVXAsCiAgQXJyb3dEb3duV2lkZU5hcnJvdzogKCkgPT4gQXJyb3dEb3duV2lkZU5hcnJvdywKICBBcnJvd0Rvd25aQTogKCkgPT4gQXJyb3dEb3duWkEsCiAgQXJyb3dEb3duWmE6ICgpID0+IEFycm93RG93blpBLAogIEFycm93TGVmdDogKCkgPT4gQXJyb3dMZWZ0LAogIEFycm93TGVmdENpcmNsZTogKCkgPT4gQ2lyY2xlQXJyb3dMZWZ0LAogIEFycm93TGVmdEZyb21MaW5lOiAoKSA9PiBBcnJvd0xlZnRGcm9tTGluZSwKICBBcnJvd0xlZnRSaWdodDogKCkgPT4gQXJyb3dMZWZ0UmlnaHQsCiAgQXJyb3dMZWZ0U3F1YXJlOiAoKSA9PiBTcXVhcmVBcnJvd0xlZnQsCiAgQXJyb3dMZWZ0VG9MaW5lOiAoKSA9PiBBcnJvd0xlZnRUb0xpbmUsCiAgQXJyb3dSaWdodDogKCkgPT4gQXJyb3dSaWdodCwKICBBcnJvd1JpZ2h0Q2lyY2xlOiAoKSA9PiBDaXJjbGVBcnJvd1JpZ2h0LAogIEFycm93UmlnaHRGcm9tTGluZTogKCkgPT4gQXJyb3dSaWdodEZyb21MaW5lLAogIEFycm93UmlnaHRMZWZ0OiAoKSA9PiBBcnJvd1JpZ2h0TGVmdCwKICBBcnJvd1JpZ2h0U3F1YXJlOiAoKSA9PiBTcXVhcmVBcnJvd1JpZ2h0LAogIEFycm93UmlnaHRUb0xpbmU6ICgpID0+IEFycm93UmlnaHRUb0xpbmUsCiAgQXJyb3dVcDogKCkgPT4gQXJyb3dVcCwKICBBcnJvd1VwMDE6ICgpID0+IEFycm93VXAwMSwKICBBcnJvd1VwMTA6ICgpID0+IEFycm93VXAxMCwKICBBcnJvd1VwQVo6ICgpID0+IEFycm93VXBBWiwKICBBcnJvd1VwQXo6ICgpID0+IEFycm93VXBBWiwKICBBcnJvd1VwQ2lyY2xlOiAoKSA9PiBDaXJjbGVBcnJvd1VwLAogIEFycm93VXBEb3duOiAoKSA9PiBBcnJvd1VwRG93biwKICBBcnJvd1VwRnJvbURvdDogKCkgPT4gQXJyb3dVcEZyb21Eb3QsCiAgQXJyb3dVcEZyb21MaW5lOiAoKSA9PiBBcnJvd1VwRnJvbUxpbmUsCiAgQXJyb3dVcExlZnQ6ICgpID0+IEFycm93VXBMZWZ0LAogIEFycm93VXBMZWZ0RnJvbUNpcmNsZTogKCkgPT4gQ2lyY2xlQXJyb3dPdXRVcExlZnQsCiAgQXJyb3dVcExlZnRGcm9tU3F1YXJlOiAoKSA9PiBTcXVhcmVBcnJvd091dFVwTGVmdCwKICBBcnJvd1VwTGVmdFNxdWFyZTogKCkgPT4gU3F1YXJlQXJyb3dVcExlZnQsCiAgQXJyb3dVcE5hcnJvd1dpZGU6ICgpID0+IEFycm93VXBOYXJyb3dXaWRlLAogIEFycm93VXBSaWdodDogKCkgPT4gQXJyb3dVcFJpZ2h0LAogIEFycm93VXBSaWdodEZyb21DaXJjbGU6ICgpID0+IENpcmNsZUFycm93T3V0VXBSaWdodCwKICBBcnJvd1VwUmlnaHRGcm9tU3F1YXJlOiAoKSA9PiBTcXVhcmVBcnJvd091dFVwUmlnaHQsCiAgQXJyb3dVcFJpZ2h0U3F1YXJlOiAoKSA9PiBTcXVhcmVBcnJvd1VwUmlnaHQsCiAgQXJyb3dVcFNxdWFyZTogKCkgPT4gU3F1YXJlQXJyb3dVcCwKICBBcnJvd1VwVG9MaW5lOiAoKSA9PiBBcnJvd1VwVG9MaW5lLAogIEFycm93VXBXaWRlTmFycm93OiAoKSA9PiBBcnJvd1VwV2lkZU5hcnJvdywKICBBcnJvd1VwWkE6ICgpID0+IEFycm93VXBaQSwKICBBcnJvd1VwWmE6ICgpID0+IEFycm93VXBaQSwKICBBcnJvd3NVcEZyb21MaW5lOiAoKSA9PiBBcnJvd3NVcEZyb21MaW5lLAogIEFzdGVyaXNrOiAoKSA9PiBBc3RlcmlzaywKICBBc3Rlcmlza1NxdWFyZTogKCkgPT4gU3F1YXJlQXN0ZXJpc2ssCiAgQXRTaWduOiAoKSA9PiBBdFNpZ24sCiAgQXRvbTogKCkgPT4gQXRvbSwKICBBdWRpb0xpbmVzOiAoKSA9PiBBdWRpb0xpbmVzLAogIEF1ZGlvV2F2ZWZvcm06ICgpID0+IEF1ZGlvV2F2ZWZvcm0sCiAgQXdhcmQ6ICgpID0+IEF3YXJkLAogIEF4ZTogKCkgPT4gQXhlLAogIEF4aXMzRDogKCkgPT4gQXhpczNkLAogIEF4aXMzZDogKCkgPT4gQXhpczNkLAogIEJhYnk6ICgpID0+IEJhYnksCiAgQmFja3BhY2s6ICgpID0+IEJhY2twYWNrLAogIEJhZGdlOiAoKSA9PiBCYWRnZSwKICBCYWRnZUFsZXJ0OiAoKSA9PiBCYWRnZUFsZXJ0LAogIEJhZGdlQ2VudDogKCkgPT4gQmFkZ2VDZW50LAogIEJhZGdlQ2hlY2s6ICgpID0+IEJhZGdlQ2hlY2ssCiAgQmFkZ2VEb2xsYXJTaWduOiAoKSA9PiBCYWRnZURvbGxhclNpZ24sCiAgQmFkZ2VFdXJvOiAoKSA9PiBCYWRnZUV1cm8sCiAgQmFkZ2VIZWxwOiAoKSA9PiBCYWRnZVF1ZXN0aW9uTWFyaywKICBCYWRnZUluZGlhblJ1cGVlOiAoKSA9PiBCYWRnZUluZGlhblJ1cGVlLAogIEJhZGdlSW5mbzogKCkgPT4gQmFkZ2VJbmZvLAogIEJhZGdlSmFwYW5lc2VZZW46ICgpID0+IEJhZGdlSmFwYW5lc2VZZW4sCiAgQmFkZ2VNaW51czogKCkgPT4gQmFkZ2VNaW51cywKICBCYWRnZVBlcmNlbnQ6ICgpID0+IEJhZGdlUGVyY2VudCwKICBCYWRnZVBsdXM6ICgpID0+IEJhZGdlUGx1cywKICBCYWRnZVBvdW5kU3Rlcmxpbmc6ICgpID0+IEJhZGdlUG91bmRTdGVybGluZywKICBCYWRnZVF1ZXN0aW9uTWFyazogKCkgPT4gQmFkZ2VRdWVzdGlvbk1hcmssCiAgQmFkZ2VSdXNzaWFuUnVibGU6ICgpID0+IEJhZGdlUnVzc2lhblJ1YmxlLAogIEJhZGdlU3dpc3NGcmFuYzogKCkgPT4gQmFkZ2VTd2lzc0ZyYW5jLAogIEJhZGdlVHVya2lzaExpcmE6ICgpID0+IEJhZGdlVHVya2lzaExpcmEsCiAgQmFkZ2VYOiAoKSA9PiBCYWRnZVgsCiAgQmFnZ2FnZUNsYWltOiAoKSA9PiBCYWdnYWdlQ2xhaW0sCiAgQmFsbG9vbjogKCkgPT4gQmFsbG9vbiwKICBCYW46ICgpID0+IEJhbiwKICBCYW5hbmE6ICgpID0+IEJhbmFuYSwKICBCYW5kYWdlOiAoKSA9PiBCYW5kYWdlLAogIEJhbmtub3RlOiAoKSA9PiBCYW5rbm90ZSwKICBCYW5rbm90ZUFycm93RG93bjogKCkgPT4gQmFua25vdGVBcnJvd0Rvd24sCiAgQmFua25vdGVBcnJvd1VwOiAoKSA9PiBCYW5rbm90ZUFycm93VXAsCiAgQmFua25vdGVYOiAoKSA9PiBCYW5rbm90ZVgsCiAgQmFyQ2hhcnQ6ICgpID0+IENoYXJ0Tm9BeGVzQ29sdW1uSW5jcmVhc2luZywKICBCYXJDaGFydDI6ICgpID0+IENoYXJ0Tm9BeGVzQ29sdW1uLAogIEJhckNoYXJ0MzogKCkgPT4gQ2hhcnRDb2x1bW4sCiAgQmFyQ2hhcnQ0OiAoKSA9PiBDaGFydENvbHVtbkluY3JlYXNpbmcsCiAgQmFyQ2hhcnRCaWc6ICgpID0+IENoYXJ0Q29sdW1uQmlnLAogIEJhckNoYXJ0SG9yaXpvbnRhbDogKCkgPT4gQ2hhcnRCYXIsCiAgQmFyQ2hhcnRIb3Jpem9udGFsQmlnOiAoKSA9PiBDaGFydEJhckJpZywKICBCYXJjb2RlOiAoKSA9PiBCYXJjb2RlLAogIEJhcnJlbDogKCkgPT4gQmFycmVsLAogIEJhc2VsaW5lOiAoKSA9PiBCYXNlbGluZSwKICBCYXRoOiAoKSA9PiBCYXRoLAogIEJhdHRlcnk6ICgpID0+IEJhdHRlcnksCiAgQmF0dGVyeUNoYXJnaW5nOiAoKSA9PiBCYXR0ZXJ5Q2hhcmdpbmcsCiAgQmF0dGVyeUZ1bGw6ICgpID0+IEJhdHRlcnlGdWxsLAogIEJhdHRlcnlMb3c6ICgpID0+IEJhdHRlcnlMb3csCiAgQmF0dGVyeU1lZGl1bTogKCkgPT4gQmF0dGVyeU1lZGl1bSwKICBCYXR0ZXJ5UGx1czogKCkgPT4gQmF0dGVyeVBsdXMsCiAgQmF0dGVyeVdhcm5pbmc6ICgpID0+IEJhdHRlcnlXYXJuaW5nLAogIEJlYWtlcjogKCkgPT4gQmVha2VyLAogIEJlYW46ICgpID0+IEJlYW4sCiAgQmVhbk9mZjogKCkgPT4gQmVhbk9mZiwKICBCZWQ6ICgpID0+IEJlZCwKICBCZWREb3VibGU6ICgpID0+IEJlZERvdWJsZSwKICBCZWRTaW5nbGU6ICgpID0+IEJlZFNpbmdsZSwKICBCZWVmOiAoKSA9PiBCZWVmLAogIEJlZXI6ICgpID0+IEJlZXIsCiAgQmVlck9mZjogKCkgPT4gQmVlck9mZiwKICBCZWxsOiAoKSA9PiBCZWxsLAogIEJlbGxEb3Q6ICgpID0+IEJlbGxEb3QsCiAgQmVsbEVsZWN0cmljOiAoKSA9PiBCZWxsRWxlY3RyaWMsCiAgQmVsbE1pbnVzOiAoKSA9PiBCZWxsTWludXMsCiAgQmVsbE9mZjogKCkgPT4gQmVsbE9mZiwKICBCZWxsUGx1czogKCkgPT4gQmVsbFBsdXMsCiAgQmVsbFJpbmc6ICgpID0+IEJlbGxSaW5nLAogIEJldHdlZW5Ib3Jpem9uYWxFbmQ6ICgpID0+IEJldHdlZW5Ib3Jpem9udGFsRW5kLAogIEJldHdlZW5Ib3Jpem9uYWxTdGFydDogKCkgPT4gQmV0d2Vlbkhvcml6b250YWxTdGFydCwKICBCZXR3ZWVuSG9yaXpvbnRhbEVuZDogKCkgPT4gQmV0d2Vlbkhvcml6b250YWxFbmQsCiAgQmV0d2Vlbkhvcml6b250YWxTdGFydDogKCkgPT4gQmV0d2Vlbkhvcml6b250YWxTdGFydCwKICBCZXR3ZWVuVmVydGljYWxFbmQ6ICgpID0+IEJldHdlZW5WZXJ0aWNhbEVuZCwKICBCZXR3ZWVuVmVydGljYWxTdGFydDogKCkgPT4gQmV0d2VlblZlcnRpY2FsU3RhcnQsCiAgQmljZXBzRmxleGVkOiAoKSA9PiBCaWNlcHNGbGV4ZWQsCiAgQmlrZTogKCkgPT4gQmlrZSwKICBCaW5hcnk6ICgpID0+IEJpbmFyeSwKICBCaW5vY3VsYXJzOiAoKSA9PiBCaW5vY3VsYXJzLAogIEJpb2hhemFyZDogKCkgPT4gQmlvaGF6YXJkLAogIEJpcmQ6ICgpID0+IEJpcmQsCiAgQmlyZGhvdXNlOiAoKSA9PiBCaXJkaG91c2UsCiAgQml0Y29pbjogKCkgPT4gQml0Y29pbiwKICBCbGVuZDogKCkgPT4gQmxlbmQsCiAgQmxpbmRzOiAoKSA9PiBCbGluZHMsCiAgQmxvY2tzOiAoKSA9PiBCbG9ja3MsCiAgQmx1ZXRvb3RoOiAoKSA9PiBCbHVldG9vdGgsCiAgQmx1ZXRvb3RoQ29ubmVjdGVkOiAoKSA9PiBCbHVldG9vdGhDb25uZWN0ZWQsCiAgQmx1ZXRvb3RoT2ZmOiAoKSA9PiBCbHVldG9vdGhPZmYsCiAgQmx1ZXRvb3RoU2VhcmNoaW5nOiAoKSA9PiBCbHVldG9vdGhTZWFyY2hpbmcsCiAgQm9sZDogKCkgPT4gQm9sZCwKICBCb2x0OiAoKSA9PiBCb2x0LAogIEJvbWI6ICgpID0+IEJvbWIsCiAgQm9uZTogKCkgPT4gQm9uZSwKICBCb29rOiAoKSA9PiBCb29rLAogIEJvb2tBOiAoKSA9PiBCb29rQSwKICBCb29rQWxlcnQ6ICgpID0+IEJvb2tBbGVydCwKICBCb29rQXVkaW86ICgpID0+IEJvb2tBdWRpbywKICBCb29rQ2hlY2s6ICgpID0+IEJvb2tDaGVjaywKICBCb29rQ29weTogKCkgPT4gQm9va0NvcHksCiAgQm9va0Rhc2hlZDogKCkgPT4gQm9va0Rhc2hlZCwKICBCb29rRG93bjogKCkgPT4gQm9va0Rvd24sCiAgQm9va0hlYWRwaG9uZXM6ICgpID0+IEJvb2tIZWFkcGhvbmVzLAogIEJvb2tIZWFydDogKCkgPT4gQm9va0hlYXJ0LAogIEJvb2tJbWFnZTogKCkgPT4gQm9va0ltYWdlLAogIEJvb2tLZXk6ICgpID0+IEJvb2tLZXksCiAgQm9va0xvY2s6ICgpID0+IEJvb2tMb2NrLAogIEJvb2tNYXJrZWQ6ICgpID0+IEJvb2tNYXJrZWQsCiAgQm9va01pbnVzOiAoKSA9PiBCb29rTWludXMsCiAgQm9va09wZW46ICgpID0+IEJvb2tPcGVuLAogIEJvb2tPcGVuQ2hlY2s6ICgpID0+IEJvb2tPcGVuQ2hlY2ssCiAgQm9va09wZW5UZXh0OiAoKSA9PiBCb29rT3BlblRleHQsCiAgQm9va1BsdXM6ICgpID0+IEJvb2tQbHVzLAogIEJvb2tTZWFyY2g6ICgpID0+IEJvb2tTZWFyY2gsCiAgQm9va1RlbXBsYXRlOiAoKSA9PiBCb29rRGFzaGVkLAogIEJvb2tUZXh0OiAoKSA9PiBCb29rVGV4dCwKICBCb29rVHlwZTogKCkgPT4gQm9va1R5cGUsCiAgQm9va1VwOiAoKSA9PiBCb29rVXAsCiAgQm9va1VwMjogKCkgPT4gQm9va1VwMiwKICBCb29rVXNlcjogKCkgPT4gQm9va1VzZXIsCiAgQm9va1g6ICgpID0+IEJvb2tYLAogIEJvb2ttYXJrOiAoKSA9PiBCb29rbWFyaywKICBCb29rbWFya0NoZWNrOiAoKSA9PiBCb29rbWFya0NoZWNrLAogIEJvb2ttYXJrTWludXM6ICgpID0+IEJvb2ttYXJrTWludXMsCiAgQm9va21hcmtQbHVzOiAoKSA9PiBCb29rbWFya1BsdXMsCiAgQm9va21hcmtYOiAoKSA9PiBCb29rbWFya1gsCiAgQm9vbUJveDogKCkgPT4gQm9vbUJveCwKICBCb3Q6ICgpID0+IEJvdCwKICBCb3RNZXNzYWdlU3F1YXJlOiAoKSA9PiBCb3RNZXNzYWdlU3F1YXJlLAogIEJvdE9mZjogKCkgPT4gQm90T2ZmLAogIEJvdHRsZVdpbmU6ICgpID0+IEJvdHRsZVdpbmUsCiAgQm93QXJyb3c6ICgpID0+IEJvd0Fycm93LAogIEJveDogKCkgPT4gQm94LAogIEJveFNlbGVjdDogKCkgPT4gU3F1YXJlRGFzaGVkLAogIEJveGVzOiAoKSA9PiBCb3hlcywKICBCcmFjZXM6ICgpID0+IEJyYWNlcywKICBCcmFja2V0czogKCkgPT4gQnJhY2tldHMsCiAgQnJhaW46ICgpID0+IEJyYWluLAogIEJyYWluQ2lyY3VpdDogKCkgPT4gQnJhaW5DaXJjdWl0LAogIEJyYWluQ29nOiAoKSA9PiBCcmFpbkNvZywKICBCcmlja1dhbGw6ICgpID0+IEJyaWNrV2FsbCwKICBCcmlja1dhbGxGaXJlOiAoKSA9PiBCcmlja1dhbGxGaXJlLAogIEJyaWNrV2FsbFNoaWVsZDogKCkgPT4gQnJpY2tXYWxsU2hpZWxkLAogIEJyaWVmY2FzZTogKCkgPT4gQnJpZWZjYXNlLAogIEJyaWVmY2FzZUJ1c2luZXNzOiAoKSA9PiBCcmllZmNhc2VCdXNpbmVzcywKICBCcmllZmNhc2VDb252ZXlvckJlbHQ6ICgpID0+IEJyaWVmY2FzZUNvbnZleW9yQmVsdCwKICBCcmllZmNhc2VNZWRpY2FsOiAoKSA9PiBCcmllZmNhc2VNZWRpY2FsLAogIEJyaW5nVG9Gcm9udDogKCkgPT4gQnJpbmdUb0Zyb250LAogIEJydXNoOiAoKSA9PiBCcnVzaCwKICBCcnVzaENsZWFuaW5nOiAoKSA9PiBCcnVzaENsZWFuaW5nLAogIEJ1YmJsZXM6ICgpID0+IEJ1YmJsZXMsCiAgQnVnOiAoKSA9PiBCdWcsCiAgQnVnT2ZmOiAoKSA9PiBCdWdPZmYsCiAgQnVnUGxheTogKCkgPT4gQnVnUGxheSwKICBCdWlsZGluZzogKCkgPT4gQnVpbGRpbmcsCiAgQnVpbGRpbmcyOiAoKSA9PiBCdWlsZGluZzIsCiAgQnVzOiAoKSA9PiBCdXMsCiAgQnVzRnJvbnQ6ICgpID0+IEJ1c0Zyb250LAogIENhYmxlOiAoKSA9PiBDYWJsZSwKICBDYWJsZUNhcjogKCkgPT4gQ2FibGVDYXIsCiAgQ2FrZTogKCkgPT4gQ2FrZSwKICBDYWtlU2xpY2U6ICgpID0+IENha2VTbGljZSwKICBDYWxjdWxhdG9yOiAoKSA9PiBDYWxjdWxhdG9yLAogIENhbGVuZGFyOiAoKSA9PiBDYWxlbmRhciwKICBDYWxlbmRhcjE6ICgpID0+IENhbGVuZGFyMSwKICBDYWxlbmRhckFycm93RG93bjogKCkgPT4gQ2FsZW5kYXJBcnJvd0Rvd24sCiAgQ2FsZW5kYXJBcnJvd1VwOiAoKSA9PiBDYWxlbmRhckFycm93VXAsCiAgQ2FsZW5kYXJDaGVjazogKCkgPT4gQ2FsZW5kYXJDaGVjaywKICBDYWxlbmRhckNoZWNrMjogKCkgPT4gQ2FsZW5kYXJDaGVjazIsCiAgQ2FsZW5kYXJDbG9jazogKCkgPT4gQ2FsZW5kYXJDbG9jaywKICBDYWxlbmRhckNvZzogKCkgPT4gQ2FsZW5kYXJDb2csCiAgQ2FsZW5kYXJEYXlzOiAoKSA9PiBDYWxlbmRhckRheXMsCiAgQ2FsZW5kYXJGb2xkOiAoKSA9PiBDYWxlbmRhckZvbGQsCiAgQ2FsZW5kYXJIZWFydDogKCkgPT4gQ2FsZW5kYXJIZWFydCwKICBDYWxlbmRhck1pbnVzOiAoKSA9PiBDYWxlbmRhck1pbnVzLAogIENhbGVuZGFyTWludXMyOiAoKSA9PiBDYWxlbmRhck1pbnVzMiwKICBDYWxlbmRhck9mZjogKCkgPT4gQ2FsZW5kYXJPZmYsCiAgQ2FsZW5kYXJQbHVzOiAoKSA9PiBDYWxlbmRhclBsdXMsCiAgQ2FsZW5kYXJQbHVzMjogKCkgPT4gQ2FsZW5kYXJQbHVzMiwKICBDYWxlbmRhclJhbmdlOiAoKSA9PiBDYWxlbmRhclJhbmdlLAogIENhbGVuZGFyU2VhcmNoOiAoKSA9PiBDYWxlbmRhclNlYXJjaCwKICBDYWxlbmRhclN5bmM6ICgpID0+IENhbGVuZGFyU3luYywKICBDYWxlbmRhclg6ICgpID0+IENhbGVuZGFyWCwKICBDYWxlbmRhclgyOiAoKSA9PiBDYWxlbmRhclgyLAogIENhbGVuZGFyczogKCkgPT4gQ2FsZW5kYXJzLAogIENhbWVyYTogKCkgPT4gQ2FtZXJhLAogIENhbWVyYU9mZjogKCkgPT4gQ2FtZXJhT2ZmLAogIENhbmRsZXN0aWNrQ2hhcnQ6ICgpID0+IENoYXJ0Q2FuZGxlc3RpY2ssCiAgQ2FuZHk6ICgpID0+IENhbmR5LAogIENhbmR5Q2FuZTogKCkgPT4gQ2FuZHlDYW5lLAogIENhbmR5T2ZmOiAoKSA9PiBDYW5keU9mZiwKICBDYW5uYWJpczogKCkgPT4gQ2FubmFiaXMsCiAgQ2FubmFiaXNPZmY6ICgpID0+IENhbm5hYmlzT2ZmLAogIENhcHRpb25zOiAoKSA9PiBDYXB0aW9ucywKICBDYXB0aW9uc09mZjogKCkgPT4gQ2FwdGlvbnNPZmYsCiAgQ2FyOiAoKSA9PiBDYXIsCiAgQ2FyRnJvbnQ6ICgpID0+IENhckZyb250LAogIENhclRheGlGcm9udDogKCkgPT4gQ2FyVGF4aUZyb250LAogIENhcmF2YW46ICgpID0+IENhcmF2YW4sCiAgQ2FyZFNpbTogKCkgPT4gQ2FyZFNpbSwKICBDYXJyb3Q6ICgpID0+IENhcnJvdCwKICBDYXNlTG93ZXI6ICgpID0+IENhc2VMb3dlciwKICBDYXNlU2Vuc2l0aXZlOiAoKSA9PiBDYXNlU2Vuc2l0aXZlLAogIENhc2VVcHBlcjogKCkgPT4gQ2FzZVVwcGVyLAogIENhc3NldHRlVGFwZTogKCkgPT4gQ2Fzc2V0dGVUYXBlLAogIENhc3Q6ICgpID0+IENhc3QsCiAgQ2FzdGxlOiAoKSA9PiBDYXN0bGUsCiAgQ2F0OiAoKSA9PiBDYXQsCiAgQ2N0djogKCkgPT4gQ2N0diwKICBDaGFydEFyZWE6ICgpID0+IENoYXJ0QXJlYSwKICBDaGFydEJhcjogKCkgPT4gQ2hhcnRCYXIsCiAgQ2hhcnRCYXJCaWc6ICgpID0+IENoYXJ0QmFyQmlnLAogIENoYXJ0QmFyRGVjcmVhc2luZzogKCkgPT4gQ2hhcnRCYXJEZWNyZWFzaW5nLAogIENoYXJ0QmFySW5jcmVhc2luZzogKCkgPT4gQ2hhcnRCYXJJbmNyZWFzaW5nLAogIENoYXJ0QmFyU3RhY2tlZDogKCkgPT4gQ2hhcnRCYXJTdGFja2VkLAogIENoYXJ0Q2FuZGxlc3RpY2s6ICgpID0+IENoYXJ0Q2FuZGxlc3RpY2ssCiAgQ2hhcnRDb2x1bW46ICgpID0+IENoYXJ0Q29sdW1uLAogIENoYXJ0Q29sdW1uQmlnOiAoKSA9PiBDaGFydENvbHVtbkJpZywKICBDaGFydENvbHVtbkRlY3JlYXNpbmc6ICgpID0+IENoYXJ0Q29sdW1uRGVjcmVhc2luZywKICBDaGFydENvbHVtbkluY3JlYXNpbmc6ICgpID0+IENoYXJ0Q29sdW1uSW5jcmVhc2luZywKICBDaGFydENvbHVtblN0YWNrZWQ6ICgpID0+IENoYXJ0Q29sdW1uU3RhY2tlZCwKICBDaGFydEdhbnR0OiAoKSA9PiBDaGFydEdhbnR0LAogIENoYXJ0TGluZTogKCkgPT4gQ2hhcnRMaW5lLAogIENoYXJ0TmV0d29yazogKCkgPT4gQ2hhcnROZXR3b3JrLAogIENoYXJ0Tm9BeGVzQ29sdW1uOiAoKSA9PiBDaGFydE5vQXhlc0NvbHVtbiwKICBDaGFydE5vQXhlc0NvbHVtbkRlY3JlYXNpbmc6ICgpID0+IENoYXJ0Tm9BeGVzQ29sdW1uRGVjcmVhc2luZywKICBDaGFydE5vQXhlc0NvbHVtbkluY3JlYXNpbmc6ICgpID0+IENoYXJ0Tm9BeGVzQ29sdW1uSW5jcmVhc2luZywKICBDaGFydE5vQXhlc0NvbWJpbmVkOiAoKSA9PiBDaGFydE5vQXhlc0NvbWJpbmVkLAogIENoYXJ0Tm9BeGVzR2FudHQ6ICgpID0+IENoYXJ0Tm9BeGVzR2FudHQsCiAgQ2hhcnRQaWU6ICgpID0+IENoYXJ0UGllLAogIENoYXJ0U2NhdHRlcjogKCkgPT4gQ2hhcnRTY2F0dGVyLAogIENoYXJ0U3BsaW5lOiAoKSA9PiBDaGFydFNwbGluZSwKICBDaGVjazogKCkgPT4gQ2hlY2ssCiAgQ2hlY2tDaGVjazogKCkgPT4gQ2hlY2tDaGVjaywKICBDaGVja0NpcmNsZTogKCkgPT4gQ2lyY2xlQ2hlY2tCaWcsCiAgQ2hlY2tDaXJjbGUyOiAoKSA9PiBDaXJjbGVDaGVjaywKICBDaGVja0xpbmU6ICgpID0+IENoZWNrTGluZSwKICBDaGVja1NxdWFyZTogKCkgPT4gU3F1YXJlQ2hlY2tCaWcsCiAgQ2hlY2tTcXVhcmUyOiAoKSA9PiBTcXVhcmVDaGVjaywKICBDaGVmSGF0OiAoKSA9PiBDaGVmSGF0LAogIENoZXJyeTogKCkgPT4gQ2hlcnJ5LAogIENoZXNzQmlzaG9wOiAoKSA9PiBDaGVzc0Jpc2hvcCwKICBDaGVzc0tpbmc6ICgpID0+IENoZXNzS2luZywKICBDaGVzc0tuaWdodDogKCkgPT4gQ2hlc3NLbmlnaHQsCiAgQ2hlc3NQYXduOiAoKSA9PiBDaGVzc1Bhd24sCiAgQ2hlc3NRdWVlbjogKCkgPT4gQ2hlc3NRdWVlbiwKICBDaGVzc1Jvb2s6ICgpID0+IENoZXNzUm9vaywKICBDaGV2cm9uRG93bjogKCkgPT4gQ2hldnJvbkRvd24sCiAgQ2hldnJvbkRvd25DaXJjbGU6ICgpID0+IENpcmNsZUNoZXZyb25Eb3duLAogIENoZXZyb25Eb3duU3F1YXJlOiAoKSA9PiBTcXVhcmVDaGV2cm9uRG93biwKICBDaGV2cm9uRmlyc3Q6ICgpID0+IENoZXZyb25GaXJzdCwKICBDaGV2cm9uTGFzdDogKCkgPT4gQ2hldnJvbkxhc3QsCiAgQ2hldnJvbkxlZnQ6ICgpID0+IENoZXZyb25MZWZ0LAogIENoZXZyb25MZWZ0Q2lyY2xlOiAoKSA9PiBDaXJjbGVDaGV2cm9uTGVmdCwKICBDaGV2cm9uTGVmdFNxdWFyZTogKCkgPT4gU3F1YXJlQ2hldnJvbkxlZnQsCiAgQ2hldnJvblJpZ2h0OiAoKSA9PiBDaGV2cm9uUmlnaHQsCiAgQ2hldnJvblJpZ2h0Q2lyY2xlOiAoKSA9PiBDaXJjbGVDaGV2cm9uUmlnaHQsCiAgQ2hldnJvblJpZ2h0U3F1YXJlOiAoKSA9PiBTcXVhcmVDaGV2cm9uUmlnaHQsCiAgQ2hldnJvblVwOiAoKSA9PiBDaGV2cm9uVXAsCiAgQ2hldnJvblVwQ2lyY2xlOiAoKSA9PiBDaXJjbGVDaGV2cm9uVXAsCiAgQ2hldnJvblVwU3F1YXJlOiAoKSA9PiBTcXVhcmVDaGV2cm9uVXAsCiAgQ2hldnJvbnNEb3duOiAoKSA9PiBDaGV2cm9uc0Rvd24sCiAgQ2hldnJvbnNEb3duVXA6ICgpID0+IENoZXZyb25zRG93blVwLAogIENoZXZyb25zTGVmdDogKCkgPT4gQ2hldnJvbnNMZWZ0LAogIENoZXZyb25zTGVmdFJpZ2h0OiAoKSA9PiBDaGV2cm9uc0xlZnRSaWdodCwKICBDaGV2cm9uc0xlZnRSaWdodEVsbGlwc2lzOiAoKSA9PiBDaGV2cm9uc0xlZnRSaWdodEVsbGlwc2lzLAogIENoZXZyb25zUmlnaHQ6ICgpID0+IENoZXZyb25zUmlnaHQsCiAgQ2hldnJvbnNSaWdodExlZnQ6ICgpID0+IENoZXZyb25zUmlnaHRMZWZ0LAogIENoZXZyb25zVXA6ICgpID0+IENoZXZyb25zVXAsCiAgQ2hldnJvbnNVcERvd246ICgpID0+IENoZXZyb25zVXBEb3duLAogIENocm9tZTogKCkgPT4gQ2hyb21pdW0sCiAgQ2hyb21pdW06ICgpID0+IENocm9taXVtLAogIENodXJjaDogKCkgPT4gQ2h1cmNoLAogIENpZ2FyZXR0ZTogKCkgPT4gQ2lnYXJldHRlLAogIENpZ2FyZXR0ZU9mZjogKCkgPT4gQ2lnYXJldHRlT2ZmLAogIENpcmNsZTogKCkgPT4gQ2lyY2xlLAogIENpcmNsZUFsZXJ0OiAoKSA9PiBDaXJjbGVBbGVydCwKICBDaXJjbGVBcnJvd0Rvd246ICgpID0+IENpcmNsZUFycm93RG93biwKICBDaXJjbGVBcnJvd0xlZnQ6ICgpID0+IENpcmNsZUFycm93TGVmdCwKICBDaXJjbGVBcnJvd091dERvd25MZWZ0OiAoKSA9PiBDaXJjbGVBcnJvd091dERvd25MZWZ0LAogIENpcmNsZUFycm93T3V0RG93blJpZ2h0OiAoKSA9PiBDaXJjbGVBcnJvd091dERvd25SaWdodCwKICBDaXJjbGVBcnJvd091dFVwTGVmdDogKCkgPT4gQ2lyY2xlQXJyb3dPdXRVcExlZnQsCiAgQ2lyY2xlQXJyb3dPdXRVcFJpZ2h0OiAoKSA9PiBDaXJjbGVBcnJvd091dFVwUmlnaHQsCiAgQ2lyY2xlQXJyb3dSaWdodDogKCkgPT4gQ2lyY2xlQXJyb3dSaWdodCwKICBDaXJjbGVBcnJvd1VwOiAoKSA9PiBDaXJjbGVBcnJvd1VwLAogIENpcmNsZUNoZWNrOiAoKSA9PiBDaXJjbGVDaGVjaywKICBDaXJjbGVDaGVja0JpZzogKCkgPT4gQ2lyY2xlQ2hlY2tCaWcsCiAgQ2lyY2xlQ2hldnJvbkRvd246ICgpID0+IENpcmNsZUNoZXZyb25Eb3duLAogIENpcmNsZUNoZXZyb25MZWZ0OiAoKSA9PiBDaXJjbGVDaGV2cm9uTGVmdCwKICBDaXJjbGVDaGV2cm9uUmlnaHQ6ICgpID0+IENpcmNsZUNoZXZyb25SaWdodCwKICBDaXJjbGVDaGV2cm9uVXA6ICgpID0+IENpcmNsZUNoZXZyb25VcCwKICBDaXJjbGVEYXNoZWQ6ICgpID0+IENpcmNsZURhc2hlZCwKICBDaXJjbGVEaXZpZGU6ICgpID0+IENpcmNsZURpdmlkZSwKICBDaXJjbGVEb2xsYXJTaWduOiAoKSA9PiBDaXJjbGVEb2xsYXJTaWduLAogIENpcmNsZURvdDogKCkgPT4gQ2lyY2xlRG90LAogIENpcmNsZURvdERhc2hlZDogKCkgPT4gQ2lyY2xlRG90RGFzaGVkLAogIENpcmNsZUVsbGlwc2lzOiAoKSA9PiBDaXJjbGVFbGxpcHNpcywKICBDaXJjbGVFcXVhbDogKCkgPT4gQ2lyY2xlRXF1YWwsCiAgQ2lyY2xlRmFkaW5nQXJyb3dVcDogKCkgPT4gQ2lyY2xlRmFkaW5nQXJyb3dVcCwKICBDaXJjbGVGYWRpbmdQbHVzOiAoKSA9PiBDaXJjbGVGYWRpbmdQbHVzLAogIENpcmNsZUdhdWdlOiAoKSA9PiBDaXJjbGVHYXVnZSwKICBDaXJjbGVIZWxwOiAoKSA9PiBDaXJjbGVRdWVzdGlvbk1hcmssCiAgQ2lyY2xlTWludXM6ICgpID0+IENpcmNsZU1pbnVzLAogIENpcmNsZU9mZjogKCkgPT4gQ2lyY2xlT2ZmLAogIENpcmNsZVBhcmtpbmc6ICgpID0+IENpcmNsZVBhcmtpbmcsCiAgQ2lyY2xlUGFya2luZ09mZjogKCkgPT4gQ2lyY2xlUGFya2luZ09mZiwKICBDaXJjbGVQYXVzZTogKCkgPT4gQ2lyY2xlUGF1c2UsCiAgQ2lyY2xlUGVyY2VudDogKCkgPT4gQ2lyY2xlUGVyY2VudCwKICBDaXJjbGVQaWxlOiAoKSA9PiBDaXJjbGVQaWxlLAogIENpcmNsZVBsYXk6ICgpID0+IENpcmNsZVBsYXksCiAgQ2lyY2xlUGx1czogKCkgPT4gQ2lyY2xlUGx1cywKICBDaXJjbGVQb3VuZFN0ZXJsaW5nOiAoKSA9PiBDaXJjbGVQb3VuZFN0ZXJsaW5nLAogIENpcmNsZVBvd2VyOiAoKSA9PiBDaXJjbGVQb3dlciwKICBDaXJjbGVRdWVzdGlvbk1hcms6ICgpID0+IENpcmNsZVF1ZXN0aW9uTWFyaywKICBDaXJjbGVTbGFzaDogKCkgPT4gQ2lyY2xlU2xhc2gsCiAgQ2lyY2xlU2xhc2gyOiAoKSA9PiBDaXJjbGVTbGFzaDIsCiAgQ2lyY2xlU2xhc2hlZDogKCkgPT4gQ2lyY2xlU2xhc2gyLAogIENpcmNsZVNtYWxsOiAoKSA9PiBDaXJjbGVTbWFsbCwKICBDaXJjbGVTdGFyOiAoKSA9PiBDaXJjbGVTdGFyLAogIENpcmNsZVN0b3A6ICgpID0+IENpcmNsZVN0b3AsCiAgQ2lyY2xlVXNlcjogKCkgPT4gQ2lyY2xlVXNlciwKICBDaXJjbGVVc2VyUm91bmQ6ICgpID0+IENpcmNsZVVzZXJSb3VuZCwKICBDaXJjbGVYOiAoKSA9PiBDaXJjbGVYLAogIENpcmN1aXRCb2FyZDogKCkgPT4gQ2lyY3VpdEJvYXJkLAogIENpdHJ1czogKCkgPT4gQ2l0cnVzLAogIENsYXBwZXJib2FyZDogKCkgPT4gQ2xhcHBlcmJvYXJkLAogIENsaXBib2FyZDogKCkgPT4gQ2xpcGJvYXJkLAogIENsaXBib2FyZENoZWNrOiAoKSA9PiBDbGlwYm9hcmRDaGVjaywKICBDbGlwYm9hcmRDbG9jazogKCkgPT4gQ2xpcGJvYXJkQ2xvY2ssCiAgQ2xpcGJvYXJkQ29weTogKCkgPT4gQ2xpcGJvYXJkQ29weSwKICBDbGlwYm9hcmRFZGl0OiAoKSA9PiBDbGlwYm9hcmRQZW4sCiAgQ2xpcGJvYXJkTGlzdDogKCkgPT4gQ2xpcGJvYXJkTGlzdCwKICBDbGlwYm9hcmRNaW51czogKCkgPT4gQ2xpcGJvYXJkTWludXMsCiAgQ2xpcGJvYXJkUGFzdGU6ICgpID0+IENsaXBib2FyZFBhc3RlLAogIENsaXBib2FyZFBlbjogKCkgPT4gQ2xpcGJvYXJkUGVuLAogIENsaXBib2FyZFBlbkxpbmU6ICgpID0+IENsaXBib2FyZFBlbkxpbmUsCiAgQ2xpcGJvYXJkUGx1czogKCkgPT4gQ2xpcGJvYXJkUGx1cywKICBDbGlwYm9hcmRTaWduYXR1cmU6ICgpID0+IENsaXBib2FyZFBlbkxpbmUsCiAgQ2xpcGJvYXJkVHlwZTogKCkgPT4gQ2xpcGJvYXJkVHlwZSwKICBDbGlwYm9hcmRYOiAoKSA9PiBDbGlwYm9hcmRYLAogIENsb2NrOiAoKSA9PiBDbG9jaywKICBDbG9jazE6ICgpID0+IENsb2NrMSwKICBDbG9jazEwOiAoKSA9PiBDbG9jazEwLAogIENsb2NrMTE6ICgpID0+IENsb2NrMTEsCiAgQ2xvY2sxMjogKCkgPT4gQ2xvY2sxMiwKICBDbG9jazI6ICgpID0+IENsb2NrMiwKICBDbG9jazM6ICgpID0+IENsb2NrMywKICBDbG9jazQ6ICgpID0+IENsb2NrNCwKICBDbG9jazU6ICgpID0+IENsb2NrNSwKICBDbG9jazY6ICgpID0+IENsb2NrNiwKICBDbG9jazc6ICgpID0+IENsb2NrNywKICBDbG9jazg6ICgpID0+IENsb2NrOCwKICBDbG9jazk6ICgpID0+IENsb2NrOSwKICBDbG9ja0FsZXJ0OiAoKSA9PiBDbG9ja0FsZXJ0LAogIENsb2NrQXJyb3dEb3duOiAoKSA9PiBDbG9ja0Fycm93RG93biwKICBDbG9ja0Fycm93VXA6ICgpID0+IENsb2NrQXJyb3dVcCwKICBDbG9ja0NoZWNrOiAoKSA9PiBDbG9ja0NoZWNrLAogIENsb2NrRmFkaW5nOiAoKSA9PiBDbG9ja0ZhZGluZywKICBDbG9ja1BsdXM6ICgpID0+IENsb2NrUGx1cywKICBDbG9zZWRDYXB0aW9uOiAoKSA9PiBDbG9zZWRDYXB0aW9uLAogIENsb3VkOiAoKSA9PiBDbG91ZCwKICBDbG91ZEFsZXJ0OiAoKSA9PiBDbG91ZEFsZXJ0LAogIENsb3VkQmFja3VwOiAoKSA9PiBDbG91ZEJhY2t1cCwKICBDbG91ZENoZWNrOiAoKSA9PiBDbG91ZENoZWNrLAogIENsb3VkQ29nOiAoKSA9PiBDbG91ZENvZywKICBDbG91ZERvd25sb2FkOiAoKSA9PiBDbG91ZERvd25sb2FkLAogIENsb3VkRHJpenpsZTogKCkgPT4gQ2xvdWREcml6emxlLAogIENsb3VkRm9nOiAoKSA9PiBDbG91ZEZvZywKICBDbG91ZEhhaWw6ICgpID0+IENsb3VkSGFpbCwKICBDbG91ZExpZ2h0bmluZzogKCkgPT4gQ2xvdWRMaWdodG5pbmcsCiAgQ2xvdWRNb29uOiAoKSA9PiBDbG91ZE1vb24sCiAgQ2xvdWRNb29uUmFpbjogKCkgPT4gQ2xvdWRNb29uUmFpbiwKICBDbG91ZE9mZjogKCkgPT4gQ2xvdWRPZmYsCiAgQ2xvdWRSYWluOiAoKSA9PiBDbG91ZFJhaW4sCiAgQ2xvdWRSYWluV2luZDogKCkgPT4gQ2xvdWRSYWluV2luZCwKICBDbG91ZFNub3c6ICgpID0+IENsb3VkU25vdywKICBDbG91ZFN1bjogKCkgPT4gQ2xvdWRTdW4sCiAgQ2xvdWRTdW5SYWluOiAoKSA9PiBDbG91ZFN1blJhaW4sCiAgQ2xvdWRTeW5jOiAoKSA9PiBDbG91ZFN5bmMsCiAgQ2xvdWRVcGxvYWQ6ICgpID0+IENsb3VkVXBsb2FkLAogIENsb3VkeTogKCkgPT4gQ2xvdWR5LAogIENsb3ZlcjogKCkgPT4gQ2xvdmVyLAogIENsdWI6ICgpID0+IENsdWIsCiAgQ29kZTogKCkgPT4gQ29kZSwKICBDb2RlMjogKCkgPT4gQ29kZVhtbCwKICBDb2RlU3F1YXJlOiAoKSA9PiBTcXVhcmVDb2RlLAogIENvZGVYbWw6ICgpID0+IENvZGVYbWwsCiAgQ29kZXBlbjogKCkgPT4gQ29kZXBlbiwKICBDb2Rlc2FuZGJveDogKCkgPT4gQ29kZXNhbmRib3gsCiAgQ29mZmVlOiAoKSA9PiBDb2ZmZWUsCiAgQ29nOiAoKSA9PiBDb2csCiAgQ29pbnM6ICgpID0+IENvaW5zLAogIENvbHVtbnM6ICgpID0+IENvbHVtbnMyLAogIENvbHVtbnMyOiAoKSA9PiBDb2x1bW5zMiwKICBDb2x1bW5zMzogKCkgPT4gQ29sdW1uczMsCiAgQ29sdW1uczNDb2c6ICgpID0+IENvbHVtbnMzQ29nLAogIENvbHVtbnM0OiAoKSA9PiBDb2x1bW5zNCwKICBDb2x1bW5zU2V0dGluZ3M6ICgpID0+IENvbHVtbnMzQ29nLAogIENvbWJpbmU6ICgpID0+IENvbWJpbmUsCiAgQ29tbWFuZDogKCkgPT4gQ29tbWFuZCwKICBDb21wYXNzOiAoKSA9PiBDb21wYXNzLAogIENvbXBvbmVudDogKCkgPT4gQ29tcG9uZW50LAogIENvbXB1dGVyOiAoKSA9PiBDb21wdXRlciwKICBDb25jaWVyZ2VCZWxsOiAoKSA9PiBDb25jaWVyZ2VCZWxsLAogIENvbmU6ICgpID0+IENvbmUsCiAgQ29uc3RydWN0aW9uOiAoKSA9PiBDb25zdHJ1Y3Rpb24sCiAgQ29udGFjdDogKCkgPT4gQ29udGFjdCwKICBDb250YWN0MjogKCkgPT4gQ29udGFjdFJvdW5kLAogIENvbnRhY3RSb3VuZDogKCkgPT4gQ29udGFjdFJvdW5kLAogIENvbnRhaW5lcjogKCkgPT4gQ29udGFpbmVyLAogIENvbnRyYXN0OiAoKSA9PiBDb250cmFzdCwKICBDb29raWU6ICgpID0+IENvb2tpZSwKICBDb29raW5nUG90OiAoKSA9PiBDb29raW5nUG90LAogIENvcHk6ICgpID0+IENvcHksCiAgQ29weUNoZWNrOiAoKSA9PiBDb3B5Q2hlY2ssCiAgQ29weU1pbnVzOiAoKSA9PiBDb3B5TWludXMsCiAgQ29weVBsdXM6ICgpID0+IENvcHlQbHVzLAogIENvcHlTbGFzaDogKCkgPT4gQ29weVNsYXNoLAogIENvcHlYOiAoKSA9PiBDb3B5WCwKICBDb3B5bGVmdDogKCkgPT4gQ29weWxlZnQsCiAgQ29weXJpZ2h0OiAoKSA9PiBDb3B5cmlnaHQsCiAgQ29ybmVyRG93bkxlZnQ6ICgpID0+IENvcm5lckRvd25MZWZ0LAogIENvcm5lckRvd25SaWdodDogKCkgPT4gQ29ybmVyRG93blJpZ2h0LAogIENvcm5lckxlZnREb3duOiAoKSA9PiBDb3JuZXJMZWZ0RG93biwKICBDb3JuZXJMZWZ0VXA6ICgpID0+IENvcm5lckxlZnRVcCwKICBDb3JuZXJSaWdodERvd246ICgpID0+IENvcm5lclJpZ2h0RG93biwKICBDb3JuZXJSaWdodFVwOiAoKSA9PiBDb3JuZXJSaWdodFVwLAogIENvcm5lclVwTGVmdDogKCkgPT4gQ29ybmVyVXBMZWZ0LAogIENvcm5lclVwUmlnaHQ6ICgpID0+IENvcm5lclVwUmlnaHQsCiAgQ3B1OiAoKSA9PiBDcHUsCiAgQ3JlYXRpdmVDb21tb25zOiAoKSA9PiBDcmVhdGl2ZUNvbW1vbnMsCiAgQ3JlZGl0Q2FyZDogKCkgPT4gQ3JlZGl0Q2FyZCwKICBDcm9pc3NhbnQ6ICgpID0+IENyb2lzc2FudCwKICBDcm9wOiAoKSA9PiBDcm9wLAogIENyb3NzOiAoKSA9PiBDcm9zcywKICBDcm9zc2hhaXI6ICgpID0+IENyb3NzaGFpciwKICBDcm93bjogKCkgPT4gQ3Jvd24sCiAgQ3Vib2lkOiAoKSA9PiBDdWJvaWQsCiAgQ3VwU29kYTogKCkgPT4gQ3VwU29kYSwKICBDdXJseUJyYWNlczogKCkgPT4gQnJhY2VzLAogIEN1cnJlbmN5OiAoKSA9PiBDdXJyZW5jeSwKICBDeWxpbmRlcjogKCkgPT4gQ3lsaW5kZXIsCiAgRGFtOiAoKSA9PiBEYW0sCiAgRGF0YWJhc2U6ICgpID0+IERhdGFiYXNlLAogIERhdGFiYXNlQmFja3VwOiAoKSA9PiBEYXRhYmFzZUJhY2t1cCwKICBEYXRhYmFzZVNlYXJjaDogKCkgPT4gRGF0YWJhc2VTZWFyY2gsCiAgRGF0YWJhc2VaYXA6ICgpID0+IERhdGFiYXNlWmFwLAogIERlY2ltYWxzQXJyb3dMZWZ0OiAoKSA9PiBEZWNpbWFsc0Fycm93TGVmdCwKICBEZWNpbWFsc0Fycm93UmlnaHQ6ICgpID0+IERlY2ltYWxzQXJyb3dSaWdodCwKICBEZWxldGU6ICgpID0+IERlbGV0ZSwKICBEZXNzZXJ0OiAoKSA9PiBEZXNzZXJ0LAogIERpYW1ldGVyOiAoKSA9PiBEaWFtZXRlciwKICBEaWFtb25kOiAoKSA9PiBEaWFtb25kLAogIERpYW1vbmRNaW51czogKCkgPT4gRGlhbW9uZE1pbnVzLAogIERpYW1vbmRQZXJjZW50OiAoKSA9PiBEaWFtb25kUGVyY2VudCwKICBEaWFtb25kUGx1czogKCkgPT4gRGlhbW9uZFBsdXMsCiAgRGljZTE6ICgpID0+IERpY2UxLAogIERpY2UyOiAoKSA9PiBEaWNlMiwKICBEaWNlMzogKCkgPT4gRGljZTMsCiAgRGljZTQ6ICgpID0+IERpY2U0LAogIERpY2U1OiAoKSA9PiBEaWNlNSwKICBEaWNlNjogKCkgPT4gRGljZTYsCiAgRGljZXM6ICgpID0+IERpY2VzLAogIERpZmY6ICgpID0+IERpZmYsCiAgRGlzYzogKCkgPT4gRGlzYywKICBEaXNjMjogKCkgPT4gRGlzYzIsCiAgRGlzYzM6ICgpID0+IERpc2MzLAogIERpc2NBbGJ1bTogKCkgPT4gRGlzY0FsYnVtLAogIERpdmlkZTogKCkgPT4gRGl2aWRlLAogIERpdmlkZUNpcmNsZTogKCkgPT4gQ2lyY2xlRGl2aWRlLAogIERpdmlkZVNxdWFyZTogKCkgPT4gU3F1YXJlRGl2aWRlLAogIERuYTogKCkgPT4gRG5hLAogIERuYU9mZjogKCkgPT4gRG5hT2ZmLAogIERvY2s6ICgpID0+IERvY2ssCiAgRG9nOiAoKSA9PiBEb2csCiAgRG9sbGFyU2lnbjogKCkgPT4gRG9sbGFyU2lnbiwKICBEb251dDogKCkgPT4gRG9udXQsCiAgRG9vckNsb3NlZDogKCkgPT4gRG9vckNsb3NlZCwKICBEb29yQ2xvc2VkTG9ja2VkOiAoKSA9PiBEb29yQ2xvc2VkTG9ja2VkLAogIERvb3JPcGVuOiAoKSA9PiBEb29yT3BlbiwKICBEb3Q6ICgpID0+IERvdCwKICBEb3RTcXVhcmU6ICgpID0+IFNxdWFyZURvdCwKICBEb3dubG9hZDogKCkgPT4gRG93bmxvYWQsCiAgRG93bmxvYWRDbG91ZDogKCkgPT4gQ2xvdWREb3dubG9hZCwKICBEcmFmdGluZ0NvbXBhc3M6ICgpID0+IERyYWZ0aW5nQ29tcGFzcywKICBEcmFtYTogKCkgPT4gRHJhbWEsCiAgRHJpYmJibGU6ICgpID0+IERyaWJiYmxlLAogIERyaWxsOiAoKSA9PiBEcmlsbCwKICBEcm9uZTogKCkgPT4gRHJvbmUsCiAgRHJvcGxldDogKCkgPT4gRHJvcGxldCwKICBEcm9wbGV0T2ZmOiAoKSA9PiBEcm9wbGV0T2ZmLAogIERyb3BsZXRzOiAoKSA9PiBEcm9wbGV0cywKICBEcnVtOiAoKSA9PiBEcnVtLAogIERydW1zdGljazogKCkgPT4gRHJ1bXN0aWNrLAogIER1bWJiZWxsOiAoKSA9PiBEdW1iYmVsbCwKICBFYXI6ICgpID0+IEVhciwKICBFYXJPZmY6ICgpID0+IEVhck9mZiwKICBFYXJ0aDogKCkgPT4gRWFydGgsCiAgRWFydGhMb2NrOiAoKSA9PiBFYXJ0aExvY2ssCiAgRWNsaXBzZTogKCkgPT4gRWNsaXBzZSwKICBFZGl0OiAoKSA9PiBTcXVhcmVQZW4sCiAgRWRpdDI6ICgpID0+IFBlbiwKICBFZGl0MzogKCkgPT4gUGVuTGluZSwKICBFZ2c6ICgpID0+IEVnZywKICBFZ2dGcmllZDogKCkgPT4gRWdnRnJpZWQsCiAgRWdnT2ZmOiAoKSA9PiBFZ2dPZmYsCiAgRWxsaXBzZTogKCkgPT4gRWxsaXBzZSwKICBFbGxpcHNpczogKCkgPT4gRWxsaXBzaXMsCiAgRWxsaXBzaXNWZXJ0aWNhbDogKCkgPT4gRWxsaXBzaXNWZXJ0aWNhbCwKICBFcXVhbDogKCkgPT4gRXF1YWwsCiAgRXF1YWxBcHByb3hpbWF0ZWx5OiAoKSA9PiBFcXVhbEFwcHJveGltYXRlbHksCiAgRXF1YWxOb3Q6ICgpID0+IEVxdWFsTm90LAogIEVxdWFsU3F1YXJlOiAoKSA9PiBTcXVhcmVFcXVhbCwKICBFcmFzZXI6ICgpID0+IEVyYXNlciwKICBFdGhlcm5ldFBvcnQ6ICgpID0+IEV0aGVybmV0UG9ydCwKICBFdXJvOiAoKSA9PiBFdXJvLAogIEV2Q2hhcmdlcjogKCkgPT4gRXZDaGFyZ2VyLAogIEV4cGFuZDogKCkgPT4gRXhwYW5kLAogIEV4dGVybmFsTGluazogKCkgPT4gRXh0ZXJuYWxMaW5rLAogIEV5ZTogKCkgPT4gRXllLAogIEV5ZUNsb3NlZDogKCkgPT4gRXllQ2xvc2VkLAogIEV5ZU9mZjogKCkgPT4gRXllT2ZmLAogIEZhY2Vib29rOiAoKSA9PiBGYWNlYm9vaywKICBGYWN0b3J5OiAoKSA9PiBGYWN0b3J5LAogIEZhbjogKCkgPT4gRmFuLAogIEZhc3RGb3J3YXJkOiAoKSA9PiBGYXN0Rm9yd2FyZCwKICBGZWF0aGVyOiAoKSA9PiBGZWF0aGVyLAogIEZlbmNlOiAoKSA9PiBGZW5jZSwKICBGZXJyaXNXaGVlbDogKCkgPT4gRmVycmlzV2hlZWwsCiAgRmlnbWE6ICgpID0+IEZpZ21hLAogIEZpbGU6ICgpID0+IEZpbGUsCiAgRmlsZUFyY2hpdmU6ICgpID0+IEZpbGVBcmNoaXZlLAogIEZpbGVBdWRpbzogKCkgPT4gRmlsZUhlYWRwaG9uZSwKICBGaWxlQXVkaW8yOiAoKSA9PiBGaWxlSGVhZHBob25lLAogIEZpbGVBeGlzM0Q6ICgpID0+IEZpbGVBeGlzM2QsCiAgRmlsZUF4aXMzZDogKCkgPT4gRmlsZUF4aXMzZCwKICBGaWxlQmFkZ2U6ICgpID0+IEZpbGVCYWRnZSwKICBGaWxlQmFkZ2UyOiAoKSA9PiBGaWxlQmFkZ2UsCiAgRmlsZUJhckNoYXJ0OiAoKSA9PiBGaWxlQ2hhcnRDb2x1bW5JbmNyZWFzaW5nLAogIEZpbGVCYXJDaGFydDI6ICgpID0+IEZpbGVDaGFydENvbHVtbiwKICBGaWxlQm94OiAoKSA9PiBGaWxlQm94LAogIEZpbGVCcmFjZXM6ICgpID0+IEZpbGVCcmFjZXMsCiAgRmlsZUJyYWNlc0Nvcm5lcjogKCkgPT4gRmlsZUJyYWNlc0Nvcm5lciwKICBGaWxlQ2hhcnRDb2x1bW46ICgpID0+IEZpbGVDaGFydENvbHVtbiwKICBGaWxlQ2hhcnRDb2x1bW5JbmNyZWFzaW5nOiAoKSA9PiBGaWxlQ2hhcnRDb2x1bW5JbmNyZWFzaW5nLAogIEZpbGVDaGFydExpbmU6ICgpID0+IEZpbGVDaGFydExpbmUsCiAgRmlsZUNoYXJ0UGllOiAoKSA9PiBGaWxlQ2hhcnRQaWUsCiAgRmlsZUNoZWNrOiAoKSA9PiBGaWxlQ2hlY2ssCiAgRmlsZUNoZWNrMjogKCkgPT4gRmlsZUNoZWNrQ29ybmVyLAogIEZpbGVDaGVja0Nvcm5lcjogKCkgPT4gRmlsZUNoZWNrQ29ybmVyLAogIEZpbGVDbG9jazogKCkgPT4gRmlsZUNsb2NrLAogIEZpbGVDb2RlOiAoKSA9PiBGaWxlQ29kZSwKICBGaWxlQ29kZTI6ICgpID0+IEZpbGVDb2RlQ29ybmVyLAogIEZpbGVDb2RlQ29ybmVyOiAoKSA9PiBGaWxlQ29kZUNvcm5lciwKICBGaWxlQ29nOiAoKSA9PiBGaWxlQ29nLAogIEZpbGVDb2cyOiAoKSA9PiBGaWxlQ29nLAogIEZpbGVEaWZmOiAoKSA9PiBGaWxlRGlmZiwKICBGaWxlRGlnaXQ6ICgpID0+IEZpbGVEaWdpdCwKICBGaWxlRG93bjogKCkgPT4gRmlsZURvd24sCiAgRmlsZUVkaXQ6ICgpID0+IEZpbGVQZW4sCiAgRmlsZUV4Y2xhbWF0aW9uUG9pbnQ6ICgpID0+IEZpbGVFeGNsYW1hdGlvblBvaW50LAogIEZpbGVIZWFkcGhvbmU6ICgpID0+IEZpbGVIZWFkcGhvbmUsCiAgRmlsZUhlYXJ0OiAoKSA9PiBGaWxlSGVhcnQsCiAgRmlsZUltYWdlOiAoKSA9PiBGaWxlSW1hZ2UsCiAgRmlsZUlucHV0OiAoKSA9PiBGaWxlSW5wdXQsCiAgRmlsZUpzb246ICgpID0+IEZpbGVCcmFjZXMsCiAgRmlsZUpzb24yOiAoKSA9PiBGaWxlQnJhY2VzQ29ybmVyLAogIEZpbGVLZXk6ICgpID0+IEZpbGVLZXksCiAgRmlsZUtleTI6ICgpID0+IEZpbGVLZXksCiAgRmlsZUxpbmVDaGFydDogKCkgPT4gRmlsZUNoYXJ0TGluZSwKICBGaWxlTG9jazogKCkgPT4gRmlsZUxvY2ssCiAgRmlsZUxvY2syOiAoKSA9PiBGaWxlTG9jaywKICBGaWxlTWludXM6ICgpID0+IEZpbGVNaW51cywKICBGaWxlTWludXMyOiAoKSA9PiBGaWxlTWludXNDb3JuZXIsCiAgRmlsZU1pbnVzQ29ybmVyOiAoKSA9PiBGaWxlTWludXNDb3JuZXIsCiAgRmlsZU11c2ljOiAoKSA9PiBGaWxlTXVzaWMsCiAgRmlsZU91dHB1dDogKCkgPT4gRmlsZU91dHB1dCwKICBGaWxlUGVuOiAoKSA9PiBGaWxlUGVuLAogIEZpbGVQZW5MaW5lOiAoKSA9PiBGaWxlUGVuTGluZSwKICBGaWxlUGllQ2hhcnQ6ICgpID0+IEZpbGVDaGFydFBpZSwKICBGaWxlUGxheTogKCkgPT4gRmlsZVBsYXksCiAgRmlsZVBsdXM6ICgpID0+IEZpbGVQbHVzLAogIEZpbGVQbHVzMjogKCkgPT4gRmlsZVBsdXNDb3JuZXIsCiAgRmlsZVBsdXNDb3JuZXI6ICgpID0+IEZpbGVQbHVzQ29ybmVyLAogIEZpbGVRdWVzdGlvbjogKCkgPT4gRmlsZVF1ZXN0aW9uTWFyaywKICBGaWxlUXVlc3Rpb25NYXJrOiAoKSA9PiBGaWxlUXVlc3Rpb25NYXJrLAogIEZpbGVTY2FuOiAoKSA9PiBGaWxlU2NhbiwKICBGaWxlU2VhcmNoOiAoKSA9PiBGaWxlU2VhcmNoLAogIEZpbGVTZWFyY2gyOiAoKSA9PiBGaWxlU2VhcmNoQ29ybmVyLAogIEZpbGVTZWFyY2hDb3JuZXI6ICgpID0+IEZpbGVTZWFyY2hDb3JuZXIsCiAgRmlsZVNpZ25hbDogKCkgPT4gRmlsZVNpZ25hbCwKICBGaWxlU2lnbmF0dXJlOiAoKSA9PiBGaWxlUGVuTGluZSwKICBGaWxlU2xpZGVyczogKCkgPT4gRmlsZVNsaWRlcnMsCiAgRmlsZVNwcmVhZHNoZWV0OiAoKSA9PiBGaWxlU3ByZWFkc2hlZXQsCiAgRmlsZVN0YWNrOiAoKSA9PiBGaWxlU3RhY2ssCiAgRmlsZVN5bWxpbms6ICgpID0+IEZpbGVTeW1saW5rLAogIEZpbGVUZXJtaW5hbDogKCkgPT4gRmlsZVRlcm1pbmFsLAogIEZpbGVUZXh0OiAoKSA9PiBGaWxlVGV4dCwKICBGaWxlVHlwZTogKCkgPT4gRmlsZVR5cGUsCiAgRmlsZVR5cGUyOiAoKSA9PiBGaWxlVHlwZUNvcm5lciwKICBGaWxlVHlwZUNvcm5lcjogKCkgPT4gRmlsZVR5cGVDb3JuZXIsCiAgRmlsZVVwOiAoKSA9PiBGaWxlVXAsCiAgRmlsZVVzZXI6ICgpID0+IEZpbGVVc2VyLAogIEZpbGVWaWRlbzogKCkgPT4gRmlsZVBsYXksCiAgRmlsZVZpZGVvMjogKCkgPT4gRmlsZVZpZGVvQ2FtZXJhLAogIEZpbGVWaWRlb0NhbWVyYTogKCkgPT4gRmlsZVZpZGVvQ2FtZXJhLAogIEZpbGVWb2x1bWU6ICgpID0+IEZpbGVWb2x1bWUsCiAgRmlsZVZvbHVtZTI6ICgpID0+IEZpbGVTaWduYWwsCiAgRmlsZVdhcm5pbmc6ICgpID0+IEZpbGVFeGNsYW1hdGlvblBvaW50LAogIEZpbGVYOiAoKSA9PiBGaWxlWCwKICBGaWxlWDI6ICgpID0+IEZpbGVYQ29ybmVyLAogIEZpbGVYQ29ybmVyOiAoKSA9PiBGaWxlWENvcm5lciwKICBGaWxlczogKCkgPT4gRmlsZXMsCiAgRmlsbTogKCkgPT4gRmlsbSwKICBGaWx0ZXI6ICgpID0+IEZ1bm5lbCwKICBGaWx0ZXJYOiAoKSA9PiBGdW5uZWxYLAogIEZpbmdlcnByaW50OiAoKSA9PiBGaW5nZXJwcmludFBhdHRlcm4sCiAgRmluZ2VycHJpbnRQYXR0ZXJuOiAoKSA9PiBGaW5nZXJwcmludFBhdHRlcm4sCiAgRmlyZUV4dGluZ3Vpc2hlcjogKCkgPT4gRmlyZUV4dGluZ3Vpc2hlciwKICBGaXNoOiAoKSA9PiBGaXNoLAogIEZpc2hPZmY6ICgpID0+IEZpc2hPZmYsCiAgRmlzaFN5bWJvbDogKCkgPT4gRmlzaFN5bWJvbCwKICBGaXNoaW5nSG9vazogKCkgPT4gRmlzaGluZ0hvb2ssCiAgRmlzaGluZ1JvZDogKCkgPT4gRmlzaGluZ1JvZCwKICBGbGFnOiAoKSA9PiBGbGFnLAogIEZsYWdPZmY6ICgpID0+IEZsYWdPZmYsCiAgRmxhZ1RyaWFuZ2xlTGVmdDogKCkgPT4gRmxhZ1RyaWFuZ2xlTGVmdCwKICBGbGFnVHJpYW5nbGVSaWdodDogKCkgPT4gRmxhZ1RyaWFuZ2xlUmlnaHQsCiAgRmxhbWU6ICgpID0+IEZsYW1lLAogIEZsYW1lS2luZGxpbmc6ICgpID0+IEZsYW1lS2luZGxpbmcsCiAgRmxhc2hsaWdodDogKCkgPT4gRmxhc2hsaWdodCwKICBGbGFzaGxpZ2h0T2ZmOiAoKSA9PiBGbGFzaGxpZ2h0T2ZmLAogIEZsYXNrQ29uaWNhbDogKCkgPT4gRmxhc2tDb25pY2FsLAogIEZsYXNrQ29uaWNhbE9mZjogKCkgPT4gRmxhc2tDb25pY2FsT2ZmLAogIEZsYXNrUm91bmQ6ICgpID0+IEZsYXNrUm91bmQsCiAgRmxpcEhvcml6b250YWw6ICgpID0+IFNxdWFyZUNlbnRlcmxpbmVEYXNoZWRIb3Jpem9udGFsLAogIEZsaXBIb3Jpem9udGFsMjogKCkgPT4gRmxpcEhvcml6b250YWwyLAogIEZsaXBWZXJ0aWNhbDogKCkgPT4gU3F1YXJlQ2VudGVybGluZURhc2hlZFZlcnRpY2FsLAogIEZsaXBWZXJ0aWNhbDI6ICgpID0+IEZsaXBWZXJ0aWNhbDIsCiAgRmxvd2VyOiAoKSA9PiBGbG93ZXIsCiAgRmxvd2VyMjogKCkgPT4gRmxvd2VyMiwKICBGb2N1czogKCkgPT4gRm9jdXMsCiAgRm9sZEhvcml6b250YWw6ICgpID0+IEZvbGRIb3Jpem9udGFsLAogIEZvbGRWZXJ0aWNhbDogKCkgPT4gRm9sZFZlcnRpY2FsLAogIEZvbGRlcjogKCkgPT4gRm9sZGVyLAogIEZvbGRlckFyY2hpdmU6ICgpID0+IEZvbGRlckFyY2hpdmUsCiAgRm9sZGVyQ2hlY2s6ICgpID0+IEZvbGRlckNoZWNrLAogIEZvbGRlckNsb2NrOiAoKSA9PiBGb2xkZXJDbG9jaywKICBGb2xkZXJDbG9zZWQ6ICgpID0+IEZvbGRlckNsb3NlZCwKICBGb2xkZXJDb2RlOiAoKSA9PiBGb2xkZXJDb2RlLAogIEZvbGRlckNvZzogKCkgPT4gRm9sZGVyQ29nLAogIEZvbGRlckNvZzI6ICgpID0+IEZvbGRlckNvZywKICBGb2xkZXJEb3Q6ICgpID0+IEZvbGRlckRvdCwKICBGb2xkZXJEb3duOiAoKSA9PiBGb2xkZXJEb3duLAogIEZvbGRlckVkaXQ6ICgpID0+IEZvbGRlclBlbiwKICBGb2xkZXJHaXQ6ICgpID0+IEZvbGRlckdpdCwKICBGb2xkZXJHaXQyOiAoKSA9PiBGb2xkZXJHaXQyLAogIEZvbGRlckhlYXJ0OiAoKSA9PiBGb2xkZXJIZWFydCwKICBGb2xkZXJJbnB1dDogKCkgPT4gRm9sZGVySW5wdXQsCiAgRm9sZGVyS2FuYmFuOiAoKSA9PiBGb2xkZXJLYW5iYW4sCiAgRm9sZGVyS2V5OiAoKSA9PiBGb2xkZXJLZXksCiAgRm9sZGVyTG9jazogKCkgPT4gRm9sZGVyTG9jaywKICBGb2xkZXJNaW51czogKCkgPT4gRm9sZGVyTWludXMsCiAgRm9sZGVyT3BlbjogKCkgPT4gRm9sZGVyT3BlbiwKICBGb2xkZXJPcGVuRG90OiAoKSA9PiBGb2xkZXJPcGVuRG90LAogIEZvbGRlck91dHB1dDogKCkgPT4gRm9sZGVyT3V0cHV0LAogIEZvbGRlclBlbjogKCkgPT4gRm9sZGVyUGVuLAogIEZvbGRlclBsdXM6ICgpID0+IEZvbGRlclBsdXMsCiAgRm9sZGVyUm9vdDogKCkgPT4gRm9sZGVyUm9vdCwKICBGb2xkZXJTZWFyY2g6ICgpID0+IEZvbGRlclNlYXJjaCwKICBGb2xkZXJTZWFyY2gyOiAoKSA9PiBGb2xkZXJTZWFyY2gyLAogIEZvbGRlclN5bWxpbms6ICgpID0+IEZvbGRlclN5bWxpbmssCiAgRm9sZGVyU3luYzogKCkgPT4gRm9sZGVyU3luYywKICBGb2xkZXJUcmVlOiAoKSA9PiBGb2xkZXJUcmVlLAogIEZvbGRlclVwOiAoKSA9PiBGb2xkZXJVcCwKICBGb2xkZXJYOiAoKSA9PiBGb2xkZXJYLAogIEZvbGRlcnM6ICgpID0+IEZvbGRlcnMsCiAgRm9vdHByaW50czogKCkgPT4gRm9vdHByaW50cywKICBGb3JrS25pZmU6ICgpID0+IFV0ZW5zaWxzLAogIEZvcmtLbmlmZUNyb3NzZWQ6ICgpID0+IFV0ZW5zaWxzQ3Jvc3NlZCwKICBGb3JrbGlmdDogKCkgPT4gRm9ya2xpZnQsCiAgRm9ybTogKCkgPT4gRm9ybSwKICBGb3JtSW5wdXQ6ICgpID0+IFJlY3RhbmdsZUVsbGlwc2lzLAogIEZvcndhcmQ6ICgpID0+IEZvcndhcmQsCiAgRnJhbWU6ICgpID0+IEZyYW1lLAogIEZyYW1lcjogKCkgPT4gRnJhbWVyLAogIEZyb3duOiAoKSA9PiBGcm93biwKICBGdWVsOiAoKSA9PiBGdWVsLAogIEZ1bGxzY3JlZW46ICgpID0+IEZ1bGxzY3JlZW4sCiAgRnVuY3Rpb25TcXVhcmU6ICgpID0+IFNxdWFyZUZ1bmN0aW9uLAogIEZ1bm5lbDogKCkgPT4gRnVubmVsLAogIEZ1bm5lbFBsdXM6ICgpID0+IEZ1bm5lbFBsdXMsCiAgRnVubmVsWDogKCkgPT4gRnVubmVsWCwKICBHYWxsZXJ5SG9yaXpvbnRhbDogKCkgPT4gR2FsbGVyeUhvcml6b250YWwsCiAgR2FsbGVyeUhvcml6b250YWxFbmQ6ICgpID0+IEdhbGxlcnlIb3Jpem9udGFsRW5kLAogIEdhbGxlcnlUaHVtYm5haWxzOiAoKSA9PiBHYWxsZXJ5VGh1bWJuYWlscywKICBHYWxsZXJ5VmVydGljYWw6ICgpID0+IEdhbGxlcnlWZXJ0aWNhbCwKICBHYWxsZXJ5VmVydGljYWxFbmQ6ICgpID0+IEdhbGxlcnlWZXJ0aWNhbEVuZCwKICBHYW1lcGFkOiAoKSA9PiBHYW1lcGFkLAogIEdhbWVwYWQyOiAoKSA9PiBHYW1lcGFkMiwKICBHYW1lcGFkRGlyZWN0aW9uYWw6ICgpID0+IEdhbWVwYWREaXJlY3Rpb25hbCwKICBHYW50dENoYXJ0OiAoKSA9PiBDaGFydE5vQXhlc0dhbnR0LAogIEdhbnR0Q2hhcnRTcXVhcmU6ICgpID0+IFNxdWFyZUNoYXJ0R2FudHQsCiAgR2F1Z2U6ICgpID0+IEdhdWdlLAogIEdhdWdlQ2lyY2xlOiAoKSA9PiBDaXJjbGVHYXVnZSwKICBHYXZlbDogKCkgPT4gR2F2ZWwsCiAgR2VtOiAoKSA9PiBHZW0sCiAgR2VvcmdpYW5MYXJpOiAoKSA9PiBHZW9yZ2lhbkxhcmksCiAgR2hvc3Q6ICgpID0+IEdob3N0LAogIEdpZnQ6ICgpID0+IEdpZnQsCiAgR2l0QnJhbmNoOiAoKSA9PiBHaXRCcmFuY2gsCiAgR2l0QnJhbmNoTWludXM6ICgpID0+IEdpdEJyYW5jaE1pbnVzLAogIEdpdEJyYW5jaFBsdXM6ICgpID0+IEdpdEJyYW5jaFBsdXMsCiAgR2l0Q29tbWl0OiAoKSA9PiBHaXRDb21taXRIb3Jpem9udGFsLAogIEdpdENvbW1pdEhvcml6b250YWw6ICgpID0+IEdpdENvbW1pdEhvcml6b250YWwsCiAgR2l0Q29tbWl0VmVydGljYWw6ICgpID0+IEdpdENvbW1pdFZlcnRpY2FsLAogIEdpdENvbXBhcmU6ICgpID0+IEdpdENvbXBhcmUsCiAgR2l0Q29tcGFyZUFycm93czogKCkgPT4gR2l0Q29tcGFyZUFycm93cywKICBHaXRGb3JrOiAoKSA9PiBHaXRGb3JrLAogIEdpdEdyYXBoOiAoKSA9PiBHaXRHcmFwaCwKICBHaXRNZXJnZTogKCkgPT4gR2l0TWVyZ2UsCiAgR2l0TWVyZ2VDb25mbGljdDogKCkgPT4gR2l0TWVyZ2VDb25mbGljdCwKICBHaXRQdWxsUmVxdWVzdDogKCkgPT4gR2l0UHVsbFJlcXVlc3QsCiAgR2l0UHVsbFJlcXVlc3RBcnJvdzogKCkgPT4gR2l0UHVsbFJlcXVlc3RBcnJvdywKICBHaXRQdWxsUmVxdWVzdENsb3NlZDogKCkgPT4gR2l0UHVsbFJlcXVlc3RDbG9zZWQsCiAgR2l0UHVsbFJlcXVlc3RDcmVhdGU6ICgpID0+IEdpdFB1bGxSZXF1ZXN0Q3JlYXRlLAogIEdpdFB1bGxSZXF1ZXN0Q3JlYXRlQXJyb3c6ICgpID0+IEdpdFB1bGxSZXF1ZXN0Q3JlYXRlQXJyb3csCiAgR2l0UHVsbFJlcXVlc3REcmFmdDogKCkgPT4gR2l0UHVsbFJlcXVlc3REcmFmdCwKICBHaXRodWI6ICgpID0+IEdpdGh1YiwKICBHaXRsYWI6ICgpID0+IEdpdGxhYiwKICBHbGFzc1dhdGVyOiAoKSA9PiBHbGFzc1dhdGVyLAogIEdsYXNzZXM6ICgpID0+IEdsYXNzZXMsCiAgR2xvYmU6ICgpID0+IEdsb2JlLAogIEdsb2JlMjogKCkgPT4gRWFydGgsCiAgR2xvYmVMb2NrOiAoKSA9PiBHbG9iZUxvY2ssCiAgR2xvYmVPZmY6ICgpID0+IEdsb2JlT2ZmLAogIEdsb2JlWDogKCkgPT4gR2xvYmVYLAogIEdvYWw6ICgpID0+IEdvYWwsCiAgR3B1OiAoKSA9PiBHcHUsCiAgR3JhYjogKCkgPT4gSGFuZEdyYWIsCiAgR3JhZHVhdGlvbkNhcDogKCkgPT4gR3JhZHVhdGlvbkNhcCwKICBHcmFwZTogKCkgPT4gR3JhcGUsCiAgR3JpZDogKCkgPT4gR3JpZDN4MywKICBHcmlkMlgyOiAoKSA9PiBHcmlkMngyLAogIEdyaWQyWDJDaGVjazogKCkgPT4gR3JpZDJ4MkNoZWNrLAogIEdyaWQyWDJQbHVzOiAoKSA9PiBHcmlkMngyUGx1cywKICBHcmlkMlgyWDogKCkgPT4gR3JpZDJ4MlgsCiAgR3JpZDJ4MjogKCkgPT4gR3JpZDJ4MiwKICBHcmlkMngyQ2hlY2s6ICgpID0+IEdyaWQyeDJDaGVjaywKICBHcmlkMngyUGx1czogKCkgPT4gR3JpZDJ4MlBsdXMsCiAgR3JpZDJ4Mlg6ICgpID0+IEdyaWQyeDJYLAogIEdyaWQzWDM6ICgpID0+IEdyaWQzeDMsCiAgR3JpZDN4MjogKCkgPT4gR3JpZDN4MiwKICBHcmlkM3gzOiAoKSA9PiBHcmlkM3gzLAogIEdyaXA6ICgpID0+IEdyaXAsCiAgR3JpcEhvcml6b250YWw6ICgpID0+IEdyaXBIb3Jpem9udGFsLAogIEdyaXBWZXJ0aWNhbDogKCkgPT4gR3JpcFZlcnRpY2FsLAogIEdyb3VwOiAoKSA9PiBHcm91cCwKICBHdWl0YXI6ICgpID0+IEd1aXRhciwKICBIYW06ICgpID0+IEhhbSwKICBIYW1idXJnZXI6ICgpID0+IEhhbWJ1cmdlciwKICBIYW1tZXI6ICgpID0+IEhhbW1lciwKICBIYW5kOiAoKSA9PiBIYW5kLAogIEhhbmRDb2luczogKCkgPT4gSGFuZENvaW5zLAogIEhhbmRGaXN0OiAoKSA9PiBIYW5kRmlzdCwKICBIYW5kR3JhYjogKCkgPT4gSGFuZEdyYWIsCiAgSGFuZEhlYXJ0OiAoKSA9PiBIYW5kSGVhcnQsCiAgSGFuZEhlbHBpbmc6ICgpID0+IEhhbmRIZWxwaW5nLAogIEhhbmRNZXRhbDogKCkgPT4gSGFuZE1ldGFsLAogIEhhbmRQbGF0dGVyOiAoKSA9PiBIYW5kUGxhdHRlciwKICBIYW5kYmFnOiAoKSA9PiBIYW5kYmFnLAogIEhhbmRzaGFrZTogKCkgPT4gSGFuZHNoYWtlLAogIEhhcmREcml2ZTogKCkgPT4gSGFyZERyaXZlLAogIEhhcmREcml2ZURvd25sb2FkOiAoKSA9PiBIYXJkRHJpdmVEb3dubG9hZCwKICBIYXJkRHJpdmVVcGxvYWQ6ICgpID0+IEhhcmREcml2ZVVwbG9hZCwKICBIYXJkSGF0OiAoKSA9PiBIYXJkSGF0LAogIEhhc2g6ICgpID0+IEhhc2gsCiAgSGF0R2xhc3NlczogKCkgPT4gSGF0R2xhc3NlcywKICBIYXplOiAoKSA9PiBIYXplLAogIEhkOiAoKSA9PiBIZCwKICBIZG1pUG9ydDogKCkgPT4gSGRtaVBvcnQsCiAgSGVhZGluZzogKCkgPT4gSGVhZGluZywKICBIZWFkaW5nMTogKCkgPT4gSGVhZGluZzEsCiAgSGVhZGluZzI6ICgpID0+IEhlYWRpbmcyLAogIEhlYWRpbmczOiAoKSA9PiBIZWFkaW5nMywKICBIZWFkaW5nNDogKCkgPT4gSGVhZGluZzQsCiAgSGVhZGluZzU6ICgpID0+IEhlYWRpbmc1LAogIEhlYWRpbmc2OiAoKSA9PiBIZWFkaW5nNiwKICBIZWFkcGhvbmVPZmY6ICgpID0+IEhlYWRwaG9uZU9mZiwKICBIZWFkcGhvbmVzOiAoKSA9PiBIZWFkcGhvbmVzLAogIEhlYWRzZXQ6ICgpID0+IEhlYWRzZXQsCiAgSGVhcnQ6ICgpID0+IEhlYXJ0LAogIEhlYXJ0Q3JhY2s6ICgpID0+IEhlYXJ0Q3JhY2ssCiAgSGVhcnRIYW5kc2hha2U6ICgpID0+IEhlYXJ0SGFuZHNoYWtlLAogIEhlYXJ0TWludXM6ICgpID0+IEhlYXJ0TWludXMsCiAgSGVhcnRPZmY6ICgpID0+IEhlYXJ0T2ZmLAogIEhlYXJ0UGx1czogKCkgPT4gSGVhcnRQbHVzLAogIEhlYXJ0UHVsc2U6ICgpID0+IEhlYXJ0UHVsc2UsCiAgSGVhdGVyOiAoKSA9PiBIZWF0ZXIsCiAgSGVsaWNvcHRlcjogKCkgPT4gSGVsaWNvcHRlciwKICBIZWxwQ2lyY2xlOiAoKSA9PiBDaXJjbGVRdWVzdGlvbk1hcmssCiAgSGVscGluZ0hhbmQ6ICgpID0+IEhhbmRIZWxwaW5nLAogIEhleGFnb246ICgpID0+IEhleGFnb24sCiAgSGlnaGxpZ2h0ZXI6ICgpID0+IEhpZ2hsaWdodGVyLAogIEhpc3Rvcnk6ICgpID0+IEhpc3RvcnksCiAgSG9tZTogKCkgPT4gSG91c2UsCiAgSG9wOiAoKSA9PiBIb3AsCiAgSG9wT2ZmOiAoKSA9PiBIb3BPZmYsCiAgSG9zcGl0YWw6ICgpID0+IEhvc3BpdGFsLAogIEhvdGVsOiAoKSA9PiBIb3RlbCwKICBIb3VyZ2xhc3M6ICgpID0+IEhvdXJnbGFzcywKICBIb3VzZTogKCkgPT4gSG91c2UsCiAgSG91c2VIZWFydDogKCkgPT4gSG91c2VIZWFydCwKICBIb3VzZVBsdWc6ICgpID0+IEhvdXNlUGx1ZywKICBIb3VzZVBsdXM6ICgpID0+IEhvdXNlUGx1cywKICBIb3VzZVdpZmk6ICgpID0+IEhvdXNlV2lmaSwKICBJY2VDcmVhbTogKCkgPT4gSWNlQ3JlYW1Db25lLAogIEljZUNyZWFtMjogKCkgPT4gSWNlQ3JlYW1Cb3dsLAogIEljZUNyZWFtQm93bDogKCkgPT4gSWNlQ3JlYW1Cb3dsLAogIEljZUNyZWFtQ29uZTogKCkgPT4gSWNlQ3JlYW1Db25lLAogIElkQ2FyZDogKCkgPT4gSWRDYXJkLAogIElkQ2FyZExhbnlhcmQ6ICgpID0+IElkQ2FyZExhbnlhcmQsCiAgSW1hZ2U6ICgpID0+IEltYWdlMiwKICBJbWFnZURvd246ICgpID0+IEltYWdlRG93biwKICBJbWFnZU1pbnVzOiAoKSA9PiBJbWFnZU1pbnVzLAogIEltYWdlT2ZmOiAoKSA9PiBJbWFnZU9mZiwKICBJbWFnZVBsYXk6ICgpID0+IEltYWdlUGxheSwKICBJbWFnZVBsdXM6ICgpID0+IEltYWdlUGx1cywKICBJbWFnZVVwOiAoKSA9PiBJbWFnZVVwLAogIEltYWdlVXBzY2FsZTogKCkgPT4gSW1hZ2VVcHNjYWxlLAogIEltYWdlczogKCkgPT4gSW1hZ2VzLAogIEltcG9ydDogKCkgPT4gSW1wb3J0LAogIEluYm94OiAoKSA9PiBJbmJveCwKICBJbmRlbnQ6ICgpID0+IExpc3RJbmRlbnRJbmNyZWFzZSwKICBJbmRlbnREZWNyZWFzZTogKCkgPT4gTGlzdEluZGVudERlY3JlYXNlLAogIEluZGVudEluY3JlYXNlOiAoKSA9PiBMaXN0SW5kZW50SW5jcmVhc2UsCiAgSW5kaWFuUnVwZWU6ICgpID0+IEluZGlhblJ1cGVlLAogIEluZmluaXR5OiAoKSA9PiBJbmZpbml0eTIsCiAgSW5mbzogKCkgPT4gSW5mbzIsCiAgSW5zcGVjdDogKCkgPT4gU3F1YXJlTW91c2VQb2ludGVyLAogIEluc3BlY3Rpb25QYW5lbDogKCkgPT4gSW5zcGVjdGlvblBhbmVsLAogIEluc3RhZ3JhbTogKCkgPT4gSW5zdGFncmFtLAogIEl0YWxpYzogKCkgPT4gSXRhbGljLAogIEl0ZXJhdGlvbkNjdzogKCkgPT4gSXRlcmF0aW9uQ2N3LAogIEl0ZXJhdGlvbkN3OiAoKSA9PiBJdGVyYXRpb25DdywKICBKYXBhbmVzZVllbjogKCkgPT4gSmFwYW5lc2VZZW4sCiAgSm95c3RpY2s6ICgpID0+IEpveXN0aWNrLAogIEthbmJhbjogKCkgPT4gS2FuYmFuLAogIEthbmJhblNxdWFyZTogKCkgPT4gU3F1YXJlS2FuYmFuLAogIEthbmJhblNxdWFyZURhc2hlZDogKCkgPT4gU3F1YXJlRGFzaGVkS2FuYmFuLAogIEtheWFrOiAoKSA9PiBLYXlhaywKICBLZXk6ICgpID0+IEtleTIsCiAgS2V5Um91bmQ6ICgpID0+IEtleVJvdW5kLAogIEtleVNxdWFyZTogKCkgPT4gS2V5U3F1YXJlLAogIEtleWJvYXJkOiAoKSA9PiBLZXlib2FyZDIsCiAgS2V5Ym9hcmRNdXNpYzogKCkgPT4gS2V5Ym9hcmRNdXNpYywKICBLZXlib2FyZE9mZjogKCkgPT4gS2V5Ym9hcmRPZmYsCiAgTGFtcDogKCkgPT4gTGFtcCwKICBMYW1wQ2VpbGluZzogKCkgPT4gTGFtcENlaWxpbmcsCiAgTGFtcERlc2s6ICgpID0+IExhbXBEZXNrLAogIExhbXBGbG9vcjogKCkgPT4gTGFtcEZsb29yLAogIExhbXBXYWxsRG93bjogKCkgPT4gTGFtcFdhbGxEb3duLAogIExhbXBXYWxsVXA6ICgpID0+IExhbXBXYWxsVXAsCiAgTGFuZFBsb3Q6ICgpID0+IExhbmRQbG90LAogIExhbmRtYXJrOiAoKSA9PiBMYW5kbWFyaywKICBMYW5ndWFnZXM6ICgpID0+IExhbmd1YWdlcywKICBMYXB0b3A6ICgpID0+IExhcHRvcCwKICBMYXB0b3AyOiAoKSA9PiBMYXB0b3BNaW5pbWFsLAogIExhcHRvcE1pbmltYWw6ICgpID0+IExhcHRvcE1pbmltYWwsCiAgTGFwdG9wTWluaW1hbENoZWNrOiAoKSA9PiBMYXB0b3BNaW5pbWFsQ2hlY2ssCiAgTGFzc286ICgpID0+IExhc3NvLAogIExhc3NvU2VsZWN0OiAoKSA9PiBMYXNzb1NlbGVjdCwKICBMYXVnaDogKCkgPT4gTGF1Z2gsCiAgTGF5ZXJzOiAoKSA9PiBMYXllcnMzLAogIExheWVyczI6ICgpID0+IExheWVyczIsCiAgTGF5ZXJzMzogKCkgPT4gTGF5ZXJzMywKICBMYXllcnNQbHVzOiAoKSA9PiBMYXllcnNQbHVzLAogIExheW91dDogKCkgPT4gUGFuZWxzVG9wTGVmdCwKICBMYXlvdXREYXNoYm9hcmQ6ICgpID0+IExheW91dERhc2hib2FyZCwKICBMYXlvdXRHcmlkOiAoKSA9PiBMYXlvdXRHcmlkLAogIExheW91dExpc3Q6ICgpID0+IExheW91dExpc3QsCiAgTGF5b3V0UGFuZWxMZWZ0OiAoKSA9PiBMYXlvdXRQYW5lbExlZnQsCiAgTGF5b3V0UGFuZWxUb3A6ICgpID0+IExheW91dFBhbmVsVG9wLAogIExheW91dFRlbXBsYXRlOiAoKSA9PiBMYXlvdXRUZW1wbGF0ZSwKICBMZWFmOiAoKSA9PiBMZWFmLAogIExlYWZ5R3JlZW46ICgpID0+IExlYWZ5R3JlZW4sCiAgTGVjdGVybjogKCkgPT4gTGVjdGVybiwKICBMZW5zQ29uY2F2ZTogKCkgPT4gTGVuc0NvbmNhdmUsCiAgTGVuc0NvbnZleDogKCkgPT4gTGVuc0NvbnZleCwKICBMZXR0ZXJUZXh0OiAoKSA9PiBUZXh0SW5pdGlhbCwKICBMaWJyYXJ5OiAoKSA9PiBMaWJyYXJ5MiwKICBMaWJyYXJ5QmlnOiAoKSA9PiBMaWJyYXJ5QmlnLAogIExpYnJhcnlTcXVhcmU6ICgpID0+IFNxdWFyZUxpYnJhcnksCiAgTGlmZUJ1b3k6ICgpID0+IExpZmVCdW95LAogIExpZ2F0dXJlOiAoKSA9PiBMaWdhdHVyZSwKICBMaWdodGJ1bGI6ICgpID0+IExpZ2h0YnVsYiwKICBMaWdodGJ1bGJPZmY6ICgpID0+IExpZ2h0YnVsYk9mZiwKICBMaW5lQ2hhcnQ6ICgpID0+IENoYXJ0TGluZSwKICBMaW5lRG90UmlnaHRIb3Jpem9udGFsOiAoKSA9PiBMaW5lRG90UmlnaHRIb3Jpem9udGFsLAogIExpbmVTcXVpZ2dsZTogKCkgPT4gTGluZVNxdWlnZ2xlLAogIExpbms6ICgpID0+IExpbmssCiAgTGluazI6ICgpID0+IExpbmsyLAogIExpbmsyT2ZmOiAoKSA9PiBMaW5rMk9mZiwKICBMaW5rZWRpbjogKCkgPT4gTGlua2VkaW4sCiAgTGlzdDogKCkgPT4gTGlzdCwKICBMaXN0Q2hlY2s6ICgpID0+IExpc3RDaGVjaywKICBMaXN0Q2hlY2tzOiAoKSA9PiBMaXN0Q2hlY2tzLAogIExpc3RDaGV2cm9uc0Rvd25VcDogKCkgPT4gTGlzdENoZXZyb25zRG93blVwLAogIExpc3RDaGV2cm9uc1VwRG93bjogKCkgPT4gTGlzdENoZXZyb25zVXBEb3duLAogIExpc3RDb2xsYXBzZTogKCkgPT4gTGlzdENvbGxhcHNlLAogIExpc3RFbmQ6ICgpID0+IExpc3RFbmQsCiAgTGlzdEZpbHRlcjogKCkgPT4gTGlzdEZpbHRlciwKICBMaXN0RmlsdGVyUGx1czogKCkgPT4gTGlzdEZpbHRlclBsdXMsCiAgTGlzdEluZGVudERlY3JlYXNlOiAoKSA9PiBMaXN0SW5kZW50RGVjcmVhc2UsCiAgTGlzdEluZGVudEluY3JlYXNlOiAoKSA9PiBMaXN0SW5kZW50SW5jcmVhc2UsCiAgTGlzdE1pbnVzOiAoKSA9PiBMaXN0TWludXMsCiAgTGlzdE11c2ljOiAoKSA9PiBMaXN0TXVzaWMsCiAgTGlzdE9yZGVyZWQ6ICgpID0+IExpc3RPcmRlcmVkLAogIExpc3RQbHVzOiAoKSA9PiBMaXN0UGx1cywKICBMaXN0UmVzdGFydDogKCkgPT4gTGlzdFJlc3RhcnQsCiAgTGlzdFN0YXJ0OiAoKSA9PiBMaXN0U3RhcnQsCiAgTGlzdFRvZG86ICgpID0+IExpc3RUb2RvLAogIExpc3RUcmVlOiAoKSA9PiBMaXN0VHJlZSwKICBMaXN0VmlkZW86ICgpID0+IExpc3RWaWRlbywKICBMaXN0WDogKCkgPT4gTGlzdFgsCiAgTG9hZGVyOiAoKSA9PiBMb2FkZXIsCiAgTG9hZGVyMjogKCkgPT4gTG9hZGVyQ2lyY2xlLAogIExvYWRlckNpcmNsZTogKCkgPT4gTG9hZGVyQ2lyY2xlLAogIExvYWRlclBpbndoZWVsOiAoKSA9PiBMb2FkZXJQaW53aGVlbCwKICBMb2NhdGU6ICgpID0+IExvY2F0ZSwKICBMb2NhdGVGaXhlZDogKCkgPT4gTG9jYXRlRml4ZWQsCiAgTG9jYXRlT2ZmOiAoKSA9PiBMb2NhdGVPZmYsCiAgTG9jYXRpb25FZGl0OiAoKSA9PiBNYXBQaW5QZW4sCiAgTG9jazogKCkgPT4gTG9jaywKICBMb2NrS2V5aG9sZTogKCkgPT4gTG9ja0tleWhvbGUsCiAgTG9ja0tleWhvbGVPcGVuOiAoKSA9PiBMb2NrS2V5aG9sZU9wZW4sCiAgTG9ja09wZW46ICgpID0+IExvY2tPcGVuLAogIExvZ0luOiAoKSA9PiBMb2dJbiwKICBMb2dPdXQ6ICgpID0+IExvZ091dCwKICBMb2dzOiAoKSA9PiBMb2dzLAogIExvbGxpcG9wOiAoKSA9PiBMb2xsaXBvcCwKICBMdWdnYWdlOiAoKSA9PiBMdWdnYWdlLAogIE1TcXVhcmU6ICgpID0+IFNxdWFyZU0sCiAgTWFnbmV0OiAoKSA9PiBNYWduZXQsCiAgTWFpbDogKCkgPT4gTWFpbCwKICBNYWlsQ2hlY2s6ICgpID0+IE1haWxDaGVjaywKICBNYWlsTWludXM6ICgpID0+IE1haWxNaW51cywKICBNYWlsT3BlbjogKCkgPT4gTWFpbE9wZW4sCiAgTWFpbFBsdXM6ICgpID0+IE1haWxQbHVzLAogIE1haWxRdWVzdGlvbjogKCkgPT4gTWFpbFF1ZXN0aW9uTWFyaywKICBNYWlsUXVlc3Rpb25NYXJrOiAoKSA9PiBNYWlsUXVlc3Rpb25NYXJrLAogIE1haWxTZWFyY2g6ICgpID0+IE1haWxTZWFyY2gsCiAgTWFpbFdhcm5pbmc6ICgpID0+IE1haWxXYXJuaW5nLAogIE1haWxYOiAoKSA9PiBNYWlsWCwKICBNYWlsYm94OiAoKSA9PiBNYWlsYm94LAogIE1haWxzOiAoKSA9PiBNYWlscywKICBNYXA6ICgpID0+IE1hcDIsCiAgTWFwTWludXM6ICgpID0+IE1hcE1pbnVzLAogIE1hcFBpbjogKCkgPT4gTWFwUGluLAogIE1hcFBpbkNoZWNrOiAoKSA9PiBNYXBQaW5DaGVjaywKICBNYXBQaW5DaGVja0luc2lkZTogKCkgPT4gTWFwUGluQ2hlY2tJbnNpZGUsCiAgTWFwUGluSG91c2U6ICgpID0+IE1hcFBpbkhvdXNlLAogIE1hcFBpbk1pbnVzOiAoKSA9PiBNYXBQaW5NaW51cywKICBNYXBQaW5NaW51c0luc2lkZTogKCkgPT4gTWFwUGluTWludXNJbnNpZGUsCiAgTWFwUGluT2ZmOiAoKSA9PiBNYXBQaW5PZmYsCiAgTWFwUGluUGVuOiAoKSA9PiBNYXBQaW5QZW4sCiAgTWFwUGluUGx1czogKCkgPT4gTWFwUGluUGx1cywKICBNYXBQaW5QbHVzSW5zaWRlOiAoKSA9PiBNYXBQaW5QbHVzSW5zaWRlLAogIE1hcFBpblg6ICgpID0+IE1hcFBpblgsCiAgTWFwUGluWEluc2lkZTogKCkgPT4gTWFwUGluWEluc2lkZSwKICBNYXBQaW5uZWQ6ICgpID0+IE1hcFBpbm5lZCwKICBNYXBQbHVzOiAoKSA9PiBNYXBQbHVzLAogIE1hcnM6ICgpID0+IE1hcnMsCiAgTWFyc1N0cm9rZTogKCkgPT4gTWFyc1N0cm9rZSwKICBNYXJ0aW5pOiAoKSA9PiBNYXJ0aW5pLAogIE1heGltaXplOiAoKSA9PiBNYXhpbWl6ZSwKICBNYXhpbWl6ZTI6ICgpID0+IE1heGltaXplMiwKICBNZWRhbDogKCkgPT4gTWVkYWwsCiAgTWVnYXBob25lOiAoKSA9PiBNZWdhcGhvbmUsCiAgTWVnYXBob25lT2ZmOiAoKSA9PiBNZWdhcGhvbmVPZmYsCiAgTWVoOiAoKSA9PiBNZWgsCiAgTWVtb3J5U3RpY2s6ICgpID0+IE1lbW9yeVN0aWNrLAogIE1lbnU6ICgpID0+IE1lbnUsCiAgTWVudVNxdWFyZTogKCkgPT4gU3F1YXJlTWVudSwKICBNZXJnZTogKCkgPT4gTWVyZ2UsCiAgTWVzc2FnZUNpcmNsZTogKCkgPT4gTWVzc2FnZUNpcmNsZSwKICBNZXNzYWdlQ2lyY2xlQ2hlY2s6ICgpID0+IE1lc3NhZ2VDaXJjbGVDaGVjaywKICBNZXNzYWdlQ2lyY2xlQ29kZTogKCkgPT4gTWVzc2FnZUNpcmNsZUNvZGUsCiAgTWVzc2FnZUNpcmNsZURhc2hlZDogKCkgPT4gTWVzc2FnZUNpcmNsZURhc2hlZCwKICBNZXNzYWdlQ2lyY2xlSGVhcnQ6ICgpID0+IE1lc3NhZ2VDaXJjbGVIZWFydCwKICBNZXNzYWdlQ2lyY2xlTW9yZTogKCkgPT4gTWVzc2FnZUNpcmNsZU1vcmUsCiAgTWVzc2FnZUNpcmNsZU9mZjogKCkgPT4gTWVzc2FnZUNpcmNsZU9mZiwKICBNZXNzYWdlQ2lyY2xlUGx1czogKCkgPT4gTWVzc2FnZUNpcmNsZVBsdXMsCiAgTWVzc2FnZUNpcmNsZVF1ZXN0aW9uOiAoKSA9PiBNZXNzYWdlQ2lyY2xlUXVlc3Rpb25NYXJrLAogIE1lc3NhZ2VDaXJjbGVRdWVzdGlvbk1hcms6ICgpID0+IE1lc3NhZ2VDaXJjbGVRdWVzdGlvbk1hcmssCiAgTWVzc2FnZUNpcmNsZVJlcGx5OiAoKSA9PiBNZXNzYWdlQ2lyY2xlUmVwbHksCiAgTWVzc2FnZUNpcmNsZVdhcm5pbmc6ICgpID0+IE1lc3NhZ2VDaXJjbGVXYXJuaW5nLAogIE1lc3NhZ2VDaXJjbGVYOiAoKSA9PiBNZXNzYWdlQ2lyY2xlWCwKICBNZXNzYWdlU3F1YXJlOiAoKSA9PiBNZXNzYWdlU3F1YXJlLAogIE1lc3NhZ2VTcXVhcmVDaGVjazogKCkgPT4gTWVzc2FnZVNxdWFyZUNoZWNrLAogIE1lc3NhZ2VTcXVhcmVDb2RlOiAoKSA9PiBNZXNzYWdlU3F1YXJlQ29kZSwKICBNZXNzYWdlU3F1YXJlRGFzaGVkOiAoKSA9PiBNZXNzYWdlU3F1YXJlRGFzaGVkLAogIE1lc3NhZ2VTcXVhcmVEaWZmOiAoKSA9PiBNZXNzYWdlU3F1YXJlRGlmZiwKICBNZXNzYWdlU3F1YXJlRG90OiAoKSA9PiBNZXNzYWdlU3F1YXJlRG90LAogIE1lc3NhZ2VTcXVhcmVIZWFydDogKCkgPT4gTWVzc2FnZVNxdWFyZUhlYXJ0LAogIE1lc3NhZ2VTcXVhcmVMb2NrOiAoKSA9PiBNZXNzYWdlU3F1YXJlTG9jaywKICBNZXNzYWdlU3F1YXJlTW9yZTogKCkgPT4gTWVzc2FnZVNxdWFyZU1vcmUsCiAgTWVzc2FnZVNxdWFyZU9mZjogKCkgPT4gTWVzc2FnZVNxdWFyZU9mZiwKICBNZXNzYWdlU3F1YXJlUGx1czogKCkgPT4gTWVzc2FnZVNxdWFyZVBsdXMsCiAgTWVzc2FnZVNxdWFyZVF1b3RlOiAoKSA9PiBNZXNzYWdlU3F1YXJlUXVvdGUsCiAgTWVzc2FnZVNxdWFyZVJlcGx5OiAoKSA9PiBNZXNzYWdlU3F1YXJlUmVwbHksCiAgTWVzc2FnZVNxdWFyZVNoYXJlOiAoKSA9PiBNZXNzYWdlU3F1YXJlU2hhcmUsCiAgTWVzc2FnZVNxdWFyZVRleHQ6ICgpID0+IE1lc3NhZ2VTcXVhcmVUZXh0LAogIE1lc3NhZ2VTcXVhcmVXYXJuaW5nOiAoKSA9PiBNZXNzYWdlU3F1YXJlV2FybmluZywKICBNZXNzYWdlU3F1YXJlWDogKCkgPT4gTWVzc2FnZVNxdWFyZVgsCiAgTWVzc2FnZXNTcXVhcmU6ICgpID0+IE1lc3NhZ2VzU3F1YXJlLAogIE1ldHJvbm9tZTogKCkgPT4gTWV0cm9ub21lLAogIE1pYzogKCkgPT4gTWljLAogIE1pYzI6ICgpID0+IE1pY1ZvY2FsLAogIE1pY09mZjogKCkgPT4gTWljT2ZmLAogIE1pY1ZvY2FsOiAoKSA9PiBNaWNWb2NhbCwKICBNaWNyb2NoaXA6ICgpID0+IE1pY3JvY2hpcCwKICBNaWNyb3Njb3BlOiAoKSA9PiBNaWNyb3Njb3BlLAogIE1pY3Jvd2F2ZTogKCkgPT4gTWljcm93YXZlLAogIE1pbGVzdG9uZTogKCkgPT4gTWlsZXN0b25lLAogIE1pbGs6ICgpID0+IE1pbGssCiAgTWlsa09mZjogKCkgPT4gTWlsa09mZiwKICBNaW5pbWl6ZTogKCkgPT4gTWluaW1pemUsCiAgTWluaW1pemUyOiAoKSA9PiBNaW5pbWl6ZTIsCiAgTWludXM6ICgpID0+IE1pbnVzLAogIE1pbnVzQ2lyY2xlOiAoKSA9PiBDaXJjbGVNaW51cywKICBNaW51c1NxdWFyZTogKCkgPT4gU3F1YXJlTWludXMsCiAgTWlycm9yUmVjdGFuZ3VsYXI6ICgpID0+IE1pcnJvclJlY3Rhbmd1bGFyLAogIE1pcnJvclJvdW5kOiAoKSA9PiBNaXJyb3JSb3VuZCwKICBNb25pdG9yOiAoKSA9PiBNb25pdG9yLAogIE1vbml0b3JDaGVjazogKCkgPT4gTW9uaXRvckNoZWNrLAogIE1vbml0b3JDbG91ZDogKCkgPT4gTW9uaXRvckNsb3VkLAogIE1vbml0b3JDb2c6ICgpID0+IE1vbml0b3JDb2csCiAgTW9uaXRvckRvdDogKCkgPT4gTW9uaXRvckRvdCwKICBNb25pdG9yRG93bjogKCkgPT4gTW9uaXRvckRvd24sCiAgTW9uaXRvck9mZjogKCkgPT4gTW9uaXRvck9mZiwKICBNb25pdG9yUGF1c2U6ICgpID0+IE1vbml0b3JQYXVzZSwKICBNb25pdG9yUGxheTogKCkgPT4gTW9uaXRvclBsYXksCiAgTW9uaXRvclNtYXJ0cGhvbmU6ICgpID0+IE1vbml0b3JTbWFydHBob25lLAogIE1vbml0b3JTcGVha2VyOiAoKSA9PiBNb25pdG9yU3BlYWtlciwKICBNb25pdG9yU3RvcDogKCkgPT4gTW9uaXRvclN0b3AsCiAgTW9uaXRvclVwOiAoKSA9PiBNb25pdG9yVXAsCiAgTW9uaXRvclg6ICgpID0+IE1vbml0b3JYLAogIE1vb246ICgpID0+IE1vb24sCiAgTW9vblN0YXI6ICgpID0+IE1vb25TdGFyLAogIE1vcmVIb3Jpem9udGFsOiAoKSA9PiBFbGxpcHNpcywKICBNb3JlVmVydGljYWw6ICgpID0+IEVsbGlwc2lzVmVydGljYWwsCiAgTW90b3JiaWtlOiAoKSA9PiBNb3RvcmJpa2UsCiAgTW91bnRhaW46ICgpID0+IE1vdW50YWluLAogIE1vdW50YWluU25vdzogKCkgPT4gTW91bnRhaW5Tbm93LAogIE1vdXNlOiAoKSA9PiBNb3VzZSwKICBNb3VzZUxlZnQ6ICgpID0+IE1vdXNlTGVmdCwKICBNb3VzZU9mZjogKCkgPT4gTW91c2VPZmYsCiAgTW91c2VQb2ludGVyOiAoKSA9PiBNb3VzZVBvaW50ZXIsCiAgTW91c2VQb2ludGVyMjogKCkgPT4gTW91c2VQb2ludGVyMiwKICBNb3VzZVBvaW50ZXIyT2ZmOiAoKSA9PiBNb3VzZVBvaW50ZXIyT2ZmLAogIE1vdXNlUG9pbnRlckJhbjogKCkgPT4gTW91c2VQb2ludGVyQmFuLAogIE1vdXNlUG9pbnRlckNsaWNrOiAoKSA9PiBNb3VzZVBvaW50ZXJDbGljaywKICBNb3VzZVBvaW50ZXJTcXVhcmVEYXNoZWQ6ICgpID0+IFNxdWFyZURhc2hlZE1vdXNlUG9pbnRlciwKICBNb3VzZVJpZ2h0OiAoKSA9PiBNb3VzZVJpZ2h0LAogIE1vdmU6ICgpID0+IE1vdmUsCiAgTW92ZTNEOiAoKSA9PiBNb3ZlM2QsCiAgTW92ZTNkOiAoKSA9PiBNb3ZlM2QsCiAgTW92ZURpYWdvbmFsOiAoKSA9PiBNb3ZlRGlhZ29uYWwsCiAgTW92ZURpYWdvbmFsMjogKCkgPT4gTW92ZURpYWdvbmFsMiwKICBNb3ZlRG93bjogKCkgPT4gTW92ZURvd24sCiAgTW92ZURvd25MZWZ0OiAoKSA9PiBNb3ZlRG93bkxlZnQsCiAgTW92ZURvd25SaWdodDogKCkgPT4gTW92ZURvd25SaWdodCwKICBNb3ZlSG9yaXpvbnRhbDogKCkgPT4gTW92ZUhvcml6b250YWwsCiAgTW92ZUxlZnQ6ICgpID0+IE1vdmVMZWZ0LAogIE1vdmVSaWdodDogKCkgPT4gTW92ZVJpZ2h0LAogIE1vdmVVcDogKCkgPT4gTW92ZVVwLAogIE1vdmVVcExlZnQ6ICgpID0+IE1vdmVVcExlZnQsCiAgTW92ZVVwUmlnaHQ6ICgpID0+IE1vdmVVcFJpZ2h0LAogIE1vdmVWZXJ0aWNhbDogKCkgPT4gTW92ZVZlcnRpY2FsLAogIE11c2ljOiAoKSA9PiBNdXNpYywKICBNdXNpYzI6ICgpID0+IE11c2ljMiwKICBNdXNpYzM6ICgpID0+IE11c2ljMywKICBNdXNpYzQ6ICgpID0+IE11c2ljNCwKICBOYXZpZ2F0aW9uOiAoKSA9PiBOYXZpZ2F0aW9uLAogIE5hdmlnYXRpb24yOiAoKSA9PiBOYXZpZ2F0aW9uMiwKICBOYXZpZ2F0aW9uMk9mZjogKCkgPT4gTmF2aWdhdGlvbjJPZmYsCiAgTmF2aWdhdGlvbk9mZjogKCkgPT4gTmF2aWdhdGlvbk9mZiwKICBOZXR3b3JrOiAoKSA9PiBOZXR3b3JrLAogIE5ld3NwYXBlcjogKCkgPT4gTmV3c3BhcGVyLAogIE5mYzogKCkgPT4gTmZjLAogIE5vbkJpbmFyeTogKCkgPT4gTm9uQmluYXJ5LAogIE5vdGVib29rOiAoKSA9PiBOb3RlYm9vaywKICBOb3RlYm9va1BlbjogKCkgPT4gTm90ZWJvb2tQZW4sCiAgTm90ZWJvb2tUYWJzOiAoKSA9PiBOb3RlYm9va1RhYnMsCiAgTm90ZWJvb2tUZXh0OiAoKSA9PiBOb3RlYm9va1RleHQsCiAgTm90ZXBhZFRleHQ6ICgpID0+IE5vdGVwYWRUZXh0LAogIE5vdGVwYWRUZXh0RGFzaGVkOiAoKSA9PiBOb3RlcGFkVGV4dERhc2hlZCwKICBOdXQ6ICgpID0+IE51dCwKICBOdXRPZmY6ICgpID0+IE51dE9mZiwKICBPY3RhZ29uOiAoKSA9PiBPY3RhZ29uLAogIE9jdGFnb25BbGVydDogKCkgPT4gT2N0YWdvbkFsZXJ0LAogIE9jdGFnb25NaW51czogKCkgPT4gT2N0YWdvbk1pbnVzLAogIE9jdGFnb25QYXVzZTogKCkgPT4gT2N0YWdvblBhdXNlLAogIE9jdGFnb25YOiAoKSA9PiBPY3RhZ29uWCwKICBPbWVnYTogKCkgPT4gT21lZ2EsCiAgT3B0aW9uOiAoKSA9PiBPcHRpb24sCiAgT3JiaXQ6ICgpID0+IE9yYml0LAogIE9yaWdhbWk6ICgpID0+IE9yaWdhbWksCiAgT3V0ZGVudDogKCkgPT4gTGlzdEluZGVudERlY3JlYXNlLAogIFBhY2thZ2U6ICgpID0+IFBhY2thZ2UsCiAgUGFja2FnZTI6ICgpID0+IFBhY2thZ2UyLAogIFBhY2thZ2VDaGVjazogKCkgPT4gUGFja2FnZUNoZWNrLAogIFBhY2thZ2VNaW51czogKCkgPT4gUGFja2FnZU1pbnVzLAogIFBhY2thZ2VPcGVuOiAoKSA9PiBQYWNrYWdlT3BlbiwKICBQYWNrYWdlUGx1czogKCkgPT4gUGFja2FnZVBsdXMsCiAgUGFja2FnZVNlYXJjaDogKCkgPT4gUGFja2FnZVNlYXJjaCwKICBQYWNrYWdlWDogKCkgPT4gUGFja2FnZVgsCiAgUGFpbnRCdWNrZXQ6ICgpID0+IFBhaW50QnVja2V0LAogIFBhaW50Um9sbGVyOiAoKSA9PiBQYWludFJvbGxlciwKICBQYWludGJydXNoOiAoKSA9PiBQYWludGJydXNoLAogIFBhaW50YnJ1c2gyOiAoKSA9PiBQYWludGJydXNoVmVydGljYWwsCiAgUGFpbnRicnVzaFZlcnRpY2FsOiAoKSA9PiBQYWludGJydXNoVmVydGljYWwsCiAgUGFsZXR0ZTogKCkgPT4gUGFsZXR0ZSwKICBQYWxtdHJlZTogKCkgPT4gVHJlZVBhbG0sCiAgUGFuZGE6ICgpID0+IFBhbmRhLAogIFBhbmVsQm90dG9tOiAoKSA9PiBQYW5lbEJvdHRvbSwKICBQYW5lbEJvdHRvbUNsb3NlOiAoKSA9PiBQYW5lbEJvdHRvbUNsb3NlLAogIFBhbmVsQm90dG9tRGFzaGVkOiAoKSA9PiBQYW5lbEJvdHRvbURhc2hlZCwKICBQYW5lbEJvdHRvbUluYWN0aXZlOiAoKSA9PiBQYW5lbEJvdHRvbURhc2hlZCwKICBQYW5lbEJvdHRvbU9wZW46ICgpID0+IFBhbmVsQm90dG9tT3BlbiwKICBQYW5lbExlZnQ6ICgpID0+IFBhbmVsTGVmdCwKICBQYW5lbExlZnRDbG9zZTogKCkgPT4gUGFuZWxMZWZ0Q2xvc2UsCiAgUGFuZWxMZWZ0RGFzaGVkOiAoKSA9PiBQYW5lbExlZnREYXNoZWQsCiAgUGFuZWxMZWZ0SW5hY3RpdmU6ICgpID0+IFBhbmVsTGVmdERhc2hlZCwKICBQYW5lbExlZnRPcGVuOiAoKSA9PiBQYW5lbExlZnRPcGVuLAogIFBhbmVsTGVmdFJpZ2h0RGFzaGVkOiAoKSA9PiBQYW5lbExlZnRSaWdodERhc2hlZCwKICBQYW5lbFJpZ2h0OiAoKSA9PiBQYW5lbFJpZ2h0LAogIFBhbmVsUmlnaHRDbG9zZTogKCkgPT4gUGFuZWxSaWdodENsb3NlLAogIFBhbmVsUmlnaHREYXNoZWQ6ICgpID0+IFBhbmVsUmlnaHREYXNoZWQsCiAgUGFuZWxSaWdodEluYWN0aXZlOiAoKSA9PiBQYW5lbFJpZ2h0RGFzaGVkLAogIFBhbmVsUmlnaHRPcGVuOiAoKSA9PiBQYW5lbFJpZ2h0T3BlbiwKICBQYW5lbFRvcDogKCkgPT4gUGFuZWxUb3AsCiAgUGFuZWxUb3BCb3R0b21EYXNoZWQ6ICgpID0+IFBhbmVsVG9wQm90dG9tRGFzaGVkLAogIFBhbmVsVG9wQ2xvc2U6ICgpID0+IFBhbmVsVG9wQ2xvc2UsCiAgUGFuZWxUb3BEYXNoZWQ6ICgpID0+IFBhbmVsVG9wRGFzaGVkLAogIFBhbmVsVG9wSW5hY3RpdmU6ICgpID0+IFBhbmVsVG9wRGFzaGVkLAogIFBhbmVsVG9wT3BlbjogKCkgPT4gUGFuZWxUb3BPcGVuLAogIFBhbmVsc0xlZnRCb3R0b206ICgpID0+IFBhbmVsc0xlZnRCb3R0b20sCiAgUGFuZWxzTGVmdFJpZ2h0OiAoKSA9PiBDb2x1bW5zMywKICBQYW5lbHNSaWdodEJvdHRvbTogKCkgPT4gUGFuZWxzUmlnaHRCb3R0b20sCiAgUGFuZWxzVG9wQm90dG9tOiAoKSA9PiBSb3dzMywKICBQYW5lbHNUb3BMZWZ0OiAoKSA9PiBQYW5lbHNUb3BMZWZ0LAogIFBhcGVyY2xpcDogKCkgPT4gUGFwZXJjbGlwLAogIFBhcmVudGhlc2VzOiAoKSA9PiBQYXJlbnRoZXNlcywKICBQYXJraW5nQ2lyY2xlOiAoKSA9PiBDaXJjbGVQYXJraW5nLAogIFBhcmtpbmdDaXJjbGVPZmY6ICgpID0+IENpcmNsZVBhcmtpbmdPZmYsCiAgUGFya2luZ01ldGVyOiAoKSA9PiBQYXJraW5nTWV0ZXIsCiAgUGFya2luZ1NxdWFyZTogKCkgPT4gU3F1YXJlUGFya2luZywKICBQYXJraW5nU3F1YXJlT2ZmOiAoKSA9PiBTcXVhcmVQYXJraW5nT2ZmLAogIFBhcnR5UG9wcGVyOiAoKSA9PiBQYXJ0eVBvcHBlciwKICBQYXVzZTogKCkgPT4gUGF1c2UsCiAgUGF1c2VDaXJjbGU6ICgpID0+IENpcmNsZVBhdXNlLAogIFBhdXNlT2N0YWdvbjogKCkgPT4gT2N0YWdvblBhdXNlLAogIFBhd1ByaW50OiAoKSA9PiBQYXdQcmludCwKICBQY0Nhc2U6ICgpID0+IFBjQ2FzZSwKICBQZW46ICgpID0+IFBlbiwKICBQZW5Cb3g6ICgpID0+IFNxdWFyZVBlbiwKICBQZW5MaW5lOiAoKSA9PiBQZW5MaW5lLAogIFBlbk9mZjogKCkgPT4gUGVuT2ZmLAogIFBlblNxdWFyZTogKCkgPT4gU3F1YXJlUGVuLAogIFBlblRvb2w6ICgpID0+IFBlblRvb2wsCiAgUGVuY2lsOiAoKSA9PiBQZW5jaWwsCiAgUGVuY2lsTGluZTogKCkgPT4gUGVuY2lsTGluZSwKICBQZW5jaWxPZmY6ICgpID0+IFBlbmNpbE9mZiwKICBQZW5jaWxSdWxlcjogKCkgPT4gUGVuY2lsUnVsZXIsCiAgUGVudGFnb246ICgpID0+IFBlbnRhZ29uLAogIFBlcmNlbnQ6ICgpID0+IFBlcmNlbnQsCiAgUGVyY2VudENpcmNsZTogKCkgPT4gQ2lyY2xlUGVyY2VudCwKICBQZXJjZW50RGlhbW9uZDogKCkgPT4gRGlhbW9uZFBlcmNlbnQsCiAgUGVyY2VudFNxdWFyZTogKCkgPT4gU3F1YXJlUGVyY2VudCwKICBQZXJzb25TdGFuZGluZzogKCkgPT4gUGVyc29uU3RhbmRpbmcsCiAgUGhpbGlwcGluZVBlc286ICgpID0+IFBoaWxpcHBpbmVQZXNvLAogIFBob25lOiAoKSA9PiBQaG9uZSwKICBQaG9uZUNhbGw6ICgpID0+IFBob25lQ2FsbCwKICBQaG9uZUZvcndhcmRlZDogKCkgPT4gUGhvbmVGb3J3YXJkZWQsCiAgUGhvbmVJbmNvbWluZzogKCkgPT4gUGhvbmVJbmNvbWluZywKICBQaG9uZU1pc3NlZDogKCkgPT4gUGhvbmVNaXNzZWQsCiAgUGhvbmVPZmY6ICgpID0+IFBob25lT2ZmLAogIFBob25lT3V0Z29pbmc6ICgpID0+IFBob25lT3V0Z29pbmcsCiAgUGk6ICgpID0+IFBpLAogIFBpU3F1YXJlOiAoKSA9PiBTcXVhcmVQaSwKICBQaWFubzogKCkgPT4gUGlhbm8sCiAgUGlja2F4ZTogKCkgPT4gUGlja2F4ZSwKICBQaWN0dXJlSW5QaWN0dXJlOiAoKSA9PiBQaWN0dXJlSW5QaWN0dXJlLAogIFBpY3R1cmVJblBpY3R1cmUyOiAoKSA9PiBQaWN0dXJlSW5QaWN0dXJlMiwKICBQaWVDaGFydDogKCkgPT4gQ2hhcnRQaWUsCiAgUGlnZ3lCYW5rOiAoKSA9PiBQaWdneUJhbmssCiAgUGlsY3JvdzogKCkgPT4gUGlsY3JvdywKICBQaWxjcm93TGVmdDogKCkgPT4gUGlsY3Jvd0xlZnQsCiAgUGlsY3Jvd1JpZ2h0OiAoKSA9PiBQaWxjcm93UmlnaHQsCiAgUGlsY3Jvd1NxdWFyZTogKCkgPT4gU3F1YXJlUGlsY3JvdywKICBQaWxsOiAoKSA9PiBQaWxsLAogIFBpbGxCb3R0bGU6ICgpID0+IFBpbGxCb3R0bGUsCiAgUGluOiAoKSA9PiBQaW4sCiAgUGluT2ZmOiAoKSA9PiBQaW5PZmYsCiAgUGlwZXR0ZTogKCkgPT4gUGlwZXR0ZSwKICBQaXp6YTogKCkgPT4gUGl6emEsCiAgUGxhbmU6ICgpID0+IFBsYW5lLAogIFBsYW5lTGFuZGluZzogKCkgPT4gUGxhbmVMYW5kaW5nLAogIFBsYW5lVGFrZW9mZjogKCkgPT4gUGxhbmVUYWtlb2ZmLAogIFBsYXk6ICgpID0+IFBsYXksCiAgUGxheUNpcmNsZTogKCkgPT4gQ2lyY2xlUGxheSwKICBQbGF5U3F1YXJlOiAoKSA9PiBTcXVhcmVQbGF5LAogIFBsdWc6ICgpID0+IFBsdWcsCiAgUGx1ZzI6ICgpID0+IFBsdWcyLAogIFBsdWdaYXA6ICgpID0+IFBsdWdaYXAsCiAgUGx1Z1phcDI6ICgpID0+IFBsdWdaYXAsCiAgUGx1czogKCkgPT4gUGx1cywKICBQbHVzQ2lyY2xlOiAoKSA9PiBDaXJjbGVQbHVzLAogIFBsdXNTcXVhcmU6ICgpID0+IFNxdWFyZVBsdXMsCiAgUG9ja2V0OiAoKSA9PiBQb2NrZXQsCiAgUG9ja2V0S25pZmU6ICgpID0+IFBvY2tldEtuaWZlLAogIFBvZGNhc3Q6ICgpID0+IFBvZGNhc3QsCiAgUG9pbnRlcjogKCkgPT4gUG9pbnRlciwKICBQb2ludGVyT2ZmOiAoKSA9PiBQb2ludGVyT2ZmLAogIFBvcGNvcm46ICgpID0+IFBvcGNvcm4sCiAgUG9wc2ljbGU6ICgpID0+IFBvcHNpY2xlLAogIFBvdW5kU3Rlcmxpbmc6ICgpID0+IFBvdW5kU3RlcmxpbmcsCiAgUG93ZXI6ICgpID0+IFBvd2VyLAogIFBvd2VyQ2lyY2xlOiAoKSA9PiBDaXJjbGVQb3dlciwKICBQb3dlck9mZjogKCkgPT4gUG93ZXJPZmYsCiAgUG93ZXJTcXVhcmU6ICgpID0+IFNxdWFyZVBvd2VyLAogIFByZXNlbnRhdGlvbjogKCkgPT4gUHJlc2VudGF0aW9uLAogIFByaW50ZXI6ICgpID0+IFByaW50ZXIsCiAgUHJpbnRlckNoZWNrOiAoKSA9PiBQcmludGVyQ2hlY2ssCiAgUHJpbnRlclg6ICgpID0+IFByaW50ZXJYLAogIFByb2plY3RvcjogKCkgPT4gUHJvamVjdG9yLAogIFByb3BvcnRpb25zOiAoKSA9PiBQcm9wb3J0aW9ucywKICBQdXp6bGU6ICgpID0+IFB1enpsZSwKICBQeXJhbWlkOiAoKSA9PiBQeXJhbWlkLAogIFFyQ29kZTogKCkgPT4gUXJDb2RlLAogIFF1b3RlOiAoKSA9PiBRdW90ZSwKICBSYWJiaXQ6ICgpID0+IFJhYmJpdCwKICBSYWRhcjogKCkgPT4gUmFkYXIsCiAgUmFkaWF0aW9uOiAoKSA9PiBSYWRpYXRpb24sCiAgUmFkaWNhbDogKCkgPT4gUmFkaWNhbCwKICBSYWRpbzogKCkgPT4gUmFkaW8sCiAgUmFkaW9SZWNlaXZlcjogKCkgPT4gUmFkaW9SZWNlaXZlciwKICBSYWRpb1Rvd2VyOiAoKSA9PiBSYWRpb1Rvd2VyLAogIFJhZGl1czogKCkgPT4gUmFkaXVzLAogIFJhaWxTeW1ib2w6ICgpID0+IFJhaWxTeW1ib2wsCiAgUmFpbmJvdzogKCkgPT4gUmFpbmJvdywKICBSYXQ6ICgpID0+IFJhdCwKICBSYXRpbzogKCkgPT4gUmF0aW8sCiAgUmVjZWlwdDogKCkgPT4gUmVjZWlwdCwKICBSZWNlaXB0Q2VudDogKCkgPT4gUmVjZWlwdENlbnQsCiAgUmVjZWlwdEV1cm86ICgpID0+IFJlY2VpcHRFdXJvLAogIFJlY2VpcHRJbmRpYW5SdXBlZTogKCkgPT4gUmVjZWlwdEluZGlhblJ1cGVlLAogIFJlY2VpcHRKYXBhbmVzZVllbjogKCkgPT4gUmVjZWlwdEphcGFuZXNlWWVuLAogIFJlY2VpcHRQb3VuZFN0ZXJsaW5nOiAoKSA9PiBSZWNlaXB0UG91bmRTdGVybGluZywKICBSZWNlaXB0UnVzc2lhblJ1YmxlOiAoKSA9PiBSZWNlaXB0UnVzc2lhblJ1YmxlLAogIFJlY2VpcHRTd2lzc0ZyYW5jOiAoKSA9PiBSZWNlaXB0U3dpc3NGcmFuYywKICBSZWNlaXB0VGV4dDogKCkgPT4gUmVjZWlwdFRleHQsCiAgUmVjZWlwdFR1cmtpc2hMaXJhOiAoKSA9PiBSZWNlaXB0VHVya2lzaExpcmEsCiAgUmVjdGFuZ2xlQ2lyY2xlOiAoKSA9PiBSZWN0YW5nbGVDaXJjbGUsCiAgUmVjdGFuZ2xlRWxsaXBzaXM6ICgpID0+IFJlY3RhbmdsZUVsbGlwc2lzLAogIFJlY3RhbmdsZUdvZ2dsZXM6ICgpID0+IFJlY3RhbmdsZUdvZ2dsZXMsCiAgUmVjdGFuZ2xlSG9yaXpvbnRhbDogKCkgPT4gUmVjdGFuZ2xlSG9yaXpvbnRhbCwKICBSZWN0YW5nbGVWZXJ0aWNhbDogKCkgPT4gUmVjdGFuZ2xlVmVydGljYWwsCiAgUmVjeWNsZTogKCkgPT4gUmVjeWNsZSwKICBSZWRvOiAoKSA9PiBSZWRvLAogIFJlZG8yOiAoKSA9PiBSZWRvMiwKICBSZWRvRG90OiAoKSA9PiBSZWRvRG90LAogIFJlZnJlc2hDY3c6ICgpID0+IFJlZnJlc2hDY3csCiAgUmVmcmVzaENjd0RvdDogKCkgPT4gUmVmcmVzaENjd0RvdCwKICBSZWZyZXNoQ3c6ICgpID0+IFJlZnJlc2hDdywKICBSZWZyZXNoQ3dPZmY6ICgpID0+IFJlZnJlc2hDd09mZiwKICBSZWZyaWdlcmF0b3I6ICgpID0+IFJlZnJpZ2VyYXRvciwKICBSZWdleDogKCkgPT4gUmVnZXgsCiAgUmVtb3ZlRm9ybWF0dGluZzogKCkgPT4gUmVtb3ZlRm9ybWF0dGluZywKICBSZXBlYXQ6ICgpID0+IFJlcGVhdCwKICBSZXBlYXQxOiAoKSA9PiBSZXBlYXQxLAogIFJlcGVhdDI6ICgpID0+IFJlcGVhdDIsCiAgUmVwbGFjZTogKCkgPT4gUmVwbGFjZSwKICBSZXBsYWNlQWxsOiAoKSA9PiBSZXBsYWNlQWxsLAogIFJlcGx5OiAoKSA9PiBSZXBseSwKICBSZXBseUFsbDogKCkgPT4gUmVwbHlBbGwsCiAgUmV3aW5kOiAoKSA9PiBSZXdpbmQsCiAgUmliYm9uOiAoKSA9PiBSaWJib24sCiAgUm9ja2V0OiAoKSA9PiBSb2NrZXQsCiAgUm9ja2luZ0NoYWlyOiAoKSA9PiBSb2NraW5nQ2hhaXIsCiAgUm9sbGVyQ29hc3RlcjogKCkgPT4gUm9sbGVyQ29hc3RlciwKICBSb3NlOiAoKSA9PiBSb3NlLAogIFJvdGF0ZTNEOiAoKSA9PiBSb3RhdGUzZCwKICBSb3RhdGUzZDogKCkgPT4gUm90YXRlM2QsCiAgUm90YXRlQ2N3OiAoKSA9PiBSb3RhdGVDY3csCiAgUm90YXRlQ2N3S2V5OiAoKSA9PiBSb3RhdGVDY3dLZXksCiAgUm90YXRlQ2N3U3F1YXJlOiAoKSA9PiBSb3RhdGVDY3dTcXVhcmUsCiAgUm90YXRlQ3c6ICgpID0+IFJvdGF0ZUN3LAogIFJvdGF0ZUN3U3F1YXJlOiAoKSA9PiBSb3RhdGVDd1NxdWFyZSwKICBSb3V0ZTogKCkgPT4gUm91dGUsCiAgUm91dGVPZmY6ICgpID0+IFJvdXRlT2ZmLAogIFJvdXRlcjogKCkgPT4gUm91dGVyLAogIFJvd3M6ICgpID0+IFJvd3MyLAogIFJvd3MyOiAoKSA9PiBSb3dzMiwKICBSb3dzMzogKCkgPT4gUm93czMsCiAgUm93czQ6ICgpID0+IFJvd3M0LAogIFJzczogKCkgPT4gUnNzLAogIFJ1bGVyOiAoKSA9PiBSdWxlciwKICBSdWxlckRpbWVuc2lvbkxpbmU6ICgpID0+IFJ1bGVyRGltZW5zaW9uTGluZSwKICBSdXNzaWFuUnVibGU6ICgpID0+IFJ1c3NpYW5SdWJsZSwKICBTYWlsYm9hdDogKCkgPT4gU2FpbGJvYXQsCiAgU2FsYWQ6ICgpID0+IFNhbGFkLAogIFNhbmR3aWNoOiAoKSA9PiBTYW5kd2ljaCwKICBTYXRlbGxpdGU6ICgpID0+IFNhdGVsbGl0ZSwKICBTYXRlbGxpdGVEaXNoOiAoKSA9PiBTYXRlbGxpdGVEaXNoLAogIFNhdWRpUml5YWw6ICgpID0+IFNhdWRpUml5YWwsCiAgU2F2ZTogKCkgPT4gU2F2ZSwKICBTYXZlQWxsOiAoKSA9PiBTYXZlQWxsLAogIFNhdmVPZmY6ICgpID0+IFNhdmVPZmYsCiAgU2NhbGU6ICgpID0+IFNjYWxlLAogIFNjYWxlM0Q6ICgpID0+IFNjYWxlM2QsCiAgU2NhbGUzZDogKCkgPT4gU2NhbGUzZCwKICBTY2FsaW5nOiAoKSA9PiBTY2FsaW5nLAogIFNjYW46ICgpID0+IFNjYW4sCiAgU2NhbkJhcmNvZGU6ICgpID0+IFNjYW5CYXJjb2RlLAogIFNjYW5FeWU6ICgpID0+IFNjYW5FeWUsCiAgU2NhbkZhY2U6ICgpID0+IFNjYW5GYWNlLAogIFNjYW5IZWFydDogKCkgPT4gU2NhbkhlYXJ0LAogIFNjYW5MaW5lOiAoKSA9PiBTY2FuTGluZSwKICBTY2FuUXJDb2RlOiAoKSA9PiBTY2FuUXJDb2RlLAogIFNjYW5TZWFyY2g6ICgpID0+IFNjYW5TZWFyY2gsCiAgU2NhblRleHQ6ICgpID0+IFNjYW5UZXh0LAogIFNjYXR0ZXJDaGFydDogKCkgPT4gQ2hhcnRTY2F0dGVyLAogIFNjaG9vbDogKCkgPT4gU2Nob29sLAogIFNjaG9vbDI6ICgpID0+IFVuaXZlcnNpdHksCiAgU2Npc3NvcnM6ICgpID0+IFNjaXNzb3JzLAogIFNjaXNzb3JzTGluZURhc2hlZDogKCkgPT4gU2Npc3NvcnNMaW5lRGFzaGVkLAogIFNjaXNzb3JzU3F1YXJlOiAoKSA9PiBTcXVhcmVTY2lzc29ycywKICBTY2lzc29yc1NxdWFyZURhc2hlZEJvdHRvbTogKCkgPT4gU3F1YXJlQm90dG9tRGFzaGVkU2Npc3NvcnMsCiAgU2Nvb3RlcjogKCkgPT4gU2Nvb3RlciwKICBTY3JlZW5TaGFyZTogKCkgPT4gU2NyZWVuU2hhcmUsCiAgU2NyZWVuU2hhcmVPZmY6ICgpID0+IFNjcmVlblNoYXJlT2ZmLAogIFNjcm9sbDogKCkgPT4gU2Nyb2xsLAogIFNjcm9sbFRleHQ6ICgpID0+IFNjcm9sbFRleHQsCiAgU2VhcmNoOiAoKSA9PiBTZWFyY2gsCiAgU2VhcmNoQWxlcnQ6ICgpID0+IFNlYXJjaEFsZXJ0LAogIFNlYXJjaENoZWNrOiAoKSA9PiBTZWFyY2hDaGVjaywKICBTZWFyY2hDb2RlOiAoKSA9PiBTZWFyY2hDb2RlLAogIFNlYXJjaFNsYXNoOiAoKSA9PiBTZWFyY2hTbGFzaCwKICBTZWFyY2hYOiAoKSA9PiBTZWFyY2hYLAogIFNlY3Rpb246ICgpID0+IFNlY3Rpb24sCiAgU2VuZDogKCkgPT4gU2VuZCwKICBTZW5kSG9yaXpvbmFsOiAoKSA9PiBTZW5kSG9yaXpvbnRhbCwKICBTZW5kSG9yaXpvbnRhbDogKCkgPT4gU2VuZEhvcml6b250YWwsCiAgU2VuZFRvQmFjazogKCkgPT4gU2VuZFRvQmFjaywKICBTZXBhcmF0b3JIb3Jpem9udGFsOiAoKSA9PiBTZXBhcmF0b3JIb3Jpem9udGFsLAogIFNlcGFyYXRvclZlcnRpY2FsOiAoKSA9PiBTZXBhcmF0b3JWZXJ0aWNhbCwKICBTZXJ2ZXI6ICgpID0+IFNlcnZlciwKICBTZXJ2ZXJDb2c6ICgpID0+IFNlcnZlckNvZywKICBTZXJ2ZXJDcmFzaDogKCkgPT4gU2VydmVyQ3Jhc2gsCiAgU2VydmVyT2ZmOiAoKSA9PiBTZXJ2ZXJPZmYsCiAgU2V0dGluZ3M6ICgpID0+IFNldHRpbmdzLAogIFNldHRpbmdzMjogKCkgPT4gU2V0dGluZ3MyLAogIFNoYXBlczogKCkgPT4gU2hhcGVzLAogIFNoYXJlOiAoKSA9PiBTaGFyZSwKICBTaGFyZTI6ICgpID0+IFNoYXJlMiwKICBTaGVldDogKCkgPT4gU2hlZXQsCiAgU2hlbGw6ICgpID0+IFNoZWxsLAogIFNoZWx2aW5nVW5pdDogKCkgPT4gU2hlbHZpbmdVbml0LAogIFNoaWVsZDogKCkgPT4gU2hpZWxkLAogIFNoaWVsZEFsZXJ0OiAoKSA9PiBTaGllbGRBbGVydCwKICBTaGllbGRCYW46ICgpID0+IFNoaWVsZEJhbiwKICBTaGllbGRDaGVjazogKCkgPT4gU2hpZWxkQ2hlY2ssCiAgU2hpZWxkQ2xvc2U6ICgpID0+IFNoaWVsZFgsCiAgU2hpZWxkRWxsaXBzaXM6ICgpID0+IFNoaWVsZEVsbGlwc2lzLAogIFNoaWVsZEhhbGY6ICgpID0+IFNoaWVsZEhhbGYsCiAgU2hpZWxkTWludXM6ICgpID0+IFNoaWVsZE1pbnVzLAogIFNoaWVsZE9mZjogKCkgPT4gU2hpZWxkT2ZmLAogIFNoaWVsZFBsdXM6ICgpID0+IFNoaWVsZFBsdXMsCiAgU2hpZWxkUXVlc3Rpb246ICgpID0+IFNoaWVsZFF1ZXN0aW9uTWFyaywKICBTaGllbGRRdWVzdGlvbk1hcms6ICgpID0+IFNoaWVsZFF1ZXN0aW9uTWFyaywKICBTaGllbGRVc2VyOiAoKSA9PiBTaGllbGRVc2VyLAogIFNoaWVsZFg6ICgpID0+IFNoaWVsZFgsCiAgU2hpcDogKCkgPT4gU2hpcCwKICBTaGlwV2hlZWw6ICgpID0+IFNoaXBXaGVlbCwKICBTaGlydDogKCkgPT4gU2hpcnQsCiAgU2hvcHBpbmdCYWc6ICgpID0+IFNob3BwaW5nQmFnLAogIFNob3BwaW5nQmFza2V0OiAoKSA9PiBTaG9wcGluZ0Jhc2tldCwKICBTaG9wcGluZ0NhcnQ6ICgpID0+IFNob3BwaW5nQ2FydCwKICBTaG92ZWw6ICgpID0+IFNob3ZlbCwKICBTaG93ZXJIZWFkOiAoKSA9PiBTaG93ZXJIZWFkLAogIFNocmVkZGVyOiAoKSA9PiBTaHJlZGRlciwKICBTaHJpbXA6ICgpID0+IFNocmltcCwKICBTaHJpbms6ICgpID0+IFNocmluaywKICBTaHJ1YjogKCkgPT4gU2hydWIsCiAgU2h1ZmZsZTogKCkgPT4gU2h1ZmZsZSwKICBTaWRlYmFyOiAoKSA9PiBQYW5lbExlZnQsCiAgU2lkZWJhckNsb3NlOiAoKSA9PiBQYW5lbExlZnRDbG9zZSwKICBTaWRlYmFyT3BlbjogKCkgPT4gUGFuZWxMZWZ0T3BlbiwKICBTaWdtYTogKCkgPT4gU2lnbWEsCiAgU2lnbWFTcXVhcmU6ICgpID0+IFNxdWFyZVNpZ21hLAogIFNpZ25hbDogKCkgPT4gU2lnbmFsLAogIFNpZ25hbEhpZ2g6ICgpID0+IFNpZ25hbEhpZ2gsCiAgU2lnbmFsTG93OiAoKSA9PiBTaWduYWxMb3csCiAgU2lnbmFsTWVkaXVtOiAoKSA9PiBTaWduYWxNZWRpdW0sCiAgU2lnbmFsWmVybzogKCkgPT4gU2lnbmFsWmVybywKICBTaWduYXR1cmU6ICgpID0+IFNpZ25hdHVyZSwKICBTaWducG9zdDogKCkgPT4gU2lnbnBvc3QsCiAgU2lnbnBvc3RCaWc6ICgpID0+IFNpZ25wb3N0QmlnLAogIFNpcmVuOiAoKSA9PiBTaXJlbiwKICBTa2lwQmFjazogKCkgPT4gU2tpcEJhY2ssCiAgU2tpcEZvcndhcmQ6ICgpID0+IFNraXBGb3J3YXJkLAogIFNrdWxsOiAoKSA9PiBTa3VsbCwKICBTbGFjazogKCkgPT4gU2xhY2ssCiAgU2xhc2g6ICgpID0+IFNsYXNoLAogIFNsYXNoU3F1YXJlOiAoKSA9PiBTcXVhcmVTbGFzaCwKICBTbGljZTogKCkgPT4gU2xpY2UsCiAgU2xpZGVyczogKCkgPT4gU2xpZGVyc1ZlcnRpY2FsLAogIFNsaWRlcnNIb3Jpem9udGFsOiAoKSA9PiBTbGlkZXJzSG9yaXpvbnRhbCwKICBTbGlkZXJzVmVydGljYWw6ICgpID0+IFNsaWRlcnNWZXJ0aWNhbCwKICBTbWFydHBob25lOiAoKSA9PiBTbWFydHBob25lLAogIFNtYXJ0cGhvbmVDaGFyZ2luZzogKCkgPT4gU21hcnRwaG9uZUNoYXJnaW5nLAogIFNtYXJ0cGhvbmVOZmM6ICgpID0+IFNtYXJ0cGhvbmVOZmMsCiAgU21pbGU6ICgpID0+IFNtaWxlLAogIFNtaWxlUGx1czogKCkgPT4gU21pbGVQbHVzLAogIFNuYWlsOiAoKSA9PiBTbmFpbCwKICBTbm93Zmxha2U6ICgpID0+IFNub3dmbGFrZSwKICBTb2FwRGlzcGVuc2VyRHJvcGxldDogKCkgPT4gU29hcERpc3BlbnNlckRyb3BsZXQsCiAgU29mYTogKCkgPT4gU29mYSwKICBTb2xhclBhbmVsOiAoKSA9PiBTb2xhclBhbmVsLAogIFNvcnRBc2M6ICgpID0+IEFycm93VXBOYXJyb3dXaWRlLAogIFNvcnREZXNjOiAoKSA9PiBBcnJvd0Rvd25XaWRlTmFycm93LAogIFNvdXA6ICgpID0+IFNvdXAsCiAgU3BhY2U6ICgpID0+IFNwYWNlLAogIFNwYWRlOiAoKSA9PiBTcGFkZSwKICBTcGFya2xlOiAoKSA9PiBTcGFya2xlLAogIFNwYXJrbGVzOiAoKSA9PiBTcGFya2xlcywKICBTcGVha2VyOiAoKSA9PiBTcGVha2VyLAogIFNwZWVjaDogKCkgPT4gU3BlZWNoLAogIFNwZWxsQ2hlY2s6ICgpID0+IFNwZWxsQ2hlY2ssCiAgU3BlbGxDaGVjazI6ICgpID0+IFNwZWxsQ2hlY2syLAogIFNwbGluZTogKCkgPT4gU3BsaW5lLAogIFNwbGluZVBvaW50ZXI6ICgpID0+IFNwbGluZVBvaW50ZXIsCiAgU3BsaXQ6ICgpID0+IFNwbGl0LAogIFNwbGl0U3F1YXJlSG9yaXpvbnRhbDogKCkgPT4gU3F1YXJlU3BsaXRIb3Jpem9udGFsLAogIFNwbGl0U3F1YXJlVmVydGljYWw6ICgpID0+IFNxdWFyZVNwbGl0VmVydGljYWwsCiAgU3Bvb2w6ICgpID0+IFNwb29sLAogIFNwb3RsaWdodDogKCkgPT4gU3BvdGxpZ2h0LAogIFNwcmF5Q2FuOiAoKSA9PiBTcHJheUNhbiwKICBTcHJvdXQ6ICgpID0+IFNwcm91dCwKICBTcXVhcmU6ICgpID0+IFNxdWFyZSwKICBTcXVhcmVBY3Rpdml0eTogKCkgPT4gU3F1YXJlQWN0aXZpdHksCiAgU3F1YXJlQXJyb3dEb3duOiAoKSA9PiBTcXVhcmVBcnJvd0Rvd24sCiAgU3F1YXJlQXJyb3dEb3duTGVmdDogKCkgPT4gU3F1YXJlQXJyb3dEb3duTGVmdCwKICBTcXVhcmVBcnJvd0Rvd25SaWdodDogKCkgPT4gU3F1YXJlQXJyb3dEb3duUmlnaHQsCiAgU3F1YXJlQXJyb3dMZWZ0OiAoKSA9PiBTcXVhcmVBcnJvd0xlZnQsCiAgU3F1YXJlQXJyb3dPdXREb3duTGVmdDogKCkgPT4gU3F1YXJlQXJyb3dPdXREb3duTGVmdCwKICBTcXVhcmVBcnJvd091dERvd25SaWdodDogKCkgPT4gU3F1YXJlQXJyb3dPdXREb3duUmlnaHQsCiAgU3F1YXJlQXJyb3dPdXRVcExlZnQ6ICgpID0+IFNxdWFyZUFycm93T3V0VXBMZWZ0LAogIFNxdWFyZUFycm93T3V0VXBSaWdodDogKCkgPT4gU3F1YXJlQXJyb3dPdXRVcFJpZ2h0LAogIFNxdWFyZUFycm93UmlnaHQ6ICgpID0+IFNxdWFyZUFycm93UmlnaHQsCiAgU3F1YXJlQXJyb3dSaWdodEVudGVyOiAoKSA9PiBTcXVhcmVBcnJvd1JpZ2h0RW50ZXIsCiAgU3F1YXJlQXJyb3dSaWdodEV4aXQ6ICgpID0+IFNxdWFyZUFycm93UmlnaHRFeGl0LAogIFNxdWFyZUFycm93VXA6ICgpID0+IFNxdWFyZUFycm93VXAsCiAgU3F1YXJlQXJyb3dVcExlZnQ6ICgpID0+IFNxdWFyZUFycm93VXBMZWZ0LAogIFNxdWFyZUFycm93VXBSaWdodDogKCkgPT4gU3F1YXJlQXJyb3dVcFJpZ2h0LAogIFNxdWFyZUFzdGVyaXNrOiAoKSA9PiBTcXVhcmVBc3RlcmlzaywKICBTcXVhcmVCb3R0b21EYXNoZWRTY2lzc29yczogKCkgPT4gU3F1YXJlQm90dG9tRGFzaGVkU2Npc3NvcnMsCiAgU3F1YXJlQ2VudGVybGluZURhc2hlZEhvcml6b250YWw6ICgpID0+IFNxdWFyZUNlbnRlcmxpbmVEYXNoZWRIb3Jpem9udGFsLAogIFNxdWFyZUNlbnRlcmxpbmVEYXNoZWRWZXJ0aWNhbDogKCkgPT4gU3F1YXJlQ2VudGVybGluZURhc2hlZFZlcnRpY2FsLAogIFNxdWFyZUNoYXJ0R2FudHQ6ICgpID0+IFNxdWFyZUNoYXJ0R2FudHQsCiAgU3F1YXJlQ2hlY2s6ICgpID0+IFNxdWFyZUNoZWNrLAogIFNxdWFyZUNoZWNrQmlnOiAoKSA9PiBTcXVhcmVDaGVja0JpZywKICBTcXVhcmVDaGV2cm9uRG93bjogKCkgPT4gU3F1YXJlQ2hldnJvbkRvd24sCiAgU3F1YXJlQ2hldnJvbkxlZnQ6ICgpID0+IFNxdWFyZUNoZXZyb25MZWZ0LAogIFNxdWFyZUNoZXZyb25SaWdodDogKCkgPT4gU3F1YXJlQ2hldnJvblJpZ2h0LAogIFNxdWFyZUNoZXZyb25VcDogKCkgPT4gU3F1YXJlQ2hldnJvblVwLAogIFNxdWFyZUNvZGU6ICgpID0+IFNxdWFyZUNvZGUsCiAgU3F1YXJlRGFzaGVkOiAoKSA9PiBTcXVhcmVEYXNoZWQsCiAgU3F1YXJlRGFzaGVkQm90dG9tOiAoKSA9PiBTcXVhcmVEYXNoZWRCb3R0b20sCiAgU3F1YXJlRGFzaGVkQm90dG9tQ29kZTogKCkgPT4gU3F1YXJlRGFzaGVkQm90dG9tQ29kZSwKICBTcXVhcmVEYXNoZWRLYW5iYW46ICgpID0+IFNxdWFyZURhc2hlZEthbmJhbiwKICBTcXVhcmVEYXNoZWRNb3VzZVBvaW50ZXI6ICgpID0+IFNxdWFyZURhc2hlZE1vdXNlUG9pbnRlciwKICBTcXVhcmVEYXNoZWRUb3BTb2xpZDogKCkgPT4gU3F1YXJlRGFzaGVkVG9wU29saWQsCiAgU3F1YXJlRGl2aWRlOiAoKSA9PiBTcXVhcmVEaXZpZGUsCiAgU3F1YXJlRG90OiAoKSA9PiBTcXVhcmVEb3QsCiAgU3F1YXJlRXF1YWw6ICgpID0+IFNxdWFyZUVxdWFsLAogIFNxdWFyZUZ1bmN0aW9uOiAoKSA9PiBTcXVhcmVGdW5jdGlvbiwKICBTcXVhcmVHYW50dENoYXJ0OiAoKSA9PiBTcXVhcmVDaGFydEdhbnR0LAogIFNxdWFyZUthbmJhbjogKCkgPT4gU3F1YXJlS2FuYmFuLAogIFNxdWFyZUxpYnJhcnk6ICgpID0+IFNxdWFyZUxpYnJhcnksCiAgU3F1YXJlTTogKCkgPT4gU3F1YXJlTSwKICBTcXVhcmVNZW51OiAoKSA9PiBTcXVhcmVNZW51LAogIFNxdWFyZU1pbnVzOiAoKSA9PiBTcXVhcmVNaW51cywKICBTcXVhcmVNb3VzZVBvaW50ZXI6ICgpID0+IFNxdWFyZU1vdXNlUG9pbnRlciwKICBTcXVhcmVQYXJraW5nOiAoKSA9PiBTcXVhcmVQYXJraW5nLAogIFNxdWFyZVBhcmtpbmdPZmY6ICgpID0+IFNxdWFyZVBhcmtpbmdPZmYsCiAgU3F1YXJlUGF1c2U6ICgpID0+IFNxdWFyZVBhdXNlLAogIFNxdWFyZVBlbjogKCkgPT4gU3F1YXJlUGVuLAogIFNxdWFyZVBlcmNlbnQ6ICgpID0+IFNxdWFyZVBlcmNlbnQsCiAgU3F1YXJlUGk6ICgpID0+IFNxdWFyZVBpLAogIFNxdWFyZVBpbGNyb3c6ICgpID0+IFNxdWFyZVBpbGNyb3csCiAgU3F1YXJlUGxheTogKCkgPT4gU3F1YXJlUGxheSwKICBTcXVhcmVQbHVzOiAoKSA9PiBTcXVhcmVQbHVzLAogIFNxdWFyZVBvd2VyOiAoKSA9PiBTcXVhcmVQb3dlciwKICBTcXVhcmVSYWRpY2FsOiAoKSA9PiBTcXVhcmVSYWRpY2FsLAogIFNxdWFyZVJvdW5kQ29ybmVyOiAoKSA9PiBTcXVhcmVSb3VuZENvcm5lciwKICBTcXVhcmVTY2lzc29yczogKCkgPT4gU3F1YXJlU2Npc3NvcnMsCiAgU3F1YXJlU2lnbWE6ICgpID0+IFNxdWFyZVNpZ21hLAogIFNxdWFyZVNsYXNoOiAoKSA9PiBTcXVhcmVTbGFzaCwKICBTcXVhcmVTcGxpdEhvcml6b250YWw6ICgpID0+IFNxdWFyZVNwbGl0SG9yaXpvbnRhbCwKICBTcXVhcmVTcGxpdFZlcnRpY2FsOiAoKSA9PiBTcXVhcmVTcGxpdFZlcnRpY2FsLAogIFNxdWFyZVNxdWFyZTogKCkgPT4gU3F1YXJlU3F1YXJlLAogIFNxdWFyZVN0YWNrOiAoKSA9PiBTcXVhcmVTdGFjaywKICBTcXVhcmVTdGFyOiAoKSA9PiBTcXVhcmVTdGFyLAogIFNxdWFyZVN0b3A6ICgpID0+IFNxdWFyZVN0b3AsCiAgU3F1YXJlVGVybWluYWw6ICgpID0+IFNxdWFyZVRlcm1pbmFsLAogIFNxdWFyZVVzZXI6ICgpID0+IFNxdWFyZVVzZXIsCiAgU3F1YXJlVXNlclJvdW5kOiAoKSA9PiBTcXVhcmVVc2VyUm91bmQsCiAgU3F1YXJlWDogKCkgPT4gU3F1YXJlWCwKICBTcXVhcmVzRXhjbHVkZTogKCkgPT4gU3F1YXJlc0V4Y2x1ZGUsCiAgU3F1YXJlc0ludGVyc2VjdDogKCkgPT4gU3F1YXJlc0ludGVyc2VjdCwKICBTcXVhcmVzU3VidHJhY3Q6ICgpID0+IFNxdWFyZXNTdWJ0cmFjdCwKICBTcXVhcmVzVW5pdGU6ICgpID0+IFNxdWFyZXNVbml0ZSwKICBTcXVpcmNsZTogKCkgPT4gU3F1aXJjbGUsCiAgU3F1aXJjbGVEYXNoZWQ6ICgpID0+IFNxdWlyY2xlRGFzaGVkLAogIFNxdWlycmVsOiAoKSA9PiBTcXVpcnJlbCwKICBTdGFtcDogKCkgPT4gU3RhbXAsCiAgU3RhcjogKCkgPT4gU3RhciwKICBTdGFySGFsZjogKCkgPT4gU3RhckhhbGYsCiAgU3Rhck9mZjogKCkgPT4gU3Rhck9mZiwKICBTdGFyczogKCkgPT4gU3BhcmtsZXMsCiAgU3RlcEJhY2s6ICgpID0+IFN0ZXBCYWNrLAogIFN0ZXBGb3J3YXJkOiAoKSA9PiBTdGVwRm9yd2FyZCwKICBTdGV0aG9zY29wZTogKCkgPT4gU3RldGhvc2NvcGUsCiAgU3RpY2tlcjogKCkgPT4gU3RpY2tlciwKICBTdGlja3lOb3RlOiAoKSA9PiBTdGlja3lOb3RlLAogIFN0b25lOiAoKSA9PiBTdG9uZSwKICBTdG9wQ2lyY2xlOiAoKSA9PiBDaXJjbGVTdG9wLAogIFN0b3JlOiAoKSA9PiBTdG9yZSwKICBTdHJldGNoSG9yaXpvbnRhbDogKCkgPT4gU3RyZXRjaEhvcml6b250YWwsCiAgU3RyZXRjaFZlcnRpY2FsOiAoKSA9PiBTdHJldGNoVmVydGljYWwsCiAgU3RyaWtldGhyb3VnaDogKCkgPT4gU3RyaWtldGhyb3VnaCwKICBTdWJzY3JpcHQ6ICgpID0+IFN1YnNjcmlwdCwKICBTdWJ0aXRsZXM6ICgpID0+IENhcHRpb25zLAogIFN1bjogKCkgPT4gU3VuLAogIFN1bkRpbTogKCkgPT4gU3VuRGltLAogIFN1bk1lZGl1bTogKCkgPT4gU3VuTWVkaXVtLAogIFN1bk1vb246ICgpID0+IFN1bk1vb24sCiAgU3VuU25vdzogKCkgPT4gU3VuU25vdywKICBTdW5yaXNlOiAoKSA9PiBTdW5yaXNlLAogIFN1bnNldDogKCkgPT4gU3Vuc2V0LAogIFN1cGVyc2NyaXB0OiAoKSA9PiBTdXBlcnNjcmlwdCwKICBTd2F0Y2hCb29rOiAoKSA9PiBTd2F0Y2hCb29rLAogIFN3aXNzRnJhbmM6ICgpID0+IFN3aXNzRnJhbmMsCiAgU3dpdGNoQ2FtZXJhOiAoKSA9PiBTd2l0Y2hDYW1lcmEsCiAgU3dvcmQ6ICgpID0+IFN3b3JkLAogIFN3b3JkczogKCkgPT4gU3dvcmRzLAogIFN5cmluZ2U6ICgpID0+IFN5cmluZ2UsCiAgVGFibGU6ICgpID0+IFRhYmxlLAogIFRhYmxlMjogKCkgPT4gVGFibGUyLAogIFRhYmxlQ2VsbHNNZXJnZTogKCkgPT4gVGFibGVDZWxsc01lcmdlLAogIFRhYmxlQ2VsbHNTcGxpdDogKCkgPT4gVGFibGVDZWxsc1NwbGl0LAogIFRhYmxlQ29sdW1uc1NwbGl0OiAoKSA9PiBUYWJsZUNvbHVtbnNTcGxpdCwKICBUYWJsZUNvbmZpZzogKCkgPT4gQ29sdW1uczNDb2csCiAgVGFibGVPZkNvbnRlbnRzOiAoKSA9PiBUYWJsZU9mQ29udGVudHMsCiAgVGFibGVQcm9wZXJ0aWVzOiAoKSA9PiBUYWJsZVByb3BlcnRpZXMsCiAgVGFibGVSb3dzU3BsaXQ6ICgpID0+IFRhYmxlUm93c1NwbGl0LAogIFRhYmxldDogKCkgPT4gVGFibGV0LAogIFRhYmxldFNtYXJ0cGhvbmU6ICgpID0+IFRhYmxldFNtYXJ0cGhvbmUsCiAgVGFibGV0czogKCkgPT4gVGFibGV0cywKICBUYWc6ICgpID0+IFRhZzIsCiAgVGFnczogKCkgPT4gVGFncywKICBUYWxseTE6ICgpID0+IFRhbGx5MSwKICBUYWxseTI6ICgpID0+IFRhbGx5MiwKICBUYWxseTM6ICgpID0+IFRhbGx5MywKICBUYWxseTQ6ICgpID0+IFRhbGx5NCwKICBUYWxseTU6ICgpID0+IFRhbGx5NSwKICBUYW5nZW50OiAoKSA9PiBUYW5nZW50LAogIFRhcmdldDogKCkgPT4gVGFyZ2V0LAogIFRlbGVzY29wZTogKCkgPT4gVGVsZXNjb3BlLAogIFRlbnQ6ICgpID0+IFRlbnQsCiAgVGVudFRyZWU6ICgpID0+IFRlbnRUcmVlLAogIFRlcm1pbmFsOiAoKSA9PiBUZXJtaW5hbCwKICBUZXJtaW5hbFNxdWFyZTogKCkgPT4gU3F1YXJlVGVybWluYWwsCiAgVGVzdFR1YmU6ICgpID0+IFRlc3RUdWJlLAogIFRlc3RUdWJlMjogKCkgPT4gVGVzdFR1YmVEaWFnb25hbCwKICBUZXN0VHViZURpYWdvbmFsOiAoKSA9PiBUZXN0VHViZURpYWdvbmFsLAogIFRlc3RUdWJlczogKCkgPT4gVGVzdFR1YmVzLAogIFRleHQ6ICgpID0+IFRleHRBbGlnblN0YXJ0LAogIFRleHRBbGlnbkNlbnRlcjogKCkgPT4gVGV4dEFsaWduQ2VudGVyLAogIFRleHRBbGlnbkVuZDogKCkgPT4gVGV4dEFsaWduRW5kLAogIFRleHRBbGlnbkp1c3RpZnk6ICgpID0+IFRleHRBbGlnbkp1c3RpZnksCiAgVGV4dEFsaWduU3RhcnQ6ICgpID0+IFRleHRBbGlnblN0YXJ0LAogIFRleHRDdXJzb3I6ICgpID0+IFRleHRDdXJzb3IsCiAgVGV4dEN1cnNvcklucHV0OiAoKSA9PiBUZXh0Q3Vyc29ySW5wdXQsCiAgVGV4dEluaXRpYWw6ICgpID0+IFRleHRJbml0aWFsLAogIFRleHRRdW90ZTogKCkgPT4gVGV4dFF1b3RlLAogIFRleHRTZWFyY2g6ICgpID0+IFRleHRTZWFyY2gsCiAgVGV4dFNlbGVjdDogKCkgPT4gVGV4dFNlbGVjdCwKICBUZXh0U2VsZWN0aW9uOiAoKSA9PiBUZXh0U2VsZWN0LAogIFRleHRXcmFwOiAoKSA9PiBUZXh0V3JhcCwKICBUaGVhdGVyOiAoKSA9PiBUaGVhdGVyLAogIFRoZXJtb21ldGVyOiAoKSA9PiBUaGVybW9tZXRlciwKICBUaGVybW9tZXRlclNub3dmbGFrZTogKCkgPT4gVGhlcm1vbWV0ZXJTbm93Zmxha2UsCiAgVGhlcm1vbWV0ZXJTdW46ICgpID0+IFRoZXJtb21ldGVyU3VuLAogIFRodW1ic0Rvd246ICgpID0+IFRodW1ic0Rvd24sCiAgVGh1bWJzVXA6ICgpID0+IFRodW1ic1VwLAogIFRpY2tldDogKCkgPT4gVGlja2V0LAogIFRpY2tldENoZWNrOiAoKSA9PiBUaWNrZXRDaGVjaywKICBUaWNrZXRNaW51czogKCkgPT4gVGlja2V0TWludXMsCiAgVGlja2V0UGVyY2VudDogKCkgPT4gVGlja2V0UGVyY2VudCwKICBUaWNrZXRQbHVzOiAoKSA9PiBUaWNrZXRQbHVzLAogIFRpY2tldFNsYXNoOiAoKSA9PiBUaWNrZXRTbGFzaCwKICBUaWNrZXRYOiAoKSA9PiBUaWNrZXRYLAogIFRpY2tldHM6ICgpID0+IFRpY2tldHMsCiAgVGlja2V0c1BsYW5lOiAoKSA9PiBUaWNrZXRzUGxhbmUsCiAgVGltZXI6ICgpID0+IFRpbWVyMywKICBUaW1lck9mZjogKCkgPT4gVGltZXJPZmYsCiAgVGltZXJSZXNldDogKCkgPT4gVGltZXJSZXNldCwKICBUb2dnbGVMZWZ0OiAoKSA9PiBUb2dnbGVMZWZ0LAogIFRvZ2dsZVJpZ2h0OiAoKSA9PiBUb2dnbGVSaWdodCwKICBUb2lsZXQ6ICgpID0+IFRvaWxldCwKICBUb29sQ2FzZTogKCkgPT4gVG9vbENhc2UsCiAgVG9vbGJveDogKCkgPT4gVG9vbGJveCwKICBUb3JuYWRvOiAoKSA9PiBUb3JuYWRvLAogIFRvcnVzOiAoKSA9PiBUb3J1cywKICBUb3VjaHBhZDogKCkgPT4gVG91Y2hwYWQsCiAgVG91Y2hwYWRPZmY6ICgpID0+IFRvdWNocGFkT2ZmLAogIFRvd2VsUmFjazogKCkgPT4gVG93ZWxSYWNrLAogIFRvd2VyQ29udHJvbDogKCkgPT4gVG93ZXJDb250cm9sLAogIFRveUJyaWNrOiAoKSA9PiBUb3lCcmljaywKICBUcmFjdG9yOiAoKSA9PiBUcmFjdG9yLAogIFRyYWZmaWNDb25lOiAoKSA9PiBUcmFmZmljQ29uZSwKICBUcmFpbjogKCkgPT4gVHJhbUZyb250LAogIFRyYWluRnJvbnQ6ICgpID0+IFRyYWluRnJvbnQsCiAgVHJhaW5Gcm9udFR1bm5lbDogKCkgPT4gVHJhaW5Gcm9udFR1bm5lbCwKICBUcmFpblRyYWNrOiAoKSA9PiBUcmFpblRyYWNrLAogIFRyYW1Gcm9udDogKCkgPT4gVHJhbUZyb250LAogIFRyYW5zZ2VuZGVyOiAoKSA9PiBUcmFuc2dlbmRlciwKICBUcmFzaDogKCkgPT4gVHJhc2gsCiAgVHJhc2gyOiAoKSA9PiBUcmFzaDIsCiAgVHJlZURlY2lkdW91czogKCkgPT4gVHJlZURlY2lkdW91cywKICBUcmVlUGFsbTogKCkgPT4gVHJlZVBhbG0sCiAgVHJlZVBpbmU6ICgpID0+IFRyZWVQaW5lLAogIFRyZWVzOiAoKSA9PiBUcmVlcywKICBUcmVsbG86ICgpID0+IFRyZWxsbywKICBUcmVuZGluZ0Rvd246ICgpID0+IFRyZW5kaW5nRG93biwKICBUcmVuZGluZ1VwOiAoKSA9PiBUcmVuZGluZ1VwLAogIFRyZW5kaW5nVXBEb3duOiAoKSA9PiBUcmVuZGluZ1VwRG93biwKICBUcmlhbmdsZTogKCkgPT4gVHJpYW5nbGUsCiAgVHJpYW5nbGVBbGVydDogKCkgPT4gVHJpYW5nbGVBbGVydCwKICBUcmlhbmdsZURhc2hlZDogKCkgPT4gVHJpYW5nbGVEYXNoZWQsCiAgVHJpYW5nbGVSaWdodDogKCkgPT4gVHJpYW5nbGVSaWdodCwKICBUcm9waHk6ICgpID0+IFRyb3BoeSwKICBUcnVjazogKCkgPT4gVHJ1Y2ssCiAgVHJ1Y2tFbGVjdHJpYzogKCkgPT4gVHJ1Y2tFbGVjdHJpYywKICBUdXJraXNoTGlyYTogKCkgPT4gVHVya2lzaExpcmEsCiAgVHVybnRhYmxlOiAoKSA9PiBUdXJudGFibGUsCiAgVHVydGxlOiAoKSA9PiBUdXJ0bGUsCiAgVHY6ICgpID0+IFR2LAogIFR2MjogKCkgPT4gVHZNaW5pbWFsLAogIFR2TWluaW1hbDogKCkgPT4gVHZNaW5pbWFsLAogIFR2TWluaW1hbFBsYXk6ICgpID0+IFR2TWluaW1hbFBsYXksCiAgVHdpdGNoOiAoKSA9PiBUd2l0Y2gsCiAgVHdpdHRlcjogKCkgPT4gVHdpdHRlciwKICBUeXBlOiAoKSA9PiBUeXBlLAogIFR5cGVPdXRsaW5lOiAoKSA9PiBUeXBlT3V0bGluZSwKICBVbWJyZWxsYTogKCkgPT4gVW1icmVsbGEsCiAgVW1icmVsbGFPZmY6ICgpID0+IFVtYnJlbGxhT2ZmLAogIFVuZGVybGluZTogKCkgPT4gVW5kZXJsaW5lLAogIFVuZG86ICgpID0+IFVuZG8sCiAgVW5kbzI6ICgpID0+IFVuZG8yLAogIFVuZG9Eb3Q6ICgpID0+IFVuZG9Eb3QsCiAgVW5mb2xkSG9yaXpvbnRhbDogKCkgPT4gVW5mb2xkSG9yaXpvbnRhbCwKICBVbmZvbGRWZXJ0aWNhbDogKCkgPT4gVW5mb2xkVmVydGljYWwsCiAgVW5ncm91cDogKCkgPT4gVW5ncm91cCwKICBVbml2ZXJzaXR5OiAoKSA9PiBVbml2ZXJzaXR5LAogIFVubGluazogKCkgPT4gVW5saW5rLAogIFVubGluazI6ICgpID0+IFVubGluazIsCiAgVW5sb2NrOiAoKSA9PiBMb2NrT3BlbiwKICBVbmxvY2tLZXlob2xlOiAoKSA9PiBMb2NrS2V5aG9sZU9wZW4sCiAgVW5wbHVnOiAoKSA9PiBVbnBsdWcsCiAgVXBsb2FkOiAoKSA9PiBVcGxvYWQsCiAgVXBsb2FkQ2xvdWQ6ICgpID0+IENsb3VkVXBsb2FkLAogIFVzYjogKCkgPT4gVXNiLAogIFVzZXI6ICgpID0+IFVzZXIsCiAgVXNlcjI6ICgpID0+IFVzZXJSb3VuZCwKICBVc2VyQ2hlY2s6ICgpID0+IFVzZXJDaGVjaywKICBVc2VyQ2hlY2syOiAoKSA9PiBVc2VyUm91bmRDaGVjaywKICBVc2VyQ2lyY2xlOiAoKSA9PiBDaXJjbGVVc2VyLAogIFVzZXJDaXJjbGUyOiAoKSA9PiBDaXJjbGVVc2VyUm91bmQsCiAgVXNlckNvZzogKCkgPT4gVXNlckNvZywKICBVc2VyQ29nMjogKCkgPT4gVXNlclJvdW5kQ29nLAogIFVzZXJLZXk6ICgpID0+IFVzZXJLZXksCiAgVXNlckxvY2s6ICgpID0+IFVzZXJMb2NrLAogIFVzZXJNaW51czogKCkgPT4gVXNlck1pbnVzLAogIFVzZXJNaW51czI6ICgpID0+IFVzZXJSb3VuZE1pbnVzLAogIFVzZXJQZW46ICgpID0+IFVzZXJQZW4sCiAgVXNlclBsdXM6ICgpID0+IFVzZXJQbHVzLAogIFVzZXJQbHVzMjogKCkgPT4gVXNlclJvdW5kUGx1cywKICBVc2VyUm91bmQ6ICgpID0+IFVzZXJSb3VuZCwKICBVc2VyUm91bmRDaGVjazogKCkgPT4gVXNlclJvdW5kQ2hlY2ssCiAgVXNlclJvdW5kQ29nOiAoKSA9PiBVc2VyUm91bmRDb2csCiAgVXNlclJvdW5kS2V5OiAoKSA9PiBVc2VyUm91bmRLZXksCiAgVXNlclJvdW5kTWludXM6ICgpID0+IFVzZXJSb3VuZE1pbnVzLAogIFVzZXJSb3VuZFBlbjogKCkgPT4gVXNlclJvdW5kUGVuLAogIFVzZXJSb3VuZFBsdXM6ICgpID0+IFVzZXJSb3VuZFBsdXMsCiAgVXNlclJvdW5kU2VhcmNoOiAoKSA9PiBVc2VyUm91bmRTZWFyY2gsCiAgVXNlclJvdW5kWDogKCkgPT4gVXNlclJvdW5kWCwKICBVc2VyU2VhcmNoOiAoKSA9PiBVc2VyU2VhcmNoLAogIFVzZXJTcXVhcmU6ICgpID0+IFNxdWFyZVVzZXIsCiAgVXNlclNxdWFyZTI6ICgpID0+IFNxdWFyZVVzZXJSb3VuZCwKICBVc2VyU3RhcjogKCkgPT4gVXNlclN0YXIsCiAgVXNlclg6ICgpID0+IFVzZXJYLAogIFVzZXJYMjogKCkgPT4gVXNlclJvdW5kWCwKICBVc2VyczogKCkgPT4gVXNlcnMsCiAgVXNlcnMyOiAoKSA9PiBVc2Vyc1JvdW5kLAogIFVzZXJzUm91bmQ6ICgpID0+IFVzZXJzUm91bmQsCiAgVXRlbnNpbHM6ICgpID0+IFV0ZW5zaWxzLAogIFV0ZW5zaWxzQ3Jvc3NlZDogKCkgPT4gVXRlbnNpbHNDcm9zc2VkLAogIFV0aWxpdHlQb2xlOiAoKSA9PiBVdGlsaXR5UG9sZSwKICBWYW46ICgpID0+IFZhbiwKICBWYXJpYWJsZTogKCkgPT4gVmFyaWFibGUsCiAgVmF1bHQ6ICgpID0+IFZhdWx0LAogIFZlY3RvclNxdWFyZTogKCkgPT4gVmVjdG9yU3F1YXJlLAogIFZlZ2FuOiAoKSA9PiBWZWdhbiwKICBWZW5ldGlhbk1hc2s6ICgpID0+IFZlbmV0aWFuTWFzaywKICBWZW51czogKCkgPT4gVmVudXMsCiAgVmVudXNBbmRNYXJzOiAoKSA9PiBWZW51c0FuZE1hcnMsCiAgVmVyaWZpZWQ6ICgpID0+IEJhZGdlQ2hlY2ssCiAgVmlicmF0ZTogKCkgPT4gVmlicmF0ZSwKICBWaWJyYXRlT2ZmOiAoKSA9PiBWaWJyYXRlT2ZmLAogIFZpZGVvOiAoKSA9PiBWaWRlbywKICBWaWRlb09mZjogKCkgPT4gVmlkZW9PZmYsCiAgVmlkZW90YXBlOiAoKSA9PiBWaWRlb3RhcGUsCiAgVmlldzogKCkgPT4gVmlldywKICBWb2ljZW1haWw6ICgpID0+IFZvaWNlbWFpbCwKICBWb2xsZXliYWxsOiAoKSA9PiBWb2xsZXliYWxsLAogIFZvbHVtZTogKCkgPT4gVm9sdW1lLAogIFZvbHVtZTE6ICgpID0+IFZvbHVtZTEsCiAgVm9sdW1lMjogKCkgPT4gVm9sdW1lMiwKICBWb2x1bWVPZmY6ICgpID0+IFZvbHVtZU9mZiwKICBWb2x1bWVYOiAoKSA9PiBWb2x1bWVYLAogIFZvdGU6ICgpID0+IFZvdGUsCiAgV2FsbGV0OiAoKSA9PiBXYWxsZXQsCiAgV2FsbGV0MjogKCkgPT4gV2FsbGV0TWluaW1hbCwKICBXYWxsZXRDYXJkczogKCkgPT4gV2FsbGV0Q2FyZHMsCiAgV2FsbGV0TWluaW1hbDogKCkgPT4gV2FsbGV0TWluaW1hbCwKICBXYWxscGFwZXI6ICgpID0+IFdhbGxwYXBlciwKICBXYW5kOiAoKSA9PiBXYW5kLAogIFdhbmQyOiAoKSA9PiBXYW5kU3BhcmtsZXMsCiAgV2FuZFNwYXJrbGVzOiAoKSA9PiBXYW5kU3BhcmtsZXMsCiAgV2FyZWhvdXNlOiAoKSA9PiBXYXJlaG91c2UsCiAgV2FzaGluZ01hY2hpbmU6ICgpID0+IFdhc2hpbmdNYWNoaW5lLAogIFdhdGNoOiAoKSA9PiBXYXRjaCwKICBXYXZlczogKCkgPT4gV2F2ZXMsCiAgV2F2ZXNBcnJvd0Rvd246ICgpID0+IFdhdmVzQXJyb3dEb3duLAogIFdhdmVzQXJyb3dVcDogKCkgPT4gV2F2ZXNBcnJvd1VwLAogIFdhdmVzTGFkZGVyOiAoKSA9PiBXYXZlc0xhZGRlciwKICBXYXlwb2ludHM6ICgpID0+IFdheXBvaW50cywKICBXZWJjYW06ICgpID0+IFdlYmNhbSwKICBXZWJob29rOiAoKSA9PiBXZWJob29rLAogIFdlYmhvb2tPZmY6ICgpID0+IFdlYmhvb2tPZmYsCiAgV2VpZ2h0OiAoKSA9PiBXZWlnaHQsCiAgV2VpZ2h0VGlsZGU6ICgpID0+IFdlaWdodFRpbGRlLAogIFdoZWF0OiAoKSA9PiBXaGVhdCwKICBXaGVhdE9mZjogKCkgPT4gV2hlYXRPZmYsCiAgV2hvbGVXb3JkOiAoKSA9PiBXaG9sZVdvcmQsCiAgV2lmaTogKCkgPT4gV2lmaSwKICBXaWZpQ29nOiAoKSA9PiBXaWZpQ29nLAogIFdpZmlIaWdoOiAoKSA9PiBXaWZpSGlnaCwKICBXaWZpTG93OiAoKSA9PiBXaWZpTG93LAogIFdpZmlPZmY6ICgpID0+IFdpZmlPZmYsCiAgV2lmaVBlbjogKCkgPT4gV2lmaVBlbiwKICBXaWZpU3luYzogKCkgPT4gV2lmaVN5bmMsCiAgV2lmaVplcm86ICgpID0+IFdpZmlaZXJvLAogIFdpbmQ6ICgpID0+IFdpbmQsCiAgV2luZEFycm93RG93bjogKCkgPT4gV2luZEFycm93RG93biwKICBXaW5lOiAoKSA9PiBXaW5lLAogIFdpbmVPZmY6ICgpID0+IFdpbmVPZmYsCiAgV29ya2Zsb3c6ICgpID0+IFdvcmtmbG93LAogIFdvcm06ICgpID0+IFdvcm0sCiAgV3JhcFRleHQ6ICgpID0+IFRleHRXcmFwLAogIFdyZW5jaDogKCkgPT4gV3JlbmNoLAogIFg6ICgpID0+IFgyLAogIFhDaXJjbGU6ICgpID0+IENpcmNsZVgsCiAgWExpbmVUb3A6ICgpID0+IFhMaW5lVG9wLAogIFhPY3RhZ29uOiAoKSA9PiBPY3RhZ29uWCwKICBYU3F1YXJlOiAoKSA9PiBTcXVhcmVYLAogIFlvdXR1YmU6ICgpID0+IFlvdXR1YmUsCiAgWmFwOiAoKSA9PiBaYXAsCiAgWmFwT2ZmOiAoKSA9PiBaYXBPZmYsCiAgWm9kaWFjQXF1YXJpdXM6ICgpID0+IFpvZGlhY0FxdWFyaXVzLAogIFpvZGlhY0FyaWVzOiAoKSA9PiBab2RpYWNBcmllcywKICBab2RpYWNDYW5jZXI6ICgpID0+IFpvZGlhY0NhbmNlciwKICBab2RpYWNDYXByaWNvcm46ICgpID0+IFpvZGlhY0NhcHJpY29ybiwKICBab2RpYWNHZW1pbmk6ICgpID0+IFpvZGlhY0dlbWluaSwKICBab2RpYWNMZW86ICgpID0+IFpvZGlhY0xlbywKICBab2RpYWNMaWJyYTogKCkgPT4gWm9kaWFjTGlicmEsCiAgWm9kaWFjT3BoaXVjaHVzOiAoKSA9PiBab2RpYWNPcGhpdWNodXMsCiAgWm9kaWFjUGlzY2VzOiAoKSA9PiBab2RpYWNQaXNjZXMsCiAgWm9kaWFjU2FnaXR0YXJpdXM6ICgpID0+IFpvZGlhY1NhZ2l0dGFyaXVzLAogIFpvZGlhY1Njb3JwaW86ICgpID0+IFpvZGlhY1Njb3JwaW8sCiAgWm9kaWFjVGF1cnVzOiAoKSA9PiBab2RpYWNUYXVydXMsCiAgWm9kaWFjVmlyZ286ICgpID0+IFpvZGlhY1ZpcmdvLAogIFpvb21JbjogKCkgPT4gWm9vbUluLAogIFpvb21PdXQ6ICgpID0+IFpvb21PdXQsCiAgY3JlYXRlRWxlbWVudDogKCkgPT4gY3JlYXRlRWxlbWVudDIsCiAgY3JlYXRlSWNvbnM6ICgpID0+IGNyZWF0ZUljb25zLAogIGljb25zOiAoKSA9PiBpY29uc0FuZEFsaWFzZXNfZXhwb3J0cwp9KTsKdmFyIGNyZWF0ZUljb25zOwp2YXIgaW5pdF9sdWNpZGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9sdWNpZGVAMC41NzcuMC9ub2RlX21vZHVsZXMvbHVjaWRlL2Rpc3QvZXNtL2x1Y2lkZS5qcyIoKSB7CiAgICBpbml0X3JlcGxhY2VFbGVtZW50KCk7CiAgICBpbml0X2ljb25zQW5kQWxpYXNlcygpOwogICAgaW5pdF9jcmVhdGVFbGVtZW50KCk7CiAgICBpbml0X2FfYXJyb3dfZG93bigpOwogICAgaW5pdF9hX2Fycm93X3VwKCk7CiAgICBpbml0X2FfbGFyZ2Vfc21hbGwoKTsKICAgIGluaXRfYWNjZXNzaWJpbGl0eSgpOwogICAgaW5pdF9hY3Rpdml0eSgpOwogICAgaW5pdF9haXJfdmVudCgpOwogICAgaW5pdF9haXJwbGF5KCk7CiAgICBpbml0X2FsYXJtX2Nsb2NrX21pbnVzKCk7CiAgICBpbml0X2FsYXJtX2Nsb2NrX2NoZWNrKCk7CiAgICBpbml0X2FsYXJtX2Nsb2NrX29mZigpOwogICAgaW5pdF9hbGFybV9jbG9jaygpOwogICAgaW5pdF9hbGFybV9jbG9ja19wbHVzKCk7CiAgICBpbml0X2FsYXJtX3Ntb2tlKCk7CiAgICBpbml0X2FsYnVtKCk7CiAgICBpbml0X2FsaWduX2NlbnRlcl9ob3Jpem9udGFsKCk7CiAgICBpbml0X2FsaWduX2NlbnRlcl92ZXJ0aWNhbCgpOwogICAgaW5pdF9hbGlnbl9lbmRfaG9yaXpvbnRhbCgpOwogICAgaW5pdF9hbGlnbl9lbmRfdmVydGljYWwoKTsKICAgIGluaXRfYWxpZ25faG9yaXpvbnRhbF9kaXN0cmlidXRlX2NlbnRlcigpOwogICAgaW5pdF9hbGlnbl9ob3Jpem9udGFsX2Rpc3RyaWJ1dGVfZW5kKCk7CiAgICBpbml0X2FsaWduX2hvcml6b250YWxfZGlzdHJpYnV0ZV9zdGFydCgpOwogICAgaW5pdF9hbGlnbl9ob3Jpem9udGFsX2p1c3RpZnlfY2VudGVyKCk7CiAgICBpbml0X2FsaWduX2hvcml6b250YWxfanVzdGlmeV9lbmQoKTsKICAgIGluaXRfYWxpZ25faG9yaXpvbnRhbF9qdXN0aWZ5X3N0YXJ0KCk7CiAgICBpbml0X2FsaWduX2hvcml6b250YWxfc3BhY2VfYXJvdW5kKCk7CiAgICBpbml0X2FsaWduX2hvcml6b250YWxfc3BhY2VfYmV0d2VlbigpOwogICAgaW5pdF9hbGlnbl9zdGFydF9ob3Jpem9udGFsKCk7CiAgICBpbml0X2FsaWduX3N0YXJ0X3ZlcnRpY2FsKCk7CiAgICBpbml0X2FsaWduX3ZlcnRpY2FsX2Rpc3RyaWJ1dGVfY2VudGVyKCk7CiAgICBpbml0X2FsaWduX3ZlcnRpY2FsX2Rpc3RyaWJ1dGVfZW5kKCk7CiAgICBpbml0X2FsaWduX3ZlcnRpY2FsX2Rpc3RyaWJ1dGVfc3RhcnQoKTsKICAgIGluaXRfYWxpZ25fdmVydGljYWxfanVzdGlmeV9jZW50ZXIoKTsKICAgIGluaXRfYWxpZ25fdmVydGljYWxfanVzdGlmeV9lbmQoKTsKICAgIGluaXRfYWxpZ25fdmVydGljYWxfanVzdGlmeV9zdGFydCgpOwogICAgaW5pdF9hbGlnbl92ZXJ0aWNhbF9zcGFjZV9hcm91bmQoKTsKICAgIGluaXRfYWxpZ25fdmVydGljYWxfc3BhY2VfYmV0d2VlbigpOwogICAgaW5pdF9hbXBlcnNhbmQoKTsKICAgIGluaXRfYW1idWxhbmNlKCk7CiAgICBpbml0X2FtcGVyc2FuZHMoKTsKICAgIGluaXRfYW1waG9yYSgpOwogICAgaW5pdF9hbmNob3IoKTsKICAgIGluaXRfYW5ncnkoKTsKICAgIGluaXRfYW5ub3llZCgpOwogICAgaW5pdF9hbnRlbm5hKCk7CiAgICBpbml0X2FudmlsKCk7CiAgICBpbml0X2FwZXJ0dXJlKCk7CiAgICBpbml0X2FwcF93aW5kb3dfbWFjKCk7CiAgICBpbml0X2FwcF93aW5kb3coKTsKICAgIGluaXRfYXBwbGUoKTsKICAgIGluaXRfYXJjaGl2ZV9yZXN0b3JlKCk7CiAgICBpbml0X2FyY2hpdmVfeCgpOwogICAgaW5pdF9hcmNoaXZlKCk7CiAgICBpbml0X2FybWNoYWlyKCk7CiAgICBpbml0X2Fycm93X2JpZ19kb3duX2Rhc2goKTsKICAgIGluaXRfYXJyb3dfYmlnX2Rvd24oKTsKICAgIGluaXRfYXJyb3dfYmlnX2xlZnRfZGFzaCgpOwogICAgaW5pdF9hcnJvd19iaWdfbGVmdCgpOwogICAgaW5pdF9hcnJvd19iaWdfcmlnaHRfZGFzaCgpOwogICAgaW5pdF9hcnJvd19iaWdfcmlnaHQoKTsKICAgIGluaXRfYXJyb3dfYmlnX3VwX2Rhc2goKTsKICAgIGluaXRfYXJyb3dfZG93bl8wXzEoKTsKICAgIGluaXRfYXJyb3dfYmlnX3VwKCk7CiAgICBpbml0X2Fycm93X2Rvd25fMV8wKCk7CiAgICBpbml0X2Fycm93X2Rvd25fYV96KCk7CiAgICBpbml0X2Fycm93X2Rvd25fZnJvbV9saW5lKCk7CiAgICBpbml0X2Fycm93X2Rvd25fbGVmdCgpOwogICAgaW5pdF9hcnJvd19kb3duX25hcnJvd193aWRlKCk7CiAgICBpbml0X2Fycm93X2Rvd25fcmlnaHQoKTsKICAgIGluaXRfYXJyb3dfZG93bl90b19kb3QoKTsKICAgIGluaXRfYXJyb3dfZG93bl90b19saW5lKCk7CiAgICBpbml0X2Fycm93X2Rvd25fdXAoKTsKICAgIGluaXRfYXJyb3dfZG93bl93aWRlX25hcnJvdygpOwogICAgaW5pdF9hcnJvd19kb3duX3pfYSgpOwogICAgaW5pdF9hcnJvd19kb3duKCk7CiAgICBpbml0X2Fycm93X2xlZnRfZnJvbV9saW5lKCk7CiAgICBpbml0X2Fycm93X2xlZnRfcmlnaHQoKTsKICAgIGluaXRfYXJyb3dfbGVmdF90b19saW5lKCk7CiAgICBpbml0X2Fycm93X2xlZnQoKTsKICAgIGluaXRfYXJyb3dfcmlnaHRfZnJvbV9saW5lKCk7CiAgICBpbml0X2Fycm93X3JpZ2h0X2xlZnQoKTsKICAgIGluaXRfYXJyb3dfcmlnaHRfdG9fbGluZSgpOwogICAgaW5pdF9hcnJvd19yaWdodCgpOwogICAgaW5pdF9hcnJvd191cF8wXzEoKTsKICAgIGluaXRfYXJyb3dfdXBfMV8wKCk7CiAgICBpbml0X2Fycm93X3VwX2FfeigpOwogICAgaW5pdF9hcnJvd191cF9kb3duKCk7CiAgICBpbml0X2Fycm93X3VwX2Zyb21fZG90KCk7CiAgICBpbml0X2Fycm93X3VwX2Zyb21fbGluZSgpOwogICAgaW5pdF9hcnJvd191cF9sZWZ0KCk7CiAgICBpbml0X2Fycm93X3VwX25hcnJvd193aWRlKCk7CiAgICBpbml0X2Fycm93X3VwX3JpZ2h0KCk7CiAgICBpbml0X2Fycm93X3VwX3RvX2xpbmUoKTsKICAgIGluaXRfYXJyb3dfdXBfd2lkZV9uYXJyb3coKTsKICAgIGluaXRfYXJyb3dfdXBfel9hKCk7CiAgICBpbml0X2Fycm93X3VwKCk7CiAgICBpbml0X2Fycm93c191cF9mcm9tX2xpbmUoKTsKICAgIGluaXRfYXRfc2lnbigpOwogICAgaW5pdF9hc3RlcmlzaygpOwogICAgaW5pdF9hdG9tKCk7CiAgICBpbml0X2F1ZGlvX2xpbmVzKCk7CiAgICBpbml0X2F1ZGlvX3dhdmVmb3JtKCk7CiAgICBpbml0X2F3YXJkKCk7CiAgICBpbml0X2F4ZSgpOwogICAgaW5pdF9heGlzXzNkKCk7CiAgICBpbml0X2JhYnkoKTsKICAgIGluaXRfYmFja3BhY2soKTsKICAgIGluaXRfYmFkZ2VfYWxlcnQoKTsKICAgIGluaXRfYmFkZ2VfY2VudCgpOwogICAgaW5pdF9iYWRnZV9jaGVjaygpOwogICAgaW5pdF9iYWRnZV9ldXJvKCk7CiAgICBpbml0X2JhZGdlX2RvbGxhcl9zaWduKCk7CiAgICBpbml0X2JhZGdlX2luZGlhbl9ydXBlZSgpOwogICAgaW5pdF9iYWRnZV9pbmZvKCk7CiAgICBpbml0X2JhZGdlX2phcGFuZXNlX3llbigpOwogICAgaW5pdF9iYWRnZV9taW51cygpOwogICAgaW5pdF9iYWRnZV9wZXJjZW50KCk7CiAgICBpbml0X2JhZGdlX3BvdW5kX3N0ZXJsaW5nKCk7CiAgICBpbml0X2JhZGdlX3BsdXMoKTsKICAgIGluaXRfYmFkZ2VfcXVlc3Rpb25fbWFyaygpOwogICAgaW5pdF9iYWRnZV9ydXNzaWFuX3J1YmxlKCk7CiAgICBpbml0X2JhZGdlX3N3aXNzX2ZyYW5jKCk7CiAgICBpbml0X2JhZGdlX3R1cmtpc2hfbGlyYSgpOwogICAgaW5pdF9iYWRnZV94KCk7CiAgICBpbml0X2JhZGdlKCk7CiAgICBpbml0X2JhZ2dhZ2VfY2xhaW0oKTsKICAgIGluaXRfYmFsbG9vbigpOwogICAgaW5pdF9iYW4oKTsKICAgIGluaXRfYmFuYW5hKCk7CiAgICBpbml0X2JhbmRhZ2UoKTsKICAgIGluaXRfYmFua25vdGVfYXJyb3dfZG93bigpOwogICAgaW5pdF9iYW5rbm90ZV9hcnJvd191cCgpOwogICAgaW5pdF9iYW5rbm90ZV94KCk7CiAgICBpbml0X2Jhbmtub3RlKCk7CiAgICBpbml0X2JhcmNvZGUoKTsKICAgIGluaXRfYmFycmVsKCk7CiAgICBpbml0X2Jhc2VsaW5lKCk7CiAgICBpbml0X2JhdGgoKTsKICAgIGluaXRfYmF0dGVyeV9jaGFyZ2luZygpOwogICAgaW5pdF9iYXR0ZXJ5X2Z1bGwoKTsKICAgIGluaXRfYmF0dGVyeV9sb3coKTsKICAgIGluaXRfYmF0dGVyeV9tZWRpdW0oKTsKICAgIGluaXRfYmF0dGVyeV9wbHVzKCk7CiAgICBpbml0X2JhdHRlcnlfd2FybmluZygpOwogICAgaW5pdF9iYXR0ZXJ5KCk7CiAgICBpbml0X2JlYWtlcigpOwogICAgaW5pdF9iZWFuX29mZigpOwogICAgaW5pdF9iZWFuKCk7CiAgICBpbml0X2JlZF9kb3VibGUoKTsKICAgIGluaXRfYmVkX3NpbmdsZSgpOwogICAgaW5pdF9iZWQoKTsKICAgIGluaXRfYmVlZigpOwogICAgaW5pdF9iZWVyX29mZigpOwogICAgaW5pdF9iZWVyKCk7CiAgICBpbml0X2JlbGxfZG90KCk7CiAgICBpbml0X2JlbGxfb2ZmKCk7CiAgICBpbml0X2JlbGxfZWxlY3RyaWMoKTsKICAgIGluaXRfYmVsbF9taW51cygpOwogICAgaW5pdF9iZWxsX3BsdXMoKTsKICAgIGluaXRfYmVsbF9yaW5nKCk7CiAgICBpbml0X2JlbGwoKTsKICAgIGluaXRfYmV0d2Vlbl9ob3Jpem9udGFsX2VuZCgpOwogICAgaW5pdF9iZXR3ZWVuX3ZlcnRpY2FsX2VuZCgpOwogICAgaW5pdF9iZXR3ZWVuX2hvcml6b250YWxfc3RhcnQoKTsKICAgIGluaXRfYmV0d2Vlbl92ZXJ0aWNhbF9zdGFydCgpOwogICAgaW5pdF9iaWtlKCk7CiAgICBpbml0X2JpY2Vwc19mbGV4ZWQoKTsKICAgIGluaXRfYmluYXJ5KCk7CiAgICBpbml0X2Jpb2hhemFyZCgpOwogICAgaW5pdF9iaW5vY3VsYXJzKCk7CiAgICBpbml0X2JpcmQoKTsKICAgIGluaXRfYml0Y29pbigpOwogICAgaW5pdF9iaXJkaG91c2UoKTsKICAgIGluaXRfYmxlbmQoKTsKICAgIGluaXRfYmxpbmRzKCk7CiAgICBpbml0X2Jsb2NrcygpOwogICAgaW5pdF9ibHVldG9vdGhfY29ubmVjdGVkKCk7CiAgICBpbml0X2JsdWV0b290aF9vZmYoKTsKICAgIGluaXRfYmx1ZXRvb3RoX3NlYXJjaGluZygpOwogICAgaW5pdF9ibHVldG9vdGgoKTsKICAgIGluaXRfYm9sZCgpOwogICAgaW5pdF9ib2x0KCk7CiAgICBpbml0X2JvbWIoKTsKICAgIGluaXRfYm9uZSgpOwogICAgaW5pdF9ib29rX2EoKTsKICAgIGluaXRfYm9va19hbGVydCgpOwogICAgaW5pdF9ib29rX2F1ZGlvKCk7CiAgICBpbml0X2Jvb2tfY2hlY2soKTsKICAgIGluaXRfYm9va19kYXNoZWQoKTsKICAgIGluaXRfYm9va19jb3B5KCk7CiAgICBpbml0X2Jvb2tfZG93bigpOwogICAgaW5pdF9ib29rX2hlYWRwaG9uZXMoKTsKICAgIGluaXRfYm9va19oZWFydCgpOwogICAgaW5pdF9ib29rX2ltYWdlKCk7CiAgICBpbml0X2Jvb2tfa2V5KCk7CiAgICBpbml0X2Jvb2tfbWFya2VkKCk7CiAgICBpbml0X2Jvb2tfbG9jaygpOwogICAgaW5pdF9ib29rX21pbnVzKCk7CiAgICBpbml0X2Jvb2tfb3Blbl9jaGVjaygpOwogICAgaW5pdF9ib29rX29wZW5fdGV4dCgpOwogICAgaW5pdF9ib29rX29wZW4oKTsKICAgIGluaXRfYm9va19wbHVzKCk7CiAgICBpbml0X2Jvb2tfc2VhcmNoKCk7CiAgICBpbml0X2Jvb2tfdGV4dCgpOwogICAgaW5pdF9ib29rX3VwXzIoKTsKICAgIGluaXRfYm9va190eXBlKCk7CiAgICBpbml0X2Jvb2tfdXAoKTsKICAgIGluaXRfYm9va191c2VyKCk7CiAgICBpbml0X2Jvb2tfeCgpOwogICAgaW5pdF9ib29rKCk7CiAgICBpbml0X2Jvb2ttYXJrX2NoZWNrKCk7CiAgICBpbml0X2Jvb2ttYXJrX21pbnVzKCk7CiAgICBpbml0X2Jvb2ttYXJrX3BsdXMoKTsKICAgIGluaXRfYm9va21hcmtfeCgpOwogICAgaW5pdF9ib29rbWFyaygpOwogICAgaW5pdF9ib29tX2JveCgpOwogICAgaW5pdF9ib3RfbWVzc2FnZV9zcXVhcmUoKTsKICAgIGluaXRfYm90X29mZigpOwogICAgaW5pdF9ib3QoKTsKICAgIGluaXRfYm93X2Fycm93KCk7CiAgICBpbml0X2JvdHRsZV93aW5lKCk7CiAgICBpbml0X2JveCgpOwogICAgaW5pdF9ib3hlcygpOwogICAgaW5pdF9icmFjZXMoKTsKICAgIGluaXRfYnJhY2tldHMoKTsKICAgIGluaXRfYnJhaW5fY2lyY3VpdCgpOwogICAgaW5pdF9icmFpbigpOwogICAgaW5pdF9icmFpbl9jb2coKTsKICAgIGluaXRfYnJpY2tfd2FsbF9maXJlKCk7CiAgICBpbml0X2JyaWNrX3dhbGxfc2hpZWxkKCk7CiAgICBpbml0X2JyaWNrX3dhbGwoKTsKICAgIGluaXRfYnJpZWZjYXNlX2J1c2luZXNzKCk7CiAgICBpbml0X2JyaWVmY2FzZV9jb252ZXlvcl9iZWx0KCk7CiAgICBpbml0X2JyaWVmY2FzZV9tZWRpY2FsKCk7CiAgICBpbml0X2JyaWVmY2FzZSgpOwogICAgaW5pdF9icmluZ190b19mcm9udCgpOwogICAgaW5pdF9icnVzaF9jbGVhbmluZygpOwogICAgaW5pdF9icnVzaCgpOwogICAgaW5pdF9idWdfb2ZmKCk7CiAgICBpbml0X2J1YmJsZXMoKTsKICAgIGluaXRfYnVnX3BsYXkoKTsKICAgIGluaXRfYnVnKCk7CiAgICBpbml0X2J1aWxkaW5nXzIoKTsKICAgIGluaXRfYnVpbGRpbmcoKTsKICAgIGluaXRfYnVzX2Zyb250KCk7CiAgICBpbml0X2J1cygpOwogICAgaW5pdF9jYWJsZV9jYXIoKTsKICAgIGluaXRfY2FibGUoKTsKICAgIGluaXRfY2FrZV9zbGljZSgpOwogICAgaW5pdF9jYWtlKCk7CiAgICBpbml0X2NhbGN1bGF0b3IoKTsKICAgIGluaXRfY2FsZW5kYXJfMSgpOwogICAgaW5pdF9jYWxlbmRhcl9hcnJvd19kb3duKCk7CiAgICBpbml0X2NhbGVuZGFyX2Fycm93X3VwKCk7CiAgICBpbml0X2NhbGVuZGFyX2NoZWNrXzIoKTsKICAgIGluaXRfY2FsZW5kYXJfY2hlY2soKTsKICAgIGluaXRfY2FsZW5kYXJfY2xvY2soKTsKICAgIGluaXRfY2FsZW5kYXJfY29nKCk7CiAgICBpbml0X2NhbGVuZGFyX2RheXMoKTsKICAgIGluaXRfY2FsZW5kYXJfZm9sZCgpOwogICAgaW5pdF9jYWxlbmRhcl9oZWFydCgpOwogICAgaW5pdF9jYWxlbmRhcl9taW51c18yKCk7CiAgICBpbml0X2NhbGVuZGFyX21pbnVzKCk7CiAgICBpbml0X2NhbGVuZGFyX29mZigpOwogICAgaW5pdF9jYWxlbmRhcl9wbHVzXzIoKTsKICAgIGluaXRfY2FsZW5kYXJfcGx1cygpOwogICAgaW5pdF9jYWxlbmRhcl9yYW5nZSgpOwogICAgaW5pdF9jYWxlbmRhcl9zZWFyY2goKTsKICAgIGluaXRfY2FsZW5kYXJfc3luYygpOwogICAgaW5pdF9jYWxlbmRhcl94XzIoKTsKICAgIGluaXRfY2FsZW5kYXJfeCgpOwogICAgaW5pdF9jYWxlbmRhcigpOwogICAgaW5pdF9jYWxlbmRhcnMoKTsKICAgIGluaXRfY2FtZXJhX29mZigpOwogICAgaW5pdF9jYW1lcmEoKTsKICAgIGluaXRfY2FuZHlfY2FuZSgpOwogICAgaW5pdF9jYW5keV9vZmYoKTsKICAgIGluaXRfY2FubmFiaXNfb2ZmKCk7CiAgICBpbml0X2Nhbm5hYmlzKCk7CiAgICBpbml0X2NhbmR5KCk7CiAgICBpbml0X2NhcHRpb25zX29mZigpOwogICAgaW5pdF9jYXB0aW9ucygpOwogICAgaW5pdF9jYXJfZnJvbnQoKTsKICAgIGluaXRfY2FyX3RheGlfZnJvbnQoKTsKICAgIGluaXRfY2FyKCk7CiAgICBpbml0X2NhcmF2YW4oKTsKICAgIGluaXRfY2Fycm90KCk7CiAgICBpbml0X2NhcmRfc2ltKCk7CiAgICBpbml0X2Nhc2VfbG93ZXIoKTsKICAgIGluaXRfY2FzZV9zZW5zaXRpdmUoKTsKICAgIGluaXRfY2FzZV91cHBlcigpOwogICAgaW5pdF9jYXNzZXR0ZV90YXBlKCk7CiAgICBpbml0X2Nhc3QoKTsKICAgIGluaXRfY2F0KCk7CiAgICBpbml0X2Nhc3RsZSgpOwogICAgaW5pdF9jY3R2KCk7CiAgICBpbml0X2NoYXJ0X2FyZWEoKTsKICAgIGluaXRfY2hhcnRfYmFyX2JpZygpOwogICAgaW5pdF9jaGFydF9iYXJfZGVjcmVhc2luZygpOwogICAgaW5pdF9jaGFydF9iYXJfaW5jcmVhc2luZygpOwogICAgaW5pdF9jaGFydF9iYXJfc3RhY2tlZCgpOwogICAgaW5pdF9jaGFydF9iYXIoKTsKICAgIGluaXRfY2hhcnRfY2FuZGxlc3RpY2soKTsKICAgIGluaXRfY2hhcnRfY29sdW1uX2JpZygpOwogICAgaW5pdF9jaGFydF9jb2x1bW5fZGVjcmVhc2luZygpOwogICAgaW5pdF9jaGFydF9jb2x1bW5faW5jcmVhc2luZygpOwogICAgaW5pdF9jaGFydF9jb2x1bW4oKTsKICAgIGluaXRfY2hhcnRfY29sdW1uX3N0YWNrZWQoKTsKICAgIGluaXRfY2hhcnRfZ2FudHQoKTsKICAgIGluaXRfY2hhcnRfbGluZSgpOwogICAgaW5pdF9jaGFydF9uZXR3b3JrKCk7CiAgICBpbml0X2NoYXJ0X25vX2F4ZXNfY29sdW1uX2RlY3JlYXNpbmcoKTsKICAgIGluaXRfY2hhcnRfbm9fYXhlc19jb2x1bW5faW5jcmVhc2luZygpOwogICAgaW5pdF9jaGFydF9ub19heGVzX2NvbHVtbigpOwogICAgaW5pdF9jaGFydF9ub19heGVzX2NvbWJpbmVkKCk7CiAgICBpbml0X2NoYXJ0X25vX2F4ZXNfZ2FudHQoKTsKICAgIGluaXRfY2hhcnRfcGllKCk7CiAgICBpbml0X2NoYXJ0X3NwbGluZSgpOwogICAgaW5pdF9jaGFydF9zY2F0dGVyKCk7CiAgICBpbml0X2NoZWNrX2NoZWNrKCk7CiAgICBpbml0X2NoZWNrX2xpbmUoKTsKICAgIGluaXRfY2hlY2soKTsKICAgIGluaXRfY2hlZl9oYXQoKTsKICAgIGluaXRfY2hlcnJ5KCk7CiAgICBpbml0X2NoZXNzX2tpbmcoKTsKICAgIGluaXRfY2hlc3NfYmlzaG9wKCk7CiAgICBpbml0X2NoZXNzX2tuaWdodCgpOwogICAgaW5pdF9jaGVzc19wYXduKCk7CiAgICBpbml0X2NoZXNzX3F1ZWVuKCk7CiAgICBpbml0X2NoZXNzX3Jvb2soKTsKICAgIGluaXRfY2hldnJvbl9kb3duKCk7CiAgICBpbml0X2NoZXZyb25fZmlyc3QoKTsKICAgIGluaXRfY2hldnJvbl9sYXN0KCk7CiAgICBpbml0X2NoZXZyb25fcmlnaHQoKTsKICAgIGluaXRfY2hldnJvbl9sZWZ0KCk7CiAgICBpbml0X2NoZXZyb25fdXAoKTsKICAgIGluaXRfY2hldnJvbnNfZG93bl91cCgpOwogICAgaW5pdF9jaGV2cm9uc19kb3duKCk7CiAgICBpbml0X2NoZXZyb25zX2xlZnRfcmlnaHRfZWxsaXBzaXMoKTsKICAgIGluaXRfY2hldnJvbnNfbGVmdF9yaWdodCgpOwogICAgaW5pdF9jaGV2cm9uc19sZWZ0KCk7CiAgICBpbml0X2NoZXZyb25zX3JpZ2h0X2xlZnQoKTsKICAgIGluaXRfY2hldnJvbnNfcmlnaHQoKTsKICAgIGluaXRfY2hldnJvbnNfdXBfZG93bigpOwogICAgaW5pdF9jaGV2cm9uc191cCgpOwogICAgaW5pdF9jaHJvbWl1bSgpOwogICAgaW5pdF9jaWdhcmV0dGVfb2ZmKCk7CiAgICBpbml0X2NodXJjaCgpOwogICAgaW5pdF9jaWdhcmV0dGUoKTsKICAgIGluaXRfY2lyY2xlX2FsZXJ0KCk7CiAgICBpbml0X2NpcmNsZV9hcnJvd19kb3duKCk7CiAgICBpbml0X2NpcmNsZV9hcnJvd19sZWZ0KCk7CiAgICBpbml0X2NpcmNsZV9hcnJvd19vdXRfZG93bl9sZWZ0KCk7CiAgICBpbml0X2NpcmNsZV9hcnJvd19vdXRfZG93bl9yaWdodCgpOwogICAgaW5pdF9jaXJjbGVfYXJyb3dfb3V0X3VwX2xlZnQoKTsKICAgIGluaXRfY2lyY2xlX2Fycm93X291dF91cF9yaWdodCgpOwogICAgaW5pdF9jaXJjbGVfYXJyb3dfcmlnaHQoKTsKICAgIGluaXRfY2lyY2xlX2Fycm93X3VwKCk7CiAgICBpbml0X2NpcmNsZV9jaGVja19iaWcoKTsKICAgIGluaXRfY2lyY2xlX2NoZWNrKCk7CiAgICBpbml0X2NpcmNsZV9jaGV2cm9uX2Rvd24oKTsKICAgIGluaXRfY2lyY2xlX2NoZXZyb25fbGVmdCgpOwogICAgaW5pdF9jaXJjbGVfY2hldnJvbl9yaWdodCgpOwogICAgaW5pdF9jaXJjbGVfY2hldnJvbl91cCgpOwogICAgaW5pdF9jaXJjbGVfZGFzaGVkKCk7CiAgICBpbml0X2NpcmNsZV9kaXZpZGUoKTsKICAgIGluaXRfY2lyY2xlX2RvbGxhcl9zaWduKCk7CiAgICBpbml0X2NpcmNsZV9kb3RfZGFzaGVkKCk7CiAgICBpbml0X2NpcmNsZV9kb3QoKTsKICAgIGluaXRfY2lyY2xlX2VsbGlwc2lzKCk7CiAgICBpbml0X2NpcmNsZV9lcXVhbCgpOwogICAgaW5pdF9jaXJjbGVfZmFkaW5nX2Fycm93X3VwKCk7CiAgICBpbml0X2NpcmNsZV9mYWRpbmdfcGx1cygpOwogICAgaW5pdF9jaXJjbGVfZ2F1Z2UoKTsKICAgIGluaXRfY2lyY2xlX21pbnVzKCk7CiAgICBpbml0X2NpcmNsZV9vZmYoKTsKICAgIGluaXRfY2lyY2xlX3BhcmtpbmcoKTsKICAgIGluaXRfY2lyY2xlX3Bhcmtpbmdfb2ZmKCk7CiAgICBpbml0X2NpcmNsZV9wYXVzZSgpOwogICAgaW5pdF9jaXJjbGVfcGVyY2VudCgpOwogICAgaW5pdF9jaXJjbGVfcGlsZSgpOwogICAgaW5pdF9jaXJjbGVfcGxheSgpOwogICAgaW5pdF9jaXJjbGVfcGx1cygpOwogICAgaW5pdF9jaXJjbGVfcG91bmRfc3RlcmxpbmcoKTsKICAgIGluaXRfY2lyY2xlX3Bvd2VyKCk7CiAgICBpbml0X2NpcmNsZV9xdWVzdGlvbl9tYXJrKCk7CiAgICBpbml0X2NpcmNsZV9zbGFzaF8yKCk7CiAgICBpbml0X2NpcmNsZV9zbGFzaCgpOwogICAgaW5pdF9jaXJjbGVfc21hbGwoKTsKICAgIGluaXRfY2lyY2xlX3N0YXIoKTsKICAgIGluaXRfY2lyY2xlX3N0b3AoKTsKICAgIGluaXRfY2lyY2xlX3VzZXJfcm91bmQoKTsKICAgIGluaXRfY2lyY2xlX3VzZXIoKTsKICAgIGluaXRfY2lyY2xlX3goKTsKICAgIGluaXRfY2lyY2xlKCk7CiAgICBpbml0X2NpcmN1aXRfYm9hcmQoKTsKICAgIGluaXRfY2l0cnVzKCk7CiAgICBpbml0X2NsYXBwZXJib2FyZCgpOwogICAgaW5pdF9jbGlwYm9hcmRfY2hlY2soKTsKICAgIGluaXRfY2xpcGJvYXJkX2Nsb2NrKCk7CiAgICBpbml0X2NsaXBib2FyZF9jb3B5KCk7CiAgICBpbml0X2NsaXBib2FyZF9saXN0KCk7CiAgICBpbml0X2NsaXBib2FyZF9taW51cygpOwogICAgaW5pdF9jbGlwYm9hcmRfcGFzdGUoKTsKICAgIGluaXRfY2xpcGJvYXJkX3Blbl9saW5lKCk7CiAgICBpbml0X2NsaXBib2FyZF9wZW4oKTsKICAgIGluaXRfY2xpcGJvYXJkX3BsdXMoKTsKICAgIGluaXRfY2xpcGJvYXJkX3R5cGUoKTsKICAgIGluaXRfY2xpcGJvYXJkX3goKTsKICAgIGluaXRfY2xpcGJvYXJkKCk7CiAgICBpbml0X2Nsb2NrXzEoKTsKICAgIGluaXRfY2xvY2tfMTAoKTsKICAgIGluaXRfY2xvY2tfMTEoKTsKICAgIGluaXRfY2xvY2tfMTIoKTsKICAgIGluaXRfY2xvY2tfMygpOwogICAgaW5pdF9jbG9ja18yKCk7CiAgICBpbml0X2Nsb2NrXzQoKTsKICAgIGluaXRfY2xvY2tfNSgpOwogICAgaW5pdF9jbG9ja182KCk7CiAgICBpbml0X2Nsb2NrXzcoKTsKICAgIGluaXRfY2xvY2tfOSgpOwogICAgaW5pdF9jbG9ja184KCk7CiAgICBpbml0X2Nsb2NrX2FsZXJ0KCk7CiAgICBpbml0X2Nsb2NrX2Fycm93X2Rvd24oKTsKICAgIGluaXRfY2xvY2tfYXJyb3dfdXAoKTsKICAgIGluaXRfY2xvY2tfY2hlY2soKTsKICAgIGluaXRfY2xvY2tfZmFkaW5nKCk7CiAgICBpbml0X2Nsb2NrX3BsdXMoKTsKICAgIGluaXRfY2xvY2soKTsKICAgIGluaXRfY2xvdWRfYWxlcnQoKTsKICAgIGluaXRfY2xvc2VkX2NhcHRpb24oKTsKICAgIGluaXRfY2xvdWRfYmFja3VwKCk7CiAgICBpbml0X2Nsb3VkX2NoZWNrKCk7CiAgICBpbml0X2Nsb3VkX2NvZygpOwogICAgaW5pdF9jbG91ZF9kb3dubG9hZCgpOwogICAgaW5pdF9jbG91ZF9kcml6emxlKCk7CiAgICBpbml0X2Nsb3VkX2ZvZygpOwogICAgaW5pdF9jbG91ZF9oYWlsKCk7CiAgICBpbml0X2Nsb3VkX2xpZ2h0bmluZygpOwogICAgaW5pdF9jbG91ZF9tb29uX3JhaW4oKTsKICAgIGluaXRfY2xvdWRfbW9vbigpOwogICAgaW5pdF9jbG91ZF9vZmYoKTsKICAgIGluaXRfY2xvdWRfcmFpbl93aW5kKCk7CiAgICBpbml0X2Nsb3VkX3JhaW4oKTsKICAgIGluaXRfY2xvdWRfc25vdygpOwogICAgaW5pdF9jbG91ZF9zdW5fcmFpbigpOwogICAgaW5pdF9jbG91ZF9zeW5jKCk7CiAgICBpbml0X2Nsb3VkX3N1bigpOwogICAgaW5pdF9jbG91ZCgpOwogICAgaW5pdF9jbG91ZF91cGxvYWQoKTsKICAgIGluaXRfY2xvdWR5KCk7CiAgICBpbml0X2Nsb3ZlcigpOwogICAgaW5pdF9jbHViKCk7CiAgICBpbml0X2NvZGVfeG1sKCk7CiAgICBpbml0X2NvZGU0KCk7CiAgICBpbml0X2NvZGVwZW4oKTsKICAgIGluaXRfY29kZXNhbmRib3goKTsKICAgIGluaXRfY29mZmVlKCk7CiAgICBpbml0X2NvZygpOwogICAgaW5pdF9jb2lucygpOwogICAgaW5pdF9jb2x1bW5zXzIoKTsKICAgIGluaXRfY29sdW1uc18zX2NvZygpOwogICAgaW5pdF9jb2x1bW5zXzMoKTsKICAgIGluaXRfY29sdW1uc180KCk7CiAgICBpbml0X2NvbWJpbmUoKTsKICAgIGluaXRfY29tbWFuZCgpOwogICAgaW5pdF9jb21wYXNzKCk7CiAgICBpbml0X2NvbXBvbmVudCgpOwogICAgaW5pdF9jb25jaWVyZ2VfYmVsbCgpOwogICAgaW5pdF9jb21wdXRlcigpOwogICAgaW5pdF9jb25lKCk7CiAgICBpbml0X2NvbnN0cnVjdGlvbigpOwogICAgaW5pdF9jb250YWN0X3JvdW5kKCk7CiAgICBpbml0X2NvbnRhY3QyKCk7CiAgICBpbml0X2NvbnRhaW5lcjMoKTsKICAgIGluaXRfY29udHJhc3QoKTsKICAgIGluaXRfY29va2llKCk7CiAgICBpbml0X2Nvb2tpbmdfcG90KCk7CiAgICBpbml0X2NvcHlfY2hlY2soKTsKICAgIGluaXRfY29weV9taW51cygpOwogICAgaW5pdF9jb3B5X3BsdXMoKTsKICAgIGluaXRfY29weV9zbGFzaCgpOwogICAgaW5pdF9jb3B5X3goKTsKICAgIGluaXRfY29weSgpOwogICAgaW5pdF9jb3B5bGVmdCgpOwogICAgaW5pdF9jb3B5cmlnaHQoKTsKICAgIGluaXRfY29ybmVyX2Rvd25fbGVmdCgpOwogICAgaW5pdF9jb3JuZXJfZG93bl9yaWdodCgpOwogICAgaW5pdF9jb3JuZXJfbGVmdF9kb3duKCk7CiAgICBpbml0X2Nvcm5lcl9sZWZ0X3VwKCk7CiAgICBpbml0X2Nvcm5lcl9yaWdodF9kb3duKCk7CiAgICBpbml0X2Nvcm5lcl9yaWdodF91cCgpOwogICAgaW5pdF9jb3JuZXJfdXBfbGVmdCgpOwogICAgaW5pdF9jcHUoKTsKICAgIGluaXRfY29ybmVyX3VwX3JpZ2h0KCk7CiAgICBpbml0X2NyZWF0aXZlX2NvbW1vbnMoKTsKICAgIGluaXRfY3JlZGl0X2NhcmQoKTsKICAgIGluaXRfY3JvaXNzYW50KCk7CiAgICBpbml0X2Nyb3AoKTsKICAgIGluaXRfY3Jvc3MoKTsKICAgIGluaXRfY3Jvc3NoYWlyKCk7CiAgICBpbml0X2Nyb3duKCk7CiAgICBpbml0X2N1cF9zb2RhKCk7CiAgICBpbml0X2N1Ym9pZCgpOwogICAgaW5pdF9jdXJyZW5jeTIoKTsKICAgIGluaXRfY3lsaW5kZXIoKTsKICAgIGluaXRfZGFtKCk7CiAgICBpbml0X2RhdGFiYXNlX2JhY2t1cCgpOwogICAgaW5pdF9kYXRhYmFzZV96YXAoKTsKICAgIGluaXRfZGF0YWJhc2Vfc2VhcmNoKCk7CiAgICBpbml0X2RlY2ltYWxzX2Fycm93X2xlZnQoKTsKICAgIGluaXRfZGF0YWJhc2UyKCk7CiAgICBpbml0X2RlY2ltYWxzX2Fycm93X3JpZ2h0KCk7CiAgICBpbml0X2RlbGV0ZTIoKTsKICAgIGluaXRfZGlhbWV0ZXIoKTsKICAgIGluaXRfZGVzc2VydCgpOwogICAgaW5pdF9kaWFtb25kX21pbnVzKCk7CiAgICBpbml0X2RpYW1vbmRfcGVyY2VudCgpOwogICAgaW5pdF9kaWFtb25kX3BsdXMoKTsKICAgIGluaXRfZGlhbW9uZCgpOwogICAgaW5pdF9kaWNlXzEoKTsKICAgIGluaXRfZGljZV8yKCk7CiAgICBpbml0X2RpY2VfMygpOwogICAgaW5pdF9kaWNlXzQoKTsKICAgIGluaXRfZGljZV81KCk7CiAgICBpbml0X2RpY2VfNigpOwogICAgaW5pdF9kaWNlcygpOwogICAgaW5pdF9kaWZmKCk7CiAgICBpbml0X2Rpc2NfMigpOwogICAgaW5pdF9kaXNjX2FsYnVtKCk7CiAgICBpbml0X2Rpc2NfMygpOwogICAgaW5pdF9kaXNjKCk7CiAgICBpbml0X2RpdmlkZSgpOwogICAgaW5pdF9kbmFfb2ZmKCk7CiAgICBpbml0X2RvY2soKTsKICAgIGluaXRfZG5hKCk7CiAgICBpbml0X2RvZygpOwogICAgaW5pdF9kb2xsYXJfc2lnbigpOwogICAgaW5pdF9kb251dCgpOwogICAgaW5pdF9kb29yX2Nsb3NlZCgpOwogICAgaW5pdF9kb29yX2Nsb3NlZF9sb2NrZWQoKTsKICAgIGluaXRfZG9vcl9vcGVuKCk7CiAgICBpbml0X2RvdCgpOwogICAgaW5pdF9kb3dubG9hZCgpOwogICAgaW5pdF9kcmFtYSgpOwogICAgaW5pdF9kcmFmdGluZ19jb21wYXNzKCk7CiAgICBpbml0X2RyaWJiYmxlKCk7CiAgICBpbml0X2RyaWxsKCk7CiAgICBpbml0X2Ryb25lKCk7CiAgICBpbml0X2Ryb3BsZXQoKTsKICAgIGluaXRfZHJvcGxldF9vZmYoKTsKICAgIGluaXRfZHJvcGxldHMoKTsKICAgIGluaXRfZHJ1bSgpOwogICAgaW5pdF9kcnVtc3RpY2soKTsKICAgIGluaXRfZHVtYmJlbGwoKTsKICAgIGluaXRfZWFyX29mZigpOwogICAgaW5pdF9lYXIoKTsKICAgIGluaXRfZWFydGgoKTsKICAgIGluaXRfZWFydGhfbG9jaygpOwogICAgaW5pdF9lY2xpcHNlKCk7CiAgICBpbml0X2VnZ19vZmYoKTsKICAgIGluaXRfZWdnX2ZyaWVkKCk7CiAgICBpbml0X2VnZygpOwogICAgaW5pdF9lbGxpcHNlKCk7CiAgICBpbml0X2VsbGlwc2lzX3ZlcnRpY2FsKCk7CiAgICBpbml0X2VsbGlwc2lzKCk7CiAgICBpbml0X2VxdWFsX2FwcHJveGltYXRlbHkoKTsKICAgIGluaXRfZXF1YWxfbm90KCk7CiAgICBpbml0X2VxdWFsKCk7CiAgICBpbml0X2VyYXNlcigpOwogICAgaW5pdF9ldGhlcm5ldF9wb3J0KCk7CiAgICBpbml0X2V1cm8oKTsKICAgIGluaXRfZXhwYW5kMigpOwogICAgaW5pdF9ldl9jaGFyZ2VyKCk7CiAgICBpbml0X2V4dGVybmFsX2xpbmsoKTsKICAgIGluaXRfZXllX29mZigpOwogICAgaW5pdF9leWVfY2xvc2VkKCk7CiAgICBpbml0X2V5ZSgpOwogICAgaW5pdF9mYWNlYm9vaygpOwogICAgaW5pdF9mYWN0b3J5KCk7CiAgICBpbml0X2ZhbigpOwogICAgaW5pdF9mYXN0X2ZvcndhcmQoKTsKICAgIGluaXRfZmVhdGhlcigpOwogICAgaW5pdF9mZW5jZSgpOwogICAgaW5pdF9mZXJyaXNfd2hlZWwoKTsKICAgIGluaXRfZmlnbWEoKTsKICAgIGluaXRfZmlsZV9hcmNoaXZlKCk7CiAgICBpbml0X2ZpbGVfYXhpc18zZCgpOwogICAgaW5pdF9maWxlX2JhZGdlKCk7CiAgICBpbml0X2ZpbGVfYm94KCk7CiAgICBpbml0X2ZpbGVfYnJhY2VzX2Nvcm5lcigpOwogICAgaW5pdF9maWxlX2JyYWNlcygpOwogICAgaW5pdF9maWxlX2NoYXJ0X2NvbHVtbl9pbmNyZWFzaW5nKCk7CiAgICBpbml0X2ZpbGVfY2hhcnRfY29sdW1uKCk7CiAgICBpbml0X2ZpbGVfY2hhcnRfbGluZSgpOwogICAgaW5pdF9maWxlX2NoYXJ0X3BpZSgpOwogICAgaW5pdF9maWxlX2NoZWNrX2Nvcm5lcigpOwogICAgaW5pdF9maWxlX2NoZWNrKCk7CiAgICBpbml0X2ZpbGVfY29kZV9jb3JuZXIoKTsKICAgIGluaXRfZmlsZV9jbG9jaygpOwogICAgaW5pdF9maWxlX2NvZGUoKTsKICAgIGluaXRfZmlsZV9jb2coKTsKICAgIGluaXRfZmlsZV9kaWdpdCgpOwogICAgaW5pdF9maWxlX2RpZmYoKTsKICAgIGluaXRfZmlsZV9kb3duKCk7CiAgICBpbml0X2ZpbGVfZXhjbGFtYXRpb25fcG9pbnQoKTsKICAgIGluaXRfZmlsZV9oZWFkcGhvbmUoKTsKICAgIGluaXRfZmlsZV9oZWFydCgpOwogICAgaW5pdF9maWxlX2ltYWdlKCk7CiAgICBpbml0X2ZpbGVfaW5wdXQoKTsKICAgIGluaXRfZmlsZV9sb2NrKCk7CiAgICBpbml0X2ZpbGVfa2V5KCk7CiAgICBpbml0X2ZpbGVfbWludXNfY29ybmVyKCk7CiAgICBpbml0X2ZpbGVfbWludXMoKTsKICAgIGluaXRfZmlsZV9tdXNpYygpOwogICAgaW5pdF9maWxlX291dHB1dCgpOwogICAgaW5pdF9maWxlX3Blbl9saW5lKCk7CiAgICBpbml0X2ZpbGVfcGVuKCk7CiAgICBpbml0X2ZpbGVfcGxheSgpOwogICAgaW5pdF9maWxlX3BsdXNfY29ybmVyKCk7CiAgICBpbml0X2ZpbGVfcGx1cygpOwogICAgaW5pdF9maWxlX3F1ZXN0aW9uX21hcmsoKTsKICAgIGluaXRfZmlsZV9zY2FuKCk7CiAgICBpbml0X2ZpbGVfc2VhcmNoX2Nvcm5lcigpOwogICAgaW5pdF9maWxlX3NlYXJjaCgpOwogICAgaW5pdF9maWxlX3NpZ25hbCgpOwogICAgaW5pdF9maWxlX3NsaWRlcnMoKTsKICAgIGluaXRfZmlsZV9zcHJlYWRzaGVldCgpOwogICAgaW5pdF9maWxlX3N0YWNrKCk7CiAgICBpbml0X2ZpbGVfc3ltbGluaygpOwogICAgaW5pdF9maWxlX3RleHQoKTsKICAgIGluaXRfZmlsZV90eXBlKCk7CiAgICBpbml0X2ZpbGVfdGVybWluYWwoKTsKICAgIGluaXRfZmlsZV90eXBlX2Nvcm5lcigpOwogICAgaW5pdF9maWxlX3VwKCk7CiAgICBpbml0X2ZpbGVfdXNlcigpOwogICAgaW5pdF9maWxlX3ZpZGVvX2NhbWVyYSgpOwogICAgaW5pdF9maWxlX3hfY29ybmVyKCk7CiAgICBpbml0X2ZpbGVfdm9sdW1lKCk7CiAgICBpbml0X2ZpbGVfeCgpOwogICAgaW5pdF9maWxlKCk7CiAgICBpbml0X2ZpbGVzKCk7CiAgICBpbml0X2ZpbG0oKTsKICAgIGluaXRfZmluZ2VycHJpbnRfcGF0dGVybigpOwogICAgaW5pdF9maXJlX2V4dGluZ3Vpc2hlcigpOwogICAgaW5pdF9maXNoX29mZigpOwogICAgaW5pdF9maXNoX3N5bWJvbCgpOwogICAgaW5pdF9maXNoKCk7CiAgICBpbml0X2Zpc2hpbmdfaG9vaygpOwogICAgaW5pdF9maXNoaW5nX3JvZCgpOwogICAgaW5pdF9mbGFnX3RyaWFuZ2xlX2xlZnQoKTsKICAgIGluaXRfZmxhZ19vZmYoKTsKICAgIGluaXRfZmxhZ190cmlhbmdsZV9yaWdodCgpOwogICAgaW5pdF9mbGFnKCk7CiAgICBpbml0X2ZsYW1lX2tpbmRsaW5nKCk7CiAgICBpbml0X2ZsYW1lKCk7CiAgICBpbml0X2ZsYXNobGlnaHRfb2ZmKCk7CiAgICBpbml0X2ZsYXNobGlnaHQoKTsKICAgIGluaXRfZmxhc2tfY29uaWNhbCgpOwogICAgaW5pdF9mbGFza19jb25pY2FsX29mZigpOwogICAgaW5pdF9mbGFza19yb3VuZCgpOwogICAgaW5pdF9mbGlwX2hvcml6b250YWxfMigpOwogICAgaW5pdF9mbGlwX3ZlcnRpY2FsXzIoKTsKICAgIGluaXRfZmxvd2VyXzIoKTsKICAgIGluaXRfZmxvd2VyKCk7CiAgICBpbml0X2ZvY3VzKCk7CiAgICBpbml0X2ZvbGRfaG9yaXpvbnRhbCgpOwogICAgaW5pdF9mb2xkX3ZlcnRpY2FsKCk7CiAgICBpbml0X2ZvbGRlcl9hcmNoaXZlKCk7CiAgICBpbml0X2ZvbGRlcl9jaGVjaygpOwogICAgaW5pdF9mb2xkZXJfY2xvY2soKTsKICAgIGluaXRfZm9sZGVyX2Nsb3NlZCgpOwogICAgaW5pdF9mb2xkZXJfY29kZSgpOwogICAgaW5pdF9mb2xkZXJfY29nKCk7CiAgICBpbml0X2ZvbGRlcl9kb3QoKTsKICAgIGluaXRfZm9sZGVyX2Rvd24oKTsKICAgIGluaXRfZm9sZGVyX2dpdF8yKCk7CiAgICBpbml0X2ZvbGRlcl9naXQoKTsKICAgIGluaXRfZm9sZGVyX2hlYXJ0KCk7CiAgICBpbml0X2ZvbGRlcl9pbnB1dCgpOwogICAgaW5pdF9mb2xkZXJfa2FuYmFuKCk7CiAgICBpbml0X2ZvbGRlcl9rZXkoKTsKICAgIGluaXRfZm9sZGVyX2xvY2soKTsKICAgIGluaXRfZm9sZGVyX21pbnVzKCk7CiAgICBpbml0X2ZvbGRlcl9vcGVuX2RvdCgpOwogICAgaW5pdF9mb2xkZXJfb3BlbigpOwogICAgaW5pdF9mb2xkZXJfcGVuKCk7CiAgICBpbml0X2ZvbGRlcl9vdXRwdXQoKTsKICAgIGluaXRfZm9sZGVyX3BsdXMoKTsKICAgIGluaXRfZm9sZGVyX3Jvb3QoKTsKICAgIGluaXRfZm9sZGVyX3NlYXJjaF8yKCk7CiAgICBpbml0X2ZvbGRlcl9zZWFyY2goKTsKICAgIGluaXRfZm9sZGVyX3N5bWxpbmsoKTsKICAgIGluaXRfZm9sZGVyX3N5bmMoKTsKICAgIGluaXRfZm9sZGVyX3RyZWUoKTsKICAgIGluaXRfZm9sZGVyX3VwKCk7CiAgICBpbml0X2ZvbGRlcl94KCk7CiAgICBpbml0X2ZvbGRlcigpOwogICAgaW5pdF9mb2xkZXJzKCk7CiAgICBpbml0X2Zvb3RwcmludHMoKTsKICAgIGluaXRfZm9ybSgpOwogICAgaW5pdF9mb3JrbGlmdCgpOwogICAgaW5pdF9mcmFtZSgpOwogICAgaW5pdF9mb3J3YXJkKCk7CiAgICBpbml0X2ZyYW1lcigpOwogICAgaW5pdF9mcm93bigpOwogICAgaW5pdF9mdWVsKCk7CiAgICBpbml0X2Z1bGxzY3JlZW4oKTsKICAgIGluaXRfZnVubmVsX3BsdXMoKTsKICAgIGluaXRfZnVubmVsX3goKTsKICAgIGluaXRfZnVubmVsKCk7CiAgICBpbml0X2dhbGxlcnlfaG9yaXpvbnRhbF9lbmQoKTsKICAgIGluaXRfZ2FsbGVyeV9ob3Jpem9udGFsKCk7CiAgICBpbml0X2dhbGxlcnlfdGh1bWJuYWlscygpOwogICAgaW5pdF9nYWxsZXJ5X3ZlcnRpY2FsX2VuZCgpOwogICAgaW5pdF9nYWxsZXJ5X3ZlcnRpY2FsKCk7CiAgICBpbml0X2dhbWVwYWRfMigpOwogICAgaW5pdF9nYW1lcGFkX2RpcmVjdGlvbmFsKCk7CiAgICBpbml0X2dhbWVwYWQoKTsKICAgIGluaXRfZ2F1Z2UoKTsKICAgIGluaXRfZ2F2ZWwoKTsKICAgIGluaXRfZ2VvcmdpYW5fbGFyaSgpOwogICAgaW5pdF9nZW0oKTsKICAgIGluaXRfZ2hvc3QoKTsKICAgIGluaXRfZ2lmdCgpOwogICAgaW5pdF9naXRfYnJhbmNoX21pbnVzKCk7CiAgICBpbml0X2dpdF9icmFuY2hfcGx1cygpOwogICAgaW5pdF9naXRfYnJhbmNoKCk7CiAgICBpbml0X2dpdF9jb21taXRfaG9yaXpvbnRhbCgpOwogICAgaW5pdF9naXRfY29tbWl0X3ZlcnRpY2FsKCk7CiAgICBpbml0X2dpdF9jb21wYXJlX2Fycm93cygpOwogICAgaW5pdF9naXRfY29tcGFyZSgpOwogICAgaW5pdF9naXRfZ3JhcGgoKTsKICAgIGluaXRfZ2l0X2ZvcmsoKTsKICAgIGluaXRfZ2l0X21lcmdlX2NvbmZsaWN0KCk7CiAgICBpbml0X2dpdF9tZXJnZSgpOwogICAgaW5pdF9naXRfcHVsbF9yZXF1ZXN0X2Fycm93KCk7CiAgICBpbml0X2dpdF9wdWxsX3JlcXVlc3RfY2xvc2VkKCk7CiAgICBpbml0X2dpdF9wdWxsX3JlcXVlc3RfY3JlYXRlX2Fycm93KCk7CiAgICBpbml0X2dpdF9wdWxsX3JlcXVlc3RfY3JlYXRlKCk7CiAgICBpbml0X2dpdF9wdWxsX3JlcXVlc3RfZHJhZnQoKTsKICAgIGluaXRfZ2l0X3B1bGxfcmVxdWVzdCgpOwogICAgaW5pdF9naXRodWIoKTsKICAgIGluaXRfZ2l0bGFiKCk7CiAgICBpbml0X2dsYXNzX3dhdGVyKCk7CiAgICBpbml0X2dsb2JlX2xvY2soKTsKICAgIGluaXRfZ2xhc3NlcygpOwogICAgaW5pdF9nbG9iZV94KCk7CiAgICBpbml0X2dsb2JlX29mZigpOwogICAgaW5pdF9nbG9iZSgpOwogICAgaW5pdF9nb2FsKCk7CiAgICBpbml0X2dwdSgpOwogICAgaW5pdF9ncmFkdWF0aW9uX2NhcCgpOwogICAgaW5pdF9ncmlkXzJ4Ml9jaGVjaygpOwogICAgaW5pdF9ncmlkXzJ4Ml9wbHVzKCk7CiAgICBpbml0X2dyYXBlKCk7CiAgICBpbml0X2dyaWRfMngyX3goKTsKICAgIGluaXRfZ3JpZF8yeDIoKTsKICAgIGluaXRfZ3JpZF8zeDIoKTsKICAgIGluaXRfZ3JpZF8zeDMoKTsKICAgIGluaXRfZ3JpcF9ob3Jpem9udGFsKCk7CiAgICBpbml0X2dyaXBfdmVydGljYWwoKTsKICAgIGluaXRfZ3JpcCgpOwogICAgaW5pdF9ncm91cCgpOwogICAgaW5pdF9ndWl0YXIoKTsKICAgIGluaXRfaGFtKCk7CiAgICBpbml0X2hhbWJ1cmdlcigpOwogICAgaW5pdF9oYW1tZXIoKTsKICAgIGluaXRfaGFuZF9jb2lucygpOwogICAgaW5pdF9oYW5kX2Zpc3QoKTsKICAgIGluaXRfaGFuZF9ncmFiKCk7CiAgICBpbml0X2hhbmRfaGVhcnQoKTsKICAgIGluaXRfaGFuZF9oZWxwaW5nKCk7CiAgICBpbml0X2hhbmRfbWV0YWwoKTsKICAgIGluaXRfaGFuZF9wbGF0dGVyKCk7CiAgICBpbml0X2hhbmRiYWcoKTsKICAgIGluaXRfaGFuZCgpOwogICAgaW5pdF9oYXJkX2RyaXZlX2Rvd25sb2FkKCk7CiAgICBpbml0X2hhcmRfZHJpdmUoKTsKICAgIGluaXRfaGFuZHNoYWtlKCk7CiAgICBpbml0X2hhcmRfZHJpdmVfdXBsb2FkKCk7CiAgICBpbml0X2hhcmRfaGF0KCk7CiAgICBpbml0X2hhc2goKTsKICAgIGluaXRfaGF0X2dsYXNzZXMoKTsKICAgIGluaXRfaGF6ZSgpOwogICAgaW5pdF9oZCgpOwogICAgaW5pdF9oZG1pX3BvcnQoKTsKICAgIGluaXRfaGVhZGluZ18xKCk7CiAgICBpbml0X2hlYWRpbmdfMigpOwogICAgaW5pdF9oZWFkaW5nXzMoKTsKICAgIGluaXRfaGVhZGluZ180KCk7CiAgICBpbml0X2hlYWRpbmdfNSgpOwogICAgaW5pdF9oZWFkaW5nMygpOwogICAgaW5pdF9oZWFkaW5nXzYoKTsKICAgIGluaXRfaGVhZHBob25lcygpOwogICAgaW5pdF9oZWFkcGhvbmVfb2ZmKCk7CiAgICBpbml0X2hlYWRzZXQoKTsKICAgIGluaXRfaGVhcnRfaGFuZHNoYWtlKCk7CiAgICBpbml0X2hlYXJ0X2NyYWNrKCk7CiAgICBpbml0X2hlYXJ0X29mZigpOwogICAgaW5pdF9oZWFydF9taW51cygpOwogICAgaW5pdF9oZWFydF9wbHVzKCk7CiAgICBpbml0X2hlYXJ0X3B1bHNlKCk7CiAgICBpbml0X2hlYXJ0KCk7CiAgICBpbml0X2hlYXRlcigpOwogICAgaW5pdF9oZWxpY29wdGVyKCk7CiAgICBpbml0X2hleGFnb24oKTsKICAgIGluaXRfaGlnaGxpZ2h0ZXIoKTsKICAgIGluaXRfaGlzdG9yeSgpOwogICAgaW5pdF9ob3Bfb2ZmKCk7CiAgICBpbml0X2hvc3BpdGFsKCk7CiAgICBpbml0X2hvcCgpOwogICAgaW5pdF9ob3RlbCgpOwogICAgaW5pdF9ob3VyZ2xhc3MoKTsKICAgIGluaXRfaG91c2VfaGVhcnQoKTsKICAgIGluaXRfaG91c2VfcGx1cygpOwogICAgaW5pdF9ob3VzZV9wbHVnKCk7CiAgICBpbml0X2hvdXNlX3dpZmkoKTsKICAgIGluaXRfaWNlX2NyZWFtX2Jvd2woKTsKICAgIGluaXRfaG91c2UoKTsKICAgIGluaXRfaWNlX2NyZWFtX2NvbmUoKTsKICAgIGluaXRfaWRfY2FyZCgpOwogICAgaW5pdF9pZF9jYXJkX2xhbnlhcmQoKTsKICAgIGluaXRfaW1hZ2VfZG93bigpOwogICAgaW5pdF9pbWFnZV9taW51cygpOwogICAgaW5pdF9pbWFnZV9vZmYoKTsKICAgIGluaXRfaW1hZ2VfcGxheSgpOwogICAgaW5pdF9pbWFnZV9wbHVzKCk7CiAgICBpbml0X2ltYWdlX3VwKCk7CiAgICBpbml0X2ltYWdlX3Vwc2NhbGUoKTsKICAgIGluaXRfaW1hZ2UzKCk7CiAgICBpbml0X2ltYWdlcygpOwogICAgaW5pdF9pbXBvcnQoKTsKICAgIGluaXRfaW5ib3goKTsKICAgIGluaXRfaW5maW5pdHkoKTsKICAgIGluaXRfaW5kaWFuX3J1cGVlKCk7CiAgICBpbml0X2luZm8yKCk7CiAgICBpbml0X2luc3BlY3Rpb25fcGFuZWwoKTsKICAgIGluaXRfaW5zdGFncmFtKCk7CiAgICBpbml0X2l0YWxpYygpOwogICAgaW5pdF9pdGVyYXRpb25fY3coKTsKICAgIGluaXRfaXRlcmF0aW9uX2NjdygpOwogICAgaW5pdF9qb3lzdGljaygpOwogICAgaW5pdF9qYXBhbmVzZV95ZW4oKTsKICAgIGluaXRfa2FuYmFuKCk7CiAgICBpbml0X2theWFrKCk7CiAgICBpbml0X2tleV9zcXVhcmUoKTsKICAgIGluaXRfa2V5X3JvdW5kKCk7CiAgICBpbml0X2tleSgpOwogICAgaW5pdF9rZXlib2FyZF9vZmYoKTsKICAgIGluaXRfa2V5Ym9hcmQoKTsKICAgIGluaXRfa2V5Ym9hcmRfbXVzaWMoKTsKICAgIGluaXRfbGFtcF9jZWlsaW5nKCk7CiAgICBpbml0X2xhbXBfZGVzaygpOwogICAgaW5pdF9sYW1wX2Zsb29yKCk7CiAgICBpbml0X2xhbXBfd2FsbF9kb3duKCk7CiAgICBpbml0X2xhbXBfd2FsbF91cCgpOwogICAgaW5pdF9sYW5kX3Bsb3QoKTsKICAgIGluaXRfbGFtcCgpOwogICAgaW5pdF9sYW5kbWFyaygpOwogICAgaW5pdF9sYW5ndWFnZXMoKTsKICAgIGluaXRfbGFwdG9wX21pbmltYWxfY2hlY2soKTsKICAgIGluaXRfbGFwdG9wX21pbmltYWwoKTsKICAgIGluaXRfbGFwdG9wKCk7CiAgICBpbml0X2xhc3NvX3NlbGVjdCgpOwogICAgaW5pdF9sYXNzbygpOwogICAgaW5pdF9sYXVnaCgpOwogICAgaW5pdF9sYXllcnNfMigpOwogICAgaW5pdF9sYXllcnNfcGx1cygpOwogICAgaW5pdF9sYXllcnMoKTsKICAgIGluaXRfbGF5b3V0X2dyaWQoKTsKICAgIGluaXRfbGF5b3V0X2Rhc2hib2FyZCgpOwogICAgaW5pdF9sYXlvdXRfbGlzdCgpOwogICAgaW5pdF9sYXlvdXRfcGFuZWxfbGVmdCgpOwogICAgaW5pdF9sYXlvdXRfcGFuZWxfdG9wKCk7CiAgICBpbml0X2xheW91dF90ZW1wbGF0ZSgpOwogICAgaW5pdF9sZWFmeV9ncmVlbigpOwogICAgaW5pdF9sZWN0ZXJuKCk7CiAgICBpbml0X2xlYWYoKTsKICAgIGluaXRfbGVuc19jb25jYXZlKCk7CiAgICBpbml0X2xlbnNfY29udmV4KCk7CiAgICBpbml0X2xpYnJhcnlfYmlnKCk7CiAgICBpbml0X2xpYnJhcnkoKTsKICAgIGluaXRfbGlmZV9idW95KCk7CiAgICBpbml0X2xpZ2F0dXJlKCk7CiAgICBpbml0X2xpZ2h0YnVsYigpOwogICAgaW5pdF9saW5lX2RvdF9yaWdodF9ob3Jpem9udGFsKCk7CiAgICBpbml0X2xpZ2h0YnVsYl9vZmYoKTsKICAgIGluaXRfbGluZV9zcXVpZ2dsZSgpOwogICAgaW5pdF9saW5rXzJfb2ZmKCk7CiAgICBpbml0X2xpbmtfMigpOwogICAgaW5pdF9saW5rNCgpOwogICAgaW5pdF9saW5rZWRpbigpOwogICAgaW5pdF9saXN0X2NoZWNrKCk7CiAgICBpbml0X2xpc3RfY2hlY2tzKCk7CiAgICBpbml0X2xpc3RfY2hldnJvbnNfZG93bl91cCgpOwogICAgaW5pdF9saXN0X2NvbGxhcHNlKCk7CiAgICBpbml0X2xpc3RfY2hldnJvbnNfdXBfZG93bigpOwogICAgaW5pdF9saXN0X2VuZCgpOwogICAgaW5pdF9saXN0X2ZpbHRlcl9wbHVzKCk7CiAgICBpbml0X2xpc3RfZmlsdGVyKCk7CiAgICBpbml0X2xpc3RfaW5kZW50X2RlY3JlYXNlKCk7CiAgICBpbml0X2xpc3RfaW5kZW50X2luY3JlYXNlKCk7CiAgICBpbml0X2xpc3RfbXVzaWMoKTsKICAgIGluaXRfbGlzdF9taW51cygpOwogICAgaW5pdF9saXN0X29yZGVyZWQoKTsKICAgIGluaXRfbGlzdF9yZXN0YXJ0KCk7CiAgICBpbml0X2xpc3RfcGx1cygpOwogICAgaW5pdF9saXN0X3N0YXJ0KCk7CiAgICBpbml0X2xpc3RfdG9kbygpOwogICAgaW5pdF9saXN0X3RyZWUoKTsKICAgIGluaXRfbGlzdF92aWRlbygpOwogICAgaW5pdF9saXN0X3goKTsKICAgIGluaXRfbGlzdDQoKTsKICAgIGluaXRfbG9hZGVyX2NpcmNsZSgpOwogICAgaW5pdF9sb2FkZXJfcGlud2hlZWwoKTsKICAgIGluaXRfbG9hZGVyKCk7CiAgICBpbml0X2xvY2F0ZV9maXhlZCgpOwogICAgaW5pdF9sb2NhdGVfb2ZmKCk7CiAgICBpbml0X2xvY2F0ZSgpOwogICAgaW5pdF9sb2NrX2tleWhvbGVfb3BlbigpOwogICAgaW5pdF9sb2NrX2tleWhvbGUoKTsKICAgIGluaXRfbG9ja19vcGVuKCk7CiAgICBpbml0X2xvZ19pbigpOwogICAgaW5pdF9sb2NrKCk7CiAgICBpbml0X2xvZ19vdXQoKTsKICAgIGluaXRfbG9ncygpOwogICAgaW5pdF9sb2xsaXBvcCgpOwogICAgaW5pdF9sdWdnYWdlKCk7CiAgICBpbml0X21hZ25ldCgpOwogICAgaW5pdF9tYWlsX2NoZWNrKCk7CiAgICBpbml0X21haWxfbWludXMoKTsKICAgIGluaXRfbWFpbF9vcGVuKCk7CiAgICBpbml0X21haWxfcGx1cygpOwogICAgaW5pdF9tYWlsX3F1ZXN0aW9uX21hcmsoKTsKICAgIGluaXRfbWFpbF9zZWFyY2goKTsKICAgIGluaXRfbWFpbF93YXJuaW5nKCk7CiAgICBpbml0X21haWxfeCgpOwogICAgaW5pdF9tYWlsKCk7CiAgICBpbml0X21haWxib3goKTsKICAgIGluaXRfbWFpbHMoKTsKICAgIGluaXRfbWFwX21pbnVzKCk7CiAgICBpbml0X21hcF9waW5fY2hlY2tfaW5zaWRlKCk7CiAgICBpbml0X21hcF9waW5faG91c2UoKTsKICAgIGluaXRfbWFwX3Bpbl9jaGVjaygpOwogICAgaW5pdF9tYXBfcGluX21pbnVzX2luc2lkZSgpOwogICAgaW5pdF9tYXBfcGluX21pbnVzKCk7CiAgICBpbml0X21hcF9waW5fb2ZmKCk7CiAgICBpbml0X21hcF9waW5fcGVuKCk7CiAgICBpbml0X21hcF9waW5fcGx1cygpOwogICAgaW5pdF9tYXBfcGluX3BsdXNfaW5zaWRlKCk7CiAgICBpbml0X21hcF9waW5feF9pbnNpZGUoKTsKICAgIGluaXRfbWFwX3Bpbl94KCk7CiAgICBpbml0X21hcF9waW4oKTsKICAgIGluaXRfbWFwX3Bpbm5lZCgpOwogICAgaW5pdF9tYXBfcGx1cygpOwogICAgaW5pdF9tYXJzX3N0cm9rZSgpOwogICAgaW5pdF9tYXAyKCk7CiAgICBpbml0X21hcnMoKTsKICAgIGluaXRfbWFydGluaSgpOwogICAgaW5pdF9tYXhpbWl6ZV8yKCk7CiAgICBpbml0X21heGltaXplKCk7CiAgICBpbml0X21lZ2FwaG9uZV9vZmYoKTsKICAgIGluaXRfbWVkYWwoKTsKICAgIGluaXRfbWVnYXBob25lKCk7CiAgICBpbml0X21laCgpOwogICAgaW5pdF9tZW51KCk7CiAgICBpbml0X21lbW9yeV9zdGljaygpOwogICAgaW5pdF9tZXJnZTQoKTsKICAgIGluaXRfbWVzc2FnZV9jaXJjbGVfY2hlY2soKTsKICAgIGluaXRfbWVzc2FnZV9jaXJjbGVfY29kZSgpOwogICAgaW5pdF9tZXNzYWdlX2NpcmNsZV9kYXNoZWQoKTsKICAgIGluaXRfbWVzc2FnZV9jaXJjbGVfaGVhcnQoKTsKICAgIGluaXRfbWVzc2FnZV9jaXJjbGVfbW9yZSgpOwogICAgaW5pdF9tZXNzYWdlX2NpcmNsZV9vZmYoKTsKICAgIGluaXRfbWVzc2FnZV9jaXJjbGVfcGx1cygpOwogICAgaW5pdF9tZXNzYWdlX2NpcmNsZV9xdWVzdGlvbl9tYXJrKCk7CiAgICBpbml0X21lc3NhZ2VfY2lyY2xlX3JlcGx5KCk7CiAgICBpbml0X21lc3NhZ2VfY2lyY2xlX3dhcm5pbmcoKTsKICAgIGluaXRfbWVzc2FnZV9jaXJjbGVfeCgpOwogICAgaW5pdF9tZXNzYWdlX2NpcmNsZSgpOwogICAgaW5pdF9tZXNzYWdlX3NxdWFyZV9jaGVjaygpOwogICAgaW5pdF9tZXNzYWdlX3NxdWFyZV9jb2RlKCk7CiAgICBpbml0X21lc3NhZ2Vfc3F1YXJlX2Rhc2hlZCgpOwogICAgaW5pdF9tZXNzYWdlX3NxdWFyZV9kaWZmKCk7CiAgICBpbml0X21lc3NhZ2Vfc3F1YXJlX2RvdCgpOwogICAgaW5pdF9tZXNzYWdlX3NxdWFyZV9oZWFydCgpOwogICAgaW5pdF9tZXNzYWdlX3NxdWFyZV9sb2NrKCk7CiAgICBpbml0X21lc3NhZ2Vfc3F1YXJlX21vcmUoKTsKICAgIGluaXRfbWVzc2FnZV9zcXVhcmVfb2ZmKCk7CiAgICBpbml0X21lc3NhZ2Vfc3F1YXJlX3BsdXMoKTsKICAgIGluaXRfbWVzc2FnZV9zcXVhcmVfcXVvdGUoKTsKICAgIGluaXRfbWVzc2FnZV9zcXVhcmVfcmVwbHkoKTsKICAgIGluaXRfbWVzc2FnZV9zcXVhcmVfc2hhcmUoKTsKICAgIGluaXRfbWVzc2FnZV9zcXVhcmVfdGV4dCgpOwogICAgaW5pdF9tZXNzYWdlX3NxdWFyZV93YXJuaW5nKCk7CiAgICBpbml0X21lc3NhZ2Vfc3F1YXJlX3goKTsKICAgIGluaXRfbWVzc2FnZV9zcXVhcmUoKTsKICAgIGluaXRfbWVzc2FnZXNfc3F1YXJlKCk7CiAgICBpbml0X21ldHJvbm9tZSgpOwogICAgaW5pdF9taWNfb2ZmKCk7CiAgICBpbml0X21pY192b2NhbCgpOwogICAgaW5pdF9taWMoKTsKICAgIGluaXRfbWljcm9jaGlwKCk7CiAgICBpbml0X21pY3Jvd2F2ZSgpOwogICAgaW5pdF9taWxlc3RvbmUoKTsKICAgIGluaXRfbWljcm9zY29wZSgpOwogICAgaW5pdF9taWxrX29mZigpOwogICAgaW5pdF9taW5pbWl6ZV8yKCk7CiAgICBpbml0X21pbGsoKTsKICAgIGluaXRfbWluaW1pemUoKTsKICAgIGluaXRfbWludXMoKTsKICAgIGluaXRfbWlycm9yX3JlY3Rhbmd1bGFyKCk7CiAgICBpbml0X21pcnJvcl9yb3VuZCgpOwogICAgaW5pdF9tb25pdG9yX2NoZWNrKCk7CiAgICBpbml0X21vbml0b3JfY2xvdWQoKTsKICAgIGluaXRfbW9uaXRvcl9jb2coKTsKICAgIGluaXRfbW9uaXRvcl9kb3QoKTsKICAgIGluaXRfbW9uaXRvcl9kb3duKCk7CiAgICBpbml0X21vbml0b3Jfb2ZmKCk7CiAgICBpbml0X21vbml0b3JfcGF1c2UoKTsKICAgIGluaXRfbW9uaXRvcl9wbGF5KCk7CiAgICBpbml0X21vbml0b3Jfc21hcnRwaG9uZSgpOwogICAgaW5pdF9tb25pdG9yX3NwZWFrZXIoKTsKICAgIGluaXRfbW9uaXRvcl9zdG9wKCk7CiAgICBpbml0X21vbml0b3JfdXAoKTsKICAgIGluaXRfbW9uaXRvcl94KCk7CiAgICBpbml0X21vbml0b3IoKTsKICAgIGluaXRfbW9vbl9zdGFyKCk7CiAgICBpbml0X21vb24oKTsKICAgIGluaXRfbW90b3JiaWtlKCk7CiAgICBpbml0X21vdW50YWluX3Nub3coKTsKICAgIGluaXRfbW91bnRhaW4oKTsKICAgIGluaXRfbW91c2VfbGVmdCgpOwogICAgaW5pdF9tb3VzZV9vZmYoKTsKICAgIGluaXRfbW91c2VfcG9pbnRlcl8yX29mZigpOwogICAgaW5pdF9tb3VzZV9wb2ludGVyXzIoKTsKICAgIGluaXRfbW91c2VfcG9pbnRlcl9iYW4oKTsKICAgIGluaXRfbW91c2VfcG9pbnRlcl9jbGljaygpOwogICAgaW5pdF9tb3VzZV9wb2ludGVyKCk7CiAgICBpbml0X21vdXNlX3JpZ2h0KCk7CiAgICBpbml0X21vdmVfM2QoKTsKICAgIGluaXRfbW91c2UoKTsKICAgIGluaXRfbW92ZV9kaWFnb25hbF8yKCk7CiAgICBpbml0X21vdmVfZGlhZ29uYWwoKTsKICAgIGluaXRfbW92ZV9kb3duX3JpZ2h0KCk7CiAgICBpbml0X21vdmVfZG93bl9sZWZ0KCk7CiAgICBpbml0X21vdmVfZG93bigpOwogICAgaW5pdF9tb3ZlX2hvcml6b250YWwoKTsKICAgIGluaXRfbW92ZV9yaWdodCgpOwogICAgaW5pdF9tb3ZlX2xlZnQoKTsKICAgIGluaXRfbW92ZV91cF9sZWZ0KCk7CiAgICBpbml0X21vdmVfdXBfcmlnaHQoKTsKICAgIGluaXRfbW92ZV91cCgpOwogICAgaW5pdF9tb3ZlX3ZlcnRpY2FsKCk7CiAgICBpbml0X21vdmUoKTsKICAgIGluaXRfbXVzaWNfMigpOwogICAgaW5pdF9tdXNpY18zKCk7CiAgICBpbml0X211c2ljXzQoKTsKICAgIGluaXRfbXVzaWMoKTsKICAgIGluaXRfbmF2aWdhdGlvbl8yX29mZigpOwogICAgaW5pdF9uYXZpZ2F0aW9uXzIoKTsKICAgIGluaXRfbmF2aWdhdGlvbl9vZmYoKTsKICAgIGluaXRfbmF2aWdhdGlvbigpOwogICAgaW5pdF9uZXR3b3JrMigpOwogICAgaW5pdF9uZmMoKTsKICAgIGluaXRfbmV3c3BhcGVyKCk7CiAgICBpbml0X25vbl9iaW5hcnkoKTsKICAgIGluaXRfbm90ZWJvb2tfcGVuKCk7CiAgICBpbml0X25vdGVib29rX3RhYnMoKTsKICAgIGluaXRfbm90ZWJvb2tfdGV4dCgpOwogICAgaW5pdF9ub3RlcGFkX3RleHRfZGFzaGVkKCk7CiAgICBpbml0X25vdGVwYWRfdGV4dCgpOwogICAgaW5pdF9ub3RlYm9vaygpOwogICAgaW5pdF9udXRfb2ZmKCk7CiAgICBpbml0X29jdGFnb25fbWludXMoKTsKICAgIGluaXRfbnV0KCk7CiAgICBpbml0X29jdGFnb25fYWxlcnQoKTsKICAgIGluaXRfb2N0YWdvbl9wYXVzZSgpOwogICAgaW5pdF9vY3RhZ29uX3goKTsKICAgIGluaXRfb2N0YWdvbigpOwogICAgaW5pdF9vbWVnYSgpOwogICAgaW5pdF9vcHRpb24oKTsKICAgIGluaXRfb3JiaXQoKTsKICAgIGluaXRfb3JpZ2FtaSgpOwogICAgaW5pdF9wYWNrYWdlXzIoKTsKICAgIGluaXRfcGFja2FnZV9jaGVjaygpOwogICAgaW5pdF9wYWNrYWdlX21pbnVzKCk7CiAgICBpbml0X3BhY2thZ2Vfb3BlbigpOwogICAgaW5pdF9wYWNrYWdlX3BsdXMoKTsKICAgIGluaXRfcGFja2FnZV9zZWFyY2goKTsKICAgIGluaXRfcGFja2FnZV94KCk7CiAgICBpbml0X3BhY2thZ2UoKTsKICAgIGluaXRfcGFpbnRfYnVja2V0KCk7CiAgICBpbml0X3BhaW50X3JvbGxlcigpOwogICAgaW5pdF9wYWludGJydXNoX3ZlcnRpY2FsKCk7CiAgICBpbml0X3BhaW50YnJ1c2goKTsKICAgIGluaXRfcGFsZXR0ZSgpOwogICAgaW5pdF9wYW5kYSgpOwogICAgaW5pdF9wYW5lbF9ib3R0b21fY2xvc2UoKTsKICAgIGluaXRfcGFuZWxfYm90dG9tX2Rhc2hlZCgpOwogICAgaW5pdF9wYW5lbF9ib3R0b21fb3BlbigpOwogICAgaW5pdF9wYW5lbF9ib3R0b20oKTsKICAgIGluaXRfcGFuZWxfbGVmdF9jbG9zZSgpOwogICAgaW5pdF9wYW5lbF9sZWZ0X2Rhc2hlZCgpOwogICAgaW5pdF9wYW5lbF9sZWZ0X29wZW4oKTsKICAgIGluaXRfcGFuZWxfbGVmdF9yaWdodF9kYXNoZWQoKTsKICAgIGluaXRfcGFuZWxfbGVmdCgpOwogICAgaW5pdF9wYW5lbF9yaWdodF9jbG9zZSgpOwogICAgaW5pdF9wYW5lbF9yaWdodF9kYXNoZWQoKTsKICAgIGluaXRfcGFuZWxfcmlnaHRfb3BlbigpOwogICAgaW5pdF9wYW5lbF9yaWdodCgpOwogICAgaW5pdF9wYW5lbF90b3BfYm90dG9tX2Rhc2hlZCgpOwogICAgaW5pdF9wYW5lbF90b3BfY2xvc2UoKTsKICAgIGluaXRfcGFuZWxfdG9wX29wZW4oKTsKICAgIGluaXRfcGFuZWxfdG9wX2Rhc2hlZCgpOwogICAgaW5pdF9wYW5lbF90b3AoKTsKICAgIGluaXRfcGFuZWxzX2xlZnRfYm90dG9tKCk7CiAgICBpbml0X3BhbmVsc19yaWdodF9ib3R0b20oKTsKICAgIGluaXRfcGFuZWxzX3RvcF9sZWZ0KCk7CiAgICBpbml0X3BhcGVyY2xpcCgpOwogICAgaW5pdF9wYXJlbnRoZXNlcygpOwogICAgaW5pdF9wYXJraW5nX21ldGVyKCk7CiAgICBpbml0X3BhcnR5X3BvcHBlcigpOwogICAgaW5pdF9wYXVzZSgpOwogICAgaW5pdF9wYXdfcHJpbnQoKTsKICAgIGluaXRfcGNfY2FzZSgpOwogICAgaW5pdF9wZW5fbGluZSgpOwogICAgaW5pdF9wZW5fb2ZmKCk7CiAgICBpbml0X3Blbl90b29sKCk7CiAgICBpbml0X3BlbigpOwogICAgaW5pdF9wZW5jaWxfbGluZSgpOwogICAgaW5pdF9wZW5jaWxfb2ZmKCk7CiAgICBpbml0X3BlbmNpbF9ydWxlcigpOwogICAgaW5pdF9wZW5jaWwoKTsKICAgIGluaXRfcGVyY2VudCgpOwogICAgaW5pdF9wZW50YWdvbigpOwogICAgaW5pdF9wZXJzb25fc3RhbmRpbmcoKTsKICAgIGluaXRfcGhpbGlwcGluZV9wZXNvKCk7CiAgICBpbml0X3Bob25lX2NhbGwoKTsKICAgIGluaXRfcGhvbmVfZm9yd2FyZGVkKCk7CiAgICBpbml0X3Bob25lX2luY29taW5nKCk7CiAgICBpbml0X3Bob25lX21pc3NlZCgpOwogICAgaW5pdF9waG9uZV9vZmYoKTsKICAgIGluaXRfcGhvbmVfb3V0Z29pbmcoKTsKICAgIGluaXRfcGhvbmUoKTsKICAgIGluaXRfcGkoKTsKICAgIGluaXRfcGlhbm8oKTsKICAgIGluaXRfcGlja2F4ZSgpOwogICAgaW5pdF9waWN0dXJlX2luX3BpY3R1cmVfMigpOwogICAgaW5pdF9waWN0dXJlX2luX3BpY3R1cmUoKTsKICAgIGluaXRfcGlnZ3lfYmFuaygpOwogICAgaW5pdF9waWxjcm93X2xlZnQoKTsKICAgIGluaXRfcGlsY3Jvd19yaWdodCgpOwogICAgaW5pdF9waWxjcm93KCk7CiAgICBpbml0X3BpbGxfYm90dGxlKCk7CiAgICBpbml0X3BpbGwoKTsKICAgIGluaXRfcGluX29mZigpOwogICAgaW5pdF9waW4oKTsKICAgIGluaXRfcGlwZXR0ZSgpOwogICAgaW5pdF9waXp6YSgpOwogICAgaW5pdF9wbGFuZV9sYW5kaW5nKCk7CiAgICBpbml0X3BsYW5lX3Rha2VvZmYoKTsKICAgIGluaXRfcGxhbmUoKTsKICAgIGluaXRfcGxheSgpOwogICAgaW5pdF9wbHVnXzIoKTsKICAgIGluaXRfcGx1Z196YXAoKTsKICAgIGluaXRfcGx1ZygpOwogICAgaW5pdF9wbHVzKCk7CiAgICBpbml0X3BvY2tldF9rbmlmZSgpOwogICAgaW5pdF9wb2NrZXQoKTsKICAgIGluaXRfcG9kY2FzdCgpOwogICAgaW5pdF9wb2ludGVyKCk7CiAgICBpbml0X3BvaW50ZXJfb2ZmKCk7CiAgICBpbml0X3BvcGNvcm4oKTsKICAgIGluaXRfcG9wc2ljbGUoKTsKICAgIGluaXRfcG91bmRfc3RlcmxpbmcoKTsKICAgIGluaXRfcG93ZXJfb2ZmKCk7CiAgICBpbml0X3Bvd2VyKCk7CiAgICBpbml0X3ByZXNlbnRhdGlvbigpOwogICAgaW5pdF9wcmludGVyX2NoZWNrKCk7CiAgICBpbml0X3ByaW50ZXJfeCgpOwogICAgaW5pdF9wcmludGVyKCk7CiAgICBpbml0X3Byb2plY3RvcigpOwogICAgaW5pdF9wcm9wb3J0aW9ucygpOwogICAgaW5pdF9wdXp6bGUoKTsKICAgIGluaXRfcHlyYW1pZCgpOwogICAgaW5pdF9xcl9jb2RlKCk7CiAgICBpbml0X3JhYmJpdCgpOwogICAgaW5pdF9xdW90ZSgpOwogICAgaW5pdF9yYWRhcigpOwogICAgaW5pdF9yYWRpYXRpb24oKTsKICAgIGluaXRfcmFkaWNhbCgpOwogICAgaW5pdF9yYWRpb19yZWNlaXZlcigpOwogICAgaW5pdF9yYWRpbygpOwogICAgaW5pdF9yYWRpb190b3dlcigpOwogICAgaW5pdF9yYWRpdXMoKTsKICAgIGluaXRfcmFpbF9zeW1ib2woKTsKICAgIGluaXRfcmFpbmJvdygpOwogICAgaW5pdF9yYXQoKTsKICAgIGluaXRfcmF0aW8oKTsKICAgIGluaXRfcmVjZWlwdF9ldXJvKCk7CiAgICBpbml0X3JlY2VpcHRfY2VudCgpOwogICAgaW5pdF9yZWNlaXB0X2luZGlhbl9ydXBlZSgpOwogICAgaW5pdF9yZWNlaXB0X2phcGFuZXNlX3llbigpOwogICAgaW5pdF9yZWNlaXB0X3BvdW5kX3N0ZXJsaW5nKCk7CiAgICBpbml0X3JlY2VpcHRfcnVzc2lhbl9ydWJsZSgpOwogICAgaW5pdF9yZWNlaXB0X3RleHQoKTsKICAgIGluaXRfcmVjZWlwdF9zd2lzc19mcmFuYygpOwogICAgaW5pdF9yZWNlaXB0X3R1cmtpc2hfbGlyYSgpOwogICAgaW5pdF9yZWNlaXB0KCk7CiAgICBpbml0X3JlY3RhbmdsZV9jaXJjbGUoKTsKICAgIGluaXRfcmVjdGFuZ2xlX2VsbGlwc2lzKCk7CiAgICBpbml0X3JlY3RhbmdsZV9nb2dnbGVzKCk7CiAgICBpbml0X3JlY3RhbmdsZV9ob3Jpem9udGFsKCk7CiAgICBpbml0X3JlY3ljbGUoKTsKICAgIGluaXRfcmVjdGFuZ2xlX3ZlcnRpY2FsKCk7CiAgICBpbml0X3JlZG9fMigpOwogICAgaW5pdF9yZWRvX2RvdCgpOwogICAgaW5pdF9yZWRvKCk7CiAgICBpbml0X3JlZnJlc2hfY2N3X2RvdCgpOwogICAgaW5pdF9yZWZyZXNoX2NjdygpOwogICAgaW5pdF9yZWZyZXNoX2N3X29mZigpOwogICAgaW5pdF9yZWZyZXNoX2N3KCk7CiAgICBpbml0X3JlZnJpZ2VyYXRvcigpOwogICAgaW5pdF9yZWdleCgpOwogICAgaW5pdF9yZW1vdmVfZm9ybWF0dGluZygpOwogICAgaW5pdF9yZXBlYXRfMSgpOwogICAgaW5pdF9yZXBlYXRfMigpOwogICAgaW5pdF9yZXBlYXQ0KCk7CiAgICBpbml0X3JlcGxhY2VfYWxsKCk7CiAgICBpbml0X3JlcGxhY2UoKTsKICAgIGluaXRfcmVwbHlfYWxsKCk7CiAgICBpbml0X3Jld2luZCgpOwogICAgaW5pdF9yZXBseSgpOwogICAgaW5pdF9yaWJib24oKTsKICAgIGluaXRfcm9ja2V0KCk7CiAgICBpbml0X3JvY2tpbmdfY2hhaXIoKTsKICAgIGluaXRfcm9sbGVyX2NvYXN0ZXIoKTsKICAgIGluaXRfcm9zZSgpOwogICAgaW5pdF9yb3RhdGVfM2QoKTsKICAgIGluaXRfcm90YXRlX2Njd19rZXkoKTsKICAgIGluaXRfcm90YXRlX2Njd19zcXVhcmUoKTsKICAgIGluaXRfcm90YXRlX2NjdygpOwogICAgaW5pdF9yb3RhdGVfY3coKTsKICAgIGluaXRfcm90YXRlX2N3X3NxdWFyZSgpOwogICAgaW5pdF9yb3V0ZSgpOwogICAgaW5pdF9yb3V0ZV9vZmYoKTsKICAgIGluaXRfcm91dGVyKCk7CiAgICBpbml0X3Jvd3NfMigpOwogICAgaW5pdF9yb3dzXzMoKTsKICAgIGluaXRfcm93c180KCk7CiAgICBpbml0X3JzcygpOwogICAgaW5pdF9ydWxlcl9kaW1lbnNpb25fbGluZSgpOwogICAgaW5pdF9ydWxlcigpOwogICAgaW5pdF9ydXNzaWFuX3J1YmxlKCk7CiAgICBpbml0X3NhaWxib2F0KCk7CiAgICBpbml0X3NhbGFkKCk7CiAgICBpbml0X3NhbmR3aWNoKCk7CiAgICBpbml0X3NhdGVsbGl0ZV9kaXNoKCk7CiAgICBpbml0X3NhdGVsbGl0ZSgpOwogICAgaW5pdF9zYXVkaV9yaXlhbCgpOwogICAgaW5pdF9zYXZlX29mZigpOwogICAgaW5pdF9zYXZlX2FsbCgpOwogICAgaW5pdF9zYXZlKCk7CiAgICBpbml0X3NjYWxlXzNkKCk7CiAgICBpbml0X3NjYWxlKCk7CiAgICBpbml0X3NjYWxpbmcoKTsKICAgIGluaXRfc2Nhbl9iYXJjb2RlKCk7CiAgICBpbml0X3NjYW5fZXllKCk7CiAgICBpbml0X3NjYW5fZmFjZSgpOwogICAgaW5pdF9zY2FuX2hlYXJ0KCk7CiAgICBpbml0X3NjYW5fbGluZSgpOwogICAgaW5pdF9zY2FuX3FyX2NvZGUoKTsKICAgIGluaXRfc2Nhbl9zZWFyY2goKTsKICAgIGluaXRfc2Nhbl90ZXh0KCk7CiAgICBpbml0X3NjYW4yKCk7CiAgICBpbml0X3NjaG9vbCgpOwogICAgaW5pdF9zY2lzc29yc19saW5lX2Rhc2hlZCgpOwogICAgaW5pdF9zY2lzc29ycygpOwogICAgaW5pdF9zY29vdGVyKCk7CiAgICBpbml0X3NjcmVlbl9zaGFyZV9vZmYoKTsKICAgIGluaXRfc2NyZWVuX3NoYXJlKCk7CiAgICBpbml0X3Njcm9sbF90ZXh0KCk7CiAgICBpbml0X3Njcm9sbCgpOwogICAgaW5pdF9zZWFyY2hfYWxlcnQoKTsKICAgIGluaXRfc2VhcmNoX2NoZWNrKCk7CiAgICBpbml0X3NlYXJjaF9jb2RlKCk7CiAgICBpbml0X3NlYXJjaF94KCk7CiAgICBpbml0X3NlYXJjaF9zbGFzaCgpOwogICAgaW5pdF9zZWN0aW9uKCk7CiAgICBpbml0X3NlYXJjaCgpOwogICAgaW5pdF9zZW5kX2hvcml6b250YWwoKTsKICAgIGluaXRfc2VuZF90b19iYWNrKCk7CiAgICBpbml0X3NlbmQoKTsKICAgIGluaXRfc2VwYXJhdG9yX2hvcml6b250YWwoKTsKICAgIGluaXRfc2VwYXJhdG9yX3ZlcnRpY2FsKCk7CiAgICBpbml0X3NlcnZlcl9jb2coKTsKICAgIGluaXRfc2VydmVyX2NyYXNoKCk7CiAgICBpbml0X3NlcnZlcl9vZmYoKTsKICAgIGluaXRfc2VydmVyKCk7CiAgICBpbml0X3NldHRpbmdzXzIoKTsKICAgIGluaXRfc2V0dGluZ3MoKTsKICAgIGluaXRfc2hhcGVzKCk7CiAgICBpbml0X3NoYXJlXzIoKTsKICAgIGluaXRfc2hhcmUyKCk7CiAgICBpbml0X3NoZWV0KCk7CiAgICBpbml0X3NoZWxsKCk7CiAgICBpbml0X3NoZWx2aW5nX3VuaXQoKTsKICAgIGluaXRfc2hpZWxkX2FsZXJ0KCk7CiAgICBpbml0X3NoaWVsZF9iYW4oKTsKICAgIGluaXRfc2hpZWxkX2VsbGlwc2lzKCk7CiAgICBpbml0X3NoaWVsZF9jaGVjaygpOwogICAgaW5pdF9zaGllbGRfaGFsZigpOwogICAgaW5pdF9zaGllbGRfbWludXMoKTsKICAgIGluaXRfc2hpZWxkX29mZigpOwogICAgaW5pdF9zaGllbGRfcGx1cygpOwogICAgaW5pdF9zaGllbGRfcXVlc3Rpb25fbWFyaygpOwogICAgaW5pdF9zaGllbGRfdXNlcigpOwogICAgaW5pdF9zaGllbGRfeCgpOwogICAgaW5pdF9zaGlwX3doZWVsKCk7CiAgICBpbml0X3NoaWVsZCgpOwogICAgaW5pdF9zaGlwKCk7CiAgICBpbml0X3NoaXJ0KCk7CiAgICBpbml0X3Nob3BwaW5nX2JhZygpOwogICAgaW5pdF9zaG9wcGluZ19iYXNrZXQoKTsKICAgIGluaXRfc2hvcHBpbmdfY2FydCgpOwogICAgaW5pdF9zaG92ZWwoKTsKICAgIGluaXRfc2hvd2VyX2hlYWQoKTsKICAgIGluaXRfc2hyZWRkZXIoKTsKICAgIGluaXRfc2hyaW1wKCk7CiAgICBpbml0X3NocmluaygpOwogICAgaW5pdF9zaHJ1YigpOwogICAgaW5pdF9zaHVmZmxlKCk7CiAgICBpbml0X3NpZ21hKCk7CiAgICBpbml0X3NpZ25hbF9oaWdoKCk7CiAgICBpbml0X3NpZ25hbF9sb3coKTsKICAgIGluaXRfc2lnbmFsX21lZGl1bSgpOwogICAgaW5pdF9zaWduYWxfemVybygpOwogICAgaW5pdF9zaWduYWwoKTsKICAgIGluaXRfc2lnbmF0dXJlKCk7CiAgICBpbml0X3NpZ25wb3N0KCk7CiAgICBpbml0X3NpcmVuKCk7CiAgICBpbml0X3NpZ25wb3N0X2JpZygpOwogICAgaW5pdF9za2lwX2JhY2soKTsKICAgIGluaXRfc2tpcF9mb3J3YXJkKCk7CiAgICBpbml0X3NsYWNrKCk7CiAgICBpbml0X3NsYXNoKCk7CiAgICBpbml0X3NrdWxsKCk7CiAgICBpbml0X3NsaWNlKCk7CiAgICBpbml0X3NsaWRlcnNfdmVydGljYWwoKTsKICAgIGluaXRfc2xpZGVyc19ob3Jpem9udGFsKCk7CiAgICBpbml0X3NtYXJ0cGhvbmVfY2hhcmdpbmcoKTsKICAgIGluaXRfc21hcnRwaG9uZV9uZmMoKTsKICAgIGluaXRfc21hcnRwaG9uZSgpOwogICAgaW5pdF9zbWlsZV9wbHVzKCk7CiAgICBpbml0X3NtaWxlKCk7CiAgICBpbml0X3Nub3dmbGFrZSgpOwogICAgaW5pdF9zb2FwX2Rpc3BlbnNlcl9kcm9wbGV0KCk7CiAgICBpbml0X3NuYWlsKCk7CiAgICBpbml0X3NvZmEoKTsKICAgIGluaXRfc29sYXJfcGFuZWwoKTsKICAgIGluaXRfc291cCgpOwogICAgaW5pdF9zcGFjZSgpOwogICAgaW5pdF9zcGFkZSgpOwogICAgaW5pdF9zcGFya2xlKCk7CiAgICBpbml0X3NwYXJrbGVzKCk7CiAgICBpbml0X3NwZWFrZXIoKTsKICAgIGluaXRfc3BlZWNoKCk7CiAgICBpbml0X3NwZWxsX2NoZWNrXzIoKTsKICAgIGluaXRfc3BsaW5lX3BvaW50ZXIoKTsKICAgIGluaXRfc3BlbGxfY2hlY2soKTsKICAgIGluaXRfc3BsaW5lKCk7CiAgICBpbml0X3NwbGl0KCk7CiAgICBpbml0X3Nwb29sKCk7CiAgICBpbml0X3NwcmF5X2NhbigpOwogICAgaW5pdF9zcG90bGlnaHQoKTsKICAgIGluaXRfc3Byb3V0KCk7CiAgICBpbml0X3NxdWFyZV9hcnJvd19kb3duX2xlZnQoKTsKICAgIGluaXRfc3F1YXJlX2FjdGl2aXR5KCk7CiAgICBpbml0X3NxdWFyZV9hcnJvd19kb3duX3JpZ2h0KCk7CiAgICBpbml0X3NxdWFyZV9hcnJvd19kb3duKCk7CiAgICBpbml0X3NxdWFyZV9hcnJvd19sZWZ0KCk7CiAgICBpbml0X3NxdWFyZV9hcnJvd19vdXRfZG93bl9sZWZ0KCk7CiAgICBpbml0X3NxdWFyZV9hcnJvd19vdXRfZG93bl9yaWdodCgpOwogICAgaW5pdF9zcXVhcmVfYXJyb3dfb3V0X3VwX2xlZnQoKTsKICAgIGluaXRfc3F1YXJlX2Fycm93X291dF91cF9yaWdodCgpOwogICAgaW5pdF9zcXVhcmVfYXJyb3dfcmlnaHRfZW50ZXIoKTsKICAgIGluaXRfc3F1YXJlX2Fycm93X3JpZ2h0X2V4aXQoKTsKICAgIGluaXRfc3F1YXJlX2Fycm93X3JpZ2h0KCk7CiAgICBpbml0X3NxdWFyZV9hcnJvd191cF9sZWZ0KCk7CiAgICBpbml0X3NxdWFyZV9hcnJvd191cF9yaWdodCgpOwogICAgaW5pdF9zcXVhcmVfYXJyb3dfdXAoKTsKICAgIGluaXRfc3F1YXJlX2NlbnRlcmxpbmVfZGFzaGVkX2hvcml6b250YWwoKTsKICAgIGluaXRfc3F1YXJlX2FzdGVyaXNrKCk7CiAgICBpbml0X3NxdWFyZV9ib3R0b21fZGFzaGVkX3NjaXNzb3JzKCk7CiAgICBpbml0X3NxdWFyZV9jZW50ZXJsaW5lX2Rhc2hlZF92ZXJ0aWNhbCgpOwogICAgaW5pdF9zcXVhcmVfY2hhcnRfZ2FudHQoKTsKICAgIGluaXRfc3F1YXJlX2NoZWNrX2JpZygpOwogICAgaW5pdF9zcXVhcmVfY2hlY2soKTsKICAgIGluaXRfc3F1YXJlX2NoZXZyb25fZG93bigpOwogICAgaW5pdF9zcXVhcmVfY2hldnJvbl9sZWZ0KCk7CiAgICBpbml0X3NxdWFyZV9jaGV2cm9uX3JpZ2h0KCk7CiAgICBpbml0X3NxdWFyZV9jaGV2cm9uX3VwKCk7CiAgICBpbml0X3NxdWFyZV9jb2RlKCk7CiAgICBpbml0X3NxdWFyZV9kYXNoZWRfYm90dG9tX2NvZGUoKTsKICAgIGluaXRfc3F1YXJlX2Rhc2hlZF9ib3R0b20oKTsKICAgIGluaXRfc3F1YXJlX2Rhc2hlZF9rYW5iYW4oKTsKICAgIGluaXRfc3F1YXJlX2Rhc2hlZF9tb3VzZV9wb2ludGVyKCk7CiAgICBpbml0X3NxdWFyZV9kYXNoZWRfdG9wX3NvbGlkKCk7CiAgICBpbml0X3NxdWFyZV9kYXNoZWQoKTsKICAgIGluaXRfc3F1YXJlX2RpdmlkZSgpOwogICAgaW5pdF9zcXVhcmVfZG90KCk7CiAgICBpbml0X3NxdWFyZV9lcXVhbCgpOwogICAgaW5pdF9zcXVhcmVfZnVuY3Rpb24oKTsKICAgIGluaXRfc3F1YXJlX2thbmJhbigpOwogICAgaW5pdF9zcXVhcmVfbGlicmFyeSgpOwogICAgaW5pdF9zcXVhcmVfbSgpOwogICAgaW5pdF9zcXVhcmVfbWVudSgpOwogICAgaW5pdF9zcXVhcmVfbWludXMoKTsKICAgIGluaXRfc3F1YXJlX21vdXNlX3BvaW50ZXIoKTsKICAgIGluaXRfc3F1YXJlX3Bhcmtpbmdfb2ZmKCk7CiAgICBpbml0X3NxdWFyZV9wYXJraW5nKCk7CiAgICBpbml0X3NxdWFyZV9wYXVzZSgpOwogICAgaW5pdF9zcXVhcmVfcGVuKCk7CiAgICBpbml0X3NxdWFyZV9wZXJjZW50KCk7CiAgICBpbml0X3NxdWFyZV9waSgpOwogICAgaW5pdF9zcXVhcmVfcGlsY3JvdygpOwogICAgaW5pdF9zcXVhcmVfcGxheSgpOwogICAgaW5pdF9zcXVhcmVfcGx1cygpOwogICAgaW5pdF9zcXVhcmVfcG93ZXIoKTsKICAgIGluaXRfc3F1YXJlX3JhZGljYWwoKTsKICAgIGluaXRfc3F1YXJlX3JvdW5kX2Nvcm5lcigpOwogICAgaW5pdF9zcXVhcmVfc2Npc3NvcnMoKTsKICAgIGluaXRfc3F1YXJlX3NpZ21hKCk7CiAgICBpbml0X3NxdWFyZV9zbGFzaCgpOwogICAgaW5pdF9zcXVhcmVfc3BsaXRfaG9yaXpvbnRhbCgpOwogICAgaW5pdF9zcXVhcmVfc3BsaXRfdmVydGljYWwoKTsKICAgIGluaXRfc3F1YXJlX3NxdWFyZSgpOwogICAgaW5pdF9zcXVhcmVfc3RhY2soKTsKICAgIGluaXRfc3F1YXJlX3N0YXIoKTsKICAgIGluaXRfc3F1YXJlX3N0b3AoKTsKICAgIGluaXRfc3F1YXJlX3VzZXJfcm91bmQoKTsKICAgIGluaXRfc3F1YXJlX3Rlcm1pbmFsKCk7CiAgICBpbml0X3NxdWFyZV91c2VyKCk7CiAgICBpbml0X3NxdWFyZV94KCk7CiAgICBpbml0X3NxdWFyZSgpOwogICAgaW5pdF9zcXVhcmVzX2V4Y2x1ZGUoKTsKICAgIGluaXRfc3F1YXJlc19pbnRlcnNlY3QoKTsKICAgIGluaXRfc3F1YXJlc19zdWJ0cmFjdCgpOwogICAgaW5pdF9zcXVhcmVzX3VuaXRlKCk7CiAgICBpbml0X3NxdWlyY2xlX2Rhc2hlZCgpOwogICAgaW5pdF9zcXVpcmNsZSgpOwogICAgaW5pdF9zdGFtcCgpOwogICAgaW5pdF9zcXVpcnJlbCgpOwogICAgaW5pdF9zdGFyX2hhbGYoKTsKICAgIGluaXRfc3Rhcl9vZmYoKTsKICAgIGluaXRfc3RhcigpOwogICAgaW5pdF9zdGVwX2JhY2soKTsKICAgIGluaXRfc3RlcF9mb3J3YXJkKCk7CiAgICBpbml0X3N0ZXRob3Njb3BlKCk7CiAgICBpbml0X3N0aWNrZXIoKTsKICAgIGluaXRfc3RpY2t5X25vdGUoKTsKICAgIGluaXRfc3RvbmUoKTsKICAgIGluaXRfc3RvcmUoKTsKICAgIGluaXRfc3RyZXRjaF9ob3Jpem9udGFsKCk7CiAgICBpbml0X3N0cmV0Y2hfdmVydGljYWwoKTsKICAgIGluaXRfc3RyaWtldGhyb3VnaCgpOwogICAgaW5pdF9zdWJzY3JpcHQoKTsKICAgIGluaXRfc3VuX2RpbSgpOwogICAgaW5pdF9zdW5fbWVkaXVtKCk7CiAgICBpbml0X3N1bl9tb29uKCk7CiAgICBpbml0X3N1bl9zbm93KCk7CiAgICBpbml0X3N1bigpOwogICAgaW5pdF9zdW5yaXNlKCk7CiAgICBpbml0X3N1bnNldCgpOwogICAgaW5pdF9zdXBlcnNjcmlwdCgpOwogICAgaW5pdF9zd2F0Y2hfYm9vaygpOwogICAgaW5pdF9zd2l0Y2hfY2FtZXJhKCk7CiAgICBpbml0X3N3aXNzX2ZyYW5jKCk7CiAgICBpbml0X3N3b3JkKCk7CiAgICBpbml0X3RhYmxlXzIoKTsKICAgIGluaXRfdGFibGVfY2VsbHNfbWVyZ2UoKTsKICAgIGluaXRfc3dvcmRzKCk7CiAgICBpbml0X3N5cmluZ2UoKTsKICAgIGluaXRfdGFibGVfY2VsbHNfc3BsaXQoKTsKICAgIGluaXRfdGFibGVfY29sdW1uc19zcGxpdCgpOwogICAgaW5pdF90YWJsZV9vZl9jb250ZW50cygpOwogICAgaW5pdF90YWJsZV9wcm9wZXJ0aWVzKCk7CiAgICBpbml0X3RhYmxlX3Jvd3Nfc3BsaXQoKTsKICAgIGluaXRfdGFibGUyKCk7CiAgICBpbml0X3RhYmxldF9zbWFydHBob25lKCk7CiAgICBpbml0X3RhYmxldCgpOwogICAgaW5pdF90YWJsZXRzKCk7CiAgICBpbml0X3RhZygpOwogICAgaW5pdF90YWdzKCk7CiAgICBpbml0X3RhbGx5XzEoKTsKICAgIGluaXRfdGFsbHlfMigpOwogICAgaW5pdF90YWxseV8zKCk7CiAgICBpbml0X3RhbGx5XzQoKTsKICAgIGluaXRfdGFsbHlfNSgpOwogICAgaW5pdF90YW5nZW50KCk7CiAgICBpbml0X3RhcmdldCgpOwogICAgaW5pdF90ZWxlc2NvcGUoKTsKICAgIGluaXRfdGVudF90cmVlKCk7CiAgICBpbml0X3RlbnQoKTsKICAgIGluaXRfdGVybWluYWwoKTsKICAgIGluaXRfdGVzdF90dWJlX2RpYWdvbmFsKCk7CiAgICBpbml0X3Rlc3RfdHViZSgpOwogICAgaW5pdF90ZXN0X3R1YmVzKCk7CiAgICBpbml0X3RleHRfYWxpZ25fY2VudGVyKCk7CiAgICBpbml0X3RleHRfYWxpZ25fZW5kKCk7CiAgICBpbml0X3RleHRfYWxpZ25fanVzdGlmeSgpOwogICAgaW5pdF90ZXh0X2FsaWduX3N0YXJ0KCk7CiAgICBpbml0X3RleHRfY3Vyc29yX2lucHV0KCk7CiAgICBpbml0X3RleHRfY3Vyc29yKCk7CiAgICBpbml0X3RleHRfaW5pdGlhbCgpOwogICAgaW5pdF90ZXh0X3F1b3RlKCk7CiAgICBpbml0X3RleHRfc2VhcmNoKCk7CiAgICBpbml0X3RleHRfc2VsZWN0KCk7CiAgICBpbml0X3RleHRfd3JhcCgpOwogICAgaW5pdF90aGVhdGVyKCk7CiAgICBpbml0X3RoZXJtb21ldGVyX3Nub3dmbGFrZSgpOwogICAgaW5pdF90aGVybW9tZXRlcl9zdW4oKTsKICAgIGluaXRfdGhlcm1vbWV0ZXIoKTsKICAgIGluaXRfdGh1bWJzX2Rvd24oKTsKICAgIGluaXRfdGh1bWJzX3VwKCk7CiAgICBpbml0X3RpY2tldF9jaGVjaygpOwogICAgaW5pdF90aWNrZXRfbWludXMoKTsKICAgIGluaXRfdGlja2V0X3BlcmNlbnQoKTsKICAgIGluaXRfdGlja2V0X3BsdXMoKTsKICAgIGluaXRfdGlja2V0X3NsYXNoKCk7CiAgICBpbml0X3RpY2tldF94KCk7CiAgICBpbml0X3RpY2tldCgpOwogICAgaW5pdF90aWNrZXRzX3BsYW5lKCk7CiAgICBpbml0X3RpY2tldHMoKTsKICAgIGluaXRfdGltZXJfcmVzZXQoKTsKICAgIGluaXRfdGltZXJfb2ZmKCk7CiAgICBpbml0X3RpbWVyMigpOwogICAgaW5pdF90b2dnbGVfbGVmdCgpOwogICAgaW5pdF90b2lsZXQoKTsKICAgIGluaXRfdG9nZ2xlX3JpZ2h0KCk7CiAgICBpbml0X3Rvb2xfY2FzZSgpOwogICAgaW5pdF90b29sYm94KCk7CiAgICBpbml0X3Rvcm5hZG8oKTsKICAgIGluaXRfdG9ydXMoKTsKICAgIGluaXRfdG91Y2hwYWRfb2ZmKCk7CiAgICBpbml0X3RvdWNocGFkKCk7CiAgICBpbml0X3Rvd2VsX3JhY2soKTsKICAgIGluaXRfdG93ZXJfY29udHJvbCgpOwogICAgaW5pdF90b3lfYnJpY2soKTsKICAgIGluaXRfdHJhY3RvcigpOwogICAgaW5pdF90cmFmZmljX2NvbmUoKTsKICAgIGluaXRfdHJhaW5fZnJvbnRfdHVubmVsKCk7CiAgICBpbml0X3RyYWluX2Zyb250KCk7CiAgICBpbml0X3RyYWluX3RyYWNrKCk7CiAgICBpbml0X3RyYW1fZnJvbnQoKTsKICAgIGluaXRfdHJhbnNnZW5kZXIoKTsKICAgIGluaXRfdHJhc2hfMigpOwogICAgaW5pdF90cmFzaCgpOwogICAgaW5pdF90cmVlX3BhbG0oKTsKICAgIGluaXRfdHJlZV9kZWNpZHVvdXMoKTsKICAgIGluaXRfdHJlZV9waW5lKCk7CiAgICBpbml0X3RyZWVzKCk7CiAgICBpbml0X3RyZWxsbygpOwogICAgaW5pdF90cmVuZGluZ19kb3duKCk7CiAgICBpbml0X3RyZW5kaW5nX3VwX2Rvd24oKTsKICAgIGluaXRfdHJlbmRpbmdfdXAoKTsKICAgIGluaXRfdHJpYW5nbGVfYWxlcnQoKTsKICAgIGluaXRfdHJpYW5nbGVfZGFzaGVkKCk7CiAgICBpbml0X3RyaWFuZ2xlX3JpZ2h0KCk7CiAgICBpbml0X3RyaWFuZ2xlKCk7CiAgICBpbml0X3Ryb3BoeSgpOwogICAgaW5pdF90cnVja19lbGVjdHJpYygpOwogICAgaW5pdF90cnVjaygpOwogICAgaW5pdF90dXJraXNoX2xpcmEoKTsKICAgIGluaXRfdHVybnRhYmxlKCk7CiAgICBpbml0X3R1cnRsZSgpOwogICAgaW5pdF90dl9taW5pbWFsX3BsYXkoKTsKICAgIGluaXRfdHZfbWluaW1hbCgpOwogICAgaW5pdF90digpOwogICAgaW5pdF90d2l0Y2goKTsKICAgIGluaXRfdHdpdHRlcigpOwogICAgaW5pdF90eXBlX291dGxpbmUoKTsKICAgIGluaXRfdHlwZSgpOwogICAgaW5pdF91bWJyZWxsYSgpOwogICAgaW5pdF91bWJyZWxsYV9vZmYoKTsKICAgIGluaXRfdW5kZXJsaW5lKCk7CiAgICBpbml0X3VuZG9fMigpOwogICAgaW5pdF91bmRvX2RvdCgpOwogICAgaW5pdF91bmRvKCk7CiAgICBpbml0X3VuZm9sZF9ob3Jpem9udGFsKCk7CiAgICBpbml0X3VuZm9sZF92ZXJ0aWNhbCgpOwogICAgaW5pdF91bmdyb3VwKCk7CiAgICBpbml0X3VuaXZlcnNpdHkoKTsKICAgIGluaXRfdW5saW5rKCk7CiAgICBpbml0X3VucGx1ZygpOwogICAgaW5pdF91bmxpbmtfMigpOwogICAgaW5pdF91cGxvYWQoKTsKICAgIGluaXRfdXNiKCk7CiAgICBpbml0X3VzZXJfY2hlY2soKTsKICAgIGluaXRfdXNlcl9jb2coKTsKICAgIGluaXRfdXNlcl9rZXkoKTsKICAgIGluaXRfdXNlcl9sb2NrKCk7CiAgICBpbml0X3VzZXJfbWludXMoKTsKICAgIGluaXRfdXNlcl9wbHVzKCk7CiAgICBpbml0X3VzZXJfcGVuKCk7CiAgICBpbml0X3VzZXJfcm91bmRfY2hlY2soKTsKICAgIGluaXRfdXNlcl9yb3VuZF9jb2coKTsKICAgIGluaXRfdXNlcl9yb3VuZF9rZXkoKTsKICAgIGluaXRfdXNlcl9yb3VuZF9taW51cygpOwogICAgaW5pdF91c2VyX3JvdW5kX3BlbigpOwogICAgaW5pdF91c2VyX3JvdW5kX3BsdXMoKTsKICAgIGluaXRfdXNlcl9yb3VuZF9zZWFyY2goKTsKICAgIGluaXRfdXNlcl9yb3VuZCgpOwogICAgaW5pdF91c2VyX3JvdW5kX3goKTsKICAgIGluaXRfdXNlcl9zZWFyY2goKTsKICAgIGluaXRfdXNlcl9zdGFyKCk7CiAgICBpbml0X3VzZXJfeCgpOwogICAgaW5pdF91c2VyKCk7CiAgICBpbml0X3VzZXJzX3JvdW5kKCk7CiAgICBpbml0X3V0ZW5zaWxzX2Nyb3NzZWQoKTsKICAgIGluaXRfdXNlcnMoKTsKICAgIGluaXRfdXRpbGl0eV9wb2xlKCk7CiAgICBpbml0X3V0ZW5zaWxzKCk7CiAgICBpbml0X3ZhbigpOwogICAgaW5pdF92YXJpYWJsZSgpOwogICAgaW5pdF92ZWN0b3Jfc3F1YXJlKCk7CiAgICBpbml0X3ZhdWx0KCk7CiAgICBpbml0X3ZlZ2FuKCk7CiAgICBpbml0X3ZlbmV0aWFuX21hc2soKTsKICAgIGluaXRfdmVudXNfYW5kX21hcnMoKTsKICAgIGluaXRfdmVudXMoKTsKICAgIGluaXRfdmlicmF0ZV9vZmYoKTsKICAgIGluaXRfdmlicmF0ZSgpOwogICAgaW5pdF92aWRlb19vZmYoKTsKICAgIGluaXRfdmlkZW8oKTsKICAgIGluaXRfdmlkZW90YXBlKCk7CiAgICBpbml0X3ZpZXcoKTsKICAgIGluaXRfdm9pY2VtYWlsKCk7CiAgICBpbml0X3ZvbGxleWJhbGwoKTsKICAgIGluaXRfdm9sdW1lXzEoKTsKICAgIGluaXRfdm9sdW1lXzIoKTsKICAgIGluaXRfdm9sdW1lX3goKTsKICAgIGluaXRfdm9sdW1lX29mZigpOwogICAgaW5pdF92b2x1bWUoKTsKICAgIGluaXRfd2FsbGV0X2NhcmRzKCk7CiAgICBpbml0X3ZvdGUoKTsKICAgIGluaXRfd2FsbGV0X21pbmltYWwoKTsKICAgIGluaXRfd2FsbGV0KCk7CiAgICBpbml0X3dhbGxwYXBlcigpOwogICAgaW5pdF93YW5kX3NwYXJrbGVzKCk7CiAgICBpbml0X3dhbmQoKTsKICAgIGluaXRfd2FyZWhvdXNlKCk7CiAgICBpbml0X3dhc2hpbmdfbWFjaGluZSgpOwogICAgaW5pdF93YXRjaCgpOwogICAgaW5pdF93YXZlc19hcnJvd19kb3duKCk7CiAgICBpbml0X3dhdmVzX2xhZGRlcigpOwogICAgaW5pdF93YXZlc19hcnJvd191cCgpOwogICAgaW5pdF93YXZlcygpOwogICAgaW5pdF93YXlwb2ludHMoKTsKICAgIGluaXRfd2ViY2FtKCk7CiAgICBpbml0X3dlYmhvb2tfb2ZmKCk7CiAgICBpbml0X3dlYmhvb2soKTsKICAgIGluaXRfd2VpZ2h0X3RpbGRlKCk7CiAgICBpbml0X3doZWF0X29mZigpOwogICAgaW5pdF93ZWlnaHQoKTsKICAgIGluaXRfd2hlYXQoKTsKICAgIGluaXRfd2hvbGVfd29yZCgpOwogICAgaW5pdF93aWZpX2NvZygpOwogICAgaW5pdF93aWZpX2hpZ2goKTsKICAgIGluaXRfd2lmaV9sb3coKTsKICAgIGluaXRfd2lmaV9wZW4oKTsKICAgIGluaXRfd2lmaV9vZmYoKTsKICAgIGluaXRfd2lmaV96ZXJvKCk7CiAgICBpbml0X3dpZmlfc3luYygpOwogICAgaW5pdF93aWZpKCk7CiAgICBpbml0X3dpbmRfYXJyb3dfZG93bigpOwogICAgaW5pdF93aW5kKCk7CiAgICBpbml0X3dpbmVfb2ZmKCk7CiAgICBpbml0X3dpbmUoKTsKICAgIGluaXRfd29ya2Zsb3coKTsKICAgIGluaXRfd29ybSgpOwogICAgaW5pdF93cmVuY2goKTsKICAgIGluaXRfeF9saW5lX3RvcCgpOwogICAgaW5pdF94KCk7CiAgICBpbml0X3lvdXR1YmUoKTsKICAgIGluaXRfemFwX29mZigpOwogICAgaW5pdF96YXAoKTsKICAgIGluaXRfem9kaWFjX2FxdWFyaXVzKCk7CiAgICBpbml0X3pvZGlhY19hcmllcygpOwogICAgaW5pdF96b2RpYWNfY2FuY2VyKCk7CiAgICBpbml0X3pvZGlhY19jYXByaWNvcm4oKTsKICAgIGluaXRfem9kaWFjX2xlbygpOwogICAgaW5pdF96b2RpYWNfZ2VtaW5pKCk7CiAgICBpbml0X3pvZGlhY19saWJyYSgpOwogICAgaW5pdF96b2RpYWNfb3BoaXVjaHVzKCk7CiAgICBpbml0X3pvZGlhY19waXNjZXMoKTsKICAgIGluaXRfem9kaWFjX3NhZ2l0dGFyaXVzKCk7CiAgICBpbml0X3pvZGlhY19zY29ycGlvKCk7CiAgICBpbml0X3pvZGlhY190YXVydXMoKTsKICAgIGluaXRfem9kaWFjX3ZpcmdvKCk7CiAgICBpbml0X3pvb21faW4oKTsKICAgIGluaXRfem9vbV9vdXQoKTsKICAgIGNyZWF0ZUljb25zID0gKHsKICAgICAgaWNvbnM6IGljb25zNSA9IHt9LAogICAgICBuYW1lQXR0ciA9ICJkYXRhLWx1Y2lkZSIsCiAgICAgIGF0dHJzID0ge30sCiAgICAgIHJvb3Q6IHJvb3Q2ID0gZG9jdW1lbnQsCiAgICAgIGluVGVtcGxhdGVzCiAgICB9ID0ge30pID0+IHsKICAgICAgaWYgKCFPYmplY3QudmFsdWVzKGljb25zNSkubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICAgIlBsZWFzZSBwcm92aWRlIGFuIGljb25zIG9iamVjdC5cbklmIHlvdSB3YW50IHRvIHVzZSBhbGwgdGhlIGljb25zIHlvdSBjYW4gaW1wb3J0IGl0IGxpa2U6XG4gYGltcG9ydCB7IGNyZWF0ZUljb25zLCBpY29ucyB9IGZyb20gJ2x1Y2lkZSc7XG5sdWNpZGUuY3JlYXRlSWNvbnMoe2ljb25zfSk7YCIKICAgICAgICApOwogICAgICB9CiAgICAgIGlmICh0eXBlb2Ygcm9vdDYgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJgY3JlYXRlSWNvbnMoKWAgb25seSB3b3JrcyBpbiBhIGJyb3dzZXIgZW52aXJvbm1lbnQuIik7CiAgICAgIH0KICAgICAgY29uc3QgZWxlbWVudHNUb1JlcGxhY2UgPSBBcnJheS5mcm9tKHJvb3Q2LnF1ZXJ5U2VsZWN0b3JBbGwoYFske25hbWVBdHRyfV1gKSk7CiAgICAgIGVsZW1lbnRzVG9SZXBsYWNlLmZvckVhY2goKGVsZW1lbnQ0KSA9PiByZXBsYWNlRWxlbWVudChlbGVtZW50NCwgeyBuYW1lQXR0ciwgaWNvbnM6IGljb25zNSwgYXR0cnMgfSkpOwogICAgICBpZiAoaW5UZW1wbGF0ZXMpIHsKICAgICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBBcnJheS5mcm9tKHJvb3Q2LnF1ZXJ5U2VsZWN0b3JBbGwoInRlbXBsYXRlIikpOwogICAgICAgIHRlbXBsYXRlcy5mb3JFYWNoKAogICAgICAgICAgKHRlbXBsYXRlKSA9PiBjcmVhdGVJY29ucyh7CiAgICAgICAgICAgIGljb25zOiBpY29uczUsCiAgICAgICAgICAgIG5hbWVBdHRyLAogICAgICAgICAgICBhdHRycywKICAgICAgICAgICAgcm9vdDogdGVtcGxhdGUuY29udGVudCwKICAgICAgICAgICAgaW5UZW1wbGF0ZXMKICAgICAgICAgIH0pCiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAobmFtZUF0dHIgPT09ICJkYXRhLWx1Y2lkZSIpIHsKICAgICAgICBjb25zdCBkZXByZWNhdGVkRWxlbWVudHMgPSByb290Ni5xdWVyeVNlbGVjdG9yQWxsKCJbaWNvbi1uYW1lXSIpOwogICAgICAgIGlmIChkZXByZWNhdGVkRWxlbWVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgY29uc29sZS53YXJuKAogICAgICAgICAgICAiW0x1Y2lkZV0gU29tZSBpY29ucyB3ZXJlIGZvdW5kIHdpdGggdGhlIG5vdyBkZXByZWNhdGVkIGljb24tbmFtZSBhdHRyaWJ1dGUuIFRoZXNlIHdpbGwgc3RpbGwgYmUgcmVwbGFjZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgd2lsbCBubyBsb25nZXIgYmUgc3VwcG9ydGVkIGluIHYxLjAgYW5kIHlvdSBzaG91bGQgc3dpdGNoIHRvIGRhdGEtbHVjaWRlIgogICAgICAgICAgKTsKICAgICAgICAgIEFycmF5LmZyb20oZGVwcmVjYXRlZEVsZW1lbnRzKS5mb3JFYWNoKAogICAgICAgICAgICAoZWxlbWVudDQpID0+IHJlcGxhY2VFbGVtZW50KGVsZW1lbnQ0LCB7IG5hbWVBdHRyOiAiaWNvbi1uYW1lIiwgaWNvbnM6IGljb25zNSwgYXR0cnMgfSkKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtdXRpbGl0eS9kZWVzLWljb24vZGVlcy1pY29uLmRlbW8uanMKdmFyIGRlbW9GdW5jMjsKdmFyIGluaXRfZGVlc19pY29uX2RlbW8gPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC11dGlsaXR5L2RlZXMtaWNvbi9kZWVzLWljb24uZGVtby5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMzMCgpOwogICAgaW5pdF9kZWVzX2ljb24oKTsKICAgIGluaXRfbHVjaWRlKCk7CiAgICBkZW1vRnVuYzIgPSAoKSA9PiB7CiAgICAgIGNvbnN0IGZhSWNvbnMzID0gT2JqZWN0LmtleXMoaWNvbnM0LmZhKTsKICAgICAgY29uc29sZS5sb2coIkZpcnN0IGZldyBMdWNpZGUga2V5czoiLCBPYmplY3Qua2V5cyhsdWNpZGVfZXhwb3J0cykuc2xpY2UoMCwgNSkpOwogICAgICBjb25zdCBsdWNpZGVJY29uc0xpc3QgPSBPYmplY3Qua2V5cyhsdWNpZGVfZXhwb3J0cykuZmlsdGVyKChrZXkyKSA9PiB7CiAgICAgICAgY29uc3QgaXNVcHBlcmNhc2VGaXJzdCA9IGtleTJbMF0gPT09IGtleTJbMF0udG9VcHBlckNhc2UoKSAmJiBrZXkyWzBdICE9PSBrZXkyWzBdLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgY29uc3QgaXNGdW5jdGlvbjIgPSB0eXBlb2YgbHVjaWRlX2V4cG9ydHNba2V5Ml0gPT09ICJmdW5jdGlvbiI7CiAgICAgICAgY29uc3Qgbm90VXRpbGl0eSA9ICFbImNyZWF0ZUVsZW1lbnQiLCAiY3JlYXRlSWNvbnMiLCAiZGVmYXVsdCJdLmluY2x1ZGVzKGtleTIpOwogICAgICAgIHJldHVybiBpc0Z1bmN0aW9uMiAmJiBpc1VwcGVyY2FzZUZpcnN0ICYmIG5vdFV0aWxpdHk7CiAgICAgIH0pLm1hcCgocGFzY2FsTmFtZSkgPT4gewogICAgICAgIHJldHVybiBwYXNjYWxOYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgcGFzY2FsTmFtZS5zbGljZSgxKTsKICAgICAgfSk7CiAgICAgIGNvbnNvbGUubG9nKGBGb3VuZCAke2x1Y2lkZUljb25zTGlzdC5sZW5ndGh9IEx1Y2lkZSBpY29uc2ApOwogICAgICBpZiAobHVjaWRlSWNvbnNMaXN0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgIGNvbnNvbGUubG9nKCJUcnlpbmcgYWx0ZXJuYXRpdmUgYXBwcm9hY2ggdG8gZmluZCBMdWNpZGUgaWNvbnMiKTsKICAgICAgICBpZiAoaWNvbnNBbmRBbGlhc2VzX2V4cG9ydHMpIHsKICAgICAgICAgIGNvbnN0IGljb25Tb3VyY2UgPSBpY29uc0FuZEFsaWFzZXNfZXhwb3J0cyB8fCB7fTsKICAgICAgICAgIGx1Y2lkZUljb25zTGlzdC5wdXNoKC4uLk9iamVjdC5rZXlzKGljb25Tb3VyY2UpKTsKICAgICAgICAgIGNvbnNvbGUubG9nKGBGb3VuZCAke2x1Y2lkZUljb25zTGlzdC5sZW5ndGh9IGljb25zIHZpYSBhbHRlcm5hdGl2ZSBtZXRob2RgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgY29weUFsbEljb25OYW1lcyA9ICgpID0+IHsKICAgICAgICBjb25zdCBmYUljb25zTGlzdCA9IGZhSWNvbnMzLm1hcCgobmFtZSkgPT4gYGZhOiR7bmFtZX1gKTsKICAgICAgICBjb25zdCBsdWNpZGVJY29uc0xpc3RQcmVmaXhlZCA9IGx1Y2lkZUljb25zTGlzdC5tYXAoKG5hbWUpID0+IGBsdWNpZGU6JHtuYW1lfWApOwogICAgICAgIGNvbnN0IGFsbEljb25zID0gWy4uLmZhSWNvbnNMaXN0LCAuLi5sdWNpZGVJY29uc0xpc3RQcmVmaXhlZF07CiAgICAgICAgY29uc3QgdGV4dFRvQ29weSA9IGFsbEljb25zLmpvaW4oIlxuIik7CiAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dFRvQ29weSkudGhlbigoKSA9PiB7CiAgICAgICAgICBjb25zdCBjdXJyZW50RXZlbnQgPSB3aW5kb3cuZXZlbnQ7CiAgICAgICAgICBjb25zdCBidXR0b24gPSBjdXJyZW50RXZlbnQuY3VycmVudFRhcmdldDsKICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVGV4dCA9IGJ1dHRvbi50ZXh0Q29udGVudDsKICAgICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IGBcdTI3MTMgQ29waWVkICR7YWxsSWNvbnMubGVuZ3RofSBpY29uIG5hbWVzIWA7CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gb3JpZ2luYWxUZXh0OwogICAgICAgICAgfSwgMmUzKTsKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgY29uc3Qgc2VhcmNoSWNvbnMgPSAoZXZlbnQpID0+IHsKICAgICAgICBjb25zdCBzZWFyY2hUZXJtID0gZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpOwogICAgICAgIGNvbnN0IGRlbW9Db250YWluZXIgPSBldmVudC50YXJnZXQuY2xvc2VzdCgiLmRlbW9Db250YWluZXIiKTsKICAgICAgICBjb25zdCBjb250YWluZXJzID0gZGVtb0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCIuaWNvbkNvbnRhaW5lciIpOwogICAgICAgIGNvbnRhaW5lcnMuZm9yRWFjaCgoY29udGFpbmVyKSA9PiB7CiAgICAgICAgICBjb25zdCBpY29uTmFtZSA9IGNvbnRhaW5lci5nZXRBdHRyaWJ1dGUoImRhdGEtbmFtZSIpOwogICAgICAgICAgaWYgKHNlYXJjaFRlcm0gPT09ICIiKSB7CiAgICAgICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCJoaWRkZW4iKTsKICAgICAgICAgIH0gZWxzZSBpZiAoaWNvbk5hbWUgJiYgaWNvbk5hbWUuaW5jbHVkZXMoc2VhcmNoVGVybSkpIHsKICAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGRlbW9Db250YWluZXIucXVlcnlTZWxlY3RvckFsbCgiLnNlY3Rpb24tY29udGFpbmVyIikuZm9yRWFjaCgoc2VjdGlvbikgPT4gewogICAgICAgICAgY29uc3QgdmlzaWJsZUljb25zID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCIuaWNvbkNvbnRhaW5lcjpub3QoLmhpZGRlbikiKS5sZW5ndGg7CiAgICAgICAgICBjb25zdCBjb3VudEVsZW1lbnQgPSBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3IoIi5pY29uLWNvdW50Iik7CiAgICAgICAgICBpZiAoY291bnRFbGVtZW50KSB7CiAgICAgICAgICAgIGNvbnN0IHRvdGFsSWNvbnNDb3VudCA9IHNlY3Rpb24uY2xhc3NMaXN0LmNvbnRhaW5zKCJmYS1zZWN0aW9uIikgPyBmYUljb25zMy5sZW5ndGggOiBsdWNpZGVJY29uc0xpc3QubGVuZ3RoOwogICAgICAgICAgICBjb3VudEVsZW1lbnQudGV4dENvbnRlbnQgPSB2aXNpYmxlSWNvbnMgPT09IHRvdGFsSWNvbnNDb3VudCA/IGAke3RvdGFsSWNvbnNDb3VudH0gaWNvbnNgIDogYCR7dmlzaWJsZUljb25zfSBvZiAke3RvdGFsSWNvbnNDb3VudH0gaWNvbnNgOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9OwogICAgICBjb25zdCBjb3B5SWNvbk5hbWUgPSAoaWNvbk5hbWVUb0NvcHksIHR5cGU1KSA9PiB7CiAgICAgICAgY29uc3QgdGV4dFRvQ29weSA9IGAke3R5cGU1fToke2ljb25OYW1lVG9Db3B5fWA7CiAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dFRvQ29weSkudGhlbigoKSA9PiB7CiAgICAgICAgICBjb25zdCBjdXJyZW50RXZlbnQgPSB3aW5kb3cuZXZlbnQ7CiAgICAgICAgICBjb25zdCBjdXJyZW50VGFyZ2V0ID0gY3VycmVudEV2ZW50LmN1cnJlbnRUYXJnZXQ7CiAgICAgICAgICBjb25zdCB0b29sdGlwID0gY3VycmVudFRhcmdldC5xdWVyeVNlbGVjdG9yKCIuY29weS10b29sdGlwIik7CiAgICAgICAgICBpZiAodG9vbHRpcCkgewogICAgICAgICAgICB0b29sdGlwLnRleHRDb250ZW50ID0gIkNvcGllZCEiOwogICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICB0b29sdGlwLnRleHRDb250ZW50ID0gIkNsaWNrIHRvIGNvcHkiOwogICAgICAgICAgICB9LCAyZTMpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9OwogICAgICByZXR1cm4gYjJgCiAgPHN0eWxlPgogICAgLmRlbW9Db250YWluZXIgewogICAgICB3aWR0aDogMTAwJTsKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICBiYWNrZ3JvdW5kOiAjMTExMTExOwogICAgICBwYWRkaW5nOiAyMHB4OwogICAgICBmb250LXNpemU6IDMwcHg7CiAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICJTZWdvZSBVSSIsIFJvYm90bywgT3h5Z2VuLVNhbnMsIFVidW50dSwgQ2FudGFyZWxsLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwogICAgfQogICAgCiAgICAuc2VhcmNoLWNvbnRhaW5lciB7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBnYXA6IDEwcHg7CiAgICB9CiAgICAKICAgICNpY29uU2VhcmNoIHsKICAgICAgZmxleDogMTsKICAgICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICBiYWNrZ3JvdW5kOiAjMjIyOwogICAgICBjb2xvcjogI2ZmZjsKICAgICAgYm9yZGVyOiAxcHggc29saWQgIzMzMzsKICAgIH0KICAgIAogICAgI2ljb25TZWFyY2g6Zm9jdXMgewogICAgICBvdXRsaW5lOiBub25lOwogICAgICBib3JkZXItY29sb3I6ICNlNDAwMmI7CiAgICB9CiAgICAKICAgIC5jb3B5LWFsbC1idXR0b24gewogICAgICBwYWRkaW5nOiAxMnB4IDIwcHg7CiAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgYm9yZGVyOiBub25lOwogICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgIGJhY2tncm91bmQ6ICNlNDAwMmI7CiAgICAgIGNvbG9yOiAjZmZmOwogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzOwogICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgfQogICAgCiAgICAuY29weS1hbGwtYnV0dG9uOmhvdmVyIHsKICAgICAgYmFja2dyb3VuZDogI2M0MDAxYjsKICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwogICAgfQogICAgCiAgICAuY29weS1hbGwtYnV0dG9uOmFjdGl2ZSB7CiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgIH0KICAgIAogICAgZGVlcy1pY29uIHsKICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKICAgICAgY29sb3I6ICNmZmZmZmY7CiAgICB9CgogICAgLmljb25Db250YWluZXIgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBwYWRkaW5nOiAyMHB4IDE2cHggMHB4IDE2cHg7CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMzMzMzMzM7CiAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgfQogICAgCiAgICAuaWNvbkNvbnRhaW5lcjpob3ZlciB7CiAgICAgIGJhY2tncm91bmQtY29sb3I6ICMyMjI7CiAgICB9CgogICAgLmljb25OYW1lIHsKICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIGNvbG9yOiAjY2NjOwogICAgICBiYWNrZ3JvdW5kOiAjMzMzMzMzOwogICAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgICAgbWFyZ2luLWxlZnQ6IC0xNnB4OwogICAgICBtYXJnaW4tcmlnaHQ6IC0xNnB4OwogICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgbWF4LXdpZHRoOiAxMjBweDsKICAgICAgYm9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7CiAgICB9CgogICAgLnNlY3Rpb24tdGl0bGUgewogICAgICB3aWR0aDogMTAwJTsKICAgICAgY29sb3I6ICNmZmZmZmY7CiAgICAgIGZvbnQtc2l6ZTogMjRweDsKICAgICAgbWFyZ2luOiAyMHB4IDA7CiAgICAgIHBhZGRpbmctYm90dG9tOiAxMHB4OwogICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzMzMzMzMzsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgfQogICAgCiAgICAuYXBpLW5vdGUgewogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGNvbG9yOiAjZTQwMDJiOwogICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICBwYWRkaW5nOiAxMHB4OwogICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTQwMDJiOwogICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjI4LCAwLCA0MywgMC4xKTsKICAgIH0KICAgIAogICAgLmljb24tY291bnQgewogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGNvbG9yOiAjODg4OwogICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICBiYWNrZ3JvdW5kOiAjMjIyOwogICAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgICAgYm9yZGVyLXJhZGl1czogMjBweDsKICAgIH0KICAgIAogICAgLmljb25zLWdyaWQgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgfQogICAgCiAgICAuc2VjdGlvbi1jb250YWluZXIgewogICAgICB3aWR0aDogMTAwJTsKICAgICAgbWFyZ2luLWJvdHRvbTogMzBweDsKICAgIH0KICAgIAogICAgLmNvcHktdG9vbHRpcCB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgYmFja2dyb3VuZDogIzMzMzsKICAgICAgY29sb3I6IHdoaXRlOwogICAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICBmb250LXNpemU6IDEycHg7CiAgICAgIHRvcDogLTMwcHg7CiAgICAgIG9wYWNpdHk6IDA7CiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zczsKICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB9CiAgICAKICAgIC5pY29uQ29udGFpbmVyOmhvdmVyIC5jb3B5LXRvb2x0aXAgewogICAgICBvcGFjaXR5OiAxOwogICAgfQoKICAgIC5pY29uQ29udGFpbmVyOmhvdmVyIGRlZXMtaWNvbiB7CiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTsKICAgIH0KICAgIAogICAgLmhpZGRlbiB7CiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KICA8L3N0eWxlPgogIAogIDxkaXYgY2xhc3M9ImRlbW9Db250YWluZXIiPgogICAgPGRpdiBjbGFzcz0ic2VhcmNoLWNvbnRhaW5lciI+CiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaWNvblNlYXJjaCIgcGxhY2Vob2xkZXI9IlNlYXJjaCBpY29ucy4uLiIgQGlucHV0PSR7c2VhcmNoSWNvbnN9PgogICAgICA8YnV0dG9uIGNsYXNzPSJjb3B5LWFsbC1idXR0b24iIEBjbGljaz0ke2NvcHlBbGxJY29uTmFtZXN9PvCfk4sgQ29weSBBbGwgSWNvbiBOYW1lczwvYnV0dG9uPgogICAgPC9kaXY+CiAgICAKICAgIDxkaXYgY2xhc3M9ImFwaS1ub3RlIj4KICAgICAgTmV3IEFQSTogVXNlIDxjb2RlPmljb249ImZhOmljb25OYW1lIjwvY29kZT4gb3IgPGNvZGU+aWNvbj0ibHVjaWRlOmljb25OYW1lIjwvY29kZT4gaW5zdGVhZCBvZiA8Y29kZT5pY29uRkE8L2NvZGU+LiAKICAgICAgQ2xpY2sgYW55IGljb24gdG8gY29weSBpdHMgbmV3IGZvcm1hdCB0byBjbGlwYm9hcmQuCiAgICA8L2Rpdj4KICAgIAogICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1jb250YWluZXIgZmEtc2VjdGlvbiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPgogICAgICAgIEZvbnRBd2Vzb21lIEljb25zCiAgICAgICAgPHNwYW4gY2xhc3M9Imljb24tY291bnQiPiR7ZmFJY29uczMubGVuZ3RofSBpY29uczwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9Imljb25zLWdyaWQiPgogICAgICAgICR7ZmFJY29uczMubWFwKChpY29uTmFtZSkgPT4gewogICAgICAgIGNvbnN0IHByZWZpeGVkTmFtZSA9IGBmYToke2ljb25OYW1lfWA7CiAgICAgICAgcmV0dXJuIGIyYAogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imljb25Db250YWluZXIgZmEtaWNvbiIgZGF0YS1uYW1lPSR7aWNvbk5hbWUudG9Mb3dlckNhc2UoKX0gQGNsaWNrPSR7KCkgPT4gY29weUljb25OYW1lKGljb25OYW1lLCAiZmEiKX0+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7cHJlZml4ZWROYW1lfSBpY29uU2l6ZT0iMjQiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaWNvbk5hbWUiPmZhOiR7aWNvbk5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29weS10b29sdGlwIj5DbGljayB0byBjb3B5PC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgOwogICAgICB9KX0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWNvbnRhaW5lciBsdWNpZGUtc2VjdGlvbiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPgogICAgICAgIEx1Y2lkZSBJY29ucwogICAgICAgIDxzcGFuIGNsYXNzPSJpY29uLWNvdW50Ij4ke2x1Y2lkZUljb25zTGlzdC5sZW5ndGh9IGljb25zPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iaWNvbnMtZ3JpZCI+CiAgICAgICAgJHtsdWNpZGVJY29uc0xpc3QubWFwKChpY29uTmFtZSkgPT4gewogICAgICAgIGNvbnN0IHByZWZpeGVkTmFtZSA9IGBsdWNpZGU6JHtpY29uTmFtZX1gOwogICAgICAgIHJldHVybiBiMmAKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpY29uQ29udGFpbmVyIGx1Y2lkZS1pY29uIiBkYXRhLW5hbWU9JHtpY29uTmFtZS50b0xvd2VyQ2FzZSgpfSBAY2xpY2s9JHsoKSA9PiBjb3B5SWNvbk5hbWUoaWNvbk5hbWUsICJsdWNpZGUiKX0+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7cHJlZml4ZWROYW1lfSBpY29uU2l6ZT0iMjQiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaWNvbk5hbWUiPmx1Y2lkZToke2ljb25OYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvcHktdG9vbHRpcCI+Q2xpY2sgdG8gY29weTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYDsKICAgICAgfSl9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC9kaXY+CiAgYDsKICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC11dGlsaXR5L2RlZXMtaWNvbi9kZWVzLWljb24uanMKZnVuY3Rpb24gbGltaXRDYWNoZVNpemUoKSB7CiAgaWYgKGljb25DYWNoZS5zaXplID4gTUFYX0NBQ0hFX1NJWkUpIHsKICAgIGNvbnN0IGtleXNUb0RlbGV0ZSA9IEFycmF5LmZyb20oaWNvbkNhY2hlLmtleXMoKSkuc2xpY2UoMCwgTUFYX0NBQ0hFX1NJWkUgLyA1KTsKICAgIGtleXNUb0RlbGV0ZS5mb3JFYWNoKChrZXkyKSA9PiBpY29uQ2FjaGUuZGVsZXRlKGtleTIpKTsKICB9Cn0KdmFyIF9fZXNEZWNvcmF0ZTQsIF9fcnVuSW5pdGlhbGl6ZXJzNSwgZmFJY29uczIsIGljb25zNCwgaWNvbkNhY2hlLCBNQVhfQ0FDSEVfU0laRSwgRGVlc0ljb247CnZhciBpbml0X2RlZXNfaWNvbiA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXV0aWxpdHkvZGVlcy1pY29uL2RlZXMtaWNvbi5qcyIoKSB7CiAgICBpbml0X2Rpc3RfdHMzMCgpOwogICAgaW5pdF9kaXN0X3RzMjkoKTsKICAgIGluaXRfdGhlbWUoKTsKICAgIGluaXRfZm9udGF3ZXNvbWVfc3ZnX2NvcmUoKTsKICAgIGluaXRfZnJlZV9icmFuZHNfc3ZnX2ljb25zKCk7CiAgICBpbml0X2ZyZWVfcmVndWxhcl9zdmdfaWNvbnMoKTsKICAgIGluaXRfZnJlZV9zb2xpZF9zdmdfaWNvbnMoKTsKICAgIGluaXRfZGVlc19pY29uX2RlbW8oKTsKICAgIGluaXRfbHVjaWRlKCk7CiAgICBpbml0X2x1Y2lkZSgpOwogICAgX19lc0RlY29yYXRlNCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgICAgIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgICAgICByZXR1cm4gZjg7CiAgICAgIH0KICAgICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICAgICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogICAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICAgICAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgICAgIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICAgICAgdmFyIGNvbnRleHQyID0ge307CiAgICAgICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICAgICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICAgICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogICAgICBkb25lID0gdHJ1ZTsKICAgIH07CiAgICBfX3J1bkluaXRpYWxpemVyczUgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogICAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICAgICAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgICAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwogICAgfTsKICAgIGZhSWNvbnMyID0gewogICAgICAvLyBub3JtYWwKICAgICAgYXJyb3dSaWdodDogZmFBcnJvd1JpZ2h0LAogICAgICBhcnJvd1VwUmlnaHRGcm9tU3F1YXJlOiBmYUFycm93VXBSaWdodEZyb21TcXVhcmUsCiAgICAgIGJlbGw6IGZhQmVsbDIsCiAgICAgIGJ1ZzogZmFCdWcsCiAgICAgIGJ1aWxkaW5nOiBmYUJ1aWxkaW5nMiwKICAgICAgY2FyZXRMZWZ0OiBmYUNhcmV0TGVmdCwKICAgICAgY2FyZXRSaWdodDogZmFDYXJldFJpZ2h0LAogICAgICBjaGVjazogZmFDaGVjaywKICAgICAgY2lyY2xlSW5mbzogZmFDaXJjbGVJbmZvLAogICAgICBjaXJjbGVDaGVjazogZmFDaXJjbGVDaGVjaywKICAgICAgY2lyY2xlQ2hlY2tTb2xpZDogZmFDaXJjbGVDaGVjazIsCiAgICAgIGNpcmNsZVhtYXJrOiBmYUNpcmNsZVhtYXJrLAogICAgICBjaXJjbGVYbWFya1NvbGlkOiBmYUNpcmNsZVhtYXJrMiwKICAgICAgY2xvY2tSb3RhdGVMZWZ0OiBmYUNsb2NrUm90YXRlTGVmdCwKICAgICAgY29weTogZmFDb3B5LAogICAgICBjb3B5U29saWQ6IGZhQ29weTIsCiAgICAgIGRlc2t0b3A6IGZhRGVza3RvcCwKICAgICAgZXllOiBmYUV5ZTIsCiAgICAgIGV5ZVNsYXNoOiBmYUV5ZVNsYXNoMiwKICAgICAgZmlsZUludm9pY2U6IGZhRmlsZUludm9pY2UsCiAgICAgIGZpbGVJbnZvaWNlRG9sbGVyOiBmYUZpbGVJbnZvaWNlRG9sbGFyLAogICAgICBnZWFyOiBmYUdlYXIsCiAgICAgIGdyaXA6IGZhR3JpcCwKICAgICAgbWFnbmlmeWluZ0dsYXNzOiBmYU1hZ25pZnlpbmdHbGFzcywKICAgICAgbWVzc2FnZTogZmFNZXNzYWdlLAogICAgICBtZXNzYWdlU29saWQ6IGZhTWVzc2FnZTIsCiAgICAgIG1vbmV5Q2hlY2tEb2xsYXI6IGZhTW9uZXlDaGVja0RvbGxhciwKICAgICAgbXVnSG90OiBmYU11Z0hvdCwKICAgICAgbWludXM6IGZhTWludXMsCiAgICAgIG5ldHdvcmtXaXJlZDogZmFOZXR3b3JrV2lyZWQsCiAgICAgIHBhcGVyY2xpcDogZmFQYXBlcmNsaXAsCiAgICAgIHBhc3RlOiBmYVBhc3RlLAogICAgICBwYXN0ZVNvbGlkOiBmYVBhc3RlMiwKICAgICAgcGVuVG9TcXVhcmU6IGZhUGVuVG9TcXVhcmUyLAogICAgICBwbHVzOiBmYVBsdXMsCiAgICAgIHJlY2VpcHQ6IGZhUmVjZWlwdCwKICAgICAgcnNzOiBmYVJzcywKICAgICAgc2hhcmU6IGZhU2hhcmUsCiAgICAgIHN1bjogZmFTdW4sCiAgICAgIHN1blNvbGlkOiBmYVN1bjIsCiAgICAgIHRlcm1pbmFsOiBmYVRlcm1pbmFsLAogICAgICB0cmFzaDogZmFUcmFzaCwKICAgICAgdHJhc2hTb2xpZDogZmFUcmFzaCwKICAgICAgdHJhc2hDYW46IGZhVHJhc2hDYW4sCiAgICAgIHRyYXNoQ2FuU29saWQ6IGZhVHJhc2hDYW4yLAogICAgICB1c2VyczogZmFVc2VycywKICAgICAgd2FsbGV0OiBmYVdhbGxldCwKICAgICAgeG1hcms6IGZhWG1hcmssCiAgICAgIC8vIGJyYW5kcwogICAgICBmYWNlYm9vazogZmFGYWNlYm9vaywKICAgICAgZ29vZ2xlOiBmYUdvb2dsZSwKICAgICAgaW5zdGFncmFtOiBmYUluc3RhZ3JhbSwKICAgICAgbGlua2VkaW46IGZhTGlua2VkaW4sCiAgICAgIG1lZGl1bTogZmFNZWRpdW0sCiAgICAgIHNsYWNrOiBmYVNsYWNrSGFzaCwKICAgICAgdGlrdG9rOiBmYVRpa3RvaywKICAgICAgdHdpdHRlcjogZmFUd2l0dGVyCiAgICB9OwogICAgaWNvbnM0ID0gewogICAgICBmYTogZmFJY29uczIKICAgIH07CiAgICBpY29uQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgTUFYX0NBQ0hFX1NJWkUgPSA1MDA7CiAgICBEZWVzSWNvbiA9ICgoKSA9PiB7CiAgICAgIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtaWNvbiIpXTsKICAgICAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgICAgIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX2NsYXNzVGhpczsKICAgICAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgICAgIGxldCBfaWNvbkZBX2RlY29yYXRvcnM7CiAgICAgIGxldCBfaWNvbkZBX2luaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX2ljb25GQV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX2ljb25fZGVjb3JhdG9yczsKICAgICAgbGV0IF9pY29uX2luaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX2ljb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9pY29uU2l6ZV9kZWNvcmF0b3JzOwogICAgICBsZXQgX2ljb25TaXplX2luaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX2ljb25TaXplX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgICAgIGxldCBfY29sb3JfZGVjb3JhdG9yczsKICAgICAgbGV0IF9jb2xvcl9pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9jb2xvcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX3N0cm9rZVdpZHRoX2RlY29yYXRvcnM7CiAgICAgIGxldCBfc3Ryb2tlV2lkdGhfaW5pdGlhbGl6ZXJzID0gW107CiAgICAgIGxldCBfc3Ryb2tlV2lkdGhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICAgICAgdmFyIERlZXNJY29uMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgICAgIHN0YXRpYyB7CiAgICAgICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgICAgICB9CiAgICAgICAgc3RhdGljIHsKICAgICAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICAgICAgX2ljb25GQV9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgICBjb252ZXJ0ZXI6IHsKICAgICAgICAgICAgICAvLyBDb252ZXJ0IGF0dHJpYnV0ZSBzdHJpbmcgdG8gcHJvcGVydHkgKGZvciByZWZsZWN0ZWQgYXR0cmlidXRlcykKICAgICAgICAgICAgICBmcm9tQXR0cmlidXRlOiAodmFsdWUyKSA9PiB2YWx1ZTIsCiAgICAgICAgICAgICAgLy8gQ29udmVydCBwcm9wZXJ0eSB0byBhdHRyaWJ1dGUgKGZvciByZWZsZWN0aW9uKQogICAgICAgICAgICAgIHRvQXR0cmlidXRlOiAodmFsdWUyKSA9PiB2YWx1ZTIKICAgICAgICAgICAgfQogICAgICAgICAgfSldOwogICAgICAgICAgX2ljb25fZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgICAgY29udmVydGVyOiB7CiAgICAgICAgICAgICAgZnJvbUF0dHJpYnV0ZTogKHZhbHVlMikgPT4gdmFsdWUyLAogICAgICAgICAgICAgIHRvQXR0cmlidXRlOiAodmFsdWUyKSA9PiB2YWx1ZTIKICAgICAgICAgICAgfQogICAgICAgICAgfSldOwogICAgICAgICAgX2ljb25TaXplX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICAgICAgX2NvbG9yX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICAgICAgX3N0cm9rZVdpZHRoX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICAgICAgX19lc0RlY29yYXRlNCh0aGlzLCBudWxsLCBfaWNvbkZBX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImljb25GQSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaWNvbkZBIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmljb25GQSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICAgICAgb2JqLmljb25GQSA9IHZhbHVlMjsKICAgICAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaWNvbkZBX2luaXRpYWxpemVycywgX2ljb25GQV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgICAgICBfX2VzRGVjb3JhdGU0KHRoaXMsIG51bGwsIF9pY29uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImljb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImljb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaWNvbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICAgICAgb2JqLmljb24gPSB2YWx1ZTI7CiAgICAgICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2ljb25faW5pdGlhbGl6ZXJzLCBfaWNvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgICAgICBfX2VzRGVjb3JhdGU0KHRoaXMsIG51bGwsIF9pY29uU2l6ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpY29uU2l6ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaWNvblNpemUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaWNvblNpemUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgICAgIG9iai5pY29uU2l6ZSA9IHZhbHVlMjsKICAgICAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaWNvblNpemVfaW5pdGlhbGl6ZXJzLCBfaWNvblNpemVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgX19lc0RlY29yYXRlNCh0aGlzLCBudWxsLCBfY29sb3JfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29sb3IiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNvbG9yIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNvbG9yLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgICAgICBvYmouY29sb3IgPSB2YWx1ZTI7CiAgICAgICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbG9yX2luaXRpYWxpemVycywgX2NvbG9yX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgICAgIF9fZXNEZWNvcmF0ZTQodGhpcywgbnVsbCwgX3N0cm9rZVdpZHRoX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInN0cm9rZVdpZHRoIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzdHJva2VXaWR0aCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zdHJva2VXaWR0aCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICAgICAgb2JqLnN0cm9rZVdpZHRoID0gdmFsdWUyOwogICAgICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zdHJva2VXaWR0aF9pbml0aWFsaXplcnMsIF9zdHJva2VXaWR0aF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgICAgICBfX2VzRGVjb3JhdGU0KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgICAgIERlZXNJY29uMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMjsKICAgICAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiVXRpbGl0eSJdOwogICAgICAgICNpY29uRkFfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNSh0aGlzLCBfaWNvbkZBX2luaXRpYWxpemVycywgdm9pZCAwKTsKICAgICAgICAvKioKICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGBpY29uYCBwcm9wZXJ0eSBpbnN0ZWFkIHdpdGggZm9ybWF0ICJmYTppY29uTmFtZSIgb3IgImx1Y2lkZTppY29uTmFtZSIKICAgICAgICAgKi8KICAgICAgICBnZXQgaWNvbkZBKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuI2ljb25GQV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgICAgIH0KICAgICAgICBzZXQgaWNvbkZBKHZhbHVlMikgewogICAgICAgICAgdGhpcy4jaWNvbkZBX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgICNpY29uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1KHRoaXMsIF9pY29uRkFfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUodGhpcywgX2ljb25faW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgcHJlZmVycmVkIGljb24gcHJvcGVydHkuIFVzZSBmb3JtYXQgImZhOmljb25OYW1lIiBvciAibHVjaWRlOmljb25OYW1lIgogICAgICAgICAqIEV4YW1wbGVzOiAiZmE6Y2hlY2siLCAibHVjaWRlOm1lbnUiCiAgICAgICAgICovCiAgICAgICAgZ2V0IGljb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4jaWNvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgICAgIH0KICAgICAgICBzZXQgaWNvbih2YWx1ZTIpIHsKICAgICAgICAgIHRoaXMuI2ljb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgICAgICB9CiAgICAgICAgI2ljb25TaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1KHRoaXMsIF9pY29uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1KHRoaXMsIF9pY29uU2l6ZV9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgICAgIGdldCBpY29uU2l6ZSgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiNpY29uU2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgICAgIH0KICAgICAgICBzZXQgaWNvblNpemUodmFsdWUyKSB7CiAgICAgICAgICB0aGlzLiNpY29uU2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgICAjY29sb3JfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczUodGhpcywgX2ljb25TaXplX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1KHRoaXMsIF9jb2xvcl9pbml0aWFsaXplcnMsICJjdXJyZW50Q29sb3IiKSk7CiAgICAgICAgZ2V0IGNvbG9yKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuI2NvbG9yX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICAgICAgfQogICAgICAgIHNldCBjb2xvcih2YWx1ZTIpIHsKICAgICAgICAgIHRoaXMuI2NvbG9yX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgICNzdHJva2VXaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNSh0aGlzLCBfY29sb3JfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUodGhpcywgX3N0cm9rZVdpZHRoX2luaXRpYWxpemVycywgMikpOwogICAgICAgIGdldCBzdHJva2VXaWR0aCgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiNzdHJva2VXaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgICAgIH0KICAgICAgICBzZXQgc3Ryb2tlV2lkdGgodmFsdWUyKSB7CiAgICAgICAgICB0aGlzLiNzdHJva2VXaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgICAvLyBGb3IgdHJhY2tpbmcgd2hlbiB3ZSBuZWVkIHRvIHJlLXJlbmRlcgogICAgICAgIGxhc3RJY29uID0gKF9fcnVuSW5pdGlhbGl6ZXJzNSh0aGlzLCBfc3Ryb2tlV2lkdGhfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgICAgICBsYXN0SWNvblNpemUgPSBudWxsOwogICAgICAgIGxhc3RDb2xvciA9IG51bGw7CiAgICAgICAgbGFzdFN0cm9rZVdpZHRoID0gbnVsbDsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICBkb210b29sc19lbGVtZW50YmFzaWNfZXhwb3J0cy5zZXR1cCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBlZmZlY3RpdmUgaWNvbiB2YWx1ZSwgc3VwcG9ydGluZyBib3RoIHRoZSBuZXcgYGljb25gIHByb3BlcnR5CiAgICAgICAgICogYW5kIHRoZSBsZWdhY3kgYGljb25GQWAgcHJvcGVydHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCiAgICAgICAgICogUHJlZmVycyBgaWNvbmAgaWYgYm90aCBhcmUgc2V0LgogICAgICAgICAqLwogICAgICAgIGdldEVmZmVjdGl2ZUljb24oKSB7CiAgICAgICAgICBpZiAodGhpcy5pY29uKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmljb247CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy5pY29uRkEpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaWNvbkZBLnN0YXJ0c1dpdGgoImx1Y2lkZToiKSkgewogICAgICAgICAgICAgIHJldHVybiB0aGlzLmljb25GQTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYGZhOiR7dGhpcy5pY29uRkF9YDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQYXJzZXMgYW4gaWNvbiBzdHJpbmcgaW50byBpdHMgdHlwZSBhbmQgbmFtZSBwYXJ0cwogICAgICAgICAqIEBwYXJhbSBpY29uU3RyIFRoZSBpY29uIHN0cmluZyBpbiBmb3JtYXQgInR5cGU6bmFtZSIKICAgICAgICAgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCB0eXBlIGFuZCBuYW1lIHByb3BlcnRpZXMKICAgICAgICAgKi8KICAgICAgICBwYXJzZUljb25TdHJpbmcoaWNvblN0cikgewogICAgICAgICAgY29uc3QgbG93ZXJTdHIgPSBpY29uU3RyLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICBpZiAobG93ZXJTdHIuc3RhcnRzV2l0aCgiZmE6IikpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0eXBlOiAiZmEiLAogICAgICAgICAgICAgIG5hbWU6IGljb25TdHIuc3Vic3RyaW5nKDMpCiAgICAgICAgICAgICAgLy8gUmVtb3ZlICdmYTonIHByZWZpeAogICAgICAgICAgICB9OwogICAgICAgICAgfSBlbHNlIGlmIChsb3dlclN0ci5zdGFydHNXaXRoKCJsdWNpZGU6IikpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0eXBlOiAibHVjaWRlIiwKICAgICAgICAgICAgICBuYW1lOiBpY29uU3RyLnN1YnN0cmluZyg3KQogICAgICAgICAgICAgIC8vIFJlbW92ZSAnbHVjaWRlOicgcHJlZml4CiAgICAgICAgICAgIH07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHR5cGU6ICJsdWNpZGUiLAogICAgICAgICAgICAgIG5hbWU6IGljb25TdHIKICAgICAgICAgICAgfTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmVuZGVyTHVjaWRlSWNvbihpY29uTmFtZSkgewogICAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgbHVjaWRlOiR7aWNvbk5hbWV9OiR7dGhpcy5pY29uU2l6ZX06JHt0aGlzLmNvbG9yfToke3RoaXMuc3Ryb2tlV2lkdGh9YDsKICAgICAgICAgIGlmIChpY29uQ2FjaGUuaGFzKGNhY2hlS2V5KSkgewogICAgICAgICAgICByZXR1cm4gaWNvbkNhY2hlLmdldChjYWNoZUtleSkgfHwgIiI7CiAgICAgICAgICB9CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBwYXNjYWxDYXNlTmFtZSA9IGljb25OYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgaWNvbk5hbWUuc2xpY2UoMSk7CiAgICAgICAgICAgIGlmICghbHVjaWRlX2V4cG9ydHNbcGFzY2FsQ2FzZU5hbWVdKSB7CiAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBMdWNpZGUgaWNvbiAnJHtwYXNjYWxDYXNlTmFtZX0nIG5vdCBmb3VuZCBpbiBsdWNpZGVJY29ucyBvYmplY3RgKTsKICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qgc3ZnRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQyKGx1Y2lkZV9leHBvcnRzW3Bhc2NhbENhc2VOYW1lXSwgewogICAgICAgICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLAogICAgICAgICAgICAgIHNpemU6IHRoaXMuaWNvblNpemUsCiAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3Ryb2tlV2lkdGgKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmICghc3ZnRWxlbWVudCkgewogICAgICAgICAgICAgIGNvbnNvbGUud2FybihgY3JlYXRlRWxlbWVudCByZXR1cm5lZCBlbXB0eSByZXN1bHQgZm9yICR7cGFzY2FsQ2FzZU5hbWV9YCk7CiAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHN2Z0VsZW1lbnQub3V0ZXJIVE1MOwogICAgICAgICAgICBpY29uQ2FjaGUuc2V0KGNhY2hlS2V5LCByZXN1bHQpOwogICAgICAgICAgICBsaW1pdENhY2hlU2l6ZSgpOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgcmVuZGVyaW5nIEx1Y2lkZSBpY29uICR7aWNvbk5hbWV9OmAsIGVycm9yKTsKICAgICAgICAgICAgcmV0dXJuIGA8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IiR7dGhpcy5pY29uU2l6ZX0iIGhlaWdodD0iJHt0aGlzLmljb25TaXplfSIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiR7dGhpcy5jb2xvcn0iIHN0cm9rZS13aWR0aD0iJHt0aGlzLnN0cm9rZVdpZHRofSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4KICAgICAgICA8dGV4dCB4PSI1MCUiIHk9IjUwJSIgZm9udC1zaXplPSI2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBkb21pbmFudC1iYXNlbGluZT0ibWlkZGxlIiBmaWxsPSIke3RoaXMuY29sb3J9Ij4ke2ljb25OYW1lfTwvdGV4dD4KICAgICAgPC9zdmc+YDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIC8qIEltcHJvdmUgcmVuZGVyaW5nIHBlcmZvcm1hbmNlICovCiAgICAgICNpY29uQ29udGFpbmVyIHN2ZyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07IC8qIEhlbHBzIHdpdGggYW5pbWF0aW9ucyAqLwogICAgICAgIGNvbnRhaW46IHN0cmljdDsgLyogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uICovCiAgICAgIH0KICAgIGAKICAgICAgICBdOwogICAgICAgIHJlbmRlcigpIHsKICAgICAgICAgIHJldHVybiBiMmAKICAgICAgJHtkb210b29sc19lbGVtZW50YmFzaWNfZXhwb3J0cy5zdHlsZXN9CiAgICAgIDxzdHlsZT4KICAgICAgICAjaWNvbkNvbnRhaW5lciB7CiAgICAgICAgICB3aWR0aDogJHt0aGlzLmljb25TaXplfXB4OwogICAgICAgICAgaGVpZ2h0OiAke3RoaXMuaWNvblNpemV9cHg7CiAgICAgICAgfQogICAgICA8L3N0eWxlPgogICAgICA8ZGl2IGlkPSJpY29uQ29udGFpbmVyIj48L2Rpdj4KICAgIGA7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZWQoKSB7CiAgICAgICAgICBpZiAoIXRoaXMuaWNvblNpemUpIHsKICAgICAgICAgICAgdGhpcy5pY29uU2l6ZSA9IHBhcnNlSW50KGdsb2JhbFRoaXMuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5mb250U2l6ZS5yZXBsYWNlKC9cRC9nLCAiIikpOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgZWZmZWN0aXZlSWNvbiA9IHRoaXMuZ2V0RWZmZWN0aXZlSWNvbigpOwogICAgICAgICAgaWYgKHRoaXMubGFzdEljb24gPT09IGVmZmVjdGl2ZUljb24gJiYgdGhpcy5sYXN0SWNvblNpemUgPT09IHRoaXMuaWNvblNpemUgJiYgdGhpcy5sYXN0Q29sb3IgPT09IHRoaXMuY29sb3IgJiYgdGhpcy5sYXN0U3Ryb2tlV2lkdGggPT09IHRoaXMuc3Ryb2tlV2lkdGgpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5sYXN0SWNvbiA9IGVmZmVjdGl2ZUljb247CiAgICAgICAgICB0aGlzLmxhc3RJY29uU2l6ZSA9IHRoaXMuaWNvblNpemU7CiAgICAgICAgICB0aGlzLmxhc3RDb2xvciA9IHRoaXMuY29sb3I7CiAgICAgICAgICB0aGlzLmxhc3RTdHJva2VXaWR0aCA9IHRoaXMuc3Ryb2tlV2lkdGg7CiAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIiNpY29uQ29udGFpbmVyIik7CiAgICAgICAgICBpZiAoIWNvbnRhaW5lciB8fCAhZWZmZWN0aXZlSWNvbikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgeyB0eXBlOiB0eXBlNSwgbmFtZSB9ID0gdGhpcy5wYXJzZUljb25TdHJpbmcoZWZmZWN0aXZlSWNvbik7CiAgICAgICAgICAgIGlmICh0eXBlNSA9PT0gImx1Y2lkZSIpIHsKICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gIiI7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHBhc2NhbENhc2VOYW1lID0gbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7CiAgICAgICAgICAgICAgICBpZiAobHVjaWRlX2V4cG9ydHNbcGFzY2FsQ2FzZU5hbWVdKSB7CiAgICAgICAgICAgICAgICAgIGNvbnN0IHN2Z0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50MihsdWNpZGVfZXhwb3J0c1twYXNjYWxDYXNlTmFtZV0sIHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogdGhpcy5jb2xvciwKICAgICAgICAgICAgICAgICAgICBzaXplOiB0aGlzLmljb25TaXplLAogICAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnN0cm9rZVdpZHRoCiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICBpZiAoc3ZnRWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzdmdFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGNyZWF0ZSBlbGVtZW50IGZvciAke3Bhc2NhbENhc2VOYW1lfWApOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciByZW5kZXJpbmcgTHVjaWRlIGljb246YCwgZXJyb3IpOwogICAgICAgICAgICAgICAgY29uc3QgaWNvbkh0bWwgPSB0aGlzLnJlbmRlckx1Y2lkZUljb24obmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoaWNvbkh0bWwpIHsKICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGljb25IdG1sOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjb25zdCBmYUljb24gPSBpY29uczQuZmFbbmFtZV07CiAgICAgICAgICAgICAgaWYgKGZhSWNvbikgewogICAgICAgICAgICAgICAgY29uc3QgaWNvbkh0bWwgPSBpY29uMihmYUljb24pLmh0bWxbMF07CiAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaWNvbkh0bWw7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgRm9udEF3ZXNvbWUgaWNvbiBub3QgZm91bmQ6ICR7bmFtZX1gKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHVwZGF0aW5nIGljb24gJHtlZmZlY3RpdmVJY29ufTpgLCBlcnJvcik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIENsZWFuIHVwIHJlc291cmNlcyB3aGVuIGVsZW1lbnQgaXMgcmVtb3ZlZAogICAgICAgIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICAgIHRoaXMubGFzdEljb24gPSBudWxsOwogICAgICAgICAgdGhpcy5sYXN0SWNvblNpemUgPSBudWxsOwogICAgICAgICAgdGhpcy5sYXN0Q29sb3IgPSBudWxsOwogICAgICAgICAgdGhpcy5sYXN0U3Ryb2tlV2lkdGggPSBudWxsOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgewogICAgICAgICAgX19ydW5Jbml0aWFsaXplcnM1KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJldHVybiBEZWVzSWNvbjIgPSBfY2xhc3NUaGlzOwogICAgfSkoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9zZXJ2aWNlcy92ZXJzaW9ucy5qcwp2YXIgQ0ROX1ZFUlNJT05TLCBDRE5fQkFTRTsKdmFyIGluaXRfdmVyc2lvbnMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvc2VydmljZXMvdmVyc2lvbnMuanMiKCkgewogICAgQ0ROX1ZFUlNJT05TID0gewogICAgICB4dGVybTogIjUuMy4wIiwKICAgICAgeHRlcm1BZGRvbkZpdDogIjAuOC4wIiwKICAgICAgeHRlcm1BZGRvblNlYXJjaDogIjAuMTMuMCIsCiAgICAgIGhpZ2hsaWdodEpzOiAiMTEuMTEuMSIsCiAgICAgIGFwZXhjaGFydHM6ICI1LjEwLjMiLAogICAgICB0aXB0YXA6ICIyLjI3LjIiLAogICAgICBmb250YXdlc29tZTogIjcuMi4wIgogICAgfTsKICAgIENETl9CQVNFID0gImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0iOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL3NlcnZpY2VzL0RlZXNTZXJ2aWNlTGliTG9hZGVyLmpzCnZhciBEZWVzU2VydmljZUxpYkxvYWRlcjsKdmFyIGluaXRfRGVlc1NlcnZpY2VMaWJMb2FkZXIgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvc2VydmljZXMvRGVlc1NlcnZpY2VMaWJMb2FkZXIuanMiKCkgewogICAgaW5pdF92ZXJzaW9ucygpOwogICAgRGVlc1NlcnZpY2VMaWJMb2FkZXIgPSBjbGFzcyBfRGVlc1NlcnZpY2VMaWJMb2FkZXIgewogICAgICBzdGF0aWMgaW5zdGFuY2U7CiAgICAgIC8vIENhY2hlZCBsaWJyYXJ5IHJlZmVyZW5jZXMKICAgICAgeHRlcm1MaWIgPSBudWxsOwogICAgICB4dGVybUZpdEFkZG9uTGliID0gbnVsbDsKICAgICAgeHRlcm1TZWFyY2hBZGRvbkxpYiA9IG51bGw7CiAgICAgIGhpZ2hsaWdodEpzTGliID0gbnVsbDsKICAgICAgYXBleENoYXJ0c0xpYiA9IG51bGw7CiAgICAgIHRpcHRhcExpYiA9IG51bGw7CiAgICAgIC8vIExvYWRpbmcgcHJvbWlzZXMgdG8gcHJldmVudCBkdXBsaWNhdGUgY29uY3VycmVudCBsb2FkcwogICAgICB4dGVybUxvYWRpbmdQcm9taXNlID0gbnVsbDsKICAgICAgeHRlcm1GaXRBZGRvbkxvYWRpbmdQcm9taXNlID0gbnVsbDsKICAgICAgeHRlcm1TZWFyY2hBZGRvbkxvYWRpbmdQcm9taXNlID0gbnVsbDsKICAgICAgaGlnaGxpZ2h0SnNMb2FkaW5nUHJvbWlzZSA9IG51bGw7CiAgICAgIGFwZXhDaGFydHNMb2FkaW5nUHJvbWlzZSA9IG51bGw7CiAgICAgIHRpcHRhcExvYWRpbmdQcm9taXNlID0gbnVsbDsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIERlZXNTZXJ2aWNlTGliTG9hZGVyCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7CiAgICAgICAgaWYgKCFfRGVlc1NlcnZpY2VMaWJMb2FkZXIuaW5zdGFuY2UpIHsKICAgICAgICAgIF9EZWVzU2VydmljZUxpYkxvYWRlci5pbnN0YW5jZSA9IG5ldyBfRGVlc1NlcnZpY2VMaWJMb2FkZXIoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9EZWVzU2VydmljZUxpYkxvYWRlci5pbnN0YW5jZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogTG9hZCB4dGVybSB0ZXJtaW5hbCBlbXVsYXRvciBmcm9tIENETgogICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB4dGVybSBtb2R1bGUgd2l0aCBUZXJtaW5hbCBjbGFzcwogICAgICAgKi8KICAgICAgYXN5bmMgbG9hZFh0ZXJtKCkgewogICAgICAgIGlmICh0aGlzLnh0ZXJtTGliKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy54dGVybUxpYjsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMueHRlcm1Mb2FkaW5nUHJvbWlzZSkgewogICAgICAgICAgcmV0dXJuIHRoaXMueHRlcm1Mb2FkaW5nUHJvbWlzZTsKICAgICAgICB9CiAgICAgICAgdGhpcy54dGVybUxvYWRpbmdQcm9taXNlID0gKGFzeW5jICgpID0+IHsKICAgICAgICAgIGNvbnN0IHVybCA9IGAke0NETl9CQVNFfS94dGVybUAke0NETl9WRVJTSU9OUy54dGVybX0vK2VzbWA7CiAgICAgICAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQoCiAgICAgICAgICAgIC8qIEB2aXRlLWlnbm9yZSAqLwogICAgICAgICAgICB1cmwKICAgICAgICAgICk7CiAgICAgICAgICBhd2FpdCB0aGlzLmluamVjdFh0ZXJtU3R5bGVzKCk7CiAgICAgICAgICB0aGlzLnh0ZXJtTGliID0gewogICAgICAgICAgICBUZXJtaW5hbDogbW9kdWxlLlRlcm1pbmFsCiAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIHRoaXMueHRlcm1MaWI7CiAgICAgICAgfSkoKTsKICAgICAgICByZXR1cm4gdGhpcy54dGVybUxvYWRpbmdQcm9taXNlOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBMb2FkIHh0ZXJtLWFkZG9uLWZpdCBmcm9tIENETgogICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBGaXRBZGRvbiBjbGFzcwogICAgICAgKi8KICAgICAgYXN5bmMgbG9hZFh0ZXJtRml0QWRkb24oKSB7CiAgICAgICAgaWYgKHRoaXMueHRlcm1GaXRBZGRvbkxpYikgewogICAgICAgICAgcmV0dXJuIHRoaXMueHRlcm1GaXRBZGRvbkxpYjsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMueHRlcm1GaXRBZGRvbkxvYWRpbmdQcm9taXNlKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy54dGVybUZpdEFkZG9uTG9hZGluZ1Byb21pc2U7CiAgICAgICAgfQogICAgICAgIHRoaXMueHRlcm1GaXRBZGRvbkxvYWRpbmdQcm9taXNlID0gKGFzeW5jICgpID0+IHsKICAgICAgICAgIGNvbnN0IHVybCA9IGAke0NETl9CQVNFfS94dGVybS1hZGRvbi1maXRAJHtDRE5fVkVSU0lPTlMueHRlcm1BZGRvbkZpdH0vK2VzbWA7CiAgICAgICAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQoCiAgICAgICAgICAgIC8qIEB2aXRlLWlnbm9yZSAqLwogICAgICAgICAgICB1cmwKICAgICAgICAgICk7CiAgICAgICAgICB0aGlzLnh0ZXJtRml0QWRkb25MaWIgPSB7CiAgICAgICAgICAgIEZpdEFkZG9uOiBtb2R1bGUuRml0QWRkb24KICAgICAgICAgIH07CiAgICAgICAgICByZXR1cm4gdGhpcy54dGVybUZpdEFkZG9uTGliOwogICAgICAgIH0pKCk7CiAgICAgICAgcmV0dXJuIHRoaXMueHRlcm1GaXRBZGRvbkxvYWRpbmdQcm9taXNlOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBMb2FkIHh0ZXJtLWFkZG9uLXNlYXJjaCBmcm9tIENETgogICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBTZWFyY2hBZGRvbiBjbGFzcwogICAgICAgKi8KICAgICAgYXN5bmMgbG9hZFh0ZXJtU2VhcmNoQWRkb24oKSB7CiAgICAgICAgaWYgKHRoaXMueHRlcm1TZWFyY2hBZGRvbkxpYikgewogICAgICAgICAgcmV0dXJuIHRoaXMueHRlcm1TZWFyY2hBZGRvbkxpYjsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMueHRlcm1TZWFyY2hBZGRvbkxvYWRpbmdQcm9taXNlKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy54dGVybVNlYXJjaEFkZG9uTG9hZGluZ1Byb21pc2U7CiAgICAgICAgfQogICAgICAgIHRoaXMueHRlcm1TZWFyY2hBZGRvbkxvYWRpbmdQcm9taXNlID0gKGFzeW5jICgpID0+IHsKICAgICAgICAgIGNvbnN0IHVybCA9IGAke0NETl9CQVNFfS94dGVybS1hZGRvbi1zZWFyY2hAJHtDRE5fVkVSU0lPTlMueHRlcm1BZGRvblNlYXJjaH0vK2VzbWA7CiAgICAgICAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQoCiAgICAgICAgICAgIC8qIEB2aXRlLWlnbm9yZSAqLwogICAgICAgICAgICB1cmwKICAgICAgICAgICk7CiAgICAgICAgICB0aGlzLnh0ZXJtU2VhcmNoQWRkb25MaWIgPSB7CiAgICAgICAgICAgIFNlYXJjaEFkZG9uOiBtb2R1bGUuU2VhcmNoQWRkb24KICAgICAgICAgIH07CiAgICAgICAgICByZXR1cm4gdGhpcy54dGVybVNlYXJjaEFkZG9uTGliOwogICAgICAgIH0pKCk7CiAgICAgICAgcmV0dXJuIHRoaXMueHRlcm1TZWFyY2hBZGRvbkxvYWRpbmdQcm9taXNlOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBJbmplY3QgeHRlcm0gQ1NTIHN0eWxlcyBpbnRvIHRoZSBkb2N1bWVudCBoZWFkCiAgICAgICAqLwogICAgICBhc3luYyBpbmplY3RYdGVybVN0eWxlcygpIHsKICAgICAgICBjb25zdCBzdHlsZUlkID0gInh0ZXJtLWNkbi1zdHlsZXMiOwogICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzdHlsZUlkKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBjc3NVcmwgPSBgJHtDRE5fQkFTRX0veHRlcm1AJHtDRE5fVkVSU0lPTlMueHRlcm19L2Nzcy94dGVybS5jc3NgOwogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goY3NzVXJsKTsKICAgICAgICBjb25zdCBjc3NUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpOwogICAgICAgIGNvbnN0IHh0ZXJtTWVhc3VyZW1lbnRGaXggPSBgCi8qIEZpeCB4dGVybS5qcyBXaWR0aENhY2hlIG1lYXN1cmVtZW50IGNvbnRhaW5lciBjYXVzaW5nIGhvcml6b250YWwgc2Nyb2xsYmFyICovCi8qIHh0ZXJtIGNyZWF0ZXMgdGhpcyBvbiBkb2N1bWVudC5ib2R5IC0gbW92ZSBpdCBvZmYtc2NyZWVuIGhvcml6b250YWxseSB0b28gKi8KYm9keSA+IGRpdltzdHlsZSo9InRvcDogLTUwMDAwcHgiXVtzdHlsZSo9IndpZHRoOiA1MDAwMHB4Il0gewogIGxlZnQ6IC01MDAwMHB4ICFpbXBvcnRhbnQ7Cn0KYDsKICAgICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgICAgc3R5bGUuaWQgPSBzdHlsZUlkOwogICAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gY3NzVGV4dCArIHh0ZXJtTWVhc3VyZW1lbnRGaXg7CiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIExvYWQgaGlnaGxpZ2h0LmpzIHN5bnRheCBoaWdobGlnaHRlciBmcm9tIENETgogICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBoaWdobGlnaHQuanMgQVBJCiAgICAgICAqLwogICAgICBhc3luYyBsb2FkSGlnaGxpZ2h0SnMoKSB7CiAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0SnNMaWIpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodEpzTGliOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRKc0xvYWRpbmdQcm9taXNlKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRKc0xvYWRpbmdQcm9taXNlOwogICAgICAgIH0KICAgICAgICB0aGlzLmhpZ2hsaWdodEpzTG9hZGluZ1Byb21pc2UgPSAoYXN5bmMgKCkgPT4gewogICAgICAgICAgY29uc3QgdXJsID0gYCR7Q0ROX0JBU0V9L2hpZ2hsaWdodC5qc0Ake0NETl9WRVJTSU9OUy5oaWdobGlnaHRKc30vK2VzbWA7CiAgICAgICAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQoCiAgICAgICAgICAgIC8qIEB2aXRlLWlnbm9yZSAqLwogICAgICAgICAgICB1cmwKICAgICAgICAgICk7CiAgICAgICAgICB0aGlzLmhpZ2hsaWdodEpzTGliID0gbW9kdWxlLmRlZmF1bHQ7CiAgICAgICAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRKc0xpYjsKICAgICAgICB9KSgpOwogICAgICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodEpzTG9hZGluZ1Byb21pc2U7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIExvYWQgQXBleENoYXJ0cyBjaGFydGluZyBsaWJyYXJ5IGZyb20gQ0ROCiAgICAgICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIEFwZXhDaGFydHMgY29uc3RydWN0b3IKICAgICAgICovCiAgICAgIGFzeW5jIGxvYWRBcGV4Q2hhcnRzKCkgewogICAgICAgIGlmICh0aGlzLmFwZXhDaGFydHNMaWIpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmFwZXhDaGFydHNMaWI7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmFwZXhDaGFydHNMb2FkaW5nUHJvbWlzZSkgewogICAgICAgICAgcmV0dXJuIHRoaXMuYXBleENoYXJ0c0xvYWRpbmdQcm9taXNlOwogICAgICAgIH0KICAgICAgICB0aGlzLmFwZXhDaGFydHNMb2FkaW5nUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7CiAgICAgICAgICBjb25zdCB1cmwgPSBgJHtDRE5fQkFTRX0vYXBleGNoYXJ0c0Ake0NETl9WRVJTSU9OUy5hcGV4Y2hhcnRzfS8rZXNtYDsKICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IGltcG9ydCgKICAgICAgICAgICAgLyogQHZpdGUtaWdub3JlICovCiAgICAgICAgICAgIHVybAogICAgICAgICAgKTsKICAgICAgICAgIHRoaXMuYXBleENoYXJ0c0xpYiA9IG1vZHVsZS5kZWZhdWx0OwogICAgICAgICAgcmV0dXJuIHRoaXMuYXBleENoYXJ0c0xpYjsKICAgICAgICB9KSgpOwogICAgICAgIHJldHVybiB0aGlzLmFwZXhDaGFydHNMb2FkaW5nUHJvbWlzZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogTG9hZCBUaXB0YXAgcmljaCB0ZXh0IGVkaXRvciBhbmQgZXh0ZW5zaW9ucyBmcm9tIENETgogICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBUaXB0YXAgYnVuZGxlIHdpdGggRWRpdG9yIGFuZCBleHRlbnNpb25zCiAgICAgICAqLwogICAgICBhc3luYyBsb2FkVGlwdGFwKCkgewogICAgICAgIGlmICh0aGlzLnRpcHRhcExpYikgewogICAgICAgICAgcmV0dXJuIHRoaXMudGlwdGFwTGliOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy50aXB0YXBMb2FkaW5nUHJvbWlzZSkgewogICAgICAgICAgcmV0dXJuIHRoaXMudGlwdGFwTG9hZGluZ1Byb21pc2U7CiAgICAgICAgfQogICAgICAgIHRoaXMudGlwdGFwTG9hZGluZ1Byb21pc2UgPSAoYXN5bmMgKCkgPT4gewogICAgICAgICAgY29uc3QgdmVyc2lvbjIgPSBDRE5fVkVSU0lPTlMudGlwdGFwOwogICAgICAgICAgY29uc3QgW2NvcmVNb2R1bGUsIHN0YXJ0ZXJLaXRNb2R1bGUsIHVuZGVybGluZU1vZHVsZSwgdGV4dEFsaWduTW9kdWxlLCBsaW5rTW9kdWxlLCB0eXBvZ3JhcGh5TW9kdWxlXSA9IGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgICAgICAgaW1wb3J0KAogICAgICAgICAgICAgIC8qIEB2aXRlLWlnbm9yZSAqLwogICAgICAgICAgICAgIGAke0NETl9CQVNFfS9AdGlwdGFwL2NvcmVAJHt2ZXJzaW9uMn0vK2VzbWAKICAgICAgICAgICAgKSwKICAgICAgICAgICAgaW1wb3J0KAogICAgICAgICAgICAgIC8qIEB2aXRlLWlnbm9yZSAqLwogICAgICAgICAgICAgIGAke0NETl9CQVNFfS9AdGlwdGFwL3N0YXJ0ZXIta2l0QCR7dmVyc2lvbjJ9Lytlc21gCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGltcG9ydCgKICAgICAgICAgICAgICAvKiBAdml0ZS1pZ25vcmUgKi8KICAgICAgICAgICAgICBgJHtDRE5fQkFTRX0vQHRpcHRhcC9leHRlbnNpb24tdW5kZXJsaW5lQCR7dmVyc2lvbjJ9Lytlc21gCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGltcG9ydCgKICAgICAgICAgICAgICAvKiBAdml0ZS1pZ25vcmUgKi8KICAgICAgICAgICAgICBgJHtDRE5fQkFTRX0vQHRpcHRhcC9leHRlbnNpb24tdGV4dC1hbGlnbkAke3ZlcnNpb24yfS8rZXNtYAogICAgICAgICAgICApLAogICAgICAgICAgICBpbXBvcnQoCiAgICAgICAgICAgICAgLyogQHZpdGUtaWdub3JlICovCiAgICAgICAgICAgICAgYCR7Q0ROX0JBU0V9L0B0aXB0YXAvZXh0ZW5zaW9uLWxpbmtAJHt2ZXJzaW9uMn0vK2VzbWAKICAgICAgICAgICAgKSwKICAgICAgICAgICAgaW1wb3J0KAogICAgICAgICAgICAgIC8qIEB2aXRlLWlnbm9yZSAqLwogICAgICAgICAgICAgIGAke0NETl9CQVNFfS9AdGlwdGFwL2V4dGVuc2lvbi10eXBvZ3JhcGh5QCR7dmVyc2lvbjJ9Lytlc21gCiAgICAgICAgICAgICkKICAgICAgICAgIF0pOwogICAgICAgICAgdGhpcy50aXB0YXBMaWIgPSB7CiAgICAgICAgICAgIEVkaXRvcjogY29yZU1vZHVsZS5FZGl0b3IsCiAgICAgICAgICAgIFN0YXJ0ZXJLaXQ6IHN0YXJ0ZXJLaXRNb2R1bGUuZGVmYXVsdCB8fCBzdGFydGVyS2l0TW9kdWxlLlN0YXJ0ZXJLaXQsCiAgICAgICAgICAgIFVuZGVybGluZTogdW5kZXJsaW5lTW9kdWxlLmRlZmF1bHQgfHwgdW5kZXJsaW5lTW9kdWxlLlVuZGVybGluZSwKICAgICAgICAgICAgVGV4dEFsaWduOiB0ZXh0QWxpZ25Nb2R1bGUuZGVmYXVsdCB8fCB0ZXh0QWxpZ25Nb2R1bGUuVGV4dEFsaWduLAogICAgICAgICAgICBMaW5rOiBsaW5rTW9kdWxlLmRlZmF1bHQgfHwgbGlua01vZHVsZS5MaW5rLAogICAgICAgICAgICBUeXBvZ3JhcGh5OiB0eXBvZ3JhcGh5TW9kdWxlLmRlZmF1bHQgfHwgdHlwb2dyYXBoeU1vZHVsZS5UeXBvZ3JhcGh5CiAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIHRoaXMudGlwdGFwTGliOwogICAgICAgIH0pKCk7CiAgICAgICAgcmV0dXJuIHRoaXMudGlwdGFwTG9hZGluZ1Byb21pc2U7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFByZWxvYWQgbXVsdGlwbGUgbGlicmFyaWVzIGluIHBhcmFsbGVsCiAgICAgICAqIFVzZWZ1bCBmb3Igd2FybWluZyB0aGUgY2FjaGUgYmVmb3JlIGNvbXBvbmVudHMgYXJlIHJlbmRlcmVkCiAgICAgICAqLwogICAgICBhc3luYyBwcmVsb2FkQWxsKCkgewogICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgICAgIHRoaXMubG9hZFh0ZXJtKCksCiAgICAgICAgICB0aGlzLmxvYWRYdGVybUZpdEFkZG9uKCksCiAgICAgICAgICB0aGlzLmxvYWRYdGVybVNlYXJjaEFkZG9uKCksCiAgICAgICAgICB0aGlzLmxvYWRIaWdobGlnaHRKcygpLAogICAgICAgICAgdGhpcy5sb2FkQXBleENoYXJ0cygpLAogICAgICAgICAgdGhpcy5sb2FkVGlwdGFwKCkKICAgICAgICBdKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQ2hlY2sgaWYgYSBzcGVjaWZpYyBsaWJyYXJ5IGlzIGFscmVhZHkgbG9hZGVkCiAgICAgICAqLwogICAgICBpc0xvYWRlZChsaWJyYXJ5MikgewogICAgICAgIHN3aXRjaCAobGlicmFyeTIpIHsKICAgICAgICAgIGNhc2UgInh0ZXJtIjoKICAgICAgICAgICAgcmV0dXJuIHRoaXMueHRlcm1MaWIgIT09IG51bGw7CiAgICAgICAgICBjYXNlICJ4dGVybUZpdEFkZG9uIjoKICAgICAgICAgICAgcmV0dXJuIHRoaXMueHRlcm1GaXRBZGRvbkxpYiAhPT0gbnVsbDsKICAgICAgICAgIGNhc2UgInh0ZXJtU2VhcmNoQWRkb24iOgogICAgICAgICAgICByZXR1cm4gdGhpcy54dGVybVNlYXJjaEFkZG9uTGliICE9PSBudWxsOwogICAgICAgICAgY2FzZSAiaGlnaGxpZ2h0SnMiOgogICAgICAgICAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRKc0xpYiAhPT0gbnVsbDsKICAgICAgICAgIGNhc2UgImFwZXhDaGFydHMiOgogICAgICAgICAgICByZXR1cm4gdGhpcy5hcGV4Q2hhcnRzTGliICE9PSBudWxsOwogICAgICAgICAgY2FzZSAidGlwdGFwIjoKICAgICAgICAgICAgcmV0dXJuIHRoaXMudGlwdGFwTGliICE9PSBudWxsOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9zZXJ2aWNlcy9pbmRleC5qcwp2YXIgaW5pdF9zZXJ2aWNlcyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9zZXJ2aWNlcy9pbmRleC5qcyIoKSB7CiAgICBpbml0X0RlZXNTZXJ2aWNlTGliTG9hZGVyKCk7CiAgICBpbml0X3ZlcnNpb25zKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1mZWVkYmFjay9kZWVzLWFjdGlvbmJhci9kZWVzLWFjdGlvbmJhci5qcwp2YXIgX19lc0RlY29yYXRlNjEsIF9fcnVuSW5pdGlhbGl6ZXJzNjIsIERlZXNBY3Rpb25iYXI7CnZhciBpbml0X2RlZXNfYWN0aW9uYmFyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZmVlZGJhY2svZGVlcy1hY3Rpb25iYXIvZGVlcy1hY3Rpb25iYXIuanMiKCkgewogICAgaW5pdF9kaXN0X3RzMzAoKTsKICAgIGluaXRfdGhlbWUoKTsKICAgIGluaXRfZGVlc19pY29uKCk7CiAgICBfX2VzRGVjb3JhdGU2MSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgICAgIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgICAgICByZXR1cm4gZjg7CiAgICAgIH0KICAgICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICAgICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogICAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICAgICAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgICAgIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICAgICAgdmFyIGNvbnRleHQyID0ge307CiAgICAgICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICAgICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICAgICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogICAgICBkb25lID0gdHJ1ZTsKICAgIH07CiAgICBfX3J1bkluaXRpYWxpemVyczYyID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICAgICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgICAgIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICAgICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogICAgICB9CiAgICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKICAgIH07CiAgICBEZWVzQWN0aW9uYmFyID0gKCgpID0+IHsKICAgICAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1hY3Rpb25iYXIiKV07CiAgICAgIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogICAgICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9jbGFzc1RoaXM7CiAgICAgIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogICAgICBsZXQgX2N1cnJlbnRCYXJfZGVjb3JhdG9yczsKICAgICAgbGV0IF9jdXJyZW50QmFyX2luaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX2N1cnJlbnRCYXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF90aW1lUmVtYWluaW5nX2RlY29yYXRvcnM7CiAgICAgIGxldCBfdGltZVJlbWFpbmluZ19pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF90aW1lUmVtYWluaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgICAgIGxldCBfcHJvZ3Jlc3NQZXJjZW50X2RlY29yYXRvcnM7CiAgICAgIGxldCBfcHJvZ3Jlc3NQZXJjZW50X2luaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX3Byb2dyZXNzUGVyY2VudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX2lzVmlzaWJsZV9kZWNvcmF0b3JzOwogICAgICBsZXQgX2lzVmlzaWJsZV9pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9pc1Zpc2libGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICAgICAgdmFyIERlZXNBY3Rpb25iYXIyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICAgICAgc3RhdGljIHsKICAgICAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgewogICAgICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgICAgICBfY3VycmVudEJhcl9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICAgICAgX3RpbWVSZW1haW5pbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgICAgIF9wcm9ncmVzc1BlcmNlbnRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgICAgIF9pc1Zpc2libGVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgICAgIF9fZXNEZWNvcmF0ZTYxKHRoaXMsIG51bGwsIF9jdXJyZW50QmFyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImN1cnJlbnRCYXIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImN1cnJlbnRCYXIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3VycmVudEJhciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICAgICAgb2JqLmN1cnJlbnRCYXIgPSB2YWx1ZTI7CiAgICAgICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2N1cnJlbnRCYXJfaW5pdGlhbGl6ZXJzLCBfY3VycmVudEJhcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgICAgICBfX2VzRGVjb3JhdGU2MSh0aGlzLCBudWxsLCBfdGltZVJlbWFpbmluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0aW1lUmVtYWluaW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0aW1lUmVtYWluaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRpbWVSZW1haW5pbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgICAgIG9iai50aW1lUmVtYWluaW5nID0gdmFsdWUyOwogICAgICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90aW1lUmVtYWluaW5nX2luaXRpYWxpemVycywgX3RpbWVSZW1haW5pbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgX19lc0RlY29yYXRlNjEodGhpcywgbnVsbCwgX3Byb2dyZXNzUGVyY2VudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwcm9ncmVzc1BlcmNlbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInByb2dyZXNzUGVyY2VudCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5wcm9ncmVzc1BlcmNlbnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgICAgIG9iai5wcm9ncmVzc1BlcmNlbnQgPSB2YWx1ZTI7CiAgICAgICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Byb2dyZXNzUGVyY2VudF9pbml0aWFsaXplcnMsIF9wcm9ncmVzc1BlcmNlbnRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgX19lc0RlY29yYXRlNjEodGhpcywgbnVsbCwgX2lzVmlzaWJsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc1Zpc2libGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImlzVmlzaWJsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc1Zpc2libGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgICAgIG9iai5pc1Zpc2libGUgPSB2YWx1ZTI7CiAgICAgICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzVmlzaWJsZV9pbml0aWFsaXplcnMsIF9pc1Zpc2libGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgX19lc0RlY29yYXRlNjEobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgRGVlc0FjdGlvbmJhcjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgICAgICB9CiAgICAgICAgLy8gU1RBVElDCiAgICAgICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkZlZWRiYWNrIiwgIk92ZXJsYXkiXTsKICAgICAgICBzdGF0aWMgZGVtbyA9ICgpID0+IHsKICAgICAgICAgIGNvbnN0IGdldEFjdGlvbmJhciA9IChlMTEpID0+IHsKICAgICAgICAgICAgY29uc3QgYnV0dG9uID0gZTExLmN1cnJlbnRUYXJnZXQ7CiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGJ1dHRvbi5jbG9zZXN0KCIuZGVtby1jb250YWluZXIiKTsKICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcj8ucXVlcnlTZWxlY3RvcigiZGVlcy1hY3Rpb25iYXIiKTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCBzaG93QWN0aW9uQmFyID0gYXN5bmMgKGUxMSkgPT4gewogICAgICAgICAgICBjb25zdCBhY3Rpb25iYXIgPSBnZXRBY3Rpb25iYXIoZTExKTsKICAgICAgICAgICAgaWYgKCFhY3Rpb25iYXIpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhY3Rpb25iYXIuc2hvdyh7CiAgICAgICAgICAgICAgbWVzc2FnZTogIkZpbGUgY2hhbmdlZCBleHRlcm5hbGx5LiBSZWxvYWQ/IiwKICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyIsCiAgICAgICAgICAgICAgaWNvbjogImx1Y2lkZTphbGVydFRyaWFuZ2xlIiwKICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICB7IGlkOiAicmVsb2FkIiwgbGFiZWw6ICJSZWxvYWQiLCBwcmltYXJ5OiB0cnVlIH0sCiAgICAgICAgICAgICAgICB7IGlkOiAiaWdub3JlIiwgbGFiZWw6ICJJZ25vcmUiIH0KICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgIHRpbWVvdXQ6IHsgZHVyYXRpb246IDVlMywgZGVmYXVsdEFjdGlvbklkOiAicmVsb2FkIiB9LAogICAgICAgICAgICAgIGRpc21pc3NpYmxlOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zb2xlLmxvZygiQWN0aW9uIGJhciByZXN1bHQ6IiwgcmVzdWx0KTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCBzaG93RXJyb3JCYXIgPSBhc3luYyAoZTExKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGFjdGlvbmJhciA9IGdldEFjdGlvbmJhcihlMTEpOwogICAgICAgICAgICBpZiAoIWFjdGlvbmJhcikKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFjdGlvbmJhci5zaG93KHsKICAgICAgICAgICAgICBtZXNzYWdlOiAiUHJvY2VzcyBmYWlsZWQgd2l0aCBleGl0IGNvZGUgMSIsCiAgICAgICAgICAgICAgdHlwZTogImVycm9yIiwKICAgICAgICAgICAgICBpY29uOiAibHVjaWRlOnhDaXJjbGUiLAogICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgIHsgaWQ6ICJyZXRyeSIsIGxhYmVsOiAiUmV0cnkiLCBwcmltYXJ5OiB0cnVlIH0sCiAgICAgICAgICAgICAgICB7IGlkOiAiZGlzbWlzcyIsIGxhYmVsOiAiRGlzbWlzcyIgfQogICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgdGltZW91dDogeyBkdXJhdGlvbjogMWU0LCBkZWZhdWx0QWN0aW9uSWQ6ICJkaXNtaXNzIiB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zb2xlLmxvZygiRXJyb3IgYmFyIHJlc3VsdDoiLCByZXN1bHQpOwogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHNob3dRdWVzdGlvbkJhciA9IGFzeW5jIChlMTEpID0+IHsKICAgICAgICAgICAgY29uc3QgYWN0aW9uYmFyID0gZ2V0QWN0aW9uYmFyKGUxMSk7CiAgICAgICAgICAgIGlmICghYWN0aW9uYmFyKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYWN0aW9uYmFyLnNob3coewogICAgICAgICAgICAgIG1lc3NhZ2U6ICJTYXZlIGNoYW5nZXMgYmVmb3JlIGNsb3Npbmc/IiwKICAgICAgICAgICAgICB0eXBlOiAicXVlc3Rpb24iLAogICAgICAgICAgICAgIGljb246ICJsdWNpZGU6aGVscENpcmNsZSIsCiAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgeyBpZDogInNhdmUiLCBsYWJlbDogIlNhdmUiLCBwcmltYXJ5OiB0cnVlIH0sCiAgICAgICAgICAgICAgICB7IGlkOiAiZGlzY2FyZCIsIGxhYmVsOiAiRGlzY2FyZCIgfSwKICAgICAgICAgICAgICAgIHsgaWQ6ICJjYW5jZWwiLCBsYWJlbDogIkNhbmNlbCIgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJRdWVzdGlvbiBiYXIgcmVzdWx0OiIsIHJlc3VsdCk7CiAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIGIyYAogICAgICA8c3R5bGU+CiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMzMzM7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIH0KICAgICAgICAuZGVtby1jb250ZW50IHsKICAgICAgICAgIGZsZXg6IDE7CiAgICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGdhcDogOHB4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgICAgfQogICAgICA8L3N0eWxlPgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICAgICAgPGRpdiBjbGFzcz0iZGVtby1jb250ZW50Ij4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2s9JHtzaG93QWN0aW9uQmFyfT5XYXJuaW5nPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2s9JHtzaG93RXJyb3JCYXJ9PkVycm9yPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2s9JHtzaG93UXVlc3Rpb25CYXJ9PlF1ZXN0aW9uPC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGVlcy1hY3Rpb25iYXI+PC9kZWVzLWFjdGlvbmJhcj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgICAgIH07CiAgICAgICAgLy8gUXVldWUgb2YgcGVuZGluZyBhY3Rpb24gYmFycwogICAgICAgIHF1ZXVlID0gW107CiAgICAgICAgI2N1cnJlbnRCYXJfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNjIodGhpcywgX2N1cnJlbnRCYXJfaW5pdGlhbGl6ZXJzLCBudWxsKTsKICAgICAgICAvLyBDdXJyZW50IGFjdGl2ZSBiYXIgc3RhdGUKICAgICAgICBnZXQgY3VycmVudEJhcigpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiNjdXJyZW50QmFyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICAgICAgfQogICAgICAgIHNldCBjdXJyZW50QmFyKHZhbHVlMikgewogICAgICAgICAgdGhpcy4jY3VycmVudEJhcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgICAjdGltZVJlbWFpbmluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjIodGhpcywgX2N1cnJlbnRCYXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczYyKHRoaXMsIF90aW1lUmVtYWluaW5nX2luaXRpYWxpemVycywgMCkpOwogICAgICAgIGdldCB0aW1lUmVtYWluaW5nKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuI3RpbWVSZW1haW5pbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgICAgICB9CiAgICAgICAgc2V0IHRpbWVSZW1haW5pbmcodmFsdWUyKSB7CiAgICAgICAgICB0aGlzLiN0aW1lUmVtYWluaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgICNwcm9ncmVzc1BlcmNlbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczYyKHRoaXMsIF90aW1lUmVtYWluaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2Mih0aGlzLCBfcHJvZ3Jlc3NQZXJjZW50X2luaXRpYWxpemVycywgMTAwKSk7CiAgICAgICAgZ2V0IHByb2dyZXNzUGVyY2VudCgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiNwcm9ncmVzc1BlcmNlbnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgICAgICB9CiAgICAgICAgc2V0IHByb2dyZXNzUGVyY2VudCh2YWx1ZTIpIHsKICAgICAgICAgIHRoaXMuI3Byb2dyZXNzUGVyY2VudF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgICAjaXNWaXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2Mih0aGlzLCBfcHJvZ3Jlc3NQZXJjZW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2Mih0aGlzLCBfaXNWaXNpYmxlX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgICAgICBnZXQgaXNWaXNpYmxlKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuI2lzVmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgICAgIH0KICAgICAgICBzZXQgaXNWaXNpYmxlKHZhbHVlMikgewogICAgICAgICAgdGhpcy4jaXNWaXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgIC8vIFRpbWVvdXQgaGFuZGxpbmcKICAgICAgICB0aW1lb3V0SW50ZXJ2YWwgPSAoX19ydW5Jbml0aWFsaXplcnM2Mih0aGlzLCBfaXNWaXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgbnVsbCk7CiAgICAgICAgY3VycmVudFJlc29sdmUgPSBudWxsOwogICAgICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgICAgICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC5hY3Rpb25iYXItaXRlbSB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDBmcjsKICAgICAgICB0cmFuc2l0aW9uOiBncmlkLXRlbXBsYXRlLXJvd3MgMC4ycyBlYXNlLW91dDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTYlKSIsICJoc2woMCAwJSAxMiUpIil9OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODglKSIsICJoc2woMCAwJSAyMCUpIil9OwogICAgICB9CgogICAgICA6aG9zdCgudmlzaWJsZSkgLmFjdGlvbmJhci1pdGVtIHsKICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDFmcjsKICAgICAgfQoKICAgICAgLmFjdGlvbmJhci1jb250ZW50IHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZS1vdXQ7CiAgICAgIH0KCiAgICAgIDpob3N0KC52aXNpYmxlKSAuYWN0aW9uYmFyLWNvbnRlbnQgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5wcm9ncmVzcy1iYXIgewogICAgICAgIGhlaWdodDogM3B4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5MCUpIiwgImhzbCgwIDAlIDE4JSkiKX07CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnByb2dyZXNzLWJhci1maWxsIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgMTAwJSA1MCUpIiwgImhzbCgyMTAgMTAwJSA2MCUpIil9OwogICAgICAgIHRyYW5zaXRpb246IHdpZHRoIDAuMXMgbGluZWFyOwogICAgICB9CgogICAgICAucHJvZ3Jlc3MtYmFyLWZpbGwud2FybmluZyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgzOCA5MiUgNTAlKSIsICJoc2woMzggOTIlIDU1JSkiKX07CiAgICAgIH0KCiAgICAgIC5wcm9ncmVzcy1iYXItZmlsbC5lcnJvciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcwJSA1MCUpIiwgImhzbCgwIDcwJSA1NSUpIil9OwogICAgICB9CgogICAgICAucHJvZ3Jlc3MtYmFyLWZpbGwucXVlc3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjcwIDcwJSA1MCUpIiwgImhzbCgyNzAgNzAlIDYwJSkiKX07CiAgICAgIH0KCiAgICAgIC5jb250ZW50IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDMycHg7CiAgICAgIH0KCiAgICAgIC5tZXNzYWdlLXNlY3Rpb24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgfQoKICAgICAgLm1lc3NhZ2UtaWNvbiB7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0MCUpIiwgImhzbCgwIDAlIDYwJSkiKX07CiAgICAgIH0KCiAgICAgIC5tZXNzYWdlLWljb24uaW5mbyB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDEwMCUgNDUlKSIsICJoc2woMjEwIDEwMCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLm1lc3NhZ2UtaWNvbi53YXJuaW5nIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgzOCA5MiUgNDUlKSIsICJoc2woMzggOTIlIDU1JSkiKX07CiAgICAgIH0KCiAgICAgIC5tZXNzYWdlLWljb24uZXJyb3IgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzAlIDUwJSkiLCAiaHNsKDAgNzAlIDU1JSkiKX07CiAgICAgIH0KCiAgICAgIC5tZXNzYWdlLWljb24ucXVlc3Rpb24gewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDI3MCA3MCUgNTAlKSIsICJoc2woMjcwIDcwJSA2MCUpIil9OwogICAgICB9CgogICAgICAubWVzc2FnZS10ZXh0IHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAyMCUpIiwgImhzbCgwIDAlIDg1JSkiKX07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CgogICAgICAuYWN0aW9ucy1zZWN0aW9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgICAgcGFkZGluZzogNHB4IDEwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbi5zZWNvbmRhcnkgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMzAlKSIsICJoc2woMCAwJSA3MCUpIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDgwJSkiLCAiaHNsKDAgMCUgMzAlKSIpfTsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idXR0b24uc2Vjb25kYXJ5OmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTIlKSIsICJoc2woMCAwJSAxOCUpIil9OwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbi5wcmltYXJ5IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCAxMDAlIDUwJSkiLCAiaHNsKDIxMCAxMDAlIDU1JSkiKX07CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbi5wcmltYXJ5OmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCAxMDAlIDQ1JSkiLCAiaHNsKDIxMCAxMDAlIDUwJSkiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uLnByaW1hcnkud2FybmluZyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgzOCA5MiUgNDUlKSIsICJoc2woMzggOTIlIDUwJSkiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uLnByaW1hcnkud2FybmluZzpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgzOCA5MiUgNDAlKSIsICJoc2woMzggOTIlIDQ1JSkiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uLnByaW1hcnkuZXJyb3IgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA3MCUgNTAlKSIsICJoc2woMCA3MCUgNTUlKSIpfTsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idXR0b24ucHJpbWFyeS5lcnJvcjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcwJSA0NSUpIiwgImhzbCgwIDcwJSA1MCUpIil9OwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbi5wcmltYXJ5LnF1ZXN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDI3MCA3MCUgNTAlKSIsICJoc2woMjcwIDcwJSA1NSUpIil9OwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbi5wcmltYXJ5LnF1ZXN0aW9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDI3MCA3MCUgNDUlKSIsICJoc2woMjcwIDcwJSA1MCUpIil9OwogICAgICB9CgogICAgICAuY291bnRkb3duIHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICAgIG1hcmdpbi1sZWZ0OiAycHg7CiAgICAgIH0KCiAgICAgIC5kaXNtaXNzLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNTAlKSIsICJoc2woMCAwJSA1MCUpIil9OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICB9CgogICAgICAuZGlzbWlzcy1idXR0b246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OCUpIiwgImhzbCgwIDAlIDIyJSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAzMCUpIiwgImhzbCgwIDAlIDcwJSkiKX07CiAgICAgIH0KICAgIGAKICAgICAgICBdOwogICAgICAgIHJlbmRlcigpIHsKICAgICAgICAgIGNvbnN0IGJhciA9IHRoaXMuY3VycmVudEJhcjsKICAgICAgICAgIGNvbnN0IHR5cGU1ID0gYmFyPy50eXBlIHx8ICJpbmZvIjsKICAgICAgICAgIGNvbnN0IGhhc1RpbWVvdXQgPSBiYXI/LnRpbWVvdXQgJiYgdGhpcy50aW1lUmVtYWluaW5nID4gMDsKICAgICAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iYWN0aW9uYmFyLWl0ZW0iPgogICAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbmJhci1jb250ZW50Ij4KICAgICAgICAgICR7YmFyID8gYjJgCiAgICAgICAgICAgICR7aGFzVGltZW91dCA/IGIyYAogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzLWJhciI+CiAgICAgICAgICAgICAgICA8ZGl2CiAgICAgICAgICAgICAgICAgIGNsYXNzPSJwcm9ncmVzcy1iYXItZmlsbCAke3R5cGU1fSIKICAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAke3RoaXMucHJvZ3Jlc3NQZXJjZW50fSUiCiAgICAgICAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZS1zZWN0aW9uIj4KICAgICAgICAgICAgICAgICR7YmFyLmljb24gPyBiMmAKICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJtZXNzYWdlLWljb24gJHt0eXBlNX0iCiAgICAgICAgICAgICAgICAgICAgLmljb249JHtiYXIuaWNvbn0KICAgICAgICAgICAgICAgICAgICBpY29uU2l6ZT0iMTYiCiAgICAgICAgICAgICAgICAgID48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtZXNzYWdlLXRleHQiPiR7YmFyLm1lc3NhZ2V9PC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbnMtc2VjdGlvbiI+CiAgICAgICAgICAgICAgICAke2Jhci5hY3Rpb25zLm1hcCgoYWN0aW9uKSA9PiB0aGlzLnJlbmRlckFjdGlvbkJ1dHRvbihhY3Rpb24sIGJhciwgaGFzVGltZW91dCkpfQogICAgICAgICAgICAgICAgJHtiYXIuZGlzbWlzc2libGUgPyBiMmAKICAgICAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJkaXNtaXNzLWJ1dHRvbiIKICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmhhbmRsZURpc21pc3MoKX0KICAgICAgICAgICAgICAgICAgICB0aXRsZT0iRGlzbWlzcyIKICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOngifSBpY29uU2l6ZT0iMTQiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgIDogIiJ9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgICAgICB9CiAgICAgICAgcmVuZGVyQWN0aW9uQnV0dG9uKGFjdGlvbiwgYmFyLCBoYXNUaW1lb3V0KSB7CiAgICAgICAgICBjb25zdCBpc1ByaW1hcnkgPSBhY3Rpb24ucHJpbWFyeTsKICAgICAgICAgIGNvbnN0IHR5cGU1ID0gYmFyLnR5cGUgfHwgImluZm8iOwogICAgICAgICAgY29uc3QgaXNEZWZhdWx0QWN0aW9uID0gYmFyLnRpbWVvdXQ/LmRlZmF1bHRBY3Rpb25JZCA9PT0gYWN0aW9uLmlkOwogICAgICAgICAgY29uc3Qgc2hvd0NvdW50ZG93biA9IGhhc1RpbWVvdXQgJiYgaXNEZWZhdWx0QWN0aW9uOwogICAgICAgICAgY29uc3Qgc2Vjb25kcyA9IE1hdGguY2VpbCh0aGlzLnRpbWVSZW1haW5pbmcgLyAxZTMpOwogICAgICAgICAgcmV0dXJuIGIyYAogICAgICA8YnV0dG9uCiAgICAgICAgY2xhc3M9ImFjdGlvbi1idXR0b24gJHtpc1ByaW1hcnkgPyBgcHJpbWFyeSAke3R5cGU1fWAgOiAic2Vjb25kYXJ5In0iCiAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5oYW5kbGVBY3Rpb24oYWN0aW9uLmlkLCBmYWxzZSl9CiAgICAgID4KICAgICAgICAke2FjdGlvbi5pY29uID8gYjJgCiAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7YWN0aW9uLmljb259IGljb25TaXplPSIxMiI+PC9kZWVzLWljb24+CiAgICAgICAgYCA6ICIifQogICAgICAgIDxzcGFuPiR7YWN0aW9uLmxhYmVsfTwvc3Bhbj4KICAgICAgICAke3Nob3dDb3VudGRvd24gPyBiMmAKICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb3VudGRvd24iPigke3NlY29uZHN9cyk8L3NwYW4+CiAgICAgICAgYCA6ICIifQogICAgICA8L2J1dHRvbj4KICAgIGA7CiAgICAgICAgfQogICAgICAgIC8vID09PT09PT09PT0gUHVibGljIEFQSSA9PT09PT09PT09CiAgICAgICAgLyoqCiAgICAgICAgICogU2hvdyBhbiBhY3Rpb24gYmFyIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuCiAgICAgICAgICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFuIGFjdGlvbiBpcyB0YWtlbi4KICAgICAgICAgKi8KICAgICAgICBhc3luYyBzaG93KG9wdGlvbnMpIHsKICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHsKICAgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKHsgb3B0aW9ucywgcmVzb2x2ZTogcmVzb2x2ZTIgfSk7CiAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50QmFyKSB7CiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUXVldWUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERpc21pc3MgdGhlIGN1cnJlbnQgYWN0aW9uIGJhciB3aXRob3V0IHRyaWdnZXJpbmcgYW55IGFjdGlvbi4KICAgICAgICAgKi8KICAgICAgICBkaXNtaXNzKCkgewogICAgICAgICAgdGhpcy5oYW5kbGVEaXNtaXNzKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENsZWFyIGFsbCBwZW5kaW5nIGFjdGlvbiBiYXJzIGluIHRoZSBxdWV1ZS4KICAgICAgICAgKi8KICAgICAgICBjbGVhclF1ZXVlKCkgewogICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMucXVldWUpIHsKICAgICAgICAgICAgaXRlbS5yZXNvbHZlKHsgYWN0aW9uSWQ6ICJkaXNtaXNzZWQiLCB0aW1lZE91dDogZmFsc2UgfSk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLnF1ZXVlID0gW107CiAgICAgICAgfQogICAgICAgIC8vID09PT09PT09PT0gUHJpdmF0ZSBNZXRob2RzID09PT09PT09PT0KICAgICAgICAvKioKICAgICAgICAgKiBIaWRlIHRoZSBjdXJyZW50IGFjdGlvbmJhciB3aXRoIGFuaW1hdGlvbi4KICAgICAgICAgKiBSZW1vdmVzIHZpc2libGUgY2xhc3MgZmlyc3QgdG8gdHJpZ2dlciBDU1MgdHJhbnNpdGlvbiwgdGhlbiBjbGVhcnMgY29udGVudCBhZnRlciBhbmltYXRpb24uCiAgICAgICAgICovCiAgICAgICAgYXN5bmMgaGlkZUN1cnJlbnRCYXIoKSB7CiAgICAgICAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKTsKICAgICAgICAgIHRoaXMuaXNWaXNpYmxlID0gZmFsc2U7CiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHNldFRpbWVvdXQocmVzb2x2ZTIsIDIyMCkpOwogICAgICAgICAgdGhpcy5jdXJyZW50QmFyID0gbnVsbDsKICAgICAgICAgIHRoaXMuY3VycmVudFJlc29sdmUgPSBudWxsOwogICAgICAgIH0KICAgICAgICBhc3luYyBwcm9jZXNzUXVldWUoKSB7CiAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgdGhpcy5oaWRlQ3VycmVudEJhcigpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5xdWV1ZS5zaGlmdCgpOwogICAgICAgICAgdGhpcy5jdXJyZW50QmFyID0gaXRlbS5vcHRpb25zOwogICAgICAgICAgdGhpcy5jdXJyZW50UmVzb2x2ZSA9IGl0ZW0ucmVzb2x2ZTsKICAgICAgICAgIHRoaXMuaXNWaXNpYmxlID0gdHJ1ZTsKICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7CiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKTsKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKGl0ZW0ub3B0aW9ucy50aW1lb3V0KSB7CiAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lb3V0KGl0ZW0ub3B0aW9ucy50aW1lb3V0LmR1cmF0aW9uLCBpdGVtLm9wdGlvbnMudGltZW91dC5kZWZhdWx0QWN0aW9uSWQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdGFydFRpbWVvdXQoZHVyYXRpb24sIGRlZmF1bHRBY3Rpb25JZCkgewogICAgICAgICAgdGhpcy50aW1lUmVtYWluaW5nID0gZHVyYXRpb247CiAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudCA9IDEwMDsKICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7CiAgICAgICAgICBjb25zdCB1cGRhdGVJbnRlcnZhbCA9IDUwOwogICAgICAgICAgdGhpcy50aW1lb3V0SW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lOwogICAgICAgICAgICB0aGlzLnRpbWVSZW1haW5pbmcgPSBNYXRoLm1heCgwLCBkdXJhdGlvbiAtIGVsYXBzZWQpOwogICAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudCA9IHRoaXMudGltZVJlbWFpbmluZyAvIGR1cmF0aW9uICogMTAwOwogICAgICAgICAgICBpZiAodGhpcy50aW1lUmVtYWluaW5nIDw9IDApIHsKICAgICAgICAgICAgICB0aGlzLmNsZWFyVGltZW91dEludGVydmFsKCk7CiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBY3Rpb24oZGVmYXVsdEFjdGlvbklkLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgdXBkYXRlSW50ZXJ2YWwpOwogICAgICAgIH0KICAgICAgICBjbGVhclRpbWVvdXRJbnRlcnZhbCgpIHsKICAgICAgICAgIGlmICh0aGlzLnRpbWVvdXRJbnRlcnZhbCkgewogICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMudGltZW91dEludGVydmFsKTsKICAgICAgICAgICAgdGhpcy50aW1lb3V0SW50ZXJ2YWwgPSBudWxsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBoYW5kbGVBY3Rpb24oYWN0aW9uSWQsIHRpbWVkT3V0KSB7CiAgICAgICAgICB0aGlzLmNsZWFyVGltZW91dEludGVydmFsKCk7CiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50UmVzb2x2ZSkgewogICAgICAgICAgICB0aGlzLmN1cnJlbnRSZXNvbHZlKHsgYWN0aW9uSWQsIHRpbWVkT3V0IH0pOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5wcm9jZXNzUXVldWUoKTsKICAgICAgICB9CiAgICAgICAgaGFuZGxlRGlzbWlzcygpIHsKICAgICAgICAgIHRoaXMuaGFuZGxlQWN0aW9uKCJkaXNtaXNzZWQiLCBmYWxzZSk7CiAgICAgICAgfQogICAgICAgIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0SW50ZXJ2YWwoKTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIHsKICAgICAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNjIoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIERlZXNBY3Rpb25iYXIyID0gX2NsYXNzVGhpczsKICAgIH0pKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1ydW50aW1lL2ludGVyZmFjZXMvSUV4ZWN1dGlvbkVudmlyb25tZW50LmpzCnZhciBpbml0X0lFeGVjdXRpb25FbnZpcm9ubWVudCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXJ1bnRpbWUvaW50ZXJmYWNlcy9JRXhlY3V0aW9uRW52aXJvbm1lbnQuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtcnVudGltZS9pbnRlcmZhY2VzL2luZGV4LmpzCnZhciBpbml0X2ludGVyZmFjZXM0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtcnVudGltZS9pbnRlcmZhY2VzL2luZGV4LmpzIigpIHsKICAgIGluaXRfSUV4ZWN1dGlvbkVudmlyb25tZW50KCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC9pbnRlcm5hbC9jb25zdGFudHMuanMKdmFyIERFRkFVTFRfRURJVE9SX09SSUdJTiwgU0VBUkNIX1BBUkFNX0FVVEhfQ09ERSwgU0VBUkNIX1BBUkFNX0VSUk9SLCBTRUFSQ0hfUEFSQU1fRVJST1JfREVTQ1JJUFRJT04sIEJST0FEQ0FTVF9DSEFOTkVMX05BTUUsIFNUT1JBR0VfVE9LRU5TX05BTUUsIFNUT1JBR0VfQ09ERV9WRVJJRklFUl9OQU1FLCBTVE9SQUdFX1BPUFVQX05BTUU7CnZhciBpbml0X2NvbnN0YW50czMgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC9pbnRlcm5hbC9jb25zdGFudHMuanMiKCkgewogICAgREVGQVVMVF9FRElUT1JfT1JJR0lOID0gImh0dHBzOi8vc3RhY2tibGl0ei5jb20iOwogICAgU0VBUkNIX1BBUkFNX0FVVEhfQ09ERSA9ICJjb2RlIjsKICAgIFNFQVJDSF9QQVJBTV9FUlJPUiA9ICJlcnJvciI7CiAgICBTRUFSQ0hfUEFSQU1fRVJST1JfREVTQ1JJUFRJT04gPSAiZXJyb3JfZGVzY3JpcHRpb24iOwogICAgQlJPQURDQVNUX0NIQU5ORUxfTkFNRSA9ICJfX3djX2FwaV9iY19fIjsKICAgIFNUT1JBR0VfVE9LRU5TX05BTUUgPSAiX193Y19hcGlfdG9rZW5zX18iOwogICAgU1RPUkFHRV9DT0RFX1ZFUklGSUVSX05BTUUgPSAiX193Y19hcGlfdmVyaWZpZXJfXyI7CiAgICBTVE9SQUdFX1BPUFVQX05BTUUgPSAiX193Y19hcGlfcG9wdXBfXyI7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC9pbnRlcm5hbC9UeXBlZEV2ZW50VGFyZ2V0LmpzCnZhciBUeXBlZEV2ZW50VGFyZ2V0Owp2YXIgaW5pdF9UeXBlZEV2ZW50VGFyZ2V0ID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvaW50ZXJuYWwvVHlwZWRFdmVudFRhcmdldC5qcyIoKSB7CiAgICBUeXBlZEV2ZW50VGFyZ2V0ID0gY2xhc3MgewogICAgICBfYnVzID0gbmV3IEV2ZW50VGFyZ2V0KCk7CiAgICAgIGxpc3RlbihsaXN0ZW5lcjIpIHsKICAgICAgICBmdW5jdGlvbiB3cmFwcGVkTGlzdGVuZXIoZXZlbnQpIHsKICAgICAgICAgIGxpc3RlbmVyMihldmVudC5kYXRhKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fYnVzLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCB3cmFwcGVkTGlzdGVuZXIpOwogICAgICAgIHJldHVybiAoKSA9PiB0aGlzLl9idXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIHdyYXBwZWRMaXN0ZW5lcik7CiAgICAgIH0KICAgICAgZmlyZUV2ZW50KGRhdGEpIHsKICAgICAgICB0aGlzLl9idXMuZGlzcGF0Y2hFdmVudChuZXcgTWVzc2FnZUV2ZW50KCJtZXNzYWdlIiwgeyBkYXRhIH0pKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wZml4K3dlYmNvbnRhaW5lcl9fYXBpQDEuNi4xL25vZGVfbW9kdWxlcy9AdGVtcGZpeC93ZWJjb250YWluZXJfX2FwaS9kaXN0L2ludGVybmFsL3Rva2Vucy5qcwpmdW5jdGlvbiBjbGVhclRva2Vuc0luU3RvcmFnZSgpIHsKICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX1RPS0VOU19OQU1FKTsKfQpmdW5jdGlvbiBhZGRBY2Nlc3NUb2tlbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcjIpIHsKICByZXR1cm4gYWNjZXNzVG9rZW5DaGFuZ2VkTGlzdGVuZXJzLmxpc3RlbihsaXN0ZW5lcjIpOwp9CmZ1bmN0aW9uIHJlYWRUb2tlbnNGcm9tU3RvcmFnZSgpIHsKICBjb25zdCBzZXJpYWxpemVkVG9rZW5zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9UT0tFTlNfTkFNRSk7CiAgaWYgKCFzZXJpYWxpemVkVG9rZW5zKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgdHJ5IHsKICAgIHJldHVybiBKU09OLnBhcnNlKHNlcmlhbGl6ZWRUb2tlbnMpOwogIH0gY2F0Y2ggewogICAgcmV0dXJuIG51bGw7CiAgfQp9CmZ1bmN0aW9uIHBlcnNpc3RUb2tlbnNJblN0b3JhZ2UodG9rZW5zKSB7CiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9UT0tFTlNfTkFNRSwgSlNPTi5zdHJpbmdpZnkodG9rZW5zKSk7Cn0KZnVuY3Rpb24gZ2V0RXhwaXJlc0Zyb21Ub2tlblJlc3BvbnNlKHsgY3JlYXRlZF9hdCwgZXhwaXJlc19pbiB9KSB7CiAgcmV0dXJuIChjcmVhdGVkX2F0ICsgZXhwaXJlc19pbikgKiAxZTM7Cn0KZnVuY3Rpb24gYXNzZXJ0VG9rZW5SZXNwb25zZSh0b2tlbikgewogIGlmICh0eXBlb2YgdG9rZW4gIT09ICJvYmplY3QiIHx8ICF0b2tlbikgewogICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIFRva2VuIFJlc3BvbnNlIik7CiAgfQogIGlmICh0eXBlb2YgdG9rZW4uYWNjZXNzX3Rva2VuICE9PSAic3RyaW5nIiB8fCB0eXBlb2YgdG9rZW4ucmVmcmVzaF90b2tlbiAhPT0gInN0cmluZyIgfHwgdHlwZW9mIHRva2VuLmNyZWF0ZWRfYXQgIT09ICJudW1iZXIiIHx8IHR5cGVvZiB0b2tlbi5leHBpcmVzX2luICE9PSAibnVtYmVyIikgewogICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIFRva2VuIFJlc3BvbnNlIik7CiAgfQp9CmZ1bmN0aW9uIHdhaXQobXMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUyLCBtcykpOwp9CmZ1bmN0aW9uIGZpcmVBY2Nlc3NUb2tlbkNoYW5nZWQoYWNjZXNzVG9rZW4pIHsKICBhY2Nlc3NUb2tlbkNoYW5nZWRMaXN0ZW5lcnMuZmlyZUV2ZW50KGFjY2Vzc1Rva2VuKTsKfQp2YXIgSUdOT1JFRF9FUlJPUiwgYWNjZXNzVG9rZW5DaGFuZ2VkTGlzdGVuZXJzLCBUb2tlbnM7CnZhciBpbml0X3Rva2VucyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wZml4K3dlYmNvbnRhaW5lcl9fYXBpQDEuNi4xL25vZGVfbW9kdWxlcy9AdGVtcGZpeC93ZWJjb250YWluZXJfX2FwaS9kaXN0L2ludGVybmFsL3Rva2Vucy5qcyIoKSB7CiAgICBpbml0X2NvbnN0YW50czMoKTsKICAgIGluaXRfVHlwZWRFdmVudFRhcmdldCgpOwogICAgSUdOT1JFRF9FUlJPUiA9IG5ldyBFcnJvcigpOwogICAgSUdOT1JFRF9FUlJPUi5zdGFjayA9ICIiOwogICAgYWNjZXNzVG9rZW5DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IFR5cGVkRXZlbnRUYXJnZXQoKTsKICAgIFRva2VucyA9IGNsYXNzIF9Ub2tlbnMgewogICAgICBvcmlnaW47CiAgICAgIHJlZnJlc2g7CiAgICAgIGFjY2VzczsKICAgICAgZXhwaXJlczsKICAgICAgX3Jldm9rZWQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CiAgICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgcmVmcmVzaCwgYWNjZXNzLCBleHBpcmVzKSB7CiAgICAgICAgdGhpcy5vcmlnaW4gPSBvcmlnaW47CiAgICAgICAgdGhpcy5yZWZyZXNoID0gcmVmcmVzaDsKICAgICAgICB0aGlzLmFjY2VzcyA9IGFjY2VzczsKICAgICAgICB0aGlzLmV4cGlyZXMgPSBleHBpcmVzOwogICAgICB9CiAgICAgIGFzeW5jIGFjdGl2YXRlKG9uRmFpbGVkUmVmcmVzaCkgewogICAgICAgIGlmICh0aGlzLl9yZXZva2VkLnNpZ25hbC5hYm9ydGVkKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRva2VuIHJldm9rZWQiKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuZXhwaXJlcyA8IERhdGUubm93KCkpIHsKICAgICAgICAgIGlmICghYXdhaXQgdGhpcy5fZmV0Y2hOZXdBY2Nlc3NUb2tlbigpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5fc3luYygpOwogICAgICAgIHRoaXMuX3N0YXJ0UmVmcmVzaFRva2Vuc0xvb3Aob25GYWlsZWRSZWZyZXNoKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBhc3luYyByZXZva2UoY2xpZW50SWQsIGlnbm9yZVJldm9rZUVycm9yKSB7CiAgICAgICAgdGhpcy5fcmV2b2tlZC5hYm9ydCgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3RoaXMub3JpZ2lufS9vYXV0aC9yZXZva2VgLCB7CiAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyB0b2tlbjogdGhpcy5yZWZyZXNoLCB0b2tlbl90eXBlX2hpbnQ6ICJyZWZyZXNoX3Rva2VuIiwgY2xpZW50X2lkOiBjbGllbnRJZCB9KSwKICAgICAgICAgICAgbW9kZTogImNvcnMiCiAgICAgICAgICB9KTsKICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9nb3V0YCk7CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgIGlmICghaWdub3JlUmV2b2tlRXJyb3IpIHsKICAgICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNsZWFyVG9rZW5zSW5TdG9yYWdlKCk7CiAgICAgIH0KICAgICAgc3RhdGljIGZyb21TdG9yYWdlKCkgewogICAgICAgIGNvbnN0IHNhdmVkVG9rZW5zID0gcmVhZFRva2Vuc0Zyb21TdG9yYWdlKCk7CiAgICAgICAgaWYgKCFzYXZlZFRva2VucykgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgX1Rva2VucyhzYXZlZFRva2Vucy5vcmlnaW4sIHNhdmVkVG9rZW5zLnJlZnJlc2gsIHNhdmVkVG9rZW5zLmFjY2Vzcywgc2F2ZWRUb2tlbnMuZXhwaXJlcyk7CiAgICAgIH0KICAgICAgc3RhdGljIGFzeW5jIGZyb21BdXRoQ29kZSh7IGVkaXRvck9yaWdpbjogZWRpdG9yT3JpZ2luMiwgY2xpZW50SWQsIGNvZGVWZXJpZmllciwgYXV0aENvZGUsIHJlZGlyZWN0VXJpIH0pIHsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2VkaXRvck9yaWdpbjJ9L29hdXRoL3Rva2VuYCwgewogICAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgogICAgICAgICAgfSwKICAgICAgICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoewogICAgICAgICAgICBjbGllbnRfaWQ6IGNsaWVudElkLAogICAgICAgICAgICBjb2RlOiBhdXRoQ29kZSwKICAgICAgICAgICAgY29kZV92ZXJpZmllcjogY29kZVZlcmlmaWVyLAogICAgICAgICAgICBncmFudF90eXBlOiAiYXV0aG9yaXphdGlvbl9jb2RlIiwKICAgICAgICAgICAgcmVkaXJlY3RfdXJpOiByZWRpcmVjdFVyaQogICAgICAgICAgfSksCiAgICAgICAgICBtb2RlOiAiY29ycyIKICAgICAgICB9KTsKICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCB0b2tlbjogJHtyZXNwb25zZS5zdGF0dXN9YCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHRva2VuUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICAgICAgYXNzZXJ0VG9rZW5SZXNwb25zZSh0b2tlblJlc3BvbnNlKTsKICAgICAgICBjb25zdCB7IGFjY2Vzc190b2tlbjogYWNjZXNzLCByZWZyZXNoX3Rva2VuOiByZWZyZXNoIH0gPSB0b2tlblJlc3BvbnNlOwogICAgICAgIGNvbnN0IGV4cGlyZXMgPSBnZXRFeHBpcmVzRnJvbVRva2VuUmVzcG9uc2UodG9rZW5SZXNwb25zZSk7CiAgICAgICAgcmV0dXJuIG5ldyBfVG9rZW5zKGVkaXRvck9yaWdpbjIsIHJlZnJlc2gsIGFjY2VzcywgZXhwaXJlcyk7CiAgICAgIH0KICAgICAgYXN5bmMgX2ZldGNoTmV3QWNjZXNzVG9rZW4oKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5vcmlnaW59L29hdXRoL3Rva2VuYCwgewogICAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgogICAgICAgICAgICB9LAogICAgICAgICAgICBib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHsKICAgICAgICAgICAgICBncmFudF90eXBlOiAicmVmcmVzaF90b2tlbiIsCiAgICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogdGhpcy5yZWZyZXNoCiAgICAgICAgICAgIH0pLAogICAgICAgICAgICBtb2RlOiAiY29ycyIsCiAgICAgICAgICAgIHNpZ25hbDogdGhpcy5fcmV2b2tlZC5zaWduYWwKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICAgICAgICB0aHJvdyBJR05PUkVEX0VSUk9SOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgdG9rZW5SZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsKICAgICAgICAgIGFzc2VydFRva2VuUmVzcG9uc2UodG9rZW5SZXNwb25zZSk7CiAgICAgICAgICBjb25zdCB7IGFjY2Vzc190b2tlbjogYWNjZXNzLCByZWZyZXNoX3Rva2VuOiByZWZyZXNoIH0gPSB0b2tlblJlc3BvbnNlOwogICAgICAgICAgY29uc3QgZXhwaXJlcyA9IGdldEV4cGlyZXNGcm9tVG9rZW5SZXNwb25zZSh0b2tlblJlc3BvbnNlKTsKICAgICAgICAgIHRoaXMuYWNjZXNzID0gYWNjZXNzOwogICAgICAgICAgdGhpcy5leHBpcmVzID0gZXhwaXJlczsKICAgICAgICAgIHRoaXMucmVmcmVzaCA9IHJlZnJlc2g7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIGNsZWFyVG9rZW5zSW5TdG9yYWdlKCk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIF9zeW5jKCkgewogICAgICAgIHBlcnNpc3RUb2tlbnNJblN0b3JhZ2UodGhpcyk7CiAgICAgICAgZmlyZUFjY2Vzc1Rva2VuQ2hhbmdlZCh0aGlzLmFjY2Vzcyk7CiAgICAgIH0KICAgICAgYXN5bmMgX3N0YXJ0UmVmcmVzaFRva2Vuc0xvb3Aob25GYWlsZWRSZWZyZXNoKSB7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgIGNvbnN0IGV4cGlyZXNJbiA9IHRoaXMuZXhwaXJlcyAtIERhdGUubm93KCkgLSAxZTM7CiAgICAgICAgICBhd2FpdCB3YWl0KE1hdGgubWF4KGV4cGlyZXNJbiwgMWUzKSk7CiAgICAgICAgICBpZiAodGhpcy5fcmV2b2tlZC5zaWduYWwuYWJvcnRlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIXRoaXMuX2ZldGNoTmV3QWNjZXNzVG9rZW4oKSkgewogICAgICAgICAgICBvbkZhaWxlZFJlZnJlc2goKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fc3luYygpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wZml4K3dlYmNvbnRhaW5lcl9fYXBpQDEuNi4xL25vZGVfbW9kdWxlcy9AdGVtcGZpeC93ZWJjb250YWluZXJfX2FwaS9kaXN0L2ludGVybmFsL2lmcmFtZS11cmwuanMKdmFyIHBhcmFtcywgZWRpdG9yT3JpZ2luLCBpZnJhbWVTZXR0aW5nczsKdmFyIGluaXRfaWZyYW1lX3VybCA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wZml4K3dlYmNvbnRhaW5lcl9fYXBpQDEuNi4xL25vZGVfbW9kdWxlcy9AdGVtcGZpeC93ZWJjb250YWluZXJfX2FwaS9kaXN0L2ludGVybmFsL2lmcmFtZS11cmwuanMiKCkgewogICAgaW5pdF9jb25zdGFudHMzKCk7CiAgICBwYXJhbXMgPSB7fTsKICAgIGVkaXRvck9yaWdpbiA9IG51bGw7CiAgICBpZnJhbWVTZXR0aW5ncyA9IHsKICAgICAgZ2V0IGVkaXRvck9yaWdpbigpIHsKICAgICAgICBpZiAoZWRpdG9yT3JpZ2luID09IG51bGwpIHsKICAgICAgICAgIGVkaXRvck9yaWdpbiA9IG5ldyBVUkwoZ2xvYmFsVGhpcy5XRUJDT05UQUlORVJfQVBJX0lGUkFNRV9VUkwgPz8gREVGQVVMVF9FRElUT1JfT1JJR0lOKS5vcmlnaW47CiAgICAgICAgfQogICAgICAgIHJldHVybiBlZGl0b3JPcmlnaW47CiAgICAgIH0sCiAgICAgIHNldCBlZGl0b3JPcmlnaW4obmV3T3JpZ2luKSB7CiAgICAgICAgZWRpdG9yT3JpZ2luID0gbmV3IFVSTChuZXdPcmlnaW4pLm9yaWdpbjsKICAgICAgfSwKICAgICAgc2V0UXVlcnlQYXJhbShrZXkyLCB2YWx1ZTIpIHsKICAgICAgICBwYXJhbXNba2V5Ml0gPSB2YWx1ZTI7CiAgICAgIH0sCiAgICAgIGdldCB1cmwoKSB7CiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh0aGlzLmVkaXRvck9yaWdpbik7CiAgICAgICAgdXJsLnBhdGhuYW1lID0gIi9oZWFkbGVzcyI7CiAgICAgICAgZm9yIChjb25zdCBwYXJhbSBpbiBwYXJhbXMpIHsKICAgICAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KHBhcmFtLCBwYXJhbXNbcGFyYW1dKTsKICAgICAgICB9CiAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoInZlcnNpb24iLCAiMS42LjEiKTsKICAgICAgICByZXR1cm4gdXJsOwogICAgICB9CiAgICB9OwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvaW50ZXJuYWwvY29kZS5qcwphc3luYyBmdW5jdGlvbiBTMjU2KGlucHV0KSB7CiAgY29uc3QgYXNjaWkgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoaW5wdXQpOwogIGNvbnN0IHNoYTI1NiA9IG5ldyBVaW50OEFycmF5KGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCJTSEEtMjU2IiwgYXNjaWkpKTsKICByZXR1cm4gYnRvYShzaGEyNTYucmVkdWNlKChiaW5hcnksIGJ5dGUpID0+IGJpbmFyeSArIFN0cmluZy5mcm9tQ29kZVBvaW50KGJ5dGUpLCAiIikpLnJlcGxhY2UoL1wrL2csICItIikucmVwbGFjZSgvXC8vZywgIl8iKS5yZXBsYWNlKC89KyQvLCAiIik7Cn0KZnVuY3Rpb24gbmV3Q29kZVZlcmlmaWVyKCkgewogIGNvbnN0IHJhbmRvbSA9IG5ldyBVaW50OEFycmF5KDk2KTsKICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHJhbmRvbSk7CiAgbGV0IGNvZGVWZXJpZmllciA9ICIiOwogIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IDMyOyArK2kxMSkgewogICAgY29kZVZlcmlmaWVyICs9IG5leHRGb3VyQ2hhcnMocmFuZG9tWzMgKiBpMTEgKyAwXSwgcmFuZG9tWzMgKiBpMTEgKyAxXSwgcmFuZG9tWzMgKiBpMTEgKyAyXSk7CiAgfQogIHJldHVybiBjb2RlVmVyaWZpZXI7Cn0KZnVuY3Rpb24gbmV4dEZvdXJDaGFycyhieXRlMSwgYnl0ZTIsIGJ5dGUzKSB7CiAgY29uc3QgY2hhcjEgPSBieXRlMSA+PiAyOwogIGNvbnN0IGNoYXIyID0gKGJ5dGUxICYgMykgPDwgNCB8IGJ5dGUyID4+IDQ7CiAgY29uc3QgY2hhcjMgPSBieXRlMiAmIDE1IHwgKGJ5dGUzICYgMTkyKSA+PiAyOwogIGNvbnN0IGNoYXI0ID0gYnl0ZTMgJiA2MzsKICByZXR1cm4gW2NoYXIxLCBjaGFyMiwgY2hhcjMsIGNoYXI0XS5tYXAodW5yZXNlcnZlZENoYXJhY3RlcnMpLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIHVucmVzZXJ2ZWRDaGFyYWN0ZXJzKGNvZGU0KSB7CiAgbGV0IG9mZnNldDsKICBpZiAoY29kZTQgPCAyNikgewogICAgb2Zmc2V0ID0gY29kZTQgKyA2NTsKICB9IGVsc2UgaWYgKGNvZGU0IDwgNTIpIHsKICAgIG9mZnNldCA9IGNvZGU0IC0gMjYgKyA5NzsKICB9IGVsc2UgaWYgKGNvZGU0IDwgNjIpIHsKICAgIG9mZnNldCA9IGNvZGU0IC0gNTIgKyA0ODsKICB9IGVsc2UgewogICAgb2Zmc2V0ID0gY29kZTQgPT09IDYyID8gMzAgOiA0NTsKICB9CiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUob2Zmc2V0KTsKfQp2YXIgaW5pdF9jb2RlNSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wZml4K3dlYmNvbnRhaW5lcl9fYXBpQDEuNi4xL25vZGVfbW9kdWxlcy9AdGVtcGZpeC93ZWJjb250YWluZXJfX2FwaS9kaXN0L2ludGVybmFsL2NvZGUuanMiKCkgewogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvaW50ZXJuYWwvcmVzZXQtcHJvbWlzZS5qcwpmdW5jdGlvbiByZXNldHRhYmxlUHJvbWlzZSgpIHsKICBsZXQgcmVzb2x2ZTI7CiAgbGV0IHByb21pc2U7CiAgZnVuY3Rpb24gcmVzZXQoKSB7CiAgICBwcm9taXNlID0gbmV3IFByb21pc2UoKF9yZXNvbHZlKSA9PiByZXNvbHZlMiA9IF9yZXNvbHZlKTsKICB9CiAgcmVzZXQoKTsKICByZXR1cm4gewogICAgZ2V0IHByb21pc2UoKSB7CiAgICAgIHJldHVybiBwcm9taXNlOwogICAgfSwKICAgIHJlc29sdmUodmFsdWUyKSB7CiAgICAgIHJldHVybiByZXNvbHZlMih2YWx1ZTIpOwogICAgfSwKICAgIHJlc2V0CiAgfTsKfQp2YXIgaW5pdF9yZXNldF9wcm9taXNlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvaW50ZXJuYWwvcmVzZXQtcHJvbWlzZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC9pbnRlcm5hbC9hdXRoLXN0YXRlLmpzCmZ1bmN0aW9uIGJyb2FkY2FzdE1lc3NhZ2UobWVzc2FnZTIpIHsKICBpZiAoIWF1dGhTdGF0ZS5icm9hZGNhc3RDaGFubmVsKSB7CiAgICByZXR1cm47CiAgfQogIGF1dGhTdGF0ZS5icm9hZGNhc3RDaGFubmVsLnBvc3RNZXNzYWdlKG1lc3NhZ2UyKTsKICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9QT1BVUF9OQU1FKSA9PT0gInRydWUiICYmIG1lc3NhZ2UyLnR5cGUgIT09ICJhdXRoLWxvZ291dCIpIHsKICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFNUT1JBR0VfUE9QVVBfTkFNRSk7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgd2luZG93LmNsb3NlKCk7CiAgICB9KTsKICB9Cn0KZnVuY3Rpb24gb25GYWlsZWRUb2tlblJlZnJlc2goKSB7CiAgbG9nZ2VkT3V0TGlzdGVuZXJzLmZpcmVFdmVudCgpOwogIGJyb2FkY2FzdE1lc3NhZ2UoeyB0eXBlOiAiYXV0aC1sb2dvdXQiIH0pOwp9CmZ1bmN0aW9uIGRlZmF1bHRSZWRpcmVjdFVyaSgpIHsKICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWY7Cn0KYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPQXV0aFJlcXVlc3QoKSB7CiAgY29uc3QgY29kZVZlcmlmaWVyID0gbmV3Q29kZVZlcmlmaWVyKCk7CiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9DT0RFX1ZFUklGSUVSX05BTUUsIGNvZGVWZXJpZmllcik7CiAgY29uc3QgY29kZUNoYWxsZW5nZSA9IGF3YWl0IFMyNTYoY29kZVZlcmlmaWVyKTsKICBjb25zdCB1cmwgPSBuZXcgVVJMKCIvb2F1dGgvYXV0aG9yaXplIiwgYXV0aFN0YXRlLmVkaXRvck9yaWdpbik7CiAgY29uc3QgeyBzZWFyY2hQYXJhbXMgfSA9IHVybDsKICBzZWFyY2hQYXJhbXMuYXBwZW5kKCJyZXNwb25zZV90eXBlIiwgImNvZGUiKTsKICBzZWFyY2hQYXJhbXMuYXBwZW5kKCJjbGllbnRfaWQiLCBhdXRoU3RhdGUuY2xpZW50SWQpOwogIHNlYXJjaFBhcmFtcy5hcHBlbmQoInJlZGlyZWN0X3VyaSIsIGRlZmF1bHRSZWRpcmVjdFVyaSgpKTsKICBzZWFyY2hQYXJhbXMuYXBwZW5kKCJzY29wZSIsIGF1dGhTdGF0ZS5vYXV0aFNjb3BlKTsKICBzZWFyY2hQYXJhbXMuYXBwZW5kKCJjb2RlX2NoYWxsZW5nZSIsIGNvZGVDaGFsbGVuZ2UpOwogIHNlYXJjaFBhcmFtcy5hcHBlbmQoImNvZGVfY2hhbGxlbmdlX21ldGhvZCIsICJTMjU2Iik7CiAgcmV0dXJuIHVybC50b1N0cmluZygpOwp9CmZ1bmN0aW9uIGFzc2VydEF1dGhUb2tlbnModG9rZW5zKSB7CiAgaWYgKCF0b2tlbnMpIHsKICAgIHRocm93IG5ldyBFcnJvcigiT29wcyEgVG9rZW5zIGlzIG5vdCBkZWZpbmVkIHdoZW4gaXQgYWx3YXlzIHNob3VsZCBiZS4iKTsKICB9Cn0KdmFyIGF1dGhTdGF0ZSwgYXV0aEZhaWxlZExpc3RlbmVycywgbG9nZ2VkT3V0TGlzdGVuZXJzLCBhdXRoOwp2YXIgaW5pdF9hdXRoX3N0YXRlID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvaW50ZXJuYWwvYXV0aC1zdGF0ZS5qcyIoKSB7CiAgICBpbml0X3Rva2VucygpOwogICAgaW5pdF9jb25zdGFudHMzKCk7CiAgICBpbml0X2lmcmFtZV91cmwoKTsKICAgIGluaXRfY29kZTUoKTsKICAgIGluaXRfcmVzZXRfcHJvbWlzZSgpOwogICAgaW5pdF9UeXBlZEV2ZW50VGFyZ2V0KCk7CiAgICBhdXRoU3RhdGUgPSB7CiAgICAgIGluaXRpYWxpemVkOiBmYWxzZSwKICAgICAgYm9vdENhbGxlZDogZmFsc2UsCiAgICAgIGF1dGhDb21wbGV0ZTogcmVzZXR0YWJsZVByb21pc2UoKSwKICAgICAgY2xpZW50SWQ6ICIiLAogICAgICBvYXV0aFNjb3BlOiAiIiwKICAgICAgYnJvYWRjYXN0Q2hhbm5lbDogbnVsbCwKICAgICAgZ2V0IGVkaXRvck9yaWdpbigpIHsKICAgICAgICByZXR1cm4gaWZyYW1lU2V0dGluZ3MuZWRpdG9yT3JpZ2luOwogICAgICB9LAogICAgICB0b2tlbnM6IG51bGwKICAgIH07CiAgICBhdXRoRmFpbGVkTGlzdGVuZXJzID0gbmV3IFR5cGVkRXZlbnRUYXJnZXQoKTsKICAgIGxvZ2dlZE91dExpc3RlbmVycyA9IG5ldyBUeXBlZEV2ZW50VGFyZ2V0KCk7CiAgICBhdXRoID0gewogICAgICBpbml0KHsgZWRpdG9yT3JpZ2luOiBlZGl0b3JPcmlnaW4yLCBjbGllbnRJZCwgc2NvcGUgfSkgewogICAgICAgIGlmIChhdXRoU3RhdGUuaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW5pdCBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSIpOwogICAgICAgIH0KICAgICAgICBsZXQgZW50ZXJwcmlzZSA9IHRydWU7CiAgICAgICAgaWYgKGVudGVycHJpc2UgJiYgYXV0aFN0YXRlLmJvb3RDYWxsZWQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiYGF1dGguaW5pdGAgc2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQgYmVmb3JlIGBXZWJDb250YWluZXIuYm9vdGAiKTsKICAgICAgICB9CiAgICAgICAgYXV0aFN0YXRlLmluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgICBhdXRoU3RhdGUudG9rZW5zID0gVG9rZW5zLmZyb21TdG9yYWdlKCk7CiAgICAgICAgYXV0aFN0YXRlLmNsaWVudElkID0gY2xpZW50SWQ7CiAgICAgICAgYXV0aFN0YXRlLm9hdXRoU2NvcGUgPSBzY29wZTsKICAgICAgICBhdXRoU3RhdGUuYnJvYWRjYXN0Q2hhbm5lbCA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKEJST0FEQ0FTVF9DSEFOTkVMX05BTUUpOwogICAgICAgIGlmcmFtZVNldHRpbmdzLnNldFF1ZXJ5UGFyYW0oImNsaWVudF9pZCIsIGNsaWVudElkKTsKICAgICAgICBpZiAoZWRpdG9yT3JpZ2luMikgewogICAgICAgICAgaWZyYW1lU2V0dGluZ3MuZWRpdG9yT3JpZ2luID0gbmV3IFVSTChlZGl0b3JPcmlnaW4yKS5vcmlnaW47CiAgICAgICAgfQogICAgICAgIGxvZ2dlZE91dExpc3RlbmVycy5saXN0ZW4oKCkgPT4gYXV0aFN0YXRlLmF1dGhDb21wbGV0ZS5yZXNldCgpKTsKICAgICAgICBhdXRoU3RhdGUuYnJvYWRjYXN0Q2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgb25DaGFubmVsTWVzc2FnZSk7CiAgICAgICAgYXN5bmMgZnVuY3Rpb24gb25DaGFubmVsTWVzc2FnZShldmVudCkgewogICAgICAgICAgY29uc3QgdHlwZWRFdmVudCA9IGV2ZW50LmRhdGE7CiAgICAgICAgICBpZiAodHlwZWRFdmVudC50eXBlID09PSAiYXV0aC1jb21wbGV0ZSIpIHsKICAgICAgICAgICAgYXV0aFN0YXRlLnRva2VucyA9IFRva2Vucy5mcm9tU3RvcmFnZSgpOwogICAgICAgICAgICBhd2FpdCBhdXRoU3RhdGUudG9rZW5zLmFjdGl2YXRlKG9uRmFpbGVkVG9rZW5SZWZyZXNoKTsKICAgICAgICAgICAgYXV0aFN0YXRlLmF1dGhDb21wbGV0ZS5yZXNvbHZlKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0eXBlZEV2ZW50LnR5cGUgPT09ICJhdXRoLWZhaWxlZCIpIHsKICAgICAgICAgICAgYXV0aEZhaWxlZExpc3RlbmVycy5maXJlRXZlbnQodHlwZWRFdmVudCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0eXBlZEV2ZW50LnR5cGUgPT09ICJhdXRoLWxvZ291dCIpIHsKICAgICAgICAgICAgbG9nZ2VkT3V0TGlzdGVuZXJzLmZpcmVFdmVudCgpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChhdXRoU3RhdGUudG9rZW5zKSB7CiAgICAgICAgICBjb25zdCB0b2tlbnMgPSBhdXRoU3RhdGUudG9rZW5zOwogICAgICAgICAgaWYgKHRva2Vucy5vcmlnaW4gPT09IGF1dGhTdGF0ZS5lZGl0b3JPcmlnaW4pIHsKICAgICAgICAgICAgKGFzeW5jICgpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdG9rZW5zLmFjdGl2YXRlKG9uRmFpbGVkVG9rZW5SZWZyZXNoKTsKICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgIGlmIChhdXRoU3RhdGUudG9rZW5zICE9PSB0b2tlbnMpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbG9nZ2VkT3V0TGlzdGVuZXJzLmZpcmVFdmVudCgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBhdXRoU3RhdGUuYXV0aENvbXBsZXRlLnJlc29sdmUoKTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiAiYXV0aG9yaXplZCIgfTsKICAgICAgICAgIH0KICAgICAgICAgIGNsZWFyVG9rZW5zSW5TdG9yYWdlKCk7CiAgICAgICAgICBhdXRoU3RhdGUudG9rZW5zID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgY29uc3QgbG9jYXRpb25VUkwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKICAgICAgICBjb25zdCB7IHNlYXJjaFBhcmFtcyB9ID0gbG9jYXRpb25VUkw7CiAgICAgICAgY29uc3QgdXBkYXRlVVJMID0gKCkgPT4gd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCBkb2N1bWVudC50aXRsZSwgbG9jYXRpb25VUkwpOwogICAgICAgIGlmIChzZWFyY2hQYXJhbXMuaGFzKFNFQVJDSF9QQVJBTV9FUlJPUikpIHsKICAgICAgICAgIGNvbnN0IGVycm9yID0gc2VhcmNoUGFyYW1zLmdldChTRUFSQ0hfUEFSQU1fRVJST1IpOwogICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBzZWFyY2hQYXJhbXMuZ2V0KFNFQVJDSF9QQVJBTV9FUlJPUl9ERVNDUklQVElPTik7CiAgICAgICAgICBzZWFyY2hQYXJhbXMuZGVsZXRlKFNFQVJDSF9QQVJBTV9FUlJPUik7CiAgICAgICAgICBzZWFyY2hQYXJhbXMuZGVsZXRlKFNFQVJDSF9QQVJBTV9FUlJPUl9ERVNDUklQVElPTik7CiAgICAgICAgICB1cGRhdGVVUkwoKTsKICAgICAgICAgIGJyb2FkY2FzdE1lc3NhZ2UoeyB0eXBlOiAiYXV0aC1mYWlsZWQiLCBlcnJvciwgZGVzY3JpcHRpb24gfSk7CiAgICAgICAgICByZXR1cm4geyBzdGF0dXM6ICJhdXRoLWZhaWxlZCIsIGVycm9yLCBkZXNjcmlwdGlvbiB9OwogICAgICAgIH0KICAgICAgICBpZiAoc2VhcmNoUGFyYW1zLmhhcyhTRUFSQ0hfUEFSQU1fQVVUSF9DT0RFKSkgewogICAgICAgICAgY29uc3QgYXV0aENvZGUgPSBzZWFyY2hQYXJhbXMuZ2V0KFNFQVJDSF9QQVJBTV9BVVRIX0NPREUpOwogICAgICAgICAgY29uc3QgZWRpdG9yT3JpZ2luMyA9IGF1dGhTdGF0ZS5lZGl0b3JPcmlnaW47CiAgICAgICAgICBzZWFyY2hQYXJhbXMuZGVsZXRlKFNFQVJDSF9QQVJBTV9BVVRIX0NPREUpOwogICAgICAgICAgdXBkYXRlVVJMKCk7CiAgICAgICAgICBjb25zdCBjb2RlVmVyaWZpZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0NPREVfVkVSSUZJRVJfTkFNRSk7CiAgICAgICAgICBpZiAoIWNvZGVWZXJpZmllcikgewogICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6ICJuZWVkLWF1dGgiIH07CiAgICAgICAgICB9CiAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX0NPREVfVkVSSUZJRVJfTkFNRSk7CiAgICAgICAgICBUb2tlbnMuZnJvbUF1dGhDb2RlKHsKICAgICAgICAgICAgZWRpdG9yT3JpZ2luOiBlZGl0b3JPcmlnaW4zLAogICAgICAgICAgICBjbGllbnRJZDogYXV0aFN0YXRlLmNsaWVudElkLAogICAgICAgICAgICBhdXRoQ29kZSwKICAgICAgICAgICAgY29kZVZlcmlmaWVyLAogICAgICAgICAgICByZWRpcmVjdFVyaTogZGVmYXVsdFJlZGlyZWN0VXJpKCkKICAgICAgICAgIH0pLnRoZW4oYXN5bmMgKHRva2VucykgPT4gewogICAgICAgICAgICBhdXRoU3RhdGUudG9rZW5zID0gdG9rZW5zOwogICAgICAgICAgICBhc3NlcnRBdXRoVG9rZW5zKGF1dGhTdGF0ZS50b2tlbnMpOwogICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgYXV0aFN0YXRlLnRva2Vucy5hY3RpdmF0ZShvbkZhaWxlZFRva2VuUmVmcmVzaCk7CiAgICAgICAgICAgIGlmICghc3VjY2VzcykgewogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF1dGhTdGF0ZS5hdXRoQ29tcGxldGUucmVzb2x2ZSgpOwogICAgICAgICAgICBicm9hZGNhc3RNZXNzYWdlKHsgdHlwZTogImF1dGgtY29tcGxldGUiIH0pOwogICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAgICBsb2dnZWRPdXRMaXN0ZW5lcnMuZmlyZUV2ZW50KCk7CiAgICAgICAgICAgIGJyb2FkY2FzdE1lc3NhZ2UoeyB0eXBlOiAiYXV0aC1sb2dvdXQiIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4geyBzdGF0dXM6ICJhdXRob3JpemVkIiB9OwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBzdGF0dXM6ICJuZWVkLWF1dGgiIH07CiAgICAgIH0sCiAgICAgIGFzeW5jIHN0YXJ0QXV0aEZsb3coeyBwb3B1cCB9ID0ge30pIHsKICAgICAgICBpZiAoIWF1dGhTdGF0ZS5pbml0aWFsaXplZCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJhdXRoLmluaXQgbXVzdCBiZSBjYWxsZWQgZmlyc3QiKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBvcHVwKSB7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX1BPUFVQX05BTUUsICJ0cnVlIik7CiAgICAgICAgICBjb25zdCBoZWlnaHQgPSA1MDA7CiAgICAgICAgICBjb25zdCB3aWR0aCA9IDYyMDsKICAgICAgICAgIGNvbnN0IGxlZnQgPSB3aW5kb3cuc2NyZWVuTGVmdCArICh3aW5kb3cub3V0ZXJXaWR0aCAtIHdpZHRoKSAvIDI7CiAgICAgICAgICBjb25zdCB0b3AgPSB3aW5kb3cuc2NyZWVuVG9wICsgKHdpbmRvdy5vdXRlckhlaWdodCAtIGhlaWdodCkgLyAyOwogICAgICAgICAgd2luZG93Lm9wZW4oYXdhaXQgZ2VuZXJhdGVPQXV0aFJlcXVlc3QoKSwgIl9ibGFuayIsIGBwb3B1cCx3aWR0aD0ke3dpZHRofSxoZWlnaHQ9JHtoZWlnaHR9LGxlZnQ9JHtsZWZ0fSx0b3A9JHt0b3B9YCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYXdhaXQgZ2VuZXJhdGVPQXV0aFJlcXVlc3QoKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGFzeW5jIGxvZ291dCh7IGlnbm9yZVJldm9rZUVycm9yIH0gPSB7fSkgewogICAgICAgIGF3YWl0IGF1dGhTdGF0ZS50b2tlbnM/LnJldm9rZShhdXRoU3RhdGUuY2xpZW50SWQsIGlnbm9yZVJldm9rZUVycm9yID8/IGZhbHNlKTsKICAgICAgICBsb2dnZWRPdXRMaXN0ZW5lcnMuZmlyZUV2ZW50KCk7CiAgICAgICAgYnJvYWRjYXN0TWVzc2FnZSh7IHR5cGU6ICJhdXRoLWxvZ291dCIgfSk7CiAgICAgIH0sCiAgICAgIGxvZ2dlZEluKCkgewogICAgICAgIHJldHVybiBhdXRoU3RhdGUuYXV0aENvbXBsZXRlLnByb21pc2U7CiAgICAgIH0sCiAgICAgIG9uKGV2ZW50LCBsaXN0ZW5lcjIpIHsKICAgICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgICAgICBjYXNlICJhdXRoLWZhaWxlZCI6IHsKICAgICAgICAgICAgcmV0dXJuIGF1dGhGYWlsZWRMaXN0ZW5lcnMubGlzdGVuKGxpc3RlbmVyMik7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlICJsb2dnZWQtb3V0IjogewogICAgICAgICAgICByZXR1cm4gbG9nZ2VkT3V0TGlzdGVuZXJzLmxpc3RlbihsaXN0ZW5lcjIpOwogICAgICAgICAgfQogICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGV2ZW50IHR5cGUgJyR7ZXZlbnR9Jy5gKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC9wcmV2aWV3LW1lc3NhZ2UtdHlwZXMuanMKdmFyIFByZXZpZXdNZXNzYWdlVHlwZTsKdmFyIGluaXRfcHJldmlld19tZXNzYWdlX3R5cGVzID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvcHJldmlldy1tZXNzYWdlLXR5cGVzLmpzIigpIHsKICAgIChmdW5jdGlvbihQcmV2aWV3TWVzc2FnZVR5cGUyKSB7CiAgICAgIFByZXZpZXdNZXNzYWdlVHlwZTJbIlVuY2F1Z2h0RXhjZXB0aW9uIl0gPSAiUFJFVklFV19VTkNBVUdIVF9FWENFUFRJT04iOwogICAgICBQcmV2aWV3TWVzc2FnZVR5cGUyWyJVbmhhbmRsZWRSZWplY3Rpb24iXSA9ICJQUkVWSUVXX1VOSEFORExFRF9SRUpFQ1RJT04iOwogICAgICBQcmV2aWV3TWVzc2FnZVR5cGUyWyJDb25zb2xlRXJyb3IiXSA9ICJQUkVWSUVXX0NPTlNPTEVfRVJST1IiOwogICAgfSkoUHJldmlld01lc3NhZ2VUeXBlIHx8IChQcmV2aWV3TWVzc2FnZVR5cGUgPSB7fSkpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvdmVuZG9yL2luZGV4LmpzCmZ1bmN0aW9uIGV4cG9zZShvYmosIGVwID0gc2VsZikgewogIGVwLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCBmdW5jdGlvbiBjYWxsYmFjayhldikgewogICAgaWYgKCFldiB8fCAhZXYuZGF0YSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCB7IGlkLCB0eXBlOiB0eXBlNSwgcGF0aDogcGF0aDIgfSA9IE9iamVjdC5hc3NpZ24oeyBwYXRoOiBbXSB9LCBldi5kYXRhKTsKICAgIGNvbnN0IGFyZ3VtZW50TGlzdCA9IChldi5kYXRhLmFyZ3VtZW50TGlzdCB8fCBbXSkubWFwKGZyb21XaXJlVmFsdWUpOwogICAgbGV0IHJldHVyblZhbHVlOwogICAgdHJ5IHsKICAgICAgY29uc3QgcGFyZW50ID0gcGF0aDIuc2xpY2UoMCwgLTEpLnJlZHVjZSgob2JqMiwgcHJvcCkgPT4gb2JqMltwcm9wXSwgb2JqKTsKICAgICAgY29uc3QgcmF3VmFsdWUgPSBwYXRoMi5yZWR1Y2UoKG9iajIsIHByb3ApID0+IG9iajJbcHJvcF0sIG9iaik7CiAgICAgIHN3aXRjaCAodHlwZTUpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICB7CiAgICAgICAgICAgIHJldHVyblZhbHVlID0gcmF3VmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICB7CiAgICAgICAgICAgIHBhcmVudFtwYXRoMi5zbGljZSgtMSlbMF1dID0gZnJvbVdpcmVWYWx1ZShldi5kYXRhLnZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgewogICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHJhd1ZhbHVlLmFwcGx5KHBhcmVudCwgYXJndW1lbnRMaXN0KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgIHsKICAgICAgICAgICAgY29uc3QgdmFsdWUyID0gbmV3IHJhd1ZhbHVlKC4uLmFyZ3VtZW50TGlzdCk7CiAgICAgICAgICAgIHJldHVyblZhbHVlID0gcHJveHkodmFsdWUyKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgIHsKICAgICAgICAgICAgY29uc3QgeyBwb3J0MSwgcG9ydDIgfSA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpOwogICAgICAgICAgICBleHBvc2Uob2JqLCBwb3J0Mik7CiAgICAgICAgICAgIHJldHVyblZhbHVlID0gdHJhbnNmZXIocG9ydDEsIFtwb3J0MV0pOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA1OgogICAgICAgICAgewogICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9IGNhdGNoICh2YWx1ZTIpIHsKICAgICAgcmV0dXJuVmFsdWUgPSB7IHZhbHVlOiB2YWx1ZTIsIFt0aHJvd01hcmtlcl06IDAgfTsKICAgIH0KICAgIFByb21pc2UucmVzb2x2ZShyZXR1cm5WYWx1ZSkuY2F0Y2goKHZhbHVlMikgPT4gewogICAgICByZXR1cm4geyB2YWx1ZTogdmFsdWUyLCBbdGhyb3dNYXJrZXJdOiAwIH07CiAgICB9KS50aGVuKChyZXR1cm5WYWx1ZTIpID0+IHsKICAgICAgY29uc3QgW3dpcmVWYWx1ZSwgdHJhbnNmZXJhYmxlc10gPSB0b1dpcmVWYWx1ZShyZXR1cm5WYWx1ZTIpOwogICAgICBlcC5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHdpcmVWYWx1ZSksIHsgaWQgfSksIHRyYW5zZmVyYWJsZXMpOwogICAgICBpZiAodHlwZTUgPT09IDUpIHsKICAgICAgICBlcC5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgY2FsbGJhY2spOwogICAgICAgIGNsb3NlRW5kUG9pbnQoZXApOwogICAgICB9CiAgICB9KTsKICB9KTsKICBpZiAoZXAuc3RhcnQpIHsKICAgIGVwLnN0YXJ0KCk7CiAgfQp9CmZ1bmN0aW9uIGlzTWVzc2FnZVBvcnQoZW5kcG9pbnQpIHsKICByZXR1cm4gZW5kcG9pbnQuY29uc3RydWN0b3IubmFtZSA9PT0gIk1lc3NhZ2VQb3J0IjsKfQpmdW5jdGlvbiBjbG9zZUVuZFBvaW50KGVuZHBvaW50KSB7CiAgaWYgKGlzTWVzc2FnZVBvcnQoZW5kcG9pbnQpKQogICAgZW5kcG9pbnQuY2xvc2UoKTsKfQpmdW5jdGlvbiB3cmFwNChlcCwgdGFyZ2V0KSB7CiAgcmV0dXJuIGNyZWF0ZVByb3h5KGVwLCBbXSwgdGFyZ2V0KTsKfQpmdW5jdGlvbiB0aHJvd0lmUHJveHlSZWxlYXNlZChpc1JlbGVhc2VkKSB7CiAgaWYgKGlzUmVsZWFzZWQpIHsKICAgIHRocm93IG5ldyBFcnJvcigiUHJveHkgaGFzIGJlZW4gcmVsZWFzZWQgYW5kIGlzIG5vdCB1c2VhYmxlIik7CiAgfQp9CmZ1bmN0aW9uIGNyZWF0ZVByb3h5KGVwLCBwYXRoMiA9IFtdLCB0YXJnZXQgPSBmdW5jdGlvbigpIHsKfSkgewogIGxldCBpc1Byb3h5UmVsZWFzZWQgPSBmYWxzZTsKICBjb25zdCBwcm94eTIgPSBuZXcgUHJveHkodGFyZ2V0LCB7CiAgICBnZXQoX3RhcmdldCwgcHJvcCkgewogICAgICB0aHJvd0lmUHJveHlSZWxlYXNlZChpc1Byb3h5UmVsZWFzZWQpOwogICAgICBpZiAocHJvcCA9PT0gcmVsZWFzZVByb3h5KSB7CiAgICAgICAgcmV0dXJuICgpID0+IHsKICAgICAgICAgIHJldHVybiByZXF1ZXN0UmVzcG9uc2VNZXNzYWdlKGVwLCB7CiAgICAgICAgICAgIHR5cGU6IDUsCiAgICAgICAgICAgIHBhdGg6IHBhdGgyLm1hcCgocDgpID0+IHA4LnRvU3RyaW5nKCkpCiAgICAgICAgICB9KS50aGVuKCgpID0+IHsKICAgICAgICAgICAgY2xvc2VFbmRQb2ludChlcCk7CiAgICAgICAgICAgIGlzUHJveHlSZWxlYXNlZCA9IHRydWU7CiAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICB9CiAgICAgIGlmIChwcm9wID09PSAidGhlbiIpIHsKICAgICAgICBpZiAocGF0aDIubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4geyB0aGVuOiAoKSA9PiBwcm94eTIgfTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcjExID0gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCwgewogICAgICAgICAgdHlwZTogMCwKICAgICAgICAgIHBhdGg6IHBhdGgyLm1hcCgocDgpID0+IHA4LnRvU3RyaW5nKCkpCiAgICAgICAgfSkudGhlbihmcm9tV2lyZVZhbHVlKTsKICAgICAgICByZXR1cm4gcjExLnRoZW4uYmluZChyMTEpOwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVQcm94eShlcCwgWy4uLnBhdGgyLCBwcm9wXSk7CiAgICB9LAogICAgc2V0KF90YXJnZXQsIHByb3AsIHJhd1ZhbHVlKSB7CiAgICAgIHRocm93SWZQcm94eVJlbGVhc2VkKGlzUHJveHlSZWxlYXNlZCk7CiAgICAgIGNvbnN0IFt2YWx1ZTIsIHRyYW5zZmVyYWJsZXNdID0gdG9XaXJlVmFsdWUocmF3VmFsdWUpOwogICAgICByZXR1cm4gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCwgewogICAgICAgIHR5cGU6IDEsCiAgICAgICAgcGF0aDogWy4uLnBhdGgyLCBwcm9wXS5tYXAoKHA4KSA9PiBwOC50b1N0cmluZygpKSwKICAgICAgICB2YWx1ZTogdmFsdWUyCiAgICAgIH0sIHRyYW5zZmVyYWJsZXMpLnRoZW4oZnJvbVdpcmVWYWx1ZSk7CiAgICB9LAogICAgYXBwbHkoX3RhcmdldCwgX3RoaXNBcmcsIHJhd0FyZ3VtZW50TGlzdCkgewogICAgICB0aHJvd0lmUHJveHlSZWxlYXNlZChpc1Byb3h5UmVsZWFzZWQpOwogICAgICBjb25zdCBsYXN0MyA9IHBhdGgyW3BhdGgyLmxlbmd0aCAtIDFdOwogICAgICBpZiAobGFzdDMgPT09IGNyZWF0ZUVuZHBvaW50KSB7CiAgICAgICAgcmV0dXJuIHJlcXVlc3RSZXNwb25zZU1lc3NhZ2UoZXAsIHsKICAgICAgICAgIHR5cGU6IDQKICAgICAgICB9KS50aGVuKGZyb21XaXJlVmFsdWUpOwogICAgICB9CiAgICAgIGlmIChsYXN0MyA9PT0gImJpbmQiKSB7CiAgICAgICAgcmV0dXJuIGNyZWF0ZVByb3h5KGVwLCBwYXRoMi5zbGljZSgwLCAtMSkpOwogICAgICB9CiAgICAgIGNvbnN0IFthcmd1bWVudExpc3QsIHRyYW5zZmVyYWJsZXNdID0gcHJvY2Vzc0FyZ3VtZW50cyhyYXdBcmd1bWVudExpc3QpOwogICAgICByZXR1cm4gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCwgewogICAgICAgIHR5cGU6IDIsCiAgICAgICAgcGF0aDogcGF0aDIubWFwKChwOCkgPT4gcDgudG9TdHJpbmcoKSksCiAgICAgICAgYXJndW1lbnRMaXN0CiAgICAgIH0sIHRyYW5zZmVyYWJsZXMpLnRoZW4oZnJvbVdpcmVWYWx1ZSk7CiAgICB9LAogICAgY29uc3RydWN0KF90YXJnZXQsIHJhd0FyZ3VtZW50TGlzdCkgewogICAgICB0aHJvd0lmUHJveHlSZWxlYXNlZChpc1Byb3h5UmVsZWFzZWQpOwogICAgICBjb25zdCBbYXJndW1lbnRMaXN0LCB0cmFuc2ZlcmFibGVzXSA9IHByb2Nlc3NBcmd1bWVudHMocmF3QXJndW1lbnRMaXN0KTsKICAgICAgcmV0dXJuIHJlcXVlc3RSZXNwb25zZU1lc3NhZ2UoZXAsIHsKICAgICAgICB0eXBlOiAzLAogICAgICAgIHBhdGg6IHBhdGgyLm1hcCgocDgpID0+IHA4LnRvU3RyaW5nKCkpLAogICAgICAgIGFyZ3VtZW50TGlzdAogICAgICB9LCB0cmFuc2ZlcmFibGVzKS50aGVuKGZyb21XaXJlVmFsdWUpOwogICAgfQogIH0pOwogIHJldHVybiBwcm94eTI7Cn0KZnVuY3Rpb24gbXlGbGF0KGFycikgewogIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBhcnIpOwp9CmZ1bmN0aW9uIHByb2Nlc3NBcmd1bWVudHMoYXJndW1lbnRMaXN0KSB7CiAgY29uc3QgcHJvY2Vzc2VkID0gYXJndW1lbnRMaXN0Lm1hcCh0b1dpcmVWYWx1ZSk7CiAgcmV0dXJuIFtwcm9jZXNzZWQubWFwKCh2NikgPT4gdjZbMF0pLCBteUZsYXQocHJvY2Vzc2VkLm1hcCgodjYpID0+IHY2WzFdKSldOwp9CmZ1bmN0aW9uIHRyYW5zZmVyKG9iaiwgdHJhbnNmZXJzKSB7CiAgdHJhbnNmZXJDYWNoZS5zZXQob2JqLCB0cmFuc2ZlcnMpOwogIHJldHVybiBvYmo7Cn0KZnVuY3Rpb24gcHJveHkob2JqKSB7CiAgcmV0dXJuIE9iamVjdC5hc3NpZ24ob2JqLCB7IFtwcm94eU1hcmtlcl06IHRydWUgfSk7Cn0KZnVuY3Rpb24gd2luZG93RW5kcG9pbnQodzQsIGNvbnRleHQyID0gc2VsZiwgdGFyZ2V0T3JpZ2luID0gIioiKSB7CiAgcmV0dXJuIHsKICAgIHBvc3RNZXNzYWdlOiAobXNnLCB0cmFuc2ZlcmFibGVzKSA9PiB3NC5wb3N0TWVzc2FnZShtc2csIHRhcmdldE9yaWdpbiwgdHJhbnNmZXJhYmxlcyksCiAgICBhZGRFdmVudExpc3RlbmVyOiBjb250ZXh0Mi5hZGRFdmVudExpc3RlbmVyLmJpbmQoY29udGV4dDIpLAogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogY29udGV4dDIucmVtb3ZlRXZlbnRMaXN0ZW5lci5iaW5kKGNvbnRleHQyKQogIH07Cn0KZnVuY3Rpb24gdG9XaXJlVmFsdWUodmFsdWUyKSB7CiAgZm9yIChjb25zdCBbbmFtZSwgaGFuZGxlcjJdIG9mIHRyYW5zZmVySGFuZGxlcnMpIHsKICAgIGlmIChoYW5kbGVyMi5jYW5IYW5kbGUodmFsdWUyKSkgewogICAgICBjb25zdCBbc2VyaWFsaXplZFZhbHVlLCB0cmFuc2ZlcmFibGVzXSA9IGhhbmRsZXIyLnNlcmlhbGl6ZSh2YWx1ZTIpOwogICAgICByZXR1cm4gWwogICAgICAgIHsKICAgICAgICAgIHR5cGU6IDMsCiAgICAgICAgICBuYW1lLAogICAgICAgICAgdmFsdWU6IHNlcmlhbGl6ZWRWYWx1ZQogICAgICAgIH0sCiAgICAgICAgdHJhbnNmZXJhYmxlcwogICAgICBdOwogICAgfQogIH0KICByZXR1cm4gWwogICAgewogICAgICB0eXBlOiAwLAogICAgICB2YWx1ZTogdmFsdWUyCiAgICB9LAogICAgdHJhbnNmZXJDYWNoZS5nZXQodmFsdWUyKSB8fCBbXQogIF07Cn0KZnVuY3Rpb24gZnJvbVdpcmVWYWx1ZSh2YWx1ZTIpIHsKICBzd2l0Y2ggKHZhbHVlMi50eXBlKSB7CiAgICBjYXNlIDM6CiAgICAgIHJldHVybiB0cmFuc2ZlckhhbmRsZXJzLmdldCh2YWx1ZTIubmFtZSkuZGVzZXJpYWxpemUodmFsdWUyLnZhbHVlKTsKICAgIGNhc2UgMDoKICAgICAgcmV0dXJuIHZhbHVlMi52YWx1ZTsKICB9Cn0KZnVuY3Rpb24gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCwgbXNnLCB0cmFuc2ZlcnMpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiB7CiAgICBjb25zdCBpZCA9IGdlbmVyYXRlVVVJRCgpOwogICAgZXAuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIGZ1bmN0aW9uIGw2KGV2KSB7CiAgICAgIGlmICghZXYuZGF0YSB8fCAhZXYuZGF0YS5pZCB8fCBldi5kYXRhLmlkICE9PSBpZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlcC5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgbDYpOwogICAgICByZXNvbHZlMihldi5kYXRhKTsKICAgIH0pOwogICAgaWYgKGVwLnN0YXJ0KSB7CiAgICAgIGVwLnN0YXJ0KCk7CiAgICB9CiAgICBlcC5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKHsgaWQgfSwgbXNnKSwgdHJhbnNmZXJzKTsKICB9KTsKfQpmdW5jdGlvbiBnZW5lcmF0ZVVVSUQoKSB7CiAgcmV0dXJuIG5ldyBBcnJheSg0KS5maWxsKDApLm1hcCgoKSA9PiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikudG9TdHJpbmcoMTYpKS5qb2luKCItIik7Cn0KdmFyIF9fZGVmUHJvcDIsIF9fZXhwb3J0MiwgY29tbGlua19leHBvcnRzLCBwcm94eU1hcmtlciwgY3JlYXRlRW5kcG9pbnQsIHJlbGVhc2VQcm94eSwgdGhyb3dNYXJrZXIsIGlzT2JqZWN0MywgcHJveHlUcmFuc2ZlckhhbmRsZXIsIHRocm93VHJhbnNmZXJIYW5kbGVyLCB0cmFuc2ZlckhhbmRsZXJzLCB0cmFuc2ZlckNhY2hlOwp2YXIgaW5pdF92ZW5kb3IgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC92ZW5kb3IvaW5kZXguanMiKCkgewogICAgX19kZWZQcm9wMiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKICAgIF9fZXhwb3J0MiA9ICh0YXJnZXQsIGFsbDMpID0+IHsKICAgICAgZm9yICh2YXIgbmFtZSBpbiBhbGwzKQogICAgICAgIF9fZGVmUHJvcDIodGFyZ2V0LCBuYW1lLCB7IGdldDogYWxsM1tuYW1lXSwgZW51bWVyYWJsZTogdHJ1ZSB9KTsKICAgIH07CiAgICBjb21saW5rX2V4cG9ydHMgPSB7fTsKICAgIF9fZXhwb3J0Mihjb21saW5rX2V4cG9ydHMsIHsKICAgICAgY3JlYXRlRW5kcG9pbnQ6ICgpID0+IGNyZWF0ZUVuZHBvaW50LAogICAgICBleHBvc2U6ICgpID0+IGV4cG9zZSwKICAgICAgcHJveHk6ICgpID0+IHByb3h5LAogICAgICBwcm94eU1hcmtlcjogKCkgPT4gcHJveHlNYXJrZXIsCiAgICAgIHJlbGVhc2VQcm94eTogKCkgPT4gcmVsZWFzZVByb3h5LAogICAgICB0cmFuc2ZlcjogKCkgPT4gdHJhbnNmZXIsCiAgICAgIHRyYW5zZmVySGFuZGxlcnM6ICgpID0+IHRyYW5zZmVySGFuZGxlcnMsCiAgICAgIHdpbmRvd0VuZHBvaW50OiAoKSA9PiB3aW5kb3dFbmRwb2ludCwKICAgICAgd3JhcDogKCkgPT4gd3JhcDQKICAgIH0pOwogICAgcHJveHlNYXJrZXIgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sKCJDb21saW5rLnByb3h5Iik7CiAgICBjcmVhdGVFbmRwb2ludCA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woIkNvbWxpbmsuZW5kcG9pbnQiKTsKICAgIHJlbGVhc2VQcm94eSA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woIkNvbWxpbmsucmVsZWFzZVByb3h5Iik7CiAgICB0aHJvd01hcmtlciA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woIkNvbWxpbmsudGhyb3duIik7CiAgICBpc09iamVjdDMgPSAodmFsKSA9PiB0eXBlb2YgdmFsID09PSAib2JqZWN0IiAmJiB2YWwgIT09IG51bGwgfHwgdHlwZW9mIHZhbCA9PT0gImZ1bmN0aW9uIjsKICAgIHByb3h5VHJhbnNmZXJIYW5kbGVyID0gewogICAgICBjYW5IYW5kbGU6ICh2YWwpID0+IGlzT2JqZWN0Myh2YWwpICYmIHZhbFtwcm94eU1hcmtlcl0sCiAgICAgIHNlcmlhbGl6ZShvYmopIHsKICAgICAgICBjb25zdCB7IHBvcnQxLCBwb3J0MiB9ID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7CiAgICAgICAgZXhwb3NlKG9iaiwgcG9ydDEpOwogICAgICAgIHJldHVybiBbcG9ydDIsIFtwb3J0Ml1dOwogICAgICB9LAogICAgICBkZXNlcmlhbGl6ZShwb3J0KSB7CiAgICAgICAgcG9ydC5zdGFydCgpOwogICAgICAgIHJldHVybiB3cmFwNChwb3J0KTsKICAgICAgfQogICAgfTsKICAgIHRocm93VHJhbnNmZXJIYW5kbGVyID0gewogICAgICBjYW5IYW5kbGU6ICh2YWx1ZTIpID0+IGlzT2JqZWN0Myh2YWx1ZTIpICYmIHRocm93TWFya2VyIGluIHZhbHVlMiwKICAgICAgc2VyaWFsaXplKHsgdmFsdWU6IHZhbHVlMiB9KSB7CiAgICAgICAgbGV0IHNlcmlhbGl6ZWQ7CiAgICAgICAgaWYgKHZhbHVlMiBpbnN0YW5jZW9mIEVycm9yKSB7CiAgICAgICAgICBzZXJpYWxpemVkID0gewogICAgICAgICAgICBpc0Vycm9yOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogewogICAgICAgICAgICAgIG1lc3NhZ2U6IHZhbHVlMi5tZXNzYWdlLAogICAgICAgICAgICAgIG5hbWU6IHZhbHVlMi5uYW1lLAogICAgICAgICAgICAgIHN0YWNrOiB2YWx1ZTIuc3RhY2sKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2VyaWFsaXplZCA9IHsgaXNFcnJvcjogZmFsc2UsIHZhbHVlOiB2YWx1ZTIgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtzZXJpYWxpemVkLCBbXV07CiAgICAgIH0sCiAgICAgIGRlc2VyaWFsaXplKHNlcmlhbGl6ZWQpIHsKICAgICAgICBpZiAoc2VyaWFsaXplZC5pc0Vycm9yKSB7CiAgICAgICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihzZXJpYWxpemVkLnZhbHVlLm1lc3NhZ2UpLCBzZXJpYWxpemVkLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgc2VyaWFsaXplZC52YWx1ZTsKICAgICAgfQogICAgfTsKICAgIHRyYW5zZmVySGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcChbCiAgICAgIFsicHJveHkiLCBwcm94eVRyYW5zZmVySGFuZGxlcl0sCiAgICAgIFsidGhyb3ciLCB0aHJvd1RyYW5zZmVySGFuZGxlcl0KICAgIF0pOwogICAgdHJhbnNmZXJDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvdXRpbHMvcmVsb2FkLXByZXZpZXcuanMKdmFyIGluaXRfcmVsb2FkX3ByZXZpZXcgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC91dGlscy9yZWxvYWQtcHJldmlldy5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC91dGlscy9pcy1wcmV2aWV3LW1lc3NhZ2UuanMKZnVuY3Rpb24gaXNQcmV2aWV3TWVzc2FnZShkYXRhKSB7CiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gIm9iamVjdCIpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgaWYgKCEoInR5cGUiIGluIGRhdGEpIHx8ICFQUkVWSUVXX01FU1NBR0VfVFlQRVMuaW5jbHVkZXMoZGF0YS50eXBlKSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gdHJ1ZTsKfQp2YXIgUFJFVklFV19NRVNTQUdFX1RZUEVTOwp2YXIgaW5pdF9pc19wcmV2aWV3X21lc3NhZ2UgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC91dGlscy9pcy1wcmV2aWV3LW1lc3NhZ2UuanMiKCkgewogICAgaW5pdF9wcmV2aWV3X21lc3NhZ2VfdHlwZXMoKTsKICAgIFBSRVZJRVdfTUVTU0FHRV9UWVBFUyA9IFsKICAgICAgUHJldmlld01lc3NhZ2VUeXBlLkNvbnNvbGVFcnJvciwKICAgICAgUHJldmlld01lc3NhZ2VUeXBlLlVuY2F1Z2h0RXhjZXB0aW9uLAogICAgICBQcmV2aWV3TWVzc2FnZVR5cGUuVW5oYW5kbGVkUmVqZWN0aW9uCiAgICBdOwogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvdXRpbHMuanMKdmFyIGluaXRfdXRpbHMyID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvdXRpbHMuanMiKCkgewogICAgaW5pdF9yZWxvYWRfcHJldmlldygpOwogICAgaW5pdF9wcmV2aWV3X21lc3NhZ2VfdHlwZXMoKTsKICAgIGluaXRfaXNfcHJldmlld19tZXNzYWdlKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC91dGlscy9udWxsLXByb3RvdHlwZS5qcwpmdW5jdGlvbiBudWxsUHJvdG90eXBlKHNvdXJjZSkgewogIGNvbnN0IHByb3RvdHlwZSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpOwogIGlmICghc291cmNlKSB7CiAgICByZXR1cm4gcHJvdG90eXBlOwogIH0KICByZXR1cm4gT2JqZWN0LmFzc2lnbihwcm90b3R5cGUsIHNvdXJjZSk7Cn0KdmFyIGluaXRfbnVsbF9wcm90b3R5cGUgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC91dGlscy9udWxsLXByb3RvdHlwZS5qcyIoKSB7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC91dGlscy9maWxlLXN5c3RlbS5qcwpmdW5jdGlvbiB0b0ludGVybmFsRmlsZVN5c3RlbVRyZWUodHJlZSkgewogIGNvbnN0IG5ld1RyZWUgPSB7IGQ6IHt9IH07CiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHRyZWUpKSB7CiAgICBjb25zdCBlbnRyeSA9IHRyZWVbbmFtZV07CiAgICBpZiAoImZpbGUiIGluIGVudHJ5KSB7CiAgICAgIGlmICgic3ltbGluayIgaW4gZW50cnkuZmlsZSkgewogICAgICAgIG5ld1RyZWUuZFtuYW1lXSA9IHsgZjogeyBsOiBlbnRyeS5maWxlLnN5bWxpbmsgfSB9OwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGNvbnRlbnRzID0gZW50cnkuZmlsZS5jb250ZW50czsKICAgICAgY29uc3Qgc3RyaW5nQ29udGVudHMgPSB0eXBlb2YgY29udGVudHMgPT09ICJzdHJpbmciID8gY29udGVudHMgOiBiaW5hcnlEZWNvZGVyLmRlY29kZShjb250ZW50cyk7CiAgICAgIGNvbnN0IGJpbmFyeSA9IHR5cGVvZiBjb250ZW50cyA9PT0gInN0cmluZyIgPyB7fSA6IHsgYjogdHJ1ZSB9OwogICAgICBuZXdUcmVlLmRbbmFtZV0gPSB7IGY6IHsgYzogc3RyaW5nQ29udGVudHMsIC4uLmJpbmFyeSB9IH07CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3QgbmV3RW50cnkgPSB0b0ludGVybmFsRmlsZVN5c3RlbVRyZWUoZW50cnkuZGlyZWN0b3J5KTsKICAgIG5ld1RyZWUuZFtuYW1lXSA9IG5ld0VudHJ5OwogIH0KICByZXR1cm4gbmV3VHJlZTsKfQpmdW5jdGlvbiB0b0V4dGVybmFsRmlsZVN5c3RlbVRyZWUodHJlZSkgewogIGNvbnN0IG5ld1RyZWUgPSBudWxsUHJvdG90eXBlKCk7CiAgaWYgKCJmIiBpbiB0cmVlKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkl0IGlzIG5vdCBwb3NzaWJsZSB0byBleHBvcnQgYSBzaW5nbGUgZmlsZSBpbiB0aGUgSlNPTiBmb3JtYXQuIik7CiAgfQogIGlmICgiZCIgaW4gdHJlZSkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHRyZWUuZCkpIHsKICAgICAgY29uc3QgZW50cnkgPSB0cmVlLmRbbmFtZV07CiAgICAgIGlmICgiZCIgaW4gZW50cnkpIHsKICAgICAgICBuZXdUcmVlW25hbWVdID0gbnVsbFByb3RvdHlwZSh7CiAgICAgICAgICBkaXJlY3Rvcnk6IHRvRXh0ZXJuYWxGaWxlU3lzdGVtVHJlZShlbnRyeSkKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmICgiZiIgaW4gZW50cnkpIHsKICAgICAgICBpZiAoImMiIGluIGVudHJ5LmYpIHsKICAgICAgICAgIG5ld1RyZWVbbmFtZV0gPSBudWxsUHJvdG90eXBlKHsKICAgICAgICAgICAgZmlsZTogbnVsbFByb3RvdHlwZSh7CiAgICAgICAgICAgICAgY29udGVudHM6IGVudHJ5LmYuYiA/IGZyb21CaW5hcnlTdHJpbmcoZW50cnkuZi5jKSA6IGVudHJ5LmYuYwogICAgICAgICAgICB9KQogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIGlmICgibCIgaW4gZW50cnkuZikgewogICAgICAgICAgbmV3VHJlZVtuYW1lXSA9IG51bGxQcm90b3R5cGUoewogICAgICAgICAgICBmaWxlOiBudWxsUHJvdG90eXBlKHsKICAgICAgICAgICAgICBzeW1saW5rOiBlbnRyeS5mLmwKICAgICAgICAgICAgfSkKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICByZXR1cm4gbmV3VHJlZTsKfQpmdW5jdGlvbiBmcm9tQmluYXJ5U3RyaW5nKHMxMCkgewogIGNvbnN0IGVuY29kZWQgPSBuZXcgVWludDhBcnJheShzMTAubGVuZ3RoKTsKICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBzMTAubGVuZ3RoOyBpMTErKykgewogICAgZW5jb2RlZFtpMTFdID0gczEwW2kxMV0uY2hhckNvZGVBdCgwKTsKICB9CiAgcmV0dXJuIGVuY29kZWQ7Cn0KdmFyIGJpbmFyeURlY29kZXI7CnZhciBpbml0X2ZpbGVfc3lzdGVtID0gX19lc20oewogICJub2RlX21vZHVsZXMvLnBucG0vQHRlbXBmaXgrd2ViY29udGFpbmVyX19hcGlAMS42LjEvbm9kZV9tb2R1bGVzL0B0ZW1wZml4L3dlYmNvbnRhaW5lcl9fYXBpL2Rpc3QvdXRpbHMvZmlsZS1zeXN0ZW0uanMiKCkgewogICAgaW5pdF9udWxsX3Byb3RvdHlwZSgpOwogICAgYmluYXJ5RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigibGF0aW4xIik7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC9pbmRleC5qcwpmdW5jdGlvbiBjb25maWd1cmVBUElLZXkoa2V5MikgewogIGlmIChhdXRoU3RhdGUuYm9vdENhbGxlZCkgewogICAgdGhyb3cgbmV3IEVycm9yKCJgY29uZmlndXJlQVBJS2V5YCBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCBiZWZvcmUgYFdlYkNvbnRhaW5lci5ib290YCIpOwogIH0KICBpZnJhbWVTZXR0aW5ncy5zZXRRdWVyeVBhcmFtKCJjbGllbnRfaWQiLCBrZXkyKTsKfQphc3luYyBmdW5jdGlvbiB1bnN5bmNocm9uaXplZEJvb3Qob3B0aW9ucykgewogIGNvbnN0IHsgc2VydmVyUHJvbWlzZSB9ID0gc2VydmVyRmFjdG9yeShvcHRpb25zKTsKICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBzZXJ2ZXJQcm9taXNlOwogIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgc2VydmVyLmJ1aWxkKHsKICAgIGhvc3Q6IHdpbmRvdy5sb2NhdGlvbi5ob3N0LAogICAgdmVyc2lvbjogIjEuNi4xIiwKICAgIHdvcmtkaXJOYW1lOiBvcHRpb25zLndvcmtkaXJOYW1lLAogICAgZm9yd2FyZFByZXZpZXdFcnJvcnM6IG9wdGlvbnMuZm9yd2FyZFByZXZpZXdFcnJvcnMKICB9KTsKICBjb25zdCBbZnMsIHByZXZpZXdTY3JpcHQsIHJ1bnRpbWVJbmZvXSA9IGF3YWl0IFByb21pc2UuYWxsKFsKICAgIGluc3RhbmNlLmZzKCksCiAgICBpbnN0YW5jZS5wcmV2aWV3U2NyaXB0KCksCiAgICBpbnN0YW5jZS5ydW50aW1lSW5mbygpCiAgXSk7CiAgcmV0dXJuIG5ldyBXZWJDb250YWluZXIoaW5zdGFuY2UsIGZzLCBwcmV2aWV3U2NyaXB0LCBydW50aW1lSW5mbyk7Cn0KZnVuY3Rpb24gYmluYXJ5TGlzdGVuZXIobGlzdGVuZXIyKSB7CiAgaWYgKGxpc3RlbmVyMiA9PSBudWxsKSB7CiAgICByZXR1cm4gdm9pZCAwOwogIH0KICByZXR1cm4gKGRhdGEpID0+IHsKICAgIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkgewogICAgICBsaXN0ZW5lcjIoZGVjb2Rlci5kZWNvZGUoZGF0YSkpOwogICAgfSBlbHNlIGlmIChkYXRhID09IG51bGwpIHsKICAgICAgbGlzdGVuZXIyKG51bGwpOwogICAgfQogIH07Cn0KZnVuY3Rpb24gcHJveHlMaXN0ZW5lcihsaXN0ZW5lcjIpIHsKICBpZiAobGlzdGVuZXIyID09IG51bGwpIHsKICAgIHJldHVybiB2b2lkIDA7CiAgfQogIHJldHVybiBjb21saW5rX2V4cG9ydHMucHJveHkobGlzdGVuZXIyKTsKfQpmdW5jdGlvbiBzZXJ2ZXJGYWN0b3J5KG9wdGlvbnMpIHsKICBpZiAoY2FjaGVkU2VydmVyUHJvbWlzZSAhPSBudWxsKSB7CiAgICBpZiAob3B0aW9ucy5jb2VwICE9PSBjYWNoZWRCb290T3B0aW9ucy5jb2VwKSB7CiAgICAgIGNvbnNvbGUud2FybihgQXR0ZW1wdGluZyB0byBib290IFdlYkNvbnRhaW5lciB3aXRoICdjb2VwOiAke29wdGlvbnMuY29lcH0nYCk7CiAgICAgIGNvbnNvbGUud2FybihgRmlyc3QgYm9vdCBoYWQgJ2NvZXA6ICR7Y2FjaGVkQm9vdE9wdGlvbnMuY29lcH0nLCBuZXcgc2V0dGluZ3Mgd2lsbCBub3QgdGFrZSBlZmZlY3QhYCk7CiAgICB9CiAgICByZXR1cm4geyBzZXJ2ZXJQcm9taXNlOiBjYWNoZWRTZXJ2ZXJQcm9taXNlIH07CiAgfQogIGlmIChvcHRpb25zLmNvZXApIHsKICAgIGlmcmFtZVNldHRpbmdzLnNldFF1ZXJ5UGFyYW0oImNvZXAiLCBvcHRpb25zLmNvZXApOwogIH0KICBpZiAob3B0aW9ucy5leHBlcmltZW50YWxOb2RlKSB7CiAgICBpZnJhbWVTZXR0aW5ncy5zZXRRdWVyeVBhcmFtKCJleHBlcmltZW50YWxfbm9kZSIsICIxIik7CiAgfQogIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwogIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogIGlmcmFtZS5zZXRBdHRyaWJ1dGUoImFsbG93IiwgImNyb3NzLW9yaWdpbi1pc29sYXRlZCIpOwogIGNvbnN0IHVybCA9IGlmcmFtZVNldHRpbmdzLnVybDsKICBpZnJhbWUuc3JjID0gdXJsLnRvU3RyaW5nKCk7CiAgY29uc3QgeyBvcmlnaW4gfSA9IHVybDsKICBjYWNoZWRCb290T3B0aW9ucyA9IHsgLi4ub3B0aW9ucyB9OwogIGNhY2hlZFNlcnZlclByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHsKICAgIGNvbnN0IG9uTWVzc2FnZTUgPSAoZXZlbnQpID0+IHsKICAgICAgaWYgKGV2ZW50Lm9yaWdpbiAhPT0gb3JpZ2luKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gZXZlbnQ7CiAgICAgIGlmIChkYXRhLnR5cGUgPT09ICJpbml0IikgewogICAgICAgIHJlc29sdmUyKGNvbWxpbmtfZXhwb3J0cy53cmFwKGV2ZW50LnBvcnRzWzBdKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChkYXRhLnR5cGUgPT09ICJ3YXJuaW5nIikgewogICAgICAgIGNvbnNvbGVbZGF0YS5sZXZlbF0uY2FsbChjb25zb2xlLCBkYXRhLm1lc3NhZ2UpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgb25NZXNzYWdlNSk7CiAgfSk7CiAgZG9jdW1lbnQuYm9keS5pbnNlcnRCZWZvcmUoaWZyYW1lLCBudWxsKTsKICByZXR1cm4geyBzZXJ2ZXJQcm9taXNlOiBjYWNoZWRTZXJ2ZXJQcm9taXNlIH07Cn0KZnVuY3Rpb24gaXNTdHJpbmdBcnJheShsaXN0NSkgewogIHJldHVybiB0eXBlb2YgbGlzdDVbMF0gPT09ICJzdHJpbmciOwp9CmZ1bmN0aW9uIGlzVHlwZWRBcnJheUNvbGxlY3Rpb24obGlzdDUpIHsKICByZXR1cm4gbGlzdDVbMF0gaW5zdGFuY2VvZiBVaW50OEFycmF5Owp9CmZ1bmN0aW9uIHN0cmVhbVdpdGhQdXNoKCkgewogIGxldCBjb250cm9sbGVyID0gbnVsbDsKICBjb25zdCBzdHJlYW0gPSBuZXcgUmVhZGFibGVTdHJlYW0oewogICAgc3RhcnQoY29udHJvbGxlcl8pIHsKICAgICAgY29udHJvbGxlciA9IGNvbnRyb2xsZXJfOwogICAgfQogIH0pOwogIGNvbnN0IHB1c2gyID0gKGl0ZW0pID0+IHsKICAgIGlmIChpdGVtICE9IG51bGwpIHsKICAgICAgY29udHJvbGxlcj8uZW5xdWV1ZShpdGVtKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnRyb2xsZXI/LmNsb3NlKCk7CiAgICAgIGNvbnRyb2xsZXIgPSBudWxsOwogICAgfQogIH07CiAgcmV0dXJuIHsgc3RyZWFtLCBwdXNoOiBwdXNoMiB9Owp9CmZ1bmN0aW9uIHN5bmNTdWJzY3JpcHRpb24obGlzdGVuZXIyKSB7CiAgbGV0IHN0b3BwZWQgPSBmYWxzZTsKICBsZXQgdW5zdWJzY3JpYmUgPSAoKSA9PiB7CiAgfTsKICBjb25zdCB3cmFwcGVkID0gKCguLi5hcmdzKSA9PiB7CiAgICBpZiAoc3RvcHBlZCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBsaXN0ZW5lcjIoLi4uYXJncyk7CiAgfSk7CiAgcmV0dXJuIHsKICAgIHN1YnNjcmliZShwcm9taXNlKSB7CiAgICAgIHByb21pc2UudGhlbigodW5zdWJzY3JpYmVfKSA9PiB7CiAgICAgICAgdW5zdWJzY3JpYmUgPSB1bnN1YnNjcmliZV87CiAgICAgICAgaWYgKHN0b3BwZWQpIHsKICAgICAgICAgIHVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuICgpID0+IHsKICAgICAgICBzdG9wcGVkID0gdHJ1ZTsKICAgICAgICB1bnN1YnNjcmliZSgpOwogICAgICB9OwogICAgfSwKICAgIGxpc3RlbmVyOiB3cmFwcGVkCiAgfTsKfQp2YXIgYXV0aDIsIGJvb3RQcm9taXNlLCBjYWNoZWRTZXJ2ZXJQcm9taXNlLCBjYWNoZWRCb290T3B0aW9ucywgZGVjb2RlciwgZW5jb2RlciwgV2ViQ29udGFpbmVyLCBESVJfRU5UUllfVFlQRV9GSUxFLCBESVJfRU5UUllfVFlQRV9ESVIsIERpckVudEltcGwsIEZTV2F0Y2hlciwgV2ViQ29udGFpbmVyUHJvY2Vzc0ltcGwsIEZpbGVTeXN0ZW1BUElDbGllbnQ7CnZhciBpbml0X2Rpc3QgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcGZpeCt3ZWJjb250YWluZXJfX2FwaUAxLjYuMS9ub2RlX21vZHVsZXMvQHRlbXBmaXgvd2ViY29udGFpbmVyX19hcGkvZGlzdC9pbmRleC5qcyIoKSB7CiAgICBpbml0X2F1dGhfc3RhdGUoKTsKICAgIGluaXRfcHJldmlld19tZXNzYWdlX3R5cGVzKCk7CiAgICBpbml0X3ZlbmRvcigpOwogICAgaW5pdF9hdXRoX3N0YXRlKCk7CiAgICBpbml0X3Rva2VucygpOwogICAgaW5pdF9pZnJhbWVfdXJsKCk7CiAgICBpbml0X3V0aWxzMigpOwogICAgaW5pdF9maWxlX3N5c3RlbSgpOwogICAgaW5pdF91dGlsczIoKTsKICAgIGF1dGgyID0gYXV0aDsKICAgIGJvb3RQcm9taXNlID0gbnVsbDsKICAgIGNhY2hlZFNlcnZlclByb21pc2UgPSBudWxsOwogICAgY2FjaGVkQm9vdE9wdGlvbnMgPSB7fTsKICAgIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTsKICAgIGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTsKICAgIFdlYkNvbnRhaW5lciA9IGNsYXNzIF9XZWJDb250YWluZXIgewogICAgICBfaW5zdGFuY2U7CiAgICAgIF9ydW50aW1lSW5mbzsKICAgICAgLyoqCiAgICAgICAqIEdpdmVzIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBmaWxlIHN5c3RlbS4KICAgICAgICovCiAgICAgIGZzOwogICAgICAvKiogQGludGVybmFsICovCiAgICAgIHN0YXRpYyBfaW5zdGFuY2UgPSBudWxsOwogICAgICAvKiogQGludGVybmFsICovCiAgICAgIHN0YXRpYyBfdGVhcmRvd25Qcm9taXNlID0gbnVsbDsKICAgICAgX3Rvcm5Eb3duID0gZmFsc2U7CiAgICAgIF91bnN1YnNjcmliZUZyb21Ub2tlbkNoYW5nZWRMaXN0ZW5lciA9ICgpID0+IHsKICAgICAgfTsKICAgICAgLyoqIEBpbnRlcm5hbCAqLwogICAgICBjb25zdHJ1Y3RvcihfaW5zdGFuY2UsIGZzLCBwcmV2aWV3U2NyaXB0LCBfcnVudGltZUluZm8pIHsKICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IF9pbnN0YW5jZTsKICAgICAgICB0aGlzLl9ydW50aW1lSW5mbyA9IF9ydW50aW1lSW5mbzsKICAgICAgICB0aGlzLmZzID0gbmV3IEZpbGVTeXN0ZW1BUElDbGllbnQoZnMpOwogICAgICAgIGlmIChhdXRoU3RhdGUuaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlRnJvbVRva2VuQ2hhbmdlZExpc3RlbmVyID0gYWRkQWNjZXNzVG9rZW5DaGFuZ2VkTGlzdGVuZXIoKGFjY2Vzc1Rva2VuKSA9PiB7CiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlLnNldENyZWRlbnRpYWxzKHsgYWNjZXNzVG9rZW4sIGVkaXRvck9yaWdpbjogYXV0aFN0YXRlLmVkaXRvck9yaWdpbiB9KTsKICAgICAgICAgIH0pOwogICAgICAgICAgKGFzeW5jICgpID0+IHsKICAgICAgICAgICAgYXdhaXQgYXV0aFN0YXRlLmF1dGhDb21wbGV0ZS5wcm9taXNlOwogICAgICAgICAgICBpZiAodGhpcy5fdG9ybkRvd24pIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXNzZXJ0QXV0aFRva2VucyhhdXRoU3RhdGUudG9rZW5zKTsKICAgICAgICAgICAgYXdhaXQgdGhpcy5faW5zdGFuY2Uuc2V0Q3JlZGVudGlhbHMoewogICAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiBhdXRoU3RhdGUudG9rZW5zLmFjY2VzcywKICAgICAgICAgICAgICBlZGl0b3JPcmlnaW46IGF1dGhTdGF0ZS5lZGl0b3JPcmlnaW4KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KSgpLmNhdGNoKChlcnJvcikgPT4gewogICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBhc3luYyBzcGF3bihjb21tYW5kLCBvcHRpb25zT3JBcmdzLCBvcHRpb25zKSB7CiAgICAgICAgbGV0IGFyZ3MgPSBbXTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zT3JBcmdzKSkgewogICAgICAgICAgYXJncyA9IG9wdGlvbnNPckFyZ3M7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBcmdzOwogICAgICAgIH0KICAgICAgICBsZXQgb3V0cHV0ID0gdm9pZCAwOwogICAgICAgIGxldCBvdXRwdXRTdHJlYW0gPSBuZXcgUmVhZGFibGVTdHJlYW0oKTsKICAgICAgICBpZiAob3B0aW9ucz8ub3V0cHV0ICE9PSBmYWxzZSkgewogICAgICAgICAgY29uc3QgcmVzdWx0ID0gc3RyZWFtV2l0aFB1c2goKTsKICAgICAgICAgIG91dHB1dCA9IHJlc3VsdC5wdXNoOwogICAgICAgICAgb3V0cHV0U3RyZWFtID0gcmVzdWx0LnN0cmVhbTsKICAgICAgICB9CiAgICAgICAgbGV0IHN0ZG91dCA9IHZvaWQgMDsKICAgICAgICBsZXQgc3Rkb3V0U3RyZWFtOwogICAgICAgIGxldCBzdGRlcnIgPSB2b2lkIDA7CiAgICAgICAgbGV0IHN0ZGVyclN0cmVhbTsKICAgICAgICBjb25zdCB3cmFwcGVkT3V0cHV0ID0gcHJveHlMaXN0ZW5lcihiaW5hcnlMaXN0ZW5lcihvdXRwdXQpKTsKICAgICAgICBjb25zdCB3cmFwcGVkU3Rkb3V0ID0gcHJveHlMaXN0ZW5lcihiaW5hcnlMaXN0ZW5lcihzdGRvdXQpKTsKICAgICAgICBjb25zdCB3cmFwcGVkU3RkZXJyID0gcHJveHlMaXN0ZW5lcihiaW5hcnlMaXN0ZW5lcihzdGRlcnIpKTsKICAgICAgICBjb25zdCBwcm9jZXNzNCA9IGF3YWl0IHRoaXMuX2luc3RhbmNlLnJ1bih7CiAgICAgICAgICBjb21tYW5kLAogICAgICAgICAgYXJncywKICAgICAgICAgIGN3ZDogb3B0aW9ucz8uY3dkLAogICAgICAgICAgZW52OiBvcHRpb25zPy5lbnYsCiAgICAgICAgICB0ZXJtaW5hbDogb3B0aW9ucz8udGVybWluYWwKICAgICAgICB9LCB3cmFwcGVkU3Rkb3V0LCB3cmFwcGVkU3RkZXJyLCB3cmFwcGVkT3V0cHV0KTsKICAgICAgICByZXR1cm4gbmV3IFdlYkNvbnRhaW5lclByb2Nlc3NJbXBsKHByb2Nlc3M0LCBvdXRwdXRTdHJlYW0sIHN0ZG91dFN0cmVhbSwgc3RkZXJyU3RyZWFtKTsKICAgICAgfQogICAgICBhc3luYyBleHBvcnQocGF0aDIsIG9wdGlvbnMpIHsKICAgICAgICBjb25zdCBzZXJpYWxpemVPcHRpb25zID0gewogICAgICAgICAgZm9ybWF0OiBvcHRpb25zPy5mb3JtYXQgPz8gImpzb24iLAogICAgICAgICAgaW5jbHVkZXM6IG9wdGlvbnM/LmluY2x1ZGVzLAogICAgICAgICAgZXhjbHVkZXM6IG9wdGlvbnM/LmV4Y2x1ZGVzLAogICAgICAgICAgZXh0ZXJuYWw6IHRydWUKICAgICAgICB9OwogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX2luc3RhbmNlLnNlcmlhbGl6ZShwYXRoMiwgc2VyaWFsaXplT3B0aW9ucyk7CiAgICAgICAgaWYgKHNlcmlhbGl6ZU9wdGlvbnMuZm9ybWF0ID09PSAianNvbiIpIHsKICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGRlY29kZXIuZGVjb2RlKHJlc3VsdCkpOwogICAgICAgICAgcmV0dXJuIHRvRXh0ZXJuYWxGaWxlU3lzdGVtVHJlZShkYXRhKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBvbihldmVudCwgbGlzdGVuZXIyKSB7CiAgICAgICAgaWYgKGV2ZW50ID09PSAicHJldmlldy1tZXNzYWdlIikgewogICAgICAgICAgY29uc3Qgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RlbmVyMjsKICAgICAgICAgIGxpc3RlbmVyMiA9ICgobWVzc2FnZTIpID0+IHsKICAgICAgICAgICAgaWYgKGlzUHJldmlld01lc3NhZ2UobWVzc2FnZTIpKSB7CiAgICAgICAgICAgICAgb3JpZ2luYWxMaXN0ZW5lcihtZXNzYWdlMik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBjb25zdCB7IGxpc3RlbmVyOiB3cmFwcGVkLCBzdWJzY3JpYmU6IHN1YnNjcmliZTIgfSA9IHN5bmNTdWJzY3JpcHRpb24obGlzdGVuZXIyKTsKICAgICAgICByZXR1cm4gc3Vic2NyaWJlMih0aGlzLl9pbnN0YW5jZS5vbihldmVudCwgY29tbGlua19leHBvcnRzLnByb3h5KHdyYXBwZWQpKSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIE1vdW50cyBhIHRyZWUgb2YgZmlsZXMgaW50byB0aGUgZmlsZXN5c3RlbS4gVGhpcyBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgdHJlZSBvYmplY3QgKHtAbGluayBGaWxlU3lzdGVtVHJlZX0pCiAgICAgICAqIG9yIGFzIGEgYmluYXJ5IHNuYXBzaG90IGdlbmVyYXRlZCBieSBbYEB3ZWJjb250YWluZXIvc25hcHNob3RgXShodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9Ad2ViY29udGFpbmVyL3NuYXBzaG90KS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHNuYXBzaG90T3JUcmVlIC0gQSB0cmVlIG9mIGZpbGVzLCBvciBhIGJpbmFyeSBzbmFwc2hvdC4gTm90ZSB0aGF0IGJpbmFyeSBwYXlsb2FkcyB3aWxsIGJlIHRyYW5zZmVycmVkLgogICAgICAgKiBAcGFyYW0gb3B0aW9ucy5tb3VudFBvaW50IC0gU3BlY2lmaWVzIGEgbmVzdGVkIHBhdGggd2hlcmUgdGhlIHRyZWUgc2hvdWxkIGJlIG1vdW50ZWQuCiAgICAgICAqLwogICAgICBtb3VudChzbmFwc2hvdE9yVHJlZSwgb3B0aW9ucykgewogICAgICAgIGNvbnN0IHBheWxvYWQgPSBzbmFwc2hvdE9yVHJlZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBzbmFwc2hvdE9yVHJlZSA6IHNuYXBzaG90T3JUcmVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyBuZXcgVWludDhBcnJheShzbmFwc2hvdE9yVHJlZSkgOiBlbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeSh0b0ludGVybmFsRmlsZVN5c3RlbVRyZWUoc25hcHNob3RPclRyZWUpKSk7CiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlLmxvYWRGaWxlcyhjb21saW5rX2V4cG9ydHMudHJhbnNmZXIocGF5bG9hZCwgW3BheWxvYWQuYnVmZmVyXSksIHsKICAgICAgICAgIG1vdW50UG9pbnRzOiBvcHRpb25zPy5tb3VudFBvaW50CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNldCBhIGN1c3RvbSBzY3JpcHQgdG8gYmUgaW5qZWN0ZWQgaW50byBhbGwgcHJldmlld3MuIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIGV2ZXJ5CiAgICAgICAqIGZ1dHVyZSBwYWdlIHJlbG9hZCB3aWxsIGNvbnRhaW4gdGhlIHByb3ZpZGVkIHNjcmlwdCB0YWcgb24gYWxsIEhUTUwgcmVzcG9uc2VzLgogICAgICAgKgogICAgICAgKiBOb3RlOgogICAgICAgKgogICAgICAgKiBXaGVuIHRoaXMgZnVuY3Rpb24gcmVzb2x2ZXMsIGV2ZXJ5IHByZXZpZXcgcmVsb2FkZWQgX2FmdGVyXyB3aWxsIGhhdmUgdGhlIG5ldyBzY3JpcHQuCiAgICAgICAqIEV4aXN0aW5nIHByZXZpZXcgaGF2ZSB0byBiZSBleHBsaWNpdGVseSByZWxvYWRlZC4KICAgICAgICoKICAgICAgICogVG8gcmVsb2FkIGEgcHJldmlldyB5b3UgY2FuIHVzZSBgcmVsb2FkUHJldmlld2AuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSBzY3JpcHRTcmMgU291cmNlIGZvciB0aGUgc2NyaXB0IHRhZy4KICAgICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byBkZWZpbmUgd2hpY2ggdHlwZSBvZiBzY3JpcHQgdGhpcyBpcy4KICAgICAgICovCiAgICAgIHNldFByZXZpZXdTY3JpcHQoc2NyaXB0U3JjLCBvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlLnNldFByZXZpZXdTY3JpcHQoc2NyaXB0U3JjLCBvcHRpb25zKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGBQQVRIYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgcHJvY2Vzc2VzIHN0YXJ0ZWQgdGhyb3VnaCB7QGxpbmsgc3Bhd259LgogICAgICAgKi8KICAgICAgZ2V0IHBhdGgoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bnRpbWVJbmZvLnBhdGg7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFRoZSBmdWxsIHBhdGggdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IChzZWUge0BsaW5rIEZpbGVTeXN0ZW1BUEl9KS4KICAgICAgICovCiAgICAgIGdldCB3b3JrZGlyKCkgewogICAgICAgIHJldHVybiB0aGlzLl9ydW50aW1lSW5mby5jd2Q7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIERlc3Ryb3lzIHRoZSBXZWJDb250YWluZXIgaW5zdGFuY2UsIHR1cm5pbmcgaXQgdW51c2FibGUsIGFuZCByZWxlYXNlcyBpdHMgcmVzb3VyY2VzLiBBZnRlciB0aGlzLAogICAgICAgKiBhIG5ldyBXZWJDb250YWluZXIgaW5zdGFuY2UgY2FuIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcge0BsaW5rIFdlYkNvbnRhaW5lci5ib290IHwgYGJvb3RgfS4KICAgICAgICoKICAgICAgICogQWxsIGVudGl0aWVzIGRlcml2ZWQgZnJvbSB0aGlzIGluc3RhbmNlIChlLmcuIHByb2Nlc3NlcywgdGhlIGZpbGUgc3lzdGVtLCBldGMuKSBhbHNvIGJlY29tZSB1bnVzYWJsZQogICAgICAgKiBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLgogICAgICAgKi8KICAgICAgdGVhcmRvd24oKSB7CiAgICAgICAgaWYgKHRoaXMuX3Rvcm5Eb3duKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldlYkNvbnRhaW5lciBhbHJlYWR5IHRvcm4gZG93biIpOwogICAgICAgIH0KICAgICAgICB0aGlzLl90b3JuRG93biA9IHRydWU7CiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVGcm9tVG9rZW5DaGFuZ2VkTGlzdGVuZXIoKTsKICAgICAgICBjb25zdCB0ZWFyZG93bkZuID0gYXN5bmMgKCkgPT4gewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgYXdhaXQgdGhpcy5mcy5fdGVhcmRvd24oKTsKICAgICAgICAgICAgYXdhaXQgdGhpcy5faW5zdGFuY2UudGVhcmRvd24oKTsKICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlW2NvbWxpbmtfZXhwb3J0cy5yZWxlYXNlUHJveHldKCk7CiAgICAgICAgICAgIGlmIChfV2ViQ29udGFpbmVyLl9pbnN0YW5jZSA9PT0gdGhpcykgewogICAgICAgICAgICAgIF9XZWJDb250YWluZXIuX2luc3RhbmNlID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgX1dlYkNvbnRhaW5lci5fdGVhcmRvd25Qcm9taXNlID0gdGVhcmRvd25GbigpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBCb290cyBhIFdlYkNvbnRhaW5lci4gT25seSBhIHNpbmdsZSBpbnN0YW5jZSBvZiBXZWJDb250YWluZXIgY2FuIGJlIGJvb3RlZCBjb25jdXJyZW50bHkKICAgICAgICogKHNlZSB7QGxpbmsgV2ViQ29udGFpbmVyLnRlYXJkb3duIHwgYHRlYXJkb3duYH0pLgogICAgICAgKgogICAgICAgKiBCb290aW5nIFdlYkNvbnRhaW5lciBpcyBhbiBleHBlbnNpdmUgb3BlcmF0aW9uLgogICAgICAgKi8KICAgICAgc3RhdGljIGFzeW5jIGJvb3Qob3B0aW9ucyA9IHt9KSB7CiAgICAgICAgYXdhaXQgdGhpcy5fdGVhcmRvd25Qcm9taXNlOwogICAgICAgIF9XZWJDb250YWluZXIuX3RlYXJkb3duUHJvbWlzZSA9IG51bGw7CiAgICAgICAgY29uc3QgeyB3b3JrZGlyTmFtZSB9ID0gb3B0aW9uczsKICAgICAgICBpZiAod2luZG93LmNyb3NzT3JpZ2luSXNvbGF0ZWQgJiYgb3B0aW9ucy5jb2VwID09PSAibm9uZSIpIHsKICAgICAgICAgIGNvbnNvbGUud2FybihgQSBDcm9zcy1PcmlnaW4tRW1iZWRkZXItUG9saWN5IGhlYWRlciBpcyByZXF1aXJlZCBpbiBjcm9zcyBvcmlnaW4gaXNvbGF0ZWQgZW52aXJvbm1lbnRzLgpTZXQgdGhlICdjb2VwJyBvcHRpb24gdG8gJ3JlcXVpcmUtY29ycCcuYCk7CiAgICAgICAgfQogICAgICAgIGlmICh3b3JrZGlyTmFtZT8uaW5jbHVkZXMoIi8iKSB8fCB3b3JrZGlyTmFtZSA9PT0gIi4uIiB8fCB3b3JrZGlyTmFtZSA9PT0gIi4iKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIndvcmtkaXJOYW1lIHNob3VsZCBiZSBhIHZhbGlkIGZvbGRlciBuYW1lIik7CiAgICAgICAgfQogICAgICAgIGF1dGhTdGF0ZS5ib290Q2FsbGVkID0gdHJ1ZTsKICAgICAgICB3aGlsZSAoYm9vdFByb21pc2UpIHsKICAgICAgICAgIGF3YWl0IGJvb3RQcm9taXNlOwogICAgICAgIH0KICAgICAgICBpZiAoX1dlYkNvbnRhaW5lci5faW5zdGFuY2UpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiT25seSBhIHNpbmdsZSBXZWJDb250YWluZXIgaW5zdGFuY2UgY2FuIGJlIGJvb3RlZCIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBpbnN0YW5jZVByb21pc2UgPSB1bnN5bmNocm9uaXplZEJvb3Qob3B0aW9ucyk7CiAgICAgICAgYm9vdFByb21pc2UgPSBpbnN0YW5jZVByb21pc2UuY2F0Y2goKCkgPT4gewogICAgICAgIH0pOwogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGluc3RhbmNlUHJvbWlzZTsKICAgICAgICAgIF9XZWJDb250YWluZXIuX2luc3RhbmNlID0gaW5zdGFuY2U7CiAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGJvb3RQcm9taXNlID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBESVJfRU5UUllfVFlQRV9GSUxFID0gMTsKICAgIERJUl9FTlRSWV9UWVBFX0RJUiA9IDI7CiAgICBEaXJFbnRJbXBsID0gY2xhc3MgewogICAgICBuYW1lOwogICAgICBfdHlwZTsKICAgICAgY29uc3RydWN0b3IobmFtZSwgX3R5cGUpIHsKICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICAgIHRoaXMuX3R5cGUgPSBfdHlwZTsKICAgICAgfQogICAgICBpc0ZpbGUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGUgPT09IERJUl9FTlRSWV9UWVBFX0ZJTEU7CiAgICAgIH0KICAgICAgaXNEaXJlY3RvcnkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGUgPT09IERJUl9FTlRSWV9UWVBFX0RJUjsKICAgICAgfQogICAgfTsKICAgIEZTV2F0Y2hlciA9IGNsYXNzIHsKICAgICAgX2FwaUNsaWVudDsKICAgICAgX3BhdGg7CiAgICAgIF9vcHRpb25zOwogICAgICBfbGlzdGVuZXI7CiAgICAgIF93cmFwcGVkTGlzdGVuZXI7CiAgICAgIF93YXRjaGVyOwogICAgICBfY2xvc2VkID0gZmFsc2U7CiAgICAgIGNvbnN0cnVjdG9yKF9hcGlDbGllbnQsIF9wYXRoLCBfb3B0aW9ucywgX2xpc3RlbmVyMikgewogICAgICAgIHRoaXMuX2FwaUNsaWVudCA9IF9hcGlDbGllbnQ7CiAgICAgICAgdGhpcy5fcGF0aCA9IF9wYXRoOwogICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9uczsKICAgICAgICB0aGlzLl9saXN0ZW5lciA9IF9saXN0ZW5lcjI7CiAgICAgICAgdGhpcy5fYXBpQ2xpZW50Ll93YXRjaGVycy5hZGQodGhpcyk7CiAgICAgICAgdGhpcy5fd3JhcHBlZExpc3RlbmVyID0gKGV2ZW50LCBmaWxlbmFtZSkgPT4gewogICAgICAgICAgaWYgKHRoaXMuX2xpc3RlbmVyICYmICF0aGlzLl9jbG9zZWQpIHsKICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXIoZXZlbnQsIGZpbGVuYW1lKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHRoaXMuX2FwaUNsaWVudC5fZnMud2F0Y2godGhpcy5fcGF0aCwgdGhpcy5fb3B0aW9ucywgcHJveHlMaXN0ZW5lcih0aGlzLl93cmFwcGVkTGlzdGVuZXIpKS50aGVuKChfd2F0Y2hlcikgPT4gewogICAgICAgICAgdGhpcy5fd2F0Y2hlciA9IF93YXRjaGVyOwogICAgICAgICAgaWYgKHRoaXMuX2Nsb3NlZCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fdGVhcmRvd24oKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfSkuY2F0Y2goY29uc29sZS5lcnJvcik7CiAgICAgIH0KICAgICAgYXN5bmMgY2xvc2UoKSB7CiAgICAgICAgaWYgKCF0aGlzLl9jbG9zZWQpIHsKICAgICAgICAgIHRoaXMuX2Nsb3NlZCA9IHRydWU7CiAgICAgICAgICB0aGlzLl9hcGlDbGllbnQuX3dhdGNoZXJzLmRlbGV0ZSh0aGlzKTsKICAgICAgICAgIGF3YWl0IHRoaXMuX3RlYXJkb3duKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBAaW50ZXJuYWwKICAgICAgICovCiAgICAgIGFzeW5jIF90ZWFyZG93bigpIHsKICAgICAgICBhd2FpdCB0aGlzLl93YXRjaGVyPy5jbG9zZSgpLmZpbmFsbHkoKCkgPT4gewogICAgICAgICAgdGhpcy5fd2F0Y2hlcj8uW2NvbWxpbmtfZXhwb3J0cy5yZWxlYXNlUHJveHldKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICBXZWJDb250YWluZXJQcm9jZXNzSW1wbCA9IGNsYXNzIHsKICAgICAgb3V0cHV0OwogICAgICBpbnB1dDsKICAgICAgZXhpdDsKICAgICAgX3Byb2Nlc3M7CiAgICAgIHN0ZG91dDsKICAgICAgc3RkZXJyOwogICAgICBjb25zdHJ1Y3Rvcihwcm9jZXNzNCwgb3V0cHV0LCBzdGRvdXQsIHN0ZGVycikgewogICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OwogICAgICAgIHRoaXMuX3Byb2Nlc3MgPSBwcm9jZXNzNDsKICAgICAgICB0aGlzLmlucHV0ID0gbmV3IFdyaXRhYmxlU3RyZWFtKHsKICAgICAgICAgIHdyaXRlOiAoZGF0YSkgPT4gewogICAgICAgICAgICB0aGlzLl9nZXRQcm9jZXNzKCk/LndyaXRlKGRhdGEpLmNhdGNoKCgpID0+IHsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5leGl0ID0gdGhpcy5fb25FeGl0KCk7CiAgICAgICAgdGhpcy5zdGRvdXQgPSBzdGRvdXQ7CiAgICAgICAgdGhpcy5zdGRlcnIgPSBzdGRlcnI7CiAgICAgIH0KICAgICAga2lsbCgpIHsKICAgICAgICB0aGlzLl9wcm9jZXNzPy5raWxsKCk7CiAgICAgIH0KICAgICAgcmVzaXplKGRpbWVuc2lvbnMpIHsKICAgICAgICB0aGlzLl9nZXRQcm9jZXNzKCk/LnJlc2l6ZShkaW1lbnNpb25zKTsKICAgICAgfQogICAgICBhc3luYyBfb25FeGl0KCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcHJvY2Vzcy5vbkV4aXQ7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIHRoaXMuX3Byb2Nlc3M/Lltjb21saW5rX2V4cG9ydHMucmVsZWFzZVByb3h5XSgpOwogICAgICAgICAgdGhpcy5fcHJvY2VzcyA9IG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICAgIF9nZXRQcm9jZXNzKCkgewogICAgICAgIGlmICh0aGlzLl9wcm9jZXNzID09IG51bGwpIHsKICAgICAgICAgIGNvbnNvbGUud2FybigiVGhpcyBwcm9jZXNzIGFscmVhZHkgZXhpdGVkIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzOwogICAgICB9CiAgICB9OwogICAgRmlsZVN5c3RlbUFQSUNsaWVudCA9IGNsYXNzIHsKICAgICAgX2ZzOwogICAgICBfd2F0Y2hlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbXSk7CiAgICAgIGNvbnN0cnVjdG9yKGZzKSB7CiAgICAgICAgdGhpcy5fZnMgPSBmczsKICAgICAgfQogICAgICBybSguLi5hcmdzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2ZzLnJtKC4uLmFyZ3MpOwogICAgICB9CiAgICAgIGFzeW5jIHJlYWRGaWxlKHBhdGgyLCBlbmNvZGluZykgewogICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9mcy5yZWFkRmlsZShwYXRoMiwgZW5jb2RpbmcpOwogICAgICB9CiAgICAgIGFzeW5jIHJlbmFtZShvbGRQYXRoLCBuZXdQYXRoKSB7CiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2ZzLnJlbmFtZShvbGRQYXRoLCBuZXdQYXRoKTsKICAgICAgfQogICAgICBhc3luYyB3cml0ZUZpbGUocGF0aDIsIGRhdGEsIG9wdGlvbnMpIHsKICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKICAgICAgICAgIGNvbnN0IGJ1ZmZlcjIgPSBkYXRhLmJ1ZmZlci5zbGljZShkYXRhLmJ5dGVPZmZzZXQsIGRhdGEuYnl0ZU9mZnNldCArIGRhdGEuYnl0ZUxlbmd0aCk7CiAgICAgICAgICBkYXRhID0gY29tbGlua19leHBvcnRzLnRyYW5zZmVyKG5ldyBVaW50OEFycmF5KGJ1ZmZlcjIpLCBbYnVmZmVyMl0pOwogICAgICAgIH0KICAgICAgICBhd2FpdCB0aGlzLl9mcy53cml0ZUZpbGUocGF0aDIsIGRhdGEsIG9wdGlvbnMpOwogICAgICB9CiAgICAgIGFzeW5jIHJlYWRkaXIocGF0aDIsIG9wdGlvbnMpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9mcy5yZWFkZGlyKHBhdGgyLCBvcHRpb25zKTsKICAgICAgICBpZiAoaXNTdHJpbmdBcnJheShyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICBpZiAoaXNUeXBlZEFycmF5Q29sbGVjdGlvbihyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICBjb25zdCBlbnRyaWVzID0gcmVzdWx0Lm1hcCgoZW50cnkpID0+IG5ldyBEaXJFbnRJbXBsKGVudHJ5Lm5hbWUsIGVudHJ5WyJTeW1ib2wodHlwZSkiXSkpOwogICAgICAgIHJldHVybiBlbnRyaWVzOwogICAgICB9CiAgICAgIGFzeW5jIG1rZGlyKHBhdGgyLCBvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2ZzLm1rZGlyKHBhdGgyLCBvcHRpb25zKTsKICAgICAgfQogICAgICB3YXRjaChwYXRoMiwgb3B0aW9ucywgbGlzdGVuZXIyKSB7CiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICBsaXN0ZW5lcjIgPSBvcHRpb25zOwogICAgICAgICAgb3B0aW9ucyA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgRlNXYXRjaGVyKHRoaXMsIHBhdGgyLCBvcHRpb25zLCBsaXN0ZW5lcjIpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBAaW50ZXJuYWwKICAgICAgICovCiAgICAgIGFzeW5jIF90ZWFyZG93bigpIHsKICAgICAgICB0aGlzLl9mc1tjb21saW5rX2V4cG9ydHMucmVsZWFzZVByb3h5XSgpOwogICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFsuLi50aGlzLl93YXRjaGVyc10ubWFwKCh3YXRjaGVyKSA9PiB3YXRjaGVyLmNsb3NlKCkpKTsKICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXJ1bnRpbWUvZW52aXJvbm1lbnRzL1dlYkNvbnRhaW5lckVudmlyb25tZW50LmpzCnZhciBXZWJDb250YWluZXJFbnZpcm9ubWVudDsKdmFyIGluaXRfV2ViQ29udGFpbmVyRW52aXJvbm1lbnQgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1ydW50aW1lL2Vudmlyb25tZW50cy9XZWJDb250YWluZXJFbnZpcm9ubWVudC5qcyIoKSB7CiAgICBpbml0X2Rpc3QoKTsKICAgIFdlYkNvbnRhaW5lckVudmlyb25tZW50ID0gY2xhc3MgX1dlYkNvbnRhaW5lckVudmlyb25tZW50IHsKICAgICAgLy8gU3RhdGljIHNoYXJlZCBzdGF0ZSAtIFdlYkNvbnRhaW5lciBvbmx5IGFsbG93cyBPTkUgYm9vdCBwZXIgcGFnZQogICAgICBzdGF0aWMgc2hhcmVkQ29udGFpbmVyID0gbnVsbDsKICAgICAgc3RhdGljIGJvb3RQcm9taXNlID0gbnVsbDsKICAgICAgX3JlYWR5ID0gZmFsc2U7CiAgICAgIHR5cGUgPSAid2ViY29udGFpbmVyIjsKICAgICAgZ2V0IHJlYWR5KCkgewogICAgICAgIHJldHVybiB0aGlzLl9yZWFkeTsKICAgICAgfQogICAgICBnZXQgY29udGFpbmVyKCkgewogICAgICAgIHJldHVybiBfV2ViQ29udGFpbmVyRW52aXJvbm1lbnQuc2hhcmVkQ29udGFpbmVyOwogICAgICB9CiAgICAgIC8vID09PT09PT09PT09PSBMaWZlY3ljbGUgPT09PT09PT09PT09CiAgICAgIGFzeW5jIGluaXQoKSB7CiAgICAgICAgaWYgKHRoaXMuX3JlYWR5ICYmIF9XZWJDb250YWluZXJFbnZpcm9ubWVudC5zaGFyZWRDb250YWluZXIpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKF9XZWJDb250YWluZXJFbnZpcm9ubWVudC5ib290UHJvbWlzZSkgewogICAgICAgICAgYXdhaXQgX1dlYkNvbnRhaW5lckVudmlyb25tZW50LmJvb3RQcm9taXNlOwogICAgICAgICAgdGhpcy5fcmVhZHkgPSB0cnVlOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoX1dlYkNvbnRhaW5lckVudmlyb25tZW50LnNoYXJlZENvbnRhaW5lcikgewogICAgICAgICAgdGhpcy5fcmVhZHkgPSB0cnVlOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJXZWJDb250YWluZXIgcmVxdWlyZXMgU2hhcmVkQXJyYXlCdWZmZXIgd2hpY2ggaXMgbm90IGF2YWlsYWJsZS4gRW5zdXJlIHlvdXIgc2VydmVyIHNlbmRzIHRoZXNlIGhlYWRlcnM6XG4gIENyb3NzLU9yaWdpbi1PcGVuZXItUG9saWN5OiBzYW1lLW9yaWdpblxuICBDcm9zcy1PcmlnaW4tRW1iZWRkZXItUG9saWN5OiByZXF1aXJlLWNvcnAiKTsKICAgICAgICB9CiAgICAgICAgX1dlYkNvbnRhaW5lckVudmlyb25tZW50LmJvb3RQcm9taXNlID0gV2ViQ29udGFpbmVyLmJvb3QoKTsKICAgICAgICB0cnkgewogICAgICAgICAgX1dlYkNvbnRhaW5lckVudmlyb25tZW50LnNoYXJlZENvbnRhaW5lciA9IGF3YWl0IF9XZWJDb250YWluZXJFbnZpcm9ubWVudC5ib290UHJvbWlzZTsKICAgICAgICAgIHRoaXMuX3JlYWR5ID0gdHJ1ZTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgX1dlYkNvbnRhaW5lckVudmlyb25tZW50LmJvb3RQcm9taXNlID0gbnVsbDsKICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgICAgfQogICAgICBhc3luYyBkZXN0cm95KCkgewogICAgICAgIGlmIChfV2ViQ29udGFpbmVyRW52aXJvbm1lbnQuc2hhcmVkQ29udGFpbmVyKSB7CiAgICAgICAgICBfV2ViQ29udGFpbmVyRW52aXJvbm1lbnQuc2hhcmVkQ29udGFpbmVyLnRlYXJkb3duKCk7CiAgICAgICAgICBfV2ViQ29udGFpbmVyRW52aXJvbm1lbnQuc2hhcmVkQ29udGFpbmVyID0gbnVsbDsKICAgICAgICAgIF9XZWJDb250YWluZXJFbnZpcm9ubWVudC5ib290UHJvbWlzZSA9IG51bGw7CiAgICAgICAgICB0aGlzLl9yZWFkeSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyA9PT09PT09PT09PT0gRmlsZXN5c3RlbSBPcGVyYXRpb25zID09PT09PT09PT09PQogICAgICBhc3luYyByZWFkRmlsZShwYXRoMikgewogICAgICAgIHRoaXMuZW5zdXJlUmVhZHkoKTsKICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb250YWluZXIuZnMucmVhZEZpbGUocGF0aDIsICJ1dGYtOCIpOwogICAgICB9CiAgICAgIGFzeW5jIHdyaXRlRmlsZShwYXRoMiwgY29udGVudHMpIHsKICAgICAgICB0aGlzLmVuc3VyZVJlYWR5KCk7CiAgICAgICAgYXdhaXQgdGhpcy5jb250YWluZXIuZnMud3JpdGVGaWxlKHBhdGgyLCBjb250ZW50cywgInV0Zi04Iik7CiAgICAgIH0KICAgICAgYXN5bmMgcmVhZERpcihwYXRoMikgewogICAgICAgIHRoaXMuZW5zdXJlUmVhZHkoKTsKICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5jb250YWluZXIuZnMucmVhZGRpcihwYXRoMiwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pOwogICAgICAgIHJldHVybiBlbnRyaWVzLm1hcCgoZW50cnkpID0+ICh7CiAgICAgICAgICB0eXBlOiBlbnRyeS5pc0RpcmVjdG9yeSgpID8gImRpcmVjdG9yeSIgOiAiZmlsZSIsCiAgICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLAogICAgICAgICAgcGF0aDogcGF0aDIgPT09ICIvIiA/IGAvJHtlbnRyeS5uYW1lfWAgOiBgJHtwYXRoMn0vJHtlbnRyeS5uYW1lfWAKICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgYXN5bmMgbWtkaXIocGF0aDIpIHsKICAgICAgICB0aGlzLmVuc3VyZVJlYWR5KCk7CiAgICAgICAgYXdhaXQgdGhpcy5jb250YWluZXIuZnMubWtkaXIocGF0aDIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pOwogICAgICB9CiAgICAgIGFzeW5jIHJtKHBhdGgyLCBvcHRpb25zKSB7CiAgICAgICAgdGhpcy5lbnN1cmVSZWFkeSgpOwogICAgICAgIGF3YWl0IHRoaXMuY29udGFpbmVyLmZzLnJtKHBhdGgyLCB7IHJlY3Vyc2l2ZTogb3B0aW9ucz8ucmVjdXJzaXZlID8/IGZhbHNlIH0pOwogICAgICB9CiAgICAgIGFzeW5jIGV4aXN0cyhwYXRoMikgewogICAgICAgIHRoaXMuZW5zdXJlUmVhZHkoKTsKICAgICAgICB0cnkgewogICAgICAgICAgYXdhaXQgdGhpcy5jb250YWluZXIuZnMucmVhZEZpbGUocGF0aDIpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBhd2FpdCB0aGlzLmNvbnRhaW5lci5mcy5yZWFkZGlyKHBhdGgyKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICB3YXRjaChwYXRoMiwgY2FsbGJhY2ssIG9wdGlvbnMpIHsKICAgICAgICB0aGlzLmVuc3VyZVJlYWR5KCk7CiAgICAgICAgY29uc3Qgd2F0Y2hlciA9IHRoaXMuY29udGFpbmVyLmZzLndhdGNoKHBhdGgyLCB7IHJlY3Vyc2l2ZTogb3B0aW9ucz8ucmVjdXJzaXZlID8/IGZhbHNlIH0sIGNhbGxiYWNrKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgc3RvcDogKCkgPT4gd2F0Y2hlci5jbG9zZSgpCiAgICAgICAgfTsKICAgICAgfQogICAgICAvLyA9PT09PT09PT09PT0gUHJvY2VzcyBFeGVjdXRpb24gPT09PT09PT09PT09CiAgICAgIGFzeW5jIHNwYXduKGNvbW1hbmQsIGFyZ3MgPSBbXSkgewogICAgICAgIHRoaXMuZW5zdXJlUmVhZHkoKTsKICAgICAgICBjb25zdCBwcm9jZXNzNCA9IGF3YWl0IHRoaXMuY29udGFpbmVyLnNwYXduKGNvbW1hbmQsIGFyZ3MpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBvdXRwdXQ6IHByb2Nlc3M0Lm91dHB1dCwKICAgICAgICAgIGlucHV0OiBwcm9jZXNzNC5pbnB1dCwKICAgICAgICAgIGV4aXQ6IHByb2Nlc3M0LmV4aXQsCiAgICAgICAgICBraWxsOiAoKSA9PiBwcm9jZXNzNC5raWxsKCkKICAgICAgICB9OwogICAgICB9CiAgICAgIC8vID09PT09PT09PT09PSBXZWJDb250YWluZXItc3BlY2lmaWMgbWV0aG9kcyA9PT09PT09PT09PT0KICAgICAgLyoqCiAgICAgICAqIE1vdW50IGZpbGVzIGludG8gdGhlIHZpcnR1YWwgZmlsZXN5c3RlbS4KICAgICAgICogVGhpcyBpcyBhIFdlYkNvbnRhaW5lci1zcGVjaWZpYyBvcGVyYXRpb24uCiAgICAgICAqIEBwYXJhbSBmaWxlcyAtIEZpbGUgdHJlZSBzdHJ1Y3R1cmUgdG8gbW91bnQKICAgICAgICovCiAgICAgIGFzeW5jIG1vdW50KGZpbGVzKSB7CiAgICAgICAgdGhpcy5lbnN1cmVSZWFkeSgpOwogICAgICAgIGF3YWl0IHRoaXMuY29udGFpbmVyLm1vdW50KGZpbGVzKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogR2V0IHRoZSB1bmRlcmx5aW5nIFdlYkNvbnRhaW5lciBpbnN0YW5jZS4KICAgICAgICogVXNlIHNwYXJpbmdseSAtIHByZWZlciB0aGUgaW50ZXJmYWNlIG1ldGhvZHMuCiAgICAgICAqLwogICAgICBnZXRDb250YWluZXIoKSB7CiAgICAgICAgdGhpcy5lbnN1cmVSZWFkeSgpOwogICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjsKICAgICAgfQogICAgICAvLyA9PT09PT09PT09PT0gUHJpdmF0ZSBIZWxwZXJzID09PT09PT09PT09PQogICAgICBlbnN1cmVSZWFkeSgpIHsKICAgICAgICBpZiAoIXRoaXMuX3JlYWR5IHx8ICF0aGlzLmNvbnRhaW5lcikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJXZWJDb250YWluZXJFbnZpcm9ubWVudCBub3QgaW5pdGlhbGl6ZWQuIENhbGwgaW5pdCgpIGZpcnN0LiIpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXJ1bnRpbWUvZW52aXJvbm1lbnRzL2luZGV4LmpzCnZhciBpbml0X2Vudmlyb25tZW50cyA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXJ1bnRpbWUvZW52aXJvbm1lbnRzL2luZGV4LmpzIigpIHsKICAgIGluaXRfV2ViQ29udGFpbmVyRW52aXJvbm1lbnQoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXJ1bnRpbWUvaW5kZXguanMKdmFyIGluaXRfZ3JvdXBfcnVudGltZSA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXJ1bnRpbWUvaW5kZXguanMiKCkgewogICAgaW5pdF9pbnRlcmZhY2VzNCgpOwogICAgaW5pdF9lbnZpcm9ubWVudHMoKTsKICB9Cn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXdvcmtzcGFjZS9kZWVzLXdvcmtzcGFjZS10ZXJtaW5hbC90ZXJtaW5hbC10YWItbWFuYWdlci5qcwp2YXIgVGVybWluYWxUYWJNYW5hZ2VyOwp2YXIgaW5pdF90ZXJtaW5hbF90YWJfbWFuYWdlciA9IF9fZXNtKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXdvcmtzcGFjZS9kZWVzLXdvcmtzcGFjZS10ZXJtaW5hbC90ZXJtaW5hbC10YWItbWFuYWdlci5qcyIoKSB7CiAgICBUZXJtaW5hbFRhYk1hbmFnZXIgPSBjbGFzcyB7CiAgICAgIHRhYnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICB0YWJDb3VudGVyID0gMDsKICAgICAgeHRlcm1CdW5kbGUgPSBudWxsOwogICAgICB4dGVybUZpdEFkZG9uQnVuZGxlID0gbnVsbDsKICAgICAgLyoqCiAgICAgICAqIEluaXRpYWxpemUgdGhlIG1hbmFnZXIgd2l0aCBsb2FkZWQgeHRlcm0gbW9kdWxlcy4KICAgICAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNyZWF0aW5nIHRhYnMuCiAgICAgICAqLwogICAgICBzZXRYdGVybU1vZHVsZXMoeHRlcm1CdW5kbGUsIGZpdEFkZG9uQnVuZGxlKSB7CiAgICAgICAgdGhpcy54dGVybUJ1bmRsZSA9IHh0ZXJtQnVuZGxlOwogICAgICAgIHRoaXMueHRlcm1GaXRBZGRvbkJ1bmRsZSA9IGZpdEFkZG9uQnVuZGxlOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBHZW5lcmF0ZSB1bmlxdWUgdGFiIElECiAgICAgICAqLwogICAgICBnZW5lcmF0ZVRhYklkKCkgewogICAgICAgIHRoaXMudGFiQ291bnRlcisrOwogICAgICAgIHJldHVybiBgdGVybWluYWwtJHt0aGlzLnRhYkNvdW50ZXJ9LSR7RGF0ZS5ub3coKX1gOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBHZXQgZGVmYXVsdCBsYWJlbCBmb3IgdGFiIHR5cGUKICAgICAgICovCiAgICAgIGdldERlZmF1bHRMYWJlbCh0eXBlNSwgbWV0YWRhdGEpIHsKICAgICAgICBzd2l0Y2ggKHR5cGU1KSB7CiAgICAgICAgICBjYXNlICJzaGVsbCI6CiAgICAgICAgICAgIHJldHVybiAiYmFzaCI7CiAgICAgICAgICBjYXNlICJzY3JpcHQiOgogICAgICAgICAgICByZXR1cm4gbWV0YWRhdGE/LnNjcmlwdE5hbWUgfHwgInNjcmlwdCI7CiAgICAgICAgICBjYXNlICJwYWNrYWdlLXVwZGF0ZSI6CiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YT8ucGFja2FnZU5hbWUgPyBgdXBkYXRlICR7bWV0YWRhdGEucGFja2FnZU5hbWV9YCA6ICJ1cGRhdGUiOwogICAgICAgICAgY2FzZSAiY3VzdG9tIjoKICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhPy5jb21tYW5kIHx8ICJwcm9jZXNzIjsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAidGVybWluYWwiOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogR2V0IGRlZmF1bHQgaWNvbiBmb3IgdGFiIHR5cGUKICAgICAgICovCiAgICAgIGdldERlZmF1bHRJY29uKHR5cGU1KSB7CiAgICAgICAgc3dpdGNoICh0eXBlNSkgewogICAgICAgICAgY2FzZSAic2hlbGwiOgogICAgICAgICAgICByZXR1cm4gImx1Y2lkZTp0ZXJtaW5hbCI7CiAgICAgICAgICBjYXNlICJzY3JpcHQiOgogICAgICAgICAgICByZXR1cm4gImx1Y2lkZTpwbGF5IjsKICAgICAgICAgIGNhc2UgInBhY2thZ2UtdXBkYXRlIjoKICAgICAgICAgICAgcmV0dXJuICJsdWNpZGU6cGFja2FnZUNoZWNrIjsKICAgICAgICAgIGNhc2UgImN1c3RvbSI6CiAgICAgICAgICAgIHJldHVybiAibHVjaWRlOmNvZGUiOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuICJsdWNpZGU6dGVybWluYWwiOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogR2V0IHRlcm1pbmFsIHRoZW1lIGNvbmZpZ3VyYXRpb24KICAgICAgICovCiAgICAgIGdldFRlcm1pbmFsVGhlbWUoaXNCcmlnaHQpIHsKICAgICAgICBpZiAoaXNCcmlnaHQpIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICIjZmZmZmZmIiwKICAgICAgICAgICAgZm9yZWdyb3VuZDogIiMzMzMzMzMiLAogICAgICAgICAgICBjdXJzb3I6ICIjMzMzMzMzIiwKICAgICAgICAgICAgY3Vyc29yQWNjZW50OiAiI2ZmZmZmZiIsCiAgICAgICAgICAgIHNlbGVjdGlvbjogInJnYmEoMCwgMCwgMCwgMC4yKSIsCiAgICAgICAgICAgIGJsYWNrOiAiIzAwMDAwMCIsCiAgICAgICAgICAgIHJlZDogIiNjZDMxMzEiLAogICAgICAgICAgICBncmVlbjogIiMwMGJjMDAiLAogICAgICAgICAgICB5ZWxsb3c6ICIjOTQ5ODAwIiwKICAgICAgICAgICAgYmx1ZTogIiMwNDUxYTUiLAogICAgICAgICAgICBtYWdlbnRhOiAiI2JjMDViYyIsCiAgICAgICAgICAgIGN5YW46ICIjMDU5OGJjIiwKICAgICAgICAgICAgd2hpdGU6ICIjNTU1NTU1IiwKICAgICAgICAgICAgYnJpZ2h0QmxhY2s6ICIjNjY2NjY2IiwKICAgICAgICAgICAgYnJpZ2h0UmVkOiAiI2NkMzEzMSIsCiAgICAgICAgICAgIGJyaWdodEdyZWVuOiAiIzE0Y2UxNCIsCiAgICAgICAgICAgIGJyaWdodFllbGxvdzogIiNiNWJhMDAiLAogICAgICAgICAgICBicmlnaHRCbHVlOiAiIzA0NTFhNSIsCiAgICAgICAgICAgIGJyaWdodE1hZ2VudGE6ICIjYmMwNWJjIiwKICAgICAgICAgICAgYnJpZ2h0Q3lhbjogIiMwNTk4YmMiLAogICAgICAgICAgICBicmlnaHRXaGl0ZTogIiNhNWE1YTUiCiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAiIzAwMDAwMCIsCiAgICAgICAgICAgIGZvcmVncm91bmQ6ICIjZmZmZmZmIiwKICAgICAgICAgICAgY3Vyc29yOiAiI2ZmZmZmZiIsCiAgICAgICAgICAgIGN1cnNvckFjY2VudDogIiMwMDAwMDAiLAogICAgICAgICAgICBzZWxlY3Rpb246ICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMikiCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogQ3JlYXRlIGEgbmV3IHRhYiBpbnN0YW5jZQogICAgICAgKi8KICAgICAgY3JlYXRlVGFiKG9wdGlvbnMsIGlzQnJpZ2h0KSB7CiAgICAgICAgaWYgKCF0aGlzLnh0ZXJtQnVuZGxlIHx8ICF0aGlzLnh0ZXJtRml0QWRkb25CdW5kbGUpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVGVybWluYWxUYWJNYW5hZ2VyOiB4dGVybSBtb2R1bGVzIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBzZXRYdGVybU1vZHVsZXMoKSBmaXJzdC4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdlbmVyYXRlVGFiSWQoKTsKICAgICAgICBjb25zdCB0eXBlNSA9IG9wdGlvbnMudHlwZTsKICAgICAgICBjb25zdCB0ZXJtaW5hbCA9IG5ldyB0aGlzLnh0ZXJtQnVuZGxlLlRlcm1pbmFsKHsKICAgICAgICAgIGNvbnZlcnRFb2w6IHRydWUsCiAgICAgICAgICBjdXJzb3JCbGluazogdHJ1ZSwKICAgICAgICAgIHRoZW1lOiB0aGlzLmdldFRlcm1pbmFsVGhlbWUoaXNCcmlnaHQpLAogICAgICAgICAgZm9udEZhbWlseTogJ01lbmxvLCBNb25hY28sICJDb3VyaWVyIE5ldyIsIG1vbm9zcGFjZScsCiAgICAgICAgICBmb250U2l6ZTogMTMsCiAgICAgICAgICBsaW5lSGVpZ2h0OiAxLjIKICAgICAgICB9KTsKICAgICAgICBjb25zdCBmaXRBZGRvbiA9IG5ldyB0aGlzLnh0ZXJtRml0QWRkb25CdW5kbGUuRml0QWRkb24oKTsKICAgICAgICB0ZXJtaW5hbC5sb2FkQWRkb24oZml0QWRkb24pOwogICAgICAgIGNvbnN0IHRhYjIgPSB7CiAgICAgICAgICBpZCwKICAgICAgICAgIGxhYmVsOiBvcHRpb25zLmxhYmVsIHx8IHRoaXMuZ2V0RGVmYXVsdExhYmVsKHR5cGU1LCBvcHRpb25zLm1ldGFkYXRhKSwKICAgICAgICAgIGljb25OYW1lOiBvcHRpb25zLmljb25OYW1lIHx8IHRoaXMuZ2V0RGVmYXVsdEljb24odHlwZTUpLAogICAgICAgICAgdHlwZTogdHlwZTUsCiAgICAgICAgICBjbG9zZWFibGU6IG9wdGlvbnMuY2xvc2VhYmxlID8/IHR5cGU1ICE9PSAic2hlbGwiLAogICAgICAgICAgdGVybWluYWwsCiAgICAgICAgICBmaXRBZGRvbiwKICAgICAgICAgIHByb2Nlc3M6IG51bGwsCiAgICAgICAgICBpbnB1dFdyaXRlcjogbnVsbCwKICAgICAgICAgIGV4aXRlZDogZmFsc2UsCiAgICAgICAgICBleGl0Q29kZTogbnVsbCwKICAgICAgICAgIGNyZWF0ZWRBdDogRGF0ZS5ub3coKSwKICAgICAgICAgIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhCiAgICAgICAgfTsKICAgICAgICB0aGlzLnRhYnMuc2V0KGlkLCB0YWIyKTsKICAgICAgICByZXR1cm4gdGFiMjsKICAgICAgfQogICAgICAvKioKICAgICAgICogR2V0IHRhYiBieSBJRAogICAgICAgKi8KICAgICAgZ2V0VGFiKGlkKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudGFicy5nZXQoaWQpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBHZXQgYWxsIHRhYnMgYXMgYXJyYXkgKG9yZGVyZWQgYnkgY3JlYXRpb24gdGltZSkKICAgICAgICovCiAgICAgIGdldEFsbFRhYnMoKSB7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy50YWJzLnZhbHVlcygpKS5zb3J0KChhNSwgYjYpID0+IGE1LmNyZWF0ZWRBdCAtIGI2LmNyZWF0ZWRBdCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHRhYnMKICAgICAgICovCiAgICAgIGdldFRhYkNvdW50KCkgewogICAgICAgIHJldHVybiB0aGlzLnRhYnMuc2l6ZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQ2hlY2sgaWYgdGFiIGV4aXN0cwogICAgICAgKi8KICAgICAgaGFzVGFiKGlkKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudGFicy5oYXMoaWQpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDbG9zZSBhbmQgY2xlYW51cCBhIHRhYgogICAgICAgKi8KICAgICAgY2xvc2VUYWIoaWQpIHsKICAgICAgICBjb25zdCB0YWIyID0gdGhpcy50YWJzLmdldChpZCk7CiAgICAgICAgaWYgKCF0YWIyKQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmICh0YWIyLnByb2Nlc3MgJiYgIXRhYjIuZXhpdGVkKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB0YWIyLnByb2Nlc3Mua2lsbCgpOwogICAgICAgICAgfSBjYXRjaCAoZTExKSB7CiAgICAgICAgICAgIGNvbnNvbGUud2FybigiRmFpbGVkIHRvIGtpbGwgcHJvY2VzczoiLCBlMTEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgdGFiMi50ZXJtaW5hbC5kaXNwb3NlKCk7CiAgICAgICAgfSBjYXRjaCAoZTExKSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oIkZhaWxlZCB0byBkaXNwb3NlIHRlcm1pbmFsOiIsIGUxMSk7CiAgICAgICAgfQogICAgICAgIHRoaXMudGFicy5kZWxldGUoaWQpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBSZW5hbWUgYSB0YWIKICAgICAgICovCiAgICAgIHJlbmFtZVRhYihpZCwgbmV3TGFiZWwpIHsKICAgICAgICBjb25zdCB0YWIyID0gdGhpcy50YWJzLmdldChpZCk7CiAgICAgICAgaWYgKCF0YWIyKQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIHRhYjIubGFiZWwgPSBuZXdMYWJlbDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICAvKioKICAgICAgICogVXBkYXRlIHRhYiBwcm9jZXNzIHN0YXRlIHRvIGV4aXRlZAogICAgICAgKi8KICAgICAgbWFya1RhYkV4aXRlZChpZCwgZXhpdENvZGUpIHsKICAgICAgICBjb25zdCB0YWIyID0gdGhpcy50YWJzLmdldChpZCk7CiAgICAgICAgaWYgKCF0YWIyKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIHRhYjIuZXhpdGVkID0gdHJ1ZTsKICAgICAgICB0YWIyLmV4aXRDb2RlID0gZXhpdENvZGU7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNldCBwcm9jZXNzIGZvciBhIHRhYgogICAgICAgKi8KICAgICAgc2V0VGFiUHJvY2VzcyhpZCwgcHJvY2VzczQsIGlucHV0V3JpdGVyKSB7CiAgICAgICAgY29uc3QgdGFiMiA9IHRoaXMudGFicy5nZXQoaWQpOwogICAgICAgIGlmICghdGFiMikKICAgICAgICAgIHJldHVybjsKICAgICAgICB0YWIyLnByb2Nlc3MgPSBwcm9jZXNzNDsKICAgICAgICB0YWIyLmlucHV0V3JpdGVyID0gaW5wdXRXcml0ZXI7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFVwZGF0ZSB0aGVtZSBmb3IgYWxsIHRlcm1pbmFscwogICAgICAgKi8KICAgICAgdXBkYXRlQWxsVGhlbWVzKGlzQnJpZ2h0KSB7CiAgICAgICAgY29uc3QgdGhlbWUgPSB0aGlzLmdldFRlcm1pbmFsVGhlbWUoaXNCcmlnaHQpOwogICAgICAgIGZvciAoY29uc3QgdGFiMiBvZiB0aGlzLnRhYnMudmFsdWVzKCkpIHsKICAgICAgICAgIHRhYjIudGVybWluYWwub3B0aW9ucy50aGVtZSA9IHRoZW1lOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogRGlzcG9zZSBhbGwgdGFicyBhbmQgY2xlYW51cAogICAgICAgKi8KICAgICAgZGlzcG9zZUFsbCgpIHsKICAgICAgICBmb3IgKGNvbnN0IFtpZF0gb2YgdGhpcy50YWJzKSB7CiAgICAgICAgICB0aGlzLmNsb3NlVGFiKGlkKTsKICAgICAgICB9CiAgICAgICAgdGhpcy50YWJzLmNsZWFyKCk7CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC13b3Jrc3BhY2UvZGVlcy13b3Jrc3BhY2UtdGVybWluYWwvZGVlcy13b3Jrc3BhY2UtdGVybWluYWwuanMKdmFyIGRlZXNfd29ya3NwYWNlX3Rlcm1pbmFsX2V4cG9ydHMgPSB7fTsKX19leHBvcnQoZGVlc193b3Jrc3BhY2VfdGVybWluYWxfZXhwb3J0cywgewogIERlZXNXb3Jrc3BhY2VUZXJtaW5hbDogKCkgPT4gRGVlc1dvcmtzcGFjZVRlcm1pbmFsCn0pOwp2YXIgX19lc0RlY29yYXRlODcsIF9fcnVuSW5pdGlhbGl6ZXJzODgsIERlZXNXb3Jrc3BhY2VUZXJtaW5hbDsKdmFyIGluaXRfZGVlc193b3Jrc3BhY2VfdGVybWluYWwgPSBfX2VzbSh7CiAgIm5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC13b3Jrc3BhY2UvZGVlcy13b3Jrc3BhY2UtdGVybWluYWwvZGVlcy13b3Jrc3BhY2UtdGVybWluYWwuanMiKCkgewogICAgaW5pdF9kaXN0X3RzMzAoKTsKICAgIGluaXRfZGlzdF90czI5KCk7CiAgICBpbml0X3RoZW1lKCk7CiAgICBpbml0X2dyb3VwX3J1bnRpbWUoKTsKICAgIGluaXRfZGVlc19pY29uKCk7CiAgICBpbml0X2RlZXNfYWN0aW9uYmFyKCk7CiAgICBpbml0X3Rlcm1pbmFsX3RhYl9tYW5hZ2VyKCk7CiAgICBpbml0X3NlcnZpY2VzKCk7CiAgICBfX2VzRGVjb3JhdGU4NyA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgICAgIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgICAgICByZXR1cm4gZjg7CiAgICAgIH0KICAgICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICAgICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogICAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICAgICAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgICAgIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICAgICAgdmFyIGNvbnRleHQyID0ge307CiAgICAgICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICAgICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgICAgICB9OwogICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICAgICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogICAgICBkb25lID0gdHJ1ZTsKICAgIH07CiAgICBfX3J1bkluaXRpYWxpemVyczg4ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICAgICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgICAgIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICAgICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogICAgICB9CiAgICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKICAgIH07CiAgICBEZWVzV29ya3NwYWNlVGVybWluYWwgPSAoKCkgPT4gewogICAgICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLXdvcmtzcGFjZS10ZXJtaW5hbCIpXTsKICAgICAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgICAgIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX2NsYXNzVGhpczsKICAgICAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgICAgIGxldCBfZXhlY3V0aW9uRW52aXJvbm1lbnRfZGVjb3JhdG9yczsKICAgICAgbGV0IF9leGVjdXRpb25FbnZpcm9ubWVudF9pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9leGVjdXRpb25FbnZpcm9ubWVudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX3NldHVwQ29tbWFuZF9kZWNvcmF0b3JzOwogICAgICBsZXQgX3NldHVwQ29tbWFuZF9pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9zZXR1cENvbW1hbmRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9lbnZpcm9ubWVudFZhcmlhYmxlc19kZWNvcmF0b3JzOwogICAgICBsZXQgX2Vudmlyb25tZW50VmFyaWFibGVzX2luaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX2Vudmlyb25tZW50VmFyaWFibGVzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgICAgIGxldCBfdGFiQmFyV2lkdGhfZGVjb3JhdG9yczsKICAgICAgbGV0IF90YWJCYXJXaWR0aF9pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF90YWJCYXJXaWR0aF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX3Nob3dUYWJCYXJfZGVjb3JhdG9yczsKICAgICAgbGV0IF9zaG93VGFiQmFyX2luaXRpYWxpemVycyA9IFtdOwogICAgICBsZXQgX3Nob3dUYWJCYXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF90YWJzX2RlY29yYXRvcnM7CiAgICAgIGxldCBfdGFic19pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF90YWJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgICAgIGxldCBfYWN0aXZlVGFiSWRfZGVjb3JhdG9yczsKICAgICAgbGV0IF9hY3RpdmVUYWJJZF9pbml0aWFsaXplcnMgPSBbXTsKICAgICAgbGV0IF9hY3RpdmVUYWJJZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogICAgICB2YXIgRGVlc1dvcmtzcGFjZVRlcm1pbmFsMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgICAgIHN0YXRpYyB7CiAgICAgICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgICAgICB9CiAgICAgICAgc3RhdGljIHsKICAgICAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICAgICAgX2V4ZWN1dGlvbkVudmlyb25tZW50X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBPYmplY3QgfSldOwogICAgICAgICAgX3NldHVwQ29tbWFuZF9kZWNvcmF0b3JzID0gW241KCldOwogICAgICAgICAgX2Vudmlyb25tZW50VmFyaWFibGVzX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgICAgICBfdGFiQmFyV2lkdGhfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgICAgICBfc2hvd1RhYkJhcl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgICAgICBfdGFic19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICAgICAgX2FjdGl2ZVRhYklkX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgICAgICBfX2VzRGVjb3JhdGU4Nyh0aGlzLCBudWxsLCBfZXhlY3V0aW9uRW52aXJvbm1lbnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZXhlY3V0aW9uRW52aXJvbm1lbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImV4ZWN1dGlvbkVudmlyb25tZW50IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmV4ZWN1dGlvbkVudmlyb25tZW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgICAgICBvYmouZXhlY3V0aW9uRW52aXJvbm1lbnQgPSB2YWx1ZTI7CiAgICAgICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2V4ZWN1dGlvbkVudmlyb25tZW50X2luaXRpYWxpemVycywgX2V4ZWN1dGlvbkVudmlyb25tZW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgICAgIF9fZXNEZWNvcmF0ZTg3KHRoaXMsIG51bGwsIF9zZXR1cENvbW1hbmRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2V0dXBDb21tYW5kIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZXR1cENvbW1hbmQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2V0dXBDb21tYW5kLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgICAgICBvYmouc2V0dXBDb21tYW5kID0gdmFsdWUyOwogICAgICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZXR1cENvbW1hbmRfaW5pdGlhbGl6ZXJzLCBfc2V0dXBDb21tYW5kX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgICAgIF9fZXNEZWNvcmF0ZTg3KHRoaXMsIG51bGwsIF9lbnZpcm9ubWVudFZhcmlhYmxlc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJlbnZpcm9ubWVudFZhcmlhYmxlcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZW52aXJvbm1lbnRWYXJpYWJsZXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZW52aXJvbm1lbnRWYXJpYWJsZXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgICAgIG9iai5lbnZpcm9ubWVudFZhcmlhYmxlcyA9IHZhbHVlMjsKICAgICAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZW52aXJvbm1lbnRWYXJpYWJsZXNfaW5pdGlhbGl6ZXJzLCBfZW52aXJvbm1lbnRWYXJpYWJsZXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgX19lc0RlY29yYXRlODcodGhpcywgbnVsbCwgX3RhYkJhcldpZHRoX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRhYkJhcldpZHRoIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0YWJCYXJXaWR0aCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50YWJCYXJXaWR0aCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICAgICAgb2JqLnRhYkJhcldpZHRoID0gdmFsdWUyOwogICAgICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90YWJCYXJXaWR0aF9pbml0aWFsaXplcnMsIF90YWJCYXJXaWR0aF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgICAgICBfX2VzRGVjb3JhdGU4Nyh0aGlzLCBudWxsLCBfc2hvd1RhYkJhcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93VGFiQmFyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93VGFiQmFyIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dUYWJCYXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgICAgIG9iai5zaG93VGFiQmFyID0gdmFsdWUyOwogICAgICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93VGFiQmFyX2luaXRpYWxpemVycywgX3Nob3dUYWJCYXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgX19lc0RlY29yYXRlODcodGhpcywgbnVsbCwgX3RhYnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGFicyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGFicyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50YWJzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgICAgICBvYmoudGFicyA9IHZhbHVlMjsKICAgICAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGFic19pbml0aWFsaXplcnMsIF90YWJzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgICAgIF9fZXNEZWNvcmF0ZTg3KHRoaXMsIG51bGwsIF9hY3RpdmVUYWJJZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhY3RpdmVUYWJJZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYWN0aXZlVGFiSWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWN0aXZlVGFiSWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgICAgIG9iai5hY3RpdmVUYWJJZCA9IHZhbHVlMjsKICAgICAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYWN0aXZlVGFiSWRfaW5pdGlhbGl6ZXJzLCBfYWN0aXZlVGFiSWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgX19lc0RlY29yYXRlODcobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICAgICAgRGVlc1dvcmtzcGFjZVRlcm1pbmFsMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZGVtbyA9ICgpID0+IHsKICAgICAgICAgIGNvbnN0IGVudjIgPSBuZXcgV2ViQ29udGFpbmVyRW52aXJvbm1lbnQoKTsKICAgICAgICAgIHJldHVybiBiMmA8ZGVlcy13b3Jrc3BhY2UtdGVybWluYWwgLmV4ZWN1dGlvbkVudmlyb25tZW50PSR7ZW52Mn0+PC9kZWVzLXdvcmtzcGFjZS10ZXJtaW5hbD5gOwogICAgICAgIH07CiAgICAgICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIldvcmtzcGFjZSJdOwogICAgICAgIC8vIElOU1RBTkNFCiAgICAgICAgcmVzaXplT2JzZXJ2ZXI7CiAgICAgICAgdGFiTWFuYWdlcjsKICAgICAgICAjZXhlY3V0aW9uRW52aXJvbm1lbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzODgodGhpcywgX2V4ZWN1dGlvbkVudmlyb25tZW50X2luaXRpYWxpemVycywgbnVsbCk7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCAocmVxdWlyZWQpLgogICAgICAgICAqIFVzZSBXZWJDb250YWluZXJFbnZpcm9ubWVudCBmb3IgYnJvd3Nlci1iYXNlZCBleGVjdXRpb24uCiAgICAgICAgICovCiAgICAgICAgZ2V0IGV4ZWN1dGlvbkVudmlyb25tZW50KCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuI2V4ZWN1dGlvbkVudmlyb25tZW50X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICAgICAgfQogICAgICAgIHNldCBleGVjdXRpb25FbnZpcm9ubWVudCh2YWx1ZTIpIHsKICAgICAgICAgIHRoaXMuI2V4ZWN1dGlvbkVudmlyb25tZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgICNzZXR1cENvbW1hbmRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczg4KHRoaXMsIF9leGVjdXRpb25FbnZpcm9ubWVudF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODgodGhpcywgX3NldHVwQ29tbWFuZF9pbml0aWFsaXplcnMsICIiKSk7CiAgICAgICAgZ2V0IHNldHVwQ29tbWFuZCgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiNzZXR1cENvbW1hbmRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgICAgICB9CiAgICAgICAgc2V0IHNldHVwQ29tbWFuZCh2YWx1ZTIpIHsKICAgICAgICAgIHRoaXMuI3NldHVwQ29tbWFuZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgICAjZW52aXJvbm1lbnRWYXJpYWJsZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczg4KHRoaXMsIF9zZXR1cENvbW1hbmRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczg4KHRoaXMsIF9lbnZpcm9ubWVudFZhcmlhYmxlc19pbml0aWFsaXplcnMsIHt9KSk7CiAgICAgICAgLyoqCiAgICAgICAgICogRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNldCBpbiB0aGUgc2hlbGwKICAgICAgICAgKi8KICAgICAgICBnZXQgZW52aXJvbm1lbnRWYXJpYWJsZXMoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy4jZW52aXJvbm1lbnRWYXJpYWJsZXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgICAgICB9CiAgICAgICAgc2V0IGVudmlyb25tZW50VmFyaWFibGVzKHZhbHVlMikgewogICAgICAgICAgdGhpcy4jZW52aXJvbm1lbnRWYXJpYWJsZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgICAgICB9CiAgICAgICAgI3RhYkJhcldpZHRoX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4OCh0aGlzLCBfZW52aXJvbm1lbnRWYXJpYWJsZXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczg4KHRoaXMsIF90YWJCYXJXaWR0aF9pbml0aWFsaXplcnMsIDE2MCkpOwogICAgICAgIC8qKgogICAgICAgICAqIFdpZHRoIG9mIHRoZSB0YWIgYmFyIGluIHBpeGVscwogICAgICAgICAqLwogICAgICAgIGdldCB0YWJCYXJXaWR0aCgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiN0YWJCYXJXaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgICAgIH0KICAgICAgICBzZXQgdGFiQmFyV2lkdGgodmFsdWUyKSB7CiAgICAgICAgICB0aGlzLiN0YWJCYXJXaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgICAjc2hvd1RhYkJhcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODgodGhpcywgX3RhYkJhcldpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4OCh0aGlzLCBfc2hvd1RhYkJhcl9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIHRhYiBiYXIKICAgICAgICAgKi8KICAgICAgICBnZXQgc2hvd1RhYkJhcigpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiNzaG93VGFiQmFyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICAgICAgfQogICAgICAgIHNldCBzaG93VGFiQmFyKHZhbHVlMikgewogICAgICAgICAgdGhpcy4jc2hvd1RhYkJhcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgICAjdGFic19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODgodGhpcywgX3Nob3dUYWJCYXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczg4KHRoaXMsIF90YWJzX2luaXRpYWxpemVycywgW10pKTsKICAgICAgICAvLyBUYWIgc3RhdGUKICAgICAgICBnZXQgdGFicygpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiN0YWJzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICAgICAgfQogICAgICAgIHNldCB0YWJzKHZhbHVlMikgewogICAgICAgICAgdGhpcy4jdGFic19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgICAgIH0KICAgICAgICAjYWN0aXZlVGFiSWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczg4KHRoaXMsIF90YWJzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4OCh0aGlzLCBfYWN0aXZlVGFiSWRfaW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICAgICAgZ2V0IGFjdGl2ZVRhYklkKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuI2FjdGl2ZVRhYklkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICAgICAgfQogICAgICAgIHNldCBhY3RpdmVUYWJJZCh2YWx1ZTIpIHsKICAgICAgICAgIHRoaXMuI2FjdGl2ZVRhYklkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICAgICAgfQogICAgICAgIC8vIFRoZW1lIHN1YnNjcmlwdGlvbiBmb3IgZHluYW1pYyB0aGVtZSB1cGRhdGVzCiAgICAgICAgdGVybWluYWxUaGVtZVN1YnNjcmlwdGlvbiA9IChfX3J1bkluaXRpYWxpemVyczg4KHRoaXMsIF9hY3RpdmVUYWJJZF9leHRyYUluaXRpYWxpemVycyksIG51bGwpOwogICAgICAgIGlzQnJpZ2h0ID0gZmFsc2U7CiAgICAgICAgLy8gQWN0aW9uYmFyIHJlZmVyZW5jZSBmb3IgdGVybWluYWwtY29udGV4dCBub3RpZmljYXRpb25zCiAgICAgICAgdGVybWluYWxBY3Rpb25iYXIgPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBlbnZpcm9ubWVudCBpcyByZWFkeS4KICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZXhlY3V0aW9uRW52aXJvbm1lbnQgZGlyZWN0bHkKICAgICAgICAgKi8KICAgICAgICBlbnZpcm9ubWVudERlZmVycmVkID0gbmV3IGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cy5zbWFydHByb21pc2UuRGVmZXJyZWQoKTsKICAgICAgICBlbnZpcm9ubWVudFByb21pc2UgPSB0aGlzLmVudmlyb25tZW50RGVmZXJyZWQucHJvbWlzZTsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICB0aGlzLnRhYk1hbmFnZXIgPSBuZXcgVGVybWluYWxUYWJNYW5hZ2VyKCk7CiAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHsKICAgICAgICAgICAgdGhpcy5oYW5kbGVSZXNpemUoKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICAgICAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMwMDAwMDAiKX07CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KCiAgICAgICogewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgIC50ZXJtaW5hbC1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC50ZXJtaW5hbC1jb250ZW50IHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMwMDAwMDAiKX07CiAgICAgIH0KCiAgICAgICNhY3RpdmUtdGVybWluYWwtY29udGFpbmVyIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIG1hcmdpbjogMjBweDsKICAgICAgfQoKICAgICAgLnRlcm1pbmFsLWNvbnRlbnQgZGVlcy1hY3Rpb25iYXIgewogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAvKiBUYWIgYmFyIG9uIHRoZSByaWdodCBzaWRlICovCiAgICAgIC50YWItYmFyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk2JSkiLCAiaHNsKDAgMCUgNyUpIil9OwogICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg1JSkiLCAiaHNsKDAgMCUgMTUlKSIpfTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAudGFiLWJhci1oZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OCUpIiwgImhzbCgwIDAlIDEyJSkiKX07CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NSUpIiwgImhzbCgwIDAlIDU1JSkiKX07CiAgICAgIH0KCiAgICAgIC50YWItYmFyLXRpdGxlIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KCiAgICAgIC50YWItYmFyLWFjdGlvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiAycHg7CiAgICAgIH0KCiAgICAgIC50YWItYWN0aW9uIHsKICAgICAgICB3aWR0aDogMjJweDsKICAgICAgICBoZWlnaHQ6IDIycHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA1MCUpIiwgImhzbCgwIDAlIDYwJSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC50YWItYWN0aW9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODglKSIsICJoc2woMCAwJSAxNSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMzAlKSIsICJoc2woMCAwJSA4MCUpIil9OwogICAgICB9CgogICAgICAudGFiLWxpc3QgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KCiAgICAgIC50ZXJtaW5hbC10YWIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NSUpIiwgImhzbCgwIDAlIDYwJSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC50ZXJtaW5hbC10YWI6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5MCUpIiwgImhzbCgwIDAlIDEyJSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAyNSUpIiwgImhzbCgwIDAlIDgwJSkiKX07CiAgICAgIH0KCiAgICAgIC50ZXJtaW5hbC10YWIuYWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCAxMDAlIDk1JSkiLCAiaHNsKDIxMCAzMCUgMTUlKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgMTAwJSA0MCUpIiwgImhzbCgyMTAgMTAwJSA3MCUpIil9OwogICAgICB9CgogICAgICAudGVybWluYWwtdGFiLmV4aXRlZCB7CiAgICAgICAgb3BhY2l0eTogMC43OwogICAgICB9CgogICAgICAudGFiLWljb24gewogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAudGFiLWljb24ucnVubmluZyB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyIDcwJSA0MCUpIiwgImhzbCgxNDIgNzAlIDU1JSkiKX07CiAgICAgIH0KCiAgICAgIC50YWItbGFiZWwgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAuZXhpdC1iYWRnZSB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIHBhZGRpbmc6IDFweCA1cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5leGl0LWJhZGdlLnN1Y2Nlc3MgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyIDcwJSA5MCUpIiwgImhzbCgxNDIgMzAlIDIwJSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyIDcwJSAzNSUpIiwgImhzbCgxNDIgNzAlIDYwJSkiKX07CiAgICAgIH0KCiAgICAgIC5leGl0LWJhZGdlLmVycm9yIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzAlIDkzJSkiLCAiaHNsKDAgMzAlIDIwJSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA3MCUgNDUlKSIsICJoc2woMCA3MCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLnRhYi1jbG9zZSB7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLnRlcm1pbmFsLXRhYjpob3ZlciAudGFiLWNsb3NlIHsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgIH0KCiAgICAgIC50YWItY2xvc2U6aG92ZXIgewogICAgICAgIG9wYWNpdHk6IDEgIWltcG9ydGFudDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODUlKSIsICJoc2woMCAwJSAyNSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzAlIDUwJSkiLCAiaHNsKDAgNzAlIDYwJSkiKX07CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNTAlKSIsICJoc2woMCAwJSA1MCUpIil9OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBnYXA6IDhweDsKICAgICAgfQoKICAgICAgLyogeHRlcm0uanMgc3R5bGVzICovCiAgICAgIC54dGVybSB7CiAgICAgICAgZm9udC1mZWF0dXJlLXNldHRpbmdzOiAnbGlnYScgMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIC54dGVybS5mb2N1cywKICAgICAgLnh0ZXJtOmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICAueHRlcm0gLnh0ZXJtLWhlbHBlcnMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgfQoKICAgICAgLnh0ZXJtIC54dGVybS1oZWxwZXItdGV4dGFyZWEgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBsZWZ0OiAtOTk5OWVtOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWR0aDogMDsKICAgICAgICBoZWlnaHQ6IDA7CiAgICAgICAgei1pbmRleDogLTU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgfQoKICAgICAgLnh0ZXJtIC5jb21wb3NpdGlvbi12aWV3IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMDAwMDAwIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzMzMzMzMyIsICIjZmZmZmZmIil9OwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQoKICAgICAgLnh0ZXJtIC5jb21wb3NpdGlvbi12aWV3LmFjdGl2ZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC54dGVybSAueHRlcm0tdmlld3BvcnQgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMwMDAwMDAiKX07CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICB9CgogICAgICAueHRlcm0gLnh0ZXJtLXNjcmVlbiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAueHRlcm0gLnh0ZXJtLXNjcmVlbiBjYW52YXMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLnh0ZXJtIC54dGVybS1zY3JvbGwtYXJlYSB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAueHRlcm0tY2hhci1tZWFzdXJlLWVsZW1lbnQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAtOTk5OWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC54dGVybSB7CiAgICAgICAgY3Vyc29yOiB0ZXh0OwogICAgICB9CgogICAgICAueHRlcm0uZW5hYmxlLW1vdXNlLWV2ZW50cyB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICAueHRlcm0ueHRlcm0tY3Vyc29yLXBvaW50ZXIgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgLnh0ZXJtLmNvbHVtbi1zZWxlY3QuZm9jdXMgewogICAgICAgIGN1cnNvcjogY3Jvc3NoYWlyOwogICAgICB9CgogICAgICAueHRlcm0gLnh0ZXJtLWFjY2Vzc2liaWxpdHksCiAgICAgIC54dGVybSAueHRlcm0tbWVzc2FnZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgICBjb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC54dGVybSAubGl2ZS1yZWdpb24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAtOTk5OXB4OwogICAgICAgIHdpZHRoOiAxcHg7CiAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnh0ZXJtLWRpbSB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAueHRlcm0tdW5kZXJsaW5lIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQogICAgYAogICAgICAgIF07CiAgICAgICAgcmVuZGVyKCkgewogICAgICAgICAgY29uc3QgYWN0aXZlVGFiID0gdGhpcy5hY3RpdmVUYWJJZCA/IHRoaXMudGFiTWFuYWdlci5nZXRUYWIodGhpcy5hY3RpdmVUYWJJZCkgOiBudWxsOwogICAgICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJ0ZXJtaW5hbC1jb250YWluZXIiPgogICAgICAgIDwhLS0gTWFpbiB0ZXJtaW5hbCBhcmVhIC0tPgogICAgICAgIDxkaXYgY2xhc3M9InRlcm1pbmFsLWNvbnRlbnQiPgogICAgICAgICAgJHthY3RpdmVUYWIgPyBiMmAKICAgICAgICAgICAgPGRpdiBpZD0iYWN0aXZlLXRlcm1pbmFsLWNvbnRhaW5lciI+PC9kaXY+CiAgICAgICAgICBgIDogYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlIj4KICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTp0ZXJtaW5hbCJ9IGljb25TaXplPSIzMiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgPHNwYW4+Tm8gdGVybWluYWwgb3Blbjwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgfQogICAgICAgICAgPGRlZXMtYWN0aW9uYmFyPjwvZGVlcy1hY3Rpb25iYXI+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDwhLS0gVmVydGljYWwgdGFiIGJhciBvbiB0aGUgcmlnaHQgLS0+CiAgICAgICAgJHt0aGlzLnNob3dUYWJCYXIgPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9InRhYi1iYXIiIHN0eWxlPSJ3aWR0aDogJHt0aGlzLnRhYkJhcldpZHRofXB4Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiLWJhci1oZWFkZXIiPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWItYmFyLXRpdGxlIj5UZXJtaW5hbHM8L3NwYW4+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiLWJhci1hY3Rpb25zIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYi1hY3Rpb24iIEBjbGljaz0ke3RoaXMuaGFuZGxlQWRkVGFifSB0aXRsZT0iTmV3IFRlcm1pbmFsIj4KICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6cGx1cyJ9IGljb25TaXplPSIxNCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWItbGlzdCI+CiAgICAgICAgICAgICAgJHt0aGlzLnRhYnMubWFwKCh0YWIyKSA9PiBiMmAKICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgY2xhc3M9InRlcm1pbmFsLXRhYiAke3RhYjIuaWQgPT09IHRoaXMuYWN0aXZlVGFiSWQgPyAiYWN0aXZlIiA6ICIifSAke3RhYjIuZXhpdGVkID8gImV4aXRlZCIgOiAiIn0iCiAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuc3dpdGNoVG9UYWIodGFiMi5pZCl9CiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIDxkZWVzLWljb24KICAgICAgICAgICAgICAgICAgICAuaWNvbj0ke3RhYjIuaWNvbk5hbWV9CiAgICAgICAgICAgICAgICAgICAgaWNvblNpemU9IjE0IgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJ0YWItaWNvbiAke3RhYjIucHJvY2VzcyAmJiAhdGFiMi5leGl0ZWQgPyAicnVubmluZyIgOiAiIn0iCiAgICAgICAgICAgICAgICAgID48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhYi1sYWJlbCI+JHt0YWIyLmxhYmVsfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgJHt0YWIyLmV4aXRlZCA/IGIyYAogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJleGl0LWJhZGdlICR7dGFiMi5leGl0Q29kZSA9PT0gMCA/ICJzdWNjZXNzIiA6ICJlcnJvciJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICR7dGFiMi5leGl0Q29kZX0KICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICAgICAgJHt0YWIyLmNsb3NlYWJsZSA/IGIyYAogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWItY2xvc2UiIEBjbGljaz0keyhlMTEpID0+IHRoaXMuaGFuZGxlVGFiQ2xvc2UoZTExLCB0YWIyLmlkKX0+CiAgICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTp4In0gaWNvblNpemU9IjEyIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIGApfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGAgOiAiIn0KICAgICAgPC9kaXY+CiAgICBgOwogICAgICAgIH0KICAgICAgICBhc3luYyBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgICAgICBjb25zdCBkb210b29sc0luc3RhbmNlID0gYXdhaXQgdGhpcy5kb210b29sc1Byb21pc2U7CiAgICAgICAgICB0aGlzLmlzQnJpZ2h0ID0gZG9tdG9vbHNJbnN0YW5jZS50aGVtZU1hbmFnZXIuZ29CcmlnaHRCb29sZWFuOwogICAgICAgICAgdGhpcy50ZXJtaW5hbFRoZW1lU3Vic2NyaXB0aW9uID0gZG9tdG9vbHNJbnN0YW5jZS50aGVtZU1hbmFnZXIudGhlbWVPYnNlcnZhYmxlLnN1YnNjcmliZSgoZ29CcmlnaHQpID0+IHsKICAgICAgICAgICAgdGhpcy5pc0JyaWdodCA9IGdvQnJpZ2h0OwogICAgICAgICAgICB0aGlzLnRhYk1hbmFnZXIudXBkYXRlQWxsVGhlbWVzKGdvQnJpZ2h0KTsKICAgICAgICAgIH0pOwogICAgICAgICAgY29uc3QgbGliTG9hZGVyID0gRGVlc1NlcnZpY2VMaWJMb2FkZXIuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgIGNvbnN0IFt4dGVybUJ1bmRsZSwgZml0QWRkb25CdW5kbGVdID0gYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgICAgICAgICBsaWJMb2FkZXIubG9hZFh0ZXJtKCksCiAgICAgICAgICAgIGxpYkxvYWRlci5sb2FkWHRlcm1GaXRBZGRvbigpCiAgICAgICAgICBdKTsKICAgICAgICAgIHRoaXMudGFiTWFuYWdlci5zZXRYdGVybU1vZHVsZXMoeHRlcm1CdW5kbGUsIGZpdEFkZG9uQnVuZGxlKTsKICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlU2hlbGxUYWIoKTsKICAgICAgICB9CiAgICAgICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgICBhd2FpdCBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIH0KICAgICAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQoImFjdGl2ZS10ZXJtaW5hbC1jb250YWluZXIiKTsKICAgICAgICAgIGlmIChjb250YWluZXIpIHsKICAgICAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci51bm9ic2VydmUoY29udGFpbmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLnRlcm1pbmFsVGhlbWVTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgdGhpcy50ZXJtaW5hbFRoZW1lU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIHRoaXMudGVybWluYWxUaGVtZVN1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLnRhYk1hbmFnZXIuZGlzcG9zZUFsbCgpOwogICAgICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICB9CiAgICAgICAgLy8gPT09PT09PT09PSBUYWIgTWFuYWdlbWVudCA9PT09PT09PT09CiAgICAgICAgYXN5bmMgaGFuZGxlQWRkVGFiKCkgewogICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVTaGVsbFRhYigpOwogICAgICAgIH0KICAgICAgICBoYW5kbGVUYWJDbG9zZShlMTEsIHRhYklkKSB7CiAgICAgICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICB0aGlzLmNsb3NlVGFiKHRhYklkKTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoVG9UYWIodGFiSWQpIHsKICAgICAgICAgIGlmICh0YWJJZCA9PT0gdGhpcy5hY3RpdmVUYWJJZCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY29uc3QgdGFiMiA9IHRoaXMudGFiTWFuYWdlci5nZXRUYWIodGFiSWQpOwogICAgICAgICAgaWYgKCF0YWIyKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjb25zdCBwcmV2aW91c1RhYklkID0gdGhpcy5hY3RpdmVUYWJJZDsKICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVRhYklkKSB7CiAgICAgICAgICAgIHRoaXMuZGV0YWNoQWN0aXZlVGVybWluYWwoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuYWN0aXZlVGFiSWQgPSB0YWJJZDsKICAgICAgICAgIHRoaXMudGFicyA9IHRoaXMudGFiTWFuYWdlci5nZXRBbGxUYWJzKCk7CiAgICAgICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4gewogICAgICAgICAgICB0aGlzLmF0dGFjaFRlcm1pbmFsVG9Db250YWluZXIodGFiMik7CiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInRhYi1zd2l0Y2hlZCIsIHsKICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLAogICAgICAgICAgICAgIGRldGFpbDogeyB0YWJJZCwgcHJldmlvdXNUYWJJZCB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBkZXRhY2hBY3RpdmVUZXJtaW5hbCgpIHsKICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQoImFjdGl2ZS10ZXJtaW5hbC1jb250YWluZXIiKTsKICAgICAgICAgIGlmIChjb250YWluZXIpIHsKICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICIiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBhdHRhY2hUZXJtaW5hbFRvQ29udGFpbmVyKHRhYjIpIHsKICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQoImFjdGl2ZS10ZXJtaW5hbC1jb250YWluZXIiKTsKICAgICAgICAgIGlmICghY29udGFpbmVyKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyKTsKICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAiIjsKICAgICAgICAgIHRhYjIudGVybWluYWwub3Blbihjb250YWluZXIpOwogICAgICAgICAgdGFiMi5maXRBZGRvbi5maXQoKTsKICAgICAgICAgIHRhYjIudGVybWluYWwuZm9jdXMoKTsKICAgICAgICB9CiAgICAgICAgaGFuZGxlUmVzaXplKCkgewogICAgICAgICAgaWYgKHRoaXMuYWN0aXZlVGFiSWQpIHsKICAgICAgICAgICAgY29uc3QgdGFiMiA9IHRoaXMudGFiTWFuYWdlci5nZXRUYWIodGhpcy5hY3RpdmVUYWJJZCk7CiAgICAgICAgICAgIGlmICh0YWIyKSB7CiAgICAgICAgICAgICAgdGFiMi5maXRBZGRvbi5maXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyA9PT09PT09PT09IFByb2Nlc3MgTWFuYWdlbWVudCA9PT09PT09PT09CiAgICAgICAgYXN5bmMgc3Bhd25Qcm9jZXNzRm9yVGFiKHRhYjIsIGNvbW1hbmQsIGFyZ3MgPSBbXSkgewogICAgICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KSB7CiAgICAgICAgICAgIHRhYjIudGVybWluYWwud3JpdGUoIlx4MUJbMzFtIik7CiAgICAgICAgICAgIHRhYjIudGVybWluYWwud3JpdGUoIlx1Mjc0QyBObyBleGVjdXRpb24gZW52aXJvbm1lbnQgYXZhaWxhYmxlLlxyXG4iKTsKICAgICAgICAgICAgdGFiMi50ZXJtaW5hbC53cml0ZSgiXHgxQlswbSIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZHkpIHsKICAgICAgICAgICAgICB0YWIyLnRlcm1pbmFsLndyaXRlKCJJbml0aWFsaXppbmcgZW52aXJvbm1lbnQuLi5cclxuIik7CiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5pbml0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcHJvY2VzczQgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnNwYXduKGNvbW1hbmQsIGFyZ3MpOwogICAgICAgICAgICBwcm9jZXNzNC5vdXRwdXQucGlwZVRvKG5ldyBXcml0YWJsZVN0cmVhbSh7CiAgICAgICAgICAgICAgd3JpdGU6IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgICB0YWIyLnRlcm1pbmFsLndyaXRlKGRhdGEpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBjb25zdCBpbnB1dFdyaXRlciA9IHByb2Nlc3M0LmlucHV0LmdldFdyaXRlcigpOwogICAgICAgICAgICB0YWIyLnRlcm1pbmFsLm9uRGF0YSgoZGF0YSkgPT4gewogICAgICAgICAgICAgIGlucHV0V3JpdGVyLndyaXRlKGRhdGEpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy50YWJNYW5hZ2VyLnNldFRhYlByb2Nlc3ModGFiMi5pZCwgcHJvY2VzczQsIGlucHV0V3JpdGVyKTsKICAgICAgICAgICAgdGhpcy50YWJzID0gdGhpcy50YWJNYW5hZ2VyLmdldEFsbFRhYnMoKTsKICAgICAgICAgICAgcHJvY2VzczQuZXhpdC50aGVuKChleGl0Q29kZSkgPT4gewogICAgICAgICAgICAgIHRoaXMuaGFuZGxlUHJvY2Vzc0V4aXQodGFiMi5pZCwgZXhpdENvZGUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHRhYjIudGVybWluYWwud3JpdGUoIlx4MUJbMzFtIik7CiAgICAgICAgICAgIHRhYjIudGVybWluYWwud3JpdGUoYFx1Mjc0QyBGYWlsZWQgdG8gc3Bhd24gcHJvY2VzczogJHtlcnJvcn1ccgpgKTsKICAgICAgICAgICAgdGFiMi50ZXJtaW5hbC53cml0ZSgiXHgxQlswbSIpOwogICAgICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gc3Bhd24gcHJvY2VzczoiLCBlcnJvcik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGhhbmRsZVByb2Nlc3NFeGl0KHRhYklkLCBleGl0Q29kZSkgewogICAgICAgICAgY29uc3QgdGFiMiA9IHRoaXMudGFiTWFuYWdlci5nZXRUYWIodGFiSWQpOwogICAgICAgICAgaWYgKCF0YWIyKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB0aGlzLnRhYk1hbmFnZXIubWFya1RhYkV4aXRlZCh0YWJJZCwgZXhpdENvZGUpOwogICAgICAgICAgY29uc3QgbWVzc2FnZTIgPSBleGl0Q29kZSA9PT0gMCA/ICJcclxuXHgxQlszMm1bUHJvY2VzcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XVx4MUJbMG1cclxuIiA6IGBccgpceDFCWzMxbVtQcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJHtleGl0Q29kZX1dXHgxQlswbVxyCmA7CiAgICAgICAgICB0YWIyLnRlcm1pbmFsLndyaXRlKG1lc3NhZ2UyKTsKICAgICAgICAgIHRoaXMudGFicyA9IHRoaXMudGFiTWFuYWdlci5nZXRBbGxUYWJzKCk7CiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJwcm9jZXNzLWNvbXBsZXRlIiwgewogICAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgICBjb21wb3NlZDogdHJ1ZSwKICAgICAgICAgICAgZGV0YWlsOiB7IHRhYklkLCBleGl0Q29kZSB9CiAgICAgICAgICB9KSk7CiAgICAgICAgICBpZiAodGFiMi5jbG9zZWFibGUpIHsKICAgICAgICAgICAgdGhpcy5zaG93RXhpdGVkVGFiQWN0aW9uYmFyKHRhYklkLCB0YWIyLmxhYmVsLCBleGl0Q29kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNob3cgYWN0aW9uYmFyIG9mZmVyaW5nIHRvIGNsb3NlIGFuIGV4aXRlZCB0YWIKICAgICAgICAgKi8KICAgICAgICBhc3luYyBzaG93RXhpdGVkVGFiQWN0aW9uYmFyKHRhYklkLCB0YWJMYWJlbCwgZXhpdENvZGUpIHsKICAgICAgICAgIGNvbnN0IGlzU3VjY2VzcyA9IGV4aXRDb2RlID09PSAwOwogICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaG93QWN0aW9uYmFyKHsKICAgICAgICAgICAgbWVzc2FnZTogaXNTdWNjZXNzID8gYCIke3RhYkxhYmVsfSIgY29tcGxldGVkLiBDbG9zZSB0YWI/YCA6IGAiJHt0YWJMYWJlbH0iIGV4aXRlZCAoY29kZSAke2V4aXRDb2RlfSkuIENsb3NlIHRhYj9gLAogICAgICAgICAgICB0eXBlOiBpc1N1Y2Nlc3MgPyAiaW5mbyIgOiAid2FybmluZyIsCiAgICAgICAgICAgIGljb246IGlzU3VjY2VzcyA/ICJsdWNpZGU6Y2hlY2tDaXJjbGUiIDogImx1Y2lkZTphbGVydFRyaWFuZ2xlIiwKICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgIHsgaWQ6ICJjbG9zZSIsIGxhYmVsOiAiQ2xvc2UgVGFiIiwgcHJpbWFyeTogdHJ1ZSB9LAogICAgICAgICAgICAgIHsgaWQ6ICJrZWVwIiwgbGFiZWw6ICJLZWVwIE9wZW4iIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgdGltZW91dDogeyBkdXJhdGlvbjogMWU0LCBkZWZhdWx0QWN0aW9uSWQ6ICJjbG9zZSIgfSwKICAgICAgICAgICAgZGlzbWlzc2libGU6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKHJlc3VsdC5hY3Rpb25JZCA9PT0gImNsb3NlIikgewogICAgICAgICAgICB0aGlzLmNsb3NlVGFiKHRhYklkKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gPT09PT09PT09PSBQdWJsaWMgQVBJID09PT09PT09PT0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgYSBuZXcgc2hlbGwgdGFiCiAgICAgICAgICovCiAgICAgICAgYXN5bmMgY3JlYXRlU2hlbGxUYWIobGFiZWwpIHsKICAgICAgICAgIGNvbnN0IHRhYjIgPSB0aGlzLnRhYk1hbmFnZXIuY3JlYXRlVGFiKHsKICAgICAgICAgICAgdHlwZTogInNoZWxsIiwKICAgICAgICAgICAgbGFiZWw6IGxhYmVsIHx8IGBiYXNoICR7dGhpcy50YWJNYW5hZ2VyLmdldFRhYkNvdW50KCkgKyAxfWAsCiAgICAgICAgICAgIGNsb3NlYWJsZTogdGhpcy50YWJNYW5hZ2VyLmdldFRhYkNvdW50KCkgPiAwCiAgICAgICAgICAgIC8vIEZpcnN0IHRhYiBub3QgY2xvc2VhYmxlCiAgICAgICAgICB9LCB0aGlzLmlzQnJpZ2h0KTsKICAgICAgICAgIHRoaXMudGFicyA9IHRoaXMudGFiTWFuYWdlci5nZXRBbGxUYWJzKCk7CiAgICAgICAgICB0aGlzLnN3aXRjaFRvVGFiKHRhYjIuaWQpOwogICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgICAgIGF3YWl0IHRoaXMuc3Bhd25Qcm9jZXNzRm9yVGFiKHRhYjIsICJqc2giKTsKICAgICAgICAgIGlmICh0aGlzLnRhYk1hbmFnZXIuZ2V0VGFiQ291bnQoKSA9PT0gMSAmJiB0aGlzLnNldHVwQ29tbWFuZCkgewogICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JQcm9tcHQodGFiMi50ZXJtaW5hbCwgIn4vIik7CiAgICAgICAgICAgIGlmICh0YWIyLmlucHV0V3JpdGVyKSB7CiAgICAgICAgICAgICAgdGFiMi5pbnB1dFdyaXRlci53cml0ZSh0aGlzLnNldHVwQ29tbWFuZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInRhYi1jcmVhdGVkIiwgewogICAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgICBjb21wb3NlZDogdHJ1ZSwKICAgICAgICAgICAgZGV0YWlsOiB7IHRhYklkOiB0YWIyLmlkIH0KICAgICAgICAgIH0pKTsKICAgICAgICAgIHJldHVybiB0YWIyLmlkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgYSB0ZXJtaW5hbCB0YWIgZm9yIHJ1bm5pbmcgYSBwcm9jZXNzCiAgICAgICAgICovCiAgICAgICAgYXN5bmMgY3JlYXRlUHJvY2Vzc1RhYihvcHRpb25zKSB7CiAgICAgICAgICBjb25zdCB0YWIyID0gdGhpcy50YWJNYW5hZ2VyLmNyZWF0ZVRhYihvcHRpb25zLCB0aGlzLmlzQnJpZ2h0KTsKICAgICAgICAgIHRoaXMudGFicyA9IHRoaXMudGFiTWFuYWdlci5nZXRBbGxUYWJzKCk7CiAgICAgICAgICBpZiAob3B0aW9ucy5zd2l0Y2hUb1RhYiAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgdGhpcy5zd2l0Y2hUb1RhYih0YWIyLmlkKTsKICAgICAgICAgIH0KICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7CiAgICAgICAgICBpZiAob3B0aW9ucy5jb21tYW5kKSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3Bhd25Qcm9jZXNzRm9yVGFiKHRhYjIsIG9wdGlvbnMuY29tbWFuZCwgb3B0aW9ucy5hcmdzKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInRhYi1jcmVhdGVkIiwgewogICAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgICBjb21wb3NlZDogdHJ1ZSwKICAgICAgICAgICAgZGV0YWlsOiB7IHRhYklkOiB0YWIyLmlkIH0KICAgICAgICAgIH0pKTsKICAgICAgICAgIHJldHVybiB0YWIyLmlkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXQgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGFiCiAgICAgICAgICovCiAgICAgICAgZ2V0QWN0aXZlVGFiKCkgewogICAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZVRhYklkKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIHJldHVybiB0aGlzLnRhYk1hbmFnZXIuZ2V0VGFiKHRoaXMuYWN0aXZlVGFiSWQpIHx8IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldCBhbGwgdGFicwogICAgICAgICAqLwogICAgICAgIGdldFRhYnMoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy50YWJNYW5hZ2VyLmdldEFsbFRhYnMoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU3dpdGNoIHRvIGEgc3BlY2lmaWMgdGFiIGJ5IElECiAgICAgICAgICovCiAgICAgICAgc2VsZWN0VGFiKHRhYklkKSB7CiAgICAgICAgICBpZiAoIXRoaXMudGFiTWFuYWdlci5oYXNUYWIodGFiSWQpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB0aGlzLnN3aXRjaFRvVGFiKHRhYklkKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDbG9zZSBhIHRhYiBieSBJRAogICAgICAgICAqLwogICAgICAgIGNsb3NlVGFiKHRhYklkKSB7CiAgICAgICAgICBjb25zdCB0YWIyID0gdGhpcy50YWJNYW5hZ2VyLmdldFRhYih0YWJJZCk7CiAgICAgICAgICBpZiAoIXRhYjIgfHwgIXRhYjIuY2xvc2VhYmxlKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICBpZiAodGFiSWQgPT09IHRoaXMuYWN0aXZlVGFiSWQpIHsKICAgICAgICAgICAgY29uc3QgYWxsVGFicyA9IHRoaXMudGFiTWFuYWdlci5nZXRBbGxUYWJzKCk7CiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGFsbFRhYnMuZmluZEluZGV4KCh0OSkgPT4gdDkuaWQgPT09IHRhYklkKTsKICAgICAgICAgICAgY29uc3QgbmV4dFRhYiA9IGFsbFRhYnNbY3VycmVudEluZGV4ICsgMV0gfHwgYWxsVGFic1tjdXJyZW50SW5kZXggLSAxXTsKICAgICAgICAgICAgaWYgKG5leHRUYWIpIHsKICAgICAgICAgICAgICB0aGlzLnN3aXRjaFRvVGFiKG5leHRUYWIuaWQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuYWN0aXZlVGFiSWQgPSBudWxsOwogICAgICAgICAgICAgIHRoaXMuZGV0YWNoQWN0aXZlVGVybWluYWwoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdGhpcy50YWJNYW5hZ2VyLmNsb3NlVGFiKHRhYklkKTsKICAgICAgICAgIHRoaXMudGFicyA9IHRoaXMudGFiTWFuYWdlci5nZXRBbGxUYWJzKCk7CiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJ0YWItY2xvc2VkIiwgewogICAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgICBjb21wb3NlZDogdHJ1ZSwKICAgICAgICAgICAgZGV0YWlsOiB7IHRhYklkIH0KICAgICAgICAgIH0pKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXcml0ZSBkYXRhIHRvIGEgdGFiJ3MgdGVybWluYWwKICAgICAgICAgKi8KICAgICAgICB3cml0ZVRvVGFiKHRhYklkLCBkYXRhKSB7CiAgICAgICAgICBjb25zdCB0YWIyID0gdGhpcy50YWJNYW5hZ2VyLmdldFRhYih0YWJJZCk7CiAgICAgICAgICBpZiAoIXRhYjIpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIHRhYjIudGVybWluYWwud3JpdGUoZGF0YSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2VuZCBpbnB1dCB0byBhIHRhYidzIHByb2Nlc3MgKGlmIGludGVyYWN0aXZlKQogICAgICAgICAqLwogICAgICAgIHNlbmRJbnB1dFRvVGFiKHRhYklkLCBkYXRhKSB7CiAgICAgICAgICBjb25zdCB0YWIyID0gdGhpcy50YWJNYW5hZ2VyLmdldFRhYih0YWJJZCk7CiAgICAgICAgICBpZiAoIXRhYjIgfHwgIXRhYjIuaW5wdXRXcml0ZXIpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIHRhYjIuaW5wdXRXcml0ZXIud3JpdGUoZGF0YSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2hvdyBhbiBhY3Rpb25iYXIgbm90aWZpY2F0aW9uIGluIHRoZSB0ZXJtaW5hbCBwYW5lbCBjb250ZXh0LgogICAgICAgICAqIFVzZSB0aGlzIGZvciB0ZXJtaW5hbC1yZWxhdGVkIGRlY2lzaW9ucyAoZS5nLiwgcmV0cnkgZmFpbGVkIHByb2Nlc3MsIGtpbGwgcHJvY2VzcywgZXRjLikKICAgICAgICAgKi8KICAgICAgICBhc3luYyBzaG93QWN0aW9uYmFyKG9wdGlvbnMpIHsKICAgICAgICAgIGlmICghdGhpcy50ZXJtaW5hbEFjdGlvbmJhcikgewogICAgICAgICAgICB0aGlzLnRlcm1pbmFsQWN0aW9uYmFyID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCJkZWVzLWFjdGlvbmJhciIpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRoaXMudGVybWluYWxBY3Rpb25iYXI/LnNob3cob3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIC8vID09PT09PT09PT0gVXRpbGl0eSBNZXRob2RzID09PT09PT09PT0KICAgICAgICBhc3luYyB3YWl0Rm9yUHJvbXB0KHRlcm0sIHByb21wdCkgewogICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlMikgPT4gewogICAgICAgICAgICBjb25zdCBjaGVja1Byb21wdCA9ICgpID0+IHsKICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IHRlcm0uYnVmZmVyLmFjdGl2ZTsKICAgICAgICAgICAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBsaW5lcy5sZW5ndGg7IGkxMSsrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBsaW5lID0gbGluZXMuZ2V0TGluZShpMTEpOwogICAgICAgICAgICAgICAgaWYgKGxpbmUgJiYgbGluZS50cmFuc2xhdGVUb1N0cmluZygpLmluY2x1ZGVzKHByb21wdCkpIHsKICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZTIoKTsKICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzZXRUaW1lb3V0KGNoZWNrUHJvbXB0LCAxMDApOwogICAgICAgICAgICB9OwogICAgICAgICAgICBjaGVja1Byb21wdCgpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGFzeW5jIHNldEVudmlyb25tZW50VmFyaWFibGVzKGVudkFyZykgewogICAgICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTm8gZXhlY3V0aW9uIGVudmlyb25tZW50IGF2YWlsYWJsZSIpOwogICAgICAgICAgfQogICAgICAgICAgbGV0IGVudkZpbGUgPSAiIjsKICAgICAgICAgIGZvciAoY29uc3Qga2V5MiBpbiBlbnZBcmcpIHsKICAgICAgICAgICAgZW52RmlsZSArPSBgZXhwb3J0ICR7a2V5Mn09IiR7ZW52QXJnW2tleTJdfSIKYDsKICAgICAgICAgIH0KICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQud3JpdGVGaWxlKCIvc291cmNlLmVudiIsIGVudkZpbGUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgZXhlY3V0aW9uIGVudmlyb25tZW50LgogICAgICAgICAqLwogICAgICAgIGdldEV4ZWN1dGlvbkVudmlyb25tZW50KCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQ7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyB7CiAgICAgICAgICBfX3J1bkluaXRpYWxpemVyczg4KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJldHVybiBEZWVzV29ya3NwYWNlVGVybWluYWwyID0gX2NsYXNzVGhpczsKICAgIH0pKCk7CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AcHVzaHJvY2tzK3NtYXJ0cHJvbWlzZUAzLjEuMTAvbm9kZV9tb2R1bGVzL0BwdXNocm9ja3Mvc21hcnRwcm9taXNlL2Rpc3RfdHMvaW5kZXguanMKdmFyIHJlcXVpcmVfZGlzdF90czMgPSBfX2NvbW1vbkpTKHsKICAibm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNocm9ja3Mrc21hcnRwcm9taXNlQDMuMS4xMC9ub2RlX21vZHVsZXMvQHB1c2hyb2Nrcy9zbWFydHByb21pc2UvZGlzdF90cy9pbmRleC5qcyIoZXhwb3J0cykgewogICAgInVzZSBzdHJpY3QiOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIGV4cG9ydHMuZ2V0Rmlyc3RUcnVlT3JGYWxzZSA9IGV4cG9ydHMudGltZW91dEFuZENvbnRpbnVlID0gZXhwb3J0cy50aW1lb3V0V3JhcCA9IGV4cG9ydHMubWFwID0gZXhwb3J0cy5yZWplY3RlZFByb21pc2UgPSBleHBvcnRzLnJlc29sdmVkUHJvbWlzZSA9IGV4cG9ydHMuZGVmZXIgPSBleHBvcnRzLkRlZmVycmVkID0gdm9pZCAwOwogICAgdmFyIERlZmVycmVkMyA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgICAgICAgIHRoaXMucmVzb2x2ZSA9ICh2YWx1ZUFyZykgPT4gewogICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICJmdWxmaWxsZWQiOwogICAgICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIHJlc29sdmUyKHZhbHVlQXJnKTsKICAgICAgICAgIH07CiAgICAgICAgICB0aGlzLnJlamVjdCA9IChyZWFzb24pID0+IHsKICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAicmVqZWN0ZWQiOwogICAgICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIHJlamVjdChyZWFzb24pOwogICAgICAgICAgfTsKICAgICAgICAgIHRoaXMuc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgIHRoaXMuc3RhdHVzID0gInBlbmRpbmciOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGdldCBkdXJhdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5zdG9wcGVkQXQpIHsKICAgICAgICAgIHJldHVybiB0aGlzLnN0b3BwZWRBdCAtIHRoaXMuc3RhcnRlZEF0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gRGF0ZS5ub3coKSAtIHRoaXMuc3RhcnRlZEF0OwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGV4cG9ydHMuRGVmZXJyZWQgPSBEZWZlcnJlZDM7CiAgICBleHBvcnRzLmRlZmVyID0gKCkgPT4gewogICAgICByZXR1cm4gbmV3IERlZmVycmVkMygpOwogICAgfTsKICAgIGV4cG9ydHMucmVzb2x2ZWRQcm9taXNlID0gKHZhbHVlMikgPT4gewogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlMik7CiAgICB9OwogICAgZXhwb3J0cy5yZWplY3RlZFByb21pc2UgPSAoZXJyKSA9PiB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpOwogICAgfTsKICAgIGV4cG9ydHMubWFwID0gYXN5bmMgKGlucHV0QXJnLCBmdW5jdGlvbkFyZykgPT4gewogICAgICBjb25zdCBwcm9taXNlQXJyYXkgPSBbXTsKICAgICAgY29uc3QgcmVzdWx0QXJyYXkgPSBbXTsKICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGlucHV0QXJnKSB7CiAgICAgICAgY29uc3QgcHJvbWlzZSA9IGZ1bmN0aW9uQXJnKGl0ZW0pOwogICAgICAgIHByb21pc2VBcnJheS5wdXNoKHByb21pc2UpOwogICAgICAgIHByb21pc2UudGhlbigoeDQpID0+IHsKICAgICAgICAgIHJlc3VsdEFycmF5LnB1c2goeDQpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VBcnJheSk7CiAgICAgIHJldHVybiByZXN1bHRBcnJheTsKICAgIH07CiAgICBleHBvcnRzLnRpbWVvdXRXcmFwID0gYXN5bmMgKHByb21pc2VBcmcsIHRpbWVvdXRJbk1zQXJnLCByZWplY3RBcmcgPSB0cnVlKSA9PiB7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdCkgPT4gewogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgaWYgKHJlamVjdEFyZykgewogICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCJ0aW1lb3V0IikpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzb2x2ZTIobnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgdGltZW91dEluTXNBcmcpOwogICAgICAgIHByb21pc2VBcmcudGhlbihyZXNvbHZlMiwgcmVqZWN0KTsKICAgICAgfSk7CiAgICB9OwogICAgZXhwb3J0cy50aW1lb3V0QW5kQ29udGludWUgPSBhc3luYyAocHJvbWlzZUFyZywgdGltZW91dEluTXNBcmcgPSA2ZTQpID0+IHsKICAgICAgcmV0dXJuIGV4cG9ydHMudGltZW91dFdyYXAocHJvbWlzZUFyZywgdGltZW91dEluTXNBcmcsIGZhbHNlKTsKICAgIH07CiAgICBleHBvcnRzLmdldEZpcnN0VHJ1ZU9yRmFsc2UgPSBhc3luYyAocHJvbWlzZXNBcmcpID0+IHsKICAgICAgY29uc3QgZG9uZSA9IGV4cG9ydHMuZGVmZXIoKTsKICAgICAgZm9yIChjb25zdCBwcm9taXNlQXJnIG9mIHByb21pc2VzQXJnKSB7CiAgICAgICAgcHJvbWlzZUFyZy50aGVuKChyZXN1bHRBcmcpID0+IHsKICAgICAgICAgIGlmIChyZXN1bHRBcmcgPT09IHRydWUpIHsKICAgICAgICAgICAgZG9uZS5yZXNvbHZlKHRydWUpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIFByb21pc2UuYWxsKHByb21pc2VzQXJnKS50aGVuKCgpID0+IHsKICAgICAgICBkb25lLnJlc29sdmUoZmFsc2UpOwogICAgICB9KTsKICAgICAgcmV0dXJuIGRvbmUucHJvbWlzZTsKICAgIH07CiAgfQp9KTsKCi8vIHRzX3dlYi9wbHVnaW5zLnRzCnZhciBwbHVnaW5zX2V4cG9ydHM1ID0ge307Cl9fZXhwb3J0KHBsdWdpbnNfZXhwb3J0czUsIHsKICBEZWVzRWxlbWVudDogKCkgPT4gRGVlc0VsZW1lbnQyLAogIGNzczogKCkgPT4gY3NzMiwKICBjc3NNYW5hZ2VyOiAoKSA9PiBjc3NNYW5hZ2VyMiwKICBjdXN0b21FbGVtZW50OiAoKSA9PiBjdXN0b21FbGVtZW50MiwKICBkZWVzQ2F0YWxvZzogKCkgPT4gZGlzdF90c193ZWJfZXhwb3J0czIsCiAgZGVlc0VsZW1lbnQ6ICgpID0+IGRpc3RfdHNfZXhwb3J0czMwLAogIGh0bWw6ICgpID0+IGh0bWw3LAogIHByb3BlcnR5OiAoKSA9PiBwcm9wZXJ0eSwKICBzbWFydHJ4OiAoKSA9PiBkaXN0X3RzX2V4cG9ydHMyLAogIHN0YXRlOiAoKSA9PiBzdGF0ZSwKICB0eXBlZHJlcXVlc3Q6ICgpID0+IGRpc3RfdHNfZXhwb3J0czE5LAogIHR5cGVkc29ja2V0OiAoKSA9PiBkaXN0X3RzX2V4cG9ydHMzNAp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvaW5kZXguanMKdmFyIGRpc3RfdHNfd2ViX2V4cG9ydHMyID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfd2ViX2V4cG9ydHMyLCB7CiAgQ2FudmFzUG9vbDogKCkgPT4gQ2FudmFzUG9vbCwKICBEZWVzQWN0aW9uYmFyOiAoKSA9PiBEZWVzQWN0aW9uYmFyLAogIERlZXNBcHB1aTogKCkgPT4gRGVlc0FwcHVpLAogIERlZXNBcHB1aUFjdGl2aXR5bG9nOiAoKSA9PiBEZWVzQXBwdWlBY3Rpdml0eWxvZywKICBEZWVzQXBwdWlCYXI6ICgpID0+IERlZXNBcHB1aUJhciwKICBEZWVzQXBwdWlCb3R0b21iYXI6ICgpID0+IERlZXNBcHB1aUJvdHRvbWJhciwKICBEZWVzQXBwdWlNYWluY29udGVudDogKCkgPT4gRGVlc0FwcHVpTWFpbmNvbnRlbnQsCiAgRGVlc0FwcHVpTWFpbm1lbnU6ICgpID0+IERlZXNBcHB1aU1haW5tZW51LAogIERlZXNBcHB1aVByb2ZpbGVEcm9wZG93bjogKCkgPT4gRGVlc0FwcHVpUHJvZmlsZURyb3Bkb3duLAogIERlZXNBcHB1aVNlY29uZGFyeW1lbnU6ICgpID0+IERlZXNBcHB1aVNlY29uZGFyeW1lbnUsCiAgRGVlc0FwcHVpVGFiczogKCkgPT4gRGVlc0FwcHVpVGFicywKICBEZWVzQXVkaW9WaWV3ZXI6ICgpID0+IERlZXNBdWRpb1ZpZXdlciwKICBEZWVzQmFkZ2U6ICgpID0+IERlZXNCYWRnZSwKICBEZWVzQnV0dG9uOiAoKSA9PiBEZWVzQnV0dG9uLAogIERlZXNCdXR0b25FeGl0OiAoKSA9PiBEZWVzQnV0dG9uRXhpdCwKICBEZWVzQnV0dG9uR3JvdXA6ICgpID0+IERlZXNCdXR0b25Hcm91cCwKICBEZWVzQ2hhcnRBcmVhOiAoKSA9PiBEZWVzQ2hhcnRBcmVhLAogIERlZXNDaGFydExvZzogKCkgPT4gRGVlc0NoYXJ0TG9nLAogIERlZXNDaGlwczogKCkgPT4gRGVlc0NoaXBzLAogIERlZXNDb250ZXh0bWVudTogKCkgPT4gRGVlc0NvbnRleHRtZW51LAogIERlZXNEYXNoYm9hcmRncmlkOiAoKSA9PiBEZWVzRGFzaGJvYXJkZ3JpZCwKICBEZWVzRGF0YXZpZXdDb2RlYm94OiAoKSA9PiBEZWVzRGF0YXZpZXdDb2RlYm94LAogIERlZXNEYXRhdmlld1N0YXR1c29iamVjdDogKCkgPT4gRGVlc0RhdGF2aWV3U3RhdHVzb2JqZWN0LAogIERlZXNGb3JtOiAoKSA9PiBEZWVzRm9ybSwKICBEZWVzRm9ybVN1Ym1pdDogKCkgPT4gRGVlc0Zvcm1TdWJtaXQsCiAgRGVlc0Zvcm1hdHRpbmdNZW51OiAoKSA9PiBEZWVzRm9ybWF0dGluZ01lbnUsCiAgRGVlc0hlYWRpbmc6ICgpID0+IERlZXNIZWFkaW5nLAogIERlZXNIaW50OiAoKSA9PiBEZWVzSGludCwKICBEZWVzSWNvbjogKCkgPT4gRGVlc0ljb24sCiAgRGVlc0ltYWdlVmlld2VyOiAoKSA9PiBEZWVzSW1hZ2VWaWV3ZXIsCiAgRGVlc0lucHV0QmFzZTogKCkgPT4gRGVlc0lucHV0QmFzZSwKICBEZWVzSW5wdXRDaGVja2JveDogKCkgPT4gRGVlc0lucHV0Q2hlY2tib3gsCiAgRGVlc0lucHV0Q29kZTogKCkgPT4gRGVlc0lucHV0Q29kZSwKICBEZWVzSW5wdXREYXRlcGlja2VyOiAoKSA9PiBEZWVzSW5wdXREYXRlcGlja2VyLAogIERlZXNJbnB1dERyb3Bkb3duOiAoKSA9PiBEZWVzSW5wdXREcm9wZG93biwKICBEZWVzSW5wdXRGaWxldXBsb2FkOiAoKSA9PiBEZWVzSW5wdXRGaWxldXBsb2FkLAogIERlZXNJbnB1dEliYW46ICgpID0+IERlZXNJbnB1dEliYW4sCiAgRGVlc0lucHV0TGlzdDogKCkgPT4gRGVlc0lucHV0TGlzdCwKICBEZWVzSW5wdXRNdWx0aXRvZ2dsZTogKCkgPT4gRGVlc0lucHV0TXVsdGl0b2dnbGUsCiAgRGVlc0lucHV0UGhvbmU6ICgpID0+IERlZXNJbnB1dFBob25lLAogIERlZXNJbnB1dFByb2ZpbGVQaWN0dXJlOiAoKSA9PiBEZWVzSW5wdXRQcm9maWxlUGljdHVyZSwKICBEZWVzSW5wdXRRdWFudGl0eVNlbGVjdG9yOiAoKSA9PiBEZWVzSW5wdXRRdWFudGl0eVNlbGVjdG9yLAogIERlZXNJbnB1dFJhZGlvZ3JvdXA6ICgpID0+IERlZXNJbnB1dFJhZGlvZ3JvdXAsCiAgRGVlc0lucHV0UmljaHRleHQ6ICgpID0+IERlZXNJbnB1dFJpY2h0ZXh0LAogIERlZXNJbnB1dFRhZ3M6ICgpID0+IERlZXNJbnB1dFRhZ3MsCiAgRGVlc0lucHV0VGV4dDogKCkgPT4gRGVlc0lucHV0VGV4dCwKICBEZWVzSW5wdXRUb2dnbGU6ICgpID0+IERlZXNJbnB1dFRvZ2dsZSwKICBEZWVzSW5wdXRUeXBlbGlzdDogKCkgPT4gRGVlc0lucHV0VHlwZWxpc3QsCiAgRGVlc0lucHV0V3lzaXd5ZzogKCkgPT4gRGVlc0lucHV0V3lzaXd5ZywKICBEZWVzTGFiZWw6ICgpID0+IERlZXNMYWJlbCwKICBEZWVzTW9iaWxlbmF2aWdhdGlvbjogKCkgPT4gRGVlc01vYmlsZW5hdmlnYXRpb24sCiAgRGVlc01vZGFsOiAoKSA9PiBEZWVzTW9kYWwsCiAgRGVlc1BhZ2luYXRpb246ICgpID0+IERlZXNQYWdpbmF0aW9uLAogIERlZXNQYW5lbDogKCkgPT4gRGVlc1BhbmVsLAogIERlZXNQZGZWaWV3ZXI6ICgpID0+IERlZXNQZGZWaWV3ZXIsCiAgRGVlc1ByZXZpZXc6ICgpID0+IERlZXNQcmV2aWV3LAogIERlZXNQcm9ncmVzc2JhcjogKCkgPT4gRGVlc1Byb2dyZXNzYmFyLAogIERlZXNTZWFyY2hiYXI6ICgpID0+IERlZXNTZWFyY2hiYXIsCiAgRGVlc1Nob3BwaW5nUHJvZHVjdGNhcmQ6ICgpID0+IERlZXNTaG9wcGluZ1Byb2R1Y3RjYXJkLAogIERlZXNTaW1wbGVBcHBEYXNoOiAoKSA9PiBEZWVzU2ltcGxlQXBwRGFzaCwKICBEZWVzU2ltcGxlTG9naW46ICgpID0+IERlZXNTaW1wbGVMb2dpbiwKICBEZWVzU2xhc2hNZW51OiAoKSA9PiBEZWVzU2xhc2hNZW51LAogIERlZXNTcGVlY2hidWJibGU6ICgpID0+IERlZXNTcGVlY2hidWJibGUsCiAgRGVlc1NwaW5uZXI6ICgpID0+IERlZXNTcGlubmVyLAogIERlZXNTdGF0c0dyaWQ6ICgpID0+IERlZXNTdGF0c0dyaWQsCiAgRGVlc1N0ZXBwZXI6ICgpID0+IERlZXNTdGVwcGVyLAogIERlZXNTdG9yYWdlQnJvd3NlcjogKCkgPT4gRGVlc1N0b3JhZ2VCcm93c2VyLAogIERlZXNTdG9yYWdlQ29sdW1uczogKCkgPT4gRGVlc1N0b3JhZ2VDb2x1bW5zLAogIERlZXNTdG9yYWdlS2V5czogKCkgPT4gRGVlc1N0b3JhZ2VLZXlzLAogIERlZXNTdG9yYWdlUHJldmlldzogKCkgPT4gRGVlc1N0b3JhZ2VQcmV2aWV3LAogIERlZXNUYWJsZTogKCkgPT4gRGVlc1RhYmxlLAogIERlZXNUaGVtZTogKCkgPT4gRGVlc1RoZW1lLAogIERlZXNUaWxlQXVkaW86ICgpID0+IERlZXNUaWxlQXVkaW8sCiAgRGVlc1RpbGVCYXNlOiAoKSA9PiBEZWVzVGlsZUJhc2UsCiAgRGVlc1RpbGVGb2xkZXI6ICgpID0+IERlZXNUaWxlRm9sZGVyLAogIERlZXNUaWxlSW1hZ2U6ICgpID0+IERlZXNUaWxlSW1hZ2UsCiAgRGVlc1RpbGVOb3RlOiAoKSA9PiBEZWVzVGlsZU5vdGUsCiAgRGVlc1RpbGVQZGY6ICgpID0+IERlZXNUaWxlUGRmLAogIERlZXNUaWxlVmlkZW86ICgpID0+IERlZXNUaWxlVmlkZW8sCiAgRGVlc1RvYXN0OiAoKSA9PiBEZWVzVG9hc3QsCiAgRGVlc1VwZGF0ZXI6ICgpID0+IERlZXNVcGRhdGVyLAogIERlZXNWaWRlb1ZpZXdlcjogKCkgPT4gRGVlc1ZpZGVvVmlld2VyLAogIERlZXNXaW5kb3dDb250cm9sczogKCkgPT4gRGVlc1dpbmRvd0NvbnRyb2xzLAogIERlZXNXaW5kb3dMYXllcjogKCkgPT4gRGVlc1dpbmRvd0xheWVyLAogIERlZXNXb3Jrc3BhY2U6ICgpID0+IERlZXNXb3Jrc3BhY2UsCiAgRGVlc1dvcmtzcGFjZUJvdHRvbWJhcjogKCkgPT4gRGVlc1dvcmtzcGFjZUJvdHRvbWJhciwKICBEZWVzV29ya3NwYWNlRGlmZkVkaXRvcjogKCkgPT4gRGVlc1dvcmtzcGFjZURpZmZFZGl0b3IsCiAgRGVlc1dvcmtzcGFjZUZpbGV0cmVlOiAoKSA9PiBEZWVzV29ya3NwYWNlRmlsZXRyZWUsCiAgRGVlc1dvcmtzcGFjZU1hcmtkb3duOiAoKSA9PiBEZWVzV29ya3NwYWNlTWFya2Rvd24sCiAgRGVlc1dvcmtzcGFjZU1hcmtkb3dub3V0bGV0OiAoKSA9PiBEZWVzV29ya3NwYWNlTWFya2Rvd25vdXRsZXQsCiAgRGVlc1dvcmtzcGFjZU1vbmFjbzogKCkgPT4gRGVlc1dvcmtzcGFjZU1vbmFjbywKICBEZWVzV29ya3NwYWNlVGVybWluYWw6ICgpID0+IERlZXNXb3Jrc3BhY2VUZXJtaW5hbCwKICBEZWVzV29ya3NwYWNlVGVybWluYWxQcmV2aWV3OiAoKSA9PiBEZWVzV29ya3NwYWNlVGVybWluYWxQcmV2aWV3LAogIERlZXNXeXNpd3lnQmxvY2s6ICgpID0+IERlZXNXeXNpd3lnQmxvY2ssCiAgUFJPR1JBTU1JTkdfTEFOR1VBR0VTOiAoKSA9PiBQUk9HUkFNTUlOR19MQU5HVUFHRVMsCiAgUGRmTWFuYWdlcjogKCkgPT4gUGRmTWFuYWdlciwKICBQZXJmb3JtYW5jZU1vbml0b3I6ICgpID0+IFBlcmZvcm1hbmNlTW9uaXRvciwKICBUZXJtaW5hbFRhYk1hbmFnZXI6ICgpID0+IFRlcm1pbmFsVGFiTWFuYWdlciwKICBUeXBlU2NyaXB0SW50ZWxsaVNlbnNlTWFuYWdlcjogKCkgPT4gVHlwZVNjcmlwdEludGVsbGlTZW5zZU1hbmFnZXIsCiAgVmlld1JlZ2lzdHJ5OiAoKSA9PiBWaWV3UmVnaXN0cnksCiAgV2ViQ29udGFpbmVyRW52aXJvbm1lbnQ6ICgpID0+IFdlYkNvbnRhaW5lckVudmlyb25tZW50LAogIFd5c2l3eWdCbG9ja09wZXJhdGlvbnM6ICgpID0+IFd5c2l3eWdCbG9ja09wZXJhdGlvbnMsCiAgV3lzaXd5Z0Jsb2NrczogKCkgPT4gV3lzaXd5Z0Jsb2NrcywKICBXeXNpd3lnQ29udmVydGVyczogKCkgPT4gV3lzaXd5Z0NvbnZlcnRlcnMsCiAgV3lzaXd5Z0RyYWdEcm9wSGFuZGxlcjogKCkgPT4gV3lzaXd5Z0RyYWdEcm9wSGFuZGxlciwKICBXeXNpd3lnRm9ybWF0dGluZzogKCkgPT4gV3lzaXd5Z0Zvcm1hdHRpbmcsCiAgV3lzaXd5Z0hpc3Rvcnk6ICgpID0+IFd5c2l3eWdIaXN0b3J5LAogIFd5c2l3eWdJbnB1dEhhbmRsZXI6ICgpID0+IFd5c2l3eWdJbnB1dEhhbmRsZXIsCiAgV3lzaXd5Z0tleWJvYXJkSGFuZGxlcjogKCkgPT4gV3lzaXd5Z0tleWJvYXJkSGFuZGxlciwKICBXeXNpd3lnTW9kYWxNYW5hZ2VyOiAoKSA9PiBXeXNpd3lnTW9kYWxNYW5hZ2VyLAogIFd5c2l3eWdTZWxlY3Rpb246ICgpID0+IFd5c2l3eWdTZWxlY3Rpb24sCiAgV3lzaXd5Z1Nob3J0Y3V0czogKCkgPT4gV3lzaXd5Z1Nob3J0Y3V0cywKICBaSW5kZXhSZWdpc3RyeTogKCkgPT4gWkluZGV4UmVnaXN0cnksCiAgY29sb3JzOiAoKSA9PiBjb2xvcnNfZXhwb3J0cywKICBjb21taXRpbmZvOiAoKSA9PiBjb21taXRpbmZvLAogIGNvbXBvbmVudFpJbmRleDogKCkgPT4gY29tcG9uZW50WkluZGV4LAogIGRlYm91bmNlOiAoKSA9PiBkZWJvdW5jZTMsCiAgZm9ybWF0Q291bnQ6ICgpID0+IGZvcm1hdENvdW50LAogIGZvcm1hdEZpbGVTaXplOiAoKSA9PiBmb3JtYXRGaWxlU2l6ZSwKICBmb3JtYXRTaXplOiAoKSA9PiBmb3JtYXRTaXplLAogIGdldENvbnRlbnRUeXBlOiAoKSA9PiBnZXRDb250ZW50VHlwZSwKICBnZXREZWZhdWx0Q29udGVudDogKCkgPT4gZ2V0RGVmYXVsdENvbnRlbnQsCiAgZ2V0RmlsZU5hbWU6ICgpID0+IGdldEZpbGVOYW1lLAogIGdldFBhcmVudFByZWZpeDogKCkgPT4gZ2V0UGFyZW50UHJlZml4LAogIGdldFBhdGhTZWdtZW50czogKCkgPT4gZ2V0UGF0aFNlZ21lbnRzLAogIGdldFpJbmRleDogKCkgPT4gZ2V0WkluZGV4LAogIGljb25zOiAoKSA9PiBpY29uczQsCiAgaXNJblZpZXdwb3J0OiAoKSA9PiBpc0luVmlld3BvcnQsCiAgcmVnaXN0ZXJBbGxCbG9ja0hhbmRsZXJzOiAoKSA9PiByZWdpc3RlckFsbEJsb2NrSGFuZGxlcnMsCiAgdGhlbWVEZWZhdWx0U3R5bGVzOiAoKSA9PiB0aGVtZURlZmF1bHRTdHlsZXMsCiAgdGhlbWVEZWZhdWx0czogKCkgPT4gdGhlbWVEZWZhdWx0cywKICB0aHJvdHRsZTogKCkgPT4gdGhyb3R0bGUyLAogIHRpbGVCYXNlU3R5bGVzOiAoKSA9PiB0aWxlQmFzZVN0eWxlcywKICB2YWxpZGF0ZU1vdmU6ICgpID0+IHZhbGlkYXRlTW92ZSwKICB3eXNpd3lnU3R5bGVzOiAoKSA9PiB3eXNpd3lnU3R5bGVzLAogIHpJbmRleExheWVyczogKCkgPT4gekluZGV4TGF5ZXJzLAogIHpJbmRleFJlZ2lzdHJ5OiAoKSA9PiB6SW5kZXhSZWdpc3RyeQp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDB6aW5kZXguanMKdmFyIHpJbmRleExheWVycyA9IHsKICAvLyBCYXNlIGxheWVyOiBSZWd1bGFyIGNvbnRlbnQKICBiYXNlOiB7CiAgICBjb250ZW50OiAiYXV0byIsCiAgICBpbnB1dEVsZW1lbnRzOiAxCiAgfSwKICAvLyBGaXhlZCBVSSBlbGVtZW50cwogIGZpeGVkOiB7CiAgICBhcHBCYXI6IDEwLAogICAgc2lkZU1lbnU6IDEwLAogICAgbW9iaWxlTmF2OiAyNTAKICB9LAogIC8vIE92ZXJsYXkgYmFja2Ryb3BzIChzZW1pLXRyYW5zcGFyZW50IGJhY2tncm91bmRzKQogIGJhY2tkcm9wOiB7CiAgICBkcm9wZG93bjogMTk5OSwKICAgIC8vIEJlbG93IG1vZGFscyBidXQgYWJvdmUgZml4ZWQgZWxlbWVudHMKICAgIG1vZGFsOiAyOTk5LAogICAgLy8gQmVsb3cgZHJvcGRvd25zIG9uIG1vZGFscwogICAgY29udGV4dE1lbnU6IDM5OTkKICAgIC8vIEJlbG93IGNyaXRpY2FsIG92ZXJsYXlzCiAgfSwKICAvLyBJbnRlcmFjdGl2ZSBvdmVybGF5cwogIG92ZXJsYXk6IHsKICAgIGRyb3Bkb3duOiAyZTMsCiAgICAvLyBEcm9wZG93bnMgYW5kIHNlbGVjdCBtZW51cwogICAgbW9kYWw6IDNlMywKICAgIC8vIE1vZGFsIGRpYWxvZ3MKICAgIGNvbnRleHRNZW51OiA0ZTMsCiAgICAvLyBDb250ZXh0IG1lbnVzIGFuZCB0b29sdGlwcwogICAgdG9hc3Q6IDVlMwogICAgLy8gVG9hc3Qgbm90aWZpY2F0aW9ucyAoaGlnaGVzdCBwcmlvcml0eSkKICB9LAogIC8vIFNwZWNpYWwgY2FzZXMgZm9yIG5lc3RlZCBlbGVtZW50cwogIG1vZGFsRHJvcGRvd246IDM1MDAsCiAgLy8gRHJvcGRvd25zIGluc2lkZSBtb2RhbHMKICB3eXNpd3lnTWVudXM6IDQ1MDAKICAvLyBFZGl0b3IgZm9ybWF0dGluZyBtZW51cwp9OwpmdW5jdGlvbiBnZXRaSW5kZXgoY2F0ZWdvcnksIHN1YmNhdGVnb3J5KSB7CiAgY29uc3QgY2F0ZWdvcnlPYmogPSB6SW5kZXhMYXllcnNbY2F0ZWdvcnldOwogIGlmICh0eXBlb2YgY2F0ZWdvcnlPYmogPT09ICJvYmplY3QiICYmIHN1YmNhdGVnb3J5KSB7CiAgICByZXR1cm4gY2F0ZWdvcnlPYmpbc3ViY2F0ZWdvcnldIHx8ICJhdXRvIjsKICB9CiAgcmV0dXJuIHR5cGVvZiBjYXRlZ29yeU9iaiA9PT0gIm51bWJlciIgPyBjYXRlZ29yeU9iaiA6ICJhdXRvIjsKfQp2YXIgY29tcG9uZW50WkluZGV4ID0gewogICJkZWVzLW1vZGFsIjogekluZGV4TGF5ZXJzLm92ZXJsYXkubW9kYWwsCiAgImRlZXMtd2luZG93bGF5ZXIiOiB6SW5kZXhMYXllcnMub3ZlcmxheS5kcm9wZG93biwKICAiZGVlcy1jb250ZXh0bWVudSI6IHpJbmRleExheWVycy5vdmVybGF5LmNvbnRleHRNZW51LAogICJkZWVzLXRvYXN0IjogekluZGV4TGF5ZXJzLm92ZXJsYXkudG9hc3QsCiAgImRlZXMtYXBwdWktbWFpbm1lbnUiOiB6SW5kZXhMYXllcnMuZml4ZWQuYXBwQmFyLAogICJkZWVzLW1vYmlsZW5hdmlnYXRpb24iOiB6SW5kZXhMYXllcnMuZml4ZWQubW9iaWxlTmF2LAogICJkZWVzLXNsYXNoLW1lbnUiOiB6SW5kZXhMYXllcnMud3lzaXd5Z01lbnVzLAogICJkZWVzLWZvcm1hdHRpbmctbWVudSI6IHpJbmRleExheWVycy53eXNpd3lnTWVudXMKfTsKdmFyIFpJbmRleFJlZ2lzdHJ5ID0gY2xhc3MgX1pJbmRleFJlZ2lzdHJ5IHsKICBzdGF0aWMgaW5zdGFuY2U7CiAgYWN0aXZlRWxlbWVudHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogIGVsZW1lbnRaSW5kZXhNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTsKICBjdXJyZW50WkluZGV4ID0gMWUzOwogIC8vIFN0YXJ0aW5nIHotaW5kZXgKICBjb25zdHJ1Y3RvcigpIHsKICB9CiAgc3RhdGljIGdldEluc3RhbmNlKCkgewogICAgaWYgKCFfWkluZGV4UmVnaXN0cnkuaW5zdGFuY2UpIHsKICAgICAgX1pJbmRleFJlZ2lzdHJ5Lmluc3RhbmNlID0gbmV3IF9aSW5kZXhSZWdpc3RyeSgpOwogICAgfQogICAgcmV0dXJuIF9aSW5kZXhSZWdpc3RyeS5pbnN0YW5jZTsKICB9CiAgLyoqCiAgICogR2V0IHRoZSBuZXh0IGF2YWlsYWJsZSB6LWluZGV4CiAgICogQHJldHVybnMgVGhlIG5leHQgYXZhaWxhYmxlIHotaW5kZXgKICAgKi8KICBnZXROZXh0WkluZGV4KCkgewogICAgdGhpcy5jdXJyZW50WkluZGV4ICs9IDEwOwogICAgcmV0dXJuIHRoaXMuY3VycmVudFpJbmRleDsKICB9CiAgLyoqCiAgICogUmVnaXN0ZXIgYW4gZWxlbWVudCB3aXRoIHRoZSB6LWluZGV4IHJlZ2lzdHJ5CiAgICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgSFRNTCBlbGVtZW50IHRvIHJlZ2lzdGVyCiAgICogQHBhcmFtIHpJbmRleCAtIFRoZSB6LWluZGV4IGFzc2lnbmVkIHRvIHRoaXMgZWxlbWVudAogICAqLwogIHJlZ2lzdGVyKGVsZW1lbnQ0LCB6SW5kZXgpIHsKICAgIHRoaXMuYWN0aXZlRWxlbWVudHMuYWRkKGVsZW1lbnQ0KTsKICAgIHRoaXMuZWxlbWVudFpJbmRleE1hcC5zZXQoZWxlbWVudDQsIHpJbmRleCk7CiAgfQogIC8qKgogICAqIFVucmVnaXN0ZXIgYW4gZWxlbWVudCBmcm9tIHRoZSB6LWluZGV4IHJlZ2lzdHJ5CiAgICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgSFRNTCBlbGVtZW50IHRvIHVucmVnaXN0ZXIKICAgKi8KICB1bnJlZ2lzdGVyKGVsZW1lbnQ0KSB7CiAgICB0aGlzLmFjdGl2ZUVsZW1lbnRzLmRlbGV0ZShlbGVtZW50NCk7CiAgICB0aGlzLmVsZW1lbnRaSW5kZXhNYXAuZGVsZXRlKGVsZW1lbnQ0KTsKICAgIGlmICh0aGlzLmFjdGl2ZUVsZW1lbnRzLnNpemUgPT09IDApIHsKICAgICAgdGhpcy5jdXJyZW50WkluZGV4ID0gMWUzOwogICAgfQogIH0KICAvKioKICAgKiBHZXQgdGhlIHotaW5kZXggZm9yIGEgc3BlY2lmaWMgZWxlbWVudAogICAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIEhUTUwgZWxlbWVudAogICAqIEByZXR1cm5zIFRoZSB6LWluZGV4IG9yIHVuZGVmaW5lZCBpZiBub3QgcmVnaXN0ZXJlZAogICAqLwogIGdldEVsZW1lbnRaSW5kZXgoZWxlbWVudDQpIHsKICAgIHJldHVybiB0aGlzLmVsZW1lbnRaSW5kZXhNYXAuZ2V0KGVsZW1lbnQ0KTsKICB9CiAgLyoqCiAgICogR2V0IGNvdW50IG9mIGFjdGl2ZSBlbGVtZW50cwogICAqIEByZXR1cm5zIE51bWJlciBvZiBhY3RpdmUgZWxlbWVudHMKICAgKi8KICBnZXRBY3RpdmVDb3VudCgpIHsKICAgIHJldHVybiB0aGlzLmFjdGl2ZUVsZW1lbnRzLnNpemU7CiAgfQogIC8qKgogICAqIEdldCB0aGUgY3VycmVudCBoaWdoZXN0IHotaW5kZXgKICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB6LWluZGV4IHZhbHVlCiAgICovCiAgZ2V0Q3VycmVudFpJbmRleCgpIHsKICAgIHJldHVybiB0aGlzLmN1cnJlbnRaSW5kZXg7CiAgfQogIC8qKgogICAqIENsZWFyIGFsbCByZWdpc3RyYXRpb25zICh1c2VmdWwgZm9yIHRlc3RpbmcpCiAgICovCiAgY2xlYXIoKSB7CiAgICB0aGlzLmFjdGl2ZUVsZW1lbnRzLmNsZWFyKCk7CiAgICB0aGlzLmVsZW1lbnRaSW5kZXhNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTsKICAgIHRoaXMuY3VycmVudFpJbmRleCA9IDFlMzsKICB9CiAgLyoqCiAgICogR2V0IGFsbCBhY3RpdmUgZWxlbWVudHMgaW4gei1pbmRleCBvcmRlcgogICAqIEByZXR1cm5zIEFycmF5IG9mIGVsZW1lbnRzIHNvcnRlZCBieSB6LWluZGV4CiAgICovCiAgZ2V0QWN0aXZlRWxlbWVudHNJbk9yZGVyKCkgewogICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5hY3RpdmVFbGVtZW50cykuc29ydCgoYTUsIGI2KSA9PiB7CiAgICAgIGNvbnN0IGFaID0gdGhpcy5lbGVtZW50WkluZGV4TWFwLmdldChhNSkgfHwgMDsKICAgICAgY29uc3QgYlogPSB0aGlzLmVsZW1lbnRaSW5kZXhNYXAuZ2V0KGI2KSB8fCAwOwogICAgICByZXR1cm4gYVogLSBiWjsKICAgIH0pOwogIH0KfTsKdmFyIHpJbmRleFJlZ2lzdHJ5ID0gWkluZGV4UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDkuMy4wL25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvaW5kZXguanMKdmFyIGRpc3RfdHNfZXhwb3J0czMxID0ge307Cl9fZXhwb3J0KGRpc3RfdHNfZXhwb3J0czMxLCB7CiAgYnVzaW5lc3M6ICgpID0+IGJ1c2luZXNzX2V4cG9ydHMyLAogIGNvZGU6ICgpID0+IGNvZGVfZXhwb3J0czIsCiAgY29udGFpbmVyOiAoKSA9PiBjb250YWluZXJfZXhwb3J0czIsCiAgY29udGVudDogKCkgPT4gY29udGVudF9leHBvcnRzMiwKICBkYXRhYmFzZTogKCkgPT4gZGF0YWJhc2VfZXhwb3J0czIsCiAgZGVzY3JpcHRvcnM6ICgpID0+IGRlc2NyaXB0b3JzX2V4cG9ydHMsCiAgZmluYW5jZTogKCkgPT4gZmluYW5jZV9leHBvcnRzMiwKICBnZW5lcmFsOiAoKSA9PiBnZW5lcmFsX2V4cG9ydHMyLAogIG5ldHdvcms6ICgpID0+IG5ldHdvcmtfZXhwb3J0czIsCiAgc2FhczogKCkgPT4gc2Fhc19leHBvcnRzMiwKICBzdG9yYWdlOiAoKSA9PiBzdG9yYWdlX2V4cG9ydHMyLAogIHdlYnNpdGU6ICgpID0+IHdlYnNpdGVfZXhwb3J0czIKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A5LjMuMC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2J1c2luZXNzL2luZGV4LmpzCnZhciBidXNpbmVzc19leHBvcnRzMiA9IHt9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NAOS4zLjAvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9kYXRhYmFzZS9pbmRleC5qcwp2YXIgZGF0YWJhc2VfZXhwb3J0czIgPSB7fTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDkuMy4wL25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZmluYW5jZS9pbmRleC5qcwp2YXIgZmluYW5jZV9leHBvcnRzMiA9IHt9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NAOS4zLjAvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9jb2RlL2luZGV4LmpzCnZhciBjb2RlX2V4cG9ydHMyID0ge307CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A5LjMuMC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvbnRhaW5lci9pbmRleC5qcwp2YXIgY29udGFpbmVyX2V4cG9ydHMyID0ge307CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A5LjMuMC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2Rlc2NyaXB0b3JzL2luZGV4LmpzCnZhciBkZXNjcmlwdG9yc19leHBvcnRzID0ge307CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A5LjMuMC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL2NvbnRlbnQvaW5kZXguanMKdmFyIGNvbnRlbnRfZXhwb3J0czIgPSB7fTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDkuMy4wL25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvZ2VuZXJhbC9pbmRleC5qcwp2YXIgZ2VuZXJhbF9leHBvcnRzMiA9IHt9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NAOS4zLjAvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy9uZXR3b3JrL2luZGV4LmpzCnZhciBuZXR3b3JrX2V4cG9ydHMyID0ge307Cl9fZXhwb3J0KG5ldHdvcmtfZXhwb3J0czIsIHsKICBJQ25hbWVEZXNjcmlwdG9yOiAoKSA9PiBJQ25hbWVEZXNjcmlwdG9yMgp9KTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDkuMy4wL25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvbmV0d29yay9jbmFtZS5qcwp2YXIgSUNuYW1lRGVzY3JpcHRvcjIgPSBjbGFzcyB7Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHRzY2xhc3MrdHNjbGFzc0A5LjMuMC9ub2RlX21vZHVsZXMvQHRzY2xhc3MvdHNjbGFzcy9kaXN0X3RzL3NhYXMvaW5kZXguanMKdmFyIHNhYXNfZXhwb3J0czIgPSB7fTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AdHNjbGFzcyt0c2NsYXNzQDkuMy4wL25vZGVfbW9kdWxlcy9AdHNjbGFzcy90c2NsYXNzL2Rpc3RfdHMvc3RvcmFnZS9pbmRleC5qcwp2YXIgc3RvcmFnZV9leHBvcnRzMiA9IHt9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0B0c2NsYXNzK3RzY2xhc3NAOS4zLjAvbm9kZV9tb2R1bGVzL0B0c2NsYXNzL3RzY2xhc3MvZGlzdF90cy93ZWJzaXRlL2luZGV4LmpzCnZhciB3ZWJzaXRlX2V4cG9ydHMyID0ge307CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwcGx1Z2lucy5qcwppbml0X2Rpc3RfdHMoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1vdmVybGF5L2RlZXMtY29udGV4dG1lbnUvZGVlcy1jb250ZXh0bWVudS5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkZW1vRnVuYyA9ICgpID0+IGIyYAo8c3R5bGU+CiAgLndpdGhNYXJnaW4gewogICAgZGlzcGxheTogYmxvY2s7CiAgICBtYXJnaW46IDIwcHg7CiAgfQogIC5kZW1vLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMjBweDsKICAgIHBhZGRpbmc6IDIwcHg7CiAgICBtaW4taGVpZ2h0OiA0MDBweDsKICB9CiAgLmRlbW8tYXJlYSB7CiAgICBwYWRkaW5nOiA0MHB4OwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgY3Vyc29yOiBjb250ZXh0LW1lbnU7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnM7CiAgfQogIC5kZW1vLWFyZWE6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjAyKTsKICB9Cjwvc3R5bGU+CjxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICA8ZGVlcy1wYW5lbCBoZWFkaW5nPSJCYXNpYyBDb250ZXh0IE1lbnUgd2l0aCBOZXN0ZWQgU3VibWVudXMiPgogICAgPGRpdiBjbGFzcz0iZGVtby1hcmVhIiBAY29udGV4dG1lbnU9JHsoZXZlbnRBcmcpID0+IHsKICBEZWVzQ29udGV4dG1lbnUub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZXZlbnRBcmcsIFsKICAgIHsKICAgICAgbmFtZTogIkZpbGUiLAogICAgICBpY29uTmFtZTogImZpbGVUZXh0IiwKICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgIH0sCiAgICAgIC8vIFBhcmVudCBpdGVtcyB3aXRoIHN1Ym1lbnVzIHN0aWxsIG5lZWQgYW4gYWN0aW9uCiAgICAgIHN1Ym1lbnU6IFsKICAgICAgICB7IG5hbWU6ICJOZXciLCBpY29uTmFtZTogImZpbGVQbHVzIiwgc2hvcnRjdXQ6ICJDbWQrTiIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIk5ldyBmaWxlIikgfSwKICAgICAgICB7IG5hbWU6ICJPcGVuIiwgaWNvbk5hbWU6ICJmb2xkZXJPcGVuIiwgc2hvcnRjdXQ6ICJDbWQrTyIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIk9wZW4gZmlsZSIpIH0sCiAgICAgICAgeyBuYW1lOiAiU2F2ZSIsIGljb25OYW1lOiAic2F2ZSIsIHNob3J0Y3V0OiAiQ21kK1MiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJTYXZlIikgfSwKICAgICAgICB7IGRpdmlkZXI6IHRydWUgfSwKICAgICAgICB7IG5hbWU6ICJFeHBvcnQgYXMgUERGIiwgaWNvbk5hbWU6ICJkb3dubG9hZCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkV4cG9ydCBQREYiKSB9LAogICAgICAgIHsgbmFtZTogIkV4cG9ydCBhcyBIVE1MIiwgaWNvbk5hbWU6ICJjb2RlIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiRXhwb3J0IEhUTUwiKSB9CiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJFZGl0IiwKICAgICAgaWNvbk5hbWU6ICJlZGl0MyIsCiAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICB9LAogICAgICAvLyBQYXJlbnQgaXRlbXMgd2l0aCBzdWJtZW51cyBzdGlsbCBuZWVkIGFuIGFjdGlvbgogICAgICBzdWJtZW51OiBbCiAgICAgICAgeyBuYW1lOiAiQ3V0IiwgaWNvbk5hbWU6ICJzY2lzc29ycyIsIHNob3J0Y3V0OiAiQ21kK1giLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJDdXQiKSB9LAogICAgICAgIHsgbmFtZTogIkNvcHkiLCBpY29uTmFtZTogImNvcHkiLCBzaG9ydGN1dDogIkNtZCtDIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiQ29weSIpIH0sCiAgICAgICAgeyBuYW1lOiAiUGFzdGUiLCBpY29uTmFtZTogImNsaXBib2FyZCIsIHNob3J0Y3V0OiAiQ21kK1YiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJQYXN0ZSIpIH0sCiAgICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgeyBuYW1lOiAiRmluZCIsIGljb25OYW1lOiAic2VhcmNoIiwgc2hvcnRjdXQ6ICJDbWQrRiIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkZpbmQiKSB9LAogICAgICAgIHsgbmFtZTogIlJlcGxhY2UiLCBpY29uTmFtZTogInJlcGVhdCIsIHNob3J0Y3V0OiAiQ21kK0giLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJSZXBsYWNlIikgfQogICAgICBdCiAgICB9LAogICAgewogICAgICBuYW1lOiAiVmlldyIsCiAgICAgIGljb25OYW1lOiAiZXllIiwKICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgIH0sCiAgICAgIC8vIFBhcmVudCBpdGVtcyB3aXRoIHN1Ym1lbnVzIHN0aWxsIG5lZWQgYW4gYWN0aW9uCiAgICAgIHN1Ym1lbnU6IFsKICAgICAgICB7IG5hbWU6ICJab29tIEluIiwgaWNvbk5hbWU6ICJ6b29tSW4iLCBzaG9ydGN1dDogIkNtZCsrIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiWm9vbSBpbiIpIH0sCiAgICAgICAgeyBuYW1lOiAiWm9vbSBPdXQiLCBpY29uTmFtZTogInpvb21PdXQiLCBzaG9ydGN1dDogIkNtZCstIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiWm9vbSBvdXQiKSB9LAogICAgICAgIHsgbmFtZTogIlJlc2V0IFpvb20iLCBpY29uTmFtZTogIm1heGltaXplMiIsIHNob3J0Y3V0OiAiQ21kKzAiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJSZXNldCB6b29tIikgfSwKICAgICAgICB7IGRpdmlkZXI6IHRydWUgfSwKICAgICAgICB7IG5hbWU6ICJGdWxsIFNjcmVlbiIsIGljb25OYW1lOiAibWF4aW1pemUiLCBzaG9ydGN1dDogIkYxMSIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkZ1bGwgc2NyZWVuIikgfQogICAgICBdCiAgICB9LAogICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICB7CiAgICAgIG5hbWU6ICJTZXR0aW5ncyIsCiAgICAgIGljb25OYW1lOiAic2V0dGluZ3MiLAogICAgICBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJTZXR0aW5ncyIpCiAgICB9LAogICAgewogICAgICBuYW1lOiAiSGVscCIsCiAgICAgIGljb25OYW1lOiAiaGVscENpcmNsZSIsCiAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICB9LAogICAgICAvLyBQYXJlbnQgaXRlbXMgd2l0aCBzdWJtZW51cyBzdGlsbCBuZWVkIGFuIGFjdGlvbgogICAgICBzdWJtZW51OiBbCiAgICAgICAgeyBuYW1lOiAiRG9jdW1lbnRhdGlvbiIsIGljb25OYW1lOiAiYm9vayIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkRvY3VtZW50YXRpb24iKSB9LAogICAgICAgIHsgbmFtZTogIktleWJvYXJkIFNob3J0Y3V0cyIsIGljb25OYW1lOiAia2V5Ym9hcmQiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJTaG9ydGN1dHMiKSB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsgbmFtZTogIkFib3V0IiwgaWNvbk5hbWU6ICJpbmZvIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiQWJvdXQiKSB9CiAgICAgIF0KICAgIH0KICBdKTsKfX0+CiAgICAgIDxoMz5SaWdodC1jbGljayBhbnl3aGVyZSBpbiB0aGlzIGFyZWE8L2gzPgogICAgICA8cD5BIGNvbnRleHQgbWVudSB3aXRoIG5lc3RlZCBzdWJtZW51cyB3aWxsIGFwcGVhcjwvcD4KICAgIDwvZGl2PgogIDwvZGVlcy1wYW5lbD4KICA8ZGVlcy1wYW5lbCBoZWFkaW5nPSJDb21wb25lbnQtU3BlY2lmaWMgQ29udGV4dCBNZW51Ij4KICAgIDxkZWVzLWJ1dHRvbiBzdHlsZT0ibWFyZ2luOiAyMHB4OyIgQGNvbnRleHRtZW51PSR7KGV2ZW50QXJnKSA9PiB7CiAgRGVlc0NvbnRleHRtZW51Lm9wZW5Db250ZXh0TWVudVdpdGhPcHRpb25zKGV2ZW50QXJnLCBbCiAgICB7CiAgICAgIG5hbWU6ICJCdXR0b24gQWN0aW9ucyIsCiAgICAgIGljb25OYW1lOiAibW91c2VQb2ludGVyIiwKICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgIH0sCiAgICAgIC8vIFBhcmVudCBpdGVtcyB3aXRoIHN1Ym1lbnVzIHN0aWxsIG5lZWQgYW4gYWN0aW9uCiAgICAgIHN1Ym1lbnU6IFsKICAgICAgICB7IG5hbWU6ICJDbGljayIsIGljb25OYW1lOiAibW91c2UiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJDbGljayBhY3Rpb24iKSB9LAogICAgICAgIHsgbmFtZTogIkRvdWJsZSBDbGljayIsIGljb25OYW1lOiAiemFwIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiRG91YmxlIGNsaWNrIikgfSwKICAgICAgICB7IG5hbWU6ICJMb25nIFByZXNzIiwgaWNvbk5hbWU6ICJjbG9jayIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkxvbmcgcHJlc3MiKSB9CiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJCdXR0b24gU3RhdGUiLAogICAgICBpY29uTmFtZTogInRvZ2dsZUxlZnQiLAogICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgfSwKICAgICAgLy8gUGFyZW50IGl0ZW1zIHdpdGggc3VibWVudXMgc3RpbGwgbmVlZCBhbiBhY3Rpb24KICAgICAgc3VibWVudTogWwogICAgICAgIHsgbmFtZTogIkVuYWJsZSIsIGljb25OYW1lOiAiY2hlY2tDaXJjbGUiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJFbmFibGUiKSB9LAogICAgICAgIHsgbmFtZTogIkRpc2FibGUiLCBpY29uTmFtZTogInhDaXJjbGUiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJEaXNhYmxlIikgfSwKICAgICAgICB7IGRpdmlkZXI6IHRydWUgfSwKICAgICAgICB7IG5hbWU6ICJTaG93IiwgaWNvbk5hbWU6ICJleWUiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJTaG93IikgfSwKICAgICAgICB7IG5hbWU6ICJIaWRlIiwgaWNvbk5hbWU6ICJleWVPZmYiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJIaWRlIikgfQogICAgICBdCiAgICB9LAogICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICB7CiAgICAgIG5hbWU6ICJEaXNhYmxlZCBBY3Rpb24iLAogICAgICBpY29uTmFtZTogImJhbiIsCiAgICAgIGRpc2FibGVkOiB0cnVlLAogICAgICBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJUaGlzIHNob3VsZCBub3QgcnVuIikKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJQcm9wZXJ0aWVzIiwKICAgICAgaWNvbk5hbWU6ICJzZXR0aW5ncyIsCiAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkJ1dHRvbiBwcm9wZXJ0aWVzIikKICAgIH0KICBdKTsKfX0+UmlnaHQtY2xpY2sgb24gdGhpcyBidXR0b248L2RlZXMtYnV0dG9uPgogIDwvZGVlcy1wYW5lbD4KCiAgPGRlZXMtcGFuZWwgaGVhZGluZz0iQWR2YW5jZWQgQ29udGV4dCBNZW51IEV4YW1wbGUiPgogICAgPGRpdiBjbGFzcz0iZGVtby1hcmVhIiBAY29udGV4dG1lbnU9JHsoZXZlbnRBcmcpID0+IHsKICBEZWVzQ29udGV4dG1lbnUub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZXZlbnRBcmcsIFsKICAgIHsKICAgICAgbmFtZTogIkZvcm1hdCIsCiAgICAgIGljb25OYW1lOiAidHlwZSIsCiAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICB9LAogICAgICAvLyBQYXJlbnQgaXRlbXMgd2l0aCBzdWJtZW51cyBzdGlsbCBuZWVkIGFuIGFjdGlvbgogICAgICBzdWJtZW51OiBbCiAgICAgICAgeyBuYW1lOiAiQm9sZCIsIGljb25OYW1lOiAiYm9sZCIsIHNob3J0Y3V0OiAiQ21kK0IiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJCb2xkIikgfSwKICAgICAgICB7IG5hbWU6ICJJdGFsaWMiLCBpY29uTmFtZTogIml0YWxpYyIsIHNob3J0Y3V0OiAiQ21kK0kiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJJdGFsaWMiKSB9LAogICAgICAgIHsgbmFtZTogIlVuZGVybGluZSIsIGljb25OYW1lOiAidW5kZXJsaW5lIiwgc2hvcnRjdXQ6ICJDbWQrVSIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlVuZGVybGluZSIpIH0sCiAgICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgeyBuYW1lOiAiRm9udCBTaXplIiwgaWNvbk5hbWU6ICJ0eXBlIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiRm9udCBzaXplIG1lbnUiKSB9LAogICAgICAgIHsgbmFtZTogIkZvbnQgQ29sb3IiLCBpY29uTmFtZTogInBhbGV0dGUiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJGb250IGNvbG9yIG1lbnUiKSB9CiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJUcmFuc2Zvcm0iLAogICAgICBpY29uTmFtZTogInNodWZmbGUiLAogICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgfSwKICAgICAgLy8gUGFyZW50IGl0ZW1zIHdpdGggc3VibWVudXMgc3RpbGwgbmVlZCBhbiBhY3Rpb24KICAgICAgc3VibWVudTogWwogICAgICAgIHsgbmFtZTogIlRvIFVwcGVyY2FzZSIsIGljb25OYW1lOiAiYXJyb3dVcCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlVwcGVyY2FzZSIpIH0sCiAgICAgICAgeyBuYW1lOiAiVG8gTG93ZXJjYXNlIiwgaWNvbk5hbWU6ICJhcnJvd0Rvd24iLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJMb3dlcmNhc2UiKSB9LAogICAgICAgIHsgbmFtZTogIkNhcGl0YWxpemUiLCBpY29uTmFtZTogInR5cGUiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJDYXBpdGFsaXplIikgfQogICAgICBdCiAgICB9LAogICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICB7CiAgICAgIG5hbWU6ICJEZWxldGUiLAogICAgICBpY29uTmFtZTogInRyYXNoMiIsCiAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkRlbGV0ZSIpCiAgICB9CiAgXSk7Cn19PgogICAgICA8aDM+QWR2YW5jZWQgTmVzdGVkIE1lbnUgRXhhbXBsZTwvaDM+CiAgICAgIDxwPlRoaXMgc2hvd3MgZGVlcGx5IG5lc3RlZCBzdWJtZW51cyBhbmQgdmFyaW91cyBmb3JtYXR0aW5nIG9wdGlvbnM8L3A+CiAgICA8L2Rpdj4KICA8L2RlZXMtcGFuZWw+CiAgCiAgPGRlZXMtcGFuZWwgaGVhZGluZz0iU3RhdGljIENvbnRleHQgTWVudSAoQWx3YXlzIFZpc2libGUpIj4KICAgIDxkZWVzLWNvbnRleHRtZW51CiAgICAgIGNsYXNzPSJ3aXRoTWFyZ2luIgogICAgICAubWVudUl0ZW1zPSR7WwogIHsKICAgIG5hbWU6ICJQcm9qZWN0IiwKICAgIGljb25OYW1lOiAiZm9sZGVyIiwKICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgfSwKICAgIC8vIFBhcmVudCBpdGVtcyB3aXRoIHN1Ym1lbnVzIHN0aWxsIG5lZWQgYW4gYWN0aW9uCiAgICBzdWJtZW51OiBbCiAgICAgIHsgbmFtZTogIk5ldyBQcm9qZWN0IiwgaWNvbk5hbWU6ICJmb2xkZXJQbHVzIiwgc2hvcnRjdXQ6ICJDbWQrU2hpZnQrTiIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIk5ldyBwcm9qZWN0IikgfSwKICAgICAgeyBuYW1lOiAiT3BlbiBQcm9qZWN0IiwgaWNvbk5hbWU6ICJmb2xkZXJPcGVuIiwgc2hvcnRjdXQ6ICJDbWQrU2hpZnQrTyIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIk9wZW4gcHJvamVjdCIpIH0sCiAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICB7IG5hbWU6ICJSZWNlbnQgUHJvamVjdHMiLCBpY29uTmFtZTogImNsb2NrIiwgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgIH0sIHN1Ym1lbnU6IFsKICAgICAgICB7IG5hbWU6ICJQcm9qZWN0IEFscGhhIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiT3BlbiBBbHBoYSIpIH0sCiAgICAgICAgeyBuYW1lOiAiUHJvamVjdCBCZXRhIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiT3BlbiBCZXRhIikgfSwKICAgICAgICB7IG5hbWU6ICJQcm9qZWN0IEdhbW1hIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiT3BlbiBHYW1tYSIpIH0KICAgICAgXSB9CiAgICBdCiAgfSwKICB7CiAgICBuYW1lOiAiVG9vbHMiLAogICAgaWNvbk5hbWU6ICJ0b29sIiwKICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgfSwKICAgIC8vIFBhcmVudCBpdGVtcyB3aXRoIHN1Ym1lbnVzIHN0aWxsIG5lZWQgYW4gYWN0aW9uCiAgICBzdWJtZW51OiBbCiAgICAgIHsgbmFtZTogIlRlcm1pbmFsIiwgaWNvbk5hbWU6ICJ0ZXJtaW5hbCIsIHNob3J0Y3V0OiAiQ21kK1QiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJUZXJtaW5hbCIpIH0sCiAgICAgIHsgbmFtZTogIkNvbnNvbGUiLCBpY29uTmFtZTogIm1vbml0b3IiLCBzaG9ydGN1dDogIkNtZCtLIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiQ29uc29sZSIpIH0sCiAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICB7IG5hbWU6ICJFeHRlbnNpb25zIiwgaWNvbk5hbWU6ICJwYWNrYWdlIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiRXh0ZW5zaW9ucyIpIH0KICAgIF0KICB9LAogIHsgZGl2aWRlcjogdHJ1ZSB9LAogIHsKICAgIG5hbWU6ICJQcmVmZXJlbmNlcyIsCiAgICBpY29uTmFtZTogInNsaWRlcnMiLAogICAgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiUHJlZmVyZW5jZXMiKQogIH0KXX0KICAgID48L2RlZXMtY29udGV4dG1lbnU+CiAgPC9kZWVzLXBhbmVsPgo8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1vdmVybGF5L2RlZXMtd2luZG93bGF5ZXIvZGVlcy13aW5kb3dsYXllci5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgX19lc0RlY29yYXRlMyA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1dpbmRvd0xheWVyID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLXdpbmRvd2xheWVyIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfb3B0aW9uc19kZWNvcmF0b3JzOwogIGxldCBfb3B0aW9uc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX29wdGlvbnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2JhY2tkcm9wWkluZGV4X2RlY29yYXRvcnM7CiAgbGV0IF9iYWNrZHJvcFpJbmRleF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2JhY2tkcm9wWkluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZW50WkluZGV4X2RlY29yYXRvcnM7CiAgbGV0IF9jb250ZW50WkluZGV4X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29udGVudFpJbmRleF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmlzaWJsZV9kZWNvcmF0b3JzOwogIGxldCBfdmlzaWJsZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Zpc2libGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1dpbmRvd0xheWVyMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX29wdGlvbnNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2JhY2tkcm9wWkluZGV4X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9jb250ZW50WkluZGV4X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF92aXNpYmxlX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEJvb2xlYW4KICAgICAgfSldOwogICAgICBfX2VzRGVjb3JhdGUzKHRoaXMsIG51bGwsIF9vcHRpb25zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm9wdGlvbnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm9wdGlvbnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoub3B0aW9ucywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoub3B0aW9ucyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9vcHRpb25zX2luaXRpYWxpemVycywgX29wdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzKHRoaXMsIG51bGwsIF9iYWNrZHJvcFpJbmRleF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJiYWNrZHJvcFpJbmRleCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYmFja2Ryb3BaSW5kZXgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYmFja2Ryb3BaSW5kZXgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmJhY2tkcm9wWkluZGV4ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2JhY2tkcm9wWkluZGV4X2luaXRpYWxpemVycywgX2JhY2tkcm9wWkluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMyh0aGlzLCBudWxsLCBfY29udGVudFpJbmRleF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb250ZW50WkluZGV4Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb250ZW50WkluZGV4IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNvbnRlbnRaSW5kZXgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvbnRlbnRaSW5kZXggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29udGVudFpJbmRleF9pbml0aWFsaXplcnMsIF9jb250ZW50WkluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMyh0aGlzLCBudWxsLCBfdmlzaWJsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2aXNpYmxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ2aXNpYmxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZpc2libGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZpc2libGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdmlzaWJsZV9pbml0aWFsaXplcnMsIF92aXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMyhudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNXaW5kb3dMYXllcjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgLy8gU1RBVElDCiAgICBzdGF0aWMgZGVtbyA9ICgpID0+IGIyYDxkZWVzLXdpbmRvd2xheWVyPjwvZGVlcy13aW5kb3dsYXllcj5gOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIk92ZXJsYXkiXTsKICAgIHN0YXRpYyBhc3luYyBjcmVhdGVBbmRTaG93KG9wdGlvbnNBcmcpIHsKICAgICAgY29uc3QgZG9tdG9vbHNJbnN0YW5jZSA9IGRpc3RfdHNfZXhwb3J0czI5LkRvbVRvb2xzLmdldEdsb2JhbERvbVRvb2xzU3luYygpOwogICAgICBjb25zdCB3aW5kb3dMYXllciA9IG5ldyBEZWVzV2luZG93TGF5ZXIyKCk7CiAgICAgIHdpbmRvd0xheWVyLm9wdGlvbnMgPSB7CiAgICAgICAgLi4ud2luZG93TGF5ZXIub3B0aW9ucywKICAgICAgICAuLi5vcHRpb25zQXJnCiAgICAgIH07CiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHdpbmRvd0xheWVyKTsKICAgICAgYXdhaXQgZG9tdG9vbHNJbnN0YW5jZS5jb252ZW5pZW5jZS5zbWFydGRlbGF5LmRlbGF5Rm9yKDApOwogICAgICB3aW5kb3dMYXllci5zaG93KCk7CiAgICAgIHJldHVybiB3aW5kb3dMYXllcjsKICAgIH0KICAgICNvcHRpb25zX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczQodGhpcywgX29wdGlvbnNfaW5pdGlhbGl6ZXJzLCB7CiAgICAgIGJsdXI6IGZhbHNlCiAgICB9KTsKICAgIGdldCBvcHRpb25zKCkgewogICAgICByZXR1cm4gdGhpcy4jb3B0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG9wdGlvbnModmFsdWUyKSB7CiAgICAgIHRoaXMuI29wdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNiYWNrZHJvcFpJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNCh0aGlzLCBfb3B0aW9uc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNCh0aGlzLCBfYmFja2Ryb3BaSW5kZXhfaW5pdGlhbGl6ZXJzLCAxZTMpKTsKICAgIGdldCBiYWNrZHJvcFpJbmRleCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2JhY2tkcm9wWkluZGV4X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYmFja2Ryb3BaSW5kZXgodmFsdWUyKSB7CiAgICAgIHRoaXMuI2JhY2tkcm9wWkluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29udGVudFpJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNCh0aGlzLCBfYmFja2Ryb3BaSW5kZXhfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQodGhpcywgX2NvbnRlbnRaSW5kZXhfaW5pdGlhbGl6ZXJzLCAxMDAxKSk7CiAgICBnZXQgY29udGVudFpJbmRleCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvbnRlbnRaSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjb250ZW50WkluZGV4KHZhbHVlMikgewogICAgICB0aGlzLiNjb250ZW50WkluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNCh0aGlzLCBfY29udGVudFpJbmRleF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNCh0aGlzLCBfdmlzaWJsZV9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IHZpc2libGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2aXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdmlzaWJsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNCh0aGlzLCBfdmlzaWJsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIGRpc3RfdHNfZXhwb3J0czI5LmVsZW1lbnRCYXNpYy5zZXR1cCgpOwogICAgfQogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgICR7ZGlzdF90c19leHBvcnRzMjkuZWxlbWVudEJhc2ljLnN0eWxlc30KICAgICAgPHN0eWxlPgogICAgICAgIC53aW5kb3dPdmVybGF5IHsKICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzOwogICAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICAgIHRvcDogMHB4OwogICAgICAgICAgbGVmdDogMHB4OwogICAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICAgIHdpZHRoOiAxMDB2dzsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMCk7CiAgICAgICAgICBiYWNrZHJvcC1maWx0ZXI6IGJyaWdodG5lc3MoMSkgJHt0aGlzLm9wdGlvbnMuYmx1ciA/ICJibHVyKDBweCkiIDogIiJ9OwogICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgICB6LWluZGV4OiAke3RoaXMuYmFja2Ryb3BaSW5kZXh9OwogICAgICAgIH0KICAgICAgICAuc2xvdENvbnRlbnQgewogICAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICAgIHdpZHRoOiAxMDB2dzsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICB6LWluZGV4OiAke3RoaXMuY29udGVudFpJbmRleH07CiAgICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnNsb3RDb250ZW50ID4gKiB7CiAgICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnZpc2libGUgewogICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgICAgICAgYmFja2Ryb3AtZmlsdGVyOiBicmlnaHRuZXNzKDAuOSkgJHt0aGlzLm9wdGlvbnMuYmx1ciA/ICJibHVyKDJweCkiIDogIiJ9OwogICAgICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDsKICAgICAgICB9CiAgICAgIDwvc3R5bGU+CiAgICAgIDxkaXYgQGNsaWNrPSR7dGhpcy5kaXNwYXRjaENsaWNrZWR9IGNsYXNzPSJ3aW5kb3dPdmVybGF5ICR7dGhpcy52aXNpYmxlID8gInZpc2libGUiIDogbnVsbH0iPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2xvdENvbnRlbnQiPgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgZmlyc3RVcGRhdGVkKCkgewogICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlOwogICAgICB9LCAxMDApOwogICAgfQogICAgZGlzcGF0Y2hDbGlja2VkKCkgewogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjbGlja2VkIikpOwogICAgfQogICAgdG9nZ2xlVmlzaWJpbGl0eSgpIHsKICAgICAgdGhpcy52aXNpYmxlID0gIXRoaXMudmlzaWJsZTsKICAgIH0KICAgIGdldENvbnRlbnRaSW5kZXgoKSB7CiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRaSW5kZXg7CiAgICB9CiAgICBhc3luYyBzaG93KCkgewogICAgICBjb25zdCBkb210b29scyA9IGF3YWl0IHRoaXMuZG9tdG9vbHNQcm9taXNlOwogICAgICB0aGlzLmJhY2tkcm9wWkluZGV4ID0gekluZGV4UmVnaXN0cnkuZ2V0TmV4dFpJbmRleCgpOwogICAgICB0aGlzLmNvbnRlbnRaSW5kZXggPSB6SW5kZXhSZWdpc3RyeS5nZXROZXh0WkluZGV4KCk7CiAgICAgIHpJbmRleFJlZ2lzdHJ5LnJlZ2lzdGVyKHRoaXMsIHRoaXMuYmFja2Ryb3BaSW5kZXgpOwogICAgICBhd2FpdCBkb210b29scy5jb252ZW5pZW5jZS5zbWFydGRlbGF5LmRlbGF5Rm9yKDApOwogICAgICB0aGlzLnZpc2libGUgPSB0cnVlOwogICAgfQogICAgYXN5bmMgaGlkZSgpIHsKICAgICAgY29uc3QgZG9tdG9vbHMgPSBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgYXdhaXQgZG9tdG9vbHMuY29udmVuaWVuY2Uuc21hcnRkZWxheS5kZWxheUZvcigwKTsKICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7CiAgICB9CiAgICBhc3luYyBkZXN0cm95KCkgewogICAgICBjb25zdCBkb210b29scyA9IGF3YWl0IHRoaXMuZG9tdG9vbHNQcm9taXNlOwogICAgICBhd2FpdCB0aGlzLmhpZGUoKTsKICAgICAgYXdhaXQgZG9tdG9vbHMuY29udmVuaWVuY2Uuc21hcnRkZWxheS5kZWxheUZvcigzMDApOwogICAgICB6SW5kZXhSZWdpc3RyeS51bnJlZ2lzdGVyKHRoaXMpOwogICAgICB0aGlzLnJlbW92ZSgpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM0KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzV2luZG93TGF5ZXIyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1vdmVybGF5L2RlZXMtY29udGV4dG1lbnUvZGVlcy1jb250ZXh0bWVudS5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2Rpc3RfdHMyOSgpOwppbml0X2RlZXNfaWNvbigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU1ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM2ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzQ29udGV4dG1lbnUgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtY29udGV4dG1lbnUiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9tZW51SXRlbXNfZGVjb3JhdG9yczsKICBsZXQgX21lbnVJdGVtc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21lbnVJdGVtc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzQ29udGV4dG1lbnU1ID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfbWVudUl0ZW1zX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEFycmF5CiAgICAgIH0pXTsKICAgICAgX19lc0RlY29yYXRlNSh0aGlzLCBudWxsLCBfbWVudUl0ZW1zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1lbnVJdGVtcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWVudUl0ZW1zIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1lbnVJdGVtcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWVudUl0ZW1zID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21lbnVJdGVtc19pbml0aWFsaXplcnMsIF9tZW51SXRlbXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0NvbnRleHRtZW51NSA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAvLyBERU1PCiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIk92ZXJsYXkiXTsKICAgIC8vIFNUQVRJQwogICAgLy8gVGhpcyB3aWxsIHN0b3JlIGFsbCB0aGUgYWNjdW11bGF0ZWQgbWVudSBpdGVtcwogICAgc3RhdGljIGNvbnRleHRNZW51RGVhY3RpdmF0ZWQgPSBmYWxzZTsKICAgIHN0YXRpYyBhY2N1bXVsYXRlZE1lbnVJdGVtcyA9IFtdOwogICAgLy8gQWRkIGEgZ2xvYmFsIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgcmlnaHQtY2xpY2sgY29udGV4dCBtZW51CiAgICBzdGF0aWMgaW5pdGlhbGl6ZUdsb2JhbExpc3RlbmVyKCkgewogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsIChldmVudCkgPT4gewogICAgICAgIGlmICh0aGlzLmNvbnRleHRNZW51RGVhY3RpdmF0ZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICBEZWVzQ29udGV4dG1lbnU1LmFjY3VtdWxhdGVkTWVudUl0ZW1zID0gW107CiAgICAgICAgY29uc3QgcGF0aDIgPSBldmVudC5jb21wb3NlZFBhdGgoKTsKICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQ0IG9mIHBhdGgyKSB7CiAgICAgICAgICBpZiAoZWxlbWVudDQuZ2V0Q29udGV4dE1lbnVJdGVtcykgewogICAgICAgICAgICBjb25zdCBpdGVtcyA9IGVsZW1lbnQ0LmdldENvbnRleHRNZW51SXRlbXMoKTsKICAgICAgICAgICAgaWYgKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICBpZiAoRGVlc0NvbnRleHRtZW51NS5hY2N1bXVsYXRlZE1lbnVJdGVtcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBEZWVzQ29udGV4dG1lbnU1LmFjY3VtdWxhdGVkTWVudUl0ZW1zLnB1c2goeyBkaXZpZGVyOiB0cnVlIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBEZWVzQ29udGV4dG1lbnU1LmFjY3VtdWxhdGVkTWVudUl0ZW1zLnB1c2goLi4uaXRlbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIERlZXNDb250ZXh0bWVudTUub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZXZlbnQsIERlZXNDb250ZXh0bWVudTUuYWNjdW11bGF0ZWRNZW51SXRlbXMpOwogICAgICB9KTsKICAgIH0KICAgIC8vIGFsbG93cyBvcGVuaW5nIG9mIGEgY29udGV4dG1lbnUgd2l0aCBvcHRpb25zCiAgICBzdGF0aWMgYXN5bmMgb3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZXZlbnRBcmcsIG1lbnVJdGVtc0FyZykgewogICAgICBpZiAodGhpcy5jb250ZXh0TWVudURlYWN0aXZhdGVkKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGV2ZW50QXJnLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGV2ZW50QXJnLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBjb25zdCBjb250ZXh0TWVudSA9IG5ldyBEZWVzQ29udGV4dG1lbnU1KCk7CiAgICAgIGNvbnRleHRNZW51LnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIjsKICAgICAgY29udGV4dE1lbnUuc3R5bGUuekluZGV4ID0gU3RyaW5nKHpJbmRleExheWVycy5vdmVybGF5LmNvbnRleHRNZW51KTsKICAgICAgY29udGV4dE1lbnUuc3R5bGUub3BhY2l0eSA9ICIwIjsKICAgICAgY29udGV4dE1lbnUuc3R5bGUudHJhbnNmb3JtID0gInNjYWxlKDAuOTUpIHRyYW5zbGF0ZVkoLTEwcHgpIjsKICAgICAgY29udGV4dE1lbnUubWVudUl0ZW1zID0gbWVudUl0ZW1zQXJnOwogICAgICBjb250ZXh0TWVudS53aW5kb3dMYXllciA9IGF3YWl0IERlZXNXaW5kb3dMYXllci5jcmVhdGVBbmRTaG93KCk7CiAgICAgIGNvbnRleHRNZW51LndpbmRvd0xheWVyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKGV2ZW50KSA9PiB7CiAgICAgICAgY29uc3QgY2xpY2tlZEVsZW1lbnQgPSBldmVudC50YXJnZXQ7CiAgICAgICAgY29uc3QgaXNDb250ZXh0TWVudSA9IGNsaWNrZWRFbGVtZW50LmNsb3Nlc3QoImRlZXMtY29udGV4dG1lbnUiKTsKICAgICAgICBpZiAoIWlzQ29udGV4dE1lbnUpIHsKICAgICAgICAgIGF3YWl0IGNvbnRleHRNZW51LmRlc3Ryb3koKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChjb250ZXh0TWVudSk7CiAgICAgIGF3YWl0IGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cy5zbWFydGRlbGF5LmRlbGF5Rm9yKDApOwogICAgICBjb25zdCByZWN0ID0gY29udGV4dE1lbnUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IHdpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7CiAgICAgIGNvbnN0IHdpbmRvd0hlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDsKICAgICAgbGV0IHRvcCA9IGV2ZW50QXJnLmNsaWVudFk7CiAgICAgIGxldCBsZWZ0ID0gZXZlbnRBcmcuY2xpZW50WDsKICAgICAgaWYgKGxlZnQgKyByZWN0LndpZHRoID4gd2luZG93V2lkdGgpIHsKICAgICAgICBsZWZ0ID0gd2luZG93V2lkdGggLSByZWN0LndpZHRoIC0gMTA7CiAgICAgIH0KICAgICAgaWYgKHRvcCArIHJlY3QuaGVpZ2h0ID4gd2luZG93SGVpZ2h0KSB7CiAgICAgICAgdG9wID0gd2luZG93SGVpZ2h0IC0gcmVjdC5oZWlnaHQgLSAxMDsKICAgICAgfQogICAgICBpZiAobGVmdCA8IDEwKQogICAgICAgIGxlZnQgPSAxMDsKICAgICAgaWYgKHRvcCA8IDEwKQogICAgICAgIHRvcCA9IDEwOwogICAgICBjb250ZXh0TWVudS5zdHlsZS50b3AgPSBgJHt0b3B9cHhgOwogICAgICBjb250ZXh0TWVudS5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7CiAgICAgIGNvbnRleHRNZW51LnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9ICJ0b3AgbGVmdCI7CiAgICAgIGF3YWl0IGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cy5zbWFydGRlbGF5LmRlbGF5Rm9yKDApOwogICAgICBjb250ZXh0TWVudS5zdHlsZS5vcGFjaXR5ID0gIjEiOwogICAgICBjb250ZXh0TWVudS5zdHlsZS50cmFuc2Zvcm0gPSAic2NhbGUoMSkgdHJhbnNsYXRlWSgwKSI7CiAgICB9CiAgICAjbWVudUl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczYodGhpcywgX21lbnVJdGVtc19pbml0aWFsaXplcnMsIFtdKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgbWVudUl0ZW1zKCkgewogICAgICByZXR1cm4gdGhpcy4jbWVudUl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWVudUl0ZW1zKHZhbHVlMikgewogICAgICB0aGlzLiNtZW51SXRlbXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHdpbmRvd0xheWVyID0gX19ydW5Jbml0aWFsaXplcnM2KHRoaXMsIF9tZW51SXRlbXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgc3VibWVudSA9IG51bGw7CiAgICBzdWJtZW51VGltZW91dCA9IG51bGw7CiAgICBwYXJlbnRNZW51ID0gbnVsbDsKICAgIGlzRGVzdHJveWluZyA9IGZhbHNlOwogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMudGFiSW5kZXggPSAwOwogICAgfQogICAgLyoqCiAgICAgKiBTVEFUSUMgU1RZTEVTCiAgICAgKi8KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzLCB0cmFuc2Zvcm0gMC4yczsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICAubWFpbmJveCB7CiAgICAgICAgbWluLXdpZHRoOiAyMDBweDsKICAgICAgICBtYXgtd2lkdGg6IDI4MHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMwMDAwMDAiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlMGUwZTAiLCAiIzIwMjAyMCIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgYm94LXNoYWRvdzogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIjAgNHB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjE1KSIsICIwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4zKSIpfTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBwYWRkaW5nOiA0cHggMDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMzMzIiwgIiNjY2MiKX07CiAgICAgIH0KCiAgICAgIC5tZW51aXRlbSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXM7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAubWVudWl0ZW06aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDQpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5tZW51aXRlbS5oYXMtc3VibWVudTo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICfigLonOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogOHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIC5tZW51aXRlbTphY3RpdmU6bm90KC5oYXMtc3VibWVudSkgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDgpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5tZW51aXRlbS5kaXNhYmxlZCB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5tZW51aXRlbSBkZWVzLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgIH0KCiAgICAgIC5tZW51aXRlbS10ZXh0IHsKICAgICAgICBmbGV4OiAxOwogICAgICB9CgogICAgICAubWVudWl0ZW0tc2hvcnRjdXQgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5OTkiLCAiIzY2NiIpfTsKICAgICAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgIH0KCiAgICAgIC5tZW51LWRpdmlkZXIgewogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTBlMGUwIiwgIiMyMDIwMjAiKX07CiAgICAgICAgbWFyZ2luOiA0cHggMDsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJtYWluYm94Ij4KICAgICAgICAke3RoaXMubWVudUl0ZW1zLm1hcCgobWVudUl0ZW1BcmcpID0+IHsKICAgICAgICBpZiAoImRpdmlkZXIiIGluIG1lbnVJdGVtQXJnICYmIG1lbnVJdGVtQXJnLmRpdmlkZXIpIHsKICAgICAgICAgIHJldHVybiBiMmA8ZGl2IGNsYXNzPSJtZW51LWRpdmlkZXIiPjwvZGl2PmA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1lbnVJdGVtID0gbWVudUl0ZW1Bcmc7CiAgICAgICAgY29uc3QgaGFzU3VibWVudSA9IG1lbnVJdGVtLnN1Ym1lbnUgJiYgbWVudUl0ZW0uc3VibWVudS5sZW5ndGggPiAwOwogICAgICAgIHJldHVybiBiMmAKICAgICAgICAgICAgPGRpdiAKICAgICAgICAgICAgICBjbGFzcz0ibWVudWl0ZW0gJHttZW51SXRlbS5kaXNhYmxlZCA/ICJkaXNhYmxlZCIgOiAiIn0gJHtoYXNTdWJtZW51ID8gImhhcy1zdWJtZW51IiA6ICIifSIgCiAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gIW1lbnVJdGVtLmRpc2FibGVkICYmICFoYXNTdWJtZW51ICYmIHRoaXMuaGFuZGxlQ2xpY2sobWVudUl0ZW0pfQogICAgICAgICAgICAgIEBtb3VzZWVudGVyPSR7KCkgPT4gdGhpcy5oYW5kbGVNZW51SXRlbUhvdmVyKG1lbnVJdGVtLCBoYXNTdWJtZW51KX0KICAgICAgICAgICAgICBAbW91c2VsZWF2ZT0keygpID0+IHRoaXMuaGFuZGxlTWVudUl0ZW1MZWF2ZSgpfQogICAgICAgICAgICA+CiAgICAgICAgICAgICAgJHttZW51SXRlbS5pY29uTmFtZSA/IGIyYAogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0iJHttZW51SXRlbS5pY29uTmFtZX0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWVudWl0ZW0tdGV4dCI+JHttZW51SXRlbS5uYW1lfTwvc3Bhbj4KICAgICAgICAgICAgICAke21lbnVJdGVtLnNob3J0Y3V0ICYmICFoYXNTdWJtZW51ID8gYjJgCiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWVudWl0ZW0tc2hvcnRjdXQiPiR7bWVudUl0ZW0uc2hvcnRjdXR9PC9zcGFuPgogICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgOwogICAgICB9KX0KICAgICAgICAke3RoaXMubWVudUl0ZW1zLmxlbmd0aCA9PT0gMCA/IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW51aXRlbSIgQGNsaWNrPSR7KCkgPT4gewogICAgICAgIERlZXNDb250ZXh0bWVudTUuY29udGV4dE1lbnVEZWFjdGl2YXRlZCA9IHRydWU7CiAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgIH19PgogICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249Imx1Y2lkZTp4Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWVudWl0ZW0tdGV4dCI+QWxsb3cgbmF0aXZlIGNvbnRleHQ8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIGAgOiBiMmBgfQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgdGhpcy5oYW5kbGVLZXlkb3duKTsKICAgIH0KICAgIGhhbmRsZUtleWRvd24gPSAoZXZlbnQpID0+IHsKICAgICAgY29uc3QgbWVudUl0ZW1zID0gQXJyYXkuZnJvbSh0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgiLm1lbnVpdGVtOm5vdCguZGlzYWJsZWQpIikpOwogICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBtZW51SXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm1hdGNoZXMoIjpob3ZlciIpKTsKICAgICAgc3dpdGNoIChldmVudC5rZXkpIHsKICAgICAgICBjYXNlICJBcnJvd0Rvd24iOgogICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGNvbnN0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCArIDEgPCBtZW51SXRlbXMubGVuZ3RoID8gY3VycmVudEluZGV4ICsgMSA6IDA7CiAgICAgICAgICBtZW51SXRlbXNbbmV4dEluZGV4XS5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCJtb3VzZWVudGVyIikpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQXJyb3dVcCI6CiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgY29uc3QgcHJldkluZGV4ID0gY3VycmVudEluZGV4IC0gMSA+PSAwID8gY3VycmVudEluZGV4IC0gMSA6IG1lbnVJdGVtcy5sZW5ndGggLSAxOwogICAgICAgICAgbWVudUl0ZW1zW3ByZXZJbmRleF0uZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgibW91c2VlbnRlciIpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkVudGVyIjoKICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID49IDApIHsKICAgICAgICAgICAgbWVudUl0ZW1zW2N1cnJlbnRJbmRleF0uY2xpY2soKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkVzY2FwZSI6CiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfTsKICAgIGFzeW5jIGhhbmRsZUNsaWNrKG1lbnVJdGVtKSB7CiAgICAgIG1lbnVJdGVtLmFjdGlvbigpOwogICAgICBhd2FpdCB0aGlzLmRlc3Ryb3lBbGwoKTsKICAgIH0KICAgIGFzeW5jIGhhbmRsZU1lbnVJdGVtSG92ZXIobWVudUl0ZW0sIGhhc1N1Ym1lbnUpIHsKICAgICAgaWYgKHRoaXMuc3VibWVudVRpbWVvdXQpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zdWJtZW51VGltZW91dCk7CiAgICAgICAgdGhpcy5zdWJtZW51VGltZW91dCA9IG51bGw7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuc3VibWVudSkgewogICAgICAgIGF3YWl0IHRoaXMuaGlkZVN1Ym1lbnUoKTsKICAgICAgfQogICAgICBpZiAoaGFzU3VibWVudSAmJiBtZW51SXRlbS5zdWJtZW51KSB7CiAgICAgICAgdGhpcy5zdWJtZW51VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgdGhpcy5zaG93U3VibWVudShtZW51SXRlbSk7CiAgICAgICAgfSwgMjAwKTsKICAgICAgfQogICAgfQogICAgaGFuZGxlTWVudUl0ZW1MZWF2ZSgpIHsKICAgICAgaWYgKHRoaXMuc3VibWVudVRpbWVvdXQpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zdWJtZW51VGltZW91dCk7CiAgICAgIH0KICAgICAgdGhpcy5zdWJtZW51VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIGlmICh0aGlzLnN1Ym1lbnUgJiYgIXRoaXMuc3VibWVudS5tYXRjaGVzKCI6aG92ZXIiKSkgewogICAgICAgICAgdGhpcy5oaWRlU3VibWVudSgpOwogICAgICAgIH0KICAgICAgfSwgMzAwKTsKICAgIH0KICAgIGFzeW5jIHNob3dTdWJtZW51KG1lbnVJdGVtKSB7CiAgICAgIGlmICghbWVudUl0ZW0uc3VibWVudSB8fCBtZW51SXRlbS5zdWJtZW51Lmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IG1lbnVJdGVtcyA9IEFycmF5LmZyb20odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5tZW51aXRlbSIpKTsKICAgICAgY29uc3QgbWVudUl0ZW1FbGVtZW50ID0gbWVudUl0ZW1zLmZpbmQoKGVsKSA9PiBlbC5xdWVyeVNlbGVjdG9yKCIubWVudWl0ZW0tdGV4dCIpPy50ZXh0Q29udGVudCA9PT0gbWVudUl0ZW0ubmFtZSk7CiAgICAgIGlmICghbWVudUl0ZW1FbGVtZW50KQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5zdWJtZW51ID0gbmV3IERlZXNDb250ZXh0bWVudTUoKTsKICAgICAgdGhpcy5zdWJtZW51Lm1lbnVJdGVtcyA9IG1lbnVJdGVtLnN1Ym1lbnU7CiAgICAgIHRoaXMuc3VibWVudS5wYXJlbnRNZW51ID0gdGhpczsKICAgICAgdGhpcy5zdWJtZW51LnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIjsKICAgICAgdGhpcy5zdWJtZW51LnN0eWxlLnpJbmRleCA9IFN0cmluZyhwYXJzZUludCh0aGlzLnN0eWxlLnpJbmRleCkgKyAxKTsKICAgICAgdGhpcy5zdWJtZW51LnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgIHRoaXMuc3VibWVudS5zdHlsZS50cmFuc2Zvcm0gPSAic2NhbGUoMC45NSkiOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh0aGlzLnN1Ym1lbnUpOwogICAgICBhd2FpdCBkb210b29sc19wbHVnaW5leHBvcnRzX2V4cG9ydHMuc21hcnRkZWxheS5kZWxheUZvcigwKTsKICAgICAgY29uc3QgaXRlbVJlY3QgPSBtZW51SXRlbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IG1lbnVSZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3Qgc3VibWVudVJlY3QgPSB0aGlzLnN1Ym1lbnUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IHdpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7CiAgICAgIGxldCBsZWZ0ID0gbWVudVJlY3QucmlnaHQgLSA0OwogICAgICBsZXQgdG9wID0gaXRlbVJlY3QudG9wOwogICAgICBpZiAobGVmdCArIHN1Ym1lbnVSZWN0LndpZHRoID4gd2luZG93V2lkdGggLSAxMCkgewogICAgICAgIGxlZnQgPSBtZW51UmVjdC5sZWZ0IC0gc3VibWVudVJlY3Qud2lkdGggKyA0OwogICAgICB9CiAgICAgIGlmICh0b3AgKyBzdWJtZW51UmVjdC5oZWlnaHQgPiB3aW5kb3cuaW5uZXJIZWlnaHQgLSAxMCkgewogICAgICAgIHRvcCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHN1Ym1lbnVSZWN0LmhlaWdodCAtIDEwOwogICAgICB9CiAgICAgIHRoaXMuc3VibWVudS5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7CiAgICAgIHRoaXMuc3VibWVudS5zdHlsZS50b3AgPSBgJHt0b3B9cHhgOwogICAgICBhd2FpdCBkb210b29sc19wbHVnaW5leHBvcnRzX2V4cG9ydHMuc21hcnRkZWxheS5kZWxheUZvcigwKTsKICAgICAgdGhpcy5zdWJtZW51LnN0eWxlLm9wYWNpdHkgPSAiMSI7CiAgICAgIHRoaXMuc3VibWVudS5zdHlsZS50cmFuc2Zvcm0gPSAic2NhbGUoMSkiOwogICAgICB0aGlzLnN1Ym1lbnUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsICgpID0+IHsKICAgICAgICBpZiAodGhpcy5zdWJtZW51VGltZW91dCkgewogICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc3VibWVudVRpbWVvdXQpOwogICAgICAgICAgdGhpcy5zdWJtZW51VGltZW91dCA9IG51bGw7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdGhpcy5zdWJtZW51LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLCAoKSA9PiB7CiAgICAgICAgdGhpcy5oYW5kbGVNZW51SXRlbUxlYXZlKCk7CiAgICAgIH0pOwogICAgfQogICAgYXN5bmMgaGlkZVN1Ym1lbnUoKSB7CiAgICAgIGlmICghdGhpcy5zdWJtZW51KQogICAgICAgIHJldHVybjsKICAgICAgYXdhaXQgdGhpcy5zdWJtZW51LmRlc3Ryb3koKTsKICAgICAgdGhpcy5zdWJtZW51ID0gbnVsbDsKICAgIH0KICAgIGFzeW5jIGRlc3Ryb3koKSB7CiAgICAgIGlmICh0aGlzLmlzRGVzdHJveWluZykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLmlzRGVzdHJveWluZyA9IHRydWU7CiAgICAgIGlmICh0aGlzLnN1Ym1lbnVUaW1lb3V0KSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc3VibWVudVRpbWVvdXQpOwogICAgICAgIHRoaXMuc3VibWVudVRpbWVvdXQgPSBudWxsOwogICAgICB9CiAgICAgIGlmICh0aGlzLnN1Ym1lbnUpIHsKICAgICAgICBhd2FpdCB0aGlzLnN1Ym1lbnUuZGVzdHJveSgpOwogICAgICAgIHRoaXMuc3VibWVudSA9IG51bGw7CiAgICAgIH0KICAgICAgaWYgKHRoaXMud2luZG93TGF5ZXIgJiYgIXRoaXMucGFyZW50TWVudSkgewogICAgICAgIHRoaXMud2luZG93TGF5ZXIuZGVzdHJveSgpOwogICAgICB9CiAgICAgIHRoaXMuc3R5bGUub3BhY2l0eSA9ICIwIjsKICAgICAgdGhpcy5zdHlsZS50cmFuc2Zvcm0gPSAic2NhbGUoMC45NSkgdHJhbnNsYXRlWSgtMTBweCkiOwogICAgICBhd2FpdCBkb210b29sc19wbHVnaW5leHBvcnRzX2V4cG9ydHMuc21hcnRkZWxheS5kZWxheUZvcigxMDApOwogICAgICBpZiAodGhpcy5wYXJlbnRFbGVtZW50KSB7CiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIERlc3Ryb3lzIHRoaXMgbWVudSBhbmQgYWxsIHBhcmVudCBtZW51cyBpbiB0aGUgY2hhaW4KICAgICAqLwogICAgYXN5bmMgZGVzdHJveUFsbCgpIHsKICAgICAgbGV0IHJvb3RNZW51ID0gdGhpczsKICAgICAgd2hpbGUgKHJvb3RNZW51LnBhcmVudE1lbnUpIHsKICAgICAgICByb290TWVudSA9IHJvb3RNZW51LnBhcmVudE1lbnU7CiAgICAgIH0KICAgICAgYXdhaXQgcm9vdE1lbnUuZGVzdHJveSgpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM2KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzQ29udGV4dG1lbnU1ID0gX2NsYXNzVGhpczsKfSkoKTsKRGVlc0NvbnRleHRtZW51LmluaXRpYWxpemVHbG9iYWxMaXN0ZW5lcigpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtd2NjdG9vbHNAMy44LjAvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtd2NjdG9vbHMvZGlzdF90c19kZW1vdG9vbHMvZGVtb3Rvb2xzLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBfX2VzRGVjb3JhdGU2ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM3ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzRGVtb1dyYXBwZXIgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtZGVtb3dyYXBwZXIiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9ydW5BZnRlclJlbmRlcl9kZWNvcmF0b3JzOwogIGxldCBfcnVuQWZ0ZXJSZW5kZXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ydW5BZnRlclJlbmRlcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzRGVtb1dyYXBwZXIyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfcnVuQWZ0ZXJSZW5kZXJfZGVjb3JhdG9ycyA9IFtuNSh7IGF0dHJpYnV0ZTogZmFsc2UgfSldOwogICAgICBfX2VzRGVjb3JhdGU2KHRoaXMsIG51bGwsIF9ydW5BZnRlclJlbmRlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJydW5BZnRlclJlbmRlciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicnVuQWZ0ZXJSZW5kZXIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucnVuQWZ0ZXJSZW5kZXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnJ1bkFmdGVyUmVuZGVyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3J1bkFmdGVyUmVuZGVyX2luaXRpYWxpemVycywgX3J1bkFmdGVyUmVuZGVyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNihudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNEZW1vV3JhcHBlcjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgI3J1bkFmdGVyUmVuZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczcodGhpcywgX3J1bkFmdGVyUmVuZGVyX2luaXRpYWxpemVycywgdm9pZCAwKTsKICAgIGdldCBydW5BZnRlclJlbmRlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3J1bkFmdGVyUmVuZGVyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcnVuQWZ0ZXJSZW5kZXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3J1bkFmdGVyUmVuZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogY29udGVudHM7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPHNsb3Q+PC9zbG90PgogICAgYDsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZCgpIHsKICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUyLCA1MCkpOwogICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwICYmIHRoaXMucnVuQWZ0ZXJSZW5kZXIpIHsKICAgICAgICB0cnkgewogICAgICAgICAgYXdhaXQgdGhpcy5ydW5BZnRlclJlbmRlcih0aGlzKTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgaW4gcnVuQWZ0ZXJSZW5kZXI6IiwgZXJyb3IpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNyh0aGlzLCBfcnVuQWZ0ZXJSZW5kZXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM3KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzRGVtb1dyYXBwZXIyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1hcHB1aS9kZWVzLWFwcHVpLWFjdGl2aXR5bG9nL2RlZXMtYXBwdWktYWN0aXZpdHlsb2cuZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmMzID0gKCkgPT4gewogIGNvbnN0IGFjdGl2aXR5TG9nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGVlcy1hcHB1aS1hY3Rpdml0eWxvZyIpOwogIHNldFRpbWVvdXQoKCkgPT4gewogICAgYWN0aXZpdHlMb2cuYWRkTWFueShbCiAgICAgIHsgdHlwZTogImxvZ2luIiwgdXNlcjogIkpvaG4gRG9lIiwgbWVzc2FnZTogImxvZ2dlZCBpbiBmcm9tIENocm9tZSBvbiBtYWNPUyIgfSwKICAgICAgeyB0eXBlOiAiY3JlYXRlIiwgdXNlcjogIkpvaG4gRG9lIiwgbWVzc2FnZTogJ2NyZWF0ZWQgYSBuZXcgcHJvamVjdCAiRnJvbnRlbmQgQXBwIicgfSwKICAgICAgeyB0eXBlOiAidXBkYXRlIiwgdXNlcjogIkphbmUgU21pdGgiLCBtZXNzYWdlOiAidXBkYXRlZCBBUEkgZG9jdW1lbnRhdGlvbiIgfSwKICAgICAgeyB0eXBlOiAidmlldyIsIHVzZXI6ICJKb2huIERvZSIsIG1lc3NhZ2U6ICJ2aWV3ZWQgZGFzaGJvYXJkIGFuYWx5dGljcyIgfSwKICAgICAgeyB0eXBlOiAiZGVsZXRlIiwgdXNlcjogIkFkbWluIiwgbWVzc2FnZTogInJlbW92ZWQgZGVwcmVjYXRlZCBlbmRwb2ludCIgfSwKICAgICAgeyB0eXBlOiAiY3VzdG9tIiwgdXNlcjogIlN5c3RlbSIsIG1lc3NhZ2U6ICJzY2hlZHVsZWQgYmFja3VwIGNvbXBsZXRlZCIsIGljb25OYW1lOiAibHVjaWRlOmRhdGFiYXNlIiB9LAogICAgICB7IHR5cGU6ICJsb2dvdXQiLCB1c2VyOiAiQWxpY2UgQnJvd24iLCBtZXNzYWdlOiAibG9nZ2VkIG91dCIgfSwKICAgICAgeyB0eXBlOiAiY3JlYXRlIiwgdXNlcjogIkphbmUgU21pdGgiLCBtZXNzYWdlOiAiY3JlYXRlZCBpbnZvaWNlICMxMjM0IiB9CiAgICBdKTsKICAgIGFjdGl2aXR5TG9nLmVudHJpZXMkLnN1YnNjcmliZSgoZW50cmllcykgPT4gewogICAgICBjb25zb2xlLmxvZygiQWN0aXZpdHkgbG9nIHVwZGF0ZWQ6IiwgZW50cmllcy5sZW5ndGgsICJlbnRyaWVzIik7CiAgICB9KTsKICB9LCAxMDApOwogIHJldHVybiBiMmAKICAgIDxkZWVzLWRlbW93cmFwcGVyPgogICAgICA8c3R5bGU+CiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBoZWlnaHQ6IDYwMHB4OwogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmNGY0ZjUiLCAiIzA5MDkwYiIpfTsKICAgICAgICAgIHBhZGRpbmc6IDMycHg7CiAgICAgICAgfQogICAgICA8L3N0eWxlPgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICAgICAgJHthY3Rpdml0eUxvZ30KICAgICAgPC9kaXY+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgYDsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1hcHB1aS9kZWVzLWFwcHVpLWFjdGl2aXR5bG9nL2RlZXMtYXBwdWktYWN0aXZpdHlsb2cuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF9kaXN0X3RzMjkoKTsKaW5pdF9kZWVzX2ljb24oKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlNyA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzOCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0FwcHVpQWN0aXZpdHlsb2cgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtYXBwdWktYWN0aXZpdHlsb2ciKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9lbnRyaWVzX2RlY29yYXRvcnM7CiAgbGV0IF9lbnRyaWVzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZW50cmllc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VhcmNoUXVlcnlfZGVjb3JhdG9yczsKICBsZXQgX3NlYXJjaFF1ZXJ5X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VhcmNoUXVlcnlfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ZpbHRlckNyaXRlcmlhX2RlY29yYXRvcnM7CiAgbGV0IF9maWx0ZXJDcml0ZXJpYV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ZpbHRlckNyaXRlcmlhX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNBcHB1aUFjdGl2aXR5bG9nMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2VudHJpZXNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3NlYXJjaFF1ZXJ5X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9maWx0ZXJDcml0ZXJpYV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGU3KHRoaXMsIG51bGwsIF9lbnRyaWVzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImVudHJpZXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImVudHJpZXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZW50cmllcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZW50cmllcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9lbnRyaWVzX2luaXRpYWxpemVycywgX2VudHJpZXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3KHRoaXMsIG51bGwsIF9zZWFyY2hRdWVyeV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWFyY2hRdWVyeSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VhcmNoUXVlcnkiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VhcmNoUXVlcnksIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlYXJjaFF1ZXJ5ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlYXJjaFF1ZXJ5X2luaXRpYWxpemVycywgX3NlYXJjaFF1ZXJ5X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNyh0aGlzLCBudWxsLCBfZmlsdGVyQ3JpdGVyaWFfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZmlsdGVyQ3JpdGVyaWEiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZpbHRlckNyaXRlcmlhIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmZpbHRlckNyaXRlcmlhLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5maWx0ZXJDcml0ZXJpYSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9maWx0ZXJDcml0ZXJpYV9pbml0aWFsaXplcnMsIF9maWx0ZXJDcml0ZXJpYV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzQXBwdWlBY3Rpdml0eWxvZzIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgLy8gU1RBVElDCiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMzsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJBcHAgVUkiXTsKICAgICNlbnRyaWVzX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczgodGhpcywgX2VudHJpZXNfaW5pdGlhbGl6ZXJzLCBbXSk7CiAgICAvLyBJTlNUQU5DRSBQUk9QRVJUSUVTCiAgICBnZXQgZW50cmllcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2VudHJpZXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBlbnRyaWVzKHZhbHVlMikgewogICAgICB0aGlzLiNlbnRyaWVzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VhcmNoUXVlcnlfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgodGhpcywgX2VudHJpZXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczgodGhpcywgX3NlYXJjaFF1ZXJ5X2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBzZWFyY2hRdWVyeSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlYXJjaFF1ZXJ5X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VhcmNoUXVlcnkodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlYXJjaFF1ZXJ5X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZmlsdGVyQ3JpdGVyaWFfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgodGhpcywgX3NlYXJjaFF1ZXJ5X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4KHRoaXMsIF9maWx0ZXJDcml0ZXJpYV9pbml0aWFsaXplcnMsIHt9KSk7CiAgICBnZXQgZmlsdGVyQ3JpdGVyaWEoKSB7CiAgICAgIHJldHVybiB0aGlzLiNmaWx0ZXJDcml0ZXJpYV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGZpbHRlckNyaXRlcmlhKHZhbHVlMikgewogICAgICB0aGlzLiNmaWx0ZXJDcml0ZXJpYV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgLy8gUnhKUyBTdWJqZWN0IGZvciByZWFjdGl2ZSB1cGRhdGVzCiAgICBlbnRyaWVzJCA9IChfX3J1bkluaXRpYWxpemVyczgodGhpcywgX2ZpbHRlckNyaXRlcmlhX2V4dHJhSW5pdGlhbGl6ZXJzKSwgbmV3IGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cy5zbWFydHJ4LnJ4anMuU3ViamVjdCgpKTsKICAgIC8vIFNUWUxFUwogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIDpob3N0IHsKICAgICAgICAvKiBDU1MgVmFyaWFibGVzIGFsaWduZWQgd2l0aCBzZWNvbmRhcnkgbWVudSAqLwogICAgICAgIC0tYWN0aXZpdHlsb2ctYmc6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmFmYWZhIiwgIiMwYTBhMGEiKX07CiAgICAgICAgLS1hY3Rpdml0eWxvZy1mZzogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM1MjUyNTIiLCAiI2EzYTNhMyIpfTsKICAgICAgICAtLWFjdGl2aXR5bG9nLWZnLW11dGVkOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzczNzM3MyIsICIjNzM3MzczIil9OwogICAgICAgIC0tYWN0aXZpdHlsb2ctZmctYWN0aXZlOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzBhMGEwYSIsICIjZmFmYWZhIil9OwogICAgICAgIC0tYWN0aXZpdHlsb2ctYm9yZGVyOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTVlNSIsICIjMWExYTFhIil9OwogICAgICAgIC0tYWN0aXZpdHlsb2ctaG92ZXI6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDQpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNikiKX07CiAgICAgICAgLS1hY3Rpdml0eWxvZy1hY2NlbnQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzg3MTZjIiwgIiNiNWE5OWEiKX07CgogICAgICAgIGNvbG9yOiB2YXIoLS1hY3Rpdml0eWxvZy1mZyk7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY3Rpdml0eWxvZy1iZyk7CiAgICAgICAgZm9udC1mYW1pbHk6ICdHZWlzdCBTYW5zJywgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBzYW5zLXNlcmlmOwogICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tYWN0aXZpdHlsb2ctYm9yZGVyKTsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLm1haW5jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDBweDsKICAgICAgICBsZWZ0OiAwcHg7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAyODBweDsKICAgICAgfQoKICAgICAgLyogSGVhZGVyIHdpdGggc3RyZWFtaW5nIGluZGljYXRvciAqLwogICAgICAudG9wYmFyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBhZGRpbmc6IDBweCAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWFjdGl2aXR5bG9nLWJnKTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYWN0aXZpdHlsb2ctYm9yZGVyKTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgIC50b3BiYXIgLmhlYWRpbmcgewogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGNvbG9yOiB2YXIoLS1hY3Rpdml0eWxvZy1mZy1hY3RpdmUpOwogICAgICB9CgogICAgICAubGl2ZS1pbmRpY2F0b3IgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDZweDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07CiAgICAgICAgY29sb3I6IHZhcigtLWFjdGl2aXR5bG9nLWZnLW11dGVkKTsKICAgICAgfQoKICAgICAgLmxpdmUtaW5kaWNhdG9yIC5kb3QgewogICAgICAgIHdpZHRoOiA2cHg7CiAgICAgICAgaGVpZ2h0OiA2cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyMmM1NWUiLCAiIzIyYzU1ZSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYW5pbWF0aW9uOiBwdWxzZSAycyBlYXNlLWluLW91dCBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBwdWxzZSB7CiAgICAgICAgMCUsIDEwMCUgeyBvcGFjaXR5OiAwLjU7IHRyYW5zZm9ybTogc2NhbGUoMC45KTsgfQogICAgICAgIDUwJSB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogc2NhbGUoMS4xKTsgfQogICAgICB9CgogICAgICAvKiBBY3Rpdml0eSBjb250YWluZXIgKi8KICAgICAgLmFjdGl2aXR5Q29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA0OHB4OwogICAgICAgIGJvdHRvbTogNDhweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwYWRkaW5nOiA4cHggMDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICAgICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwogICAgICAgIHNjcm9sbGJhci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkNGQ0ZDQiLCAiIzMzMzMzMyIpfSB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgLmFjdGl2aXR5Q29udGFpbmVyOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICAgICAgd2lkdGg6IDZweDsKICAgICAgfQoKICAgICAgLmFjdGl2aXR5Q29udGFpbmVyOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC5hY3Rpdml0eUNvbnRhaW5lcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDRkNGQ0IiwgIiMzMzMzMzMiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICB9CgogICAgICAuYWN0aXZpdHlDb250YWluZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2EzYTNhMyIsICIjNTI1MjUyIil9OwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgcGFkZGluZzogNDBweCAxNnB4OwogICAgICAgIGNvbG9yOiB2YXIoLS1hY3Rpdml0eWxvZy1mZy1tdXRlZCk7CiAgICAgIH0KCiAgICAgIC8qIERhdGUgc2VwYXJhdG9yIC0gd2FybSB0YXVwZSBzdHlsaW5nICovCiAgICAgIC5kYXRlLXNlcGFyYXRvciB7CiAgICAgICAgcGFkZGluZzogMTJweCAxMnB4IDZweDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgICAgICBjb2xvcjogdmFyKC0tYWN0aXZpdHlsb2ctYWNjZW50KTsKICAgICAgICBwb3NpdGlvbjogc3RpY2t5OwogICAgICAgIHRvcDogMDsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWFjdGl2aXR5bG9nLWJnKTsKICAgICAgfQoKICAgICAgLyogQWN0aXZpdHkgZW50cnkgLSBtb2Rlcm4gc3RhY2tlZCBsYXlvdXQgKi8KICAgICAgLmFjdGl2aXR5ZW50cnkgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBtYXJnaW46IDJweCA0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMgZWFzZTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICAgIGdhcDogMTBweDsKICAgICAgICBsaW5lLWhlaWdodDogMS40OwogICAgICAgIGFuaW1hdGlvbjogZmFkZUluIDAuMnMgZWFzZS1vdXQ7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgZmFkZUluIHsKICAgICAgICBmcm9tIHsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7CiAgICAgICAgfQogICAgICAgIHRvIHsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAuYWN0aXZpdHllbnRyeTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYWN0aXZpdHlsb2ctaG92ZXIpOwogICAgICB9CgogICAgICAuYWN0aXZpdHktaWNvbiB7CiAgICAgICAgd2lkdGg6IDI4cHg7CiAgICAgICAgaGVpZ2h0OiAyOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjA0KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpIil9OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6IHZhcigtLWFjdGl2aXR5bG9nLWZnLW11dGVkKTsKICAgICAgICBtYXJnaW4tdG9wOiAxcHg7CiAgICAgIH0KCiAgICAgIC5hY3Rpdml0eS1pY29uLmxvZ2luIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgzNCwgMTk3LCA5NCwgMC4wOCkiLCAicmdiYSgzNCwgMTk3LCA5NCwgMC4xMikiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTZhMzRhIiwgIiM0YWRlODAiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpdml0eS1pY29uLmxvZ291dCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMjM5LCA2OCwgNjgsIDAuMDgpIiwgInJnYmEoMjM5LCA2OCwgNjgsIDAuMTIpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2RjMjYyNiIsICIjZjg3MTcxIil9OwogICAgICB9CgogICAgICAuYWN0aXZpdHktaWNvbi52aWV3IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSg1OSwgMTMwLCAyNDYsIDAuMDgpIiwgInJnYmEoNTksIDEzMCwgMjQ2LCAwLjEyKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyNTYzZWIiLCAiIzYwYTVmYSIpfTsKICAgICAgfQoKICAgICAgLmFjdGl2aXR5LWljb24uY3JlYXRlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgxNjgsIDg1LCAyNDcsIDAuMDgpIiwgInJnYmEoMTY4LCA4NSwgMjQ3LCAwLjEyKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5MzMzZWEiLCAiI2MwODRmYyIpfTsKICAgICAgfQoKICAgICAgLmFjdGl2aXR5LWljb24udXBkYXRlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgyNTEsIDE0NiwgNjAsIDAuMDgpIiwgInJnYmEoMjUxLCAxNDYsIDYwLCAwLjEyKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlYTU4MGMiLCAiI2ZiOTIzYyIpfTsKICAgICAgfQoKICAgICAgLmFjdGl2aXR5LWljb24uZGVsZXRlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgyMzksIDY4LCA2OCwgMC4wOCkiLCAicmdiYSgyMzksIDY4LCA2OCwgMC4xMikiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZGMyNjI2IiwgIiNmODcxNzEiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpdml0eS1pY29uLmN1c3RvbSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMTAwLCAxMTYsIDEzOSwgMC4wOCkiLCAicmdiYSgxMDAsIDExNiwgMTM5LCAwLjEyKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM0NzU1NjkiLCAiIzk0YTNiOCIpfTsKICAgICAgfQoKICAgICAgLmFjdGl2aXR5LWNvbnRlbnQgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDJweDsKICAgICAgfQoKICAgICAgLmFjdGl2aXR5LWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNnB4OwogICAgICB9CgogICAgICAuYWN0aXZpdHktdXNlciB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6IHZhcigtLWFjdGl2aXR5bG9nLWZnLWFjdGl2ZSk7CiAgICAgIH0KCiAgICAgIC5hY3Rpdml0eS1zZXBhcmF0b3IgewogICAgICAgIGNvbG9yOiB2YXIoLS1hY3Rpdml0eWxvZy1mZy1tdXRlZCk7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICB9CgogICAgICAudGltZXN0YW1wIHsKICAgICAgICBjb2xvcjogdmFyKC0tYWN0aXZpdHlsb2ctZmctbXV0ZWQpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICAgICAgZm9udC1mYW1pbHk6ICdHZWlzdCBNb25vJywgbW9ub3NwYWNlOwogICAgICB9CgogICAgICAuYWN0aXZpdHktbWVzc2FnZSB7CiAgICAgICAgY29sb3I6IHZhcigtLWFjdGl2aXR5bG9nLWZnKTsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgICB9CgogICAgICAvKiBTZWFyY2ggYm94IC0gcmVmaW5lZCBzdHlsaW5nICovCiAgICAgIC5zZWFyY2hib3ggewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYWN0aXZpdHlsb2ctYmcpOwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1hY3Rpdml0eWxvZy1ib3JkZXIpOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgIC5zZWFyY2gtd3JhcHBlciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgfQoKICAgICAgLnNlYXJjaC1pY29uIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogMTBweDsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICAgICAgY29sb3I6IHZhcigtLWFjdGl2aXR5bG9nLWZnLW11dGVkKTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgdHJhbnNpdGlvbjogY29sb3IgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnNlYXJjaGJveCBpbnB1dCB7CiAgICAgICAgY29sb3I6IHZhcigtLWFjdGl2aXR5bG9nLWZnLWFjdGl2ZSk7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wMykiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSIpfTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wOCkiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgcGFkZGluZzogMCAxMnB4IDAgMzRweDsKICAgICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCBzYW5zLXNlcmlmOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnNlYXJjaGJveCBpbnB1dDo6cGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1hY3Rpdml0eWxvZy1mZy1tdXRlZCk7CiAgICAgIH0KCiAgICAgIC5zZWFyY2hib3ggaW5wdXQ6Zm9jdXMgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjE1KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDIpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNikiKX07CiAgICAgIH0KCiAgICAgIC5zZWFyY2gtd3JhcHBlcjpoYXMoaW5wdXQ6Zm9jdXMpIC5zZWFyY2gtaWNvbiB7CiAgICAgICAgY29sb3I6IHZhcigtLWFjdGl2aXR5bG9nLWZnKTsKICAgICAgfQogICAgYAogICAgXTsKICAgIC8vIFJFTkRFUgogICAgcmVuZGVyKCkgewogICAgICBjb25zdCBmaWx0ZXJlZEVudHJpZXMgPSB0aGlzLmdldEZpbHRlcmVkRW50cmllcygpOwogICAgICBjb25zdCBncm91cGVkRW50cmllcyA9IHRoaXMuZ3JvdXBFbnRyaWVzQnlEYXRlKGZpbHRlcmVkRW50cmllcyk7CiAgICAgIHJldHVybiBiMmAKICAgICAgJHtkb210b29sc19lbGVtZW50YmFzaWNfZXhwb3J0cy5zdHlsZXN9CiAgICAgIDxzdHlsZT48L3N0eWxlPgogICAgICA8ZGl2IGNsYXNzPSJtYWluY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0b3BiYXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZyI+QWN0aXZpdHkgTG9nPC9kaXY+CiAgICAgICAgICAke2ZpbHRlcmVkRW50cmllcy5sZW5ndGggPiAwID8gYjJgPGRpdiBjbGFzcz0ibGl2ZS1pbmRpY2F0b3IiPjxzcGFuIGNsYXNzPSJkb3QiPjwvc3Bhbj5MaXZlPC9kaXY+YCA6ICIifQogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImFjdGl2aXR5Q29udGFpbmVyIj4KICAgICAgICAgICR7ZmlsdGVyZWRFbnRyaWVzLmxlbmd0aCA9PT0gMCA/IGIyYDxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlIj5ObyBhY3Rpdml0eSBlbnRyaWVzPC9kaXY+YCA6IGdyb3VwZWRFbnRyaWVzLm1hcCgoZ3JvdXApID0+IGIyYAogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRlLXNlcGFyYXRvciI+JHtncm91cC5sYWJlbH08L2Rpdj4KICAgICAgICAgICAgICAgICAgJHtncm91cC5lbnRyaWVzLm1hcCgoZW50cnkpID0+IHRoaXMucmVuZGVyQWN0aXZpdHlFbnRyeShlbnRyeSkpfQogICAgICAgICAgICAgICAgYCl9CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VhcmNoYm94Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9InNlYXJjaC13cmFwcGVyIj4KICAgICAgICAgICAgPGRlZXMtaWNvbiBjbGFzcz0ic2VhcmNoLWljb24iIC5pY29uPSR7Imx1Y2lkZTpzZWFyY2gifT48L2RlZXMtaWNvbj4KICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgdHlwZT0idGV4dCIKICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iU2VhcmNoIGFjdGl2aXRpZXMsIHVzZXJzLi4uIgogICAgICAgICAgICAgIC52YWx1ZT0ke3RoaXMuc2VhcmNoUXVlcnl9CiAgICAgICAgICAgICAgQGlucHV0PSR7dGhpcy5oYW5kbGVTZWFyY2hJbnB1dH0KICAgICAgICAgICAgLz4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJBY3Rpdml0eUVudHJ5KGVudHJ5KSB7CiAgICAgIGNvbnN0IHRpbWVzdGFtcDIgPSBlbnRyeS50aW1lc3RhbXAgfHwgLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7CiAgICAgIGNvbnN0IHRpbWVTdHIgPSB0aGlzLmZvcm1hdFRpbWUodGltZXN0YW1wMik7CiAgICAgIGNvbnN0IGljb25OYW1lID0gZW50cnkuaWNvbk5hbWUgfHwgdGhpcy5nZXRJY29uRm9yVHlwZShlbnRyeS50eXBlKTsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9ImFjdGl2aXR5ZW50cnkiCiAgICAgICAgQGNvbnRleHRtZW51PSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVDb250ZXh0TWVudShlMTEsIGVudHJ5KX0KICAgICAgPgogICAgICAgIDxkaXYgY2xhc3M9ImFjdGl2aXR5LWljb24gJHtlbnRyeS50eXBlfSI+CiAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7aWNvbk5hbWV9PjwvZGVlcy1pY29uPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImFjdGl2aXR5LWNvbnRlbnQiPgogICAgICAgICAgPGRpdiBjbGFzcz0iYWN0aXZpdHktaGVhZGVyIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImFjdGl2aXR5LXVzZXIiPiR7ZW50cnkudXNlcn08L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJhY3Rpdml0eS1zZXBhcmF0b3IiPsK3PC9zcGFuPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0idGltZXN0YW1wIj4ke3RpbWVTdHJ9PC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJhY3Rpdml0eS1tZXNzYWdlIj4ke2VudHJ5Lm1lc3NhZ2V9PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIC8vIEFQSSBNRVRIT0RTCiAgICBhZGQoZW50cnkpIHsKICAgICAgY29uc3QgbmV3RW50cnkgPSB7CiAgICAgICAgLi4uZW50cnksCiAgICAgICAgaWQ6IGVudHJ5LmlkIHx8IHRoaXMuZ2VuZXJhdGVJZCgpLAogICAgICAgIHRpbWVzdGFtcDogZW50cnkudGltZXN0YW1wIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpCiAgICAgIH07CiAgICAgIHRoaXMuZW50cmllcyA9IFtuZXdFbnRyeSwgLi4udGhpcy5lbnRyaWVzXTsKICAgICAgdGhpcy5lbnRyaWVzJC5uZXh0KHRoaXMuZW50cmllcyk7CiAgICB9CiAgICBhZGRNYW55KGVudHJpZXMpIHsKICAgICAgY29uc3QgbmV3RW50cmllcyA9IGVudHJpZXMubWFwKChlbnRyeSkgPT4gKHsKICAgICAgICAuLi5lbnRyeSwKICAgICAgICBpZDogZW50cnkuaWQgfHwgdGhpcy5nZW5lcmF0ZUlkKCksCiAgICAgICAgdGltZXN0YW1wOiBlbnRyeS50aW1lc3RhbXAgfHwgLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkKICAgICAgfSkpOwogICAgICB0aGlzLmVudHJpZXMgPSBbLi4ubmV3RW50cmllcy5yZXZlcnNlKCksIC4uLnRoaXMuZW50cmllc107CiAgICAgIHRoaXMuZW50cmllcyQubmV4dCh0aGlzLmVudHJpZXMpOwogICAgfQogICAgY2xlYXIoKSB7CiAgICAgIHRoaXMuZW50cmllcyA9IFtdOwogICAgICB0aGlzLmVudHJpZXMkLm5leHQodGhpcy5lbnRyaWVzKTsKICAgIH0KICAgIGdldEVudHJpZXMoKSB7CiAgICAgIHJldHVybiBbLi4udGhpcy5lbnRyaWVzXTsKICAgIH0KICAgIGZpbHRlcihjcml0ZXJpYSkgewogICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IHsKICAgICAgICBpZiAoY3JpdGVyaWEudXNlciAmJiBlbnRyeS51c2VyICE9PSBjcml0ZXJpYS51c2VyKQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChjcml0ZXJpYS50eXBlICYmIGVudHJ5LnR5cGUgIT09IGNyaXRlcmlhLnR5cGUpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0pOwogICAgfQogICAgc2VhcmNoKHF1ZXJ5KSB7CiAgICAgIGNvbnN0IGxvd2VyUXVlcnkgPSBxdWVyeS50b0xvd2VyQ2FzZSgpOwogICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5Lm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlclF1ZXJ5KSB8fCBlbnRyeS51c2VyLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJRdWVyeSkpOwogICAgfQogICAgLy8gUFJJVkFURSBIRUxQRVJTCiAgICBnZW5lcmF0ZUlkKCkgewogICAgICByZXR1cm4gYGFjdGl2aXR5LSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSl9YDsKICAgIH0KICAgIGdldEZpbHRlcmVkRW50cmllcygpIHsKICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuZW50cmllczsKICAgICAgaWYgKHRoaXMuc2VhcmNoUXVlcnkpIHsKICAgICAgICBjb25zdCBsb3dlclF1ZXJ5ID0gdGhpcy5zZWFyY2hRdWVyeS50b0xvd2VyQ2FzZSgpOwogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJRdWVyeSkgfHwgZW50cnkudXNlci50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyUXVlcnkpKTsKICAgICAgfQogICAgICBpZiAodGhpcy5maWx0ZXJDcml0ZXJpYS51c2VyIHx8IHRoaXMuZmlsdGVyQ3JpdGVyaWEudHlwZSkgewogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoKGVudHJ5KSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5maWx0ZXJDcml0ZXJpYS51c2VyICYmIGVudHJ5LnVzZXIgIT09IHRoaXMuZmlsdGVyQ3JpdGVyaWEudXNlcikKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgaWYgKHRoaXMuZmlsdGVyQ3JpdGVyaWEudHlwZSAmJiBlbnRyeS50eXBlICE9PSB0aGlzLmZpbHRlckNyaXRlcmlhLnR5cGUpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBncm91cEVudHJpZXNCeURhdGUoZW50cmllcykgewogICAgICBjb25zdCBncm91cHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICBjb25zdCB0b2RheSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpOwogICAgICBjb25zdCB5ZXN0ZXJkYXkgPSBuZXcgRGF0ZSh0b2RheSk7CiAgICAgIHllc3RlcmRheS5zZXREYXRlKHllc3RlcmRheS5nZXREYXRlKCkgLSAxKTsKICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7CiAgICAgICAgY29uc3QgZGF0ZSA9IGVudHJ5LnRpbWVzdGFtcCB8fCAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTsKICAgICAgICBsZXQgbGFiZWw7CiAgICAgICAgaWYgKHRoaXMuaXNTYW1lRGF5KGRhdGUsIHRvZGF5KSkgewogICAgICAgICAgbGFiZWwgPSAiVG9kYXkiOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1NhbWVEYXkoZGF0ZSwgeWVzdGVyZGF5KSkgewogICAgICAgICAgbGFiZWwgPSAiWWVzdGVyZGF5IjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGFiZWwgPSBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygiZW4tVVMiLCB7CiAgICAgICAgICAgIG1vbnRoOiAic2hvcnQiLAogICAgICAgICAgICBkYXk6ICJudW1lcmljIiwKICAgICAgICAgICAgeWVhcjogZGF0ZS5nZXRGdWxsWWVhcigpICE9PSB0b2RheS5nZXRGdWxsWWVhcigpID8gIm51bWVyaWMiIDogdm9pZCAwCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCFncm91cHMuaGFzKGxhYmVsKSkgewogICAgICAgICAgZ3JvdXBzLnNldChsYWJlbCwgW10pOwogICAgICAgIH0KICAgICAgICBncm91cHMuZ2V0KGxhYmVsKS5wdXNoKGVudHJ5KTsKICAgICAgfQogICAgICByZXR1cm4gQXJyYXkuZnJvbShncm91cHMuZW50cmllcygpKS5tYXAoKFtsYWJlbCwgZW50cmllczJdKSA9PiAoewogICAgICAgIGxhYmVsLAogICAgICAgIGVudHJpZXM6IGVudHJpZXMyCiAgICAgIH0pKTsKICAgIH0KICAgIGlzU2FtZURheShkYXRlMSwgZGF0ZTIpIHsKICAgICAgcmV0dXJuIGRhdGUxLmdldEZ1bGxZZWFyKCkgPT09IGRhdGUyLmdldEZ1bGxZZWFyKCkgJiYgZGF0ZTEuZ2V0TW9udGgoKSA9PT0gZGF0ZTIuZ2V0TW9udGgoKSAmJiBkYXRlMS5nZXREYXRlKCkgPT09IGRhdGUyLmdldERhdGUoKTsKICAgIH0KICAgIGZvcm1hdFRpbWUoZGF0ZSkgewogICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVRpbWVTdHJpbmcoImVuLVVTIiwgewogICAgICAgIGhvdXI6ICIyLWRpZ2l0IiwKICAgICAgICBtaW51dGU6ICIyLWRpZ2l0IiwKICAgICAgICBob3VyMTI6IGZhbHNlCiAgICAgIH0pOwogICAgfQogICAgZ2V0SWNvbkZvclR5cGUodHlwZTUpIHsKICAgICAgY29uc3QgaWNvbnM1ID0gewogICAgICAgIGxvZ2luOiAibHVjaWRlOmxvZ0luIiwKICAgICAgICBsb2dvdXQ6ICJsdWNpZGU6bG9nT3V0IiwKICAgICAgICB2aWV3OiAibHVjaWRlOmV5ZSIsCiAgICAgICAgY3JlYXRlOiAibHVjaWRlOnBsdXMiLAogICAgICAgIHVwZGF0ZTogImx1Y2lkZTplZGl0IiwKICAgICAgICBkZWxldGU6ICJsdWNpZGU6dHJhc2gyIiwKICAgICAgICBjdXN0b206ICJsdWNpZGU6YWN0aXZpdHkiCiAgICAgIH07CiAgICAgIHJldHVybiBpY29uczVbdHlwZTVdIHx8IGljb25zNS5jdXN0b207CiAgICB9CiAgICBoYW5kbGVTZWFyY2hJbnB1dChlMTEpIHsKICAgICAgY29uc3QgdGFyZ2V0ID0gZTExLnRhcmdldDsKICAgICAgdGhpcy5zZWFyY2hRdWVyeSA9IHRhcmdldC52YWx1ZTsKICAgIH0KICAgIGhhbmRsZUNvbnRleHRNZW51KGUxMSwgZW50cnkpIHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIERlZXNDb250ZXh0bWVudS5vcGVuQ29udGV4dE1lbnVXaXRoT3B0aW9ucyhlMTEsIFsKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiQ29weSBhY3Rpdml0eSIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpjb3B5IiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChgJHtlbnRyeS51c2VyfSAke2VudHJ5Lm1lc3NhZ2V9YCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiRmlsdGVyIGJ5IHVzZXIiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6dXNlciIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgdGhpcy5maWx0ZXJDcml0ZXJpYSA9IHsgdXNlcjogZW50cnkudXNlciB9OwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIkZpbHRlciBieSB0eXBlIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmZpbHRlciIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgdGhpcy5maWx0ZXJDcml0ZXJpYSA9IHsgdHlwZTogZW50cnkudHlwZSB9OwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIkNsZWFyIGZpbHRlcnMiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6eCIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgdGhpcy5maWx0ZXJDcml0ZXJpYSA9IHt9OwogICAgICAgICAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gIiI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBdKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzOChfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0FwcHVpQWN0aXZpdHlsb2cyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1hcHB1aS9kZWVzLWFwcHVpLWFwcGJhci9kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkZW1vRnVuYzQgPSAoKSA9PiB7CiAgY29uc3QgbWVudUl0ZW1zID0gWwogICAgewogICAgICBuYW1lOiAiRmlsZSIsCiAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICB9LAogICAgICAvLyBOby1vcCBhY3Rpb24gZm9yIG1lbnUgd2l0aCBzdWJtZW51CiAgICAgIHN1Ym1lbnU6IFsKICAgICAgICB7IG5hbWU6ICJOZXcgRmlsZSIsIHNob3J0Y3V0OiAiQ21kK04iLCBpY29uTmFtZTogImZpbGUtcGx1cyIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIk5ldyBmaWxlIikgfSwKICAgICAgICB7IG5hbWU6ICJPcGVuLi4uIiwgc2hvcnRjdXQ6ICJDbWQrTyIsIGljb25OYW1lOiAiZm9sZGVyLW9wZW4iLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJPcGVuIikgfSwKICAgICAgICB7IG5hbWU6ICJPcGVuIFJlY2VudCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgIH0sIHN1Ym1lbnU6IFsKICAgICAgICAgIHsgbmFtZTogInByb2plY3QtYWxwaGEudHMiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJPcGVuIHJlY2VudCAxIikgfSwKICAgICAgICAgIHsgbmFtZTogImNvbmZpZy5qc29uIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiT3BlbiByZWNlbnQgMiIpIH0sCiAgICAgICAgICB7IG5hbWU6ICJyZWFkbWUubWQiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJPcGVuIHJlY2VudCAzIikgfQogICAgICAgIF0gfSwKICAgICAgICB7IGRpdmlkZXI6IHRydWUgfSwKICAgICAgICB7IG5hbWU6ICJTYXZlIiwgc2hvcnRjdXQ6ICJDbWQrUyIsIGljb25OYW1lOiAic2F2ZSIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlNhdmUiKSB9LAogICAgICAgIHsgbmFtZTogIlNhdmUgQXMuLi4iLCBzaG9ydGN1dDogIkNtZCtTaGlmdCtTIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiU2F2ZSBhcyIpLCBkaXNhYmxlZDogdHJ1ZSB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsgbmFtZTogIkV4aXQiLCBzaG9ydGN1dDogIkNtZCtRIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiRXhpdCIpIH0KICAgICAgXQogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkVkaXQiLAogICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgfSwKICAgICAgLy8gTm8tb3AgYWN0aW9uIGZvciBtZW51IHdpdGggc3VibWVudQogICAgICBzdWJtZW51OiBbCiAgICAgICAgeyBuYW1lOiAiVW5kbyIsIHNob3J0Y3V0OiAiQ21kK1oiLCBpY29uTmFtZTogInVuZG8iLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJVbmRvIikgfSwKICAgICAgICB7IG5hbWU6ICJSZWRvIiwgc2hvcnRjdXQ6ICJDbWQrU2hpZnQrWiIsIGljb25OYW1lOiAicmVkbyIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlJlZG8iKSB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsgbmFtZTogIkN1dCIsIHNob3J0Y3V0OiAiQ21kK1giLCBpY29uTmFtZTogInNjaXNzb3JzIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiQ3V0IikgfSwKICAgICAgICB7IG5hbWU6ICJDb3B5Iiwgc2hvcnRjdXQ6ICJDbWQrQyIsIGljb25OYW1lOiAiY29weSIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkNvcHkiKSB9LAogICAgICAgIHsgbmFtZTogIlBhc3RlIiwgc2hvcnRjdXQ6ICJDbWQrViIsIGljb25OYW1lOiAiY2xpcGJvYXJkIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiUGFzdGUiKSB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsgbmFtZTogIkZpbmQiLCBzaG9ydGN1dDogIkNtZCtGIiwgaWNvbk5hbWU6ICJzZWFyY2giLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJGaW5kIikgfSwKICAgICAgICB7IG5hbWU6ICJSZXBsYWNlIiwgc2hvcnRjdXQ6ICJDbWQrSCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlJlcGxhY2UiKSB9CiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJWaWV3IiwKICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgIH0sCiAgICAgIC8vIE5vLW9wIGFjdGlvbiBmb3IgbWVudSB3aXRoIHN1Ym1lbnUKICAgICAgc3VibWVudTogWwogICAgICAgIHsgbmFtZTogIlRvZ2dsZSBGdWxsc2NyZWVuIiwgc2hvcnRjdXQ6ICJGMTEiLCBpY29uTmFtZTogImV4cGFuZCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkZ1bGxzY3JlZW4iKSB9LAogICAgICAgIHsgbmFtZTogIlpvb20gSW4iLCBzaG9ydGN1dDogIkNtZCsrIiwgaWNvbk5hbWU6ICJ6b29tLWluIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiWm9vbSBpbiIpIH0sCiAgICAgICAgeyBuYW1lOiAiWm9vbSBPdXQiLCBzaG9ydGN1dDogIkNtZCstIiwgaWNvbk5hbWU6ICJ6b29tLW91dCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlpvb20gb3V0IikgfSwKICAgICAgICB7IG5hbWU6ICJSZXNldCBab29tIiwgc2hvcnRjdXQ6ICJDbWQrMCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlJlc2V0IHpvb20iKSB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsgbmFtZTogIlRvZ2dsZSBTaWRlYmFyIiwgc2hvcnRjdXQ6ICJDbWQrQiIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlRvZ2dsZSBzaWRlYmFyIikgfSwKICAgICAgICB7IG5hbWU6ICJUb2dnbGUgVGVybWluYWwiLCBzaG9ydGN1dDogIkNtZCtKIiwgaWNvbk5hbWU6ICJ0ZXJtaW5hbCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlRvZ2dsZSB0ZXJtaW5hbCIpIH0KICAgICAgXQogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkhlbHAiLAogICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgfSwKICAgICAgLy8gTm8tb3AgYWN0aW9uIGZvciBtZW51IHdpdGggc3VibWVudQogICAgICBzdWJtZW51OiBbCiAgICAgICAgeyBuYW1lOiAiRG9jdW1lbnRhdGlvbiIsIGljb25OYW1lOiAiYm9vayIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkRvY3VtZW50YXRpb24iKSB9LAogICAgICAgIHsgbmFtZTogIlJlbGVhc2UgTm90ZXMiLCBpY29uTmFtZTogImZpbGUtdGV4dCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlJlbGVhc2Ugbm90ZXMiKSB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsgbmFtZTogIlJlcG9ydCBJc3N1ZSIsIGljb25OYW1lOiAiYnVnIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiUmVwb3J0IGlzc3VlIikgfSwKICAgICAgICB7IG5hbWU6ICJBYm91dCIsIGljb25OYW1lOiAiaW5mbyIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkFib3V0IikgfQogICAgICBdCiAgICB9CiAgXTsKICByZXR1cm4gYjJgCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogICAgY29uc3QgYXBwYmFyID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjYXBwYmFyIik7CiAgICBjb25zdCBzdGF0dXNCdXR0b25zID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yQWxsKCIuc3RhdHVzLXRvZ2dsZSBkZWVzLWJ1dHRvbiIpOwogICAgc3RhdHVzQnV0dG9uc1swXS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgYXBwYmFyLnVzZXIgPSB7IC4uLmFwcGJhci51c2VyLCBzdGF0dXM6ICJvbmxpbmUiIH07CiAgICB9KTsKICAgIHN0YXR1c0J1dHRvbnNbMV0uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGFwcGJhci51c2VyID0geyAuLi5hcHBiYXIudXNlciwgc3RhdHVzOiAiYnVzeSIgfTsKICAgIH0pOwogICAgc3RhdHVzQnV0dG9uc1syXS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgYXBwYmFyLnVzZXIgPSB7IC4uLmFwcGJhci51c2VyLCBzdGF0dXM6ICJhd2F5IiB9OwogICAgfSk7CiAgICBzdGF0dXNCdXR0b25zWzNdLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgICBhcHBiYXIudXNlciA9IHsgLi4uYXBwYmFyLnVzZXIsIHN0YXR1czogIm9mZmxpbmUiIH07CiAgICB9KTsKICAgIGNvbnN0IHdpbmRvd0NvbnRyb2xzQnV0dG9uID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIud2luZG93LWNvbnRyb2xzLXRvZ2dsZSBkZWVzLWJ1dHRvbiIpOwogICAgd2luZG93Q29udHJvbHNCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGFwcGJhci5zaG93V2luZG93Q29udHJvbHMgPSAhYXBwYmFyLnNob3dXaW5kb3dDb250cm9sczsKICAgIH0pOwogICAgY29uc3QgYnJlYWRjcnVtYkJ1dHRvbnMgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3JBbGwoIi5icmVhZGNydW1iLXRvZ2dsZSBkZWVzLWJ1dHRvbiIpOwogICAgYnJlYWRjcnVtYkJ1dHRvbnNbMF0uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGFwcGJhci5icmVhZGNydW1icyA9ICJIb21lID4gRG9jdW1lbnRzID4gUHJvamVjdHMgPiBNeUFwcCA+IHNyYyA+IGluZGV4LnRzIjsKICAgIH0pOwogICAgYnJlYWRjcnVtYkJ1dHRvbnNbMV0uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGFwcGJhci5icmVhZGNydW1icyA9ICJEYXNoYm9hcmQiOwogICAgfSk7CiAgfX0+CiAgICAgIDxzdHlsZT4KICAgICAgICAke2lgCiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGhlaWdodDogNjAwcHg7CiAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgIGJhY2tncm91bmQ6ICMxYTFhMWE7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmNvbnRlbnQgewogICAgICAgICAgZmxleDogMTsKICAgICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgICBjb2xvcjogI2NjYzsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmNvbnRyb2xzIHsKICAgICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuY29udHJvbC1ncm91cCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogOHB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuY29udHJvbC1ncm91cCBsYWJlbCB7CiAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgICB9CiAgICAgIGB9CiAgICA8L3N0eWxlPgogICAgCiAgICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICAgIDxkZWVzLWFwcHVpLWFwcGJhcgogICAgICAgIGlkPSJhcHBiYXIiCiAgICAgICAgLm1lbnVJdGVtcz0ke21lbnVJdGVtc30KICAgICAgICAuYnJlYWRjcnVtYnM9JHsiUHJvamVjdCA+IHNyYyA+IGNvbXBvbmVudHMgPiBBcHBCYXIudHMifQogICAgICAgIC5icmVhZGNydW1iU2VwYXJhdG9yPSR7IiA+ICJ9CiAgICAgICAgLnNob3dXaW5kb3dDb250cm9scz0ke3RydWV9CiAgICAgICAgLnNob3dTZWFyY2g9JHt0cnVlfQogICAgICAgIC50aGVtZT0keyJkYXJrIn0KICAgICAgICAudXNlcj0ke3sKICAgIG5hbWU6ICJKb2huIERvZSIsCiAgICBzdGF0dXM6ICJvbmxpbmUiCiAgfX0KICAgICAgICBAbWVudS1zZWxlY3Q9JHsoZTExKSA9PiBjb25zb2xlLmxvZygiTWVudSBzZWxlY3RlZDoiLCBlMTEuZGV0YWlsLml0ZW0pfQogICAgICAgIEBicmVhZGNydW1iLW5hdmlnYXRlPSR7KGUxMSkgPT4gY29uc29sZS5sb2coIkJyZWFkY3J1bWIgY2xpY2tlZDoiLCBlMTEuZGV0YWlsKX0KICAgICAgICBAc2VhcmNoLWNsaWNrPSR7KCkgPT4gY29uc29sZS5sb2coIlNlYXJjaCBjbGlja2VkIil9CiAgICAgICAgQHVzZXItbWVudS1vcGVuPSR7KCkgPT4gY29uc29sZS5sb2coIlVzZXIgbWVudSBjbGlja2VkIil9CiAgICAgID48L2RlZXMtYXBwdWktYXBwYmFyPgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgPGgyPkFwcCBCYXIgRGVtbzwvaDI+CiAgICAgICAgPHA+VGhpcyBkZW1vIHNob3dzIHZhcmlvdXMgZmVhdHVyZXMgb2YgdGhlIGFwcCBiYXIgY29tcG9uZW50OjwvcD4KICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+RHluYW1pYyBtZW51IGl0ZW1zIHdpdGggaWNvbnMsIHNob3J0Y3V0cywgYW5kIHN1Ym1lbnVzPC9saT4KICAgICAgICAgIDxsaT5CcmVhZGNydW1iIG5hdmlnYXRpb248L2xpPgogICAgICAgICAgPGxpPlVzZXIgYWNjb3VudCBzZWN0aW9uIHdpdGggc3RhdHVzIGluZGljYXRvcjwvbGk+CiAgICAgICAgICA8bGk+U2VhcmNoIGljb248L2xpPgogICAgICAgICAgPGxpPldpbmRvdyBjb250cm9scyAocGxhdGZvcm0tc3BlY2lmaWMpPC9saT4KICAgICAgICAgIDxsaT5EYXJrL2xpZ2h0IHRoZW1lIHN1cHBvcnQ8L2xpPgogICAgICAgICAgPGxpPktleWJvYXJkIG5hdmlnYXRpb24gKFRhYiwgRW50ZXIsIEVzY2FwZSk8L2xpPgogICAgICAgICAgPGxpPkN1c3RvbSBldmVudHMgZm9yIGFsbCBpbnRlcmFjdGlvbnM8L2xpPgogICAgICAgIDwvdWw+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iY29udHJvbHMiPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtZ3JvdXAiPgogICAgICAgICAgPGxhYmVsPlRoZW1lPC9sYWJlbD4KICAgICAgICAgIDxkZWVzLWJ1dHRvbi1ncm91cCBjbGFzcz0idGhlbWUtdG9nZ2xlIj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPkRhcms8L2RlZXMtYnV0dG9uPgogICAgICAgICAgICA8ZGVlcy1idXR0b24+TGlnaHQ8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPC9kZWVzLWJ1dHRvbi1ncm91cD4KICAgICAgICA8L2Rpdj4KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWdyb3VwIj4KICAgICAgICAgIDxsYWJlbD5Vc2VyIFN0YXR1czwvbGFiZWw+CiAgICAgICAgICA8ZGVlcy1idXR0b24tZ3JvdXAgY2xhc3M9InN0YXR1cy10b2dnbGUiPgogICAgICAgICAgICA8ZGVlcy1idXR0b24+T25saW5lPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPkJ1c3k8L2RlZXMtYnV0dG9uPgogICAgICAgICAgICA8ZGVlcy1idXR0b24+QXdheTwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj5PZmZsaW5lPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDwvZGVlcy1idXR0b24tZ3JvdXA+CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ncm91cCI+CiAgICAgICAgICA8bGFiZWw+V2luZG93IENvbnRyb2xzPC9sYWJlbD4KICAgICAgICAgIDxkZWVzLWJ1dHRvbi1ncm91cCBjbGFzcz0id2luZG93LWNvbnRyb2xzLXRvZ2dsZSI+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj5Ub2dnbGU8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPC9kZWVzLWJ1dHRvbi1ncm91cD4KICAgICAgICA8L2Rpdj4KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWdyb3VwIj4KICAgICAgICAgIDxsYWJlbD5CcmVhZGNydW1iczwvbGFiZWw+CiAgICAgICAgICA8ZGVlcy1idXR0b24tZ3JvdXAgY2xhc3M9ImJyZWFkY3J1bWItdG9nZ2xlIj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPkxvbmcgUGF0aDwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj5TaG9ydCBQYXRoPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDwvZGVlcy1idXR0b24tZ3JvdXA+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgYDsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1hcHB1aS9kZWVzLWFwcHVpLWFwcGJhci9zdHlsZXMuanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIGFwcHVpQXBwYmFyU3R5bGVzID0gWwogIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgLyogQ1NTIFZhcmlhYmxlcyBmb3IgdGhlbWluZyAqLwogICAgICAgIC0tYXBwYmFyLWhlaWdodDogNDBweDsKICAgICAgICAtLWFwcGJhci1mb250LXNpemU6IDEycHg7CiAgICAgICAgCiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogdmFyKC0tYXBwYmFyLWhlaWdodCk7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTBlMGUwIiwgIiMyMDIwMjAiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzAwMDAwMCIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAwMDA4MCIsICIjZmZmZmZmODAiKX07CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS1hcHBiYXItZm9udC1zaXplKTsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogYXV0byAxZnIgYXV0bzsKICAgICAgICAtd2Via2l0LWFwcC1yZWdpb246IGRyYWc7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5tZW51cyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNHB4OwogICAgICAgIHBhZGRpbmc6IDAgOHB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgICAgcGFkZGluZzogMHB4IDEycHg7CiAgICAgICAgbWFyZ2luOiA4cHggMHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAtd2Via2l0LWFwcC1yZWdpb246IG5vLWRyYWc7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgIH0KCiAgICAgIC8qIE9wdGlvbmFsOiBTdHlsZSBmb3IgbWVudSBpdGVtcyB3aXRoIGljb25zIChub3QgdHlwaWNhbGx5IHVzZWQgZm9yIHRvcC1sZXZlbCBpdGVtcykgKi8KICAgICAgLm1lbnVJdGVtIGRlZXMtaWNvbiB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMDAwMDEwIiwgIiNmZmZmZmYyMCIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAwMDAiLCAiI2ZmZmZmZiIpfTsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAwMDAyMCIsICIjZmZmZmZmMzAiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwIiwgIiNmZmZmZmYiKX07CiAgICAgIH0KCiAgICAgIC5tZW51SXRlbVtkaXNhYmxlZF0gewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAubWVudUl0ZW06Zm9jdXMtdmlzaWJsZSB7CiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwODAiLCAiI2ZmZmZmZjgwIil9OwogICAgICB9CgoKICAgICAgLyogRHJvcGRvd24gc3R5bGVzICovCiAgICAgIC5kcm9wZG93biB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMTAwJTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIG1pbi13aWR0aDogMjAwcHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzAwMDAwMCIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2UwZTBlMCIsICIjMjAyMDIwIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBib3gtc2hhZG93OiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiMCA0cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuMTUpIiwgIjAgNHB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjMpIil9OwogICAgICAgIG1hcmdpbi10b3A6IDRweDsKICAgICAgICB6LWluZGV4OiAxMDAwOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMHB4KTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMsIHRyYW5zZm9ybSAwLjJzOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAuZHJvcGRvd24ub3BlbiB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgIH0KCiAgICAgIC5kcm9wZG93bi1pdGVtIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTZweDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xczsKICAgICAgfQoKICAgICAgLmRyb3Bkb3duLWl0ZW06aG92ZXIsCiAgICAgIC5kcm9wZG93bi1pdGVtLmZvY3VzZWQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwMTAiLCAiI2ZmZmZmZjIwIil9OwogICAgICB9CgogICAgICAuZHJvcGRvd24tZGl2aWRlciB7CiAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlMGUwZTAiLCAiIzIwMjAyMCIpfTsKICAgICAgICBtYXJnaW46IDRweCAwOwogICAgICB9CgogICAgICAuZHJvcGRvd24taXRlbVtkaXNhYmxlZF0gewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAuZHJvcGRvd24taXRlbSAuc2hvcnRjdXQgewogICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgIH0KCiAgICAgIC8qIEJyZWFkY3J1bWJzICovCiAgICAgIC5icmVhZGNydW1icyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBwYWRkaW5nOiAwIDE2cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAuYnJlYWRjcnVtYi1pdGVtIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAwMDA4MCIsICIjZmZmZmZmODAiKX07CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMnM7CiAgICAgIH0KCiAgICAgIC5icmVhZGNydW1iLWl0ZW06aG92ZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMDAwMCIsICIjZmZmZmZmIil9OwogICAgICB9CgogICAgICAuYnJlYWRjcnVtYi1zZXBhcmF0b3IgewogICAgICAgIG1hcmdpbjogMCA4cHg7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAvKiBBY2NvdW50IHNlY3Rpb24gKi8KICAgICAgLmFjY291bnQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgICBnYXA6IDEycHg7CiAgICAgIH0KCiAgICAgIC5zZWFyY2gtaWNvbiB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIG9wYWNpdHk6IDAuNzsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7CiAgICAgIH0KCiAgICAgIC5zZWFyY2gtaWNvbjpob3ZlciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLnVzZXItaW5mbyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnM7CiAgICAgIH0KCiAgICAgIC51c2VyLWluZm86aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwMTAiLCAiI2ZmZmZmZjIwIil9OwogICAgICB9CgogICAgICAudXNlci1hdmF0YXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMjRweDsKICAgICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwMjAiLCAiI2ZmZmZmZjMwIil9OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC51c2VyLWF2YXRhciBpbWcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgb2JqZWN0LWZpdDogY292ZXI7CiAgICAgIH0KCiAgICAgIC51c2VyLXN0YXR1cyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogLTJweDsKICAgICAgICByaWdodDogLTJweDsKICAgICAgICB3aWR0aDogOHB4OwogICAgICAgIGhlaWdodDogOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMDAwMDAwIil9OwogICAgICB9CgogICAgICAudXNlci1zdGF0dXMub25saW5lIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjNGNhZjUwOwogICAgICB9CgogICAgICAudXNlci1zdGF0dXMub2ZmbGluZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzc1NzU3NTsKICAgICAgfQoKICAgICAgLnVzZXItc3RhdHVzLmJ1c3kgewogICAgICAgIGJhY2tncm91bmQ6ICNmNDQzMzY7CiAgICAgIH0KCiAgICAgIC51c2VyLXN0YXR1cy5hd2F5IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmY5ODAwOwogICAgICB9CgogICAgICAvKiBBY3Rpdml0eSBsb2cgdG9nZ2xlIGJ1dHRvbiAqLwogICAgICAuYWN0aXZpdHktdG9nZ2xlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiAycHg7CiAgICAgICAgaGVpZ2h0OiAyOHB4OwogICAgICAgIHBhZGRpbmc6IDAgOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgLXdlYmtpdC1hcHAtcmVnaW9uOiBuby1kcmFnOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMDAwMDYwIiwgIiNmZmZmZmY2MCIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjEpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLmFjdGl2aXR5LXRvZ2dsZTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAwMDAxMCIsICIjZmZmZmZmMTUiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwIiwgIiNmZmZmZmYiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgLmFjdGl2aXR5LXRvZ2dsZS5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwMTUiLCAiI2ZmZmZmZjIwIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMDAwMCIsICIjZmZmZmZmIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC5hY3Rpdml0eS10b2dnbGUgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIC5hY3Rpdml0eS1iYWRnZSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7CiAgICAgICAgbWluLXdpZHRoOiAxNnB4OwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBwYWRkaW5nOiAwIDRweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzUyNTI1MiIsICIjNTI1MjUyIil9OwogICAgICAgIGNvbG9yOiAjZmFmYWZhOwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgIH0KICAgIGAKXTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1hcHB1aS9kZWVzLWFwcHVpLWFwcGJhci90ZW1wbGF0ZS5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgcmVuZGVyQXBwdWlBcHBiYXIgPSAoY29tcG9uZW50KSA9PiB7CiAgcmV0dXJuIGIyYAogICAgICAgIDxkaXYgY2xhc3M9Im1lbnVzIj4KICAgICAgICAgICR7Y29tcG9uZW50LnNob3dXaW5kb3dDb250cm9scyA/IGIyYDxkZWVzLXdpbmRvd2NvbnRyb2xzPjwvZGVlcy13aW5kb3djb250cm9scz5gIDogIiJ9CiAgICAgICAgICAke2NvbXBvbmVudC5yZW5kZXJNZW51SXRlbXMoKX0KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJicmVhZGNydW1icyI+CiAgICAgICAgICAke2NvbXBvbmVudC5yZW5kZXJCcmVhZGNydW1icygpfQogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImFjY291bnQiPgogICAgICAgICAgJHtjb21wb25lbnQucmVuZGVyQWNjb3VudFNlY3Rpb24oKX0KICAgICAgICA8L2Rpdj4KICAgICAgYDsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC11dGlsaXR5L2RlZXMtd2luZG93Y29udHJvbHMvZGVlcy13aW5kb3djb250cm9scy5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU4ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM5ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzV2luZG93Q29udHJvbHMgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtd2luZG93Y29udHJvbHMiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF90eXBlX2RlY29yYXRvcnM7CiAgbGV0IF90eXBlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdHlwZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcG9zaXRpb25fZGVjb3JhdG9yczsKICBsZXQgX3Bvc2l0aW9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcG9zaXRpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1dpbmRvd0NvbnRyb2xzMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3R5cGVfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgcmVmbGVjdDogdHJ1ZQogICAgICB9KV07CiAgICAgIF9wb3NpdGlvbl9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICByZWZsZWN0OiB0cnVlCiAgICAgIH0pXTsKICAgICAgX19lc0RlY29yYXRlOCh0aGlzLCBudWxsLCBfdHlwZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0eXBlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0eXBlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnR5cGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnR5cGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdHlwZV9pbml0aWFsaXplcnMsIF90eXBlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOCh0aGlzLCBudWxsLCBfcG9zaXRpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicG9zaXRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInBvc2l0aW9uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnBvc2l0aW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5wb3NpdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wb3NpdGlvbl9pbml0aWFsaXplcnMsIF9wb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTgobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzV2luZG93Q29udHJvbHMyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIC8vIFNUQVRJQwogICAgc3RhdGljIGRlbW8gPSAoKSA9PiBiMmA8ZGVlcy13aW5kb3djb250cm9scz48L2RlZXMtd2luZG93Y29udHJvbHM+YDsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJVdGlsaXR5Il07CiAgICAjdHlwZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM5KHRoaXMsIF90eXBlX2luaXRpYWxpemVycywgIm1hYyIpOwogICAgLy8gSW5zdGFuY2UKICAgIGdldCB0eXBlKCkgewogICAgICByZXR1cm4gdGhpcy4jdHlwZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHR5cGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3R5cGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNwb3NpdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOSh0aGlzLCBfdHlwZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOSh0aGlzLCBfcG9zaXRpb25faW5pdGlhbGl6ZXJzLCAibGVmdCIpKTsKICAgIGdldCBwb3NpdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Bvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcG9zaXRpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI3Bvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIHBhZGRpbmctbGVmdDogMTZweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxNnB4OwogICAgICB9CgogICAgICAud2luZG93Q29udHJvbHMgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAud2luZG93Q29udHJvbHMgZGl2IHsKICAgICAgICB3aWR0aDogMTJweDsKICAgICAgICBoZWlnaHQ6IDEycHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBtYXJnaW46IDBweDsKICAgICAgICBwYWRkaW5nOiAwcHg7CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjIyMjsKICAgICAgfQoKICAgICAgLndpbmRvd0NvbnRyb2xzIGRpdi5jbG9zZSB7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmNWY1NzsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDEycHg7CiAgICAgIH0KCiAgICAgIC53aW5kb3dDb250cm9scyBkaXYudG9Eb2NrIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZiZDJlOwogICAgICAgIG1hcmdpbi1yaWdodDogMTJweDsKICAgICAgfQoKICAgICAgLndpbmRvd0NvbnRyb2xzIGRpdi5taW5NYXggewogICAgICAgIGJhY2tncm91bmQ6ICMyN2M5M2Y7CiAgICAgIH0KCiAgICAgIC53aW5kb3dDb250cm9scyBkaXY6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICMzMzMzMzM7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgJHt0aGlzLnR5cGUgPT09ICJtYWMiICYmIHRoaXMucG9zaXRpb24gPT09ICJsZWZ0IiB8fCAodGhpcy50eXBlID09PSAibGludXgiIHx8IHRoaXMudHlwZSA9PT0gIndpbmRvd3MiKSAmJiB0aGlzLnBvc2l0aW9uID09PSAicmlnaHQiID8gYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IndpbmRvd0NvbnRyb2xzIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjbG9zZSI+PC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9Eb2NrIj48L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtaW5NYXgiPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGAgOiBiMmBgfQogICAgYDsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczkodGhpcywgX3Bvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzOShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1dpbmRvd0NvbnRyb2xzMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtYXBwdWkvZGVlcy1hcHB1aS1wcm9maWxlZHJvcGRvd24vZGVlcy1hcHB1aS1wcm9maWxlZHJvcGRvd24uanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlOSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMTAgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNBcHB1aVByb2ZpbGVEcm9wZG93biA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1hcHB1aS1wcm9maWxlZHJvcGRvd24iKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF91c2VyX2RlY29yYXRvcnM7CiAgbGV0IF91c2VyX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdXNlcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWVudUl0ZW1zX2RlY29yYXRvcnM7CiAgbGV0IF9tZW51SXRlbXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tZW51SXRlbXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzT3Blbl9kZWNvcmF0b3JzOwogIGxldCBfaXNPcGVuX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNPcGVuX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wb3NpdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfcG9zaXRpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzQXBwdWlQcm9maWxlRHJvcGRvd24yID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfdXNlcl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogT2JqZWN0IH0pXTsKICAgICAgX21lbnVJdGVtc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfaXNPcGVuX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0pXTsKICAgICAgX3Bvc2l0aW9uX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfX2VzRGVjb3JhdGU5KHRoaXMsIG51bGwsIF91c2VyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInVzZXIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInVzZXIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudXNlciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudXNlciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF91c2VyX2luaXRpYWxpemVycywgX3VzZXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5KHRoaXMsIG51bGwsIF9tZW51SXRlbXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWVudUl0ZW1zIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtZW51SXRlbXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWVudUl0ZW1zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tZW51SXRlbXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWVudUl0ZW1zX2luaXRpYWxpemVycywgX21lbnVJdGVtc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTkodGhpcywgbnVsbCwgX2lzT3Blbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc09wZW4iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImlzT3BlbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc09wZW4sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzT3BlbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pc09wZW5faW5pdGlhbGl6ZXJzLCBfaXNPcGVuX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOSh0aGlzLCBudWxsLCBfcG9zaXRpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicG9zaXRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInBvc2l0aW9uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnBvc2l0aW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5wb3NpdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wb3NpdGlvbl9pbml0aWFsaXplcnMsIF9wb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTkobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzQXBwdWlQcm9maWxlRHJvcGRvd24yID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gKCkgPT4gYjJgCiAgICA8ZGVlcy1hcHB1aS1wcm9maWxlZHJvcGRvd24KICAgICAgLnVzZXI9JHt7CiAgICAgIG5hbWU6ICJKb2huIERvZSIsCiAgICAgIGVtYWlsOiAiam9obi5kb2VAZXhhbXBsZS5jb20iLAogICAgICBhdmF0YXI6ICJodHRwczovL3JhbmRvbXVzZXIubWUvYXBpL3BvcnRyYWl0cy9tZW4vMS5qcGciLAogICAgICBzdGF0dXM6ICJvbmxpbmUiCiAgICB9fQogICAgICAubWVudUl0ZW1zPSR7WwogICAgICB7IG5hbWU6ICJQcm9maWxlIFNldHRpbmdzIiwgaWNvbk5hbWU6ICJ1c2VyIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiUHJvZmlsZSIpIH0sCiAgICAgIHsgbmFtZTogIkFjY291bnQiLCBpY29uTmFtZTogInNldHRpbmdzIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiQWNjb3VudCIpIH0sCiAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICB7IG5hbWU6ICJIZWxwICYgU3VwcG9ydCIsIGljb25OYW1lOiAiaGVscENpcmNsZSIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkhlbHAiKSB9LAogICAgICB7IG5hbWU6ICJLZXlib2FyZCBTaG9ydGN1dHMiLCBpY29uTmFtZTogImtleWJvYXJkIiwgc2hvcnRjdXQ6ICJDbWQrSyIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlNob3J0Y3V0cyIpIH0sCiAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICB7IG5hbWU6ICJTaWduIE91dCIsIGljb25OYW1lOiAibG9nT3V0IiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiU2lnbiBvdXQiKSB9CiAgICBdfQogICAgICAuaXNPcGVuPSR7dHJ1ZX0KICAgID48L2RlZXMtYXBwdWktcHJvZmlsZWRyb3Bkb3duPgogIGA7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiQXBwIFVJIl07CiAgICAjdXNlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMxMCh0aGlzLCBfdXNlcl9pbml0aWFsaXplcnMsIHZvaWQgMCk7CiAgICBnZXQgdXNlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3VzZXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB1c2VyKHZhbHVlMikgewogICAgICB0aGlzLiN1c2VyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWVudUl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxMCh0aGlzLCBfdXNlcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTAodGhpcywgX21lbnVJdGVtc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgbWVudUl0ZW1zKCkgewogICAgICByZXR1cm4gdGhpcy4jbWVudUl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWVudUl0ZW1zKHZhbHVlMikgewogICAgICB0aGlzLiNtZW51SXRlbXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpc09wZW5fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczEwKHRoaXMsIF9tZW51SXRlbXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczEwKHRoaXMsIF9pc09wZW5faW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGlzT3BlbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzT3Blbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzT3Blbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXNPcGVuX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczEwKHRoaXMsIF9pc09wZW5fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczEwKHRoaXMsIF9wb3NpdGlvbl9pbml0aWFsaXplcnMsICJ0b3AtcmlnaHQiKSk7CiAgICBnZXQgcG9zaXRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNwb3NpdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHBvc2l0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNwb3NpdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxMDAlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5kcm9wZG93biB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIG1pbi13aWR0aDogMjIwcHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzAwMDAwMCIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2UwZTBlMCIsICIjMjAyMDIwIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBib3gtc2hhZG93OiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiMCA0cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuMTUpIiwgIjAgNHB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjMpIil9OwogICAgICAgIHotaW5kZXg6ICR7ekluZGV4TGF5ZXJzLm92ZXJsYXkuZHJvcGRvd259OwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk1KSB0cmFuc2xhdGVZKC0xMHB4KTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMsIHRyYW5zZm9ybSAwLjJzOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICB9CgogICAgICA6aG9zdChbaXNvcGVuXSkgLmRyb3Bkb3duIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSkgdHJhbnNsYXRlWSgwKTsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgfQogICAgICAKICAgICAgLmJhY2tkcm9wIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBQb3NpdGlvbiB2YXJpYW50cyAqLwogICAgICAuZHJvcGRvd24udG9wLXJpZ2h0IHsKICAgICAgICB0b3A6IDEwMCU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICB9CgogICAgICAuZHJvcGRvd24udG9wLWxlZnQgewogICAgICAgIHRvcDogMTAwJTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIG1hcmdpbi10b3A6IDhweDsKICAgICAgfQoKICAgICAgLmRyb3Bkb3duLmJvdHRvbS1yaWdodCB7CiAgICAgICAgYm90dG9tOiAxMDAlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgfQoKICAgICAgLmRyb3Bkb3duLmJvdHRvbS1sZWZ0IHsKICAgICAgICBib3R0b206IDEwMCU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICAgIH0KCiAgICAgIC8qIFVzZXIgc2VjdGlvbiAqLwogICAgICAudXNlci1zZWN0aW9uIHsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2UwZTBlMCIsICIjMjAyMDIwIil9OwogICAgICB9CgogICAgICAudXNlci1pbmZvIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiAxMHB4OwogICAgICB9CgogICAgICAudXNlci1hdmF0YXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMzZweDsKICAgICAgICBoZWlnaHQ6IDM2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjBmMGYwIiwgIiMxYTFhMWEiKX07CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzY2NiIsICIjOTk5Iil9OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC51c2VyLWF2YXRhciBpbWcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvYmplY3QtZml0OiBjb3ZlcjsKICAgICAgfQoKICAgICAgLnVzZXItc3RhdHVzIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICAgIGhlaWdodDogMTBweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzAwMDAwMCIpfTsKICAgICAgfQoKICAgICAgLnVzZXItc3RhdHVzLm9ubGluZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzRjYWY1MDsKICAgICAgfQoKICAgICAgLnVzZXItc3RhdHVzLm9mZmxpbmUgewogICAgICAgIGJhY2tncm91bmQ6ICM3NTc1NzU7CiAgICAgIH0KCiAgICAgIC51c2VyLXN0YXR1cy5idXN5IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjQ0MzM2OwogICAgICB9CgogICAgICAudXNlci1zdGF0dXMuYXdheSB7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmOTgwMDsKICAgICAgfQoKICAgICAgLnVzZXItZGV0YWlscyB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC51c2VyLW5hbWUgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMCIsICIjZmZmIil9OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgfQoKICAgICAgLnVzZXItZW1haWwgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2NjYiLCAiIzk5OSIpfTsKICAgICAgICBtYXJnaW4tdG9wOiAycHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CgogICAgICAvKiBNZW51IHNlY3Rpb24gKi8KICAgICAgLm1lbnUtc2VjdGlvbiB7CiAgICAgICAgcGFkZGluZzogNHB4IDA7CiAgICAgIH0KCiAgICAgIC5tZW51LWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzMzMyIsICIjY2NjIil9OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgLm1lbnUtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wNCkiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSIpfTsKICAgICAgfQoKICAgICAgLm1lbnUtaXRlbTphY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDgpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikiKX07CiAgICAgIH0KCiAgICAgIC5tZW51LWl0ZW0gZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgb3BhY2l0eTogMC43OwogICAgICB9CgogICAgICAubWVudS1pdGVtLXRleHQgewogICAgICAgIGZsZXg6IDE7CiAgICAgIH0KCiAgICAgIC5tZW51LXNob3J0Y3V0IHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOTk5IiwgIiM2NjYiKX07CiAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICAgICAgb3BhY2l0eTogMC43OwogICAgICB9CgogICAgICAubWVudS1kaXZpZGVyIHsKICAgICAgICBoZWlnaHQ6IDFweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2UwZTBlMCIsICIjMjAyMDIwIil9OwogICAgICAgIG1hcmdpbjogNHB4IDA7CiAgICAgIH0KCiAgICAgIC8qIEJhY2tkcm9wIGZvciBtb2JpbGUgKi8KICAgICAgQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgICAgICAgLmJhY2tkcm9wIHsKICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICAgIHRvcDogMDsKICAgICAgICAgIGxlZnQ6IDA7CiAgICAgICAgICByaWdodDogMDsKICAgICAgICAgIGJvdHRvbTogMDsKICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgICAgICAgIHotaW5kZXg6ICR7ekluZGV4TGF5ZXJzLmJhY2tkcm9wLmRyb3Bkb3dufTsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7CiAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoW2lzb3Blbl0pIC5iYWNrZHJvcCB7CiAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgICB9CgogICAgICAgIC5kcm9wZG93biB7CiAgICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgICB0b3A6IDUwJTsKICAgICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgICAgYm90dG9tOiBhdXRvOwogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgc2NhbGUoMC45NSk7CiAgICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgICBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSAzMnB4KTsKICAgICAgICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwdmggLSAzMnB4KTsKICAgICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoW2lzb3Blbl0pIC5kcm9wZG93biB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSBzY2FsZSgxKTsKICAgICAgICB9CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iYmFja2Ryb3AiIEBjbGljaz0keygpID0+IHRoaXMuY2xvc2UoKX0+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImRyb3Bkb3duICR7dGhpcy5wb3NpdGlvbn0iPgogICAgICAgICR7dGhpcy51c2VyID8gYjJgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJ1c2VyLXNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1c2VyLWluZm8iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InVzZXItYXZhdGFyIj4KICAgICAgICAgICAgICAgICR7dGhpcy51c2VyLmF2YXRhciA/IGIyYDxpbWcgc3JjPSIke3RoaXMudXNlci5hdmF0YXJ9IiBhbHQ9IiR7dGhpcy51c2VyLm5hbWV9Ij5gIDogdGhpcy5nZXRJbml0aWFscyh0aGlzLnVzZXIubmFtZSl9CiAgICAgICAgICAgICAgICAke3RoaXMudXNlci5zdGF0dXMgPyBiMmAKICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idXNlci1zdGF0dXMgJHt0aGlzLnVzZXIuc3RhdHVzfSI+PC9kaXY+CiAgICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idXNlci1kZXRhaWxzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InVzZXItbmFtZSI+JHt0aGlzLnVzZXIubmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICR7dGhpcy51c2VyLmVtYWlsID8gYjJgCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InVzZXItZW1haWwiPiR7dGhpcy51c2VyLmVtYWlsfTwvZGl2PgogICAgICAgICAgICAgICAgYCA6ICIifQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGAgOiAiIn0KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJtZW51LXNlY3Rpb24iPgogICAgICAgICAgJHt0aGlzLm1lbnVJdGVtcy5tYXAoKGl0ZW0pID0+IHRoaXMucmVuZGVyTWVudUl0ZW0oaXRlbSkpfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJNZW51SXRlbShpdGVtKSB7CiAgICAgIGlmICgiZGl2aWRlciIgaW4gaXRlbSAmJiBpdGVtLmRpdmlkZXIpIHsKICAgICAgICByZXR1cm4gYjJgPGRpdiBjbGFzcz0ibWVudS1kaXZpZGVyIj48L2Rpdj5gOwogICAgICB9CiAgICAgIGNvbnN0IG1lbnVJdGVtID0gaXRlbTsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJtZW51LWl0ZW0iIEBjbGljaz0keygpID0+IHRoaXMuaGFuZGxlTWVudUNsaWNrKG1lbnVJdGVtKX0+CiAgICAgICAgJHttZW51SXRlbS5pY29uTmFtZSA/IGIyYAogICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0iJHtgbHVjaWRlOiR7bWVudUl0ZW0uaWNvbk5hbWV9YH0iPjwvZGVlcy1pY29uPgogICAgICAgIGAgOiAiIn0KICAgICAgICA8c3BhbiBjbGFzcz0ibWVudS1pdGVtLXRleHQiPiR7bWVudUl0ZW0ubmFtZX08L3NwYW4+CiAgICAgICAgJHttZW51SXRlbS5zaG9ydGN1dCA/IGIyYAogICAgICAgICAgPHNwYW4gY2xhc3M9Im1lbnUtc2hvcnRjdXQiPiR7bWVudUl0ZW0uc2hvcnRjdXR9PC9zcGFuPgogICAgICAgIGAgOiAiIn0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgZ2V0SW5pdGlhbHMobmFtZSkgewogICAgICByZXR1cm4gbmFtZS5zcGxpdCgiICIpLm1hcCgocGFydCkgPT4gcGFydFswXSkuam9pbigiIikudG9VcHBlckNhc2UoKS5zbGljZSgwLCAyKTsKICAgIH0KICAgIGFzeW5jIGhhbmRsZU1lbnVDbGljayhpdGVtKSB7CiAgICAgIGF3YWl0IGl0ZW0uYWN0aW9uKCk7CiAgICAgIHRoaXMuY2xvc2UoKTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgibWVudS1zZWxlY3QiLCB7CiAgICAgICAgZGV0YWlsOiB7IGl0ZW0gfSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIG9wZW4oKSB7CiAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTsKICAgIH0KICAgIGNsb3NlKCkgewogICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlOwogICAgfQogICAgdG9nZ2xlKCkgewogICAgICB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjsKICAgIH0KICAgIC8vIEhhbmRsZSBjbGlja3Mgb3V0c2lkZSB0aGUgZHJvcGRvd24KICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLmhhbmRsZU91dHNpZGVDbGljayA9IHRoaXMuaGFuZGxlT3V0c2lkZUNsaWNrLmJpbmQodGhpcyk7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2spOwogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIiwgdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2spOwogICAgfQogICAgaGFuZGxlT3V0c2lkZUNsaWNrKGV2ZW50KSB7CiAgICAgIGlmICh0aGlzLmlzT3BlbiAmJiAhdGhpcy5jb250YWlucyhldmVudC50YXJnZXQpKSB7CiAgICAgICAgY29uc3QgcGFyZW50RWxlbWVudCA9IHRoaXMucGFyZW50RWxlbWVudDsKICAgICAgICBpZiAocGFyZW50RWxlbWVudCAmJiBwYXJlbnRFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5jbG9zZSgpOwogICAgICB9CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnMxMCh0aGlzLCBfcG9zaXRpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnMxMChfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0FwcHVpUHJvZmlsZURyb3Bkb3duMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtYXBwdWkvZGVlcy1hcHB1aS1hcHBiYXIvY29tcG9uZW50LmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfZGlzdF90czI5KCk7CmluaXRfZGVlc19pY29uKCk7CnZhciBfX2VzRGVjb3JhdGUxMCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMTEgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNBcHB1aUJhciA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1hcHB1aS1hcHBiYXIiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9tZW51SXRlbXNfZGVjb3JhdG9yczsKICBsZXQgX21lbnVJdGVtc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21lbnVJdGVtc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYnJlYWRjcnVtYnNfZGVjb3JhdG9yczsKICBsZXQgX2JyZWFkY3J1bWJzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYnJlYWRjcnVtYnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2JyZWFkY3J1bWJTZXBhcmF0b3JfZGVjb3JhdG9yczsKICBsZXQgX2JyZWFkY3J1bWJTZXBhcmF0b3JfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9icmVhZGNydW1iU2VwYXJhdG9yX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93V2luZG93Q29udHJvbHNfZGVjb3JhdG9yczsKICBsZXQgX3Nob3dXaW5kb3dDb250cm9sc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dXaW5kb3dDb250cm9sc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdXNlcl9kZWNvcmF0b3JzOwogIGxldCBfdXNlcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3VzZXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Byb2ZpbGVNZW51SXRlbXNfZGVjb3JhdG9yczsKICBsZXQgX3Byb2ZpbGVNZW51SXRlbXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wcm9maWxlTWVudUl0ZW1zX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93U2VhcmNoX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93U2VhcmNoX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1NlYXJjaF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0FjdGl2aXR5TG9nVG9nZ2xlX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93QWN0aXZpdHlMb2dUb2dnbGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93QWN0aXZpdHlMb2dUb2dnbGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FjdGl2aXR5TG9nQ291bnRfZGVjb3JhdG9yczsKICBsZXQgX2FjdGl2aXR5TG9nQ291bnRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY3Rpdml0eUxvZ0NvdW50X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY3Rpdml0eUxvZ0FjdGl2ZV9kZWNvcmF0b3JzOwogIGxldCBfYWN0aXZpdHlMb2dBY3RpdmVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY3Rpdml0eUxvZ0FjdGl2ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWN0aXZlTWVudV9kZWNvcmF0b3JzOwogIGxldCBfYWN0aXZlTWVudV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FjdGl2ZU1lbnVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX29wZW5Ecm9wZG93bnNfZGVjb3JhdG9yczsKICBsZXQgX29wZW5Ecm9wZG93bnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vcGVuRHJvcGRvd25zX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9mb2N1c2VkSXRlbV9kZWNvcmF0b3JzOwogIGxldCBfZm9jdXNlZEl0ZW1faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9mb2N1c2VkSXRlbV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZm9jdXNlZERyb3Bkb3duSXRlbV9kZWNvcmF0b3JzOwogIGxldCBfZm9jdXNlZERyb3Bkb3duSXRlbV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ZvY3VzZWREcm9wZG93bkl0ZW1fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzUHJvZmlsZURyb3Bkb3duT3Blbl9kZWNvcmF0b3JzOwogIGxldCBfaXNQcm9maWxlRHJvcGRvd25PcGVuX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNQcm9maWxlRHJvcGRvd25PcGVuX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNBcHB1aUJhcjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9tZW51SXRlbXNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX2JyZWFkY3J1bWJzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfYnJlYWRjcnVtYlNlcGFyYXRvcl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3Nob3dXaW5kb3dDb250cm9sc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF91c2VyX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBPYmplY3QgfSldOwogICAgICBfcHJvZmlsZU1lbnVJdGVtc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfc2hvd1NlYXJjaF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9zaG93QWN0aXZpdHlMb2dUb2dnbGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfYWN0aXZpdHlMb2dDb3VudF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX2FjdGl2aXR5TG9nQWN0aXZlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2FjdGl2ZU1lbnVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX29wZW5Ecm9wZG93bnNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2ZvY3VzZWRJdGVtX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9mb2N1c2VkRHJvcGRvd25JdGVtX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pc1Byb2ZpbGVEcm9wZG93bk9wZW5fZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlMTAodGhpcywgbnVsbCwgX21lbnVJdGVtc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtZW51SXRlbXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1lbnVJdGVtcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tZW51SXRlbXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1lbnVJdGVtcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tZW51SXRlbXNfaW5pdGlhbGl6ZXJzLCBfbWVudUl0ZW1zX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTAodGhpcywgbnVsbCwgX2JyZWFkY3J1bWJzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImJyZWFkY3J1bWJzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJicmVhZGNydW1icyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5icmVhZGNydW1icywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYnJlYWRjcnVtYnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYnJlYWRjcnVtYnNfaW5pdGlhbGl6ZXJzLCBfYnJlYWRjcnVtYnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxMCh0aGlzLCBudWxsLCBfYnJlYWRjcnVtYlNlcGFyYXRvcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJicmVhZGNydW1iU2VwYXJhdG9yIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJicmVhZGNydW1iU2VwYXJhdG9yIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmJyZWFkY3J1bWJTZXBhcmF0b3IsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmJyZWFkY3J1bWJTZXBhcmF0b3IgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYnJlYWRjcnVtYlNlcGFyYXRvcl9pbml0aWFsaXplcnMsIF9icmVhZGNydW1iU2VwYXJhdG9yX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTAodGhpcywgbnVsbCwgX3Nob3dXaW5kb3dDb250cm9sc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93V2luZG93Q29udHJvbHMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNob3dXaW5kb3dDb250cm9scyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93V2luZG93Q29udHJvbHMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dXaW5kb3dDb250cm9scyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93V2luZG93Q29udHJvbHNfaW5pdGlhbGl6ZXJzLCBfc2hvd1dpbmRvd0NvbnRyb2xzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTAodGhpcywgbnVsbCwgX3VzZXJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidXNlciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidXNlciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai51c2VyLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai51c2VyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3VzZXJfaW5pdGlhbGl6ZXJzLCBfdXNlcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTEwKHRoaXMsIG51bGwsIF9wcm9maWxlTWVudUl0ZW1zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInByb2ZpbGVNZW51SXRlbXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInByb2ZpbGVNZW51SXRlbXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucHJvZmlsZU1lbnVJdGVtcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucHJvZmlsZU1lbnVJdGVtcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wcm9maWxlTWVudUl0ZW1zX2luaXRpYWxpemVycywgX3Byb2ZpbGVNZW51SXRlbXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxMCh0aGlzLCBudWxsLCBfc2hvd1NlYXJjaF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93U2VhcmNoIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93U2VhcmNoIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dTZWFyY2gsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dTZWFyY2ggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd1NlYXJjaF9pbml0aWFsaXplcnMsIF9zaG93U2VhcmNoX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTAodGhpcywgbnVsbCwgX3Nob3dBY3Rpdml0eUxvZ1RvZ2dsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93QWN0aXZpdHlMb2dUb2dnbGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNob3dBY3Rpdml0eUxvZ1RvZ2dsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93QWN0aXZpdHlMb2dUb2dnbGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dBY3Rpdml0eUxvZ1RvZ2dsZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93QWN0aXZpdHlMb2dUb2dnbGVfaW5pdGlhbGl6ZXJzLCBfc2hvd0FjdGl2aXR5TG9nVG9nZ2xlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTAodGhpcywgbnVsbCwgX2FjdGl2aXR5TG9nQ291bnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYWN0aXZpdHlMb2dDb3VudCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYWN0aXZpdHlMb2dDb3VudCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hY3Rpdml0eUxvZ0NvdW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hY3Rpdml0eUxvZ0NvdW50ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FjdGl2aXR5TG9nQ291bnRfaW5pdGlhbGl6ZXJzLCBfYWN0aXZpdHlMb2dDb3VudF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTEwKHRoaXMsIG51bGwsIF9hY3Rpdml0eUxvZ0FjdGl2ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhY3Rpdml0eUxvZ0FjdGl2ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYWN0aXZpdHlMb2dBY3RpdmUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWN0aXZpdHlMb2dBY3RpdmUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFjdGl2aXR5TG9nQWN0aXZlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FjdGl2aXR5TG9nQWN0aXZlX2luaXRpYWxpemVycywgX2FjdGl2aXR5TG9nQWN0aXZlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTAodGhpcywgbnVsbCwgX2FjdGl2ZU1lbnVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYWN0aXZlTWVudSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYWN0aXZlTWVudSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hY3RpdmVNZW51LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hY3RpdmVNZW51ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FjdGl2ZU1lbnVfaW5pdGlhbGl6ZXJzLCBfYWN0aXZlTWVudV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTEwKHRoaXMsIG51bGwsIF9vcGVuRHJvcGRvd25zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm9wZW5Ecm9wZG93bnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm9wZW5Ecm9wZG93bnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoub3BlbkRyb3Bkb3ducywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoub3BlbkRyb3Bkb3ducyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9vcGVuRHJvcGRvd25zX2luaXRpYWxpemVycywgX29wZW5Ecm9wZG93bnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxMCh0aGlzLCBudWxsLCBfZm9jdXNlZEl0ZW1fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZm9jdXNlZEl0ZW0iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZvY3VzZWRJdGVtIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmZvY3VzZWRJdGVtLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5mb2N1c2VkSXRlbSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9mb2N1c2VkSXRlbV9pbml0aWFsaXplcnMsIF9mb2N1c2VkSXRlbV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTEwKHRoaXMsIG51bGwsIF9mb2N1c2VkRHJvcGRvd25JdGVtX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImZvY3VzZWREcm9wZG93bkl0ZW0iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZvY3VzZWREcm9wZG93bkl0ZW0iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZm9jdXNlZERyb3Bkb3duSXRlbSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZm9jdXNlZERyb3Bkb3duSXRlbSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9mb2N1c2VkRHJvcGRvd25JdGVtX2luaXRpYWxpemVycywgX2ZvY3VzZWREcm9wZG93bkl0ZW1fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxMCh0aGlzLCBudWxsLCBfaXNQcm9maWxlRHJvcGRvd25PcGVuX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzUHJvZmlsZURyb3Bkb3duT3BlbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNQcm9maWxlRHJvcGRvd25PcGVuIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzUHJvZmlsZURyb3Bkb3duT3Blbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNQcm9maWxlRHJvcGRvd25PcGVuID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzUHJvZmlsZURyb3Bkb3duT3Blbl9pbml0aWFsaXplcnMsIF9pc1Byb2ZpbGVEcm9wZG93bk9wZW5fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxMChudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNBcHB1aUJhcjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzQ7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiQXBwIFVJIl07CiAgICAjbWVudUl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF9tZW51SXRlbXNfaW5pdGlhbGl6ZXJzLCBbXSk7CiAgICAvLyBJTlNUQU5DRSBQUk9QRVJUSUVTCiAgICBnZXQgbWVudUl0ZW1zKCkgewogICAgICByZXR1cm4gdGhpcy4jbWVudUl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWVudUl0ZW1zKHZhbHVlMikgewogICAgICB0aGlzLiNtZW51SXRlbXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNicmVhZGNydW1ic19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX21lbnVJdGVtc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX2JyZWFkY3J1bWJzX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBicmVhZGNydW1icygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2JyZWFkY3J1bWJzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYnJlYWRjcnVtYnModmFsdWUyKSB7CiAgICAgIHRoaXMuI2JyZWFkY3J1bWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYnJlYWRjcnVtYlNlcGFyYXRvcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX2JyZWFkY3J1bWJzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxMSh0aGlzLCBfYnJlYWRjcnVtYlNlcGFyYXRvcl9pbml0aWFsaXplcnMsICIgPiAiKSk7CiAgICBnZXQgYnJlYWRjcnVtYlNlcGFyYXRvcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2JyZWFkY3J1bWJTZXBhcmF0b3JfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBicmVhZGNydW1iU2VwYXJhdG9yKHZhbHVlMikgewogICAgICB0aGlzLiNicmVhZGNydW1iU2VwYXJhdG9yX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd1dpbmRvd0NvbnRyb2xzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxMSh0aGlzLCBfYnJlYWRjcnVtYlNlcGFyYXRvcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX3Nob3dXaW5kb3dDb250cm9sc19pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93V2luZG93Q29udHJvbHMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93V2luZG93Q29udHJvbHNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93V2luZG93Q29udHJvbHModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dXaW5kb3dDb250cm9sc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3VzZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF9zaG93V2luZG93Q29udHJvbHNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF91c2VyX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgdXNlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3VzZXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB1c2VyKHZhbHVlMikgewogICAgICB0aGlzLiN1c2VyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcHJvZmlsZU1lbnVJdGVtc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX3VzZXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF9wcm9maWxlTWVudUl0ZW1zX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBwcm9maWxlTWVudUl0ZW1zKCkgewogICAgICByZXR1cm4gdGhpcy4jcHJvZmlsZU1lbnVJdGVtc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHByb2ZpbGVNZW51SXRlbXModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Byb2ZpbGVNZW51SXRlbXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93U2VhcmNoX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxMSh0aGlzLCBfcHJvZmlsZU1lbnVJdGVtc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX3Nob3dTZWFyY2hfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHNob3dTZWFyY2goKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93U2VhcmNoX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd1NlYXJjaCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2hvd1NlYXJjaF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dBY3Rpdml0eUxvZ1RvZ2dsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX3Nob3dTZWFyY2hfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF9zaG93QWN0aXZpdHlMb2dUb2dnbGVfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgLy8gQWN0aXZpdHkgbG9nIHRvZ2dsZQogICAgZ2V0IHNob3dBY3Rpdml0eUxvZ1RvZ2dsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dBY3Rpdml0eUxvZ1RvZ2dsZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dBY3Rpdml0eUxvZ1RvZ2dsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2hvd0FjdGl2aXR5TG9nVG9nZ2xlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYWN0aXZpdHlMb2dDb3VudF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX3Nob3dBY3Rpdml0eUxvZ1RvZ2dsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX2FjdGl2aXR5TG9nQ291bnRfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgYWN0aXZpdHlMb2dDb3VudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FjdGl2aXR5TG9nQ291bnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhY3Rpdml0eUxvZ0NvdW50KHZhbHVlMikgewogICAgICB0aGlzLiNhY3Rpdml0eUxvZ0NvdW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYWN0aXZpdHlMb2dBY3RpdmVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF9hY3Rpdml0eUxvZ0NvdW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxMSh0aGlzLCBfYWN0aXZpdHlMb2dBY3RpdmVfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGFjdGl2aXR5TG9nQWN0aXZlKCkgewogICAgICByZXR1cm4gdGhpcy4jYWN0aXZpdHlMb2dBY3RpdmVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhY3Rpdml0eUxvZ0FjdGl2ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYWN0aXZpdHlMb2dBY3RpdmVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhY3RpdmVNZW51X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxMSh0aGlzLCBfYWN0aXZpdHlMb2dBY3RpdmVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF9hY3RpdmVNZW51X2luaXRpYWxpemVycywgbnVsbCkpOwogICAgLy8gU1RBVEUKICAgIGdldCBhY3RpdmVNZW51KCkgewogICAgICByZXR1cm4gdGhpcy4jYWN0aXZlTWVudV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFjdGl2ZU1lbnUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2FjdGl2ZU1lbnVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNvcGVuRHJvcGRvd25zX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxMSh0aGlzLCBfYWN0aXZlTWVudV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX29wZW5Ecm9wZG93bnNfaW5pdGlhbGl6ZXJzLCAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKSk7CiAgICBnZXQgb3BlbkRyb3Bkb3ducygpIHsKICAgICAgcmV0dXJuIHRoaXMuI29wZW5Ecm9wZG93bnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBvcGVuRHJvcGRvd25zKHZhbHVlMikgewogICAgICB0aGlzLiNvcGVuRHJvcGRvd25zX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZm9jdXNlZEl0ZW1fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF9vcGVuRHJvcGRvd25zX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxMSh0aGlzLCBfZm9jdXNlZEl0ZW1faW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICBnZXQgZm9jdXNlZEl0ZW0oKSB7CiAgICAgIHJldHVybiB0aGlzLiNmb2N1c2VkSXRlbV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGZvY3VzZWRJdGVtKHZhbHVlMikgewogICAgICB0aGlzLiNmb2N1c2VkSXRlbV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2ZvY3VzZWREcm9wZG93bkl0ZW1fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF9mb2N1c2VkSXRlbV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX2ZvY3VzZWREcm9wZG93bkl0ZW1faW5pdGlhbGl6ZXJzLCAtMSkpOwogICAgZ2V0IGZvY3VzZWREcm9wZG93bkl0ZW0oKSB7CiAgICAgIHJldHVybiB0aGlzLiNmb2N1c2VkRHJvcGRvd25JdGVtX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZm9jdXNlZERyb3Bkb3duSXRlbSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZm9jdXNlZERyb3Bkb3duSXRlbV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzUHJvZmlsZURyb3Bkb3duT3Blbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTEodGhpcywgX2ZvY3VzZWREcm9wZG93bkl0ZW1fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczExKHRoaXMsIF9pc1Byb2ZpbGVEcm9wZG93bk9wZW5faW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGlzUHJvZmlsZURyb3Bkb3duT3BlbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzUHJvZmlsZURyb3Bkb3duT3Blbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzUHJvZmlsZURyb3Bkb3duT3Blbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXNQcm9maWxlRHJvcGRvd25PcGVuX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gYXBwdWlBcHBiYXJTdHlsZXM7CiAgICAvLyBJTlNUQU5DRQogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gcmVuZGVyQXBwdWlBcHBiYXIodGhpcyk7CiAgICB9CiAgICByZW5kZXJNZW51SXRlbXMoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgJHt0aGlzLm1lbnVJdGVtcy5tYXAoKGl0ZW0sIGluZGV4MikgPT4gdGhpcy5yZW5kZXJNZW51SXRlbShpdGVtLCBgbWVudS0ke2luZGV4Mn1gKSl9CiAgICBgOwogICAgfQogICAgcmVuZGVyTWVudUl0ZW0oaXRlbSwgaXRlbUlkKSB7CiAgICAgIGlmICgiZGl2aWRlciIgaW4gaXRlbSAmJiBpdGVtLmRpdmlkZXIpIHsKICAgICAgICByZXR1cm4gYjJgPGRpdiBjbGFzcz0iZHJvcGRvd24tZGl2aWRlciI+PC9kaXY+YDsKICAgICAgfQogICAgICBjb25zdCBtZW51SXRlbSA9IGl0ZW07CiAgICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5hY3RpdmVNZW51ID09PSBpdGVtSWQ7CiAgICAgIGNvbnN0IGhhc1N1Ym1lbnUgPSBtZW51SXRlbS5zdWJtZW51ICYmIG1lbnVJdGVtLnN1Ym1lbnUubGVuZ3RoID4gMDsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9Im1lbnVJdGVtICR7aXNBY3RpdmUgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICA/ZGlzYWJsZWQ9JHttZW51SXRlbS5kaXNhYmxlZH0KICAgICAgICB0YWJpbmRleD0iJHttZW51SXRlbS5kaXNhYmxlZCA/IC0xIDogMH0iCiAgICAgICAgZGF0YS1pdGVtLWlkPSIke2l0ZW1JZH0iCiAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5oYW5kbGVNZW51Q2xpY2sobWVudUl0ZW0sIGl0ZW1JZCl9CiAgICAgICAgQGtleWRvd249JHsoZTExKSA9PiB0aGlzLmhhbmRsZU1lbnVLZXlkb3duKGUxMSwgbWVudUl0ZW0sIGl0ZW1JZCl9CiAgICAgICAgcm9sZT0ibWVudWl0ZW0iCiAgICAgICAgYXJpYS1oYXNwb3B1cD0iJHtoYXNTdWJtZW51fSIKICAgICAgICBhcmlhLWV4cGFuZGVkPSIke2lzQWN0aXZlfSIKICAgICAgPgogICAgICAgICR7bWVudUl0ZW0uaWNvbk5hbWUgPyBiMmA8ZGVlcy1pY29uIC5pY29uPSIke2BsdWNpZGU6JHttZW51SXRlbS5pY29uTmFtZX1gfSI+PC9kZWVzLWljb24+YCA6ICIifQogICAgICAgICR7bWVudUl0ZW0ubmFtZX0KICAgICAgICAke2hhc1N1Ym1lbnUgPyB0aGlzLnJlbmRlckRyb3Bkb3duKG1lbnVJdGVtLnN1Ym1lbnUsIGl0ZW1JZCwgaXNBY3RpdmUpIDogIiJ9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlckRyb3Bkb3duKGl0ZW1zLCBwYXJlbnRJZCwgaXNPcGVuKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiAKICAgICAgICBjbGFzcz0iZHJvcGRvd24gJHtpc09wZW4gPyAib3BlbiIgOiAiIn0iIAogICAgICAgIEBjbGljaz0keyhlMTEpID0+IGUxMS5zdG9wUHJvcGFnYXRpb24oKX0KICAgICAgICBAa2V5ZG93bj0keyhlMTEpID0+IHRoaXMuaGFuZGxlRHJvcGRvd25LZXlkb3duKGUxMSwgaXRlbXMsIHBhcmVudElkKX0KICAgICAgICB0YWJpbmRleD0iJHtpc09wZW4gPyAwIDogLTF9IgogICAgICAgIHJvbGU9Im1lbnUiCiAgICAgID4KICAgICAgICAke2l0ZW1zLm1hcCgoaXRlbSwgaW5kZXgyKSA9PiB0aGlzLnJlbmRlckRyb3Bkb3duSXRlbShpdGVtLCBgJHtwYXJlbnRJZH0tJHtpbmRleDJ9YCkpfQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJEcm9wZG93bkl0ZW0oaXRlbSwgaXRlbUlkKSB7CiAgICAgIGlmICgiZGl2aWRlciIgaW4gaXRlbSAmJiBpdGVtLmRpdmlkZXIpIHsKICAgICAgICByZXR1cm4gYjJgPGRpdiBjbGFzcz0iZHJvcGRvd24tZGl2aWRlciI+PC9kaXY+YDsKICAgICAgfQogICAgICBjb25zdCBtZW51SXRlbSA9IGl0ZW07CiAgICAgIGNvbnN0IGl0ZW1JbmRleCA9IHBhcnNlSW50KGl0ZW1JZC5zcGxpdCgiLSIpLnBvcCgpIHx8ICIwIik7CiAgICAgIGNvbnN0IGlzRm9jdXNlZCA9IHRoaXMuZm9jdXNlZERyb3Bkb3duSXRlbSA9PT0gaXRlbUluZGV4OwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYKICAgICAgICBjbGFzcz0iZHJvcGRvd24taXRlbSAke2lzRm9jdXNlZCA/ICJmb2N1c2VkIiA6ICIifSIKICAgICAgICA/ZGlzYWJsZWQ9JHttZW51SXRlbS5kaXNhYmxlZH0KICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmhhbmRsZURyb3Bkb3duSXRlbUNsaWNrKG1lbnVJdGVtKX0KICAgICAgICBAbW91c2VlbnRlcj0keygpID0+IHRoaXMuZm9jdXNlZERyb3Bkb3duSXRlbSA9IGl0ZW1JbmRleH0KICAgICAgICByb2xlPSJtZW51aXRlbSIKICAgICAgICB0YWJpbmRleD0iJHttZW51SXRlbS5kaXNhYmxlZCA/IC0xIDogMH0iCiAgICAgID4KICAgICAgICAke21lbnVJdGVtLmljb25OYW1lID8gYjJgPGRlZXMtaWNvbiAuaWNvbj0iJHtgbHVjaWRlOiR7bWVudUl0ZW0uaWNvbk5hbWV9YH0iPjwvZGVlcy1pY29uPmAgOiAiIn0KICAgICAgICA8c3Bhbj4ke21lbnVJdGVtLm5hbWV9PC9zcGFuPgogICAgICAgICR7bWVudUl0ZW0uc2hvcnRjdXQgPyBiMmA8c3BhbiBjbGFzcz0ic2hvcnRjdXQiPiR7bWVudUl0ZW0uc2hvcnRjdXR9PC9zcGFuPmAgOiAiIn0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgcmVuZGVyQnJlYWRjcnVtYnMoKSB7CiAgICAgIGlmICghdGhpcy5icmVhZGNydW1icykgewogICAgICAgIHJldHVybiBiMmBgOwogICAgICB9CiAgICAgIGNvbnN0IHBhcnRzID0gdGhpcy5icmVhZGNydW1icy5zcGxpdCh0aGlzLmJyZWFkY3J1bWJTZXBhcmF0b3IpOwogICAgICByZXR1cm4gYjJgCiAgICAgICR7cGFydHMubWFwKChwYXJ0LCBpbmRleDIpID0+IGIyYAogICAgICAgICR7aW5kZXgyID4gMCA/IGIyYDxzcGFuIGNsYXNzPSJicmVhZGNydW1iLXNlcGFyYXRvciI+JHt0aGlzLmJyZWFkY3J1bWJTZXBhcmF0b3J9PC9zcGFuPmAgOiAiIn0KICAgICAgICA8c3BhbiAKICAgICAgICAgIGNsYXNzPSJicmVhZGNydW1iLWl0ZW0iIAogICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5oYW5kbGVCcmVhZGNydW1iQ2xpY2socGFydCwgaW5kZXgyKX0KICAgICAgICA+CiAgICAgICAgICAke3BhcnR9CiAgICAgICAgPC9zcGFuPgogICAgICBgKX0KICAgIGA7CiAgICB9CiAgICByZW5kZXJBY2NvdW50U2VjdGlvbigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICAke3RoaXMuc2hvd1NlYXJjaCA/IGIyYAogICAgICAgIDxkZWVzLWljb24KICAgICAgICAgIGNsYXNzPSJzZWFyY2gtaWNvbiIKICAgICAgICAgIC5pY29uPSR7Imx1Y2lkZTpzZWFyY2gifQogICAgICAgICAgQGNsaWNrPSR7dGhpcy5oYW5kbGVTZWFyY2hDbGlja30KICAgICAgICA+PC9kZWVzLWljb24+CiAgICAgIGAgOiAiIn0KICAgICAgJHt0aGlzLnVzZXIgPyBiMmAKICAgICAgICA8ZGl2IHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9InVzZXItaW5mbyIgQGNsaWNrPSR7dGhpcy5oYW5kbGVVc2VyQ2xpY2t9PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1c2VyLWF2YXRhciI+CiAgICAgICAgICAgICAgJHt0aGlzLnVzZXIuYXZhdGFyID8gYjJgPGltZyBzcmM9IiR7dGhpcy51c2VyLmF2YXRhcn0iIGFsdD0iJHt0aGlzLnVzZXIubmFtZX0iPmAgOiBiMmAke3RoaXMudXNlci5uYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfWB9CiAgICAgICAgICAgICAgJHt0aGlzLnVzZXIuc3RhdHVzID8gYjJgCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1c2VyLXN0YXR1cyAke3RoaXMudXNlci5zdGF0dXN9Ij48L2Rpdj4KICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8c3Bhbj4ke3RoaXMudXNlci5uYW1lfTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRlZXMtYXBwdWktcHJvZmlsZWRyb3Bkb3duCiAgICAgICAgICAgIC51c2VyPSR7dGhpcy51c2VyfQogICAgICAgICAgICAubWVudUl0ZW1zPSR7dGhpcy5wcm9maWxlTWVudUl0ZW1zfQogICAgICAgICAgICAuaXNPcGVuPSR7dGhpcy5pc1Byb2ZpbGVEcm9wZG93bk9wZW59CiAgICAgICAgICAgIC5wb3NpdGlvbj0keyJ0b3AtcmlnaHQifQogICAgICAgICAgICBAbWVudS1zZWxlY3Q9JHsoZTExKSA9PiB0aGlzLmhhbmRsZVByb2ZpbGVNZW51U2VsZWN0KGUxMSl9CiAgICAgICAgICA+PC9kZWVzLWFwcHVpLXByb2ZpbGVkcm9wZG93bj4KICAgICAgICA8L2Rpdj4KICAgICAgYCA6ICIifQogICAgICAke3RoaXMuc2hvd0FjdGl2aXR5TG9nVG9nZ2xlID8gYjJgCiAgICAgICAgPGRpdgogICAgICAgICAgY2xhc3M9ImFjdGl2aXR5LXRvZ2dsZSAke3RoaXMuYWN0aXZpdHlMb2dBY3RpdmUgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgIEBjbGljaz0ke3RoaXMuaGFuZGxlQWN0aXZpdHlUb2dnbGV9CiAgICAgICAgICB0aXRsZT0iQWN0aXZpdHkgTG9nIgogICAgICAgID4KICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOmFjdGl2aXR5In0+PC9kZWVzLWljb24+CiAgICAgICAgICAke3RoaXMuYWN0aXZpdHlMb2dDb3VudCA+IDAgPyBiMmAKICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImFjdGl2aXR5LWJhZGdlIj4ke3RoaXMuYWN0aXZpdHlMb2dDb3VudCA+IDk5ID8gIjk5KyIgOiB0aGlzLmFjdGl2aXR5TG9nQ291bnR9PC9zcGFuPgogICAgICAgICAgYCA6ICIifQogICAgICAgIDwvZGl2PgogICAgICBgIDogIiJ9CiAgICBgOwogICAgfQogICAgLy8gRXZlbnQgaGFuZGxlcnMKICAgIGhhbmRsZU1lbnVDbGljayhpdGVtLCBpdGVtSWQpIHsKICAgICAgaWYgKGl0ZW0uZGlzYWJsZWQpCiAgICAgICAgcmV0dXJuOwogICAgICBpZiAoaXRlbS5zdWJtZW51ICYmIGl0ZW0uc3VibWVudS5sZW5ndGggPiAwKSB7CiAgICAgICAgaWYgKHRoaXMuYWN0aXZlTWVudSA9PT0gaXRlbUlkKSB7CiAgICAgICAgICB0aGlzLmFjdGl2ZU1lbnUgPSBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmFjdGl2ZU1lbnUgPSBpdGVtSWQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuYWN0aXZlTWVudSA9IG51bGw7CiAgICAgICAgaWYgKGl0ZW0uYWN0aW9uKSB7CiAgICAgICAgICBpdGVtLmFjdGlvbigpOwogICAgICAgIH0KICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJtZW51LXNlbGVjdCIsIHsKICAgICAgICAgIGRldGFpbDogeyBpdGVtIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZURyb3Bkb3duSXRlbUNsaWNrKGl0ZW0pIHsKICAgICAgaWYgKGl0ZW0uZGlzYWJsZWQpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLmFjdGl2ZU1lbnUgPSBudWxsOwogICAgICBpZiAoaXRlbS5hY3Rpb24pIHsKICAgICAgICBpdGVtLmFjdGlvbigpOwogICAgICB9CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm1lbnUtc2VsZWN0IiwgewogICAgICAgIGRldGFpbDogeyBpdGVtIH0sCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBoYW5kbGVNZW51S2V5ZG93bihlMTEsIGl0ZW0sIGl0ZW1JZCkgewogICAgICBzd2l0Y2ggKGUxMS5rZXkpIHsKICAgICAgICBjYXNlICJFbnRlciI6CiAgICAgICAgY2FzZSAiICI6CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuaGFuZGxlTWVudUNsaWNrKGl0ZW0sIGl0ZW1JZCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJBcnJvd0Rvd24iOgogICAgICAgICAgaWYgKGl0ZW0uc3VibWVudSAmJiB0aGlzLmFjdGl2ZU1lbnUgPT09IGl0ZW1JZCkgewogICAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdGhpcy5mb2N1c2VkRHJvcGRvd25JdGVtID0gMDsKICAgICAgICAgICAgY29uc3QgZmlyc3RWYWxpZEl0ZW0gPSB0aGlzLmZpbmROZXh0VmFsaWRJdGVtKGl0ZW0uc3VibWVudSwgLTEsIDEpOwogICAgICAgICAgICBpZiAoZmlyc3RWYWxpZEl0ZW0gIT09IC0xKSB7CiAgICAgICAgICAgICAgdGhpcy5mb2N1c2VkRHJvcGRvd25JdGVtID0gZmlyc3RWYWxpZEl0ZW07CiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBkcm9wZG93biA9IHRoaXMucmVuZGVyUm9vdC5xdWVyeVNlbGVjdG9yKCIuZHJvcGRvd24ub3BlbiIpOwogICAgICAgICAgICAgICAgaWYgKGRyb3Bkb3duKSB7CiAgICAgICAgICAgICAgICAgIGRyb3Bkb3duLmZvY3VzKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkVzY2FwZSI6CiAgICAgICAgICB0aGlzLmFjdGl2ZU1lbnUgPSBudWxsOwogICAgICAgICAgdGhpcy5mb2N1c2VkRHJvcGRvd25JdGVtID0gLTE7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJUYWIiOgogICAgICAgICAgaWYgKHRoaXMuYWN0aXZlTWVudSA9PT0gaXRlbUlkKSB7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlTWVudSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuZm9jdXNlZERyb3Bkb3duSXRlbSA9IC0xOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQXJyb3dSaWdodCI6CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuZm9jdXNOZXh0TWVudUl0ZW0oaXRlbUlkLCAxKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkFycm93TGVmdCI6CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuZm9jdXNOZXh0TWVudUl0ZW0oaXRlbUlkLCAtMSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaGFuZGxlQnJlYWRjcnVtYkNsaWNrKGJyZWFkY3J1bWIsIGluZGV4MikgewogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJicmVhZGNydW1iLW5hdmlnYXRlIiwgewogICAgICAgIGRldGFpbDogeyBicmVhZGNydW1iLCBpbmRleDogaW5kZXgyIH0sCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBoYW5kbGVTZWFyY2hDbGljaygpIHsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgic2VhcmNoLWNsaWNrIiwgewogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgaGFuZGxlQWN0aXZpdHlUb2dnbGUoKSB7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImFjdGl2aXR5LXRvZ2dsZSIsIHsKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGhhbmRsZVVzZXJDbGljaygpIHsKICAgICAgdGhpcy5pc1Byb2ZpbGVEcm9wZG93bk9wZW4gPSAhdGhpcy5pc1Byb2ZpbGVEcm9wZG93bk9wZW47CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInVzZXItbWVudS1vcGVuIiwgewogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgaGFuZGxlUHJvZmlsZU1lbnVTZWxlY3QoZTExKSB7CiAgICAgIHRoaXMuaXNQcm9maWxlRHJvcGRvd25PcGVuID0gZmFsc2U7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInByb2ZpbGUtbWVudS1zZWxlY3QiLCB7CiAgICAgICAgZGV0YWlsOiBlMTEuZGV0YWlsLAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgLy8gTGlmZWN5Y2xlCiAgICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuaGFuZGxlR2xvYmFsQ2xpY2spOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuaGFuZGxlRG9jdW1lbnRDbGljayk7CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLmhhbmRsZURvY3VtZW50Q2xpY2spOwogICAgfQogICAgaGFuZGxlR2xvYmFsQ2xpY2sgPSAoX19ydW5Jbml0aWFsaXplcnMxMSh0aGlzLCBfaXNQcm9maWxlRHJvcGRvd25PcGVuX2V4dHJhSW5pdGlhbGl6ZXJzKSwgKGUxMSkgPT4gewogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICB9KTsKICAgIGhhbmRsZURvY3VtZW50Q2xpY2sgPSAoKSA9PiB7CiAgICAgIHRoaXMuYWN0aXZlTWVudSA9IG51bGw7CiAgICAgIHRoaXMuZm9jdXNlZERyb3Bkb3duSXRlbSA9IC0xOwogICAgfTsKICAgIGhhbmRsZURyb3Bkb3duS2V5ZG93bihlMTEsIGl0ZW1zLCBfcGFyZW50SWQpIHsKICAgICAgY29uc3QgdmFsaWRJdGVtcyA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gISgiZGl2aWRlciIgaW4gaXRlbSAmJiBpdGVtLmRpdmlkZXIpKTsKICAgICAgc3dpdGNoIChlMTEua2V5KSB7CiAgICAgICAgY2FzZSAiQXJyb3dEb3duIjoKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5maW5kTmV4dFZhbGlkSXRlbShpdGVtcywgdGhpcy5mb2N1c2VkRHJvcGRvd25JdGVtLCAxKTsKICAgICAgICAgIGlmIChuZXh0SW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgIHRoaXMuZm9jdXNlZERyb3Bkb3duSXRlbSA9IG5leHRJbmRleDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkFycm93VXAiOgogICAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBjb25zdCBwcmV2SW5kZXggPSB0aGlzLmZpbmROZXh0VmFsaWRJdGVtKGl0ZW1zLCB0aGlzLmZvY3VzZWREcm9wZG93bkl0ZW0sIC0xKTsKICAgICAgICAgIGlmIChwcmV2SW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgIHRoaXMuZm9jdXNlZERyb3Bkb3duSXRlbSA9IHByZXZJbmRleDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkVudGVyIjoKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZERyb3Bkb3duSXRlbSAhPT0gLTEpIHsKICAgICAgICAgICAgY29uc3QgZm9jdXNlZEl0ZW0gPSB2YWxpZEl0ZW1zW3RoaXMuZm9jdXNlZERyb3Bkb3duSXRlbV07CiAgICAgICAgICAgIGlmIChmb2N1c2VkSXRlbSAmJiAiYWN0aW9uIiBpbiBmb2N1c2VkSXRlbSAmJiAhZm9jdXNlZEl0ZW0uZGlzYWJsZWQpIHsKICAgICAgICAgICAgICB0aGlzLmhhbmRsZURyb3Bkb3duSXRlbUNsaWNrKGZvY3VzZWRJdGVtKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiSG9tZSI6CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSB0aGlzLmZpbmROZXh0VmFsaWRJdGVtKGl0ZW1zLCAtMSwgMSk7CiAgICAgICAgICBpZiAoZmlyc3RJbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgdGhpcy5mb2N1c2VkRHJvcGRvd25JdGVtID0gZmlyc3RJbmRleDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkVuZCI6CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IHRoaXMuZmluZE5leHRWYWxpZEl0ZW0oaXRlbXMsIGl0ZW1zLmxlbmd0aCwgLTEpOwogICAgICAgICAgaWYgKGxhc3RJbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgdGhpcy5mb2N1c2VkRHJvcGRvd25JdGVtID0gbGFzdEluZGV4OwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiRXNjYXBlIjoKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgdGhpcy5hY3RpdmVNZW51ID0gbnVsbDsKICAgICAgICAgIHRoaXMuZm9jdXNlZERyb3Bkb3duSXRlbSA9IC0xOwogICAgICAgICAgY29uc3QgbWVudUl0ZW0gPSB0aGlzLnJlbmRlclJvb3QucXVlcnlTZWxlY3RvcihgLm1lbnVJdGVtLmFjdGl2ZWApOwogICAgICAgICAgaWYgKG1lbnVJdGVtKSB7CiAgICAgICAgICAgIG1lbnVJdGVtLmZvY3VzKCk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgZmluZE5leHRWYWxpZEl0ZW0oaXRlbXMsIGN1cnJlbnRJbmRleCwgZGlyZWN0aW9uKSB7CiAgICAgIGxldCBpbmRleDIgPSBjdXJyZW50SW5kZXggKyBkaXJlY3Rpb247CiAgICAgIHdoaWxlIChpbmRleDIgPj0gMCAmJiBpbmRleDIgPCBpdGVtcy5sZW5ndGgpIHsKICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaW5kZXgyXTsKICAgICAgICBpZiAoISgiZGl2aWRlciIgaW4gaXRlbSAmJiBpdGVtLmRpdmlkZXIpICYmICEoImRpc2FibGVkIiBpbiBpdGVtICYmIGl0ZW0uZGlzYWJsZWQpKSB7CiAgICAgICAgICByZXR1cm4gaW5kZXgyOwogICAgICAgIH0KICAgICAgICBpbmRleDIgKz0gZGlyZWN0aW9uOwogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGZvY3VzTmV4dE1lbnVJdGVtKGN1cnJlbnRJdGVtSWQsIGRpcmVjdGlvbikgewogICAgICBjb25zdCBtZW51SXRlbXMgPSBBcnJheS5mcm9tKHRoaXMucmVuZGVyUm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIubWVudUl0ZW0iKSk7CiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IG1lbnVJdGVtcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0uZ2V0QXR0cmlidXRlKCJkYXRhLWl0ZW0taWQiKSA9PT0gY3VycmVudEl0ZW1JZCk7CiAgICAgIGlmIChjdXJyZW50SW5kZXggPT09IC0xKQogICAgICAgIHJldHVybjsKICAgICAgbGV0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCArIGRpcmVjdGlvbjsKICAgICAgaWYgKG5leHRJbmRleCA8IDApIHsKICAgICAgICBuZXh0SW5kZXggPSBtZW51SXRlbXMubGVuZ3RoIC0gMTsKICAgICAgfSBlbHNlIGlmIChuZXh0SW5kZXggPj0gbWVudUl0ZW1zLmxlbmd0aCkgewogICAgICAgIG5leHRJbmRleCA9IDA7CiAgICAgIH0KICAgICAgbGV0IGF0dGVtcHRzID0gMDsKICAgICAgd2hpbGUgKGF0dGVtcHRzIDwgbWVudUl0ZW1zLmxlbmd0aCkgewogICAgICAgIGNvbnN0IG5leHRJdGVtID0gbWVudUl0ZW1zW25leHRJbmRleF07CiAgICAgICAgaWYgKCFuZXh0SXRlbS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpIHsKICAgICAgICAgIG5leHRJdGVtLmZvY3VzKCk7CiAgICAgICAgICBpZiAodGhpcy5hY3RpdmVNZW51KSB7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlTWVudSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuZm9jdXNlZERyb3Bkb3duSXRlbSA9IC0xOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIG5leHRJbmRleCA9IChuZXh0SW5kZXggKyBkaXJlY3Rpb24gKyBtZW51SXRlbXMubGVuZ3RoKSAlIG1lbnVJdGVtcy5sZW5ndGg7CiAgICAgICAgYXR0ZW1wdHMrKzsKICAgICAgfQogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnMxMShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0FwcHVpQmFyMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtYXBwdWkvZGVlcy1hcHB1aS1ib3R0b21iYXIvZGVlcy1hcHB1aS1ib3R0b21iYXIuZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgX2E7CnZhciBkZW1vRnVuYzUgPSAoKSA9PiB7CiAgcmV0dXJuIGIyKF9hIHx8IChfYSA9IF9fdGVtcGxhdGUoW2AKICAgIDxkZWVzLWRlbW93cmFwcGVyPgogICAgICA8c3R5bGU+CiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICAgIGJhY2tncm91bmQ6ICMxYTFhMWE7CiAgICAgICAgfQoKICAgICAgICAuZGVtby1zZWN0aW9uIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgfQoKICAgICAgICAuZGVtby1sYWJlbCB7CiAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICBjb2xvcjogIzczNzM3MzsKICAgICAgICAgIGZvbnQtZmFtaWx5OiAnR2Vpc3QgU2FucycsIHNhbnMtc2VyaWY7CiAgICAgICAgfQoKICAgICAgICAuZGVtby1ib3R0b21iYXItd3JhcHBlciB7CiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBoc2woMCAwJSAyMCUpOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB9CiAgICAgIDwvc3R5bGU+CiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVtby1sYWJlbCI+Qm90dG9tIGJhciB3aXRoIHN0YXR1cyB3aWRnZXRzIGFuZCBhY3Rpb25zPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkZW1vLWJvdHRvbWJhci13cmFwcGVyIj4KICAgICAgICAgICAgPGRlZXMtYXBwdWktYm90dG9tYmFyCiAgICAgICAgICAgICAgaWQ9ImRlbW8tYm90dG9tYmFyIgogICAgICAgICAgICA+PC9kZWVzLWFwcHVpLWJvdHRvbWJhcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVtby1sYWJlbCI+Q29udHJvbHM8L2Rpdj4KICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBmbGV4LXdyYXA6IHdyYXA7Ij4KICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPSJhZGRTdWNjZXNzV2lkZ2V0KCkiPkFkZCBTdWNjZXNzIFdpZGdldDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9ImFkZFdhcm5pbmdXaWRnZXQoKSI+QWRkIFdhcm5pbmcgV2lkZ2V0PC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gb25jbGljaz0iYWRkRXJyb3JXaWRnZXQoKSI+QWRkIEVycm9yIFdpZGdldDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9ImFkZExvYWRpbmdXaWRnZXQoKSI+QWRkIExvYWRpbmcgV2lkZ2V0PC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gb25jbGljaz0iYWRkUmlnaHRXaWRnZXQoKSI+QWRkIFJpZ2h0IFdpZGdldDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9ImFkZEFjdGlvbigpIj5BZGQgQWN0aW9uPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gb25jbGljaz0iY2xlYXJBbGwoKSI+Q2xlYXIgQWxsPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxzY3JpcHQgdHlwZT0ibW9kdWxlIj4KICAgICAgICBjb25zdCBib3R0b21iYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVtby1ib3R0b21iYXInKTsKCiAgICAgICAgLy8gV2FpdCBmb3IgY29tcG9uZW50IHRvIGluaXRpYWxpemUKICAgICAgICBhd2FpdCBib3R0b21iYXIudXBkYXRlQ29tcGxldGU7CgogICAgICAgIC8vIEFkZCBpbml0aWFsIHdpZGdldHMKICAgICAgICBib3R0b21iYXIuYWRkV2lkZ2V0KHsKICAgICAgICAgIGlkOiAnc3RhdHVzJywKICAgICAgICAgIGljb25OYW1lOiAnbHVjaWRlOmFjdGl2aXR5JywKICAgICAgICAgIGxhYmVsOiAnU3lzdGVtIE9ubGluZScsCiAgICAgICAgICBzdGF0dXM6ICdzdWNjZXNzJywKICAgICAgICAgIHRvb2x0aXA6ICdBbGwgc3lzdGVtcyBvcGVyYXRpb25hbCcsCiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiBjb25zb2xlLmxvZygnU3RhdHVzIGNsaWNrZWQnKSwKICAgICAgICAgIGNvbnRleHRNZW51SXRlbXM6IFsKICAgICAgICAgICAgeyBuYW1lOiAnVmlldyBEZXRhaWxzJywgaWNvbk5hbWU6ICdsdWNpZGU6aW5mbycsIGFjdGlvbjogKCkgPT4gYWxlcnQoJ1N5c3RlbSBkZXRhaWxzJykgfSwKICAgICAgICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgICAgIHsgbmFtZTogJ1JlZnJlc2ggU3RhdHVzJywgaWNvbk5hbWU6ICdsdWNpZGU6cmVmcmVzaEN3JywgYWN0aW9uOiAoKSA9PiBhbGVydCgnUmVmcmVzaGluZy4uLicpIH0sCiAgICAgICAgICBdLAogICAgICAgIH0pOwoKICAgICAgICBib3R0b21iYXIuYWRkV2lkZ2V0KHsKICAgICAgICAgIGlkOiAnbm90aWZpY2F0aW9ucycsCiAgICAgICAgICBpY29uTmFtZTogJ2x1Y2lkZTpiZWxsJywKICAgICAgICAgIGxhYmVsOiAnMyBub3RpZmljYXRpb25zJywKICAgICAgICAgIHN0YXR1czogJ3dhcm5pbmcnLAogICAgICAgICAgdG9vbHRpcDogJ1lvdSBoYXZlIHVucmVhZCBub3RpZmljYXRpb25zJywKICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IGNvbnNvbGUubG9nKCdOb3RpZmljYXRpb25zIGNsaWNrZWQnKSwKICAgICAgICB9KTsKCiAgICAgICAgYm90dG9tYmFyLmFkZFdpZGdldCh7CiAgICAgICAgICBpZDogJ3ZlcnNpb24nLAogICAgICAgICAgaWNvbk5hbWU6ICdsdWNpZGU6Z2l0QnJhbmNoJywKICAgICAgICAgIGxhYmVsOiAndjEuMi4zJywKICAgICAgICAgIHRvb2x0aXA6ICdDdXJyZW50IHZlcnNpb24nLAogICAgICAgICAgcG9zaXRpb246ICdyaWdodCcsCiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiBjb25zb2xlLmxvZygnVmVyc2lvbiBjbGlja2VkJyksCiAgICAgICAgfSk7CgogICAgICAgIC8vIEFkZCBpbml0aWFsIGFjdGlvbnMKICAgICAgICBib3R0b21iYXIuYWRkQWN0aW9uKHsKICAgICAgICAgIGlkOiAnc2V0dGluZ3MnLAogICAgICAgICAgaWNvbk5hbWU6ICdsdWNpZGU6c2V0dGluZ3MnLAogICAgICAgICAgdG9vbHRpcDogJ1NldHRpbmdzJywKICAgICAgICAgIHBvc2l0aW9uOiAncmlnaHQnLAogICAgICAgICAgb25DbGljazogKCkgPT4gYWxlcnQoJ1NldHRpbmdzIGNsaWNrZWQnKSwKICAgICAgICB9KTsKCiAgICAgICAgYm90dG9tYmFyLmFkZEFjdGlvbih7CiAgICAgICAgICBpZDogJ2hlbHAnLAogICAgICAgICAgaWNvbk5hbWU6ICdsdWNpZGU6aGVscENpcmNsZScsCiAgICAgICAgICB0b29sdGlwOiAnSGVscCcsCiAgICAgICAgICBwb3NpdGlvbjogJ3JpZ2h0JywKICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IGFsZXJ0KCdIZWxwIGNsaWNrZWQnKSwKICAgICAgICB9KTsKCiAgICAgICAgLy8gRGVtbyBjb250cm9sIGZ1bmN0aW9ucwogICAgICAgIGxldCB3aWRnZXRDb3VudGVyID0gMDsKICAgICAgICBsZXQgYWN0aW9uQ291bnRlciA9IDA7CgogICAgICAgIHdpbmRvdy5hZGRTdWNjZXNzV2lkZ2V0ID0gKCkgPT4gewogICAgICAgICAgd2lkZ2V0Q291bnRlcisrOwogICAgICAgICAgYm90dG9tYmFyLmFkZFdpZGdldCh7CiAgICAgICAgICAgIGlkOiAnc3VjY2Vzcy0nICsgd2lkZ2V0Q291bnRlciwKICAgICAgICAgICAgaWNvbk5hbWU6ICdsdWNpZGU6Y2hlY2tDaXJjbGUnLAogICAgICAgICAgICBsYWJlbDogJ1N1Y2Nlc3MgJyArIHdpZGdldENvdW50ZXIsCiAgICAgICAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLAogICAgICAgICAgICB0b29sdGlwOiAnU3VjY2VzcyB3aWRnZXQnLAogICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiBib3R0b21iYXIucmVtb3ZlV2lkZ2V0KCdzdWNjZXNzLScgKyB3aWRnZXRDb3VudGVyKSwKICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIHdpbmRvdy5hZGRXYXJuaW5nV2lkZ2V0ID0gKCkgPT4gewogICAgICAgICAgd2lkZ2V0Q291bnRlcisrOwogICAgICAgICAgYm90dG9tYmFyLmFkZFdpZGdldCh7CiAgICAgICAgICAgIGlkOiAnd2FybmluZy0nICsgd2lkZ2V0Q291bnRlciwKICAgICAgICAgICAgaWNvbk5hbWU6ICdsdWNpZGU6YWxlcnRUcmlhbmdsZScsCiAgICAgICAgICAgIGxhYmVsOiAnV2FybmluZyAnICsgd2lkZ2V0Q291bnRlciwKICAgICAgICAgICAgc3RhdHVzOiAnd2FybmluZycsCiAgICAgICAgICAgIHRvb2x0aXA6ICdXYXJuaW5nIHdpZGdldCcsCiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IGJvdHRvbWJhci5yZW1vdmVXaWRnZXQoJ3dhcm5pbmctJyArIHdpZGdldENvdW50ZXIpLAogICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgd2luZG93LmFkZEVycm9yV2lkZ2V0ID0gKCkgPT4gewogICAgICAgICAgd2lkZ2V0Q291bnRlcisrOwogICAgICAgICAgYm90dG9tYmFyLmFkZFdpZGdldCh7CiAgICAgICAgICAgIGlkOiAnZXJyb3ItJyArIHdpZGdldENvdW50ZXIsCiAgICAgICAgICAgIGljb25OYW1lOiAnbHVjaWRlOnhDaXJjbGUnLAogICAgICAgICAgICBsYWJlbDogJ0Vycm9yICcgKyB3aWRnZXRDb3VudGVyLAogICAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsCiAgICAgICAgICAgIHRvb2x0aXA6ICdFcnJvciB3aWRnZXQnLAogICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiBib3R0b21iYXIucmVtb3ZlV2lkZ2V0KCdlcnJvci0nICsgd2lkZ2V0Q291bnRlciksCiAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICB3aW5kb3cuYWRkTG9hZGluZ1dpZGdldCA9ICgpID0+IHsKICAgICAgICAgIHdpZGdldENvdW50ZXIrKzsKICAgICAgICAgIGNvbnN0IGlkID0gJ2xvYWRpbmctJyArIHdpZGdldENvdW50ZXI7CiAgICAgICAgICBib3R0b21iYXIuYWRkV2lkZ2V0KHsKICAgICAgICAgICAgaWQ6IGlkLAogICAgICAgICAgICBpY29uTmFtZTogJ2x1Y2lkZTpsb2FkZXIyJywKICAgICAgICAgICAgbGFiZWw6ICdMb2FkaW5nLi4uJywKICAgICAgICAgICAgc3RhdHVzOiAnYWN0aXZlJywKICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSwKICAgICAgICAgICAgdG9vbHRpcDogJ0xvYWRpbmcgaW4gcHJvZ3Jlc3MnLAogICAgICAgICAgfSk7CgogICAgICAgICAgLy8gU2ltdWxhdGUgY29tcGxldGlvbiBhZnRlciAzIHNlY29uZHMKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICBib3R0b21iYXIudXBkYXRlV2lkZ2V0KGlkLCB7CiAgICAgICAgICAgICAgaWNvbk5hbWU6ICdsdWNpZGU6Y2hlY2snLAogICAgICAgICAgICAgIGxhYmVsOiAnRG9uZSEnLAogICAgICAgICAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLAogICAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sIDMwMDApOwogICAgICAgIH07CgogICAgICAgIHdpbmRvdy5hZGRSaWdodFdpZGdldCA9ICgpID0+IHsKICAgICAgICAgIHdpZGdldENvdW50ZXIrKzsKICAgICAgICAgIGJvdHRvbWJhci5hZGRXaWRnZXQoewogICAgICAgICAgICBpZDogJ3JpZ2h0LScgKyB3aWRnZXRDb3VudGVyLAogICAgICAgICAgICBpY29uTmFtZTogJ2x1Y2lkZTppbmZvJywKICAgICAgICAgICAgbGFiZWw6ICdSaWdodCAnICsgd2lkZ2V0Q291bnRlciwKICAgICAgICAgICAgcG9zaXRpb246ICdyaWdodCcsCiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IGJvdHRvbWJhci5yZW1vdmVXaWRnZXQoJ3JpZ2h0LScgKyB3aWRnZXRDb3VudGVyKSwKICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIHdpbmRvdy5hZGRBY3Rpb24gPSAoKSA9PiB7CiAgICAgICAgICBhY3Rpb25Db3VudGVyKys7CiAgICAgICAgICBib3R0b21iYXIuYWRkQWN0aW9uKHsKICAgICAgICAgICAgaWQ6ICdhY3Rpb24tJyArIGFjdGlvbkNvdW50ZXIsCiAgICAgICAgICAgIGljb25OYW1lOiAnbHVjaWRlOnphcCcsCiAgICAgICAgICAgIHRvb2x0aXA6ICdBY3Rpb24gJyArIGFjdGlvbkNvdW50ZXIsCiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHsKICAgICAgICAgICAgICBhbGVydCgnQWN0aW9uICcgKyBhY3Rpb25Db3VudGVyICsgJyBjbGlja2VkJyk7CiAgICAgICAgICAgICAgYm90dG9tYmFyLnJlbW92ZUFjdGlvbignYWN0aW9uLScgKyBhY3Rpb25Db3VudGVyKTsKICAgICAgICAgICAgfSwKICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIHdpbmRvdy5jbGVhckFsbCA9ICgpID0+IHsKICAgICAgICAgIGJvdHRvbWJhci5jbGVhcldpZGdldHMoKTsKICAgICAgICAgIGJvdHRvbWJhci5jbGVhckFjdGlvbnMoKTsKICAgICAgICAgIHdpZGdldENvdW50ZXIgPSAwOwogICAgICAgICAgYWN0aW9uQ291bnRlciA9IDA7CiAgICAgICAgfTsKICAgICAgPFwvc2NyaXB0PgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgogIGBdKSkpOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWFwcHVpL2RlZXMtYXBwdWktYm90dG9tYmFyL2RlZXMtYXBwdWktYm90dG9tYmFyLmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfdGhlbWUoKTsKaW5pdF9kZWVzX2ljb24oKTsKdmFyIF9fZXNEZWNvcmF0ZTExID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMxMiA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0FwcHVpQm90dG9tYmFyID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLWFwcHVpLWJvdHRvbWJhciIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3dpZGdldHNfZGVjb3JhdG9yczsKICBsZXQgX3dpZGdldHNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF93aWRnZXRzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY3Rpb25zX2RlY29yYXRvcnM7CiAgbGV0IF9hY3Rpb25zX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWN0aW9uc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzQXBwdWlCb3R0b21iYXIyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfd2lkZ2V0c19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfYWN0aW9uc19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGUxMSh0aGlzLCBudWxsLCBfd2lkZ2V0c19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ3aWRnZXRzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ3aWRnZXRzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLndpZGdldHMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLndpZGdldHMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfd2lkZ2V0c19pbml0aWFsaXplcnMsIF93aWRnZXRzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTEodGhpcywgbnVsbCwgX2FjdGlvbnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYWN0aW9ucyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYWN0aW9ucyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hY3Rpb25zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hY3Rpb25zID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FjdGlvbnNfaW5pdGlhbGl6ZXJzLCBfYWN0aW9uc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTExKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0FwcHVpQm90dG9tYmFyMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jNTsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJBcHAgVUkiXTsKICAgICN3aWRnZXRzX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczEyKHRoaXMsIF93aWRnZXRzX2luaXRpYWxpemVycywgW10pOwogICAgLy8gSU5TVEFOQ0UgUFJPUEVSVElFUwogICAgZ2V0IHdpZGdldHMoKSB7CiAgICAgIHJldHVybiB0aGlzLiN3aWRnZXRzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgd2lkZ2V0cyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jd2lkZ2V0c19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2FjdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczEyKHRoaXMsIF93aWRnZXRzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxMih0aGlzLCBfYWN0aW9uc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgYWN0aW9ucygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FjdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhY3Rpb25zKHZhbHVlMikgewogICAgICB0aGlzLiNhY3Rpb25zX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMjRweDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgLmJvdHRvbS1iYXIgewogICAgICAgIGhlaWdodDogMjRweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgcGFkZGluZzogMCA4cHg7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk0JSkiLCAiaHNsKDAgMCUgNiUpIil9OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODUlKSIsICJoc2woMCAwJSAxNSUpIil9OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQwJSkiLCAiaHNsKDAgMCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLndpZGdldCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNHB4OwogICAgICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzIGVhc2UsIGNvbG9yIDAuMTVzIGVhc2U7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLndpZGdldDpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg4JSkiLCAiaHNsKDAgMCUgMTIlKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDIwJSkiLCAiaHNsKDAgMCUgODAlKSIpfTsKICAgICAgfQoKICAgICAgLndpZGdldCBkZWVzLWljb24gewogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAud2lkZ2V0LXNlcGFyYXRvciB7CiAgICAgICAgd2lkdGg6IDFweDsKICAgICAgICBoZWlnaHQ6IDE0cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDgwJSkiLCAiaHNsKDAgMCUgMjAlKSIpfTsKICAgICAgICBtYXJnaW46IDAgNHB4OwogICAgICB9CgogICAgICAvKiBTdGF0dXMgY29sb3JzIG1hdGNoaW5nIGRlZXMtd29ya3NwYWNlLWJvdHRvbWJhciAqLwogICAgICAud2lkZ2V0LmFjdGl2ZSB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDEwMCUgNDUlKSIsICJoc2woMjEwIDEwMCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLndpZGdldC5zdWNjZXNzIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgxNDIgNzAlIDM1JSkiLCAiaHNsKDE0MiA3MCUgNTAlKSIpfTsKICAgICAgfQoKICAgICAgLndpZGdldC53YXJuaW5nIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgzOCA5MiUgNDUlKSIsICJoc2woMzggOTIlIDU1JSkiKX07CiAgICAgIH0KCiAgICAgIC53aWRnZXQuZXJyb3IgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzAlIDUwJSkiLCAiaHNsKDAgNzAlIDYwJSkiKX07CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgc3BpbiB7CiAgICAgICAgZnJvbSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9CiAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9CiAgICAgIH0KCiAgICAgIC5zcGlubmluZyB7CiAgICAgICAgYW5pbWF0aW9uOiBzcGluIDFzIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgLnNwYWNlciB7CiAgICAgICAgZmxleDogMTsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzIGVhc2U7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0MCUpIiwgImhzbCgwIDAlIDYwJSkiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODglKSIsICJoc2woMCAwJSAxMiUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMjAlKSIsICJoc2woMCAwJSA4MCUpIil9OwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbi5kaXNhYmxlZCB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uLmRpc2FibGVkOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQwJSkiLCAiaHNsKDAgMCUgNjAlKSIpfTsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgY29uc3QgbGVmdFdpZGdldHMgPSB0aGlzLndpZGdldHMuZmlsdGVyKCh3NCkgPT4gdzQucG9zaXRpb24gIT09ICJyaWdodCIpLnNvcnQoKGE1LCBiNikgPT4gKGE1Lm9yZGVyIHx8IDApIC0gKGI2Lm9yZGVyIHx8IDApKTsKICAgICAgY29uc3QgcmlnaHRXaWRnZXRzID0gdGhpcy53aWRnZXRzLmZpbHRlcigodzQpID0+IHc0LnBvc2l0aW9uID09PSAicmlnaHQiKS5zb3J0KChhNSwgYjYpID0+IChhNS5vcmRlciB8fCAwKSAtIChiNi5vcmRlciB8fCAwKSk7CiAgICAgIGNvbnN0IGxlZnRBY3Rpb25zID0gdGhpcy5hY3Rpb25zLmZpbHRlcigoYTUpID0+IGE1LnBvc2l0aW9uID09PSAibGVmdCIpOwogICAgICBjb25zdCByaWdodEFjdGlvbnMgPSB0aGlzLmFjdGlvbnMuZmlsdGVyKChhNSkgPT4gYTUucG9zaXRpb24gIT09ICJsZWZ0Iik7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iYm90dG9tLWJhciI+CiAgICAgICAgPCEtLSBMZWZ0IGFjdGlvbnMgLS0+CiAgICAgICAgJHtsZWZ0QWN0aW9ucy5tYXAoKGFjdGlvbikgPT4gdGhpcy5yZW5kZXJBY3Rpb24oYWN0aW9uKSl9CgogICAgICAgIDwhLS0gTGVmdCB3aWRnZXRzIC0tPgogICAgICAgICR7bGVmdFdpZGdldHMubWFwKCh3aWRnZXQsIGluZGV4MikgPT4gYjJgCiAgICAgICAgICAke2luZGV4MiA+IDAgfHwgbGVmdEFjdGlvbnMubGVuZ3RoID4gMCA/IGIyYDxkaXYgY2xhc3M9IndpZGdldC1zZXBhcmF0b3IiPjwvZGl2PmAgOiAiIn0KICAgICAgICAgICR7dGhpcy5yZW5kZXJXaWRnZXQod2lkZ2V0KX0KICAgICAgICBgKX0KCiAgICAgICAgPGRpdiBjbGFzcz0ic3BhY2VyIj48L2Rpdj4KCiAgICAgICAgPCEtLSBSaWdodCB3aWRnZXRzIC0tPgogICAgICAgICR7cmlnaHRXaWRnZXRzLm1hcCgod2lkZ2V0LCBpbmRleDIpID0+IGIyYAogICAgICAgICAgJHt0aGlzLnJlbmRlcldpZGdldCh3aWRnZXQpfQogICAgICAgICAgJHtpbmRleDIgPCByaWdodFdpZGdldHMubGVuZ3RoIC0gMSB8fCByaWdodEFjdGlvbnMubGVuZ3RoID4gMCA/IGIyYDxkaXYgY2xhc3M9IndpZGdldC1zZXBhcmF0b3IiPjwvZGl2PmAgOiAiIn0KICAgICAgICBgKX0KCiAgICAgICAgPCEtLSBSaWdodCBhY3Rpb25zIC0tPgogICAgICAgICR7cmlnaHRBY3Rpb25zLm1hcCgoYWN0aW9uKSA9PiB0aGlzLnJlbmRlckFjdGlvbihhY3Rpb24pKX0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgcmVuZGVyV2lkZ2V0KHdpZGdldCkgewogICAgICBjb25zdCBzdGF0dXNDbGFzcyA9IHdpZGdldC5zdGF0dXMgJiYgd2lkZ2V0LnN0YXR1cyAhPT0gImlkbGUiID8gd2lkZ2V0LnN0YXR1cyA6ICIiOwogICAgICBjb25zdCBpY29uTmFtZSA9IHdpZGdldC5pY29uTmFtZSA/IHdpZGdldC5pY29uTmFtZS5zdGFydHNXaXRoKCJsdWNpZGU6IikgPyB3aWRnZXQuaWNvbk5hbWUgOiBgbHVjaWRlOiR7d2lkZ2V0Lmljb25OYW1lfWAgOiAiIjsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9IndpZGdldCAke3N0YXR1c0NsYXNzfSIKICAgICAgICB0aXRsZT0iJHt3aWRnZXQudG9vbHRpcCB8fCAiIn0iCiAgICAgICAgQGNsaWNrPSR7KCkgPT4gd2lkZ2V0Lm9uQ2xpY2s/LigpfQogICAgICAgIEBjb250ZXh0bWVudT0keyhlMTEpID0+IHRoaXMuaGFuZGxlV2lkZ2V0Q29udGV4dE1lbnUoZTExLCB3aWRnZXQpfQogICAgICA+CiAgICAgICAgJHtpY29uTmFtZSA/IGIyYAogICAgICAgICAgPGRlZXMtaWNvbgogICAgICAgICAgICAuaWNvbj0ke2ljb25OYW1lfQogICAgICAgICAgICBpY29uU2l6ZT0iMTIiCiAgICAgICAgICAgIGNsYXNzPSIke3dpZGdldC5sb2FkaW5nID8gInNwaW5uaW5nIiA6ICIifSIKICAgICAgICAgID48L2RlZXMtaWNvbj4KICAgICAgICBgIDogIiJ9CiAgICAgICAgJHt3aWRnZXQubGFiZWwgPyBiMmA8c3Bhbj4ke3dpZGdldC5sYWJlbH08L3NwYW4+YCA6ICIifQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJBY3Rpb24oYWN0aW9uKSB7CiAgICAgIGNvbnN0IGljb25OYW1lID0gYWN0aW9uLmljb25OYW1lLnN0YXJ0c1dpdGgoImx1Y2lkZToiKSA/IGFjdGlvbi5pY29uTmFtZSA6IGBsdWNpZGU6JHthY3Rpb24uaWNvbk5hbWV9YDsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9ImFjdGlvbi1idXR0b24gJHthY3Rpb24uZGlzYWJsZWQgPyAiZGlzYWJsZWQiIDogIiJ9IgogICAgICAgIHRpdGxlPSIke2FjdGlvbi50b29sdGlwIHx8ICIifSIKICAgICAgICBAY2xpY2s9JHsoKSA9PiAhYWN0aW9uLmRpc2FibGVkICYmIGFjdGlvbi5vbkNsaWNrPy4oKX0KICAgICAgPgogICAgICAgIDxkZWVzLWljb24KICAgICAgICAgIC5pY29uPSR7aWNvbk5hbWV9CiAgICAgICAgICBpY29uU2l6ZT0iMTIiCiAgICAgICAgPjwvZGVlcy1pY29uPgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBoYW5kbGVXaWRnZXRDb250ZXh0TWVudShlMTEsIHdpZGdldCkgewogICAgICBpZiAoIXdpZGdldC5jb250ZXh0TWVudUl0ZW1zIHx8IHdpZGdldC5jb250ZXh0TWVudUl0ZW1zLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm47CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb25zdCBtZW51SXRlbXMgPSBbXTsKICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHdpZGdldC5jb250ZXh0TWVudUl0ZW1zKSB7CiAgICAgICAgaWYgKGl0ZW0uZGl2aWRlcikgewogICAgICAgICAgbWVudUl0ZW1zLnB1c2goeyBkaXZpZGVyOiB0cnVlIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtZW51SXRlbXMucHVzaCh7CiAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSwKICAgICAgICAgICAgaWNvbk5hbWU6IGl0ZW0uaWNvbk5hbWUsCiAgICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICAgIGF3YWl0IGl0ZW0uYWN0aW9uKCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYXdhaXQgRGVlc0NvbnRleHRtZW51Lm9wZW5Db250ZXh0TWVudVdpdGhPcHRpb25zKGUxMSwgbWVudUl0ZW1zKTsKICAgIH0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gQVBJIE1FVEhPRFMgKGltcGxlbWVudHMgSUJvdHRvbUJhckFQSSkKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLyoqCiAgICAgKiBBZGQgYSB3aWRnZXQgdG8gdGhlIGJvdHRvbSBiYXIKICAgICAqLwogICAgYWRkV2lkZ2V0KHdpZGdldCkgewogICAgICB0aGlzLndpZGdldHMgPSB0aGlzLndpZGdldHMuZmlsdGVyKCh3NCkgPT4gdzQuaWQgIT09IHdpZGdldC5pZCk7CiAgICAgIHRoaXMud2lkZ2V0cyA9IFsuLi50aGlzLndpZGdldHMsIHdpZGdldF07CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZSBhbiBleGlzdGluZyB3aWRnZXQgYnkgSUQKICAgICAqLwogICAgdXBkYXRlV2lkZ2V0KGlkLCB1cGRhdGUpIHsKICAgICAgdGhpcy53aWRnZXRzID0gdGhpcy53aWRnZXRzLm1hcCgodzQpID0+IHc0LmlkID09PSBpZCA/IHsgLi4udzQsIC4uLnVwZGF0ZSB9IDogdzQpOwogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmUgYSB3aWRnZXQgYnkgSUQKICAgICAqLwogICAgcmVtb3ZlV2lkZ2V0KGlkKSB7CiAgICAgIHRoaXMud2lkZ2V0cyA9IHRoaXMud2lkZ2V0cy5maWx0ZXIoKHc0KSA9PiB3NC5pZCAhPT0gaWQpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgYSB3aWRnZXQgYnkgSUQKICAgICAqLwogICAgZ2V0V2lkZ2V0KGlkKSB7CiAgICAgIHJldHVybiB0aGlzLndpZGdldHMuZmluZCgodzQpID0+IHc0LmlkID09PSBpZCk7CiAgICB9CiAgICAvKioKICAgICAqIENsZWFyIGFsbCB3aWRnZXRzCiAgICAgKi8KICAgIGNsZWFyV2lkZ2V0cygpIHsKICAgICAgdGhpcy53aWRnZXRzID0gW107CiAgICB9CiAgICAvKioKICAgICAqIEFkZCBhbiBhY3Rpb24gYnV0dG9uCiAgICAgKi8KICAgIGFkZEFjdGlvbihhY3Rpb24pIHsKICAgICAgdGhpcy5hY3Rpb25zID0gdGhpcy5hY3Rpb25zLmZpbHRlcigoYTUpID0+IGE1LmlkICE9PSBhY3Rpb24uaWQpOwogICAgICB0aGlzLmFjdGlvbnMgPSBbLi4udGhpcy5hY3Rpb25zLCBhY3Rpb25dOwogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmUgYW4gYWN0aW9uIGJ5IElECiAgICAgKi8KICAgIHJlbW92ZUFjdGlvbihpZCkgewogICAgICB0aGlzLmFjdGlvbnMgPSB0aGlzLmFjdGlvbnMuZmlsdGVyKChhNSkgPT4gYTUuaWQgIT09IGlkKTsKICAgIH0KICAgIC8qKgogICAgICogQ2xlYXIgYWxsIGFjdGlvbnMKICAgICAqLwogICAgY2xlYXJBY3Rpb25zKCkgewogICAgICB0aGlzLmFjdGlvbnMgPSBbXTsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczEyKHRoaXMsIF9hY3Rpb25zX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMTIoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNBcHB1aUJvdHRvbWJhcjIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWxheW91dC9kZWVzLXBhbmVsL2RlZXMtcGFuZWwuZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmM2ID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgJHtpYAogICAgICAuZGVtby1iYWNrZ3JvdW5kIHsKICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NSUpIiwgImhzbCgwIDAlIDUlKSIpfTsKICAgICAgICBtaW4taGVpZ2h0OiAxMDB2aDsKICAgICAgfQogICAgICAKICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICBtYXgtd2lkdGg6IDEyMDBweDsKICAgICAgICBtYXJnaW46IDAgYXV0bzsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAyNHB4OwogICAgICB9CiAgICAgIAogICAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgbWFyZ2luOiAzMnB4IDAgMTZweCAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk1JSkiKX07CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAyNWVtOwogICAgICB9CiAgICAgIAogICAgICAuc2VjdGlvbi10aXRsZTpmaXJzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgfQogICAgICAKICAgICAgLmdyaWQtbGF5b3V0IHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsKICAgICAgICBnYXA6IDI0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5ncmlkLTNjb2wgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyIDFmcjsKICAgICAgICBnYXA6IDI0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA5NjhweCkgewogICAgICAgIC5ncmlkLTNjb2wgewogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHsKICAgICAgICAuZ3JpZC1sYXlvdXQgewogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBjb2RlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBwYWRkaW5nOiAycHggNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KICAgIGB9CiAgPC9zdHlsZT4KICAKICA8ZGl2IGNsYXNzPSJkZW1vLWJhY2tncm91bmQiPgogICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgICA8aDIgY2xhc3M9InNlY3Rpb24tdGl0bGUiPkRlZmF1bHQgUGFuZWxzPC9oMj4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJQYW5lbCBDb21wb25lbnQifSAuc3VidGl0bGU9JHsiVGhlIGRlZmF1bHQgcGFuZWwgdmFyaWFudCB3aXRoIHNoYWRjbi1pbnNwaXJlZCBzdHlsaW5nIn0+CiAgICAgICAgPHA+VGhlIHBhbmVsIGNvbXBvbmVudCBhdXRvbWF0aWNhbGx5IGZvbGxvd3MgdGhlIHRoZW1lIGFuZCBwcm92aWRlcyBjb25zaXN0ZW50IHN0eWxpbmcgZm9yIGdyb3VwZWQgY29udGVudC48L3A+CiAgICAgICAgPHA+SXQncyBwZXJmZWN0IGZvciBjcmVhdGluZyBzZWN0aW9ucyBpbiB5b3VyIGFwcGxpY2F0aW9uIHdpdGggcHJvcGVyIHNwYWNpbmcgYW5kIGJvcmRlcnMuPC9wPgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJncmlkLWxheW91dCI+CiAgICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkZlYXR1cmUgT3ZlcnZpZXcifSAuc3VidGl0bGU9JHsiS2V5IGNhcGFiaWxpdGllcyJ9PgogICAgICAgICAgPHA+R3JpZCBsYXlvdXRzIHdvcmsgZ3JlYXQgd2l0aCBwYW5lbHMgZm9yIGNyZWF0aW5nIGRhc2hib2FyZHMgYW5kIGZlYXR1cmUgc2VjdGlvbnMuPC9wPgogICAgICAgICAgPGRlZXMtYnV0dG9uPkxlYXJuIE1vcmU8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgICAKICAgICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiUXVpY2sgQWN0aW9ucyJ9IC5zdWJ0aXRsZT0keyJDb21tb24gdGFza3MifT4KICAgICAgICAgIDxwPkVhY2ggcGFuZWwgbWFpbnRhaW5zIGNvbnNpc3RlbnQgc3BhY2luZyBhbmQgc3R5bGluZyBhY3Jvc3MgeW91ciBhcHBsaWNhdGlvbi48L3A+CiAgICAgICAgICA8ZGVlcy1idXR0b24+R2V0IFN0YXJ0ZWQ8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgPC9kaXY+CiAgICAgIAogICAgICA8aDIgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlBhbmVsIFZhcmlhbnRzPC9oMj4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJEZWZhdWx0IFZhcmlhbnQifSAudmFyaWFudD0keyJkZWZhdWx0In0+CiAgICAgICAgPHA+VGhlIGRlZmF1bHQgdmFyaWFudCBoYXMgYSB3aGl0ZSBiYWNrZ3JvdW5kLCBzdWJ0bGUgYm9yZGVyLCBhbmQgbWluaW1hbCBzaGFkb3cuIEl0J3MgdGhlIHN0YW5kYXJkIGNob2ljZSBmb3IgbW9zdCBjb250ZW50LjwvcD4KICAgICAgICA8cD5Vc2UgPGNvZGU+dmFyaWFudD0iZGVmYXVsdCI8L2NvZGU+IG9yIG9taXQgdGhlIHZhcmlhbnQgcHJvcGVydHkuPC9wPgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiT3V0bGluZSBWYXJpYW50In0gLnN1YnRpdGxlPSR7IlRyYW5zcGFyZW50IGJhY2tncm91bmQgd2l0aCBib3JkZXIifSAudmFyaWFudD0keyJvdXRsaW5lIn0+CiAgICAgICAgPHA+VGhlIG91dGxpbmUgdmFyaWFudCByZW1vdmVzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGFuZCBzaGFkb3csIGtlZXBpbmcgb25seSB0aGUgYm9yZGVyLjwvcD4KICAgICAgICA8cD5Vc2UgPGNvZGU+dmFyaWFudD0ib3V0bGluZSI8L2NvZGU+IGZvciBhIGxpZ2h0ZXIgdmlzdWFsIHdlaWdodC48L3A+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJHaG9zdCBWYXJpYW50In0gLnN1YnRpdGxlPSR7Ik1pbmltYWwgc3R5bGluZyBmb3Igc3VidGxlIHNlY3Rpb25zIn0gLnZhcmlhbnQ9JHsiZ2hvc3QifT4KICAgICAgICA8cD5UaGUgZ2hvc3QgdmFyaWFudCBoYXMgbm8gYm9yZGVyIG9yIGJhY2tncm91bmQgYnkgZGVmYXVsdCwgb25seSBzaG93aW5nIGEgc3VidGxlIGJhY2tncm91bmQgb24gaG92ZXIuPC9wPgogICAgICAgIDxwPlVzZSA8Y29kZT52YXJpYW50PSJnaG9zdCI8L2NvZGU+IGZvciB0aGUgbW9zdCBtaW5pbWFsIGFwcGVhcmFuY2UuPC9wPgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8aDIgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlBhbmVsIFNpemVzPC9oMj4KICAgICAgCiAgICAgIDxkaXYgY2xhc3M9ImdyaWQtM2NvbCI+CiAgICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IlNtYWxsIFBhbmVsIn0gLnNpemU9JHsic20ifT4KICAgICAgICAgIDxwPkNvbXBhY3QgcGFkZGluZyBmb3IgZGVuc2UgbGF5b3V0cy48L3A+CiAgICAgICAgICA8cD5Vc2UgPGNvZGU+c2l6ZT0ic20iPC9jb2RlPjwvcD4KICAgICAgICA8L2RlZXMtcGFuZWw+CiAgICAgICAgCiAgICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7Ik1lZGl1bSBQYW5lbCJ9IC5zaXplPSR7Im1kIn0+CiAgICAgICAgICA8cD5EZWZhdWx0IHNpemUgd2l0aCBiYWxhbmNlZCBzcGFjaW5nLjwvcD4KICAgICAgICAgIDxwPlVzZSA8Y29kZT5zaXplPSJtZCI8L2NvZGU+IG9yIG9taXQuPC9wPgogICAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgICAKICAgICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiTGFyZ2UgUGFuZWwifSAuc2l6ZT0keyJsZyJ9PgogICAgICAgICAgPHA+R2VuZXJvdXMgcGFkZGluZyBmb3IgcHJvbWluZW50IHNlY3Rpb25zLjwvcD4KICAgICAgICAgIDxwPlVzZSA8Y29kZT5zaXplPSJsZyI8L2NvZGU+PC9wPgogICAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgPC9kaXY+CiAgICAgIAogICAgICA8aDIgY2xhc3M9InNlY3Rpb24tdGl0bGUiPkNvbXBsZXggRXhhbXBsZXM8L2gyPgogICAgICAKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkZvcm0gRXhhbXBsZSJ9IC5zdWJ0aXRsZT0keyJQYW5lbHMgd29yayBncmVhdCBmb3Igb3JnYW5pemluZyBmb3JtIHNlY3Rpb25zIn0+CiAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgLmxhYmVsPSR7IlByb2plY3QgTmFtZSJ9IC5yZXF1aXJlZD0ke3RydWV9PjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAubGFiZWw9JHsiRGVzY3JpcHRpb24ifSAuaW5wdXRUeXBlPSR7InRleHRhcmVhIn0+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1kcm9wZG93biAKICAgICAgICAgICAgLmxhYmVsPSR7IkNhdGVnb3J5In0gCiAgICAgICAgICAgIC5vcHRpb25zPSR7WwogIHsgb3B0aW9uOiAiV2ViIERldmVsb3BtZW50Iiwga2V5OiAid2ViIiB9LAogIHsgb3B0aW9uOiAiTW9iaWxlIEFwcCIsIGtleTogIm1vYmlsZSIgfSwKICB7IG9wdGlvbjogIkRlc2t0b3AgU29mdHdhcmUiLCBrZXk6ICJkZXNrdG9wIiB9Cl19CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWRyb3Bkb3duPgogICAgICAgICAgPGRlZXMtZm9ybS1zdWJtaXQ+Q3JlYXRlIFByb2plY3Q8L2RlZXMtZm9ybS1zdWJtaXQ+CiAgICAgICAgPC9kZWVzLWZvcm0+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJOZXN0ZWQgUGFuZWxzIn0gLnN1YnRpdGxlPSR7IlBhbmVscyBjYW4gYmUgbmVzdGVkIGZvciBoaWVyYXJjaGljYWwgb3JnYW5pemF0aW9uIn0+CiAgICAgICAgPHA+WW91IGNhbiBuZXN0IHBhbmVscyB0byBjcmVhdGUgbW9yZSBjb21wbGV4IGxheW91dHM6PC9wPgogICAgICAgIAogICAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJOZXN0ZWQgUGFuZWwgMSJ9IC52YXJpYW50PSR7Im91dGxpbmUifSAuc2l6ZT0keyJzbSJ9PgogICAgICAgICAgPHA+VGhpcyBpcyBhIG5lc3RlZCBwYW5lbCB3aXRoIG91dGxpbmUgdmFyaWFudCBhbmQgc21hbGwgc2l6ZS48L3A+CiAgICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAgIAogICAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJOZXN0ZWQgUGFuZWwgMiJ9IC52YXJpYW50PSR7Imdob3N0In0gLnNpemU9JHsic20ifT4KICAgICAgICAgIDxwPlRoaXMgaXMgYW5vdGhlciBuZXN0ZWQgcGFuZWwgd2l0aCBnaG9zdCB2YXJpYW50LjwvcD4KICAgICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxoMiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+VW50aXRsZWQgUGFuZWxzPC9oMj4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsPgogICAgICAgIDxwPlBhbmVscyB3b3JrIGdyZWF0IGV2ZW4gd2l0aG91dCBhIHRpdGxlIGZvciBzaW1wbGUgY29udGVudCBncm91cGluZy48L3A+CiAgICAgICAgPHA+VGhleSBwcm92aWRlIHZpc3VhbCBzZXBhcmF0aW9uIGFuZCBjb25zaXN0ZW50IHBhZGRpbmcgdGhyb3VnaG91dCB5b3VyIGludGVyZmFjZS48L3A+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkaXYgY2xhc3M9ImdyaWQtbGF5b3V0Ij4KICAgICAgICA8ZGVlcy1wYW5lbCAudmFyaWFudD0keyJvdXRsaW5lIn0+CiAgICAgICAgICA8aDQgc3R5bGU9Im1hcmdpbi10b3A6IDA7Ij5DdXN0b20gQ29udGVudDwvaDQ+CiAgICAgICAgICA8cD5Zb3UgY2FuIGFkZCB5b3VyIG93biBoZWFkaW5ncyBhbmQgc3RydWN0dXJlIHdpdGhpbiB1bnRpdGxlZCBwYW5lbHMuPC9wPgogICAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgICAKICAgICAgICA8ZGVlcy1wYW5lbCAudmFyaWFudD0keyJnaG9zdCJ9PgogICAgICAgICAgPGg0IHN0eWxlPSJtYXJnaW4tdG9wOiAwOyI+TWluaW1hbCBTdHlsZTwvaDQ+CiAgICAgICAgICA8cD5HaG9zdCBwYW5lbHMgd2l0aG91dCB0aXRsZXMgY3JlYXRlIHZlcnkgc3VidGxlIGNvbnRlbnQgc2VjdGlvbnMuPC9wPgogICAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBmb250cy5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZ2Vpc3RTYW5zRm9udCA9ICJHZWlzdCBTYW5zIjsKdmFyIGludGVsT25lTW9ub0ZvbnQgPSAiSW50ZWwgT25lIE1vbm8iOwp2YXIgZ2Vpc3RGb250RmFtaWx5ID0gYCcke2dlaXN0U2Fuc0ZvbnR9JywgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCAnUm9ib3RvJywgJ094eWdlbicsICdVYnVudHUnLCAnQ2FudGFyZWxsJywgJ0ZpcmEgU2FucycsICdEcm9pZCBTYW5zJywgJ0hlbHZldGljYSBOZXVlJywgc2Fucy1zZXJpZmA7CnZhciBtb25vRm9udEZhbWlseSA9IGAnJHtpbnRlbE9uZU1vbm9Gb250fScsICdTRiBNb25vJywgJ01vbmFjbycsICdJbmNvbnNvbGF0YScsICdGaXJhIENvZGUnLCAnRmlyYSBNb25vJywgJ0Ryb2lkIFNhbnMgTW9ubycsICdDb3VyaWVyIE5ldycsIG1vbm9zcGFjZWA7CnZhciBjc3NHZWlzdEZvbnRGYW1pbHkgPSByKGdlaXN0Rm9udEZhbWlseSk7CnZhciBjc3NNb25vRm9udEZhbWlseSA9IHIobW9ub0ZvbnRGYW1pbHkpOwp2YXIgY2FsU2Fuc0ZvbnQgPSAiQ2FsIFNhbnMiOwp2YXIgY2FsU2Fuc0ZvbnRGYW1pbHkgPSBgJyR7Y2FsU2Fuc0ZvbnR9JywgJHtnZWlzdEZvbnRGYW1pbHl9YDsKdmFyIGNzc0NhbFNhbnNGb250RmFtaWx5ID0gcihjYWxTYW5zRm9udEZhbWlseSk7CnZhciByb2JvdG9TbGFiRm9udCA9ICJSb2JvdG8gU2xhYiI7CnZhciByb2JvdG9TbGFiRm9udEZhbWlseSA9IGAnJHtyb2JvdG9TbGFiRm9udH0nLCBHZW9yZ2lhLCBzZXJpZmA7CnZhciBjc3NSb2JvdG9TbGFiRm9udEZhbWlseSA9IHIocm9ib3RvU2xhYkZvbnRGYW1pbHkpOwp2YXIgYmFzZUZvbnRTdHlsZXMgPSByKGAKICBmb250LWZhbWlseTogJHtnZWlzdEZvbnRGYW1pbHl9OwogIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7CiAgZm9udC1mZWF0dXJlLXNldHRpbmdzOiAnY3YxMScsICd0bnVtJywgJ2N2MDUnIDE7CmApOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWxheW91dC9kZWVzLXBhbmVsL2RlZXMtcGFuZWwuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlMTIgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczEzID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzUGFuZWwgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtcGFuZWwiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF90aXRsZV9kZWNvcmF0b3JzOwogIGxldCBfdGl0bGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90aXRsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc3VidGl0bGVfZGVjb3JhdG9yczsKICBsZXQgX3N1YnRpdGxlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc3VidGl0bGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhcmlhbnRfZGVjb3JhdG9yczsKICBsZXQgX3ZhcmlhbnRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YXJpYW50X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaXplX2RlY29yYXRvcnM7CiAgbGV0IF9zaXplX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2l6ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcnVuQWZ0ZXJSZW5kZXJfZGVjb3JhdG9yczsKICBsZXQgX3J1bkFmdGVyUmVuZGVyX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcnVuQWZ0ZXJSZW5kZXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1BhbmVsMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3RpdGxlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfc3VidGl0bGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF92YXJpYW50X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfc2l6ZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3J1bkFmdGVyUmVuZGVyX2RlY29yYXRvcnMgPSBbbjUoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXTsKICAgICAgX19lc0RlY29yYXRlMTIodGhpcywgbnVsbCwgX3RpdGxlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRpdGxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0aXRsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50aXRsZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGl0bGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGl0bGVfaW5pdGlhbGl6ZXJzLCBfdGl0bGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxMih0aGlzLCBudWxsLCBfc3VidGl0bGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic3VidGl0bGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInN1YnRpdGxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnN1YnRpdGxlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zdWJ0aXRsZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zdWJ0aXRsZV9pbml0aWFsaXplcnMsIF9zdWJ0aXRsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTEyKHRoaXMsIG51bGwsIF92YXJpYW50X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZhcmlhbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInZhcmlhbnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmFyaWFudCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudmFyaWFudCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF92YXJpYW50X2luaXRpYWxpemVycywgX3ZhcmlhbnRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxMih0aGlzLCBudWxsLCBfc2l6ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaXplIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaXplIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNpemUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNpemUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2l6ZV9pbml0aWFsaXplcnMsIF9zaXplX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTIodGhpcywgbnVsbCwgX3J1bkFmdGVyUmVuZGVyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJ1bkFmdGVyUmVuZGVyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJydW5BZnRlclJlbmRlciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5ydW5BZnRlclJlbmRlciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucnVuQWZ0ZXJSZW5kZXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcnVuQWZ0ZXJSZW5kZXJfaW5pdGlhbGl6ZXJzLCBfcnVuQWZ0ZXJSZW5kZXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxMihudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNQYW5lbDIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzY7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiTGF5b3V0Il07CiAgICAjdGl0bGVfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMTModGhpcywgX3RpdGxlX2luaXRpYWxpemVycywgIiIpOwogICAgZ2V0IHRpdGxlKCkgewogICAgICByZXR1cm4gdGhpcy4jdGl0bGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0aXRsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdGl0bGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzdWJ0aXRsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTModGhpcywgX3RpdGxlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxMyh0aGlzLCBfc3VidGl0bGVfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IHN1YnRpdGxlKCkgewogICAgICByZXR1cm4gdGhpcy4jc3VidGl0bGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzdWJ0aXRsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc3VidGl0bGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN2YXJpYW50X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxMyh0aGlzLCBfc3VidGl0bGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczEzKHRoaXMsIF92YXJpYW50X2luaXRpYWxpemVycywgImRlZmF1bHQiKSk7CiAgICBnZXQgdmFyaWFudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ZhcmlhbnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB2YXJpYW50KHZhbHVlMikgewogICAgICB0aGlzLiN2YXJpYW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTModGhpcywgX3ZhcmlhbnRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczEzKHRoaXMsIF9zaXplX2luaXRpYWxpemVycywgIm1kIikpOwogICAgZ2V0IHNpemUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaXplX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2l6ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3J1bkFmdGVyUmVuZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxMyh0aGlzLCBfc2l6ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTModGhpcywgX3J1bkFmdGVyUmVuZGVyX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgcnVuQWZ0ZXJSZW5kZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNydW5BZnRlclJlbmRlcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHJ1bkFmdGVyUmVuZGVyKHZhbHVlMikgewogICAgICB0aGlzLiNydW5BZnRlclJlbmRlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LWZhbWlseTogJHtjc3NHZWlzdEZvbnRGYW1pbHl9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSAzLjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICB9CgogICAgICAvKiBWYXJpYW50OiBkZWZhdWx0ICovCiAgICAgIDpob3N0KFt2YXJpYW50PSJkZWZhdWx0Il0pIHsKICAgICAgICBib3gtc2hhZG93OiAwIDFweCAycHggMCBoc2woMCAwJSAwJSAvIDAuMDUpOwogICAgICB9CgogICAgICAvKiBWYXJpYW50OiBvdXRsaW5lICovCiAgICAgIDpob3N0KFt2YXJpYW50PSJvdXRsaW5lIl0pIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3gtc2hhZG93OiBub25lOwogICAgICB9CgogICAgICAvKiBWYXJpYW50OiBnaG9zdCAqLwogICAgICA6aG9zdChbdmFyaWFudD0iZ2hvc3QiXSkgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm94LXNoYWRvdzogbm9uZTsKICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICB9CgogICAgICAvKiBTaXplIHZhcmlhdGlvbnMgKi8KICAgICAgOmhvc3QoW3NpemU9InNtIl0pIHsKICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICB9CgogICAgICA6aG9zdChbc2l6ZT0ibGciXSkgewogICAgICAgIHBhZGRpbmc6IDMycHg7CiAgICAgIH0KCiAgICAgIC5oZWFkZXIgewogICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgIH0KCiAgICAgIC5oZWFkZXI6ZW1wdHkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC50aXRsZSB7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk1JSkiKX07CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAyNWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICAgIH0KCiAgICAgIC8qIFRpdGxlIHNpemUgdmFyaWF0aW9ucyAqLwogICAgICA6aG9zdChbc2l6ZT0ic20iXSkgLnRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgIH0KCiAgICAgIDpob3N0KFtzaXplPSJsZyJdKSAudGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgfQoKICAgICAgLnN1YnRpdGxlIHsKICAgICAgICBtYXJnaW46IDRweCAwIDAgMDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNTYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNTUuMSUpIil9OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMDZlbTsKICAgICAgICBsaW5lLWhlaWdodDogMS41OwogICAgICB9CgogICAgICAvKiBTdWJ0aXRsZSBzaXplIHZhcmlhdGlvbnMgKi8KICAgICAgOmhvc3QoW3NpemU9InNtIl0pIC5zdWJ0aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICB9CgogICAgICA6aG9zdChbc2l6ZT0ibGciXSkgLnN1YnRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgICAgbWFyZ2luLXRvcDogNnB4OwogICAgICB9CgogICAgICAuY29udGVudCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDI2LjclKSIsICJoc2woMjE3LjkgMTAuNiUgODQuOSUpIil9OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBsaW5lLWhlaWdodDogMS42OwogICAgICB9CgogICAgICAvKiBDb250ZW50IHNpemUgdmFyaWF0aW9ucyAqLwogICAgICA6aG9zdChbc2l6ZT0ic20iXSkgLmNvbnRlbnQgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgOmhvc3QoW3NpemU9ImxnIl0pIC5jb250ZW50IHsKICAgICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgIH0KCiAgICAgIC8qIFJlbW92ZSBtYXJnaW5zIGZyb20gZmlyc3QgYW5kIGxhc3QgY2hpbGRyZW4gKi8KICAgICAgLmNvbnRlbnQgOjpzbG90dGVkKCo6Zmlyc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CgogICAgICAuY29udGVudCA6OnNsb3R0ZWQoKjpsYXN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLyogSW50ZXJhY3RpdmUgc3RhdGVzIGZvciBkZWZhdWx0IHZhcmlhbnQgKi8KICAgICAgOmhvc3QoW3ZhcmlhbnQ9ImRlZmF1bHQiXTpob3ZlcikgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDc5LjglKSIsICJoc2woMCAwJSAyMC45JSkiKX07CiAgICAgICAgYm94LXNoYWRvdzogMCA0cHggNnB4IC0xcHggaHNsKDAgMCUgMCUgLyAwLjEpLCAwIDJweCA0cHggLTJweCBoc2woMCAwJSAwJSAvIDAuMSk7CiAgICAgIH0KCiAgICAgIC8qIEludGVyYWN0aXZlIHN0YXRlcyBmb3Igb3V0bGluZSB2YXJpYW50ICovCiAgICAgIDpob3N0KFt2YXJpYW50PSJvdXRsaW5lIl06aG92ZXIpIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA3OS44JSkiLCAiaHNsKDAgMCUgMjAuOSUpIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5OCUpIiwgImhzbCgwIDAlIDcuOCUpIil9OwogICAgICB9CgogICAgICAvKiBJbnRlcmFjdGl2ZSBzdGF0ZXMgZm9yIGdob3N0IHZhcmlhbnQgKi8KICAgICAgOmhvc3QoW3ZhcmlhbnQ9Imdob3N0Il06aG92ZXIpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUuMSUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgfQoKICAgICAgLyogRm9jdXMgc3RhdGVzICovCiAgICAgIDpob3N0KDpmb2N1cy13aXRoaW4pIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA1MS4yJSkiLCAiaHNsKDIxNy4yIDkxLjIlIDU5LjglKSIpfTsKICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA1MS4yJSAvIDAuMSkiLCAiaHNsKDIxNy4yIDkxLjIlIDU5LjglIC8gMC4xKSIpfTsKICAgICAgfQoKICAgICAgLyogTmVzdGVkIHBhbmVscyBzcGFjaW5nICovCiAgICAgIDo6c2xvdHRlZChkZWVzLXBhbmVsKSB7CiAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgfQoKICAgICAgOjpzbG90dGVkKGRlZXMtcGFuZWw6Zmlyc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgJHt0aGlzLnRpdGxlID8gYjJgPGgzIGNsYXNzPSJ0aXRsZSI+JHt0aGlzLnRpdGxlfTwvaDM+YCA6ICIifQogICAgICAgICR7dGhpcy5zdWJ0aXRsZSA/IGIyYDxwIGNsYXNzPSJzdWJ0aXRsZSI+JHt0aGlzLnN1YnRpdGxlfTwvcD5gIDogIiJ9CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgICA8c2xvdD48L3Nsb3Q+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZCgpIHsKICAgICAgaWYgKHRoaXMucnVuQWZ0ZXJSZW5kZXIpIHsKICAgICAgICBhd2FpdCB0aGlzLnJ1bkFmdGVyUmVuZGVyKHRoaXMpOwogICAgICB9CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnMxMyh0aGlzLCBfcnVuQWZ0ZXJSZW5kZXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnMxMyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1BhbmVsMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZGF0YXZpZXcvZGVlcy1zdGF0c2dyaWQvZGVlcy1zdGF0c2dyaWQuZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgX2EyOwp2YXIgZ2VuZXJhdGVDcHVDb3JlcyA9IChjb3VudDIpID0+IHsKICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQyIH0sIChfNSwgaTExKSA9PiAoewogICAgaWQ6IGkxMSwKICAgIHVzYWdlOiBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiAxMDApLAogICAgbGFiZWw6IGAke2kxMX1gCiAgfSkpOwp9Owp2YXIgZGVtb0Z1bmM3ID0gKCkgPT4gewogIHJldHVybiBiMihfYTIgfHwgKF9hMiA9IF9fdGVtcGxhdGUoWyJcbiAgPGRlZXMtZGVtb3dyYXBwZXI+XG4gICAgPHN0eWxlPlxuICAgICAgIiwgJ1xuICAgIDwvc3R5bGU+XG4gICAgXG4gICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPlxuICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPScsICIgLnN1YnRpdGxlPSIsICI+XG4gICAgICAgIDxkZWVzLXN0YXRzZ3JpZFxuICAgICAgICAgIC50aWxlcz0iLCAiXG4gICAgICAgICAgLmdyaWRBY3Rpb25zPSIsICJcbiAgICAgICAgICAubWluVGlsZVdpZHRoPSIsICJcbiAgICAgICAgICAuZ2FwPSIsICdcbiAgICAgICAgPjwvZGVlcy1zdGF0c2dyaWQ+XG4gICAgICAgIFxuICAgICAgICA8ZGl2IGlkPSJhY3Rpb24tb3V0cHV0IiBzdHlsZT0ibWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogJywgIjsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGNvbG9yOiAiLCAnOyI+XG4gICAgICAgICAgPGVtPkNsaWNrIG9uIHRpbGUgYWN0aW9ucyBvciBncmlkIGFjdGlvbnMgdG8gc2VlIHRoZSByZXN1bHQuLi48L2VtPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGVlcy1wYW5lbD5cbiAgICAgIFxuICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPScsICIgLnN1YnRpdGxlPSIsICI+XG4gICAgICAgIDxkZWVzLXN0YXRzZ3JpZFxuICAgICAgICAgIC50aWxlcz0iLCAiXG4gICAgICAgICAgLm1pblRpbGVXaWR0aD0iLCAiXG4gICAgICAgICAgLmdhcD0iLCAnXG4gICAgICAgID48L2RlZXMtc3RhdHNncmlkPlxuICAgICAgICBcbiAgICAgICAgPGRpdiBjbGFzcz0idGlsZS1jb25maWciPlxuICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmZpZy1zZWN0aW9uIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmZpZy10aXRsZSI+Q29uZmlndXJhdGlvbiBPcHRpb25zPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb25maWctZGVzY3JpcHRpb24iPlxuICAgICAgICAgICAgICBFYWNoIHRpbGUgdHlwZSBzdXBwb3J0cyBkaWZmZXJlbnQgcHJvcGVydGllczpcbiAgICAgICAgICAgICAgPHVsIHN0eWxlPSJtYXJnaW46IDhweCAwOyBwYWRkaW5nLWxlZnQ6IDIwcHg7Ij5cbiAgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz5OdW1iZXI6PC9zdHJvbmc+IHZhbHVlLCB1bml0LCBjb2xvciwgZGVzY3JpcHRpb248L2xpPlxuICAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPkdhdWdlOjwvc3Ryb25nPiB2YWx1ZSwgdW5pdCwgZ2F1Z2VPcHRpb25zIChtaW4sIG1heCwgdGhyZXNob2xkcyk8L2xpPlxuICAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPlBlcmNlbnRhZ2U6PC9zdHJvbmc+IHZhbHVlICgwLTEwMCksIGNvbG9yLCBkZXNjcmlwdGlvbjwvbGk+XG4gICAgICAgICAgICAgICAgPGxpPjxzdHJvbmc+VHJlbmQ6PC9zdHJvbmc+IHZhbHVlLCB1bml0LCB0cmVuZERhdGEgYXJyYXksIGRlc2NyaXB0aW9uPC9saT5cbiAgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz5UZXh0Ojwvc3Ryb25nPiB2YWx1ZSAoc3RyaW5nKSwgY29sb3IsIGRlc2NyaXB0aW9uPC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGVlcy1wYW5lbD5cbiAgICAgIFxuICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPScsICIgLnN1YnRpdGxlPSIsICc+XG4gICAgICAgIDxoNCBzdHlsZT0ibWFyZ2luOiAwIDAgMTZweCAwOyBmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA2MDA7Ij5Db21wYWN0IExheW91dCAoMTgwcHggdGlsZXMpPC9oND5cbiAgICAgICAgPGRlZXMtc3RhdHNncmlkXG4gICAgICAgICAgLnRpbGVzPScsICJcbiAgICAgICAgICAubWluVGlsZVdpZHRoPSIsICJcbiAgICAgICAgICAuZ2FwPSIsICdcbiAgICAgICAgPjwvZGVlcy1zdGF0c2dyaWQ+XG4gICAgICAgIFxuICAgICAgICA8aDQgc3R5bGU9Im1hcmdpbjogMjRweCAwIDE2cHggMDsgZm9udC1zaXplOiAxNnB4OyBmb250LXdlaWdodDogNjAwOyI+U3BhY2lvdXMgTGF5b3V0ICgzMjBweCB0aWxlcyk8L2g0PlxuICAgICAgICA8ZGVlcy1zdGF0c2dyaWRcbiAgICAgICAgICAudGlsZXM9JywgIlxuICAgICAgICAgIC5taW5UaWxlV2lkdGg9IiwgIlxuICAgICAgICAgIC5nYXA9IiwgIlxuICAgICAgICA+PC9kZWVzLXN0YXRzZ3JpZD5cbiAgICAgIDwvZGVlcy1wYW5lbD5cbiAgICAgIFxuICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSIsICIgLnN1YnRpdGxlPSIsICc+XG4gICAgICAgIDxkZWVzLXN0YXRzZ3JpZFxuICAgICAgICAgIGlkPSJjcHUtY29yZXMtZ3JpZCJcbiAgICAgICAgICAudGlsZXM9JywgIlxuICAgICAgICAgIC5ncmlkQWN0aW9ucz0iLCAiXG4gICAgICAgICAgLm1pblRpbGVXaWR0aD0iLCAiXG4gICAgICAgICAgLmdhcD0iLCAiXG4gICAgICAgID48L2RlZXMtc3RhdHNncmlkPlxuICAgICAgPC9kZWVzLXBhbmVsPlxuXG4gICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9IiwgIiAuc3VidGl0bGU9IiwgJz5cbiAgICAgICAgPGRlZXMtc3RhdHNncmlkXG4gICAgICAgICAgaWQ9ImludGVyYWN0aXZlLWdyaWQiXG4gICAgICAgICAgLnRpbGVzPScsICJcbiAgICAgICAgICAuZ3JpZEFjdGlvbnM9IiwgIlxuICAgICAgICAgIC5taW5UaWxlV2lkdGg9IiwgIlxuICAgICAgICAgIC5nYXA9IiwgIlxuICAgICAgICA+PC9kZWVzLXN0YXRzZ3JpZD5cbiAgICAgIDwvZGVlcy1wYW5lbD5cbiAgICAgIFxuICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSIsICIgLnN1YnRpdGxlPSIsICc+XG4gICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtYmxvY2siPicsICI8L2Rpdj5cbiAgICAgIDwvZGVlcy1wYW5lbD5cblxuICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSIsICIgLnN1YnRpdGxlPSIsICI+XG4gICAgICAgIDxkZWVzLXN0YXRzZ3JpZFxuICAgICAgICAgIC50aWxlcz0iLCAiXG4gICAgICAgICAgLm1pblRpbGVXaWR0aD0iLCAiXG4gICAgICAgICAgLmdhcD0iLCBgCiAgICAgICAgPjwvZGVlcy1zdGF0c2dyaWQ+CgogICAgICAgIDxkaXYgY2xhc3M9InRpbGUtY29uZmlnIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmZpZy1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29uZmlnLXRpdGxlIj5QYXJ0aXRpb24gVGlsZSBQcm9wZXJ0aWVzPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmZpZy1kZXNjcmlwdGlvbiI+CiAgICAgICAgICAgICAgPHVsIHN0eWxlPSJtYXJnaW46IDhweCAwOyBwYWRkaW5nLWxlZnQ6IDIwcHg7Ij4KICAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPnBhcnRpdGlvbkRhdGEudXNlZDo8L3N0cm9uZz4gVXNlZCBzcGFjZSBpbiBieXRlcyAoYXV0by1mb3JtYXR0ZWQpPC9saT4KICAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPnBhcnRpdGlvbkRhdGEudG90YWw6PC9zdHJvbmc+IFRvdGFsIGNhcGFjaXR5IGluIGJ5dGVzPC9saT4KICAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPnBhcnRpdGlvbkRhdGEuZmlsZXN5c3RlbTo8L3N0cm9uZz4gRmlsZXN5c3RlbSB0eXBlIChleHQ0LCB4ZnMsIG50ZnMpPC9saT4KICAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPnBhcnRpdGlvbkRhdGEubW91bnRQb2ludDo8L3N0cm9uZz4gTW91bnQgcG9pbnQgcGF0aCAob3B0aW9uYWwpPC9saT4KICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgIENvbG9yIHRocmVzaG9sZHM6IE5vcm1hbCAoJmx0Ozc1JSksIFdhcm5pbmcgKDc1LTkwJSksIENyaXRpY2FsICgmZ3Q7OTAlKQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iY29uZmlnLXNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb25maWctdGl0bGUiPkRpc2sgVGlsZSBQcm9wZXJ0aWVzPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmZpZy1kZXNjcmlwdGlvbiI+CiAgICAgICAgICAgICAgPHVsIHN0eWxlPSJtYXJnaW46IDhweCAwOyBwYWRkaW5nLWxlZnQ6IDIwcHg7Ij4KICAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPmRpc2tEYXRhLmNhcGFjaXR5Ojwvc3Ryb25nPiBUb3RhbCBjYXBhY2l0eSBpbiBieXRlczwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz5kaXNrRGF0YS5tb2RlbDo8L3N0cm9uZz4gRGlzayBtb2RlbCBuYW1lIChvcHRpb25hbCk8L2xpPgogICAgICAgICAgICAgICAgPGxpPjxzdHJvbmc+ZGlza0RhdGEudHlwZTo8L3N0cm9uZz4gRGlzayB0eXBlOiAnc3NkJywgJ2hkZCcsIG9yICdudm1lJzwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz5kaXNrRGF0YS5pb3BzOjwvc3Ryb25nPiBSZWFkL3dyaXRlIElPUFMgKG9wdGlvbmFsKTwvbGk+CiAgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz5kaXNrRGF0YS5oZWFsdGg6PC9zdHJvbmc+IEhlYWx0aCBwZXJjZW50YWdlIDAtMTAwIChvcHRpb25hbCk8L2xpPgogICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgSGVhbHRoIHRocmVzaG9sZHM6IEdvb2QgKDcwLTEwMCUpLCBXYXJuaW5nICgzMC03MCUpLCBDcml0aWNhbCAoJmx0OzMwJSkKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgLy8gQ2xlYW51cCBsaXZlIHVwZGF0ZXMgb24gcGFnZSB1bmxvYWQKICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsICgpID0+IHsKICAgICAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLmxpdmVVcGRhdGVJbnRlcnZhbCkgewogICAgICAgICAgY2xlYXJJbnRlcnZhbCgod2luZG93IGFzIGFueSkubGl2ZVVwZGF0ZUludGVydmFsKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgPFwvc2NyaXB0PgogIDwvZGVlcy1kZW1vd3JhcHBlcj4KICBgXSkpLCBpYAogICAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMjRweDsKICAgICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgICBtYXgtd2lkdGg6IDE0MDBweDsKICAgICAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBkZWVzLXBhbmVsIHsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGRlZXMtcGFuZWw6bGFzdC1jaGlsZCB7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAudGlsZS1jb25maWcgewogICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMzAwcHgsIDFmcikpOwogICAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmNvbmZpZy1zZWN0aW9uIHsKICAgICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuY29uZmlnLXRpdGxlIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgOC44JSkiLCAiaHNsKDIxMCA0MCUgOTglKSIpfTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmNvbmZpZy1kZXNjcmlwdGlvbiB7CiAgICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA1Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA1NS4xJSkiKX07CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5jb2RlLWJsb2NrIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSAxMS44JSkiKX07CiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNC4zIDMxLjglIDkxLjQlKSIsICJoc2woMjE1IDIwLjIlIDE2LjglKSIpfTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgICAgb3ZlcmZsb3cteDogYXV0bzsKICAgICAgICAgIHdoaXRlLXNwYWNlOiBwcmU7CiAgICAgICAgfQogICAgICBgLCAiMS4gQ29tcHJlaGVuc2l2ZSBEYXNoYm9hcmQiLCAiRnVsbC1mZWF0dXJlZCBzdGF0cyBncmlkIHdpdGggdmFyaW91cyB0aWxlIHR5cGVzLCBhY3Rpb25zLCBhbmQgTHVjaWRlIGljb25zIiwgWwogICAgewogICAgICBpZDogInJldmVudWUiLAogICAgICB0aXRsZTogIlRvdGFsIFJldmVudWUiLAogICAgICB2YWx1ZTogMTI1NDIwLAogICAgICB1bml0OiAiJCIsCiAgICAgIHR5cGU6ICJudW1iZXIiLAogICAgICBpY29uOiAibHVjaWRlOmRvbGxhci1zaWduIiwKICAgICAgZGVzY3JpcHRpb246ICIrMTIuNSUgZnJvbSBsYXN0IG1vbnRoIiwKICAgICAgYWN0aW9uczogWwogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJWaWV3IERldGFpbHMiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6dHJlbmRpbmctdXAiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNhY3Rpb24tb3V0cHV0Iik7CiAgICAgICAgICAgIGlmIChvdXRwdXQpIHsKICAgICAgICAgICAgICBvdXRwdXQudGV4dENvbnRlbnQgPSAiVmlld2luZyByZXZlbnVlIGRldGFpbHM6ICQxMjUsNDIwICgrMTIuNSUpIjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIkV4cG9ydCBEYXRhIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmRvd25sb2FkIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYWN0aW9uLW91dHB1dCIpOwogICAgICAgICAgICBpZiAob3V0cHV0KSB7CiAgICAgICAgICAgICAgb3V0cHV0LnRleHRDb250ZW50ID0gIkV4cG9ydGluZyByZXZlbnVlIGRhdGEgdG8gQ1NWLi4uIjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgXQogICAgfSwKICAgIHsKICAgICAgaWQ6ICJ1c2VycyIsCiAgICAgIHRpdGxlOiAiQWN0aXZlIFVzZXJzIiwKICAgICAgdmFsdWU6IDM4NDcsCiAgICAgIHR5cGU6ICJudW1iZXIiLAogICAgICBpY29uOiAibHVjaWRlOnVzZXJzIiwKICAgICAgZGVzY3JpcHRpb246ICIzMjQgbmV3IHRoaXMgd2VlayIsCiAgICAgIGFjdGlvbnM6IFsKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiVmlldyBVc2VyIExpc3QiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6bGlzdCIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2FjdGlvbi1vdXRwdXQiKTsKICAgICAgICAgICAgaWYgKG91dHB1dCkgewogICAgICAgICAgICAgIG91dHB1dC50ZXh0Q29udGVudCA9ICJPcGVuaW5nIHVzZXIgbGlzdC4uLiI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgIGlkOiAiY3B1IiwKICAgICAgdGl0bGU6ICJDUFUgVXNhZ2UiLAogICAgICB2YWx1ZTogNzMsCiAgICAgIHVuaXQ6ICIlIiwKICAgICAgdHlwZTogImdhdWdlIiwKICAgICAgaWNvbjogImx1Y2lkZTpjcHUiLAogICAgICBnYXVnZU9wdGlvbnM6IHsKICAgICAgICBtaW46IDAsCiAgICAgICAgbWF4OiAxMDAsCiAgICAgICAgdGhyZXNob2xkczogWwogICAgICAgICAgeyB2YWx1ZTogMCwgY29sb3I6ICJoc2woMTQyLjEgNzYuMiUgMzYuMyUpIiB9LAogICAgICAgICAgeyB2YWx1ZTogNjAsIGNvbG9yOiAiaHNsKDQ1LjQgOTMuNCUgNDcuNSUpIiB9LAogICAgICAgICAgeyB2YWx1ZTogODAsIGNvbG9yOiAiaHNsKDAgODQuMiUgNjAuMiUpIiB9CiAgICAgICAgXQogICAgICB9CiAgICB9LAogICAgewogICAgICBpZDogInN0b3JhZ2UiLAogICAgICB0aXRsZTogIlN0b3JhZ2UgVXNlZCIsCiAgICAgIHZhbHVlOiA2NSwKICAgICAgdHlwZTogInBlcmNlbnRhZ2UiLAogICAgICBpY29uOiAibHVjaWRlOmhhcmQtZHJpdmUiLAogICAgICBkZXNjcmlwdGlvbjogIjY1MCBHQiBvZiAxIFRCIgogICAgfSwKICAgIHsKICAgICAgaWQ6ICJsYXRlbmN5IiwKICAgICAgdGl0bGU6ICJSZXNwb25zZSBUaW1lIiwKICAgICAgdmFsdWU6IDE0MiwKICAgICAgdW5pdDogIm1zIiwKICAgICAgdHlwZTogInRyZW5kIiwKICAgICAgaWNvbjogImx1Y2lkZTphY3Rpdml0eSIsCiAgICAgIHRyZW5kRGF0YTogWzE1MCwgMTQ1LCAxNDgsIDE0MiwgMTM4LCAxNDAsIDEzNSwgMTQ1LCAxNDJdLAogICAgICBkZXNjcmlwdGlvbjogIlA5NSIKICAgIH0sCiAgICB7CiAgICAgIGlkOiAidXB0aW1lIiwKICAgICAgdGl0bGU6ICJTeXN0ZW0gVXB0aW1lIiwKICAgICAgdmFsdWU6ICI5OS45NSUiLAogICAgICB0eXBlOiAidGV4dCIsCiAgICAgIGljb246ICJsdWNpZGU6Y2hlY2stY2lyY2xlIiwKICAgICAgY29sb3I6ICJoc2woMTQyLjEgNzYuMiUgMzYuMyUpIiwKICAgICAgZGVzY3JpcHRpb246ICJMYXN0IDMwIGRheXMiCiAgICB9CiAgXSwgWwogICAgewogICAgICBuYW1lOiAiUmVmcmVzaCIsCiAgICAgIGljb25OYW1lOiAibHVjaWRlOnJlZnJlc2gtY3ciLAogICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICBjb25zdCBncmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZGVlcy1zdGF0c2dyaWQiKTsKICAgICAgICBpZiAoZ3JpZCkgewogICAgICAgICAgZ3JpZC5zdHlsZS5vcGFjaXR5ID0gIjAuNSI7CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgZ3JpZC5zdHlsZS5vcGFjaXR5ID0gIjEiOwogICAgICAgICAgfSwgMzAwKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJFeHBvcnQiLAogICAgICBpY29uTmFtZTogImx1Y2lkZTpzaGFyZSIsCiAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNhY3Rpb24tb3V0cHV0Iik7CiAgICAgICAgaWYgKG91dHB1dCkgewogICAgICAgICAgb3V0cHV0LnRleHRDb250ZW50ID0gIkV4cG9ydGluZyBkYXNoYm9hcmQgcmVwb3J0Li4uIjsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJTZXR0aW5ncyIsCiAgICAgIGljb25OYW1lOiAibHVjaWRlOnNldHRpbmdzIiwKICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgY29uc3Qgb3V0cHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2FjdGlvbi1vdXRwdXQiKTsKICAgICAgICBpZiAob3V0cHV0KSB7CiAgICAgICAgICBvdXRwdXQudGV4dENvbnRlbnQgPSAiT3BlbmluZyBkYXNoYm9hcmQgc2V0dGluZ3MuLi4iOwogICAgICAgIH0KICAgICAgfQogICAgfQogIF0sIDI1MCwgMTYsIGNzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIiksIGNzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIiksICIyLiBUaWxlIFR5cGVzIiwgIkRpZmZlcmVudCB2aXN1YWxpemF0aW9uIHR5cGVzIGF2YWlsYWJsZSBpbiB0aGUgc3RhdHMgZ3JpZCIsIFsKICAgIHsKICAgICAgaWQ6ICJudW1iZXItZXhhbXBsZSIsCiAgICAgIHRpdGxlOiAiTnVtYmVyIFRpbGUiLAogICAgICB2YWx1ZTogNDIxOTUsCiAgICAgIHVuaXQ6ICIkIiwKICAgICAgdHlwZTogIm51bWJlciIsCiAgICAgIGljb246ICJsdWNpZGU6aGFzaCIsCiAgICAgIGRlc2NyaXB0aW9uOiAiU2ltcGxlIG51bWVyaWMgZGlzcGxheSIKICAgIH0sCiAgICB7CiAgICAgIGlkOiAiZ2F1Z2UtZXhhbXBsZSIsCiAgICAgIHRpdGxlOiAiR2F1Z2UgVGlsZSIsCiAgICAgIHZhbHVlOiA2OCwKICAgICAgdW5pdDogIiUiLAogICAgICB0eXBlOiAiZ2F1Z2UiLAogICAgICBpY29uOiAibHVjaWRlOmdhdWdlIiwKICAgICAgZ2F1Z2VPcHRpb25zOiB7CiAgICAgICAgbWluOiAwLAogICAgICAgIG1heDogMTAwLAogICAgICAgIHRocmVzaG9sZHM6IFsKICAgICAgICAgIHsgdmFsdWU6IDAsIGNvbG9yOiAiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlKSIgfSwKICAgICAgICAgIHsgdmFsdWU6IDUwLCBjb2xvcjogImhzbCg0NS40IDkzLjQlIDQ3LjUlKSIgfSwKICAgICAgICAgIHsgdmFsdWU6IDgwLCBjb2xvcjogImhzbCgwIDg0LjIlIDYwLjIlKSIgfQogICAgICAgIF0KICAgICAgfQogICAgfSwKICAgIHsKICAgICAgaWQ6ICJwZXJjZW50YWdlLWV4YW1wbGUiLAogICAgICB0aXRsZTogIlBlcmNlbnRhZ2UgVGlsZSIsCiAgICAgIHZhbHVlOiA3OCwKICAgICAgdHlwZTogInBlcmNlbnRhZ2UiLAogICAgICBpY29uOiAibHVjaWRlOnBlcmNlbnQiLAogICAgICBkZXNjcmlwdGlvbjogIlByb2dyZXNzIGJhciB2aXN1YWxpemF0aW9uIgogICAgfSwKICAgIHsKICAgICAgaWQ6ICJ0cmVuZC1leGFtcGxlIiwKICAgICAgdGl0bGU6ICJUcmVuZCBUaWxlIiwKICAgICAgdmFsdWU6IDg5MiwKICAgICAgdW5pdDogIm9wcy9zIiwKICAgICAgdHlwZTogInRyZW5kIiwKICAgICAgaWNvbjogImx1Y2lkZTp0cmVuZGluZy11cCIsCiAgICAgIHRyZW5kRGF0YTogWzcyMCwgNzUwLCA3ODAsIDc5NSwgODEwLCA4MzUsIDg1MCwgODY1LCA4ODAsIDg5Ml0sCiAgICAgIGRlc2NyaXB0aW9uOiAiYXZnIgogICAgfSwKICAgIHsKICAgICAgaWQ6ICJ0ZXh0LWV4YW1wbGUiLAogICAgICB0aXRsZTogIlRleHQgVGlsZSIsCiAgICAgIHZhbHVlOiAiT3BlcmF0aW9uYWwiLAogICAgICB0eXBlOiAidGV4dCIsCiAgICAgIGljb246ICJsdWNpZGU6aW5mbyIsCiAgICAgIGNvbG9yOiAiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlKSIsCiAgICAgIGRlc2NyaXB0aW9uOiAiU3RhdHVzIGRpc3BsYXkiCiAgICB9CiAgXSwgMjgwLCAxNiwgIjMuIEdyaWQgQ29uZmlndXJhdGlvbnMiLCAiRGlmZmVyZW50IGxheW91dCBvcHRpb25zIGFuZCByZXNwb25zaXZlIGJlaGF2aW9yIiwgWwogICAgeyBpZDogIjEiLCB0aXRsZTogIk9yZGVycyIsIHZhbHVlOiAxNTYsIHR5cGU6ICJudW1iZXIiLCBpY29uOiAibHVjaWRlOnNob3BwaW5nLWNhcnQiIH0sCiAgICB7IGlkOiAiMiIsIHRpdGxlOiAiUmV2ZW51ZSIsIHZhbHVlOiA4NDIwLCB1bml0OiAiJCIsIHR5cGU6ICJudW1iZXIiLCBpY29uOiAibHVjaWRlOmRvbGxhci1zaWduIiB9LAogICAgeyBpZDogIjMiLCB0aXRsZTogIlVzZXJzIiwgdmFsdWU6IDQyMywgdHlwZTogIm51bWJlciIsIGljb246ICJsdWNpZGU6dXNlcnMiIH0sCiAgICB7IGlkOiAiNCIsIHRpdGxlOiAiR3Jvd3RoIiwgdmFsdWU6IDEyLjUsIHVuaXQ6ICIlIiwgdHlwZTogIm51bWJlciIsIGljb246ICJsdWNpZGU6dHJlbmRpbmctdXAiLCBjb2xvcjogImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSkiIH0KICBdLCAxODAsIDEyLCBbCiAgICB7CiAgICAgIGlkOiAic3BhY2lvdXMxIiwKICAgICAgdGl0bGU6ICJNb250aGx5IFJldmVudWUiLAogICAgICB2YWx1ZTogMTg0NTAwLAogICAgICB1bml0OiAiJCIsCiAgICAgIHR5cGU6ICJudW1iZXIiLAogICAgICBpY29uOiAibHVjaWRlOmNyZWRpdC1jYXJkIiwKICAgICAgZGVzY3JpcHRpb246ICJUb3RhbCByZXZlbnVlIHRoaXMgbW9udGgiCiAgICB9LAogICAgewogICAgICBpZDogInNwYWNpb3VzMiIsCiAgICAgIHRpdGxlOiAiQ3VzdG9tZXIgU2F0aXNmYWN0aW9uIiwKICAgICAgdmFsdWU6IDk0LAogICAgICB0eXBlOiAicGVyY2VudGFnZSIsCiAgICAgIGljb246ICJsdWNpZGU6c21pbGUiLAogICAgICBkZXNjcmlwdGlvbjogIkJhc2VkIG9uIDEsMjM0IHJldmlld3MiCiAgICB9LAogICAgewogICAgICBpZDogInNwYWNpb3VzMyIsCiAgICAgIHRpdGxlOiAiU2VydmVyIFJlc3BvbnNlIiwKICAgICAgdmFsdWU6IDk4LAogICAgICB1bml0OiAibXMiLAogICAgICB0eXBlOiAidHJlbmQiLAogICAgICBpY29uOiAibHVjaWRlOnNlcnZlciIsCiAgICAgIHRyZW5kRGF0YTogWzEwNSwgMTAyLCAxMDAsIDk5LCA5OCwgOTgsIDk3LCA5OF0sCiAgICAgIGRlc2NyaXB0aW9uOiAiYXZnIHJlc3BvbnNlIHRpbWUiCiAgICB9CiAgXSwgMzIwLCAyMCwgIjQuIENQVSBDb3JlcyBWaXN1YWxpemF0aW9uIiwgIlZlcnRpY2FsIGJhciB2aXN1YWxpemF0aW9uIGZvciBtdWx0aS1jb3JlIENQVSB1c2FnZSB3aXRoIGNvbHVtbiBzcGFubmluZyIsIFsKICAgIHsKICAgICAgaWQ6ICJjcHUtY29yZXMtOCIsCiAgICAgIHRpdGxlOiAiQ1BVIENvcmVzICg4LWNvcmUpIiwKICAgICAgdmFsdWU6IDAsCiAgICAgIHR5cGU6ICJjcHVDb3JlcyIsCiAgICAgIGljb246ICJsdWNpZGU6Y3B1IiwKICAgICAgY29sdW1uU3BhbjogMiwKICAgICAgY29yZXNEYXRhOiBnZW5lcmF0ZUNwdUNvcmVzKDgpLAogICAgICBkZXNjcmlwdGlvbjogIkludGVsIGk3IC0gOCBjb3JlcyIKICAgIH0sCiAgICB7CiAgICAgIGlkOiAibWVtb3J5IiwKICAgICAgdGl0bGU6ICJNZW1vcnkgVXNhZ2UiLAogICAgICB2YWx1ZTogNjgsCiAgICAgIHR5cGU6ICJwZXJjZW50YWdlIiwKICAgICAgaWNvbjogImx1Y2lkZTpkYXRhYmFzZSIsCiAgICAgIGRlc2NyaXB0aW9uOiAiMTMuNiBHQiBvZiAyMCBHQiIKICAgIH0sCiAgICB7CiAgICAgIGlkOiAiY3B1LWNvcmVzLTE2IiwKICAgICAgdGl0bGU6ICJDUFUgQ29yZXMgKDE2LWNvcmUpIiwKICAgICAgdmFsdWU6IDAsCiAgICAgIHR5cGU6ICJjcHVDb3JlcyIsCiAgICAgIGljb246ICJsdWNpZGU6Y3B1IiwKICAgICAgY29sdW1uU3BhbjogMiwKICAgICAgY29yZXNEYXRhOiBnZW5lcmF0ZUNwdUNvcmVzKDE2KSwKICAgICAgZGVzY3JpcHRpb246ICJBTUQgUnl6ZW4gOSAtIDE2IGNvcmVzIgogICAgfSwKICAgIHsKICAgICAgaWQ6ICJuZXR3b3JrIiwKICAgICAgdGl0bGU6ICJOZXR3b3JrIEkvTyIsCiAgICAgIHZhbHVlOiAyNDUsCiAgICAgIHVuaXQ6ICJNQi9zIiwKICAgICAgdHlwZTogInRyZW5kIiwKICAgICAgaWNvbjogImx1Y2lkZTpuZXR3b3JrIiwKICAgICAgdHJlbmREYXRhOiBbMjAwLCAyMjAsIDIzNSwgMjQwLCAyMzgsIDI0NV0sCiAgICAgIGRlc2NyaXB0aW9uOiAidGhyb3VnaHB1dCIKICAgIH0sCiAgICB7CiAgICAgIGlkOiAiY3B1LWNvcmVzLTMyIiwKICAgICAgdGl0bGU6ICJTZXJ2ZXIgQ1BVICgzMi1jb3JlKSIsCiAgICAgIHZhbHVlOiAwLAogICAgICB0eXBlOiAiY3B1Q29yZXMiLAogICAgICBpY29uOiAibHVjaWRlOnNlcnZlciIsCiAgICAgIGNvbHVtblNwYW46IDMsCiAgICAgIGNvcmVzRGF0YTogZ2VuZXJhdGVDcHVDb3JlcygzMiksCiAgICAgIGRlc2NyaXB0aW9uOiAiQU1EIEVQWUMgLSAzMiBjb3JlcyIKICAgIH0sCiAgICB7CiAgICAgIGlkOiAiZGlzayIsCiAgICAgIHRpdGxlOiAiRGlzayBVc2FnZSIsCiAgICAgIHZhbHVlOiA0MiwKICAgICAgdHlwZTogInBlcmNlbnRhZ2UiLAogICAgICBpY29uOiAibHVjaWRlOmhhcmQtZHJpdmUiLAogICAgICBkZXNjcmlwdGlvbjogIjQyMCBHQiBvZiAxIFRCIgogICAgfQogIF0sIFsKICAgIHsKICAgICAgbmFtZTogIlJhbmRvbWl6ZSIsCiAgICAgIGljb25OYW1lOiAibHVjaWRlOnNodWZmbGUiLAogICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICBjb25zdCBncmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2NwdS1jb3Jlcy1ncmlkIik7CiAgICAgICAgaWYgKCFncmlkKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNvbnN0IHRpbGVzID0gZ3JpZC50aWxlcy5tYXAoKHRpbGUpID0+IHsKICAgICAgICAgIGlmICh0aWxlLnR5cGUgPT09ICJjcHVDb3JlcyIgJiYgdGlsZS5jb3Jlc0RhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAuLi50aWxlLAogICAgICAgICAgICAgIGNvcmVzRGF0YTogdGlsZS5jb3Jlc0RhdGEubWFwKChjb3JlMikgPT4gKHsKICAgICAgICAgICAgICAgIC4uLmNvcmUyLAogICAgICAgICAgICAgICAgdXNhZ2U6IE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDEwMCkKICAgICAgICAgICAgICB9KSkKICAgICAgICAgICAgfTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0aWxlOwogICAgICAgIH0pOwogICAgICAgIGdyaWQudGlsZXMgPSB0aWxlczsKICAgICAgfQogICAgfQogIF0sIDI1MCwgMTYsICI1LiBJbnRlcmFjdGl2ZSBGZWF0dXJlcyIsICJUaWxlcyB3aXRoIGFjdGlvbnMgYW5kIHJlYWwtdGltZSB1cGRhdGVzIiwgWwogICAgewogICAgICBpZDogImxpdmUtY3B1IiwKICAgICAgdGl0bGU6ICJMaXZlIENQVSIsCiAgICAgIHZhbHVlOiA0NSwKICAgICAgdW5pdDogIiUiLAogICAgICB0eXBlOiAiZ2F1Z2UiLAogICAgICBpY29uOiAibHVjaWRlOmNwdSIsCiAgICAgIGdhdWdlT3B0aW9uczogewogICAgICAgIG1pbjogMCwKICAgICAgICBtYXg6IDEwMCwKICAgICAgICB0aHJlc2hvbGRzOiBbCiAgICAgICAgICB7IHZhbHVlOiAwLCBjb2xvcjogImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSkiIH0sCiAgICAgICAgICB7IHZhbHVlOiA2MCwgY29sb3I6ICJoc2woNDUuNCA5My40JSA0Ny41JSkiIH0sCiAgICAgICAgICB7IHZhbHVlOiA4MCwgY29sb3I6ICJoc2woMCA4NC4yJSA2MC4yJSkiIH0KICAgICAgICBdCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgIGlkOiAibGl2ZS1yZXF1ZXN0cyIsCiAgICAgIHRpdGxlOiAiUmVxdWVzdHMvc2VjIiwKICAgICAgdmFsdWU6IDg5MiwKICAgICAgdHlwZTogInRyZW5kIiwKICAgICAgaWNvbjogImx1Y2lkZTphY3Rpdml0eSIsCiAgICAgIHRyZW5kRGF0YTogWzg1MCwgODYwLCA4NzAsIDg4MCwgODg1LCA4OTAsIDg5Ml0KICAgIH0sCiAgICB7CiAgICAgIGlkOiAibGl2ZS1tZW1vcnkiLAogICAgICB0aXRsZTogIk1lbW9yeSBVc2FnZSIsCiAgICAgIHZhbHVlOiA2MiwKICAgICAgdHlwZTogInBlcmNlbnRhZ2UiLAogICAgICBpY29uOiAibHVjaWRlOmRhdGFiYXNlIgogICAgfSwKICAgIHsKICAgICAgaWQ6ICJjb3VudGVyIiwKICAgICAgdGl0bGU6ICJFdmVudCBDb3VudGVyIiwKICAgICAgdmFsdWU6IDAsCiAgICAgIHR5cGU6ICJudW1iZXIiLAogICAgICBpY29uOiAibHVjaWRlOnphcCIsCiAgICAgIGFjdGlvbnM6IFsKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiSW5jcmVtZW50IiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOnBsdXMiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGdyaWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjaW50ZXJhY3RpdmUtZ3JpZCIpOwogICAgICAgICAgICBpZiAoIWdyaWQpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBjb25zdCB0aWxlID0gZ3JpZC50aWxlcy5maW5kKCh0OSkgPT4gdDkuaWQgPT09ICJjb3VudGVyIik7CiAgICAgICAgICAgIHRpbGUudmFsdWUgPSB0eXBlb2YgdGlsZS52YWx1ZSA9PT0gIm51bWJlciIgPyB0aWxlLnZhbHVlICsgMSA6IDE7CiAgICAgICAgICAgIGdyaWQudGlsZXMgPSBbLi4uZ3JpZC50aWxlc107CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiUmVzZXQiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6cm90YXRlLWNjdyIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgY29uc3QgZ3JpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNpbnRlcmFjdGl2ZS1ncmlkIik7CiAgICAgICAgICAgIGlmICghZ3JpZCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSBncmlkLnRpbGVzLmZpbmQoKHQ5KSA9PiB0OS5pZCA9PT0gImNvdW50ZXIiKTsKICAgICAgICAgICAgdGlsZS52YWx1ZSA9IDA7CiAgICAgICAgICAgIGdyaWQudGlsZXMgPSBbLi4uZ3JpZC50aWxlc107CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBdCiAgICB9CiAgXSwgWwogICAgewogICAgICBuYW1lOiAiU3RhcnQgTGl2ZSBVcGRhdGVzIiwKICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6cGxheSIsCiAgICAgIGFjdGlvbjogYXN5bmMgZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCF3aW5kb3cubGl2ZVVwZGF0ZUludGVydmFsKSB7CiAgICAgICAgICB3aW5kb3cubGl2ZVVwZGF0ZUludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgICAgICBjb25zdCBncmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2ludGVyYWN0aXZlLWdyaWQiKTsKICAgICAgICAgICAgaWYgKGdyaWQpIHsKICAgICAgICAgICAgICBjb25zdCB0aWxlcyA9IFsuLi5ncmlkLnRpbGVzXTsKICAgICAgICAgICAgICBjb25zdCBjcHVUaWxlID0gdGlsZXMuZmluZCgodDkpID0+IHQ5LmlkID09PSAibGl2ZS1jcHUiKTsKICAgICAgICAgICAgICBjcHVUaWxlLnZhbHVlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBjcHVUaWxlLnZhbHVlICsgKE1hdGgucmFuZG9tKCkgKiAyMCAtIDEwKSkpOwogICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RzVGlsZSA9IHRpbGVzLmZpbmQoKHQ5KSA9PiB0OS5pZCA9PT0gImxpdmUtcmVxdWVzdHMiKTsKICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHJlcXVlc3RzVGlsZS52YWx1ZSArIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDUwIC0gMjUpOwogICAgICAgICAgICAgIHJlcXVlc3RzVGlsZS52YWx1ZSA9IE1hdGgubWF4KDgwMCwgbmV3VmFsdWUpOwogICAgICAgICAgICAgIHJlcXVlc3RzVGlsZS50cmVuZERhdGEgPSBbLi4ucmVxdWVzdHNUaWxlLnRyZW5kRGF0YS5zbGljZSgxKSwgcmVxdWVzdHNUaWxlLnZhbHVlXTsKICAgICAgICAgICAgICBjb25zdCBtZW1vcnlUaWxlID0gdGlsZXMuZmluZCgodDkpID0+IHQ5LmlkID09PSAibGl2ZS1tZW1vcnkiKTsKICAgICAgICAgICAgICBtZW1vcnlUaWxlLnZhbHVlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBtZW1vcnlUaWxlLnZhbHVlICsgKE1hdGgucmFuZG9tKCkgKiAxMCAtIDUpKSk7CiAgICAgICAgICAgICAgZ3JpZC50aWxlcyA9IHRpbGVzOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCAxZTMpOwogICAgICAgICAgdGhpcy5uYW1lID0gIlN0b3AgTGl2ZSBVcGRhdGVzIjsKICAgICAgICAgIHRoaXMuaWNvbk5hbWUgPSAibHVjaWRlOnBhdXNlIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2xlYXJJbnRlcnZhbCh3aW5kb3cubGl2ZVVwZGF0ZUludGVydmFsKTsKICAgICAgICAgIHdpbmRvdy5saXZlVXBkYXRlSW50ZXJ2YWwgPSBudWxsOwogICAgICAgICAgdGhpcy5uYW1lID0gIlN0YXJ0IExpdmUgVXBkYXRlcyI7CiAgICAgICAgICB0aGlzLmljb25OYW1lID0gImx1Y2lkZTpwbGF5IjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICBdLCAyNTAsIDE2LCAiNi4gQ29kZSBFeGFtcGxlIiwgIkhvdyB0byBpbXBsZW1lbnQgYSBzdGF0cyBncmlkIHdpdGggVHlwZVNjcmlwdCIsIGBjb25zdCB0aWxlczogSVN0YXRzVGlsZVtdID0gWwogIHsKICAgIGlkOiAncmV2ZW51ZScsCiAgICB0aXRsZTogJ1RvdGFsIFJldmVudWUnLAogICAgdmFsdWU6IDEyNTQyMCwKICAgIHVuaXQ6ICckJywKICAgIHR5cGU6ICdudW1iZXInLAogICAgaWNvbjogJ2x1Y2lkZTpkb2xsYXItc2lnbicsCiAgICBkZXNjcmlwdGlvbjogJysxMi41JSBmcm9tIGxhc3QgbW9udGgnLAogICAgYWN0aW9uczogWwogICAgICB7CiAgICAgICAgbmFtZTogJ1ZpZXcgRGV0YWlscycsCiAgICAgICAgaWNvbk5hbWU6ICdsdWNpZGU6dHJlbmRpbmctdXAnLAogICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgY29uc29sZS5sb2coJ1ZpZXcgcmV2ZW51ZSBkZXRhaWxzJyk7CiAgICAgICAgfQogICAgICB9CiAgICBdCiAgfSwKICB7CiAgICBpZDogJ2NwdScsCiAgICB0aXRsZTogJ0NQVSBVc2FnZScsCiAgICB2YWx1ZTogNzMsCiAgICB1bml0OiAnJScsCiAgICB0eXBlOiAnZ2F1Z2UnLAogICAgaWNvbjogJ2x1Y2lkZTpjcHUnLAogICAgZ2F1Z2VPcHRpb25zOiB7CiAgICAgIG1pbjogMCwKICAgICAgbWF4OiAxMDAsCiAgICAgIHRocmVzaG9sZHM6IFsKICAgICAgICB7IHZhbHVlOiAwLCBjb2xvcjogJ2hzbCgxNDIuMSA3Ni4yJSAzNi4zJSknIH0sCiAgICAgICAgeyB2YWx1ZTogNjAsIGNvbG9yOiAnaHNsKDQ1LjQgOTMuNCUgNDcuNSUpJyB9LAogICAgICAgIHsgdmFsdWU6IDgwLCBjb2xvcjogJ2hzbCgwIDg0LjIlIDYwLjIlKScgfQogICAgICBdCiAgICB9CiAgfQpdOwoKLy8gUmVuZGVyIHRoZSBzdGF0cyBncmlkCmh0bWxcYAogIDxkZWVzLXN0YXRzZ3JpZAogICAgLnRpbGVzPVwke3RpbGVzfQogICAgLm1pblRpbGVXaWR0aD1cJHsyNTB9CiAgICAuZ2FwPVwkezE2fQogICAgLmdyaWRBY3Rpb25zPVwke1sKICAgICAgewogICAgICAgIG5hbWU6ICdSZWZyZXNoJywKICAgICAgICBpY29uTmFtZTogJ2x1Y2lkZTpyZWZyZXNoLWN3JywKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCdSZWZyZXNoJykKICAgICAgfQogICAgXX0KICA+PC9kZWVzLXN0YXRzZ3JpZD4KXGA7YCwgIjcuIERpc2sgJiBTdG9yYWdlIFRpbGVzIiwgIlBhcnRpdGlvbiBhbmQgcGh5c2ljYWwgZGlzayB2aXN1YWxpemF0aW9uIHRpbGVzIiwgWwogICAgewogICAgICBpZDogInJvb3QtcGFydGl0aW9uIiwKICAgICAgdGl0bGU6ICJSb290IFBhcnRpdGlvbiIsCiAgICAgIHZhbHVlOiAwLAogICAgICB0eXBlOiAicGFydGl0aW9uIiwKICAgICAgaWNvbjogImx1Y2lkZTpmb2xkZXItcm9vdCIsCiAgICAgIHBhcnRpdGlvbkRhdGE6IHsKICAgICAgICB1c2VkOiA2OTgzNDE0MjUxNTIsCiAgICAgICAgLy8gfjY1MCBHQgogICAgICAgIHRvdGFsOiAxMDczNzQxODI0ZTMsCiAgICAgICAgLy8gfjEgVEIKICAgICAgICBmaWxlc3lzdGVtOiAiZXh0NCIsCiAgICAgICAgbW91bnRQb2ludDogIi8iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgIGlkOiAiaG9tZS1wYXJ0aXRpb24iLAogICAgICB0aXRsZTogIkhvbWUgUGFydGl0aW9uIiwKICAgICAgdmFsdWU6IDAsCiAgICAgIHR5cGU6ICJwYXJ0aXRpb24iLAogICAgICBpY29uOiAibHVjaWRlOmhvbWUiLAogICAgICBwYXJ0aXRpb25EYXRhOiB7CiAgICAgICAgdXNlZDogMjE0NzQ4MzY0ODAwLAogICAgICAgIC8vIH4yMDAgR0IKICAgICAgICB0b3RhbDogNTM2ODcwOTEyZTMsCiAgICAgICAgLy8gfjUwMCBHQgogICAgICAgIGZpbGVzeXN0ZW06ICJleHQ0IiwKICAgICAgICBtb3VudFBvaW50OiAiL2hvbWUiCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgIGlkOiAiZGF0YS1wYXJ0aXRpb24iLAogICAgICB0aXRsZTogIkRhdGEgUGFydGl0aW9uIiwKICAgICAgdmFsdWU6IDAsCiAgICAgIHR5cGU6ICJwYXJ0aXRpb24iLAogICAgICBpY29uOiAibHVjaWRlOmRhdGFiYXNlIiwKICAgICAgcGFydGl0aW9uRGF0YTogewogICAgICAgIHVzZWQ6IDE5MzI3MzUyODMyMDAsCiAgICAgICAgLy8gfjEuOCBUQiAoOTAlIC0gY3JpdGljYWwpCiAgICAgICAgdG90YWw6IDIxNDc0ODM2NDhlMywKICAgICAgICAvLyB+MiBUQgogICAgICAgIGZpbGVzeXN0ZW06ICJ4ZnMiLAogICAgICAgIG1vdW50UG9pbnQ6ICIvZGF0YSIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgaWQ6ICJudm1lLXNzZCIsCiAgICAgIHRpdGxlOiAiUHJpbWFyeSBOVk1lIiwKICAgICAgdmFsdWU6IDAsCiAgICAgIHR5cGU6ICJkaXNrIiwKICAgICAgaWNvbjogImx1Y2lkZTpoYXJkLWRyaXZlIiwKICAgICAgY29sdW1uU3BhbjogMiwKICAgICAgZGlza0RhdGE6IHsKICAgICAgICBjYXBhY2l0eTogMmUxMiwKICAgICAgICAvLyAyIFRCCiAgICAgICAgbW9kZWw6ICJTYW1zdW5nIDk5MCBQcm8iLAogICAgICAgIHR5cGU6ICJudm1lIiwKICAgICAgICBpb3BzOiB7CiAgICAgICAgICByZWFkOiA3NDUwLAogICAgICAgICAgd3JpdGU6IDY5MDAKICAgICAgICB9LAogICAgICAgIGhlYWx0aDogOTgKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgaWQ6ICJzYXRhLXNzZCIsCiAgICAgIHRpdGxlOiAiU2Vjb25kYXJ5IFNTRCIsCiAgICAgIHZhbHVlOiAwLAogICAgICB0eXBlOiAiZGlzayIsCiAgICAgIGljb246ICJsdWNpZGU6aGFyZC1kcml2ZSIsCiAgICAgIGRpc2tEYXRhOiB7CiAgICAgICAgY2FwYWNpdHk6IDFlMTIsCiAgICAgICAgLy8gMSBUQgogICAgICAgIG1vZGVsOiAiQ3J1Y2lhbCBNWDUwMCIsCiAgICAgICAgdHlwZTogInNzZCIsCiAgICAgICAgaW9wczogewogICAgICAgICAgcmVhZDogNTYwLAogICAgICAgICAgd3JpdGU6IDUxMAogICAgICAgIH0sCiAgICAgICAgaGVhbHRoOiA4NQogICAgICB9CiAgICB9LAogICAgewogICAgICBpZDogImhkZC1zdG9yYWdlIiwKICAgICAgdGl0bGU6ICJCYWNrdXAgSEREIiwKICAgICAgdmFsdWU6IDAsCiAgICAgIHR5cGU6ICJkaXNrIiwKICAgICAgaWNvbjogImx1Y2lkZTphcmNoaXZlIiwKICAgICAgZGlza0RhdGE6IHsKICAgICAgICBjYXBhY2l0eTogOGUxMiwKICAgICAgICAvLyA4IFRCCiAgICAgICAgbW9kZWw6ICJTZWFnYXRlIElyb25Xb2xmIiwKICAgICAgICB0eXBlOiAiaGRkIiwKICAgICAgICBpb3BzOiB7CiAgICAgICAgICByZWFkOiAyMTAsCiAgICAgICAgICB3cml0ZTogMTk1CiAgICAgICAgfSwKICAgICAgICBoZWFsdGg6IDQyCiAgICAgIH0KICAgIH0KICBdLCAyODAsIDE2KTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LWJhc2UvZGVlcy1pbnB1dC1iYXNlLmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfZGlzdF90czI5KCk7CnZhciBfX2VzRGVjb3JhdGUxMyA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMTQgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNJbnB1dEJhc2UgPSAoKCkgPT4gewogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfbGF5b3V0TW9kZV9kZWNvcmF0b3JzOwogIGxldCBfbGF5b3V0TW9kZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xheW91dE1vZGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xhYmVsUG9zaXRpb25fZGVjb3JhdG9yczsKICBsZXQgX2xhYmVsUG9zaXRpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sYWJlbFBvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9rZXlfZGVjb3JhdG9yczsKICBsZXQgX2tleV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2tleV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGFiZWxfZGVjb3JhdG9yczsKICBsZXQgX2xhYmVsX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGFiZWxfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlcXVpcmVkX2RlY29yYXRvcnM7CiAgbGV0IF9yZXF1aXJlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlcXVpcmVkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kaXNhYmxlZF9kZWNvcmF0b3JzOwogIGxldCBfZGlzYWJsZWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kaXNhYmxlZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGVzY3JpcHRpb25fZGVjb3JhdG9yczsKICBsZXQgX2Rlc2NyaXB0aW9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGVzY3JpcHRpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICByZXR1cm4gY2xhc3MgRGVlc0lucHV0QmFzZSBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfbGF5b3V0TW9kZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2xhYmVsUG9zaXRpb25fZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9rZXlfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9sYWJlbF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3JlcXVpcmVkX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2Rpc2FibGVkX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2Rlc2NyaXB0aW9uX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfX2VzRGVjb3JhdGUxMyh0aGlzLCBudWxsLCBfbGF5b3V0TW9kZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsYXlvdXRNb2RlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsYXlvdXRNb2RlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmxheW91dE1vZGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxheW91dE1vZGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbGF5b3V0TW9kZV9pbml0aWFsaXplcnMsIF9sYXlvdXRNb2RlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTModGhpcywgbnVsbCwgX2xhYmVsUG9zaXRpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibGFiZWxQb3NpdGlvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibGFiZWxQb3NpdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sYWJlbFBvc2l0aW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5sYWJlbFBvc2l0aW9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xhYmVsUG9zaXRpb25faW5pdGlhbGl6ZXJzLCBfbGFiZWxQb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTEzKHRoaXMsIG51bGwsIF9rZXlfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAia2V5Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJrZXkiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoua2V5LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5rZXkgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfa2V5X2luaXRpYWxpemVycywgX2tleV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTEzKHRoaXMsIG51bGwsIF9sYWJlbF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsYWJlbCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibGFiZWwiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubGFiZWwsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxhYmVsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xhYmVsX2luaXRpYWxpemVycywgX2xhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTModGhpcywgbnVsbCwgX3JlcXVpcmVkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJlcXVpcmVkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJyZXF1aXJlZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5yZXF1aXJlZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucmVxdWlyZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcmVxdWlyZWRfaW5pdGlhbGl6ZXJzLCBfcmVxdWlyZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxMyh0aGlzLCBudWxsLCBfZGlzYWJsZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZGlzYWJsZWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRpc2FibGVkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRpc2FibGVkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kaXNhYmxlZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kaXNhYmxlZF9pbml0aWFsaXplcnMsIF9kaXNhYmxlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTEzKHRoaXMsIG51bGwsIF9kZXNjcmlwdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkZXNjcmlwdGlvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZGVzY3JpcHRpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZGVzY3JpcHRpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmRlc2NyaXB0aW9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Rlc2NyaXB0aW9uX2luaXRpYWxpemVycywgX2Rlc2NyaXB0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgI2xheW91dE1vZGVfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMTQodGhpcywgX2xheW91dE1vZGVfaW5pdGlhbGl6ZXJzLCAiYXV0byIpOwogICAgLyoqCiAgICAgKiBMYXlvdXQgbW9kZSBmb3IgdGhlIGlucHV0IGNvbXBvbmVudAogICAgICogLSB2ZXJ0aWNhbDogVHJhZGl0aW9uYWwgZm9ybSBsYXlvdXQgKGxhYmVsIG9uIHRvcCkKICAgICAqIC0gaG9yaXpvbnRhbDogSW5saW5lIGxheW91dCAobGFiZWwgcG9zaXRpb24gY29uZmlndXJhYmxlKQogICAgICogLSBhdXRvOiBEZXRlY3QgZnJvbSBwYXJlbnQgY29udGV4dAogICAgICovCiAgICBnZXQgbGF5b3V0TW9kZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xheW91dE1vZGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsYXlvdXRNb2RlKHZhbHVlMikgewogICAgICB0aGlzLiNsYXlvdXRNb2RlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbGFiZWxQb3NpdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTQodGhpcywgX2xheW91dE1vZGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczE0KHRoaXMsIF9sYWJlbFBvc2l0aW9uX2luaXRpYWxpemVycywgInRvcCIpKTsKICAgIC8qKgogICAgICogUG9zaXRpb24gb2YgdGhlIGxhYmVsIHJlbGF0aXZlIHRvIHRoZSBpbnB1dAogICAgICovCiAgICBnZXQgbGFiZWxQb3NpdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xhYmVsUG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsYWJlbFBvc2l0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNsYWJlbFBvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAja2V5X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxNCh0aGlzLCBfbGFiZWxQb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTQodGhpcywgX2tleV9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgLyoqCiAgICAgKiBDb21tb24gcHJvcGVydGllcyBmb3IgYWxsIGlucHV0cwogICAgICovCiAgICBnZXQga2V5KCkgewogICAgICByZXR1cm4gdGhpcy4ja2V5X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQga2V5KHZhbHVlMikgewogICAgICB0aGlzLiNrZXlfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTQodGhpcywgX2tleV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTQodGhpcywgX2xhYmVsX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgbGFiZWwoKSB7CiAgICAgIHJldHVybiB0aGlzLiNsYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxhYmVsKHZhbHVlMikgewogICAgICB0aGlzLiNsYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3JlcXVpcmVkX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxNCh0aGlzLCBfbGFiZWxfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczE0KHRoaXMsIF9yZXF1aXJlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgcmVxdWlyZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNyZXF1aXJlZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHJlcXVpcmVkKHZhbHVlMikgewogICAgICB0aGlzLiNyZXF1aXJlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2Rpc2FibGVkX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxNCh0aGlzLCBfcmVxdWlyZWRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczE0KHRoaXMsIF9kaXNhYmxlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgZGlzYWJsZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNkaXNhYmxlZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGRpc2FibGVkKHZhbHVlMikgewogICAgICB0aGlzLiNkaXNhYmxlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2Rlc2NyaXB0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxNCh0aGlzLCBfZGlzYWJsZWRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczE0KHRoaXMsIF9kZXNjcmlwdGlvbl9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgZ2V0IGRlc2NyaXB0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy4jZGVzY3JpcHRpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkZXNjcmlwdGlvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jZGVzY3JpcHRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIC8qKgogICAgICogQ29tbW9uIHN0eWxlcyBmb3IgYWxsIGlucHV0IGNvbXBvbmVudHMKICAgICAqLwogICAgc3RhdGljIGdldCBiYXNlU3R5bGVzKCkgewogICAgICByZXR1cm4gWwogICAgICAgIGlgCiAgICAgICAgLyogQ1NTIFZhcmlhYmxlcyBmb3IgY29uc2lzdGVudCBzcGFjaW5nICovCiAgICAgICAgOmhvc3QgewogICAgICAgICAgLS1kZWVzLWlucHV0LXNwYWNpbmctdW5pdDogOHB4OwogICAgICAgICAgLS1kZWVzLWlucHV0LWxhYmVsLWdhcDogdmFyKC0tZGVlcy1pbnB1dC1zcGFjaW5nLXVuaXQpOyAvKiA4cHggKi8KICAgICAgICB9CgogICAgICAgIC8qIERlZmF1bHQgYmxvY2sgZGlzcGxheSB3aXRoIG5vIG1hcmdpbnMgLSBzcGFjaW5nIGlzIGNvbnRhaW5lci1kcml2ZW4gKi8KICAgICAgICA6aG9zdCB7CiAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgIG1hcmdpbjogMDsKICAgICAgICB9CgogICAgICAgIC8qIEhvcml6b250YWwgbGF5b3V0IG1vZGUgLSBhY3RpdmF0ZWQgYnkgYXR0cmlidXRlICovCiAgICAgICAgOmhvc3QoW2xheW91dC1tb2RlPSJob3Jpem9udGFsIl0pIHsKICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB9CgogICAgICAgIC8qIExhYmVsIHBvc2l0aW9uIHZhcmlhdGlvbnMgKi8KICAgICAgICA6aG9zdChbbGFiZWwtcG9zaXRpb249ImxlZnQiXSkgLmlucHV0LXdyYXBwZXIgewogICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogYXV0byAxZnI7CiAgICAgICAgICBnYXA6IHZhcigtLWRlZXMtaW5wdXQtbGFiZWwtZ2FwKTsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgfQoKICAgICAgICA6aG9zdChbbGFiZWwtcG9zaXRpb249InJpZ2h0Il0pIC5pbnB1dC13cmFwcGVyIHsKICAgICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciBhdXRvOwogICAgICAgICAgZ2FwOiB2YXIoLS1kZWVzLWlucHV0LWxhYmVsLWdhcCk7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoW2xhYmVsLXBvc2l0aW9uPSJ0b3AiXSkgLmlucHV0LXdyYXBwZXIgewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgfQoKICAgICAgICA6aG9zdChbbGFiZWwtcG9zaXRpb249Im5vbmUiXSkgZGVlcy1sYWJlbCB7CiAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KICAgICAgYAogICAgICBdOwogICAgfQogICAgLyoqCiAgICAgKiBTdWJqZWN0IGZvciB2YWx1ZSBjaGFuZ2VzIHRoYXQgYWxsIGlucHV0cyBzaG91bGQgaW1wbGVtZW50CiAgICAgKi8KICAgIGNoYW5nZVN1YmplY3QgPSAoX19ydW5Jbml0aWFsaXplcnMxNCh0aGlzLCBfZGVzY3JpcHRpb25fZXh0cmFJbml0aWFsaXplcnMpLCBuZXcgZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzLnNtYXJ0cngucnhqcy5TdWJqZWN0KCkpOwogICAgLyoqCiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlIERPTQogICAgICogU2V0cyB1cCBsYXlvdXQgbW9kZSBkZXRlY3Rpb24KICAgICAqLwogICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuZGV0ZWN0TGF5b3V0TW9kZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBEZXRlY3RzIHRoZSBhcHByb3ByaWF0ZSBsYXlvdXQgbW9kZSBiYXNlZCBvbiBwYXJlbnQgY29udGV4dAogICAgICovCiAgICBkZXRlY3RMYXlvdXRNb2RlKCkgewogICAgICBpZiAodGhpcy5sYXlvdXRNb2RlICE9PSAiYXV0byIpIHsKICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgibGF5b3V0LW1vZGUiLCB0aGlzLmxheW91dE1vZGUpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBwYXJlbnRGb3JtID0gdGhpcy5jbG9zZXN0KCJkZWVzLWZvcm0iKTsKICAgICAgaWYgKHBhcmVudEZvcm0gJiYgcGFyZW50Rm9ybS5oYXNBdHRyaWJ1dGUoImhvcml6b250YWwtbGF5b3V0IikpIHsKICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgibGF5b3V0LW1vZGUiLCAiaG9yaXpvbnRhbCIpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJsYXlvdXQtbW9kZSIsICJ2ZXJ0aWNhbCIpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZXMgdGhlIGxheW91dCBtb2RlIGF0dHJpYnV0ZSB3aGVuIHByb3BlcnR5IGNoYW5nZXMKICAgICAqLwogICAgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgICBzdXBlci51cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygibGF5b3V0TW9kZSIpKSB7CiAgICAgICAgdGhpcy5kZXRlY3RMYXlvdXRNb2RlKCk7CiAgICAgIH0KICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygibGFiZWxQb3NpdGlvbiIpKSB7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoImxhYmVsLXBvc2l0aW9uIiwgdGhpcy5sYWJlbFBvc2l0aW9uKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTdGFuZGFyZCBtZXRob2QgZm9yIGZyZWV6aW5nIGlucHV0IChkaXNhYmxpbmcpCiAgICAgKi8KICAgIGFzeW5jIGZyZWV6ZSgpIHsKICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7CiAgICB9CiAgICAvKioKICAgICAqIFN0YW5kYXJkIG1ldGhvZCBmb3IgdW5mcmVlemluZyBpbnB1dCAoZW5hYmxpbmcpCiAgICAgKi8KICAgIGFzeW5jIHVuZnJlZXplKCkgewogICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7CiAgICB9CiAgfTsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LWNoZWNrYm94L2RlZXMtaW5wdXQtY2hlY2tib3guZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmM4ID0gKCkgPT4gYjJgCiAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBjaGVja2JveGVzID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yQWxsKCJkZWVzLWlucHV0LWNoZWNrYm94Iik7CiAgY29uc3Qgc2VsZWN0QWxsQnRuID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjc2VsZWN0LWFsbC1idG4iKTsKICBjb25zdCBjbGVhckFsbEJ0biA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiI2NsZWFyLWFsbC1idG4iKTsKICBpZiAoc2VsZWN0QWxsQnRuICYmIGNsZWFyQWxsQnRuKSB7CiAgICBzZWxlY3RBbGxCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGNoZWNrYm94ZXMuZm9yRWFjaCgoY2hlY2tib3gpID0+IHsKICAgICAgICBpZiAoIWNoZWNrYm94LmRpc2FibGVkICYmIGNoZWNrYm94LmtleT8uc3RhcnRzV2l0aCgiZmVhdHVyZSIpKSB7CiAgICAgICAgICBjaGVja2JveC52YWx1ZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwogICAgY2xlYXJBbGxCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGNoZWNrYm94ZXMuZm9yRWFjaCgoY2hlY2tib3gpID0+IHsKICAgICAgICBpZiAoIWNoZWNrYm94LmRpc2FibGVkICYmIGNoZWNrYm94LmtleT8uc3RhcnRzV2l0aCgiZmVhdHVyZSIpKSB7CiAgICAgICAgICBjaGVja2JveC52YWx1ZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICB9Cn19PgogICAgPHN0eWxlPgogICAgICAke2lgCiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICAgIG1heC13aWR0aDogMTIwMHB4OwogICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGRlZXMtcGFuZWwgewogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZGVlcy1wYW5lbDpsYXN0LWNoaWxkIHsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5jaGVja2JveC1ncm91cCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMTJweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmhvcml6b250YWwtY2hlY2tib3hlcyB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuaW50ZXJhY3RpdmUtc2VjdGlvbiB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5vdXRwdXQtdGV4dCB7CiAgICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDI2LjclKSIsICJoc2woMjEwIDQwJSA4MCUpIil9OwogICAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk4JSkiLCAiaHNsKDIxNSAyMC4yJSAxMS44JSkiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuZm9ybS1zZWN0aW9uIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NyUpIiwgImhzbCgwIDAlIDclKSIpfTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5idXR0b24tZ3JvdXAgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGdhcDogOHB4OwogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmZlYXR1cmUtbGlzdCB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTEuOCUpIil9OwogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNSAyMC4yJSAxNi44JSkiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICAgIH0KICAgICAgYH0KICAgIDwvc3R5bGU+CiAgICAKICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkJhc2ljIENoZWNrYm94ZXMifSAuc3VidGl0bGU9JHsiU2ltcGxlIGNoZWNrYm94IGV4YW1wbGVzIHdpdGggdmFyaW91cyBsYWJlbHMifT4KICAgICAgICA8ZGl2IGNsYXNzPSJjaGVja2JveC1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCAKICAgICAgICAgICAgLmxhYmVsPSR7IkkgYWdyZWUgdG8gdGhlIFRlcm1zIGFuZCBDb25kaXRpb25zIn0gCiAgICAgICAgICAgIC52YWx1ZT0ke3RydWV9CiAgICAgICAgICAgIC5rZXk9JHsidGVybXMifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3ggCiAgICAgICAgICAgIC5sYWJlbD0keyJTdWJzY3JpYmUgdG8gbmV3c2xldHRlciJ9IAogICAgICAgICAgICAudmFsdWU9JHtmYWxzZX0KICAgICAgICAgICAgLmtleT0keyJuZXdzbGV0dGVyIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IAogICAgICAgICAgICAubGFiZWw9JHsiRW5hYmxlIG5vdGlmaWNhdGlvbnMifSAKICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJSZWNlaXZlIGVtYWlsIHVwZGF0ZXMgYWJvdXQgeW91ciBhY2NvdW50In0KICAgICAgICAgICAgLmtleT0keyJub3RpZmljYXRpb25zIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJDaGVja2JveCBTdGF0ZXMifSAuc3VidGl0bGU9JHsiRGlmZmVyZW50IGNoZWNrYm94IHN0YXRlcyBhbmQgY29uZmlndXJhdGlvbnMifT4KICAgICAgICA8ZGl2IGNsYXNzPSJjaGVja2JveC1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCAKICAgICAgICAgICAgLmxhYmVsPSR7IkRlZmF1bHQgc3RhdGUifSAKICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCAKICAgICAgICAgICAgLmxhYmVsPSR7IkNoZWNrZWQgc3RhdGUifSAKICAgICAgICAgICAgLnZhbHVlPSR7dHJ1ZX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IAogICAgICAgICAgICAubGFiZWw9JHsiRGlzYWJsZWQgdW5jaGVja2VkIn0gCiAgICAgICAgICAgIC52YWx1ZT0ke2ZhbHNlfQogICAgICAgICAgICAuZGlzYWJsZWQ9JHt0cnVlfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3ggCiAgICAgICAgICAgIC5sYWJlbD0keyJEaXNhYmxlZCBjaGVja2VkIn0gCiAgICAgICAgICAgIC52YWx1ZT0ke3RydWV9CiAgICAgICAgICAgIC5kaXNhYmxlZD0ke3RydWV9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCAKICAgICAgICAgICAgLmxhYmVsPSR7IlJlcXVpcmVkIGNoZWNrYm94In0gCiAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICAgIC5rZXk9JHsicmVxdWlyZWQifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7Ikhvcml6b250YWwgTGF5b3V0In0gLnN1YnRpdGxlPSR7IkNoZWNrYm94ZXMgYXJyYW5nZWQgaG9yaXpvbnRhbGx5IGZvciBjb21wYWN0IGZvcm1zIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iaG9yaXpvbnRhbC1jaGVja2JveGVzIj4KICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IAogICAgICAgICAgICAubGFiZWw9JHsiT3B0aW9uIEEifSAKICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgIC5sYXlvdXRNb2RlPSR7Imhvcml6b250YWwifQogICAgICAgICAgICAua2V5PSR7Im9wdGlvbkEifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3ggCiAgICAgICAgICAgIC5sYWJlbD0keyJPcHRpb24gQiJ9IAogICAgICAgICAgICAudmFsdWU9JHt0cnVlfQogICAgICAgICAgICAubGF5b3V0TW9kZT0keyJob3Jpem9udGFsIn0KICAgICAgICAgICAgLmtleT0keyJvcHRpb25CIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IAogICAgICAgICAgICAubGFiZWw9JHsiT3B0aW9uIEMifSAKICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgIC5sYXlvdXRNb2RlPSR7Imhvcml6b250YWwifQogICAgICAgICAgICAua2V5PSR7Im9wdGlvbkMifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3ggCiAgICAgICAgICAgIC5sYWJlbD0keyJPcHRpb24gRCJ9IAogICAgICAgICAgICAudmFsdWU9JHt0cnVlfQogICAgICAgICAgICAubGF5b3V0TW9kZT0keyJob3Jpem9udGFsIn0KICAgICAgICAgICAgLmtleT0keyJvcHRpb25EIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJGZWF0dXJlIFNlbGVjdGlvbiBFeGFtcGxlIn0gLnN1YnRpdGxlPSR7IkNvbW1vbiB1c2UgY2FzZSBmb3IgZmVhdHVyZSB0b2dnbGVzIHdpdGggYmF0Y2ggb3BlcmF0aW9ucyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbi1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1idXR0b24gaWQ9InNlbGVjdC1hbGwtYnRuIiB0eXBlPSJzZWNvbmRhcnkiPlNlbGVjdCBBbGw8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIGlkPSJjbGVhci1hbGwtYnRuIiB0eXBlPSJzZWNvbmRhcnkiPkNsZWFyIEFsbDwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1saXN0Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNoZWNrYm94LWdyb3VwIj4KICAgICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3ggCiAgICAgICAgICAgICAgLmxhYmVsPSR7IkRhcmsgTW9kZSBTdXBwb3J0In0gCiAgICAgICAgICAgICAgLnZhbHVlPSR7dHJ1ZX0KICAgICAgICAgICAgICAua2V5PSR7ImZlYXR1cmUxIn0KICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICAgICAgCiAgICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IAogICAgICAgICAgICAgIC5sYWJlbD0keyJFbWFpbCBOb3RpZmljYXRpb25zIn0gCiAgICAgICAgICAgICAgLnZhbHVlPSR7dHJ1ZX0KICAgICAgICAgICAgICAua2V5PSR7ImZlYXR1cmUyIn0KICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICAgICAgCiAgICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IAogICAgICAgICAgICAgIC5sYWJlbD0keyJUd28tRmFjdG9yIEF1dGhlbnRpY2F0aW9uIn0gCiAgICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgICAgLmtleT0keyJmZWF0dXJlMyJ9CiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICAgIAogICAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCAKICAgICAgICAgICAgICAubGFiZWw9JHsiQVBJIEFjY2VzcyJ9IAogICAgICAgICAgICAgIC52YWx1ZT0ke3RydWV9CiAgICAgICAgICAgICAgLmtleT0keyJmZWF0dXJlNCJ9CiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICAgIAogICAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCAKICAgICAgICAgICAgICAubGFiZWw9JHsiQWR2YW5jZWQgQW5hbHl0aWNzIn0gCiAgICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgICAgLmtleT0keyJmZWF0dXJlNSJ9CiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IlByaXZhY3kgU2V0dGluZ3MgRXhhbXBsZSJ9IC5zdWJ0aXRsZT0keyJDaGVja2JveGVzIGluIGEgdHlwaWNhbCBmb3JtIGNvbnRleHQifT4KICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLXNlY3Rpb24iPgogICAgICAgICAgPGg0IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5Qcml2YWN5IFByZWZlcmVuY2VzPC9oND4KICAgICAgICAgIAogICAgICAgICAgPGRpdiBjbGFzcz0iY2hlY2tib3gtZ3JvdXAiPgogICAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCAKICAgICAgICAgICAgICAubGFiZWw9JHsiU2hhcmUgYW5hbHl0aWNzIGRhdGEifSAKICAgICAgICAgICAgICAudmFsdWU9JHt0cnVlfQogICAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJIZWxwIHVzIGltcHJvdmUgYnkgc2hhcmluZyBhbm9ueW1vdXMgdXNhZ2UgZGF0YSJ9CiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICAgIAogICAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCAKICAgICAgICAgICAgICAubGFiZWw9JHsiUGVyc29uYWxpemVkIHJlY29tbWVuZGF0aW9ucyJ9IAogICAgICAgICAgICAgIC52YWx1ZT0ke3RydWV9CiAgICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IkdldCBzdWdnZXN0aW9ucyBiYXNlZCBvbiB5b3VyIGFjdGl2aXR5In0KICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICAgICAgCiAgICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IAogICAgICAgICAgICAgIC5sYWJlbD0keyJNYXJrZXRpbmcgY29tbXVuaWNhdGlvbnMifSAKICAgICAgICAgICAgICAudmFsdWU9JHtmYWxzZX0KICAgICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiUmVjZWl2ZSBwcm9tb3Rpb25hbCBlbWFpbHMgYW5kIHNwZWNpYWwgb2ZmZXJzIn0KICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICAgICAgCiAgICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IAogICAgICAgICAgICAgIC5sYWJlbD0keyJUaGlyZC1wYXJ0eSBpbnRlZ3JhdGlvbnMifSAKICAgICAgICAgICAgICAudmFsdWU9JHtmYWxzZX0KICAgICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiQWxsb3cgYXBwcm92ZWQgcGFydG5lcnMgdG8gYWNjZXNzIHlvdXIgZGF0YSJ9CiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkludGVyYWN0aXZlIEV4YW1wbGUifSAuc3VidGl0bGU9JHsiQ2xpY2sgY2hlY2tib3hlcyB0byBzZWUgdmFsdWUgY2hhbmdlcyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImNoZWNrYm94LWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IAogICAgICAgICAgICAubGFiZWw9JHsiRmVhdHVyZSB0b2dnbGUifSAKICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgIEBjaGFuZ2VTdWJqZWN0PSR7KGV2ZW50KSA9PiB7CiAgY29uc3Qgb3V0cHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2NoZWNrYm94LW91dHB1dCIpOwogIGlmIChvdXRwdXQgJiYgZXZlbnQuZGV0YWlsKSB7CiAgICBjb25zdCBpc0NoZWNrZWQgPSBldmVudC5kZXRhaWwuZ2V0VmFsdWUoKTsKICAgIG91dHB1dC50ZXh0Q29udGVudCA9IGBGZWF0dXJlIGlzICR7aXNDaGVja2VkID8gImVuYWJsZWQiIDogImRpc2FibGVkIn1gOwogIH0KfX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IAogICAgICAgICAgICAubGFiZWw9JHsiRGVidWcgbW9kZSJ9IAogICAgICAgICAgICAudmFsdWU9JHtmYWxzZX0KICAgICAgICAgICAgQGNoYW5nZVN1YmplY3Q9JHsoZXZlbnQpID0+IHsKICBjb25zdCBvdXRwdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjZGVidWctb3V0cHV0Iik7CiAgaWYgKG91dHB1dCAmJiBldmVudC5kZXRhaWwpIHsKICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGV2ZW50LmRldGFpbC5nZXRWYWx1ZSgpOwogICAgb3V0cHV0LnRleHRDb250ZW50ID0gYERlYnVnIG1vZGU6ICR7aXNDaGVja2VkID8gIk9OIiA6ICJPRkYifWA7CiAgfQp9fQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICA8L2Rpdj4KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJpbnRlcmFjdGl2ZS1zZWN0aW9uIj4KICAgICAgICAgIDxkaXYgaWQ9ImNoZWNrYm94LW91dHB1dCIgY2xhc3M9Im91dHB1dC10ZXh0Ij5GZWF0dXJlIGlzIGRpc2FibGVkPC9kaXY+CiAgICAgICAgICA8ZGl2IGlkPSJkZWJ1Zy1vdXRwdXQiIGNsYXNzPSJvdXRwdXQtdGV4dCIgc3R5bGU9Im1hcmdpbi10b3A6IDhweDsiPkRlYnVnIG1vZGU6IE9GRjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2Rpdj4KICA8L2RlZXMtZGVtb3dyYXBwZXI+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1jaGVja2JveC9kZWVzLWlucHV0LWNoZWNrYm94LmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTE0ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMxNSA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0lucHV0Q2hlY2tib3ggPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtaW5wdXQtY2hlY2tib3giKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0lucHV0QmFzZTsKICBsZXQgX3ZhbHVlX2RlY29yYXRvcnM7CiAgbGV0IF92YWx1ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pbmRldGVybWluYXRlX2RlY29yYXRvcnM7CiAgbGV0IF9pbmRldGVybWluYXRlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW5kZXRlcm1pbmF0ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW5wdXRDaGVja2JveDIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF92YWx1ZV9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBCb29sZWFuCiAgICAgIH0pXTsKICAgICAgX2luZGV0ZXJtaW5hdGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfX2VzRGVjb3JhdGUxNCh0aGlzLCBudWxsLCBfdmFsdWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmFsdWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInZhbHVlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZhbHVlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52YWx1ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF92YWx1ZV9pbml0aWFsaXplcnMsIF92YWx1ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE0KHRoaXMsIG51bGwsIF9pbmRldGVybWluYXRlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImluZGV0ZXJtaW5hdGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImluZGV0ZXJtaW5hdGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaW5kZXRlcm1pbmF0ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaW5kZXRlcm1pbmF0ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pbmRldGVybWluYXRlX2luaXRpYWxpemVycywgX2luZGV0ZXJtaW5hdGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxNChudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNJbnB1dENoZWNrYm94MiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAvLyBTVEFUSUMKICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmM4OwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIklucHV0Il07CiAgICAjdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMTUodGhpcywgX3ZhbHVlX2luaXRpYWxpemVycywgZmFsc2UpOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCB2YWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaW5kZXRlcm1pbmF0ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTUodGhpcywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNSh0aGlzLCBfaW5kZXRlcm1pbmF0ZV9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaW5kZXRlcm1pbmF0ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2luZGV0ZXJtaW5hdGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpbmRldGVybWluYXRlKHZhbHVlMikgewogICAgICB0aGlzLiNpbmRldGVybWluYXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnMxNSh0aGlzLCBfaW5kZXRlcm1pbmF0ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIHRoaXMubGFiZWxQb3NpdGlvbiA9ICJyaWdodCI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIC4uLkRlZXNJbnB1dEJhc2UuYmFzZVN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgICAgKiB7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIH0KCiAgICAgICAgOmhvc3QgewogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgICAgZm9udC1mYW1pbHk6ICR7Y3NzR2Vpc3RGb250RmFtaWx5fTsKICAgICAgICB9CgogICAgICAgIC5tYWluY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgICAgICBnYXA6IDhweDsKICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgfQoKICAgICAgICAuY2hlY2tib3ggewogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDMuOSUpIil9OwogICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgICBtYXJnaW4tdG9wOiAxcHg7CiAgICAgICAgfQoKICAgICAgICAubWFpbmNvbnRhaW5lcjpob3ZlciAuY2hlY2tib3ggewogICAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNzkuOCUpIiwgImhzbCgwIDAlIDIwLjklKSIpfTsKICAgICAgICB9CgogICAgICAgIC5jaGVja2JveC5zZWxlY3RlZCB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIil9OwogICAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIil9OwogICAgICAgIH0KCiAgICAgICAgLmNoZWNrYm94OmZvY3VzLXZpc2libGUgewogICAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlIC8gMC4xKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUgLyAwLjEpIil9OwogICAgICAgIH0KCiAgICAgICAgLyogQ2hlY2ttYXJrIHVzaW5nIEx1Y2lkZSBpY29uIHN0eWxlICovCiAgICAgICAgLmNoZWNrYm94IC5jaGVja21hcmsgewogICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2U7CiAgICAgICAgfQoKICAgICAgICAuY2hlY2tib3guc2VsZWN0ZWQgLmNoZWNrbWFyayB7CiAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIH0KCiAgICAgICAgLmNoZWNrYm94IC5jaGVja21hcmsgc3ZnIHsKICAgICAgICAgIHdpZHRoOiAxMnB4OwogICAgICAgICAgaGVpZ2h0OiAxMnB4OwogICAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgICB9CgogICAgICAgIC8qIERpc2FibGVkIHN0YXRlICovCiAgICAgICAgLm1haW5jb250YWluZXIuZGlzYWJsZWQgewogICAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICB9CgogICAgICAgIC5jaGVja2JveC5kaXNhYmxlZCB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUuMSUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgfQoKICAgICAgICAvKiBMYWJlbCAqLwogICAgICAgIC5sYWJlbC1jb250YWluZXIgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICBnYXA6IDJweDsKICAgICAgICAgIGZsZXg6IDE7CiAgICAgICAgfQoKICAgICAgICAuY2hlY2tib3gtbGFiZWwgewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxNSUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgICAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjE1cyBlYXNlOwogICAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CiAgICAgICAgfQoKICAgICAgICAubWFpbmNvbnRhaW5lcjpob3ZlciAuY2hlY2tib3gtbGFiZWwgewogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTUlKSIpfTsKICAgICAgICB9CgogICAgICAgIC5tYWluY29udGFpbmVyLmRpc2FibGVkOmhvdmVyIC5jaGVja2JveC1sYWJlbCB7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDE1JSkiLCAiaHNsKDAgMCUgOTAlKSIpfTsKICAgICAgICB9CgogICAgICAgIC8qIERlc2NyaXB0aW9uICovCiAgICAgICAgLmRlc2NyaXB0aW9uLXRleHQgewogICAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NS4xJSkiLCAiaHNsKDAgMCUgNjMuOSUpIil9OwogICAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImlucHV0LXdyYXBwZXIiPgogICAgICAgIDxkaXYgY2xhc3M9Im1haW5jb250YWluZXIgJHt0aGlzLmRpc2FibGVkID8gImRpc2FibGVkIiA6ICIifSIgQGNsaWNrPSIke3RoaXMudG9nZ2xlU2VsZWN0ZWR9Ij4KICAgICAgICAgIDxkaXYgCiAgICAgICAgICAgIGNsYXNzPSJjaGVja2JveCAke3RoaXMudmFsdWUgPyAic2VsZWN0ZWQiIDogIiJ9ICR7dGhpcy5kaXNhYmxlZCA/ICJkaXNhYmxlZCIgOiAiIn0iIAogICAgICAgICAgICB0YWJpbmRleD0iJHt0aGlzLmRpc2FibGVkID8gIi0xIiA6ICIwIn0iCiAgICAgICAgICAgIEBrZXlkb3duPSIke3RoaXMuaGFuZGxlS2V5ZG93bn0iCiAgICAgICAgICA+CiAgICAgICAgICAgICR7dGhpcy52YWx1ZSA/IGIyYAogICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY2hlY2ttYXJrIj4KICAgICAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMCA2TDkgMTdMNCAxMiIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgogICAgICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICBgIDogdGhpcy5pbmRldGVybWluYXRlID8gYjJgCiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNoZWNrbWFyayI+CiAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTUgMTJIMTkiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgYCA6IGIyYGB9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsLWNvbnRhaW5lciI+CiAgICAgICAgICAgICR7dGhpcy5sYWJlbCA/IGIyYDxkaXYgY2xhc3M9ImNoZWNrYm94LWxhYmVsIj4ke3RoaXMubGFiZWx9PC9kaXY+YCA6ICIifQogICAgICAgICAgICAke3RoaXMuZGVzY3JpcHRpb24gPyBiMmA8ZGl2IGNsYXNzPSJkZXNjcmlwdGlvbi10ZXh0Ij4ke3RoaXMuZGVzY3JpcHRpb259PC9kaXY+YCA6ICIifQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGFzeW5jIHRvZ2dsZVNlbGVjdGVkKCkgewogICAgICBpZiAodGhpcy5kaXNhYmxlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLnZhbHVlID0gIXRoaXMudmFsdWU7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm5ld1ZhbHVlIiwgewogICAgICAgIGRldGFpbDogdGhpcy52YWx1ZSwKICAgICAgICBidWJibGVzOiB0cnVlCiAgICAgIH0pKTsKICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICB9CiAgICBnZXRWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMudmFsdWU7CiAgICB9CiAgICBzZXRWYWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlMjsKICAgIH0KICAgIGZvY3VzKCkgewogICAgICBjb25zdCBjaGVja2JveERpdiA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuY2hlY2tib3giKTsKICAgICAgaWYgKGNoZWNrYm94RGl2KSB7CiAgICAgICAgY2hlY2tib3hEaXYuZm9jdXMoKTsKICAgICAgfQogICAgfQogICAgaGFuZGxlS2V5ZG93bihldmVudCkgewogICAgICBpZiAoZXZlbnQua2V5ID09PSAiICIgfHwgZXZlbnQua2V5ID09PSAiRW50ZXIiKSB7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICB0aGlzLnRvZ2dsZVNlbGVjdGVkKCk7CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMTUoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNJbnB1dENoZWNrYm94MiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwY29sb3JzLmpzCnZhciBjb2xvcnNfZXhwb3J0cyA9IHt9OwpfX2V4cG9ydChjb2xvcnNfZXhwb3J0cywgewogIGJyaWdodDogKCkgPT4gYnJpZ2h0LAogIGRhcms6ICgpID0+IGRhcmsKfSk7CnZhciBkYXJrID0gewogIGJsdWU6ICIjMDA1MGI5IiwKICBibHVlQWN0aXZlOiAiIzAwNjlmMiIsCiAgYmx1ZU11dGVkOiAiIzAxMjQ1MiIsCiAgdGV4dDogIiNmZmZmZmYiCn07CnZhciBicmlnaHQgPSB7CiAgYmx1ZTogIiMwMDUwYjkiLAogIGJsdWVBY3RpdmU6ICIjMDA2OWYyIiwKICBibHVlTXV0ZWQ6ICIjMDA2OWYyIiwKICB0ZXh0OiAiIzMzMzMzMyIKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1vdmVybGF5L2RlZXMtbW9kYWwvZGVlcy1tb2RhbC5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkZW1vRnVuYzkgPSAoKSA9PiBiMmAKICA8c3R5bGU+CiAgICAke2lgCiAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogMjRweDsKICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgIG1heC13aWR0aDogMTIwMHB4OwogICAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgICB9CiAgICAgIAogICAgICAuZGVtby1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y4ZjlmYSIsICIjMWExYTFhIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTBlMGUwIiwgIiMzMzMiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5kZW1vLXNlY3Rpb24gaDMgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzMzMiLCAiI2ZmZiIpfTsKICAgICAgfQogICAgICAKICAgICAgLmRlbW8tc2VjdGlvbiBwIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2NjYiLCAiIzk5OSIpfTsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICB9CiAgICAgIAogICAgICAuYnV0dG9uLWdyaWQgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgxNTBweCwgMWZyKSk7CiAgICAgICAgZ2FwOiAxNnB4OwogICAgICB9CiAgICBgfQogIDwvc3R5bGU+CiAgCiAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgPGgzPkhlYWRlciBCdXR0b25zPC9oMz4KICAgICAgPHA+TW9kYWxzIGNhbiBoYXZlIG9wdGlvbmFsIGhlYWRlciBidXR0b25zIGZvciBoZWxwIGFuZCBjbG9zaW5nLjwvcD4KICAgICAgPGRpdiBjbGFzcz0iYnV0dG9uLWdyaWQiPgogICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2s9JHsoKSA9PiB7CiAgRGVlc01vZGFsLmNyZWF0ZUFuZFNob3coewogICAgaGVhZGluZzogIldpdGggSGVscCBCdXR0b24iLAogICAgc2hvd0hlbHBCdXR0b246IHRydWUsCiAgICBvbkhlbHA6IGFzeW5jICgpID0+IHsKICAgICAgY29uc3QgaGVscE1vZGFsID0gYXdhaXQgRGVlc01vZGFsLmNyZWF0ZUFuZFNob3coewogICAgICAgIGhlYWRpbmc6ICJIZWxwIiwKICAgICAgICB3aWR0aDogInNtYWxsIiwKICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICAgICAgc2hvd0hlbHBCdXR0b246IGZhbHNlLAogICAgICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgICAgICAgICA8cD5UaGlzIGlzIHRoZSBoZWxwIGNvbnRlbnQgZm9yIHRoZSBtb2RhbC48L3A+CiAgICAgICAgICAgICAgICAgIDxwPllvdSBjYW4gcHJvdmlkZSBjb250ZXh0LXNwZWNpZmljIGhlbHAgaGVyZS48L3A+CiAgICAgICAgICAgICAgICBgLAogICAgICAgIG1lbnVPcHRpb25zOiBbewogICAgICAgICAgbmFtZTogIkdvdCBpdCIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jIChtb2RhbCkgPT4gbW9kYWwuZGVzdHJveSgpCiAgICAgICAgfV0KICAgICAgfSk7CiAgICB9LAogICAgY29udGVudDogYjJgCiAgICAgICAgICAgICAgPHA+VGhpcyBtb2RhbCBoYXMgYSBoZWxwIGJ1dHRvbiBpbiB0aGUgaGVhZGVyLiBDbGljayBpdCB0byBzZWUgaGVscCBjb250ZW50LjwvcD4KICAgICAgICAgICAgICA8cD5UaGUgY2xvc2UgYnV0dG9uIGlzIGFsc28gdmlzaWJsZSBieSBkZWZhdWx0LjwvcD4KICAgICAgICAgICAgYCwKICAgIG1lbnVPcHRpb25zOiBbewogICAgICBuYW1lOiAiT0siLAogICAgICBhY3Rpb246IGFzeW5jIChtb2RhbCkgPT4gbW9kYWwuZGVzdHJveSgpCiAgICB9XQogIH0pOwp9fT5XaXRoIEhlbHAgQnV0dG9uPC9kZWVzLWJ1dHRvbj4KICAgICAgICAKICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrPSR7KCkgPT4gewogIERlZXNNb2RhbC5jcmVhdGVBbmRTaG93KHsKICAgIGhlYWRpbmc6ICJObyBDbG9zZSBCdXR0b24iLAogICAgc2hvd0Nsb3NlQnV0dG9uOiBmYWxzZSwKICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgICAgIDxwPlRoaXMgbW9kYWwgaGFzIG5vIGNsb3NlIGJ1dHRvbiBpbiB0aGUgaGVhZGVyLjwvcD4KICAgICAgICAgICAgICA8cD5Zb3UgbXVzdCB1c2UgdGhlIGFjdGlvbiBidXR0b25zIG9yIGNsaWNrIG91dHNpZGUgdG8gY2xvc2UgaXQuPC9wPgogICAgICAgICAgICBgLAogICAgbWVudU9wdGlvbnM6IFt7CiAgICAgIG5hbWU6ICJDbG9zZSIsCiAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgIH1dCiAgfSk7Cn19Pk5vIENsb3NlIEJ1dHRvbjwvZGVlcy1idXR0b24+CiAgICAgICAgCiAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGljaz0keygpID0+IHsKICBEZWVzTW9kYWwuY3JlYXRlQW5kU2hvdyh7CiAgICBoZWFkaW5nOiAiQm90aCBCdXR0b25zIiwKICAgIHNob3dIZWxwQnV0dG9uOiB0cnVlLAogICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAogICAgb25IZWxwOiAoKSA9PiBhbGVydCgiSGVscCBjbGlja2VkISIpLAogICAgY29udGVudDogYjJgCiAgICAgICAgICAgICAgPHA+VGhpcyBtb2RhbCBoYXMgYm90aCBoZWxwIGFuZCBjbG9zZSBidXR0b25zLjwvcD4KICAgICAgICAgICAgYCwKICAgIG1lbnVPcHRpb25zOiBbewogICAgICBuYW1lOiAiRG9uZSIsCiAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgIH1dCiAgfSk7Cn19PkJvdGggQnV0dG9uczwvZGVlcy1idXR0b24+CiAgICAgICAgCiAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGljaz0keygpID0+IHsKICBEZWVzTW9kYWwuY3JlYXRlQW5kU2hvdyh7CiAgICBoZWFkaW5nOiAiQ2xlYW4gSGVhZGVyIiwKICAgIHNob3dDbG9zZUJ1dHRvbjogZmFsc2UsCiAgICBzaG93SGVscEJ1dHRvbjogZmFsc2UsCiAgICBjb250ZW50OiBiMmAKICAgICAgICAgICAgICA8cD5UaGlzIG1vZGFsIGhhcyBhIGNsZWFuIGhlYWRlciB3aXRoIG5vIGJ1dHRvbnMuPC9wPgogICAgICAgICAgICBgLAogICAgbWVudU9wdGlvbnM6IFt7CiAgICAgIG5hbWU6ICJDbG9zZSIsCiAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgIH1dCiAgfSk7Cn19PkNsZWFuIEhlYWRlcjwvZGVlcy1idXR0b24+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICAKICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgIDxoMz5Nb2RhbCBXaWR0aCBWYXJpYXRpb25zPC9oMz4KICAgICAgPHA+TW9kYWxzIGNhbiBoYXZlIGRpZmZlcmVudCB3aWR0aHM6IHNtYWxsLCBtZWRpdW0sIGxhcmdlLCBmdWxsc2NyZWVuLCBvciBjdXN0b20gcGl4ZWwgdmFsdWVzLjwvcD4KICAgICAgPGRpdiBjbGFzcz0iYnV0dG9uLWdyaWQiPgogICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2s9JHsoKSA9PiB7CiAgRGVlc01vZGFsLmNyZWF0ZUFuZFNob3coewogICAgaGVhZGluZzogIlNtYWxsIE1vZGFsIiwKICAgIHdpZHRoOiAic21hbGwiLAogICAgY29udGVudDogYjJgCiAgICAgICAgICAgICAgPHA+VGhpcyBpcyBhIHNtYWxsIG1vZGFsIHdpdGggYSB3aWR0aCBvZiAzODBweC4gUGVyZmVjdCBmb3Igc2ltcGxlIGNvbmZpcm1hdGlvbnMgb3IgYnJpZWYgbWVzc2FnZXMuPC9wPgogICAgICAgICAgICBgLAogICAgbWVudU9wdGlvbnM6IFt7CiAgICAgIG5hbWU6ICJDYW5jZWwiLAogICAgICBhY3Rpb246IGFzeW5jIChtb2RhbCkgPT4gbW9kYWwuZGVzdHJveSgpCiAgICB9LCB7CiAgICAgIG5hbWU6ICJPSyIsCiAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgIH1dCiAgfSk7Cn19PlNtYWxsIE1vZGFsPC9kZWVzLWJ1dHRvbj4KICAgICAgICAKICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrPSR7KCkgPT4gewogIERlZXNNb2RhbC5jcmVhdGVBbmRTaG93KHsKICAgIGhlYWRpbmc6ICJNZWRpdW0gTW9kYWwgKERlZmF1bHQpIiwKICAgIHdpZHRoOiAibWVkaXVtIiwKICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgICAgIDxkZWVzLWZvcm0+CiAgICAgICAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IC5sYWJlbD0keyJVc2VybmFtZSJ9PjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAubGFiZWw9JHsiRW1haWwifSAuaW5wdXRUeXBlPSR7ImVtYWlsIn0+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IC5sYWJlbD0keyJQYXNzd29yZCJ9IC5pbnB1dFR5cGU9JHsicGFzc3dvcmQifT48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgICAgICAgYCwKICAgIG1lbnVPcHRpb25zOiBbewogICAgICBuYW1lOiAiQ2FuY2VsIiwKICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWwpID0+IG1vZGFsLmRlc3Ryb3koKQogICAgfSwgewogICAgICBuYW1lOiAiU2lnbiBVcCIsCiAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgIH1dCiAgfSk7Cn19Pk1lZGl1bSBNb2RhbDwvZGVlcy1idXR0b24+CiAgICAgICAgCiAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGljaz0keygpID0+IHsKICBEZWVzTW9kYWwuY3JlYXRlQW5kU2hvdyh7CiAgICBoZWFkaW5nOiAiTGFyZ2UgTW9kYWwiLAogICAgd2lkdGg6ICJsYXJnZSIsCiAgICBjb250ZW50OiBiMmAKICAgICAgICAgICAgICA8aDQ+V2lkZSBDb250ZW50IEFyZWE8L2g0PgogICAgICAgICAgICAgIDxwPlRoaXMgbGFyZ2UgbW9kYWwgaXMgODAwcHggd2lkZSBhbmQgcGVyZmVjdCBmb3IgZGlzcGxheWluZyBtb3JlIGNvbXBsZXggY29udGVudCBsaWtlIGZvcm1zIHdpdGggbXVsdGlwbGUgY29sdW1ucywgdGFibGVzLCBvciBkZXRhaWxlZCBpbmZvcm1hdGlvbi48L3A+CiAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDE2cHg7IG1hcmdpbi10b3A6IDE2cHg7Ij4KICAgICAgICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgLmxhYmVsPSR7IkZpcnN0IE5hbWUifT48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgLmxhYmVsPSR7Ikxhc3QgTmFtZSJ9PjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAubGFiZWw9JHsiQ29tcGFueSJ9PjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAubGFiZWw9JHsiUG9zaXRpb24ifT48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYCwKICAgIG1lbnVPcHRpb25zOiBbewogICAgICBuYW1lOiAiQ2FuY2VsIiwKICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWwpID0+IG1vZGFsLmRlc3Ryb3koKQogICAgfSwgewogICAgICBuYW1lOiAiU2F2ZSIsCiAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgIH1dCiAgfSk7Cn19PkxhcmdlIE1vZGFsPC9kZWVzLWJ1dHRvbj4KICAgICAgICAKICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrPSR7KCkgPT4gewogIERlZXNNb2RhbC5jcmVhdGVBbmRTaG93KHsKICAgIGhlYWRpbmc6ICJGdWxsc2NyZWVuIEVkaXRvciIsCiAgICB3aWR0aDogImZ1bGxzY3JlZW4iLAogICAgc2hvd0hlbHBCdXR0b246IHRydWUsCiAgICBvbkhlbHA6IGFzeW5jICgpID0+IHsKICAgICAgYWxlcnQoIkluIGEgcmVhbCBhcHAsIHRoaXMgd291bGQgc2hvdyBlZGl0b3IgZG9jdW1lbnRhdGlvbiIpOwogICAgfSwKICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgICAgIDxoND5GdWxsc2NyZWVuIEV4cGVyaWVuY2Ugd2l0aCBIZWFkZXIgQ29udHJvbHM8L2g0PgogICAgICAgICAgICAgIDxwPlRoaXMgbW9kYWwgdGFrZXMgdXAgYWxtb3N0IHRoZSBlbnRpcmUgdmlld3BvcnQgd2l0aCBhIDIwcHggbWFyZ2luIG9uIGFsbCBzaWRlcy4gVGhlIGhlYWRlciBidXR0b25zIGFyZSBwYXJ0aWN1bGFybHkgdXNlZnVsIGluIGZ1bGxzY3JlZW4gbW9kZS48L3A+CiAgICAgICAgICAgICAgPHA+VGhlIGNvbnRlbnQgYXJlYSBjYW4gYmUgYXMgdGFsbCBhcyBuZWVkZWQgYW5kIHdpbGwgc2Nyb2xsIGlmIG5lY2Vzc2FyeS48L3A+CiAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iaGVpZ2h0OiAyMDBweDsgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmMGYwZjAiLCAiIzJhMmEyYSIpfTsgYm9yZGVyLXJhZGl1czogOHB4OyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgbWFyZ2luLXRvcDogMTZweDsiPgogICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzk5OSIsICIjNjY2Iil9Ij5MYXJnZSBjb250ZW50IGFyZWE8L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIGAsCiAgICBtZW51T3B0aW9uczogW3sKICAgICAgbmFtZTogIlNhdmUiLAogICAgICBhY3Rpb246IGFzeW5jIChtb2RhbCkgPT4gbW9kYWwuZGVzdHJveSgpCiAgICB9LCB7CiAgICAgIG5hbWU6ICJDYW5jZWwiLAogICAgICBhY3Rpb246IGFzeW5jIChtb2RhbCkgPT4gbW9kYWwuZGVzdHJveSgpCiAgICB9XQogIH0pOwp9fT5GdWxsc2NyZWVuIE1vZGFsPC9kZWVzLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIAogICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgPGgzPkN1c3RvbSBXaWR0aCAmIENvbnN0cmFpbnRzPC9oMz4KICAgICAgPHA+WW91IGNhbiBhbHNvIHNldCBjdXN0b20gcGl4ZWwgd2lkdGhzIGFuZCBtaW4vbWF4IGNvbnN0cmFpbnRzLjwvcD4KICAgICAgPGRpdiBjbGFzcz0iYnV0dG9uLWdyaWQiPgogICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2s9JHsoKSA9PiB7CiAgRGVlc01vZGFsLmNyZWF0ZUFuZFNob3coewogICAgaGVhZGluZzogIkN1c3RvbSBXaWR0aCAoNzAwcHgpIiwKICAgIHdpZHRoOiA3MDAsCiAgICBjb250ZW50OiBiMmAKICAgICAgICAgICAgICA8cD5UaGlzIG1vZGFsIGhhcyBhIGN1c3RvbSB3aWR0aCBvZiBleGFjdGx5IDcwMCBwaXhlbHMuPC9wPgogICAgICAgICAgICBgLAogICAgbWVudU9wdGlvbnM6IFt7CiAgICAgIG5hbWU6ICJDbG9zZSIsCiAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgIH1dCiAgfSk7Cn19PkN1c3RvbSA3MDBweDwvZGVlcy1idXR0b24+CiAgICAgICAgCiAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGljaz0keygpID0+IHsKICBEZWVzTW9kYWwuY3JlYXRlQW5kU2hvdyh7CiAgICBoZWFkaW5nOiAiV2l0aCBNYXggV2lkdGgiLAogICAgd2lkdGg6ICJsYXJnZSIsCiAgICBtYXhXaWR0aDogNjAwLAogICAgY29udGVudDogYjJgCiAgICAgICAgICAgICAgPHA+VGhpcyBtb2RhbCBpcyBzZXQgdG8gJ2xhcmdlJyBidXQgY29uc3RyYWluZWQgYnkgYSBtYXhXaWR0aCBvZiA2MDBweC48L3A+CiAgICAgICAgICAgIGAsCiAgICBtZW51T3B0aW9uczogW3sKICAgICAgbmFtZTogIkdvdCBpdCIsCiAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgIH1dCiAgfSk7Cn19Pk1heCBXaWR0aCA2MDBweDwvZGVlcy1idXR0b24+CiAgICAgICAgCiAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGljaz0keygpID0+IHsKICBEZWVzTW9kYWwuY3JlYXRlQW5kU2hvdyh7CiAgICBoZWFkaW5nOiAiV2l0aCBNaW4gV2lkdGgiLAogICAgd2lkdGg6IDMwMCwKICAgIG1pbldpZHRoOiA0MDAsCiAgICBjb250ZW50OiBiMmAKICAgICAgICAgICAgICA8cD5UaGlzIG1vZGFsIHdpZHRoIGlzIHNldCB0byAzMDBweCBidXQgaGFzIGEgbWluV2lkdGggb2YgNDAwcHgsIHNvIGl0IHdpbGwgYmUgNDAwcHggd2lkZS48L3A+CiAgICAgICAgICAgIGAsCiAgICBtZW51T3B0aW9uczogW3sKICAgICAgbmFtZTogIk9LIiwKICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWwpID0+IG1vZGFsLmRlc3Ryb3koKQogICAgfV0KICB9KTsKfX0+TWluIFdpZHRoIDQwMHB4PC9kZWVzLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIAogICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgPGgzPkJ1dHRvbiBWYXJpYXRpb25zPC9oMz4KICAgICAgPHA+TW9kYWxzIGNhbiBoYXZlIGRpZmZlcmVudCBidXR0b24gY29uZmlndXJhdGlvbnMgd2l0aCBwcm9wZXIgc3BhY2luZy48L3A+CiAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbi1ncmlkIj4KICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrPSR7KCkgPT4gewogIERlZXNNb2RhbC5jcmVhdGVBbmRTaG93KHsKICAgIGhlYWRpbmc6ICJNdWx0aXBsZSBBY3Rpb25zIiwKICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgICAgIDxwPlRoaXMgbW9kYWwgZGVtb25zdHJhdGVzIG11bHRpcGxlIGJ1dHRvbnMgd2l0aCBwcm9wZXIgc3BhY2luZyBiZXR3ZWVuIHRoZW0uPC9wPgogICAgICAgICAgICBgLAogICAgbWVudU9wdGlvbnM6IFt7CiAgICAgIG5hbWU6ICJEZWxldGUiLAogICAgICBhY3Rpb246IGFzeW5jIChtb2RhbCkgPT4gbW9kYWwuZGVzdHJveSgpCiAgICB9LCB7CiAgICAgIG5hbWU6ICJDYW5jZWwiLAogICAgICBhY3Rpb246IGFzeW5jIChtb2RhbCkgPT4gbW9kYWwuZGVzdHJveSgpCiAgICB9LCB7CiAgICAgIG5hbWU6ICJTYXZlIENoYW5nZXMiLAogICAgICBhY3Rpb246IGFzeW5jIChtb2RhbCkgPT4gbW9kYWwuZGVzdHJveSgpCiAgICB9XQogIH0pOwp9fT5UaHJlZSBCdXR0b25zPC9kZWVzLWJ1dHRvbj4KICAgICAgICAKICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrPSR7KCkgPT4gewogIERlZXNNb2RhbC5jcmVhdGVBbmRTaG93KHsKICAgIGhlYWRpbmc6ICJTaW5nbGUgQWN0aW9uIiwKICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgICAgIDxwPlNvbWV0aW1lcyB5b3UganVzdCBuZWVkIG9uZSBidXR0b24uPC9wPgogICAgICAgICAgICBgLAogICAgbWVudU9wdGlvbnM6IFt7CiAgICAgIG5hbWU6ICJBY2tub3dsZWRnZSIsCiAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgIH1dCiAgfSk7Cn19PlNpbmdsZSBCdXR0b248L2RlZXMtYnV0dG9uPgogICAgICAgIAogICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2s9JHsoKSA9PiB7CiAgRGVlc01vZGFsLmNyZWF0ZUFuZFNob3coewogICAgaGVhZGluZzogIk5vIEFjdGlvbnMiLAogICAgY29udGVudDogYjJgCiAgICAgICAgICAgICAgPHA+VGhpcyBtb2RhbCBoYXMgbm8gYm90dG9tIGJ1dHRvbnMuIFVzZSB0aGUgWCBidXR0b24gb3IgY2xpY2sgb3V0c2lkZSB0byBjbG9zZS48L3A+CiAgICAgICAgICAgICAgPHAgc3R5bGU9Im1hcmdpbi10b3A6IDE2cHg7IGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzY2NiIsICIjOTk5Iil9OyI+VGhpcyBpcyB1c2VmdWwgZm9yIGluZm9ybWF0aW9uYWwgbW9kYWxzIHRoYXQgZG9uJ3QgcmVxdWlyZSB1c2VyIGFjdGlvbi48L3A+CiAgICAgICAgICAgIGAsCiAgICBtZW51T3B0aW9uczogW10KICB9KTsKfX0+Tm8gQnV0dG9uczwvZGVlcy1idXR0b24+CiAgICAgICAgCiAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGljaz0keygpID0+IHsKICBEZWVzTW9kYWwuY3JlYXRlQW5kU2hvdyh7CiAgICBoZWFkaW5nOiAiTG9uZyBCdXR0b24gTGFiZWxzIiwKICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgICAgIDxwPlRlc3RpbmcgYnV0dG9uIGxheW91dCB3aXRoIGxvbmdlciBsYWJlbHMuPC9wPgogICAgICAgICAgICBgLAogICAgbWVudU9wdGlvbnM6IFt7CiAgICAgIG5hbWU6ICJEaXNjYXJkIEFsbCBDaGFuZ2VzIiwKICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWwpID0+IG1vZGFsLmRlc3Ryb3koKQogICAgfSwgewogICAgICBuYW1lOiAiU2F2ZSBhbmQgQ29udGludWUgRWRpdGluZyIsCiAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgIH1dCiAgfSk7Cn19PkxvbmcgTGFiZWxzPC9kZWVzLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIAogICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgPGgzPlJlc3BvbnNpdmUgQmVoYXZpb3I8L2gzPgogICAgICA8cD5BbGwgbW9kYWxzIGF1dG9tYXRpY2FsbHkgYmVjb21lIGZ1bGwtd2lkdGggb24gbW9iaWxlIGRldmljZXMgKDwgNzY4cHggdmlld3BvcnQgd2lkdGgpIGZvciBiZXR0ZXIgdXNhYmlsaXR5LjwvcD4KICAgICAgPGRlZXMtYnV0dG9uIEBjbGljaz0keygpID0+IHsKICBEZWVzTW9kYWwuY3JlYXRlQW5kU2hvdyh7CiAgICBoZWFkaW5nOiAiUmVzcG9uc2l2ZSBNb2RhbCIsCiAgICB3aWR0aDogImxhcmdlIiwKICAgIHNob3dIZWxwQnV0dG9uOiB0cnVlLAogICAgb25IZWxwOiAoKSA9PiBjb25zb2xlLmxvZygiSGVscCByZXF1ZXN0ZWQgZm9yIHJlc3BvbnNpdmUgbW9kYWwiKSwKICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgICA8cD5SZXNpemUgeW91ciBicm93c2VyIHdpbmRvdyB0byBzZWUgaG93IHRoaXMgbW9kYWwgYWRhcHRzLiBPbiBtb2JpbGUgdmlld3BvcnRzLCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgdGFrZSB0aGUgZnVsbCB3aWR0aCBtaW51cyBtYXJnaW5zLjwvcD4KICAgICAgICAgICAgPHA+VGhlIGhlYWRlciBidXR0b25zIHJlbWFpbiBhY2Nlc3NpYmxlIGF0IGFsbCB2aWV3cG9ydCBzaXplcy48L3A+CiAgICAgICAgICBgLAogICAgbWVudU9wdGlvbnM6IFt7CiAgICAgIG5hbWU6ICJDbG9zZSIsCiAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsKSA9PiBtb2RhbC5kZXN0cm95KCkKICAgIH1dCiAgfSk7Cn19PlRlc3QgUmVzcG9uc2l2ZTwvZGVlcy1idXR0b24+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1vdmVybGF5L2RlZXMtbW9kYWwvZGVlcy1tb2RhbC5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2Rpc3RfdHMyOSgpOwppbml0X2RlZXNfaWNvbigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGUxNSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMTYgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNNb2RhbCA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1tb2RhbCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX2hlYWRpbmdfZGVjb3JhdG9yczsKICBsZXQgX2hlYWRpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oZWFkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZW50X2RlY29yYXRvcnM7CiAgbGV0IF9jb250ZW50X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29udGVudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWVudU9wdGlvbnNfZGVjb3JhdG9yczsKICBsZXQgX21lbnVPcHRpb25zX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWVudU9wdGlvbnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3dpZHRoX2RlY29yYXRvcnM7CiAgbGV0IF93aWR0aF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3dpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYXhXaWR0aF9kZWNvcmF0b3JzOwogIGxldCBfbWF4V2lkdGhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYXhXaWR0aF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWluV2lkdGhfZGVjb3JhdG9yczsKICBsZXQgX21pbldpZHRoX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWluV2lkdGhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dDbG9zZUJ1dHRvbl9kZWNvcmF0b3JzOwogIGxldCBfc2hvd0Nsb3NlQnV0dG9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0Nsb3NlQnV0dG9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93SGVscEJ1dHRvbl9kZWNvcmF0b3JzOwogIGxldCBfc2hvd0hlbHBCdXR0b25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93SGVscEJ1dHRvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfb25IZWxwX2RlY29yYXRvcnM7CiAgbGV0IF9vbkhlbHBfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vbkhlbHBfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21vYmlsZUZ1bGxzY3JlZW5fZGVjb3JhdG9yczsKICBsZXQgX21vYmlsZUZ1bGxzY3JlZW5faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tb2JpbGVGdWxsc2NyZWVuX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZW50UGFkZGluZ19kZWNvcmF0b3JzOwogIGxldCBfY29udGVudFBhZGRpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZW50UGFkZGluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW9kYWxaSW5kZXhfZGVjb3JhdG9yczsKICBsZXQgX21vZGFsWkluZGV4X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW9kYWxaSW5kZXhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc01vZGFsMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2hlYWRpbmdfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgIH0pXTsKICAgICAgX2NvbnRlbnRfZGVjb3JhdG9ycyA9IFtyNSh7fSldOwogICAgICBfbWVudU9wdGlvbnNfZGVjb3JhdG9ycyA9IFtyNSh7fSldOwogICAgICBfd2lkdGhfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9tYXhXaWR0aF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX21pbldpZHRoX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfc2hvd0Nsb3NlQnV0dG9uX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3Nob3dIZWxwQnV0dG9uX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX29uSGVscF9kZWNvcmF0b3JzID0gW241KHsgYXR0cmlidXRlOiBmYWxzZSB9KV07CiAgICAgIF9tb2JpbGVGdWxsc2NyZWVuX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2NvbnRlbnRQYWRkaW5nX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfbW9kYWxaSW5kZXhfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlMTUodGhpcywgbnVsbCwgX2hlYWRpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaGVhZGluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaGVhZGluZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5oZWFkaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5oZWFkaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2hlYWRpbmdfaW5pdGlhbGl6ZXJzLCBfaGVhZGluZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE1KHRoaXMsIG51bGwsIF9jb250ZW50X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNvbnRlbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNvbnRlbnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29udGVudCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY29udGVudCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jb250ZW50X2luaXRpYWxpemVycywgX2NvbnRlbnRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxNSh0aGlzLCBudWxsLCBfbWVudU9wdGlvbnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWVudU9wdGlvbnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1lbnVPcHRpb25zIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1lbnVPcHRpb25zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tZW51T3B0aW9ucyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tZW51T3B0aW9uc19pbml0aWFsaXplcnMsIF9tZW51T3B0aW9uc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE1KHRoaXMsIG51bGwsIF93aWR0aF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ3aWR0aCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAid2lkdGgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoud2lkdGgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLndpZHRoID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3dpZHRoX2luaXRpYWxpemVycywgX3dpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTUodGhpcywgbnVsbCwgX21heFdpZHRoX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1heFdpZHRoIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtYXhXaWR0aCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYXhXaWR0aCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWF4V2lkdGggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWF4V2lkdGhfaW5pdGlhbGl6ZXJzLCBfbWF4V2lkdGhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxNSh0aGlzLCBudWxsLCBfbWluV2lkdGhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWluV2lkdGgiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1pbldpZHRoIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1pbldpZHRoLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5taW5XaWR0aCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9taW5XaWR0aF9pbml0aWFsaXplcnMsIF9taW5XaWR0aF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE1KHRoaXMsIG51bGwsIF9zaG93Q2xvc2VCdXR0b25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2hvd0Nsb3NlQnV0dG9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93Q2xvc2VCdXR0b24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2hvd0Nsb3NlQnV0dG9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaG93Q2xvc2VCdXR0b24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd0Nsb3NlQnV0dG9uX2luaXRpYWxpemVycywgX3Nob3dDbG9zZUJ1dHRvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE1KHRoaXMsIG51bGwsIF9zaG93SGVscEJ1dHRvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93SGVscEJ1dHRvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd0hlbHBCdXR0b24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2hvd0hlbHBCdXR0b24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dIZWxwQnV0dG9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dIZWxwQnV0dG9uX2luaXRpYWxpemVycywgX3Nob3dIZWxwQnV0dG9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTUodGhpcywgbnVsbCwgX29uSGVscF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJvbkhlbHAiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm9uSGVscCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5vbkhlbHAsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm9uSGVscCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9vbkhlbHBfaW5pdGlhbGl6ZXJzLCBfb25IZWxwX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTUodGhpcywgbnVsbCwgX21vYmlsZUZ1bGxzY3JlZW5fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibW9iaWxlRnVsbHNjcmVlbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibW9iaWxlRnVsbHNjcmVlbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tb2JpbGVGdWxsc2NyZWVuLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tb2JpbGVGdWxsc2NyZWVuID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21vYmlsZUZ1bGxzY3JlZW5faW5pdGlhbGl6ZXJzLCBfbW9iaWxlRnVsbHNjcmVlbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE1KHRoaXMsIG51bGwsIF9jb250ZW50UGFkZGluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb250ZW50UGFkZGluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29udGVudFBhZGRpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29udGVudFBhZGRpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvbnRlbnRQYWRkaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbnRlbnRQYWRkaW5nX2luaXRpYWxpemVycywgX2NvbnRlbnRQYWRkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTUodGhpcywgbnVsbCwgX21vZGFsWkluZGV4X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1vZGFsWkluZGV4Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtb2RhbFpJbmRleCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tb2RhbFpJbmRleCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubW9kYWxaSW5kZXggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbW9kYWxaSW5kZXhfaW5pdGlhbGl6ZXJzLCBfbW9kYWxaSW5kZXhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxNShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNNb2RhbDIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgLy8gU1RBVElDCiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jOTsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJPdmVybGF5Il07CiAgICBzdGF0aWMgYXN5bmMgY3JlYXRlQW5kU2hvdyhvcHRpb25zQXJnKSB7CiAgICAgIGNvbnN0IGJvZHkzID0gZG9jdW1lbnQuYm9keTsKICAgICAgY29uc3QgbW9kYWwgPSBuZXcgRGVlc01vZGFsMigpOwogICAgICBtb2RhbC5oZWFkaW5nID0gb3B0aW9uc0FyZy5oZWFkaW5nOwogICAgICBtb2RhbC5jb250ZW50ID0gb3B0aW9uc0FyZy5jb250ZW50OwogICAgICBtb2RhbC5tZW51T3B0aW9ucyA9IG9wdGlvbnNBcmcubWVudU9wdGlvbnM7CiAgICAgIGlmIChvcHRpb25zQXJnLndpZHRoKQogICAgICAgIG1vZGFsLndpZHRoID0gb3B0aW9uc0FyZy53aWR0aDsKICAgICAgaWYgKG9wdGlvbnNBcmcubWF4V2lkdGgpCiAgICAgICAgbW9kYWwubWF4V2lkdGggPSBvcHRpb25zQXJnLm1heFdpZHRoOwogICAgICBpZiAob3B0aW9uc0FyZy5taW5XaWR0aCkKICAgICAgICBtb2RhbC5taW5XaWR0aCA9IG9wdGlvbnNBcmcubWluV2lkdGg7CiAgICAgIGlmIChvcHRpb25zQXJnLnNob3dDbG9zZUJ1dHRvbiAhPT0gdm9pZCAwKQogICAgICAgIG1vZGFsLnNob3dDbG9zZUJ1dHRvbiA9IG9wdGlvbnNBcmcuc2hvd0Nsb3NlQnV0dG9uOwogICAgICBpZiAob3B0aW9uc0FyZy5zaG93SGVscEJ1dHRvbiAhPT0gdm9pZCAwKQogICAgICAgIG1vZGFsLnNob3dIZWxwQnV0dG9uID0gb3B0aW9uc0FyZy5zaG93SGVscEJ1dHRvbjsKICAgICAgaWYgKG9wdGlvbnNBcmcub25IZWxwKQogICAgICAgIG1vZGFsLm9uSGVscCA9IG9wdGlvbnNBcmcub25IZWxwOwogICAgICBpZiAob3B0aW9uc0FyZy5tb2JpbGVGdWxsc2NyZWVuICE9PSB2b2lkIDApCiAgICAgICAgbW9kYWwubW9iaWxlRnVsbHNjcmVlbiA9IG9wdGlvbnNBcmcubW9iaWxlRnVsbHNjcmVlbjsKICAgICAgaWYgKG9wdGlvbnNBcmcuY29udGVudFBhZGRpbmcgIT09IHZvaWQgMCkKICAgICAgICBtb2RhbC5jb250ZW50UGFkZGluZyA9IG9wdGlvbnNBcmcuY29udGVudFBhZGRpbmc7CiAgICAgIG1vZGFsLndpbmRvd0xheWVyID0gYXdhaXQgRGVlc1dpbmRvd0xheWVyLmNyZWF0ZUFuZFNob3coewogICAgICAgIGJsdXI6IHRydWUKICAgICAgfSk7CiAgICAgIG1vZGFsLndpbmRvd0xheWVyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKCkgPT4gewogICAgICAgIGF3YWl0IG1vZGFsLmRlc3Ryb3koKTsKICAgICAgfSk7CiAgICAgIGJvZHkzLmFwcGVuZChtb2RhbC53aW5kb3dMYXllcik7CiAgICAgIGJvZHkzLmFwcGVuZChtb2RhbCk7CiAgICAgIG1vZGFsLm1vZGFsWkluZGV4ID0gekluZGV4UmVnaXN0cnkuZ2V0TmV4dFpJbmRleCgpOwogICAgICB6SW5kZXhSZWdpc3RyeS5yZWdpc3Rlcihtb2RhbCwgbW9kYWwubW9kYWxaSW5kZXgpOwogICAgICByZXR1cm4gbW9kYWw7CiAgICB9CiAgICAjaGVhZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfaGVhZGluZ19pbml0aWFsaXplcnMsICIiKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgaGVhZGluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2hlYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBoZWFkaW5nKHZhbHVlMikgewogICAgICB0aGlzLiNoZWFkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29udGVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTYodGhpcywgX2hlYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczE2KHRoaXMsIF9jb250ZW50X2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgY29udGVudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvbnRlbnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjb250ZW50KHZhbHVlMikgewogICAgICB0aGlzLiNjb250ZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWVudU9wdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE2KHRoaXMsIF9jb250ZW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfbWVudU9wdGlvbnNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IG1lbnVPcHRpb25zKCkgewogICAgICByZXR1cm4gdGhpcy4jbWVudU9wdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtZW51T3B0aW9ucyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWVudU9wdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN3aWR0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTYodGhpcywgX21lbnVPcHRpb25zX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfd2lkdGhfaW5pdGlhbGl6ZXJzLCAibWVkaXVtIikpOwogICAgZ2V0IHdpZHRoKCkgewogICAgICByZXR1cm4gdGhpcy4jd2lkdGhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB3aWR0aCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jd2lkdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtYXhXaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTYodGhpcywgX3dpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfbWF4V2lkdGhfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBtYXhXaWR0aCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21heFdpZHRoX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWF4V2lkdGgodmFsdWUyKSB7CiAgICAgIHRoaXMuI21heFdpZHRoX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWluV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE2KHRoaXMsIF9tYXhXaWR0aF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTYodGhpcywgX21pbldpZHRoX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgbWluV2lkdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtaW5XaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1pbldpZHRoKHZhbHVlMikgewogICAgICB0aGlzLiNtaW5XaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dDbG9zZUJ1dHRvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTYodGhpcywgX21pbldpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfc2hvd0Nsb3NlQnV0dG9uX2luaXRpYWxpemVycywgdHJ1ZSkpOwogICAgZ2V0IHNob3dDbG9zZUJ1dHRvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dDbG9zZUJ1dHRvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dDbG9zZUJ1dHRvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2hvd0Nsb3NlQnV0dG9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd0hlbHBCdXR0b25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE2KHRoaXMsIF9zaG93Q2xvc2VCdXR0b25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczE2KHRoaXMsIF9zaG93SGVscEJ1dHRvbl9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgc2hvd0hlbHBCdXR0b24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93SGVscEJ1dHRvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dIZWxwQnV0dG9uKHZhbHVlMikgewogICAgICB0aGlzLiNzaG93SGVscEJ1dHRvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI29uSGVscF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTYodGhpcywgX3Nob3dIZWxwQnV0dG9uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfb25IZWxwX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgb25IZWxwKCkgewogICAgICByZXR1cm4gdGhpcy4jb25IZWxwX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgb25IZWxwKHZhbHVlMikgewogICAgICB0aGlzLiNvbkhlbHBfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtb2JpbGVGdWxsc2NyZWVuX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfb25IZWxwX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfbW9iaWxlRnVsbHNjcmVlbl9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgbW9iaWxlRnVsbHNjcmVlbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI21vYmlsZUZ1bGxzY3JlZW5fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtb2JpbGVGdWxsc2NyZWVuKHZhbHVlMikgewogICAgICB0aGlzLiNtb2JpbGVGdWxsc2NyZWVuX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29udGVudFBhZGRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE2KHRoaXMsIF9tb2JpbGVGdWxsc2NyZWVuX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfY29udGVudFBhZGRpbmdfaW5pdGlhbGl6ZXJzLCAxNikpOwogICAgZ2V0IGNvbnRlbnRQYWRkaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jY29udGVudFBhZGRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjb250ZW50UGFkZGluZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29udGVudFBhZGRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtb2RhbFpJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTYodGhpcywgX2NvbnRlbnRQYWRkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNih0aGlzLCBfbW9kYWxaSW5kZXhfaW5pdGlhbGl6ZXJzLCAxZTMpKTsKICAgIGdldCBtb2RhbFpJbmRleCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21vZGFsWkluZGV4X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbW9kYWxaSW5kZXgodmFsdWUyKSB7CiAgICAgIHRoaXMuI21vZGFsWkluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1mYW1pbHk6ICR7Y3NzR2Vpc3RGb250RmFtaWx5fTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzMzMiLCAiI2ZmZiIpfTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CiAgICAgIC5tb2RhbENvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgbGVmdDogMHB4OwogICAgICAgIHdpZHRoOiAxMDB2dzsKICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfQogICAgICAubW9kYWwgewogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCkgc2NhbGUoMC45NSk7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBtaW4taGVpZ2h0OiAxMjBweDsKICAgICAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNDBweCk7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzA5MDkwYiIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xKSwgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4wNik7CiAgICAgICAgbWFyZ2luOiAyMHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgICB9CgogICAgICAvKiBXaWR0aCB2YXJpYXRpb25zICovCiAgICAgIC5tb2RhbC53aWR0aC1zbWFsbCB7CiAgICAgICAgd2lkdGg6IDM4MHB4OwogICAgICB9CgogICAgICAubW9kYWwud2lkdGgtbWVkaXVtIHsKICAgICAgICB3aWR0aDogNTYwcHg7CiAgICAgIH0KCiAgICAgIC5tb2RhbC53aWR0aC1sYXJnZSB7CiAgICAgICAgd2lkdGg6IDgwMHB4OwogICAgICB9CgogICAgICAubW9kYWwud2lkdGgtZnVsbHNjcmVlbiB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLSA0MHB4KTsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdmggLSA0MHB4KTsKICAgICAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNDBweCk7CiAgICAgIH0KCiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgewogICAgICAgIC5tb2RhbCB7CiAgICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAtIDQwcHgpICFpbXBvcnRhbnQ7CiAgICAgICAgICBtYXgtd2lkdGg6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLyogQWxsb3cgZnVsbCBoZWlnaHQgb24gbW9iaWxlIHdoZW4gY29udGVudCBuZWVkcyBpdCAqLwogICAgICAgIC5tb2RhbENvbnRhaW5lciB7CiAgICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAubW9kYWwgewogICAgICAgICAgbWFyZ2luOiAxMHB4OwogICAgICAgICAgbWF4LWhlaWdodDogY2FsYygxMDB2aCAtIDIwcHgpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvKiBGdWxsIHNjcmVlbiBtb2RlIG9uIG1vYmlsZSAqLwogICAgICAgIC5tb2RhbC5tb2JpbGUtZnVsbHNjcmVlbiB7CiAgICAgICAgICB3aWR0aDogMTAwdncgIWltcG9ydGFudDsKICAgICAgICAgIGhlaWdodDogMTAwdmggIWltcG9ydGFudDsKICAgICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoICFpbXBvcnRhbnQ7CiAgICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiAwOwogICAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLm1vZGFsLnNob3cgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCkgc2NhbGUoMSk7CiAgICAgIH0KCiAgICAgIC5tb2RhbC5zaG93LnByZWRlc3Ryb3kgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwcHgpIHNjYWxlKDEpOwogICAgICB9CgogICAgICAubW9kYWwgLmhlYWRpbmcgewogICAgICAgIGhlaWdodDogNDBweDsKICAgICAgICBtaW4taGVpZ2h0OiA0MHB4OwogICAgICAgIGZvbnQtZmFtaWx5OiAke2Nzc0dlaXN0Rm9udEZhbWlseX07CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBwYWRkaW5nOiAwIDEycHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAubW9kYWwgLmhlYWRpbmcgLmhlYWRlci1idXR0b25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiA4cHg7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOwogICAgICB9CgogICAgICAubW9kYWwgLmhlYWRpbmcgLmhlYWRlci1idXR0b24gewogICAgICAgIHdpZHRoOiAyOHB4OwogICAgICAgIGhlaWdodDogMjhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgICAgfQoKICAgICAgLm1vZGFsIC5oZWFkaW5nIC5oZWFkZXItYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjMjcyNzJhIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICB9CgogICAgICAubW9kYWwgLmhlYWRpbmcgLmhlYWRlci1idXR0b246YWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjM2YzZjQ2Iil9OwogICAgICB9CgogICAgICAubW9kYWwgLmhlYWRpbmcgLmhlYWRlci1idXR0b24gZGVlcy1pY29uIHsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC5tb2RhbCAuaGVhZGluZyAuaGVhZGluZy10ZXh0IHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBsaW5lLWhlaWdodDogNDBweDsKICAgICAgICBwYWRkaW5nOiAwIDQwcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICAgIH0KCiAgICAgIC5tb2RhbCAuY29udGVudCB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgICB9CiAgICAgIC5tb2RhbCAuYm90dG9tQnV0dG9ucyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAubW9kYWwgLmJvdHRvbUJ1dHRvbnMgLmJvdHRvbUJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxNnB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzI3MjcyYSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjM2YzZjQ2Iil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgIC5tb2RhbCAuYm90dG9tQnV0dG9ucyAuYm90dG9tQnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjM2YzZjQ2Iil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkMWQ1ZGIiLCAiIzUyNTI1YiIpfTsKICAgICAgfQogICAgICAubW9kYWwgLmJvdHRvbUJ1dHRvbnMgLmJvdHRvbUJ1dHRvbjphY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiM1MjUyNWIiKX07CiAgICAgIH0KICAgICAgLm1vZGFsIC5ib3R0b21CdXR0b25zIC5ib3R0b21CdXR0b246bGFzdC1jaGlsZCB7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiBub25lOwogICAgICB9CgogICAgICAubW9kYWwgLmJvdHRvbUJ1dHRvbnMgLmJvdHRvbUJ1dHRvbi5wcmltYXJ5IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjM2I4MmY2Iil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICAgICAgICBjb2xvcjogI2ZmZmZmZjsKICAgICAgfQogICAgICAubW9kYWwgLmJvdHRvbUJ1dHRvbnMgLmJvdHRvbUJ1dHRvbi5wcmltYXJ5OmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzI1NjNlYiIsICIjMjU2M2ViIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyNTYzZWIiLCAiIzI1NjNlYiIpfTsKICAgICAgfQogICAgICAubW9kYWwgLmJvdHRvbUJ1dHRvbnMgLmJvdHRvbUJ1dHRvbi5wcmltYXJ5OmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxZDRlZDgiLCAiIzFkNGVkOCIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMWQ0ZWQ4IiwgIiMxZDRlZDgiKX07CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIGNvbnN0IHdpZHRoQ2xhc3MgPSB0eXBlb2YgdGhpcy53aWR0aCA9PT0gInN0cmluZyIgPyBgd2lkdGgtJHt0aGlzLndpZHRofWAgOiAiIjsKICAgICAgY29uc3QgY3VzdG9tV2lkdGggPSB0eXBlb2YgdGhpcy53aWR0aCA9PT0gIm51bWJlciIgPyBgJHt0aGlzLndpZHRofXB4YCA6ICIiOwogICAgICBjb25zdCBtYXhXaWR0aFN0eWxlID0gdGhpcy5tYXhXaWR0aCA/IGAke3RoaXMubWF4V2lkdGh9cHhgIDogIiI7CiAgICAgIGNvbnN0IG1pbldpZHRoU3R5bGUgPSB0aGlzLm1pbldpZHRoID8gYCR7dGhpcy5taW5XaWR0aH1weGAgOiAiIjsKICAgICAgY29uc3QgbW9iaWxlRnVsbHNjcmVlbkNsYXNzID0gdGhpcy5tb2JpbGVGdWxsc2NyZWVuID8gIm1vYmlsZS1mdWxsc2NyZWVuIiA6ICIiOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxzdHlsZT4KICAgICAgICAke2N1c3RvbVdpZHRoID8gYC5tb2RhbCB7IHdpZHRoOiAke2N1c3RvbVdpZHRofTsgfWAgOiAiIn0KICAgICAgICAke21heFdpZHRoU3R5bGUgPyBgLm1vZGFsIHsgbWF4LXdpZHRoOiAke21heFdpZHRoU3R5bGV9OyB9YCA6ICIifQogICAgICAgICR7bWluV2lkdGhTdHlsZSA/IGAubW9kYWwgeyBtaW4td2lkdGg6ICR7bWluV2lkdGhTdHlsZX07IH1gIDogIiJ9CiAgICAgIDwvc3R5bGU+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsQ29udGFpbmVyIiBAY2xpY2s9JHt0aGlzLmhhbmRsZU91dHNpZGVDbGlja30gc3R5bGU9InotaW5kZXg6ICR7dGhpcy5tb2RhbFpJbmRleH0iPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsICR7d2lkdGhDbGFzc30gJHttb2JpbGVGdWxsc2NyZWVuQ2xhc3N9Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXRleHQiPiR7dGhpcy5oZWFkaW5nfTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItYnV0dG9ucyI+CiAgICAgICAgICAgICAgJHt0aGlzLnNob3dIZWxwQnV0dG9uID8gYjJgCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItYnV0dG9uIiBAY2xpY2s9JHt0aGlzLmhhbmRsZUhlbHB9IHRpdGxlPSJIZWxwIj4KICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6aGVscENpcmNsZSJ9PjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgYCA6ICIifQogICAgICAgICAgICAgICR7dGhpcy5zaG93Q2xvc2VCdXR0b24gPyBiMmAKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlci1idXR0b24iIEBjbGljaz0keygpID0+IHRoaXMuZGVzdHJveSgpfSB0aXRsZT0iQ2xvc2UiPgogICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTp4In0+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50IiBzdHlsZT0icGFkZGluZzogJHt0aGlzLmNvbnRlbnRQYWRkaW5nfXB4OyI+JHt0aGlzLmNvbnRlbnR9PC9kaXY+CiAgICAgICAgICAke3RoaXMubWVudU9wdGlvbnMubGVuZ3RoID4gMCA/IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJib3R0b21CdXR0b25zIj4KICAgICAgICAgICAgICAke3RoaXMubWVudU9wdGlvbnMubWFwKChhY3Rpb25BcmcsIGluZGV4MikgPT4gYjJgCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJvdHRvbUJ1dHRvbiAke2luZGV4MiA9PT0gdGhpcy5tZW51T3B0aW9ucy5sZW5ndGggLSAxID8gInByaW1hcnkiIDogIiJ9ICR7YWN0aW9uQXJnLm5hbWUgPT09ICJPSyIgPyAib2siIDogIiJ9IiBAY2xpY2s9JHsoKSA9PiB7CiAgICAgICAgYWN0aW9uQXJnLmFjdGlvbih0aGlzKTsKICAgICAgfX0+JHthY3Rpb25BcmcubmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgIGApfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGAgOiAiIn0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgd2luZG93TGF5ZXIgPSBfX3J1bkluaXRpYWxpemVyczE2KHRoaXMsIF9tb2RhbFpJbmRleF9leHRyYUluaXRpYWxpemVycyk7CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBjb25zdCBkb210b29scyA9IGF3YWl0IHRoaXMuZG9tdG9vbHNQcm9taXNlOwogICAgICBhd2FpdCBkb210b29scy5jb252ZW5pZW5jZS5zbWFydGRlbGF5LmRlbGF5Rm9yKDMwKTsKICAgICAgY29uc3QgbW9kYWwgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLm1vZGFsIik7CiAgICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoInNob3ciKTsKICAgIH0KICAgIGFzeW5jIGhhbmRsZU91dHNpZGVDbGljayhldmVudEFyZykgewogICAgICBldmVudEFyZy5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgY29uc3QgbW9kYWxDb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLm1vZGFsQ29udGFpbmVyIik7CiAgICAgIGlmIChldmVudEFyZy50YXJnZXQgPT09IG1vZGFsQ29udGFpbmVyKSB7CiAgICAgICAgYXdhaXQgdGhpcy5kZXN0cm95KCk7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGRlc3Ryb3koKSB7CiAgICAgIGNvbnN0IGRvbXRvb2xzID0gYXdhaXQgdGhpcy5kb210b29sc1Byb21pc2U7CiAgICAgIGNvbnN0IG1vZGFsID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5tb2RhbCIpOwogICAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCJwcmVkZXN0cm95Iik7CiAgICAgIGF3YWl0IGRvbXRvb2xzLmNvbnZlbmllbmNlLnNtYXJ0ZGVsYXkuZGVsYXlGb3IoMjAwKTsKICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzKTsKICAgICAgYXdhaXQgdGhpcy53aW5kb3dMYXllci5kZXN0cm95KCk7CiAgICAgIHpJbmRleFJlZ2lzdHJ5LnVucmVnaXN0ZXIodGhpcyk7CiAgICB9CiAgICBhc3luYyBoYW5kbGVIZWxwKCkgewogICAgICBpZiAodGhpcy5vbkhlbHApIHsKICAgICAgICBhd2FpdCB0aGlzLm9uSGVscCgpOwogICAgICB9CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczE2KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzTW9kYWwyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1sYWJlbC9kZWVzLWxhYmVsLmRlbW8uanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIGRlbW9GdW5jMTAgPSAoKSA9PiB7CiAgcmV0dXJuIGIyYAogICAgPGRlZXMtbGFiZWwgLmxhYmVsPSR7ImEgbGFiZWwifT48L2RlZXMtbGFiZWw+CiAgYDsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1sYWJlbC9kZWVzLWxhYmVsLmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTE2ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMxNyA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0xhYmVsID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLWxhYmVsIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfbGFiZWxfZGVjb3JhdG9yczsKICBsZXQgX2xhYmVsX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGFiZWxfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Rlc2NyaXB0aW9uX2RlY29yYXRvcnM7CiAgbGV0IF9kZXNjcmlwdGlvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Rlc2NyaXB0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZXF1aXJlZF9kZWNvcmF0b3JzOwogIGxldCBfcmVxdWlyZWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZXF1aXJlZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzTGFiZWwyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfbGFiZWxfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgIHJlZmxlY3Q6IHRydWUKICAgICAgfSldOwogICAgICBfZGVzY3JpcHRpb25fZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgIHJlZmxlY3Q6IHRydWUKICAgICAgfSldOwogICAgICBfcmVxdWlyZWRfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICByZWZsZWN0OiB0cnVlCiAgICAgIH0pXTsKICAgICAgX19lc0RlY29yYXRlMTYodGhpcywgbnVsbCwgX2xhYmVsX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxhYmVsIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsYWJlbCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sYWJlbCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubGFiZWwgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbGFiZWxfaW5pdGlhbGl6ZXJzLCBfbGFiZWxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxNih0aGlzLCBudWxsLCBfZGVzY3JpcHRpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZGVzY3JpcHRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRlc2NyaXB0aW9uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRlc2NyaXB0aW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kZXNjcmlwdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kZXNjcmlwdGlvbl9pbml0aWFsaXplcnMsIF9kZXNjcmlwdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE2KHRoaXMsIG51bGwsIF9yZXF1aXJlZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJyZXF1aXJlZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicmVxdWlyZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucmVxdWlyZWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnJlcXVpcmVkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3JlcXVpcmVkX2luaXRpYWxpemVycywgX3JlcXVpcmVkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTYobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzTGFiZWwyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMxMDsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJMYXlvdXQiLCAiSW5wdXQiXTsKICAgICNsYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMxNyh0aGlzLCBfbGFiZWxfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IGxhYmVsKCkgewogICAgICByZXR1cm4gdGhpcy4jbGFiZWxfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsYWJlbCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbGFiZWxfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNkZXNjcmlwdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTcodGhpcywgX2xhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxNyh0aGlzLCBfZGVzY3JpcHRpb25faW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBkZXNjcmlwdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2Rlc2NyaXB0aW9uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZGVzY3JpcHRpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI2Rlc2NyaXB0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcmVxdWlyZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE3KHRoaXMsIF9kZXNjcmlwdGlvbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTcodGhpcywgX3JlcXVpcmVkX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCByZXF1aXJlZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3JlcXVpcmVkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcmVxdWlyZWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3JlcXVpcmVkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsICdSb2JvdG8nLCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAubGFiZWwgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDE1JSkiLCAiaHNsKDAgMCUgOTAlKSIpfTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsaW5lLWhlaWdodDogMS41OwogICAgICAgIG1hcmdpbi1ib3R0b206IDZweDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CiAgICAgIH0KCiAgICAgIC5yZXF1aXJlZCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA4NC4yJSA2MC4yJSkiLCAiaHNsKDAgNzIuMiUgNTAuNiUpIil9OwogICAgICAgIG1hcmdpbi1sZWZ0OiAycHg7CiAgICAgIH0KCiAgICAgIGRlZXMtaWNvbiB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKICAgICAgICBtYXJnaW4tbGVmdDogNHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDUuMSUpIiwgImhzbCgwIDAlIDYzLjklKSIpfTsKICAgICAgICBjdXJzb3I6IGhlbHA7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgJHt0aGlzLmxhYmVsID8gYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj4KICAgICAgICAgICAgICAke3RoaXMubGFiZWx9CiAgICAgICAgICAgICAgJHt0aGlzLnJlcXVpcmVkID8gYjJgPHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPmAgOiAiIn0KICAgICAgICAgICAgICAke3RoaXMuZGVzY3JpcHRpb24gPyBiMmAKICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTppbmZvIn0+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICAgICAgPGRlZXMtc3BlZWNoYnViYmxlIC50ZXh0PSR7dGhpcy5kZXNjcmlwdGlvbn0+PC9kZWVzLXNwZWVjaGJ1YmJsZT4KICAgICAgICAgICAgICAgICAgYCA6IGIyYGB9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYCA6IGIyYGB9CiAgICBgOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMTcodGhpcywgX3JlcXVpcmVkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMTcoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNMYWJlbDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXdvcmtzcGFjZS9kZWVzLXdvcmtzcGFjZS1tb25hY28vdmVyc2lvbi5qcwp2YXIgTU9OQUNPX1ZFUlNJT04gPSAiMC41NS4xIjsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC13b3Jrc3BhY2UvZGVlcy13b3Jrc3BhY2UtbW9uYWNvL2RlZXMtd29ya3NwYWNlLW1vbmFjby5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2Rpc3RfdHMyOSgpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGUxNyA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMTggPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNXb3Jrc3BhY2VNb25hY28gPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtd29ya3NwYWNlLW1vbmFjbyIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX2NvbnRlbnRfZGVjb3JhdG9yczsKICBsZXQgX2NvbnRlbnRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZW50X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sYW5ndWFnZV9kZWNvcmF0b3JzOwogIGxldCBfbGFuZ3VhZ2VfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sYW5ndWFnZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZmlsZVBhdGhfZGVjb3JhdG9yczsKICBsZXQgX2ZpbGVQYXRoX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZmlsZVBhdGhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRlbnRTdWJqZWN0X2RlY29yYXRvcnM7CiAgbGV0IF9jb250ZW50U3ViamVjdF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRlbnRTdWJqZWN0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF93b3JkV3JhcF9kZWNvcmF0b3JzOwogIGxldCBfd29yZFdyYXBfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF93b3JkV3JhcF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzV29ya3NwYWNlTW9uYWNvMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2NvbnRlbnRfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgIH0pXTsKICAgICAgX2xhbmd1YWdlX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IFN0cmluZwogICAgICB9KV07CiAgICAgIF9maWxlUGF0aF9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBTdHJpbmcKICAgICAgfSldOwogICAgICBfY29udGVudFN1YmplY3RfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogT2JqZWN0CiAgICAgIH0pXTsKICAgICAgX3dvcmRXcmFwX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEJvb2xlYW4KICAgICAgfSldOwogICAgICBfX2VzRGVjb3JhdGUxNyh0aGlzLCBudWxsLCBfY29udGVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb250ZW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb250ZW50IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNvbnRlbnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvbnRlbnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29udGVudF9pbml0aWFsaXplcnMsIF9jb250ZW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTcodGhpcywgbnVsbCwgX2xhbmd1YWdlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxhbmd1YWdlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsYW5ndWFnZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sYW5ndWFnZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubGFuZ3VhZ2UgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbGFuZ3VhZ2VfaW5pdGlhbGl6ZXJzLCBfbGFuZ3VhZ2VfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxNyh0aGlzLCBudWxsLCBfZmlsZVBhdGhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZmlsZVBhdGgiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZpbGVQYXRoIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmZpbGVQYXRoLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5maWxlUGF0aCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9maWxlUGF0aF9pbml0aWFsaXplcnMsIF9maWxlUGF0aF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE3KHRoaXMsIG51bGwsIF9jb250ZW50U3ViamVjdF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb250ZW50U3ViamVjdCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29udGVudFN1YmplY3QiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29udGVudFN1YmplY3QsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvbnRlbnRTdWJqZWN0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbnRlbnRTdWJqZWN0X2luaXRpYWxpemVycywgX2NvbnRlbnRTdWJqZWN0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTcodGhpcywgbnVsbCwgX3dvcmRXcmFwX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIndvcmRXcmFwIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ3b3JkV3JhcCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai53b3JkV3JhcCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoud29yZFdyYXAgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfd29yZFdyYXBfaW5pdGlhbGl6ZXJzLCBfd29yZFdyYXBfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxNyhudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNXb3Jrc3BhY2VNb25hY28yID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIC8vIERFTU8KICAgIHN0YXRpYyBkZW1vID0gKCkgPT4gYjJgPGRlZXMtd29ya3NwYWNlLW1vbmFjbz48L2RlZXMtd29ya3NwYWNlLW1vbmFjbz5gOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIldvcmtzcGFjZSJdOwogICAgLy8gU1RBVElDCiAgICBzdGF0aWMgbW9uYWNvRGVmZXJyZWQ7CiAgICAvLyBJTlNUQU5DRQogICAgZWRpdG9yRGVmZXJyZWQgPSBkb210b29sc19wbHVnaW5leHBvcnRzX2V4cG9ydHMuc21hcnRwcm9taXNlLmRlZmVyKCk7CiAgICAjY29udGVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMxOCh0aGlzLCBfY29udGVudF9pbml0aWFsaXplcnMsICJmdW5jdGlvbiBoZWxsbygpIHtcbglhbGVydCgnSGVsbG8gd29ybGQhJyk7XG59Iik7CiAgICBnZXQgY29udGVudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvbnRlbnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjb250ZW50KHZhbHVlMikgewogICAgICB0aGlzLiNjb250ZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbGFuZ3VhZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE4KHRoaXMsIF9jb250ZW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxOCh0aGlzLCBfbGFuZ3VhZ2VfaW5pdGlhbGl6ZXJzLCAidHlwZXNjcmlwdCIpKTsKICAgIGdldCBsYW5ndWFnZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xhbmd1YWdlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbGFuZ3VhZ2UodmFsdWUyKSB7CiAgICAgIHRoaXMuI2xhbmd1YWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZmlsZVBhdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE4KHRoaXMsIF9sYW5ndWFnZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTgodGhpcywgX2ZpbGVQYXRoX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBmaWxlUGF0aCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2ZpbGVQYXRoX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZmlsZVBhdGgodmFsdWUyKSB7CiAgICAgIHRoaXMuI2ZpbGVQYXRoX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29udGVudFN1YmplY3RfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE4KHRoaXMsIF9maWxlUGF0aF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTgodGhpcywgX2NvbnRlbnRTdWJqZWN0X2luaXRpYWxpemVycywgbmV3IGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cy5zbWFydHJ4LnJ4anMuU3ViamVjdCgpKSk7CiAgICBnZXQgY29udGVudFN1YmplY3QoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb250ZW50U3ViamVjdF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNvbnRlbnRTdWJqZWN0KHZhbHVlMikgewogICAgICB0aGlzLiNjb250ZW50U3ViamVjdF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3dvcmRXcmFwX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxOCh0aGlzLCBfY29udGVudFN1YmplY3RfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczE4KHRoaXMsIF93b3JkV3JhcF9pbml0aWFsaXplcnMsICJvZmYiKSk7CiAgICBnZXQgd29yZFdyYXAoKSB7CiAgICAgIHJldHVybiB0aGlzLiN3b3JkV3JhcF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHdvcmRXcmFwKHZhbHVlMikgewogICAgICB0aGlzLiN3b3JkV3JhcF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgbW9uYWNvVGhlbWVTdWJzY3JpcHRpb24gPSAoX19ydW5Jbml0aWFsaXplcnMxOCh0aGlzLCBfd29yZFdyYXBfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgIGlzVXBkYXRpbmdGcm9tRXh0ZXJuYWwgPSBmYWxzZTsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBEb21Ub29scy5zZXR1cERvbVRvb2xzKCk7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICogewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgIC5tYWluYm94IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjY29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9Im1haW5ib3giPgogICAgICAgIDxkaXYgaWQ9ImNvbnRhaW5lciI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdC5nZXRFbGVtZW50QnlJZCgiY29udGFpbmVyIik7CiAgICAgIGNvbnN0IG1vbmFjb0NkbkJhc2UgPSBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9tb25hY28tZWRpdG9yQCR7TU9OQUNPX1ZFUlNJT059YDsKICAgICAgaWYgKCFEZWVzV29ya3NwYWNlTW9uYWNvMi5tb25hY29EZWZlcnJlZCkgewogICAgICAgIERlZXNXb3Jrc3BhY2VNb25hY28yLm1vbmFjb0RlZmVycmVkID0gZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzLnNtYXJ0cHJvbWlzZS5kZWZlcigpOwogICAgICAgIGNvbnN0IHNjcmlwdFVybCA9IGAke21vbmFjb0NkbkJhc2V9L21pbi92cy9sb2FkZXIuanNgOwogICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwogICAgICAgIHNjcmlwdC5zcmMgPSBzY3JpcHRVcmw7CiAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHsKICAgICAgICAgIERlZXNXb3Jrc3BhY2VNb25hY28yLm1vbmFjb0RlZmVycmVkLnJlc29sdmUoKTsKICAgICAgICB9OwogICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTsKICAgICAgfQogICAgICBhd2FpdCBEZWVzV29ya3NwYWNlTW9uYWNvMi5tb25hY29EZWZlcnJlZC5wcm9taXNlOwogICAgICB3aW5kb3cucmVxdWlyZS5jb25maWcoewogICAgICAgIHBhdGhzOiB7IHZzOiBgJHttb25hY29DZG5CYXNlfS9taW4vdnNgIH0KICAgICAgfSk7CiAgICAgIHdpbmRvdy5yZXF1aXJlKFsidnMvZWRpdG9yL2VkaXRvci5tYWluIl0sIGFzeW5jICgpID0+IHsKICAgICAgICBjb25zdCBkb210b29sc0luc3RhbmNlID0gYXdhaXQgdGhpcy5kb210b29sc1Byb21pc2U7CiAgICAgICAgY29uc3QgaXNCcmlnaHQgPSBkb210b29sc0luc3RhbmNlLnRoZW1lTWFuYWdlci5nb0JyaWdodEJvb2xlYW47CiAgICAgICAgY29uc3QgaW5pdGlhbFRoZW1lID0gaXNCcmlnaHQgPyAidnMiIDogInZzLWRhcmsiOwogICAgICAgIGNvbnN0IG1vbmFjb0luc3RhbmNlID0gd2luZG93Lm1vbmFjbzsKICAgICAgICBsZXQgbW9kZWwgPSBudWxsOwogICAgICAgIGlmICh0aGlzLmZpbGVQYXRoKSB7CiAgICAgICAgICBjb25zdCB1cmkgPSBtb25hY29JbnN0YW5jZS5VcmkucGFyc2UoYGZpbGU6Ly8ke3RoaXMuZmlsZVBhdGh9YCk7CiAgICAgICAgICBtb2RlbCA9IG1vbmFjb0luc3RhbmNlLmVkaXRvci5nZXRNb2RlbCh1cmkpOwogICAgICAgICAgaWYgKCFtb2RlbCkgewogICAgICAgICAgICBtb2RlbCA9IG1vbmFjb0luc3RhbmNlLmVkaXRvci5jcmVhdGVNb2RlbCh0aGlzLmNvbnRlbnQsIHRoaXMubGFuZ3VhZ2UsIHVyaSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtb2RlbC5zZXRWYWx1ZSh0aGlzLmNvbnRlbnQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBlZGl0b3IyID0gbW9uYWNvSW5zdGFuY2UuZWRpdG9yLmNyZWF0ZShjb250YWluZXIsIHsKICAgICAgICAgIG1vZGVsOiBtb2RlbCB8fCB2b2lkIDAsCiAgICAgICAgICB2YWx1ZTogbW9kZWwgPyB2b2lkIDAgOiB0aGlzLmNvbnRlbnQsCiAgICAgICAgICBsYW5ndWFnZTogbW9kZWwgPyB2b2lkIDAgOiB0aGlzLmxhbmd1YWdlLAogICAgICAgICAgdGhlbWU6IGluaXRpYWxUaGVtZSwKICAgICAgICAgIHVzZVNoYWRvd0RPTTogdHJ1ZSwKICAgICAgICAgIGZvbnRTaXplOiAxNiwKICAgICAgICAgIGF1dG9tYXRpY0xheW91dDogdHJ1ZSwKICAgICAgICAgIHdvcmRXcmFwOiB0aGlzLndvcmRXcmFwLAogICAgICAgICAgaG92ZXI6IHsKICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgZGVsYXk6IDMwMCwKICAgICAgICAgICAgc3RpY2t5OiB0cnVlLAogICAgICAgICAgICBhYm92ZTogZmFsc2UKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICB0aGlzLm1vbmFjb1RoZW1lU3Vic2NyaXB0aW9uID0gZG9tdG9vbHNJbnN0YW5jZS50aGVtZU1hbmFnZXIudGhlbWVPYnNlcnZhYmxlLnN1YnNjcmliZSgoZ29CcmlnaHQpID0+IHsKICAgICAgICAgIGNvbnN0IG5ld1RoZW1lID0gZ29CcmlnaHQgPyAidnMiIDogInZzLWRhcmsiOwogICAgICAgICAgZWRpdG9yMi51cGRhdGVPcHRpb25zKHsgdGhlbWU6IG5ld1RoZW1lIH0pOwogICAgICAgIH0pOwogICAgICAgIHRoaXMuZWRpdG9yRGVmZXJyZWQucmVzb2x2ZShlZGl0b3IyKTsKICAgICAgfSk7CiAgICAgIGNvbnN0IGNzczExID0gYXdhaXQgKGF3YWl0IGZldGNoKGAke21vbmFjb0NkbkJhc2V9L21pbi92cy9lZGl0b3IvZWRpdG9yLm1haW4uY3NzYCkpLnRleHQoKTsKICAgICAgY29uc3Qgc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgICAgc3R5bGVFbGVtZW50LnRleHRDb250ZW50ID0gY3NzMTE7CiAgICAgIHRoaXMuc2hhZG93Um9vdC5hcHBlbmQoc3R5bGVFbGVtZW50KTsKICAgICAgY29uc3QgZWRpdG9yID0gYXdhaXQgdGhpcy5lZGl0b3JEZWZlcnJlZC5wcm9taXNlOwogICAgICBlZGl0b3Iub25EaWRDaGFuZ2VNb2RlbENvbnRlbnQoYXN5bmMgKGV2ZW50QXJnKSA9PiB7CiAgICAgICAgaWYgKHRoaXMuaXNVcGRhdGluZ0Zyb21FeHRlcm5hbCkKICAgICAgICAgIHJldHVybjsKICAgICAgICBjb25zdCB2YWx1ZTIgPSBlZGl0b3IuZ2V0VmFsdWUoKTsKICAgICAgICB0aGlzLmNvbnRlbnRTdWJqZWN0Lm5leHQodmFsdWUyKTsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjb250ZW50LWNoYW5nZSIsIHsKICAgICAgICAgIGRldGFpbDogdmFsdWUyLAogICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgfSkpOwogICAgICB9KTsKICAgICAgdGhpcy5jb250ZW50U3ViamVjdC5uZXh0KGVkaXRvci5nZXRWYWx1ZSgpKTsKICAgIH0KICAgIGFzeW5jIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGNvbnN0IG1vbmFjb0luc3RhbmNlID0gd2luZG93Lm1vbmFjbzsKICAgICAgaWYgKCFtb25hY29JbnN0YW5jZSkKICAgICAgICByZXR1cm47CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoImZpbGVQYXRoIikgJiYgdGhpcy5maWxlUGF0aCkgewogICAgICAgIGNvbnN0IGVkaXRvciA9IGF3YWl0IHRoaXMuZWRpdG9yRGVmZXJyZWQucHJvbWlzZTsKICAgICAgICBjb25zdCB1cmkgPSBtb25hY29JbnN0YW5jZS5VcmkucGFyc2UoYGZpbGU6Ly8ke3RoaXMuZmlsZVBhdGh9YCk7CiAgICAgICAgbGV0IG1vZGVsID0gbW9uYWNvSW5zdGFuY2UuZWRpdG9yLmdldE1vZGVsKHVyaSk7CiAgICAgICAgaWYgKCFtb2RlbCkgewogICAgICAgICAgbW9kZWwgPSBtb25hY29JbnN0YW5jZS5lZGl0b3IuY3JlYXRlTW9kZWwodGhpcy5jb250ZW50LCB0aGlzLmxhbmd1YWdlLCB1cmkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAobW9kZWwuZ2V0VmFsdWUoKSAhPT0gdGhpcy5jb250ZW50KSB7CiAgICAgICAgICAgIHRoaXMuaXNVcGRhdGluZ0Zyb21FeHRlcm5hbCA9IHRydWU7CiAgICAgICAgICAgIG1vZGVsLnNldFZhbHVlKHRoaXMuY29udGVudCk7CiAgICAgICAgICAgIHRoaXMuaXNVcGRhdGluZ0Zyb21FeHRlcm5hbCA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBjdXJyZW50TW9kZWwgPSBlZGl0b3IuZ2V0TW9kZWwoKTsKICAgICAgICBpZiAoY3VycmVudE1vZGVsPy51cmkudG9TdHJpbmcoKSAhPT0gdXJpLnRvU3RyaW5nKCkpIHsKICAgICAgICAgIGVkaXRvci5zZXRNb2RlbChtb2RlbCk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJjb250ZW50IikpIHsKICAgICAgICBjb25zdCBlZGl0b3IgPSBhd2FpdCB0aGlzLmVkaXRvckRlZmVycmVkLnByb21pc2U7CiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gZWRpdG9yLmdldFZhbHVlKCk7CiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gdGhpcy5jb250ZW50KSB7CiAgICAgICAgICB0aGlzLmlzVXBkYXRpbmdGcm9tRXh0ZXJuYWwgPSB0cnVlOwogICAgICAgICAgZWRpdG9yLnNldFZhbHVlKHRoaXMuY29udGVudCk7CiAgICAgICAgICB0aGlzLmlzVXBkYXRpbmdGcm9tRXh0ZXJuYWwgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygibGFuZ3VhZ2UiKSkgewogICAgICAgIGNvbnN0IGVkaXRvciA9IGF3YWl0IHRoaXMuZWRpdG9yRGVmZXJyZWQucHJvbWlzZTsKICAgICAgICBjb25zdCBtb2RlbCA9IGVkaXRvci5nZXRNb2RlbCgpOwogICAgICAgIGlmIChtb2RlbCkgewogICAgICAgICAgbW9uYWNvSW5zdGFuY2UuZWRpdG9yLnNldE1vZGVsTGFuZ3VhZ2UobW9kZWwsIHRoaXMubGFuZ3VhZ2UpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGlmICh0aGlzLm1vbmFjb1RoZW1lU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgdGhpcy5tb25hY29UaGVtZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgIHRoaXMubW9uYWNvVGhlbWVTdWJzY3JpcHRpb24gPSBudWxsOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZSBjb250ZW50IGZyb20gZXh0ZXJuYWwgc291cmNlIHdpdGggb3B0aW9uYWwgY3Vyc29yIHByZXNlcnZhdGlvbi4KICAgICAqIFVzZSB0aGlzIHdoZW4gdGhlIGZpbGUgY29udGVudCBjaGFuZ2VzIGV4dGVybmFsbHkgKGUuZy4sIGZpbGUgY2hhbmdlZCBvbiBkaXNrKS4KICAgICAqIEBwYXJhbSBuZXdDb250ZW50IFRoZSBuZXcgY29udGVudCB0byBzZXQKICAgICAqIEBwYXJhbSBwcmVzZXJ2ZUN1cnNvciBXaGV0aGVyIHRvIHByZXNlcnZlIGN1cnNvci9zY3JvbGwgcG9zaXRpb24gKGRlZmF1bHQ6IHRydWUpCiAgICAgKi8KICAgIGFzeW5jIHNldENvbnRlbnRFeHRlcm5hbChuZXdDb250ZW50LCBwcmVzZXJ2ZUN1cnNvciA9IHRydWUpIHsKICAgICAgY29uc3QgZWRpdG9yID0gYXdhaXQgdGhpcy5lZGl0b3JEZWZlcnJlZC5wcm9taXNlOwogICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBlZGl0b3IuZ2V0VmFsdWUoKTsKICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PT0gbmV3Q29udGVudCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHBvc2l0aW9uMyA9IHByZXNlcnZlQ3Vyc29yID8gZWRpdG9yLmdldFBvc2l0aW9uKCkgOiBudWxsOwogICAgICBjb25zdCBzZWxlY3Rpb25zID0gcHJlc2VydmVDdXJzb3IgPyBlZGl0b3IuZ2V0U2VsZWN0aW9ucygpIDogbnVsbDsKICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gcHJlc2VydmVDdXJzb3IgPyBlZGl0b3IuZ2V0U2Nyb2xsVG9wKCkgOiAwOwogICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gcHJlc2VydmVDdXJzb3IgPyBlZGl0b3IuZ2V0U2Nyb2xsTGVmdCgpIDogMDsKICAgICAgdGhpcy5pc1VwZGF0aW5nRnJvbUV4dGVybmFsID0gdHJ1ZTsKICAgICAgZWRpdG9yLnNldFZhbHVlKG5ld0NvbnRlbnQpOwogICAgICB0aGlzLmlzVXBkYXRpbmdGcm9tRXh0ZXJuYWwgPSBmYWxzZTsKICAgICAgaWYgKHByZXNlcnZlQ3Vyc29yKSB7CiAgICAgICAgaWYgKHBvc2l0aW9uMykgewogICAgICAgICAgY29uc3QgbW9kZWwgPSBlZGl0b3IuZ2V0TW9kZWwoKTsKICAgICAgICAgIGNvbnN0IGxpbmVDb3VudCA9IG1vZGVsPy5nZXRMaW5lQ291bnQoKSB8fCAxOwogICAgICAgICAgY29uc3QgY2xhbXBlZExpbmUgPSBNYXRoLm1pbihwb3NpdGlvbjMubGluZU51bWJlciwgbGluZUNvdW50KTsKICAgICAgICAgIGNvbnN0IGxpbmVMZW5ndGggPSBtb2RlbD8uZ2V0TGluZU1heENvbHVtbihjbGFtcGVkTGluZSkgfHwgMTsKICAgICAgICAgIGNvbnN0IGNsYW1wZWRDb2x1bW4gPSBNYXRoLm1pbihwb3NpdGlvbjMuY29sdW1uLCBsaW5lTGVuZ3RoKTsKICAgICAgICAgIGVkaXRvci5zZXRQb3NpdGlvbih7IGxpbmVOdW1iZXI6IGNsYW1wZWRMaW5lLCBjb2x1bW46IGNsYW1wZWRDb2x1bW4gfSk7CiAgICAgICAgfQogICAgICAgIGlmIChzZWxlY3Rpb25zICYmIHNlbGVjdGlvbnMubGVuZ3RoID4gMCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZWRpdG9yLnNldFNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7CiAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWRpdG9yLnNldFNjcm9sbFBvc2l0aW9uKHsgc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0IH0pOwogICAgICB9CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczE4KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzV29ya3NwYWNlTW9uYWNvMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1jb2RlL2RlZXMtaW5wdXQtY29kZS5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X3RoZW1lKCk7CmluaXRfZGVlc19pY29uKCk7CnZhciBfX2VzRGVjb3JhdGUxOCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMTkgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIExBTkdVQUdFUyA9IFsKICB7IGtleTogInR5cGVzY3JpcHQiLCBsYWJlbDogIlR5cGVTY3JpcHQiIH0sCiAgeyBrZXk6ICJqYXZhc2NyaXB0IiwgbGFiZWw6ICJKYXZhU2NyaXB0IiB9LAogIHsga2V5OiAianNvbiIsIGxhYmVsOiAiSlNPTiIgfSwKICB7IGtleTogImh0bWwiLCBsYWJlbDogIkhUTUwiIH0sCiAgeyBrZXk6ICJjc3MiLCBsYWJlbDogIkNTUyIgfSwKICB7IGtleTogInNjc3MiLCBsYWJlbDogIlNDU1MiIH0sCiAgeyBrZXk6ICJtYXJrZG93biIsIGxhYmVsOiAiTWFya2Rvd24iIH0sCiAgeyBrZXk6ICJ5YW1sIiwgbGFiZWw6ICJZQU1MIiB9LAogIHsga2V5OiAieG1sIiwgbGFiZWw6ICJYTUwiIH0sCiAgeyBrZXk6ICJzcWwiLCBsYWJlbDogIlNRTCIgfSwKICB7IGtleTogInB5dGhvbiIsIGxhYmVsOiAiUHl0aG9uIiB9LAogIHsga2V5OiAiamF2YSIsIGxhYmVsOiAiSmF2YSIgfSwKICB7IGtleTogImNzaGFycCIsIGxhYmVsOiAiQyMiIH0sCiAgeyBrZXk6ICJjcHAiLCBsYWJlbDogIkMrKyIgfSwKICB7IGtleTogImdvIiwgbGFiZWw6ICJHbyIgfSwKICB7IGtleTogInJ1c3QiLCBsYWJlbDogIlJ1c3QiIH0sCiAgeyBrZXk6ICJzaGVsbCIsIGxhYmVsOiAiU2hlbGwiIH0sCiAgeyBrZXk6ICJwbGFpbnRleHQiLCBsYWJlbDogIlBsYWluIFRleHQiIH0KXTsKdmFyIERlZXNJbnB1dENvZGUgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtaW5wdXQtY29kZSIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzSW5wdXRCYXNlOwogIGxldCBfdmFsdWVfZGVjb3JhdG9yczsKICBsZXQgX3ZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xhbmd1YWdlX2RlY29yYXRvcnM7CiAgbGV0IF9sYW5ndWFnZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xhbmd1YWdlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oZWlnaHRfZGVjb3JhdG9yczsKICBsZXQgX2hlaWdodF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2hlaWdodF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfd29yZFdyYXBfZGVjb3JhdG9yczsKICBsZXQgX3dvcmRXcmFwX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfd29yZFdyYXBfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dMaW5lTnVtYmVyc19kZWNvcmF0b3JzOwogIGxldCBfc2hvd0xpbmVOdW1iZXJzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0xpbmVOdW1iZXJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0xhbmd1YWdlRHJvcGRvd25PcGVuX2RlY29yYXRvcnM7CiAgbGV0IF9pc0xhbmd1YWdlRHJvcGRvd25PcGVuX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNMYW5ndWFnZURyb3Bkb3duT3Blbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29weVN1Y2Nlc3NfZGVjb3JhdG9yczsKICBsZXQgX2NvcHlTdWNjZXNzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29weVN1Y2Nlc3NfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0lucHV0Q29kZTIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF92YWx1ZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2xhbmd1YWdlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfaGVpZ2h0X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfd29yZFdyYXBfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9zaG93TGluZU51bWJlcnNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfaXNMYW5ndWFnZURyb3Bkb3duT3Blbl9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfY29weVN1Y2Nlc3NfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlMTgodGhpcywgbnVsbCwgX3ZhbHVlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZhbHVlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ2YWx1ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai52YWx1ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudmFsdWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxOCh0aGlzLCBudWxsLCBfbGFuZ3VhZ2VfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibGFuZ3VhZ2UiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImxhbmd1YWdlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmxhbmd1YWdlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5sYW5ndWFnZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9sYW5ndWFnZV9pbml0aWFsaXplcnMsIF9sYW5ndWFnZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE4KHRoaXMsIG51bGwsIF9oZWlnaHRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaGVpZ2h0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJoZWlnaHQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaGVpZ2h0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5oZWlnaHQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaGVpZ2h0X2luaXRpYWxpemVycywgX2hlaWdodF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE4KHRoaXMsIG51bGwsIF93b3JkV3JhcF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ3b3JkV3JhcCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAid29yZFdyYXAiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoud29yZFdyYXAsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLndvcmRXcmFwID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3dvcmRXcmFwX2luaXRpYWxpemVycywgX3dvcmRXcmFwX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTgodGhpcywgbnVsbCwgX3Nob3dMaW5lTnVtYmVyc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93TGluZU51bWJlcnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNob3dMaW5lTnVtYmVycyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93TGluZU51bWJlcnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dMaW5lTnVtYmVycyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93TGluZU51bWJlcnNfaW5pdGlhbGl6ZXJzLCBfc2hvd0xpbmVOdW1iZXJzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTgodGhpcywgbnVsbCwgX2lzTGFuZ3VhZ2VEcm9wZG93bk9wZW5fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNMYW5ndWFnZURyb3Bkb3duT3BlbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNMYW5ndWFnZURyb3Bkb3duT3BlbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc0xhbmd1YWdlRHJvcGRvd25PcGVuLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc0xhbmd1YWdlRHJvcGRvd25PcGVuID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzTGFuZ3VhZ2VEcm9wZG93bk9wZW5faW5pdGlhbGl6ZXJzLCBfaXNMYW5ndWFnZURyb3Bkb3duT3Blbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE4KHRoaXMsIG51bGwsIF9jb3B5U3VjY2Vzc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb3B5U3VjY2VzcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29weVN1Y2Nlc3MiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29weVN1Y2Nlc3MsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvcHlTdWNjZXNzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvcHlTdWNjZXNzX2luaXRpYWxpemVycywgX2NvcHlTdWNjZXNzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTgobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzSW5wdXRDb2RlMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9ICgpID0+IGIyYAogICAgPGRlZXMtaW5wdXQtY29kZQogICAgICBsYWJlbD0iVHlwZVNjcmlwdCBDb2RlIgogICAgICBrZXk9ImNvZGUiCiAgICAgIGxhbmd1YWdlPSJ0eXBlc2NyaXB0IgogICAgICBoZWlnaHQ9IjMwMHB4IgogICAgICAudmFsdWU9JHsnY29uc3QgZ3JlZXRpbmc6IHN0cmluZyA9ICJIZWxsbyBXb3JsZCI7XG5jb25zb2xlLmxvZyhncmVldGluZyk7J30KICAgID48L2RlZXMtaW5wdXQtY29kZT4KICBgOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIklucHV0IiwgIldvcmtzcGFjZSJdOwogICAgI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczE5KHRoaXMsIF92YWx1ZV9pbml0aWFsaXplcnMsICIiKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgdmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2xhbmd1YWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxOSh0aGlzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczE5KHRoaXMsIF9sYW5ndWFnZV9pbml0aWFsaXplcnMsICJ0eXBlc2NyaXB0IikpOwogICAgZ2V0IGxhbmd1YWdlKCkgewogICAgICByZXR1cm4gdGhpcy4jbGFuZ3VhZ2VfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsYW5ndWFnZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbGFuZ3VhZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNoZWlnaHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE5KHRoaXMsIF9sYW5ndWFnZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTkodGhpcywgX2hlaWdodF9pbml0aWFsaXplcnMsICIyMDBweCIpKTsKICAgIGdldCBoZWlnaHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNoZWlnaHRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBoZWlnaHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2hlaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3dvcmRXcmFwX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMxOSh0aGlzLCBfaGVpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxOSh0aGlzLCBfd29yZFdyYXBfaW5pdGlhbGl6ZXJzLCAib2ZmIikpOwogICAgZ2V0IHdvcmRXcmFwKCkgewogICAgICByZXR1cm4gdGhpcy4jd29yZFdyYXBfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB3b3JkV3JhcCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jd29yZFdyYXBfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93TGluZU51bWJlcnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE5KHRoaXMsIF93b3JkV3JhcF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTkodGhpcywgX3Nob3dMaW5lTnVtYmVyc19pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93TGluZU51bWJlcnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93TGluZU51bWJlcnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93TGluZU51bWJlcnModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dMaW5lTnVtYmVyc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzTGFuZ3VhZ2VEcm9wZG93bk9wZW5fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczE5KHRoaXMsIF9zaG93TGluZU51bWJlcnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczE5KHRoaXMsIF9pc0xhbmd1YWdlRHJvcGRvd25PcGVuX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc0xhbmd1YWdlRHJvcGRvd25PcGVuKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNMYW5ndWFnZURyb3Bkb3duT3Blbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzTGFuZ3VhZ2VEcm9wZG93bk9wZW4odmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzTGFuZ3VhZ2VEcm9wZG93bk9wZW5fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjb3B5U3VjY2Vzc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTkodGhpcywgX2lzTGFuZ3VhZ2VEcm9wZG93bk9wZW5fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczE5KHRoaXMsIF9jb3B5U3VjY2Vzc19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgY29weVN1Y2Nlc3MoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb3B5U3VjY2Vzc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNvcHlTdWNjZXNzKHZhbHVlMikgewogICAgICB0aGlzLiNjb3B5U3VjY2Vzc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgZWRpdG9yRWxlbWVudCA9IChfX3J1bkluaXRpYWxpemVyczE5KHRoaXMsIF9jb3B5U3VjY2Vzc19leHRyYUluaXRpYWxpemVycyksIG51bGwpOwogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICAuLi5EZWVzSW5wdXRCYXNlLmJhc2VTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgKiB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQoKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICB9CgogICAgICAuaW5wdXQtd3JhcHBlciwKICAgICAgOmhvc3QoW2xhYmVsLXBvc2l0aW9uPSJ0b3AiXSkgLmlucHV0LXdyYXBwZXIsCiAgICAgIDpob3N0KFtsYWJlbC1wb3NpdGlvbj0ibGVmdCJdKSAuaW5wdXQtd3JhcHBlciwKICAgICAgOmhvc3QoW2xhYmVsLXBvc2l0aW9uPSJyaWdodCJdKSAuaW5wdXQtd3JhcHBlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLWhlaWdodDogMDsKICAgICAgfQoKICAgICAgLmNvZGUtY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleDogMTsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSA5JSkiKX07CiAgICAgIH0KCiAgICAgIC50b29sYmFyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NyUpIiwgImhzbCgwIDAlIDclKSIpfTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLWxlZnQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItcmlnaHQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDRweDsKICAgICAgfQoKICAgICAgLmxhbmd1YWdlLXNlbGVjdG9yIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5sYW5ndWFnZS1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDZweDsKICAgICAgICBwYWRkaW5nOiA0cHggMTBweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgMTIlKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDIwJSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDIwJSkiLCAiaHNsKDAgMCUgOTAlKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLmxhbmd1YWdlLWJ1dHRvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk1JSkiLCAiaHNsKDAgMCUgMTUlKSIpfTsKICAgICAgfQoKICAgICAgLmxhbmd1YWdlLWRyb3Bkb3duIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxMDAlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSA5JSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAyMCUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7CiAgICAgICAgei1pbmRleDogMTAwOwogICAgICAgIG1heC1oZWlnaHQ6IDI1MHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWluLXdpZHRoOiAxNDBweDsKICAgICAgfQoKICAgICAgLmxhbmd1YWdlLW9wdGlvbiB7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDIwJSkiLCAiaHNsKDAgMCUgOTAlKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5sYW5ndWFnZS1vcHRpb246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NSUpIiwgImhzbCgwIDAlIDE1JSkiKX07CiAgICAgIH0KCiAgICAgIC5sYW5ndWFnZS1vcHRpb24uc2VsZWN0ZWQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5MCUpIiwgImhzbCgwIDAlIDIwJSkiKX07CiAgICAgIH0KCiAgICAgIC50b29sYmFyLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQ1JSkiLCAiaHNsKDAgMCUgNjAlKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTAlKSIsICJoc2woMCAwJSAxNSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMjAlKSIsICJoc2woMCAwJSA5MCUpIil9OwogICAgICB9CgogICAgICAudG9vbGJhci1idXR0b24uYWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODUlKSIsICJoc2woMCAwJSAyMCUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMjAlKSIsICJoc2woMCAwJSA5MCUpIil9OwogICAgICB9CgogICAgICAudG9vbGJhci1idXR0b24uc3VjY2VzcyB7CiAgICAgICAgY29sb3I6IGhzbCgxNDIuMSA3Ni4yJSAzNi4zJSk7CiAgICAgIH0KCiAgICAgIC5lZGl0b3Itd3JhcHBlciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLWhlaWdodDogMDsKICAgICAgfQoKICAgICAgZGVlcy13b3Jrc3BhY2UtbW9uYWNvIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLWRpdmlkZXIgewogICAgICAgIHdpZHRoOiAxcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4NSUpIiwgImhzbCgwIDAlIDIwJSkiKX07CiAgICAgICAgbWFyZ2luOiAwIDRweDsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgLmNvZGUtY29udGFpbmVyIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZSA9IExBTkdVQUdFUy5maW5kKChsNikgPT4gbDYua2V5ID09PSB0aGlzLmxhbmd1YWdlKSB8fCBMQU5HVUFHRVNbMF07CiAgICAgIHJldHVybiBiMmAKICAgICAgPHN0eWxlPgogICAgICAgIDpob3N0IHsKICAgICAgICAgIGhlaWdodDogJHt0aGlzLmhlaWdodH07CiAgICAgICAgfQogICAgICA8L3N0eWxlPgogICAgICA8ZGl2IGNsYXNzPSJpbnB1dC13cmFwcGVyIj4KICAgICAgICA8ZGVlcy1sYWJlbCAubGFiZWw9JHt0aGlzLmxhYmVsfSAuZGVzY3JpcHRpb249JHt0aGlzLmRlc2NyaXB0aW9ufSAucmVxdWlyZWQ9JHt0aGlzLnJlcXVpcmVkfT48L2RlZXMtbGFiZWw+CiAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1jb250YWluZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0idG9vbGJhciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItbGVmdCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFuZ3VhZ2Utc2VsZWN0b3IiPgogICAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgICBjbGFzcz0ibGFuZ3VhZ2UtYnV0dG9uIgogICAgICAgICAgICAgICAgICBAY2xpY2s9JHt0aGlzLnRvZ2dsZUxhbmd1YWdlRHJvcGRvd259CiAgICAgICAgICAgICAgICAgIEBibHVyPSR7dGhpcy5oYW5kbGVMYW5ndWFnZUJsdXJ9CiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICR7Y3VycmVudExhbmd1YWdlLmxhYmVsfQogICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTpDaGV2cm9uRG93biJ9IGljb25TaXplPSIxNCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICR7dGhpcy5pc0xhbmd1YWdlRHJvcGRvd25PcGVuID8gYjJgCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imxhbmd1YWdlLWRyb3Bkb3duIj4KICAgICAgICAgICAgICAgICAgICAke0xBTkdVQUdFUy5tYXAoKGxhbmcpID0+IGIyYAogICAgICAgICAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ibGFuZ3VhZ2Utb3B0aW9uICR7bGFuZy5rZXkgPT09IHRoaXMubGFuZ3VhZ2UgPyAic2VsZWN0ZWQiIDogIiJ9IgogICAgICAgICAgICAgICAgICAgICAgICBAbW91c2Vkb3duPSR7KGUxMSkgPT4gdGhpcy5zZWxlY3RMYW5ndWFnZShlMTEsIGxhbmcua2V5KX0KICAgICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICAgJHtsYW5nLmxhYmVsfQogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgYCl9CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgYCA6ICIifQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9vbGJhci1yaWdodCI+CiAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgY2xhc3M9InRvb2xiYXItYnV0dG9uICR7dGhpcy53b3JkV3JhcCA9PT0gIm9uIiA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICAgICAgdGl0bGU9IldvcmQgV3JhcCIKICAgICAgICAgICAgICAgIEBjbGljaz0ke3RoaXMudG9nZ2xlV29yZFdyYXB9CiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6V3JhcFRleHQifSBpY29uU2l6ZT0iMTYiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgIGNsYXNzPSJ0b29sYmFyLWJ1dHRvbiAke3RoaXMuc2hvd0xpbmVOdW1iZXJzID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICAgICAgICB0aXRsZT0iTGluZSBOdW1iZXJzIgogICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy50b2dnbGVMaW5lTnVtYmVyc30KICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTpIYXNoIn0gaWNvblNpemU9IjE2Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sYmFyLWRpdmlkZXIiPjwvZGl2PgogICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgIGNsYXNzPSJ0b29sYmFyLWJ1dHRvbiAke3RoaXMuY29weVN1Y2Nlc3MgPyAic3VjY2VzcyIgOiAiIn0iCiAgICAgICAgICAgICAgICB0aXRsZT0iQ29weSBDb2RlIgogICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy5jb3B5Q29kZX0KICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7dGhpcy5jb3B5U3VjY2VzcyA/ICJsdWNpZGU6Q2hlY2siIDogImx1Y2lkZTpDb3B5In0gaWNvblNpemU9IjE2Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICBjbGFzcz0idG9vbGJhci1idXR0b24iCiAgICAgICAgICAgICAgICB0aXRsZT0iRXhwYW5kIgogICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy5vcGVuRnVsbHNjcmVlbn0KICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTpNYXhpbWl6ZTIifSBpY29uU2l6ZT0iMTYiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZWRpdG9yLXdyYXBwZXIiPgogICAgICAgICAgICA8ZGVlcy13b3Jrc3BhY2UtbW9uYWNvCiAgICAgICAgICAgICAgLmNvbnRlbnQ9JHt0aGlzLnZhbHVlfQogICAgICAgICAgICAgIC5sYW5ndWFnZT0ke3RoaXMubGFuZ3VhZ2V9CiAgICAgICAgICAgICAgLndvcmRXcmFwPSR7dGhpcy53b3JkV3JhcH0KICAgICAgICAgICAgICBAY29udGVudC1jaGFuZ2U9JHt0aGlzLmhhbmRsZUNvbnRlbnRDaGFuZ2V9CiAgICAgICAgICAgID48L2RlZXMtd29ya3NwYWNlLW1vbmFjbz4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIHRoaXMuZWRpdG9yRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiZGVlcy13b3Jrc3BhY2UtbW9uYWNvIik7CiAgICAgIGlmICh0aGlzLmVkaXRvckVsZW1lbnQpIHsKICAgICAgICB0aGlzLmVkaXRvckVsZW1lbnQuY29udGVudFN1YmplY3Quc3Vic2NyaWJlKChuZXdDb250ZW50KSA9PiB7CiAgICAgICAgICBpZiAodGhpcy52YWx1ZSAhPT0gbmV3Q29udGVudCkgewogICAgICAgICAgICB0aGlzLnZhbHVlID0gbmV3Q29udGVudDsKICAgICAgICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIHRvZ2dsZUxhbmd1YWdlRHJvcGRvd24oKSB7CiAgICAgIHRoaXMuaXNMYW5ndWFnZURyb3Bkb3duT3BlbiA9ICF0aGlzLmlzTGFuZ3VhZ2VEcm9wZG93bk9wZW47CiAgICB9CiAgICBoYW5kbGVMYW5ndWFnZUJsdXIoKSB7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIHRoaXMuaXNMYW5ndWFnZURyb3Bkb3duT3BlbiA9IGZhbHNlOwogICAgICB9LCAxNTApOwogICAgfQogICAgYXN5bmMgc2VsZWN0TGFuZ3VhZ2UoZTExLCBsYW5ndWFnZUtleSkgewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlS2V5OwogICAgICB0aGlzLmlzTGFuZ3VhZ2VEcm9wZG93bk9wZW4gPSBmYWxzZTsKICAgICAgaWYgKHRoaXMuZWRpdG9yRWxlbWVudCkgewogICAgICAgIHRoaXMuZWRpdG9yRWxlbWVudC5sYW5ndWFnZSA9IGxhbmd1YWdlS2V5OwogICAgICAgIGNvbnN0IGVkaXRvciA9IGF3YWl0IHRoaXMuZWRpdG9yRWxlbWVudC5lZGl0b3JEZWZlcnJlZC5wcm9taXNlOwogICAgICAgIGNvbnN0IG1vZGVsID0gZWRpdG9yLmdldE1vZGVsKCk7CiAgICAgICAgaWYgKG1vZGVsKSB7CiAgICAgICAgICB3aW5kb3cubW9uYWNvLmVkaXRvci5zZXRNb2RlbExhbmd1YWdlKG1vZGVsLCBsYW5ndWFnZUtleSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0b2dnbGVXb3JkV3JhcCgpIHsKICAgICAgdGhpcy53b3JkV3JhcCA9IHRoaXMud29yZFdyYXAgPT09ICJvbiIgPyAib2ZmIiA6ICJvbiI7CiAgICAgIHRoaXMudXBkYXRlRWRpdG9yT3B0aW9uKCJ3b3JkV3JhcCIsIHRoaXMud29yZFdyYXApOwogICAgfQogICAgdG9nZ2xlTGluZU51bWJlcnMoKSB7CiAgICAgIHRoaXMuc2hvd0xpbmVOdW1iZXJzID0gIXRoaXMuc2hvd0xpbmVOdW1iZXJzOwogICAgICB0aGlzLnVwZGF0ZUVkaXRvck9wdGlvbigibGluZU51bWJlcnMiLCB0aGlzLnNob3dMaW5lTnVtYmVycyA/ICJvbiIgOiAib2ZmIik7CiAgICB9CiAgICBhc3luYyB1cGRhdGVFZGl0b3JPcHRpb24ob3B0aW9uMiwgdmFsdWUyKSB7CiAgICAgIGlmICh0aGlzLmVkaXRvckVsZW1lbnQpIHsKICAgICAgICBjb25zdCBlZGl0b3IgPSBhd2FpdCB0aGlzLmVkaXRvckVsZW1lbnQuZWRpdG9yRGVmZXJyZWQucHJvbWlzZTsKICAgICAgICBlZGl0b3IudXBkYXRlT3B0aW9ucyh7IFtvcHRpb24yXTogdmFsdWUyIH0pOwogICAgICB9CiAgICB9CiAgICBhc3luYyBjb3B5Q29kZSgpIHsKICAgICAgdHJ5IHsKICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0aGlzLnZhbHVlKTsKICAgICAgICB0aGlzLmNvcHlTdWNjZXNzID0gdHJ1ZTsKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgIHRoaXMuY29weVN1Y2Nlc3MgPSBmYWxzZTsKICAgICAgICB9LCAyZTMpOwogICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gY29weSBjb2RlOiIsIGVycik7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZUNvbnRlbnRDaGFuZ2UoZTExKSB7CiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBlMTEuZGV0YWlsOwogICAgICBpZiAodGhpcy52YWx1ZSAhPT0gbmV3Q29udGVudCkgewogICAgICAgIHRoaXMudmFsdWUgPSBuZXdDb250ZW50OwogICAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBvcGVuRnVsbHNjcmVlbigpIHsKICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy52YWx1ZTsKICAgICAgbGV0IG1vZGFsRWRpdG9yRWxlbWVudCA9IG51bGw7CiAgICAgIGxldCBtb2RhbExhbmd1YWdlID0gdGhpcy5sYW5ndWFnZTsKICAgICAgbGV0IG1vZGFsV29yZFdyYXAgPSB0aGlzLndvcmRXcmFwOwogICAgICBsZXQgbW9kYWxTaG93TGluZU51bWJlcnMgPSB0aGlzLnNob3dMaW5lTnVtYmVyczsKICAgICAgbGV0IG1vZGFsTGFuZ3VhZ2VEcm9wZG93bk9wZW4gPSBmYWxzZTsKICAgICAgbGV0IG1vZGFsQ29weVN1Y2Nlc3MgPSBmYWxzZTsKICAgICAgY29uc3QgZ2V0TGFuZ3VhZ2VMYWJlbCA9ICgpID0+IHsKICAgICAgICBjb25zdCBsYW5nID0gTEFOR1VBR0VTLmZpbmQoKGw2KSA9PiBsNi5rZXkgPT09IG1vZGFsTGFuZ3VhZ2UpOwogICAgICAgIHJldHVybiBsYW5nID8gbGFuZy5sYWJlbCA6ICJUeXBlU2NyaXB0IjsKICAgICAgfTsKICAgICAgY29uc3QgdXBkYXRlVG9vbGJhclVJID0gKG1vZGFsMikgPT4gewogICAgICAgIGNvbnN0IHRvb2xiYXIyID0gbW9kYWwyLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5tb2RhbC10b29sYmFyIik7CiAgICAgICAgaWYgKCF0b29sYmFyMikKICAgICAgICAgIHJldHVybjsKICAgICAgICBjb25zdCBsYW5nQnRuID0gdG9vbGJhcjIucXVlcnlTZWxlY3RvcigiLmxhbmd1YWdlLWJ1dHRvbiBzcGFuIik7CiAgICAgICAgaWYgKGxhbmdCdG4pCiAgICAgICAgICBsYW5nQnRuLnRleHRDb250ZW50ID0gZ2V0TGFuZ3VhZ2VMYWJlbCgpOwogICAgICAgIGNvbnN0IHdyYXBCdG4gPSB0b29sYmFyMi5xdWVyeVNlbGVjdG9yKCIud3JhcC1idG4iKTsKICAgICAgICBpZiAod3JhcEJ0bikgewogICAgICAgICAgd3JhcEJ0bi5jbGFzc0xpc3QudG9nZ2xlKCJhY3RpdmUiLCBtb2RhbFdvcmRXcmFwID09PSAib24iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGluZXNCdG4gPSB0b29sYmFyMi5xdWVyeVNlbGVjdG9yKCIubGluZXMtYnRuIik7CiAgICAgICAgaWYgKGxpbmVzQnRuKSB7CiAgICAgICAgICBsaW5lc0J0bi5jbGFzc0xpc3QudG9nZ2xlKCJhY3RpdmUiLCBtb2RhbFNob3dMaW5lTnVtYmVycyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNvcHlCdG4gPSB0b29sYmFyMi5xdWVyeVNlbGVjdG9yKCIuY29weS1idG4iKTsKICAgICAgICBjb25zdCBjb3B5SWNvbiA9IGNvcHlCdG4/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtaWNvbiIpOwogICAgICAgIGlmIChjb3B5QnRuICYmIGNvcHlJY29uKSB7CiAgICAgICAgICBjb3B5QnRuLmNsYXNzTGlzdC50b2dnbGUoInN1Y2Nlc3MiLCBtb2RhbENvcHlTdWNjZXNzKTsKICAgICAgICAgIGNvcHlJY29uLmljb24gPSBtb2RhbENvcHlTdWNjZXNzID8gImx1Y2lkZTpDaGVjayIgOiAibHVjaWRlOkNvcHkiOwogICAgICAgIH0KICAgICAgICBjb25zdCBkcm9wZG93biA9IHRvb2xiYXIyLnF1ZXJ5U2VsZWN0b3IoIi5sYW5ndWFnZS1kcm9wZG93biIpOwogICAgICAgIGlmIChkcm9wZG93bikgewogICAgICAgICAgZHJvcGRvd24uc3R5bGUuZGlzcGxheSA9IG1vZGFsTGFuZ3VhZ2VEcm9wZG93bk9wZW4gPyAiYmxvY2siIDogIm5vbmUiOwogICAgICAgIH0KICAgICAgfTsKICAgICAgY29uc3QgbW9kYWwgPSBhd2FpdCBEZWVzTW9kYWwuY3JlYXRlQW5kU2hvdyh7CiAgICAgICAgaGVhZGluZzogdGhpcy5sYWJlbCB8fCAiQ29kZSBFZGl0b3IiLAogICAgICAgIHdpZHRoOiAiZnVsbHNjcmVlbiIsCiAgICAgICAgY29udGVudFBhZGRpbmc6IDAsCiAgICAgICAgY29udGVudDogYjJgCiAgICAgICAgPHN0eWxlPgogICAgICAgICAgLm1vZGFsLXRvb2xiYXIgewogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTclKSIsICJoc2woMCAwJSA3JSkiKX07CiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgICB9CiAgICAgICAgICAubW9kYWwtdG9vbGJhciAudG9vbGJhci1sZWZ0IHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgICB9CiAgICAgICAgICAubW9kYWwtdG9vbGJhciAudG9vbGJhci1yaWdodCB7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgIGdhcDogNHB4OwogICAgICAgICAgfQogICAgICAgICAgLm1vZGFsLXRvb2xiYXIgLmxhbmd1YWdlLXNlbGVjdG9yIHsKICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgfQogICAgICAgICAgLm1vZGFsLXRvb2xiYXIgLmxhbmd1YWdlLWJ1dHRvbiB7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgIGdhcDogNnB4OwogICAgICAgICAgICBwYWRkaW5nOiA0cHggMTBweDsKICAgICAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgMTIlKSIpfTsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAyMCUpIil9OwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAyMCUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgICAgfQogICAgICAgICAgLm1vZGFsLXRvb2xiYXIgLmxhbmd1YWdlLWJ1dHRvbjpob3ZlciB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NSUpIiwgImhzbCgwIDAlIDE1JSkiKX07CiAgICAgICAgICB9CiAgICAgICAgICAubW9kYWwtdG9vbGJhciAubGFuZ3VhZ2UtZHJvcGRvd24gewogICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgIHRvcDogMTAwJTsKICAgICAgICAgICAgbGVmdDogMDsKICAgICAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDIwJSkiKX07CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuMTUpOwogICAgICAgICAgICB6LWluZGV4OiAxMDA7CiAgICAgICAgICAgIG1heC1oZWlnaHQ6IDI1MHB4OwogICAgICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgICAgICBtaW4td2lkdGg6IDE0MHB4OwogICAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgICAgfQogICAgICAgICAgLm1vZGFsLXRvb2xiYXIgLmxhbmd1YWdlLW9wdGlvbiB7CiAgICAgICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAyMCUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMgZWFzZTsKICAgICAgICAgIH0KICAgICAgICAgIC5tb2RhbC10b29sYmFyIC5sYW5ndWFnZS1vcHRpb246aG92ZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUlKSIsICJoc2woMCAwJSAxNSUpIil9OwogICAgICAgICAgfQogICAgICAgICAgLm1vZGFsLXRvb2xiYXIgLmxhbmd1YWdlLW9wdGlvbi5zZWxlY3RlZCB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5MCUpIiwgImhzbCgwIDAlIDIwJSkiKX07CiAgICAgICAgICB9CiAgICAgICAgICAubW9kYWwtdG9vbGJhciAudG9vbGJhci1idXR0b24gewogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDUlKSIsICJoc2woMCAwJSA2MCUpIil9OwogICAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICAgIH0KICAgICAgICAgIC5tb2RhbC10b29sYmFyIC50b29sYmFyLWJ1dHRvbjpob3ZlciB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5MCUpIiwgImhzbCgwIDAlIDE1JSkiKX07CiAgICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMjAlKSIsICJoc2woMCAwJSA5MCUpIil9OwogICAgICAgICAgfQogICAgICAgICAgLm1vZGFsLXRvb2xiYXIgLnRvb2xiYXItYnV0dG9uLmFjdGl2ZSB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4NSUpIiwgImhzbCgwIDAlIDIwJSkiKX07CiAgICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMjAlKSIsICJoc2woMCAwJSA5MCUpIil9OwogICAgICAgICAgfQogICAgICAgICAgLm1vZGFsLXRvb2xiYXIgLnRvb2xiYXItYnV0dG9uLnN1Y2Nlc3MgewogICAgICAgICAgICBjb2xvcjogaHNsKDE0Mi4xIDc2LjIlIDM2LjMlKTsKICAgICAgICAgIH0KICAgICAgICAgIC5tb2RhbC10b29sYmFyIC50b29sYmFyLWRpdmlkZXIgewogICAgICAgICAgICB3aWR0aDogMXB4OwogICAgICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4NSUpIiwgImhzbCgwIDAlIDIwJSkiKX07CiAgICAgICAgICAgIG1hcmdpbjogMCA0cHg7CiAgICAgICAgICB9CiAgICAgICAgICAubW9kYWwtZWRpdG9yLXdyYXBwZXIgewogICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgIGhlaWdodDogY2FsYygxMDB2aCAtIDE3NXB4KTsKICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICB9CiAgICAgICAgPC9zdHlsZT4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC10b29sYmFyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItbGVmdCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Imxhbmd1YWdlLXNlbGVjdG9yIj4KICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJsYW5ndWFnZS1idXR0b24iPgogICAgICAgICAgICAgICAgPHNwYW4+JHtnZXRMYW5ndWFnZUxhYmVsKCl9PC9zcGFuPgogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6Q2hldnJvbkRvd24ifSBpY29uU2l6ZT0iMTQiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imxhbmd1YWdlLWRyb3Bkb3duIj4KICAgICAgICAgICAgICAgICR7TEFOR1VBR0VTLm1hcCgobGFuZykgPT4gYjJgCiAgICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgICBjbGFzcz0ibGFuZ3VhZ2Utb3B0aW9uICR7bGFuZy5rZXkgPT09IG1vZGFsTGFuZ3VhZ2UgPyAic2VsZWN0ZWQiIDogIiJ9IgogICAgICAgICAgICAgICAgICAgIGRhdGEtbGFuZz0iJHtsYW5nLmtleX0iCiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAke2xhbmcubGFiZWx9CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgYCl9CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sYmFyLXJpZ2h0Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idG9vbGJhci1idXR0b24gd3JhcC1idG4gJHttb2RhbFdvcmRXcmFwID09PSAib24iID8gImFjdGl2ZSIgOiAiIn0iIHRpdGxlPSJXb3JkIFdyYXAiPgogICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOldyYXBUZXh0In0gaWNvblNpemU9IjE2Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InRvb2xiYXItYnV0dG9uIGxpbmVzLWJ0biAke21vZGFsU2hvd0xpbmVOdW1iZXJzID8gImFjdGl2ZSIgOiAiIn0iIHRpdGxlPSJMaW5lIE51bWJlcnMiPgogICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOkhhc2gifSBpY29uU2l6ZT0iMTYiPjwvZGVlcy1pY29uPgogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9vbGJhci1kaXZpZGVyIj48L2Rpdj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idG9vbGJhci1idXR0b24gY29weS1idG4iIHRpdGxlPSJDb3B5IENvZGUiPgogICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOkNvcHkifSBpY29uU2l6ZT0iMTYiPjwvZGVlcy1pY29uPgogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWVkaXRvci13cmFwcGVyIj4KICAgICAgICAgIDxkZWVzLXdvcmtzcGFjZS1tb25hY28KICAgICAgICAgICAgLmNvbnRlbnQ9JHtjdXJyZW50VmFsdWV9CiAgICAgICAgICAgIC5sYW5ndWFnZT0ke21vZGFsTGFuZ3VhZ2V9CiAgICAgICAgICAgIC53b3JkV3JhcD0ke21vZGFsV29yZFdyYXB9CiAgICAgICAgICA+PC9kZWVzLXdvcmtzcGFjZS1tb25hY28+CiAgICAgICAgPC9kaXY+CiAgICAgIGAsCiAgICAgICAgbWVudU9wdGlvbnM6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgbmFtZTogIkNhbmNlbCIsCiAgICAgICAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsUmVmKSA9PiB7CiAgICAgICAgICAgICAgYXdhaXQgbW9kYWxSZWYuZGVzdHJveSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiU2F2ZSAmIENsb3NlIiwKICAgICAgICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWxSZWYpID0+IHsKICAgICAgICAgICAgICBtb2RhbEVkaXRvckVsZW1lbnQgPSBtb2RhbFJlZi5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCJkZWVzLXdvcmtzcGFjZS1tb25hY28iKTsKICAgICAgICAgICAgICBpZiAobW9kYWxFZGl0b3JFbGVtZW50KSB7CiAgICAgICAgICAgICAgICBjb25zdCBlZGl0b3IgPSBhd2FpdCBtb2RhbEVkaXRvckVsZW1lbnQuZWRpdG9yRGVmZXJyZWQucHJvbWlzZTsKICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZWRpdG9yLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKG5ld1ZhbHVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYXdhaXQgbW9kYWxSZWYuZGVzdHJveSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9KTsKICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUyLCAxMDApKTsKICAgICAgbW9kYWxFZGl0b3JFbGVtZW50ID0gbW9kYWwuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiZGVlcy13b3Jrc3BhY2UtbW9uYWNvIik7CiAgICAgIGNvbnN0IHRvb2xiYXIgPSBtb2RhbC5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIubW9kYWwtdG9vbGJhciIpOwogICAgICBpZiAodG9vbGJhcikgewogICAgICAgIGNvbnN0IGxhbmdCdG4gPSB0b29sYmFyLnF1ZXJ5U2VsZWN0b3IoIi5sYW5ndWFnZS1idXR0b24iKTsKICAgICAgICBsYW5nQnRuPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgICAgIG1vZGFsTGFuZ3VhZ2VEcm9wZG93bk9wZW4gPSAhbW9kYWxMYW5ndWFnZURyb3Bkb3duT3BlbjsKICAgICAgICAgIHVwZGF0ZVRvb2xiYXJVSShtb2RhbCk7CiAgICAgICAgfSk7CiAgICAgICAgY29uc3QgbGFuZ09wdGlvbnMgPSB0b29sYmFyLnF1ZXJ5U2VsZWN0b3JBbGwoIi5sYW5ndWFnZS1vcHRpb24iKTsKICAgICAgICBsYW5nT3B0aW9ucy5mb3JFYWNoKChvcHRpb24yKSA9PiB7CiAgICAgICAgICBvcHRpb24yLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKCkgPT4gewogICAgICAgICAgICBjb25zdCBuZXdMYW5nID0gb3B0aW9uMi5kYXRhc2V0Lmxhbmc7CiAgICAgICAgICAgIGlmIChuZXdMYW5nICYmIG1vZGFsRWRpdG9yRWxlbWVudCkgewogICAgICAgICAgICAgIG1vZGFsTGFuZ3VhZ2UgPSBuZXdMYW5nOwogICAgICAgICAgICAgIG1vZGFsTGFuZ3VhZ2VEcm9wZG93bk9wZW4gPSBmYWxzZTsKICAgICAgICAgICAgICBjb25zdCBlZGl0b3IgPSBhd2FpdCBtb2RhbEVkaXRvckVsZW1lbnQuZWRpdG9yRGVmZXJyZWQucHJvbWlzZTsKICAgICAgICAgICAgICBjb25zdCBtb2RlbCA9IGVkaXRvci5nZXRNb2RlbCgpOwogICAgICAgICAgICAgIGlmIChtb2RlbCkgewogICAgICAgICAgICAgICAgd2luZG93Lm1vbmFjby5lZGl0b3Iuc2V0TW9kZWxMYW5ndWFnZShtb2RlbCwgbmV3TGFuZyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGxhbmdPcHRpb25zLmZvckVhY2goKG9wdCkgPT4gb3B0LmNsYXNzTGlzdC5yZW1vdmUoInNlbGVjdGVkIikpOwogICAgICAgICAgICAgIG9wdGlvbjIuY2xhc3NMaXN0LmFkZCgic2VsZWN0ZWQiKTsKICAgICAgICAgICAgICB1cGRhdGVUb29sYmFyVUkobW9kYWwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgICBjb25zdCB3cmFwQnRuID0gdG9vbGJhci5xdWVyeVNlbGVjdG9yKCIud3JhcC1idG4iKTsKICAgICAgICB3cmFwQnRuPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jICgpID0+IHsKICAgICAgICAgIG1vZGFsV29yZFdyYXAgPSBtb2RhbFdvcmRXcmFwID09PSAib24iID8gIm9mZiIgOiAib24iOwogICAgICAgICAgaWYgKG1vZGFsRWRpdG9yRWxlbWVudCkgewogICAgICAgICAgICBjb25zdCBlZGl0b3IgPSBhd2FpdCBtb2RhbEVkaXRvckVsZW1lbnQuZWRpdG9yRGVmZXJyZWQucHJvbWlzZTsKICAgICAgICAgICAgZWRpdG9yLnVwZGF0ZU9wdGlvbnMoeyB3b3JkV3JhcDogbW9kYWxXb3JkV3JhcCB9KTsKICAgICAgICAgIH0KICAgICAgICAgIHVwZGF0ZVRvb2xiYXJVSShtb2RhbCk7CiAgICAgICAgfSk7CiAgICAgICAgY29uc3QgbGluZXNCdG4gPSB0b29sYmFyLnF1ZXJ5U2VsZWN0b3IoIi5saW5lcy1idG4iKTsKICAgICAgICBsaW5lc0J0bj8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoKSA9PiB7CiAgICAgICAgICBtb2RhbFNob3dMaW5lTnVtYmVycyA9ICFtb2RhbFNob3dMaW5lTnVtYmVyczsKICAgICAgICAgIGlmIChtb2RhbEVkaXRvckVsZW1lbnQpIHsKICAgICAgICAgICAgY29uc3QgZWRpdG9yID0gYXdhaXQgbW9kYWxFZGl0b3JFbGVtZW50LmVkaXRvckRlZmVycmVkLnByb21pc2U7CiAgICAgICAgICAgIGVkaXRvci51cGRhdGVPcHRpb25zKHsgbGluZU51bWJlcnM6IG1vZGFsU2hvd0xpbmVOdW1iZXJzID8gIm9uIiA6ICJvZmYiIH0pOwogICAgICAgICAgfQogICAgICAgICAgdXBkYXRlVG9vbGJhclVJKG1vZGFsKTsKICAgICAgICB9KTsKICAgICAgICBjb25zdCBjb3B5QnRuID0gdG9vbGJhci5xdWVyeVNlbGVjdG9yKCIuY29weS1idG4iKTsKICAgICAgICBjb3B5QnRuPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jICgpID0+IHsKICAgICAgICAgIGlmIChtb2RhbEVkaXRvckVsZW1lbnQpIHsKICAgICAgICAgICAgY29uc3QgZWRpdG9yID0gYXdhaXQgbW9kYWxFZGl0b3JFbGVtZW50LmVkaXRvckRlZmVycmVkLnByb21pc2U7CiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQzID0gZWRpdG9yLmdldFZhbHVlKCk7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoY29udGVudDMpOwogICAgICAgICAgICAgIG1vZGFsQ29weVN1Y2Nlc3MgPSB0cnVlOwogICAgICAgICAgICAgIHVwZGF0ZVRvb2xiYXJVSShtb2RhbCk7CiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICBtb2RhbENvcHlTdWNjZXNzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB1cGRhdGVUb29sYmFyVUkobW9kYWwpOwogICAgICAgICAgICAgIH0sIDJlMyk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBjb3B5IGNvZGU6IiwgZXJyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUxMSkgPT4gewogICAgICAgICAgaWYgKG1vZGFsTGFuZ3VhZ2VEcm9wZG93bk9wZW4gJiYgIWxhbmdCdG4/LmNvbnRhaW5zKGUxMS50YXJnZXQpKSB7CiAgICAgICAgICAgIG1vZGFsTGFuZ3VhZ2VEcm9wZG93bk9wZW4gPSBmYWxzZTsKICAgICAgICAgICAgdXBkYXRlVG9vbGJhclVJKG1vZGFsKTsKICAgICAgICAgIH0KICAgICAgICB9LCB7IG9uY2U6IHRydWUgfSk7CiAgICAgIH0KICAgIH0KICAgIGdldFZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy52YWx1ZTsKICAgIH0KICAgIHNldFZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLnZhbHVlID0gdmFsdWUyOwogICAgICBpZiAodGhpcy5lZGl0b3JFbGVtZW50KSB7CiAgICAgICAgdGhpcy5lZGl0b3JFbGVtZW50LmNvbnRlbnQgPSB2YWx1ZTI7CiAgICAgICAgdGhpcy5lZGl0b3JFbGVtZW50LmVkaXRvckRlZmVycmVkLnByb21pc2UudGhlbigoZWRpdG9yKSA9PiB7CiAgICAgICAgICBpZiAoZWRpdG9yLmdldFZhbHVlKCkgIT09IHZhbHVlMikgewogICAgICAgICAgICBlZGl0b3Iuc2V0VmFsdWUodmFsdWUyKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMTkoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNJbnB1dENvZGUyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LWRhdGVwaWNrZXIvZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmMxMSA9ICgpID0+IGIyYAogIDxzdHlsZT4KICAgICR7aWAKICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMjAwcHg7CiAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgIH0KICAgICAgCiAgICAgIGRlZXMtcGFuZWwgewogICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIGRlZXMtcGFuZWw6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgfQogICAgICAKICAgICAgLmRlbW8tb3V0cHV0IHsKICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAxMDUsIDI0MiwgMC4xKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgIH0KICAgICAgCiAgICAgIC5kYXRlLWdyb3VwIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogMTZweDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KICAgIGB9CiAgPC9zdHlsZT4KICAKICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IGRhdGVQaWNrZXIgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtZGF0ZXBpY2tlciIpOwogIGlmIChkYXRlUGlja2VyKSB7CiAgICBkYXRlUGlja2VyLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIChldmVudCkgPT4gewogICAgICBjb25zb2xlLmxvZygiQmFzaWMgZGF0ZSBzZWxlY3RlZDoiLCBldmVudC50YXJnZXQudmFsdWUpOwogICAgfSk7CiAgfQp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkJhc2ljIERhdGUgUGlja2VyIn0gLnN1YnRpdGxlPSR7IlNpbXBsZSBkYXRlIHNlbGVjdGlvbiB3aXRob3V0IHRpbWUifT4KICAgICAgICA8ZGVlcy1pbnB1dC1kYXRlcGlja2VyCiAgICAgICAgICBsYWJlbD0iU2VsZWN0IERhdGUiCiAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2hvb3NlIGEgZGF0ZSBmcm9tIHRoZSBjYWxlbmRhciIKICAgICAgICA+PC9kZWVzLWlucHV0LWRhdGVwaWNrZXI+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IGRhdGVUaW1lUGlja2VyID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCdkZWVzLWlucHV0LWRhdGVwaWNrZXJbbGFiZWw9IkV2ZW50IERhdGUgJiBUaW1lIl0nKTsKICBjb25zdCBhcHBvaW50bWVudFBpY2tlciA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcignZGVlcy1pbnB1dC1kYXRlcGlja2VyW2xhYmVsPSJBcHBvaW50bWVudCJdJyk7CiAgaWYgKGRhdGVUaW1lUGlja2VyKSB7CiAgICBkYXRlVGltZVBpY2tlci5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCAoZXZlbnQpID0+IHsKICAgICAgY29uc3QgdmFsdWUyID0gZXZlbnQudGFyZ2V0LnZhbHVlOwogICAgICBjb25zb2xlLmxvZygiMjRoIGZvcm1hdCBkYXRldGltZToiLCB2YWx1ZTIpOwogICAgfSk7CiAgfQogIGlmIChhcHBvaW50bWVudFBpY2tlcikgewogICAgYXBwb2ludG1lbnRQaWNrZXIuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHZhbHVlMiA9IGV2ZW50LnRhcmdldC52YWx1ZTsKICAgICAgY29uc29sZS5sb2coIjEyaCBmb3JtYXQgZGF0ZXRpbWU6IiwgdmFsdWUyKTsKICAgIH0pOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJEYXRlIGFuZCBUaW1lIFNlbGVjdGlvbiJ9IC5zdWJ0aXRsZT0keyJEYXRlIHBpY2tlcnMgd2l0aCB0aW1lIHNlbGVjdGlvbiBpbiBkaWZmZXJlbnQgZm9ybWF0cyJ9PgogICAgICAgIDxkZWVzLWlucHV0LWRhdGVwaWNrZXIKICAgICAgICAgIGxhYmVsPSJFdmVudCBEYXRlICYgVGltZSIKICAgICAgICAgIGRlc2NyaXB0aW9uPSJTZWxlY3QgYm90aCBkYXRlIGFuZCB0aW1lICgyNC1ob3VyIGZvcm1hdCkiCiAgICAgICAgICAuZW5hYmxlVGltZT0ke3RydWV9CiAgICAgICAgICB0aW1lRm9ybWF0PSIyNGgiCiAgICAgICAgPjwvZGVlcy1pbnB1dC1kYXRlcGlja2VyPgogICAgICAgIAogICAgICAgIDxkZWVzLWlucHV0LWRhdGVwaWNrZXIKICAgICAgICAgIGxhYmVsPSJBcHBvaW50bWVudCIKICAgICAgICAgIGRlc2NyaXB0aW9uPSJEYXRlIGFuZCB0aW1lIHdpdGggQU0vUE0gc2VsZWN0b3IgKDE1LW1pbnV0ZSBpbmNyZW1lbnRzKSIKICAgICAgICAgIC5lbmFibGVUaW1lPSR7dHJ1ZX0KICAgICAgICAgIHRpbWVGb3JtYXQ9IjEyaCIKICAgICAgICAgIC5taW51dGVJbmNyZW1lbnQ9JHsxNX0KICAgICAgICA+PC9kZWVzLWlucHV0LWRhdGVwaWNrZXI+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IHRpbWV6b25lUGlja2VycyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1pbnB1dC1kYXRlcGlja2VyIik7CiAgdGltZXpvbmVQaWNrZXJzLmZvckVhY2goKHBpY2tlcikgPT4gewogICAgcGlja2VyLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIChldmVudCkgPT4gewogICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7CiAgICAgIGNvbnNvbGUubG9nKGAke3RhcmdldC5sYWJlbH0gdmFsdWU6YCwgdGFyZ2V0LnZhbHVlKTsKICAgICAgY29uc3QgaW5wdXQgPSB0YXJnZXQuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmRhdGUtaW5wdXQiKTsKICAgICAgaWYgKGlucHV0KSB7CiAgICAgICAgY29uc29sZS5sb2coYCR7dGFyZ2V0LmxhYmVsfSBmb3JtYXR0ZWQ6YCwgaW5wdXQudmFsdWUpOwogICAgICB9CiAgICB9KTsKICB9KTsKfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJUaW1lem9uZSBTdXBwb3J0In0gLnN1YnRpdGxlPSR7IkRhdGUgYW5kIHRpbWUgc2VsZWN0aW9uIHdpdGggdGltZXpvbmUgYXdhcmVuZXNzIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtZGF0ZXBpY2tlcgogICAgICAgICAgbGFiZWw9Ik1lZXRpbmcgVGltZSAod2l0aCBUaW1lem9uZSkiCiAgICAgICAgICBkZXNjcmlwdGlvbj0iU2VsZWN0IGEgZGF0ZS90aW1lIGFuZCB0aW1lem9uZSBmb3IgdGhlIG1lZXRpbmciCiAgICAgICAgICAuZW5hYmxlVGltZT0ke3RydWV9CiAgICAgICAgICAuZW5hYmxlVGltZXpvbmU9JHt0cnVlfQogICAgICAgICAgdGltZUZvcm1hdD0iMjRoIgogICAgICAgICAgdGltZXpvbmU9IkFtZXJpY2EvTmV3X1lvcmsiCiAgICAgICAgPjwvZGVlcy1pbnB1dC1kYXRlcGlja2VyPgogICAgICAgIAogICAgICAgIDxkZWVzLWlucHV0LWRhdGVwaWNrZXIKICAgICAgICAgIGxhYmVsPSJHbG9iYWwgRXZlbnQgU2NoZWR1bGUiCiAgICAgICAgICBkZXNjcmlwdGlvbj0iU2NoZWR1bGUgYW4gZXZlbnQgYWNyb3NzIGRpZmZlcmVudCB0aW1lem9uZXMiCiAgICAgICAgICAuZW5hYmxlVGltZT0ke3RydWV9CiAgICAgICAgICAuZW5hYmxlVGltZXpvbmU9JHt0cnVlfQogICAgICAgICAgdGltZUZvcm1hdD0iMTJoIgogICAgICAgICAgdGltZXpvbmU9IkV1cm9wZS9Mb25kb24iCiAgICAgICAgICAubWludXRlSW5jcmVtZW50PSR7MzB9CiAgICAgICAgPjwvZGVlcy1pbnB1dC1kYXRlcGlja2VyPgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CgogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBmdXR1cmVEYXRlUGlja2VyID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCJkZWVzLWlucHV0LWRhdGVwaWNrZXIiKTsKICBpZiAoZnV0dXJlRGF0ZVBpY2tlcikgewogICAgZnV0dXJlRGF0ZVBpY2tlci5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCAoZXZlbnQpID0+IHsKICAgICAgY29uc3QgdmFsdWUyID0gZXZlbnQudGFyZ2V0LnZhbHVlOwogICAgICBpZiAodmFsdWUyKSB7CiAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXRlID0gbmV3IERhdGUodmFsdWUyKTsKICAgICAgICBjb25zdCB0b2RheSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpOwogICAgICAgIGNvbnN0IGRheXNEaWZmID0gTWF0aC5mbG9vcigoc2VsZWN0ZWREYXRlLmdldFRpbWUoKSAtIHRvZGF5LmdldFRpbWUoKSkgLyAoMWUzICogNjAgKiA2MCAqIDI0KSk7CiAgICAgICAgY29uc29sZS5sb2coYFNlbGVjdGVkIGRhdGUgaXMgJHtkYXlzRGlmZn0gZGF5cyBmcm9tIHRvZGF5YCk7CiAgICAgIH0KICAgIH0pOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJEYXRlIFJhbmdlIENvbnN0cmFpbnRzIn0gLnN1YnRpdGxlPSR7IkxpbWl0IHNlbGVjdGFibGUgZGF0ZXMgd2l0aCBtaW4gYW5kIG1heCB2YWx1ZXMifT4KICAgICAgICA8ZGVlcy1pbnB1dC1kYXRlcGlja2VyCiAgICAgICAgICBsYWJlbD0iRnV0dXJlIERhdGUgT25seSIKICAgICAgICAgIGRlc2NyaXB0aW9uPSJDYW4gb25seSBzZWxlY3QgZGF0ZXMgZnJvbSB0b2RheSB0byA5MCBkYXlzIGluIHRoZSBmdXR1cmUiCiAgICAgICAgICAubWluRGF0ZT0keygvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKX0KICAgICAgICAgIC5tYXhEYXRlPSR7bmV3IERhdGUoRGF0ZS5ub3coKSArIDkwICogMjQgKiA2MCAqIDYwICogMWUzKS50b0lTT1N0cmluZygpfQogICAgICAgID48L2RlZXMtaW5wdXQtZGF0ZXBpY2tlcj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgoKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgZm9ybWF0dGVyczIgPSB7CiAgICAiREQvTU0vWVlZWSI6ICJFdXJvcGVhbiIsCiAgICAiTU0vREQvWVlZWSI6ICJVUyIsCiAgICAiWVlZWS1NTS1ERCI6ICJJU08iCiAgfTsKICBjb25zdCBkYXRlUGlja2VycyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1pbnB1dC1kYXRlcGlja2VyIik7CiAgZGF0ZVBpY2tlcnMuZm9yRWFjaCgocGlja2VyKSA9PiB7CiAgICBwaWNrZXIuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDsKICAgICAgY29uc3QgaW5wdXQgPSB0YXJnZXQuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmRhdGUtaW5wdXQiKTsKICAgICAgaWYgKGlucHV0KSB7CiAgICAgICAgY29uc29sZS5sb2coYCR7dGFyZ2V0LmxhYmVsfSBmb3JtYXQ6YCwgaW5wdXQudmFsdWUpOwogICAgICB9CiAgICB9KTsKICB9KTsKfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJEYXRlIEZvcm1hdHMifSAuc3VidGl0bGU9JHsiRGlmZmVyZW50IGRhdGUgZGlzcGxheSBmb3JtYXRzIGZvciB2YXJpb3VzIHJlZ2lvbnMifT4KICAgICAgICA8ZGl2IGNsYXNzPSJkYXRlLWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWlucHV0LWRhdGVwaWNrZXIKICAgICAgICAgICAgbGFiZWw9IkV1cm9wZWFuIEZvcm1hdCIKICAgICAgICAgICAgZGF0ZUZvcm1hdD0iREQvTU0vWVlZWSIKICAgICAgICAgICAgLnZhbHVlPSR7KC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1kYXRlcGlja2VyPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1kYXRlcGlja2VyCiAgICAgICAgICAgIGxhYmVsPSJVUyBGb3JtYXQiCiAgICAgICAgICAgIGRhdGVGb3JtYXQ9Ik1NL0REL1lZWVkiCiAgICAgICAgICAgIC52YWx1ZT0keygvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtZGF0ZXBpY2tlcj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtZGF0ZXBpY2tlcgogICAgICAgICAgICBsYWJlbD0iSVNPIEZvcm1hdCIKICAgICAgICAgICAgZGF0ZUZvcm1hdD0iWVlZWS1NTS1ERCIKICAgICAgICAgICAgLnZhbHVlPSR7KC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1kYXRlcGlja2VyPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CgogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCByZXF1aXJlZFBpY2tlciA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC1kYXRlcGlja2VyW3JlcXVpcmVkXSIpOwogIGlmIChyZXF1aXJlZFBpY2tlcikgewogICAgcmVxdWlyZWRQaWNrZXIuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IHsKICAgICAgY29uc3QgcGlja2VyID0gcmVxdWlyZWRQaWNrZXI7CiAgICAgIGNvbnN0IHZhbHVlMiA9IHBpY2tlci5nZXRWYWx1ZSgpOwogICAgICBpZiAoIXZhbHVlMikgewogICAgICAgIGNvbnNvbGUubG9nKCJSZXF1aXJlZCBkYXRlIGZpZWxkIGlzIGVtcHR5Iik7CiAgICAgIH0KICAgIH0pOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJGb3JtIFN0YXRlcyJ9IC5zdWJ0aXRsZT0keyJSZXF1aXJlZCBhbmQgZGlzYWJsZWQgc3RhdGVzIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtZGF0ZXBpY2tlcgogICAgICAgICAgbGFiZWw9IkJpcnRoIERhdGUiCiAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhpcyBmaWVsZCBpcyByZXF1aXJlZCIKICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICBwbGFjZWhvbGRlcj0iU2VsZWN0IHlvdXIgYmlydGggZGF0ZSIKICAgICAgICA+PC9kZWVzLWlucHV0LWRhdGVwaWNrZXI+CiAgICAgICAgCiAgICAgICAgPGRlZXMtaW5wdXQtZGF0ZXBpY2tlcgogICAgICAgICAgbGFiZWw9IkRpc2FibGVkIERhdGUiCiAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhpcyBmaWVsZCBjYW5ub3QgYmUgZWRpdGVkIgogICAgICAgICAgLmRpc2FibGVkPSR7dHJ1ZX0KICAgICAgICAgIC52YWx1ZT0keygvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKX0KICAgICAgICA+PC9kZWVzLWlucHV0LWRhdGVwaWNrZXI+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IHVzUGlja2VyID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCdkZWVzLWlucHV0LWRhdGVwaWNrZXJbbGFiZWw9IlVTIENhbGVuZGFyIl0nKTsKICBjb25zdCBldVBpY2tlciA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcignZGVlcy1pbnB1dC1kYXRlcGlja2VyW2xhYmVsPSJFVSBDYWxlbmRhciJdJyk7CiAgaWYgKHVzUGlja2VyKSB7CiAgICBjb25zb2xlLmxvZygiVVMgQ2FsZW5kYXIgc3RhcnRzIG9uIFN1bmRheSAoMCkiKTsKICB9CiAgaWYgKGV1UGlja2VyKSB7CiAgICBjb25zb2xlLmxvZygiRVUgQ2FsZW5kYXIgc3RhcnRzIG9uIE1vbmRheSAoMSkiKTsKICB9Cn19PgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiQ2FsZW5kYXIgQ3VzdG9taXphdGlvbiJ9IC5zdWJ0aXRsZT0keyJEaWZmZXJlbnQgd2VlayBzdGFydCBkYXlzIGZvciB2YXJpb3VzIHJlZ2lvbnMifT4KICAgICAgICA8ZGl2IGNsYXNzPSJkYXRlLWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWlucHV0LWRhdGVwaWNrZXIKICAgICAgICAgICAgbGFiZWw9IlVTIENhbGVuZGFyIgogICAgICAgICAgICBkZXNjcmlwdGlvbj0iV2VlayBzdGFydHMgb24gU3VuZGF5IgogICAgICAgICAgICAud2Vla1N0YXJ0c09uPSR7MH0KICAgICAgICAgID48L2RlZXMtaW5wdXQtZGF0ZXBpY2tlcj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtZGF0ZXBpY2tlcgogICAgICAgICAgICBsYWJlbD0iRVUgQ2FsZW5kYXIiCiAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJXZWVrIHN0YXJ0cyBvbiBNb25kYXkiCiAgICAgICAgICAgIC53ZWVrU3RhcnRzT249JHsxfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1kYXRlcGlja2VyPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CgogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBnZW5lcmF0ZVdlZWtlbmRzID0gKCkgPT4gewogICAgY29uc3Qgd2Vla2VuZHMgPSBbXTsKICAgIGNvbnN0IG5vdzIgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTsKICAgIGNvbnN0IHllYXIgPSBub3cyLmdldEZ1bGxZZWFyKCk7CiAgICBjb25zdCBtb250aCA9IG5vdzIuZ2V0TW9udGgoKTsKICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7CiAgICB3aGlsZSAoZGF0ZS5nZXRNb250aCgpID09PSBtb250aCkgewogICAgICBpZiAoZGF0ZS5nZXREYXkoKSA9PT0gMCB8fCBkYXRlLmdldERheSgpID09PSA2KSB7CiAgICAgICAgd2Vla2VuZHMucHVzaChuZXcgRGF0ZShkYXRlKS50b0lTT1N0cmluZygpKTsKICAgICAgfQogICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyAxKTsKICAgIH0KICAgIHJldHVybiB3ZWVrZW5kczsKICB9OwogIGNvbnN0IHBpY2tlciA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC1kYXRlcGlja2VyIik7CiAgaWYgKHBpY2tlcikgewogICAgcGlja2VyLmRpc2FibGVkRGF0ZXMgPSBnZW5lcmF0ZVdlZWtlbmRzKCk7CiAgICBjb25zb2xlLmxvZygiRGlzYWJsZWQgd2Vla2VuZCBkYXRlcyBmb3IgY3VycmVudCBtb250aCIpOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJEaXNhYmxlZCBEYXRlcyJ9IC5zdWJ0aXRsZT0keyJDYWxlbmRhciB3aXRoIHNwZWNpZmljIGRhdGVzIGRpc2FibGVkICh3ZWVrZW5kcyBpbiBjdXJyZW50IG1vbnRoKSJ9PgogICAgICAgIDxkZWVzLWlucHV0LWRhdGVwaWNrZXIKICAgICAgICAgIGxhYmVsPSJBdmFpbGFiaWxpdHkgQ2FsZW5kYXIiCiAgICAgICAgICBkZXNjcmlwdGlvbj0iV2Vla2VuZHMgYXJlIGRpc2FibGVkIGZvciB0aGUgY3VycmVudCBtb250aCIKICAgICAgICA+PC9kZWVzLWlucHV0LWRhdGVwaWNrZXI+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IHRvZGF5ID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7CiAgY29uc3QgY3VycmVudE1vbnRoID0gdG9kYXkuZ2V0TW9udGgoKTsKICBjb25zdCBjdXJyZW50WWVhciA9IHRvZGF5LmdldEZ1bGxZZWFyKCk7CiAgY29uc3Qgc2FtcGxlRXZlbnRzID0gWwogICAgLy8gQ3VycmVudCB3ZWVrIGV2ZW50cwogICAgewogICAgICBkYXRlOiBgJHtjdXJyZW50WWVhcn0tJHsoY3VycmVudE1vbnRoICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfS0ke3RvZGF5LmdldERhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9YCwKICAgICAgdGl0bGU6ICJUZWFtIE1lZXRpbmciLAogICAgICB0eXBlOiAiaW5mbyIsCiAgICAgIGNvdW50OiAyCiAgICB9LAogICAgewogICAgICBkYXRlOiBgJHtjdXJyZW50WWVhcn0tJHsoY3VycmVudE1vbnRoICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfS0keyh0b2RheS5nZXREYXRlKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9YCwKICAgICAgdGl0bGU6ICJQcm9qZWN0IERlYWRsaW5lIiwKICAgICAgdHlwZTogIndhcm5pbmciCiAgICB9LAogICAgewogICAgICBkYXRlOiBgJHtjdXJyZW50WWVhcn0tJHsoY3VycmVudE1vbnRoICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfS0keyh0b2RheS5nZXREYXRlKCkgKyAyKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9YCwKICAgICAgdGl0bGU6ICJSZWxlYXNlIERheSIsCiAgICAgIHR5cGU6ICJzdWNjZXNzIgogICAgfSwKICAgIHsKICAgICAgZGF0ZTogYCR7Y3VycmVudFllYXJ9LSR7KGN1cnJlbnRNb250aCArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKX0tJHsodG9kYXkuZ2V0RGF0ZSgpICsgNSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfWAsCiAgICAgIHRpdGxlOiAiVXJnZW50IEZpeCBSZXF1aXJlZCIsCiAgICAgIHR5cGU6ICJlcnJvciIKICAgIH0sCiAgICAvLyBNdWx0aXBsZSBldmVudHMgb24gb25lIGRheQogICAgewogICAgICBkYXRlOiBgJHtjdXJyZW50WWVhcn0tJHsoY3VycmVudE1vbnRoICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfS0keyh0b2RheS5nZXREYXRlKCkgKyA3KS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9YCwKICAgICAgdGl0bGU6ICJNdWx0aXBsZSBFdmVudHMgVG9kYXkiLAogICAgICB0eXBlOiAiaW5mbyIsCiAgICAgIGNvdW50OiA1CiAgICB9LAogICAgLy8gTmV4dCBtb250aCBldmVudAogICAgewogICAgICBkYXRlOiBgJHtjdXJyZW50WWVhcn0tJHsoY3VycmVudE1vbnRoICsgMikudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfS0xNWAsCiAgICAgIHRpdGxlOiAiRnV0dXJlIFBsYW5uaW5nIFNlc3Npb24iLAogICAgICB0eXBlOiAiaW5mbyIKICAgIH0KICBdOwogIGNvbnN0IHBpY2tlciA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC1kYXRlcGlja2VyIik7CiAgaWYgKHBpY2tlcikgewogICAgcGlja2VyLmV2ZW50cyA9IHNhbXBsZUV2ZW50czsKICAgIGNvbnNvbGUubG9nKCJDYWxlbmRhciBldmVudHMgbG9hZGVkOiIsIHNhbXBsZUV2ZW50cyk7CiAgfQp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkNhbGVuZGFyIHdpdGggRXZlbnRzIn0gLnN1YnRpdGxlPSR7IlZpc3VhbCBmZWVkYmFjayBmb3Igc2NoZWR1bGVkIGV2ZW50cyJ9PgogICAgICAgIDxkZWVzLWlucHV0LWRhdGVwaWNrZXIKICAgICAgICAgIGxhYmVsPSJFdmVudCBDYWxlbmRhciIKICAgICAgICAgIGRlc2NyaXB0aW9uPSJEYXlzIHdpdGggY29sb3JlZCBkb3RzIGhhdmUgZXZlbnRzLiBIb3ZlciB0byBzZWUgZGV0YWlscy4iCiAgICAgICAgPjwvZGVlcy1pbnB1dC1kYXRlcGlja2VyPgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9ImRlbW8tb3V0cHV0IiBzdHlsZT0ibWFyZ2luLXRvcDogMTZweDsiPgogICAgICAgICAgPHN0cm9uZz5FdmVudCBMZWdlbmQ6PC9zdHJvbmc+PGJyPgogICAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDk2OWRhOyI+4pePIEluZm88L3NwYW4+IHwgCiAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICNkMjk5MjI7Ij7il48gV2FybmluZzwvc3Bhbj4gfCAKICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzJlYTA0MzsiPuKXjyBTdWNjZXNzPC9zcGFuPiB8IAogICAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2YyMjJlOyI+4pePIEVycm9yPC9zcGFuPjxicj4KICAgICAgICAgIDxlbT5EYXlzIHdpdGggbW9yZSB0aGFuIDMgZXZlbnRzIHNob3cgYSBjb3VudCBiYWRnZTwvZW0+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IHBpY2tlciA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC1kYXRlcGlja2VyIik7CiAgY29uc3Qgb3V0cHV0ID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjZXZlbnQtb3V0cHV0Iik7CiAgaWYgKHBpY2tlciAmJiBvdXRwdXQpIHsKICAgIHBpY2tlci5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCAoZXZlbnQpID0+IHsKICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0OwogICAgICBjb25zdCB2YWx1ZTIgPSB0YXJnZXQudmFsdWU7CiAgICAgIGlmICh2YWx1ZTIpIHsKICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUyKTsKICAgICAgICBjb25zdCBpbnB1dCA9IHRhcmdldC5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuZGF0ZS1pbnB1dCIpOwogICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gaW5wdXQ/LnZhbHVlIHx8ICJOL0EiOwogICAgICAgIG91dHB1dC5pbm5lckhUTUwgPSBgCiAgICAgICAgICAgICAgPHN0cm9uZz5FdmVudCB0cmlnZ2VyZWQhPC9zdHJvbmc+PGJyPgogICAgICAgICAgICAgIElTTyBWYWx1ZTogJHt2YWx1ZTJ9PGJyPgogICAgICAgICAgICAgIEZvcm1hdHRlZDogJHtmb3JtYXR0ZWRWYWx1ZX08YnI+CiAgICAgICAgICAgICAgRGF0ZSBvYmplY3Q6ICR7ZGF0ZS50b0xvY2FsZVN0cmluZygpfQogICAgICAgICAgICBgOwogICAgICB9IGVsc2UgewogICAgICAgIG91dHB1dC5pbm5lckhUTUwgPSAiPGVtPkRhdGUgY2xlYXJlZDwvZW0+IjsKICAgICAgfQogICAgfSk7CiAgICBwaWNrZXIuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IHsKICAgICAgY29uc29sZS5sb2coIkRhdGVwaWNrZXIgbG9zdCBmb2N1cyIpOwogICAgfSk7CiAgfQp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkV2ZW50IEhhbmRsaW5nIn0gLnN1YnRpdGxlPSR7IkludGVyYWN0aXZlIGRlbW9uc3RyYXRpb24gb2YgY2hhbmdlIGV2ZW50cyJ9PgogICAgICAgIDxkZWVzLWlucHV0LWRhdGVwaWNrZXIKICAgICAgICAgIGxhYmVsPSJFdmVudCBEZW1vIgogICAgICAgICAgZGVzY3JpcHRpb249IlNlbGVjdCBhIGRhdGUgdG8gc2VlIHRoZSBldmVudCBkZXRhaWxzIgogICAgICAgID48L2RlZXMtaW5wdXQtZGF0ZXBpY2tlcj4KICAgICAgICAKICAgICAgICA8ZGl2IGlkPSJldmVudC1vdXRwdXQiIGNsYXNzPSJkZW1vLW91dHB1dCI+CiAgICAgICAgICA8ZW0+U2VsZWN0IGEgZGF0ZSB0byBzZWUgZXZlbnQgZGV0YWlscy4uLjwvZW0+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LWRhdGVwaWNrZXIvc3R5bGVzLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkYXRlcGlja2VyU3R5bGVzID0gWwogIC4uLkRlZXNJbnB1dEJhc2UuYmFzZVN0eWxlcywKICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuZGF0ZS1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiA0MHB4OwogICAgICAgIHBhZGRpbmc6IDAgMTJweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDIyNCA3MS40JSA0LjElKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNC4zIDMxLjglIDkxLjQlKSIsICJoc2woMjE3LjIgMzIuNiUgMTcuNSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjQgNzEuNCUgNC4xJSkiLCAiaHNsKDIxMCAyMCUgOTglKSIpfTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgICB9CgogICAgICAuZGF0ZS1pbnB1dDo6cGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMCA4LjklIDQ2LjElKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgfQoKICAgICAgLmRhdGUtaW5wdXQ6aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNy4yIDMyLjYlIDE3LjUlKSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCAyMCUgOTglKSIsICJoc2woMjE1IDI3LjklIDE2LjklKSIpfTsKICAgICAgfQoKICAgICAgLmRhdGUtaW5wdXQ6Zm9jdXMsCiAgICAgIC5kYXRlLWlucHV0Lm9wZW4gewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSAxMS4yJSkiLCAiaHNsKDIxMCAyMCUgOTglKSIpfTsKICAgICAgICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgb3V0bGluZS1vZmZzZXQ6IDJweDsKICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgyMjQgNzEuNCUgNC4xJSkiKX0sCiAgICAgICAgICAgICAgICAgICAgMCAwIDAgNHB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgMTEuMiUgLyAwLjEpIiwgImhzbCgyMTAgMjAlIDk4JSAvIDAuMSkiKX07CiAgICAgIH0KCiAgICAgIC5kYXRlLWlucHV0OmRpc2FibGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCAyMCUgOTglKSIsICJoc2woMjE1IDI3LjklIDE2LjklKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjAgOC45JSA0Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIC8qIEljb24gY29udGFpbmVyIHVzaW5nIGZsZXhib3ggZm9yIGJldHRlciBwb3NpdGlvbmluZyAqLwogICAgICAuaWNvbi1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDRweDsKICAgICAgICBwYWRkaW5nOiAwIDEycHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5pY29uLWNvbnRhaW5lciA+ICogewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICB9CgogICAgICAuY2FsZW5kYXItaWNvbiB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIwIDguOSUgNDYuMSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmNsZWFyLWJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjAgOC45JSA0Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2UsIGJhY2tncm91bmQtY29sb3IgMC4ycyBlYXNlOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5jbGVhci1idXR0b246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDIwJSA5OCUpIiwgImhzbCgyMTUgMjcuOSUgMTYuOSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyNCA3MS40JSA0LjElKSIsICJoc2woMjEwIDIwJSA5OCUpIil9OwogICAgICB9CgogICAgICAuY2xlYXItYnV0dG9uOmRpc2FibGVkIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBDYWxlbmRhciBQb3B1cCBTdHlsZXMgKi8KICAgICAgLmNhbGVuZGFyLXBvcHVwIHsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtLCBvcGFjaXR5OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTRweCk7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgyMjQgNzEuNCUgNC4xJSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNy4yIDMyLjYlIDE3LjUlKSIpfTsKICAgICAgICBib3gtc2hhZG93OiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiMCAxMHB4IDE1cHggLTNweCBoc2woMCAwJSAwJSAvIDAuMSksIDAgNHB4IDZweCAtNHB4IGhzbCgwIDAlIDAlIC8gMC4xKSIsICIwIDEwcHggMTVweCAtM3B4IGhzbCgwIDAlIDAlIC8gMC4yKSwgMCA0cHggNnB4IC00cHggaHNsKDAgMCUgMCUgLyAwLjIpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgICAgei1pbmRleDogNTA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBtaW4td2lkdGg6IDI4MHB4OwogICAgICB9CgogICAgICAuY2FsZW5kYXItcG9wdXAudG9wIHsKICAgICAgICBib3R0b206IGNhbGMoMTAwJSArIDRweCk7CiAgICAgICAgdG9wOiBhdXRvOwogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNHB4OwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSg0cHgpOwogICAgICB9CgogICAgICAuY2FsZW5kYXItcG9wdXAuYm90dG9tIHsKICAgICAgICB0b3A6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5jYWxlbmRhci1wb3B1cC5zaG93IHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYWxsOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAvKiBDYWxlbmRhciBIZWFkZXIgKi8KICAgICAgLmNhbGVuZGFyLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICAgIGdhcDogOHB4OwogICAgICB9CgogICAgICAubW9udGgteWVhci1kaXNwbGF5IHsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjQgNzEuNCUgNC4xJSkiLCAiaHNsKDIxMCAyMCUgOTglKSIpfTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5hdi1idXR0b24gewogICAgICAgIHdpZHRoOiAyOHB4OwogICAgICAgIGhlaWdodDogMjhweDsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIwIDguOSUgNDYuMSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5uYXYtYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCAyMCUgOTglKSIsICJoc2woMjE1IDI3LjklIDE2LjklKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjQgNzEuNCUgNC4xJSkiLCAiaHNsKDIxMCAyMCUgOTglKSIpfTsKICAgICAgfQoKICAgICAgLm5hdi1idXR0b246YWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNC4zIDMxLjglIDkxLjQlKSIsICJoc2woMjE3LjIgMzIuNiUgMTcuNSUpIil9OwogICAgICB9CgogICAgICAvKiBXZWVrZGF5IGhlYWRlcnMgKi8KICAgICAgLndlZWtkYXlzIHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDcsIDFmcik7CiAgICAgICAgZ2FwOiAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgICAgfQoKICAgICAgLndlZWtkYXkgewogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjAgOC45JSA0Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgICAgcGFkZGluZzogMCAwIDhweCAwOwogICAgICB9CgogICAgICAvKiBEYXlzIGdyaWQgKi8KICAgICAgLmRheXMtZ3JpZCB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCg3LCAxZnIpOwogICAgICAgIGdhcDogMnB4OwogICAgICB9CgogICAgICAuZGF5IHsKICAgICAgICBhc3BlY3QtcmF0aW86IDE7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjI0IDcxLjQlIDQuMSUpIiwgImhzbCgyMTAgMjAlIDk4JSkiKX07CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIHdpZHRoOiAzNnB4OwogICAgICAgIGhlaWdodDogMzZweDsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgLmRheTpob3Zlcjpub3QoLmRpc2FibGVkKSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgMjAlIDk4JSkiLCAiaHNsKDIxNSAyNy45JSAxNi45JSkiKX07CiAgICAgIH0KCiAgICAgIC5kYXkub3RoZXItbW9udGggewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMCA4LjklIDQ2LjElKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIC5kYXkudG9kYXkgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDIwJSA5OCUpIiwgImhzbCgyMTUgMjcuOSUgMTYuOSUpIil9OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5kYXkuc2VsZWN0ZWQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgMTEuMiUpIiwgImhzbCgyMTAgMjAlIDk4JSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDIwJSA5OCUpIiwgImhzbCgyMjIuMiA0Ny40JSAxMS4yJSkiKX07CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLmRheS5kaXNhYmxlZCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIwIDguOSUgNDYuMSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgICAgb3BhY2l0eTogMC4zOwogICAgICB9CgogICAgICAvKiBFdmVudCBpbmRpY2F0b3JzICovCiAgICAgIC5kYXkuaGFzLWV2ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5ldmVudC1pbmRpY2F0b3IgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDRweDsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiAycHg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5ldmVudC1kb3QgewogICAgICAgIHdpZHRoOiA0cHg7CiAgICAgICAgaGVpZ2h0OiA0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIwIDguOSUgNDYuMSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICB9CgogICAgICAuZXZlbnQtZG90LmluZm8gewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjExIDcwJSA1MiUpIiwgImhzbCgyMTEgNzAlIDYyJSkiKX07CiAgICAgIH0KCiAgICAgIC5ldmVudC1kb3Qud2FybmluZyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCg0NSA5MCUgNDUlKSIsICJoc2woNDUgOTAlIDU1JSkiKX07CiAgICAgIH0KCiAgICAgIC5ldmVudC1kb3Quc3VjY2VzcyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgxNDIgNjklIDQ1JSkiLCAiaHNsKDE0MiA2OSUgNTUlKSIpfTsKICAgICAgfQoKICAgICAgLmV2ZW50LWRvdC5lcnJvciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcyJSA1MSUpIiwgImhzbCgwIDcyJSA2MSUpIil9OwogICAgICB9CgogICAgICAuZXZlbnQtY291bnQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDJweDsKICAgICAgICByaWdodDogMnB4OwogICAgICAgIG1pbi13aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgcGFkZGluZzogMCA0cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcyJSA1MSUpIiwgImhzbCgwIDcyJSA2MSUpIil9OwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICB9CgogICAgICAvKiBUb29sdGlwIGZvciBldmVudCBkZXRhaWxzICovCiAgICAgIC5ldmVudC10b29sdGlwIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiBjYWxjKDEwMCUgKyA4cHgpOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDIwJSkiLCAiaHNsKDAgMCUgOTAlKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDAlKSIpfTsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZTsKICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgICB9CgogICAgICAuZXZlbnQtdG9vbHRpcDo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDEwMCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgICAgICBib3JkZXI6IDRweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMjAlKSIsICJoc2woMCAwJSA5MCUpIil9OwogICAgICB9CgogICAgICAuZGF5Lmhhcy1ldmVudDpob3ZlciAuZXZlbnQtdG9vbHRpcCB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLyogVGltZSBzZWxlY3RvciAqLwogICAgICAudGltZS1zZWxlY3RvciB7CiAgICAgICAgbWFyZ2luLXRvcDogMTJweDsKICAgICAgICBwYWRkaW5nLXRvcDogMTJweDsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNy4yIDMyLjYlIDE3LjUlKSIpfTsKICAgICAgfQoKICAgICAgLnRpbWUtc2VsZWN0b3ItdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjAgOC45JSA0Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgIH0KCiAgICAgIC50aW1lLWlucHV0cyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAudGltZS1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDY1cHg7CiAgICAgICAgaGVpZ2h0OiAzNnB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgOTEuNCUpIiwgImhzbCgyMTcuMiAzMi42JSAxNy41JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIHBhZGRpbmc6IDAgMTJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMjI0IDcxLjQlIDQuMSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyNCA3MS40JSA0LjElKSIsICJoc2woMjEwIDIwJSA5OCUpIil9OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgIH0KCiAgICAgIC50aW1lLWlucHV0OmhvdmVyIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgOTEuNCUpIiwgImhzbCgyMTcuMiAzMi42JSAxNy41JSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgMjAlIDk4JSkiLCAiaHNsKDIxNSAyNy45JSAxNi45JSkiKX07CiAgICAgIH0KCiAgICAgIC50aW1lLWlucHV0OmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSAxMS4yJSkiLCAiaHNsKDIxMCAyMCUgOTglKSIpfTsKICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSAxMS4yJSAvIDAuMSkiLCAiaHNsKDIxMCAyMCUgOTglIC8gMC4xKSIpfTsKICAgICAgfQoKICAgICAgLnRpbWUtc2VwYXJhdG9yIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjAgOC45JSA0Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgIH0KCiAgICAgIC5hbS1wbS1zZWxlY3RvciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDRweDsKICAgICAgICBtYXJnaW4tbGVmdDogOHB4OwogICAgICB9CgogICAgICAuYW0tcG0tYnV0dG9uIHsKICAgICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNC4zIDMxLjglIDkxLjQlKSIsICJoc2woMjE3LjIgMzIuNiUgMTcuNSUpIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMjI0IDcxLjQlIDQuMSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjAgOC45JSA0Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgIH0KCiAgICAgIC5hbS1wbS1idXR0b24uc2VsZWN0ZWQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgMTEuMiUpIiwgImhzbCgyMTAgMjAlIDk4JSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDIwJSA5OCUpIiwgImhzbCgyMjIuMiA0Ny40JSAxMS4yJSkiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDExLjIlKSIsICJoc2woMjEwIDIwJSA5OCUpIil9OwogICAgICB9CgogICAgICAuYW0tcG0tYnV0dG9uOmhvdmVyOm5vdCguc2VsZWN0ZWQpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCAyMCUgOTglKSIsICJoc2woMjE1IDI3LjklIDE2LjklKSIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgOTEuNCUpIiwgImhzbCgyMTcuMiAzMi42JSAxNy41JSkiKX07CiAgICAgIH0KCiAgICAgIC8qIEFjdGlvbiBidXR0b25zICovCiAgICAgIC5jYWxlbmRhci1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogOHB4OwogICAgICAgIG1hcmdpbi10b3A6IDEycHg7CiAgICAgICAgcGFkZGluZy10b3A6IDEycHg7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgOTEuNCUpIiwgImhzbCgyMTcuMiAzMi42JSAxNy41JSkiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIGhlaWdodDogMzZweDsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLnRvZGF5LWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgyMjQgNzEuNCUgNC4xJSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNy4yIDMyLjYlIDE3LjUlKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjQgNzEuNCUgNC4xJSkiLCAiaHNsKDIxMCAyMCUgOTglKSIpfTsKICAgICAgfQoKICAgICAgLnRvZGF5LWJ1dHRvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgMjAlIDk4JSkiLCAiaHNsKDIxNSAyNy45JSAxNi45JSkiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNC4zIDMxLjglIDkxLjQlKSIsICJoc2woMjE3LjIgMzIuNiUgMTcuNSUpIil9OwogICAgICB9CgogICAgICAudG9kYXktYnV0dG9uOmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNy4yIDMyLjYlIDE3LjUlKSIpfTsKICAgICAgfQoKICAgICAgLmNsZWFyLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIwIDguOSUgNDYuMSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICB9CgogICAgICAuY2xlYXItYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzIuMiUgNTAuNiUgLyAwLjEpIiwgImhzbCgwIDYyLjglIDMwLjYlIC8gMC4xKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcyLjIlIDUwLjYlKSIsICJoc2woMCA2Mi44JSAzMC42JSkiKX07CiAgICAgIH0KCiAgICAgIC5jbGVhci1idXR0b246YWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzIuMiUgNTAuNiUgLyAwLjIpIiwgImhzbCgwIDYyLjglIDMwLjYlIC8gMC4yKSIpfTsKICAgICAgfQoKICAgICAgLyogVGltZXpvbmUgc2VsZWN0b3IgKi8KICAgICAgLnRpbWV6b25lLXNlbGVjdG9yIHsKICAgICAgICBtYXJnaW4tdG9wOiAxMnB4OwogICAgICAgIHBhZGRpbmctdG9wOiAxMnB4OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNC4zIDMxLjglIDkxLjQlKSIsICJoc2woMjE3LjIgMzIuNiUgMTcuNSUpIil9OwogICAgICB9CgogICAgICAudGltZXpvbmUtc2VsZWN0b3ItdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjAgOC45JSA0Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgIH0KCiAgICAgIC50aW1lem9uZS1zZWxlY3QgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMzZweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNC4zIDMxLjglIDkxLjQlKSIsICJoc2woMjE3LjIgMzIuNiUgMTcuNSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBwYWRkaW5nOiAwIDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMjI0IDcxLjQlIDQuMSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyNCA3MS40JSA0LjElKSIsICJoc2woMjEwIDIwJSA5OCUpIil9OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogICAgICB9CgogICAgICAudGltZXpvbmUtc2VsZWN0OmhvdmVyIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgOTEuNCUpIiwgImhzbCgyMTcuMiAzMi42JSAxNy41JSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgMjAlIDk4JSkiLCAiaHNsKDIxNSAyNy45JSAxNi45JSkiKX07CiAgICAgIH0KCiAgICAgIC50aW1lem9uZS1zZWxlY3Q6Zm9jdXMgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDExLjIlKSIsICJoc2woMjEwIDIwJSA5OCUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDExLjIlIC8gMC4xKSIsICJoc2woMjEwIDIwJSA5OCUgLyAwLjEpIil9OwogICAgICB9CiAgICBgCl07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1kYXRlcGlja2VyL3RlbXBsYXRlLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciByZW5kZXJEYXRlcGlja2VyID0gKGNvbXBvbmVudCkgPT4gewogIGNvbnN0IG1vbnRoTmFtZXMgPSBbCiAgICAiSmFudWFyeSIsCiAgICAiRmVicnVhcnkiLAogICAgIk1hcmNoIiwKICAgICJBcHJpbCIsCiAgICAiTWF5IiwKICAgICJKdW5lIiwKICAgICJKdWx5IiwKICAgICJBdWd1c3QiLAogICAgIlNlcHRlbWJlciIsCiAgICAiT2N0b2JlciIsCiAgICAiTm92ZW1iZXIiLAogICAgIkRlY2VtYmVyIgogIF07CiAgY29uc3Qgd2Vla0RheXMgPSBjb21wb25lbnQud2Vla1N0YXJ0c09uID09PSAxID8gWyJNbyIsICJUdSIsICJXZSIsICJUaCIsICJGciIsICJTYSIsICJTdSJdIDogWyJTdSIsICJNbyIsICJUdSIsICJXZSIsICJUaCIsICJGciIsICJTYSJdOwogIGNvbnN0IGRheXMyID0gY29tcG9uZW50LmdldERheXNJbk1vbnRoKCk7CiAgY29uc3QgaXNBTSA9IGNvbXBvbmVudC5zZWxlY3RlZEhvdXIgPCAxMjsKICBjb25zdCB0aW1lem9uZXMgPSBjb21wb25lbnQuZ2V0VGltZXpvbmVzKCk7CiAgcmV0dXJuIGIyYAogICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LXdyYXBwZXIiPgogICAgICAgICAgPGRlZXMtbGFiZWwgLmxhYmVsPSR7Y29tcG9uZW50LmxhYmVsfSAuZGVzY3JpcHRpb249JHtjb21wb25lbnQuZGVzY3JpcHRpb259IC5yZXF1aXJlZD0ke2NvbXBvbmVudC5yZXF1aXJlZH0+PC9kZWVzLWxhYmVsPgogICAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtY29udGFpbmVyIj4KICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgdHlwZT0idGV4dCIKICAgICAgICAgICAgICBjbGFzcz0iZGF0ZS1pbnB1dCAke2NvbXBvbmVudC5pc09wZW5lZCA/ICJvcGVuIiA6ICIifSIKICAgICAgICAgICAgICAudmFsdWU9JHtjb21wb25lbnQuZm9ybWF0RGF0ZShjb21wb25lbnQudmFsdWUpfQogICAgICAgICAgICAgIC5wbGFjZWhvbGRlcj0ke2NvbXBvbmVudC5wbGFjZWhvbGRlcn0KICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHtjb21wb25lbnQuZGlzYWJsZWR9CiAgICAgICAgICAgICAgQGNsaWNrPSR7Y29tcG9uZW50LnRvZ2dsZUNhbGVuZGFyfQogICAgICAgICAgICAgIEBrZXlkb3duPSR7Y29tcG9uZW50LmhhbmRsZUtleWRvd259CiAgICAgICAgICAgICAgQGlucHV0PSR7Y29tcG9uZW50LmhhbmRsZU1hbnVhbElucHV0fQogICAgICAgICAgICAgIEBibHVyPSR7Y29tcG9uZW50LmhhbmRsZUlucHV0Qmx1cn0KICAgICAgICAgICAgICBzdHlsZT0icGFkZGluZy1yaWdodDogJHtjb21wb25lbnQudmFsdWUgPyAiNjRweCIgOiAiNDBweCJ9IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpY29uLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgJHtjb21wb25lbnQudmFsdWUgJiYgIWNvbXBvbmVudC5kaXNhYmxlZCA/IGIyYAogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xlYXItYnV0dG9uIiBAY2xpY2s9JHtjb21wb25lbnQuY2xlYXJWYWx1ZX0gdGl0bGU9IkNsZWFyIj4KICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6eCIgaWNvblNpemU9IjE0Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICA8ZGVlcy1pY29uIGNsYXNzPSJjYWxlbmRhci1pY29uIiBpY29uPSJsdWNpZGU6Y2FsZW5kYXIiIGljb25TaXplPSIxNiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgCiAgICAgICAgICAgIDwhLS0gQ2FsZW5kYXIgUG9wdXAgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhbGVuZGFyLXBvcHVwICR7Y29tcG9uZW50LmlzT3BlbmVkID8gInNob3ciIDogIiJ9ICR7Y29tcG9uZW50Lm9wZW5zVG9Ub3AgPyAidG9wIiA6ICJib3R0b20ifSI+CiAgICAgICAgICAgICAgPCEtLSBNb250aC9ZZWFyIE5hdmlnYXRpb24gLS0+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FsZW5kYXItaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Im5hdi1idXR0b24iIEBjbGljaz0ke2NvbXBvbmVudC5wcmV2aW91c01vbnRofT4KICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6Y2hldnJvbkxlZnQiIGljb25TaXplPSIxNiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vbnRoLXllYXItZGlzcGxheSI+CiAgICAgICAgICAgICAgICAgICR7bW9udGhOYW1lc1tjb21wb25lbnQudmlld0RhdGUuZ2V0TW9udGgoKV19ICR7Y29tcG9uZW50LnZpZXdEYXRlLmdldEZ1bGxZZWFyKCl9CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Im5hdi1idXR0b24iIEBjbGljaz0ke2NvbXBvbmVudC5uZXh0TW9udGh9PgogICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpjaGV2cm9uUmlnaHQiIGljb25TaXplPSIxNiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgPCEtLSBXZWVrZGF5IEhlYWRlcnMgLS0+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2Vla2RheXMiPgogICAgICAgICAgICAgICAgJHt3ZWVrRGF5cy5tYXAoKGRheSkgPT4gYjJgPGRpdiBjbGFzcz0id2Vla2RheSI+JHtkYXl9PC9kaXY+YCl9CiAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgIDwhLS0gRGF5cyBHcmlkIC0tPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRheXMtZ3JpZCI+CiAgICAgICAgICAgICAgICAke2RheXMyLm1hcCgoZGF5KSA9PiB7CiAgICBjb25zdCBpc1RvZGF5NCA9IGNvbXBvbmVudC5pc1RvZGF5KGRheSk7CiAgICBjb25zdCBpc1NlbGVjdGVkID0gY29tcG9uZW50LmlzU2VsZWN0ZWQoZGF5KTsKICAgIGNvbnN0IGlzT3RoZXJNb250aCA9IGRheS5nZXRNb250aCgpICE9PSBjb21wb25lbnQudmlld0RhdGUuZ2V0TW9udGgoKTsKICAgIGNvbnN0IGlzRGlzYWJsZWQgPSBjb21wb25lbnQuaXNEaXNhYmxlZChkYXkpOwogICAgY29uc3QgZGF5RXZlbnRzID0gY29tcG9uZW50LmdldEV2ZW50c0ZvckRhdGUoZGF5KTsKICAgIGNvbnN0IGhhc0V2ZW50cyA9IGRheUV2ZW50cy5sZW5ndGggPiAwOwogICAgY29uc3QgdG90YWxFdmVudENvdW50ID0gZGF5RXZlbnRzLnJlZHVjZSgoc3VtLCBldmVudCkgPT4gc3VtICsgKGV2ZW50LmNvdW50IHx8IDEpLCAwKTsKICAgIHJldHVybiBiMmAKICAgICAgICAgICAgICAgICAgICA8ZGl2IAogICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImRheSAke2lzT3RoZXJNb250aCA/ICJvdGhlci1tb250aCIgOiAiIn0gJHtpc1RvZGF5NCA/ICJ0b2RheSIgOiAiIn0gJHtpc1NlbGVjdGVkID8gInNlbGVjdGVkIiA6ICIifSAke2lzRGlzYWJsZWQgPyAiZGlzYWJsZWQiIDogIiJ9ICR7aGFzRXZlbnRzID8gImhhcy1ldmVudCIgOiAiIn0iCiAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiAhaXNEaXNhYmxlZCAmJiBjb21wb25lbnQuc2VsZWN0RGF0ZShkYXkpfQogICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICR7ZGF5LmdldERhdGUoKX0KICAgICAgICAgICAgICAgICAgICAgICR7aGFzRXZlbnRzID8gYjJgCiAgICAgICAgICAgICAgICAgICAgICAgICR7dG90YWxFdmVudENvdW50ID4gMyA/IGIyYAogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV2ZW50LWNvdW50Ij4ke3RvdGFsRXZlbnRDb3VudH08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgYCA6IGIyYAogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV2ZW50LWluZGljYXRvciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2RheUV2ZW50cy5zbGljZSgwLCAzKS5tYXAoKGV2ZW50KSA9PiBiMmAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZXZlbnQtZG90ICR7ZXZlbnQudHlwZSB8fCAiaW5mbyJ9Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGApfQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICBgfQogICAgICAgICAgICAgICAgICAgICAgICAke2RheUV2ZW50c1swXS50aXRsZSA/IGIyYAogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV2ZW50LXRvb2x0aXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtkYXlFdmVudHNbMF0udGl0bGV9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3RvdGFsRXZlbnRDb3VudCA+IDEgPyBiMmAgKCske3RvdGFsRXZlbnRDb3VudCAtIDF9IG1vcmUpYCA6ICIifQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIGA7CiAgfSl9CiAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgIDwhLS0gVGltZSBTZWxlY3RvciAtLT4KICAgICAgICAgICAgICAke2NvbXBvbmVudC5lbmFibGVUaW1lID8gYjJgCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aW1lLXNlbGVjdG9yIj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGltZS1zZWxlY3Rvci10aXRsZSI+VGltZTwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aW1lLWlucHV0cyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IAogICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibnVtYmVyIiAKICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJ0aW1lLWlucHV0IiAKICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZT0ke2NvbXBvbmVudC50aW1lRm9ybWF0ID09PSAiMTJoIiA/IChjb21wb25lbnQuc2VsZWN0ZWRIb3VyID09PSAwID8gMTIgOiBjb21wb25lbnQuc2VsZWN0ZWRIb3VyID4gMTIgPyBjb21wb25lbnQuc2VsZWN0ZWRIb3VyIC0gMTIgOiBjb21wb25lbnQuc2VsZWN0ZWRIb3VyKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIikgOiBjb21wb25lbnQuc2VsZWN0ZWRIb3VyLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKX0KICAgICAgICAgICAgICAgICAgICAgIEBpbnB1dD0keyhlMTEpID0+IGNvbXBvbmVudC5oYW5kbGVIb3VySW5wdXQoZTExKX0KICAgICAgICAgICAgICAgICAgICAgIG1pbj0iJHtjb21wb25lbnQudGltZUZvcm1hdCA9PT0gIjEyaCIgPyAxIDogMH0iCiAgICAgICAgICAgICAgICAgICAgICBtYXg9IiR7Y29tcG9uZW50LnRpbWVGb3JtYXQgPT09ICIxMmgiID8gMTIgOiAyM30iCiAgICAgICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGltZS1zZXBhcmF0b3IiPjo8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IAogICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibnVtYmVyIiAKICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJ0aW1lLWlucHV0IiAKICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZT0ke2NvbXBvbmVudC5zZWxlY3RlZE1pbnV0ZS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9CiAgICAgICAgICAgICAgICAgICAgICBAaW5wdXQ9JHsoZTExKSA9PiBjb21wb25lbnQuaGFuZGxlTWludXRlSW5wdXQoZTExKX0KICAgICAgICAgICAgICAgICAgICAgIG1pbj0iMCIKICAgICAgICAgICAgICAgICAgICAgIG1heD0iNTkiCiAgICAgICAgICAgICAgICAgICAgICBzdGVwPSIke2NvbXBvbmVudC5taW51dGVJbmNyZW1lbnQgfHwgMX0iCiAgICAgICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICAgICAgICAke2NvbXBvbmVudC50aW1lRm9ybWF0ID09PSAiMTJoIiA/IGIyYAogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYW0tcG0tc2VsZWN0b3IiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIAogICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJhbS1wbS1idXR0b24gJHtpc0FNID8gInNlbGVjdGVkIiA6ICIifSIKICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiBjb21wb25lbnQuc2V0QU1QTSgiYW0iKX0KICAgICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICAgIEFNCiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIAogICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJhbS1wbS1idXR0b24gJHshaXNBTSA/ICJzZWxlY3RlZCIgOiAiIn0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gY29tcG9uZW50LnNldEFNUE0oInBtIil9CiAgICAgICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICAgICBQTQogICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICBgIDogIiJ9CgogICAgICAgICAgICAgIDwhLS0gVGltZXpvbmUgU2VsZWN0b3IgLS0+CiAgICAgICAgICAgICAgJHtjb21wb25lbnQuZW5hYmxlVGltZXpvbmUgPyBiMmAKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpbWV6b25lLXNlbGVjdG9yIj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGltZXpvbmUtc2VsZWN0b3ItdGl0bGUiPlRpbWV6b25lPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxzZWxlY3QgCiAgICAgICAgICAgICAgICAgICAgY2xhc3M9InRpbWV6b25lLXNlbGVjdCIgCiAgICAgICAgICAgICAgICAgICAgLnZhbHVlPSR7Y29tcG9uZW50LnRpbWV6b25lfQogICAgICAgICAgICAgICAgICAgIEBjaGFuZ2U9JHsoZTExKSA9PiBjb21wb25lbnQuaGFuZGxlVGltZXpvbmVDaGFuZ2UoZTExKX0KICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICR7dGltZXpvbmVzLm1hcCgodHopID0+IGIyYAogICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iJHt0ei52YWx1ZX0iID9zZWxlY3RlZD0ke3R6LnZhbHVlID09PSBjb21wb25lbnQudGltZXpvbmV9PgogICAgICAgICAgICAgICAgICAgICAgICAke3R6LmxhYmVsfQogICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgYCl9CiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgYCA6ICIifQoKICAgICAgICAgICAgICA8IS0tIEFjdGlvbiBCdXR0b25zIC0tPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhbGVuZGFyLWFjdGlvbnMiPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWN0aW9uLWJ1dHRvbiB0b2RheS1idXR0b24iIEBjbGljaz0ke2NvbXBvbmVudC5zZWxlY3RUb2RheX0+CiAgICAgICAgICAgICAgICAgIFRvZGF5CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImFjdGlvbi1idXR0b24gY2xlYXItYnV0dG9uIiBAY2xpY2s9JHtjb21wb25lbnQuY2xlYXJ9PgogICAgICAgICAgICAgICAgICBDbGVhcgogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIGA7Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1kYXRlcGlja2VyL2NvbXBvbmVudC5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2RlZXNfaWNvbigpOwp2YXIgX19lc0RlY29yYXRlMTkgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczIwID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzSW5wdXREYXRlcGlja2VyID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLWlucHV0LWRhdGVwaWNrZXIiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0lucHV0QmFzZTsKICBsZXQgX3ZhbHVlX2RlY29yYXRvcnM7CiAgbGV0IF92YWx1ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lbmFibGVUaW1lX2RlY29yYXRvcnM7CiAgbGV0IF9lbmFibGVUaW1lX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZW5hYmxlVGltZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGltZUZvcm1hdF9kZWNvcmF0b3JzOwogIGxldCBfdGltZUZvcm1hdF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RpbWVGb3JtYXRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21pbnV0ZUluY3JlbWVudF9kZWNvcmF0b3JzOwogIGxldCBfbWludXRlSW5jcmVtZW50X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWludXRlSW5jcmVtZW50X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kYXRlRm9ybWF0X2RlY29yYXRvcnM7CiAgbGV0IF9kYXRlRm9ybWF0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGF0ZUZvcm1hdF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWluRGF0ZV9kZWNvcmF0b3JzOwogIGxldCBfbWluRGF0ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21pbkRhdGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21heERhdGVfZGVjb3JhdG9yczsKICBsZXQgX21heERhdGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYXhEYXRlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kaXNhYmxlZERhdGVzX2RlY29yYXRvcnM7CiAgbGV0IF9kaXNhYmxlZERhdGVzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGlzYWJsZWREYXRlc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfd2Vla1N0YXJ0c09uX2RlY29yYXRvcnM7CiAgbGV0IF93ZWVrU3RhcnRzT25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF93ZWVrU3RhcnRzT25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BsYWNlaG9sZGVyX2RlY29yYXRvcnM7CiAgbGV0IF9wbGFjZWhvbGRlcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BsYWNlaG9sZGVyX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lbmFibGVUaW1lem9uZV9kZWNvcmF0b3JzOwogIGxldCBfZW5hYmxlVGltZXpvbmVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lbmFibGVUaW1lem9uZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGltZXpvbmVfZGVjb3JhdG9yczsKICBsZXQgX3RpbWV6b25lX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGltZXpvbmVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2V2ZW50c19kZWNvcmF0b3JzOwogIGxldCBfZXZlbnRzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZXZlbnRzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc09wZW5lZF9kZWNvcmF0b3JzOwogIGxldCBfaXNPcGVuZWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc09wZW5lZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfb3BlbnNUb1RvcF9kZWNvcmF0b3JzOwogIGxldCBfb3BlbnNUb1RvcF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX29wZW5zVG9Ub3BfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkRGF0ZV9kZWNvcmF0b3JzOwogIGxldCBfc2VsZWN0ZWREYXRlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWREYXRlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92aWV3RGF0ZV9kZWNvcmF0b3JzOwogIGxldCBfdmlld0RhdGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92aWV3RGF0ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRIb3VyX2RlY29yYXRvcnM7CiAgbGV0IF9zZWxlY3RlZEhvdXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZEhvdXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkTWludXRlX2RlY29yYXRvcnM7CiAgbGV0IF9zZWxlY3RlZE1pbnV0ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkTWludXRlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNJbnB1dERhdGVwaWNrZXIyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfdmFsdWVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9lbmFibGVUaW1lX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3RpbWVGb3JtYXRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9taW51dGVJbmNyZW1lbnRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF9kYXRlRm9ybWF0X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfbWluRGF0ZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX21heERhdGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9kaXNhYmxlZERhdGVzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF93ZWVrU3RhcnRzT25fZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF9wbGFjZWhvbGRlcl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2VuYWJsZVRpbWV6b25lX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3RpbWV6b25lX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfZXZlbnRzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF9pc09wZW5lZF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfb3BlbnNUb1RvcF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfc2VsZWN0ZWREYXRlX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF92aWV3RGF0ZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfc2VsZWN0ZWRIb3VyX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9zZWxlY3RlZE1pbnV0ZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGUxOSh0aGlzLCBudWxsLCBfdmFsdWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmFsdWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInZhbHVlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZhbHVlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52YWx1ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF92YWx1ZV9pbml0aWFsaXplcnMsIF92YWx1ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE5KHRoaXMsIG51bGwsIF9lbmFibGVUaW1lX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImVuYWJsZVRpbWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImVuYWJsZVRpbWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZW5hYmxlVGltZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZW5hYmxlVGltZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9lbmFibGVUaW1lX2luaXRpYWxpemVycywgX2VuYWJsZVRpbWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxOSh0aGlzLCBudWxsLCBfdGltZUZvcm1hdF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0aW1lRm9ybWF0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0aW1lRm9ybWF0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRpbWVGb3JtYXQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnRpbWVGb3JtYXQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGltZUZvcm1hdF9pbml0aWFsaXplcnMsIF90aW1lRm9ybWF0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTkodGhpcywgbnVsbCwgX21pbnV0ZUluY3JlbWVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtaW51dGVJbmNyZW1lbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1pbnV0ZUluY3JlbWVudCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5taW51dGVJbmNyZW1lbnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1pbnV0ZUluY3JlbWVudCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9taW51dGVJbmNyZW1lbnRfaW5pdGlhbGl6ZXJzLCBfbWludXRlSW5jcmVtZW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTkodGhpcywgbnVsbCwgX2RhdGVGb3JtYXRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZGF0ZUZvcm1hdCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZGF0ZUZvcm1hdCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5kYXRlRm9ybWF0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kYXRlRm9ybWF0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2RhdGVGb3JtYXRfaW5pdGlhbGl6ZXJzLCBfZGF0ZUZvcm1hdF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE5KHRoaXMsIG51bGwsIF9taW5EYXRlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1pbkRhdGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1pbkRhdGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWluRGF0ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWluRGF0ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9taW5EYXRlX2luaXRpYWxpemVycywgX21pbkRhdGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxOSh0aGlzLCBudWxsLCBfbWF4RGF0ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtYXhEYXRlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtYXhEYXRlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1heERhdGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1heERhdGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWF4RGF0ZV9pbml0aWFsaXplcnMsIF9tYXhEYXRlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTkodGhpcywgbnVsbCwgX2Rpc2FibGVkRGF0ZXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZGlzYWJsZWREYXRlcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZGlzYWJsZWREYXRlcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5kaXNhYmxlZERhdGVzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kaXNhYmxlZERhdGVzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Rpc2FibGVkRGF0ZXNfaW5pdGlhbGl6ZXJzLCBfZGlzYWJsZWREYXRlc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE5KHRoaXMsIG51bGwsIF93ZWVrU3RhcnRzT25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAid2Vla1N0YXJ0c09uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ3ZWVrU3RhcnRzT24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoud2Vla1N0YXJ0c09uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai53ZWVrU3RhcnRzT24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfd2Vla1N0YXJ0c09uX2luaXRpYWxpemVycywgX3dlZWtTdGFydHNPbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE5KHRoaXMsIG51bGwsIF9wbGFjZWhvbGRlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwbGFjZWhvbGRlciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicGxhY2Vob2xkZXIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucGxhY2Vob2xkZXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnBsYWNlaG9sZGVyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3BsYWNlaG9sZGVyX2luaXRpYWxpemVycywgX3BsYWNlaG9sZGVyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTkodGhpcywgbnVsbCwgX2VuYWJsZVRpbWV6b25lX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImVuYWJsZVRpbWV6b25lIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJlbmFibGVUaW1lem9uZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5lbmFibGVUaW1lem9uZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZW5hYmxlVGltZXpvbmUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZW5hYmxlVGltZXpvbmVfaW5pdGlhbGl6ZXJzLCBfZW5hYmxlVGltZXpvbmVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxOSh0aGlzLCBudWxsLCBfdGltZXpvbmVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGltZXpvbmUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRpbWV6b25lIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRpbWV6b25lLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50aW1lem9uZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90aW1lem9uZV9pbml0aWFsaXplcnMsIF90aW1lem9uZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE5KHRoaXMsIG51bGwsIF9ldmVudHNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZXZlbnRzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJldmVudHMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZXZlbnRzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5ldmVudHMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZXZlbnRzX2luaXRpYWxpemVycywgX2V2ZW50c19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE5KHRoaXMsIG51bGwsIF9pc09wZW5lZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc09wZW5lZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNPcGVuZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNPcGVuZWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzT3BlbmVkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzT3BlbmVkX2luaXRpYWxpemVycywgX2lzT3BlbmVkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTkodGhpcywgbnVsbCwgX29wZW5zVG9Ub3BfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAib3BlbnNUb1RvcCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAib3BlbnNUb1RvcCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5vcGVuc1RvVG9wLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5vcGVuc1RvVG9wID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX29wZW5zVG9Ub3BfaW5pdGlhbGl6ZXJzLCBfb3BlbnNUb1RvcF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE5KHRoaXMsIG51bGwsIF9zZWxlY3RlZERhdGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0ZWREYXRlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3RlZERhdGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0ZWREYXRlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3RlZERhdGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0ZWREYXRlX2luaXRpYWxpemVycywgX3NlbGVjdGVkRGF0ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTE5KHRoaXMsIG51bGwsIF92aWV3RGF0ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2aWV3RGF0ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmlld0RhdGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmlld0RhdGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZpZXdEYXRlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZpZXdEYXRlX2luaXRpYWxpemVycywgX3ZpZXdEYXRlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTkodGhpcywgbnVsbCwgX3NlbGVjdGVkSG91cl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWxlY3RlZEhvdXIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlbGVjdGVkSG91ciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWxlY3RlZEhvdXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlbGVjdGVkSG91ciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWxlY3RlZEhvdXJfaW5pdGlhbGl6ZXJzLCBfc2VsZWN0ZWRIb3VyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMTkodGhpcywgbnVsbCwgX3NlbGVjdGVkTWludXRlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlbGVjdGVkTWludXRlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3RlZE1pbnV0ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWxlY3RlZE1pbnV0ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VsZWN0ZWRNaW51dGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0ZWRNaW51dGVfaW5pdGlhbGl6ZXJzLCBfc2VsZWN0ZWRNaW51dGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUxOShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNJbnB1dERhdGVwaWNrZXIyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMxMTsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJJbnB1dCJdOwogICAgI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF92YWx1ZV9pbml0aWFsaXplcnMsICIiKTsKICAgIGdldCB2YWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZW5hYmxlVGltZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfZW5hYmxlVGltZV9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgZW5hYmxlVGltZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2VuYWJsZVRpbWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBlbmFibGVUaW1lKHZhbHVlMikgewogICAgICB0aGlzLiNlbmFibGVUaW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdGltZUZvcm1hdF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX2VuYWJsZVRpbWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF90aW1lRm9ybWF0X2luaXRpYWxpemVycywgIjI0aCIpKTsKICAgIGdldCB0aW1lRm9ybWF0KCkgewogICAgICByZXR1cm4gdGhpcy4jdGltZUZvcm1hdF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRpbWVGb3JtYXQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3RpbWVGb3JtYXRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtaW51dGVJbmNyZW1lbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF90aW1lRm9ybWF0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfbWludXRlSW5jcmVtZW50X2luaXRpYWxpemVycywgMSkpOwogICAgZ2V0IG1pbnV0ZUluY3JlbWVudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21pbnV0ZUluY3JlbWVudF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1pbnV0ZUluY3JlbWVudCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWludXRlSW5jcmVtZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZGF0ZUZvcm1hdF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX21pbnV0ZUluY3JlbWVudF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX2RhdGVGb3JtYXRfaW5pdGlhbGl6ZXJzLCAiWVlZWS1NTS1ERCIpKTsKICAgIGdldCBkYXRlRm9ybWF0KCkgewogICAgICByZXR1cm4gdGhpcy4jZGF0ZUZvcm1hdF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGRhdGVGb3JtYXQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2RhdGVGb3JtYXRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtaW5EYXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfZGF0ZUZvcm1hdF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX21pbkRhdGVfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IG1pbkRhdGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtaW5EYXRlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWluRGF0ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWluRGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21heERhdGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF9taW5EYXRlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfbWF4RGF0ZV9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgbWF4RGF0ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21heERhdGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtYXhEYXRlKHZhbHVlMikgewogICAgICB0aGlzLiNtYXhEYXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZGlzYWJsZWREYXRlc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX21heERhdGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF9kaXNhYmxlZERhdGVzX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBkaXNhYmxlZERhdGVzKCkgewogICAgICByZXR1cm4gdGhpcy4jZGlzYWJsZWREYXRlc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGRpc2FibGVkRGF0ZXModmFsdWUyKSB7CiAgICAgIHRoaXMuI2Rpc2FibGVkRGF0ZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN3ZWVrU3RhcnRzT25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF9kaXNhYmxlZERhdGVzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfd2Vla1N0YXJ0c09uX2luaXRpYWxpemVycywgMSkpOwogICAgZ2V0IHdlZWtTdGFydHNPbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3dlZWtTdGFydHNPbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgLy8gRGVmYXVsdCB0byBNb25kYXkKICAgIHNldCB3ZWVrU3RhcnRzT24odmFsdWUyKSB7CiAgICAgIHRoaXMuI3dlZWtTdGFydHNPbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3BsYWNlaG9sZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfd2Vla1N0YXJ0c09uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfcGxhY2Vob2xkZXJfaW5pdGlhbGl6ZXJzLCAiWVlZWS1NTS1ERCIpKTsKICAgIGdldCBwbGFjZWhvbGRlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3BsYWNlaG9sZGVyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcGxhY2Vob2xkZXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3BsYWNlaG9sZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZW5hYmxlVGltZXpvbmVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF9wbGFjZWhvbGRlcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX2VuYWJsZVRpbWV6b25lX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBlbmFibGVUaW1lem9uZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2VuYWJsZVRpbWV6b25lX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZW5hYmxlVGltZXpvbmUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2VuYWJsZVRpbWV6b25lX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdGltZXpvbmVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF9lbmFibGVUaW1lem9uZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX3RpbWV6b25lX2luaXRpYWxpemVycywgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lKSk7CiAgICBnZXQgdGltZXpvbmUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0aW1lem9uZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRpbWV6b25lKHZhbHVlMikgewogICAgICB0aGlzLiN0aW1lem9uZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2V2ZW50c19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX3RpbWV6b25lX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfZXZlbnRzX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBldmVudHMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNldmVudHNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBldmVudHModmFsdWUyKSB7CiAgICAgIHRoaXMuI2V2ZW50c19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzT3BlbmVkX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfZXZlbnRzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfaXNPcGVuZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGlzT3BlbmVkKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNPcGVuZWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc09wZW5lZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXNPcGVuZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNvcGVuc1RvVG9wX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfaXNPcGVuZWRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF9vcGVuc1RvVG9wX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBvcGVuc1RvVG9wKCkgewogICAgICByZXR1cm4gdGhpcy4jb3BlbnNUb1RvcF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG9wZW5zVG9Ub3AodmFsdWUyKSB7CiAgICAgIHRoaXMuI29wZW5zVG9Ub3BfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWxlY3RlZERhdGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF9vcGVuc1RvVG9wX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfc2VsZWN0ZWREYXRlX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IHNlbGVjdGVkRGF0ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkRGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNlbGVjdGVkRGF0ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VsZWN0ZWREYXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdmlld0RhdGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF9zZWxlY3RlZERhdGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF92aWV3RGF0ZV9pbml0aWFsaXplcnMsIC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKSk7CiAgICBnZXQgdmlld0RhdGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2aWV3RGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZpZXdEYXRlKHZhbHVlMikgewogICAgICB0aGlzLiN2aWV3RGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NlbGVjdGVkSG91cl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjAodGhpcywgX3ZpZXdEYXRlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfc2VsZWN0ZWRIb3VyX2luaXRpYWxpemVycywgMCkpOwogICAgZ2V0IHNlbGVjdGVkSG91cigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkSG91cl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNlbGVjdGVkSG91cih2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VsZWN0ZWRIb3VyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0ZWRNaW51dGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF9zZWxlY3RlZEhvdXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczIwKHRoaXMsIF9zZWxlY3RlZE1pbnV0ZV9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBzZWxlY3RlZE1pbnV0ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkTWludXRlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0ZWRNaW51dGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlbGVjdGVkTWludXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gZGF0ZXBpY2tlclN0eWxlczsKICAgIGdldFRpbWV6b25lcygpIHsKICAgICAgcmV0dXJuIFsKICAgICAgICB7IHZhbHVlOiAiVVRDIiwgbGFiZWw6ICJVVEMgKENvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lKSIgfSwKICAgICAgICB7IHZhbHVlOiAiQW1lcmljYS9OZXdfWW9yayIsIGxhYmVsOiAiRWFzdGVybiBUaW1lIChVUyAmIENhbmFkYSkiIH0sCiAgICAgICAgeyB2YWx1ZTogIkFtZXJpY2EvQ2hpY2FnbyIsIGxhYmVsOiAiQ2VudHJhbCBUaW1lIChVUyAmIENhbmFkYSkiIH0sCiAgICAgICAgeyB2YWx1ZTogIkFtZXJpY2EvRGVudmVyIiwgbGFiZWw6ICJNb3VudGFpbiBUaW1lIChVUyAmIENhbmFkYSkiIH0sCiAgICAgICAgeyB2YWx1ZTogIkFtZXJpY2EvTG9zX0FuZ2VsZXMiLCBsYWJlbDogIlBhY2lmaWMgVGltZSAoVVMgJiBDYW5hZGEpIiB9LAogICAgICAgIHsgdmFsdWU6ICJBbWVyaWNhL1Bob2VuaXgiLCBsYWJlbDogIkFyaXpvbmEiIH0sCiAgICAgICAgeyB2YWx1ZTogIkFtZXJpY2EvQW5jaG9yYWdlIiwgbGFiZWw6ICJBbGFza2EiIH0sCiAgICAgICAgeyB2YWx1ZTogIlBhY2lmaWMvSG9ub2x1bHUiLCBsYWJlbDogIkhhd2FpaSIgfSwKICAgICAgICB7IHZhbHVlOiAiRXVyb3BlL0xvbmRvbiIsIGxhYmVsOiAiTG9uZG9uIiB9LAogICAgICAgIHsgdmFsdWU6ICJFdXJvcGUvUGFyaXMiLCBsYWJlbDogIlBhcmlzIiB9LAogICAgICAgIHsgdmFsdWU6ICJFdXJvcGUvQmVybGluIiwgbGFiZWw6ICJCZXJsaW4iIH0sCiAgICAgICAgeyB2YWx1ZTogIkV1cm9wZS9Nb3Njb3ciLCBsYWJlbDogIk1vc2NvdyIgfSwKICAgICAgICB7IHZhbHVlOiAiQXNpYS9EdWJhaSIsIGxhYmVsOiAiRHViYWkiIH0sCiAgICAgICAgeyB2YWx1ZTogIkFzaWEvS29sa2F0YSIsIGxhYmVsOiAiSW5kaWEgU3RhbmRhcmQgVGltZSIgfSwKICAgICAgICB7IHZhbHVlOiAiQXNpYS9TaGFuZ2hhaSIsIGxhYmVsOiAiQ2hpbmEgU3RhbmRhcmQgVGltZSIgfSwKICAgICAgICB7IHZhbHVlOiAiQXNpYS9Ub2t5byIsIGxhYmVsOiAiVG9reW8iIH0sCiAgICAgICAgeyB2YWx1ZTogIkF1c3RyYWxpYS9TeWRuZXkiLCBsYWJlbDogIlN5ZG5leSIgfSwKICAgICAgICB7IHZhbHVlOiAiUGFjaWZpYy9BdWNrbGFuZCIsIGxhYmVsOiAiQXVja2xhbmQiIH0KICAgICAgXTsKICAgIH0KICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIHJlbmRlckRhdGVwaWNrZXIodGhpcyk7CiAgICB9CiAgICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgdGhpcy5oYW5kbGVDbGlja091dHNpZGUgPSB0aGlzLmhhbmRsZUNsaWNrT3V0c2lkZS5iaW5kKHRoaXMpOwogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIiwgdGhpcy5oYW5kbGVDbGlja091dHNpZGUpOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKCkgewogICAgICBpZiAoIXRoaXMudmFsdWUpIHsKICAgICAgICB0aGlzLnZhbHVlID0gIiI7CiAgICAgIH0KICAgICAgaWYgKHRoaXMudmFsdWUpIHsKICAgICAgICB0cnkgewogICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRoaXMudmFsdWUpOwogICAgICAgICAgaWYgKCFpc05hTihkYXRlLmdldFRpbWUoKSkpIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBkYXRlOwogICAgICAgICAgICB0aGlzLnZpZXdEYXRlID0gbmV3IERhdGUoZGF0ZSk7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRIb3VyID0gZGF0ZS5nZXRIb3VycygpOwogICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWludXRlID0gZGF0ZS5nZXRNaW51dGVzKCk7CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IG5vdzIgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTsKICAgICAgICB0aGlzLnZpZXdEYXRlID0gbmV3IERhdGUobm93Mik7CiAgICAgICAgdGhpcy5zZWxlY3RlZEhvdXIgPSBub3cyLmdldEhvdXJzKCk7CiAgICAgICAgdGhpcy5zZWxlY3RlZE1pbnV0ZSA9IDA7CiAgICAgIH0KICAgIH0KICAgIGZvcm1hdERhdGUoaXNvU3RyaW5nKSB7CiAgICAgIGlmICghaXNvU3RyaW5nKQogICAgICAgIHJldHVybiAiIjsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoaXNvU3RyaW5nKTsKICAgICAgICBpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKQogICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIGxldCBmb3JtYXR0ZWQgPSB0aGlzLmRhdGVGb3JtYXQ7CiAgICAgICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpOwogICAgICAgIGNvbnN0IG1vbnRoID0gKGRhdGUuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKTsKICAgICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCk7CiAgICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoIllZWVkiLCB5ZWFyKTsKICAgICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgiWVkiLCB5ZWFyLnNsaWNlKC0yKSk7CiAgICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoIk1NIiwgbW9udGgpOwogICAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKCJERCIsIGRheSk7CiAgICAgICAgaWYgKHRoaXMuZW5hYmxlVGltZSkgewogICAgICAgICAgY29uc3QgaG91cnMyNCA9IGRhdGUuZ2V0SG91cnMoKTsKICAgICAgICAgIGNvbnN0IGhvdXJzMTIgPSBob3VyczI0ID09PSAwID8gMTIgOiBob3VyczI0ID4gMTIgPyBob3VyczI0IC0gMTIgOiBob3VyczI0OwogICAgICAgICAgY29uc3QgbWludXRlcyA9IGRhdGUuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKTsKICAgICAgICAgIGNvbnN0IGFtcG0gPSBob3VyczI0ID49IDEyID8gIlBNIiA6ICJBTSI7CiAgICAgICAgICBpZiAodGhpcy50aW1lRm9ybWF0ID09PSAiMTJoIikgewogICAgICAgICAgICBmb3JtYXR0ZWQgKz0gYCAke2hvdXJzMTJ9OiR7bWludXRlc30gJHthbXBtfWA7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3JtYXR0ZWQgKz0gYCAke2hvdXJzMjQudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfToke21pbnV0ZXN9YDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuZW5hYmxlVGltZXpvbmUpIHsKICAgICAgICAgIGNvbnN0IGZvcm1hdHRlcjIgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgiZW4tVVMiLCB7CiAgICAgICAgICAgIHRpbWVab25lTmFtZTogInNob3J0IiwKICAgICAgICAgICAgdGltZVpvbmU6IHRoaXMudGltZXpvbmUKICAgICAgICAgIH0pOwogICAgICAgICAgY29uc3QgcGFydHMgPSBmb3JtYXR0ZXIyLmZvcm1hdFRvUGFydHMoZGF0ZSk7CiAgICAgICAgICBjb25zdCB0elBhcnQgPSBwYXJ0cy5maW5kKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICJ0aW1lWm9uZU5hbWUiKTsKICAgICAgICAgIGlmICh0elBhcnQpIHsKICAgICAgICAgICAgZm9ybWF0dGVkICs9IGAgJHt0elBhcnQudmFsdWV9YDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZDsKICAgICAgfSBjYXRjaCB7CiAgICAgICAgcmV0dXJuICIiOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVDbGlja091dHNpZGUgPSAoX19ydW5Jbml0aWFsaXplcnMyMCh0aGlzLCBfc2VsZWN0ZWRNaW51dGVfZXh0cmFJbml0aWFsaXplcnMpLCAoZXZlbnQpID0+IHsKICAgICAgY29uc3QgcGF0aDIgPSBldmVudC5jb21wb3NlZFBhdGgoKTsKICAgICAgaWYgKCFwYXRoMi5pbmNsdWRlcyh0aGlzKSkgewogICAgICAgIHRoaXMuaXNPcGVuZWQgPSBmYWxzZTsKICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlKTsKICAgICAgfQogICAgfSk7CiAgICBhc3luYyB0b2dnbGVDYWxlbmRhcigpIHsKICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLmlzT3BlbmVkID0gIXRoaXMuaXNPcGVuZWQ7CiAgICAgIGlmICh0aGlzLmlzT3BlbmVkKSB7CiAgICAgICAgY29uc3QgaW5wdXRDb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmlucHV0LWNvbnRhaW5lciIpOwogICAgICAgIGNvbnN0IHJlY3QgPSBpbnB1dENvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBjb25zdCBzcGFjZUJlbG93ID0gd2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC5ib3R0b207CiAgICAgICAgY29uc3Qgc3BhY2VBYm92ZSA9IHJlY3QudG9wOwogICAgICAgIHRoaXMub3BlbnNUb1RvcCA9IHNwYWNlQmVsb3cgPCA0MDAgJiYgc3BhY2VBYm92ZSA+IHNwYWNlQmVsb3c7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlKTsKICAgICAgICB9LCAwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlKTsKICAgICAgfQogICAgfQogICAgZ2V0RGF5c0luTW9udGgoKSB7CiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLnZpZXdEYXRlLmdldEZ1bGxZZWFyKCk7CiAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy52aWV3RGF0ZS5nZXRNb250aCgpOwogICAgICBjb25zdCBmaXJzdERheSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTsKICAgICAgY29uc3QgbGFzdERheSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMCk7CiAgICAgIGNvbnN0IGRheXMyID0gW107CiAgICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gdGhpcy53ZWVrU3RhcnRzT24gPT09IDEgPyBmaXJzdERheS5nZXREYXkoKSA9PT0gMCA/IDYgOiBmaXJzdERheS5nZXREYXkoKSAtIDEgOiBmaXJzdERheS5nZXREYXkoKTsKICAgICAgZm9yIChsZXQgaTExID0gc3RhcnRPZmZzZXQ7IGkxMSA+IDA7IGkxMS0tKSB7CiAgICAgICAgZGF5czIucHVzaChuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSAtIGkxMSkpOwogICAgICB9CiAgICAgIGZvciAobGV0IGkxMSA9IDE7IGkxMSA8PSBsYXN0RGF5LmdldERhdGUoKTsgaTExKyspIHsKICAgICAgICBkYXlzMi5wdXNoKG5ldyBEYXRlKHllYXIsIG1vbnRoLCBpMTEpKTsKICAgICAgfQogICAgICBjb25zdCByZW1haW5pbmdEYXlzID0gNDIgLSBkYXlzMi5sZW5ndGg7CiAgICAgIGZvciAobGV0IGkxMSA9IDE7IGkxMSA8PSByZW1haW5pbmdEYXlzOyBpMTErKykgewogICAgICAgIGRheXMyLnB1c2gobmV3IERhdGUoeWVhciwgbW9udGggKyAxLCBpMTEpKTsKICAgICAgfQogICAgICByZXR1cm4gZGF5czI7CiAgICB9CiAgICBpc1RvZGF5KGRhdGUpIHsKICAgICAgY29uc3QgdG9kYXkgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTsKICAgICAgcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpID09PSB0b2RheS5nZXREYXRlKCkgJiYgZGF0ZS5nZXRNb250aCgpID09PSB0b2RheS5nZXRNb250aCgpICYmIGRhdGUuZ2V0RnVsbFllYXIoKSA9PT0gdG9kYXkuZ2V0RnVsbFllYXIoKTsKICAgIH0KICAgIGlzU2VsZWN0ZWQoZGF0ZSkgewogICAgICBpZiAoIXRoaXMuc2VsZWN0ZWREYXRlKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpID09PSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXREYXRlKCkgJiYgZGF0ZS5nZXRNb250aCgpID09PSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRNb250aCgpICYmIGRhdGUuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5zZWxlY3RlZERhdGUuZ2V0RnVsbFllYXIoKTsKICAgIH0KICAgIGlzRGlzYWJsZWQoZGF0ZSkgewogICAgICBpZiAodGhpcy5taW5EYXRlKSB7CiAgICAgICAgY29uc3QgbWluMyA9IG5ldyBEYXRlKHRoaXMubWluRGF0ZSk7CiAgICAgICAgaWYgKGRhdGUgPCBtaW4zKQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKHRoaXMubWF4RGF0ZSkgewogICAgICAgIGNvbnN0IG1heDMgPSBuZXcgRGF0ZSh0aGlzLm1heERhdGUpOwogICAgICAgIGlmIChkYXRlID4gbWF4MykKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF0ZXMgJiYgdGhpcy5kaXNhYmxlZERhdGVzLmxlbmd0aCA+IDApIHsKICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZERhdGVzLnNvbWUoKGRpc2FibGVkU3RyKSA9PiB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBkaXNhYmxlZDIgPSBuZXcgRGF0ZShkaXNhYmxlZFN0cik7CiAgICAgICAgICAgIHJldHVybiBkYXRlLmdldERhdGUoKSA9PT0gZGlzYWJsZWQyLmdldERhdGUoKSAmJiBkYXRlLmdldE1vbnRoKCkgPT09IGRpc2FibGVkMi5nZXRNb250aCgpICYmIGRhdGUuZ2V0RnVsbFllYXIoKSA9PT0gZGlzYWJsZWQyLmdldEZ1bGxZZWFyKCk7CiAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGdldEV2ZW50c0ZvckRhdGUoZGF0ZSkgewogICAgICBpZiAoIXRoaXMuZXZlbnRzIHx8IHRoaXMuZXZlbnRzLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm4gW107CiAgICAgIGNvbnN0IGRhdGVTdHIgPSBgJHtkYXRlLmdldEZ1bGxZZWFyKCl9LSR7KGRhdGUuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKX0tJHtkYXRlLmdldERhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9YDsKICAgICAgcmV0dXJuIHRoaXMuZXZlbnRzLmZpbHRlcigoZXZlbnQpID0+IGV2ZW50LmRhdGUgPT09IGRhdGVTdHIpOwogICAgfQogICAgc2VsZWN0RGF0ZShkYXRlKSB7CiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpLCB0aGlzLnNlbGVjdGVkSG91ciwgdGhpcy5zZWxlY3RlZE1pbnV0ZSk7CiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmZvcm1hdFZhbHVlV2l0aFRpbWV6b25lKHRoaXMuc2VsZWN0ZWREYXRlKTsKICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgIGlmICghdGhpcy5lbmFibGVUaW1lKSB7CiAgICAgICAgdGhpcy5pc09wZW5lZCA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBzZWxlY3RUb2RheSgpIHsKICAgICAgY29uc3QgdG9kYXkgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTsKICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSB0b2RheTsKICAgICAgdGhpcy52aWV3RGF0ZSA9IG5ldyBEYXRlKHRvZGF5KTsKICAgICAgdGhpcy5zZWxlY3RlZEhvdXIgPSB0b2RheS5nZXRIb3VycygpOwogICAgICB0aGlzLnNlbGVjdGVkTWludXRlID0gdG9kYXkuZ2V0TWludXRlcygpOwogICAgICB0aGlzLnZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZVdpdGhUaW1lem9uZSh0aGlzLnNlbGVjdGVkRGF0ZSk7CiAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMpOwogICAgICBpZiAoIXRoaXMuZW5hYmxlVGltZSkgewogICAgICAgIHRoaXMuaXNPcGVuZWQgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgY2xlYXIoKSB7CiAgICAgIHRoaXMudmFsdWUgPSAiIjsKICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBudWxsOwogICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgICAgdGhpcy5pc09wZW5lZCA9IGZhbHNlOwogICAgfQogICAgcHJldmlvdXNNb250aCgpIHsKICAgICAgdGhpcy52aWV3RGF0ZSA9IG5ldyBEYXRlKHRoaXMudmlld0RhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy52aWV3RGF0ZS5nZXRNb250aCgpIC0gMSwgMSk7CiAgICB9CiAgICBuZXh0TW9udGgoKSB7CiAgICAgIHRoaXMudmlld0RhdGUgPSBuZXcgRGF0ZSh0aGlzLnZpZXdEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMudmlld0RhdGUuZ2V0TW9udGgoKSArIDEsIDEpOwogICAgfQogICAgaGFuZGxlSG91cklucHV0KGUxMSkgewogICAgICBjb25zdCBpbnB1dCA9IGUxMS50YXJnZXQ7CiAgICAgIGxldCB2YWx1ZTIgPSBwYXJzZUludChpbnB1dC52YWx1ZSkgfHwgMDsKICAgICAgaWYgKHRoaXMudGltZUZvcm1hdCA9PT0gIjEyaCIpIHsKICAgICAgICB2YWx1ZTIgPSBNYXRoLm1heCgxLCBNYXRoLm1pbigxMiwgdmFsdWUyKSk7CiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRIb3VyID49IDEyICYmIHZhbHVlMiAhPT0gMTIpIHsKICAgICAgICAgIHRoaXMuc2VsZWN0ZWRIb3VyID0gdmFsdWUyICsgMTI7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkSG91ciA8IDEyICYmIHZhbHVlMiA9PT0gMTIpIHsKICAgICAgICAgIHRoaXMuc2VsZWN0ZWRIb3VyID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5zZWxlY3RlZEhvdXIgPSB2YWx1ZTI7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc2VsZWN0ZWRIb3VyID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjMsIHZhbHVlMikpOwogICAgICB9CiAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWREYXRlVGltZSgpOwogICAgfQogICAgaGFuZGxlTWludXRlSW5wdXQoZTExKSB7CiAgICAgIGNvbnN0IGlucHV0ID0gZTExLnRhcmdldDsKICAgICAgbGV0IHZhbHVlMiA9IHBhcnNlSW50KGlucHV0LnZhbHVlKSB8fCAwOwogICAgICB2YWx1ZTIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbig1OSwgdmFsdWUyKSk7CiAgICAgIGlmICh0aGlzLm1pbnV0ZUluY3JlbWVudCAmJiB0aGlzLm1pbnV0ZUluY3JlbWVudCA+IDEpIHsKICAgICAgICB2YWx1ZTIgPSBNYXRoLnJvdW5kKHZhbHVlMiAvIHRoaXMubWludXRlSW5jcmVtZW50KSAqIHRoaXMubWludXRlSW5jcmVtZW50OwogICAgICB9CiAgICAgIHRoaXMuc2VsZWN0ZWRNaW51dGUgPSB2YWx1ZTI7CiAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWREYXRlVGltZSgpOwogICAgfQogICAgc2V0QU1QTShwZXJpb2QpIHsKICAgICAgaWYgKHBlcmlvZCA9PT0gImFtIiAmJiB0aGlzLnNlbGVjdGVkSG91ciA+PSAxMikgewogICAgICAgIHRoaXMuc2VsZWN0ZWRIb3VyIC09IDEyOwogICAgICB9IGVsc2UgaWYgKHBlcmlvZCA9PT0gInBtIiAmJiB0aGlzLnNlbGVjdGVkSG91ciA8IDEyKSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZEhvdXIgKz0gMTI7CiAgICAgIH0KICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZERhdGVUaW1lKCk7CiAgICB9CiAgICB1cGRhdGVTZWxlY3RlZERhdGVUaW1lKCkgewogICAgICBpZiAodGhpcy5zZWxlY3RlZERhdGUpIHsKICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMuc2VsZWN0ZWREYXRlLmdldE1vbnRoKCksIHRoaXMuc2VsZWN0ZWREYXRlLmdldERhdGUoKSwgdGhpcy5zZWxlY3RlZEhvdXIsIHRoaXMuc2VsZWN0ZWRNaW51dGUpOwogICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmZvcm1hdFZhbHVlV2l0aFRpbWV6b25lKHRoaXMuc2VsZWN0ZWREYXRlKTsKICAgICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgICAgfQogICAgfQogICAgaGFuZGxlVGltZXpvbmVDaGFuZ2UoZTExKSB7CiAgICAgIGNvbnN0IHNlbGVjdCA9IGUxMS50YXJnZXQ7CiAgICAgIHRoaXMudGltZXpvbmUgPSBzZWxlY3QudmFsdWU7CiAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWREYXRlVGltZSgpOwogICAgfQogICAgZm9ybWF0VmFsdWVXaXRoVGltZXpvbmUoZGF0ZSkgewogICAgICBpZiAoIXRoaXMuZW5hYmxlVGltZXpvbmUpIHsKICAgICAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpOwogICAgICB9CiAgICAgIGNvbnN0IGZvcm1hdHRlcjIgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgiZW4tVVMiLCB7CiAgICAgICAgeWVhcjogIm51bWVyaWMiLAogICAgICAgIG1vbnRoOiAiMi1kaWdpdCIsCiAgICAgICAgZGF5OiAiMi1kaWdpdCIsCiAgICAgICAgaG91cjogIjItZGlnaXQiLAogICAgICAgIG1pbnV0ZTogIjItZGlnaXQiLAogICAgICAgIHNlY29uZDogIjItZGlnaXQiLAogICAgICAgIGhvdXIxMjogZmFsc2UsCiAgICAgICAgdGltZVpvbmU6IHRoaXMudGltZXpvbmUsCiAgICAgICAgdGltZVpvbmVOYW1lOiAic2hvcnQiCiAgICAgIH0pOwogICAgICBjb25zdCBwYXJ0cyA9IGZvcm1hdHRlcjIuZm9ybWF0VG9QYXJ0cyhkYXRlKTsKICAgICAgY29uc3QgZGF0ZVBhcnRzID0ge307CiAgICAgIHBhcnRzLmZvckVhY2goKHBhcnQpID0+IHsKICAgICAgICBkYXRlUGFydHNbcGFydC50eXBlXSA9IHBhcnQudmFsdWU7CiAgICAgIH0pOwogICAgICBjb25zdCBpc29TdHJpbmcgPSBgJHtkYXRlUGFydHMueWVhcn0tJHtkYXRlUGFydHMubW9udGh9LSR7ZGF0ZVBhcnRzLmRheX1UJHtkYXRlUGFydHMuaG91cn06JHtkYXRlUGFydHMubWludXRlfToke2RhdGVQYXJ0cy5zZWNvbmR9YDsKICAgICAgY29uc3QgdHpPZmZzZXQgPSB0aGlzLmdldFRpbWV6b25lT2Zmc2V0KGRhdGUsIHRoaXMudGltZXpvbmUpOwogICAgICByZXR1cm4gYCR7aXNvU3RyaW5nfSR7dHpPZmZzZXR9YDsKICAgIH0KICAgIGdldFRpbWV6b25lT2Zmc2V0KGRhdGUsIHRpbWV6b25lKSB7CiAgICAgIGNvbnN0IHR6RGF0ZSA9IG5ldyBEYXRlKGRhdGUudG9Mb2NhbGVTdHJpbmcoImVuLVVTIiwgeyB0aW1lWm9uZTogdGltZXpvbmUgfSkpOwogICAgICBjb25zdCB1dGNEYXRlID0gbmV3IERhdGUoZGF0ZS50b0xvY2FsZVN0cmluZygiZW4tVVMiLCB7IHRpbWVab25lOiAiVVRDIiB9KSk7CiAgICAgIGNvbnN0IG9mZnNldE1pbnV0ZXMgPSAodHpEYXRlLmdldFRpbWUoKSAtIHV0Y0RhdGUuZ2V0VGltZSgpKSAvICgxZTMgKiA2MCk7CiAgICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcihNYXRoLmFicyhvZmZzZXRNaW51dGVzKSAvIDYwKTsKICAgICAgY29uc3QgbWludXRlcyA9IE1hdGguYWJzKG9mZnNldE1pbnV0ZXMpICUgNjA7CiAgICAgIGNvbnN0IHNpZ24gPSBvZmZzZXRNaW51dGVzID49IDAgPyAiKyIgOiAiLSI7CiAgICAgIHJldHVybiBgJHtzaWdufSR7aG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfToke21pbnV0ZXMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfWA7CiAgICB9CiAgICBoYW5kbGVLZXlkb3duKGUxMSkgewogICAgICBpZiAoZTExLmtleSA9PT0gIkVudGVyIiB8fCBlMTEua2V5ID09PSAiICIpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICB0aGlzLnRvZ2dsZUNhbGVuZGFyKCk7CiAgICAgIH0gZWxzZSBpZiAoZTExLmtleSA9PT0gIkVzY2FwZSIgJiYgdGhpcy5pc09wZW5lZCkgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMuaXNPcGVuZWQgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgY2xlYXJWYWx1ZShlMTEpIHsKICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICB0aGlzLnZhbHVlID0gIiI7CiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDsKICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICB9CiAgICBoYW5kbGVNYW51YWxJbnB1dChlMTEpIHsKICAgICAgY29uc3QgaW5wdXQgPSBlMTEudGFyZ2V0OwogICAgICBjb25zdCBpbnB1dFZhbHVlID0gaW5wdXQudmFsdWUudHJpbSgpOwogICAgICBpZiAoIWlucHV0VmFsdWUpIHsKICAgICAgICB0aGlzLnZhbHVlID0gIiI7CiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBudWxsOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBwYXJzZWREYXRlID0gdGhpcy5wYXJzZU1hbnVhbERhdGUoaW5wdXRWYWx1ZSk7CiAgICAgIGlmIChwYXJzZWREYXRlICYmICFpc05hTihwYXJzZWREYXRlLmdldFRpbWUoKSkpIHsKICAgICAgICB0aGlzLnZhbHVlID0gcGFyc2VkRGF0ZS50b0lTT1N0cmluZygpOwogICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gcGFyc2VkRGF0ZTsKICAgICAgICB0aGlzLnZpZXdEYXRlID0gbmV3IERhdGUocGFyc2VkRGF0ZSk7CiAgICAgICAgdGhpcy5zZWxlY3RlZEhvdXIgPSBwYXJzZWREYXRlLmdldEhvdXJzKCk7CiAgICAgICAgdGhpcy5zZWxlY3RlZE1pbnV0ZSA9IHBhcnNlZERhdGUuZ2V0TWludXRlcygpOwogICAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMpOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVJbnB1dEJsdXIoZTExKSB7CiAgICAgIGNvbnN0IGlucHV0ID0gZTExLnRhcmdldDsKICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IGlucHV0LnZhbHVlLnRyaW0oKTsKICAgICAgaWYgKCFpbnB1dFZhbHVlKSB7CiAgICAgICAgdGhpcy52YWx1ZSA9ICIiOwogICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDsKICAgICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMucGFyc2VNYW51YWxEYXRlKGlucHV0VmFsdWUpOwogICAgICBpZiAocGFyc2VkRGF0ZSAmJiAhaXNOYU4ocGFyc2VkRGF0ZS5nZXRUaW1lKCkpKSB7CiAgICAgICAgdGhpcy52YWx1ZSA9IHBhcnNlZERhdGUudG9JU09TdHJpbmcoKTsKICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHBhcnNlZERhdGU7CiAgICAgICAgdGhpcy52aWV3RGF0ZSA9IG5ldyBEYXRlKHBhcnNlZERhdGUpOwogICAgICAgIHRoaXMuc2VsZWN0ZWRIb3VyID0gcGFyc2VkRGF0ZS5nZXRIb3VycygpOwogICAgICAgIHRoaXMuc2VsZWN0ZWRNaW51dGUgPSBwYXJzZWREYXRlLmdldE1pbnV0ZXMoKTsKICAgICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgICAgICBpbnB1dC52YWx1ZSA9IHRoaXMuZm9ybWF0RGF0ZSh0aGlzLnZhbHVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbnB1dC52YWx1ZSA9IHRoaXMuZm9ybWF0RGF0ZSh0aGlzLnZhbHVlKTsKICAgICAgfQogICAgfQogICAgcGFyc2VNYW51YWxEYXRlKGlucHV0KSB7CiAgICAgIGlmICghaW5wdXQpCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIGNvbnN0IHBhcnRzID0gaW5wdXQuc3BsaXQoIiAiKTsKICAgICAgbGV0IGRhdGVQYXJ0ID0gcGFydHNbMF07CiAgICAgIGxldCB0aW1lUGFydCA9IHBhcnRzWzFdIHx8ICIiOwogICAgICBsZXQgcGFyc2VkRGF0ZSA9IG51bGw7CiAgICAgIGNvbnN0IGlzb01hdGNoID0gZGF0ZVBhcnQubWF0Y2goL14oXGR7NH0pLShcZHsxLDJ9KS0oXGR7MSwyfSkkLyk7CiAgICAgIGlmIChpc29NYXRjaCkgewogICAgICAgIGNvbnN0IFtfNSwgeWVhciwgbW9udGgsIGRheV0gPSBpc29NYXRjaDsKICAgICAgICBwYXJzZWREYXRlID0gbmV3IERhdGUocGFyc2VJbnQoeWVhciksIHBhcnNlSW50KG1vbnRoKSAtIDEsIHBhcnNlSW50KGRheSkpOwogICAgICB9CiAgICAgIGlmICghcGFyc2VkRGF0ZSkgewogICAgICAgIGNvbnN0IGV1TWF0Y2ggPSBkYXRlUGFydC5tYXRjaCgvXihcZHsxLDJ9KVwuKFxkezEsMn0pXC4oXGR7NH0pJC8pOwogICAgICAgIGlmIChldU1hdGNoKSB7CiAgICAgICAgICBjb25zdCBbXzUsIGRheSwgbW9udGgsIHllYXJdID0gZXVNYXRjaDsKICAgICAgICAgIHBhcnNlZERhdGUgPSBuZXcgRGF0ZShwYXJzZUludCh5ZWFyKSwgcGFyc2VJbnQobW9udGgpIC0gMSwgcGFyc2VJbnQoZGF5KSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghcGFyc2VkRGF0ZSkgewogICAgICAgIGNvbnN0IHVzTWF0Y2ggPSBkYXRlUGFydC5tYXRjaCgvXihcZHsxLDJ9KVwvKFxkezEsMn0pXC8oXGR7NH0pJC8pOwogICAgICAgIGlmICh1c01hdGNoKSB7CiAgICAgICAgICBjb25zdCBbXzUsIG1vbnRoLCBkYXksIHllYXJdID0gdXNNYXRjaDsKICAgICAgICAgIHBhcnNlZERhdGUgPSBuZXcgRGF0ZShwYXJzZUludCh5ZWFyKSwgcGFyc2VJbnQobW9udGgpIC0gMSwgcGFyc2VJbnQoZGF5KSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghcGFyc2VkRGF0ZSB8fCBpc05hTihwYXJzZWREYXRlLmdldFRpbWUoKSkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAodGltZVBhcnQpIHsKICAgICAgICBjb25zdCB0aW1lTWF0Y2ggPSB0aW1lUGFydC5tYXRjaCgvXihcZHsxLDJ9KTooXGR7Mn0pJC8pOwogICAgICAgIGlmICh0aW1lTWF0Y2gpIHsKICAgICAgICAgIGNvbnN0IFtfNSwgaG91cnMsIG1pbnV0ZXNdID0gdGltZU1hdGNoOwogICAgICAgICAgcGFyc2VkRGF0ZS5zZXRIb3VycyhwYXJzZUludChob3VycykpOwogICAgICAgICAgcGFyc2VkRGF0ZS5zZXRNaW51dGVzKHBhcnNlSW50KG1pbnV0ZXMpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZW5hYmxlVGltZSkgewogICAgICAgIGNvbnN0IG5vdzIgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTsKICAgICAgICBwYXJzZWREYXRlLnNldEhvdXJzKG5vdzIuZ2V0SG91cnMoKSk7CiAgICAgICAgcGFyc2VkRGF0ZS5zZXRNaW51dGVzKG5vdzIuZ2V0TWludXRlcygpKTsKICAgICAgICBwYXJzZWREYXRlLnNldFNlY29uZHMoMCk7CiAgICAgICAgcGFyc2VkRGF0ZS5zZXRNaWxsaXNlY29uZHMoMCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnNlZERhdGU7CiAgICB9CiAgICBnZXRWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMudmFsdWU7CiAgICB9CiAgICBzZXRWYWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlMjsKICAgICAgaWYgKHZhbHVlMikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUyKTsKICAgICAgICAgIGlmICghaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gZGF0ZTsKICAgICAgICAgICAgdGhpcy52aWV3RGF0ZSA9IG5ldyBEYXRlKGRhdGUpOwogICAgICAgICAgICB0aGlzLnNlbGVjdGVkSG91ciA9IGRhdGUuZ2V0SG91cnMoKTsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1pbnV0ZSA9IGRhdGUuZ2V0TWludXRlcygpOwogICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggewogICAgICAgIH0KICAgICAgfQogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnMyMChfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0lucHV0RGF0ZXBpY2tlcjIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtdGV4dC9kZWVzLWlucHV0LXRleHQuZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmMxMiA9ICgpID0+IGIyYAogIDxzdHlsZT4KICAgICR7aWAKICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMjAwcHg7CiAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgIH0KICAgICAgCiAgICAgIGRlZXMtcGFuZWwgewogICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIGRlZXMtcGFuZWw6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgfQogICAgICAKICAgICAgLmhvcml6b250YWwtZ3JvdXAgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDE2cHg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CiAgICAgIAogICAgICAuaW5wdXQtZ3JvdXAgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5ncmlkLWxheW91dCB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgICAgICAgZ2FwOiAxNnB4OwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHsKICAgICAgICAuZ3JpZC1sYXlvdXQgewogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICAuaW50ZXJhY3RpdmUtc2VjdGlvbiB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMjE1IDIwLjIlIDE2LjglKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICB9CiAgICAgIAogICAgICAub3V0cHV0LXRleHQgewogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSAyNi43JSkiLCAiaHNsKDIxMCA0MCUgODAlKSIpfTsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk4JSkiLCAiaHNsKDIxNSAyMC4yJSAxMS44JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDI0cHg7CiAgICAgIH0KICAgIGB9CiAgPC9zdHlsZT4KICAKICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IGlucHV0cyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1pbnB1dC10ZXh0Iik7CiAgaW5wdXRzLmZvckVhY2goKGlucHV0KSA9PiB7CiAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VTdWJqZWN0IiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKGBJbnB1dCAiJHtpbnB1dC5sYWJlbH0iIGNoYW5nZWQgdG86YCwgaW5wdXQuZ2V0VmFsdWUoKSk7CiAgICB9KTsKICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLCAoKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKGBJbnB1dCAiJHtpbnB1dC5sYWJlbH0iIGxvc3QgZm9jdXNgKTsKICAgIH0pOwogIH0pOwogIGNvbnN0IHBhc3N3b3JkSW5wdXQgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoJ2RlZXMtaW5wdXQtdGV4dFtrZXk9InBhc3N3b3JkIl0nKTsKICBpZiAocGFzc3dvcmRJbnB1dCkgewogICAgY29uc29sZS5sb2coIlBhc3N3b3JkIGlucHV0IGluY2x1ZGVzIHZpc2liaWxpdHkgdG9nZ2xlIik7CiAgfQp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkJhc2ljIFRleHQgSW5wdXRzIn0gLnN1YnRpdGxlPSR7IlN0YW5kYXJkIHRleHQgaW5wdXRzIHdpdGggbGFiZWxzIGFuZCBkZXNjcmlwdGlvbnMifT4KICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0CiAgICAgICAgICAgIC5sYWJlbD0keyJVc2VybmFtZSJ9CiAgICAgICAgICAgIC52YWx1ZT0keyJqb2huZG9lIn0KICAgICAgICAgICAgLmtleT0keyJ1c2VybmFtZSJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dAogICAgICAgICAgICAubGFiZWw9JHsiRW1haWwgQWRkcmVzcyJ9CiAgICAgICAgICAgIC52YWx1ZT0keyJqb2huQGV4YW1wbGUuY29tIn0KICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IldlIHdpbGwgbmV2ZXIgc2hhcmUgeW91ciBlbWFpbCB3aXRoIGFueW9uZSJ9CiAgICAgICAgICAgIC5rZXk9JHsiZW1haWwifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgoKICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQKICAgICAgICAgICAgLmxhYmVsPSR7IlBhc3N3b3JkIn0KICAgICAgICAgICAgLmlzUGFzc3dvcmRCb29sPSR7dHJ1ZX0KICAgICAgICAgICAgLnZhbHVlPSR7InNlY3JldDEyMyJ9CiAgICAgICAgICAgIC5rZXk9JHsicGFzc3dvcmQifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgICAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgaG9yaXpvbnRhbElucHV0cyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1pbnB1dC10ZXh0Iik7CiAgaG9yaXpvbnRhbElucHV0cy5mb3JFYWNoKChpbnB1dCkgPT4gewogICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGlucHV0KTsKICAgIGNvbnNvbGUubG9nKGBIb3Jpem9udGFsIGlucHV0ICIke2lucHV0LmxhYmVsfSIgZGlzcGxheTpgLCBjb21wdXRlZFN0eWxlLmRpc3BsYXkpOwogIH0pOwogIGNvbnN0IGZpcnN0TmFtZUlucHV0ID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCdkZWVzLWlucHV0LXRleHRba2V5PSJmaXJzdE5hbWUiXScpOwogIGNvbnN0IGxhc3ROYW1lSW5wdXQgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoJ2RlZXMtaW5wdXQtdGV4dFtrZXk9Imxhc3ROYW1lIl0nKTsKICBpZiAoZmlyc3ROYW1lSW5wdXQgJiYgbGFzdE5hbWVJbnB1dCkgewogICAgY29uc3QgdXBkYXRlRnVsbE5hbWUgPSAoKSA9PiB7CiAgICAgIGNvbnN0IGZpcnN0TmFtZSA9IGZpcnN0TmFtZUlucHV0LmdldFZhbHVlKCk7CiAgICAgIGNvbnN0IGxhc3ROYW1lID0gbGFzdE5hbWVJbnB1dC5nZXRWYWx1ZSgpOwogICAgICBjb25zb2xlLmxvZyhgRnVsbCBuYW1lOiAke2ZpcnN0TmFtZX0gJHtsYXN0TmFtZX1gKTsKICAgIH07CiAgICBmaXJzdE5hbWVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VTdWJqZWN0IiwgdXBkYXRlRnVsbE5hbWUpOwogICAgbGFzdE5hbWVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VTdWJqZWN0IiwgdXBkYXRlRnVsbE5hbWUpOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJIb3Jpem9udGFsIExheW91dCJ9IC5zdWJ0aXRsZT0keyJNdWx0aXBsZSBpbnB1dHMgYXJyYW5nZWQgaG9yaXpvbnRhbGx5IGZvciBjb21wYWN0IGZvcm1zIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iaG9yaXpvbnRhbC1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IAogICAgICAgICAgICAubGFiZWw9JHsiRmlyc3QgTmFtZSJ9IAogICAgICAgICAgICAudmFsdWU9JHsiSm9obiJ9IAogICAgICAgICAgICAubGF5b3V0TW9kZT0keyJob3Jpem9udGFsIn0KICAgICAgICAgICAgLmtleT0keyJmaXJzdE5hbWUifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IAogICAgICAgICAgICAubGFiZWw9JHsiTGFzdCBOYW1lIn0gCiAgICAgICAgICAgIC52YWx1ZT0keyJEb2UifSAKICAgICAgICAgICAgLmxheW91dE1vZGU9JHsiaG9yaXpvbnRhbCJ9CiAgICAgICAgICAgIC5rZXk9JHsibGFzdE5hbWUifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IAogICAgICAgICAgICAubGFiZWw9JHsiQWdlIn0gCiAgICAgICAgICAgIC52YWx1ZT0keyIyOCJ9IAogICAgICAgICAgICAubGF5b3V0TW9kZT0keyJob3Jpem9udGFsIn0KICAgICAgICAgICAgLmtleT0keyJhZ2UifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgICAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgaW5wdXRzID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yQWxsKCJkZWVzLWlucHV0LXRleHQiKTsKICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHsKICAgIGNvbnN0IHBvc2l0aW9uMyA9IGlucHV0LmxhYmVsUG9zaXRpb247CiAgICBjb25zb2xlLmxvZyhgSW5wdXQgIiR7aW5wdXQubGFiZWx9IiBoYXMgbGFiZWwgcG9zaXRpb246ICR7cG9zaXRpb24zfWApOwogIH0pOwogIGNvbnN0IGxlZnRMYWJlbElucHV0cyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgnZGVlcy1pbnB1dC10ZXh0W2xhYmVsUG9zaXRpb249ImxlZnQiXScpOwogIGlmIChsZWZ0TGFiZWxJbnB1dHMubGVuZ3RoID4gMCkgewogICAgY29uc29sZS5sb2coYCR7bGVmdExhYmVsSW5wdXRzLmxlbmd0aH0gaW5wdXRzIGhhdmUgbGVmdC1hbGlnbmVkIGxhYmVscyBmb3IgaW5saW5lIGxheW91dGApOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJMYWJlbCBQb3NpdGlvbnMifSAuc3VidGl0bGU9JHsiRGlmZmVyZW50IGxhYmVsIHBvc2l0aW9uaW5nIG9wdGlvbnMgZm9yIHZhcmlvdXMgbGF5b3V0cyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQKICAgICAgICAgICAgLmxhYmVsPSR7IkxhYmVsIG9uIFRvcCAoRGVmYXVsdCkifQogICAgICAgICAgICAudmFsdWU9JHsiU3RhbmRhcmQgbGF5b3V0In0KICAgICAgICAgICAgLmxhYmVsUG9zaXRpb249JHsidG9wIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KCiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0CiAgICAgICAgICAgIC5sYWJlbD0keyJMYWJlbCBvbiBMZWZ0In0KICAgICAgICAgICAgLnZhbHVlPSR7IklubGluZSBsYWJlbCJ9CiAgICAgICAgICAgIC5sYWJlbFBvc2l0aW9uPSR7ImxlZnQifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgoKICAgICAgICAgIDxkaXYgY2xhc3M9ImdyaWQtbGF5b3V0Ij4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgCiAgICAgICAgICAgIC5sYWJlbD0keyJDaXR5In0gCiAgICAgICAgICAgIC52YWx1ZT0keyJOZXcgWW9yayJ9IAogICAgICAgICAgICAubGFiZWxQb3NpdGlvbj0keyJsZWZ0In0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dAogICAgICAgICAgICAubGFiZWw9JHsiWklQIENvZGUifQogICAgICAgICAgICAudmFsdWU9JHsiMTAwMDEifQogICAgICAgICAgICAubGFiZWxQb3NpdGlvbj0keyJsZWZ0In0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgogICAgCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IHJlcXVpcmVkSW5wdXQgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtdGV4dFtyZXF1aXJlZF0iKTsKICBjb25zdCBkaXNhYmxlZElucHV0ID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCJkZWVzLWlucHV0LXRleHRbZGlzYWJsZWRdIik7CiAgY29uc3QgZXJyb3JJbnB1dCA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcignZGVlcy1pbnB1dC10ZXh0W3ZhbGlkYXRpb25TdGF0ZT0iaW52YWxpZCJdJyk7CiAgaWYgKHJlcXVpcmVkSW5wdXQpIHsKICAgIHJlcXVpcmVkSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IHsKICAgICAgaWYgKCFyZXF1aXJlZElucHV0LmdldFZhbHVlKCkpIHsKICAgICAgICBjb25zb2xlLmxvZygiUmVxdWlyZWQgZmllbGQgaXMgZW1wdHkhIik7CiAgICAgIH0KICAgIH0pOwogIH0KICBpZiAoZGlzYWJsZWRJbnB1dCkgewogICAgY29uc29sZS5sb2coIkRpc2FibGVkIGlucHV0IGNhbm5vdCBiZSBlZGl0ZWQiKTsKICB9CiAgaWYgKGVycm9ySW5wdXQpIHsKICAgIGNvbnNvbGUubG9nKCJFcnJvciBpbnB1dCBzaG93cyB2YWxpZGF0aW9uIG1lc3NhZ2U6IiwgZXJyb3JJbnB1dC52YWxpZGF0aW9uVGV4dCk7CiAgICBlcnJvcklucHV0LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZVN1YmplY3QiLCAoKSA9PiB7CiAgICAgIGNvbnN0IHZhbHVlMiA9IGVycm9ySW5wdXQuZ2V0VmFsdWUoKTsKICAgICAgaWYgKHZhbHVlMi5pbmNsdWRlcygiQCIpICYmIHZhbHVlMi5pbmNsdWRlcygiLiIpKSB7CiAgICAgICAgZXJyb3JJbnB1dC52YWxpZGF0aW9uU3RhdGUgPSAidmFsaWQiOwogICAgICAgIGVycm9ySW5wdXQudmFsaWRhdGlvblRleHQgPSAiIjsKICAgICAgICBjb25zb2xlLmxvZygiRW1haWwgdmFsaWRhdGlvbiBwYXNzZWQhIik7CiAgICAgIH0KICAgIH0pOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJWYWxpZGF0aW9uICYgU3RhdGVzIn0gLnN1YnRpdGxlPSR7IkRpZmZlcmVudCB2YWxpZGF0aW9uIHN0YXRlcyBhbmQgaW5wdXQgY29uZmlndXJhdGlvbnMifT4KICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0CiAgICAgICAgICAgIC5sYWJlbD0keyJSZXF1aXJlZCBGaWVsZCJ9CiAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICAgIC5rZXk9JHsicmVxdWlyZWRGaWVsZCJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dAogICAgICAgICAgICAubGFiZWw9JHsiRGlzYWJsZWQgRmllbGQifQogICAgICAgICAgICAudmFsdWU9JHsiQ2Fubm90IGVkaXQgdGhpcyJ9CiAgICAgICAgICAgIC5kaXNhYmxlZD0ke3RydWV9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dAogICAgICAgICAgICAubGFiZWw9JHsiRmllbGQgd2l0aCBFcnJvciJ9CiAgICAgICAgICAgIC52YWx1ZT0keyJpbnZhbGlkQCJ9CiAgICAgICAgICAgIC52YWxpZGF0aW9uVGV4dD0keyJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzIn0KICAgICAgICAgICAgLnZhbGlkYXRpb25TdGF0ZT0keyJpbnZhbGlkIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgogICAgCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IHBhc3N3b3JkSW5wdXRzID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yQWxsKCJkZWVzLWlucHV0LXRleHRbaXNQYXNzd29yZEJvb2xdIik7CiAgcGFzc3dvcmRJbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHsKICAgIGNvbnN0IGNoZWNrVG9nZ2xlID0gKCkgPT4gewogICAgICBjb25zdCBpbnB1dEVsID0gaW5wdXQuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiaW5wdXQiKTsKICAgICAgaWYgKGlucHV0RWwpIHsKICAgICAgICBjb25zb2xlLmxvZyhgUGFzc3dvcmQgZmllbGQgIiR7aW5wdXQubGFiZWx9IiB0eXBlOmAsIGlucHV0RWwudHlwZSk7CiAgICAgIH0KICAgIH07CiAgICBpZiAoaW5wdXQuc2hhZG93Um9vdCkgewogICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNoZWNrVG9nZ2xlKTsKICAgICAgY29uc3QgaW5wdXRFbCA9IGlucHV0LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiaW5wdXQiKTsKICAgICAgaWYgKGlucHV0RWwpIHsKICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGlucHV0RWwsIHsgYXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbInR5cGUiXSB9KTsKICAgICAgfQogICAgfQogIH0pOwp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkFkdmFuY2VkIEZlYXR1cmVzIn0gLnN1YnRpdGxlPSR7IlBhc3N3b3JkIHZpc2liaWxpdHkgdG9nZ2xlIGFuZCBvdGhlciBhZHZhbmNlZCBmZWF0dXJlcyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQKICAgICAgICAgICAgLmxhYmVsPSR7IlBhc3N3b3JkIHdpdGggVG9nZ2xlIn0KICAgICAgICAgICAgLmlzUGFzc3dvcmRCb29sPSR7dHJ1ZX0KICAgICAgICAgICAgLnZhbHVlPSR7Im15U2VjdXJlUGFzc3dvcmQxMjMifQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiQ2xpY2sgdGhlIGV5ZSBpY29uIHRvIHNob3cvaGlkZSBwYXNzd29yZCJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dAogICAgICAgICAgICAubGFiZWw9JHsiQVBJIEtleSJ9CiAgICAgICAgICAgIC5pc1Bhc3N3b3JkQm9vbD0ke3RydWV9CiAgICAgICAgICAgIC52YWx1ZT0keyJzay0xMjM0NTY3ODkwYWJjZGVmIn0KICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IktlZXAgdGhpcyBrZXkgc2VjdXJlIGFuZCBuZXZlciBzaGFyZSBpdCJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICAgIAogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBkeW5hbWljSW5wdXQgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtdGV4dCIpOwogIGNvbnN0IG91dHB1dCA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiI3RleHQtaW5wdXQtb3V0cHV0Iik7CiAgaWYgKGR5bmFtaWNJbnB1dCAmJiBvdXRwdXQpIHsKICAgIGR5bmFtaWNJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VTdWJqZWN0IiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHZhbHVlMiA9IGV2ZW50LmRldGFpbC5nZXRWYWx1ZSgpOwogICAgICBvdXRwdXQudGV4dENvbnRlbnQgPSBgQ3VycmVudCB2YWx1ZTogIiR7dmFsdWUyfSJgOwogICAgfSk7CiAgICBkeW5hbWljSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLCAoKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJJbnB1dCBmb2N1c2VkIik7CiAgICB9KTsKICAgIGR5bmFtaWNJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgKCkgPT4gewogICAgICBjb25zb2xlLmxvZygiSW5wdXQgYmx1cnJlZCIpOwogICAgfSk7CiAgICBsZXQga2V5cHJlc3NDb3VudCA9IDA7CiAgICBkeW5hbWljSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsICgpID0+IHsKICAgICAga2V5cHJlc3NDb3VudCsrOwogICAgICBjb25zb2xlLmxvZyhgS2V5cHJlc3MgY291bnQ6ICR7a2V5cHJlc3NDb3VudH1gKTsKICAgIH0pOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJJbnRlcmFjdGl2ZSBFeGFtcGxlIn0gLnN1YnRpdGxlPSR7IlRyeSB0eXBpbmcgaW4gdGhlIGlucHV0cyB0byBzZWUgcmVhbC10aW1lIHZhbHVlIGNoYW5nZXMifT4KICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IAogICAgICAgICAgLmxhYmVsPSR7IkR5bmFtaWMgSW5wdXQifSAKICAgICAgICAgIC5wbGFjZWhvbGRlcj0keyJUeXBlIHNvbWV0aGluZyBoZXJlLi4uIn0KICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0iaW50ZXJhY3RpdmUtc2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGlkPSJ0ZXh0LWlucHV0LW91dHB1dCIgY2xhc3M9Im91dHB1dC10ZXh0Ij5DdXJyZW50IHZhbHVlOiAiIjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgPC9kaXY+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC10ZXh0L2RlZXMtaW5wdXQtdGV4dC5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGUyMCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMjEgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNJbnB1dFRleHQgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtaW5wdXQtdGV4dCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzSW5wdXRCYXNlOwogIGxldCBfdmFsdWVfZGVjb3JhdG9yczsKICBsZXQgX3ZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzUGFzc3dvcmRCb29sX2RlY29yYXRvcnM7CiAgbGV0IF9pc1Bhc3N3b3JkQm9vbF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzUGFzc3dvcmRCb29sX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93UGFzc3dvcmRCb29sX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93UGFzc3dvcmRCb29sX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1Bhc3N3b3JkQm9vbF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsaWRhdGlvblN0YXRlX2RlY29yYXRvcnM7CiAgbGV0IF92YWxpZGF0aW9uU3RhdGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWxpZGF0aW9uU3RhdGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbGlkYXRpb25UZXh0X2RlY29yYXRvcnM7CiAgbGV0IF92YWxpZGF0aW9uVGV4dF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbGlkYXRpb25UZXh0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWxpZGF0aW9uRnVuY3Rpb25fZGVjb3JhdG9yczsKICBsZXQgX3ZhbGlkYXRpb25GdW5jdGlvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbGlkYXRpb25GdW5jdGlvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW5wdXRUZXh0MiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3ZhbHVlX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICByZWZsZWN0OiB0cnVlCiAgICAgIH0pXTsKICAgICAgX2lzUGFzc3dvcmRCb29sX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgcmVmbGVjdDogdHJ1ZQogICAgICB9KV07CiAgICAgIF9zaG93UGFzc3dvcmRCb29sX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgcmVmbGVjdDogdHJ1ZQogICAgICB9KV07CiAgICAgIF92YWxpZGF0aW9uU3RhdGVfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICByZWZsZWN0OiB0cnVlCiAgICAgIH0pXTsKICAgICAgX3ZhbGlkYXRpb25UZXh0X2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHJlZmxlY3Q6IHRydWUKICAgICAgfSldOwogICAgICBfdmFsaWRhdGlvbkZ1bmN0aW9uX2RlY29yYXRvcnMgPSBbbjUoe30pXTsKICAgICAgX19lc0RlY29yYXRlMjAodGhpcywgbnVsbCwgX3ZhbHVlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZhbHVlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ2YWx1ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai52YWx1ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudmFsdWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyMCh0aGlzLCBudWxsLCBfaXNQYXNzd29yZEJvb2xfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNQYXNzd29yZEJvb2wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImlzUGFzc3dvcmRCb29sIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzUGFzc3dvcmRCb29sLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc1Bhc3N3b3JkQm9vbCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pc1Bhc3N3b3JkQm9vbF9pbml0aWFsaXplcnMsIF9pc1Bhc3N3b3JkQm9vbF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTIwKHRoaXMsIG51bGwsIF9zaG93UGFzc3dvcmRCb29sX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dQYXNzd29yZEJvb2wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNob3dQYXNzd29yZEJvb2wiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2hvd1Bhc3N3b3JkQm9vbCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd1Bhc3N3b3JkQm9vbCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93UGFzc3dvcmRCb29sX2luaXRpYWxpemVycywgX3Nob3dQYXNzd29yZEJvb2xfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyMCh0aGlzLCBudWxsLCBfdmFsaWRhdGlvblN0YXRlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZhbGlkYXRpb25TdGF0ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmFsaWRhdGlvblN0YXRlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZhbGlkYXRpb25TdGF0ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudmFsaWRhdGlvblN0YXRlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZhbGlkYXRpb25TdGF0ZV9pbml0aWFsaXplcnMsIF92YWxpZGF0aW9uU3RhdGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyMCh0aGlzLCBudWxsLCBfdmFsaWRhdGlvblRleHRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmFsaWRhdGlvblRleHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInZhbGlkYXRpb25UZXh0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZhbGlkYXRpb25UZXh0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52YWxpZGF0aW9uVGV4dCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF92YWxpZGF0aW9uVGV4dF9pbml0aWFsaXplcnMsIF92YWxpZGF0aW9uVGV4dF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTIwKHRoaXMsIG51bGwsIF92YWxpZGF0aW9uRnVuY3Rpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmFsaWRhdGlvbkZ1bmN0aW9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ2YWxpZGF0aW9uRnVuY3Rpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmFsaWRhdGlvbkZ1bmN0aW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52YWxpZGF0aW9uRnVuY3Rpb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdmFsaWRhdGlvbkZ1bmN0aW9uX2luaXRpYWxpemVycywgX3ZhbGlkYXRpb25GdW5jdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTIwKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0lucHV0VGV4dDIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzEyOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIklucHV0Il07CiAgICAjdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMjEodGhpcywgX3ZhbHVlX2luaXRpYWxpemVycywgIiIpOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCB2YWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNQYXNzd29yZEJvb2xfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIxKHRoaXMsIF92YWx1ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjEodGhpcywgX2lzUGFzc3dvcmRCb29sX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc1Bhc3N3b3JkQm9vbCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzUGFzc3dvcmRCb29sX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaXNQYXNzd29yZEJvb2wodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzUGFzc3dvcmRCb29sX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd1Bhc3N3b3JkQm9vbF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjEodGhpcywgX2lzUGFzc3dvcmRCb29sX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMSh0aGlzLCBfc2hvd1Bhc3N3b3JkQm9vbF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgc2hvd1Bhc3N3b3JkQm9vbCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dQYXNzd29yZEJvb2xfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93UGFzc3dvcmRCb29sKHZhbHVlMikgewogICAgICB0aGlzLiNzaG93UGFzc3dvcmRCb29sX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdmFsaWRhdGlvblN0YXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyMSh0aGlzLCBfc2hvd1Bhc3N3b3JkQm9vbF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjEodGhpcywgX3ZhbGlkYXRpb25TdGF0ZV9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgZ2V0IHZhbGlkYXRpb25TdGF0ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ZhbGlkYXRpb25TdGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbGlkYXRpb25TdGF0ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdmFsaWRhdGlvblN0YXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdmFsaWRhdGlvblRleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIxKHRoaXMsIF92YWxpZGF0aW9uU3RhdGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczIxKHRoaXMsIF92YWxpZGF0aW9uVGV4dF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgdmFsaWRhdGlvblRleHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWxpZGF0aW9uVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbGlkYXRpb25UZXh0KHZhbHVlMikgewogICAgICB0aGlzLiN2YWxpZGF0aW9uVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3ZhbGlkYXRpb25GdW5jdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjEodGhpcywgX3ZhbGlkYXRpb25UZXh0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMSh0aGlzLCBfdmFsaWRhdGlvbkZ1bmN0aW9uX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgdmFsaWRhdGlvbkZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy4jdmFsaWRhdGlvbkZ1bmN0aW9uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdmFsaWRhdGlvbkZ1bmN0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiN2YWxpZGF0aW9uRnVuY3Rpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgLi4uRGVlc0lucHV0QmFzZS5iYXNlU3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgICogewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgei1pbmRleDogYXV0bzsKICAgICAgICBmb250LWZhbWlseTogJHtjc3NHZWlzdEZvbnRGYW1pbHl9OwogICAgICB9CgogICAgICAubWFpbmNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTUlKSIsICJoc2woMCAwJSA5MCUpIil9OwogICAgICB9CgogICAgICBpbnB1dCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDQwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcGFkZGluZzogMCAxMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBsaW5lLWhlaWdodDogNDBweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgY3Vyc29yOiB0ZXh0OwogICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMy45JSkiLCAiaHNsKDAgMCUgOTglKSIpfTsKICAgICAgfQoKICAgICAgaW5wdXQ6OnBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQ1LjElKSIsICJoc2woMCAwJSA2My45JSkiKX07CiAgICAgIH0KCiAgICAgIGlucHV0OmhvdmVyOm5vdCg6ZGlzYWJsZWQpOm5vdCg6Zm9jdXMpIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA3OS44JSkiLCAiaHNsKDAgMCUgMjAuOSUpIil9OwogICAgICB9CgogICAgICBpbnB1dDpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTglKSIpfTsKICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklIC8gMC4wNSkiLCAiaHNsKDAgMCUgOTglIC8gMC4wNSkiKX07CiAgICAgIH0KCiAgICAgIGlucHV0OmRpc2FibGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUuMSUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDUuMSUpIiwgImhzbCgwIDAlIDYzLjklKSIpfTsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgfQoKICAgICAgLyogUGFzc3dvcmQgdG9nZ2xlIGJ1dHRvbiAqLwogICAgICAuc2hvd1Bhc3N3b3JkIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDFweDsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHdpZHRoOiAzOHB4OwogICAgICAgIGhlaWdodDogMzhweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NS4xJSkiLCAiaHNsKDAgMCUgNjMuOSUpIil9OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDAgNXB4IDVweCAwOwogICAgICB9CgogICAgICAuc2hvd1Bhc3N3b3JkOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUuMSUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDE1JSkiLCAiaHNsKDAgMCUgOTMuOSUpIil9OwogICAgICB9CgogICAgICAvKiBWYWxpZGF0aW9uIHN0eWxlcyAqLwogICAgICAudmFsaWRhdGlvbkNvbnRhaW5lciB7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnZhbGlkYXRpb25Db250YWluZXIuZXJyb3IgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA4NC4yJSA2MC4yJSAvIDAuMSkiLCAiaHNsKDAgNzIuMiUgNTAuNiUgLyAwLjEpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgODQuMiUgNjAuMiUpIiwgImhzbCgwIDcyLjIlIDUwLjYlKSIpfTsKICAgICAgfQoKICAgICAgLnZhbGlkYXRpb25Db250YWluZXIud2FybiB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyNSA5NSUgNTMlIC8gMC4xKSIsICJoc2woMjUgOTUlIDYzJSAvIDAuMSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjUgOTUlIDUzJSkiLCAiaHNsKDI1IDk1JSA2MyUpIil9OwogICAgICB9CgogICAgICAudmFsaWRhdGlvbkNvbnRhaW5lci52YWxpZCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSAvIDAuMSkiLCAiaHNsKDE0Mi4xIDcwLjYlIDQ1LjMlIC8gMC4xKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSkiLCAiaHNsKDE0Mi4xIDcwLjYlIDQ1LjMlKSIpfTsKICAgICAgfQoKICAgICAgLyogRXJyb3Igc3RhdGUgZm9yIGlucHV0ICovCiAgICAgIDpob3N0KFt2YWxpZGF0aW9uLXN0YXRlPSJpbnZhbGlkIl0pIGlucHV0IHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA4NC4yJSA2MC4yJSkiLCAiaHNsKDAgNzIuMiUgNTAuNiUpIil9OwogICAgICB9CgogICAgICA6aG9zdChbdmFsaWRhdGlvbi1zdGF0ZT0iaW52YWxpZCJdKSBpbnB1dDpmb2N1cyB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgODQuMiUgNjAuMiUpIiwgImhzbCgwIDcyLjIlIDUwLjYlKSIpfTsKICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDg0LjIlIDYwLjIlIC8gMC4wNSkiLCAiaHNsKDAgNzIuMiUgNTAuNiUgLyAwLjA1KSIpfTsKICAgICAgfQoKICAgICAgLyogV2FybmluZyBzdGF0ZSBmb3IgaW5wdXQgKi8KICAgICAgOmhvc3QoW3ZhbGlkYXRpb24tc3RhdGU9Indhcm4iXSkgaW5wdXQgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyNSA5NSUgNTMlKSIsICJoc2woMjUgOTUlIDYzJSkiKX07CiAgICAgIH0KCiAgICAgIDpob3N0KFt2YWxpZGF0aW9uLXN0YXRlPSJ3YXJuIl0pIGlucHV0OmZvY3VzIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjUgOTUlIDUzJSkiLCAiaHNsKDI1IDk1JSA2MyUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDI1IDk1JSA1MyUgLyAwLjA1KSIsICJoc2woMjUgOTUlIDYzJSAvIDAuMDUpIil9OwogICAgICB9CgogICAgICAvKiBWYWxpZCBzdGF0ZSBmb3IgaW5wdXQgKi8KICAgICAgOmhvc3QoW3ZhbGlkYXRpb24tc3RhdGU9InZhbGlkIl0pIGlucHV0IHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyLjEgNzYuMiUgMzYuMyUpIiwgImhzbCgxNDIuMSA3MC42JSA0NS4zJSkiKX07CiAgICAgIH0KCiAgICAgIDpob3N0KFt2YWxpZGF0aW9uLXN0YXRlPSJ2YWxpZCJdKSBpbnB1dDpmb2N1cyB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlKSIsICJoc2woMTQyLjEgNzAuNiUgNDUuMyUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlIC8gMC4wNSkiLCAiaHNsKDE0Mi4xIDcwLjYlIDQ1LjMlIC8gMC4wNSkiKX07CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPHN0eWxlPgogICAgICAgIGlucHV0IHsKICAgICAgICAgIGZvbnQtZmFtaWx5OiAke3RoaXMuaXNQYXNzd29yZEJvb2wgPyBjc3NNb25vRm9udEZhbWlseSA6ICJpbmhlcml0In07CiAgICAgICAgICBsZXR0ZXItc3BhY2luZzogJHt0aGlzLmlzUGFzc3dvcmRCb29sID8gIjAuNXB4IiA6ICJub3JtYWwifTsKICAgICAgICAgIHBhZGRpbmctcmlnaHQ6ICR7dGhpcy5pc1Bhc3N3b3JkQm9vbCA/ICI0OHB4IiA6ICIxMnB4In07CiAgICAgICAgfQogICAgICAgICR7dGhpcy52YWxpZGF0aW9uVGV4dCA/IGlgCiAgICAgICAgICAgICAgLnZhbGlkYXRpb25Db250YWluZXIgewogICAgICAgICAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgICAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGAgOiBpYAogICAgICAgICAgICAgIC52YWxpZGF0aW9uQ29udGFpbmVyIHsKICAgICAgICAgICAgICAgIGhlaWdodDogMDsKICAgICAgICAgICAgICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTRweCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBgfQogICAgICA8L3N0eWxlPgogICAgICA8ZGl2IGNsYXNzPSJpbnB1dC13cmFwcGVyIj4KICAgICAgICA8ZGVlcy1sYWJlbCAubGFiZWw9JHt0aGlzLmxhYmVsfSAuZGVzY3JpcHRpb249JHt0aGlzLmRlc2NyaXB0aW9ufSAucmVxdWlyZWQ9JHt0aGlzLnJlcXVpcmVkfT48L2RlZXMtbGFiZWw+CiAgICAgICAgPGRpdiBjbGFzcz0ibWFpbmNvbnRhaW5lciI+CiAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgdHlwZT0iJHt0aGlzLmlzUGFzc3dvcmRCb29sICYmICF0aGlzLnNob3dQYXNzd29yZEJvb2wgPyAicGFzc3dvcmQiIDogInRleHQifSIKICAgICAgICAgICAgLnZhbHVlPSR7dGhpcy52YWx1ZX0KICAgICAgICAgICAgQGlucHV0PSIke3RoaXMudXBkYXRlVmFsdWV9IgogICAgICAgICAgICAuZGlzYWJsZWQ9JHt0aGlzLmRpc2FibGVkfQogICAgICAgICAgICBwbGFjZWhvbGRlcj0iJHt0aGlzLmxhYmVsID8gIiIgOiAiRW50ZXIgdGV4dC4uLiJ9IgogICAgICAgICAgLz4KICAgICAgICAgICR7dGhpcy5pc1Bhc3N3b3JkQm9vbCA/IGIyYAogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2hvd1Bhc3N3b3JkIiBAY2xpY2s9JHt0aGlzLnRvZ2dsZVBhc3N3b3JkVmlld30+CiAgICAgICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHt0aGlzLnNob3dQYXNzd29yZEJvb2wgPyAibHVjaWRlOkV5ZSIgOiAibHVjaWRlOkV5ZU9mZiJ9PjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgYCA6IGIyYGB9CiAgICAgICAgICAke3RoaXMudmFsaWRhdGlvblRleHQgPyBiMmAKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZhbGlkYXRpb25Db250YWluZXIgJHt0aGlzLnZhbGlkYXRpb25TdGF0ZSB8fCAiZXJyb3IifSI+CiAgICAgICAgICAgICAgICAgICR7dGhpcy52YWxpZGF0aW9uVGV4dH0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIGAgOiBiMmA8ZGl2IGNsYXNzPSJ2YWxpZGF0aW9uQ29udGFpbmVyIj48L2Rpdj5gfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBmaXJzdFVwZGF0ZWQoKSB7CiAgICB9CiAgICBhc3luYyB1cGRhdGVWYWx1ZShldmVudEFyZykgewogICAgICBjb25zdCB0YXJnZXQgPSBldmVudEFyZy50YXJnZXQ7CiAgICAgIHRoaXMudmFsdWUgPSB0YXJnZXQudmFsdWU7CiAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMpOwogICAgfQogICAgZ2V0VmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgfQogICAgc2V0VmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTI7CiAgICB9CiAgICBhc3luYyB0b2dnbGVQYXNzd29yZFZpZXcoKSB7CiAgICAgIHRoaXMuc2hvd1Bhc3N3b3JkQm9vbCA9ICF0aGlzLnNob3dQYXNzd29yZEJvb2w7CiAgICB9CiAgICBhc3luYyBmb2N1cygpIHsKICAgICAgY29uc3QgdGV4dElucHV0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoImlucHV0Iik7CiAgICAgIHRleHRJbnB1dC5mb2N1cygpOwogICAgfQogICAgYXN5bmMgYmx1cigpIHsKICAgICAgY29uc3QgdGV4dElucHV0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoImlucHV0Iik7CiAgICAgIHRleHRJbnB1dC5ibHVyKCk7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnMyMSh0aGlzLCBfdmFsaWRhdGlvbkZ1bmN0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMjEoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNJbnB1dFRleHQyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1zaW1wbGUvZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZC9kZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkLmRlbW8uanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIGRlbW9GdW5jMTMgPSAoKSA9PiBiMmAKICA8ZGVlcy1kZW1vd3JhcHBlcj4KICAgIDxzdHlsZT4KICAgICAgJHtpYAogICAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMjRweDsKICAgICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgICBtYXgtd2lkdGg6IDEyMDBweDsKICAgICAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAucHJvZHVjdC1ncmlkIHsKICAgICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgyODBweCwgMWZyKSk7CiAgICAgICAgICBnYXA6IDIwcHg7CiAgICAgICAgfQoKICAgICAgICAuY2FydC1zdW1tYXJ5IHsKICAgICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMjE1IDIwLjIlIDE2LjglKSIpfTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgOTEuNCUpIiwgImhzbCgyMTUgMjAuMiUgMjEuOCUpIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIH0KCiAgICAgICAgLmNhcnQtc3VtbWFyeS10aXRsZSB7CiAgICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk1JSkiKX07CiAgICAgICAgfQoKICAgICAgICAuY2FydC1pdGVtIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgcGFkZGluZzogOHB4IDA7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgMjYuNyUpIiwgImhzbCgyMTcuOSAxMC42JSA3NC45JSkiKX07CiAgICAgICAgfQoKICAgICAgICAuY2FydC10b3RhbCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIHBhZGRpbmctdG9wOiAxNnB4OwogICAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICAgIGJvcmRlci10b3A6IDJweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICAgIH0KCiAgICAgICAgLnNlbGVjdGVkLXByb2R1Y3RzIHsKICAgICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDI2LjclKSIsICJoc2woMjE3LjkgMTAuNiUgNzQuOSUpIil9OwogICAgICAgIH0KICAgICAgYH0KICAgIDwvc3R5bGU+CiAgICAKICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkJhc2ljIFByb2R1Y3QgQ2FyZHMifSAuc3VidGl0bGU9JHsiU2ltcGxlIHByb2R1Y3QgZGlzcGxheSB3aXRoIHZhcmlvdXMgY29uZmlndXJhdGlvbnMifT4KICAgICAgICA8ZGl2IGNsYXNzPSJwcm9kdWN0LWdyaWQiPgogICAgICAgICAgPGRlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQKICAgICAgICAgICAgLnByb2R1Y3REYXRhPSR7ewogIG5hbWU6ICJXaXJlbGVzcyBCbHVldG9vdGggSGVhZHBob25lcyIsCiAgY2F0ZWdvcnk6ICJBdWRpbyIsCiAgZGVzY3JpcHRpb246ICJQcmVtaXVtIHNvdW5kIHF1YWxpdHkgd2l0aCBhY3RpdmUgbm9pc2UgY2FuY2VsbGF0aW9uIiwKICBwcmljZTogMTQ5Ljk5LAogIG9yaWdpbmFsUHJpY2U6IDE5OS45OSwKICBpY29uTmFtZTogImx1Y2lkZTpoZWFkcGhvbmVzIgp9fQogICAgICAgICAgICAucXVhbnRpdHk9JHsxfQogICAgICAgICAgPjwvZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZD4KCiAgICAgICAgICA8ZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZAogICAgICAgICAgICAucHJvZHVjdERhdGE9JHt7CiAgbmFtZTogIlNtYXJ0IFdhdGNoIFNlcmllcyA3IiwKICBjYXRlZ29yeTogIldlYXJhYmxlcyIsCiAgZGVzY3JpcHRpb246ICJUcmFjayB5b3VyIGZpdG5lc3MgYW5kIHN0YXkgY29ubmVjdGVkIG9uIHRoZSBnbyIsCiAgcHJpY2U6IDM5OSwKICBpY29uTmFtZTogImx1Y2lkZTp3YXRjaCIKfX0KICAgICAgICAgICAgLnF1YW50aXR5PSR7MX0KICAgICAgICAgID48L2RlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQ+CgogICAgICAgICAgPGRlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQKICAgICAgICAgICAgLnByb2R1Y3REYXRhPSR7ewogIG5hbWU6ICJVU0ItQyBIdWIiLAogIGNhdGVnb3J5OiAiQWNjZXNzb3JpZXMiLAogIHByaWNlOiA0OS45OSwKICBpY29uTmFtZTogImx1Y2lkZTp1c2IiLAogIGluU3RvY2s6IGZhbHNlCn19CiAgICAgICAgICAgIC5xdWFudGl0eT0kezB9CiAgICAgICAgICA+PC9kZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiSW50ZXJhY3RpdmUgU2hvcHBpbmcgQ2FydCJ9IC5zdWJ0aXRsZT0keyJQcm9kdWN0IGNhcmRzIHdpdGggZHluYW1pYyBjYXJ0IGNhbGN1bGF0aW9uIn0gLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBwcm9kdWN0cyA9IFsKICAgIHsgaWQ6ICJsYXB0b3AiLCBlbGVtZW50OiBudWxsLCBkYXRhOiB7IG5hbWU6ICdNYWNCb29rIFBybyAxNCInLCBjYXRlZ29yeTogIkNvbXB1dGVycyIsIGRlc2NyaXB0aW9uOiAiTTMgUHJvIGNoaXAgd2l0aCAxOEdCIFJBTSIsIHByaWNlOiAxOTk5LCBvcmlnaW5hbFByaWNlOiAyMTk5LCBpY29uTmFtZTogImx1Y2lkZTpsYXB0b3AiIH0gfSwKICAgIHsgaWQ6ICJpcGFkIiwgZWxlbWVudDogbnVsbCwgZGF0YTogeyBuYW1lOiAiaVBhZCBBaXIiLCBjYXRlZ29yeTogIlRhYmxldHMiLCBkZXNjcmlwdGlvbjogJzEwLjkiIExpcXVpZCBSZXRpbmEgZGlzcGxheScsIHByaWNlOiA1OTksIGljb25OYW1lOiAibHVjaWRlOnRhYmxldCIgfSB9LAogICAgeyBpZDogImtleWJvYXJkIiwgZWxlbWVudDogbnVsbCwgZGF0YTogeyBuYW1lOiAiTWFnaWMgS2V5Ym9hcmQiLCBjYXRlZ29yeTogIkFjY2Vzc29yaWVzIiwgZGVzY3JpcHRpb246ICJXaXJlbGVzcyBrZXlib2FyZCB3aXRoIFRvdWNoIElEIiwgcHJpY2U6IDE0OSwgaWNvbk5hbWU6ICJsdWNpZGU6a2V5Ym9hcmQiIH0gfQogIF07CiAgY29uc3QgdXBkYXRlQ2FydFN1bW1hcnkgPSAoKSA9PiB7CiAgICBsZXQgdG90YWwgPSAwOwogICAgY29uc3QgaXRlbXMgPSBbXTsKICAgIHByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3QpID0+IHsKICAgICAgY29uc3QgZWxlbWVudDQgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoYCMke3Byb2R1Y3QuaWR9YCk7CiAgICAgIGlmIChlbGVtZW50NCAmJiBlbGVtZW50NC5xdWFudGl0eSA+IDApIHsKICAgICAgICBjb25zdCBzdWJ0b3RhbCA9IHByb2R1Y3QuZGF0YS5wcmljZSAqIGVsZW1lbnQ0LnF1YW50aXR5OwogICAgICAgIHRvdGFsICs9IHN1YnRvdGFsOwogICAgICAgIGl0ZW1zLnB1c2goYAogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FydC1pdGVtIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+JHtwcm9kdWN0LmRhdGEubmFtZX0gKCR7ZWxlbWVudDQucXVhbnRpdHl9KTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHNwYW4+JCR7c3VidG90YWwudG9GaXhlZCgyKX08L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICBgKTsKICAgICAgfQogICAgfSk7CiAgICBjb25zdCBzdW1tYXJ5ID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjaW50ZXJhY3RpdmUtY2FydC1zdW1tYXJ5Iik7CiAgICBpZiAoc3VtbWFyeSkgewogICAgICBzdW1tYXJ5LmlubmVySFRNTCA9IGAKICAgICAgICAgICAgICAke2l0ZW1zLmpvaW4oIiIpfQogICAgICAgICAgICAgICR7aXRlbXMubGVuZ3RoID09PSAwID8gJzxkaXYgY2xhc3M9ImNhcnQtaXRlbSIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICM5OTk7Ij5Zb3VyIGNhcnQgaXMgZW1wdHk8L2Rpdj4nIDogIiJ9CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FydC10b3RhbCI+CiAgICAgICAgICAgICAgICA8c3Bhbj5Ub3RhbDwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuPiQke3RvdGFsLnRvRml4ZWQoMil9PC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgOwogICAgfQogIH07CiAgc2V0VGltZW91dCh1cGRhdGVDYXJ0U3VtbWFyeSwgMTAwKTsKICBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3JBbGwoImRlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQiKS5mb3JFYWNoKChjYXJkKSA9PiB7CiAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoInF1YW50aXR5Q2hhbmdlIiwgdXBkYXRlQ2FydFN1bW1hcnkpOwogIH0pOwp9fT4KICAgICAgICA8ZGl2IGNsYXNzPSJwcm9kdWN0LWdyaWQiPgogICAgICAgICAgPGRlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQKICAgICAgICAgICAgaWQ9ImxhcHRvcCIKICAgICAgICAgICAgLnByb2R1Y3REYXRhPSR7ewogIG5hbWU6ICdNYWNCb29rIFBybyAxNCInLAogIGNhdGVnb3J5OiAiQ29tcHV0ZXJzIiwKICBkZXNjcmlwdGlvbjogIk0zIFBybyBjaGlwIHdpdGggMThHQiBSQU0iLAogIHByaWNlOiAxOTk5LAogIG9yaWdpbmFsUHJpY2U6IDIxOTksCiAgaWNvbk5hbWU6ICJsdWNpZGU6bGFwdG9wIgp9fQogICAgICAgICAgICAucXVhbnRpdHk9JHsxfQogICAgICAgICAgPjwvZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZD4KCiAgICAgICAgICA8ZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZAogICAgICAgICAgICBpZD0iaXBhZCIKICAgICAgICAgICAgLnByb2R1Y3REYXRhPSR7ewogIG5hbWU6ICJpUGFkIEFpciIsCiAgY2F0ZWdvcnk6ICJUYWJsZXRzIiwKICBkZXNjcmlwdGlvbjogJzEwLjkiIExpcXVpZCBSZXRpbmEgZGlzcGxheScsCiAgcHJpY2U6IDU5OSwKICBpY29uTmFtZTogImx1Y2lkZTp0YWJsZXQiCn19CiAgICAgICAgICAgIC5xdWFudGl0eT0kezB9CiAgICAgICAgICA+PC9kZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkPgoKICAgICAgICAgIDxkZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkCiAgICAgICAgICAgIGlkPSJrZXlib2FyZCIKICAgICAgICAgICAgLnByb2R1Y3REYXRhPSR7ewogIG5hbWU6ICJNYWdpYyBLZXlib2FyZCIsCiAgY2F0ZWdvcnk6ICJBY2Nlc3NvcmllcyIsCiAgZGVzY3JpcHRpb246ICJXaXJlbGVzcyBrZXlib2FyZCB3aXRoIFRvdWNoIElEIiwKICBwcmljZTogMTQ5LAogIGljb25OYW1lOiAibHVjaWRlOmtleWJvYXJkIgp9fQogICAgICAgICAgICAucXVhbnRpdHk9JHsyfQogICAgICAgICAgPjwvZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iY2FydC1zdW1tYXJ5Ij4KICAgICAgICAgIDxoMyBjbGFzcz0iY2FydC1zdW1tYXJ5LXRpdGxlIj5TaG9wcGluZyBDYXJ0PC9oMz4KICAgICAgICAgIDxkaXYgaWQ9ImludGVyYWN0aXZlLWNhcnQtc3VtbWFyeSI+CiAgICAgICAgICAgIDwhLS0gRHluYW1pY2FsbHkgdXBkYXRlZCAtLT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiU2VsZWN0YWJsZSBQcm9kdWN0IENhcmRzIn0gLnN1YnRpdGxlPSR7IkNsaWNrIGNhcmRzIG9yIGNoZWNrYm94ZXMgdG8gc2VsZWN0IHByb2R1Y3RzIn0+CiAgICAgICAgPGRpdiBjbGFzcz0icHJvZHVjdC1ncmlkIj4KICAgICAgICAgIDxkZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkCiAgICAgICAgICAgIC5wcm9kdWN0RGF0YT0ke3sKICBuYW1lOiAiU29ueSBBbHBoYSA3IElWIiwKICBjYXRlZ29yeTogIkNhbWVyYXMiLAogIGRlc2NyaXB0aW9uOiAiRnVsbC1mcmFtZSBtaXJyb3JsZXNzIGNhbWVyYSIsCiAgcHJpY2U6IDI0OTgsCiAgaWNvbk5hbWU6ICJsdWNpZGU6Y2FtZXJhIgp9fQogICAgICAgICAgICAuc2VsZWN0YWJsZT0ke3RydWV9CiAgICAgICAgICAgIC5zaG93UXVhbnRpdHlTZWxlY3Rvcj0ke2ZhbHNlfQogICAgICAgICAgICBAc2VsZWN0aW9uQ2hhbmdlPSR7KGUxMSkgPT4gewogIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzZWxlY3Rpb24tb3V0cHV0Iik7CiAgaWYgKG91dHB1dCkgewogICAgY29uc3Qgc2VsZWN0ZWRDYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImRlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmRbc2VsZWN0YWJsZV0iKTsKICAgIGNvbnN0IHNlbGVjdGVkUHJvZHVjdHMgPSBbXTsKICAgIHNlbGVjdGVkQ2FyZHMuZm9yRWFjaCgoY2FyZCkgPT4gewogICAgICBpZiAoY2FyZC5zZWxlY3RlZCkgewogICAgICAgIHNlbGVjdGVkUHJvZHVjdHMucHVzaChjYXJkLnByb2R1Y3REYXRhLm5hbWUpOwogICAgICB9CiAgICB9KTsKICAgIG91dHB1dC50ZXh0Q29udGVudCA9IHNlbGVjdGVkUHJvZHVjdHMubGVuZ3RoID4gMCA/IGBTZWxlY3RlZDogJHtzZWxlY3RlZFByb2R1Y3RzLmpvaW4oIiwgIil9YCA6ICJObyBwcm9kdWN0cyBzZWxlY3RlZCI7CiAgfQp9fQogICAgICAgICAgPjwvZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZD4KCiAgICAgICAgICA8ZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZAogICAgICAgICAgICAucHJvZHVjdERhdGE9JHt7CiAgbmFtZTogIkRKSSBNaW5pIDMgUHJvIiwKICBjYXRlZ29yeTogIkRyb25lcyIsCiAgZGVzY3JpcHRpb246ICJMaWdodHdlaWdodCBkcm9uZSB3aXRoIDRLIGNhbWVyYSIsCiAgcHJpY2U6IDc1OSwKICBpY29uTmFtZTogImx1Y2lkZTpwbGFuZSIKfX0KICAgICAgICAgICAgLnNlbGVjdGFibGU9JHt0cnVlfQogICAgICAgICAgICAuc2hvd1F1YW50aXR5U2VsZWN0b3I9JHtmYWxzZX0KICAgICAgICAgICAgQHNlbGVjdGlvbkNoYW5nZT0keyhlMTEpID0+IHsKICBjb25zdCBvdXRwdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc2VsZWN0aW9uLW91dHB1dCIpOwogIGlmIChvdXRwdXQpIHsKICAgIGNvbnN0IHNlbGVjdGVkQ2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJkZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkW3NlbGVjdGFibGVdIik7CiAgICBjb25zdCBzZWxlY3RlZFByb2R1Y3RzID0gW107CiAgICBzZWxlY3RlZENhcmRzLmZvckVhY2goKGNhcmQpID0+IHsKICAgICAgaWYgKGNhcmQuc2VsZWN0ZWQpIHsKICAgICAgICBzZWxlY3RlZFByb2R1Y3RzLnB1c2goY2FyZC5wcm9kdWN0RGF0YS5uYW1lKTsKICAgICAgfQogICAgfSk7CiAgICBvdXRwdXQudGV4dENvbnRlbnQgPSBzZWxlY3RlZFByb2R1Y3RzLmxlbmd0aCA+IDAgPyBgU2VsZWN0ZWQ6ICR7c2VsZWN0ZWRQcm9kdWN0cy5qb2luKCIsICIpfWAgOiAiTm8gcHJvZHVjdHMgc2VsZWN0ZWQiOwogIH0KfX0KICAgICAgICAgID48L2RlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQ+CgogICAgICAgICAgPGRlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQKICAgICAgICAgICAgLnByb2R1Y3REYXRhPSR7ewogIG5hbWU6ICJHb1BybyBIRVJPMTIiLAogIGNhdGVnb3J5OiAiQWN0aW9uIENhbWVyYXMiLAogIGRlc2NyaXB0aW9uOiAiNS4zSyB2aWRlbyB3aXRoIEh5cGVyU21vb3RoIDYuMCIsCiAgcHJpY2U6IDM5OSwKICBvcmlnaW5hbFByaWNlOiA0NDksCiAgaWNvbk5hbWU6ICJsdWNpZGU6dmlkZW8iCn19CiAgICAgICAgICAgIC5zZWxlY3RhYmxlPSR7dHJ1ZX0KICAgICAgICAgICAgLnNob3dRdWFudGl0eVNlbGVjdG9yPSR7ZmFsc2V9CiAgICAgICAgICAgIEBzZWxlY3Rpb25DaGFuZ2U9JHsoZTExKSA9PiB7CiAgY29uc3Qgb3V0cHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3NlbGVjdGlvbi1vdXRwdXQiKTsKICBpZiAob3V0cHV0KSB7CiAgICBjb25zdCBzZWxlY3RlZENhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZFtzZWxlY3RhYmxlXSIpOwogICAgY29uc3Qgc2VsZWN0ZWRQcm9kdWN0cyA9IFtdOwogICAgc2VsZWN0ZWRDYXJkcy5mb3JFYWNoKChjYXJkKSA9PiB7CiAgICAgIGlmIChjYXJkLnNlbGVjdGVkKSB7CiAgICAgICAgc2VsZWN0ZWRQcm9kdWN0cy5wdXNoKGNhcmQucHJvZHVjdERhdGEubmFtZSk7CiAgICAgIH0KICAgIH0pOwogICAgb3V0cHV0LnRleHRDb250ZW50ID0gc2VsZWN0ZWRQcm9kdWN0cy5sZW5ndGggPiAwID8gYFNlbGVjdGVkOiAke3NlbGVjdGVkUHJvZHVjdHMuam9pbigiLCAiKX1gIDogIk5vIHByb2R1Y3RzIHNlbGVjdGVkIjsKICB9Cn19CiAgICAgICAgICA+PC9kZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkPgogICAgICAgIDwvZGl2PgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9InNlbGVjdGVkLXByb2R1Y3RzIiBpZD0ic2VsZWN0aW9uLW91dHB1dCIgc3R5bGU9Im1hcmdpbi10b3A6IDE2cHg7Ij4KICAgICAgICAgIE5vIHByb2R1Y3RzIHNlbGVjdGVkCiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJQcm9kdWN0IFZhcmlhdGlvbnMifSAuc3VidGl0bGU9JHsiRGlmZmVyZW50IHN0YXRlcyBhbmQgY29uZmlndXJhdGlvbnMifT4KICAgICAgICA8ZGl2IGNsYXNzPSJwcm9kdWN0LWdyaWQiPgogICAgICAgICAgPGRlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQKICAgICAgICAgICAgLnByb2R1Y3REYXRhPSR7ewogIG5hbWU6ICJMaW1pdGVkIEVkaXRpb24gU25lYWtlcnMiLAogIGNhdGVnb3J5OiAiRm9vdHdlYXIiLAogIGRlc2NyaXB0aW9uOiAiRXhjbHVzaXZlIGNvbG9yd2F5IC0gT25seSA1MDAgcGFpcnMiLAogIHByaWNlOiAyOTksCiAgaWNvbk5hbWU6ICJsdWNpZGU6Zm9vdHByaW50cyIsCiAgaW5TdG9jazogZmFsc2UsCiAgc3RvY2tUZXh0OiAiU29sZCBPdXQiCn19CiAgICAgICAgICAgIC5xdWFudGl0eT0kezB9CiAgICAgICAgICA+PC9kZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkPgoKICAgICAgICAgIDxkZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkCiAgICAgICAgICAgIC5wcm9kdWN0RGF0YT0ke3sKICBuYW1lOiAiTWluaW1hbGlzdCBXYWxsZXQiLAogIHByaWNlOiAzOS45OSwKICBpY29uTmFtZTogImx1Y2lkZTp3YWxsZXQiCn19CiAgICAgICAgICAgIC5xdWFudGl0eT0kezF9CiAgICAgICAgICA+PC9kZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkPgoKICAgICAgICAgIDxkZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkCiAgICAgICAgICAgIC5wcm9kdWN0RGF0YT0ke3sKICBuYW1lOiAiUHJlbWl1bSBDb2ZmZWUgQmVhbnMiLAogIGNhdGVnb3J5OiAiRm9vZCAmIEJldmVyYWdlIiwKICBkZXNjcmlwdGlvbjogIlNpbmdsZSBvcmlnaW4sIG1lZGl1bSByb2FzdCIsCiAgcHJpY2U6IDE4LjUsCiAgaWNvbk5hbWU6ICJsdWNpZGU6Y29mZmVlIiwKICBjdXJyZW5jeTogIlx1MjBBQyIKfX0KICAgICAgICAgICAgLnF1YW50aXR5PSR7Mn0KICAgICAgICAgID48L2RlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQ+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGl2PgogIDwvZGVlcy1kZW1vd3JhcHBlcj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1zaW1wbGUvZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZC9kZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkLmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTIxID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMyMiA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1Nob3BwaW5nUHJvZHVjdGNhcmQgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9wcm9kdWN0RGF0YV9kZWNvcmF0b3JzOwogIGxldCBfcHJvZHVjdERhdGFfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wcm9kdWN0RGF0YV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcXVhbnRpdHlfZGVjb3JhdG9yczsKICBsZXQgX3F1YW50aXR5X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcXVhbnRpdHlfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dRdWFudGl0eVNlbGVjdG9yX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93UXVhbnRpdHlTZWxlY3Rvcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dRdWFudGl0eVNlbGVjdG9yX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RhYmxlX2RlY29yYXRvcnM7CiAgbGV0IF9zZWxlY3RhYmxlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0YWJsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1Nob3BwaW5nUHJvZHVjdGNhcmQyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfcHJvZHVjdERhdGFfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF9xdWFudGl0eV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX3Nob3dRdWFudGl0eVNlbGVjdG9yX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3NlbGVjdGFibGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfc2VsZWN0ZWRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfX2VzRGVjb3JhdGUyMSh0aGlzLCBudWxsLCBfcHJvZHVjdERhdGFfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicHJvZHVjdERhdGEiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInByb2R1Y3REYXRhIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnByb2R1Y3REYXRhLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5wcm9kdWN0RGF0YSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wcm9kdWN0RGF0YV9pbml0aWFsaXplcnMsIF9wcm9kdWN0RGF0YV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTIxKHRoaXMsIG51bGwsIF9xdWFudGl0eV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJxdWFudGl0eSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicXVhbnRpdHkiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucXVhbnRpdHksIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnF1YW50aXR5ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3F1YW50aXR5X2luaXRpYWxpemVycywgX3F1YW50aXR5X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjEodGhpcywgbnVsbCwgX3Nob3dRdWFudGl0eVNlbGVjdG9yX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dRdWFudGl0eVNlbGVjdG9yIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93UXVhbnRpdHlTZWxlY3RvciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93UXVhbnRpdHlTZWxlY3Rvciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd1F1YW50aXR5U2VsZWN0b3IgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd1F1YW50aXR5U2VsZWN0b3JfaW5pdGlhbGl6ZXJzLCBfc2hvd1F1YW50aXR5U2VsZWN0b3JfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyMSh0aGlzLCBudWxsLCBfc2VsZWN0YWJsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWxlY3RhYmxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3RhYmxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGFibGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlbGVjdGFibGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0YWJsZV9pbml0aWFsaXplcnMsIF9zZWxlY3RhYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjEodGhpcywgbnVsbCwgX3NlbGVjdGVkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlbGVjdGVkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3RlZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWxlY3RlZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VsZWN0ZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0ZWRfaW5pdGlhbGl6ZXJzLCBfc2VsZWN0ZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyMShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNTaG9wcGluZ1Byb2R1Y3RjYXJkMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMTM7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiU2ltcGxlIl07CiAgICAjcHJvZHVjdERhdGFfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMjIodGhpcywgX3Byb2R1Y3REYXRhX2luaXRpYWxpemVycywgewogICAgICBuYW1lOiAiUHJvZHVjdCBOYW1lIiwKICAgICAgcHJpY2U6IDAKICAgIH0pOwogICAgZ2V0IHByb2R1Y3REYXRhKCkgewogICAgICByZXR1cm4gdGhpcy4jcHJvZHVjdERhdGFfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwcm9kdWN0RGF0YSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcHJvZHVjdERhdGFfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNxdWFudGl0eV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjIodGhpcywgX3Byb2R1Y3REYXRhX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMih0aGlzLCBfcXVhbnRpdHlfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgcXVhbnRpdHkoKSB7CiAgICAgIHJldHVybiB0aGlzLiNxdWFudGl0eV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHF1YW50aXR5KHZhbHVlMikgewogICAgICB0aGlzLiNxdWFudGl0eV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dRdWFudGl0eVNlbGVjdG9yX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyMih0aGlzLCBfcXVhbnRpdHlfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczIyKHRoaXMsIF9zaG93UXVhbnRpdHlTZWxlY3Rvcl9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93UXVhbnRpdHlTZWxlY3RvcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dRdWFudGl0eVNlbGVjdG9yX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd1F1YW50aXR5U2VsZWN0b3IodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dRdWFudGl0eVNlbGVjdG9yX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0YWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjIodGhpcywgX3Nob3dRdWFudGl0eVNlbGVjdG9yX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMih0aGlzLCBfc2VsZWN0YWJsZV9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgc2VsZWN0YWJsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlbGVjdGFibGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3RhYmxlKHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3RhYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0ZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczIyKHRoaXMsIF9zZWxlY3RhYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyMih0aGlzLCBfc2VsZWN0ZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHNlbGVjdGVkKCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3RlZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VsZWN0ZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC5wcm9kdWN0LWNhcmQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMjE1IDIwLjIlIDExLjglKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAucHJvZHVjdC1jYXJkOmhvdmVyIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA3OS44JSkiLCAiaHNsKDAgMCUgMjAuOSUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDZweCAtMXB4IGhzbCgwIDAlIDAlIC8gMC4xKSwgMCAycHggNHB4IC0ycHggaHNsKDAgMCUgMCUgLyAwLjEpOwogICAgICB9CgogICAgICAucHJvZHVjdC1jYXJkLnNlbGVjdGFibGUgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgLnByb2R1Y3QtY2FyZC5zZWxlY3RlZCB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNy4yIDkxLjIlIDU5LjglKSIsICJoc2woMjEzLjEgOTMuOSUgNjcuOCUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNy4yIDkxLjIlIDU5LjglIC8gMC4xKSIsICJoc2woMjEzLjEgOTMuOSUgNjcuOCUgLyAwLjEpIil9OwogICAgICB9CgogICAgICAucHJvZHVjdC1pbWFnZSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxODBweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnByb2R1Y3QtaW1hZ2UgaW1nIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb2JqZWN0LWZpdDogY292ZXI7CiAgICAgIH0KCiAgICAgIC5wcm9kdWN0LWltYWdlIGRlZXMtaWNvbiB7CiAgICAgICAgZm9udC1zaXplOiA0OHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAyMC4yJSA2NS4xJSkiLCAiaHNsKDIxNSAyMC4yJSAzNS4xJSkiKX07CiAgICAgIH0KCiAgICAgIC5zZWxlY3Rpb24tY2hlY2tib3ggewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDEycHg7CiAgICAgICAgcmlnaHQ6IDEycHg7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMjE1IDMwJSA2LjglKSIpfTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAyMC4yJSA2NS4xJSkiLCAiaHNsKDIxNSAyMC4yJSAzNS4xJSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgLnNlbGVjdGlvbi1jaGVja2JveC5jaGVja2VkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNy4yIDkxLjIlIDU5LjglKSIsICJoc2woMjEzLjEgOTMuOSUgNjcuOCUpIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTcuMiA5MS4yJSA1OS44JSkiLCAiaHNsKDIxMy4xIDkzLjklIDY3LjglKSIpfTsKICAgICAgfQoKICAgICAgLnNlbGVjdGlvbi1jaGVja2JveCBkZWVzLWljb24gewogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5zZWxlY3Rpb24tY2hlY2tib3guY2hlY2tlZCBkZWVzLWljb24gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgICAgfQoKICAgICAgLnByb2R1Y3QtY29udGVudCB7CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgIGZsZXg6IDE7CiAgICAgIH0KICAgICAgCiAgICAgIC5wcm9kdWN0LWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogNHB4OwogICAgICB9CgogICAgICAucHJvZHVjdC1jYXRlZ29yeSB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNTYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNTUuMSUpIil9OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICAgICAgICBsaW5lLWhlaWdodDogMS4zOwogICAgICB9CiAgICAgIAogICAgICAucHJvZHVjdC1uYW1lIHsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICAgIH0KCiAgICAgIC5wcm9kdWN0LWRlc2NyaXB0aW9uIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNDYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICAgICAgZmxleDogMTsKICAgICAgfQogICAgICAKICAgICAgLnByb2R1Y3QtZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGdhcDogMTZweDsKICAgICAgICBwYWRkaW5nLXRvcDogMTJweDsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgIH0KCiAgICAgIC5wcm9kdWN0LXByaWNlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAycHg7CiAgICAgIH0KCiAgICAgIC5wcmljZS1jdXJyZW50IHsKICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICB9CgogICAgICAucHJpY2Utb3JpZ2luYWwgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA1Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA1NS4xJSkiKX07CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7CiAgICAgIH0KCiAgICAgIC5zdG9jay1zdGF0dXMgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIG1hcmdpbi10b3A6IDhweDsKICAgICAgfQoKICAgICAgLnN0b2NrLXN0YXR1cy5pbi1zdG9jayB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyLjEgNzAuNiUgNDUuMyUpIiwgImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSkiKX07CiAgICAgIH0KCiAgICAgIC5zdG9jay1zdGF0dXMub3V0LW9mLXN0b2NrIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcyLjIlIDUwLjYlKSIsICJoc2woMCA2Mi44JSAzMC42JSkiKX07CiAgICAgIH0KCiAgICAgIC5zdG9jay1zdGF0dXMgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIGNvbnN0IHsgbmFtZSwgY2F0ZWdvcnksIGRlc2NyaXB0aW9uLCBwcmljZSwgb3JpZ2luYWxQcmljZSwgY3VycmVuY3kgPSAiJCIsIGluU3RvY2sgPSB0cnVlLCBzdG9ja1RleHQgPSBpblN0b2NrID8gIkluIFN0b2NrIiA6ICJPdXQgb2YgU3RvY2siLCBpbWFnZVVybCwgaWNvbk5hbWUgPSAibHVjaWRlOnBhY2thZ2UiIH0gPSB0aGlzLnByb2R1Y3REYXRhOwogICAgICBjb25zdCBmb3JtYXRQcmljZSA9ICh2YWx1ZTIpID0+IHsKICAgICAgICByZXR1cm4gYCR7Y3VycmVuY3l9JHt2YWx1ZTIudG9GaXhlZCgyKX1gOwogICAgICB9OwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgCiAgICAgICAgY2xhc3M9InByb2R1Y3QtY2FyZCAke3RoaXMuc2VsZWN0YWJsZSA/ICJzZWxlY3RhYmxlIiA6ICIifSAke3RoaXMuc2VsZWN0ZWQgPyAic2VsZWN0ZWQiIDogIiJ9IgogICAgICAgIEBjbGljaz0ke3RoaXMuaGFuZGxlQ2FyZENsaWNrfQogICAgICA+CiAgICAgICAgPGRpdiBjbGFzcz0icHJvZHVjdC1pbWFnZSI+CiAgICAgICAgICAke2ltYWdlVXJsID8gYjJgCiAgICAgICAgICAgIDxpbWcgc3JjPSIke2ltYWdlVXJsfSIgYWx0PSIke25hbWV9Ij4KICAgICAgICAgIGAgOiBiMmAKICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0ke2ljb25OYW1lfT48L2RlZXMtaWNvbj4KICAgICAgICAgIGB9CiAgICAgICAgICAke3RoaXMuc2VsZWN0YWJsZSA/IGIyYAogICAgICAgICAgICA8ZGl2IAogICAgICAgICAgICAgIGNsYXNzPSJzZWxlY3Rpb24tY2hlY2tib3ggJHt0aGlzLnNlbGVjdGVkID8gImNoZWNrZWQiIDogIiJ9IgogICAgICAgICAgICAgIEBjbGljaz0keyhlMTEpID0+IHsKICAgICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3Rpb25Ub2dnbGUoKTsKICAgICAgfX0KICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOmNoZWNrIn0+PC9kZWVzLWljb24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYCA6ICIifQogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InByb2R1Y3QtY29udGVudCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9kdWN0LWhlYWRlciI+CiAgICAgICAgICAgICR7Y2F0ZWdvcnkgPyBiMmA8ZGl2IGNsYXNzPSJwcm9kdWN0LWNhdGVnb3J5Ij4ke2NhdGVnb3J5fTwvZGl2PmAgOiAiIn0KICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvZHVjdC1uYW1lIj4ke25hbWV9PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICR7ZGVzY3JpcHRpb24gPyBiMmAKICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvZHVjdC1kZXNjcmlwdGlvbiI+JHtkZXNjcmlwdGlvbn08L2Rpdj4KICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgIDxkaXYgY2xhc3M9InN0b2NrLXN0YXR1cyAke2luU3RvY2sgPyAiaW4tc3RvY2siIDogIm91dC1vZi1zdG9jayJ9Ij4KICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0ke2luU3RvY2sgPyAibHVjaWRlOmNoZWNrLWNpcmNsZSIgOiAibHVjaWRlOngtY2lyY2xlIn0+PC9kZWVzLWljb24+CiAgICAgICAgICAgICR7c3RvY2tUZXh0fQogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9kdWN0LWZvb3RlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InByb2R1Y3QtcHJpY2UiPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwcmljZS1jdXJyZW50Ij4ke2Zvcm1hdFByaWNlKHByaWNlKX08L3NwYW4+CiAgICAgICAgICAgICAgJHtvcmlnaW5hbFByaWNlICYmIG9yaWdpbmFsUHJpY2UgPiBwcmljZSA/IGIyYAogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InByaWNlLW9yaWdpbmFsIj4ke2Zvcm1hdFByaWNlKG9yaWdpbmFsUHJpY2UpfTwvc3Bhbj4KICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAke3RoaXMuc2hvd1F1YW50aXR5U2VsZWN0b3IgPyBiMmAKICAgICAgICAgICAgICA8ZGVlcy1pbnB1dC1xdWFudGl0eXNlbGVjdG9yCiAgICAgICAgICAgICAgICAudmFsdWU9JHt0aGlzLnF1YW50aXR5fQogICAgICAgICAgICAgICAgQGNoYW5nZVN1YmplY3Q9JHsoZTExKSA9PiB7CiAgICAgICAgdGhpcy5xdWFudGl0eSA9IGUxMS5kZXRhaWwuZ2V0VmFsdWUoKTsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJxdWFudGl0eUNoYW5nZSIsIHsKICAgICAgICAgIGRldGFpbDogewogICAgICAgICAgICBxdWFudGl0eTogdGhpcy5xdWFudGl0eSwKICAgICAgICAgICAgcHJvZHVjdERhdGE6IHRoaXMucHJvZHVjdERhdGEKICAgICAgICAgIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH19CiAgICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC1xdWFudGl0eXNlbGVjdG9yPgogICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgaGFuZGxlQ2FyZENsaWNrKCkgewogICAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZCA9ICF0aGlzLnNlbGVjdGVkOwogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInNlbGVjdGlvbkNoYW5nZSIsIHsKICAgICAgICAgIGRldGFpbDogewogICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5zZWxlY3RlZCwKICAgICAgICAgICAgcHJvZHVjdERhdGE6IHRoaXMucHJvZHVjdERhdGEKICAgICAgICAgIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZVNlbGVjdGlvblRvZ2dsZSgpIHsKICAgICAgdGhpcy5zZWxlY3RlZCA9ICF0aGlzLnNlbGVjdGVkOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJzZWxlY3Rpb25DaGFuZ2UiLCB7CiAgICAgICAgZGV0YWlsOiB7CiAgICAgICAgICBzZWxlY3RlZDogdGhpcy5zZWxlY3RlZCwKICAgICAgICAgIHByb2R1Y3REYXRhOiB0aGlzLnByb2R1Y3REYXRhCiAgICAgICAgfSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczIyKHRoaXMsIF9zZWxlY3RlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczIyKF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzU2hvcHBpbmdQcm9kdWN0Y2FyZDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtcXVhbnRpdHlzZWxlY3Rvci9kZWVzLWlucHV0LXF1YW50aXR5c2VsZWN0b3IuZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmMxNCA9ICgpID0+IGIyYAogIDxkZWVzLWRlbW93cmFwcGVyPgogICAgPHN0eWxlPgogICAgICAke2lgCiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICAgIG1heC13aWR0aDogMTIwMHB4OwogICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5pbnB1dC1ncm91cCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMTZweDsKICAgICAgICB9CgogICAgICAgIC5zaG9wcGluZy1ncmlkIHsKICAgICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgyODBweCwgMWZyKSk7CiAgICAgICAgICBnYXA6IDIwcHg7CiAgICAgICAgfQoKICAgICAgICAuY2FydC1zdW1tYXJ5IHsKICAgICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMjE1IDIwLjIlIDE2LjglKSIpfTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgOTEuNCUpIiwgImhzbCgyMTUgMjAuMiUgMjEuOCUpIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIH0KCiAgICAgICAgLmNhcnQtc3VtbWFyeS10aXRsZSB7CiAgICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk1JSkiKX07CiAgICAgICAgfQoKICAgICAgICAuY2FydC1pdGVtIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgcGFkZGluZzogOHB4IDA7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgMjYuNyUpIiwgImhzbCgyMTcuOSAxMC42JSA3NC45JSkiKX07CiAgICAgICAgfQoKICAgICAgICAuY2FydC10b3RhbCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIHBhZGRpbmctdG9wOiAxNnB4OwogICAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICAgIGJvcmRlci10b3A6IDJweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICAgIH0KICAgICAgYH0KICAgIDwvc3R5bGU+CiAgICAKICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkJhc2ljIFF1YW50aXR5IFNlbGVjdG9yIn0gLnN1YnRpdGxlPSR7IlNpbXBsZSBxdWFudGl0eSBpbnB1dCB3aXRoIGluY3JlbWVudC9kZWNyZW1lbnQgYnV0dG9ucyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWlucHV0LXF1YW50aXR5c2VsZWN0b3IKICAgICAgICAgICAgLmxhYmVsPSR7IlF1YW50aXR5In0KICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IlNlbGVjdCB0aGUgZGVzaXJlZCBxdWFudGl0eSJ9CiAgICAgICAgICAgIC52YWx1ZT0kezF9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXF1YW50aXR5c2VsZWN0b3I+CgogICAgICAgICAgPGRlZXMtaW5wdXQtcXVhbnRpdHlzZWxlY3RvcgogICAgICAgICAgICAubGFiZWw9JHsiSXRlbXMgaW4gQ2FydCJ9CiAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJBZGp1c3QgdGhlIHF1YW50aXR5IG9mIGl0ZW1zIn0KICAgICAgICAgICAgLnZhbHVlPSR7M30KICAgICAgICAgID48L2RlZXMtaW5wdXQtcXVhbnRpdHlzZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IlNob3BwaW5nIENhcnQifSAuc3VidGl0bGU9JHsiTW9kZXJuIGUtY29tbWVyY2UgcHJvZHVjdCBjYXJkcyB3aXRoIGludGVyYWN0aXZlIHF1YW50aXR5IHNlbGVjdG9ycyJ9IC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgdXBkYXRlQ2FydFN1bW1hcnkgPSAoKSA9PiB7CiAgICBjb25zdCBjYXJkMSA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiI2hlYWRwaG9uZXMtcXR5Iik7CiAgICBjb25zdCBjYXJkMiA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiI21vdXNlLXF0eSIpOwogICAgY29uc3QgY2FyZDMgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoIiNrZXlib2FyZC1xdHkiKTsKICAgIGNvbnN0IHF0eTEgPSBjYXJkMT8ucXVhbnRpdHkgfHwgMDsKICAgIGNvbnN0IHF0eTIgPSBjYXJkMj8ucXVhbnRpdHkgfHwgMDsKICAgIGNvbnN0IHF0eTMgPSBjYXJkMz8ucXVhbnRpdHkgfHwgMDsKICAgIGNvbnN0IHByaWNlMSA9IDM0OS45OSAqIHF0eTE7CiAgICBjb25zdCBwcmljZTIgPSA5OS45OSAqIHF0eTI7CiAgICBjb25zdCBwcmljZTMgPSA3OS45OSAqIHF0eTM7CiAgICBjb25zdCB0b3RhbCA9IHByaWNlMSArIHByaWNlMiArIHByaWNlMzsKICAgIGNvbnN0IHN1bW1hcnkgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoIiNjYXJ0LXN1bW1hcnktY29udGVudCIpOwogICAgaWYgKHN1bW1hcnkpIHsKICAgICAgc3VtbWFyeS5pbm5lckhUTUwgPSBgCiAgICAgICAgICAgICAgJHtxdHkxID4gMCA/IGA8ZGl2IGNsYXNzPSJjYXJ0LWl0ZW0iPgogICAgICAgICAgICAgICAgPHNwYW4+U29ueSBXSC0xMDAwWE01ICgke3F0eTF9KTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuPiQke3ByaWNlMS50b0ZpeGVkKDIpfTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj5gIDogIiJ9CiAgICAgICAgICAgICAgJHtxdHkyID4gMCA/IGA8ZGl2IGNsYXNzPSJjYXJ0LWl0ZW0iPgogICAgICAgICAgICAgICAgPHNwYW4+TG9naXRlY2ggTVggTWFzdGVyIDNTICgke3F0eTJ9KTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuPiQke3ByaWNlMi50b0ZpeGVkKDIpfTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj5gIDogIiJ9CiAgICAgICAgICAgICAgJHtxdHkzID4gMCA/IGA8ZGl2IGNsYXNzPSJjYXJ0LWl0ZW0iPgogICAgICAgICAgICAgICAgPHNwYW4+S2V5Y2hyb24gSzIgKCR7cXR5M30pPC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4+JCR7cHJpY2UzLnRvRml4ZWQoMil9PC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PmAgOiAiIn0KICAgICAgICAgICAgICAke3RvdGFsID09PSAwID8gJzxkaXYgY2xhc3M9ImNhcnQtaXRlbSIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICM5OTk7Ij5Zb3VyIGNhcnQgaXMgZW1wdHk8L2Rpdj4nIDogIiJ9CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FydC10b3RhbCI+CiAgICAgICAgICAgICAgICA8c3Bhbj5Ub3RhbDwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuPiQke3RvdGFsLnRvRml4ZWQoMil9PC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgOwogICAgfQogIH07CiAgc2V0VGltZW91dCh1cGRhdGVDYXJ0U3VtbWFyeSwgMTAwKTsKICBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3JBbGwoImRlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQiKS5mb3JFYWNoKChjYXJkKSA9PiB7CiAgICBjYXJkLmFkZEV2ZW50TGlzdGVuZXIoInF1YW50aXR5Q2hhbmdlIiwgdXBkYXRlQ2FydFN1bW1hcnkpOwogIH0pOwp9fT4KICAgICAgICA8ZGl2IGNsYXNzPSJzaG9wcGluZy1ncmlkIj4KICAgICAgICAgIDxkZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkCiAgICAgICAgICAgIGlkPSJoZWFkcGhvbmVzLXF0eSIKICAgICAgICAgICAgLnByb2R1Y3REYXRhPSR7ewogIG5hbWU6ICJTb255IFdILTEwMDBYTTUgV2lyZWxlc3MgSGVhZHBob25lcyIsCiAgY2F0ZWdvcnk6ICJBdWRpbyIsCiAgZGVzY3JpcHRpb246ICJJbmR1c3RyeS1sZWFkaW5nIG5vaXNlIGNhbmNlbGluZyB3aXRoIEF1dG8gTkMgT3B0aW1pemVyIiwKICBwcmljZTogMzQ5Ljk5LAogIG9yaWdpbmFsUHJpY2U6IDM5OS45OSwKICBpY29uTmFtZTogImx1Y2lkZTpoZWFkcGhvbmVzIgp9fQogICAgICAgICAgICAucXVhbnRpdHk9JHsxfQogICAgICAgICAgPjwvZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQKICAgICAgICAgICAgaWQ9Im1vdXNlLXF0eSIKICAgICAgICAgICAgLnByb2R1Y3REYXRhPSR7ewogIG5hbWU6ICJMb2dpdGVjaCBNWCBNYXN0ZXIgM1MiLAogIGNhdGVnb3J5OiAiQWNjZXNzb3JpZXMiLAogIGRlc2NyaXB0aW9uOiAiUGVyZm9ybWFuY2Ugd2lyZWxlc3MgbW91c2Ugd2l0aCB1bHRyYS1mYXN0IHNjcm9sbGluZyIsCiAgcHJpY2U6IDk5Ljk5LAogIGljb25OYW1lOiAibHVjaWRlOm1vdXNlLXBvaW50ZXIiCn19CiAgICAgICAgICAgIC5xdWFudGl0eT0kezJ9CiAgICAgICAgICA+PC9kZWVzLXNob3BwaW5nLXByb2R1Y3RjYXJkPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1zaG9wcGluZy1wcm9kdWN0Y2FyZAogICAgICAgICAgICBpZD0ia2V5Ym9hcmQtcXR5IgogICAgICAgICAgICAucHJvZHVjdERhdGE9JHt7CiAgbmFtZTogIktleWNocm9uIEsyIFdpcmVsZXNzIE1lY2hhbmljYWwgS2V5Ym9hcmQiLAogIGNhdGVnb3J5OiAiS2V5Ym9hcmRzIiwKICBkZXNjcmlwdGlvbjogIkNvbXBhY3QgNzUlIGxheW91dCB3aXRoIGhvdC1zd2FwcGFibGUgc3dpdGNoZXMiLAogIHByaWNlOiA3OS45OSwKICBvcmlnaW5hbFByaWNlOiA5NC45OSwKICBpY29uTmFtZTogImx1Y2lkZTprZXlib2FyZCIKfX0KICAgICAgICAgICAgLnF1YW50aXR5PSR7MX0KICAgICAgICAgID48L2RlZXMtc2hvcHBpbmctcHJvZHVjdGNhcmQ+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9ImNhcnQtc3VtbWFyeSI+CiAgICAgICAgICA8aDMgY2xhc3M9ImNhcnQtc3VtbWFyeS10aXRsZSI+T3JkZXIgU3VtbWFyeTwvaDM+CiAgICAgICAgICA8ZGl2IGlkPSJjYXJ0LXN1bW1hcnktY29udGVudCI+CiAgICAgICAgICAgIDwhLS0gQ29udGVudCB3aWxsIGJlIGR5bmFtaWNhbGx5IHVwZGF0ZWQgLS0+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IlJlcXVpcmVkICYgRGlzYWJsZWQgU3RhdGVzIn0gLnN1YnRpdGxlPSR7IkRpZmZlcmVudCBzdGF0ZXMgZm9yIHZhbGlkYXRpb24gYW5kIHJlc3RyaWN0aW9ucyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWlucHV0LXF1YW50aXR5c2VsZWN0b3IKICAgICAgICAgICAgLmxhYmVsPSR7Ik51bWJlciBvZiBMaWNlbnNlcyJ9CiAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJTZWxlY3QgaG93IG1hbnkgbGljZW5zZXMgeW91IG5lZWQifQogICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAudmFsdWU9JHsxfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1xdWFudGl0eXNlbGVjdG9yPgoKICAgICAgICAgIDxkZWVzLWlucHV0LXF1YW50aXR5c2VsZWN0b3IKICAgICAgICAgICAgLmxhYmVsPSR7IkZpeGVkIFF1YW50aXR5In0KICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IlRoaXMgcXVhbnRpdHkgY2Fubm90IGJlIGNoYW5nZWQifQogICAgICAgICAgICAuZGlzYWJsZWQ9JHt0cnVlfQogICAgICAgICAgICAudmFsdWU9JHs1fQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1xdWFudGl0eXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiT3JkZXIgRm9ybSJ9IC5zdWJ0aXRsZT0keyJDb21wbGV0ZSBvcmRlciBmb3JtIHdpdGggcXVhbnRpdHkgc2VsZWN0aW9uIn0+CiAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgLmxhYmVsPSR7IkN1c3RvbWVyIE5hbWUifSAucmVxdWlyZWQ9JHt0cnVlfT48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAgIC5sYWJlbD0keyJQcm9kdWN0In0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbIkJhc2ljIFBsYW4iLCAiUHJvIFBsYW4iLCAiRW50ZXJwcmlzZSBQbGFuIl19CiAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWRyb3Bkb3duPgogICAgICAgICAgPGRlZXMtaW5wdXQtcXVhbnRpdHlzZWxlY3RvcgogICAgICAgICAgICAubGFiZWw9JHsiUXVhbnRpdHkifQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiTnVtYmVyIG9mIGxpY2Vuc2VzIn0KICAgICAgICAgICAgLnZhbHVlPSR7MX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtcXVhbnRpdHlzZWxlY3Rvcj4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQKICAgICAgICAgICAgLmxhYmVsPSR7IlNwZWNpYWwgSW5zdHJ1Y3Rpb25zIn0KICAgICAgICAgICAgLmlucHV0VHlwZT0keyJ0ZXh0YXJlYSJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgPC9kZWVzLWZvcm0+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGl2PgogIDwvZGVlcy1kZW1vd3JhcHBlcj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXF1YW50aXR5c2VsZWN0b3IvZGVlcy1pbnB1dC1xdWFudGl0eXNlbGVjdG9yLmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfZGlzdF90czI5KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTIyID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMyMyA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0lucHV0UXVhbnRpdHlTZWxlY3RvciA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1pbnB1dC1xdWFudGl0eXNlbGVjdG9yIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNJbnB1dEJhc2U7CiAgbGV0IF92YWx1ZV9kZWNvcmF0b3JzOwogIGxldCBfdmFsdWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWx1ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW5wdXRRdWFudGl0eVNlbGVjdG9yMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3ZhbHVlX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IE51bWJlcgogICAgICB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTIyKHRoaXMsIG51bGwsIF92YWx1ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2YWx1ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmFsdWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmFsdWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZhbHVlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZhbHVlX2luaXRpYWxpemVycywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjIobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzSW5wdXRRdWFudGl0eVNlbGVjdG9yMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMTQ7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiSW5wdXQiXTsKICAgICN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMyMyh0aGlzLCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCAxKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgdmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICAuLi5EZWVzSW5wdXRCYXNlLmJhc2VTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICAgIDpob3N0IHsKICAgICAgICAgIHdpZHRoOiBhdXRvOwogICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgfQoKICAgICAgICAucXVhbnRpdHktY29udGFpbmVyIHsKICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgICBoZWlnaHQ6IDQwcHg7CiAgICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgICAgbWluLXdpZHRoOiAxMjBweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk1JSkiKX07CiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5xdWFudGl0eS1jb250YWluZXIuZGlzYWJsZWQgewogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk1LjElKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgfQoKICAgICAgICAucXVhbnRpdHktY29udGFpbmVyOmhvdmVyOm5vdCguZGlzYWJsZWQpIHsKICAgICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDc5LjglKSIsICJoc2woMCAwJSAyMC45JSkiKX07CiAgICAgICAgfQoKICAgICAgICAucXVhbnRpdHktY29udGFpbmVyOmZvY3VzLXdpdGhpbiB7CiAgICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgNTEuMiUpIiwgImhzbCgyMTcuMiA5MS4yJSA1OS44JSkiKX07CiAgICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA1MS4yJSAvIDAuMSkiLCAiaHNsKDIxNy4yIDkxLjIlIDU5LjglIC8gMC4xKSIpfTsKICAgICAgICB9CgogICAgICAgIC5zZWxlY3RvciB7CiAgICAgICAgICBmbGV4OiAwIDAgNDBweDsKICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA1Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA1NS4xJSkiKX07CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgfQoKICAgICAgICAuc2VsZWN0b3I6aG92ZXIgewogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk1LjElKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICAgIH0KCiAgICAgICAgLnNlbGVjdG9yOmFjdGl2ZSB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTElKSIsICJoc2woMCAwJSAxMSUpIil9OwogICAgICAgIH0KCiAgICAgICAgLnNlbGVjdG9yLm1pbnVzIHsKICAgICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIH0KCiAgICAgICAgLnNlbGVjdG9yLnBsdXMgewogICAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICB9CgogICAgICAgIC5xdWFudGl0eSB7CiAgICAgICAgICBmbGV4OiAxOwogICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDA2ZW07CiAgICAgICAgfQoKICAgICAgICAvKiBLZXlib2FyZCBuYXZpZ2F0aW9uIGZvY3VzIHN0eWxlcyAqLwogICAgICAgIC5zZWxlY3Rvcjpmb2N1cyB7CiAgICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMjE1IDIwLjIlIDE2LjglKSIpfTsKICAgICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgfQoKICAgICAgICAvKiBNaW4gdmFsdWUgc3RhdGUgKi8KICAgICAgICAucXVhbnRpdHktY29udGFpbmVyW2RhdGEtbWluPSJ0cnVlIl0gLnNlbGVjdG9yLm1pbnVzIHsKICAgICAgICAgIG9wYWNpdHk6IDAuMzsKICAgICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgICAgfQoKICAgICAgICAucXVhbnRpdHktY29udGFpbmVyW2RhdGEtbWluPSJ0cnVlIl0gLnNlbGVjdG9yLm1pbnVzOmhvdmVyIHsKICAgICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNTYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNTUuMSUpIil9OwogICAgICAgIH0KCiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImlucHV0LXdyYXBwZXIiPgogICAgICAgICR7dGhpcy5sYWJlbCA/IGIyYDxkZWVzLWxhYmVsIC5sYWJlbD0ke3RoaXMubGFiZWx9IC5kZXNjcmlwdGlvbj0ke3RoaXMuZGVzY3JpcHRpb259IC5yZXF1aXJlZD0ke3RoaXMucmVxdWlyZWR9PjwvZGVlcy1sYWJlbD5gIDogIiJ9CiAgICAgICAgPGRpdiAKICAgICAgICAgIGNsYXNzPSJxdWFudGl0eS1jb250YWluZXIgJHt0aGlzLmRpc2FibGVkID8gImRpc2FibGVkIiA6ICIifSIKICAgICAgICAgIGRhdGEtbWluPSIke3RoaXMudmFsdWUgPD0gMH0iCiAgICAgICAgPgogICAgICAgICAgPGRpdiAKICAgICAgICAgICAgY2xhc3M9InNlbGVjdG9yIG1pbnVzIiAKICAgICAgICAgICAgQGNsaWNrPSIkeygpID0+IHsKICAgICAgICB0aGlzLmRlY3JlYXNlKCk7CiAgICAgIH19IgogICAgICAgICAgICB0YWJpbmRleD0iJHt0aGlzLmRpc2FibGVkID8gIi0xIiA6ICIwIn0iCiAgICAgICAgICAgIEBrZXlkb3duPSIkeyhlMTEpID0+IHsKICAgICAgICBpZiAoZTExLmtleSA9PT0gIkVudGVyIiB8fCBlMTEua2V5ID09PSAiICIpIHsKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgdGhpcy5kZWNyZWFzZSgpOwogICAgICAgIH0KICAgICAgfX0iCiAgICAgICAgICAgIHJvbGU9ImJ1dHRvbiIKICAgICAgICAgICAgYXJpYS1sYWJlbD0iRGVjcmVhc2UgcXVhbnRpdHkiCiAgICAgICAgICA+4oiSPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJxdWFudGl0eSIgYXJpYS1saXZlPSJwb2xpdGUiIGFyaWEtYXRvbWljPSJ0cnVlIj4ke3RoaXMudmFsdWV9PC9kaXY+CiAgICAgICAgICA8ZGl2IAogICAgICAgICAgICBjbGFzcz0ic2VsZWN0b3IgcGx1cyIgCiAgICAgICAgICAgIEBjbGljaz0iJHsoKSA9PiB7CiAgICAgICAgdGhpcy5pbmNyZWFzZSgpOwogICAgICB9fSIKICAgICAgICAgICAgdGFiaW5kZXg9IiR7dGhpcy5kaXNhYmxlZCA/ICItMSIgOiAiMCJ9IgogICAgICAgICAgICBAa2V5ZG93bj0iJHsoZTExKSA9PiB7CiAgICAgICAgaWYgKGUxMS5rZXkgPT09ICJFbnRlciIgfHwgZTExLmtleSA9PT0gIiAiKSB7CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuaW5jcmVhc2UoKTsKICAgICAgICB9CiAgICAgIH19IgogICAgICAgICAgICByb2xlPSJidXR0b24iCiAgICAgICAgICAgIGFyaWEtbGFiZWw9IkluY3JlYXNlIHF1YW50aXR5IgogICAgICAgICAgPis8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgaW5jcmVhc2UoKSB7CiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkgewogICAgICAgIHRoaXMudmFsdWUrKzsKICAgICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgICAgfQogICAgfQogICAgZGVjcmVhc2UoKSB7CiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiB0aGlzLnZhbHVlID4gMCkgewogICAgICAgIHRoaXMudmFsdWUtLTsKICAgICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgICAgfQogICAgfQogICAgZ2V0VmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgfQogICAgc2V0VmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTI7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnMyMyh0aGlzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnMyMyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0lucHV0UXVhbnRpdHlTZWxlY3RvcjIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtcmFkaW9ncm91cC9kZWVzLWlucHV0LXJhZGlvZ3JvdXAuZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmMxNSA9ICgpID0+IGIyYAogIDxkZWVzLWRlbW93cmFwcGVyPgogICAgPHN0eWxlPgogICAgICAke2lgCiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICAgIG1heC13aWR0aDogMTIwMHB4OwogICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGRlZXMtcGFuZWwgewogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZGVlcy1wYW5lbDpsYXN0LWNoaWxkIHsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5pbnB1dC1ncm91cCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMTZweDsKICAgICAgICB9CgogICAgICAgIC5kZW1vLWdyaWQgewogICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMzAwcHgsIDFmcikpOwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAucmVzdWx0LWRpc3BsYXkgewogICAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDEwNSwgMjQyLCAwLjEpOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgIGB9CiAgICA8L3N0eWxlPgogICAgCiAgICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyIxLiBCYXNpYyBSYWRpbyBHcm91cHMifSAuc3VidGl0bGU9JHsiU2ltcGxlIHN0cmluZyBvcHRpb25zIGZvciBjb21tb24gdXNlIGNhc2VzIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iZGVtby1ncmlkIj4KICAgICAgICAgIDxkZWVzLWlucHV0LXJhZGlvZ3JvdXAKICAgICAgICAgICAgLmxhYmVsPSR7IlN1YnNjcmlwdGlvbiBQbGFuIn0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbIkJhc2ljIC0gJDkvbW9udGgiLCAiUHJvIC0gJDI5L21vbnRoIiwgIkVudGVycHJpc2UgLSAkOTkvbW9udGgiXX0KICAgICAgICAgICAgLnNlbGVjdGVkT3B0aW9uPSR7IlBybyAtICQyOS9tb250aCJ9CiAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJDaG9vc2UgeW91ciBzdWJzY3JpcHRpb24gdGllciJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXJhZGlvZ3JvdXA+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LXJhZGlvZ3JvdXAKICAgICAgICAgICAgLmxhYmVsPSR7IlByaW9yaXR5IExldmVsIn0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbIkhpZ2giLCAiTWVkaXVtIiwgIkxvdyJdfQogICAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiTWVkaXVtIn0KICAgICAgICAgICAgLnJlcXVpcmVkPSR7dHJ1ZX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtcmFkaW9ncm91cD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjIuIEhvcml6b250YWwgTGF5b3V0In0gLnN1YnRpdGxlPSR7IlJhZGlvIGdyb3VwcyB3aXRoIGhvcml6b250YWwgYXJyYW5nZW1lbnQifT4KICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1yYWRpb2dyb3VwCiAgICAgICAgICAgIC5sYWJlbD0keyJEbyB5b3UgYWdyZWUgd2l0aCB0aGUgdGVybXM/In0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbIlllcyIsICJObyIsICJNYXliZSJdfQogICAgICAgICAgICAuZGlyZWN0aW9uPSR7Imhvcml6b250YWwifQogICAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiWWVzIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtcmFkaW9ncm91cD4KCiAgICAgICAgICA8ZGVlcy1pbnB1dC1yYWRpb2dyb3VwCiAgICAgICAgICAgIC5sYWJlbD0keyJFeHBlcmllbmNlIExldmVsIn0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbIkJlZ2lubmVyIiwgIkludGVybWVkaWF0ZSIsICJFeHBlcnQiXX0KICAgICAgICAgICAgLmRpcmVjdGlvbj0keyJob3Jpem9udGFsIn0KICAgICAgICAgICAgLnNlbGVjdGVkT3B0aW9uPSR7IkludGVybWVkaWF0ZSJ9CiAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJTZWxlY3QgeW91ciBleHBlcmllbmNlIGxldmVsIHdpdGggd2ViIGRldmVsb3BtZW50In0KICAgICAgICAgID48L2RlZXMtaW5wdXQtcmFkaW9ncm91cD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjMuIEFkdmFuY2VkIE9wdGlvbnMifSAuc3VidGl0bGU9JHsiVXNpbmcgb2JqZWN0IGZvcm1hdCB3aXRoIGtleXMgYW5kIHBheWxvYWRzIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtcmFkaW9ncm91cAogICAgICAgICAgaWQ9ImFkdmFuY2VkLXJhZGlvIgogICAgICAgICAgLmxhYmVsPSR7IlNlbGVjdCBSZWdpb24ifQogICAgICAgICAgLm9wdGlvbnM9JHtbCiAgeyBvcHRpb246ICJVbml0ZWQgU3RhdGVzIChVUyBFYXN0KSIsIGtleTogInVzLWVhc3QiLCBwYXlsb2FkOiB7IHJlZ2lvbjogInVzLWVhc3QtMSIsIGxhdGVuY3k6IDIwIH0gfSwKICB7IG9wdGlvbjogIkV1cm9wZSAoRnJhbmtmdXJ0KSIsIGtleTogImV1LWNlbnRyYWwiLCBwYXlsb2FkOiB7IHJlZ2lvbjogImV1LWNlbnRyYWwtMSIsIGxhdGVuY3k6IDUwIH0gfSwKICB7IG9wdGlvbjogIkFzaWEgUGFjaWZpYyAoU2luZ2Fwb3JlKSIsIGtleTogImFwLXNvdXRoZWFzdCIsIHBheWxvYWQ6IHsgcmVnaW9uOiAiYXAtc291dGhlYXN0LTEiLCBsYXRlbmN5OiAxMjAgfSB9Cl19CiAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiZXUtY2VudHJhbCJ9CiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiQ2hvb3NlIHRoZSBjbG9zZXN0IHJlZ2lvbiBmb3Igb3B0aW1hbCBwZXJmb3JtYW5jZSJ9CiAgICAgICAgICBAY2hhbmdlPSR7KGUxMSkgPT4gewogIGNvbnN0IGRpc3BsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcmVnaW9uLXJlc3VsdCIpOwogIGlmIChkaXNwbGF5KSB7CiAgICBkaXNwbGF5LnRleHRDb250ZW50ID0gIlNlbGVjdGVkOiAiICsgSlNPTi5zdHJpbmdpZnkoZTExLmRldGFpbC52YWx1ZSwgbnVsbCwgMik7CiAgfQp9fQogICAgICAgID48L2RlZXMtaW5wdXQtcmFkaW9ncm91cD4KICAgICAgICA8ZGl2IGlkPSJyZWdpb24tcmVzdWx0IiBjbGFzcz0icmVzdWx0LWRpc3BsYXkiPlNlbGVjdGVkOiB7ICJyZWdpb24iOiAiZXUtY2VudHJhbC0xIiwgImxhdGVuY3kiOiA1MCB9PC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI0LiBTdXJ2ZXkgRXhhbXBsZSJ9IC5zdWJ0aXRsZT0keyJNdWx0aXBsZSByYWRpbyBncm91cHMgZm9yIHN1cnZleXMgYW5kIGZvcm1zIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iZGVtby1ncmlkIj4KICAgICAgICAgIDxkZWVzLWlucHV0LXJhZGlvZ3JvdXAKICAgICAgICAgICAgLmxhYmVsPSR7IkhvdyBzYXRpc2ZpZWQgYXJlIHlvdT8ifQogICAgICAgICAgICAub3B0aW9ucz0ke1siVmVyeSBTYXRpc2ZpZWQiLCAiU2F0aXNmaWVkIiwgIk5ldXRyYWwiLCAiRGlzc2F0aXNmaWVkIiwgIlZlcnkgRGlzc2F0aXNmaWVkIl19CiAgICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJTYXRpc2ZpZWQifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1yYWRpb2dyb3VwPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1yYWRpb2dyb3VwCiAgICAgICAgICAgIC5sYWJlbD0keyJXb3VsZCB5b3UgcmVjb21tZW5kIHVzPyJ9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WyJEZWZpbml0ZWx5IiwgIlByb2JhYmx5IiwgIk5vdCBTdXJlIiwgIlByb2JhYmx5IE5vdCIsICJEZWZpbml0ZWx5IE5vdCJdfQogICAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiUHJvYmFibHkifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1yYWRpb2dyb3VwPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiNS4gU3RhdGVzICYgVmFsaWRhdGlvbiJ9IC5zdWJ0aXRsZT0keyJEaWZmZXJlbnQgc3RhdGVzIGFuZCB2YWxpZGF0aW9uIGV4YW1wbGVzIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iZGVtby1ncmlkIj4KICAgICAgICAgIDxkZWVzLWlucHV0LXJhZGlvZ3JvdXAKICAgICAgICAgICAgLmxhYmVsPSR7IlJlcXVpcmVkIFNlbGVjdGlvbiJ9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WyJPcHRpb24gQSIsICJPcHRpb24gQiIsICJPcHRpb24gQyJdfQogICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiVGhpcyBmaWVsZCBpcyByZXF1aXJlZCJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXJhZGlvZ3JvdXA+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LXJhZGlvZ3JvdXAKICAgICAgICAgICAgLmxhYmVsPSR7IkRpc2FibGVkIFN0YXRlIn0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbIkRpc2FibGVkIE9wdGlvbiAxIiwgIkRpc2FibGVkIE9wdGlvbiAyIiwgIkRpc2FibGVkIE9wdGlvbiAzIl19CiAgICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJEaXNhYmxlZCBPcHRpb24gMiJ9CiAgICAgICAgICAgIC5kaXNhYmxlZD0ke3RydWV9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXJhZGlvZ3JvdXA+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI2LiBTZXR0aW5ncyBFeGFtcGxlIn0gLnN1YnRpdGxlPSR7IkNvbW1vbiBwYXR0ZXJucyBpbiBhcHBsaWNhdGlvbiBzZXR0aW5ncyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWlucHV0LXJhZGlvZ3JvdXAKICAgICAgICAgICAgLmxhYmVsPSR7IlRoZW1lIFByZWZlcmVuY2UifQogICAgICAgICAgICAub3B0aW9ucz0ke1sKICB7IG9wdGlvbjogIkxpZ2h0IFRoZW1lIiwga2V5OiAibGlnaHQiLCBwYXlsb2FkOiAibGlnaHQiIH0sCiAgeyBvcHRpb246ICJEYXJrIFRoZW1lIiwga2V5OiAiZGFyayIsIHBheWxvYWQ6ICJkYXJrIiB9LAogIHsgb3B0aW9uOiAiU3lzdGVtIERlZmF1bHQiLCBrZXk6ICJzeXN0ZW0iLCBwYXlsb2FkOiAiYXV0byIgfQpdfQogICAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiZGFyayJ9CiAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJDaG9vc2UgaG93IHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgYXBwZWFyIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtcmFkaW9ncm91cD4KCiAgICAgICAgICA8ZGVlcy1pbnB1dC1yYWRpb2dyb3VwCiAgICAgICAgICAgIC5sYWJlbD0keyJOb3RpZmljYXRpb24gRnJlcXVlbmN5In0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbIkFsbCBOb3RpZmljYXRpb25zIiwgIkltcG9ydGFudCBPbmx5IiwgIk5vbmUiXX0KICAgICAgICAgICAgLnNlbGVjdGVkT3B0aW9uPSR7IkltcG9ydGFudCBPbmx5In0KICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IkNvbnRyb2wgaG93IG9mdGVuIHlvdSByZWNlaXZlIG5vdGlmaWNhdGlvbnMifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1yYWRpb2dyb3VwPgoKICAgICAgICAgIDxkZWVzLWlucHV0LXJhZGlvZ3JvdXAKICAgICAgICAgICAgLmxhYmVsPSR7Ikxhbmd1YWdlIn0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbIkVuZ2xpc2giLCAiR2VybWFuIiwgIkZyZW5jaCIsICJTcGFuaXNoIiwgIkphcGFuZXNlIl19CiAgICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJFbmdsaXNoIn0KICAgICAgICAgICAgLmRpcmVjdGlvbj0keyJob3Jpem9udGFsIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtcmFkaW9ncm91cD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjcuIEZvcm0gSW50ZWdyYXRpb24ifSAuc3VidGl0bGU9JHsiV29ya3Mgc2VhbWxlc3NseSB3aXRoIGRlZXMtZm9ybSJ9PgogICAgICAgIDxkZWVzLWZvcm0+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0CiAgICAgICAgICAgIC5sYWJlbD0keyJQcm9kdWN0IE5hbWUifQogICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAua2V5PSR7InByb2R1Y3ROYW1lIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtcmFkaW9ncm91cAogICAgICAgICAgICAubGFiZWw9JHsiUHJvZHVjdCBDYXRlZ29yeSJ9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WyJFbGVjdHJvbmljcyIsICJDbG90aGluZyIsICJCb29rcyIsICJIb21lICYgR2FyZGVuIiwgIlNwb3J0cyJdfQogICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAua2V5PSR7ImNhdGVnb3J5In0KICAgICAgICAgID48L2RlZXMtaW5wdXQtcmFkaW9ncm91cD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtcmFkaW9ncm91cAogICAgICAgICAgICAubGFiZWw9JHsiQ29uZGl0aW9uIn0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbIk5ldyIsICJMaWtlIE5ldyIsICJHb29kIiwgIkZhaXIiLCAiUG9vciJdfQogICAgICAgICAgICAuZGlyZWN0aW9uPSR7Imhvcml6b250YWwifQogICAgICAgICAgICAua2V5PSR7ImNvbmRpdGlvbiJ9CiAgICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJOZXcifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1yYWRpb2dyb3VwPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1yYWRpb2dyb3VwCiAgICAgICAgICAgIC5sYWJlbD0keyJTaGlwcGluZyBTcGVlZCJ9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WwogIHsgb3B0aW9uOiAiU3RhbmRhcmQgKDUtNyBkYXlzKSIsIGtleTogInN0YW5kYXJkIiwgcGF5bG9hZDogeyBkYXlzOiA3LCBwcmljZTogMCB9IH0sCiAgeyBvcHRpb246ICJFeHByZXNzICgyLTMgZGF5cykiLCBrZXk6ICJleHByZXNzIiwgcGF5bG9hZDogeyBkYXlzOiAzLCBwcmljZTogMTAgfSB9LAogIHsgb3B0aW9uOiAiT3Zlcm5pZ2h0Iiwga2V5OiAib3Zlcm5pZ2h0IiwgcGF5bG9hZDogeyBkYXlzOiAxLCBwcmljZTogMjUgfSB9Cl19CiAgICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJzdGFuZGFyZCJ9CiAgICAgICAgICAgIC5rZXk9JHsic2hpcHBpbmcifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1yYWRpb2dyb3VwPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdCAudGV4dD0keyJTdWJtaXQgUHJvZHVjdCJ9PjwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kaXY+CiAgPC9kZWVzLWRlbW93cmFwcGVyPgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtcmFkaW9ncm91cC9kZWVzLWlucHV0LXJhZGlvZ3JvdXAuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlMjMgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczI0ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzSW5wdXRSYWRpb2dyb3VwID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLWlucHV0LXJhZGlvZ3JvdXAiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0lucHV0QmFzZTsKICBsZXQgX29wdGlvbnNfZGVjb3JhdG9yczsKICBsZXQgX29wdGlvbnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vcHRpb25zX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZE9wdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfc2VsZWN0ZWRPcHRpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZE9wdGlvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGlyZWN0aW9uX2RlY29yYXRvcnM7CiAgbGV0IF9kaXJlY3Rpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kaXJlY3Rpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbGlkYXRpb25TdGF0ZV9kZWNvcmF0b3JzOwogIGxldCBfdmFsaWRhdGlvblN0YXRlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsaWRhdGlvblN0YXRlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNJbnB1dFJhZGlvZ3JvdXAyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfb3B0aW9uc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfc2VsZWN0ZWRPcHRpb25fZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX2RpcmVjdGlvbl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3ZhbGlkYXRpb25TdGF0ZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nLCByZWZsZWN0OiB0cnVlIH0pXTsKICAgICAgX19lc0RlY29yYXRlMjModGhpcywgbnVsbCwgX29wdGlvbnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAib3B0aW9ucyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAib3B0aW9ucyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5vcHRpb25zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5vcHRpb25zID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX29wdGlvbnNfaW5pdGlhbGl6ZXJzLCBfb3B0aW9uc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTIzKHRoaXMsIG51bGwsIF9zZWxlY3RlZE9wdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWxlY3RlZE9wdGlvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0ZWRPcHRpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0ZWRPcHRpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlbGVjdGVkT3B0aW9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGVkT3B0aW9uX2luaXRpYWxpemVycywgX3NlbGVjdGVkT3B0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjModGhpcywgbnVsbCwgX2RpcmVjdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkaXJlY3Rpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRpcmVjdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5kaXJlY3Rpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmRpcmVjdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kaXJlY3Rpb25faW5pdGlhbGl6ZXJzLCBfZGlyZWN0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjModGhpcywgbnVsbCwgX3ZhbGlkYXRpb25TdGF0ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2YWxpZGF0aW9uU3RhdGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInZhbGlkYXRpb25TdGF0ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai52YWxpZGF0aW9uU3RhdGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZhbGlkYXRpb25TdGF0ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF92YWxpZGF0aW9uU3RhdGVfaW5pdGlhbGl6ZXJzLCBfdmFsaWRhdGlvblN0YXRlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjMobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzSW5wdXRSYWRpb2dyb3VwMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMTU7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiSW5wdXQiXTsKICAgICNvcHRpb25zX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczI0KHRoaXMsIF9vcHRpb25zX2luaXRpYWxpemVycywgW10pOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCBvcHRpb25zKCkgewogICAgICByZXR1cm4gdGhpcy4jb3B0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG9wdGlvbnModmFsdWUyKSB7CiAgICAgIHRoaXMuI29wdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWxlY3RlZE9wdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjQodGhpcywgX29wdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczI0KHRoaXMsIF9zZWxlY3RlZE9wdGlvbl9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgc2VsZWN0ZWRPcHRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZE9wdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNlbGVjdGVkT3B0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3RlZE9wdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2RpcmVjdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjQodGhpcywgX3NlbGVjdGVkT3B0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNCh0aGlzLCBfZGlyZWN0aW9uX2luaXRpYWxpemVycywgInZlcnRpY2FsIikpOwogICAgZ2V0IGRpcmVjdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2RpcmVjdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGRpcmVjdGlvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jZGlyZWN0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdmFsaWRhdGlvblN0YXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyNCh0aGlzLCBfZGlyZWN0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNCh0aGlzLCBfdmFsaWRhdGlvblN0YXRlX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IHZhbGlkYXRpb25TdGF0ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ZhbGlkYXRpb25TdGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbGlkYXRpb25TdGF0ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdmFsaWRhdGlvblN0YXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAvLyBGb3JtIGNvbXBhdGliaWxpdHkKICAgIGdldCB2YWx1ZSgpIHsKICAgICAgY29uc3Qgb3B0aW9uMiA9IHRoaXMuZ2V0T3B0aW9uQnlLZXkodGhpcy5zZWxlY3RlZE9wdGlvbik7CiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uMiA9PT0gIm9iamVjdCIgJiYgb3B0aW9uMi5wYXlsb2FkICE9PSB2b2lkIDApIHsKICAgICAgICByZXR1cm4gb3B0aW9uMi5wYXlsb2FkOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkT3B0aW9uOwogICAgfQogICAgc2V0IHZhbHVlKHZhbCkgewogICAgICBpZiAodHlwZW9mIHZhbCA9PT0gInN0cmluZyIpIHsKICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uID0gdmFsOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IG9wdGlvbjIgPSB0aGlzLm9wdGlvbnMuZmluZCgob3B0KSA9PiB0eXBlb2Ygb3B0ID09PSAib2JqZWN0IiAmJiBvcHQucGF5bG9hZCA9PT0gdmFsKTsKICAgICAgICBpZiAob3B0aW9uMiAmJiB0eXBlb2Ygb3B0aW9uMiA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSBvcHRpb24yLmtleTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgLi4uRGVlc0lucHV0QmFzZS5iYXNlU3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgICogewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgJ1JvYm90bycsIHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC5tYWluY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAxMHB4OwogICAgICB9CgogICAgICAubWFpbmNvbnRhaW5lci5ob3Jpem9udGFsIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBnYXA6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5yYWRpby1vcHRpb24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEwcHg7CiAgICAgICAgcGFkZGluZzogNnB4IDA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgfQoKICAgICAgLm1haW5jb250YWluZXIuaG9yaXpvbnRhbCAucmFkaW8tb3B0aW9uIHsKICAgICAgICBwYWRkaW5nOiA2cHggMjBweCA2cHggMDsKICAgICAgfQoKICAgICAgLnJhZGlvLW9wdGlvbjpob3ZlciAucmFkaW8tY2lyY2xlIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDIwLjIlIDY1LjElKSIsICJoc2woMjE1IDIwLjIlIDM1LjElKSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTEuOCUpIil9OwogICAgICB9CgogICAgICAucmFkaW8tb3B0aW9uOmhvdmVyIC5yYWRpby1sYWJlbCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDguOCUpIiwgImhzbCgyMTAgNDAlIDk4JSkiKX07CiAgICAgIH0KCiAgICAgIC5yYWRpby1jaXJjbGUgewogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMjAuMiUgNjUuMSUpIiwgImhzbCgyMTUgMjAuMiUgMzUuMSUpIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMjE1IDMwJSA2LjglKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5yYWRpby1vcHRpb24uc2VsZWN0ZWQgLnJhZGlvLWNpcmNsZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNy4yIDkxLjIlIDU5LjglKSIsICJoc2woMjEzLjEgOTMuOSUgNjcuOCUpIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIiwgImhzbCgyMTMuMSA5My45JSA2Ny44JSkiKX07CiAgICAgIH0KCiAgICAgIC5yYWRpby1vcHRpb24uc2VsZWN0ZWQgLnJhZGlvLWNpcmNsZTo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogOHB4OwogICAgICAgIGhlaWdodDogOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDIxNSAzMCUgNi44JSkiKX07CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICB9CgogICAgICAucmFkaW8tb3B0aW9uLnNlbGVjdGVkIC5yYWRpby1jaXJjbGU6OmFmdGVyIHsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgICB9CgogICAgICAucmFkaW8tY2lyY2xlOmZvY3VzLXZpc2libGUgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMjE1IDMwJSAzLjklKSIpfSwKICAgICAgICAgICAgICAgICAgICAwIDAgMCA0cHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTcuMiA5MS4yJSA1OS44JSkiLCAiaHNsKDIxMy4xIDkzLjklIDY3LjglKSIpfTsKICAgICAgfQoKICAgICAgLnJhZGlvLWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgMjYuNyUpIiwgImhzbCgyMTcuOSAxMC42JSA3NC45JSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogY29sb3IgMC4ycyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMDZlbTsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfQoKICAgICAgLnJhZGlvLW9wdGlvbi5zZWxlY3RlZCAucmFkaW8tbGFiZWwgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAucmFkaW8tb3B0aW9uIHsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgLnJhZGlvLW9wdGlvbjpob3ZlciAucmFkaW8tY2lyY2xlIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDIwLjIlIDY1LjElKSIsICJoc2woMjE1IDIwLjIlIDM1LjElKSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDIxNSAzMCUgNi44JSkiKX07CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIC5yYWRpby1vcHRpb246aG92ZXIgLnJhZGlvLWxhYmVsIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgMjYuNyUpIiwgImhzbCgyMTcuOSAxMC42JSA3NC45JSkiKX07CiAgICAgIH0KCiAgICAgIC5sYWJlbC10ZXh0IHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgOC44JSkiLCAiaHNsKDIxMCA0MCUgOTglKSIpfTsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMDZlbTsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfQoKICAgICAgLmRlc2NyaXB0aW9uLXRleHQgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA1Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA1NS4xJSkiKX07CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgICBsaW5lLWhlaWdodDogMS41OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMDNlbTsKICAgICAgfQoKICAgICAgLyogVmFsaWRhdGlvbiBzdHlsZXMgKi8KICAgICAgOmhvc3QoW3ZhbGlkYXRpb25TdGF0ZT0iaW52YWxpZCJdKSAucmFkaW8tY2lyY2xlIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA3Mi4yJSA1MC42JSkiLCAiaHNsKDAgNjIuOCUgMzAuNiUpIil9OwogICAgICB9CgogICAgICA6aG9zdChbdmFsaWRhdGlvblN0YXRlPSJpbnZhbGlkIl0pIC5yYWRpby1vcHRpb24uc2VsZWN0ZWQgLnJhZGlvLWNpcmNsZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzIuMiUgNTAuNiUpIiwgImhzbCgwIDYyLjglIDMwLjYlKSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzIuMiUgNTAuNiUpIiwgImhzbCgwIDYyLjglIDMwLjYlKSIpfTsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZhbGlkYXRpb25TdGF0ZT0idmFsaWQiXSkgLnJhZGlvLW9wdGlvbi5zZWxlY3RlZCAucmFkaW8tY2lyY2xlIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyLjEgNzAuNiUgNDUuMyUpIiwgImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgxNDIuMSA3MC42JSA0NS4zJSkiLCAiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlKSIpfTsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZhbGlkYXRpb25TdGF0ZT0id2FybiJdKSAucmFkaW8tb3B0aW9uLnNlbGVjdGVkIC5yYWRpby1jaXJjbGUgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCg0NS40IDkzLjQlIDQ3LjUlKSIsICJoc2woNDUuNCA5My40JSA0Ny41JSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCg0NS40IDkzLjQlIDQ3LjUlKSIsICJoc2woNDUuNCA5My40JSA0Ny41JSkiKX07CiAgICAgIH0KCiAgICAgIC8qIE92ZXJyaWRlIGJhc2UgZ3JpZCBsYXlvdXQgZm9yIHJhZGlvZ3JvdXAgdG8gcHJldmVudCBsYXJnZSBnYXBzICovCiAgICAgIDpob3N0KFtsYWJlbC1wb3NpdGlvbj0ibGVmdCJdKSAuaW5wdXQtd3JhcHBlciB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KFtsYWJlbC1wb3NpdGlvbj0icmlnaHQiXSkgLmlucHV0LXdyYXBwZXIgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogYXV0byBhdXRvOwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImlucHV0LXdyYXBwZXIiPgogICAgICAgICR7dGhpcy5sYWJlbCA/IGIyYDxkaXYgY2xhc3M9ImxhYmVsLXRleHQiPiR7dGhpcy5sYWJlbH08L2Rpdj5gIDogIiJ9CiAgICAgICAgPGRpdiBjbGFzcz0ibWFpbmNvbnRhaW5lciAke3RoaXMuZGlyZWN0aW9ufSI+CiAgICAgICAgICAke3RoaXMub3B0aW9ucy5tYXAoKG9wdGlvbjIpID0+IHsKICAgICAgICBjb25zdCBvcHRpb25LZXkgPSB0aGlzLmdldE9wdGlvbktleShvcHRpb24yKTsKICAgICAgICBjb25zdCBvcHRpb25MYWJlbCA9IHRoaXMuZ2V0T3B0aW9uTGFiZWwob3B0aW9uMik7CiAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRPcHRpb24gPT09IG9wdGlvbktleTsKICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgICAgICAgPGRpdiAKICAgICAgICAgICAgICAgIGNsYXNzPSJyYWRpby1vcHRpb24gJHtpc1NlbGVjdGVkID8gInNlbGVjdGVkIiA6ICIifSIKICAgICAgICAgICAgICAgIEBjbGljaz0iJHsoKSA9PiB0aGlzLnNlbGVjdE9wdGlvbihvcHRpb25LZXkpfSIKICAgICAgICAgICAgICAgIEBrZXlkb3duPSIkeyhlMTEpID0+IHRoaXMuaGFuZGxlS2V5ZG93bihlMTEsIG9wdGlvbktleSl9IgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxkaXYgCiAgICAgICAgICAgICAgICAgIGNsYXNzPSJyYWRpby1jaXJjbGUiIAogICAgICAgICAgICAgICAgICB0YWJpbmRleD0iJHt0aGlzLmRpc2FibGVkID8gIi0xIiA6ICIwIn0iCiAgICAgICAgICAgICAgICAgIHJvbGU9InJhZGlvIgogICAgICAgICAgICAgICAgICBhcmlhLWNoZWNrZWQ9IiR7aXNTZWxlY3RlZH0iCiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9IiR7b3B0aW9uTGFiZWx9IgogICAgICAgICAgICAgICAgPjwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icmFkaW8tbGFiZWwiPiR7b3B0aW9uTGFiZWx9PC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIGA7CiAgICAgIH0pfQogICAgICAgIDwvZGl2PgogICAgICAgICR7dGhpcy5kZXNjcmlwdGlvbiA/IGIyYDxkaXYgY2xhc3M9ImRlc2NyaXB0aW9uLXRleHQiPiR7dGhpcy5kZXNjcmlwdGlvbn08L2Rpdj5gIDogIiJ9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGdldE9wdGlvbktleShvcHRpb24yKSB7CiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uMiA9PT0gInN0cmluZyIpIHsKICAgICAgICByZXR1cm4gb3B0aW9uMjsKICAgICAgfQogICAgICByZXR1cm4gb3B0aW9uMi5rZXk7CiAgICB9CiAgICBnZXRPcHRpb25MYWJlbChvcHRpb24yKSB7CiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uMiA9PT0gInN0cmluZyIpIHsKICAgICAgICByZXR1cm4gb3B0aW9uMjsKICAgICAgfQogICAgICByZXR1cm4gb3B0aW9uMi5vcHRpb247CiAgICB9CiAgICBnZXRPcHRpb25CeUtleShrZXkyKSB7CiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZCgob3B0KSA9PiB0aGlzLmdldE9wdGlvbktleShvcHQpID09PSBrZXkyKTsKICAgIH0KICAgIHNlbGVjdE9wdGlvbihrZXkyKSB7CiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5zZWxlY3RlZE9wdGlvbjsKICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IGtleTI7CiAgICAgIGlmIChvbGRWYWx1ZSAhPT0ga2V5MikgewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImNoYW5nZSIsIHsKICAgICAgICAgIGRldGFpbDogeyB2YWx1ZTogdGhpcy52YWx1ZSB9LAogICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgfSkpOwogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImlucHV0IiwgewogICAgICAgICAgZGV0YWlsOiB7IHZhbHVlOiB0aGlzLnZhbHVlIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgIH0KICAgIH0KICAgIGdldFZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy52YWx1ZTsKICAgIH0KICAgIHNldFZhbHVlKHZhbCkgewogICAgICB0aGlzLnZhbHVlID0gdmFsOwogICAgfQogICAgYXN5bmMgdmFsaWRhdGUoKSB7CiAgICAgIGlmICh0aGlzLnJlcXVpcmVkICYmICF0aGlzLnNlbGVjdGVkT3B0aW9uKSB7CiAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RhdGUgPSAiaW52YWxpZCI7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHRoaXMudmFsaWRhdGlvblN0YXRlID0gInZhbGlkIjsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIGlmICghdGhpcy5zZWxlY3RlZE9wdGlvbiAmJiB0aGlzLm9wdGlvbnMubGVuZ3RoID4gMCAmJiAhdGhpcy5yZXF1aXJlZCkgewogICAgICAgIGNvbnN0IGZpcnN0T3B0aW9uID0gdGhpcy5vcHRpb25zWzBdOwogICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSB0aGlzLmdldE9wdGlvbktleShmaXJzdE9wdGlvbik7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZUtleWRvd24oZXZlbnQsIG9wdGlvbktleSkgewogICAgICBpZiAodGhpcy5kaXNhYmxlZCkKICAgICAgICByZXR1cm47CiAgICAgIGlmIChldmVudC5rZXkgPT09ICIgIiB8fCBldmVudC5rZXkgPT09ICJFbnRlciIpIHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMuc2VsZWN0T3B0aW9uKG9wdGlvbktleSk7CiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAiQXJyb3dEb3duIiB8fCBldmVudC5rZXkgPT09ICJBcnJvd1JpZ2h0IikgewogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdGhpcy5mb2N1c05leHRPcHRpb24oKTsKICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICJBcnJvd1VwIiB8fCBldmVudC5rZXkgPT09ICJBcnJvd0xlZnQiKSB7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICB0aGlzLmZvY3VzUHJldmlvdXNPcHRpb24oKTsKICAgICAgfQogICAgfQogICAgZm9jdXNOZXh0T3B0aW9uKCkgewogICAgICBjb25zdCByYWRpb0NpcmNsZXMgPSBBcnJheS5mcm9tKHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCIucmFkaW8tY2lyY2xlIikpOwogICAgICBjb25zdCBjdXJyZW50SW5kZXggPSByYWRpb0NpcmNsZXMuZmluZEluZGV4KChlbCkgPT4gZWwgPT09IHRoaXMuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50KTsKICAgICAgY29uc3QgbmV4dEluZGV4ID0gKGN1cnJlbnRJbmRleCArIDEpICUgcmFkaW9DaXJjbGVzLmxlbmd0aDsKICAgICAgcmFkaW9DaXJjbGVzW25leHRJbmRleF0uZm9jdXMoKTsKICAgIH0KICAgIGZvY3VzUHJldmlvdXNPcHRpb24oKSB7CiAgICAgIGNvbnN0IHJhZGlvQ2lyY2xlcyA9IEFycmF5LmZyb20odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5yYWRpby1jaXJjbGUiKSk7CiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHJhZGlvQ2lyY2xlcy5maW5kSW5kZXgoKGVsKSA9PiBlbCA9PT0gdGhpcy5zaGFkb3dSb290LmFjdGl2ZUVsZW1lbnQpOwogICAgICBjb25zdCBwcmV2SW5kZXggPSBjdXJyZW50SW5kZXggPD0gMCA/IHJhZGlvQ2lyY2xlcy5sZW5ndGggLSAxIDogY3VycmVudEluZGV4IC0gMTsKICAgICAgcmFkaW9DaXJjbGVzW3ByZXZJbmRleF0uZm9jdXMoKTsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczI0KHRoaXMsIF92YWxpZGF0aW9uU3RhdGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnMyNChfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0lucHV0UmFkaW9ncm91cDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWZvcm0vZGVlcy1mb3JtLXN1Ym1pdC9kZWVzLWZvcm0tc3VibWl0LmRlbW8uanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIGRlbW9GdW5jMTYgPSAoKSA9PiBiMmAKICA8c3R5bGU+CiAgICAuZGVtby1jb250YWluZXIgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDI0cHg7CiAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICB9CiAgICAuZGVtby1zZWN0aW9uIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgZ2FwOiAxMnB4OwogICAgfQogICAgLmRlbW8tc2VjdGlvbiBoMyB7CiAgICAgIG1hcmdpbjogMCAwIDhweCAwOwogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIGNvbG9yOiAjODg4OwogICAgfQogICAgLmRlbW8tcm93IHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZ2FwOiAxMnB4OwogICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICB9CiAgPC9zdHlsZT4KICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICA8aDM+QmFzaWMgVXNhZ2U8L2gzPgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXJvdyI+CiAgICAgICAgPGRlZXMtZm9ybS1zdWJtaXQ+U3VibWl0IEZvcm08L2RlZXMtZm9ybS1zdWJtaXQ+CiAgICAgICAgPGRlZXMtZm9ybS1zdWJtaXQgdGV4dD0iV2l0aCBUZXh0IFByb3BlcnR5Ij48L2RlZXMtZm9ybS1zdWJtaXQ+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgPGgzPldpdGggSWNvbnMgKGluaGVyaXRlZCBmcm9tIERlZXNCdXR0b24pPC9oMz4KICAgICAgPGRpdiBjbGFzcz0iZGVtby1yb3ciPgogICAgICAgIDxkZWVzLWZvcm0tc3VibWl0IGljb249Imx1Y2lkZTpzZW5kIj5TdWJtaXQ8L2RlZXMtZm9ybS1zdWJtaXQ+CiAgICAgICAgPGRlZXMtZm9ybS1zdWJtaXQgaWNvbj0ibHVjaWRlOnNhdmUiIGljb25Qb3NpdGlvbj0ibGVmdCI+U2F2ZSBGb3JtPC9kZWVzLWZvcm0tc3VibWl0PgogICAgICAgIDxkZWVzLWZvcm0tc3VibWl0IGljb249Imx1Y2lkZTphcnJvdy1yaWdodCIgaWNvblBvc2l0aW9uPSJyaWdodCI+Q29udGludWU8L2RlZXMtZm9ybS1zdWJtaXQ+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgPGgzPkJ1dHRvbiBUeXBlczwvaDM+CiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tcm93Ij4KICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdCB0eXBlPSJoaWdobGlnaHRlZCIgaWNvbj0ibHVjaWRlOnNlbmQiPkhpZ2hsaWdodGVkPC9kZWVzLWZvcm0tc3VibWl0PgogICAgICAgIDxkZWVzLWZvcm0tc3VibWl0IHR5cGU9Im5vcm1hbCIgaWNvbj0ibHVjaWRlOnNlbmQiPk5vcm1hbDwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdCB0eXBlPSJkaXNjcmVldCIgaWNvbj0ibHVjaWRlOnNlbmQiPkRpc2NyZWV0PC9kZWVzLWZvcm0tc3VibWl0PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgIDxoMz5TaXplczwvaDM+CiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tcm93Ij4KICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdCBzaXplPSJzbWFsbCIgaWNvbj0ibHVjaWRlOnNlbmQiPlNtYWxsPC9kZWVzLWZvcm0tc3VibWl0PgogICAgICAgIDxkZWVzLWZvcm0tc3VibWl0IHNpemU9Im5vcm1hbCIgaWNvbj0ibHVjaWRlOnNlbmQiPk5vcm1hbDwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdCBzaXplPSJsYXJnZSIgaWNvbj0ibHVjaWRlOnNlbmQiPkxhcmdlPC9kZWVzLWZvcm0tc3VibWl0PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgIDxoMz5TdGF0ZXM8L2gzPgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXJvdyI+CiAgICAgICAgPGRlZXMtZm9ybS1zdWJtaXQgc3RhdHVzPSJub3JtYWwiIGljb249Imx1Y2lkZTpzZW5kIj5Ob3JtYWw8L2RlZXMtZm9ybS1zdWJtaXQ+CiAgICAgICAgPGRlZXMtZm9ybS1zdWJtaXQgc3RhdHVzPSJwZW5kaW5nIiBpY29uPSJsdWNpZGU6c2VuZCI+UGVuZGluZzwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdCBzdGF0dXM9InN1Y2Nlc3MiIGljb249Imx1Y2lkZTpjaGVjayI+U3VjY2VzczwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdCBzdGF0dXM9ImVycm9yIiBpY29uPSJsdWNpZGU6eCI+RXJyb3I8L2RlZXMtZm9ybS1zdWJtaXQ+CiAgICAgICAgPGRlZXMtZm9ybS1zdWJtaXQgZGlzYWJsZWQgaWNvbj0ibHVjaWRlOnNlbmQiPkRpc2FibGVkPC9kZWVzLWZvcm0tc3VibWl0PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgIDxoMz5JbiBhIEZvcm0gQ29udGV4dDwvaDM+CiAgICAgIDxkZWVzLWZvcm0+CiAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCBsYWJlbD0iTmFtZSIga2V5PSJuYW1lIj48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IGxhYmVsPSJFbWFpbCIga2V5PSJlbWFpbCI+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgPGRlZXMtZm9ybS1zdWJtaXQgaWNvbj0ibHVjaWRlOnNlbmQiIHR5cGU9ImhpZ2hsaWdodGVkIj5TdWJtaXQgRm9ybTwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgPC9kZWVzLWZvcm0+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1mb3JtL2RlZXMtZm9ybS1zdWJtaXQvZGVlcy1mb3JtLXN1Ym1pdC5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGUyNCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMjUgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNGb3JtU3VibWl0ID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLWZvcm0tc3VibWl0IildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfZGlzYWJsZWRfZGVjb3JhdG9yczsKICBsZXQgX2Rpc2FibGVkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGlzYWJsZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RleHRfZGVjb3JhdG9yczsKICBsZXQgX3RleHRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90ZXh0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zdGF0dXNfZGVjb3JhdG9yczsKICBsZXQgX3N0YXR1c19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3N0YXR1c19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdHlwZV9kZWNvcmF0b3JzOwogIGxldCBfdHlwZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3R5cGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NpemVfZGVjb3JhdG9yczsKICBsZXQgX3NpemVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaXplX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pY29uX2RlY29yYXRvcnM7CiAgbGV0IF9pY29uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaWNvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaWNvblBvc2l0aW9uX2RlY29yYXRvcnM7CiAgbGV0IF9pY29uUG9zaXRpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pY29uUG9zaXRpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0Zvcm1TdWJtaXQyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfZGlzYWJsZWRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSldOwogICAgICBfdGV4dF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3N0YXR1c19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3R5cGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZywgcmVmbGVjdDogdHJ1ZSB9KV07CiAgICAgIF9zaXplX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcsIHJlZmxlY3Q6IHRydWUgfSldOwogICAgICBfaWNvbl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2ljb25Qb3NpdGlvbl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX19lc0RlY29yYXRlMjQodGhpcywgbnVsbCwgX2Rpc2FibGVkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImRpc2FibGVkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkaXNhYmxlZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5kaXNhYmxlZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZGlzYWJsZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZGlzYWJsZWRfaW5pdGlhbGl6ZXJzLCBfZGlzYWJsZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNCh0aGlzLCBudWxsLCBfdGV4dF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0ZXh0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0ZXh0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRleHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnRleHQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGV4dF9pbml0aWFsaXplcnMsIF90ZXh0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjQodGhpcywgbnVsbCwgX3N0YXR1c19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzdGF0dXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInN0YXR1cyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zdGF0dXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnN0YXR1cyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zdGF0dXNfaW5pdGlhbGl6ZXJzLCBfc3RhdHVzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjQodGhpcywgbnVsbCwgX3R5cGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidHlwZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidHlwZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50eXBlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50eXBlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3R5cGVfaW5pdGlhbGl6ZXJzLCBfdHlwZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTI0KHRoaXMsIG51bGwsIF9zaXplX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNpemUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNpemUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2l6ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2l6ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaXplX2luaXRpYWxpemVycywgX3NpemVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNCh0aGlzLCBudWxsLCBfaWNvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpY29uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpY29uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmljb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmljb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaWNvbl9pbml0aWFsaXplcnMsIF9pY29uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjQodGhpcywgbnVsbCwgX2ljb25Qb3NpdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpY29uUG9zaXRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImljb25Qb3NpdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pY29uUG9zaXRpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmljb25Qb3NpdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pY29uUG9zaXRpb25faW5pdGlhbGl6ZXJzLCBfaWNvblBvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjQobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzRm9ybVN1Ym1pdDIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzE2OwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkZvcm0iLCAiQnV0dG9uIl07CiAgICAjZGlzYWJsZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMjUodGhpcywgX2Rpc2FibGVkX2luaXRpYWxpemVycywgZmFsc2UpOwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcm9wZXJ0aWVzIGZvcndhcmRlZCB0byBpbnRlcm5hbCBkZWVzLWJ1dHRvbgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBnZXQgZGlzYWJsZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNkaXNhYmxlZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGRpc2FibGVkKHZhbHVlMikgewogICAgICB0aGlzLiNkaXNhYmxlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3RleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI1KHRoaXMsIF9kaXNhYmxlZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjUodGhpcywgX3RleHRfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCB0ZXh0KCkgewogICAgICByZXR1cm4gdGhpcy4jdGV4dF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRleHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3RleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzdGF0dXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI1KHRoaXMsIF90ZXh0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNSh0aGlzLCBfc3RhdHVzX2luaXRpYWxpemVycywgIm5vcm1hbCIpKTsKICAgIGdldCBzdGF0dXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzdGF0dXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzdGF0dXModmFsdWUyKSB7CiAgICAgIHRoaXMuI3N0YXR1c19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3R5cGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI1KHRoaXMsIF9zdGF0dXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczI1KHRoaXMsIF90eXBlX2luaXRpYWxpemVycywgImRlZmF1bHQiKSk7CiAgICBnZXQgdHlwZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3R5cGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0eXBlKHZhbHVlMikgewogICAgICB0aGlzLiN0eXBlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjUodGhpcywgX3R5cGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczI1KHRoaXMsIF9zaXplX2luaXRpYWxpemVycywgImRlZmF1bHQiKSk7CiAgICBnZXQgc2l6ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NpemVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaXplKHZhbHVlMikgewogICAgICB0aGlzLiNzaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaWNvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjUodGhpcywgX3NpemVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczI1KHRoaXMsIF9pY29uX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgaWNvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2ljb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpY29uKHZhbHVlMikgewogICAgICB0aGlzLiNpY29uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaWNvblBvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyNSh0aGlzLCBfaWNvbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjUodGhpcywgX2ljb25Qb3NpdGlvbl9pbml0aWFsaXplcnMsICJsZWZ0IikpOwogICAgZ2V0IGljb25Qb3NpdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2ljb25Qb3NpdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGljb25Qb3NpdGlvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jaWNvblBvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnMyNSh0aGlzLCBfaWNvblBvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIGRlZXMtYnV0dG9uIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGVlcy1idXR0b24KICAgICAgICAuc3RhdHVzPSR7dGhpcy5zdGF0dXN9CiAgICAgICAgLnR5cGU9JHt0aGlzLnR5cGV9CiAgICAgICAgLnNpemU9JHt0aGlzLnNpemV9CiAgICAgICAgLmljb249JHt0aGlzLmljb259CiAgICAgICAgLmljb25Qb3NpdGlvbj0ke3RoaXMuaWNvblBvc2l0aW9ufQogICAgICAgIC50ZXh0PSR7dGhpcy50ZXh0fQogICAgICAgID9kaXNhYmxlZD0ke3RoaXMuZGlzYWJsZWR9CiAgICAgICAgQGNsaWNrZWQ9JHt0aGlzLnN1Ym1pdH0KICAgICAgPgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kZWVzLWJ1dHRvbj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBzdWJtaXQoKSB7CiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHBhcmVudEZvcm1FbGVtZW50ID0gdGhpcy5jbG9zZXN0KCJkZWVzLWZvcm0iKTsKICAgICAgaWYgKHBhcmVudEZvcm1FbGVtZW50ICYmIHBhcmVudEZvcm1FbGVtZW50LmdhdGhlckFuZERpc3BhdGNoKSB7CiAgICAgICAgcGFyZW50Rm9ybUVsZW1lbnQuZ2F0aGVyQW5kRGlzcGF0Y2goKTsKICAgICAgfQogICAgfQogICAgYXN5bmMgZm9jdXMoKSB7CiAgICAgIGNvbnN0IGRvbXRvb2xzID0gYXdhaXQgdGhpcy5kb210b29sc1Byb21pc2U7CiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkgewogICAgICAgIGF3YWl0IGRvbXRvb2xzLmNvbnZlbmllbmNlLnNtYXJ0ZGVsYXkuZGVsYXlGb3IoMCk7CiAgICAgICAgdGhpcy5zdWJtaXQoKTsKICAgICAgfQogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnMyNShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0Zvcm1TdWJtaXQyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LWRyb3Bkb3duL2RlZXMtaW5wdXQtZHJvcGRvd24uZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmMxNyA9ICgpID0+IGIyYAogIDxzdHlsZT4KICAgICR7aWAKICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMjAwcHg7CiAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgIH0KICAgICAgCiAgICAgIGRlZXMtcGFuZWwgewogICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIGRlZXMtcGFuZWw6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgfQogICAgICAKICAgICAgLmhvcml6b250YWwtZ3JvdXAgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDE2cHg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CiAgICAgIAogICAgICAuaW5wdXQtZ3JvdXAgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5zcGFjZXIgewogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGNvbG9yOiAjOTk5OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQogICAgYH0KICA8L3N0eWxlPgogIAogIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgY291bnRyeURyb3Bkb3duID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCdkZWVzLWlucHV0LWRyb3Bkb3duW2xhYmVsPSJTZWxlY3QgQ291bnRyeSJdJyk7CiAgY29uc3Qgcm9sZURyb3Bkb3duID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCdkZWVzLWlucHV0LWRyb3Bkb3duW2xhYmVsPSJTZWxlY3QgUm9sZSJdJyk7CiAgaWYgKGNvdW50cnlEcm9wZG93bikgewogICAgY291bnRyeURyb3Bkb3duLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGVkT3B0aW9uIiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJDb3VudHJ5IHNlbGVjdGVkOiIsIGV2ZW50LmRldGFpbCk7CiAgICB9KTsKICB9CiAgaWYgKHJvbGVEcm9wZG93bikgewogICAgcm9sZURyb3Bkb3duLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGVkT3B0aW9uIiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJSb2xlIHNlbGVjdGVkOiIsIGV2ZW50LmRldGFpbCk7CiAgICB9KTsKICB9Cn19PgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiMS4gQmFzaWMgRHJvcGRvd25zIn0gLnN1YnRpdGxlPSR7IlN0YW5kYXJkIGRyb3Bkb3duIHdpdGggc2VhcmNoIGZ1bmN0aW9uYWxpdHkgYW5kIHZhcmlvdXMgb3B0aW9ucyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAgIC5sYWJlbD0keyJTZWxlY3QgQ291bnRyeSJ9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WwogIHsgb3B0aW9uOiAiVW5pdGVkIFN0YXRlcyIsIGtleTogInVzIiB9LAogIHsgb3B0aW9uOiAiQ2FuYWRhIiwga2V5OiAiY2EiIH0sCiAgeyBvcHRpb246ICJHZXJtYW55Iiwga2V5OiAiZGUiIH0sCiAgeyBvcHRpb246ICJGcmFuY2UiLCBrZXk6ICJmciIgfSwKICB7IG9wdGlvbjogIlVuaXRlZCBLaW5nZG9tIiwga2V5OiAidWsiIH0sCiAgeyBvcHRpb246ICJBdXN0cmFsaWEiLCBrZXk6ICJhdSIgfSwKICB7IG9wdGlvbjogIkphcGFuIiwga2V5OiAianAiIH0sCiAgeyBvcHRpb246ICJCcmF6aWwiLCBrZXk6ICJiciIgfQpdfQogICAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHt7IG9wdGlvbjogIlVuaXRlZCBTdGF0ZXMiLCBrZXk6ICJ1cyIgfX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtZHJvcGRvd24+CgogICAgICAgICAgPGRlZXMtaW5wdXQtZHJvcGRvd24KICAgICAgICAgICAgLmxhYmVsPSR7IlNlbGVjdCBSb2xlIn0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbCiAgeyBvcHRpb246ICJBZG1pbmlzdHJhdG9yIiwga2V5OiAiYWRtaW4iIH0sCiAgeyBvcHRpb246ICJFZGl0b3IiLCBrZXk6ICJlZGl0b3IiIH0sCiAgeyBvcHRpb246ICJWaWV3ZXIiLCBrZXk6ICJ2aWV3ZXIiIH0sCiAgeyBvcHRpb246ICJHdWVzdCIsIGtleTogImd1ZXN0IiB9Cl19CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWRyb3Bkb3duPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgICAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgcHJpb3JpdHlEcm9wZG93biA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC1kcm9wZG93biIpOwogIGlmIChwcmlvcml0eURyb3Bkb3duKSB7CiAgICBwcmlvcml0eURyb3Bkb3duLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGVkT3B0aW9uIiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKGBQcmlvcml0eSBjaGFuZ2VkIHRvOiAke2V2ZW50LmRldGFpbC5vcHRpb259YCk7CiAgICB9KTsKICB9Cn19PgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiMi4gV2l0aG91dCBTZWFyY2gifSAuc3VidGl0bGU9JHsiRHJvcGRvd24gd2l0aCBzZWFyY2ggZnVuY3Rpb25hbGl0eSBkaXNhYmxlZCBmb3Igc2ltcGxlciBzZWxlY3Rpb24ifT4KICAgICAgICA8ZGVlcy1pbnB1dC1kcm9wZG93bgogICAgICAgICAgLmxhYmVsPSR7IlByaW9yaXR5IExldmVsIn0KICAgICAgICAgIC5lbmFibGVTZWFyY2g9JHtmYWxzZX0KICAgICAgICAgIC5vcHRpb25zPSR7WwogIHsgb3B0aW9uOiAiSGlnaCIsIGtleTogImhpZ2giIH0sCiAgeyBvcHRpb246ICJNZWRpdW0iLCBrZXk6ICJtZWRpdW0iIH0sCiAgeyBvcHRpb246ICJMb3ciLCBrZXk6ICJsb3ciIH0KXX0KICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0ke3sgb3B0aW9uOiAiTWVkaXVtIiwga2V5OiAibWVkaXVtIiB9fQogICAgICAgID48L2RlZXMtaW5wdXQtZHJvcGRvd24+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICAgIAogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBkcm9wZG93bnMgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3JBbGwoImRlZXMtaW5wdXQtZHJvcGRvd24iKTsKICBkcm9wZG93bnMuZm9yRWFjaCgoZHJvcGRvd24pID0+IHsKICAgIGRyb3Bkb3duLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGVkT3B0aW9uIiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IGxhYmVsID0gZHJvcGRvd24uZ2V0QXR0cmlidXRlKCJsYWJlbCIpOwogICAgICBjb25zb2xlLmxvZyhgJHtsYWJlbH06ICR7ZXZlbnQuZGV0YWlsLm9wdGlvbn1gKTsKICAgIH0pOwogIH0pOwp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjMuIEhvcml6b250YWwgTGF5b3V0In0gLnN1YnRpdGxlPSR7Ik11bHRpcGxlIGRyb3Bkb3ducyBpbiBhIGhvcml6b250YWwgbGF5b3V0IGZvciBjb21wYWN0IGZvcm1zIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iaG9yaXpvbnRhbC1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1kcm9wZG93bgogICAgICAgICAgICAubGFiZWw9JHsiRGVwYXJ0bWVudCJ9CiAgICAgICAgICAgIC5sYXlvdXRNb2RlPSR7Imhvcml6b250YWwifQogICAgICAgICAgICAub3B0aW9ucz0ke1sKICB7IG9wdGlvbjogIkVuZ2luZWVyaW5nIiwga2V5OiAiZW5nIiB9LAogIHsgb3B0aW9uOiAiRGVzaWduIiwga2V5OiAiZGVzaWduIiB9LAogIHsgb3B0aW9uOiAiTWFya2V0aW5nIiwga2V5OiAibWFya2V0aW5nIiB9LAogIHsgb3B0aW9uOiAiU2FsZXMiLCBrZXk6ICJzYWxlcyIgfQpdfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1kcm9wZG93bj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtZHJvcGRvd24KICAgICAgICAgICAgLmxhYmVsPSR7IlRlYW0gU2l6ZSJ9CiAgICAgICAgICAgIC5sYXlvdXRNb2RlPSR7Imhvcml6b250YWwifQogICAgICAgICAgICAuZW5hYmxlU2VhcmNoPSR7ZmFsc2V9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WwogIHsgb3B0aW9uOiAiMS01Iiwga2V5OiAic21hbGwiIH0sCiAgeyBvcHRpb246ICI2LTIwIiwga2V5OiAibWVkaXVtIiB9LAogIHsgb3B0aW9uOiAiMjEtNTAiLCBrZXk6ICJsYXJnZSIgfSwKICB7IG9wdGlvbjogIjUwKyIsIGtleTogInhsYXJnZSIgfQpdfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1kcm9wZG93bj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtZHJvcGRvd24KICAgICAgICAgICAgLmxhYmVsPSR7IkxvY2F0aW9uIn0KICAgICAgICAgICAgLmxheW91dE1vZGU9JHsiaG9yaXpvbnRhbCJ9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WwogIHsgb3B0aW9uOiAiUmVtb3RlIiwga2V5OiAicmVtb3RlIiB9LAogIHsgb3B0aW9uOiAiT24tc2l0ZSIsIGtleTogIm9uc2l0ZSIgfSwKICB7IG9wdGlvbjogIkh5YnJpZCIsIGtleTogImh5YnJpZCIgfQpdfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1kcm9wZG93bj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgogICAgCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IHJlcXVpcmVkRHJvcGRvd24gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtZHJvcGRvd25bcmVxdWlyZWRdIik7CiAgaWYgKHJlcXVpcmVkRHJvcGRvd24pIHsKICAgIHJlcXVpcmVkRHJvcGRvd24uYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IHsKICAgICAgY29uc29sZS5sb2coIlJlcXVpcmVkIGRyb3Bkb3duIGxvc3QgZm9jdXMiKTsKICAgIH0pOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI0LiBTdGF0ZXMifSAuc3VidGl0bGU9JHsiRGlmZmVyZW50IHN0YXRlcyBhbmQgY29uZmlndXJhdGlvbnMifT4KICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1kcm9wZG93bgogICAgICAgICAgICAubGFiZWw9JHsiUmVxdWlyZWQgRmllbGQifQogICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAub3B0aW9ucz0ke1sKICB7IG9wdGlvbjogIk9wdGlvbiBBIiwga2V5OiAiYSIgfSwKICB7IG9wdGlvbjogIk9wdGlvbiBCIiwga2V5OiAiYiIgfSwKICB7IG9wdGlvbjogIk9wdGlvbiBDIiwga2V5OiAiYyIgfQpdfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1kcm9wZG93bj4KCiAgICAgICAgICA8ZGVlcy1pbnB1dC1kcm9wZG93bgogICAgICAgICAgICAubGFiZWw9JHsiRGlzYWJsZWQgRHJvcGRvd24ifQogICAgICAgICAgICAuZGlzYWJsZWQ9JHt0cnVlfQogICAgICAgICAgICAub3B0aW9ucz0ke1sKICB7IG9wdGlvbjogIkNhbm5vdCBTZWxlY3QiLCBrZXk6ICJkaXNhYmxlZCIgfQpdfQogICAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHt7IG9wdGlvbjogIkNhbm5vdCBTZWxlY3QiLCBrZXk6ICJkaXNhYmxlZCIgfX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtZHJvcGRvd24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICAgIAogICAgPGRpdiBjbGFzcz0ic3BhY2VyIj4KICAgICAgKFNwYWNlciB0byB0ZXN0IGRyb3Bkb3duIHBvc2l0aW9uaW5nKQogICAgPC9kaXY+CiAgICAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgZHJvcGRvd24gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtZHJvcGRvd24iKTsKICBpZiAoZHJvcGRvd24pIHsKICAgIGRyb3Bkb3duLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGVkT3B0aW9uIiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJCb3R0b20gZHJvcGRvd24gc2VsZWN0ZWQ6IiwgZXZlbnQuZGV0YWlsKTsKICAgIH0pOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI1LiBCb3R0b20gUG9zaXRpb25pbmcifSAuc3VidGl0bGU9JHsiRHJvcGRvd24gdGhhdCBvcGVucyB1cHdhcmQgd2hlbiBuZWFyIGJvdHRvbSBvZiB2aWV3cG9ydCJ9PgogICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAubGFiZWw9JHsiT3BlbnMgVXB3YXJkIn0KICAgICAgICAgIC5vcHRpb25zPSR7WwogIHsgb3B0aW9uOiAiRmlyc3QgT3B0aW9uIiwga2V5OiAiZmlyc3QiIH0sCiAgeyBvcHRpb246ICJTZWNvbmQgT3B0aW9uIiwga2V5OiAic2Vjb25kIiB9LAogIHsgb3B0aW9uOiAiVGhpcmQgT3B0aW9uIiwga2V5OiAidGhpcmQiIH0sCiAgeyBvcHRpb246ICJGb3VydGggT3B0aW9uIiwga2V5OiAiZm91cnRoIiB9LAogIHsgb3B0aW9uOiAiRmlmdGggT3B0aW9uIiwga2V5OiAiZmlmdGgiIH0KXX0KICAgICAgICA+PC9kZWVzLWlucHV0LWRyb3Bkb3duPgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CgogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBkcm9wZG93biA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC1kcm9wZG93biIpOwogIGNvbnN0IG91dHB1dCA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiI3NlbGVjdGlvbi1vdXRwdXQiKTsKICBpZiAoZHJvcGRvd24gJiYgb3V0cHV0KSB7CiAgICBvdXRwdXQuaW5uZXJIVE1MID0gIjxlbT5TZWxlY3QgYSBwcm9kdWN0IHRvIHNlZSBkZXRhaWxzLi4uPC9lbT4iOwogICAgZHJvcGRvd24uYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgKGV2ZW50KSA9PiB7CiAgICAgIGlmIChldmVudC5kZXRhaWwudmFsdWUpIHsKICAgICAgICBvdXRwdXQuaW5uZXJIVE1MID0gYAogICAgICAgICAgICAgIDxzdHJvbmc+U2VsZWN0ZWQ6PC9zdHJvbmc+ICR7ZXZlbnQuZGV0YWlsLnZhbHVlLm9wdGlvbn08YnI+CiAgICAgICAgICAgICAgPHN0cm9uZz5LZXk6PC9zdHJvbmc+ICR7ZXZlbnQuZGV0YWlsLnZhbHVlLmtleX08YnI+CiAgICAgICAgICAgICAgPHN0cm9uZz5QcmljZTo8L3N0cm9uZz4gJCR7ZXZlbnQuZGV0YWlsLnZhbHVlLnBheWxvYWQ/LnByaWNlIHx8ICJOL0EifTxicj4KICAgICAgICAgICAgICA8c3Ryb25nPkZlYXR1cmVzOjwvc3Ryb25nPiAke2V2ZW50LmRldGFpbC52YWx1ZS5wYXlsb2FkPy5mZWF0dXJlcz8uam9pbigiLCAiKSB8fCAiTi9BIn0KICAgICAgICAgICAgYDsKICAgICAgfQogICAgfSk7CiAgfQp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjYuIEV2ZW50IEhhbmRsaW5nICYgUGF5bG9hZCJ9IC5zdWJ0aXRsZT0keyJEcm9wZG93biB3aXRoIHBheWxvYWQgZGF0YSBhbmQgY2hhbmdlIGV2ZW50IGhhbmRsaW5nIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtZHJvcGRvd24KICAgICAgICAgIC5sYWJlbD0keyJTZWxlY3QgUHJvZHVjdCJ9CiAgICAgICAgICAub3B0aW9ucz0ke1sKICB7IG9wdGlvbjogIkJhc2ljIFBsYW4iLCBrZXk6ICJiYXNpYyIsIHBheWxvYWQ6IHsgcHJpY2U6IDkuOTksIGZlYXR1cmVzOiBbIkZlYXR1cmUgQSJdIH0gfSwKICB7IG9wdGlvbjogIlBybyBQbGFuIiwga2V5OiAicHJvIiwgcGF5bG9hZDogeyBwcmljZTogMTkuOTksIGZlYXR1cmVzOiBbIkZlYXR1cmUgQSIsICJGZWF0dXJlIEIiXSB9IH0sCiAgeyBvcHRpb246ICJFbnRlcnByaXNlIFBsYW4iLCBrZXk6ICJlbnRlcnByaXNlIiwgcGF5bG9hZDogeyBwcmljZTogNDkuOTksIGZlYXR1cmVzOiBbIkZlYXR1cmUgQSIsICJGZWF0dXJlIEIiLCAiRmVhdHVyZSBDIl0gfSB9Cl19CiAgICAgICAgPjwvZGVlcy1pbnB1dC1kcm9wZG93bj4KICAgICAgICAKICAgICAgICA8ZGl2IGlkPSJzZWxlY3Rpb24tb3V0cHV0IiBzdHlsZT0ibWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogcmdiYSgwLCAxMDUsIDI0MiwgMC4xKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDE0cHg7Ij48L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgoKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgZm9ybSA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1mb3JtIik7CiAgY29uc3QgcHJvamVjdFR5cGVEcm9wZG93biA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcignZGVlcy1pbnB1dC1kcm9wZG93bltrZXk9InByb2plY3RUeXBlIl0nKTsKICBjb25zdCBmcmFtZXdvcmtEcm9wZG93biA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcignZGVlcy1pbnB1dC1kcm9wZG93bltrZXk9ImZyYW1ld29yayJdJyk7CiAgaWYgKGZvcm0pIHsKICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcigiZm9ybURhdGEiLCAoZXZlbnQpID0+IHsKICAgICAgY29uc29sZS5sb2coIkZvcm0gc3VibWl0dGVkIHdpdGggZGF0YToiLCBldmVudC5kZXRhaWwuZGF0YSk7CiAgICB9KTsKICB9CiAgaWYgKHByb2plY3RUeXBlRHJvcGRvd24gJiYgZnJhbWV3b3JrRHJvcGRvd24pIHsKICAgIHByb2plY3RUeXBlRHJvcGRvd24uYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0ZWRPcHRpb24iLCAoZXZlbnQpID0+IHsKICAgICAgY29uc3Qgc2VsZWN0ZWRUeXBlID0gZXZlbnQuZGV0YWlsLmtleTsKICAgICAgY29uc29sZS5sb2coYFByb2plY3QgdHlwZSBjaGFuZ2VkIHRvOiAke3NlbGVjdGVkVHlwZX1gKTsKICAgIH0pOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI3LiBGb3JtIEludGVncmF0aW9uIn0gLnN1YnRpdGxlPSR7IkRyb3Bkb3duIHdvcmtpbmcgd2l0aGluIGEgZm9ybSB3aXRoIHZhbGlkYXRpb24ifT4KICAgICAgICA8ZGVlcy1mb3JtPgogICAgICAgICAgPGRlZXMtaW5wdXQtZHJvcGRvd24KICAgICAgICAgICAgLmxhYmVsPSR7IlByb2plY3QgVHlwZSJ9CiAgICAgICAgICAgIC5rZXk9JHsicHJvamVjdFR5cGUifQogICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAub3B0aW9ucz0ke1sKICB7IG9wdGlvbjogIldlYiBBcHBsaWNhdGlvbiIsIGtleTogIndlYiIgfSwKICB7IG9wdGlvbjogIk1vYmlsZSBBcHBsaWNhdGlvbiIsIGtleTogIm1vYmlsZSIgfSwKICB7IG9wdGlvbjogIkRlc2t0b3AgQXBwbGljYXRpb24iLCBrZXk6ICJkZXNrdG9wIiB9LAogIHsgb3B0aW9uOiAiQVBJIFNlcnZpY2UiLCBrZXk6ICJhcGkiIH0KXX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtZHJvcGRvd24+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAgIC5sYWJlbD0keyJEZXZlbG9wbWVudCBGcmFtZXdvcmsifQogICAgICAgICAgICAua2V5PSR7ImZyYW1ld29yayJ9CiAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WwogIHsgb3B0aW9uOiAiUmVhY3QiLCBrZXk6ICJyZWFjdCIsIHBheWxvYWQ6IHsgdHlwZTogIndlYiIgfSB9LAogIHsgb3B0aW9uOiAiVnVlLmpzIiwga2V5OiAidnVlIiwgcGF5bG9hZDogeyB0eXBlOiAid2ViIiB9IH0sCiAgeyBvcHRpb246ICJBbmd1bGFyIiwga2V5OiAiYW5ndWxhciIsIHBheWxvYWQ6IHsgdHlwZTogIndlYiIgfSB9LAogIHsgb3B0aW9uOiAiUmVhY3QgTmF0aXZlIiwga2V5OiAicmVhY3QtbmF0aXZlIiwgcGF5bG9hZDogeyB0eXBlOiAibW9iaWxlIiB9IH0sCiAgeyBvcHRpb246ICJGbHV0dGVyIiwga2V5OiAiZmx1dHRlciIsIHBheWxvYWQ6IHsgdHlwZTogIm1vYmlsZSIgfSB9LAogIHsgb3B0aW9uOiAiRWxlY3Ryb24iLCBrZXk6ICJlbGVjdHJvbiIsIHBheWxvYWQ6IHsgdHlwZTogImRlc2t0b3AiIH0gfQpdfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1kcm9wZG93bj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtZm9ybS1zdWJtaXQgLnRleHQ9JHsiQ3JlYXRlIFByb2plY3QifT48L2RlZXMtZm9ybS1zdWJtaXQ+CiAgICAgICAgPC9kZWVzLWZvcm0+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LWRyb3Bkb3duL2RlZXMtaW5wdXQtZHJvcGRvd24uanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF9kaXN0X3RzMjkoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlMjUgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczI2ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzSW5wdXREcm9wZG93biA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1pbnB1dC1kcm9wZG93biIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzSW5wdXRCYXNlOwogIGxldCBfb3B0aW9uc19kZWNvcmF0b3JzOwogIGxldCBfb3B0aW9uc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX29wdGlvbnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkT3B0aW9uX2RlY29yYXRvcnM7CiAgbGV0IF9zZWxlY3RlZE9wdGlvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkT3B0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lbmFibGVTZWFyY2hfZGVjb3JhdG9yczsKICBsZXQgX2VuYWJsZVNlYXJjaF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2VuYWJsZVNlYXJjaF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfb3BlbnNUb1RvcF9kZWNvcmF0b3JzOwogIGxldCBfb3BlbnNUb1RvcF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX29wZW5zVG9Ub3BfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ZpbHRlcmVkT3B0aW9uc19kZWNvcmF0b3JzOwogIGxldCBfZmlsdGVyZWRPcHRpb25zX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZmlsdGVyZWRPcHRpb25zX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oaWdobGlnaHRlZEluZGV4X2RlY29yYXRvcnM7CiAgbGV0IF9oaWdobGlnaHRlZEluZGV4X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaGlnaGxpZ2h0ZWRJbmRleF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNPcGVuZWRfZGVjb3JhdG9yczsKICBsZXQgX2lzT3BlbmVkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNPcGVuZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlYXJjaFZhbHVlX2RlY29yYXRvcnM7CiAgbGV0IF9zZWFyY2hWYWx1ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlYXJjaFZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNJbnB1dERyb3Bkb3duMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX29wdGlvbnNfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX3NlbGVjdGVkT3B0aW9uX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9lbmFibGVTZWFyY2hfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogQm9vbGVhbgogICAgICB9KV07CiAgICAgIF9vcGVuc1RvVG9wX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9maWx0ZXJlZE9wdGlvbnNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2hpZ2hsaWdodGVkSW5kZXhfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2lzT3BlbmVkX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9zZWFyY2hWYWx1ZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGUyNSh0aGlzLCBudWxsLCBfb3B0aW9uc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJvcHRpb25zIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJvcHRpb25zIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm9wdGlvbnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm9wdGlvbnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfb3B0aW9uc19pbml0aWFsaXplcnMsIF9vcHRpb25zX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjUodGhpcywgbnVsbCwgX3NlbGVjdGVkT3B0aW9uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlbGVjdGVkT3B0aW9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3RlZE9wdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWxlY3RlZE9wdGlvbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VsZWN0ZWRPcHRpb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0ZWRPcHRpb25faW5pdGlhbGl6ZXJzLCBfc2VsZWN0ZWRPcHRpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNSh0aGlzLCBudWxsLCBfZW5hYmxlU2VhcmNoX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImVuYWJsZVNlYXJjaCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZW5hYmxlU2VhcmNoIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmVuYWJsZVNlYXJjaCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZW5hYmxlU2VhcmNoID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2VuYWJsZVNlYXJjaF9pbml0aWFsaXplcnMsIF9lbmFibGVTZWFyY2hfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNSh0aGlzLCBudWxsLCBfb3BlbnNUb1RvcF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJvcGVuc1RvVG9wIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJvcGVuc1RvVG9wIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm9wZW5zVG9Ub3AsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm9wZW5zVG9Ub3AgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfb3BlbnNUb1RvcF9pbml0aWFsaXplcnMsIF9vcGVuc1RvVG9wX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjUodGhpcywgbnVsbCwgX2ZpbHRlcmVkT3B0aW9uc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJmaWx0ZXJlZE9wdGlvbnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZpbHRlcmVkT3B0aW9ucyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5maWx0ZXJlZE9wdGlvbnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmZpbHRlcmVkT3B0aW9ucyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9maWx0ZXJlZE9wdGlvbnNfaW5pdGlhbGl6ZXJzLCBfZmlsdGVyZWRPcHRpb25zX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjUodGhpcywgbnVsbCwgX2hpZ2hsaWdodGVkSW5kZXhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaGlnaGxpZ2h0ZWRJbmRleCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaGlnaGxpZ2h0ZWRJbmRleCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5oaWdobGlnaHRlZEluZGV4LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5oaWdobGlnaHRlZEluZGV4ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2hpZ2hsaWdodGVkSW5kZXhfaW5pdGlhbGl6ZXJzLCBfaGlnaGxpZ2h0ZWRJbmRleF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTI1KHRoaXMsIG51bGwsIF9pc09wZW5lZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc09wZW5lZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNPcGVuZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNPcGVuZWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzT3BlbmVkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzT3BlbmVkX2luaXRpYWxpemVycywgX2lzT3BlbmVkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjUodGhpcywgbnVsbCwgX3NlYXJjaFZhbHVlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlYXJjaFZhbHVlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWFyY2hWYWx1ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWFyY2hWYWx1ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VhcmNoVmFsdWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VhcmNoVmFsdWVfaW5pdGlhbGl6ZXJzLCBfc2VhcmNoVmFsdWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNJbnB1dERyb3Bkb3duMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMTc7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiSW5wdXQiXTsKICAgICNvcHRpb25zX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczI2KHRoaXMsIF9vcHRpb25zX2luaXRpYWxpemVycywgW10pOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCBvcHRpb25zKCkgewogICAgICByZXR1cm4gdGhpcy4jb3B0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG9wdGlvbnModmFsdWUyKSB7CiAgICAgIHRoaXMuI29wdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWxlY3RlZE9wdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjYodGhpcywgX29wdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczI2KHRoaXMsIF9zZWxlY3RlZE9wdGlvbl9pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIGdldCBzZWxlY3RlZE9wdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkT3B0aW9uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0ZWRPcHRpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlbGVjdGVkT3B0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAvLyBBZGQgdmFsdWUgcHJvcGVydHkgZm9yIGZvcm0gY29tcGF0aWJpbGl0eQogICAgZ2V0IHZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZE9wdGlvbjsKICAgIH0KICAgIHNldCB2YWx1ZSh2YWwpIHsKICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IHZhbDsKICAgIH0KICAgICNlbmFibGVTZWFyY2hfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI2KHRoaXMsIF9zZWxlY3RlZE9wdGlvbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjYodGhpcywgX2VuYWJsZVNlYXJjaF9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBlbmFibGVTZWFyY2goKSB7CiAgICAgIHJldHVybiB0aGlzLiNlbmFibGVTZWFyY2hfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBlbmFibGVTZWFyY2godmFsdWUyKSB7CiAgICAgIHRoaXMuI2VuYWJsZVNlYXJjaF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI29wZW5zVG9Ub3BfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI2KHRoaXMsIF9lbmFibGVTZWFyY2hfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczI2KHRoaXMsIF9vcGVuc1RvVG9wX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBvcGVuc1RvVG9wKCkgewogICAgICByZXR1cm4gdGhpcy4jb3BlbnNUb1RvcF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG9wZW5zVG9Ub3AodmFsdWUyKSB7CiAgICAgIHRoaXMuI29wZW5zVG9Ub3BfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNmaWx0ZXJlZE9wdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI2KHRoaXMsIF9vcGVuc1RvVG9wX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNih0aGlzLCBfZmlsdGVyZWRPcHRpb25zX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBmaWx0ZXJlZE9wdGlvbnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNmaWx0ZXJlZE9wdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBmaWx0ZXJlZE9wdGlvbnModmFsdWUyKSB7CiAgICAgIHRoaXMuI2ZpbHRlcmVkT3B0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2hpZ2hsaWdodGVkSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI2KHRoaXMsIF9maWx0ZXJlZE9wdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczI2KHRoaXMsIF9oaWdobGlnaHRlZEluZGV4X2luaXRpYWxpemVycywgMCkpOwogICAgZ2V0IGhpZ2hsaWdodGVkSW5kZXgoKSB7CiAgICAgIHJldHVybiB0aGlzLiNoaWdobGlnaHRlZEluZGV4X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaGlnaGxpZ2h0ZWRJbmRleCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaGlnaGxpZ2h0ZWRJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzT3BlbmVkX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyNih0aGlzLCBfaGlnaGxpZ2h0ZWRJbmRleF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjYodGhpcywgX2lzT3BlbmVkX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc09wZW5lZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzT3BlbmVkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaXNPcGVuZWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzT3BlbmVkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VhcmNoVmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI2KHRoaXMsIF9pc09wZW5lZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjYodGhpcywgX3NlYXJjaFZhbHVlX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBzZWFyY2hWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlYXJjaFZhbHVlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VhcmNoVmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlYXJjaFZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIC4uLkRlZXNJbnB1dEJhc2UuYmFzZVN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICAqIHsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1mYW1pbHk6ICR7Y3NzR2Vpc3RGb250RmFtaWx5fTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxNSUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgIH0KCiAgICAgIC5tYWluY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5zZWxlY3RlZEJveCB7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogNDBweDsKICAgICAgICBsaW5lLWhlaWdodDogMzhweDsKICAgICAgICBwYWRkaW5nOiAwIDQwcHggMCAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTUlKSIpfTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAuc2VsZWN0ZWRCb3g6aG92ZXI6bm90KC5kaXNhYmxlZCkgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDc5LjglKSIsICJoc2woMCAwJSAyMC45JSkiKX07CiAgICAgIH0KCiAgICAgIC5zZWxlY3RlZEJveDpmb2N1cy12aXNpYmxlIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA1MS4yJSkiLCAiaHNsKDIxNy4yIDkxLjIlIDU5LjglKSIpfTsKICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA1MS4yJSAvIDAuMSkiLCAiaHNsKDIxNy4yIDkxLjIlIDU5LjglIC8gMC4xKSIpfTsKICAgICAgfQoKICAgICAgLnNlbGVjdGVkQm94LmRpc2FibGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUuMSUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNjMuOSUpIiwgImhzbCgwIDAlIDQ1LjElKSIpfTsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgfQoKICAgICAgLyogRHJvcGRvd24gYXJyb3cgKi8KICAgICAgLnNlbGVjdGVkQm94OjphZnRlciB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAxMnB4OwogICAgICAgIHRvcDogNTAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsKICAgICAgICB3aWR0aDogMDsKICAgICAgICBoZWlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItcmlnaHQ6IDRweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItdG9wOiA0cHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQ1LjElKSIsICJoc2woMCAwJSA2My45JSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5zZWxlY3RlZEJveC5vcGVuOjphZnRlciB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpIHJvdGF0ZSgxODBkZWcpOwogICAgICB9CgogICAgICAuc2VsZWN0aW9uQm94IHsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtLCBvcGFjaXR5OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC04cHgpIHNjYWxlKDAuOTgpOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSAzLjklKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3gtc2hhZG93OiAwIDRweCA2cHggLTFweCBoc2woMCAwJSAwJSAvIDAuMSksIDAgMnB4IDRweCAtMnB4IGhzbCgwIDAlIDAlIC8gMC4xKTsKICAgICAgICBtaW4taGVpZ2h0OiA0MHB4OwogICAgICAgIG1heC1oZWlnaHQ6IDMwMHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgICAgei1pbmRleDogNTA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgfQogICAgICAKICAgICAgLnNlbGVjdGlvbkJveC50b3AgewogICAgICAgIGJvdHRvbTogY2FsYygxMDAlICsgNHB4KTsKICAgICAgICB0b3A6IGF1dG87CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCkgc2NhbGUoMC45OCk7CiAgICAgIH0KICAgICAgCiAgICAgIC5zZWxlY3Rpb25Cb3guYm90dG9tIHsKICAgICAgICB0b3A6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zZWxlY3Rpb25Cb3guc2hvdyB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCkgc2NhbGUoMSk7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLyogT3B0aW9ucyBjb250YWluZXIgKi8KICAgICAgLm9wdGlvbnMtY29udGFpbmVyIHsKICAgICAgICBtYXgtaGVpZ2h0OiAyNTBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgLyogT3B0aW9ucyAqLwogICAgICAub3B0aW9uIHsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBsaW5lLWhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiAwIDhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgbWFyZ2luOiAycHggMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTUlKSIsICJoc2woMCAwJSA5MCUpIil9OwogICAgICB9CgogICAgICAub3B0aW9uLmhpZ2hsaWdodGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUuMSUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgfQoKICAgICAgLm9wdGlvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk1LjElKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTUlKSIpfTsKICAgICAgfQoKICAgICAgLyogTm8gb3B0aW9ucyBtZXNzYWdlICovCiAgICAgIC5uby1vcHRpb25zIHsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQ1LjElKSIsICJoc2woMCAwJSA2My45JSkiKX07CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICB9CgogICAgICAvKiBTZWFyY2ggKi8KICAgICAgLnNlYXJjaCB7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5zZWFyY2guYm90dG9tIHsKICAgICAgICBib3JkZXItYm90dG9tOiBub25lOwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICAgIG1hcmdpbi10b3A6IDRweDsKICAgICAgfQogICAgICAKICAgICAgLnNlYXJjaCBpbnB1dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDAgOHB4OwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnNlYXJjaCBpbnB1dDo6cGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNjMuOSUpIiwgImhzbCgwIDAlIDQ1LjElKSIpfTsKICAgICAgfQoKICAgICAgLnNlYXJjaCBpbnB1dDpmb2N1cyB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIil9OwogICAgICB9CgogICAgICAvKiBTY3JvbGxiYXIgc3R5bGluZyAqLwogICAgICAub3B0aW9ucy1jb250YWluZXI6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgICAgICB3aWR0aDogOHB4OwogICAgICB9CgogICAgICAub3B0aW9ucy1jb250YWluZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgLm9wdGlvbnMtY29udGFpbmVyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICB9CgogICAgICAub3B0aW9ucy1jb250YWluZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNzkuOCUpIiwgImhzbCgwIDAlIDIwLjklKSIpfTsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJpbnB1dC13cmFwcGVyIj4KICAgICAgICA8ZGVlcy1sYWJlbCAubGFiZWw9JHt0aGlzLmxhYmVsfSAuZGVzY3JpcHRpb249JHt0aGlzLmRlc2NyaXB0aW9ufSAucmVxdWlyZWQ9JHt0aGlzLnJlcXVpcmVkfT48L2RlZXMtbGFiZWw+CiAgICAgICAgPGRpdiBjbGFzcz0ibWFpbmNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2CiAgICAgICAgICAgIGNsYXNzPSJzZWxlY3RlZEJveCAke3RoaXMuaXNPcGVuZWQgPyAib3BlbiIgOiAiIn0gJHt0aGlzLmRpc2FibGVkID8gImRpc2FibGVkIiA6ICIifSIKICAgICAgICAgICAgQGNsaWNrPSIkeygpID0+ICF0aGlzLmRpc2FibGVkICYmIHRoaXMudG9nZ2xlU2VsZWN0aW9uQm94KCl9IgogICAgICAgICAgICB0YWJpbmRleD0iJHt0aGlzLmRpc2FibGVkID8gIi0xIiA6ICIwIn0iCiAgICAgICAgICAgIEBrZXlkb3duPSIke3RoaXMuaGFuZGxlU2VsZWN0ZWRCb3hLZXlkb3dufSIKICAgICAgICAgID4KICAgICAgICAgICAgJHt0aGlzLnNlbGVjdGVkT3B0aW9uPy5vcHRpb24gfHwgIlNlbGVjdCBhbiBvcHRpb24ifQogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWxlY3Rpb25Cb3ggJHt0aGlzLmlzT3BlbmVkID8gInNob3ciIDogIiJ9ICR7dGhpcy5vcGVuc1RvVG9wID8gInRvcCIgOiAiYm90dG9tIn0iPgogICAgICAgICAgICAke3RoaXMuZW5hYmxlU2VhcmNoID8gYjJgCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlYXJjaCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IAogICAgICAgICAgICAgICAgICAgICAgdHlwZT0idGV4dCIgCiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iU2VhcmNoIG9wdGlvbnMuLi4iIAogICAgICAgICAgICAgICAgICAgICAgLnZhbHVlPSIke3RoaXMuc2VhcmNoVmFsdWV9IgogICAgICAgICAgICAgICAgICAgICAgQGlucHV0PSIke3RoaXMuaGFuZGxlU2VhcmNofSIKICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz0iJHsoZTExKSA9PiBlMTEuc3RvcFByb3BhZ2F0aW9uKCl9IgogICAgICAgICAgICAgICAgICAgICAgQGtleWRvd249IiR7dGhpcy5oYW5kbGVTZWFyY2hLZXlkb3dufSIKICAgICAgICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIGAgOiBudWxsfQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb25zLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgJHt0aGlzLmZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPT09IDAgPyBiMmA8ZGl2IGNsYXNzPSJuby1vcHRpb25zIj5ObyBvcHRpb25zIGZvdW5kPC9kaXY+YCA6IHRoaXMuZmlsdGVyZWRPcHRpb25zLm1hcCgob3B0aW9uMiwgaW5kZXgyKSA9PiB7CiAgICAgICAgY29uc3QgaXNIaWdobGlnaHRlZCA9IHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA9PT0gaW5kZXgyOwogICAgICAgIHJldHVybiBiMmAKICAgICAgICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9wdGlvbiAke2lzSGlnaGxpZ2h0ZWQgPyAiaGlnaGxpZ2h0ZWQiIDogIiJ9IgogICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9IiR7KCkgPT4gdGhpcy51cGRhdGVTZWxlY3Rpb24ob3B0aW9uMil9IgogICAgICAgICAgICAgICAgICAgICAgICBAbW91c2VlbnRlcj0iJHsoKSA9PiB0aGlzLmhpZ2hsaWdodGVkSW5kZXggPSBpbmRleDJ9IgogICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICAke29wdGlvbjIub3B0aW9ufQogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgYDsKICAgICAgfSl9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLmhhbmRsZUNsaWNrT3V0c2lkZSA9IHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlLmJpbmQodGhpcyk7CiAgICB9CiAgICBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSB0aGlzLnNlbGVjdGVkT3B0aW9uIHx8IG51bGw7CiAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgfQogICAgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgICBzdXBlci51cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygib3B0aW9ucyIpKSB7CiAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIHVwZGF0ZVNlbGVjdGlvbihzZWxlY3RlZE9wdGlvbikgewogICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uID0gc2VsZWN0ZWRPcHRpb247CiAgICAgIHRoaXMuaXNPcGVuZWQgPSBmYWxzZTsKICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICIiOwogICAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgdGhpcy5oaWdobGlnaHRlZEluZGV4ID0gMDsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgic2VsZWN0ZWRPcHRpb24iLCB7CiAgICAgICAgZGV0YWlsOiBzZWxlY3RlZE9wdGlvbiwKICAgICAgICBidWJibGVzOiB0cnVlCiAgICAgIH0pKTsKICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICB9CiAgICBoYW5kbGVDbGlja091dHNpZGUgPSAoX19ydW5Jbml0aWFsaXplcnMyNih0aGlzLCBfc2VhcmNoVmFsdWVfZXh0cmFJbml0aWFsaXplcnMpLCAoZXZlbnQpID0+IHsKICAgICAgY29uc3QgcGF0aDIgPSBldmVudC5jb21wb3NlZFBhdGgoKTsKICAgICAgaWYgKCFwYXRoMi5pbmNsdWRlcyh0aGlzKSkgewogICAgICAgIHRoaXMuaXNPcGVuZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gIiI7CiAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLmhhbmRsZUNsaWNrT3V0c2lkZSk7CiAgICAgIH0KICAgIH0pOwogICAgYXN5bmMgdG9nZ2xlU2VsZWN0aW9uQm94KCkgewogICAgICB0aGlzLmlzT3BlbmVkID0gIXRoaXMuaXNPcGVuZWQ7CiAgICAgIGlmICh0aGlzLmlzT3BlbmVkKSB7CiAgICAgICAgY29uc3Qgc2VsZWN0ZWRCb3ggPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLnNlbGVjdGVkQm94Iik7CiAgICAgICAgY29uc3QgcmVjdCA9IHNlbGVjdGVkQm94LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGNvbnN0IHNwYWNlQmVsb3cgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LmJvdHRvbTsKICAgICAgICBjb25zdCBzcGFjZUFib3ZlID0gcmVjdC50b3A7CiAgICAgICAgdGhpcy5vcGVuc1RvVG9wID0gc3BhY2VCZWxvdyA8IDMwMCAmJiBzcGFjZUFib3ZlID4gc3BhY2VCZWxvdzsKICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlOwogICAgICAgIGNvbnN0IHNlYXJjaElucHV0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5zZWFyY2ggaW5wdXQiKTsKICAgICAgICBpZiAoc2VhcmNoSW5wdXQpIHsKICAgICAgICAgIHNlYXJjaElucHV0LmZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLmhhbmRsZUNsaWNrT3V0c2lkZSk7CiAgICAgICAgfSwgMCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICIiOwogICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIiwgdGhpcy5oYW5kbGVDbGlja091dHNpZGUpOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVTZWFyY2goZXZlbnQpIHsKICAgICAgY29uc3Qgc2VhcmNoVGVybSA9IGV2ZW50LnRhcmdldC52YWx1ZTsKICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHNlYXJjaFRlcm07CiAgICAgIGNvbnN0IHNlYXJjaExvd2VyID0gc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpOwogICAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyA9IHRoaXMub3B0aW9ucy5maWx0ZXIoKG9wdGlvbjIpID0+IG9wdGlvbjIub3B0aW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoTG93ZXIpKTsKICAgICAgdGhpcy5oaWdobGlnaHRlZEluZGV4ID0gMDsKICAgIH0KICAgIGhhbmRsZUtleURvd24oZXZlbnQpIHsKICAgICAgY29uc3Qga2V5MiA9IGV2ZW50LmtleTsKICAgICAgY29uc3QgbWF4SW5kZXggPSB0aGlzLmZpbHRlcmVkT3B0aW9ucy5sZW5ndGggLSAxOwogICAgICBpZiAoa2V5MiA9PT0gIkFycm93RG93biIpIHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA9IHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCArIDEgPiBtYXhJbmRleCA/IDAgOiB0aGlzLmhpZ2hsaWdodGVkSW5kZXggKyAxOwogICAgICB9IGVsc2UgaWYgKGtleTIgPT09ICJBcnJvd1VwIikgewogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdGhpcy5oaWdobGlnaHRlZEluZGV4ID0gdGhpcy5oaWdobGlnaHRlZEluZGV4IC0gMSA8IDAgPyBtYXhJbmRleCA6IHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCAtIDE7CiAgICAgIH0gZWxzZSBpZiAoa2V5MiA9PT0gIkVudGVyIikgewogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgaWYgKHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuaGlnaGxpZ2h0ZWRJbmRleF0pIHsKICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuaGlnaGxpZ2h0ZWRJbmRleF0pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChrZXkyID09PSAiRXNjYXBlIikgewogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdGhpcy5pc09wZW5lZCA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVTZWFyY2hLZXlkb3duKGV2ZW50KSB7CiAgICAgIGlmIChldmVudC5rZXkgPT09ICJBcnJvd0Rvd24iIHx8IGV2ZW50LmtleSA9PT0gIkFycm93VXAiIHx8IGV2ZW50LmtleSA9PT0gIkVudGVyIikgewogICAgICAgIHRoaXMuaGFuZGxlS2V5RG93bihldmVudCk7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZVNlbGVjdGVkQm94S2V5ZG93bihldmVudCkgewogICAgICBpZiAodGhpcy5kaXNhYmxlZCkKICAgICAgICByZXR1cm47CiAgICAgIGlmIChldmVudC5rZXkgPT09ICJFbnRlciIgfHwgZXZlbnQua2V5ID09PSAiICIpIHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMudG9nZ2xlU2VsZWN0aW9uQm94KCk7CiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAiQXJyb3dEb3duIiB8fCBldmVudC5rZXkgPT09ICJBcnJvd1VwIikgewogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgaWYgKCF0aGlzLmlzT3BlbmVkKSB7CiAgICAgICAgICB0aGlzLnRvZ2dsZVNlbGVjdGlvbkJveCgpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICJFc2NhcGUiKSB7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICBpZiAodGhpcy5pc09wZW5lZCkgewogICAgICAgICAgdGhpcy5pc09wZW5lZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZ2V0VmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkT3B0aW9uOwogICAgfQogICAgc2V0VmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSB2YWx1ZTI7CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0aGlzLmhhbmRsZUNsaWNrT3V0c2lkZSk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczI2KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzSW5wdXREcm9wZG93bjIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtZmlsZXVwbG9hZC9kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkZW1vRnVuYzE4ID0gKCkgPT4gYjJgCiAgPGRlZXMtZGVtb3dyYXBwZXI+CiAgICA8c3R5bGU+CiAgICAgICR7aWAKICAgICAgICAuZGVtby1zaGVsbCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMzJweDsKICAgICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgICBtYXgtd2lkdGg6IDExNjBweDsKICAgICAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgICAgIH0KCiAgICAgICAgLmRlbW8tZ3JpZCB7CiAgICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgIH0KCiAgICAgICAgQG1lZGlhIChtaW4td2lkdGg6IDk2MHB4KSB7CiAgICAgICAgICAuZGVtby1ncmlkLS10d28gewogICAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCBtaW5tYXgoMCwgMWZyKSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAuZGVtby1zdGFjayB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMThweDsKICAgICAgICB9CgogICAgICAgIC5kZW1vLW5vdGUgewogICAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTcgOTElIDkwJSkiLCAiaHNsKDIxNSAyMCUgMjYlKSIpfTsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEzIDEwMCUgOTclKSIsICJoc2woMjE1IDIwJSAxMiUpIil9OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDI1JSAzMiUpIiwgImhzbCgyMTUgMjAlIDgyJSkiKX07CiAgICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgICBsaW5lLWhlaWdodDogMS41NTsKICAgICAgICB9CgogICAgICAgIC5kZW1vLW5vdGUgc3Ryb25nIHsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgNDUlKSIsICJoc2woMjEzIDkzJSA2OCUpIil9OwogICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICB9CiAgICAgIGB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9ImRlbW8tc2hlbGwiPgogICAgICA8ZGVlcy1wYW5lbAogICAgICAgIC50aXRsZT0keyJNb2Rlcm4gZmlsZSB1cGxvYWRlciJ9CiAgICAgICAgLnN1YnRpdGxlPSR7IlNoYWRjbi1pbnNwaXJlZCBsYXlvdXQgd2l0aCBkcmFnICYgZHJvcCwgcHJldmlld3MgYW5kIHZhbGlkYXRpb24ifQogICAgICA+CiAgICAgICAgPGRpdiBjbGFzcz0iZGVtby1ncmlkIGRlbW8tZ3JpZC0tdHdvIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc3RhY2siPgogICAgICAgICAgICA8ZGVlcy1pbnB1dC1maWxldXBsb2FkCiAgICAgICAgICAgICAgLmxhYmVsPSR7IkF0dGFjaG1lbnRzIn0KICAgICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiVXBsb2FkIHN1cHBvcnRpbmcgZG9jdW1lbnRzIGZvciB5b3VyIHJlcXVlc3QifQogICAgICAgICAgICAgIC5hY2NlcHQ9JHsiaW1hZ2UvKiwucGRmLC56aXAifQogICAgICAgICAgICAgIC5tYXhTaXplPSR7MTAgKiAxMDI0ICogMTAyNH0KICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC1maWxldXBsb2FkPgoKICAgICAgICAgICAgPGRlZXMtaW5wdXQtZmlsZXVwbG9hZAogICAgICAgICAgICAgIC5sYWJlbD0keyJCcmFuZCBhc3NldHMifQogICAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJVcGxvYWQgaGlnaC1yZXNvbHV0aW9uIGltYWdlcnkgKEpQRy9QTkcpIn0KICAgICAgICAgICAgICAuYWNjZXB0PSR7ImltYWdlL2pwZWcsaW1hZ2UvcG5nIn0KICAgICAgICAgICAgICAubXVsdGlwbGU9JHtmYWxzZX0KICAgICAgICAgICAgICAubWF4U2l6ZT0kezUgKiAxMDI0ICogMTAyNH0KICAgICAgICAgICAgICAuYnV0dG9uVGV4dD0keyJTZWxlY3QgY292ZXIgaW1hZ2UifQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LWZpbGV1cGxvYWQ+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJkZW1vLXN0YWNrIj4KICAgICAgICAgICAgPGRlZXMtaW5wdXQtZmlsZXVwbG9hZAogICAgICAgICAgICAgIC5sYWJlbD0keyJBdWRpbyB1cGxvYWRzIn0KICAgICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiU2hhcmUgcG9kY2FzdCBkcmFmdHMgKE1QMy9XQVYsIG1heCAyNU1CIGVhY2gpIn0KICAgICAgICAgICAgICAuYWNjZXB0PSR7ImF1ZGlvLyoifQogICAgICAgICAgICAgIC5tYXhTaXplPSR7MjUgKiAxMDI0ICogMTAyNH0KICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC1maWxldXBsb2FkPgoKICAgICAgICAgICAgPGRlZXMtaW5wdXQtZmlsZXVwbG9hZAogICAgICAgICAgICAgIC5sYWJlbD0keyJEaXNhYmxlZCBleGFtcGxlIn0KICAgICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiVXBsb2FkZXIgaXMgZGlzYWJsZWQgd2hpbGUgbW9kZXJhdGlvbiBpcyBwZW5kaW5nIn0KICAgICAgICAgICAgICAuZGlzYWJsZWQ9JHt0cnVlfQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LWZpbGV1cGxvYWQ+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgoKICAgICAgPGRlZXMtcGFuZWwKICAgICAgICAudGl0bGU9JHsiRm9ybSBpbnRlZ3JhdGlvbiJ9CiAgICAgICAgLnN1YnRpdGxlPSR7IkNvbWJpbmUgZmlsZSB1cGxvYWRzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIERFRVMgZm9ybSBlY29zeXN0ZW0ifQogICAgICA+CiAgICAgICAgPGRpdiBjbGFzcz0iZGVtby1ncmlkIj4KICAgICAgICAgIDxkZWVzLWZvcm0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc3RhY2siPgogICAgICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQKICAgICAgICAgICAgICAgIC5sYWJlbD0keyJQcm9qZWN0IG5hbWUifQogICAgICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IkhvdyBzaG91bGQgd2UgcmVmZXIgdG8gdGhpcyBwcm9qZWN0IGludGVybmFsbHk/In0KICAgICAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICAgICAgICAua2V5PSR7InByb2plY3ROYW1lIn0KICAgICAgICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CgogICAgICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQKICAgICAgICAgICAgICAgIC5sYWJlbD0keyJDb250YWN0IGVtYWlsIn0KICAgICAgICAgICAgICAgIC5pbnB1dFR5cGU9JHsiZW1haWwifQogICAgICAgICAgICAgICAgLnJlcXVpcmVkPSR7dHJ1ZX0KICAgICAgICAgICAgICAgIC5rZXk9JHsiY29udGFjdEVtYWlsIn0KICAgICAgICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CgogICAgICAgICAgICAgIDxkZWVzLWlucHV0LWZpbGV1cGxvYWQKICAgICAgICAgICAgICAgIC5sYWJlbD0keyJTdGF0ZW1lbnQgb2Ygd29yayJ9CiAgICAgICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiVXBsb2FkIGEgc2lnbmVkIHN0YXRlbWVudCBvZiB3b3JrIChQREYsIG1heCAxNU1CKSJ9CiAgICAgICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAgICAgLmFjY2VwdD0keyJhcHBsaWNhdGlvbi9wZGYifQogICAgICAgICAgICAgICAgLm1heFNpemU9JHsxNSAqIDEwMjQgKiAxMDI0fQogICAgICAgICAgICAgICAgLm11bHRpcGxlPSR7ZmFsc2V9CiAgICAgICAgICAgICAgICAua2V5PSR7InNvdyJ9CiAgICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC1maWxldXBsb2FkPgoKICAgICAgICAgICAgICA8ZGVlcy1pbnB1dC1maWxldXBsb2FkCiAgICAgICAgICAgICAgICAubGFiZWw9JHsiQ3JlYXRpdmUgcmVmZXJlbmNlcyJ9CiAgICAgICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiT3B0aW9uYWwuIFVwbG9hZCB1cCB0byBmaXZlIHZpc3VhbCByZWZlcmVuY2VzIn0KICAgICAgICAgICAgICAgIC5hY2NlcHQ9JHsiaW1hZ2UvKiJ9CiAgICAgICAgICAgICAgICAubWF4RmlsZXM9JHs1fQogICAgICAgICAgICAgICAgLm1heFNpemU9JHs4ICogMTAyNCAqIDEwMjR9CiAgICAgICAgICAgICAgICAua2V5PSR7InJlZmVyZW5jZXMifQogICAgICAgICAgICAgID48L2RlZXMtaW5wdXQtZmlsZXVwbG9hZD4KCiAgICAgICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dAogICAgICAgICAgICAgICAgLmxhYmVsPSR7Ik5vdGVzIn0KICAgICAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJBZGQgb3B0aW9uYWwgY29udGV4dCBmb3IgcmV2aWV3ZXJzIn0KICAgICAgICAgICAgICAgIC5pbnB1dFR5cGU9JHsidGV4dGFyZWEifQogICAgICAgICAgICAgICAgLmtleT0keyJub3RlcyJ9CiAgICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgoKICAgICAgICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdCAudGV4dD0keyJTdWJtaXQgYnJpZWZpbmcifT48L2RlZXMtZm9ybS1zdWJtaXQ+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kZWVzLWZvcm0+CgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVtby1ub3RlIj4KICAgICAgICAgICAgPHN0cm9uZz5Hb29kIHRvIGtub3c6PC9zdHJvbmc+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+RHJhZyAmIGRyb3AgaGlnaGxpZ2h0cyB0aGUgZHJvcHpvbmUgYW5kIHN1cHBvcnRzIGtleWJvYXJkIGFjdGl2YXRpb24uPC9saT4KICAgICAgICAgICAgICA8bGk+QWNjZXB0ZWQgZmlsZSB0eXBlcyBhcmUgc3VtbWFyaXNlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIDxjb2RlPmFjY2VwdDwvY29kZT4gYXR0cmlidXRlLjwvbGk+CiAgICAgICAgICAgICAgPGxpPkltYWdlIHVwbG9hZHMgc2hvdyBsaXZlIHByZXZpZXdzIGdlbmVyYXRlZCB2aWEgPGNvZGU+VVJMLmNyZWF0ZU9iamVjdFVSTDwvY29kZT4uPC9saT4KICAgICAgICAgICAgICA8bGk+RmlsZSBzaXplIGFuZCBmaWxlLWNvdW50IGxpbWl0cyBzdXJmYWNlIGlubGluZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRoZSBjb21wb25lbnQgc3RheXMgY29tcGF0aWJsZSB3aXRoIDxjb2RlPmRlZXMtZm9ybTwvY29kZT4gdmFsdWUgYWNjZXNzb3JzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kaXY+CiAgPC9kZWVzLWRlbW93cmFwcGVyPgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtZmlsZXVwbG9hZC9zdHlsZXMuanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIGZpbGV1cGxvYWRTdHlsZXMgPSBbCiAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogIC4uLkRlZXNJbnB1dEJhc2UuYmFzZVN0eWxlcywKICBpYAogICAgOmhvc3QgewogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgfQoKCiAgICAuaW5wdXQtd3JhcHBlciB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIGdhcDogMTJweDsKICAgIH0KCiAgICAuZHJvcHpvbmUgewogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICAgIGJvcmRlcjogMS41cHggZGFzaGVkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDE2JSA4MCUpIiwgImhzbCgyMTcgMjAlIDI1JSkiKX07CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMjE1IDIwJSAxMiUpIil9OwogICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4ycyBlYXNlLCBib3gtc2hhZG93IDAuMnMgZWFzZSwgYmFja2dyb3VuZCAwLjJzIGVhc2U7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgb3V0bGluZTogbm9uZTsKICAgIH0KCiAgICAuZHJvcHpvbmU6Zm9jdXMtdmlzaWJsZSB7CiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDIxNSAyMCUgMTIlKSIpfSwKICAgICAgICAwIDAgMCA0cHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTcgOTElIDYwJSAvIDAuNSkiLCAiaHNsKDIxMyA5MyUgNjglIC8gMC40KSIpfTsKICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgNjAlKSIsICJoc2woMjEzIDkzJSA2OCUpIil9OwogICAgfQoKICAgIC5kcm9wem9uZS0tYWN0aXZlIHsKICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgNjAlKSIsICJoc2woMjEzIDkzJSA2OCUpIil9OwogICAgICBib3gtc2hhZG93OiAwIDEycHggMzJweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgxNSwgMjMsIDQyLCAwLjEyKSIsICJyZ2JhKDAsIDAsIDAsIDAuMzUpIil9OwogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgNjAlIC8gMC4wNikiLCAiaHNsKDIxMyA5MyUgNjglIC8gMC4xMikiKX07CiAgICB9CgogICAgLmRyb3B6b25lLS1oYXMtZmlsZXMgewogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTklKSIsICJoc2woMjE1IDIwJSAxMSUpIil9OwogICAgfQoKICAgIC5kcm9wem9uZS0tZGlzYWJsZWQgewogICAgICBvcGFjaXR5OiAwLjY7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgfQoKICAgIC5kcm9wem9uZV9fYm9keSB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGdhcDogMTZweDsKICAgIH0KCiAgICAuZHJvcHpvbmVfX2ljb24gewogICAgICB3aWR0aDogNDhweDsKICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE3IDkxJSA2MCUpIiwgImhzbCgyMTMgOTMlIDY4JSkiKX07CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE3IDkxJSA2MCUgLyAwLjEyKSIsICJoc2woMjEzIDkzJSA2OCUgLyAwLjEyKSIpfTsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICBmbGV4LXNocmluazogMDsKICAgIH0KCiAgICAuZHJvcHpvbmVfX2ljb24gZGVlcy1pY29uIHsKICAgICAgZm9udC1zaXplOiAyMnB4OwogICAgfQoKICAgIC5kcm9wem9uZV9fbG9hZGVyIHsKICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIGhlaWdodDogMjBweDsKICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICAgIGJvcmRlcjogMnB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDE1LCAyMywgNDIsIDAuMTUpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkiKX07CiAgICAgIGJvcmRlci10b3AtY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE3IDkxJSA2MCUpIiwgImhzbCgyMTMgOTMlIDY4JSkiKX07CiAgICAgIGFuaW1hdGlvbjogbG9hZGVyLXNwaW4gMC42cyBsaW5lYXIgaW5maW5pdGU7CiAgICB9CgogICAgLmRyb3B6b25lX19jb250ZW50IHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgZ2FwOiA0cHg7CiAgICAgIG1pbi13aWR0aDogMDsKICAgIH0KCiAgICAuZHJvcHpvbmVfX2hlYWRsaW5lIHsKICAgICAgZm9udC1zaXplOiAxNXB4OwogICAgICBmb250LXdlaWdodDogNjAwOwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIgNDclIDExJSkiLCAiaHNsKDIxMCAyMCUgOTYlKSIpfTsKICAgIH0KCiAgICAuZHJvcHpvbmVfX3N1YmxpbmUgewogICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAxNiUgNDYlKSIsICJoc2woMjE1IDE2JSA3MCUpIil9OwogICAgfQoKICAgIC5kcm9wem9uZV9fYnJvd3NlIHsKICAgICAgYXBwZWFyYW5jZTogbm9uZTsKICAgICAgYm9yZGVyOiBub25lOwogICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICBwYWRkaW5nOiAwOwogICAgICBtYXJnaW4tbGVmdDogNHB4OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTcgOTElIDYwJSkiLCAiaHNsKDIxMyA5MyUgNjglKSIpfTsKICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICB9CgogICAgLmRyb3B6b25lX19icm93c2U6aG92ZXIgewogICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgIH0KCiAgICAuZHJvcHpvbmVfX2Jyb3dzZTpkaXNhYmxlZCB7CiAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgIG9wYWNpdHk6IDAuNjsKICAgIH0KCiAgICAuZHJvcHpvbmVfX21ldGEgewogICAgICBtYXJnaW4tdG9wOiAxNHB4OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIGdhcDogOHB4OwogICAgICBmb250LXNpemU6IDEycHg7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAxNiUgNTAlKSIsICJoc2woMjE1IDE2JSA3MiUpIil9OwogICAgfQoKICAgIC5kcm9wem9uZV9fbWV0YSBzcGFuIHsKICAgICAgcGFkZGluZzogNHB4IDEwcHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgOTUlKSIsICJoc2woMjEzIDkzJSAxOCUpIil9OwogICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgOTAlKSIsICJoc2woMjEzIDkzJSAyNCUpIil9OwogICAgfQoKICAgIC5maWxlLWxpc3QgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDEycHg7CiAgICAgIG1hcmdpbi10b3A6IDIwcHg7CiAgICAgIHBhZGRpbmctdG9wOiAyMHB4OwogICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTcgOTElIDkwJSkiLCAiaHNsKDIxMyA5MyUgMjQlKSIpfTsKICAgIH0KCiAgICAuZmlsZS1saXN0X19oZWFkZXIgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDE2JSA0NSUpIiwgImhzbCgyMTUgMTYlIDY4JSkiKX07CiAgICB9CgogICAgLmZpbGUtbGlzdF9fY2xlYXIgewogICAgICBhcHBlYXJhbmNlOiBub25lOwogICAgICBib3JkZXI6IG5vbmU7CiAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgNjAlKSIsICJoc2woMjEzIDkzJSA2OCUpIil9OwogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgcGFkZGluZzogMDsKICAgIH0KCiAgICAuZmlsZS1saXN0X19jbGVhcjpob3ZlciB7CiAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgfQoKICAgIC5maWxlLWxpc3RfX2l0ZW1zIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgZ2FwOiAxMnB4OwogICAgfQoKICAgIC5maWxlLXJvdyB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGdhcDogMTJweDsKICAgICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSAvIDAuNSkiLCAiaHNsKDIxNSAyMCUgMTYlIC8gMC41KSIpfTsKICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTMgMjclIDkyJSkiLCAiaHNsKDIxNyAyNSUgMjYlKSIpfTsKICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzIGVhc2U7CiAgICB9CgogICAgLmZpbGUtcm93OmhvdmVyIHsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUgLyAwLjgpIiwgImhzbCgyMTUgMjAlIDE2JSAvIDAuOCkiKX07CiAgICB9CgogICAgLmZpbGUtdGh1bWIgewogICAgICB3aWR0aDogMzZweDsKICAgICAgaGVpZ2h0OiAzNnB4OwogICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0IDMxJSA5MiUpIiwgImhzbCgyMTcgMzIlIDE4JSkiKX07CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICBmbGV4LXNocmluazogMDsKICAgIH0KCiAgICAuZmlsZS10aHVtYiBkZWVzLWljb24gewogICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAxNiUgNDUlKSIsICJoc2woMjE1IDE2JSA3MCUpIil9OwogICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgd2lkdGg6IDE4cHg7CiAgICAgIGhlaWdodDogMThweDsKICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgfQoKCiAgICAudGh1bWItaW1hZ2UgewogICAgICB3aWR0aDogMTAwJTsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBvYmplY3QtZml0OiBjb3ZlcjsKICAgIH0KCiAgICAuZmlsZS1tZXRhIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgZ2FwOiA0cHg7CiAgICAgIG1pbi13aWR0aDogMDsKICAgIH0KCiAgICAuZmlsZS1uYW1lIHsKICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIgNDclIDExJSkiLCAiaHNsKDIxMCAyMCUgOTYlKSIpfTsKICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB9CgogICAgLmZpbGUtZGV0YWlscyB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGdhcDogOHB4OwogICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDE2JSA0NiUpIiwgImhzbCgyMTUgMTYlIDcwJSkiKX07CiAgICB9CgogICAgLmZpbGUtc2l6ZSB7CiAgICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICB9CgogICAgLmZpbGUtdHlwZSB7CiAgICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNCAzMSUgODYlKSIsICJoc2woMjE3IDMyJSAyOCUpIil9OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDQ2JSkiLCAiaHNsKDIxNSAxNiUgNzAlKSIpfTsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDhlbTsKICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICB9CgogICAgLmZpbGUtYWN0aW9ucyB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGdhcDogOHB4OwogICAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgIH0KCiAgICAucmVtb3ZlLWJ1dHRvbiB7CiAgICAgIHdpZHRoOiAyOHB4OwogICAgICBoZWlnaHQ6IDI4cHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cyBlYXNlLCB0cmFuc2Zvcm0gMC4xNXMgZWFzZSwgY29sb3IgMC4xNXMgZWFzZTsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDE2JSA1MiUpIiwgImhzbCgyMTUgMTYlIDY4JSkiKX07CiAgICB9CgogICAgLnJlbW92ZS1idXR0b246aG92ZXIgewogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzIlIDUwJSAvIDAuMDgpIiwgImhzbCgwIDYyJSAzMiUgLyAwLjE1KSIpfTsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA3MiUgNDYlKSIsICJoc2woMCA3MCUgNzAlKSIpfTsKICAgIH0KCiAgICAucmVtb3ZlLWJ1dHRvbjphY3RpdmUgewogICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTYpOwogICAgfQoKICAgIC5yZW1vdmUtYnV0dG9uIGRlZXMtaWNvbiB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB3aWR0aDogMTRweDsKICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICBmbGV4LXNocmluazogMDsKICAgIH0KCiAgICAudmFsaWRhdGlvbi1tZXNzYWdlIHsKICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcyJSA0MCUpIiwgImhzbCgwIDcwJSA2OCUpIil9OwogICAgICBsaW5lLWhlaWdodDogMS41OwogICAgfQoKICAgIEBrZXlmcmFtZXMgbG9hZGVyLXNwaW4gewogICAgICB0byB7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgfQogICAgfQogIGAKXTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LWZpbGV1cGxvYWQvY29tcG9uZW50LmpzCmluaXRfZGVlc19pY29uKCk7CmluaXRfZGlzdF90czMwKCk7CnZhciBfX2VzRGVjb3JhdGUyNiA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMjcgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNJbnB1dEZpbGV1cGxvYWQgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtaW5wdXQtZmlsZXVwbG9hZCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzSW5wdXRCYXNlOwogIGxldCBfdmFsdWVfZGVjb3JhdG9yczsKICBsZXQgX3ZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3N0YXRlX2RlY29yYXRvcnM7CiAgbGV0IF9zdGF0ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3N0YXRlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0xvYWRpbmdfZGVjb3JhdG9yczsKICBsZXQgX2lzTG9hZGluZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzTG9hZGluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYnV0dG9uVGV4dF9kZWNvcmF0b3JzOwogIGxldCBfYnV0dG9uVGV4dF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2J1dHRvblRleHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FjY2VwdF9kZWNvcmF0b3JzOwogIGxldCBfYWNjZXB0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWNjZXB0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tdWx0aXBsZV9kZWNvcmF0b3JzOwogIGxldCBfbXVsdGlwbGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tdWx0aXBsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWF4U2l6ZV9kZWNvcmF0b3JzOwogIGxldCBfbWF4U2l6ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21heFNpemVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21heEZpbGVzX2RlY29yYXRvcnM7CiAgbGV0IF9tYXhGaWxlc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21heEZpbGVzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWxpZGF0aW9uU3RhdGVfZGVjb3JhdG9yczsKICBsZXQgX3ZhbGlkYXRpb25TdGF0ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbGlkYXRpb25TdGF0ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW5wdXRGaWxldXBsb2FkMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3ZhbHVlX2RlY29yYXRvcnMgPSBbbjUoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXTsKICAgICAgX3N0YXRlX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pc0xvYWRpbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2J1dHRvblRleHRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9hY2NlcHRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9tdWx0aXBsZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9tYXhTaXplX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfbWF4RmlsZXNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF92YWxpZGF0aW9uU3RhdGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZywgcmVmbGVjdDogdHJ1ZSB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTI2KHRoaXMsIG51bGwsIF92YWx1ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2YWx1ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmFsdWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmFsdWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZhbHVlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZhbHVlX2luaXRpYWxpemVycywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjYodGhpcywgbnVsbCwgX3N0YXRlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInN0YXRlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzdGF0ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zdGF0ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc3RhdGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc3RhdGVfaW5pdGlhbGl6ZXJzLCBfc3RhdGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNih0aGlzLCBudWxsLCBfaXNMb2FkaW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzTG9hZGluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNMb2FkaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzTG9hZGluZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNMb2FkaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzTG9hZGluZ19pbml0aWFsaXplcnMsIF9pc0xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNih0aGlzLCBudWxsLCBfYnV0dG9uVGV4dF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJidXR0b25UZXh0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJidXR0b25UZXh0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmJ1dHRvblRleHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmJ1dHRvblRleHQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYnV0dG9uVGV4dF9pbml0aWFsaXplcnMsIF9idXR0b25UZXh0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjYodGhpcywgbnVsbCwgX2FjY2VwdF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhY2NlcHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFjY2VwdCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hY2NlcHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFjY2VwdCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hY2NlcHRfaW5pdGlhbGl6ZXJzLCBfYWNjZXB0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjYodGhpcywgbnVsbCwgX211bHRpcGxlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm11bHRpcGxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtdWx0aXBsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tdWx0aXBsZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubXVsdGlwbGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbXVsdGlwbGVfaW5pdGlhbGl6ZXJzLCBfbXVsdGlwbGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNih0aGlzLCBudWxsLCBfbWF4U2l6ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtYXhTaXplIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtYXhTaXplIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1heFNpemUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1heFNpemUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWF4U2l6ZV9pbml0aWFsaXplcnMsIF9tYXhTaXplX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjYodGhpcywgbnVsbCwgX21heEZpbGVzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1heEZpbGVzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtYXhGaWxlcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYXhGaWxlcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWF4RmlsZXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWF4RmlsZXNfaW5pdGlhbGl6ZXJzLCBfbWF4RmlsZXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNih0aGlzLCBudWxsLCBfdmFsaWRhdGlvblN0YXRlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZhbGlkYXRpb25TdGF0ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmFsaWRhdGlvblN0YXRlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZhbGlkYXRpb25TdGF0ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudmFsaWRhdGlvblN0YXRlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZhbGlkYXRpb25TdGF0ZV9pbml0aWFsaXplcnMsIF92YWxpZGF0aW9uU3RhdGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyNihudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNJbnB1dEZpbGV1cGxvYWQyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMxODsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJJbnB1dCJdOwogICAgI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczI3KHRoaXMsIF92YWx1ZV9pbml0aWFsaXplcnMsIFtdKTsKICAgIGdldCB2YWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc3RhdGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI3KHRoaXMsIF92YWx1ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjcodGhpcywgX3N0YXRlX2luaXRpYWxpemVycywgImlkbGUiKSk7CiAgICBnZXQgc3RhdGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzdGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHN0YXRlKHZhbHVlMikgewogICAgICB0aGlzLiNzdGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzTG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjcodGhpcywgX3N0YXRlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNyh0aGlzLCBfaXNMb2FkaW5nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc0xvYWRpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc0xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc0xvYWRpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzTG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2J1dHRvblRleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI3KHRoaXMsIF9pc0xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczI3KHRoaXMsIF9idXR0b25UZXh0X2luaXRpYWxpemVycywgIlNlbGVjdCBmaWxlcyIpKTsKICAgIGdldCBidXR0b25UZXh0KCkgewogICAgICByZXR1cm4gdGhpcy4jYnV0dG9uVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGJ1dHRvblRleHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2J1dHRvblRleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhY2NlcHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI3KHRoaXMsIF9idXR0b25UZXh0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNyh0aGlzLCBfYWNjZXB0X2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBhY2NlcHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhY2NlcHRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhY2NlcHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2FjY2VwdF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI211bHRpcGxlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMyNyh0aGlzLCBfYWNjZXB0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNyh0aGlzLCBfbXVsdGlwbGVfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgbXVsdGlwbGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtdWx0aXBsZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG11bHRpcGxlKHZhbHVlMikgewogICAgICB0aGlzLiNtdWx0aXBsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21heFNpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI3KHRoaXMsIF9tdWx0aXBsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjcodGhpcywgX21heFNpemVfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgbWF4U2l6ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21heFNpemVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIC8vIDAgbWVhbnMgbm8gbGltaXQKICAgIHNldCBtYXhTaXplKHZhbHVlMikgewogICAgICB0aGlzLiNtYXhTaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWF4RmlsZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI3KHRoaXMsIF9tYXhTaXplX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNyh0aGlzLCBfbWF4RmlsZXNfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgbWF4RmlsZXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtYXhGaWxlc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgLy8gMCBtZWFucyBubyBsaW1pdAogICAgc2V0IG1heEZpbGVzKHZhbHVlMikgewogICAgICB0aGlzLiNtYXhGaWxlc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3ZhbGlkYXRpb25TdGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjcodGhpcywgX21heEZpbGVzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyNyh0aGlzLCBfdmFsaWRhdGlvblN0YXRlX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IHZhbGlkYXRpb25TdGF0ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ZhbGlkYXRpb25TdGF0ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbGlkYXRpb25TdGF0ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdmFsaWRhdGlvblN0YXRlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdmFsaWRhdGlvbk1lc3NhZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI3KHRoaXMsIF92YWxpZGF0aW9uU3RhdGVfZXh0cmFJbml0aWFsaXplcnMpLCAiIik7CiAgICBnZXQgdmFsaWRhdGlvbk1lc3NhZ2UoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWxpZGF0aW9uTWVzc2FnZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbGlkYXRpb25NZXNzYWdlKHZhbHVlMikgewogICAgICB0aGlzLiN2YWxpZGF0aW9uTWVzc2FnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgcHJldmlld1VybE1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogICAgZHJvcEFyZWEgPSBudWxsOwogICAgc3RhdGljIHN0eWxlcyA9IGZpbGV1cGxvYWRTdHlsZXM7CiAgICByZW5kZXIoKSB7CiAgICAgIGNvbnN0IGFjY2VwdGVkU3VtbWFyeSA9IHRoaXMuZ2V0QWNjZXB0ZWRTdW1tYXJ5KCk7CiAgICAgIGNvbnN0IG1ldGFFbnRyaWVzID0gWwogICAgICAgIHRoaXMubXVsdGlwbGUgPyAiTXVsdGlwbGUgZmlsZXMgc3VwcG9ydGVkIiA6ICJTaW5nbGUgZmlsZSBvbmx5IiwKICAgICAgICB0aGlzLm1heFNpemUgPiAwID8gYE1heCAke3RoaXMuZm9ybWF0RmlsZVNpemUodGhpcy5tYXhTaXplKX1gIDogIk5vIHNpemUgbGltaXQiCiAgICAgIF07CiAgICAgIGlmIChhY2NlcHRlZFN1bW1hcnkpIHsKICAgICAgICBtZXRhRW50cmllcy5wdXNoKGBBY2NlcHRzICR7YWNjZXB0ZWRTdW1tYXJ5fWApOwogICAgICB9CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgICAgPGRlZXMtbGFiZWwKICAgICAgICAgIC5sYWJlbD0ke3RoaXMubGFiZWx9CiAgICAgICAgICAuZGVzY3JpcHRpb249JHt0aGlzLmRlc2NyaXB0aW9ufQogICAgICAgICAgLnJlcXVpcmVkPSR7dGhpcy5yZXF1aXJlZH0KICAgICAgICA+PC9kZWVzLWxhYmVsPgogICAgICAgIDxkaXYKICAgICAgICAgIGNsYXNzPSJkcm9wem9uZSAke3RoaXMuc3RhdGUgPT09ICJkcmFnT3ZlciIgPyAiZHJvcHpvbmUtLWFjdGl2ZSIgOiAiIn0gJHt0aGlzLmRpc2FibGVkID8gImRyb3B6b25lLS1kaXNhYmxlZCIgOiAiIn0gJHt0aGlzLnZhbHVlLmxlbmd0aCA+IDAgPyAiZHJvcHpvbmUtLWhhcy1maWxlcyIgOiAiIn0iCiAgICAgICAgICByb2xlPSJidXR0b24iCiAgICAgICAgICB0YWJpbmRleD0ke3RoaXMuZGlzYWJsZWQgPyAtMSA6IDB9CiAgICAgICAgICBhcmlhLWRpc2FibGVkPSR7dGhpcy5kaXNhYmxlZH0KICAgICAgICAgIGFyaWEtbGFiZWw9JHtgU2VsZWN0IGZpbGVzJHthY2NlcHRlZFN1bW1hcnkgPyBgICgke2FjY2VwdGVkU3VtbWFyeX0pYCA6ICIifWB9CiAgICAgICAgICBAY2xpY2s9JHt0aGlzLmhhbmRsZURyb3B6b25lQ2xpY2t9CiAgICAgICAgICBAa2V5ZG93bj0ke3RoaXMuaGFuZGxlRHJvcHpvbmVLZXlkb3dufQogICAgICAgID4KICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICBjbGFzcz0iZmlsZS1pbnB1dCIKICAgICAgICAgICAgc3R5bGU9InBvc2l0aW9uOiBhYnNvbHV0ZTsgb3BhY2l0eTogMDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IHdpZHRoOiAxcHg7IGhlaWdodDogMXB4OyB0b3A6IDA7IGxlZnQ6IDA7IG92ZXJmbG93OiBoaWRkZW47IgogICAgICAgICAgICB0eXBlPSJmaWxlIgogICAgICAgICAgICA/bXVsdGlwbGU9JHt0aGlzLm11bHRpcGxlfQogICAgICAgICAgICBhY2NlcHQ9JHt0aGlzLmFjY2VwdCB8fCAiIn0KICAgICAgICAgICAgP2Rpc2FibGVkPSR7dGhpcy5kaXNhYmxlZH0KICAgICAgICAgICAgQGNoYW5nZT0ke3RoaXMuaGFuZGxlRmlsZUlucHV0Q2hhbmdlfQogICAgICAgICAgICB0YWJpbmRleD0iLTEiCiAgICAgICAgICAvPgogICAgICAgICAgPGRpdiBjbGFzcz0iZHJvcHpvbmVfX2JvZHkiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkcm9wem9uZV9faWNvbiI+CiAgICAgICAgICAgICAgJHt0aGlzLmlzTG9hZGluZyA/IGIyYDxzcGFuIGNsYXNzPSJkcm9wem9uZV9fbG9hZGVyIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9zcGFuPmAgOiBiMmA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpGb2xkZXJPcGVuIj48L2RlZXMtaWNvbj5gfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZHJvcHpvbmVfX2NvbnRlbnQiPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkcm9wem9uZV9faGVhZGxpbmUiPiR7dGhpcy5idXR0b25UZXh0IHx8ICJTZWxlY3QgZmlsZXMifTwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZHJvcHpvbmVfX3N1YmxpbmUiPgogICAgICAgICAgICAgICAgRHJhZyBhbmQgZHJvcCBmaWxlcyBoZXJlIG9yCiAgICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICAgIHR5cGU9ImJ1dHRvbiIKICAgICAgICAgICAgICAgICAgY2xhc3M9ImRyb3B6b25lX19icm93c2UiCiAgICAgICAgICAgICAgICAgIEBjbGljaz0ke3RoaXMuaGFuZGxlQnJvd3NlQ2xpY2t9CiAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD0ke3RoaXMuZGlzYWJsZWR9CiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIGJyb3dzZQogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZHJvcHpvbmVfX21ldGEiPgogICAgICAgICAgICAke21ldGFFbnRyaWVzLm1hcCgoZW50cnkpID0+IGIyYDxzcGFuPiR7ZW50cnl9PC9zcGFuPmApfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgICAke3RoaXMucmVuZGVyRmlsZUxpc3QoKX0KICAgICAgICA8L2Rpdj4KICAgICAgICAke3RoaXMudmFsaWRhdGlvbk1lc3NhZ2UgPyBiMmA8ZGl2IGNsYXNzPSJ2YWxpZGF0aW9uLW1lc3NhZ2UiIGFyaWEtbGl2ZT0icG9saXRlIj4ke3RoaXMudmFsaWRhdGlvbk1lc3NhZ2V9PC9kaXY+YCA6IGIyYGB9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlckZpbGVMaXN0KCkgewogICAgICBpZiAodGhpcy52YWx1ZS5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gYjJgYDsKICAgICAgfQogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImZpbGUtbGlzdCI+CiAgICAgICAgPGRpdiBjbGFzcz0iZmlsZS1saXN0X19oZWFkZXIiPgogICAgICAgICAgPHNwYW4+JHt0aGlzLnZhbHVlLmxlbmd0aH0gZmlsZSR7dGhpcy52YWx1ZS5sZW5ndGggPT09IDEgPyAiIiA6ICJzIn0gc2VsZWN0ZWQ8L3NwYW4+CiAgICAgICAgICAke3RoaXMudmFsdWUubGVuZ3RoID4gMCA/IGIyYDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iZmlsZS1saXN0X19jbGVhciIgQGNsaWNrPSR7dGhpcy5oYW5kbGVDbGVhckFsbH0+Q2xlYXIgJHt0aGlzLnZhbHVlLmxlbmd0aCA+IDEgPyAiYWxsIiA6ICIifTwvYnV0dG9uPmAgOiBiMmBgfQogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImZpbGUtbGlzdF9faXRlbXMiPgogICAgICAgICAgJHt0aGlzLnZhbHVlLm1hcCgoZmlsZSkgPT4gdGhpcy5yZW5kZXJGaWxlUm93KGZpbGUpKX0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgcmVuZGVyRmlsZVJvdyhmaWxlKSB7CiAgICAgIGNvbnN0IGZpbGVUeXBlID0gdGhpcy5nZXRGaWxlVHlwZShmaWxlKTsKICAgICAgY29uc3QgcHJldmlld1VybCA9IHRoaXMuY2FuU2hvd1ByZXZpZXcoZmlsZSkgPyB0aGlzLmdldFByZXZpZXdVcmwoZmlsZSkgOiBudWxsOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImZpbGUtcm93ICR7ZmlsZVR5cGV9LWZpbGUiPgogICAgICAgIDxkaXYgY2xhc3M9ImZpbGUtdGh1bWIiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICR7cHJldmlld1VybCA/IGIyYDxpbWcgY2xhc3M9InRodW1iLWltYWdlIiBzcmM9JHtwcmV2aWV3VXJsfSBhbHQ9JHtgUHJldmlldyBvZiAke2ZpbGUubmFtZX1gfT5gIDogYjJgPGRlZXMtaWNvbiBpY29uPSR7dGhpcy5nZXRGaWxlSWNvbihmaWxlKX0+PC9kZWVzLWljb24+YH0KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJmaWxlLW1ldGEiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZmlsZS1uYW1lIiB0aXRsZT0ke2ZpbGUubmFtZX0+JHtmaWxlLm5hbWV9PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJmaWxlLWRldGFpbHMiPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iZmlsZS1zaXplIj4ke3RoaXMuZm9ybWF0RmlsZVNpemUoZmlsZS5zaXplKX08L3NwYW4+CiAgICAgICAgICAgICR7ZmlsZVR5cGUgIT09ICJmaWxlIiA/IGIyYDxzcGFuIGNsYXNzPSJmaWxlLXR5cGUiPiR7ZmlsZVR5cGV9PC9zcGFuPmAgOiBiMmBgfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iZmlsZS1hY3Rpb25zIj4KICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgdHlwZT0iYnV0dG9uIgogICAgICAgICAgICBjbGFzcz0icmVtb3ZlLWJ1dHRvbiIKICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5yZW1vdmVGaWxlKGZpbGUpfQogICAgICAgICAgICBhcmlhLWxhYmVsPSR7YFJlbW92ZSAke2ZpbGUubmFtZX1gfQogICAgICAgICAgPgogICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpYIj48L2RlZXMtaWNvbj4KICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBoYW5kbGVGaWxlSW5wdXRDaGFuZ2UgPSBhc3luYyAoZXZlbnQpID0+IHsKICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTsKICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0OwogICAgICBjb25zdCBmaWxlcyA9IEFycmF5LmZyb20odGFyZ2V0LmZpbGVzID8/IFtdKTsKICAgICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHsKICAgICAgICBhd2FpdCB0aGlzLmFkZEZpbGVzKGZpbGVzKTsKICAgICAgfQogICAgICB0YXJnZXQudmFsdWUgPSAiIjsKICAgIH07CiAgICBoYW5kbGVEcm9wem9uZUNsaWNrID0gKGV2ZW50KSA9PiB7CiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChldmVudC50YXJnZXQuY2xvc2VzdCgiLmRyb3B6b25lX19icm93c2UsIC5maWxlLWxpc3QiKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLm9wZW5GaWxlU2VsZWN0b3IoKTsKICAgIH07CiAgICBoYW5kbGVCcm93c2VDbGljayA9IChldmVudCkgPT4gewogICAgICBpZiAodGhpcy5kaXNhYmxlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgdGhpcy5vcGVuRmlsZVNlbGVjdG9yKCk7CiAgICB9OwogICAgaGFuZGxlRHJvcHpvbmVLZXlkb3duID0gKGV2ZW50KSA9PiB7CiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChldmVudC5rZXkgPT09ICJFbnRlciIgfHwgZXZlbnQua2V5ID09PSAiICIpIHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMub3BlbkZpbGVTZWxlY3RvcigpOwogICAgICB9CiAgICB9OwogICAgaGFuZGxlQ2xlYXJBbGwgPSAoZXZlbnQpID0+IHsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy5jbGVhckFsbCgpOwogICAgfTsKICAgIGhhbmRsZURyYWdFdmVudCA9IGFzeW5jIChldmVudCkgPT4gewogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICJkcmFnZW50ZXIiIHx8IGV2ZW50LnR5cGUgPT09ICJkcmFnb3ZlciIpIHsKICAgICAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSB7CiAgICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICJjb3B5IjsKICAgICAgICB9CiAgICAgICAgdGhpcy5zdGF0ZSA9ICJkcmFnT3ZlciI7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChldmVudC50eXBlID09PSAiZHJhZ2xlYXZlIikgewogICAgICAgIGlmICghdGhpcy5kcm9wQXJlYSkgewogICAgICAgICAgdGhpcy5zdGF0ZSA9ICJpZGxlIjsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZHJvcEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgY29uc3QgeyBjbGllbnRYID0gMCwgY2xpZW50WSA9IDAgfSA9IGV2ZW50OwogICAgICAgIGlmIChjbGllbnRYIDw9IHJlY3QubGVmdCB8fCBjbGllbnRYID49IHJlY3QucmlnaHQgfHwgY2xpZW50WSA8PSByZWN0LnRvcCB8fCBjbGllbnRZID49IHJlY3QuYm90dG9tKSB7CiAgICAgICAgICB0aGlzLnN0YXRlID0gImlkbGUiOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICJkcm9wIikgewogICAgICAgIHRoaXMuc3RhdGUgPSAiaWRsZSI7CiAgICAgICAgY29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXMgPz8gW10pOwogICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICBhd2FpdCB0aGlzLmFkZEZpbGVzKGZpbGVzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBhdHRhY2hEcm9wTGlzdGVuZXJzKCkgewogICAgICBpZiAoIXRoaXMuZHJvcEFyZWEpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgWyJkcmFnZW50ZXIiLCAiZHJhZ292ZXIiLCAiZHJhZ2xlYXZlIiwgImRyb3AiXS5mb3JFYWNoKChldmVudE5hbWUpID0+IHsKICAgICAgICB0aGlzLmRyb3BBcmVhLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB0aGlzLmhhbmRsZURyYWdFdmVudCk7CiAgICAgIH0pOwogICAgfQogICAgZGV0YWNoRHJvcExpc3RlbmVycygpIHsKICAgICAgaWYgKCF0aGlzLmRyb3BBcmVhKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIFsiZHJhZ2VudGVyIiwgImRyYWdvdmVyIiwgImRyYWdsZWF2ZSIsICJkcm9wIl0uZm9yRWFjaCgoZXZlbnROYW1lKSA9PiB7CiAgICAgICAgdGhpcy5kcm9wQXJlYS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgdGhpcy5oYW5kbGVEcmFnRXZlbnQpOwogICAgICB9KTsKICAgIH0KICAgIHJlYmluZEludGVyYWN0aXZlRWxlbWVudHMoKSB7CiAgICAgIGNvbnN0IG5ld0Ryb3BBcmVhID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuZHJvcHpvbmUiKTsKICAgICAgaWYgKG5ld0Ryb3BBcmVhICE9PSB0aGlzLmRyb3BBcmVhKSB7CiAgICAgICAgdGhpcy5kZXRhY2hEcm9wTGlzdGVuZXJzKCk7CiAgICAgICAgdGhpcy5kcm9wQXJlYSA9IG5ld0Ryb3BBcmVhOwogICAgICAgIHRoaXMuYXR0YWNoRHJvcExpc3RlbmVycygpOwogICAgICB9CiAgICB9CiAgICBmb3JtYXRGaWxlU2l6ZShieXRlcykgewogICAgICBjb25zdCB1bml0czMgPSBbIkJ5dGVzIiwgIktCIiwgIk1CIiwgIkdCIl07CiAgICAgIGlmIChieXRlcyA9PT0gMCkKICAgICAgICByZXR1cm4gIjAgQnl0ZXMiOwogICAgICBjb25zdCBleHBvbmVudCA9IE1hdGgubWluKE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coMTAyNCkpLCB1bml0czMubGVuZ3RoIC0gMSk7CiAgICAgIGNvbnN0IHNpemUgPSBieXRlcyAvIE1hdGgucG93KDEwMjQsIGV4cG9uZW50KTsKICAgICAgcmV0dXJuIGAke01hdGgucm91bmQoc2l6ZSAqIDEwMCkgLyAxMDB9ICR7dW5pdHMzW2V4cG9uZW50XX1gOwogICAgfQogICAgZ2V0RmlsZVR5cGUoZmlsZSkgewogICAgICBjb25zdCB0eXBlNSA9IGZpbGUudHlwZS50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAodHlwZTUuc3RhcnRzV2l0aCgiaW1hZ2UvIikpCiAgICAgICAgcmV0dXJuICJpbWFnZSI7CiAgICAgIGlmICh0eXBlNSA9PT0gImFwcGxpY2F0aW9uL3BkZiIpCiAgICAgICAgcmV0dXJuICJwZGYiOwogICAgICBpZiAodHlwZTUuaW5jbHVkZXMoIndvcmQiKSB8fCB0eXBlNS5pbmNsdWRlcygiZG9jdW1lbnQiKSkKICAgICAgICByZXR1cm4gImRvYyI7CiAgICAgIGlmICh0eXBlNS5pbmNsdWRlcygic2hlZXQiKSB8fCB0eXBlNS5pbmNsdWRlcygiZXhjZWwiKSkKICAgICAgICByZXR1cm4gInNwcmVhZHNoZWV0IjsKICAgICAgaWYgKHR5cGU1LmluY2x1ZGVzKCJwcmVzZW50YXRpb24iKSB8fCB0eXBlNS5pbmNsdWRlcygicG93ZXJwb2ludCIpKQogICAgICAgIHJldHVybiAicHJlc2VudGF0aW9uIjsKICAgICAgaWYgKHR5cGU1LnN0YXJ0c1dpdGgoInZpZGVvLyIpKQogICAgICAgIHJldHVybiAidmlkZW8iOwogICAgICBpZiAodHlwZTUuc3RhcnRzV2l0aCgiYXVkaW8vIikpCiAgICAgICAgcmV0dXJuICJhdWRpbyI7CiAgICAgIGlmICh0eXBlNS5pbmNsdWRlcygiemlwIikgfHwgdHlwZTUuaW5jbHVkZXMoImNvbXByZXNzZWQiKSkKICAgICAgICByZXR1cm4gImFyY2hpdmUiOwogICAgICByZXR1cm4gImZpbGUiOwogICAgfQogICAgZ2V0RmlsZUljb24oZmlsZSkgewogICAgICBjb25zdCBmaWxlVHlwZSA9IHRoaXMuZ2V0RmlsZVR5cGUoZmlsZSk7CiAgICAgIGNvbnN0IGljb25NYXAgPSB7CiAgICAgICAgaW1hZ2U6ICJsdWNpZGU6RmlsZUltYWdlIiwKICAgICAgICBwZGY6ICJsdWNpZGU6RmlsZVRleHQiLAogICAgICAgIGRvYzogImx1Y2lkZTpGaWxlVGV4dCIsCiAgICAgICAgc3ByZWFkc2hlZXQ6ICJsdWNpZGU6RmlsZVNwcmVhZHNoZWV0IiwKICAgICAgICBwcmVzZW50YXRpb246ICJsdWNpZGU6RmlsZUJhckNoYXJ0IiwKICAgICAgICB2aWRlbzogImx1Y2lkZTpGaWxlVmlkZW8iLAogICAgICAgIGF1ZGlvOiAibHVjaWRlOkZpbGVBdWRpbyIsCiAgICAgICAgYXJjaGl2ZTogImx1Y2lkZTpGaWxlQXJjaGl2ZSIsCiAgICAgICAgZmlsZTogImx1Y2lkZTpGaWxlIgogICAgICB9OwogICAgICByZXR1cm4gaWNvbk1hcFtmaWxlVHlwZV0gPz8gImx1Y2lkZTpGaWxlIjsKICAgIH0KICAgIGNhblNob3dQcmV2aWV3KGZpbGUpIHsKICAgICAgcmV0dXJuIGZpbGUudHlwZS5zdGFydHNXaXRoKCJpbWFnZS8iKSAmJiBmaWxlLnNpemUgPCA1ICogMTAyNCAqIDEwMjQ7CiAgICB9CiAgICB2YWxpZGF0ZUZpbGUoZmlsZSkgewogICAgICBpZiAodGhpcy5tYXhTaXplID4gMCAmJiBmaWxlLnNpemUgPiB0aGlzLm1heFNpemUpIHsKICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID0gYEZpbGUgIiR7ZmlsZS5uYW1lfSIgZXhjZWVkcyB0aGUgbWF4aW11bSBzaXplIG9mICR7dGhpcy5mb3JtYXRGaWxlU2l6ZSh0aGlzLm1heFNpemUpfWA7CiAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RhdGUgPSAiaW52YWxpZCI7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmICh0aGlzLmFjY2VwdCkgewogICAgICAgIGNvbnN0IGFjY2VwdGVkVHlwZXMgPSB0aGlzLmFjY2VwdC5zcGxpdCgiLCIpLm1hcCgoZW50cnkpID0+IGVudHJ5LnRyaW0oKSkuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkubGVuZ3RoID4gMCk7CiAgICAgICAgaWYgKGFjY2VwdGVkVHlwZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgbGV0IGlzQWNjZXB0ZWQgPSBmYWxzZTsKICAgICAgICAgIGZvciAoY29uc3QgYWNjZXB0VHlwZSBvZiBhY2NlcHRlZFR5cGVzKSB7CiAgICAgICAgICAgIGlmIChhY2NlcHRUeXBlLnN0YXJ0c1dpdGgoIi4iKSkgewogICAgICAgICAgICAgIGlmIChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChhY2NlcHRUeXBlLnRvTG93ZXJDYXNlKCkpKSB7CiAgICAgICAgICAgICAgICBpc0FjY2VwdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChhY2NlcHRUeXBlLmVuZHNXaXRoKCIvKiIpKSB7CiAgICAgICAgICAgICAgY29uc3QgcHJlZml4NCA9IGFjY2VwdFR5cGUuc2xpY2UoMCwgLTIpOwogICAgICAgICAgICAgIGlmIChmaWxlLnR5cGUuc3RhcnRzV2l0aChwcmVmaXg0KSkgewogICAgICAgICAgICAgICAgaXNBY2NlcHRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZS50eXBlID09PSBhY2NlcHRUeXBlKSB7CiAgICAgICAgICAgICAgaXNBY2NlcHRlZCA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICghaXNBY2NlcHRlZCkgewogICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID0gYEZpbGUgdHlwZSBub3QgYWNjZXB0ZWQuIEFsbG93ZWQ6ICR7YWNjZXB0ZWRUeXBlcy5qb2luKCIsICIpfWA7CiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvblN0YXRlID0gImludmFsaWQiOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZ2V0UHJldmlld1VybChmaWxlKSB7CiAgICAgIGxldCB1cmwgPSB0aGlzLnByZXZpZXdVcmxNYXAuZ2V0KGZpbGUpOwogICAgICBpZiAoIXVybCkgewogICAgICAgIHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7CiAgICAgICAgdGhpcy5wcmV2aWV3VXJsTWFwLnNldChmaWxlLCB1cmwpOwogICAgICB9CiAgICAgIHJldHVybiB1cmw7CiAgICB9CiAgICByZWxlYXNlUHJldmlldyhmaWxlKSB7CiAgICAgIGNvbnN0IHVybCA9IHRoaXMucHJldmlld1VybE1hcC5nZXQoZmlsZSk7CiAgICAgIGlmICh1cmwpIHsKICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7CiAgICAgICAgdGhpcy5wcmV2aWV3VXJsTWFwLmRlbGV0ZShmaWxlKTsKICAgICAgfQogICAgfQogICAgZ2V0QWNjZXB0ZWRTdW1tYXJ5KCkgewogICAgICBpZiAoIXRoaXMuYWNjZXB0KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgZm9ybWF0dGVkID0gQXJyYXkuZnJvbShuZXcgU2V0KHRoaXMuYWNjZXB0LnNwbGl0KCIsIikubWFwKCh0b2tlbikgPT4gdG9rZW4udHJpbSgpKS5maWx0ZXIoKHRva2VuKSA9PiB0b2tlbi5sZW5ndGggPiAwKS5tYXAoKHRva2VuKSA9PiB0aGlzLmZvcm1hdEFjY2VwdFRva2VuKHRva2VuKSkpKS5maWx0ZXIoQm9vbGVhbik7CiAgICAgIGlmIChmb3JtYXR0ZWQubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKGZvcm1hdHRlZC5sZW5ndGggPT09IDEpIHsKICAgICAgICByZXR1cm4gZm9ybWF0dGVkWzBdOwogICAgICB9CiAgICAgIGlmIChmb3JtYXR0ZWQubGVuZ3RoID09PSAyKSB7CiAgICAgICAgcmV0dXJuIGAke2Zvcm1hdHRlZFswXX0sICR7Zm9ybWF0dGVkWzFdfWA7CiAgICAgIH0KICAgICAgcmV0dXJuIGAke2Zvcm1hdHRlZC5zbGljZSgwLCAyKS5qb2luKCIsICIpfVx1MjAyNmA7CiAgICB9CiAgICBmb3JtYXRBY2NlcHRUb2tlbih0b2tlbikgewogICAgICBpZiAodG9rZW4gPT09ICIqLyoiKSB7CiAgICAgICAgcmV0dXJuICJBbGwgZmlsZXMiOwogICAgICB9CiAgICAgIGlmICh0b2tlbi5lbmRzV2l0aCgiLyoiKSkgewogICAgICAgIGNvbnN0IGZhbWlseSA9IHRva2VuLnNwbGl0KCIvIilbMF07CiAgICAgICAgaWYgKCFmYW1pbHkpIHsKICAgICAgICAgIHJldHVybiAiQWxsIGZpbGVzIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGAke2ZhbWlseS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKX0ke2ZhbWlseS5zbGljZSgxKX0gZmlsZXNgOwogICAgICB9CiAgICAgIGlmICh0b2tlbi5zdGFydHNXaXRoKCIuIikpIHsKICAgICAgICByZXR1cm4gdG9rZW4uc2xpY2UoMSkudG9VcHBlckNhc2UoKTsKICAgICAgfQogICAgICBpZiAodG9rZW4uaW5jbHVkZXMoInBkZiIpKQogICAgICAgIHJldHVybiAiUERGIjsKICAgICAgaWYgKHRva2VuLmluY2x1ZGVzKCJ6aXAiKSkKICAgICAgICByZXR1cm4gIlpJUCI7CiAgICAgIGlmICh0b2tlbi5pbmNsdWRlcygianNvbiIpKQogICAgICAgIHJldHVybiAiSlNPTiI7CiAgICAgIGlmICh0b2tlbi5pbmNsdWRlcygibXN3b3JkIikpCiAgICAgICAgcmV0dXJuICJET0MiOwogICAgICBpZiAodG9rZW4uaW5jbHVkZXMoIndvcmRwcm9jZXNzaW5nbWwiKSkKICAgICAgICByZXR1cm4gIkRPQ1giOwogICAgICBpZiAodG9rZW4uaW5jbHVkZXMoImV4Y2VsIikpCiAgICAgICAgcmV0dXJuICJYTFMiOwogICAgICBpZiAodG9rZW4uaW5jbHVkZXMoInByZXNlbnRhdGlvbiIpKQogICAgICAgIHJldHVybiAiUFBUIjsKICAgICAgY29uc3Qgc2VnbWVudHMgPSB0b2tlbi5zcGxpdCgiLyIpOwogICAgICBjb25zdCBsYXN0U2VnbWVudCA9IHNlZ21lbnRzLnBvcCgpID8/IHRva2VuOwogICAgICByZXR1cm4gbGFzdFNlZ21lbnQudG9VcHBlckNhc2UoKTsKICAgIH0KICAgIGF0dGFjaExpZmVjeWNsZUxpc3RlbmVycygpIHsKICAgICAgdGhpcy5yZWJpbmRJbnRlcmFjdGl2ZUVsZW1lbnRzKCk7CiAgICB9CiAgICBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgdGhpcy5hdHRhY2hMaWZlY3ljbGVMaXN0ZW5lcnMoKTsKICAgIH0KICAgIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoInZhbHVlIikpIHsKICAgICAgICB2b2lkIHRoaXMudmFsaWRhdGUoKTsKICAgICAgfQogICAgICB0aGlzLnJlYmluZEludGVyYWN0aXZlRWxlbWVudHMoKTsKICAgIH0KICAgIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICB0aGlzLmRldGFjaERyb3BMaXN0ZW5lcnMoKTsKICAgICAgdGhpcy52YWx1ZS5mb3JFYWNoKChmaWxlKSA9PiB0aGlzLnJlbGVhc2VQcmV2aWV3KGZpbGUpKTsKICAgICAgdGhpcy5wcmV2aWV3VXJsTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICB9CiAgICBhc3luYyBvcGVuRmlsZVNlbGVjdG9yKCkgewogICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLmlzTG9hZGluZykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7CiAgICAgIGNvbnN0IGlucHV0RmlsZSA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmZpbGUtaW5wdXQiKTsKICAgICAgaWYgKCFpbnB1dEZpbGUpIHsKICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBoYW5kbGVGb2N1cyA9ICgpID0+IHsKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgIGlmICghaW5wdXRGaWxlLmZpbGVzIHx8IGlucHV0RmlsZS5maWxlcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsIGhhbmRsZUZvY3VzKTsKICAgICAgICB9LCAzMDApOwogICAgICB9OwogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLCBoYW5kbGVGb2N1cyk7CiAgICAgIGlucHV0RmlsZS5jbGljaygpOwogICAgfQogICAgcmVtb3ZlRmlsZShmaWxlKSB7CiAgICAgIGNvbnN0IGluZGV4MiA9IHRoaXMudmFsdWUuaW5kZXhPZihmaWxlKTsKICAgICAgaWYgKGluZGV4MiA+IC0xKSB7CiAgICAgICAgdGhpcy5yZWxlYXNlUHJldmlldyhmaWxlKTsKICAgICAgICB0aGlzLnZhbHVlLnNwbGljZShpbmRleDIsIDEpOwogICAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgidmFsdWUiKTsKICAgICAgICB2b2lkIHRoaXMudmFsaWRhdGUoKTsKICAgICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgICAgfQogICAgfQogICAgY2xlYXJBbGwoKSB7CiAgICAgIGNvbnN0IGV4aXN0aW5nRmlsZXMgPSBbLi4udGhpcy52YWx1ZV07CiAgICAgIHRoaXMudmFsdWUgPSBbXTsKICAgICAgZXhpc3RpbmdGaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB0aGlzLnJlbGVhc2VQcmV2aWV3KGZpbGUpKTsKICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCJ2YWx1ZSIpOwogICAgICB2b2lkIHRoaXMudmFsaWRhdGUoKTsKICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgIHRoaXMuYnV0dG9uVGV4dCA9ICJTZWxlY3QgZmlsZXMiOwogICAgfQogICAgYXN5bmMgdXBkYXRlVmFsdWUoZXZlbnRBcmcpIHsKICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnRBcmcudGFyZ2V0OwogICAgICB0aGlzLnZhbHVlID0gQXJyYXkuZnJvbSh0YXJnZXQuZmlsZXMgPz8gW10pOwogICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgIH0KICAgIHNldFZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLnZhbHVlLmZvckVhY2goKGZpbGUpID0+IHRoaXMucmVsZWFzZVByZXZpZXcoZmlsZSkpOwogICAgICB0aGlzLnZhbHVlID0gdmFsdWUyOwogICAgICBpZiAodmFsdWUyLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLmJ1dHRvblRleHQgPSB0aGlzLm11bHRpcGxlID8gIkFkZCBtb3JlIGZpbGVzIiA6ICJSZXBsYWNlIGZpbGUiOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuYnV0dG9uVGV4dCA9ICJTZWxlY3QgZmlsZXMiOwogICAgICB9CiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgidmFsdWUiKTsKICAgICAgdm9pZCB0aGlzLnZhbGlkYXRlKCk7CiAgICB9CiAgICBnZXRWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMudmFsdWU7CiAgICB9CiAgICBhc3luYyBhZGRGaWxlcyhmaWxlcykgewogICAgICBjb25zdCBmaWxlc1RvQWRkID0gW107CiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgewogICAgICAgIGlmICh0aGlzLnZhbGlkYXRlRmlsZShmaWxlKSkgewogICAgICAgICAgZmlsZXNUb0FkZC5wdXNoKGZpbGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZmlsZXNUb0FkZC5sZW5ndGggPT09IDApIHsKICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAodGhpcy5tYXhGaWxlcyA+IDApIHsKICAgICAgICBjb25zdCB0b3RhbEZpbGVzID0gdGhpcy52YWx1ZS5sZW5ndGggKyBmaWxlc1RvQWRkLmxlbmd0aDsKICAgICAgICBpZiAodG90YWxGaWxlcyA+IHRoaXMubWF4RmlsZXMpIHsKICAgICAgICAgIGNvbnN0IGFsbG93ZWRDb3VudCA9IHRoaXMubWF4RmlsZXMgLSB0aGlzLnZhbHVlLmxlbmd0aDsKICAgICAgICAgIGlmIChhbGxvd2VkQ291bnQgPD0gMCkgewogICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID0gYE1heGltdW0gJHt0aGlzLm1heEZpbGVzfSBmaWxlcyBhbGxvd2VkYDsKICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RhdGUgPSAiaW52YWxpZCI7CiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGZpbGVzVG9BZGQuc3BsaWNlKGFsbG93ZWRDb3VudCk7CiAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID0gYE9ubHkgJHthbGxvd2VkQ291bnR9IG1vcmUgZmlsZShzKSBjYW4gYmUgYWRkZWRgOwogICAgICAgICAgdGhpcy52YWxpZGF0aW9uU3RhdGUgPSAid2FybiI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdGhpcy5tdWx0aXBsZSAmJiBmaWxlc1RvQWRkLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLnZhbHVlLmZvckVhY2goKGZpbGUpID0+IHRoaXMucmVsZWFzZVByZXZpZXcoZmlsZSkpOwogICAgICAgIHRoaXMudmFsdWUgPSBbZmlsZXNUb0FkZFswXV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy52YWx1ZS5wdXNoKC4uLmZpbGVzVG9BZGQpOwogICAgICB9CiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2UgPSAiIjsKICAgICAgdGhpcy52YWxpZGF0aW9uU3RhdGUgPSBudWxsOwogICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoInZhbHVlIik7CiAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGUoKTsKICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7CiAgICAgIGlmICh0aGlzLnZhbHVlLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLmJ1dHRvblRleHQgPSB0aGlzLm11bHRpcGxlID8gIkFkZCBtb3JlIGZpbGVzIiA6ICJSZXBsYWNlIGZpbGUiOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuYnV0dG9uVGV4dCA9ICJTZWxlY3QgZmlsZXMiOwogICAgICB9CiAgICB9CiAgICBhc3luYyB2YWxpZGF0ZSgpIHsKICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9ICIiOwogICAgICBpZiAodGhpcy5yZXF1aXJlZCAmJiB0aGlzLnZhbHVlLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHRoaXMudmFsaWRhdGlvblN0YXRlID0gImludmFsaWQiOwogICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2UgPSAiUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCBvbmUgZmlsZSI7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiB0aGlzLnZhbHVlKSB7CiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlRmlsZShmaWxlKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLnZhbGlkYXRpb25TdGF0ZSA9IHRoaXMudmFsdWUubGVuZ3RoID4gMCA/ICJ2YWxpZCIgOiBudWxsOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMjcoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNJbnB1dEZpbGV1cGxvYWQyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9pYmFudG9vbHNANC41LjEvbm9kZV9tb2R1bGVzL2liYW50b29scy9qc25leHQvaWJhbnRvb2xzLmpzCmZ1bmN0aW9uIGlzVmFsaWRJQkFOKGliYW4sIHZhbGlkYXRpb25PcHRpb25zKSB7CiAgaWYgKHZhbGlkYXRpb25PcHRpb25zID09PSB2b2lkIDApIHsKICAgIHZhbGlkYXRpb25PcHRpb25zID0geyBhbGxvd1FSSUJBTjogdHJ1ZSB9OwogIH0KICBpZiAoaWJhbiA9PT0gdm9pZCAwIHx8IGliYW4gPT09IG51bGwpCiAgICByZXR1cm4gZmFsc2U7CiAgdmFyIHJlZyA9IG5ldyBSZWdFeHAoIl5bMC05XXsyfSQiLCAiIik7CiAgdmFyIGNvdW50cnlDb2RlID0gaWJhbi5zbGljZSgwLCAyKTsKICB2YXIgc3BlYyA9IGNvdW50cnlTcGVjc1tjb3VudHJ5Q29kZV07CiAgaWYgKHNwZWMgPT09IHZvaWQgMCB8fCBzcGVjLmJiYW5fcmVnZXhwID09PSB2b2lkIDAgfHwgc3BlYy5iYmFuX3JlZ2V4cCA9PT0gbnVsbCB8fCBzcGVjLmNoYXJzID09PSB2b2lkIDApCiAgICByZXR1cm4gZmFsc2U7CiAgcmV0dXJuIHNwZWMuY2hhcnMgPT09IGliYW4ubGVuZ3RoICYmIHJlZy50ZXN0KGliYW4uc2xpY2UoMiwgNCkpICYmIGlzVmFsaWRCQkFOKGliYW4uc2xpY2UoNCksIGNvdW50cnlDb2RlKSAmJiBpc1ZhbGlkSUJBTkNoZWNrc3VtKGliYW4pICYmICh2YWxpZGF0aW9uT3B0aW9ucy5hbGxvd1FSSUJBTiB8fCAhaXNRUklCQU4oaWJhbikpOwp9CnZhciBWYWxpZGF0aW9uRXJyb3JzSUJBTjsKKGZ1bmN0aW9uKFZhbGlkYXRpb25FcnJvcnNJQkFOMikgewogIFZhbGlkYXRpb25FcnJvcnNJQkFOMltWYWxpZGF0aW9uRXJyb3JzSUJBTjJbIk5vSUJBTlByb3ZpZGVkIl0gPSAwXSA9ICJOb0lCQU5Qcm92aWRlZCI7CiAgVmFsaWRhdGlvbkVycm9yc0lCQU4yW1ZhbGlkYXRpb25FcnJvcnNJQkFOMlsiTm9JQkFOQ291bnRyeSJdID0gMV0gPSAiTm9JQkFOQ291bnRyeSI7CiAgVmFsaWRhdGlvbkVycm9yc0lCQU4yW1ZhbGlkYXRpb25FcnJvcnNJQkFOMlsiV3JvbmdCQkFOTGVuZ3RoIl0gPSAyXSA9ICJXcm9uZ0JCQU5MZW5ndGgiOwogIFZhbGlkYXRpb25FcnJvcnNJQkFOMltWYWxpZGF0aW9uRXJyb3JzSUJBTjJbIldyb25nQkJBTkZvcm1hdCJdID0gM10gPSAiV3JvbmdCQkFORm9ybWF0IjsKICBWYWxpZGF0aW9uRXJyb3JzSUJBTjJbVmFsaWRhdGlvbkVycm9yc0lCQU4yWyJDaGVja3N1bU5vdE51bWJlciJdID0gNF0gPSAiQ2hlY2tzdW1Ob3ROdW1iZXIiOwogIFZhbGlkYXRpb25FcnJvcnNJQkFOMltWYWxpZGF0aW9uRXJyb3JzSUJBTjJbIldyb25nSUJBTkNoZWNrc3VtIl0gPSA1XSA9ICJXcm9uZ0lCQU5DaGVja3N1bSI7CiAgVmFsaWRhdGlvbkVycm9yc0lCQU4yW1ZhbGlkYXRpb25FcnJvcnNJQkFOMlsiV3JvbmdBY2NvdW50QmFua0JyYW5jaENoZWNrc3VtIl0gPSA2XSA9ICJXcm9uZ0FjY291bnRCYW5rQnJhbmNoQ2hlY2tzdW0iOwogIFZhbGlkYXRpb25FcnJvcnNJQkFOMltWYWxpZGF0aW9uRXJyb3JzSUJBTjJbIlFSSUJBTk5vdEFsbG93ZWQiXSA9IDddID0gIlFSSUJBTk5vdEFsbG93ZWQiOwp9KShWYWxpZGF0aW9uRXJyb3JzSUJBTiB8fCAoVmFsaWRhdGlvbkVycm9yc0lCQU4gPSB7fSkpOwpmdW5jdGlvbiB2YWxpZGF0ZUlCQU4oaWJhbiwgdmFsaWRhdGlvbk9wdGlvbnMpIHsKICBpZiAodmFsaWRhdGlvbk9wdGlvbnMgPT09IHZvaWQgMCkgewogICAgdmFsaWRhdGlvbk9wdGlvbnMgPSB7IGFsbG93UVJJQkFOOiB0cnVlIH07CiAgfQogIHZhciByZXN1bHQgPSB7IGVycm9yQ29kZXM6IFtdLCB2YWxpZDogdHJ1ZSB9OwogIGlmIChpYmFuICE9PSB2b2lkIDAgJiYgaWJhbiAhPT0gbnVsbCAmJiBpYmFuICE9PSAiIikgewogICAgdmFyIHNwZWMgPSBjb3VudHJ5U3BlY3NbaWJhbi5zbGljZSgwLCAyKV07CiAgICBpZiAoIXNwZWMgfHwgIShzcGVjLmJiYW5fcmVnZXhwIHx8IHNwZWMuY2hhcnMpKSB7CiAgICAgIHJlc3VsdC52YWxpZCA9IGZhbHNlOwogICAgICByZXN1bHQuZXJyb3JDb2Rlcy5wdXNoKFZhbGlkYXRpb25FcnJvcnNJQkFOLk5vSUJBTkNvdW50cnkpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgaWYgKHNwZWMgJiYgc3BlYy5jaGFycyAmJiBzcGVjLmNoYXJzICE9PSBpYmFuLmxlbmd0aCkgewogICAgICByZXN1bHQudmFsaWQgPSBmYWxzZTsKICAgICAgcmVzdWx0LmVycm9yQ29kZXMucHVzaChWYWxpZGF0aW9uRXJyb3JzSUJBTi5Xcm9uZ0JCQU5MZW5ndGgpOwogICAgfQogICAgaWYgKHNwZWMgJiYgc3BlYy5iYmFuX3JlZ2V4cCAmJiAhY2hlY2tGb3JtYXRCQkFOKGliYW4uc2xpY2UoNCksIHNwZWMuYmJhbl9yZWdleHApKSB7CiAgICAgIHJlc3VsdC52YWxpZCA9IGZhbHNlOwogICAgICByZXN1bHQuZXJyb3JDb2Rlcy5wdXNoKFZhbGlkYXRpb25FcnJvcnNJQkFOLldyb25nQkJBTkZvcm1hdCk7CiAgICB9CiAgICBpZiAoc3BlYyAmJiBzcGVjLmJiYW5fdmFsaWRhdGlvbl9mdW5jICYmICFzcGVjLmJiYW5fdmFsaWRhdGlvbl9mdW5jKGliYW4uc2xpY2UoNCkpKSB7CiAgICAgIHJlc3VsdC52YWxpZCA9IGZhbHNlOwogICAgICByZXN1bHQuZXJyb3JDb2Rlcy5wdXNoKFZhbGlkYXRpb25FcnJvcnNJQkFOLldyb25nQWNjb3VudEJhbmtCcmFuY2hDaGVja3N1bSk7CiAgICB9CiAgICB2YXIgcmVnID0gbmV3IFJlZ0V4cCgiXlswLTldezJ9JCIsICIiKTsKICAgIGlmICghcmVnLnRlc3QoaWJhbi5zbGljZSgyLCA0KSkpIHsKICAgICAgcmVzdWx0LnZhbGlkID0gZmFsc2U7CiAgICAgIHJlc3VsdC5lcnJvckNvZGVzLnB1c2goVmFsaWRhdGlvbkVycm9yc0lCQU4uQ2hlY2tzdW1Ob3ROdW1iZXIpOwogICAgfQogICAgaWYgKHJlc3VsdC5lcnJvckNvZGVzLmluZGV4T2YoVmFsaWRhdGlvbkVycm9yc0lCQU4uV3JvbmdCQkFORm9ybWF0KSAhPT0gLTEgfHwgIWlzVmFsaWRJQkFOQ2hlY2tzdW0oaWJhbikpIHsKICAgICAgcmVzdWx0LnZhbGlkID0gZmFsc2U7CiAgICAgIHJlc3VsdC5lcnJvckNvZGVzLnB1c2goVmFsaWRhdGlvbkVycm9yc0lCQU4uV3JvbmdJQkFOQ2hlY2tzdW0pOwogICAgfQogICAgaWYgKCF2YWxpZGF0aW9uT3B0aW9ucy5hbGxvd1FSSUJBTiAmJiBpc1FSSUJBTihpYmFuKSkgewogICAgICByZXN1bHQudmFsaWQgPSBmYWxzZTsKICAgICAgcmVzdWx0LmVycm9yQ29kZXMucHVzaChWYWxpZGF0aW9uRXJyb3JzSUJBTi5RUklCQU5Ob3RBbGxvd2VkKTsKICAgIH0KICB9IGVsc2UgewogICAgcmVzdWx0LnZhbGlkID0gZmFsc2U7CiAgICByZXN1bHQuZXJyb3JDb2Rlcy5wdXNoKFZhbGlkYXRpb25FcnJvcnNJQkFOLk5vSUJBTlByb3ZpZGVkKTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpmdW5jdGlvbiBpc1ZhbGlkQkJBTihiYmFuLCBjb3VudHJ5Q29kZSkgewogIGlmIChiYmFuID09PSB2b2lkIDAgfHwgYmJhbiA9PT0gbnVsbCB8fCBjb3VudHJ5Q29kZSA9PT0gdm9pZCAwIHx8IGNvdW50cnlDb2RlID09PSBudWxsKQogICAgcmV0dXJuIGZhbHNlOwogIHZhciBzcGVjID0gY291bnRyeVNwZWNzW2NvdW50cnlDb2RlXTsKICBpZiAoc3BlYyA9PT0gdm9pZCAwIHx8IHNwZWMgPT09IG51bGwgfHwgc3BlYy5iYmFuX3JlZ2V4cCA9PT0gdm9pZCAwIHx8IHNwZWMuYmJhbl9yZWdleHAgPT09IG51bGwgfHwgc3BlYy5jaGFycyA9PT0gdm9pZCAwIHx8IHNwZWMuY2hhcnMgPT09IG51bGwpCiAgICByZXR1cm4gZmFsc2U7CiAgaWYgKHNwZWMuY2hhcnMgLSA0ID09PSBiYmFuLmxlbmd0aCAmJiBjaGVja0Zvcm1hdEJCQU4oYmJhbiwgc3BlYy5iYmFuX3JlZ2V4cCkpIHsKICAgIGlmIChzcGVjLmJiYW5fdmFsaWRhdGlvbl9mdW5jKSB7CiAgICAgIHJldHVybiBzcGVjLmJiYW5fdmFsaWRhdGlvbl9mdW5jKGJiYW4ucmVwbGFjZSgvW1xzLl0rL2csICIiKSk7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGlzU0VQQUNvdW50cnkoY291bnRyeUNvZGUpIHsKICBpZiAoY291bnRyeUNvZGUgIT09IHZvaWQgMCAmJiBjb3VudHJ5Q29kZSAhPT0gbnVsbCkgewogICAgdmFyIHNwZWMgPSBjb3VudHJ5U3BlY3NbY291bnRyeUNvZGVdOwogICAgaWYgKHNwZWMgIT09IHZvaWQgMCkgewogICAgICByZXR1cm4gc3BlYy5TRVBBID8gc3BlYy5TRVBBIDogZmFsc2U7CiAgICB9CiAgfQogIHJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBpc1FSSUJBTihpYmFuKSB7CiAgaWYgKGliYW4gPT09IHZvaWQgMCB8fCBpYmFuID09PSBudWxsKQogICAgcmV0dXJuIGZhbHNlOwogIHZhciBjb3VudHJ5Q29kZSA9IGliYW4uc2xpY2UoMCwgMik7CiAgdmFyIFFSSUJBTkNvdW50cmllcyA9IFsiTEkiLCAiQ0giXTsKICBpZiAoIVFSSUJBTkNvdW50cmllcy5pbmNsdWRlcyhjb3VudHJ5Q29kZSkpCiAgICByZXR1cm4gZmFsc2U7CiAgdmFyIHJlZyA9IG5ldyBSZWdFeHAoIl4zWzAtMV17MX1bMC05XXszfSQiLCAiIik7CiAgcmV0dXJuIHJlZy50ZXN0KGliYW4uc2xpY2UoNCwgOSkpOwp9CmZ1bmN0aW9uIGNvbXBvc2VJQkFOKHBhcmFtczIpIHsKICB2YXIgZm9ybWF0ZWRfYmJhbiA9IGVsZWN0cm9uaWNGb3JtYXRJQkFOKHBhcmFtczIuYmJhbikgfHwgIiI7CiAgaWYgKHBhcmFtczIuY291bnRyeUNvZGUgPT09IG51bGwgfHwgcGFyYW1zMi5jb3VudHJ5Q29kZSA9PT0gdm9pZCAwKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgdmFyIHNwZWMgPSBjb3VudHJ5U3BlY3NbcGFyYW1zMi5jb3VudHJ5Q29kZV07CiAgaWYgKGZvcm1hdGVkX2JiYW4gIT09ICIiICYmIHNwZWMgIT09IHZvaWQgMCAmJiBzcGVjLmNoYXJzICYmIHNwZWMuY2hhcnMgIT09IG51bGwgJiYgc3BlYy5jaGFycyA9PT0gZm9ybWF0ZWRfYmJhbi5sZW5ndGggKyA0ICYmIHNwZWMuYmJhbl9yZWdleHAgJiYgc3BlYy5iYmFuX3JlZ2V4cCAhPT0gbnVsbCAmJiBjaGVja0Zvcm1hdEJCQU4oZm9ybWF0ZWRfYmJhbiwgc3BlYy5iYmFuX3JlZ2V4cCkpIHsKICAgIHZhciBjaGVja3NvbSA9IG1vZDk3MTBJYmFuKHBhcmFtczIuY291bnRyeUNvZGUgKyAiMDAiICsgZm9ybWF0ZWRfYmJhbik7CiAgICByZXR1cm4gcGFyYW1zMi5jb3VudHJ5Q29kZSArICgiMCIgKyAoOTggLSBjaGVja3NvbSkpLnNsaWNlKC0yKSArIGZvcm1hdGVkX2JiYW47CiAgfQogIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIGV4dHJhY3RJQkFOKGliYW4pIHsKICB2YXIgcmVzdWx0ID0ge307CiAgdmFyIGVGb3JtYXRJQkFOID0gZWxlY3Ryb25pY0Zvcm1hdElCQU4oaWJhbik7CiAgcmVzdWx0LmliYW4gPSBlRm9ybWF0SUJBTiB8fCBpYmFuOwogIGlmICghIWVGb3JtYXRJQkFOICYmIGlzVmFsaWRJQkFOKGVGb3JtYXRJQkFOKSkgewogICAgcmVzdWx0LmJiYW4gPSBlRm9ybWF0SUJBTi5zbGljZSg0KTsKICAgIHJlc3VsdC5jb3VudHJ5Q29kZSA9IGVGb3JtYXRJQkFOLnNsaWNlKDAsIDIpOwogICAgcmVzdWx0LnZhbGlkID0gdHJ1ZTsKICAgIHZhciBzcGVjID0gY291bnRyeVNwZWNzW3Jlc3VsdC5jb3VudHJ5Q29kZV07CiAgICBpZiAoc3BlYy5hY2NvdW50X2luZGVudGlmaWVyKSB7CiAgICAgIHZhciBhYyA9IHNwZWMuYWNjb3VudF9pbmRlbnRpZmllci5zcGxpdCgiLSIpOwogICAgICB2YXIgc3RhcnRpbmcgPSBwYXJzZUludChhY1swXSk7CiAgICAgIHZhciBlbmRpbmcgPSBwYXJzZUludChhY1sxXSk7CiAgICAgIHJlc3VsdC5hY2NvdW50TnVtYmVyID0gcmVzdWx0LmliYW4uc2xpY2Uoc3RhcnRpbmcsIGVuZGluZyArIDEpOwogICAgfQogICAgaWYgKHNwZWMuYmFua19pZGVudGlmaWVyKSB7CiAgICAgIHZhciBhYyA9IHNwZWMuYmFua19pZGVudGlmaWVyLnNwbGl0KCItIik7CiAgICAgIHZhciBzdGFydGluZyA9IHBhcnNlSW50KGFjWzBdKTsKICAgICAgdmFyIGVuZGluZyA9IHBhcnNlSW50KGFjWzFdKTsKICAgICAgcmVzdWx0LmJhbmtJZGVudGlmaWVyID0gcmVzdWx0LmJiYW4uc2xpY2Uoc3RhcnRpbmcsIGVuZGluZyArIDEpOwogICAgfQogICAgaWYgKHNwZWMuYnJhbmNoX2luZGVudGlmaWVyKSB7CiAgICAgIHZhciBhYyA9IHNwZWMuYnJhbmNoX2luZGVudGlmaWVyLnNwbGl0KCItIik7CiAgICAgIHZhciBzdGFydGluZyA9IHBhcnNlSW50KGFjWzBdKTsKICAgICAgdmFyIGVuZGluZyA9IHBhcnNlSW50KGFjWzFdKTsKICAgICAgcmVzdWx0LmJyYW5jaElkZW50aWZpZXIgPSByZXN1bHQuYmJhbi5zbGljZShzdGFydGluZywgZW5kaW5nICsgMSk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHJlc3VsdC52YWxpZCA9IGZhbHNlOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CmZ1bmN0aW9uIGNoZWNrRm9ybWF0QkJBTihiYmFuLCBiZm9ybWF0KSB7CiAgdmFyIHJlZyA9IG5ldyBSZWdFeHAoYmZvcm1hdCwgIiIpOwogIHJldHVybiByZWcudGVzdChiYmFuKTsKfQpmdW5jdGlvbiBlbGVjdHJvbmljRm9ybWF0SUJBTihpYmFuKSB7CiAgaWYgKHR5cGVvZiBpYmFuICE9PSAic3RyaW5nIikgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiBpYmFuLnJlcGxhY2UoL1stXCBdL2csICIiKS50b1VwcGVyQ2FzZSgpOwp9CmZ1bmN0aW9uIGZyaWVuZGx5Rm9ybWF0SUJBTihpYmFuLCBzZXBhcmF0b3IpIHsKICBpZiAodHlwZW9mIGliYW4gIT09ICJzdHJpbmciKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgaWYgKHNlcGFyYXRvciA9PT0gdm9pZCAwIHx8IHNlcGFyYXRvciA9PT0gbnVsbCkgewogICAgc2VwYXJhdG9yID0gIiAiOwogIH0KICB2YXIgZWxlY3Ryb25pY19pYmFuID0gZWxlY3Ryb25pY0Zvcm1hdElCQU4oaWJhbik7CiAgaWYgKGVsZWN0cm9uaWNfaWJhbiA9PT0gbnVsbCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiBlbGVjdHJvbmljX2liYW4ucmVwbGFjZSgvKC57NH0pKD8hJCkvZywgIiQxIiArIHNlcGFyYXRvcik7Cn0KZnVuY3Rpb24gaXNWYWxpZElCQU5DaGVja3N1bShpYmFuKSB7CiAgdmFyIGNvdW50cnlDb2RlID0gaWJhbi5zbGljZSgwLCAyKTsKICB2YXIgcHJvdmlkZWRDaGVja3N1bSA9IHBhcnNlSW50KGliYW4uc2xpY2UoMiwgNCksIDEwKTsKICB2YXIgYmJhbiA9IGliYW4uc2xpY2UoNCk7CiAgdmFyIHZhbGlkYXRpb25TdHJpbmcgPSByZXBsYWNlQ2hhcmF0ZXJXaXRoQ29kZSgiIi5jb25jYXQoYmJhbikuY29uY2F0KGNvdW50cnlDb2RlLCAiMDAiKSk7CiAgdmFyIHJlc3QgPSBtb2Q5NzEwKHZhbGlkYXRpb25TdHJpbmcpOwogIHJldHVybiA5OCAtIHJlc3QgPT09IHByb3ZpZGVkQ2hlY2tzdW07Cn0KZnVuY3Rpb24gcmVwbGFjZUNoYXJhdGVyV2l0aENvZGUoc3RyKSB7CiAgcmV0dXJuIHN0ci5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKGMxMSkgewogICAgdmFyIGNvZGU0ID0gYzExLmNoYXJDb2RlQXQoMCk7CiAgICByZXR1cm4gY29kZTQgPj0gNjUgPyAoY29kZTQgLSA1NSkudG9TdHJpbmcoKSA6IGMxMTsKICB9KS5qb2luKCIiKTsKfQpmdW5jdGlvbiBtb2Q5NzEwSWJhbihpYmFuKSB7CiAgcmV0dXJuIG1vZDk3MTAocmVwbGFjZUNoYXJhdGVyV2l0aENvZGUoaWJhbi5zbGljZSg0KSArIGliYW4uc2xpY2UoMCwgNCkpKTsKfQpmdW5jdGlvbiBnZXRDb3VudHJ5U3BlY2lmaWNhdGlvbnMoKSB7CiAgdmFyIGNvdW50eU1hcCA9IHt9OwogIGZvciAodmFyIGNvdW50eUNvZGUgaW4gY291bnRyeVNwZWNzKSB7CiAgICB2YXIgY291bnR5ID0gY291bnRyeVNwZWNzW2NvdW50eUNvZGVdOwogICAgY291bnR5TWFwW2NvdW50eUNvZGVdID0gewogICAgICBjaGFyczogY291bnR5LmNoYXJzIHx8IG51bGwsCiAgICAgIGJiYW5fcmVnZXhwOiBjb3VudHkuYmJhbl9yZWdleHAgfHwgbnVsbCwKICAgICAgSUJBTlJlZ2lzdHJ5OiBjb3VudHkuSUJBTlJlZ2lzdHJ5IHx8IGZhbHNlLAogICAgICBTRVBBOiBjb3VudHkuU0VQQSB8fCBmYWxzZQogICAgfTsKICB9CiAgcmV0dXJuIGNvdW50eU1hcDsKfQpmdW5jdGlvbiBpc1ZhbGlkQklDKGJpYykgewogIGlmICghYmljKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHZhciByZWcgPSBuZXcgUmVnRXhwKCJeW2EtekEtWl17Nn1bYS16QS1aMC05XXsyfShbYS16QS1aMC05XXszfSk/JCIsICIiKTsKICB2YXIgc3BlYyA9IGNvdW50cnlTcGVjc1tiaWMudG9VcHBlckNhc2UoKS5zbGljZSg0LCA2KV07CiAgcmV0dXJuIHJlZy50ZXN0KGJpYykgJiYgc3BlYyAhPT0gdm9pZCAwOwp9CnZhciBWYWxpZGF0aW9uRXJyb3JzQklDOwooZnVuY3Rpb24oVmFsaWRhdGlvbkVycm9yc0JJQzIpIHsKICBWYWxpZGF0aW9uRXJyb3JzQklDMltWYWxpZGF0aW9uRXJyb3JzQklDMlsiTm9CSUNQcm92aWRlZCJdID0gMF0gPSAiTm9CSUNQcm92aWRlZCI7CiAgVmFsaWRhdGlvbkVycm9yc0JJQzJbVmFsaWRhdGlvbkVycm9yc0JJQzJbIk5vQklDQ291bnRyeSJdID0gMV0gPSAiTm9CSUNDb3VudHJ5IjsKICBWYWxpZGF0aW9uRXJyb3JzQklDMltWYWxpZGF0aW9uRXJyb3JzQklDMlsiV3JvbmdCSUNGb3JtYXQiXSA9IDJdID0gIldyb25nQklDRm9ybWF0IjsKfSkoVmFsaWRhdGlvbkVycm9yc0JJQyB8fCAoVmFsaWRhdGlvbkVycm9yc0JJQyA9IHt9KSk7CmZ1bmN0aW9uIHZhbGlkYXRlQklDKGJpYykgewogIHZhciByZXN1bHQgPSB7IGVycm9yQ29kZXM6IFtdLCB2YWxpZDogdHJ1ZSB9OwogIGlmIChiaWMgIT09IHZvaWQgMCAmJiBiaWMgIT09IG51bGwgJiYgYmljICE9PSAiIikgewogICAgdmFyIHNwZWMgPSBjb3VudHJ5U3BlY3NbYmljLnRvVXBwZXJDYXNlKCkuc2xpY2UoNCwgNildOwogICAgaWYgKHNwZWMgPT09IHZvaWQgMCkgewogICAgICByZXN1bHQudmFsaWQgPSBmYWxzZTsKICAgICAgcmVzdWx0LmVycm9yQ29kZXMucHVzaChWYWxpZGF0aW9uRXJyb3JzQklDLk5vQklDQ291bnRyeSk7CiAgICB9IGVsc2UgewogICAgICB2YXIgcmVnID0gbmV3IFJlZ0V4cCgiXlthLXpBLVpdezZ9W2EtekEtWjAtOV17Mn0oW2EtekEtWjAtOV17M30pPyQiLCAiIik7CiAgICAgIGlmICghcmVnLnRlc3QoYmljKSkgewogICAgICAgIHJlc3VsdC52YWxpZCA9IGZhbHNlOwogICAgICAgIHJlc3VsdC5lcnJvckNvZGVzLnB1c2goVmFsaWRhdGlvbkVycm9yc0JJQy5Xcm9uZ0JJQ0Zvcm1hdCk7CiAgICAgIH0KICAgIH0KICB9IGVsc2UgewogICAgcmVzdWx0LnZhbGlkID0gZmFsc2U7CiAgICByZXN1bHQuZXJyb3JDb2Rlcy5wdXNoKFZhbGlkYXRpb25FcnJvcnNCSUMuTm9CSUNQcm92aWRlZCk7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gZXh0cmFjdEJJQyhpbnB1dEJpYykgewogIHZhciByZXN1bHQgPSB7fTsKICB2YXIgYmljID0gaW5wdXRCaWMudG9VcHBlckNhc2UoKTsKICBpZiAoaXNWYWxpZEJJQyhiaWMpKSB7CiAgICByZXN1bHQuYmFua0NvZGUgPSBiaWMuc2xpY2UoMCwgNCk7CiAgICByZXN1bHQuY291bnRyeUNvZGUgPSBiaWMuc2xpY2UoNCwgNik7CiAgICByZXN1bHQubG9jYXRpb25Db2RlID0gYmljLnNsaWNlKDYsIDgpOwogICAgcmVzdWx0LnRlc3RCSUMgPSByZXN1bHQubG9jYXRpb25Db2RlWzFdID09PSAiMCIgPyB0cnVlIDogZmFsc2U7CiAgICByZXN1bHQuYnJhbmNoQ29kZSA9IGJpYy5sZW5ndGggPiA4ID8gYmljLnNsaWNlKDgpIDogbnVsbDsKICAgIHJlc3VsdC52YWxpZCA9IHRydWU7CiAgfSBlbHNlIHsKICAgIHJlc3VsdC52YWxpZCA9IGZhbHNlOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CnZhciBjaGVja05vcndheUJCQU4gPSBmdW5jdGlvbihiYmFuKSB7CiAgdmFyIHdlaWdodHMgPSBbNSwgNCwgMywgMiwgNywgNiwgNSwgNCwgMywgMl07CiAgdmFyIGJiYW5XaXRob3V0U3BhY2VzQW5kUGVyaW9kcyA9IGJiYW4ucmVwbGFjZSgvW1xzLl0rL2csICIiKTsKICB2YXIgY29udHJvbERpZ2l0ID0gcGFyc2VJbnQoYmJhbldpdGhvdXRTcGFjZXNBbmRQZXJpb2RzLmNoYXJBdCgxMCksIDEwKTsKICB2YXIgYmJhbldpdGhvdXRDb250cm9sRGlnaXQgPSBiYmFuV2l0aG91dFNwYWNlc0FuZFBlcmlvZHMuc3Vic3RyaW5nKDAsIDEwKTsKICB2YXIgc3VtID0gMDsKICBmb3IgKHZhciBpbmRleDIgPSAwOyBpbmRleDIgPCAxMDsgaW5kZXgyKyspIHsKICAgIHN1bSArPSBwYXJzZUludChiYmFuV2l0aG91dENvbnRyb2xEaWdpdC5jaGFyQXQoaW5kZXgyKSwgMTApICogd2VpZ2h0c1tpbmRleDJdOwogIH0KICB2YXIgcmVtYWluZGVyID0gc3VtICUgMTE7CiAgcmV0dXJuIGNvbnRyb2xEaWdpdCA9PT0gKHJlbWFpbmRlciA9PT0gMCA/IDAgOiAxMSAtIHJlbWFpbmRlcik7Cn07CnZhciBjaGVja0JlbGdpYW5CQkFOID0gZnVuY3Rpb24oYmJhbikgewogIHZhciBzdHJpcHBlZCA9IGJiYW4ucmVwbGFjZSgvW1xzLl0rL2csICIiKTsKICB2YXIgY2hlY2tpbmdQYXJ0ID0gcGFyc2VJbnQoc3RyaXBwZWQuc3Vic3RyaW5nKDAsIHN0cmlwcGVkLmxlbmd0aCAtIDIpLCAxMCk7CiAgdmFyIGNoZWNrc3VtID0gcGFyc2VJbnQoc3RyaXBwZWQuc3Vic3RyaW5nKHN0cmlwcGVkLmxlbmd0aCAtIDIsIHN0cmlwcGVkLmxlbmd0aCksIDEwKTsKICB2YXIgcmVtYWluZGVyID0gY2hlY2tpbmdQYXJ0ICUgOTcgPT09IDAgPyA5NyA6IGNoZWNraW5nUGFydCAlIDk3OwogIHJldHVybiByZW1haW5kZXIgPT09IGNoZWNrc3VtOwp9Owp2YXIgbW9kOTcxMCA9IGZ1bmN0aW9uKHZhbGlkYXRpb25TdHJpbmcpIHsKICB3aGlsZSAodmFsaWRhdGlvblN0cmluZy5sZW5ndGggPiAyKSB7CiAgICB2YXIgcGFydCA9IHZhbGlkYXRpb25TdHJpbmcuc2xpY2UoMCwgNik7CiAgICB2YXIgcGFydEludCA9IHBhcnNlSW50KHBhcnQsIDEwKTsKICAgIGlmIChpc05hTihwYXJ0SW50KSkgewogICAgICByZXR1cm4gTmFOOwogICAgfQogICAgdmFsaWRhdGlvblN0cmluZyA9IHBhcnRJbnQgJSA5NyArIHZhbGlkYXRpb25TdHJpbmcuc2xpY2UocGFydC5sZW5ndGgpOwogIH0KICByZXR1cm4gcGFyc2VJbnQodmFsaWRhdGlvblN0cmluZywgMTApICUgOTc7Cn07CnZhciBjaGVja01vZDk3MTBCQkFOID0gZnVuY3Rpb24oYmJhbikgewogIHZhciBzdHJpcHBlZCA9IGJiYW4ucmVwbGFjZSgvW1xzLl0rL2csICIiKTsKICB2YXIgcmVtaW5kZXIgPSBtb2Q5NzEwKHN0cmlwcGVkKTsKICByZXR1cm4gcmVtaW5kZXIgPT09IDE7Cn07CnZhciBjaGVja1BvbGFuZEJCQU4gPSBmdW5jdGlvbihiYmFuKSB7CiAgdmFyIHdlaWdodHMgPSBbMywgOSwgNywgMSwgMywgOSwgN107CiAgdmFyIGNvbnRyb2xEaWdpdCA9IHBhcnNlSW50KGJiYW4uY2hhckF0KDcpLCAxMCk7CiAgdmFyIHRvQ2hlY2sgPSBiYmFuLnN1YnN0cmluZygwLCA3KTsKICB2YXIgc3VtID0gMDsKICBmb3IgKHZhciBpbmRleDIgPSAwOyBpbmRleDIgPCA3OyBpbmRleDIrKykgewogICAgc3VtICs9IHBhcnNlSW50KHRvQ2hlY2suY2hhckF0KGluZGV4MiksIDEwKSAqIHdlaWdodHNbaW5kZXgyXTsKICB9CiAgdmFyIHJlbWFpbmRlciA9IHN1bSAlIDEwOwogIHJldHVybiBjb250cm9sRGlnaXQgPT09IChyZW1haW5kZXIgPT09IDAgPyAwIDogMTAgLSByZW1haW5kZXIpOwp9Owp2YXIgY2hlY2tTcGFpbkJCQU4gPSBmdW5jdGlvbihiYmFuKSB7CiAgdmFyIHdlaWdodHNCYW5rQnJhbmNoID0gWzQsIDgsIDUsIDEwLCA5LCA3LCAzLCA2XTsKICB2YXIgd2VpZ2h0c0FjY291bnQgPSBbMSwgMiwgNCwgOCwgNSwgMTAsIDksIDcsIDMsIDZdOwogIHZhciBjb250cm9sQmFua0JyYW5jaCA9IHBhcnNlSW50KGJiYW4uY2hhckF0KDgpLCAxMCk7CiAgdmFyIGNvbnRyb2xBY2NvdW50ID0gcGFyc2VJbnQoYmJhbi5jaGFyQXQoOSksIDEwKTsKICB2YXIgYmFua0JyYW5jaCA9IGJiYW4uc3Vic3RyaW5nKDAsIDgpOwogIHZhciBhY2NvdW50ID0gYmJhbi5zdWJzdHJpbmcoMTAsIDIwKTsKICB2YXIgc3VtID0gMDsKICBmb3IgKHZhciBpbmRleDIgPSAwOyBpbmRleDIgPCA4OyBpbmRleDIrKykgewogICAgc3VtICs9IHBhcnNlSW50KGJhbmtCcmFuY2guY2hhckF0KGluZGV4MiksIDEwKSAqIHdlaWdodHNCYW5rQnJhbmNoW2luZGV4Ml07CiAgfQogIHZhciByZW1haW5kZXIgPSBzdW0gJSAxMTsKICBpZiAoY29udHJvbEJhbmtCcmFuY2ggIT09IChyZW1haW5kZXIgPT09IDAgPyAwIDogcmVtYWluZGVyID09PSAxID8gMSA6IDExIC0gcmVtYWluZGVyKSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBzdW0gPSAwOwogIGZvciAodmFyIGluZGV4MiA9IDA7IGluZGV4MiA8IDEwOyBpbmRleDIrKykgewogICAgc3VtICs9IHBhcnNlSW50KGFjY291bnQuY2hhckF0KGluZGV4MiksIDEwKSAqIHdlaWdodHNBY2NvdW50W2luZGV4Ml07CiAgfQogIHJlbWFpbmRlciA9IHN1bSAlIDExOwogIHJldHVybiBjb250cm9sQWNjb3VudCA9PT0gKHJlbWFpbmRlciA9PT0gMCA/IDAgOiByZW1haW5kZXIgPT09IDEgPyAxIDogMTEgLSByZW1haW5kZXIpOwp9Owp2YXIgY2hlY2tNb2QxMTEwID0gZnVuY3Rpb24odG9DaGVjaywgY29udHJvbCkgewogIHZhciBuciA9IDEwOwogIGZvciAodmFyIGluZGV4MiA9IDA7IGluZGV4MiA8IHRvQ2hlY2subGVuZ3RoOyBpbmRleDIrKykgewogICAgbnIgKz0gcGFyc2VJbnQodG9DaGVjay5jaGFyQXQoaW5kZXgyKSwgMTApOwogICAgaWYgKG5yICUgMTAgIT09IDApIHsKICAgICAgbnIgPSBuciAlIDEwOwogICAgfQogICAgbnIgPSBuciAqIDI7CiAgICBuciA9IG5yICUgMTE7CiAgfQogIHJldHVybiBjb250cm9sID09PSAoMTEgLSBuciA9PT0gMTAgPyAwIDogMTEgLSBucik7Cn07CnZhciBjaGVja0Nyb2F0aWFuQkJBTiA9IGZ1bmN0aW9uKGJiYW4pIHsKICB2YXIgY29udHJvbEJhbmtCcmFuY2ggPSBwYXJzZUludChiYmFuLmNoYXJBdCg2KSwgMTApOwogIHZhciBjb250cm9sQWNjb3VudCA9IHBhcnNlSW50KGJiYW4uY2hhckF0KDE2KSwgMTApOwogIHZhciBiYW5rQnJhbmNoID0gYmJhbi5zdWJzdHJpbmcoMCwgNik7CiAgdmFyIGFjY291bnQgPSBiYmFuLnN1YnN0cmluZyg3LCAxNik7CiAgcmV0dXJuIGNoZWNrTW9kMTExMChiYW5rQnJhbmNoLCBjb250cm9sQmFua0JyYW5jaCkgJiYgY2hlY2tNb2QxMTEwKGFjY291bnQsIGNvbnRyb2xBY2NvdW50KTsKfTsKdmFyIGNoZWNrQ3plY2hBbmRTbG92YWtCQkFOID0gZnVuY3Rpb24oYmJhbikgewogIHZhciB3ZWlnaHRzUHJlZml4ID0gWzEwLCA1LCA4LCA0LCAyLCAxXTsKICB2YXIgd2VpZ2h0c1N1ZmZpeCA9IFs2LCAzLCA3LCA5LCAxMCwgNSwgOCwgNCwgMiwgMV07CiAgdmFyIGNvbnRyb2xQcmVmaXggPSBwYXJzZUludChiYmFuLmNoYXJBdCg5KSwgMTApOwogIHZhciBjb250cm9sU3VmZml4ID0gcGFyc2VJbnQoYmJhbi5jaGFyQXQoMTkpLCAxMCk7CiAgdmFyIHByZWZpeDQgPSBiYmFuLnN1YnN0cmluZyg0LCA5KTsKICB2YXIgc3VmZml4ID0gYmJhbi5zdWJzdHJpbmcoMTAsIDE5KTsKICB2YXIgc3VtID0gMDsKICBmb3IgKHZhciBpbmRleDIgPSAwOyBpbmRleDIgPCBwcmVmaXg0Lmxlbmd0aDsgaW5kZXgyKyspIHsKICAgIHN1bSArPSBwYXJzZUludChwcmVmaXg0LmNoYXJBdChpbmRleDIpLCAxMCkgKiB3ZWlnaHRzUHJlZml4W2luZGV4Ml07CiAgfQogIHZhciByZW1haW5kZXIgPSBzdW0gJSAxMTsKICBpZiAoY29udHJvbFByZWZpeCAhPT0gKHJlbWFpbmRlciA9PT0gMCA/IDAgOiByZW1haW5kZXIgPT09IDEgPyAxIDogMTEgLSByZW1haW5kZXIpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHN1bSA9IDA7CiAgZm9yICh2YXIgaW5kZXgyID0gMDsgaW5kZXgyIDwgc3VmZml4Lmxlbmd0aDsgaW5kZXgyKyspIHsKICAgIHN1bSArPSBwYXJzZUludChzdWZmaXguY2hhckF0KGluZGV4MiksIDEwKSAqIHdlaWdodHNTdWZmaXhbaW5kZXgyXTsKICB9CiAgcmVtYWluZGVyID0gc3VtICUgMTE7CiAgcmV0dXJuIGNvbnRyb2xTdWZmaXggPT09IChyZW1haW5kZXIgPT09IDAgPyAwIDogcmVtYWluZGVyID09PSAxID8gMSA6IDExIC0gcmVtYWluZGVyKTsKfTsKdmFyIGNoZWNrRXN0b25pYW5CQkFOID0gZnVuY3Rpb24oYmJhbikgewogIHZhciB3ZWlnaHRzID0gWzcsIDEsIDMsIDcsIDEsIDMsIDcsIDEsIDMsIDcsIDEsIDMsIDddOwogIHZhciBjb250cm9sRGlnaXQgPSBwYXJzZUludChiYmFuLmNoYXJBdCgxNSksIDEwKTsKICB2YXIgdG9DaGVjayA9IGJiYW4uc3Vic3RyaW5nKDIsIDE1KTsKICB2YXIgc3VtID0gMDsKICBmb3IgKHZhciBpbmRleDIgPSAwOyBpbmRleDIgPCB0b0NoZWNrLmxlbmd0aDsgaW5kZXgyKyspIHsKICAgIHN1bSArPSBwYXJzZUludCh0b0NoZWNrLmNoYXJBdChpbmRleDIpLCAxMCkgKiB3ZWlnaHRzW2luZGV4Ml07CiAgfQogIHZhciByZW1haW5kZXIgPSBzdW0gJSAxMDsKICByZXR1cm4gY29udHJvbERpZ2l0ID09PSAocmVtYWluZGVyID09PSAwID8gMCA6IDEwIC0gcmVtYWluZGVyKTsKfTsKdmFyIGNoZWNrRnJlbmNoQkJBTiA9IGZ1bmN0aW9uKGJiYW4pIHsKICB2YXIgc3RyaXBwZWQgPSBiYmFuLnJlcGxhY2UoL1tccy5dKy9nLCAiIik7CiAgdmFyIG5vcm1hbGl6ZWQgPSBBcnJheS5mcm9tKHN0cmlwcGVkKTsKICBmb3IgKHZhciBpbmRleDIgPSAwOyBpbmRleDIgPCBzdHJpcHBlZC5sZW5ndGg7IGluZGV4MisrKSB7CiAgICB2YXIgYzExID0gbm9ybWFsaXplZFtpbmRleDJdLmNoYXJDb2RlQXQoMCk7CiAgICBpZiAoYzExID49IDY1KSB7CiAgICAgIHN3aXRjaCAoYzExKSB7CiAgICAgICAgY2FzZSA2NToKICAgICAgICBjYXNlIDc0OgogICAgICAgICAgbm9ybWFsaXplZFtpbmRleDJdID0gIjEiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA2NjoKICAgICAgICBjYXNlIDc1OgogICAgICAgIGNhc2UgODM6CiAgICAgICAgICBub3JtYWxpemVkW2luZGV4Ml0gPSAiMiI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDY3OgogICAgICAgIGNhc2UgNzY6CiAgICAgICAgY2FzZSA4NDoKICAgICAgICAgIG5vcm1hbGl6ZWRbaW5kZXgyXSA9ICIzIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNjg6CiAgICAgICAgY2FzZSA3NzoKICAgICAgICBjYXNlIDg1OgogICAgICAgICAgbm9ybWFsaXplZFtpbmRleDJdID0gIjQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA2OToKICAgICAgICBjYXNlIDc4OgogICAgICAgIGNhc2UgODY6CiAgICAgICAgICBub3JtYWxpemVkW2luZGV4Ml0gPSAiNSI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDcwOgogICAgICAgIGNhc2UgNzk6CiAgICAgICAgY2FzZSA4NzoKICAgICAgICAgIG5vcm1hbGl6ZWRbaW5kZXgyXSA9ICI2IjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNzE6CiAgICAgICAgY2FzZSA4MDoKICAgICAgICBjYXNlIDg4OgogICAgICAgICAgbm9ybWFsaXplZFtpbmRleDJdID0gIjciOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA3MjoKICAgICAgICBjYXNlIDgxOgogICAgICAgIGNhc2UgODk6CiAgICAgICAgICBub3JtYWxpemVkW2luZGV4Ml0gPSAiOCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDczOgogICAgICAgIGNhc2UgODI6CiAgICAgICAgY2FzZSA5MDoKICAgICAgICAgIG5vcm1hbGl6ZWRbaW5kZXgyXSA9ICI5IjsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQogIHZhciByZW1haW5kZXIgPSBtb2Q5NzEwKG5vcm1hbGl6ZWQuam9pbigiIikpOwogIHJldHVybiByZW1haW5kZXIgPT09IDA7Cn07CnZhciBjaGVja0h1bmdhcmlhbkJCQU4gPSBmdW5jdGlvbihiYmFuKSB7CiAgdmFyIHdlaWdodHMgPSBbOSwgNywgMywgMSwgOSwgNywgMywgMSwgOSwgNywgMywgMSwgOSwgNywgM107CiAgdmFyIGNvbnRyb2xEaWdpdEJhbmtCcmFuY2ggPSBwYXJzZUludChiYmFuLmNoYXJBdCg3KSwgMTApOwogIHZhciB0b0NoZWNrQmFua0JyYW5jaCA9IGJiYW4uc3Vic3RyaW5nKDAsIDcpOwogIHZhciBzdW0gPSAwOwogIGZvciAodmFyIGluZGV4MiA9IDA7IGluZGV4MiA8IHRvQ2hlY2tCYW5rQnJhbmNoLmxlbmd0aDsgaW5kZXgyKyspIHsKICAgIHN1bSArPSBwYXJzZUludCh0b0NoZWNrQmFua0JyYW5jaC5jaGFyQXQoaW5kZXgyKSwgMTApICogd2VpZ2h0c1tpbmRleDJdOwogIH0KICB2YXIgcmVtYWluZGVyID0gc3VtICUgMTA7CiAgaWYgKGNvbnRyb2xEaWdpdEJhbmtCcmFuY2ggIT09IChyZW1haW5kZXIgPT09IDAgPyAwIDogMTAgLSByZW1haW5kZXIpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHN1bSA9IDA7CiAgaWYgKGJiYW4uZW5kc1dpdGgoIjAwMDAwMDAwIikpIHsKICAgIHZhciB0b0NoZWNrQWNjb3VudCA9IGJiYW4uc3Vic3RyaW5nKDgsIDE1KTsKICAgIHZhciBjb250cm9sRGlnaXRBY2NvdW50ID0gcGFyc2VJbnQoYmJhbi5jaGFyQXQoMTUpLCAxMCk7CiAgICBmb3IgKHZhciBpbmRleDIgPSAwOyBpbmRleDIgPCB0b0NoZWNrQWNjb3VudC5sZW5ndGg7IGluZGV4MisrKSB7CiAgICAgIHN1bSArPSBwYXJzZUludCh0b0NoZWNrQWNjb3VudC5jaGFyQXQoaW5kZXgyKSwgMTApICogd2VpZ2h0c1tpbmRleDJdOwogICAgfQogICAgdmFyIHJlbWFpbmRlcl8xID0gc3VtICUgMTA7CiAgICByZXR1cm4gY29udHJvbERpZ2l0QWNjb3VudCA9PT0gKHJlbWFpbmRlcl8xID09PSAwID8gMCA6IDEwIC0gcmVtYWluZGVyXzEpOwogIH0gZWxzZSB7CiAgICB2YXIgdG9DaGVja0FjY291bnQgPSBiYmFuLnN1YnN0cmluZyg4LCAyMyk7CiAgICB2YXIgY29udHJvbERpZ2l0QWNjb3VudCA9IHBhcnNlSW50KGJiYW4uY2hhckF0KDIzKSwgMTApOwogICAgZm9yICh2YXIgaW5kZXgyID0gMDsgaW5kZXgyIDwgdG9DaGVja0FjY291bnQubGVuZ3RoOyBpbmRleDIrKykgewogICAgICBzdW0gKz0gcGFyc2VJbnQodG9DaGVja0FjY291bnQuY2hhckF0KGluZGV4MiksIDEwKSAqIHdlaWdodHNbaW5kZXgyXTsKICAgIH0KICAgIHZhciByZW1haW5kZXJfMiA9IHN1bSAlIDEwOwogICAgcmV0dXJuIGNvbnRyb2xEaWdpdEFjY291bnQgPT09IChyZW1haW5kZXJfMiA9PT0gMCA/IDAgOiAxMCAtIHJlbWFpbmRlcl8yKTsKICB9Cn07CnZhciBzZXRDb3VudHJ5QkJBTlZhbGlkYXRpb24gPSBmdW5jdGlvbihjb3VudHJ5LCBmdW5jKSB7CiAgaWYgKHR5cGVvZiBjb3VudHJ5U3BlY3NbY291bnRyeV0gPT09ICJ1bmRlZmluZWQiKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGNvdW50cnlTcGVjc1tjb3VudHJ5XS5iYmFuX3ZhbGlkYXRpb25fZnVuYyA9IGZ1bmM7CiAgcmV0dXJuIHRydWU7Cn07CnZhciBjb3VudHJ5U3BlY3MgPSB7CiAgQUQ6IHsKICAgIGNoYXJzOiAyNCwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezh9W0EtWjAtOV17MTJ9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiNC03IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiOC0yNCIKICB9LAogIEFFOiB7CiAgICBjaGFyczogMjMsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXszfVswLTldezE2fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0yIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICI3LTIzIgogIH0sCiAgQUY6IHt9LAogIEFHOiB7fSwKICBBSToge30sCiAgQUw6IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezh9W0EtWjAtOV17MTZ9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICIzLTciLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0yIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICIxMi0yOCIKICB9LAogIEFNOiB7fSwKICBBTzogewogICAgY2hhcnM6IDI1LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjF9JCIKICB9LAogIEFROiB7fSwKICBBUjoge30sCiAgQVM6IHt9LAogIEFUOiB7IGNoYXJzOiAyMCwgYmJhbl9yZWdleHA6ICJeWzAtOV17MTZ9JCIsIElCQU5SZWdpc3RyeTogdHJ1ZSwgU0VQQTogdHJ1ZSwgYmFua19pZGVudGlmaWVyOiAiMC00IiB9LAogIEFVOiB7fSwKICBBVzoge30sCiAgQVg6IHsKICAgIGNoYXJzOiAxOCwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezE0fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlCiAgfSwKICBBWjogewogICAgY2hhcnM6IDI4LAogICAgYmJhbl9yZWdleHA6ICJeW0EtWl17NH1bQS1aMC05XXsyMH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiNC0yOCIKICB9LAogIEJBOiB7CiAgICBjaGFyczogMjAsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxNn0kIiwKICAgIGJiYW5fdmFsaWRhdGlvbl9mdW5jOiBjaGVja01vZDk3MTBCQkFOLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiMy01IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMiIKICB9LAogIEJCOiB7fSwKICBCRDoge30sCiAgQkU6IHsKICAgIGNoYXJzOiAxNiwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezEyfSQiLAogICAgYmJhbl92YWxpZGF0aW9uX2Z1bmM6IGNoZWNrQmVsZ2lhbkJCQU4sCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0yIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICIwLTE2IgogIH0sCiAgQkY6IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVowLTldezJ9WzAtOV17MjJ9JCIKICB9LAogIEJHOiB7CiAgICBjaGFyczogMjIsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXs0fVswLTldezZ9W0EtWjAtOV17OH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICI0LTciLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0zIgogIH0sCiAgQkg6IHsKICAgIGNoYXJzOiAyMiwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezR9W0EtWjAtOV17MTR9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTMiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjgtMjIiCiAgfSwKICBCSTogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjN9JCIsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICI1LTkiLAogICAgYmFua19pZGVudGlmaWVyOiAiMC00IiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICIxNC0yNyIKICB9LAogIEJKOiB7CiAgICBjaGFyczogMjgsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aMC05XXsyfVswLTldezIyfSQiCiAgfSwKICBCTDogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTB9W0EtWjAtOV17MTF9WzAtOV17Mn0kIgogIH0sCiAgQk06IHt9LAogIEJOOiB7fSwKICBCTzoge30sCiAgQlE6IHt9LAogIEJSOiB7CiAgICBjaGFyczogMjksCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyM31bQS1aXXsxfVtBLVowLTldezF9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICI4LTEyIiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtNyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMTctMjkiCiAgfSwKICBCUzoge30sCiAgQlQ6IHt9LAogIEJWOiB7fSwKICBCVzoge30sCiAgQlk6IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezR9WzAtOV17NH1bQS1aMC05XXsxNn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIKICB9LAogIEJaOiB7fSwKICBDQToge30sCiAgQ0M6IHt9LAogIENEOiB7fSwKICBDRjogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjN9JCIKICB9LAogIENHOiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyM30kIgogIH0sCiAgQ0g6IHsKICAgIGNoYXJzOiAyMSwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezV9W0EtWjAtOV17MTJ9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC00IgogIH0sCiAgQ0k6IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezF9WzAtOV17MjN9JCIKICB9LAogIENLOiB7fSwKICBDTDoge30sCiAgQ006IHsKICAgIGNoYXJzOiAyNywKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezIzfSQiCiAgfSwKICBDTjoge30sCiAgQ086IHt9LAogIENSOiB7CiAgICBjaGFyczogMjIsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxOH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiOC0yMiIKICB9LAogIENVOiB7fSwKICBDVjogeyBjaGFyczogMjUsIGJiYW5fcmVnZXhwOiAiXlswLTldezIxfSQiIH0sCiAgQ1c6IHt9LAogIENYOiB7fSwKICBDWTogewogICAgY2hhcnM6IDI4LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17OH1bQS1aMC05XXsxNn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICIzLTciLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0yIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICIxMi0yOCIKICB9LAogIENaOiB7CiAgICBjaGFyczogMjQsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyMH0kIiwKICAgIGJiYW5fdmFsaWRhdGlvbl9mdW5jOiBjaGVja0N6ZWNoQW5kU2xvdmFrQkJBTiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTMiCiAgfSwKICBERTogewogICAgY2hhcnM6IDIyLAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTh9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC03IiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICIxMy0yMiIKICB9LAogIERKOiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyM30kIiwKICAgIGJyYW5jaF9pbmRlbnRpZmllcjogIjUtOSIsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTQiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjE0LTI3IgogIH0sCiAgREs6IHsKICAgIGNoYXJzOiAxOCwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezE0fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgU0VQQTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiNC0xOCIKICB9LAogIERNOiB7fSwKICBETzogewogICAgY2hhcnM6IDI4LAogICAgYmJhbl9yZWdleHA6ICJeW0EtWl17NH1bMC05XXsyMH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiOC0yOCIKICB9LAogIERaOiB7CiAgICBjaGFyczogMjYsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyMn0kIgogIH0sCiAgRUM6IHt9LAogIEVFOiB7CiAgICBjaGFyczogMjAsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxNn0kIiwKICAgIGJiYW5fdmFsaWRhdGlvbl9mdW5jOiBjaGVja0VzdG9uaWFuQkJBTiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTEiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjgtMjAiCiAgfSwKICBFRzogewogICAgY2hhcnM6IDI5LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjV9IiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJyYW5jaF9pbmRlbnRpZmllcjogIjQtNyIsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTMiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjE3LTI5IgogIH0sCiAgRUg6IHt9LAogIEVSOiB7fSwKICBFUzogewogICAgY2hhcnM6IDI0LAogICAgYmJhbl92YWxpZGF0aW9uX2Z1bmM6IGNoZWNrU3BhaW5CQkFOLAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjB9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiNC03IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMTQtMjQiCiAgfSwKICBFVDoge30sCiAgRkk6IHsKICAgIGNoYXJzOiAxOCwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezE0fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgU0VQQTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMiIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMC0wIgogIH0sCiAgRko6IHt9LAogIEZLOiB7CiAgICBjaGFyczogMTgsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXsyfVswLTldezEyfSQiLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0xIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICI2LTE4IgogIH0sCiAgRk06IHt9LAogIEZPOiB7CiAgICBjaGFyczogMTgsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxNH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiNC0xOCIKICB9LAogIEZSOiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxMH1bQS1aMC05XXsxMX1bMC05XXsyfSQiLAogICAgYmJhbl92YWxpZGF0aW9uX2Z1bmM6IGNoZWNrRnJlbmNoQkJBTiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTQiLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiNS05IiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICIxNC0yNCIKICB9LAogIEdBOiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyM30kIgogIH0sCiAgR0I6IHsKICAgIGNoYXJzOiAyMiwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezR9WzAtOV17MTR9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiNC05IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIKICB9LAogIEdEOiB7fSwKICBHRTogewogICAgY2hhcnM6IDIyLAogICAgYmJhbl9yZWdleHA6ICJeW0EtWjAtOV17Mn1bMC05XXsxNn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMSIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiNi0yMiIKICB9LAogIEdGOiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxMH1bQS1aMC05XXsxMX1bMC05XXsyfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlCiAgfSwKICBHRzoge30sCiAgR0g6IHt9LAogIEdJOiB7CiAgICBjaGFyczogMjMsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXs0fVtBLVowLTldezE1fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgU0VQQTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiOC0yMyIKICB9LAogIEdMOiB7CiAgICBjaGFyczogMTgsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxNH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiNC0xOCIKICB9LAogIEdNOiB7fSwKICBHTjoge30sCiAgR1A6IHsKICAgIGNoYXJzOiAyNywKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezEwfVtBLVowLTldezExfVswLTldezJ9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUKICB9LAogIEdROiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyM30kIgogIH0sCiAgR1I6IHsKICAgIGNoYXJzOiAyNywKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezd9W0EtWjAtOV17MTZ9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiMy02IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMiIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiNy0yNyIKICB9LAogIEdTOiB7fSwKICBHVDogewogICAgY2hhcnM6IDI4LAogICAgYmJhbl9yZWdleHA6ICJeW0EtWjAtOV17MjR9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTMiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjgtMjgiCiAgfSwKICBHVToge30sCiAgR1c6IHsKICAgIGNoYXJzOiAyNSwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezJ9WzAtOV17MTl9JCIKICB9LAogIEdZOiB7fSwKICBISzoge30sCiAgSE06IHt9LAogIEhOOiB7CiAgICBjaGFyczogMjgsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXs0fVswLTldezIwfSQiCiAgfSwKICBIUjogewogICAgY2hhcnM6IDIxLAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTd9JCIsCiAgICBiYmFuX3ZhbGlkYXRpb25fZnVuYzogY2hlY2tDcm9hdGlhbkJCQU4sCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC02IgogIH0sCiAgSFQ6IHt9LAogIEhVOiB7CiAgICBjaGFyczogMjgsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyNH0kIiwKICAgIGJiYW5fdmFsaWRhdGlvbl9mdW5jOiBjaGVja0h1bmdhcmlhbkJCQU4sCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiMy02IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMiIKICB9LAogIElEOiB7fSwKICBJRTogewogICAgY2hhcnM6IDIyLAogICAgYmJhbl9yZWdleHA6ICJeW0EtWjAtOV17NH1bMC05XXsxNH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICI0LTkiLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0zIgogIH0sCiAgSUw6IHsKICAgIGNoYXJzOiAyMywKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezE5fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiMy01IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMiIKICB9LAogIElNOiB7fSwKICBJTjoge30sCiAgSU86IHt9LAogIElROiB7CiAgICBjaGFyczogMjMsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXs0fVswLTldezE1fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiNC02IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMTEtMjMiCiAgfSwKICBJUjogewogICAgY2hhcnM6IDI2LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjJ9JCIKICB9LAogIElTOiB7CiAgICBjaGFyczogMjYsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyMn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICIyLTMiLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0xIgogIH0sCiAgSVQ6IHsKICAgIGNoYXJzOiAyNywKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezF9WzAtOV17MTB9W0EtWjAtOV17MTJ9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiNi0xMCIsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIxLTUiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjQtMjciCiAgfSwKICBKRToge30sCiAgSk06IHt9LAogIEpPOiB7CiAgICBjaGFyczogMzAsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXs0fVswLTldezR9W0EtWjAtOV17MTh9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICI0LTciLAogICAgYmFua19pZGVudGlmaWVyOiAiNC03IgogIH0sCiAgSlA6IHt9LAogIEtFOiB7fSwKICBLRzoge30sCiAgS0g6IHt9LAogIEtJOiB7fSwKICBLTTogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjN9JCIKICB9LAogIEtOOiB7fSwKICBLUDoge30sCiAgS1I6IHt9LAogIEtXOiB7CiAgICBjaGFyczogMzAsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXs0fVtBLVowLTldezIyfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0zIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICIyMC0zMCIKICB9LAogIEtZOiB7fSwKICBLWjogewogICAgY2hhcnM6IDIwLAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17M31bQS1aMC05XXsxM30kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMiIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMC0yMCIKICB9LAogIExBOiB7fSwKICBMQjogewogICAgY2hhcnM6IDI4LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17NH1bQS1aMC05XXsyMH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMTQtMjgiCiAgfSwKICBMQzogewogICAgY2hhcnM6IDMyLAogICAgYmJhbl9yZWdleHA6ICJeW0EtWl17NH1bQS1aMC05XXsyNH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiOC0zMiIKICB9LAogIExJOiB7CiAgICBjaGFyczogMjEsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXs1fVtBLVowLTldezEyfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgU0VQQTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtNCIKICB9LAogIExLOiB7fSwKICBMUjoge30sCiAgTFM6IHt9LAogIExUOiB7IGNoYXJzOiAyMCwgYmJhbl9yZWdleHA6ICJeWzAtOV17MTZ9JCIsIElCQU5SZWdpc3RyeTogdHJ1ZSwgU0VQQTogdHJ1ZSwgYmFua19pZGVudGlmaWVyOiAiMC00IiB9LAogIExVOiB7CiAgICBjaGFyczogMjAsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXszfVtBLVowLTldezEzfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgU0VQQTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMiIKICB9LAogIExWOiB7CiAgICBjaGFyczogMjEsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXs0fVtBLVowLTldezEzfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgU0VQQTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMC0yMSIKICB9LAogIExZOiB7CiAgICBjaGFyczogMjUsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyMX0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJyYW5jaF9pbmRlbnRpZmllcjogIjMtNSIsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTIiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjEwLTI1IgogIH0sCiAgTUE6IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezI0fSQiCiAgfSwKICBNQzogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTB9W0EtWjAtOV17MTF9WzAtOV17Mn0kIiwKICAgIGJiYW5fdmFsaWRhdGlvbl9mdW5jOiBjaGVja0ZyZW5jaEJCQU4sCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiNS05IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtNCIKICB9LAogIE1EOiB7CiAgICBjaGFyczogMjQsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aMC05XXsyfVtBLVowLTldezE4fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0xIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICI2LTI0IgogIH0sCiAgTUU6IHsKICAgIGNoYXJzOiAyMiwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezE4fSQiLAogICAgYmJhbl92YWxpZGF0aW9uX2Z1bmM6IGNoZWNrTW9kOTcxMEJCQU4sCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTIiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjQtMjIiCiAgfSwKICBNRjogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTB9W0EtWjAtOV17MTF9WzAtOV17Mn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZQogIH0sCiAgTUc6IHsKICAgIGNoYXJzOiAyNywKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezIzfSQiCiAgfSwKICBNSDoge30sCiAgTUs6IHsKICAgIGNoYXJzOiAxOSwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezN9W0EtWjAtOV17MTB9WzAtOV17Mn0kIiwKICAgIGJiYW5fdmFsaWRhdGlvbl9mdW5jOiBjaGVja01vZDk3MTBCQkFOLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0yIgogIH0sCiAgTUw6IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVowLTldezJ9WzAtOV17MjJ9JCIKICB9LAogIE1NOiB7fSwKICBNTjogewogICAgY2hhcnM6IDIwLAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTZ9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTMiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjgtMjAiCiAgfSwKICBNTzoge30sCiAgTVA6IHt9LAogIE1ROiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxMH1bQS1aMC05XXsxMX1bMC05XXsyfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlCiAgfSwKICBNUjogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjN9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICI1LTkiLAogICAgYmFua19pZGVudGlmaWVyOiAiMC00IiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICI0LTI3IgogIH0sCiAgTVM6IHt9LAogIE1UOiB7CiAgICBjaGFyczogMzEsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXs0fVswLTldezV9W0EtWjAtOV17MTh9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiNC04IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMTUtMzEiCiAgfSwKICBNVTogewogICAgY2hhcnM6IDMwLAogICAgYmJhbl9yZWdleHA6ICJeW0EtWl17NH1bMC05XXsxOX1bQS1aXXszfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiNi03IiwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtNSIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMC0zMCIKICB9LAogIE1WOiB7fSwKICBNVzoge30sCiAgTVg6IHt9LAogIE1ZOiB7fSwKICBNWjogewogICAgY2hhcnM6IDI1LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjF9JCIKICB9LAogIE5BOiB7fSwKICBOQzogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTB9W0EtWjAtOV17MTF9WzAtOV17Mn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZQogIH0sCiAgTkU6IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezJ9WzAtOV17MjJ9JCIKICB9LAogIE5GOiB7fSwKICBORzoge30sCiAgTkk6IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezR9WzAtOV17MjB9JCIsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTMiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjgtMjgiCiAgfSwKICBOTDogewogICAgY2hhcnM6IDE4LAogICAgYmJhbl9yZWdleHA6ICJeW0EtWl17NH1bMC05XXsxMH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTMiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjgtMTgiCiAgfSwKICBOTzogewogICAgY2hhcnM6IDE1LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTF9JCIsCiAgICBiYmFuX3ZhbGlkYXRpb25fZnVuYzogY2hlY2tOb3J3YXlCQkFOLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgU0VQQTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiNC0xNSIKICB9LAogIE5QOiB7fSwKICBOUjoge30sCiAgTlU6IHt9LAogIE5aOiB7fSwKICBPTTogewogICAgY2hhcnM6IDIzLAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17M31bQS1aMC05XXsxNn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IGZhbHNlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0yIgogIH0sCiAgUEE6IHt9LAogIFBFOiB7fSwKICBQRjogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTB9W0EtWjAtOV17MTF9WzAtOV17Mn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZQogIH0sCiAgUEc6IHt9LAogIFBIOiB7fSwKICBQSzogewogICAgY2hhcnM6IDI0LAogICAgYmJhbl9yZWdleHA6ICJeW0EtWjAtOV17NH1bMC05XXsxNn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIKICB9LAogIFBMOiB7CiAgICBjaGFyczogMjgsCiAgICBiYmFuX3ZhbGlkYXRpb25fZnVuYzogY2hlY2tQb2xhbmRCQkFOLAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MjR9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiMC03IiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICIyLTI4IgogIH0sCiAgUE06IHsKICAgIGNoYXJzOiAyNywKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezEwfVtBLVowLTldezExfVswLTldezJ9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUKICB9LAogIFBOOiB7fSwKICBQUjoge30sCiAgUFM6IHsKICAgIGNoYXJzOiAyOSwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVowLTldezR9WzAtOV17MjF9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTMiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjE3LTI5IgogIH0sCiAgUFQ6IHsKICAgIGNoYXJzOiAyNSwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezIxfSQiLAogICAgYmJhbl92YWxpZGF0aW9uX2Z1bmM6IGNoZWNrTW9kOTcxMEJCQU4sCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBTRVBBOiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0zIgogIH0sCiAgUFc6IHt9LAogIFBZOiB7fSwKICBRQTogewogICAgY2hhcnM6IDI5LAogICAgYmJhbl9yZWdleHA6ICJeW0EtWl17NH1bQS1aMC05XXsyMX0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMyIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiOC0yOSIKICB9LAogIFJFOiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxMH1bQS1aMC05XXsxMX1bMC05XXsyfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlCiAgfSwKICBSTzogewogICAgY2hhcnM6IDI0LAogICAgYmJhbl9yZWdleHA6ICJeW0EtWl17NH1bQS1aMC05XXsxNn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTMiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjAtMjQiCiAgfSwKICBSUzogewogICAgY2hhcnM6IDIyLAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTh9JCIsCiAgICBiYmFuX3ZhbGlkYXRpb25fZnVuYzogY2hlY2tNb2Q5NzEwQkJBTiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMiIKICB9LAogIFJVOiB7CiAgICBjaGFyczogMzMsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxNH1bQS1aMC05XXsxNX0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJyYW5jaF9pbmRlbnRpZmllcjogIjktMTMiLAogICAgYmFua19pZGVudGlmaWVyOiAiMC04IiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICIxMy0zMyIKICB9LAogIFJXOiB7fSwKICBTQTogewogICAgY2hhcnM6IDI0LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17Mn1bQS1aMC05XXsxOH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJhbmtfaWRlbnRpZmllcjogIjAtMSIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMTItMjQiCiAgfSwKICBTQjoge30sCiAgU0M6IHsKICAgIGNoYXJzOiAzMSwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezR9WzAtOV17MjB9W0EtWl17M30kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJyYW5jaF9pbmRlbnRpZmllcjogIjYtNyIsCiAgICBiYW5rX2lkZW50aWZpZXI6ICIwLTUiLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjEyLTI4IgogIH0sCiAgU0Q6IHsKICAgIGNoYXJzOiAxOCwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezE0fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0xIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICI2LTE4IgogIH0sCiAgU0U6IHsgY2hhcnM6IDI0LCBiYmFuX3JlZ2V4cDogIl5bMC05XXsyMH0kIiwgSUJBTlJlZ2lzdHJ5OiB0cnVlLCBTRVBBOiB0cnVlLCBiYW5rX2lkZW50aWZpZXI6ICIwLTIiIH0sCiAgU0c6IHt9LAogIFNIOiB7fSwKICBTSTogewogICAgY2hhcnM6IDE5LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTV9JCIsCiAgICBiYmFuX3ZhbGlkYXRpb25fZnVuYzogY2hlY2tNb2Q5NzEwQkJBTiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICIyLTQiLAogICAgYmFua19pZGVudGlmaWVyOiAiMC0xIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICI5LTE2IgogIH0sCiAgU0o6IHt9LAogIFNLOiB7CiAgICBjaGFyczogMjQsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyMH0kIiwKICAgIGJiYW5fdmFsaWRhdGlvbl9mdW5jOiBjaGVja0N6ZWNoQW5kU2xvdmFrQkJBTiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUKICB9LAogIFNMOiB7fSwKICBTTTogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeW0EtWl17MX1bMC05XXsxMH1bQS1aMC05XXsxMn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBicmFuY2hfaW5kZW50aWZpZXI6ICI2LTEwIgogIH0sCiAgU046IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezJ9WzAtOV17MjJ9JCIKICB9LAogIFNPOiB7CiAgICBjaGFyczogMjMsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxOX0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJyYW5jaF9pbmRlbnRpZmllcjogIjQtNiIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiMTEtMjMiCiAgfSwKICBTUjoge30sCiAgU1M6IHt9LAogIFNUOiB7CiAgICBjaGFyczogMjUsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyMX0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJyYW5jaF9pbmRlbnRpZmllcjogIjQtNyIKICB9LAogIFNWOiB7CiAgICBjaGFyczogMjgsCiAgICBiYmFuX3JlZ2V4cDogIl5bQS1aXXs0fVswLTldezIwfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjgtMjgiCiAgfSwKICBTWDoge30sCiAgU1k6IHt9LAogIFNaOiB7fSwKICBUQzoge30sCiAgVEQ6IHsKICAgIGNoYXJzOiAyNywKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezIzfSQiCiAgfSwKICBURjogewogICAgY2hhcnM6IDI3LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTB9W0EtWjAtOV17MTF9WzAtOV17Mn0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZQogIH0sCiAgVEc6IHsKICAgIGNoYXJzOiAyOCwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVpdezJ9WzAtOV17MjJ9JCIKICB9LAogIFRIOiB7fSwKICBUSjoge30sCiAgVEs6IHt9LAogIFRMOiB7CiAgICBjaGFyczogMjMsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxOX0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICI0LTIzIgogIH0sCiAgVE06IHt9LAogIFROOiB7CiAgICBjaGFyczogMjQsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsyMH0kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIGJyYW5jaF9pbmRlbnRpZmllcjogIjItNCIsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiNC0yNCIKICB9LAogIFRPOiB7fSwKICBUUjogewogICAgY2hhcnM6IDI2LAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17NX1bQS1aMC05XXsxN30kIiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZQogIH0sCiAgVFQ6IHt9LAogIFRWOiB7fSwKICBUVzoge30sCiAgVFo6IHt9LAogIFVBOiB7CiAgICBjaGFyczogMjksCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXs2fVtBLVowLTldezE5fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYWNjb3VudF9pbmRlbnRpZmllcjogIjE1LTI5IgogIH0sCiAgVUc6IHt9LAogIFVNOiB7fSwKICBVUzoge30sCiAgVVk6IHt9LAogIFVaOiB7fSwKICBWQTogewogICAgY2hhcnM6IDIyLAogICAgYmJhbl9yZWdleHA6ICJeWzAtOV17MTh9IiwKICAgIElCQU5SZWdpc3RyeTogdHJ1ZSwKICAgIFNFUEE6IHRydWUsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiNy0yMiIKICB9LAogIFZDOiB7fSwKICBWRToge30sCiAgVkc6IHsKICAgIGNoYXJzOiAyNCwKICAgIGJiYW5fcmVnZXhwOiAiXltBLVowLTldezR9WzAtOV17MTZ9JCIsCiAgICBJQkFOUmVnaXN0cnk6IHRydWUsCiAgICBhY2NvdW50X2luZGVudGlmaWVyOiAiOC0yNCIKICB9LAogIFZJOiB7fSwKICBWTjoge30sCiAgVlU6IHt9LAogIFdGOiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxMH1bQS1aMC05XXsxMX1bMC05XXsyfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlCiAgfSwKICBXUzoge30sCiAgWEs6IHsKICAgIGNoYXJzOiAyMCwKICAgIGJiYW5fcmVnZXhwOiAiXlswLTldezE2fSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlLAogICAgYnJhbmNoX2luZGVudGlmaWVyOiAiMi0zIiwKICAgIGFjY291bnRfaW5kZW50aWZpZXI6ICI0LTIwIgogIH0sCiAgWUU6IHt9LAogIFlUOiB7CiAgICBjaGFyczogMjcsCiAgICBiYmFuX3JlZ2V4cDogIl5bMC05XXsxMH1bQS1aMC05XXsxMX1bMC05XXsyfSQiLAogICAgSUJBTlJlZ2lzdHJ5OiB0cnVlCiAgfSwKICBaQToge30sCiAgWk06IHt9LAogIFpXOiB7fQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtaWJhbi9kZWVzLWlucHV0LWliYW4uZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmMxOSA9ICgpID0+IGIyYAogIDxkZWVzLWRlbW93cmFwcGVyPgogICAgPHN0eWxlPgogICAgICAke2lgCiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICAgIG1heC13aWR0aDogMTIwMHB4OwogICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5pbnB1dC1ncm91cCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMTZweDsKICAgICAgICB9CgogICAgICAgIC5wYXltZW50LWdyb3VwIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIH0KICAgICAgYH0KICAgIDwvc3R5bGU+CiAgICAKICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkJhc2ljIElCQU4gSW5wdXQifSAuc3VidGl0bGU9JHsiSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIHdpdGggYXV0b21hdGljIGZvcm1hdHRpbmcifT4KICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1pYmFuCiAgICAgICAgICAgIC5sYWJlbD0keyJCYW5rIEFjY291bnQgSUJBTiJ9CiAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJFbnRlciB5b3VyIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWliYW4+CgogICAgICAgICAgPGRlZXMtaW5wdXQtaWJhbgogICAgICAgICAgICAubGFiZWw9JHsiVmVyaWZpZWQgSUJBTiJ9CiAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJUaGlzIElCQU4gaGFzIGJlZW4gdmVyaWZpZWQifQogICAgICAgICAgICAudmFsdWU9JHsiREU4OTM3MDQwMDQ0MDUzMjAxMzAwMCJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWliYW4+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJQYXltZW50IEluZm9ybWF0aW9uIn0gLnN1YnRpdGxlPSR7IklCQU4gaW5wdXQgd2l0aCBob3Jpem9udGFsIGxheW91dCBmb3IgcGF5bWVudCBmb3JtcyJ9PgogICAgICAgIDxkaXYgY2xhc3M9InBheW1lbnQtZ3JvdXAiPgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAKICAgICAgICAgICAgLmxhYmVsPSR7IkFjY291bnQgSG9sZGVyIn0gCiAgICAgICAgICAgIC5sYXlvdXRNb2RlPSR7Imhvcml6b250YWwifQogICAgICAgICAgICAudmFsdWU9JHsiSm9obiBEb2UifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1pYmFuIAogICAgICAgICAgICAubGFiZWw9JHsiSUJBTiJ9IAogICAgICAgICAgICAubGF5b3V0TW9kZT0keyJob3Jpem9udGFsIn0KICAgICAgICAgICAgLnZhbHVlPSR7IkdCODJXRVNUMTIzNDU2OTg3NjU0MzIifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1pYmFuPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiVmFsaWRhdGlvbiAmIFN0YXRlcyJ9IC5zdWJ0aXRsZT0keyJSZXF1aXJlZCBmaWVsZHMgYW5kIGRpc2FibGVkIHN0YXRlcyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWlucHV0LWliYW4KICAgICAgICAgICAgLmxhYmVsPSR7IlBheW1lbnQgQWNjb3VudCJ9CiAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJSZXF1aXJlZCBmb3IgcHJvY2Vzc2luZyBwYXltZW50cyJ9CiAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWliYW4+CgogICAgICAgICAgPGRlZXMtaW5wdXQtaWJhbgogICAgICAgICAgICAubGFiZWw9JHsiTG9ja2VkIElCQU4ifQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiVGhpcyBJQkFOIGNhbm5vdCBiZSBjaGFuZ2VkIn0KICAgICAgICAgICAgLnZhbHVlPSR7IkZSMTQyMDA0MTAxMDA1MDUwMDAxM00wMjYwNiJ9CiAgICAgICAgICAgIC5kaXNhYmxlZD0ke3RydWV9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWliYW4+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJCYW5rIFRyYW5zZmVyIEZvcm0ifSAuc3VidGl0bGU9JHsiQ29tcGxldGUgZm9ybSBleGFtcGxlIHdpdGggSUJBTiB2YWxpZGF0aW9uIn0+CiAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgLmxhYmVsPSR7IlJlY2lwaWVudCBOYW1lIn0gLnJlcXVpcmVkPSR7dHJ1ZX0+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1pYmFuIC5sYWJlbD0keyJSZWNpcGllbnQgSUJBTiJ9IC5yZXF1aXJlZD0ke3RydWV9PjwvZGVlcy1pbnB1dC1pYmFuPgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAubGFiZWw9JHsiVHJhbnNmZXIgUmVmZXJlbmNlIn0gLmRlc2NyaXB0aW9uPSR7Ik9wdGlvbmFsIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zZmVyIn0+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IC5sYWJlbD0keyJBbW91bnQifSAuaW5wdXRUeXBlPSR7Im51bWJlciJ9IC5yZXF1aXJlZD0ke3RydWV9PjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgIDwvZGVlcy1mb3JtPgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2Rpdj4KICA8L2RlZXMtZGVtb3dyYXBwZXI+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1pYmFuL2RlZXMtaW5wdXQtaWJhbi5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2Rpc3RfdHMyOSgpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGUyNyA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMjggPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNJbnB1dEliYW4gPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtaW5wdXQtaWJhbiIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzSW5wdXRCYXNlOwogIGxldCBfZW50ZXJlZFN0cmluZ19kZWNvcmF0b3JzOwogIGxldCBfZW50ZXJlZFN0cmluZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2VudGVyZWRTdHJpbmdfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2VudGVyZWRJYmFuSXNWYWxpZF9kZWNvcmF0b3JzOwogIGxldCBfZW50ZXJlZEliYW5Jc1ZhbGlkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZW50ZXJlZEliYW5Jc1ZhbGlkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWx1ZV9kZWNvcmF0b3JzOwogIGxldCBfdmFsdWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWx1ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW5wdXRJYmFuMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2VudGVyZWRTdHJpbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2VudGVyZWRJYmFuSXNWYWxpZF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfdmFsdWVfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgIH0pXTsKICAgICAgX19lc0RlY29yYXRlMjcodGhpcywgbnVsbCwgX2VudGVyZWRTdHJpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZW50ZXJlZFN0cmluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZW50ZXJlZFN0cmluZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5lbnRlcmVkU3RyaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5lbnRlcmVkU3RyaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2VudGVyZWRTdHJpbmdfaW5pdGlhbGl6ZXJzLCBfZW50ZXJlZFN0cmluZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTI3KHRoaXMsIG51bGwsIF9lbnRlcmVkSWJhbklzVmFsaWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZW50ZXJlZEliYW5Jc1ZhbGlkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJlbnRlcmVkSWJhbklzVmFsaWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZW50ZXJlZEliYW5Jc1ZhbGlkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5lbnRlcmVkSWJhbklzVmFsaWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZW50ZXJlZEliYW5Jc1ZhbGlkX2luaXRpYWxpemVycywgX2VudGVyZWRJYmFuSXNWYWxpZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTI3KHRoaXMsIG51bGwsIF92YWx1ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2YWx1ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmFsdWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmFsdWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZhbHVlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZhbHVlX2luaXRpYWxpemVycywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjcobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzSW5wdXRJYmFuMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAvLyBTVEFUSUMKICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMxOTsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJJbnB1dCJdOwogICAgI2VudGVyZWRTdHJpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMjgodGhpcywgX2VudGVyZWRTdHJpbmdfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IGVudGVyZWRTdHJpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNlbnRlcmVkU3RyaW5nX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZW50ZXJlZFN0cmluZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZW50ZXJlZFN0cmluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2VudGVyZWRJYmFuSXNWYWxpZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjgodGhpcywgX2VudGVyZWRTdHJpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczI4KHRoaXMsIF9lbnRlcmVkSWJhbklzVmFsaWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGVudGVyZWRJYmFuSXNWYWxpZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2VudGVyZWRJYmFuSXNWYWxpZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGVudGVyZWRJYmFuSXNWYWxpZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZW50ZXJlZEliYW5Jc1ZhbGlkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI4KHRoaXMsIF9lbnRlcmVkSWJhbklzVmFsaWRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczI4KHRoaXMsIF92YWx1ZV9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICAuLi5EZWVzSW5wdXRCYXNlLmJhc2VTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgLyogSUJBTiBpbnB1dCBzcGVjaWZpYyBzdHlsZXMgY2FuIGdvIGhlcmUgKi8KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgICAgPGRlZXMtbGFiZWwgLmxhYmVsPSR7dGhpcy5sYWJlbCB8fCAiSUJBTiJ9IC5kZXNjcmlwdGlvbj0ke3RoaXMuZGVzY3JpcHRpb259PjwvZGVlcy1sYWJlbD4KICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0CiAgICAgICAgICAudmFsdWU9JHt0aGlzLnZhbHVlfQogICAgICAgICAgLmRpc2FibGVkPSR7dGhpcy5kaXNhYmxlZH0KICAgICAgICAgIC5yZXF1aXJlZD0ke3RoaXMucmVxdWlyZWR9CiAgICAgICAgICAucGxhY2Vob2xkZXI9JHsiREU4OSAzNzA0IDAwNDQgMDUzMiAwMTMwIDAwIn0KICAgICAgICAgIEBpbnB1dD0keyhldmVudEFyZykgPT4gewogICAgICAgIHRoaXMudmFsaWRhdGVJYmFuKGV2ZW50QXJnKTsKICAgICAgfX0KICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGNvbnN0IGRlZXNJbnB1dFRleHQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC10ZXh0Iik7CiAgICAgIGlmIChkZWVzSW5wdXRUZXh0ICYmIGRlZXNJbnB1dFRleHQuY2hhbmdlU3ViamVjdCkgewogICAgICAgIGRlZXNJbnB1dFRleHQuY2hhbmdlU3ViamVjdC5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIHZhbGlkYXRlSWJhbihldmVudEFyZykgewogICAgICBjb25zdCBpbnB1dEVsZW1lbnQgPSBldmVudEFyZy50YXJnZXQ7CiAgICAgIGxldCBlbnRlcmVkU3RyaW5nID0gaW5wdXRFbGVtZW50Py52YWx1ZTsKICAgICAgZW50ZXJlZFN0cmluZyA9IGVudGVyZWRTdHJpbmcgfHwgIiI7CiAgICAgIGlmICh0aGlzLmVudGVyZWRTdHJpbmcgIT09IGVudGVyZWRTdHJpbmcpIHsKICAgICAgICB0aGlzLmVudGVyZWRTdHJpbmcgPSBmcmllbmRseUZvcm1hdElCQU4oZW50ZXJlZFN0cmluZykgfHwgIiI7CiAgICAgICAgaWYgKGlucHV0RWxlbWVudCkgewogICAgICAgICAgaW5wdXRFbGVtZW50LnZhbHVlID0gdGhpcy5lbnRlcmVkU3RyaW5nOwogICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuZW50ZXJlZFN0cmluZzsKICAgICAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMpOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLmVudGVyZWRJYmFuSXNWYWxpZCA9IGlzVmFsaWRJQkFOKHRoaXMuZW50ZXJlZFN0cmluZy5yZXBsYWNlKC8gL2csICIiKSk7CiAgICAgIGNvbnN0IGRlZXNJbnB1dFRleHQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC10ZXh0Iik7CiAgICAgIGRlZXNJbnB1dFRleHQudmFsaWRhdGlvblRleHQgPSBgSUJBTiBpcyB2YWxpZDogJHt0aGlzLmVudGVyZWRJYmFuSXNWYWxpZH1gOwogICAgfQogICAgZ2V0VmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgfQogICAgc2V0VmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTI7CiAgICAgIHRoaXMuZW50ZXJlZFN0cmluZyA9IGZyaWVuZGx5Rm9ybWF0SUJBTih2YWx1ZTIpIHx8ICIiOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMjgodGhpcywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMjgoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNJbnB1dEliYW4yID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LW11bHRpdG9nZ2xlL2RlZXMtaW5wdXQtbXVsdGl0b2dnbGUuZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmMyMCA9ICgpID0+IGIyYAogIDxkZWVzLWRlbW93cmFwcGVyPgogICAgPHN0eWxlPgogICAgICAke2lgCiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAzMnB4OwogICAgICAgICAgcGFkZGluZzogNDhweDsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjhmOWZhIiwgIiMwYTBhMGEiKX07CiAgICAgICAgICBtaW4taGVpZ2h0OiAxMDB2aDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnNlY3Rpb24gewogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzE4MTgxYiIpfTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnNlY3Rpb24tdGl0bGUgewogICAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuc2VjdGlvbi1kZXNjcmlwdGlvbiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5zZXR0aW5ncy1ncmlkIHsKICAgICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgICAgICAgICBnYXA6IDI0cHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgewogICAgICAgICAgLnNldHRpbmdzLWdyaWQgewogICAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIGB9CiAgICA8L3N0eWxlPgogICAgCiAgICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPk11bHRpLU9wdGlvbiBUb2dnbGU8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5TZWxlY3QgZnJvbSBtdWx0aXBsZSBvcHRpb25zIHdpdGggYSBzbW9vdGggc2xpZGluZyBpbmRpY2F0b3IgYW5pbWF0aW9uLjwvZGl2PgogICAgICAgIAogICAgICAgIDxkZWVzLWlucHV0LW11bHRpdG9nZ2xlCiAgICAgICAgICAubGFiZWw9JHsiRGlzcGxheSBNb2RlIn0KICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJDaG9vc2UgaG93IGNvbnRlbnQgaXMgZGlzcGxheWVkIn0KICAgICAgICAgIC5vcHRpb25zPSR7WyJMaXN0IFZpZXciLCAiR3JpZCBWaWV3IiwgIkNvbXBhY3QiXX0KICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJHcmlkIFZpZXcifQogICAgICAgID48L2RlZXMtaW5wdXQtbXVsdGl0b2dnbGU+CiAgICAgICAgCiAgICAgICAgPGJyPjxicj4KICAgICAgICAKICAgICAgICA8ZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZQogICAgICAgICAgLmxhYmVsPSR7IlQtU2hpcnQgU2l6ZSJ9CiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiU2VsZWN0IHlvdXIgcHJlZmVycmVkIHNpemUifQogICAgICAgICAgLm9wdGlvbnM9JHtbIlhTIiwgIlMiLCAiTSIsICJMIiwgIlhMIiwgIlhYTCJdfQogICAgICAgICAgLnNlbGVjdGVkT3B0aW9uPSR7Ik0ifQogICAgICAgID48L2RlZXMtaW5wdXQtbXVsdGl0b2dnbGU+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+Qm9vbGVhbiBUb2dnbGU8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5TaW1wbGUgb24vb2ZmIHN3aXRjaGVzIHdpdGggY3VzdG9taXphYmxlIGxhYmVscyBmb3IgY2xlYXJlciBjb250ZXh0LjwvZGl2PgogICAgICAgIAogICAgICAgIDxkZWVzLWlucHV0LW11bHRpdG9nZ2xlCiAgICAgICAgICAubGFiZWw9JHsiTm90aWZpY2F0aW9ucyJ9CiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiRW5hYmxlIG9yIGRpc2FibGUgcHVzaCBub3RpZmljYXRpb25zIn0KICAgICAgICAgIC50eXBlPSR7ImJvb2xlYW4ifQogICAgICAgICAgLnNlbGVjdGVkT3B0aW9uPSR7InRydWUifQogICAgICAgID48L2RlZXMtaW5wdXQtbXVsdGl0b2dnbGU+CiAgICAgICAgCiAgICAgICAgPGJyPjxicj4KICAgICAgICAKICAgICAgICA8ZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZQogICAgICAgICAgLmxhYmVsPSR7IlRoZW1lIE1vZGUifQogICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IlN3aXRjaCBiZXR3ZWVuIGxpZ2h0IGFuZCBkYXJrIHRoZW1lIn0KICAgICAgICAgIC50eXBlPSR7ImJvb2xlYW4ifQogICAgICAgICAgLmJvb2xlYW5UcnVlTmFtZT0keyJEYXJrIn0KICAgICAgICAgIC5ib29sZWFuRmFsc2VOYW1lPSR7IkxpZ2h0In0KICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJEYXJrIn0KICAgICAgICA+PC9kZWVzLWlucHV0LW11bHRpdG9nZ2xlPgogICAgICA8L2Rpdj4KICAgICAgCiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlNldHRpbmdzIEdyaWQ8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5Db25maWd1cmF0aW9uIG9wdGlvbnMgYXJyYW5nZWQgaW4gYSByZXNwb25zaXZlIGdyaWQgbGF5b3V0LjwvZGl2PgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzLWdyaWQiPgogICAgICAgICAgPGRlZXMtaW5wdXQtbXVsdGl0b2dnbGUKICAgICAgICAgICAgLmxhYmVsPSR7IkF1dG8tU2F2ZSJ9CiAgICAgICAgICAgIC50eXBlPSR7ImJvb2xlYW4ifQogICAgICAgICAgICAuYm9vbGVhblRydWVOYW1lPSR7IkVuYWJsZWQifQogICAgICAgICAgICAuYm9vbGVhbkZhbHNlTmFtZT0keyJEaXNhYmxlZCJ9CiAgICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJFbmFibGVkIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtbXVsdGl0b2dnbGU+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LW11bHRpdG9nZ2xlCiAgICAgICAgICAgIC5sYWJlbD0keyJMYW5ndWFnZSJ9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WyJFbmdsaXNoIiwgIkdlcm1hbiIsICJGcmVuY2giLCAiU3BhbmlzaCJdfQogICAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiRW5nbGlzaCJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LW11bHRpdG9nZ2xlPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZQogICAgICAgICAgICAubGFiZWw9JHsiUXVhbGl0eSJ9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WyJMb3ciLCAiTWVkaXVtIiwgIkhpZ2giLCAiVWx0cmEiXX0KICAgICAgICAgICAgLnNlbGVjdGVkT3B0aW9uPSR7IkhpZ2gifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZT4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtbXVsdGl0b2dnbGUKICAgICAgICAgICAgLmxhYmVsPSR7IlByaXZhY3kifQogICAgICAgICAgICAudHlwZT0keyJib29sZWFuIn0KICAgICAgICAgICAgLmJvb2xlYW5UcnVlTmFtZT0keyJQcml2YXRlIn0KICAgICAgICAgICAgLmJvb2xlYW5GYWxzZU5hbWU9JHsiUHVibGljIn0KICAgICAgICAgICAgLnNlbGVjdGVkT3B0aW9uPSR7IlByaXZhdGUifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5TdGF0ZXMgJiBGb3JtIEludGVncmF0aW9uPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+RXhhbXBsZXMgb2YgZGlzYWJsZWQgc3RhdGVzIGFuZCBpbnRlZ3JhdGlvbiB3aXRoaW4gZm9ybXMuPC9kaXY+CiAgICAgICAgCiAgICAgICAgPGRlZXMtaW5wdXQtbXVsdGl0b2dnbGUKICAgICAgICAgIC5sYWJlbD0keyJBY2NvdW50IFR5cGUifQogICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IlRoaXMgc2V0dGluZyBpcyBsb2NrZWQifQogICAgICAgICAgLm9wdGlvbnM9JHtbIkZyZWUiLCAiUHJvIiwgIkVudGVycHJpc2UiXX0KICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJFbnRlcnByaXNlIn0KICAgICAgICAgIC5kaXNhYmxlZD0ke3RydWV9CiAgICAgICAgPjwvZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZT4KICAgICAgICAKICAgICAgICA8YnI+PGJyPgogICAgICAgIAogICAgICAgIDxkZWVzLWZvcm0+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IC5sYWJlbD0keyJQcm9qZWN0IE5hbWUifSAucmVxdWlyZWQ9JHt0cnVlfT48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIDxkZWVzLWlucHV0LW11bHRpdG9nZ2xlCiAgICAgICAgICAgIC5sYWJlbD0keyJWaXNpYmlsaXR5In0KICAgICAgICAgICAgLnR5cGU9JHsiYm9vbGVhbiJ9CiAgICAgICAgICAgIC5ib29sZWFuVHJ1ZU5hbWU9JHsiUHVibGljIn0KICAgICAgICAgICAgLmJvb2xlYW5GYWxzZU5hbWU9JHsiUHJpdmF0ZSJ9CiAgICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJQcml2YXRlIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtbXVsdGl0b2dnbGU+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZQogICAgICAgICAgICAubGFiZWw9JHsiTGljZW5zZSJ9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WyJNSVQiLCAiQXBhY2hlIDIuMCIsICJHUEwgdjMiLCAiUHJvcHJpZXRhcnkiXX0KICAgICAgICAgICAgLnNlbGVjdGVkT3B0aW9uPSR7Ik1JVCJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LW11bHRpdG9nZ2xlPgogICAgICAgIDwvZGVlcy1mb3JtPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGVlcy1kZW1vd3JhcHBlcj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LW11bHRpdG9nZ2xlL2RlZXMtaW5wdXQtbXVsdGl0b2dnbGUuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlMjggPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczI5ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzSW5wdXRNdWx0aXRvZ2dsZSA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZSIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzSW5wdXRCYXNlOwogIGxldCBfdHlwZV9kZWNvcmF0b3JzOwogIGxldCBfdHlwZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3R5cGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Jvb2xlYW5UcnVlTmFtZV9kZWNvcmF0b3JzOwogIGxldCBfYm9vbGVhblRydWVOYW1lX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYm9vbGVhblRydWVOYW1lX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ib29sZWFuRmFsc2VOYW1lX2RlY29yYXRvcnM7CiAgbGV0IF9ib29sZWFuRmFsc2VOYW1lX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYm9vbGVhbkZhbHNlTmFtZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfb3B0aW9uc19kZWNvcmF0b3JzOwogIGxldCBfb3B0aW9uc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX29wdGlvbnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkT3B0aW9uX2RlY29yYXRvcnM7CiAgbGV0IF9zZWxlY3RlZE9wdGlvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkT3B0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ib29sVmFsdWVfZGVjb3JhdG9yczsKICBsZXQgX2Jvb2xWYWx1ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Jvb2xWYWx1ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW5wdXRNdWx0aXRvZ2dsZTIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF90eXBlX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9ib29sZWFuVHJ1ZU5hbWVfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX2Jvb2xlYW5GYWxzZU5hbWVfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX29wdGlvbnNfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogQXJyYXkKICAgICAgfSldOwogICAgICBfc2VsZWN0ZWRPcHRpb25fZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX2Jvb2xWYWx1ZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTI4KHRoaXMsIG51bGwsIF90eXBlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInR5cGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInR5cGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudHlwZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudHlwZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90eXBlX2luaXRpYWxpemVycywgX3R5cGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyOCh0aGlzLCBudWxsLCBfYm9vbGVhblRydWVOYW1lX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImJvb2xlYW5UcnVlTmFtZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYm9vbGVhblRydWVOYW1lIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmJvb2xlYW5UcnVlTmFtZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYm9vbGVhblRydWVOYW1lID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Jvb2xlYW5UcnVlTmFtZV9pbml0aWFsaXplcnMsIF9ib29sZWFuVHJ1ZU5hbWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyOCh0aGlzLCBudWxsLCBfYm9vbGVhbkZhbHNlTmFtZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJib29sZWFuRmFsc2VOYW1lIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJib29sZWFuRmFsc2VOYW1lIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmJvb2xlYW5GYWxzZU5hbWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmJvb2xlYW5GYWxzZU5hbWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYm9vbGVhbkZhbHNlTmFtZV9pbml0aWFsaXplcnMsIF9ib29sZWFuRmFsc2VOYW1lX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjgodGhpcywgbnVsbCwgX29wdGlvbnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAib3B0aW9ucyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAib3B0aW9ucyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5vcHRpb25zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5vcHRpb25zID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX29wdGlvbnNfaW5pdGlhbGl6ZXJzLCBfb3B0aW9uc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTI4KHRoaXMsIG51bGwsIF9zZWxlY3RlZE9wdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWxlY3RlZE9wdGlvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0ZWRPcHRpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0ZWRPcHRpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlbGVjdGVkT3B0aW9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGVkT3B0aW9uX2luaXRpYWxpemVycywgX3NlbGVjdGVkT3B0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjgodGhpcywgbnVsbCwgX2Jvb2xWYWx1ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJib29sVmFsdWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImJvb2xWYWx1ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5ib29sVmFsdWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmJvb2xWYWx1ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9ib29sVmFsdWVfaW5pdGlhbGl6ZXJzLCBfYm9vbFZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjgobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzSW5wdXRNdWx0aXRvZ2dsZTIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzIwOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIklucHV0Il07CiAgICAjdHlwZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMyOSh0aGlzLCBfdHlwZV9pbml0aWFsaXplcnMsICJtdWx0aSIpOwogICAgZ2V0IHR5cGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0eXBlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdHlwZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdHlwZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2Jvb2xlYW5UcnVlTmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMjkodGhpcywgX3R5cGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczI5KHRoaXMsIF9ib29sZWFuVHJ1ZU5hbWVfaW5pdGlhbGl6ZXJzLCAidHJ1ZSIpKTsKICAgIGdldCBib29sZWFuVHJ1ZU5hbWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNib29sZWFuVHJ1ZU5hbWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBib29sZWFuVHJ1ZU5hbWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2Jvb2xlYW5UcnVlTmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2Jvb2xlYW5GYWxzZU5hbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI5KHRoaXMsIF9ib29sZWFuVHJ1ZU5hbWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczI5KHRoaXMsIF9ib29sZWFuRmFsc2VOYW1lX2luaXRpYWxpemVycywgImZhbHNlIikpOwogICAgZ2V0IGJvb2xlYW5GYWxzZU5hbWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNib29sZWFuRmFsc2VOYW1lX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYm9vbGVhbkZhbHNlTmFtZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYm9vbGVhbkZhbHNlTmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI29wdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI5KHRoaXMsIF9ib29sZWFuRmFsc2VOYW1lX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyOSh0aGlzLCBfb3B0aW9uc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgb3B0aW9ucygpIHsKICAgICAgcmV0dXJuIHRoaXMuI29wdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBvcHRpb25zKHZhbHVlMikgewogICAgICB0aGlzLiNvcHRpb25zX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0ZWRPcHRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI5KHRoaXMsIF9vcHRpb25zX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMyOSh0aGlzLCBfc2VsZWN0ZWRPcHRpb25faW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IHNlbGVjdGVkT3B0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRPcHRpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3RlZE9wdGlvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VsZWN0ZWRPcHRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNib29sVmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczI5KHRoaXMsIF9zZWxlY3RlZE9wdGlvbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMjkodGhpcywgX2Jvb2xWYWx1ZV9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgYm9vbFZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy4jYm9vbFZhbHVlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYm9vbFZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLiNib29sVmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIC8vIEFkZCB2YWx1ZSBwcm9wZXJ0eSBmb3IgZm9ybSBjb21wYXRpYmlsaXR5CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgIGlmICh0aGlzLnR5cGUgPT09ICJib29sZWFuIikgewogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkT3B0aW9uID09PSB0aGlzLmJvb2xlYW5UcnVlTmFtZTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZE9wdGlvbjsKICAgIH0KICAgIHNldCB2YWx1ZSh2YWwpIHsKICAgICAgaWYgKHRoaXMudHlwZSA9PT0gImJvb2xlYW4iICYmIHR5cGVvZiB2YWwgPT09ICJib29sZWFuIikgewogICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSB2YWwgPyB0aGlzLmJvb2xlYW5UcnVlTmFtZSA6IHRoaXMuYm9vbGVhbkZhbHNlTmFtZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uID0gdmFsOwogICAgICB9CiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgICBpZiAodGhpcy5oYXNVcGRhdGVkKSB7CiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICAgIHRoaXMuc2V0SW5kaWNhdG9yKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgLi4uRGVlc0lucHV0QmFzZS5iYXNlU3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgLnNlbGVjdGlvbnMgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMxODE4MWIiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4wNSk7CiAgICAgIH0KCiAgICAgIC5vcHRpb24gewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBwYWRkaW5nOiA4cHggMjBweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdHJhbnNpdGlvbjogY29sb3IgMC4ycyBlYXNlOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjNzE3MTdhIil9OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIHotaW5kZXg6IDI7CiAgICAgIH0KCiAgICAgIC5vcHRpb246aG92ZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzE4MTgxYiIsICIjZTRlNGU3Iil9OwogICAgICB9CgogICAgICAub3B0aW9uLnNlbGVjdGVkIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzYwYTVmYSIpfTsKICAgICAgfQoKICAgICAgLmluZGljYXRvciB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA4cHgpOwogICAgICAgIHRvcDogNHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSg1OSwgMTMwLCAyNDYsIDAuMTUpIiwgInJnYmEoNTksIDEzMCwgMjQ2LCAwLjE1KSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KICAgICAgCiAgICAgIC5pbmRpY2F0b3Iubm8tdHJhbnNpdGlvbiB7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZTsKICAgICAgfQogICAgICAKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgLnNlbGVjdGlvbnMgewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAub3B0aW9uIHsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAuaW5kaWNhdG9yIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgxMTMsIDExMywgMTIyLCAwLjE1KSIsICJyZ2JhKDExMywgMTEzLCAxMjIsIDAuMTUpIil9OwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImlucHV0LXdyYXBwZXIiPgogICAgICAgIDxkZWVzLWxhYmVsIC5sYWJlbD0ke3RoaXMubGFiZWx9IC5kZXNjcmlwdGlvbj0ke3RoaXMuZGVzY3JpcHRpb259PjwvZGVlcy1sYWJlbD4KICAgICAgICA8ZGl2IGNsYXNzPSJtYWluYm94Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9InNlbGVjdGlvbnMiPgogICAgICAgICAgPGRpdiBjbGFzcz0iaW5kaWNhdG9yIj48L2Rpdj4KICAgICAgICAgICR7dGhpcy5vcHRpb25zLm1hcCgob3B0aW9uMikgPT4gYjJgPGRpdiBjbGFzcz0ib3B0aW9uICR7b3B0aW9uMiA9PT0gdGhpcy5zZWxlY3RlZE9wdGlvbiA/ICJzZWxlY3RlZCIgOiAiIn0iIEBjbGljaz0keygpID0+IHRoaXMuaGFuZGxlU2VsZWN0aW9uKG9wdGlvbjIpfT4KICAgICAgICAgICAgICAgICR7b3B0aW9uMn0KICAgICAgICAgICAgICA8L2Rpdj4gYCl9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGlmICh0aGlzLnR5cGUgPT09ICJib29sZWFuIiAmJiB0aGlzLm9wdGlvbnMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgdGhpcy5vcHRpb25zID0gW3RoaXMuYm9vbGVhblRydWVOYW1lIHx8ICJ0cnVlIiwgdGhpcy5ib29sZWFuRmFsc2VOYW1lIHx8ICJmYWxzZSJdOwogICAgICAgIGlmICghdGhpcy5zZWxlY3RlZE9wdGlvbikgewogICAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IHRoaXMuYm9vbGVhbkZhbHNlTmFtZSB8fCAiZmFsc2UiOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRPcHRpb24gJiYgdGhpcy5vcHRpb25zLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uID0gdGhpcy5vcHRpb25zWzBdOwogICAgICB9CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBpZiAodGhpcy50eXBlID09PSAiYm9vbGVhbiIpIHsKICAgICAgICB0aGlzLm9wdGlvbnMgPSBbdGhpcy5ib29sZWFuVHJ1ZU5hbWUgfHwgInRydWUiLCB0aGlzLmJvb2xlYW5GYWxzZU5hbWUgfHwgImZhbHNlIl07CiAgICAgIH0KICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgaWYgKGRvY3VtZW50LmZvbnRzKSB7CiAgICAgICAgYXdhaXQgZG9jdW1lbnQuZm9udHMucmVhZHk7CiAgICAgIH0KICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZTIpKTsKICAgICAgdGhpcy5zZXRJbmRpY2F0b3IoKTsKICAgIH0KICAgIGFzeW5jIGhhbmRsZVNlbGVjdGlvbihvcHRpb25BcmcpIHsKICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uID0gb3B0aW9uQXJnOwogICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7CiAgICAgIHRoaXMuc2V0SW5kaWNhdG9yKCk7CiAgICB9CiAgICBpbmRpY2F0b3JJbml0aWFsaXplZCA9IChfX3J1bkluaXRpYWxpemVyczI5KHRoaXMsIF9ib29sVmFsdWVfZXh0cmFJbml0aWFsaXplcnMpLCBmYWxzZSk7CiAgICBhc3luYyBzZXRJbmRpY2F0b3IoKSB7CiAgICAgIGNvbnN0IGluZGljYXRvciA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuaW5kaWNhdG9yIik7CiAgICAgIGNvbnN0IHNlbGVjdGVkSW5kZXggPSB0aGlzLm9wdGlvbnMuaW5kZXhPZih0aGlzLnNlbGVjdGVkT3B0aW9uKTsKICAgICAgaWYgKHNlbGVjdGVkSW5kZXggPT09IC0xIHx8ICFpbmRpY2F0b3IpIHsKICAgICAgICBpZiAoaW5kaWNhdG9yKSB7CiAgICAgICAgICBpbmRpY2F0b3Iuc3R5bGUub3BhY2l0eSA9ICIwIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IG9wdGlvbjIgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihgLm9wdGlvbjpudGgtY2hpbGQoJHtzZWxlY3RlZEluZGV4ICsgMn0pYCk7CiAgICAgIGlmIChpbmRpY2F0b3IgJiYgb3B0aW9uMikgewogICAgICAgIGlmICghdGhpcy5pbmRpY2F0b3JJbml0aWFsaXplZCkgewogICAgICAgICAgaW5kaWNhdG9yLmNsYXNzTGlzdC5hZGQoIm5vLXRyYW5zaXRpb24iKTsKICAgICAgICAgIHRoaXMuaW5kaWNhdG9ySW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGluZGljYXRvci5jbGFzc0xpc3QucmVtb3ZlKCJuby10cmFuc2l0aW9uIik7CiAgICAgICAgICB9LCA1MCk7CiAgICAgICAgfQogICAgICAgIGluZGljYXRvci5zdHlsZS53aWR0aCA9IGAke29wdGlvbjIuY2xpZW50V2lkdGh9cHhgOwogICAgICAgIGluZGljYXRvci5zdHlsZS5sZWZ0ID0gYCR7b3B0aW9uMi5vZmZzZXRMZWZ0fXB4YDsKICAgICAgICBpbmRpY2F0b3Iuc3R5bGUub3BhY2l0eSA9ICIxIjsKICAgICAgfQogICAgfQogICAgZ2V0VmFsdWUoKSB7CiAgICAgIGlmICh0aGlzLnR5cGUgPT09ICJib29sZWFuIikgewogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkT3B0aW9uID09PSB0aGlzLmJvb2xlYW5UcnVlTmFtZTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZE9wdGlvbjsKICAgIH0KICAgIHNldFZhbHVlKHZhbHVlMikgewogICAgICBpZiAodGhpcy50eXBlID09PSAiYm9vbGVhbiIgJiYgdHlwZW9mIHZhbHVlMiA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IHZhbHVlMiA/IHRoaXMuYm9vbGVhblRydWVOYW1lIHx8ICJ0cnVlIiA6IHRoaXMuYm9vbGVhbkZhbHNlTmFtZSB8fCAiZmFsc2UiOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSB2YWx1ZTI7CiAgICAgIH0KICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7CiAgICAgIGlmICh0aGlzLmhhc1VwZGF0ZWQpIHsKICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgICAgdGhpcy5zZXRJbmRpY2F0b3IoKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnMyOShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0lucHV0TXVsdGl0b2dnbGUyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXBob25lL2RlZXMtaW5wdXQtcGhvbmUuZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmMyMSA9ICgpID0+IGIyYAogIDxkZWVzLWRlbW93cmFwcGVyPgogICAgPHN0eWxlPgogICAgICAke2lgCiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICAgIG1heC13aWR0aDogMTIwMHB4OwogICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5pbnB1dC1ncm91cCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMTZweDsKICAgICAgICB9CgogICAgICAgIC5ob3Jpem9udGFsLWdyb3VwIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIH0KICAgICAgYH0KICAgIDwvc3R5bGU+CiAgICAKICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkJhc2ljIFBob25lIElucHV0In0gLnN1YnRpdGxlPSR7IkF1dG9tYXRpYyBmb3JtYXR0aW5nIGZvciBwaG9uZSBudW1iZXJzIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZ3JvdXAiPgogICAgICAgICAgPGRlZXMtaW5wdXQtcGhvbmUKICAgICAgICAgICAgLmxhYmVsPSR7IlBob25lIE51bWJlciJ9CiAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJFbnRlciB5b3VyIHBob25lIG51bWJlciB3aXRoIGNvdW50cnkgY29kZSJ9CiAgICAgICAgICAgIC52YWx1ZT0keyI1NTUxMjM0NTY3In0KICAgICAgICAgID48L2RlZXMtaW5wdXQtcGhvbmU+CgogICAgICAgICAgPGRlZXMtaW5wdXQtcGhvbmUKICAgICAgICAgICAgLmxhYmVsPSR7IkNvbnRhY3QgUGhvbmUifQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiUmVxdWlyZWQgZm9yIGFjY291bnQgdmVyaWZpY2F0aW9uIn0KICAgICAgICAgICAgLnJlcXVpcmVkPSR7dHJ1ZX0KICAgICAgICAgICAgLnBsYWNlaG9sZGVyPSR7IisxICg1NTUpIDAwMC0wMDAwIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtcGhvbmU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJIb3Jpem9udGFsIExheW91dCJ9IC5zdWJ0aXRsZT0keyJQaG9uZSBpbnB1dHMgYXJyYW5nZWQgaG9yaXpvbnRhbGx5In0+CiAgICAgICAgPGRpdiBjbGFzcz0iaG9yaXpvbnRhbC1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1waG9uZSAKICAgICAgICAgICAgLmxhYmVsPSR7Ik1vYmlsZSJ9IAogICAgICAgICAgICAubGF5b3V0TW9kZT0keyJob3Jpem9udGFsIn0KICAgICAgICAgICAgLnZhbHVlPSR7IjQxNTU1NTEyMzQifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1waG9uZT4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtcGhvbmUgCiAgICAgICAgICAgIC5sYWJlbD0keyJPZmZpY2UifSAKICAgICAgICAgICAgLmxheW91dE1vZGU9JHsiaG9yaXpvbnRhbCJ9CiAgICAgICAgICAgIC5wbGFjZWhvbGRlcj0keyIrMSAoODAwKSA1NTUtMDAwMCJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXBob25lPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiSW50ZXJuYXRpb25hbCBOdW1iZXJzIn0gLnN1YnRpdGxlPSR7IlN1cHBvcnRzIGZvcm1hdHRpbmcgZm9yIG51bWJlcnMgd2l0aCBjb3VudHJ5IGNvZGVzIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtZ3JvdXAiPgogICAgICAgICAgPGRlZXMtaW5wdXQtcGhvbmUKICAgICAgICAgICAgLmxhYmVsPSR7IkludGVybmF0aW9uYWwgQ29udGFjdCJ9CiAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJBdXRvbWF0aWNhbGx5IGZvcm1hdHMgaW50ZXJuYXRpb25hbCBudW1iZXJzIn0KICAgICAgICAgICAgLnZhbHVlPSR7IjQ0MTIzNDU2Nzg5MCJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXBob25lPgoKICAgICAgICAgIDxkZWVzLWlucHV0LXBob25lCiAgICAgICAgICAgIC5sYWJlbD0keyJFbWVyZ2VuY3kgQ29udGFjdCJ9CiAgICAgICAgICAgIC52YWx1ZT0keyI5MTEifQogICAgICAgICAgICAuZGlzYWJsZWQ9JHt0cnVlfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1waG9uZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkZvcm0gSW50ZWdyYXRpb24ifSAuc3VidGl0bGU9JHsiUGhvbmUgaW5wdXQgYXMgcGFydCBvZiBhIGNvbnRhY3QgZm9ybSJ9PgogICAgICAgIDxkZWVzLWZvcm0+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IC5sYWJlbD0keyJGdWxsIE5hbWUifSAucmVxdWlyZWQ9JHt0cnVlfT48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIDxkZWVzLWlucHV0LXBob25lIC5sYWJlbD0keyJQaG9uZSBOdW1iZXIifSAucmVxdWlyZWQ9JHt0cnVlfT48L2RlZXMtaW5wdXQtcGhvbmU+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IC5sYWJlbD0keyJFbWFpbCJ9IC5pbnB1dFR5cGU9JHsiZW1haWwifT48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kaXY+CiAgPC9kZWVzLWRlbW93cmFwcGVyPgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtcGhvbmUvZGVlcy1pbnB1dC1waG9uZS5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2Rpc3RfdHMyOSgpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGUyOSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMzAgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNJbnB1dFBob25lID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLWlucHV0LXBob25lIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNJbnB1dEJhc2U7CiAgbGV0IF9mb3JtYXR0ZWRQaG9uZV9kZWNvcmF0b3JzOwogIGxldCBfZm9ybWF0dGVkUGhvbmVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9mb3JtYXR0ZWRQaG9uZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsdWVfZGVjb3JhdG9yczsKICBsZXQgX3ZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BsYWNlaG9sZGVyX2RlY29yYXRvcnM7CiAgbGV0IF9wbGFjZWhvbGRlcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BsYWNlaG9sZGVyX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNJbnB1dFBob25lMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2Zvcm1hdHRlZFBob25lX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF92YWx1ZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3BsYWNlaG9sZGVyX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfX2VzRGVjb3JhdGUyOSh0aGlzLCBudWxsLCBfZm9ybWF0dGVkUGhvbmVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZm9ybWF0dGVkUGhvbmUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZvcm1hdHRlZFBob25lIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmZvcm1hdHRlZFBob25lLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5mb3JtYXR0ZWRQaG9uZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9mb3JtYXR0ZWRQaG9uZV9pbml0aWFsaXplcnMsIF9mb3JtYXR0ZWRQaG9uZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTI5KHRoaXMsIG51bGwsIF92YWx1ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2YWx1ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmFsdWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmFsdWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZhbHVlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZhbHVlX2luaXRpYWxpemVycywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMjkodGhpcywgbnVsbCwgX3BsYWNlaG9sZGVyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInBsYWNlaG9sZGVyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJwbGFjZWhvbGRlciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5wbGFjZWhvbGRlciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucGxhY2Vob2xkZXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcGxhY2Vob2xkZXJfaW5pdGlhbGl6ZXJzLCBfcGxhY2Vob2xkZXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUyOShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNJbnB1dFBob25lMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAvLyBTVEFUSUMKICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMyMTsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJJbnB1dCJdOwogICAgI2Zvcm1hdHRlZFBob25lX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczMwKHRoaXMsIF9mb3JtYXR0ZWRQaG9uZV9pbml0aWFsaXplcnMsICIiKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgZm9ybWF0dGVkUGhvbmUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNmb3JtYXR0ZWRQaG9uZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGZvcm1hdHRlZFBob25lKHZhbHVlMikgewogICAgICB0aGlzLiNmb3JtYXR0ZWRQaG9uZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzMCh0aGlzLCBfZm9ybWF0dGVkUGhvbmVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczMwKHRoaXMsIF92YWx1ZV9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3BsYWNlaG9sZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzMCh0aGlzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczMwKHRoaXMsIF9wbGFjZWhvbGRlcl9pbml0aWFsaXplcnMsICIrMSAoNTU1KSAxMjMtNDU2NyIpKTsKICAgIGdldCBwbGFjZWhvbGRlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3BsYWNlaG9sZGVyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcGxhY2Vob2xkZXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3BsYWNlaG9sZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIC4uLkRlZXNJbnB1dEJhc2UuYmFzZVN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICAvKiBQaG9uZSBpbnB1dCBzcGVjaWZpYyBzdHlsZXMgY2FuIGdvIGhlcmUgKi8KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgICAgPGRlZXMtbGFiZWwgLmxhYmVsPSR7dGhpcy5sYWJlbH0gLmRlc2NyaXB0aW9uPSR7dGhpcy5kZXNjcmlwdGlvbn0+PC9kZWVzLWxhYmVsPgogICAgICAgIDxkZWVzLWlucHV0LXRleHQKICAgICAgICAgIC52YWx1ZT0ke3RoaXMuZm9ybWF0dGVkUGhvbmV9CiAgICAgICAgICAuZGlzYWJsZWQ9JHt0aGlzLmRpc2FibGVkfQogICAgICAgICAgLnJlcXVpcmVkPSR7dGhpcy5yZXF1aXJlZH0KICAgICAgICAgIC5wbGFjZWhvbGRlcj0ke3RoaXMucGxhY2Vob2xkZXJ9CiAgICAgICAgICBAaW5wdXQ9JHsoZXZlbnQpID0+IHRoaXMuaGFuZGxlUGhvbmVJbnB1dChldmVudCl9CiAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBpZiAodGhpcy52YWx1ZSkgewogICAgICAgIHRoaXMuZm9ybWF0dGVkUGhvbmUgPSB0aGlzLmZvcm1hdFBob25lTnVtYmVyKHRoaXMudmFsdWUpOwogICAgICB9CiAgICAgIGNvbnN0IGlubmVySW5wdXQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC10ZXh0Iik7CiAgICAgIGlmIChpbm5lcklucHV0ICYmIGlubmVySW5wdXQuY2hhbmdlU3ViamVjdCkgewogICAgICAgIGlubmVySW5wdXQuY2hhbmdlU3ViamVjdC5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZVBob25lSW5wdXQoZXZlbnQpIHsKICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQ7CiAgICAgIGNvbnN0IGNsZWFuZWRWYWx1ZSA9IHRoaXMuY2xlYW5QaG9uZU51bWJlcihpbnB1dC52YWx1ZSk7CiAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0UGhvbmVOdW1iZXIoY2xlYW5lZFZhbHVlKTsKICAgICAgaWYgKGlucHV0LnZhbHVlICE9PSBmb3JtYXR0ZWQpIHsKICAgICAgICBjb25zdCBjdXJzb3JQb3NpdGlvbiA9IGlucHV0LnNlbGVjdGlvblN0YXJ0IHx8IDA7CiAgICAgICAgaW5wdXQudmFsdWUgPSBmb3JtYXR0ZWQ7CiAgICAgICAgY29uc3QgbmV3Q3Vyc29yUG9zID0gdGhpcy5jYWxjdWxhdGVDdXJzb3JQb3NpdGlvbihjbGVhbmVkVmFsdWUsIGZvcm1hdHRlZCwgY3Vyc29yUG9zaXRpb24pOwogICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKG5ld0N1cnNvclBvcywgbmV3Q3Vyc29yUG9zKTsKICAgICAgfQogICAgICB0aGlzLmZvcm1hdHRlZFBob25lID0gZm9ybWF0dGVkOwogICAgICB0aGlzLnZhbHVlID0gY2xlYW5lZFZhbHVlOwogICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgIH0KICAgIGNsZWFuUGhvbmVOdW1iZXIodmFsdWUyKSB7CiAgICAgIHJldHVybiB2YWx1ZTIucmVwbGFjZSgvXEQvZywgIiIpOwogICAgfQogICAgZm9ybWF0UGhvbmVOdW1iZXIodmFsdWUyKSB7CiAgICAgIGNvbnN0IGNsZWFuZWQgPSB0aGlzLmNsZWFuUGhvbmVOdW1iZXIodmFsdWUyKTsKICAgICAgaWYgKGNsZWFuZWQubGVuZ3RoID09PSAwKQogICAgICAgIHJldHVybiAiIjsKICAgICAgaWYgKGNsZWFuZWQubGVuZ3RoIDw9IDMpCiAgICAgICAgcmV0dXJuIGNsZWFuZWQ7CiAgICAgIGlmIChjbGVhbmVkLmxlbmd0aCA8PSA2KQogICAgICAgIHJldHVybiBgKCR7Y2xlYW5lZC5zbGljZSgwLCAzKX0pICR7Y2xlYW5lZC5zbGljZSgzKX1gOwogICAgICBpZiAoY2xlYW5lZC5sZW5ndGggPD0gMTApCiAgICAgICAgcmV0dXJuIGAoJHtjbGVhbmVkLnNsaWNlKDAsIDMpfSkgJHtjbGVhbmVkLnNsaWNlKDMsIDYpfS0ke2NsZWFuZWQuc2xpY2UoNil9YDsKICAgICAgcmV0dXJuIGArJHtjbGVhbmVkLnNsaWNlKDAsIGNsZWFuZWQubGVuZ3RoIC0gMTApfSAoJHtjbGVhbmVkLnNsaWNlKC0xMCwgLTcpfSkgJHtjbGVhbmVkLnNsaWNlKC03LCAtNCl9LSR7Y2xlYW5lZC5zbGljZSgtNCl9YDsKICAgIH0KICAgIGNhbGN1bGF0ZUN1cnNvclBvc2l0aW9uKGNsZWFuZWQsIGZvcm1hdHRlZCwgb2xkUG9zKSB7CiAgICAgIGxldCBmb3JtYXR0aW5nQ2hhcnMgPSAwOwogICAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBvbGRQb3MgJiYgaTExIDwgZm9ybWF0dGVkLmxlbmd0aDsgaTExKyspIHsKICAgICAgICBpZiAoIS9cZC8udGVzdChmb3JtYXR0ZWRbaTExXSkpIHsKICAgICAgICAgIGZvcm1hdHRpbmdDaGFycysrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gTWF0aC5taW4ob2xkUG9zICsgZm9ybWF0dGluZ0NoYXJzLCBmb3JtYXR0ZWQubGVuZ3RoKTsKICAgIH0KICAgIGdldFZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy52YWx1ZTsKICAgIH0KICAgIHNldFZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLnZhbHVlID0gdmFsdWUyOwogICAgICB0aGlzLmZvcm1hdHRlZFBob25lID0gdGhpcy5mb3JtYXRQaG9uZU51bWJlcih2YWx1ZTIpOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMzAodGhpcywgX3BsYWNlaG9sZGVyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMzAoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNJbnB1dFBob25lMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC10b2dnbGUvZGVlcy1pbnB1dC10b2dnbGUuZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmMyMiA9ICgpID0+IGIyYAogIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgdG9nZ2xlQWxsT25CdG4gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoIiN0b2dnbGUtYWxsLW9uIik7CiAgY29uc3QgdG9nZ2xlQWxsT2ZmQnRuID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjdG9nZ2xlLWFsbC1vZmYiKTsKICBjb25zdCBmZWF0dXJlVG9nZ2xlcyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiLmZlYXR1cmUtdG9nZ2xlcyBkZWVzLWlucHV0LXRvZ2dsZSIpOwogIGlmICh0b2dnbGVBbGxPbkJ0biAmJiB0b2dnbGVBbGxPZmZCdG4pIHsKICAgIHRvZ2dsZUFsbE9uQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgICBmZWF0dXJlVG9nZ2xlcy5mb3JFYWNoKCh0b2dnbGUpID0+IHsKICAgICAgICBpZiAoIXRvZ2dsZS5kaXNhYmxlZCAmJiAhdG9nZ2xlLnJlcXVpcmVkKSB7CiAgICAgICAgICB0b2dnbGUudmFsdWUgPSB0cnVlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICAgIHRvZ2dsZUFsbE9mZkJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgZmVhdHVyZVRvZ2dsZXMuZm9yRWFjaCgodG9nZ2xlKSA9PiB7CiAgICAgICAgaWYgKCF0b2dnbGUuZGlzYWJsZWQgJiYgIXRvZ2dsZS5yZXF1aXJlZCkgewogICAgICAgICAgdG9nZ2xlLnZhbHVlID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwogIH0KfX0+CiAgICA8c3R5bGU+CiAgICAgICR7aWAKICAgICAgICAuZGVtby1jb250YWluZXIgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICBnYXA6IDI0cHg7CiAgICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgICAgbWF4LXdpZHRoOiAxMjAwcHg7CiAgICAgICAgICBtYXJnaW46IDAgYXV0bzsKICAgICAgICB9CgogICAgICAgIGRlZXMtcGFuZWwgewogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgICB9CgogICAgICAgIGRlZXMtcGFuZWw6bGFzdC1jaGlsZCB7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICAgIH0KCiAgICAgICAgLnRvZ2dsZS1ncm91cCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMTZweDsKICAgICAgICB9CgogICAgICAgIC5ob3Jpem9udGFsLXRvZ2dsZXMgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGdhcDogMzJweDsKICAgICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICB9CgogICAgICAgIC5pbnRlcmFjdGl2ZS1zZWN0aW9uIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSAxNi44JSkiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICB9CgogICAgICAgIC5vdXRwdXQtdGV4dCB7CiAgICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDI2LjclKSIsICJoc2woMjEwIDQwJSA4MCUpIil9OwogICAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk4JSkiLCAiaHNsKDIxNSAyMC4yJSAxMS44JSkiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgICAgIH0KCiAgICAgICAgLnNldHRpbmdzLXNlY3Rpb24gewogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk3JSkiLCAiaHNsKDAgMCUgNyUpIil9OwogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgIH0KCiAgICAgICAgLmJ1dHRvbi1ncm91cCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICAgIH0KCiAgICAgICAgLmZlYXR1cmUtdG9nZ2xlcyB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTEuOCUpIil9OwogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNSAyMC4yJSAxNi44JSkiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgIH0KCiAgICAgICAgLnNlY3Rpb24tdGl0bGUgewogICAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgOC44JSkiLCAiaHNsKDIxMCA0MCUgOTglKSIpfTsKICAgICAgICB9CgogICAgICAgIC5kcmFnLWhpbnQgewogICAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NS4xJSkiLCAiaHNsKDAgMCUgNjMuOSUpIil9OwogICAgICAgICAgbWFyZ2luLXRvcDogOHB4OwogICAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICAgIH0KICAgICAgYH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiQmFzaWMgVG9nZ2xlIn0gLnN1YnRpdGxlPSR7IlNpbXBsZSBvbi9vZmYgdG9nZ2xlIHN3aXRjaCB3aXRoIGRyYWcgc3VwcG9ydCJ9PgogICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10b2dnbGUKICAgICAgICAgICAgLmxhYmVsPSR7IkVuYWJsZSBmZWF0dXJlIn0KICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgIC5rZXk9JHsiYmFzaWMifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CgogICAgICAgICAgPGRlZXMtaW5wdXQtdG9nZ2xlCiAgICAgICAgICAgIC5sYWJlbD0keyJBY3RpdmUgdG9nZ2xlIn0KICAgICAgICAgICAgLnZhbHVlPSR7dHJ1ZX0KICAgICAgICAgICAgLmtleT0keyJhY3RpdmUifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CgogICAgICAgICAgPGRlZXMtaW5wdXQtdG9nZ2xlCiAgICAgICAgICAgIC5sYWJlbD0keyJXaXRoIGRlc2NyaXB0aW9uIn0KICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJUaGlzIHRvZ2dsZSBoYXMgYWRkaXRpb25hbCBoZWxwZXIgdGV4dCBleHBsYWluaW5nIGl0cyBwdXJwb3NlIn0KICAgICAgICAgICAgLmtleT0keyJ3aXRoRGVzYyJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXRvZ2dsZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8cCBjbGFzcz0iZHJhZy1oaW50Ij5UaXA6IFlvdSBjYW4gZHJhZyB0aGUgdG9nZ2xlIGtub2IgdG8gc3dpdGNoIHN0YXRlczwvcD4KICAgICAgPC9kZWVzLXBhbmVsPgoKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IlRvZ2dsZSBTdGF0ZXMifSAuc3VidGl0bGU9JHsiRGlmZmVyZW50IHRvZ2dsZSBzdGF0ZXMgYW5kIGNvbmZpZ3VyYXRpb25zIn0+CiAgICAgICAgPGRpdiBjbGFzcz0idG9nZ2xlLWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWlucHV0LXRvZ2dsZQogICAgICAgICAgICAubGFiZWw9JHsiRGVmYXVsdCAob2ZmKSJ9CiAgICAgICAgICAgIC52YWx1ZT0ke2ZhbHNlfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CgogICAgICAgICAgPGRlZXMtaW5wdXQtdG9nZ2xlCiAgICAgICAgICAgIC5sYWJlbD0keyJFbmFibGVkIChvbikifQogICAgICAgICAgICAudmFsdWU9JHt0cnVlfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CgogICAgICAgICAgPGRlZXMtaW5wdXQtdG9nZ2xlCiAgICAgICAgICAgIC5sYWJlbD0keyJEaXNhYmxlZCAob2ZmKSJ9CiAgICAgICAgICAgIC52YWx1ZT0ke2ZhbHNlfQogICAgICAgICAgICAuZGlzYWJsZWQ9JHt0cnVlfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CgogICAgICAgICAgPGRlZXMtaW5wdXQtdG9nZ2xlCiAgICAgICAgICAgIC5sYWJlbD0keyJEaXNhYmxlZCAob24pIn0KICAgICAgICAgICAgLnZhbHVlPSR7dHJ1ZX0KICAgICAgICAgICAgLmRpc2FibGVkPSR7dHJ1ZX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdG9nZ2xlPgoKICAgICAgICAgIDxkZWVzLWlucHV0LXRvZ2dsZQogICAgICAgICAgICAubGFiZWw9JHsiUmVxdWlyZWQgKGFsd2F5cyBvbikifQogICAgICAgICAgICAudmFsdWU9JHt0cnVlfQogICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiVGhpcyB0b2dnbGUgY2Fubm90IGJlIHR1cm5lZCBvZmYifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJIb3Jpem9udGFsIExheW91dCJ9IC5zdWJ0aXRsZT0keyJUb2dnbGVzIGFycmFuZ2VkIGhvcml6b250YWxseSBmb3IgY29tcGFjdCBpbnRlcmZhY2VzIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iaG9yaXpvbnRhbC10b2dnbGVzIj4KICAgICAgICAgIDxkZWVzLWlucHV0LXRvZ2dsZQogICAgICAgICAgICAubGFiZWw9JHsiV2lGaSJ9CiAgICAgICAgICAgIC52YWx1ZT0ke3RydWV9CiAgICAgICAgICAgIC5sYXlvdXRNb2RlPSR7Imhvcml6b250YWwifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CgogICAgICAgICAgPGRlZXMtaW5wdXQtdG9nZ2xlCiAgICAgICAgICAgIC5sYWJlbD0keyJCbHVldG9vdGgifQogICAgICAgICAgICAudmFsdWU9JHtmYWxzZX0KICAgICAgICAgICAgLmxheW91dE1vZGU9JHsiaG9yaXpvbnRhbCJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXRvZ2dsZT4KCiAgICAgICAgICA8ZGVlcy1pbnB1dC10b2dnbGUKICAgICAgICAgICAgLmxhYmVsPSR7IkdQUyJ9CiAgICAgICAgICAgIC52YWx1ZT0ke3RydWV9CiAgICAgICAgICAgIC5sYXlvdXRNb2RlPSR7Imhvcml6b250YWwifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CgogICAgICAgICAgPGRlZXMtaW5wdXQtdG9nZ2xlCiAgICAgICAgICAgIC5sYWJlbD0keyJORkMifQogICAgICAgICAgICAudmFsdWU9JHtmYWxzZX0KICAgICAgICAgICAgLmxheW91dE1vZGU9JHsiaG9yaXpvbnRhbCJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXRvZ2dsZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgoKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IlNldHRpbmdzIEV4YW1wbGUifSAuc3VidGl0bGU9JHsiVG9nZ2xlcyBpbiBhIHR5cGljYWwgc2V0dGluZ3MgY29udGV4dCJ9PgogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzLXNlY3Rpb24iPgogICAgICAgICAgPGg0IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5Ob3RpZmljYXRpb24gU2V0dGluZ3M8L2g0PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1ncm91cCI+CiAgICAgICAgICAgIDxkZWVzLWlucHV0LXRvZ2dsZQogICAgICAgICAgICAgIC5sYWJlbD0keyJQdXNoIG5vdGlmaWNhdGlvbnMifQogICAgICAgICAgICAgIC52YWx1ZT0ke3RydWV9CiAgICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IlJlY2VpdmUgcHVzaCBub3RpZmljYXRpb25zIG9uIHlvdXIgZGV2aWNlIn0KICAgICAgICAgICAgICAua2V5PSR7InB1c2gifQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LXRvZ2dsZT4KCiAgICAgICAgICAgIDxkZWVzLWlucHV0LXRvZ2dsZQogICAgICAgICAgICAgIC5sYWJlbD0keyJFbWFpbCBub3RpZmljYXRpb25zIn0KICAgICAgICAgICAgICAudmFsdWU9JHt0cnVlfQogICAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJHZXQgaW1wb3J0YW50IHVwZGF0ZXMgdmlhIGVtYWlsIn0KICAgICAgICAgICAgICAua2V5PSR7ImVtYWlsIn0KICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CgogICAgICAgICAgICA8ZGVlcy1pbnB1dC10b2dnbGUKICAgICAgICAgICAgICAubGFiZWw9JHsiU291bmQifQogICAgICAgICAgICAgIC52YWx1ZT0ke2ZhbHNlfQogICAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJQbGF5IGEgc291bmQgZm9yIG5vdGlmaWNhdGlvbnMifQogICAgICAgICAgICAgIC5rZXk9JHsic291bmQifQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LXRvZ2dsZT4KCiAgICAgICAgICAgIDxkZWVzLWlucHV0LXRvZ2dsZQogICAgICAgICAgICAgIC5sYWJlbD0keyJWaWJyYXRpb24ifQogICAgICAgICAgICAgIC52YWx1ZT0ke3RydWV9CiAgICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IlZpYnJhdGUgZm9yIG5vdGlmaWNhdGlvbnMifQogICAgICAgICAgICAgIC5rZXk9JHsidmlicmF0aW9uIn0KICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgoKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkZlYXR1cmUgVG9nZ2xlcyJ9IC5zdWJ0aXRsZT0keyJCYXRjaCBvcGVyYXRpb25zIG9uIG11bHRpcGxlIHRvZ2dsZXMifT4KICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JvdXAiPgogICAgICAgICAgPGRlZXMtYnV0dG9uIGlkPSJ0b2dnbGUtYWxsLW9uIiB0eXBlPSJzZWNvbmRhcnkiPkVuYWJsZSBBbGw8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIGlkPSJ0b2dnbGUtYWxsLW9mZiIgdHlwZT0ic2Vjb25kYXJ5Ij5EaXNhYmxlIEFsbDwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtdG9nZ2xlcyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtZ3JvdXAiPgogICAgICAgICAgICA8ZGVlcy1pbnB1dC10b2dnbGUKICAgICAgICAgICAgICAubGFiZWw9JHsiRGFyayBNb2RlIn0KICAgICAgICAgICAgICAudmFsdWU9JHt0cnVlfQogICAgICAgICAgICAgIC5rZXk9JHsiZGFya01vZGUifQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LXRvZ2dsZT4KCiAgICAgICAgICAgIDxkZWVzLWlucHV0LXRvZ2dsZQogICAgICAgICAgICAgIC5sYWJlbD0keyJBdXRvLXNhdmUifQogICAgICAgICAgICAgIC52YWx1ZT0ke3RydWV9CiAgICAgICAgICAgICAgLmtleT0keyJhdXRvU2F2ZSJ9CiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtdG9nZ2xlPgoKICAgICAgICAgICAgPGRlZXMtaW5wdXQtdG9nZ2xlCiAgICAgICAgICAgICAgLmxhYmVsPSR7IlNwZWxsIGNoZWNrIn0KICAgICAgICAgICAgICAudmFsdWU9JHtmYWxzZX0KICAgICAgICAgICAgICAua2V5PSR7InNwZWxsQ2hlY2sifQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LXRvZ2dsZT4KCiAgICAgICAgICAgIDxkZWVzLWlucHV0LXRvZ2dsZQogICAgICAgICAgICAgIC5sYWJlbD0keyJEZXZlbG9wZXIgbW9kZSJ9CiAgICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgICAgLmtleT0keyJkZXZNb2RlIn0KICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CgogICAgICAgICAgICA8ZGVlcy1pbnB1dC10b2dnbGUKICAgICAgICAgICAgICAubGFiZWw9JHsiQmV0YSBmZWF0dXJlcyJ9CiAgICAgICAgICAgICAgLnZhbHVlPSR7ZmFsc2V9CiAgICAgICAgICAgICAgLmtleT0keyJiZXRhIn0KICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC10b2dnbGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgoKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkludGVyYWN0aXZlIEV4YW1wbGUifSAuc3VidGl0bGU9JHsiVG9nZ2xlIHRvIHNlZSB2YWx1ZSBjaGFuZ2VzIGluIHJlYWwtdGltZSJ9PgogICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10b2dnbGUKICAgICAgICAgICAgLmxhYmVsPSR7IkFpcnBsYW5lIG1vZGUifQogICAgICAgICAgICAudmFsdWU9JHtmYWxzZX0KICAgICAgICAgICAgQG5ld1ZhbHVlPSR7KGV2ZW50KSA9PiB7CiAgY29uc3Qgb3V0cHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2FpcnBsYW5lLW91dHB1dCIpOwogIGlmIChvdXRwdXQpIHsKICAgIG91dHB1dC50ZXh0Q29udGVudCA9IGBBaXJwbGFuZSBtb2RlOiAke2V2ZW50LmRldGFpbCA/ICJPTiIgOiAiT0ZGIn1gOwogIH0KfX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdG9nZ2xlPgoKICAgICAgICAgIDxkZWVzLWlucHV0LXRvZ2dsZQogICAgICAgICAgICAubGFiZWw9JHsiRG8gbm90IGRpc3R1cmIifQogICAgICAgICAgICAudmFsdWU9JHtmYWxzZX0KICAgICAgICAgICAgQG5ld1ZhbHVlPSR7KGV2ZW50KSA9PiB7CiAgY29uc3Qgb3V0cHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2RuZC1vdXRwdXQiKTsKICBpZiAob3V0cHV0KSB7CiAgICBvdXRwdXQudGV4dENvbnRlbnQgPSBgRG8gbm90IGRpc3R1cmI6ICR7ZXZlbnQuZGV0YWlsID8gIkVOQUJMRUQiIDogIkRJU0FCTEVEIn1gOwogIH0KfX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdG9nZ2xlPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJpbnRlcmFjdGl2ZS1zZWN0aW9uIj4KICAgICAgICAgIDxkaXYgaWQ9ImFpcnBsYW5lLW91dHB1dCIgY2xhc3M9Im91dHB1dC10ZXh0Ij5BaXJwbGFuZSBtb2RlOiBPRkY8L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9ImRuZC1vdXRwdXQiIGNsYXNzPSJvdXRwdXQtdGV4dCIgc3R5bGU9Im1hcmdpbi10b3A6IDhweDsiPkRvIG5vdCBkaXN0dXJiOiBESVNBQkxFRDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2Rpdj4KICA8L2RlZXMtZGVtb3dyYXBwZXI+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC10b2dnbGUvZGVlcy1pbnB1dC10b2dnbGUuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF9kaXN0X3RzMjkoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlMzAgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczMxID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzSW5wdXRUb2dnbGUgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtaW5wdXQtdG9nZ2xlIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNJbnB1dEJhc2U7CiAgbGV0IF92YWx1ZV9kZWNvcmF0b3JzOwogIGxldCBfdmFsdWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWx1ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW5wdXRUb2dnbGUyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfdmFsdWVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSldOwogICAgICBfX2VzRGVjb3JhdGUzMCh0aGlzLCBudWxsLCBfdmFsdWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmFsdWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInZhbHVlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZhbHVlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52YWx1ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF92YWx1ZV9pbml0aWFsaXplcnMsIF92YWx1ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMwKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0lucHV0VG9nZ2xlMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAvLyBTVEFUSUMKICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMyMjsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJJbnB1dCJdOwogICAgI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczMxKHRoaXMsIF92YWx1ZV9pbml0aWFsaXplcnMsIGZhbHNlKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgdmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgLyoqCiAgICAgKiBLbm9iIHBvc2l0aW9uIHRyYWNraW5nICgwID0gb2ZmLCBtYXhUcmF2ZWwgPSBvbikKICAgICAqLwogICAgY3VycmVudFggPSAoX19ydW5Jbml0aWFsaXplcnMzMSh0aGlzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpLCAwKTsKICAgIC8qKgogICAgICogRHJhZyBzdGF0ZQogICAgICovCiAgICBpc0RyYWdnaW5nID0gZmFsc2U7CiAgICBoYXNEcmFnZ2VkID0gZmFsc2U7CiAgICBzdGFydFggPSAwOwogICAgLy8gVG9nZ2xlIGRpbWVuc2lvbnMKICAgIHRyYWNrV2lkdGggPSAzNjsKICAgIHRyYWNrSGVpZ2h0ID0gMjA7CiAgICBrbm9iU2l6ZSA9IDE0OwogICAgcGFkZGluZyA9IDI7CiAgICBtYXhUcmF2ZWwgPSAxNjsKICAgIC8vIHRyYWNrV2lkdGggLSBrbm9iU2l6ZSAtIChwYWRkaW5nICogMikgLSBib3JkZXIKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmxhYmVsUG9zaXRpb24gPSAicmlnaHQiOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICAuLi5EZWVzSW5wdXRCYXNlLmJhc2VTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgKiB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQoKICAgICAgOmhvc3QgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgZm9udC1mYW1pbHk6ICR7Y3NzR2Vpc3RGb250RmFtaWx5fTsKICAgICAgfQoKICAgICAgLm1haW5jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICAgIGdhcDogOHB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS10cmFjayB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICB3aWR0aDogMzZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSAzLjklKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIG1hcmdpbi10b3A6IDFweDsKICAgICAgfQoKICAgICAgLm1haW5jb250YWluZXI6aG92ZXIgLnRvZ2dsZS10cmFjayB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNzkuOCUpIiwgImhzbCgwIDAlIDIwLjklKSIpfTsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZhbHVlXSkgLnRvZ2dsZS10cmFjayB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA1MS4yJSkiLCAiaHNsKDIxNy4yIDkxLjIlIDU5LjglKSIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgNTEuMiUpIiwgImhzbCgyMTcuMiA5MS4yJSA1OS44JSkiKX07CiAgICAgIH0KCiAgICAgIC50b2dnbGUtdHJhY2s6Zm9jdXMtdmlzaWJsZSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA1MS4yJSAvIDAuMSkiLCAiaHNsKDIxNy4yIDkxLjIlIDU5LjglIC8gMC4xKSIpfTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1rbm9iIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAycHg7CiAgICAgICAgd2lkdGg6IDE0cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDdweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNjMuOSUpIiwgImhzbCgwIDAlIDQ1LjElKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBsZWZ0IDAuMTVzIGVhc2UsIGJhY2tncm91bmQgMC4xNXMgZWFzZTsKICAgICAgICB0b3VjaC1hY3Rpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIC50b2dnbGUta25vYi5kcmFnZ2luZyB7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cyBlYXNlOwogICAgICB9CgogICAgICA6aG9zdChbdmFsdWVdKSAudG9nZ2xlLWtub2IgewogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICB9CgogICAgICAvKiBEaXNhYmxlZCBzdGF0ZSAqLwogICAgICAubWFpbmNvbnRhaW5lci5kaXNhYmxlZCB7CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtdHJhY2suZGlzYWJsZWQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NS4xJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgIH0KCiAgICAgIC8qIFJlcXVpcmVkIHN0YXRlIChsb2NrZWQgb24pICovCiAgICAgIDpob3N0KFtyZXF1aXJlZF1bdmFsdWVdKSAudG9nZ2xlLXRyYWNrIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDYxLjIlKSIsICJoc2woMjE3LjIgOTEuMiUgNDkuOCUpIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA2MS4yJSkiLCAiaHNsKDIxNy4yIDkxLjIlIDQ5LjglKSIpfTsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICB9CgogICAgICA6aG9zdChbcmVxdWlyZWRdW3ZhbHVlXSkgLnRvZ2dsZS1rbm9iIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODUlKSIsICJoc2woMCAwJSA3MCUpIil9OwogICAgICB9CgogICAgICAvKiBMYWJlbCAqLwogICAgICAubGFiZWwtY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAycHg7CiAgICAgICAgZmxleDogMTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxNSUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogY29sb3IgMC4xNXMgZWFzZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTsKICAgICAgfQoKICAgICAgLm1haW5jb250YWluZXI6aG92ZXIgLnRvZ2dsZS1sYWJlbCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTUlKSIpfTsKICAgICAgfQoKICAgICAgLm1haW5jb250YWluZXIuZGlzYWJsZWQ6aG92ZXIgLnRvZ2dsZS1sYWJlbCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxNSUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgIH0KCiAgICAgIC8qIERlc2NyaXB0aW9uICovCiAgICAgIC5kZXNjcmlwdGlvbi10ZXh0IHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NS4xJSkiLCAiaHNsKDAgMCUgNjMuOSUpIil9OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgICAgPGRpdiBjbGFzcz0ibWFpbmNvbnRhaW5lciAke3RoaXMuZGlzYWJsZWQgPyAiZGlzYWJsZWQiIDogIiJ9IiBAY2xpY2s9IiR7dGhpcy5oYW5kbGVDbGlja30iPgogICAgICAgICAgPGRpdgogICAgICAgICAgICBjbGFzcz0idG9nZ2xlLXRyYWNrICR7dGhpcy5kaXNhYmxlZCA/ICJkaXNhYmxlZCIgOiAiIn0iCiAgICAgICAgICAgIHRhYmluZGV4PSIke3RoaXMuZGlzYWJsZWQgPyAiLTEiIDogIjAifSIKICAgICAgICAgICAgQGtleWRvd249IiR7dGhpcy5oYW5kbGVLZXlkb3dufSIKICAgICAgICAgID4KICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgIGNsYXNzPSJ0b2dnbGUta25vYiIKICAgICAgICAgICAgICBzdHlsZT0ibGVmdDogJHt0aGlzLnBhZGRpbmcgKyB0aGlzLmN1cnJlbnRYfXB4OyIKICAgICAgICAgICAgICBAcG9pbnRlcmRvd249IiR7dGhpcy5vblBvaW50ZXJEb3dufSIKICAgICAgICAgICAgICBAcG9pbnRlcm1vdmU9IiR7dGhpcy5vblBvaW50ZXJNb3ZlfSIKICAgICAgICAgICAgICBAcG9pbnRlcnVwPSIke3RoaXMub25Qb2ludGVyVXB9IgogICAgICAgICAgICAgIEBwb2ludGVyY2FuY2VsPSIke3RoaXMub25Qb2ludGVyVXB9IgogICAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsLWNvbnRhaW5lciI+CiAgICAgICAgICAgICR7dGhpcy5sYWJlbCA/IGIyYDxkaXYgY2xhc3M9InRvZ2dsZS1sYWJlbCI+JHt0aGlzLmxhYmVsfTwvZGl2PmAgOiAiIn0KICAgICAgICAgICAgJHt0aGlzLmRlc2NyaXB0aW9uID8gYjJgPGRpdiBjbGFzcz0iZGVzY3JpcHRpb24tdGV4dCI+JHt0aGlzLmRlc2NyaXB0aW9ufTwvZGl2PmAgOiAiIn0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIGF3YWl0IHN1cGVyLmZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBpZiAodGhpcy5yZXF1aXJlZCAmJiAhdGhpcy52YWx1ZSkgewogICAgICAgIHRoaXMudmFsdWUgPSB0cnVlOwogICAgICB9CiAgICAgIHRoaXMuY3VycmVudFggPSB0aGlzLnZhbHVlID8gdGhpcy5tYXhUcmF2ZWwgOiAwOwogICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgIH0KICAgIC8qKgogICAgICogQ2xpY2sgaGFuZGxlciAtIHRvZ2dsZXMgdGhlIHZhbHVlCiAgICAgKi8KICAgIGFzeW5jIGhhbmRsZUNsaWNrKGV2ZW50KSB7CiAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcgfHwgdGhpcy5oYXNEcmFnZ2VkKSB7CiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHRoaXMucmVxdWlyZWQpIHsKICAgICAgICB0aGlzLmN1cnJlbnRYID0gdGhpcy5tYXhUcmF2ZWw7CiAgICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7CiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIxMSkgPT4gc2V0VGltZW91dChyMTEsIDEwKSk7CiAgICAgICAgdGhpcy5jdXJyZW50WCA9IHRoaXMubWF4VHJhdmVsIC0gMzsKICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgICBhd2FpdCBkb210b29sc19wbHVnaW5leHBvcnRzX2V4cG9ydHMuc21hcnRkZWxheS5kZWxheUZvcigxNTApOwogICAgICAgIHRoaXMuY3VycmVudFggPSB0aGlzLm1heFRyYXZlbDsKICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHRoaXMudmFsdWUgPSAhdGhpcy52YWx1ZTsKICAgICAgdGhpcy5jdXJyZW50WCA9IHRoaXMudmFsdWUgPyB0aGlzLm1heFRyYXZlbCA6IDA7CiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJuZXdWYWx1ZSIsIHsKICAgICAgICBkZXRhaWw6IHRoaXMudmFsdWUsCiAgICAgICAgYnViYmxlczogdHJ1ZQogICAgICB9KSk7CiAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMpOwogICAgICBkb210b29sc19wbHVnaW5leHBvcnRzX2V4cG9ydHMuc21hcnRkZWxheS5kZWxheUZvcigwKS50aGVuKCgpID0+IHsKICAgICAgICB0aGlzLmhhc0RyYWdnZWQgPSBmYWxzZTsKICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIFBvaW50ZXIgZG93biAtIHN0YXJ0IGRyYWdnaW5nCiAgICAgKi8KICAgIG9uUG9pbnRlckRvd24oZXZlbnQpIHsKICAgICAgaWYgKHRoaXMucmVxdWlyZWQgfHwgdGhpcy5kaXNhYmxlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlOwogICAgICB0aGlzLnN0YXJ0WCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLmN1cnJlbnRYOwogICAgICBldmVudC50YXJnZXQuc2V0UG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTsKICAgIH0KICAgIC8qKgogICAgICogUG9pbnRlciBtb3ZlIC0gdHJhY2sgZHJhZyBwb3NpdGlvbgogICAgICovCiAgICBvblBvaW50ZXJNb3ZlKGV2ZW50KSB7CiAgICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgbmV3WCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXJ0WDsKICAgICAgdGhpcy5oYXNEcmFnZ2VkID0gdHJ1ZTsKICAgICAgY29uc3QgdG9nZ2xlS25vYiA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnRvZ2dsZS1rbm9iIik7CiAgICAgIGlmICh0b2dnbGVLbm9iKSB7CiAgICAgICAgdG9nZ2xlS25vYi5jbGFzc0xpc3QuYWRkKCJkcmFnZ2luZyIpOwogICAgICB9CiAgICAgIHRoaXMuY3VycmVudFggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihuZXdYLCB0aGlzLm1heFRyYXZlbCkpOwogICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgIH0KICAgIC8qKgogICAgICogUG9pbnRlciB1cCAtIGNvbXBsZXRlIGRyYWcgYW5kIHNuYXAgdG8gbmVhcmVzdCBzaWRlCiAgICAgKi8KICAgIG9uUG9pbnRlclVwKGV2ZW50KSB7CiAgICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKQogICAgICAgIHJldHVybjsKICAgICAgZXZlbnQudGFyZ2V0LnJlbGVhc2VQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpOwogICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTsKICAgICAgaWYgKCF0aGlzLmhhc0RyYWdnZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgdG9nZ2xlS25vYiA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnRvZ2dsZS1rbm9iIik7CiAgICAgIGlmICh0b2dnbGVLbm9iKSB7CiAgICAgICAgdG9nZ2xlS25vYi5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnZ2luZyIpOwogICAgICB9CiAgICAgIGNvbnN0IG1pZHBvaW50ID0gdGhpcy5tYXhUcmF2ZWwgLyAyOwogICAgICB0aGlzLnZhbHVlID0gdGhpcy5jdXJyZW50WCA+IG1pZHBvaW50OwogICAgICB0aGlzLmN1cnJlbnRYID0gdGhpcy52YWx1ZSA/IHRoaXMubWF4VHJhdmVsIDogMDsKICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm5ld1ZhbHVlIiwgewogICAgICAgIGRldGFpbDogdGhpcy52YWx1ZSwKICAgICAgICBidWJibGVzOiB0cnVlCiAgICAgIH0pKTsKICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgIGRvbXRvb2xzX3BsdWdpbmV4cG9ydHNfZXhwb3J0cy5zbWFydGRlbGF5LmRlbGF5Rm9yKDApLnRoZW4oKCkgPT4gewogICAgICAgIHRoaXMuaGFzRHJhZ2dlZCA9IGZhbHNlOwogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogU3luYyBrbm9iIHBvc2l0aW9uIHdoZW4gdmFsdWUgaXMgY2hhbmdlZCBleHRlcm5hbGx5CiAgICAgKi8KICAgIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoInZhbHVlIikgJiYgIXRoaXMuaXNEcmFnZ2luZyAmJiAhdGhpcy5oYXNEcmFnZ2VkKSB7CiAgICAgICAgdGhpcy5jdXJyZW50WCA9IHRoaXMudmFsdWUgPyB0aGlzLm1heFRyYXZlbCA6IDA7CiAgICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogS2V5Ym9hcmQgc3VwcG9ydAogICAgICovCiAgICBoYW5kbGVLZXlkb3duKGV2ZW50KSB7CiAgICAgIGlmIChldmVudC5rZXkgPT09ICIgIiB8fCBldmVudC5rZXkgPT09ICJFbnRlciIpIHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMuaGFuZGxlQ2xpY2soZXZlbnQpOwogICAgICB9CiAgICB9CiAgICAvLyBEZWVzSW5wdXRCYXNlIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgogICAgZ2V0VmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgfQogICAgc2V0VmFsdWUodmFsdWVBcmcpIHsKICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlQXJnOwogICAgfQogICAgZm9jdXMoKSB7CiAgICAgIGNvbnN0IHRyYWNrMiA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnRvZ2dsZS10cmFjayIpOwogICAgICBpZiAodHJhY2syKSB7CiAgICAgICAgdHJhY2syLmZvY3VzKCk7CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMzEoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNJbnB1dFRvZ2dsZTIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtdHlwZWxpc3QvZGVlcy1pbnB1dC10eXBlbGlzdC5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkZW1vRnVuYzIzID0gKCkgPT4gYjJgCiAgPGRlZXMtZGVtb3dyYXBwZXI+CiAgICA8c3R5bGU+CiAgICAgICR7aWAKICAgICAgICAuZGVtby1jb250YWluZXIgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICBnYXA6IDI0cHg7CiAgICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgICAgbWF4LXdpZHRoOiAxMjAwcHg7CiAgICAgICAgICBtYXJnaW46IDAgYXV0bzsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmlucHV0LWdyb3VwIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgIH0KCiAgICAgICAgLmhvcml6b250YWwtZ3JvdXAgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGdhcDogMjRweDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuaW5mby1ib3ggewogICAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAjZTNmMmZkOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgY29sb3I6ICMxOTc2ZDI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIEBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsKICAgICAgICAgIC5pbmZvLWJveCB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICMxZTNhNWY7CiAgICAgICAgICAgIGNvbG9yOiAjOTBjYWY5OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgYH0KICAgIDwvc3R5bGU+CiAgICAKICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IkJhc2ljIFR5cGUgTGlzdCJ9IC5zdWJ0aXRsZT0keyJBZGQgYW5kIHJlbW92ZSBpdGVtcyBmcm9tIGEgbGlzdCJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWlucHV0LXR5cGVsaXN0CiAgICAgICAgICAgIC5sYWJlbD0keyJUYWdzIn0KICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IkFkZCB0YWdzIGJ5IHR5cGluZyBhbmQgcHJlc3NpbmcgRW50ZXIifQogICAgICAgICAgICAudmFsdWU9JHtbImphdmFzY3JpcHQiLCAidHlwZXNjcmlwdCIsICJ3ZWItY29tcG9uZW50cyJdfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10eXBlbGlzdD4KCiAgICAgICAgICA8ZGVlcy1pbnB1dC10eXBlbGlzdAogICAgICAgICAgICAubGFiZWw9JHsiVGVhbSBNZW1iZXJzIn0KICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IkFkZCBlbWFpbCBhZGRyZXNzZXMgb2YgdGVhbSBtZW1iZXJzIn0KICAgICAgICAgICAgLnZhbHVlPSR7WyJhbGljZUBleGFtcGxlLmNvbSIsICJib2JAZXhhbXBsZS5jb20iXX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdHlwZWxpc3Q+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJTa2lsbHMgJiBLZXl3b3JkcyJ9IC5zdWJ0aXRsZT0keyJNYW5hZ2UgbGlzdHMgb2Ygc2tpbGxzIGFuZCBrZXl3b3JkcyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWlucHV0LXR5cGVsaXN0CiAgICAgICAgICAgIC5sYWJlbD0keyJZb3VyIFNraWxscyJ9CiAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJMaXN0IHlvdXIgcHJvZmVzc2lvbmFsIHNraWxscyJ9CiAgICAgICAgICAgIC52YWx1ZT0ke1siSFRNTCIsICJDU1MiLCAiSmF2YVNjcmlwdCIsICJOb2RlLmpzIiwgIlJlYWN0Il19CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXR5cGVsaXN0PgoKICAgICAgICAgIDxkaXYgY2xhc3M9Imhvcml6b250YWwtZ3JvdXAiPgogICAgICAgICAgPGRlZXMtaW5wdXQtdHlwZWxpc3QKICAgICAgICAgICAgLmxhYmVsPSR7IkNhdGVnb3JpZXMifQogICAgICAgICAgICAubGF5b3V0TW9kZT0keyJob3Jpem9udGFsIn0KICAgICAgICAgICAgLnZhbHVlPSR7WyJUZWNobm9sb2d5IiwgIkRlc2lnbiIsICJCdXNpbmVzcyJdfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10eXBlbGlzdD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtdHlwZWxpc3QKICAgICAgICAgICAgLmxhYmVsPSR7IktleXdvcmRzIn0KICAgICAgICAgICAgLmxheW91dE1vZGU9JHsiaG9yaXpvbnRhbCJ9CiAgICAgICAgICAgIC52YWx1ZT0ke1siaW5ub3ZhdGlvbiIsICJzdGFydHVwIiwgImdyb3d0aCJdfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10eXBlbGlzdD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IlJlcXVpcmVkICYgRGlzYWJsZWQgU3RhdGVzIn0gLnN1YnRpdGxlPSR7IkRpZmZlcmVudCBpbnB1dCBzdGF0ZXMgZm9yIHZhbGlkYXRpb24ifT4KICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10eXBlbGlzdAogICAgICAgICAgICAubGFiZWw9JHsiUHJvamVjdCBEZXBlbmRlbmNpZXMifQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiTGlzdCBhbGwgcmVxdWlyZWQgbnBtIHBhY2thZ2VzIn0KICAgICAgICAgICAgLnJlcXVpcmVkPSR7dHJ1ZX0KICAgICAgICAgICAgLnZhbHVlPSR7WyJAZGVzaWduLmVzdGF0ZS9kZWVzLWVsZW1lbnQiLCAiQGRlc2lnbi5lc3RhdGUvZGVlcy1kb210b29scyJdfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10eXBlbGlzdD4KCiAgICAgICAgICA8ZGVlcy1pbnB1dC10eXBlbGlzdAogICAgICAgICAgICAubGFiZWw9JHsiU3lzdGVtIFRhZ3MifQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiVGhlc2UgdGFncyBhcmUgbWFuYWdlZCBieSB0aGUgc3lzdGVtIn0KICAgICAgICAgICAgLmRpc2FibGVkPSR7dHJ1ZX0KICAgICAgICAgICAgLnZhbHVlPSR7WyJzeXN0ZW0iLCAicHJvdGVjdGVkIiwgInJlYWRvbmx5Il19CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXR5cGVsaXN0PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiQXJ0aWNsZSBQdWJsaXNoaW5nIEZvcm0ifSAuc3VidGl0bGU9JHsiQ29tcGxldGUgZm9ybSB3aXRoIHRhZyBtYW5hZ2VtZW50In0+CiAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgLmxhYmVsPSR7IkFydGljbGUgVGl0bGUifSAucmVxdWlyZWQ9JHt0cnVlfT48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgCiAgICAgICAgICAgIC5sYWJlbD0keyJTdW1tYXJ5In0gCiAgICAgICAgICAgIC5pbnB1dFR5cGU9JHsidGV4dGFyZWEifQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiQnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGFydGljbGUifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgPGRlZXMtaW5wdXQtdHlwZWxpc3QKICAgICAgICAgICAgLmxhYmVsPSR7IlRhZ3MifQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiQWRkIHJlbGV2YW50IHRhZ3MgZm9yIGJldHRlciBkaXNjb3ZlcmFiaWxpdHkifQogICAgICAgICAgICAudmFsdWU9JHtbInR1dG9yaWFsIiwgIndlYi1kZXZlbG9wbWVudCJdfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10eXBlbGlzdD4KICAgICAgICAgIDxkZWVzLWlucHV0LXR5cGVsaXN0CiAgICAgICAgICAgIC5sYWJlbD0keyJDby1BdXRob3JzIn0KICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7IkFkZCBlbWFpbCBhZGRyZXNzZXMgb2YgY28tYXV0aG9ycyJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXR5cGVsaXN0PgogICAgICAgIDwvZGVlcy1mb3JtPgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9ImluZm8tYm94Ij4KICAgICAgICAgIDxzdHJvbmc+VGlwOjwvc3Ryb25nPiBUeXBlIGEgdmFsdWUgYW5kIHByZXNzIEVudGVyIHRvIGFkZCBpdCB0byB0aGUgbGlzdC4gQ2xpY2sgb24gYW55IGl0ZW0gdG8gcmVtb3ZlIGl0LgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2Rpdj4KICA8L2RlZXMtZGVtb3dyYXBwZXI+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC10eXBlbGlzdC9kZWVzLWlucHV0LXR5cGVsaXN0LmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfZGlzdF90czI5KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTMxID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMzMiA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0lucHV0VHlwZWxpc3QgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtaW5wdXQtdHlwZWxpc3QiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0lucHV0QmFzZTsKICBsZXQgX3ZhbHVlX2RlY29yYXRvcnM7CiAgbGV0IF92YWx1ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pbnB1dFZhbHVlX2RlY29yYXRvcnM7CiAgbGV0IF9pbnB1dFZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW5wdXRWYWx1ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW5wdXRUeXBlbGlzdDIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF92YWx1ZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfaW5wdXRWYWx1ZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGUzMSh0aGlzLCBudWxsLCBfdmFsdWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmFsdWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInZhbHVlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZhbHVlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52YWx1ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF92YWx1ZV9pbml0aWFsaXplcnMsIF92YWx1ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMxKHRoaXMsIG51bGwsIF9pbnB1dFZhbHVlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlucHV0VmFsdWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImlucHV0VmFsdWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaW5wdXRWYWx1ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaW5wdXRWYWx1ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pbnB1dFZhbHVlX2luaXRpYWxpemVycywgX2lucHV0VmFsdWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNJbnB1dFR5cGVsaXN0MiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMjM7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiSW5wdXQiXTsKICAgICN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMzMih0aGlzLCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCBbXSk7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IHZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy4jdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB2YWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpbnB1dFZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzMih0aGlzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczMyKHRoaXMsIF9pbnB1dFZhbHVlX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBpbnB1dFZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy4jaW5wdXRWYWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlucHV0VmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lucHV0VmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgLi4uRGVlc0lucHV0QmFzZS5iYXNlU3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzMzMiLCAiI2ZmZiIpfTsKICAgICAgfQogICAgICAubWFpbmJveCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmFmYWZhIiwgIiMyMjIyMjIiKX07CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBib3JkZXItdG9wOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiMXB4IHNvbGlkICNDQ0MiLCAiMXB4IHNvbGlkICNmZmZmZmYxMCIpfTsKICAgICAgICBib3JkZXItYm90dG9tOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiMXB4IHNvbGlkICNDQ0MiLCAiMXB4IHNvbGlkICMyMjIiKX07CiAgICAgICAgYm9yZGVyLXJpZ2h0OiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiMXB4IHNvbGlkICNDQ0MiLCAiMXB4IHNvbGlkICNmZmZmZmYxMCIpfTsKICAgICAgICBib3JkZXItbGVmdDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIjFweCBzb2xpZCAjQ0NDIiwgIjFweCBzb2xpZCAjZmZmZmZmMTAiKX07CiAgICAgICAgYm94LXNoYWRvdzogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIjBweCAxcHggNHB4IHJnYmEoMCwwLDAsMC4zKSIsICJub25lIil9OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgLm1haW5ib3g6aG92ZXIgewogICAgICAgIGZpbHRlcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImJyaWdodG5lc3MoMC45OCkiLCAiYnJpZ2h0bmVzcygxLjA1KSIpfTsKICAgICAgfQogICAgICAKICAgICAgLm1haW5ib3g6Zm9jdXMtd2l0aGluIHsKICAgICAgICBvdXRsaW5lOiAycHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDY5ZjIiLCAiIzAwODRmZiIpfTsKICAgICAgICBvdXRsaW5lLW9mZnNldDogLTJweDsKICAgICAgfQoKICAgICAgLnRhZ3MgewogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICAubm90YWdzIHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOTk5IiwgIiM2NjYiKX07CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQoKICAgICAgaW5wdXQgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmNWY1ZjUiLCAiIzE4MTgxOCIpfTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICBwYWRkaW5nOiAwcHggMTZweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGxpbmUtaGVpZ2h0OiAzMnB4OwogICAgICAgIGhlaWdodDogMHB4OwogICAgICAgIHRyYW5zaXRpb246IGhlaWdodCAwLjJzOwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2UwZTBlMCIsICIjMzMzIil9OwogICAgICB9CgogICAgICBpbnB1dDpmb2N1cyB7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmFmYWZhIiwgIiMxYTFhMWEiKX07CiAgICAgIH0KICAgICAgCiAgICAgIGlucHV0OjpwbGFjZWhvbGRlciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOTk5IiwgIiM2NjYiKX07CiAgICAgIH0KCiAgICAgIC50YWcgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U4ZjVlOSIsICIjMmQzYTJkIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzJlN2QzMiIsICIjODFjNzg0Iil9OwogICAgICAgIHBhZGRpbmc6IDRweCAxMHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBtYXJnaW46IDNweDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4yczsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2M4ZTZjOSIsICIjMWI1ZTIwIil9OwogICAgICB9CiAgICAgIAogICAgICAudGFnOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2M4ZTZjOSIsICIjM2Q0ZjNkIil9OwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgICAgfQoKICAgICAgLnRhZyAucmVtb3ZlIHsKICAgICAgICBtYXJnaW4tbGVmdDogOHB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzOwogICAgICB9CgogICAgICAudGFnIC5yZW1vdmU6aG92ZXIgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjYzYyODI4IiwgIiNlZjUzNTAiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC8qIERpc2FibGVkIHN0YXRlICovCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIC5tYWluYm94IHsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgfQogICAgICAKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgLnRhZ3MgewogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIC50YWcgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICAgIAogICAgICA6aG9zdChbZGlzYWJsZWRdKSBpbnB1dCB7CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YwZjBmMCIsICIjMWExYTFhIil9OwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImlucHV0LXdyYXBwZXIiPgogICAgICAgIDxkZWVzLWxhYmVsIC5sYWJlbD0ke3RoaXMubGFiZWx9IC5kZXNjcmlwdGlvbj0ke3RoaXMuZGVzY3JpcHRpb259PjwvZGVlcy1sYWJlbD4KICAgICAgICA8ZGl2IGNsYXNzPSJtYWluYm94Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9InRhZ3MiIEBjbGljaz0keygpID0+IHsKICAgICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiaW5wdXQiKS5mb2N1cygpOwogICAgICB9fT4KICAgICAgICAgICAgJHt0aGlzLnZhbHVlLmxlbmd0aCA9PT0gMCA/IGIyYDxkaXYgY2xhc3M9Im5vdGFncyI+Tm8gdGFncyB5ZXQ8L2Rpdj5gIDogdGhpcy52YWx1ZS5tYXAoKHRhZykgPT4gYjJgCiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhZyI+CiAgICAgICAgICAgICAgICAgICAgICAke3RhZ30KICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJyZW1vdmUiIEBjbGljaz0keyhlMTEpID0+IHsKICAgICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgdGhpcy5yZW1vdmVUYWcodGFnKTsKICAgICAgfX0+w5c8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICBgKX0KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGlucHV0CiAgICAgICAgICAgIHR5cGU9InRleHQiCiAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJUeXBlLCBwcmVzcyBFbnRlciB0byBhZGQgaXQuLi4iCiAgICAgICAgICAgIC52YWx1ZT0ke3RoaXMuaW5wdXRWYWx1ZX0KICAgICAgICAgICAgQGlucHV0PSR7KGUxMSkgPT4gewogICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IGUxMS50YXJnZXQudmFsdWU7CiAgICAgIH19CiAgICAgICAgICAgIEBrZXlkb3duPSR7KGUxMSkgPT4gewogICAgICAgIGlmIChlMTEua2V5ID09PSAiRW50ZXIiICYmIHRoaXMuaW5wdXRWYWx1ZS50cmltKCkpIHsKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgdGhpcy5hZGRUYWcodGhpcy5pbnB1dFZhbHVlLnRyaW0oKSk7CiAgICAgICAgfQogICAgICB9fQogICAgICAgICAgICAuZGlzYWJsZWQ9JHt0aGlzLmRpc2FibGVkfQogICAgICAgICAgLz4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYWRkVGFnKHRhZykgewogICAgICBpZiAoIXRoaXMudmFsdWUuaW5jbHVkZXModGFnKSkgewogICAgICAgIHRoaXMudmFsdWUgPSBbLi4udGhpcy52YWx1ZSwgdGFnXTsKICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSAiIjsKICAgICAgICB0aGlzLmNoYW5nZVN1YmplY3QubmV4dCh0aGlzKTsKICAgICAgfQogICAgfQogICAgcmVtb3ZlVGFnKHRhZykgewogICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIoKHQ5KSA9PiB0OSAhPT0gdGFnKTsKICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICB9CiAgICBnZXRWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMudmFsdWU7CiAgICB9CiAgICBzZXRWYWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlMjsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczMyKHRoaXMsIF9pbnB1dFZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMzIoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNJbnB1dFR5cGVsaXN0MiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC10YWdzL2RlZXMtaW5wdXQtdGFncy5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBfYTM7CnZhciBkZW1vRnVuYzI0ID0gKCkgPT4gYjIoX2EzIHx8IChfYTMgPSBfX3RlbXBsYXRlKFsiXG4gIDxkZWVzLWRlbW93cmFwcGVyPlxuICAgIDxzdHlsZT5cbiAgICAgICIsICdcbiAgICA8L3N0eWxlPlxuICAgIFxuICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj5cbiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0nLCAiIC5zdWJ0aXRsZT0iLCAiPlxuICAgICAgICA8ZGVlcy1pbnB1dC10YWdzXG4gICAgICAgICAgLmxhYmVsPSIsICJcbiAgICAgICAgICAucGxhY2Vob2xkZXI9IiwgIlxuICAgICAgICAgIC52YWx1ZT0iLCAiXG4gICAgICAgICAgLmRlc2NyaXB0aW9uPSIsICJcbiAgICAgICAgPjwvZGVlcy1pbnB1dC10YWdzPlxuICAgICAgPC9kZWVzLXBhbmVsPlxuXG4gICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9IiwgIiAuc3VidGl0bGU9IiwgIj5cbiAgICAgICAgPGRlZXMtaW5wdXQtdGFnc1xuICAgICAgICAgIC5sYWJlbD0iLCAiXG4gICAgICAgICAgLnBsYWNlaG9sZGVyPSIsICJcbiAgICAgICAgICAuc3VnZ2VzdGlvbnM9IiwgIlxuICAgICAgICAgIC52YWx1ZT0iLCAiXG4gICAgICAgICAgLmRlc2NyaXB0aW9uPSIsICJcbiAgICAgICAgPjwvZGVlcy1pbnB1dC10YWdzPlxuICAgICAgPC9kZWVzLXBhbmVsPlxuXG4gICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9IiwgIiAuc3VidGl0bGU9IiwgJz5cbiAgICAgICAgPGRpdiBjbGFzcz0iZ3JpZC1sYXlvdXQiPlxuICAgICAgICAgIDxkZWVzLWlucHV0LXRhZ3NcbiAgICAgICAgICAgIC5sYWJlbD0nLCAiXG4gICAgICAgICAgICAucGxhY2Vob2xkZXI9IiwgIlxuICAgICAgICAgICAgLm1heFRhZ3M9IiwgIlxuICAgICAgICAgICAgLnZhbHVlPSIsICJcbiAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0iLCAiXG4gICAgICAgICAgPjwvZGVlcy1pbnB1dC10YWdzPlxuICAgICAgICAgIFxuICAgICAgICAgIDxkZWVzLWlucHV0LXRhZ3NcbiAgICAgICAgICAgIC5sYWJlbD0iLCAiXG4gICAgICAgICAgICAucGxhY2Vob2xkZXI9IiwgIlxuICAgICAgICAgICAgLm1heFRhZ3M9IiwgIlxuICAgICAgICAgICAgLnN1Z2dlc3Rpb25zPSIsICJcbiAgICAgICAgICAgIC52YWx1ZT0iLCAiXG4gICAgICAgICAgICAuZGVzY3JpcHRpb249IiwgIlxuICAgICAgICAgID48L2RlZXMtaW5wdXQtdGFncz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2RlZXMtcGFuZWw+XG5cbiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0iLCAiIC5zdWJ0aXRsZT0iLCAiPlxuICAgICAgICA8ZGVlcy1pbnB1dC10YWdzXG4gICAgICAgICAgLmxhYmVsPSIsICJcbiAgICAgICAgICAucGxhY2Vob2xkZXI9IiwgIlxuICAgICAgICAgIC5yZXF1aXJlZD0iLCAiXG4gICAgICAgICAgLmRlc2NyaXB0aW9uPSIsICJcbiAgICAgICAgPjwvZGVlcy1pbnB1dC10YWdzPlxuICAgICAgPC9kZWVzLXBhbmVsPlxuXG4gICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9IiwgIiAuc3VidGl0bGU9IiwgIj5cbiAgICAgICAgPGRlZXMtaW5wdXQtdGFnc1xuICAgICAgICAgIC5sYWJlbD0iLCAiXG4gICAgICAgICAgLnZhbHVlPSIsICJcbiAgICAgICAgICAuZGlzYWJsZWQ9IiwgIlxuICAgICAgICAgIC5kZXNjcmlwdGlvbj0iLCAiXG4gICAgICAgID48L2RlZXMtaW5wdXQtdGFncz5cbiAgICAgIDwvZGVlcy1wYW5lbD5cblxuICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSIsICIgLnN1YnRpdGxlPSIsICI+XG4gICAgICAgIDxkZWVzLWZvcm0+XG4gICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dFxuICAgICAgICAgICAgLmxhYmVsPSIsICJcbiAgICAgICAgICAgIC5wbGFjZWhvbGRlcj0iLCAiXG4gICAgICAgICAgICAucmVxdWlyZWQ9IiwgIlxuICAgICAgICAgICAgLmtleT0iLCAnXG4gICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PlxuICAgICAgICAgIFxuICAgICAgICAgIDxkaXYgY2xhc3M9ImdyaWQtbGF5b3V0Ij5cbiAgICAgICAgICAgIDxkZWVzLWlucHV0LXRhZ3NcbiAgICAgICAgICAgICAgLmxhYmVsPScsICJcbiAgICAgICAgICAgICAgLnBsYWNlaG9sZGVyPSIsICJcbiAgICAgICAgICAgICAgLnJlcXVpcmVkPSIsICJcbiAgICAgICAgICAgICAgLmtleT0iLCAiXG4gICAgICAgICAgICAgIC5zdWdnZXN0aW9ucz0iLCAiXG4gICAgICAgICAgICA+PC9kZWVzLWlucHV0LXRhZ3M+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkZWVzLWlucHV0LXRhZ3NcbiAgICAgICAgICAgICAgLmxhYmVsPSIsICJcbiAgICAgICAgICAgICAgLnBsYWNlaG9sZGVyPSIsICJcbiAgICAgICAgICAgICAgLmtleT0iLCAiXG4gICAgICAgICAgICAgIC5tYXhUYWdzPSIsICJcbiAgICAgICAgICAgICAgLnN1Z2dlc3Rpb25zPSIsICJcbiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtdGFncz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBcbiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0XG4gICAgICAgICAgICAubGFiZWw9IiwgIlxuICAgICAgICAgICAgLmlucHV0VHlwZT0iLCAiXG4gICAgICAgICAgICAucGxhY2Vob2xkZXI9IiwgIlxuICAgICAgICAgICAgLmtleT0iLCAiXG4gICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PlxuICAgICAgICAgIFxuICAgICAgICAgIDxkZWVzLWZvcm0tc3VibWl0IC50ZXh0PSIsICI+PC9kZWVzLWZvcm0tc3VibWl0PlxuICAgICAgICA8L2RlZXMtZm9ybT5cbiAgICAgIDwvZGVlcy1wYW5lbD5cblxuICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSIsICIgLnN1YnRpdGxlPSIsICc+XG4gICAgICAgIDxkZWVzLWlucHV0LXRhZ3NcbiAgICAgICAgICBpZD0iaW50ZXJhY3RpdmUtdGFncyJcbiAgICAgICAgICAubGFiZWw9JywgIlxuICAgICAgICAgIC5wbGFjZWhvbGRlcj0iLCAiXG4gICAgICAgICAgLnN1Z2dlc3Rpb25zPSIsICJcbiAgICAgICAgICBAY2hhbmdlPSIsIGAKICAgICAgICA+PC9kZWVzLWlucHV0LXRhZ3M+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0idGFnLXByZXZpZXciIGlkPSJ0YWdzLXByZXZpZXciPgogICAgICAgICAgPGVtIHN0eWxlPSJjb2xvcjogIzk5OTsiPk5vIHRhZ3MgYWRkZWQgeWV0Li4uPC9lbT4KICAgICAgICA8L2Rpdj4KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJvdXRwdXQtcHJldmlldyIgaWQ9InRhZ3MtanNvbiI+CiAgICAgICAgICA8ZW0+SlNPTiBvdXRwdXQgd2lsbCBhcHBlYXIgaGVyZS4uLjwvZW0+CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgIC8vIFVwZGF0ZSBKU09OIHByZXZpZXcKICAgICAgICAgIGNvbnN0IHRhZ3NJbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNpbnRlcmFjdGl2ZS10YWdzJyk7CiAgICAgICAgICB0YWdzSW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGpzb25QcmV2aWV3ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RhZ3MtanNvbicpOwogICAgICAgICAgICBpZiAoanNvblByZXZpZXcpIHsKICAgICAgICAgICAgICBqc29uUHJldmlldy50ZXh0Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KGUuZGV0YWlsLnZhbHVlLCBudWxsLCAyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgPFwvc2NyaXB0PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2Rpdj4KICA8L2RlZXMtZGVtb3dyYXBwZXI+CmBdKSksIGlgCiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICAgIG1heC13aWR0aDogMTIwMHB4OwogICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGRlZXMtcGFuZWwgewogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZGVlcy1wYW5lbDpsYXN0LWNoaWxkIHsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5ncmlkLWxheW91dCB7CiAgICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOwogICAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICBAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHsKICAgICAgICAgIC5ncmlkLWxheW91dCB7CiAgICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAub3V0cHV0LXByZXZpZXcgewogICAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAjZjNmNGY2OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgY29sb3I6ICMzNzQxNTE7CiAgICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgfQogICAgICAgIAogICAgICAgIEBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsKICAgICAgICAgIC5vdXRwdXQtcHJldmlldyB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICMyYzJjMmM7CiAgICAgICAgICAgIGNvbG9yOiAjZTRlNGU3OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAudGFnLXByZXZpZXcgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICAgIGdhcDogOHB4OwogICAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICAgIGJhY2tncm91bmQ6ICNmOWZhZmI7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICBtaW4taGVpZ2h0OiA0MHB4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewogICAgICAgICAgLnRhZy1wcmV2aWV3IHsKICAgICAgICAgICAgYmFja2dyb3VuZDogIzFmMjkzNzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnRhZy1wcmV2aWV3LWl0ZW0gewogICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgcGFkZGluZzogNHB4IDEycHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAjZTBlN2ZmOwogICAgICAgICAgY29sb3I6ICM0MzM4Y2E7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgICAudGFnLXByZXZpZXctaXRlbSB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICMzMTJlODE7CiAgICAgICAgICAgIGNvbG9yOiAjYzdkMmZlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgYCwgIjEuIEJhc2ljIFRhZ3MgSW5wdXQiLCAiU2ltcGxlIHRhZyBpbnB1dCB3aXRoIGNvbW1vbiBwcm9ncmFtbWluZyBsYW5ndWFnZXMiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2VzIiwgIkFkZCBhIGxhbmd1YWdlLi4uIiwgWyJKYXZhU2NyaXB0IiwgIlR5cGVTY3JpcHQiLCAiUHl0aG9uIiwgIkdvIl0sICJQcmVzcyBFbnRlciBvciBjb21tYSB0byBhZGQgdGFncyIsICIyLiBUYWdzIHdpdGggU3VnZ2VzdGlvbnMiLCAiQXV0by1jb21wbGV0ZSBzdWdnZXN0aW9ucyBmb3IgZmFzdGVyIGlucHV0IiwgIlRlY2ggU3RhY2siLCAiVHlwZSB0byBzZWUgc3VnZ2VzdGlvbnMuLi4iLCBbCiAgIlJlYWN0IiwKICAiVnVlIiwKICAiQW5ndWxhciIsCiAgIlN2ZWx0ZSIsCiAgIkxpdCIsCiAgIk5leHQuanMiLAogICJOdXh0IiwKICAiU3ZlbHRlS2l0IiwKICAiTm9kZS5qcyIsCiAgIkRlbm8iLAogICJCdW4iLAogICJFeHByZXNzIiwKICAiRmFzdGlmeSIsCiAgIk5lc3QuanMiLAogICJLb2EiLAogICJNb25nb0RCIiwKICAiUG9zdGdyZVNRTCIsCiAgIlJlZGlzIiwKICAiTXlTUUwiLAogICJTUUxpdGUiLAogICJDYXNzYW5kcmEiLAogICJEb2NrZXIiLAogICJLdWJlcm5ldGVzIiwKICAiQVdTIiwKICAiQXp1cmUiLAogICJHQ1AiLAogICJWZXJjZWwiLAogICJOZXRsaWZ5IgpdLCBbIlJlYWN0IiwgIk5vZGUuanMiLCAiUG9zdGdyZVNRTCIsICJEb2NrZXIiXSwgIlN0YXJ0IHR5cGluZyB0byBzZWUgc3VnZ2VzdGlvbnMgZnJvbSBwb3B1bGFyIHRlY2hub2xvZ2llcyIsICIzLiBMaW1pdGVkIFRhZ3MiLCAiUmVzdHJpY3QgdGhlIG51bWJlciBvZiB0YWdzIHVzZXJzIGNhbiBhZGQiLCAiVG9wIDMgU2tpbGxzIiwgIkFkZCB1cCB0byAzIHNraWxscy4uLiIsIDMsIFsiRGVzaWduIiwgIkRldmVsb3BtZW50Il0sICJNYXhpbXVtIDMgdGFncyBhbGxvd2VkIiwgIkNhdGVnb3JpZXMgKE1heCA1KSIsICJTZWxlY3QgY2F0ZWdvcmllcy4uLiIsIDUsIFsiQmxvZyIsICJUdXRvcmlhbCIsICJOZXdzIiwgIlJldmlldyIsICJHdWlkZSIsICJDYXNlIFN0dWR5IiwgIkludGVydmlldyJdLCBbIlR1dG9yaWFsIiwgIkd1aWRlIl0sICJDaG9vc2UgdXAgdG8gNSBjYXRlZ29yaWVzIiwgIjQuIFJlcXVpcmVkICYgVmFsaWRhdGlvbiIsICJUYWdzIGlucHV0IHdpdGggdmFsaWRhdGlvbiByZXF1aXJlbWVudHMiLCAiUHJvamVjdCBUYWdzIiwgIkFkZCBhdCBsZWFzdCBvbmUgdGFnLi4uIiwgdHJ1ZSwgIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQgLSBhZGQgYXQgbGVhc3Qgb25lIHRhZyIsICI1LiBEaXNhYmxlZCBTdGF0ZSIsICJSZWFkLW9ubHkgdGFncyBkaXNwbGF5IiwgIlN5c3RlbSBUYWdzIiwgWyJTeXN0ZW0iLCAiUHJvdGVjdGVkIiwgIlJlYWQtT25seSIsICJBcmNoaXZlIl0sIHRydWUsICJUaGVzZSB0YWdzIGNhbm5vdCBiZSBtb2RpZmllZCIsICI2LiBGb3JtIEludGVncmF0aW9uIiwgIlRhZ3MgaW5wdXQgd29ya2luZyB3aXRoaW4gYSBmb3JtIGNvbnRleHQiLCAiUHJvamVjdCBOYW1lIiwgIk15IEF3ZXNvbWUgUHJvamVjdCIsIHRydWUsICJuYW1lIiwgIlRlY2hub2xvZ2llcyBVc2VkIiwgIkFkZCB0ZWNobm9sb2dpZXMuLi4iLCB0cnVlLCAidGVjaG5vbG9naWVzIiwgWwogICJUeXBlU2NyaXB0IiwKICAiSmF2YVNjcmlwdCIsCiAgIlB5dGhvbiIsCiAgIkdvIiwKICAiUnVzdCIsCiAgIlJlYWN0IiwKICAiVnVlIiwKICAiQW5ndWxhciIsCiAgIlN2ZWx0ZSIsCiAgIk5vZGUuanMiLAogICJEZW5vIiwKICAiRXhwcmVzcyIsCiAgIkZhc3RBUEkiCl0sICJQcm9qZWN0IFRhZ3MiLCAiQWRkIGRlc2NyaXB0aXZlIHRhZ3MuLi4iLCAidGFncyIsIDEwLCBbCiAgImZyb250ZW5kIiwKICAiYmFja2VuZCIsCiAgImZ1bGxzdGFjayIsCiAgIm1vYmlsZSIsCiAgImRlc2t0b3AiLAogICJ3ZWIiLAogICJhcGkiLAogICJkYXRhYmFzZSIsCiAgImRldm9wcyIsCiAgInVpL3V4IiwKICAib3BlbnNvdXJjZSIsCiAgInNhYXMiLAogICJlbnRlcnByaXNlIiwKICAic3RhcnR1cCIKXSwgIkRlc2NyaXB0aW9uIiwgInRleHRhcmVhIiwgIkRlc2NyaWJlIHlvdXIgcHJvamVjdC4uLiIsICJkZXNjcmlwdGlvbiIsICJDcmVhdGUgUHJvamVjdCIsICI3LiBJbnRlcmFjdGl2ZSBEZW1vIiwgIkFkZCB0YWdzIGFuZCBzZWUgdGhlbSBjb2xsZWN0ZWQgaW4gcmVhbC10aW1lIiwgIllvdXIgSW50ZXJlc3RzIiwgIlR5cGUgeW91ciBpbnRlcmVzdHMuLi4iLCBbCiAgIk11c2ljIiwKICAiTW92aWVzIiwKICAiQm9va3MiLAogICJUcmF2ZWwiLAogICJQaG90b2dyYXBoeSIsCiAgIkNvb2tpbmciLAogICJHYW1pbmciLAogICJTcG9ydHMiLAogICJBcnQiLAogICJUZWNobm9sb2d5IiwKICAiRmFzaGlvbiIsCiAgIkZpdG5lc3MiLAogICJOYXR1cmUiLAogICJTY2llbmNlIiwKICAiSGlzdG9yeSIKXSwgKGUxMSkgPT4gewogIGNvbnN0IHByZXZpZXcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjdGFncy1wcmV2aWV3Iik7CiAgY29uc3QgdGFncyA9IGUxMS5kZXRhaWwudmFsdWU7CiAgaWYgKHByZXZpZXcpIHsKICAgIGlmICh0YWdzLmxlbmd0aCA9PT0gMCkgewogICAgICBwcmV2aWV3LmlubmVySFRNTCA9ICc8ZW0gc3R5bGU9ImNvbG9yOiAjOTk5OyI+Tm8gdGFncyBhZGRlZCB5ZXQuLi48L2VtPic7CiAgICB9IGVsc2UgewogICAgICBwcmV2aWV3LmlubmVySFRNTCA9IHRhZ3MubWFwKCh0YWcpID0+IGA8c3BhbiBjbGFzcz0idGFnLXByZXZpZXctaXRlbSI+JHt0YWd9PC9zcGFuPmApLmpvaW4oIiIpOwogICAgfQogIH0KfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC10YWdzL2RlZXMtaW5wdXQtdGFncy5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2RlZXNfaWNvbigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGUzMiA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMzMgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNJbnB1dFRhZ3MgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtaW5wdXQtdGFncyIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzSW5wdXRCYXNlOwogIGxldCBfdmFsdWVfZGVjb3JhdG9yczsKICBsZXQgX3ZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BsYWNlaG9sZGVyX2RlY29yYXRvcnM7CiAgbGV0IF9wbGFjZWhvbGRlcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BsYWNlaG9sZGVyX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYXhUYWdzX2RlY29yYXRvcnM7CiAgbGV0IF9tYXhUYWdzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWF4VGFnc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc3VnZ2VzdGlvbnNfZGVjb3JhdG9yczsKICBsZXQgX3N1Z2dlc3Rpb25zX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc3VnZ2VzdGlvbnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lucHV0VmFsdWVfZGVjb3JhdG9yczsKICBsZXQgX2lucHV0VmFsdWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pbnB1dFZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93U3VnZ2VzdGlvbnNfZGVjb3JhdG9yczsKICBsZXQgX3Nob3dTdWdnZXN0aW9uc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dTdWdnZXN0aW9uc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXhfZGVjb3JhdG9yczsKICBsZXQgX2hpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbGlkYXRpb25UZXh0X2RlY29yYXRvcnM7CiAgbGV0IF92YWxpZGF0aW9uVGV4dF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbGlkYXRpb25UZXh0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNJbnB1dFRhZ3MyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfdmFsdWVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX3BsYWNlaG9sZGVyX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfbWF4VGFnc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX3N1Z2dlc3Rpb25zX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF9pbnB1dFZhbHVlX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9zaG93U3VnZ2VzdGlvbnNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2hpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF92YWxpZGF0aW9uVGV4dF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX19lc0RlY29yYXRlMzIodGhpcywgbnVsbCwgX3ZhbHVlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZhbHVlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ2YWx1ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai52YWx1ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudmFsdWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMih0aGlzLCBudWxsLCBfcGxhY2Vob2xkZXJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicGxhY2Vob2xkZXIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInBsYWNlaG9sZGVyIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnBsYWNlaG9sZGVyLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5wbGFjZWhvbGRlciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wbGFjZWhvbGRlcl9pbml0aWFsaXplcnMsIF9wbGFjZWhvbGRlcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMyKHRoaXMsIG51bGwsIF9tYXhUYWdzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1heFRhZ3MiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1heFRhZ3MiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWF4VGFncywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWF4VGFncyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tYXhUYWdzX2luaXRpYWxpemVycywgX21heFRhZ3NfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMih0aGlzLCBudWxsLCBfc3VnZ2VzdGlvbnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic3VnZ2VzdGlvbnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInN1Z2dlc3Rpb25zIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnN1Z2dlc3Rpb25zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zdWdnZXN0aW9ucyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zdWdnZXN0aW9uc19pbml0aWFsaXplcnMsIF9zdWdnZXN0aW9uc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMyKHRoaXMsIG51bGwsIF9pbnB1dFZhbHVlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlucHV0VmFsdWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImlucHV0VmFsdWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaW5wdXRWYWx1ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaW5wdXRWYWx1ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pbnB1dFZhbHVlX2luaXRpYWxpemVycywgX2lucHV0VmFsdWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMih0aGlzLCBudWxsLCBfc2hvd1N1Z2dlc3Rpb25zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dTdWdnZXN0aW9ucyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd1N1Z2dlc3Rpb25zIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dTdWdnZXN0aW9ucywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd1N1Z2dlc3Rpb25zID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dTdWdnZXN0aW9uc19pbml0aWFsaXplcnMsIF9zaG93U3VnZ2VzdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMih0aGlzLCBudWxsLCBfaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXgiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImhpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmhpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5oaWdobGlnaHRlZFN1Z2dlc3Rpb25JbmRleCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9oaWdobGlnaHRlZFN1Z2dlc3Rpb25JbmRleF9pbml0aWFsaXplcnMsIF9oaWdobGlnaHRlZFN1Z2dlc3Rpb25JbmRleF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMyKHRoaXMsIG51bGwsIF92YWxpZGF0aW9uVGV4dF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2YWxpZGF0aW9uVGV4dCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmFsaWRhdGlvblRleHQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmFsaWRhdGlvblRleHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZhbGlkYXRpb25UZXh0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZhbGlkYXRpb25UZXh0X2luaXRpYWxpemVycywgX3ZhbGlkYXRpb25UZXh0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzIobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzSW5wdXRUYWdzMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAvLyBTVEFUSUMKICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMyNDsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJJbnB1dCJdOwogICAgI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF92YWx1ZV9pbml0aWFsaXplcnMsIFtdKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgdmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3BsYWNlaG9sZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9wbGFjZWhvbGRlcl9pbml0aWFsaXplcnMsICJBZGQgdGFncy4uLiIpKTsKICAgIGdldCBwbGFjZWhvbGRlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3BsYWNlaG9sZGVyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcGxhY2Vob2xkZXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3BsYWNlaG9sZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWF4VGFnc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX3BsYWNlaG9sZGVyX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfbWF4VGFnc19pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBtYXhUYWdzKCkgewogICAgICByZXR1cm4gdGhpcy4jbWF4VGFnc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgLy8gMCBtZWFucyB1bmxpbWl0ZWQKICAgIHNldCBtYXhUYWdzKHZhbHVlMikgewogICAgICB0aGlzLiNtYXhUYWdzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc3VnZ2VzdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9tYXhUYWdzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfc3VnZ2VzdGlvbnNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IHN1Z2dlc3Rpb25zKCkgewogICAgICByZXR1cm4gdGhpcy4jc3VnZ2VzdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzdWdnZXN0aW9ucyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc3VnZ2VzdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpbnB1dFZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfc3VnZ2VzdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9pbnB1dFZhbHVlX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBpbnB1dFZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy4jaW5wdXRWYWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlucHV0VmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lucHV0VmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93U3VnZ2VzdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczMzKHRoaXMsIF9pbnB1dFZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfc2hvd1N1Z2dlc3Rpb25zX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBzaG93U3VnZ2VzdGlvbnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93U3VnZ2VzdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93U3VnZ2VzdGlvbnModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dTdWdnZXN0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2hpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfc2hvd1N1Z2dlc3Rpb25zX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXhfaW5pdGlhbGl6ZXJzLCAtMSkpOwogICAgZ2V0IGhpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4KCkgewogICAgICByZXR1cm4gdGhpcy4jaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBoaWdobGlnaHRlZFN1Z2dlc3Rpb25JbmRleCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN2YWxpZGF0aW9uVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzModGhpcywgX2hpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfdmFsaWRhdGlvblRleHRfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IHZhbGlkYXRpb25UZXh0KCkgewogICAgICByZXR1cm4gdGhpcy4jdmFsaWRhdGlvblRleHRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB2YWxpZGF0aW9uVGV4dCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdmFsaWRhdGlvblRleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgLi4uRGVlc0lucHV0QmFzZS5iYXNlU3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCAnUm9ib3RvJywgc2Fucy1zZXJpZjsKICAgICAgfQoKICAgICAgLmlucHV0LXdyYXBwZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAudGFncy1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA2cHg7CiAgICAgICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICAgICAgbWluLWhlaWdodDogNDBweDsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgY3Vyc29yOiB0ZXh0OwogICAgICB9CgogICAgICAudGFncy1jb250YWluZXI6aG92ZXI6bm90KC5kaXNhYmxlZCkgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDc5LjglKSIsICJoc2woMCAwJSAyMC45JSkiKX07CiAgICAgIH0KCiAgICAgIC50YWdzLWNvbnRhaW5lcjpmb2N1cy13aXRoaW4gewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA1MS4yJSkiLCAiaHNsKDIxNy4yIDkxLjIlIDU5LjglKSIpfTsKICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA1MS4yJSAvIDAuMSkiLCAiaHNsKDIxNy4yIDkxLjIlIDU5LjglIC8gMC4xKSIpfTsKICAgICAgfQoKICAgICAgLnRhZ3MtY29udGFpbmVyLmRpc2FibGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUuMSUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAudGFnIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNHB4OwogICAgICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMjAuMiUgNjUuMSUgLyAwLjIpIiwgImhzbCgyMTUgMjAuMiUgMzUuMSUgLyAwLjIpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSAyNi43JSkiLCAiaHNsKDIxNy45IDEwLjYlIDc0LjklKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAyMC4yJSA2NS4xJSAvIDAuMykiLCAiaHNsKDIxNSAyMC4yJSAzNS4xJSAvIDAuMykiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOHB4OwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGFuaW1hdGlvbjogdGFnQXBwZWFyIDAuMTVzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgdGFnQXBwZWFyIHsKICAgICAgICBmcm9tIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NSk7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgICB0byB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC50YWctcmVtb3ZlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDE0cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiAycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgNDYuNyUpIiwgImhzbCgyMTcuOSAxMC42JSA1NC45JSkiKX07CiAgICAgIH0KCiAgICAgIC50YWctcmVtb3ZlOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMCUgLyAwLjA4KSIsICJoc2woMCAwJSAxMDAlIC8gMC4wOCkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDI2LjclKSIsICJoc2woMjE3LjkgMTAuNiUgNzQuOSUpIil9OwogICAgICB9CgogICAgICAudGFnLXJlbW92ZSBkZWVzLWljb24gewogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICAgIGhlaWdodDogMTBweDsKICAgICAgfQoKICAgICAgLnRhZy1pbnB1dCB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBtaW4td2lkdGg6IDEyMHB4OwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICAgIHBhZGRpbmc6IDJweCA0cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgIH0KCiAgICAgIC50YWctaW5wdXQ6OnBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDYzLjklKSIsICJoc2woMCAwJSA0NS4xJSkiKX07CiAgICAgIH0KCiAgICAgIC50YWctaW5wdXQ6ZGlzYWJsZWQgewogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgIH0KCiAgICAgIC8qIFN1Z2dlc3Rpb25zIGRyb3Bkb3duICovCiAgICAgIC5zdWdnZXN0aW9ucy1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLnN1Z2dlc3Rpb25zLWRyb3Bkb3duIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxMDAlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSAzLjklKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgYm94LXNoYWRvdzogMCA0cHggNnB4IC0xcHggaHNsKDAgMCUgMCUgLyAwLjEpLCAwIDJweCA0cHggLTJweCBoc2woMCAwJSAwJSAvIDAuMSk7CiAgICAgICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB6LWluZGV4OiAxMDAwOwogICAgICB9CgogICAgICAuc3VnZ2VzdGlvbiB7CiAgICAgICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDE1JSkiLCAiaHNsKDAgMCUgOTAlKSIpfTsKICAgICAgfQoKICAgICAgLnN1Z2dlc3Rpb246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NS4xJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICB9CgogICAgICAuc3VnZ2VzdGlvbi5oaWdobGlnaHRlZCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMjE1IDIwLjIlIDE2LjglKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICB9CgogICAgICAvKiBWYWxpZGF0aW9uIHN0eWxlcyAqLwogICAgICAudmFsaWRhdGlvbi1tZXNzYWdlIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcyLjIlIDUwLjYlKSIsICJoc2woMCA2Mi44JSAzMC42JSkiKX07CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIG1hcmdpbi10b3A6IDZweDsKICAgICAgICBsaW5lLWhlaWdodDogMS41OwogICAgICB9CgogICAgICAvKiBEZXNjcmlwdGlvbiBzdHlsZXMgKi8KICAgICAgLmRlc2NyaXB0aW9uIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA1Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA1NS4xJSkiKX07CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIG1hcmdpbi10b3A6IDZweDsKICAgICAgICBsaW5lLWhlaWdodDogMS41OwogICAgICB9CgogICAgICAvKiBTY3JvbGxiYXIgc3R5bGluZyAqLwogICAgICAuc3VnZ2VzdGlvbnMtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgICAgICB3aWR0aDogOHB4OwogICAgICB9CgogICAgICAuc3VnZ2VzdGlvbnMtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgLnN1Z2dlc3Rpb25zLWRyb3Bkb3duOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICB9CgogICAgICAuc3VnZ2VzdGlvbnMtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNzkuOCUpIiwgImhzbCgwIDAlIDIwLjklKSIpfTsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgY29uc3QgZmlsdGVyZWRTdWdnZXN0aW9ucyA9IHRoaXMuc3VnZ2VzdGlvbnMuZmlsdGVyKChzdWdnZXN0aW9uKSA9PiAhdGhpcy52YWx1ZS5pbmNsdWRlcyhzdWdnZXN0aW9uKSAmJiBzdWdnZXN0aW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5pbnB1dFZhbHVlLnRvTG93ZXJDYXNlKCkpKTsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJpbnB1dC13cmFwcGVyIj4KICAgICAgICAke3RoaXMubGFiZWwgPyBiMmA8ZGVlcy1sYWJlbCAubGFiZWw9JHt0aGlzLmxhYmVsfSAucmVxdWlyZWQ9JHt0aGlzLnJlcXVpcmVkfT48L2RlZXMtbGFiZWw+YCA6ICIifQogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9InN1Z2dlc3Rpb25zLWNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2CiAgICAgICAgICAgIGNsYXNzPSJ0YWdzLWNvbnRhaW5lciAke3RoaXMuZGlzYWJsZWQgPyAiZGlzYWJsZWQiIDogIiJ9IgogICAgICAgICAgICBAY2xpY2s9JHt0aGlzLmhhbmRsZUNvbnRhaW5lckNsaWNrfQogICAgICAgICAgPgogICAgICAgICAgICAke3RoaXMudmFsdWUubWFwKCh0YWcpID0+IGIyYAogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhZyI+CiAgICAgICAgICAgICAgICA8c3Bhbj4ke3RhZ308L3NwYW4+CiAgICAgICAgICAgICAgICAkeyF0aGlzLmRpc2FibGVkID8gYjJgCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhZy1yZW1vdmUiIEBjbGljaz0keyhlMTEpID0+IHRoaXMucmVtb3ZlVGFnKGUxMSwgdGFnKX0+CiAgICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6eCJ9PjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYCl9CiAgICAgICAgICAgIAogICAgICAgICAgICAkeyF0aGlzLmRpc2FibGVkICYmICghdGhpcy5tYXhUYWdzIHx8IHRoaXMudmFsdWUubGVuZ3RoIDwgdGhpcy5tYXhUYWdzKSA/IGIyYAogICAgICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICAgICAgdHlwZT0idGV4dCIKICAgICAgICAgICAgICAgIGNsYXNzPSJ0YWctaW5wdXQiCiAgICAgICAgICAgICAgICAucGxhY2Vob2xkZXI9JHt0aGlzLnBsYWNlaG9sZGVyfQogICAgICAgICAgICAgICAgLnZhbHVlPSR7dGhpcy5pbnB1dFZhbHVlfQogICAgICAgICAgICAgICAgQGlucHV0PSR7dGhpcy5oYW5kbGVJbnB1dH0KICAgICAgICAgICAgICAgIEBrZXlkb3duPSR7dGhpcy5oYW5kbGVLZXlEb3dufQogICAgICAgICAgICAgICAgQGZvY3VzPSR7dGhpcy5oYW5kbGVGb2N1c30KICAgICAgICAgICAgICAgIEBibHVyPSR7dGhpcy5oYW5kbGVCbHVyfQogICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7dGhpcy5kaXNhYmxlZH0KICAgICAgICAgICAgICAvPgogICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAke3RoaXMuc2hvd1N1Z2dlc3Rpb25zICYmIGZpbHRlcmVkU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWdnZXN0aW9ucy1kcm9wZG93biI+CiAgICAgICAgICAgICAgJHtmaWx0ZXJlZFN1Z2dlc3Rpb25zLm1hcCgoc3VnZ2VzdGlvbiwgaW5kZXgyKSA9PiBiMmAKICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgY2xhc3M9InN1Z2dlc3Rpb24gJHtpbmRleDIgPT09IHRoaXMuaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXggPyAiaGlnaGxpZ2h0ZWQiIDogIiJ9IgogICAgICAgICAgICAgICAgICBAbW91c2Vkb3duPSR7KGUxMSkgPT4gewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMuYWRkVGFnKHN1Z2dlc3Rpb24pOwogICAgICB9fQogICAgICAgICAgICAgICAgICBAbW91c2VlbnRlcj0keygpID0+IHRoaXMuaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXggPSBpbmRleDJ9CiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICR7c3VnZ2VzdGlvbn0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIGApfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGAgOiAiIn0KICAgICAgICA8L2Rpdj4KCiAgICAgICAgJHt0aGlzLnZhbGlkYXRpb25UZXh0ID8gYjJgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJ2YWxpZGF0aW9uLW1lc3NhZ2UiPiR7dGhpcy52YWxpZGF0aW9uVGV4dH08L2Rpdj4KICAgICAgICBgIDogIiJ9CiAgICAgICAgCiAgICAgICAgJHt0aGlzLmRlc2NyaXB0aW9uID8gYjJgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJkZXNjcmlwdGlvbiI+JHt0aGlzLmRlc2NyaXB0aW9ufTwvZGl2PgogICAgICAgIGAgOiAiIn0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgaGFuZGxlQ29udGFpbmVyQ2xpY2soZTExKSB7CiAgICAgIGlmICh0aGlzLmRpc2FibGVkKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi50YWctaW5wdXQiKTsKICAgICAgaWYgKGlucHV0ICYmIGUxMS50YXJnZXQgIT09IGlucHV0KSB7CiAgICAgICAgaW5wdXQuZm9jdXMoKTsKICAgICAgfQogICAgfQogICAgaGFuZGxlSW5wdXQoZTExKSB7CiAgICAgIGNvbnN0IGlucHV0ID0gZTExLnRhcmdldDsKICAgICAgdGhpcy5pbnB1dFZhbHVlID0gaW5wdXQudmFsdWU7CiAgICAgIGlmICh0aGlzLmlucHV0VmFsdWUuaW5jbHVkZXMoIiwiKSB8fCB0aGlzLmlucHV0VmFsdWUuaW5jbHVkZXMoIjsiKSkgewogICAgICAgIGNvbnN0IHRhZyA9IHRoaXMuaW5wdXRWYWx1ZS5yZXBsYWNlKC9bLDtdL2csICIiKS50cmltKCk7CiAgICAgICAgaWYgKHRhZykgewogICAgICAgICAgdGhpcy5hZGRUYWcodGFnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZUtleURvd24oZTExKSB7CiAgICAgIGNvbnN0IGlucHV0ID0gZTExLnRhcmdldDsKICAgICAgaWYgKGUxMS5rZXkgPT09ICJFbnRlciIpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZFN1Z2dlc3Rpb25JbmRleCA+PSAwICYmIHRoaXMuc2hvd1N1Z2dlc3Rpb25zKSB7CiAgICAgICAgICBjb25zdCBmaWx0ZXJlZFN1Z2dlc3Rpb25zID0gdGhpcy5zdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+ICF0aGlzLnZhbHVlLmluY2x1ZGVzKHN1Z2dlc3Rpb24pICYmIHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLmlucHV0VmFsdWUudG9Mb3dlckNhc2UoKSkpOwogICAgICAgICAgaWYgKGZpbHRlcmVkU3VnZ2VzdGlvbnNbdGhpcy5oaWdobGlnaHRlZFN1Z2dlc3Rpb25JbmRleF0pIHsKICAgICAgICAgICAgdGhpcy5hZGRUYWcoZmlsdGVyZWRTdWdnZXN0aW9uc1t0aGlzLmhpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4XSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlucHV0VmFsdWUudHJpbSgpKSB7CiAgICAgICAgICB0aGlzLmFkZFRhZyh0aGlzLmlucHV0VmFsdWUudHJpbSgpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZTExLmtleSA9PT0gIkJhY2tzcGFjZSIgJiYgIXRoaXMuaW5wdXRWYWx1ZSAmJiB0aGlzLnZhbHVlLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLnJlbW92ZVRhZyhlMTEsIHRoaXMudmFsdWVbdGhpcy52YWx1ZS5sZW5ndGggLSAxXSk7CiAgICAgIH0gZWxzZSBpZiAoZTExLmtleSA9PT0gIkFycm93RG93biIgJiYgdGhpcy5zaG93U3VnZ2VzdGlvbnMpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICBjb25zdCBmaWx0ZXJlZENvdW50ID0gdGhpcy5zdWdnZXN0aW9ucy5maWx0ZXIoKHMxMCkgPT4gIXRoaXMudmFsdWUuaW5jbHVkZXMoczEwKSAmJiBzMTAudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLmlucHV0VmFsdWUudG9Mb3dlckNhc2UoKSkpLmxlbmd0aDsKICAgICAgICB0aGlzLmhpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4ID0gTWF0aC5taW4odGhpcy5oaWdobGlnaHRlZFN1Z2dlc3Rpb25JbmRleCArIDEsIGZpbHRlcmVkQ291bnQgLSAxKTsKICAgICAgfSBlbHNlIGlmIChlMTEua2V5ID09PSAiQXJyb3dVcCIgJiYgdGhpcy5zaG93U3VnZ2VzdGlvbnMpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICB0aGlzLmhpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4ID0gTWF0aC5tYXgodGhpcy5oaWdobGlnaHRlZFN1Z2dlc3Rpb25JbmRleCAtIDEsIDApOwogICAgICB9IGVsc2UgaWYgKGUxMS5rZXkgPT09ICJFc2NhcGUiKSB7CiAgICAgICAgdGhpcy5zaG93U3VnZ2VzdGlvbnMgPSBmYWxzZTsKICAgICAgICB0aGlzLmhpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4ID0gLTE7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZUZvY3VzKCkgewogICAgICBpZiAodGhpcy5zdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhpcy5zaG93U3VnZ2VzdGlvbnMgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVCbHVyKCkgewogICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0aGlzLnNob3dTdWdnZXN0aW9ucyA9IGZhbHNlOwogICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRTdWdnZXN0aW9uSW5kZXggPSAtMTsKICAgICAgfSwgMjAwKTsKICAgIH0KICAgIGFkZFRhZyh0YWcpIHsKICAgICAgaWYgKCF0YWcgfHwgdGhpcy52YWx1ZS5pbmNsdWRlcyh0YWcpKQogICAgICAgIHJldHVybjsKICAgICAgaWYgKHRoaXMubWF4VGFncyAmJiB0aGlzLnZhbHVlLmxlbmd0aCA+PSB0aGlzLm1heFRhZ3MpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLnZhbHVlID0gWy4uLnRoaXMudmFsdWUsIHRhZ107CiAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9ICIiOwogICAgICB0aGlzLnNob3dTdWdnZXN0aW9ucyA9IGZhbHNlOwogICAgICB0aGlzLmhpZ2hsaWdodGVkU3VnZ2VzdGlvbkluZGV4ID0gLTE7CiAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIudGFnLWlucHV0Iik7CiAgICAgIGlmIChpbnB1dCkgewogICAgICAgIGlucHV0LnZhbHVlID0gIiI7CiAgICAgIH0KICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7CiAgICB9CiAgICByZW1vdmVUYWcoZTExLCB0YWcpIHsKICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIoKHQ5KSA9PiB0OSAhPT0gdGFnKTsKICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7CiAgICB9CiAgICBlbWl0Q2hhbmdlKCkgewogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjaGFuZ2UiLCB7CiAgICAgICAgZGV0YWlsOiB7IHZhbHVlOiB0aGlzLnZhbHVlIH0sCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMpOwogICAgfQogICAgZ2V0VmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgfQogICAgc2V0VmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTIgfHwgW107CiAgICB9CiAgICBhc3luYyB2YWxpZGF0ZSgpIHsKICAgICAgaWYgKHRoaXMucmVxdWlyZWQgJiYgKCF0aGlzLnZhbHVlIHx8IHRoaXMudmFsdWUubGVuZ3RoID09PSAwKSkgewogICAgICAgIHRoaXMudmFsaWRhdGlvblRleHQgPSAiQXQgbGVhc3Qgb25lIHRhZyBpcyByZXF1aXJlZCI7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHRoaXMudmFsaWRhdGlvblRleHQgPSAiIjsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnMzMyh0aGlzLCBfdmFsaWRhdGlvblRleHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnMzMyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0lucHV0VGFnczIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtbGlzdC9kZWVzLWlucHV0LWxpc3QuZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmMyNSA9ICgpID0+IGIyYAogIDxkZWVzLWRlbW93cmFwcGVyPgogICAgPHN0eWxlPgogICAgICAke2lgCiAgICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICAgIG1heC13aWR0aDogMTIwMHB4OwogICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGRlZXMtcGFuZWwgewogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZGVlcy1wYW5lbDpsYXN0LWNoaWxkIHsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5ncmlkLWxheW91dCB7CiAgICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOwogICAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICBAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHsKICAgICAgICAgIC5ncmlkLWxheW91dCB7CiAgICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAub3V0cHV0LXByZXZpZXcgewogICAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAjZjNmNGY2OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgY29sb3I6ICMzNzQxNTE7CiAgICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgfQogICAgICAgIAogICAgICAgIEBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsKICAgICAgICAgIC5vdXRwdXQtcHJldmlldyB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICMyYzJjMmM7CiAgICAgICAgICAgIGNvbG9yOiAjZTRlNGU3OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAuZmVhdHVyZS1ub3RlIHsKICAgICAgICAgIG1hcmdpbi10b3A6IDEycHg7CiAgICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgICAgYmFja2dyb3VuZDogI2VmZjZmZjsKICAgICAgICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgIzNiODJmNjsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIGNvbG9yOiAjMWU0MGFmOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgICAuZmVhdHVyZS1ub3RlIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogIzFlM2E1ZjsKICAgICAgICAgICAgY29sb3I6ICM5M2M1ZmQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBgfQogICAgPC9zdHlsZT4KICAgIAogICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiMS4gQmFzaWMgTGlzdCBJbnB1dCJ9IC5zdWJ0aXRsZT0keyJTaW1wbGUgbGlzdCBtYW5hZ2VtZW50IHdpdGggYWRkLCBlZGl0LCBhbmQgZGVsZXRlIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtbGlzdAogICAgICAgICAgLmxhYmVsPSR7IlNob3BwaW5nIExpc3QifQogICAgICAgICAgLnBsYWNlaG9sZGVyPSR7IkFkZCBpdGVtIHRvIHlvdXIgbGlzdC4uLiJ9CiAgICAgICAgICAudmFsdWU9JHtbIk1pbGsiLCAiQnJlYWQiLCAiRWdncyIsICJDaGVlc2UiXX0KICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJEb3VibGUtY2xpY2sgdG8gZWRpdCBpdGVtcywgb3IgdXNlIHRoZSBlZGl0IGJ1dHRvbiJ9CiAgICAgICAgPjwvZGVlcy1pbnB1dC1saXN0PgogICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtbm90ZSI+CiAgICAgICAgICDwn5KhIERvdWJsZS1jbGljayBhbnkgaXRlbSB0byBxdWlja2x5IGVkaXQgaXQgaW5saW5lCiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyIyLiBTb3J0YWJsZSBMaXN0In0gLnN1YnRpdGxlPSR7IkRyYWcgYW5kIGRyb3AgdG8gcmVvcmRlciBpdGVtcyJ9PgogICAgICAgIDxkZWVzLWlucHV0LWxpc3QKICAgICAgICAgIC5sYWJlbD0keyJUYXNrIFByaW9yaXR5In0KICAgICAgICAgIC5wbGFjZWhvbGRlcj0keyJBZGQgYSB0YXNrLi4uIn0KICAgICAgICAgIC5zb3J0YWJsZT0ke3RydWV9CiAgICAgICAgICAudmFsdWU9JHtbCiAgIlJldmlldyBwdWxsIHJlcXVlc3RzIiwKICAiRml4IGNyaXRpY2FsIGJ1ZyIsCiAgIlVwZGF0ZSBkb2N1bWVudGF0aW9uIiwKICAiRGVwbG95IHRvIHByb2R1Y3Rpb24iLAogICJUZWFtIHN0YW5kdXAgbWVldGluZyIKXX0KICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJEcmFnIGl0ZW1zIHVzaW5nIHRoZSBoYW5kbGUgdG8gcmVvcmRlciB0aGVtIn0KICAgICAgICA+PC9kZWVzLWlucHV0LWxpc3Q+CiAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1ub3RlIj4KICAgICAgICAgIPCflIQgRHJhZyB0aGUgZ3JpcCBoYW5kbGUgdG8gcmVvcmRlciB0YXNrcyBieSBwcmlvcml0eQogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiMy4gVmFsaWRhdGlvbiAmIENvbnN0cmFpbnRzIn0gLnN1YnRpdGxlPSR7Ikxpc3RzIHdpdGggbWluaW11bS9tYXhpbXVtIGl0ZW1zIGFuZCBkdXBsaWNhdGUgcHJldmVudGlvbiJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImdyaWQtbGF5b3V0Ij4KICAgICAgICAgIDxkZWVzLWlucHV0LWxpc3QKICAgICAgICAgICAgLmxhYmVsPSR7IlRlYW0gTWVtYmVycyAoTWluIDIsIE1heCA1KSJ9CiAgICAgICAgICAgIC5wbGFjZWhvbGRlcj0keyJBZGQgdGVhbSBtZW1iZXIuLi4ifQogICAgICAgICAgICAubWluSXRlbXM9JHsyfQogICAgICAgICAgICAubWF4SXRlbXM9JHs1fQogICAgICAgICAgICAudmFsdWU9JHtbIkFsaWNlIiwgIkJvYiJdfQogICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiQWRkIDItNSB0ZWFtIG1lbWJlcnMifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1saXN0PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1saXN0CiAgICAgICAgICAgIC5sYWJlbD0keyJVbmlxdWUgVGFncyAoTm8gRHVwbGljYXRlcykifQogICAgICAgICAgICAucGxhY2Vob2xkZXI9JHsiQWRkIHVuaXF1ZSB0YWcuLi4ifQogICAgICAgICAgICAuYWxsb3dEdXBsaWNhdGVzPSR7ZmFsc2V9CiAgICAgICAgICAgIC52YWx1ZT0ke1siZnJvbnRlbmQiLCAiYmFja2VuZCIsICJkYXRhYmFzZSJdfQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiRHVwbGljYXRlIGl0ZW1zIGFyZSBub3QgYWxsb3dlZCJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWxpc3Q+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI0LiBEZWxldGUgQ29uZmlybWF0aW9uIn0gLnN1YnRpdGxlPSR7IlJlcXVpcmUgY29uZmlybWF0aW9uIGJlZm9yZSBkZWxldGluZyBpdGVtcyJ9PgogICAgICAgIDxkZWVzLWlucHV0LWxpc3QKICAgICAgICAgIC5sYWJlbD0keyJJbXBvcnRhbnQgRG9jdW1lbnRzIn0KICAgICAgICAgIC5wbGFjZWhvbGRlcj0keyJBZGQgZG9jdW1lbnQgbmFtZS4uLiJ9CiAgICAgICAgICAuY29uZmlybURlbGV0ZT0ke3RydWV9CiAgICAgICAgICAudmFsdWU9JHtbCiAgIkNvbnRyYWN0XzIwMjQucGRmIiwKICAiRmluYW5jaWFsX1JlcG9ydF9RMy54bHN4IiwKICAiUHJvamVjdF9Qcm9wb3NhbC5kb2N4IiwKICAiTWVldGluZ19Ob3Rlcy50eHQiCl19CiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiRGVsZXRpb24gcmVxdWlyZXMgY29uZmlybWF0aW9uIGZvciBzYWZldHkifQogICAgICAgID48L2RlZXMtaW5wdXQtbGlzdD4KICAgICAgPC9kZWVzLXBhbmVsPgoKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjUuIERpc2FibGVkIFN0YXRlIn0gLnN1YnRpdGxlPSR7IlJlYWQtb25seSBsaXN0IGRpc3BsYXkifT4KICAgICAgICA8ZGVlcy1pbnB1dC1saXN0CiAgICAgICAgICAubGFiZWw9JHsiU3lzdGVtIERlZmF1bHRzIn0KICAgICAgICAgIC52YWx1ZT0ke1siRGVmYXVsdCBTZXR0aW5nIDEiLCAiRGVmYXVsdCBTZXR0aW5nIDIiLCAiRGVmYXVsdCBTZXR0aW5nIDMiXX0KICAgICAgICAgIC5kaXNhYmxlZD0ke3RydWV9CiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiVGhlc2UgaXRlbXMgY2Fubm90IGJlIG1vZGlmaWVkIn0KICAgICAgICA+PC9kZWVzLWlucHV0LWxpc3Q+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI2LiBGb3JtIEludGVncmF0aW9uIn0gLnN1YnRpdGxlPSR7Ikxpc3QgaW5wdXQgd29ya2luZyB3aXRoaW4gYSBmb3JtIGNvbnRleHQifT4KICAgICAgICA8ZGVlcy1mb3JtPgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dAogICAgICAgICAgICAubGFiZWw9JHsiUmVjaXBlIE5hbWUifQogICAgICAgICAgICAucGxhY2Vob2xkZXI9JHsiTXkgQW1hemluZyBSZWNpcGUifQogICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAua2V5PSR7Im5hbWUifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJncmlkLWxheW91dCI+CiAgICAgICAgICAgIDxkZWVzLWlucHV0LWxpc3QKICAgICAgICAgICAgICAubGFiZWw9JHsiSW5ncmVkaWVudHMifQogICAgICAgICAgICAgIC5wbGFjZWhvbGRlcj0keyJBZGQgaW5ncmVkaWVudC4uLiJ9CiAgICAgICAgICAgICAgLnJlcXVpcmVkPSR7dHJ1ZX0KICAgICAgICAgICAgICAubWluSXRlbXM9JHszfQogICAgICAgICAgICAgIC5rZXk9JHsiaW5ncmVkaWVudHMifQogICAgICAgICAgICAgIC5zb3J0YWJsZT0ke3RydWV9CiAgICAgICAgICAgICAgLnZhbHVlPSR7WwogICIyIGN1cHMgZmxvdXIiLAogICIxIGN1cCBzdWdhciIsCiAgIjMgZWdncyIKXX0KICAgICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiQWRkIGF0IGxlYXN0IDMgaW5ncmVkaWVudHMifQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LWxpc3Q+CiAgICAgICAgICAgIAogICAgICAgICAgICA8ZGVlcy1pbnB1dC1saXN0CiAgICAgICAgICAgICAgLmxhYmVsPSR7Ikluc3RydWN0aW9ucyJ9CiAgICAgICAgICAgICAgLnBsYWNlaG9sZGVyPSR7IkFkZCBpbnN0cnVjdGlvbiBzdGVwLi4uIn0KICAgICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfQogICAgICAgICAgICAgIC5taW5JdGVtcz0kezJ9CiAgICAgICAgICAgICAgLmtleT0keyJpbnN0cnVjdGlvbnMifQogICAgICAgICAgICAgIC5zb3J0YWJsZT0ke3RydWV9CiAgICAgICAgICAgICAgLnZhbHVlPSR7WwogICJQcmVoZWF0IG92ZW4gdG8gMzUwXHhCMEYiLAogICJNaXggZHJ5IGluZ3JlZGllbnRzIgpdfQogICAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJBZGQgY29va2luZyBpbnN0cnVjdGlvbnMgaW4gb3JkZXIifQogICAgICAgICAgICA+PC9kZWVzLWlucHV0LWxpc3Q+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dAogICAgICAgICAgICAubGFiZWw9JHsiTm90ZXMifQogICAgICAgICAgICAuaW5wdXRUeXBlPSR7InRleHRhcmVhIn0KICAgICAgICAgICAgLnBsYWNlaG9sZGVyPSR7IkFueSBzcGVjaWFsIG5vdGVzIG9yIHRpcHMuLi4ifQogICAgICAgICAgICAua2V5PSR7Im5vdGVzIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtZm9ybS1zdWJtaXQgLnRleHQ9JHsiU2F2ZSBSZWNpcGUifT48L2RlZXMtZm9ybS1zdWJtaXQ+CiAgICAgICAgPC9kZWVzLWZvcm0+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI3LiBJbnRlcmFjdGl2ZSBEZW1vIn0gLnN1YnRpdGxlPSR7IkJ1aWxkIHlvdXIgb3duIGZlYXR1cmUgbGlzdCBhbmQgc2VlIHRoZSBkYXRhIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtbGlzdAogICAgICAgICAgaWQ9ImludGVyYWN0aXZlLWxpc3QiCiAgICAgICAgICAubGFiZWw9JHsiUHJvZHVjdCBGZWF0dXJlcyJ9CiAgICAgICAgICAucGxhY2Vob2xkZXI9JHsiQWRkIGEgZmVhdHVyZS4uLiJ9CiAgICAgICAgICAuc29ydGFibGU9JHt0cnVlfQogICAgICAgICAgLmNvbmZpcm1EZWxldGU9JHtmYWxzZX0KICAgICAgICAgIC5hbGxvd0R1cGxpY2F0ZXM9JHtmYWxzZX0KICAgICAgICAgIC5tYXhJdGVtcz0kezEwfQogICAgICAgICAgQGNoYW5nZT0keyhlMTEpID0+IHsKICBjb25zdCBwcmV2aWV3ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2xpc3QtanNvbiIpOwogIGlmIChwcmV2aWV3KSB7CiAgICBjb25zdCBkYXRhID0gewogICAgICBpdGVtczogZTExLmRldGFpbC52YWx1ZSwKICAgICAgY291bnQ6IGUxMS5kZXRhaWwudmFsdWUubGVuZ3RoLAogICAgICB0aW1lc3RhbXA6ICgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKQogICAgfTsKICAgIHByZXZpZXcudGV4dENvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTsKICB9Cn19CiAgICAgICAgPjwvZGVlcy1pbnB1dC1saXN0PgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9Im91dHB1dC1wcmV2aWV3IiBpZD0ibGlzdC1qc29uIj4KICAgICAgICAgIHsKICAgICAgICAgICAgIml0ZW1zIjogW10sCiAgICAgICAgICAgICJjb3VudCI6IDAsCiAgICAgICAgICAgICJ0aW1lc3RhbXAiOiAiJHsoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCl9IgogICAgICAgICAgfQogICAgICAgIDwvZGl2PgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtbm90ZSI+CiAgICAgICAgICDinKggQWRkLCBlZGl0LCByZW1vdmUsIGFuZCByZW9yZGVyIGl0ZW1zIHRvIHNlZSB0aGUgSlNPTiBvdXRwdXQgdXBkYXRlIGluIHJlYWwtdGltZQogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiOC4gQWR2YW5jZWQgQ29uZmlndXJhdGlvbiJ9IC5zdWJ0aXRsZT0keyJDb21iaW5lIGFsbCBmZWF0dXJlcyBmb3IgY29tcGxleCB1c2UgY2FzZXMifT4KICAgICAgICA8ZGVlcy1pbnB1dC1saXN0CiAgICAgICAgICAubGFiZWw9JHsiUHJvamVjdCBNaWxlc3RvbmVzIn0KICAgICAgICAgIC5wbGFjZWhvbGRlcj0keyJBZGQgbWlsZXN0b25lLi4uIn0KICAgICAgICAgIC52YWx1ZT0ke1sKICAiUHJvamVjdCBLaWNrb2ZmIC0gV2VlayAxIiwKICAiUmVxdWlyZW1lbnRzIEdhdGhlcmluZyAtIFdlZWsgMi0zIiwKICAiRGVzaWduIFBoYXNlIC0gV2VlayA0LTYiLAogICJEZXZlbG9wbWVudCBTcHJpbnQgMSAtIFdlZWsgNy05IiwKICAiVGVzdGluZyAmIFFBIC0gV2VlayAxMC0xMSIsCiAgIkRlcGxveW1lbnQgLSBXZWVrIDEyIgpdfQogICAgICAgICAgLnNvcnRhYmxlPSR7dHJ1ZX0KICAgICAgICAgIC5jb25maXJtRGVsZXRlPSR7dHJ1ZX0KICAgICAgICAgIC5hbGxvd0R1cGxpY2F0ZXM9JHtmYWxzZX0KICAgICAgICAgIC5taW5JdGVtcz0kezN9CiAgICAgICAgICAubWF4SXRlbXM9JHsxMn0KICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiTWFuYWdlIHByb2plY3QgbWlsZXN0b25lcyAoMy0xMiBpdGVtcywgc29ydGFibGUsIG5vIGR1cGxpY2F0ZXMpIn0KICAgICAgICA+PC9kZWVzLWlucHV0LWxpc3Q+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI5LiBFbXB0eSBTdGF0ZSJ9IC5zdWJ0aXRsZT0keyJIb3cgdGhlIGNvbXBvbmVudCBsb29rcyB3aXRoIG5vIGl0ZW1zIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtbGlzdAogICAgICAgICAgLmxhYmVsPSR7IllvdXIgSWRlYXMifQogICAgICAgICAgLnBsYWNlaG9sZGVyPSR7IlNoYXJlIHlvdXIgaWRlYXMuLi4ifQogICAgICAgICAgLnZhbHVlPSR7W119CiAgICAgICAgICAuZGVzY3JpcHRpb249JHsiU3RhcnQgYWRkaW5nIGl0ZW1zIHRvIGJ1aWxkIHlvdXIgbGlzdCJ9CiAgICAgICAgPjwvZGVlcy1pbnB1dC1saXN0PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2Rpdj4KICA8L2RlZXMtZGVtb3dyYXBwZXI+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1saXN0L2RlZXMtaW5wdXQtbGlzdC5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2RlZXNfaWNvbigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGUzMyA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMzQgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNJbnB1dExpc3QgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtaW5wdXQtbGlzdCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzSW5wdXRCYXNlOwogIGxldCBfdmFsdWVfZGVjb3JhdG9yczsKICBsZXQgX3ZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BsYWNlaG9sZGVyX2RlY29yYXRvcnM7CiAgbGV0IF9wbGFjZWhvbGRlcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BsYWNlaG9sZGVyX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYXhJdGVtc19kZWNvcmF0b3JzOwogIGxldCBfbWF4SXRlbXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYXhJdGVtc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWluSXRlbXNfZGVjb3JhdG9yczsKICBsZXQgX21pbkl0ZW1zX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWluSXRlbXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FsbG93RHVwbGljYXRlc19kZWNvcmF0b3JzOwogIGxldCBfYWxsb3dEdXBsaWNhdGVzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWxsb3dEdXBsaWNhdGVzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zb3J0YWJsZV9kZWNvcmF0b3JzOwogIGxldCBfc29ydGFibGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zb3J0YWJsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29uZmlybURlbGV0ZV9kZWNvcmF0b3JzOwogIGxldCBfY29uZmlybURlbGV0ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbmZpcm1EZWxldGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbGlkYXRpb25UZXh0X2RlY29yYXRvcnM7CiAgbGV0IF92YWxpZGF0aW9uVGV4dF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZhbGlkYXRpb25UZXh0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pbnB1dFZhbHVlX2RlY29yYXRvcnM7CiAgbGV0IF9pbnB1dFZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW5wdXRWYWx1ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZWRpdGluZ0luZGV4X2RlY29yYXRvcnM7CiAgbGV0IF9lZGl0aW5nSW5kZXhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lZGl0aW5nSW5kZXhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2VkaXRpbmdWYWx1ZV9kZWNvcmF0b3JzOwogIGxldCBfZWRpdGluZ1ZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZWRpdGluZ1ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnZ2VkSW5kZXhfZGVjb3JhdG9yczsKICBsZXQgX2RyYWdnZWRJbmRleF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RyYWdnZWRJbmRleF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZHJhZ092ZXJJbmRleF9kZWNvcmF0b3JzOwogIGxldCBfZHJhZ092ZXJJbmRleF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RyYWdPdmVySW5kZXhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RyYWdTdGFydFlfZGVjb3JhdG9yczsKICBsZXQgX2RyYWdTdGFydFlfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnU3RhcnRZX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnQ3VycmVudFlfZGVjb3JhdG9yczsKICBsZXQgX2RyYWdDdXJyZW50WV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RyYWdDdXJyZW50WV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGFyZ2V0SW5kZXhfZGVjb3JhdG9yczsKICBsZXQgX3RhcmdldEluZGV4X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGFyZ2V0SW5kZXhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2l0ZW1IZWlnaHRfZGVjb3JhdG9yczsKICBsZXQgX2l0ZW1IZWlnaHRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pdGVtSGVpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNJbnB1dExpc3QyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfdmFsdWVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX3BsYWNlaG9sZGVyX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfbWF4SXRlbXNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF9taW5JdGVtc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX2FsbG93RHVwbGljYXRlc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9zb3J0YWJsZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9jb25maXJtRGVsZXRlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3ZhbGlkYXRpb25UZXh0X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfaW5wdXRWYWx1ZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfZWRpdGluZ0luZGV4X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9lZGl0aW5nVmFsdWVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2RyYWdnZWRJbmRleF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfZHJhZ092ZXJJbmRleF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfZHJhZ1N0YXJ0WV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfZHJhZ0N1cnJlbnRZX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF90YXJnZXRJbmRleF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaXRlbUhlaWdodF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGUzMyh0aGlzLCBudWxsLCBfdmFsdWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmFsdWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInZhbHVlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZhbHVlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52YWx1ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF92YWx1ZV9pbml0aWFsaXplcnMsIF92YWx1ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMzKHRoaXMsIG51bGwsIF9wbGFjZWhvbGRlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwbGFjZWhvbGRlciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicGxhY2Vob2xkZXIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucGxhY2Vob2xkZXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnBsYWNlaG9sZGVyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3BsYWNlaG9sZGVyX2luaXRpYWxpemVycywgX3BsYWNlaG9sZGVyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzModGhpcywgbnVsbCwgX21heEl0ZW1zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1heEl0ZW1zIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtYXhJdGVtcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYXhJdGVtcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWF4SXRlbXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWF4SXRlbXNfaW5pdGlhbGl6ZXJzLCBfbWF4SXRlbXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMyh0aGlzLCBudWxsLCBfbWluSXRlbXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWluSXRlbXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1pbkl0ZW1zIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1pbkl0ZW1zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5taW5JdGVtcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9taW5JdGVtc19pbml0aWFsaXplcnMsIF9taW5JdGVtc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMzKHRoaXMsIG51bGwsIF9hbGxvd0R1cGxpY2F0ZXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYWxsb3dEdXBsaWNhdGVzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhbGxvd0R1cGxpY2F0ZXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWxsb3dEdXBsaWNhdGVzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hbGxvd0R1cGxpY2F0ZXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYWxsb3dEdXBsaWNhdGVzX2luaXRpYWxpemVycywgX2FsbG93RHVwbGljYXRlc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMzKHRoaXMsIG51bGwsIF9zb3J0YWJsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzb3J0YWJsZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic29ydGFibGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc29ydGFibGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNvcnRhYmxlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NvcnRhYmxlX2luaXRpYWxpemVycywgX3NvcnRhYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzModGhpcywgbnVsbCwgX2NvbmZpcm1EZWxldGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29uZmlybURlbGV0ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29uZmlybURlbGV0ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jb25maXJtRGVsZXRlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jb25maXJtRGVsZXRlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbmZpcm1EZWxldGVfaW5pdGlhbGl6ZXJzLCBfY29uZmlybURlbGV0ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMzKHRoaXMsIG51bGwsIF92YWxpZGF0aW9uVGV4dF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2YWxpZGF0aW9uVGV4dCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmFsaWRhdGlvblRleHQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmFsaWRhdGlvblRleHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZhbGlkYXRpb25UZXh0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZhbGlkYXRpb25UZXh0X2luaXRpYWxpemVycywgX3ZhbGlkYXRpb25UZXh0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzModGhpcywgbnVsbCwgX2lucHV0VmFsdWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaW5wdXRWYWx1ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaW5wdXRWYWx1ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pbnB1dFZhbHVlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pbnB1dFZhbHVlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lucHV0VmFsdWVfaW5pdGlhbGl6ZXJzLCBfaW5wdXRWYWx1ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMzKHRoaXMsIG51bGwsIF9lZGl0aW5nSW5kZXhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZWRpdGluZ0luZGV4Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJlZGl0aW5nSW5kZXgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZWRpdGluZ0luZGV4LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5lZGl0aW5nSW5kZXggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZWRpdGluZ0luZGV4X2luaXRpYWxpemVycywgX2VkaXRpbmdJbmRleF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMzKHRoaXMsIG51bGwsIF9lZGl0aW5nVmFsdWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZWRpdGluZ1ZhbHVlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJlZGl0aW5nVmFsdWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZWRpdGluZ1ZhbHVlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5lZGl0aW5nVmFsdWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZWRpdGluZ1ZhbHVlX2luaXRpYWxpemVycywgX2VkaXRpbmdWYWx1ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMzKHRoaXMsIG51bGwsIF9kcmFnZ2VkSW5kZXhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZHJhZ2dlZEluZGV4Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkcmFnZ2VkSW5kZXgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZHJhZ2dlZEluZGV4LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kcmFnZ2VkSW5kZXggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZHJhZ2dlZEluZGV4X2luaXRpYWxpemVycywgX2RyYWdnZWRJbmRleF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTMzKHRoaXMsIG51bGwsIF9kcmFnT3ZlckluZGV4X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImRyYWdPdmVySW5kZXgiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRyYWdPdmVySW5kZXgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZHJhZ092ZXJJbmRleCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZHJhZ092ZXJJbmRleCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kcmFnT3ZlckluZGV4X2luaXRpYWxpemVycywgX2RyYWdPdmVySW5kZXhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMyh0aGlzLCBudWxsLCBfZHJhZ1N0YXJ0WV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkcmFnU3RhcnRZIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkcmFnU3RhcnRZIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRyYWdTdGFydFksIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmRyYWdTdGFydFkgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZHJhZ1N0YXJ0WV9pbml0aWFsaXplcnMsIF9kcmFnU3RhcnRZX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzModGhpcywgbnVsbCwgX2RyYWdDdXJyZW50WV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkcmFnQ3VycmVudFkiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRyYWdDdXJyZW50WSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5kcmFnQ3VycmVudFksIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmRyYWdDdXJyZW50WSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kcmFnQ3VycmVudFlfaW5pdGlhbGl6ZXJzLCBfZHJhZ0N1cnJlbnRZX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzModGhpcywgbnVsbCwgX3RhcmdldEluZGV4X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRhcmdldEluZGV4Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0YXJnZXRJbmRleCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50YXJnZXRJbmRleCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGFyZ2V0SW5kZXggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGFyZ2V0SW5kZXhfaW5pdGlhbGl6ZXJzLCBfdGFyZ2V0SW5kZXhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzMyh0aGlzLCBudWxsLCBfaXRlbUhlaWdodF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpdGVtSGVpZ2h0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpdGVtSGVpZ2h0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLml0ZW1IZWlnaHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLml0ZW1IZWlnaHQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXRlbUhlaWdodF9pbml0aWFsaXplcnMsIF9pdGVtSGVpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzMobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzSW5wdXRMaXN0MiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAvLyBTVEFUSUMKICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMyNTsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJJbnB1dCJdOwogICAgI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczM0KHRoaXMsIF92YWx1ZV9pbml0aWFsaXplcnMsIFtdKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgdmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3BsYWNlaG9sZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNCh0aGlzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM0KHRoaXMsIF9wbGFjZWhvbGRlcl9pbml0aWFsaXplcnMsICJBZGQgbmV3IGl0ZW0uLi4iKSk7CiAgICBnZXQgcGxhY2Vob2xkZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwbGFjZWhvbGRlcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHBsYWNlaG9sZGVyKHZhbHVlMikgewogICAgICB0aGlzLiNwbGFjZWhvbGRlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21heEl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNCh0aGlzLCBfcGxhY2Vob2xkZXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM0KHRoaXMsIF9tYXhJdGVtc19pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBtYXhJdGVtcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI21heEl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICAvLyAwIG1lYW5zIHVubGltaXRlZAogICAgc2V0IG1heEl0ZW1zKHZhbHVlMikgewogICAgICB0aGlzLiNtYXhJdGVtc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21pbkl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNCh0aGlzLCBfbWF4SXRlbXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM0KHRoaXMsIF9taW5JdGVtc19pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBtaW5JdGVtcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI21pbkl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWluSXRlbXModmFsdWUyKSB7CiAgICAgIHRoaXMuI21pbkl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYWxsb3dEdXBsaWNhdGVzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNCh0aGlzLCBfbWluSXRlbXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM0KHRoaXMsIF9hbGxvd0R1cGxpY2F0ZXNfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGFsbG93RHVwbGljYXRlcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FsbG93RHVwbGljYXRlc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFsbG93RHVwbGljYXRlcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYWxsb3dEdXBsaWNhdGVzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc29ydGFibGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM0KHRoaXMsIF9hbGxvd0R1cGxpY2F0ZXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM0KHRoaXMsIF9zb3J0YWJsZV9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgc29ydGFibGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzb3J0YWJsZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNvcnRhYmxlKHZhbHVlMikgewogICAgICB0aGlzLiNzb3J0YWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NvbmZpcm1EZWxldGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM0KHRoaXMsIF9zb3J0YWJsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzQodGhpcywgX2NvbmZpcm1EZWxldGVfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGNvbmZpcm1EZWxldGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb25maXJtRGVsZXRlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29uZmlybURlbGV0ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29uZmlybURlbGV0ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3ZhbGlkYXRpb25UZXh0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNCh0aGlzLCBfY29uZmlybURlbGV0ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzQodGhpcywgX3ZhbGlkYXRpb25UZXh0X2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCB2YWxpZGF0aW9uVGV4dCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ZhbGlkYXRpb25UZXh0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdmFsaWRhdGlvblRleHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3ZhbGlkYXRpb25UZXh0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaW5wdXRWYWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzQodGhpcywgX3ZhbGlkYXRpb25UZXh0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzNCh0aGlzLCBfaW5wdXRWYWx1ZV9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgaW5wdXRWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lucHV0VmFsdWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpbnB1dFZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLiNpbnB1dFZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZWRpdGluZ0luZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNCh0aGlzLCBfaW5wdXRWYWx1ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzQodGhpcywgX2VkaXRpbmdJbmRleF9pbml0aWFsaXplcnMsIC0xKSk7CiAgICBnZXQgZWRpdGluZ0luZGV4KCkgewogICAgICByZXR1cm4gdGhpcy4jZWRpdGluZ0luZGV4X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZWRpdGluZ0luZGV4KHZhbHVlMikgewogICAgICB0aGlzLiNlZGl0aW5nSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNlZGl0aW5nVmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM0KHRoaXMsIF9lZGl0aW5nSW5kZXhfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM0KHRoaXMsIF9lZGl0aW5nVmFsdWVfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGVkaXRpbmdWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2VkaXRpbmdWYWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGVkaXRpbmdWYWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZWRpdGluZ1ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZHJhZ2dlZEluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNCh0aGlzLCBfZWRpdGluZ1ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzNCh0aGlzLCBfZHJhZ2dlZEluZGV4X2luaXRpYWxpemVycywgLTEpKTsKICAgIGdldCBkcmFnZ2VkSW5kZXgoKSB7CiAgICAgIHJldHVybiB0aGlzLiNkcmFnZ2VkSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkcmFnZ2VkSW5kZXgodmFsdWUyKSB7CiAgICAgIHRoaXMuI2RyYWdnZWRJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2RyYWdPdmVySW5kZXhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM0KHRoaXMsIF9kcmFnZ2VkSW5kZXhfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM0KHRoaXMsIF9kcmFnT3ZlckluZGV4X2luaXRpYWxpemVycywgLTEpKTsKICAgIGdldCBkcmFnT3ZlckluZGV4KCkgewogICAgICByZXR1cm4gdGhpcy4jZHJhZ092ZXJJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGRyYWdPdmVySW5kZXgodmFsdWUyKSB7CiAgICAgIHRoaXMuI2RyYWdPdmVySW5kZXhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNkcmFnU3RhcnRZX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNCh0aGlzLCBfZHJhZ092ZXJJbmRleF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzQodGhpcywgX2RyYWdTdGFydFlfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICAvLyBFbmhhbmNlZCBkcmFnIHN0YXRlIGZvciBpbnRlcmFjdGl2ZSByZW9yZGVyaW5nCiAgICBnZXQgZHJhZ1N0YXJ0WSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2RyYWdTdGFydFlfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkcmFnU3RhcnRZKHZhbHVlMikgewogICAgICB0aGlzLiNkcmFnU3RhcnRZX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZHJhZ0N1cnJlbnRZX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNCh0aGlzLCBfZHJhZ1N0YXJ0WV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzQodGhpcywgX2RyYWdDdXJyZW50WV9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBkcmFnQ3VycmVudFkoKSB7CiAgICAgIHJldHVybiB0aGlzLiNkcmFnQ3VycmVudFlfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkcmFnQ3VycmVudFkodmFsdWUyKSB7CiAgICAgIHRoaXMuI2RyYWdDdXJyZW50WV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3RhcmdldEluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNCh0aGlzLCBfZHJhZ0N1cnJlbnRZX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzNCh0aGlzLCBfdGFyZ2V0SW5kZXhfaW5pdGlhbGl6ZXJzLCAtMSkpOwogICAgZ2V0IHRhcmdldEluZGV4KCkgewogICAgICByZXR1cm4gdGhpcy4jdGFyZ2V0SW5kZXhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0YXJnZXRJbmRleCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdGFyZ2V0SW5kZXhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpdGVtSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNCh0aGlzLCBfdGFyZ2V0SW5kZXhfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM0KHRoaXMsIF9pdGVtSGVpZ2h0X2luaXRpYWxpemVycywgMCkpOwogICAgZ2V0IGl0ZW1IZWlnaHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpdGVtSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaXRlbUhlaWdodCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXRlbUhlaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgLy8gQm91bmQgZXZlbnQgaGFuZGxlcnMgZm9yIGNsZWFudXAKICAgIGJvdW5kSGFuZGxlR2xvYmFsRHJhZ092ZXIgPSAoX19ydW5Jbml0aWFsaXplcnMzNCh0aGlzLCBfaXRlbUhlaWdodF9leHRyYUluaXRpYWxpemVycyksIG51bGwpOwogICAgYm91bmRIYW5kbGVHbG9iYWxEcmFnRW5kID0gbnVsbDsKICAgIC8vIFN0b3JlIG9yaWdpbmFsIGl0ZW0gcG9zaXRpb25zIGZvciBhY2N1cmF0ZSBoaXQgZGV0ZWN0aW9uIChiZWZvcmUgdHJhbnNmb3JtcykKICAgIG9yaWdpbmFsSXRlbVJlY3RzID0gW107CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIC4uLkRlZXNJbnB1dEJhc2UuYmFzZVN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgJ1JvYm90bycsIHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC5pbnB1dC13cmFwcGVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLmxpc3QtY29udGFpbmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgMy45JSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5saXN0LWNvbnRhaW5lcjpob3Zlcjpub3QoLmRpc2FibGVkKSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNzkuOCUpIiwgImhzbCgwIDAlIDIwLjklKSIpfTsKICAgICAgfQoKICAgICAgLmxpc3QtY29udGFpbmVyOmZvY3VzLXdpdGhpbiB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlIC8gMC4xKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUgLyAwLjEpIil9OwogICAgICB9CgogICAgICAubGlzdC1jb250YWluZXIuZGlzYWJsZWQgewogICAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICB9CgogICAgICAubGlzdC1pdGVtcyB7CiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgLmxpc3QtaXRlbSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHBhZGRpbmc6IDEycHggMTZweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDMuOSUpIil9OwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzIGVhc2UsIGJhY2tncm91bmQgMC4xNXMgZWFzZSwgYm94LXNoYWRvdyAwLjE1cyBlYXNlOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOyAvKiBQcmV2ZW50IGFuaW1hdGlvbiBmcm9tIGFmZmVjdGluZyBzY3JvbGwgYm91bmRzICovCiAgICAgIH0KCiAgICAgIC5saXN0LWl0ZW06bGFzdC1vZi10eXBlIHsKICAgICAgICBib3JkZXItYm90dG9tOiBub25lOwogICAgICB9CgogICAgICAubGlzdC1pdGVtczpub3QoLmlzLWRyYWdnaW5nKSAubGlzdC1pdGVtOmhvdmVyOm5vdCguZGlzYWJsZWQpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTcuNSUpIiwgImhzbCgwIDAlIDYuOSUpIil9OwogICAgICB9CgogICAgICAvKiBEcmFnZ2luZyBpdGVtIC0gZm9sbG93cyBjdXJzb3IgKi8KICAgICAgLmxpc3QtaXRlbS5kcmFnZ2luZyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHotaW5kZXg6IDEwMDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTglKSIsICJoc2woMjE1IDIwLjIlIDEyJSkiKX07CiAgICAgICAgYm94LXNoYWRvdzogMCA0cHggMTJweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjE1KSIsICJyZ2JhKDAsIDAsIDAsIDAuNCkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIHRyYW5zaXRpb246IGJveC1zaGFkb3cgMC4xNXMgZWFzZSwgYmFja2dyb3VuZCAwLjE1cyBlYXNlOwogICAgICB9CgogICAgICAvKiBJdGVtcyB0aGF0IG5lZWQgdG8gbW92ZSB1cCB0byBtYWtlIHNwYWNlICovCiAgICAgIC5saXN0LWl0ZW0ubW92ZS11cCB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKGNhbGMoLTEgKiB2YXIoLS1pdGVtLWhlaWdodCwgNDhweCkpKTsKICAgICAgfQoKICAgICAgLyogSXRlbXMgdGhhdCBuZWVkIHRvIG1vdmUgZG93biB0byBtYWtlIHNwYWNlICovCiAgICAgIC5saXN0LWl0ZW0ubW92ZS1kb3duIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkodmFyKC0taXRlbS1oZWlnaHQsIDQ4cHgpKTsKICAgICAgfQoKCiAgICAgIC5kcmFnLWhhbmRsZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGN1cnNvcjogbW92ZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDYzLjklKSIsICJoc2woMCAwJSA0NS4xJSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogY29sb3IgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLmRyYWctaGFuZGxlOmhvdmVyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQ1LjElKSIsICJoc2woMCAwJSA2My45JSkiKX07CiAgICAgIH0KCiAgICAgIC5kcmFnLWhhbmRsZSBkZWVzLWljb24gewogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgfQoKICAgICAgLml0ZW0tY29udGVudCB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICB9CgogICAgICAuaXRlbS10ZXh0IHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk1JSkiKX07CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CiAgICAgIH0KCiAgICAgIC5pdGVtLWVkaXQtaW5wdXQgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgcGFkZGluZzogNHB4IDhweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDklKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk1JSkiKX07CiAgICAgIH0KCiAgICAgIC5pdGVtLWFjdGlvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB3aWR0aDogMjhweDsKICAgICAgICBoZWlnaHQ6IDI4cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NS4xJSkiLCAiaHNsKDAgMCUgNjMuOSUpIil9OwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk1LjElKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTUlKSIpfTsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idXR0b24uc2F2ZSB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyLjEgNzYuMiUgMzYuMyUpIiwgImhzbCgxNDIuMSA3MC42JSA0NS4zJSkiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uLnNhdmU6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyLjEgNzYuMiUgMzYuMyUgLyAwLjEpIiwgImhzbCgxNDIuMSA3MC42JSA0NS4zJSAvIDAuMSkiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnV0dG9uLmNhbmNlbCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA3Mi4yJSA1MC42JSkiLCAiaHNsKDAgNjIuOCUgNTAuNiUpIil9OwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbi5jYW5jZWw6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA3Mi4yJSA1MC42JSAvIDAuMSkiLCAiaHNsKDAgNjIuOCUgNTAuNiUgLyAwLjEpIil9OwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbi5kZWxldGUgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzIuMiUgNTAuNiUpIiwgImhzbCgwIDYyLjglIDUwLjYlKSIpfTsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idXR0b24uZGVsZXRlOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzIuMiUgNTAuNiUgLyAwLjEpIiwgImhzbCgwIDYyLjglIDUwLjYlIC8gMC4xKSIpfTsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idXR0b24gZGVlcy1pY29uIHsKICAgICAgICB3aWR0aDogMTRweDsKICAgICAgICBoZWlnaHQ6IDE0cHg7CiAgICAgIH0KCiAgICAgIC5hZGQtaXRlbS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5Ny41JSkiLCAiaHNsKDAgMCUgNi45JSkiKX07CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICB9CgogICAgICAuYWRkLWlucHV0IHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk1JSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5hZGQtaW5wdXQ6Zm9jdXMgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA1MS4yJSkiLCAiaHNsKDIxNy4yIDkxLjIlIDU5LjglKSIpfTsKICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA1MS4yJSAvIDAuMSkiLCAiaHNsKDIxNy4yIDkxLjIlIDU5LjglIC8gMC4xKSIpfTsKICAgICAgfQoKICAgICAgLmFkZC1pbnB1dDo6cGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNjMuOSUpIiwgImhzbCgwIDAlIDQ1LjElKSIpfTsKICAgICAgfQoKICAgICAgLmFkZC1pbnB1dDpkaXNhYmxlZCB7CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIC5hZGQtYnV0dG9uIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTZweDsKICAgICAgfQoKICAgICAgLmVtcHR5LXN0YXRlIHsKICAgICAgICBwYWRkaW5nOiAzMnB4IDE2cHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNjMuOSUpIiwgImhzbCgwIDAlIDQ1LjElKSIpfTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICB9CgogICAgICAudmFsaWRhdGlvbi1tZXNzYWdlIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcyLjIlIDUwLjYlKSIsICJoc2woMCA2Mi44JSAzMC42JSkiKX07CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIG1hcmdpbi10b3A6IDZweDsKICAgICAgICBsaW5lLWhlaWdodDogMS41OwogICAgICB9CgogICAgICAuZGVzY3JpcHRpb24gewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDU2LjklKSIsICJoc2woMjE1IDIwLjIlIDU1LjElKSIpfTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWFyZ2luLXRvcDogNnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICAgIH0KCiAgICAgIC8qIFNjcm9sbGJhciBzdHlsaW5nICovCiAgICAgIC5saXN0LWl0ZW1zOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICAgICAgd2lkdGg6IDhweDsKICAgICAgfQoKICAgICAgLmxpc3QtaXRlbXM6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgLmxpc3QtaXRlbXM6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDI0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgIH0KCiAgICAgIC5saXN0LWl0ZW1zOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDc5LjglKSIsICJoc2woMCAwJSAzNC45JSkiKX07CiAgICAgIH0KCiAgICAgIC8qIERpc2FibGUgdHJhbnNpdGlvbnMgZHVyaW5nIGRyb3AgdG8gcHJldmVudCBmbGFzaCAqLwogICAgICAubGlzdC1pdGVtcy5kcm9wcGluZyAubGlzdC1pdGVtIHsKICAgICAgICB0cmFuc2l0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgICAgJHt0aGlzLmxhYmVsID8gYjJgPGRlZXMtbGFiZWwgLmxhYmVsPSR7dGhpcy5sYWJlbH0gLnJlcXVpcmVkPSR7dGhpcy5yZXF1aXJlZH0+PC9kZWVzLWxhYmVsPmAgOiAiIn0KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJsaXN0LWNvbnRhaW5lciAke3RoaXMuZGlzYWJsZWQgPyAiZGlzYWJsZWQiIDogIiJ9Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9Imxpc3QtaXRlbXMiPgogICAgICAgICAgICAke3RoaXMudmFsdWUubGVuZ3RoID4gMCA/IHRoaXMudmFsdWUubWFwKChpdGVtLCBpbmRleDIpID0+IGIyYAogICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgIGNsYXNzPSJsaXN0LWl0ZW0gJHt0aGlzLmRyYWdnZWRJbmRleCA9PT0gaW5kZXgyID8gImRyYWdnaW5nIiA6ICIifSIKICAgICAgICAgICAgICAgIGRyYWdnYWJsZT0iJHt0aGlzLnNvcnRhYmxlICYmICF0aGlzLmRpc2FibGVkfSIKICAgICAgICAgICAgICAgIEBkcmFnc3RhcnQ9JHsoZTExKSA9PiB0aGlzLmhhbmRsZURyYWdTdGFydChlMTEsIGluZGV4Mil9CiAgICAgICAgICAgICAgICBAZHJhZ2VuZD0ke3RoaXMuaGFuZGxlRHJhZ0VuZH0KICAgICAgICAgICAgICAgIEBkcmFnb3Zlcj0keyhlMTEpID0+IHRoaXMuaGFuZGxlRHJhZ092ZXIoZTExLCBpbmRleDIpfQogICAgICAgICAgICAgICAgQGRyb3A9JHsoZTExKSA9PiB0aGlzLmhhbmRsZURyb3AoZTExLCBpbmRleDIpfQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICR7dGhpcy5zb3J0YWJsZSAmJiAhdGhpcy5kaXNhYmxlZCA/IGIyYAogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkcmFnLWhhbmRsZSI+CiAgICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6Z3JpcFZlcnRpY2FsIn0+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgYCA6ICIifQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpdGVtLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAke3RoaXMuZWRpdGluZ0luZGV4ID09PSBpbmRleDIgPyBiMmAKICAgICAgICAgICAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InRleHQiCiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iaXRlbS1lZGl0LWlucHV0IgogICAgICAgICAgICAgICAgICAgICAgLnZhbHVlPSR7dGhpcy5lZGl0aW5nVmFsdWV9CiAgICAgICAgICAgICAgICAgICAgICBAaW5wdXQ9JHsoZTExKSA9PiB0aGlzLmVkaXRpbmdWYWx1ZSA9IGUxMS50YXJnZXQudmFsdWV9CiAgICAgICAgICAgICAgICAgICAgICBAa2V5ZG93bj0keyhlMTEpID0+IHRoaXMuaGFuZGxlRWRpdEtleURvd24oZTExLCBpbmRleDIpfQogICAgICAgICAgICAgICAgICAgICAgQGJsdXI9JHsoKSA9PiB0aGlzLnNhdmVFZGl0KGluZGV4Mil9CiAgICAgICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICAgICAgYCA6IGIyYAogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Iml0ZW0tdGV4dCIgQGRibGNsaWNrPSR7KCkgPT4gIXRoaXMuZGlzYWJsZWQgJiYgdGhpcy5zdGFydEVkaXQoaW5kZXgyKX0+CiAgICAgICAgICAgICAgICAgICAgICAke2l0ZW19CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIGB9CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1hY3Rpb25zIj4KICAgICAgICAgICAgICAgICAgJHt0aGlzLmVkaXRpbmdJbmRleCA9PT0gaW5kZXgyID8gYjJgCiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWN0aW9uLWJ1dHRvbiBzYXZlIiBAY2xpY2s9JHsoKSA9PiB0aGlzLnNhdmVFZGl0KGluZGV4Mil9PgogICAgICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6Y2hlY2sifT48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhY3Rpb24tYnV0dG9uIGNhbmNlbCIgQGNsaWNrPSR7KCkgPT4gdGhpcy5jYW5jZWxFZGl0KCl9PgogICAgICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6eCJ9PjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICBgIDogYjJgCiAgICAgICAgICAgICAgICAgICAgJHshdGhpcy5kaXNhYmxlZCA/IGIyYAogICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWN0aW9uLWJ1dHRvbiIgQGNsaWNrPSR7KCkgPT4gdGhpcy5zdGFydEVkaXQoaW5kZXgyKX0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOnBlbmNpbCJ9PjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhY3Rpb24tYnV0dG9uIGRlbGV0ZSIgQGNsaWNrPSR7KCkgPT4gdGhpcy5yZW1vdmVJdGVtKGluZGV4Mil9PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTp0cmFzaDIifT48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICAgICAgYH0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgKSA6IGIyYAogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlIj4KICAgICAgICAgICAgICAgIE5vIGl0ZW1zIGFkZGVkIHlldAogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgICAKICAgICAgICAgICR7IXRoaXMuZGlzYWJsZWQgJiYgKCF0aGlzLm1heEl0ZW1zIHx8IHRoaXMudmFsdWUubGVuZ3RoIDwgdGhpcy5tYXhJdGVtcykgPyBiMmAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWRkLWl0ZW0tY29udGFpbmVyIj4KICAgICAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgICAgIHR5cGU9InRleHQiCiAgICAgICAgICAgICAgICBjbGFzcz0iYWRkLWlucHV0IgogICAgICAgICAgICAgICAgLnBsYWNlaG9sZGVyPSR7dGhpcy5wbGFjZWhvbGRlcn0KICAgICAgICAgICAgICAgIC52YWx1ZT0ke3RoaXMuaW5wdXRWYWx1ZX0KICAgICAgICAgICAgICAgIEBpbnB1dD0ke3RoaXMuaGFuZGxlSW5wdXR9CiAgICAgICAgICAgICAgICBAa2V5ZG93bj0ke3RoaXMuaGFuZGxlQWRkS2V5RG93bn0KICAgICAgICAgICAgICAgID9kaXNhYmxlZD0ke3RoaXMuZGlzYWJsZWR9CiAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICA8ZGVlcy1idXR0b24KICAgICAgICAgICAgICAgIGNsYXNzPSJhZGQtYnV0dG9uIgogICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy5hZGRJdGVtfQogICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7IXRoaXMuaW5wdXRWYWx1ZS50cmltKCl9CiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6cGx1cyJ9PjwvZGVlcy1pY29uPiBBZGQKICAgICAgICAgICAgICA8L2RlZXMtYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGAgOiAiIn0KICAgICAgICA8L2Rpdj4KCiAgICAgICAgJHt0aGlzLnZhbGlkYXRpb25UZXh0ID8gYjJgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJ2YWxpZGF0aW9uLW1lc3NhZ2UiPiR7dGhpcy52YWxpZGF0aW9uVGV4dH08L2Rpdj4KICAgICAgICBgIDogIiJ9CiAgICAgICAgCiAgICAgICAgJHt0aGlzLmRlc2NyaXB0aW9uID8gYjJgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJkZXNjcmlwdGlvbiI+JHt0aGlzLmRlc2NyaXB0aW9ufTwvZGl2PgogICAgICAgIGAgOiAiIn0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgaGFuZGxlSW5wdXQoZTExKSB7CiAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IGUxMS50YXJnZXQudmFsdWU7CiAgICB9CiAgICBoYW5kbGVBZGRLZXlEb3duKGUxMSkgewogICAgICBpZiAoZTExLmtleSA9PT0gIkVudGVyIiAmJiB0aGlzLmlucHV0VmFsdWUudHJpbSgpKSB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdGhpcy5hZGRJdGVtKCk7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZUVkaXRLZXlEb3duKGUxMSwgaW5kZXgyKSB7CiAgICAgIGlmIChlMTEua2V5ID09PSAiRW50ZXIiKSB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdGhpcy5zYXZlRWRpdChpbmRleDIpOwogICAgICB9IGVsc2UgaWYgKGUxMS5rZXkgPT09ICJFc2NhcGUiKSB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdGhpcy5jYW5jZWxFZGl0KCk7CiAgICAgIH0KICAgIH0KICAgIGFkZEl0ZW0oKSB7CiAgICAgIGNvbnN0IHRyaW1tZWRWYWx1ZSA9IHRoaXMuaW5wdXRWYWx1ZS50cmltKCk7CiAgICAgIGlmICghdHJpbW1lZFZhbHVlKQogICAgICAgIHJldHVybjsKICAgICAgaWYgKCF0aGlzLmFsbG93RHVwbGljYXRlcyAmJiB0aGlzLnZhbHVlLmluY2x1ZGVzKHRyaW1tZWRWYWx1ZSkpIHsKICAgICAgICB0aGlzLnZhbGlkYXRpb25UZXh0ID0gIlRoaXMgaXRlbSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbGlzdCI7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnZhbGlkYXRpb25UZXh0ID0gIiIsIDNlMyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLm1heEl0ZW1zICYmIHRoaXMudmFsdWUubGVuZ3RoID49IHRoaXMubWF4SXRlbXMpIHsKICAgICAgICB0aGlzLnZhbGlkYXRpb25UZXh0ID0gYE1heGltdW0gJHt0aGlzLm1heEl0ZW1zfSBpdGVtcyBhbGxvd2VkYDsKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudmFsaWRhdGlvblRleHQgPSAiIiwgM2UzKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy52YWx1ZSA9IFsuLi50aGlzLnZhbHVlLCB0cmltbWVkVmFsdWVdOwogICAgICB0aGlzLmlucHV0VmFsdWUgPSAiIjsKICAgICAgdGhpcy52YWxpZGF0aW9uVGV4dCA9ICIiOwogICAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmFkZC1pbnB1dCIpOwogICAgICBpZiAoaW5wdXQpIHsKICAgICAgICBpbnB1dC52YWx1ZSA9ICIiOwogICAgICAgIGlucHV0LmZvY3VzKCk7CiAgICAgIH0KICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7CiAgICB9CiAgICBzdGFydEVkaXQoaW5kZXgyKSB7CiAgICAgIHRoaXMuZWRpdGluZ0luZGV4ID0gaW5kZXgyOwogICAgICB0aGlzLmVkaXRpbmdWYWx1ZSA9IHRoaXMudmFsdWVbaW5kZXgyXTsKICAgICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHsKICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLml0ZW0tZWRpdC1pbnB1dCIpOwogICAgICAgIGlmIChpbnB1dCkgewogICAgICAgICAgaW5wdXQuZm9jdXMoKTsKICAgICAgICAgIGlucHV0LnNlbGVjdCgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBzYXZlRWRpdChpbmRleDIpIHsKICAgICAgY29uc3QgdHJpbW1lZFZhbHVlID0gdGhpcy5lZGl0aW5nVmFsdWUudHJpbSgpOwogICAgICBpZiAoIXRyaW1tZWRWYWx1ZSkgewogICAgICAgIHRoaXMuY2FuY2VsRWRpdCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIXRoaXMuYWxsb3dEdXBsaWNhdGVzICYmIHRyaW1tZWRWYWx1ZSAhPT0gdGhpcy52YWx1ZVtpbmRleDJdICYmIHRoaXMudmFsdWUuaW5jbHVkZXModHJpbW1lZFZhbHVlKSkgewogICAgICAgIHRoaXMudmFsaWRhdGlvblRleHQgPSAiVGhpcyBpdGVtIGFscmVhZHkgZXhpc3RzIGluIHRoZSBsaXN0IjsKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudmFsaWRhdGlvblRleHQgPSAiIiwgM2UzKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgbmV3VmFsdWUgPSBbLi4udGhpcy52YWx1ZV07CiAgICAgIG5ld1ZhbHVlW2luZGV4Ml0gPSB0cmltbWVkVmFsdWU7CiAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKICAgICAgdGhpcy5lZGl0aW5nSW5kZXggPSAtMTsKICAgICAgdGhpcy5lZGl0aW5nVmFsdWUgPSAiIjsKICAgICAgdGhpcy52YWxpZGF0aW9uVGV4dCA9ICIiOwogICAgICB0aGlzLmVtaXRDaGFuZ2UoKTsKICAgIH0KICAgIGNhbmNlbEVkaXQoKSB7CiAgICAgIHRoaXMuZWRpdGluZ0luZGV4ID0gLTE7CiAgICAgIHRoaXMuZWRpdGluZ1ZhbHVlID0gIiI7CiAgICB9CiAgICBhc3luYyByZW1vdmVJdGVtKGluZGV4MikgewogICAgICBpZiAodGhpcy5jb25maXJtRGVsZXRlKSB7CiAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5zaG93Q29uZmlybURpYWxvZyhgRGVsZXRlICIke3RoaXMudmFsdWVbaW5kZXgyXX0iP2ApOwogICAgICAgIGlmICghY29uZmlybWVkKQogICAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcigoXzUsIGkxMSkgPT4gaTExICE9PSBpbmRleDIpOwogICAgICB0aGlzLmVtaXRDaGFuZ2UoKTsKICAgIH0KICAgIGFzeW5jIHNob3dDb25maXJtRGlhbG9nKG1lc3NhZ2UyKSB7CiAgICAgIHJldHVybiBjb25maXJtKG1lc3NhZ2UyKTsKICAgIH0KICAgIC8vIERyYWcgYW5kIGRyb3AgaGFuZGxlcnMgLSBJbnRlcmFjdGl2ZSBpbXBsZW1lbnRhdGlvbgogICAgaGFuZGxlRHJhZ1N0YXJ0KGUxMSwgaW5kZXgyKSB7CiAgICAgIGlmICghdGhpcy5zb3J0YWJsZSB8fCB0aGlzLmRpc2FibGVkKQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5kcmFnZ2VkSW5kZXggPSBpbmRleDI7CiAgICAgIHRoaXMudGFyZ2V0SW5kZXggPSBpbmRleDI7CiAgICAgIGUxMS5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9ICJtb3ZlIjsKICAgICAgZTExLmRhdGFUcmFuc2Zlci5zZXREYXRhKCJ0ZXh0L3BsYWluIiwgaW5kZXgyLnRvU3RyaW5nKCkpOwogICAgICBjb25zdCBlbXB0eUltZyA9IG5ldyBJbWFnZSgpOwogICAgICBlbXB0eUltZy5zcmMgPSAiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBQVVFQkFBQUFDd0FBQUFBQVFBQkFBQUNBa1FCQURzPSI7CiAgICAgIGUxMS5kYXRhVHJhbnNmZXIuc2V0RHJhZ0ltYWdlKGVtcHR5SW1nLCAwLCAwKTsKICAgICAgdGhpcy5kcmFnU3RhcnRZID0gZTExLmNsaWVudFk7CiAgICAgIHRoaXMuZHJhZ0N1cnJlbnRZID0gZTExLmNsaWVudFk7CiAgICAgIGNvbnN0IGxpc3RJdGVtcyA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmxpc3QtaXRlbXMiKTsKICAgICAgY29uc3QgYWxsSXRlbXMgPSBBcnJheS5mcm9tKGxpc3RJdGVtcz8ucXVlcnlTZWxlY3RvckFsbCgiLmxpc3QtaXRlbSIpIHx8IFtdKTsKICAgICAgaWYgKGFsbEl0ZW1zW2luZGV4Ml0pIHsKICAgICAgICB0aGlzLml0ZW1IZWlnaHQgPSBhbGxJdGVtc1tpbmRleDJdLm9mZnNldEhlaWdodDsKICAgICAgfQogICAgICB0aGlzLm9yaWdpbmFsSXRlbVJlY3RzID0gYWxsSXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTsKICAgICAgbGlzdEl0ZW1zPy5jbGFzc0xpc3QuYWRkKCJpcy1kcmFnZ2luZyIpOwogICAgICB0aGlzLmJvdW5kSGFuZGxlR2xvYmFsRHJhZ092ZXIgPSB0aGlzLmhhbmRsZUdsb2JhbERyYWdPdmVyLmJpbmQodGhpcyk7CiAgICAgIHRoaXMuYm91bmRIYW5kbGVHbG9iYWxEcmFnRW5kID0gdGhpcy5oYW5kbGVHbG9iYWxEcmFnRW5kLmJpbmQodGhpcyk7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImRyYWdvdmVyIiwgdGhpcy5ib3VuZEhhbmRsZUdsb2JhbERyYWdPdmVyKTsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZHJhZ2VuZCIsIHRoaXMuYm91bmRIYW5kbGVHbG9iYWxEcmFnRW5kKTsKICAgIH0KICAgIGhhbmRsZUdsb2JhbERyYWdPdmVyKGUxMSkgewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgaWYgKHRoaXMuZHJhZ2dlZEluZGV4ID09PSAtMSkKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMuZHJhZ0N1cnJlbnRZID0gZTExLmNsaWVudFk7CiAgICAgIGNvbnN0IGxpc3RJdGVtcyA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmxpc3QtaXRlbXMiKTsKICAgICAgaWYgKCFsaXN0SXRlbXMpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20obGlzdEl0ZW1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi5saXN0LWl0ZW0iKSk7CiAgICAgIGNvbnN0IGRyYWdnZWRFbGVtZW50ID0gaXRlbXNbdGhpcy5kcmFnZ2VkSW5kZXhdOwogICAgICBpZiAoIWRyYWdnZWRFbGVtZW50KQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgZGVsdGFZID0gdGhpcy5kcmFnQ3VycmVudFkgLSB0aGlzLmRyYWdTdGFydFk7CiAgICAgIGRyYWdnZWRFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7ZGVsdGFZfXB4KWA7CiAgICAgIGNvbnN0IGRyYWdnZWRSZWN0ID0gdGhpcy5vcmlnaW5hbEl0ZW1SZWN0c1t0aGlzLmRyYWdnZWRJbmRleF07CiAgICAgIGlmICghZHJhZ2dlZFJlY3QpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBkcmFnZ2VkQ2VudGVyID0gZHJhZ2dlZFJlY3QudG9wICsgZHJhZ2dlZFJlY3QuaGVpZ2h0IC8gMiArIGRlbHRhWTsKICAgICAgbGV0IG5ld1RhcmdldEluZGV4ID0gdGhpcy5kcmFnZ2VkSW5kZXg7CiAgICAgIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IGl0ZW1zLmxlbmd0aDsgaTExKyspIHsKICAgICAgICBpZiAoaTExID09PSB0aGlzLmRyYWdnZWRJbmRleCkKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLm9yaWdpbmFsSXRlbVJlY3RzW2kxMV07CiAgICAgICAgaWYgKCFyZWN0KQogICAgICAgICAgY29udGludWU7CiAgICAgICAgbGV0IGl0ZW1DZW50ZXIgPSByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gMjsKICAgICAgICBpZiAoaXRlbXNbaTExXS5jbGFzc0xpc3QuY29udGFpbnMoIm1vdmUtdXAiKSkgewogICAgICAgICAgaXRlbUNlbnRlciAtPSB0aGlzLml0ZW1IZWlnaHQ7CiAgICAgICAgfSBlbHNlIGlmIChpdGVtc1tpMTFdLmNsYXNzTGlzdC5jb250YWlucygibW92ZS1kb3duIikpIHsKICAgICAgICAgIGl0ZW1DZW50ZXIgKz0gdGhpcy5pdGVtSGVpZ2h0OwogICAgICAgIH0KICAgICAgICBpZiAoZHJhZ2dlZENlbnRlciA8IGl0ZW1DZW50ZXIgJiYgaTExIDwgdGhpcy5kcmFnZ2VkSW5kZXgpIHsKICAgICAgICAgIG5ld1RhcmdldEluZGV4ID0gaTExOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIGlmIChkcmFnZ2VkQ2VudGVyID4gaXRlbUNlbnRlciAmJiBpMTEgPiB0aGlzLmRyYWdnZWRJbmRleCkgewogICAgICAgICAgbmV3VGFyZ2V0SW5kZXggPSBpMTE7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChuZXdUYXJnZXRJbmRleCAhPT0gdGhpcy50YXJnZXRJbmRleCkgewogICAgICAgIHRoaXMudGFyZ2V0SW5kZXggPSBuZXdUYXJnZXRJbmRleDsKICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1Qb3NpdGlvbnMoaXRlbXMpOwogICAgICB9CiAgICB9CiAgICB1cGRhdGVJdGVtUG9zaXRpb25zKGl0ZW1zKSB7CiAgICAgIGNvbnN0IGRyYWdnZWRJZHggPSB0aGlzLmRyYWdnZWRJbmRleDsKICAgICAgY29uc3QgdGFyZ2V0SWR4ID0gdGhpcy50YXJnZXRJbmRleDsKICAgICAgY29uc3QgbGlzdEl0ZW1zID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIubGlzdC1pdGVtcyIpOwogICAgICBpZiAobGlzdEl0ZW1zKSB7CiAgICAgICAgbGlzdEl0ZW1zLnN0eWxlLnNldFByb3BlcnR5KCItLWl0ZW0taGVpZ2h0IiwgYCR7dGhpcy5pdGVtSGVpZ2h0fXB4YCk7CiAgICAgIH0KICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSwgaTExKSA9PiB7CiAgICAgICAgaWYgKGkxMSA9PT0gZHJhZ2dlZElkeCkKICAgICAgICAgIHJldHVybjsKICAgICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoIm1vdmUtdXAiLCAibW92ZS1kb3duIik7CiAgICAgICAgaXRlbS5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1pdGVtLWhlaWdodCIsIGAke3RoaXMuaXRlbUhlaWdodH1weGApOwogICAgICAgIGlmIChkcmFnZ2VkSWR4IDwgdGFyZ2V0SWR4KSB7CiAgICAgICAgICBpZiAoaTExID4gZHJhZ2dlZElkeCAmJiBpMTEgPD0gdGFyZ2V0SWR4KSB7CiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgibW92ZS11cCIpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZHJhZ2dlZElkeCA+IHRhcmdldElkeCkgewogICAgICAgICAgaWYgKGkxMSA+PSB0YXJnZXRJZHggJiYgaTExIDwgZHJhZ2dlZElkeCkgewogICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoIm1vdmUtZG93biIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBoYW5kbGVHbG9iYWxEcmFnRW5kKCkgewogICAgICBpZiAodGhpcy5ib3VuZEhhbmRsZUdsb2JhbERyYWdPdmVyKSB7CiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZHJhZ292ZXIiLCB0aGlzLmJvdW5kSGFuZGxlR2xvYmFsRHJhZ092ZXIpOwogICAgICAgIHRoaXMuYm91bmRIYW5kbGVHbG9iYWxEcmFnT3ZlciA9IG51bGw7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuYm91bmRIYW5kbGVHbG9iYWxEcmFnRW5kKSB7CiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZHJhZ2VuZCIsIHRoaXMuYm91bmRIYW5kbGVHbG9iYWxEcmFnRW5kKTsKICAgICAgICB0aGlzLmJvdW5kSGFuZGxlR2xvYmFsRHJhZ0VuZCA9IG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgbGlzdEl0ZW1zID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIubGlzdC1pdGVtcyIpOwogICAgICBjb25zdCBpdGVtcyA9IGxpc3RJdGVtcz8ucXVlcnlTZWxlY3RvckFsbCgiLmxpc3QtaXRlbSIpOwogICAgICBjb25zdCBkcmFnZ2VkRWxlbWVudCA9IGl0ZW1zPy5bdGhpcy5kcmFnZ2VkSW5kZXhdOwogICAgICBpZiAodGhpcy5kcmFnZ2VkSW5kZXggPT09IC0xIHx8IHRoaXMudGFyZ2V0SW5kZXggPT09IC0xIHx8IHRoaXMuZHJhZ2dlZEluZGV4ID09PSB0aGlzLnRhcmdldEluZGV4KSB7CiAgICAgICAgaWYgKGRyYWdnZWRFbGVtZW50ICYmIHRoaXMuZHJhZ2dlZEluZGV4ICE9PSAtMSkgewogICAgICAgICAgZHJhZ2dlZEVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbiA9ICJ0cmFuc2Zvcm0gMC4xNXMgZWFzZSI7CiAgICAgICAgICBkcmFnZ2VkRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSAidHJhbnNsYXRlWSgwKSI7CiAgICAgICAgICBsZXQgaGFuZGxlZDIgPSBmYWxzZTsKICAgICAgICAgIGNvbnN0IG9uUmV0dXJuID0gKCkgPT4gewogICAgICAgICAgICBpZiAoaGFuZGxlZDIpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBoYW5kbGVkMiA9IHRydWU7CiAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLCBvblJldHVybik7CiAgICAgICAgICAgIHRoaXMuY2xlYW51cERyYWdTdGF0ZShsaXN0SXRlbXMsIGl0ZW1zKTsKICAgICAgICAgIH07CiAgICAgICAgICBkcmFnZ2VkRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIiwgb25SZXR1cm4sIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgICAgIHNldFRpbWVvdXQob25SZXR1cm4sIDIwMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuY2xlYW51cERyYWdTdGF0ZShsaXN0SXRlbXMsIGl0ZW1zKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IGRyYWdnZWRSZWN0ID0gdGhpcy5vcmlnaW5hbEl0ZW1SZWN0c1t0aGlzLmRyYWdnZWRJbmRleF07CiAgICAgIGNvbnN0IHRhcmdldFJlY3QgPSB0aGlzLm9yaWdpbmFsSXRlbVJlY3RzW3RoaXMudGFyZ2V0SW5kZXhdOwogICAgICBpZiAoIWRyYWdnZWRSZWN0IHx8ICF0YXJnZXRSZWN0IHx8ICFkcmFnZ2VkRWxlbWVudCkgewogICAgICAgIHRoaXMuY2xlYW51cERyYWdTdGF0ZShsaXN0SXRlbXMsIGl0ZW1zKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IGZpbmFsWTsKICAgICAgaWYgKHRoaXMudGFyZ2V0SW5kZXggPiB0aGlzLmRyYWdnZWRJbmRleCkgewogICAgICAgIGZpbmFsWSA9IHRhcmdldFJlY3QuYm90dG9tIC0gZHJhZ2dlZFJlY3QuYm90dG9tOwogICAgICB9IGVsc2UgewogICAgICAgIGZpbmFsWSA9IHRhcmdldFJlY3QudG9wIC0gZHJhZ2dlZFJlY3QudG9wOwogICAgICB9CiAgICAgIGRyYWdnZWRFbGVtZW50LnN0eWxlLnRyYW5zaXRpb24gPSAidHJhbnNmb3JtIDAuMTVzIGVhc2UiOwogICAgICBkcmFnZ2VkRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke2ZpbmFsWX1weClgOwogICAgICBsZXQgaGFuZGxlZCA9IGZhbHNlOwogICAgICBjb25zdCBvblRyYW5zaXRpb25FbmQgPSAoKSA9PiB7CiAgICAgICAgaWYgKGhhbmRsZWQpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgaGFuZGxlZCA9IHRydWU7CiAgICAgICAgZHJhZ2dlZEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsIG9uVHJhbnNpdGlvbkVuZCk7CiAgICAgICAgbGlzdEl0ZW1zPy5jbGFzc0xpc3QuYWRkKCJkcm9wcGluZyIpOwogICAgICAgIHZvaWQgbGlzdEl0ZW1zPy5vZmZzZXRIZWlnaHQ7CiAgICAgICAgaXRlbXM/LmZvckVhY2goKGl0ZW0pID0+IHsKICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgibW92ZS11cCIsICJtb3ZlLWRvd24iLCAiZHJhZ2dpbmciKTsKICAgICAgICAgIGl0ZW0uc3R5bGUucmVtb3ZlUHJvcGVydHkoInRyYW5zZm9ybSIpOwogICAgICAgICAgaXRlbS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidHJhbnNpdGlvbiIpOwogICAgICAgIH0pOwogICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gWy4uLnRoaXMudmFsdWVdOwogICAgICAgIGNvbnN0IFtkcmFnZ2VkSXRlbV0gPSBuZXdWYWx1ZS5zcGxpY2UodGhpcy5kcmFnZ2VkSW5kZXgsIDEpOwogICAgICAgIG5ld1ZhbHVlLnNwbGljZSh0aGlzLnRhcmdldEluZGV4LCAwLCBkcmFnZ2VkSXRlbSk7CiAgICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlOwogICAgICAgIHRoaXMuZW1pdENoYW5nZSgpOwogICAgICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gLTE7CiAgICAgICAgdGhpcy5kcmFnT3ZlckluZGV4ID0gLTE7CiAgICAgICAgdGhpcy50YXJnZXRJbmRleCA9IC0xOwogICAgICAgIHRoaXMuZHJhZ1N0YXJ0WSA9IDA7CiAgICAgICAgdGhpcy5kcmFnQ3VycmVudFkgPSAwOwogICAgICAgIHRoaXMub3JpZ2luYWxJdGVtUmVjdHMgPSBbXTsKICAgICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4gewogICAgICAgICAgY29uc3QgZnJlc2hJdGVtcyA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvckFsbCgiLmxpc3QtaXRlbSIpOwogICAgICAgICAgZnJlc2hJdGVtcz8uZm9yRWFjaCgoaXRlbSkgPT4gewogICAgICAgICAgICBpdGVtLnN0eWxlLnRyYW5zaXRpb24gPSAibm9uZSI7CiAgICAgICAgICB9KTsKICAgICAgICAgIHZvaWQgdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIubGlzdC1pdGVtcyIpPy5vZmZzZXRIZWlnaHQ7CiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgICAgICBmcmVzaEl0ZW1zPy5mb3JFYWNoKChpdGVtKSA9PiB7CiAgICAgICAgICAgICAgaXRlbS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidHJhbnNpdGlvbiIpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgbGlzdEl0ZW1zPy5jbGFzc0xpc3QucmVtb3ZlKCJkcm9wcGluZyIsICJpcy1kcmFnZ2luZyIpOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIGRyYWdnZWRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLCBvblRyYW5zaXRpb25FbmQsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgc2V0VGltZW91dChvblRyYW5zaXRpb25FbmQsIDIwMCk7CiAgICB9CiAgICBjbGVhbnVwRHJhZ1N0YXRlKGxpc3RJdGVtcywgaXRlbXMpIHsKICAgICAgbGlzdEl0ZW1zPy5jbGFzc0xpc3QuYWRkKCJkcm9wcGluZyIpOwogICAgICB2b2lkIGxpc3RJdGVtcz8ub2Zmc2V0SGVpZ2h0OwogICAgICBpdGVtcz8uZm9yRWFjaCgoaXRlbSkgPT4gewogICAgICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgibW92ZS11cCIsICJtb3ZlLWRvd24iLCAiZHJhZ2dpbmciKTsKICAgICAgICBpdGVtLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJ0cmFuc2Zvcm0iKTsKICAgICAgICBpdGVtLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJ0cmFuc2l0aW9uIik7CiAgICAgIH0pOwogICAgICB0aGlzLmRyYWdnZWRJbmRleCA9IC0xOwogICAgICB0aGlzLmRyYWdPdmVySW5kZXggPSAtMTsKICAgICAgdGhpcy50YXJnZXRJbmRleCA9IC0xOwogICAgICB0aGlzLmRyYWdTdGFydFkgPSAwOwogICAgICB0aGlzLmRyYWdDdXJyZW50WSA9IDA7CiAgICAgIHRoaXMub3JpZ2luYWxJdGVtUmVjdHMgPSBbXTsKICAgICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHsKICAgICAgICBjb25zdCBmcmVzaEl0ZW1zID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yQWxsKCIubGlzdC1pdGVtIik7CiAgICAgICAgZnJlc2hJdGVtcz8uZm9yRWFjaCgoaXRlbSkgPT4gewogICAgICAgICAgaXRlbS5zdHlsZS50cmFuc2l0aW9uID0gIm5vbmUiOwogICAgICAgIH0pOwogICAgICAgIHZvaWQgdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIubGlzdC1pdGVtcyIpPy5vZmZzZXRIZWlnaHQ7CiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICAgIGZyZXNoSXRlbXM/LmZvckVhY2goKGl0ZW0pID0+IHsKICAgICAgICAgICAgaXRlbS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidHJhbnNpdGlvbiIpOwogICAgICAgICAgfSk7CiAgICAgICAgICBsaXN0SXRlbXM/LmNsYXNzTGlzdC5yZW1vdmUoImRyb3BwaW5nIiwgImlzLWRyYWdnaW5nIik7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogICAgaGFuZGxlRHJhZ0VuZCgpIHsKICAgICAgdGhpcy5oYW5kbGVHbG9iYWxEcmFnRW5kKCk7CiAgICB9CiAgICBoYW5kbGVEcmFnT3ZlcihlMTEsIGluZGV4MikgewogICAgICBpZiAoIXRoaXMuc29ydGFibGUgfHwgdGhpcy5kaXNhYmxlZCkKICAgICAgICByZXR1cm47CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlMTEuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAibW92ZSI7CiAgICB9CiAgICBoYW5kbGVEcmFnTGVhdmUoKSB7CiAgICB9CiAgICBoYW5kbGVEcm9wKGUxMSwgZHJvcEluZGV4KSB7CiAgICAgIGlmICghdGhpcy5zb3J0YWJsZSB8fCB0aGlzLmRpc2FibGVkKQogICAgICAgIHJldHVybjsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICB9CiAgICBlbWl0Q2hhbmdlKCkgewogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjaGFuZ2UiLCB7CiAgICAgICAgZGV0YWlsOiB7IHZhbHVlOiB0aGlzLnZhbHVlIH0sCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMpOwogICAgfQogICAgZ2V0VmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgfQogICAgc2V0VmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTIgfHwgW107CiAgICB9CiAgICBhc3luYyB2YWxpZGF0ZSgpIHsKICAgICAgaWYgKHRoaXMucmVxdWlyZWQgJiYgKCF0aGlzLnZhbHVlIHx8IHRoaXMudmFsdWUubGVuZ3RoID09PSAwKSkgewogICAgICAgIHRoaXMudmFsaWRhdGlvblRleHQgPSAiQXQgbGVhc3Qgb25lIGl0ZW0gaXMgcmVxdWlyZWQiOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAodGhpcy5taW5JdGVtcyAmJiB0aGlzLnZhbHVlLmxlbmd0aCA8IHRoaXMubWluSXRlbXMpIHsKICAgICAgICB0aGlzLnZhbGlkYXRpb25UZXh0ID0gYEF0IGxlYXN0ICR7dGhpcy5taW5JdGVtc30gaXRlbXMgcmVxdWlyZWRgOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICB0aGlzLnZhbGlkYXRpb25UZXh0ID0gIiI7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnMzNChfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0lucHV0TGlzdDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBnZW5lcmF0ZVJlcG9ydEJsb2NrcyA9ICgpID0+IHsKICBjb25zdCB0aW1lc3RhbXAyID0gRGF0ZS5ub3coKTsKICByZXR1cm4gWwogICAgewogICAgICBpZDogYHRpdGxlLSR7dGltZXN0YW1wMn1gLAogICAgICB0eXBlOiAiaGVhZGluZy0xIiwKICAgICAgY29udGVudDogIlN5c3RlbSBQZXJmb3JtYW5jZSBSZXBvcnQiCiAgICB9LAogICAgewogICAgICBpZDogYGRhdGUtJHt0aW1lc3RhbXAyICsgMX1gLAogICAgICB0eXBlOiAicGFyYWdyYXBoIiwKICAgICAgY29udGVudDogYEdlbmVyYXRlZCBvbjogJHsoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLnRvTG9jYWxlU3RyaW5nKCl9YAogICAgfSwKICAgIHsKICAgICAgaWQ6IGBzdW1tYXJ5LWhlYWRpbmctJHt0aW1lc3RhbXAyICsgMn1gLAogICAgICB0eXBlOiAiaGVhZGluZy0yIiwKICAgICAgY29udGVudDogIkV4ZWN1dGl2ZSBTdW1tYXJ5IgogICAgfSwKICAgIHsKICAgICAgaWQ6IGBzdW1tYXJ5LSR7dGltZXN0YW1wMiArIDN9YCwKICAgICAgdHlwZTogInBhcmFncmFwaCIsCiAgICAgIGNvbnRlbnQ6ICJUaGlzIHJlcG9ydCBwcm92aWRlcyBhbiBhbmFseXNpcyBvZiBzeXN0ZW0gcGVyZm9ybWFuY2UgbWV0cmljcyBvdmVyIHRoZSBsYXN0IDMwIGRheXMuIgogICAgfSwKICAgIHsKICAgICAgaWQ6IGBtZXRyaWNzLWhlYWRpbmctJHt0aW1lc3RhbXAyICsgNH1gLAogICAgICB0eXBlOiAiaGVhZGluZy0yIiwKICAgICAgY29udGVudDogIktleSBNZXRyaWNzIgogICAgfSwKICAgIHsKICAgICAgaWQ6IGBtZXRyaWNzLWxpc3QtJHt0aW1lc3RhbXAyICsgNX1gLAogICAgICB0eXBlOiAibGlzdCIsCiAgICAgIGNvbnRlbnQ6ICJBdmVyYWdlIHJlc3BvbnNlIHRpbWU6IDEyNG1zXG5VcHRpbWU6IDk5Ljk3JVxuQ1BVIHV0aWxpemF0aW9uOiA0NSVcbk1lbW9yeSB1c2FnZTogMi4zR0IgLyA4R0IiLAogICAgICBtZXRhZGF0YTogeyBsaXN0VHlwZTogImJ1bGxldCIgfQogICAgfSwKICAgIHsKICAgICAgaWQ6IGBhbmFseXNpcy1oZWFkaW5nLSR7dGltZXN0YW1wMiArIDZ9YCwKICAgICAgdHlwZTogImhlYWRpbmctMiIsCiAgICAgIGNvbnRlbnQ6ICJQZXJmb3JtYW5jZSBBbmFseXNpcyIKICAgIH0sCiAgICB7CiAgICAgIGlkOiBgYW5hbHlzaXMtcXVvdGUtJHt0aW1lc3RhbXAyICsgN31gLAogICAgICB0eXBlOiAicXVvdGUiLAogICAgICBjb250ZW50OiAiU3lzdGVtIHBlcmZvcm1hbmNlIHJlbWFpbnMgd2l0aGluIGFjY2VwdGFibGUgcGFyYW1ldGVycyB3aXRoIHJvb20gZm9yIG9wdGltaXphdGlvbiBpbiBtZW1vcnkgbWFuYWdlbWVudC4iCiAgICB9LAogICAgewogICAgICBpZDogYGNvZGUtaGVhZGluZy0ke3RpbWVzdGFtcDIgKyA4fWAsCiAgICAgIHR5cGU6ICJoZWFkaW5nLTMiLAogICAgICBjb250ZW50OiAiU2FtcGxlIFF1ZXJ5IFBlcmZvcm1hbmNlIgogICAgfSwKICAgIHsKICAgICAgaWQ6IGBjb2RlLWJsb2NrLSR7dGltZXN0YW1wMiArIDl9YCwKICAgICAgdHlwZTogImNvZGUiLAogICAgICBjb250ZW50OiAiU0VMRUNUIEFWRyhyZXNwb25zZV90aW1lKSBhcyBhdmdfdGltZSxcbiAgICAgICBDT1VOVCgqKSBhcyB0b3RhbF9yZXF1ZXN0cyxcbiAgICAgICBEQVRFKGNyZWF0ZWRfYXQpIGFzIGRhdGVcbkZST00gcGVyZm9ybWFuY2VfbG9nc1xuV0hFUkUgY3JlYXRlZF9hdCA+PSBOT1coKSAtIElOVEVSVkFMIDMwIERBWVxuR1JPVVAgQlkgREFURShjcmVhdGVkX2F0KVxuT1JERVIgQlkgZGF0ZSBERVNDOyIsCiAgICAgIG1ldGFkYXRhOiB7IGxhbmd1YWdlOiAic3FsIiB9CiAgICB9LAogICAgewogICAgICBpZDogYGRpdmlkZXItJHt0aW1lc3RhbXAyICsgMTB9YCwKICAgICAgdHlwZTogImRpdmlkZXIiLAogICAgICBjb250ZW50OiAiIgogICAgfSwKICAgIHsKICAgICAgaWQ6IGBmb290ZXItJHt0aW1lc3RhbXAyICsgMTF9YCwKICAgICAgdHlwZTogInBhcmFncmFwaCIsCiAgICAgIGNvbnRlbnQ6ICJSZXBvcnQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgU3lzdGVtIE1vbml0b3IgdjIuNS4wIgogICAgfQogIF07Cn07CnZhciBnZW5lcmF0ZVJlY2lwZUJsb2NrcyA9ICgpID0+IHsKICBjb25zdCB0aW1lc3RhbXAyID0gRGF0ZS5ub3coKTsKICByZXR1cm4gWwogICAgewogICAgICBpZDogYHJlY2lwZS10aXRsZS0ke3RpbWVzdGFtcDJ9YCwKICAgICAgdHlwZTogImhlYWRpbmctMSIsCiAgICAgIGNvbnRlbnQ6ICJDbGFzc2ljIE1hcmdoZXJpdGEgUGl6emEiCiAgICB9LAogICAgewogICAgICBpZDogYHJlY2lwZS1pbnRyby0ke3RpbWVzdGFtcDIgKyAxfWAsCiAgICAgIHR5cGU6ICJwYXJhZ3JhcGgiLAogICAgICBjb250ZW50OiAiQSB0cmFkaXRpb25hbCBJdGFsaWFuIHBpenphIHdpdGggZnJlc2ggYmFzaWwsIG1venphcmVsbGEsIGFuZCB0b21hdG8gc2F1Y2UuIgogICAgfSwKICAgIHsKICAgICAgaWQ6IGBpbmdyZWRpZW50cy1oZWFkaW5nLSR7dGltZXN0YW1wMiArIDJ9YCwKICAgICAgdHlwZTogImhlYWRpbmctMiIsCiAgICAgIGNvbnRlbnQ6ICJcdXsxRjM1NX0gSW5ncmVkaWVudHMiCiAgICB9LAogICAgewogICAgICBpZDogYGRvdWdoLWhlYWRpbmctJHt0aW1lc3RhbXAyICsgM31gLAogICAgICB0eXBlOiAiaGVhZGluZy0zIiwKICAgICAgY29udGVudDogIkZvciB0aGUgRG91Z2g6IgogICAgfSwKICAgIHsKICAgICAgaWQ6IGBkb3VnaC1saXN0LSR7dGltZXN0YW1wMiArIDR9YCwKICAgICAgdHlwZTogImxpc3QiLAogICAgICBjb250ZW50OiAnNTAwZyB0aXBvICIwMCIgZmxvdXJcbjMyNW1sIHdhcm0gd2F0ZXJcbjEwZyBzYWx0XG43ZyBhY3RpdmUgZHJ5IHllYXN0XG4yIHRic3Agb2xpdmUgb2lsJywKICAgICAgbWV0YWRhdGE6IHsgbGlzdFR5cGU6ICJidWxsZXQiIH0KICAgIH0sCiAgICB7CiAgICAgIGlkOiBgdG9wcGluZ3MtaGVhZGluZy0ke3RpbWVzdGFtcDIgKyA1fWAsCiAgICAgIHR5cGU6ICJoZWFkaW5nLTMiLAogICAgICBjb250ZW50OiAiRm9yIHRoZSBUb3BwaW5nczoiCiAgICB9LAogICAgewogICAgICBpZDogYHRvcHBpbmdzLWxpc3QtJHt0aW1lc3RhbXAyICsgNn1gLAogICAgICB0eXBlOiAibGlzdCIsCiAgICAgIGNvbnRlbnQ6ICI0MDBnIGNhbm5lZCBTYW4gTWFyemFubyB0b21hdG9lc1xuMjUwZyBmcmVzaCBtb3p6YXJlbGxhXG5GcmVzaCBiYXNpbCBsZWF2ZXNcbkV4dHJhIHZpcmdpbiBvbGl2ZSBvaWxcblNhbHQgYW5kIHBlcHBlciB0byB0YXN0ZSIsCiAgICAgIG1ldGFkYXRhOiB7IGxpc3RUeXBlOiAiYnVsbGV0IiB9CiAgICB9LAogICAgewogICAgICBpZDogYGluc3RydWN0aW9ucy1oZWFkaW5nLSR7dGltZXN0YW1wMiArIDd9YCwKICAgICAgdHlwZTogImhlYWRpbmctMiIsCiAgICAgIGNvbnRlbnQ6ICJcdXsxRjQ2OH1cdTIwMERcdXsxRjM3M30gSW5zdHJ1Y3Rpb25zIgogICAgfSwKICAgIHsKICAgICAgaWQ6IGBzdGVwcy1saXN0LSR7dGltZXN0YW1wMiArIDh9YCwKICAgICAgdHlwZTogImxpc3QiLAogICAgICBjb250ZW50OiAiRGlzc29sdmUgeWVhc3QgaW4gd2FybSB3YXRlciBhbmQgbGV0IHN0YW5kIGZvciA1IG1pbnV0ZXNcbk1peCBmbG91ciBhbmQgc2FsdCwgY3JlYXRlIGEgd2VsbCBpbiBjZW50ZXJcbkFkZCB5ZWFzdCBtaXh0dXJlIGFuZCBvbGl2ZSBvaWxcbktuZWFkIGZvciAxMCBtaW51dGVzIHVudGlsIHNtb290aFxuTGV0IHJpc2UgZm9yIDEtMiBob3VycyB1bnRpbCBkb3VibGVkXG5QdW5jaCBkb3duIGFuZCBkaXZpZGUgaW50byBwb3J0aW9uc1xuUm9sbCBvdXQgZWFjaCBwb3J0aW9uIHRvIDEyLWluY2ggY2lyY2xlc1xuVG9wIHdpdGggY3J1c2hlZCB0b21hdG9lcywgbW96emFyZWxsYSwgYW5kIGJhc2lsXG5CYWtlIGF0IDQ3NVx4QjBGICgyNDVceEIwQykgZm9yIDEwLTEyIG1pbnV0ZXMiLAogICAgICBtZXRhZGF0YTogeyBsaXN0VHlwZTogIm9yZGVyZWQiIH0KICAgIH0sCiAgICB7CiAgICAgIGlkOiBgdGlwLSR7dGltZXN0YW1wMiArIDl9YCwKICAgICAgdHlwZTogInF1b3RlIiwKICAgICAgY29udGVudDogIlBybyB0aXA6IEZvciBhbiBhdXRoZW50aWMgdGFzdGUsIHVzZSBhIHBpenphIHN0b25lIGFuZCBwcmVoZWF0IGl0IGluIHRoZSBvdmVuIGZvciBhdCBsZWFzdCAzMCBtaW51dGVzIGJlZm9yZSBiYWtpbmcuIgogICAgfSwKICAgIHsKICAgICAgaWQ6IGBkaXZpZGVyLSR7dGltZXN0YW1wMiArIDEwfWAsCiAgICAgIHR5cGU6ICJkaXZpZGVyIiwKICAgICAgY29udGVudDogIiIKICAgIH0sCiAgICB7CiAgICAgIGlkOiBgc2VydmluZ3MtJHt0aW1lc3RhbXAyICsgMTF9YCwKICAgICAgdHlwZTogInBhcmFncmFwaCIsCiAgICAgIGNvbnRlbnQ6ICJTZXJ2aW5nczogNCBwaXp6YXMgfCBQcmVwIHRpbWU6IDIgaG91cnMgfCBDb29rIHRpbWU6IDEyIG1pbnV0ZXMiCiAgICB9CiAgXTsKfTsKdmFyIGluaXRpYWxpemVFZGl0b3JzID0gKGNvbnRhaW5lcikgPT4gewogIGNvbnN0IGVkaXRvcnMgPSB7fTsKICBlZGl0b3JzLmJhc2ljID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIiNlZGl0b3ItYmFzaWMiKTsKICBlZGl0b3JzLmFydGljbGUgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI2VkaXRvci1hcnRpY2xlIik7CiAgZWRpdG9ycy5kcmFnRHJvcCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIjZWRpdG9yLWRyYWdkcm9wIik7CiAgZWRpdG9ycy50dXRvcmlhbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIjZWRpdG9yLXR1dG9yaWFsIik7CiAgZWRpdG9ycy5tZWV0aW5nID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIiNlZGl0b3ItbWVldGluZyIpOwogIGVkaXRvcnMucmVjaXBlID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIiNlZGl0b3ItcmVjaXBlIik7CiAgZWRpdG9ycy50ZWNobmljYWwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI2VkaXRvci10ZWNobmljYWwiKTsKICBlZGl0b3JzLmZvcm1JbnRlZ3JhdGlvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIjZWRpdG9yLWZvcm0taW50ZWdyYXRpb24iKTsKICBlZGl0b3JzLnByb2dyYW1tYXRpYyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIjZWRpdG9yLXByb2dyYW1tYXRpYyIpOwogIGVkaXRvcnMuZXhwb3J0RGVtbyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIjZWRpdG9yLWV4cG9ydCIpOwogIHJldHVybiBlZGl0b3JzOwp9Owp2YXIgc2V0dXBQcm9ncmFtbWF0aWNEZW1vID0gKGNvbnRhaW5lciwgZWRpdG9yKSA9PiB7CiAgY29uc3QgcmVwb3J0QnRuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIiNidG4tZ2VuZXJhdGUtcmVwb3J0Iik7CiAgY29uc3QgcmVjaXBlQnRuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIiNidG4tZ2VuZXJhdGUtcmVjaXBlIik7CiAgY29uc3QgY2xlYXJCdG4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI2J0bi1jbGVhci1lZGl0b3IiKTsKICBpZiAocmVwb3J0QnRuKSB7CiAgICByZXBvcnRCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGVkaXRvci5pbXBvcnRCbG9ja3MoZ2VuZXJhdGVSZXBvcnRCbG9ja3MoKSk7CiAgICB9KTsKICB9CiAgaWYgKHJlY2lwZUJ0bikgewogICAgcmVjaXBlQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgICBlZGl0b3IuaW1wb3J0QmxvY2tzKGdlbmVyYXRlUmVjaXBlQmxvY2tzKCkpOwogICAgfSk7CiAgfQogIGlmIChjbGVhckJ0bikgewogICAgY2xlYXJCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGVkaXRvci5pbXBvcnRCbG9ja3MoW10pOwogICAgfSk7CiAgfQp9Owp2YXIgc2V0dXBFeHBvcnREZW1vID0gKGNvbnRhaW5lciwgZWRpdG9yKSA9PiB7CiAgY29uc3QgZXhwb3J0QmxvY2tzQnRuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIiNidG4tZXhwb3J0LWJsb2NrcyIpOwogIGNvbnN0IGV4cG9ydEh0bWxCdG4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI2J0bi1leHBvcnQtaHRtbCIpOwogIGNvbnN0IGV4cG9ydE1hcmtkb3duQnRuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIiNidG4tZXhwb3J0LW1hcmtkb3duIik7CiAgY29uc3Qgc2F2ZVN0YXRlQnRuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIiNidG4tc2F2ZS1zdGF0ZSIpOwogIGNvbnN0IHJlc3RvcmVTdGF0ZUJ0biA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIjYnRuLXJlc3RvcmUtc3RhdGUiKTsKICBsZXQgc2F2ZWRTdGF0ZSA9IG51bGw7CiAgaWYgKGV4cG9ydEJsb2Nrc0J0bikgewogICAgZXhwb3J0QmxvY2tzQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgICBjb25zdCBibG9ja3MgPSBlZGl0b3IuZXhwb3J0QmxvY2tzKCk7CiAgICAgIGNvbnNvbGUubG9nKCJFeHBvcnRlZCBibG9ja3M6IiwgYmxvY2tzKTsKICAgICAgYWxlcnQoYEV4cG9ydGVkICR7YmxvY2tzLmxlbmd0aH0gYmxvY2tzIHRvIGNvbnNvbGUuIENoZWNrIGRldmVsb3BlciB0b29scy5gKTsKICAgIH0pOwogIH0KICBpZiAoZXhwb3J0SHRtbEJ0bikgewogICAgZXhwb3J0SHRtbEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgY29uc3QgaHRtbDE2ID0gZWRpdG9yLmV4cG9ydEFzSHRtbCgpOwogICAgICBjb25zb2xlLmxvZygiSFRNTCBFeHBvcnQ6IiwgaHRtbDE2KTsKICAgICAgYWxlcnQoIkhUTUwgZXhwb3J0ZWQgdG8gY29uc29sZS4gQ2hlY2sgZGV2ZWxvcGVyIHRvb2xzLiIpOwogICAgfSk7CiAgfQogIGlmIChleHBvcnRNYXJrZG93bkJ0bikgewogICAgZXhwb3J0TWFya2Rvd25CdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGNvbnN0IG1hcmtkb3duID0gZWRpdG9yLmV4cG9ydEFzTWFya2Rvd24oKTsKICAgICAgY29uc29sZS5sb2coIk1hcmtkb3duIEV4cG9ydDoiLCBtYXJrZG93bik7CiAgICAgIGFsZXJ0KCJNYXJrZG93biBleHBvcnRlZCB0byBjb25zb2xlLiBDaGVjayBkZXZlbG9wZXIgdG9vbHMuIik7CiAgICB9KTsKICB9CiAgaWYgKHNhdmVTdGF0ZUJ0bikgewogICAgc2F2ZVN0YXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgICBzYXZlZFN0YXRlID0gZWRpdG9yLmV4cG9ydFN0YXRlKCk7CiAgICAgIGNvbnNvbGUubG9nKCJTYXZlZCBzdGF0ZToiLCBzYXZlZFN0YXRlKTsKICAgICAgYWxlcnQoIkVkaXRvciBzdGF0ZSBzYXZlZCEiKTsKICAgIH0pOwogIH0KICBpZiAocmVzdG9yZVN0YXRlQnRuKSB7CiAgICByZXN0b3JlU3RhdGVCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGlmIChzYXZlZFN0YXRlKSB7CiAgICAgICAgZWRpdG9yLmltcG9ydFN0YXRlKHNhdmVkU3RhdGUpOwogICAgICAgIGFsZXJ0KCJFZGl0b3Igc3RhdGUgcmVzdG9yZWQhIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWxlcnQoIk5vIHNhdmVkIHN0YXRlIGZvdW5kLiBTYXZlIHN0YXRlIGZpcnN0ISIpOwogICAgICB9CiAgICB9KTsKICB9Cn07CnZhciBzZXR1cE91dHB1dEZvcm1hdERlbW8gPSAoY29udGFpbmVyLCBodG1sRWRpdG9yLCBtYXJrZG93bkVkaXRvcikgPT4gewogIGNvbnN0IGh0bWxCdG4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI2J0bi1zaG93LWh0bWwtb3V0cHV0Iik7CiAgY29uc3QgaHRtbFByZXZpZXcgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI291dHB1dC1wcmV2aWV3LWh0bWwiKTsKICBpZiAoaHRtbEJ0biAmJiBodG1sUHJldmlldyAmJiBodG1sRWRpdG9yKSB7CiAgICBodG1sQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgICBodG1sUHJldmlldy50ZXh0Q29udGVudCA9IGh0bWxFZGl0b3IuZ2V0VmFsdWUoKTsKICAgICAgaHRtbFByZXZpZXcuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpOwogICAgfSk7CiAgfQogIGNvbnN0IG1hcmtkb3duQnRuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIiNidG4tc2hvdy1tYXJrZG93bi1vdXRwdXQiKTsKICBjb25zdCBtYXJrZG93blByZXZpZXcgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI291dHB1dC1wcmV2aWV3LW1hcmtkb3duIik7CiAgaWYgKG1hcmtkb3duQnRuICYmIG1hcmtkb3duUHJldmlldyAmJiBtYXJrZG93bkVkaXRvcikgewogICAgbWFya2Rvd25CdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIG1hcmtkb3duUHJldmlldy50ZXh0Q29udGVudCA9IG1hcmtkb3duRWRpdG9yLmdldFZhbHVlKCk7CiAgICAgIG1hcmtkb3duUHJldmlldy5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIik7CiAgICB9KTsKICB9Cn07CnZhciBwb3B1bGF0ZUluaXRpYWxDb250ZW50ID0gKGVkaXRvcnMpID0+IHsKICBpZiAoZWRpdG9ycy5hcnRpY2xlKSB7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgY29uc3QgYXJ0aWNsZUJsb2NrcyA9IFsKICAgICAgICB7CiAgICAgICAgICBpZDogImludHJvLWhlYWRpbmctIiArIERhdGUubm93KCksCiAgICAgICAgICB0eXBlOiAiaGVhZGluZy0yIiwKICAgICAgICAgIGNvbnRlbnQ6ICJJbnRyb2R1Y3Rpb24gdG8gTW9kZXJuIFdlYiBEZXZlbG9wbWVudCIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGlkOiAiaW50cm8tcGFyYS0iICsgRGF0ZS5ub3coKSwKICAgICAgICAgIHR5cGU6ICJwYXJhZ3JhcGgiLAogICAgICAgICAgY29udGVudDogIk1vZGVybiB3ZWIgZGV2ZWxvcG1lbnQgaGFzIGV2b2x2ZWQgc2lnbmlmaWNhbnRseSBvdmVyIHRoZSBwYXN0IGRlY2FkZS4gSW4gdGhpcyBhcnRpY2xlLCB3ZSdsbCBleHBsb3JlIHRoZSBrZXkgdGVjaG5vbG9naWVzIGFuZCBiZXN0IHByYWN0aWNlcyB0aGF0IGRlZmluZSB3ZWIgZGV2ZWxvcG1lbnQgaW4gMjAyNC4iCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBpZDogInRlY2gtaGVhZGluZy0iICsgRGF0ZS5ub3coKSwKICAgICAgICAgIHR5cGU6ICJoZWFkaW5nLTMiLAogICAgICAgICAgY29udGVudDogIktleSBUZWNobm9sb2dpZXMiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBpZDogInRlY2gtbGlzdC0iICsgRGF0ZS5ub3coKSwKICAgICAgICAgIHR5cGU6ICJsaXN0IiwKICAgICAgICAgIGNvbnRlbnQ6ICJUeXBlU2NyaXB0IC0gVHlwZS1zYWZlIEphdmFTY3JpcHQgZGV2ZWxvcG1lbnRcbldlYiBDb21wb25lbnRzIC0gTmF0aXZlIGNvbXBvbmVudCBtb2RlbFxuRVMgTW9kdWxlcyAtIE1vZGVybiBtb2R1bGUgc3lzdGVtXG5XZWJBc3NlbWJseSAtIEhpZ2gtcGVyZm9ybWFuY2UgY29tcHV0aW5nIiwKICAgICAgICAgIG1ldGFkYXRhOiB7IGxpc3RUeXBlOiAib3JkZXJlZCIgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgaWQ6ICJxdW90ZS0iICsgRGF0ZS5ub3coKSwKICAgICAgICAgIHR5cGU6ICJxdW90ZSIsCiAgICAgICAgICBjb250ZW50OiAiVGhlIGJlc3Qgd2F5IHRvIHByZWRpY3QgdGhlIGZ1dHVyZSBpcyB0byBpbnZlbnQgaXQuIC0gQWxhbiBLYXkiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBpZDogImV4YW1wbGUtaGVhZGluZy0iICsgRGF0ZS5ub3coKSwKICAgICAgICAgIHR5cGU6ICJoZWFkaW5nLTMiLAogICAgICAgICAgY29udGVudDogIkNvZGUgRXhhbXBsZSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGlkOiAiY29kZS1leGFtcGxlLSIgKyBEYXRlLm5vdygpLAogICAgICAgICAgdHlwZTogImNvZGUiLAogICAgICAgICAgY29udGVudDogImNsYXNzIE1vZGVybldlYkFwcCBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTtcbiAgfVxuICBcbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxufSIsCiAgICAgICAgICBtZXRhZGF0YTogeyBsYW5ndWFnZTogImphdmFzY3JpcHQiIH0KICAgICAgICB9CiAgICAgIF07CiAgICAgIGVkaXRvcnMuYXJ0aWNsZS5pbXBvcnRCbG9ja3MoYXJ0aWNsZUJsb2Nrcyk7CiAgICB9LCA1MDApOwogIH0KICBpZiAoZWRpdG9ycy5kcmFnRHJvcCkgewogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIGNvbnN0IGRyYWdCbG9ja3MgPSBbCiAgICAgICAgewogICAgICAgICAgaWQ6ICJkcmFnLXRpdGxlLSIgKyBEYXRlLm5vdygpLAogICAgICAgICAgdHlwZTogImhlYWRpbmctMSIsCiAgICAgICAgICBjb250ZW50OiAiRHJhZyAmIERyb3AgRGVtbyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGlkOiAiZHJhZy1pbnRyby0iICsgRGF0ZS5ub3coKSwKICAgICAgICAgIHR5cGU6ICJwYXJhZ3JhcGgiLAogICAgICAgICAgY29udGVudDogIlRoaXMgZWRpdG9yIGRlbW9uc3RyYXRlcyBkcmFnIGFuZCBkcm9wIGZ1bmN0aW9uYWxpdHkuIFRyeSBkcmFnZ2luZyB0aGVzZSBibG9ja3MgYXJvdW5kISIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGlkOiAiZHJhZy1oZWFkaW5nLSIgKyBEYXRlLm5vdygpLAogICAgICAgICAgdHlwZTogImhlYWRpbmctMiIsCiAgICAgICAgICBjb250ZW50OiAiSG93IEl0IFdvcmtzIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgaWQ6ICJkcmFnLWxpc3QtIiArIERhdGUubm93KCksCiAgICAgICAgICB0eXBlOiAibGlzdCIsCiAgICAgICAgICBjb250ZW50OiAiSG92ZXIgb3ZlciBhbnkgYmxvY2sgdG8gc2VlIHRoZSBkcmFnIGhhbmRsZVxuQ2xpY2sgYW5kIGhvbGQgdGhlIGhhbmRsZSB0byBzdGFydCBkcmFnZ2luZ1xuRHJhZyB0byByZW9yZGVyIGJsb2Nrc1xuUmVsZWFzZSB0byBkcm9wIGluIHRoZSBuZXcgcG9zaXRpb24iLAogICAgICAgICAgbWV0YWRhdGE6IHsgbGlzdFR5cGU6ICJvcmRlcmVkIiB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBpZDogImRyYWctcXVvdGUtIiArIERhdGUubm93KCksCiAgICAgICAgICB0eXBlOiAicXVvdGUiLAogICAgICAgICAgY29udGVudDogIlRoZSBkcmFnIGFuZCBkcm9wIGZlYXR1cmUgbWFrZXMgaXQgZWFzeSB0byByZW9yZ2FuaXplIHlvdXIgY29udGVudCB3aXRob3V0IGN1dHRpbmcgYW5kIHBhc3RpbmcuIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgaWQ6ICJkcmFnLWRpdmlkZXItIiArIERhdGUubm93KCksCiAgICAgICAgICB0eXBlOiAiZGl2aWRlciIsCiAgICAgICAgICBjb250ZW50OiAiIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgaWQ6ICJkcmFnLWZvb3Rlci0iICsgRGF0ZS5ub3coKSwKICAgICAgICAgIHR5cGU6ICJwYXJhZ3JhcGgiLAogICAgICAgICAgY29udGVudDogIk5vdGU6IERpdmlkZXIgYmxvY2tzIGNhbm5vdCBiZSBkcmFnZ2VkLCBidXQgb3RoZXIgYmxvY2tzIGNhbiBiZSBtb3ZlZCBhcm91bmQgdGhlbS4iCiAgICAgICAgfQogICAgICBdOwogICAgICBlZGl0b3JzLmRyYWdEcm9wLmltcG9ydEJsb2NrcyhkcmFnQmxvY2tzKTsKICAgIH0sIDYwMCk7CiAgfQp9Owp2YXIgZGVtb0Z1bmMyNiA9ICgpID0+IGIyYAogIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUyLCA1MDApKTsKICBjb25zdCBlZGl0b3JzID0gaW5pdGlhbGl6ZUVkaXRvcnMoZWxlbWVudEFyZyk7CiAgaWYgKGVkaXRvcnMucHJvZ3JhbW1hdGljKSB7CiAgICBzZXR1cFByb2dyYW1tYXRpY0RlbW8oZWxlbWVudEFyZywgZWRpdG9ycy5wcm9ncmFtbWF0aWMpOwogIH0KICBpZiAoZWRpdG9ycy5leHBvcnREZW1vKSB7CiAgICBzZXR1cEV4cG9ydERlbW8oZWxlbWVudEFyZywgZWRpdG9ycy5leHBvcnREZW1vKTsKICB9CiAgc2V0dXBPdXRwdXRGb3JtYXREZW1vKGVsZW1lbnRBcmcsIGVkaXRvcnMubWVldGluZywgZWRpdG9ycy5yZWNpcGUpOwogIHBvcHVsYXRlSW5pdGlhbENvbnRlbnQoZWRpdG9ycyk7CiAgY29uc29sZS5sb2coIldZU0lXWUcgRGVtbyBpbml0aWFsaXplZCB3aXRoIGVkaXRvcnM6IiwgT2JqZWN0LmtleXMoZWRpdG9ycykpOwp9fT4KICA8c3R5bGU+CiAgICAke2lgCiAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogMzJweDsKICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgIG1heC13aWR0aDogMTIwMHB4OwogICAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgICB9CiAgICAgIAogICAgICBkZWVzLXBhbmVsIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAzMnB4OwogICAgICB9CiAgICAgIAogICAgICAucGFuZWwtZGVzY3JpcHRpb24gewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNjsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewogICAgICAgIC5wYW5lbC1kZXNjcmlwdGlvbiB7CiAgICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5mZWF0dXJlLWdyaWQgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMDBweCwgMWZyKSk7CiAgICAgICAgZ2FwOiAxNnB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgIH0KCiAgICAgIC5mZWF0dXJlLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIC5mZWF0dXJlLWljb24gewogICAgICAgIGNvbG9yOiAjMDA2NmNjOwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIH0KCiAgICAgIEBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsKICAgICAgICAuZmVhdHVyZS1pdGVtIHsKICAgICAgICAgIGNvbG9yOiAjYWFhOwogICAgICAgIH0KICAgICAgICAuZmVhdHVyZS1pY29uIHsKICAgICAgICAgIGNvbG9yOiAjNGQ5NGZmOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLnNob3J0Y3V0cy1ib3ggewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMTAyLCAyMDQsIDAuMDUpOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMTAyLCAyMDQsIDAuMik7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgfQoKICAgICAgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewogICAgICAgIC5zaG9ydGN1dHMtYm94IHsKICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoNzcsIDE0OCwgMjU1LCAwLjEpOwogICAgICAgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc3LCAxNDgsIDI1NSwgMC4zKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5zaG9ydGN1dHMtdGl0bGUgewogICAgICAgIG1hcmdpbjogMCAwIDEycHggMDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogIzAwNjZjYzsKICAgICAgfQoKICAgICAgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewogICAgICAgIC5zaG9ydGN1dHMtdGl0bGUgewogICAgICAgICAgY29sb3I6ICM0ZDk0ZmY7CiAgICAgICAgfQogICAgICB9CgogICAgICAuc2hvcnRjdXRzLWdyaWQgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMTgwcHgsIDFmcikpOwogICAgICAgIGdhcDogOHB4OwogICAgICB9CgogICAgICAuc2hvcnRjdXQtaXRlbSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgfQoKICAgICAgLnNob3J0Y3V0LWtleSB7CiAgICAgICAgYmFja2dyb3VuZDogI2YwZjBmMDsKICAgICAgICBwYWRkaW5nOiAycHggNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogIzMzMzsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLnNob3J0Y3V0LWl0ZW0gewogICAgICAgICAgY29sb3I6ICNiYmI7CiAgICAgICAgfQogICAgICAgIC5zaG9ydGN1dC1rZXkgewogICAgICAgICAgYmFja2dyb3VuZDogIzMzMzsKICAgICAgICAgIGNvbG9yOiAjZGRkOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLm91dHB1dC1ncmlkIHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMzIwcHgsIDFmcikpOwogICAgICAgIGdhcDogMjRweDsKICAgICAgICBtYXJnaW4tdG9wOiAyNHB4OwogICAgICB9CgogICAgICAub3V0cHV0LWNhcmQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDEycHg7CiAgICAgIH0KCiAgICAgIC5vdXRwdXQtYWN0aW9ucyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAub3V0cHV0LXByZXZpZXcgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgxNSwgMjMsIDQyLCAwLjA0KTsKICAgICAgICBjb2xvcjogdmFyKC0tZGVlcy1jb2xvci10ZXh0LCAjMGYxNzJhKTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE1LCAyMywgNDIsIDAuMSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgICAgIGZvbnQtZmFtaWx5OiAnR2Vpc3QgTW9ubycsICdGaXJhIENvZGUnLCBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIG1heC1oZWlnaHQ6IDI4MHB4OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbdGhlbWU9J2RhcmsnXSkgLm91dHB1dC1wcmV2aWV3IHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1MCwgMjUwLCAyNTAsIDAuMDYpOwogICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTAsIDI1MCwgMjUwLCAwLjE1KTsKICAgICAgICBjb2xvcjogdmFyKC0tZGVlcy1jb2xvci10ZXh0LCAjZjRmNGY1KTsKICAgICAgfQoKICAgICAgLm91dHB1dC1wcmV2aWV3LnZpc2libGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHsKICAgICAgICAub3V0cHV0LWdyaWQgewogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICAudGlwcy1ib3ggewogICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjBmOGZmOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNjsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewogICAgICAgIC50aXBzLWJveCB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDc3LCAxNDgsIDI1NSwgMC4xKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIC50aXBzLWJveCBzdHJvbmcgewogICAgICAgIGNvbG9yOiAjMDA2NmNjOwogICAgICB9CiAgICAgIAogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLnRpcHMtYm94IHN0cm9uZyB7CiAgICAgICAgICBjb2xvcjogIzRkOTRmZjsKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIC50aXBzLWxpc3QgewogICAgICAgIG1hcmdpbjogOHB4IDAgMCAwOwogICAgICAgIHBhZGRpbmctbGVmdDogMjRweDsKICAgICAgfQogICAgICAKICAgICAgLnRpcHMtbGlzdCBsaSB7CiAgICAgICAgbWFyZ2luOiA0cHggMDsKICAgICAgfQogICAgICAKICAgICAgLmJ1dHRvbi1ncm91cCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgfQogICAgICAKICAgICAgLmRlbW8tYnV0dG9uIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTZweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjhmOGY4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKICAgICAgfQogICAgICAKICAgICAgLmRlbW8tYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZThlOGU4OwogICAgICAgIGJvcmRlci1jb2xvcjogI2NjYzsKICAgICAgfQogICAgICAKICAgICAgLmRlbW8tYnV0dG9uOmFjdGl2ZSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCk7CiAgICAgIH0KICAgICAgCiAgICAgIEBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHsKICAgICAgICAuZGVtby1idXR0b24gewogICAgICAgICAgYmFja2dyb3VuZDogIzMzMzsKICAgICAgICAgIGJvcmRlci1jb2xvcjogIzU1NTsKICAgICAgICAgIGNvbG9yOiAjZGRkOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuZGVtby1idXR0b246aG92ZXIgewogICAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICAgIGJvcmRlci1jb2xvcjogIzY2NjsKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIC5leHBvcnQtaW5mby1ncmlkIHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjUwcHgsIDFmcikpOwogICAgICAgIGdhcDogMTZweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICB9CiAgICAgIAogICAgICAuZXhwb3J0LWluZm8tY2FyZCB7CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5leHBvcnQtaW5mby1jYXJkLmJsb2NrcyB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAxMDIsIDIwNCwgMC4xKTsKICAgICAgfQogICAgICAKICAgICAgLmV4cG9ydC1pbmZvLWNhcmQuaHRtbCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSg3NiwgMTc1LCA4MCwgMC4xKTsKICAgICAgfQogICAgICAKICAgICAgLmV4cG9ydC1pbmZvLWNhcmQubWFya2Rvd24gewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAxNTIsIDAsIDAuMSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5leHBvcnQtaW5mby1jYXJkLnN0YXRlIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDE1NiwgMzksIDE3NiwgMC4xKTsKICAgICAgfQogICAgICAKICAgICAgLmV4cG9ydC1pbmZvLWNhcmQgc3Ryb25nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5leHBvcnQtaW5mby1jYXJkLmJsb2NrcyBzdHJvbmcgewogICAgICAgIGNvbG9yOiAjMDA2NmNjOwogICAgICB9CiAgICAgIAogICAgICAuZXhwb3J0LWluZm8tY2FyZC5odG1sIHN0cm9uZyB7CiAgICAgICAgY29sb3I6ICM0Q0FGNTA7CiAgICAgIH0KICAgICAgCiAgICAgIC5leHBvcnQtaW5mby1jYXJkLm1hcmtkb3duIHN0cm9uZyB7CiAgICAgICAgY29sb3I6ICNGRjk4MDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5leHBvcnQtaW5mby1jYXJkLnN0YXRlIHN0cm9uZyB7CiAgICAgICAgY29sb3I6ICM5QzI3QjA7CiAgICAgIH0KICAgICAgCiAgICAgIC5leHBvcnQtaW5mby1jYXJkIHAgewogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgfQogICAgYH0KICA8L3N0eWxlPgogIAogICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiMS4gXHV7MUY2ODB9IE1vZGVybiBXWVNJV1lHIEVkaXRvciJ9PgogICAgICAgIDxwIGNsYXNzPSJwYW5lbC1kZXNjcmlwdGlvbiI+CiAgICAgICAgICBBIHBvd2VyZnVsIGJsb2NrLWJhc2VkIGVkaXRvciB3aXRoIHNsYXNoIGNvbW1hbmRzLCBrZXlib2FyZCBzaG9ydGN1dHMsIGFuZCBtdWx0aXBsZSBvdXRwdXQgZm9ybWF0cy4gCiAgICAgICAgICBQZXJmZWN0IGZvciBjb250ZW50IGNyZWF0aW9uLCBibG9nIHBvc3RzLCBkb2N1bWVudGF0aW9uLCBhbmQgbW9yZS4KICAgICAgICA8L3A+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1ncmlkIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtaXRlbSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmZWF0dXJlLWljb24iPuKckzwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4+U2xhc2ggY29tbWFuZHMgKC8pPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLWl0ZW0iPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iZmVhdHVyZS1pY29uIj7inJM8L3NwYW4+CiAgICAgICAgICAgIDxzcGFuPktleWJvYXJkIHNob3J0Y3V0czwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1pdGVtIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZlYXR1cmUtaWNvbiI+4pyTPC9zcGFuPgogICAgICAgICAgICA8c3Bhbj5CbG9jay1iYXNlZCBlZGl0aW5nPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLWl0ZW0iPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iZmVhdHVyZS1pY29uIj7inJM8L3NwYW4+CiAgICAgICAgICAgIDxzcGFuPkRyYWcgJiBkcm9wIHJlb3JkZXJpbmc8L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtaXRlbSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmZWF0dXJlLWljb24iPuKckzwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4+SFRNTCAmIE1hcmtkb3duIG91dHB1dDwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1pdGVtIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZlYXR1cmUtaWNvbiI+4pyTPC9zcGFuPgogICAgICAgICAgICA8c3Bhbj5EYXJrIG1vZGUgc3VwcG9ydDwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1pdGVtIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZlYXR1cmUtaWNvbiI+4pyTPC9zcGFuPgogICAgICAgICAgICA8c3Bhbj5Nb2JpbGUgcmVzcG9uc2l2ZTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIAogICAgICAgIDxkZWVzLWlucHV0LXd5c2l3eWcgCiAgICAgICAgICBpZD0iZWRpdG9yLWJhc2ljIgogICAgICAgICAgbGFiZWw9IlJpY2ggVGV4dCBFZGl0b3IiIAogICAgICAgICAgZGVzY3JpcHRpb249IlN0YXJ0IHR5cGluZyBvciB1c2UgJy8nIHRvIGluc2VydCBkaWZmZXJlbnQgYmxvY2sgdHlwZXMiCiAgICAgICAgICBvdXRwdXRGb3JtYXQ9Imh0bWwiCiAgICAgICAgPjwvZGVlcy1pbnB1dC13eXNpd3lnPgoKICAgICAgICA8ZGl2IGNsYXNzPSJzaG9ydGN1dHMtYm94Ij4KICAgICAgICAgIDxoNCBjbGFzcz0ic2hvcnRjdXRzLXRpdGxlIj7ijKjvuI8gS2V5Ym9hcmQgU2hvcnRjdXRzPC9oND4KICAgICAgICAgIDxkaXYgY2xhc3M9InNob3J0Y3V0cy1ncmlkIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2hvcnRjdXQtaXRlbSI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNob3J0Y3V0LWtleSI+Lzwvc3Bhbj4gU2xhc2ggY29tbWFuZHMKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNob3J0Y3V0LWl0ZW0iPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzaG9ydGN1dC1rZXkiPiM8L3NwYW4+IEhlYWRpbmcgMQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2hvcnRjdXQtaXRlbSI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNob3J0Y3V0LWtleSI+IyM8L3NwYW4+IEhlYWRpbmcgMgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2hvcnRjdXQtaXRlbSI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNob3J0Y3V0LWtleSI+IyMjPC9zcGFuPiBIZWFkaW5nIDMKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNob3J0Y3V0LWl0ZW0iPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzaG9ydGN1dC1rZXkiPj48L3NwYW4+IFF1b3RlCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaG9ydGN1dC1pdGVtIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2hvcnRjdXQta2V5Ij5cYFxgXGA8L3NwYW4+IENvZGUgYmxvY2sKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNob3J0Y3V0LWl0ZW0iPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzaG9ydGN1dC1rZXkiPio8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJzaG9ydGN1dC1rZXkiPi08L3NwYW4+IEJ1bGxldCBsaXN0CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaG9ydGN1dC1pdGVtIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2hvcnRjdXQta2V5Ij4xLjwvc3Bhbj4gTnVtYmVyZWQgbGlzdAogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2hvcnRjdXQtaXRlbSI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNob3J0Y3V0LWtleSI+LS0tPC9zcGFuPiBEaXZpZGVyCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgICAgCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyIyLiBcdXsxRjRERH0gQmxvZyBQb3N0IEV4YW1wbGUifT4KICAgICAgICA8cCBjbGFzcz0icGFuZWwtZGVzY3JpcHRpb24iPgogICAgICAgICAgUGVyZmVjdCBmb3IgY3JlYXRpbmcgcmljaCBjb250ZW50IHdpdGggbXVsdGlwbGUgYmxvY2sgdHlwZXMuIAogICAgICAgICAgVGhlIGVkaXRvciBwcmVzZXJ2ZXMgZm9ybWF0dGluZyBhbmQgcHJvdmlkZXMgYSBjbGVhbiBlZGl0aW5nIGV4cGVyaWVuY2UuCiAgICAgICAgPC9wPgogICAgICAgIAogICAgICAgIDxkZWVzLWlucHV0LXd5c2l3eWcgCiAgICAgICAgICBpZD0iZWRpdG9yLWFydGljbGUiCiAgICAgICAgICBsYWJlbD0iQmxvZyBQb3N0IENvbnRlbnQiIAogICAgICAgICAgZGVzY3JpcHRpb249IldyaXRlIHlvdXIgYXJ0aWNsZSB1c2luZyB2YXJpb3VzIGZvcm1hdHRpbmcgb3B0aW9ucyIKICAgICAgICAgIG91dHB1dEZvcm1hdD0iaHRtbCIKICAgICAgICA+PC9kZWVzLWlucHV0LXd5c2l3eWc+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyIzLiBcdXsxRjUwMH0gRHJhZyAmIERyb3AgUmVvcmRlcmluZyJ9PgogICAgICAgIDxwIGNsYXNzPSJwYW5lbC1kZXNjcmlwdGlvbiI+CiAgICAgICAgICBFYXNpbHkgcmVhcnJhbmdlIHlvdXIgY29udGVudCBibG9ja3MgYnkgZHJhZ2dpbmcgdGhlbS4gCiAgICAgICAgICBIb3ZlciBvdmVyIGFueSBibG9jayB0byByZXZlYWwgdGhlIGRyYWcgaGFuZGxlIG9uIHRoZSBsZWZ0IHNpZGUuCiAgICAgICAgPC9wPgogICAgICAgIAogICAgICAgIDxkZWVzLWlucHV0LXd5c2l3eWcgCiAgICAgICAgICBpZD0iZWRpdG9yLWRyYWdkcm9wIgogICAgICAgICAgbGFiZWw9IkRyYWcgJiBEcm9wIERlbW8iIAogICAgICAgICAgZGVzY3JpcHRpb249IlRyeSBkcmFnZ2luZyBibG9ja3MgdG8gcmVvcmRlciB0aGVtIC0gaG92ZXIgdG8gc2VlIGRyYWcgaGFuZGxlcyIKICAgICAgICA+PC9kZWVzLWlucHV0LXd5c2l3eWc+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0idGlwcy1ib3giPgogICAgICAgICAgPHN0cm9uZz7wn5KhIFRpcHM6PC9zdHJvbmc+CiAgICAgICAgICA8dWwgY2xhc3M9InRpcHMtbGlzdCI+CiAgICAgICAgICAgIDxsaT5Ib3ZlciBvdmVyIGFueSBibG9jayB0byBzZWUgdGhlIGRyYWcgaGFuZGxlICjii67ii64pIG9uIHRoZSBsZWZ0PC9saT4KICAgICAgICAgICAgPGxpPkNsaWNrIGFuZCBob2xkIHRoZSBkcmFnIGhhbmRsZSB0byBzdGFydCBkcmFnZ2luZzwvbGk+CiAgICAgICAgICAgIDxsaT5CbHVlIGluZGljYXRvcnMgc2hvdyB3aGVyZSB0aGUgYmxvY2sgd2lsbCBiZSBkcm9wcGVkPC9saT4KICAgICAgICAgICAgPGxpPkRpdmlkZXIgYmxvY2tzIGNhbm5vdCBiZSBkcmFnZ2VkPC9saT4KICAgICAgICAgICAgPGxpPlRoZSBlZGl0b3IgbWFpbnRhaW5zIGZvY3VzIG9uIHRoZSBtb3ZlZCBibG9jayBhZnRlciBkcm9wcGluZzwvbGk+CiAgICAgICAgICA8L3VsPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiNC4gXHV7MUY0REF9IFR1dG9yaWFsICYgRG9jdW1lbnRhdGlvbiJ9PgogICAgICAgIDxwIGNsYXNzPSJwYW5lbC1kZXNjcmlwdGlvbiI+CiAgICAgICAgICBDcmVhdGUgY29tcHJlaGVuc2l2ZSB0dXRvcmlhbHMgYW5kIGRvY3VtZW50YXRpb24gd2l0aCBjb2RlIGV4YW1wbGVzLCBsaXN0cywgYW5kIHN0cnVjdHVyZWQgY29udGVudC4KICAgICAgICA8L3A+CiAgICAgICAgCiAgICAgICAgPGRlZXMtaW5wdXQtd3lzaXd5ZyAKICAgICAgICAgIGlkPSJlZGl0b3ItdHV0b3JpYWwiCiAgICAgICAgICBsYWJlbD0iR2l0IFR1dG9yaWFsIiAKICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdGVwLWJ5LXN0ZXAgZ3VpZGUgd2l0aCBjb21tYW5kcyBhbmQgZXhwbGFuYXRpb25zIgogICAgICAgICAgb3V0cHV0Rm9ybWF0PSJtYXJrZG93biIKICAgICAgICAgIHZhbHVlPSIjIEdpdCBUdXRvcmlhbCBmb3IgQmVnaW5uZXJzCgpHaXQgaXMgYSBkaXN0cmlidXRlZCB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIHRoYXQgaGVscHMgeW91IHRyYWNrIGNoYW5nZXMgaW4geW91ciBjb2RlIG92ZXIgdGltZS4gVGhpcyB0dXRvcmlhbCB3aWxsIGd1aWRlIHlvdSB0aHJvdWdoIHRoZSBiYXNpY3MuCgojIyBQcmVyZXF1aXNpdGVzCgpCZWZvcmUgc3RhcnRpbmcsIGVuc3VyZSB5b3UgaGF2ZToKCi0gR2l0IGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbQotIEEgdGV4dCBlZGl0b3Igb3IgSURFCi0gQmFzaWMgY29tbWFuZCBsaW5lIGtub3dsZWRnZQoKIyMgR2V0dGluZyBTdGFydGVkCgojIyMgMS4gQ29uZmlndXJlIEdpdAoKRmlyc3QsIHNldCB1cCB5b3VyIGlkZW50aXR5OgoKXGBcYFxgYmFzaApnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIubmFtZSAmcXVvdDtZb3VyIE5hbWUmcXVvdDsKZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLmVtYWlsICZxdW90O3lvdXIuZW1haWxAZXhhbXBsZS5jb20mcXVvdDsKXGBcYFxgCgojIyMgMi4gSW5pdGlhbGl6ZSBhIFJlcG9zaXRvcnkKCkNyZWF0ZSBhIG5ldyBHaXQgcmVwb3NpdG9yeToKClxgXGBcYGJhc2gKbWtkaXIgbXktcHJvamVjdApjZCBteS1wcm9qZWN0CmdpdCBpbml0ClxgXGBcYAoKIyMjIDMuIEJhc2ljIEdpdCBXb3JrZmxvdwoKIyMjIyBBZGRpbmcgRmlsZXMKCkNyZWF0ZSBhIGZpbGUgYW5kIGFkZCBpdCB0byBzdGFnaW5nOgoKXGBcYFxgYmFzaAplY2hvICZxdW90OyMgTXkgUHJvamVjdCZxdW90OyA+IFJFQURNRS5tZApnaXQgYWRkIFJFQURNRS5tZApcYFxgXGAKCiMjIyMgQ29tbWl0dGluZyBDaGFuZ2VzCgpcYFxgXGBiYXNoCmdpdCBjb21taXQgLW0gJnF1b3Q7SW5pdGlhbCBjb21taXQmcXVvdDsKXGBcYFxgCgo+ICoqQmVzdCBQcmFjdGljZToqKiBXcml0ZSBjbGVhciwgZGVzY3JpcHRpdmUgY29tbWl0IG1lc3NhZ2VzIHRoYXQgZXhwbGFpbiB3aGF0IGNoYW5nZXMgd2VyZSBtYWRlIGFuZCB3aHkuCgojIyMgNC4gV29ya2luZyB3aXRoIEJyYW5jaGVzCgpCcmFuY2hlcyBhbGxvdyB5b3UgdG8gd29yayBvbiBmZWF0dXJlcyBpbmRlcGVuZGVudGx5OgoKXGBcYFxgYmFzaAojIENyZWF0ZSBhbmQgc3dpdGNoIHRvIGEgbmV3IGJyYW5jaApnaXQgY2hlY2tvdXQgLWIgZmVhdHVyZS1icmFuY2gKCiMgTWFrZSBjaGFuZ2VzIGFuZCBjb21taXQKZ2l0IGFkZCAuCmdpdCBjb21taXQgLW0gJnF1b3Q7QWRkIG5ldyBmZWF0dXJlJnF1b3Q7CgojIFN3aXRjaCBiYWNrIHRvIG1haW4KZ2l0IGNoZWNrb3V0IG1haW4KCiMgTWVyZ2UgdGhlIGZlYXR1cmUKZ2l0IG1lcmdlIGZlYXR1cmUtYnJhbmNoClxgXGBcYAoKLS0tCgojIyBDb21tb24gQ29tbWFuZHMgUmVmZXJlbmNlCgp8IENvbW1hbmQgfCBEZXNjcmlwdGlvbiB8CnwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwKfCBcYGdpdCBzdGF0dXNcYCB8IENoZWNrIHJlcG9zaXRvcnkgc3RhdHVzIHwKfCBcYGdpdCBsb2dcYCB8IFZpZXcgY29tbWl0IGhpc3RvcnkgfAp8IFxgZ2l0IGRpZmZcYCB8IFNob3cgY2hhbmdlcyB8CnwgXGBnaXQgcHVsbFxgIHwgRmV0Y2ggYW5kIG1lcmdlIGNoYW5nZXMgfAp8IFxgZ2l0IHB1c2hcYCB8IFVwbG9hZCBjaGFuZ2VzIHRvIHJlbW90ZSB8CgojIyBOZXh0IFN0ZXBzCgoxLiBMZWFybiBhYm91dCByZW1vdGUgcmVwb3NpdG9yaWVzCjIuIEV4cGxvcmUgYWR2YW5jZWQgR2l0IGZlYXR1cmVzCjMuIFByYWN0aWNlIHdpdGggcmVhbCBwcm9qZWN0cwo0LiBDb250cmlidXRlIHRvIG9wZW4gc291cmNlCgoqKkhhcHB5IGNvZGluZyEqKiDwn5qAIgogICAgICAgID48L2RlZXMtaW5wdXQtd3lzaXd5Zz4KICAgICAgPC9kZWVzLXBhbmVsPgoKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjUuIFx1ezFGNTA0fSBPdXRwdXQgRm9ybWF0cyJ9PgogICAgICAgIDxwIGNsYXNzPSJwYW5lbC1kZXNjcmlwdGlvbiI+CiAgICAgICAgICBDaG9vc2UgYmV0d2VlbiBIVE1MIGFuZCBNYXJrZG93biBvdXRwdXQgZm9ybWF0cyBkZXBlbmRpbmcgb24geW91ciBuZWVkcy4gCiAgICAgICAgICBQZXJmZWN0IGZvciBzdGF0aWMgc2l0ZSBnZW5lcmF0b3JzLCBkb2N1bWVudGF0aW9uIHN5c3RlbXMsIG9yIGFueSBjb250ZW50IG1hbmFnZW1lbnQgd29ya2Zsb3cuCiAgICAgICAgPC9wPgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9Im91dHB1dC1ncmlkIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im91dHB1dC1jYXJkIj4KICAgICAgICAgICAgPGRlZXMtaW5wdXQtd3lzaXd5ZyAKICAgICAgICAgICAgICBpZD0iZWRpdG9yLW1lZXRpbmciCiAgICAgICAgICAgICAgbGFiZWw9Ik1lZXRpbmcgTm90ZXMiIAogICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdHJ1Y3R1cmVkIG1lZXRpbmcgZG9jdW1lbnRhdGlvbiIKICAgICAgICAgICAgICBvdXRwdXRGb3JtYXQ9Imh0bWwiCiAgICAgICAgICAgICAgdmFsdWU9IjxoMj5RNCBQbGFubmluZyBNZWV0aW5nPC9oMj48cD48c3Ryb25nPkRhdGU6PC9zdHJvbmc+IERlY2VtYmVyIDE1LCAyMDI0PGJyPjxzdHJvbmc+QXR0ZW5kZWVzOjwvc3Ryb25nPiBQcm9kdWN0IFRlYW0sIEVuZ2luZWVyaW5nLCBEZXNpZ248L3A+PGgzPkFnZW5kYSBJdGVtczwvaDM+PG9sPjxsaT5SZXZpZXcgUTMgYWNoaWV2ZW1lbnRzPC9saT48bGk+U2V0IFE0IG9iamVjdGl2ZXM8L2xpPjxsaT5SZXNvdXJjZSBhbGxvY2F0aW9uPC9saT48bGk+VGltZWxpbmUgZGlzY3Vzc2lvbjwvbGk+PC9vbD48aDM+S2V5IERlY2lzaW9uczwvaDM+PHVsPjxsaT5MYXVuY2ggbmV3IGRhc2hib2FyZCBmZWF0dXJlIGJ5IGVuZCBvZiBKYW51YXJ5PC9saT48bGk+SW5jcmVhc2UgZW5naW5lZXJpbmcgdGVhbSBieSAyIGRldmVsb3BlcnM8L2xpPjxsaT5JbXBsZW1lbnQgd2Vla2x5IGRlc2lnbiByZXZpZXdzPC9saT48L3VsPjxibG9ja3F1b3RlPiZxdW90O0ZvY3VzIG9uIHVzZXIgZXhwZXJpZW5jZSBpbXByb3ZlbWVudHMgYmFzZWQgb24gUTMgZmVlZGJhY2smcXVvdDsgLSBQcm9kdWN0IE1hbmFnZXI8L2Jsb2NrcXVvdGU+PGgzPkFjdGlvbiBJdGVtczwvaDM+PHVsPjxsaT5TYXJhaDogQ3JlYXRlIGRldGFpbGVkIHByb2plY3QgdGltZWxpbmU8L2xpPjxsaT5NaWtlOiBEcmFmdCB0ZWNobmljYWwgcmVxdWlyZW1lbnRzPC9saT48bGk+TGlzYTogU2NoZWR1bGUgdXNlciByZXNlYXJjaCBzZXNzaW9uczwvbGk+PC91bD48aHI+PHA+TmV4dCBtZWV0aW5nOiBKYW51YXJ5IDUsIDIwMjU8L3A+IgogICAgICAgICAgICA+PC9kZWVzLWlucHV0LXd5c2l3eWc+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im91dHB1dC1hY3Rpb25zIj4KICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tc2hvdy1odG1sLW91dHB1dCIgY2xhc3M9ImRlbW8tYnV0dG9uIj5TaG93IEhUTUwgT3V0cHV0PC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8cHJlIGlkPSJvdXRwdXQtcHJldmlldy1odG1sIiBjbGFzcz0ib3V0cHV0LXByZXZpZXciIGFyaWEtbGl2ZT0icG9saXRlIj48L3ByZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJvdXRwdXQtY2FyZCI+CiAgICAgICAgICAgIDxkZWVzLWlucHV0LXd5c2l3eWcgCiAgICAgICAgICAgICAgaWQ9ImVkaXRvci1yZWNpcGUiCiAgICAgICAgICAgICAgbGFiZWw9IlJlY2lwZSBCbG9nIFBvc3QiIAogICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJGb29kIGJsb2cgd2l0aCBtaXhlZCBjb250ZW50IgogICAgICAgICAgICAgIG91dHB1dEZvcm1hdD0ibWFya2Rvd24iCiAgICAgICAgICAgICAgdmFsdWU9IiMgVWx0aW1hdGUgQ2hvY29sYXRlIENoaXAgQ29va2llcwoKVGhlcmUncyBub3RoaW5nIHF1aXRlIGxpa2UgdGhlIHNtZWxsIG9mIGZyZXNobHkgYmFrZWQgY2hvY29sYXRlIGNoaXAgY29va2llcy4gVGhpcyByZWNpcGUgaGFzIGJlZW4gcGVyZmVjdGVkIG92ZXIgeWVhcnMgb2YgdGVzdGluZyEKCiMjIEluZ3JlZGllbnRzCgotIDLCvCBjdXBzIGFsbC1wdXJwb3NlIGZsb3VyCi0gMSB0c3AgYmFraW5nIHNvZGEKLSAxIHRzcCBzYWx0Ci0gMSBjdXAgYnV0dGVyLCBzb2Z0ZW5lZAotIMK+IGN1cCBncmFudWxhdGVkIHN1Z2FyCi0gwr4gY3VwIHBhY2tlZCBicm93biBzdWdhcgotIDIgbGFyZ2UgZWdncwotIDIgdHNwIHZhbmlsbGEgZXh0cmFjdAotIDIgY3VwcyBjaG9jb2xhdGUgY2hpcHMKCiMjIEluc3RydWN0aW9ucwoKIyMjIFN0ZXAgMTogUHJlcGFyYXRpb24KClByZWhlYXQgeW91ciBvdmVuIHRvICoqMzc1wrBGICgxOTDCsEMpKiouIFRoaXMgdGVtcGVyYXR1cmUgaXMgY3J1Y2lhbCBmb3IgYWNoaWV2aW5nIHRoZSBwZXJmZWN0IHRleHR1cmUuCgojIyMgU3RlcCAyOiBNaXggRHJ5IEluZ3JlZGllbnRzCgpJbiBhIG1lZGl1bSBib3dsLCB3aGlzayB0b2dldGhlcjoKCjEuIEZsb3VyCjIuIEJha2luZyBzb2RhCjMuIFNhbHQKCiMjIyBTdGVwIDM6IENyZWFtIEJ1dHRlciBhbmQgU3VnYXJzCgpcYFxgXGAKQ3JlYW0gYnV0dGVyIGFuZCBzdWdhcnMgZm9yIDMtNCBtaW51dGVzCnVudGlsIGxpZ2h0IGFuZCBmbHVmZnkKXGBcYFxgCgo+ICoqUHJvIHRpcDoqKiBSb29tIHRlbXBlcmF0dXJlIGluZ3JlZGllbnRzIG1peCBiZXR0ZXIgYW5kIGNyZWF0ZSBhIG1vcmUgdW5pZm9ybSBkb3VnaC4KCiMjIyBTdGVwIDQ6IEFkZCBXZXQgSW5ncmVkaWVudHMKCkJlYXQgaW4gZWdncyBvbmUgYXQgYSB0aW1lLCB0aGVuIGFkZCB2YW5pbGxhIGV4dHJhY3QuCgojIyMgU3RlcCA1OiBDb21iaW5lIGFuZCBCYWtlCgpHcmFkdWFsbHkgYmxlbmQgaW4gZmxvdXIgbWl4dHVyZSwgdGhlbiBzdGlyIGluIGNob2NvbGF0ZSBjaGlwcy4gRHJvcCByb3VuZGVkIHRhYmxlc3Bvb25zIG9udG8gdW5ncmVhc2VkIGNvb2tpZSBzaGVldHMuCgotLS0KCioqQmFraW5nIHRpbWU6KiogOS0xMSBtaW51dGVzIG9yIHVudGlsIGdvbGRlbiBicm93bgoKKipZaWVsZDoqKiBBYm91dCA1IGRvemVuIGNvb2tpZXMiCiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtd3lzaXd5Zz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3V0cHV0LWFjdGlvbnMiPgogICAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1zaG93LW1hcmtkb3duLW91dHB1dCIgY2xhc3M9ImRlbW8tYnV0dG9uIj5TaG93IE1hcmtkb3duIE91dHB1dDwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHByZSBpZD0ib3V0cHV0LXByZXZpZXctbWFya2Rvd24iIGNsYXNzPSJvdXRwdXQtcHJldmlldyIgYXJpYS1saXZlPSJwb2xpdGUiPjwvcHJlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI2LiBcdXsxRjNBOH0gQWR2YW5jZWQgRWRpdGluZyJ9PgogICAgICAgIDxwIGNsYXNzPSJwYW5lbC1kZXNjcmlwdGlvbiI+CiAgICAgICAgICBDcmVhdGUgY29tcGxleCBkb2N1bWVudHMgd2l0aCBtaXhlZCBjb250ZW50IHR5cGVzLiBUaGUgZWRpdG9yIGhhbmRsZXMgYWxsIGZvcm1hdHRpbmcgc2VhbWxlc3NseS4KICAgICAgICA8L3A+CiAgICAgICAgCiAgICAgICAgPGRlZXMtaW5wdXQtd3lzaXd5ZyAKICAgICAgICAgIGlkPSJlZGl0b3ItdGVjaG5pY2FsIgogICAgICAgICAgbGFiZWw9IlRlY2huaWNhbCBEb2N1bWVudGF0aW9uIiAKICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgdGVjaG5pY2FsIGRvY3Mgd2l0aCBjb2RlIGV4YW1wbGVzIGFuZCBzdHJ1Y3R1cmVkIGNvbnRlbnQiCiAgICAgICAgICB2YWx1ZT0iPGgxPkFQSSBEb2N1bWVudGF0aW9uPC9oMT48cD5XZWxjb21lIHRvIG91ciBBUEkgZG9jdW1lbnRhdGlvbi4gQmVsb3cgeW91J2xsIGZpbmQgZXhhbXBsZXMgb2YgaG93IHRvIHVzZSBvdXIgZW5kcG9pbnRzLjwvcD48aDI+QXV0aGVudGljYXRpb248L2gyPjxwPkFsbCBBUEkgcmVxdWVzdHMgcmVxdWlyZSBhdXRoZW50aWNhdGlvbiB1c2luZyBhbiBBUEkga2V5OjwvcD48cHJlPjxjb2RlPkF1dGhvcml6YXRpb246IEJlYXJlciBZT1VSX0FQSV9LRVk8L2NvZGU+PC9wcmU+PGgyPkVuZHBvaW50czwvaDI+PGgzPkdFVCAvdXNlcnM8L2gzPjxwPlJldHJpZXZlIGEgbGlzdCBvZiB1c2VycyBmcm9tIHRoZSBzeXN0ZW0uPC9wPjxwcmU+PGNvZGU+Y3VybCAtWCBHRVQgaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vdXNlcnMgXFwKICAtSCAmcXVvdDtBdXRob3JpemF0aW9uOiBCZWFyZXIgWU9VUl9BUElfS0VZJnF1b3Q7PC9jb2RlPjwvcHJlPjxibG9ja3F1b3RlPk5vdGU6IFJhdGUgbGltaXRpbmcgYXBwbGllcyB0byBhbGwgZW5kcG9pbnRzLiBZb3UgY2FuIG1ha2UgdXAgdG8gMTAwIHJlcXVlc3RzIHBlciBtaW51dGUuPC9ibG9ja3F1b3RlPjxoMz5QT1NUIC91c2VyczwvaDM+PHA+Q3JlYXRlIGEgbmV3IHVzZXIgaW4gdGhlIHN5c3RlbS48L3A+PHByZT48Y29kZT57CiAgJnF1b3Q7bmFtZSZxdW90OzogJnF1b3Q7Sm9obiBEb2UmcXVvdDssCiAgJnF1b3Q7ZW1haWwmcXVvdDs6ICZxdW90O2pvaG5AZXhhbXBsZS5jb20mcXVvdDssCiAgJnF1b3Q7cm9sZSZxdW90OzogJnF1b3Q7dXNlciZxdW90Owp9PC9jb2RlPjwvcHJlPjxocj48cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIG91ciBjb21wbGV0ZSBkb2N1bWVudGF0aW9uLjwvcD4iCiAgICAgICAgICBvdXRwdXRGb3JtYXQ9Imh0bWwiCiAgICAgICAgPjwvZGVlcy1pbnB1dC13eXNpd3lnPgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiNy4gXHUyNjk5XHVGRTBGIEZvcm0gSW50ZWdyYXRpb24ifT4KICAgICAgICA8cCBjbGFzcz0icGFuZWwtZGVzY3JpcHRpb24iPgogICAgICAgICAgU2VhbWxlc3NseSBpbnRlZ3JhdGVzIHdpdGggZGVlcy1mb3JtIGZvciBjb21wbGV0ZSBmb3JtIHNvbHV0aW9ucy4gCiAgICAgICAgICBBbGwgc3RhbmRhcmQgZm9ybSBmZWF0dXJlcyBsaWtlIHZhbGlkYXRpb24sIHJlcXVpcmVkIGZpZWxkcywgYW5kIGRhdGEgYmluZGluZyB3b3JrIG91dCBvZiB0aGUgYm94LgogICAgICAgIDwvcD4KICAgICAgICAKICAgICAgICA8ZGVlcy1mb3JtPgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAKICAgICAgICAgICAgbGFiZWw9IkFydGljbGUgVGl0bGUiIAogICAgICAgICAgICByZXF1aXJlZD0idHJ1ZSIKICAgICAgICAgICAgdmFsdWU9IkhvdyB0byBCdWlsZCBNb2Rlcm4gV2ViIEFwcGxpY2F0aW9ucyIKICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtd3lzaXd5ZyAKICAgICAgICAgICAgaWQ9ImVkaXRvci1mb3JtLWludGVncmF0aW9uIgogICAgICAgICAgICBsYWJlbD0iQXJ0aWNsZSBDb250ZW50IiAKICAgICAgICAgICAgZGVzY3JpcHRpb249IldyaXRlIHlvdXIgYXJ0aWNsZSBjb250ZW50IGhlcmUiCiAgICAgICAgICAgIHJlcXVpcmVkPSJ0cnVlIgogICAgICAgICAgICBvdXRwdXRGb3JtYXQ9Im1hcmtkb3duIgogICAgICAgICAgPjwvZGVlcy1pbnB1dC13eXNpd3lnPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC10YWdzCiAgICAgICAgICAgIGxhYmVsPSJUYWdzIgogICAgICAgICAgICBkZXNjcmlwdGlvbj0iQWRkIHJlbGV2YW50IHRhZ3MgZm9yIHlvdXIgYXJ0aWNsZSIKICAgICAgICAgID48L2RlZXMtaW5wdXQtdGFncz4KICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgPC9kZWVzLXBhbmVsPgoKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjguIFx1ezFGOUU5fSBQcm9ncmFtbWF0aWMgQmxvY2sgQ3JlYXRpb24ifT4KICAgICAgICA8cCBjbGFzcz0icGFuZWwtZGVzY3JpcHRpb24iPgogICAgICAgICAgQ3JlYXRlIGNvbnRlbnQgcHJvZ3JhbW1hdGljYWxseSB1c2luZyB0aGUgYmxvY2sgQVBJIGZvciBkeW5hbWljIGRvY3VtZW50IGdlbmVyYXRpb24uCiAgICAgICAgPC9wPgogICAgICAgIAogICAgICAgIDxkZWVzLWlucHV0LXd5c2l3eWcKICAgICAgICAgIGlkPSJlZGl0b3ItcHJvZ3JhbW1hdGljIgogICAgICAgICAgbGFiZWw9IlByb2dyYW1tYXRpY2FsbHkgR2VuZXJhdGVkIENvbnRlbnQiCiAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhpcyBjb250ZW50IHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBpbXBvcnRCbG9ja3MgQVBJIgogICAgICAgID48L2RlZXMtaW5wdXQtd3lzaXd5Zz4KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JvdXAiPgogICAgICAgICAgPGJ1dHRvbiBpZD0iYnRuLWdlbmVyYXRlLXJlcG9ydCIgY2xhc3M9ImRlbW8tYnV0dG9uIj4KICAgICAgICAgICAgR2VuZXJhdGUgUmVwb3J0CiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIAogICAgICAgICAgPGJ1dHRvbiBpZD0iYnRuLWdlbmVyYXRlLXJlY2lwZSIgY2xhc3M9ImRlbW8tYnV0dG9uIj4KICAgICAgICAgICAgR2VuZXJhdGUgUmVjaXBlCiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIAogICAgICAgICAgPGJ1dHRvbiBpZD0iYnRuLWNsZWFyLWVkaXRvciIgY2xhc3M9ImRlbW8tYnV0dG9uIj4KICAgICAgICAgICAgQ2xlYXIgRWRpdG9yCiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgoKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjkuIFx1ezFGNEU0fSBFeHBvcnQvSW1wb3J0IEZlYXR1cmVzIn0+CiAgICAgICAgPHAgY2xhc3M9InBhbmVsLWRlc2NyaXB0aW9uIj4KICAgICAgICAgIFRoZSBXWVNJV1lHIGVkaXRvciBwcm92aWRlcyBtdWx0aXBsZSBleHBvcnQgZm9ybWF0cyBhbmQgbG9zc2xlc3Mgc2F2ZS9yZXN0b3JlIGNhcGFiaWxpdGllcyBmb3IgbWF4aW11bSBmbGV4aWJpbGl0eS4KICAgICAgICA8L3A+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0iZXhwb3J0LWluZm8tZ3JpZCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJleHBvcnQtaW5mby1jYXJkIGJsb2NrcyI+CiAgICAgICAgICAgIDxzdHJvbmc+TG9zc2xlc3MgQmxvY2tzPC9zdHJvbmc+CiAgICAgICAgICAgIDxwPkV4cG9ydCBhbmQgaW1wb3J0IHJhdyBibG9jayBzdHJ1Y3R1cmUgZm9yIHBlcmZlY3Qgcm91bmQtdHJpcCBlZGl0aW5nPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJleHBvcnQtaW5mby1jYXJkIGh0bWwiPgogICAgICAgICAgICA8c3Ryb25nPkhUTUwgRXhwb3J0PC9zdHJvbmc+CiAgICAgICAgICAgIDxwPkdldCBjbGVhbiwgc2VtYW50aWMgSFRNTCByZWdhcmRsZXNzIG9mIG91dHB1dCBmb3JtYXQgc2V0dGluZzwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZXhwb3J0LWluZm8tY2FyZCBtYXJrZG93biI+CiAgICAgICAgICAgIDxzdHJvbmc+TWFya2Rvd24gRXhwb3J0PC9zdHJvbmc+CiAgICAgICAgICAgIDxwPkV4cG9ydCBhcyBNYXJrZG93biBmb3IgZG9jcywgUkVBRE1FcywgYW5kIHN0YXRpYyBzaXRlczwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZXhwb3J0LWluZm8tY2FyZCBzdGF0ZSI+CiAgICAgICAgICAgIDxzdHJvbmc+U3RhdGUgTWFuYWdlbWVudDwvc3Ryb25nPgogICAgICAgICAgICA8cD5TYXZlIGFuZCByZXN0b3JlIGNvbXBsZXRlIGVkaXRvciBzdGF0ZSBpbmNsdWRpbmcgc2V0dGluZ3M8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICAKICAgICAgICA8ZGVlcy1pbnB1dC13eXNpd3lnCiAgICAgICAgICBpZD0iZWRpdG9yLWV4cG9ydCIKICAgICAgICAgIGxhYmVsPSJFeHBvcnQgRGVtbyBFZGl0b3IiCiAgICAgICAgICBkZXNjcmlwdGlvbj0iVHJ5IHRoZSBleHBvcnQgYnV0dG9ucyBiZWxvdyB0byBzZWUgZGlmZmVyZW50IG91dHB1dCBmb3JtYXRzIgogICAgICAgICAgdmFsdWU9IjxoMT5Tb2Z0d2FyZSBSZWxlYXNlIE5vdGVzPC9oMT48cD48c3Ryb25nPlZlcnNpb24gMi41LjA8L3N0cm9uZz4gLSBSZWxlYXNlZCBEZWNlbWJlciAxNSwgMjAyNDwvcD48aDI+8J+OiSBOZXcgRmVhdHVyZXM8L2gyPjx1bD48bGk+QWRkZWQgZGFyayBtb2RlIHN1cHBvcnQgYWNyb3NzIGFsbCBjb21wb25lbnRzPC9saT48bGk+SW1wbGVtZW50ZWQgcmVhbC10aW1lIGNvbGxhYm9yYXRpb24gZmVhdHVyZXM8L2xpPjxsaT5OZXcgZGFzaGJvYXJkIGFuYWx5dGljcyB3aWRnZXRzPC9saT48bGk+RXhwb3J0IGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCByZXBvcnQgdHlwZXM8L2xpPjwvdWw+PGgyPvCfkJsgQnVnIEZpeGVzPC9oMj48dWw+PGxpPkZpeGVkIG1lbW9yeSBsZWFrIGluIGRhdGEgcHJvY2Vzc2luZyBtb2R1bGU8L2xpPjxsaT5SZXNvbHZlZCBhdXRoZW50aWNhdGlvbiB0aW1lb3V0IGlzc3VlczwvbGk+PGxpPkNvcnJlY3RlZCB0aW1lem9uZSBoYW5kbGluZyBpbiBzY2hlZHVsZWQgdGFza3M8L2xpPjwvdWw+PGgyPuKaoSBQZXJmb3JtYW5jZSBJbXByb3ZlbWVudHM8L2gyPjxibG9ja3F1b3RlPlBhZ2UgbG9hZCB0aW1lcyByZWR1Y2VkIGJ5IDQwJSB0aHJvdWdoIGxhenkgbG9hZGluZyBhbmQgY29kZSBzcGxpdHRpbmc8L2Jsb2NrcXVvdGU+PGgyPvCflKcgVGVjaG5pY2FsIERldGFpbHM8L2gyPjxwcmU+PGNvZGU+Ly8gTmV3IEFQSSBlbmRwb2ludCBmb3IgYmF0Y2ggb3BlcmF0aW9ucwpQT1NUIC9hcGkvdjIvYmF0Y2gKewogICZxdW90O29wZXJhdGlvbnMmcXVvdDs6IFsKICAgIHsgJnF1b3Q7bWV0aG9kJnF1b3Q7OiAmcXVvdDtHRVQmcXVvdDssICZxdW90O3BhdGgmcXVvdDs6ICZxdW90Oy91c2Vycy8xMjMmcXVvdDsgfSwKICAgIHsgJnF1b3Q7bWV0aG9kJnF1b3Q7OiAmcXVvdDtQVVQmcXVvdDssICZxdW90O3BhdGgmcXVvdDs6ICZxdW90Oy9zZXR0aW5ncyZxdW90OywgJnF1b3Q7Ym9keSZxdW90Ozogey4uLn0gfQogIF0KfTwvY29kZT48L3ByZT48aDI+8J+SoSBNaWdyYXRpb24gR3VpZGU8L2gyPjxvbD48bGk+VXBkYXRlIHlvdXIgZGVwZW5kZW5jaWVzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbnM8L2xpPjxsaT5SdW4gZGF0YWJhc2UgbWlncmF0aW9uczogPGNvZGU+bnBtIHJ1biBtaWdyYXRlPC9jb2RlPjwvbGk+PGxpPkNsZWFyIGNhY2hlOiA8Y29kZT5ucG0gcnVuIGNhY2hlOmNsZWFyPC9jb2RlPjwvbGk+PGxpPlJlc3RhcnQgYWxsIHNlcnZpY2VzPC9saT48L29sPjxocj48cD5Gb3IgcXVlc3Rpb25zIG9yIGlzc3VlcywgcGxlYXNlIGNvbnRhY3QgdGhlIGRldmVsb3BtZW50IHRlYW0gb3IgZmlsZSBhIHRpY2tldCBpbiBvdXIgaXNzdWUgdHJhY2tlci48L3A+IgogICAgICAgID48L2RlZXMtaW5wdXQtd3lzaXd5Zz4KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JvdXAiPgogICAgICAgICAgPGJ1dHRvbiBpZD0iYnRuLWV4cG9ydC1ibG9ja3MiIGNsYXNzPSJkZW1vLWJ1dHRvbiI+CiAgICAgICAgICAgIEV4cG9ydCBCbG9ja3MKICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgCiAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tZXhwb3J0LWh0bWwiIGNsYXNzPSJkZW1vLWJ1dHRvbiI+CiAgICAgICAgICAgIEV4cG9ydCBhcyBIVE1MCiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIAogICAgICAgICAgPGJ1dHRvbiBpZD0iYnRuLWV4cG9ydC1tYXJrZG93biIgY2xhc3M9ImRlbW8tYnV0dG9uIj4KICAgICAgICAgICAgRXhwb3J0IGFzIE1hcmtkb3duCiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIAogICAgICAgICAgPGJ1dHRvbiBpZD0iYnRuLXNhdmUtc3RhdGUiIGNsYXNzPSJkZW1vLWJ1dHRvbiI+CiAgICAgICAgICAgIFNhdmUgU3RhdGUKICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgCiAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tcmVzdG9yZS1zdGF0ZSIgY2xhc3M9ImRlbW8tYnV0dG9uIj4KICAgICAgICAgICAgUmVzdG9yZSBTdGF0ZQogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGl2PgogIDwvZGVlcy1kZW1vd3JhcHBlcj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvd3lzaXd5Zy5zaG9ydGN1dHMuanMKdmFyIFd5c2l3eWdTaG9ydGN1dHMgPSBjbGFzcyB7CiAgc3RhdGljIEhFQURJTkdfUEFUVEVSTlMgPSBbCiAgICB7IHBhdHRlcm46IC9eI1tcc1x1MDBBMF0kLywgdHlwZTogImhlYWRpbmctMSIgfSwKICAgIHsgcGF0dGVybjogL14jI1tcc1x1MDBBMF0kLywgdHlwZTogImhlYWRpbmctMiIgfSwKICAgIHsgcGF0dGVybjogL14jIyNbXHNcdTAwQTBdJC8sIHR5cGU6ICJoZWFkaW5nLTMiIH0KICBdOwogIHN0YXRpYyBMSVNUX1BBVFRFUk5TID0gWwogICAgeyBwYXR0ZXJuOiAvXlsqLV1bXHNcdTAwQTBdJC8sIHR5cGU6ICJidWxsZXQiIH0sCiAgICB7IHBhdHRlcm46IC9eKFxkKylcLltcc1x1MDBBMF0kLywgdHlwZTogIm9yZGVyZWQiIH0sCiAgICB7IHBhdHRlcm46IC9eKFxkKylcKVtcc1x1MDBBMF0kLywgdHlwZTogIm9yZGVyZWQiIH0KICBdOwogIHN0YXRpYyBRVU9URV9QQVRURVJOID0gL14+W1xzXHUwMEEwXSQvOwogIHN0YXRpYyBDT0RFX1BBVFRFUk4gPSAvXmBgYCQvOwogIHN0YXRpYyBESVZJREVSX1BBVFRFUk5TID0gWyItLS0iLCAiKioqIiwgIl9fXyJdOwogIHN0YXRpYyBjaGVja0hlYWRpbmdTaG9ydGN1dChjb250ZW50MykgewogICAgZm9yIChjb25zdCB7IHBhdHRlcm4sIHR5cGU6IHR5cGU1IH0gb2YgdGhpcy5IRUFESU5HX1BBVFRFUk5TKSB7CiAgICAgIGlmIChwYXR0ZXJuLnRlc3QoY29udGVudDMpKSB7CiAgICAgICAgcmV0dXJuIHsgdHlwZTogdHlwZTUgfTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIHN0YXRpYyBjaGVja0xpc3RTaG9ydGN1dChjb250ZW50MykgewogICAgZm9yIChjb25zdCB7IHBhdHRlcm4sIHR5cGU6IHR5cGU1IH0gb2YgdGhpcy5MSVNUX1BBVFRFUk5TKSB7CiAgICAgIGlmIChwYXR0ZXJuLnRlc3QoY29udGVudDMpKSB7CiAgICAgICAgcmV0dXJuIHsgdHlwZTogImxpc3QiLCBsaXN0VHlwZTogdHlwZTUgfTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIHN0YXRpYyBjaGVja1F1b3RlU2hvcnRjdXQoY29udGVudDMpIHsKICAgIHJldHVybiB0aGlzLlFVT1RFX1BBVFRFUk4udGVzdChjb250ZW50Myk7CiAgfQogIHN0YXRpYyBjaGVja0NvZGVTaG9ydGN1dChjb250ZW50MykgewogICAgcmV0dXJuIHRoaXMuQ09ERV9QQVRURVJOLnRlc3QoY29udGVudDMpOwogIH0KICBzdGF0aWMgY2hlY2tEaXZpZGVyU2hvcnRjdXQoY29udGVudDMpIHsKICAgIHJldHVybiB0aGlzLkRJVklERVJfUEFUVEVSTlMuaW5jbHVkZXMoY29udGVudDMpOwogIH0KICBzdGF0aWMgZ2V0U2xhc2hNZW51SXRlbXMoKSB7CiAgICByZXR1cm4gWwogICAgICB7IHR5cGU6ICJwYXJhZ3JhcGgiLCBsYWJlbDogIlBhcmFncmFwaCIsIGljb246ICJsdWNpZGU6cGlsY3JvdyIgfSwKICAgICAgeyB0eXBlOiAiaGVhZGluZy0xIiwgbGFiZWw6ICJIZWFkaW5nIDEiLCBpY29uOiAibHVjaWRlOmhlYWRpbmcxIiB9LAogICAgICB7IHR5cGU6ICJoZWFkaW5nLTIiLCBsYWJlbDogIkhlYWRpbmcgMiIsIGljb246ICJsdWNpZGU6aGVhZGluZzIiIH0sCiAgICAgIHsgdHlwZTogImhlYWRpbmctMyIsIGxhYmVsOiAiSGVhZGluZyAzIiwgaWNvbjogImx1Y2lkZTpoZWFkaW5nMyIgfSwKICAgICAgeyB0eXBlOiAicXVvdGUiLCBsYWJlbDogIlF1b3RlIiwgaWNvbjogImx1Y2lkZTpxdW90ZSIgfSwKICAgICAgeyB0eXBlOiAiY29kZSIsIGxhYmVsOiAiQ29kZSBCbG9jayIsIGljb246ICJsdWNpZGU6ZmlsZUNvZGUiIH0sCiAgICAgIHsgdHlwZTogImxpc3QiLCBsYWJlbDogIkJ1bGxldCBMaXN0IiwgaWNvbjogImx1Y2lkZTpsaXN0IiB9LAogICAgICB7IHR5cGU6ICJpbWFnZSIsIGxhYmVsOiAiSW1hZ2UiLCBpY29uOiAibHVjaWRlOmltYWdlIiB9LAogICAgICB7IHR5cGU6ICJkaXZpZGVyIiwgbGFiZWw6ICJEaXZpZGVyIiwgaWNvbjogImx1Y2lkZTptaW51cyIgfSwKICAgICAgeyB0eXBlOiAieW91dHViZSIsIGxhYmVsOiAiWW91VHViZSIsIGljb246ICJsdWNpZGU6eW91dHViZSIgfSwKICAgICAgeyB0eXBlOiAibWFya2Rvd24iLCBsYWJlbDogIk1hcmtkb3duIiwgaWNvbjogImx1Y2lkZTpmaWxlVGV4dCIgfSwKICAgICAgeyB0eXBlOiAiaHRtbCIsIGxhYmVsOiAiSFRNTCIsIGljb246ICJsdWNpZGU6Y29kZSIgfSwKICAgICAgeyB0eXBlOiAiYXR0YWNobWVudCIsIGxhYmVsOiAiRmlsZSBBdHRhY2htZW50IiwgaWNvbjogImx1Y2lkZTpwYXBlcmNsaXAiIH0KICAgIF07CiAgfQogIHN0YXRpYyBnZW5lcmF0ZUJsb2NrSWQoKSB7CiAgICByZXR1cm4gYGJsb2NrLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOSl9YDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL2RlZXMtc2xhc2gtbWVudS5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2RlZXNfaWNvbigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGUzNCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzMzUgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNTbGFzaE1lbnUgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtc2xhc2gtbWVudSIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3Zpc2libGVfZGVjb3JhdG9yczsKICBsZXQgX3Zpc2libGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92aXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wb3NpdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfcG9zaXRpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZmlsdGVyX2RlY29yYXRvcnM7CiAgbGV0IF9maWx0ZXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWx0ZXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkSW5kZXhfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkSW5kZXhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZEluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tZW51WkluZGV4X2RlY29yYXRvcnM7CiAgbGV0IF9tZW51WkluZGV4X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWVudVpJbmRleF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzU2xhc2hNZW51MiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3Zpc2libGVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3Bvc2l0aW9uX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9maWx0ZXJfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3NlbGVjdGVkSW5kZXhfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX21lbnVaSW5kZXhfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlMzQodGhpcywgbnVsbCwgX3Zpc2libGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmlzaWJsZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmlzaWJsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai52aXNpYmxlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52aXNpYmxlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Zpc2libGVfaW5pdGlhbGl6ZXJzLCBfdmlzaWJsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM0KHRoaXMsIG51bGwsIF9wb3NpdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwb3NpdGlvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicG9zaXRpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucG9zaXRpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnBvc2l0aW9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Bvc2l0aW9uX2luaXRpYWxpemVycywgX3Bvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzQodGhpcywgbnVsbCwgX2ZpbHRlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJmaWx0ZXIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZpbHRlciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5maWx0ZXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmZpbHRlciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9maWx0ZXJfaW5pdGlhbGl6ZXJzLCBfZmlsdGVyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzQodGhpcywgbnVsbCwgX3NlbGVjdGVkSW5kZXhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0ZWRJbmRleCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0ZWRJbmRleCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWxlY3RlZEluZGV4LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3RlZEluZGV4ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGVkSW5kZXhfaW5pdGlhbGl6ZXJzLCBfc2VsZWN0ZWRJbmRleF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM0KHRoaXMsIG51bGwsIF9tZW51WkluZGV4X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1lbnVaSW5kZXgiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1lbnVaSW5kZXgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWVudVpJbmRleCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWVudVpJbmRleCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tZW51WkluZGV4X2luaXRpYWxpemVycywgX21lbnVaSW5kZXhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzNChudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNTbGFzaE1lbnUyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBpbnN0YW5jZTsKICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHsKICAgICAgaWYgKCFEZWVzU2xhc2hNZW51Mi5pbnN0YW5jZSkgewogICAgICAgIERlZXNTbGFzaE1lbnUyLmluc3RhbmNlID0gbmV3IERlZXNTbGFzaE1lbnUyKCk7CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEZWVzU2xhc2hNZW51Mi5pbnN0YW5jZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIERlZXNTbGFzaE1lbnUyLmluc3RhbmNlOwogICAgfQogICAgI3Zpc2libGVfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMzUodGhpcywgX3Zpc2libGVfaW5pdGlhbGl6ZXJzLCBmYWxzZSk7CiAgICBnZXQgdmlzaWJsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Zpc2libGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB2aXNpYmxlKHZhbHVlMikgewogICAgICB0aGlzLiN2aXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM1KHRoaXMsIF92aXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzNSh0aGlzLCBfcG9zaXRpb25faW5pdGlhbGl6ZXJzLCB7IHg6IDAsIHk6IDAgfSkpOwogICAgZ2V0IHBvc2l0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy4jcG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwb3NpdGlvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jcG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNmaWx0ZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM1KHRoaXMsIF9wb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzUodGhpcywgX2ZpbHRlcl9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgZmlsdGVyKCkgewogICAgICByZXR1cm4gdGhpcy4jZmlsdGVyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZmlsdGVyKHZhbHVlMikgewogICAgICB0aGlzLiNmaWx0ZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWxlY3RlZEluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNSh0aGlzLCBfZmlsdGVyX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzNSh0aGlzLCBfc2VsZWN0ZWRJbmRleF9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBzZWxlY3RlZEluZGV4KCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNlbGVjdGVkSW5kZXgodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlbGVjdGVkSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtZW51WkluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzNSh0aGlzLCBfc2VsZWN0ZWRJbmRleF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzUodGhpcywgX21lbnVaSW5kZXhfaW5pdGlhbGl6ZXJzLCAxZTMpKTsKICAgIGdldCBtZW51WkluZGV4KCkgewogICAgICByZXR1cm4gdGhpcy4jbWVudVpJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1lbnVaSW5kZXgodmFsdWUyKSB7CiAgICAgIHRoaXMuI21lbnVaSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGNhbGxiYWNrID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzUodGhpcywgX21lbnVaSW5kZXhfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAwOwogICAgICAgIGhlaWdodDogMDsKICAgICAgfQoKICAgICAgLnNsYXNoLW1lbnUgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMDkwOTBiIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSksIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDYpOwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgICBtaW4td2lkdGg6IDIyMHB4OwogICAgICAgIG1heC1oZWlnaHQ6IDMwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgYW5pbWF0aW9uOiBmYWRlSW5TY2FsZSAwLjE1cyBlYXNlLW91dDsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBmYWRlSW5TY2FsZSB7CiAgICAgICAgZnJvbSB7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk4KSB0cmFuc2xhdGVZKC0ycHgpOwogICAgICAgIH0KICAgICAgICB0byB7CiAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGVZKDApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLnNsYXNoLW1lbnUtaXRlbSB7CiAgICAgICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQoKICAgICAgLnNsYXNoLW1lbnUtaXRlbTpob3ZlciwKICAgICAgLnNsYXNoLW1lbnUtaXRlbS5zZWxlY3RlZCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmNGY0ZjUiLCAiIzI3MjcyYSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgICAgfQoKICAgICAgLnNsYXNoLW1lbnUtaXRlbSAuaWNvbiB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgICAgfQoKICAgICAgLnNsYXNoLW1lbnUtaXRlbTpob3ZlciAuaWNvbiwKICAgICAgLnNsYXNoLW1lbnUtaXRlbS5zZWxlY3RlZCAuaWNvbiB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiMzYjgyZjYiKX07CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIGlmICghdGhpcy52aXNpYmxlKQogICAgICAgIHJldHVybiBiMmBgOwogICAgICB0aGlzLnN0eWxlLnpJbmRleCA9IHRoaXMubWVudVpJbmRleC50b1N0cmluZygpOwogICAgICBjb25zdCBtZW51SXRlbXMgPSB0aGlzLmdldEZpbHRlcmVkTWVudUl0ZW1zKCk7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiAKICAgICAgICBjbGFzcz0ic2xhc2gtbWVudSIgCiAgICAgICAgc3R5bGU9ImxlZnQ6ICR7dGhpcy5wb3NpdGlvbi54fXB4OyB0b3A6ICR7dGhpcy5wb3NpdGlvbi55fXB4OyIKICAgICAgICB0YWJpbmRleD0iLTEiCiAgICAgICAgZGF0YS1tZW51LXR5cGU9InNsYXNoIgogICAgICA+CiAgICAgICAgJHttZW51SXRlbXMubWFwKChpdGVtLCBpbmRleDIpID0+IGIyYAogICAgICAgICAgPGRpdiAKICAgICAgICAgICAgY2xhc3M9InNsYXNoLW1lbnUtaXRlbSAke2luZGV4MiA9PT0gdGhpcy5zZWxlY3RlZEluZGV4ID8gInNlbGVjdGVkIiA6ICIifSIKICAgICAgICAgICAgZGF0YS1pdGVtLXR5cGU9IiR7aXRlbS50eXBlfSIKICAgICAgICAgICAgZGF0YS1pdGVtLWluZGV4PSIke2luZGV4Mn0iCiAgICAgICAgICA+CiAgICAgICAgICAgIDxkZWVzLWljb24gY2xhc3M9Imljb24iIC5pY29uPSIke2l0ZW0uaWNvbn0iIGljb25TaXplPSIxNiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgIDxzcGFuPiR7aXRlbS5sYWJlbH08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgKX0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgZ2V0RmlsdGVyZWRNZW51SXRlbXMoKSB7CiAgICAgIGNvbnN0IGFsbEl0ZW1zID0gV3lzaXd5Z1Nob3J0Y3V0cy5nZXRTbGFzaE1lbnVJdGVtcygpOwogICAgICByZXR1cm4gYWxsSXRlbXMuZmlsdGVyKChpdGVtKSA9PiB0aGlzLmZpbHRlciA9PT0gIiIgfHwgaXRlbS5sYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuZmlsdGVyLnRvTG93ZXJDYXNlKCkpKTsKICAgIH0KICAgIHNlbGVjdEl0ZW0odHlwZTUpIHsKICAgICAgaWYgKHRoaXMuY2FsbGJhY2spIHsKICAgICAgICB0aGlzLmNhbGxiYWNrKHR5cGU1KTsKICAgICAgfQogICAgICB0aGlzLmhpZGUoKTsKICAgIH0KICAgIHNob3cocG9zaXRpb24zLCBjYWxsYmFjaykgewogICAgICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb24zOwogICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgIHRoaXMuZmlsdGVyID0gIiI7CiAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7CiAgICAgIHRoaXMubWVudVpJbmRleCA9IHpJbmRleFJlZ2lzdHJ5LmdldE5leHRaSW5kZXgoKTsKICAgICAgekluZGV4UmVnaXN0cnkucmVnaXN0ZXIodGhpcywgdGhpcy5tZW51WkluZGV4KTsKICAgICAgdGhpcy5zdHlsZS56SW5kZXggPSB0aGlzLm1lbnVaSW5kZXgudG9TdHJpbmcoKTsKICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTsKICAgIH0KICAgIGhpZGUoKSB7CiAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlOwogICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbDsKICAgICAgdGhpcy5maWx0ZXIgPSAiIjsKICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gMDsKICAgICAgekluZGV4UmVnaXN0cnkudW5yZWdpc3Rlcih0aGlzKTsKICAgIH0KICAgIHVwZGF0ZUZpbHRlcihmaWx0ZXIyKSB7CiAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyMjsKICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gMDsKICAgIH0KICAgIG5hdmlnYXRlKGRpcmVjdGlvbikgewogICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0RmlsdGVyZWRNZW51SXRlbXMoKTsKICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gImRvd24iKSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gKHRoaXMuc2VsZWN0ZWRJbmRleCArIDEpICUgaXRlbXMubGVuZ3RoOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IHRoaXMuc2VsZWN0ZWRJbmRleCA9PT0gMCA/IGl0ZW1zLmxlbmd0aCAtIDEgOiB0aGlzLnNlbGVjdGVkSW5kZXggLSAxOwogICAgICB9CiAgICB9CiAgICBzZWxlY3RDdXJyZW50KCkgewogICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0RmlsdGVyZWRNZW51SXRlbXMoKTsKICAgICAgaWYgKGl0ZW1zW3RoaXMuc2VsZWN0ZWRJbmRleF0pIHsKICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oaXRlbXNbdGhpcy5zZWxlY3RlZEluZGV4XS50eXBlKTsKICAgICAgfQogICAgfQogICAgZmlyc3RVcGRhdGVkKCkgewogICAgICB0aGlzLnNoYWRvd1Jvb3Q/LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsIChlMTEpID0+IHsKICAgICAgICBjb25zdCBtZW51ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuc2xhc2gtbWVudSIpOwogICAgICAgIGlmIChtZW51ICYmIG1lbnUuY29udGFpbnMoZTExLnRhcmdldCkpIHsKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMuc2hhZG93Um9vdD8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZTExKSA9PiB7CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZTExLnRhcmdldDsKICAgICAgICBjb25zdCBtZW51SXRlbSA9IHRhcmdldC5jbG9zZXN0KCIuc2xhc2gtbWVudS1pdGVtIik7CiAgICAgICAgaWYgKG1lbnVJdGVtKSB7CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgIGNvbnN0IGl0ZW1UeXBlID0gbWVudUl0ZW0uZ2V0QXR0cmlidXRlKCJkYXRhLWl0ZW0tdHlwZSIpOwogICAgICAgICAgaWYgKGl0ZW1UeXBlKSB7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShpdGVtVHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdGhpcy5zaGFkb3dSb290Py5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIiwgKGUxMSkgPT4gewogICAgICAgIGNvbnN0IHRhcmdldCA9IGUxMS50YXJnZXQ7CiAgICAgICAgY29uc3QgbWVudUl0ZW0gPSB0YXJnZXQuY2xvc2VzdCgiLnNsYXNoLW1lbnUtaXRlbSIpOwogICAgICAgIGlmIChtZW51SXRlbSkgewogICAgICAgICAgY29uc3QgaW5kZXgyID0gcGFyc2VJbnQobWVudUl0ZW0uZ2V0QXR0cmlidXRlKCJkYXRhLWl0ZW0taW5kZXgiKSB8fCAiMCIsIDEwKTsKICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IGluZGV4MjsKICAgICAgICB9CiAgICAgIH0sIHRydWUpOwogICAgICB0aGlzLnNoYWRvd1Jvb3Q/LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwgKGUxMSkgPT4gewogICAgICAgIGNvbnN0IG1lbnUgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5zbGFzaC1tZW51Iik7CiAgICAgICAgaWYgKG1lbnUgJiYgbWVudS5jb250YWlucyhlMTEudGFyZ2V0KSkgewogICAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgfQogICAgICB9LCB0cnVlKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMzUoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNTbGFzaE1lbnUyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvd3lzaXd5Zy5zZWxlY3Rpb24uanMKdmFyIFd5c2l3eWdTZWxlY3Rpb24gPSBjbGFzcyB7CiAgLyoqCiAgICogR2V0cyBzZWxlY3Rpb24gaW5mbyB0aGF0IHdvcmtzIGFjcm9zcyBTaGFkb3cgRE9NIGJvdW5kYXJpZXMKICAgKiBAcGFyYW0gc2hhZG93Um9vdHMgLSBTaGFkb3cgcm9vdHMgdG8gaW5jbHVkZSBpbiB0aGUgc2VsZWN0aW9uIHNlYXJjaAogICAqLwogIHN0YXRpYyBnZXRTZWxlY3Rpb25JbmZvKC4uLnNoYWRvd1Jvb3RzKSB7CiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICBjb25zb2xlLmxvZygiV3lzaXd5Z1NlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvIC0gc2VsZWN0aW9uOiIsIHNlbGVjdGlvbiwgInJhbmdlQ291bnQ6Iiwgc2VsZWN0aW9uPy5yYW5nZUNvdW50KTsKICAgIGlmICghc2VsZWN0aW9uKQogICAgICByZXR1cm4gbnVsbDsKICAgIGlmICgiZ2V0Q29tcG9zZWRSYW5nZXMiIGluIHNlbGVjdGlvbiAmJiB0eXBlb2Ygc2VsZWN0aW9uLmdldENvbXBvc2VkUmFuZ2VzID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIGNvbnNvbGUubG9nKCJVc2luZyBnZXRDb21wb3NlZFJhbmdlcyB3aXRoIiwgc2hhZG93Um9vdHMubGVuZ3RoLCAic2hhZG93IHJvb3RzIik7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmFuZ2VzID0gc2VsZWN0aW9uLmdldENvbXBvc2VkUmFuZ2VzKHsgc2hhZG93Um9vdHMgfSk7CiAgICAgICAgY29uc29sZS5sb2coImdldENvbXBvc2VkUmFuZ2VzIHJldHVybmVkIiwgcmFuZ2VzLmxlbmd0aCwgInJhbmdlcyIpOwogICAgICAgIGlmIChyYW5nZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgY29uc3QgcmFuZ2UyID0gcmFuZ2VzWzBdOwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgc3RhcnRDb250YWluZXI6IHJhbmdlMi5zdGFydENvbnRhaW5lciwKICAgICAgICAgICAgc3RhcnRPZmZzZXQ6IHJhbmdlMi5zdGFydE9mZnNldCwKICAgICAgICAgICAgZW5kQ29udGFpbmVyOiByYW5nZTIuZW5kQ29udGFpbmVyLAogICAgICAgICAgICBlbmRPZmZzZXQ6IHJhbmdlMi5lbmRPZmZzZXQsCiAgICAgICAgICAgIGNvbGxhcHNlZDogcmFuZ2UyLmNvbGxhcHNlZAogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJnZXRDb21wb3NlZFJhbmdlcyBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBnZXRSYW5nZUF0OiIsIGVycm9yKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY29uc29sZS5sb2coImdldENvbXBvc2VkUmFuZ2VzIG5vdCBhdmFpbGFibGUsIHVzaW5nIGZhbGxiYWNrIik7CiAgICB9CiAgICBpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7CiAgICAgIGNvbnN0IHJhbmdlMiA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgICByZXR1cm4gewogICAgICAgIHN0YXJ0Q29udGFpbmVyOiByYW5nZTIuc3RhcnRDb250YWluZXIsCiAgICAgICAgc3RhcnRPZmZzZXQ6IHJhbmdlMi5zdGFydE9mZnNldCwKICAgICAgICBlbmRDb250YWluZXI6IHJhbmdlMi5lbmRDb250YWluZXIsCiAgICAgICAgZW5kT2Zmc2V0OiByYW5nZTIuZW5kT2Zmc2V0LAogICAgICAgIGNvbGxhcHNlZDogcmFuZ2UyLmNvbGxhcHNlZAogICAgICB9OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIC8qKgogICAqIENoZWNrcyBpZiBhIHNlbGVjdGlvbiBpcyB3aXRoaW4gYSBzcGVjaWZpYyBlbGVtZW50IChjb25zaWRlcmluZyBTaGFkb3cgRE9NKQogICAqLwogIHN0YXRpYyBpc1NlbGVjdGlvbkluRWxlbWVudChlbGVtZW50NCwgc2hhZG93Um9vdCkgewogICAgY29uc3Qgc2VsZWN0aW9uSW5mbyA9IHNoYWRvd1Jvb3QgPyB0aGlzLmdldFNlbGVjdGlvbkluZm8oc2hhZG93Um9vdCkgOiB0aGlzLmdldFNlbGVjdGlvbkluZm8oKTsKICAgIGlmICghc2VsZWN0aW9uSW5mbykKICAgICAgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIGVsZW1lbnQ0LmNvbnRhaW5zKHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIpIHx8IGVsZW1lbnQ0LmNvbnRhaW5zKHNlbGVjdGlvbkluZm8uZW5kQ29udGFpbmVyKTsKICB9CiAgLyoqCiAgICogR2V0cyB0aGUgc2VsZWN0ZWQgdGV4dCBhY3Jvc3MgU2hhZG93IERPTSBib3VuZGFyaWVzCiAgICovCiAgc3RhdGljIGdldFNlbGVjdGVkVGV4dCgpIHsKICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgIHJldHVybiBzZWxlY3Rpb24gPyBzZWxlY3Rpb24udG9TdHJpbmcoKSA6ICIiOwogIH0KICAvKioKICAgKiBDcmVhdGVzIGEgcmFuZ2UgZnJvbSBzZWxlY3Rpb24gaW5mbwogICAqLwogIHN0YXRpYyBjcmVhdGVSYW5nZUZyb21JbmZvKGluZm8pIHsKICAgIGNvbnN0IHJhbmdlMiA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICByYW5nZTIuc2V0U3RhcnQoaW5mby5zdGFydENvbnRhaW5lciwgaW5mby5zdGFydE9mZnNldCk7CiAgICByYW5nZTIuc2V0RW5kKGluZm8uZW5kQ29udGFpbmVyLCBpbmZvLmVuZE9mZnNldCk7CiAgICByZXR1cm4gcmFuZ2UyOwogIH0KICAvKioKICAgKiBTZXRzIHNlbGVjdGlvbiBmcm9tIGEgcmFuZ2UgKHdvcmtzIHdpdGggU2hhZG93IERPTSkKICAgKi8KICBzdGF0aWMgc2V0U2VsZWN0aW9uRnJvbVJhbmdlKHJhbmdlMikgewogICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgaWYgKHNlbGVjdGlvbikgewogICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZTIpOwogICAgfQogIH0KICAvKioKICAgKiBHZXRzIGN1cnNvciBwb3NpdGlvbiByZWxhdGl2ZSB0byBhIHNwZWNpZmljIGVsZW1lbnQKICAgKi8KICBzdGF0aWMgZ2V0Q3Vyc29yUG9zaXRpb25JbkVsZW1lbnQoZWxlbWVudDQsIC4uLnNoYWRvd1Jvb3RzKSB7CiAgICBjb25zdCBzZWxlY3Rpb25JbmZvID0gc2hhZG93Um9vdHMubGVuZ3RoID4gMCA/IHRoaXMuZ2V0U2VsZWN0aW9uSW5mbyguLi5zaGFkb3dSb290cykgOiB0aGlzLmdldFNlbGVjdGlvbkluZm8oKTsKICAgIGlmICghc2VsZWN0aW9uSW5mbyB8fCAhc2VsZWN0aW9uSW5mby5jb2xsYXBzZWQpCiAgICAgIHJldHVybiBudWxsOwogICAgdHJ5IHsKICAgICAgY29uc3QgcmFuZ2UyID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgcmFuZ2UyLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50NCk7CiAgICAgIGNvbnN0IGlzQ29udGFpbmVkID0gdGhpcy5jb250YWluc0Fjcm9zc1NoYWRvd0RPTShlbGVtZW50NCwgc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lcik7CiAgICAgIGlmIChpc0NvbnRhaW5lZCkgewogICAgICAgIHJhbmdlMi5zZXRFbmQoc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lciwgc2VsZWN0aW9uSW5mby5zdGFydE9mZnNldCk7CiAgICAgICAgY29uc3QgcG9zaXRpb24zID0gcmFuZ2UyLnRvU3RyaW5nKCkubGVuZ3RoOwogICAgICAgIHJldHVybiBwb3NpdGlvbjM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgdGV4dDkgPSBlbGVtZW50NC50ZXh0Q29udGVudCB8fCAiIjsKICAgICAgICBjb25zdCBzZWxlY3Rpb25UZXh0ID0gc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lci50ZXh0Q29udGVudCB8fCAiIjsKICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydE9mZnNldCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb25JbmZvLnN0YXJ0T2Zmc2V0ID09PSBzZWxlY3Rpb25UZXh0Lmxlbmd0aCkgewogICAgICAgICAgcmV0dXJuIHRleHQ5Lmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgY29uc29sZS53YXJuKCJTZWxlY3Rpb24gY29udGFpbmVyIG5vdCB3aXRoaW4gZWxlbWVudCwgdXNpbmcgdGV4dCBtYXRjaGluZyBmYWxsYmFjayIpOwogICAgICAgIHJldHVybiBzZWxlY3Rpb25JbmZvLnN0YXJ0T2Zmc2V0OwogICAgICB9CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLndhcm4oIkZhaWxlZCB0byBnZXQgY3Vyc29yIHBvc2l0aW9uOiIsIGVycm9yKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQogIC8qKgogICAqIEdldHMgY3Vyc29yIHBvc2l0aW9uIGZyb20gbW91c2UgY29vcmRpbmF0ZXMgd2l0aCBTaGFkb3cgRE9NIHN1cHBvcnQKICAgKi8KICBzdGF0aWMgZ2V0Q3Vyc29yUG9zaXRpb25Gcm9tUG9pbnQoeDQsIHk1LCBjb250YWluZXIsIC4uLnNoYWRvd1Jvb3RzKSB7CiAgICBpZiAoImNhcmV0UG9zaXRpb25Gcm9tUG9pbnQiIGluIGRvY3VtZW50ICYmIGRvY3VtZW50LmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQpIHsKICAgICAgbGV0IGNhcmV0UG9zID0gbnVsbDsKICAgICAgdHJ5IHsKICAgICAgICBjYXJldFBvcyA9IGRvY3VtZW50LmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQoeDQsIHk1LCAuLi5zaGFkb3dSb290cyk7CiAgICAgIH0gY2F0Y2ggKGUxMSkgewogICAgICAgIGNhcmV0UG9zID0gZG9jdW1lbnQuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCh4NCwgeTUpOwogICAgICB9CiAgICAgIGlmIChjYXJldFBvcyAmJiBjb250YWluZXIuY29udGFpbnMoY2FyZXRQb3Mub2Zmc2V0Tm9kZSkpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRPZmZzZXRJbkVsZW1lbnQoY2FyZXRQb3Mub2Zmc2V0Tm9kZSwgY2FyZXRQb3Mub2Zmc2V0LCBjb250YWluZXIpOwogICAgICB9CiAgICB9CiAgICBpZiAoImNhcmV0UmFuZ2VGcm9tUG9pbnQiIGluIGRvY3VtZW50KSB7CiAgICAgIGNvbnN0IHJhbmdlMiA9IGRvY3VtZW50LmNhcmV0UmFuZ2VGcm9tUG9pbnQoeDQsIHk1KTsKICAgICAgaWYgKHJhbmdlMiAmJiBjb250YWluZXIuY29udGFpbnMocmFuZ2UyLnN0YXJ0Q29udGFpbmVyKSkgewogICAgICAgIHJldHVybiB0aGlzLmdldE9mZnNldEluRWxlbWVudChyYW5nZTIuc3RhcnRDb250YWluZXIsIHJhbmdlMi5zdGFydE9mZnNldCwgY29udGFpbmVyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIC8qKgogICAqIEhlbHBlciB0byBnZXQgdGhlIHRvdGFsIGNoYXJhY3RlciBvZmZzZXQgb2YgYSBwb3NpdGlvbiB3aXRoaW4gYW4gZWxlbWVudAogICAqLwogIHN0YXRpYyBnZXRPZmZzZXRJbkVsZW1lbnQobm9kZTIsIG9mZnNldCwgY29udGFpbmVyKSB7CiAgICBsZXQgdG90YWxPZmZzZXQgPSAwOwogICAgbGV0IGZvdW5kID0gZmFsc2U7CiAgICBjb25zdCB3YWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGNvbnRhaW5lciwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIG51bGwpOwogICAgbGV0IHRleHROb2RlOwogICAgd2hpbGUgKHRleHROb2RlID0gd2Fsa2VyLm5leHROb2RlKCkpIHsKICAgICAgaWYgKHRleHROb2RlID09PSBub2RlMikgewogICAgICAgIHRvdGFsT2Zmc2V0ICs9IG9mZnNldDsKICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG90YWxPZmZzZXQgKz0gdGV4dE5vZGUudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZm91bmQgPyB0b3RhbE9mZnNldCA6IDA7CiAgfQogIC8qKgogICAqIFNldHMgY3Vyc29yIHBvc2l0aW9uIGluIGFuIGVsZW1lbnQKICAgKi8KICBzdGF0aWMgc2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQsIHBvc2l0aW9uMykgewogICAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihlbGVtZW50NCwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIG51bGwpOwogICAgbGV0IGN1cnJlbnRQb3NpdGlvbiA9IDA7CiAgICBsZXQgdGFyZ2V0Tm9kZSA9IG51bGw7CiAgICBsZXQgdGFyZ2V0T2Zmc2V0ID0gMDsKICAgIHdoaWxlICh3YWxrZXIubmV4dE5vZGUoKSkgewogICAgICBjb25zdCBub2RlMiA9IHdhbGtlci5jdXJyZW50Tm9kZTsKICAgICAgY29uc3Qgbm9kZUxlbmd0aCA9IG5vZGUyLnRleHRDb250ZW50Py5sZW5ndGggfHwgMDsKICAgICAgaWYgKGN1cnJlbnRQb3NpdGlvbiArIG5vZGVMZW5ndGggPj0gcG9zaXRpb24zKSB7CiAgICAgICAgdGFyZ2V0Tm9kZSA9IG5vZGUyOwogICAgICAgIHRhcmdldE9mZnNldCA9IHBvc2l0aW9uMyAtIGN1cnJlbnRQb3NpdGlvbjsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjdXJyZW50UG9zaXRpb24gKz0gbm9kZUxlbmd0aDsKICAgIH0KICAgIGlmICh0YXJnZXROb2RlKSB7CiAgICAgIGNvbnN0IHJhbmdlMiA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgIHJhbmdlMi5zZXRTdGFydCh0YXJnZXROb2RlLCB0YXJnZXRPZmZzZXQpOwogICAgICByYW5nZTIuY29sbGFwc2UodHJ1ZSk7CiAgICAgIHRoaXMuc2V0U2VsZWN0aW9uRnJvbVJhbmdlKHJhbmdlMik7CiAgICB9CiAgfQogIC8qKgogICAqIENoZWNrIGlmIGEgbm9kZSBpcyBjb250YWluZWQgd2l0aGluIGFuIGVsZW1lbnQgYWNyb3NzIFNoYWRvdyBET00gYm91bmRhcmllcwogICAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgZWxlbWVudC5jb250YWlucygpIGRvZXNuJ3Qgd29yayBhY3Jvc3MgU2hhZG93IERPTQogICAqLwogIHN0YXRpYyBjb250YWluc0Fjcm9zc1NoYWRvd0RPTShjb250YWluZXIsIG5vZGUyKSB7CiAgICBpZiAoIWNvbnRhaW5lciB8fCAhbm9kZTIpCiAgICAgIHJldHVybiBmYWxzZTsKICAgIGxldCBjdXJyZW50ID0gbm9kZTI7CiAgICB3aGlsZSAoY3VycmVudCkgewogICAgICBpZiAoY3VycmVudCA9PT0gY29udGFpbmVyKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnQubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAmJiBjdXJyZW50Lmhvc3QpIHsKICAgICAgICBjb25zdCBzaGFkb3dSb290ID0gY3VycmVudDsKICAgICAgICBpZiAoc2hhZG93Um9vdC5jb250YWlucyhjb250YWluZXIpKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGN1cnJlbnQgPSBzaGFkb3dSb290Lmhvc3Q7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50Tm9kZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvd3lzaXd5Zy5mb3JtYXR0aW5nLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBXeXNpd3lnRm9ybWF0dGluZyA9IGNsYXNzIHsKICBzdGF0aWMgZm9ybWF0QnV0dG9ucyA9IFsKICAgIHsgY29tbWFuZDogImJvbGQiLCBpY29uOiAiQiIsIGxhYmVsOiAiQm9sZCIsIHNob3J0Y3V0OiAiXHUyMzE4QiIgfSwKICAgIHsgY29tbWFuZDogIml0YWxpYyIsIGljb246ICJJIiwgbGFiZWw6ICJJdGFsaWMiLCBzaG9ydGN1dDogIlx1MjMxOEkiIH0sCiAgICB7IGNvbW1hbmQ6ICJ1bmRlcmxpbmUiLCBpY29uOiAiVSIsIGxhYmVsOiAiVW5kZXJsaW5lIiwgc2hvcnRjdXQ6ICJcdTIzMThVIiB9LAogICAgeyBjb21tYW5kOiAic3RyaWtlVGhyb3VnaCIsIGljb246ICJTXHUwMzM2IiwgbGFiZWw6ICJTdHJpa2V0aHJvdWdoIiB9LAogICAgeyBjb21tYW5kOiAiY29kZSIsIGljb246ICJ7IH0iLCBsYWJlbDogIklubGluZSBDb2RlIiB9LAogICAgeyBjb21tYW5kOiAibGluayIsIGljb246ICJcdXsxRjUxN30iLCBsYWJlbDogIkxpbmsiLCBzaG9ydGN1dDogIlx1MjMxOEsiIH0KICBdOwogIHN0YXRpYyByZW5kZXJGb3JtYXR0aW5nTWVudShwb3NpdGlvbjMsIG9uRm9ybWF0KSB7CiAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgCiAgICAgICAgY2xhc3M9ImZvcm1hdHRpbmctbWVudSIgCiAgICAgICAgc3R5bGU9InRvcDogJHtwb3NpdGlvbjMueX1weDsgbGVmdDogJHtwb3NpdGlvbjMueH1weDsiCiAgICAgICAgQG1vdXNlZG93bj0iJHsoZTExKSA9PiB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICB9fSIKICAgICAgICBAY2xpY2s9IiR7KGUxMSkgPT4gZTExLnN0b3BQcm9wYWdhdGlvbigpfSIKICAgICAgPgogICAgICAgICR7dGhpcy5mb3JtYXRCdXR0b25zLm1hcCgoYnV0dG9uKSA9PiBiMmAKICAgICAgICAgIDxidXR0b24gCiAgICAgICAgICAgIGNsYXNzPSJmb3JtYXQtYnV0dG9uICR7YnV0dG9uLmNvbW1hbmR9IgogICAgICAgICAgICBAY2xpY2s9IiR7KCkgPT4gb25Gb3JtYXQoYnV0dG9uLmNvbW1hbmQpfSIKICAgICAgICAgICAgdGl0bGU9IiR7YnV0dG9uLmxhYmVsfSR7YnV0dG9uLnNob3J0Y3V0ID8gYCAoJHtidXR0b24uc2hvcnRjdXR9KWAgOiAiIn0iCiAgICAgICAgICA+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSIke2J1dHRvbi5jb21tYW5kID09PSAiY29kZSIgPyAiY29kZS1pY29uIiA6ICIifSI+JHtidXR0b24uaWNvbn08L3NwYW4+CiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICBgKX0KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICBzdGF0aWMgYXBwbHlGb3JtYXQoY29tbWFuZCwgdmFsdWUyLCByYW5nZTIsIHNoYWRvd1Jvb3RzKSB7CiAgICBsZXQgd29ya2luZ1JhbmdlOwogICAgaWYgKHJhbmdlMikgewogICAgICB3b3JraW5nUmFuZ2UgPSByYW5nZTI7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgd29ya2luZ1JhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7CiAgICB9CiAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKICAgICAgY2FzZSAiYm9sZCI6CiAgICAgICAgdGhpcy53cmFwU2VsZWN0aW9uKHdvcmtpbmdSYW5nZSwgInN0cm9uZyIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJpdGFsaWMiOgogICAgICAgIHRoaXMud3JhcFNlbGVjdGlvbih3b3JraW5nUmFuZ2UsICJlbSIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJ1bmRlcmxpbmUiOgogICAgICAgIHRoaXMud3JhcFNlbGVjdGlvbih3b3JraW5nUmFuZ2UsICJ1Iik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInN0cmlrZVRocm91Z2giOgogICAgICAgIHRoaXMud3JhcFNlbGVjdGlvbih3b3JraW5nUmFuZ2UsICJzIik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImNvZGUiOgogICAgICAgIHRoaXMud3JhcFNlbGVjdGlvbih3b3JraW5nUmFuZ2UsICJjb2RlIik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImxpbmsiOgogICAgICAgIGlmICghdmFsdWUyKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHRoaXMud3JhcFNlbGVjdGlvbldpdGhMaW5rKHdvcmtpbmdSYW5nZSwgdmFsdWUyKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChzaGFkb3dSb290cyAmJiBzaGFkb3dSb290cy5sZW5ndGggPiAwKSB7CiAgICAgIFd5c2l3eWdTZWxlY3Rpb24uc2V0U2VsZWN0aW9uRnJvbVJhbmdlKHdvcmtpbmdSYW5nZSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgIGlmIChzZWxlY3Rpb24pIHsKICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHdvcmtpbmdSYW5nZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBzdGF0aWMgd3JhcFNlbGVjdGlvbihyYW5nZTIsIHRhZ05hbWUpIHsKICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgIGlmICghc2VsZWN0aW9uKQogICAgICByZXR1cm47CiAgICBjb25zdCBoYXNGb3JtYXR0aW5nID0gdGhpcy5zZWxlY3Rpb25Db250YWluc1RhZyhyYW5nZTIsIHRhZ05hbWUpOwogICAgaWYgKGhhc0Zvcm1hdHRpbmcpIHsKICAgICAgdGhpcy5yZW1vdmVUYWdGcm9tU2VsZWN0aW9uKHJhbmdlMiwgdGFnTmFtZSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBjb250ZW50cyA9IHJhbmdlMi5leHRyYWN0Q29udGVudHMoKTsKICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGNvbnRlbnRzKTsKICAgICAgICByYW5nZTIuaW5zZXJ0Tm9kZSh3cmFwcGVyKTsKICAgICAgICByYW5nZTIuc2VsZWN0Tm9kZUNvbnRlbnRzKHdyYXBwZXIpOwogICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UyKTsKICAgICAgfSBjYXRjaCAoZTExKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHdyYXAgc2VsZWN0aW9uOiIsIGUxMSk7CiAgICAgIH0KICAgIH0KICB9CiAgLyoqCiAgICogQ2hlY2sgaWYgdGhlIHNlbGVjdGlvbiBjb250YWlucyBvciBpcyB3aXRoaW4gYW55IGluc3RhbmNlcyBvZiBhIHRhZwogICAqLwogIHN0YXRpYyBzZWxlY3Rpb25Db250YWluc1RhZyhyYW5nZTIsIHRhZ05hbWUpIHsKICAgIGxldCBub2RlMiA9IHJhbmdlMi5zdGFydENvbnRhaW5lcjsKICAgIHdoaWxlIChub2RlMiAmJiBub2RlMiAhPT0gcmFuZ2UyLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLm93bmVyRG9jdW1lbnQpIHsKICAgICAgaWYgKG5vZGUyLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgIGNvbnN0IGVsZW1lbnQ0ID0gbm9kZTI7CiAgICAgICAgaWYgKGVsZW1lbnQ0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnTmFtZSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIG5vZGUyID0gbm9kZTIucGFyZW50Tm9kZTsKICAgIH0KICAgIG5vZGUyID0gcmFuZ2UyLmVuZENvbnRhaW5lcjsKICAgIHdoaWxlIChub2RlMiAmJiBub2RlMiAhPT0gcmFuZ2UyLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLm93bmVyRG9jdW1lbnQpIHsKICAgICAgaWYgKG5vZGUyLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgIGNvbnN0IGVsZW1lbnQ0ID0gbm9kZTI7CiAgICAgICAgaWYgKGVsZW1lbnQ0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnTmFtZSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIG5vZGUyID0gbm9kZTIucGFyZW50Tm9kZTsKICAgIH0KICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIGNvbnN0IGNvbnRlbnRzID0gcmFuZ2UyLmNsb25lQ29udGVudHMoKTsKICAgIHRlbXBEaXYuYXBwZW5kQ2hpbGQoY29udGVudHMpOwogICAgY29uc3QgdGFncyA9IHRlbXBEaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7CiAgICByZXR1cm4gdGFncy5sZW5ndGggPiAwOwogIH0KICAvKioKICAgKiBSZW1vdmUgYWxsIGluc3RhbmNlcyBvZiBhIHRhZyBmcm9tIHRoZSBzZWxlY3Rpb24KICAgKi8KICBzdGF0aWMgcmVtb3ZlVGFnRnJvbVNlbGVjdGlvbihyYW5nZTIsIHRhZ05hbWUpIHsKICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgIGlmICghc2VsZWN0aW9uKQogICAgICByZXR1cm47CiAgICBsZXQgZXhwYW5kZWRSYW5nZSA9IHJhbmdlMi5jbG9uZVJhbmdlKCk7CiAgICBsZXQgc3RhcnROb2RlID0gcmFuZ2UyLnN0YXJ0Q29udGFpbmVyOwogICAgbGV0IHN0YXJ0VGFnID0gbnVsbDsKICAgIHdoaWxlIChzdGFydE5vZGUgJiYgc3RhcnROb2RlICE9PSByYW5nZTIuY29tbW9uQW5jZXN0b3JDb250YWluZXIub3duZXJEb2N1bWVudCkgewogICAgICBpZiAoc3RhcnROb2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBzdGFydE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YWdOYW1lKSB7CiAgICAgICAgc3RhcnRUYWcgPSBzdGFydE5vZGU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgc3RhcnROb2RlID0gc3RhcnROb2RlLnBhcmVudE5vZGU7CiAgICB9CiAgICBsZXQgZW5kTm9kZSA9IHJhbmdlMi5lbmRDb250YWluZXI7CiAgICBsZXQgZW5kVGFnID0gbnVsbDsKICAgIHdoaWxlIChlbmROb2RlICYmIGVuZE5vZGUgIT09IHJhbmdlMi5jb21tb25BbmNlc3RvckNvbnRhaW5lci5vd25lckRvY3VtZW50KSB7CiAgICAgIGlmIChlbmROb2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBlbmROb2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnTmFtZSkgewogICAgICAgIGVuZFRhZyA9IGVuZE5vZGU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZW5kTm9kZSA9IGVuZE5vZGUucGFyZW50Tm9kZTsKICAgIH0KICAgIGlmIChzdGFydFRhZykgewogICAgICBleHBhbmRlZFJhbmdlLnNldFN0YXJ0QmVmb3JlKHN0YXJ0VGFnKTsKICAgIH0KICAgIGlmIChlbmRUYWcpIHsKICAgICAgZXhwYW5kZWRSYW5nZS5zZXRFbmRBZnRlcihlbmRUYWcpOwogICAgfQogICAgY29uc3QgZnJhZ21lbnQgPSBleHBhbmRlZFJhbmdlLmV4dHJhY3RDb250ZW50cygpOwogICAgY29uc3QgcHJvY2Vzc2VkRnJhZ21lbnQgPSB0aGlzLnJlbW92ZVRhZ3NGcm9tRnJhZ21lbnQoZnJhZ21lbnQsIHRhZ05hbWUpOwogICAgZXhwYW5kZWRSYW5nZS5pbnNlcnROb2RlKHByb2Nlc3NlZEZyYWdtZW50KTsKICAgIGNvbnN0IHRleHROb2RlcyA9IFtdOwogICAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihwcm9jZXNzZWRGcmFnbWVudCwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIG51bGwpOwogICAgbGV0IG5vZGUyOwogICAgd2hpbGUgKG5vZGUyID0gd2Fsa2VyLm5leHROb2RlKCkpIHsKICAgICAgdGV4dE5vZGVzLnB1c2gobm9kZTIpOwogICAgfQogICAgaWYgKHRleHROb2Rlcy5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IG5ld1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgbmV3UmFuZ2Uuc2V0U3RhcnQodGV4dE5vZGVzWzBdLCAwKTsKICAgICAgbmV3UmFuZ2Uuc2V0RW5kKHRleHROb2Rlc1t0ZXh0Tm9kZXMubGVuZ3RoIC0gMV0sIHRleHROb2Rlc1t0ZXh0Tm9kZXMubGVuZ3RoIC0gMV0udGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwKTsKICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UobmV3UmFuZ2UpOwogICAgfQogIH0KICAvKioKICAgKiBSZW1vdmUgYWxsIGluc3RhbmNlcyBvZiBhIHRhZyBmcm9tIGEgZG9jdW1lbnQgZnJhZ21lbnQKICAgKi8KICBzdGF0aWMgcmVtb3ZlVGFnc0Zyb21GcmFnbWVudChmcmFnbWVudCwgdGFnTmFtZSkgewogICAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgdGVtcERpdi5hcHBlbmRDaGlsZChmcmFnbWVudCk7CiAgICBjb25zdCB0YWdzID0gdGVtcERpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsKICAgIGNvbnN0IHRhZ0FycmF5ID0gQXJyYXkuZnJvbSh0YWdzKTsKICAgIHRhZ0FycmF5LmZvckVhY2goKHRhZykgPT4gewogICAgICBjb25zdCBwYXJlbnQgPSB0YWcucGFyZW50Tm9kZTsKICAgICAgaWYgKHBhcmVudCkgewogICAgICAgIHdoaWxlICh0YWcuZmlyc3RDaGlsZCkgewogICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0YWcuZmlyc3RDaGlsZCwgdGFnKTsKICAgICAgICB9CiAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKHRhZyk7CiAgICAgIH0KICAgIH0pOwogICAgY29uc3QgbmV3RnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CiAgICB3aGlsZSAodGVtcERpdi5maXJzdENoaWxkKSB7CiAgICAgIG5ld0ZyYWdtZW50LmFwcGVuZENoaWxkKHRlbXBEaXYuZmlyc3RDaGlsZCk7CiAgICB9CiAgICByZXR1cm4gbmV3RnJhZ21lbnQ7CiAgfQogIHN0YXRpYyB3cmFwU2VsZWN0aW9uV2l0aExpbmsocmFuZ2UyLCB1cmwpIHsKICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgIGlmICghc2VsZWN0aW9uKQogICAgICByZXR1cm47CiAgICBpZiAodGhpcy5zZWxlY3Rpb25Db250YWluc1RhZyhyYW5nZTIsICJhIikpIHsKICAgICAgdGhpcy5yZW1vdmVUYWdGcm9tU2VsZWN0aW9uKHJhbmdlMiwgImEiKTsKICAgICAgaWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkgewogICAgICAgIHJhbmdlMiA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgICB9CiAgICB9CiAgICBjb25zdCBsaW5rMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKICAgIGxpbmszLmhyZWYgPSB1cmw7CiAgICBsaW5rMy50YXJnZXQgPSAiX2JsYW5rIjsKICAgIGxpbmszLnJlbCA9ICJub29wZW5lciBub3JlZmVycmVyIjsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGNvbnRlbnRzID0gcmFuZ2UyLmV4dHJhY3RDb250ZW50cygpOwogICAgICBsaW5rMy5hcHBlbmRDaGlsZChjb250ZW50cyk7CiAgICAgIHJhbmdlMi5pbnNlcnROb2RlKGxpbmszKTsKICAgICAgcmFuZ2UyLnNlbGVjdE5vZGVDb250ZW50cyhsaW5rMyk7CiAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlMik7CiAgICB9IGNhdGNoIChlMTEpIHsKICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBsaW5rOiIsIGUxMSk7CiAgICB9CiAgfQogIHN0YXRpYyBnZXRTZWxlY3Rpb25Db29yZGluYXRlcyguLi5zaGFkb3dSb290cykgewogICAgY29uc3Qgc2VsZWN0aW9uSW5mbyA9IFd5c2l3eWdTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uSW5mbyguLi5zaGFkb3dSb290cyk7CiAgICBjb25zb2xlLmxvZygiZ2V0U2VsZWN0aW9uQ29vcmRpbmF0ZXMgLSBzZWxlY3Rpb25JbmZvOiIsIHNlbGVjdGlvbkluZm8pOwogICAgaWYgKCFzZWxlY3Rpb25JbmZvKSB7CiAgICAgIGNvbnNvbGUubG9nKCJObyBzZWxlY3Rpb24gaW5mbyBhdmFpbGFibGUiKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCByYW5nZTIgPSBXeXNpd3lnU2VsZWN0aW9uLmNyZWF0ZVJhbmdlRnJvbUluZm8oc2VsZWN0aW9uSW5mbyk7CiAgICBjb25zdCByZWN0ID0gcmFuZ2UyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgY29uc29sZS5sb2coIlJhbmdlIHJlY3Q6IiwgcmVjdCk7CiAgICBpZiAocmVjdC53aWR0aCA9PT0gMCAmJiByZWN0LmhlaWdodCA9PT0gMCkgewogICAgICBjb25zb2xlLmxvZygiUmVjdCB3aWR0aCBhbmQgaGVpZ2h0IGFyZSAwLCB0cnlpbmcgZGlmZmVyZW50IGFwcHJvYWNoIik7CiAgICAgIGlmICgiY2FyZXRQb3NpdGlvbkZyb21Qb2ludCIgaW4gZG9jdW1lbnQpIHsKICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHsKICAgICAgICAgIGNvbnN0IHJhbmdlMyA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgICAgICAgY29uc3QgdGVtcFNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgICAgICB0ZW1wU3Bhbi50ZXh0Q29udGVudCA9ICJcdTIwMEIiOwogICAgICAgICAgcmFuZ2UzLmluc2VydE5vZGUodGVtcFNwYW4pOwogICAgICAgICAgY29uc3Qgc3BhblJlY3QgPSB0ZW1wU3Bhbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgIHRlbXBTcGFuLnJlbW92ZSgpOwogICAgICAgICAgaWYgKHNwYW5SZWN0LndpZHRoID4gMCB8fCBzcGFuUmVjdC5oZWlnaHQgPiAwKSB7CiAgICAgICAgICAgIGNvbnN0IGNvb3JkczIgPSB7CiAgICAgICAgICAgICAgeDogc3BhblJlY3QubGVmdCwKICAgICAgICAgICAgICB5OiBNYXRoLm1heCg0NSwgc3BhblJlY3QudG9wIC0gNDUpCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJVc2VkIHNwYW4gdHJpY2sgZm9yIGNvb3JkczoiLCBjb29yZHMyKTsKICAgICAgICAgICAgcmV0dXJuIGNvb3JkczI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgY29vcmRzID0gewogICAgICB4OiByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gMiwKICAgICAgeTogTWF0aC5tYXgoNDUsIHJlY3QudG9wIC0gNDUpCiAgICAgIC8vIFBvc2l0aW9uIGFib3ZlIHNlbGVjdGlvbiwgYnV0IGVuc3VyZSBpdCdzIG5vdCBuZWdhdGl2ZQogICAgfTsKICAgIGNvbnNvbGUubG9nKCJSZXR1cm5pbmcgY29vcmRzOiIsIGNvb3Jkcyk7CiAgICByZXR1cm4gY29vcmRzOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvZGVlcy1mb3JtYXR0aW5nLW1lbnUuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlMzUgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczM2ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzRm9ybWF0dGluZ01lbnUgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtZm9ybWF0dGluZy1tZW51IildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfdmlzaWJsZV9kZWNvcmF0b3JzOwogIGxldCBfdmlzaWJsZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Zpc2libGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Bvc2l0aW9uX2RlY29yYXRvcnM7CiAgbGV0IF9wb3NpdGlvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Bvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tZW51WkluZGV4X2RlY29yYXRvcnM7CiAgbGV0IF9tZW51WkluZGV4X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWVudVpJbmRleF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzRm9ybWF0dGluZ01lbnUyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfdmlzaWJsZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfcG9zaXRpb25fZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX21lbnVaSW5kZXhfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlMzUodGhpcywgbnVsbCwgX3Zpc2libGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidmlzaWJsZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmlzaWJsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai52aXNpYmxlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai52aXNpYmxlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Zpc2libGVfaW5pdGlhbGl6ZXJzLCBfdmlzaWJsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM1KHRoaXMsIG51bGwsIF9wb3NpdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwb3NpdGlvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicG9zaXRpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucG9zaXRpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnBvc2l0aW9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Bvc2l0aW9uX2luaXRpYWxpemVycywgX3Bvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzUodGhpcywgbnVsbCwgX21lbnVaSW5kZXhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWVudVpJbmRleCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWVudVpJbmRleCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tZW51WkluZGV4LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tZW51WkluZGV4ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21lbnVaSW5kZXhfaW5pdGlhbGl6ZXJzLCBfbWVudVpJbmRleF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM1KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0Zvcm1hdHRpbmdNZW51MiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgaW5zdGFuY2U7CiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7CiAgICAgIGlmICghRGVlc0Zvcm1hdHRpbmdNZW51Mi5pbnN0YW5jZSkgewogICAgICAgIERlZXNGb3JtYXR0aW5nTWVudTIuaW5zdGFuY2UgPSBuZXcgRGVlc0Zvcm1hdHRpbmdNZW51MigpOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRGVlc0Zvcm1hdHRpbmdNZW51Mi5pbnN0YW5jZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIERlZXNGb3JtYXR0aW5nTWVudTIuaW5zdGFuY2U7CiAgICB9CiAgICAjdmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMzNih0aGlzLCBfdmlzaWJsZV9pbml0aWFsaXplcnMsIGZhbHNlKTsKICAgIGdldCB2aXNpYmxlKCkgewogICAgICByZXR1cm4gdGhpcy4jdmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZpc2libGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Zpc2libGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNwb3NpdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzYodGhpcywgX3Zpc2libGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM2KHRoaXMsIF9wb3NpdGlvbl9pbml0aWFsaXplcnMsIHsgeDogMCwgeTogMCB9KSk7CiAgICBnZXQgcG9zaXRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNwb3NpdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHBvc2l0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNwb3NpdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21lbnVaSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM2KHRoaXMsIF9wb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzYodGhpcywgX21lbnVaSW5kZXhfaW5pdGlhbGl6ZXJzLCAxZTMpKTsKICAgIGdldCBtZW51WkluZGV4KCkgewogICAgICByZXR1cm4gdGhpcy4jbWVudVpJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1lbnVaSW5kZXgodmFsdWUyKSB7CiAgICAgIHRoaXMuI21lbnVaSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGNhbGxiYWNrID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzYodGhpcywgX21lbnVaSW5kZXhfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAwOwogICAgICAgIGhlaWdodDogMDsKICAgICAgfQoKICAgICAgLmZvcm1hdHRpbmctbWVudSB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMyNjI2MjYiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlMGUwZTAiLCAiIzQwNDA0MCIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgYm94LXNoYWRvdzogMCAycHggMTZweCByZ2JhKDAsIDAsIDAsIDAuMTUpOwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogMnB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGFuaW1hdGlvbjogZmFkZUluU2NhbGUgMC4xNXMgZWFzZS1vdXQ7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgZmFkZUluU2NhbGUgewogICAgICAgIGZyb20gewogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NSkgdHJhbnNsYXRlWSg1cHgpOwogICAgICAgIH0KICAgICAgICB0byB7CiAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGVZKDApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLmZvcm1hdC1idXR0b24gewogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwIiwgIiNlMGUwZTAiKX07CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuZm9ybWF0LWJ1dHRvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmMGYwZjAiLCAiIzMzMzMzMyIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDY2Y2MiLCAiIzRkOTRmZiIpfTsKICAgICAgfQoKICAgICAgLmZvcm1hdC1idXR0b246YWN0aXZlIHsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTUpOwogICAgICB9CgogICAgICAuZm9ybWF0LWJ1dHRvbi5ib2xkIHsKICAgICAgICBmb250LXdlaWdodDogNzAwOwogICAgICB9CgogICAgICAuZm9ybWF0LWJ1dHRvbi5pdGFsaWMgewogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQoKICAgICAgLmZvcm1hdC1idXR0b24udW5kZXJsaW5lIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQoKICAgICAgLmZvcm1hdC1idXR0b24gLmNvZGUtaWNvbiB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdTRiBNb25vJywgJ01vbmFjbycsICdJbmNvbnNvbGF0YScsICdGaXJhIENvZGUnLCBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICBpZiAoIXRoaXMudmlzaWJsZSkKICAgICAgICByZXR1cm4gYjJgYDsKICAgICAgdGhpcy5zdHlsZS56SW5kZXggPSB0aGlzLm1lbnVaSW5kZXgudG9TdHJpbmcoKTsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IAogICAgICAgIGNsYXNzPSJmb3JtYXR0aW5nLW1lbnUiIAogICAgICAgIHN0eWxlPSJsZWZ0OiAke3RoaXMucG9zaXRpb24ueH1weDsgdG9wOiAke3RoaXMucG9zaXRpb24ueX1weDsiCiAgICAgICAgdGFiaW5kZXg9Ii0xIgogICAgICAgIGRhdGEtbWVudS10eXBlPSJmb3JtYXR0aW5nIgogICAgICA+CiAgICAgICAgJHtXeXNpd3lnRm9ybWF0dGluZy5mb3JtYXRCdXR0b25zLm1hcCgoYnV0dG9uKSA9PiBiMmAKICAgICAgICAgIDxidXR0b24gCiAgICAgICAgICAgIGNsYXNzPSJmb3JtYXQtYnV0dG9uICR7YnV0dG9uLmNvbW1hbmR9IgogICAgICAgICAgICBkYXRhLWNvbW1hbmQ9IiR7YnV0dG9uLmNvbW1hbmR9IgogICAgICAgICAgICB0aXRsZT0iJHtidXR0b24ubGFiZWx9JHtidXR0b24uc2hvcnRjdXQgPyBgICgke2J1dHRvbi5zaG9ydGN1dH0pYCA6ICIifSIKICAgICAgICAgID4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IiR7YnV0dG9uLmNvbW1hbmQgPT09ICJjb2RlIiA/ICJjb2RlLWljb24iIDogIiJ9Ij4ke2J1dHRvbi5pY29ufTwvc3Bhbj4KICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgIGApfQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhcHBseUZvcm1hdChjb21tYW5kKSB7CiAgICAgIGlmICh0aGlzLmNhbGxiYWNrKSB7CiAgICAgICAgdGhpcy5jYWxsYmFjayhjb21tYW5kKTsKICAgICAgfQogICAgICBpZiAoY29tbWFuZCA9PT0gImxpbmsiKSB7CiAgICAgICAgdGhpcy5oaWRlKCk7CiAgICAgIH0KICAgIH0KICAgIHNob3cocG9zaXRpb24zLCBjYWxsYmFjaykgewogICAgICBjb25zb2xlLmxvZygiRm9ybWF0dGluZ01lbnUuc2hvdyBjYWxsZWQ6IiwgeyBwb3NpdGlvbjogcG9zaXRpb24zLCB2aXNpYmxlOiB0aGlzLnZpc2libGUgfSk7CiAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjM7CiAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgdGhpcy5tZW51WkluZGV4ID0gekluZGV4UmVnaXN0cnkuZ2V0TmV4dFpJbmRleCgpOwogICAgICB6SW5kZXhSZWdpc3RyeS5yZWdpc3Rlcih0aGlzLCB0aGlzLm1lbnVaSW5kZXgpOwogICAgICB0aGlzLnN0eWxlLnpJbmRleCA9IHRoaXMubWVudVpJbmRleC50b1N0cmluZygpOwogICAgICB0aGlzLnZpc2libGUgPSB0cnVlOwogICAgfQogICAgaGlkZSgpIHsKICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7CiAgICAgIHRoaXMuY2FsbGJhY2sgPSBudWxsOwogICAgICB6SW5kZXhSZWdpc3RyeS51bnJlZ2lzdGVyKHRoaXMpOwogICAgfQogICAgdXBkYXRlUG9zaXRpb24ocG9zaXRpb24zKSB7CiAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjM7CiAgICB9CiAgICBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIHRoaXMuc2hhZG93Um9vdD8uYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwgKGUxMSkgPT4gewogICAgICAgIGNvbnN0IG1lbnUgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5mb3JtYXR0aW5nLW1lbnUiKTsKICAgICAgICBpZiAobWVudSAmJiBtZW51LmNvbnRhaW5zKGUxMS50YXJnZXQpKSB7CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLnNoYWRvd1Jvb3Q/LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUxMSkgPT4gewogICAgICAgIGNvbnN0IHRhcmdldCA9IGUxMS50YXJnZXQ7CiAgICAgICAgY29uc3QgYnV0dG9uID0gdGFyZ2V0LmNsb3Nlc3QoIi5mb3JtYXQtYnV0dG9uIik7CiAgICAgICAgaWYgKGJ1dHRvbikgewogICAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICBjb25zdCBjb21tYW5kID0gYnV0dG9uLmdldEF0dHJpYnV0ZSgiZGF0YS1jb21tYW5kIik7CiAgICAgICAgICBpZiAoY29tbWFuZCkgewogICAgICAgICAgICB0aGlzLmFwcGx5Rm9ybWF0KGNvbW1hbmQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMuc2hhZG93Um9vdD8uYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLCAoZTExKSA9PiB7CiAgICAgICAgY29uc3QgbWVudSA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmZvcm1hdHRpbmctbWVudSIpOwogICAgICAgIGlmIChtZW51ICYmIG1lbnUuY29udGFpbnMoZTExLnRhcmdldCkpIHsKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIH0KICAgICAgfSwgdHJ1ZSk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczM2KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzRm9ybWF0dGluZ01lbnUyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvd3lzaXd5Zy5pbnRlcmZhY2VzLmpzCmluaXRfZGlzdF90czMwKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL3d5c2l3eWcuY29uc3RhbnRzLmpzCnZhciBQUk9HUkFNTUlOR19MQU5HVUFHRVMgPSBbCiAgIkphdmFTY3JpcHQiLAogICJUeXBlU2NyaXB0IiwKICAiUHl0aG9uIiwKICAiSmF2YSIsCiAgIkMrKyIsCiAgIkMjIiwKICAiR28iLAogICJSdXN0IiwKICAiSFRNTCIsCiAgIkNTUyIsCiAgIlNRTCIsCiAgIlNoZWxsIiwKICAiSlNPTiIsCiAgIllBTUwiLAogICJNYXJrZG93biIsCiAgIlBsYWluIFRleHQiCl07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL3d5c2l3eWcuc3R5bGVzLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciB3eXNpd3lnU3R5bGVzID0gaWAKICA6aG9zdCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB9CgogIC53eXNpd3lnLWNvbnRhaW5lciB7CiAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMDkwOTBiIil9OwogICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDIwMHB4OwogICAgcGFkZGluZzogMjRweDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICB9CgogIC53eXNpd3lnLWNvbnRhaW5lcjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDFkNWRiIiwgIiMzZjNmNDYiKX07CiAgfQoKICAud3lzaXd5Zy1jb250YWluZXI6Zm9jdXMtd2l0aGluIHsKICAgIG91dGxpbmU6IDJweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmNGY0ZjUiLCAiIzE4MTgxYiIpfSwgMCAwIDAgNHB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDU5LCAxMzAsIDI0NiwgMC41KSIsICJyZ2JhKDU5LCAxMzAsIDI0NiwgMC41KSIpfTsKICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICB9CgogIC8qIFZpc3VhbCBoaW50IGZvciB0ZXh0IHNlbGVjdGlvbiAqLwogIC5lZGl0b3ItY29udGVudDpob3ZlciB7CiAgICBjdXJzb3I6IHRleHQ7CiAgfQoKICAuZWRpdG9yLWNvbnRlbnQgewogICAgb3V0bGluZTogbm9uZTsKICAgIG1pbi1oZWlnaHQ6IDE2MHB4OwogICAgbWFyZ2luOiAwIC04cHg7CiAgICBwYWRkaW5nOiAwIDhweDsKICB9CgogIC5ibG9jayB7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiA0cHggMDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgbWluLWhlaWdodDogMS42ZW07CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICB9CgogIC8qIEZpcnN0IGFuZCBsYXN0IGJsb2NrcyBkb24ndCBuZWVkIGV4dHJhIHNwYWNpbmcgKi8KICAuYmxvY2std3JhcHBlcjpmaXJzdC1jaGlsZCAuYmxvY2sgewogICAgbWFyZ2luLXRvcDogMCAhaW1wb3J0YW50OwogIH0KCiAgLmJsb2NrLXdyYXBwZXI6bGFzdC1jaGlsZCAuYmxvY2sgewogICAgbWFyZ2luLWJvdHRvbTogMDsKICB9CgogIC5ibG9jay5zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSg1OSwgMTMwLCAyNDYsIDAuMDUpIiwgInJnYmEoNTksIDEzMCwgMjQ2LCAwLjA1KSIpfTsKICAgIG91dGxpbmU6IDJweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSg1OSwgMTMwLCAyNDYsIDAuMikiLCAicmdiYSg1OSwgMTMwLCAyNDYsIDAuMikiKX07CiAgICBvdXRsaW5lLW9mZnNldDogLTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIG1hcmdpbi1sZWZ0OiAtOHB4OwogICAgbWFyZ2luLXJpZ2h0OiAtOHB4OwogICAgcGFkZGluZy1sZWZ0OiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7CiAgfQoKICAuYmxvY2tbY29udGVudGVkaXRhYmxlXSB7CiAgICBvdXRsaW5lOiBub25lOwogIH0KCiAgLmJsb2NrLnBhcmFncmFwaCB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMS42OwogICAgZm9udC13ZWlnaHQ6IDQwMDsKICB9CgogIC5ibG9jay5wYXJhZ3JhcGg6ZW1wdHk6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiVHlwZSAnLycgZm9yIGNvbW1hbmRzLi4uIjsKICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjNzE3MTdhIil9OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMS42OwogICAgZm9udC13ZWlnaHQ6IDQwMDsKICB9CgogIC5ibG9jay5oZWFkaW5nLTEgewogICAgZm9udC1zaXplOiAzMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICB9CgogIC5ibG9jay5oZWFkaW5nLTE6ZW1wdHk6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiSGVhZGluZyAxIjsKICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjNzE3MTdhIil9OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBmb250LXNpemU6IDMycHg7CiAgICBsaW5lLWhlaWdodDogMS4yOwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICB9CgogIC5ibG9jay5oZWFkaW5nLTIgewogICAgZm9udC1zaXplOiAyNHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM7CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICB9CgogIC5ibG9jay5oZWFkaW5nLTI6ZW1wdHk6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiSGVhZGluZyAyIjsKICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjNzE3MTdhIil9OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBmb250LXNpemU6IDI0cHg7CiAgICBsaW5lLWhlaWdodDogMS4zOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICB9CgogIC5ibG9jay5oZWFkaW5nLTMgewogICAgZm9udC1zaXplOiAyMHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICB9CgogIC5ibG9jay5oZWFkaW5nLTM6ZW1wdHk6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiSGVhZGluZyAzIjsKICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjNzE3MTdhIil9OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBmb250LXNpemU6IDIwcHg7CiAgICBsaW5lLWhlaWdodDogMS40OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICB9CgogIC5ibG9jay5xdW90ZSB7CiAgICBib3JkZXItbGVmdDogMnB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgbWFyZ2luLXJpZ2h0OiAwOwogICAgbGluZS1oZWlnaHQ6IDEuNjsKICB9CgogIC5ibG9jay5xdW90ZTplbXB0eTo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJRdW90ZSI7CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiIzcxNzE3YSIpfTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDEuNjsKICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgfQoKICAuY29kZS1ibG9jay1jb250YWluZXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgbWFyZ2luOiAyMHB4IDA7CiAgfQoKICAuY29kZS1sYW5ndWFnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICByaWdodDogMDsKICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjRmNGY1IiwgIiMyNzI3MmEiKX07CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgIHBhZGRpbmc6IDRweCAxMnB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogMCA0cHggMCA0cHg7CiAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBSb2JvdG8sIHNhbnMtc2VyaWY7CiAgICB0ZXh0LXRyYW5zZm9ybTogbG93ZXJjYXNlOwogICAgei1pbmRleDogMTsKICB9CgogIC5ibG9jay5jb2RlIHsKICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjRmNGY1IiwgIiMxODE4MWIiKX07CiAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTZweDsKICAgIHBhZGRpbmctdG9wOiAzMnB4OyAvKiBNYWtlIHJvb20gZm9yIGxhbmd1YWdlIGluZGljYXRvciAqLwogICAgZm9udC1mYW1pbHk6ICdTRiBNb25vJywgJ01vbmFjbycsICdJbmNvbnNvbGF0YScsICdGaXJhIENvZGUnLCBtb25vc3BhY2U7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBsaW5lLWhlaWdodDogMS41OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICBvdmVyZmxvdy14OiBhdXRvOwogIH0KCiAgLmJsb2NrLmNvZGU6ZW1wdHk6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiLy8gQ29kZSBibG9jayI7CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiIzcxNzE3YSIpfTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgZm9udC1mYW1pbHk6ICdTRiBNb25vJywgJ01vbmFjbycsICdJbmNvbnNvbGF0YScsICdGaXJhIENvZGUnLCBtb25vc3BhY2U7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBsaW5lLWhlaWdodDogMS42OwogICAgZm9udC13ZWlnaHQ6IDQwMDsKICB9CgogIC5ibG9jay5saXN0IHsKICAgIHBhZGRpbmctbGVmdDogMDsKICB9CgogIC5ibG9jay5saXN0IHVsLAogIC5ibG9jay5saXN0IG9sIHsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDAgMCAwIDI0cHg7CiAgICBsaXN0LXN0eWxlLXBvc2l0aW9uOiBvdXRzaWRlOwogIH0KCiAgLmJsb2NrLmxpc3QgdWwgewogICAgbGlzdC1zdHlsZTogZGlzYzsKICB9CgogIC5ibG9jay5saXN0IG9sIHsKICAgIGxpc3Qtc3R5bGU6IGRlY2ltYWw7CiAgfQoKICAuYmxvY2subGlzdCBsaSB7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBsaW5lLWhlaWdodDogMS42OwogIH0KCiAgLmJsb2NrLmxpc3QgbGk6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwogIH0KCiAgLmJsb2NrLmRpdmlkZXIgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZzogMjBweCAwOwogICAgY3Vyc29yOiBkZWZhdWx0OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgfQoKICAuYmxvY2suZGl2aWRlciBociB7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgIG1hcmdpbjogMDsKICB9CgogIC5zbGFzaC1tZW51IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMwOTA5MGIiKX07CiAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xKSwgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4wNik7CiAgICBwYWRkaW5nOiA0cHg7CiAgICB6LWluZGV4OiAxMDAwOwogICAgbWluLXdpZHRoOiAyMjBweDsKICAgIG1heC1oZWlnaHQ6IDMwMHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgfQoKICAuc2xhc2gtbWVudS1pdGVtIHsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgZm9udC1zaXplOiAxNHB4OwogIH0KCiAgLnNsYXNoLW1lbnUtaXRlbTpob3ZlciwKICAuc2xhc2gtbWVudS1pdGVtLnNlbGVjdGVkIHsKICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjRmNGY1IiwgIiMyNzI3MmEiKX07CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICB9CgogIC5zbGFzaC1tZW51LWl0ZW0gLmljb24gewogICAgd2lkdGg6IDI0cHg7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiNhMWExYWEiKX07CiAgICBmb250LXdlaWdodDogNjAwOwogIH0KCiAgLnNsYXNoLW1lbnUtaXRlbTpob3ZlciAuaWNvbiwKICAuc2xhc2gtbWVudS1pdGVtLnNlbGVjdGVkIC5pY29uIHsKICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjM2I4MmY2Iil9OwogIH0KCiAgLnRvb2xiYXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtNDBweDsKICAgIGxlZnQ6IDA7CiAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMDkwOTBiIil9OwogICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSksIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDYpOwogICAgcGFkZGluZzogNHB4OwogICAgZGlzcGxheTogbm9uZTsKICAgIGdhcDogNHB4OwogICAgei1pbmRleDogMTAwMDsKICB9CgogIC50b29sYmFyLnZpc2libGUgewogICAgZGlzcGxheTogZmxleDsKICB9CgogIC50b29sYmFyLWJ1dHRvbiB7CiAgICB3aWR0aDogMzJweDsKICAgIGhlaWdodDogMzJweDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgfQoKICAudG9vbGJhci1idXR0b246aG92ZXIgewogICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmNGY0ZjUiLCAiIzI3MjcyYSIpfTsKICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjM2I4MmY2Iil9OwogIH0KCiAgLyogRHJhZyBhbmQgRHJvcCBTdHlsZXMgKi8KICAuYmxvY2std3JhcHBlciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcyBlYXNlLCBvcGFjaXR5IDAuMnMgZWFzZTsKICB9CgogIC8qIEVuc3VyZSBwcm9wZXIgc3BhY2luZyBjb250ZXh0IGZvciBibG9ja3MgKi8KICAuYmxvY2std3JhcHBlciArIC5ibG9jay13cmFwcGVyIC5ibG9jayB7CiAgICBtYXJnaW4tdG9wOiAxNnB4OwogIH0KCiAgLyogT3ZlcnJpZGUgZm9yIGhlYWRpbmdzIGZvbGxvd2luZyBvdGhlciBibG9ja3MgKi8KICAuYmxvY2std3JhcHBlciArIC5ibG9jay13cmFwcGVyIC5ibG9jay5oZWFkaW5nLTEsCiAgLmJsb2NrLXdyYXBwZXIgKyAuYmxvY2std3JhcHBlciAuYmxvY2suaGVhZGluZy0yLAogIC5ibG9jay13cmFwcGVyICsgLmJsb2NrLXdyYXBwZXIgLmJsb2NrLmhlYWRpbmctMyB7CiAgICBtYXJnaW4tdG9wOiAyNHB4OwogIH0KCiAgLyogQ29kZSBhbmQgcXVvdGUgYmxvY2tzIG5lZWQgY29uc2lzdGVudCBzcGFjaW5nICovCiAgLmJsb2NrLXdyYXBwZXIgKyAuYmxvY2std3JhcHBlciAuYmxvY2suY29kZSwKICAuYmxvY2std3JhcHBlciArIC5ibG9jay13cmFwcGVyIC5ibG9jay5xdW90ZSB7CiAgICBtYXJnaW4tdG9wOiAyMHB4OwogIH0KCiAgLmRyYWctaGFuZGxlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IC0yOHB4OwogICAgdG9wOiA1MCU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICB3aWR0aDogMjRweDsKICAgIGhlaWdodDogMjRweDsKICAgIGN1cnNvcjogZ3JhYjsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiIzcxNzE3YSIpfTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICB9CgogIC5kcmFnLWhhbmRsZTo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICLii67ii64iOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGV0dGVyLXNwYWNpbmc6IC0ycHg7CiAgfQoKICAuYmxvY2std3JhcHBlcjpob3ZlciAuZHJhZy1oYW5kbGUgewogICAgb3BhY2l0eTogMTsKICB9CgogIC5kcmFnLWhhbmRsZTpob3ZlciB7CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjRmNGY1IiwgIiMyNzI3MmEiKX07CiAgfQoKICAuZHJhZy1oYW5kbGU6YWN0aXZlIHsKICAgIGN1cnNvcjogZ3JhYmJpbmc7CiAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjM2YzZjQ2Iil9OwogIH0KCiAgLmJsb2NrLXdyYXBwZXIuZHJhZ2dpbmcgewogICAgb3BhY2l0eTogMC44OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAyMDAxOwogICAgdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50OwogIH0KCgogIC8qIEJsb2NrcyB0aGF0IHNob3VsZCBtb3ZlIG91dCBvZiB0aGUgd2F5ICovCiAgLmJsb2NrLXdyYXBwZXIubW92ZS1kb3duIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSh2YXIoLS1kcmFnLW9mZnNldCwgMHB4KSk7CiAgfQoKICAuYmxvY2std3JhcHBlci5tb3ZlLXVwIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWShjYWxjKC0xICogdmFyKC0tZHJhZy1vZmZzZXQsIDBweCkpKTsKICB9CgogIC8qIERyb3AgaW5kaWNhdG9yICovCiAgLmRyb3AtaW5kaWNhdG9yIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDU5LCAxMzAsIDI0NiwgMC4wNSkiLCAicmdiYSg1OSwgMTMwLCAyNDYsIDAuMDUpIil9OwogICAgYm9yZGVyOiAycHggZGFzaGVkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiMzYjgyZjYiKX07CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICB0cmFuc2l0aW9uOiB0b3AgMC4ycyBlYXNlLCBoZWlnaHQgMC4ycyBlYXNlOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAxOTk5OwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICB9CgogIC8qIFJlbW92ZSBvbGQgZHJhZy1vdmVyIHN0eWxlcyAqLwogIC5ibG9jay13cmFwcGVyLmRyYWctb3Zlci1iZWZvcmUsCiAgLmJsb2NrLXdyYXBwZXIuZHJhZy1vdmVyLWFmdGVyIHsKICAgIC8qIE5vIGxvbmdlciBuZWVkZWQsIHVzaW5nIGRyb3AgaW5kaWNhdG9yIGluc3RlYWQgKi8KICB9CgogIC5lZGl0b3ItY29udGVudC5kcmFnZ2luZyAqIHsKICAgIHVzZXItc2VsZWN0OiBub25lOwogIH0KCiAgLyogQmxvY2sgU2V0dGluZ3MgQnV0dG9uIC0gUmVtb3ZlZCBpbiBmYXZvciBvZiBjb250ZXh0IG1lbnUgKi8KCiAgLyogVGV4dCBTZWxlY3Rpb24gU3R5bGVzICovCiAgLmJsb2NrIDo6c2VsZWN0aW9uIHsKICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDU5LCAxMzAsIDI0NiwgMC4yKSIsICJyZ2JhKDU5LCAxMzAsIDI0NiwgMC4yKSIpfTsKICAgIGNvbG9yOiBpbmhlcml0OwogIH0KCiAgLyogRm9ybWF0dGluZyBNZW51ICovCiAgLmZvcm1hdHRpbmctbWVudSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMDkwOTBiIil9OwogICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSksIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDYpOwogICAgcGFkZGluZzogNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogMnB4OwogICAgei1pbmRleDogMTAwMTsKICAgIGFuaW1hdGlvbjogZmFkZUluU2NhbGUgMC4xNXMgZWFzZS1vdXQ7CiAgfQoKICBAa2V5ZnJhbWVzIGZhZGVJblNjYWxlIHsKICAgIGZyb20gewogICAgICBvcGFjaXR5OiAwOwogICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTgpIHRyYW5zbGF0ZVkoMnB4KTsKICAgIH0KICAgIHRvIHsKICAgICAgb3BhY2l0eTogMTsKICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGVZKDApOwogICAgfQogIH0KCiAgLmZvcm1hdC1idXR0b24gewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDMycHg7CiAgICBib3JkZXI6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB9CgogIC5mb3JtYXQtYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjRmNGY1IiwgIiMyNzI3MmEiKX07CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICB9CgogIC5mb3JtYXQtYnV0dG9uOmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTUpOwogIH0KCiAgLmZvcm1hdC1idXR0b24uYm9sZCB7CiAgICBmb250LXdlaWdodDogNzAwOwogIH0KCiAgLmZvcm1hdC1idXR0b24uaXRhbGljIHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICB9CgogIC5mb3JtYXQtYnV0dG9uLnVuZGVybGluZSB7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICB9CgogIC5mb3JtYXQtYnV0dG9uIC5jb2RlLWljb24gewogICAgZm9udC1mYW1pbHk6ICdTRiBNb25vJywgJ01vbmFjbycsICdJbmNvbnNvbGF0YScsICdGaXJhIENvZGUnLCBtb25vc3BhY2U7CiAgICBmb250LXNpemU6IDEycHg7CiAgfQoKICAvKiBBcHBsaWVkIGZvcm1hdCBzdHlsZXMgaW4gY29udGVudCAqLwogIC5ibG9jayBzdHJvbmcsCiAgLmJsb2NrIGIgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogIH0KCiAgLmJsb2NrIGVtLAogIC5ibG9jayBpIHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICB9CgogIC5ibG9jayB1IHsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogIH0KCiAgLmJsb2NrIHN0cmlrZSwKICAuYmxvY2sgcyB7CiAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsKICAgIG9wYWNpdHk6IDAuNzsKICB9CgogIC5ibG9jayBjb2RlIHsKICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjRmNGY1IiwgIiMyNzI3MmEiKX07CiAgICBwYWRkaW5nOiAycHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgZm9udC1mYW1pbHk6ICdTRiBNb25vJywgJ01vbmFjbycsICdJbmNvbnNvbGF0YScsICdGaXJhIENvZGUnLCBtb25vc3BhY2U7CiAgICBmb250LXNpemU6IDAuOWVtOwogICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgfQoKICAuYmxvY2sgYSB7CiAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cyBlYXNlOwogIH0KCiAgLmJsb2NrIGE6aG92ZXIgewogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICB9CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL3d5c2l3eWcuY29udmVydGVycy5qcwp2YXIgV3lzaXd5Z0NvbnZlcnRlcnMgPSBjbGFzcyB7CiAgc3RhdGljIGVzY2FwZUh0bWwodGV4dDkpIHsKICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgZGl2LnRleHRDb250ZW50ID0gdGV4dDk7CiAgICByZXR1cm4gZGl2LmlubmVySFRNTDsKICB9CiAgc3RhdGljIGZvcm1hdEZpbGVTaXplKGJ5dGVzKSB7CiAgICBpZiAoYnl0ZXMgPT09IDApCiAgICAgIHJldHVybiAiMCBCeXRlcyI7CiAgICBjb25zdCBrNSA9IDEwMjQ7CiAgICBjb25zdCBzaXplcyA9IFsiQnl0ZXMiLCAiS0IiLCAiTUIiLCAiR0IiXTsKICAgIGNvbnN0IGkxMSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coazUpKTsKICAgIHJldHVybiBwYXJzZUZsb2F0KChieXRlcyAvIE1hdGgucG93KGs1LCBpMTEpKS50b0ZpeGVkKDIpKSArICIgIiArIHNpemVzW2kxMV07CiAgfQogIHN0YXRpYyBnZXRIdG1sT3V0cHV0KGJsb2NrcykgewogICAgcmV0dXJuIGJsb2Nrcy5tYXAoKGJsb2NrKSA9PiB7CiAgICAgIGNvbnN0IGNvbnRlbnQzID0gYmxvY2suY29udGVudC5pbmNsdWRlcygiPCIpICYmIGJsb2NrLmNvbnRlbnQuaW5jbHVkZXMoIj4iKSA/IGJsb2NrLmNvbnRlbnQgOiB0aGlzLmVzY2FwZUh0bWwoYmxvY2suY29udGVudCk7CiAgICAgIHN3aXRjaCAoYmxvY2sudHlwZSkgewogICAgICAgIGNhc2UgInBhcmFncmFwaCI6CiAgICAgICAgICByZXR1cm4gYmxvY2suY29udGVudCA/IGA8cD4ke2NvbnRlbnQzfTwvcD5gIDogIiI7CiAgICAgICAgY2FzZSAiaGVhZGluZy0xIjoKICAgICAgICAgIHJldHVybiBgPGgxPiR7Y29udGVudDN9PC9oMT5gOwogICAgICAgIGNhc2UgImhlYWRpbmctMiI6CiAgICAgICAgICByZXR1cm4gYDxoMj4ke2NvbnRlbnQzfTwvaDI+YDsKICAgICAgICBjYXNlICJoZWFkaW5nLTMiOgogICAgICAgICAgcmV0dXJuIGA8aDM+JHtjb250ZW50M308L2gzPmA7CiAgICAgICAgY2FzZSAicXVvdGUiOgogICAgICAgICAgcmV0dXJuIGA8YmxvY2txdW90ZT4ke2NvbnRlbnQzfTwvYmxvY2txdW90ZT5gOwogICAgICAgIGNhc2UgImNvZGUiOgogICAgICAgICAgcmV0dXJuIGA8cHJlPjxjb2RlPiR7dGhpcy5lc2NhcGVIdG1sKGJsb2NrLmNvbnRlbnQpfTwvY29kZT48L3ByZT5gOwogICAgICAgIGNhc2UgImxpc3QiOgogICAgICAgICAgY29uc3QgaXRlbXMgPSBibG9jay5jb250ZW50LnNwbGl0KCJcbiIpLmZpbHRlcigoaXRlbSkgPT4gaXRlbS50cmltKCkpOwogICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgY29uc3QgbGlzdFRhZyA9IGJsb2NrLm1ldGFkYXRhPy5saXN0VHlwZSA9PT0gIm9yZGVyZWQiID8gIm9sIiA6ICJ1bCI7CiAgICAgICAgICAgIHJldHVybiBgPCR7bGlzdFRhZ30+JHtpdGVtcy5tYXAoKGl0ZW0pID0+IGA8bGk+JHtpdGVtfTwvbGk+YCkuam9pbigiIil9PC8ke2xpc3RUYWd9PmA7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgY2FzZSAiZGl2aWRlciI6CiAgICAgICAgICByZXR1cm4gIjxocj4iOwogICAgICAgIGNhc2UgImltYWdlIjoKICAgICAgICAgIGNvbnN0IGltYWdlVXJsID0gYmxvY2subWV0YWRhdGE/LnVybDsKICAgICAgICAgIGlmIChpbWFnZVVybCkgewogICAgICAgICAgICBjb25zdCBhbHRUZXh0ID0gdGhpcy5lc2NhcGVIdG1sKGJsb2NrLmNvbnRlbnQgfHwgIkltYWdlIik7CiAgICAgICAgICAgIHJldHVybiBgPGltZyBzcmM9IiR7aW1hZ2VVcmx9IiBhbHQ9IiR7YWx0VGV4dH0iIC8+YDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICBjYXNlICJ5b3V0dWJlIjoKICAgICAgICAgIGNvbnN0IHZpZGVvSWQgPSBibG9jay5tZXRhZGF0YT8udmlkZW9JZDsKICAgICAgICAgIGlmICh2aWRlb0lkKSB7CiAgICAgICAgICAgIHJldHVybiBgPGlmcmFtZSB3aWR0aD0iNTYwIiBoZWlnaHQ9IjMxNSIgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8ke3ZpZGVvSWR9IiBmcmFtZWJvcmRlcj0iMCIgYWxsb3c9ImFjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBjbGlwYm9hcmQtd3JpdGU7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmUiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT5gOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIGNhc2UgIm1hcmtkb3duIjoKICAgICAgICAgIHJldHVybiBgPGRpdiBjbGFzcz0ibWFya2Rvd24tY29udGVudCI+JHt0aGlzLmVzY2FwZUh0bWwoYmxvY2suY29udGVudCl9PC9kaXY+YDsKICAgICAgICBjYXNlICJodG1sIjoKICAgICAgICAgIHJldHVybiBibG9jay5jb250ZW50OwogICAgICAgIGNhc2UgImF0dGFjaG1lbnQiOgogICAgICAgICAgY29uc3QgZmlsZXMgPSBibG9jay5tZXRhZGF0YT8uZmlsZXMgfHwgW107CiAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3M9ImF0dGFjaG1lbnRzIj4ke2ZpbGVzLm1hcCgoZmlsZSkgPT4gYDxkaXYgY2xhc3M9ImF0dGFjaG1lbnQtaXRlbSIgZGF0YS1maWxlLWlkPSIke2ZpbGUuaWR9Ij4KICAgICAgICAgICAgICAgIDxhIGhyZWY9IiR7ZmlsZS5kYXRhfSIgZG93bmxvYWQ9IiR7ZmlsZS5uYW1lfSI+JHt0aGlzLmVzY2FwZUh0bWwoZmlsZS5uYW1lKX08L2E+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZmlsZS1zaXplIj4oJHt0aGlzLmZvcm1hdEZpbGVTaXplKGZpbGUuc2l6ZSl9KTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj5gKS5qb2luKCIiKX08L2Rpdj5gOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gYDxwPiR7Y29udGVudDN9PC9wPmA7CiAgICAgIH0KICAgIH0pLmZpbHRlcigoaHRtbDE2KSA9PiBodG1sMTYgIT09ICIiKS5qb2luKCJcbiIpOwogIH0KICBzdGF0aWMgZ2V0TWFya2Rvd25PdXRwdXQoYmxvY2tzKSB7CiAgICByZXR1cm4gYmxvY2tzLm1hcCgoYmxvY2spID0+IHsKICAgICAgc3dpdGNoIChibG9jay50eXBlKSB7CiAgICAgICAgY2FzZSAicGFyYWdyYXBoIjoKICAgICAgICAgIHJldHVybiBibG9jay5jb250ZW50OwogICAgICAgIGNhc2UgImhlYWRpbmctMSI6CiAgICAgICAgICByZXR1cm4gYCMgJHtibG9jay5jb250ZW50fWA7CiAgICAgICAgY2FzZSAiaGVhZGluZy0yIjoKICAgICAgICAgIHJldHVybiBgIyMgJHtibG9jay5jb250ZW50fWA7CiAgICAgICAgY2FzZSAiaGVhZGluZy0zIjoKICAgICAgICAgIHJldHVybiBgIyMjICR7YmxvY2suY29udGVudH1gOwogICAgICAgIGNhc2UgInF1b3RlIjoKICAgICAgICAgIHJldHVybiBgPiAke2Jsb2NrLmNvbnRlbnR9YDsKICAgICAgICBjYXNlICJjb2RlIjoKICAgICAgICAgIHJldHVybiBgXGBcYFxgCiR7YmxvY2suY29udGVudH0KXGBcYFxgYDsKICAgICAgICBjYXNlICJsaXN0IjoKICAgICAgICAgIGNvbnN0IGl0ZW1zID0gYmxvY2suY29udGVudC5zcGxpdCgiXG4iKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHJpbSgpKTsKICAgICAgICAgIGlmIChibG9jay5tZXRhZGF0YT8ubGlzdFR5cGUgPT09ICJvcmRlcmVkIikgewogICAgICAgICAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtLCBpbmRleDIpID0+IGAke2luZGV4MiArIDF9LiAke2l0ZW19YCkuam9pbigiXG4iKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBpdGVtcy5tYXAoKGl0ZW0pID0+IGAtICR7aXRlbX1gKS5qb2luKCJcbiIpOwogICAgICAgICAgfQogICAgICAgIGNhc2UgImRpdmlkZXIiOgogICAgICAgICAgcmV0dXJuICItLS0iOwogICAgICAgIGNhc2UgImltYWdlIjoKICAgICAgICAgIGNvbnN0IGltYWdlVXJsID0gYmxvY2subWV0YWRhdGE/LnVybDsKICAgICAgICAgIGNvbnN0IGFsdFRleHQgPSBibG9jay5jb250ZW50IHx8ICJJbWFnZSI7CiAgICAgICAgICByZXR1cm4gaW1hZ2VVcmwgPyBgIVske2FsdFRleHR9XSgke2ltYWdlVXJsfSlgIDogIiI7CiAgICAgICAgY2FzZSAieW91dHViZSI6CiAgICAgICAgICBjb25zdCB2aWRlb0lkID0gYmxvY2subWV0YWRhdGE/LnZpZGVvSWQ7CiAgICAgICAgICBjb25zdCB1cmwgPSBibG9jay5tZXRhZGF0YT8udXJsIHx8ICh2aWRlb0lkID8gYGh0dHBzOi8veW91dHViZS5jb20vd2F0Y2g/dj0ke3ZpZGVvSWR9YCA6ICIiKTsKICAgICAgICAgIHJldHVybiB1cmwgPyBgW1lvdVR1YmUgVmlkZW9dKCR7dXJsfSlgIDogIiI7CiAgICAgICAgY2FzZSAibWFya2Rvd24iOgogICAgICAgICAgcmV0dXJuIGJsb2NrLmNvbnRlbnQ7CiAgICAgICAgY2FzZSAiaHRtbCI6CiAgICAgICAgICByZXR1cm4gYDwhLS0gSFRNTCBCbG9jawoke2Jsb2NrLmNvbnRlbnR9Ci0tPmA7CiAgICAgICAgY2FzZSAiYXR0YWNobWVudCI6CiAgICAgICAgICBjb25zdCBmaWxlcyA9IGJsb2NrLm1ldGFkYXRhPy5maWxlcyB8fCBbXTsKICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHJldHVybiBmaWxlcy5tYXAoKGZpbGUpID0+IGAtIFske2ZpbGUubmFtZX1dKCR7ZmlsZS5kYXRhfSlgKS5qb2luKCJcbiIpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gYmxvY2suY29udGVudDsKICAgICAgfQogICAgfSkuZmlsdGVyKChtZCkgPT4gbWQgIT09ICIiKS5qb2luKCJcblxuIik7CiAgfQogIHN0YXRpYyBwYXJzZUh0bWxUb0Jsb2NrcyhodG1sMTYpIHsKICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKICAgIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaHRtbDE2LCAidGV4dC9odG1sIik7CiAgICBjb25zdCBibG9ja3MgPSBbXTsKICAgIGNvbnN0IHByb2Nlc3NOb2RlID0gKG5vZGUyKSA9PiB7CiAgICAgIGlmIChub2RlMi5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgJiYgbm9kZTIudGV4dENvbnRlbnQ/LnRyaW0oKSkgewogICAgICAgIGJsb2Nrcy5wdXNoKHsKICAgICAgICAgIGlkOiBgYmxvY2stJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gLAogICAgICAgICAgdHlwZTogInBhcmFncmFwaCIsCiAgICAgICAgICBjb250ZW50OiBub2RlMi50ZXh0Q29udGVudC50cmltKCkKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmIChub2RlMi5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHsKICAgICAgICBjb25zdCBlbGVtZW50NCA9IG5vZGUyOwogICAgICAgIGNvbnN0IHRhZ05hbWUgPSBlbGVtZW50NC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgc3dpdGNoICh0YWdOYW1lKSB7CiAgICAgICAgICBjYXNlICJwIjoKICAgICAgICAgICAgYmxvY2tzLnB1c2goewogICAgICAgICAgICAgIGlkOiBgYmxvY2stJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gLAogICAgICAgICAgICAgIHR5cGU6ICJwYXJhZ3JhcGgiLAogICAgICAgICAgICAgIGNvbnRlbnQ6IGVsZW1lbnQ0LmlubmVySFRNTCB8fCAiIgogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJoMSI6CiAgICAgICAgICAgIGJsb2Nrcy5wdXNoKHsKICAgICAgICAgICAgICBpZDogYGJsb2NrLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOSl9YCwKICAgICAgICAgICAgICB0eXBlOiAiaGVhZGluZy0xIiwKICAgICAgICAgICAgICBjb250ZW50OiBlbGVtZW50NC5pbm5lckhUTUwgfHwgIiIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiaDIiOgogICAgICAgICAgICBibG9ja3MucHVzaCh7CiAgICAgICAgICAgICAgaWQ6IGBibG9jay0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDkpfWAsCiAgICAgICAgICAgICAgdHlwZTogImhlYWRpbmctMiIsCiAgICAgICAgICAgICAgY29udGVudDogZWxlbWVudDQuaW5uZXJIVE1MIHx8ICIiCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImgzIjoKICAgICAgICAgICAgYmxvY2tzLnB1c2goewogICAgICAgICAgICAgIGlkOiBgYmxvY2stJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gLAogICAgICAgICAgICAgIHR5cGU6ICJoZWFkaW5nLTMiLAogICAgICAgICAgICAgIGNvbnRlbnQ6IGVsZW1lbnQ0LmlubmVySFRNTCB8fCAiIgogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJibG9ja3F1b3RlIjoKICAgICAgICAgICAgYmxvY2tzLnB1c2goewogICAgICAgICAgICAgIGlkOiBgYmxvY2stJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gLAogICAgICAgICAgICAgIHR5cGU6ICJxdW90ZSIsCiAgICAgICAgICAgICAgY29udGVudDogZWxlbWVudDQuaW5uZXJIVE1MIHx8ICIiCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgInByZSI6CiAgICAgICAgICBjYXNlICJjb2RlIjoKICAgICAgICAgICAgYmxvY2tzLnB1c2goewogICAgICAgICAgICAgIGlkOiBgYmxvY2stJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gLAogICAgICAgICAgICAgIHR5cGU6ICJjb2RlIiwKICAgICAgICAgICAgICBjb250ZW50OiBlbGVtZW50NC50ZXh0Q29udGVudCB8fCAiIgogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJ1bCI6CiAgICAgICAgICBjYXNlICJvbCI6CiAgICAgICAgICAgIGNvbnN0IGxpc3RJdGVtcyA9IEFycmF5LmZyb20oZWxlbWVudDQucXVlcnlTZWxlY3RvckFsbCgibGkiKSk7CiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQzID0gbGlzdEl0ZW1zLm1hcCgobGkyKSA9PiBsaTIuaW5uZXJIVE1MIHx8ICIiKS5qb2luKCJcbiIpOwogICAgICAgICAgICBibG9ja3MucHVzaCh7CiAgICAgICAgICAgICAgaWQ6IGBibG9jay0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDkpfWAsCiAgICAgICAgICAgICAgdHlwZTogImxpc3QiLAogICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQzLAogICAgICAgICAgICAgIG1ldGFkYXRhOiB7IGxpc3RUeXBlOiB0YWdOYW1lID09PSAib2wiID8gIm9yZGVyZWQiIDogImJ1bGxldCIgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJociI6CiAgICAgICAgICAgIGJsb2Nrcy5wdXNoKHsKICAgICAgICAgICAgICBpZDogYGJsb2NrLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOSl9YCwKICAgICAgICAgICAgICB0eXBlOiAiZGl2aWRlciIsCiAgICAgICAgICAgICAgY29udGVudDogIiAiCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImltZyI6CiAgICAgICAgICAgIGNvbnN0IGltZ0VsZW1lbnQgPSBlbGVtZW50NDsKICAgICAgICAgICAgYmxvY2tzLnB1c2goewogICAgICAgICAgICAgIGlkOiBgYmxvY2stJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gLAogICAgICAgICAgICAgIHR5cGU6ICJpbWFnZSIsCiAgICAgICAgICAgICAgY29udGVudDogaW1nRWxlbWVudC5hbHQgfHwgIiIsCiAgICAgICAgICAgICAgbWV0YWRhdGE6IHsgdXJsOiBpbWdFbGVtZW50LnNyYyB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGVsZW1lbnQ0LmNoaWxkTm9kZXMuZm9yRWFjaCgoY2hpbGQpID0+IHByb2Nlc3NOb2RlKGNoaWxkKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgZG9jLmJvZHkuY2hpbGROb2Rlcy5mb3JFYWNoKChub2RlMikgPT4gcHJvY2Vzc05vZGUobm9kZTIpKTsKICAgIHJldHVybiBibG9ja3M7CiAgfQogIHN0YXRpYyBwYXJzZU1hcmtkb3duVG9CbG9ja3MobWFya2Rvd24pIHsKICAgIGNvbnN0IGxpbmVzID0gbWFya2Rvd24uc3BsaXQoIlxuIik7CiAgICBjb25zdCBibG9ja3MgPSBbXTsKICAgIGxldCBjdXJyZW50TGlzdEl0ZW1zID0gW107CiAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBsaW5lcy5sZW5ndGg7IGkxMSsrKSB7CiAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpMTFdOwogICAgICBpZiAobGluZS5zdGFydHNXaXRoKCIjICIpKSB7CiAgICAgICAgYmxvY2tzLnB1c2goewogICAgICAgICAgaWQ6IGBibG9jay0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDkpfWAsCiAgICAgICAgICB0eXBlOiAiaGVhZGluZy0xIiwKICAgICAgICAgIGNvbnRlbnQ6IGxpbmUuc3Vic3RyaW5nKDIpCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIjIyAiKSkgewogICAgICAgIGJsb2Nrcy5wdXNoKHsKICAgICAgICAgIGlkOiBgYmxvY2stJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gLAogICAgICAgICAgdHlwZTogImhlYWRpbmctMiIsCiAgICAgICAgICBjb250ZW50OiBsaW5lLnN1YnN0cmluZygzKQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiIyMjICIpKSB7CiAgICAgICAgYmxvY2tzLnB1c2goewogICAgICAgICAgaWQ6IGBibG9jay0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDkpfWAsCiAgICAgICAgICB0eXBlOiAiaGVhZGluZy0zIiwKICAgICAgICAgIGNvbnRlbnQ6IGxpbmUuc3Vic3RyaW5nKDQpCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCI+ICIpKSB7CiAgICAgICAgYmxvY2tzLnB1c2goewogICAgICAgICAgaWQ6IGBibG9jay0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDkpfWAsCiAgICAgICAgICB0eXBlOiAicXVvdGUiLAogICAgICAgICAgY29udGVudDogbGluZS5zdWJzdHJpbmcoMikKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoImBgYCIpKSB7CiAgICAgICAgY29uc3QgY29kZUxpbmVzID0gW107CiAgICAgICAgaTExKys7CiAgICAgICAgd2hpbGUgKGkxMSA8IGxpbmVzLmxlbmd0aCAmJiAhbGluZXNbaTExXS5zdGFydHNXaXRoKCJgYGAiKSkgewogICAgICAgICAgY29kZUxpbmVzLnB1c2gobGluZXNbaTExXSk7CiAgICAgICAgICBpMTErKzsKICAgICAgICB9CiAgICAgICAgYmxvY2tzLnB1c2goewogICAgICAgICAgaWQ6IGBibG9jay0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDkpfWAsCiAgICAgICAgICB0eXBlOiAiY29kZSIsCiAgICAgICAgICBjb250ZW50OiBjb2RlTGluZXMuam9pbigiXG4iKQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGxpbmUubWF0Y2goL14oXCp8LSkgLykpIHsKICAgICAgICBjdXJyZW50TGlzdEl0ZW1zLnB1c2gobGluZS5zdWJzdHJpbmcoMikpOwogICAgICAgIGlmIChpMTEgPT09IGxpbmVzLmxlbmd0aCAtIDEgfHwgIWxpbmVzW2kxMSArIDFdLm1hdGNoKC9eKFwqfC0pIC8pKSB7CiAgICAgICAgICBibG9ja3MucHVzaCh7CiAgICAgICAgICAgIGlkOiBgYmxvY2stJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gLAogICAgICAgICAgICB0eXBlOiAibGlzdCIsCiAgICAgICAgICAgIGNvbnRlbnQ6IGN1cnJlbnRMaXN0SXRlbXMuam9pbigiXG4iKSwKICAgICAgICAgICAgbWV0YWRhdGE6IHsgbGlzdFR5cGU6ICJidWxsZXQiIH0KICAgICAgICAgIH0pOwogICAgICAgICAgY3VycmVudExpc3RJdGVtcyA9IFtdOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChsaW5lLm1hdGNoKC9eXGQrXC4gLykpIHsKICAgICAgICBjdXJyZW50TGlzdEl0ZW1zLnB1c2gobGluZS5yZXBsYWNlKC9eXGQrXC4gLywgIiIpKTsKICAgICAgICBpZiAoaTExID09PSBsaW5lcy5sZW5ndGggLSAxIHx8ICFsaW5lc1tpMTEgKyAxXS5tYXRjaCgvXlxkK1wuIC8pKSB7CiAgICAgICAgICBibG9ja3MucHVzaCh7CiAgICAgICAgICAgIGlkOiBgYmxvY2stJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gLAogICAgICAgICAgICB0eXBlOiAibGlzdCIsCiAgICAgICAgICAgIGNvbnRlbnQ6IGN1cnJlbnRMaXN0SXRlbXMuam9pbigiXG4iKSwKICAgICAgICAgICAgbWV0YWRhdGE6IHsgbGlzdFR5cGU6ICJvcmRlcmVkIiB9CiAgICAgICAgICB9KTsKICAgICAgICAgIGN1cnJlbnRMaXN0SXRlbXMgPSBbXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobGluZSA9PT0gIi0tLSIgfHwgbGluZSA9PT0gIioqKiIgfHwgbGluZSA9PT0gIl9fXyIpIHsKICAgICAgICBibG9ja3MucHVzaCh7CiAgICAgICAgICBpZDogYGJsb2NrLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOSl9YCwKICAgICAgICAgIHR5cGU6ICJkaXZpZGVyIiwKICAgICAgICAgIGNvbnRlbnQ6ICIgIgogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGxpbmUubWF0Y2goL14hXFsoW15cXV0qKVxdXCgoW15cKV0rKVwpJC8pKSB7CiAgICAgICAgY29uc3QgbWF0Y2gyID0gbGluZS5tYXRjaCgvXiFcWyhbXlxdXSopXF1cKChbXlwpXSspXCkkLyk7CiAgICAgICAgaWYgKG1hdGNoMikgewogICAgICAgICAgYmxvY2tzLnB1c2goewogICAgICAgICAgICBpZDogYGJsb2NrLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOSl9YCwKICAgICAgICAgICAgdHlwZTogImltYWdlIiwKICAgICAgICAgICAgY29udGVudDogbWF0Y2gyWzFdIHx8ICIiLAogICAgICAgICAgICBtZXRhZGF0YTogeyB1cmw6IG1hdGNoMlsyXSB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobGluZS50cmltKCkpIHsKICAgICAgICBibG9ja3MucHVzaCh7CiAgICAgICAgICBpZDogYGJsb2NrLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOSl9YCwKICAgICAgICAgIHR5cGU6ICJwYXJhZ3JhcGgiLAogICAgICAgICAgY29udGVudDogbGluZQogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYmxvY2tzOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvd3lzaXd5Zy5ibG9ja3MuanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIFd5c2l3eWdCbG9ja3MgPSBjbGFzcyB7CiAgc3RhdGljIHJlbmRlckxpc3RDb250ZW50KGNvbnRlbnQzLCBtZXRhZGF0YSkgewogICAgY29uc3QgaXRlbXMgPSBjb250ZW50My5zcGxpdCgiXG4iKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHJpbSgpKTsKICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDApCiAgICAgIHJldHVybiAiIjsKICAgIGNvbnN0IGxpc3RUYWcgPSBtZXRhZGF0YT8ubGlzdFR5cGUgPT09ICJvcmRlcmVkIiA/ICJvbCIgOiAidWwiOwogICAgcmV0dXJuIGA8JHtsaXN0VGFnfT4ke2l0ZW1zLm1hcCgoaXRlbSkgPT4gYDxsaT4ke2l0ZW19PC9saT5gKS5qb2luKCIiKX08LyR7bGlzdFRhZ30+YDsKICB9CiAgc3RhdGljIHJlbmRlckJsb2NrKGJsb2NrLCBpc1NlbGVjdGVkLCBoYW5kbGVyczIpIHsKICAgIGlmIChibG9jay50eXBlID09PSAiZGl2aWRlciIpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICAgIDxkaXYKICAgICAgICAgIGNsYXNzPSJibG9jayBkaXZpZGVyIgogICAgICAgICAgZGF0YS1ibG9jay1pZD0iJHtibG9jay5pZH0iCiAgICAgICAgPgogICAgICAgICAgPGhyPgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgfQogICAgaWYgKGJsb2NrLnR5cGUgPT09ICJsaXN0IikgewogICAgICByZXR1cm4gYjJgCiAgICAgICAgPGRpdgogICAgICAgICAgY2xhc3M9ImJsb2NrIGxpc3QgJHtpc1NlbGVjdGVkID8gInNlbGVjdGVkIiA6ICIifSIKICAgICAgICAgIGRhdGEtYmxvY2staWQ9IiR7YmxvY2suaWR9IgogICAgICAgICAgY29udGVudGVkaXRhYmxlPSJ0cnVlIgogICAgICAgICAgQGlucHV0PSIke2hhbmRsZXJzMi5vbklucHV0fSIKICAgICAgICAgIEBrZXlkb3duPSIke2hhbmRsZXJzMi5vbktleURvd259IgogICAgICAgICAgQGZvY3VzPSIke2hhbmRsZXJzMi5vbkZvY3VzfSIKICAgICAgICAgIEBibHVyPSIke2hhbmRsZXJzMi5vbkJsdXJ9IgogICAgICAgICAgQGNvbXBvc2l0aW9uc3RhcnQ9IiR7aGFuZGxlcnMyLm9uQ29tcG9zaXRpb25TdGFydH0iCiAgICAgICAgICBAY29tcG9zaXRpb25lbmQ9IiR7aGFuZGxlcnMyLm9uQ29tcG9zaXRpb25FbmR9IgogICAgICAgICAgQG1vdXNldXA9IiR7KGUxMSkgPT4gewogICAgICAgIGNvbnNvbGUubG9nKCJCbG9jayBtb3VzZXVwIGV2ZW50IGZpcmVkIik7CiAgICAgICAgaWYgKGhhbmRsZXJzMi5vbk1vdXNlVXApCiAgICAgICAgICBoYW5kbGVyczIub25Nb3VzZVVwKGUxMSk7CiAgICAgIH19IgogICAgICAgICAgLmlubmVySFRNTD0iJHt0aGlzLnJlbmRlckxpc3RDb250ZW50KGJsb2NrLmNvbnRlbnQsIGJsb2NrLm1ldGFkYXRhKX0iCiAgICAgICAgPjwvZGl2PgogICAgICBgOwogICAgfQogICAgaWYgKGJsb2NrLnR5cGUgPT09ICJjb2RlIikgewogICAgICBjb25zdCBsYW5ndWFnZSA9IGJsb2NrLm1ldGFkYXRhPy5sYW5ndWFnZSB8fCAicGxhaW4gdGV4dCI7CiAgICAgIHJldHVybiBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWJsb2NrLWNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWxhbmd1YWdlIj4ke2xhbmd1YWdlfTwvZGl2PgogICAgICAgICAgPGRpdgogICAgICAgICAgICBjbGFzcz0iYmxvY2sgJHtibG9jay50eXBlfSAke2lzU2VsZWN0ZWQgPyAic2VsZWN0ZWQiIDogIiJ9IgogICAgICAgICAgICBjb250ZW50ZWRpdGFibGU9InRydWUiCiAgICAgICAgICAgIEBpbnB1dD0iJHtoYW5kbGVyczIub25JbnB1dH0iCiAgICAgICAgICAgIEBrZXlkb3duPSIke2hhbmRsZXJzMi5vbktleURvd259IgogICAgICAgICAgICBAZm9jdXM9IiR7aGFuZGxlcnMyLm9uRm9jdXN9IgogICAgICAgICAgICBAYmx1cj0iJHtoYW5kbGVyczIub25CbHVyfSIKICAgICAgICAgICAgQGNvbXBvc2l0aW9uc3RhcnQ9IiR7aGFuZGxlcnMyLm9uQ29tcG9zaXRpb25TdGFydH0iCiAgICAgICAgICAgIEBjb21wb3NpdGlvbmVuZD0iJHtoYW5kbGVyczIub25Db21wb3NpdGlvbkVuZH0iCiAgICAgICAgICAgIEBtb3VzZXVwPSIkeyhlMTEpID0+IHsKICAgICAgICBjb25zb2xlLmxvZygiQmxvY2sgbW91c2V1cCBldmVudCBmaXJlZCIpOwogICAgICAgIGlmIChoYW5kbGVyczIub25Nb3VzZVVwKQogICAgICAgICAgaGFuZGxlcnMyLm9uTW91c2VVcChlMTEpOwogICAgICB9fSIKICAgICAgICAgICAgLnRleHRDb250ZW50PSIke2Jsb2NrLmNvbnRlbnQgfHwgIiJ9IgogICAgICAgICAgPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgfQogICAgY29uc3QgYmxvY2tFbGVtZW50ID0gYjJgCiAgICAgIDxkaXYKICAgICAgICBjbGFzcz0iYmxvY2sgJHtibG9jay50eXBlfSAke2lzU2VsZWN0ZWQgPyAic2VsZWN0ZWQiIDogIiJ9IgogICAgICAgIGNvbnRlbnRlZGl0YWJsZT0idHJ1ZSIKICAgICAgICBAaW5wdXQ9IiR7aGFuZGxlcnMyLm9uSW5wdXR9IgogICAgICAgIEBrZXlkb3duPSIke2hhbmRsZXJzMi5vbktleURvd259IgogICAgICAgIEBmb2N1cz0iJHtoYW5kbGVyczIub25Gb2N1c30iCiAgICAgICAgQGJsdXI9IiR7aGFuZGxlcnMyLm9uQmx1cn0iCiAgICAgICAgQGNvbXBvc2l0aW9uc3RhcnQ9IiR7aGFuZGxlcnMyLm9uQ29tcG9zaXRpb25TdGFydH0iCiAgICAgICAgQGNvbXBvc2l0aW9uZW5kPSIke2hhbmRsZXJzMi5vbkNvbXBvc2l0aW9uRW5kfSIKICAgICAgICBAbW91c2V1cD0iJHsoZTExKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJCbG9jayBtb3VzZXVwIGV2ZW50IGZpcmVkIik7CiAgICAgIGlmIChoYW5kbGVyczIub25Nb3VzZVVwKQogICAgICAgIGhhbmRsZXJzMi5vbk1vdXNlVXAoZTExKTsKICAgIH19IgogICAgICAgIC5pbm5lckhUTUw9IiR7YmxvY2suY29udGVudCB8fCAiIn0iCiAgICAgID48L2Rpdj4KICAgIGA7CiAgICByZXR1cm4gYmxvY2tFbGVtZW50OwogIH0KICBzdGF0aWMgc2V0Q3Vyc29yVG9FbmQoZWxlbWVudDQpIHsKICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgIGlmICghc2VsKQogICAgICByZXR1cm47CiAgICBjb25zdCByYW5nZTIgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgaWYgKGVsZW1lbnQ0LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7CiAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIlx1MjAwQiIpOwogICAgICBlbGVtZW50NC5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7CiAgICAgIHJhbmdlMi5zZXRTdGFydCh0ZXh0Tm9kZSwgMSk7CiAgICAgIHJhbmdlMi5jb2xsYXBzZSh0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGxhc3ROb2RlID0gdGhpcy5nZXRMYXN0Tm9kZShlbGVtZW50NCk7CiAgICAgIGlmIChsYXN0Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHsKICAgICAgICByYW5nZTIuc2V0U3RhcnQobGFzdE5vZGUsIGxhc3ROb2RlLnRleHRDb250ZW50Py5sZW5ndGggfHwgMCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmFuZ2UyLnNldFN0YXJ0QWZ0ZXIobGFzdE5vZGUpOwogICAgICB9CiAgICAgIHJhbmdlMi5jb2xsYXBzZSh0cnVlKTsKICAgIH0KICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTsKICAgIHNlbC5hZGRSYW5nZShyYW5nZTIpOwogICAgaWYgKGVsZW1lbnQ0LnRleHRDb250ZW50ID09PSAiXHUyMDBCIikgewogICAgICBlbGVtZW50NC50ZXh0Q29udGVudCA9ICIiOwogICAgfQogIH0KICBzdGF0aWMgc2V0Q3Vyc29yVG9TdGFydChlbGVtZW50NCkgewogICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgaWYgKCFzZWwpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IHJhbmdlMiA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICBpZiAoZWxlbWVudDQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDApIHsKICAgICAgcmFuZ2UyLnNldFN0YXJ0KGVsZW1lbnQ0LCAwKTsKICAgICAgcmFuZ2UyLmNvbGxhcHNlKHRydWUpOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgZmlyc3ROb2RlID0gdGhpcy5nZXRGaXJzdE5vZGUoZWxlbWVudDQpOwogICAgICBpZiAoZmlyc3ROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgIHJhbmdlMi5zZXRTdGFydChmaXJzdE5vZGUsIDApOwogICAgICB9IGVsc2UgewogICAgICAgIHJhbmdlMi5zZXRTdGFydEJlZm9yZShmaXJzdE5vZGUpOwogICAgICB9CiAgICAgIHJhbmdlMi5jb2xsYXBzZSh0cnVlKTsKICAgIH0KICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTsKICAgIHNlbC5hZGRSYW5nZShyYW5nZTIpOwogIH0KICBzdGF0aWMgZ2V0TGFzdE5vZGUoZWxlbWVudDQpIHsKICAgIGlmIChlbGVtZW50NC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gZWxlbWVudDQ7CiAgICB9CiAgICBjb25zdCBsYXN0Q2hpbGQgPSBlbGVtZW50NC5jaGlsZE5vZGVzW2VsZW1lbnQ0LmNoaWxkTm9kZXMubGVuZ3RoIC0gMV07CiAgICBpZiAobGFzdENoaWxkLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSB8fCBsYXN0Q2hpbGQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIGxhc3RDaGlsZDsKICAgIH0KICAgIHJldHVybiB0aGlzLmdldExhc3ROb2RlKGxhc3RDaGlsZCk7CiAgfQogIHN0YXRpYyBnZXRGaXJzdE5vZGUoZWxlbWVudDQpIHsKICAgIGlmIChlbGVtZW50NC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gZWxlbWVudDQ7CiAgICB9CiAgICBjb25zdCBmaXJzdENoaWxkID0gZWxlbWVudDQuY2hpbGROb2Rlc1swXTsKICAgIGlmIChmaXJzdENoaWxkLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSB8fCBmaXJzdENoaWxkLmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBmaXJzdENoaWxkOwogICAgfQogICAgcmV0dXJuIHRoaXMuZ2V0Rmlyc3ROb2RlKGZpcnN0Q2hpbGQpOwogIH0KICBzdGF0aWMgZm9jdXNMaXN0SXRlbShsaXN0RWxlbWVudCkgewogICAgY29uc3QgZmlyc3RMaSA9IGxpc3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoImxpIik7CiAgICBpZiAoZmlyc3RMaSkgewogICAgICBmaXJzdExpLmZvY3VzKCk7CiAgICAgIGNvbnN0IHJhbmdlMiA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgcmFuZ2UyLnNlbGVjdE5vZGVDb250ZW50cyhmaXJzdExpKTsKICAgICAgcmFuZ2UyLmNvbGxhcHNlKHRydWUpOwogICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgIHNlbC5hZGRSYW5nZShyYW5nZTIpOwogICAgfQogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvd3lzaXd5Zy5ibG9ja29wZXJhdGlvbnMuanMKdmFyIFd5c2l3eWdCbG9ja09wZXJhdGlvbnMgPSBjbGFzcyB7CiAgY29tcG9uZW50OwogIGNvbnN0cnVjdG9yKGNvbXBvbmVudCkgewogICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7CiAgfQogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgYmxvY2sgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKICAgKi8KICBjcmVhdGVCbG9jayh0eXBlNSA9ICJwYXJhZ3JhcGgiLCBjb250ZW50MyA9ICIiLCBtZXRhZGF0YSkgewogICAgcmV0dXJuIHsKICAgICAgaWQ6IFd5c2l3eWdTaG9ydGN1dHMuZ2VuZXJhdGVCbG9ja0lkKCksCiAgICAgIHR5cGU6IHR5cGU1LAogICAgICBjb250ZW50OiBjb250ZW50MywKICAgICAgLi4ubWV0YWRhdGEgJiYgeyBtZXRhZGF0YSB9CiAgICB9OwogIH0KICAvKioKICAgKiBJbnNlcnRzIGEgYmxvY2sgYWZ0ZXIgdGhlIHNwZWNpZmllZCBibG9jawogICAqLwogIGFzeW5jIGluc2VydEJsb2NrQWZ0ZXIoYWZ0ZXJCbG9jaywgbmV3QmxvY2ssIGZvY3VzTmV3QmxvY2sgPSB0cnVlKSB7CiAgICBjb25zdCBibG9ja3MgPSB0aGlzLmNvbXBvbmVudC5ibG9ja3M7CiAgICBjb25zdCBibG9ja0luZGV4ID0gYmxvY2tzLmZpbmRJbmRleCgoYjYpID0+IGI2LmlkID09PSBhZnRlckJsb2NrLmlkKTsKICAgIHRoaXMuY29tcG9uZW50LmJsb2NrcyA9IFsKICAgICAgLi4uYmxvY2tzLnNsaWNlKDAsIGJsb2NrSW5kZXggKyAxKSwKICAgICAgbmV3QmxvY2ssCiAgICAgIC4uLmJsb2Nrcy5zbGljZShibG9ja0luZGV4ICsgMSkKICAgIF07CiAgICBpZiAodGhpcy5jb21wb25lbnQuZWRpdG9yQ29udGVudFJlZikgewogICAgICBjb25zdCBhZnRlcldyYXBwZXIgPSB0aGlzLmNvbXBvbmVudC5lZGl0b3JDb250ZW50UmVmLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke2FmdGVyQmxvY2suaWR9Il1gKTsKICAgICAgaWYgKGFmdGVyV3JhcHBlcikgewogICAgICAgIGNvbnN0IG5ld1dyYXBwZXIgPSB0aGlzLmNvbXBvbmVudC5jcmVhdGVCbG9ja0VsZW1lbnQobmV3QmxvY2spOwogICAgICAgIGFmdGVyV3JhcHBlci5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyZW5kIiwgbmV3V3JhcHBlcik7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuY29tcG9uZW50LnVwZGF0ZVZhbHVlKCk7CiAgICBpZiAoZm9jdXNOZXdCbG9jayAmJiBuZXdCbG9jay50eXBlICE9PSAiZGl2aWRlciIpIHsKICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUyLCAwKSk7CiAgICAgIGF3YWl0IHRoaXMuZm9jdXNCbG9jayhuZXdCbG9jay5pZCwgInN0YXJ0Iik7CiAgICB9CiAgfQogIC8qKgogICAqIFJlbW92ZXMgYSBibG9jayBieSBpdHMgSUQKICAgKi8KICByZW1vdmVCbG9jayhibG9ja0lkKSB7CiAgICB0aGlzLmNvbXBvbmVudC5zYXZlVG9IaXN0b3J5KGZhbHNlKTsKICAgIHRoaXMuY29tcG9uZW50LmJsb2NrcyA9IHRoaXMuY29tcG9uZW50LmJsb2Nrcy5maWx0ZXIoKGI2KSA9PiBiNi5pZCAhPT0gYmxvY2tJZCk7CiAgICBpZiAodGhpcy5jb21wb25lbnQuZWRpdG9yQ29udGVudFJlZikgewogICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5jb21wb25lbnQuZWRpdG9yQ29udGVudFJlZi5xdWVyeVNlbGVjdG9yKGBbZGF0YS1ibG9jay1pZD0iJHtibG9ja0lkfSJdYCk7CiAgICAgIGlmICh3cmFwcGVyKSB7CiAgICAgICAgd3JhcHBlci5yZW1vdmUoKTsKICAgICAgfQogICAgfQogICAgdGhpcy5jb21wb25lbnQudXBkYXRlVmFsdWUoKTsKICB9CiAgLyoqCiAgICogRmluZHMgYSBibG9jayBieSBpdHMgSUQKICAgKi8KICBmaW5kQmxvY2soYmxvY2tJZCkgewogICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LmJsb2Nrcy5maW5kKChiNikgPT4gYjYuaWQgPT09IGJsb2NrSWQpOwogIH0KICAvKioKICAgKiBHZXRzIHRoZSBpbmRleCBvZiBhIGJsb2NrCiAgICovCiAgZ2V0QmxvY2tJbmRleChibG9ja0lkKSB7CiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQuYmxvY2tzLmZpbmRJbmRleCgoYjYpID0+IGI2LmlkID09PSBibG9ja0lkKTsKICB9CiAgLyoqCiAgICogRm9jdXNlcyBhIHNwZWNpZmljIGJsb2NrCiAgICovCiAgYXN5bmMgZm9jdXNCbG9jayhibG9ja0lkLCBjdXJzb3JQb3NpdGlvbiA9ICJzdGFydCIpIHsKICAgIGNvbnN0IHdyYXBwZXJFbGVtZW50ID0gdGhpcy5jb21wb25lbnQuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1ibG9jay1pZD0iJHtibG9ja0lkfSJdYCk7CiAgICBpZiAod3JhcHBlckVsZW1lbnQpIHsKICAgICAgY29uc3QgYmxvY2tDb21wb25lbnQgPSB3cmFwcGVyRWxlbWVudC5xdWVyeVNlbGVjdG9yKCJkZWVzLXd5c2l3eWctYmxvY2siKTsKICAgICAgaWYgKGJsb2NrQ29tcG9uZW50KSB7CiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZTIpKTsKICAgICAgICBibG9ja0NvbXBvbmVudC5mb2N1c1dpdGhDdXJzb3IoY3Vyc29yUG9zaXRpb24pOwogICAgICB9CiAgICB9CiAgfQogIC8qKgogICAqIFVwZGF0ZXMgdGhlIGNvbnRlbnQgb2YgYSBibG9jawogICAqLwogIHVwZGF0ZUJsb2NrQ29udGVudChibG9ja0lkLCBjb250ZW50MykgewogICAgY29uc3QgYmxvY2sgPSB0aGlzLmZpbmRCbG9jayhibG9ja0lkKTsKICAgIGlmIChibG9jaykgewogICAgICBibG9jay5jb250ZW50ID0gY29udGVudDM7CiAgICAgIHRoaXMuY29tcG9uZW50LnVwZGF0ZVZhbHVlKCk7CiAgICB9CiAgfQogIC8qKgogICAqIFRyYW5zZm9ybXMgYSBibG9jayB0byBhIGRpZmZlcmVudCB0eXBlCiAgICovCiAgdHJhbnNmb3JtQmxvY2soYmxvY2tJZCwgbmV3VHlwZSwgbWV0YWRhdGEpIHsKICAgIGNvbnN0IGJsb2NrID0gdGhpcy5maW5kQmxvY2soYmxvY2tJZCk7CiAgICBpZiAoYmxvY2spIHsKICAgICAgdGhpcy5jb21wb25lbnQuc2F2ZVRvSGlzdG9yeShmYWxzZSk7CiAgICAgIGJsb2NrLnR5cGUgPSBuZXdUeXBlOwogICAgICBibG9jay5jb250ZW50ID0gIiI7CiAgICAgIGlmIChtZXRhZGF0YSkgewogICAgICAgIGJsb2NrLm1ldGFkYXRhID0gbWV0YWRhdGE7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuY29tcG9uZW50LmVkaXRvckNvbnRlbnRSZWYpIHsKICAgICAgICB0aGlzLmNvbXBvbmVudC51cGRhdGVCbG9ja0VsZW1lbnQoYmxvY2tJZCk7CiAgICAgIH0KICAgICAgdGhpcy5jb21wb25lbnQudXBkYXRlVmFsdWUoKTsKICAgIH0KICB9CiAgLyoqCiAgICogTW92ZXMgYSBibG9jayB0byBhIG5ldyBwb3NpdGlvbgogICAqLwogIG1vdmVCbG9jayhibG9ja0lkLCB0YXJnZXRJbmRleCkgewogICAgY29uc3QgYmxvY2tzID0gWy4uLnRoaXMuY29tcG9uZW50LmJsb2Nrc107CiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLmdldEJsb2NrSW5kZXgoYmxvY2tJZCk7CiAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSB8fCB0YXJnZXRJbmRleCA8IDAgfHwgdGFyZ2V0SW5kZXggPj0gYmxvY2tzLmxlbmd0aCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBbbW92ZWRCbG9ja10gPSBibG9ja3Muc3BsaWNlKGN1cnJlbnRJbmRleCwgMSk7CiAgICBibG9ja3Muc3BsaWNlKHRhcmdldEluZGV4LCAwLCBtb3ZlZEJsb2NrKTsKICAgIHRoaXMuY29tcG9uZW50LmJsb2NrcyA9IGJsb2NrczsKICAgIHRoaXMuY29tcG9uZW50LnVwZGF0ZVZhbHVlKCk7CiAgfQogIC8qKgogICAqIEdldHMgdGhlIHByZXZpb3VzIGJsb2NrCiAgICovCiAgZ2V0UHJldmlvdXNCbG9jayhibG9ja0lkKSB7CiAgICBjb25zdCBpbmRleDIgPSB0aGlzLmdldEJsb2NrSW5kZXgoYmxvY2tJZCk7CiAgICByZXR1cm4gaW5kZXgyID4gMCA/IHRoaXMuY29tcG9uZW50LmJsb2Nrc1tpbmRleDIgLSAxXSA6IG51bGw7CiAgfQogIC8qKgogICAqIEdldHMgdGhlIG5leHQgYmxvY2sKICAgKi8KICBnZXROZXh0QmxvY2soYmxvY2tJZCkgewogICAgY29uc3QgaW5kZXgyID0gdGhpcy5nZXRCbG9ja0luZGV4KGJsb2NrSWQpOwogICAgcmV0dXJuIGluZGV4MiA8IHRoaXMuY29tcG9uZW50LmJsb2Nrcy5sZW5ndGggLSAxID8gdGhpcy5jb21wb25lbnQuYmxvY2tzW2luZGV4MiArIDFdIDogbnVsbDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL2Jsb2Nrcy9ibG9jay5iYXNlLmpzCnZhciBCYXNlQmxvY2tIYW5kbGVyID0gY2xhc3MgewogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIGNvbW1vbiBzZXR1cAogIHNldHVwKGVsZW1lbnQ0LCBibG9jaywgaGFuZGxlcnMyKSB7CiAgfQogIC8vIENvbW1vbiBzdHlsZXMgY2FuIGJlIGRlZmluZWQgaGVyZQogIGdldFN0eWxlcygpIHsKICAgIHJldHVybiAiIjsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL2Jsb2Nrcy9ibG9jay5yZWdpc3RyeS5qcwp2YXIgQmxvY2tSZWdpc3RyeSA9IGNsYXNzIHsKICBzdGF0aWMgaGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogIHN0YXRpYyByZWdpc3Rlcih0eXBlNSwgaGFuZGxlcjIpIHsKICAgIHRoaXMuaGFuZGxlcnMuc2V0KHR5cGU1LCBoYW5kbGVyMik7CiAgfQogIHN0YXRpYyBnZXRIYW5kbGVyKHR5cGU1KSB7CiAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5nZXQodHlwZTUpOwogIH0KICBzdGF0aWMgZ2V0QWxsVHlwZXMoKSB7CiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmhhbmRsZXJzLmtleXMoKSk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy9ibG9ja3MvdGV4dC9wYXJhZ3JhcGguYmxvY2suanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIFBhcmFncmFwaEJsb2NrSGFuZGxlciA9IGNsYXNzIGV4dGVuZHMgQmFzZUJsb2NrSGFuZGxlciB7CiAgdHlwZSA9ICJwYXJhZ3JhcGgiOwogIC8vIFRyYWNrIGN1cnNvciBwb3NpdGlvbgogIGxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gMDsKICBsYXN0U2VsZWN0ZWRUZXh0ID0gIiI7CiAgc2VsZWN0aW9uSGFuZGxlciA9IG51bGw7CiAgcmVuZGVyKGJsb2NrLCBpc1NlbGVjdGVkKSB7CiAgICBjb25zdCBzZWxlY3RlZENsYXNzID0gaXNTZWxlY3RlZCA/ICIgc2VsZWN0ZWQiIDogIiI7CiAgICBjb25zdCBwbGFjZWhvbGRlciA9IHRoaXMuZ2V0UGxhY2Vob2xkZXIoKTsKICAgIHJldHVybiBgCiAgICAgIDxkaXYKICAgICAgICBjbGFzcz0iYmxvY2sgcGFyYWdyYXBoJHtzZWxlY3RlZENsYXNzfSIKICAgICAgICBjb250ZW50ZWRpdGFibGU9InRydWUiCiAgICAgICAgZGF0YS1wbGFjZWhvbGRlcj0iJHtwbGFjZWhvbGRlcn0iCiAgICAgICAgZGF0YS1ibG9jay1pZD0iJHtibG9jay5pZH0iCiAgICAgICAgZGF0YS1ibG9jay10eXBlPSIke2Jsb2NrLnR5cGV9IgogICAgICA+PC9kaXY+CiAgICBgOwogIH0KICBzZXR1cChlbGVtZW50NCwgYmxvY2ssIGhhbmRsZXJzMikgewogICAgY29uc3QgcGFyYWdyYXBoQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2sucGFyYWdyYXBoIik7CiAgICBpZiAoIXBhcmFncmFwaEJsb2NrKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIlBhcmFncmFwaEJsb2NrSGFuZGxlci5zZXR1cDogTm8gcGFyYWdyYXBoIGJsb2NrIGVsZW1lbnQgZm91bmQiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGJsb2NrLmNvbnRlbnQgJiYgIXBhcmFncmFwaEJsb2NrLmlubmVySFRNTCkgewogICAgICBwYXJhZ3JhcGhCbG9jay5pbm5lckhUTUwgPSBibG9jay5jb250ZW50OwogICAgfQogICAgcGFyYWdyYXBoQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCAoZTExKSA9PiB7CiAgICAgIGhhbmRsZXJzMi5vbklucHV0KGUxMSk7CiAgICAgIGNvbnN0IHBvcyA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQpOwogICAgICBpZiAocG9zICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IHBvczsKICAgICAgfQogICAgfSk7CiAgICBwYXJhZ3JhcGhCbG9jay5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgKGUxMSkgPT4gewogICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KTsKICAgICAgaWYgKHBvcyAhPT0gbnVsbCkgewogICAgICAgIHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gPSBwb3M7CiAgICAgIH0KICAgICAgaGFuZGxlcnMyLm9uS2V5RG93bihlMTEpOwogICAgfSk7CiAgICBwYXJhZ3JhcGhCbG9jay5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsICgpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uRm9jdXMoKTsKICAgIH0pOwogICAgcGFyYWdyYXBoQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uQmx1cigpOwogICAgfSk7CiAgICBwYXJhZ3JhcGhCbG9jay5hZGRFdmVudExpc3RlbmVyKCJjb21wb3NpdGlvbnN0YXJ0IiwgKCkgPT4gewogICAgICBoYW5kbGVyczIub25Db21wb3NpdGlvblN0YXJ0KCk7CiAgICB9KTsKICAgIHBhcmFncmFwaEJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBvc2l0aW9uZW5kIiwgKCkgPT4gewogICAgICBoYW5kbGVyczIub25Db21wb3NpdGlvbkVuZCgpOwogICAgfSk7CiAgICBwYXJhZ3JhcGhCbG9jay5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgKGUxMSkgPT4gewogICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KTsKICAgICAgaWYgKHBvcyAhPT0gbnVsbCkgewogICAgICAgIHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gPSBwb3M7CiAgICAgIH0KICAgICAgaGFuZGxlcnMyLm9uTW91c2VVcD8uKGUxMSk7CiAgICB9KTsKICAgIHBhcmFncmFwaEJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUxMSkgPT4gewogICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KTsKICAgICAgICBpZiAocG9zICE9PSBudWxsKSB7CiAgICAgICAgICB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gcG9zOwogICAgICAgIH0KICAgICAgfSwgMCk7CiAgICB9KTsKICAgIHBhcmFncmFwaEJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIiwgKGUxMSkgPT4gewogICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KTsKICAgICAgaWYgKHBvcyAhPT0gbnVsbCkgewogICAgICAgIHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gPSBwb3M7CiAgICAgIH0KICAgIH0pOwogICAgdGhpcy5zZXR1cFNlbGVjdGlvbkhhbmRsZXIoZWxlbWVudDQsIHBhcmFncmFwaEJsb2NrLCBibG9jayk7CiAgfQogIHNldHVwU2VsZWN0aW9uSGFuZGxlcihlbGVtZW50NCwgcGFyYWdyYXBoQmxvY2ssIGJsb2NrKSB7CiAgICBjb25zdCBjaGVja1NlbGVjdGlvbiA9ICgpID0+IHsKICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvbi50b1N0cmluZygpOwogICAgICBpZiAoc2VsZWN0ZWRUZXh0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgIGlmICh0aGlzLmxhc3RTZWxlY3RlZFRleHQpIHsKICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkVGV4dCA9ICIiOwogICAgICAgICAgdGhpcy5kaXNwYXRjaFNlbGVjdGlvbkV2ZW50KGVsZW1lbnQ0LCB7CiAgICAgICAgICAgIHRleHQ6ICIiLAogICAgICAgICAgICBibG9ja0lkOiBibG9jay5pZCwKICAgICAgICAgICAgaGFzU2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCB3eXNpd3lnQmxvY2syID0gcGFyYWdyYXBoQmxvY2suZ2V0Um9vdE5vZGUoKS5ob3N0OwogICAgICBjb25zdCBwYXJlbnRDb21wb25lbnQgPSB3eXNpd3lnQmxvY2syPy5jbG9zZXN0KCJkZWVzLWlucHV0LXd5c2l3eWciKTsKICAgICAgY29uc3QgcGFyZW50U2hhZG93Um9vdCA9IHBhcmVudENvbXBvbmVudD8uc2hhZG93Um9vdDsKICAgICAgY29uc3QgYmxvY2tTaGFkb3dSb290ID0gd3lzaXd5Z0Jsb2NrMj8uc2hhZG93Um9vdDsKICAgICAgY29uc3Qgc2hhZG93Um9vdHMgPSBbXTsKICAgICAgaWYgKHBhcmVudFNoYWRvd1Jvb3QpCiAgICAgICAgc2hhZG93Um9vdHMucHVzaChwYXJlbnRTaGFkb3dSb290KTsKICAgICAgaWYgKGJsb2NrU2hhZG93Um9vdCkKICAgICAgICBzaGFkb3dSb290cy5wdXNoKGJsb2NrU2hhZG93Um9vdCk7CiAgICAgIGNvbnN0IHNlbGVjdGlvbkluZm8gPSBXeXNpd3lnU2VsZWN0aW9uLmdldFNlbGVjdGlvbkluZm8oLi4uc2hhZG93Um9vdHMpOwogICAgICBpZiAoIXNlbGVjdGlvbkluZm8pCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBzdGFydEluQmxvY2sgPSBXeXNpd3lnU2VsZWN0aW9uLmNvbnRhaW5zQWNyb3NzU2hhZG93RE9NKHBhcmFncmFwaEJsb2NrLCBzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyKTsKICAgICAgY29uc3QgZW5kSW5CbG9jayA9IFd5c2l3eWdTZWxlY3Rpb24uY29udGFpbnNBY3Jvc3NTaGFkb3dET00ocGFyYWdyYXBoQmxvY2ssIHNlbGVjdGlvbkluZm8uZW5kQ29udGFpbmVyKTsKICAgICAgaWYgKHN0YXJ0SW5CbG9jayB8fCBlbmRJbkJsb2NrKSB7CiAgICAgICAgaWYgKHNlbGVjdGVkVGV4dCAhPT0gdGhpcy5sYXN0U2VsZWN0ZWRUZXh0KSB7CiAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZFRleHQgPSBzZWxlY3RlZFRleHQ7CiAgICAgICAgICBjb25zdCByYW5nZTIgPSBXeXNpd3lnU2VsZWN0aW9uLmNyZWF0ZVJhbmdlRnJvbUluZm8oc2VsZWN0aW9uSW5mbyk7CiAgICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgdGhpcy5kaXNwYXRjaFNlbGVjdGlvbkV2ZW50KGVsZW1lbnQ0LCB7CiAgICAgICAgICAgIHRleHQ6IHNlbGVjdGVkVGV4dC50cmltKCksCiAgICAgICAgICAgIGJsb2NrSWQ6IGJsb2NrLmlkLAogICAgICAgICAgICByYW5nZTogcmFuZ2UyLAogICAgICAgICAgICByZWN0LAogICAgICAgICAgICBoYXNTZWxlY3Rpb246IHRydWUKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0aGlzLmxhc3RTZWxlY3RlZFRleHQpIHsKICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZFRleHQgPSAiIjsKICAgICAgICB0aGlzLmRpc3BhdGNoU2VsZWN0aW9uRXZlbnQoZWxlbWVudDQsIHsKICAgICAgICAgIHRleHQ6ICIiLAogICAgICAgICAgYmxvY2tJZDogYmxvY2suaWQsCiAgICAgICAgICBoYXNTZWxlY3Rpb246IGZhbHNlCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3Rpb25jaGFuZ2UiLCBjaGVja1NlbGVjdGlvbik7CiAgICB0aGlzLnNlbGVjdGlvbkhhbmRsZXIgPSBjaGVja1NlbGVjdGlvbjsKICAgIGNvbnN0IHd5c2l3eWdCbG9jayA9IGVsZW1lbnQ0LmNsb3Nlc3QoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgaWYgKHd5c2l3eWdCbG9jaykgewogICAgICBjb25zdCBvcmlnaW5hbERpc2Nvbm5lY3RlZENhbGxiYWNrID0gd3lzaXd5Z0Jsb2NrLmRpc2Nvbm5lY3RlZENhbGxiYWNrOwogICAgICB3eXNpd3lnQmxvY2suZGlzY29ubmVjdGVkQ2FsbGJhY2sgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25IYW5kbGVyKSB7CiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3Rpb25jaGFuZ2UiLCB0aGlzLnNlbGVjdGlvbkhhbmRsZXIpOwogICAgICAgICAgdGhpcy5zZWxlY3Rpb25IYW5kbGVyID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKG9yaWdpbmFsRGlzY29ubmVjdGVkQ2FsbGJhY2spIHsKICAgICAgICAgIGF3YWl0IG9yaWdpbmFsRGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh3eXNpd3lnQmxvY2spOwogICAgICAgIH0KICAgICAgfS5iaW5kKHRoaXMpOwogICAgfQogIH0KICBkaXNwYXRjaFNlbGVjdGlvbkV2ZW50KGVsZW1lbnQ0LCBkZXRhaWwpIHsKICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCJibG9jay10ZXh0LXNlbGVjdGVkIiwgewogICAgICBkZXRhaWwsCiAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICB9KTsKICAgIGVsZW1lbnQ0LmRpc3BhdGNoRXZlbnQoZXZlbnQpOwogIH0KICBnZXRTdHlsZXMoKSB7CiAgICByZXR1cm4gYAogICAgICAvKiBQYXJhZ3JhcGggc3BlY2lmaWMgc3R5bGVzICovCiAgICAgIC5ibG9jay5wYXJhZ3JhcGggewogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBsaW5lLWhlaWdodDogMS42OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KICAgIGA7CiAgfQogIGdldFBsYWNlaG9sZGVyKCkgewogICAgcmV0dXJuICJUeXBlICcvJyBmb3IgY29tbWFuZHMuLi4iOwogIH0KICAvKioKICAgKiBIZWxwZXIgdG8gZ2V0IHRoZSBsYXN0IHRleHQgbm9kZSBpbiBhbiBlbGVtZW50CiAgICovCiAgZ2V0TGFzdFRleHROb2RlKGVsZW1lbnQ0KSB7CiAgICBpZiAoZWxlbWVudDQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7CiAgICAgIHJldHVybiBlbGVtZW50NDsKICAgIH0KICAgIGZvciAobGV0IGkxMSA9IGVsZW1lbnQ0LmNoaWxkTm9kZXMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICAgIGNvbnN0IGxhc3RUZXh0ID0gdGhpcy5nZXRMYXN0VGV4dE5vZGUoZWxlbWVudDQuY2hpbGROb2Rlc1tpMTFdKTsKICAgICAgaWYgKGxhc3RUZXh0KQogICAgICAgIHJldHVybiBsYXN0VGV4dDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICAvLyBIZWxwZXIgbWV0aG9kcyBmb3IgcGFyYWdyYXBoIGZ1bmN0aW9uYWxpdHkKICBnZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCwgY29udGV4dDIpIHsKICAgIGNvbnN0IHBhcmFncmFwaEJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLnBhcmFncmFwaCIpOwogICAgaWYgKCFwYXJhZ3JhcGhCbG9jaykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHd5c2l3eWdCbG9jayA9IGNvbnRleHQyPy5jb21wb25lbnQ7CiAgICBjb25zdCBwYXJlbnRDb21wb25lbnQgPSB3eXNpd3lnQmxvY2s/LmNsb3Nlc3QoImRlZXMtaW5wdXQtd3lzaXd5ZyIpOwogICAgY29uc3QgcGFyZW50U2hhZG93Um9vdCA9IHBhcmVudENvbXBvbmVudD8uc2hhZG93Um9vdDsKICAgIGNvbnN0IGJsb2NrU2hhZG93Um9vdCA9IGNvbnRleHQyPy5zaGFkb3dSb290OwogICAgY29uc3Qgc2hhZG93Um9vdHMgPSBbXTsKICAgIGlmIChwYXJlbnRTaGFkb3dSb290KQogICAgICBzaGFkb3dSb290cy5wdXNoKHBhcmVudFNoYWRvd1Jvb3QpOwogICAgaWYgKGJsb2NrU2hhZG93Um9vdCkKICAgICAgc2hhZG93Um9vdHMucHVzaChibG9ja1NoYWRvd1Jvb3QpOwogICAgY29uc3Qgc2VsZWN0aW9uSW5mbyA9IFd5c2l3eWdTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uSW5mbyguLi5zaGFkb3dSb290cyk7CiAgICBpZiAoIXNlbGVjdGlvbkluZm8pIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoIVd5c2l3eWdTZWxlY3Rpb24uY29udGFpbnNBY3Jvc3NTaGFkb3dET00ocGFyYWdyYXBoQmxvY2ssIHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgcHJlQ2FyZXRSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICBwcmVDYXJldFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhwYXJhZ3JhcGhCbG9jayk7CiAgICBwcmVDYXJldFJhbmdlLnNldEVuZChzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyLCBzZWxlY3Rpb25JbmZvLnN0YXJ0T2Zmc2V0KTsKICAgIGNvbnN0IHBvc2l0aW9uMyA9IHByZUNhcmV0UmFuZ2UudG9TdHJpbmcoKS5sZW5ndGg7CiAgICByZXR1cm4gcG9zaXRpb24zOwogIH0KICBnZXRDb250ZW50KGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgcGFyYWdyYXBoQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2sucGFyYWdyYXBoIik7CiAgICBpZiAoIXBhcmFncmFwaEJsb2NrKQogICAgICByZXR1cm4gIiI7CiAgICBjb25zdCBjb250ZW50MyA9IHBhcmFncmFwaEJsb2NrLmlubmVySFRNTCB8fCAiIjsKICAgIHJldHVybiBjb250ZW50MzsKICB9CiAgc2V0Q29udGVudChlbGVtZW50NCwgY29udGVudDMsIGNvbnRleHQyKSB7CiAgICBjb25zdCBwYXJhZ3JhcGhCbG9jayA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jay5wYXJhZ3JhcGgiKTsKICAgIGlmICghcGFyYWdyYXBoQmxvY2spCiAgICAgIHJldHVybjsKICAgIGNvbnN0IGhhZEZvY3VzID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gcGFyYWdyYXBoQmxvY2sgfHwgZWxlbWVudDQuc2hhZG93Um9vdD8uYWN0aXZlRWxlbWVudCA9PT0gcGFyYWdyYXBoQmxvY2s7CiAgICBwYXJhZ3JhcGhCbG9jay5pbm5lckhUTUwgPSBjb250ZW50MzsKICAgIGlmIChoYWRGb2N1cykgewogICAgICBwYXJhZ3JhcGhCbG9jay5mb2N1cygpOwogICAgfQogIH0KICBzZXRDdXJzb3JUb1N0YXJ0KGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgcGFyYWdyYXBoQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2sucGFyYWdyYXBoIik7CiAgICBpZiAocGFyYWdyYXBoQmxvY2spIHsKICAgICAgV3lzaXd5Z0Jsb2Nrcy5zZXRDdXJzb3JUb1N0YXJ0KHBhcmFncmFwaEJsb2NrKTsKICAgIH0KICB9CiAgc2V0Q3Vyc29yVG9FbmQoZWxlbWVudDQsIGNvbnRleHQyKSB7CiAgICBjb25zdCBwYXJhZ3JhcGhCbG9jayA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jay5wYXJhZ3JhcGgiKTsKICAgIGlmIChwYXJhZ3JhcGhCbG9jaykgewogICAgICBXeXNpd3lnQmxvY2tzLnNldEN1cnNvclRvRW5kKHBhcmFncmFwaEJsb2NrKTsKICAgIH0KICB9CiAgZm9jdXMoZWxlbWVudDQsIGNvbnRleHQyKSB7CiAgICBjb25zdCBwYXJhZ3JhcGhCbG9jayA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jay5wYXJhZ3JhcGgiKTsKICAgIGlmICghcGFyYWdyYXBoQmxvY2spCiAgICAgIHJldHVybjsKICAgIGlmICghcGFyYWdyYXBoQmxvY2suaGFzQXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiKSkgewogICAgICBwYXJhZ3JhcGhCbG9jay5zZXRBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIsICJ0cnVlIik7CiAgICB9CiAgICBwYXJhZ3JhcGhCbG9jay5mb2N1cygpOwogICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IHBhcmFncmFwaEJsb2NrICYmIGVsZW1lbnQ0LnNoYWRvd1Jvb3Q/LmFjdGl2ZUVsZW1lbnQgIT09IHBhcmFncmFwaEJsb2NrKSB7CiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gewogICAgICAgIHBhcmFncmFwaEJsb2NrLmZvY3VzKCk7CiAgICAgIH0pOwogICAgfQogIH0KICBmb2N1c1dpdGhDdXJzb3IoZWxlbWVudDQsIHBvc2l0aW9uMyA9ICJlbmQiLCBjb250ZXh0MikgewogICAgY29uc3QgcGFyYWdyYXBoQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2sucGFyYWdyYXBoIik7CiAgICBpZiAoIXBhcmFncmFwaEJsb2NrKQogICAgICByZXR1cm47CiAgICBpZiAoIXBhcmFncmFwaEJsb2NrLmhhc0F0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIikpIHsKICAgICAgcGFyYWdyYXBoQmxvY2suc2V0QXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiLCAidHJ1ZSIpOwogICAgfQogICAgaWYgKHBvc2l0aW9uMyA9PT0gImVuZCIgJiYgcGFyYWdyYXBoQmxvY2sudGV4dENvbnRlbnQgJiYgcGFyYWdyYXBoQmxvY2sudGV4dENvbnRlbnQubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgIGlmIChzZWwpIHsKICAgICAgICBjb25zdCByYW5nZTIgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICAgIGNvbnN0IGxhc3ROb2RlID0gdGhpcy5nZXRMYXN0VGV4dE5vZGUocGFyYWdyYXBoQmxvY2spIHx8IHBhcmFncmFwaEJsb2NrOwogICAgICAgIGlmIChsYXN0Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHsKICAgICAgICAgIHJhbmdlMi5zZXRTdGFydChsYXN0Tm9kZSwgbGFzdE5vZGUudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwKTsKICAgICAgICAgIHJhbmdlMi5zZXRFbmQobGFzdE5vZGUsIGxhc3ROb2RlLnRleHRDb250ZW50Py5sZW5ndGggfHwgMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJhbmdlMi5zZWxlY3ROb2RlQ29udGVudHMobGFzdE5vZGUpOwogICAgICAgICAgcmFuZ2UyLmNvbGxhcHNlKGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZTIpOwogICAgICB9CiAgICB9CiAgICBwYXJhZ3JhcGhCbG9jay5mb2N1cygpOwogICAgY29uc3Qgc2V0Q3Vyc29yID0gKCkgPT4gewogICAgICBpZiAocG9zaXRpb24zID09PSAic3RhcnQiKSB7CiAgICAgICAgdGhpcy5zZXRDdXJzb3JUb1N0YXJ0KGVsZW1lbnQ0LCBjb250ZXh0Mik7CiAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24zID09PSAiZW5kIiAmJiAoIXBhcmFncmFwaEJsb2NrLnRleHRDb250ZW50IHx8IHBhcmFncmFwaEJsb2NrLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gMCkpIHsKICAgICAgICB0aGlzLnNldEN1cnNvclRvRW5kKGVsZW1lbnQ0LCBjb250ZXh0Mik7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBvc2l0aW9uMyA9PT0gIm51bWJlciIpIHsKICAgICAgICBXeXNpd3lnU2VsZWN0aW9uLnNldEN1cnNvclBvc2l0aW9uKHBhcmFncmFwaEJsb2NrLCBwb3NpdGlvbjMpOwogICAgICB9CiAgICB9OwogICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHBhcmFncmFwaEJsb2NrIHx8IGVsZW1lbnQ0LnNoYWRvd1Jvb3Q/LmFjdGl2ZUVsZW1lbnQgPT09IHBhcmFncmFwaEJsb2NrKSB7CiAgICAgIHNldEN1cnNvcigpOwogICAgfSBlbHNlIHsKICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHBhcmFncmFwaEJsb2NrIHx8IGVsZW1lbnQ0LnNoYWRvd1Jvb3Q/LmFjdGl2ZUVsZW1lbnQgPT09IHBhcmFncmFwaEJsb2NrKSB7CiAgICAgICAgICBzZXRDdXJzb3IoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBwYXJhZ3JhcGhCbG9jayB8fCBlbGVtZW50NC5zaGFkb3dSb290Py5hY3RpdmVFbGVtZW50ID09PSBwYXJhZ3JhcGhCbG9jaykgewogICAgICAgICAgICAgIHNldEN1cnNvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCAxMCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9CiAgZ2V0U3BsaXRDb250ZW50KGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgcGFyYWdyYXBoQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2sucGFyYWdyYXBoIik7CiAgICBpZiAoIXBhcmFncmFwaEJsb2NrKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3Qgd3lzaXd5Z0Jsb2NrID0gY29udGV4dDI/LmNvbXBvbmVudDsKICAgIGNvbnN0IHBhcmVudENvbXBvbmVudCA9IHd5c2l3eWdCbG9jaz8uY2xvc2VzdCgiZGVlcy1pbnB1dC13eXNpd3lnIik7CiAgICBjb25zdCBwYXJlbnRTaGFkb3dSb290ID0gcGFyZW50Q29tcG9uZW50Py5zaGFkb3dSb290OwogICAgY29uc3QgYmxvY2tTaGFkb3dSb290ID0gY29udGV4dDI/LnNoYWRvd1Jvb3Q7CiAgICBjb25zdCBzaGFkb3dSb290cyA9IFtdOwogICAgaWYgKHBhcmVudFNoYWRvd1Jvb3QpCiAgICAgIHNoYWRvd1Jvb3RzLnB1c2gocGFyZW50U2hhZG93Um9vdCk7CiAgICBpZiAoYmxvY2tTaGFkb3dSb290KQogICAgICBzaGFkb3dSb290cy5wdXNoKGJsb2NrU2hhZG93Um9vdCk7CiAgICBjb25zdCBzZWxlY3Rpb25JbmZvID0gV3lzaXd5Z1NlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvKC4uLnNoYWRvd1Jvb3RzKTsKICAgIGlmICghc2VsZWN0aW9uSW5mbykgewogICAgICBpZiAodGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IGZ1bGxUZXh0ID0gcGFyYWdyYXBoQmxvY2sudGV4dENvbnRlbnQgfHwgIiI7CiAgICAgICAgY29uc3QgcG9zID0gTWF0aC5taW4odGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiwgZnVsbFRleHQubGVuZ3RoKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgYmVmb3JlOiBmdWxsVGV4dC5zdWJzdHJpbmcoMCwgcG9zKSwKICAgICAgICAgIGFmdGVyOiBmdWxsVGV4dC5zdWJzdHJpbmcocG9zKQogICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoIVd5c2l3eWdTZWxlY3Rpb24uY29udGFpbnNBY3Jvc3NTaGFkb3dET00ocGFyYWdyYXBoQmxvY2ssIHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIpKSB7CiAgICAgIGlmICh0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uICE9PSBudWxsKSB7CiAgICAgICAgY29uc3QgZnVsbFRleHQgPSBwYXJhZ3JhcGhCbG9jay50ZXh0Q29udGVudCB8fCAiIjsKICAgICAgICBjb25zdCBwb3MgPSBNYXRoLm1pbih0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uLCBmdWxsVGV4dC5sZW5ndGgpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBiZWZvcmU6IGZ1bGxUZXh0LnN1YnN0cmluZygwLCBwb3MpLAogICAgICAgICAgYWZ0ZXI6IGZ1bGxUZXh0LnN1YnN0cmluZyhwb3MpCiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IGN1cnNvclBvcyA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQsIGNvbnRleHQyKTsKICAgIGlmIChjdXJzb3JQb3MgPT09IG51bGwgfHwgY3Vyc29yUG9zID09PSAwKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgYmVmb3JlOiAiIiwKICAgICAgICBhZnRlcjogcGFyYWdyYXBoQmxvY2suaW5uZXJIVE1MCiAgICAgIH07CiAgICB9CiAgICBjb25zdCBiZWZvcmVSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICBjb25zdCBhZnRlclJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgIGJlZm9yZVJhbmdlLnNldFN0YXJ0KHBhcmFncmFwaEJsb2NrLCAwKTsKICAgIGJlZm9yZVJhbmdlLnNldEVuZChzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyLCBzZWxlY3Rpb25JbmZvLnN0YXJ0T2Zmc2V0KTsKICAgIGFmdGVyUmFuZ2Uuc2V0U3RhcnQoc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lciwgc2VsZWN0aW9uSW5mby5zdGFydE9mZnNldCk7CiAgICBhZnRlclJhbmdlLnNldEVuZChwYXJhZ3JhcGhCbG9jaywgcGFyYWdyYXBoQmxvY2suY2hpbGROb2Rlcy5sZW5ndGgpOwogICAgY29uc3QgYmVmb3JlRnJhZ21lbnQgPSBiZWZvcmVSYW5nZS5jbG9uZUNvbnRlbnRzKCk7CiAgICBjb25zdCBhZnRlckZyYWdtZW50ID0gYWZ0ZXJSYW5nZS5jbG9uZUNvbnRlbnRzKCk7CiAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICB0ZW1wRGl2LmFwcGVuZENoaWxkKGJlZm9yZUZyYWdtZW50KTsKICAgIGNvbnN0IGJlZm9yZUh0bWwgPSB0ZW1wRGl2LmlubmVySFRNTDsKICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gIiI7CiAgICB0ZW1wRGl2LmFwcGVuZENoaWxkKGFmdGVyRnJhZ21lbnQpOwogICAgY29uc3QgYWZ0ZXJIdG1sID0gdGVtcERpdi5pbm5lckhUTUw7CiAgICByZXR1cm4gewogICAgICBiZWZvcmU6IGJlZm9yZUh0bWwsCiAgICAgIGFmdGVyOiBhZnRlckh0bWwKICAgIH07CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy9ibG9ja3MvdGV4dC9oZWFkaW5nLmJsb2NrLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBIZWFkaW5nQmxvY2tIYW5kbGVyID0gY2xhc3MgZXh0ZW5kcyBCYXNlQmxvY2tIYW5kbGVyIHsKICB0eXBlOwogIGxldmVsOwogIC8vIFRyYWNrIGN1cnNvciBwb3NpdGlvbgogIGxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gMDsKICBsYXN0U2VsZWN0ZWRUZXh0ID0gIiI7CiAgc2VsZWN0aW9uSGFuZGxlciA9IG51bGw7CiAgY29uc3RydWN0b3IodHlwZTUpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLnR5cGUgPSB0eXBlNTsKICAgIHRoaXMubGV2ZWwgPSBwYXJzZUludCh0eXBlNS5zcGxpdCgiLSIpWzFdKTsKICB9CiAgcmVuZGVyKGJsb2NrLCBpc1NlbGVjdGVkKSB7CiAgICBjb25zdCBzZWxlY3RlZENsYXNzID0gaXNTZWxlY3RlZCA/ICIgc2VsZWN0ZWQiIDogIiI7CiAgICBjb25zdCBwbGFjZWhvbGRlciA9IHRoaXMuZ2V0UGxhY2Vob2xkZXIoKTsKICAgIHJldHVybiBgCiAgICAgIDxkaXYKICAgICAgICBjbGFzcz0iYmxvY2sgaGVhZGluZy0ke3RoaXMubGV2ZWx9JHtzZWxlY3RlZENsYXNzfSIKICAgICAgICBjb250ZW50ZWRpdGFibGU9InRydWUiCiAgICAgICAgZGF0YS1wbGFjZWhvbGRlcj0iJHtwbGFjZWhvbGRlcn0iCiAgICAgICAgZGF0YS1ibG9jay1pZD0iJHtibG9jay5pZH0iCiAgICAgICAgZGF0YS1ibG9jay10eXBlPSIke2Jsb2NrLnR5cGV9IgogICAgICA+PC9kaXY+CiAgICBgOwogIH0KICBzZXR1cChlbGVtZW50NCwgYmxvY2ssIGhhbmRsZXJzMikgewogICAgY29uc3QgaGVhZGluZ0Jsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcihgLmJsb2NrLmhlYWRpbmctJHt0aGlzLmxldmVsfWApOwogICAgaWYgKCFoZWFkaW5nQmxvY2spIHsKICAgICAgY29uc29sZS5lcnJvcigiSGVhZGluZ0Jsb2NrSGFuZGxlci5zZXR1cDogTm8gaGVhZGluZyBibG9jayBlbGVtZW50IGZvdW5kIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChibG9jay5jb250ZW50ICYmICFoZWFkaW5nQmxvY2suaW5uZXJIVE1MKSB7CiAgICAgIGhlYWRpbmdCbG9jay5pbm5lckhUTUwgPSBibG9jay5jb250ZW50OwogICAgfQogICAgaGVhZGluZ0Jsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgKGUxMSkgPT4gewogICAgICBoYW5kbGVyczIub25JbnB1dChlMTEpOwogICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KTsKICAgICAgaWYgKHBvcyAhPT0gbnVsbCkgewogICAgICAgIHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gPSBwb3M7CiAgICAgIH0KICAgIH0pOwogICAgaGVhZGluZ0Jsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCAoZTExKSA9PiB7CiAgICAgIGNvbnN0IHBvcyA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQpOwogICAgICBpZiAocG9zICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IHBvczsKICAgICAgfQogICAgICBoYW5kbGVyczIub25LZXlEb3duKGUxMSk7CiAgICB9KTsKICAgIGhlYWRpbmdCbG9jay5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsICgpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uRm9jdXMoKTsKICAgIH0pOwogICAgaGVhZGluZ0Jsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLCAoKSA9PiB7CiAgICAgIGhhbmRsZXJzMi5vbkJsdXIoKTsKICAgIH0pOwogICAgaGVhZGluZ0Jsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBvc2l0aW9uc3RhcnQiLCAoKSA9PiB7CiAgICAgIGhhbmRsZXJzMi5vbkNvbXBvc2l0aW9uU3RhcnQoKTsKICAgIH0pOwogICAgaGVhZGluZ0Jsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBvc2l0aW9uZW5kIiwgKCkgPT4gewogICAgICBoYW5kbGVyczIub25Db21wb3NpdGlvbkVuZCgpOwogICAgfSk7CiAgICBoZWFkaW5nQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIChlMTEpID0+IHsKICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCk7CiAgICAgIGlmIChwb3MgIT09IG51bGwpIHsKICAgICAgICB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gcG9zOwogICAgICB9CiAgICAgIGhhbmRsZXJzMi5vbk1vdXNlVXA/LihlMTEpOwogICAgfSk7CiAgICBoZWFkaW5nQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZTExKSA9PiB7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIGNvbnN0IHBvcyA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQpOwogICAgICAgIGlmIChwb3MgIT09IG51bGwpIHsKICAgICAgICAgIHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gPSBwb3M7CiAgICAgICAgfQogICAgICB9LCAwKTsKICAgIH0pOwogICAgaGVhZGluZ0Jsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIiwgKGUxMSkgPT4gewogICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KTsKICAgICAgaWYgKHBvcyAhPT0gbnVsbCkgewogICAgICAgIHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gPSBwb3M7CiAgICAgIH0KICAgIH0pOwogICAgdGhpcy5zZXR1cFNlbGVjdGlvbkhhbmRsZXIoZWxlbWVudDQsIGhlYWRpbmdCbG9jaywgYmxvY2spOwogIH0KICBzZXR1cFNlbGVjdGlvbkhhbmRsZXIoZWxlbWVudDQsIGhlYWRpbmdCbG9jaywgYmxvY2spIHsKICAgIGNvbnN0IGNoZWNrU2VsZWN0aW9uID0gKCkgPT4gewogICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICAgIGlmIChzZWxlY3RlZFRleHQubGVuZ3RoID09PSAwKSB7CiAgICAgICAgaWYgKHRoaXMubGFzdFNlbGVjdGVkVGV4dCkgewogICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRUZXh0ID0gIiI7CiAgICAgICAgICB0aGlzLmRpc3BhdGNoU2VsZWN0aW9uRXZlbnQoZWxlbWVudDQsIHsKICAgICAgICAgICAgdGV4dDogIiIsCiAgICAgICAgICAgIGJsb2NrSWQ6IGJsb2NrLmlkLAogICAgICAgICAgICBoYXNTZWxlY3Rpb246IGZhbHNlCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHd5c2l3eWdCbG9jazIgPSBoZWFkaW5nQmxvY2suZ2V0Um9vdE5vZGUoKS5ob3N0OwogICAgICBjb25zdCBwYXJlbnRDb21wb25lbnQgPSB3eXNpd3lnQmxvY2syPy5jbG9zZXN0KCJkZWVzLWlucHV0LXd5c2l3eWciKTsKICAgICAgY29uc3QgcGFyZW50U2hhZG93Um9vdCA9IHBhcmVudENvbXBvbmVudD8uc2hhZG93Um9vdDsKICAgICAgY29uc3QgYmxvY2tTaGFkb3dSb290ID0gd3lzaXd5Z0Jsb2NrMj8uc2hhZG93Um9vdDsKICAgICAgY29uc3Qgc2hhZG93Um9vdHMgPSBbXTsKICAgICAgaWYgKHBhcmVudFNoYWRvd1Jvb3QpCiAgICAgICAgc2hhZG93Um9vdHMucHVzaChwYXJlbnRTaGFkb3dSb290KTsKICAgICAgaWYgKGJsb2NrU2hhZG93Um9vdCkKICAgICAgICBzaGFkb3dSb290cy5wdXNoKGJsb2NrU2hhZG93Um9vdCk7CiAgICAgIGNvbnN0IHNlbGVjdGlvbkluZm8gPSBXeXNpd3lnU2VsZWN0aW9uLmdldFNlbGVjdGlvbkluZm8oLi4uc2hhZG93Um9vdHMpOwogICAgICBpZiAoIXNlbGVjdGlvbkluZm8pCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBzdGFydEluQmxvY2sgPSBXeXNpd3lnU2VsZWN0aW9uLmNvbnRhaW5zQWNyb3NzU2hhZG93RE9NKGhlYWRpbmdCbG9jaywgc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lcik7CiAgICAgIGNvbnN0IGVuZEluQmxvY2sgPSBXeXNpd3lnU2VsZWN0aW9uLmNvbnRhaW5zQWNyb3NzU2hhZG93RE9NKGhlYWRpbmdCbG9jaywgc2VsZWN0aW9uSW5mby5lbmRDb250YWluZXIpOwogICAgICBpZiAoc3RhcnRJbkJsb2NrIHx8IGVuZEluQmxvY2spIHsKICAgICAgICBpZiAoc2VsZWN0ZWRUZXh0ICE9PSB0aGlzLmxhc3RTZWxlY3RlZFRleHQpIHsKICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkVGV4dCA9IHNlbGVjdGVkVGV4dDsKICAgICAgICAgIGNvbnN0IHJhbmdlMiA9IFd5c2l3eWdTZWxlY3Rpb24uY3JlYXRlUmFuZ2VGcm9tSW5mbyhzZWxlY3Rpb25JbmZvKTsKICAgICAgICAgIGNvbnN0IHJlY3QgPSByYW5nZTIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICB0aGlzLmRpc3BhdGNoU2VsZWN0aW9uRXZlbnQoZWxlbWVudDQsIHsKICAgICAgICAgICAgdGV4dDogc2VsZWN0ZWRUZXh0LnRyaW0oKSwKICAgICAgICAgICAgYmxvY2tJZDogYmxvY2suaWQsCiAgICAgICAgICAgIHJhbmdlOiByYW5nZTIsCiAgICAgICAgICAgIHJlY3QsCiAgICAgICAgICAgIGhhc1NlbGVjdGlvbjogdHJ1ZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRoaXMubGFzdFNlbGVjdGVkVGV4dCkgewogICAgICAgIHRoaXMubGFzdFNlbGVjdGVkVGV4dCA9ICIiOwogICAgICAgIHRoaXMuZGlzcGF0Y2hTZWxlY3Rpb25FdmVudChlbGVtZW50NCwgewogICAgICAgICAgdGV4dDogIiIsCiAgICAgICAgICBibG9ja0lkOiBibG9jay5pZCwKICAgICAgICAgIGhhc1NlbGVjdGlvbjogZmFsc2UKICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIsIGNoZWNrU2VsZWN0aW9uKTsKICAgIHRoaXMuc2VsZWN0aW9uSGFuZGxlciA9IGNoZWNrU2VsZWN0aW9uOwogICAgY29uc3Qgd3lzaXd5Z0Jsb2NrID0gaGVhZGluZ0Jsb2NrLmdldFJvb3ROb2RlKCkuaG9zdDsKICAgIGlmICh3eXNpd3lnQmxvY2spIHsKICAgICAgY29uc3Qgb3JpZ2luYWxEaXNjb25uZWN0ZWRDYWxsYmFjayA9IHd5c2l3eWdCbG9jay5kaXNjb25uZWN0ZWRDYWxsYmFjazsKICAgICAgd3lzaXd5Z0Jsb2NrLmRpc2Nvbm5lY3RlZENhbGxiYWNrID0gYXN5bmMgZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uSGFuZGxlcikgewogICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIiwgdGhpcy5zZWxlY3Rpb25IYW5kbGVyKTsKICAgICAgICAgIHRoaXMuc2VsZWN0aW9uSGFuZGxlciA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChvcmlnaW5hbERpc2Nvbm5lY3RlZENhbGxiYWNrKSB7CiAgICAgICAgICBhd2FpdCBvcmlnaW5hbERpc2Nvbm5lY3RlZENhbGxiYWNrLmNhbGwod3lzaXd5Z0Jsb2NrKTsKICAgICAgICB9CiAgICAgIH0uYmluZCh0aGlzKTsKICAgIH0KICB9CiAgZGlzcGF0Y2hTZWxlY3Rpb25FdmVudChlbGVtZW50NCwgZGV0YWlsKSB7CiAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgiYmxvY2stdGV4dC1zZWxlY3RlZCIsIHsKICAgICAgZGV0YWlsLAogICAgICBidWJibGVzOiB0cnVlLAogICAgICBjb21wb3NlZDogdHJ1ZQogICAgfSk7CiAgICBlbGVtZW50NC5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICB9CiAgZ2V0U3R5bGVzKCkgewogICAgcmV0dXJuIGAKICAgICAgLmJsb2NrLmhlYWRpbmctMSB7CiAgICAgICAgZm9udC1zaXplOiAzMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMjsKICAgICAgICBtYXJnaW46IDI0cHggMCA4cHggMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAwMDAiLCAiI2ZmZmZmZiIpfTsKICAgICAgfQoKICAgICAgLmJsb2NrLmhlYWRpbmctMiB7CiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMzsKICAgICAgICBtYXJnaW46IDIwcHggMCA2cHggMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAwMDAiLCAiI2ZmZmZmZiIpfTsKICAgICAgfQoKICAgICAgLmJsb2NrLmhlYWRpbmctMyB7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgICAgICBtYXJnaW46IDE2cHggMCA0cHggMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAwMDAiLCAiI2ZmZmZmZiIpfTsKICAgICAgfQogICAgYDsKICB9CiAgZ2V0UGxhY2Vob2xkZXIoKSB7CiAgICBzd2l0Y2ggKHRoaXMubGV2ZWwpIHsKICAgICAgY2FzZSAxOgogICAgICAgIHJldHVybiAiSGVhZGluZyAxIjsKICAgICAgY2FzZSAyOgogICAgICAgIHJldHVybiAiSGVhZGluZyAyIjsKICAgICAgY2FzZSAzOgogICAgICAgIHJldHVybiAiSGVhZGluZyAzIjsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gIkhlYWRpbmciOwogICAgfQogIH0KICAvKioKICAgKiBIZWxwZXIgdG8gZ2V0IHRoZSBsYXN0IHRleHQgbm9kZSBpbiBhbiBlbGVtZW50CiAgICovCiAgZ2V0TGFzdFRleHROb2RlKGVsZW1lbnQ0KSB7CiAgICBpZiAoZWxlbWVudDQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7CiAgICAgIHJldHVybiBlbGVtZW50NDsKICAgIH0KICAgIGZvciAobGV0IGkxMSA9IGVsZW1lbnQ0LmNoaWxkTm9kZXMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICAgIGNvbnN0IGxhc3RUZXh0ID0gdGhpcy5nZXRMYXN0VGV4dE5vZGUoZWxlbWVudDQuY2hpbGROb2Rlc1tpMTFdKTsKICAgICAgaWYgKGxhc3RUZXh0KQogICAgICAgIHJldHVybiBsYXN0VGV4dDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICAvLyBIZWxwZXIgbWV0aG9kcyBmb3IgaGVhZGluZyBmdW5jdGlvbmFsaXR5IChtb3N0bHkgdGhlIHNhbWUgYXMgcGFyYWdyYXBoKQogIGdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgaGVhZGluZ0Jsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcihgLmJsb2NrLmhlYWRpbmctJHt0aGlzLmxldmVsfWApOwogICAgaWYgKCFoZWFkaW5nQmxvY2spIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCB3eXNpd3lnQmxvY2sgPSBjb250ZXh0Mj8uY29tcG9uZW50OwogICAgY29uc3QgcGFyZW50Q29tcG9uZW50ID0gd3lzaXd5Z0Jsb2NrPy5jbG9zZXN0KCJkZWVzLWlucHV0LXd5c2l3eWciKTsKICAgIGNvbnN0IHBhcmVudFNoYWRvd1Jvb3QgPSBwYXJlbnRDb21wb25lbnQ/LnNoYWRvd1Jvb3Q7CiAgICBjb25zdCBibG9ja1NoYWRvd1Jvb3QgPSBjb250ZXh0Mj8uc2hhZG93Um9vdDsKICAgIGNvbnN0IHNoYWRvd1Jvb3RzID0gW107CiAgICBpZiAocGFyZW50U2hhZG93Um9vdCkKICAgICAgc2hhZG93Um9vdHMucHVzaChwYXJlbnRTaGFkb3dSb290KTsKICAgIGlmIChibG9ja1NoYWRvd1Jvb3QpCiAgICAgIHNoYWRvd1Jvb3RzLnB1c2goYmxvY2tTaGFkb3dSb290KTsKICAgIGNvbnN0IHNlbGVjdGlvbkluZm8gPSBXeXNpd3lnU2VsZWN0aW9uLmdldFNlbGVjdGlvbkluZm8oLi4uc2hhZG93Um9vdHMpOwogICAgaWYgKCFzZWxlY3Rpb25JbmZvKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKCFXeXNpd3lnU2VsZWN0aW9uLmNvbnRhaW5zQWNyb3NzU2hhZG93RE9NKGhlYWRpbmdCbG9jaywgc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lcikpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBwcmVDYXJldFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgIHByZUNhcmV0UmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGhlYWRpbmdCbG9jayk7CiAgICBwcmVDYXJldFJhbmdlLnNldEVuZChzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyLCBzZWxlY3Rpb25JbmZvLnN0YXJ0T2Zmc2V0KTsKICAgIGNvbnN0IHBvc2l0aW9uMyA9IHByZUNhcmV0UmFuZ2UudG9TdHJpbmcoKS5sZW5ndGg7CiAgICByZXR1cm4gcG9zaXRpb24zOwogIH0KICBnZXRDb250ZW50KGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgaGVhZGluZ0Jsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcihgLmJsb2NrLmhlYWRpbmctJHt0aGlzLmxldmVsfWApOwogICAgaWYgKCFoZWFkaW5nQmxvY2spCiAgICAgIHJldHVybiAiIjsKICAgIGNvbnN0IGNvbnRlbnQzID0gaGVhZGluZ0Jsb2NrLmlubmVySFRNTCB8fCAiIjsKICAgIHJldHVybiBjb250ZW50MzsKICB9CiAgc2V0Q29udGVudChlbGVtZW50NCwgY29udGVudDMsIGNvbnRleHQyKSB7CiAgICBjb25zdCBoZWFkaW5nQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKGAuYmxvY2suaGVhZGluZy0ke3RoaXMubGV2ZWx9YCk7CiAgICBpZiAoIWhlYWRpbmdCbG9jaykKICAgICAgcmV0dXJuOwogICAgY29uc3QgaGFkRm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBoZWFkaW5nQmxvY2sgfHwgZWxlbWVudDQuc2hhZG93Um9vdD8uYWN0aXZlRWxlbWVudCA9PT0gaGVhZGluZ0Jsb2NrOwogICAgaGVhZGluZ0Jsb2NrLmlubmVySFRNTCA9IGNvbnRlbnQzOwogICAgaWYgKGhhZEZvY3VzKSB7CiAgICAgIGhlYWRpbmdCbG9jay5mb2N1cygpOwogICAgfQogIH0KICBzZXRDdXJzb3JUb1N0YXJ0KGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgaGVhZGluZ0Jsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcihgLmJsb2NrLmhlYWRpbmctJHt0aGlzLmxldmVsfWApOwogICAgaWYgKGhlYWRpbmdCbG9jaykgewogICAgICBXeXNpd3lnQmxvY2tzLnNldEN1cnNvclRvU3RhcnQoaGVhZGluZ0Jsb2NrKTsKICAgIH0KICB9CiAgc2V0Q3Vyc29yVG9FbmQoZWxlbWVudDQsIGNvbnRleHQyKSB7CiAgICBjb25zdCBoZWFkaW5nQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKGAuYmxvY2suaGVhZGluZy0ke3RoaXMubGV2ZWx9YCk7CiAgICBpZiAoaGVhZGluZ0Jsb2NrKSB7CiAgICAgIFd5c2l3eWdCbG9ja3Muc2V0Q3Vyc29yVG9FbmQoaGVhZGluZ0Jsb2NrKTsKICAgIH0KICB9CiAgZm9jdXMoZWxlbWVudDQsIGNvbnRleHQyKSB7CiAgICBjb25zdCBoZWFkaW5nQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKGAuYmxvY2suaGVhZGluZy0ke3RoaXMubGV2ZWx9YCk7CiAgICBpZiAoIWhlYWRpbmdCbG9jaykKICAgICAgcmV0dXJuOwogICAgaWYgKCFoZWFkaW5nQmxvY2suaGFzQXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiKSkgewogICAgICBoZWFkaW5nQmxvY2suc2V0QXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiLCAidHJ1ZSIpOwogICAgfQogICAgaGVhZGluZ0Jsb2NrLmZvY3VzKCk7CiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gaGVhZGluZ0Jsb2NrICYmIGVsZW1lbnQ0LnNoYWRvd1Jvb3Q/LmFjdGl2ZUVsZW1lbnQgIT09IGhlYWRpbmdCbG9jaykgewogICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHsKICAgICAgICBoZWFkaW5nQmxvY2suZm9jdXMoKTsKICAgICAgfSk7CiAgICB9CiAgfQogIGZvY3VzV2l0aEN1cnNvcihlbGVtZW50NCwgcG9zaXRpb24zID0gImVuZCIsIGNvbnRleHQyKSB7CiAgICBjb25zdCBoZWFkaW5nQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKGAuYmxvY2suaGVhZGluZy0ke3RoaXMubGV2ZWx9YCk7CiAgICBpZiAoIWhlYWRpbmdCbG9jaykKICAgICAgcmV0dXJuOwogICAgaWYgKCFoZWFkaW5nQmxvY2suaGFzQXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiKSkgewogICAgICBoZWFkaW5nQmxvY2suc2V0QXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiLCAidHJ1ZSIpOwogICAgfQogICAgaWYgKHBvc2l0aW9uMyA9PT0gImVuZCIgJiYgaGVhZGluZ0Jsb2NrLnRleHRDb250ZW50ICYmIGhlYWRpbmdCbG9jay50ZXh0Q29udGVudC5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgaWYgKHNlbCkgewogICAgICAgIGNvbnN0IHJhbmdlMiA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgICAgY29uc3QgbGFzdE5vZGUgPSB0aGlzLmdldExhc3RUZXh0Tm9kZShoZWFkaW5nQmxvY2spIHx8IGhlYWRpbmdCbG9jazsKICAgICAgICBpZiAobGFzdE5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7CiAgICAgICAgICByYW5nZTIuc2V0U3RhcnQobGFzdE5vZGUsIGxhc3ROb2RlLnRleHRDb250ZW50Py5sZW5ndGggfHwgMCk7CiAgICAgICAgICByYW5nZTIuc2V0RW5kKGxhc3ROb2RlLCBsYXN0Tm9kZS50ZXh0Q29udGVudD8ubGVuZ3RoIHx8IDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByYW5nZTIuc2VsZWN0Tm9kZUNvbnRlbnRzKGxhc3ROb2RlKTsKICAgICAgICAgIHJhbmdlMi5jb2xsYXBzZShmYWxzZSk7CiAgICAgICAgfQogICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UyKTsKICAgICAgfQogICAgfQogICAgaGVhZGluZ0Jsb2NrLmZvY3VzKCk7CiAgICBjb25zdCBzZXRDdXJzb3IgPSAoKSA9PiB7CiAgICAgIGlmIChwb3NpdGlvbjMgPT09ICJzdGFydCIpIHsKICAgICAgICB0aGlzLnNldEN1cnNvclRvU3RhcnQoZWxlbWVudDQsIGNvbnRleHQyKTsKICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbjMgPT09ICJlbmQiICYmICghaGVhZGluZ0Jsb2NrLnRleHRDb250ZW50IHx8IGhlYWRpbmdCbG9jay50ZXh0Q29udGVudC5sZW5ndGggPT09IDApKSB7CiAgICAgICAgdGhpcy5zZXRDdXJzb3JUb0VuZChlbGVtZW50NCwgY29udGV4dDIpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwb3NpdGlvbjMgPT09ICJudW1iZXIiKSB7CiAgICAgICAgV3lzaXd5Z1NlbGVjdGlvbi5zZXRDdXJzb3JQb3NpdGlvbihoZWFkaW5nQmxvY2ssIHBvc2l0aW9uMyk7CiAgICAgIH0KICAgIH07CiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gaGVhZGluZ0Jsb2NrIHx8IGVsZW1lbnQ0LnNoYWRvd1Jvb3Q/LmFjdGl2ZUVsZW1lbnQgPT09IGhlYWRpbmdCbG9jaykgewogICAgICBzZXRDdXJzb3IoKTsKICAgIH0gZWxzZSB7CiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gewogICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBoZWFkaW5nQmxvY2sgfHwgZWxlbWVudDQuc2hhZG93Um9vdD8uYWN0aXZlRWxlbWVudCA9PT0gaGVhZGluZ0Jsb2NrKSB7CiAgICAgICAgICBzZXRDdXJzb3IoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBoZWFkaW5nQmxvY2sgfHwgZWxlbWVudDQuc2hhZG93Um9vdD8uYWN0aXZlRWxlbWVudCA9PT0gaGVhZGluZ0Jsb2NrKSB7CiAgICAgICAgICAgICAgc2V0Q3Vyc29yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIDEwKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KICBnZXRTcGxpdENvbnRlbnQoZWxlbWVudDQsIGNvbnRleHQyKSB7CiAgICBjb25zdCBoZWFkaW5nQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKGAuYmxvY2suaGVhZGluZy0ke3RoaXMubGV2ZWx9YCk7CiAgICBpZiAoIWhlYWRpbmdCbG9jaykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHd5c2l3eWdCbG9jayA9IGNvbnRleHQyPy5jb21wb25lbnQ7CiAgICBjb25zdCBwYXJlbnRDb21wb25lbnQgPSB3eXNpd3lnQmxvY2s/LmNsb3Nlc3QoImRlZXMtaW5wdXQtd3lzaXd5ZyIpOwogICAgY29uc3QgcGFyZW50U2hhZG93Um9vdCA9IHBhcmVudENvbXBvbmVudD8uc2hhZG93Um9vdDsKICAgIGNvbnN0IGJsb2NrU2hhZG93Um9vdCA9IGNvbnRleHQyPy5zaGFkb3dSb290OwogICAgY29uc3Qgc2hhZG93Um9vdHMgPSBbXTsKICAgIGlmIChwYXJlbnRTaGFkb3dSb290KQogICAgICBzaGFkb3dSb290cy5wdXNoKHBhcmVudFNoYWRvd1Jvb3QpOwogICAgaWYgKGJsb2NrU2hhZG93Um9vdCkKICAgICAgc2hhZG93Um9vdHMucHVzaChibG9ja1NoYWRvd1Jvb3QpOwogICAgY29uc3Qgc2VsZWN0aW9uSW5mbyA9IFd5c2l3eWdTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uSW5mbyguLi5zaGFkb3dSb290cyk7CiAgICBpZiAoIXNlbGVjdGlvbkluZm8pIHsKICAgICAgaWYgKHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gIT09IG51bGwpIHsKICAgICAgICBjb25zdCBmdWxsVGV4dCA9IGhlYWRpbmdCbG9jay50ZXh0Q29udGVudCB8fCAiIjsKICAgICAgICBjb25zdCBwb3MgPSBNYXRoLm1pbih0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uLCBmdWxsVGV4dC5sZW5ndGgpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBiZWZvcmU6IGZ1bGxUZXh0LnN1YnN0cmluZygwLCBwb3MpLAogICAgICAgICAgYWZ0ZXI6IGZ1bGxUZXh0LnN1YnN0cmluZyhwb3MpCiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmICghV3lzaXd5Z1NlbGVjdGlvbi5jb250YWluc0Fjcm9zc1NoYWRvd0RPTShoZWFkaW5nQmxvY2ssIHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIpKSB7CiAgICAgIGlmICh0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uICE9PSBudWxsKSB7CiAgICAgICAgY29uc3QgZnVsbFRleHQgPSBoZWFkaW5nQmxvY2sudGV4dENvbnRlbnQgfHwgIiI7CiAgICAgICAgY29uc3QgcG9zID0gTWF0aC5taW4odGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiwgZnVsbFRleHQubGVuZ3RoKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgYmVmb3JlOiBmdWxsVGV4dC5zdWJzdHJpbmcoMCwgcG9zKSwKICAgICAgICAgIGFmdGVyOiBmdWxsVGV4dC5zdWJzdHJpbmcocG9zKQogICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBjdXJzb3JQb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0LCBjb250ZXh0Mik7CiAgICBpZiAoY3Vyc29yUG9zID09PSBudWxsIHx8IGN1cnNvclBvcyA9PT0gMCkgewogICAgICByZXR1cm4gewogICAgICAgIGJlZm9yZTogIiIsCiAgICAgICAgYWZ0ZXI6IGhlYWRpbmdCbG9jay5pbm5lckhUTUwKICAgICAgfTsKICAgIH0KICAgIGNvbnN0IGJlZm9yZVJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgIGNvbnN0IGFmdGVyUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgYmVmb3JlUmFuZ2Uuc2V0U3RhcnQoaGVhZGluZ0Jsb2NrLCAwKTsKICAgIGJlZm9yZVJhbmdlLnNldEVuZChzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyLCBzZWxlY3Rpb25JbmZvLnN0YXJ0T2Zmc2V0KTsKICAgIGFmdGVyUmFuZ2Uuc2V0U3RhcnQoc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lciwgc2VsZWN0aW9uSW5mby5zdGFydE9mZnNldCk7CiAgICBhZnRlclJhbmdlLnNldEVuZChoZWFkaW5nQmxvY2ssIGhlYWRpbmdCbG9jay5jaGlsZE5vZGVzLmxlbmd0aCk7CiAgICBjb25zdCBiZWZvcmVGcmFnbWVudCA9IGJlZm9yZVJhbmdlLmNsb25lQ29udGVudHMoKTsKICAgIGNvbnN0IGFmdGVyRnJhZ21lbnQgPSBhZnRlclJhbmdlLmNsb25lQ29udGVudHMoKTsKICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIHRlbXBEaXYuYXBwZW5kQ2hpbGQoYmVmb3JlRnJhZ21lbnQpOwogICAgY29uc3QgYmVmb3JlSHRtbCA9IHRlbXBEaXYuaW5uZXJIVE1MOwogICAgdGVtcERpdi5pbm5lckhUTUwgPSAiIjsKICAgIHRlbXBEaXYuYXBwZW5kQ2hpbGQoYWZ0ZXJGcmFnbWVudCk7CiAgICBjb25zdCBhZnRlckh0bWwgPSB0ZW1wRGl2LmlubmVySFRNTDsKICAgIHJldHVybiB7CiAgICAgIGJlZm9yZTogYmVmb3JlSHRtbCwKICAgICAgYWZ0ZXI6IGFmdGVySHRtbAogICAgfTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL2Jsb2Nrcy90ZXh0L3F1b3RlLmJsb2NrLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBRdW90ZUJsb2NrSGFuZGxlciA9IGNsYXNzIGV4dGVuZHMgQmFzZUJsb2NrSGFuZGxlciB7CiAgdHlwZSA9ICJxdW90ZSI7CiAgLy8gVHJhY2sgY3Vyc29yIHBvc2l0aW9uCiAgbGFzdEtub3duQ3Vyc29yUG9zaXRpb24gPSAwOwogIGxhc3RTZWxlY3RlZFRleHQgPSAiIjsKICBzZWxlY3Rpb25IYW5kbGVyID0gbnVsbDsKICByZW5kZXIoYmxvY2ssIGlzU2VsZWN0ZWQpIHsKICAgIGNvbnN0IHNlbGVjdGVkQ2xhc3MgPSBpc1NlbGVjdGVkID8gIiBzZWxlY3RlZCIgOiAiIjsKICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gdGhpcy5nZXRQbGFjZWhvbGRlcigpOwogICAgcmV0dXJuIGAKICAgICAgPGRpdgogICAgICAgIGNsYXNzPSJibG9jayBxdW90ZSR7c2VsZWN0ZWRDbGFzc30iCiAgICAgICAgY29udGVudGVkaXRhYmxlPSJ0cnVlIgogICAgICAgIGRhdGEtcGxhY2Vob2xkZXI9IiR7cGxhY2Vob2xkZXJ9IgogICAgICAgIGRhdGEtYmxvY2staWQ9IiR7YmxvY2suaWR9IgogICAgICAgIGRhdGEtYmxvY2stdHlwZT0iJHtibG9jay50eXBlfSIKICAgICAgPjwvZGl2PgogICAgYDsKICB9CiAgc2V0dXAoZWxlbWVudDQsIGJsb2NrLCBoYW5kbGVyczIpIHsKICAgIGNvbnN0IHF1b3RlQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2sucXVvdGUiKTsKICAgIGlmICghcXVvdGVCbG9jaykgewogICAgICBjb25zb2xlLmVycm9yKCJRdW90ZUJsb2NrSGFuZGxlci5zZXR1cDogTm8gcXVvdGUgYmxvY2sgZWxlbWVudCBmb3VuZCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoYmxvY2suY29udGVudCAmJiAhcXVvdGVCbG9jay5pbm5lckhUTUwpIHsKICAgICAgcXVvdGVCbG9jay5pbm5lckhUTUwgPSBibG9jay5jb250ZW50OwogICAgfQogICAgcXVvdGVCbG9jay5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIChlMTEpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uSW5wdXQoZTExKTsKICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCk7CiAgICAgIGlmIChwb3MgIT09IG51bGwpIHsKICAgICAgICB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gcG9zOwogICAgICB9CiAgICB9KTsKICAgIHF1b3RlQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIChlMTEpID0+IHsKICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCk7CiAgICAgIGlmIChwb3MgIT09IG51bGwpIHsKICAgICAgICB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gcG9zOwogICAgICB9CiAgICAgIGhhbmRsZXJzMi5vbktleURvd24oZTExKTsKICAgIH0pOwogICAgcXVvdGVCbG9jay5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsICgpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uRm9jdXMoKTsKICAgIH0pOwogICAgcXVvdGVCbG9jay5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgKCkgPT4gewogICAgICBoYW5kbGVyczIub25CbHVyKCk7CiAgICB9KTsKICAgIHF1b3RlQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiY29tcG9zaXRpb25zdGFydCIsICgpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uQ29tcG9zaXRpb25TdGFydCgpOwogICAgfSk7CiAgICBxdW90ZUJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBvc2l0aW9uZW5kIiwgKCkgPT4gewogICAgICBoYW5kbGVyczIub25Db21wb3NpdGlvbkVuZCgpOwogICAgfSk7CiAgICBxdW90ZUJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCAoZTExKSA9PiB7CiAgICAgIGNvbnN0IHBvcyA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQpOwogICAgICBpZiAocG9zICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IHBvczsKICAgICAgfQogICAgICBoYW5kbGVyczIub25Nb3VzZVVwPy4oZTExKTsKICAgIH0pOwogICAgcXVvdGVCbG9jay5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIChlMTEpID0+IHsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCk7CiAgICAgICAgaWYgKHBvcyAhPT0gbnVsbCkgewogICAgICAgICAgdGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IHBvczsKICAgICAgICB9CiAgICAgIH0sIDApOwogICAgfSk7CiAgICBxdW90ZUJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIiwgKGUxMSkgPT4gewogICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KTsKICAgICAgaWYgKHBvcyAhPT0gbnVsbCkgewogICAgICAgIHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gPSBwb3M7CiAgICAgIH0KICAgIH0pOwogICAgdGhpcy5zZXR1cFNlbGVjdGlvbkhhbmRsZXIoZWxlbWVudDQsIHF1b3RlQmxvY2ssIGJsb2NrKTsKICB9CiAgc2V0dXBTZWxlY3Rpb25IYW5kbGVyKGVsZW1lbnQ0LCBxdW90ZUJsb2NrLCBibG9jaykgewogICAgY29uc3QgY2hlY2tTZWxlY3Rpb24gPSAoKSA9PiB7CiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTsKICAgICAgaWYgKHNlbGVjdGVkVGV4dC5sZW5ndGggPT09IDApIHsKICAgICAgICBpZiAodGhpcy5sYXN0U2VsZWN0ZWRUZXh0KSB7CiAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZFRleHQgPSAiIjsKICAgICAgICAgIHRoaXMuZGlzcGF0Y2hTZWxlY3Rpb25FdmVudChlbGVtZW50NCwgewogICAgICAgICAgICB0ZXh0OiAiIiwKICAgICAgICAgICAgYmxvY2tJZDogYmxvY2suaWQsCiAgICAgICAgICAgIGhhc1NlbGVjdGlvbjogZmFsc2UKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgd3lzaXd5Z0Jsb2NrMiA9IHF1b3RlQmxvY2suZ2V0Um9vdE5vZGUoKS5ob3N0OwogICAgICBjb25zdCBwYXJlbnRDb21wb25lbnQgPSB3eXNpd3lnQmxvY2syPy5jbG9zZXN0KCJkZWVzLWlucHV0LXd5c2l3eWciKTsKICAgICAgY29uc3QgcGFyZW50U2hhZG93Um9vdCA9IHBhcmVudENvbXBvbmVudD8uc2hhZG93Um9vdDsKICAgICAgY29uc3QgYmxvY2tTaGFkb3dSb290ID0gd3lzaXd5Z0Jsb2NrMj8uc2hhZG93Um9vdDsKICAgICAgY29uc3Qgc2hhZG93Um9vdHMgPSBbXTsKICAgICAgaWYgKHBhcmVudFNoYWRvd1Jvb3QpCiAgICAgICAgc2hhZG93Um9vdHMucHVzaChwYXJlbnRTaGFkb3dSb290KTsKICAgICAgaWYgKGJsb2NrU2hhZG93Um9vdCkKICAgICAgICBzaGFkb3dSb290cy5wdXNoKGJsb2NrU2hhZG93Um9vdCk7CiAgICAgIGNvbnN0IHNlbGVjdGlvbkluZm8gPSBXeXNpd3lnU2VsZWN0aW9uLmdldFNlbGVjdGlvbkluZm8oLi4uc2hhZG93Um9vdHMpOwogICAgICBpZiAoIXNlbGVjdGlvbkluZm8pCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBzdGFydEluQmxvY2sgPSBXeXNpd3lnU2VsZWN0aW9uLmNvbnRhaW5zQWNyb3NzU2hhZG93RE9NKHF1b3RlQmxvY2ssIHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIpOwogICAgICBjb25zdCBlbmRJbkJsb2NrID0gV3lzaXd5Z1NlbGVjdGlvbi5jb250YWluc0Fjcm9zc1NoYWRvd0RPTShxdW90ZUJsb2NrLCBzZWxlY3Rpb25JbmZvLmVuZENvbnRhaW5lcik7CiAgICAgIGlmIChzdGFydEluQmxvY2sgfHwgZW5kSW5CbG9jaykgewogICAgICAgIGlmIChzZWxlY3RlZFRleHQgIT09IHRoaXMubGFzdFNlbGVjdGVkVGV4dCkgewogICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRUZXh0ID0gc2VsZWN0ZWRUZXh0OwogICAgICAgICAgY29uc3QgcmFuZ2UyID0gV3lzaXd5Z1NlbGVjdGlvbi5jcmVhdGVSYW5nZUZyb21JbmZvKHNlbGVjdGlvbkluZm8pOwogICAgICAgICAgY29uc3QgcmVjdCA9IHJhbmdlMi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgIHRoaXMuZGlzcGF0Y2hTZWxlY3Rpb25FdmVudChlbGVtZW50NCwgewogICAgICAgICAgICB0ZXh0OiBzZWxlY3RlZFRleHQudHJpbSgpLAogICAgICAgICAgICBibG9ja0lkOiBibG9jay5pZCwKICAgICAgICAgICAgcmFuZ2U6IHJhbmdlMiwKICAgICAgICAgICAgcmVjdCwKICAgICAgICAgICAgaGFzU2VsZWN0aW9uOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGhpcy5sYXN0U2VsZWN0ZWRUZXh0KSB7CiAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRUZXh0ID0gIiI7CiAgICAgICAgdGhpcy5kaXNwYXRjaFNlbGVjdGlvbkV2ZW50KGVsZW1lbnQ0LCB7CiAgICAgICAgICB0ZXh0OiAiIiwKICAgICAgICAgIGJsb2NrSWQ6IGJsb2NrLmlkLAogICAgICAgICAgaGFzU2VsZWN0aW9uOiBmYWxzZQogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIiwgY2hlY2tTZWxlY3Rpb24pOwogICAgdGhpcy5zZWxlY3Rpb25IYW5kbGVyID0gY2hlY2tTZWxlY3Rpb247CiAgICBjb25zdCB3eXNpd3lnQmxvY2sgPSBxdW90ZUJsb2NrLmdldFJvb3ROb2RlKCkuaG9zdDsKICAgIGlmICh3eXNpd3lnQmxvY2spIHsKICAgICAgY29uc3Qgb3JpZ2luYWxEaXNjb25uZWN0ZWRDYWxsYmFjayA9IHd5c2l3eWdCbG9jay5kaXNjb25uZWN0ZWRDYWxsYmFjazsKICAgICAgd3lzaXd5Z0Jsb2NrLmRpc2Nvbm5lY3RlZENhbGxiYWNrID0gYXN5bmMgZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uSGFuZGxlcikgewogICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIiwgdGhpcy5zZWxlY3Rpb25IYW5kbGVyKTsKICAgICAgICAgIHRoaXMuc2VsZWN0aW9uSGFuZGxlciA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChvcmlnaW5hbERpc2Nvbm5lY3RlZENhbGxiYWNrKSB7CiAgICAgICAgICBhd2FpdCBvcmlnaW5hbERpc2Nvbm5lY3RlZENhbGxiYWNrLmNhbGwod3lzaXd5Z0Jsb2NrKTsKICAgICAgICB9CiAgICAgIH0uYmluZCh0aGlzKTsKICAgIH0KICB9CiAgZGlzcGF0Y2hTZWxlY3Rpb25FdmVudChlbGVtZW50NCwgZGV0YWlsKSB7CiAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgiYmxvY2stdGV4dC1zZWxlY3RlZCIsIHsKICAgICAgZGV0YWlsLAogICAgICBidWJibGVzOiB0cnVlLAogICAgICBjb21wb3NlZDogdHJ1ZQogICAgfSk7CiAgICBlbGVtZW50NC5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICB9CiAgZ2V0U3R5bGVzKCkgewogICAgcmV0dXJuIGAKICAgICAgLyogUXVvdGUgc3BlY2lmaWMgc3R5bGVzICovCiAgICAgIC5ibG9jay5xdW90ZSB7CiAgICAgICAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwNjZjYyIsICIjNGQ5NGZmIil9OwogICAgICAgIHBhZGRpbmctbGVmdDogMjBweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM1NTUiLCAiI2IwYjBiMCIpfTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNjsKICAgICAgICBtYXJnaW46IDE2cHggMDsKICAgICAgfQogICAgYDsKICB9CiAgZ2V0UGxhY2Vob2xkZXIoKSB7CiAgICByZXR1cm4gIkFkZCBhIHF1b3RlLi4uIjsKICB9CiAgLy8gSGVscGVyIG1ldGhvZHMgZm9yIHF1b3RlIGZ1bmN0aW9uYWxpdHkKICBnZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCwgY29udGV4dDIpIHsKICAgIGNvbnN0IHF1b3RlQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2sucXVvdGUiKTsKICAgIGlmICghcXVvdGVCbG9jaykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHd5c2l3eWdCbG9jayA9IGNvbnRleHQyPy5jb21wb25lbnQ7CiAgICBjb25zdCBwYXJlbnRDb21wb25lbnQgPSB3eXNpd3lnQmxvY2s/LmNsb3Nlc3QoImRlZXMtaW5wdXQtd3lzaXd5ZyIpOwogICAgY29uc3QgcGFyZW50U2hhZG93Um9vdCA9IHBhcmVudENvbXBvbmVudD8uc2hhZG93Um9vdDsKICAgIGNvbnN0IGJsb2NrU2hhZG93Um9vdCA9IGNvbnRleHQyPy5zaGFkb3dSb290OwogICAgY29uc3Qgc2hhZG93Um9vdHMgPSBbXTsKICAgIGlmIChwYXJlbnRTaGFkb3dSb290KQogICAgICBzaGFkb3dSb290cy5wdXNoKHBhcmVudFNoYWRvd1Jvb3QpOwogICAgaWYgKGJsb2NrU2hhZG93Um9vdCkKICAgICAgc2hhZG93Um9vdHMucHVzaChibG9ja1NoYWRvd1Jvb3QpOwogICAgY29uc3Qgc2VsZWN0aW9uSW5mbyA9IFd5c2l3eWdTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uSW5mbyguLi5zaGFkb3dSb290cyk7CiAgICBpZiAoIXNlbGVjdGlvbkluZm8pIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoIVd5c2l3eWdTZWxlY3Rpb24uY29udGFpbnNBY3Jvc3NTaGFkb3dET00ocXVvdGVCbG9jaywgc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lcikpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBwcmVDYXJldFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgIHByZUNhcmV0UmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHF1b3RlQmxvY2spOwogICAgcHJlQ2FyZXRSYW5nZS5zZXRFbmQoc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lciwgc2VsZWN0aW9uSW5mby5zdGFydE9mZnNldCk7CiAgICBjb25zdCBwb3NpdGlvbjMgPSBwcmVDYXJldFJhbmdlLnRvU3RyaW5nKCkubGVuZ3RoOwogICAgcmV0dXJuIHBvc2l0aW9uMzsKICB9CiAgZ2V0Q29udGVudChlbGVtZW50NCwgY29udGV4dDIpIHsKICAgIGNvbnN0IHF1b3RlQmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2sucXVvdGUiKTsKICAgIGlmICghcXVvdGVCbG9jaykKICAgICAgcmV0dXJuICIiOwogICAgY29uc3QgY29udGVudDMgPSBxdW90ZUJsb2NrLmlubmVySFRNTCB8fCAiIjsKICAgIHJldHVybiBjb250ZW50MzsKICB9CiAgc2V0Q29udGVudChlbGVtZW50NCwgY29udGVudDMsIGNvbnRleHQyKSB7CiAgICBjb25zdCBxdW90ZUJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLnF1b3RlIik7CiAgICBpZiAoIXF1b3RlQmxvY2spCiAgICAgIHJldHVybjsKICAgIGNvbnN0IGhhZEZvY3VzID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gcXVvdGVCbG9jayB8fCBlbGVtZW50NC5zaGFkb3dSb290Py5hY3RpdmVFbGVtZW50ID09PSBxdW90ZUJsb2NrOwogICAgcXVvdGVCbG9jay5pbm5lckhUTUwgPSBjb250ZW50MzsKICAgIGlmIChoYWRGb2N1cykgewogICAgICBxdW90ZUJsb2NrLmZvY3VzKCk7CiAgICB9CiAgfQogIHNldEN1cnNvclRvU3RhcnQoZWxlbWVudDQsIGNvbnRleHQyKSB7CiAgICBjb25zdCBxdW90ZUJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLnF1b3RlIik7CiAgICBpZiAocXVvdGVCbG9jaykgewogICAgICBXeXNpd3lnQmxvY2tzLnNldEN1cnNvclRvU3RhcnQocXVvdGVCbG9jayk7CiAgICB9CiAgfQogIHNldEN1cnNvclRvRW5kKGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgcXVvdGVCbG9jayA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jay5xdW90ZSIpOwogICAgaWYgKHF1b3RlQmxvY2spIHsKICAgICAgV3lzaXd5Z0Jsb2Nrcy5zZXRDdXJzb3JUb0VuZChxdW90ZUJsb2NrKTsKICAgIH0KICB9CiAgZm9jdXMoZWxlbWVudDQsIGNvbnRleHQyKSB7CiAgICBjb25zdCBxdW90ZUJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLnF1b3RlIik7CiAgICBpZiAoIXF1b3RlQmxvY2spCiAgICAgIHJldHVybjsKICAgIGlmICghcXVvdGVCbG9jay5oYXNBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIpKSB7CiAgICAgIHF1b3RlQmxvY2suc2V0QXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiLCAidHJ1ZSIpOwogICAgfQogICAgcXVvdGVCbG9jay5mb2N1cygpOwogICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IHF1b3RlQmxvY2sgJiYgZWxlbWVudDQuc2hhZG93Um9vdD8uYWN0aXZlRWxlbWVudCAhPT0gcXVvdGVCbG9jaykgewogICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHsKICAgICAgICBxdW90ZUJsb2NrLmZvY3VzKCk7CiAgICAgIH0pOwogICAgfQogIH0KICBmb2N1c1dpdGhDdXJzb3IoZWxlbWVudDQsIHBvc2l0aW9uMyA9ICJlbmQiLCBjb250ZXh0MikgewogICAgY29uc3QgcXVvdGVCbG9jayA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jay5xdW90ZSIpOwogICAgaWYgKCFxdW90ZUJsb2NrKQogICAgICByZXR1cm47CiAgICBpZiAoIXF1b3RlQmxvY2suaGFzQXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiKSkgewogICAgICBxdW90ZUJsb2NrLnNldEF0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIiwgInRydWUiKTsKICAgIH0KICAgIHF1b3RlQmxvY2suZm9jdXMoKTsKICAgIGNvbnN0IHNldEN1cnNvciA9ICgpID0+IHsKICAgICAgaWYgKHBvc2l0aW9uMyA9PT0gInN0YXJ0IikgewogICAgICAgIHRoaXMuc2V0Q3Vyc29yVG9TdGFydChlbGVtZW50NCwgY29udGV4dDIpOwogICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uMyA9PT0gImVuZCIpIHsKICAgICAgICB0aGlzLnNldEN1cnNvclRvRW5kKGVsZW1lbnQ0LCBjb250ZXh0Mik7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBvc2l0aW9uMyA9PT0gIm51bWJlciIpIHsKICAgICAgICBXeXNpd3lnU2VsZWN0aW9uLnNldEN1cnNvclBvc2l0aW9uKHF1b3RlQmxvY2ssIHBvc2l0aW9uMyk7CiAgICAgIH0KICAgIH07CiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gcXVvdGVCbG9jayB8fCBlbGVtZW50NC5zaGFkb3dSb290Py5hY3RpdmVFbGVtZW50ID09PSBxdW90ZUJsb2NrKSB7CiAgICAgIHNldEN1cnNvcigpOwogICAgfSBlbHNlIHsKICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7CiAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHF1b3RlQmxvY2sgfHwgZWxlbWVudDQuc2hhZG93Um9vdD8uYWN0aXZlRWxlbWVudCA9PT0gcXVvdGVCbG9jaykgewogICAgICAgICAgc2V0Q3Vyc29yKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9CiAgZ2V0U3BsaXRDb250ZW50KGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgcXVvdGVCbG9jayA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jay5xdW90ZSIpOwogICAgaWYgKCFxdW90ZUJsb2NrKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3Qgd3lzaXd5Z0Jsb2NrID0gY29udGV4dDI/LmNvbXBvbmVudDsKICAgIGNvbnN0IHBhcmVudENvbXBvbmVudCA9IHd5c2l3eWdCbG9jaz8uY2xvc2VzdCgiZGVlcy1pbnB1dC13eXNpd3lnIik7CiAgICBjb25zdCBwYXJlbnRTaGFkb3dSb290ID0gcGFyZW50Q29tcG9uZW50Py5zaGFkb3dSb290OwogICAgY29uc3QgYmxvY2tTaGFkb3dSb290ID0gY29udGV4dDI/LnNoYWRvd1Jvb3Q7CiAgICBjb25zdCBzaGFkb3dSb290cyA9IFtdOwogICAgaWYgKHBhcmVudFNoYWRvd1Jvb3QpCiAgICAgIHNoYWRvd1Jvb3RzLnB1c2gocGFyZW50U2hhZG93Um9vdCk7CiAgICBpZiAoYmxvY2tTaGFkb3dSb290KQogICAgICBzaGFkb3dSb290cy5wdXNoKGJsb2NrU2hhZG93Um9vdCk7CiAgICBjb25zdCBzZWxlY3Rpb25JbmZvID0gV3lzaXd5Z1NlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvKC4uLnNoYWRvd1Jvb3RzKTsKICAgIGlmICghc2VsZWN0aW9uSW5mbykgewogICAgICBpZiAodGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IGZ1bGxUZXh0ID0gcXVvdGVCbG9jay50ZXh0Q29udGVudCB8fCAiIjsKICAgICAgICBjb25zdCBwb3MgPSBNYXRoLm1pbih0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uLCBmdWxsVGV4dC5sZW5ndGgpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBiZWZvcmU6IGZ1bGxUZXh0LnN1YnN0cmluZygwLCBwb3MpLAogICAgICAgICAgYWZ0ZXI6IGZ1bGxUZXh0LnN1YnN0cmluZyhwb3MpCiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmICghV3lzaXd5Z1NlbGVjdGlvbi5jb250YWluc0Fjcm9zc1NoYWRvd0RPTShxdW90ZUJsb2NrLCBzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyKSkgewogICAgICBpZiAodGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IGZ1bGxUZXh0ID0gcXVvdGVCbG9jay50ZXh0Q29udGVudCB8fCAiIjsKICAgICAgICBjb25zdCBwb3MgPSBNYXRoLm1pbih0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uLCBmdWxsVGV4dC5sZW5ndGgpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBiZWZvcmU6IGZ1bGxUZXh0LnN1YnN0cmluZygwLCBwb3MpLAogICAgICAgICAgYWZ0ZXI6IGZ1bGxUZXh0LnN1YnN0cmluZyhwb3MpCiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IGN1cnNvclBvcyA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQsIGNvbnRleHQyKTsKICAgIGlmIChjdXJzb3JQb3MgPT09IG51bGwgfHwgY3Vyc29yUG9zID09PSAwKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgYmVmb3JlOiAiIiwKICAgICAgICBhZnRlcjogcXVvdGVCbG9jay5pbm5lckhUTUwKICAgICAgfTsKICAgIH0KICAgIGNvbnN0IGJlZm9yZVJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgIGNvbnN0IGFmdGVyUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgYmVmb3JlUmFuZ2Uuc2V0U3RhcnQocXVvdGVCbG9jaywgMCk7CiAgICBiZWZvcmVSYW5nZS5zZXRFbmQoc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lciwgc2VsZWN0aW9uSW5mby5zdGFydE9mZnNldCk7CiAgICBhZnRlclJhbmdlLnNldFN0YXJ0KHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIsIHNlbGVjdGlvbkluZm8uc3RhcnRPZmZzZXQpOwogICAgYWZ0ZXJSYW5nZS5zZXRFbmQocXVvdGVCbG9jaywgcXVvdGVCbG9jay5jaGlsZE5vZGVzLmxlbmd0aCk7CiAgICBjb25zdCBiZWZvcmVGcmFnbWVudCA9IGJlZm9yZVJhbmdlLmNsb25lQ29udGVudHMoKTsKICAgIGNvbnN0IGFmdGVyRnJhZ21lbnQgPSBhZnRlclJhbmdlLmNsb25lQ29udGVudHMoKTsKICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIHRlbXBEaXYuYXBwZW5kQ2hpbGQoYmVmb3JlRnJhZ21lbnQpOwogICAgY29uc3QgYmVmb3JlSHRtbCA9IHRlbXBEaXYuaW5uZXJIVE1MOwogICAgdGVtcERpdi5pbm5lckhUTUwgPSAiIjsKICAgIHRlbXBEaXYuYXBwZW5kQ2hpbGQoYWZ0ZXJGcmFnbWVudCk7CiAgICBjb25zdCBhZnRlckh0bWwgPSB0ZW1wRGl2LmlubmVySFRNTDsKICAgIHJldHVybiB7CiAgICAgIGJlZm9yZTogYmVmb3JlSHRtbCwKICAgICAgYWZ0ZXI6IGFmdGVySHRtbAogICAgfTsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL2Jsb2Nrcy90ZXh0L2NvZGUuYmxvY2suanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF9zZXJ2aWNlcygpOwp2YXIgQ29kZUJsb2NrSGFuZGxlciA9IGNsYXNzIGV4dGVuZHMgQmFzZUJsb2NrSGFuZGxlciB7CiAgdHlwZSA9ICJjb2RlIjsKICBoaWdobGlnaHRUaW1lciA9IG51bGw7CiAgaGlnaGxpZ2h0SnMgPSBudWxsOwogIHJlbmRlcihibG9jaywgaXNTZWxlY3RlZCkgewogICAgY29uc3QgbGFuZ3VhZ2UgPSBibG9jay5tZXRhZGF0YT8ubGFuZ3VhZ2UgfHwgInR5cGVzY3JpcHQiOwogICAgY29uc3QgY29udGVudDMgPSBibG9jay5jb250ZW50IHx8ICIiOwogICAgY29uc3QgbGluZUNvdW50ID0gY29udGVudDMuc3BsaXQoIlxuIikubGVuZ3RoOwogICAgbGV0IGxpbmVOdW1iZXJzSHRtbCA9ICIiOwogICAgZm9yIChsZXQgaTExID0gMTsgaTExIDw9IGxpbmVDb3VudDsgaTExKyspIHsKICAgICAgbGluZU51bWJlcnNIdG1sICs9IGA8ZGl2IGNsYXNzPSJsaW5lLW51bWJlciI+JHtpMTF9PC9kaXY+YDsKICAgIH0KICAgIGNvbnN0IGxhbmd1YWdlT3B0aW9ucyA9IFBST0dSQU1NSU5HX0xBTkdVQUdFUy5tYXAoKGxhbmcpID0+IHsKICAgICAgY29uc3QgdmFsdWUyID0gbGFuZy50b0xvd2VyQ2FzZSgpOwogICAgICByZXR1cm4gYDxvcHRpb24gdmFsdWU9IiR7dmFsdWUyfSIgJHt2YWx1ZTIgPT09IGxhbmd1YWdlID8gInNlbGVjdGVkIiA6ICIifT4ke2xhbmd9PC9vcHRpb24+YDsKICAgIH0pLmpvaW4oIiIpOwogICAgcmV0dXJuIGAKICAgICAgPGRpdiBjbGFzcz0iY29kZS1ibG9jay1jb250YWluZXIke2lzU2VsZWN0ZWQgPyAiIHNlbGVjdGVkIiA6ICIifSIgZGF0YS1sYW5ndWFnZT0iJHtsYW5ndWFnZX0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtaGVhZGVyIj4KICAgICAgICAgIDxzZWxlY3QgY2xhc3M9Imxhbmd1YWdlLXNlbGVjdG9yIiBkYXRhLWJsb2NrLWlkPSIke2Jsb2NrLmlkfSI+CiAgICAgICAgICAgICR7bGFuZ3VhZ2VPcHRpb25zfQogICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjb3B5LWJ1dHRvbiIgdGl0bGU9IkNvcHkgY29kZSI+CiAgICAgICAgICAgIDxzdmcgY2xhc3M9ImNvcHktaWNvbiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiB2aWV3Qm94PSIwIDAgMTYgMTYiIGZpbGw9ImN1cnJlbnRDb2xvciI+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTAgNi43NUMwIDUuNzg0Ljc4NCA1IDEuNzUgNWgxLjVhLjc1Ljc1IDAgMDEwIDEuNWgtMS41YS4yNS4yNSAwIDAwLS4yNS4yNXY3LjVjMCAuMTM4LjExMi4yNS4yNS4yNWg3LjVhLjI1LjI1IDAgMDAuMjUtLjI1di0xLjVhLjc1Ljc1IDAgMDExLjUgMHYxLjVBMS43NSAxLjc1IDAgMDE5LjI1IDE2aC03LjVBMS43NSAxLjc1IDAgMDEwIDE0LjI1di03LjV6Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTUgMS43NUM1IC43ODQgNS43ODQgMCA2Ljc1IDBoNy41QzE1LjIxNiAwIDE2IC43ODQgMTYgMS43NXY3LjVBMS43NSAxLjc1IDAgMDExNC4yNSAxMWgtNy41QTEuNzUgMS43NSAwIDAxNSA5LjI1di03LjV6bTEuNzUtLjI1YS4yNS4yNSAwIDAwLS4yNS4yNXY3LjVjMCAuMTM4LjExMi4yNS4yNS4yNWg3LjVhLjI1LjI1IDAgMDAuMjUtLjI1di03LjVhLjI1LjI1IDAgMDAtLjI1LS4yNWgtNy41eiI+PC9wYXRoPgogICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvcHktdGV4dCI+Q29weTwvc3Bhbj4KICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtYm9keSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLW51bWJlcnMiPiR7bGluZU51bWJlcnNIdG1sfTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1jb250ZW50Ij4KICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZS1wcmUiPjxjb2RlIGNsYXNzPSJjb2RlLWVkaXRvciIgCiAgICAgICAgICAgICAgICAgY29udGVudGVkaXRhYmxlPSJ0cnVlIgogICAgICAgICAgICAgICAgIGRhdGEtYmxvY2staWQ9IiR7YmxvY2suaWR9IgogICAgICAgICAgICAgICAgIGRhdGEtYmxvY2stdHlwZT0iJHtibG9jay50eXBlfSIKICAgICAgICAgICAgICAgICBzcGVsbGNoZWNrPSJmYWxzZSI+JHt0aGlzLmVzY2FwZUh0bWwoY29udGVudDMpfTwvY29kZT48L3ByZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgfQogIHNldHVwKGVsZW1lbnQ0LCBibG9jaywgaGFuZGxlcnMyKSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuY29kZS1lZGl0b3IiKTsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5jb2RlLWJsb2NrLWNvbnRhaW5lciIpOwogICAgY29uc3QgY29weUJ1dHRvbiA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5jb3B5LWJ1dHRvbiIpOwogICAgY29uc3QgbGFuZ3VhZ2VTZWxlY3RvciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5sYW5ndWFnZS1zZWxlY3RvciIpOwogICAgaWYgKCFlZGl0b3IgfHwgIWNvbnRhaW5lcikKICAgICAgcmV0dXJuOwogICAgaWYgKGxhbmd1YWdlU2VsZWN0b3IpIHsKICAgICAgbGFuZ3VhZ2VTZWxlY3Rvci5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCAoZTExKSA9PiB7CiAgICAgICAgY29uc3QgbmV3TGFuZ3VhZ2UgPSBlMTEudGFyZ2V0LnZhbHVlOwogICAgICAgIGJsb2NrLm1ldGFkYXRhID0geyAuLi5ibG9jay5tZXRhZGF0YSwgbGFuZ3VhZ2U6IG5ld0xhbmd1YWdlIH07CiAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgiZGF0YS1sYW5ndWFnZSIsIG5ld0xhbmd1YWdlKTsKICAgICAgICBpZiAoYmxvY2suY29udGVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSBlZGl0b3IpIHsKICAgICAgICAgIHRoaXMuYXBwbHlIaWdobGlnaHRpbmcoZWxlbWVudDQsIGJsb2NrKTsKICAgICAgICB9CiAgICAgICAgaWYgKGhhbmRsZXJzMi5vbklucHV0KSB7CiAgICAgICAgICBoYW5kbGVyczIub25JbnB1dChuZXcgSW5wdXRFdmVudCgiaW5wdXQiKSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIGlmIChjb3B5QnV0dG9uKSB7CiAgICAgIGNvcHlCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoKSA9PiB7CiAgICAgICAgY29uc3QgY29udGVudDMgPSBlZGl0b3IudGV4dENvbnRlbnQgfHwgIiI7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvbnRlbnQzKTsKICAgICAgICAgIGNvbnN0IGNvcHlUZXh0ID0gY29weUJ1dHRvbi5xdWVyeVNlbGVjdG9yKCIuY29weS10ZXh0Iik7CiAgICAgICAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBjb3B5VGV4dC50ZXh0Q29udGVudDsKICAgICAgICAgIGNvcHlUZXh0LnRleHRDb250ZW50ID0gIkNvcGllZCEiOwogICAgICAgICAgY29weUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCJjb3BpZWQiKTsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICBjb3B5VGV4dC50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDsKICAgICAgICAgICAgY29weUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCJjb3BpZWQiKTsKICAgICAgICAgIH0sIDJlMyk7CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gY29weToiLCBlcnIpOwogICAgICAgICAgY29uc3QgdGV4dEFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpOwogICAgICAgICAgdGV4dEFyZWEudmFsdWUgPSBjb250ZW50MzsKICAgICAgICAgIHRleHRBcmVhLnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIjsKICAgICAgICAgIHRleHRBcmVhLnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRleHRBcmVhKTsKICAgICAgICAgIHRleHRBcmVhLnNlbGVjdCgpOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoImNvcHkiKTsKICAgICAgICAgICAgY29uc3QgY29weVRleHQgPSBjb3B5QnV0dG9uLnF1ZXJ5U2VsZWN0b3IoIi5jb3B5LXRleHQiKTsKICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gY29weVRleHQudGV4dENvbnRlbnQ7CiAgICAgICAgICAgIGNvcHlUZXh0LnRleHRDb250ZW50ID0gIkNvcGllZCEiOwogICAgICAgICAgICBjb3B5QnV0dG9uLmNsYXNzTGlzdC5hZGQoImNvcGllZCIpOwogICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICBjb3B5VGV4dC50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDsKICAgICAgICAgICAgICBjb3B5QnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoImNvcGllZCIpOwogICAgICAgICAgICB9LCAyZTMpOwogICAgICAgICAgfSBjYXRjaCAoZXJyMikgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCJGYWxsYmFjayBjb3B5IGZhaWxlZDoiLCBlcnIyKTsKICAgICAgICAgIH0KICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGV4dEFyZWEpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBsZXQgaXNFZGl0aW5nID0gZmFsc2U7CiAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLCAoKSA9PiB7CiAgICAgIGlzRWRpdGluZyA9IHRydWU7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCJlZGl0aW5nIik7CiAgICAgIGNvbnN0IGNvbnRlbnQzID0gZWRpdG9yLnRleHRDb250ZW50IHx8ICIiOwogICAgICBlZGl0b3IudGV4dENvbnRlbnQgPSBjb250ZW50MzsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICBjb25zdCByYW5nZTIgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICBpZiAoZWRpdG9yLmZpcnN0Q2hpbGQpIHsKICAgICAgICAgIHJhbmdlMi5zZXRTdGFydChlZGl0b3IuZmlyc3RDaGlsZCwgMCk7CiAgICAgICAgICByYW5nZTIuY29sbGFwc2UodHJ1ZSk7CiAgICAgICAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgICAgc2VsZWN0aW9uPy5hZGRSYW5nZShyYW5nZTIpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGhhbmRsZXJzMi5vbkZvY3VzKCk7CiAgICB9KTsKICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgKCkgPT4gewogICAgICBpc0VkaXRpbmcgPSBmYWxzZTsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoImVkaXRpbmciKTsKICAgICAgdGhpcy5hcHBseUhpZ2hsaWdodGluZyhlbGVtZW50NCwgYmxvY2spOwogICAgICBoYW5kbGVyczIub25CbHVyKCk7CiAgICB9KTsKICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIChlMTEpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uSW5wdXQoZTExKTsKICAgICAgdGhpcy51cGRhdGVMaW5lTnVtYmVycyhlbGVtZW50NCk7CiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmhpZ2hsaWdodFRpbWVyKTsKICAgIH0pOwogICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCAoZTExKSA9PiB7CiAgICAgIGlmIChlMTEua2V5ID09PSAiVGFiIikgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkgewogICAgICAgICAgY29uc3QgcmFuZ2UyID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7CiAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIgICIpOwogICAgICAgICAgcmFuZ2UyLmluc2VydE5vZGUodGV4dE5vZGUpOwogICAgICAgICAgcmFuZ2UyLnNldFN0YXJ0QWZ0ZXIodGV4dE5vZGUpOwogICAgICAgICAgcmFuZ2UyLnNldEVuZEFmdGVyKHRleHROb2RlKTsKICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZTIpOwogICAgICAgICAgaGFuZGxlcnMyLm9uSW5wdXQobmV3IElucHV0RXZlbnQoImlucHV0IikpOwogICAgICAgICAgdGhpcy51cGRhdGVMaW5lTnVtYmVycyhlbGVtZW50NCk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoWyJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCIsICJBcnJvd1VwIiwgIkFycm93RG93biJdLmluY2x1ZGVzKGUxMS5rZXkpKSB7CiAgICAgICAgY29uc3QgY3Vyc29yUG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCk7CiAgICAgICAgY29uc3QgdGV4dExlbmd0aCA9IGVkaXRvci50ZXh0Q29udGVudD8ubGVuZ3RoIHx8IDA7CiAgICAgICAgaWYgKGUxMS5rZXkgPT09ICJBcnJvd0xlZnQiICYmIGN1cnNvclBvcyA9PT0gMCB8fCBlMTEua2V5ID09PSAiQXJyb3dSaWdodCIgJiYgY3Vyc29yUG9zID09PSB0ZXh0TGVuZ3RoKSB7CiAgICAgICAgICBoYW5kbGVyczIub25LZXlEb3duKGUxMSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChlMTEua2V5ID09PSAiQXJyb3dVcCIgfHwgZTExLmtleSA9PT0gIkFycm93RG93biIpIHsKICAgICAgICAgIGNvbnN0IGxpbmVzID0gKGVkaXRvci50ZXh0Q29udGVudCB8fCAiIikuc3BsaXQoIlxuIik7CiAgICAgICAgICBjb25zdCBjdXJyZW50TGluZSA9IHRoaXMuZ2V0Q3VycmVudExpbmVJbmRleChlZGl0b3IpOwogICAgICAgICAgaWYgKGUxMS5rZXkgPT09ICJBcnJvd1VwIiAmJiBjdXJyZW50TGluZSA9PT0gMCB8fCBlMTEua2V5ID09PSAiQXJyb3dEb3duIiAmJiBjdXJyZW50TGluZSA9PT0gbGluZXMubGVuZ3RoIC0gMSkgewogICAgICAgICAgICBoYW5kbGVyczIub25LZXlEb3duKGUxMSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaGFuZGxlcnMyLm9uS2V5RG93bihlMTEpOwogICAgfSk7CiAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcigicGFzdGUiLCAoZTExKSA9PiB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb25zdCB0ZXh0OSA9IGUxMS5jbGlwYm9hcmREYXRhPy5nZXREYXRhKCJ0ZXh0L3BsYWluIik7CiAgICAgIGlmICh0ZXh0OSkgewogICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkgewogICAgICAgICAgY29uc3QgcmFuZ2UyID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7CiAgICAgICAgICByYW5nZTIuZGVsZXRlQ29udGVudHMoKTsKICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dDkpOwogICAgICAgICAgcmFuZ2UyLmluc2VydE5vZGUodGV4dE5vZGUpOwogICAgICAgICAgcmFuZ2UyLnNldFN0YXJ0QWZ0ZXIodGV4dE5vZGUpOwogICAgICAgICAgcmFuZ2UyLnNldEVuZEFmdGVyKHRleHROb2RlKTsKICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZTIpOwogICAgICAgICAgaGFuZGxlcnMyLm9uSW5wdXQobmV3IElucHV0RXZlbnQoImlucHV0IikpOwogICAgICAgICAgdGhpcy51cGRhdGVMaW5lTnVtYmVycyhlbGVtZW50NCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCJjb21wb3NpdGlvbnN0YXJ0IiwgKCkgPT4gaGFuZGxlcnMyLm9uQ29tcG9zaXRpb25TdGFydCgpKTsKICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCJjb21wb3NpdGlvbmVuZCIsICgpID0+IGhhbmRsZXJzMi5vbkNvbXBvc2l0aW9uRW5kKCkpOwogICAgaWYgKGJsb2NrLmNvbnRlbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gZWRpdG9yKSB7CiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgdGhpcy5hcHBseUhpZ2hsaWdodGluZyhlbGVtZW50NCwgYmxvY2spOwogICAgICB9KTsKICAgIH0KICB9CiAgdXBkYXRlTGluZU51bWJlcnMoZWxlbWVudDQpIHsKICAgIGNvbnN0IGVkaXRvciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5jb2RlLWVkaXRvciIpOwogICAgY29uc3QgbGluZU51bWJlcnNDb250YWluZXIgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIubGluZS1udW1iZXJzIik7CiAgICBpZiAoIWVkaXRvciB8fCAhbGluZU51bWJlcnNDb250YWluZXIpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IGNvbnRlbnQzID0gZWRpdG9yLnRleHRDb250ZW50IHx8ICIiOwogICAgY29uc3QgbGluZXMgPSBjb250ZW50My5zcGxpdCgiXG4iKTsKICAgIGNvbnN0IGxpbmVDb3VudCA9IGxpbmVzLmxlbmd0aCB8fCAxOwogICAgbGV0IGxpbmVOdW1iZXJzSHRtbCA9ICIiOwogICAgZm9yIChsZXQgaTExID0gMTsgaTExIDw9IGxpbmVDb3VudDsgaTExKyspIHsKICAgICAgbGluZU51bWJlcnNIdG1sICs9IGA8ZGl2IGNsYXNzPSJsaW5lLW51bWJlciI+JHtpMTF9PC9kaXY+YDsKICAgIH0KICAgIGxpbmVOdW1iZXJzQ29udGFpbmVyLmlubmVySFRNTCA9IGxpbmVOdW1iZXJzSHRtbDsKICB9CiAgZ2V0Q3VycmVudExpbmVJbmRleChlZGl0b3IpIHsKICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKQogICAgICByZXR1cm4gMDsKICAgIGNvbnN0IHJhbmdlMiA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgY29uc3QgcHJlQ2FyZXRSYW5nZSA9IHJhbmdlMi5jbG9uZVJhbmdlKCk7CiAgICBwcmVDYXJldFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlZGl0b3IpOwogICAgcHJlQ2FyZXRSYW5nZS5zZXRFbmQocmFuZ2UyLnN0YXJ0Q29udGFpbmVyLCByYW5nZTIuc3RhcnRPZmZzZXQpOwogICAgY29uc3QgdGV4dEJlZm9yZUN1cnNvciA9IHByZUNhcmV0UmFuZ2UudG9TdHJpbmcoKTsKICAgIGNvbnN0IGxpbmVzQmVmb3JlQ3Vyc29yID0gdGV4dEJlZm9yZUN1cnNvci5zcGxpdCgiXG4iKTsKICAgIHJldHVybiBsaW5lc0JlZm9yZUN1cnNvci5sZW5ndGggLSAxOwogIH0KICBhc3luYyBhcHBseUhpZ2hsaWdodGluZyhlbGVtZW50NCwgYmxvY2spIHsKICAgIGNvbnN0IGVkaXRvciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5jb2RlLWVkaXRvciIpOwogICAgaWYgKCFlZGl0b3IpCiAgICAgIHJldHVybjsKICAgIGlmICghdGhpcy5oaWdobGlnaHRKcykgewogICAgICB0aGlzLmhpZ2hsaWdodEpzID0gYXdhaXQgRGVlc1NlcnZpY2VMaWJMb2FkZXIuZ2V0SW5zdGFuY2UoKS5sb2FkSGlnaGxpZ2h0SnMoKTsKICAgIH0KICAgIGNvbnN0IGN1cnNvclBvcyA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQpOwogICAgY29uc3QgY29udGVudDMgPSBlZGl0b3IudGV4dENvbnRlbnQgfHwgIiI7CiAgICBjb25zdCBsYW5ndWFnZSA9IGJsb2NrLm1ldGFkYXRhPy5sYW5ndWFnZSB8fCAidHlwZXNjcmlwdCI7CiAgICB0cnkgewogICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmhpZ2hsaWdodEpzLmhpZ2hsaWdodChjb250ZW50MywgewogICAgICAgIGxhbmd1YWdlLAogICAgICAgIGlnbm9yZUlsbGVnYWxzOiB0cnVlCiAgICAgIH0pOwogICAgICBpZiAocmVzdWx0LnZhbHVlKSB7CiAgICAgICAgZWRpdG9yLmlubmVySFRNTCA9IHJlc3VsdC52YWx1ZTsKICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZWRpdG9yICYmIGN1cnNvclBvcyAhPT0gbnVsbCkgewogICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICAgICAgV3lzaXd5Z1NlbGVjdGlvbi5zZXRDdXJzb3JQb3NpdGlvbihlZGl0b3IsIGN1cnNvclBvcyk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUud2FybigiU3ludGF4IGhpZ2hsaWdodGluZyBmYWlsZWQ6IiwgZXJyb3IpOwogICAgfQogIH0KICBlc2NhcGVIdG1sKHRleHQ5KSB7CiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIGRpdi50ZXh0Q29udGVudCA9IHRleHQ5OwogICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7CiAgfQogIGdldENvbnRlbnQoZWxlbWVudDQpIHsKICAgIGNvbnN0IGVkaXRvciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5jb2RlLWVkaXRvciIpOwogICAgcmV0dXJuIGVkaXRvcj8udGV4dENvbnRlbnQgfHwgIiI7CiAgfQogIHNldENvbnRlbnQoZWxlbWVudDQsIGNvbnRlbnQzKSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuY29kZS1lZGl0b3IiKTsKICAgIGlmICghZWRpdG9yKQogICAgICByZXR1cm47CiAgICBlZGl0b3IudGV4dENvbnRlbnQgPSBjb250ZW50MzsKICAgIHRoaXMudXBkYXRlTGluZU51bWJlcnMoZWxlbWVudDQpOwogICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGVkaXRvcikgewogICAgICBjb25zdCBibG9jayA9IHsKICAgICAgICBpZDogZWRpdG9yLmRhdGFzZXQuYmxvY2tJZCB8fCAiIiwKICAgICAgICB0eXBlOiAiY29kZSIsCiAgICAgICAgY29udGVudDogY29udGVudDMsCiAgICAgICAgbWV0YWRhdGE6IHsKICAgICAgICAgIGxhbmd1YWdlOiBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuY29kZS1ibG9jay1jb250YWluZXIiKT8uZ2V0QXR0cmlidXRlKCJkYXRhLWxhbmd1YWdlIikgfHwgInR5cGVzY3JpcHQiCiAgICAgICAgfQogICAgICB9OwogICAgICB0aGlzLmFwcGx5SGlnaGxpZ2h0aW5nKGVsZW1lbnQ0LCBibG9jayk7CiAgICB9CiAgfQogIGdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuY29kZS1lZGl0b3IiKTsKICAgIGlmICghZWRpdG9yKQogICAgICByZXR1cm4gbnVsbDsKICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKQogICAgICByZXR1cm4gbnVsbDsKICAgIGNvbnN0IHJhbmdlMiA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgaWYgKCFlZGl0b3IuY29udGFpbnMocmFuZ2UyLnN0YXJ0Q29udGFpbmVyKSkKICAgICAgcmV0dXJuIG51bGw7CiAgICBjb25zdCBwcmVDYXJldFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgIHByZUNhcmV0UmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVkaXRvcik7CiAgICBwcmVDYXJldFJhbmdlLnNldEVuZChyYW5nZTIuc3RhcnRDb250YWluZXIsIHJhbmdlMi5zdGFydE9mZnNldCk7CiAgICByZXR1cm4gcHJlQ2FyZXRSYW5nZS50b1N0cmluZygpLmxlbmd0aDsKICB9CiAgc2V0Q3Vyc29yVG9TdGFydChlbGVtZW50NCkgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmNvZGUtZWRpdG9yIik7CiAgICBpZiAoZWRpdG9yKSB7CiAgICAgIFd5c2l3eWdTZWxlY3Rpb24uc2V0Q3Vyc29yUG9zaXRpb24oZWRpdG9yLCAwKTsKICAgIH0KICB9CiAgc2V0Q3Vyc29yVG9FbmQoZWxlbWVudDQpIHsKICAgIGNvbnN0IGVkaXRvciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5jb2RlLWVkaXRvciIpOwogICAgaWYgKGVkaXRvcikgewogICAgICBjb25zdCBsZW5ndGggPSBlZGl0b3IudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwOwogICAgICBXeXNpd3lnU2VsZWN0aW9uLnNldEN1cnNvclBvc2l0aW9uKGVkaXRvciwgbGVuZ3RoKTsKICAgIH0KICB9CiAgZm9jdXMoZWxlbWVudDQpIHsKICAgIGNvbnN0IGVkaXRvciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5jb2RlLWVkaXRvciIpOwogICAgZWRpdG9yPy5mb2N1cygpOwogIH0KICBmb2N1c1dpdGhDdXJzb3IoZWxlbWVudDQsIHBvc2l0aW9uMyA9ICJlbmQiKSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuY29kZS1lZGl0b3IiKTsKICAgIGlmICghZWRpdG9yKQogICAgICByZXR1cm47CiAgICBlZGl0b3IuZm9jdXMoKTsKICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgIGlmIChwb3NpdGlvbjMgPT09ICJzdGFydCIpIHsKICAgICAgICB0aGlzLnNldEN1cnNvclRvU3RhcnQoZWxlbWVudDQpOwogICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uMyA9PT0gImVuZCIpIHsKICAgICAgICB0aGlzLnNldEN1cnNvclRvRW5kKGVsZW1lbnQ0KTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcG9zaXRpb24zID09PSAibnVtYmVyIikgewogICAgICAgIFd5c2l3eWdTZWxlY3Rpb24uc2V0Q3Vyc29yUG9zaXRpb24oZWRpdG9yLCBwb3NpdGlvbjMpOwogICAgICB9CiAgICB9KTsKICB9CiAgZ2V0U3BsaXRDb250ZW50KGVsZW1lbnQ0KSB7CiAgICBjb25zdCBwb3NpdGlvbjMgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KTsKICAgIGlmIChwb3NpdGlvbjMgPT09IG51bGwpCiAgICAgIHJldHVybiBudWxsOwogICAgY29uc3QgY29udGVudDMgPSB0aGlzLmdldENvbnRlbnQoZWxlbWVudDQpOwogICAgcmV0dXJuIHsKICAgICAgYmVmb3JlOiBjb250ZW50My5zdWJzdHJpbmcoMCwgcG9zaXRpb24zKSwKICAgICAgYWZ0ZXI6IGNvbnRlbnQzLnN1YnN0cmluZyhwb3NpdGlvbjMpCiAgICB9OwogIH0KICBnZXRTdHlsZXMoKSB7CiAgICByZXR1cm4gYAogICAgICAvKiBDb2RlIEJsb2NrIENvbnRhaW5lciAtIE1pbmltYWxpc3Qgc2hhZGNuIHN0eWxlICovCiAgICAgIC5jb2RlLWJsb2NrLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1hcmdpbjogMTJweCAwOwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzNzQxNTEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2RlLWJsb2NrLWNvbnRhaW5lci5zZWxlY3RlZCB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzljYTNhZiIsICIjNmI3MjgwIil9OwogICAgICB9CiAgICAgIAogICAgICAuY29kZS1ibG9jay1jb250YWluZXIuZWRpdGluZyB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzZiNzI4MCIsICIjOWNhM2FmIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmFmYWZhIiwgIiMwYTBhMGEiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC8qIEhlYWRlciAtIFNpbXBsaWZpZWQgKi8KICAgICAgLmNvZGUtaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzM3NDE1MSIpfTsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CiAgICAgIAogICAgICAubGFuZ3VhZ2Utc2VsZWN0b3IgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2YjcyODAiLCAiIzljYTNhZiIpfTsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICAgICAgICBmb250LWZhbWlseTogJHtjc3NHZWlzdEZvbnRGYW1pbHl9OwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CiAgICAgIAogICAgICAubGFuZ3VhZ2Utc2VsZWN0b3I6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjlmYWZiIiwgIiMxZjI5MzciKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzc0MTUxIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzM3NDE1MSIsICIjZTVlN2ViIil9OwogICAgICB9CiAgICAgIAogICAgICAubGFuZ3VhZ2Utc2VsZWN0b3I6Zm9jdXMgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5Y2EzYWYiLCAiIzZiNzI4MCIpfTsKICAgICAgfQogICAgICAKICAgICAgLyogQ29weSBCdXR0b24gLSBNaW5pbWFsICovCiAgICAgIC5jb3B5LWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNHB4OwogICAgICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzZiNzI4MCIsICIjOWNhM2FmIil9OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LWZhbWlseTogJHtjc3NHZWlzdEZvbnRGYW1pbHl9OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CiAgICAgIAogICAgICAuY29weS1idXR0b246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjlmYWZiIiwgIiMxZjI5MzciKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzc0MTUxIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzM3NDE1MSIsICIjZTVlN2ViIil9OwogICAgICB9CiAgICAgIAogICAgICAuY29weS1idXR0b246YWN0aXZlIHsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTgpOwogICAgICB9CiAgICAgIAogICAgICAuY29weS1idXR0b24uY29waWVkIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwNTk2NjkiLCAiIzEwYjk4MSIpfTsKICAgICAgfQogICAgICAKICAgICAgLmNvcHktaWNvbiB7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgb3BhY2l0eTogMC43OwogICAgICB9CiAgICAgIAogICAgICAuY29weS1idXR0b246aG92ZXIgLmNvcHktaWNvbiB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQogICAgICAKICAgICAgLmNvcHktdGV4dCB7CiAgICAgICAgbWluLXdpZHRoOiA0MHB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQogICAgICAKICAgICAgLyogQ29kZSBCb2R5ICovCiAgICAgIC5jb2RlLWJvZHkgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmFmYWZhIiwgIiMwYTBhMGEiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC8qIExpbmUgTnVtYmVycyAtIFN1YnRsZSAqLwogICAgICAubGluZS1udW1iZXJzIHsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBwYWRkaW5nOiAxMnB4IDA7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgbWluLXdpZHRoOiA0MHB4OwogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzNzQxNTEiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5saW5lLW51bWJlciB7CiAgICAgICAgcGFkZGluZzogMCAxMnB4IDAgOHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzljYTNhZiIsICIjNGI1NTYzIil9OwogICAgICAgIGZvbnQtZmFtaWx5OiAke2Nzc01vbm9Gb250RmFtaWx5fTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICB9CiAgICAgIAogICAgICAvKiBDb2RlIENvbnRlbnQgKi8KICAgICAgLmNvZGUtY29udGVudCB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtcHJlIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtZWRpdG9yIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtZmFtaWx5OiAke2Nzc01vbm9Gb250RmFtaWx5fTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTExODI3IiwgIiNmOWZhZmIiKX07CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBtaW4taGVpZ2h0OiA2MHB4OwogICAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgICB9CiAgICAgIAogICAgICAvKiBQbGFjZWhvbGRlciAqLwogICAgICAuY29kZS1lZGl0b3I6ZW1wdHk6OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIi8vIFR5cGUgb3IgcGFzdGUgY29kZSBoZXJlLi4uIjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5Y2EzYWYiLCAiIzRiNTU2MyIpfTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgICAKICAgICAgLyogV2hlbiBlZGl0aW5nIChmb2N1c2VkKSwgc2hvdyBncmV5IHRleHQgd2l0aG91dCBoaWdobGlnaHRpbmcgKi8KICAgICAgLmNvZGUtYmxvY2stY29udGFpbmVyLmVkaXRpbmcgLmNvZGUtZWRpdG9yIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2YjcyODAiLCAiIzljYTNhZiIpfSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAuY29kZS1ibG9jay1jb250YWluZXIuZWRpdGluZyAuY29kZS1lZGl0b3IgKiB7CiAgICAgICAgY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLyogU3ludGF4IEhpZ2hsaWdodGluZyAtIE11dGVkIGNvbG9ycyAqLwogICAgICAuY29kZS1lZGl0b3IgLmhsanMta2V5d29yZCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZGMyNjI2IiwgIiNmODcxNzEiKX07CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtZWRpdG9yIC5obGpzLXN0cmluZyB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDU5NjY5IiwgIiMxMGI5ODEiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2RlLWVkaXRvciAuaGxqcy1udW1iZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzdjM2FlZCIsICIjYTc4YmZhIil9OwogICAgICB9CiAgICAgIAogICAgICAuY29kZS1lZGl0b3IgLmhsanMtZnVuY3Rpb24gewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzI1NjNlYiIsICIjNjBhNWZhIil9OwogICAgICB9CiAgICAgIAogICAgICAuY29kZS1lZGl0b3IgLmhsanMtY29tbWVudCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNmI3MjgwIiwgIiM2YjcyODAiKX07CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICB9CiAgICAgIAogICAgICAuY29kZS1lZGl0b3IgLmhsanMtdmFyaWFibGUsCiAgICAgIC5jb2RlLWVkaXRvciAuaGxqcy1hdHRyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlYTU4MGMiLCAiI2ZiOTIzYyIpfTsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtZWRpdG9yIC5obGpzLWNsYXNzLAogICAgICAuY29kZS1lZGl0b3IgLmhsanMtdGl0bGUgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzI1NjNlYiIsICIjNjBhNWZhIil9OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2RlLWVkaXRvciAuaGxqcy1wYXJhbXMgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzM3NDE1MSIsICIjZTVlN2ViIil9OwogICAgICB9CiAgICAgIAogICAgICAuY29kZS1lZGl0b3IgLmhsanMtYnVpbHRfaW4gewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzdjM2FlZCIsICIjYTc4YmZhIil9OwogICAgICB9CiAgICAgIAogICAgICAuY29kZS1lZGl0b3IgLmhsanMtbGl0ZXJhbCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjN2MzYWVkIiwgIiNhNzhiZmEiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2RlLWVkaXRvciAuaGxqcy1tZXRhIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2YjcyODAiLCAiIzljYTNhZiIpfTsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtZWRpdG9yIC5obGpzLXB1bmN0dWF0aW9uIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzNzQxNTEiLCAiI2QxZDVkYiIpfTsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtZWRpdG9yIC5obGpzLXRhZyB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZGMyNjI2IiwgIiNmODcxNzEiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2RlLWVkaXRvciAuaGxqcy1hdHRyaWJ1dGUgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzI1NjNlYiIsICIjNjBhNWZhIil9OwogICAgICB9CiAgICAgIAogICAgICAuY29kZS1lZGl0b3IgLmhsanMtc2VsZWN0b3ItdGFnIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkYzI2MjYiLCAiI2Y4NzE3MSIpfTsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtZWRpdG9yIC5obGpzLXNlbGVjdG9yLWNsYXNzIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyNTYzZWIiLCAiIzYwYTVmYSIpfTsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtZWRpdG9yIC5obGpzLXNlbGVjdG9yLWlkIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3YzNhZWQiLCAiI2E3OGJmYSIpfTsKICAgICAgfQogICAgICAKICAgICAgLyogU2VsZWN0aW9uICovCiAgICAgIC5jb2RlLWVkaXRvcjo6c2VsZWN0aW9uLAogICAgICAuY29kZS1lZGl0b3IgKjo6c2VsZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSg5OSwgMTAyLCAyNDEsIDAuMikiLCAicmdiYSg5OSwgMTAyLCAyNDEsIDAuMykiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC8qIFNjcm9sbGJhciBzdHlsaW5nIC0gTWluaW1hbCAqLwogICAgICAuY29kZS1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhciB7CiAgICAgICAgaGVpZ2h0OiA2cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2RlLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDFkNWRiIiwgIiM0YjU1NjMiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICB9CiAgICAgIAogICAgICAuY29kZS1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5Y2EzYWYiLCAiIzZiNzI4MCIpfTsKICAgICAgfQogICAgYDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL2Jsb2Nrcy90ZXh0L2xpc3QuYmxvY2suanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIExpc3RCbG9ja0hhbmRsZXIgPSBjbGFzcyBleHRlbmRzIEJhc2VCbG9ja0hhbmRsZXIgewogIHR5cGUgPSAibGlzdCI7CiAgLy8gVHJhY2sgY3Vyc29yIHBvc2l0aW9uIGFuZCBsaXN0IHN0YXRlCiAgbGFzdEtub3duQ3Vyc29yUG9zaXRpb24gPSAwOwogIGxhc3RTZWxlY3RlZFRleHQgPSAiIjsKICBzZWxlY3Rpb25IYW5kbGVyID0gbnVsbDsKICByZW5kZXIoYmxvY2ssIGlzU2VsZWN0ZWQpIHsKICAgIGNvbnN0IHNlbGVjdGVkQ2xhc3MgPSBpc1NlbGVjdGVkID8gIiBzZWxlY3RlZCIgOiAiIjsKICAgIGNvbnN0IGxpc3RUeXBlID0gYmxvY2subWV0YWRhdGE/Lmxpc3RUeXBlIHx8ICJ1bm9yZGVyZWQiOwogICAgY29uc3QgbGlzdFRhZyA9IGxpc3RUeXBlID09PSAib3JkZXJlZCIgPyAib2wiIDogInVsIjsKICAgIGNvbnN0IGxpc3RDb250ZW50ID0gdGhpcy5yZW5kZXJMaXN0Q29udGVudChibG9jay5jb250ZW50LCBibG9jay5tZXRhZGF0YSk7CiAgICByZXR1cm4gYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9ImJsb2NrIGxpc3Qke3NlbGVjdGVkQ2xhc3N9IgogICAgICAgIGNvbnRlbnRlZGl0YWJsZT0idHJ1ZSIKICAgICAgICBkYXRhLWJsb2NrLWlkPSIke2Jsb2NrLmlkfSIKICAgICAgICBkYXRhLWJsb2NrLXR5cGU9IiR7YmxvY2sudHlwZX0iCiAgICAgID4ke2xpc3RDb250ZW50fTwvZGl2PgogICAgYDsKICB9CiAgcmVuZGVyTGlzdENvbnRlbnQoY29udGVudDMsIG1ldGFkYXRhKSB7CiAgICBpZiAoIWNvbnRlbnQzKQogICAgICByZXR1cm4gIjx1bD48bGk+PC9saT48L3VsPiI7CiAgICBjb25zdCBsaXN0VHlwZSA9IG1ldGFkYXRhPy5saXN0VHlwZSB8fCAidW5vcmRlcmVkIjsKICAgIGNvbnN0IGxpc3RUYWcgPSBsaXN0VHlwZSA9PT0gIm9yZGVyZWQiID8gIm9sIiA6ICJ1bCI7CiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQzLnNwbGl0KCJcbiIpLmZpbHRlcigobGluZSkgPT4gbGluZS50cmltKCkpOwogICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gYDwke2xpc3RUYWd9PjxsaT48L2xpPjwvJHtsaXN0VGFnfT5gOwogICAgfQogICAgY29uc3QgbGlzdEl0ZW1zID0gbGluZXMubWFwKChsaW5lKSA9PiBgPGxpPiR7bGluZX08L2xpPmApLmpvaW4oIiIpOwogICAgcmV0dXJuIGA8JHtsaXN0VGFnfT4ke2xpc3RJdGVtc308LyR7bGlzdFRhZ30+YDsKICB9CiAgc2V0dXAoZWxlbWVudDQsIGJsb2NrLCBoYW5kbGVyczIpIHsKICAgIGNvbnN0IGxpc3RCbG9jayA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jay5saXN0Iik7CiAgICBpZiAoIWxpc3RCbG9jaykgewogICAgICBjb25zb2xlLmVycm9yKCJMaXN0QmxvY2tIYW5kbGVyLnNldHVwOiBObyBsaXN0IGJsb2NrIGVsZW1lbnQgZm91bmQiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGJsb2NrLmNvbnRlbnQgJiYgIWxpc3RCbG9jay5pbm5lckhUTUwpIHsKICAgICAgbGlzdEJsb2NrLmlubmVySFRNTCA9IHRoaXMucmVuZGVyTGlzdENvbnRlbnQoYmxvY2suY29udGVudCwgYmxvY2subWV0YWRhdGEpOwogICAgfQogICAgbGlzdEJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgKGUxMSkgPT4gewogICAgICBoYW5kbGVyczIub25JbnB1dChlMTEpOwogICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KTsKICAgICAgaWYgKHBvcyAhPT0gbnVsbCkgewogICAgICAgIHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gPSBwb3M7CiAgICAgIH0KICAgIH0pOwogICAgbGlzdEJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCAoZTExKSA9PiB7CiAgICAgIGNvbnN0IHBvcyA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQpOwogICAgICBpZiAocG9zICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IHBvczsKICAgICAgfQogICAgICBpZiAoZTExLmtleSA9PT0gIkVudGVyIiAmJiAhZTExLnNoaWZ0S2V5KSB7CiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7CiAgICAgICAgICBjb25zdCByYW5nZTIgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAgIGNvbnN0IGN1cnJlbnRMaSA9IHJhbmdlMi5zdGFydENvbnRhaW5lci5wYXJlbnRFbGVtZW50Py5jbG9zZXN0KCJsaSIpOwogICAgICAgICAgaWYgKGN1cnJlbnRMaSAmJiBjdXJyZW50TGkudGV4dENvbnRlbnQgPT09ICIiKSB7CiAgICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBoYW5kbGVyczIub25LZXlEb3duKGUxMSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaGFuZGxlcnMyLm9uS2V5RG93bihlMTEpOwogICAgfSk7CiAgICBsaXN0QmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLCAoKSA9PiB7CiAgICAgIGhhbmRsZXJzMi5vbkZvY3VzKCk7CiAgICB9KTsKICAgIGxpc3RCbG9jay5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgKCkgPT4gewogICAgICBoYW5kbGVyczIub25CbHVyKCk7CiAgICB9KTsKICAgIGxpc3RCbG9jay5hZGRFdmVudExpc3RlbmVyKCJjb21wb3NpdGlvbnN0YXJ0IiwgKCkgPT4gewogICAgICBoYW5kbGVyczIub25Db21wb3NpdGlvblN0YXJ0KCk7CiAgICB9KTsKICAgIGxpc3RCbG9jay5hZGRFdmVudExpc3RlbmVyKCJjb21wb3NpdGlvbmVuZCIsICgpID0+IHsKICAgICAgaGFuZGxlcnMyLm9uQ29tcG9zaXRpb25FbmQoKTsKICAgIH0pOwogICAgbGlzdEJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCAoZTExKSA9PiB7CiAgICAgIGNvbnN0IHBvcyA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQpOwogICAgICBpZiAocG9zICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IHBvczsKICAgICAgfQogICAgICBoYW5kbGVyczIub25Nb3VzZVVwPy4oZTExKTsKICAgIH0pOwogICAgbGlzdEJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKGUxMSkgPT4gewogICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KTsKICAgICAgICBpZiAocG9zICE9PSBudWxsKSB7CiAgICAgICAgICB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gcG9zOwogICAgICAgIH0KICAgICAgfSwgMCk7CiAgICB9KTsKICAgIGxpc3RCbG9jay5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsIChlMTEpID0+IHsKICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCk7CiAgICAgIGlmIChwb3MgIT09IG51bGwpIHsKICAgICAgICB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uID0gcG9zOwogICAgICB9CiAgICB9KTsKICAgIHRoaXMuc2V0dXBTZWxlY3Rpb25IYW5kbGVyKGVsZW1lbnQ0LCBsaXN0QmxvY2ssIGJsb2NrKTsKICB9CiAgc2V0dXBTZWxlY3Rpb25IYW5kbGVyKGVsZW1lbnQ0LCBsaXN0QmxvY2ssIGJsb2NrKSB7CiAgICBjb25zdCBjaGVja1NlbGVjdGlvbiA9ICgpID0+IHsKICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvbi50b1N0cmluZygpOwogICAgICBpZiAoc2VsZWN0ZWRUZXh0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgIGlmICh0aGlzLmxhc3RTZWxlY3RlZFRleHQpIHsKICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkVGV4dCA9ICIiOwogICAgICAgICAgdGhpcy5kaXNwYXRjaFNlbGVjdGlvbkV2ZW50KGVsZW1lbnQ0LCB7CiAgICAgICAgICAgIHRleHQ6ICIiLAogICAgICAgICAgICBibG9ja0lkOiBibG9jay5pZCwKICAgICAgICAgICAgaGFzU2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCB3eXNpd3lnQmxvY2syID0gbGlzdEJsb2NrLmdldFJvb3ROb2RlKCkuaG9zdDsKICAgICAgY29uc3QgcGFyZW50Q29tcG9uZW50ID0gd3lzaXd5Z0Jsb2NrMj8uY2xvc2VzdCgiZGVlcy1pbnB1dC13eXNpd3lnIik7CiAgICAgIGNvbnN0IHBhcmVudFNoYWRvd1Jvb3QgPSBwYXJlbnRDb21wb25lbnQ/LnNoYWRvd1Jvb3Q7CiAgICAgIGNvbnN0IGJsb2NrU2hhZG93Um9vdCA9IHd5c2l3eWdCbG9jazI/LnNoYWRvd1Jvb3Q7CiAgICAgIGNvbnN0IHNoYWRvd1Jvb3RzID0gW107CiAgICAgIGlmIChwYXJlbnRTaGFkb3dSb290KQogICAgICAgIHNoYWRvd1Jvb3RzLnB1c2gocGFyZW50U2hhZG93Um9vdCk7CiAgICAgIGlmIChibG9ja1NoYWRvd1Jvb3QpCiAgICAgICAgc2hhZG93Um9vdHMucHVzaChibG9ja1NoYWRvd1Jvb3QpOwogICAgICBjb25zdCBzZWxlY3Rpb25JbmZvID0gV3lzaXd5Z1NlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvKC4uLnNoYWRvd1Jvb3RzKTsKICAgICAgaWYgKCFzZWxlY3Rpb25JbmZvKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3Qgc3RhcnRJbkJsb2NrID0gV3lzaXd5Z1NlbGVjdGlvbi5jb250YWluc0Fjcm9zc1NoYWRvd0RPTShsaXN0QmxvY2ssIHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIpOwogICAgICBjb25zdCBlbmRJbkJsb2NrID0gV3lzaXd5Z1NlbGVjdGlvbi5jb250YWluc0Fjcm9zc1NoYWRvd0RPTShsaXN0QmxvY2ssIHNlbGVjdGlvbkluZm8uZW5kQ29udGFpbmVyKTsKICAgICAgaWYgKHN0YXJ0SW5CbG9jayB8fCBlbmRJbkJsb2NrKSB7CiAgICAgICAgaWYgKHNlbGVjdGVkVGV4dCAhPT0gdGhpcy5sYXN0U2VsZWN0ZWRUZXh0KSB7CiAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZFRleHQgPSBzZWxlY3RlZFRleHQ7CiAgICAgICAgICBjb25zdCByYW5nZTIgPSBXeXNpd3lnU2VsZWN0aW9uLmNyZWF0ZVJhbmdlRnJvbUluZm8oc2VsZWN0aW9uSW5mbyk7CiAgICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgdGhpcy5kaXNwYXRjaFNlbGVjdGlvbkV2ZW50KGVsZW1lbnQ0LCB7CiAgICAgICAgICAgIHRleHQ6IHNlbGVjdGVkVGV4dC50cmltKCksCiAgICAgICAgICAgIGJsb2NrSWQ6IGJsb2NrLmlkLAogICAgICAgICAgICByYW5nZTogcmFuZ2UyLAogICAgICAgICAgICByZWN0LAogICAgICAgICAgICBoYXNTZWxlY3Rpb246IHRydWUKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0aGlzLmxhc3RTZWxlY3RlZFRleHQpIHsKICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZFRleHQgPSAiIjsKICAgICAgICB0aGlzLmRpc3BhdGNoU2VsZWN0aW9uRXZlbnQoZWxlbWVudDQsIHsKICAgICAgICAgIHRleHQ6ICIiLAogICAgICAgICAgYmxvY2tJZDogYmxvY2suaWQsCiAgICAgICAgICBoYXNTZWxlY3Rpb246IGZhbHNlCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3Rpb25jaGFuZ2UiLCBjaGVja1NlbGVjdGlvbik7CiAgICB0aGlzLnNlbGVjdGlvbkhhbmRsZXIgPSBjaGVja1NlbGVjdGlvbjsKICAgIGNvbnN0IHd5c2l3eWdCbG9jayA9IGxpc3RCbG9jay5nZXRSb290Tm9kZSgpLmhvc3Q7CiAgICBpZiAod3lzaXd5Z0Jsb2NrKSB7CiAgICAgIGNvbnN0IG9yaWdpbmFsRGlzY29ubmVjdGVkQ2FsbGJhY2sgPSB3eXNpd3lnQmxvY2suZGlzY29ubmVjdGVkQ2FsbGJhY2s7CiAgICAgIHd5c2l3eWdCbG9jay5kaXNjb25uZWN0ZWRDYWxsYmFjayA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbkhhbmRsZXIpIHsKICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIsIHRoaXMuc2VsZWN0aW9uSGFuZGxlcik7CiAgICAgICAgICB0aGlzLnNlbGVjdGlvbkhhbmRsZXIgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAob3JpZ2luYWxEaXNjb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgYXdhaXQgb3JpZ2luYWxEaXNjb25uZWN0ZWRDYWxsYmFjay5jYWxsKHd5c2l3eWdCbG9jayk7CiAgICAgICAgfQogICAgICB9LmJpbmQodGhpcyk7CiAgICB9CiAgfQogIGRpc3BhdGNoU2VsZWN0aW9uRXZlbnQoZWxlbWVudDQsIGRldGFpbCkgewogICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoImJsb2NrLXRleHQtc2VsZWN0ZWQiLCB7CiAgICAgIGRldGFpbCwKICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgY29tcG9zZWQ6IHRydWUKICAgIH0pOwogICAgZWxlbWVudDQuZGlzcGF0Y2hFdmVudChldmVudCk7CiAgfQogIGdldFN0eWxlcygpIHsKICAgIHJldHVybiBgCiAgICAgIC8qIExpc3Qgc3BlY2lmaWMgc3R5bGVzICovCiAgICAgIC5ibG9jay5saXN0IHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CiAgICAgIAogICAgICAuYmxvY2subGlzdCB1bCwKICAgICAgLmJsb2NrLmxpc3Qgb2wgewogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDI0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5ibG9jay5saXN0IGxpIHsKICAgICAgICBtYXJnaW46IDRweCAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7CiAgICAgIH0KICAgICAgCiAgICAgIC5ibG9jay5saXN0IGxpOmxhc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICAgIH0KICAgIGA7CiAgfQogIGdldFBsYWNlaG9sZGVyKCkgewogICAgcmV0dXJuICIiOwogIH0KICAvLyBIZWxwZXIgbWV0aG9kcyBmb3IgbGlzdCBmdW5jdGlvbmFsaXR5CiAgZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQsIGNvbnRleHQyKSB7CiAgICBjb25zdCBsaXN0QmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2subGlzdCIpOwogICAgaWYgKCFsaXN0QmxvY2spCiAgICAgIHJldHVybiBudWxsOwogICAgY29uc3Qgd3lzaXd5Z0Jsb2NrID0gY29udGV4dDI/LmNvbXBvbmVudDsKICAgIGNvbnN0IHBhcmVudENvbXBvbmVudCA9IHd5c2l3eWdCbG9jaz8uY2xvc2VzdCgiZGVlcy1pbnB1dC13eXNpd3lnIik7CiAgICBjb25zdCBwYXJlbnRTaGFkb3dSb290ID0gcGFyZW50Q29tcG9uZW50Py5zaGFkb3dSb290OwogICAgY29uc3QgYmxvY2tTaGFkb3dSb290ID0gY29udGV4dDI/LnNoYWRvd1Jvb3Q7CiAgICBjb25zdCBzaGFkb3dSb290cyA9IFtdOwogICAgaWYgKHBhcmVudFNoYWRvd1Jvb3QpCiAgICAgIHNoYWRvd1Jvb3RzLnB1c2gocGFyZW50U2hhZG93Um9vdCk7CiAgICBpZiAoYmxvY2tTaGFkb3dSb290KQogICAgICBzaGFkb3dSb290cy5wdXNoKGJsb2NrU2hhZG93Um9vdCk7CiAgICBjb25zdCBzZWxlY3Rpb25JbmZvID0gV3lzaXd5Z1NlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvKC4uLnNoYWRvd1Jvb3RzKTsKICAgIGlmICghc2VsZWN0aW9uSW5mbykKICAgICAgcmV0dXJuIG51bGw7CiAgICBpZiAoIVd5c2l3eWdTZWxlY3Rpb24uY29udGFpbnNBY3Jvc3NTaGFkb3dET00obGlzdEJsb2NrLCBzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHByZUNhcmV0UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgcHJlQ2FyZXRSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobGlzdEJsb2NrKTsKICAgIHByZUNhcmV0UmFuZ2Uuc2V0RW5kKHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIsIHNlbGVjdGlvbkluZm8uc3RhcnRPZmZzZXQpOwogICAgcmV0dXJuIHByZUNhcmV0UmFuZ2UudG9TdHJpbmcoKS5sZW5ndGg7CiAgfQogIGdldENvbnRlbnQoZWxlbWVudDQsIGNvbnRleHQyKSB7CiAgICBjb25zdCBsaXN0QmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2subGlzdCIpOwogICAgaWYgKCFsaXN0QmxvY2spCiAgICAgIHJldHVybiAiIjsKICAgIGNvbnN0IGxpc3RJdGVtcyA9IGxpc3RCbG9jay5xdWVyeVNlbGVjdG9yQWxsKCJsaSIpOwogICAgY29uc3QgY29udGVudDMgPSBBcnJheS5mcm9tKGxpc3RJdGVtcykubWFwKChsaTIpID0+IGxpMi50ZXh0Q29udGVudCB8fCAiIikuam9pbigiXG4iKTsKICAgIHJldHVybiBjb250ZW50MzsKICB9CiAgc2V0Q29udGVudChlbGVtZW50NCwgY29udGVudDMsIGNvbnRleHQyKSB7CiAgICBjb25zdCBsaXN0QmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2subGlzdCIpOwogICAgaWYgKCFsaXN0QmxvY2spCiAgICAgIHJldHVybjsKICAgIGNvbnN0IGhhZEZvY3VzID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gbGlzdEJsb2NrIHx8IGVsZW1lbnQ0LnNoYWRvd1Jvb3Q/LmFjdGl2ZUVsZW1lbnQgPT09IGxpc3RCbG9jazsKICAgIGNvbnN0IGxpc3RFbGVtZW50ID0gbGlzdEJsb2NrLnF1ZXJ5U2VsZWN0b3IoInVsLCBvbCIpOwogICAgY29uc3QgaXNPcmRlcmVkID0gbGlzdEVsZW1lbnQ/LnRhZ05hbWUgPT09ICJPTCI7CiAgICBsaXN0QmxvY2suaW5uZXJIVE1MID0gdGhpcy5yZW5kZXJMaXN0Q29udGVudChjb250ZW50MywgeyBsaXN0VHlwZTogaXNPcmRlcmVkID8gIm9yZGVyZWQiIDogInVub3JkZXJlZCIgfSk7CiAgICBpZiAoaGFkRm9jdXMpIHsKICAgICAgbGlzdEJsb2NrLmZvY3VzKCk7CiAgICB9CiAgfQogIHNldEN1cnNvclRvU3RhcnQoZWxlbWVudDQsIGNvbnRleHQyKSB7CiAgICBjb25zdCBsaXN0QmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2subGlzdCIpOwogICAgaWYgKCFsaXN0QmxvY2spCiAgICAgIHJldHVybjsKICAgIGNvbnN0IGZpcnN0TGkgPSBsaXN0QmxvY2sucXVlcnlTZWxlY3RvcigibGkiKTsKICAgIGlmIChmaXJzdExpKSB7CiAgICAgIGNvbnN0IHRleHROb2RlID0gdGhpcy5nZXRGaXJzdFRleHROb2RlKGZpcnN0TGkpOwogICAgICBpZiAodGV4dE5vZGUpIHsKICAgICAgICBjb25zdCByYW5nZTIgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICByYW5nZTIuc2V0U3RhcnQodGV4dE5vZGUsIDApOwogICAgICAgIHJhbmdlMi5zZXRFbmQodGV4dE5vZGUsIDApOwogICAgICAgIHNlbGVjdGlvbj8ucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgc2VsZWN0aW9uPy5hZGRSYW5nZShyYW5nZTIpOwogICAgICB9CiAgICB9CiAgfQogIHNldEN1cnNvclRvRW5kKGVsZW1lbnQ0LCBjb250ZXh0MikgewogICAgY29uc3QgbGlzdEJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLmxpc3QiKTsKICAgIGlmICghbGlzdEJsb2NrKQogICAgICByZXR1cm47CiAgICBjb25zdCBsYXN0TGkgPSBsaXN0QmxvY2sucXVlcnlTZWxlY3RvcigibGk6bGFzdC1jaGlsZCIpOwogICAgaWYgKGxhc3RMaSkgewogICAgICBjb25zdCB0ZXh0Tm9kZSA9IHRoaXMuZ2V0TGFzdFRleHROb2RlKGxhc3RMaSk7CiAgICAgIGlmICh0ZXh0Tm9kZSkgewogICAgICAgIGNvbnN0IHJhbmdlMiA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICAgIGNvbnN0IHRleHRMZW5ndGggPSB0ZXh0Tm9kZS50ZXh0Q29udGVudD8ubGVuZ3RoIHx8IDA7CiAgICAgICAgcmFuZ2UyLnNldFN0YXJ0KHRleHROb2RlLCB0ZXh0TGVuZ3RoKTsKICAgICAgICByYW5nZTIuc2V0RW5kKHRleHROb2RlLCB0ZXh0TGVuZ3RoKTsKICAgICAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UyKTsKICAgICAgfQogICAgfQogIH0KICBnZXRGaXJzdFRleHROb2RlKGVsZW1lbnQ0KSB7CiAgICBpZiAoZWxlbWVudDQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7CiAgICAgIHJldHVybiBlbGVtZW50NDsKICAgIH0KICAgIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IGVsZW1lbnQ0LmNoaWxkTm9kZXMubGVuZ3RoOyBpMTErKykgewogICAgICBjb25zdCBmaXJzdFRleHQgPSB0aGlzLmdldEZpcnN0VGV4dE5vZGUoZWxlbWVudDQuY2hpbGROb2Rlc1tpMTFdKTsKICAgICAgaWYgKGZpcnN0VGV4dCkKICAgICAgICByZXR1cm4gZmlyc3RUZXh0OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGdldExhc3RUZXh0Tm9kZShlbGVtZW50NCkgewogICAgaWYgKGVsZW1lbnQ0Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICByZXR1cm4gZWxlbWVudDQ7CiAgICB9CiAgICBmb3IgKGxldCBpMTEgPSBlbGVtZW50NC5jaGlsZE5vZGVzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgICBjb25zdCBsYXN0VGV4dCA9IHRoaXMuZ2V0TGFzdFRleHROb2RlKGVsZW1lbnQ0LmNoaWxkTm9kZXNbaTExXSk7CiAgICAgIGlmIChsYXN0VGV4dCkKICAgICAgICByZXR1cm4gbGFzdFRleHQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZm9jdXMoZWxlbWVudDQsIGNvbnRleHQyKSB7CiAgICBjb25zdCBsaXN0QmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2subGlzdCIpOwogICAgaWYgKCFsaXN0QmxvY2spCiAgICAgIHJldHVybjsKICAgIGlmICghbGlzdEJsb2NrLmhhc0F0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIikpIHsKICAgICAgbGlzdEJsb2NrLnNldEF0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIiwgInRydWUiKTsKICAgIH0KICAgIGxpc3RCbG9jay5mb2N1cygpOwogICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGxpc3RCbG9jayAmJiBlbGVtZW50NC5zaGFkb3dSb290Py5hY3RpdmVFbGVtZW50ICE9PSBsaXN0QmxvY2spIHsKICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7CiAgICAgICAgbGlzdEJsb2NrLmZvY3VzKCk7CiAgICAgIH0pOwogICAgfQogIH0KICBmb2N1c1dpdGhDdXJzb3IoZWxlbWVudDQsIHBvc2l0aW9uMyA9ICJlbmQiLCBjb250ZXh0MikgewogICAgY29uc3QgbGlzdEJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLmxpc3QiKTsKICAgIGlmICghbGlzdEJsb2NrKQogICAgICByZXR1cm47CiAgICBpZiAoIWxpc3RCbG9jay5oYXNBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIpKSB7CiAgICAgIGxpc3RCbG9jay5zZXRBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIsICJ0cnVlIik7CiAgICB9CiAgICBsaXN0QmxvY2suZm9jdXMoKTsKICAgIGNvbnN0IHNldEN1cnNvciA9ICgpID0+IHsKICAgICAgaWYgKHBvc2l0aW9uMyA9PT0gInN0YXJ0IikgewogICAgICAgIHRoaXMuc2V0Q3Vyc29yVG9TdGFydChlbGVtZW50NCwgY29udGV4dDIpOwogICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uMyA9PT0gImVuZCIpIHsKICAgICAgICB0aGlzLnNldEN1cnNvclRvRW5kKGVsZW1lbnQ0LCBjb250ZXh0Mik7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBvc2l0aW9uMyA9PT0gIm51bWJlciIpIHsKICAgICAgICB0aGlzLnNldEN1cnNvclRvRW5kKGVsZW1lbnQ0LCBjb250ZXh0Mik7CiAgICAgIH0KICAgIH07CiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gbGlzdEJsb2NrIHx8IGVsZW1lbnQ0LnNoYWRvd1Jvb3Q/LmFjdGl2ZUVsZW1lbnQgPT09IGxpc3RCbG9jaykgewogICAgICBzZXRDdXJzb3IoKTsKICAgIH0gZWxzZSB7CiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gewogICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBsaXN0QmxvY2sgfHwgZWxlbWVudDQuc2hhZG93Um9vdD8uYWN0aXZlRWxlbWVudCA9PT0gbGlzdEJsb2NrKSB7CiAgICAgICAgICBzZXRDdXJzb3IoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KICBnZXRTcGxpdENvbnRlbnQoZWxlbWVudDQsIGNvbnRleHQyKSB7CiAgICBjb25zdCBsaXN0QmxvY2sgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYmxvY2subGlzdCIpOwogICAgaWYgKCFsaXN0QmxvY2spCiAgICAgIHJldHVybiBudWxsOwogICAgcmV0dXJuIG51bGw7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy9ibG9ja3MvbWVkaWEvaW1hZ2UuYmxvY2suanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIEltYWdlQmxvY2tIYW5kbGVyID0gY2xhc3MgZXh0ZW5kcyBCYXNlQmxvY2tIYW5kbGVyIHsKICB0eXBlID0gImltYWdlIjsKICByZW5kZXIoYmxvY2ssIGlzU2VsZWN0ZWQpIHsKICAgIGNvbnN0IGltYWdlVXJsID0gYmxvY2subWV0YWRhdGE/LnVybDsKICAgIGNvbnN0IGFsdFRleHQgPSBibG9jay5jb250ZW50IHx8ICJJbWFnZSI7CiAgICBjb25zdCBpc0xvYWRpbmcgPSBibG9jay5tZXRhZGF0YT8ubG9hZGluZzsKICAgIHJldHVybiBgCiAgICAgIDxkaXYgY2xhc3M9ImltYWdlLWJsb2NrLWNvbnRhaW5lciR7aXNTZWxlY3RlZCA/ICIgc2VsZWN0ZWQiIDogIiJ9IiAKICAgICAgICAgICBkYXRhLWJsb2NrLWlkPSIke2Jsb2NrLmlkfSIKICAgICAgICAgICBkYXRhLWhhcy1pbWFnZT0iJHshIWltYWdlVXJsfSIKICAgICAgICAgICB0YWJpbmRleD0iMCI+CiAgICAgICAgJHtpc0xvYWRpbmcgPyB0aGlzLnJlbmRlckxvYWRpbmcoKSA6IGltYWdlVXJsID8gdGhpcy5yZW5kZXJJbWFnZShpbWFnZVVybCwgYWx0VGV4dCkgOiB0aGlzLnJlbmRlclBsYWNlaG9sZGVyKCl9CiAgICAgICAgPGlucHV0IHR5cGU9ImZpbGUiIAogICAgICAgICAgICAgICBjbGFzcz0iaW1hZ2UtZmlsZS1pbnB1dCIgCiAgICAgICAgICAgICAgIGFjY2VwdD0iaW1hZ2UvKiIgCiAgICAgICAgICAgICAgIHN0eWxlPSJkaXNwbGF5OiBub25lOyIgLz4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICByZW5kZXJQbGFjZWhvbGRlcigpIHsKICAgIHJldHVybiBgCiAgICAgIDxkaXYgY2xhc3M9ImltYWdlLXVwbG9hZC1wbGFjZWhvbGRlciIgc3R5bGU9ImN1cnNvcjogcG9pbnRlcjsiPgogICAgICAgIDxkaXYgY2xhc3M9InVwbG9hZC1pY29uIiBzdHlsZT0icG9pbnRlci1ldmVudHM6IG5vbmU7Ij4KICAgICAgICAgIDxzdmcgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuNSI+CiAgICAgICAgICAgIDxyZWN0IHg9IjMiIHk9IjMiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjIiIHJ5PSIyIi8+CiAgICAgICAgICAgIDxjaXJjbGUgY3g9IjguNSIgY3k9IjguNSIgcj0iMS41Ii8+CiAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9IjIxIDE1IDE2IDEwIDUgMjEiLz4KICAgICAgICAgIDwvc3ZnPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InVwbG9hZC10ZXh0IiBzdHlsZT0icG9pbnRlci1ldmVudHM6IG5vbmU7Ij5DbGljayB0byB1cGxvYWQgYW4gaW1hZ2U8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJ1cGxvYWQtaGludCIgc3R5bGU9InBvaW50ZXItZXZlbnRzOiBub25lOyI+b3IgZHJhZyBhbmQgZHJvcDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgfQogIHJlbmRlckltYWdlKHVybCwgYWx0VGV4dCkgewogICAgcmV0dXJuIGAKICAgICAgPGRpdiBjbGFzcz0iaW1hZ2UtY29udGFpbmVyIj4KICAgICAgICA8aW1nIHNyYz0iJHt1cmx9IiBhbHQ9IiR7dGhpcy5lc2NhcGVIdG1sKGFsdFRleHQpfSIgLz4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICByZW5kZXJMb2FkaW5nKCkgewogICAgcmV0dXJuIGAKICAgICAgPGRpdiBjbGFzcz0iaW1hZ2UtbG9hZGluZyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibG9hZGluZy1zcGlubmVyIj48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsb2FkaW5nLXRleHQiPlVwbG9hZGluZyBpbWFnZS4uLjwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgfQogIHNldHVwKGVsZW1lbnQ0LCBibG9jaywgaGFuZGxlcnMyKSB7CiAgICBjb25zdCBjb250YWluZXIgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuaW1hZ2UtYmxvY2stY29udGFpbmVyIik7CiAgICBjb25zdCBmaWxlSW5wdXQgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuaW1hZ2UtZmlsZS1pbnB1dCIpOwogICAgaWYgKCFjb250YWluZXIpIHsKICAgICAgY29uc29sZS5lcnJvcigiSW1hZ2VCbG9ja0hhbmRsZXI6IENvdWxkIG5vdCBmaW5kIGNvbnRhaW5lciIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIWZpbGVJbnB1dCkgewogICAgICBjb25zb2xlLmVycm9yKCJJbWFnZUJsb2NrSGFuZGxlcjogQ291bGQgbm90IGZpbmQgZmlsZSBpbnB1dCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBwbGFjZWhvbGRlciA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuaW1hZ2UtdXBsb2FkLXBsYWNlaG9sZGVyIik7CiAgICBpZiAocGxhY2Vob2xkZXIpIHsKICAgICAgcGxhY2Vob2xkZXIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZTExKSA9PiB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIGNvbnNvbGUubG9nKCJJbWFnZUJsb2NrSGFuZGxlcjogUGxhY2Vob2xkZXIgY2xpY2tlZCwgb3BlbmluZyBmaWxlIHNlbGVjdG9yIik7CiAgICAgICAgZmlsZUlucHV0LmNsaWNrKCk7CiAgICAgIH0pOwogICAgfQogICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgICBoYW5kbGVyczIub25Gb2N1cygpOwogICAgfSk7CiAgICBmaWxlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgYXN5bmMgKGUxMSkgPT4gewogICAgICBjb25zdCBpbnB1dCA9IGUxMS50YXJnZXQ7CiAgICAgIGNvbnN0IGZpbGUgPSBpbnB1dC5maWxlcz8uWzBdOwogICAgICBpZiAoZmlsZSkgewogICAgICAgIGNvbnNvbGUubG9nKCJJbWFnZUJsb2NrSGFuZGxlcjogRmlsZSBzZWxlY3RlZDoiLCBmaWxlLm5hbWUpOwogICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRmlsZVVwbG9hZChmaWxlLCBibG9jaywgaGFuZGxlcnMyKTsKICAgICAgfQogICAgfSk7CiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigiZHJhZ292ZXIiLCAoZTExKSA9PiB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIGlmICghYmxvY2subWV0YWRhdGE/LnVybCkgewogICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCJkcmFnLW92ZXIiKTsKICAgICAgfQogICAgfSk7CiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigiZHJhZ2xlYXZlIiwgKGUxMSkgPT4gewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBjb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgiZHJhZy1vdmVyIik7CiAgICB9KTsKICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJkcm9wIiwgYXN5bmMgKGUxMSkgPT4gewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBjb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgiZHJhZy1vdmVyIik7CiAgICAgIGNvbnN0IGZpbGUgPSBlMTEuZGF0YVRyYW5zZmVyPy5maWxlc1swXTsKICAgICAgaWYgKGZpbGUgJiYgZmlsZS50eXBlLnN0YXJ0c1dpdGgoImltYWdlLyIpICYmICFibG9jay5tZXRhZGF0YT8udXJsKSB7CiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGaWxlVXBsb2FkKGZpbGUsIGJsb2NrLCBoYW5kbGVyczIpOwogICAgICB9CiAgICB9KTsKICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsICgpID0+IGhhbmRsZXJzMi5vbkZvY3VzKCkpOwogICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLCAoKSA9PiBoYW5kbGVyczIub25CbHVyKCkpOwogICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCAoZTExKSA9PiB7CiAgICAgIGlmIChlMTEua2V5ID09PSAiRGVsZXRlIiB8fCBlMTEua2V5ID09PSAiQmFja3NwYWNlIikgewogICAgICAgIGlmIChibG9jay5tZXRhZGF0YT8udXJsKSB7CiAgICAgICAgICBibG9jay5tZXRhZGF0YS51cmwgPSB2b2lkIDA7CiAgICAgICAgICBibG9jay5tZXRhZGF0YS5sb2FkaW5nID0gZmFsc2U7CiAgICAgICAgICBibG9jay5jb250ZW50ID0gIiI7CiAgICAgICAgICBoYW5kbGVyczIub25JbnB1dChuZXcgSW5wdXRFdmVudCgiaW5wdXQiKSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIGhhbmRsZXJzMi5vbktleURvd24oZTExKTsKICAgIH0pOwogIH0KICBhc3luYyBoYW5kbGVGaWxlVXBsb2FkKGZpbGUsIGJsb2NrLCBoYW5kbGVyczIpIHsKICAgIGNvbnNvbGUubG9nKCJJbWFnZUJsb2NrSGFuZGxlcjogU3RhcnRpbmcgZmlsZSB1cGxvYWQiLCB7CiAgICAgIGZpbGVOYW1lOiBmaWxlLm5hbWUsCiAgICAgIGZpbGVTaXplOiBmaWxlLnNpemUsCiAgICAgIGJsb2NrSWQ6IGJsb2NrLmlkCiAgICB9KTsKICAgIGlmICghZmlsZS50eXBlLnN0YXJ0c1dpdGgoImltYWdlLyIpKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkludmFsaWQgZmlsZSB0eXBlOiIsIGZpbGUudHlwZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG1heFNpemUgPSAxMCAqIDEwMjQgKiAxMDI0OwogICAgaWYgKGZpbGUuc2l6ZSA+IG1heFNpemUpIHsKICAgICAgY29uc29sZS5lcnJvcigiRmlsZSB0b28gbGFyZ2UuIE1heGltdW0gc2l6ZSBpcyAxME1CIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghYmxvY2subWV0YWRhdGEpCiAgICAgIGJsb2NrLm1ldGFkYXRhID0ge307CiAgICBibG9jay5tZXRhZGF0YS5sb2FkaW5nID0gdHJ1ZTsKICAgIGJsb2NrLm1ldGFkYXRhLmZpbGVOYW1lID0gZmlsZS5uYW1lOwogICAgYmxvY2subWV0YWRhdGEuZmlsZVNpemUgPSBmaWxlLnNpemU7CiAgICBibG9jay5tZXRhZGF0YS5taW1lVHlwZSA9IGZpbGUudHlwZTsKICAgIGNvbnNvbGUubG9nKCJJbWFnZUJsb2NrSGFuZGxlcjogU2V0IGxvYWRpbmcgc3RhdGUsIHJlcXVlc3RpbmcgdXBkYXRlIik7CiAgICBoYW5kbGVyczIub25SZXF1ZXN0VXBkYXRlPy4oKTsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGRhdGFVcmwgPSBhd2FpdCB0aGlzLmZpbGVUb0RhdGFVcmwoZmlsZSk7CiAgICAgIGJsb2NrLm1ldGFkYXRhLnVybCA9IGRhdGFVcmw7CiAgICAgIGJsb2NrLm1ldGFkYXRhLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgY29uc3QgbmFtZVdpdGhvdXRFeHQgPSBmaWxlLm5hbWUucmVwbGFjZSgvXC5bXi8uXSskLywgIiIpOwogICAgICBibG9jay5jb250ZW50ID0gbmFtZVdpdGhvdXRFeHQ7CiAgICAgIGNvbnNvbGUubG9nKCJJbWFnZUJsb2NrSGFuZGxlcjogVXBsb2FkIGNvbXBsZXRlLCByZXF1ZXN0aW5nIHVwZGF0ZSIsIHsKICAgICAgICBoYXNVcmw6ICEhYmxvY2subWV0YWRhdGEudXJsLAogICAgICAgIHVybExlbmd0aDogZGF0YVVybC5sZW5ndGgsCiAgICAgICAgYWx0VGV4dDogYmxvY2suY29udGVudAogICAgICB9KTsKICAgICAgaGFuZGxlcnMyLm9uUmVxdWVzdFVwZGF0ZT8uKCk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gdXBsb2FkIGltYWdlOiIsIGVycm9yKTsKICAgICAgYmxvY2subWV0YWRhdGEubG9hZGluZyA9IGZhbHNlOwogICAgICBoYW5kbGVyczIub25SZXF1ZXN0VXBkYXRlPy4oKTsKICAgIH0KICB9CiAgZmlsZVRvRGF0YVVybChmaWxlKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgcmVhZGVyLm9ubG9hZCA9IChlMTEpID0+IHsKICAgICAgICBjb25zdCByZXN1bHQgPSBlMTEudGFyZ2V0Py5yZXN1bHQ7CiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICByZXNvbHZlMihyZXN1bHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCJGYWlsZWQgdG8gcmVhZCBmaWxlIikpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmVhZGVyLm9uZXJyb3IgPSByZWplY3Q7CiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpOwogICAgfSk7CiAgfQogIGVzY2FwZUh0bWwodGV4dDkpIHsKICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgZGl2LnRleHRDb250ZW50ID0gdGV4dDk7CiAgICByZXR1cm4gZGl2LmlubmVySFRNTDsKICB9CiAgZ2V0Q29udGVudChlbGVtZW50NCkgewogICAgY29uc3QgYmxvY2sgPSB0aGlzLmdldEJsb2NrRnJvbUVsZW1lbnQoZWxlbWVudDQpOwogICAgcmV0dXJuIGJsb2NrPy5jb250ZW50IHx8ICIiOwogIH0KICBzZXRDb250ZW50KGVsZW1lbnQ0LCBjb250ZW50MykgewogICAgY29uc3QgYmxvY2sgPSB0aGlzLmdldEJsb2NrRnJvbUVsZW1lbnQoZWxlbWVudDQpOwogICAgaWYgKGJsb2NrKSB7CiAgICAgIGJsb2NrLmNvbnRlbnQgPSBjb250ZW50MzsKICAgIH0KICB9CiAgZ2V0QmxvY2tGcm9tRWxlbWVudChlbGVtZW50NCkgewogICAgY29uc3QgY29udGFpbmVyID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmltYWdlLWJsb2NrLWNvbnRhaW5lciIpOwogICAgY29uc3QgYmxvY2tJZCA9IGNvbnRhaW5lcj8uZ2V0QXR0cmlidXRlKCJkYXRhLWJsb2NrLWlkIik7CiAgICBpZiAoIWJsb2NrSWQpCiAgICAgIHJldHVybiBudWxsOwogICAgcmV0dXJuIHsKICAgICAgaWQ6IGJsb2NrSWQsCiAgICAgIHR5cGU6ICJpbWFnZSIsCiAgICAgIGNvbnRlbnQ6ICIiLAogICAgICBtZXRhZGF0YToge30KICAgIH07CiAgfQogIGdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgc2V0Q3Vyc29yVG9TdGFydChlbGVtZW50NCkgewogICAgdGhpcy5mb2N1cyhlbGVtZW50NCk7CiAgfQogIHNldEN1cnNvclRvRW5kKGVsZW1lbnQ0KSB7CiAgICB0aGlzLmZvY3VzKGVsZW1lbnQ0KTsKICB9CiAgZm9jdXMoZWxlbWVudDQpIHsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5pbWFnZS1ibG9jay1jb250YWluZXIiKTsKICAgIGNvbnRhaW5lcj8uZm9jdXMoKTsKICB9CiAgZm9jdXNXaXRoQ3Vyc29yKGVsZW1lbnQ0LCBwb3NpdGlvbjMgPSAiZW5kIikgewogICAgdGhpcy5mb2N1cyhlbGVtZW50NCk7CiAgfQogIGdldFNwbGl0Q29udGVudChlbGVtZW50NCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGdldFN0eWxlcygpIHsKICAgIHJldHVybiBgCiAgICAgIC8qIEltYWdlIEJsb2NrIENvbnRhaW5lciAqLwogICAgICAuaW1hZ2UtYmxvY2stY29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWFyZ2luOiAxMnB4IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgICAgCiAgICAgIC5pbWFnZS1ibG9jay1jb250YWluZXIuc2VsZWN0ZWQgewogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzYzNjZmMSIsICIjODE4Y2Y4Iil9OwogICAgICB9CiAgICAgIAogICAgICAvKiBVcGxvYWQgUGxhY2Vob2xkZXIgKi8KICAgICAgLmltYWdlLXVwbG9hZC1wbGFjZWhvbGRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgcGFkZGluZzogNDhweCAyNHB4OwogICAgICAgIGJvcmRlcjogMnB4IGRhc2hlZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzc0MTUxIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZhZmFmYSIsICIjMGEwYTBhIil9OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICB9CiAgICAgIAogICAgICAuaW1hZ2UtYmxvY2stY29udGFpbmVyOmhvdmVyIC5pbWFnZS11cGxvYWQtcGxhY2Vob2xkZXIgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5Y2EzYWYiLCAiIzZiNzI4MCIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y5ZmFmYiIsICIjMTExODI3Iil9OwogICAgICB9CiAgICAgIAogICAgICAuaW1hZ2UtYmxvY2stY29udGFpbmVyLmRyYWctb3ZlciAuaW1hZ2UtdXBsb2FkLXBsYWNlaG9sZGVyIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNjM2NmYxIiwgIiM4MThjZjgiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlZmY2ZmYiLCAiIzFlMWI0YiIpfTsKICAgICAgfQogICAgICAKICAgICAgLnVwbG9hZC1pY29uIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzljYTNhZiIsICIjNGI1NTYzIil9OwogICAgICB9CiAgICAgIAogICAgICAudXBsb2FkLXRleHQgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzM3NDE1MSIsICIjZTVlN2ViIil9OwogICAgICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgICAgfQogICAgICAKICAgICAgLnVwbG9hZC1oaW50IHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOWNhM2FmIiwgIiM2YjcyODAiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC8qIEltYWdlIENvbnRhaW5lciAqLwogICAgICAuaW1hZ2UtY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgbWluLWhlaWdodDogMjAwcHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOWZhZmIiLCAiIzExMTgyNyIpfTsKICAgICAgfQogICAgICAKICAgICAgLmltYWdlLWNvbnRhaW5lciBpbWcgewogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICB9CiAgICAgIAogICAgICAvKiBMb2FkaW5nIFN0YXRlICovCiAgICAgIC5pbWFnZS1sb2FkaW5nIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiA0OHB4IDI0cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmYWZhZmEiLCAiIzBhMGEwYSIpfTsKICAgICAgfQogICAgICAKICAgICAgLmxvYWRpbmctc3Bpbm5lciB7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIGJvcmRlcjogM3B4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzNzQxNTEiKX07CiAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2MzY2ZjEiLCAiIzgxOGNmOCIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYW5pbWF0aW9uOiBzcGluIDAuOHMgbGluZWFyIGluZmluaXRlOwogICAgICAgIG1hcmdpbi1ib3R0b206IDEycHg7CiAgICAgIH0KICAgICAgCiAgICAgIEBrZXlmcmFtZXMgc3BpbiB7CiAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9CiAgICAgIH0KICAgICAgCiAgICAgIC5sb2FkaW5nLXRleHQgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2YjcyODAiLCAiIzljYTNhZiIpfTsKICAgICAgfQogICAgICAKICAgICAgLyogRmlsZSBpbnB1dCBoaWRkZW4gKi8KICAgICAgLmltYWdlLWZpbGUtaW5wdXQgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgYDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL2Jsb2Nrcy9tZWRpYS95b3V0dWJlLmJsb2NrLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBZb3VUdWJlQmxvY2tIYW5kbGVyID0gY2xhc3MgZXh0ZW5kcyBCYXNlQmxvY2tIYW5kbGVyIHsKICB0eXBlID0gInlvdXR1YmUiOwogIHJlbmRlcihibG9jaywgaXNTZWxlY3RlZCkgewogICAgY29uc3QgdmlkZW9JZCA9IGJsb2NrLm1ldGFkYXRhPy52aWRlb0lkOwogICAgY29uc3QgdXJsID0gYmxvY2subWV0YWRhdGE/LnVybCB8fCAiIjsKICAgIHJldHVybiBgCiAgICAgIDxkaXYgY2xhc3M9InlvdXR1YmUtYmxvY2stY29udGFpbmVyJHtpc1NlbGVjdGVkID8gIiBzZWxlY3RlZCIgOiAiIn0iIAogICAgICAgICAgIGRhdGEtYmxvY2staWQ9IiR7YmxvY2suaWR9IgogICAgICAgICAgIGRhdGEtaGFzLXZpZGVvPSIkeyEhdmlkZW9JZH0iPgogICAgICAgICR7dmlkZW9JZCA/IHRoaXMucmVuZGVyVmlkZW8odmlkZW9JZCkgOiB0aGlzLnJlbmRlclBsYWNlaG9sZGVyKHVybCl9CiAgICAgIDwvZGl2PgogICAgYDsKICB9CiAgcmVuZGVyUGxhY2Vob2xkZXIodXJsKSB7CiAgICByZXR1cm4gYAogICAgICA8ZGl2IGNsYXNzPSJ5b3V0dWJlLXBsYWNlaG9sZGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJwbGFjZWhvbGRlci1pY29uIj4KICAgICAgICAgIDxzdmcgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9ImN1cnJlbnRDb2xvciI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xOS42MTUgMy4xODRjLTMuNjA0LS4yNDYtMTEuNjMxLS4yNDUtMTUuMjMgMC0zLjg5Ny4yNjYtNC4zNTYgMi42Mi00LjM4NSA4LjgxNi4wMjkgNi4xODUuNDg0IDguNTQ5IDQuMzg1IDguODE2IDMuNi4yNDUgMTEuNjI2LjI0NiAxNS4yMyAwIDMuODk3LS4yNjYgNC4zNTYtMi42MiA0LjM4NS04LjgxNi0uMDI5LTYuMTg1LS40ODQtOC41NDktNC4zODUtOC44MTZ6bS0xMC42MTUgMTIuODE2di04bDggMy45OTMtOCA0LjAwN3oiLz4KICAgICAgICAgIDwvc3ZnPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InBsYWNlaG9sZGVyLXRleHQiPkVudGVyIFlvdVR1YmUgVVJMPC9kaXY+CiAgICAgICAgPGlucHV0IHR5cGU9InVybCIgCiAgICAgICAgICAgICAgIGNsYXNzPSJ5b3V0dWJlLXVybC1pbnB1dCIgCiAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJodHRwczovL3lvdXR1YmUuY29tL3dhdGNoP3Y9Li4uIiAKICAgICAgICAgICAgICAgdmFsdWU9IiR7dGhpcy5lc2NhcGVIdG1sKHVybCl9IiAvPgogICAgICAgIDxidXR0b24gY2xhc3M9InlvdXR1YmUtZW1iZWQtYnRuIj5FbWJlZCBWaWRlbzwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIGA7CiAgfQogIHJlbmRlclZpZGVvKHZpZGVvSWQpIHsKICAgIHJldHVybiBgCiAgICAgIDxkaXYgY2xhc3M9InlvdXR1YmUtY29udGFpbmVyIj4KICAgICAgICA8aWZyYW1lIAogICAgICAgICAgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8ke3ZpZGVvSWR9IgogICAgICAgICAgZnJhbWVib3JkZXI9IjAiCiAgICAgICAgICBhbGxvdz0iYWNjZWxlcm9tZXRlcjsgYXV0b3BsYXk7IGNsaXBib2FyZC13cml0ZTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZSIKICAgICAgICAgIGFsbG93ZnVsbHNjcmVlbgogICAgICAgID48L2lmcmFtZT4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICBzZXR1cChlbGVtZW50NCwgYmxvY2ssIGhhbmRsZXJzMikgewogICAgY29uc3QgY29udGFpbmVyID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLnlvdXR1YmUtYmxvY2stY29udGFpbmVyIik7CiAgICBpZiAoIWNvbnRhaW5lcikKICAgICAgcmV0dXJuOwogICAgaWYgKGJsb2NrLm1ldGFkYXRhPy52aWRlb0lkKSB7CiAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwgIjAiKTsKICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwgKCkgPT4gaGFuZGxlcnMyLm9uRm9jdXMoKSk7CiAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgKCkgPT4gaGFuZGxlcnMyLm9uQmx1cigpKTsKICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCAoZTExKSA9PiB7CiAgICAgICAgaWYgKGUxMS5rZXkgPT09ICJEZWxldGUiIHx8IGUxMS5rZXkgPT09ICJCYWNrc3BhY2UiKSB7CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGhhbmRsZXJzMi5vbktleURvd24oZTExKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaGFuZGxlcnMyLm9uS2V5RG93bihlMTEpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHVybElucHV0ID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLnlvdXR1YmUtdXJsLWlucHV0Iik7CiAgICBjb25zdCBlbWJlZEJ0biA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi55b3V0dWJlLWVtYmVkLWJ0biIpOwogICAgaWYgKCF1cmxJbnB1dCB8fCAhZW1iZWRCdG4pCiAgICAgIHJldHVybjsKICAgIHVybElucHV0LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwgKCkgPT4gaGFuZGxlcnMyLm9uRm9jdXMoKSk7CiAgICB1cmxJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgKCkgPT4gaGFuZGxlcnMyLm9uQmx1cigpKTsKICAgIGVtYmVkQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgICB0aGlzLmVtYmVkVmlkZW8odXJsSW5wdXQudmFsdWUsIGJsb2NrLCBoYW5kbGVyczIpOwogICAgfSk7CiAgICB1cmxJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgKGUxMSkgPT4gewogICAgICBpZiAoZTExLmtleSA9PT0gIkVudGVyIikgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMuZW1iZWRWaWRlbyh1cmxJbnB1dC52YWx1ZSwgYmxvY2ssIGhhbmRsZXJzMik7CiAgICAgIH0gZWxzZSBpZiAoZTExLmtleSA9PT0gIkVzY2FwZSIpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICB1cmxJbnB1dC5ibHVyKCk7CiAgICAgIH0KICAgIH0pOwogICAgdXJsSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigicGFzdGUiLCAoZTExKSA9PiB7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIGNvbnN0IHBhc3RlZFVybCA9IHVybElucHV0LnZhbHVlOwogICAgICAgIGlmICh0aGlzLmV4dHJhY3RZb3VUdWJlVmlkZW9JZChwYXN0ZWRVcmwpKSB7CiAgICAgICAgICB0aGlzLmVtYmVkVmlkZW8ocGFzdGVkVXJsLCBibG9jaywgaGFuZGxlcnMyKTsKICAgICAgICB9CiAgICAgIH0sIDApOwogICAgfSk7CiAgICB1cmxJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsICgpID0+IHsKICAgICAgaWYgKCFibG9jay5tZXRhZGF0YSkKICAgICAgICBibG9jay5tZXRhZGF0YSA9IHt9OwogICAgICBibG9jay5tZXRhZGF0YS51cmwgPSB1cmxJbnB1dC52YWx1ZTsKICAgIH0pOwogIH0KICBlbWJlZFZpZGVvKHVybCwgYmxvY2ssIGhhbmRsZXJzMikgewogICAgY29uc3QgdmlkZW9JZCA9IHRoaXMuZXh0cmFjdFlvdVR1YmVWaWRlb0lkKHVybCk7CiAgICBpZiAoIXZpZGVvSWQpIHsKICAgICAgY29uc29sZS5lcnJvcigiSW52YWxpZCBZb3VUdWJlIFVSTCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIWJsb2NrLm1ldGFkYXRhKQogICAgICBibG9jay5tZXRhZGF0YSA9IHt9OwogICAgYmxvY2subWV0YWRhdGEudmlkZW9JZCA9IHZpZGVvSWQ7CiAgICBibG9jay5tZXRhZGF0YS51cmwgPSB1cmw7CiAgICBibG9jay5jb250ZW50ID0gYFlvdVR1YmUgVmlkZW86ICR7dmlkZW9JZH1gOwogICAgaGFuZGxlcnMyLm9uUmVxdWVzdFVwZGF0ZT8uKCk7CiAgfQogIGV4dHJhY3RZb3VUdWJlVmlkZW9JZCh1cmwpIHsKICAgIGNvbnN0IHBhdHRlcm5zMiA9IFsKICAgICAgLyg/OnlvdXR1YmVcLmNvbVwvKD86W15cL10rXC8uK1wvfCg/OnZ8ZSg/Om1iZWQpPylcL3wuKls/Jl12PSl8eW91dHVcLmJlXC8pKFteIiY/XC8gXXsxMX0pLywKICAgICAgL3lvdXR1YmVcLmNvbVwvZW1iZWRcLyhbXiImP1wvIF17MTF9KS8sCiAgICAgIC95b3V0dWJlXC5jb21cL3dhdGNoXD92PShbXiImP1wvIF17MTF9KS8sCiAgICAgIC95b3V0dVwuYmVcLyhbXiImP1wvIF17MTF9KS8KICAgIF07CiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMyKSB7CiAgICAgIGNvbnN0IG1hdGNoMiA9IHVybC5tYXRjaChwYXR0ZXJuKTsKICAgICAgaWYgKG1hdGNoMikgewogICAgICAgIHJldHVybiBtYXRjaDJbMV07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBlc2NhcGVIdG1sKHRleHQ5KSB7CiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIGRpdi50ZXh0Q29udGVudCA9IHRleHQ5OwogICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7CiAgfQogIGdldENvbnRlbnQoZWxlbWVudDQpIHsKICAgIGNvbnN0IGJsb2NrID0gdGhpcy5nZXRCbG9ja0Zyb21FbGVtZW50KGVsZW1lbnQ0KTsKICAgIHJldHVybiBibG9jaz8uY29udGVudCB8fCAiIjsKICB9CiAgc2V0Q29udGVudChlbGVtZW50NCwgY29udGVudDMpIHsKICAgIGNvbnN0IGJsb2NrID0gdGhpcy5nZXRCbG9ja0Zyb21FbGVtZW50KGVsZW1lbnQ0KTsKICAgIGlmIChibG9jaykgewogICAgICBibG9jay5jb250ZW50ID0gY29udGVudDM7CiAgICB9CiAgfQogIGdldEJsb2NrRnJvbUVsZW1lbnQoZWxlbWVudDQpIHsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi55b3V0dWJlLWJsb2NrLWNvbnRhaW5lciIpOwogICAgY29uc3QgYmxvY2tJZCA9IGNvbnRhaW5lcj8uZ2V0QXR0cmlidXRlKCJkYXRhLWJsb2NrLWlkIik7CiAgICBpZiAoIWJsb2NrSWQpCiAgICAgIHJldHVybiBudWxsOwogICAgcmV0dXJuIHsKICAgICAgaWQ6IGJsb2NrSWQsCiAgICAgIHR5cGU6ICJ5b3V0dWJlIiwKICAgICAgY29udGVudDogIiIsCiAgICAgIG1ldGFkYXRhOiB7fQogICAgfTsKICB9CiAgZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBzZXRDdXJzb3JUb1N0YXJ0KGVsZW1lbnQ0KSB7CiAgICB0aGlzLmZvY3VzKGVsZW1lbnQ0KTsKICB9CiAgc2V0Q3Vyc29yVG9FbmQoZWxlbWVudDQpIHsKICAgIHRoaXMuZm9jdXMoZWxlbWVudDQpOwogIH0KICBmb2N1cyhlbGVtZW50NCkgewogICAgY29uc3QgY29udGFpbmVyID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLnlvdXR1YmUtYmxvY2stY29udGFpbmVyIik7CiAgICBjb25zdCB1cmxJbnB1dCA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi55b3V0dWJlLXVybC1pbnB1dCIpOwogICAgaWYgKHVybElucHV0KSB7CiAgICAgIHVybElucHV0LmZvY3VzKCk7CiAgICB9IGVsc2UgaWYgKGNvbnRhaW5lcikgewogICAgICBjb250YWluZXIuZm9jdXMoKTsKICAgIH0KICB9CiAgZm9jdXNXaXRoQ3Vyc29yKGVsZW1lbnQ0LCBwb3NpdGlvbjMgPSAiZW5kIikgewogICAgdGhpcy5mb2N1cyhlbGVtZW50NCk7CiAgfQogIGdldFNwbGl0Q29udGVudChlbGVtZW50NCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGdldFN0eWxlcygpIHsKICAgIHJldHVybiBgCiAgICAgIC8qIFlvdVR1YmUgQmxvY2sgQ29udGFpbmVyICovCiAgICAgIC55b3V0dWJlLWJsb2NrLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1hcmdpbjogMTJweCAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KICAgICAgCiAgICAgIC55b3V0dWJlLWJsb2NrLWNvbnRhaW5lci5zZWxlY3RlZCB7CiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNjM2NmYxIiwgIiM4MThjZjgiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC8qIFlvdVR1YmUgUGxhY2Vob2xkZXIgKi8KICAgICAgLnlvdXR1YmUtcGxhY2Vob2xkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHBhZGRpbmc6IDMycHggMjRweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzc0MTUxIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZhZmFmYSIsICIjMGEwYTBhIil9OwogICAgICAgIGdhcDogMTJweDsKICAgICAgfQogICAgICAKICAgICAgLnBsYWNlaG9sZGVyLWljb24gewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2RjMjYyNiIsICIjZWY0NDQ0Iil9OwogICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgfQogICAgICAKICAgICAgLnBsYWNlaG9sZGVyLXRleHQgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzM3NDE1MSIsICIjZTVlN2ViIil9OwogICAgICB9CiAgICAgIAogICAgICAueW91dHViZS11cmwtaW5wdXQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1heC13aWR0aDogNDAwcHg7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzM3NDE1MSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzExMTgyNyIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxMTE4MjciLCAiI2Y5ZmFmYiIpfTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc2Fucy1zZXJpZjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CiAgICAgIAogICAgICAueW91dHViZS11cmwtaW5wdXQ6Zm9jdXMgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2YjcyODAiLCAiIzljYTNhZiIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMWYyOTM3Iil9OwogICAgICB9CiAgICAgIAogICAgICAueW91dHViZS11cmwtaW5wdXQ6OnBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5Y2EzYWYiLCAiIzRiNTU2MyIpfTsKICAgICAgfQogICAgICAKICAgICAgLnlvdXR1YmUtZW1iZWQtYnRuIHsKICAgICAgICBwYWRkaW5nOiA2cHggMTZweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzExMTgyNyIsICIjZjlmYWZiIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y5ZmFmYiIsICIjMTExODI3Iil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CiAgICAgIAogICAgICAueW91dHViZS1lbWJlZC1idG46aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMzc0MTUxIiwgIiNlNWU3ZWIiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC55b3V0dWJlLWVtYmVkLWJ0bjphY3RpdmUgewogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OCk7CiAgICAgIH0KICAgICAgCiAgICAgIC8qIFlvdVR1YmUgQ29udGFpbmVyICovCiAgICAgIC55b3V0dWJlLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBhZGRpbmctYm90dG9tOiA1Ni4yNSU7IC8qIDE2OjkgYXNwZWN0IHJhdGlvICovCiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAwMDAiLCAiIzAwMDAwMCIpfTsKICAgICAgfQogICAgICAKICAgICAgLnlvdXR1YmUtY29udGFpbmVyIGlmcmFtZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICB9CiAgICBgOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvYmxvY2tzL21lZGlhL2F0dGFjaG1lbnQuYmxvY2suanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIEF0dGFjaG1lbnRCbG9ja0hhbmRsZXIgPSBjbGFzcyBleHRlbmRzIEJhc2VCbG9ja0hhbmRsZXIgewogIHR5cGUgPSAiYXR0YWNobWVudCI7CiAgcmVuZGVyKGJsb2NrLCBpc1NlbGVjdGVkKSB7CiAgICBjb25zdCBmaWxlcyA9IGJsb2NrLm1ldGFkYXRhPy5maWxlcyB8fCBbXTsKICAgIHJldHVybiBgCiAgICAgIDxkaXYgY2xhc3M9ImF0dGFjaG1lbnQtYmxvY2stY29udGFpbmVyJHtpc1NlbGVjdGVkID8gIiBzZWxlY3RlZCIgOiAiIn0iIAogICAgICAgICAgIGRhdGEtYmxvY2staWQ9IiR7YmxvY2suaWR9IgogICAgICAgICAgIHRhYmluZGV4PSIwIj4KICAgICAgICA8ZGl2IGNsYXNzPSJhdHRhY2htZW50LWhlYWRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRhY2htZW50LWljb24iPlx1ezFGNENFfTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iYXR0YWNobWVudC10aXRsZSI+RmlsZSBBdHRhY2htZW50czwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImF0dGFjaG1lbnQtbGlzdCI+CiAgICAgICAgICAke2ZpbGVzLmxlbmd0aCA+IDAgPyB0aGlzLnJlbmRlckZpbGVzKGZpbGVzKSA6IHRoaXMucmVuZGVyUGxhY2Vob2xkZXIoKX0KICAgICAgICA8L2Rpdj4KICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgCiAgICAgICAgICAgICAgIGNsYXNzPSJhdHRhY2htZW50LWZpbGUtaW5wdXQiIAogICAgICAgICAgICAgICBtdWx0aXBsZSAKICAgICAgICAgICAgICAgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IiAvPgogICAgICAgICR7ZmlsZXMubGVuZ3RoID4gMCA/ICc8YnV0dG9uIGNsYXNzPSJhZGQtbW9yZS1maWxlcyI+QWRkIE1vcmUgRmlsZXM8L2J1dHRvbj4nIDogIiJ9CiAgICAgIDwvZGl2PgogICAgYDsKICB9CiAgcmVuZGVyUGxhY2Vob2xkZXIoKSB7CiAgICByZXR1cm4gYAogICAgICA8ZGl2IGNsYXNzPSJhdHRhY2htZW50LXBsYWNlaG9sZGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJwbGFjZWhvbGRlci10ZXh0Ij5DbGljayB0byBhZGQgZmlsZXM8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJwbGFjZWhvbGRlci1oaW50Ij5vciBkcmFnIGFuZCBkcm9wPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICB9CiAgcmVuZGVyRmlsZXMoZmlsZXMpIHsKICAgIHJldHVybiBmaWxlcy5tYXAoKGZpbGUpID0+IGAKICAgICAgPGRpdiBjbGFzcz0iYXR0YWNobWVudC1pdGVtIiBkYXRhLWZpbGUtaWQ9IiR7ZmlsZS5pZH0iPgogICAgICAgIDxkaXYgY2xhc3M9ImZpbGUtaWNvbiI+JHt0aGlzLmdldEZpbGVJY29uKGZpbGUudHlwZSl9PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iZmlsZS1pbmZvIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImZpbGUtbmFtZSI+JHt0aGlzLmVzY2FwZUh0bWwoZmlsZS5uYW1lKX08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImZpbGUtc2l6ZSI+JHt0aGlzLmZvcm1hdEZpbGVTaXplKGZpbGUuc2l6ZSl9PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0icmVtb3ZlLWZpbGUiIGRhdGEtZmlsZS1pZD0iJHtmaWxlLmlkfSI+XHhENzwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIGApLmpvaW4oIiIpOwogIH0KICBzZXR1cChlbGVtZW50NCwgYmxvY2ssIGhhbmRsZXJzMikgewogICAgY29uc3QgY29udGFpbmVyID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmF0dGFjaG1lbnQtYmxvY2stY29udGFpbmVyIik7CiAgICBjb25zdCBmaWxlSW5wdXQgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuYXR0YWNobWVudC1maWxlLWlucHV0Iik7CiAgICBpZiAoIWNvbnRhaW5lciB8fCAhZmlsZUlucHV0KSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkF0dGFjaG1lbnRCbG9ja0hhbmRsZXI6IENvdWxkIG5vdCBmaW5kIHJlcXVpcmVkIGVsZW1lbnRzIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghYmxvY2subWV0YWRhdGEpCiAgICAgIGJsb2NrLm1ldGFkYXRhID0ge307CiAgICBpZiAoIWJsb2NrLm1ldGFkYXRhLmZpbGVzKQogICAgICBibG9jay5tZXRhZGF0YS5maWxlcyA9IFtdOwogICAgY29uc3QgcGxhY2Vob2xkZXIgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLmF0dGFjaG1lbnQtcGxhY2Vob2xkZXIiKTsKICAgIGlmIChwbGFjZWhvbGRlcikgewogICAgICBwbGFjZWhvbGRlci5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIChlMTEpID0+IHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgZmlsZUlucHV0LmNsaWNrKCk7CiAgICAgIH0pOwogICAgfQogICAgY29uc3QgYWRkTW9yZUJ0biA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuYWRkLW1vcmUtZmlsZXMiKTsKICAgIGlmIChhZGRNb3JlQnRuKSB7CiAgICAgIGFkZE1vcmVCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZTExKSA9PiB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIGZpbGVJbnB1dC5jbGljaygpOwogICAgICB9KTsKICAgIH0KICAgIGZpbGVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBhc3luYyAoZTExKSA9PiB7CiAgICAgIGNvbnN0IGlucHV0ID0gZTExLnRhcmdldDsKICAgICAgY29uc3QgZmlsZXMgPSBpbnB1dC5maWxlczsKICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApIHsKICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZpbGVBdHRhY2htZW50cyhmaWxlcywgYmxvY2ssIGhhbmRsZXJzMik7CiAgICAgICAgaW5wdXQudmFsdWUgPSAiIjsKICAgICAgfQogICAgfSk7CiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZTExKSA9PiB7CiAgICAgIGNvbnN0IHRhcmdldCA9IGUxMS50YXJnZXQ7CiAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW1vdmUtZmlsZSIpKSB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIGNvbnN0IGZpbGVJZCA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGEtZmlsZS1pZCIpOwogICAgICAgIGlmIChmaWxlSWQpIHsKICAgICAgICAgIHRoaXMucmVtb3ZlRmlsZShmaWxlSWQsIGJsb2NrLCBoYW5kbGVyczIpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigiZHJhZ292ZXIiLCAoZTExKSA9PiB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCJkcmFnLW92ZXIiKTsKICAgIH0pOwogICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdsZWF2ZSIsIChlMTEpID0+IHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoImRyYWctb3ZlciIpOwogICAgfSk7CiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigiZHJvcCIsIGFzeW5jIChlMTEpID0+IHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoImRyYWctb3ZlciIpOwogICAgICBjb25zdCBmaWxlcyA9IGUxMS5kYXRhVHJhbnNmZXI/LmZpbGVzOwogICAgICBpZiAoZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCkgewogICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRmlsZUF0dGFjaG1lbnRzKGZpbGVzLCBibG9jaywgaGFuZGxlcnMyKTsKICAgICAgfQogICAgfSk7CiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLCAoKSA9PiBoYW5kbGVyczIub25Gb2N1cygpKTsKICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgKCkgPT4gaGFuZGxlcnMyLm9uQmx1cigpKTsKICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgKGUxMSkgPT4gewogICAgICBpZiAoZTExLmtleSA9PT0gIkRlbGV0ZSIgfHwgZTExLmtleSA9PT0gIkJhY2tzcGFjZSIpIHsKICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gY29udGFpbmVyICYmIGJsb2NrLm1ldGFkYXRhPy5maWxlcz8ubGVuZ3RoID4gMCkgewogICAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBibG9jay5tZXRhZGF0YS5maWxlcyA9IFtdOwogICAgICAgICAgaGFuZGxlcnMyLm9uUmVxdWVzdFVwZGF0ZT8uKCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIGhhbmRsZXJzMi5vbktleURvd24oZTExKTsKICAgIH0pOwogIH0KICBhc3luYyBoYW5kbGVGaWxlQXR0YWNobWVudHMoZmlsZXMsIGJsb2NrLCBoYW5kbGVyczIpIHsKICAgIGlmICghYmxvY2subWV0YWRhdGEpCiAgICAgIGJsb2NrLm1ldGFkYXRhID0ge307CiAgICBpZiAoIWJsb2NrLm1ldGFkYXRhLmZpbGVzKQogICAgICBibG9jay5tZXRhZGF0YS5maWxlcyA9IFtdOwogICAgZm9yIChjb25zdCBmaWxlIG9mIEFycmF5LmZyb20oZmlsZXMpKSB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgZGF0YVVybCA9IGF3YWl0IHRoaXMuZmlsZVRvRGF0YVVybChmaWxlKTsKICAgICAgICBjb25zdCBmaWxlRGF0YSA9IHsKICAgICAgICAgIGlkOiB0aGlzLmdlbmVyYXRlSWQoKSwKICAgICAgICAgIG5hbWU6IGZpbGUubmFtZSwKICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZSwKICAgICAgICAgIHR5cGU6IGZpbGUudHlwZSwKICAgICAgICAgIGRhdGE6IGRhdGFVcmwKICAgICAgICB9OwogICAgICAgIGJsb2NrLm1ldGFkYXRhLmZpbGVzLnB1c2goZmlsZURhdGEpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBhdHRhY2ggZmlsZToiLCBmaWxlLm5hbWUsIGVycm9yKTsKICAgICAgfQogICAgfQogICAgYmxvY2suY29udGVudCA9IGAke2Jsb2NrLm1ldGFkYXRhLmZpbGVzLmxlbmd0aH0gZmlsZSR7YmxvY2subWV0YWRhdGEuZmlsZXMubGVuZ3RoICE9PSAxID8gInMiIDogIiJ9IGF0dGFjaGVkYDsKICAgIGhhbmRsZXJzMi5vblJlcXVlc3RVcGRhdGU/LigpOwogIH0KICByZW1vdmVGaWxlKGZpbGVJZCwgYmxvY2ssIGhhbmRsZXJzMikgewogICAgaWYgKCFibG9jay5tZXRhZGF0YT8uZmlsZXMpCiAgICAgIHJldHVybjsKICAgIGJsb2NrLm1ldGFkYXRhLmZpbGVzID0gYmxvY2subWV0YWRhdGEuZmlsZXMuZmlsdGVyKChmOCkgPT4gZjguaWQgIT09IGZpbGVJZCk7CiAgICBibG9jay5jb250ZW50ID0gYmxvY2subWV0YWRhdGEuZmlsZXMubGVuZ3RoID4gMCA/IGAke2Jsb2NrLm1ldGFkYXRhLmZpbGVzLmxlbmd0aH0gZmlsZSR7YmxvY2subWV0YWRhdGEuZmlsZXMubGVuZ3RoICE9PSAxID8gInMiIDogIiJ9IGF0dGFjaGVkYCA6ICIiOwogICAgaGFuZGxlcnMyLm9uUmVxdWVzdFVwZGF0ZT8uKCk7CiAgfQogIGZpbGVUb0RhdGFVcmwoZmlsZSkgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0KSA9PiB7CiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZTExKSA9PiB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gZTExLnRhcmdldD8ucmVzdWx0OwogICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAic3RyaW5nIikgewogICAgICAgICAgcmVzb2x2ZTIocmVzdWx0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcigiRmFpbGVkIHRvIHJlYWQgZmlsZSIpKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJlYWRlci5vbmVycm9yID0gcmVqZWN0OwogICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTsKICAgIH0pOwogIH0KICBnZXRGaWxlSWNvbihtaW1lVHlwZSkgewogICAgaWYgKG1pbWVUeXBlLnN0YXJ0c1dpdGgoImltYWdlLyIpKQogICAgICByZXR1cm4gIlx1ezFGNUJDfVx1RkUwRiI7CiAgICBpZiAobWltZVR5cGUuc3RhcnRzV2l0aCgidmlkZW8vIikpCiAgICAgIHJldHVybiAiXHV7MUYzQTV9IjsKICAgIGlmIChtaW1lVHlwZS5zdGFydHNXaXRoKCJhdWRpby8iKSkKICAgICAgcmV0dXJuICJcdXsxRjNCNX0iOwogICAgaWYgKG1pbWVUeXBlLmluY2x1ZGVzKCJwZGYiKSkKICAgICAgcmV0dXJuICJcdXsxRjRDNH0iOwogICAgaWYgKG1pbWVUeXBlLmluY2x1ZGVzKCJ6aXAiKSB8fCBtaW1lVHlwZS5pbmNsdWRlcygicmFyIikgfHwgbWltZVR5cGUuaW5jbHVkZXMoInRhciIpKQogICAgICByZXR1cm4gIlx1ezFGNUM0fVx1RkUwRiI7CiAgICBpZiAobWltZVR5cGUuaW5jbHVkZXMoInNoZWV0IikpCiAgICAgIHJldHVybiAiXHV7MUY0Q0F9IjsKICAgIGlmIChtaW1lVHlwZS5pbmNsdWRlcygiZG9jdW1lbnQiKSB8fCBtaW1lVHlwZS5pbmNsdWRlcygibXN3b3JkIikpCiAgICAgIHJldHVybiAiXHV7MUY0RER9IjsKICAgIGlmIChtaW1lVHlwZS5pbmNsdWRlcygicHJlc2VudGF0aW9uIikpCiAgICAgIHJldHVybiAiXHV7MUY0Q0J9IjsKICAgIGlmIChtaW1lVHlwZS5pbmNsdWRlcygidGV4dCIpKQogICAgICByZXR1cm4gIlx1ezFGNEMzfSI7CiAgICByZXR1cm4gIlx1ezFGNEMxfSI7CiAgfQogIGZvcm1hdEZpbGVTaXplKGJ5dGVzKSB7CiAgICBpZiAoYnl0ZXMgPT09IDApCiAgICAgIHJldHVybiAiMCBCeXRlcyI7CiAgICBjb25zdCBrNSA9IDEwMjQ7CiAgICBjb25zdCBzaXplcyA9IFsiQnl0ZXMiLCAiS0IiLCAiTUIiLCAiR0IiXTsKICAgIGNvbnN0IGkxMSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coazUpKTsKICAgIHJldHVybiBwYXJzZUZsb2F0KChieXRlcyAvIE1hdGgucG93KGs1LCBpMTEpKS50b0ZpeGVkKDIpKSArICIgIiArIHNpemVzW2kxMV07CiAgfQogIGdlbmVyYXRlSWQoKSB7CiAgICByZXR1cm4gYGZpbGUtJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KX1gOwogIH0KICBlc2NhcGVIdG1sKHRleHQ5KSB7CiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIGRpdi50ZXh0Q29udGVudCA9IHRleHQ5OwogICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7CiAgfQogIGdldENvbnRlbnQoZWxlbWVudDQpIHsKICAgIGNvbnN0IGJsb2NrID0gdGhpcy5nZXRCbG9ja0Zyb21FbGVtZW50KGVsZW1lbnQ0KTsKICAgIHJldHVybiBibG9jaz8uY29udGVudCB8fCAiIjsKICB9CiAgc2V0Q29udGVudChlbGVtZW50NCwgY29udGVudDMpIHsKICAgIGNvbnN0IGJsb2NrID0gdGhpcy5nZXRCbG9ja0Zyb21FbGVtZW50KGVsZW1lbnQ0KTsKICAgIGlmIChibG9jaykgewogICAgICBibG9jay5jb250ZW50ID0gY29udGVudDM7CiAgICB9CiAgfQogIGdldEJsb2NrRnJvbUVsZW1lbnQoZWxlbWVudDQpIHsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5hdHRhY2htZW50LWJsb2NrLWNvbnRhaW5lciIpOwogICAgY29uc3QgYmxvY2tJZCA9IGNvbnRhaW5lcj8uZ2V0QXR0cmlidXRlKCJkYXRhLWJsb2NrLWlkIik7CiAgICBpZiAoIWJsb2NrSWQpCiAgICAgIHJldHVybiBudWxsOwogICAgcmV0dXJuIHsKICAgICAgaWQ6IGJsb2NrSWQsCiAgICAgIHR5cGU6ICJhdHRhY2htZW50IiwKICAgICAgY29udGVudDogIiIsCiAgICAgIG1ldGFkYXRhOiB7fQogICAgfTsKICB9CiAgZ2V0Q3Vyc29yUG9zaXRpb24oZWxlbWVudDQpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBzZXRDdXJzb3JUb1N0YXJ0KGVsZW1lbnQ0KSB7CiAgICB0aGlzLmZvY3VzKGVsZW1lbnQ0KTsKICB9CiAgc2V0Q3Vyc29yVG9FbmQoZWxlbWVudDQpIHsKICAgIHRoaXMuZm9jdXMoZWxlbWVudDQpOwogIH0KICBmb2N1cyhlbGVtZW50NCkgewogICAgY29uc3QgY29udGFpbmVyID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmF0dGFjaG1lbnQtYmxvY2stY29udGFpbmVyIik7CiAgICBjb250YWluZXI/LmZvY3VzKCk7CiAgfQogIGZvY3VzV2l0aEN1cnNvcihlbGVtZW50NCwgcG9zaXRpb24zID0gImVuZCIpIHsKICAgIHRoaXMuZm9jdXMoZWxlbWVudDQpOwogIH0KICBnZXRTcGxpdENvbnRlbnQoZWxlbWVudDQpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBnZXRTdHlsZXMoKSB7CiAgICByZXR1cm4gYAogICAgICAvKiBBdHRhY2htZW50IEJsb2NrIENvbnRhaW5lciAqLwogICAgICAuYXR0YWNobWVudC1ibG9jay1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtYXJnaW46IDEycHggMDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzc0MTUxIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzExMTgyNyIpfTsKICAgICAgfQogICAgICAKICAgICAgLmF0dGFjaG1lbnQtYmxvY2stY29udGFpbmVyLnNlbGVjdGVkIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOWNhM2FmIiwgIiM2YjcyODAiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5hdHRhY2htZW50LWJsb2NrLWNvbnRhaW5lci5kcmFnLW92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjlmYWZiIiwgIiMxZjI5MzciKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzYzNjZmMSIsICIjODE4Y2Y4Iil9OwogICAgICB9CiAgICAgIAogICAgICAvKiBIZWFkZXIgKi8KICAgICAgLmF0dGFjaG1lbnQtaGVhZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzc0MTUxIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjlmYWZiIiwgIiMwYTBhMGEiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5hdHRhY2htZW50LWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgIH0KICAgICAgCiAgICAgIC5hdHRhY2htZW50LXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzNzQxNTEiLCAiI2U1ZTdlYiIpfTsKICAgICAgfQogICAgICAKICAgICAgLyogRmlsZSBMaXN0ICovCiAgICAgIC5hdHRhY2htZW50LWxpc3QgewogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBtaW4taGVpZ2h0OiA4MHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDRweDsKICAgICAgfQogICAgICAKICAgICAgLyogUGxhY2Vob2xkZXIgKi8KICAgICAgLmF0dGFjaG1lbnQtcGxhY2Vob2xkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICB9CiAgICAgIAogICAgICAuYXR0YWNobWVudC1wbGFjZWhvbGRlcjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOWZhZmIiLCAiIzFmMjkzNyIpfTsKICAgICAgfQogICAgICAKICAgICAgLnBsYWNlaG9sZGVyLXRleHQgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2YjcyODAiLCAiIzljYTNhZiIpfTsKICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5wbGFjZWhvbGRlci1oaW50IHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOWNhM2FmIiwgIiM2YjcyODAiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC8qIEZpbGUgSXRlbXMgKi8KICAgICAgLmF0dGFjaG1lbnQtaXRlbSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTJweDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y5ZmFmYiIsICIjMWYyOTM3Iil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzNzQxNTEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICB9CiAgICAgIAogICAgICAuYXR0YWNobWVudC1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YzZjRmNiIsICIjMzc0MTUxIil9OwogICAgICB9CiAgICAgIAogICAgICAuZmlsZS1pY29uIHsKICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5maWxlLWluZm8gewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICB9CiAgICAgIAogICAgICAuZmlsZS1uYW1lIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxMTE4MjciLCAiI2Y5ZmFmYiIpfTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KICAgICAgCiAgICAgIC5maWxlLXNpemUgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2YjcyODAiLCAiIzljYTNhZiIpfTsKICAgICAgICBtYXJnaW4tdG9wOiAycHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5yZW1vdmUtZmlsZSB7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgd2lkdGg6IDI0cHg7CiAgICAgICAgaGVpZ2h0OiAyNHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNmI3MjgwIiwgIiM5Y2EzYWYiKX07CiAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CiAgICAgIAogICAgICAucmVtb3ZlLWZpbGU6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmVlMmUyIiwgIiM5OTFiMWIiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZjYTVhNSIsICIjZGMyNjI2Iil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2RjMjYyNiIsICIjZmNhNWE1Iil9OwogICAgICB9CiAgICAgIAogICAgICAvKiBBZGQgTW9yZSBGaWxlcyBCdXR0b24gKi8KICAgICAgLmFkZC1tb3JlLWZpbGVzIHsKICAgICAgICBtYXJnaW46IDhweDsKICAgICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzc0MTUxIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMzc0MTUxIiwgIiNlNWU3ZWIiKX07CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIHNhbnMtc2VyaWY7CiAgICAgIH0KICAgICAgCiAgICAgIC5hZGQtbW9yZS1maWxlczpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOWZhZmIiLCAiIzFmMjkzNyIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDFkNWRiIiwgIiM0YjU1NjMiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC8qIEhpZGRlbiBmaWxlIGlucHV0ICovCiAgICAgIC5hdHRhY2htZW50LWZpbGUtaW5wdXQgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgYDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL2Jsb2Nrcy9jb250ZW50L2RpdmlkZXIuYmxvY2suanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIERpdmlkZXJCbG9ja0hhbmRsZXIgPSBjbGFzcyBleHRlbmRzIEJhc2VCbG9ja0hhbmRsZXIgewogIHR5cGUgPSAiZGl2aWRlciI7CiAgcmVuZGVyKGJsb2NrLCBpc1NlbGVjdGVkKSB7CiAgICBjb25zdCBzZWxlY3RlZENsYXNzID0gaXNTZWxlY3RlZCA/ICIgc2VsZWN0ZWQiIDogIiI7CiAgICByZXR1cm4gYAogICAgICA8ZGl2IGNsYXNzPSJibG9jayBkaXZpZGVyJHtzZWxlY3RlZENsYXNzfSIgZGF0YS1ibG9jay1pZD0iJHtibG9jay5pZH0iIGRhdGEtYmxvY2stdHlwZT0iJHtibG9jay50eXBlfSIgdGFiaW5kZXg9IjAiPgogICAgICAgIDxocj4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICBzZXR1cChlbGVtZW50NCwgYmxvY2ssIGhhbmRsZXJzMikgewogICAgY29uc3QgZGl2aWRlckJsb2NrID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmJsb2NrLmRpdmlkZXIiKTsKICAgIGlmICghZGl2aWRlckJsb2NrKQogICAgICByZXR1cm47CiAgICBkaXZpZGVyQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZTExKSA9PiB7CiAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgZGl2aWRlckJsb2NrLmZvY3VzKCk7CiAgICAgIGhhbmRsZXJzMi5vbkZvY3VzPy4oKTsKICAgIH0pOwogICAgZGl2aWRlckJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwgKCkgPT4gewogICAgICBoYW5kbGVyczIub25Gb2N1cz8uKCk7CiAgICB9KTsKICAgIGRpdmlkZXJCbG9jay5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgKCkgPT4gewogICAgICBoYW5kbGVyczIub25CbHVyPy4oKTsKICAgIH0pOwogICAgZGl2aWRlckJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCAoZTExKSA9PiB7CiAgICAgIGlmIChlMTEua2V5ID09PSAiQmFja3NwYWNlIiB8fCBlMTEua2V5ID09PSAiRGVsZXRlIikgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGhhbmRsZXJzMi5vbktleURvd24/LihlMTEpOwogICAgICB9IGVsc2UgewogICAgICAgIGhhbmRsZXJzMi5vbktleURvd24/LihlMTEpOwogICAgICB9CiAgICB9KTsKICB9CiAgZ2V0U3R5bGVzKCkgewogICAgcmV0dXJuIGAKICAgICAgLmJsb2NrLmRpdmlkZXIgewogICAgICAgIHBhZGRpbmc6IDhweCAwOwogICAgICAgIG1hcmdpbjogMTZweCAwOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICB9CgogICAgICAuYmxvY2suZGl2aWRlcjpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgLmJsb2NrLmRpdmlkZXIuc2VsZWN0ZWQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDEwMiwgMjA0LCAwLjA1KSIsICJyZ2JhKDc3LCAxNDgsIDI1NSwgMC4wOCkiKX07CiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMnB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDEwMiwgMjA0LCAwLjIpIiwgInJnYmEoNzcsIDE0OCwgMjU1LCAwLjIpIil9OwogICAgICB9CgogICAgICAuYmxvY2suZGl2aWRlciBociB7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2UwZTBlMCIsICIjMzMzIil9OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgYDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC13eXNpd3lnL2Jsb2Nrcy9jb250ZW50L21hcmtkb3duLmJsb2NrLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBNYXJrZG93bkJsb2NrSGFuZGxlciA9IGNsYXNzIGV4dGVuZHMgQmFzZUJsb2NrSGFuZGxlciB7CiAgdHlwZSA9ICJtYXJrZG93biI7CiAgcmVuZGVyKGJsb2NrLCBpc1NlbGVjdGVkKSB7CiAgICBjb25zdCBpc0VkaXRNb2RlID0gYmxvY2subWV0YWRhdGE/LmlzRWRpdE1vZGUgPz8gdHJ1ZTsKICAgIGNvbnN0IGNvbnRlbnQzID0gYmxvY2suY29udGVudCB8fCAiIjsKICAgIHJldHVybiBgCiAgICAgIDxkaXYgY2xhc3M9Im1hcmtkb3duLWJsb2NrLWNvbnRhaW5lciR7aXNTZWxlY3RlZCA/ICIgc2VsZWN0ZWQiIDogIiJ9IiAKICAgICAgICAgICBkYXRhLWJsb2NrLWlkPSIke2Jsb2NrLmlkfSIKICAgICAgICAgICBkYXRhLWVkaXQtbW9kZT0iJHtpc0VkaXRNb2RlfSI+CiAgICAgICAgPGRpdiBjbGFzcz0ibWFya2Rvd24taGVhZGVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im1hcmtkb3duLWljb24iPk1cdTIxOTM8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im1hcmtkb3duLXRpdGxlIj5NYXJrZG93bjwvZGl2PgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ibWFya2Rvd24tdG9nZ2xlLW1vZGUiIHRpdGxlPSIke2lzRWRpdE1vZGUgPyAiUHJldmlldyIgOiAiRWRpdCJ9Ij4KICAgICAgICAgICAgJHtpc0VkaXRNb2RlID8gIlx1ezFGNDQxfVx1RkUwRiIgOiAiXHUyNzBGXHVGRTBGIn0KICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im1hcmtkb3duLWNvbnRlbnQiPgogICAgICAgICAgJHtpc0VkaXRNb2RlID8gdGhpcy5yZW5kZXJFZGl0b3IoY29udGVudDMpIDogdGhpcy5yZW5kZXJQcmV2aWV3KGNvbnRlbnQzKX0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICByZW5kZXJFZGl0b3IoY29udGVudDMpIHsKICAgIHJldHVybiBgCiAgICAgIDx0ZXh0YXJlYSBjbGFzcz0ibWFya2Rvd24tZWRpdG9yIiAKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJFbnRlciBtYXJrZG93biBjb250ZW50Li4uIgogICAgICAgICAgICAgICAgc3BlbGxjaGVjaz0iZmFsc2UiPiR7dGhpcy5lc2NhcGVIdG1sKGNvbnRlbnQzKX08L3RleHRhcmVhPgogICAgYDsKICB9CiAgcmVuZGVyUHJldmlldyhjb250ZW50MykgewogICAgY29uc3QgaHRtbDE2ID0gdGhpcy5wYXJzZU1hcmtkb3duKGNvbnRlbnQzKTsKICAgIHJldHVybiBgCiAgICAgIDxkaXYgY2xhc3M9Im1hcmtkb3duLXByZXZpZXciPgogICAgICAgICR7aHRtbDE2IHx8ICc8ZGl2IGNsYXNzPSJwcmV2aWV3LWVtcHR5Ij5ObyBjb250ZW50IHRvIHByZXZpZXc8L2Rpdj4nfQogICAgICA8L2Rpdj4KICAgIGA7CiAgfQogIHNldHVwKGVsZW1lbnQ0LCBibG9jaywgaGFuZGxlcnMyKSB7CiAgICBjb25zdCBjb250YWluZXIgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIubWFya2Rvd24tYmxvY2stY29udGFpbmVyIik7CiAgICBjb25zdCB0b2dnbGVCdG4gPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIubWFya2Rvd24tdG9nZ2xlLW1vZGUiKTsKICAgIGlmICghY29udGFpbmVyIHx8ICF0b2dnbGVCdG4pIHsKICAgICAgY29uc29sZS5lcnJvcigiTWFya2Rvd25CbG9ja0hhbmRsZXI6IENvdWxkIG5vdCBmaW5kIHJlcXVpcmVkIGVsZW1lbnRzIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghYmxvY2subWV0YWRhdGEpCiAgICAgIGJsb2NrLm1ldGFkYXRhID0ge307CiAgICBpZiAoYmxvY2subWV0YWRhdGEuaXNFZGl0TW9kZSA9PT0gdm9pZCAwKQogICAgICBibG9jay5tZXRhZGF0YS5pc0VkaXRNb2RlID0gdHJ1ZTsKICAgIHRvZ2dsZUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIChlMTEpID0+IHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgaWYgKGJsb2NrLm1ldGFkYXRhLmlzRWRpdE1vZGUpIHsKICAgICAgICBjb25zdCBlZGl0b3IgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigiLm1hcmtkb3duLWVkaXRvciIpOwogICAgICAgIGlmIChlZGl0b3IpIHsKICAgICAgICAgIGJsb2NrLmNvbnRlbnQgPSBlZGl0b3IudmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGJsb2NrLm1ldGFkYXRhLmlzRWRpdE1vZGUgPSAhYmxvY2subWV0YWRhdGEuaXNFZGl0TW9kZTsKICAgICAgaGFuZGxlcnMyLm9uUmVxdWVzdFVwZGF0ZT8uKCk7CiAgICB9KTsKICAgIGlmIChibG9jay5tZXRhZGF0YS5pc0VkaXRNb2RlKSB7CiAgICAgIHRoaXMuc2V0dXBFZGl0b3IoZWxlbWVudDQsIGJsb2NrLCBoYW5kbGVyczIpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5zZXR1cFByZXZpZXcoZWxlbWVudDQsIGJsb2NrLCBoYW5kbGVyczIpOwogICAgfQogIH0KICBzZXR1cEVkaXRvcihlbGVtZW50NCwgYmxvY2ssIGhhbmRsZXJzMikgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLm1hcmtkb3duLWVkaXRvciIpOwogICAgaWYgKCFlZGl0b3IpCiAgICAgIHJldHVybjsKICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsICgpID0+IGhhbmRsZXJzMi5vbkZvY3VzKCkpOwogICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLCAoKSA9PiBoYW5kbGVyczIub25CbHVyKCkpOwogICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgKCkgPT4gewogICAgICBibG9jay5jb250ZW50ID0gZWRpdG9yLnZhbHVlOwogICAgfSk7CiAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIChlMTEpID0+IHsKICAgICAgaWYgKGUxMS5rZXkgPT09ICJUYWIiKSB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgY29uc3Qgc3RhcnQgPSBlZGl0b3Iuc2VsZWN0aW9uU3RhcnQ7CiAgICAgICAgY29uc3QgZW5kMyA9IGVkaXRvci5zZWxlY3Rpb25FbmQ7CiAgICAgICAgY29uc3QgdmFsdWUyID0gZWRpdG9yLnZhbHVlOwogICAgICAgIGlmIChlMTEuc2hpZnRLZXkpIHsKICAgICAgICAgIGNvbnN0IGJlZm9yZUN1cnNvciA9IHZhbHVlMi5zdWJzdHJpbmcoMCwgc3RhcnQpOwogICAgICAgICAgY29uc3QgbGFzdE5ld2xpbmUgPSBiZWZvcmVDdXJzb3IubGFzdEluZGV4T2YoIlxuIik7CiAgICAgICAgICBjb25zdCBsaW5lU3RhcnQgPSBsYXN0TmV3bGluZSArIDE7CiAgICAgICAgICBjb25zdCBsaW5lQ29udGVudCA9IHZhbHVlMi5zdWJzdHJpbmcobGluZVN0YXJ0LCBzdGFydCk7CiAgICAgICAgICBpZiAobGluZUNvbnRlbnQuc3RhcnRzV2l0aCgiICAiKSkgewogICAgICAgICAgICBlZGl0b3IudmFsdWUgPSB2YWx1ZTIuc3Vic3RyaW5nKDAsIGxpbmVTdGFydCkgKyBsaW5lQ29udGVudC5zdWJzdHJpbmcoMikgKyB2YWx1ZTIuc3Vic3RyaW5nKHN0YXJ0KTsKICAgICAgICAgICAgZWRpdG9yLnNlbGVjdGlvblN0YXJ0ID0gZWRpdG9yLnNlbGVjdGlvbkVuZCA9IHN0YXJ0IC0gMjsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZWRpdG9yLnZhbHVlID0gdmFsdWUyLnN1YnN0cmluZygwLCBzdGFydCkgKyAiICAiICsgdmFsdWUyLnN1YnN0cmluZyhlbmQzKTsKICAgICAgICAgIGVkaXRvci5zZWxlY3Rpb25TdGFydCA9IGVkaXRvci5zZWxlY3Rpb25FbmQgPSBzdGFydCArIDI7CiAgICAgICAgfQogICAgICAgIGJsb2NrLmNvbnRlbnQgPSBlZGl0b3IudmFsdWU7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICgoZTExLmN0cmxLZXkgfHwgZTExLm1ldGFLZXkpICYmIGUxMS5rZXkgPT09ICJiIikgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMud3JhcFNlbGVjdGlvbihlZGl0b3IsICIqKiIsICIqKiIpOwogICAgICAgIGJsb2NrLmNvbnRlbnQgPSBlZGl0b3IudmFsdWU7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICgoZTExLmN0cmxLZXkgfHwgZTExLm1ldGFLZXkpICYmIGUxMS5rZXkgPT09ICJpIikgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMud3JhcFNlbGVjdGlvbihlZGl0b3IsICJfIiwgIl8iKTsKICAgICAgICBibG9jay5jb250ZW50ID0gZWRpdG9yLnZhbHVlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoKGUxMS5jdHJsS2V5IHx8IGUxMS5tZXRhS2V5KSAmJiBlMTEua2V5ID09PSAiayIpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICB0aGlzLmluc2VydExpbmsoZWRpdG9yKTsKICAgICAgICBibG9jay5jb250ZW50ID0gZWRpdG9yLnZhbHVlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBoYW5kbGVyczIub25LZXlEb3duKGUxMSk7CiAgICB9KTsKICAgIHRoaXMuYXV0b1Jlc2l6ZShlZGl0b3IpOwogICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgKCkgPT4gdGhpcy5hdXRvUmVzaXplKGVkaXRvcikpOwogIH0KICBzZXR1cFByZXZpZXcoZWxlbWVudDQsIGJsb2NrLCBoYW5kbGVyczIpIHsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5tYXJrZG93bi1ibG9jay1jb250YWluZXIiKTsKICAgIGNvbnN0IHByZXZpZXcgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIubWFya2Rvd24tcHJldmlldyIpOwogICAgaWYgKCFjb250YWluZXIgfHwgIXByZXZpZXcpCiAgICAgIHJldHVybjsKICAgIHByZXZpZXcuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsICIwIik7CiAgICBwcmV2aWV3LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwgKCkgPT4gaGFuZGxlcnMyLm9uRm9jdXMoKSk7CiAgICBwcmV2aWV3LmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLCAoKSA9PiBoYW5kbGVyczIub25CbHVyKCkpOwogICAgcHJldmlldy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgKGUxMSkgPT4gewogICAgICBpZiAoZTExLmtleSA9PT0gIkVudGVyIiAmJiAhZTExLnNoaWZ0S2V5KSB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgYmxvY2subWV0YWRhdGEuaXNFZGl0TW9kZSA9IHRydWU7CiAgICAgICAgaGFuZGxlcnMyLm9uUmVxdWVzdFVwZGF0ZT8uKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGhhbmRsZXJzMi5vbktleURvd24oZTExKTsKICAgIH0pOwogIH0KICB3cmFwU2VsZWN0aW9uKGVkaXRvciwgYmVmb3JlLCBhZnRlcikgewogICAgY29uc3Qgc3RhcnQgPSBlZGl0b3Iuc2VsZWN0aW9uU3RhcnQ7CiAgICBjb25zdCBlbmQzID0gZWRpdG9yLnNlbGVjdGlvbkVuZDsKICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IGVkaXRvci52YWx1ZS5zdWJzdHJpbmcoc3RhcnQsIGVuZDMpOwogICAgY29uc3QgcmVwbGFjZW1lbnQgPSBiZWZvcmUgKyAoc2VsZWN0ZWRUZXh0IHx8ICJ0ZXh0IikgKyBhZnRlcjsKICAgIGVkaXRvci52YWx1ZSA9IGVkaXRvci52YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnQpICsgcmVwbGFjZW1lbnQgKyBlZGl0b3IudmFsdWUuc3Vic3RyaW5nKGVuZDMpOwogICAgaWYgKHNlbGVjdGVkVGV4dCkgewogICAgICBlZGl0b3Iuc2VsZWN0aW9uU3RhcnQgPSBzdGFydDsKICAgICAgZWRpdG9yLnNlbGVjdGlvbkVuZCA9IHN0YXJ0ICsgcmVwbGFjZW1lbnQubGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgZWRpdG9yLnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQgKyBiZWZvcmUubGVuZ3RoOwogICAgICBlZGl0b3Iuc2VsZWN0aW9uRW5kID0gc3RhcnQgKyBiZWZvcmUubGVuZ3RoICsgNDsKICAgIH0KICAgIGVkaXRvci5mb2N1cygpOwogIH0KICBpbnNlcnRMaW5rKGVkaXRvcikgewogICAgY29uc3Qgc3RhcnQgPSBlZGl0b3Iuc2VsZWN0aW9uU3RhcnQ7CiAgICBjb25zdCBlbmQzID0gZWRpdG9yLnNlbGVjdGlvbkVuZDsKICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IGVkaXRvci52YWx1ZS5zdWJzdHJpbmcoc3RhcnQsIGVuZDMpOwogICAgY29uc3QgbGlua1RleHQgPSBzZWxlY3RlZFRleHQgfHwgImxpbmsgdGV4dCI7CiAgICBjb25zdCByZXBsYWNlbWVudCA9IGBbJHtsaW5rVGV4dH1dKHVybClgOwogICAgZWRpdG9yLnZhbHVlID0gZWRpdG9yLnZhbHVlLnN1YnN0cmluZygwLCBzdGFydCkgKyByZXBsYWNlbWVudCArIGVkaXRvci52YWx1ZS5zdWJzdHJpbmcoZW5kMyk7CiAgICBlZGl0b3Iuc2VsZWN0aW9uU3RhcnQgPSBzdGFydCArIGxpbmtUZXh0Lmxlbmd0aCArIDM7CiAgICBlZGl0b3Iuc2VsZWN0aW9uRW5kID0gc3RhcnQgKyBsaW5rVGV4dC5sZW5ndGggKyA2OwogICAgZWRpdG9yLmZvY3VzKCk7CiAgfQogIGF1dG9SZXNpemUoZWRpdG9yKSB7CiAgICBlZGl0b3Iuc3R5bGUuaGVpZ2h0ID0gImF1dG8iOwogICAgZWRpdG9yLnN0eWxlLmhlaWdodCA9IGVkaXRvci5zY3JvbGxIZWlnaHQgKyAicHgiOwogIH0KICBwYXJzZU1hcmtkb3duKG1hcmtkb3duKSB7CiAgICBsZXQgaHRtbDE2ID0gdGhpcy5lc2NhcGVIdG1sKG1hcmtkb3duKTsKICAgIGh0bWwxNiA9IGh0bWwxNi5yZXBsYWNlKC9eIyMjICguKykkL2dtLCAiPGgzPiQxPC9oMz4iKTsKICAgIGh0bWwxNiA9IGh0bWwxNi5yZXBsYWNlKC9eIyMgKC4rKSQvZ20sICI8aDI+JDE8L2gyPiIpOwogICAgaHRtbDE2ID0gaHRtbDE2LnJlcGxhY2UoL14jICguKykkL2dtLCAiPGgxPiQxPC9oMT4iKTsKICAgIGh0bWwxNiA9IGh0bWwxNi5yZXBsYWNlKC9cKlwqKC4rPylcKlwqL2csICI8c3Ryb25nPiQxPC9zdHJvbmc+Iik7CiAgICBodG1sMTYgPSBodG1sMTYucmVwbGFjZSgvX18oLis/KV9fL2csICI8c3Ryb25nPiQxPC9zdHJvbmc+Iik7CiAgICBodG1sMTYgPSBodG1sMTYucmVwbGFjZSgvXCooLis/KVwqL2csICI8ZW0+JDE8L2VtPiIpOwogICAgaHRtbDE2ID0gaHRtbDE2LnJlcGxhY2UoL18oLis/KV8vZywgIjxlbT4kMTwvZW0+Iik7CiAgICBodG1sMTYgPSBodG1sMTYucmVwbGFjZSgvYGBgKFtcc1xTXSo/KWBgYC9nLCAiPHByZT48Y29kZT4kMTwvY29kZT48L3ByZT4iKTsKICAgIGh0bWwxNiA9IGh0bWwxNi5yZXBsYWNlKC9gKC4rPylgL2csICI8Y29kZT4kMTwvY29kZT4iKTsKICAgIGh0bWwxNiA9IGh0bWwxNi5yZXBsYWNlKC9cWyhbXlxdXSspXF1cKChbXildKylcKS9nLCAnPGEgaHJlZj0iJDIiPiQxPC9hPicpOwogICAgaHRtbDE2ID0gaHRtbDE2LnJlcGxhY2UoL15cKiAoLispJC9nbSwgIjxsaT4kMTwvbGk+Iik7CiAgICBodG1sMTYgPSBodG1sMTYucmVwbGFjZSgvXi0gKC4rKSQvZ20sICI8bGk+JDE8L2xpPiIpOwogICAgaHRtbDE2ID0gaHRtbDE2LnJlcGxhY2UoL15cZCtcLiAoLispJC9nbSwgIjxsaT4kMTwvbGk+Iik7CiAgICBodG1sMTYgPSBodG1sMTYucmVwbGFjZSgvKDxsaT4uKjxcL2xpPlxuPykrL2csIChtYXRjaDIpID0+IHsKICAgICAgcmV0dXJuICI8dWw+IiArIG1hdGNoMiArICI8L3VsPiI7CiAgICB9KTsKICAgIGh0bWwxNiA9IGh0bWwxNi5yZXBsYWNlKC9cblxuL2csICI8L3A+PHA+Iik7CiAgICBodG1sMTYgPSAiPHA+IiArIGh0bWwxNiArICI8L3A+IjsKICAgIGh0bWwxNiA9IGh0bWwxNi5yZXBsYWNlKC88cD48XC9wPi9nLCAiIik7CiAgICBodG1sMTYgPSBodG1sMTYucmVwbGFjZSgvPHA+KDxoWzEtM10+KS9nLCAiJDEiKTsKICAgIGh0bWwxNiA9IGh0bWwxNi5yZXBsYWNlKC8oPFwvaFsxLTNdPik8XC9wPi9nLCAiJDEiKTsKICAgIGh0bWwxNiA9IGh0bWwxNi5yZXBsYWNlKC88cD4oPHVsPikvZywgIiQxIik7CiAgICBodG1sMTYgPSBodG1sMTYucmVwbGFjZSgvKDxcL3VsPik8XC9wPi9nLCAiJDEiKTsKICAgIGh0bWwxNiA9IGh0bWwxNi5yZXBsYWNlKC88cD4oPHByZT4pL2csICIkMSIpOwogICAgaHRtbDE2ID0gaHRtbDE2LnJlcGxhY2UoLyg8XC9wcmU+KTxcL3A+L2csICIkMSIpOwogICAgcmV0dXJuIGh0bWwxNjsKICB9CiAgZXNjYXBlSHRtbCh0ZXh0OSkgewogICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBkaXYudGV4dENvbnRlbnQgPSB0ZXh0OTsKICAgIHJldHVybiBkaXYuaW5uZXJIVE1MOwogIH0KICBnZXRDb250ZW50KGVsZW1lbnQ0KSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIubWFya2Rvd24tZWRpdG9yIik7CiAgICBpZiAoZWRpdG9yKSB7CiAgICAgIHJldHVybiBlZGl0b3IudmFsdWU7CiAgICB9CiAgICBjb25zdCBjb250YWluZXIgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIubWFya2Rvd24tYmxvY2stY29udGFpbmVyIik7CiAgICBjb25zdCBibG9ja0lkID0gY29udGFpbmVyPy5nZXRBdHRyaWJ1dGUoImRhdGEtYmxvY2staWQiKTsKICAgIHJldHVybiAiIjsKICB9CiAgc2V0Q29udGVudChlbGVtZW50NCwgY29udGVudDMpIHsKICAgIGNvbnN0IGVkaXRvciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5tYXJrZG93bi1lZGl0b3IiKTsKICAgIGlmIChlZGl0b3IpIHsKICAgICAgZWRpdG9yLnZhbHVlID0gY29udGVudDM7CiAgICAgIHRoaXMuYXV0b1Jlc2l6ZShlZGl0b3IpOwogICAgfQogIH0KICBnZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCkgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLm1hcmtkb3duLWVkaXRvciIpOwogICAgcmV0dXJuIGVkaXRvciA/IGVkaXRvci5zZWxlY3Rpb25TdGFydCA6IG51bGw7CiAgfQogIHNldEN1cnNvclRvU3RhcnQoZWxlbWVudDQpIHsKICAgIGNvbnN0IGVkaXRvciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5tYXJrZG93bi1lZGl0b3IiKTsKICAgIGlmIChlZGl0b3IpIHsKICAgICAgZWRpdG9yLnNlbGVjdGlvblN0YXJ0ID0gZWRpdG9yLnNlbGVjdGlvbkVuZCA9IDA7CiAgICAgIGVkaXRvci5mb2N1cygpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5mb2N1cyhlbGVtZW50NCk7CiAgICB9CiAgfQogIHNldEN1cnNvclRvRW5kKGVsZW1lbnQ0KSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIubWFya2Rvd24tZWRpdG9yIik7CiAgICBpZiAoZWRpdG9yKSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IGVkaXRvci52YWx1ZS5sZW5ndGg7CiAgICAgIGVkaXRvci5zZWxlY3Rpb25TdGFydCA9IGVkaXRvci5zZWxlY3Rpb25FbmQgPSBsZW5ndGg7CiAgICAgIGVkaXRvci5mb2N1cygpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5mb2N1cyhlbGVtZW50NCk7CiAgICB9CiAgfQogIGZvY3VzKGVsZW1lbnQ0KSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIubWFya2Rvd24tZWRpdG9yIik7CiAgICBpZiAoZWRpdG9yKSB7CiAgICAgIGVkaXRvci5mb2N1cygpOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgcHJldmlldyA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5tYXJrZG93bi1wcmV2aWV3Iik7CiAgICAgIHByZXZpZXc/LmZvY3VzKCk7CiAgICB9CiAgfQogIGZvY3VzV2l0aEN1cnNvcihlbGVtZW50NCwgcG9zaXRpb24zID0gImVuZCIpIHsKICAgIGNvbnN0IGVkaXRvciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5tYXJrZG93bi1lZGl0b3IiKTsKICAgIGlmIChlZGl0b3IpIHsKICAgICAgaWYgKHBvc2l0aW9uMyA9PT0gInN0YXJ0IikgewogICAgICAgIHRoaXMuc2V0Q3Vyc29yVG9TdGFydChlbGVtZW50NCk7CiAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24zID09PSAiZW5kIikgewogICAgICAgIHRoaXMuc2V0Q3Vyc29yVG9FbmQoZWxlbWVudDQpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwb3NpdGlvbjMgPT09ICJudW1iZXIiKSB7CiAgICAgICAgZWRpdG9yLnNlbGVjdGlvblN0YXJ0ID0gZWRpdG9yLnNlbGVjdGlvbkVuZCA9IHBvc2l0aW9uMzsKICAgICAgICBlZGl0b3IuZm9jdXMoKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5mb2N1cyhlbGVtZW50NCk7CiAgICB9CiAgfQogIGdldFNwbGl0Q29udGVudChlbGVtZW50NCkgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLm1hcmtkb3duLWVkaXRvciIpOwogICAgaWYgKCFlZGl0b3IpCiAgICAgIHJldHVybiBudWxsOwogICAgY29uc3QgY3Vyc29yUG9zID0gZWRpdG9yLnNlbGVjdGlvblN0YXJ0OwogICAgcmV0dXJuIHsKICAgICAgYmVmb3JlOiBlZGl0b3IudmFsdWUuc3Vic3RyaW5nKDAsIGN1cnNvclBvcyksCiAgICAgIGFmdGVyOiBlZGl0b3IudmFsdWUuc3Vic3RyaW5nKGN1cnNvclBvcykKICAgIH07CiAgfQogIGdldFN0eWxlcygpIHsKICAgIHJldHVybiBgCiAgICAgIC8qIE1hcmtkb3duIEJsb2NrIENvbnRhaW5lciAqLwogICAgICAubWFya2Rvd24tYmxvY2stY29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWFyZ2luOiAxMnB4IDA7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzM3NDE1MSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMTExODI3Iil9OwogICAgICB9CiAgICAgIAogICAgICAubWFya2Rvd24tYmxvY2stY29udGFpbmVyLnNlbGVjdGVkIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOWNhM2FmIiwgIiM2YjcyODAiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC8qIEhlYWRlciAqLwogICAgICAubWFya2Rvd24taGVhZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzNzQxNTEiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOWZhZmIiLCAiIzBhMGEwYSIpfTsKICAgICAgfQogICAgICAKICAgICAgLm1hcmtkb3duLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgfQogICAgICAKICAgICAgLm1hcmtkb3duLXRpdGxlIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzM3NDE1MSIsICIjZTVlN2ViIil9OwogICAgICB9CiAgICAgIAogICAgICAubWFya2Rvd24tdG9nZ2xlLW1vZGUgewogICAgICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzM3NDE1MSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQogICAgICAKICAgICAgLm1hcmtkb3duLXRvZ2dsZS1tb2RlOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YzZjRmNiIsICIjMWYyOTM3Iil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkMWQ1ZGIiLCAiIzRiNTU2MyIpfTsKICAgICAgfQogICAgICAKICAgICAgLyogQ29udGVudCAqLwogICAgICAubWFya2Rvd24tY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1pbi1oZWlnaHQ6IDEyMHB4OwogICAgICB9CiAgICAgIAogICAgICAvKiBFZGl0b3IgKi8KICAgICAgLm1hcmtkb3duLWVkaXRvciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWluLWhlaWdodDogMTIwcHg7CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICByZXNpemU6IG5vbmU7CiAgICAgICAgZm9udC1mYW1pbHk6ICdNb25hY28nLCAnQ29uc29sYXMnLCAnQ291cmllciBOZXcnLCBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMWYyOTM3IiwgIiNmM2Y0ZjYiKX07CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAKICAgICAgLm1hcmtkb3duLWVkaXRvcjo6cGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzljYTNhZiIsICIjNmI3MjgwIil9OwogICAgICB9CiAgICAgIAogICAgICAvKiBQcmV2aWV3ICovCiAgICAgIC5tYXJrZG93bi1wcmV2aWV3IHsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDk2cHg7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxZjI5MzciLCAiI2YzZjRmNiIpfTsKICAgICAgfQogICAgICAKICAgICAgLnByZXZpZXctZW1wdHkgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzljYTNhZiIsICIjNmI3MjgwIil9OwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQogICAgICAKICAgICAgLyogTWFya2Rvd24gcHJldmlldyBzdHlsZXMgKi8KICAgICAgLm1hcmtkb3duLXByZXZpZXcgaDEgewogICAgICAgIGZvbnQtc2l6ZTogMjRweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIG1hcmdpbjogMTZweCAwIDhweCAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzExMTgyNyIsICIjZjlmYWZiIil9OwogICAgICB9CiAgICAgIAogICAgICAubWFya2Rvd24tcHJldmlldyBoMiB7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgbWFyZ2luOiAxNHB4IDAgNnB4IDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTExODI3IiwgIiNmOWZhZmIiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5tYXJrZG93bi1wcmV2aWV3IGgzIHsKICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBtYXJnaW46IDEycHggMCA0cHggMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxMTE4MjciLCAiI2Y5ZmFmYiIpfTsKICAgICAgfQogICAgICAKICAgICAgLm1hcmtkb3duLXByZXZpZXcgcCB7CiAgICAgICAgbWFyZ2luOiA4cHggMDsKICAgICAgfQogICAgICAKICAgICAgLm1hcmtkb3duLXByZXZpZXcgdWwsCiAgICAgIC5tYXJrZG93bi1wcmV2aWV3IG9sIHsKICAgICAgICBtYXJnaW46IDhweCAwOwogICAgICAgIHBhZGRpbmctbGVmdDogMjRweDsKICAgICAgfQogICAgICAKICAgICAgLm1hcmtkb3duLXByZXZpZXcgbGkgewogICAgICAgIG1hcmdpbjogNHB4IDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5tYXJrZG93bi1wcmV2aWV3IGNvZGUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjNmNGY2IiwgIiMxZjI5MzciKX07CiAgICAgICAgcGFkZGluZzogMnB4IDRweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZm9udC1mYW1pbHk6ICdNb25hY28nLCAnQ29uc29sYXMnLCAnQ291cmllciBOZXcnLCBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiAwLjllbTsKICAgICAgfQogICAgICAKICAgICAgLm1hcmtkb3duLXByZXZpZXcgcHJlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YzZjRmNiIsICIjMWYyOTM3Iil9OwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICAgICAgbWFyZ2luOiA4cHggMDsKICAgICAgfQogICAgICAKICAgICAgLm1hcmtkb3duLXByZXZpZXcgcHJlIGNvZGUgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5tYXJrZG93bi1wcmV2aWV3IHN0cm9uZyB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxMTE4MjciLCAiI2Y5ZmFmYiIpfTsKICAgICAgfQogICAgICAKICAgICAgLm1hcmtkb3duLXByZXZpZXcgZW0gewogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQogICAgICAKICAgICAgLm1hcmtkb3duLXByZXZpZXcgYSB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiM2MGE1ZmEiKX07CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CiAgICAgIAogICAgICAubWFya2Rvd24tcHJldmlldyBhOmhvdmVyIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQogICAgICAKICAgICAgLm1hcmtkb3duLXByZXZpZXcgYmxvY2txdW90ZSB7CiAgICAgICAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzc0MTUxIil9OwogICAgICAgIHBhZGRpbmctbGVmdDogMTJweDsKICAgICAgICBtYXJnaW46IDhweCAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzZiNzI4MCIsICIjOWNhM2FmIil9OwogICAgICB9CiAgICBgOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvYmxvY2tzL2NvbnRlbnQvaHRtbC5ibG9jay5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgSHRtbEJsb2NrSGFuZGxlciA9IGNsYXNzIGV4dGVuZHMgQmFzZUJsb2NrSGFuZGxlciB7CiAgdHlwZSA9ICJodG1sIjsKICByZW5kZXIoYmxvY2ssIGlzU2VsZWN0ZWQpIHsKICAgIGNvbnN0IGlzRWRpdE1vZGUgPSBibG9jay5tZXRhZGF0YT8uaXNFZGl0TW9kZSA/PyB0cnVlOwogICAgY29uc3QgY29udGVudDMgPSBibG9jay5jb250ZW50IHx8ICIiOwogICAgcmV0dXJuIGAKICAgICAgPGRpdiBjbGFzcz0iaHRtbC1ibG9jay1jb250YWluZXIke2lzU2VsZWN0ZWQgPyAiIHNlbGVjdGVkIiA6ICIifSIgCiAgICAgICAgICAgZGF0YS1ibG9jay1pZD0iJHtibG9jay5pZH0iCiAgICAgICAgICAgZGF0YS1lZGl0LW1vZGU9IiR7aXNFZGl0TW9kZX0iPgogICAgICAgIDxkaXYgY2xhc3M9Imh0bWwtaGVhZGVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Imh0bWwtaWNvbiI+Jmx0Oy8mZ3Q7PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJodG1sLXRpdGxlIj5IVE1MPC9kaXY+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJodG1sLXRvZ2dsZS1tb2RlIiB0aXRsZT0iJHtpc0VkaXRNb2RlID8gIlByZXZpZXciIDogIkVkaXQifSI+CiAgICAgICAgICAgICR7aXNFZGl0TW9kZSA/ICJcdXsxRjQ0MX1cdUZFMEYiIDogIlx1MjcwRlx1RkUwRiJ9CiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJodG1sLWNvbnRlbnQiPgogICAgICAgICAgJHtpc0VkaXRNb2RlID8gdGhpcy5yZW5kZXJFZGl0b3IoY29udGVudDMpIDogdGhpcy5yZW5kZXJQcmV2aWV3KGNvbnRlbnQzKX0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICByZW5kZXJFZGl0b3IoY29udGVudDMpIHsKICAgIHJldHVybiBgCiAgICAgIDx0ZXh0YXJlYSBjbGFzcz0iaHRtbC1lZGl0b3IiIAogICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkVudGVyIEhUTUwgY29udGVudC4uLiIKICAgICAgICAgICAgICAgIHNwZWxsY2hlY2s9ImZhbHNlIj4ke3RoaXMuZXNjYXBlSHRtbChjb250ZW50Myl9PC90ZXh0YXJlYT4KICAgIGA7CiAgfQogIHJlbmRlclByZXZpZXcoY29udGVudDMpIHsKICAgIHJldHVybiBgCiAgICAgIDxkaXYgY2xhc3M9Imh0bWwtcHJldmlldyI+CiAgICAgICAgJHtjb250ZW50MyB8fCAnPGRpdiBjbGFzcz0icHJldmlldy1lbXB0eSI+Tm8gY29udGVudCB0byBwcmV2aWV3PC9kaXY+J30KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICBzZXR1cChlbGVtZW50NCwgYmxvY2ssIGhhbmRsZXJzMikgewogICAgY29uc3QgY29udGFpbmVyID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmh0bWwtYmxvY2stY29udGFpbmVyIik7CiAgICBjb25zdCB0b2dnbGVCdG4gPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuaHRtbC10b2dnbGUtbW9kZSIpOwogICAgaWYgKCFjb250YWluZXIgfHwgIXRvZ2dsZUJ0bikgewogICAgICBjb25zb2xlLmVycm9yKCJIdG1sQmxvY2tIYW5kbGVyOiBDb3VsZCBub3QgZmluZCByZXF1aXJlZCBlbGVtZW50cyIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIWJsb2NrLm1ldGFkYXRhKQogICAgICBibG9jay5tZXRhZGF0YSA9IHt9OwogICAgaWYgKGJsb2NrLm1ldGFkYXRhLmlzRWRpdE1vZGUgPT09IHZvaWQgMCkKICAgICAgYmxvY2subWV0YWRhdGEuaXNFZGl0TW9kZSA9IHRydWU7CiAgICB0b2dnbGVCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZTExKSA9PiB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIGlmIChibG9jay5tZXRhZGF0YS5pc0VkaXRNb2RlKSB7CiAgICAgICAgY29uc3QgZWRpdG9yID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5odG1sLWVkaXRvciIpOwogICAgICAgIGlmIChlZGl0b3IpIHsKICAgICAgICAgIGJsb2NrLmNvbnRlbnQgPSBlZGl0b3IudmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGJsb2NrLm1ldGFkYXRhLmlzRWRpdE1vZGUgPSAhYmxvY2subWV0YWRhdGEuaXNFZGl0TW9kZTsKICAgICAgaGFuZGxlcnMyLm9uUmVxdWVzdFVwZGF0ZT8uKCk7CiAgICB9KTsKICAgIGlmIChibG9jay5tZXRhZGF0YS5pc0VkaXRNb2RlKSB7CiAgICAgIHRoaXMuc2V0dXBFZGl0b3IoZWxlbWVudDQsIGJsb2NrLCBoYW5kbGVyczIpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5zZXR1cFByZXZpZXcoZWxlbWVudDQsIGJsb2NrLCBoYW5kbGVyczIpOwogICAgfQogIH0KICBzZXR1cEVkaXRvcihlbGVtZW50NCwgYmxvY2ssIGhhbmRsZXJzMikgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmh0bWwtZWRpdG9yIik7CiAgICBpZiAoIWVkaXRvcikKICAgICAgcmV0dXJuOwogICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwgKCkgPT4gaGFuZGxlcnMyLm9uRm9jdXMoKSk7CiAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IGhhbmRsZXJzMi5vbkJsdXIoKSk7CiAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCAoKSA9PiB7CiAgICAgIGJsb2NrLmNvbnRlbnQgPSBlZGl0b3IudmFsdWU7CiAgICAgIHRoaXMudmFsaWRhdGVIdG1sKGVkaXRvci52YWx1ZSk7CiAgICB9KTsKICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgKGUxMSkgPT4gewogICAgICBpZiAoZTExLmtleSA9PT0gIlRhYiIpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICBjb25zdCBzdGFydCA9IGVkaXRvci5zZWxlY3Rpb25TdGFydDsKICAgICAgICBjb25zdCBlbmQzID0gZWRpdG9yLnNlbGVjdGlvbkVuZDsKICAgICAgICBjb25zdCB2YWx1ZTIgPSBlZGl0b3IudmFsdWU7CiAgICAgICAgaWYgKGUxMS5zaGlmdEtleSkgewogICAgICAgICAgY29uc3QgYmVmb3JlQ3Vyc29yID0gdmFsdWUyLnN1YnN0cmluZygwLCBzdGFydCk7CiAgICAgICAgICBjb25zdCBsYXN0TmV3bGluZSA9IGJlZm9yZUN1cnNvci5sYXN0SW5kZXhPZigiXG4iKTsKICAgICAgICAgIGNvbnN0IGxpbmVTdGFydCA9IGxhc3ROZXdsaW5lICsgMTsKICAgICAgICAgIGNvbnN0IGxpbmVDb250ZW50ID0gdmFsdWUyLnN1YnN0cmluZyhsaW5lU3RhcnQsIHN0YXJ0KTsKICAgICAgICAgIGlmIChsaW5lQ29udGVudC5zdGFydHNXaXRoKCIgICIpKSB7CiAgICAgICAgICAgIGVkaXRvci52YWx1ZSA9IHZhbHVlMi5zdWJzdHJpbmcoMCwgbGluZVN0YXJ0KSArIGxpbmVDb250ZW50LnN1YnN0cmluZygyKSArIHZhbHVlMi5zdWJzdHJpbmcoc3RhcnQpOwogICAgICAgICAgICBlZGl0b3Iuc2VsZWN0aW9uU3RhcnQgPSBlZGl0b3Iuc2VsZWN0aW9uRW5kID0gc3RhcnQgLSAyOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlZGl0b3IudmFsdWUgPSB2YWx1ZTIuc3Vic3RyaW5nKDAsIHN0YXJ0KSArICIgICIgKyB2YWx1ZTIuc3Vic3RyaW5nKGVuZDMpOwogICAgICAgICAgZWRpdG9yLnNlbGVjdGlvblN0YXJ0ID0gZWRpdG9yLnNlbGVjdGlvbkVuZCA9IHN0YXJ0ICsgMjsKICAgICAgICB9CiAgICAgICAgYmxvY2suY29udGVudCA9IGVkaXRvci52YWx1ZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKChlMTEuY3RybEtleSB8fCBlMTEubWV0YUtleSkgJiYgZTExLmtleSA9PT0gIi8iKSB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdGhpcy5hdXRvQ2xvc2VUYWcoZWRpdG9yKTsKICAgICAgICBibG9jay5jb250ZW50ID0gZWRpdG9yLnZhbHVlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBoYW5kbGVyczIub25LZXlEb3duKGUxMSk7CiAgICB9KTsKICAgIHRoaXMuYXV0b1Jlc2l6ZShlZGl0b3IpOwogICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgKCkgPT4gdGhpcy5hdXRvUmVzaXplKGVkaXRvcikpOwogIH0KICBzZXR1cFByZXZpZXcoZWxlbWVudDQsIGJsb2NrLCBoYW5kbGVyczIpIHsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5odG1sLWJsb2NrLWNvbnRhaW5lciIpOwogICAgY29uc3QgcHJldmlldyA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5odG1sLXByZXZpZXciKTsKICAgIGlmICghY29udGFpbmVyIHx8ICFwcmV2aWV3KQogICAgICByZXR1cm47CiAgICBwcmV2aWV3LnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCAiMCIpOwogICAgcHJldmlldy5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsICgpID0+IGhhbmRsZXJzMi5vbkZvY3VzKCkpOwogICAgcHJldmlldy5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgKCkgPT4gaGFuZGxlcnMyLm9uQmx1cigpKTsKICAgIHByZXZpZXcuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIChlMTEpID0+IHsKICAgICAgaWYgKGUxMS5rZXkgPT09ICJFbnRlciIgJiYgIWUxMS5zaGlmdEtleSkgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGJsb2NrLm1ldGFkYXRhLmlzRWRpdE1vZGUgPSB0cnVlOwogICAgICAgIGhhbmRsZXJzMi5vblJlcXVlc3RVcGRhdGU/LigpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBoYW5kbGVyczIub25LZXlEb3duKGUxMSk7CiAgICB9KTsKICAgIHRoaXMuc2FuZGJveENvbnRlbnQocHJldmlldyk7CiAgfQogIGF1dG9DbG9zZVRhZyhlZGl0b3IpIHsKICAgIGNvbnN0IGN1cnNvclBvcyA9IGVkaXRvci5zZWxlY3Rpb25TdGFydDsKICAgIGNvbnN0IHRleHQ5ID0gZWRpdG9yLnZhbHVlOwogICAgbGV0IHRhZ1N0YXJ0ID0gY3Vyc29yUG9zOwogICAgd2hpbGUgKHRhZ1N0YXJ0ID4gMCAmJiB0ZXh0OVt0YWdTdGFydCAtIDFdICE9PSAiPCIpIHsKICAgICAgdGFnU3RhcnQtLTsKICAgIH0KICAgIGlmICh0YWdTdGFydCA+IDApIHsKICAgICAgY29uc3QgdGFnQ29udGVudCA9IHRleHQ5LnN1YnN0cmluZyh0YWdTdGFydCwgY3Vyc29yUG9zKTsKICAgICAgY29uc3QgdGFnTWF0Y2ggPSB0YWdDb250ZW50Lm1hdGNoKC9eKFx3KykvKTsKICAgICAgaWYgKHRhZ01hdGNoKSB7CiAgICAgICAgY29uc3QgdGFnTmFtZSA9IHRhZ01hdGNoWzFdOwogICAgICAgIGNvbnN0IGNsb3NpbmdUYWcgPSBgPC8ke3RhZ05hbWV9PmA7CiAgICAgICAgZWRpdG9yLnZhbHVlID0gdGV4dDkuc3Vic3RyaW5nKDAsIGN1cnNvclBvcykgKyAiPiIgKyBjbG9zaW5nVGFnICsgdGV4dDkuc3Vic3RyaW5nKGN1cnNvclBvcyk7CiAgICAgICAgZWRpdG9yLnNlbGVjdGlvblN0YXJ0ID0gZWRpdG9yLnNlbGVjdGlvbkVuZCA9IGN1cnNvclBvcyArIDE7CiAgICAgIH0KICAgIH0KICB9CiAgYXV0b1Jlc2l6ZShlZGl0b3IpIHsKICAgIGVkaXRvci5zdHlsZS5oZWlnaHQgPSAiYXV0byI7CiAgICBlZGl0b3Iuc3R5bGUuaGVpZ2h0ID0gZWRpdG9yLnNjcm9sbEhlaWdodCArICJweCI7CiAgfQogIHZhbGlkYXRlSHRtbChodG1sMTYpIHsKICAgIGNvbnN0IG9wZW5UYWdzID0gW107CiAgICBjb25zdCB0YWdSZWdleCA9IC88XC8/KFthLXpBLVpdW2EtekEtWjAtOV0qKVxiW14+XSo+L2c7CiAgICBsZXQgbWF0Y2gyOwogICAgd2hpbGUgKChtYXRjaDIgPSB0YWdSZWdleC5leGVjKGh0bWwxNikpICE9PSBudWxsKSB7CiAgICAgIGNvbnN0IGlzQ2xvc2luZyA9IG1hdGNoMlswXS5zdGFydHNXaXRoKCI8LyIpOwogICAgICBjb25zdCB0YWdOYW1lID0gbWF0Y2gyWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIGlmIChpc0Nsb3NpbmcpIHsKICAgICAgICBpZiAob3BlblRhZ3MubGVuZ3RoID09PSAwIHx8IG9wZW5UYWdzW29wZW5UYWdzLmxlbmd0aCAtIDFdICE9PSB0YWdOYW1lKSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oYE1pc21hdGNoZWQgY2xvc2luZyB0YWc6ICR7dGFnTmFtZX1gKTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgb3BlblRhZ3MucG9wKCk7CiAgICAgIH0gZWxzZSBpZiAoIW1hdGNoMlswXS5lbmRzV2l0aCgiLz4iKSkgewogICAgICAgIG9wZW5UYWdzLnB1c2godGFnTmFtZSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChvcGVuVGFncy5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnNvbGUud2FybihgVW5jbG9zZWQgdGFnczogJHtvcGVuVGFncy5qb2luKCIsICIpfWApOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgc2FuZGJveENvbnRlbnQocHJldmlldykgewogICAgY29uc3Qgc2NyaXB0cyA9IHByZXZpZXcucXVlcnlTZWxlY3RvckFsbCgic2NyaXB0Iik7CiAgICBzY3JpcHRzLmZvckVhY2goKHNjcmlwdCkgPT4gc2NyaXB0LnJlbW92ZSgpKTsKICAgIGNvbnN0IGFsbEVsZW1lbnRzID0gcHJldmlldy5xdWVyeVNlbGVjdG9yQWxsKCIqIik7CiAgICBhbGxFbGVtZW50cy5mb3JFYWNoKChlbCkgPT4gewogICAgICBBcnJheS5mcm9tKGVsLmF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHIpID0+IHsKICAgICAgICBpZiAoYXR0ci5uYW1lLnN0YXJ0c1dpdGgoIm9uIikpIHsKICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICAgIGNvbnN0IGZvcm1zID0gcHJldmlldy5xdWVyeVNlbGVjdG9yQWxsKCJmb3JtIik7CiAgICBmb3Jtcy5mb3JFYWNoKChmb3JtKSA9PiB7CiAgICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgKGUxMSkgPT4gewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgfSk7CiAgICB9KTsKICB9CiAgZXNjYXBlSHRtbCh0ZXh0OSkgewogICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBkaXYudGV4dENvbnRlbnQgPSB0ZXh0OTsKICAgIHJldHVybiBkaXYuaW5uZXJIVE1MOwogIH0KICBnZXRDb250ZW50KGVsZW1lbnQ0KSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuaHRtbC1lZGl0b3IiKTsKICAgIGlmIChlZGl0b3IpIHsKICAgICAgcmV0dXJuIGVkaXRvci52YWx1ZTsKICAgIH0KICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsZW1lbnQ0LnF1ZXJ5U2VsZWN0b3IoIi5odG1sLWJsb2NrLWNvbnRhaW5lciIpOwogICAgY29uc3QgYmxvY2tJZCA9IGNvbnRhaW5lcj8uZ2V0QXR0cmlidXRlKCJkYXRhLWJsb2NrLWlkIik7CiAgICByZXR1cm4gIiI7CiAgfQogIHNldENvbnRlbnQoZWxlbWVudDQsIGNvbnRlbnQzKSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuaHRtbC1lZGl0b3IiKTsKICAgIGlmIChlZGl0b3IpIHsKICAgICAgZWRpdG9yLnZhbHVlID0gY29udGVudDM7CiAgICAgIHRoaXMuYXV0b1Jlc2l6ZShlZGl0b3IpOwogICAgfQogIH0KICBnZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCkgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmh0bWwtZWRpdG9yIik7CiAgICByZXR1cm4gZWRpdG9yID8gZWRpdG9yLnNlbGVjdGlvblN0YXJ0IDogbnVsbDsKICB9CiAgc2V0Q3Vyc29yVG9TdGFydChlbGVtZW50NCkgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmh0bWwtZWRpdG9yIik7CiAgICBpZiAoZWRpdG9yKSB7CiAgICAgIGVkaXRvci5zZWxlY3Rpb25TdGFydCA9IGVkaXRvci5zZWxlY3Rpb25FbmQgPSAwOwogICAgICBlZGl0b3IuZm9jdXMoKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZm9jdXMoZWxlbWVudDQpOwogICAgfQogIH0KICBzZXRDdXJzb3JUb0VuZChlbGVtZW50NCkgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmh0bWwtZWRpdG9yIik7CiAgICBpZiAoZWRpdG9yKSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IGVkaXRvci52YWx1ZS5sZW5ndGg7CiAgICAgIGVkaXRvci5zZWxlY3Rpb25TdGFydCA9IGVkaXRvci5zZWxlY3Rpb25FbmQgPSBsZW5ndGg7CiAgICAgIGVkaXRvci5mb2N1cygpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5mb2N1cyhlbGVtZW50NCk7CiAgICB9CiAgfQogIGZvY3VzKGVsZW1lbnQ0KSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuaHRtbC1lZGl0b3IiKTsKICAgIGlmIChlZGl0b3IpIHsKICAgICAgZWRpdG9yLmZvY3VzKCk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBwcmV2aWV3ID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmh0bWwtcHJldmlldyIpOwogICAgICBwcmV2aWV3Py5mb2N1cygpOwogICAgfQogIH0KICBmb2N1c1dpdGhDdXJzb3IoZWxlbWVudDQsIHBvc2l0aW9uMyA9ICJlbmQiKSB7CiAgICBjb25zdCBlZGl0b3IgPSBlbGVtZW50NC5xdWVyeVNlbGVjdG9yKCIuaHRtbC1lZGl0b3IiKTsKICAgIGlmIChlZGl0b3IpIHsKICAgICAgaWYgKHBvc2l0aW9uMyA9PT0gInN0YXJ0IikgewogICAgICAgIHRoaXMuc2V0Q3Vyc29yVG9TdGFydChlbGVtZW50NCk7CiAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24zID09PSAiZW5kIikgewogICAgICAgIHRoaXMuc2V0Q3Vyc29yVG9FbmQoZWxlbWVudDQpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwb3NpdGlvbjMgPT09ICJudW1iZXIiKSB7CiAgICAgICAgZWRpdG9yLnNlbGVjdGlvblN0YXJ0ID0gZWRpdG9yLnNlbGVjdGlvbkVuZCA9IHBvc2l0aW9uMzsKICAgICAgICBlZGl0b3IuZm9jdXMoKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5mb2N1cyhlbGVtZW50NCk7CiAgICB9CiAgfQogIGdldFNwbGl0Q29udGVudChlbGVtZW50NCkgewogICAgY29uc3QgZWRpdG9yID0gZWxlbWVudDQucXVlcnlTZWxlY3RvcigiLmh0bWwtZWRpdG9yIik7CiAgICBpZiAoIWVkaXRvcikKICAgICAgcmV0dXJuIG51bGw7CiAgICBjb25zdCBjdXJzb3JQb3MgPSBlZGl0b3Iuc2VsZWN0aW9uU3RhcnQ7CiAgICByZXR1cm4gewogICAgICBiZWZvcmU6IGVkaXRvci52YWx1ZS5zdWJzdHJpbmcoMCwgY3Vyc29yUG9zKSwKICAgICAgYWZ0ZXI6IGVkaXRvci52YWx1ZS5zdWJzdHJpbmcoY3Vyc29yUG9zKQogICAgfTsKICB9CiAgZ2V0U3R5bGVzKCkgewogICAgcmV0dXJuIGAKICAgICAgLyogSFRNTCBCbG9jayBDb250YWluZXIgKi8KICAgICAgLmh0bWwtYmxvY2stY29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWFyZ2luOiAxMnB4IDA7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzM3NDE1MSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMTExODI3Iil9OwogICAgICB9CiAgICAgIAogICAgICAuaHRtbC1ibG9jay1jb250YWluZXIuc2VsZWN0ZWQgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5Y2EzYWYiLCAiIzZiNzI4MCIpfTsKICAgICAgfQogICAgICAKICAgICAgLyogSGVhZGVyICovCiAgICAgIC5odG1sLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzc0MTUxIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjlmYWZiIiwgIiMwYTBhMGEiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5odG1sLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgICBmb250LWZhbWlseTogJ01vbmFjbycsICdDb25zb2xhcycsICdDb3VyaWVyIE5ldycsIG1vbm9zcGFjZTsKICAgICAgfQogICAgICAKICAgICAgLmh0bWwtdGl0bGUgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMzc0MTUxIiwgIiNlNWU3ZWIiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5odG1sLXRvZ2dsZS1tb2RlIHsKICAgICAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzNzQxNTEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KICAgICAgCiAgICAgIC5odG1sLXRvZ2dsZS1tb2RlOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YzZjRmNiIsICIjMWYyOTM3Iil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkMWQ1ZGIiLCAiIzRiNTU2MyIpfTsKICAgICAgfQogICAgICAKICAgICAgLyogQ29udGVudCAqLwogICAgICAuaHRtbC1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWluLWhlaWdodDogMTIwcHg7CiAgICAgIH0KICAgICAgCiAgICAgIC8qIEVkaXRvciAqLwogICAgICAuaHRtbC1lZGl0b3IgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1pbi1oZWlnaHQ6IDEyMHB4OwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgcmVzaXplOiBub25lOwogICAgICAgIGZvbnQtZmFtaWx5OiAnTW9uYWNvJywgJ0NvbnNvbGFzJywgJ0NvdXJpZXIgTmV3JywgbW9ub3NwYWNlOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBsaW5lLWhlaWdodDogMS42OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzFmMjkzNyIsICIjZjNmNGY2Iil9OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgIC5odG1sLWVkaXRvcjo6cGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzljYTNhZiIsICIjNmI3MjgwIil9OwogICAgICB9CiAgICAgIAogICAgICAvKiBQcmV2aWV3ICovCiAgICAgIC5odG1sLXByZXZpZXcgewogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgbWluLWhlaWdodDogOTZweDsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBsaW5lLWhlaWdodDogMS42OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzFmMjkzNyIsICIjZjNmNGY2Iil9OwogICAgICB9CiAgICAgIAogICAgICAucHJldmlldy1lbXB0eSB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOWNhM2FmIiwgIiM2YjcyODAiKX07CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICB9CiAgICAgIAogICAgICAvKiBTYW5kYm94ZWQgSFRNTCBwcmV2aWV3IHN0eWxlcyAqLwogICAgICAuaHRtbC1wcmV2aWV3ICogewogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgLmh0bWwtcHJldmlldyBpbWcgewogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgfQogICAgICAKICAgICAgLmh0bWwtcHJldmlldyBhIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzYwYTVmYSIpfTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KICAgICAgCiAgICAgIC5odG1sLXByZXZpZXcgYTpob3ZlciB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KICAgICAgCiAgICAgIC5odG1sLXByZXZpZXcgdGFibGUgewogICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWFyZ2luOiA4cHggMDsKICAgICAgfQogICAgICAKICAgICAgLmh0bWwtcHJldmlldyB0aCwKICAgICAgLmh0bWwtcHJldmlldyB0ZCB7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzM3NDE1MSIpfTsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQogICAgICAKICAgICAgLmh0bWwtcHJldmlldyB0aCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOWZhZmIiLCAiIzFmMjkzNyIpfTsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICB9CiAgICAgIAogICAgICAuaHRtbC1wcmV2aWV3IHByZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmM2Y0ZjYiLCAiIzFmMjkzNyIpfTsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICAgIG1hcmdpbjogOHB4IDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5odG1sLXByZXZpZXcgY29kZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmM2Y0ZjYiLCAiIzFmMjkzNyIpfTsKICAgICAgICBwYWRkaW5nOiAycHggNHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICBmb250LWZhbWlseTogJ01vbmFjbycsICdDb25zb2xhcycsICdDb3VyaWVyIE5ldycsIG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDAuOWVtOwogICAgICB9CiAgICAgIAogICAgICAuaHRtbC1wcmV2aWV3IHByZSBjb2RlIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CiAgICBgOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvd3lzaXd5Zy5ibG9ja3JlZ2lzdHJhdGlvbi5qcwpmdW5jdGlvbiByZWdpc3RlckFsbEJsb2NrSGFuZGxlcnMoKSB7CiAgQmxvY2tSZWdpc3RyeS5yZWdpc3RlcigiZGl2aWRlciIsIG5ldyBEaXZpZGVyQmxvY2tIYW5kbGVyKCkpOwogIEJsb2NrUmVnaXN0cnkucmVnaXN0ZXIoInBhcmFncmFwaCIsIG5ldyBQYXJhZ3JhcGhCbG9ja0hhbmRsZXIoKSk7CiAgQmxvY2tSZWdpc3RyeS5yZWdpc3RlcigiaGVhZGluZy0xIiwgbmV3IEhlYWRpbmdCbG9ja0hhbmRsZXIoImhlYWRpbmctMSIpKTsKICBCbG9ja1JlZ2lzdHJ5LnJlZ2lzdGVyKCJoZWFkaW5nLTIiLCBuZXcgSGVhZGluZ0Jsb2NrSGFuZGxlcigiaGVhZGluZy0yIikpOwogIEJsb2NrUmVnaXN0cnkucmVnaXN0ZXIoImhlYWRpbmctMyIsIG5ldyBIZWFkaW5nQmxvY2tIYW5kbGVyKCJoZWFkaW5nLTMiKSk7CiAgQmxvY2tSZWdpc3RyeS5yZWdpc3RlcigicXVvdGUiLCBuZXcgUXVvdGVCbG9ja0hhbmRsZXIoKSk7CiAgQmxvY2tSZWdpc3RyeS5yZWdpc3RlcigiY29kZSIsIG5ldyBDb2RlQmxvY2tIYW5kbGVyKCkpOwogIEJsb2NrUmVnaXN0cnkucmVnaXN0ZXIoImxpc3QiLCBuZXcgTGlzdEJsb2NrSGFuZGxlcigpKTsKICBCbG9ja1JlZ2lzdHJ5LnJlZ2lzdGVyKCJpbWFnZSIsIG5ldyBJbWFnZUJsb2NrSGFuZGxlcigpKTsKICBCbG9ja1JlZ2lzdHJ5LnJlZ2lzdGVyKCJ5b3V0dWJlIiwgbmV3IFlvdVR1YmVCbG9ja0hhbmRsZXIoKSk7CiAgQmxvY2tSZWdpc3RyeS5yZWdpc3RlcigiYXR0YWNobWVudCIsIG5ldyBBdHRhY2htZW50QmxvY2tIYW5kbGVyKCkpOwogIEJsb2NrUmVnaXN0cnkucmVnaXN0ZXIoIm1hcmtkb3duIiwgbmV3IE1hcmtkb3duQmxvY2tIYW5kbGVyKCkpOwogIEJsb2NrUmVnaXN0cnkucmVnaXN0ZXIoImh0bWwiLCBuZXcgSHRtbEJsb2NrSGFuZGxlcigpKTsKfQpyZWdpc3RlckFsbEJsb2NrSGFuZGxlcnMoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvd3lzaXd5Zy5tb2RhbG1hbmFnZXIuanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIFd5c2l3eWdNb2RhbE1hbmFnZXIgPSBjbGFzcyB7CiAgLyoqCiAgICogU2hvd3MgbGFuZ3VhZ2Ugc2VsZWN0aW9uIG1vZGFsIGZvciBjb2RlIGJsb2NrcwogICAqLwogIHN0YXRpYyBhc3luYyBzaG93TGFuZ3VhZ2VTZWxlY3Rpb25Nb2RhbCgpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHsKICAgICAgbGV0IHNlbGVjdGVkTGFuZ3VhZ2UgPSBudWxsOwogICAgICBEZWVzTW9kYWwuY3JlYXRlQW5kU2hvdyh7CiAgICAgICAgaGVhZGluZzogIlNlbGVjdCBQcm9ncmFtbWluZyBMYW5ndWFnZSIsCiAgICAgICAgY29udGVudDogYjJgCiAgICAgICAgICA8c3R5bGU+CiAgICAgICAgICAgIC5sYW5ndWFnZS1jb250YWluZXIgewogICAgICAgICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7CiAgICAgICAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICAgICAgfQogICAgICAgICAgICAubGFuZ3VhZ2UtZ3JpZCB7CiAgICAgICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgxMjBweCwgMWZyKSk7CiAgICAgICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLmxhbmd1YWdlLWJ1dHRvbiB7CiAgICAgICAgICAgICAgcGFkZGluZzogMTJweCA4cHg7CiAgICAgICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzM3NDE1MSIpfTsKICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzNzQxNTEiLCAiI2U1ZTdlYiIpfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAubGFuZ3VhZ2UtYnV0dG9uOmhvdmVyIHsKICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y5ZmFmYiIsICIjMWYyOTM3Iil9OwogICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkMWQ1ZGIiLCAiIzRiNTU2MyIpfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAubGFuZ3VhZ2UtYnV0dG9uLnNlbGVjdGVkIHsKICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2YzZjRmNiIsICIjMzc0MTUxIil9OwogICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5Y2EzYWYiLCAiIzZiNzI4MCIpfTsKICAgICAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxMTE4MjciLCAiI2Y5ZmFmYiIpfTsKICAgICAgICAgICAgfQogICAgICAgICAgPC9zdHlsZT4KICAgICAgICAgIDxkaXYgY2xhc3M9Imxhbmd1YWdlLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Imxhbmd1YWdlLWdyaWQiPgogICAgICAgICAgICAgICR7dGhpcy5nZXRMYW5ndWFnZXMoKS5tYXAoKGxhbmcpID0+IGIyYAogICAgICAgICAgICAgICAgPGRpdiAKICAgICAgICAgICAgICAgICAgY2xhc3M9Imxhbmd1YWdlLWJ1dHRvbiAke3NlbGVjdGVkTGFuZ3VhZ2UgPT09IGxhbmcudG9Mb3dlckNhc2UoKSA/ICJzZWxlY3RlZCIgOiAiIn0iIAogICAgICAgICAgICAgICAgICBAY2xpY2s9IiR7KCkgPT4gewogICAgICAgICAgc2VsZWN0ZWRMYW5ndWFnZSA9IGxhbmcudG9Mb3dlckNhc2UoKTsKICAgICAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZGVlcy1tb2RhbCIpOwogICAgICAgICAgaWYgKG1vZGFsICYmIHR5cGVvZiBtb2RhbC5kZXN0cm95ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIG1vZGFsLmRlc3Ryb3koKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc29sdmUyKHNlbGVjdGVkTGFuZ3VhZ2UpOwogICAgICAgIH19Ij4KICAgICAgICAgICAgICAgICAgJHtsYW5nfQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgYCl9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgYCwKICAgICAgICBtZW51T3B0aW9uczogWwogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiQ2FuY2VsIiwKICAgICAgICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWwpID0+IHsKICAgICAgICAgICAgICBtb2RhbC5kZXN0cm95KCk7CiAgICAgICAgICAgICAgcmVzb2x2ZTIobnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH0pOwogICAgfSk7CiAgfQogIC8qKgogICAqIFNob3dzIGJsb2NrIHNldHRpbmdzIG1vZGFsCiAgICovCiAgc3RhdGljIGFzeW5jIHNob3dCbG9ja1NldHRpbmdzTW9kYWwoYmxvY2ssIG9uVXBkYXRlKSB7CiAgICBjb25zdCBjb250ZW50MyA9IGIyYAogICAgICA8c3R5bGU+CiAgICAgICAgLnNldHRpbmdzLWNvbnRhaW5lciB7CiAgICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgIH0KICAgICAgICAuc2V0dGluZ3Mtc2VjdGlvbiB7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICAgIH0KICAgICAgICAuc2V0dGluZ3Mtc2VjdGlvbjpsYXN0LWNoaWxkIHsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICAgICAgfQogICAgICAgIC5zZXR0aW5ncy1sYWJlbCB7CiAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNmI3MjgwIiwgIiM5Y2EzYWYiKX07CiAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICAgICAgICB9CiAgICAgICAgLmJsb2NrLXR5cGUtZ3JpZCB7CiAgICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMTYwcHgsIDFmcikpOwogICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgfQogICAgICAgIC5ibG9jay10eXBlLWJ1dHRvbiB7CiAgICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzc0MTUxIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBnYXA6IDhweDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzM3NDE1MSIsICIjZTVlN2ViIil9OwogICAgICAgIH0KICAgICAgICAuYmxvY2stdHlwZS1idXR0b246aG92ZXIgewogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOWZhZmIiLCAiIzFmMjkzNyIpfTsKICAgICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkMWQ1ZGIiLCAiIzRiNTU2MyIpfTsKICAgICAgICB9CiAgICAgICAgLmJsb2NrLXR5cGUtYnV0dG9uLnNlbGVjdGVkIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjNmNGY2IiwgIiMzNzQxNTEiKX07CiAgICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOWNhM2FmIiwgIiM2YjcyODAiKX07CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxMTE4MjciLCAiI2Y5ZmFmYiIpfTsKICAgICAgICB9CiAgICAgICAgLmJsb2NrLXR5cGUtaWNvbiB7CiAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICAgIG9wYWNpdHk6IDAuNzsKICAgICAgICB9CiAgICAgIDwvc3R5bGU+CiAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzLWNvbnRhaW5lciI+CiAgICAgICAgJHt0aGlzLmdldEJsb2NrVHlwZVNlbGVjdG9yKGJsb2NrLCBvblVwZGF0ZSl9CiAgICAgICAgJHtibG9jay50eXBlID09PSAiY29kZSIgPyB0aGlzLmdldENvZGVCbG9ja1NldHRpbmdzKGJsb2NrLCBvblVwZGF0ZSkgOiAiIn0KICAgICAgPC9kaXY+CiAgICBgOwogICAgRGVlc01vZGFsLmNyZWF0ZUFuZFNob3coewogICAgICBoZWFkaW5nOiAiQmxvY2sgU2V0dGluZ3MiLAogICAgICBjb250ZW50OiBjb250ZW50MywKICAgICAgbWVudU9wdGlvbnM6IFsKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiRG9uZSIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jIChtb2RhbCkgPT4gewogICAgICAgICAgICBtb2RhbC5kZXN0cm95KCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBdCiAgICB9KTsKICB9CiAgLyoqCiAgICogR2V0cyBjb2RlIGJsb2NrIHNldHRpbmdzIGNvbnRlbnQKICAgKi8KICBzdGF0aWMgZ2V0Q29kZUJsb2NrU2V0dGluZ3MoYmxvY2ssIG9uVXBkYXRlKSB7CiAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2UgPSBibG9jay5tZXRhZGF0YT8ubGFuZ3VhZ2UgfHwgImphdmFzY3JpcHQiOwogICAgcmV0dXJuIGIyYAogICAgICA8c3R5bGU+CiAgICAgICAgLmxhbmd1YWdlLWdyaWQgewogICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDEwMHB4LCAxZnIpKTsKICAgICAgICAgIGdhcDogNnB4OwogICAgICAgIH0KICAgICAgICAubGFuZ3VhZ2UtYnV0dG9uIHsKICAgICAgICAgIHBhZGRpbmc6IDhweCA0cHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzNzQxNTEiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzM3NDE1MSIsICIjZTVlN2ViIil9OwogICAgICAgIH0KICAgICAgICAubGFuZ3VhZ2UtYnV0dG9uOmhvdmVyIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjlmYWZiIiwgIiMxZjI5MzciKX07CiAgICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDFkNWRiIiwgIiM0YjU1NjMiKX07CiAgICAgICAgfQogICAgICAgIC5sYW5ndWFnZS1idXR0b24uc2VsZWN0ZWQgewogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmM2Y0ZjYiLCAiIzM3NDE1MSIpfTsKICAgICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5Y2EzYWYiLCAiIzZiNzI4MCIpfTsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzExMTgyNyIsICIjZjlmYWZiIil9OwogICAgICAgIH0KICAgICAgPC9zdHlsZT4KICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3Mtc2VjdGlvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3MtbGFiZWwiPlByb2dyYW1taW5nIExhbmd1YWdlPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFuZ3VhZ2UtZ3JpZCI+CiAgICAgICAgICAke3RoaXMuZ2V0TGFuZ3VhZ2VzKCkubWFwKChsYW5nKSA9PiBiMmAKICAgICAgICAgICAgPGRpdiAKICAgICAgICAgICAgICBjbGFzcz0ibGFuZ3VhZ2UtYnV0dG9uICR7Y3VycmVudExhbmd1YWdlID09PSBsYW5nLnRvTG93ZXJDYXNlKCkgPyAic2VsZWN0ZWQiIDogIiJ9IiAKICAgICAgICAgICAgICBAY2xpY2s9IiR7KCkgPT4gewogICAgICBpZiAoIWJsb2NrLm1ldGFkYXRhKQogICAgICAgIGJsb2NrLm1ldGFkYXRhID0ge307CiAgICAgIGJsb2NrLm1ldGFkYXRhLmxhbmd1YWdlID0gbGFuZy50b0xvd2VyQ2FzZSgpOwogICAgICBvblVwZGF0ZShibG9jayk7CiAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZGVlcy1tb2RhbCIpOwogICAgICBpZiAobW9kYWwgJiYgdHlwZW9mIG1vZGFsLmRlc3Ryb3kgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICBtb2RhbC5kZXN0cm95KCk7CiAgICAgIH0KICAgIH19IgogICAgICAgICAgICAgIGRhdGEtbGFuZz0iJHtsYW5nfSIKICAgICAgICAgICAgPiR7bGFuZ308L2Rpdj4KICAgICAgICAgIGApfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgfQogIC8qKgogICAqIEdldHMgYXZhaWxhYmxlIHByb2dyYW1taW5nIGxhbmd1YWdlcwogICAqLwogIHN0YXRpYyBnZXRMYW5ndWFnZXMoKSB7CiAgICByZXR1cm4gWy4uLlBST0dSQU1NSU5HX0xBTkdVQUdFU107CiAgfQogIC8qKgogICAqIEdldHMgYmxvY2sgdHlwZSBzZWxlY3RvcgogICAqLwogIHN0YXRpYyBnZXRCbG9ja1R5cGVTZWxlY3RvcihibG9jaywgb25VcGRhdGUpIHsKICAgIGNvbnN0IGJsb2NrVHlwZXMgPSBXeXNpd3lnU2hvcnRjdXRzLmdldFNsYXNoTWVudUl0ZW1zKCkuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnR5cGUgIT09ICJkaXZpZGVyIik7CiAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzLXNlY3Rpb24iPgogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzLWxhYmVsIj5CbG9jayBUeXBlPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iYmxvY2stdHlwZS1ncmlkIj4KICAgICAgICAgICR7YmxvY2tUeXBlcy5tYXAoKGl0ZW0pID0+IGIyYAogICAgICAgICAgICA8ZGl2IAogICAgICAgICAgICAgIGNsYXNzPSJibG9jay10eXBlLWJ1dHRvbiAke2Jsb2NrLnR5cGUgPT09IGl0ZW0udHlwZSA/ICJzZWxlY3RlZCIgOiAiIn0iCiAgICAgICAgICAgICAgQGNsaWNrPSIke2FzeW5jIChlMTEpID0+IHsKICAgICAgY29uc3QgYnV0dG9uID0gZTExLmN1cnJlbnRUYXJnZXQ7CiAgICAgIGNvbnN0IG9sZFR5cGUgPSBibG9jay50eXBlOwogICAgICBibG9jay50eXBlID0gaXRlbS50eXBlOwogICAgICBpZiAob2xkVHlwZSA9PT0gImNvZGUiICYmIGJsb2NrLnR5cGUgIT09ICJjb2RlIikgewogICAgICAgIGRlbGV0ZSBibG9jay5tZXRhZGF0YT8ubGFuZ3VhZ2U7CiAgICAgIH0gZWxzZSBpZiAob2xkVHlwZSA9PT0gImxpc3QiICYmIGJsb2NrLnR5cGUgIT09ICJsaXN0IikgewogICAgICAgIGRlbGV0ZSBibG9jay5tZXRhZGF0YT8ubGlzdFR5cGU7CiAgICAgIH0gZWxzZSBpZiAoYmxvY2sudHlwZSA9PT0gImxpc3QiICYmICFibG9jay5tZXRhZGF0YT8ubGlzdFR5cGUpIHsKICAgICAgICBibG9jay5tZXRhZGF0YSA9IHsgbGlzdFR5cGU6ICJidWxsZXQiIH07CiAgICAgIH0gZWxzZSBpZiAoYmxvY2sudHlwZSA9PT0gImNvZGUiICYmICFibG9jay5tZXRhZGF0YT8ubGFuZ3VhZ2UpIHsKICAgICAgICBjb25zdCBsYW5ndWFnZSA9IGF3YWl0IHRoaXMuc2hvd0xhbmd1YWdlU2VsZWN0aW9uTW9kYWwoKTsKICAgICAgICBpZiAobGFuZ3VhZ2UpIHsKICAgICAgICAgIGJsb2NrLm1ldGFkYXRhID0geyBsYW5ndWFnZSB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBibG9jay50eXBlID0gb2xkVHlwZTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgICAgb25VcGRhdGUoYmxvY2spOwogICAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImRlZXMtbW9kYWwiKTsKICAgICAgaWYgKG1vZGFsICYmIHR5cGVvZiBtb2RhbC5kZXN0cm95ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgbW9kYWwuZGVzdHJveSgpOwogICAgICB9CiAgICB9fSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJibG9jay10eXBlLWljb24iPiR7aXRlbS5pY29ufTwvc3Bhbj4KICAgICAgICAgICAgICA8c3Bhbj4ke2l0ZW0ubGFiZWx9PC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGApfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy93eXNpd3lnLmlucHV0aGFuZGxlci5qcwp2YXIgV3lzaXd5Z0lucHV0SGFuZGxlciA9IGNsYXNzIHsKICBjb21wb25lbnQ7CiAgc2F2ZVRpbWVvdXQgPSBudWxsOwogIGNvbnN0cnVjdG9yKGNvbXBvbmVudCkgewogICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7CiAgfQogIC8qKgogICAqIEhhbmRsZXMgaW5wdXQgZXZlbnRzIGZvciBibG9ja3MKICAgKi8KICBoYW5kbGVCbG9ja0lucHV0KGUxMSwgYmxvY2spIHsKICAgIGlmICh0aGlzLmNvbXBvbmVudC5pc0NvbXBvc2luZykKICAgICAgcmV0dXJuOwogICAgY29uc3QgdGFyZ2V0ID0gZTExLnRhcmdldDsKICAgIGNvbnN0IHRleHRDb250ZW50ID0gdGFyZ2V0LnRleHRDb250ZW50IHx8ICIiOwogICAgY29uc3QgZGV0ZWN0ZWRUeXBlID0gdGhpcy5kZXRlY3RCbG9ja1R5cGVJbnRlbnQodGV4dENvbnRlbnQpOwogICAgaWYgKGRldGVjdGVkVHlwZSAmJiBkZXRlY3RlZFR5cGUudHlwZSAhPT0gYmxvY2sudHlwZSkgewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy5oYW5kbGVCbG9ja1RyYW5zZm9ybWF0aW9uKGJsb2NrLCBkZXRlY3RlZFR5cGUsIHRhcmdldCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuaGFuZGxlU2xhc2hDb21tYW5kKHRleHRDb250ZW50LCB0YXJnZXQpOwogICAgdGhpcy5zY2hlZHVsZUF1dG9TYXZlKCk7CiAgfQogIC8qKgogICAqIFVwZGF0ZXMgYmxvY2sgY29udGVudCBiYXNlZCBvbiBpdHMgdHlwZQogICAqLwogIHVwZGF0ZUJsb2NrQ29udGVudChibG9jaywgdGFyZ2V0KSB7CiAgICBjb25zdCB3cmFwcGVyRWxlbWVudCA9IHRhcmdldC5jbG9zZXN0KCIuYmxvY2std3JhcHBlciIpOwogICAgY29uc3QgYmxvY2tDb21wb25lbnQgPSB3cmFwcGVyRWxlbWVudD8ucXVlcnlTZWxlY3RvcigiZGVlcy13eXNpd3lnLWJsb2NrIik7CiAgICBpZiAoYmxvY2tDb21wb25lbnQpIHsKICAgICAgY29uc3QgbmV3Q29udGVudCA9IGJsb2NrQ29tcG9uZW50LmdldENvbnRlbnQoKTsKICAgICAgaWYgKGJsb2NrLmNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHsKICAgICAgICBibG9jay5jb250ZW50ID0gbmV3Q29udGVudDsKICAgICAgfQogICAgICBpZiAoYmxvY2sudHlwZSA9PT0gImxpc3QiKSB7CiAgICAgICAgY29uc3QgbGlzdEVsZW1lbnQgPSB0YXJnZXQucXVlcnlTZWxlY3Rvcigib2wsIHVsIik7CiAgICAgICAgaWYgKGxpc3RFbGVtZW50KSB7CiAgICAgICAgICBibG9jay5tZXRhZGF0YSA9IHsKICAgICAgICAgICAgbGlzdFR5cGU6IGxpc3RFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gIm9sIiA/ICJvcmRlcmVkIiA6ICJidWxsZXQiCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKGJsb2NrLnR5cGUgPT09ICJsaXN0IikgewogICAgICAgIGNvbnN0IGxpc3RJdGVtcyA9IHRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCJsaSIpOwogICAgICAgIGJsb2NrLmNvbnRlbnQgPSBBcnJheS5mcm9tKGxpc3RJdGVtcykubWFwKChsaTIpID0+IGxpMi5pbm5lckhUTUwgfHwgIiIpLmpvaW4oIlxuIik7CiAgICAgICAgY29uc3QgbGlzdEVsZW1lbnQgPSB0YXJnZXQucXVlcnlTZWxlY3Rvcigib2wsIHVsIik7CiAgICAgICAgaWYgKGxpc3RFbGVtZW50KSB7CiAgICAgICAgICBibG9jay5tZXRhZGF0YSA9IHsKICAgICAgICAgICAgbGlzdFR5cGU6IGxpc3RFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gIm9sIiA/ICJvcmRlcmVkIiA6ICJidWxsZXQiCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChibG9jay50eXBlID09PSAiY29kZSIpIHsKICAgICAgICBibG9jay5jb250ZW50ID0gdGFyZ2V0LnRleHRDb250ZW50IHx8ICIiOwogICAgICB9IGVsc2UgewogICAgICAgIGJsb2NrLmNvbnRlbnQgPSB0YXJnZXQuaW5uZXJIVE1MIHx8ICIiOwogICAgICB9CiAgICB9CiAgfQogIC8qKgogICAqIERldGVjdHMgaWYgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIGNyZWF0ZSBhIHNwZWNpZmljIGJsb2NrIHR5cGUKICAgKi8KICBkZXRlY3RCbG9ja1R5cGVJbnRlbnQoY29udGVudDMpIHsKICAgIGNvbnN0IGhlYWRpbmdSZXN1bHQgPSBXeXNpd3lnU2hvcnRjdXRzLmNoZWNrSGVhZGluZ1Nob3J0Y3V0KGNvbnRlbnQzKTsKICAgIGlmIChoZWFkaW5nUmVzdWx0KSB7CiAgICAgIHJldHVybiBoZWFkaW5nUmVzdWx0OwogICAgfQogICAgY29uc3QgbGlzdFJlc3VsdCA9IFd5c2l3eWdTaG9ydGN1dHMuY2hlY2tMaXN0U2hvcnRjdXQoY29udGVudDMpOwogICAgaWYgKGxpc3RSZXN1bHQpIHsKICAgICAgcmV0dXJuIGxpc3RSZXN1bHQ7CiAgICB9CiAgICBpZiAoV3lzaXd5Z1Nob3J0Y3V0cy5jaGVja1F1b3RlU2hvcnRjdXQoY29udGVudDMpKSB7CiAgICAgIHJldHVybiB7IHR5cGU6ICJxdW90ZSIgfTsKICAgIH0KICAgIGlmIChXeXNpd3lnU2hvcnRjdXRzLmNoZWNrQ29kZVNob3J0Y3V0KGNvbnRlbnQzKSkgewogICAgICByZXR1cm4geyB0eXBlOiAiY29kZSIgfTsKICAgIH0KICAgIGlmIChXeXNpd3lnU2hvcnRjdXRzLmNoZWNrRGl2aWRlclNob3J0Y3V0KGNvbnRlbnQzKSkgewogICAgICByZXR1cm4geyB0eXBlOiAiZGl2aWRlciIgfTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICAvKioKICAgKiBIYW5kbGVzIGJsb2NrIHR5cGUgdHJhbnNmb3JtYXRpb24KICAgKi8KICBhc3luYyBoYW5kbGVCbG9ja1RyYW5zZm9ybWF0aW9uKGJsb2NrLCBkZXRlY3RlZFR5cGUsIHRhcmdldCkgewogICAgY29uc3QgYmxvY2tPcHMgPSB0aGlzLmNvbXBvbmVudC5ibG9ja09wZXJhdGlvbnM7CiAgICBpZiAoZGV0ZWN0ZWRUeXBlLnR5cGUgPT09ICJsaXN0IikgewogICAgICBibG9jay50eXBlID0gImxpc3QiOwogICAgICBibG9jay5jb250ZW50ID0gIiI7CiAgICAgIGJsb2NrLm1ldGFkYXRhID0geyBsaXN0VHlwZTogZGV0ZWN0ZWRUeXBlLmxpc3RUeXBlIH07CiAgICAgIGNvbnN0IGxpc3RUYWcgPSBkZXRlY3RlZFR5cGUubGlzdFR5cGUgPT09ICJvcmRlcmVkIiA/ICJvbCIgOiAidWwiOwogICAgICB0YXJnZXQuaW5uZXJIVE1MID0gYDwke2xpc3RUYWd9PjxsaT48L2xpPjwvJHtsaXN0VGFnfT5gOwogICAgICB0aGlzLmNvbXBvbmVudC51cGRhdGVWYWx1ZSgpOwogICAgICBpZiAodGhpcy5jb21wb25lbnQuZWRpdG9yQ29udGVudFJlZikgewogICAgICAgIHRoaXMuY29tcG9uZW50LnVwZGF0ZUJsb2NrRWxlbWVudChibG9jay5pZCk7CiAgICAgIH0KICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgV3lzaXd5Z0Jsb2Nrcy5mb2N1c0xpc3RJdGVtKHRhcmdldCk7CiAgICAgIH0sIDApOwogICAgfSBlbHNlIGlmIChkZXRlY3RlZFR5cGUudHlwZSA9PT0gImRpdmlkZXIiKSB7CiAgICAgIGJsb2NrLnR5cGUgPSAiZGl2aWRlciI7CiAgICAgIGJsb2NrLmNvbnRlbnQgPSAiICI7CiAgICAgIGlmICh0aGlzLmNvbXBvbmVudC5lZGl0b3JDb250ZW50UmVmKSB7CiAgICAgICAgdGhpcy5jb21wb25lbnQudXBkYXRlQmxvY2tFbGVtZW50KGJsb2NrLmlkKTsKICAgICAgfQogICAgICBjb25zdCBuZXdCbG9jayA9IGJsb2NrT3BzLmNyZWF0ZUJsb2NrKCk7CiAgICAgIGJsb2NrT3BzLmluc2VydEJsb2NrQWZ0ZXIoYmxvY2ssIG5ld0Jsb2NrKTsKICAgICAgdGhpcy5jb21wb25lbnQudXBkYXRlVmFsdWUoKTsKICAgIH0gZWxzZSBpZiAoZGV0ZWN0ZWRUeXBlLnR5cGUgPT09ICJjb2RlIikgewogICAgICBjb25zdCBsYW5ndWFnZSA9IGF3YWl0IFd5c2l3eWdNb2RhbE1hbmFnZXIuc2hvd0xhbmd1YWdlU2VsZWN0aW9uTW9kYWwoKTsKICAgICAgaWYgKGxhbmd1YWdlKSB7CiAgICAgICAgYmxvY2sudHlwZSA9ICJjb2RlIjsKICAgICAgICBibG9jay5jb250ZW50ID0gIiI7CiAgICAgICAgYmxvY2subWV0YWRhdGEgPSB7IGxhbmd1YWdlIH07CiAgICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gIiI7CiAgICAgICAgdGhpcy5jb21wb25lbnQudXBkYXRlVmFsdWUoKTsKICAgICAgICBpZiAodGhpcy5jb21wb25lbnQuZWRpdG9yQ29udGVudFJlZikgewogICAgICAgICAgdGhpcy5jb21wb25lbnQudXBkYXRlQmxvY2tFbGVtZW50KGJsb2NrLmlkKTsKICAgICAgICB9CiAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7CiAgICAgICAgICBhd2FpdCBibG9ja09wcy5mb2N1c0Jsb2NrKGJsb2NrLmlkLCAic3RhcnQiKTsKICAgICAgICB9LCA1MCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGJsb2NrLnR5cGUgPSBkZXRlY3RlZFR5cGUudHlwZTsKICAgICAgYmxvY2suY29udGVudCA9ICIiOwogICAgICB0YXJnZXQudGV4dENvbnRlbnQgPSAiIjsKICAgICAgdGhpcy5jb21wb25lbnQudXBkYXRlVmFsdWUoKTsKICAgICAgaWYgKHRoaXMuY29tcG9uZW50LmVkaXRvckNvbnRlbnRSZWYpIHsKICAgICAgICB0aGlzLmNvbXBvbmVudC51cGRhdGVCbG9ja0VsZW1lbnQoYmxvY2suaWQpOwogICAgICB9CiAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4gewogICAgICAgIGF3YWl0IGJsb2NrT3BzLmZvY3VzQmxvY2soYmxvY2suaWQsICJzdGFydCIpOwogICAgICB9LCA1MCk7CiAgICB9CiAgfQogIC8qKgogICAqIEhhbmRsZXMgc2xhc2ggY29tbWFuZCBkZXRlY3Rpb24gYW5kIG1lbnUgZGlzcGxheQogICAqLwogIGhhbmRsZVNsYXNoQ29tbWFuZCh0ZXh0Q29udGVudCwgdGFyZ2V0KSB7CiAgICBjb25zdCBzbGFzaE1lbnUgPSB0aGlzLmNvbXBvbmVudC5zbGFzaE1lbnU7CiAgICBjb25zdCBpc1NsYXNoTWVudVZpc2libGUgPSBzbGFzaE1lbnUgJiYgc2xhc2hNZW51LnZpc2libGU7CiAgICBpZiAodGV4dENvbnRlbnQgPT09ICIvIiB8fCB0ZXh0Q29udGVudC5zdGFydHNXaXRoKCIvIikgJiYgaXNTbGFzaE1lbnVWaXNpYmxlKSB7CiAgICAgIGlmICghaXNTbGFzaE1lbnVWaXNpYmxlICYmIHRleHRDb250ZW50ID09PSAiLyIpIHsKICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5nZXRDYXJldENvb3JkaW5hdGVzKHRhcmdldCk7CiAgICAgICAgc2xhc2hNZW51LnNob3coeyB4OiByZWN0LmxlZnQsIHk6IHJlY3QuYm90dG9tICsgNCB9LCAodHlwZTUpID0+IHsKICAgICAgICAgIHRoaXMuY29tcG9uZW50Lmluc2VydEJsb2NrKHR5cGU1KTsKICAgICAgICB9KTsKICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IHRhcmdldCkgewogICAgICAgICAgICB0YXJnZXQuZm9jdXMoKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICBpZiAoc2xhc2hNZW51KSB7CiAgICAgICAgc2xhc2hNZW51LnVwZGF0ZUZpbHRlcih0ZXh0Q29udGVudC5zbGljZSgxKSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoIXRleHRDb250ZW50LnN0YXJ0c1dpdGgoIi8iKSkgewogICAgICB0aGlzLmNvbXBvbmVudC5jbG9zZVNsYXNoTWVudSgpOwogICAgfQogIH0KICAvKioKICAgKiBHZXRzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgY2FyZXQvY3Vyc29yCiAgICovCiAgZ2V0Q2FyZXRDb29yZGluYXRlcyhlbGVtZW50NCkgewogICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHsKICAgICAgY29uc3QgcmFuZ2UyID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7CiAgICAgIGNvbnN0IHJlY3QgPSByYW5nZTIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGlmIChyZWN0LndpZHRoID4gMCB8fCByZWN0LmhlaWdodCA+IDApIHsKICAgICAgICByZXR1cm4gcmVjdDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGVsZW1lbnQ0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIH0KICAvKioKICAgKiBTY2hlZHVsZXMgYXV0by1zYXZlIGFmdGVyIGEgZGVsYXkKICAgKi8KICBzY2hlZHVsZUF1dG9TYXZlKCkgewogICAgaWYgKHRoaXMuc2F2ZVRpbWVvdXQpIHsKICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2F2ZVRpbWVvdXQpOwogICAgfQogICAgaWYgKHRoaXMuY29tcG9uZW50LnNsYXNoTWVudSAmJiB0aGlzLmNvbXBvbmVudC5zbGFzaE1lbnUudmlzaWJsZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLnNhdmVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIHRoaXMuc3luY0FsbEJsb2NrQ29udGVudCgpOwogICAgICB0aGlzLmNvbXBvbmVudC51cGRhdGVWYWx1ZSgpOwogICAgfSwgMmUzKTsKICB9CiAgLyoqCiAgICogU3luY3MgY29udGVudCBmcm9tIGFsbCBibG9jayBET01zIHRvIHRoZSBkYXRhIG1vZGVsCiAgICovCiAgc3luY0FsbEJsb2NrQ29udGVudCgpIHsKICAgIHRoaXMuY29tcG9uZW50LmJsb2Nrcy5mb3JFYWNoKChibG9jaykgPT4gewogICAgICBjb25zdCB3cmFwcGVyRWxlbWVudCA9IHRoaXMuY29tcG9uZW50LnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke2Jsb2NrLmlkfSJdYCk7CiAgICAgIGNvbnN0IGJsb2NrQ29tcG9uZW50ID0gd3JhcHBlckVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgICBpZiAoYmxvY2tDb21wb25lbnQgJiYgYmxvY2tDb21wb25lbnQuZ2V0Q29udGVudCkgewogICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBibG9ja0NvbXBvbmVudC5nZXRDb250ZW50KCk7CiAgICAgICAgaWYgKGJsb2NrLmNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHsKICAgICAgICAgIGJsb2NrLmNvbnRlbnQgPSBuZXdDb250ZW50OwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgfQogIC8qKgogICAqIENsZWFucyB1cCByZXNvdXJjZXMKICAgKi8KICBkZXN0cm95KCkgewogICAgaWYgKHRoaXMuc2F2ZVRpbWVvdXQpIHsKICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2F2ZVRpbWVvdXQpOwogICAgfQogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvd3lzaXd5Zy5rZXlib2FyZGhhbmRsZXIuanMKdmFyIFd5c2l3eWdLZXlib2FyZEhhbmRsZXIgPSBjbGFzcyB7CiAgY29tcG9uZW50OwogIGNvbnN0cnVjdG9yKGNvbXBvbmVudCkgewogICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7CiAgfQogIC8qKgogICAqIEhhbmRsZXMga2V5Ym9hcmQgZXZlbnRzIGZvciBibG9ja3MKICAgKi8KICBhc3luYyBoYW5kbGVCbG9ja0tleURvd24oZTExLCBibG9jaykgewogICAgaWYgKHRoaXMuY29tcG9uZW50LnNsYXNoTWVudS52aXNpYmxlICYmIHRoaXMuaXNTbGFzaE1lbnVLZXkoZTExLmtleSkpIHsKICAgICAgdGhpcy5jb21wb25lbnQuaGFuZGxlU2xhc2hNZW51S2V5Ym9hcmQoZTExKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMuaGFuZGxlRm9ybWF0dGluZ1Nob3J0Y3V0cyhlMTEpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHN3aXRjaCAoZTExLmtleSkgewogICAgICBjYXNlICJUYWIiOgogICAgICAgIHRoaXMuaGFuZGxlVGFiKGUxMSwgYmxvY2spOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJFbnRlciI6CiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFbnRlcihlMTEsIGJsb2NrKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiQmFja3NwYWNlIjoKICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUJhY2tzcGFjZShlMTEsIGJsb2NrKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiRGVsZXRlIjoKICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZURlbGV0ZShlMTEsIGJsb2NrKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiQXJyb3dVcCI6CiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVBcnJvd1VwKGUxMSwgYmxvY2spOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJBcnJvd0Rvd24iOgogICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQXJyb3dEb3duKGUxMSwgYmxvY2spOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJBcnJvd0xlZnQiOgogICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQXJyb3dMZWZ0KGUxMSwgYmxvY2spOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJBcnJvd1JpZ2h0IjoKICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUFycm93UmlnaHQoZTExLCBibG9jayk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQogIC8qKgogICAqIENoZWNrcyBpZiBrZXkgaXMgZm9yIHNsYXNoIG1lbnUgbmF2aWdhdGlvbgogICAqLwogIGlzU2xhc2hNZW51S2V5KGtleTIpIHsKICAgIHJldHVybiBbIkFycm93RG93biIsICJBcnJvd1VwIiwgIkVudGVyIiwgIkVzY2FwZSJdLmluY2x1ZGVzKGtleTIpOwogIH0KICAvKioKICAgKiBIYW5kbGVzIGZvcm1hdHRpbmcga2V5Ym9hcmQgc2hvcnRjdXRzCiAgICovCiAgaGFuZGxlRm9ybWF0dGluZ1Nob3J0Y3V0cyhlMTEpIHsKICAgIGlmICghKGUxMS5tZXRhS2V5IHx8IGUxMS5jdHJsS2V5KSkKICAgICAgcmV0dXJuIGZhbHNlOwogICAgc3dpdGNoIChlMTEua2V5LnRvTG93ZXJDYXNlKCkpIHsKICAgICAgY2FzZSAiYiI6CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLmNvbXBvbmVudC5hcHBseUZvcm1hdCgiYm9sZCIpKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgY2FzZSAiaSI6CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLmNvbXBvbmVudC5hcHBseUZvcm1hdCgiaXRhbGljIikpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICBjYXNlICJ1IjoKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHRoaXMuY29tcG9uZW50LmFwcGx5Rm9ybWF0KCJ1bmRlcmxpbmUiKSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGNhc2UgImsiOgogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5jb21wb25lbnQuYXBwbHlGb3JtYXQoImxpbmsiKSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIC8qKgogICAqIEhhbmRsZXMgVGFiIGtleQogICAqLwogIGhhbmRsZVRhYihlMTEsIGJsb2NrKSB7CiAgICBpZiAoYmxvY2sudHlwZSA9PT0gImNvZGUiKSB7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZiAoYmxvY2sudHlwZSA9PT0gImxpc3QiKSB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgfQogIH0KICAvKioKICAgKiBIYW5kbGVzIEVudGVyIGtleQogICAqLwogIGFzeW5jIGhhbmRsZUVudGVyKGUxMSwgYmxvY2spIHsKICAgIGNvbnN0IGJsb2NrT3BzID0gdGhpcy5jb21wb25lbnQuYmxvY2tPcGVyYXRpb25zOwogICAgY29uc3Qgbm9uRWRpdGFibGVUeXBlcyA9IFsiZGl2aWRlciIsICJpbWFnZSIsICJ5b3V0dWJlIiwgImF0dGFjaG1lbnQiXTsKICAgIGlmIChub25FZGl0YWJsZVR5cGVzLmluY2x1ZGVzKGJsb2NrLnR5cGUpKSB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb25zdCBuZXdCbG9jayA9IGJsb2NrT3BzLmNyZWF0ZUJsb2NrKCk7CiAgICAgIGF3YWl0IGJsb2NrT3BzLmluc2VydEJsb2NrQWZ0ZXIoYmxvY2ssIG5ld0Jsb2NrKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGJsb2NrLnR5cGUgPT09ICJjb2RlIikgewogICAgICBpZiAoZTExLnNoaWZ0S2V5KSB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgY29uc3QgbmV3QmxvY2sgPSBibG9ja09wcy5jcmVhdGVCbG9jaygpOwogICAgICAgIGF3YWl0IGJsb2NrT3BzLmluc2VydEJsb2NrQWZ0ZXIoYmxvY2ssIG5ld0Jsb2NrKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIWUxMS5zaGlmdEtleSkgewogICAgICBpZiAoYmxvY2sudHlwZSA9PT0gImxpc3QiKSB7CiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFbnRlckluTGlzdChlMTEsIGJsb2NrKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICBjb25zdCBibG9ja1dyYXBwZXIgPSB0aGlzLmNvbXBvbmVudC5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKGBbZGF0YS1ibG9jay1pZD0iJHtibG9jay5pZH0iXWApOwogICAgICAgIGNvbnN0IGJsb2NrQ29tcG9uZW50ID0gYmxvY2tXcmFwcGVyPy5xdWVyeVNlbGVjdG9yKCJkZWVzLXd5c2l3eWctYmxvY2siKTsKICAgICAgICBpZiAoYmxvY2tDb21wb25lbnQgJiYgYmxvY2tDb21wb25lbnQuZ2V0U3BsaXRDb250ZW50KSB7CiAgICAgICAgICBjb25zdCBzcGxpdENvbnRlbnQgPSBibG9ja0NvbXBvbmVudC5nZXRTcGxpdENvbnRlbnQoKTsKICAgICAgICAgIGlmIChzcGxpdENvbnRlbnQpIHsKICAgICAgICAgICAgYmxvY2tDb21wb25lbnQuc2V0Q29udGVudChzcGxpdENvbnRlbnQuYmVmb3JlKTsKICAgICAgICAgICAgYmxvY2suY29udGVudCA9IHNwbGl0Q29udGVudC5iZWZvcmU7CiAgICAgICAgICAgIGNvbnN0IG5ld0Jsb2NrID0gYmxvY2tPcHMuY3JlYXRlQmxvY2soInBhcmFncmFwaCIsIHNwbGl0Q29udGVudC5hZnRlcik7CiAgICAgICAgICAgIGF3YWl0IGJsb2NrT3BzLmluc2VydEJsb2NrQWZ0ZXIoYmxvY2ssIG5ld0Jsb2NrKTsKICAgICAgICAgICAgdGhpcy5jb21wb25lbnQudXBkYXRlVmFsdWUoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IG5ld0Jsb2NrID0gYmxvY2tPcHMuY3JlYXRlQmxvY2soKTsKICAgICAgICAgICAgYXdhaXQgYmxvY2tPcHMuaW5zZXJ0QmxvY2tBZnRlcihibG9jaywgbmV3QmxvY2spOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBuZXdCbG9jayA9IGJsb2NrT3BzLmNyZWF0ZUJsb2NrKCk7CiAgICAgICAgICBhd2FpdCBibG9ja09wcy5pbnNlcnRCbG9ja0FmdGVyKGJsb2NrLCBuZXdCbG9jayk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIC8qKgogICAqIEhhbmRsZXMgRW50ZXIga2V5IGluIGxpc3QgYmxvY2tzCiAgICovCiAgYXN5bmMgaGFuZGxlRW50ZXJJbkxpc3QoZTExLCBibG9jaykgewogICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHsKICAgICAgY29uc3QgcmFuZ2UyID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7CiAgICAgIGNvbnN0IGN1cnJlbnRMaSA9IHJhbmdlMi5zdGFydENvbnRhaW5lci5wYXJlbnRFbGVtZW50Py5jbG9zZXN0KCJsaSIpOwogICAgICBpZiAoY3VycmVudExpICYmIGN1cnJlbnRMaS50ZXh0Q29udGVudCA9PT0gIiIpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICBjb25zdCBibG9ja09wcyA9IHRoaXMuY29tcG9uZW50LmJsb2NrT3BlcmF0aW9uczsKICAgICAgICBjb25zdCBuZXdCbG9jayA9IGJsb2NrT3BzLmNyZWF0ZUJsb2NrKCk7CiAgICAgICAgYXdhaXQgYmxvY2tPcHMuaW5zZXJ0QmxvY2tBZnRlcihibG9jaywgbmV3QmxvY2spOwogICAgICB9CiAgICB9CiAgfQogIC8qKgogICAqIEhhbmRsZXMgQmFja3NwYWNlIGtleQogICAqLwogIGFzeW5jIGhhbmRsZUJhY2tzcGFjZShlMTEsIGJsb2NrKSB7CiAgICBjb25zdCBibG9ja09wcyA9IHRoaXMuY29tcG9uZW50LmJsb2NrT3BlcmF0aW9uczsKICAgIGNvbnN0IG5vbkVkaXRhYmxlVHlwZXMgPSBbImRpdmlkZXIiLCAiaW1hZ2UiLCAieW91dHViZSIsICJhdHRhY2htZW50Il07CiAgICBpZiAobm9uRWRpdGFibGVUeXBlcy5pbmNsdWRlcyhibG9jay50eXBlKSkgewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgaWYgKHRoaXMuY29tcG9uZW50LmJsb2Nrcy5sZW5ndGggPT09IDEpIHsKICAgICAgICB0aGlzLmNvbXBvbmVudC5zYXZlVG9IaXN0b3J5KGZhbHNlKTsKICAgICAgICBibG9ja09wcy5yZW1vdmVCbG9jayhibG9jay5pZCk7CiAgICAgICAgY29uc3QgbmV3QmxvY2sgPSBibG9ja09wcy5jcmVhdGVCbG9jaygicGFyYWdyYXBoIiwgIiIpOwogICAgICAgIHRoaXMuY29tcG9uZW50LmJsb2NrcyA9IFtuZXdCbG9ja107CiAgICAgICAgdGhpcy5jb21wb25lbnQucmVuZGVyQmxvY2tzUHJvZ3JhbW1hdGljYWxseSgpOwogICAgICAgIGF3YWl0IGJsb2NrT3BzLmZvY3VzQmxvY2sobmV3QmxvY2suaWQsICJzdGFydCIpOwogICAgICAgIHRoaXMuY29tcG9uZW50LnVwZGF0ZVZhbHVlKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuY29tcG9uZW50LnNhdmVUb0hpc3RvcnkoZmFsc2UpOwogICAgICBjb25zdCBwcmV2QmxvY2sgPSBibG9ja09wcy5nZXRQcmV2aW91c0Jsb2NrKGJsb2NrLmlkKTsKICAgICAgY29uc3QgbmV4dEJsb2NrID0gYmxvY2tPcHMuZ2V0TmV4dEJsb2NrKGJsb2NrLmlkKTsKICAgICAgYmxvY2tPcHMucmVtb3ZlQmxvY2soYmxvY2suaWQpOwogICAgICBpZiAocHJldkJsb2NrICYmIHByZXZCbG9jay50eXBlICE9PSAiZGl2aWRlciIgJiYgcHJldkJsb2NrLnR5cGUgIT09ICJpbWFnZSIpIHsKICAgICAgICBhd2FpdCBibG9ja09wcy5mb2N1c0Jsb2NrKHByZXZCbG9jay5pZCwgImVuZCIpOwogICAgICB9IGVsc2UgaWYgKG5leHRCbG9jayAmJiBuZXh0QmxvY2sudHlwZSAhPT0gImRpdmlkZXIiICYmIG5leHRCbG9jay50eXBlICE9PSAiaW1hZ2UiKSB7CiAgICAgICAgYXdhaXQgYmxvY2tPcHMuZm9jdXNCbG9jayhuZXh0QmxvY2suaWQsICJzdGFydCIpOwogICAgICB9IGVsc2UgaWYgKHByZXZCbG9jaykgewogICAgICAgIGF3YWl0IGJsb2NrT3BzLmZvY3VzQmxvY2socHJldkJsb2NrLmlkKTsKICAgICAgfSBlbHNlIGlmIChuZXh0QmxvY2spIHsKICAgICAgICBhd2FpdCBibG9ja09wcy5mb2N1c0Jsb2NrKG5leHRCbG9jay5pZCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgYmxvY2tXcmFwcGVyID0gdGhpcy5jb21wb25lbnQuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihgW2RhdGEtYmxvY2staWQ9IiR7YmxvY2suaWR9Il1gKTsKICAgIGNvbnN0IGJsb2NrQ29tcG9uZW50ID0gYmxvY2tXcmFwcGVyPy5xdWVyeVNlbGVjdG9yKCJkZWVzLXd5c2l3eWctYmxvY2siKTsKICAgIGlmICghYmxvY2tDb21wb25lbnQgfHwgIWJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IHRhcmdldCA9IGJsb2NrLnR5cGUgPT09ICJjb2RlIiA/IGJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmNvZGUtZWRpdG9yIikgOiBibG9ja0NvbXBvbmVudC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jayIpOwogICAgaWYgKCF0YXJnZXQpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IHBhcmVudENvbXBvbmVudCA9IGJsb2NrQ29tcG9uZW50LmNsb3Nlc3QoImRlZXMtaW5wdXQtd3lzaXd5ZyIpOwogICAgY29uc3Qgc2hhZG93Um9vdHMgPSBbXTsKICAgIGlmIChwYXJlbnRDb21wb25lbnQ/LnNoYWRvd1Jvb3QpCiAgICAgIHNoYWRvd1Jvb3RzLnB1c2gocGFyZW50Q29tcG9uZW50LnNoYWRvd1Jvb3QpOwogICAgc2hhZG93Um9vdHMucHVzaChibG9ja0NvbXBvbmVudC5zaGFkb3dSb290KTsKICAgIGNvbnN0IGN1cnNvclBvcyA9IFd5c2l3eWdTZWxlY3Rpb24uZ2V0Q3Vyc29yUG9zaXRpb25JbkVsZW1lbnQodGFyZ2V0LCAuLi5zaGFkb3dSb290cyk7CiAgICBjb25zdCBhY3R1YWxDb250ZW50ID0gYmxvY2tDb21wb25lbnQuZ2V0Q29udGVudCA/IGJsb2NrQ29tcG9uZW50LmdldENvbnRlbnQoKSA6IHRhcmdldC50ZXh0Q29udGVudDsKICAgIGlmIChjdXJzb3JQb3MgPT09IDApIHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnN0IHByZXZCbG9jayA9IGJsb2NrT3BzLmdldFByZXZpb3VzQmxvY2soYmxvY2suaWQpOwogICAgICBpZiAocHJldkJsb2NrKSB7CiAgICAgICAgY29uc3Qgbm9uRWRpdGFibGVUeXBlczIgPSBbImRpdmlkZXIiLCAiaW1hZ2UiLCAieW91dHViZSIsICJhdHRhY2htZW50Il07CiAgICAgICAgaWYgKG5vbkVkaXRhYmxlVHlwZXMyLmluY2x1ZGVzKHByZXZCbG9jay50eXBlKSkgewogICAgICAgICAgYXdhaXQgYmxvY2tPcHMuZm9jdXNCbG9jayhwcmV2QmxvY2suaWQpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLmNvbXBvbmVudC5zYXZlVG9IaXN0b3J5KGZhbHNlKTsKICAgICAgICBpZiAocHJldkJsb2NrLnR5cGUgPT09ICJjb2RlIiAmJiBibG9jay50eXBlICE9PSAiY29kZSIpIHsKICAgICAgICAgIGlmIChibG9jay5jb250ZW50ID09PSAiIikgewogICAgICAgICAgICBibG9ja09wcy5yZW1vdmVCbG9jayhibG9jay5pZCk7CiAgICAgICAgICAgIGF3YWl0IGJsb2NrT3BzLmZvY3VzQmxvY2socHJldkJsb2NrLmlkLCAiZW5kIik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChibG9jay50eXBlID09PSAiY29kZSIgJiYgcHJldkJsb2NrLnR5cGUgIT09ICJjb2RlIikgewogICAgICAgICAgY29uc3QgYWN0dWFsQ29udGVudDIgPSBibG9ja0NvbXBvbmVudC5nZXRDb250ZW50ID8gYmxvY2tDb21wb25lbnQuZ2V0Q29udGVudCgpIDogYmxvY2suY29udGVudDsKICAgICAgICAgIGlmIChhY3R1YWxDb250ZW50MiA9PT0gIiIgfHwgYWN0dWFsQ29udGVudDIudHJpbSgpID09PSAiIikgewogICAgICAgICAgICBibG9ja09wcy5yZW1vdmVCbG9jayhibG9jay5pZCk7CiAgICAgICAgICAgIGF3YWl0IGJsb2NrT3BzLmZvY3VzQmxvY2socHJldkJsb2NrLmlkLCAiZW5kIik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHByZXZCbG9ja1dyYXBwZXIgPSB0aGlzLmNvbXBvbmVudC5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKGBbZGF0YS1ibG9jay1pZD0iJHtwcmV2QmxvY2suaWR9Il1gKTsKICAgICAgICBjb25zdCBwcmV2QmxvY2tDb21wb25lbnQgPSBwcmV2QmxvY2tXcmFwcGVyPy5xdWVyeVNlbGVjdG9yKCJkZWVzLXd5c2l3eWctYmxvY2siKTsKICAgICAgICBjb25zdCBwcmV2Q29udGVudCA9IHByZXZCbG9ja0NvbXBvbmVudD8uZ2V0Q29udGVudCgpIHx8IHByZXZCbG9jay5jb250ZW50IHx8ICIiOwogICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZW50ID0gYmxvY2tDb21wb25lbnQuZ2V0Q29udGVudCgpIHx8IGJsb2NrLmNvbnRlbnQgfHwgIiI7CiAgICAgICAgbGV0IG1lcmdlZENvbnRlbnQgPSAiIjsKICAgICAgICBpZiAocHJldkJsb2NrLnR5cGUgPT09ICJjb2RlIiAmJiBibG9jay50eXBlID09PSAiY29kZSIpIHsKICAgICAgICAgIG1lcmdlZENvbnRlbnQgPSBwcmV2Q29udGVudCArIChwcmV2Q29udGVudCAmJiBjdXJyZW50Q29udGVudCA/ICJcbiIgOiAiIikgKyBjdXJyZW50Q29udGVudDsKICAgICAgICB9IGVsc2UgaWYgKHByZXZCbG9jay50eXBlID09PSAibGlzdCIgJiYgYmxvY2sudHlwZSA9PT0gImxpc3QiKSB7CiAgICAgICAgICBtZXJnZWRDb250ZW50ID0gcHJldkNvbnRlbnQgKyAocHJldkNvbnRlbnQgJiYgY3VycmVudENvbnRlbnQgPyAiXG4iIDogIiIpICsgY3VycmVudENvbnRlbnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1lcmdlZENvbnRlbnQgPSBwcmV2Q29udGVudCArIChwcmV2Q29udGVudCAmJiBjdXJyZW50Q29udGVudCA/ICIgIiA6ICIiKSArIGN1cnJlbnRDb250ZW50OwogICAgICAgIH0KICAgICAgICBjb25zdCBtZXJnZVBvaW50ID0gcHJldkNvbnRlbnQubGVuZ3RoOwogICAgICAgIGJsb2NrT3BzLnVwZGF0ZUJsb2NrQ29udGVudChwcmV2QmxvY2suaWQsIG1lcmdlZENvbnRlbnQpOwogICAgICAgIGlmIChwcmV2QmxvY2tDb21wb25lbnQpIHsKICAgICAgICAgIHByZXZCbG9ja0NvbXBvbmVudC5zZXRDb250ZW50KG1lcmdlZENvbnRlbnQpOwogICAgICAgIH0KICAgICAgICBibG9ja09wcy5yZW1vdmVCbG9jayhibG9jay5pZCk7CiAgICAgICAgYXdhaXQgYmxvY2tPcHMuZm9jdXNCbG9jayhwcmV2QmxvY2suaWQsIG1lcmdlUG9pbnQpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHRoaXMuY29tcG9uZW50LmJsb2Nrcy5sZW5ndGggPiAxKSB7CiAgICAgIGNvbnN0IGN1cnJlbnRDb250ZW50ID0gYmxvY2tDb21wb25lbnQuZ2V0Q29udGVudCA/IGJsb2NrQ29tcG9uZW50LmdldENvbnRlbnQoKSA6IGJsb2NrLmNvbnRlbnQ7CiAgICAgIGlmIChjdXJyZW50Q29udGVudCA9PT0gIiIgfHwgY3VycmVudENvbnRlbnQudHJpbSgpID09PSAiIikgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNvbnN0IHByZXZCbG9jayA9IGJsb2NrT3BzLmdldFByZXZpb3VzQmxvY2soYmxvY2suaWQpOwogICAgICAgIGlmIChwcmV2QmxvY2spIHsKICAgICAgICAgIGJsb2NrT3BzLnJlbW92ZUJsb2NrKGJsb2NrLmlkKTsKICAgICAgICAgIGlmIChwcmV2QmxvY2sudHlwZSAhPT0gImRpdmlkZXIiKSB7CiAgICAgICAgICAgIGF3YWl0IGJsb2NrT3BzLmZvY3VzQmxvY2socHJldkJsb2NrLmlkLCAiZW5kIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIC8qKgogICAqIEhhbmRsZXMgRGVsZXRlIGtleQogICAqLwogIGFzeW5jIGhhbmRsZURlbGV0ZShlMTEsIGJsb2NrKSB7CiAgICBjb25zdCBibG9ja09wcyA9IHRoaXMuY29tcG9uZW50LmJsb2NrT3BlcmF0aW9uczsKICAgIGNvbnN0IG5vbkVkaXRhYmxlVHlwZXMgPSBbImRpdmlkZXIiLCAiaW1hZ2UiLCAieW91dHViZSIsICJhdHRhY2htZW50Il07CiAgICBpZiAobm9uRWRpdGFibGVUeXBlcy5pbmNsdWRlcyhibG9jay50eXBlKSkgewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgaWYgKHRoaXMuY29tcG9uZW50LmJsb2Nrcy5sZW5ndGggPT09IDEpIHsKICAgICAgICB0aGlzLmNvbXBvbmVudC5zYXZlVG9IaXN0b3J5KGZhbHNlKTsKICAgICAgICBibG9ja09wcy5yZW1vdmVCbG9jayhibG9jay5pZCk7CiAgICAgICAgY29uc3QgbmV3QmxvY2sgPSBibG9ja09wcy5jcmVhdGVCbG9jaygicGFyYWdyYXBoIiwgIiIpOwogICAgICAgIHRoaXMuY29tcG9uZW50LmJsb2NrcyA9IFtuZXdCbG9ja107CiAgICAgICAgdGhpcy5jb21wb25lbnQucmVuZGVyQmxvY2tzUHJvZ3JhbW1hdGljYWxseSgpOwogICAgICAgIGF3YWl0IGJsb2NrT3BzLmZvY3VzQmxvY2sobmV3QmxvY2suaWQsICJzdGFydCIpOwogICAgICAgIHRoaXMuY29tcG9uZW50LnVwZGF0ZVZhbHVlKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuY29tcG9uZW50LnNhdmVUb0hpc3RvcnkoZmFsc2UpOwogICAgICBjb25zdCBwcmV2QmxvY2sgPSBibG9ja09wcy5nZXRQcmV2aW91c0Jsb2NrKGJsb2NrLmlkKTsKICAgICAgY29uc3QgbmV4dEJsb2NrID0gYmxvY2tPcHMuZ2V0TmV4dEJsb2NrKGJsb2NrLmlkKTsKICAgICAgYmxvY2tPcHMucmVtb3ZlQmxvY2soYmxvY2suaWQpOwogICAgICBjb25zdCBub25FZGl0YWJsZVR5cGVzMiA9IFsiZGl2aWRlciIsICJpbWFnZSIsICJ5b3V0dWJlIiwgImF0dGFjaG1lbnQiXTsKICAgICAgaWYgKG5leHRCbG9jayAmJiAhbm9uRWRpdGFibGVUeXBlczIuaW5jbHVkZXMobmV4dEJsb2NrLnR5cGUpKSB7CiAgICAgICAgYXdhaXQgYmxvY2tPcHMuZm9jdXNCbG9jayhuZXh0QmxvY2suaWQsICJzdGFydCIpOwogICAgICB9IGVsc2UgaWYgKHByZXZCbG9jayAmJiAhbm9uRWRpdGFibGVUeXBlczIuaW5jbHVkZXMocHJldkJsb2NrLnR5cGUpKSB7CiAgICAgICAgYXdhaXQgYmxvY2tPcHMuZm9jdXNCbG9jayhwcmV2QmxvY2suaWQsICJlbmQiKTsKICAgICAgfSBlbHNlIGlmIChuZXh0QmxvY2spIHsKICAgICAgICBhd2FpdCBibG9ja09wcy5mb2N1c0Jsb2NrKG5leHRCbG9jay5pZCk7CiAgICAgIH0gZWxzZSBpZiAocHJldkJsb2NrKSB7CiAgICAgICAgYXdhaXQgYmxvY2tPcHMuZm9jdXNCbG9jayhwcmV2QmxvY2suaWQpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGJsb2NrV3JhcHBlciA9IHRoaXMuY29tcG9uZW50LnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke2Jsb2NrLmlkfSJdYCk7CiAgICBjb25zdCBibG9ja0NvbXBvbmVudCA9IGJsb2NrV3JhcHBlcj8ucXVlcnlTZWxlY3RvcigiZGVlcy13eXNpd3lnLWJsb2NrIik7CiAgICBpZiAoIWJsb2NrQ29tcG9uZW50IHx8ICFibG9ja0NvbXBvbmVudC5zaGFkb3dSb290KQogICAgICByZXR1cm47CiAgICBjb25zdCB0YXJnZXQgPSBibG9jay50eXBlID09PSAiY29kZSIgPyBibG9ja0NvbXBvbmVudC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5jb2RlLWVkaXRvciIpIDogYmxvY2tDb21wb25lbnQuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuYmxvY2siKTsKICAgIGlmICghdGFyZ2V0KQogICAgICByZXR1cm47CiAgICBjb25zdCBwYXJlbnRDb21wb25lbnQgPSBibG9ja0NvbXBvbmVudC5jbG9zZXN0KCJkZWVzLWlucHV0LXd5c2l3eWciKTsKICAgIGNvbnN0IHNoYWRvd1Jvb3RzID0gW107CiAgICBpZiAocGFyZW50Q29tcG9uZW50Py5zaGFkb3dSb290KQogICAgICBzaGFkb3dSb290cy5wdXNoKHBhcmVudENvbXBvbmVudC5zaGFkb3dSb290KTsKICAgIHNoYWRvd1Jvb3RzLnB1c2goYmxvY2tDb21wb25lbnQuc2hhZG93Um9vdCk7CiAgICBjb25zdCBjdXJzb3JQb3MgPSBXeXNpd3lnU2VsZWN0aW9uLmdldEN1cnNvclBvc2l0aW9uSW5FbGVtZW50KHRhcmdldCwgLi4uc2hhZG93Um9vdHMpOwogICAgY29uc3QgdGV4dExlbmd0aCA9IHRhcmdldC50ZXh0Q29udGVudD8ubGVuZ3RoIHx8IDA7CiAgICBpZiAoY3Vyc29yUG9zID09PSB0ZXh0TGVuZ3RoKSB7CiAgICAgIGNvbnN0IG5leHRCbG9jayA9IGJsb2NrT3BzLmdldE5leHRCbG9jayhibG9jay5pZCk7CiAgICAgIGNvbnN0IG5vbkVkaXRhYmxlVHlwZXMyID0gWyJkaXZpZGVyIiwgImltYWdlIiwgInlvdXR1YmUiLCAiYXR0YWNobWVudCJdOwogICAgICBpZiAobmV4dEJsb2NrICYmIG5vbkVkaXRhYmxlVHlwZXMyLmluY2x1ZGVzKG5leHRCbG9jay50eXBlKSkgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGF3YWl0IGJsb2NrT3BzLmZvY3VzQmxvY2sobmV4dEJsb2NrLmlkKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICB9CiAgLyoqCiAgICogSGFuZGxlcyBBcnJvd1VwIGtleSAtIG5hdmlnYXRlIHRvIHByZXZpb3VzIGJsb2NrIGlmIGF0IGJlZ2lubmluZyBvciBmaXJzdCBsaW5lCiAgICovCiAgYXN5bmMgaGFuZGxlQXJyb3dVcChlMTEsIGJsb2NrKSB7CiAgICBjb25zdCBub25FZGl0YWJsZVR5cGVzID0gWyJkaXZpZGVyIiwgImltYWdlIiwgInlvdXR1YmUiLCAiYXR0YWNobWVudCJdOwogICAgaWYgKG5vbkVkaXRhYmxlVHlwZXMuaW5jbHVkZXMoYmxvY2sudHlwZSkpIHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnN0IGJsb2NrT3BzID0gdGhpcy5jb21wb25lbnQuYmxvY2tPcGVyYXRpb25zOwogICAgICBjb25zdCBwcmV2QmxvY2sgPSBibG9ja09wcy5nZXRQcmV2aW91c0Jsb2NrKGJsb2NrLmlkKTsKICAgICAgaWYgKHByZXZCbG9jaykgewogICAgICAgIGF3YWl0IGJsb2NrT3BzLmZvY3VzQmxvY2socHJldkJsb2NrLmlkLCBub25FZGl0YWJsZVR5cGVzLmluY2x1ZGVzKHByZXZCbG9jay50eXBlKSA/IHZvaWQgMCA6ICJlbmQiKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBibG9ja1dyYXBwZXIgPSB0aGlzLmNvbXBvbmVudC5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKGBbZGF0YS1ibG9jay1pZD0iJHtibG9jay5pZH0iXWApOwogICAgY29uc3QgYmxvY2tDb21wb25lbnQgPSBibG9ja1dyYXBwZXI/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgaWYgKCFibG9ja0NvbXBvbmVudCB8fCAhYmxvY2tDb21wb25lbnQuc2hhZG93Um9vdCkKICAgICAgcmV0dXJuOwogICAgY29uc3QgdGFyZ2V0ID0gYmxvY2sudHlwZSA9PT0gImNvZGUiID8gYmxvY2tDb21wb25lbnQuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuY29kZS1lZGl0b3IiKSA6IGJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmJsb2NrIik7CiAgICBpZiAoIXRhcmdldCkKICAgICAgcmV0dXJuOwogICAgY29uc3QgcGFyZW50Q29tcG9uZW50ID0gYmxvY2tDb21wb25lbnQuY2xvc2VzdCgiZGVlcy1pbnB1dC13eXNpd3lnIik7CiAgICBjb25zdCBzaGFkb3dSb290cyA9IFtdOwogICAgaWYgKHBhcmVudENvbXBvbmVudD8uc2hhZG93Um9vdCkKICAgICAgc2hhZG93Um9vdHMucHVzaChwYXJlbnRDb21wb25lbnQuc2hhZG93Um9vdCk7CiAgICBzaGFkb3dSb290cy5wdXNoKGJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QpOwogICAgY29uc3Qgc2VsZWN0aW9uSW5mbyA9IFd5c2l3eWdTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uSW5mbyguLi5zaGFkb3dSb290cyk7CiAgICBpZiAoIXNlbGVjdGlvbkluZm8gfHwgIXNlbGVjdGlvbkluZm8uY29sbGFwc2VkKQogICAgICByZXR1cm47CiAgICBpZiAodGhpcy5pc09uRmlyc3RMaW5lKHNlbGVjdGlvbkluZm8sIHRhcmdldCwgLi4uc2hhZG93Um9vdHMpKSB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb25zdCBibG9ja09wcyA9IHRoaXMuY29tcG9uZW50LmJsb2NrT3BlcmF0aW9uczsKICAgICAgY29uc3QgcHJldkJsb2NrID0gYmxvY2tPcHMuZ2V0UHJldmlvdXNCbG9jayhibG9jay5pZCk7CiAgICAgIGlmIChwcmV2QmxvY2spIHsKICAgICAgICBjb25zdCBub25FZGl0YWJsZVR5cGVzMiA9IFsiZGl2aWRlciIsICJpbWFnZSIsICJ5b3V0dWJlIiwgImF0dGFjaG1lbnQiXTsKICAgICAgICBhd2FpdCBibG9ja09wcy5mb2N1c0Jsb2NrKHByZXZCbG9jay5pZCwgbm9uRWRpdGFibGVUeXBlczIuaW5jbHVkZXMocHJldkJsb2NrLnR5cGUpID8gdm9pZCAwIDogImVuZCIpOwogICAgICB9CiAgICB9CiAgfQogIC8qKgogICAqIEhhbmRsZXMgQXJyb3dEb3duIGtleSAtIG5hdmlnYXRlIHRvIG5leHQgYmxvY2sgaWYgYXQgZW5kIG9yIGxhc3QgbGluZQogICAqLwogIGFzeW5jIGhhbmRsZUFycm93RG93bihlMTEsIGJsb2NrKSB7CiAgICBjb25zdCBub25FZGl0YWJsZVR5cGVzID0gWyJkaXZpZGVyIiwgImltYWdlIiwgInlvdXR1YmUiLCAiYXR0YWNobWVudCJdOwogICAgaWYgKG5vbkVkaXRhYmxlVHlwZXMuaW5jbHVkZXMoYmxvY2sudHlwZSkpIHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnN0IGJsb2NrT3BzID0gdGhpcy5jb21wb25lbnQuYmxvY2tPcGVyYXRpb25zOwogICAgICBjb25zdCBuZXh0QmxvY2sgPSBibG9ja09wcy5nZXROZXh0QmxvY2soYmxvY2suaWQpOwogICAgICBpZiAobmV4dEJsb2NrKSB7CiAgICAgICAgY29uc3Qgbm9uRWRpdGFibGVUeXBlczIgPSBbImRpdmlkZXIiLCAiaW1hZ2UiLCAieW91dHViZSIsICJhdHRhY2htZW50Il07CiAgICAgICAgYXdhaXQgYmxvY2tPcHMuZm9jdXNCbG9jayhuZXh0QmxvY2suaWQsIG5vbkVkaXRhYmxlVHlwZXMyLmluY2x1ZGVzKG5leHRCbG9jay50eXBlKSA/IHZvaWQgMCA6ICJzdGFydCIpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGJsb2NrV3JhcHBlciA9IHRoaXMuY29tcG9uZW50LnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke2Jsb2NrLmlkfSJdYCk7CiAgICBjb25zdCBibG9ja0NvbXBvbmVudCA9IGJsb2NrV3JhcHBlcj8ucXVlcnlTZWxlY3RvcigiZGVlcy13eXNpd3lnLWJsb2NrIik7CiAgICBpZiAoIWJsb2NrQ29tcG9uZW50IHx8ICFibG9ja0NvbXBvbmVudC5zaGFkb3dSb290KQogICAgICByZXR1cm47CiAgICBjb25zdCB0YXJnZXQgPSBibG9jay50eXBlID09PSAiY29kZSIgPyBibG9ja0NvbXBvbmVudC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5jb2RlLWVkaXRvciIpIDogYmxvY2tDb21wb25lbnQuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuYmxvY2siKTsKICAgIGlmICghdGFyZ2V0KQogICAgICByZXR1cm47CiAgICBjb25zdCBwYXJlbnRDb21wb25lbnQgPSBibG9ja0NvbXBvbmVudC5jbG9zZXN0KCJkZWVzLWlucHV0LXd5c2l3eWciKTsKICAgIGNvbnN0IHNoYWRvd1Jvb3RzID0gW107CiAgICBpZiAocGFyZW50Q29tcG9uZW50Py5zaGFkb3dSb290KQogICAgICBzaGFkb3dSb290cy5wdXNoKHBhcmVudENvbXBvbmVudC5zaGFkb3dSb290KTsKICAgIHNoYWRvd1Jvb3RzLnB1c2goYmxvY2tDb21wb25lbnQuc2hhZG93Um9vdCk7CiAgICBjb25zdCBzZWxlY3Rpb25JbmZvID0gV3lzaXd5Z1NlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvKC4uLnNoYWRvd1Jvb3RzKTsKICAgIGlmICghc2VsZWN0aW9uSW5mbyB8fCAhc2VsZWN0aW9uSW5mby5jb2xsYXBzZWQpCiAgICAgIHJldHVybjsKICAgIGlmICh0aGlzLmlzT25MYXN0TGluZShzZWxlY3Rpb25JbmZvLCB0YXJnZXQsIC4uLnNoYWRvd1Jvb3RzKSkgewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgY29uc3QgYmxvY2tPcHMgPSB0aGlzLmNvbXBvbmVudC5ibG9ja09wZXJhdGlvbnM7CiAgICAgIGNvbnN0IG5leHRCbG9jayA9IGJsb2NrT3BzLmdldE5leHRCbG9jayhibG9jay5pZCk7CiAgICAgIGlmIChuZXh0QmxvY2spIHsKICAgICAgICBjb25zdCBub25FZGl0YWJsZVR5cGVzMiA9IFsiZGl2aWRlciIsICJpbWFnZSIsICJ5b3V0dWJlIiwgImF0dGFjaG1lbnQiXTsKICAgICAgICBhd2FpdCBibG9ja09wcy5mb2N1c0Jsb2NrKG5leHRCbG9jay5pZCwgbm9uRWRpdGFibGVUeXBlczIuaW5jbHVkZXMobmV4dEJsb2NrLnR5cGUpID8gdm9pZCAwIDogInN0YXJ0Iik7CiAgICAgIH0KICAgIH0KICB9CiAgLyoqCiAgICogSGVscGVyIHRvIGdldCB0aGUgbGFzdCB0ZXh0IG5vZGUgaW4gYW4gZWxlbWVudAogICAqLwogIGdldExhc3RUZXh0Tm9kZShlbGVtZW50NCkgewogICAgaWYgKGVsZW1lbnQ0Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICByZXR1cm4gZWxlbWVudDQ7CiAgICB9CiAgICBmb3IgKGxldCBpMTEgPSBlbGVtZW50NC5jaGlsZE5vZGVzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgICBjb25zdCBsYXN0VGV4dCA9IHRoaXMuZ2V0TGFzdFRleHROb2RlKGVsZW1lbnQ0LmNoaWxkTm9kZXNbaTExXSk7CiAgICAgIGlmIChsYXN0VGV4dCkKICAgICAgICByZXR1cm4gbGFzdFRleHQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgLyoqCiAgICogSGFuZGxlcyBBcnJvd0xlZnQga2V5IC0gbmF2aWdhdGUgdG8gcHJldmlvdXMgYmxvY2sgaWYgYXQgYmVnaW5uaW5nCiAgICovCiAgYXN5bmMgaGFuZGxlQXJyb3dMZWZ0KGUxMSwgYmxvY2spIHsKICAgIGNvbnN0IG5vbkVkaXRhYmxlVHlwZXMgPSBbImRpdmlkZXIiLCAiaW1hZ2UiLCAieW91dHViZSIsICJhdHRhY2htZW50Il07CiAgICBpZiAobm9uRWRpdGFibGVUeXBlcy5pbmNsdWRlcyhibG9jay50eXBlKSkgewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgY29uc3QgYmxvY2tPcHMgPSB0aGlzLmNvbXBvbmVudC5ibG9ja09wZXJhdGlvbnM7CiAgICAgIGNvbnN0IHByZXZCbG9jayA9IGJsb2NrT3BzLmdldFByZXZpb3VzQmxvY2soYmxvY2suaWQpOwogICAgICBpZiAocHJldkJsb2NrKSB7CiAgICAgICAgY29uc3Qgbm9uRWRpdGFibGVUeXBlczIgPSBbImRpdmlkZXIiLCAiaW1hZ2UiLCAieW91dHViZSIsICJhdHRhY2htZW50Il07CiAgICAgICAgYXdhaXQgYmxvY2tPcHMuZm9jdXNCbG9jayhwcmV2QmxvY2suaWQsIG5vbkVkaXRhYmxlVHlwZXMyLmluY2x1ZGVzKHByZXZCbG9jay50eXBlKSA/IHZvaWQgMCA6ICJlbmQiKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBibG9ja1dyYXBwZXIgPSB0aGlzLmNvbXBvbmVudC5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKGBbZGF0YS1ibG9jay1pZD0iJHtibG9jay5pZH0iXWApOwogICAgY29uc3QgYmxvY2tDb21wb25lbnQgPSBibG9ja1dyYXBwZXI/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgaWYgKCFibG9ja0NvbXBvbmVudCB8fCAhYmxvY2tDb21wb25lbnQuc2hhZG93Um9vdCkKICAgICAgcmV0dXJuOwogICAgY29uc3QgdGFyZ2V0ID0gYmxvY2sudHlwZSA9PT0gImNvZGUiID8gYmxvY2tDb21wb25lbnQuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuY29kZS1lZGl0b3IiKSA6IGJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmJsb2NrIik7CiAgICBpZiAoIXRhcmdldCkKICAgICAgcmV0dXJuOwogICAgY29uc3QgcGFyZW50Q29tcG9uZW50ID0gYmxvY2tDb21wb25lbnQuY2xvc2VzdCgiZGVlcy1pbnB1dC13eXNpd3lnIik7CiAgICBjb25zdCBzaGFkb3dSb290cyA9IFtdOwogICAgaWYgKHBhcmVudENvbXBvbmVudD8uc2hhZG93Um9vdCkKICAgICAgc2hhZG93Um9vdHMucHVzaChwYXJlbnRDb21wb25lbnQuc2hhZG93Um9vdCk7CiAgICBzaGFkb3dSb290cy5wdXNoKGJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QpOwogICAgY29uc3Qgc2VsZWN0aW9uSW5mbyA9IFd5c2l3eWdTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uSW5mbyguLi5zaGFkb3dSb290cyk7CiAgICBpZiAoIXNlbGVjdGlvbkluZm8gfHwgIXNlbGVjdGlvbkluZm8uY29sbGFwc2VkKQogICAgICByZXR1cm47CiAgICBjb25zdCBjdXJzb3JQb3MgPSBXeXNpd3lnU2VsZWN0aW9uLmdldEN1cnNvclBvc2l0aW9uSW5FbGVtZW50KHRhcmdldCwgLi4uc2hhZG93Um9vdHMpOwogICAgaWYgKGN1cnNvclBvcyA9PT0gMCkgewogICAgICBjb25zdCBibG9ja09wcyA9IHRoaXMuY29tcG9uZW50LmJsb2NrT3BlcmF0aW9uczsKICAgICAgY29uc3QgcHJldkJsb2NrID0gYmxvY2tPcHMuZ2V0UHJldmlvdXNCbG9jayhibG9jay5pZCk7CiAgICAgIGlmIChwcmV2QmxvY2spIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICBjb25zdCBub25FZGl0YWJsZVR5cGVzMiA9IFsiZGl2aWRlciIsICJpbWFnZSIsICJ5b3V0dWJlIiwgImF0dGFjaG1lbnQiXTsKICAgICAgICBjb25zdCBwb3NpdGlvbjMgPSBub25FZGl0YWJsZVR5cGVzMi5pbmNsdWRlcyhwcmV2QmxvY2sudHlwZSkgPyB2b2lkIDAgOiAiZW5kIjsKICAgICAgICBhd2FpdCBibG9ja09wcy5mb2N1c0Jsb2NrKHByZXZCbG9jay5pZCwgcG9zaXRpb24zKTsKICAgICAgfQogICAgfQogIH0KICAvKioKICAgKiBIYW5kbGVzIEFycm93UmlnaHQga2V5IC0gbmF2aWdhdGUgdG8gbmV4dCBibG9jayBpZiBhdCBlbmQKICAgKi8KICBhc3luYyBoYW5kbGVBcnJvd1JpZ2h0KGUxMSwgYmxvY2spIHsKICAgIGNvbnN0IG5vbkVkaXRhYmxlVHlwZXMgPSBbImRpdmlkZXIiLCAiaW1hZ2UiLCAieW91dHViZSIsICJhdHRhY2htZW50Il07CiAgICBpZiAobm9uRWRpdGFibGVUeXBlcy5pbmNsdWRlcyhibG9jay50eXBlKSkgewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgY29uc3QgYmxvY2tPcHMgPSB0aGlzLmNvbXBvbmVudC5ibG9ja09wZXJhdGlvbnM7CiAgICAgIGNvbnN0IG5leHRCbG9jayA9IGJsb2NrT3BzLmdldE5leHRCbG9jayhibG9jay5pZCk7CiAgICAgIGlmIChuZXh0QmxvY2spIHsKICAgICAgICBjb25zdCBub25FZGl0YWJsZVR5cGVzMiA9IFsiZGl2aWRlciIsICJpbWFnZSIsICJ5b3V0dWJlIiwgImF0dGFjaG1lbnQiXTsKICAgICAgICBhd2FpdCBibG9ja09wcy5mb2N1c0Jsb2NrKG5leHRCbG9jay5pZCwgbm9uRWRpdGFibGVUeXBlczIuaW5jbHVkZXMobmV4dEJsb2NrLnR5cGUpID8gdm9pZCAwIDogInN0YXJ0Iik7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgYmxvY2tXcmFwcGVyID0gdGhpcy5jb21wb25lbnQuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihgW2RhdGEtYmxvY2staWQ9IiR7YmxvY2suaWR9Il1gKTsKICAgIGNvbnN0IGJsb2NrQ29tcG9uZW50ID0gYmxvY2tXcmFwcGVyPy5xdWVyeVNlbGVjdG9yKCJkZWVzLXd5c2l3eWctYmxvY2siKTsKICAgIGlmICghYmxvY2tDb21wb25lbnQgfHwgIWJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IHRhcmdldCA9IGJsb2NrLnR5cGUgPT09ICJjb2RlIiA/IGJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmNvZGUtZWRpdG9yIikgOiBibG9ja0NvbXBvbmVudC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jayIpOwogICAgaWYgKCF0YXJnZXQpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IHBhcmVudENvbXBvbmVudCA9IGJsb2NrQ29tcG9uZW50LmNsb3Nlc3QoImRlZXMtaW5wdXQtd3lzaXd5ZyIpOwogICAgY29uc3Qgc2hhZG93Um9vdHMgPSBbXTsKICAgIGlmIChwYXJlbnRDb21wb25lbnQ/LnNoYWRvd1Jvb3QpCiAgICAgIHNoYWRvd1Jvb3RzLnB1c2gocGFyZW50Q29tcG9uZW50LnNoYWRvd1Jvb3QpOwogICAgc2hhZG93Um9vdHMucHVzaChibG9ja0NvbXBvbmVudC5zaGFkb3dSb290KTsKICAgIGNvbnN0IHNlbGVjdGlvbkluZm8gPSBXeXNpd3lnU2VsZWN0aW9uLmdldFNlbGVjdGlvbkluZm8oLi4uc2hhZG93Um9vdHMpOwogICAgaWYgKCFzZWxlY3Rpb25JbmZvIHx8ICFzZWxlY3Rpb25JbmZvLmNvbGxhcHNlZCkKICAgICAgcmV0dXJuOwogICAgY29uc3QgY3Vyc29yUG9zID0gV3lzaXd5Z1NlbGVjdGlvbi5nZXRDdXJzb3JQb3NpdGlvbkluRWxlbWVudCh0YXJnZXQsIC4uLnNoYWRvd1Jvb3RzKTsKICAgIGNvbnN0IHRleHRMZW5ndGggPSB0YXJnZXQudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwOwogICAgaWYgKGN1cnNvclBvcyA9PT0gdGV4dExlbmd0aCkgewogICAgICBjb25zdCBibG9ja09wcyA9IHRoaXMuY29tcG9uZW50LmJsb2NrT3BlcmF0aW9uczsKICAgICAgY29uc3QgbmV4dEJsb2NrID0gYmxvY2tPcHMuZ2V0TmV4dEJsb2NrKGJsb2NrLmlkKTsKICAgICAgaWYgKG5leHRCbG9jaykgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNvbnN0IG5vbkVkaXRhYmxlVHlwZXMyID0gWyJkaXZpZGVyIiwgImltYWdlIiwgInlvdXR1YmUiLCAiYXR0YWNobWVudCJdOwogICAgICAgIGF3YWl0IGJsb2NrT3BzLmZvY3VzQmxvY2sobmV4dEJsb2NrLmlkLCBub25FZGl0YWJsZVR5cGVzMi5pbmNsdWRlcyhuZXh0QmxvY2sudHlwZSkgPyB2b2lkIDAgOiAic3RhcnQiKTsKICAgICAgfQogICAgfQogIH0KICAvKioKICAgKiBIYW5kbGVzIHNsYXNoIG1lbnUga2V5Ym9hcmQgbmF2aWdhdGlvbgogICAqIE5vdGU6IFRoaXMgaXMgbm93IGhhbmRsZWQgYnkgdGhlIGNvbXBvbmVudCBkaXJlY3RseQogICAqLwogIC8qKgogICAqIENoZWNrIGlmIGN1cnNvciBpcyBvbiB0aGUgZmlyc3QgbGluZSBvZiBhIGJsb2NrCiAgICovCiAgaXNPbkZpcnN0TGluZShzZWxlY3Rpb25JbmZvLCB0YXJnZXQsIC4uLnNoYWRvd1Jvb3RzKSB7CiAgICB0cnkgewogICAgICBjb25zdCByYW5nZTIgPSBXeXNpd3lnU2VsZWN0aW9uLmNyZWF0ZVJhbmdlRnJvbUluZm8oc2VsZWN0aW9uSW5mbyk7CiAgICAgIGNvbnN0IHJlY3QgPSByYW5nZTIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGxldCBjb250YWluZXIgPSByYW5nZTIuY29tbW9uQW5jZXN0b3JDb250YWluZXI7CiAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7CiAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudEVsZW1lbnQ7CiAgICAgIH0KICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgaXNOZWFyVG9wID0gcmVjdC50b3AgLSBjb250YWluZXJSZWN0LnRvcCA8IDU7CiAgICAgIGlmIChjb250YWluZXIudGV4dENvbnRlbnQgJiYgIWNvbnRhaW5lci50ZXh0Q29udGVudC5pbmNsdWRlcygiXG4iKSkgewogICAgICAgIGNvbnN0IGN1cnNvclBvcyA9IFd5c2l3eWdTZWxlY3Rpb24uZ2V0Q3Vyc29yUG9zaXRpb25JbkVsZW1lbnQoY29udGFpbmVyLCAuLi5zaGFkb3dSb290cyk7CiAgICAgICAgcmV0dXJuIGN1cnNvclBvcyA9PT0gMDsKICAgICAgfQogICAgICByZXR1cm4gaXNOZWFyVG9wOwogICAgfSBjYXRjaCAoZTExKSB7CiAgICAgIGNvbnNvbGUud2FybigiRXJyb3IgY2hlY2tpbmcgZmlyc3QgbGluZToiLCBlMTEpOwogICAgICBjb25zdCBjdXJzb3JQb3MgPSBzZWxlY3Rpb25JbmZvLnN0YXJ0T2Zmc2V0OwogICAgICByZXR1cm4gY3Vyc29yUG9zID09PSAwOwogICAgfQogIH0KICAvKioKICAgKiBDaGVjayBpZiBjdXJzb3IgaXMgb24gdGhlIGxhc3QgbGluZSBvZiBhIGJsb2NrCiAgICovCiAgaXNPbkxhc3RMaW5lKHNlbGVjdGlvbkluZm8sIHRhcmdldCwgLi4uc2hhZG93Um9vdHMpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHJhbmdlMiA9IFd5c2l3eWdTZWxlY3Rpb24uY3JlYXRlUmFuZ2VGcm9tSW5mbyhzZWxlY3Rpb25JbmZvKTsKICAgICAgY29uc3QgcmVjdCA9IHJhbmdlMi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgbGV0IGNvbnRhaW5lciA9IHJhbmdlMi5jb21tb25BbmNlc3RvckNvbnRhaW5lcjsKICAgICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHsKICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50RWxlbWVudDsKICAgICAgfQogICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBjb25zdCBpc05lYXJCb3R0b20gPSBjb250YWluZXJSZWN0LmJvdHRvbSAtIHJlY3QuYm90dG9tIDwgNTsKICAgICAgaWYgKGNvbnRhaW5lci50ZXh0Q29udGVudCAmJiAhY29udGFpbmVyLnRleHRDb250ZW50LmluY2x1ZGVzKCJcbiIpKSB7CiAgICAgICAgY29uc3QgdGV4dExlbmd0aCA9IHRhcmdldC50ZXh0Q29udGVudD8ubGVuZ3RoIHx8IDA7CiAgICAgICAgY29uc3QgY3Vyc29yUG9zID0gV3lzaXd5Z1NlbGVjdGlvbi5nZXRDdXJzb3JQb3NpdGlvbkluRWxlbWVudCh0YXJnZXQsIC4uLnNoYWRvd1Jvb3RzKTsKICAgICAgICByZXR1cm4gY3Vyc29yUG9zID09PSB0ZXh0TGVuZ3RoOwogICAgICB9CiAgICAgIHJldHVybiBpc05lYXJCb3R0b207CiAgICB9IGNhdGNoIChlMTEpIHsKICAgICAgY29uc29sZS53YXJuKCJFcnJvciBjaGVja2luZyBsYXN0IGxpbmU6IiwgZTExKTsKICAgICAgY29uc3QgdGV4dExlbmd0aCA9IHRhcmdldC50ZXh0Q29udGVudD8ubGVuZ3RoIHx8IDA7CiAgICAgIGNvbnN0IGN1cnNvclBvcyA9IFd5c2l3eWdTZWxlY3Rpb24uZ2V0Q3Vyc29yUG9zaXRpb25JbkVsZW1lbnQodGFyZ2V0LCAuLi5zaGFkb3dSb290cyk7CiAgICAgIHJldHVybiBjdXJzb3JQb3MgPT09IHRleHRMZW5ndGg7CiAgICB9CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtd3lzaXd5Zy93eXNpd3lnLmRyYWdkcm9waGFuZGxlci5qcwp2YXIgV3lzaXd5Z0RyYWdEcm9wSGFuZGxlciA9IGNsYXNzIHsKICBjb21wb25lbnQ7CiAgZHJhZ2dlZEJsb2NrSWQgPSBudWxsOwogIGRyYWdPdmVyQmxvY2tJZCA9IG51bGw7CiAgZHJhZ092ZXJQb3NpdGlvbiA9IG51bGw7CiAgZHJvcEluZGljYXRvciA9IG51bGw7CiAgaW5pdGlhbE1vdXNlWSA9IDA7CiAgaW5pdGlhbEJsb2NrWSA9IDA7CiAgZHJhZ2dlZEJsb2NrRWxlbWVudCA9IG51bGw7CiAgZHJhZ2dlZEJsb2NrSGVpZ2h0ID0gMDsKICBkcmFnZ2VkQmxvY2tDb250ZW50SGVpZ2h0ID0gMDsKICBkcmFnZ2VkQmxvY2tNYXJnaW5Ub3AgPSAwOwogIGxhc3RVcGRhdGVUaW1lID0gMDsKICB1cGRhdGVUaHJvdHRsZSA9IDgwOwogIC8vIG1pbGxpc2Vjb25kcwogIGNvbnN0cnVjdG9yKGNvbXBvbmVudCkgewogICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7CiAgfQogIC8qKgogICAqIEdldHMgdGhlIGN1cnJlbnQgZHJhZyBzdGF0ZQogICAqLwogIGdldCBkcmFnU3RhdGUoKSB7CiAgICByZXR1cm4gewogICAgICBkcmFnZ2VkQmxvY2tJZDogdGhpcy5kcmFnZ2VkQmxvY2tJZCwKICAgICAgZHJhZ092ZXJCbG9ja0lkOiB0aGlzLmRyYWdPdmVyQmxvY2tJZCwKICAgICAgZHJhZ092ZXJQb3NpdGlvbjogdGhpcy5kcmFnT3ZlclBvc2l0aW9uCiAgICB9OwogIH0KICAvKioKICAgKiBIYW5kbGVzIGRyYWcgc3RhcnQKICAgKi8KICBoYW5kbGVEcmFnU3RhcnQoZTExLCBibG9jaykgewogICAgaWYgKCFlMTEuZGF0YVRyYW5zZmVyKQogICAgICByZXR1cm47CiAgICB0aGlzLmRyYWdnZWRCbG9ja0lkID0gYmxvY2suaWQ7CiAgICBlMTEuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAibW92ZSI7CiAgICBlMTEuZGF0YVRyYW5zZmVyLnNldERhdGEoInRleHQvcGxhaW4iLCBibG9jay5pZCk7CiAgICBjb25zdCBlbXB0eUltZyA9IG5ldyBJbWFnZSgpOwogICAgZW1wdHlJbWcuc3JjID0gImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBSUFBQUFVRUJBQUFBQ3dBQUFBQUFRQUJBQUFDQWtRQkFEcz0iOwogICAgZTExLmRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UoZW1wdHlJbWcsIDAsIDApOwogICAgdGhpcy5pbml0aWFsTW91c2VZID0gZTExLmNsaWVudFk7CiAgICB0aGlzLmRyYWdnZWRCbG9ja0VsZW1lbnQgPSB0aGlzLmNvbXBvbmVudC5lZGl0b3JDb250ZW50UmVmLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke2Jsb2NrLmlkfSJdYCk7CiAgICBpZiAodGhpcy5kcmFnZ2VkQmxvY2tFbGVtZW50KSB7CiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmRyYWdnZWRCbG9ja0VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIHRoaXMuaW5pdGlhbEJsb2NrWSA9IHJlY3QudG9wOwogICAgICBjb25zdCBpbm5lckJsb2NrID0gdGhpcy5kcmFnZ2VkQmxvY2tFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jayIpOwogICAgICBpZiAoaW5uZXJCbG9jaykgewogICAgICAgIGNvbnN0IGlubmVyUmVjdCA9IGlubmVyQmxvY2suZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGlubmVyQmxvY2spOwogICAgICAgIHRoaXMuZHJhZ2dlZEJsb2NrTWFyZ2luVG9wID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5tYXJnaW5Ub3ApIHx8IDA7CiAgICAgICAgdGhpcy5kcmFnZ2VkQmxvY2tDb250ZW50SGVpZ2h0ID0gaW5uZXJSZWN0LmhlaWdodDsKICAgICAgfQogICAgICB0aGlzLmRyYWdnZWRCbG9ja0hlaWdodCA9IHJlY3QuaGVpZ2h0OwogICAgICBjb25zb2xlLmxvZygiRHJhZyBtZWFzdXJlbWVudHM6IiwgewogICAgICAgIHdyYXBwZXJIZWlnaHQ6IHJlY3QuaGVpZ2h0LAogICAgICAgIG1hcmdpblRvcDogdGhpcy5kcmFnZ2VkQmxvY2tNYXJnaW5Ub3AsCiAgICAgICAgZHJvcEluZGljYXRvckhlaWdodDogdGhpcy5kcmFnZ2VkQmxvY2tIZWlnaHQsCiAgICAgICAgY29udGVudEhlaWdodDogdGhpcy5kcmFnZ2VkQmxvY2tDb250ZW50SGVpZ2h0LAogICAgICAgIGJsb2NrSWQ6IGJsb2NrLmlkCiAgICAgIH0pOwogICAgICB0aGlzLmNyZWF0ZURyb3BJbmRpY2F0b3IoKTsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZHJhZ292ZXIiLCB0aGlzLmhhbmRsZUdsb2JhbERyYWdPdmVyKTsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZHJhZ2VuZCIsIHRoaXMuaGFuZGxlR2xvYmFsRHJhZ0VuZCk7CiAgICB9CiAgICB0aGlzLmNvbXBvbmVudC5kcmFnZ2VkQmxvY2tJZCA9IHRoaXMuZHJhZ2dlZEJsb2NrSWQ7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgaWYgKHRoaXMuZHJhZ2dlZEJsb2NrRWxlbWVudCkgewogICAgICAgIHRoaXMuZHJhZ2dlZEJsb2NrRWxlbWVudC5jbGFzc0xpc3QuYWRkKCJkcmFnZ2luZyIpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmNvbXBvbmVudC5lZGl0b3JDb250ZW50UmVmKSB7CiAgICAgICAgdGhpcy5jb21wb25lbnQuZWRpdG9yQ29udGVudFJlZi5jbGFzc0xpc3QuYWRkKCJkcmFnZ2luZyIpOwogICAgICB9CiAgICB9LCAxMCk7CiAgfQogIC8qKgogICAqIEhhbmRsZXMgZHJhZyBlbmQKICAgKi8KICBoYW5kbGVEcmFnRW5kKCkgewogICAgY29uc3QgYWxsQmxvY2tzID0gdGhpcy5jb21wb25lbnQuZWRpdG9yQ29udGVudFJlZi5xdWVyeVNlbGVjdG9yQWxsKCIuYmxvY2std3JhcHBlciIpOwogICAgYWxsQmxvY2tzLmZvckVhY2goKGJsb2NrKSA9PiB7CiAgICAgIGJsb2NrLmNsYXNzTGlzdC5yZW1vdmUoImRyYWdnaW5nIiwgIm1vdmUtdXAiLCAibW92ZS1kb3duIik7CiAgICAgIGJsb2NrLnN0eWxlLnJlbW92ZVByb3BlcnR5KCItLWRyYWctb2Zmc2V0Iik7CiAgICAgIGJsb2NrLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJ0cmFuc2Zvcm0iKTsKICAgIH0pOwogICAgaWYgKHRoaXMuY29tcG9uZW50LmVkaXRvckNvbnRlbnRSZWYpIHsKICAgICAgdGhpcy5jb21wb25lbnQuZWRpdG9yQ29udGVudFJlZi5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnZ2luZyIpOwogICAgfQogICAgdGhpcy5kcmFnZ2VkQmxvY2tJZCA9IG51bGw7CiAgICB0aGlzLmRyYWdPdmVyQmxvY2tJZCA9IG51bGw7CiAgICB0aGlzLmRyYWdPdmVyUG9zaXRpb24gPSBudWxsOwogICAgdGhpcy5kcmFnZ2VkQmxvY2tFbGVtZW50ID0gbnVsbDsKICAgIHRoaXMuZHJhZ2dlZEJsb2NrSGVpZ2h0ID0gMDsKICAgIHRoaXMuZHJhZ2dlZEJsb2NrQ29udGVudEhlaWdodCA9IDA7CiAgICB0aGlzLmRyYWdnZWRCbG9ja01hcmdpblRvcCA9IDA7CiAgICB0aGlzLmluaXRpYWxCbG9ja1kgPSAwOwogICAgdGhpcy5jb21wb25lbnQuZHJhZ2dlZEJsb2NrSWQgPSBudWxsOwogICAgdGhpcy5jb21wb25lbnQuZHJhZ092ZXJCbG9ja0lkID0gbnVsbDsKICAgIHRoaXMuY29tcG9uZW50LmRyYWdPdmVyUG9zaXRpb24gPSBudWxsOwogIH0KICAvKioKICAgKiBIYW5kbGVzIGRyYWcgb3ZlcgogICAqLwogIGhhbmRsZURyYWdPdmVyKGUxMSwgYmxvY2spIHsKICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgaWYgKCFlMTEuZGF0YVRyYW5zZmVyIHx8ICF0aGlzLmRyYWdnZWRCbG9ja0lkIHx8IHRoaXMuZHJhZ2dlZEJsb2NrSWQgPT09IGJsb2NrLmlkKQogICAgICByZXR1cm47CiAgICBlMTEuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAibW92ZSI7CiAgICBjb25zdCByZWN0ID0gZTExLmN1cnJlbnRUYXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICBjb25zdCBtaWRwb2ludCA9IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyAyOwogICAgdGhpcy5kcmFnT3ZlckJsb2NrSWQgPSBibG9jay5pZDsKICAgIHRoaXMuZHJhZ092ZXJQb3NpdGlvbiA9IGUxMS5jbGllbnRZIDwgbWlkcG9pbnQgPyAiYmVmb3JlIiA6ICJhZnRlciI7CiAgICB0aGlzLmNvbXBvbmVudC5kcmFnT3ZlckJsb2NrSWQgPSB0aGlzLmRyYWdPdmVyQmxvY2tJZDsKICAgIHRoaXMuY29tcG9uZW50LmRyYWdPdmVyUG9zaXRpb24gPSB0aGlzLmRyYWdPdmVyUG9zaXRpb247CiAgfQogIC8qKgogICAqIEhhbmRsZXMgZHJhZyBsZWF2ZQogICAqLwogIGhhbmRsZURyYWdMZWF2ZShibG9jaykgewogICAgaWYgKHRoaXMuZHJhZ092ZXJCbG9ja0lkID09PSBibG9jay5pZCkgewogICAgICB0aGlzLmRyYWdPdmVyQmxvY2tJZCA9IG51bGw7CiAgICAgIHRoaXMuZHJhZ092ZXJQb3NpdGlvbiA9IG51bGw7CiAgICAgIHRoaXMuY29tcG9uZW50LmRyYWdPdmVyQmxvY2tJZCA9IG51bGw7CiAgICAgIHRoaXMuY29tcG9uZW50LmRyYWdPdmVyUG9zaXRpb24gPSBudWxsOwogICAgfQogIH0KICAvKioKICAgKiBIYW5kbGVzIGRyb3AKICAgKi8KICBoYW5kbGVEcm9wKGUxMSwgdGFyZ2V0QmxvY2spIHsKICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgaWYgKCF0aGlzLmRyYWdnZWRCbG9ja0lkIHx8IHRoaXMuZHJhZ2dlZEJsb2NrSWQgPT09IHRhcmdldEJsb2NrLmlkKQogICAgICByZXR1cm47CiAgICB0aGlzLmNvbXBvbmVudC5oYW5kbGVEcm9wKGUxMSwgdGFyZ2V0QmxvY2spOwogIH0KICAvKioKICAgKiBDaGVja3MgaWYgYSBibG9jayBpcyBiZWluZyBkcmFnZ2VkCiAgICovCiAgaXNEcmFnZ2luZyhibG9ja0lkKSB7CiAgICByZXR1cm4gdGhpcy5kcmFnZ2VkQmxvY2tJZCA9PT0gYmxvY2tJZDsKICB9CiAgLyoqCiAgICogQ2hlY2tzIGlmIGEgYmxvY2sgaGFzIGRyYWcgb3ZlciBzdGF0ZQogICAqLwogIGlzRHJhZ092ZXIoYmxvY2tJZCkgewogICAgcmV0dXJuIHRoaXMuZHJhZ092ZXJCbG9ja0lkID09PSBibG9ja0lkOwogIH0KICAvKioKICAgKiBHZXRzIGRyYWcgb3ZlciBDU1MgY2xhc3NlcyBmb3IgYSBibG9jawogICAqLwogIGdldERyYWdPdmVyQ2xhc3NlcyhibG9ja0lkKSB7CiAgICBpZiAoIXRoaXMuaXNEcmFnT3ZlcihibG9ja0lkKSkKICAgICAgcmV0dXJuICIiOwogICAgcmV0dXJuIHRoaXMuZHJhZ092ZXJQb3NpdGlvbiA9PT0gImJlZm9yZSIgPyAiZHJhZy1vdmVyLWJlZm9yZSIgOiAiZHJhZy1vdmVyLWFmdGVyIjsKICB9CiAgLyoqCiAgICogQ3JlYXRlcyB0aGUgZHJvcCBpbmRpY2F0b3IgZWxlbWVudAogICAqLwogIGNyZWF0ZURyb3BJbmRpY2F0b3IoKSB7CiAgICB0aGlzLmRyb3BJbmRpY2F0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIHRoaXMuZHJvcEluZGljYXRvci5jbGFzc05hbWUgPSAiZHJvcC1pbmRpY2F0b3IiOwogICAgdGhpcy5kcm9wSW5kaWNhdG9yLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICB0aGlzLmNvbXBvbmVudC5lZGl0b3JDb250ZW50UmVmLmFwcGVuZENoaWxkKHRoaXMuZHJvcEluZGljYXRvcik7CiAgfQogIC8qKgogICAqIEhhbmRsZXMgZ2xvYmFsIGRyYWdvdmVyIHRvIHVwZGF0ZSBkcmFnZ2VkIGJsb2NrIHBvc2l0aW9uIGFuZCBtb3ZlIG90aGVyIGJsb2NrcwogICAqLwogIGhhbmRsZUdsb2JhbERyYWdPdmVyID0gKGUxMSkgPT4gewogICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICBpZiAoIXRoaXMuZHJhZ2dlZEJsb2NrRWxlbWVudCkKICAgICAgcmV0dXJuOwogICAgY29uc3QgZGVsdGFZID0gZTExLmNsaWVudFkgLSB0aGlzLmluaXRpYWxNb3VzZVk7CiAgICB0aGlzLmRyYWdnZWRCbG9ja0VsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHtkZWx0YVl9cHgpYDsKICAgIGNvbnN0IG5vdzIgPSBEYXRlLm5vdygpOwogICAgaWYgKG5vdzIgLSB0aGlzLmxhc3RVcGRhdGVUaW1lIDwgdGhpcy51cGRhdGVUaHJvdHRsZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLmxhc3RVcGRhdGVUaW1lID0gbm93MjsKICAgIHRoaXMudXBkYXRlQmxvY2tQb3NpdGlvbnMoZTExLmNsaWVudFkpOwogIH07CiAgLyoqCiAgICogVXBkYXRlcyBibG9jayBwb3NpdGlvbnMgYmFzZWQgb24gY3Vyc29yIHBvc2l0aW9uCiAgICovCiAgdXBkYXRlQmxvY2tQb3NpdGlvbnMobW91c2VZKSB7CiAgICBjb25zdCBibG9ja3MgPSBBcnJheS5mcm9tKHRoaXMuY29tcG9uZW50LmVkaXRvckNvbnRlbnRSZWYucXVlcnlTZWxlY3RvckFsbCgiLmJsb2NrLXdyYXBwZXIiKSk7CiAgICBjb25zdCBkcmFnZ2VkSW5kZXggPSBibG9ja3MuZmluZEluZGV4KChiNikgPT4gYjYuZ2V0QXR0cmlidXRlKCJkYXRhLWJsb2NrLWlkIikgPT09IHRoaXMuZHJhZ2dlZEJsb2NrSWQpOwogICAgaWYgKGRyYWdnZWRJbmRleCA9PT0gLTEpCiAgICAgIHJldHVybjsKICAgIGJsb2Nrcy5mb3JFYWNoKChibG9jaykgPT4gewogICAgICBpZiAoYmxvY2suZ2V0QXR0cmlidXRlKCJkYXRhLWJsb2NrLWlkIikgIT09IHRoaXMuZHJhZ2dlZEJsb2NrSWQpIHsKICAgICAgICBibG9jay5jbGFzc0xpc3QucmVtb3ZlKCJtb3ZlLXVwIiwgIm1vdmUtZG93biIpOwogICAgICAgIGJsb2NrLnN0eWxlLnJlbW92ZVByb3BlcnR5KCItLWRyYWctb2Zmc2V0Iik7CiAgICAgIH0KICAgIH0pOwogICAgbGV0IG5ld0luZGV4ID0gYmxvY2tzLmxlbmd0aDsKICAgIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IGJsb2Nrcy5sZW5ndGg7IGkxMSsrKSB7CiAgICAgIGlmIChpMTEgPT09IGRyYWdnZWRJbmRleCkKICAgICAgICBjb250aW51ZTsKICAgICAgY29uc3QgYmxvY2sgPSBibG9ja3NbaTExXTsKICAgICAgY29uc3QgcmVjdCA9IGJsb2NrLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBjb25zdCBibG9ja1RvcCA9IHJlY3QudG9wOwogICAgICBpZiAobW91c2VZIDwgYmxvY2tUb3AgKyByZWN0LmhlaWdodCAqIDAuNSkgewogICAgICAgIG5ld0luZGV4ID0gaTExOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBibG9ja3MubGVuZ3RoOyBpMTErKykgewogICAgICBpZiAoaTExID09PSBkcmFnZ2VkSW5kZXgpCiAgICAgICAgY29udGludWU7CiAgICAgIGNvbnN0IGJsb2NrID0gYmxvY2tzW2kxMV07CiAgICAgIGlmIChkcmFnZ2VkSW5kZXggPCBuZXdJbmRleCkgewogICAgICAgIGlmIChpMTEgPiBkcmFnZ2VkSW5kZXggJiYgaTExIDwgbmV3SW5kZXgpIHsKICAgICAgICAgIGJsb2NrLmNsYXNzTGlzdC5hZGQoIm1vdmUtdXAiKTsKICAgICAgICAgIGJsb2NrLnN0eWxlLnNldFByb3BlcnR5KCItLWRyYWctb2Zmc2V0IiwgYCR7dGhpcy5kcmFnZ2VkQmxvY2tIZWlnaHR9cHhgKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZHJhZ2dlZEluZGV4ID4gbmV3SW5kZXgpIHsKICAgICAgICBpZiAoaTExID49IG5ld0luZGV4ICYmIGkxMSA8IGRyYWdnZWRJbmRleCkgewogICAgICAgICAgYmxvY2suY2xhc3NMaXN0LmFkZCgibW92ZS1kb3duIik7CiAgICAgICAgICBibG9jay5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1kcmFnLW9mZnNldCIsIGAke3RoaXMuZHJhZ2dlZEJsb2NrSGVpZ2h0fXB4YCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aGlzLnVwZGF0ZURyb3BJbmRpY2F0b3IoYmxvY2tzLCBuZXdJbmRleCwgZHJhZ2dlZEluZGV4KTsKICB9CiAgLyoqCiAgICogVXBkYXRlcyB0aGUgZHJvcCBpbmRpY2F0b3IgcG9zaXRpb24KICAgKi8KICB1cGRhdGVEcm9wSW5kaWNhdG9yKGJsb2NrcywgdGFyZ2V0SW5kZXgsIGRyYWdnZWRJbmRleCkgewogICAgaWYgKCF0aGlzLmRyb3BJbmRpY2F0b3IgfHwgIXRoaXMuZHJhZ2dlZEJsb2NrRWxlbWVudCkKICAgICAgcmV0dXJuOwogICAgdGhpcy5kcm9wSW5kaWNhdG9yLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwogICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuY29tcG9uZW50LmVkaXRvckNvbnRlbnRSZWYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICBsZXQgdG9wUG9zaXRpb24gPSAwOwogICAgY29uc3QgdmlzdWFsQmxvY2tzID0gW107CiAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBibG9ja3MubGVuZ3RoOyBpMTErKykgewogICAgICBpZiAoaTExID09PSBkcmFnZ2VkSW5kZXgpCiAgICAgICAgY29udGludWU7CiAgICAgIGNvbnN0IGJsb2NrID0gYmxvY2tzW2kxMV07CiAgICAgIGNvbnN0IHJlY3QgPSBibG9jay5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgbGV0IHRvcCA9IHJlY3QudG9wIC0gY29udGFpbmVyUmVjdC50b3A7CiAgICAgIGxldCBib3R0b20gPSByZWN0LmJvdHRvbSAtIGNvbnRhaW5lclJlY3QudG9wOwogICAgICBjb25zdCB0cmFuc2Zvcm0yID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoYmxvY2spLnRyYW5zZm9ybTsKICAgICAgaWYgKHRyYW5zZm9ybTIgJiYgdHJhbnNmb3JtMiAhPT0gIm5vbmUiKSB7CiAgICAgICAgY29uc3QgbWF0cml4ID0gbmV3IERPTU1hdHJpeCh0cmFuc2Zvcm0yKTsKICAgICAgICBjb25zdCB5T2Zmc2V0ID0gbWF0cml4Lm00MjsKICAgICAgICB0b3AgKz0geU9mZnNldDsKICAgICAgICBib3R0b20gKz0geU9mZnNldDsKICAgICAgfQogICAgICB2aXN1YWxCbG9ja3MucHVzaCh7IGluZGV4OiBpMTEsIHRvcCwgYm90dG9tIH0pOwogICAgfQogICAgdmlzdWFsQmxvY2tzLnNvcnQoKGE1LCBiNikgPT4gYTUudG9wIC0gYjYudG9wKTsKICAgIGxldCBhZGp1c3RlZFRhcmdldEluZGV4ID0gdGFyZ2V0SW5kZXg7CiAgICBpZiAodGFyZ2V0SW5kZXggPiBkcmFnZ2VkSW5kZXgpIHsKICAgICAgYWRqdXN0ZWRUYXJnZXRJbmRleC0tOwogICAgfQogICAgbGV0IGJsb2NrTWFyZ2luID0gMTY7CiAgICBpZiAodGhpcy5kcmFnZ2VkQmxvY2tFbGVtZW50KSB7CiAgICAgIGNvbnN0IGRyYWdnZWRCbG9jayA9IHRoaXMuY29tcG9uZW50LmJsb2Nrcy5maW5kKChiNikgPT4gYjYuaWQgPT09IHRoaXMuZHJhZ2dlZEJsb2NrSWQpOwogICAgICBpZiAoZHJhZ2dlZEJsb2NrKSB7CiAgICAgICAgY29uc3QgYmxvY2tUeXBlID0gZHJhZ2dlZEJsb2NrLnR5cGU7CiAgICAgICAgaWYgKGJsb2NrVHlwZSA9PT0gImhlYWRpbmctMSIgfHwgYmxvY2tUeXBlID09PSAiaGVhZGluZy0yIiB8fCBibG9ja1R5cGUgPT09ICJoZWFkaW5nLTMiKSB7CiAgICAgICAgICBibG9ja01hcmdpbiA9IDI0OwogICAgICAgIH0gZWxzZSBpZiAoYmxvY2tUeXBlID09PSAiY29kZSIgfHwgYmxvY2tUeXBlID09PSAicXVvdGUiKSB7CiAgICAgICAgICBibG9ja01hcmdpbiA9IDIwOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGFkanVzdGVkVGFyZ2V0SW5kZXggPT09IDApIHsKICAgICAgdG9wUG9zaXRpb24gPSAwOwogICAgfSBlbHNlIGlmIChhZGp1c3RlZFRhcmdldEluZGV4ID49IHZpc3VhbEJsb2Nrcy5sZW5ndGgpIHsKICAgICAgY29uc3QgbGFzdEJsb2NrID0gdmlzdWFsQmxvY2tzW3Zpc3VhbEJsb2Nrcy5sZW5ndGggLSAxXTsKICAgICAgaWYgKGxhc3RCbG9jaykgewogICAgICAgIHRvcFBvc2l0aW9uID0gbGFzdEJsb2NrLmJvdHRvbTsKICAgICAgICB0b3BQb3NpdGlvbiArPSBibG9ja01hcmdpbjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY29uc3QgYmxvY2tCZWZvcmUgPSB2aXN1YWxCbG9ja3NbYWRqdXN0ZWRUYXJnZXRJbmRleCAtIDFdOwogICAgICBpZiAoYmxvY2tCZWZvcmUpIHsKICAgICAgICB0b3BQb3NpdGlvbiA9IGJsb2NrQmVmb3JlLmJvdHRvbTsKICAgICAgICB0b3BQb3NpdGlvbiArPSBibG9ja01hcmdpbjsKICAgICAgfQogICAgfQogICAgdGhpcy5kcm9wSW5kaWNhdG9yLnN0eWxlLmhlaWdodCA9IGAke3RoaXMuZHJhZ2dlZEJsb2NrSGVpZ2h0fXB4YDsKICAgIHRoaXMuZHJvcEluZGljYXRvci5zdHlsZS50b3AgPSBgJHtNYXRoLm1heCgwLCB0b3BQb3NpdGlvbil9cHhgOwogICAgY29uc29sZS5sb2coIkRyb3AgaW5kaWNhdG9yIHVwZGF0ZToiLCB7CiAgICAgIHRhcmdldEluZGV4LAogICAgICBhZGp1c3RlZFRhcmdldEluZGV4LAogICAgICBkcmFnZ2VkSW5kZXgsCiAgICAgIHRvcFBvc2l0aW9uLAogICAgICBoZWlnaHQ6IHRoaXMuZHJhZ2dlZEJsb2NrSGVpZ2h0LAogICAgICBibG9ja01hcmdpbiwKICAgICAgdmlzdWFsQmxvY2tzOiB2aXN1YWxCbG9ja3MubWFwKChiNikgPT4gKHsgaW5kZXg6IGI2LmluZGV4LCB0b3A6IGI2LnRvcCwgYm90dG9tOiBiNi5ib3R0b20gfSkpCiAgICB9KTsKICB9CiAgLyoqCiAgICogSGFuZGxlcyBnbG9iYWwgZHJhZyBlbmQKICAgKi8KICBoYW5kbGVHbG9iYWxEcmFnRW5kID0gKCkgPT4gewogICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZHJhZ292ZXIiLCB0aGlzLmhhbmRsZUdsb2JhbERyYWdPdmVyKTsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImRyYWdlbmQiLCB0aGlzLmhhbmRsZUdsb2JhbERyYWdFbmQpOwogICAgaWYgKHRoaXMuZHJvcEluZGljYXRvcikgewogICAgICB0aGlzLmRyb3BJbmRpY2F0b3IucmVtb3ZlKCk7CiAgICAgIHRoaXMuZHJvcEluZGljYXRvciA9IG51bGw7CiAgICB9CiAgICBpZiAodGhpcy5kcmFnZ2VkQmxvY2tJZCkgewogICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgIHRoaXMucGVyZm9ybURyb3AoKTsKICAgICAgICB0aGlzLmhhbmRsZURyYWdFbmQoKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmhhbmRsZURyYWdFbmQoKTsKICAgIH0KICB9OwogIC8qKgogICAqIFBlcmZvcm1zIHRoZSBhY3R1YWwgZHJvcCBvcGVyYXRpb24KICAgKi8KICBwZXJmb3JtRHJvcCgpIHsKICAgIGlmICghdGhpcy5kcmFnZ2VkQmxvY2tJZCkKICAgICAgcmV0dXJuOwogICAgY29uc3QgYmxvY2tFbGVtZW50czIgPSBBcnJheS5mcm9tKHRoaXMuY29tcG9uZW50LmVkaXRvckNvbnRlbnRSZWYucXVlcnlTZWxlY3RvckFsbCgiLmJsb2NrLXdyYXBwZXIiKSk7CiAgICBjb25zdCBkcmFnZ2VkRWxlbWVudCA9IGJsb2NrRWxlbWVudHMyLmZpbmQoKGVsKSA9PiBlbC5nZXRBdHRyaWJ1dGUoImRhdGEtYmxvY2staWQiKSA9PT0gdGhpcy5kcmFnZ2VkQmxvY2tJZCk7CiAgICBpZiAoIWRyYWdnZWRFbGVtZW50KQogICAgICByZXR1cm47CiAgICBjb25zdCB2aXN1YWxPcmRlciA9IGJsb2NrRWxlbWVudHMyLm1hcCgoZWwpID0+IHsKICAgICAgY29uc3QgaWQgPSBlbC5nZXRBdHRyaWJ1dGUoImRhdGEtYmxvY2staWQiKTsKICAgICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBjb25zdCBjZW50ZXJZID0gcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDI7CiAgICAgIHJldHVybiB7IGlkLCBjZW50ZXJZLCBlbGVtZW50OiBlbCB9OwogICAgfSk7CiAgICB2aXN1YWxPcmRlci5zb3J0KChhNSwgYjYpID0+IGE1LmNlbnRlclkgLSBiNi5jZW50ZXJZKTsKICAgIGNvbnN0IG5ld0Jsb2NrSWRzID0gdmlzdWFsT3JkZXIubWFwKChpdGVtKSA9PiBpdGVtLmlkKS5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gbnVsbCk7CiAgICBjb25zdCBvcmlnaW5hbEJsb2NrcyA9IFsuLi50aGlzLmNvbXBvbmVudC5ibG9ja3NdOwogICAgY29uc3QgZHJhZ2dlZEJsb2NrID0gb3JpZ2luYWxCbG9ja3MuZmluZCgoYjYpID0+IGI2LmlkID09PSB0aGlzLmRyYWdnZWRCbG9ja0lkKTsKICAgIGlmICghZHJhZ2dlZEJsb2NrKQogICAgICByZXR1cm47CiAgICBjb25zdCBvbGRPcmRlciA9IG9yaWdpbmFsQmxvY2tzLm1hcCgoYjYpID0+IGI2LmlkKTsKICAgIGNvbnN0IG9yZGVyQ2hhbmdlZCA9ICFuZXdCbG9ja0lkcy5ldmVyeSgoaWQsIGluZGV4MikgPT4gaWQgPT09IG9sZE9yZGVyW2luZGV4Ml0pOwogICAgaWYgKCFvcmRlckNoYW5nZWQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbmV3QmxvY2tzID0gbmV3QmxvY2tJZHMubWFwKChpZCkgPT4gb3JpZ2luYWxCbG9ja3MuZmluZCgoYjYpID0+IGI2LmlkID09PSBpZCkpLmZpbHRlcihCb29sZWFuKTsKICAgIHRoaXMuY29tcG9uZW50LmJsb2NrcyA9IG5ld0Jsb2NrczsKICAgIHRoaXMuY29tcG9uZW50LnJlbmRlckJsb2Nrc1Byb2dyYW1tYXRpY2FsbHkoKTsKICAgIHRoaXMuY29tcG9uZW50LnVwZGF0ZVZhbHVlKCk7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgaWYgKGRyYWdnZWRCbG9jay50eXBlICE9PSAiZGl2aWRlciIpIHsKICAgICAgICB0aGlzLmNvbXBvbmVudC5ibG9ja09wZXJhdGlvbnMuZm9jdXNCbG9jayhkcmFnZ2VkQmxvY2suaWQpOwogICAgICB9CiAgICB9LCAxMDApOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvd3lzaXd5Zy5oaXN0b3J5LmpzCnZhciBXeXNpd3lnSGlzdG9yeSA9IGNsYXNzIHsKICBoaXN0b3J5ID0gW107CiAgY3VycmVudEluZGV4ID0gLTE7CiAgbWF4SGlzdG9yeVNpemUgPSA1MDsKICBsYXN0U2F2ZVRpbWUgPSAwOwogIHNhdmVEZWJvdW5jZU1zID0gNTAwOwogIC8vIERlYm91bmNlIHNhdmVzIHRvIGF2b2lkIHRvbyBtYW55IHNuYXBzaG90cwogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5oaXN0b3J5ID0gW107CiAgICB0aGlzLmN1cnJlbnRJbmRleCA9IC0xOwogIH0KICAvKioKICAgKiBTYXZlIGN1cnJlbnQgc3RhdGUgdG8gaGlzdG9yeQogICAqLwogIHNhdmVTdGF0ZShibG9ja3MsIHNlbGVjdGVkQmxvY2tJZCwgY3Vyc29yUG9zaXRpb24pIHsKICAgIGNvbnN0IG5vdzIgPSBEYXRlLm5vdygpOwogICAgaWYgKG5vdzIgLSB0aGlzLmxhc3RTYXZlVGltZSA8IHRoaXMuc2F2ZURlYm91bmNlTXMgJiYgdGhpcy5jdXJyZW50SW5kZXggPj0gMCkgewogICAgICB0aGlzLmhpc3RvcnlbdGhpcy5jdXJyZW50SW5kZXhdID0gewogICAgICAgIGJsb2NrczogdGhpcy5jbG9uZUJsb2NrcyhibG9ja3MpLAogICAgICAgIHNlbGVjdGVkQmxvY2tJZCwKICAgICAgICBjdXJzb3JQb3NpdGlvbjogY3Vyc29yUG9zaXRpb24gPyB7IC4uLmN1cnNvclBvc2l0aW9uIH0gOiB2b2lkIDAsCiAgICAgICAgdGltZXN0YW1wOiBub3cyCiAgICAgIH07CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLmN1cnJlbnRJbmRleCA8IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxKSB7CiAgICAgIHRoaXMuaGlzdG9yeSA9IHRoaXMuaGlzdG9yeS5zbGljZSgwLCB0aGlzLmN1cnJlbnRJbmRleCArIDEpOwogICAgfQogICAgY29uc3QgbmV3U3RhdGUgPSB7CiAgICAgIGJsb2NrczogdGhpcy5jbG9uZUJsb2NrcyhibG9ja3MpLAogICAgICBzZWxlY3RlZEJsb2NrSWQsCiAgICAgIGN1cnNvclBvc2l0aW9uOiBjdXJzb3JQb3NpdGlvbiA/IHsgLi4uY3Vyc29yUG9zaXRpb24gfSA6IHZvaWQgMCwKICAgICAgdGltZXN0YW1wOiBub3cyCiAgICB9OwogICAgdGhpcy5oaXN0b3J5LnB1c2gobmV3U3RhdGUpOwogICAgdGhpcy5jdXJyZW50SW5kZXgrKzsKICAgIGlmICh0aGlzLmhpc3RvcnkubGVuZ3RoID4gdGhpcy5tYXhIaXN0b3J5U2l6ZSkgewogICAgICB0aGlzLmhpc3Rvcnkuc2hpZnQoKTsKICAgICAgdGhpcy5jdXJyZW50SW5kZXgtLTsKICAgIH0KICAgIHRoaXMubGFzdFNhdmVUaW1lID0gbm93MjsKICB9CiAgLyoqCiAgICogRm9yY2Ugc2F2ZSBhIGNoZWNrcG9pbnQgKHVzZWZ1bCBmb3Igb3BlcmF0aW9ucyBsaWtlIGJsb2NrIGRlbGV0aW9uKQogICAqLwogIHNhdmVDaGVja3BvaW50KGJsb2Nrcywgc2VsZWN0ZWRCbG9ja0lkLCBjdXJzb3JQb3NpdGlvbikgewogICAgdGhpcy5sYXN0U2F2ZVRpbWUgPSAwOwogICAgdGhpcy5zYXZlU3RhdGUoYmxvY2tzLCBzZWxlY3RlZEJsb2NrSWQsIGN1cnNvclBvc2l0aW9uKTsKICB9CiAgLyoqCiAgICogVW5kbyB0byBwcmV2aW91cyBzdGF0ZQogICAqLwogIHVuZG8oKSB7CiAgICBpZiAoIXRoaXMuY2FuVW5kbygpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgdGhpcy5jdXJyZW50SW5kZXgtLTsKICAgIHJldHVybiB0aGlzLmNsb25lU3RhdGUodGhpcy5oaXN0b3J5W3RoaXMuY3VycmVudEluZGV4XSk7CiAgfQogIC8qKgogICAqIFJlZG8gdG8gbmV4dCBzdGF0ZQogICAqLwogIHJlZG8oKSB7CiAgICBpZiAoIXRoaXMuY2FuUmVkbygpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgdGhpcy5jdXJyZW50SW5kZXgrKzsKICAgIHJldHVybiB0aGlzLmNsb25lU3RhdGUodGhpcy5oaXN0b3J5W3RoaXMuY3VycmVudEluZGV4XSk7CiAgfQogIC8qKgogICAqIENoZWNrIGlmIHVuZG8gaXMgYXZhaWxhYmxlCiAgICovCiAgY2FuVW5kbygpIHsKICAgIHJldHVybiB0aGlzLmN1cnJlbnRJbmRleCA+IDA7CiAgfQogIC8qKgogICAqIENoZWNrIGlmIHJlZG8gaXMgYXZhaWxhYmxlCiAgICovCiAgY2FuUmVkbygpIHsKICAgIHJldHVybiB0aGlzLmN1cnJlbnRJbmRleCA8IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxOwogIH0KICAvKioKICAgKiBHZXQgY3VycmVudCBzdGF0ZQogICAqLwogIGdldEN1cnJlbnRTdGF0ZSgpIHsKICAgIGlmICh0aGlzLmN1cnJlbnRJbmRleCA+PSAwICYmIHRoaXMuY3VycmVudEluZGV4IDwgdGhpcy5oaXN0b3J5Lmxlbmd0aCkgewogICAgICByZXR1cm4gdGhpcy5jbG9uZVN0YXRlKHRoaXMuaGlzdG9yeVt0aGlzLmN1cnJlbnRJbmRleF0pOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIC8qKgogICAqIENsZWFyIGhpc3RvcnkKICAgKi8KICBjbGVhcigpIHsKICAgIHRoaXMuaGlzdG9yeSA9IFtdOwogICAgdGhpcy5jdXJyZW50SW5kZXggPSAtMTsKICAgIHRoaXMubGFzdFNhdmVUaW1lID0gMDsKICB9CiAgLyoqCiAgICogRGVlcCBjbG9uZSBibG9ja3MKICAgKi8KICBjbG9uZUJsb2NrcyhibG9ja3MpIHsKICAgIHJldHVybiBibG9ja3MubWFwKChibG9jaykgPT4gKHsKICAgICAgLi4uYmxvY2ssCiAgICAgIG1ldGFkYXRhOiBibG9jay5tZXRhZGF0YSA/IHsgLi4uYmxvY2subWV0YWRhdGEgfSA6IHZvaWQgMAogICAgfSkpOwogIH0KICAvKioKICAgKiBDbG9uZSBhIGhpc3Rvcnkgc3RhdGUKICAgKi8KICBjbG9uZVN0YXRlKHN0YXRlMTApIHsKICAgIHJldHVybiB7CiAgICAgIGJsb2NrczogdGhpcy5jbG9uZUJsb2NrcyhzdGF0ZTEwLmJsb2NrcyksCiAgICAgIHNlbGVjdGVkQmxvY2tJZDogc3RhdGUxMC5zZWxlY3RlZEJsb2NrSWQsCiAgICAgIGN1cnNvclBvc2l0aW9uOiBzdGF0ZTEwLmN1cnNvclBvc2l0aW9uID8geyAuLi5zdGF0ZTEwLmN1cnNvclBvc2l0aW9uIH0gOiB2b2lkIDAsCiAgICAgIHRpbWVzdGFtcDogc3RhdGUxMC50aW1lc3RhbXAKICAgIH07CiAgfQogIC8qKgogICAqIEdldCBoaXN0b3J5IGluZm8gZm9yIGRlYnVnZ2luZwogICAqLwogIGdldEhpc3RvcnlJbmZvKCkgewogICAgcmV0dXJuIHsKICAgICAgc2l6ZTogdGhpcy5oaXN0b3J5Lmxlbmd0aCwKICAgICAgY3VycmVudEluZGV4OiB0aGlzLmN1cnJlbnRJbmRleCwKICAgICAgY2FuVW5kbzogdGhpcy5jYW5VbmRvKCksCiAgICAgIGNhblJlZG86IHRoaXMuY2FuUmVkbygpCiAgICB9OwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvZGVlcy13eXNpd3lnLWJsb2NrLmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTM2ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMzNyA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1d5c2l3eWdCbG9jayA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy13eXNpd3lnLWJsb2NrIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfYmxvY2tfZGVjb3JhdG9yczsKICBsZXQgX2Jsb2NrX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYmxvY2tfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzU2VsZWN0ZWRfZGVjb3JhdG9yczsKICBsZXQgX2lzU2VsZWN0ZWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc1NlbGVjdGVkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oYW5kbGVyc19kZWNvcmF0b3JzOwogIGxldCBfaGFuZGxlcnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oYW5kbGVyc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfd3lzaXd5Z0NvbXBvbmVudF9kZWNvcmF0b3JzOwogIGxldCBfd3lzaXd5Z0NvbXBvbmVudF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3d5c2l3eWdDb21wb25lbnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1d5c2l3eWdCbG9jazIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9ibG9ja19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogT2JqZWN0IH0pXTsKICAgICAgX2lzU2VsZWN0ZWRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfaGFuZGxlcnNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF93eXNpd3lnQ29tcG9uZW50X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBPYmplY3QgfSldOwogICAgICBfX2VzRGVjb3JhdGUzNih0aGlzLCBudWxsLCBfYmxvY2tfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYmxvY2siLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImJsb2NrIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmJsb2NrLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5ibG9jayA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9ibG9ja19pbml0aWFsaXplcnMsIF9ibG9ja19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM2KHRoaXMsIG51bGwsIF9pc1NlbGVjdGVkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzU2VsZWN0ZWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImlzU2VsZWN0ZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNTZWxlY3RlZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNTZWxlY3RlZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pc1NlbGVjdGVkX2luaXRpYWxpemVycywgX2lzU2VsZWN0ZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzNih0aGlzLCBudWxsLCBfaGFuZGxlcnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaGFuZGxlcnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImhhbmRsZXJzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmhhbmRsZXJzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5oYW5kbGVycyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9oYW5kbGVyc19pbml0aWFsaXplcnMsIF9oYW5kbGVyc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM2KHRoaXMsIG51bGwsIF93eXNpd3lnQ29tcG9uZW50X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInd5c2l3eWdDb21wb25lbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInd5c2l3eWdDb21wb25lbnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoud3lzaXd5Z0NvbXBvbmVudCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoud3lzaXd5Z0NvbXBvbmVudCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF93eXNpd3lnQ29tcG9uZW50X2luaXRpYWxpemVycywgX3d5c2l3eWdDb21wb25lbnRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzNihudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNXeXNpd3lnQmxvY2syID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBpZiAodGhpcy5fc2VsZWN0aW9uSGFuZGxlcikgewogICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIsIHRoaXMuX3NlbGVjdGlvbkhhbmRsZXIpOwogICAgICB9CiAgICB9CiAgICAjYmxvY2tfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMzcodGhpcywgX2Jsb2NrX2luaXRpYWxpemVycywgdm9pZCAwKTsKICAgIGdldCBibG9jaygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2Jsb2NrX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYmxvY2sodmFsdWUyKSB7CiAgICAgIHRoaXMuI2Jsb2NrX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNTZWxlY3RlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzcodGhpcywgX2Jsb2NrX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzNyh0aGlzLCBfaXNTZWxlY3RlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaXNTZWxlY3RlZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzU2VsZWN0ZWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc1NlbGVjdGVkKHZhbHVlMikgewogICAgICB0aGlzLiNpc1NlbGVjdGVkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaGFuZGxlcnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM3KHRoaXMsIF9pc1NlbGVjdGVkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzNyh0aGlzLCBfaGFuZGxlcnNfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBoYW5kbGVycygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2hhbmRsZXJzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaGFuZGxlcnModmFsdWUyKSB7CiAgICAgIHRoaXMuI2hhbmRsZXJzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjd3lzaXd5Z0NvbXBvbmVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzcodGhpcywgX2hhbmRsZXJzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzNyh0aGlzLCBfd3lzaXd5Z0NvbXBvbmVudF9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgZ2V0IHd5c2l3eWdDb21wb25lbnQoKSB7CiAgICAgIHJldHVybiB0aGlzLiN3eXNpd3lnQ29tcG9uZW50X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICAvLyBSZWZlcmVuY2UgdG8gcGFyZW50IGRlZXMtaW5wdXQtd3lzaXd5ZwogICAgc2V0IHd5c2l3eWdDb21wb25lbnQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3d5c2l3eWdDb21wb25lbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIC8vIFJlZmVyZW5jZSB0byB0aGUgZWRpdGFibGUgYmxvY2sgZWxlbWVudAogICAgYmxvY2tFbGVtZW50ID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzcodGhpcywgX3d5c2l3eWdDb21wb25lbnRfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgIC8vIFRyYWNrIGlmIHdlJ3ZlIGluaXRpYWxpemVkIHRoZSBjb250ZW50CiAgICBjb250ZW50SW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgIC8vIFRyYWNrIGN1cnNvciBwb3NpdGlvbgogICAgbGFzdEtub3duQ3Vyc29yUG9zaXRpb24gPSAwOwogICAgbGFzdFNlbGVjdGVkVGV4dCA9ICIiOwogICAgaGFuZGxlclN0eWxlc0luamVjdGVkID0gZmFsc2U7CiAgICAvLyBCbG9jayB0eXBlcyB0aGF0IGRvbid0IHN1cHBvcnQgY29udGVudGVkaXRhYmxlCiAgICBzdGF0aWMgTk9OX0VESVRBQkxFX1RZUEVTID0gWyJpbWFnZSIsICJkaXZpZGVyIiwgInlvdXR1YmUiXTsKICAgIGluamVjdEhhbmRsZXJTdHlsZXMoKSB7CiAgICAgIGlmICh0aGlzLmhhbmRsZXJTdHlsZXNJbmplY3RlZCkKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMuaGFuZGxlclN0eWxlc0luamVjdGVkID0gdHJ1ZTsKICAgICAgbGV0IHN0eWxlczMgPSAiIjsKICAgICAgY29uc3QgYmxvY2tUeXBlcyA9IEJsb2NrUmVnaXN0cnkuZ2V0QWxsVHlwZXMoKTsKICAgICAgZm9yIChjb25zdCB0eXBlNSBvZiBibG9ja1R5cGVzKSB7CiAgICAgICAgY29uc3QgaGFuZGxlcjIgPSBCbG9ja1JlZ2lzdHJ5LmdldEhhbmRsZXIodHlwZTUpOwogICAgICAgIGlmIChoYW5kbGVyMikgewogICAgICAgICAgc3R5bGVzMyArPSBoYW5kbGVyMi5nZXRTdHlsZXMoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHN0eWxlczMpIHsKICAgICAgICBjb25zdCBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICAgIHN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IHN0eWxlczM7CiAgICAgICAgdGhpcy5zaGFkb3dSb290Py5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpOwogICAgICB9CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAuYmxvY2sgewogICAgICAgIHBhZGRpbmc6IDRweCAwOwogICAgICAgIG1pbi1oZWlnaHQ6IDEuNmVtOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAwMDAiLCAiI2UwZTBlMCIpfTsKICAgICAgfQoKICAgICAgLmJsb2NrOmVtcHR5Om5vdCg6Zm9jdXMpOjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOTk5IiwgIiM2NjYiKX07CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAvKiBCbG9jay1zcGVjaWZpYyBzdHlsZXMgbW92ZWQgdG8gaGFuZGxlcnMgKi8KCgogICAgICAvKiBGb3JtYXR0aW5nIHN0eWxlcyAqLwogICAgICAuYmxvY2sgOmlzKGIsIHN0cm9uZykgewogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwMDAwIiwgIiNmZmZmZmYiKX07CiAgICAgIH0KCiAgICAgIC5ibG9jayA6aXMoaSwgZW0pIHsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KCiAgICAgIC5ibG9jayB1IHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQoKICAgICAgLmJsb2NrIHMgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOwogICAgICB9CgogICAgICAuYmxvY2sgY29kZSB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdTRiBNb25vJywgJ01vbmFjbycsICdJbmNvbnNvbGF0YScsICdGaXJhIENvZGUnLCBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiAwLjllbTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjA2KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkiKX07CiAgICAgICAgcGFkZGluZzogMnB4IDZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDE0IiwgIiNmZjZiNmIiKX07CiAgICAgIH0KCiAgICAgIC5ibG9jayBhIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDY2Y2MiLCAiIzRkOTRmZiIpfTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cyBlYXNlOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgLmJsb2NrIGE6aG92ZXIgewogICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDA2NmNjIiwgIiM0ZDk0ZmYiKX07CiAgICAgIH0KCiAgICAgIC8qIENvZGUgYmxvY2sgY29udGFpbmVyIGFuZCBsYW5ndWFnZSBzdHlsZXMgbW92ZWQgdG8gaGFuZGxlciAqLwoKICAgICAgLyogU2VsZWN0aW9uIHN0eWxlcyAqLwogICAgICAuYmxvY2sgOjpzZWxlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDEwMiwgMjA0LCAwLjMpIiwgInJnYmEoNzcsIDE0OCwgMjU1LCAwLjMpIil9OwogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgICB9CgoKICAgICAgLyogU3RyaWtlIHRocm91Z2ggKi8KICAgICAgLmJsb2NrIDppcyhzLCBzdHJpa2UpIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgIH0KCgogICAgICAvKiBCbG9jayBtYXJnaW4gYWRqdXN0bWVudHMgYmFzZWQgb24gdHlwZSAqLwogICAgICA6aG9zdC1jb250ZXh0KC5ibG9jay13cmFwcGVyOmZpcnN0LWNoaWxkKSAuYmxvY2sgewogICAgICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QtY29udGV4dCguYmxvY2std3JhcHBlcjpsYXN0LWNoaWxkKSAuYmxvY2sgewogICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICAgIH0KCiAgICAgIC8qIFNlbGVjdGVkIHN0YXRlICovCiAgICAgIC5ibG9jay5zZWxlY3RlZCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMTAyLCAyMDQsIDAuMDUpIiwgInJnYmEoNzcsIDE0OCwgMjU1LCAwLjA4KSIpfTsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAycHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMTAyLCAyMDQsIDAuMikiLCAicmdiYSg3NywgMTQ4LCAyNTUsIDAuMikiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiAtOHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogLThweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDhweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7CiAgICAgIH0KCgoKCiAgICBgCiAgICBdOwogICAgc2hvdWxkVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoImlzU2VsZWN0ZWQiKSAmJiB0aGlzLmJsb2NrKSB7CiAgICAgICAgbGV0IGVsZW1lbnQ0ID0gbnVsbDsKICAgICAgICBjb25zdCBibG9ja1R5cGUgPSB0aGlzLmJsb2NrLnR5cGU7CiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBgLmJsb2NrLiR7YmxvY2tUeXBlfWA7CiAgICAgICAgZWxlbWVudDQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgICAgIGlmIChlbGVtZW50NCkgewogICAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCkgewogICAgICAgICAgICBlbGVtZW50NC5jbGFzc0xpc3QuYWRkKCJzZWxlY3RlZCIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWxlbWVudDQuY2xhc3NMaXN0LnJlbW92ZSgic2VsZWN0ZWQiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoImJsb2NrIikgJiYgdGhpcy5ibG9jaykgewogICAgICAgIGNvbnN0IG9sZEJsb2NrID0gY2hhbmdlZFByb3BlcnRpZXMuZ2V0KCJibG9jayIpOwogICAgICAgIGlmIChvbGRCbG9jayAmJiBvbGRCbG9jay5pZCAmJiBvbGRCbG9jay50eXBlICYmIG9sZEJsb2NrLmlkID09PSB0aGlzLmJsb2NrLmlkICYmIG9sZEJsb2NrLnR5cGUgPT09IHRoaXMuYmxvY2sudHlwZSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gIXRoaXMuYmxvY2tFbGVtZW50IHx8IHRoaXMuYmxvY2s/LnR5cGUgIT09IHRoaXMuYmxvY2tFbGVtZW50LmRhdGFzZXQuYmxvY2tUeXBlOwogICAgfQogICAgZmlyc3RVcGRhdGVkKCkgewogICAgICB0aGlzLmNvbnRlbnRJbml0aWFsaXplZCA9IHRydWU7CiAgICAgIHRoaXMuaW5qZWN0SGFuZGxlclN0eWxlcygpOwogICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi53eXNpd3lnLWJsb2NrLWNvbnRhaW5lciIpOwogICAgICBpZiAoY29udGFpbmVyICYmIHRoaXMuYmxvY2spIHsKICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gdGhpcy5yZW5kZXJCbG9ja0NvbnRlbnQoKTsKICAgICAgfQogICAgICBpZiAodGhpcy5ibG9jaykgewogICAgICAgIGNvbnN0IGhhbmRsZXIyID0gQmxvY2tSZWdpc3RyeS5nZXRIYW5kbGVyKHRoaXMuYmxvY2sudHlwZSk7CiAgICAgICAgaWYgKGhhbmRsZXIyKSB7CiAgICAgICAgICBjb25zdCBibG9ja0VsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi53eXNpd3lnLWJsb2NrLWNvbnRhaW5lciIpOwogICAgICAgICAgaWYgKGJsb2NrRWxlbWVudCkgewogICAgICAgICAgICBoYW5kbGVyMi5zZXR1cChibG9ja0VsZW1lbnQsIHRoaXMuYmxvY2ssIHRoaXMuaGFuZGxlcnMpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBlZGl0YWJsZUJsb2NrID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuYmxvY2siKTsKICAgICAgaWYgKGVkaXRhYmxlQmxvY2spIHsKICAgICAgICBlZGl0YWJsZUJsb2NrLnNldEF0dHJpYnV0ZSgiZGF0YS1ibG9jay1pZCIsIHRoaXMuYmxvY2suaWQpOwogICAgICAgIGVkaXRhYmxlQmxvY2suc2V0QXR0cmlidXRlKCJkYXRhLWJsb2NrLXR5cGUiLCB0aGlzLmJsb2NrLnR5cGUpOwogICAgICAgIGVkaXRhYmxlQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCAoZTExKSA9PiB7CiAgICAgICAgICB0aGlzLmhhbmRsZXJzPy5vbklucHV0Py4oZTExKTsKICAgICAgICAgIGNvbnN0IHBvcyA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oZWRpdGFibGVCbG9jayk7CiAgICAgICAgICBpZiAocG9zICE9PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMubGFzdEtub3duQ3Vyc29yUG9zaXRpb24gPSBwb3M7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgZWRpdGFibGVCbG9jay5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgKGUxMSkgPT4gewogICAgICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlZGl0YWJsZUJsb2NrKTsKICAgICAgICAgIGlmIChwb3MgIT09IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IHBvczsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuaGFuZGxlcnM/Lm9uS2V5RG93bj8uKGUxMSk7CiAgICAgICAgfSk7CiAgICAgICAgZWRpdGFibGVCbG9jay5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsICgpID0+IHsKICAgICAgICAgIHRoaXMuaGFuZGxlcnM/Lm9uRm9jdXM/LigpOwogICAgICAgIH0pOwogICAgICAgIGVkaXRhYmxlQmxvY2suYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsICgpID0+IHsKICAgICAgICAgIHRoaXMuaGFuZGxlcnM/Lm9uQmx1cj8uKCk7CiAgICAgICAgfSk7CiAgICAgICAgZWRpdGFibGVCbG9jay5hZGRFdmVudExpc3RlbmVyKCJjb21wb3NpdGlvbnN0YXJ0IiwgKCkgPT4gewogICAgICAgICAgdGhpcy5oYW5kbGVycz8ub25Db21wb3NpdGlvblN0YXJ0Py4oKTsKICAgICAgICB9KTsKICAgICAgICBlZGl0YWJsZUJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBvc2l0aW9uZW5kIiwgKCkgPT4gewogICAgICAgICAgdGhpcy5oYW5kbGVycz8ub25Db21wb3NpdGlvbkVuZD8uKCk7CiAgICAgICAgfSk7CiAgICAgICAgZWRpdGFibGVCbG9jay5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgKGUxMSkgPT4gewogICAgICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlZGl0YWJsZUJsb2NrKTsKICAgICAgICAgIGlmIChwb3MgIT09IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IHBvczsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuaGFuZGxlcnM/Lm9uTW91c2VVcD8uKGUxMSk7CiAgICAgICAgfSk7CiAgICAgICAgZWRpdGFibGVCbG9jay5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICBjb25zdCBwb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVkaXRhYmxlQmxvY2spOwogICAgICAgICAgICBpZiAocG9zICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgdGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IHBvczsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgMCk7CiAgICAgICAgfSk7CiAgICAgICAgY29uc3QgY2hlY2tTZWxlY3Rpb24gPSAoKSA9PiB7CiAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICAgICAgICBpZiAoc2VsZWN0ZWRUZXh0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBpZiAodGhpcy5sYXN0U2VsZWN0ZWRUZXh0KSB7CiAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRUZXh0ID0gIiI7CiAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiYmxvY2stdGV4dC1zZWxlY3RlZCIsIHsKICAgICAgICAgICAgICAgIGRldGFpbDogewogICAgICAgICAgICAgICAgICB0ZXh0OiAiIiwKICAgICAgICAgICAgICAgICAgYmxvY2tJZDogdGhpcy5ibG9jay5pZCwKICAgICAgICAgICAgICAgICAgaGFzU2VsZWN0aW9uOiBmYWxzZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBjdXJyZW50RWRpdGFibGVCbG9jayA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmJsb2NrIik7CiAgICAgICAgICBpZiAoIWN1cnJlbnRFZGl0YWJsZUJsb2NrKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjb25zdCBwYXJlbnRDb21wb25lbnQgPSB0aGlzLmNsb3Nlc3QoImRlZXMtaW5wdXQtd3lzaXd5ZyIpOwogICAgICAgICAgY29uc3QgcGFyZW50U2hhZG93Um9vdCA9IHBhcmVudENvbXBvbmVudD8uc2hhZG93Um9vdDsKICAgICAgICAgIGNvbnN0IHNoYWRvd1Jvb3RzID0gW107CiAgICAgICAgICBpZiAocGFyZW50U2hhZG93Um9vdCkKICAgICAgICAgICAgc2hhZG93Um9vdHMucHVzaChwYXJlbnRTaGFkb3dSb290KTsKICAgICAgICAgIGlmICh0aGlzLnNoYWRvd1Jvb3QpCiAgICAgICAgICAgIHNoYWRvd1Jvb3RzLnB1c2godGhpcy5zaGFkb3dSb290KTsKICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbkluZm8gPSBXeXNpd3lnU2VsZWN0aW9uLmdldFNlbGVjdGlvbkluZm8oLi4uc2hhZG93Um9vdHMpOwogICAgICAgICAgaWYgKCFzZWxlY3Rpb25JbmZvKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjb25zdCBzdGFydEluQmxvY2sgPSBXeXNpd3lnU2VsZWN0aW9uLmNvbnRhaW5zQWNyb3NzU2hhZG93RE9NKGN1cnJlbnRFZGl0YWJsZUJsb2NrLCBzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyKTsKICAgICAgICAgIGNvbnN0IGVuZEluQmxvY2sgPSBXeXNpd3lnU2VsZWN0aW9uLmNvbnRhaW5zQWNyb3NzU2hhZG93RE9NKGN1cnJlbnRFZGl0YWJsZUJsb2NrLCBzZWxlY3Rpb25JbmZvLmVuZENvbnRhaW5lcik7CiAgICAgICAgICBpZiAoc3RhcnRJbkJsb2NrIHx8IGVuZEluQmxvY2spIHsKICAgICAgICAgICAgaWYgKHNlbGVjdGVkVGV4dCAhPT0gdGhpcy5sYXN0U2VsZWN0ZWRUZXh0KSB7CiAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRUZXh0ID0gc2VsZWN0ZWRUZXh0OwogICAgICAgICAgICAgIGNvbnN0IHJhbmdlMiA9IFd5c2l3eWdTZWxlY3Rpb24uY3JlYXRlUmFuZ2VGcm9tSW5mbyhzZWxlY3Rpb25JbmZvKTsKICAgICAgICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImJsb2NrLXRleHQtc2VsZWN0ZWQiLCB7CiAgICAgICAgICAgICAgICBkZXRhaWw6IHsKICAgICAgICAgICAgICAgICAgdGV4dDogc2VsZWN0ZWRUZXh0LnRyaW0oKSwKICAgICAgICAgICAgICAgICAgYmxvY2tJZDogdGhpcy5ibG9jay5pZCwKICAgICAgICAgICAgICAgICAgcmFuZ2U6IHJhbmdlMiwKICAgICAgICAgICAgICAgICAgcmVjdCwKICAgICAgICAgICAgICAgICAgaGFzU2VsZWN0aW9uOiB0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGFzdFNlbGVjdGVkVGV4dCkgewogICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZFRleHQgPSAiIjsKICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiYmxvY2stdGV4dC1zZWxlY3RlZCIsIHsKICAgICAgICAgICAgICBkZXRhaWw6IHsKICAgICAgICAgICAgICAgIHRleHQ6ICIiLAogICAgICAgICAgICAgICAgYmxvY2tJZDogdGhpcy5ibG9jay5pZCwKICAgICAgICAgICAgICAgIGhhc1NlbGVjdGlvbjogZmFsc2UKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICAgICAgfSkpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIiwgY2hlY2tTZWxlY3Rpb24pOwogICAgICAgIHRoaXMuX3NlbGVjdGlvbkhhbmRsZXIgPSBjaGVja1NlbGVjdGlvbjsKICAgICAgICBlZGl0YWJsZUJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIiwgKCkgPT4gewogICAgICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRDdXJzb3JQb3NpdGlvbihlZGl0YWJsZUJsb2NrKTsKICAgICAgICAgIGlmIChwb3MgIT09IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiA9IHBvczsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBpZiAodGhpcy5ibG9jay5jb250ZW50KSB7CiAgICAgICAgICBlZGl0YWJsZUJsb2NrLmlubmVySFRNTCA9IHRoaXMuYmxvY2suY29udGVudDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5ibG9ja0VsZW1lbnQgPSBlZGl0YWJsZUJsb2NrOwogICAgfQogICAgcmVuZGVyKCkgewogICAgICBpZiAoIXRoaXMuYmxvY2spCiAgICAgICAgcmV0dXJuIHUzYGA7CiAgICAgIHJldHVybiB1M2A8ZGl2IGNsYXNzPSJ3eXNpd3lnLWJsb2NrLWNvbnRhaW5lciI+PC9kaXY+YDsKICAgIH0KICAgIHJlbmRlckJsb2NrQ29udGVudCgpIHsKICAgICAgaWYgKCF0aGlzLmJsb2NrKQogICAgICAgIHJldHVybiAiIjsKICAgICAgY29uc3QgaGFuZGxlcjIgPSBCbG9ja1JlZ2lzdHJ5LmdldEhhbmRsZXIodGhpcy5ibG9jay50eXBlKTsKICAgICAgaWYgKGhhbmRsZXIyKSB7CiAgICAgICAgcmV0dXJuIGhhbmRsZXIyLnJlbmRlcih0aGlzLmJsb2NrLCB0aGlzLmlzU2VsZWN0ZWQpOwogICAgICB9CiAgICAgIGNvbnN0IHNlbGVjdGVkQ2xhc3MgPSB0aGlzLmlzU2VsZWN0ZWQgPyAiIHNlbGVjdGVkIiA6ICIiOwogICAgICByZXR1cm4gYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9ImJsb2NrICR7dGhpcy5ibG9jay50eXBlfSR7c2VsZWN0ZWRDbGFzc30iCiAgICAgICAgY29udGVudGVkaXRhYmxlPSJ0cnVlIgogICAgICA+PC9kaXY+CiAgICBgOwogICAgfQogICAgZm9jdXMoKSB7CiAgICAgIGNvbnN0IGhhbmRsZXIyID0gQmxvY2tSZWdpc3RyeS5nZXRIYW5kbGVyKHRoaXMuYmxvY2sudHlwZSk7CiAgICAgIGlmIChoYW5kbGVyMiAmJiBoYW5kbGVyMi5mb2N1cykgewogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnd5c2l3eWctYmxvY2stY29udGFpbmVyIik7CiAgICAgICAgY29uc3QgY29udGV4dDIgPSB7IHNoYWRvd1Jvb3Q6IHRoaXMuc2hhZG93Um9vdCwgY29tcG9uZW50OiB0aGlzIH07CiAgICAgICAgcmV0dXJuIGhhbmRsZXIyLmZvY3VzKGNvbnRhaW5lciwgY29udGV4dDIpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmJsb2NrICYmIERlZXNXeXNpd3lnQmxvY2syLk5PTl9FRElUQUJMRV9UWVBFUy5pbmNsdWRlcyh0aGlzLmJsb2NrLnR5cGUpKSB7CiAgICAgICAgY29uc3QgYmxvY2tFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKGAuYmxvY2suJHt0aGlzLmJsb2NrLnR5cGV9YCk7CiAgICAgICAgaWYgKGJsb2NrRWxlbWVudCkgewogICAgICAgICAgYmxvY2tFbGVtZW50LmZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBlZGl0YWJsZUVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jayIpOwogICAgICBpZiAoIWVkaXRhYmxlRWxlbWVudCkKICAgICAgICByZXR1cm47CiAgICAgIGlmICghZWRpdGFibGVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIikpIHsKICAgICAgICBlZGl0YWJsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiLCAidHJ1ZSIpOwogICAgICB9CiAgICAgIGVkaXRhYmxlRWxlbWVudC5mb2N1cygpOwogICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gZWRpdGFibGVFbGVtZW50ICYmIHRoaXMuc2hhZG93Um9vdD8uYWN0aXZlRWxlbWVudCAhPT0gZWRpdGFibGVFbGVtZW50KSB7CiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7CiAgICAgICAgICBlZGl0YWJsZUVsZW1lbnQuZm9jdXMoKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgZm9jdXNXaXRoQ3Vyc29yKHBvc2l0aW9uMyA9ICJlbmQiKSB7CiAgICAgIGNvbnN0IGhhbmRsZXIyID0gQmxvY2tSZWdpc3RyeS5nZXRIYW5kbGVyKHRoaXMuYmxvY2sudHlwZSk7CiAgICAgIGlmIChoYW5kbGVyMiAmJiBoYW5kbGVyMi5mb2N1c1dpdGhDdXJzb3IpIHsKICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi53eXNpd3lnLWJsb2NrLWNvbnRhaW5lciIpOwogICAgICAgIGNvbnN0IGNvbnRleHQyID0geyBzaGFkb3dSb290OiB0aGlzLnNoYWRvd1Jvb3QsIGNvbXBvbmVudDogdGhpcyB9OwogICAgICAgIHJldHVybiBoYW5kbGVyMi5mb2N1c1dpdGhDdXJzb3IoY29udGFpbmVyLCBwb3NpdGlvbjMsIGNvbnRleHQyKTsKICAgICAgfQogICAgICBpZiAodGhpcy5ibG9jayAmJiBEZWVzV3lzaXd5Z0Jsb2NrMi5OT05fRURJVEFCTEVfVFlQRVMuaW5jbHVkZXModGhpcy5ibG9jay50eXBlKSkgewogICAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgZWRpdGFibGVFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuYmxvY2siKTsKICAgICAgaWYgKCFlZGl0YWJsZUVsZW1lbnQpCiAgICAgICAgcmV0dXJuOwogICAgICBpZiAoIWVkaXRhYmxlRWxlbWVudC5oYXNBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIpKSB7CiAgICAgICAgZWRpdGFibGVFbGVtZW50LnNldEF0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIiwgInRydWUiKTsKICAgICAgfQogICAgICBlZGl0YWJsZUVsZW1lbnQuZm9jdXMoKTsKICAgICAgY29uc3Qgc2V0Q3Vyc29yID0gKCkgPT4gewogICAgICAgIGlmIChwb3NpdGlvbjMgPT09ICJzdGFydCIpIHsKICAgICAgICAgIHRoaXMuc2V0Q3Vyc29yVG9TdGFydCgpOwogICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24zID09PSAiZW5kIikgewogICAgICAgICAgdGhpcy5zZXRDdXJzb3JUb0VuZCgpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBvc2l0aW9uMyA9PT0gIm51bWJlciIpIHsKICAgICAgICAgIFd5c2l3eWdTZWxlY3Rpb24uc2V0Q3Vyc29yUG9zaXRpb24oZWRpdGFibGVFbGVtZW50LCBwb3NpdGlvbjMpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGVkaXRhYmxlRWxlbWVudCB8fCB0aGlzLnNoYWRvd1Jvb3Q/LmFjdGl2ZUVsZW1lbnQgPT09IGVkaXRhYmxlRWxlbWVudCkgewogICAgICAgIHNldEN1cnNvcigpOwogICAgICB9IGVsc2UgewogICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gewogICAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGVkaXRhYmxlRWxlbWVudCB8fCB0aGlzLnNoYWRvd1Jvb3Q/LmFjdGl2ZUVsZW1lbnQgPT09IGVkaXRhYmxlRWxlbWVudCkgewogICAgICAgICAgICBzZXRDdXJzb3IoKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBHZXQgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBlZGl0YWJsZSBlbGVtZW50CiAgICAgKi8KICAgIGdldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ0KSB7CiAgICAgIGNvbnN0IGhhbmRsZXIyID0gQmxvY2tSZWdpc3RyeS5nZXRIYW5kbGVyKHRoaXMuYmxvY2sudHlwZSk7CiAgICAgIGlmIChoYW5kbGVyMiAmJiBoYW5kbGVyMi5nZXRDdXJzb3JQb3NpdGlvbikgewogICAgICAgIGNvbnN0IGNvbnRleHQyID0geyBzaGFkb3dSb290OiB0aGlzLnNoYWRvd1Jvb3QsIGNvbXBvbmVudDogdGhpcyB9OwogICAgICAgIHJldHVybiBoYW5kbGVyMi5nZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50NCwgY29udGV4dDIpOwogICAgICB9CiAgICAgIGNvbnN0IHBhcmVudENvbXBvbmVudCA9IHRoaXMuY2xvc2VzdCgiZGVlcy1pbnB1dC13eXNpd3lnIik7CiAgICAgIGNvbnN0IHBhcmVudFNoYWRvd1Jvb3QgPSBwYXJlbnRDb21wb25lbnQ/LnNoYWRvd1Jvb3Q7CiAgICAgIGNvbnN0IHNoYWRvd1Jvb3RzID0gW107CiAgICAgIGlmIChwYXJlbnRTaGFkb3dSb290KQogICAgICAgIHNoYWRvd1Jvb3RzLnB1c2gocGFyZW50U2hhZG93Um9vdCk7CiAgICAgIGlmICh0aGlzLnNoYWRvd1Jvb3QpCiAgICAgICAgc2hhZG93Um9vdHMucHVzaCh0aGlzLnNoYWRvd1Jvb3QpOwogICAgICBjb25zdCBzZWxlY3Rpb25JbmZvID0gV3lzaXd5Z1NlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvKC4uLnNoYWRvd1Jvb3RzKTsKICAgICAgY29uc29sZS5sb2coImdldEN1cnNvclBvc2l0aW9uOiBTZWxlY3Rpb24gaW5mbyBmcm9tIHNoYWRvdyBET01zOiIsIHsKICAgICAgICBzZWxlY3Rpb25JbmZvLAogICAgICAgIHNoYWRvd1Jvb3RzQ291bnQ6IHNoYWRvd1Jvb3RzLmxlbmd0aAogICAgICB9KTsKICAgICAgaWYgKCFzZWxlY3Rpb25JbmZvKSB7CiAgICAgICAgY29uc29sZS5sb2coImdldEN1cnNvclBvc2l0aW9uOiBObyBzZWxlY3Rpb24gZm91bmQiKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zb2xlLmxvZygiZ2V0Q3Vyc29yUG9zaXRpb246IFJhbmdlIGluZm86IiwgewogICAgICAgIHN0YXJ0Q29udGFpbmVyOiBzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyLAogICAgICAgIHN0YXJ0T2Zmc2V0OiBzZWxlY3Rpb25JbmZvLnN0YXJ0T2Zmc2V0LAogICAgICAgIGNvbGxhcHNlZDogc2VsZWN0aW9uSW5mby5jb2xsYXBzZWQsCiAgICAgICAgc3RhcnRDb250YWluZXJUZXh0OiBzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyLnRleHRDb250ZW50CiAgICAgIH0pOwogICAgICBpZiAoIWVsZW1lbnQ0LmNvbnRhaW5zKHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIpKSB7CiAgICAgICAgY29uc29sZS5sb2coImdldEN1cnNvclBvc2l0aW9uOiBSYW5nZSBub3QgaW4gZWxlbWVudCIpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IHByZUNhcmV0UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICBwcmVDYXJldFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50NCk7CiAgICAgIHByZUNhcmV0UmFuZ2Uuc2V0RW5kKHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIsIHNlbGVjdGlvbkluZm8uc3RhcnRPZmZzZXQpOwogICAgICBjb25zdCBwb3NpdGlvbjMgPSBwcmVDYXJldFJhbmdlLnRvU3RyaW5nKCkubGVuZ3RoOwogICAgICBjb25zb2xlLmxvZygiZ2V0Q3Vyc29yUG9zaXRpb246IENhbGN1bGF0ZWQgcG9zaXRpb246IiwgewogICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbjMsCiAgICAgICAgcHJlQ2FyZXRUZXh0OiBwcmVDYXJldFJhbmdlLnRvU3RyaW5nKCksCiAgICAgICAgZWxlbWVudFRleHQ6IGVsZW1lbnQ0LnRleHRDb250ZW50LAogICAgICAgIGVsZW1lbnRUZXh0TGVuZ3RoOiBlbGVtZW50NC50ZXh0Q29udGVudD8ubGVuZ3RoCiAgICAgIH0pOwogICAgICByZXR1cm4gcG9zaXRpb24zOwogICAgfQogICAgZ2V0Q29udGVudCgpIHsKICAgICAgY29uc3QgaGFuZGxlcjIgPSBCbG9ja1JlZ2lzdHJ5LmdldEhhbmRsZXIodGhpcy5ibG9jay50eXBlKTsKICAgICAgaWYgKGhhbmRsZXIyICYmIGhhbmRsZXIyLmdldENvbnRlbnQpIHsKICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi53eXNpd3lnLWJsb2NrLWNvbnRhaW5lciIpOwogICAgICAgIGNvbnN0IGNvbnRleHQyID0geyBzaGFkb3dSb290OiB0aGlzLnNoYWRvd1Jvb3QsIGNvbXBvbmVudDogdGhpcyB9OwogICAgICAgIHJldHVybiBoYW5kbGVyMi5nZXRDb250ZW50KGNvbnRhaW5lciwgY29udGV4dDIpOwogICAgICB9CiAgICAgIGNvbnN0IGVkaXRhYmxlRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmJsb2NrIik7CiAgICAgIGlmICghZWRpdGFibGVFbGVtZW50KQogICAgICAgIHJldHVybiAiIjsKICAgICAgY29uc3QgY29udGVudDMgPSBlZGl0YWJsZUVsZW1lbnQuaW5uZXJIVE1MIHx8ICIiOwogICAgICBjb25zb2xlLmxvZygiR2V0dGluZyBjb250ZW50IGZyb20gYmxvY2s6IiwgY29udGVudDMpOwogICAgICByZXR1cm4gY29udGVudDM7CiAgICB9CiAgICBzZXRDb250ZW50KGNvbnRlbnQzKSB7CiAgICAgIGNvbnN0IGhhbmRsZXIyID0gQmxvY2tSZWdpc3RyeS5nZXRIYW5kbGVyKHRoaXMuYmxvY2sudHlwZSk7CiAgICAgIGlmIChoYW5kbGVyMiAmJiBoYW5kbGVyMi5zZXRDb250ZW50KSB7CiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIud3lzaXd5Zy1ibG9jay1jb250YWluZXIiKTsKICAgICAgICBjb25zdCBjb250ZXh0MiA9IHsgc2hhZG93Um9vdDogdGhpcy5zaGFkb3dSb290LCBjb21wb25lbnQ6IHRoaXMgfTsKICAgICAgICByZXR1cm4gaGFuZGxlcjIuc2V0Q29udGVudChjb250YWluZXIsIGNvbnRlbnQzLCBjb250ZXh0Mik7CiAgICAgIH0KICAgICAgY29uc3QgZWRpdGFibGVFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuYmxvY2siKTsKICAgICAgaWYgKCFlZGl0YWJsZUVsZW1lbnQpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBoYWRGb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGVkaXRhYmxlRWxlbWVudCB8fCB0aGlzLnNoYWRvd1Jvb3Q/LmFjdGl2ZUVsZW1lbnQgPT09IGVkaXRhYmxlRWxlbWVudDsKICAgICAgZWRpdGFibGVFbGVtZW50LmlubmVySFRNTCA9IGNvbnRlbnQzOwogICAgICBpZiAoaGFkRm9jdXMpIHsKICAgICAgICBlZGl0YWJsZUVsZW1lbnQuZm9jdXMoKTsKICAgICAgfQogICAgfQogICAgc2V0Q3Vyc29yVG9TdGFydCgpIHsKICAgICAgY29uc3QgaGFuZGxlcjIgPSBCbG9ja1JlZ2lzdHJ5LmdldEhhbmRsZXIodGhpcy5ibG9jay50eXBlKTsKICAgICAgaWYgKGhhbmRsZXIyICYmIGhhbmRsZXIyLnNldEN1cnNvclRvU3RhcnQpIHsKICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi53eXNpd3lnLWJsb2NrLWNvbnRhaW5lciIpOwogICAgICAgIGNvbnN0IGNvbnRleHQyID0geyBzaGFkb3dSb290OiB0aGlzLnNoYWRvd1Jvb3QsIGNvbXBvbmVudDogdGhpcyB9OwogICAgICAgIHJldHVybiBoYW5kbGVyMi5zZXRDdXJzb3JUb1N0YXJ0KGNvbnRhaW5lciwgY29udGV4dDIpOwogICAgICB9CiAgICAgIGNvbnN0IGVkaXRhYmxlRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmJsb2NrIik7CiAgICAgIGlmIChlZGl0YWJsZUVsZW1lbnQpIHsKICAgICAgICBXeXNpd3lnQmxvY2tzLnNldEN1cnNvclRvU3RhcnQoZWRpdGFibGVFbGVtZW50KTsKICAgICAgfQogICAgfQogICAgc2V0Q3Vyc29yVG9FbmQoKSB7CiAgICAgIGNvbnN0IGhhbmRsZXIyID0gQmxvY2tSZWdpc3RyeS5nZXRIYW5kbGVyKHRoaXMuYmxvY2sudHlwZSk7CiAgICAgIGlmIChoYW5kbGVyMiAmJiBoYW5kbGVyMi5zZXRDdXJzb3JUb0VuZCkgewogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnd5c2l3eWctYmxvY2stY29udGFpbmVyIik7CiAgICAgICAgY29uc3QgY29udGV4dDIgPSB7IHNoYWRvd1Jvb3Q6IHRoaXMuc2hhZG93Um9vdCwgY29tcG9uZW50OiB0aGlzIH07CiAgICAgICAgcmV0dXJuIGhhbmRsZXIyLnNldEN1cnNvclRvRW5kKGNvbnRhaW5lciwgY29udGV4dDIpOwogICAgICB9CiAgICAgIGNvbnN0IGVkaXRhYmxlRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmJsb2NrIik7CiAgICAgIGlmIChlZGl0YWJsZUVsZW1lbnQpIHsKICAgICAgICBXeXNpd3lnQmxvY2tzLnNldEN1cnNvclRvRW5kKGVkaXRhYmxlRWxlbWVudCk7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogR2V0IGNvbnRleHQgbWVudSBpdGVtcyBmb3IgdGhpcyBibG9jawogICAgICovCiAgICBnZXRDb250ZXh0TWVudUl0ZW1zKCkgewogICAgICBpZiAoIXRoaXMuYmxvY2sgfHwgdGhpcy5ibG9jay50eXBlID09PSAiZGl2aWRlciIpIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgICAgY29uc3QgYmxvY2tUeXBlcyA9IFd5c2l3eWdTaG9ydGN1dHMuZ2V0U2xhc2hNZW51SXRlbXMoKTsKICAgICAgY29uc3QgY3VycmVudFR5cGUgPSB0aGlzLmJsb2NrLnR5cGU7CiAgICAgIGNvbnN0IHd5c2l3eWdDb21wb25lbnQgPSB0aGlzLnd5c2l3eWdDb21wb25lbnQ7CiAgICAgIGNvbnN0IGJsb2NrSWQgPSB0aGlzLmJsb2NrLmlkOwogICAgICBjb25zdCBibG9ja1R5cGVJdGVtcyA9IGJsb2NrVHlwZXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnR5cGUgIT09IGN1cnJlbnRUeXBlICYmIGl0ZW0udHlwZSAhPT0gImRpdmlkZXIiKS5tYXAoKGl0ZW0pID0+ICh7CiAgICAgICAgbmFtZTogaXRlbS5sYWJlbCwKICAgICAgICBpY29uTmFtZTogaXRlbS5pY29uLnJlcGxhY2UoImx1Y2lkZToiLCAiIiksCiAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICBpZiAod3lzaXd5Z0NvbXBvbmVudCAmJiB3eXNpd3lnQ29tcG9uZW50LmJsb2NrT3BlcmF0aW9ucykgewogICAgICAgICAgICBjb25zdCBibG9ja1RvVHJhbnNmb3JtID0gd3lzaXd5Z0NvbXBvbmVudC5ibG9ja3MuZmluZCgoYjYpID0+IGI2LmlkID09PSBibG9ja0lkKTsKICAgICAgICAgICAgaWYgKGJsb2NrVG9UcmFuc2Zvcm0pIHsKICAgICAgICAgICAgICBibG9ja1RvVHJhbnNmb3JtLnR5cGUgPSBpdGVtLnR5cGU7CiAgICAgICAgICAgICAgYmxvY2tUb1RyYW5zZm9ybS5jb250ZW50ID0gYmxvY2tUb1RyYW5zZm9ybS5jb250ZW50IHx8ICIiOwogICAgICAgICAgICAgIGlmIChpdGVtLnR5cGUgPT09ICJjb2RlIikgewogICAgICAgICAgICAgICAgYmxvY2tUb1RyYW5zZm9ybS5tZXRhZGF0YSA9IHsgbGFuZ3VhZ2U6ICJ0eXBlc2NyaXB0IiB9OwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAibGlzdCIpIHsKICAgICAgICAgICAgICAgIGJsb2NrVG9UcmFuc2Zvcm0ubWV0YWRhdGEgPSB7IGxpc3RUeXBlOiAiYnVsbGV0IiB9OwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAiaW1hZ2UiKSB7CiAgICAgICAgICAgICAgICBibG9ja1RvVHJhbnNmb3JtLmNvbnRlbnQgPSAiIjsKICAgICAgICAgICAgICAgIGJsb2NrVG9UcmFuc2Zvcm0ubWV0YWRhdGEgPSB7IHVybDogIiIsIGxvYWRpbmc6IGZhbHNlIH07CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09ICJ5b3V0dWJlIikgewogICAgICAgICAgICAgICAgYmxvY2tUb1RyYW5zZm9ybS5jb250ZW50ID0gIiI7CiAgICAgICAgICAgICAgICBibG9ja1RvVHJhbnNmb3JtLm1ldGFkYXRhID0geyB2aWRlb0lkOiAiIiwgdXJsOiAiIiB9OwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAibWFya2Rvd24iKSB7CiAgICAgICAgICAgICAgICBibG9ja1RvVHJhbnNmb3JtLm1ldGFkYXRhID0geyBzaG93UHJldmlldzogZmFsc2UgfTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gImh0bWwiKSB7CiAgICAgICAgICAgICAgICBibG9ja1RvVHJhbnNmb3JtLm1ldGFkYXRhID0geyBzaG93UHJldmlldzogZmFsc2UgfTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gImF0dGFjaG1lbnQiKSB7CiAgICAgICAgICAgICAgICBibG9ja1RvVHJhbnNmb3JtLmNvbnRlbnQgPSAiIjsKICAgICAgICAgICAgICAgIGJsb2NrVG9UcmFuc2Zvcm0ubWV0YWRhdGEgPSB7IGZpbGVzOiBbXSB9OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB3eXNpd3lnQ29tcG9uZW50LnVwZGF0ZUJsb2NrRWxlbWVudChibG9ja0lkKTsKICAgICAgICAgICAgICB3eXNpd3lnQ29tcG9uZW50LnVwZGF0ZVZhbHVlKCk7CiAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICAgICAgICAgIHd5c2l3eWdDb21wb25lbnQuYmxvY2tPcGVyYXRpb25zLmZvY3VzQmxvY2soYmxvY2tJZCk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pKTsKICAgICAgY29uc3QgbWVudUl0ZW1zID0gWwogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJDaGFuZ2UgVHlwZSIsCiAgICAgICAgICBpY29uTmFtZTogInR5cGUiLAogICAgICAgICAgc3VibWVudTogYmxvY2tUeXBlSXRlbXMKICAgICAgICB9CiAgICAgIF07CiAgICAgIGlmICghWyJpbWFnZSIsICJkaXZpZGVyIiwgInlvdXR1YmUiLCAiYXR0YWNobWVudCJdLmluY2x1ZGVzKHRoaXMuYmxvY2sudHlwZSkpIHsKICAgICAgICBtZW51SXRlbXMucHVzaCh7IGRpdmlkZXI6IHRydWUgfSwgewogICAgICAgICAgbmFtZTogIkN1dCIsCiAgICAgICAgICBpY29uTmFtZTogInNjaXNzb3JzIiwKICAgICAgICAgIHNob3J0Y3V0OiAiQ21kK1giLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCJjdXQiKTsKICAgICAgICAgIH0KICAgICAgICB9LCB7CiAgICAgICAgICBuYW1lOiAiQ29weSIsCiAgICAgICAgICBpY29uTmFtZTogImNvcHkiLAogICAgICAgICAgc2hvcnRjdXQ6ICJDbWQrQyIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoImNvcHkiKTsKICAgICAgICAgIH0KICAgICAgICB9LCB7CiAgICAgICAgICBuYW1lOiAiUGFzdGUiLAogICAgICAgICAgaWNvbk5hbWU6ICJjbGlwYm9hcmQiLAogICAgICAgICAgc2hvcnRjdXQ6ICJDbWQrViIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoInBhc3RlIik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgbWVudUl0ZW1zLnB1c2goeyBkaXZpZGVyOiB0cnVlIH0sIHsKICAgICAgICBuYW1lOiAiRGVsZXRlIEJsb2NrIiwKICAgICAgICBpY29uTmFtZTogInRyYXNoMiIsCiAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICBpZiAod3lzaXd5Z0NvbXBvbmVudCAmJiB3eXNpd3lnQ29tcG9uZW50LmJsb2NrT3BlcmF0aW9ucykgewogICAgICAgICAgICB3eXNpd3lnQ29tcG9uZW50LmJsb2NrT3BlcmF0aW9ucy5kZWxldGVCbG9jayhibG9ja0lkKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gbWVudUl0ZW1zOwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIGNvbnRlbnQgc3BsaXQgYXQgY3Vyc29yIHBvc2l0aW9uCiAgICAgKi8KICAgIGdldFNwbGl0Q29udGVudCgpIHsKICAgICAgY29uc29sZS5sb2coImdldFNwbGl0Q29udGVudDogU3RhcnRpbmcuLi4iKTsKICAgICAgY29uc3QgaGFuZGxlcjIgPSBCbG9ja1JlZ2lzdHJ5LmdldEhhbmRsZXIodGhpcy5ibG9jay50eXBlKTsKICAgICAgY29uc29sZS5sb2coImdldFNwbGl0Q29udGVudDogQ2hlY2tpbmcgZm9yIGhhbmRsZXIiLCB7CiAgICAgICAgYmxvY2tUeXBlOiB0aGlzLmJsb2NrLnR5cGUsCiAgICAgICAgaGFzSGFuZGxlcjogISFoYW5kbGVyMiwKICAgICAgICBoYXNTcGxpdE1ldGhvZDogISEoaGFuZGxlcjIgJiYgaGFuZGxlcjIuZ2V0U3BsaXRDb250ZW50KQogICAgICB9KTsKICAgICAgaWYgKGhhbmRsZXIyICYmIGhhbmRsZXIyLmdldFNwbGl0Q29udGVudCkgewogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnd5c2l3eWctYmxvY2stY29udGFpbmVyIik7CiAgICAgICAgY29uc29sZS5sb2coImdldFNwbGl0Q29udGVudDogRm91bmQgY29udGFpbmVyIiwgewogICAgICAgICAgY29udGFpbmVyOiAhIWNvbnRhaW5lciwKICAgICAgICAgIGNvbnRhaW5lckhUTUw6IGNvbnRhaW5lcj8uaW5uZXJIVE1MPy5zdWJzdHJpbmcoMCwgMTAwKQogICAgICAgIH0pOwogICAgICAgIGNvbnN0IGNvbnRleHQyID0gewogICAgICAgICAgc2hhZG93Um9vdDogdGhpcy5zaGFkb3dSb290LAogICAgICAgICAgY29tcG9uZW50OiB0aGlzCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gaGFuZGxlcjIuZ2V0U3BsaXRDb250ZW50KGNvbnRhaW5lciwgY29udGV4dDIpOwogICAgICB9CiAgICAgIGNvbnN0IGVkaXRhYmxlRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmJsb2NrIik7CiAgICAgIGlmICghZWRpdGFibGVFbGVtZW50KSB7CiAgICAgICAgY29uc29sZS5sb2coImdldFNwbGl0Q29udGVudDogTm8gZWRpdGFibGUgZWxlbWVudCBmb3VuZCIpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnNvbGUubG9nKCJnZXRTcGxpdENvbnRlbnQ6IEVsZW1lbnQgaW5mbzoiLCB7CiAgICAgICAgYmxvY2tUeXBlOiB0aGlzLmJsb2NrLnR5cGUsCiAgICAgICAgaW5uZXJIVE1MOiBlZGl0YWJsZUVsZW1lbnQuaW5uZXJIVE1MLAogICAgICAgIHRleHRDb250ZW50OiBlZGl0YWJsZUVsZW1lbnQudGV4dENvbnRlbnQsCiAgICAgICAgdGV4dExlbmd0aDogZWRpdGFibGVFbGVtZW50LnRleHRDb250ZW50Py5sZW5ndGgKICAgICAgfSk7CiAgICAgIGNvbnN0IHBhcmVudENvbXBvbmVudCA9IHRoaXMuY2xvc2VzdCgiZGVlcy1pbnB1dC13eXNpd3lnIik7CiAgICAgIGNvbnN0IHBhcmVudFNoYWRvd1Jvb3QgPSBwYXJlbnRDb21wb25lbnQ/LnNoYWRvd1Jvb3Q7CiAgICAgIGNvbnN0IHNoYWRvd1Jvb3RzID0gW107CiAgICAgIGlmIChwYXJlbnRTaGFkb3dSb290KQogICAgICAgIHNoYWRvd1Jvb3RzLnB1c2gocGFyZW50U2hhZG93Um9vdCk7CiAgICAgIGlmICh0aGlzLnNoYWRvd1Jvb3QpCiAgICAgICAgc2hhZG93Um9vdHMucHVzaCh0aGlzLnNoYWRvd1Jvb3QpOwogICAgICBjb25zdCBzZWxlY3Rpb25JbmZvID0gV3lzaXd5Z1NlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvKC4uLnNoYWRvd1Jvb3RzKTsKICAgICAgY29uc29sZS5sb2coImdldFNwbGl0Q29udGVudDogU2VsZWN0aW9uIGluZm8gZnJvbSBzaGFkb3cgRE9NczoiLCB7CiAgICAgICAgc2VsZWN0aW9uSW5mbywKICAgICAgICBzaGFkb3dSb290c0NvdW50OiBzaGFkb3dSb290cy5sZW5ndGgKICAgICAgfSk7CiAgICAgIGlmICghc2VsZWN0aW9uSW5mbykgewogICAgICAgIGNvbnNvbGUubG9nKCJnZXRTcGxpdENvbnRlbnQ6IE5vIHNlbGVjdGlvbiwgdXNpbmcgbGFzdCBrbm93biBwb3NpdGlvbjoiLCB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uKTsKICAgICAgICBpZiAodGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiAhPT0gbnVsbCkgewogICAgICAgICAgY29uc3QgZnVsbFRleHQgPSBlZGl0YWJsZUVsZW1lbnQudGV4dENvbnRlbnQgfHwgIiI7CiAgICAgICAgICBjb25zdCBwb3MgPSBNYXRoLm1pbih0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uLCBmdWxsVGV4dC5sZW5ndGgpOwogICAgICAgICAgY29uc29sZS5sb2coImdldFNwbGl0Q29udGVudDogU3BsaXR0aW5nIHdpdGggbGFzdCBrbm93biBwb3NpdGlvbjoiLCB7CiAgICAgICAgICAgIHBvcywKICAgICAgICAgICAgZnVsbFRleHRMZW5ndGg6IGZ1bGxUZXh0Lmxlbmd0aCwKICAgICAgICAgICAgYmVmb3JlOiBmdWxsVGV4dC5zdWJzdHJpbmcoMCwgcG9zKSwKICAgICAgICAgICAgYWZ0ZXI6IGZ1bGxUZXh0LnN1YnN0cmluZyhwb3MpCiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGJlZm9yZTogZnVsbFRleHQuc3Vic3RyaW5nKDAsIHBvcyksCiAgICAgICAgICAgIGFmdGVyOiBmdWxsVGV4dC5zdWJzdHJpbmcocG9zKQogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc29sZS5sb2coImdldFNwbGl0Q29udGVudDogU2VsZWN0aW9uIHJhbmdlOiIsIHsKICAgICAgICBzdGFydENvbnRhaW5lcjogc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lciwKICAgICAgICBzdGFydE9mZnNldDogc2VsZWN0aW9uSW5mby5zdGFydE9mZnNldCwKICAgICAgICBzdGFydENvbnRhaW5lckluRWxlbWVudDogZWRpdGFibGVFbGVtZW50LmNvbnRhaW5zKHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIpCiAgICAgIH0pOwogICAgICBpZiAoIVd5c2l3eWdTZWxlY3Rpb24uY29udGFpbnNBY3Jvc3NTaGFkb3dET00oZWRpdGFibGVFbGVtZW50LCBzZWxlY3Rpb25JbmZvLnN0YXJ0Q29udGFpbmVyKSkgewogICAgICAgIGNvbnNvbGUubG9nKCJnZXRTcGxpdENvbnRlbnQ6IFNlbGVjdGlvbiBub3QgaW4gdGhpcyBibG9jaywgdXNpbmcgbGFzdCBrbm93biBwb3NpdGlvbjoiLCB0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uKTsKICAgICAgICBpZiAodGhpcy5sYXN0S25vd25DdXJzb3JQb3NpdGlvbiAhPT0gbnVsbCkgewogICAgICAgICAgY29uc3QgZnVsbFRleHQgPSBlZGl0YWJsZUVsZW1lbnQudGV4dENvbnRlbnQgfHwgIiI7CiAgICAgICAgICBjb25zdCBwb3MgPSBNYXRoLm1pbih0aGlzLmxhc3RLbm93bkN1cnNvclBvc2l0aW9uLCBmdWxsVGV4dC5sZW5ndGgpOwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgYmVmb3JlOiBmdWxsVGV4dC5zdWJzdHJpbmcoMCwgcG9zKSwKICAgICAgICAgICAgYWZ0ZXI6IGZ1bGxUZXh0LnN1YnN0cmluZyhwb3MpCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBjdXJzb3JQb3MgPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGVkaXRhYmxlRWxlbWVudCk7CiAgICAgIGNvbnNvbGUubG9nKCJnZXRTcGxpdENvbnRlbnQ6IEN1cnNvciBwb3NpdGlvbiBmb3IgSFRNTCBzcGxpdDoiLCBjdXJzb3JQb3MpOwogICAgICBpZiAoY3Vyc29yUG9zID09PSBudWxsIHx8IGN1cnNvclBvcyA9PT0gMCkgewogICAgICAgIGNvbnNvbGUubG9nKCJnZXRTcGxpdENvbnRlbnQ6IEN1cnNvciBhdCBzdGFydCBvciBudWxsLCBtb3ZpbmcgYWxsIGNvbnRlbnQiKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgYmVmb3JlOiAiIiwKICAgICAgICAgIGFmdGVyOiBlZGl0YWJsZUVsZW1lbnQuaW5uZXJIVE1MCiAgICAgICAgfTsKICAgICAgfQogICAgICBjb25zdCBiZWZvcmVSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgIGNvbnN0IGFmdGVyUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICBiZWZvcmVSYW5nZS5zZXRTdGFydChlZGl0YWJsZUVsZW1lbnQsIDApOwogICAgICBiZWZvcmVSYW5nZS5zZXRFbmQoc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lciwgc2VsZWN0aW9uSW5mby5zdGFydE9mZnNldCk7CiAgICAgIGFmdGVyUmFuZ2Uuc2V0U3RhcnQoc2VsZWN0aW9uSW5mby5zdGFydENvbnRhaW5lciwgc2VsZWN0aW9uSW5mby5zdGFydE9mZnNldCk7CiAgICAgIGFmdGVyUmFuZ2Uuc2V0RW5kKGVkaXRhYmxlRWxlbWVudCwgZWRpdGFibGVFbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoKTsKICAgICAgY29uc3QgYmVmb3JlRnJhZ21lbnQgPSBiZWZvcmVSYW5nZS5jbG9uZUNvbnRlbnRzKCk7CiAgICAgIGNvbnN0IGFmdGVyRnJhZ21lbnQgPSBhZnRlclJhbmdlLmNsb25lQ29udGVudHMoKTsKICAgICAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICB0ZW1wRGl2LmFwcGVuZENoaWxkKGJlZm9yZUZyYWdtZW50KTsKICAgICAgY29uc3QgYmVmb3JlSHRtbCA9IHRlbXBEaXYuaW5uZXJIVE1MOwogICAgICB0ZW1wRGl2LmlubmVySFRNTCA9ICIiOwogICAgICB0ZW1wRGl2LmFwcGVuZENoaWxkKGFmdGVyRnJhZ21lbnQpOwogICAgICBjb25zdCBhZnRlckh0bWwgPSB0ZW1wRGl2LmlubmVySFRNTDsKICAgICAgY29uc29sZS5sb2coImdldFNwbGl0Q29udGVudDogRmluYWwgc3BsaXQgcmVzdWx0OiIsIHsKICAgICAgICBjdXJzb3JQb3MsCiAgICAgICAgYmVmb3JlSHRtbCwKICAgICAgICBiZWZvcmVMZW5ndGg6IGJlZm9yZUh0bWwubGVuZ3RoLAogICAgICAgIGJlZm9yZUh0bWxQcmV2aWV3OiBiZWZvcmVIdG1sLnN1YnN0cmluZygwLCAxMDApICsgKGJlZm9yZUh0bWwubGVuZ3RoID4gMTAwID8gIi4uLiIgOiAiIiksCiAgICAgICAgYWZ0ZXJIdG1sLAogICAgICAgIGFmdGVyTGVuZ3RoOiBhZnRlckh0bWwubGVuZ3RoLAogICAgICAgIGFmdGVySHRtbFByZXZpZXc6IGFmdGVySHRtbC5zdWJzdHJpbmcoMCwgMTAwKSArIChhZnRlckh0bWwubGVuZ3RoID4gMTAwID8gIi4uLiIgOiAiIikKICAgICAgfSk7CiAgICAgIHJldHVybiB7CiAgICAgICAgYmVmb3JlOiBiZWZvcmVIdG1sLAogICAgICAgIGFmdGVyOiBhZnRlckh0bWwKICAgICAgfTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMzcoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNXeXNpd3lnQmxvY2syID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXd5c2l3eWcvZGVlcy1pbnB1dC13eXNpd3lnLmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTM3ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMzOCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0lucHV0V3lzaXd5ZyA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1pbnB1dC13eXNpd3lnIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNJbnB1dEJhc2U7CiAgbGV0IF92YWx1ZV9kZWNvcmF0b3JzOwogIGxldCBfdmFsdWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWx1ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfb3V0cHV0Rm9ybWF0X2RlY29yYXRvcnM7CiAgbGV0IF9vdXRwdXRGb3JtYXRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vdXRwdXRGb3JtYXRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Jsb2Nrc19kZWNvcmF0b3JzOwogIGxldCBfYmxvY2tzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYmxvY2tzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnZ2VkQmxvY2tJZF9kZWNvcmF0b3JzOwogIGxldCBfZHJhZ2dlZEJsb2NrSWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnZ2VkQmxvY2tJZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZHJhZ092ZXJCbG9ja0lkX2RlY29yYXRvcnM7CiAgbGV0IF9kcmFnT3ZlckJsb2NrSWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnT3ZlckJsb2NrSWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RyYWdPdmVyUG9zaXRpb25fZGVjb3JhdG9yczsKICBsZXQgX2RyYWdPdmVyUG9zaXRpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnT3ZlclBvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZFRleHRfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkVGV4dF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkVGV4dF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW5wdXRXeXNpd3lnMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3ZhbHVlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfb3V0cHV0Rm9ybWF0X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfYmxvY2tzX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9kcmFnZ2VkQmxvY2tJZF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfZHJhZ092ZXJCbG9ja0lkX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9kcmFnT3ZlclBvc2l0aW9uX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9zZWxlY3RlZFRleHRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlMzcodGhpcywgbnVsbCwgX3ZhbHVlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZhbHVlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ2YWx1ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai52YWx1ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudmFsdWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzNyh0aGlzLCBudWxsLCBfb3V0cHV0Rm9ybWF0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm91dHB1dEZvcm1hdCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAib3V0cHV0Rm9ybWF0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm91dHB1dEZvcm1hdCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoub3V0cHV0Rm9ybWF0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX291dHB1dEZvcm1hdF9pbml0aWFsaXplcnMsIF9vdXRwdXRGb3JtYXRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzNyh0aGlzLCBudWxsLCBfYmxvY2tzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImJsb2NrcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYmxvY2tzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmJsb2Nrcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYmxvY2tzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Jsb2Nrc19pbml0aWFsaXplcnMsIF9ibG9ja3NfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzNyh0aGlzLCBudWxsLCBfZHJhZ2dlZEJsb2NrSWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZHJhZ2dlZEJsb2NrSWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRyYWdnZWRCbG9ja0lkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRyYWdnZWRCbG9ja0lkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kcmFnZ2VkQmxvY2tJZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kcmFnZ2VkQmxvY2tJZF9pbml0aWFsaXplcnMsIF9kcmFnZ2VkQmxvY2tJZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM3KHRoaXMsIG51bGwsIF9kcmFnT3ZlckJsb2NrSWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZHJhZ092ZXJCbG9ja0lkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkcmFnT3ZlckJsb2NrSWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZHJhZ092ZXJCbG9ja0lkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kcmFnT3ZlckJsb2NrSWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZHJhZ092ZXJCbG9ja0lkX2luaXRpYWxpemVycywgX2RyYWdPdmVyQmxvY2tJZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM3KHRoaXMsIG51bGwsIF9kcmFnT3ZlclBvc2l0aW9uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImRyYWdPdmVyUG9zaXRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRyYWdPdmVyUG9zaXRpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZHJhZ092ZXJQb3NpdGlvbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZHJhZ092ZXJQb3NpdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kcmFnT3ZlclBvc2l0aW9uX2luaXRpYWxpemVycywgX2RyYWdPdmVyUG9zaXRpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzNyh0aGlzLCBudWxsLCBfc2VsZWN0ZWRUZXh0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlbGVjdGVkVGV4dCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0ZWRUZXh0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGVkVGV4dCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VsZWN0ZWRUZXh0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGVkVGV4dF9pbml0aWFsaXplcnMsIF9zZWxlY3RlZFRleHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzNyhudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNJbnB1dFd5c2l3eWcyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMyNjsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJJbnB1dCIsICJXb3Jrc3BhY2UiXTsKICAgICN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnMzOCh0aGlzLCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI291dHB1dEZvcm1hdF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzgodGhpcywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMzOCh0aGlzLCBfb3V0cHV0Rm9ybWF0X2luaXRpYWxpemVycywgImh0bWwiKSk7CiAgICBnZXQgb3V0cHV0Rm9ybWF0KCkgewogICAgICByZXR1cm4gdGhpcy4jb3V0cHV0Rm9ybWF0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgb3V0cHV0Rm9ybWF0KHZhbHVlMikgewogICAgICB0aGlzLiNvdXRwdXRGb3JtYXRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNibG9ja3NfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM4KHRoaXMsIF9vdXRwdXRGb3JtYXRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM4KHRoaXMsIF9ibG9ja3NfaW5pdGlhbGl6ZXJzLCBbCiAgICAgIHsKICAgICAgICBpZDogV3lzaXd5Z1Nob3J0Y3V0cy5nZW5lcmF0ZUJsb2NrSWQoKSwKICAgICAgICB0eXBlOiAicGFyYWdyYXBoIiwKICAgICAgICBjb250ZW50OiAiIgogICAgICB9CiAgICBdKSk7CiAgICBnZXQgYmxvY2tzKCkgewogICAgICByZXR1cm4gdGhpcy4jYmxvY2tzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYmxvY2tzKHZhbHVlMikgewogICAgICB0aGlzLiNibG9ja3NfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIC8vIE5vdCB1c2luZyBAc3RhdGUgdG8gYXZvaWQgcmUtcmVuZGVycyB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzCiAgICBzZWxlY3RlZEJsb2NrSWQgPSAoX19ydW5Jbml0aWFsaXplcnMzOCh0aGlzLCBfYmxvY2tzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgbnVsbCk7CiAgICAvLyBTbGFzaCBtZW51IGlzIG5vdyBnbG9iYWxseSByZW5kZXJlZAogICAgc2xhc2hNZW51ID0gRGVlc1NsYXNoTWVudS5nZXRJbnN0YW5jZSgpOwogICAgI2RyYWdnZWRCbG9ja0lkX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczM4KHRoaXMsIF9kcmFnZ2VkQmxvY2tJZF9pbml0aWFsaXplcnMsIG51bGwpOwogICAgZ2V0IGRyYWdnZWRCbG9ja0lkKCkgewogICAgICByZXR1cm4gdGhpcy4jZHJhZ2dlZEJsb2NrSWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkcmFnZ2VkQmxvY2tJZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZHJhZ2dlZEJsb2NrSWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNkcmFnT3ZlckJsb2NrSWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM4KHRoaXMsIF9kcmFnZ2VkQmxvY2tJZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzgodGhpcywgX2RyYWdPdmVyQmxvY2tJZF9pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIGdldCBkcmFnT3ZlckJsb2NrSWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNkcmFnT3ZlckJsb2NrSWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkcmFnT3ZlckJsb2NrSWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2RyYWdPdmVyQmxvY2tJZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2RyYWdPdmVyUG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM4KHRoaXMsIF9kcmFnT3ZlckJsb2NrSWRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM4KHRoaXMsIF9kcmFnT3ZlclBvc2l0aW9uX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IGRyYWdPdmVyUG9zaXRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNkcmFnT3ZlclBvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZHJhZ092ZXJQb3NpdGlvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jZHJhZ092ZXJQb3NpdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgLy8gRm9ybWF0dGluZyBtZW51IGlzIG5vdyBnbG9iYWxseSByZW5kZXJlZAogICAgZm9ybWF0dGluZ01lbnUgPSAoX19ydW5Jbml0aWFsaXplcnMzOCh0aGlzLCBfZHJhZ092ZXJQb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyksIERlZXNGb3JtYXR0aW5nTWVudS5nZXRJbnN0YW5jZSgpKTsKICAgICNzZWxlY3RlZFRleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMzgodGhpcywgX3NlbGVjdGVkVGV4dF9pbml0aWFsaXplcnMsICIiKTsKICAgIGdldCBzZWxlY3RlZFRleHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZFRleHRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3RlZFRleHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlbGVjdGVkVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgZWRpdG9yQ29udGVudFJlZiA9IF9fcnVuSW5pdGlhbGl6ZXJzMzgodGhpcywgX3NlbGVjdGVkVGV4dF9leHRyYUluaXRpYWxpemVycyk7CiAgICBpc0NvbXBvc2luZyA9IGZhbHNlOwogICAgLy8gSGFuZGxlciBpbnN0YW5jZXMKICAgIGJsb2NrT3BlcmF0aW9uczsKICAgIGlucHV0SGFuZGxlcjsKICAgIGtleWJvYXJkSGFuZGxlcjsKICAgIGRyYWdEcm9wSGFuZGxlcjsKICAgIGhpc3Rvcnk7CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIC4uLkRlZXNJbnB1dEJhc2UuYmFzZVN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICB3eXNpd3lnU3R5bGVzCiAgICBdOwogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zID0gbmV3IFd5c2l3eWdCbG9ja09wZXJhdGlvbnModGhpcyk7CiAgICAgIHRoaXMuaW5wdXRIYW5kbGVyID0gbmV3IFd5c2l3eWdJbnB1dEhhbmRsZXIodGhpcyk7CiAgICAgIHRoaXMua2V5Ym9hcmRIYW5kbGVyID0gbmV3IFd5c2l3eWdLZXlib2FyZEhhbmRsZXIodGhpcyk7CiAgICAgIHRoaXMuZHJhZ0Ryb3BIYW5kbGVyID0gbmV3IFd5c2l3eWdEcmFnRHJvcEhhbmRsZXIodGhpcyk7CiAgICAgIHRoaXMuaGlzdG9yeSA9IG5ldyBXeXNpd3lnSGlzdG9yeSgpOwogICAgfQogICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgdGhpcy5pbnB1dEhhbmRsZXI/LmRlc3Ryb3koKTsKICAgICAgaWYgKHRoaXMuYmx1clRpbWVvdXQpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ibHVyVGltZW91dCk7CiAgICAgICAgdGhpcy5ibHVyVGltZW91dCA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZCgpIHsKICAgICAgaWYgKHRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZS50cmltKCkubGVuZ3RoID4gMCkgewogICAgICAgIGNvbnN0IHBhcnNlZEJsb2NrcyA9IHRoaXMub3V0cHV0Rm9ybWF0ID09PSAiaHRtbCIgPyBXeXNpd3lnQ29udmVydGVycy5wYXJzZUh0bWxUb0Jsb2Nrcyh0aGlzLnZhbHVlKSA6IFd5c2l3eWdDb252ZXJ0ZXJzLnBhcnNlTWFya2Rvd25Ub0Jsb2Nrcyh0aGlzLnZhbHVlKTsKICAgICAgICBpZiAocGFyc2VkQmxvY2tzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMuYmxvY2tzID0gcGFyc2VkQmxvY2tzOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLnVwZGF0ZVZhbHVlKCk7CiAgICAgIHRoaXMuZWRpdG9yQ29udGVudFJlZiA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuZWRpdG9yLWNvbnRlbnQiKTsKICAgICAgaWYgKHRoaXMuZWRpdG9yQ29udGVudFJlZikgewogICAgICAgIHRoaXMuZWRpdG9yQ29udGVudFJlZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIChlMTEpID0+IHRoaXMuaGFuZGxlRWRpdG9yQ2xpY2soZTExKSk7CiAgICAgIH0KICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCJibG9jay10ZXh0LXNlbGVjdGVkIiwgKGUxMSkgPT4gewogICAgICAgIGlmICghdGhpcy5zbGFzaE1lbnUudmlzaWJsZSAmJiBlMTEuZGV0YWlsLmhhc1NlbGVjdGlvbiAmJiBlMTEuZGV0YWlsLnRleHQubGVuZ3RoID4gMCkgewogICAgICAgICAgdGhpcy5zZWxlY3RlZFRleHQgPSBlMTEuZGV0YWlsLnRleHQ7CiAgICAgICAgICBpZiAoZTExLmRldGFpbC5yZWN0KSB7CiAgICAgICAgICAgIGNvbnN0IGNvb3JkcyA9IHsKICAgICAgICAgICAgICB4OiBlMTEuZGV0YWlsLnJlY3QubGVmdCArIGUxMS5kZXRhaWwucmVjdC53aWR0aCAvIDIsCiAgICAgICAgICAgICAgeTogTWF0aC5tYXgoNDUsIGUxMS5kZXRhaWwucmVjdC50b3AgLSA0NSkKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5mb3JtYXR0aW5nTWVudS5zaG93KGNvb3JkcywgYXN5bmMgKGNvbW1hbmQpID0+IGF3YWl0IHRoaXMuYXBwbHlGb3JtYXQoY29tbWFuZCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsIChlMTEpID0+IHsKICAgICAgICBjb25zdCBmb3JtYXR0aW5nTWVudUVsZW1lbnQgPSB0aGlzLmZvcm1hdHRpbmdNZW51LnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5mb3JtYXR0aW5nLW1lbnUiKTsKICAgICAgICBpZiAoZm9ybWF0dGluZ01lbnVFbGVtZW50ICYmIGZvcm1hdHRpbmdNZW51RWxlbWVudC5jb250YWlucyhlMTEudGFyZ2V0KSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24udG9TdHJpbmcoKS50cmltKCkubGVuZ3RoID4gMCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5mb3JtYXR0aW5nTWVudS52aXNpYmxlKSB7CiAgICAgICAgICB0aGlzLmhpZGVGb3JtYXR0aW5nTWVudSgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIChlMTEpID0+IHsKICAgICAgICBjb25zdCB0YXJnZXQgPSBlMTEudGFyZ2V0OwogICAgICAgIGlmICghdGhpcy5jb250YWlucyh0YXJnZXQpICYmICF0aGlzLnNoYWRvd1Jvb3Q/LmNvbnRhaW5zKHRhcmdldCkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKChlMTEubWV0YUtleSB8fCBlMTEuY3RybEtleSkgJiYgIWUxMS5zaGlmdEtleSAmJiBlMTEua2V5ID09PSAieiIpIHsKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgdGhpcy51bmRvKCk7CiAgICAgICAgfSBlbHNlIGlmICgoZTExLm1ldGFLZXkgfHwgZTExLmN0cmxLZXkpICYmIGUxMS5zaGlmdEtleSAmJiBlMTEua2V5ID09PSAieiIpIHsKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgdGhpcy5yZWRvKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdGhpcy5oaXN0b3J5LnNhdmVTdGF0ZSh0aGlzLmJsb2NrcywgdGhpcy5zZWxlY3RlZEJsb2NrSWQpOwogICAgICB0aGlzLnJlbmRlckJsb2Nrc1Byb2dyYW1tYXRpY2FsbHkoKTsKICAgIH0KICAgIC8qKgogICAgICogUmVuZGVycyBhbGwgYmxvY2tzIHByb2dyYW1tYXRpY2FsbHkgd2l0aG91dCB0cmlnZ2VyaW5nIHJlLXJlbmRlcnMKICAgICAqLwogICAgcmVuZGVyQmxvY2tzUHJvZ3JhbW1hdGljYWxseSgpIHsKICAgICAgaWYgKCF0aGlzLmVkaXRvckNvbnRlbnRSZWYpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLmVkaXRvckNvbnRlbnRSZWYuaW5uZXJIVE1MID0gIiI7CiAgICAgIHRoaXMuYmxvY2tzLmZvckVhY2goKGJsb2NrKSA9PiB7CiAgICAgICAgY29uc3QgYmxvY2tXcmFwcGVyID0gdGhpcy5jcmVhdGVCbG9ja0VsZW1lbnQoYmxvY2spOwogICAgICAgIHRoaXMuZWRpdG9yQ29udGVudFJlZi5hcHBlbmRDaGlsZChibG9ja1dyYXBwZXIpOwogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGJsb2NrIGVsZW1lbnQgcHJvZ3JhbW1hdGljYWxseQogICAgICovCiAgICBjcmVhdGVCbG9ja0VsZW1lbnQoYmxvY2spIHsKICAgICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICB3cmFwcGVyLmNsYXNzTmFtZSA9ICJibG9jay13cmFwcGVyIjsKICAgICAgd3JhcHBlci5zZXRBdHRyaWJ1dGUoImRhdGEtYmxvY2staWQiLCBibG9jay5pZCk7CiAgICAgIGlmIChibG9jay50eXBlICE9PSAiZGl2aWRlciIpIHsKICAgICAgICBjb25zdCBkcmFnSGFuZGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgZHJhZ0hhbmRsZS5jbGFzc05hbWUgPSAiZHJhZy1oYW5kbGUiOwogICAgICAgIGRyYWdIYW5kbGUuZHJhZ2dhYmxlID0gdHJ1ZTsKICAgICAgICBkcmFnSGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdzdGFydCIsIChlMTEpID0+IHRoaXMuZHJhZ0Ryb3BIYW5kbGVyLmhhbmRsZURyYWdTdGFydChlMTEsIGJsb2NrKSk7CiAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChkcmFnSGFuZGxlKTsKICAgICAgfQogICAgICBjb25zdCBibG9ja0NvbXBvbmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgICBibG9ja0NvbXBvbmVudC5ibG9jayA9IGJsb2NrOwogICAgICBibG9ja0NvbXBvbmVudC5pc1NlbGVjdGVkID0gdGhpcy5zZWxlY3RlZEJsb2NrSWQgPT09IGJsb2NrLmlkOwogICAgICBibG9ja0NvbXBvbmVudC53eXNpd3lnQ29tcG9uZW50ID0gdGhpczsKICAgICAgYmxvY2tDb21wb25lbnQuaGFuZGxlcnMgPSB7CiAgICAgICAgb25JbnB1dDogKGUxMSkgPT4gdGhpcy5pbnB1dEhhbmRsZXIuaGFuZGxlQmxvY2tJbnB1dChlMTEsIGJsb2NrKSwKICAgICAgICBvbktleURvd246IChlMTEpID0+IHRoaXMua2V5Ym9hcmRIYW5kbGVyLmhhbmRsZUJsb2NrS2V5RG93bihlMTEsIGJsb2NrKSwKICAgICAgICBvbkZvY3VzOiAoKSA9PiB0aGlzLmhhbmRsZUJsb2NrRm9jdXMoYmxvY2spLAogICAgICAgIG9uQmx1cjogKCkgPT4gdGhpcy5oYW5kbGVCbG9ja0JsdXIoYmxvY2spLAogICAgICAgIG9uQ29tcG9zaXRpb25TdGFydDogKCkgPT4gdGhpcy5pc0NvbXBvc2luZyA9IHRydWUsCiAgICAgICAgb25Db21wb3NpdGlvbkVuZDogKCkgPT4gdGhpcy5pc0NvbXBvc2luZyA9IGZhbHNlLAogICAgICAgIG9uTW91c2VVcDogKGUxMSkgPT4gdGhpcy5oYW5kbGVUZXh0U2VsZWN0aW9uKGUxMSksCiAgICAgICAgb25SZXF1ZXN0VXBkYXRlOiAoKSA9PiB0aGlzLnVwZGF0ZUJsb2NrRWxlbWVudChibG9jay5pZCkKICAgICAgfTsKICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChibG9ja0NvbXBvbmVudCk7CiAgICAgIHdyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcigiZHJhZ292ZXIiLCAoZTExKSA9PiB0aGlzLmRyYWdEcm9wSGFuZGxlci5oYW5kbGVEcmFnT3ZlcihlMTEsIGJsb2NrKSk7CiAgICAgIHdyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcigiZHJvcCIsIChlMTEpID0+IHRoaXMuZHJhZ0Ryb3BIYW5kbGVyLmhhbmRsZURyb3AoZTExLCBibG9jaykpOwogICAgICB3cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdsZWF2ZSIsICgpID0+IHRoaXMuZHJhZ0Ryb3BIYW5kbGVyLmhhbmRsZURyYWdMZWF2ZShibG9jaykpOwogICAgICByZXR1cm4gd3JhcHBlcjsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlcyBhIHNwZWNpZmljIGJsb2NrIGVsZW1lbnQKICAgICAqLwogICAgdXBkYXRlQmxvY2tFbGVtZW50KGJsb2NrSWQpIHsKICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLmJsb2Nrcy5maW5kKChiNikgPT4gYjYuaWQgPT09IGJsb2NrSWQpOwogICAgICBpZiAoIWJsb2NrKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuZWRpdG9yQ29udGVudFJlZi5xdWVyeVNlbGVjdG9yKGBbZGF0YS1ibG9jay1pZD0iJHtibG9ja0lkfSJdYCk7CiAgICAgIGlmICghd3JhcHBlcikKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IG5ld1dyYXBwZXIgPSB0aGlzLmNyZWF0ZUJsb2NrRWxlbWVudChibG9jayk7CiAgICAgIHdyYXBwZXIucmVwbGFjZVdpdGgobmV3V3JhcHBlcik7CiAgICB9CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiB1M2AKICAgICAgPGRlZXMtbGFiZWwKICAgICAgICAubGFiZWw9IiR7dGhpcy5sYWJlbH0iCiAgICAgICAgLmRlc2NyaXB0aW9uPSIke3RoaXMuZGVzY3JpcHRpb259IgogICAgICAgIC5yZXF1aXJlZD0iJHt0aGlzLnJlcXVpcmVkfSIKICAgICAgPjwvZGVlcy1sYWJlbD4KICAgICAgPGRpdiBjbGFzcz0id3lzaXd5Zy1jb250YWluZXIiPgogICAgICAgIDxkaXYgCiAgICAgICAgICBjbGFzcz0iZWRpdG9yLWNvbnRlbnQgJHt0aGlzLmRyYWdnZWRCbG9ja0lkID8gImRyYWdnaW5nIiA6ICIifSIKICAgICAgICAgIGlkPSJlZGl0b3ItY29udGVudCIKICAgICAgICA+CiAgICAgICAgICA8IS0tIEJsb2NrcyB3aWxsIGJlIHJlbmRlcmVkIHByb2dyYW1tYXRpY2FsbHkgLS0+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIC8vIE9sZCByZW5kZXJCbG9jayBtZXRob2QgcmVtb3ZlZCAtIHVzaW5nIHByb2dyYW1tYXRpYyByZW5kZXJpbmcgaW5zdGVhZAogICAgaGFuZGxlU2xhc2hNZW51S2V5Ym9hcmQoZTExKSB7CiAgICAgIHN3aXRjaCAoZTExLmtleSkgewogICAgICAgIGNhc2UgIkFycm93RG93biI6CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuc2xhc2hNZW51Lm5hdmlnYXRlKCJkb3duIik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJBcnJvd1VwIjoKICAgICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgdGhpcy5zbGFzaE1lbnUubmF2aWdhdGUoInVwIik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJFbnRlciI6CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuc2xhc2hNZW51LnNlbGVjdEN1cnJlbnQoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkVzY2FwZSI6CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuY2xvc2VTbGFzaE1lbnUodHJ1ZSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgY2xvc2VTbGFzaE1lbnUoY2xlYXJTbGFzaCA9IGZhbHNlKSB7CiAgICAgIGlmIChjbGVhclNsYXNoICYmIHRoaXMuc2VsZWN0ZWRCbG9ja0lkKSB7CiAgICAgICAgY29uc3QgY3VycmVudEJsb2NrID0gdGhpcy5ibG9ja3MuZmluZCgoYjYpID0+IGI2LmlkID09PSB0aGlzLnNlbGVjdGVkQmxvY2tJZCk7CiAgICAgICAgaWYgKGN1cnJlbnRCbG9jaykgewogICAgICAgICAgY29uc3Qgd3JhcHBlckVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihgW2RhdGEtYmxvY2staWQ9IiR7Y3VycmVudEJsb2NrLmlkfSJdYCk7CiAgICAgICAgICBjb25zdCBibG9ja0NvbXBvbmVudCA9IHdyYXBwZXJFbGVtZW50Py5xdWVyeVNlbGVjdG9yKCJkZWVzLXd5c2l3eWctYmxvY2siKTsKICAgICAgICAgIGlmIChibG9ja0NvbXBvbmVudCkgewogICAgICAgICAgICBjb25zdCBjb250ZW50MyA9IGJsb2NrQ29tcG9uZW50LmdldENvbnRlbnQoKTsKICAgICAgICAgICAgaWYgKGNvbnRlbnQzLnN0YXJ0c1dpdGgoIi8iKSkgewogICAgICAgICAgICAgIGNvbnN0IGNsZWFuQ29udGVudCA9IGNvbnRlbnQzLnJlcGxhY2UoL15cL1teXHNdKlxzKi8sICIiKS50cmltKCk7CiAgICAgICAgICAgICAgYmxvY2tDb21wb25lbnQuc2V0Q29udGVudChjbGVhbkNvbnRlbnQpOwogICAgICAgICAgICAgIGN1cnJlbnRCbG9jay5jb250ZW50ID0gY2xlYW5Db250ZW50OwogICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICAgICAgICBibG9ja0NvbXBvbmVudC5mb2N1c1dpdGhDdXJzb3IoMCk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5zbGFzaE1lbnUuaGlkZSgpOwogICAgfQogICAgaGFuZGxlQmxvY2tGb2N1cyhibG9jaykgewogICAgICBpZiAodGhpcy5ibHVyVGltZW91dCkgewogICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmJsdXJUaW1lb3V0KTsKICAgICAgICB0aGlzLmJsdXJUaW1lb3V0ID0gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBwcmV2U2VsZWN0ZWRJZCA9IHRoaXMuc2VsZWN0ZWRCbG9ja0lkOwogICAgICB0aGlzLnNlbGVjdGVkQmxvY2tJZCA9IGJsb2NrLmlkOwogICAgICBpZiAocHJldlNlbGVjdGVkSWQgIT09IGJsb2NrLmlkKSB7CiAgICAgICAgaWYgKHByZXZTZWxlY3RlZElkKSB7CiAgICAgICAgICBjb25zdCBwcmV2V3JhcHBlciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihgW2RhdGEtYmxvY2staWQ9IiR7cHJldlNlbGVjdGVkSWR9Il1gKTsKICAgICAgICAgIGNvbnN0IHByZXZCbG9ja0NvbXBvbmVudCA9IHByZXZXcmFwcGVyPy5xdWVyeVNlbGVjdG9yKCJkZWVzLXd5c2l3eWctYmxvY2siKTsKICAgICAgICAgIGlmIChwcmV2QmxvY2tDb21wb25lbnQpIHsKICAgICAgICAgICAgcHJldkJsb2NrQ29tcG9uZW50LmlzU2VsZWN0ZWQgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihgW2RhdGEtYmxvY2staWQ9IiR7YmxvY2suaWR9Il1gKTsKICAgICAgICBjb25zdCBibG9ja0NvbXBvbmVudCA9IHdyYXBwZXI/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgICAgIGlmIChibG9ja0NvbXBvbmVudCkgewogICAgICAgICAgYmxvY2tDb21wb25lbnQuaXNTZWxlY3RlZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBibHVyVGltZW91dCA9IG51bGw7CiAgICBoYW5kbGVCbG9ja0JsdXIoYmxvY2spIHsKICAgICAgaWYgKHRoaXMuYmx1clRpbWVvdXQpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ibHVyVGltZW91dCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuc2xhc2hNZW51LnZpc2libGUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgd3JhcHBlckVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke2Jsb2NrLmlkfSJdYCk7CiAgICAgIGNvbnN0IGJsb2NrQ29tcG9uZW50ID0gd3JhcHBlckVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgICBpZiAoYmxvY2tDb21wb25lbnQgJiYgYmxvY2tDb21wb25lbnQuZ2V0Q29udGVudCkgewogICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBibG9ja0NvbXBvbmVudC5nZXRDb250ZW50KCk7CiAgICAgICAgaWYgKGJsb2NrLmNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHsKICAgICAgICAgIGJsb2NrLmNvbnRlbnQgPSBuZXdDb250ZW50OwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLmJsdXJUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8uYWN0aXZlRWxlbWVudDsKICAgICAgICBjb25zdCBpc0Jsb2NrRm9jdXNlZCA9IGFjdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucygiYmxvY2siKTsKICAgICAgICBpZiAoIWlzQmxvY2tGb2N1c2VkKSB7CiAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKCk7CiAgICAgICAgfQogICAgICB9LCAxMDApOwogICAgfQogICAgaGFuZGxlRWRpdG9yQ2xpY2soZTExKSB7CiAgICAgIGNvbnN0IHRhcmdldCA9IGUxMS50YXJnZXQ7CiAgICAgIGlmICh0aGlzLnNsYXNoTWVudS52aXNpYmxlKSB7CiAgICAgICAgdGhpcy5jbG9zZVNsYXNoTWVudSh0cnVlKTsKICAgICAgfQogICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygiZWRpdG9yLWNvbnRlbnQiKSkgewogICAgICAgIGNvbnN0IGxhc3RCbG9jayA9IHRoaXMuYmxvY2tzW3RoaXMuYmxvY2tzLmxlbmd0aCAtIDFdOwogICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zLmZvY3VzQmxvY2sobGFzdEJsb2NrLmlkLCBsYXN0QmxvY2sudHlwZSA9PT0gImRpdmlkZXIiIHx8IGxhc3RCbG9jay50eXBlID09PSAiaW1hZ2UiID8gdm9pZCAwIDogImVuZCIpOwogICAgICB9CiAgICB9CiAgICBjcmVhdGVOZXdCbG9jayh0eXBlNSA9ICJwYXJhZ3JhcGgiLCBjb250ZW50MyA9ICIiLCBtZXRhZGF0YSkgewogICAgICByZXR1cm4gewogICAgICAgIGlkOiBXeXNpd3lnU2hvcnRjdXRzLmdlbmVyYXRlQmxvY2tJZCgpLAogICAgICAgIHR5cGU6IHR5cGU1LAogICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQzLAogICAgICAgIC4uLm1ldGFkYXRhICYmIHsgbWV0YWRhdGEgfQogICAgICB9OwogICAgfQogICAgYXN5bmMgaW5zZXJ0QmxvY2tBZnRlcihhZnRlckJsb2NrLCBuZXdCbG9jaywgZm9jdXNOZXdCbG9jayA9IHRydWUpIHsKICAgICAgY29uc3QgYmxvY2tJbmRleCA9IHRoaXMuYmxvY2tzLmZpbmRJbmRleCgoYjYpID0+IGI2LmlkID09PSBhZnRlckJsb2NrLmlkKTsKICAgICAgdGhpcy5ibG9ja3MgPSBbLi4udGhpcy5ibG9ja3Muc2xpY2UoMCwgYmxvY2tJbmRleCArIDEpLCBuZXdCbG9jaywgLi4udGhpcy5ibG9ja3Muc2xpY2UoYmxvY2tJbmRleCArIDEpXTsKICAgICAgY29uc3QgYWZ0ZXJXcmFwcGVyID0gdGhpcy5lZGl0b3JDb250ZW50UmVmLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke2FmdGVyQmxvY2suaWR9Il1gKTsKICAgICAgaWYgKGFmdGVyV3JhcHBlcikgewogICAgICAgIGNvbnN0IG5ld1dyYXBwZXIgPSB0aGlzLmNyZWF0ZUJsb2NrRWxlbWVudChuZXdCbG9jayk7CiAgICAgICAgYWZ0ZXJXcmFwcGVyLmluc2VydEFkamFjZW50RWxlbWVudCgiYWZ0ZXJlbmQiLCBuZXdXcmFwcGVyKTsKICAgICAgfQogICAgICB0aGlzLnVwZGF0ZVZhbHVlKCk7CiAgICAgIGlmIChmb2N1c05ld0Jsb2NrICYmIG5ld0Jsb2NrLnR5cGUgIT09ICJkaXZpZGVyIikgewogICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlMikgPT4gc2V0VGltZW91dChyZXNvbHZlMiwgMCkpOwogICAgICAgIGF3YWl0IHRoaXMuYmxvY2tPcGVyYXRpb25zLmZvY3VzQmxvY2sobmV3QmxvY2suaWQsICJzdGFydCIpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBpbnNlcnRCbG9jayh0eXBlNSkgewogICAgICBjb25zdCBjdXJyZW50QmxvY2sgPSB0aGlzLmJsb2Nrcy5maW5kKChiNikgPT4gYjYuaWQgPT09IHRoaXMuc2VsZWN0ZWRCbG9ja0lkKTsKICAgICAgaWYgKCFjdXJyZW50QmxvY2spIHsKICAgICAgICB0aGlzLmNsb3NlU2xhc2hNZW51KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHdyYXBwZXJFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke2N1cnJlbnRCbG9jay5pZH0iXWApOwogICAgICBjb25zdCBibG9ja0NvbXBvbmVudCA9IHdyYXBwZXJFbGVtZW50Py5xdWVyeVNlbGVjdG9yKCJkZWVzLXd5c2l3eWctYmxvY2siKTsKICAgICAgaWYgKGJsb2NrQ29tcG9uZW50KSB7CiAgICAgICAgY29uc3QgY29udGVudDMgPSBibG9ja0NvbXBvbmVudC5nZXRDb250ZW50KCk7CiAgICAgICAgaWYgKGNvbnRlbnQzLnN0YXJ0c1dpdGgoIi8iKSkgewogICAgICAgICAgY29uc3QgY2xlYW5Db250ZW50ID0gY29udGVudDMucmVwbGFjZSgvXlwvW15cc10qXHMqLywgIiIpLnRyaW0oKTsKICAgICAgICAgIGJsb2NrQ29tcG9uZW50LnNldENvbnRlbnQoY2xlYW5Db250ZW50KTsKICAgICAgICAgIGN1cnJlbnRCbG9jay5jb250ZW50ID0gY2xlYW5Db250ZW50OwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLmNsb3NlU2xhc2hNZW51KGZhbHNlKTsKICAgICAgaWYgKHR5cGU1ID09PSAiY29kZSIpIHsKICAgICAgICBjdXJyZW50QmxvY2subWV0YWRhdGEgPSB7IGxhbmd1YWdlOiAidHlwZXNjcmlwdCIgfTsKICAgICAgfQogICAgICBjdXJyZW50QmxvY2sudHlwZSA9IHR5cGU1OwogICAgICBjdXJyZW50QmxvY2suY29udGVudCA9IGN1cnJlbnRCbG9jay5jb250ZW50IHx8ICIiOwogICAgICBpZiAodHlwZTUgPT09ICJkaXZpZGVyIikgewogICAgICAgIGN1cnJlbnRCbG9jay5jb250ZW50ID0gIiAiOwogICAgICAgIGNvbnN0IG5ld0Jsb2NrID0gdGhpcy5jcmVhdGVOZXdCbG9jaygpOwogICAgICAgIHRoaXMuaW5zZXJ0QmxvY2tBZnRlcihjdXJyZW50QmxvY2ssIG5ld0Jsb2NrKTsKICAgICAgfSBlbHNlIGlmICh0eXBlNSA9PT0gImxpc3QiKSB7CiAgICAgICAgY3VycmVudEJsb2NrLm1ldGFkYXRhID0geyBsaXN0VHlwZTogImJ1bGxldCIgfTsKICAgICAgICBjdXJyZW50QmxvY2suY29udGVudCA9ICIiOwogICAgICB9IGVsc2UgaWYgKHR5cGU1ID09PSAiaW1hZ2UiKSB7CiAgICAgICAgY3VycmVudEJsb2NrLmNvbnRlbnQgPSAiIjsKICAgICAgICBjdXJyZW50QmxvY2subWV0YWRhdGEgPSB7IHVybDogIiIsIGxvYWRpbmc6IGZhbHNlIH07CiAgICAgIH0gZWxzZSBpZiAodHlwZTUgPT09ICJ5b3V0dWJlIikgewogICAgICAgIGN1cnJlbnRCbG9jay5jb250ZW50ID0gIiI7CiAgICAgICAgY3VycmVudEJsb2NrLm1ldGFkYXRhID0geyB2aWRlb0lkOiAiIiwgdXJsOiAiIiB9OwogICAgICB9IGVsc2UgaWYgKHR5cGU1ID09PSAibWFya2Rvd24iKSB7CiAgICAgICAgY3VycmVudEJsb2NrLm1ldGFkYXRhID0geyBzaG93UHJldmlldzogZmFsc2UgfTsKICAgICAgfSBlbHNlIGlmICh0eXBlNSA9PT0gImh0bWwiKSB7CiAgICAgICAgY3VycmVudEJsb2NrLm1ldGFkYXRhID0geyBzaG93UHJldmlldzogZmFsc2UgfTsKICAgICAgfSBlbHNlIGlmICh0eXBlNSA9PT0gImF0dGFjaG1lbnQiKSB7CiAgICAgICAgY3VycmVudEJsb2NrLmNvbnRlbnQgPSAiIjsKICAgICAgICBjdXJyZW50QmxvY2subWV0YWRhdGEgPSB7IGZpbGVzOiBbXSB9OwogICAgICB9IGVsc2UgewogICAgICAgIGN1cnJlbnRCbG9jay5jb250ZW50ID0gY3VycmVudEJsb2NrLmNvbnRlbnQgfHwgIiI7CiAgICAgIH0KICAgICAgdGhpcy51cGRhdGVCbG9ja0VsZW1lbnQoY3VycmVudEJsb2NrLmlkKTsKICAgICAgdGhpcy51cGRhdGVWYWx1ZSgpOwogICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHNldFRpbWVvdXQocmVzb2x2ZTIsIDApKTsKICAgICAgaWYgKHR5cGU1ID09PSAibGlzdCIpIHsKICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9ucy5mb2N1c0Jsb2NrKGN1cnJlbnRCbG9jay5pZCwgInN0YXJ0Iik7CiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICAgIGNvbnN0IGJsb2NrV3JhcHBlciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihgW2RhdGEtYmxvY2staWQ9IiR7Y3VycmVudEJsb2NrLmlkfSJdYCk7CiAgICAgICAgICBjb25zdCBibG9ja0NvbXBvbmVudDIgPSBibG9ja1dyYXBwZXI/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgICAgICAgaWYgKGJsb2NrQ29tcG9uZW50MikgewogICAgICAgICAgICBibG9ja0NvbXBvbmVudDIuZm9jdXNMaXN0SXRlbSgpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKHR5cGU1ICE9PSAiZGl2aWRlciIgJiYgdHlwZTUgIT09ICJpbWFnZSIgJiYgdHlwZTUgIT09ICJ5b3V0dWJlIiAmJiB0eXBlNSAhPT0gIm1hcmtkb3duIiAmJiB0eXBlNSAhPT0gImh0bWwiICYmIHR5cGU1ICE9PSAiYXR0YWNobWVudCIpIHsKICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9ucy5mb2N1c0Jsb2NrKGN1cnJlbnRCbG9jay5pZCwgInN0YXJ0Iik7CiAgICAgIH0gZWxzZSBpZiAodHlwZTUgPT09ICJpbWFnZSIgfHwgdHlwZTUgPT09ICJ5b3V0dWJlIiB8fCB0eXBlNSA9PT0gIm1hcmtkb3duIiB8fCB0eXBlNSA9PT0gImh0bWwiIHx8IHR5cGU1ID09PSAiYXR0YWNobWVudCIpIHsKICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9ucy5mb2N1c0Jsb2NrKGN1cnJlbnRCbG9jay5pZCk7CiAgICAgIH0KICAgIH0KICAgIHVwZGF0ZVZhbHVlKCkgewogICAgICBpZiAodGhpcy5vdXRwdXRGb3JtYXQgPT09ICJodG1sIikgewogICAgICAgIHRoaXMudmFsdWUgPSBXeXNpd3lnQ29udmVydGVycy5nZXRIdG1sT3V0cHV0KHRoaXMuYmxvY2tzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnZhbHVlID0gV3lzaXd5Z0NvbnZlcnRlcnMuZ2V0TWFya2Rvd25PdXRwdXQodGhpcy5ibG9ja3MpOwogICAgICB9CiAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMudmFsdWUpOwogICAgICB0aGlzLnNhdmVUb0hpc3RvcnkodHJ1ZSk7CiAgICB9CiAgICBnZXRWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMudmFsdWU7CiAgICB9CiAgICBzZXRWYWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlMjsKICAgICAgaWYgKHRoaXMub3V0cHV0Rm9ybWF0ID09PSAiaHRtbCIpIHsKICAgICAgICB0aGlzLmJsb2NrcyA9IFd5c2l3eWdDb252ZXJ0ZXJzLnBhcnNlSHRtbFRvQmxvY2tzKHZhbHVlMik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5ibG9ja3MgPSBXeXNpd3lnQ29udmVydGVycy5wYXJzZU1hcmtkb3duVG9CbG9ja3ModmFsdWUyKTsKICAgICAgfQogICAgICBpZiAodGhpcy5ibG9ja3MubGVuZ3RoID09PSAwKSB7CiAgICAgICAgdGhpcy5ibG9ja3MgPSBbewogICAgICAgICAgaWQ6IFd5c2l3eWdTaG9ydGN1dHMuZ2VuZXJhdGVCbG9ja0lkKCksCiAgICAgICAgICB0eXBlOiAicGFyYWdyYXBoIiwKICAgICAgICAgIGNvbnRlbnQ6ICIiCiAgICAgICAgfV07CiAgICAgIH0KICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcy52YWx1ZSk7CiAgICAgIGlmICh0aGlzLmVkaXRvckNvbnRlbnRSZWYpIHsKICAgICAgICB0aGlzLnJlbmRlckJsb2Nrc1Byb2dyYW1tYXRpY2FsbHkoKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBFeHBvcnQgdGhlIGVkaXRvciBjb250ZW50IGFzIHJhdyBibG9ja3MgKGxvc3NsZXNzKQogICAgICovCiAgICBleHBvcnRCbG9ja3MoKSB7CiAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuYmxvY2tzKSk7CiAgICB9CiAgICAvKioKICAgICAqIEltcG9ydCByYXcgYmxvY2tzIChsb3NzbGVzcykKICAgICAqLwogICAgaW1wb3J0QmxvY2tzKGJsb2NrcykgewogICAgICB0aGlzLmJsb2NrcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYmxvY2tzKSk7CiAgICAgIHRoaXMudXBkYXRlVmFsdWUoKTsKICAgICAgaWYgKHRoaXMuZWRpdG9yQ29udGVudFJlZikgewogICAgICAgIHRoaXMucmVuZGVyQmxvY2tzUHJvZ3JhbW1hdGljYWxseSgpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEV4cG9ydCBjb250ZW50IGFzIEhUTUwgcmVnYXJkbGVzcyBvZiBvdXRwdXRGb3JtYXQgc2V0dGluZwogICAgICovCiAgICBleHBvcnRBc0h0bWwoKSB7CiAgICAgIHJldHVybiBXeXNpd3lnQ29udmVydGVycy5nZXRIdG1sT3V0cHV0KHRoaXMuYmxvY2tzKTsKICAgIH0KICAgIC8qKgogICAgICogRXhwb3J0IGNvbnRlbnQgYXMgTWFya2Rvd24gcmVnYXJkbGVzcyBvZiBvdXRwdXRGb3JtYXQgc2V0dGluZwogICAgICovCiAgICBleHBvcnRBc01hcmtkb3duKCkgewogICAgICByZXR1cm4gV3lzaXd5Z0NvbnZlcnRlcnMuZ2V0TWFya2Rvd25PdXRwdXQodGhpcy5ibG9ja3MpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlZGl0b3Igc3RhdGUgKGZvciBzYXZpbmcpCiAgICAgKi8KICAgIGV4cG9ydFN0YXRlKCkgewogICAgICByZXR1cm4gewogICAgICAgIGJsb2NrczogdGhpcy5leHBvcnRCbG9ja3MoKSwKICAgICAgICBvdXRwdXRGb3JtYXQ6IHRoaXMub3V0cHV0Rm9ybWF0CiAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIFJlc3RvcmUgZWRpdG9yIHN0YXRlIGZyb20gSlNPTgogICAgICovCiAgICBpbXBvcnRTdGF0ZShzdGF0ZTEwKSB7CiAgICAgIGlmIChzdGF0ZTEwLm91dHB1dEZvcm1hdCkgewogICAgICAgIHRoaXMub3V0cHV0Rm9ybWF0ID0gc3RhdGUxMC5vdXRwdXRGb3JtYXQ7CiAgICAgIH0KICAgICAgdGhpcy5pbXBvcnRCbG9ja3Moc3RhdGUxMC5ibG9ja3MpOwogICAgfQogICAgaGFuZGxlRHJhZ0VuZCgpIHsKICAgICAgaWYgKHRoaXMuZHJhZ2dlZEJsb2NrSWQpIHsKICAgICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5lZGl0b3JDb250ZW50UmVmLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke3RoaXMuZHJhZ2dlZEJsb2NrSWR9Il1gKTsKICAgICAgICBpZiAod3JhcHBlcikgewogICAgICAgICAgd3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnZ2luZyIpOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBhbGxXcmFwcGVycyA9IHRoaXMuZWRpdG9yQ29udGVudFJlZi5xdWVyeVNlbGVjdG9yQWxsKCIuYmxvY2std3JhcHBlciIpOwogICAgICBhbGxXcmFwcGVycy5mb3JFYWNoKCh3cmFwcGVyKSA9PiB7CiAgICAgICAgd3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnLW92ZXItYmVmb3JlIiwgImRyYWctb3Zlci1hZnRlciIpOwogICAgICB9KTsKICAgICAgdGhpcy5lZGl0b3JDb250ZW50UmVmLmNsYXNzTGlzdC5yZW1vdmUoImRyYWdnaW5nIik7CiAgICAgIHRoaXMuZHJhZ2dlZEJsb2NrSWQgPSBudWxsOwogICAgICB0aGlzLmRyYWdPdmVyQmxvY2tJZCA9IG51bGw7CiAgICAgIHRoaXMuZHJhZ092ZXJQb3NpdGlvbiA9IG51bGw7CiAgICB9CiAgICBoYW5kbGVEcm9wKGUxMSwgdGFyZ2V0QmxvY2spIHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGlmICghdGhpcy5kcmFnZ2VkQmxvY2tJZCB8fCB0aGlzLmRyYWdnZWRCbG9ja0lkID09PSB0YXJnZXRCbG9jay5pZCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGRyYWdnZWRJbmRleCA9IHRoaXMuYmxvY2tzLmZpbmRJbmRleCgoYjYpID0+IGI2LmlkID09PSB0aGlzLmRyYWdnZWRCbG9ja0lkKTsKICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSB0aGlzLmJsb2Nrcy5maW5kSW5kZXgoKGI2KSA9PiBiNi5pZCA9PT0gdGFyZ2V0QmxvY2suaWQpOwogICAgICBpZiAoZHJhZ2dlZEluZGV4ID09PSAtMSB8fCB0YXJnZXRJbmRleCA9PT0gLTEpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBbZHJhZ2dlZEJsb2NrXSA9IHRoaXMuYmxvY2tzLnNwbGljZShkcmFnZ2VkSW5kZXgsIDEpOwogICAgICBsZXQgbmV3SW5kZXggPSB0YXJnZXRJbmRleDsKICAgICAgaWYgKHRoaXMuZHJhZ092ZXJQb3NpdGlvbiA9PT0gImFmdGVyIikgewogICAgICAgIG5ld0luZGV4ID0gZHJhZ2dlZEluZGV4IDwgdGFyZ2V0SW5kZXggPyB0YXJnZXRJbmRleCA6IHRhcmdldEluZGV4ICsgMTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuZXdJbmRleCA9IGRyYWdnZWRJbmRleCA8IHRhcmdldEluZGV4ID8gdGFyZ2V0SW5kZXggLSAxIDogdGFyZ2V0SW5kZXg7CiAgICAgIH0KICAgICAgdGhpcy5ibG9ja3Muc3BsaWNlKG5ld0luZGV4LCAwLCBkcmFnZ2VkQmxvY2spOwogICAgICB0aGlzLnJlbmRlckJsb2Nrc1Byb2dyYW1tYXRpY2FsbHkoKTsKICAgICAgdGhpcy51cGRhdGVWYWx1ZSgpOwogICAgICB0aGlzLmhhbmRsZURyYWdFbmQoKTsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgY29uc3QgbW92ZWRCbG9ja0VsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihgW2RhdGEtYmxvY2staWQ9IiR7ZHJhZ2dlZEJsb2NrLmlkfSJdIC5ibG9ja2ApOwogICAgICAgIGlmIChtb3ZlZEJsb2NrRWxlbWVudCAmJiBkcmFnZ2VkQmxvY2sudHlwZSAhPT0gImRpdmlkZXIiKSB7CiAgICAgICAgICBtb3ZlZEJsb2NrRWxlbWVudC5mb2N1cygpOwogICAgICAgIH0KICAgICAgfSwgMTAwKTsKICAgIH0KICAgIGhhbmRsZVRleHRTZWxlY3Rpb24oX2UpIHsKICAgICAgaWYgKHRoaXMuc2xhc2hNZW51LnZpc2libGUpCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgdXBkYXRlRm9ybWF0dGluZ01lbnVQb3NpdGlvbigpIHsKICAgICAgY29uc3Qgc2hhZG93Um9vdHMgPSBbXTsKICAgICAgaWYgKHRoaXMuc2hhZG93Um9vdCkKICAgICAgICBzaGFkb3dSb290cy5wdXNoKHRoaXMuc2hhZG93Um9vdCk7CiAgICAgIGNvbnN0IGJsb2NrV3JhcHBlcnMgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ibG9jay13cmFwcGVyIik7CiAgICAgIGJsb2NrV3JhcHBlcnM/LmZvckVhY2goKHdyYXBwZXIpID0+IHsKICAgICAgICBjb25zdCBibG9ja0NvbXBvbmVudCA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcigiZGVlcy13eXNpd3lnLWJsb2NrIik7CiAgICAgICAgaWYgKGJsb2NrQ29tcG9uZW50Py5zaGFkb3dSb290KSB7CiAgICAgICAgICBzaGFkb3dSb290cy5wdXNoKGJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGNvbnN0IGNvb3JkcyA9IFd5c2l3eWdGb3JtYXR0aW5nLmdldFNlbGVjdGlvbkNvb3JkaW5hdGVzKC4uLnNoYWRvd1Jvb3RzKTsKICAgICAgaWYgKGNvb3JkcykgewogICAgICAgIHRoaXMuZm9ybWF0dGluZ01lbnUuc2hvdyh7IHg6IGNvb3Jkcy54LCB5OiBjb29yZHMueSB9LCBhc3luYyAoY29tbWFuZCkgPT4gYXdhaXQgdGhpcy5hcHBseUZvcm1hdChjb21tYW5kKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgIH0KICAgIH0KICAgIGhpZGVGb3JtYXR0aW5nTWVudSgpIHsKICAgICAgdGhpcy5mb3JtYXR0aW5nTWVudS5oaWRlKCk7CiAgICAgIHRoaXMuc2VsZWN0ZWRUZXh0ID0gIiI7CiAgICB9CiAgICBhc3luYyBhcHBseUZvcm1hdChjb21tYW5kKSB7CiAgICAgIGNvbnN0IHNoYWRvd1Jvb3RzID0gW107CiAgICAgIGlmICh0aGlzLnNoYWRvd1Jvb3QpCiAgICAgICAgc2hhZG93Um9vdHMucHVzaCh0aGlzLnNoYWRvd1Jvb3QpOwogICAgICBjb25zdCBibG9ja1dyYXBwZXJzID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yQWxsKCIuYmxvY2std3JhcHBlciIpOwogICAgICBibG9ja1dyYXBwZXJzPy5mb3JFYWNoKCh3cmFwcGVyKSA9PiB7CiAgICAgICAgY29uc3QgYmxvY2tDb21wb25lbnQgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgICAgIGlmIChibG9ja0NvbXBvbmVudD8uc2hhZG93Um9vdCkgewogICAgICAgICAgc2hhZG93Um9vdHMucHVzaChibG9ja0NvbXBvbmVudC5zaGFkb3dSb290KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBjb25zdCBzZWxlY3Rpb25JbmZvID0gV3lzaXd5Z1NlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvKC4uLnNoYWRvd1Jvb3RzKTsKICAgICAgaWYgKCFzZWxlY3Rpb25JbmZvKQogICAgICAgIHJldHVybjsKICAgICAgbGV0IHRhcmdldEJsb2NrOwogICAgICBsZXQgdGFyZ2V0QmxvY2tDb21wb25lbnQ7CiAgICAgIGNvbnN0IHdyYXBwZXJzID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ibG9jay13cmFwcGVyIik7CiAgICAgIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IHdyYXBwZXJzLmxlbmd0aDsgaTExKyspIHsKICAgICAgICBjb25zdCB3cmFwcGVyID0gd3JhcHBlcnNbaTExXTsKICAgICAgICBjb25zdCBibG9ja0NvbXBvbmVudCA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcigiZGVlcy13eXNpd3lnLWJsb2NrIik7CiAgICAgICAgaWYgKGJsb2NrQ29tcG9uZW50Py5zaGFkb3dSb290KSB7CiAgICAgICAgICBjb25zdCBibG9jayA9IGJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmJsb2NrIik7CiAgICAgICAgICBpZiAoYmxvY2sgJiYgKGJsb2NrLmNvbnRhaW5zKHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXIpIHx8IGJsb2NrLmNvbnRhaW5zKHNlbGVjdGlvbkluZm8uZW5kQ29udGFpbmVyKSkpIHsKICAgICAgICAgICAgY29uc3QgYmxvY2tJZCA9IHdyYXBwZXIuZ2V0QXR0cmlidXRlKCJkYXRhLWJsb2NrLWlkIik7CiAgICAgICAgICAgIHRhcmdldEJsb2NrID0gdGhpcy5ibG9ja3MuZmluZCgoYjYpID0+IGI2LmlkID09PSBibG9ja0lkKTsKICAgICAgICAgICAgdGFyZ2V0QmxvY2tDb21wb25lbnQgPSBibG9ja0NvbXBvbmVudDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdGFyZ2V0QmxvY2sgfHwgIXRhcmdldEJsb2NrQ29tcG9uZW50KQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgcmFuZ2UyID0gV3lzaXd5Z1NlbGVjdGlvbi5jcmVhdGVSYW5nZUZyb21JbmZvKHNlbGVjdGlvbkluZm8pOwogICAgICBpZiAoY29tbWFuZCA9PT0gImxpbmsiKSB7CiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5zaG93TGlua0RpYWxvZygpOwogICAgICAgIGlmICghdXJsKSB7CiAgICAgICAgICB0YXJnZXRCbG9ja0NvbXBvbmVudC5mb2N1cygpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBXeXNpd3lnRm9ybWF0dGluZy5hcHBseUZvcm1hdChjb21tYW5kLCB1cmwsIHJhbmdlMiwgc2hhZG93Um9vdHMpOwogICAgICB9IGVsc2UgewogICAgICAgIFd5c2l3eWdGb3JtYXR0aW5nLmFwcGx5Rm9ybWF0KGNvbW1hbmQsIHZvaWQgMCwgcmFuZ2UyLCBzaGFkb3dSb290cyk7CiAgICAgIH0KICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUyLCAxMCkpOwogICAgICB0YXJnZXRCbG9jay5jb250ZW50ID0gdGFyZ2V0QmxvY2tDb21wb25lbnQuZ2V0Q29udGVudCgpOwogICAgICB0aGlzLnVwZGF0ZVZhbHVlKCk7CiAgICAgIHRhcmdldEJsb2NrQ29tcG9uZW50LmZvY3VzKCk7CiAgICAgIGlmIChjb21tYW5kID09PSAibGluayIpIHsKICAgICAgICB0aGlzLmhpZGVGb3JtYXR0aW5nTWVudSgpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc2VsZWN0ZWRUZXh0ID0gIiI7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIHNob3dMaW5rRGlhbG9nKCkgewogICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiB7CiAgICAgICAgbGV0IGxpbmtVcmwgPSBudWxsOwogICAgICAgIERlZXNNb2RhbC5jcmVhdGVBbmRTaG93KHsKICAgICAgICAgIGhlYWRpbmc6ICJBZGQgTGluayIsCiAgICAgICAgICBjb250ZW50OiB1M2AKICAgICAgICAgIDxzdHlsZT4KICAgICAgICAgICAgLmxpbmstaW5wdXQgewogICAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRlZXMtY29sb3ItbGluZS1icmlnaHQpOwogICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1kZWVzLWNvbG9yLWlucHV0KTsKICAgICAgICAgICAgICBjb2xvcjogdmFyKC0tZGVlcy1jb2xvci10ZXh0KTsKICAgICAgICAgICAgICBtYXJnaW46IDE2cHggMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAubGluay1pbnB1dDpmb2N1cyB7CiAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWRlZXMtY29sb3ItcHJpbWFyeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgICA8aW5wdXQgCiAgICAgICAgICAgIGNsYXNzPSJsaW5rLWlucHV0IiAKICAgICAgICAgICAgdHlwZT0idXJsIiAKICAgICAgICAgICAgcGxhY2Vob2xkZXI9Imh0dHBzOi8vZXhhbXBsZS5jb20iIAogICAgICAgICAgICBAa2V5ZG93bj0iJHsoZTExKSA9PiB7CiAgICAgICAgICAgIGlmIChlMTEua2V5ID09PSAiRW50ZXIiKSB7CiAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBlMTEudGFyZ2V0OwogICAgICAgICAgICAgIGxpbmtVcmwgPSBpbnB1dC52YWx1ZTsKICAgICAgICAgICAgICBjb25zdCBtb2RhbCA9IGlucHV0LmNsb3Nlc3QoImRlZXMtbW9kYWwiKTsKICAgICAgICAgICAgICBpZiAobW9kYWwpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG9rQnV0dG9uID0gbW9kYWwuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmJvdHRvbUJ1dHRvbjpsYXN0LWNoaWxkIik7CiAgICAgICAgICAgICAgICBpZiAob2tCdXR0b24pCiAgICAgICAgICAgICAgICAgIG9rQnV0dG9uLmNsaWNrKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9fSIKICAgICAgICAgICAgQGlucHV0PSIkeyhlMTEpID0+IHsKICAgICAgICAgICAgbGlua1VybCA9IGUxMS50YXJnZXQudmFsdWU7CiAgICAgICAgICB9fSIKICAgICAgICAgIC8+CiAgICAgICAgYCwKICAgICAgICAgIG1lbnVPcHRpb25zOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBuYW1lOiAiQ2FuY2VsIiwKICAgICAgICAgICAgICBhY3Rpb246IGFzeW5jIChtb2RhbCkgPT4gewogICAgICAgICAgICAgICAgbW9kYWwuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgcmVzb2x2ZTIobnVsbCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgbmFtZTogIkFkZCBMaW5rIiwKICAgICAgICAgICAgICBhY3Rpb246IGFzeW5jIChtb2RhbCkgPT4gewogICAgICAgICAgICAgICAgbW9kYWwuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgcmVzb2x2ZTIobGlua1VybCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICBdCiAgICAgICAgfSk7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImRlZXMtbW9kYWwgLmxpbmstaW5wdXQiKTsKICAgICAgICAgIGlmIChpbnB1dCkgewogICAgICAgICAgICBpbnB1dC5mb2N1cygpOwogICAgICAgICAgfQogICAgICAgIH0sIDEwMCk7CiAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBVbmRvIHRoZSBsYXN0IGFjdGlvbgogICAgICovCiAgICB1bmRvKCkgewogICAgICBjb25zdCBzdGF0ZTEwID0gdGhpcy5oaXN0b3J5LnVuZG8oKTsKICAgICAgaWYgKHN0YXRlMTApIHsKICAgICAgICB0aGlzLnJlc3RvcmVTdGF0ZShzdGF0ZTEwKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZWRvIHRoZSBuZXh0IGFjdGlvbgogICAgICovCiAgICByZWRvKCkgewogICAgICBjb25zdCBzdGF0ZTEwID0gdGhpcy5oaXN0b3J5LnJlZG8oKTsKICAgICAgaWYgKHN0YXRlMTApIHsKICAgICAgICB0aGlzLnJlc3RvcmVTdGF0ZShzdGF0ZTEwKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZXN0b3JlIGVkaXRvciBzdGF0ZSBmcm9tIGhpc3RvcnkKICAgICAqLwogICAgcmVzdG9yZVN0YXRlKHN0YXRlMTApIHsKICAgICAgdGhpcy5ibG9ja3MgPSBzdGF0ZTEwLmJsb2NrczsKICAgICAgdGhpcy5zZWxlY3RlZEJsb2NrSWQgPSBzdGF0ZTEwLnNlbGVjdGVkQmxvY2tJZDsKICAgICAgdGhpcy5yZW5kZXJCbG9ja3NQcm9ncmFtbWF0aWNhbGx5KCk7CiAgICAgIGlmIChzdGF0ZTEwLmN1cnNvclBvc2l0aW9uKSB7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICBjb25zdCBibG9ja1dyYXBwZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke3N0YXRlMTAuY3Vyc29yUG9zaXRpb24uYmxvY2tJZH0iXWApOwogICAgICAgICAgY29uc3QgYmxvY2tDb21wb25lbnQgPSBibG9ja1dyYXBwZXI/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgICAgICAgaWYgKGJsb2NrQ29tcG9uZW50KSB7CiAgICAgICAgICAgIGJsb2NrQ29tcG9uZW50LmZvY3VzV2l0aEN1cnNvcihzdGF0ZTEwLmN1cnNvclBvc2l0aW9uLm9mZnNldCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgNTApOwogICAgICB9IGVsc2UgaWYgKHN0YXRlMTAuc2VsZWN0ZWRCbG9ja0lkKSB7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9ucy5mb2N1c0Jsb2NrKHN0YXRlMTAuc2VsZWN0ZWRCbG9ja0lkKTsKICAgICAgICB9LCA1MCk7CiAgICAgIH0KICAgICAgdGhpcy51cGRhdGVWYWx1ZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBTYXZlIGN1cnJlbnQgc3RhdGUgdG8gaGlzdG9yeSB3aXRoIGN1cnNvciBwb3NpdGlvbgogICAgICovCiAgICBzYXZlVG9IaXN0b3J5KGRlYm91bmNlNCA9IHRydWUpIHsKICAgICAgbGV0IGN1cnNvclBvc2l0aW9uOwogICAgICBpZiAodGhpcy5zZWxlY3RlZEJsb2NrSWQpIHsKICAgICAgICBjb25zdCBibG9ja1dyYXBwZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWJsb2NrLWlkPSIke3RoaXMuc2VsZWN0ZWRCbG9ja0lkfSJdYCk7CiAgICAgICAgY29uc3QgYmxvY2tDb21wb25lbnQgPSBibG9ja1dyYXBwZXI/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtd3lzaXd5Zy1ibG9jayIpOwogICAgICAgIGlmIChibG9ja0NvbXBvbmVudCAmJiB0eXBlb2YgYmxvY2tDb21wb25lbnQuZ2V0Q3Vyc29yUG9zaXRpb24gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIGNvbnN0IGVkaXRhYmxlRWxlbWVudCA9IGJsb2NrQ29tcG9uZW50LnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5ibG9jayIpOwogICAgICAgICAgaWYgKGVkaXRhYmxlRWxlbWVudCkgewogICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBibG9ja0NvbXBvbmVudC5nZXRDdXJzb3JQb3NpdGlvbihlZGl0YWJsZUVsZW1lbnQpOwogICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgY3Vyc29yUG9zaXRpb24gPSB7CiAgICAgICAgICAgICAgICBibG9ja0lkOiB0aGlzLnNlbGVjdGVkQmxvY2tJZCwKICAgICAgICAgICAgICAgIG9mZnNldAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRlYm91bmNlNCkgewogICAgICAgIHRoaXMuaGlzdG9yeS5zYXZlU3RhdGUodGhpcy5ibG9ja3MsIHRoaXMuc2VsZWN0ZWRCbG9ja0lkLCBjdXJzb3JQb3NpdGlvbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5oaXN0b3J5LnNhdmVDaGVja3BvaW50KHRoaXMuYmxvY2tzLCB0aGlzLnNlbGVjdGVkQmxvY2tJZCwgY3Vyc29yUG9zaXRpb24pOwogICAgICB9CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczM4KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzSW5wdXRXeXNpd3lnMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1yaWNodGV4dC9kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkZW1vRnVuYzI3ID0gKCkgPT4gYjJgCiAgPGRlZXMtZGVtb3dyYXBwZXI+CiAgICA8c3R5bGU+CiAgICAgICR7aWAKICAgICAgICAuZGVtby1jb250YWluZXIgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICBnYXA6IDI0cHg7CiAgICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgICAgbWF4LXdpZHRoOiAxMjAwcHg7CiAgICAgICAgICBtYXJnaW46IDAgYXV0bzsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZGVlcy1wYW5lbCB7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICBkZWVzLXBhbmVsOmxhc3QtY2hpbGQgewogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmdyaWQtbGF5b3V0IHsKICAgICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgICAgICAgICBnYXA6IDE2cHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgewogICAgICAgICAgLmdyaWQtbGF5b3V0IHsKICAgICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5vdXRwdXQtcHJldmlldyB7CiAgICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICAgIGJhY2tncm91bmQ6ICNmM2Y0ZjY7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICBjb2xvcjogIzM3NDE1MTsKICAgICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsKICAgICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewogICAgICAgICAgLm91dHB1dC1wcmV2aWV3IHsKICAgICAgICAgICAgYmFja2dyb3VuZDogIzJjMmMyYzsKICAgICAgICAgICAgY29sb3I6ICNlNGU0ZTc7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBgfQogICAgPC9zdHlsZT4KICAgIAogICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiMS4gQmFzaWMgUmljaCBUZXh0IEVkaXRvciJ9IC5zdWJ0aXRsZT0keyJBIGZ1bGwtZmVhdHVyZWQgcmljaCB0ZXh0IGVkaXRvciB3aXRoIGZvcm1hdHRpbmcgdG9vbGJhciJ9PgogICAgICAgIDxkZWVzLWlucHV0LXJpY2h0ZXh0IAogICAgICAgICAgLmxhYmVsPSR7IkFydGljbGUgQ29udGVudCJ9IAogICAgICAgICAgLnZhbHVlPSR7JzxoMT5XZWxjb21lIHRvIHRoZSBSaWNoIFRleHQgRWRpdG9yITwvaDE+PHA+VGhpcyBpcyBhIGZlYXR1cmUtcmljaCBlZGl0b3IgYnVpbHQgd2l0aCBUaXBUYXAuIFlvdSBjYW46PC9wPjx1bD48bGk+PHN0cm9uZz5Gb3JtYXQgdGV4dDwvc3Ryb25nPiB3aXRoIDxlbT52YXJpb3VzPC9lbT4gPHU+c3R5bGVzPC91PjwvbGk+PGxpPkNyZWF0ZSBkaWZmZXJlbnQgaGVhZGluZyBsZXZlbHM8L2xpPjxsaT5BZGQgPGEgaHJlZj0iaHR0cHM6Ly9leGFtcGxlLmNvbSI+bGlua3M8L2E+IHRvIGV4dGVybmFsIHJlc291cmNlczwvbGk+PGxpPldyaXRlIDxjb2RlPmlubGluZSBjb2RlPC9jb2RlPiBvciBjb2RlIGJsb2NrczwvbGk+PC91bD48YmxvY2txdW90ZT48cD5Vc2UgdGhlIHRvb2xiYXIgYWJvdmUgdG8gZXhwbG9yZSBhbGwgdGhlIGZvcm1hdHRpbmcgb3B0aW9ucyBhdmFpbGFibGUhPC9wPjwvYmxvY2txdW90ZT48cD5TdGFydCB0eXBpbmcgdG8gc2VlIHRoZSBtYWdpYyBoYXBwZW4uLi48L3A+J30KICAgICAgICAgIC5kZXNjcmlwdGlvbj0keyJVc2UgdGhlIHRvb2xiYXIgdG8gZm9ybWF0IHlvdXIgY29udGVudCB3aXRoIGhlYWRpbmdzLCBsaXN0cywgbGlua3MsIGFuZCBtb3JlIn0KICAgICAgICAgIC5zaG93V29yZENvdW50PSR7dHJ1ZX0KICAgICAgICA+PC9kZWVzLWlucHV0LXJpY2h0ZXh0PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiMi4gV2l0aCBQbGFjZWhvbGRlciJ9IC5zdWJ0aXRsZT0keyJFbXB0eSBlZGl0b3Igd2l0aCBwbGFjZWhvbGRlciB0ZXh0In0+CiAgICAgICAgPGRlZXMtaW5wdXQtcmljaHRleHQgCiAgICAgICAgICAubGFiZWw9JHsiQmxvZyBQb3N0In0gCiAgICAgICAgICAucGxhY2Vob2xkZXI9JHsiU3RhcnQgd3JpdGluZyB5b3VyIGJsb2cgcG9zdCBoZXJlLi4uIn0KICAgICAgICAgIC5zaG93V29yZENvdW50PSR7dHJ1ZX0KICAgICAgICA+PC9kZWVzLWlucHV0LXJpY2h0ZXh0PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiMy4gRGlmZmVyZW50IEhlaWdodHMifSAuc3VidGl0bGU9JHsiRWRpdG9ycyB3aXRoIGRpZmZlcmVudCBtaW5pbXVtIGhlaWdodHMgZm9yIHZhcmlvdXMgdXNlIGNhc2VzIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iZ3JpZC1sYXlvdXQiPgogICAgICAgICAgPGRlZXMtaW5wdXQtcmljaHRleHQgCiAgICAgICAgICAgIC5sYWJlbD0keyJTaG9ydCBOb3RlIn0gCiAgICAgICAgICAgIC5taW5IZWlnaHQ9JHsxNTB9CiAgICAgICAgICAgIC5wbGFjZWhvbGRlcj0keyJRdWljayBub3RlLi4uIn0KICAgICAgICAgICAgLnNob3dXb3JkQ291bnQ9JHtmYWxzZX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtcmljaHRleHQ+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LXJpY2h0ZXh0IAogICAgICAgICAgICAubGFiZWw9JHsiRXh0ZW5kZWQgQ29udGVudCJ9IAogICAgICAgICAgICAubWluSGVpZ2h0PSR7MzAwfQogICAgICAgICAgICAucGxhY2Vob2xkZXI9JHsiV3JpdGUgeW91ciBleHRlbmRlZCBjb250ZW50IGhlcmUuLi4ifQogICAgICAgICAgICAuc2hvd1dvcmRDb3VudD0ke3RydWV9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXJpY2h0ZXh0PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiNC4gQ29kZSBFeGFtcGxlcyJ9IC5zdWJ0aXRsZT0keyJFZGl0b3IgcHJlLWZpbGxlZCB3aXRoIGNvZGUgZXhhbXBsZXMifT4KICAgICAgICA8ZGVlcy1pbnB1dC1yaWNodGV4dCAKICAgICAgICAgIC5sYWJlbD0keyJUZWNobmljYWwgRG9jdW1lbnRhdGlvbiJ9IAogICAgICAgICAgLnZhbHVlPSR7JzxoMj5JbnN0YWxsYXRpb24gR3VpZGU8L2gyPjxwPlRvIGluc3RhbGwgdGhlIHBhY2thZ2UsIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6PC9wPjxwcmU+PGNvZGU+bnBtIGluc3RhbGwgQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nPC9jb2RlPjwvcHJlPjxwPlRoZW4gaW1wb3J0IHRoZSBjb21wb25lbnQgaW4geW91ciBUeXBlU2NyaXB0IGZpbGU6PC9wPjxwcmU+PGNvZGU+aW1wb3J0IHsgRGVlc0lucHV0UmljaHRleHQgfSBmcm9tICJAZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2ciOzwvY29kZT48L3ByZT48cD5Zb3UgY2FuIG5vdyB1c2UgdGhlIDxjb2RlPiZsdDtkZWVzLWlucHV0LXJpY2h0ZXh0Jmd0OzwvY29kZT4gZWxlbWVudCBpbiB5b3VyIHRlbXBsYXRlcy48L3A+J30KICAgICAgICAgIC5taW5IZWlnaHQ9JHsyNTB9CiAgICAgICAgICAuc2hvd1dvcmRDb3VudD0ke3RydWV9CiAgICAgICAgPjwvZGVlcy1pbnB1dC1yaWNodGV4dD4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgICAKICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjUuIERpc2FibGVkIFN0YXRlIn0gLnN1YnRpdGxlPSR7IlJlYWQtb25seSByaWNoIHRleHQgY29udGVudCJ9PgogICAgICAgIDxkZWVzLWlucHV0LXJpY2h0ZXh0IAogICAgICAgICAgLmxhYmVsPSR7IlB1Ymxpc2hlZCBBcnRpY2xlIChSZWFkIE9ubHkpIn0gCiAgICAgICAgICAudmFsdWU9JHsnPGgyPlRoZSBGdXR1cmUgb2YgV2ViIENvbXBvbmVudHM8L2gyPjxwPldlYiBDb21wb25lbnRzIGhhdmUgcmV2b2x1dGlvbml6ZWQgaG93IHdlIGJ1aWxkIG1vZGVybiB3ZWIgYXBwbGljYXRpb25zLi4uPC9wPjxibG9ja3F1b3RlPjxwPiJUaGUgZnV0dXJlIG9mIHdlYiBkZXZlbG9wbWVudCBsaWVzIGluIHJldXNhYmxlLCBlbmNhcHN1bGF0ZWQgY29tcG9uZW50cy4iPC9wPjwvYmxvY2txdW90ZT4nfQogICAgICAgICAgLmRpc2FibGVkPSR7dHJ1ZX0KICAgICAgICAgIC5zaG93V29yZENvdW50PSR7dHJ1ZX0KICAgICAgICA+PC9kZWVzLWlucHV0LXJpY2h0ZXh0PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICAgIAogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiNi4gSW50ZXJhY3RpdmUgRGVtbyJ9IC5zdWJ0aXRsZT0keyJUeXBlIGluIHRoZSBlZGl0b3IgYmVsb3cgYW5kIHNlZSB0aGUgSFRNTCBvdXRwdXQifT4KICAgICAgICA8ZGVlcy1pbnB1dC1yaWNodGV4dCAKICAgICAgICAgIGlkPSJpbnRlcmFjdGl2ZS1lZGl0b3IiCiAgICAgICAgICAubGFiZWw9JHsiVHJ5IGl0IHlvdXJzZWxmIn0gCiAgICAgICAgICAucGxhY2Vob2xkZXI9JHsiVHlwZSBzb21ldGhpbmcgaGVyZS4uLiJ9CiAgICAgICAgICAuc2hvd1dvcmRDb3VudD0ke3RydWV9CiAgICAgICAgICBAY2hhbmdlPSR7KGUxMSkgPT4gewogIGNvbnN0IG91dHB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNvdXRwdXQtcHJldmlldyIpOwogIGlmIChvdXRwdXQpIHsKICAgIG91dHB1dC50ZXh0Q29udGVudCA9IGUxMS5kZXRhaWwudmFsdWU7CiAgfQp9fQogICAgICAgID48L2RlZXMtaW5wdXQtcmljaHRleHQ+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0ib3V0cHV0LXByZXZpZXciIGlkPSJvdXRwdXQtcHJldmlldyI+CiAgICAgICAgICA8ZW0+SFRNTCBvdXRwdXQgd2lsbCBhcHBlYXIgaGVyZS4uLjwvZW0+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGl2PgogIDwvZGVlcy1kZW1vd3JhcHBlcj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1pbnB1dC9kZWVzLWlucHV0LXJpY2h0ZXh0L3N0eWxlcy5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgcmljaHRleHRTdHlsZXMgPSBbCiAgLi4uRGVlc0lucHV0QmFzZS5iYXNlU3R5bGVzLAogIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZvbnQtZmFtaWx5OiBJbnRlciwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBSb2JvdG8sIHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC5pbnB1dC13cmFwcGVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5sYWJlbCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTUlKSIsICJoc2woMCAwJSA5My45JSkiKX07CiAgICAgIH0KCiAgICAgIC5lZGl0b3ItY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgbWluLWhlaWdodDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIjIwMHB4IiwgIjIwMHB4Iil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICAgICAgfQoKICAgICAgLmVkaXRvci1jb250YWluZXI6aG92ZXIgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDc5LjglKSIsICJoc2woMCAwJSAyMC45JSkiKX07CiAgICAgIH0KCiAgICAgIC5lZGl0b3ItY29udGFpbmVyLmZvY3VzZWQgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5OCUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUgLyAwLjA1KSIsICJoc2woMCAwJSA5OCUgLyAwLjA1KSIpfTsKICAgICAgfQoKICAgICAgLmVkaXRvci10b29sYmFyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBnYXA6IDRweDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA0Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLWJ1dHRvbiBkZWVzLWljb24gewogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUuMSUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICB9CgogICAgICAudG9vbGJhci1idXR0b24uYWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk4JSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSAzLjklKSIpfTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItYnV0dG9uOmRpc2FibGVkIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItZGl2aWRlciB7CiAgICAgICAgd2lkdGg6IDFweDsKICAgICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgbWFyZ2luOiAwIDRweDsKICAgICAgfQoKICAgICAgLmVkaXRvci1jb250ZW50IHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtaW4taGVpZ2h0OiB2YXIoLS1taW4taGVpZ2h0LCAyMDBweCk7CiAgICAgIH0KCiAgICAgIC5lZGl0b3ItY29udGVudCAuUHJvc2VNaXJyb3IgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDMuOSUpIiwgImhzbCgwIDAlIDk4JSkiKX07CiAgICAgICAgbWluLWhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmVkaXRvci1jb250ZW50IC5Qcm9zZU1pcnJvciBwIHsKICAgICAgICBtYXJnaW46IDAuNWVtIDA7CiAgICAgIH0KCiAgICAgIC5lZGl0b3ItY29udGVudCAuUHJvc2VNaXJyb3IgcDpmaXJzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgfQoKICAgICAgLmVkaXRvci1jb250ZW50IC5Qcm9zZU1pcnJvciBwOmxhc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICAgIH0KCiAgICAgIC5lZGl0b3ItY29udGVudCAuUHJvc2VNaXJyb3IgaDEgewogICAgICAgIGZvbnQtc2l6ZTogMmVtOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIG1hcmdpbjogMWVtIDAgMC41ZW0gMDsKICAgICAgICBsaW5lLWhlaWdodDogMS4yOwogICAgICB9CgogICAgICAuZWRpdG9yLWNvbnRlbnQgLlByb3NlTWlycm9yIGgyIHsKICAgICAgICBmb250LXNpemU6IDEuNWVtOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIG1hcmdpbjogMWVtIDAgMC41ZW0gMDsKICAgICAgICBsaW5lLWhlaWdodDogMS4zOwogICAgICB9CgogICAgICAuZWRpdG9yLWNvbnRlbnQgLlByb3NlTWlycm9yIGgzIHsKICAgICAgICBmb250LXNpemU6IDEuMjVlbTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBtYXJnaW46IDFlbSAwIDAuNWVtIDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgICAgfQoKICAgICAgLmVkaXRvci1jb250ZW50IC5Qcm9zZU1pcnJvciB1bCwKICAgICAgLmVkaXRvci1jb250ZW50IC5Qcm9zZU1pcnJvciBvbCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IDAuNWVtIDA7CiAgICAgIH0KCiAgICAgIC5lZGl0b3ItY29udGVudCAuUHJvc2VNaXJyb3IgbGkgewogICAgICAgIG1hcmdpbjogMC4yNWVtIDA7CiAgICAgIH0KCiAgICAgIC5lZGl0b3ItY29udGVudCAuUHJvc2VNaXJyb3IgYmxvY2txdW90ZSB7CiAgICAgICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBtYXJnaW46IDFlbSAwOwogICAgICAgIHBhZGRpbmctbGVmdDogMWVtOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDQ2LjklKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KCiAgICAgIC5lZGl0b3ItY29udGVudCAuUHJvc2VNaXJyb3IgY29kZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk1LjElKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIHBhZGRpbmc6IDAuMmVtIDAuNGVtOwogICAgICAgIGZvbnQtZmFtaWx5OiAnSW50ZWwgT25lIE1vbm8nLCAnRmlyYSBDb2RlJywgJ1NGIE1vbm8nLCBNb25hY28sICdDYXNjYWRpYSBDb2RlJywgJ1JvYm90byBNb25vJywgQ29uc29sYXMsICdDb3VyaWVyIE5ldycsIG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDAuOWVtOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTUlKSIsICJoc2woMCAwJSA5My45JSkiKX07CiAgICAgIH0KCiAgICAgIC5lZGl0b3ItY29udGVudCAuUHJvc2VNaXJyb3IgcHJlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMy45JSkiLCAiaHNsKDAgMCUgOTglKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk4JSkiLCAiaHNsKDAgMCUgMy45JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgICBtYXJnaW46IDFlbSAwOwogICAgICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICAgIH0KCiAgICAgIC5lZGl0b3ItY29udGVudCAuUHJvc2VNaXJyb3IgcHJlIGNvZGUgewogICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwOwogICAgICB9CgogICAgICAuZWRpdG9yLWNvbnRlbnQgLlByb3NlTWlycm9yIGEgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIil9OwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgLmVkaXRvci1jb250ZW50IC5Qcm9zZU1pcnJvciBhOmhvdmVyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA0MS4yJSkiLCAiaHNsKDIxNy4yIDkxLjIlIDY5LjglKSIpfTsKICAgICAgfQoKICAgICAgLmVkaXRvci1mb290ZXIgewogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5Ni4xJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNDYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC53b3JkLWNvdW50IHsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICB9CgogICAgICAubGluay1pbnB1dCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxMDAlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDklKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgYm94LXNoYWRvdzogMCA0cHggNnB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjEpOwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgei1pbmRleDogMTAwMDsKICAgICAgfQoKICAgICAgLmxpbmstaW5wdXQuc2hvdyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC5saW5rLWlucHV0IGlucHV0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDklKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDMuOSUpIiwgImhzbCgwIDAlIDk4JSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICAgICAgfQoKICAgICAgLmxpbmstaW5wdXQgaW5wdXQ6Zm9jdXMgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5OCUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUgLyAwLjA1KSIsICJoc2woMCAwJSA5OCUgLyAwLjA1KSIpfTsKICAgICAgfQoKICAgICAgLmxpbmstaW5wdXQtYnV0dG9ucyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBtYXJnaW4tdG9wOiA4cHg7CiAgICAgIH0KCiAgICAgIC5saW5rLWlucHV0LWJ1dHRvbnMgYnV0dG9uIHsKICAgICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDklKSIpfTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDUuMSUpIiwgImhzbCgwIDAlIDYzLjklKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICB9CgogICAgICAubGluay1pbnB1dC1idXR0b25zIGJ1dHRvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk1LjElKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTUlKSIpfTsKICAgICAgfQoKICAgICAgLmxpbmstaW5wdXQtYnV0dG9ucyBidXR0b24ucHJpbWFyeSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5OCUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgMy45JSkiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk4JSkiKX07CiAgICAgIH0KCiAgICAgIC5saW5rLWlucHV0LWJ1dHRvbnMgYnV0dG9uLnByaW1hcnk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxNSUpIiwgImhzbCgwIDAlIDkzLjklKSIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxNSUpIiwgImhzbCgwIDAlIDkzLjklKSIpfTsKICAgICAgfQoKICAgICAgLmRlc2NyaXB0aW9uIHsKICAgICAgICBtYXJnaW4tdG9wOiA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDQ2LjklKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgICBsaW5lLWhlaWdodDogMS40OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAuZWRpdG9yLWNvbnRhaW5lciB7CiAgICAgICAgb3BhY2l0eTogMC42OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIC50b29sYmFyLWJ1dHRvbiwKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgLmVkaXRvci1jb250ZW50IHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgYApdOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L2RlZXMtaW5wdXQtcmljaHRleHQvdGVtcGxhdGUuanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIHJlbmRlclJpY2h0ZXh0ID0gKGNvbXBvbmVudCkgPT4gewogIHJldHVybiBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC13cmFwcGVyIj4KICAgICAgICAgICR7Y29tcG9uZW50LmxhYmVsID8gYjJgPGxhYmVsIGNsYXNzPSJsYWJlbCI+JHtjb21wb25lbnQubGFiZWx9PC9sYWJlbD5gIDogIiJ9CiAgICAgICAgICA8ZGl2IGNsYXNzPSJlZGl0b3ItY29udGFpbmVyICR7Y29tcG9uZW50LmVkaXRvcj8uaXNGb2N1c2VkID8gImZvY3VzZWQiIDogIiJ9IiBzdHlsZT0iLS1taW4taGVpZ2h0OiAke2NvbXBvbmVudC5taW5IZWlnaHR9cHgiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJlZGl0b3ItdG9vbGJhciI+CiAgICAgICAgICAgICAgJHtjb21wb25lbnQucmVuZGVyVG9vbGJhcigpfQogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmstaW5wdXQgJHtjb21wb25lbnQuc2hvd0xpbmtJbnB1dCA/ICJzaG93IiA6ICIifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idXJsIiBwbGFjZWhvbGRlcj0iRW50ZXIgVVJMLi4uIiBAa2V5ZG93bj0ke2NvbXBvbmVudC5oYW5kbGVMaW5rSW5wdXRLZXlkb3dufSAvPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGluay1pbnB1dC1idXR0b25zIj4KICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0icHJpbWFyeSIgQGNsaWNrPSR7Y29tcG9uZW50LnNhdmVMaW5rfT5TYXZlPC9idXR0b24+CiAgICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPSR7Y29tcG9uZW50LnJlbW92ZUxpbmt9PlJlbW92ZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz0ke2NvbXBvbmVudC5oaWRlTGlua0lucHV0fT5DYW5jZWw8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZWRpdG9yLWNvbnRlbnQiPjwvZGl2PgogICAgICAgICAgICAke2NvbXBvbmVudC5zaG93V29yZENvdW50ID8gYjJgCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVkaXRvci1mb290ZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ3b3JkLWNvdW50Ij4ke2NvbXBvbmVudC53b3JkQ291bnR9IHdvcmQke2NvbXBvbmVudC53b3JkQ291bnQgIT09IDEgPyAicyIgOiAiIn08L3NwYW4+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgYCA6ICIifQogICAgICAgICAgPC9kaXY+CiAgICAgICAgICAke2NvbXBvbmVudC5kZXNjcmlwdGlvbiA/IGIyYDxkaXYgY2xhc3M9ImRlc2NyaXB0aW9uIj4ke2NvbXBvbmVudC5kZXNjcmlwdGlvbn08L2Rpdj5gIDogIiJ9CiAgICAgICAgPC9kaXY+CiAgICAgIGA7Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvZGVlcy1pbnB1dC1yaWNodGV4dC9jb21wb25lbnQuanMKaW5pdF9kZWVzX2ljb24oKTsKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF9zZXJ2aWNlcygpOwp2YXIgX19lc0RlY29yYXRlMzggPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczM5ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzSW5wdXRSaWNodGV4dCA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1pbnB1dC1yaWNodGV4dCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzSW5wdXRCYXNlOwogIGxldCBfdmFsdWVfZGVjb3JhdG9yczsKICBsZXQgX3ZhbHVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BsYWNlaG9sZGVyX2RlY29yYXRvcnM7CiAgbGV0IF9wbGFjZWhvbGRlcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BsYWNlaG9sZGVyX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93V29yZENvdW50X2RlY29yYXRvcnM7CiAgbGV0IF9zaG93V29yZENvdW50X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1dvcmRDb3VudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWluSGVpZ2h0X2RlY29yYXRvcnM7CiAgbGV0IF9taW5IZWlnaHRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9taW5IZWlnaHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dMaW5rSW5wdXRfZGVjb3JhdG9yczsKICBsZXQgX3Nob3dMaW5rSW5wdXRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93TGlua0lucHV0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF93b3JkQ291bnRfZGVjb3JhdG9yczsKICBsZXQgX3dvcmRDb3VudF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3dvcmRDb3VudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW5wdXRSaWNodGV4dDIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF92YWx1ZV9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgcmVmbGVjdDogdHJ1ZQogICAgICB9KV07CiAgICAgIF9wbGFjZWhvbGRlcl9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBTdHJpbmcKICAgICAgfSldOwogICAgICBfc2hvd1dvcmRDb3VudF9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBCb29sZWFuCiAgICAgIH0pXTsKICAgICAgX21pbkhlaWdodF9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBOdW1iZXIKICAgICAgfSldOwogICAgICBfc2hvd0xpbmtJbnB1dF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfd29yZENvdW50X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTM4KHRoaXMsIG51bGwsIF92YWx1ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2YWx1ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmFsdWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmFsdWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZhbHVlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZhbHVlX2luaXRpYWxpemVycywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzgodGhpcywgbnVsbCwgX3BsYWNlaG9sZGVyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInBsYWNlaG9sZGVyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJwbGFjZWhvbGRlciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5wbGFjZWhvbGRlciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucGxhY2Vob2xkZXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcGxhY2Vob2xkZXJfaW5pdGlhbGl6ZXJzLCBfcGxhY2Vob2xkZXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzOCh0aGlzLCBudWxsLCBfc2hvd1dvcmRDb3VudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93V29yZENvdW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93V29yZENvdW50IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dXb3JkQ291bnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dXb3JkQ291bnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd1dvcmRDb3VudF9pbml0aWFsaXplcnMsIF9zaG93V29yZENvdW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzgodGhpcywgbnVsbCwgX21pbkhlaWdodF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtaW5IZWlnaHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1pbkhlaWdodCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5taW5IZWlnaHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1pbkhlaWdodCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9taW5IZWlnaHRfaW5pdGlhbGl6ZXJzLCBfbWluSGVpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzgodGhpcywgbnVsbCwgX3Nob3dMaW5rSW5wdXRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2hvd0xpbmtJbnB1dCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd0xpbmtJbnB1dCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93TGlua0lucHV0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaG93TGlua0lucHV0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dMaW5rSW5wdXRfaW5pdGlhbGl6ZXJzLCBfc2hvd0xpbmtJbnB1dF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM4KHRoaXMsIG51bGwsIF93b3JkQ291bnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAid29yZENvdW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ3b3JkQ291bnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoud29yZENvdW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai53b3JkQ291bnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfd29yZENvdW50X2luaXRpYWxpemVycywgX3dvcmRDb3VudF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM4KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0lucHV0UmljaHRleHQyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMyNzsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJJbnB1dCJdOwogICAgI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczM5KHRoaXMsIF92YWx1ZV9pbml0aWFsaXplcnMsICIiKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgdmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLiN2YWx1ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3BsYWNlaG9sZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzOSh0aGlzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM5KHRoaXMsIF9wbGFjZWhvbGRlcl9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgcGxhY2Vob2xkZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwbGFjZWhvbGRlcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHBsYWNlaG9sZGVyKHZhbHVlMikgewogICAgICB0aGlzLiNwbGFjZWhvbGRlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dXb3JkQ291bnRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczM5KHRoaXMsIF9wbGFjZWhvbGRlcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzkodGhpcywgX3Nob3dXb3JkQ291bnRfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgc2hvd1dvcmRDb3VudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dXb3JkQ291bnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93V29yZENvdW50KHZhbHVlMikgewogICAgICB0aGlzLiNzaG93V29yZENvdW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWluSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnMzOSh0aGlzLCBfc2hvd1dvcmRDb3VudF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzkodGhpcywgX21pbkhlaWdodF9pbml0aWFsaXplcnMsIDIwMCkpOwogICAgZ2V0IG1pbkhlaWdodCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21pbkhlaWdodF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1pbkhlaWdodCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWluSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd0xpbmtJbnB1dF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzkodGhpcywgX21pbkhlaWdodF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMzkodGhpcywgX3Nob3dMaW5rSW5wdXRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHNob3dMaW5rSW5wdXQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93TGlua0lucHV0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd0xpbmtJbnB1dCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2hvd0xpbmtJbnB1dF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3dvcmRDb3VudF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMzkodGhpcywgX3Nob3dMaW5rSW5wdXRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczM5KHRoaXMsIF93b3JkQ291bnRfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgd29yZENvdW50KCkgewogICAgICByZXR1cm4gdGhpcy4jd29yZENvdW50X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgd29yZENvdW50KHZhbHVlMikgewogICAgICB0aGlzLiN3b3JkQ291bnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGVkaXRvckVsZW1lbnQgPSBfX3J1bkluaXRpYWxpemVyczM5KHRoaXMsIF93b3JkQ291bnRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgbGlua0lucHV0RWxlbWVudDsKICAgIHRpcHRhcEJ1bmRsZSA9IG51bGw7CiAgICBlZGl0b3I7CiAgICBzdGF0aWMgc3R5bGVzID0gcmljaHRleHRTdHlsZXM7CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiByZW5kZXJSaWNodGV4dCh0aGlzKTsKICAgIH0KICAgIHJlbmRlclRvb2xiYXIoKSB7CiAgICAgIGNvbnN0IGJ1dHRvbnMgPSB0aGlzLmdldFRvb2xiYXJCdXR0b25zKCk7CiAgICAgIHJldHVybiBiMmAKICAgICAgJHtidXR0b25zLm1hcCgoYnV0dG9uKSA9PiB7CiAgICAgICAgaWYgKGJ1dHRvbi5pc0RpdmlkZXIpIHsKICAgICAgICAgIHJldHVybiBiMmA8ZGl2IGNsYXNzPSJ0b29sYmFyLWRpdmlkZXIiPjwvZGl2PmA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBiMmAKICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgY2xhc3M9InRvb2xiYXItYnV0dG9uICR7YnV0dG9uLmlzQWN0aXZlPy4oKSA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICBAY2xpY2s9JHtidXR0b24uYWN0aW9ufQogICAgICAgICAgICB0aXRsZT0ke2J1dHRvbi50aXRsZX0KICAgICAgICAgICAgP2Rpc2FibGVkPSR7dGhpcy5kaXNhYmxlZCB8fCAhdGhpcy5lZGl0b3J9CiAgICAgICAgICA+CiAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHtidXR0b24uaWNvbn0+PC9kZWVzLWljb24+CiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICBgOwogICAgICB9KX0KICAgIGA7CiAgICB9CiAgICBnZXRUb29sYmFyQnV0dG9ucygpIHsKICAgICAgaWYgKCF0aGlzLmVkaXRvcikKICAgICAgICByZXR1cm4gW107CiAgICAgIHJldHVybiBbCiAgICAgICAgewogICAgICAgICAgbmFtZTogImJvbGQiLAogICAgICAgICAgaWNvbjogImx1Y2lkZTpib2xkIiwKICAgICAgICAgIHRpdGxlOiAiQm9sZCAoQ3RybCtCKSIsCiAgICAgICAgICBhY3Rpb246ICgpID0+IHRoaXMuZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVCb2xkKCkucnVuKCksCiAgICAgICAgICBpc0FjdGl2ZTogKCkgPT4gdGhpcy5lZGl0b3IuaXNBY3RpdmUoImJvbGQiKQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIml0YWxpYyIsCiAgICAgICAgICBpY29uOiAibHVjaWRlOml0YWxpYyIsCiAgICAgICAgICB0aXRsZTogIkl0YWxpYyAoQ3RybCtJKSIsCiAgICAgICAgICBhY3Rpb246ICgpID0+IHRoaXMuZWRpdG9yLmNoYWluKCkuZm9jdXMoKS50b2dnbGVJdGFsaWMoKS5ydW4oKSwKICAgICAgICAgIGlzQWN0aXZlOiAoKSA9PiB0aGlzLmVkaXRvci5pc0FjdGl2ZSgiaXRhbGljIikKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJ1bmRlcmxpbmUiLAogICAgICAgICAgaWNvbjogImx1Y2lkZTp1bmRlcmxpbmUiLAogICAgICAgICAgdGl0bGU6ICJVbmRlcmxpbmUgKEN0cmwrVSkiLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlVW5kZXJsaW5lKCkucnVuKCksCiAgICAgICAgICBpc0FjdGl2ZTogKCkgPT4gdGhpcy5lZGl0b3IuaXNBY3RpdmUoInVuZGVybGluZSIpCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAic3RyaWtlIiwKICAgICAgICAgIGljb246ICJsdWNpZGU6c3RyaWtldGhyb3VnaCIsCiAgICAgICAgICB0aXRsZTogIlN0cmlrZXRocm91Z2giLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlU3RyaWtlKCkucnVuKCksCiAgICAgICAgICBpc0FjdGl2ZTogKCkgPT4gdGhpcy5lZGl0b3IuaXNBY3RpdmUoInN0cmlrZSIpCiAgICAgICAgfSwKICAgICAgICB7IG5hbWU6ICJkaXZpZGVyMSIsIHRpdGxlOiAiIiwgaXNEaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogImgxIiwKICAgICAgICAgIGljb246ICJsdWNpZGU6aGVhZGluZzEiLAogICAgICAgICAgdGl0bGU6ICJIZWFkaW5nIDEiLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlSGVhZGluZyh7IGxldmVsOiAxIH0pLnJ1bigpLAogICAgICAgICAgaXNBY3RpdmU6ICgpID0+IHRoaXMuZWRpdG9yLmlzQWN0aXZlKCJoZWFkaW5nIiwgeyBsZXZlbDogMSB9KQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogImgyIiwKICAgICAgICAgIGljb246ICJsdWNpZGU6aGVhZGluZzIiLAogICAgICAgICAgdGl0bGU6ICJIZWFkaW5nIDIiLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlSGVhZGluZyh7IGxldmVsOiAyIH0pLnJ1bigpLAogICAgICAgICAgaXNBY3RpdmU6ICgpID0+IHRoaXMuZWRpdG9yLmlzQWN0aXZlKCJoZWFkaW5nIiwgeyBsZXZlbDogMiB9KQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogImgzIiwKICAgICAgICAgIGljb246ICJsdWNpZGU6aGVhZGluZzMiLAogICAgICAgICAgdGl0bGU6ICJIZWFkaW5nIDMiLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlSGVhZGluZyh7IGxldmVsOiAzIH0pLnJ1bigpLAogICAgICAgICAgaXNBY3RpdmU6ICgpID0+IHRoaXMuZWRpdG9yLmlzQWN0aXZlKCJoZWFkaW5nIiwgeyBsZXZlbDogMyB9KQogICAgICAgIH0sCiAgICAgICAgeyBuYW1lOiAiZGl2aWRlcjIiLCB0aXRsZTogIiIsIGlzRGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJidWxsZXRMaXN0IiwKICAgICAgICAgIGljb246ICJsdWNpZGU6bGlzdCIsCiAgICAgICAgICB0aXRsZTogIkJ1bGxldCBMaXN0IiwKICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUJ1bGxldExpc3QoKS5ydW4oKSwKICAgICAgICAgIGlzQWN0aXZlOiAoKSA9PiB0aGlzLmVkaXRvci5pc0FjdGl2ZSgiYnVsbGV0TGlzdCIpCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAib3JkZXJlZExpc3QiLAogICAgICAgICAgaWNvbjogImx1Y2lkZTpsaXN0T3JkZXJlZCIsCiAgICAgICAgICB0aXRsZTogIk51bWJlcmVkIExpc3QiLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmVkaXRvci5jaGFpbigpLmZvY3VzKCkudG9nZ2xlT3JkZXJlZExpc3QoKS5ydW4oKSwKICAgICAgICAgIGlzQWN0aXZlOiAoKSA9PiB0aGlzLmVkaXRvci5pc0FjdGl2ZSgib3JkZXJlZExpc3QiKQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogImJsb2NrcXVvdGUiLAogICAgICAgICAgaWNvbjogImx1Y2lkZTpxdW90ZSIsCiAgICAgICAgICB0aXRsZTogIlF1b3RlIiwKICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUJsb2NrcXVvdGUoKS5ydW4oKSwKICAgICAgICAgIGlzQWN0aXZlOiAoKSA9PiB0aGlzLmVkaXRvci5pc0FjdGl2ZSgiYmxvY2txdW90ZSIpCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiY29kZSIsCiAgICAgICAgICBpY29uOiAibHVjaWRlOmNvZGUiLAogICAgICAgICAgdGl0bGU6ICJDb2RlIiwKICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUNvZGUoKS5ydW4oKSwKICAgICAgICAgIGlzQWN0aXZlOiAoKSA9PiB0aGlzLmVkaXRvci5pc0FjdGl2ZSgiY29kZSIpCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiY29kZUJsb2NrIiwKICAgICAgICAgIGljb246ICJsdWNpZGU6ZmlsZUNvZGUiLAogICAgICAgICAgdGl0bGU6ICJDb2RlIEJsb2NrIiwKICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUNvZGVCbG9jaygpLnJ1bigpLAogICAgICAgICAgaXNBY3RpdmU6ICgpID0+IHRoaXMuZWRpdG9yLmlzQWN0aXZlKCJjb2RlQmxvY2siKQogICAgICAgIH0sCiAgICAgICAgeyBuYW1lOiAiZGl2aWRlcjMiLCB0aXRsZTogIiIsIGlzRGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJsaW5rIiwKICAgICAgICAgIGljb246ICJsdWNpZGU6bGluayIsCiAgICAgICAgICB0aXRsZTogIkFkZCBMaW5rIiwKICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy50b2dnbGVMaW5rKCksCiAgICAgICAgICBpc0FjdGl2ZTogKCkgPT4gdGhpcy5lZGl0b3IuaXNBY3RpdmUoImxpbmsiKQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogImFsaWduTGVmdCIsCiAgICAgICAgICBpY29uOiAibHVjaWRlOmFsaWduTGVmdCIsCiAgICAgICAgICB0aXRsZTogIkFsaWduIExlZnQiLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmVkaXRvci5jaGFpbigpLmZvY3VzKCkuc2V0VGV4dEFsaWduKCJsZWZ0IikucnVuKCksCiAgICAgICAgICBpc0FjdGl2ZTogKCkgPT4gdGhpcy5lZGl0b3IuaXNBY3RpdmUoeyB0ZXh0QWxpZ246ICJsZWZ0IiB9KQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogImFsaWduQ2VudGVyIiwKICAgICAgICAgIGljb246ICJsdWNpZGU6YWxpZ25DZW50ZXIiLAogICAgICAgICAgdGl0bGU6ICJBbGlnbiBDZW50ZXIiLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmVkaXRvci5jaGFpbigpLmZvY3VzKCkuc2V0VGV4dEFsaWduKCJjZW50ZXIiKS5ydW4oKSwKICAgICAgICAgIGlzQWN0aXZlOiAoKSA9PiB0aGlzLmVkaXRvci5pc0FjdGl2ZSh7IHRleHRBbGlnbjogImNlbnRlciIgfSkKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJhbGlnblJpZ2h0IiwKICAgICAgICAgIGljb246ICJsdWNpZGU6YWxpZ25SaWdodCIsCiAgICAgICAgICB0aXRsZTogIkFsaWduIFJpZ2h0IiwKICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpLnNldFRleHRBbGlnbigicmlnaHQiKS5ydW4oKSwKICAgICAgICAgIGlzQWN0aXZlOiAoKSA9PiB0aGlzLmVkaXRvci5pc0FjdGl2ZSh7IHRleHRBbGlnbjogInJpZ2h0IiB9KQogICAgICAgIH0sCiAgICAgICAgeyBuYW1lOiAiZGl2aWRlcjQiLCB0aXRsZTogIiIsIGlzRGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJ1bmRvIiwKICAgICAgICAgIGljb246ICJsdWNpZGU6dW5kbyIsCiAgICAgICAgICB0aXRsZTogIlVuZG8gKEN0cmwrWikiLAogICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmVkaXRvci5jaGFpbigpLmZvY3VzKCkudW5kbygpLnJ1bigpCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAicmVkbyIsCiAgICAgICAgICBpY29uOiAibHVjaWRlOnJlZG8iLAogICAgICAgICAgdGl0bGU6ICJSZWRvIChDdHJsK1kpIiwKICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpLnJlZG8oKS5ydW4oKQogICAgICAgIH0KICAgICAgXTsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZCgpIHsKICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgdGhpcy50aXB0YXBCdW5kbGUgPSBhd2FpdCBEZWVzU2VydmljZUxpYkxvYWRlci5nZXRJbnN0YW5jZSgpLmxvYWRUaXB0YXAoKTsKICAgICAgdGhpcy5lZGl0b3JFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5lZGl0b3ItY29udGVudCIpOwogICAgICB0aGlzLmxpbmtJbnB1dEVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmxpbmstaW5wdXQgaW5wdXQiKTsKICAgICAgdGhpcy5pbml0aWFsaXplRWRpdG9yKCk7CiAgICB9CiAgICBpbml0aWFsaXplRWRpdG9yKCkgewogICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAhdGhpcy50aXB0YXBCdW5kbGUpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCB7IEVkaXRvciwgU3RhcnRlcktpdCwgVW5kZXJsaW5lOiBVbmRlcmxpbmUyLCBUZXh0QWxpZ24sIExpbms6IExpbmszLCBUeXBvZ3JhcGh5IH0gPSB0aGlzLnRpcHRhcEJ1bmRsZTsKICAgICAgdGhpcy5lZGl0b3IgPSBuZXcgRWRpdG9yKHsKICAgICAgICBlbGVtZW50OiB0aGlzLmVkaXRvckVsZW1lbnQsCiAgICAgICAgZXh0ZW5zaW9uczogWwogICAgICAgICAgU3RhcnRlcktpdC5jb25maWd1cmUoewogICAgICAgICAgICBoZWFkaW5nOiB7CiAgICAgICAgICAgICAgbGV2ZWxzOiBbMSwgMiwgM10KICAgICAgICAgICAgfQogICAgICAgICAgfSksCiAgICAgICAgICBVbmRlcmxpbmUyLmNvbmZpZ3VyZSh7fSksCiAgICAgICAgICBUZXh0QWxpZ24uY29uZmlndXJlKHsKICAgICAgICAgICAgdHlwZXM6IFsiaGVhZGluZyIsICJwYXJhZ3JhcGgiXQogICAgICAgICAgfSksCiAgICAgICAgICBMaW5rMy5jb25maWd1cmUoewogICAgICAgICAgICBvcGVuT25DbGljazogZmFsc2UsCiAgICAgICAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7CiAgICAgICAgICAgICAgY2xhc3M6ICJlZGl0b3ItbGluayIKICAgICAgICAgICAgfQogICAgICAgICAgfSksCiAgICAgICAgICBUeXBvZ3JhcGh5LmNvbmZpZ3VyZSh7fSkKICAgICAgICBdLAogICAgICAgIGNvbnRlbnQ6IHRoaXMudmFsdWUgfHwgKHRoaXMucGxhY2Vob2xkZXIgPyBgPHA+JHt0aGlzLnBsYWNlaG9sZGVyfTwvcD5gIDogIiIpLAogICAgICAgIG9uVXBkYXRlOiAoeyBlZGl0b3IgfSkgPT4gewogICAgICAgICAgdGhpcy52YWx1ZSA9IGVkaXRvci5nZXRIVE1MKCk7CiAgICAgICAgICB0aGlzLnVwZGF0ZVdvcmRDb3VudCgpOwogICAgICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcy52YWx1ZSk7CiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpbnB1dCIsIHsKICAgICAgICAgICAgZGV0YWlsOiB7IHZhbHVlOiB0aGlzLnZhbHVlIH0sCiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgICB9KSk7CiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjaGFuZ2UiLCB7CiAgICAgICAgICAgIGRldGFpbDogeyB2YWx1ZTogdGhpcy52YWx1ZSB9LAogICAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgICAgfSkpOwogICAgICAgIH0sCiAgICAgICAgb25TZWxlY3Rpb25VcGRhdGU6ICgpID0+IHsKICAgICAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgICAgIH0sCiAgICAgICAgb25Gb2N1czogKCkgPT4gewogICAgICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7CiAgICAgICAgfSwKICAgICAgICBvbkJsdXI6ICgpID0+IHsKICAgICAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMudXBkYXRlV29yZENvdW50KCk7CiAgICB9CiAgICB1cGRhdGVXb3JkQ291bnQoKSB7CiAgICAgIGlmICghdGhpcy5lZGl0b3IpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCB0ZXh0OSA9IHRoaXMuZWRpdG9yLmdldFRleHQoKTsKICAgICAgdGhpcy53b3JkQ291bnQgPSB0ZXh0OS50cmltKCkgPyB0ZXh0OS50cmltKCkuc3BsaXQoL1xzKy8pLmxlbmd0aCA6IDA7CiAgICB9CiAgICB0b2dnbGVMaW5rKCkgewogICAgICBpZiAoIXRoaXMuZWRpdG9yKQogICAgICAgIHJldHVybjsKICAgICAgaWYgKHRoaXMuZWRpdG9yLmlzQWN0aXZlKCJsaW5rIikpIHsKICAgICAgICBjb25zdCBocmVmID0gdGhpcy5lZGl0b3IuZ2V0QXR0cmlidXRlcygibGluayIpLmhyZWY7CiAgICAgICAgdGhpcy5zaG93TGlua0lucHV0ID0gdHJ1ZTsKICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgICAgaWYgKHRoaXMubGlua0lucHV0RWxlbWVudCkgewogICAgICAgICAgICB0aGlzLmxpbmtJbnB1dEVsZW1lbnQudmFsdWUgPSBocmVmIHx8ICIiOwogICAgICAgICAgICB0aGlzLmxpbmtJbnB1dEVsZW1lbnQuZm9jdXMoKTsKICAgICAgICAgICAgdGhpcy5saW5rSW5wdXRFbGVtZW50LnNlbGVjdCgpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc2hvd0xpbmtJbnB1dCA9IHRydWU7CiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICAgIGlmICh0aGlzLmxpbmtJbnB1dEVsZW1lbnQpIHsKICAgICAgICAgICAgdGhpcy5saW5rSW5wdXRFbGVtZW50LnZhbHVlID0gIiI7CiAgICAgICAgICAgIHRoaXMubGlua0lucHV0RWxlbWVudC5mb2N1cygpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICBzYXZlTGluaygpIHsKICAgICAgaWYgKCF0aGlzLmVkaXRvciB8fCAhdGhpcy5saW5rSW5wdXRFbGVtZW50KQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgdXJsID0gdGhpcy5saW5rSW5wdXRFbGVtZW50LnZhbHVlOwogICAgICBpZiAodXJsKSB7CiAgICAgICAgdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpLnNldExpbmsoeyBocmVmOiB1cmwgfSkucnVuKCk7CiAgICAgIH0KICAgICAgdGhpcy5oaWRlTGlua0lucHV0KCk7CiAgICB9CiAgICByZW1vdmVMaW5rKCkgewogICAgICBpZiAoIXRoaXMuZWRpdG9yKQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpLnVuc2V0TGluaygpLnJ1bigpOwogICAgICB0aGlzLmhpZGVMaW5rSW5wdXQoKTsKICAgIH0KICAgIGhpZGVMaW5rSW5wdXQoKSB7CiAgICAgIHRoaXMuc2hvd0xpbmtJbnB1dCA9IGZhbHNlOwogICAgICB0aGlzLmVkaXRvcj8uY29tbWFuZHMuZm9jdXMoKTsKICAgIH0KICAgIGhhbmRsZUxpbmtJbnB1dEtleWRvd24oZTExKSB7CiAgICAgIGlmIChlMTEua2V5ID09PSAiRW50ZXIiKSB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdGhpcy5zYXZlTGluaygpOwogICAgICB9IGVsc2UgaWYgKGUxMS5rZXkgPT09ICJFc2NhcGUiKSB7CiAgICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdGhpcy5oaWRlTGlua0lucHV0KCk7CiAgICAgIH0KICAgIH0KICAgIHNldFZhbHVlKHZhbHVlMikgewogICAgICB0aGlzLnZhbHVlID0gdmFsdWUyOwogICAgICBpZiAodGhpcy5lZGl0b3IgJiYgdmFsdWUyICE9PSB0aGlzLmVkaXRvci5nZXRIVE1MKCkpIHsKICAgICAgICB0aGlzLmVkaXRvci5jb21tYW5kcy5zZXRDb250ZW50KHZhbHVlMik7CiAgICAgIH0KICAgIH0KICAgIGdldFZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy52YWx1ZTsKICAgIH0KICAgIGNsZWFyKCkgewogICAgICB0aGlzLnNldFZhbHVlKCIiKTsKICAgIH0KICAgIGZvY3VzKCkgewogICAgICB0aGlzLmVkaXRvcj8uY29tbWFuZHMuZm9jdXMoKTsKICAgIH0KICAgIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBpZiAodGhpcy5lZGl0b3IpIHsKICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzMzkoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNJbnB1dFJpY2h0ZXh0MiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZGF0YXZpZXcvZGVlcy10YWJsZS9kZWVzLXRhYmxlLmRlbW8uanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIGRlbW9GdW5jMjggPSAoKSA9PiBiMmAKICA8c3R5bGU+CiAgICAke2lgCiAgICAgIC5kZW1vV3JhcHBlciB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBhZGRpbmc6IDMycHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk1JSkiLCAiaHNsKDAgMCUgNSUpIil9OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICBtYXgtd2lkdGg6IDEyMDBweDsKICAgICAgICBtYXJnaW46IDAgYXV0bzsKICAgICAgfQogICAgICAuZGVtby1zZWN0aW9uIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiA0OHB4OwogICAgICB9CiAgICAgIC5kZW1vLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDI0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTUlKSIpfTsKICAgICAgfQogICAgICAuZGVtby1kZXNjcmlwdGlvbiB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDQ2LjklKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICB9CiAgICAgIC50aGVtZS10b2dnbGUgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDE2cHg7CiAgICAgICAgcmlnaHQ6IDE2cHg7CiAgICAgICAgei1pbmRleDogMTAwMDsKICAgICAgfQogICAgYH0KICA8L3N0eWxlPgogIDxkaXYgY2xhc3M9ImRlbW9XcmFwcGVyIj4KICAgIDxkZWVzLWJ1dHRvbiBjbGFzcz0idGhlbWUtdG9nZ2xlIiBAY2xpY2s9JHsoKSA9PiB7CiAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJicmlnaHQiKTsKICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoImRhcmsiKTsKfX0+VG9nZ2xlIFRoZW1lPC9kZWVzLWJ1dHRvbj4KICAgIAogICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMiBjbGFzcz0iZGVtby10aXRsZSI+QmFzaWMgVGFibGUgd2l0aCBBY3Rpb25zPC9oMj4KICAgICAgICA8cCBjbGFzcz0iZGVtby1kZXNjcmlwdGlvbiI+QSBzdGFuZGFyZCB0YWJsZSB3aXRoIHJvdyBhY3Rpb25zLCBlZGl0YWJsZSBmaWVsZHMsIGFuZCBjb250ZXh0IG1lbnUgc3VwcG9ydC4gRG91YmxlLWNsaWNrIG9uIGRlc2NyaXB0aW9ucyB0byBlZGl0LiBHcmlkIGxpbmVzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuPC9wPgogICAgICAgIDxkZWVzLXRhYmxlCiAgICAgICAgICBoZWFkaW5nMT0iQ3VycmVudCBBY2NvdW50IFN0YXRlbWVudCIKICAgICAgICAgIGhlYWRpbmcyPSJCdW5xIC0gUGF5bWVudCBBY2NvdW50IDIgLSBBcHJpbCAyMDIxIgogICAgICAgICAgLmVkaXRhYmxlRmllbGRzPSIke1siZGVzY3JpcHRpb24iXX0iCiAgICAgICAgICAuZGF0YT0ke1sKICB7CiAgICBkYXRlOiAiMjAyMS0wNC0wMSIsCiAgICBhbW91bnQ6ICIyNDY0LjY1IFx1MjBBQyIsCiAgICBkZXNjcmlwdGlvbjogIlByaW50aW5nIFBhcGVyIChPZmZpY2UgU3VwcGxpZXMpIC0gU1RBUExFUyBCUkVNRU4iCiAgfSwKICB7CiAgICBkYXRlOiAiMjAyMS0wNC0wMiIsCiAgICBhbW91bnQ6ICIxNjUuNjUgXHUyMEFDIiwKICAgIGRlc2NyaXB0aW9uOiAiTG9naXRlY2ggTW91c2UgKEhhcmR3YXJlKSAtIGxvZ2kuY29tIE9ubGluZVNob3AiCiAgfSwKICB7CiAgICBkYXRlOiAiMjAyMS0wNC0wMyIsCiAgICBhbW91bnQ6ICIyOTk5LDAwIFx1MjBBQyIsCiAgICBkZXNjcmlwdGlvbjogIk1hY2Jvb2sgUHJvIDE2aW5jaCAoSGFyZHdhcmUpIC0gQXBwbGUuZGUgT25saW5lU2hvcCIKICB9LAogIHsKICAgIGRhdGU6ICIyMDIxLTA0LTAxIiwKICAgIGFtb3VudDogIjI0NjQuNjUgXHUyMEFDIiwKICAgIGRlc2NyaXB0aW9uOiAiT2ZmaWNlLVN1cHBsaWVzIC0gU1RBUExFUyBCUkVNRU4iCiAgfSwKICB7CiAgICBkYXRlOiAiMjAyMS0wNC0wMSIsCiAgICBhbW91bnQ6ICIyNDY0LjY1IFx1MjBBQyIsCiAgICBkZXNjcmlwdGlvbjogIk9mZmljZS1TdXBwbGllcyAtIFNUQVBMRVMgQlJFTUVOIgogIH0KXX0KICAgICAgICAgIGRhdGFOYW1lPSJ0cmFuc2FjdGlvbnMiCiAgICAgICAgICAuZGF0YUFjdGlvbnM9IiR7WwogIHsKICAgIG5hbWU6ICJ1cGxvYWQiLAogICAgaWNvbk5hbWU6ICJiZWxsIiwKICAgIHVzZVRhYmxlQmVoYXZpb3VyOiAidXBsb2FkIiwKICAgIHR5cGU6IFsiaW5Sb3ciXSwKICAgIGFjdGlvbkZ1bmM6IGFzeW5jIChvcHRpb25zQXJnKSA9PiB7CiAgICAgIGFsZXJ0KG9wdGlvbnNBcmcuaXRlbS5hbW91bnQpOwogICAgfQogIH0sCiAgewogICAgbmFtZTogInZpc2liaWxpdHkiLAogICAgaWNvbk5hbWU6ICJjb3B5IiwKICAgIHR5cGU6IFsiaW5Sb3ciXSwKICAgIHVzZVRhYmxlQmVoYXZpb3VyOiAicHJldmlldyIsCiAgICBhY3Rpb25GdW5jOiBhc3luYyAoaXRlbUFyZykgPT4gewogICAgfQogIH0sCiAgewogICAgbmFtZTogImNyZWF0ZSBuZXciLAogICAgaWNvbk5hbWU6ICJpbnN0YWdyYW0iLAogICAgdHlwZTogWyJoZWFkZXIiXSwKICAgIHVzZVRhYmxlQmVoYXZpb3VyOiAicHJldmlldyIsCiAgICBhY3Rpb25GdW5jOiBhc3luYyAoaXRlbUFyZykgPT4gewogICAgfQogIH0sCiAgewogICAgbmFtZTogInRvIGdhbGxlcnkiLAogICAgaWNvbk5hbWU6ICJtZXNzYWdlIiwKICAgIHR5cGU6IFsiZm9vdGVyIl0sCiAgICB1c2VUYWJsZUJlaGF2aW91cjogInByZXZpZXciLAogICAgYWN0aW9uRnVuYzogYXN5bmMgKGl0ZW1BcmcpID0+IHsKICAgIH0KICB9LAogIHsKICAgIG5hbWU6ICJjb3B5IiwKICAgIGljb25OYW1lOiAiY29weVNvbGlkIiwKICAgIHR5cGU6IFsiY29udGV4dG1lbnUiLCAiaW5Sb3ciXSwKICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9LAogIHsKICAgIG5hbWU6ICJlZGl0IChmcm9tIGRlbW8pIiwKICAgIGljb25OYW1lOiAicGVuVG9TcXVhcmUiLAogICAgdHlwZTogWyJjb250ZXh0bWVudSJdLAogICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0sCiAgewogICAgbmFtZTogInBhc3RlIiwKICAgIGljb25OYW1lOiAicGFzdGVTb2xpZCIsCiAgICB0eXBlOiBbImNvbnRleHRtZW51Il0sCiAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfSwKICB7CiAgICBuYW1lOiAicHJldmlldyIsCiAgICB0eXBlOiBbImRvdWJsZUNsaWNrIiwgImNvbnRleHRtZW51Il0sCiAgICBpY29uTmFtZTogImV5ZSIsCiAgICBhY3Rpb25GdW5jOiBhc3luYyAoaXRlbUFyZykgPT4gewogICAgICBhbGVydChpdGVtQXJnLml0ZW0uYW1vdW50KTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQpdfSIKICAgICAgICA+PC9kZWVzLXRhYmxlPgogICAgICA8L2Rpdj4KICAgICAgCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgyIGNsYXNzPSJkZW1vLXRpdGxlIj5UYWJsZSB3aXRoIFZlcnRpY2FsIExpbmVzPC9oMj4KICAgICAgICA8cCBjbGFzcz0iZGVtby1kZXNjcmlwdGlvbiI+RW5oYW5jZWQgY29sdW1uIHNlcGFyYXRpb24gZm9yIGJldHRlciBkYXRhIHRyYWNraW5nLjwvcD4KICAgICAgICA8ZGVlcy10YWJsZQogICAgICAgICAgaGVhZGluZzE9IlByb2R1Y3QgSW52ZW50b3J5IgogICAgICAgICAgaGVhZGluZzI9IkN1cnJlbnQgc3RvY2sgbGV2ZWxzIGFjcm9zcyB3YXJlaG91c2VzIgogICAgICAgICAgLnNob3dWZXJ0aWNhbExpbmVzPSR7dHJ1ZX0KICAgICAgICAgIC5kYXRhPSR7WwogIHsKICAgIHByb2R1Y3Q6ICdNYWNCb29rIFBybyAxNiInLAogICAgd2FyZWhvdXNlX2E6ICI0NSIsCiAgICB3YXJlaG91c2VfYjogIjMyIiwKICAgIHdhcmVob3VzZV9jOiAiMjgiLAogICAgdG90YWw6ICIxMDUiLAogICAgc3RhdHVzOiAiXHUyNzEzIEluIFN0b2NrIgogIH0sCiAgewogICAgcHJvZHVjdDogImlQaG9uZSAxNSBQcm8iLAogICAgd2FyZWhvdXNlX2E6ICIxMjAiLAogICAgd2FyZWhvdXNlX2I6ICI4OSIsCiAgICB3YXJlaG91c2VfYzogIjE1NiIsCiAgICB0b3RhbDogIjM2NSIsCiAgICBzdGF0dXM6ICJcdTI3MTMgSW4gU3RvY2siCiAgfSwKICB7CiAgICBwcm9kdWN0OiAiQWlyUG9kcyBQcm8iLAogICAgd2FyZWhvdXNlX2E6ICIwIiwKICAgIHdhcmVob3VzZV9iOiAiMTIiLAogICAgd2FyZWhvdXNlX2M6ICI1IiwKICAgIHRvdGFsOiAiMTciLAogICAgc3RhdHVzOiAiXHUyNkEwIExvdyBTdG9jayIKICB9LAogIHsKICAgIHByb2R1Y3Q6ICJpUGFkIEFpciIsCiAgICB3YXJlaG91c2VfYTogIjIzIiwKICAgIHdhcmVob3VzZV9iOiAiNDUiLAogICAgd2FyZWhvdXNlX2M6ICI2NyIsCiAgICB0b3RhbDogIjEzNSIsCiAgICBzdGF0dXM6ICJcdTI3MTMgSW4gU3RvY2siCiAgfQpdfQogICAgICAgICAgZGF0YU5hbWU9InByb2R1Y3RzIgogICAgICAgID48L2RlZXMtdGFibGU+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPlRhYmxlIHdpdGggRnVsbCBHcmlkPC9oMj4KICAgICAgICA8cCBjbGFzcz0iZGVtby1kZXNjcmlwdGlvbiI+Q29tcGxldGUgZ3JpZCBsaW5lcyBmb3IgbWF4aW11bSByZWFkYWJpbGl0eSBhbmQgc3RydWN0dXJlLjwvcD4KICAgICAgICA8ZGVlcy10YWJsZQogICAgICAgICAgaGVhZGluZzE9IlNlcnZlciBNb25pdG9yaW5nIERhc2hib2FyZCIKICAgICAgICAgIGhlYWRpbmcyPSJSZWFsLXRpbWUgbWV0cmljcyBhY3Jvc3MgcmVnaW9ucyIKICAgICAgICAgIC5zaG93R3JpZD0ke3RydWV9CiAgICAgICAgICAuZGF0YT0ke1sKICB7CiAgICBzZXJ2ZXI6ICJBUEktMSIsCiAgICByZWdpb246ICJVUy1FYXN0IiwKICAgIGNwdTogIjQ1JSIsCiAgICBtZW1vcnk6ICI2MiUiLAogICAgZGlzazogIjc4JSIsCiAgICBsYXRlbmN5OiAiMTJtcyIsCiAgICB1cHRpbWU6ICI5OS45JSIsCiAgICBzdGF0dXM6ICJcdXsxRjdFMn0gSGVhbHRoeSIKICB9LAogIHsKICAgIHNlcnZlcjogIkFQSS0yIiwKICAgIHJlZ2lvbjogIkVVLVdlc3QiLAogICAgY3B1OiAiMzglIiwKICAgIG1lbW9yeTogIjU1JSIsCiAgICBkaXNrOiAiNDUlIiwKICAgIGxhdGVuY3k6ICIyNW1zIiwKICAgIHVwdGltZTogIjk5LjglIiwKICAgIHN0YXR1czogIlx1ezFGN0UyfSBIZWFsdGh5IgogIH0sCiAgewogICAgc2VydmVyOiAiREItTWFzdGVyIiwKICAgIHJlZ2lvbjogIlVTLUVhc3QiLAogICAgY3B1OiAiNzIlIiwKICAgIG1lbW9yeTogIjgxJSIsCiAgICBkaXNrOiAiOTIlIiwKICAgIGxhdGVuY3k6ICI4bXMiLAogICAgdXB0aW1lOiAiMTAwJSIsCiAgICBzdGF0dXM6ICJcdXsxRjdFMX0gV2FybmluZyIKICB9LAogIHsKICAgIHNlcnZlcjogIkRCLVJlcGxpY2EiLAogICAgcmVnaW9uOiAiRVUtV2VzdCIsCiAgICBjcHU6ICIyMyUiLAogICAgbWVtb3J5OiAiMzQlIiwKICAgIGRpc2s6ICI0NSUiLAogICAgbGF0ZW5jeTogIjE1bXMiLAogICAgdXB0aW1lOiAiOTkuNyUiLAogICAgc3RhdHVzOiAiXHV7MUY3RTJ9IEhlYWx0aHkiCiAgfSwKICB7CiAgICBzZXJ2ZXI6ICJDYWNoZS0xIiwKICAgIHJlZ2lvbjogIkFQLVNvdXRoIiwKICAgIGNwdTogIjg5JSIsCiAgICBtZW1vcnk6ICI5MiUiLAogICAgZGlzazogIjEyJSIsCiAgICBsYXRlbmN5OiAiMTIwbXMiLAogICAgdXB0aW1lOiAiOTguNSUiLAogICAgc3RhdHVzOiAiXHV7MUY1MzR9IENyaXRpY2FsIgogIH0KXX0KICAgICAgICAgIGRhdGFOYW1lPSJzZXJ2ZXJzIgogICAgICAgICAgLmRhdGFBY3Rpb25zPSIke1sKICB7CiAgICBuYW1lOiAiU1NIIENvbm5lY3QiLAogICAgaWNvbk5hbWU6ICJsdWNpZGU6dGVybWluYWwiLAogICAgdHlwZTogWyJpblJvdyJdLAogICAgYWN0aW9uRnVuYzogYXN5bmMgKG9wdGlvbnNBcmcpID0+IHsKICAgICAgY29uc29sZS5sb2coIkNvbm5lY3RpbmcgdG86Iiwgb3B0aW9uc0FyZy5pdGVtLnNlcnZlcik7CiAgICB9CiAgfSwKICB7CiAgICBuYW1lOiAiVmlldyBMb2dzIiwKICAgIGljb25OYW1lOiAibHVjaWRlOmZpbGUtdGV4dCIsCiAgICB0eXBlOiBbImluUm93IiwgImNvbnRleHRtZW51Il0sCiAgICBhY3Rpb25GdW5jOiBhc3luYyAob3B0aW9uc0FyZykgPT4gewogICAgICBjb25zb2xlLmxvZygiVmlld2luZyBsb2dzIGZvcjoiLCBvcHRpb25zQXJnLml0ZW0uc2VydmVyKTsKICAgIH0KICB9LAogIHsKICAgIG5hbWU6ICJSZXN0YXJ0IFNlcnZlciIsCiAgICBpY29uTmFtZTogImx1Y2lkZTpyZWZyZXNoLWN3IiwKICAgIHR5cGU6IFsiY29udGV4dG1lbnUiXSwKICAgIGFjdGlvbkZ1bmM6IGFzeW5jIChvcHRpb25zQXJnKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJSZXN0YXJ0aW5nOiIsIG9wdGlvbnNBcmcuaXRlbS5zZXJ2ZXIpOwogICAgfQogIH0KXX0iCiAgICAgICAgPjwvZGVlcy10YWJsZT4KICAgICAgPC9kaXY+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMiBjbGFzcz0iZGVtby10aXRsZSI+VGFibGUgd2l0aCBIb3Jpem9udGFsIExpbmVzIE9ubHk8L2gyPgogICAgICAgIDxwIGNsYXNzPSJkZW1vLWRlc2NyaXB0aW9uIj5FbXBoYXNpcyBvbiByb3cgc2VwYXJhdGlvbiB3aXRob3V0IGNvbHVtbiBkaXZpZGVycy48L3A+CiAgICAgICAgPGRlZXMtdGFibGUKICAgICAgICAgIGhlYWRpbmcxPSJTYWxlcyBQZXJmb3JtYW5jZSIKICAgICAgICAgIGhlYWRpbmcyPSJUb3AgcGVyZm9ybWVycyB0aGlzIHF1YXJ0ZXIiCiAgICAgICAgICAuc2hvd0hvcml6b250YWxMaW5lcz0ke3RydWV9CiAgICAgICAgICAuc2hvd1ZlcnRpY2FsTGluZXM9JHtmYWxzZX0KICAgICAgICAgIC5kYXRhPSR7WwogIHsKICAgIHNhbGVzcGVyc29uOiAiRW1pbHkgSm9obnNvbiIsCiAgICByZWdpb246ICJOb3J0aCBBbWVyaWNhIiwKICAgIGRlYWxzX2Nsb3NlZDogIjQyIiwKICAgIHJldmVudWU6ICIkMS4yTSIsCiAgICBxdW90YV9hY2hpZXZlbWVudDogIjEyOCUiLAogICAgcmF0aW5nOiAiXHUyQjUwXHUyQjUwXHUyQjUwXHUyQjUwXHUyQjUwIgogIH0sCiAgewogICAgc2FsZXNwZXJzb246ICJNaWNoYWVsIENoZW4iLAogICAgcmVnaW9uOiAiQXNpYSBQYWNpZmljIiwKICAgIGRlYWxzX2Nsb3NlZDogIjM4IiwKICAgIHJldmVudWU6ICIkOTgwSyIsCiAgICBxdW90YV9hY2hpZXZlbWVudDogIjExNSUiLAogICAgcmF0aW5nOiAiXHUyQjUwXHUyQjUwXHUyQjUwXHUyQjUwXHUyQjUwIgogIH0sCiAgewogICAgc2FsZXNwZXJzb246ICJTYXJhaCBXaWxsaWFtcyIsCiAgICByZWdpb246ICJFdXJvcGUiLAogICAgZGVhbHNfY2xvc2VkOiAiMzUiLAogICAgcmV2ZW51ZTogIiQ4NzVLIiwKICAgIHF1b3RhX2FjaGlldmVtZW50OiAiMTA4JSIsCiAgICByYXRpbmc6ICJcdTJCNTBcdTJCNTBcdTJCNTBcdTJCNTAiCiAgfSwKICB7CiAgICBzYWxlc3BlcnNvbjogIkRhdmlkIEdhcmNpYSIsCiAgICByZWdpb246ICJMYXRpbiBBbWVyaWNhIiwKICAgIGRlYWxzX2Nsb3NlZDogIjMxIiwKICAgIHJldmVudWU6ICIkNzUwSyIsCiAgICBxdW90YV9hY2hpZXZlbWVudDogIjk1JSIsCiAgICByYXRpbmc6ICJcdTJCNTBcdTJCNTBcdTJCNTBcdTJCNTAiCiAgfQpdfQogICAgICAgICAgZGF0YU5hbWU9InNhbGVzIHJlcHMiCiAgICAgICAgPjwvZGVlcy10YWJsZT4KICAgICAgPC9kaXY+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMiBjbGFzcz0iZGVtby10aXRsZSI+U2ltcGxlIFRhYmxlIChObyBHcmlkKTwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImRlbW8tZGVzY3JpcHRpb24iPkNsZWFuLCBtaW5pbWFsIGRlc2lnbiB3aXRob3V0IGdyaWQgbGluZXMuIFNldCBzaG93R3JpZCB0byBmYWxzZSB0byBkaXNhYmxlIHRoZSBkZWZhdWx0IGdyaWQuPC9wPgogICAgICAgIDxkZWVzLXRhYmxlCiAgICAgICAgICBoZWFkaW5nMT0iVGVhbSBNZW1iZXJzIgogICAgICAgICAgaGVhZGluZzI9IkVuZ2luZWVyaW5nIERlcGFydG1lbnQiCiAgICAgICAgICAuc2hvd0dyaWQ9JHtmYWxzZX0KICAgICAgICAgIC5kYXRhPSR7WwogIHsKICAgIG5hbWU6ICJBbGljZSBKb2huc29uIiwKICAgIHJvbGU6ICJMZWFkIEVuZ2luZWVyIiwKICAgIGVtYWlsOiAiYWxpY2VAY29tcGFueS5jb20iLAogICAgbG9jYXRpb246ICJTYW4gRnJhbmNpc2NvIiwKICAgIGpvaW5lZDogIjIwMjAtMDMtMTUiCiAgfSwKICB7CiAgICBuYW1lOiAiQm9iIFNtaXRoIiwKICAgIHJvbGU6ICJTZW5pb3IgRGV2ZWxvcGVyIiwKICAgIGVtYWlsOiAiYm9iQGNvbXBhbnkuY29tIiwKICAgIGxvY2F0aW9uOiAiTmV3IFlvcmsiLAogICAgam9pbmVkOiAiMjAxOS0wNy0yMiIKICB9LAogIHsKICAgIG5hbWU6ICJDaGFybGllIERhdmlzIiwKICAgIHJvbGU6ICJEZXZPcHMgRW5naW5lZXIiLAogICAgZW1haWw6ICJjaGFybGllQGNvbXBhbnkuY29tIiwKICAgIGxvY2F0aW9uOiAiTG9uZG9uIiwKICAgIGpvaW5lZDogIjIwMjEtMDEtMTAiCiAgfSwKICB7CiAgICBuYW1lOiAiRGlhbmEgTWFydGluZXoiLAogICAgcm9sZTogIkZyb250ZW5kIERldmVsb3BlciIsCiAgICBlbWFpbDogImRpYW5hQGNvbXBhbnkuY29tIiwKICAgIGxvY2F0aW9uOiAiQmFyY2Vsb25hIiwKICAgIGpvaW5lZDogIjIwMjItMDUtMTgiCiAgfQpdfQogICAgICAgICAgZGF0YU5hbWU9InRlYW0gbWVtYmVycyIKICAgICAgICA+PC9kZWVzLXRhYmxlPgogICAgICA8L2Rpdj4KICAgICAgCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgyIGNsYXNzPSJkZW1vLXRpdGxlIj5UYWJsZSB3aXRoIEN1c3RvbSBEaXNwbGF5IEZ1bmN0aW9uPC9oMj4KICAgICAgICA8cCBjbGFzcz0iZGVtby1kZXNjcmlwdGlvbiI+VHJhbnNmb3JtIGRhdGEgZm9yIGRpc3BsYXkgdXNpbmcgY3VzdG9tIGZvcm1hdHRpbmcuPC9wPgogICAgICAgIDxkZWVzLXRhYmxlCiAgICAgICAgICBoZWFkaW5nMT0iU2FsZXMgUmVwb3J0IgogICAgICAgICAgaGVhZGluZzI9IlE0IDIwMjMgUGVyZm9ybWFuY2UiCiAgICAgICAgICAuZGF0YT0ke1sKICB7CiAgICBwcm9kdWN0OiAiRW50ZXJwcmlzZSBMaWNlbnNlIiwKICAgIHVuaXRzOiA0NSwKICAgIHJldmVudWU6IDIyNWUzLAogICAgZ3Jvd3RoOiAwLjIzLAogICAgZm9yZWNhc3Q6IDI4ZTQKICB9LAogIHsKICAgIHByb2R1Y3Q6ICJQcm9mZXNzaW9uYWwgTGljZW5zZSIsCiAgICB1bml0czogMTI4LAogICAgcmV2ZW51ZTogMTI4ZTMsCiAgICBncm93dGg6IDAuMTUsCiAgICBmb3JlY2FzdDogMTQ3ZTMKICB9LAogIHsKICAgIHByb2R1Y3Q6ICJTdGFydGVyIExpY2Vuc2UiLAogICAgdW5pdHM6IDM0MiwKICAgIHJldmVudWU6IDY4NDAwLAogICAgZ3Jvd3RoOiAwLjQyLAogICAgZm9yZWNhc3Q6IDk3ZTMKICB9Cl19CiAgICAgICAgICAuZGlzcGxheUZ1bmN0aW9uPSR7KGl0ZW0pID0+ICh7CiAgUHJvZHVjdDogaXRlbS5wcm9kdWN0LAogICJVbml0cyBTb2xkIjogaXRlbS51bml0cy50b0xvY2FsZVN0cmluZygpLAogIFJldmVudWU6ICIkIiArIGl0ZW0ucmV2ZW51ZS50b0xvY2FsZVN0cmluZygpLAogIEdyb3d0aDogKGl0ZW0uZ3Jvd3RoICogMTAwKS50b0ZpeGVkKDEpICsgIiUiLAogICJRMSAyMDI0IEZvcmVjYXN0IjogIiQiICsgaXRlbS5mb3JlY2FzdC50b0xvY2FsZVN0cmluZygpCn0pfQogICAgICAgICAgZGF0YU5hbWU9InByb2R1Y3RzIgogICAgICAgID48L2RlZXMtdGFibGU+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPkVtcHR5IFRhYmxlIFN0YXRlPC9oMj4KICAgICAgICA8cCBjbGFzcz0iZGVtby1kZXNjcmlwdGlvbiI+SG93IHRoZSB0YWJsZSBsb29rcyB3aGVuIG5vIGRhdGEgaXMgYXZhaWxhYmxlLjwvcD4KICAgICAgICA8ZGVlcy10YWJsZQogICAgICAgICAgaGVhZGluZzE9Ik5vIERhdGEgQXZhaWxhYmxlIgogICAgICAgICAgaGVhZGluZzI9IlRoaXMgdGFibGUgaXMgY3VycmVudGx5IGVtcHR5IgogICAgICAgICAgLmRhdGE9JHtbXX0KICAgICAgICAgIGRhdGFOYW1lPSJpdGVtcyIKICAgICAgICA+PC9kZWVzLXRhYmxlPgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgyIGNsYXNzPSJkZW1vLXRpdGxlIj5TY2hlbWEtRmlyc3QgQ29sdW1ucyAoTmV3KTwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImRlbW8tZGVzY3JpcHRpb24iPkRlZmluZXMgY29sdW1ucyBleHBsaWNpdGx5IGFuZCByZW5kZXJzIHZpYSBzY2hlbWEuIE5vIGRpc3BsYXlGdW5jdGlvbiBuZWVkZWQuPC9wPgogICAgICAgIDxkZWVzLXRhYmxlCiAgICAgICAgICBoZWFkaW5nMT0iVXNlcnMgKFNjaGVtYS1GaXJzdCkiCiAgICAgICAgICBoZWFkaW5nMj0iQ29sdW1ucyBkZWZpbmUgcmVuZGVyaW5nIGFuZCBvcmRlciIKICAgICAgICAgIC5jb2x1bW5zPSR7WwogIHsga2V5OiAibmFtZSIsIGhlYWRlcjogIk5hbWUiLCBzb3J0YWJsZTogdHJ1ZSB9LAogIHsga2V5OiAiZW1haWwiLCBoZWFkZXI6ICJFbWFpbCIsIHJlbmRlcmVyOiAodjYpID0+IGIyYDxkZWVzLWJhZGdlPiR7djZ9PC9kZWVzLWJhZGdlPmAgfSwKICB7IGtleTogImpvaW5lZEF0IiwgaGVhZGVyOiAiSm9pbmVkIiwgcmVuZGVyZXI6ICh2NikgPT4gbmV3IERhdGUodjYpLnRvTG9jYWxlRGF0ZVN0cmluZygpIH0KXX0KICAgICAgICAgIC5kYXRhPSR7WwogIHsgbmFtZTogIkFsaWNlIiwgZW1haWw6ICJhbGljZUBleGFtcGxlLmNvbSIsIGpvaW5lZEF0OiAiMjAyMi0wOC0wMSIgfSwKICB7IG5hbWU6ICJCb2IiLCBlbWFpbDogImJvYkBleGFtcGxlLmNvbSIsIGpvaW5lZEF0OiAiMjAyMS0xMi0xMSIgfSwKICB7IG5hbWU6ICJDYXJvbCIsIGVtYWlsOiAiY2Fyb2xAZXhhbXBsZS5jb20iLCBqb2luZWRBdDogIjIwMjMtMDMtMjIiIH0KXX0KICAgICAgICAgIGRhdGFOYW1lPSJ1c2VycyIKICAgICAgICA+PC9kZWVzLXRhYmxlPgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgyIGNsYXNzPSJkZW1vLXRpdGxlIj5QYXJ0aWFsIFNjaGVtYSArIEF1Z21lbnQgKE5ldyk8L2gyPgogICAgICAgIDxwIGNsYXNzPSJkZW1vLWRlc2NyaXB0aW9uIj5Qcm92aWRlcyBvbmx5IHRoZSBpbXBvcnRhbnQgY29sdW1uczsgdGhlIHJlc3QgYXJlIG1lcmdlZCBpbiBmcm9tIGRpc3BsYXlGdW5jdGlvbi48L3A+CiAgICAgICAgPGRlZXMtdGFibGUKICAgICAgICAgIGhlYWRpbmcxPSJVc2VycyAoUGFydGlhbCArIEF1Z21lbnQpIgogICAgICAgICAgaGVhZGluZzI9Ik1pc3NpbmcgY29sdW1ucyBhcmUgZGVyaXZlZCIKICAgICAgICAgIC5jb2x1bW5zPSR7WwogIHsga2V5OiAibmFtZSIsIGhlYWRlcjogIk5hbWUiLCBzb3J0YWJsZTogdHJ1ZSB9Cl19CiAgICAgICAgICAuZGlzcGxheUZ1bmN0aW9uPSR7KHU3KSA9PiAoeyBuYW1lOiB1Ny5uYW1lLCBlbWFpbDogdTcuZW1haWwsIHJvbGU6IHU3LnJvbGUgfSl9CiAgICAgICAgICAuYXVnbWVudEZyb21EaXNwbGF5RnVuY3Rpb249JHt0cnVlfQogICAgICAgICAgLmRhdGE9JHtbCiAgeyBuYW1lOiAiRXJpbiIsIGVtYWlsOiAiZXJpbkBleGFtcGxlLmNvbSIsIHJvbGU6ICJBZG1pbiIgfSwKICB7IG5hbWU6ICJGaW5uIiwgZW1haWw6ICJmaW5uQGV4YW1wbGUuY29tIiwgcm9sZTogIlVzZXIiIH0sCiAgeyBuYW1lOiAiR2luYSIsIGVtYWlsOiAiZ2luYUBleGFtcGxlLmNvbSIsIHJvbGU6ICJVc2VyIiB9Cl19CiAgICAgICAgICBkYXRhTmFtZT0idXNlcnMiCiAgICAgICAgPjwvZGVlcy10YWJsZT4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iIAogICAgICAgICAgIEBzZWxlY3Rpb25DaGFuZ2U9JHsoZTExKSA9PiB7CiAgY29uc29sZS5sb2coIlNlbGVjdGlvbiBjaGFuZ2VkIiwgZTExLmRldGFpbCk7Cn19CiAgICAgICAgICAgQHNlYXJjaC1jaGFuZ2VkPSR7KGUxMSkgPT4gewogIGNvbnN0IHRibCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0YWJsZUZpbHRlclNlbGVjdERlbW8iKTsKICBpZiAodGJsKQogICAgdGJsLnNldEZpbHRlclRleHQoZTExLmRldGFpbC52YWx1ZSk7Cn19CiAgICAgICAgICAgQHNlYXJjaC1zdWJtaXQ9JHsoZTExKSA9PiB7CiAgY29uc3QgdGJsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRhYmxlRmlsdGVyU2VsZWN0RGVtbyIpOwogIGlmICh0YmwpCiAgICB0Ymwuc2V0RmlsdGVyVGV4dChlMTEuZGV0YWlsLnZhbHVlKTsKfX0KICAgICAgPgogICAgICAgIDxoMiBjbGFzcz0iZGVtby10aXRsZSI+RmlsdGVyaW5nICsgTXVsdGktU2VsZWN0aW9uIChOZXcpPC9oMj4KICAgICAgICA8cCBjbGFzcz0iZGVtby1kZXNjcmlwdGlvbiI+VXNlIHRoZSBzZWFyY2ggYmFyIHRvIGZpbHRlciByb3dzOyB0b2dnbGUgc2VsZWN0aW9uIHZpYSBjaGVja2JveGVzLiBDbGljayBoZWFkZXJzIHRvIHNvcnQuPC9wPgogICAgICAgIDxkZWVzLXNlYXJjaGJhcj48L2RlZXMtc2VhcmNoYmFyPgogICAgICAgIDxkaXYgc3R5bGU9ImhlaWdodDogMTJweCI+PC9kaXY+CiAgICAgICAgPGRlZXMtdGFibGUKICAgICAgICAgIGlkPSJ0YWJsZUZpbHRlclNlbGVjdERlbW8iCiAgICAgICAgICBoZWFkaW5nMT0iSW52ZW50b3J5IChGaWx0ZXIgKyBTZWxlY3QpIgogICAgICAgICAgaGVhZGluZzI9IlRyeSB0eXBpbmcgdG8gZmlsdGVyIGFuZCBzZWxlY3RpbmcgbXVsdGlwbGUgcm93cyIKICAgICAgICAgIC5zZWxlY3Rpb25Nb2RlPSR7Im11bHRpIn0KICAgICAgICAgIC5yb3dLZXk9JHsic2t1In0KICAgICAgICAgIC5jb2x1bW5zPSR7WwogIHsga2V5OiAic2t1IiwgaGVhZGVyOiAiU0tVIiwgc29ydGFibGU6IHRydWUgfSwKICB7IGtleTogIm5hbWUiLCBoZWFkZXI6ICJOYW1lIiwgc29ydGFibGU6IHRydWUgfSwKICB7IGtleTogInN0b2NrIiwgaGVhZGVyOiAiU3RvY2siLCBzb3J0YWJsZTogdHJ1ZSB9Cl19CiAgICAgICAgICAuZGF0YT0ke1sKICB7IHNrdTogIkEtMTAwIiwgbmFtZTogIlVTQi1DIENhYmxlIiwgc3RvY2s6IDEyMCB9LAogIHsgc2t1OiAiQS0xMDEiLCBuYW1lOiAiV2lyZWxlc3MgTW91c2UiLCBzdG9jazogNTUgfSwKICB7IHNrdTogIkEtMTAyIiwgbmFtZTogIkxhcHRvcCBTdGFuZCIsIHN0b2NrOiAxOCB9LAogIHsgc2t1OiAiQi0yMDAiLCBuYW1lOiAiS2V5Ym9hcmQgKElTTykiLCBzdG9jazogODkgfSwKICB7IHNrdTogIkItMjAxIiwgbmFtZTogIkhETUkgQWRhcHRlciIsIHN0b2NrOiAwIH0sCiAgeyBza3U6ICJDLTMwMCIsIG5hbWU6ICJXZWJjYW0gMTA4MHAiLCBzdG9jazogNDIgfQpdfQogICAgICAgICAgZGF0YU5hbWU9Iml0ZW1zIgogICAgICAgID48L2RlZXMtdGFibGU+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPkNvbHVtbiBGaWx0ZXJzICsgU3RpY2t5IEhlYWRlciAoTmV3KTwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImRlbW8tZGVzY3JpcHRpb24iPlBlci1jb2x1bW4gcXVpY2sgZmlsdGVycyBhbmQgc3RpY2t5IGhlYWRlciB3aXRoIGludGVybmFsIHNjcm9sbC4gVHJ5IGZpbHRlcmluZyB0aGUgTmFtZSBjb2x1bW4uIFVzZXMgLS10YWJsZS1tYXgtaGVpZ2h0IHZhci48L3A+CiAgICAgICAgPHN0eWxlPgogICAgICAgICAgZGVlcy10YWJsZVtzdGlja3ktaGVhZGVyXSB7IC0tdGFibGUtbWF4LWhlaWdodDogMjIwcHg7IH0KICAgICAgICA8L3N0eWxlPgogICAgICAgIDxkZWVzLXRhYmxlCiAgICAgICAgICBoZWFkaW5nMT0iRW1wbG95ZWVzIgogICAgICAgICAgaGVhZGluZzI9IlF1aWNrIGZpbHRlciBwZXIgY29sdW1uICsgc3RpY2t5IGhlYWRlciIKICAgICAgICAgIC5zaG93Q29sdW1uRmlsdGVycz0ke3RydWV9CiAgICAgICAgICAuc3RpY2t5SGVhZGVyPSR7dHJ1ZX0KICAgICAgICAgIC5jb2x1bW5zPSR7WwogIHsga2V5OiAibmFtZSIsIGhlYWRlcjogIk5hbWUiLCBzb3J0YWJsZTogdHJ1ZSB9LAogIHsga2V5OiAiZW1haWwiLCBoZWFkZXI6ICJFbWFpbCIsIHNvcnRhYmxlOiB0cnVlIH0sCiAgeyBrZXk6ICJkZXBhcnRtZW50IiwgaGVhZGVyOiAiRGVwYXJ0bWVudCIsIHNvcnRhYmxlOiB0cnVlIH0KXX0KICAgICAgICAgIC5kYXRhPSR7WwogIHsgbmFtZTogIkFsaWNlIEpvaG5zb24iLCBlbWFpbDogImFsaWNlQGNvcnAuY29tIiwgZGVwYXJ0bWVudDogIkVuZ2luZWVyaW5nIiB9LAogIHsgbmFtZTogIkJvYiBTbWl0aCIsIGVtYWlsOiAiYm9iQGNvcnAuY29tIiwgZGVwYXJ0bWVudDogIlNhbGVzIiB9LAogIHsgbmFtZTogIkNoYXJsaWUgRGF2aXMiLCBlbWFpbDogImNoYXJsaWVAY29ycC5jb20iLCBkZXBhcnRtZW50OiAiSFIiIH0sCiAgeyBuYW1lOiAiRGlhbmEgTWFydGluZXoiLCBlbWFpbDogImRpYW5hQGNvcnAuY29tIiwgZGVwYXJ0bWVudDogIkVuZ2luZWVyaW5nIiB9LAogIHsgbmFtZTogIkV0aGFuIEJyb3duIiwgZW1haWw6ICJldGhhbkBjb3JwLmNvbSIsIGRlcGFydG1lbnQ6ICJGaW5hbmNlIiB9LAogIHsgbmFtZTogIkZpb25hIENsYXJrIiwgZW1haWw6ICJmaW9uYUBjb3JwLmNvbSIsIGRlcGFydG1lbnQ6ICJTYWxlcyIgfSwKICB7IG5hbWU6ICJHcmFjZSBMZWUiLCBlbWFpbDogImdyYWNlQGNvcnAuY29tIiwgZGVwYXJ0bWVudDogIkVuZ2luZWVyaW5nIiB9LAogIHsgbmFtZTogIkhlbnJ5IFdpbHNvbiIsIGVtYWlsOiAiaGVucnlAY29ycC5jb20iLCBkZXBhcnRtZW50OiAiTWFya2V0aW5nIiB9LAogIHsgbmFtZTogIklyZW5lIFdhbGtlciIsIGVtYWlsOiAiaXJlbmVAY29ycC5jb20iLCBkZXBhcnRtZW50OiAiRmluYW5jZSIgfSwKICB7IG5hbWU6ICJKYWNrIFR1cm5lciIsIGVtYWlsOiAiamFja0Bjb3JwLmNvbSIsIGRlcGFydG1lbnQ6ICJTdXBwb3J0IiB9Cl19CiAgICAgICAgICBkYXRhTmFtZT0iZW1wbG95ZWVzIgogICAgICAgID48L2RlZXMtdGFibGU+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIgogICAgICAgIEBzZWFyY2hSZXF1ZXN0PSR7YXN5bmMgKGUxMSkgPT4gewogIGNvbnN0IHsgcXVlcnkgfSA9IGUxMS5kZXRhaWwgfHwgeyBxdWVyeTogIiIgfTsKICBjb25zdCB0YWJsZTIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VydmVyU2VhcmNoRGVtbyIpOwogIGNvbnN0IGJhc2VEYXRhID0gWwogICAgeyBpZDogMSwgbmFtZTogIkFsaWNlIiwgY2l0eTogIkJlcmxpbiIsIHRpdGxlOiAiRW5naW5lZXIiIH0sCiAgICB7IGlkOiAyLCBuYW1lOiAiQm9iIiwgY2l0eTogIlBhcmlzIiwgdGl0bGU6ICJEZXNpZ25lciIgfSwKICAgIHsgaWQ6IDMsIG5hbWU6ICJDaGFybGllIiwgY2l0eTogIkxvbmRvbiIsIHRpdGxlOiAiTWFuYWdlciIgfSwKICAgIHsgaWQ6IDQsIG5hbWU6ICJEaWFuYSIsIGNpdHk6ICJNYWRyaWQiLCB0aXRsZTogIkVuZ2luZWVyIiB9LAogICAgeyBpZDogNSwgbmFtZTogIkV0aGFuIiwgY2l0eTogIlJvbWUiLCB0aXRsZTogIlN1cHBvcnQiIH0KICBdOwogIGF3YWl0IG5ldyBQcm9taXNlKChyMTEpID0+IHNldFRpbWVvdXQocjExLCAzMDApKTsKICBjb25zdCBxID0gU3RyaW5nKHF1ZXJ5IHx8ICIiKS50b0xvd2VyQ2FzZSgpOwogIGNvbnN0IGZpbHRlcmVkID0gcSA/IGJhc2VEYXRhLmZpbHRlcigocjExKSA9PiBPYmplY3QudmFsdWVzKHIxMSkuc29tZSgodjYpID0+IFN0cmluZyh2NikudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkpIDogYmFzZURhdGE7CiAgdGFibGUyLmRhdGEgPSBmaWx0ZXJlZDsKfX0KICAgICAgPgogICAgICAgIDxoMiBjbGFzcz0iZGVtby10aXRsZSI+U2VydmVyIFNlYXJjaCAoTmV3KTwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImRlbW8tZGVzY3JpcHRpb24iPlNlbGVjdCBTZXJ2ZXIgbW9kZSwgdHlwZSBhIHF1ZXJ5LCBhbmQgd2F0Y2ggdGhlIHRhYmxlIGZldGNoIHNpbXVsYXRlZCByZXN1bHRzLjwvcD4KICAgICAgICA8ZGVlcy10YWJsZQogICAgICAgICAgaWQ9InNlcnZlclNlYXJjaERlbW8iCiAgICAgICAgICBoZWFkaW5nMT0iUGVvcGxlIChTZXJ2ZXIgU2VhcmNoKSIKICAgICAgICAgIGhlYWRpbmcyPSJDbGljayBTZWFyY2gsIGNob29zZSBTZXJ2ZXIgbW9kZSwgYW5kIHR5cGUiCiAgICAgICAgICAuY29sdW1ucz0ke1sKICB7IGtleTogIm5hbWUiLCBoZWFkZXI6ICJOYW1lIiB9LAogIHsga2V5OiAiY2l0eSIsIGhlYWRlcjogIkNpdHkiIH0sCiAgeyBrZXk6ICJ0aXRsZSIsIGhlYWRlcjogIlRpdGxlIiB9Cl19CiAgICAgICAgICAuZGF0YT0ke1sKICB7IGlkOiAxLCBuYW1lOiAiQWxpY2UiLCBjaXR5OiAiQmVybGluIiwgdGl0bGU6ICJFbmdpbmVlciIgfSwKICB7IGlkOiAyLCBuYW1lOiAiQm9iIiwgY2l0eTogIlBhcmlzIiwgdGl0bGU6ICJEZXNpZ25lciIgfSwKICB7IGlkOiAzLCBuYW1lOiAiQ2hhcmxpZSIsIGNpdHk6ICJMb25kb24iLCB0aXRsZTogIk1hbmFnZXIiIH0sCiAgeyBpZDogNCwgbmFtZTogIkRpYW5hIiwgY2l0eTogIk1hZHJpZCIsIHRpdGxlOiAiRW5naW5lZXIiIH0sCiAgeyBpZDogNSwgbmFtZTogIkV0aGFuIiwgY2l0eTogIlJvbWUiLCB0aXRsZTogIlN1cHBvcnQiIH0KXX0KICAgICAgICAgIGRhdGFOYW1lPSJwZW9wbGUiCiAgICAgICAgPjwvZGVlcy10YWJsZT4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMiBjbGFzcz0iZGVtby10aXRsZSI+V2lkZSBQcm9wZXJ0aWVzICsgTWFueSBBY3Rpb25zPC9oMj4KICAgICAgICA8cCBjbGFzcz0iZGVtby1kZXNjcmlwdGlvbiI+QSB0YWJsZSB3aXRoIG1hbnkgY29sdW1ucyBhbmQgcmljaCBhY3Rpb25zIHRvIHN0cmVzcyB0ZXN0IGxheW91dCBhbmQgc3RpY2t5IEFjdGlvbnMuPC9wPgogICAgICAgIDxkZWVzLXRhYmxlCiAgICAgICAgICBoZWFkaW5nMT0iUGVvcGxlIERpcmVjdG9yeSIKICAgICAgICAgIGhlYWRpbmcyPSJNYW55IHByb3BlcnRpZXMgYW5kIGFjdGlvbnMiCiAgICAgICAgICAuY29sdW1ucz0ke1sKICB7IGtleTogImlkIiwgaGVhZGVyOiAiSUQiLCBzb3J0YWJsZTogdHJ1ZSB9LAogIHsga2V5OiAibmFtZSIsIGhlYWRlcjogIk5hbWUiLCBzb3J0YWJsZTogdHJ1ZSB9LAogIHsga2V5OiAicm9sZSIsIGhlYWRlcjogIlJvbGUiLCBzb3J0YWJsZTogdHJ1ZSB9LAogIHsga2V5OiAiZGVwYXJ0bWVudCIsIGhlYWRlcjogIkRlcGFydG1lbnQiLCBzb3J0YWJsZTogdHJ1ZSB9LAogIHsga2V5OiAiZW1haWwiLCBoZWFkZXI6ICJFbWFpbCIgfSwKICB7IGtleTogInBob25lIiwgaGVhZGVyOiAiUGhvbmUiIH0sCiAgeyBrZXk6ICJsb2NhdGlvbiIsIGhlYWRlcjogIkxvY2F0aW9uIiwgc29ydGFibGU6IHRydWUgfSwKICB7IGtleTogInN0YXR1cyIsIGhlYWRlcjogIlN0YXR1cyIsIHNvcnRhYmxlOiB0cnVlIH0sCiAgeyBrZXk6ICJjcmVhdGVkQXQiLCBoZWFkZXI6ICJDcmVhdGVkIiwgc29ydGFibGU6IHRydWUgfSwKICB7IGtleTogInVwZGF0ZWRBdCIsIGhlYWRlcjogIlVwZGF0ZWQiLCBzb3J0YWJsZTogdHJ1ZSB9LAogIHsga2V5OiAibGFzdExvZ2luIiwgaGVhZGVyOiAiTGFzdCBMb2dpbiIsIHNvcnRhYmxlOiB0cnVlIH0sCiAgeyBrZXk6ICJwcm9qZWN0cyIsIGhlYWRlcjogIlByb2plY3RzIiB9LAogIHsga2V5OiAidGFncyIsIGhlYWRlcjogIlRhZ3MiIH0sCiAgeyBrZXk6ICJub3RlcyIsIGhlYWRlcjogIk5vdGVzIiB9Cl19CiAgICAgICAgICAuZGF0YT0ke1sKICB7IGlkOiAxLCBuYW1lOiAiQWxpY2UgSm9obnNvbiIsIHJvbGU6ICJFbmdpbmVlciIsIGRlcGFydG1lbnQ6ICJSJkQiLCBlbWFpbDogImFsaWNlQGNvcnAuY29tIiwgcGhvbmU6ICIrMSAyMDIgNTU1IDAxMTEiLCBsb2NhdGlvbjogIkJlcmxpbiIsIHN0YXR1czogIkFjdGl2ZSIsIGNyZWF0ZWRBdDogIjIwMjMtMDEtMTIiLCB1cGRhdGVkQXQ6ICIyMDI0LTA1LTAzIiwgbGFzdExvZ2luOiAiMjAyNC0xMC0wMSIsIHByb2plY3RzOiA1LCB0YWdzOiAidHlwZXNjcmlwdCwgdWkiLCBub3RlczogIk1lbnRvciIgfSwKICB7IGlkOiAyLCBuYW1lOiAiQm9iIFNtaXRoIiwgcm9sZTogIkRlc2lnbmVyIiwgZGVwYXJ0bWVudDogIkRlc2lnbiIsIGVtYWlsOiAiYm9iQGNvcnAuY29tIiwgcGhvbmU6ICIrMSAyMDIgNTU1IDAxMTIiLCBsb2NhdGlvbjogIlBhcmlzIiwgc3RhdHVzOiAiQWN0aXZlIiwgY3JlYXRlZEF0OiAiMjAyMi0xMS0wNSIsIHVwZGF0ZWRBdDogIjIwMjQtMDQtMTAiLCBsYXN0TG9naW46ICIyMDI0LTA5LTI4IiwgcHJvamVjdHM6IDgsIHRhZ3M6ICJmaWdtYSwgYnJhbmQiLCBub3RlczogIlBhcnQtdGltZSIgfSwKICB7IGlkOiAzLCBuYW1lOiAiQ2hhcmxpZSBEYXZpcyIsIHJvbGU6ICJNYW5hZ2VyIiwgZGVwYXJ0bWVudDogIk9wcyIsIGVtYWlsOiAiY2hhcmxpZUBjb3JwLmNvbSIsIHBob25lOiAiKzEgMjAyIDU1NSAwMTEzIiwgbG9jYXRpb246ICJMb25kb24iLCBzdGF0dXM6ICJPbiBMZWF2ZSIsIGNyZWF0ZWRBdDogIjIwMjEtMDQtMjEiLCB1cGRhdGVkQXQ6ICIyMDI0LTAyLTE1IiwgbGFzdExvZ2luOiAiMjAyNC0wOC0xMiIsIHByb2plY3RzOiAzLCB0YWdzOiAic3JlLCBsZWFkZXJzaGlwIiwgbm90ZXM6ICIiIH0sCiAgeyBpZDogNCwgbmFtZTogIkRpYW5hIE1hcnRpbmV6Iiwgcm9sZTogIkVuZ2luZWVyIiwgZGVwYXJ0bWVudDogIlBsYXRmb3JtIiwgZW1haWw6ICJkaWFuYUBjb3JwLmNvbSIsIHBob25lOiAiKzEgMjAyIDU1NSAwMTE0IiwgbG9jYXRpb246ICJNYWRyaWQiLCBzdGF0dXM6ICJBY3RpdmUiLCBjcmVhdGVkQXQ6ICIyMDIwLTA2LTMwIiwgdXBkYXRlZEF0OiAiMjAyNC0wNi0yNSIsIGxhc3RMb2dpbjogIjIwMjQtMTAtMDIiLCBwcm9qZWN0czogNiwgdGFnczogIm5vZGUsIGFwaSIsIG5vdGVzOiAiT24tY2FsbCIgfSwKICB7IGlkOiA1LCBuYW1lOiAiRXRoYW4gQnJvd24iLCByb2xlOiAiU3VwcG9ydCIsIGRlcGFydG1lbnQ6ICJDUyIsIGVtYWlsOiAiZXRoYW5AY29ycC5jb20iLCBwaG9uZTogIisxIDIwMiA1NTUgMDExNSIsIGxvY2F0aW9uOiAiUm9tZSIsIHN0YXR1czogIkluYWN0aXZlIiwgY3JlYXRlZEF0OiAiMjAxOS0wOS0xOCIsIHVwZGF0ZWRBdDogIjIwMjQtMDMtMDkiLCBsYXN0TG9naW46ICIyMDI0LTA2LTE5IiwgcHJvamVjdHM6IDIsIHRhZ3M6ICJ6ZW5kZXNrIiwgbm90ZXM6ICJSZWhpcmUiIH0sCiAgeyBpZDogNiwgbmFtZTogIkZpb25hIENsYXJrIiwgcm9sZTogIlFBIiwgZGVwYXJ0bWVudDogIlFBIiwgZW1haWw6ICJmaW9uYUBjb3JwLmNvbSIsIHBob25lOiAiKzEgMjAyIDU1NSAwMTE2IiwgbG9jYXRpb246ICJWaWVubmEiLCBzdGF0dXM6ICJBY3RpdmUiLCBjcmVhdGVkQXQ6ICIyMDIyLTAzLTE0IiwgdXBkYXRlZEF0OiAiMjAyNC0wMy0wMSIsIGxhc3RMb2dpbjogIjIwMjQtMDktMDciLCBwcm9qZWN0czogNywgdGFnczogInBsYXl3cmlnaHQiLCBub3RlczogIiIgfQpdfQogICAgICAgICAgLmRhdGFBY3Rpb25zPSR7WwogIHsgbmFtZTogIlZpZXciLCBpY29uTmFtZTogImx1Y2lkZTpleWUiLCB0eXBlOiBbImluUm93IiwgImNvbnRleHRtZW51Il0sIGFjdGlvbkZ1bmM6IGFzeW5jICh7IGl0ZW0gfSkgPT4gewogICAgY29uc29sZS5sb2coInZpZXciLCBpdGVtKTsKICB9IH0sCiAgeyBuYW1lOiAiRWRpdCIsIGljb25OYW1lOiAibHVjaWRlOmVkaXQiLCB0eXBlOiBbImluUm93IiwgImNvbnRleHRtZW51Il0sIGFjdGlvbkZ1bmM6IGFzeW5jICh7IGl0ZW0gfSkgPT4gewogICAgY29uc29sZS5sb2coImVkaXQiLCBpdGVtKTsKICB9IH0sCiAgeyBuYW1lOiAiRGVsZXRlIiwgaWNvbk5hbWU6ICJsdWNpZGU6dHJhc2giLCB0eXBlOiBbImluUm93IiwgImNvbnRleHRtZW51Il0sIGFjdGlvbkZ1bmM6IGFzeW5jICh7IGl0ZW0gfSkgPT4gewogICAgY29uc29sZS5sb2coImRlbGV0ZSIsIGl0ZW0pOwogIH0gfSwKICB7IG5hbWU6ICJNZXNzYWdlIiwgaWNvbk5hbWU6ICJsdWNpZGU6bWVzc2FnZS1zcXVhcmUiLCB0eXBlOiBbImluUm93Il0sIGFjdGlvbkZ1bmM6IGFzeW5jICh7IGl0ZW0gfSkgPT4gewogICAgY29uc29sZS5sb2coIm1lc3NhZ2UiLCBpdGVtKTsKICB9IH0sCiAgeyBuYW1lOiAiSGlzdG9yeSIsIGljb25OYW1lOiAibHVjaWRlOmNsb2NrIiwgdHlwZTogWyJpblJvdyJdLCBhY3Rpb25GdW5jOiBhc3luYyAoeyBpdGVtIH0pID0+IHsKICAgIGNvbnNvbGUubG9nKCJoaXN0b3J5IiwgaXRlbSk7CiAgfSB9LAogIHsgbmFtZTogIkFkZCBOZXciLCBpY29uTmFtZTogImx1Y2lkZTpwbHVzIiwgdHlwZTogWyJoZWFkZXIiXSwgYWN0aW9uRnVuYzogYXN5bmMgKHsgdGFibGU6IHRhYmxlMiB9KSA9PiB7CiAgICBjb25zb2xlLmxvZygiYWRkIik7CiAgfSB9LAogIHsgbmFtZTogIkV4cG9ydCBDU1YiLCBpY29uTmFtZTogImx1Y2lkZTpkb3dubG9hZCIsIHR5cGU6IFsiaGVhZGVyIl0sIGFjdGlvbkZ1bmM6IGFzeW5jICh7IHRhYmxlOiB0YWJsZTIgfSkgPT4gewogICAgY29uc29sZS5sb2coImV4cG9ydCIpOwogIH0gfSwKICB7IG5hbWU6ICJCdWxrIERlbGV0ZSIsIGljb25OYW1lOiAibHVjaWRlOnRyYXNoLTIiLCB0eXBlOiBbImZvb3RlciJdLCBhY3Rpb25GdW5jOiBhc3luYyAoeyB0YWJsZTogdGFibGUyIH0pID0+IHsKICAgIGNvbnNvbGUubG9nKCJidWxrIGRlbGV0ZSIpOwogIH0gfQpdfQogICAgICAgID48L2RlZXMtdGFibGU+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPlNjcm9sbGFibGUgU21hbGwgSGVpZ2h0PC9oMj4KICAgICAgICA8cCBjbGFzcz0iZGVtby1kZXNjcmlwdGlvbiI+U2FtZSBhcyBhYm92ZSwgYnV0IHdpdGggbWFueSBpdGVtcyBhbmQgYSBzbWFsbCBmaXhlZCBoZWlnaHQgdG8gZm9yY2UgdmVydGljYWwgc2Nyb2xsaW5nIGluc2lkZSB0aGUgdGFibGUuIEFjdGlvbnMgcmVtYWluIHZpc2libGUgb24gdGhlIHJpZ2h0OyBob3Jpem9udGFsIHNjcm9sbCBhcHBlYXJzIGlmIG5lZWRlZC48L3A+CiAgICAgICAgPHN0eWxlPgogICAgICAgICAgI3Njcm9sbFNtYWxsSGVpZ2h0IHsgLS10YWJsZS1tYXgtaGVpZ2h0OiAyNDBweDsgfQogICAgICAgIDwvc3R5bGU+CiAgICAgICAgPGRlZXMtdGFibGUKICAgICAgICAgIGlkPSJzY3JvbGxTbWFsbEhlaWdodCIKICAgICAgICAgIC5zdGlja3lIZWFkZXI9JHt0cnVlfQogICAgICAgICAgaGVhZGluZzE9IlBlb3BsZSBEaXJlY3RvcnkgKFNjcm9sbGFibGUpIgogICAgICAgICAgaGVhZGluZzI9IkZvcmNlZCBzY3JvbGxpbmcgd2l0aCBtYW55IGl0ZW1zIgogICAgICAgICAgLmNvbHVtbnM9JHtbCiAgeyBrZXk6ICJpZCIsIGhlYWRlcjogIklEIiwgc29ydGFibGU6IHRydWUgfSwKICB7IGtleTogIm5hbWUiLCBoZWFkZXI6ICJOYW1lIiwgc29ydGFibGU6IHRydWUgfSwKICB7IGtleTogInJvbGUiLCBoZWFkZXI6ICJSb2xlIiwgc29ydGFibGU6IHRydWUgfSwKICB7IGtleTogImRlcGFydG1lbnQiLCBoZWFkZXI6ICJEZXBhcnRtZW50Iiwgc29ydGFibGU6IHRydWUgfSwKICB7IGtleTogImVtYWlsIiwgaGVhZGVyOiAiRW1haWwiIH0sCiAgeyBrZXk6ICJwaG9uZSIsIGhlYWRlcjogIlBob25lIiB9LAogIHsga2V5OiAibG9jYXRpb24iLCBoZWFkZXI6ICJMb2NhdGlvbiIsIHNvcnRhYmxlOiB0cnVlIH0sCiAgeyBrZXk6ICJzdGF0dXMiLCBoZWFkZXI6ICJTdGF0dXMiLCBzb3J0YWJsZTogdHJ1ZSB9LAogIHsga2V5OiAiY3JlYXRlZEF0IiwgaGVhZGVyOiAiQ3JlYXRlZCIsIHNvcnRhYmxlOiB0cnVlIH0sCiAgeyBrZXk6ICJ1cGRhdGVkQXQiLCBoZWFkZXI6ICJVcGRhdGVkIiwgc29ydGFibGU6IHRydWUgfSwKICB7IGtleTogImxhc3RMb2dpbiIsIGhlYWRlcjogIkxhc3QgTG9naW4iLCBzb3J0YWJsZTogdHJ1ZSB9LAogIHsga2V5OiAicHJvamVjdHMiLCBoZWFkZXI6ICJQcm9qZWN0cyIgfSwKICB7IGtleTogInRhZ3MiLCBoZWFkZXI6ICJUYWdzIiB9LAogIHsga2V5OiAibm90ZXMiLCBoZWFkZXI6ICJOb3RlcyIgfQpdfQogICAgICAgICAgLmRhdGE9JHtBcnJheS5mcm9tKHsgbGVuZ3RoOiAxMDAgfSwgKF81LCBpMTEpID0+ICh7CiAgaWQ6IGkxMSArIDEsCiAgbmFtZTogYFVzZXIgJHtpMTEgKyAxfWAsCiAgcm9sZTogWyJFbmdpbmVlciIsICJEZXNpZ25lciIsICJNYW5hZ2VyIiwgIlFBIiwgIlN1cHBvcnQiXVtpMTEgJSA1XSwKICBkZXBhcnRtZW50OiBbIlImRCIsICJEZXNpZ24iLCAiT3BzIiwgIlFBIiwgIkNTIl1baTExICUgNV0sCiAgZW1haWw6IGB1c2VyJHtpMTEgKyAxfUBjb3JwLmNvbWAsCiAgcGhvbmU6IGArMSAyMDIgNTU1ICR7U3RyaW5nKDFlMyArIGkxMSkuc2xpY2UoLTQpfWAsCiAgbG9jYXRpb246IFsiQmVybGluIiwgIlBhcmlzIiwgIkxvbmRvbiIsICJNYWRyaWQiLCAiUm9tZSJdW2kxMSAlIDVdLAogIHN0YXR1czogWyJBY3RpdmUiLCAiSW5hY3RpdmUiLCAiT24gTGVhdmUiXVtpMTEgJSAzXSwKICBjcmVhdGVkQXQ6IGAyMDIzLSR7U3RyaW5nKGkxMSAlIDEyICsgMSkucGFkU3RhcnQoMiwgIjAiKX0tJHtTdHJpbmcoaTExICUgMjggKyAxKS5wYWRTdGFydCgyLCAiMCIpfWAsCiAgdXBkYXRlZEF0OiBgMjAyNC0ke1N0cmluZygoaTExICsgMykgJSAxMiArIDEpLnBhZFN0YXJ0KDIsICIwIil9LSR7U3RyaW5nKChpMTEgKyA3KSAlIDI4ICsgMSkucGFkU3RhcnQoMiwgIjAiKX1gLAogIGxhc3RMb2dpbjogYDIwMjQtJHtTdHJpbmcoKGkxMSArIDYpICUgMTIgKyAxKS5wYWRTdGFydCgyLCAiMCIpfS0ke1N0cmluZygoaTExICsgMTApICUgMjggKyAxKS5wYWRTdGFydCgyLCAiMCIpfWAsCiAgcHJvamVjdHM6IGkxMSAlIDEyLAogIHRhZ3M6IGkxMSAlIDIgPyAidHlwZXNjcmlwdCIgOiAiZGVzaWduIiwKICBub3RlczogaTExICUgMyA/ICIiIDogIk5vdGUiCn0pKX0KICAgICAgICAgIC5kYXRhQWN0aW9ucz0ke1sKICB7IG5hbWU6ICJWaWV3IiwgaWNvbk5hbWU6ICJsdWNpZGU6ZXllIiwgdHlwZTogWyJpblJvdyJdLCBhY3Rpb25GdW5jOiBhc3luYyAoeyBpdGVtIH0pID0+IHsKICB9IH0sCiAgeyBuYW1lOiAiRWRpdCIsIGljb25OYW1lOiAibHVjaWRlOmVkaXQiLCB0eXBlOiBbImluUm93Il0sIGFjdGlvbkZ1bmM6IGFzeW5jICh7IGl0ZW0gfSkgPT4gewogIH0gfSwKICB7IG5hbWU6ICJEZWxldGUiLCBpY29uTmFtZTogImx1Y2lkZTp0cmFzaCIsIHR5cGU6IFsiaW5Sb3ciXSwgYWN0aW9uRnVuYzogYXN5bmMgKHsgaXRlbSB9KSA9PiB7CiAgfSB9Cl19CiAgICAgICAgPjwvZGVlcy10YWJsZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1kYXRhdmlldy9kZWVzLXRhYmxlL3N0eWxlcy5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X3RoZW1lKCk7CnZhciB0YWJsZVN0eWxlcyA9IFsKICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLm1haW5ib3ggewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMy45JSkiLCAiaHNsKDAgMCUgOTglKSIpfTsKICAgICAgICBmb250LWZhbWlseTogJHtjc3NHZWlzdEZvbnRGYW1pbHl9OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSAzLjklKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KCiAgICAgIC5oZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgcGFkZGluZzogMTZweCAyNHB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDY0cHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICB9CgogICAgICAuaGVhZGluZ0NvbnRhaW5lciB7CiAgICAgICAgZmxleDogMTsKICAgICAgfQoKICAgICAgLmhlYWRpbmcgewogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nMSB7CiAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTUlKSIpfTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDI1ZW07CiAgICAgIH0KICAgICAgCiAgICAgIC5oZWFkaW5nMiB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDU2LjklKSIsICJoc2woMjE1IDIwLjIlIDU1LjElKSIpfTsKICAgICAgICBtYXJnaW4tdG9wOiAycHg7CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nU2VwYXJhdGlvbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmhlYWRlckFjdGlvbnMgewogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBnYXA6IDhweDsKICAgICAgfQogICAgICAKICAgICAgLmhlYWRlckFjdGlvbiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNnB4OwogICAgICAgIHBhZGRpbmc6IDZweCAxMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDUuMSUpIiwgImhzbCgwIDAlIDYzLjklKSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICB9CgogICAgICAuaGVhZGVyQWN0aW9uOmhvdmVyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NS4xJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDc5LjglKSIsICJoc2woMCAwJSAyMC45JSkiKX07CiAgICAgIH0KCiAgICAgIC5oZWFkZXJBY3Rpb24gZGVlcy1pY29uIHsKICAgICAgICB3aWR0aDogMTRweDsKICAgICAgICBoZWlnaHQ6IDE0cHg7CiAgICAgIH0KCiAgICAgIC5zZWFyY2hHcmlkIHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtZ2FwOiAxNnB4OwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIG1heC1jb250ZW50OwogICAgICAgIHBhZGRpbmc6IDE2cHggMjRweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTglKSIsICJoc2woMCAwJSAzLjklKSIpfTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKICAgICAgfQoKICAgICAgQG1lZGlhIChtYXgtd2lkdGg6IDkwMHB4KSB7CiAgICAgICAgLnNlYXJjaEdyaWQgewogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKiBsZXQgc2VhcmNoIG1vZGUgc2l6ZSB0byBjb250ZW50IChubyBmb3JjZWQgd2lkdGgpICovCgogICAgICAuc2VhcmNoR3JpZC5oaWRkZW4gewogICAgICAgIGhlaWdodDogMHB4OwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwYWRkaW5nOiAwcHggMjRweDsKICAgICAgICBib3JkZXItYm90dG9tLXdpZHRoOiAwcHg7CiAgICAgIH0KCiAgICAgIC50YWJsZVNjcm9sbCB7CiAgICAgICAgLyogZW5hYmxlIGhvcml6b250YWwgc2Nyb2xsIG9ubHkgd2hlbiBjb250ZW50IGV4Y2VlZHMgd2lkdGggKi8KICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICAgIC8qIHByZXZlbnQgdmVydGljYWwgc2Nyb2xsIGluc2lkZSB0aGUgdGFibGUgY29udGFpbmVyICovCiAgICAgICAgb3ZlcmZsb3cteTogaGlkZGVuOwogICAgICAgIC8qIGF2b2lkIHJlc2VydmluZyBleHRyYSBzcGFjZSBmb3IgY2xhc3NpYyBzY3JvbGxiYXJzIHdoZXJlIHBvc3NpYmxlICovCiAgICAgICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlIGJvdGgtZWRnZXM7CiAgICAgIH0KICAgICAgLyogSGlkZSBob3Jpem9udGFsIHNjcm9sbGJhciBlbnRpcmVseSB3aGVuIG5vdCB1c2luZyBzdGlja3kgaGVhZGVyICovCiAgICAgIDpob3N0KDpub3QoW3N0aWNreS1oZWFkZXJdKSkgLnRhYmxlU2Nyb2xsIHsKICAgICAgICAtbXMtb3ZlcmZsb3ctc3R5bGU6IG5vbmU7IC8qIElFL0VkZ2UgKi8KICAgICAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7ICAgLyogRmlyZWZveCAoaGlkZXMgYm90aCBheGVzKSAqLwogICAgICB9CiAgICAgIDpob3N0KDpub3QoW3N0aWNreS1oZWFkZXJdKSkgLnRhYmxlU2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsgLyogQ2hyb21lL1NhZmFyaSAqLwogICAgICB9CiAgICAgIC8qIEluIHN0aWNreS1oZWFkZXIgbW9kZSwgaGlkZSBvbmx5IHRoZSBob3Jpem9udGFsIHNjcm9sbGJhciBpbiBXZWJLaXQvQmxpbmsgKi8KICAgICAgOmhvc3QoW3N0aWNreS1oZWFkZXJdKSAudGFibGVTY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyOmhvcml6b250YWwgewogICAgICAgIGhlaWdodDogMHB4OwogICAgICB9CiAgICAgIDpob3N0KFtzdGlja3ktaGVhZGVyXSkgLnRhYmxlU2Nyb2xsIHsKICAgICAgICBtYXgtaGVpZ2h0OiB2YXIoLS10YWJsZS1tYXgtaGVpZ2h0LCAzNjBweCk7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgIHRhYmxlIHsKICAgICAgICAvKiBhbGxvdyB0YWJsZSB0byBncm93IHdpZGVyIHRoYW4gY29udGFpbmVyIHNvIGFjdGlvbnMgY29sdW1uIGNhbiBzdGljayAqLwogICAgICAgIHdpZHRoOiBtYXgtY29udGVudDsKICAgICAgICBtaW4td2lkdGg6IDEwMCU7CiAgICAgICAgY2FwdGlvbi1zaWRlOiBib3R0b207CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7CiAgICAgICAgYm9yZGVyLXNwYWNpbmc6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5ub0RhdGFTZXQgewogICAgICAgIHBhZGRpbmc6IDQ4cHggMjRweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNTYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNTUuMSUpIil9OwogICAgICB9CiAgICAgIAogICAgICB0aGVhZCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMCAwJSA5JSkiKX07CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA3OS44JSkiLCAiaHNsKDAgMCUgMjAuOSUpIil9OwogICAgICB9CiAgICAgIDpob3N0KFtzdGlja3ktaGVhZGVyXSkgdGhlYWQgdGggewogICAgICAgIHBvc2l0aW9uOiBzdGlja3k7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHotaW5kZXg6IDI7CiAgICAgIH0KICAgICAgCiAgICAgIHRib2R5IHRyIHsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2U7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIAogICAgICAvKiBEZWZhdWx0IGhvcml6b250YWwgbGluZXMgKGJvdHRvbSBib3JkZXIgb25seSkgKi8KICAgICAgdGJvZHkgdHIgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgfQogICAgICAKICAgICAgdGJvZHkgdHI6bGFzdC1jaGlsZCB7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgICAgfQogICAgICAKICAgICAgLyogRnVsbCBob3Jpem9udGFsIGxpbmVzIHdoZW4gZW5hYmxlZCAqLwogICAgICA6aG9zdChbc2hvdy1ob3Jpem9udGFsLWxpbmVzXSkgdGJvZHkgdHIgewogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgIH0KICAgICAgCiAgICAgIDpob3N0KFtzaG93LWhvcml6b250YWwtbGluZXNdKSB0Ym9keSB0cjpmaXJzdC1jaGlsZCB7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgfQogICAgICAKICAgICAgOmhvc3QoW3Nob3ctaG9yaXpvbnRhbC1saW5lc10pIHRib2R5IHRyOmxhc3QtY2hpbGQgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgfQogICAgICAKICAgICAgdGJvZHkgdHI6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5Ni4xJSAvIDAuNSkiLCAiaHNsKDAgMCUgMTQuOSUgLyAwLjUpIil9OwogICAgICB9CiAgICAgIAogICAgICAvKiBDb2x1bW4gaG92ZXIgZWZmZWN0IGZvciBiZXR0ZXIgdHJhY2VhYmlsaXR5ICovCiAgICAgIHRkIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgCiAgICAgIHRkOjphZnRlciB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUgLyAwLjMpIiwgImhzbCgwIDAlIDE0LjklIC8gMC4zKSIpfTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMgZWFzZTsKICAgICAgICB6LWluZGV4OiAtMTsKICAgICAgfQogICAgICAKICAgICAgdGQ6aG92ZXI6OmFmdGVyIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CiAgICAgIAogICAgICAvKiBHcmlkIG1vZGUgLSBzaG93cyBib3RoIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGxpbmVzICovCiAgICAgIDpob3N0KFtzaG93LWdyaWRdKSB0aCB7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgfQogICAgICAKICAgICAgOmhvc3QoW3Nob3ctZ3JpZF0pIHRkIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItbGVmdDogbm9uZTsKICAgICAgICBib3JkZXItdG9wOiBub25lOwogICAgICB9CiAgICAgIAogICAgICA6aG9zdChbc2hvdy1ncmlkXSkgdGg6Zmlyc3QtY2hpbGQsCiAgICAgIDpob3N0KFtzaG93LWdyaWRdKSB0ZDpmaXJzdC1jaGlsZCB7CiAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgfQogICAgICAKICAgICAgOmhvc3QoW3Nob3ctZ3JpZF0pIHRib2R5IHRyOmZpcnN0LWNoaWxkIHRkIHsKICAgICAgICBib3JkZXItdG9wOiBub25lOwogICAgICB9CgogICAgICAvKiBTdGlja3kgQWN0aW9ucyBjb2x1bW4gKHJpZ2h0IHBpbm5lZCkgKi8KICAgICAgdGhlYWQgdGguYWN0aW9uc0NvbCwKICAgICAgdGJvZHkgdGQuYWN0aW9uc0NvbCB7CiAgICAgICAgcG9zaXRpb246IHN0aWNreTsKICAgICAgICByaWdodDogMDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgMy45JSkiKX07CiAgICAgIH0KICAgICAgdGhlYWQgdGguYWN0aW9uc0NvbCB7IHotaW5kZXg6IDM7IH0KICAgICAgdGJvZHkgdGQuYWN0aW9uc0NvbCB7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgICBib3gtc2hhZG93OiAtMXB4IDAgMCAwICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICB9CiAgICAgIAogICAgICB0Ym9keSB0ci5zZWxlY3RlZCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgIH0KCiAgICAgIHRib2R5IHRyLmhhc0F0dGFjaG1lbnQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyLjEgNzYuMiUgMzYuMyUgLyAwLjEpIiwgImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSAvIDAuMSkiKX07CiAgICAgIH0KCiAgICAgIHRoIHsKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgcGFkZGluZzogMTJweCAyNHB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA0Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CiAgICAgIH0KICAgICAgCiAgICAgIDpob3N0KFtzaG93LXZlcnRpY2FsLWxpbmVzXSkgdGggewogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICB9CiAgICAgIAogICAgICB0ZCB7CiAgICAgICAgcGFkZGluZzogMTJweCAyNHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAzLjklKSIsICJoc2woMCAwJSA5OCUpIil9OwogICAgICB9CiAgICAgIAogICAgICA6aG9zdChbc2hvdy12ZXJ0aWNhbC1saW5lc10pIHRkIHsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgfQogICAgICAKICAgICAgdGg6Zmlyc3QtY2hpbGQsCiAgICAgIHRkOmZpcnN0LWNoaWxkIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDI0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIHRoOmxhc3QtY2hpbGQsCiAgICAgIHRkOmxhc3QtY2hpbGQgewogICAgICAgIHBhZGRpbmctcmlnaHQ6IDI0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIDpob3N0KFtzaG93LXZlcnRpY2FsLWxpbmVzXSkgdGg6bGFzdC1jaGlsZCwKICAgICAgOmhvc3QoW3Nob3ctdmVydGljYWwtbGluZXNdKSB0ZDpsYXN0LWNoaWxkIHsKICAgICAgICBib3JkZXItcmlnaHQ6IG5vbmU7CiAgICAgIH0KICAgICAgCiAgICAgIC5pbm5lckNlbGxDb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICB9CiAgICAgIHRkIGlucHV0IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA0cHg7CiAgICAgICAgYm90dG9tOiA0cHg7CiAgICAgICAgbGVmdDogMjBweDsKICAgICAgICByaWdodDogMjBweDsKICAgICAgICB3aWR0aDogY2FsYygxMDAlIC0gNDBweCk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA4cHgpOwogICAgICAgIHBhZGRpbmc6IDAgMTJweDsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMy45JSkiLCAiaHNsKDAgMCUgOTglKSIpfTsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgICBmb250LXNpemU6IGluaGVyaXQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gMC4wNSk7CiAgICAgIH0KICAgICAgCiAgICAgIHRkIGlucHV0OmZvY3VzIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgNTEuMiUpIiwgImhzbCgyMTcuMiA5MS4yJSA1OS44JSkiKX07CiAgICAgICAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7CiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgNTEuMiUgLyAwLjIpIiwgImhzbCgyMTcuMiA5MS4yJSA1OS44JSAvIDAuMikiKX07CiAgICAgIH0KCiAgICAgIC8qIGZpbHRlciByb3cgKi8KICAgICAgdGhlYWQgdHIuZmlsdGVyc1JvdyB0aCB7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHggMTJweCAxMnB4OwogICAgICB9CiAgICAgIHRoZWFkIHRyLmZpbHRlcnNSb3cgdGggaW5wdXRbdHlwZT0ndGV4dCddIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMy45JSkiLCAiaHNsKDAgMCUgOTglKSIpfTsKICAgICAgfQogICAgICAuYWN0aW9uc0NvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGdhcDogNHB4OwogICAgICB9CiAgICAgIAogICAgICAuYWN0aW9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA0Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICB9CgogICAgICAuYWN0aW9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICB9CgogICAgICAuYWN0aW9uOmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMCAwJSAxMS44JSkiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5hY3Rpb24gZGVlcy1pY29uIHsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5mb290ZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgaGVpZ2h0OiA1MnB4OwogICAgICAgIHBhZGRpbmc6IDAgMjRweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNDYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5Ni4xJSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgfQoKICAgICAgLnRhYmxlU3RhdGlzdGljcyB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLmZvb3RlckFjdGlvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgIH0KCiAgICAgIC5mb290ZXJBY3Rpb25zIC5mb290ZXJBY3Rpb24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDZweDsKICAgICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDQ2LjklKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICB9CgogICAgICAuZm9vdGVyQWN0aW9ucyAuZm9vdGVyQWN0aW9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUuMSUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICB9CgogICAgICAuZm9vdGVyQWN0aW9ucyAuZm9vdGVyQWN0aW9uIGRlZXMtaWNvbiB7CiAgICAgICAgd2lkdGg6IDE0cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICB9CiAgYApdOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWRhdGF2aWV3L2RlZXMtdGFibGUvZGF0YS5qcwpmdW5jdGlvbiBjb21wdXRlQ29sdW1uc0Zyb21EaXNwbGF5RnVuY3Rpb24oZGlzcGxheUZ1bmN0aW9uLCBkYXRhKSB7CiAgaWYgKCFkYXRhIHx8IGRhdGEubGVuZ3RoID09PSAwKQogICAgcmV0dXJuIFtdOwogIGNvbnN0IGZpcnN0VHJhbnNmb3JtZWRJdGVtID0gZGlzcGxheUZ1bmN0aW9uKGRhdGFbMF0pOwogIGNvbnN0IGtleXMyID0gT2JqZWN0LmtleXMoZmlyc3RUcmFuc2Zvcm1lZEl0ZW0pOwogIHJldHVybiBrZXlzMi5tYXAoKGtleTIpID0+ICh7CiAgICBrZXk6IGtleTIsCiAgICBoZWFkZXI6IGtleTIsCiAgICB2YWx1ZTogKHJvdykgPT4gZGlzcGxheUZ1bmN0aW9uKHJvdylba2V5Ml0KICB9KSk7Cn0KZnVuY3Rpb24gY29tcHV0ZUVmZmVjdGl2ZUNvbHVtbnMoY29sdW1ucywgYXVnbWVudEZyb21EaXNwbGF5RnVuY3Rpb24sIGRpc3BsYXlGdW5jdGlvbiwgZGF0YSkgewogIGNvbnN0IGJhc2UgPSAoY29sdW1ucyB8fCBbXSkuc2xpY2UoKTsKICBpZiAoIWF1Z21lbnRGcm9tRGlzcGxheUZ1bmN0aW9uKQogICAgcmV0dXJuIGJhc2U7CiAgY29uc3QgZnJvbURpc3BsYXkgPSBjb21wdXRlQ29sdW1uc0Zyb21EaXNwbGF5RnVuY3Rpb24oZGlzcGxheUZ1bmN0aW9uLCBkYXRhKTsKICBjb25zdCBleGlzdGluZ0tleXMgPSBuZXcgU2V0KGJhc2UubWFwKChjMTEpID0+IFN0cmluZyhjMTEua2V5KSkpOwogIGZvciAoY29uc3QgY29sIG9mIGZyb21EaXNwbGF5KSB7CiAgICBpZiAoIWV4aXN0aW5nS2V5cy5oYXMoU3RyaW5nKGNvbC5rZXkpKSkgewogICAgICBiYXNlLnB1c2goY29sKTsKICAgIH0KICB9CiAgcmV0dXJuIGJhc2U7Cn0KZnVuY3Rpb24gZ2V0Q2VsbFZhbHVlKHJvdywgY29sLCBkaXNwbGF5RnVuY3Rpb24pIHsKICByZXR1cm4gY29sLnZhbHVlID8gY29sLnZhbHVlKHJvdykgOiByb3dbY29sLmtleV07Cn0KZnVuY3Rpb24gZ2V0Vmlld0RhdGEoZGF0YSwgZWZmZWN0aXZlQ29sdW1ucywgc29ydEtleSwgc29ydERpciwgZmlsdGVyVGV4dCwgY29sdW1uRmlsdGVycywgZmlsdGVyTW9kZSA9ICJ0YWJsZSIsIGx1Y2VuZVByZWRpY2F0ZSkgewogIGxldCBhcnIgPSBkYXRhLnNsaWNlKCk7CiAgY29uc3QgZnQgPSAoZmlsdGVyVGV4dCB8fCAiIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgY29uc3QgY2YgPSBjb2x1bW5GaWx0ZXJzIHx8IHt9OwogIGNvbnN0IGNmS2V5cyA9IE9iamVjdC5rZXlzKGNmKS5maWx0ZXIoKGs1KSA9PiAoY2ZbazVdID8/ICIiKS50cmltKCkubGVuZ3RoID4gMCk7CiAgaWYgKGZ0IHx8IGNmS2V5cy5sZW5ndGggPiAwKSB7CiAgICBhcnIgPSBhcnIuZmlsdGVyKChyb3cpID0+IHsKICAgICAgZm9yIChjb25zdCBrNSBvZiBjZktleXMpIHsKICAgICAgICBpZiAoZmlsdGVyTW9kZSA9PT0gImRhdGEiKSB7CiAgICAgICAgICBjb25zdCB2YWwgPSByb3dbazVdOwogICAgICAgICAgY29uc3QgczEwID0gU3RyaW5nKHZhbCA/PyAiIikudG9Mb3dlckNhc2UoKTsKICAgICAgICAgIGNvbnN0IG5lZWRsZSA9IFN0cmluZyhjZltrNV0pLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICBpZiAoIXMxMC5pbmNsdWRlcyhuZWVkbGUpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGNvbDIgPSBlZmZlY3RpdmVDb2x1bW5zLmZpbmQoKGMxMSkgPT4gU3RyaW5nKGMxMS5rZXkpID09PSBrNSk7CiAgICAgICAgICBpZiAoIWNvbDIgfHwgY29sMi5oaWRkZW4gfHwgY29sMi5maWx0ZXJhYmxlID09PSBmYWxzZSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICBjb25zdCB2YWwgPSBnZXRDZWxsVmFsdWUocm93LCBjb2wyKTsKICAgICAgICAgIGNvbnN0IHMxMCA9IFN0cmluZyh2YWwgPz8gIiIpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICBjb25zdCBuZWVkbGUgPSBTdHJpbmcoY2ZbazVdKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgaWYgKCFzMTAuaW5jbHVkZXMobmVlZGxlKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZnQpIHsKICAgICAgICBpZiAobHVjZW5lUHJlZGljYXRlKSB7CiAgICAgICAgICBpZiAoIWx1Y2VuZVByZWRpY2F0ZShyb3cpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgbGV0IGFueSA9IGZhbHNlOwogICAgICAgIGlmIChmaWx0ZXJNb2RlID09PSAiZGF0YSIpIHsKICAgICAgICAgIGZvciAoY29uc3QgdmFsIG9mIE9iamVjdC52YWx1ZXMocm93KSkgewogICAgICAgICAgICBjb25zdCBzMTAgPSBTdHJpbmcodmFsID8/ICIiKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICBpZiAoczEwLmluY2x1ZGVzKGZ0KSkgewogICAgICAgICAgICAgIGFueSA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZm9yIChjb25zdCBjb2wyIG9mIGVmZmVjdGl2ZUNvbHVtbnMpIHsKICAgICAgICAgICAgaWYgKGNvbDIuaGlkZGVuKQogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBjb25zdCB2YWwgPSBnZXRDZWxsVmFsdWUocm93LCBjb2wyKTsKICAgICAgICAgICAgY29uc3QgczEwID0gU3RyaW5nKHZhbCA/PyAiIikudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgaWYgKHMxMC5pbmNsdWRlcyhmdCkpIHsKICAgICAgICAgICAgICBhbnkgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghYW55KQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfSk7CiAgfQogIGlmICghc29ydEtleSB8fCAhc29ydERpcikKICAgIHJldHVybiBhcnI7CiAgY29uc3QgY29sID0gZWZmZWN0aXZlQ29sdW1ucy5maW5kKChjMTEpID0+IFN0cmluZyhjMTEua2V5KSA9PT0gc29ydEtleSk7CiAgaWYgKCFjb2wpCiAgICByZXR1cm4gYXJyOwogIGNvbnN0IGRpciA9IHNvcnREaXIgPT09ICJhc2MiID8gMSA6IC0xOwogIGFyci5zb3J0KChhNSwgYjYpID0+IHsKICAgIGNvbnN0IHZhID0gZ2V0Q2VsbFZhbHVlKGE1LCBjb2wpOwogICAgY29uc3QgdmIgPSBnZXRDZWxsVmFsdWUoYjYsIGNvbCk7CiAgICBpZiAodmEgPT0gbnVsbCAmJiB2YiA9PSBudWxsKQogICAgICByZXR1cm4gMDsKICAgIGlmICh2YSA9PSBudWxsKQogICAgICByZXR1cm4gLTEgKiBkaXI7CiAgICBpZiAodmIgPT0gbnVsbCkKICAgICAgcmV0dXJuIDEgKiBkaXI7CiAgICBpZiAodHlwZW9mIHZhID09PSAibnVtYmVyIiAmJiB0eXBlb2YgdmIgPT09ICJudW1iZXIiKQogICAgICByZXR1cm4gKHZhIC0gdmIpICogZGlyOwogICAgY29uc3Qgc2EgPSBTdHJpbmcodmEpLnRvTG93ZXJDYXNlKCk7CiAgICBjb25zdCBzYiA9IFN0cmluZyh2YikudG9Mb3dlckNhc2UoKTsKICAgIGlmIChzYSA8IHNiKQogICAgICByZXR1cm4gLTEgKiBkaXI7CiAgICBpZiAoc2EgPiBzYikKICAgICAgcmV0dXJuIDEgKiBkaXI7CiAgICByZXR1cm4gMDsKICB9KTsKICByZXR1cm4gYXJyOwp9CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZGF0YXZpZXcvZGVlcy10YWJsZS9sdWNlbmUuanMKZnVuY3Rpb24gc3RyaXBRdW90ZXMoczEwKSB7CiAgaWYgKHMxMC5zdGFydHNXaXRoKCciJykgJiYgczEwLmVuZHNXaXRoKCciJykgfHwgczEwLnN0YXJ0c1dpdGgoIiciKSAmJiBzMTAuZW5kc1dpdGgoIiciKSkgewogICAgcmV0dXJuIHMxMC5zbGljZSgxLCAtMSk7CiAgfQogIHJldHVybiBzMTA7Cn0KZnVuY3Rpb24gc3BsaXRCeU9yKGlucHV0KSB7CiAgcmV0dXJuIGlucHV0LnNwbGl0KC9ccytPUlxzKy9pKS5tYXAoKHMxMCkgPT4gczEwLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pOwp9CmZ1bmN0aW9uIHNwbGl0QnlBbmQoaW5wdXQpIHsKICByZXR1cm4gaW5wdXQuc3BsaXQoL1xzK0FORFxzKy9pKS5tYXAoKHMxMCkgPT4gczEwLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pOwp9CmZ1bmN0aW9uIHBhcnNlVGVybShyYXcyKSB7CiAgaWYgKCFyYXcyKQogICAgcmV0dXJuIG51bGw7CiAgbGV0IG5lZ2F0ZSA9IGZhbHNlOwogIGNvbnN0IG5vdE1hdGNoID0gcmF3Mi5tYXRjaCgvXlxzKihOT1Rccyt8LSlccyooLiopJC9pKTsKICBpZiAobm90TWF0Y2gpIHsKICAgIG5lZ2F0ZSA9IHRydWU7CiAgICByYXcyID0gbm90TWF0Y2hbMl07CiAgfQogIGNvbnN0IHJhbmdlTWF0Y2ggPSByYXcyLm1hdGNoKC9eKFteOlxzXSspXHMqOlxzKlxbKC4qPylccytUT1xzKyguKj8pXF0kL2kpOwogIGlmIChyYW5nZU1hdGNoKSB7CiAgICByZXR1cm4gewogICAgICBmaWVsZDogcmFuZ2VNYXRjaFsxXSwKICAgICAgbmVnYXRlLAogICAgICByYW5nZTogeyBsb3dlcjogc3RyaXBRdW90ZXMocmFuZ2VNYXRjaFsyXSkudG9Mb3dlckNhc2UoKSwgdXBwZXI6IHN0cmlwUXVvdGVzKHJhbmdlTWF0Y2hbM10pLnRvTG93ZXJDYXNlKCksIGluY2x1c2l2ZTogdHJ1ZSB9CiAgICB9OwogIH0KICBjb25zdCBtNyA9IHJhdzIubWF0Y2goL14oW146XHNdKylccyo6XHMqKCJbXiJdKiJ8J1teJ10qJ3xbXiInXHNdKykkLyk7CiAgaWYgKG03KSB7CiAgICByZXR1cm4geyBmaWVsZDogbTdbMV0sIHZhbHVlOiBzdHJpcFF1b3RlcyhtN1syXSkudG9Mb3dlckNhc2UoKSwgbmVnYXRlIH07CiAgfQogIGlmIChyYXcyLmxlbmd0aCA+IDApIHsKICAgIHJldHVybiB7IHZhbHVlOiBzdHJpcFF1b3RlcyhyYXcyKS50b0xvd2VyQ2FzZSgpLCBuZWdhdGUgfTsKICB9CiAgcmV0dXJuIG51bGw7Cn0KZnVuY3Rpb24gcGFyc2VMdWNlbmUoaW5wdXQpIHsKICBpZiAoIWlucHV0KQogICAgcmV0dXJuIG51bGw7CiAgY29uc3QgY2xhdXNlcyA9IHNwbGl0QnlPcihpbnB1dCkubWFwKChjbGF1c2VTdHIpID0+IHsKICAgIGNvbnN0IHRlcm1zID0gc3BsaXRCeUFuZChjbGF1c2VTdHIpLm1hcChwYXJzZVRlcm0pLmZpbHRlcigodDkpID0+ICEhdDkgJiYgISF0OS52YWx1ZSk7CiAgICByZXR1cm4geyB0ZXJtcyB9OwogIH0pLmZpbHRlcigoYzExKSA9PiBjMTEudGVybXMubGVuZ3RoID4gMCk7CiAgaWYgKGNsYXVzZXMubGVuZ3RoID09PSAwKQogICAgcmV0dXJuIG51bGw7CiAgcmV0dXJuIHsgY2xhdXNlcyB9Owp9CmZ1bmN0aW9uIGNvbXBpbGVMdWNlbmVQcmVkaWNhdGUoaW5wdXQsIG1vZGUsIGNvbHVtbnMpIHsKICBjb25zdCBhc3QgPSBwYXJzZUx1Y2VuZShpbnB1dCk7CiAgaWYgKCFhc3QpCiAgICByZXR1cm4gbnVsbDsKICBjb25zdCBjb2xNYXAgPSBuZXcgTWFwKGNvbHVtbnMubWFwKChjMTEpID0+IFtTdHJpbmcoYzExLmtleSksIGMxMV0pKTsKICBjb25zdCBjbXAgPSAoYTUsIGI2KSA9PiBhNSA8IGI2ID8gLTEgOiBhNSA+IGI2ID8gMSA6IDA7CiAgY29uc3QgY29lcmNlMiA9IChzMTApID0+IHsKICAgIGNvbnN0IHN0ciA9IFN0cmluZyhzMTAgPz8gIiIpLnRvTG93ZXJDYXNlKCk7CiAgICBjb25zdCBudW0gPSBOdW1iZXIoc3RyKTsKICAgIGNvbnN0IGRhdGUgPSBEYXRlLnBhcnNlKHN0cik7CiAgICBpZiAoIU51bWJlci5pc05hTihudW0pICYmIHN0ci50cmltKCkgIT09ICIiKQogICAgICByZXR1cm4geyB0OiAibiIsIHY6IG51bSB9OwogICAgaWYgKCFOdW1iZXIuaXNOYU4oZGF0ZSkpCiAgICAgIHJldHVybiB7IHQ6ICJkIiwgdjogZGF0ZSB9OwogICAgcmV0dXJuIHsgdDogInMiLCB2OiBzdHIgfTsKICB9OwogIGNvbnN0IGluUmFuZ2UgPSAodmFsLCBsb3dlciwgdXBwZXIpID0+IHsKICAgIGNvbnN0IGE1ID0gY29lcmNlMih2YWwpOwogICAgY29uc3QgbG8yID0gY29lcmNlMihsb3dlcik7CiAgICBjb25zdCB1cCA9IGNvZXJjZTIodXBwZXIpOwogICAgaWYgKGE1LnQgPT09ICJzIiAmJiBsbzIudCA9PT0gInMiICYmIHVwLnQgPT09ICJzIikgewogICAgICBjb25zdCBhdiA9IGE1LnY7CiAgICAgIHJldHVybiBjbXAoYXYsIGxvMi52KSA+PSAwICYmIGNtcChhdiwgdXAudikgPD0gMDsKICAgIH0KICAgIGlmIChhNS50ID09PSAibiIgJiYgbG8yLnQgPT09ICJuIiAmJiB1cC50ID09PSAibiIpIHsKICAgICAgY29uc3QgYXYgPSBhNS52OwogICAgICByZXR1cm4gYXYgPj0gbG8yLnYgJiYgYXYgPD0gdXAudjsKICAgIH0KICAgIGlmIChhNS50ID09PSAiZCIgJiYgbG8yLnQgPT09ICJkIiAmJiB1cC50ID09PSAiZCIpIHsKICAgICAgY29uc3QgYXYgPSBhNS52OwogICAgICByZXR1cm4gYXYgPj0gbG8yLnYgJiYgYXYgPD0gdXAudjsKICAgIH0KICAgIGNvbnN0IGFzID0gU3RyaW5nKHZhbCA/PyAiIikudG9Mb3dlckNhc2UoKTsKICAgIHJldHVybiBjbXAoYXMsIGxvd2VyKSA+PSAwICYmIGNtcChhcywgdXBwZXIpIDw9IDA7CiAgfTsKICByZXR1cm4gKHJvdykgPT4gewogICAgZm9yIChjb25zdCBjbGF1c2Ugb2YgYXN0LmNsYXVzZXMpIHsKICAgICAgbGV0IGNsYXVzZU9rID0gdHJ1ZTsKICAgICAgZm9yIChjb25zdCB0ZXJtIG9mIGNsYXVzZS50ZXJtcykgewogICAgICAgIGxldCBvazMgPSBmYWxzZTsKICAgICAgICBpZiAodGVybS5yYW5nZSAmJiB0ZXJtLmZpZWxkKSB7CiAgICAgICAgICBpZiAobW9kZSA9PT0gImRhdGEiKSB7CiAgICAgICAgICAgIG9rMyA9IGluUmFuZ2Uocm93W3Rlcm0uZmllbGRdLCB0ZXJtLnJhbmdlLmxvd2VyLCB0ZXJtLnJhbmdlLnVwcGVyKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IGNvbCA9IGNvbE1hcC5nZXQodGVybS5maWVsZCk7CiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbC5oaWRkZW4pIHsKICAgICAgICAgICAgICBvazMgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjb2wudmFsdWUgPyBjb2wudmFsdWUocm93KSA6IHJvd1tjb2wua2V5XTsKICAgICAgICAgICAgICBvazMgPSBpblJhbmdlKHZhbCwgdGVybS5yYW5nZS5sb3dlciwgdGVybS5yYW5nZS51cHBlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRlcm0uZmllbGQgJiYgdGVybS52YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICBpZiAobW9kZSA9PT0gImRhdGEiKSB7CiAgICAgICAgICAgIGNvbnN0IHMxMCA9IFN0cmluZyhyb3dbdGVybS5maWVsZF0gPz8gIiIpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIG9rMyA9IHMxMC5pbmNsdWRlcyh0ZXJtLnZhbHVlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IGNvbCA9IGNvbE1hcC5nZXQodGVybS5maWVsZCk7CiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbC5oaWRkZW4gPT09IHRydWUpIHsKICAgICAgICAgICAgICBvazMgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjb2wudmFsdWUgPyBjb2wudmFsdWUocm93KSA6IHJvd1tjb2wua2V5XTsKICAgICAgICAgICAgICBjb25zdCBzMTAgPSBTdHJpbmcodmFsID8/ICIiKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgIG9rMyA9IHMxMC5pbmNsdWRlcyh0ZXJtLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGVybS52YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICBpZiAobW9kZSA9PT0gImRhdGEiKSB7CiAgICAgICAgICAgIG9rMyA9IE9iamVjdC52YWx1ZXMocm93KS5zb21lKCh2NikgPT4gU3RyaW5nKHY2ID8/ICIiKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0udmFsdWUpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG9rMyA9IGNvbHVtbnMuc29tZSgoY29sKSA9PiB7CiAgICAgICAgICAgICAgaWYgKGNvbC5oaWRkZW4pCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgY29uc3QgdmFsID0gY29sLnZhbHVlID8gY29sLnZhbHVlKHJvdykgOiByb3dbY29sLmtleV07CiAgICAgICAgICAgICAgY29uc3QgczEwID0gU3RyaW5nKHZhbCA/PyAiIikudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICByZXR1cm4gczEwLmluY2x1ZGVzKHRlcm0udmFsdWUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRlcm0ubmVnYXRlKQogICAgICAgICAgb2szID0gIW9rMzsKICAgICAgICBpZiAoIW9rMykgewogICAgICAgICAgY2xhdXNlT2sgPSBmYWxzZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY2xhdXNlT2spCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKfQoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWRhdGF2aWV3L2RlZXMtdGFibGUvZGVlcy10YWJsZS5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2Rpc3RfdHMyOSgpOwppbml0X2RlZXNfaWNvbigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGUzOSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNDAgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNUYWJsZSA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy10YWJsZSIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX2hlYWRpbmcxX2RlY29yYXRvcnM7CiAgbGV0IF9oZWFkaW5nMV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2hlYWRpbmcxX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oZWFkaW5nMl9kZWNvcmF0b3JzOwogIGxldCBfaGVhZGluZzJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oZWFkaW5nMl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGF0YV9kZWNvcmF0b3JzOwogIGxldCBfZGF0YV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RhdGFfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2tleV9kZWNvcmF0b3JzOwogIGxldCBfa2V5X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfa2V5X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sYWJlbF9kZWNvcmF0b3JzOwogIGxldCBfbGFiZWxfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sYWJlbF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGlzYWJsZWRfZGVjb3JhdG9yczsKICBsZXQgX2Rpc2FibGVkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGlzYWJsZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlcXVpcmVkX2RlY29yYXRvcnM7CiAgbGV0IF9yZXF1aXJlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlcXVpcmVkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kYXRhTmFtZV9kZWNvcmF0b3JzOwogIGxldCBfZGF0YU5hbWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kYXRhTmFtZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VhcmNoYWJsZV9kZWNvcmF0b3JzOwogIGxldCBfc2VhcmNoYWJsZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlYXJjaGFibGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RhdGFBY3Rpb25zX2RlY29yYXRvcnM7CiAgbGV0IF9kYXRhQWN0aW9uc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RhdGFBY3Rpb25zX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb2x1bW5zX2RlY29yYXRvcnM7CiAgbGV0IF9jb2x1bW5zX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29sdW1uc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcm93S2V5X2RlY29yYXRvcnM7CiAgbGV0IF9yb3dLZXlfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yb3dLZXlfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2F1Z21lbnRGcm9tRGlzcGxheUZ1bmN0aW9uX2RlY29yYXRvcnM7CiAgbGV0IF9hdWdtZW50RnJvbURpc3BsYXlGdW5jdGlvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2F1Z21lbnRGcm9tRGlzcGxheUZ1bmN0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kaXNwbGF5RnVuY3Rpb25fZGVjb3JhdG9yczsKICBsZXQgX2Rpc3BsYXlGdW5jdGlvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Rpc3BsYXlGdW5jdGlvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmV2ZXJzZURpc3BsYXlGdW5jdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfcmV2ZXJzZURpc3BsYXlGdW5jdGlvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JldmVyc2VEaXNwbGF5RnVuY3Rpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkRGF0YVJvd19kZWNvcmF0b3JzOwogIGxldCBfc2VsZWN0ZWREYXRhUm93X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWREYXRhUm93X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lZGl0YWJsZUZpZWxkc19kZWNvcmF0b3JzOwogIGxldCBfZWRpdGFibGVGaWVsZHNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lZGl0YWJsZUZpZWxkc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1ZlcnRpY2FsTGluZXNfZGVjb3JhdG9yczsKICBsZXQgX3Nob3dWZXJ0aWNhbExpbmVzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1ZlcnRpY2FsTGluZXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dIb3Jpem9udGFsTGluZXNfZGVjb3JhdG9yczsKICBsZXQgX3Nob3dIb3Jpem9udGFsTGluZXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93SG9yaXpvbnRhbExpbmVzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93R3JpZF9kZWNvcmF0b3JzOwogIGxldCBfc2hvd0dyaWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93R3JpZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc29ydEtleV9kZWNvcmF0b3JzOwogIGxldCBfc29ydEtleV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NvcnRLZXlfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NvcnREaXJfZGVjb3JhdG9yczsKICBsZXQgX3NvcnREaXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zb3J0RGlyX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWx0ZXJUZXh0X2RlY29yYXRvcnM7CiAgbGV0IF9maWx0ZXJUZXh0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZmlsdGVyVGV4dF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29sdW1uRmlsdGVyc19kZWNvcmF0b3JzOwogIGxldCBfY29sdW1uRmlsdGVyc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbHVtbkZpbHRlcnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dDb2x1bW5GaWx0ZXJzX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93Q29sdW1uRmlsdGVyc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dDb2x1bW5GaWx0ZXJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zdGlja3lIZWFkZXJfZGVjb3JhdG9yczsKICBsZXQgX3N0aWNreUhlYWRlcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3N0aWNreUhlYWRlcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VhcmNoTW9kZV9kZWNvcmF0b3JzOwogIGxldCBfc2VhcmNoTW9kZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlYXJjaE1vZGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGlvbk1vZGVfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGlvbk1vZGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3Rpb25Nb2RlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZElkc19kZWNvcmF0b3JzOwogIGxldCBfc2VsZWN0ZWRJZHNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZElkc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzVGFibGUyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfaGVhZGluZzFfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgIH0pXTsKICAgICAgX2hlYWRpbmcyX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IFN0cmluZwogICAgICB9KV07CiAgICAgIF9kYXRhX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEFycmF5CiAgICAgIH0pXTsKICAgICAgX2tleV9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBTdHJpbmcKICAgICAgfSldOwogICAgICBfbGFiZWxfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgIH0pXTsKICAgICAgX2Rpc2FibGVkX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEJvb2xlYW4KICAgICAgfSldOwogICAgICBfcmVxdWlyZWRfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogQm9vbGVhbgogICAgICB9KV07CiAgICAgIF9kYXRhTmFtZV9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgcmVmbGVjdDogdHJ1ZQogICAgICB9KV07CiAgICAgIF9zZWFyY2hhYmxlX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEJvb2xlYW4KICAgICAgfSldOwogICAgICBfZGF0YUFjdGlvbnNfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogQXJyYXkKICAgICAgfSldOwogICAgICBfY29sdW1uc19kZWNvcmF0b3JzID0gW241KHsgYXR0cmlidXRlOiBmYWxzZSB9KV07CiAgICAgIF9yb3dLZXlfZGVjb3JhdG9ycyA9IFtuNSh7IGF0dHJpYnV0ZTogZmFsc2UgfSldOwogICAgICBfYXVnbWVudEZyb21EaXNwbGF5RnVuY3Rpb25fZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfZGlzcGxheUZ1bmN0aW9uX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIGF0dHJpYnV0ZTogZmFsc2UKICAgICAgfSldOwogICAgICBfcmV2ZXJzZURpc3BsYXlGdW5jdGlvbl9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICBhdHRyaWJ1dGU6IGZhbHNlCiAgICAgIH0pXTsKICAgICAgX3NlbGVjdGVkRGF0YVJvd19kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBPYmplY3QKICAgICAgfSldOwogICAgICBfZWRpdGFibGVGaWVsZHNfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogQXJyYXkKICAgICAgfSldOwogICAgICBfc2hvd1ZlcnRpY2FsTGluZXNfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICByZWZsZWN0OiB0cnVlLAogICAgICAgIGF0dHJpYnV0ZTogInNob3ctdmVydGljYWwtbGluZXMiCiAgICAgIH0pXTsKICAgICAgX3Nob3dIb3Jpem9udGFsTGluZXNfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICByZWZsZWN0OiB0cnVlLAogICAgICAgIGF0dHJpYnV0ZTogInNob3ctaG9yaXpvbnRhbC1saW5lcyIKICAgICAgfSldOwogICAgICBfc2hvd0dyaWRfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICByZWZsZWN0OiB0cnVlLAogICAgICAgIGF0dHJpYnV0ZTogInNob3ctZ3JpZCIKICAgICAgfSldOwogICAgICBfc29ydEtleV9kZWNvcmF0b3JzID0gW241KHsgYXR0cmlidXRlOiBmYWxzZSB9KV07CiAgICAgIF9zb3J0RGlyX2RlY29yYXRvcnMgPSBbbjUoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXTsKICAgICAgX2ZpbHRlclRleHRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9jb2x1bW5GaWx0ZXJzX2RlY29yYXRvcnMgPSBbbjUoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXTsKICAgICAgX3Nob3dDb2x1bW5GaWx0ZXJzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICJzaG93LWNvbHVtbi1maWx0ZXJzIiB9KV07CiAgICAgIF9zdGlja3lIZWFkZXJfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUsIGF0dHJpYnV0ZTogInN0aWNreS1oZWFkZXIiIH0pXTsKICAgICAgX3NlYXJjaE1vZGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9zZWxlY3Rpb25Nb2RlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfc2VsZWN0ZWRJZHNfZGVjb3JhdG9ycyA9IFtuNSh7IGF0dHJpYnV0ZTogZmFsc2UgfSldOwogICAgICBfX2VzRGVjb3JhdGUzOSh0aGlzLCBudWxsLCBfaGVhZGluZzFfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaGVhZGluZzEiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImhlYWRpbmcxIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmhlYWRpbmcxLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5oZWFkaW5nMSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9oZWFkaW5nMV9pbml0aWFsaXplcnMsIF9oZWFkaW5nMV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM5KHRoaXMsIG51bGwsIF9oZWFkaW5nMl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJoZWFkaW5nMiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaGVhZGluZzIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaGVhZGluZzIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmhlYWRpbmcyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2hlYWRpbmcyX2luaXRpYWxpemVycywgX2hlYWRpbmcyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzkodGhpcywgbnVsbCwgX2RhdGFfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZGF0YSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZGF0YSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5kYXRhLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kYXRhID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2RhdGFfaW5pdGlhbGl6ZXJzLCBfZGF0YV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM5KHRoaXMsIG51bGwsIF9rZXlfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAia2V5Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJrZXkiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoua2V5LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5rZXkgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfa2V5X2luaXRpYWxpemVycywgX2tleV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM5KHRoaXMsIG51bGwsIF9sYWJlbF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsYWJlbCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibGFiZWwiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubGFiZWwsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxhYmVsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xhYmVsX2luaXRpYWxpemVycywgX2xhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzkodGhpcywgbnVsbCwgX2Rpc2FibGVkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImRpc2FibGVkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkaXNhYmxlZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5kaXNhYmxlZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZGlzYWJsZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZGlzYWJsZWRfaW5pdGlhbGl6ZXJzLCBfZGlzYWJsZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzOSh0aGlzLCBudWxsLCBfcmVxdWlyZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicmVxdWlyZWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInJlcXVpcmVkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJlcXVpcmVkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yZXF1aXJlZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9yZXF1aXJlZF9pbml0aWFsaXplcnMsIF9yZXF1aXJlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM5KHRoaXMsIG51bGwsIF9kYXRhTmFtZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkYXRhTmFtZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZGF0YU5hbWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZGF0YU5hbWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmRhdGFOYW1lID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2RhdGFOYW1lX2luaXRpYWxpemVycywgX2RhdGFOYW1lX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzkodGhpcywgbnVsbCwgX3NlYXJjaGFibGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VhcmNoYWJsZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VhcmNoYWJsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWFyY2hhYmxlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWFyY2hhYmxlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlYXJjaGFibGVfaW5pdGlhbGl6ZXJzLCBfc2VhcmNoYWJsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM5KHRoaXMsIG51bGwsIF9kYXRhQWN0aW9uc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkYXRhQWN0aW9ucyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZGF0YUFjdGlvbnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZGF0YUFjdGlvbnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmRhdGFBY3Rpb25zID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2RhdGFBY3Rpb25zX2luaXRpYWxpemVycywgX2RhdGFBY3Rpb25zX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzkodGhpcywgbnVsbCwgX2NvbHVtbnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29sdW1ucyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29sdW1ucyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jb2x1bW5zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jb2x1bW5zID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbHVtbnNfaW5pdGlhbGl6ZXJzLCBfY29sdW1uc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM5KHRoaXMsIG51bGwsIF9yb3dLZXlfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicm93S2V5Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJyb3dLZXkiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucm93S2V5LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yb3dLZXkgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcm93S2V5X2luaXRpYWxpemVycywgX3Jvd0tleV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM5KHRoaXMsIG51bGwsIF9hdWdtZW50RnJvbURpc3BsYXlGdW5jdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhdWdtZW50RnJvbURpc3BsYXlGdW5jdGlvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYXVnbWVudEZyb21EaXNwbGF5RnVuY3Rpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYXVnbWVudEZyb21EaXNwbGF5RnVuY3Rpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmF1Z21lbnRGcm9tRGlzcGxheUZ1bmN0aW9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2F1Z21lbnRGcm9tRGlzcGxheUZ1bmN0aW9uX2luaXRpYWxpemVycywgX2F1Z21lbnRGcm9tRGlzcGxheUZ1bmN0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzkodGhpcywgbnVsbCwgX2Rpc3BsYXlGdW5jdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkaXNwbGF5RnVuY3Rpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRpc3BsYXlGdW5jdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5kaXNwbGF5RnVuY3Rpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmRpc3BsYXlGdW5jdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kaXNwbGF5RnVuY3Rpb25faW5pdGlhbGl6ZXJzLCBfZGlzcGxheUZ1bmN0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzkodGhpcywgbnVsbCwgX3JldmVyc2VEaXNwbGF5RnVuY3Rpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicmV2ZXJzZURpc3BsYXlGdW5jdGlvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicmV2ZXJzZURpc3BsYXlGdW5jdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5yZXZlcnNlRGlzcGxheUZ1bmN0aW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yZXZlcnNlRGlzcGxheUZ1bmN0aW9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3JldmVyc2VEaXNwbGF5RnVuY3Rpb25faW5pdGlhbGl6ZXJzLCBfcmV2ZXJzZURpc3BsYXlGdW5jdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM5KHRoaXMsIG51bGwsIF9zZWxlY3RlZERhdGFSb3dfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0ZWREYXRhUm93Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3RlZERhdGFSb3ciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0ZWREYXRhUm93LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3RlZERhdGFSb3cgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0ZWREYXRhUm93X2luaXRpYWxpemVycywgX3NlbGVjdGVkRGF0YVJvd19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM5KHRoaXMsIG51bGwsIF9lZGl0YWJsZUZpZWxkc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJlZGl0YWJsZUZpZWxkcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZWRpdGFibGVGaWVsZHMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZWRpdGFibGVGaWVsZHMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmVkaXRhYmxlRmllbGRzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2VkaXRhYmxlRmllbGRzX2luaXRpYWxpemVycywgX2VkaXRhYmxlRmllbGRzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzkodGhpcywgbnVsbCwgX3Nob3dWZXJ0aWNhbExpbmVzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dWZXJ0aWNhbExpbmVzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93VmVydGljYWxMaW5lcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93VmVydGljYWxMaW5lcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd1ZlcnRpY2FsTGluZXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd1ZlcnRpY2FsTGluZXNfaW5pdGlhbGl6ZXJzLCBfc2hvd1ZlcnRpY2FsTGluZXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzOSh0aGlzLCBudWxsLCBfc2hvd0hvcml6b250YWxMaW5lc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93SG9yaXpvbnRhbExpbmVzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93SG9yaXpvbnRhbExpbmVzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dIb3Jpem9udGFsTGluZXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dIb3Jpem9udGFsTGluZXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd0hvcml6b250YWxMaW5lc19pbml0aWFsaXplcnMsIF9zaG93SG9yaXpvbnRhbExpbmVzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzkodGhpcywgbnVsbCwgX3Nob3dHcmlkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dHcmlkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93R3JpZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93R3JpZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd0dyaWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd0dyaWRfaW5pdGlhbGl6ZXJzLCBfc2hvd0dyaWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzOSh0aGlzLCBudWxsLCBfc29ydEtleV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzb3J0S2V5Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzb3J0S2V5IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNvcnRLZXksIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNvcnRLZXkgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc29ydEtleV9pbml0aWFsaXplcnMsIF9zb3J0S2V5X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzkodGhpcywgbnVsbCwgX3NvcnREaXJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic29ydERpciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic29ydERpciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zb3J0RGlyLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zb3J0RGlyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NvcnREaXJfaW5pdGlhbGl6ZXJzLCBfc29ydERpcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM5KHRoaXMsIG51bGwsIF9maWx0ZXJUZXh0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImZpbHRlclRleHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZpbHRlclRleHQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZmlsdGVyVGV4dCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZmlsdGVyVGV4dCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9maWx0ZXJUZXh0X2luaXRpYWxpemVycywgX2ZpbHRlclRleHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzOSh0aGlzLCBudWxsLCBfY29sdW1uRmlsdGVyc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb2x1bW5GaWx0ZXJzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb2x1bW5GaWx0ZXJzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNvbHVtbkZpbHRlcnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvbHVtbkZpbHRlcnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29sdW1uRmlsdGVyc19pbml0aWFsaXplcnMsIF9jb2x1bW5GaWx0ZXJzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzkodGhpcywgbnVsbCwgX3Nob3dDb2x1bW5GaWx0ZXJzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dDb2x1bW5GaWx0ZXJzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93Q29sdW1uRmlsdGVycyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93Q29sdW1uRmlsdGVycywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd0NvbHVtbkZpbHRlcnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd0NvbHVtbkZpbHRlcnNfaW5pdGlhbGl6ZXJzLCBfc2hvd0NvbHVtbkZpbHRlcnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzOSh0aGlzLCBudWxsLCBfc3RpY2t5SGVhZGVyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInN0aWNreUhlYWRlciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic3RpY2t5SGVhZGVyIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnN0aWNreUhlYWRlciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc3RpY2t5SGVhZGVyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3N0aWNreUhlYWRlcl9pbml0aWFsaXplcnMsIF9zdGlja3lIZWFkZXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGUzOSh0aGlzLCBudWxsLCBfc2VhcmNoTW9kZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWFyY2hNb2RlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWFyY2hNb2RlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlYXJjaE1vZGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlYXJjaE1vZGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VhcmNoTW9kZV9pbml0aWFsaXplcnMsIF9zZWFyY2hNb2RlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzkodGhpcywgbnVsbCwgX3NlbGVjdGlvbk1vZGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0aW9uTW9kZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0aW9uTW9kZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWxlY3Rpb25Nb2RlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3Rpb25Nb2RlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGlvbk1vZGVfaW5pdGlhbGl6ZXJzLCBfc2VsZWN0aW9uTW9kZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTM5KHRoaXMsIG51bGwsIF9zZWxlY3RlZElkc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWxlY3RlZElkcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0ZWRJZHMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0ZWRJZHMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlbGVjdGVkSWRzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGVkSWRzX2luaXRpYWxpemVycywgX3NlbGVjdGVkSWRzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlMzkobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzVGFibGUyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMyODsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJEYXRhIFZpZXciXTsKICAgICNoZWFkaW5nMV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfaGVhZGluZzFfaW5pdGlhbGl6ZXJzLCAiaGVhZGluZyAxIik7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IGhlYWRpbmcxKCkgewogICAgICByZXR1cm4gdGhpcy4jaGVhZGluZzFfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBoZWFkaW5nMSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaGVhZGluZzFfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNoZWFkaW5nMl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX2hlYWRpbmcxX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfaGVhZGluZzJfaW5pdGlhbGl6ZXJzLCAiaGVhZGluZyAyIikpOwogICAgZ2V0IGhlYWRpbmcyKCkgewogICAgICByZXR1cm4gdGhpcy4jaGVhZGluZzJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBoZWFkaW5nMih2YWx1ZTIpIHsKICAgICAgdGhpcy4jaGVhZGluZzJfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNkYXRhX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfaGVhZGluZzJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9kYXRhX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBkYXRhKCkgewogICAgICByZXR1cm4gdGhpcy4jZGF0YV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGRhdGEodmFsdWUyKSB7CiAgICAgIHRoaXMuI2RhdGFfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNrZXlfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9kYXRhX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfa2V5X2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICAvLyBkZWVzLWZvcm0gY29tcGF0aWJpbGl0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZ2V0IGtleSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2tleV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGtleSh2YWx1ZTIpIHsKICAgICAgdGhpcy4ja2V5X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbGFiZWxfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9rZXlfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9sYWJlbF9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgZ2V0IGxhYmVsKCkgewogICAgICByZXR1cm4gdGhpcy4jbGFiZWxfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsYWJlbCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbGFiZWxfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNkaXNhYmxlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX2xhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfZGlzYWJsZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGRpc2FibGVkKCkgewogICAgICByZXR1cm4gdGhpcy4jZGlzYWJsZWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkaXNhYmxlZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZGlzYWJsZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNyZXF1aXJlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX2Rpc2FibGVkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfcmVxdWlyZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHJlcXVpcmVkKCkgewogICAgICByZXR1cm4gdGhpcy4jcmVxdWlyZWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCByZXF1aXJlZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcmVxdWlyZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGdldCB2YWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKICAgIH0KICAgIHNldCB2YWx1ZShfdmFsdWVBcmcpIHsKICAgIH0KICAgIGNoYW5nZVN1YmplY3QgPSAoX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfcmVxdWlyZWRfZXh0cmFJbml0aWFsaXplcnMpLCBuZXcgZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzLnNtYXJ0cngucnhqcy5TdWJqZWN0KCkpOwogICAgI2RhdGFOYW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9kYXRhTmFtZV9pbml0aWFsaXplcnMsIHZvaWQgMCk7CiAgICAvLyBlbmQgZGVlcy1mb3JtIGNvbXBhdGliaWxpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8qKgogICAgICogV2hhdCBkb2VzIGEgcm93IG9mIGRhdGEgcmVwcmVzZW50PwogICAgICovCiAgICBnZXQgZGF0YU5hbWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNkYXRhTmFtZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGRhdGFOYW1lKHZhbHVlMikgewogICAgICB0aGlzLiNkYXRhTmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NlYXJjaGFibGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9kYXRhTmFtZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX3NlYXJjaGFibGVfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgc2VhcmNoYWJsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlYXJjaGFibGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWFyY2hhYmxlKHZhbHVlMikgewogICAgICB0aGlzLiNzZWFyY2hhYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZGF0YUFjdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9zZWFyY2hhYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfZGF0YUFjdGlvbnNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IGRhdGFBY3Rpb25zKCkgewogICAgICByZXR1cm4gdGhpcy4jZGF0YUFjdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkYXRhQWN0aW9ucyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZGF0YUFjdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjb2x1bW5zX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfZGF0YUFjdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9jb2x1bW5zX2luaXRpYWxpemVycywgW10pKTsKICAgIC8vIHNjaGVtYS1maXJzdCBjb2x1bW5zIEFQSQogICAgZ2V0IGNvbHVtbnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb2x1bW5zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29sdW1ucyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29sdW1uc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Jvd0tleV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX2NvbHVtbnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9yb3dLZXlfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIC8qKgogICAgICogU3RhYmxlIHJvdyBpZGVudGl0eSBmb3Igc2VsZWN0aW9uIGFuZCB1cGRhdGVzLiBJZiBwcm92aWRlZCBhcyBhIGZ1bmN0aW9uLAogICAgICogaXQgaXMgb25seSB1c2FibGUgYXMgYSBwcm9wZXJ0eSAobm90IHZpYSBhdHRyaWJ1dGUpLgogICAgICovCiAgICBnZXQgcm93S2V5KCkgewogICAgICByZXR1cm4gdGhpcy4jcm93S2V5X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcm93S2V5KHZhbHVlMikgewogICAgICB0aGlzLiNyb3dLZXlfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhdWdtZW50RnJvbURpc3BsYXlGdW5jdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX3Jvd0tleV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX2F1Z21lbnRGcm9tRGlzcGxheUZ1bmN0aW9uX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIC8qKgogICAgICogV2hlbiB0cnVlIGFuZCBjb2x1bW5zIGFyZSBwcm92aWRlZCwgbWVyZ2UgYW55IG1pc3NpbmcgY29sdW1ucyBkaXNjb3ZlcmVkCiAgICAgKiB2aWEgZGlzcGxheUZ1bmN0aW9uIGludG8gdGhlIGVmZmVjdGl2ZSBzY2hlbWEuCiAgICAgKi8KICAgIGdldCBhdWdtZW50RnJvbURpc3BsYXlGdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2F1Z21lbnRGcm9tRGlzcGxheUZ1bmN0aW9uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYXVnbWVudEZyb21EaXNwbGF5RnVuY3Rpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI2F1Z21lbnRGcm9tRGlzcGxheUZ1bmN0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZGlzcGxheUZ1bmN0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfYXVnbWVudEZyb21EaXNwbGF5RnVuY3Rpb25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9kaXNwbGF5RnVuY3Rpb25faW5pdGlhbGl6ZXJzLCAoaXRlbUFyZykgPT4gaXRlbUFyZykpOwogICAgZ2V0IGRpc3BsYXlGdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2Rpc3BsYXlGdW5jdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGRpc3BsYXlGdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jZGlzcGxheUZ1bmN0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcmV2ZXJzZURpc3BsYXlGdW5jdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX2Rpc3BsYXlGdW5jdGlvbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX3JldmVyc2VEaXNwbGF5RnVuY3Rpb25faW5pdGlhbGl6ZXJzLCAoaXRlbUFyZykgPT4gaXRlbUFyZykpOwogICAgZ2V0IHJldmVyc2VEaXNwbGF5RnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNyZXZlcnNlRGlzcGxheUZ1bmN0aW9uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcmV2ZXJzZURpc3BsYXlGdW5jdGlvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jcmV2ZXJzZURpc3BsYXlGdW5jdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NlbGVjdGVkRGF0YVJvd19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX3JldmVyc2VEaXNwbGF5RnVuY3Rpb25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9zZWxlY3RlZERhdGFSb3dfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBzZWxlY3RlZERhdGFSb3coKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZERhdGFSb3dfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3RlZERhdGFSb3codmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlbGVjdGVkRGF0YVJvd19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2VkaXRhYmxlRmllbGRzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfc2VsZWN0ZWREYXRhUm93X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfZWRpdGFibGVGaWVsZHNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IGVkaXRhYmxlRmllbGRzKCkgewogICAgICByZXR1cm4gdGhpcy4jZWRpdGFibGVGaWVsZHNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBlZGl0YWJsZUZpZWxkcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZWRpdGFibGVGaWVsZHNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93VmVydGljYWxMaW5lc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX2VkaXRhYmxlRmllbGRzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfc2hvd1ZlcnRpY2FsTGluZXNfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHNob3dWZXJ0aWNhbExpbmVzKCkgewogICAgICByZXR1cm4gdGhpcy4jc2hvd1ZlcnRpY2FsTGluZXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93VmVydGljYWxMaW5lcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2hvd1ZlcnRpY2FsTGluZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93SG9yaXpvbnRhbExpbmVzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfc2hvd1ZlcnRpY2FsTGluZXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9zaG93SG9yaXpvbnRhbExpbmVzX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBzaG93SG9yaXpvbnRhbExpbmVzKCkgewogICAgICByZXR1cm4gdGhpcy4jc2hvd0hvcml6b250YWxMaW5lc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dIb3Jpem9udGFsTGluZXModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dIb3Jpem9udGFsTGluZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93R3JpZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX3Nob3dIb3Jpem9udGFsTGluZXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9zaG93R3JpZF9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93R3JpZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dHcmlkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd0dyaWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dHcmlkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBmaWxlcyA9IChfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9zaG93R3JpZF9leHRyYUluaXRpYWxpemVycyksIFtdKTsKICAgIGZpbGVXZWFrTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7CiAgICBkYXRhQ2hhbmdlU3ViamVjdCA9IG5ldyBkb210b29sc19wbHVnaW5leHBvcnRzX2V4cG9ydHMuc21hcnRyeC5yeGpzLlN1YmplY3QoKTsKICAgICNzb3J0S2V5X2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9zb3J0S2V5X2luaXRpYWxpemVycywgdm9pZCAwKTsKICAgIC8vIHNpbXBsZSBjbGllbnQtc2lkZSBzb3J0aW5nIChQaGFzZSAxKQogICAgZ2V0IHNvcnRLZXkoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzb3J0S2V5X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc29ydEtleSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc29ydEtleV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NvcnREaXJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9zb3J0S2V5X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfc29ydERpcl9pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIGdldCBzb3J0RGlyKCkgewogICAgICByZXR1cm4gdGhpcy4jc29ydERpcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNvcnREaXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NvcnREaXJfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNmaWx0ZXJUZXh0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfc29ydERpcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX2ZpbHRlclRleHRfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgLy8gc2ltcGxlIGNsaWVudC1zaWRlIGZpbHRlcmluZyAoUGhhc2UgMSkKICAgIGdldCBmaWx0ZXJUZXh0KCkgewogICAgICByZXR1cm4gdGhpcy4jZmlsdGVyVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGZpbHRlclRleHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2ZpbHRlclRleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjb2x1bW5GaWx0ZXJzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfZmlsdGVyVGV4dF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX2NvbHVtbkZpbHRlcnNfaW5pdGlhbGl6ZXJzLCB7fSkpOwogICAgLy8gcGVyLWNvbHVtbiBxdWljayBmaWx0ZXJzCiAgICBnZXQgY29sdW1uRmlsdGVycygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvbHVtbkZpbHRlcnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjb2x1bW5GaWx0ZXJzKHZhbHVlMikgewogICAgICB0aGlzLiNjb2x1bW5GaWx0ZXJzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd0NvbHVtbkZpbHRlcnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9jb2x1bW5GaWx0ZXJzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfc2hvd0NvbHVtbkZpbHRlcnNfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHNob3dDb2x1bW5GaWx0ZXJzKCkgewogICAgICByZXR1cm4gdGhpcy4jc2hvd0NvbHVtbkZpbHRlcnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93Q29sdW1uRmlsdGVycyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2hvd0NvbHVtbkZpbHRlcnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzdGlja3lIZWFkZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9zaG93Q29sdW1uRmlsdGVyc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX3N0aWNreUhlYWRlcl9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgc3RpY2t5SGVhZGVyKCkgewogICAgICByZXR1cm4gdGhpcy4jc3RpY2t5SGVhZGVyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc3RpY2t5SGVhZGVyKHZhbHVlMikgewogICAgICB0aGlzLiNzdGlja3lIZWFkZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWFyY2hNb2RlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfc3RpY2t5SGVhZGVyX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfc2VhcmNoTW9kZV9pbml0aWFsaXplcnMsICJ0YWJsZSIpKTsKICAgIC8vIHNlYXJjaCByb3cgc3RhdGUKICAgIGdldCBzZWFyY2hNb2RlKCkgewogICAgICByZXR1cm4gdGhpcy4jc2VhcmNoTW9kZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNlYXJjaE1vZGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlYXJjaE1vZGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIF9fc2VhcmNoVGV4dFN1YiA9IF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX3NlYXJjaE1vZGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgX19zZWFyY2hNb2RlU3ViOwogICAgI3NlbGVjdGlvbk1vZGVfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX3NlbGVjdGlvbk1vZGVfaW5pdGlhbGl6ZXJzLCAibm9uZSIpOwogICAgLy8gc2VsZWN0aW9uIChQaGFzZSAxKQogICAgZ2V0IHNlbGVjdGlvbk1vZGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWxlY3Rpb25Nb2RlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0aW9uTW9kZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VsZWN0aW9uTW9kZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NlbGVjdGVkSWRzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0MCh0aGlzLCBfc2VsZWN0aW9uTW9kZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDAodGhpcywgX3NlbGVjdGVkSWRzX2luaXRpYWxpemVycywgLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSkpOwogICAgZ2V0IHNlbGVjdGVkSWRzKCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRJZHNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3RlZElkcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VsZWN0ZWRJZHNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIF9yb3dJZE1hcCA9IChfX3J1bkluaXRpYWxpemVyczQwKHRoaXMsIF9zZWxlY3RlZElkc19leHRyYUluaXRpYWxpemVycyksIC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpKTsKICAgIF9yb3dJZENvdW50ZXIgPSAwOwogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gdGFibGVTdHlsZXM7CiAgICByZW5kZXIoKSB7CiAgICAgIGNvbnN0IHVzaW5nQ29sdW1ucyA9IEFycmF5LmlzQXJyYXkodGhpcy5jb2x1bW5zKSAmJiB0aGlzLmNvbHVtbnMubGVuZ3RoID4gMDsKICAgICAgY29uc3QgZWZmZWN0aXZlQ29sdW1ucyA9IHVzaW5nQ29sdW1ucyA/IGNvbXB1dGVFZmZlY3RpdmVDb2x1bW5zKHRoaXMuY29sdW1ucywgdGhpcy5hdWdtZW50RnJvbURpc3BsYXlGdW5jdGlvbiwgdGhpcy5kaXNwbGF5RnVuY3Rpb24sIHRoaXMuZGF0YSkgOiBjb21wdXRlQ29sdW1uc0Zyb21EaXNwbGF5RnVuY3Rpb24odGhpcy5kaXNwbGF5RnVuY3Rpb24sIHRoaXMuZGF0YSk7CiAgICAgIGNvbnN0IGx1Y2VuZVByZWQgPSBjb21waWxlTHVjZW5lUHJlZGljYXRlKHRoaXMuZmlsdGVyVGV4dCwgdGhpcy5zZWFyY2hNb2RlID09PSAiZGF0YSIgPyAiZGF0YSIgOiAidGFibGUiLCBlZmZlY3RpdmVDb2x1bW5zKTsKICAgICAgY29uc3Qgdmlld0RhdGEgPSBnZXRWaWV3RGF0YSh0aGlzLmRhdGEsIGVmZmVjdGl2ZUNvbHVtbnMsIHRoaXMuc29ydEtleSwgdGhpcy5zb3J0RGlyLCB0aGlzLmZpbHRlclRleHQsIHRoaXMuY29sdW1uRmlsdGVycywgdGhpcy5zZWFyY2hNb2RlID09PSAiZGF0YSIgPyAiZGF0YSIgOiAidGFibGUiLCBsdWNlbmVQcmVkIHx8IHZvaWQgMCk7CiAgICAgIHRoaXMuX2xhc3RWaWV3RGF0YSA9IHZpZXdEYXRhOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9Im1haW5ib3giPgogICAgICAgIDwhLS0gdGhlIGhlYWRpbmcgcGFydCAtLT4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZ0NvbnRhaW5lciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmcgaGVhZGluZzEiPiR7dGhpcy5sYWJlbCB8fCB0aGlzLmhlYWRpbmcxfTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nIGhlYWRpbmcyIj4ke3RoaXMuaGVhZGluZzJ9PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlckFjdGlvbnMiPgogICAgICAgICAgICAke2RpcmVjdGl2ZXNfZXhwb3J0cy5yZXNvbHZlRXhlYyhhc3luYyAoKSA9PiB7CiAgICAgICAgY29uc3QgcmVzdWx0QXJyYXkgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiB0aGlzLmRhdGFBY3Rpb25zKSB7CiAgICAgICAgICBpZiAoIWFjdGlvbi50eXBlPy5pbmNsdWRlcygiaGVhZGVyIikpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgcmVzdWx0QXJyYXkucHVzaChiMmA8ZGl2CiAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImhlYWRlckFjdGlvbiIKICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB7CiAgICAgICAgICAgIGFjdGlvbi5hY3Rpb25GdW5jKHsKICAgICAgICAgICAgICBpdGVtOiB0aGlzLnNlbGVjdGVkRGF0YVJvdywKICAgICAgICAgICAgICB0YWJsZTogdGhpcwogICAgICAgICAgICB9KTsKICAgICAgICAgIH19CiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAke2FjdGlvbi5pY29uTmFtZSA/IGIyYDxkZWVzLWljb24gLmljb25TaXplPSR7MTR9IC5pY29uPSR7YWN0aW9uLmljb25OYW1lfT48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAke2FjdGlvbi5uYW1lfWAgOiBhY3Rpb24ubmFtZX0KICAgICAgICAgICAgICAgICAgPC9kaXY+YCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRBcnJheTsKICAgICAgfSl9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nU2VwYXJhdGlvbiI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VhcmNoR3JpZCBoaWRkZW4iPgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dAogICAgICAgICAgICAubGFiZWw9JHsibHVjZW5lIHN5bnRheCBzZWFyY2gifQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHtgCiAgICAgICAgICAgICAgWW91IGNhbiB1c2UgdGhlIGx1Y2VuZSBzeW50YXggdG8gc2VhcmNoIGZvciBkYXRhLCBlLmcuOgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIFxgXGBcYAogICAgICAgICAgICAgIG5hbWU6ICJqb2huIiBBTkQgYWdlOiAxOAogICAgICAgICAgICAgIFxgXGBcYAogICAgICAgICAgICAgIAogICAgICAgICAgICBgfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgPGRlZXMtaW5wdXQtbXVsdGl0b2dnbGUKICAgICAgICAgICAgLmxhYmVsPSR7InNlYXJjaCBtb2RlIn0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbInRhYmxlIiwgImRhdGEiLCAic2VydmVyIl19CiAgICAgICAgICAgIC5zZWxlY3RlZE9wdGlvbj0keyJ0YWJsZSJ9CiAgICAgICAgICAgIC5kZXNjcmlwdGlvbj0ke2AKICAgICAgICAgICAgICBUaGVyZSBhcmUgdGhyZWUgYmFzaWMgbW9kZXM6CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgKiB0YWJsZTogb25seSBzZWFyY2hlcyBkYXRhIGFscmVhZHkgaW4gdGhlIHRhYmxlCiAgICAgICAgICAgICAgKiBkYXRhOiBzZWFyY2hlcyBvcmlnaW5hbCBkYXRhLCBpZ25vcmluZyB0YWJsZSB0cmFuc2Zvcm1zCiAgICAgICAgICAgICAgKiBzZXJ2ZXI6IHNlYXJjaGVzIGRhdGEgb24gdGhlIHNlcnZlcgogICAgICAgICAgICAgIAogICAgICAgICAgICBgfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZT4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPCEtLSB0aGUgYWN0dWFsIHRhYmxlIC0tPgogICAgICAgIDxzdHlsZT48L3N0eWxlPgogICAgICAgICR7dGhpcy5kYXRhLmxlbmd0aCA+IDAgPyBiMmAKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZVNjcm9sbCI+CiAgICAgICAgICAgICAgPHRhYmxlPgogICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgJHt0aGlzLnNlbGVjdGlvbk1vZGUgIT09ICJub25lIiA/IGIyYAogICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0id2lkdGg6NDJweDsgdGV4dC1hbGlnbjpjZW50ZXI7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5zZWxlY3Rpb25Nb2RlID09PSAibXVsdGkiID8gYjJgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWU9JHt0aGlzLmFyZUFsbFZpc2libGVTZWxlY3RlZCgpfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5kZXRlcm1pbmF0ZT0ke3RoaXMuaXNWaXNpYmxlU2VsZWN0aW9uSW5kZXRlcm1pbmF0ZSgpfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbmV3VmFsdWU9JHsoZTExKSA9PiB7CiAgICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIHRoaXMuc2V0U2VsZWN0VmlzaWJsZShlMTEuZGV0YWlsID09PSB0cnVlKTsKICAgICAgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCA6IGIyYGB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgYCA6IGIyYGB9CiAgICAgICAgICAgICAgICAgICAgJHtlZmZlY3RpdmVDb2x1bW5zLmZpbHRlcigoYzExKSA9PiAhYzExLmhpZGRlbikubWFwKChjb2wpID0+IHsKICAgICAgICBjb25zdCBpc1NvcnRhYmxlID0gISFjb2wuc29ydGFibGU7CiAgICAgICAgY29uc3QgYXJpYVNvcnQgPSB0aGlzLmdldEFyaWFTb3J0KGNvbCk7CiAgICAgICAgcmV0dXJuIGIyYAogICAgICAgICAgICAgICAgICAgICAgICAgIDx0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT0iY29sdW1uaGVhZGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1zb3J0PSR7YXJpYVNvcnR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iJHtpc1NvcnRhYmxlID8gImN1cnNvcjogcG9pbnRlcjsiIDogIiJ9IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gaXNTb3J0YWJsZSA/IHRoaXMudG9nZ2xlU29ydChjb2wpIDogbnVsbH0KICAgICAgICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2NvbC5oZWFkZXIgPz8gY29sLmtleX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5yZW5kZXJTb3J0SW5kaWNhdG9yKGNvbCl9CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5gOwogICAgICB9KX0KICAgICAgICAgICAgICAgICAgICAkeygoKSA9PiB7CiAgICAgICAgaWYgKHRoaXMuZGF0YUFjdGlvbnMgJiYgdGhpcy5kYXRhQWN0aW9ucy5sZW5ndGggPiAwKSB7CiAgICAgICAgICByZXR1cm4gYjJgIDx0aCBjbGFzcz0iYWN0aW9uc0NvbCI+QWN0aW9uczwvdGg+IGA7CiAgICAgICAgfQogICAgICB9KSgpfQogICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAke3RoaXMuc2hvd0NvbHVtbkZpbHRlcnMgPyBiMmA8dHIgY2xhc3M9ImZpbHRlcnNSb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuc2VsZWN0aW9uTW9kZSAhPT0gIm5vbmUiID8gYjJgPHRoIHN0eWxlPSJ3aWR0aDo0MnB4OyI+PC90aD5gIDogYjJgYH0KICAgICAgICAgICAgICAgICAgICAgICAgJHtlZmZlY3RpdmVDb2x1bW5zLmZpbHRlcigoYzExKSA9PiAhYzExLmhpZGRlbikubWFwKChjb2wpID0+IHsKICAgICAgICBjb25zdCBrZXkyID0gU3RyaW5nKGNvbC5rZXkpOwogICAgICAgIGlmIChjb2wuZmlsdGVyYWJsZSA9PT0gZmFsc2UpCiAgICAgICAgICByZXR1cm4gYjJgPHRoPjwvdGg+YDsKICAgICAgICByZXR1cm4gYjJgPHRoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IkZpbHRlci4uLiIgLnZhbHVlPSR7dGhpcy5jb2x1bW5GaWx0ZXJzW2tleTJdIHx8ICIifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpbnB1dD0keyhlMTEpID0+IHRoaXMuc2V0Q29sdW1uRmlsdGVyKGtleTIsIGUxMS50YXJnZXQudmFsdWUpfSAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5gOwogICAgICB9KX0KICAgICAgICAgICAgICAgICAgICAgICAgJHsoKCkgPT4gewogICAgICAgIGlmICh0aGlzLmRhdGFBY3Rpb25zICYmIHRoaXMuZGF0YUFjdGlvbnMubGVuZ3RoID4gMCkgewogICAgICAgICAgcmV0dXJuIGIyYCA8dGg+PC90aD4gYDsKICAgICAgICB9CiAgICAgIH0pKCl9CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPmAgOiBiMmBgfQogICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgICAgJHt2aWV3RGF0YS5tYXAoKGl0ZW1BcmcsIHJvd0luZGV4KSA9PiB7CiAgICAgICAgY29uc3QgZ2V0VHIgPSAoZWxlbWVudEFyZykgPT4gewogICAgICAgICAgaWYgKGVsZW1lbnRBcmcudGFnTmFtZSA9PT0gIlRSIikgewogICAgICAgICAgICByZXR1cm4gZWxlbWVudEFyZzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBnZXRUcihlbGVtZW50QXJnLnBhcmVudEVsZW1lbnQpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGIyYAogICAgICAgICAgICAgICAgICAgICAgPHRyCiAgICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHsKICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRhUm93ID0gaXRlbUFyZzsKICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICJzaW5nbGUiKSB7CiAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChpdGVtQXJnKTsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZElkcy5jbGVhcigpOwogICAgICAgICAgICB0aGlzLnNlbGVjdGVkSWRzLmFkZChpZCk7CiAgICAgICAgICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpOwogICAgICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgICAgIH0KICAgICAgICB9fQogICAgICAgICAgICAgICAgICAgICAgICBAZHJhZ2VudGVyPSR7YXN5bmMgKGV2ZW50QXJnKSA9PiB7CiAgICAgICAgICBldmVudEFyZy5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgZXZlbnRBcmcuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICBjb25zdCByZWFsVGFyZ2V0ID0gZ2V0VHIoZXZlbnRBcmcudGFyZ2V0KTsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICByZWFsVGFyZ2V0LmNsYXNzTGlzdC5hZGQoImhhc0F0dGFjaG1lbnQiKTsKICAgICAgICAgIH0sIDApOwogICAgICAgIH19CiAgICAgICAgICAgICAgICAgICAgICAgIEBkcmFnbGVhdmU9JHthc3luYyAoZXZlbnRBcmcpID0+IHsKICAgICAgICAgIGV2ZW50QXJnLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBldmVudEFyZy5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgIGNvbnN0IHJlYWxUYXJnZXQgPSBnZXRUcihldmVudEFyZy50YXJnZXQpOwogICAgICAgICAgcmVhbFRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCJoYXNBdHRhY2htZW50Iik7CiAgICAgICAgfX0KICAgICAgICAgICAgICAgICAgICAgICAgQGRyYWdvdmVyPSR7YXN5bmMgKGV2ZW50QXJnKSA9PiB7CiAgICAgICAgICBldmVudEFyZy5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH19CiAgICAgICAgICAgICAgICAgICAgICAgIEBkcm9wPSR7YXN5bmMgKGV2ZW50QXJnKSA9PiB7CiAgICAgICAgICBldmVudEFyZy5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgY29uc3QgbmV3RmlsZXMgPSBbXTsKICAgICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBBcnJheS5mcm9tKGV2ZW50QXJnLmRhdGFUcmFuc2Zlci5maWxlcykpIHsKICAgICAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGUpOwogICAgICAgICAgICBuZXdGaWxlcy5wdXNoKGZpbGUpOwogICAgICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZmlsZVdlYWtNYXAuZ2V0KGl0ZW1BcmcpOwogICAgICAgICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICAgICAgdGhpcy5maWxlV2Vha01hcC5zZXQoaXRlbUFyZywgbmV3RmlsZXMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4ubmV3RmlsZXMpOwogICAgICAgICAgfQogICAgICAgIH19CiAgICAgICAgICAgICAgICAgICAgICAgIEBjb250ZXh0bWVudT0ke2FzeW5jIChldmVudEFyZykgPT4gewogICAgICAgICAgRGVlc0NvbnRleHRtZW51Lm9wZW5Db250ZXh0TWVudVdpdGhPcHRpb25zKGV2ZW50QXJnLCB0aGlzLmdldEFjdGlvbnNGb3JUeXBlKCJjb250ZXh0bWVudSIpLm1hcCgoYWN0aW9uKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1lbnVJdGVtID0gewogICAgICAgICAgICAgIG5hbWU6IGFjdGlvbi5uYW1lLAogICAgICAgICAgICAgIGljb25OYW1lOiBhY3Rpb24uaWNvbk5hbWUsCiAgICAgICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgICAgICBhd2FpdCBhY3Rpb24uYWN0aW9uRnVuYyh7CiAgICAgICAgICAgICAgICAgIGl0ZW06IGl0ZW1BcmcsCiAgICAgICAgICAgICAgICAgIHRhYmxlOiB0aGlzCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIG1lbnVJdGVtOwogICAgICAgICAgfSkpOwogICAgICAgIH19CiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSIke2l0ZW1BcmcgPT09IHRoaXMuc2VsZWN0ZWREYXRhUm93ID8gInNlbGVjdGVkIiA6ICIifSIKICAgICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLnNlbGVjdGlvbk1vZGUgIT09ICJub25lIiA/IGIyYDx0ZCBzdHlsZT0id2lkdGg6NDJweDsgdGV4dC1hbGlnbjpjZW50ZXI7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWU9JHt0aGlzLmlzUm93U2VsZWN0ZWQoaXRlbUFyZyl9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5ld1ZhbHVlPSR7KGUxMSkgPT4gewogICAgICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgdGhpcy5zZXRSb3dTZWxlY3RlZChpdGVtQXJnLCBlMTEuZGV0YWlsID09PSB0cnVlKTsKICAgICAgICB9fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5gIDogYjJgYH0KICAgICAgICAgICAgICAgICAgICAgICAgJHtlZmZlY3RpdmVDb2x1bW5zLmZpbHRlcigoYzExKSA9PiAhYzExLmhpZGRlbikubWFwKChjb2wsIGNvbEluZGV4KSA9PiB7CiAgICAgICAgICBjb25zdCB2YWx1ZTIgPSBnZXRDZWxsVmFsdWUoaXRlbUFyZywgY29sLCB0aGlzLmRpc3BsYXlGdW5jdGlvbik7CiAgICAgICAgICBjb25zdCBjb250ZW50MyA9IGNvbC5yZW5kZXJlciA/IGNvbC5yZW5kZXJlcih2YWx1ZTIsIGl0ZW1BcmcsIHsgcm93SW5kZXgsIGNvbEluZGV4LCBjb2x1bW46IGNvbCB9KSA6IHZhbHVlMjsKICAgICAgICAgIGNvbnN0IGVkaXRLZXkgPSBTdHJpbmcoY29sLmtleSk7CiAgICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBkYmxjbGljaz0keyhlMTEpID0+IHsKICAgICAgICAgICAgY29uc3QgZGJsQWN0aW9uID0gdGhpcy5kYXRhQWN0aW9ucy5maW5kKChhY3Rpb25BcmcpID0+IGFjdGlvbkFyZy50eXBlPy5pbmNsdWRlcygiZG91YmxlQ2xpY2siKSk7CiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRhYmxlRmllbGRzLmluY2x1ZGVzKGVkaXRLZXkpKSB7CiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDZWxsRWRpdGluZyhlMTEsIGl0ZW1BcmcsIGVkaXRLZXkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGRibEFjdGlvbikgewogICAgICAgICAgICAgIGRibEFjdGlvbi5hY3Rpb25GdW5jKHsgaXRlbTogaXRlbUFyZywgdGFibGU6IHRoaXMgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbm5lckNlbGxDb250YWluZXIiPiR7Y29udGVudDN9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgOwogICAgICAgIH0pfQogICAgICAgICAgICAgICAgICAgICAgICAkeygoKSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5kYXRhQWN0aW9ucyAmJiB0aGlzLmRhdGFBY3Rpb25zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIGIyYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImFjdGlvbnNDb2wiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbnNDb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLmdldEFjdGlvbnNGb3JUeXBlKCJpblJvdyIpLm1hcCgoYWN0aW9uQXJnKSA9PiBiMmAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iYWN0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gYWN0aW9uQXJnLmFjdGlvbkZ1bmMoewogICAgICAgICAgICAgIGl0ZW06IGl0ZW1BcmcsCiAgICAgICAgICAgICAgdGFibGU6IHRoaXMKICAgICAgICAgICAgfSl9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHthY3Rpb25BcmcuaWNvbk5hbWUgPyBiMmAgPGRlZXMtaWNvbiAuaWNvbj0ke2FjdGlvbkFyZy5pY29uTmFtZX0+PC9kZWVzLWljb24+IGAgOiBhY3Rpb25BcmcubmFtZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCl9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgOwogICAgICAgICAgfQogICAgICAgIH0pKCl9CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPmA7CiAgICAgIH0pfQogICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgIDogYjJgIDxkaXYgY2xhc3M9Im5vRGF0YVNldCI+Tm8gZGF0YSBzZXQhPC9kaXY+IGB9CiAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlU3RhdGlzdGljcyI+CiAgICAgICAgICAgICR7dGhpcy5kYXRhLmxlbmd0aH0gJHt0aGlzLmRhdGFOYW1lIHx8ICJkYXRhIHJvd3MifSAodG90YWwpIHwKICAgICAgICAgICAgJHt0aGlzLnNlbGVjdGVkRGF0YVJvdyA/IGAjICR7dGhpcy5kYXRhLmluZGV4T2YodGhpcy5zZWxlY3RlZERhdGFSb3cpICsgMX1gIDogYE5vYH0KICAgICAgICAgICAgc2VsZWN0ZWQKICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyQWN0aW9ucyI+CiAgICAgICAgICAgICR7ZGlyZWN0aXZlc19leHBvcnRzLnJlc29sdmVFeGVjKGFzeW5jICgpID0+IHsKICAgICAgICBjb25zdCByZXN1bHRBcnJheSA9IFtdOwogICAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIHRoaXMuZGF0YUFjdGlvbnMpIHsKICAgICAgICAgIGlmICghYWN0aW9uLnR5cGU/LmluY2x1ZGVzKCJmb290ZXIiKSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICByZXN1bHRBcnJheS5wdXNoKGIyYDxkaXYKICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZm9vdGVyQWN0aW9uIgogICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHsKICAgICAgICAgICAgYWN0aW9uLmFjdGlvbkZ1bmMoewogICAgICAgICAgICAgIGl0ZW06IHRoaXMuc2VsZWN0ZWREYXRhUm93LAogICAgICAgICAgICAgIHRhYmxlOiB0aGlzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfX0KICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICR7YWN0aW9uLmljb25OYW1lID8gYjJgPGRlZXMtaWNvbiAuaWNvblNpemU9JHsxNH0gLmljb249JHthY3Rpb24uaWNvbk5hbWV9PjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgICAgICAgICAgICR7YWN0aW9uLm5hbWV9YCA6IGFjdGlvbi5uYW1lfQogICAgICAgICAgICAgICAgICA8L2Rpdj5gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdEFycmF5OwogICAgICB9KX0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoKSB7CiAgICB9CiAgICBhc3luYyB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICB0aGlzLmRldGVybWluZUNvbHVtbldpZHRocygpOwogICAgICBpZiAodGhpcy5zZWFyY2hhYmxlKSB7CiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmRhdGFBY3Rpb25zLmZpbmQoKGFjdGlvbkFyZykgPT4gYWN0aW9uQXJnLnR5cGU/LmluY2x1ZGVzKCJoZWFkZXIiKSAmJiBhY3Rpb25BcmcubmFtZSA9PT0gIlNlYXJjaCIpOwogICAgICAgIGlmICghZXhpc3RpbmcpIHsKICAgICAgICAgIHRoaXMuZGF0YUFjdGlvbnMudW5zaGlmdCh7CiAgICAgICAgICAgIG5hbWU6ICJTZWFyY2giLAogICAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpTZWFyY2giLAogICAgICAgICAgICB0eXBlOiBbImhlYWRlciJdLAogICAgICAgICAgICBhY3Rpb25GdW5jOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgICAgY29uc29sZS5sb2coIm9wZW4gc2VhcmNoIik7CiAgICAgICAgICAgICAgY29uc3Qgc2VhcmNoR3JpZCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuc2VhcmNoR3JpZCIpOwogICAgICAgICAgICAgIHNlYXJjaEdyaWQuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgY29uc29sZS5sb2codGhpcy5kYXRhQWN0aW9ucyk7CiAgICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgICB9CiAgICAgICAgOwogICAgICAgIHRoaXMud2lyZVNlYXJjaElucHV0cygpOwogICAgICB9CiAgICB9CiAgICBfX2RlYm91bmNlVGltZXI7CiAgICBkZWJvdW5jZVJ1bihmbiwgbXMgPSAyMDApIHsKICAgICAgaWYgKHRoaXMuX19kZWJvdW5jZVRpbWVyKQogICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9fZGVib3VuY2VUaW1lcik7CiAgICAgIHRoaXMuX19kZWJvdW5jZVRpbWVyID0gc2V0VGltZW91dChmbiwgbXMpOwogICAgfQogICAgd2lyZVNlYXJjaElucHV0cygpIHsKICAgICAgY29uc3Qgc2VhcmNoVGV4dEVsID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuc2VhcmNoR3JpZCBkZWVzLWlucHV0LXRleHQiKTsKICAgICAgY29uc3Qgc2VhcmNoTW9kZUVsID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuc2VhcmNoR3JpZCBkZWVzLWlucHV0LW11bHRpdG9nZ2xlIik7CiAgICAgIGlmIChzZWFyY2hUZXh0RWwgJiYgIXRoaXMuX19zZWFyY2hUZXh0U3ViKSB7CiAgICAgICAgdGhpcy5fX3NlYXJjaFRleHRTdWIgPSBzZWFyY2hUZXh0RWwuY2hhbmdlU3ViamVjdC5zdWJzY3JpYmUoKGVsKSA9PiB7CiAgICAgICAgICBjb25zdCB2YWwgPSBlbD8udmFsdWUgPz8gIiI7CiAgICAgICAgICB0aGlzLmRlYm91bmNlUnVuKCgpID0+IHsKICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoTW9kZSA9PT0gInNlcnZlciIpIHsKICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJzZWFyY2hSZXF1ZXN0IiwgewogICAgICAgICAgICAgICAgZGV0YWlsOiB7IHF1ZXJ5OiB2YWwsIG1vZGU6ICJzZXJ2ZXIiIH0sCiAgICAgICAgICAgICAgICBidWJibGVzOiB0cnVlCiAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuc2V0RmlsdGVyVGV4dCh2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBpZiAoc2VhcmNoTW9kZUVsICYmICF0aGlzLl9fc2VhcmNoTW9kZVN1YikgewogICAgICAgIHRoaXMuX19zZWFyY2hNb2RlU3ViID0gc2VhcmNoTW9kZUVsLmNoYW5nZVN1YmplY3Quc3Vic2NyaWJlKChlbCkgPT4gewogICAgICAgICAgY29uc3QgbW9kZSA9IGVsPy5zZWxlY3RlZE9wdGlvbiB8fCBlbD8udmFsdWUgfHwgInRhYmxlIjsKICAgICAgICAgIGlmIChtb2RlID09PSAidGFibGUiIHx8IG1vZGUgPT09ICJkYXRhIiB8fCBtb2RlID09PSAic2VydmVyIikgewogICAgICAgICAgICB0aGlzLnNlYXJjaE1vZGUgPSBtb2RlOwogICAgICAgICAgICBjb25zdCB2YWwgPSBzZWFyY2hUZXh0RWw/LnZhbHVlID8/ICIiOwogICAgICAgICAgICB0aGlzLmRlYm91bmNlUnVuKCgpID0+IHsKICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hNb2RlID09PSAic2VydmVyIikgewogICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgic2VhcmNoUmVxdWVzdCIsIHsgZGV0YWlsOiB7IHF1ZXJ5OiB2YWwsIG1vZGU6ICJzZXJ2ZXIiIH0sIGJ1YmJsZXM6IHRydWUgfSkpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLnNldEZpbHRlclRleHQodmFsKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICBhc3luYyBkZXRlcm1pbmVDb2x1bW5XaWR0aHMoKSB7CiAgICAgIGNvbnN0IGRvbXRvb2xzID0gYXdhaXQgdGhpcy5kb210b29sc1Byb21pc2U7CiAgICAgIGF3YWl0IGRvbXRvb2xzLmNvbnZlbmllbmNlLnNtYXJ0ZGVsYXkuZGVsYXlGb3IoMCk7CiAgICAgIGNvbnN0IHRhYmxlMiA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCJ0YWJsZSIpOwogICAgICBpZiAoIXRhYmxlMikKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGNlbGxzMiA9IHRhYmxlMi5yb3dzWzBdLmNlbGxzOwogICAgICBjb25zdCBoYW5kbGVDb2x1bW5CeUluZGV4ID0gYXN5bmMgKGkxMSwgd2FpdEZvclJlbmRlckFyZyA9IGZhbHNlKSA9PiB7CiAgICAgICAgY29uc3QgZG9uZSA9IGRpc3RfdHNfZXhwb3J0cy5kZWZlcigpOwogICAgICAgIGNvbnN0IGNlbGwyID0gY2VsbHMyW2kxMV07CiAgICAgICAgY29uc3Qgd2lkdGggPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsMikud2lkdGg7CiAgICAgICAgaWYgKGNlbGwyLnRleHRDb250ZW50LmluY2x1ZGVzKCJBY3Rpb25zIikpIHsKICAgICAgICAgIGNvbnN0IG5lZWRlZFdpZHRoID0gdGhpcy5kYXRhQWN0aW9ucy5maWx0ZXIoKGFjdGlvbkFyZykgPT4gYWN0aW9uQXJnLnR5cGU/LmluY2x1ZGVzKCJpblJvdyIpKS5sZW5ndGggKiAzNjsKICAgICAgICAgIGNlbGwyLnN0eWxlLndpZHRoID0gYCR7TWF0aC5tYXgobmVlZGVkV2lkdGgsIDY4KX1weGA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNlbGwyLnN0eWxlLndpZHRoID0gd2lkdGg7CiAgICAgICAgfQogICAgICAgIGlmICh3YWl0Rm9yUmVuZGVyQXJnKSB7CiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgICAgICBkb25lLnJlc29sdmUoKTsKICAgICAgICAgIH0pOwogICAgICAgICAgYXdhaXQgZG9uZS5wcm9taXNlOwogICAgICAgIH0KICAgICAgfTsKICAgICAgaWYgKGNlbGxzMltjZWxsczIubGVuZ3RoIC0gMV0udGV4dENvbnRlbnQuaW5jbHVkZXMoIkFjdGlvbnMiKSkgewogICAgICAgIGF3YWl0IGhhbmRsZUNvbHVtbkJ5SW5kZXgoY2VsbHMyLmxlbmd0aCAtIDEsIHRydWUpOwogICAgICB9CiAgICAgIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IGNlbGxzMi5sZW5ndGg7IGkxMSsrKSB7CiAgICAgICAgaWYgKGNlbGxzMltpMTFdLnRleHRDb250ZW50LmluY2x1ZGVzKCJBY3Rpb25zIikpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBhd2FpdCBoYW5kbGVDb2x1bW5CeUluZGV4KGkxMSk7CiAgICAgIH0KICAgICAgdGFibGUyLnN0eWxlLnRhYmxlTGF5b3V0ID0gImZpeGVkIjsKICAgIH0KICAgIC8vIGNvbXB1dGUgaGVscGVycyBtb3ZlZCB0byAuL2RhdGEudHMKICAgIHRvZ2dsZVNvcnQoY29sKSB7CiAgICAgIGNvbnN0IGtleTIgPSBTdHJpbmcoY29sLmtleSk7CiAgICAgIGlmICh0aGlzLnNvcnRLZXkgIT09IGtleTIpIHsKICAgICAgICB0aGlzLnNvcnRLZXkgPSBrZXkyOwogICAgICAgIHRoaXMuc29ydERpciA9ICJhc2MiOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0aGlzLnNvcnREaXIgPT09ICJhc2MiKQogICAgICAgICAgdGhpcy5zb3J0RGlyID0gImRlc2MiOwogICAgICAgIGVsc2UgaWYgKHRoaXMuc29ydERpciA9PT0gImRlc2MiKSB7CiAgICAgICAgICB0aGlzLnNvcnREaXIgPSBudWxsOwogICAgICAgICAgdGhpcy5zb3J0S2V5ID0gdm9pZCAwOwogICAgICAgIH0gZWxzZQogICAgICAgICAgdGhpcy5zb3J0RGlyID0gImFzYyI7CiAgICAgIH0KICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgic29ydENoYW5nZSIsIHsKICAgICAgICBkZXRhaWw6IHsga2V5OiB0aGlzLnNvcnRLZXksIGRpcjogdGhpcy5zb3J0RGlyIH0sCiAgICAgICAgYnViYmxlczogdHJ1ZQogICAgICB9KSk7CiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgfQogICAgZ2V0QXJpYVNvcnQoY29sKSB7CiAgICAgIGlmIChTdHJpbmcoY29sLmtleSkgIT09IHRoaXMuc29ydEtleSB8fCAhdGhpcy5zb3J0RGlyKQogICAgICAgIHJldHVybiAibm9uZSI7CiAgICAgIHJldHVybiB0aGlzLnNvcnREaXIgPT09ICJhc2MiID8gImFzY2VuZGluZyIgOiAiZGVzY2VuZGluZyI7CiAgICB9CiAgICByZW5kZXJTb3J0SW5kaWNhdG9yKGNvbCkgewogICAgICBpZiAoU3RyaW5nKGNvbC5rZXkpICE9PSB0aGlzLnNvcnRLZXkgfHwgIXRoaXMuc29ydERpcikKICAgICAgICByZXR1cm4gYjJgYDsKICAgICAgcmV0dXJuIGIyYDxzcGFuIHN0eWxlPSJtYXJnaW4tbGVmdDo2cHg7IG9wYWNpdHk6MC43OyI+JHt0aGlzLnNvcnREaXIgPT09ICJhc2MiID8gIlx1MjVCMiIgOiAiXHUyNUJDIn08L3NwYW4+YDsKICAgIH0KICAgIC8vIGZpbHRlcmluZyBoZWxwZXJzCiAgICBzZXRGaWx0ZXJUZXh0KHZhbHVlMikgewogICAgICBjb25zdCBwcmV2ID0gdGhpcy5maWx0ZXJUZXh0OwogICAgICB0aGlzLmZpbHRlclRleHQgPSB2YWx1ZTIgPz8gIiI7CiAgICAgIGlmIChwcmV2ICE9PSB0aGlzLmZpbHRlclRleHQpIHsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJmaWx0ZXJDaGFuZ2UiLCB7CiAgICAgICAgICBkZXRhaWw6IHsgdGV4dDogdGhpcy5maWx0ZXJUZXh0LCBjb2x1bW5zOiB7IC4uLnRoaXMuY29sdW1uRmlsdGVycyB9IH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlCiAgICAgICAgfSkpOwogICAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgICB9CiAgICB9CiAgICBzZXRDb2x1bW5GaWx0ZXIoa2V5MiwgdmFsdWUyKSB7CiAgICAgIHRoaXMuY29sdW1uRmlsdGVycyA9IHsgLi4udGhpcy5jb2x1bW5GaWx0ZXJzLCBba2V5Ml06IHZhbHVlMiB9OwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJmaWx0ZXJDaGFuZ2UiLCB7CiAgICAgICAgZGV0YWlsOiB7IHRleHQ6IHRoaXMuZmlsdGVyVGV4dCwgY29sdW1uczogeyAuLi50aGlzLmNvbHVtbkZpbHRlcnMgfSB9LAogICAgICAgIGJ1YmJsZXM6IHRydWUKICAgICAgfSkpOwogICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgIH0KICAgIC8vIHNlbGVjdGlvbiBoZWxwZXJzCiAgICBnZXRSb3dJZChyb3cpIHsKICAgICAgaWYgKHRoaXMucm93S2V5KSB7CiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnJvd0tleSA9PT0gImZ1bmN0aW9uIikKICAgICAgICAgIHJldHVybiB0aGlzLnJvd0tleShyb3cpOwogICAgICAgIHJldHVybiBTdHJpbmcocm93W3RoaXMucm93S2V5XSk7CiAgICAgIH0KICAgICAgY29uc3Qga2V5MiA9IHJvdzsKICAgICAgaWYgKCF0aGlzLl9yb3dJZE1hcC5oYXMoa2V5MikpIHsKICAgICAgICB0aGlzLl9yb3dJZE1hcC5zZXQoa2V5MiwgU3RyaW5nKCsrdGhpcy5fcm93SWRDb3VudGVyKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuX3Jvd0lkTWFwLmdldChrZXkyKTsKICAgIH0KICAgIGlzUm93U2VsZWN0ZWQocm93KSB7CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSWRzLmhhcyh0aGlzLmdldFJvd0lkKHJvdykpOwogICAgfQogICAgdG9nZ2xlUm93U2VsZWN0ZWQocm93KSB7CiAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChyb3cpOwogICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAic2luZ2xlIikgewogICAgICAgIHRoaXMuc2VsZWN0ZWRJZHMuY2xlYXIoKTsKICAgICAgICB0aGlzLnNlbGVjdGVkSWRzLmFkZChpZCk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAibXVsdGkiKSB7CiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJZHMuaGFzKGlkKSkKICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJZHMuZGVsZXRlKGlkKTsKICAgICAgICBlbHNlCiAgICAgICAgICB0aGlzLnNlbGVjdGVkSWRzLmFkZChpZCk7CiAgICAgIH0KICAgICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7CiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgfQogICAgc2V0Um93U2VsZWN0ZWQocm93LCBjaGVja2VkKSB7CiAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChyb3cpOwogICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAic2luZ2xlIikgewogICAgICAgIHRoaXMuc2VsZWN0ZWRJZHMuY2xlYXIoKTsKICAgICAgICBpZiAoY2hlY2tlZCkKICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJZHMuYWRkKGlkKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICJtdWx0aSIpIHsKICAgICAgICBpZiAoY2hlY2tlZCkKICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJZHMuYWRkKGlkKTsKICAgICAgICBlbHNlCiAgICAgICAgICB0aGlzLnNlbGVjdGVkSWRzLmRlbGV0ZShpZCk7CiAgICAgIH0KICAgICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7CiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgfQogICAgYXJlQWxsVmlzaWJsZVNlbGVjdGVkKCkgewogICAgICBjb25zdCB2aWV3ID0gdGhpcy5fbGFzdFZpZXdEYXRhIHx8IFtdOwogICAgICBpZiAodmlldy5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICBmb3IgKGNvbnN0IHIxMSBvZiB2aWV3KSB7CiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkSWRzLmhhcyh0aGlzLmdldFJvd0lkKHIxMSkpKQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaXNWaXNpYmxlU2VsZWN0aW9uSW5kZXRlcm1pbmF0ZSgpIHsKICAgICAgY29uc3QgdmlldyA9IHRoaXMuX2xhc3RWaWV3RGF0YSB8fCBbXTsKICAgICAgaWYgKHZpZXcubGVuZ3RoID09PSAwKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgbGV0IGNvdW50MiA9IDA7CiAgICAgIGZvciAoY29uc3QgcjExIG9mIHZpZXcpIHsKICAgICAgICBpZiAodGhpcy5zZWxlY3RlZElkcy5oYXModGhpcy5nZXRSb3dJZChyMTEpKSkKICAgICAgICAgIGNvdW50MisrOwogICAgICB9CiAgICAgIHJldHVybiBjb3VudDIgPiAwICYmIGNvdW50MiA8IHZpZXcubGVuZ3RoOwogICAgfQogICAgc2V0U2VsZWN0VmlzaWJsZShjaGVja2VkKSB7CiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLl9sYXN0Vmlld0RhdGEgfHwgW107CiAgICAgIGlmIChjaGVja2VkKSB7CiAgICAgICAgZm9yIChjb25zdCByMTEgb2YgdmlldykKICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJZHMuYWRkKHRoaXMuZ2V0Um93SWQocjExKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChjb25zdCByMTEgb2YgdmlldykKICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJZHMuZGVsZXRlKHRoaXMuZ2V0Um93SWQocjExKSk7CiAgICAgIH0KICAgICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7CiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgfQogICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpIHsKICAgICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSBBcnJheS5mcm9tKHRoaXMuc2VsZWN0ZWRJZHMpOwogICAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLmRhdGEuZmlsdGVyKChyMTEpID0+IHRoaXMuc2VsZWN0ZWRJZHMuaGFzKHRoaXMuZ2V0Um93SWQocjExKSkpOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJzZWxlY3Rpb25DaGFuZ2UiLCB7CiAgICAgICAgZGV0YWlsOiB7IHNlbGVjdGVkSWRzLCBzZWxlY3RlZFJvd3MgfSwKICAgICAgICBidWJibGVzOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGdldEFjdGlvbnNGb3JUeXBlKHR5cGVBcmcpIHsKICAgICAgY29uc3QgYWN0aW9ucyA9IFtdOwogICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiB0aGlzLmRhdGFBY3Rpb25zKSB7CiAgICAgICAgaWYgKCFhY3Rpb24udHlwZT8uaW5jbHVkZXModHlwZUFyZykpCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBhY3Rpb25zLnB1c2goYWN0aW9uKTsKICAgICAgfQogICAgICByZXR1cm4gYWN0aW9uczsKICAgIH0KICAgIGFzeW5jIGhhbmRsZUNlbGxFZGl0aW5nKGV2ZW50LCBpdGVtQXJnLCBrZXkyKSB7CiAgICAgIGF3YWl0IHRoaXMuZG9tdG9vbHNQcm9taXNlOwogICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7CiAgICAgIGNvbnN0IG9yaWdpbmFsQ29sb3IgPSB0YXJnZXQuc3R5bGUuY29sb3I7CiAgICAgIHRhcmdldC5zdHlsZS5jb2xvciA9ICJ0cmFuc3BhcmVudCI7CiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkSXRlbSA9IHRoaXMuZGlzcGxheUZ1bmN0aW9uKGl0ZW1BcmcpOwogICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSB0cmFuc2Zvcm1lZEl0ZW1ba2V5Ml0gPz8gaXRlbUFyZ1trZXkyXSA/PyAiIjsKICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwogICAgICBpbnB1dC50eXBlID0gInRleHQiOwogICAgICBpbnB1dC52YWx1ZSA9IGluaXRpYWxWYWx1ZTsKICAgICAgY29uc3QgYmx1cklucHV0ID0gYXN5bmMgKGJsdXJBcmcgPSB0cnVlLCBzYXZlQXJnID0gZmFsc2UpID0+IHsKICAgICAgICBpZiAoYmx1ckFyZykgewogICAgICAgICAgaW5wdXQuYmx1cigpOwogICAgICAgIH0KICAgICAgICBpZiAoc2F2ZUFyZykgewogICAgICAgICAgaXRlbUFyZ1trZXkyXSA9IGlucHV0LnZhbHVlOwogICAgICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgICAgfQogICAgICAgIGlucHV0LnJlbW92ZSgpOwogICAgICAgIHRhcmdldC5zdHlsZS5jb2xvciA9IG9yaWdpbmFsQ29sb3I7CiAgICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7CiAgICAgIH07CiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLCAoKSA9PiB7CiAgICAgICAgYmx1cklucHV0KGZhbHNlLCBmYWxzZSk7CiAgICAgIH0pOwogICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgKGUxMSkgPT4gewogICAgICAgIGlmIChlMTEua2V5ID09PSAiRW50ZXIiKSB7CiAgICAgICAgICBibHVySW5wdXQodHJ1ZSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKGlucHV0KTsKICAgICAgaW5wdXQuZm9jdXMoKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNDAoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNUYWJsZTIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWZvcm0vZGVlcy1mb3JtL2RlZXMtZm9ybS5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkZW1vRnVuYzI5ID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgJHtpYAogICAgICAuZGVtby1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDI0cHg7CiAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICBtYXgtd2lkdGg6IDEyMDBweDsKICAgICAgICBtYXJnaW46IDAgYXV0bzsKICAgICAgfQogICAgICAKICAgICAgZGVlcy1wYW5lbCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgfQogICAgICAKICAgICAgZGVlcy1wYW5lbDpsYXN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICB9CiAgICAgIAogICAgICAuZm9ybS1vdXRwdXQgewogICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICAgIH0KICAgICAgCiAgICAgIC5zdGF0dXMtbWVzc2FnZSB7CiAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5zdGF0dXMtbWVzc2FnZS5zdWNjZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDE0Mi4xIDcwLjYlIDQ1LjMlIC8gMC4xKSIsICJoc2woMTQyLjEgNzAuNiUgNDUuMyUgLyAwLjIpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDE0Mi4xIDcwLjYlIDM1LjMlKSIsICJoc2woMTQyLjEgNzAuNiUgNjUuMyUpIil9OwogICAgICB9CiAgICAgIAogICAgICAuc3RhdHVzLW1lc3NhZ2UuZXJyb3IgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA3Mi4yJSA1MC42JSAvIDAuMSkiLCAiaHNsKDAgNzIuMiUgNTAuNiUgLyAwLjIpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzIuMiUgNDAuNiUpIiwgImhzbCgwIDcyLjIlIDYwLjYlKSIpfTsKICAgICAgfQogICAgYH0KICA8L3N0eWxlPgogIAogIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgZm9ybSA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1mb3JtIik7CiAgY29uc3Qgb3V0cHV0RGl2ID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIuZm9ybS1vdXRwdXQiKTsKICBpZiAoZm9ybSAmJiBvdXRwdXREaXYpIHsKICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcigiZm9ybURhdGEiLCBhc3luYyAoZXZlbnRBcmcpID0+IHsKICAgICAgY29uc3QgZGF0YSA9IGV2ZW50QXJnLmRldGFpbC5kYXRhOwogICAgICBjb25zb2xlLmxvZygiRm9ybSBzdWJtaXR0ZWQgd2l0aCBkYXRhOiIsIGRhdGEpOwogICAgICBmb3JtLnNldFN0YXR1cygicGVuZGluZyIsICJQcm9jZXNzaW5nIHlvdXIgcmVnaXN0cmF0aW9uLi4uIik7CiAgICAgIG91dHB1dERpdi5pbm5lckhUTUwgPSBgPHN0cm9uZz5TdWJtaXR0ZWQgRGF0YTo8L3N0cm9uZz4KJHtKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKX1gOwogICAgICBhd2FpdCBkaXN0X3RzX2V4cG9ydHMyOS5wbHVnaW5zLnNtYXJ0ZGVsYXkuZGVsYXlGb3IoMmUzKTsKICAgICAgZm9ybS5zZXRTdGF0dXMoInN1Y2Nlc3MiLCAiUmVnaXN0cmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhIik7CiAgICAgIGF3YWl0IGRpc3RfdHNfZXhwb3J0czI5LnBsdWdpbnMuc21hcnRkZWxheS5kZWxheUZvcigyZTMpOwogICAgICBmb3JtLnJlc2V0KCk7CiAgICAgIG91dHB1dERpdi5pbm5lckhUTUwgPSAiPGVtPkZvcm0gaGFzIGJlZW4gcmVzZXQ8L2VtPiI7CiAgICB9KTsKICAgIGNvbnN0IGlucHV0cyA9IGZvcm0ucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1pbnB1dC10ZXh0LCBkZWVzLWlucHV0LWRyb3Bkb3duLCBkZWVzLWlucHV0LWNoZWNrYm94Iik7CiAgICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHsKICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlU3ViamVjdCIsICgpID0+IHsKICAgICAgICBjb25zb2xlLmxvZygiRmllbGQgY2hhbmdlZDoiLCBpbnB1dC5nZXRBdHRyaWJ1dGUoImtleSIpKTsKICAgICAgfSk7CiAgICB9KTsKICB9Cn19PgogICAgICA8ZGVlcy1wYW5lbCAuaGVhZGluZz0iQ29tcGxldGUgRm9ybSBFeGFtcGxlIiAuZGVzY3JpcHRpb249IkEgY29tcHJlaGVuc2l2ZSBmb3JtIHdpdGggdmFyaW91cyBpbnB1dCB0eXBlcywgdmFsaWRhdGlvbiwgYW5kIGZvcm0gc3VibWlzc2lvbiBoYW5kbGluZyI+CiAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgCiAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9IAogICAgICAgICAgICBrZXk9ImZpcnN0TmFtZSIgCiAgICAgICAgICAgIGxhYmVsPSJGaXJzdCBOYW1lIgogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiWW91ciBnaXZlbiBuYW1lIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCAKICAgICAgICAgICAgLnJlcXVpcmVkPSR7dHJ1ZX0gCiAgICAgICAgICAgIGtleT0ibGFzdE5hbWUiIAogICAgICAgICAgICBsYWJlbD0iTGFzdCBOYW1lIgogICAgICAgICAgPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IAogICAgICAgICAgICAucmVxdWlyZWQ9JHt0cnVlfSAKICAgICAgICAgICAga2V5PSJlbWFpbCIgCiAgICAgICAgICAgIGxhYmVsPSJFbWFpbCBBZGRyZXNzIgogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiV2Ugd2lsbCB1c2UgdGhpcyB0byBjb250YWN0IHlvdSJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICAgIGtleT0iY291bnRyeSIKICAgICAgICAgICAgLmxhYmVsPSR7IkNvdW50cnkifQogICAgICAgICAgICAub3B0aW9ucz0ke1sKICB7IG9wdGlvbjogIlVuaXRlZCBTdGF0ZXMiLCBrZXk6ICJ1cyIgfSwKICB7IG9wdGlvbjogIkNhbmFkYSIsIGtleTogImNhIiB9LAogIHsgb3B0aW9uOiAiR2VybWFueSIsIGtleTogImRlIiB9LAogIHsgb3B0aW9uOiAiRnJhbmNlIiwga2V5OiAiZnIiIH0sCiAgeyBvcHRpb246ICJVbml0ZWQgS2luZ2RvbSIsIGtleTogInVrIiB9Cl19CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWRyb3Bkb3duPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0CiAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICAgIGtleT0icGFzc3dvcmQiCiAgICAgICAgICAgIGxhYmVsPSJQYXNzd29yZCIKICAgICAgICAgICAgaXNQYXNzd29yZEJvb2wKICAgICAgICAgICAgLmRlc2NyaXB0aW9uPSR7Ik1pbmltdW0gOCBjaGFyYWN0ZXJzIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3gKICAgICAgICAgICAgLnJlcXVpcmVkPSR7dHJ1ZX0KICAgICAgICAgICAga2V5PSJ0ZXJtcyIKICAgICAgICAgICAgbGFiZWw9IkkgYWdyZWUgdG8gdGhlIFRlcm1zIGFuZCBDb25kaXRpb25zIgogICAgICAgICAgPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtY2hlY2tib3gKICAgICAgICAgICAga2V5PSJuZXdzbGV0dGVyIgogICAgICAgICAgICBsYWJlbD0iU2VuZCBtZSBwcm9tb3Rpb25hbCBlbWFpbHMiCiAgICAgICAgICAgIC52YWx1ZT0ke3RydWV9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWNoZWNrYm94PgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdD5DcmVhdGUgQWNjb3VudDwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgICAKICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLW91dHB1dCI+CiAgICAgICAgICA8ZW0+U3VibWl0IHRoZSBmb3JtIHRvIHNlZSB0aGUgY29sbGVjdGVkIGRhdGEuLi48L2VtPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgICAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgZm9ybSA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1mb3JtIik7CiAgaWYgKGZvcm0pIHsKICAgIGNvbnNvbGUubG9nKCJIb3Jpem9udGFsIGZvcm0gbGF5b3V0IGFjdGl2ZSIpOwogICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCJmb3JtRGF0YSIsIChldmVudCkgPT4gewogICAgICBjb25zdCBmaWx0ZXJzID0gZXZlbnQuZGV0YWlsLmRhdGE7CiAgICAgIGNvbnNvbGUubG9nKCJGaWx0ZXIgYXBwbGllZDoiLCBmaWx0ZXJzKTsKICAgICAgY29uc3QgcmVzdWx0c0NvdW50ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwKSArIDE7CiAgICAgIGNvbnNvbGUubG9nKGBGb3VuZCAke3Jlc3VsdHNDb3VudH0gcmVzdWx0cyB3aXRoIGZpbHRlcnM6YCwgZmlsdGVycyk7CiAgICB9KTsKICAgIGNvbnN0IGlucHV0cyA9IGZvcm0ucXVlcnlTZWxlY3RvckFsbCgiW2tleV0iKTsKICAgIGlucHV0cy5mb3JFYWNoKChpbnB1dCkgPT4gewogICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VTdWJqZWN0IiwgYXN5bmMgKCkgPT4gewogICAgICAgIGNvbnN0IGZvcm1EYXRhID0gYXdhaXQgZm9ybS5jb2xsZWN0Rm9ybURhdGEoKTsKICAgICAgICBjb25zb2xlLmxvZygiTGl2ZSBmaWx0ZXIgdXBkYXRlOiIsIGZvcm1EYXRhKTsKICAgICAgfSk7CiAgICB9KTsKICB9Cn19PgogICAgICA8ZGVlcy1wYW5lbCAuaGVhZGluZz0iSG9yaXpvbnRhbCBGb3JtIExheW91dCIgLmRlc2NyaXB0aW9uPSJDb21wYWN0IGZvcm0gd2l0aCBpbnB1dHMgYXJyYW5nZWQgaG9yaXpvbnRhbGx5IC0gcGVyZmVjdCBmb3IgZmlsdGVycyBhbmQgcXVpY2sgZm9ybXMiPgogICAgICAgIDxkZWVzLWZvcm0gaG9yaXpvbnRhbC1sYXlvdXQ+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IAogICAgICAgICAgICBrZXk9InNlYXJjaCIgCiAgICAgICAgICAgIGxhYmVsPSJTZWFyY2giCiAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJFbnRlciBrZXl3b3Jkcy4uLiIKICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtZHJvcGRvd24KICAgICAgICAgICAga2V5PSJjYXRlZ29yeSIKICAgICAgICAgICAgLmxhYmVsPSR7IkNhdGVnb3J5In0KICAgICAgICAgICAgLmVuYWJsZVNlYXJjaD0ke2ZhbHNlfQogICAgICAgICAgICAub3B0aW9ucz0ke1sKICB7IG9wdGlvbjogIkFsbCIsIGtleTogImFsbCIgfSwKICB7IG9wdGlvbjogIlByb2R1Y3RzIiwga2V5OiAicHJvZHVjdHMiIH0sCiAgeyBvcHRpb246ICJTZXJ2aWNlcyIsIGtleTogInNlcnZpY2VzIiB9LAogIHsgb3B0aW9uOiAiU3VwcG9ydCIsIGtleTogInN1cHBvcnQiIH0KXX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtZHJvcGRvd24+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAgIGtleT0ic29ydCIKICAgICAgICAgICAgLmxhYmVsPSR7IlNvcnQgQnkifQogICAgICAgICAgICAuZW5hYmxlU2VhcmNoPSR7ZmFsc2V9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WwogIHsgb3B0aW9uOiAiTmV3ZXN0Iiwga2V5OiAibmV3ZXN0IiB9LAogIHsgb3B0aW9uOiAiUG9wdWxhciIsIGtleTogInBvcHVsYXIiIH0sCiAgeyBvcHRpb246ICJQcmljZTogTG93IHRvIEhpZ2giLCBrZXk6ICJwcmljZV9hc2MiIH0sCiAgeyBvcHRpb246ICJQcmljZTogSGlnaCB0byBMb3ciLCBrZXk6ICJwcmljZV9kZXNjIiB9Cl19CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWRyb3Bkb3duPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveAogICAgICAgICAgICBrZXk9ImluU3RvY2siCiAgICAgICAgICAgIGxhYmVsPSJJbiBTdG9jayBPbmx5IgogICAgICAgICAgICAudmFsdWU9JHt0cnVlfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgogICAgCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IGZvcm0gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoImRlZXMtZm9ybSIpOwogIGNvbnN0IHN0YXR1c0RpdiA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiI3N0YXR1cy1kaXNwbGF5Iik7CiAgaWYgKGZvcm0pIHsKICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcigiZm9ybURhdGEiLCBhc3luYyAoZXZlbnRBcmcpID0+IHsKICAgICAgY29uc3QgZGF0YSA9IGV2ZW50QXJnLmRldGFpbC5kYXRhOwogICAgICBjb25zb2xlLmxvZygiQWR2YW5jZWQgZm9ybSBkYXRhOiIsIGRhdGEpOwogICAgICBmb3JtLnNldFN0YXR1cygicGVuZGluZyIsICJWYWxpZGF0aW5nIHlvdXIgaW5mb3JtYXRpb24uLi4iKTsKICAgICAgYXdhaXQgZGlzdF90c19leHBvcnRzMjkucGx1Z2lucy5zbWFydGRlbGF5LmRlbGF5Rm9yKDE1MDApOwogICAgICBpZiAoZGF0YS5pYmFuICYmIGRhdGEuaWJhbi5sZW5ndGggPiAxNSkgewogICAgICAgIGZvcm0uc2V0U3RhdHVzKCJzdWNjZXNzIiwgIkFwcGxpY2F0aW9uIHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHkhIik7CiAgICAgICAgaWYgKHN0YXR1c0RpdikgewogICAgICAgICAgc3RhdHVzRGl2LmNsYXNzTmFtZSA9ICJzdGF0dXMtbWVzc2FnZSBzdWNjZXNzIjsKICAgICAgICAgIHN0YXR1c0Rpdi50ZXh0Q29udGVudCA9ICJcdTI3MTMgWW91ciBhcHBsaWNhdGlvbiBoYXMgYmVlbiBzdWJtaXR0ZWQuIFdlIHdpbGwgY29udGFjdCB5b3Ugc29vbi4iOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBmb3JtLnNldFN0YXR1cygiZXJyb3IiLCAiUGxlYXNlIGNoZWNrIHlvdXIgSUJBTiIpOwogICAgICAgIGlmIChzdGF0dXNEaXYpIHsKICAgICAgICAgIHN0YXR1c0Rpdi5jbGFzc05hbWUgPSAic3RhdHVzLW1lc3NhZ2UgZXJyb3IiOwogICAgICAgICAgc3RhdHVzRGl2LnRleHRDb250ZW50ID0gIlx1MjcxNyBJbnZhbGlkIElCQU4gZm9ybWF0LiBQbGVhc2UgY2hlY2sgYW5kIHRyeSBhZ2Fpbi4iOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zb2xlLmxvZygiRm9ybSBkYXRhIGxvZ2dlZDoiLCBkYXRhKTsKICAgIH0pOwogICAgY29uc3QgZmlsZVVwbG9hZCA9IGZvcm0ucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC1maWxldXBsb2FkIik7CiAgICBpZiAoZmlsZVVwbG9hZCkgewogICAgICBmaWxlVXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIChldmVudCkgPT4gewogICAgICAgIGNvbnN0IGZpbGVzID0gZXZlbnQuZGV0YWlsPy5maWxlcyB8fCBbXTsKICAgICAgICBjb25zb2xlLmxvZyhgJHtmaWxlcy5sZW5ndGh9IGZpbGUocykgc2VsZWN0ZWQgZm9yIHVwbG9hZGApOwogICAgICB9KTsKICAgIH0KICB9Cn19PgogICAgICA8ZGVlcy1wYW5lbCAuaGVhZGluZz0iQWR2YW5jZWQgRm9ybSBGZWF0dXJlcyIgLmRlc2NyaXB0aW9uPSJGb3JtIHdpdGggc3BlY2lhbGl6ZWQgaW5wdXQgdHlwZXMgYW5kIGNvbXBsZXggdmFsaWRhdGlvbiI+CiAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgIDxkZWVzLWlucHV0LWliYW4gCiAgICAgICAgICAgIGtleT0iaWJhbiIKICAgICAgICAgICAgbGFiZWw9IklCQU4iCiAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWliYW4+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LXBob25lCiAgICAgICAgICAgIGtleT0icGhvbmUiCiAgICAgICAgICAgIGxhYmVsPSJQaG9uZSBOdW1iZXIiCiAgICAgICAgICAgIC5yZXF1aXJlZD0ke3RydWV9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXBob25lPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZQogICAgICAgICAgICBrZXk9InByZWZlcmVuY2VzIgogICAgICAgICAgICAubGFiZWw9JHsiTm90aWZpY2F0aW9uIFByZWZlcmVuY2VzIn0KICAgICAgICAgICAgLm9wdGlvbnM9JHtbIkVtYWlsIiwgIlNNUyIsICJQdXNoIiwgIkluLUFwcCJdfQogICAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiRW1haWwifQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZT4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtbXVsdGlzZWxlY3QKICAgICAgICAgICAga2V5PSJpbnRlcmVzdHMiCiAgICAgICAgICAgIC5sYWJlbD0keyJBcmVhcyBvZiBJbnRlcmVzdCJ9CiAgICAgICAgICAgIC5vcHRpb25zPSR7WwogIHsgb3B0aW9uOiAiVGVjaG5vbG9neSIsIGtleTogInRlY2giIH0sCiAgeyBvcHRpb246ICJEZXNpZ24iLCBrZXk6ICJkZXNpZ24iIH0sCiAgeyBvcHRpb246ICJCdXNpbmVzcyIsIGtleTogImJ1c2luZXNzIiB9LAogIHsgb3B0aW9uOiAiTWFya2V0aW5nIiwga2V5OiAibWFya2V0aW5nIiB9LAogIHsgb3B0aW9uOiAiU2FsZXMiLCBrZXk6ICJzYWxlcyIgfQpdfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1tdWx0aXNlbGVjdD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtZmlsZXVwbG9hZAogICAgICAgICAgICBrZXk9ImRvY3VtZW50cyIKICAgICAgICAgICAgLmxhYmVsPSR7IlVwbG9hZCBEb2N1bWVudHMifQogICAgICAgICAgICAuZGVzY3JpcHRpb249JHsiUERGLCBET0MsIG9yIERPQ1ggZmlsZXMgdXAgdG8gMTBNQiJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LWZpbGV1cGxvYWQ+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWZvcm0tc3VibWl0PlN1Ym1pdCBBcHBsaWNhdGlvbjwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgICAKICAgICAgICA8ZGl2IGlkPSJzdGF0dXMtZGlzcGxheSI+PC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1mb3JtL2RlZXMtZm9ybS9kZWVzLWZvcm0uanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF9kaXN0X3RzMjkoKTsKdmFyIF9fZXNEZWNvcmF0ZTQwID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM0MSA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRk9STV9JTlBVVF9UWVBFUyA9IFsKICBEZWVzSW5wdXRDaGVja2JveCwKICBEZWVzSW5wdXRDb2RlLAogIERlZXNJbnB1dERhdGVwaWNrZXIsCiAgRGVlc0lucHV0RHJvcGRvd24sCiAgRGVlc0lucHV0RmlsZXVwbG9hZCwKICBEZWVzSW5wdXRJYmFuLAogIERlZXNJbnB1dE11bHRpdG9nZ2xlLAogIERlZXNJbnB1dFBob25lLAogIERlZXNJbnB1dFF1YW50aXR5U2VsZWN0b3IsCiAgRGVlc0lucHV0UmFkaW9ncm91cCwKICBEZWVzSW5wdXRUZXh0LAogIERlZXNJbnB1dFRvZ2dsZSwKICBEZWVzSW5wdXRUeXBlbGlzdCwKICBEZWVzSW5wdXRUYWdzLAogIERlZXNJbnB1dExpc3QsCiAgRGVlc0lucHV0V3lzaXd5ZywKICBEZWVzSW5wdXRSaWNodGV4dCwKICBEZWVzVGFibGUKXTsKdmFyIERlZXNGb3JtID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLWZvcm0iKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9ob3Jpem9udGFsTGF5b3V0X2RlY29yYXRvcnM7CiAgbGV0IF9ob3Jpem9udGFsTGF5b3V0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaG9yaXpvbnRhbExheW91dF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzRm9ybTIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9ob3Jpem9udGFsTGF5b3V0X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlLCBhdHRyaWJ1dGU6ICJob3Jpem9udGFsLWxheW91dCIgfSldOwogICAgICBfX2VzRGVjb3JhdGU0MCh0aGlzLCBudWxsLCBfaG9yaXpvbnRhbExheW91dF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJob3Jpem9udGFsTGF5b3V0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJob3Jpem9udGFsTGF5b3V0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmhvcml6b250YWxMYXlvdXQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmhvcml6b250YWxMYXlvdXQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaG9yaXpvbnRhbExheW91dF9pbml0aWFsaXplcnMsIF9ob3Jpem9udGFsTGF5b3V0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDAobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzRm9ybTIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzI5OwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkZvcm0iXTsKICAgIG5hbWUgPSAibXlmb3JtIjsKICAgIGNoYW5nZVN1YmplY3QgPSBuZXcgZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzLnNtYXJ0cngucnhqcy5TdWJqZWN0KCk7CiAgICByZWFkeURlZmVycmVkID0gZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzLnNtYXJ0cHJvbWlzZS5kZWZlcigpOwogICAgI2hvcml6b250YWxMYXlvdXRfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNDEodGhpcywgX2hvcml6b250YWxMYXlvdXRfaW5pdGlhbGl6ZXJzLCBmYWxzZSk7CiAgICAvKioKICAgICAqIENvbnRyb2xzIHRoZSBsYXlvdXQgbW9kZSBvZiBjaGlsZCBpbnB1dCBjb21wb25lbnRzCiAgICAgKiBXaGVuIHRydWUsIHNldHMgYWxsIGNoaWxkIGlucHV0cyB0byBob3Jpem9udGFsIGxheW91dAogICAgICovCiAgICBnZXQgaG9yaXpvbnRhbExheW91dCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2hvcml6b250YWxMYXlvdXRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBob3Jpem9udGFsTGF5b3V0KHZhbHVlMikgewogICAgICB0aGlzLiNob3Jpem9udGFsTGF5b3V0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogMTZweDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hvcml6b250YWwtbGF5b3V0XSkgewogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICAgIGdhcDogMTZweDsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8c2xvdD48L3Nsb3Q+CiAgICBgOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKCkgewogICAgICBjb25zdCBmb3JtQ2hpbGRyZW4gPSB0aGlzLmdldEZvcm1FbGVtZW50cygpOwogICAgICB0aGlzLnVwZGF0ZVJlcXVpcmVkU3RhdHVzKCk7CiAgICAgIHRoaXMudXBkYXRlQ2hpbGRyZW5MYXlvdXRNb2RlKCk7CiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZm9ybUNoaWxkcmVuKSB7CiAgICAgICAgY2hpbGQuY2hhbmdlU3ViamVjdC5zdWJzY3JpYmUoYXN5bmMgKCkgPT4gewogICAgICAgICAgY29uc3QgdmFsdWVPYmplY3QgPSBhd2FpdCB0aGlzLmNvbGxlY3RGb3JtRGF0YSgpOwogICAgICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodmFsdWVPYmplY3QpOwogICAgICAgICAgY29uc29sZS5sb2codmFsdWVPYmplY3QpOwogICAgICAgICAgdGhpcy51cGRhdGVSZXF1aXJlZFN0YXR1cygpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGF3YWl0IHRoaXMuYWRkQmVoYXZpb3VycygpOwogICAgICB0aGlzLnJlYWR5RGVmZXJyZWQucmVzb2x2ZSgpOwogICAgfQogICAgZ2V0Rm9ybUVsZW1lbnRzKCkgewogICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKS5maWx0ZXIoKGNoaWxkKSA9PiBGT1JNX0lOUFVUX1RZUEVTLmluY2x1ZGVzKGNoaWxkLmNvbnN0cnVjdG9yKSk7CiAgICB9CiAgICBnZXRTdWJtaXRCdXR0b24oKSB7CiAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pLmZpbmQoKGNoaWxkKSA9PiBjaGlsZCBpbnN0YW5jZW9mIERlZXNGb3JtU3VibWl0KTsKICAgIH0KICAgIGFzeW5jIHVwZGF0ZVJlcXVpcmVkU3RhdHVzKCkgewogICAgICBjb25zb2xlLmxvZygiY2hlY2tpbmcgdGhlIHJlcXVpcmVkIHN0YXR1cy4iKTsKICAgICAgbGV0IHJlcXVpcmVkT0sgPSB0cnVlOwogICAgICBmb3IgKGNvbnN0IGNoaWxkQXJnIG9mIHRoaXMuZ2V0Rm9ybUVsZW1lbnRzKCkpIHsKICAgICAgICBpZiAoY2hpbGRBcmcucmVxdWlyZWQgJiYgIWNoaWxkQXJnLnZhbHVlKSB7CiAgICAgICAgICByZXF1aXJlZE9LID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0aGlzLmdldFN1Ym1pdEJ1dHRvbigpKSB7CiAgICAgICAgdGhpcy5nZXRTdWJtaXRCdXR0b24oKS5kaXNhYmxlZCA9ICFyZXF1aXJlZE9LOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIGNvbGxlY3RzIHRoZSBmb3JtIGRhdGEKICAgICAqIEByZXR1cm5zCiAgICAgKi8KICAgIGFzeW5jIGNvbGxlY3RGb3JtRGF0YSgpIHsKICAgICAgY29uc3QgY2hpbGRyZW4yID0gdGhpcy5nZXRGb3JtRWxlbWVudHMoKTsKICAgICAgY29uc3QgdmFsdWVPYmplY3QgPSB7fTsKICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbjIpIHsKICAgICAgICBpZiAoIWNoaWxkLmtleSkgewogICAgICAgICAgY29uc29sZS5sb2coYGZvcm0gZWxlbWVudCB3aXRoIGxhYmVsICIke2NoaWxkLmxhYmVsfSIgaGFzIG5vIGtleS4gc2tpcHBpbmcuYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdmFsdWVPYmplY3RbY2hpbGQua2V5XSA9IGNoaWxkLnZhbHVlOwogICAgICB9CiAgICAgIHJldHVybiB2YWx1ZU9iamVjdDsKICAgIH0KICAgIGFzeW5jIGdhdGhlckFuZERpc3BhdGNoKCkgewogICAgICBjb25zdCB2YWx1ZU9iamVjdCA9IGF3YWl0IHRoaXMuY29sbGVjdEZvcm1EYXRhKCk7CiAgICAgIGNvbnN0IGZvcm1EYXRhRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoImZvcm1EYXRhIiwgewogICAgICAgIGRldGFpbDogewogICAgICAgICAgZGF0YTogdmFsdWVPYmplY3QKICAgICAgICB9LAogICAgICAgIGJ1YmJsZXM6IHRydWUKICAgICAgfSk7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChmb3JtRGF0YUV2ZW50KTsKICAgICAgY29uc29sZS5sb2coImRpc3BhdGNoZWQgZGF0YToiKTsKICAgICAgY29uc29sZS5sb2codmFsdWVPYmplY3QpOwogICAgfQogICAgc2V0U3RhdHVzKHZpc3VhbFN0YXRlQXJnLCB0ZXh0U3RhdGVBcmcpIHsKICAgICAgY29uc3QgaW5wdXRDaGlsZHJlbiA9IHRoaXMuZ2V0Rm9ybUVsZW1lbnRzKCk7CiAgICAgIGNvbnN0IHN1Ym1pdEJ1dHRvbiA9IHRoaXMuZ2V0U3VibWl0QnV0dG9uKCk7CiAgICAgIHN3aXRjaCAodmlzdWFsU3RhdGVBcmcpIHsKICAgICAgICBjYXNlICJub3JtYWwiOgogICAgICAgICAgc3VibWl0QnV0dG9uLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICBzdWJtaXRCdXR0b24uc3RhdHVzID0gIm5vcm1hbCI7CiAgICAgICAgICBmb3IgKGNvbnN0IGlucHV0Q2hpbGQgb2YgaW5wdXRDaGlsZHJlbikgewogICAgICAgICAgICBpbnB1dENoaWxkLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJwZW5kaW5nIjoKICAgICAgICAgIHN1Ym1pdEJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICBzdWJtaXRCdXR0b24uc3RhdHVzID0gInBlbmRpbmciOwogICAgICAgICAgZm9yIChjb25zdCBpbnB1dENoaWxkIG9mIGlucHV0Q2hpbGRyZW4pIHsKICAgICAgICAgICAgaW5wdXRDaGlsZC5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJzdWNjZXNzIjoKICAgICAgICAgIHN1Ym1pdEJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICBzdWJtaXRCdXR0b24uc3RhdHVzID0gInN1Y2Nlc3MiOwogICAgICAgICAgZm9yIChjb25zdCBpbnB1dENoaWxkIG9mIGlucHV0Q2hpbGRyZW4pIHsKICAgICAgICAgICAgaW5wdXRDaGlsZC5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJlcnJvciI6CiAgICAgICAgICBzdWJtaXRCdXR0b24uZGlzYWJsZWQgPSB0cnVlOwogICAgICAgICAgc3VibWl0QnV0dG9uLnN0YXR1cyA9ICJlcnJvciI7CiAgICAgICAgICBmb3IgKGNvbnN0IGlucHV0Q2hpbGQgb2YgaW5wdXRDaGlsZHJlbikgewogICAgICAgICAgICBpbnB1dENoaWxkLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHN1Ym1pdEJ1dHRvbi50ZXh0ID0gdGV4dFN0YXRlQXJnOwogICAgfQogICAgLyoqCiAgICAgKiByZXNldHMgdGhlIGZvcm0KICAgICAqLwogICAgcmVzZXQoKSB7CiAgICAgIGNvbnN0IGlucHV0Q2hpbGRyZW4gPSB0aGlzLmdldEZvcm1FbGVtZW50cygpOwogICAgICBjb25zdCBzdWJtaXRCdXR0b24gPSB0aGlzLmdldFN1Ym1pdEJ1dHRvbigpOwogICAgICBmb3IgKGNvbnN0IGlucHV0Q2hpbGQgb2YgaW5wdXRDaGlsZHJlbikgewogICAgICAgIGlucHV0Q2hpbGQudmFsdWUgPSBudWxsOwogICAgICB9CiAgICAgIHRoaXMuc2V0U3RhdHVzKCJub3JtYWwiLCAiU3VibWl0Iik7CiAgICB9CiAgICBhc3luYyBhZGRCZWhhdmlvdXJzKCkgewogICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCAoZXZlbnQpID0+IHsKICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7CiAgICAgICAgaWYgKCFGT1JNX0lOUFVUX1RZUEVTLmluY2x1ZGVzKHRhcmdldC5jb25zdHJ1Y3RvcikpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gIkVudGVyIikgewogICAgICAgICAgY29uc3QgY2hpbGRyZW4yID0gdGhpcy5nZXRGb3JtRWxlbWVudHMoKTsKICAgICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGNoaWxkcmVuMi5pbmRleE9mKHRhcmdldCk7CiAgICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgY2hpbGRyZW4yLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgY2hpbGRyZW4yW2N1cnJlbnRJbmRleCArIDFdLmZvY3VzKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0YXJnZXQuYmx1cigpOwogICAgICAgICAgICB0aGlzLmdldFN1Ym1pdEJ1dHRvbigpPy5mb2N1cygpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZXMgdGhlIGxheW91dCBtb2RlIG9mIGNoaWxkIGlucHV0IGNvbXBvbmVudHMgYmFzZWQgb24gZm9ybSdzIGhvcml6b250YWxMYXlvdXQgcHJvcGVydHkKICAgICAqLwogICAgdXBkYXRlQ2hpbGRyZW5MYXlvdXRNb2RlKCkgewogICAgICBjb25zdCBmb3JtQ2hpbGRyZW4gPSB0aGlzLmdldEZvcm1FbGVtZW50cygpOwogICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGZvcm1DaGlsZHJlbikgewogICAgICAgIGlmICgibGF5b3V0TW9kZSIgaW4gY2hpbGQpIHsKICAgICAgICAgIGNoaWxkLmxheW91dE1vZGUgPSAiYXV0byI7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENhbGxlZCB3aGVuIHByb3BlcnRpZXMgY2hhbmdlCiAgICAgKi8KICAgIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoImhvcml6b250YWxMYXlvdXQiKSkgewogICAgICAgIHRoaXMudXBkYXRlQ2hpbGRyZW5MYXlvdXRNb2RlKCk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczQxKHRoaXMsIF9ob3Jpem9udGFsTGF5b3V0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNDEoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNGb3JtMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtYnV0dG9uL2RlZXMtYnV0dG9uL2RlZXMtYnV0dG9uLmRlbW8uanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF9kZWVzX2ljb24oKTsKdmFyIGRlbW9GdW5jMzAgPSAoKSA9PiBiMmAKICA8c3R5bGU+CiAgICAke2lgCiAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogMjRweDsKICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgIG1heC13aWR0aDogMTIwMHB4OwogICAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgICB9CiAgICAgIAogICAgICBkZWVzLXBhbmVsIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICB9CiAgICAgIAogICAgICBkZWVzLXBhbmVsOmxhc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5idXR0b24tZ3JvdXAgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEycHg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CiAgICAgIAogICAgICAudmVydGljYWwtZ3JvdXAgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBtYXgtd2lkdGg6IDMwMHB4OwogICAgICB9CiAgICAgIAogICAgICAuaG9yaXpvbnRhbC1ncm91cCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTZweDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KICAgICAgCiAgICAgIC5kZW1vLW91dHB1dCB7CiAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSAxNi44JSkiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICB9CiAgICAgIAogICAgICAuaWNvbi1yb3cgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEycHg7CiAgICAgICAgbWFyZ2luOiA4cHggMDsKICAgICAgfQogICAgICAKICAgICAgLmNvZGUtc25pcHBldCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMjE1IDIwLjIlIDExLjglKSIpfTsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIG1hcmdpbjogNHB4IDA7CiAgICAgIH0KICAgIGB9CiAgPC9zdHlsZT4KICAKICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogIGNvbnN0IGJ1dHRvbnMgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3JBbGwoImRlZXMtYnV0dG9uIik7CiAgYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHsKICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGlja2VkIiwgKCkgPT4gewogICAgICBjb25zdCB0eXBlNSA9IGJ1dHRvbi5nZXRBdHRyaWJ1dGUoInR5cGUiKSB8fCAiZGVmYXVsdCI7CiAgICAgIGNvbnNvbGUubG9nKGBCdXR0b24gdmFyaWFudCBjbGlja2VkOiAke3R5cGU1fWApOwogICAgfSk7CiAgfSk7Cn19PgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiMS4gQnV0dG9uIFZhcmlhbnRzIn0gLnN1YnRpdGxlPSR7IkRpZmZlcmVudCB2aXN1YWwgc3R5bGVzIGZvciB2YXJpb3VzIHVzZSBjYXNlcyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbi1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iZGVmYXVsdCI+RGVmYXVsdDwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0ic2Vjb25kYXJ5Ij5TZWNvbmRhcnk8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9ImRlc3RydWN0aXZlIj5EZXN0cnVjdGl2ZTwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0ib3V0bGluZSI+T3V0bGluZTwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iZ2hvc3QiPkdob3N0PC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJsaW5rIj5MaW5rIEJ1dHRvbjwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICAgIAogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBidXR0b25zID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yQWxsKCJkZWVzLWJ1dHRvbiIpOwogIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7CiAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2tlZCIsICgpID0+IHsKICAgICAgY29uc3Qgc2l6ZSA9IGJ1dHRvbi5nZXRBdHRyaWJ1dGUoInNpemUiKSB8fCAiZGVmYXVsdCI7CiAgICAgIGNvbnNvbGUubG9nKGBCdXR0b24gc2l6ZTogJHtzaXplfWApOwogICAgfSk7CiAgfSk7Cn19PgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiMi4gQnV0dG9uIFNpemVzIn0gLnN1YnRpdGxlPSR7Ik11bHRpcGxlIHNpemVzIGZvciBkaWZmZXJlbnQgY29udGV4dHMgYW5kIHVzZSBjYXNlcyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbi1ncm91cCI+CiAgICAgICAgICA8ZGVlcy1idXR0b24gc2l6ZT0ic20iPlNtYWxsIEJ1dHRvbjwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gc2l6ZT0iZGVmYXVsdCI+RGVmYXVsdCBTaXplPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBzaXplPSJsZyI+TGFyZ2UgQnV0dG9uPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBzaXplPSJpY29uIiB0eXBlPSJvdXRsaW5lIiAudGV4dD0keyJcdXsxRjY4MH0ifT48L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbi1ncm91cCIgc3R5bGU9Im1hcmdpbi10b3A6IDE2cHg7Ij4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBzaXplPSJzbSIgdHlwZT0ic2Vjb25kYXJ5Ij5TbWFsbCBTZWNvbmRhcnk8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHNpemU9ImRlZmF1bHQiIHR5cGU9ImRlc3RydWN0aXZlIj5EZWZhdWx0IERlc3RydWN0aXZlPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBzaXplPSJsZyIgdHlwZT0ib3V0bGluZSI+TGFyZ2UgT3V0bGluZTwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICAgIAogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBpY29uQnV0dG9ucyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1idXR0b24iKTsKICBpY29uQnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHsKICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGlja2VkIiwgKCkgPT4gewogICAgICBjb25zdCBoYXNJY29uID0gYnV0dG9uLnF1ZXJ5U2VsZWN0b3IoImRlZXMtaWNvbiIpOwogICAgICBpZiAoaGFzSWNvbikgewogICAgICAgIGNvbnN0IGljb25OYW1lID0gaGFzSWNvbi5nZXRBdHRyaWJ1dGUoImljb25GQSIpIHx8ICJ1bmtub3duIjsKICAgICAgICBjb25zb2xlLmxvZyhgSWNvbiBidXR0b24gY2xpY2tlZDogJHtpY29uTmFtZX1gKTsKICAgICAgfQogICAgfSk7CiAgfSk7Cn19PgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiMy4gQnV0dG9ucyB3aXRoIEljb25zIn0gLnN1YnRpdGxlPSR7IkNvbWJpbmluZyBpY29ucyB3aXRoIHRleHQgZm9yIGVuaGFuY2VkIHZpc3VhbCBjb21tdW5pY2F0aW9uIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iaWNvbi1yb3ciPgogICAgICAgICAgPGRlZXMtYnV0dG9uPgogICAgICAgICAgICA8ZGVlcy1pY29uIGljb249ImZhOnBsdXMiPjwvZGVlcy1pY29uPgogICAgICAgICAgICBBZGQgSXRlbQogICAgICAgICAgPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJkZXN0cnVjdGl2ZSI+CiAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0iZmE6dHJhc2giPjwvZGVlcy1pY29uPgogICAgICAgICAgICBEZWxldGUKICAgICAgICAgIDwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0ib3V0bGluZSI+CiAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOkRvd25sb2FkIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgRG93bmxvYWQKICAgICAgICAgIDwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9Imljb24tcm93Ij4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJzZWNvbmRhcnkiIHNpemU9InNtIj4KICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJmYTpnZWFyIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgU2V0dGluZ3MKICAgICAgICAgIDwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iZ2hvc3QiPgogICAgICAgICAgICA8ZGVlcy1pY29uIGljb249ImZhOmNhcmV0TGVmdCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgIEJhY2sKICAgICAgICAgIDwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iZ2hvc3QiPgogICAgICAgICAgICBOZXh0CiAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0iZmE6Y2FyZXRSaWdodCI+PC9kZWVzLWljb24+CiAgICAgICAgICA8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJpY29uLXJvdyI+CiAgICAgICAgICA8ZGVlcy1idXR0b24gc2l6ZT0iaWNvbiIgdHlwZT0iZGVmYXVsdCI+CiAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0iZmE6cGx1cyI+PC9kZWVzLWljb24+CiAgICAgICAgICA8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHNpemU9Imljb24iIHR5cGU9InNlY29uZGFyeSI+CiAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0iZmE6Z2VhciI+PC9kZWVzLWljb24+CiAgICAgICAgICA8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHNpemU9Imljb24iIHR5cGU9Im91dGxpbmUiPgogICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpTZWFyY2giPjwvZGVlcy1pY29uPgogICAgICAgICAgPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBzaXplPSJpY29uIiB0eXBlPSJnaG9zdCI+CiAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOk1vcmVWZXJ0aWNhbCI+PC9kZWVzLWljb24+CiAgICAgICAgICA8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHNpemU9Imljb24iIHR5cGU9ImRlc3RydWN0aXZlIj4KICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJmYTp0cmFzaCI+PC9kZWVzLWljb24+CiAgICAgICAgICA8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CgogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBidXR0b25zID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yQWxsKCJkZWVzLWJ1dHRvbiIpOwogIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7CiAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2tlZCIsICgpID0+IHsKICAgICAgY29uc3QgaWNvbjMgPSBidXR0b24uZ2V0QXR0cmlidXRlKCJpY29uIikgfHwgIm5vbmUiOwogICAgICBjb25zdCBwb3NpdGlvbjMgPSBidXR0b24uZ2V0QXR0cmlidXRlKCJpY29uUG9zaXRpb24iKSB8fCAibGVmdCI7CiAgICAgIGNvbnNvbGUubG9nKGBJY29uIHByb3BlcnR5IGJ1dHRvbjogaWNvbj0ke2ljb24zfSwgcG9zaXRpb249JHtwb3NpdGlvbjN9YCk7CiAgICB9KTsKICB9KTsKfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI0LiBJY29ucyB2aWEgUHJvcGVydHkifSAuc3VidGl0bGU9JHsiU2ltcGxpZmllZCBpY29uIHN5bnRheCB1c2luZyB0aGUgaWNvbiBwcm9wZXJ0eSJ9PgogICAgICAgIDxkaXYgY2xhc3M9Imljb24tcm93Ij4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBpY29uPSJmYTpwbHVzIj5BZGQgSXRlbTwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iZGVzdHJ1Y3RpdmUiIGljb249ImZhOnRyYXNoIj5EZWxldGU8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9Im91dGxpbmUiIGljb249Imx1Y2lkZTpEb3dubG9hZCI+RG93bmxvYWQ8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJpY29uLXJvdyI+CiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0ic2Vjb25kYXJ5IiBzaXplPSJzbSIgaWNvbj0iZmE6Z2VhciI+U2V0dGluZ3M8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9Imdob3N0IiBpY29uPSJmYTpjYXJldExlZnQiPkJhY2s8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9Imdob3N0IiBpY29uPSJmYTpjYXJldFJpZ2h0IiBpY29uUG9zaXRpb249InJpZ2h0Ij5OZXh0PC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iaWNvbi1yb3ciPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHNpemU9Imljb24iIHR5cGU9ImRlZmF1bHQiIGljb249ImZhOnBsdXMiPjwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gc2l6ZT0iaWNvbiIgdHlwZT0ic2Vjb25kYXJ5IiBpY29uPSJsdWNpZGU6U2V0dGluZ3MiPjwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gc2l6ZT0iaWNvbiIgdHlwZT0ib3V0bGluZSIgaWNvbj0ibHVjaWRlOlNlYXJjaCI+PC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBzaXplPSJpY29uIiB0eXBlPSJnaG9zdCIgaWNvbj0ibHVjaWRlOk1vcmVWZXJ0aWNhbCI+PC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBzaXplPSJpY29uIiB0eXBlPSJkZXN0cnVjdGl2ZSIgaWNvbj0iZmE6dHJhc2giPjwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi10b3A6IDE2cHg7Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtc25pcHBldCI+CiAgICAgICAgICAgICZsdDtkZWVzLWJ1dHRvbiBpY29uPSJmYTpwbHVzIiZndDtBZGQgSXRlbSZsdDsvZGVlcy1idXR0b24mZ3Q7PGJyPgogICAgICAgICAgICAmbHQ7ZGVlcy1idXR0b24gaWNvbj0iZmE6Y2FyZXRSaWdodCIgaWNvblBvc2l0aW9uPSJyaWdodCImZ3Q7TmV4dCZsdDsvZGVlcy1idXR0b24mZ3Q7CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgoKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgcGVuZGluZ0J1dHRvbiA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcignZGVlcy1idXR0b25bc3RhdHVzPSJwZW5kaW5nIl0nKTsKICBjb25zdCBzdWNjZXNzQnV0dG9uID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCdkZWVzLWJ1dHRvbltzdGF0dXM9InN1Y2Nlc3MiXScpOwogIGNvbnN0IGVycm9yQnV0dG9uID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCdkZWVzLWJ1dHRvbltzdGF0dXM9ImVycm9yIl0nKTsKICBpZiAocGVuZGluZ0J1dHRvbikgewogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJQZW5kaW5nIGJ1dHRvbiBpcyBzaG93aW5nIGxvYWRpbmcgc3RhdGUiKTsKICAgIH0sIDFlMyk7CiAgfQogIGlmIChzdWNjZXNzQnV0dG9uKSB7CiAgICBzdWNjZXNzQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrZWQiLCAoKSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJTdWNjZXNzIHN0YXRlIGJ1dHRvbiBjbGlja2VkIik7CiAgICB9KTsKICB9CiAgaWYgKGVycm9yQnV0dG9uKSB7CiAgICBlcnJvckJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGlja2VkIiwgKCkgPT4gewogICAgICBjb25zb2xlLmxvZygiRXJyb3Igc3RhdGUgYnV0dG9uIGNsaWNrZWQiKTsKICAgIH0pOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI1LiBCdXR0b24gU3RhdGVzIn0gLnN1YnRpdGxlPSR7IkRpZmZlcmVudCBzdGF0ZXMgdG8gaW5kaWNhdGUgYnV0dG9uIHN0YXR1cyBhbmQgbG9hZGluZyBjb25kaXRpb25zIn0+CiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9uLWdyb3VwIj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBzdGF0dXM9Im5vcm1hbCI+Tm9ybWFsPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBzdGF0dXM9InBlbmRpbmciPlByb2Nlc3NpbmcuLi48L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHN0YXR1cz0ic3VjY2VzcyI+U3VjY2VzcyE8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHN0YXR1cz0iZXJyb3IiPkVycm9yITwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24gZGlzYWJsZWQ+RGlzYWJsZWQ8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbi1ncm91cCIgc3R5bGU9Im1hcmdpbi10b3A6IDE2cHg7Ij4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJzZWNvbmRhcnkiIHN0YXR1cz0icGVuZGluZyIgc2l6ZT0ic20iPlNtYWxsIExvYWRpbmc8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9Im91dGxpbmUiIHN0YXR1cz0icGVuZGluZyI+RGVmYXVsdCBMb2FkaW5nPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJkZXN0cnVjdGl2ZSIgc3RhdHVzPSJwZW5kaW5nIiBzaXplPSJsZyI+TGFyZ2UgTG9hZGluZzwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICAgIAogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBvdXRwdXQgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoIiNjbGljay1vdXRwdXQiKTsKICBjb25zdCBjbGlja01lQnRuID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCJkZWVzLWJ1dHRvbjpmaXJzdC1vZi10eXBlIik7CiAgY29uc3QgZGF0YUJ0biA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcignZGVlcy1idXR0b25bdHlwZT0ic2Vjb25kYXJ5Il0nKTsKICBjb25zdCBhc3luY0J0biA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcignZGVlcy1idXR0b25bdHlwZT0iZGVzdHJ1Y3RpdmUiXScpOwogIGlmIChjbGlja01lQnRuICYmIG91dHB1dCkgewogICAgY2xpY2tNZUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGlja2VkIiwgKCkgPT4gewogICAgICBvdXRwdXQudGV4dENvbnRlbnQgPSBgQ2xpY2tlZDogRGVmYXVsdCBidXR0b24gYXQgJHsoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLnRvTG9jYWxlVGltZVN0cmluZygpfWA7CiAgICB9KTsKICB9CiAgaWYgKGRhdGFCdG4gJiYgb3V0cHV0KSB7CiAgICBkYXRhQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrZWQiLCAoZTExKSA9PiB7CiAgICAgIG91dHB1dC50ZXh0Q29udGVudCA9IGBDbGlja2VkOiBTZWNvbmRhcnkgYnV0dG9uIHdpdGggZGF0YTogJHtlMTEuZGV0YWlsLmRhdGF9YDsKICAgIH0pOwogIH0KICBpZiAoYXN5bmNCdG4gJiYgb3V0cHV0KSB7CiAgICBhc3luY0J0bi5hZGRFdmVudExpc3RlbmVyKCJjbGlja2VkIiwgYXN5bmMgKCkgPT4gewogICAgICBvdXRwdXQudGV4dENvbnRlbnQgPSAiUHJvY2Vzc2luZy4uLiI7CiAgICAgIGF3YWl0IGRpc3RfdHNfZXhwb3J0czI5LnBsdWdpbnMuc21hcnRkZWxheS5kZWxheUZvcigyZTMpOwogICAgICBvdXRwdXQudGV4dENvbnRlbnQgPSAiQWN0aW9uIGNvbXBsZXRlZCEiOwogICAgfSk7CiAgfQp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjYuIEV2ZW50IEhhbmRsaW5nIn0gLnN1YnRpdGxlPSR7IkludGVyYWN0aXZlIGV4YW1wbGVzIHdpdGggY2xpY2sgZXZlbnQgaGFuZGxpbmcifT4KICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JvdXAiPgogICAgICAgICAgPGRlZXMtYnV0dG9uPkNsaWNrIE1lPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJzZWNvbmRhcnkiIC5ldmVudERldGFpbERhdGE9JHsiY3VzdG9tLWRhdGEtMTIzIn0+CiAgICAgICAgICAgIENsaWNrIHdpdGggRGF0YQogICAgICAgICAgPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJkZXN0cnVjdGl2ZSI+QXN5bmMgQWN0aW9uPC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICAKICAgICAgICA8ZGl2IGlkPSJjbGljay1vdXRwdXQiIGNsYXNzPSJkZW1vLW91dHB1dCI+CiAgICAgICAgICA8ZW0+Q2xpY2sgYSBidXR0b24gdG8gc2VlIHRoZSByZXN1bHQuLi48L2VtPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgICAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgZm9ybSA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1mb3JtIik7CiAgY29uc3Qgb3V0cHV0ID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjZm9ybS1vdXRwdXQiKTsKICBpZiAoZm9ybSAmJiBvdXRwdXQpIHsKICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcigiZm9ybURhdGEiLCAoZTExKSA9PiB7CiAgICAgIG91dHB1dC5pbm5lckhUTUwgPSAiPHN0cm9uZz5Gb3JtIHN1Ym1pdHRlZCB3aXRoIGRhdGE6PC9zdHJvbmc+PGJyPiIgKyBKU09OLnN0cmluZ2lmeShlMTEuZGV0YWlsLmRhdGEsIG51bGwsIDIpOwogICAgfSk7CiAgfQogIGNvbnN0IGRyYWZ0QnRuID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCdkZWVzLWJ1dHRvblt0eXBlPSJzZWNvbmRhcnkiXScpOwogIGNvbnN0IGNhbmNlbEJ0biA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcignZGVlcy1idXR0b25bdHlwZT0iZ2hvc3QiXScpOwogIGlmIChkcmFmdEJ0bikgewogICAgZHJhZnRCdG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2tlZCIsICgpID0+IHsKICAgICAgY29uc29sZS5sb2coIlNhdmUgRHJhZnQgY2xpY2tlZCIpOwogICAgfSk7CiAgfQogIGlmIChjYW5jZWxCdG4pIHsKICAgIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGlja2VkIiwgKCkgPT4gewogICAgICBjb25zb2xlLmxvZygiQ2FuY2VsIGNsaWNrZWQiKTsKICAgIH0pOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyI3LiBGb3JtIEludGVncmF0aW9uIn0gLnN1YnRpdGxlPSR7IkJ1dHRvbnMgd29ya2luZyB3aXRoaW4gZm9ybXMgd2l0aCBhdXRvbWF0aWMgc3BhY2luZyJ9PgogICAgICAgIDxkZWVzLWZvcm0+CiAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IGxhYmVsPSJOYW1lIiBrZXk9Im5hbWUiIHJlcXVpcmVkPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCBsYWJlbD0iRW1haWwiIGtleT0iZW1haWwiIHR5cGU9ImVtYWlsIiByZXF1aXJlZD48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQgbGFiZWw9Ik1lc3NhZ2UiIGtleT0ibWVzc2FnZSIgaXNNdWx0aWxpbmU+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJzZWNvbmRhcnkiPlNhdmUgRHJhZnQ8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9Imdob3N0Ij5DYW5jZWw8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtZm9ybS1zdWJtaXQ+U3VibWl0IEZvcm08L2RlZXMtZm9ybS1zdWJtaXQ+CiAgICAgICAgPC9kZWVzLWZvcm0+CiAgICAgICAgCiAgICAgICAgPGRpdiBpZD0iZm9ybS1vdXRwdXQiIGNsYXNzPSJkZW1vLW91dHB1dCIgc3R5bGU9IndoaXRlLXNwYWNlOiBwcmUtd3JhcDsiPgogICAgICAgICAgPGVtPlN1Ym1pdCB0aGUgZm9ybSB0byBzZWUgdGhlIGRhdGEuLi48L2VtPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgICAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgYnV0dG9ucyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1idXR0b24iKTsKICBidXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4gewogICAgY29uc3QgdHlwZTUgPSBidXR0b24uZ2V0QXR0cmlidXRlKCJ0eXBlIik7CiAgICBpZiAodHlwZTUpIHsKICAgICAgY29uc29sZS5sb2coYExlZ2FjeSB0eXBlICIke3R5cGU1fSIgaXMgc3VwcG9ydGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5YCk7CiAgICB9CiAgfSk7Cn19PgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiOC4gQmFja3dhcmQgQ29tcGF0aWJpbGl0eSJ9IC5zdWJ0aXRsZT0keyJPbGQgYnV0dG9uIHR5cGVzIGFyZSBhdXRvbWF0aWNhbGx5IG1hcHBlZCB0byBuZXcgdmFyaWFudHMifT4KICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JvdXAiPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9Im5vcm1hbCI+Tm9ybWFsIOKGkiBEZWZhdWx0PC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJoaWdobGlnaHRlZCI+SGlnaGxpZ2h0ZWQg4oaSIERlc3RydWN0aXZlPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJkaXNjcmVldCI+RGlzY3JlZXQg4oaSIE91dGxpbmU8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9ImJpZyI+QmlnIOKGkiBMYXJnZSBTaXplPC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICAKICAgICAgICA8cCBzdHlsZT0ibWFyZ2luLXRvcDogMTZweDsgZm9udC1zaXplOiAxNHB4OyBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA1Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA1NS4xJSkiKX07Ij4KICAgICAgICAgIFRoZXNlIGxlZ2FjeSB0eXBlIHZhbHVlcyBhcmUgbWFpbnRhaW5lZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBidXQgd2UgcmVjb21tZW5kIHVzaW5nIHRoZSBuZXcgdmFyaWFudCBzeXN0ZW0uCiAgICAgICAgPC9wPgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgICAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgYWN0aW9uR3JvdXAgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3JBbGwoIi52ZXJ0aWNhbC1ncm91cCIpWzBdOwogIGNvbnN0IGRhbmdlckdyb3VwID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yQWxsKCIudmVydGljYWwtZ3JvdXAiKVsxXTsKICBpZiAoYWN0aW9uR3JvdXApIHsKICAgIGNvbnN0IGJ1dHRvbnMgPSBhY3Rpb25Hcm91cC5xdWVyeVNlbGVjdG9yQWxsKCJkZWVzLWJ1dHRvbiIpOwogICAgYnV0dG9ucy5mb3JFYWNoKChidXR0b24sIGluZGV4MikgPT4gewogICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2tlZCIsICgpID0+IHsKICAgICAgICBjb25zdCBhY3Rpb24gPSBbIlNhdmUgQ2hhbmdlcyIsICJEaXNjYXJkIiwgIkhlbHAiXVtpbmRleDJdOwogICAgICAgIGNvbnNvbGUubG9nKGBBY3Rpb24gZ3JvdXA6ICR7YWN0aW9ufSBjbGlja2VkYCk7CiAgICAgIH0pOwogICAgfSk7CiAgfQogIGlmIChkYW5nZXJHcm91cCkgewogICAgY29uc3QgYnV0dG9ucyA9IGRhbmdlckdyb3VwLnF1ZXJ5U2VsZWN0b3JBbGwoImRlZXMtYnV0dG9uIik7CiAgICBidXR0b25zLmZvckVhY2goKGJ1dHRvbiwgaW5kZXgyKSA9PiB7CiAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGlja2VkIiwgKCkgPT4gewogICAgICAgIGNvbnN0IGFjdGlvbiA9IFsiRGVsZXRlIEFjY291bnQiLCAiQXJjaGl2ZSBEYXRhIiwgIk5vdCBBdmFpbGFibGUiXVtpbmRleDJdOwogICAgICAgIGlmIChpbmRleDIgIT09IDIpIHsKICAgICAgICAgIGNvbnNvbGUubG9nKGBEYW5nZXIgem9uZTogJHthY3Rpb259IGNsaWNrZWRgKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfQp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IjkuIEFkdmFuY2VkIEV4YW1wbGVzIn0gLnN1YnRpdGxlPSR7IkNvbXBsZXggYnV0dG9uIGNvbmZpZ3VyYXRpb25zIGFuZCByZWFsLXdvcmxkIHVzZSBjYXNlcyJ9PgogICAgICAgIDxkaXYgY2xhc3M9Imhvcml6b250YWwtZ3JvdXAiPgogICAgICAgICAgPGRpdiBjbGFzcz0idmVydGljYWwtZ3JvdXAiPgogICAgICAgICAgICA8aDQgc3R5bGU9Im1hcmdpbjogMCAwIDhweCAwOyBmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA1MDA7Ij5BY3Rpb24gR3JvdXA8L2g0PgogICAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iZGVmYXVsdCIgc2l6ZT0ic20iPgogICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOlNhdmUiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIFNhdmUgQ2hhbmdlcwogICAgICAgICAgICA8L2RlZXMtYnV0dG9uPgogICAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0ic2Vjb25kYXJ5IiBzaXplPSJzbSI+CiAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6VW5kbzIiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIERpc2NhcmQKICAgICAgICAgICAgPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9Imdob3N0IiBzaXplPSJzbSI+CiAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6SGVscENpcmNsZSI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgSGVscAogICAgICAgICAgICA8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPGRpdiBjbGFzcz0idmVydGljYWwtZ3JvdXAiPgogICAgICAgICAgICA8aDQgc3R5bGU9Im1hcmdpbjogMCAwIDhweCAwOyBmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA1MDA7Ij5EYW5nZXIgWm9uZTwvaDQ+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJkZXN0cnVjdGl2ZSIgc2l6ZT0ic20iPgogICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0iZmE6dHJhc2giPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIERlbGV0ZSBBY2NvdW50CiAgICAgICAgICAgIDwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJvdXRsaW5lIiBzaXplPSJzbSI+CiAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6QXJjaGl2ZSI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgQXJjaGl2ZSBEYXRhCiAgICAgICAgICAgIDwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJnaG9zdCIgc2l6ZT0ic20iIGRpc2FibGVkPgogICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOkJhbiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgTm90IEF2YWlsYWJsZQogICAgICAgICAgICA8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDogMjRweDsiPgogICAgICAgICAgPGg0IHN0eWxlPSJtYXJnaW46IDAgMCA4cHggMDsgZm9udC1zaXplOiAxNHB4OyBmb250LXdlaWdodDogNTAwOyI+Q29kZSBFeGFtcGxlOjwvaDQ+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLXNuaXBwZXQiPgogICAgICAgICAgICAmbHQ7ZGVlcy1idXR0b24gdHlwZT0iZGVmYXVsdCIgc2l6ZT0ic20iIGljb249Imx1Y2lkZTpTYXZlIiBAY2xpY2tlZD0iXCR7aGFuZGxlQ2xpY2t9IiZndDs8YnI+CiAgICAgICAgICAgICZuYnNwOyZuYnNwO1NhdmUgQ2hhbmdlczxicj4KICAgICAgICAgICAgJmx0Oy9kZWVzLWJ1dHRvbiZndDsKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgPC9kaXY+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtYnV0dG9uL2RlZXMtYnV0dG9uL2RlZXMtYnV0dG9uLmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfZGlzdF90czI5KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTQxID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM0MiA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0J1dHRvbiA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1idXR0b24iKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF90ZXh0X2RlY29yYXRvcnM7CiAgbGV0IF90ZXh0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGV4dF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZXZlbnREZXRhaWxEYXRhX2RlY29yYXRvcnM7CiAgbGV0IF9ldmVudERldGFpbERhdGFfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ldmVudERldGFpbERhdGFfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Rpc2FibGVkX2RlY29yYXRvcnM7CiAgbGV0IF9kaXNhYmxlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Rpc2FibGVkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0hpZGRlbl9kZWNvcmF0b3JzOwogIGxldCBfaXNIaWRkZW5faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0hpZGRlbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdHlwZV9kZWNvcmF0b3JzOwogIGxldCBfdHlwZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3R5cGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NpemVfZGVjb3JhdG9yczsKICBsZXQgX3NpemVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaXplX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zdGF0dXNfZGVjb3JhdG9yczsKICBsZXQgX3N0YXR1c19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3N0YXR1c19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW5zaWRlRm9ybV9kZWNvcmF0b3JzOwogIGxldCBfaW5zaWRlRm9ybV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2luc2lkZUZvcm1fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ljb25fZGVjb3JhdG9yczsKICBsZXQgX2ljb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pY29uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pY29uUG9zaXRpb25fZGVjb3JhdG9yczsKICBsZXQgX2ljb25Qb3NpdGlvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ljb25Qb3NpdGlvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzQnV0dG9uMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3RleHRfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgcmVmbGVjdDogdHJ1ZSwKICAgICAgICBoYXNDaGFuZ2VkKCkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9KV07CiAgICAgIF9ldmVudERldGFpbERhdGFfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX2Rpc2FibGVkX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgcmVmbGVjdDogdHJ1ZQogICAgICB9KV07CiAgICAgIF9pc0hpZGRlbl9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBCb29sZWFuCiAgICAgIH0pXTsKICAgICAgX3R5cGVfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgIH0pXTsKICAgICAgX3NpemVfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgIH0pXTsKICAgICAgX3N0YXR1c19kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBTdHJpbmcKICAgICAgfSldOwogICAgICBfaW5zaWRlRm9ybV9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgIHJlZmxlY3Q6IHRydWUKICAgICAgfSldOwogICAgICBfaWNvbl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nLCByZWZsZWN0OiB0cnVlIH0pXTsKICAgICAgX2ljb25Qb3NpdGlvbl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nLCByZWZsZWN0OiB0cnVlIH0pXTsKICAgICAgX19lc0RlY29yYXRlNDEodGhpcywgbnVsbCwgX3RleHRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGV4dCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGV4dCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50ZXh0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50ZXh0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3RleHRfaW5pdGlhbGl6ZXJzLCBfdGV4dF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQxKHRoaXMsIG51bGwsIF9ldmVudERldGFpbERhdGFfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZXZlbnREZXRhaWxEYXRhIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJldmVudERldGFpbERhdGEiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZXZlbnREZXRhaWxEYXRhLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5ldmVudERldGFpbERhdGEgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZXZlbnREZXRhaWxEYXRhX2luaXRpYWxpemVycywgX2V2ZW50RGV0YWlsRGF0YV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQxKHRoaXMsIG51bGwsIF9kaXNhYmxlZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkaXNhYmxlZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZGlzYWJsZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZGlzYWJsZWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmRpc2FibGVkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Rpc2FibGVkX2luaXRpYWxpemVycywgX2Rpc2FibGVkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDEodGhpcywgbnVsbCwgX2lzSGlkZGVuX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzSGlkZGVuIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc0hpZGRlbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc0hpZGRlbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNIaWRkZW4gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNIaWRkZW5faW5pdGlhbGl6ZXJzLCBfaXNIaWRkZW5fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0MSh0aGlzLCBudWxsLCBfdHlwZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0eXBlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0eXBlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnR5cGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnR5cGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdHlwZV9pbml0aWFsaXplcnMsIF90eXBlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDEodGhpcywgbnVsbCwgX3NpemVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2l6ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2l6ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaXplLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaXplID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NpemVfaW5pdGlhbGl6ZXJzLCBfc2l6ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQxKHRoaXMsIG51bGwsIF9zdGF0dXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic3RhdHVzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzdGF0dXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc3RhdHVzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zdGF0dXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc3RhdHVzX2luaXRpYWxpemVycywgX3N0YXR1c19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQxKHRoaXMsIG51bGwsIF9pbnNpZGVGb3JtX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImluc2lkZUZvcm0iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImluc2lkZUZvcm0iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaW5zaWRlRm9ybSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaW5zaWRlRm9ybSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pbnNpZGVGb3JtX2luaXRpYWxpemVycywgX2luc2lkZUZvcm1fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0MSh0aGlzLCBudWxsLCBfaWNvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpY29uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpY29uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmljb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmljb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaWNvbl9pbml0aWFsaXplcnMsIF9pY29uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDEodGhpcywgbnVsbCwgX2ljb25Qb3NpdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpY29uUG9zaXRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImljb25Qb3NpdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pY29uUG9zaXRpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmljb25Qb3NpdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pY29uUG9zaXRpb25faW5pdGlhbGl6ZXJzLCBfaWNvblBvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDEobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzQnV0dG9uMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMzA7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiQnV0dG9uIl07CiAgICAjdGV4dF9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM0Mih0aGlzLCBfdGV4dF9pbml0aWFsaXplcnMsIHZvaWQgMCk7CiAgICBnZXQgdGV4dCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RleHRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0ZXh0KHZhbHVlMikgewogICAgICB0aGlzLiN0ZXh0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZXZlbnREZXRhaWxEYXRhX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Mih0aGlzLCBfdGV4dF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDIodGhpcywgX2V2ZW50RGV0YWlsRGF0YV9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgZ2V0IGV2ZW50RGV0YWlsRGF0YSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2V2ZW50RGV0YWlsRGF0YV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGV2ZW50RGV0YWlsRGF0YSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZXZlbnREZXRhaWxEYXRhX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZGlzYWJsZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQyKHRoaXMsIF9ldmVudERldGFpbERhdGFfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQyKHRoaXMsIF9kaXNhYmxlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgZGlzYWJsZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNkaXNhYmxlZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGRpc2FibGVkKHZhbHVlMikgewogICAgICB0aGlzLiNkaXNhYmxlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzSGlkZGVuX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Mih0aGlzLCBfZGlzYWJsZWRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQyKHRoaXMsIF9pc0hpZGRlbl9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaXNIaWRkZW4oKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc0hpZGRlbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzSGlkZGVuKHZhbHVlMikgewogICAgICB0aGlzLiNpc0hpZGRlbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3R5cGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQyKHRoaXMsIF9pc0hpZGRlbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDIodGhpcywgX3R5cGVfaW5pdGlhbGl6ZXJzLCAiZGVmYXVsdCIpKTsKICAgIGdldCB0eXBlKCkgewogICAgICByZXR1cm4gdGhpcy4jdHlwZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHR5cGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3R5cGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Mih0aGlzLCBfdHlwZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDIodGhpcywgX3NpemVfaW5pdGlhbGl6ZXJzLCAiZGVmYXVsdCIpKTsKICAgIGdldCBzaXplKCkgewogICAgICByZXR1cm4gdGhpcy4jc2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNpemUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzdGF0dXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQyKHRoaXMsIF9zaXplX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Mih0aGlzLCBfc3RhdHVzX2luaXRpYWxpemVycywgIm5vcm1hbCIpKTsKICAgIGdldCBzdGF0dXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzdGF0dXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzdGF0dXModmFsdWUyKSB7CiAgICAgIHRoaXMuI3N0YXR1c19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2luc2lkZUZvcm1fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQyKHRoaXMsIF9zdGF0dXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQyKHRoaXMsIF9pbnNpZGVGb3JtX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpbnNpZGVGb3JtKCkgewogICAgICByZXR1cm4gdGhpcy4jaW5zaWRlRm9ybV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGluc2lkZUZvcm0odmFsdWUyKSB7CiAgICAgIHRoaXMuI2luc2lkZUZvcm1fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpY29uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Mih0aGlzLCBfaW5zaWRlRm9ybV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDIodGhpcywgX2ljb25faW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBpY29uKCkgewogICAgICByZXR1cm4gdGhpcy4jaWNvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGljb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI2ljb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpY29uUG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQyKHRoaXMsIF9pY29uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Mih0aGlzLCBfaWNvblBvc2l0aW9uX2luaXRpYWxpemVycywgImxlZnQiKSk7CiAgICBnZXQgaWNvblBvc2l0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy4jaWNvblBvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaWNvblBvc2l0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNpY29uUG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBfX3J1bkluaXRpYWxpemVyczQyKHRoaXMsIF9pY29uUG9zaXRpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGlmICghdGhpcy5pbnNpZGVGb3JtICYmIHRoaXMuY2xvc2VzdCgiZGVlcy1mb3JtIikpIHsKICAgICAgICB0aGlzLmluc2lkZUZvcm0gPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgICB9CiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLyogRm9ybSBzcGFjaW5nIHN0eWxlcyAqLwogICAgICA6aG9zdChbaW5zaWRlLWZvcm1dKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgfQogICAgICAKICAgICAgOmhvc3QoW2luc2lkZS1mb3JtXTpsYXN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgfQogICAgICAKICAgICAgZGVlcy1mb3JtW2hvcml6b250YWwtbGF5b3V0XSA6aG9zdChbaW5zaWRlLWZvcm1dKSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIG1hcmdpbi1yaWdodDogMTZweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICB9CiAgICAgIAogICAgICBkZWVzLWZvcm1baG9yaXpvbnRhbC1sYXlvdXRdIDpob3N0KFtpbnNpZGUtZm9ybV06bGFzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi1yaWdodDogMDsKICAgICAgfQoKICAgICAgLmJ1dHRvbiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTsKICAgICAgICBnYXA6IDhweDsKICAgICAgfQoKICAgICAgLyogU2l6ZSB2YXJpYW50cyAqLwogICAgICAuYnV0dG9uLnNpemUtZGVmYXVsdCB7CiAgICAgICAgaGVpZ2h0OiAzNnB4OwogICAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIC5idXR0b24uc2l6ZS1zbSB7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDAgMTJweDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgIC5idXR0b24uc2l6ZS1sZyB7CiAgICAgICAgaGVpZ2h0OiA0NHB4OwogICAgICAgIHBhZGRpbmc6IDAgMjRweDsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5idXR0b24uc2l6ZS1pY29uIHsKICAgICAgICBoZWlnaHQ6IDM2cHg7CiAgICAgICAgd2lkdGg6IDM2cHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLyogRGVmYXVsdCB2YXJpYW50ICovCiAgICAgIC5idXR0b24uZGVmYXVsdCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgyMTUgMjAuMiUgMTEuOCUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgOTEuNCUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpOwogICAgICB9CgogICAgICAuYnV0dG9uLmRlZmF1bHQ6aG92ZXI6bm90KC5kaXNhYmxlZCkgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDQwJSA5Ni4xJSkiLCAiaHNsKDIxNSAyMC4yJSAxMC4yJSkiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNC4zIDMxLjglIDg1JSkiLCAiaHNsKDIxNSAyMC4yJSAyMCUpIil9OwogICAgICB9CgogICAgICAuYnV0dG9uLmRlZmF1bHQ6YWN0aXZlOm5vdCguZGlzYWJsZWQpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNC4zIDMxLjglIDkxLjQlKSIsICJoc2woMjE1IDIwLjIlIDklKSIpfTsKICAgICAgfQoKICAgICAgLyogRGVzdHJ1Y3RpdmUgdmFyaWFudCAqLwogICAgICAuYnV0dG9uLmRlc3RydWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiBoc2woMCA4NC4yJSA2MC4yJSk7CiAgICAgICAgY29sb3I6IGhzbCgwIDAlIDk4JSk7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC5idXR0b24uZGVzdHJ1Y3RpdmU6aG92ZXI6bm90KC5kaXNhYmxlZCkgewogICAgICAgIGJhY2tncm91bmQ6IGhzbCgwIDg0LjIlIDU2LjIlKTsKICAgICAgfQoKICAgICAgLmJ1dHRvbi5kZXN0cnVjdGl2ZTphY3RpdmU6bm90KC5kaXNhYmxlZCkgewogICAgICAgIGJhY2tncm91bmQ6IGhzbCgwIDg0LjIlIDUyLjIlKTsKICAgICAgfQoKICAgICAgLyogT3V0bGluZSB2YXJpYW50ICovCiAgICAgIC5idXR0b24ub3V0bGluZSB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDguOCUpIiwgImhzbCgyMTAgNDAlIDk4JSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNSAyMC4yJSAyMS44JSkiKX07CiAgICAgIH0KCiAgICAgIC5idXR0b24ub3V0bGluZTpob3Zlcjpub3QoLmRpc2FibGVkKSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMjE1IDIwLjIlIDE2LjglKSIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0LjMgMzEuOCUgODUlKSIsICJoc2woMjE1IDIwLjIlIDI2LjglKSIpfTsKICAgICAgfQoKICAgICAgLmJ1dHRvbi5vdXRsaW5lOmFjdGl2ZTpub3QoLmRpc2FibGVkKSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNSAyMC4yJSAxMy44JSkiKX07CiAgICAgIH0KCiAgICAgIC8qIFNlY29uZGFyeSB2YXJpYW50ICovCiAgICAgIC5idXR0b24uc2Vjb25kYXJ5IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAuYnV0dG9uLnNlY29uZGFyeTpob3Zlcjpub3QoLmRpc2FibGVkKSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNSAyMC4yJSAxMy44JSkiKX07CiAgICAgIH0KCiAgICAgIC5idXR0b24uc2Vjb25kYXJ5OmFjdGl2ZTpub3QoLmRpc2FibGVkKSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA4NSUpIiwgImhzbCgyMTUgMjAuMiUgMTEuOCUpIil9OwogICAgICB9CgogICAgICAvKiBHaG9zdCB2YXJpYW50ICovCiAgICAgIC5idXR0b24uZ2hvc3QgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAuYnV0dG9uLmdob3N0OmhvdmVyOm5vdCguZGlzYWJsZWQpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICB9CgogICAgICAuYnV0dG9uLmdob3N0OmFjdGl2ZTpub3QoLmRpc2FibGVkKSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQuMyAzMS44JSA5MS40JSkiLCAiaHNsKDIxNSAyMC4yJSAxMy44JSkiKX07CiAgICAgIH0KCiAgICAgIC8qIExpbmsgdmFyaWFudCAqLwogICAgICAuYnV0dG9uLmxpbmsgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjEzLjEgOTMuOSUgNjcuOCUpIil9OwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb24tY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAuYnV0dG9uLmxpbms6aG92ZXI6bm90KC5kaXNhYmxlZCkgewogICAgICAgIHRleHQtZGVjb3JhdGlvbi1jb2xvcjogY3VycmVudENvbG9yOwogICAgICB9CgogICAgICAvKiBTdGF0dXMgc3RhdGVzICovCiAgICAgIC5idXR0b24ucGVuZGluZywKICAgICAgLmJ1dHRvbi5zdWNjZXNzLAogICAgICAuYnV0dG9uLmVycm9yIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDM2cHg7IC8qIFNwYWNlIGZvciBzcGlubmVyICovCiAgICAgIH0KICAgICAgCiAgICAgIC5idXR0b24uc2l6ZS1zbS5wZW5kaW5nLAogICAgICAuYnV0dG9uLnNpemUtc20uc3VjY2VzcywKICAgICAgLmJ1dHRvbi5zaXplLXNtLmVycm9yIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDMycHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5idXR0b24uc2l6ZS1sZy5wZW5kaW5nLAogICAgICAuYnV0dG9uLnNpemUtbGcuc3VjY2VzcywKICAgICAgLmJ1dHRvbi5zaXplLWxnLmVycm9yIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDQ0cHg7CiAgICAgIH0KCiAgICAgIC5idXR0b24ucGVuZGluZyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIuMiA0Ny40JSA1MS4yJSkiLCAiaHNsKDIxMy4xIDkzLjklIDY3LjglIC8gMC4yKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgyMTMuMSA5My45JSA2Ny44JSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC5idXR0b24uc3VjY2VzcyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSkiLCAiaHNsKDE0Mi4xIDcwLjYlIDQ1LjMlIC8gMC4yKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgxNDIuMSA3MC42JSA0NS4zJSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC5idXR0b24uZXJyb3IgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA4NC4yJSA2MC4yJSkiLCAiaHNsKDAgNjIuOCUgNzAuNiUgLyAwLjIpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgNjIuOCUgNzAuNiUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAvKiBEaXNhYmxlZCBzdGF0ZSAqLwogICAgICAuYnV0dG9uLmRpc2FibGVkIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLyogSGlkZGVuIHN0YXRlICovCiAgICAgIC5idXR0b24uaGlkZGVuIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBGb2N1cyBzdGF0ZSAqLwogICAgICAuYnV0dG9uOmZvY3VzLXZpc2libGUgewogICAgICAgIG91dGxpbmU6IDJweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjEzLjEgOTMuOSUgNjcuOCUpIil9OwogICAgICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7CiAgICAgIH0KCiAgICAgIC8qIExvYWRpbmcgc3Bpbm5lciAqLwogICAgICBkZWVzLXNwaW5uZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAxMHB4OwogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgfQogICAgICAKICAgICAgLmJ1dHRvbi5zaXplLXNtIGRlZXMtc3Bpbm5lciB7CiAgICAgICAgbGVmdDogOHB4OwogICAgICAgIHdpZHRoOiAxNHB4OwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgfQogICAgICAKICAgICAgLmJ1dHRvbi5zaXplLWxnIGRlZXMtc3Bpbm5lciB7CiAgICAgICAgbGVmdDogMTRweDsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC8qIEljb24gc2l6aW5nIHdpdGhpbiBidXR0b25zICovCiAgICAgIC5idXR0b24gZGVlcy1pY29uIHsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5idXR0b24uc2l6ZS1zbSBkZWVzLWljb24gewogICAgICAgIHdpZHRoOiAxNHB4OwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgfQogICAgICAKICAgICAgLmJ1dHRvbi5zaXplLWxnIGRlZXMtaWNvbiB7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICB9CgogICAgICAvKiBUZXh0IGFsaWdubWVudCAqLwogICAgICAudGV4dGJveCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgYAogICAgXTsKICAgIC8qKgogICAgICogRXh0cmFjdHMgaWNvbiBhbmQgdGV4dCBmcm9tIGxpZ2h0IERPTSBhbmQgc2V0cyBwcm9wZXJ0aWVzCiAgICAgKi8KICAgIGV4dHJhY3RMaWdodERvbSgpIHsKICAgICAgY29uc3QgaWNvbkVsZW1lbnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoImRlZXMtaWNvbiIpOwogICAgICBjb25zdCB0ZXh0Q29udGVudCA9IEFycmF5LmZyb20odGhpcy5jaGlsZE5vZGVzKS5maWx0ZXIoKG5vZGUyKSA9PiBub2RlMi5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpLm1hcCgobm9kZTIpID0+IG5vZGUyLnRleHRDb250ZW50Py50cmltKCkpLmZpbHRlcihCb29sZWFuKS5qb2luKCIgIik7CiAgICAgIGlmICh0ZXh0Q29udGVudCAmJiAhdGhpcy50ZXh0KSB7CiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgaWYgKGljb25FbGVtZW50KSB7CiAgICAgICAgY29uc3QgaWNvblZhbHVlID0gaWNvbkVsZW1lbnQuaWNvbiB8fCBpY29uRWxlbWVudC5nZXRBdHRyaWJ1dGUoImljb24iKSB8fCAoaWNvbkVsZW1lbnQuaWNvbkZBID8gYGZhOiR7aWNvbkVsZW1lbnQuaWNvbkZBfWAgOiBudWxsKTsKICAgICAgICBpZiAoaWNvblZhbHVlKSB7CiAgICAgICAgICBjb25zdCBjaGlsZHJlbjIgPSBBcnJheS5mcm9tKHRoaXMuY2hpbGROb2Rlcyk7CiAgICAgICAgICBjb25zdCBpY29uSW5kZXggPSBjaGlsZHJlbjIuaW5kZXhPZihpY29uRWxlbWVudCk7CiAgICAgICAgICBjb25zdCB0ZXh0Tm9kZXMgPSBjaGlsZHJlbjIuZmlsdGVyKChub2RlMikgPT4gbm9kZTIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFICYmIG5vZGUyLnRleHRDb250ZW50Py50cmltKCkpOwogICAgICAgICAgaWYgKHRleHROb2Rlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGNvbnN0IGZpcnN0VGV4dEluZGV4ID0gY2hpbGRyZW4yLmluZGV4T2YodGV4dE5vZGVzWzBdKTsKICAgICAgICAgICAgdGhpcy5pY29uUG9zaXRpb24gPSBpY29uSW5kZXggPCBmaXJzdFRleHRJbmRleCA/ICJsZWZ0IiA6ICJyaWdodCI7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmljb24gPSBpY29uVmFsdWU7CiAgICAgICAgfQogICAgICAgIGljb25FbGVtZW50LnJlbW92ZSgpOwogICAgICB9CiAgICAgIHRoaXMuaW5uZXJIVE1MID0gIiI7CiAgICB9CiAgICByZW5kZXIoKSB7CiAgICAgIGNvbnN0IHR5cGVNYXAgPSB7CiAgICAgICAgIm5vcm1hbCI6ICJkZWZhdWx0IiwKICAgICAgICAiaGlnaGxpZ2h0ZWQiOiAiZGVzdHJ1Y3RpdmUiLAogICAgICAgICJkaXNjcmVldCI6ICJvdXRsaW5lIiwKICAgICAgICAiYmlnIjogImRlZmF1bHQiCiAgICAgICAgLy8gV2lsbCB1c2Ugc2l6ZSBpbnN0ZWFkCiAgICAgIH07CiAgICAgIGNvbnN0IGFjdHVhbFR5cGUgPSB0eXBlTWFwW3RoaXMudHlwZV0gfHwgdGhpcy50eXBlOwogICAgICBjb25zdCBhY3R1YWxTaXplID0gdGhpcy50eXBlID09PSAiYmlnIiA/ICJsZyIgOiB0aGlzLnNpemU7CiAgICAgIGNvbnN0IGxlZnRJY29uID0gdGhpcy5pY29uUG9zaXRpb24gPT09ICJsZWZ0IiAmJiB0aGlzLmljb24gPyBiMmA8ZGVlcy1pY29uIC5pY29uPSR7dGhpcy5pY29ufT48L2RlZXMtaWNvbj5gIDogIiI7CiAgICAgIGNvbnN0IHJpZ2h0SWNvbiA9IHRoaXMuaWNvblBvc2l0aW9uID09PSAicmlnaHQiICYmIHRoaXMuaWNvbiA/IGIyYDxkZWVzLWljb24gLmljb249JHt0aGlzLmljb259PjwvZGVlcy1pY29uPmAgOiAiIjsKICAgICAgY29uc3QgaXNJY29uT25seSA9IGFjdHVhbFNpemUgPT09ICJpY29uIiAmJiB0aGlzLmljb247CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdgogICAgICAgIGNsYXNzPSJidXR0b24gJHt0aGlzLmlzSGlkZGVuID8gImhpZGRlbiIgOiAiIn0gJHthY3R1YWxUeXBlfSBzaXplLSR7YWN0dWFsU2l6ZX0gJHt0aGlzLnN0YXR1c30gJHt0aGlzLmRpc2FibGVkID8gImRpc2FibGVkIiA6ICIifSIKICAgICAgICBAY2xpY2s9IiR7dGhpcy5kaXNwYXRjaENsaWNrfSIKICAgICAgPgogICAgICAgICR7dGhpcy5zdGF0dXMgPT09ICJub3JtYWwiID8gYjJgYCA6IGIyYAogICAgICAgICAgPGRlZXMtc3Bpbm5lcgogICAgICAgICAgICAuYm53PSR7dHJ1ZX0KICAgICAgICAgICAgc3RhdHVzPSIke3RoaXMuc3RhdHVzfSIKICAgICAgICAgICAgc2l6ZT0iJHthY3R1YWxTaXplID09PSAic20iID8gMTQgOiBhY3R1YWxTaXplID09PSAibGciID8gMTggOiAxNn0iCiAgICAgICAgICA+PC9kZWVzLXNwaW5uZXI+CiAgICAgICAgYH0KICAgICAgICAke2xlZnRJY29ufQogICAgICAgICR7aXNJY29uT25seSA/ICIiIDogYjJgPGRpdiBjbGFzcz0idGV4dGJveCI+JHt0aGlzLnRleHQgfHwgIkJ1dHRvbiJ9PC9kaXY+YH0KICAgICAgICAke3JpZ2h0SWNvbn0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgZGlzcGF0Y2hDbGljaygpIHsKICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2xpY2tlZCIsIHsKICAgICAgICBkZXRhaWw6IHsKICAgICAgICAgIGRhdGE6IHRoaXMuZXZlbnREZXRhaWxEYXRhCiAgICAgICAgfSwKICAgICAgICBidWJibGVzOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZCgpIHsKICAgICAgdGhpcy5leHRyYWN0TGlnaHREb20oKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNDIoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNCdXR0b24yID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1kYXRhdmlldy9kZWVzLXN0YXRzZ3JpZC9kZWVzLXN0YXRzZ3JpZC5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2RlZXNfaWNvbigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU0MiA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNDMgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNTdGF0c0dyaWQgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2NvbnRhaW5lclJlc3BvbnNpdmUoKSwgY3VzdG9tRWxlbWVudCgiZGVlcy1zdGF0c2dyaWQiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF90aWxlc19kZWNvcmF0b3JzOwogIGxldCBfdGlsZXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90aWxlc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWluVGlsZVdpZHRoX2RlY29yYXRvcnM7CiAgbGV0IF9taW5UaWxlV2lkdGhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9taW5UaWxlV2lkdGhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2dhcF9kZWNvcmF0b3JzOwogIGxldCBfZ2FwX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZ2FwX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ncmlkQWN0aW9uc19kZWNvcmF0b3JzOwogIGxldCBfZ3JpZEFjdGlvbnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ncmlkQWN0aW9uc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29udGV4dE1lbnVWaXNpYmxlX2RlY29yYXRvcnM7CiAgbGV0IF9jb250ZXh0TWVudVZpc2libGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZXh0TWVudVZpc2libGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRleHRNZW51UG9zaXRpb25fZGVjb3JhdG9yczsKICBsZXQgX2NvbnRleHRNZW51UG9zaXRpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZXh0TWVudVBvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZXh0TWVudUFjdGlvbnNfZGVjb3JhdG9yczsKICBsZXQgX2NvbnRleHRNZW51QWN0aW9uc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRleHRNZW51QWN0aW9uc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzU3RhdHNHcmlkMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3RpbGVzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF9taW5UaWxlV2lkdGhfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF9nYXBfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF9ncmlkQWN0aW9uc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfY29udGV4dE1lbnVWaXNpYmxlX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9jb250ZXh0TWVudVBvc2l0aW9uX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9jb250ZXh0TWVudUFjdGlvbnNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlNDIodGhpcywgbnVsbCwgX3RpbGVzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRpbGVzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0aWxlcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50aWxlcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGlsZXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGlsZXNfaW5pdGlhbGl6ZXJzLCBfdGlsZXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Mih0aGlzLCBudWxsLCBfbWluVGlsZVdpZHRoX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1pblRpbGVXaWR0aCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWluVGlsZVdpZHRoIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1pblRpbGVXaWR0aCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWluVGlsZVdpZHRoID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21pblRpbGVXaWR0aF9pbml0aWFsaXplcnMsIF9taW5UaWxlV2lkdGhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Mih0aGlzLCBudWxsLCBfZ2FwX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImdhcCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZ2FwIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmdhcCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZ2FwID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2dhcF9pbml0aWFsaXplcnMsIF9nYXBfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Mih0aGlzLCBudWxsLCBfZ3JpZEFjdGlvbnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZ3JpZEFjdGlvbnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImdyaWRBY3Rpb25zIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmdyaWRBY3Rpb25zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5ncmlkQWN0aW9ucyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9ncmlkQWN0aW9uc19pbml0aWFsaXplcnMsIF9ncmlkQWN0aW9uc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQyKHRoaXMsIG51bGwsIF9jb250ZXh0TWVudVZpc2libGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29udGV4dE1lbnVWaXNpYmxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb250ZXh0TWVudVZpc2libGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29udGV4dE1lbnVWaXNpYmxlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jb250ZXh0TWVudVZpc2libGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29udGV4dE1lbnVWaXNpYmxlX2luaXRpYWxpemVycywgX2NvbnRleHRNZW51VmlzaWJsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQyKHRoaXMsIG51bGwsIF9jb250ZXh0TWVudVBvc2l0aW9uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNvbnRleHRNZW51UG9zaXRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNvbnRleHRNZW51UG9zaXRpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29udGV4dE1lbnVQb3NpdGlvbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY29udGV4dE1lbnVQb3NpdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jb250ZXh0TWVudVBvc2l0aW9uX2luaXRpYWxpemVycywgX2NvbnRleHRNZW51UG9zaXRpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Mih0aGlzLCBudWxsLCBfY29udGV4dE1lbnVBY3Rpb25zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNvbnRleHRNZW51QWN0aW9ucyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29udGV4dE1lbnVBY3Rpb25zIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNvbnRleHRNZW51QWN0aW9ucywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY29udGV4dE1lbnVBY3Rpb25zID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbnRleHRNZW51QWN0aW9uc19pbml0aWFsaXplcnMsIF9jb250ZXh0TWVudUFjdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0MihudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNTdGF0c0dyaWQyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmM3OwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkRhdGEgVmlldyJdOwogICAgI3RpbGVzX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF90aWxlc19pbml0aWFsaXplcnMsIFtdKTsKICAgIGdldCB0aWxlcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RpbGVzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdGlsZXModmFsdWUyKSB7CiAgICAgIHRoaXMuI3RpbGVzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWluVGlsZVdpZHRoX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfdGlsZXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9taW5UaWxlV2lkdGhfaW5pdGlhbGl6ZXJzLCAyNTApKTsKICAgIGdldCBtaW5UaWxlV2lkdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtaW5UaWxlV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtaW5UaWxlV2lkdGgodmFsdWUyKSB7CiAgICAgIHRoaXMuI21pblRpbGVXaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2dhcF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX21pblRpbGVXaWR0aF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX2dhcF9pbml0aWFsaXplcnMsIDE2KSk7CiAgICBnZXQgZ2FwKCkgewogICAgICByZXR1cm4gdGhpcy4jZ2FwX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZ2FwKHZhbHVlMikgewogICAgICB0aGlzLiNnYXBfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNncmlkQWN0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX2dhcF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX2dyaWRBY3Rpb25zX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBncmlkQWN0aW9ucygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2dyaWRBY3Rpb25zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZ3JpZEFjdGlvbnModmFsdWUyKSB7CiAgICAgIHRoaXMuI2dyaWRBY3Rpb25zX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29udGV4dE1lbnVWaXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Myh0aGlzLCBfZ3JpZEFjdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9jb250ZXh0TWVudVZpc2libGVfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGNvbnRleHRNZW51VmlzaWJsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvbnRleHRNZW51VmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNvbnRleHRNZW51VmlzaWJsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29udGV4dE1lbnVWaXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29udGV4dE1lbnVQb3NpdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX2NvbnRleHRNZW51VmlzaWJsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX2NvbnRleHRNZW51UG9zaXRpb25faW5pdGlhbGl6ZXJzLCB7IHg6IDAsIHk6IDAgfSkpOwogICAgZ2V0IGNvbnRleHRNZW51UG9zaXRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb250ZXh0TWVudVBvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29udGV4dE1lbnVQb3NpdGlvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29udGV4dE1lbnVQb3NpdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NvbnRleHRNZW51QWN0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDModGhpcywgX2NvbnRleHRNZW51UG9zaXRpb25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9jb250ZXh0TWVudUFjdGlvbnNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IGNvbnRleHRNZW51QWN0aW9ucygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvbnRleHRNZW51QWN0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNvbnRleHRNZW51QWN0aW9ucyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29udGV4dE1lbnVBY3Rpb25zX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQtZmFtaWx5OiAke2Nzc0dlaXN0Rm9udEZhbWlseX07CiAgICAgIH0KCiAgICAgIC8qIENTUyBWYXJpYWJsZXMgZm9yIGNvbnNpc3RlbnQgc3BhY2luZyBhbmQgc2l6aW5nICovCiAgICAgIDpob3N0IHsKICAgICAgICAtLWdyaWQtZ2FwOiAxMnB4OwogICAgICAgIC0tdGlsZS1wYWRkaW5nOiAxNnB4OwogICAgICAgIC0taGVhZGVyLXNwYWNpbmc6IDEycHg7CiAgICAgICAgLS1jb250ZW50LW1pbi1oZWlnaHQ6IDQwcHg7CiAgICAgICAgLS12YWx1ZS1mb250LXNpemU6IDI2cHg7CiAgICAgICAgLS11bml0LWZvbnQtc2l6ZTogMTRweDsKICAgICAgICAtLWxhYmVsLWZvbnQtc2l6ZTogMTJweDsKICAgICAgICAtLXRpdGxlLWZvbnQtc2l6ZTogMTNweDsKICAgICAgICAtLWRlc2NyaXB0aW9uLXNwYWNpbmc6IDhweDsKICAgICAgICAtLWJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICAtLXRyYW5zaXRpb24tZHVyYXRpb246IDAuMTVzOwogICAgICB9CgogICAgICAvKiBHcmlkIExheW91dCAqLwogICAgICAuZ3JpZC1oZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogY2FsYyh2YXIoLS1ncmlkLWdhcCkgKiAxLjUpOwogICAgICAgIG1pbi1oZWlnaHQ6IDQwcHg7CiAgICAgIH0KCiAgICAgIC5ncmlkLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTsKICAgICAgfQoKICAgICAgLmdyaWQtYWN0aW9ucyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDZweDsKICAgICAgfQoKICAgICAgLmdyaWQtYWN0aW9ucyBkZWVzLWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS1sYWJlbC1mb250LXNpemUpOwogICAgICB9CgogICAgICAuc3RhdHMtZ3JpZCB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KCR7cigyNTApfXB4LCAxZnIpKTsKICAgICAgICBnYXA6ICR7cigxNil9cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC8qIFRpbGUgQmFzZSBTdHlsZXMgKi8KICAgICAgLnN0YXRzLXRpbGUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMwOTA5MGIiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlMGUwZTAiLCAiIzIwMjAyMCIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXItcmFkaXVzKTsKICAgICAgICBwYWRkaW5nOiB2YXIoLS10aWxlLXBhZGRpbmcpOwogICAgICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS10cmFuc2l0aW9uLWR1cmF0aW9uKSBlYXNlOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KCiAgICAgIC5zdGF0cy10aWxlOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZhZmFmYSIsICIjMGQwZDBkIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkMGQwZDAiLCAiIzJhMmEyYSIpfTsKICAgICAgfQoKICAgICAgLnN0YXRzLXRpbGUuY2xpY2thYmxlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5zdGF0cy10aWxlLmNsaWNrYWJsZTpob3ZlciB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwogICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDZweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLDAsMCwwLjAzKSIsICJyZ2JhKDAsMCwwLDAuMTUpIil9OwogICAgICB9CgogICAgICAvKiBUaWxlIEhlYWRlciAqLwogICAgICAudGlsZS1oZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICAgIG1hcmdpbi1ib3R0b206IHZhcigtLWhlYWRlci1zcGFjaW5nKTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLnRpbGUtdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tdGl0bGUtZm9udC1zaXplKTsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDQ2LjklKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMjsKICAgICAgfQoKICAgICAgLnRpbGUtaWNvbiB7CiAgICAgICAgb3BhY2l0eTogMC43OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDQ2LjklKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC8qIFRpbGUgQ29udGVudCAqLwogICAgICAudGlsZS1jb250ZW50IHsKICAgICAgICBtaW4taGVpZ2h0OiB2YXIoLS1jb250ZW50LW1pbi1oZWlnaHQpOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4OiAxOwogICAgICB9CgogICAgICAudGlsZS12YWx1ZSB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS12YWx1ZS1mb250LXNpemUpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDguOCUpIiwgImhzbCgyMTAgNDAlIDk4JSkiKX07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgICBnYXA6IDRweDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDI1ZW07CiAgICAgIH0KCiAgICAgIC50aWxlLXVuaXQgewogICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tdW5pdC1mb250LXNpemUpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNDYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtOwogICAgICB9CgogICAgICAudGlsZS1kZXNjcmlwdGlvbiB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS1sYWJlbC1mb250LXNpemUpOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDU2LjklKSIsICJoc2woMjE1IDIwLjIlIDU1LjElKSIpfTsKICAgICAgICBtYXJnaW4tdG9wOiB2YXIoLS1kZXNjcmlwdGlvbi1zcGFjaW5nKTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLyogR2F1Z2UgU3R5bGVzICovCiAgICAgIC5nYXVnZS13cmFwcGVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5nYXVnZS1jb250YWluZXIgewogICAgICAgIHdpZHRoOiAxMjBweDsKICAgICAgICBoZWlnaHQ6IDcwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1hcmdpbi10b3A6IC04cHg7CiAgICAgIH0KCiAgICAgIC5nYXVnZS1zdmcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmdhdWdlLWJhY2tncm91bmQgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U4ZThlOCIsICIjMWExYTFhIil9OwogICAgICAgIHN0cm9rZS13aWR0aDogNjsKICAgICAgfQoKICAgICAgLmdhdWdlLWZpbGwgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiA2OwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICB0cmFuc2l0aW9uOiBzdHJva2UtZGFzaG9mZnNldCAwLjZzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgIC5nYXVnZS10ZXh0IHsKICAgICAgICBmaWxsOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICAgIGZvbnQtZmFtaWx5OiAke2Nzc0dlaXN0Rm9udEZhbWlseX07CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS12YWx1ZS1mb250LXNpemUpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDI1ZW07CiAgICAgIH0KICAgICAgCiAgICAgIC5nYXVnZS11bml0IHsKICAgICAgICBmb250LXNpemU6IHZhcigtLXVuaXQtZm9udC1zaXplKTsKICAgICAgICBmaWxsOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDQ2LjklKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGZvbnQtZmFtaWx5OiAke2Nzc0dlaXN0Rm9udEZhbWlseX07CiAgICAgIH0KCiAgICAgIC8qIFBlcmNlbnRhZ2UgU3R5bGVzICovCiAgICAgIC5wZXJjZW50YWdlLXdyYXBwZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleDogMTsKICAgICAgfQoKICAgICAgLnBlcmNlbnRhZ2UtdmFsdWUgewogICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tdmFsdWUtZm9udC1zaXplKTsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjE7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAyNWVtOwogICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgfQoKICAgICAgLnBlcmNlbnRhZ2UtYmFyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDZweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U4ZThlOCIsICIjMWExYTFhIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIG1hcmdpbi10b3A6IGF1dG87CiAgICAgIH0KCiAgICAgIC5wZXJjZW50YWdlLWZpbGwgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzMzMzMzMyIsICIjZTBlMGUwIil9OwogICAgICAgIHRyYW5zaXRpb246IHdpZHRoIDAuNnMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgIH0KCiAgICAgIC8qIE11bHRpIFBlcmNlbnRhZ2UgU3R5bGVzICovCiAgICAgIC5tdWx0aS1wZXJjZW50YWdlLXdyYXBwZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4OiAxOwogICAgICB9CgogICAgICAubXVsdGktcGVyY2VudGFnZS1pdGVtcyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogMTJweDsKICAgICAgICBtYXJnaW4tdG9wOiBhdXRvOwogICAgICB9CgogICAgICAubXVsdGktcGVyY2VudGFnZS1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgIH0KCiAgICAgIC5tdWx0aS1wZXJjZW50YWdlLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICB9CgogICAgICAubXVsdGktcGVyY2VudGFnZS1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNDYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtOwogICAgICB9CgogICAgICAubXVsdGktcGVyY2VudGFnZS12YWx1ZSB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDguOCUpIiwgImhzbCgyMTAgNDAlIDk4JSkiKX07CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CiAgICAgIH0KCiAgICAgIC5tdWx0aS1wZXJjZW50YWdlLWJhciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiA0cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlOGU4ZTgiLCAiIzFhMWExYSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLm11bHRpLXBlcmNlbnRhZ2UtZmlsbCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMzMzMzMzIiwgIiNlMGUwZTAiKX07CiAgICAgICAgdHJhbnNpdGlvbjogd2lkdGggMC42cyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgfQoKICAgICAgLyogQ1BVIENvcmVzIFN0eWxlcyAqLwogICAgICAuY3B1LWNvcmVzLXdyYXBwZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG1pbi1oZWlnaHQ6IDgwcHg7CiAgICAgIH0KCiAgICAgIC5jcHUtY29yZXMtaGVhZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICB9CgogICAgICAuY3B1LWNvcmVzLXZhbHVlIHsKICAgICAgICBmb250LXNpemU6IHZhcigtLXZhbHVlLWZvbnQtc2l6ZSk7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgOC44JSkiLCAiaHNsKDIxMCA0MCUgOTglKSIpfTsKICAgICAgICBsaW5lLWhlaWdodDogMS4xOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMjVlbTsKICAgICAgfQoKICAgICAgLmNwdS1jb3Jlcy11bml0IHsKICAgICAgICBmb250LXNpemU6IHZhcigtLXVuaXQtZm9udC1zaXplKTsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDQ2LjklKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTsKICAgICAgfQoKICAgICAgLmNwdS1jb3Jlcy1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS1sYWJlbC1mb250LXNpemUpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNTYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNTUuMSUpIil9OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtOwogICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgICB9CgogICAgICAuY3B1LWNvcmVzLWJhcnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICAgIGdhcDogM3B4OwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLWhlaWdodDogNjBweDsKICAgICAgICBwYWRkaW5nOiA0cHggMDsKICAgICAgfQoKICAgICAgLmNwdS1jb3Jlcy1iYXJzLmNlbnRlcmVkIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmNwdS1jb3JlLWJhci1jb250YWluZXIgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLXdpZHRoOiA2cHg7CiAgICAgICAgbWF4LXdpZHRoOiAyNHB4OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDRweDsKICAgICAgfQoKICAgICAgLmNwdS1jb3JlLWJhci13cmFwcGVyIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZThlOGU4IiwgIiMxYTFhMWEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIG1pbi1oZWlnaHQ6IDQwcHg7CiAgICAgIH0KCiAgICAgIC5jcHUtY29yZS1iYXItZmlsbCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNjY2NjY2IiwgIiM4ODg4ODgiKX07CiAgICAgICAgdHJhbnNpdGlvbjogaGVpZ2h0IDAuM3MgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSwgYmFja2dyb3VuZC1jb2xvciAwLjNzIGVhc2U7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4IDJweCAwIDA7CiAgICAgIH0KCiAgICAgIC5jcHUtY29yZS1iYXItZmlsbC5sb3cgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMTQyLjEgNzYuMiUgMzYuMyUpIiwgImhzbCgxNDIuMSA3MC42JSA0NS4zJSkiKX07CiAgICAgIH0KCiAgICAgIC5jcHUtY29yZS1iYXItZmlsbC5tZWRpdW0gewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woNDUuNCA5My40JSA0Ny41JSkiLCAiaHNsKDQ1LjQgOTMuNCUgNDcuNSUpIil9OwogICAgICB9CgogICAgICAuY3B1LWNvcmUtYmFyLWZpbGwuaGlnaCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDg0LjIlIDYwLjIlKSIsICJoc2woMCA4NC4yJSA2MC4yJSkiKX07CiAgICAgIH0KCiAgICAgIC5jcHUtY29yZS1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiA5cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA1Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA1NS4xJSkiKX07CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC8qIFBhcnRpdGlvbiBTdHlsZXMgKi8KICAgICAgLnBhcnRpdGlvbi13cmFwcGVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleDogMTsKICAgICAgICBnYXA6IDhweDsKICAgICAgfQoKICAgICAgLnBhcnRpdGlvbi1oZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGdhcDogOHB4OwogICAgICB9CgogICAgICAucGFydGl0aW9uLXBlcmNlbnRhZ2UgewogICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tdmFsdWUtZm9udC1zaXplKTsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjE7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAyNWVtOwogICAgICB9CgogICAgICAucGFydGl0aW9uLWJhciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiA2cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlOGU4ZTgiLCAiIzFhMWExYSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnBhcnRpdGlvbi1iYXItZmlsbCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMzMzMzMzIiwgIiNlMGUwZTAiKX07CiAgICAgICAgdHJhbnNpdGlvbjogd2lkdGggMC42cyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgfQoKICAgICAgLnBhcnRpdGlvbi1iYXItZmlsbC53YXJuaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDQ1LjQgOTMuNCUgNDcuNSUpIiwgImhzbCg0NS40IDkzLjQlIDQ3LjUlKSIpfTsKICAgICAgfQoKICAgICAgLnBhcnRpdGlvbi1iYXItZmlsbC5jcml0aWNhbCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDg0LjIlIDYwLjIlKSIsICJoc2woMCA4NC4yJSA2MC4yJSkiKX07CiAgICAgIH0KCiAgICAgIC5wYXJ0aXRpb24tc3RhdHMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luLXRvcDogYXV0bzsKICAgICAgfQoKICAgICAgLnBhcnRpdGlvbi1zdGF0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAycHg7CiAgICAgIH0KCiAgICAgIC5wYXJ0aXRpb24tc3RhdC1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNTYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNTUuMSUpIil9OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsKICAgICAgfQoKICAgICAgLnBhcnRpdGlvbi1zdGF0LXZhbHVlIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgOC44JSkiLCAiaHNsKDIxMCA0MCUgOTglKSIpfTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTsKICAgICAgfQoKICAgICAgLnBhcnRpdGlvbi1tZXRhIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA2cHg7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICB9CgogICAgICAucGFydGl0aW9uLWZpbGVzeXN0ZW0gewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDQ2LjklKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxMCA0MCUgOTYuMSUpIiwgImhzbCgyMTUgMjAuMiUgMTYuOCUpIil9OwogICAgICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICB9CgogICAgICAucGFydGl0aW9uLW1vdW50cG9pbnQgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA1Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA1NS4xJSkiKX07CiAgICAgIH0KCiAgICAgIC8qIERpc2sgU3R5bGVzICovCiAgICAgIC5kaXNrLXdyYXBwZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4OiAxOwogICAgICAgIGdhcDogOHB4OwogICAgICB9CgogICAgICAuZGlzay1jYXBhY2l0eSB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS12YWx1ZS1mb250LXNpemUpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDguOCUpIiwgImhzbCgyMTAgNDAlIDk4JSkiKX07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDI1ZW07CiAgICAgIH0KCiAgICAgIC5kaXNrLW1vZGVsIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNDYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNjUuMSUpIil9OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDZweDsKICAgICAgfQoKICAgICAgLmRpc2stdHlwZS1iYWRnZSB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA0Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgNDAlIDk2LjElKSIsICJoc2woMjE1IDIwLjIlIDE2LjglKSIpfTsKICAgICAgICBwYWRkaW5nOiAycHggNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgfQoKICAgICAgLmRpc2stbWV0cmljcyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIG1hcmdpbi10b3A6IGF1dG87CiAgICAgIH0KCiAgICAgIC5kaXNrLWlvcHMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEycHg7CiAgICAgIH0KCiAgICAgIC5kaXNrLWlvcHMtaXRlbSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgIH0KCiAgICAgIC5kaXNrLWlvcHMtbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDU2LjklKSIsICJoc2woMjE1IDIwLjIlIDU1LjElKSIpfTsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICB9CgogICAgICAuZGlzay1pb3BzLXZhbHVlIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgOC44JSkiLCAiaHNsKDIxMCA0MCUgOTglKSIpfTsKICAgICAgfQoKICAgICAgLmRpc2staGVhbHRoIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgIH0KCiAgICAgIC5kaXNrLWhlYWx0aC1oZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgfQoKICAgICAgLmRpc2staGVhbHRoLWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA1Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA1NS4xJSkiKX07CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgfQoKICAgICAgLmRpc2staGVhbHRoLXZhbHVlIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuMyAyNSUgOC44JSkiLCAiaHNsKDIxMCA0MCUgOTglKSIpfTsKICAgICAgfQoKICAgICAgLmRpc2staGVhbHRoLWJhciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiA0cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlOGU4ZTgiLCAiIzFhMWExYSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmRpc2staGVhbHRoLWZpbGwgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjZzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICB9CgogICAgICAuZGlzay1oZWFsdGgtZmlsbC5nb29kIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlKSIsICJoc2woMTQyLjEgNzAuNiUgNDUuMyUpIil9OwogICAgICB9CgogICAgICAuZGlzay1oZWFsdGgtZmlsbC53YXJuaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDQ1LjQgOTMuNCUgNDcuNSUpIiwgImhzbCg0NS40IDkzLjQlIDQ3LjUlKSIpfTsKICAgICAgfQoKICAgICAgLmRpc2staGVhbHRoLWZpbGwuY3JpdGljYWwgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA4NC4yJSA2MC4yJSkiLCAiaHNsKDAgODQuMiUgNjAuMiUpIil9OwogICAgICB9CgogICAgICAvKiBUcmVuZCBTdHlsZXMgKi8KICAgICAgLnRyZW5kLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIGZsZXg6IDE7CiAgICAgIH0KCiAgICAgIC50cmVuZC1oZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGdhcDogOHB4OwogICAgICB9CgogICAgICAudHJlbmQtdmFsdWUgewogICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tdmFsdWUtZm9udC1zaXplKTsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS4zIDI1JSA4LjglKSIsICJoc2woMjEwIDQwJSA5OCUpIil9OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjE7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAyNWVtOwogICAgICB9CgogICAgICAudHJlbmQtdW5pdCB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS11bml0LWZvbnQtc2l6ZSk7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUuNCAxNi4zJSA0Ni45JSkiLCAiaHNsKDIxNSAyMC4yJSA2NS4xJSkiKX07CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CiAgICAgIH0KCiAgICAgIC50cmVuZC1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS1sYWJlbC1mb250LXNpemUpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNTYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNTUuMSUpIil9OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtOwogICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgICB9CgogICAgICAudHJlbmQtZ3JhcGggewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMjhweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWFyZ2luLXRvcDogYXV0bzsKICAgICAgfQoKICAgICAgLnRyZW5kLXN2ZyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAudHJlbmQtbGluZSB7CiAgICAgICAgZmlsbDogbm9uZTsKICAgICAgICBzdHJva2U6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOTk5OTk5IiwgIiM2NjY2NjYiKX07CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxLjU7CiAgICAgICAgc3Ryb2tlLWxpbmVqb2luOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWNhcDogcm91bmQ7CiAgICAgIH0KCiAgICAgIC50cmVuZC1hcmVhIHsKICAgICAgICBmaWxsOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgxNTAsIDE1MCwgMTUwLCAwLjA4KSIsICJyZ2JhKDEwMCwgMTAwLCAxMDAsIDAuMDgpIil9OwogICAgICB9CgogICAgICAvKiBUZXh0IFZhbHVlIFN0eWxlcyAqLwogICAgICAudGV4dC12YWx1ZSB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS12YWx1ZS1mb250LXNpemUpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDguOCUpIiwgImhzbCgyMTAgNDAlIDk4JSkiKX07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDI1ZW07CiAgICAgIH0KCiAgICAgIC8qIENvbnRleHQgTWVudSAqLwogICAgICBkZWVzLWNvbnRleHRtZW51IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgei1pbmRleDogMTAwMDsKICAgICAgfQogICAgYCwKICAgICAgLy8gQ29udGFpbmVyLXJlc3BvbnNpdmU6IHdoZW4gdGhpcyBzdGF0c2dyaWQgaXMgbmFycm93CiAgICAgIGNzc01hbmFnZXIuY3NzRm9yVGFibGV0KGlgCiAgICAgIC5zdGF0cy1ncmlkIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLCAxZnIpOwogICAgICB9CiAgICBgLCBfY2xhc3NUaGlzKSwKICAgICAgY3NzTWFuYWdlci5jc3NGb3JQaGFibGV0KGlgCiAgICAgIDpob3N0IHsKICAgICAgICAtLXRpbGUtcGFkZGluZzogMTJweDsKICAgICAgICAtLXZhbHVlLWZvbnQtc2l6ZTogMjJweDsKICAgICAgICAtLXRpdGxlLWZvbnQtc2l6ZTogMTJweDsKICAgICAgICAtLWdyaWQtZ2FwOiA4cHg7CiAgICAgIH0KICAgICAgLnN0YXRzLWdyaWQgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjAwcHgsIDFmcikpOwogICAgICAgIGdhcDogOHB4OwogICAgICB9CiAgICAgIC5zdGF0cy10aWxlIHsKICAgICAgICBncmlkLWNvbHVtbjogc3BhbiAxICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIGAsIF9jbGFzc1RoaXMpLAogICAgICBjc3NNYW5hZ2VyLmNzc0ZvclBob25lKGlgCiAgICAgIDpob3N0IHsKICAgICAgICAtLXRpbGUtcGFkZGluZzogMTBweDsKICAgICAgICAtLXZhbHVlLWZvbnQtc2l6ZTogMjBweDsKICAgICAgICAtLWhlYWRlci1zcGFjaW5nOiA4cHg7CiAgICAgIH0KICAgICAgLnN0YXRzLWdyaWQgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgICAgIGdhcDogNnB4OwogICAgICB9CiAgICBgLCBfY2xhc3NUaGlzKQogICAgXTsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBfX3J1bkluaXRpYWxpemVyczQzKHRoaXMsIF9jb250ZXh0TWVudUFjdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgICR7dGhpcy5ncmlkQWN0aW9ucy5sZW5ndGggPiAwID8gYjJgCiAgICAgICAgPGRpdiBjbGFzcz0iZ3JpZC1oZWFkZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZ3JpZC10aXRsZSI+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJncmlkLWFjdGlvbnMiPgogICAgICAgICAgICAke3RoaXMuZ3JpZEFjdGlvbnMubWFwKChhY3Rpb24pID0+IGIyYAogICAgICAgICAgICAgIDxkZWVzLWJ1dHRvbiAKICAgICAgICAgICAgICAgIEBjbGlja2VkPSR7KCkgPT4gdGhpcy5oYW5kbGVHcmlkQWN0aW9uKGFjdGlvbil9CiAgICAgICAgICAgICAgICB0eXBlPSJvdXRsaW5lIgogICAgICAgICAgICAgICAgc2l6ZT0ic20iCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgJHthY3Rpb24uaWNvbk5hbWUgPyBiMmA8ZGVlcy1pY29uIC5pY29uPSR7YWN0aW9uLmljb25OYW1lfSBzaXplPSJzbWFsbCI+PC9kZWVzLWljb24+YCA6ICIifQogICAgICAgICAgICAgICAgJHthY3Rpb24ubmFtZX0KICAgICAgICAgICAgICA8L2RlZXMtYnV0dG9uPgogICAgICAgICAgICBgKX0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICBgIDogIiJ9CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJzdGF0cy1ncmlkIiBzdHlsZT0iZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgke3RoaXMubWluVGlsZVdpZHRofXB4LCAxZnIpKTsgZ2FwOiAke3RoaXMuZ2FwfXB4OyI+CiAgICAgICAgJHt0aGlzLnRpbGVzLm1hcCgodGlsZSkgPT4gdGhpcy5yZW5kZXJUaWxlKHRpbGUpKX0KICAgICAgPC9kaXY+CgogICAgICAke3RoaXMuY29udGV4dE1lbnVWaXNpYmxlID8gYjJgCiAgICAgICAgPGRlZXMtY29udGV4dG1lbnUKICAgICAgICAgIC54PSR7dGhpcy5jb250ZXh0TWVudVBvc2l0aW9uLnh9CiAgICAgICAgICAueT0ke3RoaXMuY29udGV4dE1lbnVQb3NpdGlvbi55fQogICAgICAgICAgLm1lbnVJdGVtcz0ke3RoaXMuY29udGV4dE1lbnVBY3Rpb25zfQogICAgICAgICAgQGNsaWNrZWQ9JHsoKSA9PiB0aGlzLmNvbnRleHRNZW51VmlzaWJsZSA9IGZhbHNlfQogICAgICAgID48L2RlZXMtY29udGV4dG1lbnU+CiAgICAgIGAgOiAiIn0KICAgIGA7CiAgICB9CiAgICByZW5kZXJUaWxlKHRpbGUpIHsKICAgICAgY29uc3QgaGFzQWN0aW9ucyA9IHRpbGUuYWN0aW9ucyAmJiB0aWxlLmFjdGlvbnMubGVuZ3RoID4gMDsKICAgICAgY29uc3QgY2xpY2thYmxlID0gaGFzQWN0aW9ucyAmJiB0aWxlLmFjdGlvbnMubGVuZ3RoID09PSAxOwogICAgICBjb25zdCBjb2x1bW5TcGFuID0gdGlsZS5jb2x1bW5TcGFuICYmIHRpbGUuY29sdW1uU3BhbiA+IDEgPyB0aWxlLmNvbHVtblNwYW4gOiB2b2lkIDA7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdgogICAgICAgIGNsYXNzPSJzdGF0cy10aWxlICR7Y2xpY2thYmxlID8gImNsaWNrYWJsZSIgOiAiIn0iCiAgICAgICAgc3R5bGU9IiR7Y29sdW1uU3BhbiA/IGBncmlkLWNvbHVtbjogc3BhbiAke2NvbHVtblNwYW59YCA6ICIifSIKICAgICAgICBAY2xpY2s9JHtjbGlja2FibGUgPyAoKSA9PiB0aGlzLmhhbmRsZVRpbGVBY3Rpb24odGlsZS5hY3Rpb25zWzBdLCB0aWxlKSA6IHZvaWQgMH0KICAgICAgICBAY29udGV4dG1lbnU9JHtoYXNBY3Rpb25zID8gKGUxMSkgPT4gdGhpcy5zaG93Q29udGV4dE1lbnUoZTExLCB0aWxlKSA6IHZvaWQgMH0KICAgICAgPgogICAgICAgIDxkaXYgY2xhc3M9InRpbGUtaGVhZGVyIj4KICAgICAgICAgIDxoMyBjbGFzcz0idGlsZS10aXRsZSI+JHt0aWxlLnRpdGxlfTwvaDM+CiAgICAgICAgICAke3RpbGUuaWNvbiA/IGIyYAogICAgICAgICAgICA8ZGVlcy1pY29uIGNsYXNzPSJ0aWxlLWljb24iIC5pY29uPSR7dGlsZS5pY29ufSBzaXplPSJzbWFsbCI+PC9kZWVzLWljb24+CiAgICAgICAgICBgIDogIiJ9CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0idGlsZS1jb250ZW50Ij4KICAgICAgICAgICR7dGhpcy5yZW5kZXJUaWxlQ29udGVudCh0aWxlKX0KICAgICAgICA8L2Rpdj4KICAgICAgICAKICAgICAgICAke3RpbGUuZGVzY3JpcHRpb24gJiYgdGlsZS50eXBlICE9PSAidHJlbmQiID8gYjJgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aWxlLWRlc2NyaXB0aW9uIj4ke3RpbGUuZGVzY3JpcHRpb259PC9kaXY+CiAgICAgICAgYCA6ICIifQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJUaWxlQ29udGVudCh0aWxlKSB7CiAgICAgIHN3aXRjaCAodGlsZS50eXBlKSB7CiAgICAgICAgY2FzZSAibnVtYmVyIjoKICAgICAgICAgIHJldHVybiBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9InRpbGUtdmFsdWUiIHN0eWxlPSIke3RpbGUuY29sb3IgPyBgY29sb3I6ICR7dGlsZS5jb2xvcn1gIDogIiJ9Ij4KICAgICAgICAgICAgPHNwYW4+JHt0aWxlLnZhbHVlfTwvc3Bhbj4KICAgICAgICAgICAgJHt0aWxlLnVuaXQgPyBiMmA8c3BhbiBjbGFzcz0idGlsZS11bml0Ij4ke3RpbGUudW5pdH08L3NwYW4+YCA6ICIifQogICAgICAgICAgPC9kaXY+CiAgICAgICAgYDsKICAgICAgICBjYXNlICJnYXVnZSI6CiAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJHYXVnZSh0aWxlKTsKICAgICAgICBjYXNlICJwZXJjZW50YWdlIjoKICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlclBlcmNlbnRhZ2UodGlsZSk7CiAgICAgICAgY2FzZSAidHJlbmQiOgogICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyVHJlbmQodGlsZSk7CiAgICAgICAgY2FzZSAibXVsdGlQZXJjZW50YWdlIjoKICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlck11bHRpUGVyY2VudGFnZSh0aWxlKTsKICAgICAgICBjYXNlICJjcHVDb3JlcyI6CiAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJDcHVDb3Jlcyh0aWxlKTsKICAgICAgICBjYXNlICJwYXJ0aXRpb24iOgogICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyUGFydGl0aW9uKHRpbGUpOwogICAgICAgIGNhc2UgImRpc2siOgogICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRGlzayh0aWxlKTsKICAgICAgICBjYXNlICJ0ZXh0IjoKICAgICAgICAgIHJldHVybiBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9InRleHQtdmFsdWUiIHN0eWxlPSIke3RpbGUuY29sb3IgPyBgY29sb3I6ICR7dGlsZS5jb2xvcn1gIDogIiJ9Ij4KICAgICAgICAgICAgJHt0aWxlLnZhbHVlfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgYDsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIGIyYDxkaXYgY2xhc3M9InRpbGUtdmFsdWUiPiR7dGlsZS52YWx1ZX08L2Rpdj5gOwogICAgICB9CiAgICB9CiAgICByZW5kZXJHYXVnZSh0aWxlKSB7CiAgICAgIGNvbnN0IHZhbHVlMiA9IHR5cGVvZiB0aWxlLnZhbHVlID09PSAibnVtYmVyIiA/IHRpbGUudmFsdWUgOiBwYXJzZUZsb2F0KHRpbGUudmFsdWUpOwogICAgICBjb25zdCBvcHRpb25zID0gdGlsZS5nYXVnZU9wdGlvbnMgfHwgeyBtaW46IDAsIG1heDogMTAwIH07CiAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAodmFsdWUyIC0gb3B0aW9ucy5taW4pIC8gKG9wdGlvbnMubWF4IC0gb3B0aW9ucy5taW4pICogMTAwOwogICAgICBjb25zdCB3aWR0aCA9IDEyMDsKICAgICAgY29uc3QgaGVpZ2h0ID0gNzA7CiAgICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gNjsKICAgICAgY29uc3QgcGFkZGluZyA9IHN0cm9rZVdpZHRoIC8gMiArIDI7CiAgICAgIGNvbnN0IHJhZGl1cyA9IDQwOwogICAgICBjb25zdCBjZW50ZXJYID0gd2lkdGggLyAyOwogICAgICBjb25zdCBjZW50ZXJZID0gaGVpZ2h0IC0gcGFkZGluZzsKICAgICAgY29uc3Qgc3RhcnRYID0gY2VudGVyWCAtIHJhZGl1czsKICAgICAgY29uc3Qgc3RhcnRZID0gY2VudGVyWTsKICAgICAgY29uc3QgZW5kWCA9IGNlbnRlclggKyByYWRpdXM7CiAgICAgIGNvbnN0IGVuZFkgPSBjZW50ZXJZOwogICAgICBjb25zdCBhcmNQYXRoID0gYE0gJHtzdGFydFh9ICR7c3RhcnRZfSBBICR7cmFkaXVzfSAke3JhZGl1c30gMCAwIDEgJHtlbmRYfSAke2VuZFl9YDsKICAgICAgY29uc3QgY2lyY3VtZmVyZW5jZSA9IE1hdGguUEkgKiByYWRpdXM7CiAgICAgIGNvbnN0IHN0cm9rZURhc2hvZmZzZXQgPSBjaXJjdW1mZXJlbmNlIC0gY2lyY3VtZmVyZW5jZSAqIHBlcmNlbnRhZ2UgLyAxMDA7CiAgICAgIGxldCBzdHJva2VDb2xvciA9IHRpbGUuY29sb3IgfHwgY3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjMgMjUlIDI4LjglKSIsICJoc2woMjEwIDQwJSA3OCUpIik7CiAgICAgIGlmIChvcHRpb25zLnRocmVzaG9sZHMpIHsKICAgICAgICBjb25zdCBzb3J0ZWRUaHJlc2hvbGRzID0gWy4uLm9wdGlvbnMudGhyZXNob2xkc10uc29ydCgoYTUsIGI2KSA9PiBiNi52YWx1ZSAtIGE1LnZhbHVlKTsKICAgICAgICBmb3IgKGNvbnN0IHRocmVzaG9sZCBvZiBzb3J0ZWRUaHJlc2hvbGRzKSB7CiAgICAgICAgICBpZiAodmFsdWUyID49IHRocmVzaG9sZC52YWx1ZSkgewogICAgICAgICAgICBzdHJva2VDb2xvciA9IHRocmVzaG9sZC5jb2xvcjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iZ2F1Z2Utd3JhcHBlciI+CiAgICAgICAgPGRpdiBjbGFzcz0iZ2F1Z2UtY29udGFpbmVyIj4KICAgICAgICAgIDxzdmcgY2xhc3M9ImdhdWdlLXN2ZyIgdmlld0JveD0iMCAwICR7d2lkdGh9ICR7aGVpZ2h0fSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCI+CiAgICAgICAgICAgIDwhLS0gQmFja2dyb3VuZCBhcmMgLS0+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgY2xhc3M9ImdhdWdlLWJhY2tncm91bmQiCiAgICAgICAgICAgICAgZD0iJHthcmNQYXRofSIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPCEtLSBGaWxsZWQgYXJjIC0tPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGNsYXNzPSJnYXVnZS1maWxsIgogICAgICAgICAgICAgIGQ9IiR7YXJjUGF0aH0iCiAgICAgICAgICAgICAgc3Ryb2tlPSIke3N0cm9rZUNvbG9yfSIKICAgICAgICAgICAgICBzdHJva2UtZGFzaGFycmF5PSIke2NpcmN1bWZlcmVuY2V9IgogICAgICAgICAgICAgIHN0cm9rZS1kYXNob2Zmc2V0PSIke3N0cm9rZURhc2hvZmZzZXR9IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8IS0tIFZhbHVlIHRleHQgLS0+CiAgICAgICAgICAgIDx0ZXh0IGNsYXNzPSJnYXVnZS10ZXh0IiB4PSIke2NlbnRlclh9IiB5PSIke2NlbnRlclkgLSA4fSIgZG9taW5hbnQtYmFzZWxpbmU9Im1pZGRsZSI+CiAgICAgICAgICAgICAgPHRzcGFuPiR7dmFsdWUyfTwvdHNwYW4+JHt0aWxlLnVuaXQgPyBiMmA8dHNwYW4gY2xhc3M9ImdhdWdlLXVuaXQiIGR4PSIyIiBkeT0iMCI+JHt0aWxlLnVuaXR9PC90c3Bhbj5gIDogIiJ9CiAgICAgICAgICAgIDwvdGV4dD4KICAgICAgICAgIDwvc3ZnPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJQZXJjZW50YWdlKHRpbGUpIHsKICAgICAgY29uc3QgdmFsdWUyID0gdHlwZW9mIHRpbGUudmFsdWUgPT09ICJudW1iZXIiID8gdGlsZS52YWx1ZSA6IHBhcnNlRmxvYXQodGlsZS52YWx1ZSk7CiAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsIHZhbHVlMikpOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InBlcmNlbnRhZ2Utd3JhcHBlciI+CiAgICAgICAgPGRpdiBjbGFzcz0icGVyY2VudGFnZS12YWx1ZSI+JHtwZXJjZW50YWdlfSU8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJwZXJjZW50YWdlLWJhciI+CiAgICAgICAgICA8ZGl2IAogICAgICAgICAgICBjbGFzcz0icGVyY2VudGFnZS1maWxsIiAKICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAke3BlcmNlbnRhZ2V9JTsgJHt0aWxlLmNvbG9yID8gYGJhY2tncm91bmQ6ICR7dGlsZS5jb2xvcn1gIDogIiJ9IgogICAgICAgICAgPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJUcmVuZCh0aWxlKSB7CiAgICAgIGlmICghdGlsZS50cmVuZERhdGEgfHwgdGlsZS50cmVuZERhdGEubGVuZ3RoIDwgMikgewogICAgICAgIHJldHVybiBiMmA8ZGl2IGNsYXNzPSJ0aWxlLXZhbHVlIj4ke3RpbGUudmFsdWV9PC9kaXY+YDsKICAgICAgfQogICAgICBjb25zdCBkYXRhID0gdGlsZS50cmVuZERhdGE7CiAgICAgIGNvbnN0IG1heDMgPSBNYXRoLm1heCguLi5kYXRhKTsKICAgICAgY29uc3QgbWluMyA9IE1hdGgubWluKC4uLmRhdGEpOwogICAgICBjb25zdCByYW5nZTIgPSBtYXgzIC0gbWluMyB8fCAxOwogICAgICBjb25zdCB3aWR0aCA9IDMwMDsKICAgICAgY29uc3QgaGVpZ2h0ID0gMzI7CiAgICAgIGNvbnN0IHBhZGRpbmcgPSAyOwogICAgICBjb25zdCBwb2ludHMgPSBkYXRhLm1hcCgodmFsdWUyLCBpbmRleDIpID0+IHsKICAgICAgICBjb25zdCB4NCA9IGluZGV4MiAvIChkYXRhLmxlbmd0aCAtIDEpICogd2lkdGg7CiAgICAgICAgY29uc3QgeTUgPSBwYWRkaW5nICsgKGhlaWdodCAtIDIgKiBwYWRkaW5nKSAtICh2YWx1ZTIgLSBtaW4zKSAvIHJhbmdlMiAqIChoZWlnaHQgLSAyICogcGFkZGluZyk7CiAgICAgICAgcmV0dXJuIGAke3g0fSwke3k1fWA7CiAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgY29uc3QgYXJlYVBvaW50cyA9IGAwLCR7aGVpZ2h0fSAke3BvaW50c30gJHt3aWR0aH0sJHtoZWlnaHR9YDsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJ0cmVuZC1jb250YWluZXIiPgogICAgICAgIDxkaXYgY2xhc3M9InRyZW5kLWhlYWRlciI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0idHJlbmQtdmFsdWUiPiR7dGlsZS52YWx1ZX08L3NwYW4+CiAgICAgICAgICAke3RpbGUudW5pdCA/IGIyYDxzcGFuIGNsYXNzPSJ0cmVuZC11bml0Ij4ke3RpbGUudW5pdH08L3NwYW4+YCA6ICIifQogICAgICAgICAgJHt0aWxlLmRlc2NyaXB0aW9uID8gYjJgPHNwYW4gY2xhc3M9InRyZW5kLWxhYmVsIj4ke3RpbGUuZGVzY3JpcHRpb259PC9zcGFuPmAgOiAiIn0KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0cmVuZC1ncmFwaCI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJ0cmVuZC1zdmciIHZpZXdCb3g9IjAgMCAke3dpZHRofSAke2hlaWdodH0iIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPgogICAgICAgICAgICA8cG9seWdvbiBjbGFzcz0idHJlbmQtYXJlYSIgcG9pbnRzPSIke2FyZWFQb2ludHN9IiAvPgogICAgICAgICAgICA8cG9seWxpbmUgY2xhc3M9InRyZW5kLWxpbmUiIHBvaW50cz0iJHtwb2ludHN9IiAvPgogICAgICAgICAgPC9zdmc+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlck11bHRpUGVyY2VudGFnZSh0aWxlKSB7CiAgICAgIGlmICghdGlsZS5wZXJjZW50YWdlcyB8fCB0aWxlLnBlcmNlbnRhZ2VzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybiBiMmA8ZGl2IGNsYXNzPSJ0aWxlLXZhbHVlIj4ke3RpbGUudmFsdWV9PC9kaXY+YDsKICAgICAgfQogICAgICBjb25zdCBpdGVtcyA9IHRpbGUucGVyY2VudGFnZXMuc2xpY2UoMCwgMyk7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0ibXVsdGktcGVyY2VudGFnZS13cmFwcGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJtdWx0aS1wZXJjZW50YWdlLWl0ZW1zIj4KICAgICAgICAgICR7aXRlbXMubWFwKChpdGVtKSA9PiB7CiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9IE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgaXRlbS52YWx1ZSkpOwogICAgICAgIHJldHVybiBiMmAKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtdWx0aS1wZXJjZW50YWdlLWl0ZW0iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibXVsdGktcGVyY2VudGFnZS1oZWFkZXIiPgogICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibXVsdGktcGVyY2VudGFnZS1sYWJlbCI+JHtpdGVtLmxhYmVsfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im11bHRpLXBlcmNlbnRhZ2UtdmFsdWUiPiR7cGVyY2VudGFnZX0lPC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtdWx0aS1wZXJjZW50YWdlLWJhciI+CiAgICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgICBjbGFzcz0ibXVsdGktcGVyY2VudGFnZS1maWxsIgogICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogJHtwZXJjZW50YWdlfSU7ICR7aXRlbS5jb2xvciA/IGBiYWNrZ3JvdW5kOiAke2l0ZW0uY29sb3J9YCA6ICIifSIKICAgICAgICAgICAgICAgICAgPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIGA7CiAgICAgIH0pfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJDcHVDb3Jlcyh0aWxlKSB7CiAgICAgIGlmICghdGlsZS5jb3Jlc0RhdGEgfHwgdGlsZS5jb3Jlc0RhdGEubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIGIyYDxkaXYgY2xhc3M9InRpbGUtdmFsdWUiPiR7dGlsZS52YWx1ZX08L2Rpdj5gOwogICAgICB9CiAgICAgIGNvbnN0IGNvcmVzID0gdGlsZS5jb3Jlc0RhdGE7CiAgICAgIGNvbnN0IGF2Z1VzYWdlID0gTWF0aC5yb3VuZChjb3Jlcy5yZWR1Y2UoKHN1bSwgY29yZTIpID0+IHN1bSArIGNvcmUyLnVzYWdlLCAwKSAvIGNvcmVzLmxlbmd0aCk7CiAgICAgIGNvbnN0IGdldENvbG9yQ2xhc3MgPSAodXNhZ2UpID0+IHsKICAgICAgICBpZiAodXNhZ2UgPCA1MCkKICAgICAgICAgIHJldHVybiAibG93IjsKICAgICAgICBpZiAodXNhZ2UgPCA4MCkKICAgICAgICAgIHJldHVybiAibWVkaXVtIjsKICAgICAgICByZXR1cm4gImhpZ2giOwogICAgICB9OwogICAgICBjb25zdCBtYXhCYXJzV2lkdGggPSBjb3Jlcy5sZW5ndGggKiAyNCArIChjb3Jlcy5sZW5ndGggLSAxKSAqIDM7CiAgICAgIGNvbnN0IGNvbHVtblNwYW4gPSB0aWxlLmNvbHVtblNwYW4gfHwgMTsKICAgICAgY29uc3QgZXN0aW1hdGVkVGlsZVdpZHRoID0gdGhpcy5taW5UaWxlV2lkdGggKiBjb2x1bW5TcGFuICsgKGNvbHVtblNwYW4gLSAxKSAqIHRoaXMuZ2FwIC0gMzI7CiAgICAgIGNvbnN0IHNob3VsZENlbnRlciA9IG1heEJhcnNXaWR0aCA8IGVzdGltYXRlZFRpbGVXaWR0aCAqIDAuNjY2OwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImNwdS1jb3Jlcy13cmFwcGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjcHUtY29yZXMtaGVhZGVyIj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJjcHUtY29yZXMtdmFsdWUiPiR7YXZnVXNhZ2V9PC9zcGFuPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImNwdS1jb3Jlcy11bml0Ij4lPC9zcGFuPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImNwdS1jb3Jlcy1sYWJlbCI+JHtjb3Jlcy5sZW5ndGh9IGNvcmVzPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNwdS1jb3Jlcy1iYXJzICR7c2hvdWxkQ2VudGVyID8gImNlbnRlcmVkIiA6ICIifSI+CiAgICAgICAgICAke2NvcmVzLm1hcCgoY29yZTIpID0+IHsKICAgICAgICBjb25zdCB1c2FnZSA9IE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgY29yZTIudXNhZ2UpKTsKICAgICAgICBjb25zdCBjb2xvckNsYXNzID0gZ2V0Q29sb3JDbGFzcyh1c2FnZSk7CiAgICAgICAgcmV0dXJuIGIyYAogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNwdS1jb3JlLWJhci1jb250YWluZXIiIHRpdGxlPSJDb3JlICR7Y29yZTIubGFiZWwgfHwgY29yZTIuaWR9OiAke3VzYWdlfSUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY3B1LWNvcmUtYmFyLXdyYXBwZXIiPgogICAgICAgICAgICAgICAgICA8ZGl2CiAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImNwdS1jb3JlLWJhci1maWxsICR7Y29sb3JDbGFzc30iCiAgICAgICAgICAgICAgICAgICAgc3R5bGU9ImhlaWdodDogJHt1c2FnZX0lIgogICAgICAgICAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICR7Y29yZXMubGVuZ3RoIDw9IDE2ID8gYjJgCiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjcHUtY29yZS1sYWJlbCI+JHtjb3JlMi5sYWJlbCB8fCBjb3JlMi5pZH08L3NwYW4+CiAgICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIGA7CiAgICAgIH0pfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBmb3JtYXRCeXRlcyhieXRlcykgewogICAgICBpZiAoYnl0ZXMgPT09IDApCiAgICAgICAgcmV0dXJuICIwIEIiOwogICAgICBjb25zdCBrNSA9IDEwMjQ7CiAgICAgIGNvbnN0IHNpemVzID0gWyJCIiwgIktCIiwgIk1CIiwgIkdCIiwgIlRCIiwgIlBCIl07CiAgICAgIGNvbnN0IGkxMSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coazUpKTsKICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoKGJ5dGVzIC8gTWF0aC5wb3coazUsIGkxMSkpLnRvRml4ZWQoMSkpICsgIiAiICsgc2l6ZXNbaTExXTsKICAgIH0KICAgIHJlbmRlclBhcnRpdGlvbih0aWxlKSB7CiAgICAgIGlmICghdGlsZS5wYXJ0aXRpb25EYXRhKSB7CiAgICAgICAgcmV0dXJuIGIyYDxkaXYgY2xhc3M9InRpbGUtdmFsdWUiPiR7dGlsZS52YWx1ZX08L2Rpdj5gOwogICAgICB9CiAgICAgIGNvbnN0IHsgdXNlZCwgdG90YWwsIGZpbGVzeXN0ZW0sIG1vdW50UG9pbnQgfSA9IHRpbGUucGFydGl0aW9uRGF0YTsKICAgICAgY29uc3QgcGVyY2VudGFnZSA9IE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgdXNlZCAvIHRvdGFsICogMTAwKSk7CiAgICAgIGNvbnN0IGZyZWUgPSB0b3RhbCAtIHVzZWQ7CiAgICAgIGNvbnN0IGdldENvbG9yQ2xhc3MgPSAoKSA9PiB7CiAgICAgICAgaWYgKHBlcmNlbnRhZ2UgPj0gOTApCiAgICAgICAgICByZXR1cm4gImNyaXRpY2FsIjsKICAgICAgICBpZiAocGVyY2VudGFnZSA+PSA3NSkKICAgICAgICAgIHJldHVybiAid2FybmluZyI7CiAgICAgICAgcmV0dXJuICIiOwogICAgICB9OwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InBhcnRpdGlvbi13cmFwcGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJwYXJ0aXRpb24taGVhZGVyIj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJwYXJ0aXRpb24tcGVyY2VudGFnZSI+JHtNYXRoLnJvdW5kKHBlcmNlbnRhZ2UpfSU8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0icGFydGl0aW9uLWJhciI+CiAgICAgICAgICA8ZGl2CiAgICAgICAgICAgIGNsYXNzPSJwYXJ0aXRpb24tYmFyLWZpbGwgJHtnZXRDb2xvckNsYXNzKCl9IgogICAgICAgICAgICBzdHlsZT0id2lkdGg6ICR7cGVyY2VudGFnZX0lIgogICAgICAgICAgPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InBhcnRpdGlvbi1zdGF0cyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwYXJ0aXRpb24tc3RhdCI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwYXJ0aXRpb24tc3RhdC1sYWJlbCI+VXNlZDwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InBhcnRpdGlvbi1zdGF0LXZhbHVlIj4ke3RoaXMuZm9ybWF0Qnl0ZXModXNlZCl9PC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwYXJ0aXRpb24tc3RhdCI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwYXJ0aXRpb24tc3RhdC1sYWJlbCI+RnJlZTwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InBhcnRpdGlvbi1zdGF0LXZhbHVlIj4ke3RoaXMuZm9ybWF0Qnl0ZXMoZnJlZSl9PC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0icGFydGl0aW9uLW1ldGEiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InBhcnRpdGlvbi1maWxlc3lzdGVtIj4ke2ZpbGVzeXN0ZW19PC9zcGFuPgogICAgICAgICAgJHttb3VudFBvaW50ID8gYjJgPHNwYW4gY2xhc3M9InBhcnRpdGlvbi1tb3VudHBvaW50Ij4ke21vdW50UG9pbnR9PC9zcGFuPmAgOiAiIn0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgcmVuZGVyRGlzayh0aWxlKSB7CiAgICAgIGlmICghdGlsZS5kaXNrRGF0YSkgewogICAgICAgIHJldHVybiBiMmA8ZGl2IGNsYXNzPSJ0aWxlLXZhbHVlIj4ke3RpbGUudmFsdWV9PC9kaXY+YDsKICAgICAgfQogICAgICBjb25zdCB7IGNhcGFjaXR5LCBtb2RlbCwgdHlwZTogdHlwZTUsIGlvcHMsIGhlYWx0aCB9ID0gdGlsZS5kaXNrRGF0YTsKICAgICAgY29uc3QgZ2V0SGVhbHRoQ2xhc3MgPSAodmFsdWUyKSA9PiB7CiAgICAgICAgaWYgKHZhbHVlMiA+PSA3MCkKICAgICAgICAgIHJldHVybiAiZ29vZCI7CiAgICAgICAgaWYgKHZhbHVlMiA+PSAzMCkKICAgICAgICAgIHJldHVybiAid2FybmluZyI7CiAgICAgICAgcmV0dXJuICJjcml0aWNhbCI7CiAgICAgIH07CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iZGlzay13cmFwcGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkaXNrLWNhcGFjaXR5Ij4ke3RoaXMuZm9ybWF0Qnl0ZXMoY2FwYWNpdHkpfTwvZGl2PgogICAgICAgICR7bW9kZWwgfHwgdHlwZTUgPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9ImRpc2stbW9kZWwiPgogICAgICAgICAgICAke21vZGVsID8gYjJgPHNwYW4+JHttb2RlbH08L3NwYW4+YCA6ICIifQogICAgICAgICAgICAke3R5cGU1ID8gYjJgPHNwYW4gY2xhc3M9ImRpc2stdHlwZS1iYWRnZSI+JHt0eXBlNX08L3NwYW4+YCA6ICIifQogICAgICAgICAgPC9kaXY+CiAgICAgICAgYCA6ICIifQogICAgICAgIDxkaXYgY2xhc3M9ImRpc2stbWV0cmljcyI+CiAgICAgICAgICAke2lvcHMgPyBiMmAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlzay1pb3BzIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaXNrLWlvcHMtaXRlbSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGlzay1pb3BzLWxhYmVsIj5SZWFkPC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRpc2staW9wcy12YWx1ZSI+JHtpb3BzLnJlYWQudG9Mb2NhbGVTdHJpbmcoKX08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlzay1pb3BzLWl0ZW0iPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRpc2staW9wcy1sYWJlbCI+V3JpdGU8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGlzay1pb3BzLXZhbHVlIj4ke2lvcHMud3JpdGUudG9Mb2NhbGVTdHJpbmcoKX08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYCA6ICIifQogICAgICAgICAgJHtoZWFsdGggIT09IHZvaWQgMCA/IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaXNrLWhlYWx0aCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlzay1oZWFsdGgtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkaXNrLWhlYWx0aC1sYWJlbCI+SGVhbHRoPC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRpc2staGVhbHRoLXZhbHVlIj4ke2hlYWx0aH0lPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpc2staGVhbHRoLWJhciI+CiAgICAgICAgICAgICAgICA8ZGl2CiAgICAgICAgICAgICAgICAgIGNsYXNzPSJkaXNrLWhlYWx0aC1maWxsICR7Z2V0SGVhbHRoQ2xhc3MoaGVhbHRoKX0iCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogJHtoZWFsdGh9JSIKICAgICAgICAgICAgICAgID48L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgIDogIiJ9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGFzeW5jIGhhbmRsZUdyaWRBY3Rpb24oYWN0aW9uKSB7CiAgICAgIGlmIChhY3Rpb24uYWN0aW9uKSB7CiAgICAgICAgYXdhaXQgYWN0aW9uLmFjdGlvbigpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBoYW5kbGVUaWxlQWN0aW9uKGFjdGlvbiwgX3RpbGUpIHsKICAgICAgaWYgKGFjdGlvbi5hY3Rpb24pIHsKICAgICAgICBhd2FpdCBhY3Rpb24uYWN0aW9uKCk7CiAgICAgIH0KICAgIH0KICAgIHNob3dDb250ZXh0TWVudShldmVudCwgdGlsZSkgewogICAgICBpZiAoIXRpbGUuYWN0aW9ucyB8fCB0aWxlLmFjdGlvbnMubGVuZ3RoID09PSAwKQogICAgICAgIHJldHVybjsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy5jb250ZXh0TWVudVBvc2l0aW9uID0geyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH07CiAgICAgIHRoaXMuY29udGV4dE1lbnVBY3Rpb25zID0gdGlsZS5hY3Rpb25zOwogICAgICB0aGlzLmNvbnRleHRNZW51VmlzaWJsZSA9IHRydWU7CiAgICAgIGNvbnN0IGNsb3NlSGFuZGxlciA9ICgpID0+IHsKICAgICAgICB0aGlzLmNvbnRleHRNZW51VmlzaWJsZSA9IGZhbHNlOwogICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIiwgY2xvc2VIYW5kbGVyKTsKICAgICAgfTsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBjbG9zZUhhbmRsZXIpOwogICAgICB9LCAxMDApOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM0MyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1N0YXRzR3JpZDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWFwcHVpL2RlZXMtYXBwdWkvZGVlcy1hcHB1aS5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBfX2VzRGVjb3JhdGU0MyA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNDQgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlbW9EYXNoYm9hcmRWaWV3ID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZW1vLWRhc2hib2FyZC12aWV3IildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfYWN0aXZhdGVkX2RlY29yYXRvcnM7CiAgbGV0IF9hY3RpdmF0ZWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY3RpdmF0ZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVtb0Rhc2hib2FyZFZpZXcyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfYWN0aXZhdGVkX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTQzKHRoaXMsIG51bGwsIF9hY3RpdmF0ZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYWN0aXZhdGVkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhY3RpdmF0ZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWN0aXZhdGVkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hY3RpdmF0ZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYWN0aXZhdGVkX2luaXRpYWxpemVycywgX2FjdGl2YXRlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQzKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVtb0Rhc2hib2FyZFZpZXcyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgICAgX19ydW5Jbml0aWFsaXplcnM0NChfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICAjYWN0aXZhdGVkX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczQ0KHRoaXMsIF9hY3RpdmF0ZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSk7CiAgICBnZXQgYWN0aXZhdGVkKCkgewogICAgICByZXR1cm4gdGhpcy4jYWN0aXZhdGVkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYWN0aXZhdGVkKHZhbHVlMikgewogICAgICB0aGlzLiNhY3RpdmF0ZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGN0eCA9IF9fcnVuSW5pdGlhbGl6ZXJzNDQodGhpcywgX2FjdGl2YXRlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICBzdGF0c1RpbGVzID0gWwogICAgICB7CiAgICAgICAgaWQ6ICJ1c2VycyIsCiAgICAgICAgdGl0bGU6ICJBY3RpdmUgVXNlcnMiLAogICAgICAgIHZhbHVlOiAxMjM0LAogICAgICAgIHR5cGU6ICJudW1iZXIiLAogICAgICAgIGljb246ICJsdWNpZGU6dXNlcnMiLAogICAgICAgIGRlc2NyaXB0aW9uOiAiT25saW5lIG5vdyIsCiAgICAgICAgY29sb3I6ICIjMjJjNTVlIgogICAgICB9LAogICAgICB7CiAgICAgICAgaWQ6ICJhcGktY2FsbHMiLAogICAgICAgIHRpdGxlOiAiQVBJIENhbGxzIiwKICAgICAgICB2YWx1ZTogNDUyMDAsCiAgICAgICAgdHlwZTogInRyZW5kIiwKICAgICAgICBpY29uOiAibHVjaWRlOmFjdGl2aXR5IiwKICAgICAgICBkZXNjcmlwdGlvbjogIisxMiUgZnJvbSBsYXN0IGhvdXIiLAogICAgICAgIGNvbG9yOiAiIzNiODJmNiIsCiAgICAgICAgdHJlbmREYXRhOiBbMzJlMywgMzVlMywgMzhlMywgNDFlMywgMzllMywgNDJlMywgNDUyMDBdCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpZDogImhlYWx0aCIsCiAgICAgICAgdGl0bGU6ICJTeXN0ZW0gSGVhbHRoIiwKICAgICAgICB2YWx1ZTogOTkuOSwKICAgICAgICB1bml0OiAiJSIsCiAgICAgICAgdHlwZTogImdhdWdlIiwKICAgICAgICBpY29uOiAibHVjaWRlOmhlYXJ0LXB1bHNlIiwKICAgICAgICBkZXNjcmlwdGlvbjogIkFsbCBzeXN0ZW1zIG9wZXJhdGlvbmFsIiwKICAgICAgICBjb2xvcjogIiMxMGI5ODEiLAogICAgICAgIGdhdWdlT3B0aW9uczogewogICAgICAgICAgbWluOiAwLAogICAgICAgICAgbWF4OiAxMDAsCiAgICAgICAgICB0aHJlc2hvbGRzOiBbCiAgICAgICAgICAgIHsgdmFsdWU6IDgwLCBjb2xvcjogIiNlZjQ0NDQiIH0sCiAgICAgICAgICAgIHsgdmFsdWU6IDk1LCBjb2xvcjogIiNmNTllMGIiIH0sCiAgICAgICAgICAgIHsgdmFsdWU6IDEwMCwgY29sb3I6ICIjMTBiOTgxIiB9CiAgICAgICAgICBdCiAgICAgICAgfQogICAgICB9LAogICAgICB7CiAgICAgICAgaWQ6ICJyZXNwb25zZSIsCiAgICAgICAgdGl0bGU6ICJBdmcgUmVzcG9uc2UiLAogICAgICAgIHZhbHVlOiAxMjcsCiAgICAgICAgdW5pdDogIm1zIiwKICAgICAgICB0eXBlOiAibnVtYmVyIiwKICAgICAgICBpY29uOiAibHVjaWRlOnRpbWVyIiwKICAgICAgICBkZXNjcmlwdGlvbjogIi0xNW1zIGZyb20geWVzdGVyZGF5IiwKICAgICAgICBjb2xvcjogIiM4YjVjZjYiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpZDogInJlc291cmNlcyIsCiAgICAgICAgdGl0bGU6ICJSZXNvdXJjZSBVc2FnZSIsCiAgICAgICAgdmFsdWU6ICIiLAogICAgICAgIHR5cGU6ICJtdWx0aVBlcmNlbnRhZ2UiLAogICAgICAgIGljb246ICJsdWNpZGU6c2VydmVyIiwKICAgICAgICBwZXJjZW50YWdlczogWwogICAgICAgICAgeyBsYWJlbDogIkNQVSIsIHZhbHVlOiA2NywgY29sb3I6ICIjM2I4MmY2IiB9LAogICAgICAgICAgeyBsYWJlbDogIk1lbW9yeSIsIHZhbHVlOiA4NCwgY29sb3I6ICIjOGI1Y2Y2IiB9LAogICAgICAgICAgeyBsYWJlbDogIkRpc2siLCB2YWx1ZTogNDUsIGNvbG9yOiAiIzEwYjk4MSIgfQogICAgICAgIF0KICAgICAgfSwKICAgICAgewogICAgICAgIGlkOiAicmVxdWVzdHMiLAogICAgICAgIHRpdGxlOiAiUmVxdWVzdHMvc2VjIiwKICAgICAgICB2YWx1ZTogMTg1MCwKICAgICAgICB0eXBlOiAidHJlbmQiLAogICAgICAgIGljb246ICJsdWNpZGU6emFwIiwKICAgICAgICBkZXNjcmlwdGlvbjogIkN1cnJlbnQgdGhyb3VnaHB1dCIsCiAgICAgICAgY29sb3I6ICIjMDZiNmQ0IiwKICAgICAgICB0cmVuZERhdGE6IFsxMjAwLCAxNDAwLCAxMzUwLCAxNjAwLCAxNzUwLCAxNjgwLCAxODUwXQogICAgICB9CiAgICBdOwogICAgb25BY3RpdmF0ZShjb250ZXh0MikgewogICAgICB0aGlzLmN0eCA9IGNvbnRleHQyOwogICAgICB0aGlzLmFjdGl2YXRlZCA9IHRydWU7CiAgICAgIGNvbnNvbGUubG9nKCJEYXNoYm9hcmQgYWN0aXZhdGVkIHdpdGggY29udGV4dDoiLCBjb250ZXh0Mik7CiAgICAgIGNvbnRleHQyLmFwcHVpLnNldFNlY29uZGFyeU1lbnUoewogICAgICAgIGhlYWRpbmc6ICJEYXNoYm9hcmQiLAogICAgICAgIGdyb3VwczogWwogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiUXVpY2sgQWNjZXNzIiwKICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6emFwIiwKICAgICAgICAgICAgaXRlbXM6IFsKICAgICAgICAgICAgICB7IGtleTogIk92ZXJ2aWV3IiwgaWNvbk5hbWU6ICJsYXlvdXREYXNoYm9hcmQiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJPdmVydmlldyIpIH0sCiAgICAgICAgICAgICAgeyBrZXk6ICJSZWNlbnQiLCBpY29uTmFtZTogImNsb2NrIiwgYmFkZ2U6IDUsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIlJlY2VudCIpIH0sCiAgICAgICAgICAgICAgeyB0eXBlOiAiZGl2aWRlciIgfSwKICAgICAgICAgICAgICB7IHR5cGU6ICJhY3Rpb24iLCBrZXk6ICJSZWZyZXNoIERhdGEiLCBpY29uTmFtZTogImx1Y2lkZTpyZWZyZXNoQ3ciLCBhY3Rpb246ICgpID0+IGFsZXJ0KCJSZWZyZXNoaW5nIGRhc2hib2FyZCBkYXRhLi4uIikgfQogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiRmlsdGVycyIsCiAgICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmZpbHRlciIsCiAgICAgICAgICAgIGl0ZW1zOiBbCiAgICAgICAgICAgICAgeyB0eXBlOiAiaGVhZGVyIiwgbGFiZWw6ICJUaW1lIFJhbmdlIiB9LAogICAgICAgICAgICAgIHsgdHlwZTogImZpbHRlciIsIGtleTogIkxpdmUgVXBkYXRlcyIsIGljb25OYW1lOiAibHVjaWRlOnJhZGlvIiwgYWN0aXZlOiB0cnVlLCBvblRvZ2dsZTogKGFjdGl2ZSkgPT4gY29uc29sZS5sb2coIkxpdmUgdXBkYXRlczoiLCBhY3RpdmUpIH0sCiAgICAgICAgICAgICAgeyB0eXBlOiAiZmlsdGVyIiwga2V5OiAiU2hvdyBBcmNoaXZlZCIsIGljb25OYW1lOiAibHVjaWRlOmFyY2hpdmUiLCBhY3RpdmU6IGZhbHNlLCBvblRvZ2dsZTogKGFjdGl2ZSkgPT4gY29uc29sZS5sb2coIlNob3cgYXJjaGl2ZWQ6IiwgYWN0aXZlKSB9LAogICAgICAgICAgICAgIHsgdHlwZTogImRpdmlkZXIiIH0sCiAgICAgICAgICAgICAgeyB0eXBlOiAibXVsdGlGaWx0ZXIiLCBrZXk6ICJEYXRhIFNvdXJjZXMiLCBpY29uTmFtZTogImx1Y2lkZTpkYXRhYmFzZSIsIG9wdGlvbnM6IFsKICAgICAgICAgICAgICAgIHsga2V5OiAiYXBpIiwgbGFiZWw6ICJBUEkgU2VydmVyIiwgY2hlY2tlZDogdHJ1ZSwgaWNvbk5hbWU6ICJsdWNpZGU6c2VydmVyIiB9LAogICAgICAgICAgICAgICAgeyBrZXk6ICJ3ZWIiLCBsYWJlbDogIldlYiBUcmFmZmljIiwgY2hlY2tlZDogdHJ1ZSwgaWNvbk5hbWU6ICJsdWNpZGU6Z2xvYmUiIH0sCiAgICAgICAgICAgICAgICB7IGtleTogIm1vYmlsZSIsIGxhYmVsOiAiTW9iaWxlIEFwcCIsIGNoZWNrZWQ6IGZhbHNlLCBpY29uTmFtZTogImx1Y2lkZTpzbWFydHBob25lIiB9CiAgICAgICAgICAgICAgXSwgb25DaGFuZ2U6IChrZXlzMikgPT4gY29uc29sZS5sb2coIkRhdGEgc291cmNlczoiLCBrZXlzMikgfQogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiQW5hbHl0aWNzIiwKICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6YmFyQ2hhcnQzIiwKICAgICAgICAgICAgaXRlbXM6IFsKICAgICAgICAgICAgICB7IGtleTogIk1ldHJpY3MiLCBpY29uTmFtZTogImFjdGl2aXR5IiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiTWV0cmljcyIpIH0sCiAgICAgICAgICAgICAgeyBrZXk6ICJSZXBvcnRzIiwgaWNvbk5hbWU6ICJmaWxlVGV4dCIsIGJhZGdlOiAibmV3IiwgYmFkZ2VWYXJpYW50OiAic3VjY2VzcyIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIlJlcG9ydHMiKSB9LAogICAgICAgICAgICAgIHsgdHlwZTogImRpdmlkZXIiIH0sCiAgICAgICAgICAgICAgeyB0eXBlOiAibGluayIsIGtleTogIkFuYWx5dGljcyBEb2NzIiwgaWNvbk5hbWU6ICJsdWNpZGU6ZXh0ZXJuYWxMaW5rIiwgaHJlZjogImh0dHBzOi8vZG9jcy5leGFtcGxlLmNvbS9hbmFseXRpY3MiIH0KICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfSk7CiAgICAgIGNvbnRleHQyLmFwcHVpLnNldENvbnRlbnRUYWJzKFsKICAgICAgICB7IGtleTogIk92ZXJ2aWV3IiwgaWNvbk5hbWU6ICJsdWNpZGU6bGF5b3V0RGFzaGJvYXJkIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiT3ZlcnZpZXcgdGFiIikgfSwKICAgICAgICB7IGtleTogIkFuYWx5dGljcyIsIGljb25OYW1lOiAibHVjaWRlOmJhckNoYXJ0IiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiQW5hbHl0aWNzIHRhYiIpIH0sCiAgICAgICAgeyBrZXk6ICJSZXBvcnRzIiwgaWNvbk5hbWU6ICJsdWNpZGU6ZmlsZVRleHQiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJSZXBvcnRzIHRhYiIpIH0KICAgICAgXSk7CiAgICB9CiAgICBvbkRlYWN0aXZhdGUoKSB7CiAgICAgIHRoaXMuYWN0aXZhdGVkID0gZmFsc2U7CiAgICAgIGNvbnNvbGUubG9nKCJEYXNoYm9hcmQgZGVhY3RpdmF0ZWQiKTsKICAgIH0KICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8c3R5bGU+CiAgICAgICAgOmhvc3QgewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwYWRkaW5nOiA0MHB4OwogICAgICAgICAgY29sb3I6ICNhM2EzYTM7CiAgICAgICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCAnSW50ZXInLCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmOwogICAgICAgIH0KICAgICAgICBoMSB7IGNvbG9yOiAjZmFmYWZhOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDI0cHg7IG1hcmdpbi1ib3R0b206IDhweDsgfQogICAgICAgIHAgeyBjb2xvcjogIzczNzM3MzsgbWFyZ2luLWJvdHRvbTogMzJweDsgfQogICAgICAgIGRlZXMtc3RhdHNncmlkIHsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDMycHg7CiAgICAgICAgfQoKICAgICAgICAuY3R4LWFjdGlvbnMgewogICAgICAgICAgbWFyZ2luLXRvcDogMzJweDsKICAgICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMDIpOwogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjA4KTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICB9CiAgICAgICAgLmN0eC1hY3Rpb25zIGgyIHsgY29sb3I6ICNmYWZhZmE7IGZvbnQtc2l6ZTogMTZweDsgZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogMTZweDsgfQogICAgICAgIC5idXR0b24tZ3JpZCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgfQogICAgICAgIC5jdHgtYnRuIHsKICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoNTksIDEzMCwgMjQ2LCAwLjEpOwogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1OSwgMTMwLCAyNDYsIDAuMyk7CiAgICAgICAgICBjb2xvcjogIzYwYTVmYTsKICAgICAgICAgIHBhZGRpbmc6IDhweCAxNnB4OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgfQogICAgICAgIC5jdHgtYnRuOmhvdmVyIHsKICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoNTksIDEzMCwgMjQ2LCAwLjIpOwogICAgICAgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDU5LCAxMzAsIDI0NiwgMC41KTsKICAgICAgICB9CiAgICAgICAgLmN0eC1idG4uZGFuZ2VyIHsKICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjM5LCA2OCwgNjgsIDAuMSk7CiAgICAgICAgICBib3JkZXItY29sb3I6IHJnYmEoMjM5LCA2OCwgNjgsIDAuMyk7CiAgICAgICAgICBjb2xvcjogI2Y4NzE3MTsKICAgICAgICB9CiAgICAgICAgLmN0eC1idG4uZGFuZ2VyOmhvdmVyIHsKICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjM5LCA2OCwgNjgsIDAuMik7CiAgICAgICAgICBib3JkZXItY29sb3I6IHJnYmEoMjM5LCA2OCwgNjgsIDAuNSk7CiAgICAgICAgfQogICAgICAgIC5jdHgtYnRuLnN1Y2Nlc3MgewogICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgzNCwgMTk3LCA5NCwgMC4xKTsKICAgICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgzNCwgMTk3LCA5NCwgMC4zKTsKICAgICAgICAgIGNvbG9yOiAjNGFkZTgwOwogICAgICAgIH0KICAgICAgICAuY3R4LWJ0bi5zdWNjZXNzOmhvdmVyIHsKICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzQsIDE5NywgOTQsIDAuMik7CiAgICAgICAgICBib3JkZXItY29sb3I6IHJnYmEoMzQsIDE5NywgOTQsIDAuNSk7CiAgICAgICAgfQogICAgICA8L3N0eWxlPgogICAgICA8aDE+RGFzaGJvYXJkPC9oMT4KICAgICAgPHA+V2VsY29tZSBiYWNrISBIZXJlJ3MgYW4gb3ZlcnZpZXcgb2YgeW91ciBzeXN0ZW0uPC9wPgogICAgICA8ZGVlcy1zdGF0c2dyaWQKICAgICAgICAudGlsZXM9JHt0aGlzLnN0YXRzVGlsZXN9CiAgICAgICAgQHRpbGUtYWN0aW9uPSR7KGUxMSkgPT4gY29uc29sZS5sb2coIlRpbGUgYWN0aW9uOiIsIGUxMS5kZXRhaWwpfQogICAgICA+PC9kZWVzLXN0YXRzZ3JpZD4KCiAgICAgIDxkaXYgY2xhc3M9ImN0eC1hY3Rpb25zIj4KICAgICAgICA8aDI+Q29udGV4dCBBY3Rpb25zIChjdHguYXBwdWkpPC9oMj4KICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JpZCI+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdHgtYnRuIiBAY2xpY2s9JHsoKSA9PiB0aGlzLmN0eD8uYXBwdWkuc2V0TWFpbk1lbnVWaXNpYmxlKGZhbHNlKX0+SGlkZSBNYWluIE1lbnU8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0eC1idG4gc3VjY2VzcyIgQGNsaWNrPSR7KCkgPT4gdGhpcy5jdHg/LmFwcHVpLnNldE1haW5NZW51VmlzaWJsZSh0cnVlKX0+U2hvdyBNYWluIE1lbnU8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0eC1idG4iIEBjbGljaz0keygpID0+IHRoaXMuY3R4Py5hcHB1aS5zZXRTZWNvbmRhcnlNZW51VmlzaWJsZShmYWxzZSl9PkhpZGUgU2Vjb25kYXJ5IE1lbnU8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0eC1idG4gc3VjY2VzcyIgQGNsaWNrPSR7KCkgPT4gdGhpcy5jdHg/LmFwcHVpLnNldFNlY29uZGFyeU1lbnVWaXNpYmxlKHRydWUpfT5TaG93IFNlY29uZGFyeSBNZW51PC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdHgtYnRuIiBAY2xpY2s9JHsoKSA9PiB0aGlzLmN0eD8uYXBwdWkuc2V0Q29udGVudFRhYnNWaXNpYmxlKGZhbHNlKX0+SGlkZSBDb250ZW50IFRhYnM8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0eC1idG4gc3VjY2VzcyIgQGNsaWNrPSR7KCkgPT4gdGhpcy5jdHg/LmFwcHVpLnNldENvbnRlbnRUYWJzVmlzaWJsZSh0cnVlKX0+U2hvdyBDb250ZW50IFRhYnM8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0eC1idG4iIEBjbGljaz0keygpID0+IHRoaXMuY3R4Py5hcHB1aS5zZXRNYWluTWVudUNvbGxhcHNlZCh0cnVlKX0+Q29sbGFwc2UgTWFpbiBNZW51PC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdHgtYnRuIHN1Y2Nlc3MiIEBjbGljaz0keygpID0+IHRoaXMuY3R4Py5hcHB1aS5zZXRNYWluTWVudUNvbGxhcHNlZChmYWxzZSl9PkV4cGFuZCBNYWluIE1lbnU8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0eC1idG4iIEBjbGljaz0keygpID0+IHRoaXMuY3R4Py5hcHB1aS5zZXRCcmVhZGNydW1icyhbIkRhc2hib2FyZCIsICJPdmVydmlldyIsICJTdGF0cyJdKX0+U2V0IEJyZWFkY3J1bWJzPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdHgtYnRuIiBAY2xpY2s9JHsoKSA9PiB0aGlzLmN0eD8uYXBwdWkubmF2aWdhdGVUb1ZpZXcoInByb2plY3RzIil9PkdvIHRvIFByb2plY3RzPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdHgtYnRuIiBAY2xpY2s9JHsoKSA9PiB0aGlzLmN0eD8uYXBwdWkubmF2aWdhdGVUb1ZpZXcoInNldHRpbmdzIiwgeyBzZWN0aW9uOiAic2VjdXJpdHkiIH0pfT5HbyB0byBTZXR0aW5ncy9TZWN1cml0eTwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY3R4LWJ0biIgQGNsaWNrPSR7KCkgPT4gdGhpcy5jdHg/LmFwcHVpLmFjdGl2aXR5TG9nLmFkZCh7IHR5cGU6ICJjdXN0b20iLCB1c2VyOiAiRGVtbyBVc2VyIiwgbWVzc2FnZTogIkJ1dHRvbiBjbGlja2VkIGZyb20gY3R4ISIsIGljb25OYW1lOiAibHVjaWRlOm1vdXNlLXBvaW50ZXItY2xpY2siIH0pfT5BZGQgQWN0aXZpdHkgRW50cnk8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0eC1idG4iIEBjbGljaz0keygpID0+IHRoaXMuY3R4Py5hcHB1aS5zZXRNYWluTWVudUJhZGdlKCJ0YXNrcyIsIDk5KX0+U2V0IFRhc2tzIEJhZGdlIHRvIDk5PC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdHgtYnRuIGRhbmdlciIgQGNsaWNrPSR7KCkgPT4gdGhpcy5jdHg/LmFwcHVpLmNsZWFyTWFpbk1lbnVCYWRnZSgidGFza3MiKX0+Q2xlYXIgVGFza3MgQmFkZ2U8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0eC1idG4iIEBjbGljaz0keygpID0+IHRoaXMuY3R4Py5hcHB1aS5zZXRDb250ZW50VGFic0F1dG9IaWRlKHRydWUsIDEpfT5BdXRvLWhpZGUgVGFicyAo4omkMSk8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0eC1idG4gZGFuZ2VyIiBAY2xpY2s9JHsoKSA9PiB0aGlzLmN0eD8uYXBwdWkuc2V0Q29udGVudFRhYnNBdXRvSGlkZShmYWxzZSl9PkRpc2FibGUgQXV0by1oaWRlPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdHgtYnRuIHN1Y2Nlc3MiIEBjbGljaz0keygpID0+IHRoaXMuYWRkQ2xvc2VhYmxlVGFiKCl9PkFkZCBDbG9zZWFibGUgVGFiPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHRhYkNvdW50ZXIgPSAwOwogICAgYWRkQ2xvc2VhYmxlVGFiKCkgewogICAgICBpZiAoIXRoaXMuY3R4KQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy50YWJDb3VudGVyKys7CiAgICAgIGNvbnN0IHRhYktleSA9IGBUYWIgJHt0aGlzLnRhYkNvdW50ZXJ9YDsKICAgICAgdGhpcy5jdHguYXBwdWkuYWRkQ29udGVudFRhYih7CiAgICAgICAga2V5OiB0YWJLZXksCiAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6ZmlsZSIsCiAgICAgICAgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZyhgU2VsZWN0ZWQgJHt0YWJLZXl9YCksCiAgICAgICAgY2xvc2VhYmxlOiB0cnVlLAogICAgICAgIG9uQ2xvc2U6ICgpID0+IHsKICAgICAgICAgIHRoaXMuY3R4Py5hcHB1aS5yZW1vdmVDb250ZW50VGFiKHRhYktleSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9OwogIHJldHVybiBEZW1vRGFzaGJvYXJkVmlldzIgPSBfY2xhc3NUaGlzOwp9KSgpOwp2YXIgRGVtb1NldHRpbmdzVmlldyA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVtby1zZXR0aW5ncy12aWV3IildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfc2VjdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfc2VjdGlvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlY3Rpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2hhc0NoYW5nZXNfZGVjb3JhdG9yczsKICBsZXQgX2hhc0NoYW5nZXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oYXNDaGFuZ2VzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlbW9TZXR0aW5nc1ZpZXcyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfc2VjdGlvbl9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaGFzQ2hhbmdlc19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGU0Myh0aGlzLCBudWxsLCBfc2VjdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWN0aW9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWN0aW9uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlY3Rpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlY3Rpb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VjdGlvbl9pbml0aWFsaXplcnMsIF9zZWN0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDModGhpcywgbnVsbCwgX2hhc0NoYW5nZXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaGFzQ2hhbmdlcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaGFzQ2hhbmdlcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5oYXNDaGFuZ2VzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5oYXNDaGFuZ2VzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2hhc0NoYW5nZXNfaW5pdGlhbGl6ZXJzLCBfaGFzQ2hhbmdlc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQzKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVtb1NldHRpbmdzVmlldzIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgICBfX3J1bkluaXRpYWxpemVyczQ0KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgICNzZWN0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczQ0KHRoaXMsIF9zZWN0aW9uX2luaXRpYWxpemVycywgImdlbmVyYWwiKTsKICAgIGdldCBzZWN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy4jc2VjdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNlY3Rpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlY3Rpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNoYXNDaGFuZ2VzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0NCh0aGlzLCBfc2VjdGlvbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDQodGhpcywgX2hhc0NoYW5nZXNfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGhhc0NoYW5nZXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNoYXNDaGFuZ2VzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaGFzQ2hhbmdlcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaGFzQ2hhbmdlc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgYXBwdWkgPSBfX3J1bkluaXRpYWxpemVyczQ0KHRoaXMsIF9oYXNDaGFuZ2VzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIG9uQWN0aXZhdGUoY29udGV4dDIpIHsKICAgICAgdGhpcy5hcHB1aSA9IGNvbnRleHQyLmFwcHVpOwogICAgICBjb25zb2xlLmxvZygiU2V0dGluZ3MgYWN0aXZhdGVkIHdpdGggcGFyYW1zOiIsIGNvbnRleHQyLnBhcmFtcyk7CiAgICAgIGlmIChjb250ZXh0Mi5wYXJhbXM/LnNlY3Rpb24pIHsKICAgICAgICB0aGlzLnNlY3Rpb24gPSBjb250ZXh0Mi5wYXJhbXMuc2VjdGlvbjsKICAgICAgfQogICAgICBjb250ZXh0Mi5hcHB1aS5zZXRTZWNvbmRhcnlNZW51KHsKICAgICAgICBoZWFkaW5nOiAiU2V0dGluZ3MiLAogICAgICAgIGdyb3VwczogWwogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiQWNjb3VudCIsCiAgICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOnVzZXIiLAogICAgICAgICAgICBpdGVtczogWwogICAgICAgICAgICAgIHsga2V5OiAiZ2VuZXJhbCIsIGljb25OYW1lOiAic2V0dGluZ3MiLCBhY3Rpb246ICgpID0+IHRoaXMuc2hvd1NlY3Rpb24oImdlbmVyYWwiKSB9LAogICAgICAgICAgICAgIHsga2V5OiAicHJvZmlsZSIsIGljb25OYW1lOiAidXNlciIsIGFjdGlvbjogKCkgPT4gdGhpcy5zaG93U2VjdGlvbigicHJvZmlsZSIpIH0sCiAgICAgICAgICAgICAgeyBrZXk6ICJzZWN1cml0eSIsIGljb25OYW1lOiAic2hpZWxkIiwgYWN0aW9uOiAoKSA9PiB0aGlzLnNob3dTZWN0aW9uKCJzZWN1cml0eSIpIH0KICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgbmFtZTogIlByZWZlcmVuY2VzIiwKICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6c2xpZGVycyIsCiAgICAgICAgICAgIGl0ZW1zOiBbCiAgICAgICAgICAgICAgeyBrZXk6ICJub3RpZmljYXRpb25zIiwgaWNvbk5hbWU6ICJiZWxsIiwgYmFkZ2U6IDMsIGFjdGlvbjogKCkgPT4gdGhpcy5zaG93U2VjdGlvbigibm90aWZpY2F0aW9ucyIpIH0sCiAgICAgICAgICAgICAgeyBrZXk6ICJhcHBlYXJhbmNlIiwgaWNvbk5hbWU6ICJwYWxldHRlIiwgYWN0aW9uOiAoKSA9PiB0aGlzLnNob3dTZWN0aW9uKCJhcHBlYXJhbmNlIikgfQogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9KTsKICAgICAgY29udGV4dDIuYXBwdWkuc2V0U2Vjb25kYXJ5TWVudVNlbGVjdGlvbih0aGlzLnNlY3Rpb24pOwogICAgICBjb250ZXh0Mi5hcHB1aS5zZXRDb250ZW50VGFicyhbXSk7CiAgICB9CiAgICBvbkRlYWN0aXZhdGUoKSB7CiAgICAgIGNvbnNvbGUubG9nKCJTZXR0aW5ncyBkZWFjdGl2YXRlZCIpOwogICAgICB0aGlzLmhhc0NoYW5nZXMgPSBmYWxzZTsKICAgIH0KICAgIGNhbkRlYWN0aXZhdGUoKSB7CiAgICAgIGlmICh0aGlzLmhhc0NoYW5nZXMpIHsKICAgICAgICByZXR1cm4gIllvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcy4gTGVhdmUgYW55d2F5PyI7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBzaG93U2VjdGlvbihzZWN0aW9uKSB7CiAgICAgIHRoaXMuc2VjdGlvbiA9IHNlY3Rpb247CiAgICAgIHRoaXMuYXBwdWk/LnNldFNlY29uZGFyeU1lbnVTZWxlY3Rpb24oc2VjdGlvbik7CiAgICB9CiAgICBzaW11bGF0ZUNoYW5nZSgpIHsKICAgICAgdGhpcy5oYXNDaGFuZ2VzID0gdHJ1ZTsKICAgIH0KICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8c3R5bGU+CiAgICAgICAgOmhvc3QgewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwYWRkaW5nOiA0MHB4OwogICAgICAgICAgY29sb3I6ICNhM2EzYTM7CiAgICAgICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCAnSW50ZXInLCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmOwogICAgICAgIH0KICAgICAgICBoMSB7IGNvbG9yOiAjZmFmYWZhOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDI0cHg7IG1hcmdpbi1ib3R0b206IDhweDsgfQogICAgICAgIHAgeyBjb2xvcjogIzczNzM3MzsgbWFyZ2luLWJvdHRvbTogMjRweDsgfQogICAgICAgIC5zZWN0aW9uLW5hbWUgewogICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjA1KTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xKTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgICBjb2xvcjogI2ZhZmFmYTsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgICAgfQogICAgICAgIC5hY3Rpb25zIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBnYXA6IDEycHg7CiAgICAgICAgfQogICAgICAgIGJ1dHRvbiB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAjM2I4MmY2OwogICAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIGJ1dHRvbjpob3ZlciB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAjMjU2M2ViOwogICAgICAgIH0KICAgICAgICAud2FybmluZyB7CiAgICAgICAgICBjb2xvcjogI2ZiYmYyNDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICAgICAgfQogICAgICA8L3N0eWxlPgogICAgICA8aDE+U2V0dGluZ3M8L2gxPgogICAgICA8cD5NYW5hZ2UgeW91ciBhY2NvdW50IGFuZCBhcHBsaWNhdGlvbiBwcmVmZXJlbmNlcy48L3A+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tbmFtZSI+CiAgICAgICAgQ3VycmVudCBzZWN0aW9uOiA8c3Ryb25nPiR7dGhpcy5zZWN0aW9ufTwvc3Ryb25nPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iYWN0aW9ucyI+CiAgICAgICAgPGJ1dHRvbiBAY2xpY2s9JHsoKSA9PiB0aGlzLnNpbXVsYXRlQ2hhbmdlKCl9Pk1ha2UgQ2hhbmdlczwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgICAgJHt0aGlzLmhhc0NoYW5nZXMgPyBiMmA8cCBjbGFzcz0id2FybmluZyI+WW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLiBOYXZpZ2F0aW9uIHdpbGwgcHJvbXB0IGZvciBjb25maXJtYXRpb24uPC9wPmAgOiAiIn0KICAgIGA7CiAgICB9CiAgfTsKICByZXR1cm4gRGVtb1NldHRpbmdzVmlldzIgPSBfY2xhc3NUaGlzOwp9KSgpOwp2YXIgRGVtb1Byb2plY3RzVmlldyA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVtby1wcm9qZWN0cy12aWV3IildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIHZhciBEZW1vUHJvamVjdHNWaWV3MiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX19lc0RlY29yYXRlNDMobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZW1vUHJvamVjdHNWaWV3MiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNDQoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgb25BY3RpdmF0ZShjb250ZXh0MikgewogICAgICBjb250ZXh0Mi5hcHB1aS5zZXRTZWNvbmRhcnlNZW51KHsKICAgICAgICBoZWFkaW5nOiAiUHJvamVjdHMiLAogICAgICAgIGdyb3VwczogWwogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiTXkgUHJvamVjdHMiLAogICAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpmb2xkZXIiLAogICAgICAgICAgICBpdGVtczogWwogICAgICAgICAgICAgIHsga2V5OiAiQWN0aXZlIiwgaWNvbk5hbWU6ICJmb2xkZXIiLCBiYWRnZTogMywgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiQWN0aXZlIikgfSwKICAgICAgICAgICAgICB7IGtleTogIkFyY2hpdmVkIiwgaWNvbk5hbWU6ICJhcmNoaXZlIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiQXJjaGl2ZWQiKSB9LAogICAgICAgICAgICAgIHsga2V5OiAiU2hhcmVkIiwgaWNvbk5hbWU6ICJ1c2VycyIsIGJhZGdlOiAyLCBiYWRnZVZhcmlhbnQ6ICJ3YXJuaW5nIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiU2hhcmVkIikgfQogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiUXVpY2sgQWN0aW9ucyIsCiAgICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOnphcCIsCiAgICAgICAgICAgIGl0ZW1zOiBbCiAgICAgICAgICAgICAgeyB0eXBlOiAiYWN0aW9uIiwga2V5OiAiTmV3IFByb2plY3QiLCBpY29uTmFtZTogImx1Y2lkZTpmb2xkZXJQbHVzIiwgYWN0aW9uOiAoKSA9PiBhbGVydCgiQ3JlYXRlIG5ldyBwcm9qZWN0IikgfSwKICAgICAgICAgICAgICB7IHR5cGU6ICJhY3Rpb24iLCBrZXk6ICJJbXBvcnQiLCBpY29uTmFtZTogImx1Y2lkZTpkb3dubG9hZCIsIGFjdGlvbjogKCkgPT4gYWxlcnQoIkltcG9ydCBwcm9qZWN0IikgfSwKICAgICAgICAgICAgICB7IHR5cGU6ICJkaXZpZGVyIiB9LAogICAgICAgICAgICAgIHsgdHlwZTogImxpbmsiLCBrZXk6ICJUZW1wbGF0ZXMiLCBpY29uTmFtZTogImx1Y2lkZTpsYXlvdXRUZW1wbGF0ZSIsIGhyZWY6ICJodHRwczovL3RlbXBsYXRlcy5leGFtcGxlLmNvbSIgfQogICAgICAgICAgICBdCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9KTsKICAgICAgY29udGV4dDIuYXBwdWkuc2V0Q29udGVudFRhYnMoWwogICAgICAgIHsga2V5OiAiR3JpZCIsIGljb25OYW1lOiAibHVjaWRlOmdyaWQiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJHcmlkIHZpZXciKSB9LAogICAgICAgIHsga2V5OiAiTGlzdCIsIGljb25OYW1lOiAibHVjaWRlOmxpc3QiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJMaXN0IHZpZXciKSB9LAogICAgICAgIHsga2V5OiAiQm9hcmQiLCBpY29uTmFtZTogImx1Y2lkZTprYW5iYW4iLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJCb2FyZCB2aWV3IikgfQogICAgICBdKTsKICAgIH0KICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8c3R5bGU+CiAgICAgICAgOmhvc3QgewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwYWRkaW5nOiA0MHB4OwogICAgICAgICAgY29sb3I6ICNhM2EzYTM7CiAgICAgICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCAnSW50ZXInLCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmOwogICAgICAgIH0KICAgICAgICBoMSB7IGNvbG9yOiAjZmFmYWZhOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDI0cHg7IG1hcmdpbi1ib3R0b206IDI0cHg7IH0KICAgICAgICAucHJvamVjdHMgewogICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIDFmcik7CiAgICAgICAgICBnYXA6IDE2cHg7CiAgICAgICAgfQogICAgICAgIC5wcm9qZWN0IHsKICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4wMyk7CiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMDgpOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjJzOwogICAgICAgIH0KICAgICAgICAucHJvamVjdDpob3ZlciB7CiAgICAgICAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC4yKTsKICAgICAgICB9CiAgICAgICAgLnByb2plY3QgaDMgeyBjb2xvcjogI2ZhZmFmYTsgbWFyZ2luOiAwIDAgOHB4IDA7IGZvbnQtc2l6ZTogMTZweDsgfQogICAgICAgIC5wcm9qZWN0IHAgeyBjb2xvcjogIzczNzM3MzsgbWFyZ2luOiAwOyBmb250LXNpemU6IDEzcHg7IH0KICAgICAgICAuYmFkZ2UgewogICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgYmFja2dyb3VuZDogIzE0NTMyZDsKICAgICAgICAgIGNvbG9yOiAjNGFkZTgwOwogICAgICAgICAgcGFkZGluZzogMnB4IDhweDsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDlweDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICAgIG1hcmdpbi1sZWZ0OiA4cHg7CiAgICAgICAgfQogICAgICA8L3N0eWxlPgogICAgICA8aDE+UHJvamVjdHM8L2gxPgogICAgICA8ZGl2IGNsYXNzPSJwcm9qZWN0cyI+CiAgICAgICAgPGRpdiBjbGFzcz0icHJvamVjdCI+CiAgICAgICAgICA8aDM+RnJvbnRlbmQgQXBwIDxzcGFuIGNsYXNzPSJiYWRnZSI+QWN0aXZlPC9zcGFuPjwvaDM+CiAgICAgICAgICA8cD5SZWFjdC1iYXNlZCBkYXNoYm9hcmQgYXBwbGljYXRpb248L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0icHJvamVjdCI+CiAgICAgICAgICA8aDM+QVBJIFNlcnZlciA8c3BhbiBjbGFzcz0iYmFkZ2UiPkFjdGl2ZTwvc3Bhbj48L2gzPgogICAgICAgICAgPHA+Tm9kZS5qcyBSRVNUIEFQSSBiYWNrZW5kPC9wPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InByb2plY3QiPgogICAgICAgICAgPGgzPk1vYmlsZSBBcHAgPHNwYW4gY2xhc3M9ImJhZGdlIj5BY3RpdmU8L3NwYW4+PC9oMz4KICAgICAgICAgIDxwPlJlYWN0IE5hdGl2ZSBpT1MvQW5kcm9pZCBhcHA8L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0icHJvamVjdCI+CiAgICAgICAgICA8aDM+RG9jdW1lbnRhdGlvbjwvaDM+CiAgICAgICAgICA8cD5UZWNobmljYWwgZG9jdW1lbnRhdGlvbiBzaXRlPC9wPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgfTsKICByZXR1cm4gRGVtb1Byb2plY3RzVmlldzIgPSBfY2xhc3NUaGlzOwp9KSgpOwp2YXIgRGVtb1Rhc2tzVmlldyA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVtby10YXNrcy12aWV3IildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIHZhciBEZW1vVGFza3NWaWV3MiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX19lc0RlY29yYXRlNDMobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZW1vVGFza3NWaWV3MiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNDQoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgb25BY3RpdmF0ZShjb250ZXh0MikgewogICAgICBjb250ZXh0Mi5hcHB1aS5zZXRTZWNvbmRhcnlNZW51KHsKICAgICAgICBoZWFkaW5nOiAiVGFza3MiLAogICAgICAgIGdyb3VwczogWwogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiVmlld3MiLAogICAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpleWUiLAogICAgICAgICAgICBpdGVtczogWwogICAgICAgICAgICAgIHsga2V5OiAiQWxsIFRhc2tzIiwgaWNvbk5hbWU6ICJsaXN0IiwgYmFkZ2U6IDEyLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJBbGwiKSB9LAogICAgICAgICAgICAgIHsga2V5OiAiVG9kYXkiLCBpY29uTmFtZTogImNhbGVuZGFyIiwgYmFkZ2U6IDMsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIlRvZGF5IikgfSwKICAgICAgICAgICAgICB7IGtleTogIlVwY29taW5nIiwgaWNvbk5hbWU6ICJjbG9jayIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIlVwY29taW5nIikgfSwKICAgICAgICAgICAgICB7IGtleTogIkNvbXBsZXRlZCIsIGljb25OYW1lOiAiY2hlY2tDaXJjbGUiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJDb21wbGV0ZWQiKSB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIG5hbWU6ICJGaWx0ZXJzIiwKICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6ZmlsdGVyIiwKICAgICAgICAgICAgaXRlbXM6IFsKICAgICAgICAgICAgICB7IHR5cGU6ICJoZWFkZXIiLCBsYWJlbDogIlByaW9yaXR5IiB9LAogICAgICAgICAgICAgIHsgdHlwZTogIm11bHRpRmlsdGVyIiwga2V5OiAiUHJpb3JpdHkiLCBpY29uTmFtZTogImx1Y2lkZTpmbGFnIiwgb3B0aW9uczogWwogICAgICAgICAgICAgICAgeyBrZXk6ICJoaWdoIiwgbGFiZWw6ICJIaWdoIiwgY2hlY2tlZDogdHJ1ZSwgaWNvbk5hbWU6ICJsdWNpZGU6YWxlcnRDaXJjbGUiIH0sCiAgICAgICAgICAgICAgICB7IGtleTogIm1lZGl1bSIsIGxhYmVsOiAiTWVkaXVtIiwgY2hlY2tlZDogdHJ1ZSwgaWNvbk5hbWU6ICJsdWNpZGU6bWludXNDaXJjbGUiIH0sCiAgICAgICAgICAgICAgICB7IGtleTogImxvdyIsIGxhYmVsOiAiTG93IiwgY2hlY2tlZDogZmFsc2UsIGljb25OYW1lOiAibHVjaWRlOmNpcmNsZSIgfQogICAgICAgICAgICAgIF0sIG9uQ2hhbmdlOiAoa2V5czIpID0+IGNvbnNvbGUubG9nKCJQcmlvcml0eSBmaWx0ZXI6Iiwga2V5czIpIH0sCiAgICAgICAgICAgICAgeyB0eXBlOiAiZGl2aWRlciIgfSwKICAgICAgICAgICAgICB7IHR5cGU6ICJoZWFkZXIiLCBsYWJlbDogIk9wdGlvbnMiIH0sCiAgICAgICAgICAgICAgeyB0eXBlOiAiZmlsdGVyIiwga2V5OiAiU2hvdyBTdWJ0YXNrcyIsIGljb25OYW1lOiAibHVjaWRlOmxpc3RUcmVlIiwgYWN0aXZlOiB0cnVlLCBvblRvZ2dsZTogKGFjdGl2ZSkgPT4gY29uc29sZS5sb2coIlNob3cgc3VidGFza3M6IiwgYWN0aXZlKSB9LAogICAgICAgICAgICAgIHsgdHlwZTogImZpbHRlciIsIGtleTogIlNob3cgQ29tcGxldGVkIiwgaWNvbk5hbWU6ICJsdWNpZGU6Y2hlY2tTcXVhcmUiLCBhY3RpdmU6IGZhbHNlLCBvblRvZ2dsZTogKGFjdGl2ZSkgPT4gY29uc29sZS5sb2coIlNob3cgY29tcGxldGVkOiIsIGFjdGl2ZSkgfQogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiQWN0aW9ucyIsCiAgICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOnphcCIsCiAgICAgICAgICAgIGl0ZW1zOiBbCiAgICAgICAgICAgICAgeyB0eXBlOiAiYWN0aW9uIiwga2V5OiAiQWRkIFRhc2siLCBpY29uTmFtZTogImx1Y2lkZTpwbHVzIiwgYWN0aW9uOiAoKSA9PiBhbGVydCgiQWRkIG5ldyB0YXNrIikgfSwKICAgICAgICAgICAgICB7IHR5cGU6ICJhY3Rpb24iLCBrZXk6ICJJbXBvcnQgVGFza3MiLCBpY29uTmFtZTogImx1Y2lkZTp1cGxvYWQiLCBhY3Rpb246ICgpID0+IGFsZXJ0KCJJbXBvcnQgdGFza3MiKSB9LAogICAgICAgICAgICAgIHsgdHlwZTogImRpdmlkZXIiIH0sCiAgICAgICAgICAgICAgeyB0eXBlOiAiYWN0aW9uIiwga2V5OiAiQ2xlYXIgQ29tcGxldGVkIiwgaWNvbk5hbWU6ICJsdWNpZGU6dHJhc2gyIiwgdmFyaWFudDogImRhbmdlciIsIGNvbmZpcm1NZXNzYWdlOiAiRGVsZXRlIGFsbCBjb21wbGV0ZWQgdGFza3M/IiwgYWN0aW9uOiAoKSA9PiBhbGVydCgiQ2xlYXJlZCBjb21wbGV0ZWQgdGFza3MiKSB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH0pOwogICAgICBjb250ZXh0Mi5hcHB1aS5zZXRDb250ZW50VGFicyhbCiAgICAgICAgeyBrZXk6ICJMaXN0IiwgaWNvbk5hbWU6ICJsdWNpZGU6bGlzdCIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIkxpc3QiKSB9LAogICAgICAgIHsga2V5OiAiQ2FsZW5kYXIiLCBpY29uTmFtZTogImx1Y2lkZTpjYWxlbmRhciIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIkNhbGVuZGFyIikgfQogICAgICBdKTsKICAgIH0KICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8c3R5bGU+CiAgICAgICAgOmhvc3QgewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwYWRkaW5nOiA0MHB4OwogICAgICAgICAgY29sb3I6ICNhM2EzYTM7CiAgICAgICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCAnSW50ZXInLCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmOwogICAgICAgIH0KICAgICAgICBoMSB7IGNvbG9yOiAjZmFmYWZhOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDI0cHg7IG1hcmdpbi1ib3R0b206IDI0cHg7IH0KICAgICAgICAudGFzay1saXN0IHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgfQogICAgICAgIC50YXNrIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjAzKTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4wOCk7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICAgICAgfQogICAgICAgIC5jaGVja2JveCB7CiAgICAgICAgICB3aWR0aDogMThweDsKICAgICAgICAgIGhlaWdodDogMThweDsKICAgICAgICAgIGJvcmRlcjogMnB4IHNvbGlkICM1MjUyNTI7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgfQogICAgICAgIC50YXNrLXRleHQgeyBjb2xvcjogI2ZhZmFmYTsgZmxleDogMTsgfQogICAgICAgIC5kdWUtZGF0ZSB7IGNvbG9yOiAjNzM3MzczOyBmb250LXNpemU6IDEycHg7IH0KICAgICAgICAucHJpb3JpdHkgewogICAgICAgICAgcGFkZGluZzogMnB4IDhweDsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB9CiAgICAgICAgLnByaW9yaXR5LmhpZ2ggeyBiYWNrZ3JvdW5kOiAjNDUwYTBhOyBjb2xvcjogI2Y4NzE3MTsgfQogICAgICAgIC5wcmlvcml0eS5tZWRpdW0geyBiYWNrZ3JvdW5kOiAjNDUxYTAzOyBjb2xvcjogI2ZiYmYyNDsgfQogICAgICA8L3N0eWxlPgogICAgICA8aDE+VGFza3M8L2gxPgogICAgICA8ZGl2IGNsYXNzPSJ0YXNrLWxpc3QiPgogICAgICAgIDxkaXYgY2xhc3M9InRhc2siPgogICAgICAgICAgPGRpdiBjbGFzcz0iY2hlY2tib3giPjwvZGl2PgogICAgICAgICAgPHNwYW4gY2xhc3M9InRhc2stdGV4dCI+UmV2aWV3IHB1bGwgcmVxdWVzdCAjNDI8L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iZHVlLWRhdGUiPlRvZGF5PC9zcGFuPgogICAgICAgICAgPHNwYW4gY2xhc3M9InByaW9yaXR5IGhpZ2giPkhpZ2g8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0idGFzayI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjaGVja2JveCI+PC9kaXY+CiAgICAgICAgICA8c3BhbiBjbGFzcz0idGFzay10ZXh0Ij5VcGRhdGUgZG9jdW1lbnRhdGlvbjwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJkdWUtZGF0ZSI+VG9tb3Jyb3c8L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0icHJpb3JpdHkgbWVkaXVtIj5NZWRpdW08L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0idGFzayI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjaGVja2JveCI+PC9kaXY+CiAgICAgICAgICA8c3BhbiBjbGFzcz0idGFzay10ZXh0Ij5Xcml0ZSB1bml0IHRlc3RzPC9zcGFuPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImR1ZS1kYXRlIj5EZWMgMjA8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICB9OwogIHJldHVybiBEZW1vVGFza3NWaWV3MiA9IF9jbGFzc1RoaXM7Cn0pKCk7CnZhciBkZW1vRnVuYzMxID0gKCkgPT4gewogIGNvbnN0IGFwcENvbmZpZyA9IHsKICAgIGJyYW5kaW5nOiB7CiAgICAgIGxvZ29JY29uOiAibHVjaWRlOmJveCIsCiAgICAgIGxvZ29UZXh0OiAiQWNtZSBBcHAiCiAgICB9LAogICAgYXBwQmFyOiB7CiAgICAgIG1lbnVJdGVtczogWwogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJGaWxlIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgfSwKICAgICAgICAgIHN1Ym1lbnU6IFsKICAgICAgICAgICAgeyBuYW1lOiAiTmV3IFByb2plY3QiLCBzaG9ydGN1dDogIkNtZCtOIiwgaWNvbk5hbWU6ICJmaWxlUGx1cyIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIk5ldyIpIH0sCiAgICAgICAgICAgIHsgbmFtZTogIk9wZW4uLi4iLCBzaG9ydGN1dDogIkNtZCtPIiwgaWNvbk5hbWU6ICJmb2xkZXJPcGVuIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiT3BlbiIpIH0sCiAgICAgICAgICAgIHsgbmFtZTogIlJlY2VudCBQcm9qZWN0cyIsIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICB9LCBzdWJtZW51OiBbCiAgICAgICAgICAgICAgeyBuYW1lOiAibXktYXBwIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiT3BlbiBteS1hcHAiKSB9LAogICAgICAgICAgICAgIHsgbmFtZTogImNvbXBvbmVudC1saWIiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJPcGVuIGNvbXBvbmVudC1saWIiKSB9CiAgICAgICAgICAgIF0gfSwKICAgICAgICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgICAgIHsgbmFtZTogIlNhdmUgQWxsIiwgc2hvcnRjdXQ6ICJDbWQrUyIsIGljb25OYW1lOiAic2F2ZSIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlNhdmUiKSB9CiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiRWRpdCIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIH0sCiAgICAgICAgICBzdWJtZW51OiBbCiAgICAgICAgICAgIHsgbmFtZTogIlVuZG8iLCBzaG9ydGN1dDogIkNtZCtaIiwgaWNvbk5hbWU6ICJ1bmRvIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiVW5kbyIpIH0sCiAgICAgICAgICAgIHsgbmFtZTogIlJlZG8iLCBzaG9ydGN1dDogIkNtZCtTaGlmdCtaIiwgaWNvbk5hbWU6ICJyZWRvIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiUmVkbyIpIH0sCiAgICAgICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgICAgICB7IG5hbWU6ICJDdXQiLCBzaG9ydGN1dDogIkNtZCtYIiwgaWNvbk5hbWU6ICJzY2lzc29ycyIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIkN1dCIpIH0sCiAgICAgICAgICAgIHsgbmFtZTogIkNvcHkiLCBzaG9ydGN1dDogIkNtZCtDIiwgaWNvbk5hbWU6ICJjb3B5IiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiQ29weSIpIH0sCiAgICAgICAgICAgIHsgbmFtZTogIlBhc3RlIiwgc2hvcnRjdXQ6ICJDbWQrViIsIGljb25OYW1lOiAiY2xpcGJvYXJkIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiUGFzdGUiKSB9CiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiVmlldyIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIH0sCiAgICAgICAgICBzdWJtZW51OiBbCiAgICAgICAgICAgIHsgbmFtZTogIlRvZ2dsZSBTaWRlYmFyIiwgc2hvcnRjdXQ6ICJDbWQrQiIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlRvZ2dsZSBzaWRlYmFyIikgfSwKICAgICAgICAgICAgeyBuYW1lOiAiVG9nZ2xlIEFjdGl2aXR5IExvZyIsIHNob3J0Y3V0OiAiQ21kK1NoaWZ0K0EiLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJUb2dnbGUgYWN0aXZpdHkiKSB9CiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiSGVscCIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIH0sCiAgICAgICAgICBzdWJtZW51OiBbCiAgICAgICAgICAgIHsgbmFtZTogIkRvY3VtZW50YXRpb24iLCBpY29uTmFtZTogImJvb2siLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJEb2NzIikgfSwKICAgICAgICAgICAgeyBuYW1lOiAiS2V5Ym9hcmQgU2hvcnRjdXRzIiwgaWNvbk5hbWU6ICJrZXlib2FyZCIsIHNob3J0Y3V0OiAiQ21kKy8iLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJTaG9ydGN1dHMiKSB9LAogICAgICAgICAgICB7IGRpdmlkZXI6IHRydWUgfSwKICAgICAgICAgICAgeyBuYW1lOiAiQWJvdXQiLCBpY29uTmFtZTogImluZm8iLCBhY3Rpb246IGFzeW5jICgpID0+IGNvbnNvbGUubG9nKCJBYm91dCIpIH0KICAgICAgICAgIF0KICAgICAgICB9CiAgICAgIF0sCiAgICAgIGJyZWFkY3J1bWJzOiAiRGFzaGJvYXJkIiwKICAgICAgc2hvd1dpbmRvd0NvbnRyb2xzOiB0cnVlLAogICAgICBzaG93U2VhcmNoOiB0cnVlLAogICAgICB1c2VyOiB7CiAgICAgICAgbmFtZTogIkphbmUgU21pdGgiLAogICAgICAgIGVtYWlsOiAiamFuZS5zbWl0aEBleGFtcGxlLmNvbSIsCiAgICAgICAgc3RhdHVzOiAib25saW5lIgogICAgICB9LAogICAgICBwcm9maWxlTWVudUl0ZW1zOiBbCiAgICAgICAgeyBuYW1lOiAiUHJvZmlsZSIsIGljb25OYW1lOiAidXNlciIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlByb2ZpbGUiKSB9LAogICAgICAgIHsgbmFtZTogIkFjY291bnQgU2V0dGluZ3MiLCBpY29uTmFtZTogInNldHRpbmdzIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiU2V0dGluZ3MiKSB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsgbmFtZTogIkhlbHAgJiBTdXBwb3J0IiwgaWNvbk5hbWU6ICJoZWxwQ2lyY2xlIiwgYWN0aW9uOiBhc3luYyAoKSA9PiBjb25zb2xlLmxvZygiSGVscCIpIH0sCiAgICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgeyBuYW1lOiAiU2lnbiBPdXQiLCBpY29uTmFtZTogImxvZ091dCIsIGFjdGlvbjogYXN5bmMgKCkgPT4gY29uc29sZS5sb2coIlNpZ24gb3V0IikgfQogICAgICBdCiAgICB9LAogICAgdmlld3M6IFsKICAgICAgewogICAgICAgIGlkOiAiZGFzaGJvYXJkIiwKICAgICAgICBuYW1lOiAiRGFzaGJvYXJkIiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpob21lIiwKICAgICAgICBjb250ZW50OiAiZGVtby1kYXNoYm9hcmQtdmlldyIsCiAgICAgICAgcm91dGU6ICJkYXNoYm9hcmQiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpZDogInByb2plY3RzIiwKICAgICAgICBuYW1lOiAiUHJvamVjdHMiLAogICAgICAgIGljb25OYW1lOiAibHVjaWRlOmZvbGRlciIsCiAgICAgICAgY29udGVudDogImRlbW8tcHJvamVjdHMtdmlldyIsCiAgICAgICAgcm91dGU6ICJwcm9qZWN0cyIsCiAgICAgICAgYmFkZ2U6IDMKICAgICAgfSwKICAgICAgewogICAgICAgIGlkOiAidGFza3MiLAogICAgICAgIG5hbWU6ICJUYXNrcyIsCiAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6Y2hlY2tTcXVhcmUiLAogICAgICAgIGNvbnRlbnQ6ICJkZW1vLXRhc2tzLXZpZXciLAogICAgICAgIHJvdXRlOiAidGFza3MiLAogICAgICAgIGJhZGdlOiAxMgogICAgICB9LAogICAgICB7CiAgICAgICAgaWQ6ICJzZXR0aW5ncyIsCiAgICAgICAgbmFtZTogIlNldHRpbmdzIiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpzZXR0aW5ncyIsCiAgICAgICAgY29udGVudDogImRlbW8tc2V0dGluZ3MtdmlldyIsCiAgICAgICAgcm91dGU6ICJzZXR0aW5ncy86c2VjdGlvbj8iCiAgICAgIH0KICAgIF0sCiAgICBtYWluTWVudTogewogICAgICBzZWN0aW9uczogWwogICAgICAgIHsgbmFtZTogIk1haW4iLCB2aWV3czogWyJkYXNoYm9hcmQiXSB9LAogICAgICAgIHsgbmFtZTogIldvcmtzcGFjZSIsIHZpZXdzOiBbInByb2plY3RzIiwgInRhc2tzIl0gfQogICAgICBdLAogICAgICBib3R0b21JdGVtczogWyJzZXR0aW5ncyJdCiAgICB9LAogICAgZGVmYXVsdFZpZXc6ICJkYXNoYm9hcmQiLAogICAgYm90dG9tQmFyOiB7CiAgICAgIHZpc2libGU6IHRydWUsCiAgICAgIHdpZGdldHM6IFsKICAgICAgICB7CiAgICAgICAgICBpZDogInN0YXR1cyIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTphY3Rpdml0eSIsCiAgICAgICAgICBsYWJlbDogIlN5c3RlbSBPbmxpbmUiLAogICAgICAgICAgc3RhdHVzOiAic3VjY2VzcyIsCiAgICAgICAgICB0b29sdGlwOiAiQWxsIHN5c3RlbXMgb3BlcmF0aW9uYWwiLAogICAgICAgICAgb25DbGljazogKCkgPT4gY29uc29sZS5sb2coIlN0YXR1cyBjbGlja2VkIikKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGlkOiAibm90aWZpY2F0aW9ucyIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpiZWxsIiwKICAgICAgICAgIGxhYmVsOiAiMyBub3RpZmljYXRpb25zIiwKICAgICAgICAgIHN0YXR1czogIndhcm5pbmciLAogICAgICAgICAgdG9vbHRpcDogIllvdSBoYXZlIHVucmVhZCBub3RpZmljYXRpb25zIiwKICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IGNvbnNvbGUubG9nKCJOb3RpZmljYXRpb25zIGNsaWNrZWQiKQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgaWQ6ICJ2ZXJzaW9uIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmdpdEJyYW5jaCIsCiAgICAgICAgICBsYWJlbDogInYxLjIuMyIsCiAgICAgICAgICBwb3NpdGlvbjogInJpZ2h0IiwKICAgICAgICAgIHRvb2x0aXA6ICJDdXJyZW50IHZlcnNpb24iCiAgICAgICAgfQogICAgICBdLAogICAgICBhY3Rpb25zOiBbCiAgICAgICAgewogICAgICAgICAgaWQ6ICJ0ZXJtaW5hbCIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTp0ZXJtaW5hbCIsCiAgICAgICAgICB0b29sdGlwOiAiT3BlbiBUZXJtaW5hbCIsCiAgICAgICAgICBwb3NpdGlvbjogInJpZ2h0IiwKICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IGNvbnNvbGUubG9nKCJUZXJtaW5hbCBjbGlja2VkIikKICAgICAgICB9CiAgICAgIF0KICAgIH0sCiAgICBvblZpZXdDaGFuZ2U6ICh2aWV3SWQsIHZpZXcpID0+IHsKICAgICAgY29uc29sZS5sb2coYFZpZXcgY2hhbmdlZCB0bzogJHt2aWV3SWR9ICgke3ZpZXcubmFtZX0pYCk7CiAgICB9LAogICAgb25TZWFyY2g6IChxdWVyeSkgPT4gewogICAgICBjb25zb2xlLmxvZygiU2VhcmNoIHF1ZXJ5OiIsIHF1ZXJ5KTsKICAgIH0KICB9OwogIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICBjb250YWluZXJFbGVtZW50LmNsYXNzTmFtZSA9ICJkZW1vLWNvbnRhaW5lciI7CiAgY29udGFpbmVyRWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gInBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyBoZWlnaHQ6IDEwMCU7IHdpZHRoOiAxMDAlOyBvdmVyZmxvdzogaGlkZGVuOyI7CiAgY29uc3QgYXBwdWlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGVlcy1hcHB1aSIpOwogIGNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQoYXBwdWlFbGVtZW50KTsKICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHsKICAgIGF3YWl0IGFwcHVpRWxlbWVudC51cGRhdGVDb21wbGV0ZTsKICAgIGFwcHVpRWxlbWVudC5jb25maWd1cmUoYXBwQ29uZmlnKTsKICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICBhcHB1aUVsZW1lbnQuYWN0aXZpdHlMb2cuYWRkTWFueShbCiAgICAgICAgewogICAgICAgICAgdHlwZTogImxvZ2luIiwKICAgICAgICAgIHVzZXI6ICJKYW5lIFNtaXRoIiwKICAgICAgICAgIG1lc3NhZ2U6ICJsb2dnZWQgaW4gZnJvbSBDaHJvbWUgb24gbWFjT1MiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0eXBlOiAiY3JlYXRlIiwKICAgICAgICAgIHVzZXI6ICJKYW5lIFNtaXRoIiwKICAgICAgICAgIG1lc3NhZ2U6ICdjcmVhdGVkIHByb2plY3QgIkZyb250ZW5kIEFwcCInCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0eXBlOiAidXBkYXRlIiwKICAgICAgICAgIHVzZXI6ICJKb2huIERvZSIsCiAgICAgICAgICBtZXNzYWdlOiAidXBkYXRlZCBBUEkgZG9jdW1lbnRhdGlvbiIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIHR5cGU6ICJ2aWV3IiwKICAgICAgICAgIHVzZXI6ICJKYW5lIFNtaXRoIiwKICAgICAgICAgIG1lc3NhZ2U6ICJ2aWV3ZWQgZGFzaGJvYXJkIGFuYWx5dGljcyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIHR5cGU6ICJkZWxldGUiLAogICAgICAgICAgdXNlcjogIkFkbWluIiwKICAgICAgICAgIG1lc3NhZ2U6ICJyZW1vdmVkIGRlcHJlY2F0ZWQgZW5kcG9pbnQiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0eXBlOiAiY3VzdG9tIiwKICAgICAgICAgIHVzZXI6ICJTeXN0ZW0iLAogICAgICAgICAgbWVzc2FnZTogInNjaGVkdWxlZCBiYWNrdXAgY29tcGxldGVkIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmRhdGFiYXNlIgogICAgICAgIH0KICAgICAgXSk7CiAgICB9LCA1MDApOwogICAgYXBwdWlFbGVtZW50LnZpZXdDaGFuZ2VkJC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7CiAgICAgIGNvbnNvbGUubG9nKCJWaWV3IGNoYW5nZWQgZXZlbnQ6IiwgZXZlbnQpOwogICAgICBhcHB1aUVsZW1lbnQuc2V0QnJlYWRjcnVtYnMoZXZlbnQudmlldy5uYW1lKTsKICAgIH0pOwogICAgYXBwdWlFbGVtZW50LnZpZXdMaWZlY3ljbGUkLnN1YnNjcmliZSgoZXZlbnQpID0+IHsKICAgICAgY29uc29sZS5sb2coIkxpZmVjeWNsZSBldmVudDoiLCBldmVudC50eXBlLCBldmVudC52aWV3SWQpOwogICAgfSk7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgYXBwdWlFbGVtZW50LnNldE1haW5NZW51QmFkZ2UoInRhc2tzIiwgMTUpOwogICAgICBhcHB1aUVsZW1lbnQuYWN0aXZpdHlMb2cuYWRkKHsKICAgICAgICB0eXBlOiAidXBkYXRlIiwKICAgICAgICB1c2VyOiAiU3lzdGVtIiwKICAgICAgICBtZXNzYWdlOiAibmV3IHRhc2tzIGFkZGVkIgogICAgICB9KTsKICAgIH0sIDVlMyk7CiAgfSwgMCk7CiAgcmV0dXJuIGIyYAogICAgPGRlZXMtZGVtb3dyYXBwZXI+CiAgICAgICR7Y29udGFpbmVyRWxlbWVudH0KICAgIDwvZGVlcy1kZW1vd3JhcHBlcj4KICBgOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWFwcHVpL2RlZXMtYXBwdWkvdmlldy5yZWdpc3RyeS5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgVmlld1JlZ2lzdHJ5ID0gY2xhc3MgewogIHZpZXdzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBpbnN0YW5jZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogIGN1cnJlbnRWaWV3SWQgPSBudWxsOwogIGFwcHVpID0gbnVsbDsKICAvKioKICAgKiBTZXQgdGhlIGFwcHVpIHJlZmVyZW5jZSBmb3IgdmlldyBhY3RpdmF0aW9uIGNvbnRleHQKICAgKi8KICBzZXRBcHB1aVJlZihhcHB1aSkgewogICAgdGhpcy5hcHB1aSA9IGFwcHVpOwogIH0KICAvKioKICAgKiBSZWdpc3RlciBhIHNpbmdsZSB2aWV3CiAgICovCiAgcmVnaXN0ZXIodmlldykgewogICAgaWYgKHRoaXMudmlld3MuaGFzKHZpZXcuaWQpKSB7CiAgICAgIGNvbnNvbGUud2FybihgVmlldyB3aXRoIGlkICIke3ZpZXcuaWR9IiBhbHJlYWR5IHJlZ2lzdGVyZWQuIE92ZXJ3cml0aW5nLmApOwogICAgfQogICAgdGhpcy52aWV3cy5zZXQodmlldy5pZCwgdmlldyk7CiAgfQogIC8qKgogICAqIFJlZ2lzdGVyIG11bHRpcGxlIHZpZXdzCiAgICovCiAgcmVnaXN0ZXJBbGwodmlld3MpIHsKICAgIHZpZXdzLmZvckVhY2goKHZpZXcpID0+IHRoaXMucmVnaXN0ZXIodmlldykpOwogIH0KICAvKioKICAgKiBHZXQgYSB2aWV3IGRlZmluaXRpb24gYnkgSUQKICAgKi8KICBnZXQodmlld0lkKSB7CiAgICByZXR1cm4gdGhpcy52aWV3cy5nZXQodmlld0lkKTsKICB9CiAgLyoqCiAgICogR2V0IGFsbCByZWdpc3RlcmVkIHZpZXcgSURzCiAgICovCiAgZ2V0Vmlld0lkcygpIHsKICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMudmlld3Mua2V5cygpKTsKICB9CiAgLyoqCiAgICogR2V0IGFsbCB2aWV3cwogICAqLwogIGdldEFsbCgpIHsKICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMudmlld3MudmFsdWVzKCkpOwogIH0KICAvKioKICAgKiBHZXQgcm91dGUgZm9yIGEgdmlldwogICAqLwogIGdldFJvdXRlKHZpZXdJZCkgewogICAgY29uc3QgdmlldyA9IHRoaXMudmlld3MuZ2V0KHZpZXdJZCk7CiAgICByZXR1cm4gdmlldz8ucm91dGUgfHwgdmlldz8uaWQgfHwgIiI7CiAgfQogIC8qKgogICAqIEZpbmQgdmlldyBieSByb3V0ZSAoc3VwcG9ydHMgcGFyYW1ldGVyaXplZCByb3V0ZXMgbGlrZSAnc2V0dGluZ3MvOnNlY3Rpb24nKQogICAqLwogIGZpbmRCeVJvdXRlKHJvdXRlKSB7CiAgICBmb3IgKGNvbnN0IHZpZXcgb2YgdGhpcy52aWV3cy52YWx1ZXMoKSkgewogICAgICBjb25zdCB2aWV3Um91dGUgPSB2aWV3LnJvdXRlIHx8IHZpZXcuaWQ7CiAgICAgIGNvbnN0IHBhcmFtczIgPSB0aGlzLm1hdGNoUm91dGUodmlld1JvdXRlLCByb3V0ZSk7CiAgICAgIGlmIChwYXJhbXMyICE9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHsgdmlldywgcGFyYW1zOiBwYXJhbXMyIH07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2b2lkIDA7CiAgfQogIC8qKgogICAqIE1hdGNoIGEgcm91dGUgcGF0dGVybiBhZ2FpbnN0IGFuIGFjdHVhbCByb3V0ZQogICAqIFJldHVybnMgcGFyYW1zIGlmIG1hdGNoZWQsIG51bGwgb3RoZXJ3aXNlCiAgICovCiAgbWF0Y2hSb3V0ZShwYXR0ZXJuLCByb3V0ZSkgewogICAgY29uc3QgcGF0dGVyblBhcnRzID0gcGF0dGVybi5zcGxpdCgiLyIpOwogICAgY29uc3Qgcm91dGVQYXJ0cyA9IHJvdXRlLnNwbGl0KCIvIik7CiAgICBjb25zdCBoYXNPcHRpb25hbFBhcmFtID0gcGF0dGVyblBhcnRzLmxlbmd0aCA+IDAgJiYgcGF0dGVyblBhcnRzW3BhdHRlcm5QYXJ0cy5sZW5ndGggLSAxXS5lbmRzV2l0aCgiPyIpOwogICAgaWYgKGhhc09wdGlvbmFsUGFyYW0pIHsKICAgICAgaWYgKHJvdXRlUGFydHMubGVuZ3RoIDwgcGF0dGVyblBhcnRzLmxlbmd0aCAtIDEgfHwgcm91dGVQYXJ0cy5sZW5ndGggPiBwYXR0ZXJuUGFydHMubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocGF0dGVyblBhcnRzLmxlbmd0aCAhPT0gcm91dGVQYXJ0cy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBwYXJhbXMyID0ge307CiAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBwYXR0ZXJuUGFydHMubGVuZ3RoOyBpMTErKykgewogICAgICBsZXQgcGFydCA9IHBhdHRlcm5QYXJ0c1tpMTFdOwogICAgICBjb25zdCBpc09wdGlvbmFsID0gcGFydC5lbmRzV2l0aCgiPyIpOwogICAgICBpZiAoaXNPcHRpb25hbCkgewogICAgICAgIHBhcnQgPSBwYXJ0LnNsaWNlKDAsIC0xKTsKICAgICAgfQogICAgICBpZiAocGFydC5zdGFydHNXaXRoKCI6IikpIHsKICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSBwYXJ0LnNsaWNlKDEpOwogICAgICAgIGlmIChyb3V0ZVBhcnRzW2kxMV0gIT09IHZvaWQgMCkgewogICAgICAgICAgcGFyYW1zMltwYXJhbU5hbWVdID0gcm91dGVQYXJ0c1tpMTFdOwogICAgICAgIH0gZWxzZSBpZiAoIWlzT3B0aW9uYWwpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChyb3V0ZVBhcnRzW2kxMV0gIT09IHBhcnQpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBhcmFtczI7CiAgfQogIC8qKgogICAqIENoZWNrIGlmIG5hdmlnYXRpb24gYXdheSBmcm9tIGN1cnJlbnQgdmlldyBpcyBhbGxvd2VkCiAgICovCiAgYXN5bmMgY2FuTGVhdmVDdXJyZW50VmlldygpIHsKICAgIGlmICghdGhpcy5jdXJyZW50Vmlld0lkKQogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZXMuZ2V0KHRoaXMuY3VycmVudFZpZXdJZCk7CiAgICBpZiAoIWluc3RhbmNlKQogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNvbnN0IGxpZmVjeWNsZSA9IGluc3RhbmNlOwogICAgaWYgKHR5cGVvZiBsaWZlY3ljbGUuY2FuRGVhY3RpdmF0ZSA9PT0gImZ1bmN0aW9uIikgewogICAgICByZXR1cm4gYXdhaXQgbGlmZWN5Y2xlLmNhbkRlYWN0aXZhdGUoKTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICAvKioKICAgKiBBY3RpdmF0ZSBhIHZpZXcgLSBoYW5kbGVzIGNhY2hpbmcsIGxpZmVjeWNsZSwgYW5kIHJlbmRlcmluZwogICAqLwogIGFzeW5jIGFjdGl2YXRlVmlldyh2aWV3SWQsIGNvbnRhaW5lciwgcGFyYW1zMikgewogICAgY29uc3QgdmlldyA9IHRoaXMudmlld3MuZ2V0KHZpZXdJZCk7CiAgICBpZiAoIXZpZXcpIHsKICAgICAgY29uc29sZS5lcnJvcihgVmlldyAiJHt2aWV3SWR9IiBub3QgZm91bmQgaW4gcmVnaXN0cnlgKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBzaG91bGRDYWNoZSA9IHZpZXcuY2FjaGUgIT09IGZhbHNlOwogICAgaWYgKHRoaXMuY3VycmVudFZpZXdJZCAmJiB0aGlzLmN1cnJlbnRWaWV3SWQgIT09IHZpZXdJZCkgewogICAgICBhd2FpdCB0aGlzLmRlYWN0aXZhdGVWaWV3KHRoaXMuY3VycmVudFZpZXdJZCk7CiAgICB9CiAgICBsZXQgZWxlbWVudDQgPSBzaG91bGRDYWNoZSA/IHRoaXMuaW5zdGFuY2VzLmdldCh2aWV3SWQpIDogdm9pZCAwOwogICAgaWYgKGVsZW1lbnQ0KSB7CiAgICAgIGVsZW1lbnQ0LnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgIH0gZWxzZSB7CiAgICAgIGVsZW1lbnQ0ID0gYXdhaXQgdGhpcy5jcmVhdGVWaWV3RWxlbWVudCh2aWV3KTsKICAgICAgaWYgKCFlbGVtZW50NCkgewogICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZWxlbWVudCBmb3IgdmlldyAiJHt2aWV3SWR9ImApOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50NCk7CiAgICAgIGlmIChzaG91bGRDYWNoZSkgewogICAgICAgIHRoaXMuaW5zdGFuY2VzLnNldCh2aWV3SWQsIGVsZW1lbnQ0KTsKICAgICAgfQogICAgfQogICAgdGhpcy5jdXJyZW50Vmlld0lkID0gdmlld0lkOwogICAgYXdhaXQgdGhpcy5jYWxsT25BY3RpdmF0ZShlbGVtZW50NCwgdmlld0lkLCBwYXJhbXMyKTsKICAgIHJldHVybiBlbGVtZW50NDsKICB9CiAgLyoqCiAgICogRGVhY3RpdmF0ZSBhIHZpZXcgKGhpZGUgYW5kIGNhbGwgbGlmZWN5Y2xlIGhvb2spCiAgICovCiAgYXN5bmMgZGVhY3RpdmF0ZVZpZXcodmlld0lkKSB7CiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2VzLmdldCh2aWV3SWQpOwogICAgaWYgKCFpbnN0YW5jZSkKICAgICAgcmV0dXJuOwogICAgY29uc3QgbGlmZWN5Y2xlID0gaW5zdGFuY2U7CiAgICBpZiAodHlwZW9mIGxpZmVjeWNsZS5vbkRlYWN0aXZhdGUgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgYXdhaXQgbGlmZWN5Y2xlLm9uRGVhY3RpdmF0ZSgpOwogICAgfQogICAgaW5zdGFuY2Uuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICB9CiAgLyoqCiAgICogQ3JlYXRlIGEgdmlldyBlbGVtZW50IGZyb20gaXRzIGRlZmluaXRpb24gKHN1cHBvcnRzIGFzeW5jIGNvbnRlbnQpCiAgICovCiAgYXN5bmMgY3JlYXRlVmlld0VsZW1lbnQodmlldykgewogICAgbGV0IGNvbnRlbnQzID0gdmlldy5jb250ZW50OwogICAgaWYgKHR5cGVvZiBjb250ZW50MyA9PT0gImZ1bmN0aW9uIiAmJiAhKGNvbnRlbnQzLnByb3RvdHlwZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSAmJiBjb250ZW50My5jb25zdHJ1Y3Rvci5uYW1lID09PSAiQXN5bmNGdW5jdGlvbiIpIHsKICAgICAgdHJ5IHsKICAgICAgICBjb250ZW50MyA9IGF3YWl0IGNvbnRlbnQzKCk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGxvYWQgYXN5bmMgY29udGVudCBmb3IgdmlldyAiJHt2aWV3LmlkfSI6YCwgZXJyb3IpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBsZXQgZWxlbWVudDQ7CiAgICBpZiAodHlwZW9mIGNvbnRlbnQzID09PSAic3RyaW5nIikgewogICAgICBlbGVtZW50NCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoY29udGVudDMpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgY29udGVudDMgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgaWYgKGNvbnRlbnQzLnByb3RvdHlwZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7CiAgICAgICAgZWxlbWVudDQgPSBuZXcgY29udGVudDMoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgd3JhcHBlci5jbGFzc05hbWUgPSAidmlldy1jb250ZW50LXdyYXBwZXIiOwogICAgICAgIHdyYXBwZXIuc3R5bGUuY3NzVGV4dCA9ICJkaXNwbGF5OiBjb250ZW50czsiOwogICAgICAgIGNvbnN0IHRlbXBsYXRlID0gY29udGVudDMoKTsKICAgICAgICBEKHRlbXBsYXRlLCB3cmFwcGVyKTsKICAgICAgICBlbGVtZW50NCA9IHdyYXBwZXI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgY29udGVudCB0eXBlIGZvciB2aWV3ICIke3ZpZXcuaWR9ImApOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGVsZW1lbnQ0LmRhdGFzZXQudmlld0lkID0gdmlldy5pZDsKICAgIHJldHVybiBlbGVtZW50NDsKICB9CiAgLyoqCiAgICogQ2FsbCBvbkFjdGl2YXRlIGxpZmVjeWNsZSBob29rIG9uIGEgdmlldyBlbGVtZW50CiAgICovCiAgYXN5bmMgY2FsbE9uQWN0aXZhdGUoZWxlbWVudDQsIHZpZXdJZCwgcGFyYW1zMikgewogICAgY29uc3QgbGlmZWN5Y2xlID0gZWxlbWVudDQ7CiAgICBpZiAodHlwZW9mIGxpZmVjeWNsZS5vbkFjdGl2YXRlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIGNvbnN0IGNvbnRleHQyID0gewogICAgICAgIGFwcHVpOiB0aGlzLmFwcHVpLAogICAgICAgIHZpZXdJZCwKICAgICAgICBwYXJhbXM6IHBhcmFtczIKICAgICAgfTsKICAgICAgYXdhaXQgbGlmZWN5Y2xlLm9uQWN0aXZhdGUoY29udGV4dDIpOwogICAgfQogIH0KICAvKioKICAgKiBMZWdhY3kgbWV0aG9kIC0gcmVuZGVycyB2aWV3IHdpdGhvdXQgY2FjaGluZwogICAqIEBkZXByZWNhdGVkIFVzZSBhY3RpdmF0ZVZpZXcgaW5zdGVhZAogICAqLwogIHJlbmRlclZpZXcodmlld0lkLCBjb250YWluZXIpIHsKICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdzLmdldCh2aWV3SWQpOwogICAgaWYgKCF2aWV3KSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYFZpZXcgIiR7dmlld0lkfSIgbm90IGZvdW5kIGluIHJlZ2lzdHJ5YCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29udGFpbmVyLmlubmVySFRNTCA9ICIiOwogICAgbGV0IGVsZW1lbnQ0OwogICAgY29uc3QgY29udGVudDMgPSB2aWV3LmNvbnRlbnQ7CiAgICBpZiAodHlwZW9mIGNvbnRlbnQzID09PSAic3RyaW5nIikgewogICAgICBlbGVtZW50NCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoY29udGVudDMpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgY29udGVudDMgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgaWYgKGNvbnRlbnQzLnByb3RvdHlwZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7CiAgICAgICAgZWxlbWVudDQgPSBuZXcgY29udGVudDMoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgd3JhcHBlci5jbGFzc05hbWUgPSAidmlldy1jb250ZW50LXdyYXBwZXIiOwogICAgICAgIHdyYXBwZXIuc3R5bGUuY3NzVGV4dCA9ICJkaXNwbGF5OiBjb250ZW50czsiOwogICAgICAgIGNvbnN0IHRlbXBsYXRlID0gY29udGVudDMoKTsKICAgICAgICBEKHRlbXBsYXRlLCB3cmFwcGVyKTsKICAgICAgICBlbGVtZW50NCA9IHdyYXBwZXI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgY29udGVudCB0eXBlIGZvciB2aWV3ICIke3ZpZXdJZH0iYCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQ0KTsKICAgIHRoaXMuaW5zdGFuY2VzLnNldCh2aWV3SWQsIGVsZW1lbnQ0KTsKICAgIHRoaXMuY3VycmVudFZpZXdJZCA9IHZpZXdJZDsKICAgIHJldHVybiBlbGVtZW50NDsKICB9CiAgLyoqCiAgICogR2V0IGN1cnJlbnRseSBhY3RpdmUgdmlldyBJRAogICAqLwogIGdldEN1cnJlbnRWaWV3SWQoKSB7CiAgICByZXR1cm4gdGhpcy5jdXJyZW50Vmlld0lkOwogIH0KICAvKioKICAgKiBHZXQgY2FjaGVkIGluc3RhbmNlIG9mIGEgdmlldwogICAqLwogIGdldEluc3RhbmNlKHZpZXdJZCkgewogICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzLmdldCh2aWV3SWQpOwogIH0KICAvKioKICAgKiBDbGVhciBhIHNwZWNpZmljIGNhY2hlZCBpbnN0YW5jZQogICAqLwogIGNsZWFySW5zdGFuY2Uodmlld0lkKSB7CiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2VzLmdldCh2aWV3SWQpOwogICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLnBhcmVudE5vZGUpIHsKICAgICAgaW5zdGFuY2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpbnN0YW5jZSk7CiAgICB9CiAgICB0aGlzLmluc3RhbmNlcy5kZWxldGUodmlld0lkKTsKICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3SWQgPT09IHZpZXdJZCkgewogICAgICB0aGlzLmN1cnJlbnRWaWV3SWQgPSBudWxsOwogICAgfQogIH0KICAvKioKICAgKiBDbGVhciBhbGwgaW5zdGFuY2VzCiAgICovCiAgY2xlYXJJbnN0YW5jZXMoKSB7CiAgICBmb3IgKGNvbnN0IFt2aWV3SWQsIGluc3RhbmNlXSBvZiB0aGlzLmluc3RhbmNlcykgewogICAgICBpZiAoaW5zdGFuY2UucGFyZW50Tm9kZSkgewogICAgICAgIGluc3RhbmNlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaW5zdGFuY2UpOwogICAgICB9CiAgICB9CiAgICB0aGlzLmluc3RhbmNlcy5jbGVhcigpOwogICAgdGhpcy5jdXJyZW50Vmlld0lkID0gbnVsbDsKICB9CiAgLyoqCiAgICogVW5yZWdpc3RlciBhIHZpZXcKICAgKi8KICB1bnJlZ2lzdGVyKHZpZXdJZCkgewogICAgdGhpcy5jbGVhckluc3RhbmNlKHZpZXdJZCk7CiAgICByZXR1cm4gdGhpcy52aWV3cy5kZWxldGUodmlld0lkKTsKICB9CiAgLyoqCiAgICogQ2xlYXIgdGhlIHJlZ2lzdHJ5CiAgICovCiAgY2xlYXIoKSB7CiAgICB0aGlzLnZpZXdzLmNsZWFyKCk7CiAgICB0aGlzLmNsZWFySW5zdGFuY2VzKCk7CiAgfQogIC8qKgogICAqIENoZWNrIGlmIGEgdmlldyBpcyByZWdpc3RlcmVkCiAgICovCiAgaGFzKHZpZXdJZCkgewogICAgcmV0dXJuIHRoaXMudmlld3MuaGFzKHZpZXdJZCk7CiAgfQogIC8qKgogICAqIEdldCB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgdmlld3MKICAgKi8KICBnZXQgc2l6ZSgpIHsKICAgIHJldHVybiB0aGlzLnZpZXdzLnNpemU7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWFwcHVpL2RlZXMtYXBwdWktbWFpbm1lbnUvZGVlcy1hcHB1aS1tYWlubWVudS5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkZW1vRnVuYzMyID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgLmRlbW8tbWFpbm1lbnUtY29udGFpbmVyIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBiYWNrZ3JvdW5kOiAjMWExYTFhOwogICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICB9CiAgICAuZGVtby1tYWlubWVudS1jb250YWluZXIgLnNwYWNlciB7CiAgICAgIGZsZXg6IDE7CiAgICAgIGJhY2tncm91bmQ6ICMwZjBmMGY7CiAgICB9CiAgPC9zdHlsZT4KICA8ZGl2IGNsYXNzPSJkZW1vLW1haW5tZW51LWNvbnRhaW5lciI+CiAgICA8ZGVlcy1hcHB1aS1tYWlubWVudQogICAgICAubG9nb0ljb249JHsibHVjaWRlOmJveCJ9CiAgICAgIC5sb2dvVGV4dD0keyJBY21lIEFwcCJ9CiAgICAgIC5tZW51R3JvdXBzPSR7WwogIHsKICAgIHRhYnM6IFsKICAgICAgeyBrZXk6ICJEYXNoYm9hcmQiLCBpY29uTmFtZTogImx1Y2lkZTpob21lIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiRGFzaGJvYXJkIikgfSwKICAgICAgeyBrZXk6ICJJbmJveCIsIGljb25OYW1lOiAibHVjaWRlOmluYm94IiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiSW5ib3giKSB9CiAgICBdCiAgfSwKICB7CiAgICBuYW1lOiAiV29ya3NwYWNlIiwKICAgIHRhYnM6IFsKICAgICAgeyBrZXk6ICJQcm9qZWN0cyIsIGljb25OYW1lOiAibHVjaWRlOmZvbGRlciIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIlByb2plY3RzIikgfSwKICAgICAgeyBrZXk6ICJUYXNrcyIsIGljb25OYW1lOiAibHVjaWRlOmNoZWNrU3F1YXJlIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiVGFza3MiKSB9LAogICAgICB7IGtleTogIkRvY3VtZW50cyIsIGljb25OYW1lOiAibHVjaWRlOmZpbGVUZXh0IiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiRG9jdW1lbnRzIikgfQogICAgXQogIH0sCiAgewogICAgbmFtZTogIkFuYWx5dGljcyIsCiAgICB0YWJzOiBbCiAgICAgIHsga2V5OiAiUmVwb3J0cyIsIGljb25OYW1lOiAibHVjaWRlOmJhckNoYXJ0MyIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIlJlcG9ydHMiKSB9LAogICAgICB7IGtleTogIkluc2lnaHRzIiwgaWNvbk5hbWU6ICJsdWNpZGU6bGlnaHRidWxiIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiSW5zaWdodHMiKSB9CiAgICBdCiAgfQpdfQogICAgICAuYm90dG9tVGFicz0ke1sKICB7IGtleTogIlNldHRpbmdzIiwgaWNvbk5hbWU6ICJsdWNpZGU6c2V0dGluZ3MiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJTZXR0aW5ncyIpIH0sCiAgeyBrZXk6ICJIZWxwIiwgaWNvbk5hbWU6ICJsdWNpZGU6aGVscENpcmNsZSIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIkhlbHAiKSB9Cl19CiAgICA+PC9kZWVzLWFwcHVpLW1haW5tZW51PgogICAgPGRpdiBjbGFzcz0ic3BhY2VyIj48L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1hcHB1aS9kZWVzLWFwcHVpLW1haW5tZW51L2RlZXMtYXBwdWktbWFpbm1lbnUuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlNDQgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczQ1ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzQXBwdWlNYWlubWVudSA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1hcHB1aS1tYWlubWVudSIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX2xvZ29JY29uX2RlY29yYXRvcnM7CiAgbGV0IF9sb2dvSWNvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xvZ29JY29uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb2dvVGV4dF9kZWNvcmF0b3JzOwogIGxldCBfbG9nb1RleHRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb2dvVGV4dF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWVudUdyb3Vwc19kZWNvcmF0b3JzOwogIGxldCBfbWVudUdyb3Vwc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21lbnVHcm91cHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2JvdHRvbVRhYnNfZGVjb3JhdG9yczsKICBsZXQgX2JvdHRvbVRhYnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ib3R0b21UYWJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90YWJzX2RlY29yYXRvcnM7CiAgbGV0IF90YWJzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGFic19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRUYWJfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkVGFiX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRUYWJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbGxhcHNlZF9kZWNvcmF0b3JzOwogIGxldCBfY29sbGFwc2VkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29sbGFwc2VkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNBcHB1aU1haW5tZW51MiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2xvZ29JY29uX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfbG9nb1RleHRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9tZW51R3JvdXBzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF9ib3R0b21UYWJzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF90YWJzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF9zZWxlY3RlZFRhYl9kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfY29sbGFwc2VkX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0pXTsKICAgICAgX19lc0RlY29yYXRlNDQodGhpcywgbnVsbCwgX2xvZ29JY29uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxvZ29JY29uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsb2dvSWNvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sb2dvSWNvbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubG9nb0ljb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbG9nb0ljb25faW5pdGlhbGl6ZXJzLCBfbG9nb0ljb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0NCh0aGlzLCBudWxsLCBfbG9nb1RleHRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibG9nb1RleHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImxvZ29UZXh0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmxvZ29UZXh0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5sb2dvVGV4dCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9sb2dvVGV4dF9pbml0aWFsaXplcnMsIF9sb2dvVGV4dF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ0KHRoaXMsIG51bGwsIF9tZW51R3JvdXBzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1lbnVHcm91cHMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1lbnVHcm91cHMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWVudUdyb3Vwcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWVudUdyb3VwcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tZW51R3JvdXBzX2luaXRpYWxpemVycywgX21lbnVHcm91cHNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0NCh0aGlzLCBudWxsLCBfYm90dG9tVGFic19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJib3R0b21UYWJzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJib3R0b21UYWJzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmJvdHRvbVRhYnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmJvdHRvbVRhYnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYm90dG9tVGFic19pbml0aWFsaXplcnMsIF9ib3R0b21UYWJzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDQodGhpcywgbnVsbCwgX3RhYnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGFicyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGFicyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50YWJzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50YWJzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3RhYnNfaW5pdGlhbGl6ZXJzLCBfdGFic19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ0KHRoaXMsIG51bGwsIF9zZWxlY3RlZFRhYl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWxlY3RlZFRhYiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0ZWRUYWIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0ZWRUYWIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlbGVjdGVkVGFiID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGVkVGFiX2luaXRpYWxpemVycywgX3NlbGVjdGVkVGFiX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDQodGhpcywgbnVsbCwgX2NvbGxhcHNlZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb2xsYXBzZWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNvbGxhcHNlZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jb2xsYXBzZWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvbGxhcHNlZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jb2xsYXBzZWRfaW5pdGlhbGl6ZXJzLCBfY29sbGFwc2VkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDQobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzQXBwdWlNYWlubWVudTIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzMyOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkFwcCBVSSJdOwogICAgI2xvZ29JY29uX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczQ1KHRoaXMsIF9sb2dvSWNvbl9pbml0aWFsaXplcnMsICIiKTsKICAgIC8vIElOU1RBTkNFCiAgICAvLyBMb2dvIHByb3BlcnRpZXMKICAgIGdldCBsb2dvSWNvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xvZ29JY29uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbG9nb0ljb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI2xvZ29JY29uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbG9nb1RleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ1KHRoaXMsIF9sb2dvSWNvbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDUodGhpcywgX2xvZ29UZXh0X2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBsb2dvVGV4dCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xvZ29UZXh0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbG9nb1RleHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2xvZ29UZXh0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWVudUdyb3Vwc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDUodGhpcywgX2xvZ29UZXh0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0NSh0aGlzLCBfbWVudUdyb3Vwc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICAvLyBNZW51IGdyb3VwcyAobmV3IHdheSkKICAgIGdldCBtZW51R3JvdXBzKCkgewogICAgICByZXR1cm4gdGhpcy4jbWVudUdyb3Vwc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1lbnVHcm91cHModmFsdWUyKSB7CiAgICAgIHRoaXMuI21lbnVHcm91cHNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNib3R0b21UYWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0NSh0aGlzLCBfbWVudUdyb3Vwc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDUodGhpcywgX2JvdHRvbVRhYnNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgLy8gQm90dG9tIHRhYnMgKHBpbm5lZCB0byBib3R0b20pCiAgICBnZXQgYm90dG9tVGFicygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2JvdHRvbVRhYnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBib3R0b21UYWJzKHZhbHVlMikgewogICAgICB0aGlzLiNib3R0b21UYWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdGFic19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDUodGhpcywgX2JvdHRvbVRhYnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQ1KHRoaXMsIF90YWJzX2luaXRpYWxpemVycywgW10pKTsKICAgIC8vIExlZ2FjeSB0YWJzIHByb3BlcnR5IChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkKICAgIGdldCB0YWJzKCkgewogICAgICByZXR1cm4gdGhpcy4jdGFic19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRhYnModmFsdWUyKSB7CiAgICAgIHRoaXMuI3RhYnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWxlY3RlZFRhYl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDUodGhpcywgX3RhYnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQ1KHRoaXMsIF9zZWxlY3RlZFRhYl9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgZ2V0IHNlbGVjdGVkVGFiKCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRUYWJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3RlZFRhYih2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VsZWN0ZWRUYWJfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjb2xsYXBzZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ1KHRoaXMsIF9zZWxlY3RlZFRhYl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDUodGhpcywgX2NvbGxhcHNlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgY29sbGFwc2VkKCkgewogICAgICByZXR1cm4gdGhpcy4jY29sbGFwc2VkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29sbGFwc2VkKHZhbHVlMikgewogICAgICB0aGlzLiNjb2xsYXBzZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgLS1tZW51LXdpZHRoLWV4cGFuZGVkOiAyMDBweDsKICAgICAgICAtLW1lbnUtd2lkdGgtY29sbGFwc2VkOiA1NnB4OwogICAgICAgIC0tdG9vbHRpcC1iZzogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxODE4MWIiLCAiI2ZhZmFmYSIpfTsKICAgICAgICAtLXRvb2x0aXAtZmc6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmFmYWZhIiwgIiMxODE4MWIiKX07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLm1haW5Db250YWluZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzY2NiIsICIjY2NjIil9OwogICAgICAgIHotaW5kZXg6ICR7ekluZGV4TGF5ZXJzLmZpeGVkLmFwcEJhcn07CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogdmFyKC0tbWVudS13aWR0aC1leHBhbmRlZCk7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmFmYWZhIiwgIiMwYTBhMGEiKX07CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU1ZTUiLCAiIzFhMWExYSIpfTsKICAgICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCAnSW50ZXInLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIHNhbnMtc2VyaWY7CiAgICAgICAgdHJhbnNpdGlvbjogd2lkdGggMC4yNXMgZWFzZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NvbGxhcHNlZF0pIC5tYWluQ29udGFpbmVyIHsKICAgICAgICB3aWR0aDogdmFyKC0tbWVudS13aWR0aC1jb2xsYXBzZWQpOwogICAgICB9CgogICAgICAvKiBGbG9hdGluZyBjb2xsYXBzZSB0b2dnbGUgYnV0dG9uICovCiAgICAgIC5jb2xsYXBzZS10b2dnbGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogLTEycHg7CiAgICAgICAgdG9wOiAyNHB4OwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsKICAgICAgICB3aWR0aDogMjRweDsKICAgICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMyNzI3MmEiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU1ZTUiLCAiIzNmM2Y0NiIpfTsKICAgICAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEpOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzM3MzczIiwgIiNhMWExYWEiKX07CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZSwgYmFja2dyb3VuZCAwLjE1cyBlYXNlOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5jb2xsYXBzZS10b2dnbGU6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjRmNGY1IiwgIiMzZjNmNDYiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMGEwYTBhIiwgIiNmYWZhZmEiKX07CiAgICAgIH0KCiAgICAgIDpob3N0KDpob3ZlcikgLmNvbGxhcHNlLXRvZ2dsZSB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmNvbGxhcHNlLXRvZ2dsZSBkZWVzLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQoKICAgICAgLyogTG9nbyBTZWN0aW9uICovCiAgICAgIC5sb2dvU2VjdGlvbiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTBweDsKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgcGFkZGluZzogMCAxNHB4OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTVlNSIsICIjMWExYTFhIil9OwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgIC5sb2dvU2VjdGlvbiAubG9nb0ljb24gewogICAgICAgIGZvbnQtc2l6ZTogMjJweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwYTBhMGEiLCAiI2ZhZmFmYSIpfTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLmxvZ29TZWN0aW9uIC5sb2dvVGV4dCB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwYTBhMGEiLCAiI2ZhZmFmYSIpfTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2UsIHdpZHRoIDAuMjVzIGVhc2U7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjb2xsYXBzZWRdKSAubG9nb1NlY3Rpb24gewogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZ2FwOiAwOwogICAgICB9CgogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLmxvZ29TZWN0aW9uIC5sb2dvVGV4dCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLyogTWlkZGxlIFNlY3Rpb24gKHNjcm9sbGFibGUpICovCiAgICAgIC5tZW51U2VjdGlvbiB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgICAgIHBhZGRpbmc6IDhweCAwOwogICAgICB9CgogICAgICAubWVudVNlY3Rpb246Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgICAgICB3aWR0aDogNnB4OwogICAgICB9CgogICAgICAubWVudVNlY3Rpb246Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgLm1lbnVTZWN0aW9uOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4xNSkiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgIH0KCiAgICAgIC5tZW51U2VjdGlvbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMjUpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSkiKX07CiAgICAgIH0KCiAgICAgIC8qIE1lbnUgR3JvdXAgKi8KICAgICAgLm1lbnVHcm91cCB7CiAgICAgICAgcGFkZGluZzogMCA4cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICB9CgogICAgICAubWVudUdyb3VwOmxhc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICAgIH0KCiAgICAgIC5ncm91cEhlYWRlciB7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHggNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzczNzM3MyIsICIjNzM3MzczIil9OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZSwgbWF4LWhlaWdodCAwLjI1cyBlYXNlOwogICAgICAgIG1heC1oZWlnaHQ6IDMwcHg7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjb2xsYXBzZWRdKSAuZ3JvdXBIZWFkZXIgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgbWF4LWhlaWdodDogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgLmdyb3VwVGFicyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogMnB4OwogICAgICB9CgogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLm1lbnVHcm91cCB7CiAgICAgICAgcGFkZGluZzogMCA0cHg7CiAgICAgIH0KCiAgICAgIC8qIFRhYiBJdGVtICovCiAgICAgIC50YWIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgIHBhZGRpbmc6IDEwcHggMTJweDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzUyNTI1MiIsICIjYTNhM2EzIil9OwogICAgICB9CgogICAgICAudGFiOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjA0KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzI2MjYyNiIsICIjZTVlNWU1Iil9OwogICAgICB9CgogICAgICAudGFiOmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wNikiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSIpfTsKICAgICAgfQoKICAgICAgLnRhYi5zZWxlY3RlZFRhYiB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wNikiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwYTBhMGEiLCAiI2ZhZmFmYSIpfTsKICAgICAgfQoKICAgICAgLnRhYi5zZWxlY3RlZFRhYjo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICAgICAgd2lkdGg6IDNweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwYTBhMGEiLCAiI2ZhZmFmYSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAwIDJweCAycHggMDsKICAgICAgfQoKICAgICAgLnRhYiBkZWVzLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBvcGFjaXR5OiAwLjg1OwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAudGFiLnNlbGVjdGVkVGFiIGRlZXMtaWNvbiB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLnRhYiAudGFiTGFiZWwgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycyBlYXNlLCB3aWR0aCAwLjI1cyBlYXNlOwogICAgICB9CgogICAgICAvKiBDb2xsYXBzZWQgdGFiIHN0eWxlcyAqLwogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLnRhYiB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgICBnYXA6IDA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjb2xsYXBzZWRdKSAudGFiIC50YWJMYWJlbCB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB3aWR0aDogMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjb2xsYXBzZWRdKSAudGFiLnNlbGVjdGVkVGFiOjpiZWZvcmUgewogICAgICAgIGxlZnQ6IC00cHg7CiAgICAgIH0KCiAgICAgIC8qIFRvb2x0aXAgZm9yIGNvbGxhcHNlZCBzdGF0ZSAqLwogICAgICAudGFiLXRvb2x0aXAgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAxMDAlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsKICAgICAgICBtYXJnaW4tbGVmdDogMTJweDsKICAgICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10b29sdGlwLWJnKTsKICAgICAgICBjb2xvcjogdmFyKC0tdG9vbHRpcC1mZyk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2U7CiAgICAgICAgei1pbmRleDogMTAwMDsKICAgICAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKICAgICAgfQoKICAgICAgLnRhYi10b29sdGlwOjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAtNHB4OwogICAgICAgIHRvcDogNTAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsKICAgICAgICBib3JkZXI6IDRweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6IHZhcigtLXRvb2x0aXAtYmcpOwogICAgICB9CgogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLnRhYjpob3ZlciAudGFiLXRvb2x0aXAgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogMXM7CiAgICAgIH0KCiAgICAgIC8qIEJhZGdlIHN0eWxlcyAqLwogICAgICAuYmFkZ2UgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgbWluLXdpZHRoOiAxOHB4OwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgICBwYWRkaW5nOiAwIDZweDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBib3JkZXItcmFkaXVzOiA5cHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICAgIH0KCiAgICAgIC5iYWRnZS5kZWZhdWx0IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjMjcyNzJhIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNmM2Y0NiIsICIjYTFhMWFhIil9OwogICAgICB9CgogICAgICAuYmFkZ2Uuc3VjY2VzcyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkY2ZjZTciLCAiIzE0NTMyZCIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxNjY1MzQiLCAiIzRhZGU4MCIpfTsKICAgICAgfQoKICAgICAgLmJhZGdlLndhcm5pbmcgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmVmM2M3IiwgIiM0NTFhMDMiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOTI0MDBlIiwgIiNmYmJmMjQiKX07CiAgICAgIH0KCiAgICAgIC5iYWRnZS5lcnJvciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZWUyZTIiLCAiIzQ1MGEwYSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5OTFiMWIiLCAiI2Y4NzE3MSIpfTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NvbGxhcHNlZF0pIC5iYWRnZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLyogQm90dG9tIFNlY3Rpb24gKi8KICAgICAgLmJvdHRvbVNlY3Rpb24gewogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU1ZTUiLCAiIzFhMWExYSIpfTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAycHg7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjb2xsYXBzZWRdKSAuYm90dG9tU2VjdGlvbiB7CiAgICAgICAgcGFkZGluZzogOHB4IDRweDsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgY29uc3QgYWxsVGFicyA9IHRoaXMuZ2V0QWxsVGFicygpOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9Im1haW5Db250YWluZXIiIEBjb250ZXh0bWVudT0keyhldmVudEFyZykgPT4gewogICAgICAgIERlZXNDb250ZXh0bWVudS5vcGVuQ29udGV4dE1lbnVXaXRoT3B0aW9ucyhldmVudEFyZywgW3sKICAgICAgICAgIG5hbWU6ICJhcHAgc2V0dGluZ3MiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICB9LAogICAgICAgICAgaWNvbk5hbWU6ICJnZWFyIgogICAgICAgIH1dKTsKICAgICAgfX0+CiAgICAgICAgJHt0aGlzLmxvZ29JY29uIHx8IHRoaXMubG9nb1RleHQgPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9ImxvZ29TZWN0aW9uIj4KICAgICAgICAgICAgJHt0aGlzLmxvZ29JY29uID8gYjJgPGRlZXMtaWNvbiBjbGFzcz0ibG9nb0ljb24iIC5pY29uPSIke3RoaXMubG9nb0ljb259Ij48L2RlZXMtaWNvbj5gIDogIiJ9CiAgICAgICAgICAgICR7dGhpcy5sb2dvVGV4dCA/IGIyYDxzcGFuIGNsYXNzPSJsb2dvVGV4dCI+JHt0aGlzLmxvZ29UZXh0fTwvc3Bhbj5gIDogIiJ9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgIDogIiJ9CgogICAgICAgIDxkaXYgY2xhc3M9Im1lbnVTZWN0aW9uIj4KICAgICAgICAgICR7dGhpcy5tZW51R3JvdXBzLmxlbmd0aCA+IDAgPyB0aGlzLnJlbmRlck1lbnVHcm91cHMoKSA6IHRoaXMucmVuZGVyTGVnYWN5VGFicygpfQogICAgICAgIDwvZGl2PgoKICAgICAgICAke3RoaXMuYm90dG9tVGFicy5sZW5ndGggPiAwID8gYjJgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJib3R0b21TZWN0aW9uIj4KICAgICAgICAgICAgJHt0aGlzLmJvdHRvbVRhYnMubWFwKCh0YWJBcmcpID0+IHRoaXMucmVuZGVyVGFiKHRhYkFyZykpfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgYCA6ICIifQogICAgICA8L2Rpdj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY29sbGFwc2UtdG9nZ2xlIiBAY2xpY2s9IiR7KCkgPT4gdGhpcy50b2dnbGVDb2xsYXBzZSgpfSI+CiAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0iJHt0aGlzLmNvbGxhcHNlZCA/ICJsdWNpZGU6Y2hldnJvblJpZ2h0IiA6ICJsdWNpZGU6Y2hldnJvbkxlZnQifSI+PC9kZWVzLWljb24+CiAgICAgIDwvYnV0dG9uPgogICAgYDsKICAgIH0KICAgIHJlbmRlck1lbnVHcm91cHMoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgJHt0aGlzLm1lbnVHcm91cHMubWFwKChncm91cCkgPT4gYjJgCiAgICAgICAgPGRpdiBjbGFzcz0ibWVudUdyb3VwIj4KICAgICAgICAgICR7Z3JvdXAubmFtZSA/IGIyYDxkaXYgY2xhc3M9Imdyb3VwSGVhZGVyIj4ke2dyb3VwLm5hbWV9PC9kaXY+YCA6ICIifQogICAgICAgICAgPGRpdiBjbGFzcz0iZ3JvdXBUYWJzIj4KICAgICAgICAgICAgJHtncm91cC5pdGVtcy5tYXAoKHRhYkFyZykgPT4gdGhpcy5yZW5kZXJUYWIodGFiQXJnKSl9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgYCl9CiAgICBgOwogICAgfQogICAgcmVuZGVyTGVnYWN5VGFicygpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJtZW51R3JvdXAiPgogICAgICAgIDxkaXYgY2xhc3M9Imdyb3VwVGFicyI+CiAgICAgICAgICAke3RoaXMudGFicy5tYXAoKHRhYkFyZykgPT4gdGhpcy5yZW5kZXJUYWIodGFiQXJnKSl9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlclRhYih0YWJBcmcpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9InRhYiAke3RhYkFyZyA9PT0gdGhpcy5zZWxlY3RlZFRhYiA/ICJzZWxlY3RlZFRhYiIgOiAiIn0iCiAgICAgICAgQGNsaWNrPSIkeygpID0+IHsKICAgICAgICB0aGlzLnVwZGF0ZVRhYih0YWJBcmcpOwogICAgICB9fSIKICAgICAgPgogICAgICAgIDxkZWVzLWljb24gLmljb249IiR7dGFiQXJnLmljb25OYW1lIHx8ICIifSI+PC9kZWVzLWljb24+CiAgICAgICAgPHNwYW4gY2xhc3M9InRhYkxhYmVsIj4ke3RhYkFyZy5rZXl9PC9zcGFuPgogICAgICAgICR7dGFiQXJnLmJhZGdlICE9PSB2b2lkIDAgPyBiMmAKICAgICAgICAgIDxzcGFuIGNsYXNzPSJiYWRnZSAke3RhYkFyZy5iYWRnZVZhcmlhbnQgfHwgImRlZmF1bHQifSI+JHt0YWJBcmcuYmFkZ2V9PC9zcGFuPgogICAgICAgIGAgOiAiIn0KICAgICAgICA8c3BhbiBjbGFzcz0idGFiLXRvb2x0aXAiPiR7dGFiQXJnLmtleX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGdldEFsbFRhYnMoKSB7CiAgICAgIGlmICh0aGlzLm1lbnVHcm91cHMubGVuZ3RoID4gMCkgewogICAgICAgIGNvbnN0IGdyb3VwVGFicyA9IHRoaXMubWVudUdyb3Vwcy5mbGF0TWFwKChncm91cCkgPT4gZ3JvdXAuaXRlbXMpOwogICAgICAgIHJldHVybiBbLi4uZ3JvdXBUYWJzLCAuLi50aGlzLmJvdHRvbVRhYnNdOwogICAgICB9CiAgICAgIHJldHVybiBbLi4udGhpcy50YWJzLCAuLi50aGlzLmJvdHRvbVRhYnNdOwogICAgfQogICAgdXBkYXRlVGFiKHRhYkFyZykgewogICAgICB0aGlzLnNlbGVjdGVkVGFiID0gdGFiQXJnOwogICAgICB0aGlzLnNlbGVjdGVkVGFiLmFjdGlvbigpOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJ0YWItc2VsZWN0IiwgewogICAgICAgIGRldGFpbDogeyB0YWI6IHRhYkFyZyB9LAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgZmlyc3RVcGRhdGVkKCkgewogICAgICBjb25zdCBhbGxUYWJzID0gdGhpcy5nZXRBbGxUYWJzKCk7CiAgICAgIGlmIChhbGxUYWJzLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLnVwZGF0ZVRhYihhbGxUYWJzWzBdKTsKICAgICAgfQogICAgfQogICAgdG9nZ2xlQ29sbGFwc2UoKSB7CiAgICAgIHRoaXMuY29sbGFwc2VkID0gIXRoaXMuY29sbGFwc2VkOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjb2xsYXBzZS1jaGFuZ2UiLCB7CiAgICAgICAgZGV0YWlsOiB7IGNvbGxhcHNlZDogdGhpcy5jb2xsYXBzZWQgfSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczQ1KHRoaXMsIF9jb2xsYXBzZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM0NShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0FwcHVpTWFpbm1lbnUyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1hcHB1aS9kZWVzLWFwcHVpLXNlY29uZGFyeW1lbnUvZGVlcy1hcHB1aS1zZWNvbmRhcnltZW51LmRlbW8uanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIGRlbW9GdW5jMzMgPSAoKSA9PiBiMmAKICA8c3R5bGU+CiAgICAuZGVtby1zZWNvbmRhcnltZW51LWNvbnRhaW5lciB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGhlaWdodDogMTAwJTsKICAgICAgYmFja2dyb3VuZDogIzFhMWExYTsKICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgfQogICAgLmRlbW8tc2Vjb25kYXJ5bWVudS1jb250YWluZXIgLnNwYWNlciB7CiAgICAgIGZsZXg6IDE7CiAgICAgIGJhY2tncm91bmQ6ICMwZjBmMGY7CiAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgIGNvbG9yOiAjYTNhM2EzOwogICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCBzYW5zLXNlcmlmOwogICAgfQogICAgLmRlbW8tc2Vjb25kYXJ5bWVudS1jb250YWluZXIgLnNwYWNlciBoMyB7CiAgICAgIGNvbG9yOiAjZmFmYWZhOwogICAgICBtYXJnaW4tdG9wOiAwOwogICAgfQogICAgLmRlbW8tc2Vjb25kYXJ5bWVudS1jb250YWluZXIgLnNwYWNlciBjb2RlIHsKICAgICAgYmFja2dyb3VuZDogIzI3MjcyYTsKICAgICAgcGFkZGluZzogMnB4IDZweDsKICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICBmb250LXNpemU6IDEycHg7CiAgICB9CiAgICAuZGVtby1zZWNvbmRhcnltZW51LWNvbnRhaW5lciAuc3BhY2VyIHVsIHsKICAgICAgbGluZS1oZWlnaHQ6IDEuODsKICAgIH0KICA8L3N0eWxlPgogIDxkaXYgY2xhc3M9ImRlbW8tc2Vjb25kYXJ5bWVudS1jb250YWluZXIiPgogICAgPGRlZXMtYXBwdWktc2Vjb25kYXJ5bWVudQogICAgICAuaGVhZGluZz0keyJQcm9qZWN0cyJ9CiAgICAgIC5ncm91cHM9JHtbCiAgLy8gR3JvdXAgMTogVGFiIGl0ZW1zIChkZWZhdWx0IGJlaGF2aW9yKQogIHsKICAgIG5hbWU6ICJOYXZpZ2F0aW9uIiwKICAgIGljb25OYW1lOiAibHVjaWRlOmNvbXBhc3MiLAogICAgaXRlbXM6IFsKICAgICAgeyBrZXk6ICJEYXNoYm9hcmQiLCBpY29uTmFtZTogImx1Y2lkZTpsYXlvdXREYXNoYm9hcmQiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJEYXNoYm9hcmQgY2xpY2tlZCIpLCBiYWRnZTogMywgYmFkZ2VWYXJpYW50OiAid2FybmluZyIgfSwKICAgICAgeyBrZXk6ICJQcm9qZWN0cyIsIGljb25OYW1lOiAibHVjaWRlOmZvbGRlciIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIlByb2plY3RzIGNsaWNrZWQiKSwgYmFkZ2U6ICJuZXciLCBiYWRnZVZhcmlhbnQ6ICJzdWNjZXNzIiB9LAogICAgICB7IGtleTogIkFuYWx5dGljcyIsIGljb25OYW1lOiAibHVjaWRlOmJhckNoYXJ0MiIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIkFuYWx5dGljcyBjbGlja2VkIikgfQogICAgXQogIH0sCiAgLy8gR3JvdXAgMjogQWN0aW9ucwogIHsKICAgIG5hbWU6ICJBY3Rpb25zIiwKICAgIGljb25OYW1lOiAibHVjaWRlOnphcCIsCiAgICBpdGVtczogWwogICAgICB7IHR5cGU6ICJhY3Rpb24iLCBrZXk6ICJDcmVhdGUgTmV3IiwgaWNvbk5hbWU6ICJsdWNpZGU6cGx1cyIsIGFjdGlvbjogKCkgPT4gYWxlcnQoIkNyZWF0ZSBOZXcgY2xpY2tlZCEiKSB9LAogICAgICB7IHR5cGU6ICJhY3Rpb24iLCBrZXk6ICJJbXBvcnQgRGF0YSIsIGljb25OYW1lOiAibHVjaWRlOnVwbG9hZCIsIGFjdGlvbjogKCkgPT4gYWxlcnQoIkltcG9ydCBEYXRhIGNsaWNrZWQhIikgfSwKICAgICAgeyB0eXBlOiAiZGl2aWRlciIgfSwKICAgICAgeyB0eXBlOiAiYWN0aW9uIiwga2V5OiAiRGVsZXRlIEFsbCIsIGljb25OYW1lOiAibHVjaWRlOnRyYXNoMiIsIHZhcmlhbnQ6ICJkYW5nZXIiLCBjb25maXJtTWVzc2FnZTogIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgYWxsIGl0ZW1zPyIsIGFjdGlvbjogKCkgPT4gYWxlcnQoIkRlbGV0ZWQhIikgfQogICAgXQogIH0sCiAgLy8gR3JvdXAgMzogRmlsdGVycwogIHsKICAgIG5hbWU6ICJGaWx0ZXJzIiwKICAgIGljb25OYW1lOiAibHVjaWRlOmZpbHRlciIsCiAgICBpdGVtczogWwogICAgICB7IHR5cGU6ICJoZWFkZXIiLCBsYWJlbDogIlN0YXR1cyIgfSwKICAgICAgeyB0eXBlOiAiZmlsdGVyIiwga2V5OiAiU2hvdyBBY3RpdmUiLCBpY29uTmFtZTogImx1Y2lkZTpjaGVja0NpcmNsZSIsIGFjdGl2ZTogdHJ1ZSwgb25Ub2dnbGU6IChhY3RpdmUpID0+IGNvbnNvbGUubG9nKCJTaG93IEFjdGl2ZToiLCBhY3RpdmUpIH0sCiAgICAgIHsgdHlwZTogImZpbHRlciIsIGtleTogIlNob3cgQXJjaGl2ZWQiLCBpY29uTmFtZTogImx1Y2lkZTphcmNoaXZlIiwgYWN0aXZlOiBmYWxzZSwgb25Ub2dnbGU6IChhY3RpdmUpID0+IGNvbnNvbGUubG9nKCJTaG93IEFyY2hpdmVkOiIsIGFjdGl2ZSkgfSwKICAgICAgeyB0eXBlOiAiZGl2aWRlciIgfSwKICAgICAgeyB0eXBlOiAibXVsdGlGaWx0ZXIiLCBrZXk6ICJDYXRlZ29yaWVzIiwgaWNvbk5hbWU6ICJsdWNpZGU6dGFnIiwgY29sbGFwc2VkOiBmYWxzZSwgb3B0aW9uczogWwogICAgICAgIHsga2V5OiAiZnJvbnRlbmQiLCBsYWJlbDogIkZyb250ZW5kIiwgY2hlY2tlZDogdHJ1ZSwgaWNvbk5hbWU6ICJsdWNpZGU6bW9uaXRvciIgfSwKICAgICAgICB7IGtleTogImJhY2tlbmQiLCBsYWJlbDogIkJhY2tlbmQiLCBjaGVja2VkOiB0cnVlLCBpY29uTmFtZTogImx1Y2lkZTpzZXJ2ZXIiIH0sCiAgICAgICAgeyBrZXk6ICJkZXZvcHMiLCBsYWJlbDogIkRldk9wcyIsIGNoZWNrZWQ6IGZhbHNlLCBpY29uTmFtZTogImx1Y2lkZTpjbG91ZCIgfSwKICAgICAgICB7IGtleTogImRlc2lnbiIsIGxhYmVsOiAiRGVzaWduIiwgY2hlY2tlZDogZmFsc2UsIGljb25OYW1lOiAibHVjaWRlOnBhbGV0dGUiIH0KICAgICAgXSwgb25DaGFuZ2U6IChrZXlzMikgPT4gY29uc29sZS5sb2coIlNlbGVjdGVkIGNhdGVnb3JpZXM6Iiwga2V5czIpIH0KICAgIF0KICB9LAogIC8vIEdyb3VwIDQ6IExpbmtzIGFuZCBtaXNjCiAgewogICAgbmFtZTogIlJlc291cmNlcyIsCiAgICBpY29uTmFtZTogImx1Y2lkZTpib29rT3BlbiIsCiAgICBjb2xsYXBzZWQ6IHRydWUsCiAgICBpdGVtczogWwogICAgICB7IHR5cGU6ICJoZWFkZXIiLCBsYWJlbDogIkRvY3VtZW50YXRpb24iIH0sCiAgICAgIHsgdHlwZTogImxpbmsiLCBrZXk6ICJBUEkgUmVmZXJlbmNlIiwgaWNvbk5hbWU6ICJsdWNpZGU6ZmlsZVRleHQiLCBocmVmOiAiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vZG9jcyIgfSwKICAgICAgeyB0eXBlOiAibGluayIsIGtleTogIlVzZXIgR3VpZGUiLCBpY29uTmFtZTogImx1Y2lkZTpib29rIiwgaHJlZjogImh0dHBzOi8vZG9jcy5leGFtcGxlLmNvbS9ndWlkZSIgfSwKICAgICAgeyB0eXBlOiAiZGl2aWRlciIgfSwKICAgICAgeyB0eXBlOiAiaGVhZGVyIiwgbGFiZWw6ICJTdXBwb3J0IiB9LAogICAgICB7IHR5cGU6ICJsaW5rIiwga2V5OiAiSGVscCBDZW50ZXIiLCBpY29uTmFtZTogImx1Y2lkZTpoZWxwQ2lyY2xlIiwgaHJlZjogIi9oZWxwIiwgZXh0ZXJuYWw6IGZhbHNlIH0sCiAgICAgIHsgdHlwZTogImxpbmsiLCBrZXk6ICJHaXRIdWIgSXNzdWVzIiwgaWNvbk5hbWU6ICJsdWNpZGU6Z2l0aHViIiwgaHJlZjogImh0dHBzOi8vZ2l0aHViLmNvbS9leGFtcGxlL2lzc3VlcyIgfQogICAgXQogIH0KXX0KICAgICAgQGl0ZW0tc2VsZWN0PSR7KGUxMSkgPT4gY29uc29sZS5sb2coIlRhYiBzZWxlY3RlZDoiLCBlMTEuZGV0YWlsKX0KICAgICAgQGFjdGlvbi1jbGljaz0keyhlMTEpID0+IGNvbnNvbGUubG9nKCJBY3Rpb24gY2xpY2tlZDoiLCBlMTEuZGV0YWlsKX0KICAgICAgQGZpbHRlci10b2dnbGU9JHsoZTExKSA9PiBjb25zb2xlLmxvZygiRmlsdGVyIHRvZ2dsZWQ6IiwgZTExLmRldGFpbCl9CiAgICAgIEBtdWx0aWZpbHRlci1jaGFuZ2U9JHsoZTExKSA9PiBjb25zb2xlLmxvZygiTXVsdGktZmlsdGVyIGNoYW5nZWQ6IiwgZTExLmRldGFpbCl9CiAgICAgIEBsaW5rLWNsaWNrPSR7KGUxMSkgPT4gY29uc29sZS5sb2coIkxpbmsgY2xpY2tlZDoiLCBlMTEuZGV0YWlsKX0KICAgID48L2RlZXMtYXBwdWktc2Vjb25kYXJ5bWVudT4KICAgIDxkaXYgY2xhc3M9InNwYWNlciI+CiAgICAgIDxoMz5TZWNvbmRhcnkgTWVudSBEZW1vPC9oMz4KICAgICAgPHA+VGhpcyBkZW1vIHNob3djYXNlcyBhbGwgOCBpdGVtIHR5cGVzOjwvcD4KICAgICAgPHVsPgogICAgICAgIDxsaT48Y29kZT50YWI8L2NvZGU+IC0gU2VsZWN0YWJsZSBpdGVtcyAoTmF2aWdhdGlvbiBncm91cCk8L2xpPgogICAgICAgIDxsaT48Y29kZT5hY3Rpb248L2NvZGU+IC0gQmx1ZSBhY3Rpb25zIChBY3Rpb25zIGdyb3VwKTwvbGk+CiAgICAgICAgPGxpPjxjb2RlPmFjdGlvbjwvY29kZT4gd2l0aCA8Y29kZT52YXJpYW50OiAnZGFuZ2VyJzwvY29kZT4gLSBSZWQgZGFuZ2VyIGFjdGlvbjwvbGk+CiAgICAgICAgPGxpPjxjb2RlPmZpbHRlcjwvY29kZT4gLSBDaGVja2JveCB0b2dnbGVzIChGaWx0ZXJzIGdyb3VwKTwvbGk+CiAgICAgICAgPGxpPjxjb2RlPm11bHRpRmlsdGVyPC9jb2RlPiAtIENvbGxhcHNpYmxlIG11bHRpLXNlbGVjdCAoQ2F0ZWdvcmllcyk8L2xpPgogICAgICAgIDxsaT48Y29kZT5kaXZpZGVyPC9jb2RlPiAtIFZpc3VhbCBzZXBhcmF0b3JzPC9saT4KICAgICAgICA8bGk+PGNvZGU+aGVhZGVyPC9jb2RlPiAtIFNlY3Rpb24gbGFiZWxzPC9saT4KICAgICAgICA8bGk+PGNvZGU+bGluazwvY29kZT4gLSBFeHRlcm5hbC9pbnRlcm5hbCBsaW5rcyAoUmVzb3VyY2VzIGdyb3VwKTwvbGk+CiAgICAgIDwvdWw+CiAgICAgIDxwPlRyeSB0aGUgY29sbGFwc2UgdG9nZ2xlIG9uIHRoZSBsZWZ0IGVkZ2UhPC9wPgogICAgPC9kaXY+CiAgPC9kaXY+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtYXBwdWkvZGVlcy1hcHB1aS1zZWNvbmRhcnltZW51L2RlZXMtYXBwdWktc2Vjb25kYXJ5bWVudS5qcwppbml0X2RlZXNfaWNvbigpOwppbml0X2Rpc3RfdHMzMCgpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU0NSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNDYgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNBcHB1aVNlY29uZGFyeW1lbnUgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtYXBwdWktc2Vjb25kYXJ5bWVudSIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX2hlYWRpbmdfZGVjb3JhdG9yczsKICBsZXQgX2hlYWRpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oZWFkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ncm91cHNfZGVjb3JhdG9yczsKICBsZXQgX2dyb3Vwc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2dyb3Vwc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0aW9uT3B0aW9uc19kZWNvcmF0b3JzOwogIGxldCBfc2VsZWN0aW9uT3B0aW9uc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGlvbk9wdGlvbnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkSXRlbV9kZWNvcmF0b3JzOwogIGxldCBfc2VsZWN0ZWRJdGVtX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRJdGVtX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb2xsYXBzZWRHcm91cHNfZGVjb3JhdG9yczsKICBsZXQgX2NvbGxhcHNlZEdyb3Vwc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbGxhcHNlZEdyb3Vwc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29sbGFwc2VkTXVsdGlGaWx0ZXJzX2RlY29yYXRvcnM7CiAgbGV0IF9jb2xsYXBzZWRNdWx0aUZpbHRlcnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb2xsYXBzZWRNdWx0aUZpbHRlcnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlbmRlckNvdW50ZXJfZGVjb3JhdG9yczsKICBsZXQgX3JlbmRlckNvdW50ZXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZW5kZXJDb3VudGVyX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb2xsYXBzZWRfZGVjb3JhdG9yczsKICBsZXQgX2NvbGxhcHNlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbGxhcHNlZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzQXBwdWlTZWNvbmRhcnltZW51MiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2hlYWRpbmdfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9ncm91cHNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX3NlbGVjdGlvbk9wdGlvbnNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX3NlbGVjdGVkSXRlbV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogT2JqZWN0IH0pXTsKICAgICAgX2NvbGxhcHNlZEdyb3Vwc19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfY29sbGFwc2VkTXVsdGlGaWx0ZXJzX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9yZW5kZXJDb3VudGVyX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9jb2xsYXBzZWRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSldOwogICAgICBfX2VzRGVjb3JhdGU0NSh0aGlzLCBudWxsLCBfaGVhZGluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJoZWFkaW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJoZWFkaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmhlYWRpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmhlYWRpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaGVhZGluZ19pbml0aWFsaXplcnMsIF9oZWFkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDUodGhpcywgbnVsbCwgX2dyb3Vwc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJncm91cHMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImdyb3VwcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5ncm91cHMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmdyb3VwcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9ncm91cHNfaW5pdGlhbGl6ZXJzLCBfZ3JvdXBzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDUodGhpcywgbnVsbCwgX3NlbGVjdGlvbk9wdGlvbnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0aW9uT3B0aW9ucyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0aW9uT3B0aW9ucyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWxlY3Rpb25PcHRpb25zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3Rpb25PcHRpb25zID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGlvbk9wdGlvbnNfaW5pdGlhbGl6ZXJzLCBfc2VsZWN0aW9uT3B0aW9uc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ1KHRoaXMsIG51bGwsIF9zZWxlY3RlZEl0ZW1fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0ZWRJdGVtIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3RlZEl0ZW0iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0ZWRJdGVtLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3RlZEl0ZW0gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0ZWRJdGVtX2luaXRpYWxpemVycywgX3NlbGVjdGVkSXRlbV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ1KHRoaXMsIG51bGwsIF9jb2xsYXBzZWRHcm91cHNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29sbGFwc2VkR3JvdXBzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb2xsYXBzZWRHcm91cHMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29sbGFwc2VkR3JvdXBzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jb2xsYXBzZWRHcm91cHMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29sbGFwc2VkR3JvdXBzX2luaXRpYWxpemVycywgX2NvbGxhcHNlZEdyb3Vwc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ1KHRoaXMsIG51bGwsIF9jb2xsYXBzZWRNdWx0aUZpbHRlcnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29sbGFwc2VkTXVsdGlGaWx0ZXJzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb2xsYXBzZWRNdWx0aUZpbHRlcnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29sbGFwc2VkTXVsdGlGaWx0ZXJzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jb2xsYXBzZWRNdWx0aUZpbHRlcnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29sbGFwc2VkTXVsdGlGaWx0ZXJzX2luaXRpYWxpemVycywgX2NvbGxhcHNlZE11bHRpRmlsdGVyc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ1KHRoaXMsIG51bGwsIF9yZW5kZXJDb3VudGVyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJlbmRlckNvdW50ZXIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInJlbmRlckNvdW50ZXIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucmVuZGVyQ291bnRlciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucmVuZGVyQ291bnRlciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9yZW5kZXJDb3VudGVyX2luaXRpYWxpemVycywgX3JlbmRlckNvdW50ZXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0NSh0aGlzLCBudWxsLCBfY29sbGFwc2VkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNvbGxhcHNlZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29sbGFwc2VkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNvbGxhcHNlZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY29sbGFwc2VkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbGxhcHNlZF9pbml0aWFsaXplcnMsIF9jb2xsYXBzZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0NShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNBcHB1aVNlY29uZGFyeW1lbnUyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMzMzsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJBcHAgVUkiXTsKICAgICNoZWFkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczQ2KHRoaXMsIF9oZWFkaW5nX2luaXRpYWxpemVycywgIk1lbnUiKTsKICAgIC8vIElOU1RBTkNFCiAgICAvKiogRHluYW1pYyBoZWFkaW5nIC0gdHlwaWNhbGx5IHNob3dzIHRoZSBzZWxlY3RlZCBNYWluTWVudSBpdGVtICovCiAgICBnZXQgaGVhZGluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2hlYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBoZWFkaW5nKHZhbHVlMikgewogICAgICB0aGlzLiNoZWFkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZ3JvdXBzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Nih0aGlzLCBfaGVhZGluZ19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDYodGhpcywgX2dyb3Vwc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICAvKiogR3JvdXBlZCBpdGVtcyB3aXRoIGNvbGxhcHNlIHN1cHBvcnQgLSBzdXBwb3J0cyBuZXcgSVNlY29uZGFyeU1lbnVHcm91cCAqLwogICAgZ2V0IGdyb3VwcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2dyb3Vwc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGdyb3Vwcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZ3JvdXBzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0aW9uT3B0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDYodGhpcywgX2dyb3Vwc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDYodGhpcywgX3NlbGVjdGlvbk9wdGlvbnNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgLyoqIExlZ2FjeSBmbGF0IGxpc3Qgc3VwcG9ydCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwogICAgZ2V0IHNlbGVjdGlvbk9wdGlvbnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWxlY3Rpb25PcHRpb25zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0aW9uT3B0aW9ucyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VsZWN0aW9uT3B0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NlbGVjdGVkSXRlbV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDYodGhpcywgX3NlbGVjdGlvbk9wdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQ2KHRoaXMsIF9zZWxlY3RlZEl0ZW1faW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICAvKiogQ3VycmVudGx5IHNlbGVjdGVkIHRhYiBpdGVtICovCiAgICBnZXQgc2VsZWN0ZWRJdGVtKCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRJdGVtX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0ZWRJdGVtKHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3RlZEl0ZW1fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjb2xsYXBzZWRHcm91cHNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ2KHRoaXMsIF9zZWxlY3RlZEl0ZW1fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQ2KHRoaXMsIF9jb2xsYXBzZWRHcm91cHNfaW5pdGlhbGl6ZXJzLCAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKSk7CiAgICAvKiogSW50ZXJuYWwgc3RhdGUgZm9yIGNvbGxhcHNlZCBncm91cHMgKi8KICAgIGdldCBjb2xsYXBzZWRHcm91cHMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb2xsYXBzZWRHcm91cHNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjb2xsYXBzZWRHcm91cHModmFsdWUyKSB7CiAgICAgIHRoaXMuI2NvbGxhcHNlZEdyb3Vwc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NvbGxhcHNlZE11bHRpRmlsdGVyc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDYodGhpcywgX2NvbGxhcHNlZEdyb3Vwc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDYodGhpcywgX2NvbGxhcHNlZE11bHRpRmlsdGVyc19pbml0aWFsaXplcnMsIC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpKTsKICAgIC8qKiBJbnRlcm5hbCBzdGF0ZSBmb3IgY29sbGFwc2VkIG11bHRpLWZpbHRlcnMgKi8KICAgIGdldCBjb2xsYXBzZWRNdWx0aUZpbHRlcnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb2xsYXBzZWRNdWx0aUZpbHRlcnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjb2xsYXBzZWRNdWx0aUZpbHRlcnModmFsdWUyKSB7CiAgICAgIHRoaXMuI2NvbGxhcHNlZE11bHRpRmlsdGVyc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3JlbmRlckNvdW50ZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ2KHRoaXMsIF9jb2xsYXBzZWRNdWx0aUZpbHRlcnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQ2KHRoaXMsIF9yZW5kZXJDb3VudGVyX2luaXRpYWxpemVycywgMCkpOwogICAgLyoqIFJlbmRlciBjb3VudGVyIHRvIGZvcmNlIHJlLXJlbmRlcnMgd2hlbiBpdGVtcyBhcmUgbXV0YXRlZCAqLwogICAgZ2V0IHJlbmRlckNvdW50ZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNyZW5kZXJDb3VudGVyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcmVuZGVyQ291bnRlcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jcmVuZGVyQ291bnRlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NvbGxhcHNlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDYodGhpcywgX3JlbmRlckNvdW50ZXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQ2KHRoaXMsIF9jb2xsYXBzZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgLyoqIEhvcml6b250YWwgY29sbGFwc2Ugc3RhdGUgKi8KICAgIGdldCBjb2xsYXBzZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb2xsYXBzZWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjb2xsYXBzZWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2NvbGxhcHNlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICAtLXNpZGViYXItd2lkdGgtZXhwYW5kZWQ6IDI0MHB4OwogICAgICAgIC0tc2lkZWJhci13aWR0aC1jb2xsYXBzZWQ6IDU2cHg7CiAgICAgICAgLS1zaWRlYmFyLWJnOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZhZmFmYSIsICIjMGEwYTBhIil9OwogICAgICAgIC0tc2lkZWJhci1mZzogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM1MjUyNTIiLCAiI2EzYTNhMyIpfTsKICAgICAgICAtLXNpZGViYXItZmctbXV0ZWQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzM3MzczIiwgIiM3MzczNzMiKX07CiAgICAgICAgLS1zaWRlYmFyLWZnLWFjdGl2ZTogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwYTBhMGEiLCAiI2ZhZmFmYSIpfTsKICAgICAgICAtLXNpZGViYXItYm9yZGVyOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTVlNSIsICIjMWExYTFhIil9OwogICAgICAgIC0tc2lkZWJhci1ob3ZlcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wNCkiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KSIpfTsKICAgICAgICAtLXNpZGViYXItYWN0aXZlOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjA2KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpIil9OwogICAgICAgIC0tc2lkZWJhci1hY2NlbnQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMGEwYTBhIiwgIiNmYWZhZmEiKX07CiAgICAgICAgLS10b29sdGlwLWJnOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzE4MTgxYiIsICIjZmFmYWZhIil9OwogICAgICAgIC0tdG9vbHRpcC1mZzogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmYWZhZmEiLCAiIzE4MTgxYiIpfTsKCiAgICAgICAgLyogQmFkZ2UgY29sb3JzICovCiAgICAgICAgLS1iYWRnZS1kZWZhdWx0LWJnOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjMjcyNzJhIil9OwogICAgICAgIC0tYmFkZ2UtZGVmYXVsdC1mZzogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzZjNmNDYiLCAiI2ExYTFhYSIpfTsKICAgICAgICAtLWJhZGdlLXN1Y2Nlc3MtYmc6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZGNmY2U3IiwgIiMxNDUzMmQiKX07CiAgICAgICAgLS1iYWRnZS1zdWNjZXNzLWZnOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzE2NjUzNCIsICIjNGFkZTgwIil9OwogICAgICAgIC0tYmFkZ2Utd2FybmluZy1iZzogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZWYzYzciLCAiIzQ1MWEwMyIpfTsKICAgICAgICAtLWJhZGdlLXdhcm5pbmctZmc6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOTI0MDBlIiwgIiNmYmJmMjQiKX07CiAgICAgICAgLS1iYWRnZS1lcnJvci1iZzogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZWUyZTIiLCAiIzQ1MGEwYSIpfTsKICAgICAgICAtLWJhZGdlLWVycm9yLWZnOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzk5MWIxYiIsICIjZjg3MTcxIil9OwoKICAgICAgICAvKiBBY3Rpb24gY29sb3JzICovCiAgICAgICAgLS1hY3Rpb24tcHJpbWFyeTogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyNTYzZWIiLCAiIzNiODJmNiIpfTsKICAgICAgICAtLWFjdGlvbi1wcmltYXJ5LWhvdmVyOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzFkNGVkOCIsICIjNjBhNWZhIil9OwogICAgICAgIC0tYWN0aW9uLWRhbmdlcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkYzI2MjYiLCAiI2VmNDQ0NCIpfTsKICAgICAgICAtLWFjdGlvbi1kYW5nZXItaG92ZXI6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjYjkxYzFjIiwgIiNmODcxNzEiKX07CgogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IHZhcigtLXNpZGViYXItd2lkdGgtZXhwYW5kZWQpOwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXNpZGViYXItYmcpOwogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLXNpZGViYXItYm9yZGVyKTsKICAgICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCAnSW50ZXInLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIHNhbnMtc2VyaWY7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdHJhbnNpdGlvbjogd2lkdGggMC4yNXMgZWFzZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NvbGxhcHNlZF0pIHsKICAgICAgICB3aWR0aDogdmFyKC0tc2lkZWJhci13aWR0aC1jb2xsYXBzZWQpOwogICAgICB9CgogICAgICAubWFpbmNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLyogRmxvYXRpbmcgY29sbGFwc2UgdG9nZ2xlIGJ1dHRvbiAqLwogICAgICAuY29sbGFwc2UtdG9nZ2xlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IC0xMnB4OwogICAgICAgIHRvcDogMjRweDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICAgICAgd2lkdGg6IDI0cHg7CiAgICAgICAgaGVpZ2h0OiAyNHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMjcyNzJhIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlNWU1IiwgIiMzZjNmNDYiKX07CiAgICAgICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xKTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgei1pbmRleDogMTA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzczNzM3MyIsICIjYTFhMWFhIil9OwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2UsIGJhY2tncm91bmQgMC4xNXMgZWFzZTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAuY29sbGFwc2UtdG9nZ2xlOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjM2YzZjQ2Iil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzBhMGEwYSIsICIjZmFmYWZhIil9OwogICAgICB9CgogICAgICA6aG9zdCg6aG92ZXIpIC5jb2xsYXBzZS10b2dnbGUgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5jb2xsYXBzZS10b2dnbGUgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIC8qIEhlYWRlciBTZWN0aW9uICovCiAgICAgIC5oZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tc2lkZWJhci1ib3JkZXIpOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgIC5oZWFkZXIgLmhlYWRpbmcgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6IHZhcigtLXNpZGViYXItZmctYWN0aXZlKTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2UsIHdpZHRoIDAuMjVzIGVhc2U7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjb2xsYXBzZWRdKSAuaGVhZGVyIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiAwIDhweDsKICAgICAgfQoKICAgICAgOmhvc3QoW2NvbGxhcHNlZF0pIC5oZWFkZXIgLmhlYWRpbmcgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgd2lkdGg6IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyogU2Nyb2xsYWJsZSBNZW51IFNlY3Rpb24gKi8KICAgICAgLm1lbnVTZWN0aW9uIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICAgICAgcGFkZGluZzogOHB4IDA7CiAgICAgIH0KCiAgICAgIC5tZW51U2VjdGlvbjo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIHdpZHRoOiA2cHg7CiAgICAgIH0KCiAgICAgIC5tZW51U2VjdGlvbjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAubWVudVNlY3Rpb246Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjE1KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgfQoKICAgICAgLm1lbnVTZWN0aW9uOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4yNSkiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI1KSIpfTsKICAgICAgfQoKICAgICAgLyogTWVudSBHcm91cCAqLwogICAgICAubWVudUdyb3VwIHsKICAgICAgICBwYWRkaW5nOiAwIDhweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjb2xsYXBzZWRdKSAubWVudUdyb3VwIHsKICAgICAgICBwYWRkaW5nOiAwIDRweDsKICAgICAgfQoKICAgICAgLmdyb3VwSGVhZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cyBlYXNlLCBvcGFjaXR5IDAuMnMgZWFzZSwgbWF4LWhlaWdodCAwLjI1cyBlYXNlOwogICAgICAgIG1heC1oZWlnaHQ6IDQwcHg7CiAgICAgIH0KCiAgICAgIC5ncm91cEhlYWRlcjpob3ZlciB7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMTQwLCAxMjAsIDEwMCwgMC4wNikiLCAicmdiYSgxODAsIDE2MCwgMTQwLCAwLjA4KSIpfTsKICAgICAgICBwYWRkaW5nOiA3cHggMTFweDsKICAgICAgfQoKICAgICAgLmdyb3VwSGVhZGVyOm5vdCguY29sbGFwc2VkKSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMTQwLCAxMjAsIDEwMCwgMC4wNikiLCAicmdiYSgxODAsIDE2MCwgMTQwLCAwLjA4KSIpfTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgIH0KCiAgICAgIC5ncm91cEhlYWRlciAuZ3JvdXBUaXRsZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzc4NzE2YyIsICIjYjVhOTlhIil9OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmdyb3VwSGVhZGVyIC5ncm91cFRpdGxlIGRlZXMtaWNvbiB7CiAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzc4NzE2YyIsICIjYjVhOTlhIil9OwogICAgICB9CgogICAgICAuZ3JvdXBIZWFkZXIgLmNoZXZyb24gewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycyBlYXNlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzc4NzE2YyIsICIjYjVhOTlhIil9OwogICAgICB9CgogICAgICAuZ3JvdXBIZWFkZXIuY29sbGFwc2VkIC5jaGV2cm9uIHsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpOwogICAgICB9CgogICAgICAvKiBIaWRlIGdyb3VwIGhlYWRlcnMgd2hlbiBob3Jpem9udGFsbHkgY29sbGFwc2VkICovCiAgICAgIDpob3N0KFtjb2xsYXBzZWRdKSAuZ3JvdXBIZWFkZXIgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgbWF4LWhlaWdodDogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLyogR3JvdXAgSXRlbXMgQ29udGFpbmVyICovCiAgICAgIC5ncm91cEl0ZW1zIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRyYW5zaXRpb246IG1heC1oZWlnaHQgMC4yNXMgZWFzZSwgb3BhY2l0eSAwLjJzIGVhc2UsIG1hcmdpbiAwLjI1cyBlYXNlOwogICAgICAgIG1heC1oZWlnaHQ6IDEwMDBweDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIG1hcmdpbi1ib3R0b206IDEycHg7CiAgICAgIH0KCiAgICAgIC5ncm91cEl0ZW1zLmNvbGxhcHNlZCB7CiAgICAgICAgbWF4LWhlaWdodDogMDsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICAgIH0KCiAgICAgIC8qIEFsd2F5cyBzaG93IGl0ZW1zIHdoZW4gaG9yaXpvbnRhbGx5IGNvbGxhcHNlZCAocmVnYXJkbGVzcyBvZiBncm91cCBjb2xsYXBzZSBzdGF0ZSkgKi8KICAgICAgOmhvc3QoW2NvbGxhcHNlZF0pIC5ncm91cEl0ZW1zIHsKICAgICAgICBtYXgtaGVpZ2h0OiBub25lOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC8qIE1lbnUgSXRlbSBCYXNlICovCiAgICAgIC5tZW51SXRlbSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEwcHg7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgbWFyZ2luOiAycHggMDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQ1MDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGNvbG9yOiB2YXIoLS1zaWRlYmFyLWZnKTsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zaWRlYmFyLWhvdmVyKTsKICAgICAgICBjb2xvcjogdmFyKC0tc2lkZWJhci1mZy1hY3RpdmUpOwogICAgICB9CgogICAgICAubWVudUl0ZW06YWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zaWRlYmFyLWFjdGl2ZSk7CiAgICAgIH0KCiAgICAgIC5tZW51SXRlbS5kaXNhYmxlZCB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5tZW51SXRlbS5zZWxlY3RlZCB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tc2lkZWJhci1hY3RpdmUpOwogICAgICAgIGNvbG9yOiB2YXIoLS1zaWRlYmFyLWZnLWFjdGl2ZSk7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtLnNlbGVjdGVkOjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsKICAgICAgICB3aWR0aDogM3B4OwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zaWRlYmFyLWFjY2VudCk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAycHggMnB4IDA7CiAgICAgIH0KCiAgICAgIC5tZW51SXRlbSBkZWVzLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5tZW51SXRlbS5zZWxlY3RlZCBkZWVzLWljb24gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5tZW51SXRlbSAuaXRlbUxhYmVsIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZSwgd2lkdGggMC4yNXMgZWFzZTsKICAgICAgfQoKICAgICAgLyogQWN0aW9uIEl0ZW0gU3R5bGVzICovCiAgICAgIC5tZW51SXRlbS5hY3Rpb24tcHJpbWFyeSB7CiAgICAgICAgY29sb3I6IHZhcigtLWFjdGlvbi1wcmltYXJ5KTsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtLmFjdGlvbi1wcmltYXJ5OmhvdmVyIHsKICAgICAgICBjb2xvcjogdmFyKC0tYWN0aW9uLXByaW1hcnktaG92ZXIpOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDM3LCA5OSwgMjM1LCAwLjA4KSIsICJyZ2JhKDU5LCAxMzAsIDI0NiwgMC4xMikiKX07CiAgICAgIH0KCiAgICAgIC5tZW51SXRlbS5hY3Rpb24tcHJpbWFyeSBkZWVzLWljb24gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5tZW51SXRlbS5hY3Rpb24tZGFuZ2VyIHsKICAgICAgICBjb2xvcjogdmFyKC0tYWN0aW9uLWRhbmdlcik7CiAgICAgIH0KCiAgICAgIC5tZW51SXRlbS5hY3Rpb24tZGFuZ2VyOmhvdmVyIHsKICAgICAgICBjb2xvcjogdmFyKC0tYWN0aW9uLWRhbmdlci1ob3Zlcik7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMjIwLCAzOCwgMzgsIDAuMDgpIiwgInJnYmEoMjM5LCA2OCwgNjgsIDAuMTIpIil9OwogICAgICB9CgogICAgICAubWVudUl0ZW0uYWN0aW9uLWRhbmdlciBkZWVzLWljb24gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC8qIEZpbHRlciBJdGVtIFN0eWxlcyAqLwogICAgICAubWVudUl0ZW0uZmlsdGVyIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5tZW51SXRlbS5maWx0ZXIgLmZpbHRlci1jaGVja2JveCB7CiAgICAgICAgd2lkdGg6IDE2cHg7CiAgICAgICAgaGVpZ2h0OiAxNnB4OwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDRkNGQ0IiwgIiM1MjUyNTIiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtLmZpbHRlciAuZmlsdGVyLWNoZWNrYm94LmNoZWNrZWQgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXNpZGViYXItYWNjZW50KTsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXNpZGViYXItYWNjZW50KTsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtLmZpbHRlciAuZmlsdGVyLWNoZWNrYm94IGRlZXMtaWNvbiB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZhZmFmYSIsICIjMGEwYTBhIil9OwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5tZW51SXRlbS5maWx0ZXIuYWN0aXZlIHsKICAgICAgICBjb2xvcjogdmFyKC0tc2lkZWJhci1mZy1hY3RpdmUpOwogICAgICB9CgogICAgICAvKiBNdWx0aS1GaWx0ZXIgQ29udGFpbmVyICovCiAgICAgIC5tdWx0aUZpbHRlciB7CiAgICAgICAgbWFyZ2luOiA0cHggMDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1zaWRlYmFyLWJvcmRlcik7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wMikiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAyKSIpfTsKICAgICAgfQoKICAgICAgLm11bHRpRmlsdGVyLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLm11bHRpRmlsdGVyLWhlYWRlcjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tc2lkZWJhci1ob3Zlcik7CiAgICAgIH0KCiAgICAgIC5tdWx0aUZpbHRlci1oZWFkZXIgLm11bHRpRmlsdGVyLXRpdGxlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6IHZhcigtLXNpZGViYXItZmctYWN0aXZlKTsKICAgICAgfQoKICAgICAgLm11bHRpRmlsdGVyLWhlYWRlciAubXVsdGlGaWx0ZXItdGl0bGUgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgb3BhY2l0eTogMC43OwogICAgICB9CgogICAgICAubXVsdGlGaWx0ZXItaGVhZGVyIC5tdWx0aUZpbHRlci1jb3VudCB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGNvbG9yOiB2YXIoLS1zaWRlYmFyLWZnLW11dGVkKTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iYWRnZS1kZWZhdWx0LWJnKTsKICAgICAgICBwYWRkaW5nOiAycHggNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgfQoKICAgICAgLm11bHRpRmlsdGVyLWhlYWRlciAuY2hldnJvbiB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzIGVhc2U7CiAgICAgICAgY29sb3I6IHZhcigtLXNpZGViYXItZmctbXV0ZWQpOwogICAgICB9CgogICAgICAubXVsdGlGaWx0ZXItaGVhZGVyLmNvbGxhcHNlZCAuY2hldnJvbiB7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTkwZGVnKTsKICAgICAgfQoKICAgICAgLm11bHRpRmlsdGVyLW9wdGlvbnMgewogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1zaWRlYmFyLWJvcmRlcik7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuMjVzIGVhc2UsIG9wYWNpdHkgMC4ycyBlYXNlOwogICAgICAgIG1heC1oZWlnaHQ6IDUwMHB4OwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5tdWx0aUZpbHRlci1vcHRpb25zLmNvbGxhcHNlZCB7CiAgICAgICAgbWF4LWhlaWdodDogMDsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGJvcmRlci10b3A6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5tdWx0aUZpbHRlci1vcHRpb24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEwcHg7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMgZWFzZTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6IHZhcigtLXNpZGViYXItZmcpOwogICAgICB9CgogICAgICAubXVsdGlGaWx0ZXItb3B0aW9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zaWRlYmFyLWhvdmVyKTsKICAgICAgICBjb2xvcjogdmFyKC0tc2lkZWJhci1mZy1hY3RpdmUpOwogICAgICB9CgogICAgICAubXVsdGlGaWx0ZXItb3B0aW9uIC5vcHRpb24tY2hlY2tib3ggewogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Q0ZDRkNCIsICIjNTI1MjUyIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5tdWx0aUZpbHRlci1vcHRpb24gLm9wdGlvbi1jaGVja2JveC5jaGVja2VkIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zaWRlYmFyLWFjY2VudCk7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1zaWRlYmFyLWFjY2VudCk7CiAgICAgIH0KCiAgICAgIC5tdWx0aUZpbHRlci1vcHRpb24gLm9wdGlvbi1jaGVja2JveCBkZWVzLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmYWZhZmEiLCAiIzBhMGEwYSIpfTsKICAgICAgfQoKICAgICAgLm11bHRpRmlsdGVyLW9wdGlvbiBkZWVzLWljb24ub3B0aW9uLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgIH0KCiAgICAgIC8qIERpdmlkZXIgKi8KICAgICAgLm1lbnVEaXZpZGVyIHsKICAgICAgICBoZWlnaHQ6IDFweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zaWRlYmFyLWJvcmRlcik7CiAgICAgICAgbWFyZ2luOiA4cHggMTJweDsKICAgICAgfQoKICAgICAgOmhvc3QoW2NvbGxhcHNlZF0pIC5tZW51RGl2aWRlciB7CiAgICAgICAgbWFyZ2luOiA4cHggNHB4OwogICAgICB9CgogICAgICAvKiBIZWFkZXIvTGFiZWwgKi8KICAgICAgLm1lbnVIZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDEycHggMTJweCA0cHggMTJweDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogdmFyKC0tc2lkZWJhci1mZy1tdXRlZCk7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjb2xsYXBzZWRdKSAubWVudUhlYWRlciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLyogTGluayBJdGVtICovCiAgICAgIC5tZW51SXRlbS5saW5rIC5leHRlcm5hbC1pY29uIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgICB9CgogICAgICAvKiBDb2xsYXBzZWQgbWVudSBpdGVtIHN0eWxlcyAqLwogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLm1lbnVJdGVtIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgZ2FwOiAwOwogICAgICB9CgogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLm1lbnVJdGVtIC5pdGVtTGFiZWwgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgd2lkdGg6IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLm1lbnVJdGVtLnNlbGVjdGVkOjpiZWZvcmUgewogICAgICAgIGxlZnQ6IC00cHg7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjb2xsYXBzZWRdKSAubWVudUl0ZW0gLmZpbHRlci1jaGVja2JveCwKICAgICAgOmhvc3QoW2NvbGxhcHNlZF0pIC5tZW51SXRlbSAuZXh0ZXJuYWwtaWNvbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NvbGxhcHNlZF0pIC5tdWx0aUZpbHRlciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLyogVG9vbHRpcCBmb3IgY29sbGFwc2VkIHN0YXRlICovCiAgICAgIC5pdGVtLXRvb2x0aXAgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAxMDAlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsKICAgICAgICBtYXJnaW4tbGVmdDogMTJweDsKICAgICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10b29sdGlwLWJnKTsKICAgICAgICBjb2xvcjogdmFyKC0tdG9vbHRpcC1mZyk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2U7CiAgICAgICAgei1pbmRleDogMTAwMDsKICAgICAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKICAgICAgfQoKICAgICAgLml0ZW0tdG9vbHRpcDo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogLTRweDsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICAgICAgYm9yZGVyOiA0cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB2YXIoLS10b29sdGlwLWJnKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NvbGxhcHNlZF0pIC5tZW51SXRlbTpob3ZlciAuaXRlbS10b29sdGlwIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IDFzOwogICAgICB9CgogICAgICAvKiBCYWRnZSBTdHlsZXMgKi8KICAgICAgLmJhZGdlIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIG1pbi13aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgICAgcGFkZGluZzogMCA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOXB4OwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAuYmFkZ2UuZGVmYXVsdCB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYmFkZ2UtZGVmYXVsdC1iZyk7CiAgICAgICAgY29sb3I6IHZhcigtLWJhZGdlLWRlZmF1bHQtZmcpOwogICAgICB9CgogICAgICAuYmFkZ2Uuc3VjY2VzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYmFkZ2Utc3VjY2Vzcy1iZyk7CiAgICAgICAgY29sb3I6IHZhcigtLWJhZGdlLXN1Y2Nlc3MtZmcpOwogICAgICB9CgogICAgICAuYmFkZ2Uud2FybmluZyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYmFkZ2Utd2FybmluZy1iZyk7CiAgICAgICAgY29sb3I6IHZhcigtLWJhZGdlLXdhcm5pbmctZmcpOwogICAgICB9CgogICAgICAuYmFkZ2UuZXJyb3IgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWJhZGdlLWVycm9yLWJnKTsKICAgICAgICBjb2xvcjogdmFyKC0tYmFkZ2UtZXJyb3ItZmcpOwogICAgICB9CgogICAgICA6aG9zdChbY29sbGFwc2VkXSkgLmJhZGdlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBMZWdhY3kgb3B0aW9ucyBjb250YWluZXIgKi8KICAgICAgLmxlZ2FjeU9wdGlvbnMgewogICAgICAgIHBhZGRpbmc6IDAgOHB4OwogICAgICB9CgogICAgICAvKiBEaXZpZGVyIChsZWdhY3kpICovCiAgICAgIC5kaXZpZGVyIHsKICAgICAgICBoZWlnaHQ6IDFweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zaWRlYmFyLWJvcmRlcik7CiAgICAgICAgbWFyZ2luOiA4cHggMTJweDsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJtYWluY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImhlYWRpbmciPiR7dGhpcy5oZWFkaW5nfTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtZW51U2VjdGlvbiI+CiAgICAgICAgICAke3RoaXMuZ3JvdXBzLmxlbmd0aCA+IDAgPyB0aGlzLnJlbmRlckdyb3VwcygpIDogdGhpcy5yZW5kZXJMZWdhY3lPcHRpb25zKCl9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8YnV0dG9uIGNsYXNzPSJjb2xsYXBzZS10b2dnbGUiIEBjbGljaz0iJHsoKSA9PiB0aGlzLnRvZ2dsZUNvbGxhcHNlKCl9Ij4KICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSIke3RoaXMuY29sbGFwc2VkID8gImx1Y2lkZTpjaGV2cm9uUmlnaHQiIDogImx1Y2lkZTpjaGV2cm9uTGVmdCJ9Ij48L2RlZXMtaWNvbj4KICAgICAgPC9idXR0b24+CiAgICBgOwogICAgfQogICAgcmVuZGVyR3JvdXBzKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgICR7dGhpcy5ncm91cHMubWFwKChncm91cCkgPT4gYjJgCiAgICAgICAgPGRpdiBjbGFzcz0ibWVudUdyb3VwIj4KICAgICAgICAgIDxkaXYKICAgICAgICAgICAgY2xhc3M9Imdyb3VwSGVhZGVyICR7dGhpcy5jb2xsYXBzZWRHcm91cHMuaGFzKGdyb3VwLm5hbWUpID8gImNvbGxhcHNlZCIgOiAiIn0iCiAgICAgICAgICAgIEBjbGljaz0iJHsoKSA9PiB0aGlzLnRvZ2dsZUdyb3VwKGdyb3VwLm5hbWUpfSIKICAgICAgICAgID4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imdyb3VwVGl0bGUiPgogICAgICAgICAgICAgICR7Z3JvdXAuaWNvbk5hbWUgPyBiMmA8ZGVlcy1pY29uIC5pY29uPSIke3RoaXMubm9ybWFsaXplSWNvbihncm91cC5pY29uTmFtZSl9Ij48L2RlZXMtaWNvbj5gIDogIiJ9CiAgICAgICAgICAgICAgJHtncm91cC5uYW1lfQogICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgIDxkZWVzLWljb24gY2xhc3M9ImNoZXZyb24iIC5pY29uPSIkeyJsdWNpZGU6Y2hldnJvbkRvd24ifSI+PC9kZWVzLWljb24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9Imdyb3VwSXRlbXMgJHt0aGlzLmNvbGxhcHNlZEdyb3Vwcy5oYXMoZ3JvdXAubmFtZSkgPyAiY29sbGFwc2VkIiA6ICIifSI+CiAgICAgICAgICAgICR7Z3JvdXAuaXRlbXMubWFwKChpdGVtKSA9PiB0aGlzLnJlbmRlckl0ZW0oaXRlbSwgZ3JvdXApKX0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICBgKX0KICAgIGA7CiAgICB9CiAgICByZW5kZXJJdGVtKGl0ZW0sIGdyb3VwKSB7CiAgICAgIGlmICgiaGlkZGVuIiBpbiBpdGVtICYmIGl0ZW0uaGlkZGVuKSB7CiAgICAgICAgcmV0dXJuIGIyYGA7CiAgICAgIH0KICAgICAgY29uc3QgaXRlbVR5cGUgPSAidHlwZSIgaW4gaXRlbSA/IGl0ZW0udHlwZSA6ICJ0YWIiOwogICAgICBzd2l0Y2ggKGl0ZW1UeXBlKSB7CiAgICAgICAgY2FzZSAiYWN0aW9uIjoKICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckFjdGlvbkl0ZW0oaXRlbSk7CiAgICAgICAgY2FzZSAiZmlsdGVyIjoKICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckZpbHRlckl0ZW0oaXRlbSk7CiAgICAgICAgY2FzZSAibXVsdGlGaWx0ZXIiOgogICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyTXVsdGlGaWx0ZXJJdGVtKGl0ZW0pOwogICAgICAgIGNhc2UgImRpdmlkZXIiOgogICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRGl2aWRlcigpOwogICAgICAgIGNhc2UgImhlYWRlciI6CiAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJIZWFkZXIoaXRlbSk7CiAgICAgICAgY2FzZSAibGluayI6CiAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJMaW5rSXRlbShpdGVtKTsKICAgICAgICBjYXNlICJ0YWIiOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJUYWJJdGVtKGl0ZW0sIGdyb3VwKTsKICAgICAgfQogICAgfQogICAgcmVuZGVyVGFiSXRlbShpdGVtLCBncm91cCkgewogICAgICBjb25zdCBpc1NlbGVjdGVkID0gdGhpcy5zZWxlY3RlZEl0ZW0/LmtleSA9PT0gaXRlbS5rZXk7CiAgICAgIGNvbnN0IGlzRGlzYWJsZWQgPSBpdGVtLmRpc2FibGVkID09PSB0cnVlOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYKICAgICAgICBjbGFzcz0ibWVudUl0ZW0gJHtpc1NlbGVjdGVkID8gInNlbGVjdGVkIiA6ICIifSAke2lzRGlzYWJsZWQgPyAiZGlzYWJsZWQiIDogIiJ9IgogICAgICAgIEBjbGljaz0iJHsoKSA9PiAhaXNEaXNhYmxlZCAmJiB0aGlzLnNlbGVjdFRhYkl0ZW0oaXRlbSwgZ3JvdXApfSIKICAgICAgICBAY29udGV4dG1lbnU9IiR7KGUxMSkgPT4gdGhpcy5oYW5kbGVDb250ZXh0TWVudShlMTEsIGl0ZW0pfSIKICAgICAgPgogICAgICAgICR7aXRlbS5pY29uTmFtZSA/IGIyYDxkZWVzLWljb24gLmljb249IiR7dGhpcy5ub3JtYWxpemVJY29uKGl0ZW0uaWNvbk5hbWUpfSI+PC9kZWVzLWljb24+YCA6ICIifQogICAgICAgIDxzcGFuIGNsYXNzPSJpdGVtTGFiZWwiPiR7aXRlbS5rZXl9PC9zcGFuPgogICAgICAgICR7aXRlbS5iYWRnZSAhPT0gdm9pZCAwID8gYjJgCiAgICAgICAgICA8c3BhbiBjbGFzcz0iYmFkZ2UgJHtpdGVtLmJhZGdlVmFyaWFudCB8fCAiZGVmYXVsdCJ9Ij4ke2l0ZW0uYmFkZ2V9PC9zcGFuPgogICAgICAgIGAgOiAiIn0KICAgICAgICA8c3BhbiBjbGFzcz0iaXRlbS10b29sdGlwIj4ke2l0ZW0ua2V5fTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgcmVuZGVyQWN0aW9uSXRlbShpdGVtKSB7CiAgICAgIGNvbnN0IHZhcmlhbnQgPSBpdGVtLnZhcmlhbnQgfHwgInByaW1hcnkiOwogICAgICBjb25zdCBpc0Rpc2FibGVkID0gaXRlbS5kaXNhYmxlZCA9PT0gdHJ1ZTsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9Im1lbnVJdGVtIGFjdGlvbi0ke3ZhcmlhbnR9ICR7aXNEaXNhYmxlZCA/ICJkaXNhYmxlZCIgOiAiIn0iCiAgICAgICAgQGNsaWNrPSIkeygpID0+ICFpc0Rpc2FibGVkICYmIHRoaXMuaGFuZGxlQWN0aW9uQ2xpY2soaXRlbSl9IgogICAgICA+CiAgICAgICAgJHtpdGVtLmljb25OYW1lID8gYjJgPGRlZXMtaWNvbiAuaWNvbj0iJHt0aGlzLm5vcm1hbGl6ZUljb24oaXRlbS5pY29uTmFtZSl9Ij48L2RlZXMtaWNvbj5gIDogIiJ9CiAgICAgICAgPHNwYW4gY2xhc3M9Iml0ZW1MYWJlbCI+JHtpdGVtLmtleX08L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9Iml0ZW0tdG9vbHRpcCI+JHtpdGVtLmtleX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlckZpbHRlckl0ZW0oaXRlbSkgewogICAgICBjb25zdCBpc0Rpc2FibGVkID0gaXRlbS5kaXNhYmxlZCA9PT0gdHJ1ZTsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9Im1lbnVJdGVtIGZpbHRlciAke2l0ZW0uYWN0aXZlID8gImFjdGl2ZSIgOiAiIn0gJHtpc0Rpc2FibGVkID8gImRpc2FibGVkIiA6ICIifSIKICAgICAgICBAY2xpY2s9IiR7KCkgPT4gIWlzRGlzYWJsZWQgJiYgdGhpcy5oYW5kbGVGaWx0ZXJUb2dnbGUoaXRlbSl9IgogICAgICA+CiAgICAgICAgJHtpdGVtLmljb25OYW1lID8gYjJgPGRlZXMtaWNvbiAuaWNvbj0iJHt0aGlzLm5vcm1hbGl6ZUljb24oaXRlbS5pY29uTmFtZSl9Ij48L2RlZXMtaWNvbj5gIDogIiJ9CiAgICAgICAgPHNwYW4gY2xhc3M9Iml0ZW1MYWJlbCI+JHtpdGVtLmtleX08L3NwYW4+CiAgICAgICAgPGRpdiBjbGFzcz0iZmlsdGVyLWNoZWNrYm94ICR7aXRlbS5hY3RpdmUgPyAiY2hlY2tlZCIgOiAiIn0iPgogICAgICAgICAgJHtpdGVtLmFjdGl2ZSA/IGIyYDxkZWVzLWljb24gLmljb249IiR7Imx1Y2lkZTpjaGVjayJ9Ij48L2RlZXMtaWNvbj5gIDogIiJ9CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHNwYW4gY2xhc3M9Iml0ZW0tdG9vbHRpcCI+JHtpdGVtLmtleX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlck11bHRpRmlsdGVySXRlbShpdGVtKSB7CiAgICAgIGNvbnN0IGlzQ29sbGFwc2VkID0gdGhpcy5jb2xsYXBzZWRNdWx0aUZpbHRlcnMuaGFzKGl0ZW0ua2V5KTsKICAgICAgY29uc3QgY2hlY2tlZENvdW50ID0gaXRlbS5vcHRpb25zLmZpbHRlcigob3B0KSA9PiBvcHQuY2hlY2tlZCkubGVuZ3RoOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9Im11bHRpRmlsdGVyIj4KICAgICAgICA8ZGl2CiAgICAgICAgICBjbGFzcz0ibXVsdGlGaWx0ZXItaGVhZGVyICR7aXNDb2xsYXBzZWQgPyAiY29sbGFwc2VkIiA6ICIifSIKICAgICAgICAgIEBjbGljaz0iJHsoKSA9PiB0aGlzLnRvZ2dsZU11bHRpRmlsdGVyKGl0ZW0ua2V5KX0iCiAgICAgICAgPgogICAgICAgICAgPHNwYW4gY2xhc3M9Im11bHRpRmlsdGVyLXRpdGxlIj4KICAgICAgICAgICAgJHtpdGVtLmljb25OYW1lID8gYjJgPGRlZXMtaWNvbiAuaWNvbj0iJHt0aGlzLm5vcm1hbGl6ZUljb24oaXRlbS5pY29uTmFtZSl9Ij48L2RlZXMtaWNvbj5gIDogIiJ9CiAgICAgICAgICAgICR7aXRlbS5rZXl9CiAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAke2NoZWNrZWRDb3VudCA+IDAgPyBiMmA8c3BhbiBjbGFzcz0ibXVsdGlGaWx0ZXItY291bnQiPiR7Y2hlY2tlZENvdW50fTwvc3Bhbj5gIDogIiJ9CiAgICAgICAgICA8ZGVlcy1pY29uIGNsYXNzPSJjaGV2cm9uIiAuaWNvbj0iJHsibHVjaWRlOmNoZXZyb25Eb3duIn0iPjwvZGVlcy1pY29uPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im11bHRpRmlsdGVyLW9wdGlvbnMgJHtpc0NvbGxhcHNlZCA/ICJjb2xsYXBzZWQiIDogIiJ9Ij4KICAgICAgICAgICR7aXRlbS5vcHRpb25zLm1hcCgob3B0aW9uMikgPT4gYjJgCiAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICBjbGFzcz0ibXVsdGlGaWx0ZXItb3B0aW9uIgogICAgICAgICAgICAgIEBjbGljaz0iJHsoKSA9PiB0aGlzLmhhbmRsZU11bHRpRmlsdGVyT3B0aW9uVG9nZ2xlKGl0ZW0sIG9wdGlvbjIua2V5KX0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcHRpb24tY2hlY2tib3ggJHtvcHRpb24yLmNoZWNrZWQgPyAiY2hlY2tlZCIgOiAiIn0iPgogICAgICAgICAgICAgICAgJHtvcHRpb24yLmNoZWNrZWQgPyBiMmA8ZGVlcy1pY29uIC5pY29uPSIkeyJsdWNpZGU6Y2hlY2sifSI+PC9kZWVzLWljb24+YCA6ICIifQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICR7b3B0aW9uMi5pY29uTmFtZSA/IGIyYDxkZWVzLWljb24gY2xhc3M9Im9wdGlvbi1pY29uIiAuaWNvbj0iJHt0aGlzLm5vcm1hbGl6ZUljb24ob3B0aW9uMi5pY29uTmFtZSl9Ij48L2RlZXMtaWNvbj5gIDogIiJ9CiAgICAgICAgICAgICAgPHNwYW4+JHtvcHRpb24yLmxhYmVsfTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgKX0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgcmVuZGVyRGl2aWRlcigpIHsKICAgICAgcmV0dXJuIGIyYDxkaXYgY2xhc3M9Im1lbnVEaXZpZGVyIj48L2Rpdj5gOwogICAgfQogICAgcmVuZGVySGVhZGVyKGl0ZW0pIHsKICAgICAgcmV0dXJuIGIyYDxkaXYgY2xhc3M9Im1lbnVIZWFkZXIiPiR7aXRlbS5sYWJlbH08L2Rpdj5gOwogICAgfQogICAgcmVuZGVyTGlua0l0ZW0oaXRlbSkgewogICAgICBjb25zdCBpc0V4dGVybmFsID0gaXRlbS5leHRlcm5hbCA/PyBpdGVtLmhyZWYuc3RhcnRzV2l0aCgiaHR0cCIpOwogICAgICBjb25zdCBpc0Rpc2FibGVkID0gaXRlbS5kaXNhYmxlZCA9PT0gdHJ1ZTsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9Im1lbnVJdGVtIGxpbmsgJHtpc0Rpc2FibGVkID8gImRpc2FibGVkIiA6ICIifSIKICAgICAgICBAY2xpY2s9IiR7KCkgPT4gIWlzRGlzYWJsZWQgJiYgdGhpcy5oYW5kbGVMaW5rQ2xpY2soaXRlbSl9IgogICAgICA+CiAgICAgICAgJHtpdGVtLmljb25OYW1lID8gYjJgPGRlZXMtaWNvbiAuaWNvbj0iJHt0aGlzLm5vcm1hbGl6ZUljb24oaXRlbS5pY29uTmFtZSl9Ij48L2RlZXMtaWNvbj5gIDogIiJ9CiAgICAgICAgPHNwYW4gY2xhc3M9Iml0ZW1MYWJlbCI+JHtpdGVtLmtleX08L3NwYW4+CiAgICAgICAgJHtpc0V4dGVybmFsID8gYjJgPGRlZXMtaWNvbiBjbGFzcz0iZXh0ZXJuYWwtaWNvbiIgLmljb249IiR7Imx1Y2lkZTpleHRlcm5hbExpbmsifSI+PC9kZWVzLWljb24+YCA6ICIifQogICAgICAgIDxzcGFuIGNsYXNzPSJpdGVtLXRvb2x0aXAiPiR7aXRlbS5rZXl9PC9zcGFuPgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJMZWdhY3lPcHRpb25zKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImxlZ2FjeU9wdGlvbnMiPgogICAgICAgICR7dGhpcy5zZWxlY3Rpb25PcHRpb25zLm1hcCgob3B0aW9uMikgPT4gewogICAgICAgIGlmICgiZGl2aWRlciIgaW4gb3B0aW9uMiAmJiBvcHRpb24yLmRpdmlkZXIpIHsKICAgICAgICAgIHJldHVybiBiMmA8ZGl2IGNsYXNzPSJkaXZpZGVyIj48L2Rpdj5gOwogICAgICAgIH0KICAgICAgICBjb25zdCBpdGVtID0gb3B0aW9uMjsKICAgICAgICBjb25zdCB0YWJJdGVtID0gewogICAgICAgICAga2V5OiBpdGVtLmtleSwKICAgICAgICAgIGljb25OYW1lOiBpdGVtLmljb25OYW1lLAogICAgICAgICAgYWN0aW9uOiBpdGVtLmFjdGlvbiwKICAgICAgICAgIGJhZGdlOiBpdGVtLmJhZGdlLAogICAgICAgICAgYmFkZ2VWYXJpYW50OiBpdGVtLmJhZGdlVmFyaWFudAogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyVGFiSXRlbSh0YWJJdGVtKTsKICAgICAgfSl9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIC8vIEhlbHBlciB0byBub3JtYWxpemUgaWNvbiBuYW1lcwogICAgbm9ybWFsaXplSWNvbihpY29uTmFtZSkgewogICAgICByZXR1cm4gaWNvbk5hbWUuc3RhcnRzV2l0aCgibHVjaWRlOiIpID8gaWNvbk5hbWUgOiBgbHVjaWRlOiR7aWNvbk5hbWV9YDsKICAgIH0KICAgIHRvZ2dsZUdyb3VwKGdyb3VwTmFtZSkgewogICAgICBjb25zdCBuZXdDb2xsYXBzZWQgPSBuZXcgU2V0KHRoaXMuY29sbGFwc2VkR3JvdXBzKTsKICAgICAgaWYgKG5ld0NvbGxhcHNlZC5oYXMoZ3JvdXBOYW1lKSkgewogICAgICAgIG5ld0NvbGxhcHNlZC5kZWxldGUoZ3JvdXBOYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuZXdDb2xsYXBzZWQuYWRkKGdyb3VwTmFtZSk7CiAgICAgIH0KICAgICAgdGhpcy5jb2xsYXBzZWRHcm91cHMgPSBuZXdDb2xsYXBzZWQ7CiAgICB9CiAgICB0b2dnbGVNdWx0aUZpbHRlcihmaWx0ZXJLZXkpIHsKICAgICAgY29uc3QgbmV3Q29sbGFwc2VkID0gbmV3IFNldCh0aGlzLmNvbGxhcHNlZE11bHRpRmlsdGVycyk7CiAgICAgIGlmIChuZXdDb2xsYXBzZWQuaGFzKGZpbHRlcktleSkpIHsKICAgICAgICBuZXdDb2xsYXBzZWQuZGVsZXRlKGZpbHRlcktleSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmV3Q29sbGFwc2VkLmFkZChmaWx0ZXJLZXkpOwogICAgICB9CiAgICAgIHRoaXMuY29sbGFwc2VkTXVsdGlGaWx0ZXJzID0gbmV3Q29sbGFwc2VkOwogICAgfQogICAgdG9nZ2xlQ29sbGFwc2UoKSB7CiAgICAgIHRoaXMuY29sbGFwc2VkID0gIXRoaXMuY29sbGFwc2VkOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjb2xsYXBzZS1jaGFuZ2UiLCB7CiAgICAgICAgZGV0YWlsOiB7IGNvbGxhcHNlZDogdGhpcy5jb2xsYXBzZWQgfSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIHNlbGVjdFRhYkl0ZW0oaXRlbSwgZ3JvdXApIHsKICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtOwogICAgICBpdGVtLmFjdGlvbigpOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpdGVtLXNlbGVjdCIsIHsKICAgICAgICBkZXRhaWw6IHsgaXRlbSwgZ3JvdXAgfSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGFzeW5jIGhhbmRsZUFjdGlvbkNsaWNrKGl0ZW0pIHsKICAgICAgaWYgKGl0ZW0uY29uZmlybU1lc3NhZ2UpIHsKICAgICAgICBjb25zdCBjb25maXJtZWQgPSB3aW5kb3cuY29uZmlybShpdGVtLmNvbmZpcm1NZXNzYWdlKTsKICAgICAgICBpZiAoIWNvbmZpcm1lZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICBhd2FpdCBpdGVtLmFjdGlvbigpOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJhY3Rpb24tY2xpY2siLCB7CiAgICAgICAgZGV0YWlsOiB7IGl0ZW0gfSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGhhbmRsZUZpbHRlclRvZ2dsZShpdGVtKSB7CiAgICAgIGNvbnN0IG5ld0FjdGl2ZSA9ICFpdGVtLmFjdGl2ZTsKICAgICAgaXRlbS5hY3RpdmUgPSBuZXdBY3RpdmU7CiAgICAgIGl0ZW0ub25Ub2dnbGUobmV3QWN0aXZlKTsKICAgICAgdGhpcy5yZW5kZXJDb3VudGVyKys7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImZpbHRlci10b2dnbGUiLCB7CiAgICAgICAgZGV0YWlsOiB7IGl0ZW0sIGFjdGl2ZTogbmV3QWN0aXZlIH0sCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBoYW5kbGVNdWx0aUZpbHRlck9wdGlvblRvZ2dsZShpdGVtLCBvcHRpb25LZXkpIHsKICAgICAgY29uc3Qgb3B0aW9uMiA9IGl0ZW0ub3B0aW9ucy5maW5kKChvcHQpID0+IG9wdC5rZXkgPT09IG9wdGlvbktleSk7CiAgICAgIGlmIChvcHRpb24yKSB7CiAgICAgICAgb3B0aW9uMi5jaGVja2VkID0gIW9wdGlvbjIuY2hlY2tlZDsKICAgICAgfQogICAgICBjb25zdCBzZWxlY3RlZEtleXMgPSBpdGVtLm9wdGlvbnMuZmlsdGVyKChvcHQpID0+IG9wdC5jaGVja2VkKS5tYXAoKG9wdCkgPT4gb3B0LmtleSk7CiAgICAgIGl0ZW0ub25DaGFuZ2Uoc2VsZWN0ZWRLZXlzKTsKICAgICAgdGhpcy5yZW5kZXJDb3VudGVyKys7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm11bHRpZmlsdGVyLWNoYW5nZSIsIHsKICAgICAgICBkZXRhaWw6IHsgaXRlbSwgc2VsZWN0ZWRLZXlzIH0sCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBoYW5kbGVMaW5rQ2xpY2soaXRlbSkgewogICAgICBjb25zdCBpc0V4dGVybmFsID0gaXRlbS5leHRlcm5hbCA/PyBpdGVtLmhyZWYuc3RhcnRzV2l0aCgiaHR0cCIpOwogICAgICBpZiAoaXNFeHRlcm5hbCkgewogICAgICAgIHdpbmRvdy5vcGVuKGl0ZW0uaHJlZiwgIl9ibGFuayIsICJub29wZW5lcixub3JlZmVycmVyIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBpdGVtLmhyZWY7CiAgICAgIH0KICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgibGluay1jbGljayIsIHsKICAgICAgICBkZXRhaWw6IHsgaXRlbSB9LAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgaGFuZGxlQ29udGV4dE1lbnUoZXZlbnQsIGl0ZW0pIHsKICAgICAgRGVlc0NvbnRleHRtZW51Lm9wZW5Db250ZXh0TWVudVdpdGhPcHRpb25zKGV2ZW50LCBbCiAgICAgICAgewogICAgICAgICAgbmFtZTogIlZpZXcgZGV0YWlscyIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIH0sCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpleWUiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiRWRpdCIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIH0sCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpwZW5jaWwiCiAgICAgICAgfQogICAgICBdKTsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgYXdhaXQgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGlmICh0aGlzLmdyb3Vwcy5sZW5ndGggPiAwKSB7CiAgICAgICAgY29uc3QgaW5pdGlhbENvbGxhcHNlZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICAgICAgY29uc3QgaW5pdGlhbE11bHRpRmlsdGVyQ29sbGFwc2VkID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgICAgICB0aGlzLmdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4gewogICAgICAgICAgaWYgKGdyb3VwLmNvbGxhcHNlZCkgewogICAgICAgICAgICBpbml0aWFsQ29sbGFwc2VkLmFkZChncm91cC5uYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGdyb3VwLml0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHsKICAgICAgICAgICAgaWYgKCJ0eXBlIiBpbiBpdGVtICYmIGl0ZW0udHlwZSA9PT0gIm11bHRpRmlsdGVyIikgewogICAgICAgICAgICAgIGNvbnN0IG11bHRpRmlsdGVyID0gaXRlbTsKICAgICAgICAgICAgICBpZiAobXVsdGlGaWx0ZXIuY29sbGFwc2VkKSB7CiAgICAgICAgICAgICAgICBpbml0aWFsTXVsdGlGaWx0ZXJDb2xsYXBzZWQuYWRkKG11bHRpRmlsdGVyLmtleSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLmNvbGxhcHNlZEdyb3VwcyA9IGluaXRpYWxDb2xsYXBzZWQ7CiAgICAgICAgdGhpcy5jb2xsYXBzZWRNdWx0aUZpbHRlcnMgPSBpbml0aWFsTXVsdGlGaWx0ZXJDb2xsYXBzZWQ7CiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkSXRlbSkgewogICAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLmdyb3VwcykgewogICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZ3JvdXAuaXRlbXMpIHsKICAgICAgICAgICAgICBjb25zdCBpdGVtVHlwZSA9ICJ0eXBlIiBpbiBpdGVtID8gaXRlbS50eXBlIDogInRhYiI7CiAgICAgICAgICAgICAgaWYgKGl0ZW1UeXBlID09PSAidGFiIiB8fCBpdGVtVHlwZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCB0YWJJdGVtID0gaXRlbTsKICAgICAgICAgICAgICAgIGlmICghdGFiSXRlbS5kaXNhYmxlZCkgewogICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFRhYkl0ZW0odGFiSXRlbSwgZ3JvdXApOwogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uT3B0aW9ucy5sZW5ndGggPiAwKSB7CiAgICAgICAgY29uc3QgZmlyc3RPcHRpb24gPSB0aGlzLnNlbGVjdGlvbk9wdGlvbnMuZmluZCgob3B0KSA9PiAhKCJkaXZpZGVyIiBpbiBvcHQpKTsKICAgICAgICBpZiAoZmlyc3RPcHRpb24gJiYgIXRoaXMuc2VsZWN0ZWRJdGVtKSB7CiAgICAgICAgICBjb25zdCB0YWJJdGVtID0gewogICAgICAgICAgICBrZXk6IGZpcnN0T3B0aW9uLmtleSwKICAgICAgICAgICAgaWNvbk5hbWU6IGZpcnN0T3B0aW9uLmljb25OYW1lLAogICAgICAgICAgICBhY3Rpb246IGZpcnN0T3B0aW9uLmFjdGlvbgogICAgICAgICAgfTsKICAgICAgICAgIHRoaXMuc2VsZWN0VGFiSXRlbSh0YWJJdGVtKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfX3J1bkluaXRpYWxpemVyczQ2KHRoaXMsIF9jb2xsYXBzZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM0NihfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0FwcHVpU2Vjb25kYXJ5bWVudTIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWFwcHVpL2RlZXMtYXBwdWktdGFicy9kZWVzLWFwcHVpLXRhYnMuZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgX19lc0RlY29yYXRlNDYgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczQ3ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZW1vQ2xvc2VhYmxlVGFicyA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVtby1jbG9zZWFibGUtdGFicyIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3RhYnNfZGVjb3JhdG9yczsKICBsZXQgX3RhYnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90YWJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90YWJDb3VudGVyX2RlY29yYXRvcnM7CiAgbGV0IF90YWJDb3VudGVyX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGFiQ291bnRlcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZW1vQ2xvc2VhYmxlVGFiczIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF90YWJzX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF90YWJDb3VudGVyX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTQ2KHRoaXMsIG51bGwsIF90YWJzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRhYnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRhYnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudGFicywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGFicyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90YWJzX2luaXRpYWxpemVycywgX3RhYnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Nih0aGlzLCBudWxsLCBfdGFiQ291bnRlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0YWJDb3VudGVyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0YWJDb3VudGVyIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRhYkNvdW50ZXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnRhYkNvdW50ZXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGFiQ291bnRlcl9pbml0aWFsaXplcnMsIF90YWJDb3VudGVyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDYobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZW1vQ2xvc2VhYmxlVGFiczIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgI3RhYnNfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNDcodGhpcywgX3RhYnNfaW5pdGlhbGl6ZXJzLCBbCiAgICAgIHsga2V5OiAiTWFpbiIsIGljb25OYW1lOiAibHVjaWRlOmhvbWUiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJNYWluIGNsaWNrZWQiKSB9CiAgICBdKTsKICAgIGdldCB0YWJzKCkgewogICAgICByZXR1cm4gdGhpcy4jdGFic19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRhYnModmFsdWUyKSB7CiAgICAgIHRoaXMuI3RhYnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN0YWJDb3VudGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0Nyh0aGlzLCBfdGFic19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDcodGhpcywgX3RhYkNvdW50ZXJfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgdGFiQ291bnRlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RhYkNvdW50ZXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0YWJDb3VudGVyKHZhbHVlMikgewogICAgICB0aGlzLiN0YWJDb3VudGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmluZm8gewogICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICAgICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsMCwwLDAuMDIpIiwgInJnYmEoMjU1LDI1NSwyNTUsMC4wMikiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgICAgfQogICAgYAogICAgXTsKICAgIGFkZFRhYigpIHsKICAgICAgdGhpcy50YWJDb3VudGVyKys7CiAgICAgIGNvbnN0IHRhYktleSA9IGBEb2N1bWVudCAke3RoaXMudGFiQ291bnRlcn1gOwogICAgICB0aGlzLnRhYnMgPSBbCiAgICAgICAgLi4udGhpcy50YWJzLAogICAgICAgIHsKICAgICAgICAgIGtleTogdGFiS2V5LAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6ZmlsZSIsCiAgICAgICAgICBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKGAke3RhYktleX0gY2xpY2tlZGApLAogICAgICAgICAgY2xvc2VhYmxlOiB0cnVlLAogICAgICAgICAgb25DbG9zZTogKCkgPT4gdGhpcy5yZW1vdmVUYWIodGFiS2V5KQogICAgICAgIH0KICAgICAgXTsKICAgIH0KICAgIHJlbW92ZVRhYih0YWJLZXkpIHsKICAgICAgdGhpcy50YWJzID0gdGhpcy50YWJzLmZpbHRlcigodDkpID0+IHQ5LmtleSAhPT0gdGFiS2V5KTsKICAgIH0KICAgIGNsZWFyQWxsKCkgewogICAgICBjb25zdCB0YWJzRWwgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiZGVlcy1hcHB1aS10YWJzIik7CiAgICAgIHRhYnNFbD8uY2xlYXIoKTsKICAgICAgdGhpcy50YWJzID0gW107CiAgICAgIHRoaXMudGFiQ291bnRlciA9IDA7CiAgICB9CiAgICByZW5kZXIoKSB7CiAgICAgIGNvbnN0IHJpZ2h0QWN0aW9ucyA9IFsKICAgICAgICB7IGlkOiAiYWRkIiwgaWNvbk5hbWU6ICJsdWNpZGU6cGx1cyIsIGFjdGlvbjogKCkgPT4gdGhpcy5hZGRUYWIoKSwgdG9vbHRpcDogIk5ldyBUYWIiIH0sCiAgICAgICAgeyBpZDogImNsZWFyIiwgaWNvbk5hbWU6ICJsdWNpZGU6dHJhc2gyIiwgYWN0aW9uOiAoKSA9PiB0aGlzLmNsZWFyQWxsKCksIHRvb2x0aXA6ICJDbGVhciBBbGwgVGFicyIgfQogICAgICBdOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkZWVzLWFwcHVpLXRhYnMKICAgICAgICAudGFicz0ke3RoaXMudGFic30KICAgICAgICAuYWN0aW9uc1JpZ2h0PSR7cmlnaHRBY3Rpb25zfQogICAgICAgIEB0YWItY2xvc2U9JHsoZTExKSA9PiB0aGlzLnJlbW92ZVRhYihlMTEuZGV0YWlsLnRhYi5rZXkpfQogICAgICA+PC9kZWVzLWFwcHVpLXRhYnM+CiAgICAgIDxkaXYgY2xhc3M9ImluZm8iPgogICAgICAgIENsaWNrIHRoZSBYIGJ1dHRvbiBvbiB0YWJzIHRvIGNsb3NlIHRoZW0uIFVzZSB0aGUgKyBidXR0b24gdG8gYWRkIHRhYnMgYW5kIHRoZSB0cmFzaCBidXR0b24gdG8gY2xlYXIgYWxsLgogICAgICAgIDxicj5DdXJyZW50IHRhYnM6ICR7dGhpcy50YWJzLmxlbmd0aH0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNDcodGhpcywgX3RhYkNvdW50ZXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM0NyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVtb0Nsb3NlYWJsZVRhYnMyID0gX2NsYXNzVGhpczsKfSkoKTsKdmFyIERlbW9BdXRvSGlkZVRhYnMgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlbW8tYXV0b2hpZGUtdGFicyIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3RhYnNfZGVjb3JhdG9yczsKICBsZXQgX3RhYnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90YWJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdXRvSGlkZV9kZWNvcmF0b3JzOwogIGxldCBfYXV0b0hpZGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdXRvSGlkZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGhyZXNob2xkX2RlY29yYXRvcnM7CiAgbGV0IF90aHJlc2hvbGRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90aHJlc2hvbGRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVtb0F1dG9IaWRlVGFiczIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF90YWJzX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9hdXRvSGlkZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfdGhyZXNob2xkX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTQ2KHRoaXMsIG51bGwsIF90YWJzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRhYnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRhYnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudGFicywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGFicyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90YWJzX2luaXRpYWxpemVycywgX3RhYnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Nih0aGlzLCBudWxsLCBfYXV0b0hpZGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYXV0b0hpZGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImF1dG9IaWRlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmF1dG9IaWRlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hdXRvSGlkZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hdXRvSGlkZV9pbml0aWFsaXplcnMsIF9hdXRvSGlkZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ2KHRoaXMsIG51bGwsIF90aHJlc2hvbGRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGhyZXNob2xkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0aHJlc2hvbGQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudGhyZXNob2xkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50aHJlc2hvbGQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGhyZXNob2xkX2luaXRpYWxpemVycywgX3RocmVzaG9sZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ2KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVtb0F1dG9IaWRlVGFiczIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgI3RhYnNfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNDcodGhpcywgX3RhYnNfaW5pdGlhbGl6ZXJzLCBbCiAgICAgIHsga2V5OiAiVGFiIDEiLCBpY29uTmFtZTogImx1Y2lkZTpmaWxlIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiVGFiIDEiKSB9LAogICAgICB7IGtleTogIlRhYiAyIiwgaWNvbk5hbWU6ICJsdWNpZGU6ZmlsZSIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIlRhYiAyIikgfQogICAgXSk7CiAgICBnZXQgdGFicygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RhYnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0YWJzKHZhbHVlMikgewogICAgICB0aGlzLiN0YWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYXV0b0hpZGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ3KHRoaXMsIF90YWJzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Nyh0aGlzLCBfYXV0b0hpZGVfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgYXV0b0hpZGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhdXRvSGlkZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGF1dG9IaWRlKHZhbHVlMikgewogICAgICB0aGlzLiNhdXRvSGlkZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3RocmVzaG9sZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDcodGhpcywgX2F1dG9IaWRlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0Nyh0aGlzLCBfdGhyZXNob2xkX2luaXRpYWxpemVycywgMSkpOwogICAgZ2V0IHRocmVzaG9sZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RocmVzaG9sZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRocmVzaG9sZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdGhyZXNob2xkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLnRhYnMtY29udGFpbmVyIHsKICAgICAgICBtaW4taGVpZ2h0OiA2MHB4OwogICAgICAgIGJvcmRlcjogMXB4IGRhc2hlZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnRhYnMtY29udGFpbmVyIGRlZXMtYXBwdWktdGFicyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLnBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNhMWExYWEiLCAiIzcxNzE3YSIpfTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICB9CiAgICAgIC5jb250cm9scyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQogICAgICBidXR0b24gewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDU5LCAxMzAsIDI0NiwgMC4xKSIsICJyZ2JhKDU5LCAxMzAsIDI0NiwgMC4xKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSg1OSwgMTMwLCAyNDYsIDAuMykiLCAicmdiYSg1OSwgMTMwLCAyNDYsIDAuMykiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiM2MGE1ZmEiKX07CiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KICAgICAgYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSg1OSwgMTMwLCAyNDYsIDAuMikiLCAicmdiYSg1OSwgMTMwLCAyNDYsIDAuMikiKX07CiAgICAgIH0KICAgICAgYnV0dG9uLmRhbmdlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMjM5LCA2OCwgNjgsIDAuMSkiLCAicmdiYSgyMzksIDY4LCA2OCwgMC4xKSIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDIzOSwgNjgsIDY4LCAwLjMpIiwgInJnYmEoMjM5LCA2OCwgNjgsIDAuMykiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZWY0NDQ0IiwgIiNmODcxNzEiKX07CiAgICAgIH0KICAgICAgYnV0dG9uLmRhbmdlcjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMjM5LCA2OCwgNjgsIDAuMikiLCAicmdiYSgyMzksIDY4LCA2OCwgMC4yKSIpfTsKICAgICAgfQogICAgICAuaW5mbyB7CiAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwwLDAsMC4wMikiLCAicmdiYSgyNTUsMjU1LDI1NSwwLjAyKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OwogICAgICB9CiAgICBgCiAgICBdOwogICAgdGFiQ291bnRlciA9IChfX3J1bkluaXRpYWxpemVyczQ3KHRoaXMsIF90aHJlc2hvbGRfZXh0cmFJbml0aWFsaXplcnMpLCAyKTsKICAgIGFkZFRhYigpIHsKICAgICAgdGhpcy50YWJDb3VudGVyKys7CiAgICAgIHRoaXMudGFicyA9IFsuLi50aGlzLnRhYnMsIHsKICAgICAgICBrZXk6IGBUYWIgJHt0aGlzLnRhYkNvdW50ZXJ9YCwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpmaWxlIiwKICAgICAgICBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKGBUYWIgJHt0aGlzLnRhYkNvdW50ZXJ9YCkKICAgICAgfV07CiAgICB9CiAgICByZW1vdmVMYXN0VGFiKCkgewogICAgICBpZiAodGhpcy50YWJzLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLnRhYnMgPSB0aGlzLnRhYnMuc2xpY2UoMCwgLTEpOwogICAgICB9CiAgICB9CiAgICBjbGVhclRhYnMoKSB7CiAgICAgIHRoaXMudGFicyA9IFtdOwogICAgfQogICAgcmVuZGVyKCkgewogICAgICBjb25zdCBzaG91bGRIaWRlID0gdGhpcy5hdXRvSGlkZSAmJiB0aGlzLnRhYnMubGVuZ3RoIDw9IHRoaXMudGhyZXNob2xkOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InRhYnMtY29udGFpbmVyIj4KICAgICAgICAke3Nob3VsZEhpZGUgPyBiMmA8c3BhbiBjbGFzcz0icGxhY2Vob2xkZXIiPlRhYnMgaGlkZGVuICgke3RoaXMudGFicy5sZW5ndGh9IHRhYnMg4omkIHRocmVzaG9sZCAke3RoaXMudGhyZXNob2xkfSk8L3NwYW4+YCA6IGIyYDxkZWVzLWFwcHVpLXRhYnMKICAgICAgICAgICAgICAudGFicz0ke3RoaXMudGFic30KICAgICAgICAgICAgICAuYXV0b0hpZGU9JHt0aGlzLmF1dG9IaWRlfQogICAgICAgICAgICAgIC5hdXRvSGlkZVRocmVzaG9sZD0ke3RoaXMudGhyZXNob2xkfQogICAgICAgICAgICA+PC9kZWVzLWFwcHVpLXRhYnM+YH0KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xzIj4KICAgICAgICA8YnV0dG9uIEBjbGljaz0keygpID0+IHRoaXMuYWRkVGFiKCl9PisgQWRkIFRhYjwvYnV0dG9uPgogICAgICAgIDxidXR0b24gY2xhc3M9ImRhbmdlciIgQGNsaWNrPSR7KCkgPT4gdGhpcy5yZW1vdmVMYXN0VGFiKCl9Pi0gUmVtb3ZlIFRhYjwvYnV0dG9uPgogICAgICAgIDxidXR0b24gY2xhc3M9ImRhbmdlciIgQGNsaWNrPSR7KCkgPT4gdGhpcy5jbGVhclRhYnMoKX0+Q2xlYXIgQWxsPC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiBAY2xpY2s9JHsoKSA9PiB7CiAgICAgICAgdGhpcy50aHJlc2hvbGQgPSAwOwogICAgICB9fT5UaHJlc2hvbGQ6IDA8L2J1dHRvbj4KICAgICAgICA8YnV0dG9uIEBjbGljaz0keygpID0+IHsKICAgICAgICB0aGlzLnRocmVzaG9sZCA9IDE7CiAgICAgIH19PlRocmVzaG9sZDogMTwvYnV0dG9uPgogICAgICAgIDxidXR0b24gQGNsaWNrPSR7KCkgPT4gewogICAgICAgIHRoaXMudGhyZXNob2xkID0gMjsKICAgICAgfX0+VGhyZXNob2xkOiAyPC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJpbmZvIj4KICAgICAgICBBdXRvLWhpZGU6ICR7dGhpcy5hdXRvSGlkZSA/ICJPTiIgOiAiT0ZGIn0gfCBUaHJlc2hvbGQ6ICR7dGhpcy50aHJlc2hvbGR9IHwgVGFiczogJHt0aGlzLnRhYnMubGVuZ3RofQogICAgICAgIDxicj5UYWJzIHdpbGwgaGlkZSB3aGVuIGNvdW50IOKJpCB0aHJlc2hvbGQuCiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNDcoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlbW9BdXRvSGlkZVRhYnMyID0gX2NsYXNzVGhpczsKfSkoKTsKdmFyIGRlbW9GdW5jMzQgPSAoKSA9PiB7CiAgY29uc3QgaG9yaXpvbnRhbFRhYnMgPSBbCiAgICB7IGtleTogIkhvbWUiLCBpY29uTmFtZTogImx1Y2lkZTpob21lIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiSG9tZSBjbGlja2VkIikgfSwKICAgIHsga2V5OiAiQW5hbHl0aWNzIERhc2hib2FyZCIsIGljb25OYW1lOiAibHVjaWRlOmxpbmVDaGFydCIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIkFuYWx5dGljcyBjbGlja2VkIikgfSwKICAgIHsga2V5OiAiUmVwb3J0cyIsIGljb25OYW1lOiAibHVjaWRlOmZpbGVUZXh0IiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiUmVwb3J0cyBjbGlja2VkIikgfSwKICAgIHsga2V5OiAiVXNlciBTZXR0aW5ncyIsIGljb25OYW1lOiAibHVjaWRlOnNldHRpbmdzIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiU2V0dGluZ3MgY2xpY2tlZCIpIH0sCiAgICB7IGtleTogIkhlbHAiLCBpY29uTmFtZTogImx1Y2lkZTpoZWxwQ2lyY2xlIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiSGVscCBjbGlja2VkIikgfQogIF07CiAgY29uc3QgdmVydGljYWxUYWJzID0gWwogICAgeyBrZXk6ICJQcm9maWxlIiwgaWNvbk5hbWU6ICJsdWNpZGU6dXNlciIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIlByb2ZpbGUgY2xpY2tlZCIpIH0sCiAgICB7IGtleTogIlNlY3VyaXR5IiwgaWNvbk5hbWU6ICJsdWNpZGU6c2hpZWxkIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiU2VjdXJpdHkgY2xpY2tlZCIpIH0sCiAgICB7IGtleTogIk5vdGlmaWNhdGlvbnMiLCBpY29uTmFtZTogImx1Y2lkZTpiZWxsIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiTm90aWZpY2F0aW9ucyBjbGlja2VkIikgfSwKICAgIHsga2V5OiAiSW50ZWdyYXRpb25zIiwgaWNvbk5hbWU6ICJsdWNpZGU6bGluayIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIkludGVncmF0aW9ucyBjbGlja2VkIikgfSwKICAgIHsga2V5OiAiQWR2YW5jZWQiLCBpY29uTmFtZTogImx1Y2lkZTpjb2RlIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiQWR2YW5jZWQgY2xpY2tlZCIpIH0KICBdOwogIGNvbnN0IG5vSW5kaWNhdG9yVGFicyA9IFsKICAgIHsga2V5OiAiQWxsIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiQWxsIGNsaWNrZWQiKSB9LAogICAgeyBrZXk6ICJBY3RpdmUiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJBY3RpdmUgY2xpY2tlZCIpIH0sCiAgICB7IGtleTogIkNvbXBsZXRlZCIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIkNvbXBsZXRlZCBjbGlja2VkIikgfSwKICAgIHsga2V5OiAiQXJjaGl2ZWQiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJBcmNoaXZlZCBjbGlja2VkIikgfQogIF07CiAgY29uc3QgYWN0aW9uc0xlZnQgPSBbCiAgICB7IGlkOiAiYmFjayIsIGljb25OYW1lOiAibHVjaWRlOmFycm93TGVmdCIsIGFjdGlvbjogKCkgPT4gY29uc29sZS5sb2coIkJhY2siKSwgdG9vbHRpcDogIkdvIEJhY2siIH0KICBdOwogIGNvbnN0IGFjdGlvbnNSaWdodCA9IFsKICAgIHsgaWQ6ICJhZGQiLCBpY29uTmFtZTogImx1Y2lkZTpwbHVzIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiQWRkIHRhYiIpLCB0b29sdGlwOiAiTmV3IFRhYiIgfSwKICAgIHsgaWQ6ICJzZWFyY2giLCBpY29uTmFtZTogImx1Y2lkZTpzZWFyY2giLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJTZWFyY2giKSwgdG9vbHRpcDogIlNlYXJjaCBUYWJzIiB9LAogICAgeyBpZDogImRpc2FibGVkIiwgaWNvbk5hbWU6ICJsdWNpZGU6bG9jayIsIGFjdGlvbjogKCkgPT4gewogICAgfSwgdG9vbHRpcDogIkRpc2FibGVkIEFjdGlvbiIsIGRpc2FibGVkOiB0cnVlIH0KICBdOwogIGNvbnN0IGRlbW9Db250ZW50ID0gKHRleHQ5KSA9PiBiMmAKICAgIDxkaXYgc3R5bGU9InBhZGRpbmc6IDI0cHg7IGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OyI+CiAgICAgICR7dGV4dDl9CiAgICA8L2Rpdj4KICBgOwogIHJldHVybiBiMmAKICAgIDxzdHlsZT4KICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDQ4cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOGY5ZmEiLCAiIzBhMGEwYSIpfTsKICAgICAgICBtaW4taGVpZ2h0OiAxMDB2aDsKICAgICAgfQoKICAgICAgLnNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMxODE4MWIiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEpOwogICAgICB9CgogICAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgICAgfQoKICAgICAgLnR3by1jb2x1bW4gewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAyMDBweCAxZnI7CiAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgIGFsaWduLWl0ZW1zOiBzdGFydDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+SG9yaXpvbnRhbCBUYWJzIHdpdGggQW5pbWF0ZWQgSW5kaWNhdG9yPC9kaXY+CiAgICAgICAgPGRlZXMtYXBwdWktdGFicyAudGFicz0ke2hvcml6b250YWxUYWJzfT48L2RlZXMtYXBwdWktdGFicz4KICAgICAgICAke2RlbW9Db250ZW50KCJTZWxlY3QgYSB0YWIgdG8gc2VlIHRoZSBzbW9vdGggc2xpZGluZyBhbmltYXRpb24gb2YgdGhlIGluZGljYXRvci4gVGhlIGluZGljYXRvciBhdXRvbWF0aWNhbGx5IGFkanVzdHMgaXRzIHdpZHRoIHRvIG1hdGNoIHRoZSB0YWIgY29udGVudCB3aXRoIG1pbmltYWwgcGFkZGluZy4iKX0KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5UYWJzIHdpdGggQWN0aW9uIEJ1dHRvbnM8L2Rpdj4KICAgICAgICA8ZGVlcy1hcHB1aS10YWJzCiAgICAgICAgICAudGFicz0ke2hvcml6b250YWxUYWJzfQogICAgICAgICAgLmFjdGlvbnNMZWZ0PSR7YWN0aW9uc0xlZnR9CiAgICAgICAgICAuYWN0aW9uc1JpZ2h0PSR7YWN0aW9uc1JpZ2h0fQogICAgICAgID48L2RlZXMtYXBwdWktdGFicz4KICAgICAgICAke2RlbW9Db250ZW50KCJBY3Rpb24gYnV0dG9ucyBjYW4gYmUgcGxhY2VkIG9uIGVpdGhlciBzaWRlIG9mIHRoZSB0YWIgYmFyLiBUaGV5IHJlbWFpbiBmaXhlZCB3aGlsZSB0YWJzIHNjcm9sbC4gVGhlIGxvY2sgaWNvbiBzaG93cyBhIGRpc2FibGVkIGFjdGlvbi4iKX0KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5DbG9zZWFibGUgVGFicyB3aXRoIEFjdGlvbnM8L2Rpdj4KICAgICAgICA8ZGVtby1jbG9zZWFibGUtdGFicz48L2RlbW8tY2xvc2VhYmxlLXRhYnM+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+QXV0by1oaWRlIFRhYnM8L2Rpdj4KICAgICAgICA8ZGVtby1hdXRvaGlkZS10YWJzPjwvZGVtby1hdXRvaGlkZS10YWJzPgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlZlcnRpY2FsIFRhYnMgTGF5b3V0PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0idHdvLWNvbHVtbiI+CiAgICAgICAgICA8ZGVlcy1hcHB1aS10YWJzIC50YWJTdHlsZT0keyJ2ZXJ0aWNhbCJ9IC50YWJzPSR7dmVydGljYWxUYWJzfT48L2RlZXMtYXBwdWktdGFicz4KICAgICAgICAgICR7ZGVtb0NvbnRlbnQoIlZlcnRpY2FsIHRhYnMgd29yayBncmVhdCBmb3Igc2V0dGluZ3MgcGFnZXMgYW5kIG5hdmlnYXRpb24gbWVudXMuIFRoZSBhbmltYXRlZCBpbmRpY2F0b3Igc21vb3RobHkgdHJhbnNpdGlvbnMgYmV0d2VlbiBzZWxlY3Rpb25zLiIpfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPldpdGhvdXQgSW5kaWNhdG9yPC9kaXY+CiAgICAgICAgPGRlZXMtYXBwdWktdGFicyAuc2hvd1RhYkluZGljYXRvcj0ke2ZhbHNlfSAudGFicz0ke25vSW5kaWNhdG9yVGFic30+PC9kZWVzLWFwcHVpLXRhYnM+CiAgICAgICAgJHtkZW1vQ29udGVudCgiVGFicyBjYW4gYWxzbyBiZSB1c2VkIHdpdGhvdXQgdGhlIGFuaW1hdGVkIGluZGljYXRvciBieSBzZXR0aW5nIHNob3dUYWJJbmRpY2F0b3IgdG8gZmFsc2UuIil9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgYDsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1hcHB1aS9kZWVzLWFwcHVpLXRhYnMvZGVlcy1hcHB1aS10YWJzLmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfZGlzdF90czI5KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTQ3ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM0OCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0FwcHVpVGFicyA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1hcHB1aS10YWJzIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfdGFic19kZWNvcmF0b3JzOwogIGxldCBfdGFic19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RhYnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkVGFiX2RlY29yYXRvcnM7CiAgbGV0IF9zZWxlY3RlZFRhYl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkVGFiX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93VGFiSW5kaWNhdG9yX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93VGFiSW5kaWNhdG9yX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1RhYkluZGljYXRvcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGFiU3R5bGVfZGVjb3JhdG9yczsKICBsZXQgX3RhYlN0eWxlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGFiU3R5bGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2F1dG9IaWRlX2RlY29yYXRvcnM7CiAgbGV0IF9hdXRvSGlkZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2F1dG9IaWRlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdXRvSGlkZVRocmVzaG9sZF9kZWNvcmF0b3JzOwogIGxldCBfYXV0b0hpZGVUaHJlc2hvbGRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdXRvSGlkZVRocmVzaG9sZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWN0aW9uc0xlZnRfZGVjb3JhdG9yczsKICBsZXQgX2FjdGlvbnNMZWZ0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWN0aW9uc0xlZnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FjdGlvbnNSaWdodF9kZWNvcmF0b3JzOwogIGxldCBfYWN0aW9uc1JpZ2h0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWN0aW9uc1JpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jYW5TY3JvbGxMZWZ0X2RlY29yYXRvcnM7CiAgbGV0IF9jYW5TY3JvbGxMZWZ0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2FuU2Nyb2xsTGVmdF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2FuU2Nyb2xsUmlnaHRfZGVjb3JhdG9yczsKICBsZXQgX2NhblNjcm9sbFJpZ2h0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2FuU2Nyb2xsUmlnaHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0FwcHVpVGFiczIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF90YWJzX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEFycmF5CiAgICAgIH0pXTsKICAgICAgX3NlbGVjdGVkVGFiX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBPYmplY3QgfSldOwogICAgICBfc2hvd1RhYkluZGljYXRvcl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF90YWJTdHlsZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2F1dG9IaWRlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2F1dG9IaWRlVGhyZXNob2xkX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfYWN0aW9uc0xlZnRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX2FjdGlvbnNSaWdodF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfY2FuU2Nyb2xsTGVmdF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfY2FuU2Nyb2xsUmlnaHRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlNDcodGhpcywgbnVsbCwgX3RhYnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGFicyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGFicyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50YWJzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50YWJzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3RhYnNfaW5pdGlhbGl6ZXJzLCBfdGFic19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ3KHRoaXMsIG51bGwsIF9zZWxlY3RlZFRhYl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWxlY3RlZFRhYiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0ZWRUYWIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0ZWRUYWIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlbGVjdGVkVGFiID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGVkVGFiX2luaXRpYWxpemVycywgX3NlbGVjdGVkVGFiX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDcodGhpcywgbnVsbCwgX3Nob3dUYWJJbmRpY2F0b3JfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2hvd1RhYkluZGljYXRvciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd1RhYkluZGljYXRvciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93VGFiSW5kaWNhdG9yLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaG93VGFiSW5kaWNhdG9yID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dUYWJJbmRpY2F0b3JfaW5pdGlhbGl6ZXJzLCBfc2hvd1RhYkluZGljYXRvcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ3KHRoaXMsIG51bGwsIF90YWJTdHlsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0YWJTdHlsZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGFiU3R5bGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudGFiU3R5bGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnRhYlN0eWxlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3RhYlN0eWxlX2luaXRpYWxpemVycywgX3RhYlN0eWxlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDcodGhpcywgbnVsbCwgX2F1dG9IaWRlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImF1dG9IaWRlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhdXRvSGlkZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hdXRvSGlkZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYXV0b0hpZGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYXV0b0hpZGVfaW5pdGlhbGl6ZXJzLCBfYXV0b0hpZGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0Nyh0aGlzLCBudWxsLCBfYXV0b0hpZGVUaHJlc2hvbGRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYXV0b0hpZGVUaHJlc2hvbGQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImF1dG9IaWRlVGhyZXNob2xkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmF1dG9IaWRlVGhyZXNob2xkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hdXRvSGlkZVRocmVzaG9sZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hdXRvSGlkZVRocmVzaG9sZF9pbml0aWFsaXplcnMsIF9hdXRvSGlkZVRocmVzaG9sZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ3KHRoaXMsIG51bGwsIF9hY3Rpb25zTGVmdF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhY3Rpb25zTGVmdCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYWN0aW9uc0xlZnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWN0aW9uc0xlZnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFjdGlvbnNMZWZ0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FjdGlvbnNMZWZ0X2luaXRpYWxpemVycywgX2FjdGlvbnNMZWZ0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDcodGhpcywgbnVsbCwgX2FjdGlvbnNSaWdodF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhY3Rpb25zUmlnaHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFjdGlvbnNSaWdodCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hY3Rpb25zUmlnaHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFjdGlvbnNSaWdodCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hY3Rpb25zUmlnaHRfaW5pdGlhbGl6ZXJzLCBfYWN0aW9uc1JpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDcodGhpcywgbnVsbCwgX2NhblNjcm9sbExlZnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY2FuU2Nyb2xsTGVmdCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY2FuU2Nyb2xsTGVmdCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jYW5TY3JvbGxMZWZ0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jYW5TY3JvbGxMZWZ0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NhblNjcm9sbExlZnRfaW5pdGlhbGl6ZXJzLCBfY2FuU2Nyb2xsTGVmdF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ3KHRoaXMsIG51bGwsIF9jYW5TY3JvbGxSaWdodF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjYW5TY3JvbGxSaWdodCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY2FuU2Nyb2xsUmlnaHQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY2FuU2Nyb2xsUmlnaHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNhblNjcm9sbFJpZ2h0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NhblNjcm9sbFJpZ2h0X2luaXRpYWxpemVycywgX2NhblNjcm9sbFJpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDcobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzQXBwdWlUYWJzMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMzQ7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiQXBwIFVJIl07CiAgICAjdGFic19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM0OCh0aGlzLCBfdGFic19pbml0aWFsaXplcnMsIFtdKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgdGFicygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RhYnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0YWJzKHZhbHVlMikgewogICAgICB0aGlzLiN0YWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0ZWRUYWJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ4KHRoaXMsIF90YWJzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0OCh0aGlzLCBfc2VsZWN0ZWRUYWJfaW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICBnZXQgc2VsZWN0ZWRUYWIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZFRhYl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNlbGVjdGVkVGFiKHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3RlZFRhYl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dUYWJJbmRpY2F0b3JfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ4KHRoaXMsIF9zZWxlY3RlZFRhYl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDgodGhpcywgX3Nob3dUYWJJbmRpY2F0b3JfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgc2hvd1RhYkluZGljYXRvcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dUYWJJbmRpY2F0b3JfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93VGFiSW5kaWNhdG9yKHZhbHVlMikgewogICAgICB0aGlzLiNzaG93VGFiSW5kaWNhdG9yX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdGFiU3R5bGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ4KHRoaXMsIF9zaG93VGFiSW5kaWNhdG9yX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0OCh0aGlzLCBfdGFiU3R5bGVfaW5pdGlhbGl6ZXJzLCAiaG9yaXpvbnRhbCIpKTsKICAgIGdldCB0YWJTdHlsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RhYlN0eWxlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdGFiU3R5bGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3RhYlN0eWxlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYXV0b0hpZGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ4KHRoaXMsIF90YWJTdHlsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDgodGhpcywgX2F1dG9IaWRlX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBhdXRvSGlkZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2F1dG9IaWRlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYXV0b0hpZGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2F1dG9IaWRlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYXV0b0hpZGVUaHJlc2hvbGRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ4KHRoaXMsIF9hdXRvSGlkZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDgodGhpcywgX2F1dG9IaWRlVGhyZXNob2xkX2luaXRpYWxpemVycywgMCkpOwogICAgZ2V0IGF1dG9IaWRlVGhyZXNob2xkKCkgewogICAgICByZXR1cm4gdGhpcy4jYXV0b0hpZGVUaHJlc2hvbGRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhdXRvSGlkZVRocmVzaG9sZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYXV0b0hpZGVUaHJlc2hvbGRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhY3Rpb25zTGVmdF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDgodGhpcywgX2F1dG9IaWRlVGhyZXNob2xkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0OCh0aGlzLCBfYWN0aW9uc0xlZnRfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IGFjdGlvbnNMZWZ0KCkgewogICAgICByZXR1cm4gdGhpcy4jYWN0aW9uc0xlZnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhY3Rpb25zTGVmdCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYWN0aW9uc0xlZnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhY3Rpb25zUmlnaHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ4KHRoaXMsIF9hY3Rpb25zTGVmdF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDgodGhpcywgX2FjdGlvbnNSaWdodF9pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgYWN0aW9uc1JpZ2h0KCkgewogICAgICByZXR1cm4gdGhpcy4jYWN0aW9uc1JpZ2h0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYWN0aW9uc1JpZ2h0KHZhbHVlMikgewogICAgICB0aGlzLiNhY3Rpb25zUmlnaHRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjYW5TY3JvbGxMZWZ0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0OCh0aGlzLCBfYWN0aW9uc1JpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0OCh0aGlzLCBfY2FuU2Nyb2xsTGVmdF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICAvLyBTY3JvbGwgc3RhdGUgZm9yIGZhZGUgaW5kaWNhdG9ycwogICAgZ2V0IGNhblNjcm9sbExlZnQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjYW5TY3JvbGxMZWZ0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY2FuU2Nyb2xsTGVmdCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY2FuU2Nyb2xsTGVmdF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NhblNjcm9sbFJpZ2h0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0OCh0aGlzLCBfY2FuU2Nyb2xsTGVmdF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNDgodGhpcywgX2NhblNjcm9sbFJpZ2h0X2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBjYW5TY3JvbGxSaWdodCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NhblNjcm9sbFJpZ2h0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY2FuU2Nyb2xsUmlnaHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2NhblNjcm9sbFJpZ2h0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICByZXNpemVPYnNlcnZlciA9IChfX3J1bkluaXRpYWxpemVyczQ4KHRoaXMsIF9jYW5TY3JvbGxSaWdodF9leHRyYUluaXRpYWxpemVycyksIG51bGwpOwogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC50YWJzLXdyYXBwZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC50YWJzLXdyYXBwZXIuaG9yaXpvbnRhbC13cmFwcGVyIHsKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICAgIH0KCiAgICAgIC8qIFNjcm9sbCBmYWRlIGluZGljYXRvcnMgKi8KICAgICAgLnNjcm9sbC1mYWRlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMXB4OwogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2U7CiAgICAgICAgei1pbmRleDogMTA7CiAgICAgIH0KCiAgICAgIC5zY3JvbGwtZmFkZS1sZWZ0IHsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwKICAgICAgICAgICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMxNjE2MTYiKX0gMCUsCiAgICAgICAgICAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgyNTUsMjU1LDI1NSwwKSIsICJyZ2JhKDIyLDIyLDIyLDApIil9IDEwMCUpOwogICAgICB9CgogICAgICAuc2Nyb2xsLWZhZGUtcmlnaHQgewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBsZWZ0LAogICAgICAgICAgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzE2MTYxNiIpfSAwJSwKICAgICAgICAgICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDI1NSwyNTUsMjU1LDApIiwgInJnYmEoMjIsMjIsMjIsMCkiKX0gMTAwJSk7CiAgICAgIH0KCiAgICAgIC5zY3JvbGwtZmFkZS52aXNpYmxlIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAuc2Nyb2xsLWFyZWEgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC8qIFRhYiBhY3Rpb24gYnV0dG9ucyAqLwogICAgICAudGFiLWFjdGlvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDJweDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBwYWRkaW5nOiAwIDRweDsKICAgICAgfQoKICAgICAgLnRhYi1hY3Rpb25zLmxlZnQgewogICAgICAgIHBhZGRpbmctbGVmdDogMTJweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgfQoKICAgICAgLnRhYi1hY3Rpb25zLnJpZ2h0IHsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxMnB4OwogICAgICAgIHBhZGRpbmctbGVmdDogOHB4OwogICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgfQoKICAgICAgLnRhYi1hY3Rpb24tYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cyBlYXNlLCBjb2xvciAwLjE1cyBlYXNlOwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjNzE3MTdhIil9OwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAudGFiLWFjdGlvbi1idXR0b246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDYpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNikiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICAgIH0KCiAgICAgIC50YWItYWN0aW9uLWJ1dHRvbjphY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMSkiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpIil9OwogICAgICB9CgogICAgICAudGFiLWFjdGlvbi1idXR0b24uZGlzYWJsZWQgewogICAgICAgIG9wYWNpdHk6IDAuNDsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICB9CgogICAgICAudGFiLWFjdGlvbi1idXR0b24uZGlzYWJsZWQ6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjNzE3MTdhIil9OwogICAgICB9CgogICAgICAudGFiLWFjdGlvbi1idXR0b24gZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgIH0KCiAgICAgIC50YWJzQ29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICB9CgogICAgICAudGFic0NvbnRhaW5lci5ob3Jpem9udGFsIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteTogaGlkZGVuOwogICAgICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICAgICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwogICAgICAgIHNjcm9sbGJhci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgICBnYXA6IDRweDsKICAgICAgfQoKICAgICAgLyogU2hvdyBzY3JvbGxiYXIgb24gaG92ZXIgKi8KICAgICAgLnRhYnMtd3JhcHBlcjpob3ZlciAudGFic0NvbnRhaW5lci5ob3Jpem9udGFsLAogICAgICAuc2Nyb2xsLWFyZWE6aG92ZXIgLnRhYnNDb250YWluZXIuaG9yaXpvbnRhbCB7CiAgICAgICAgc2Nyb2xsYmFyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLDAsMCwwLjIpIiwgInJnYmEoMjU1LDI1NSwyNTUsMC4yKSIpfSB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgLnRhYnNDb250YWluZXIuaG9yaXpvbnRhbDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIGhlaWdodDogNHB4OwogICAgICB9CgogICAgICAudGFic0NvbnRhaW5lci5ob3Jpem9udGFsOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC50YWJzQ29udGFpbmVyLmhvcml6b250YWw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzIGVhc2U7CiAgICAgIH0KCiAgICAgIC50YWJzLXdyYXBwZXI6aG92ZXIgLnRhYnNDb250YWluZXIuaG9yaXpvbnRhbDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIsCiAgICAgIC5zY3JvbGwtYXJlYTpob3ZlciAudGFic0NvbnRhaW5lci5ob3Jpem9udGFsOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwwLDAsMC4yKSIsICJyZ2JhKDI1NSwyNTUsMjU1LDAuMikiKX07CiAgICAgIH0KCiAgICAgIC50YWJzLXdyYXBwZXI6aG92ZXIgLnRhYnNDb250YWluZXIuaG9yaXpvbnRhbDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIsCiAgICAgIC5zY3JvbGwtYXJlYTpob3ZlciAudGFic0NvbnRhaW5lci5ob3Jpem9udGFsOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwwLDAsMC4zNSkiLCAicmdiYSgyNTUsMjU1LDI1NSwwLjM1KSIpfTsKICAgICAgfQoKICAgICAgLnRhYnNDb250YWluZXIudmVydGljYWwgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGdhcDogMnB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y5ZmFmYiIsICIjMTgxODFiIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgfQoKICAgICAgLnRhYiB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM3MTcxN2EiKX07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogY29sb3IgMC4xNXMgZWFzZTsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB6LWluZGV4OiAyOwogICAgICB9CgogICAgICAuaG9yaXpvbnRhbCAudGFiIHsKICAgICAgICBwYWRkaW5nOiAwIDE2cHg7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwOwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZTsKICAgICAgfQogICAgICAKICAgICAgLmhvcml6b250YWwgLnRhYjpub3QoOmxhc3QtY2hpbGQpOjphZnRlciB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAtMnB4OwogICAgICAgIHRvcDogNTAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgd2lkdGg6IDFweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgfQogICAgICAKICAgICAgLmhvcml6b250YWwgLnRhYiAudGFiLWNvbnRlbnQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgIH0KCiAgICAgIC52ZXJ0aWNhbCAudGFiIHsKICAgICAgICBwYWRkaW5nOiAxMHB4IDE2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnRhYjpob3ZlciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5ob3Jpem9udGFsIC50YWI6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDMpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMykiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5ob3Jpem9udGFsIC50YWI6aG92ZXI6OmFmdGVyLAogICAgICAuaG9yaXpvbnRhbCAudGFiOmhvdmVyICsgLnRhYjo6YWZ0ZXIgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC52ZXJ0aWNhbCAudGFiOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgyNDQsIDI0NCwgMjQ1LCAwLjUpIiwgInJnYmEoMzksIDM5LCA0MiwgMC41KSIpfTsKICAgICAgfQoKICAgICAgLmhvcml6b250YWwgLnRhYi5zZWxlY3RlZFRhYiB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICAgIH0KICAgICAgCiAgICAgIC5ob3Jpem9udGFsIC50YWIuc2VsZWN0ZWRUYWI6OmFmdGVyLAogICAgICAuaG9yaXpvbnRhbCAudGFiLnNlbGVjdGVkVGFiICsgLnRhYjo6YWZ0ZXIgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC52ZXJ0aWNhbCAudGFiLnNlbGVjdGVkVGFiIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgICAgfQoKICAgICAgLnRhYiBkZWVzLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgfQoKICAgICAgLnRhYkluZGljYXRvciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQogICAgICAKICAgICAgLnRhYkluZGljYXRvci5uby10cmFuc2l0aW9uIHsKICAgICAgICB0cmFuc2l0aW9uOiBub25lOwogICAgICB9CgogICAgICAudGFicy13cmFwcGVyIC50YWJJbmRpY2F0b3IgewogICAgICAgIGhlaWdodDogM3B4OwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjM2I4MmY2Iil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweCAzcHggMCAwOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgIH0KCiAgICAgIC52ZXJ0aWNhbC13cmFwcGVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC52ZXJ0aWNhbC13cmFwcGVyIC50YWJJbmRpY2F0b3IgewogICAgICAgIGxlZnQ6IDhweDsKICAgICAgICByaWdodDogOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMjcyNzJhIil9OwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4wOCk7CiAgICAgIH0KCiAgICAgIC8qIENsb3NlIGJ1dHRvbiAqLwogICAgICAudGFiLWNsb3NlIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDsKICAgICAgICBvcGFjaXR5OiAwLjQ7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cywgYmFja2dyb3VuZCAwLjE1czsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiIzcxNzE3YSIpfTsKICAgICAgfQoKICAgICAgLnRhYjpob3ZlciAudGFiLWNsb3NlIHsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgIH0KCiAgICAgIC50YWItY2xvc2U6aG92ZXIgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwwLDAsMC4xKSIsICJyZ2JhKDI1NSwyNTUsMjU1LDAuMSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZWY0NDQ0IiwgIiNmODcxNzEiKX07CiAgICAgIH0KCiAgICAgIC50YWIuc2VsZWN0ZWRUYWIgLnRhYi1jbG9zZSB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAudGFiLnNlbGVjdGVkVGFiOmhvdmVyIC50YWItY2xvc2UgewogICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgfQoKICAgICAgLnRhYi5zZWxlY3RlZFRhYiAudGFiLWNsb3NlOmhvdmVyIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICBpZiAodGhpcy5hdXRvSGlkZSAmJiB0aGlzLnRhYnMubGVuZ3RoIDw9IHRoaXMuYXV0b0hpZGVUaHJlc2hvbGQpIHsKICAgICAgICByZXR1cm4gYjJgYDsKICAgICAgfQogICAgICByZXR1cm4gYjJgCiAgICAgICR7dGhpcy5yZW5kZXJUYWJzV3JhcHBlcigpfQogICAgYDsKICAgIH0KICAgIHJlbmRlclRhYnNXcmFwcGVyKCkgewogICAgICBjb25zdCBpc0hvcml6b250YWwgPSB0aGlzLnRhYlN0eWxlID09PSAiaG9yaXpvbnRhbCI7CiAgICAgIGNvbnN0IHdyYXBwZXJDbGFzcyA9IGlzSG9yaXpvbnRhbCA/ICJ0YWJzLXdyYXBwZXIgaG9yaXpvbnRhbC13cmFwcGVyIiA6ICJ2ZXJ0aWNhbC13cmFwcGVyIjsKICAgICAgY29uc3QgY29udGFpbmVyQ2xhc3MgPSBgdGFic0NvbnRhaW5lciAke3RoaXMudGFiU3R5bGV9YDsKICAgICAgaWYgKGlzSG9yaXpvbnRhbCkgewogICAgICAgIGNvbnN0IGhhc0xlZnRBY3Rpb25zID0gdGhpcy5hY3Rpb25zTGVmdCAmJiB0aGlzLmFjdGlvbnNMZWZ0Lmxlbmd0aCA+IDA7CiAgICAgICAgY29uc3QgaGFzUmlnaHRBY3Rpb25zID0gdGhpcy5hY3Rpb25zUmlnaHQgJiYgdGhpcy5hY3Rpb25zUmlnaHQubGVuZ3RoID4gMDsKICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgPGRpdiBjbGFzcz0iJHt3cmFwcGVyQ2xhc3N9Ij4KICAgICAgICAgICR7aGFzTGVmdEFjdGlvbnMgPyB0aGlzLnJlbmRlckFjdGlvbnModGhpcy5hY3Rpb25zTGVmdCwgImxlZnQiKSA6ICIifQogICAgICAgICAgPGRpdiBjbGFzcz0ic2Nyb2xsLWFyZWEiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzY3JvbGwtZmFkZSBzY3JvbGwtZmFkZS1sZWZ0ICR7dGhpcy5jYW5TY3JvbGxMZWZ0ID8gInZpc2libGUiIDogIiJ9Ij48L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iJHtjb250YWluZXJDbGFzc30iIEBzY3JvbGw9JHt0aGlzLmhhbmRsZVNjcm9sbH0+CiAgICAgICAgICAgICAgJHt0aGlzLnRhYnMubWFwKCh0YWIyKSA9PiB0aGlzLnJlbmRlclRhYih0YWIyLCBpc0hvcml6b250YWwpKX0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNjcm9sbC1mYWRlIHNjcm9sbC1mYWRlLXJpZ2h0ICR7dGhpcy5jYW5TY3JvbGxSaWdodCA/ICJ2aXNpYmxlIiA6ICIifSI+PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICR7aGFzUmlnaHRBY3Rpb25zID8gdGhpcy5yZW5kZXJBY3Rpb25zKHRoaXMuYWN0aW9uc1JpZ2h0LCAicmlnaHQiKSA6ICIifQogICAgICAgICAgJHt0aGlzLnNob3dUYWJJbmRpY2F0b3IgPyBiMmA8ZGl2IGNsYXNzPSJ0YWJJbmRpY2F0b3IiPjwvZGl2PmAgOiAiIn0KICAgICAgICA8L2Rpdj4KICAgICAgYDsKICAgICAgfQogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9IiR7d3JhcHBlckNsYXNzfSI+CiAgICAgICAgPGRpdiBjbGFzcz0iJHtjb250YWluZXJDbGFzc30iPgogICAgICAgICAgJHt0aGlzLnRhYnMubWFwKCh0YWIyKSA9PiB0aGlzLnJlbmRlclRhYih0YWIyLCBpc0hvcml6b250YWwpKX0KICAgICAgICA8L2Rpdj4KICAgICAgICAke3RoaXMuc2hvd1RhYkluZGljYXRvciA/IGIyYDxkaXYgY2xhc3M9InRhYkluZGljYXRvciI+PC9kaXY+YCA6ICIifQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJBY3Rpb25zKGFjdGlvbnMsIHBvc2l0aW9uMykgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InRhYi1hY3Rpb25zICR7cG9zaXRpb24zfSI+CiAgICAgICAgJHthY3Rpb25zLm1hcCgoYWN0aW9uKSA9PiBiMmAKICAgICAgICAgIDxkaXYKICAgICAgICAgICAgY2xhc3M9InRhYi1hY3Rpb24tYnV0dG9uICR7YWN0aW9uLmRpc2FibGVkID8gImRpc2FibGVkIiA6ICIifSIKICAgICAgICAgICAgdGl0bGU9IiR7YWN0aW9uLnRvb2x0aXAgfHwgYWN0aW9uLmlkfSIKICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gIWFjdGlvbi5kaXNhYmxlZCAmJiBhY3Rpb24uYWN0aW9uKCl9CiAgICAgICAgICA+CiAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHthY3Rpb24uaWNvbk5hbWV9PjwvZGVlcy1pY29uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgYCl9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlclRhYih0YWIyLCBpc0hvcml6b250YWwpIHsKICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHRhYjIgPT09IHRoaXMuc2VsZWN0ZWRUYWI7CiAgICAgIGNvbnN0IGNsYXNzZXMgPSBgdGFiICR7aXNTZWxlY3RlZCA/ICJzZWxlY3RlZFRhYiIgOiAiIn1gOwogICAgICBjb25zdCBjbG9zZUJ1dHRvbiA9IHRhYjIuY2xvc2VhYmxlID8gYjJgCiAgICAgIDxzcGFuIGNsYXNzPSJ0YWItY2xvc2UiIEBjbGljaz0iJHsoZTExKSA9PiB0aGlzLmNsb3NlVGFiKGUxMSwgdGFiMil9Ij4KICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTp4In0gc3R5bGU9ImZvbnQtc2l6ZTogMTJweDsiPjwvZGVlcy1pY29uPgogICAgICA8L3NwYW4+CiAgICBgIDogIiI7CiAgICAgIGNvbnN0IGNvbnRlbnQzID0gaXNIb3Jpem9udGFsID8gYjJgCiAgICAgIDxzcGFuIGNsYXNzPSJ0YWItY29udGVudCI+CiAgICAgICAgJHt0aGlzLnJlbmRlclRhYkljb24odGFiMil9CiAgICAgICAgJHt0YWIyLmtleX0KICAgICAgPC9zcGFuPgogICAgICAke2Nsb3NlQnV0dG9ufQogICAgYCA6IGIyYAogICAgICAke3RoaXMucmVuZGVyVGFiSWNvbih0YWIyKX0KICAgICAgJHt0YWIyLmtleX0KICAgICAgJHtjbG9zZUJ1dHRvbn0KICAgIGA7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdgogICAgICAgIGNsYXNzPSIke2NsYXNzZXN9IgogICAgICAgIEBjbGljaz0iJHsoKSA9PiB0aGlzLnNlbGVjdFRhYih0YWIyKX0iCiAgICAgID4KICAgICAgICAke2NvbnRlbnQzfQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJUYWJJY29uKHRhYjIpIHsKICAgICAgcmV0dXJuIHRhYjIuaWNvbk5hbWUgPyBiMmA8ZGVlcy1pY29uIC5pY29uPSR7dGFiMi5pY29uTmFtZX0+PC9kZWVzLWljb24+YCA6ICIiOwogICAgfQogICAgc2VsZWN0VGFiKHRhYkFyZykgewogICAgICB0aGlzLnNlbGVjdGVkVGFiID0gdGFiQXJnOwogICAgICB0YWJBcmcuYWN0aW9uKCk7CiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgdGhpcy5zY3JvbGxUYWJJbnRvVmlldyh0YWJBcmcpOwogICAgICB9KTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgidGFiLXNlbGVjdCIsIHsKICAgICAgICBkZXRhaWw6IHsgdGFiOiB0YWJBcmcgfSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQ2xlYXIgYWxsIHRhYnMgYW5kIHJlc2V0IHNlbGVjdGlvbi4KICAgICAqLwogICAgY2xlYXIoKSB7CiAgICAgIHRoaXMudGFicyA9IFtdOwogICAgICB0aGlzLnNlbGVjdGVkVGFiID0gbnVsbDsKICAgIH0KICAgIGNsb3NlVGFiKGUxMSwgdGFiMikgewogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIGlmICh0YWIyLm9uQ2xvc2UpIHsKICAgICAgICB0YWIyLm9uQ2xvc2UoKTsKICAgICAgfQogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJ0YWItY2xvc2UiLCB7CiAgICAgICAgZGV0YWlsOiB7IHRhYjogdGFiMiB9LAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgZmlyc3RVcGRhdGVkKCkgewogICAgICB0aGlzLnNldHVwUmVzaXplT2JzZXJ2ZXIoKTsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbFN0YXRlKCk7CiAgICAgIH0pOwogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGlmICh0aGlzLnJlc2l6ZU9ic2VydmVyKSB7CiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIHNldHVwUmVzaXplT2JzZXJ2ZXIoKSB7CiAgICAgIGlmICh0aGlzLnRhYlN0eWxlICE9PSAiaG9yaXpvbnRhbCIpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHsKICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbFN0YXRlKCk7CiAgICAgIH0pOwogICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi50YWJzQ29udGFpbmVyLmhvcml6b250YWwiKTsKICAgICAgaWYgKGNvbnRhaW5lcikgewogICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShjb250YWluZXIpOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVTY3JvbGwgPSAoKSA9PiB7CiAgICAgIHRoaXMudXBkYXRlU2Nyb2xsU3RhdGUoKTsKICAgIH07CiAgICB1cGRhdGVTY3JvbGxTdGF0ZSgpIHsKICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIudGFic0NvbnRhaW5lci5ob3Jpem9udGFsIik7CiAgICAgIGlmICghY29udGFpbmVyKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IGNvbnRhaW5lci5zY3JvbGxMZWZ0OwogICAgICBjb25zdCBzY3JvbGxXaWR0aCA9IGNvbnRhaW5lci5zY3JvbGxXaWR0aDsKICAgICAgY29uc3QgY2xpZW50V2lkdGggPSBjb250YWluZXIuY2xpZW50V2lkdGg7CiAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDI7CiAgICAgIHRoaXMuY2FuU2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQgPiB0aHJlc2hvbGQ7CiAgICAgIHRoaXMuY2FuU2Nyb2xsUmlnaHQgPSBzY3JvbGxMZWZ0IDwgc2Nyb2xsV2lkdGggLSBjbGllbnRXaWR0aCAtIHRocmVzaG9sZDsKICAgIH0KICAgIHNjcm9sbFRhYkludG9WaWV3KHRhYjIpIHsKICAgICAgaWYgKHRoaXMudGFiU3R5bGUgIT09ICJob3Jpem9udGFsIikKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHRhYkluZGV4ID0gdGhpcy50YWJzLmluZGV4T2YodGFiMik7CiAgICAgIGlmICh0YWJJbmRleCA9PT0gLTEpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi50YWJzQ29udGFpbmVyLmhvcml6b250YWwiKTsKICAgICAgY29uc3QgdGFiRWxlbWVudCA9IGNvbnRhaW5lcj8ucXVlcnlTZWxlY3RvcihgLnRhYjpudGgtY2hpbGQoJHt0YWJJbmRleCArIDF9KWApOwogICAgICBpZiAodGFiRWxlbWVudCAmJiBjb250YWluZXIpIHsKICAgICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGNvbnN0IHRhYlJlY3QgPSB0YWJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGNvbnN0IGlzRnVsbHlWaXNpYmxlID0gdGFiUmVjdC5sZWZ0ID49IGNvbnRhaW5lclJlY3QubGVmdCAmJiB0YWJSZWN0LnJpZ2h0IDw9IGNvbnRhaW5lclJlY3QucmlnaHQ7CiAgICAgICAgaWYgKCFpc0Z1bGx5VmlzaWJsZSkgewogICAgICAgICAgdGFiRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAic21vb3RoIiwgYmxvY2s6ICJuZWFyZXN0IiwgaW5saW5lOiAibmVhcmVzdCIgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBhc3luYyB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJ0YWJzIikpIHsKICAgICAgICBpZiAoIXRoaXMudGFicyB8fCB0aGlzLnRhYnMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFRhYiAhPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgidGFiLXNlbGVjdCIsIHsKICAgICAgICAgICAgICBkZXRhaWw6IHsgdGFiOiBudWxsIH0sCiAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgICAgICB9KSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFiICYmICF0aGlzLnRhYnMuaW5jbHVkZXModGhpcy5zZWxlY3RlZFRhYikpIHsKICAgICAgICAgIHRoaXMuc2VsZWN0VGFiKHRoaXMudGFic1swXSk7CiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5zZWxlY3RlZFRhYikgewogICAgICAgICAgdGhpcy5zZWxlY3RUYWIodGhpcy50YWJzWzBdKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygic2VsZWN0ZWRUYWIiKSB8fCBjaGFuZ2VkUHJvcGVydGllcy5oYXMoInRhYnMiKSkgewogICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7CiAgICAgICAgaWYgKCF0aGlzLmluZGljYXRvckluaXRpYWxpemVkICYmIGRvY3VtZW50LmZvbnRzKSB7CiAgICAgICAgICBhd2FpdCBkb2N1bWVudC5mb250cy5yZWFkeTsKICAgICAgICB9CiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICAgIHRoaXMudXBkYXRlVGFiSW5kaWNhdG9yKCk7CiAgICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbFN0YXRlKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGluZGljYXRvckluaXRpYWxpemVkID0gZmFsc2U7CiAgICB1cGRhdGVUYWJJbmRpY2F0b3IoKSB7CiAgICAgIGlmICghdGhpcy5zaG91bGRTaG93SW5kaWNhdG9yKCkpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBzZWxlY3RlZFRhYkVsZW1lbnQgPSB0aGlzLmdldFNlbGVjdGVkVGFiRWxlbWVudCgpOwogICAgICBpZiAoIXNlbGVjdGVkVGFiRWxlbWVudCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGluZGljYXRvciA9IHRoaXMuZ2V0SW5kaWNhdG9yRWxlbWVudCgpOwogICAgICBpZiAoIWluZGljYXRvcikKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMuaGFuZGxlSW5pdGlhbFRyYW5zaXRpb24oaW5kaWNhdG9yKTsKICAgICAgaWYgKHRoaXMudGFiU3R5bGUgPT09ICJob3Jpem9udGFsIikgewogICAgICAgIHRoaXMudXBkYXRlSG9yaXpvbnRhbEluZGljYXRvcihpbmRpY2F0b3IsIHNlbGVjdGVkVGFiRWxlbWVudCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy51cGRhdGVWZXJ0aWNhbEluZGljYXRvcihpbmRpY2F0b3IsIHNlbGVjdGVkVGFiRWxlbWVudCk7CiAgICAgIH0KICAgICAgaW5kaWNhdG9yLnN0eWxlLm9wYWNpdHkgPSAiMSI7CiAgICB9CiAgICBzaG91bGRTaG93SW5kaWNhdG9yKCkgewogICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRhYiAmJiB0aGlzLnNob3dUYWJJbmRpY2F0b3IgJiYgdGhpcy50YWJzLmluY2x1ZGVzKHRoaXMuc2VsZWN0ZWRUYWIpOwogICAgfQogICAgZ2V0U2VsZWN0ZWRUYWJFbGVtZW50KCkgewogICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gdGhpcy50YWJzLmluZGV4T2YodGhpcy5zZWxlY3RlZFRhYik7CiAgICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHRoaXMudGFiU3R5bGUgPT09ICJob3Jpem9udGFsIjsKICAgICAgY29uc3Qgc2VsZWN0b3IgPSBpc0hvcml6b250YWwgPyBgLnRhYnMtd3JhcHBlciAudGFic0NvbnRhaW5lciAudGFiOm50aC1jaGlsZCgke3NlbGVjdGVkSW5kZXggKyAxfSlgIDogYC52ZXJ0aWNhbC13cmFwcGVyIC50YWJzQ29udGFpbmVyIC50YWI6bnRoLWNoaWxkKCR7c2VsZWN0ZWRJbmRleCArIDF9KWA7CiAgICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICB9CiAgICBnZXRJbmRpY2F0b3JFbGVtZW50KCkgewogICAgICByZXR1cm4gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi50YWJJbmRpY2F0b3IiKTsKICAgIH0KICAgIGhhbmRsZUluaXRpYWxUcmFuc2l0aW9uKGluZGljYXRvcikgewogICAgICBpZiAoIXRoaXMuaW5kaWNhdG9ySW5pdGlhbGl6ZWQpIHsKICAgICAgICBpbmRpY2F0b3IuY2xhc3NMaXN0LmFkZCgibm8tdHJhbnNpdGlvbiIpOwogICAgICAgIHRoaXMuaW5kaWNhdG9ySW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgaW5kaWNhdG9yLmNsYXNzTGlzdC5yZW1vdmUoIm5vLXRyYW5zaXRpb24iKTsKICAgICAgICB9LCA1MCk7CiAgICAgIH0KICAgIH0KICAgIHVwZGF0ZUhvcml6b250YWxJbmRpY2F0b3IoaW5kaWNhdG9yLCB0YWJFbGVtZW50KSB7CiAgICAgIGNvbnN0IHRhYkNvbnRlbnQgPSB0YWJFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIi50YWItY29udGVudCIpOwogICAgICBpZiAoIXRhYkNvbnRlbnQpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCB3cmFwcGVyUmVjdCA9IGluZGljYXRvci5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBjb25zdCBjb250ZW50UmVjdCA9IHRhYkNvbnRlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IGNvbnRlbnRMZWZ0ID0gY29udGVudFJlY3QubGVmdCAtIHdyYXBwZXJSZWN0LmxlZnQ7CiAgICAgIGNvbnN0IGluZGljYXRvcldpZHRoID0gY29udGVudFJlY3Qud2lkdGggKyA4OwogICAgICBjb25zdCBpbmRpY2F0b3JMZWZ0ID0gY29udGVudExlZnQgLSA0OwogICAgICBpbmRpY2F0b3Iuc3R5bGUud2lkdGggPSBgJHtpbmRpY2F0b3JXaWR0aH1weGA7CiAgICAgIGluZGljYXRvci5zdHlsZS5sZWZ0ID0gYCR7aW5kaWNhdG9yTGVmdH1weGA7CiAgICB9CiAgICB1cGRhdGVWZXJ0aWNhbEluZGljYXRvcihpbmRpY2F0b3IsIHRhYkVsZW1lbnQpIHsKICAgICAgY29uc3QgdGFic0NvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIudmVydGljYWwtd3JhcHBlciAudGFic0NvbnRhaW5lciIpOwogICAgICBpZiAoIXRhYnNDb250YWluZXIpCiAgICAgICAgcmV0dXJuOwogICAgICBpbmRpY2F0b3Iuc3R5bGUudG9wID0gYCR7dGFiRWxlbWVudC5vZmZzZXRUb3AgKyB0YWJzQ29udGFpbmVyLm9mZnNldFRvcH1weGA7CiAgICAgIGluZGljYXRvci5zdHlsZS5oZWlnaHQgPSBgJHt0YWJFbGVtZW50LmNsaWVudEhlaWdodH1weGA7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczQ4KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzQXBwdWlUYWJzMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtYXBwdWkvZGVlcy1hcHB1aS1tYWluY29udGVudC9kZWVzLWFwcHVpLW1haW5jb250ZW50LmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfZGlzdF90czI5KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTQ4ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM0OSA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0FwcHVpTWFpbmNvbnRlbnQgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtYXBwdWktbWFpbmNvbnRlbnQiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF90YWJzX2RlY29yYXRvcnM7CiAgbGV0IF90YWJzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGFic19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRUYWJfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkVGFiX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRUYWJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dUYWJzX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93VGFic19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dUYWJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90YWJzQXV0b0hpZGVfZGVjb3JhdG9yczsKICBsZXQgX3RhYnNBdXRvSGlkZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RhYnNBdXRvSGlkZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGFic0F1dG9IaWRlVGhyZXNob2xkX2RlY29yYXRvcnM7CiAgbGV0IF90YWJzQXV0b0hpZGVUaHJlc2hvbGRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90YWJzQXV0b0hpZGVUaHJlc2hvbGRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RhYkFjdGlvbnNMZWZ0X2RlY29yYXRvcnM7CiAgbGV0IF90YWJBY3Rpb25zTGVmdF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RhYkFjdGlvbnNMZWZ0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90YWJBY3Rpb25zUmlnaHRfZGVjb3JhdG9yczsKICBsZXQgX3RhYkFjdGlvbnNSaWdodF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RhYkFjdGlvbnNSaWdodF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzQXBwdWlNYWluY29udGVudDIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF90YWJzX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEFycmF5CiAgICAgIH0pXTsKICAgICAgX3NlbGVjdGVkVGFiX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBPYmplY3QgfSldOwogICAgICBfc2hvd1RhYnNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfdGFic0F1dG9IaWRlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3RhYnNBdXRvSGlkZVRocmVzaG9sZF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX3RhYkFjdGlvbnNMZWZ0X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF90YWJBY3Rpb25zUmlnaHRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX19lc0RlY29yYXRlNDgodGhpcywgbnVsbCwgX3RhYnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGFicyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGFicyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50YWJzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50YWJzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3RhYnNfaW5pdGlhbGl6ZXJzLCBfdGFic19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ4KHRoaXMsIG51bGwsIF9zZWxlY3RlZFRhYl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWxlY3RlZFRhYiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0ZWRUYWIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0ZWRUYWIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlbGVjdGVkVGFiID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGVkVGFiX2luaXRpYWxpemVycywgX3NlbGVjdGVkVGFiX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDgodGhpcywgbnVsbCwgX3Nob3dUYWJzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dUYWJzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93VGFicyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93VGFicywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd1RhYnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd1RhYnNfaW5pdGlhbGl6ZXJzLCBfc2hvd1RhYnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0OCh0aGlzLCBudWxsLCBfdGFic0F1dG9IaWRlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRhYnNBdXRvSGlkZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGFic0F1dG9IaWRlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRhYnNBdXRvSGlkZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGFic0F1dG9IaWRlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3RhYnNBdXRvSGlkZV9pbml0aWFsaXplcnMsIF90YWJzQXV0b0hpZGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0OCh0aGlzLCBudWxsLCBfdGFic0F1dG9IaWRlVGhyZXNob2xkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRhYnNBdXRvSGlkZVRocmVzaG9sZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGFic0F1dG9IaWRlVGhyZXNob2xkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRhYnNBdXRvSGlkZVRocmVzaG9sZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGFic0F1dG9IaWRlVGhyZXNob2xkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3RhYnNBdXRvSGlkZVRocmVzaG9sZF9pbml0aWFsaXplcnMsIF90YWJzQXV0b0hpZGVUaHJlc2hvbGRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0OCh0aGlzLCBudWxsLCBfdGFiQWN0aW9uc0xlZnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGFiQWN0aW9uc0xlZnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRhYkFjdGlvbnNMZWZ0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRhYkFjdGlvbnNMZWZ0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50YWJBY3Rpb25zTGVmdCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90YWJBY3Rpb25zTGVmdF9pbml0aWFsaXplcnMsIF90YWJBY3Rpb25zTGVmdF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ4KHRoaXMsIG51bGwsIF90YWJBY3Rpb25zUmlnaHRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGFiQWN0aW9uc1JpZ2h0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0YWJBY3Rpb25zUmlnaHQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudGFiQWN0aW9uc1JpZ2h0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50YWJBY3Rpb25zUmlnaHQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGFiQWN0aW9uc1JpZ2h0X2luaXRpYWxpemVycywgX3RhYkFjdGlvbnNSaWdodF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ4KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0FwcHVpTWFpbmNvbnRlbnQyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gKCkgPT4gYjJgCiAgICA8ZGVlcy1hcHB1aS1tYWluY29udGVudAogICAgICAudGFicz0ke1sKICAgICAgeyBrZXk6ICJPdmVydmlldyIsIGljb25OYW1lOiAibHVjaWRlOmhvbWUiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJPdmVydmlldyIpIH0sCiAgICAgIHsga2V5OiAiRGV0YWlscyIsIGljb25OYW1lOiAibHVjaWRlOmZpbGUiLCBhY3Rpb246ICgpID0+IGNvbnNvbGUubG9nKCJEZXRhaWxzIikgfSwKICAgICAgeyBrZXk6ICJTZXR0aW5ncyIsIGljb25OYW1lOiAibHVjaWRlOnNldHRpbmdzIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLmxvZygiU2V0dGluZ3MiKSB9CiAgICBdfQogICAgPgogICAgICA8ZGl2IHNsb3Q9ImNvbnRlbnQiIHN0eWxlPSJwYWRkaW5nOiA0MHB4OyBjb2xvcjogI2NjYzsiPgogICAgICAgIDxoMT5NYWluIENvbnRlbnQgQXJlYTwvaDE+CiAgICAgICAgPHA+VGhpcyBpcyB3aGVyZSB5b3VyIGFwcGxpY2F0aW9uIGNvbnRlbnQgZ29lcy48L3A+CiAgICAgIDwvZGl2PgogICAgPC9kZWVzLWFwcHVpLW1haW5jb250ZW50PgogIGA7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiQXBwIFVJIl07CiAgICAjdGFic19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM0OSh0aGlzLCBfdGFic19pbml0aWFsaXplcnMsIFsKICAgICAgeyBrZXk6ICJcdTI2QTBcdUZFMEYgUGxlYXNlIHNldCB0YWJzIiwgYWN0aW9uOiAoKSA9PiBjb25zb2xlLndhcm4oIk5vIHRhYnMgY29uZmlndXJlZCBmb3IgbWFpbmNvbnRlbnQiKSB9CiAgICBdKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgdGFicygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RhYnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0YWJzKHZhbHVlMikgewogICAgICB0aGlzLiN0YWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0ZWRUYWJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ5KHRoaXMsIF90YWJzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0OSh0aGlzLCBfc2VsZWN0ZWRUYWJfaW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICBnZXQgc2VsZWN0ZWRUYWIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZFRhYl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNlbGVjdGVkVGFiKHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3RlZFRhYl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dUYWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0OSh0aGlzLCBfc2VsZWN0ZWRUYWJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQ5KHRoaXMsIF9zaG93VGFic19pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93VGFicygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dUYWJzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd1RhYnModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dUYWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdGFic0F1dG9IaWRlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0OSh0aGlzLCBfc2hvd1RhYnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQ5KHRoaXMsIF90YWJzQXV0b0hpZGVfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHRhYnNBdXRvSGlkZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RhYnNBdXRvSGlkZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRhYnNBdXRvSGlkZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdGFic0F1dG9IaWRlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdGFic0F1dG9IaWRlVGhyZXNob2xkX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM0OSh0aGlzLCBfdGFic0F1dG9IaWRlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0OSh0aGlzLCBfdGFic0F1dG9IaWRlVGhyZXNob2xkX2luaXRpYWxpemVycywgMCkpOwogICAgZ2V0IHRhYnNBdXRvSGlkZVRocmVzaG9sZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RhYnNBdXRvSGlkZVRocmVzaG9sZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRhYnNBdXRvSGlkZVRocmVzaG9sZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdGFic0F1dG9IaWRlVGhyZXNob2xkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdGFiQWN0aW9uc0xlZnRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczQ5KHRoaXMsIF90YWJzQXV0b0hpZGVUaHJlc2hvbGRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczQ5KHRoaXMsIF90YWJBY3Rpb25zTGVmdF9pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgdGFiQWN0aW9uc0xlZnQoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0YWJBY3Rpb25zTGVmdF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRhYkFjdGlvbnNMZWZ0KHZhbHVlMikgewogICAgICB0aGlzLiN0YWJBY3Rpb25zTGVmdF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3RhYkFjdGlvbnNSaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNDkodGhpcywgX3RhYkFjdGlvbnNMZWZ0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM0OSh0aGlzLCBfdGFiQWN0aW9uc1JpZ2h0X2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCB0YWJBY3Rpb25zUmlnaHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0YWJBY3Rpb25zUmlnaHRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0YWJBY3Rpb25zUmlnaHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3RhYkFjdGlvbnNSaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzMzMiLCAiI2ZmZiIpfTsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byAxZnI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMxNjE2MTYiKX07CiAgICAgIH0KCiAgICAgIC5tYWluY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBjb250ZW50czsKICAgICAgfQoKICAgICAgLnRvcGJhciB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDFmcjsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHRyYW5zaXRpb246IGdyaWQtdGVtcGxhdGUtcm93cyAwLjNzIGVhc2U7CiAgICAgIH0KCiAgICAgIC50b3BiYXIgPiAqIHsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICB9CgogICAgICAuY29udGVudC1hcmVhIHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICAgIH0KCiAgICAgIDpob3N0KFtub3RhYnNdKSAudG9wYmFyIHsKICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDBmcjsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJtYWluY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0b3BiYXIiPgogICAgICAgICAgPGRlZXMtYXBwdWktdGFicwogICAgICAgICAgICAudGFicz0ke3RoaXMudGFic30KICAgICAgICAgICAgLnNlbGVjdGVkVGFiPSR7dGhpcy5zZWxlY3RlZFRhYn0KICAgICAgICAgICAgLnNob3dUYWJJbmRpY2F0b3I9JHt0cnVlfQogICAgICAgICAgICAudGFiU3R5bGU9JHsiaG9yaXpvbnRhbCJ9CiAgICAgICAgICAgIC5hdXRvSGlkZT0ke3RoaXMudGFic0F1dG9IaWRlfQogICAgICAgICAgICAuYXV0b0hpZGVUaHJlc2hvbGQ9JHt0aGlzLnRhYnNBdXRvSGlkZVRocmVzaG9sZH0KICAgICAgICAgICAgLmFjdGlvbnNMZWZ0PSR7dGhpcy50YWJBY3Rpb25zTGVmdH0KICAgICAgICAgICAgLmFjdGlvbnNSaWdodD0ke3RoaXMudGFiQWN0aW9uc1JpZ2h0fQogICAgICAgICAgICBAdGFiLXNlbGVjdD0keyhlMTEpID0+IHRoaXMuaGFuZGxlVGFiU2VsZWN0KGUxMSl9CiAgICAgICAgICAgIEB0YWItY2xvc2U9JHsoZTExKSA9PiB0aGlzLmhhbmRsZVRhYkNsb3NlKGUxMSl9CiAgICAgICAgICA+PC9kZWVzLWFwcHVpLXRhYnM+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudC1hcmVhIj4KICAgICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgICAgIDxzbG90IG5hbWU9ImNvbnRlbnQiPjwvc2xvdD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgaGFuZGxlVGFiU2VsZWN0KGUxMSkgewogICAgICB0aGlzLnNlbGVjdGVkVGFiID0gZTExLmRldGFpbC50YWI7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInRhYi1zZWxlY3QiLCB7CiAgICAgICAgZGV0YWlsOiBlMTEuZGV0YWlsLAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgaGFuZGxlVGFiQ2xvc2UoZTExKSB7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInRhYi1jbG9zZSIsIHsKICAgICAgICBkZXRhaWw6IGUxMS5kZXRhaWwsCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJzaG93VGFicyIpKSB7CiAgICAgICAgaWYgKHRoaXMuc2hvd1RhYnMpIHsKICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCJub3RhYnMiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoIm5vdGFicyIsICIiKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgYXdhaXQgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGlmICghdGhpcy5zaG93VGFicykgewogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJub3RhYnMiLCAiIik7CiAgICAgIH0KICAgICAgY29uc3QgdGFic0NvbXBvbmVudCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCJkZWVzLWFwcHVpLXRhYnMiKTsKICAgICAgaWYgKHRhYnNDb21wb25lbnQpIHsKICAgICAgICBhd2FpdCB0YWJzQ29tcG9uZW50LnVwZGF0ZUNvbXBsZXRlOwogICAgICB9CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnM0OSh0aGlzLCBfdGFiQWN0aW9uc1JpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNDkoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNBcHB1aU1haW5jb250ZW50MiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtYXBwdWkvZGVlcy1hcHB1aS9kZWVzLWFwcHVpLmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfZGlzdF90czI5KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTQ5ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM1MCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0FwcHVpID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLWFwcHVpIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfYXBwYmFyTWVudUl0ZW1zX2RlY29yYXRvcnM7CiAgbGV0IF9hcHBiYXJNZW51SXRlbXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hcHBiYXJNZW51SXRlbXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FwcGJhckJyZWFkY3J1bWJzX2RlY29yYXRvcnM7CiAgbGV0IF9hcHBiYXJCcmVhZGNydW1ic19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FwcGJhckJyZWFkY3J1bWJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hcHBiYXJCcmVhZGNydW1iU2VwYXJhdG9yX2RlY29yYXRvcnM7CiAgbGV0IF9hcHBiYXJCcmVhZGNydW1iU2VwYXJhdG9yX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYXBwYmFyQnJlYWRjcnVtYlNlcGFyYXRvcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYXBwYmFyU2hvd1dpbmRvd0NvbnRyb2xzX2RlY29yYXRvcnM7CiAgbGV0IF9hcHBiYXJTaG93V2luZG93Q29udHJvbHNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hcHBiYXJTaG93V2luZG93Q29udHJvbHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FwcGJhclVzZXJfZGVjb3JhdG9yczsKICBsZXQgX2FwcGJhclVzZXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hcHBiYXJVc2VyX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hcHBiYXJQcm9maWxlTWVudUl0ZW1zX2RlY29yYXRvcnM7CiAgbGV0IF9hcHBiYXJQcm9maWxlTWVudUl0ZW1zX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYXBwYmFyUHJvZmlsZU1lbnVJdGVtc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYXBwYmFyU2hvd1NlYXJjaF9kZWNvcmF0b3JzOwogIGxldCBfYXBwYmFyU2hvd1NlYXJjaF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FwcGJhclNob3dTZWFyY2hfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21haW5tZW51TG9nb0ljb25fZGVjb3JhdG9yczsKICBsZXQgX21haW5tZW51TG9nb0ljb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYWlubWVudUxvZ29JY29uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYWlubWVudUxvZ29UZXh0X2RlY29yYXRvcnM7CiAgbGV0IF9tYWlubWVudUxvZ29UZXh0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbm1lbnVMb2dvVGV4dF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbm1lbnVHcm91cHNfZGVjb3JhdG9yczsKICBsZXQgX21haW5tZW51R3JvdXBzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbm1lbnVHcm91cHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21haW5tZW51Qm90dG9tVGFic19kZWNvcmF0b3JzOwogIGxldCBfbWFpbm1lbnVCb3R0b21UYWJzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbm1lbnVCb3R0b21UYWJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYWlubWVudVRhYnNfZGVjb3JhdG9yczsKICBsZXQgX21haW5tZW51VGFic19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21haW5tZW51VGFic19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbm1lbnVTZWxlY3RlZFRhYl9kZWNvcmF0b3JzOwogIGxldCBfbWFpbm1lbnVTZWxlY3RlZFRhYl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21haW5tZW51U2VsZWN0ZWRUYWJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlY29uZGFyeW1lbnVIZWFkaW5nX2RlY29yYXRvcnM7CiAgbGV0IF9zZWNvbmRhcnltZW51SGVhZGluZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlY29uZGFyeW1lbnVIZWFkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWNvbmRhcnltZW51R3JvdXBzX2RlY29yYXRvcnM7CiAgbGV0IF9zZWNvbmRhcnltZW51R3JvdXBzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2Vjb25kYXJ5bWVudUdyb3Vwc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2Vjb25kYXJ5bWVudVNlbGVjdGVkSXRlbV9kZWNvcmF0b3JzOwogIGxldCBfc2Vjb25kYXJ5bWVudVNlbGVjdGVkSXRlbV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlY29uZGFyeW1lbnVTZWxlY3RlZEl0ZW1fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21haW5tZW51Q29sbGFwc2VkX2RlY29yYXRvcnM7CiAgbGV0IF9tYWlubWVudUNvbGxhcHNlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21haW5tZW51Q29sbGFwc2VkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWNvbmRhcnltZW51Q29sbGFwc2VkX2RlY29yYXRvcnM7CiAgbGV0IF9zZWNvbmRhcnltZW51Q29sbGFwc2VkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2Vjb25kYXJ5bWVudUNvbGxhcHNlZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbm1lbnVWaXNpYmxlX2RlY29yYXRvcnM7CiAgbGV0IF9tYWlubWVudVZpc2libGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYWlubWVudVZpc2libGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlY29uZGFyeW1lbnVWaXNpYmxlX2RlY29yYXRvcnM7CiAgbGV0IF9zZWNvbmRhcnltZW51VmlzaWJsZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlY29uZGFyeW1lbnVWaXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYWluY29udGVudFRhYnNWaXNpYmxlX2RlY29yYXRvcnM7CiAgbGV0IF9tYWluY29udGVudFRhYnNWaXNpYmxlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbmNvbnRlbnRUYWJzVmlzaWJsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29udGVudFRhYnNBdXRvSGlkZV9kZWNvcmF0b3JzOwogIGxldCBfY29udGVudFRhYnNBdXRvSGlkZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRlbnRUYWJzQXV0b0hpZGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRlbnRUYWJzQXV0b0hpZGVUaHJlc2hvbGRfZGVjb3JhdG9yczsKICBsZXQgX2NvbnRlbnRUYWJzQXV0b0hpZGVUaHJlc2hvbGRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZW50VGFic0F1dG9IaWRlVGhyZXNob2xkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY3Rpdml0eUxvZ1Zpc2libGVfZGVjb3JhdG9yczsKICBsZXQgX2FjdGl2aXR5TG9nVmlzaWJsZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FjdGl2aXR5TG9nVmlzaWJsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWN0aXZpdHlMb2dDb3VudF9kZWNvcmF0b3JzOwogIGxldCBfYWN0aXZpdHlMb2dDb3VudF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FjdGl2aXR5TG9nQ291bnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21haW5jb250ZW50VGFic19kZWNvcmF0b3JzOwogIGxldCBfbWFpbmNvbnRlbnRUYWJzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbmNvbnRlbnRUYWJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYWluY29udGVudFNlbGVjdGVkVGFiX2RlY29yYXRvcnM7CiAgbGV0IF9tYWluY29udGVudFNlbGVjdGVkVGFiX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbmNvbnRlbnRTZWxlY3RlZFRhYl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29udGVudFRhYkFjdGlvbnNMZWZ0X2RlY29yYXRvcnM7CiAgbGV0IF9jb250ZW50VGFiQWN0aW9uc0xlZnRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZW50VGFiQWN0aW9uc0xlZnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRlbnRUYWJBY3Rpb25zUmlnaHRfZGVjb3JhdG9yczsKICBsZXQgX2NvbnRlbnRUYWJBY3Rpb25zUmlnaHRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZW50VGFiQWN0aW9uc1JpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hcHBiYXJfZGVjb3JhdG9yczsKICBsZXQgX2FwcGJhcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FwcGJhcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbm1lbnVfZGVjb3JhdG9yczsKICBsZXQgX21haW5tZW51X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFpbm1lbnVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlY29uZGFyeW1lbnVfZGVjb3JhdG9yczsKICBsZXQgX3NlY29uZGFyeW1lbnVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWNvbmRhcnltZW51X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYWluY29udGVudF9kZWNvcmF0b3JzOwogIGxldCBfbWFpbmNvbnRlbnRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYWluY29udGVudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWN0aXZpdHlsb2dFbGVtZW50X2RlY29yYXRvcnM7CiAgbGV0IF9hY3Rpdml0eWxvZ0VsZW1lbnRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY3Rpdml0eWxvZ0VsZW1lbnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2JvdHRvbWJhckVsZW1lbnRfZGVjb3JhdG9yczsKICBsZXQgX2JvdHRvbWJhckVsZW1lbnRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ib3R0b21iYXJFbGVtZW50X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ib3R0b21iYXJWaXNpYmxlX2RlY29yYXRvcnM7CiAgbGV0IF9ib3R0b21iYXJWaXNpYmxlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYm90dG9tYmFyVmlzaWJsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VycmVudFZpZXdfZGVjb3JhdG9yczsKICBsZXQgX2N1cnJlbnRWaWV3X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VycmVudFZpZXdfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0FwcHVpMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2FwcGJhck1lbnVJdGVtc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfYXBwYmFyQnJlYWRjcnVtYnNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9hcHBiYXJCcmVhZGNydW1iU2VwYXJhdG9yX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfYXBwYmFyU2hvd1dpbmRvd0NvbnRyb2xzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2FwcGJhclVzZXJfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF9hcHBiYXJQcm9maWxlTWVudUl0ZW1zX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF9hcHBiYXJTaG93U2VhcmNoX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX21haW5tZW51TG9nb0ljb25fZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9tYWlubWVudUxvZ29UZXh0X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfbWFpbm1lbnVHcm91cHNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX21haW5tZW51Qm90dG9tVGFic19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfbWFpbm1lbnVUYWJzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF9tYWlubWVudVNlbGVjdGVkVGFiX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBPYmplY3QgfSldOwogICAgICBfc2Vjb25kYXJ5bWVudUhlYWRpbmdfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9zZWNvbmRhcnltZW51R3JvdXBzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF9zZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBPYmplY3QgfSldOwogICAgICBfbWFpbm1lbnVDb2xsYXBzZWRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfc2Vjb25kYXJ5bWVudUNvbGxhcHNlZF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9tYWlubWVudVZpc2libGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfc2Vjb25kYXJ5bWVudVZpc2libGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfbWFpbmNvbnRlbnRUYWJzVmlzaWJsZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9jb250ZW50VGFic0F1dG9IaWRlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2NvbnRlbnRUYWJzQXV0b0hpZGVUaHJlc2hvbGRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF9hY3Rpdml0eUxvZ1Zpc2libGVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2FjdGl2aXR5TG9nQ291bnRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX21haW5jb250ZW50VGFic19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfbWFpbmNvbnRlbnRTZWxlY3RlZFRhYl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogT2JqZWN0IH0pXTsKICAgICAgX2NvbnRlbnRUYWJBY3Rpb25zTGVmdF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfY29udGVudFRhYkFjdGlvbnNSaWdodF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfYXBwYmFyX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9tYWlubWVudV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfc2Vjb25kYXJ5bWVudV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfbWFpbmNvbnRlbnRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2FjdGl2aXR5bG9nRWxlbWVudF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfYm90dG9tYmFyRWxlbWVudF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfYm90dG9tYmFyVmlzaWJsZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfY3VycmVudFZpZXdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlNDkodGhpcywgbnVsbCwgX2FwcGJhck1lbnVJdGVtc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhcHBiYXJNZW51SXRlbXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFwcGJhck1lbnVJdGVtcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hcHBiYXJNZW51SXRlbXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFwcGJhck1lbnVJdGVtcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hcHBiYXJNZW51SXRlbXNfaW5pdGlhbGl6ZXJzLCBfYXBwYmFyTWVudUl0ZW1zX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDkodGhpcywgbnVsbCwgX2FwcGJhckJyZWFkY3J1bWJzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFwcGJhckJyZWFkY3J1bWJzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhcHBiYXJCcmVhZGNydW1icyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hcHBiYXJCcmVhZGNydW1icywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYXBwYmFyQnJlYWRjcnVtYnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYXBwYmFyQnJlYWRjcnVtYnNfaW5pdGlhbGl6ZXJzLCBfYXBwYmFyQnJlYWRjcnVtYnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0OSh0aGlzLCBudWxsLCBfYXBwYmFyQnJlYWRjcnVtYlNlcGFyYXRvcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhcHBiYXJCcmVhZGNydW1iU2VwYXJhdG9yIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhcHBiYXJCcmVhZGNydW1iU2VwYXJhdG9yIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmFwcGJhckJyZWFkY3J1bWJTZXBhcmF0b3IsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFwcGJhckJyZWFkY3J1bWJTZXBhcmF0b3IgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYXBwYmFyQnJlYWRjcnVtYlNlcGFyYXRvcl9pbml0aWFsaXplcnMsIF9hcHBiYXJCcmVhZGNydW1iU2VwYXJhdG9yX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDkodGhpcywgbnVsbCwgX2FwcGJhclNob3dXaW5kb3dDb250cm9sc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhcHBiYXJTaG93V2luZG93Q29udHJvbHMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFwcGJhclNob3dXaW5kb3dDb250cm9scyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hcHBiYXJTaG93V2luZG93Q29udHJvbHMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFwcGJhclNob3dXaW5kb3dDb250cm9scyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hcHBiYXJTaG93V2luZG93Q29udHJvbHNfaW5pdGlhbGl6ZXJzLCBfYXBwYmFyU2hvd1dpbmRvd0NvbnRyb2xzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDkodGhpcywgbnVsbCwgX2FwcGJhclVzZXJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYXBwYmFyVXNlciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYXBwYmFyVXNlciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hcHBiYXJVc2VyLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hcHBiYXJVc2VyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FwcGJhclVzZXJfaW5pdGlhbGl6ZXJzLCBfYXBwYmFyVXNlcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ5KHRoaXMsIG51bGwsIF9hcHBiYXJQcm9maWxlTWVudUl0ZW1zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFwcGJhclByb2ZpbGVNZW51SXRlbXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFwcGJhclByb2ZpbGVNZW51SXRlbXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYXBwYmFyUHJvZmlsZU1lbnVJdGVtcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYXBwYmFyUHJvZmlsZU1lbnVJdGVtcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hcHBiYXJQcm9maWxlTWVudUl0ZW1zX2luaXRpYWxpemVycywgX2FwcGJhclByb2ZpbGVNZW51SXRlbXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0OSh0aGlzLCBudWxsLCBfYXBwYmFyU2hvd1NlYXJjaF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhcHBiYXJTaG93U2VhcmNoIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhcHBiYXJTaG93U2VhcmNoIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmFwcGJhclNob3dTZWFyY2gsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFwcGJhclNob3dTZWFyY2ggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYXBwYmFyU2hvd1NlYXJjaF9pbml0aWFsaXplcnMsIF9hcHBiYXJTaG93U2VhcmNoX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDkodGhpcywgbnVsbCwgX21haW5tZW51TG9nb0ljb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWFpbm1lbnVMb2dvSWNvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWFpbm1lbnVMb2dvSWNvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYWlubWVudUxvZ29JY29uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tYWlubWVudUxvZ29JY29uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21haW5tZW51TG9nb0ljb25faW5pdGlhbGl6ZXJzLCBfbWFpbm1lbnVMb2dvSWNvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ5KHRoaXMsIG51bGwsIF9tYWlubWVudUxvZ29UZXh0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1haW5tZW51TG9nb1RleHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1haW5tZW51TG9nb1RleHQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWFpbm1lbnVMb2dvVGV4dCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWFpbm1lbnVMb2dvVGV4dCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tYWlubWVudUxvZ29UZXh0X2luaXRpYWxpemVycywgX21haW5tZW51TG9nb1RleHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0OSh0aGlzLCBudWxsLCBfbWFpbm1lbnVHcm91cHNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWFpbm1lbnVHcm91cHMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1haW5tZW51R3JvdXBzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1haW5tZW51R3JvdXBzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tYWlubWVudUdyb3VwcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tYWlubWVudUdyb3Vwc19pbml0aWFsaXplcnMsIF9tYWlubWVudUdyb3Vwc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ5KHRoaXMsIG51bGwsIF9tYWlubWVudUJvdHRvbVRhYnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWFpbm1lbnVCb3R0b21UYWJzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtYWlubWVudUJvdHRvbVRhYnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWFpbm1lbnVCb3R0b21UYWJzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tYWlubWVudUJvdHRvbVRhYnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWFpbm1lbnVCb3R0b21UYWJzX2luaXRpYWxpemVycywgX21haW5tZW51Qm90dG9tVGFic19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ5KHRoaXMsIG51bGwsIF9tYWlubWVudVRhYnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWFpbm1lbnVUYWJzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtYWlubWVudVRhYnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWFpbm1lbnVUYWJzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tYWlubWVudVRhYnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWFpbm1lbnVUYWJzX2luaXRpYWxpemVycywgX21haW5tZW51VGFic19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ5KHRoaXMsIG51bGwsIF9tYWlubWVudVNlbGVjdGVkVGFiX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1haW5tZW51U2VsZWN0ZWRUYWIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1haW5tZW51U2VsZWN0ZWRUYWIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWFpbm1lbnVTZWxlY3RlZFRhYiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWFpbm1lbnVTZWxlY3RlZFRhYiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tYWlubWVudVNlbGVjdGVkVGFiX2luaXRpYWxpemVycywgX21haW5tZW51U2VsZWN0ZWRUYWJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0OSh0aGlzLCBudWxsLCBfc2Vjb25kYXJ5bWVudUhlYWRpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2Vjb25kYXJ5bWVudUhlYWRpbmciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlY29uZGFyeW1lbnVIZWFkaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlY29uZGFyeW1lbnVIZWFkaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWNvbmRhcnltZW51SGVhZGluZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWNvbmRhcnltZW51SGVhZGluZ19pbml0aWFsaXplcnMsIF9zZWNvbmRhcnltZW51SGVhZGluZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ5KHRoaXMsIG51bGwsIF9zZWNvbmRhcnltZW51R3JvdXBzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlY29uZGFyeW1lbnVHcm91cHMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlY29uZGFyeW1lbnVHcm91cHMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2Vjb25kYXJ5bWVudUdyb3Vwcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2Vjb25kYXJ5bWVudUdyb3VwcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWNvbmRhcnltZW51R3JvdXBzX2luaXRpYWxpemVycywgX3NlY29uZGFyeW1lbnVHcm91cHNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0OSh0aGlzLCBudWxsLCBfc2Vjb25kYXJ5bWVudVNlbGVjdGVkSXRlbV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlY29uZGFyeW1lbnVTZWxlY3RlZEl0ZW0sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlY29uZGFyeW1lbnVTZWxlY3RlZEl0ZW0gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2Vjb25kYXJ5bWVudVNlbGVjdGVkSXRlbV9pbml0aWFsaXplcnMsIF9zZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDkodGhpcywgbnVsbCwgX21haW5tZW51Q29sbGFwc2VkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1haW5tZW51Q29sbGFwc2VkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtYWlubWVudUNvbGxhcHNlZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYWlubWVudUNvbGxhcHNlZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubWFpbm1lbnVDb2xsYXBzZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWFpbm1lbnVDb2xsYXBzZWRfaW5pdGlhbGl6ZXJzLCBfbWFpbm1lbnVDb2xsYXBzZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0OSh0aGlzLCBudWxsLCBfc2Vjb25kYXJ5bWVudUNvbGxhcHNlZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWNvbmRhcnltZW51Q29sbGFwc2VkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWNvbmRhcnltZW51Q29sbGFwc2VkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlY29uZGFyeW1lbnVDb2xsYXBzZWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlY29uZGFyeW1lbnVDb2xsYXBzZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2Vjb25kYXJ5bWVudUNvbGxhcHNlZF9pbml0aWFsaXplcnMsIF9zZWNvbmRhcnltZW51Q29sbGFwc2VkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDkodGhpcywgbnVsbCwgX21haW5tZW51VmlzaWJsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtYWlubWVudVZpc2libGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1haW5tZW51VmlzaWJsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYWlubWVudVZpc2libGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1haW5tZW51VmlzaWJsZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tYWlubWVudVZpc2libGVfaW5pdGlhbGl6ZXJzLCBfbWFpbm1lbnVWaXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDkodGhpcywgbnVsbCwgX3NlY29uZGFyeW1lbnVWaXNpYmxlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlY29uZGFyeW1lbnVWaXNpYmxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWNvbmRhcnltZW51VmlzaWJsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWNvbmRhcnltZW51VmlzaWJsZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2Vjb25kYXJ5bWVudVZpc2libGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2Vjb25kYXJ5bWVudVZpc2libGVfaW5pdGlhbGl6ZXJzLCBfc2Vjb25kYXJ5bWVudVZpc2libGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0OSh0aGlzLCBudWxsLCBfbWFpbmNvbnRlbnRUYWJzVmlzaWJsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtYWluY29udGVudFRhYnNWaXNpYmxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtYWluY29udGVudFRhYnNWaXNpYmxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1haW5jb250ZW50VGFic1Zpc2libGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1haW5jb250ZW50VGFic1Zpc2libGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWFpbmNvbnRlbnRUYWJzVmlzaWJsZV9pbml0aWFsaXplcnMsIF9tYWluY29udGVudFRhYnNWaXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDkodGhpcywgbnVsbCwgX2NvbnRlbnRUYWJzQXV0b0hpZGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29udGVudFRhYnNBdXRvSGlkZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29udGVudFRhYnNBdXRvSGlkZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jb250ZW50VGFic0F1dG9IaWRlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jb250ZW50VGFic0F1dG9IaWRlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbnRlbnRUYWJzQXV0b0hpZGVfaW5pdGlhbGl6ZXJzLCBfY29udGVudFRhYnNBdXRvSGlkZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ5KHRoaXMsIG51bGwsIF9jb250ZW50VGFic0F1dG9IaWRlVGhyZXNob2xkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNvbnRlbnRUYWJzQXV0b0hpZGVUaHJlc2hvbGQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNvbnRlbnRUYWJzQXV0b0hpZGVUaHJlc2hvbGQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29udGVudFRhYnNBdXRvSGlkZVRocmVzaG9sZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY29udGVudFRhYnNBdXRvSGlkZVRocmVzaG9sZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jb250ZW50VGFic0F1dG9IaWRlVGhyZXNob2xkX2luaXRpYWxpemVycywgX2NvbnRlbnRUYWJzQXV0b0hpZGVUaHJlc2hvbGRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0OSh0aGlzLCBudWxsLCBfYWN0aXZpdHlMb2dWaXNpYmxlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFjdGl2aXR5TG9nVmlzaWJsZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYWN0aXZpdHlMb2dWaXNpYmxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmFjdGl2aXR5TG9nVmlzaWJsZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYWN0aXZpdHlMb2dWaXNpYmxlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FjdGl2aXR5TG9nVmlzaWJsZV9pbml0aWFsaXplcnMsIF9hY3Rpdml0eUxvZ1Zpc2libGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0OSh0aGlzLCBudWxsLCBfYWN0aXZpdHlMb2dDb3VudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhY3Rpdml0eUxvZ0NvdW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhY3Rpdml0eUxvZ0NvdW50IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmFjdGl2aXR5TG9nQ291bnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFjdGl2aXR5TG9nQ291bnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYWN0aXZpdHlMb2dDb3VudF9pbml0aWFsaXplcnMsIF9hY3Rpdml0eUxvZ0NvdW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDkodGhpcywgbnVsbCwgX21haW5jb250ZW50VGFic19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtYWluY29udGVudFRhYnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1haW5jb250ZW50VGFicyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYWluY29udGVudFRhYnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1haW5jb250ZW50VGFicyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tYWluY29udGVudFRhYnNfaW5pdGlhbGl6ZXJzLCBfbWFpbmNvbnRlbnRUYWJzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDkodGhpcywgbnVsbCwgX21haW5jb250ZW50U2VsZWN0ZWRUYWJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWFpbmNvbnRlbnRTZWxlY3RlZFRhYiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWFpbmNvbnRlbnRTZWxlY3RlZFRhYiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYWluY29udGVudFNlbGVjdGVkVGFiLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tYWluY29udGVudFNlbGVjdGVkVGFiID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21haW5jb250ZW50U2VsZWN0ZWRUYWJfaW5pdGlhbGl6ZXJzLCBfbWFpbmNvbnRlbnRTZWxlY3RlZFRhYl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ5KHRoaXMsIG51bGwsIF9jb250ZW50VGFiQWN0aW9uc0xlZnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29udGVudFRhYkFjdGlvbnNMZWZ0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb250ZW50VGFiQWN0aW9uc0xlZnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29udGVudFRhYkFjdGlvbnNMZWZ0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jb250ZW50VGFiQWN0aW9uc0xlZnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29udGVudFRhYkFjdGlvbnNMZWZ0X2luaXRpYWxpemVycywgX2NvbnRlbnRUYWJBY3Rpb25zTGVmdF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ5KHRoaXMsIG51bGwsIF9jb250ZW50VGFiQWN0aW9uc1JpZ2h0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNvbnRlbnRUYWJBY3Rpb25zUmlnaHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNvbnRlbnRUYWJBY3Rpb25zUmlnaHQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29udGVudFRhYkFjdGlvbnNSaWdodCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY29udGVudFRhYkFjdGlvbnNSaWdodCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jb250ZW50VGFiQWN0aW9uc1JpZ2h0X2luaXRpYWxpemVycywgX2NvbnRlbnRUYWJBY3Rpb25zUmlnaHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0OSh0aGlzLCBudWxsLCBfYXBwYmFyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFwcGJhciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYXBwYmFyIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmFwcGJhciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYXBwYmFyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FwcGJhcl9pbml0aWFsaXplcnMsIF9hcHBiYXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0OSh0aGlzLCBudWxsLCBfbWFpbm1lbnVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWFpbm1lbnUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1haW5tZW51IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1haW5tZW51LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tYWlubWVudSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tYWlubWVudV9pbml0aWFsaXplcnMsIF9tYWlubWVudV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ5KHRoaXMsIG51bGwsIF9zZWNvbmRhcnltZW51X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlY29uZGFyeW1lbnUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlY29uZGFyeW1lbnUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2Vjb25kYXJ5bWVudSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2Vjb25kYXJ5bWVudSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWNvbmRhcnltZW51X2luaXRpYWxpemVycywgX3NlY29uZGFyeW1lbnVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0OSh0aGlzLCBudWxsLCBfbWFpbmNvbnRlbnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWFpbmNvbnRlbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1haW5jb250ZW50IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1haW5jb250ZW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tYWluY29udGVudCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tYWluY29udGVudF9pbml0aWFsaXplcnMsIF9tYWluY29udGVudF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ5KHRoaXMsIG51bGwsIF9hY3Rpdml0eWxvZ0VsZW1lbnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYWN0aXZpdHlsb2dFbGVtZW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhY3Rpdml0eWxvZ0VsZW1lbnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWN0aXZpdHlsb2dFbGVtZW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hY3Rpdml0eWxvZ0VsZW1lbnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYWN0aXZpdHlsb2dFbGVtZW50X2luaXRpYWxpemVycywgX2FjdGl2aXR5bG9nRWxlbWVudF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTQ5KHRoaXMsIG51bGwsIF9ib3R0b21iYXJFbGVtZW50X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImJvdHRvbWJhckVsZW1lbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImJvdHRvbWJhckVsZW1lbnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYm90dG9tYmFyRWxlbWVudCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYm90dG9tYmFyRWxlbWVudCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9ib3R0b21iYXJFbGVtZW50X2luaXRpYWxpemVycywgX2JvdHRvbWJhckVsZW1lbnRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0OSh0aGlzLCBudWxsLCBfYm90dG9tYmFyVmlzaWJsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJib3R0b21iYXJWaXNpYmxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJib3R0b21iYXJWaXNpYmxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmJvdHRvbWJhclZpc2libGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmJvdHRvbWJhclZpc2libGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYm90dG9tYmFyVmlzaWJsZV9pbml0aWFsaXplcnMsIF9ib3R0b21iYXJWaXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNDkodGhpcywgbnVsbCwgX2N1cnJlbnRWaWV3X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImN1cnJlbnRWaWV3Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjdXJyZW50VmlldyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jdXJyZW50Vmlldywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY3VycmVudFZpZXcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY3VycmVudFZpZXdfaW5pdGlhbGl6ZXJzLCBfY3VycmVudFZpZXdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU0OShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNBcHB1aTIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzMxOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkFwcCBVSSJdOwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBSRUFDVElWRSBPQlNFUlZBQkxFUyAoUnhKUyBTdWJqZWN0cykKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLyoqIE9ic2VydmFibGUgc3RyZWFtIG9mIHZpZXcgbGlmZWN5Y2xlIGV2ZW50cyAqLwogICAgdmlld0xpZmVjeWNsZSQgPSBuZXcgZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzLnNtYXJ0cngucnhqcy5TdWJqZWN0KCk7CiAgICAvKiogT2JzZXJ2YWJsZSBzdHJlYW0gb2YgdmlldyBjaGFuZ2UgZXZlbnRzICovCiAgICB2aWV3Q2hhbmdlZCQgPSBuZXcgZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzLnNtYXJ0cngucnhqcy5TdWJqZWN0KCk7CiAgICAjYXBwYmFyTWVudUl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9hcHBiYXJNZW51SXRlbXNfaW5pdGlhbGl6ZXJzLCBbXSk7CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIElOVEVSTkFMIFBST1BFUlRJRVMgKFByb3BlcnRpZXMgZm9yIGNoaWxkIGNvbXBvbmVudHMpCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByb3BlcnRpZXMgZm9yIGFwcGJhcgogICAgZ2V0IGFwcGJhck1lbnVJdGVtcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FwcGJhck1lbnVJdGVtc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFwcGJhck1lbnVJdGVtcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYXBwYmFyTWVudUl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYXBwYmFyQnJlYWRjcnVtYnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9hcHBiYXJNZW51SXRlbXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9hcHBiYXJCcmVhZGNydW1ic19pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgYXBwYmFyQnJlYWRjcnVtYnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhcHBiYXJCcmVhZGNydW1ic19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFwcGJhckJyZWFkY3J1bWJzKHZhbHVlMikgewogICAgICB0aGlzLiNhcHBiYXJCcmVhZGNydW1ic19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2FwcGJhckJyZWFkY3J1bWJTZXBhcmF0b3JfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9hcHBiYXJCcmVhZGNydW1ic19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX2FwcGJhckJyZWFkY3J1bWJTZXBhcmF0b3JfaW5pdGlhbGl6ZXJzLCAiID4gIikpOwogICAgZ2V0IGFwcGJhckJyZWFkY3J1bWJTZXBhcmF0b3IoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhcHBiYXJCcmVhZGNydW1iU2VwYXJhdG9yX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYXBwYmFyQnJlYWRjcnVtYlNlcGFyYXRvcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jYXBwYmFyQnJlYWRjcnVtYlNlcGFyYXRvcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2FwcGJhclNob3dXaW5kb3dDb250cm9sc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX2FwcGJhckJyZWFkY3J1bWJTZXBhcmF0b3JfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9hcHBiYXJTaG93V2luZG93Q29udHJvbHNfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgYXBwYmFyU2hvd1dpbmRvd0NvbnRyb2xzKCkgewogICAgICByZXR1cm4gdGhpcy4jYXBwYmFyU2hvd1dpbmRvd0NvbnRyb2xzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYXBwYmFyU2hvd1dpbmRvd0NvbnRyb2xzKHZhbHVlMikgewogICAgICB0aGlzLiNhcHBiYXJTaG93V2luZG93Q29udHJvbHNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhcHBiYXJVc2VyX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfYXBwYmFyU2hvd1dpbmRvd0NvbnRyb2xzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfYXBwYmFyVXNlcl9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgZ2V0IGFwcGJhclVzZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhcHBiYXJVc2VyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYXBwYmFyVXNlcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jYXBwYmFyVXNlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2FwcGJhclByb2ZpbGVNZW51SXRlbXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9hcHBiYXJVc2VyX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfYXBwYmFyUHJvZmlsZU1lbnVJdGVtc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgYXBwYmFyUHJvZmlsZU1lbnVJdGVtcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FwcGJhclByb2ZpbGVNZW51SXRlbXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhcHBiYXJQcm9maWxlTWVudUl0ZW1zKHZhbHVlMikgewogICAgICB0aGlzLiNhcHBiYXJQcm9maWxlTWVudUl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYXBwYmFyU2hvd1NlYXJjaF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX2FwcGJhclByb2ZpbGVNZW51SXRlbXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9hcHBiYXJTaG93U2VhcmNoX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBhcHBiYXJTaG93U2VhcmNoKCkgewogICAgICByZXR1cm4gdGhpcy4jYXBwYmFyU2hvd1NlYXJjaF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFwcGJhclNob3dTZWFyY2godmFsdWUyKSB7CiAgICAgIHRoaXMuI2FwcGJhclNob3dTZWFyY2hfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtYWlubWVudUxvZ29JY29uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfYXBwYmFyU2hvd1NlYXJjaF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX21haW5tZW51TG9nb0ljb25faW5pdGlhbGl6ZXJzLCAiIikpOwogICAgLy8gUHJvcGVydGllcyBmb3IgbWFpbm1lbnUKICAgIGdldCBtYWlubWVudUxvZ29JY29uKCkgewogICAgICByZXR1cm4gdGhpcy4jbWFpbm1lbnVMb2dvSWNvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1haW5tZW51TG9nb0ljb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI21haW5tZW51TG9nb0ljb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtYWlubWVudUxvZ29UZXh0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfbWFpbm1lbnVMb2dvSWNvbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX21haW5tZW51TG9nb1RleHRfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IG1haW5tZW51TG9nb1RleHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtYWlubWVudUxvZ29UZXh0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWFpbm1lbnVMb2dvVGV4dCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWFpbm1lbnVMb2dvVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21haW5tZW51R3JvdXBzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfbWFpbm1lbnVMb2dvVGV4dF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX21haW5tZW51R3JvdXBzX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBtYWlubWVudUdyb3VwcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI21haW5tZW51R3JvdXBzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWFpbm1lbnVHcm91cHModmFsdWUyKSB7CiAgICAgIHRoaXMuI21haW5tZW51R3JvdXBzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWFpbm1lbnVCb3R0b21UYWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfbWFpbm1lbnVHcm91cHNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9tYWlubWVudUJvdHRvbVRhYnNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IG1haW5tZW51Qm90dG9tVGFicygpIHsKICAgICAgcmV0dXJuIHRoaXMuI21haW5tZW51Qm90dG9tVGFic19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1haW5tZW51Qm90dG9tVGFicyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWFpbm1lbnVCb3R0b21UYWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWFpbm1lbnVUYWJzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfbWFpbm1lbnVCb3R0b21UYWJzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfbWFpbm1lbnVUYWJzX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBtYWlubWVudVRhYnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtYWlubWVudVRhYnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtYWlubWVudVRhYnModmFsdWUyKSB7CiAgICAgIHRoaXMuI21haW5tZW51VGFic19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21haW5tZW51U2VsZWN0ZWRUYWJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9tYWlubWVudVRhYnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9tYWlubWVudVNlbGVjdGVkVGFiX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgbWFpbm1lbnVTZWxlY3RlZFRhYigpIHsKICAgICAgcmV0dXJuIHRoaXMuI21haW5tZW51U2VsZWN0ZWRUYWJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtYWlubWVudVNlbGVjdGVkVGFiKHZhbHVlMikgewogICAgICB0aGlzLiNtYWlubWVudVNlbGVjdGVkVGFiX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2Vjb25kYXJ5bWVudUhlYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9tYWlubWVudVNlbGVjdGVkVGFiX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfc2Vjb25kYXJ5bWVudUhlYWRpbmdfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgLy8gUHJvcGVydGllcyBmb3Igc2Vjb25kYXJ5bWVudQogICAgZ2V0IHNlY29uZGFyeW1lbnVIZWFkaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jc2Vjb25kYXJ5bWVudUhlYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWNvbmRhcnltZW51SGVhZGluZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2Vjb25kYXJ5bWVudUhlYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWNvbmRhcnltZW51R3JvdXBzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfc2Vjb25kYXJ5bWVudUhlYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9zZWNvbmRhcnltZW51R3JvdXBzX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBzZWNvbmRhcnltZW51R3JvdXBzKCkgewogICAgICByZXR1cm4gdGhpcy4jc2Vjb25kYXJ5bWVudUdyb3Vwc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNlY29uZGFyeW1lbnVHcm91cHModmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlY29uZGFyeW1lbnVHcm91cHNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfc2Vjb25kYXJ5bWVudUdyb3Vwc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX3NlY29uZGFyeW1lbnVTZWxlY3RlZEl0ZW1faW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBzZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtKCkgewogICAgICByZXR1cm4gdGhpcy4jc2Vjb25kYXJ5bWVudVNlbGVjdGVkSXRlbV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNlY29uZGFyeW1lbnVTZWxlY3RlZEl0ZW0odmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlY29uZGFyeW1lbnVTZWxlY3RlZEl0ZW1fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtYWlubWVudUNvbGxhcHNlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX3NlY29uZGFyeW1lbnVTZWxlY3RlZEl0ZW1fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9tYWlubWVudUNvbGxhcHNlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICAvLyBDb2xsYXBzZSBzdGF0ZXMKICAgIGdldCBtYWlubWVudUNvbGxhcHNlZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21haW5tZW51Q29sbGFwc2VkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWFpbm1lbnVDb2xsYXBzZWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI21haW5tZW51Q29sbGFwc2VkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2Vjb25kYXJ5bWVudUNvbGxhcHNlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX21haW5tZW51Q29sbGFwc2VkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfc2Vjb25kYXJ5bWVudUNvbGxhcHNlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgc2Vjb25kYXJ5bWVudUNvbGxhcHNlZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlY29uZGFyeW1lbnVDb2xsYXBzZWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWNvbmRhcnltZW51Q29sbGFwc2VkKHZhbHVlMikgewogICAgICB0aGlzLiNzZWNvbmRhcnltZW51Q29sbGFwc2VkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWFpbm1lbnVWaXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfc2Vjb25kYXJ5bWVudUNvbGxhcHNlZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX21haW5tZW51VmlzaWJsZV9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIC8vIFZpc2liaWxpdHkgc3RhdGVzCiAgICBnZXQgbWFpbm1lbnVWaXNpYmxlKCkgewogICAgICByZXR1cm4gdGhpcy4jbWFpbm1lbnVWaXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWFpbm1lbnVWaXNpYmxlKHZhbHVlMikgewogICAgICB0aGlzLiNtYWlubWVudVZpc2libGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWNvbmRhcnltZW51VmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX21haW5tZW51VmlzaWJsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX3NlY29uZGFyeW1lbnVWaXNpYmxlX2luaXRpYWxpemVycywgdHJ1ZSkpOwogICAgZ2V0IHNlY29uZGFyeW1lbnVWaXNpYmxlKCkgewogICAgICByZXR1cm4gdGhpcy4jc2Vjb25kYXJ5bWVudVZpc2libGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWNvbmRhcnltZW51VmlzaWJsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2Vjb25kYXJ5bWVudVZpc2libGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtYWluY29udGVudFRhYnNWaXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfc2Vjb25kYXJ5bWVudVZpc2libGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9tYWluY29udGVudFRhYnNWaXNpYmxlX2luaXRpYWxpemVycywgdHJ1ZSkpOwogICAgZ2V0IG1haW5jb250ZW50VGFic1Zpc2libGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtYWluY29udGVudFRhYnNWaXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWFpbmNvbnRlbnRUYWJzVmlzaWJsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWFpbmNvbnRlbnRUYWJzVmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NvbnRlbnRUYWJzQXV0b0hpZGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9tYWluY29udGVudFRhYnNWaXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfY29udGVudFRhYnNBdXRvSGlkZV9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgY29udGVudFRhYnNBdXRvSGlkZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvbnRlbnRUYWJzQXV0b0hpZGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjb250ZW50VGFic0F1dG9IaWRlKHZhbHVlMikgewogICAgICB0aGlzLiNjb250ZW50VGFic0F1dG9IaWRlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29udGVudFRhYnNBdXRvSGlkZVRocmVzaG9sZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX2NvbnRlbnRUYWJzQXV0b0hpZGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9jb250ZW50VGFic0F1dG9IaWRlVGhyZXNob2xkX2luaXRpYWxpemVycywgMCkpOwogICAgZ2V0IGNvbnRlbnRUYWJzQXV0b0hpZGVUaHJlc2hvbGQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb250ZW50VGFic0F1dG9IaWRlVGhyZXNob2xkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29udGVudFRhYnNBdXRvSGlkZVRocmVzaG9sZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29udGVudFRhYnNBdXRvSGlkZVRocmVzaG9sZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2FjdGl2aXR5TG9nVmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX2NvbnRlbnRUYWJzQXV0b0hpZGVUaHJlc2hvbGRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9hY3Rpdml0eUxvZ1Zpc2libGVfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgLy8gQWN0aXZpdHkgbG9nIHZpc2liaWxpdHkgYW5kIGNvdW50CiAgICBnZXQgYWN0aXZpdHlMb2dWaXNpYmxlKCkgewogICAgICByZXR1cm4gdGhpcy4jYWN0aXZpdHlMb2dWaXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYWN0aXZpdHlMb2dWaXNpYmxlKHZhbHVlMikgewogICAgICB0aGlzLiNhY3Rpdml0eUxvZ1Zpc2libGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhY3Rpdml0eUxvZ0NvdW50X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfYWN0aXZpdHlMb2dWaXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfYWN0aXZpdHlMb2dDb3VudF9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBhY3Rpdml0eUxvZ0NvdW50KCkgewogICAgICByZXR1cm4gdGhpcy4jYWN0aXZpdHlMb2dDb3VudF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFjdGl2aXR5TG9nQ291bnQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2FjdGl2aXR5TG9nQ291bnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtYWluY29udGVudFRhYnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9hY3Rpdml0eUxvZ0NvdW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfbWFpbmNvbnRlbnRUYWJzX2luaXRpYWxpemVycywgW10pKTsKICAgIC8vIFByb3BlcnRpZXMgZm9yIG1haW5jb250ZW50CiAgICBnZXQgbWFpbmNvbnRlbnRUYWJzKCkgewogICAgICByZXR1cm4gdGhpcy4jbWFpbmNvbnRlbnRUYWJzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWFpbmNvbnRlbnRUYWJzKHZhbHVlMikgewogICAgICB0aGlzLiNtYWluY29udGVudFRhYnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtYWluY29udGVudFNlbGVjdGVkVGFiX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfbWFpbmNvbnRlbnRUYWJzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfbWFpbmNvbnRlbnRTZWxlY3RlZFRhYl9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgZ2V0IG1haW5jb250ZW50U2VsZWN0ZWRUYWIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtYWluY29udGVudFNlbGVjdGVkVGFiX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWFpbmNvbnRlbnRTZWxlY3RlZFRhYih2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWFpbmNvbnRlbnRTZWxlY3RlZFRhYl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NvbnRlbnRUYWJBY3Rpb25zTGVmdF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX21haW5jb250ZW50U2VsZWN0ZWRUYWJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9jb250ZW50VGFiQWN0aW9uc0xlZnRfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IGNvbnRlbnRUYWJBY3Rpb25zTGVmdCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvbnRlbnRUYWJBY3Rpb25zTGVmdF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNvbnRlbnRUYWJBY3Rpb25zTGVmdCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29udGVudFRhYkFjdGlvbnNMZWZ0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29udGVudFRhYkFjdGlvbnNSaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX2NvbnRlbnRUYWJBY3Rpb25zTGVmdF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX2NvbnRlbnRUYWJBY3Rpb25zUmlnaHRfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IGNvbnRlbnRUYWJBY3Rpb25zUmlnaHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb250ZW50VGFiQWN0aW9uc1JpZ2h0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29udGVudFRhYkFjdGlvbnNSaWdodCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29udGVudFRhYkFjdGlvbnNSaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2FwcGJhcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX2NvbnRlbnRUYWJBY3Rpb25zUmlnaHRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9hcHBiYXJfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIC8vIFJlZmVyZW5jZXMgdG8gY2hpbGQgY29tcG9uZW50cwogICAgZ2V0IGFwcGJhcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FwcGJhcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFwcGJhcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jYXBwYmFyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWFpbm1lbnVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9hcHBiYXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9tYWlubWVudV9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgZ2V0IG1haW5tZW51KCkgewogICAgICByZXR1cm4gdGhpcy4jbWFpbm1lbnVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtYWlubWVudSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWFpbm1lbnVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzZWNvbmRhcnltZW51X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfbWFpbm1lbnVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9zZWNvbmRhcnltZW51X2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgc2Vjb25kYXJ5bWVudSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlY29uZGFyeW1lbnVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWNvbmRhcnltZW51KHZhbHVlMikgewogICAgICB0aGlzLiNzZWNvbmRhcnltZW51X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWFpbmNvbnRlbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9zZWNvbmRhcnltZW51X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfbWFpbmNvbnRlbnRfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBtYWluY29udGVudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21haW5jb250ZW50X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWFpbmNvbnRlbnQodmFsdWUyKSB7CiAgICAgIHRoaXMuI21haW5jb250ZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYWN0aXZpdHlsb2dFbGVtZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfbWFpbmNvbnRlbnRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9hY3Rpdml0eWxvZ0VsZW1lbnRfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBhY3Rpdml0eWxvZ0VsZW1lbnQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhY3Rpdml0eWxvZ0VsZW1lbnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhY3Rpdml0eWxvZ0VsZW1lbnQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2FjdGl2aXR5bG9nRWxlbWVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2JvdHRvbWJhckVsZW1lbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9hY3Rpdml0eWxvZ0VsZW1lbnRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9ib3R0b21iYXJFbGVtZW50X2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgYm90dG9tYmFyRWxlbWVudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2JvdHRvbWJhckVsZW1lbnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBib3R0b21iYXJFbGVtZW50KHZhbHVlMikgewogICAgICB0aGlzLiNib3R0b21iYXJFbGVtZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYm90dG9tYmFyVmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX2JvdHRvbWJhckVsZW1lbnRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUwKHRoaXMsIF9ib3R0b21iYXJWaXNpYmxlX2luaXRpYWxpemVycywgdHJ1ZSkpOwogICAgZ2V0IGJvdHRvbWJhclZpc2libGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNib3R0b21iYXJWaXNpYmxlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYm90dG9tYmFyVmlzaWJsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYm90dG9tYmFyVmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2N1cnJlbnRWaWV3X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1MCh0aGlzLCBfYm90dG9tYmFyVmlzaWJsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX2N1cnJlbnRWaWV3X2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICAvLyBDdXJyZW50IHZpZXcgc3RhdGUKICAgIGdldCBjdXJyZW50VmlldygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRWaWV3X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY3VycmVudFZpZXcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2N1cnJlbnRWaWV3X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAvLyBJbnRlcm5hbCBzZXJ2aWNlcwogICAgdmlld1JlZ2lzdHJ5ID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTAodGhpcywgX2N1cnJlbnRWaWV3X2V4dHJhSW5pdGlhbGl6ZXJzKSwgbmV3IFZpZXdSZWdpc3RyeSgpKTsKICAgIHJvdXRlckNsZWFudXAgPSBudWxsOwogICAgc2VhcmNoQ2FsbGJhY2sgPSBudWxsOwogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjBmMGYwIiwgIiMxYTFhMWEiKX07CiAgICAgIH0KICAgICAgLm1haW5ncmlkIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA0MHB4OwogICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gNDBweCAtIDI0cHgpOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgLyogZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIHNldCBkeW5hbWljYWxseSBpbiB0ZW1wbGF0ZSAqLwogICAgICAgIGdyaWQtdGVtcGxhdGUtcm93czogMWZyOwogICAgICAgIHRyYW5zaXRpb246IGdyaWQtdGVtcGxhdGUtY29sdW1ucyAwLjNzIGVhc2UsIGhlaWdodCAwLjNzIGVhc2U7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2JvdHRvbWJhci1oaWRkZW5dKSAubWFpbmdyaWQgewogICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gNDBweCk7CiAgICAgIH0KCiAgICAgIGRlZXMtYXBwdWktYm90dG9tYmFyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgei1pbmRleDogNDsKICAgICAgfQoKICAgICAgLyogWi1pbmRleCBsYXllcmluZyBmb3IgcHJvcGVyIHN0YWNraW5nICovCiAgICAgIC5tYWluZ3JpZCA+IGRlZXMtYXBwdWktbWFpbm1lbnUgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB6LWluZGV4OiAzOwogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgIH0KCiAgICAgIC5tYWluZ3JpZCA+IGRlZXMtYXBwdWktc2Vjb25kYXJ5bWVudSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgbWluLWhlaWdodDogMDsKICAgICAgfQoKICAgICAgLm1haW5ncmlkID4gZGVlcy1hcHB1aS1tYWluY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgbWluLWhlaWdodDogMDsKICAgICAgfQoKICAgICAgLm1haW5ncmlkID4gZGVlcy1hcHB1aS1hY3Rpdml0eWxvZyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgZWFzZSwgdHJhbnNmb3JtIDAuM3MgZWFzZTsKICAgICAgfQoKICAgICAgLm1haW5ncmlkID4gZGVlcy1hcHB1aS1hY3Rpdml0eWxvZy5oaWRkZW4gewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDIwcHgpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAubWFpbmdyaWQgPiBkZWVzLWFwcHVpLWFjdGl2aXR5bG9nLnZpc2libGUgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOwogICAgICB9CgogICAgICAvKiBWaWV3IGNvbnRhaW5lciBmb3IgZHluYW1pY2FsbHkgbG9hZGVkIHZpZXdzICovCiAgICAgIC52aWV3LWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogY29udGVudHM7CiAgICAgIH0KCiAgICAgIC52aWV3LWNvbnRhaW5lcjplbXB0eSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGVlcy1hcHB1aS1hcHBiYXIKICAgICAgICAubWVudUl0ZW1zPSR7dGhpcy5hcHBiYXJNZW51SXRlbXN9CiAgICAgICAgLmJyZWFkY3J1bWJzPSR7dGhpcy5hcHBiYXJCcmVhZGNydW1ic30KICAgICAgICAuYnJlYWRjcnVtYlNlcGFyYXRvcj0ke3RoaXMuYXBwYmFyQnJlYWRjcnVtYlNlcGFyYXRvcn0KICAgICAgICAuc2hvd1dpbmRvd0NvbnRyb2xzPSR7dGhpcy5hcHBiYXJTaG93V2luZG93Q29udHJvbHN9CiAgICAgICAgLnVzZXI9JHt0aGlzLmFwcGJhclVzZXJ9CiAgICAgICAgLnByb2ZpbGVNZW51SXRlbXM9JHt0aGlzLmFwcGJhclByb2ZpbGVNZW51SXRlbXN9CiAgICAgICAgLnNob3dTZWFyY2g9JHt0aGlzLmFwcGJhclNob3dTZWFyY2h9CiAgICAgICAgLnNob3dBY3Rpdml0eUxvZ1RvZ2dsZT0ke3RydWV9CiAgICAgICAgLmFjdGl2aXR5TG9nQ291bnQ9JHt0aGlzLmFjdGl2aXR5TG9nQ291bnR9CiAgICAgICAgLmFjdGl2aXR5TG9nQWN0aXZlPSR7dGhpcy5hY3Rpdml0eUxvZ1Zpc2libGV9CiAgICAgICAgQG1lbnUtc2VsZWN0PSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVBcHBiYXJNZW51U2VsZWN0KGUxMSl9CiAgICAgICAgQGJyZWFkY3J1bWItbmF2aWdhdGU9JHsoZTExKSA9PiB0aGlzLmhhbmRsZUFwcGJhckJyZWFkY3J1bWJOYXZpZ2F0ZShlMTEpfQogICAgICAgIEBzZWFyY2gtY2xpY2s9JHsoKSA9PiB0aGlzLmhhbmRsZUFwcGJhclNlYXJjaENsaWNrKCl9CiAgICAgICAgQHNlYXJjaC1xdWVyeT0keyhlMTEpID0+IHRoaXMuaGFuZGxlQXBwYmFyU2VhcmNoUXVlcnkoZTExKX0KICAgICAgICBAdXNlci1tZW51LW9wZW49JHsoKSA9PiB0aGlzLmhhbmRsZUFwcGJhclVzZXJNZW51T3BlbigpfQogICAgICAgIEBwcm9maWxlLW1lbnUtc2VsZWN0PSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVBcHBiYXJQcm9maWxlTWVudVNlbGVjdChlMTEpfQogICAgICAgIEBhY3Rpdml0eS10b2dnbGU9JHsoKSA9PiB0aGlzLnRvZ2dsZUFjdGl2aXR5TG9nKCl9CiAgICAgID48L2RlZXMtYXBwdWktYXBwYmFyPgogICAgICA8ZGl2IGNsYXNzPSJtYWluZ3JpZCIgc3R5bGU9ImdyaWQtdGVtcGxhdGUtY29sdW1uczogYXV0byBhdXRvIDFmciAke3RoaXMuYWN0aXZpdHlMb2dWaXNpYmxlID8gIjI4MHB4IiA6ICIwcHgifTsiPgogICAgICAgICR7dGhpcy5tYWlubWVudVZpc2libGUgPyBiMmAKICAgICAgICAgIDxkZWVzLWFwcHVpLW1haW5tZW51CiAgICAgICAgICAgIC5sb2dvSWNvbj0ke3RoaXMubWFpbm1lbnVMb2dvSWNvbn0KICAgICAgICAgICAgLmxvZ29UZXh0PSR7dGhpcy5tYWlubWVudUxvZ29UZXh0fQogICAgICAgICAgICAubWVudUdyb3Vwcz0ke3RoaXMubWFpbm1lbnVHcm91cHN9CiAgICAgICAgICAgIC5ib3R0b21UYWJzPSR7dGhpcy5tYWlubWVudUJvdHRvbVRhYnN9CiAgICAgICAgICAgIC50YWJzPSR7dGhpcy5tYWlubWVudVRhYnN9CiAgICAgICAgICAgIC5zZWxlY3RlZFRhYj0ke3RoaXMubWFpbm1lbnVTZWxlY3RlZFRhYn0KICAgICAgICAgICAgLmNvbGxhcHNlZD0ke3RoaXMubWFpbm1lbnVDb2xsYXBzZWR9CiAgICAgICAgICAgIEB0YWItc2VsZWN0PSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVNYWlubWVudVRhYlNlbGVjdChlMTEpfQogICAgICAgICAgICBAY29sbGFwc2UtY2hhbmdlPSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVNYWlubWVudUNvbGxhcHNlQ2hhbmdlKGUxMSl9CiAgICAgICAgICA+PC9kZWVzLWFwcHVpLW1haW5tZW51PgogICAgICAgIGAgOiAiIn0KICAgICAgICAke3RoaXMuc2Vjb25kYXJ5bWVudVZpc2libGUgPyBiMmAKICAgICAgICAgIDxkZWVzLWFwcHVpLXNlY29uZGFyeW1lbnUKICAgICAgICAgICAgLmhlYWRpbmc9JHt0aGlzLnNlY29uZGFyeW1lbnVIZWFkaW5nfQogICAgICAgICAgICAuZ3JvdXBzPSR7dGhpcy5zZWNvbmRhcnltZW51R3JvdXBzfQogICAgICAgICAgICAuc2VsZWN0ZWRJdGVtPSR7dGhpcy5zZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtfQogICAgICAgICAgICAuY29sbGFwc2VkPSR7dGhpcy5zZWNvbmRhcnltZW51Q29sbGFwc2VkfQogICAgICAgICAgICBAaXRlbS1zZWxlY3Q9JHsoZTExKSA9PiB0aGlzLmhhbmRsZVNlY29uZGFyeW1lbnVJdGVtU2VsZWN0KGUxMSl9CiAgICAgICAgICAgIEBjb2xsYXBzZS1jaGFuZ2U9JHsoZTExKSA9PiB0aGlzLmhhbmRsZVNlY29uZGFyeW1lbnVDb2xsYXBzZUNoYW5nZShlMTEpfQogICAgICAgICAgPjwvZGVlcy1hcHB1aS1zZWNvbmRhcnltZW51PgogICAgICAgIGAgOiAiIn0KICAgICAgICA8ZGVlcy1hcHB1aS1tYWluY29udGVudAogICAgICAgICAgLnRhYnM9JHt0aGlzLm1haW5jb250ZW50VGFic30KICAgICAgICAgIC5zZWxlY3RlZFRhYj0ke3RoaXMubWFpbmNvbnRlbnRTZWxlY3RlZFRhYn0KICAgICAgICAgIC5zaG93VGFicz0ke3RoaXMubWFpbmNvbnRlbnRUYWJzVmlzaWJsZX0KICAgICAgICAgIC50YWJzQXV0b0hpZGU9JHt0aGlzLmNvbnRlbnRUYWJzQXV0b0hpZGV9CiAgICAgICAgICAudGFic0F1dG9IaWRlVGhyZXNob2xkPSR7dGhpcy5jb250ZW50VGFic0F1dG9IaWRlVGhyZXNob2xkfQogICAgICAgICAgLnRhYkFjdGlvbnNMZWZ0PSR7dGhpcy5jb250ZW50VGFiQWN0aW9uc0xlZnR9CiAgICAgICAgICAudGFiQWN0aW9uc1JpZ2h0PSR7dGhpcy5jb250ZW50VGFiQWN0aW9uc1JpZ2h0fQogICAgICAgICAgQHRhYi1zZWxlY3Q9JHsoZTExKSA9PiB0aGlzLmhhbmRsZUNvbnRlbnRUYWJTZWxlY3QoZTExKX0KICAgICAgICAgIEB0YWItY2xvc2U9JHsoZTExKSA9PiB0aGlzLmhhbmRsZUNvbnRlbnRUYWJDbG9zZShlMTEpfQogICAgICAgID4KICAgICAgICAgIDxkaXYgY2xhc3M9InZpZXctY29udGFpbmVyIj48L2Rpdj4KICAgICAgICAgIDxzbG90IG5hbWU9Im1haW5jb250ZW50Ij48L3Nsb3Q+CiAgICAgICAgPC9kZWVzLWFwcHVpLW1haW5jb250ZW50PgogICAgICAgIDxkZWVzLWFwcHVpLWFjdGl2aXR5bG9nCiAgICAgICAgICBjbGFzcz0iJHt0aGlzLmFjdGl2aXR5TG9nVmlzaWJsZSA/ICJ2aXNpYmxlIiA6ICJoaWRkZW4ifSIKICAgICAgICA+PC9kZWVzLWFwcHVpLWFjdGl2aXR5bG9nPgogICAgICA8L2Rpdj4KICAgICAgJHt0aGlzLmJvdHRvbWJhclZpc2libGUgPyBiMmAKICAgICAgICA8ZGVlcy1hcHB1aS1ib3R0b21iYXI+PC9kZWVzLWFwcHVpLWJvdHRvbWJhcj4KICAgICAgYCA6ICIifQogICAgYDsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZCgpIHsKICAgICAgdGhpcy5hcHBiYXIgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiZGVlcy1hcHB1aS1hcHBiYXIiKTsKICAgICAgdGhpcy5tYWlubWVudSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCJkZWVzLWFwcHVpLW1haW5tZW51Iik7CiAgICAgIHRoaXMuc2Vjb25kYXJ5bWVudSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCJkZWVzLWFwcHVpLXNlY29uZGFyeW1lbnUiKTsKICAgICAgdGhpcy5tYWluY29udGVudCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCJkZWVzLWFwcHVpLW1haW5jb250ZW50Iik7CiAgICAgIHRoaXMuYWN0aXZpdHlsb2dFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoImRlZXMtYXBwdWktYWN0aXZpdHlsb2ciKTsKICAgICAgdGhpcy5ib3R0b21iYXJFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoImRlZXMtYXBwdWktYm90dG9tYmFyIik7CiAgICAgIGlmICh0aGlzLmFjdGl2aXR5bG9nRWxlbWVudCkgewogICAgICAgIHRoaXMuYWN0aXZpdHlsb2dFbGVtZW50LmVudHJpZXMkLnN1YnNjcmliZSgoZW50cmllcykgPT4gewogICAgICAgICAgdGhpcy5hY3Rpdml0eUxvZ0NvdW50ID0gZW50cmllcy5sZW5ndGg7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgdGhpcy52aWV3UmVnaXN0cnkuc2V0QXBwdWlSZWYodGhpcyk7CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgaWYgKHRoaXMucm91dGVyQ2xlYW51cCkgewogICAgICAgIHRoaXMucm91dGVyQ2xlYW51cCgpOwogICAgICAgIHRoaXMucm91dGVyQ2xlYW51cCA9IG51bGw7CiAgICAgIH0KICAgICAgdGhpcy52aWV3TGlmZWN5Y2xlJC5jb21wbGV0ZSgpOwogICAgICB0aGlzLnZpZXdDaGFuZ2VkJC5jb21wbGV0ZSgpOwogICAgfQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQUk9HUkFNTUFUSUMgQVBJOiBBUFAgQkFSCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8qKgogICAgICogU2V0IHRoZSBhcHAgYmFyIG1lbnUgaXRlbXMgKEZpbGUsIEVkaXQsIFZpZXcsIGV0Yy4pCiAgICAgKi8KICAgIHNldEFwcEJhck1lbnVzKG1lbnVzKSB7CiAgICAgIHRoaXMuYXBwYmFyTWVudUl0ZW1zID0gWy4uLm1lbnVzXTsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIGEgc2luZ2xlIGFwcCBiYXIgbWVudSBieSBuYW1lCiAgICAgKi8KICAgIHVwZGF0ZUFwcEJhck1lbnUobmFtZSwgdXBkYXRlKSB7CiAgICAgIHRoaXMuYXBwYmFyTWVudUl0ZW1zID0gdGhpcy5hcHBiYXJNZW51SXRlbXMubWFwKChtZW51KSA9PiB7CiAgICAgICAgaWYgKCJuYW1lIiBpbiBtZW51ICYmIG1lbnUubmFtZSA9PT0gbmFtZSkgewogICAgICAgICAgcmV0dXJuIHsgLi4ubWVudSwgLi4udXBkYXRlIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBtZW51OwogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogU2V0IHRoZSBicmVhZGNydW1icyAoc3RyaW5nIG9yIGFycmF5KQogICAgICovCiAgICBzZXRCcmVhZGNydW1icyhicmVhZGNydW1icykgewogICAgICBpZiAoQXJyYXkuaXNBcnJheShicmVhZGNydW1icykpIHsKICAgICAgICB0aGlzLmFwcGJhckJyZWFkY3J1bWJzID0gYnJlYWRjcnVtYnMuam9pbih0aGlzLmFwcGJhckJyZWFkY3J1bWJTZXBhcmF0b3IpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuYXBwYmFyQnJlYWRjcnVtYnMgPSBicmVhZGNydW1iczsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTZXQgdGhlIGN1cnJlbnQgdXNlcgogICAgICovCiAgICBzZXRVc2VyKHVzZXIpIHsKICAgICAgdGhpcy5hcHBiYXJVc2VyID0gdXNlcjsKICAgIH0KICAgIC8qKgogICAgICogU2V0IHRoZSBwcm9maWxlIGRyb3Bkb3duIG1lbnUgaXRlbXMKICAgICAqLwogICAgc2V0UHJvZmlsZU1lbnVJdGVtcyhpdGVtcykgewogICAgICB0aGlzLmFwcGJhclByb2ZpbGVNZW51SXRlbXMgPSBbLi4uaXRlbXNdOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgc2VhcmNoIGJhciB2aXNpYmlsaXR5CiAgICAgKi8KICAgIHNldFNlYXJjaFZpc2libGUodmlzaWJsZSkgewogICAgICB0aGlzLmFwcGJhclNob3dTZWFyY2ggPSB2aXNpYmxlOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgd2luZG93IGNvbnRyb2xzIHZpc2liaWxpdHkKICAgICAqLwogICAgc2V0V2luZG93Q29udHJvbHNWaXNpYmxlKHZpc2libGUpIHsKICAgICAgdGhpcy5hcHBiYXJTaG93V2luZG93Q29udHJvbHMgPSB2aXNpYmxlOwogICAgfQogICAgLyoqCiAgICAgKiBSZWdpc3RlciBhIHNlYXJjaCBjYWxsYmFjawogICAgICovCiAgICBvblNlYXJjaChjYWxsYmFjaykgewogICAgICB0aGlzLnNlYXJjaENhbGxiYWNrID0gY2FsbGJhY2s7CiAgICB9CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFBST0dSQU1NQVRJQyBBUEk6IE1BSU4gTUVOVQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvKioKICAgICAqIFNldCB0aGUgZW50aXJlIG1haW4gbWVudSBjb25maWd1cmF0aW9uCiAgICAgKi8KICAgIHNldE1haW5NZW51KGNvbmZpZzMpIHsKICAgICAgaWYgKGNvbmZpZzMubG9nb0ljb24gIT09IHZvaWQgMCkgewogICAgICAgIHRoaXMubWFpbm1lbnVMb2dvSWNvbiA9IGNvbmZpZzMubG9nb0ljb247CiAgICAgIH0KICAgICAgaWYgKGNvbmZpZzMubG9nb1RleHQgIT09IHZvaWQgMCkgewogICAgICAgIHRoaXMubWFpbm1lbnVMb2dvVGV4dCA9IGNvbmZpZzMubG9nb1RleHQ7CiAgICAgIH0KICAgICAgaWYgKGNvbmZpZzMuZ3JvdXBzICE9PSB2b2lkIDApIHsKICAgICAgICB0aGlzLm1haW5tZW51R3JvdXBzID0gWy4uLmNvbmZpZzMuZ3JvdXBzXTsKICAgICAgfQogICAgICBpZiAoY29uZmlnMy5ib3R0b21UYWJzICE9PSB2b2lkIDApIHsKICAgICAgICB0aGlzLm1haW5tZW51Qm90dG9tVGFicyA9IFsuLi5jb25maWczLmJvdHRvbVRhYnNdOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZSBhIHNwZWNpZmljIG1lbnUgZ3JvdXAgYnkgbmFtZQogICAgICovCiAgICB1cGRhdGVNYWluTWVudUdyb3VwKGdyb3VwTmFtZSwgdXBkYXRlKSB7CiAgICAgIHRoaXMubWFpbm1lbnVHcm91cHMgPSB0aGlzLm1haW5tZW51R3JvdXBzLm1hcCgoZ3JvdXApID0+IGdyb3VwLm5hbWUgPT09IGdyb3VwTmFtZSA/IHsgLi4uZ3JvdXAsIC4uLnVwZGF0ZSB9IDogZ3JvdXApOwogICAgfQogICAgLyoqCiAgICAgKiBBZGQgYSBtZW51IGl0ZW0gdG8gYSBzcGVjaWZpYyBncm91cAogICAgICovCiAgICBhZGRNYWluTWVudUl0ZW0oZ3JvdXBOYW1lLCB0YWIyKSB7CiAgICAgIHRoaXMubWFpbm1lbnVHcm91cHMgPSB0aGlzLm1haW5tZW51R3JvdXBzLm1hcCgoZ3JvdXApID0+IHsKICAgICAgICBpZiAoZ3JvdXAubmFtZSA9PT0gZ3JvdXBOYW1lKSB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAuLi5ncm91cCwKICAgICAgICAgICAgaXRlbXM6IFsuLi5ncm91cC5pdGVtcyB8fCBbXSwgdGFiMl0KICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBncm91cDsKICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZSBhIG1lbnUgaXRlbSBmcm9tIGEgZ3JvdXAgYnkga2V5CiAgICAgKi8KICAgIHJlbW92ZU1haW5NZW51SXRlbShncm91cE5hbWUsIHRhYktleSkgewogICAgICB0aGlzLm1haW5tZW51R3JvdXBzID0gdGhpcy5tYWlubWVudUdyb3Vwcy5tYXAoKGdyb3VwKSA9PiB7CiAgICAgICAgaWYgKGdyb3VwLm5hbWUgPT09IGdyb3VwTmFtZSkgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgLi4uZ3JvdXAsCiAgICAgICAgICAgIGl0ZW1zOiAoZ3JvdXAuaXRlbXMgfHwgW10pLmZpbHRlcigodDkpID0+IHQ5LmtleSAhPT0gdGFiS2V5KQogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGdyb3VwOwogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogU2V0IHRoZSBzZWxlY3RlZCBtYWluIG1lbnUgaXRlbSBieSBrZXkKICAgICAqLwogICAgc2V0TWFpbk1lbnVTZWxlY3Rpb24odGFiS2V5KSB7CiAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5tYWlubWVudUdyb3VwcykgewogICAgICAgIGNvbnN0IHRhYjIgPSBncm91cC5pdGVtcz8uZmluZCgodDkpID0+IHQ5LmtleSA9PT0gdGFiS2V5KTsKICAgICAgICBpZiAodGFiMikgewogICAgICAgICAgdGhpcy5tYWlubWVudVNlbGVjdGVkVGFiID0gdGFiMjsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgYm90dG9tVGFiID0gdGhpcy5tYWlubWVudUJvdHRvbVRhYnMuZmluZCgodDkpID0+IHQ5LmtleSA9PT0gdGFiS2V5KTsKICAgICAgaWYgKGJvdHRvbVRhYikgewogICAgICAgIHRoaXMubWFpbm1lbnVTZWxlY3RlZFRhYiA9IGJvdHRvbVRhYjsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTZXQgbWFpbiBtZW51IGNvbGxhcHNlZCBzdGF0ZQogICAgICovCiAgICBzZXRNYWluTWVudUNvbGxhcHNlZChjb2xsYXBzZWQpIHsKICAgICAgdGhpcy5tYWlubWVudUNvbGxhcHNlZCA9IGNvbGxhcHNlZDsKICAgIH0KICAgIC8qKgogICAgICogU2V0IG1haW4gbWVudSB2aXNpYmlsaXR5CiAgICAgKi8KICAgIHNldE1haW5NZW51VmlzaWJsZSh2aXNpYmxlKSB7CiAgICAgIHRoaXMubWFpbm1lbnVWaXNpYmxlID0gdmlzaWJsZTsKICAgIH0KICAgIC8qKgogICAgICogU2V0IHNlY29uZGFyeSBtZW51IGNvbGxhcHNlZCBzdGF0ZQogICAgICovCiAgICBzZXRTZWNvbmRhcnlNZW51Q29sbGFwc2VkKGNvbGxhcHNlZCkgewogICAgICB0aGlzLnNlY29uZGFyeW1lbnVDb2xsYXBzZWQgPSBjb2xsYXBzZWQ7CiAgICB9CiAgICAvKioKICAgICAqIFNldCBzZWNvbmRhcnkgbWVudSB2aXNpYmlsaXR5CiAgICAgKi8KICAgIHNldFNlY29uZGFyeU1lbnVWaXNpYmxlKHZpc2libGUpIHsKICAgICAgdGhpcy5zZWNvbmRhcnltZW51VmlzaWJsZSA9IHZpc2libGU7CiAgICB9CiAgICAvKioKICAgICAqIFNldCBjb250ZW50IHRhYnMgdmlzaWJpbGl0eQogICAgICovCiAgICBzZXRDb250ZW50VGFic1Zpc2libGUodmlzaWJsZSkgewogICAgICB0aGlzLm1haW5jb250ZW50VGFic1Zpc2libGUgPSB2aXNpYmxlOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgY29udGVudCB0YWJzIGF1dG8taGlkZSBiZWhhdmlvcgogICAgICogQHBhcmFtIGVuYWJsZWQgLSBFbmFibGUgYXV0by1oaWRlIGZlYXR1cmUKICAgICAqIEBwYXJhbSB0aHJlc2hvbGQgLSBIaWRlIHdoZW4gdGFicy5sZW5ndGggPD0gdGhyZXNob2xkIChkZWZhdWx0IDAgPSBoaWRlIHdoZW4gbm8gdGFicykKICAgICAqLwogICAgc2V0Q29udGVudFRhYnNBdXRvSGlkZShlbmFibGVkLCB0aHJlc2hvbGQgPSAwKSB7CiAgICAgIHRoaXMuY29udGVudFRhYnNBdXRvSGlkZSA9IGVuYWJsZWQ7CiAgICAgIHRoaXMuY29udGVudFRhYnNBdXRvSGlkZVRocmVzaG9sZCA9IHRocmVzaG9sZDsKICAgIH0KICAgIC8qKgogICAgICogU2V0IGEgYmFkZ2Ugb24gYSBtYWluIG1lbnUgaXRlbQogICAgICovCiAgICBzZXRNYWluTWVudUJhZGdlKHRhYktleSwgYmFkZ2UpIHsKICAgICAgdGhpcy5tYWlubWVudUdyb3VwcyA9IHRoaXMubWFpbm1lbnVHcm91cHMubWFwKChncm91cCkgPT4gKHsKICAgICAgICAuLi5ncm91cCwKICAgICAgICBpdGVtczogKGdyb3VwLml0ZW1zIHx8IFtdKS5tYXAoKHRhYjIpID0+IHRhYjIua2V5ID09PSB0YWJLZXkgPyB7IC4uLnRhYjIsIGJhZGdlIH0gOiB0YWIyKQogICAgICB9KSk7CiAgICAgIHRoaXMubWFpbm1lbnVCb3R0b21UYWJzID0gdGhpcy5tYWlubWVudUJvdHRvbVRhYnMubWFwKCh0YWIyKSA9PiB0YWIyLmtleSA9PT0gdGFiS2V5ID8geyAuLi50YWIyLCBiYWRnZSB9IDogdGFiMik7CiAgICB9CiAgICAvKioKICAgICAqIENsZWFyIGEgYmFkZ2UgZnJvbSBhIG1haW4gbWVudSBpdGVtCiAgICAgKi8KICAgIGNsZWFyTWFpbk1lbnVCYWRnZSh0YWJLZXkpIHsKICAgICAgdGhpcy5tYWlubWVudUdyb3VwcyA9IHRoaXMubWFpbm1lbnVHcm91cHMubWFwKChncm91cCkgPT4gKHsKICAgICAgICAuLi5ncm91cCwKICAgICAgICBpdGVtczogKGdyb3VwLml0ZW1zIHx8IFtdKS5tYXAoKHRhYjIpID0+IHsKICAgICAgICAgIGlmICh0YWIyLmtleSA9PT0gdGFiS2V5KSB7CiAgICAgICAgICAgIGNvbnN0IHsgYmFkZ2UsIC4uLnJlc3QgfSA9IHRhYjI7CiAgICAgICAgICAgIHJldHVybiByZXN0OwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRhYjI7CiAgICAgICAgfSkKICAgICAgfSkpOwogICAgICB0aGlzLm1haW5tZW51Qm90dG9tVGFicyA9IHRoaXMubWFpbm1lbnVCb3R0b21UYWJzLm1hcCgodGFiMikgPT4gewogICAgICAgIGlmICh0YWIyLmtleSA9PT0gdGFiS2V5KSB7CiAgICAgICAgICBjb25zdCB7IGJhZGdlLCAuLi5yZXN0IH0gPSB0YWIyOwogICAgICAgICAgcmV0dXJuIHJlc3Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0YWIyOwogICAgICB9KTsKICAgIH0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUFJPR1JBTU1BVElDIEFQSTogU0VDT05EQVJZIE1FTlUKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLyoqCiAgICAgKiBTZXQgdGhlIHNlY29uZGFyeSBtZW51IGNvbmZpZ3VyYXRpb24KICAgICAqLwogICAgc2V0U2Vjb25kYXJ5TWVudShjb25maWczKSB7CiAgICAgIGlmIChjb25maWczLmhlYWRpbmcgIT09IHZvaWQgMCkgewogICAgICAgIHRoaXMuc2Vjb25kYXJ5bWVudUhlYWRpbmcgPSBjb25maWczLmhlYWRpbmc7CiAgICAgIH0KICAgICAgdGhpcy5zZWNvbmRhcnltZW51R3JvdXBzID0gWy4uLmNvbmZpZzMuZ3JvdXBzXTsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIGEgc3BlY2lmaWMgc2Vjb25kYXJ5IG1lbnUgZ3JvdXAKICAgICAqLwogICAgdXBkYXRlU2Vjb25kYXJ5TWVudUdyb3VwKGdyb3VwTmFtZSwgdXBkYXRlKSB7CiAgICAgIHRoaXMuc2Vjb25kYXJ5bWVudUdyb3VwcyA9IHRoaXMuc2Vjb25kYXJ5bWVudUdyb3Vwcy5tYXAoKGdyb3VwKSA9PiBncm91cC5uYW1lID09PSBncm91cE5hbWUgPyB7IC4uLmdyb3VwLCAuLi51cGRhdGUgfSA6IGdyb3VwKTsKICAgIH0KICAgIC8qKgogICAgICogQWRkIGFuIGl0ZW0gdG8gYSBzZWNvbmRhcnkgbWVudSBncm91cAogICAgICovCiAgICBhZGRTZWNvbmRhcnlNZW51SXRlbShncm91cE5hbWUsIGl0ZW0pIHsKICAgICAgdGhpcy5zZWNvbmRhcnltZW51R3JvdXBzID0gdGhpcy5zZWNvbmRhcnltZW51R3JvdXBzLm1hcCgoZ3JvdXApID0+IHsKICAgICAgICBpZiAoZ3JvdXAubmFtZSA9PT0gZ3JvdXBOYW1lKSB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAuLi5ncm91cCwKICAgICAgICAgICAgaXRlbXM6IFsuLi5ncm91cC5pdGVtcywgaXRlbV0KICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBncm91cDsKICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIFNldCB0aGUgc2VsZWN0ZWQgc2Vjb25kYXJ5IG1lbnUgaXRlbSBieSBrZXkgKGZvciB0YWIgaXRlbXMgb25seSkKICAgICAqLwogICAgc2V0U2Vjb25kYXJ5TWVudVNlbGVjdGlvbihpdGVtS2V5KSB7CiAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5zZWNvbmRhcnltZW51R3JvdXBzKSB7CiAgICAgICAgY29uc3QgaXRlbSA9IGdyb3VwLml0ZW1zLmZpbmQoKGkxMSkgPT4gImtleSIgaW4gaTExICYmIGkxMS5rZXkgPT09IGl0ZW1LZXkpOwogICAgICAgIGlmIChpdGVtICYmICghKCJ0eXBlIiBpbiBpdGVtKSB8fCBpdGVtLnR5cGUgPT09ICJ0YWIiIHx8IGl0ZW0udHlwZSA9PT0gdm9pZCAwKSkgewogICAgICAgICAgdGhpcy5zZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtID0gaXRlbTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ2xlYXIgdGhlIHNlY29uZGFyeSBtZW51CiAgICAgKi8KICAgIGNsZWFyU2Vjb25kYXJ5TWVudSgpIHsKICAgICAgdGhpcy5zZWNvbmRhcnltZW51SGVhZGluZyA9ICIiOwogICAgICB0aGlzLnNlY29uZGFyeW1lbnVHcm91cHMgPSBbXTsKICAgICAgdGhpcy5zZWNvbmRhcnltZW51U2VsZWN0ZWRJdGVtID0gdm9pZCAwOwogICAgfQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQUk9HUkFNTUFUSUMgQVBJOiBDT05URU5UIFRBQlMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLyoqCiAgICAgKiBTZXQgdGhlIGNvbnRlbnQgdGFicwogICAgICovCiAgICBzZXRDb250ZW50VGFicyh0YWJzKSB7CiAgICAgIHRoaXMubWFpbmNvbnRlbnRUYWJzID0gWy4uLnRhYnNdOwogICAgICBpZiAodGFicy5sZW5ndGggPiAwICYmICF0aGlzLm1haW5jb250ZW50U2VsZWN0ZWRUYWIpIHsKICAgICAgICB0aGlzLm1haW5jb250ZW50U2VsZWN0ZWRUYWIgPSB0YWJzWzBdOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEFkZCBhIGNvbnRlbnQgdGFiCiAgICAgKi8KICAgIGFkZENvbnRlbnRUYWIodGFiMikgewogICAgICB0aGlzLm1haW5jb250ZW50VGFicyA9IFsuLi50aGlzLm1haW5jb250ZW50VGFicywgdGFiMl07CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZSBhIGNvbnRlbnQgdGFiIGJ5IGtleQogICAgICovCiAgICByZW1vdmVDb250ZW50VGFiKHRhYktleSkgewogICAgICB0aGlzLm1haW5jb250ZW50VGFicyA9IHRoaXMubWFpbmNvbnRlbnRUYWJzLmZpbHRlcigodDkpID0+IHQ5LmtleSAhPT0gdGFiS2V5KTsKICAgICAgaWYgKHRoaXMubWFpbmNvbnRlbnRTZWxlY3RlZFRhYj8ua2V5ID09PSB0YWJLZXkpIHsKICAgICAgICB0aGlzLm1haW5jb250ZW50U2VsZWN0ZWRUYWIgPSB0aGlzLm1haW5jb250ZW50VGFic1swXTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTZWxlY3QgYSBjb250ZW50IHRhYiBieSBrZXkKICAgICAqLwogICAgc2VsZWN0Q29udGVudFRhYih0YWJLZXkpIHsKICAgICAgY29uc3QgdGFiMiA9IHRoaXMubWFpbmNvbnRlbnRUYWJzLmZpbmQoKHQ5KSA9PiB0OS5rZXkgPT09IHRhYktleSk7CiAgICAgIGlmICh0YWIyKSB7CiAgICAgICAgdGhpcy5tYWluY29udGVudFNlbGVjdGVkVGFiID0gdGFiMjsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjb250ZW50IHRhYgogICAgICovCiAgICBnZXRTZWxlY3RlZENvbnRlbnRUYWIoKSB7CiAgICAgIHJldHVybiB0aGlzLm1haW5jb250ZW50U2VsZWN0ZWRUYWI7CiAgICB9CiAgICAvKioKICAgICAqIFNldCBjb250ZW50IHRhYiBhY3Rpb24gYnV0dG9ucyBvbiB0aGUgbGVmdCBzaWRlCiAgICAgKi8KICAgIHNldENvbnRlbnRUYWJBY3Rpb25zTGVmdChhY3Rpb25zKSB7CiAgICAgIHRoaXMuY29udGVudFRhYkFjdGlvbnNMZWZ0ID0gWy4uLmFjdGlvbnNdOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgY29udGVudCB0YWIgYWN0aW9uIGJ1dHRvbnMgb24gdGhlIHJpZ2h0IHNpZGUKICAgICAqLwogICAgc2V0Q29udGVudFRhYkFjdGlvbnNSaWdodChhY3Rpb25zKSB7CiAgICAgIHRoaXMuY29udGVudFRhYkFjdGlvbnNSaWdodCA9IFsuLi5hY3Rpb25zXTsKICAgIH0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUFJPR1JBTU1BVElDIEFQSTogQUNUSVZJVFkgTE9HCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8qKgogICAgICogR2V0IHRoZSBhY3Rpdml0eSBsb2cgQVBJCiAgICAgKi8KICAgIGdldCBhY3Rpdml0eUxvZygpIHsKICAgICAgaWYgKCF0aGlzLmFjdGl2aXR5bG9nRWxlbWVudCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBhZGQ6IChlbnRyeSkgPT4gewogICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4gdGhpcy5hY3Rpdml0eWxvZ0VsZW1lbnQ/LmFkZChlbnRyeSkpOwogICAgICAgICAgfSwKICAgICAgICAgIGFkZE1hbnk6IChlbnRyaWVzKSA9PiB7CiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29tcGxldGUudGhlbigoKSA9PiB0aGlzLmFjdGl2aXR5bG9nRWxlbWVudD8uYWRkTWFueShlbnRyaWVzKSk7CiAgICAgICAgICB9LAogICAgICAgICAgY2xlYXI6ICgpID0+IHsKICAgICAgICAgICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHRoaXMuYWN0aXZpdHlsb2dFbGVtZW50Py5jbGVhcigpKTsKICAgICAgICAgIH0sCiAgICAgICAgICBnZXRFbnRyaWVzOiAoKSA9PiB0aGlzLmFjdGl2aXR5bG9nRWxlbWVudD8uZ2V0RW50cmllcygpIHx8IFtdLAogICAgICAgICAgZmlsdGVyOiAoY3JpdGVyaWEpID0+IHRoaXMuYWN0aXZpdHlsb2dFbGVtZW50Py5maWx0ZXIoY3JpdGVyaWEpIHx8IFtdLAogICAgICAgICAgc2VhcmNoOiAocXVlcnkpID0+IHRoaXMuYWN0aXZpdHlsb2dFbGVtZW50Py5zZWFyY2gocXVlcnkpIHx8IFtdCiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIGFkZDogKGVudHJ5KSA9PiB0aGlzLmFjdGl2aXR5bG9nRWxlbWVudC5hZGQoZW50cnkpLAogICAgICAgIGFkZE1hbnk6IChlbnRyaWVzKSA9PiB0aGlzLmFjdGl2aXR5bG9nRWxlbWVudC5hZGRNYW55KGVudHJpZXMpLAogICAgICAgIGNsZWFyOiAoKSA9PiB0aGlzLmFjdGl2aXR5bG9nRWxlbWVudC5jbGVhcigpLAogICAgICAgIGdldEVudHJpZXM6ICgpID0+IHRoaXMuYWN0aXZpdHlsb2dFbGVtZW50LmdldEVudHJpZXMoKSwKICAgICAgICBmaWx0ZXI6IChjcml0ZXJpYSkgPT4gdGhpcy5hY3Rpdml0eWxvZ0VsZW1lbnQuZmlsdGVyKGNyaXRlcmlhKSwKICAgICAgICBzZWFyY2g6IChxdWVyeSkgPT4gdGhpcy5hY3Rpdml0eWxvZ0VsZW1lbnQuc2VhcmNoKHF1ZXJ5KQogICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgYWN0aXZpdHkgbG9nIHZpc2liaWxpdHkKICAgICAqLwogICAgc2V0QWN0aXZpdHlMb2dWaXNpYmxlKHZpc2libGUpIHsKICAgICAgdGhpcy5hY3Rpdml0eUxvZ1Zpc2libGUgPSB2aXNpYmxlOwogICAgfQogICAgLyoqCiAgICAgKiBUb2dnbGUgYWN0aXZpdHkgbG9nIHZpc2liaWxpdHkKICAgICAqLwogICAgdG9nZ2xlQWN0aXZpdHlMb2coKSB7CiAgICAgIHRoaXMuYWN0aXZpdHlMb2dWaXNpYmxlID0gIXRoaXMuYWN0aXZpdHlMb2dWaXNpYmxlOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgYWN0aXZpdHkgbG9nIHZpc2liaWxpdHkgc3RhdGUKICAgICAqLwogICAgZ2V0QWN0aXZpdHlMb2dWaXNpYmxlKCkgewogICAgICByZXR1cm4gdGhpcy5hY3Rpdml0eUxvZ1Zpc2libGU7CiAgICB9CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFBST0dSQU1NQVRJQyBBUEk6IEJPVFRPTSBCQVIKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLyoqCiAgICAgKiBHZXQgdGhlIGJvdHRvbSBiYXIgQVBJIGZvciB3aWRnZXQvYWN0aW9uIG1hbmFnZW1lbnQKICAgICAqLwogICAgZ2V0IGJvdHRvbUJhcigpIHsKICAgICAgaWYgKCF0aGlzLmJvdHRvbWJhckVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgYWRkV2lkZ2V0OiAod2lkZ2V0KSA9PiB7CiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29tcGxldGUudGhlbigoKSA9PiB0aGlzLmJvdHRvbWJhckVsZW1lbnQ/LmFkZFdpZGdldCh3aWRnZXQpKTsKICAgICAgICAgIH0sCiAgICAgICAgICB1cGRhdGVXaWRnZXQ6IChpZCwgdXBkYXRlKSA9PiB7CiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29tcGxldGUudGhlbigoKSA9PiB0aGlzLmJvdHRvbWJhckVsZW1lbnQ/LnVwZGF0ZVdpZGdldChpZCwgdXBkYXRlKSk7CiAgICAgICAgICB9LAogICAgICAgICAgcmVtb3ZlV2lkZ2V0OiAoaWQpID0+IHsKICAgICAgICAgICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHRoaXMuYm90dG9tYmFyRWxlbWVudD8ucmVtb3ZlV2lkZ2V0KGlkKSk7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0V2lkZ2V0OiAoaWQpID0+IHRoaXMuYm90dG9tYmFyRWxlbWVudD8uZ2V0V2lkZ2V0KGlkKSwKICAgICAgICAgIGNsZWFyV2lkZ2V0czogKCkgPT4gewogICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4gdGhpcy5ib3R0b21iYXJFbGVtZW50Py5jbGVhcldpZGdldHMoKSk7CiAgICAgICAgICB9LAogICAgICAgICAgYWRkQWN0aW9uOiAoYWN0aW9uKSA9PiB7CiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29tcGxldGUudGhlbigoKSA9PiB0aGlzLmJvdHRvbWJhckVsZW1lbnQ/LmFkZEFjdGlvbihhY3Rpb24pKTsKICAgICAgICAgIH0sCiAgICAgICAgICByZW1vdmVBY3Rpb246IChpZCkgPT4gewogICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4gdGhpcy5ib3R0b21iYXJFbGVtZW50Py5yZW1vdmVBY3Rpb24oaWQpKTsKICAgICAgICAgIH0sCiAgICAgICAgICBjbGVhckFjdGlvbnM6ICgpID0+IHsKICAgICAgICAgICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHRoaXMuYm90dG9tYmFyRWxlbWVudD8uY2xlYXJBY3Rpb25zKCkpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICBhZGRXaWRnZXQ6ICh3aWRnZXQpID0+IHRoaXMuYm90dG9tYmFyRWxlbWVudC5hZGRXaWRnZXQod2lkZ2V0KSwKICAgICAgICB1cGRhdGVXaWRnZXQ6IChpZCwgdXBkYXRlKSA9PiB0aGlzLmJvdHRvbWJhckVsZW1lbnQudXBkYXRlV2lkZ2V0KGlkLCB1cGRhdGUpLAogICAgICAgIHJlbW92ZVdpZGdldDogKGlkKSA9PiB0aGlzLmJvdHRvbWJhckVsZW1lbnQucmVtb3ZlV2lkZ2V0KGlkKSwKICAgICAgICBnZXRXaWRnZXQ6IChpZCkgPT4gdGhpcy5ib3R0b21iYXJFbGVtZW50LmdldFdpZGdldChpZCksCiAgICAgICAgY2xlYXJXaWRnZXRzOiAoKSA9PiB0aGlzLmJvdHRvbWJhckVsZW1lbnQuY2xlYXJXaWRnZXRzKCksCiAgICAgICAgYWRkQWN0aW9uOiAoYWN0aW9uKSA9PiB0aGlzLmJvdHRvbWJhckVsZW1lbnQuYWRkQWN0aW9uKGFjdGlvbiksCiAgICAgICAgcmVtb3ZlQWN0aW9uOiAoaWQpID0+IHRoaXMuYm90dG9tYmFyRWxlbWVudC5yZW1vdmVBY3Rpb24oaWQpLAogICAgICAgIGNsZWFyQWN0aW9uczogKCkgPT4gdGhpcy5ib3R0b21iYXJFbGVtZW50LmNsZWFyQWN0aW9ucygpCiAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIFNldCBib3R0b20gYmFyIHZpc2liaWxpdHkKICAgICAqLwogICAgc2V0Qm90dG9tQmFyVmlzaWJsZSh2aXNpYmxlKSB7CiAgICAgIHRoaXMuYm90dG9tYmFyVmlzaWJsZSA9IHZpc2libGU7CiAgICAgIGlmICghdmlzaWJsZSkgewogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJib3R0b21iYXItaGlkZGVuIiwgIiIpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCJib3R0b21iYXItaGlkZGVuIik7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogR2V0IGJvdHRvbSBiYXIgdmlzaWJpbGl0eSBzdGF0ZQogICAgICovCiAgICBnZXRCb3R0b21CYXJWaXNpYmxlKCkgewogICAgICByZXR1cm4gdGhpcy5ib3R0b21iYXJWaXNpYmxlOwogICAgfQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQUk9HUkFNTUFUSUMgQVBJOiBOQVZJR0FUSU9OCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8qKgogICAgICogTmF2aWdhdGUgdG8gYSB2aWV3IGJ5IElECiAgICAgKi8KICAgIGFzeW5jIG5hdmlnYXRlVG9WaWV3KHZpZXdJZCwgcGFyYW1zMikgewogICAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3UmVnaXN0cnkuZ2V0KHZpZXdJZCk7CiAgICAgIGlmICghdmlldykgewogICAgICAgIGNvbnNvbGUud2FybihgQ2Fubm90IG5hdmlnYXRlIHRvIHVua25vd24gdmlldzogJHt2aWV3SWR9YCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGNvbnN0IGNhbkxlYXZlID0gYXdhaXQgdGhpcy52aWV3UmVnaXN0cnkuY2FuTGVhdmVDdXJyZW50VmlldygpOwogICAgICBpZiAoY2FuTGVhdmUgIT09IHRydWUpIHsKICAgICAgICBpZiAodHlwZW9mIGNhbkxlYXZlID09PSAic3RyaW5nIikgewogICAgICAgICAgY29uc3QgY29uZmlybWVkID0gd2luZG93LmNvbmZpcm0oY2FuTGVhdmUpOwogICAgICAgICAgaWYgKCFjb25maXJtZWQpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLnZpZXdMaWZlY3ljbGUkLm5leHQoeyB0eXBlOiAibG9hZGluZyIsIHZpZXdJZCB9KTsKICAgICAgdHJ5IHsKICAgICAgICBhd2FpdCB0aGlzLmxvYWRWaWV3KHZpZXcsIHBhcmFtczIpOwogICAgICAgIGxldCByb3V0ZSA9IHZpZXcucm91dGUgfHwgdmlld0lkOwogICAgICAgIGlmIChwYXJhbXMyKSB7CiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXkyLCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHBhcmFtczIpKSB7CiAgICAgICAgICAgIHJvdXRlID0gcm91dGUucmVwbGFjZShgOiR7a2V5Mn1gLCB2YWwpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBuZXdIYXNoID0gYCMke3JvdXRlfWA7CiAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoICE9PSBuZXdIYXNoKSB7CiAgICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoeyB2aWV3SWQgfSwgIiIsIG5ld0hhc2gpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICB0aGlzLnZpZXdMaWZlY3ljbGUkLm5leHQoeyB0eXBlOiAibG9hZEVycm9yIiwgdmlld0lkLCBlcnJvciB9KTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogR2V0IHRoZSBjdXJyZW50IHZpZXcKICAgICAqLwogICAgZ2V0Q3VycmVudFZpZXcoKSB7CiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRWaWV3OwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgYWNjZXNzIHRvIHRoZSB2aWV3IHJlZ2lzdHJ5IChmb3IgYWR2YW5jZWQgdXNlKQogICAgICovCiAgICBnZXRWaWV3UmVnaXN0cnkoKSB7CiAgICAgIHJldHVybiB0aGlzLnZpZXdSZWdpc3RyeTsKICAgIH0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gVU5JRklFRCBDT05GSUdVUkFUSU9OCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8qKgogICAgICogQ29uZmlndXJlIHRoZSBhcHAgc2hlbGwgd2l0aCBhIHVuaWZpZWQgY29uZmlnIG9iamVjdAogICAgICovCiAgICBjb25maWd1cmUoY29uZmlnMykgewogICAgICBpZiAoY29uZmlnMy52aWV3cykgewogICAgICAgIHRoaXMudmlld1JlZ2lzdHJ5LmNsZWFyKCk7CiAgICAgICAgdGhpcy52aWV3UmVnaXN0cnkucmVnaXN0ZXJBbGwoY29uZmlnMy52aWV3cyk7CiAgICAgIH0KICAgICAgaWYgKGNvbmZpZzMuYnJhbmRpbmcpIHsKICAgICAgICB0aGlzLm1haW5tZW51TG9nb0ljb24gPSBjb25maWczLmJyYW5kaW5nLmxvZ29JY29uIHx8ICIiOwogICAgICAgIHRoaXMubWFpbm1lbnVMb2dvVGV4dCA9IGNvbmZpZzMuYnJhbmRpbmcubG9nb1RleHQgfHwgIiI7CiAgICAgIH0KICAgICAgaWYgKGNvbmZpZzMuYXBwQmFyKSB7CiAgICAgICAgdGhpcy5hcHBiYXJNZW51SXRlbXMgPSBjb25maWczLmFwcEJhci5tZW51SXRlbXMgfHwgW107CiAgICAgICAgdGhpcy5hcHBiYXJCcmVhZGNydW1icyA9IGNvbmZpZzMuYXBwQmFyLmJyZWFkY3J1bWJzIHx8ICIiOwogICAgICAgIHRoaXMuYXBwYmFyQnJlYWRjcnVtYlNlcGFyYXRvciA9IGNvbmZpZzMuYXBwQmFyLmJyZWFkY3J1bWJTZXBhcmF0b3IgfHwgIiA+ICI7CiAgICAgICAgdGhpcy5hcHBiYXJTaG93V2luZG93Q29udHJvbHMgPSBjb25maWczLmFwcEJhci5zaG93V2luZG93Q29udHJvbHMgPz8gdHJ1ZTsKICAgICAgICB0aGlzLmFwcGJhclNob3dTZWFyY2ggPSBjb25maWczLmFwcEJhci5zaG93U2VhcmNoID8/IGZhbHNlOwogICAgICAgIHRoaXMuYXBwYmFyVXNlciA9IGNvbmZpZzMuYXBwQmFyLnVzZXI7CiAgICAgICAgdGhpcy5hcHBiYXJQcm9maWxlTWVudUl0ZW1zID0gY29uZmlnMy5hcHBCYXIucHJvZmlsZU1lbnVJdGVtcyB8fCBbXTsKICAgICAgfQogICAgICBpZiAoY29uZmlnMy5tYWluTWVudSkgewogICAgICAgIGlmIChjb25maWczLm1haW5NZW51LnNlY3Rpb25zKSB7CiAgICAgICAgICB0aGlzLm1haW5tZW51R3JvdXBzID0gdGhpcy5idWlsZE1haW5NZW51RnJvbVNlY3Rpb25zKGNvbmZpZzMpOwogICAgICAgIH0gZWxzZSBpZiAoY29uZmlnMy5tYWluTWVudS5ncm91cHMpIHsKICAgICAgICAgIHRoaXMubWFpbm1lbnVHcm91cHMgPSBjb25maWczLm1haW5NZW51Lmdyb3VwczsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbmZpZzMubWFpbk1lbnUubG9nb0ljb24pIHsKICAgICAgICAgIHRoaXMubWFpbm1lbnVMb2dvSWNvbiA9IGNvbmZpZzMubWFpbk1lbnUubG9nb0ljb247CiAgICAgICAgfQogICAgICAgIGlmIChjb25maWczLm1haW5NZW51LmxvZ29UZXh0KSB7CiAgICAgICAgICB0aGlzLm1haW5tZW51TG9nb1RleHQgPSBjb25maWczLm1haW5NZW51LmxvZ29UZXh0OwogICAgICAgIH0KICAgICAgICBpZiAoY29uZmlnMy5tYWluTWVudS5ib3R0b21UYWJzKSB7CiAgICAgICAgICB0aGlzLm1haW5tZW51Qm90dG9tVGFicyA9IGNvbmZpZzMubWFpbk1lbnUuYm90dG9tVGFiczsKICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZzMubWFpbk1lbnUuYm90dG9tSXRlbXMpIHsKICAgICAgICAgIHRoaXMubWFpbm1lbnVCb3R0b21UYWJzID0gdGhpcy5idWlsZEJvdHRvbVRhYnNGcm9tSXRlbXMoY29uZmlnMy5tYWluTWVudS5ib3R0b21JdGVtcyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjb25maWczLmJvdHRvbUJhcikgewogICAgICAgIHRoaXMuc2V0Qm90dG9tQmFyVmlzaWJsZShjb25maWczLmJvdHRvbUJhci52aXNpYmxlID8/IHRydWUpOwogICAgICAgIGlmIChjb25maWczLmJvdHRvbUJhci53aWRnZXRzKSB7CiAgICAgICAgICBjb25maWczLmJvdHRvbUJhci53aWRnZXRzLmZvckVhY2goKHdpZGdldCkgPT4gewogICAgICAgICAgICB0aGlzLmJvdHRvbUJhci5hZGRXaWRnZXQod2lkZ2V0KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAoY29uZmlnMy5ib3R0b21CYXIuYWN0aW9ucykgewogICAgICAgICAgY29uZmlnMy5ib3R0b21CYXIuYWN0aW9ucy5mb3JFYWNoKChhY3Rpb24pID0+IHsKICAgICAgICAgICAgdGhpcy5ib3R0b21CYXIuYWRkQWN0aW9uKGFjdGlvbik7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5zZXR1cFJvdXRlckludGVncmF0aW9uKGNvbmZpZzMpOwogICAgICBpZiAoY29uZmlnMy5vblZpZXdDaGFuZ2UpIHsKICAgICAgICB0aGlzLnZpZXdDaGFuZ2VkJC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7CiAgICAgICAgICBjb25maWczLm9uVmlld0NoYW5nZShldmVudC52aWV3SWQsIGV2ZW50LnZpZXcpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGlmIChjb25maWczLm9uU2VhcmNoKSB7CiAgICAgICAgdGhpcy5zZWFyY2hDYWxsYmFjayA9IGNvbmZpZzMub25TZWFyY2g7CiAgICAgIH0KICAgICAgaWYgKGNvbmZpZzMuZGVmYXVsdFZpZXcpIHsKICAgICAgICB0aGlzLm5hdmlnYXRlVG9WaWV3KGNvbmZpZzMuZGVmYXVsdFZpZXcpOwogICAgICB9CiAgICB9CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFBSSVZBVEUgSEVMUEVSIE1FVEhPRFMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgc2V0dXBSb3V0ZXJJbnRlZ3JhdGlvbihjb25maWczKSB7CiAgICAgIGNvbnN0IGhhbmRsZUhhc2hDaGFuZ2UgPSAoKSA9PiB7CiAgICAgICAgY29uc3QgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpOwogICAgICAgIGlmICghaGFzaCkKICAgICAgICAgIHJldHVybjsKICAgICAgICBjb25zdCBtYXRjaDIgPSB0aGlzLnZpZXdSZWdpc3RyeS5maW5kQnlSb3V0ZShoYXNoKTsKICAgICAgICBpZiAobWF0Y2gyKSB7CiAgICAgICAgICB0aGlzLm5hdmlnYXRlVG9WaWV3KG1hdGNoMi52aWV3LmlkLCBtYXRjaDIucGFyYW1zKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoYXNoY2hhbmdlIiwgaGFuZGxlSGFzaENoYW5nZSk7CiAgICAgIHRoaXMucm91dGVyQ2xlYW51cCA9ICgpID0+IHsKICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiaGFzaGNoYW5nZSIsIGhhbmRsZUhhc2hDaGFuZ2UpOwogICAgICB9OwogICAgICBjb25zdCBjdXJyZW50SGFzaCA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpOwogICAgICBpZiAoY3VycmVudEhhc2gpIHsKICAgICAgICBjb25zdCBtYXRjaDIgPSB0aGlzLnZpZXdSZWdpc3RyeS5maW5kQnlSb3V0ZShjdXJyZW50SGFzaCk7CiAgICAgICAgaWYgKG1hdGNoMikgewogICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLm5hdmlnYXRlVG9WaWV3KG1hdGNoMi52aWV3LmlkLCBtYXRjaDIucGFyYW1zKSwgMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBidWlsZE1haW5NZW51RnJvbVNlY3Rpb25zKGNvbmZpZzMpIHsKICAgICAgaWYgKCFjb25maWczLm1haW5NZW51Py5zZWN0aW9ucykKICAgICAgICByZXR1cm4gW107CiAgICAgIHJldHVybiBjb25maWczLm1haW5NZW51LnNlY3Rpb25zLm1hcCgoc2VjdGlvbikgPT4gKHsKICAgICAgICBuYW1lOiBzZWN0aW9uLm5hbWUsCiAgICAgICAgaXRlbXM6IHNlY3Rpb24udmlld3MubWFwKCh2aWV3SWQpID0+IHsKICAgICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdSZWdpc3RyeS5nZXQodmlld0lkKTsKICAgICAgICAgIGlmICghdmlldykgewogICAgICAgICAgICBjb25zb2xlLndhcm4oYFZpZXcgIiR7dmlld0lkfSIgbm90IGZvdW5kIGluIHJlZ2lzdHJ5YCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAga2V5OiB2aWV3LmlkLAogICAgICAgICAgICBpY29uTmFtZTogdmlldy5pY29uTmFtZSwKICAgICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLm5hdmlnYXRlVG9WaWV3KHZpZXdJZCksCiAgICAgICAgICAgIGJhZGdlOiB2aWV3LmJhZGdlCiAgICAgICAgICB9OwogICAgICAgIH0pLmZpbHRlcihCb29sZWFuKQogICAgICB9KSk7CiAgICB9CiAgICBidWlsZEJvdHRvbVRhYnNGcm9tSXRlbXMoaXRlbXMpIHsKICAgICAgcmV0dXJuIGl0ZW1zLm1hcCgodmlld0lkKSA9PiB7CiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld1JlZ2lzdHJ5LmdldCh2aWV3SWQpOwogICAgICAgIGlmICghdmlldykgewogICAgICAgICAgY29uc29sZS53YXJuKGBWaWV3ICIke3ZpZXdJZH0iIG5vdCBmb3VuZCBpbiByZWdpc3RyeWApOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICBrZXk6IHZpZXcuaWQsCiAgICAgICAgICBpY29uTmFtZTogdmlldy5pY29uTmFtZSwKICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5uYXZpZ2F0ZVRvVmlldyh2aWV3SWQpCiAgICAgICAgfTsKICAgICAgfSkuZmlsdGVyKEJvb2xlYW4pOwogICAgfQogICAgYXN5bmMgbG9hZFZpZXcodmlldywgcGFyYW1zMikgewogICAgICBjb25zdCBwcmV2aW91c1ZpZXcgPSB0aGlzLmN1cnJlbnRWaWV3OwogICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdmlldzsKICAgICAgY29uc3Qgdmlld0NvbnRhaW5lciA9IHRoaXMubWFpbmNvbnRlbnQ/LnF1ZXJ5U2VsZWN0b3IoIi52aWV3LWNvbnRhaW5lciIpIHx8IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnZpZXctY29udGFpbmVyIik7CiAgICAgIGlmICh2aWV3Q29udGFpbmVyKSB7CiAgICAgICAgY29uc3QgZWxlbWVudDQgPSBhd2FpdCB0aGlzLnZpZXdSZWdpc3RyeS5hY3RpdmF0ZVZpZXcodmlldy5pZCwgdmlld0NvbnRhaW5lciwgcGFyYW1zMik7CiAgICAgICAgaWYgKGVsZW1lbnQ0KSB7CiAgICAgICAgICB0aGlzLnZpZXdMaWZlY3ljbGUkLm5leHQoewogICAgICAgICAgICB0eXBlOiAiYWN0aXZhdGVkIiwKICAgICAgICAgICAgdmlld0lkOiB2aWV3LmlkLAogICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50NCwKICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXMyCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHZpZXcuc2Vjb25kYXJ5TWVudSkgewogICAgICAgIHRoaXMuc2Vjb25kYXJ5bWVudUdyb3VwcyA9IHZpZXcuc2Vjb25kYXJ5TWVudTsKICAgICAgICB0aGlzLnNlY29uZGFyeW1lbnVIZWFkaW5nID0gdmlldy5uYW1lOwogICAgICB9CiAgICAgIGlmICh2aWV3LmNvbnRlbnRUYWJzKSB7CiAgICAgICAgdGhpcy5tYWluY29udGVudFRhYnMgPSB2aWV3LmNvbnRlbnRUYWJzOwogICAgICB9CiAgICAgIHRoaXMuc2V0TWFpbk1lbnVTZWxlY3Rpb24odmlldy5pZCk7CiAgICAgIGNvbnN0IGNoYW5nZUV2ZW50ID0gewogICAgICAgIHZpZXdJZDogdmlldy5pZCwKICAgICAgICB2aWV3LAogICAgICAgIHByZXZpb3VzVmlldywKICAgICAgICBwYXJhbXM6IHBhcmFtczIKICAgICAgfTsKICAgICAgdGhpcy52aWV3Q2hhbmdlZCQubmV4dChjaGFuZ2VFdmVudCk7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInZpZXctY2hhbmdlIiwgewogICAgICAgIGRldGFpbDogY2hhbmdlRXZlbnQsCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEVWRU5UIEhBTkRMRVJTIChJbnRlcm5hbCkKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgaGFuZGxlQXBwYmFyTWVudVNlbGVjdChlMTEpIHsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiYXBwYmFyLW1lbnUtc2VsZWN0IiwgewogICAgICAgIGRldGFpbDogZTExLmRldGFpbCwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGhhbmRsZUFwcGJhckJyZWFkY3J1bWJOYXZpZ2F0ZShlMTEpIHsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiYXBwYmFyLWJyZWFkY3J1bWItbmF2aWdhdGUiLCB7CiAgICAgICAgZGV0YWlsOiBlMTEuZGV0YWlsLAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgaGFuZGxlQXBwYmFyU2VhcmNoQ2xpY2soKSB7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImFwcGJhci1zZWFyY2gtY2xpY2siLCB7CiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBoYW5kbGVBcHBiYXJTZWFyY2hRdWVyeShlMTEpIHsKICAgICAgaWYgKHRoaXMuc2VhcmNoQ2FsbGJhY2spIHsKICAgICAgICB0aGlzLnNlYXJjaENhbGxiYWNrKGUxMS5kZXRhaWwucXVlcnkpOwogICAgICB9CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInNlYXJjaC1xdWVyeSIsIHsKICAgICAgICBkZXRhaWw6IGUxMS5kZXRhaWwsCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBoYW5kbGVBcHBiYXJVc2VyTWVudU9wZW4oKSB7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImFwcGJhci11c2VyLW1lbnUtb3BlbiIsIHsKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGhhbmRsZUFwcGJhclByb2ZpbGVNZW51U2VsZWN0KGUxMSkgewogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJhcHBiYXItcHJvZmlsZS1tZW51LXNlbGVjdCIsIHsKICAgICAgICBkZXRhaWw6IGUxMS5kZXRhaWwsCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBoYW5kbGVNYWlubWVudVRhYlNlbGVjdChlMTEpIHsKICAgICAgdGhpcy5tYWlubWVudVNlbGVjdGVkVGFiID0gZTExLmRldGFpbC50YWI7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm1haW5tZW51LXRhYi1zZWxlY3QiLCB7CiAgICAgICAgZGV0YWlsOiBlMTEuZGV0YWlsLAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgaGFuZGxlU2Vjb25kYXJ5bWVudUl0ZW1TZWxlY3QoZTExKSB7CiAgICAgIHRoaXMuc2Vjb25kYXJ5bWVudVNlbGVjdGVkSXRlbSA9IGUxMS5kZXRhaWwuaXRlbTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgic2Vjb25kYXJ5bWVudS1pdGVtLXNlbGVjdCIsIHsKICAgICAgICBkZXRhaWw6IGUxMS5kZXRhaWwsCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBoYW5kbGVNYWlubWVudUNvbGxhcHNlQ2hhbmdlKGUxMSkgewogICAgICB0aGlzLm1haW5tZW51Q29sbGFwc2VkID0gZTExLmRldGFpbC5jb2xsYXBzZWQ7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm1haW5tZW51LWNvbGxhcHNlLWNoYW5nZSIsIHsKICAgICAgICBkZXRhaWw6IGUxMS5kZXRhaWwsCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBoYW5kbGVTZWNvbmRhcnltZW51Q29sbGFwc2VDaGFuZ2UoZTExKSB7CiAgICAgIHRoaXMuc2Vjb25kYXJ5bWVudUNvbGxhcHNlZCA9IGUxMS5kZXRhaWwuY29sbGFwc2VkOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJzZWNvbmRhcnltZW51LWNvbGxhcHNlLWNoYW5nZSIsIHsKICAgICAgICBkZXRhaWw6IGUxMS5kZXRhaWwsCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBoYW5kbGVDb250ZW50VGFiU2VsZWN0KGUxMSkgewogICAgICB0aGlzLm1haW5jb250ZW50U2VsZWN0ZWRUYWIgPSBlMTEuZGV0YWlsLnRhYjsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY29udGVudC10YWItc2VsZWN0IiwgewogICAgICAgIGRldGFpbDogZTExLmRldGFpbCwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGhhbmRsZUNvbnRlbnRUYWJDbG9zZShlMTEpIHsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY29udGVudC10YWItY2xvc2UiLCB7CiAgICAgICAgZGV0YWlsOiBlMTEuZGV0YWlsLAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM1MChfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0FwcHVpMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtYXBwdWkvZGVlcy1tb2JpbGVuYXZpZ2F0aW9uL2RlZXMtbW9iaWxlbmF2aWdhdGlvbi5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2RlZXNfaWNvbigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU1MCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNTEgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNNb2JpbGVuYXZpZ2F0aW9uID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLW1vYmlsZW5hdmlnYXRpb24iKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9oZWFkaW5nX2RlY29yYXRvcnM7CiAgbGV0IF9oZWFkaW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaGVhZGluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWVudUl0ZW1zX2RlY29yYXRvcnM7CiAgbGV0IF9tZW51SXRlbXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tZW51SXRlbXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21vYmlsZU5hdlpJbmRleF9kZWNvcmF0b3JzOwogIGxldCBfbW9iaWxlTmF2WkluZGV4X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW9iaWxlTmF2WkluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNNb2JpbGVuYXZpZ2F0aW9uMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2hlYWRpbmdfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgIH0pXTsKICAgICAgX21lbnVJdGVtc19kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBBcnJheQogICAgICB9KV07CiAgICAgIF9tb2JpbGVOYXZaSW5kZXhfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlNTAodGhpcywgbnVsbCwgX2hlYWRpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaGVhZGluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaGVhZGluZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5oZWFkaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5oZWFkaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2hlYWRpbmdfaW5pdGlhbGl6ZXJzLCBfaGVhZGluZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTUwKHRoaXMsIG51bGwsIF9tZW51SXRlbXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWVudUl0ZW1zIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtZW51SXRlbXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWVudUl0ZW1zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tZW51SXRlbXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWVudUl0ZW1zX2luaXRpYWxpemVycywgX21lbnVJdGVtc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTUwKHRoaXMsIG51bGwsIF9tb2JpbGVOYXZaSW5kZXhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibW9iaWxlTmF2WkluZGV4Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtb2JpbGVOYXZaSW5kZXgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubW9iaWxlTmF2WkluZGV4LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tb2JpbGVOYXZaSW5kZXggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbW9iaWxlTmF2WkluZGV4X2luaXRpYWxpemVycywgX21vYmlsZU5hdlpJbmRleF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTUwKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc01vYmlsZW5hdmlnYXRpb24yID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIC8vIFNUQVRJQwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkFwcCBVSSJdOwogICAgc3RhdGljIGRlbW8gPSAoKSA9PiBiMmAKICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2s9JHsoKSA9PiB7CiAgICAgIERlZXNNb2JpbGVuYXZpZ2F0aW9uMi5jcmVhdGVBbmRTaG93KFsKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiRGFzaGJvYXJkIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmxheW91dC1kYXNoYm9hcmQiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoZGVlc01vYmlsZU5hdikgPT4gewogICAgICAgICAgICBjb25zb2xlLmxvZygiTmF2aWdhdGUgdG8gZGFzaGJvYXJkIik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIlByb2ZpbGUiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6dXNlciIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jIChkZWVzTW9iaWxlTmF2KSA9PiB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJOYXZpZ2F0ZSB0byBwcm9maWxlIik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIlNldHRpbmdzIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOnNldHRpbmdzIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKGRlZXNNb2JpbGVOYXYpID0+IHsKICAgICAgICAgICAgY29uc29sZS5sb2coIk5hdmlnYXRlIHRvIHNldHRpbmdzIik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIkhlbHAiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6aGVscC1jaXJjbGUiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoZGVlc01vYmlsZU5hdikgPT4gewogICAgICAgICAgICBjb25zb2xlLmxvZygiU2hvdyBoZWxwIik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIlNpZ24gT3V0IiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmxvZy1vdXQiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoZGVlc01vYmlsZU5hdikgPT4gewogICAgICAgICAgICBjb25zb2xlLmxvZygiU2lnbiBvdXQiKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBdKTsKICAgIH19Pk9wZW4gTW9iaWxlIE5hdmlnYXRpb248L2RlZXMtYnV0dG9uPgogIGA7CiAgICBzdGF0aWMgc2luZ2xldG9uUmVmOwogICAgc3RhdGljIGFzeW5jIGNyZWF0ZUFuZFNob3cobWVudUl0ZW1zQXJnKSB7CiAgICAgIGlmICghdGhpcy5zaW5nbGV0b25SZWYpIHsKICAgICAgICB0aGlzLnNpbmdsZXRvblJlZiA9IG5ldyBEZWVzTW9iaWxlbmF2aWdhdGlvbjIoKTsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh0aGlzLnNpbmdsZXRvblJlZik7CiAgICAgICAgYXdhaXQgdGhpcy5zaW5nbGV0b25SZWYuaW5pdCgpOwogICAgICB9CiAgICAgIHRoaXMuc2luZ2xldG9uUmVmLm1lbnVJdGVtcyA9IG1lbnVJdGVtc0FyZzsKICAgICAgYXdhaXQgdGhpcy5zaW5nbGV0b25SZWYucmVhZHlEZWZlcnJlZC5wcm9taXNlOwogICAgICB0aGlzLnNpbmdsZXRvblJlZi5zaG93KCk7CiAgICAgIHJldHVybiB0aGlzLnNpbmdsZXRvblJlZjsKICAgIH0KICAgICNoZWFkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczUxKHRoaXMsIF9oZWFkaW5nX2luaXRpYWxpemVycywgYE1lbnVgKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgaGVhZGluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2hlYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBoZWFkaW5nKHZhbHVlMikgewogICAgICB0aGlzLiNoZWFkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWVudUl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1MSh0aGlzLCBfaGVhZGluZ19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTEodGhpcywgX21lbnVJdGVtc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgbWVudUl0ZW1zKCkgewogICAgICByZXR1cm4gdGhpcy4jbWVudUl0ZW1zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWVudUl0ZW1zKHZhbHVlMikgewogICAgICB0aGlzLiNtZW51SXRlbXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtb2JpbGVOYXZaSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczUxKHRoaXMsIF9tZW51SXRlbXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczUxKHRoaXMsIF9tb2JpbGVOYXZaSW5kZXhfaW5pdGlhbGl6ZXJzLCAxZTMpKTsKICAgIGdldCBtb2JpbGVOYXZaSW5kZXgoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtb2JpbGVOYXZaSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtb2JpbGVOYXZaSW5kZXgodmFsdWUyKSB7CiAgICAgIHRoaXMuI21vYmlsZU5hdlpJbmRleF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgcmVhZHlEZWZlcnJlZCA9IChfX3J1bkluaXRpYWxpemVyczUxKHRoaXMsIF9tb2JpbGVOYXZaSW5kZXhfZXh0cmFJbml0aWFsaXplcnMpLCBkaXN0X3RzX2V4cG9ydHMyOS5wbHVnaW5zLnNtYXJ0cHJvbWlzZS5kZWZlcigpKTsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgfQogICAgLyoqCiAgICAgKiBpbml0cyB0aGUgbW9iaWxlIG5hdmlnYXRpb24KICAgICAqLwogICAgYXN5bmMgaW5pdCgpIHsKICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgdGhpcy5yZWFkeURlZmVycmVkLnJlc29sdmUoKTsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1mYW1pbHk6ICR7Y3NzR2Vpc3RGb250RmFtaWx5fTsKICAgICAgfQoKICAgICAgLm1haW4gewogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtYXgtd2lkdGg6IDMyMHB4OwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgICAgICB6LWluZGV4OiB2YXIoLS16LWluZGV4KTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHJpZ2h0OiAwcHg7CiAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgYm90dG9tOiAwcHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzA5MDkwYiIpfTsKICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgYm94LXNoYWRvdzogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIi0yMHB4IDAgMjVweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4xKSwgLTEwcHggMCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjA0KSIsICItMjBweCAwIDI1cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMyksIC0xMHB4IDAgMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSIpfTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KCiAgICAgIC5tYWluLnNob3cgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhbGw7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDBweCk7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmhlYWRlciB7CiAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgfQoKICAgICAgLmhlYWRpbmcgewogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMmVtOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgLm1lbnUtY29udGFpbmVyIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICB9CgogICAgICAubWVudUl0ZW0gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEycHg7CiAgICAgICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjMjcyNzJhIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICB9CgogICAgICAubWVudUl0ZW06YWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjM2YzZjQ2Iil9OwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OCk7CiAgICAgIH0KCiAgICAgIC5tZW51SXRlbSBkZWVzLWljb24gewogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjNzE3MTdhIil9OwogICAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5tZW51SXRlbTpob3ZlciBkZWVzLWljb24gewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICB9CgogICAgICAubWVudUl0ZW0tdGV4dCB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTsKICAgICAgfQoKICAgICAgLm1lbnVJdGVtLWRpdmlkZXIgewogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgICAgbWFyZ2luOiA4cHggMTZweDsKICAgICAgfQoKICAgICAgLyogTW9iaWxlIHJlc3BvbnNpdmVuZXNzICovCiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA0MDBweCkgewogICAgICAgIC5tYWluIHsKICAgICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgICB3aWR0aDogODV2dzsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIEFuaW1hdGlvbiBmb3IgbWVudSBpdGVtcyAqLwogICAgICBAa2V5ZnJhbWVzIHNsaWRlSW5SaWdodCB7CiAgICAgICAgZnJvbSB7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDIwcHgpOwogICAgICAgIH0KICAgICAgICB0byB7CiAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLm1haW4uc2hvdyAubWVudUl0ZW0gewogICAgICAgIGFuaW1hdGlvbjogc2xpZGVJblJpZ2h0IDAuM3MgZWFzZS1vdXQgZm9yd2FyZHM7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiBjYWxjKHZhcigtLWl0ZW0taW5kZXgsIDApICogMC4wNXMpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC8qIFNjcm9sbGJhciBzdHlsaW5nICovCiAgICAgIC5tZW51LWNvbnRhaW5lcjo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIHdpZHRoOiA2cHg7CiAgICAgIH0KCiAgICAgIC5tZW51LWNvbnRhaW5lcjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAubWVudS1jb250YWluZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjM2YzZjQ2Iil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgfQoKICAgICAgLm1lbnUtY29udGFpbmVyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkMWQ1ZGIiLCAiIzUyNTI1YiIpfTsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8c3R5bGU+CiAgICAgICAgLm1haW4gewogICAgICAgICAgLS16LWluZGV4OiAke3RoaXMubW9iaWxlTmF2WkluZGV4fTsKICAgICAgICB9CiAgICAgIDwvc3R5bGU+CiAgICAgIDxkaXYgY2xhc3M9Im1haW4iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICA8aDIgY2xhc3M9ImhlYWRpbmciPiR7dGhpcy5oZWFkaW5nfTwvaDI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibWVudS1jb250YWluZXIiPgogICAgICAgICAgJHt0aGlzLm1lbnVJdGVtcy5tYXAoKG1lbnVJdGVtLCBpbmRleDIpID0+IHsKICAgICAgICBpZiAoImRpdmlkZXIiIGluIG1lbnVJdGVtICYmIG1lbnVJdGVtLmRpdmlkZXIpIHsKICAgICAgICAgIHJldHVybiBiMmA8ZGl2IGNsYXNzPSJtZW51SXRlbS1kaXZpZGVyIj48L2Rpdj5gOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgY2xhc3M9Im1lbnVJdGVtIgogICAgICAgICAgICAgICAgc3R5bGU9Ii0taXRlbS1pbmRleDogJHtpbmRleDJ9IgogICAgICAgICAgICAgICAgQGNsaWNrPSIkeygpID0+IHsKICAgICAgICAgIHRoaXMuaGlkZSgpOwogICAgICAgICAgbWVudUl0ZW0uYWN0aW9uKHRoaXMpOwogICAgICAgIH19IgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICR7bWVudUl0ZW0uaWNvbk5hbWUgPyBiMmAKICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0ke21lbnVJdGVtLmljb25OYW1lfSBzaXplPSIyMCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWVudUl0ZW0tdGV4dCI+JHttZW51SXRlbS5uYW1lfTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYDsKICAgICAgfSl9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHdpbmRvd0xheWVyOwogICAgLyoqCiAgICAgKiBpbml0cyB0aGUgc2hvdwogICAgICovCiAgICBhc3luYyBzaG93KCkgewogICAgICBjb25zdCBkb210b29scyA9IGF3YWl0IHRoaXMuZG9tdG9vbHNQcm9taXNlOwogICAgICBjb25zdCBtYWluID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5tYWluIik7CiAgICAgIGlmICghdGhpcy53aW5kb3dMYXllcikgewogICAgICAgIHRoaXMud2luZG93TGF5ZXIgPSBhd2FpdCBEZWVzV2luZG93TGF5ZXIuY3JlYXRlQW5kU2hvdyh7CiAgICAgICAgICBibHVyOiB0cnVlCiAgICAgICAgfSk7CiAgICAgICAgdGhpcy53aW5kb3dMYXllci5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgICAgIHRoaXMuaGlkZSgpOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHRoaXMud2luZG93TGF5ZXIpOwogICAgICAgIGF3YWl0IHRoaXMud2luZG93TGF5ZXIuc2hvdygpOwogICAgICB9CiAgICAgIHRoaXMubW9iaWxlTmF2WkluZGV4ID0gekluZGV4UmVnaXN0cnkuZ2V0TmV4dFpJbmRleCgpOwogICAgICB6SW5kZXhSZWdpc3RyeS5yZWdpc3Rlcih0aGlzLCB0aGlzLm1vYmlsZU5hdlpJbmRleCk7CiAgICAgIGF3YWl0IGRvbXRvb2xzLmNvbnZlbmllbmNlLnNtYXJ0ZGVsYXkuZGVsYXlGb3IoMTApOwogICAgICBtYWluLmNsYXNzTGlzdC5hZGQoInNob3ciKTsKICAgIH0KICAgIC8qKgogICAgICogaW5pdHMgdGhlIGhpZGUgZnVuY3Rpb24KICAgICAqLwogICAgYXN5bmMgaGlkZSgpIHsKICAgICAgY29uc3QgZG9tdG9vbHMgPSBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgY29uc3QgbWFpbiA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIubWFpbiIpOwogICAgICBtYWluLmNsYXNzTGlzdC5yZW1vdmUoInNob3ciKTsKICAgICAgekluZGV4UmVnaXN0cnkudW5yZWdpc3Rlcih0aGlzKTsKICAgICAgaWYgKHRoaXMud2luZG93TGF5ZXIpIHsKICAgICAgICBhd2FpdCB0aGlzLndpbmRvd0xheWVyLmRlc3Ryb3koKTsKICAgICAgfQogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHpJbmRleFJlZ2lzdHJ5LnVucmVnaXN0ZXIodGhpcyk7CiAgICAgIGlmICh0aGlzLndpbmRvd0xheWVyKSB7CiAgICAgICAgYXdhaXQgdGhpcy53aW5kb3dMYXllci5kZXN0cm95KCk7CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNTEoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNNb2JpbGVuYXZpZ2F0aW9uMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtYnV0dG9uL2RlZXMtYnV0dG9uLWV4aXQvZGVlcy1idXR0b24tZXhpdC5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgX19lc0RlY29yYXRlNTEgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczUyID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzQnV0dG9uRXhpdCA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1idXR0b24tZXhpdCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3NpemVfZGVjb3JhdG9yczsKICBsZXQgX3NpemVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaXplX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNCdXR0b25FeGl0MiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3NpemVfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogTnVtYmVyCiAgICAgIH0pXTsKICAgICAgX19lc0RlY29yYXRlNTEodGhpcywgbnVsbCwgX3NpemVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2l6ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2l6ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaXplLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaXplID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NpemVfaW5pdGlhbGl6ZXJzLCBfc2l6ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTUxKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0J1dHRvbkV4aXQyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIC8vIERFTU8KICAgIHN0YXRpYyBkZW1vID0gKCkgPT4gYjJgCiAgICA8ZGVlcy1idXR0b24tZXhpdD48L2RlZXMtYnV0dG9uLWV4aXQ+CiAgYDsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJCdXR0b24iXTsKICAgICNzaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczUyKHRoaXMsIF9zaXplX2luaXRpYWxpemVycywgMjQpOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCBzaXplKCkgewogICAgICByZXR1cm4gdGhpcy4jc2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNpemUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0eWxlcyA9IChfX3J1bkluaXRpYWxpemVyczUyKHRoaXMsIF9zaXplX2V4dHJhSW5pdGlhbGl6ZXJzKSwgWwogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCgogICAgYAogICAgXSk7CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPHN0eWxlPgogICAgICAgIC5tYWluY29udGFpbmVyIHsKICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgIHdpZHRoOiAke3RoaXMuc2l6ZX1weDsKICAgICAgICAgIGhlaWdodDogJHt0aGlzLnNpemV9cHg7CiAgICAgICAgfQogICAgICA8L3N0eWxlPgogICAgICA8ZGl2IGNsYXNzPSJtYWluY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJmaXJzdExpbmUiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNlY29uZExpbmUiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczUyKF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzQnV0dG9uRXhpdDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWJ1dHRvbi9kZWVzLWJ1dHRvbi1ncm91cC9kZWVzLWJ1dHRvbi1ncm91cC5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkZW1vRnVuYzM1ID0gKCkgPT4gewogIHJldHVybiBiMmAKICAgIDxzdHlsZT4KICAgICAgJHtpYAogICAgICAgIC5kZW1vQm94IHsKICAgICAgICAgIGJhY2tncm91bmQ6ICMwMDAwMDA7CiAgICAgICAgICBwYWRkaW5nOiA0MHB4OwogICAgICAgICAgbWluLWhlaWdodDogMTAwdmg7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIH0KCiAgICAgICAgLmRlbW8tc2VjdGlvbiB7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAzMnB4OwogICAgICAgIH0KCiAgICAgICAgLmRlbW8tdGl0bGUgewogICAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgICAgIGZvbnQtZmFtaWx5OiAnR2Vpc3QgU2FucycsIHNhbnMtc2VyaWY7CiAgICAgICAgfQoKICAgICAgICAuZGVtby1kZXNjcmlwdGlvbiB7CiAgICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCBzYW5zLXNlcmlmOwogICAgICAgIH0KICAgICAgYH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJkZW1vQm94Ij4KICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPkJhc2ljIEJ1dHRvbiBHcm91cHM8L2gyPgogICAgICAgIDxwIGNsYXNzPSJkZW1vLWRlc2NyaXB0aW9uIj5CdXR0b24gZ3JvdXBzIHdpdGhvdXQgbGFiZWxzIGZvciBzaW1wbGUgZ3JvdXBpbmc8L3A+CiAgICAgICAgCiAgICAgICAgPGRlZXMtYnV0dG9uLWdyb3VwPgogICAgICAgICAgPGRlZXMtYnV0dG9uPk9wdGlvbiAxPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbj5PcHRpb24gMjwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24+T3B0aW9uIDM8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGVlcy1idXR0b24tZ3JvdXA+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPkxhYmVsZWQgQnV0dG9uIEdyb3VwczwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImRlbW8tZGVzY3JpcHRpb24iPkJ1dHRvbiBncm91cHMgd2l0aCBkZXNjcmlwdGl2ZSBsYWJlbHM8L3A+CiAgICAgICAgCiAgICAgICAgPGRlZXMtYnV0dG9uLWdyb3VwIGxhYmVsPSJWaWV3IE1vZGU6Ij4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJoaWdobGlnaHRlZCI+R3JpZDwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24+TGlzdDwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24+Q2FyZHM8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGVlcy1idXR0b24tZ3JvdXA+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPk11bHRpcGxlIEdyb3VwczwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImRlbW8tZGVzY3JpcHRpb24iPk11bHRpcGxlIGJ1dHRvbiBncm91cHMgdXNlZCB0b2dldGhlcjwvcD4KICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBnYXA6IDE2cHg7IGZsZXgtd3JhcDogd3JhcDsiPgogICAgICAgICAgPGRlZXMtYnV0dG9uLWdyb3VwIGxhYmVsPSJEYXRhc2V0OiI+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJoaWdobGlnaHRlZCI+U3lzdGVtPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPk5ldHdvcms8L2RlZXMtYnV0dG9uPgogICAgICAgICAgICA8ZGVlcy1idXR0b24+U2FsZXM8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPC9kZWVzLWJ1dHRvbi1ncm91cD4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtYnV0dG9uLWdyb3VwIGxhYmVsPSJUaW1lIFJhbmdlOiI+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj4xSDwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJoaWdobGlnaHRlZCI+MjRIPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPjdEPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPjMwRDwvZGVlcy1idXR0b24+CiAgICAgICAgICA8L2RlZXMtYnV0dG9uLWdyb3VwPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1idXR0b24tZ3JvdXAgbGFiZWw9IkFjdGlvbnM6Ij4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPlJlZnJlc2g8L2RlZXMtYnV0dG9uPgogICAgICAgICAgICA8ZGVlcy1idXR0b24+RXhwb3J0PC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDwvZGVlcy1idXR0b24tZ3JvdXA+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPlZlcnRpY2FsIEJ1dHRvbiBHcm91cHM8L2gyPgogICAgICAgIDxwIGNsYXNzPSJkZW1vLWRlc2NyaXB0aW9uIj5CdXR0b24gZ3JvdXBzIHdpdGggdmVydGljYWwgbGF5b3V0PC9wPgogICAgICAgIAogICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGdhcDogMjRweDsiPgogICAgICAgICAgPGRlZXMtYnV0dG9uLWdyb3VwIGRpcmVjdGlvbj0idmVydGljYWwiIGxhYmVsPSJOYXZpZ2F0aW9uOiI+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj5EYXNoYm9hcmQ8L2RlZXMtYnV0dG9uPgogICAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iaGlnaGxpZ2h0ZWQiPkFuYWx5dGljczwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj5SZXBvcnRzPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPlNldHRpbmdzPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDwvZGVlcy1idXR0b24tZ3JvdXA+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWJ1dHRvbi1ncm91cCBkaXJlY3Rpb249InZlcnRpY2FsIj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPkFkZCBJdGVtPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPkVkaXQgSXRlbTwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj5EZWxldGUgSXRlbTwvZGVlcy1idXR0b24+CiAgICAgICAgICA8L2RlZXMtYnV0dG9uLWdyb3VwPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgyIGNsYXNzPSJkZW1vLXRpdGxlIj5NaXhlZCBCdXR0b24gVHlwZXM8L2gyPgogICAgICAgIDxwIGNsYXNzPSJkZW1vLWRlc2NyaXB0aW9uIj5EaWZmZXJlbnQgYnV0dG9uIHR5cGVzIHdpdGhpbiBncm91cHM8L3A+CiAgICAgICAgCiAgICAgICAgPGRlZXMtYnV0dG9uLWdyb3VwIGxhYmVsPSJTdGF0dXM6Ij4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiB0eXBlPSJzdWNjZXNzIj5BY3RpdmU8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uPlBlbmRpbmc8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9ImRhbmdlciI+SW5hY3RpdmU8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGVlcy1idXR0b24tZ3JvdXA+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgYDsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1idXR0b24vZGVlcy1idXR0b24tZ3JvdXAvZGVlcy1idXR0b24tZ3JvdXAuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF9kaXN0X3RzMjkoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlNTIgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczUzID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzQnV0dG9uR3JvdXAgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtYnV0dG9uLWdyb3VwIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfbGFiZWxfZGVjb3JhdG9yczsKICBsZXQgX2xhYmVsX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGFiZWxfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RpcmVjdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfZGlyZWN0aW9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGlyZWN0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNCdXR0b25Hcm91cDIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9sYWJlbF9kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfZGlyZWN0aW9uX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTUyKHRoaXMsIG51bGwsIF9sYWJlbF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsYWJlbCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibGFiZWwiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubGFiZWwsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxhYmVsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xhYmVsX2luaXRpYWxpemVycywgX2xhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTIodGhpcywgbnVsbCwgX2RpcmVjdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkaXJlY3Rpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRpcmVjdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5kaXJlY3Rpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmRpcmVjdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kaXJlY3Rpb25faW5pdGlhbGl6ZXJzLCBfZGlyZWN0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTIobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzQnV0dG9uR3JvdXAyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMzNTsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJCdXR0b24iXTsKICAgICNsYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM1Myh0aGlzLCBfbGFiZWxfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICBnZXQgbGFiZWwoKSB7CiAgICAgIHJldHVybiB0aGlzLiNsYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxhYmVsKHZhbHVlMikgewogICAgICB0aGlzLiNsYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2RpcmVjdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTModGhpcywgX2xhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1Myh0aGlzLCBfZGlyZWN0aW9uX2luaXRpYWxpemVycywgImhvcml6b250YWwiKSk7CiAgICBnZXQgZGlyZWN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy4jZGlyZWN0aW9uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZGlyZWN0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNkaXJlY3Rpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBfX3J1bkluaXRpYWxpemVyczUzKHRoaXMsIF9kaXJlY3Rpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBkb210b29sc19lbGVtZW50YmFzaWNfZXhwb3J0cy5zZXR1cCgpOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIC5idXR0b24tZ3JvdXAgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wNSkiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgIH0KCiAgICAgIC5idXR0b24tZ3JvdXAudmVydGljYWwgewogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICAgIH0KCiAgICAgIC5sYWJlbCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNjY2IiwgIiM5OTkiKX07CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtZmFtaWx5OiAnR2Vpc3QgU2FucycsIHNhbnMtc2VyaWY7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA4cHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLmJ1dHRvbi1ncm91cC52ZXJ0aWNhbCAubGFiZWwgewogICAgICAgIG1hcmdpbi1yaWdodDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICAgIH0KCiAgICAgIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iYnV0dG9uLWdyb3VwICR7dGhpcy5kaXJlY3Rpb259Ij4KICAgICAgICAke3RoaXMubGFiZWwgPyBiMmA8c3BhbiBjbGFzcz0ibGFiZWwiPiR7dGhpcy5sYWJlbH08L3NwYW4+YCA6ICIifQogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM1MyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0J1dHRvbkdyb3VwMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtY2hhcnQvZGVlcy1jaGFydC1hcmVhL2RlbW8uanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIGRlbW9GdW5jMzYgPSAoKSA9PiB7CiAgY29uc3QgaW5pdGlhbERhdGFzZXRzID0gewogICAgc3lzdGVtOiB7CiAgICAgIGxhYmVsOiAiU3lzdGVtIFVzYWdlICglKSIsCiAgICAgIHNlcmllczogWwogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJDUFUiLAogICAgICAgICAgZGF0YTogWwogICAgICAgICAgICB7IHg6IG5ldyBEYXRlKERhdGUubm93KCkgLSAzZTUpLnRvSVNPU3RyaW5nKCksIHk6IDI1IH0sCiAgICAgICAgICAgIHsgeDogbmV3IERhdGUoRGF0ZS5ub3coKSAtIDI0ZTQpLnRvSVNPU3RyaW5nKCksIHk6IDMwIH0sCiAgICAgICAgICAgIHsgeDogbmV3IERhdGUoRGF0ZS5ub3coKSAtIDE4ZTQpLnRvSVNPU3RyaW5nKCksIHk6IDI4IH0sCiAgICAgICAgICAgIHsgeDogbmV3IERhdGUoRGF0ZS5ub3coKSAtIDEyZTQpLnRvSVNPU3RyaW5nKCksIHk6IDM1IH0sCiAgICAgICAgICAgIHsgeDogbmV3IERhdGUoRGF0ZS5ub3coKSAtIDZlNCkudG9JU09TdHJpbmcoKSwgeTogMzIgfSwKICAgICAgICAgICAgeyB4OiAoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCksIHk6IDM4IH0KICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJNZW1vcnkiLAogICAgICAgICAgZGF0YTogWwogICAgICAgICAgICB7IHg6IG5ldyBEYXRlKERhdGUubm93KCkgLSAzZTUpLnRvSVNPU3RyaW5nKCksIHk6IDQ1IH0sCiAgICAgICAgICAgIHsgeDogbmV3IERhdGUoRGF0ZS5ub3coKSAtIDI0ZTQpLnRvSVNPU3RyaW5nKCksIHk6IDQ4IH0sCiAgICAgICAgICAgIHsgeDogbmV3IERhdGUoRGF0ZS5ub3coKSAtIDE4ZTQpLnRvSVNPU3RyaW5nKCksIHk6IDQ2IH0sCiAgICAgICAgICAgIHsgeDogbmV3IERhdGUoRGF0ZS5ub3coKSAtIDEyZTQpLnRvSVNPU3RyaW5nKCksIHk6IDUyIH0sCiAgICAgICAgICAgIHsgeDogbmV3IERhdGUoRGF0ZS5ub3coKSAtIDZlNCkudG9JU09TdHJpbmcoKSwgeTogNTAgfSwKICAgICAgICAgICAgeyB4OiAoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCksIHk6IDU1IH0KICAgICAgICAgIF0KICAgICAgICB9CiAgICAgIF0KICAgIH0KICB9OwogIGNvbnN0IGluaXRpYWxGb3JtYXR0ZXJzID0gewogICAgc3lzdGVtOiAodmFsKSA9PiBgJHt2YWx9JWAKICB9OwogIHJldHVybiBiMmAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgICBjb25zdCBjaGFydEVsZW1lbnQgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoIiNtYWluLWNoYXJ0Iik7CiAgICBjb25zdCBjb25uZWN0aW9uc0NoYXJ0RWxlbWVudCA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiI2Nvbm5lY3Rpb25zLWNoYXJ0Iik7CiAgICBsZXQgaW50ZXJ2YWxJZDsKICAgIGxldCBjb25uZWN0aW9uc0ludGVydmFsSWQ7CiAgICBsZXQgY3VycmVudERhdGFzZXQgPSAic3lzdGVtIjsKICAgIGNvbnN0IGZvcm1hdHRlcnMyID0gewogICAgICBzeXN0ZW06ICh2YWwpID0+IGAke3ZhbH0lYCwKICAgICAgbmV0d29yazogKHZhbCkgPT4gYCR7dmFsfSBNYnBzYCwKICAgICAgc2FsZXM6ICh2YWwpID0+IGAkJHt2YWwudG9Mb2NhbGVTdHJpbmcoKX1gCiAgICB9OwogICAgY29uc3QgVElNRV9XSU5ET1cgPSAyICogNjAgKiAxZTM7CiAgICBjb25zdCBVUERBVEVfSU5URVJWQUwgPSAxZTM7CiAgICBjb25zdCBEQVRBX1BPSU5UX0lOVEVSVkFMID0gNWUzOwogICAgbGV0IHByZXZpb3VzVmFsdWVzID0gewogICAgICBjcHU6IDMwLAogICAgICBtZW1vcnk6IDUwLAogICAgICBkb3dubG9hZDogMTUwLAogICAgICB1cGxvYWQ6IDMwLAogICAgICBjb25uZWN0aW9uczogMTUwCiAgICB9OwogICAgY29uc3QgZ2VuZXJhdGVJbml0aWFsRGF0YSA9IChiYXNlVmFsdWUsIHZhcmlhbmNlLCBpbnRlcnZhbDMgPSBEQVRBX1BPSU5UX0lOVEVSVkFMKSA9PiB7CiAgICAgIGNvbnN0IGRhdGEgPSBbXTsKICAgICAgY29uc3Qgbm93MiA9IERhdGUubm93KCk7CiAgICAgIGNvbnN0IHBvaW50Q291bnQgPSBNYXRoLmZsb29yKFRJTUVfV0lORE9XIC8gaW50ZXJ2YWwzKTsKICAgICAgZm9yIChsZXQgaTExID0gcG9pbnRDb3VudDsgaTExID49IDA7IGkxMS0tKSB7CiAgICAgICAgY29uc3QgdGltZXN0YW1wMiA9IG5ldyBEYXRlKG5vdzIgLSBpMTEgKiBpbnRlcnZhbDMpLnRvSVNPU3RyaW5nKCk7CiAgICAgICAgY29uc3QgdmFsdWUyID0gYmFzZVZhbHVlICsgKE1hdGgucmFuZG9tKCkgLSAwLjUpICogdmFyaWFuY2U7CiAgICAgICAgZGF0YS5wdXNoKHsgeDogdGltZXN0YW1wMiwgeTogTWF0aC5yb3VuZCh2YWx1ZTIpIH0pOwogICAgICB9CiAgICAgIHJldHVybiBkYXRhOwogICAgfTsKICAgIGNvbnN0IGRhdGFzZXRzID0gewogICAgICBzeXN0ZW06IHsKICAgICAgICBsYWJlbDogIlN5c3RlbSBVc2FnZSAoJSkiLAogICAgICAgIHNlcmllczogWwogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiQ1BVIiwKICAgICAgICAgICAgZGF0YTogZ2VuZXJhdGVJbml0aWFsRGF0YShwcmV2aW91c1ZhbHVlcy5jcHUsIDEwKQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgbmFtZTogIk1lbW9yeSIsCiAgICAgICAgICAgIGRhdGE6IGdlbmVyYXRlSW5pdGlhbERhdGEocHJldmlvdXNWYWx1ZXMubWVtb3J5LCA4KQogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfSwKICAgICAgbmV0d29yazogewogICAgICAgIGxhYmVsOiAiTmV0d29yayBUcmFmZmljIChNYnBzKSIsCiAgICAgICAgc2VyaWVzOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIG5hbWU6ICJEb3dubG9hZCIsCiAgICAgICAgICAgIGRhdGE6IGdlbmVyYXRlSW5pdGlhbERhdGEocHJldmlvdXNWYWx1ZXMuZG93bmxvYWQsIDMwKQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgbmFtZTogIlVwbG9hZCIsCiAgICAgICAgICAgIGRhdGE6IGdlbmVyYXRlSW5pdGlhbERhdGEocHJldmlvdXNWYWx1ZXMudXBsb2FkLCAxMCkKICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH0sCiAgICAgIHNhbGVzOiB7CiAgICAgICAgbGFiZWw6ICJTYWxlcyBBbmFseXRpY3MiLAogICAgICAgIHNlcmllczogWwogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiUmV2ZW51ZSIsCiAgICAgICAgICAgIGRhdGE6IFsKICAgICAgICAgICAgICB7IHg6ICIyMDI1LTAxLTAxIiwgeTogNDVlMyB9LAogICAgICAgICAgICAgIHsgeDogIjIwMjUtMDEtMDIiLCB5OiA1MmUzIH0sCiAgICAgICAgICAgICAgeyB4OiAiMjAyNS0wMS0wMyIsIHk6IDQ4ZTMgfSwKICAgICAgICAgICAgICB7IHg6ICIyMDI1LTAxLTA0IiwgeTogNjFlMyB9LAogICAgICAgICAgICAgIHsgeDogIjIwMjUtMDEtMDUiLCB5OiA1OGUzIH0sCiAgICAgICAgICAgICAgeyB4OiAiMjAyNS0wMS0wNiIsIHk6IDY1ZTMgfQogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiUHJvZml0IiwKICAgICAgICAgICAgZGF0YTogWwogICAgICAgICAgICAgIHsgeDogIjIwMjUtMDEtMDEiLCB5OiAxMmUzIH0sCiAgICAgICAgICAgICAgeyB4OiAiMjAyNS0wMS0wMiIsIHk6IDE0ZTMgfSwKICAgICAgICAgICAgICB7IHg6ICIyMDI1LTAxLTAzIiwgeTogMTFlMyB9LAogICAgICAgICAgICAgIHsgeDogIjIwMjUtMDEtMDQiLCB5OiAxOGUzIH0sCiAgICAgICAgICAgICAgeyB4OiAiMjAyNS0wMS0wNSIsIHk6IDE2ZTMgfSwKICAgICAgICAgICAgICB7IHg6ICIyMDI1LTAxLTA2IiwgeTogMmU0IH0KICAgICAgICAgICAgXQogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfQogICAgfTsKICAgIGNvbnN0IGdldE5leHRWYWx1ZSA9IChjdXJyZW50LCBtaW4zLCBtYXgzLCBtYXhDaGFuZ2UgPSA1KSA9PiB7CiAgICAgIGNvbnN0IGNoYW5nZSA9IChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIG1heENoYW5nZSAqIDI7CiAgICAgIGxldCBuZXdWYWx1ZSA9IGN1cnJlbnQgKyBjaGFuZ2U7CiAgICAgIGNvbnN0IGNlbnRlciA9IChtaW4zICsgbWF4MykgLyAyOwogICAgICBjb25zdCBwcmVzc3VyZSA9IChjZW50ZXIgLSBuZXdWYWx1ZSkgKiAwLjE7CiAgICAgIG5ld1ZhbHVlICs9IHByZXNzdXJlOwogICAgICBuZXdWYWx1ZSA9IE1hdGgubWF4KG1pbjMsIE1hdGgubWluKG1heDMsIG5ld1ZhbHVlKSk7CiAgICAgIHJldHVybiBNYXRoLnJvdW5kKG5ld1ZhbHVlKTsKICAgIH07CiAgICBsZXQgbGFzdERhdGFQb2ludFRpbWUgPSBEYXRlLm5vdygpOwogICAgbGV0IGNvbm5lY3Rpb25zTGFzdFVwZGF0ZSA9IERhdGUubm93KCk7CiAgICBjb25zdCBhZGRSZWFsdGltZURhdGEgPSAoKSA9PiB7CiAgICAgIGlmICghY2hhcnRFbGVtZW50KQogICAgICAgIHJldHVybjsKICAgICAgY29uc3Qgbm93MiA9IERhdGUubm93KCk7CiAgICAgIGNvbnN0IHNob3VsZEFkZFBvaW50ID0gbm93MiAtIGxhc3REYXRhUG9pbnRUaW1lID49IERBVEFfUE9JTlRfSU5URVJWQUw7CiAgICAgIGlmIChzaG91bGRBZGRQb2ludCkgewogICAgICAgIGxhc3REYXRhUG9pbnRUaW1lID0gbm93MjsKICAgICAgICBjb25zdCBuZXdUaW1lc3RhbXAgPSBuZXcgRGF0ZShub3cyKS50b0lTT1N0cmluZygpOwogICAgICAgIGlmIChjdXJyZW50RGF0YXNldCA9PT0gInN5c3RlbSIpIHsKICAgICAgICAgIHByZXZpb3VzVmFsdWVzLmNwdSA9IGdldE5leHRWYWx1ZShwcmV2aW91c1ZhbHVlcy5jcHUsIDIwLCA1MCwgMyk7CiAgICAgICAgICBwcmV2aW91c1ZhbHVlcy5tZW1vcnkgPSBnZXROZXh0VmFsdWUocHJldmlvdXNWYWx1ZXMubWVtb3J5LCA0MCwgNzAsIDIpOwogICAgICAgICAgY29uc3QgY3VycmVudFNlcmllcyA9IGNoYXJ0RWxlbWVudC5jaGFydFNlcmllcy5tYXAoKHNlcmllcywgaW5kZXgyKSA9PiAoewogICAgICAgICAgICBuYW1lOiBzZXJpZXMubmFtZSwKICAgICAgICAgICAgZGF0YTogWwogICAgICAgICAgICAgIC4uLnNlcmllcy5kYXRhLAogICAgICAgICAgICAgIGluZGV4MiA9PT0gMCA/IHsgeDogbmV3VGltZXN0YW1wLCB5OiBwcmV2aW91c1ZhbHVlcy5jcHUgfSA6IHsgeDogbmV3VGltZXN0YW1wLCB5OiBwcmV2aW91c1ZhbHVlcy5tZW1vcnkgfQogICAgICAgICAgICBdCiAgICAgICAgICB9KSk7CiAgICAgICAgICBjaGFydEVsZW1lbnQudXBkYXRlU2VyaWVzKGN1cnJlbnRTZXJpZXMsIGZhbHNlKTsKICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnREYXRhc2V0ID09PSAibmV0d29yayIpIHsKICAgICAgICAgIHByZXZpb3VzVmFsdWVzLmRvd25sb2FkID0gZ2V0TmV4dFZhbHVlKHByZXZpb3VzVmFsdWVzLmRvd25sb2FkLCAxMDAsIDIwMCwgMTApOwogICAgICAgICAgcHJldmlvdXNWYWx1ZXMudXBsb2FkID0gZ2V0TmV4dFZhbHVlKHByZXZpb3VzVmFsdWVzLnVwbG9hZCwgMjAsIDUwLCA1KTsKICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZXJpZXMgPSBjaGFydEVsZW1lbnQuY2hhcnRTZXJpZXMubWFwKChzZXJpZXMsIGluZGV4MikgPT4gKHsKICAgICAgICAgICAgbmFtZTogc2VyaWVzLm5hbWUsCiAgICAgICAgICAgIGRhdGE6IFsKICAgICAgICAgICAgICAuLi5zZXJpZXMuZGF0YSwKICAgICAgICAgICAgICBpbmRleDIgPT09IDAgPyB7IHg6IG5ld1RpbWVzdGFtcCwgeTogcHJldmlvdXNWYWx1ZXMuZG93bmxvYWQgfSA6IHsgeDogbmV3VGltZXN0YW1wLCB5OiBwcmV2aW91c1ZhbHVlcy51cGxvYWQgfQogICAgICAgICAgICBdCiAgICAgICAgICB9KSk7CiAgICAgICAgICBjaGFydEVsZW1lbnQudXBkYXRlU2VyaWVzKGN1cnJlbnRTZXJpZXMsIGZhbHNlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBjb25zdCB1cGRhdGVDb25uZWN0aW9ucyA9ICgpID0+IHsKICAgICAgaWYgKCFjb25uZWN0aW9uc0NoYXJ0RWxlbWVudCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IG5vdzIgPSBEYXRlLm5vdygpOwogICAgICBjb25zdCBuZXdUaW1lc3RhbXAgPSBuZXcgRGF0ZShub3cyKS50b0lTT1N0cmluZygpOwogICAgICBjb25zdCBjaGFuZ2UgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyMSkgLSAxMDsKICAgICAgcHJldmlvdXNWYWx1ZXMuY29ubmVjdGlvbnMgPSBNYXRoLm1heCg1MCwgTWF0aC5taW4oMzAwLCBwcmV2aW91c1ZhbHVlcy5jb25uZWN0aW9ucyArIGNoYW5nZSkpOwogICAgICBjb25zdCBjdXJyZW50U2VyaWVzID0gY29ubmVjdGlvbnNDaGFydEVsZW1lbnQuY2hhcnRTZXJpZXM7CiAgICAgIGNvbnN0IG5ld0RhdGEgPSBbewogICAgICAgIG5hbWU6IGN1cnJlbnRTZXJpZXNbMF0/Lm5hbWUgfHwgIkNvbm5lY3Rpb25zIiwKICAgICAgICBkYXRhOiBbCiAgICAgICAgICAuLi5jdXJyZW50U2VyaWVzWzBdPy5kYXRhIHx8IFtdLAogICAgICAgICAgeyB4OiBuZXdUaW1lc3RhbXAsIHk6IHByZXZpb3VzVmFsdWVzLmNvbm5lY3Rpb25zIH0KICAgICAgICBdCiAgICAgIH1dOwogICAgICBjb25uZWN0aW9uc0NoYXJ0RWxlbWVudC51cGRhdGVTZXJpZXMobmV3RGF0YSwgZmFsc2UpOwogICAgfTsKICAgIGNvbnN0IHN3aXRjaERhdGFzZXQgPSAobmFtZSkgPT4gewogICAgICBjdXJyZW50RGF0YXNldCA9IG5hbWU7CiAgICAgIGNvbnN0IGRhdGFzZXQgPSBkYXRhc2V0c1tuYW1lXTsKICAgICAgY2hhcnRFbGVtZW50LmxhYmVsID0gZGF0YXNldC5sYWJlbDsKICAgICAgY2hhcnRFbGVtZW50LnNlcmllcyA9IGRhdGFzZXQuc2VyaWVzOwogICAgICBjaGFydEVsZW1lbnQueUF4aXNGb3JtYXR0ZXIgPSBmb3JtYXR0ZXJzMltuYW1lXTsKICAgICAgaWYgKG5hbWUgPT09ICJzeXN0ZW0iKSB7CiAgICAgICAgY2hhcnRFbGVtZW50LnlBeGlzU2NhbGluZyA9ICJwZXJjZW50YWdlIjsKICAgICAgICBjaGFydEVsZW1lbnQueUF4aXNNYXggPSAxMDA7CiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gIm5ldHdvcmsiKSB7CiAgICAgICAgY2hhcnRFbGVtZW50LnlBeGlzU2NhbGluZyA9ICJkeW5hbWljIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBjaGFydEVsZW1lbnQueUF4aXNTY2FsaW5nID0gImR5bmFtaWMiOwogICAgICB9CiAgICAgIGxhc3REYXRhUG9pbnRUaW1lID0gRGF0ZS5ub3coKSAtIERBVEFfUE9JTlRfSU5URVJWQUw7CiAgICB9OwogICAgY29uc3Qgc3RhcnRSZWFsdGltZSA9ICgpID0+IHsKICAgICAgaWYgKCFpbnRlcnZhbElkICYmIChjdXJyZW50RGF0YXNldCA9PT0gInN5c3RlbSIgfHwgY3VycmVudERhdGFzZXQgPT09ICJuZXR3b3JrIikpIHsKICAgICAgICBjaGFydEVsZW1lbnQucmVhbHRpbWVNb2RlID0gdHJ1ZTsKICAgICAgICBpbnRlcnZhbElkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IGFkZFJlYWx0aW1lRGF0YSgpLCBEQVRBX1BPSU5UX0lOVEVSVkFMKTsKICAgICAgfQogICAgICBpZiAoIWNvbm5lY3Rpb25zSW50ZXJ2YWxJZCkgewogICAgICAgIGNvbm5lY3Rpb25zQ2hhcnRFbGVtZW50LnJlYWx0aW1lTW9kZSA9IHRydWU7CiAgICAgICAgY29ubmVjdGlvbnNJbnRlcnZhbElkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHVwZGF0ZUNvbm5lY3Rpb25zKCksIFVQREFURV9JTlRFUlZBTCk7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCBzdG9wUmVhbHRpbWUgPSAoKSA9PiB7CiAgICAgIGlmIChpbnRlcnZhbElkKSB7CiAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7CiAgICAgICAgaW50ZXJ2YWxJZCA9IG51bGw7CiAgICAgICAgY2hhcnRFbGVtZW50LnJlYWx0aW1lTW9kZSA9IGZhbHNlOwogICAgICB9CiAgICAgIGlmIChjb25uZWN0aW9uc0ludGVydmFsSWQpIHsKICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChjb25uZWN0aW9uc0ludGVydmFsSWQpOwogICAgICAgIGNvbm5lY3Rpb25zSW50ZXJ2YWxJZCA9IG51bGw7CiAgICAgICAgY29ubmVjdGlvbnNDaGFydEVsZW1lbnQucmVhbHRpbWVNb2RlID0gZmFsc2U7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCByYW5kb21pemVEYXRhID0gKCkgPT4gewogICAgICBpZiAoY3VycmVudERhdGFzZXQgPT09ICJzeXN0ZW0iKSB7CiAgICAgICAgcHJldmlvdXNWYWx1ZXMuY3B1ID0gTWF0aC5yYW5kb20oKSA+IDAuNSA/IDg1IDogMjU7CiAgICAgICAgcHJldmlvdXNWYWx1ZXMubWVtb3J5ID0gTWF0aC5yYW5kb20oKSA+IDAuNSA/IDgwIDogNDU7CiAgICAgIH0gZWxzZSBpZiAoY3VycmVudERhdGFzZXQgPT09ICJuZXR3b3JrIikgewogICAgICAgIHByZXZpb3VzVmFsdWVzLmRvd25sb2FkID0gTWF0aC5yYW5kb20oKSA+IDAuNSA/IDI1MCA6IDEwMDsKICAgICAgICBwcmV2aW91c1ZhbHVlcy51cGxvYWQgPSBNYXRoLnJhbmRvbSgpID4gMC41ID8gODAgOiAyMDsKICAgICAgfQogICAgICBwcmV2aW91c1ZhbHVlcy5jb25uZWN0aW9ucyA9IE1hdGgucmFuZG9tKCkgPiAwLjUgPyAyODAgOiA4MDsKICAgICAgbGFzdERhdGFQb2ludFRpbWUgPSAwOwogICAgICBjb25uZWN0aW9uc0xhc3RVcGRhdGUgPSAwOwogICAgfTsKICAgIGNvbnN0IGJ1dHRvbnMgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3JBbGwoImRlZXMtYnV0dG9uIik7CiAgICBidXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4gewogICAgICBjb25zdCB0ZXh0OSA9IGJ1dHRvbi50ZXh0Q29udGVudD8udHJpbSgpOwogICAgICBpZiAodGV4dDkgPT09ICJTeXN0ZW0gVXNhZ2UiKSB7CiAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gc3dpdGNoRGF0YXNldCgic3lzdGVtIikpOwogICAgICB9IGVsc2UgaWYgKHRleHQ5ID09PSAiTmV0d29yayBUcmFmZmljIikgewogICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHN3aXRjaERhdGFzZXQoIm5ldHdvcmsiKSk7CiAgICAgIH0gZWxzZSBpZiAodGV4dDkgPT09ICJTYWxlcyBEYXRhIikgewogICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHN3aXRjaERhdGFzZXQoInNhbGVzIikpOwogICAgICB9IGVsc2UgaWYgKHRleHQ5ID09PSAiU3RhcnQgTGl2ZSIpIHsKICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBzdGFydFJlYWx0aW1lKCkpOwogICAgICB9IGVsc2UgaWYgKHRleHQ5ID09PSAiU3RvcCBMaXZlIikgewogICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHN0b3BSZWFsdGltZSgpKTsKICAgICAgfSBlbHNlIGlmICh0ZXh0OSA9PT0gIlNwaWtlIFZhbHVlcyIpIHsKICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiByYW5kb21pemVEYXRhKCkpOwogICAgICB9CiAgICB9KTsKICAgIGNvbnN0IHVwZGF0ZUJ1dHRvblN0YXRlcyA9ICgpID0+IHsKICAgICAgY29uc3QgYnV0dG9uczIgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3JBbGwoImRlZXMtYnV0dG9uIik7CiAgICAgIGJ1dHRvbnMyLmZvckVhY2goKGJ1dHRvbikgPT4gewogICAgICAgIGNvbnN0IHRleHQ5ID0gYnV0dG9uLnRleHRDb250ZW50Py50cmltKCk7CiAgICAgICAgaWYgKHRleHQ5ID09PSAiU3lzdGVtIFVzYWdlIikgewogICAgICAgICAgYnV0dG9uLnR5cGUgPSBjdXJyZW50RGF0YXNldCA9PT0gInN5c3RlbSIgPyAiaGlnaGxpZ2h0ZWQiIDogIm5vcm1hbCI7CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0OSA9PT0gIk5ldHdvcmsgVHJhZmZpYyIpIHsKICAgICAgICAgIGJ1dHRvbi50eXBlID0gY3VycmVudERhdGFzZXQgPT09ICJuZXR3b3JrIiA/ICJoaWdobGlnaHRlZCIgOiAibm9ybWFsIjsKICAgICAgICB9IGVsc2UgaWYgKHRleHQ5ID09PSAiU2FsZXMgRGF0YSIpIHsKICAgICAgICAgIGJ1dHRvbi50eXBlID0gY3VycmVudERhdGFzZXQgPT09ICJzYWxlcyIgPyAiaGlnaGxpZ2h0ZWQiIDogIm5vcm1hbCI7CiAgICAgICAgfQogICAgICB9KTsKICAgIH07CiAgICBjaGFydEVsZW1lbnQucm9sbGluZ1dpbmRvdyA9IFRJTUVfV0lORE9XOwogICAgY2hhcnRFbGVtZW50LnJlYWx0aW1lTW9kZSA9IGZhbHNlOwogICAgY2hhcnRFbGVtZW50LnlBeGlzU2NhbGluZyA9ICJwZXJjZW50YWdlIjsKICAgIGNoYXJ0RWxlbWVudC55QXhpc01heCA9IDEwMDsKICAgIGNoYXJ0RWxlbWVudC5hdXRvU2Nyb2xsSW50ZXJ2YWwgPSAxZTM7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgY2hhcnRFbGVtZW50LnVwZGF0ZVRpbWVXaW5kb3coKTsKICAgIH0sIDEwMCk7CiAgICBjb25zdCBvcmlnaW5hbFN3aXRjaERhdGFzZXQgPSBzd2l0Y2hEYXRhc2V0OwogICAgY29uc3Qgc3dpdGNoRGF0YXNldFdpdGhCdXR0b25VcGRhdGUgPSAobmFtZSkgPT4gewogICAgICBvcmlnaW5hbFN3aXRjaERhdGFzZXQobmFtZSk7CiAgICAgIHVwZGF0ZUJ1dHRvblN0YXRlcygpOwogICAgfTsKICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7CiAgICAgIGNvbnN0IHRleHQ5ID0gYnV0dG9uLnRleHRDb250ZW50Py50cmltKCk7CiAgICAgIGlmICh0ZXh0OSA9PT0gIlN5c3RlbSBVc2FnZSIpIHsKICAgICAgICBidXR0b24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBzd2l0Y2hEYXRhc2V0KCJzeXN0ZW0iKSk7CiAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gc3dpdGNoRGF0YXNldFdpdGhCdXR0b25VcGRhdGUoInN5c3RlbSIpKTsKICAgICAgfSBlbHNlIGlmICh0ZXh0OSA9PT0gIk5ldHdvcmsgVHJhZmZpYyIpIHsKICAgICAgICBidXR0b24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBzd2l0Y2hEYXRhc2V0KCJuZXR3b3JrIikpOwogICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHN3aXRjaERhdGFzZXRXaXRoQnV0dG9uVXBkYXRlKCJuZXR3b3JrIikpOwogICAgICB9IGVsc2UgaWYgKHRleHQ5ID09PSAiU2FsZXMgRGF0YSIpIHsKICAgICAgICBidXR0b24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBzd2l0Y2hEYXRhc2V0KCJzYWxlcyIpKTsKICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBzd2l0Y2hEYXRhc2V0V2l0aEJ1dHRvblVwZGF0ZSgic2FsZXMiKSk7CiAgICAgIH0KICAgIH0pOwogICAgaWYgKGNvbm5lY3Rpb25zQ2hhcnRFbGVtZW50KSB7CiAgICAgIGNvbnN0IGluaXRpYWxDb25uZWN0aW9uc0RhdGEgPSBnZW5lcmF0ZUluaXRpYWxEYXRhKHByZXZpb3VzVmFsdWVzLmNvbm5lY3Rpb25zLCAzMCwgVVBEQVRFX0lOVEVSVkFMKTsKICAgICAgY29ubmVjdGlvbnNDaGFydEVsZW1lbnQuc2VyaWVzID0gW3sKICAgICAgICBuYW1lOiAiQ29ubmVjdGlvbnMiLAogICAgICAgIGRhdGE6IGluaXRpYWxDb25uZWN0aW9uc0RhdGEKICAgICAgfV07CiAgICAgIGNvbm5lY3Rpb25zQ2hhcnRFbGVtZW50LnJvbGxpbmdXaW5kb3cgPSBUSU1FX1dJTkRPVzsKICAgICAgY29ubmVjdGlvbnNDaGFydEVsZW1lbnQucmVhbHRpbWVNb2RlID0gZmFsc2U7CiAgICAgIGNvbm5lY3Rpb25zQ2hhcnRFbGVtZW50LnlBeGlzU2NhbGluZyA9ICJmaXhlZCI7CiAgICAgIGNvbm5lY3Rpb25zQ2hhcnRFbGVtZW50LnlBeGlzTWF4ID0gMzUwOwogICAgICBjb25uZWN0aW9uc0NoYXJ0RWxlbWVudC5hdXRvU2Nyb2xsSW50ZXJ2YWwgPSAxZTM7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIGNvbm5lY3Rpb25zQ2hhcnRFbGVtZW50LnVwZGF0ZVRpbWVXaW5kb3coKTsKICAgICAgfSwgMTAwKTsKICAgIH0KICB9fT4KICAgICAgPHN0eWxlPgogICAgICAgICR7aWAKICAgICAgICAuZGVtb0JveCB7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUlKSIsICJoc2woMCAwJSA5JSkiKX07CiAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgIHBhZGRpbmc6IDQwcHg7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICBnYXA6IDI0cHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5jb250cm9scyB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuY2hhcnQtY29udGFpbmVyIHsKICAgICAgICAgIGZsZXg6IDE7CiAgICAgICAgICBtaW4taGVpZ2h0OiA0MDBweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmluZm8gewogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1LjQgMTYuMyUgNTYuOSUpIiwgImhzbCgyMTUgMjAuMiUgNTUuMSUpIil9OwogICAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgJ0dlaXN0IFNhbnMnLCBzYW5zLXNlcmlmOwogICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgbWFyZ2luLXRvcDogOHB4OwogICAgICAgIH0KICAgICAgYH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJkZW1vQm94Ij4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbHMiPgogICAgICAgIDxkZWVzLWJ1dHRvbi1ncm91cCBsYWJlbD0iRGF0YXNldDoiPgogICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9ImhpZ2hsaWdodGVkIj5TeXN0ZW0gVXNhZ2U8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uPk5ldHdvcmsgVHJhZmZpYzwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24+U2FsZXMgRGF0YTwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kZWVzLWJ1dHRvbi1ncm91cD4KICAgICAgICAKICAgICAgICA8ZGVlcy1idXR0b24tZ3JvdXAgbGFiZWw9IlJlYWwtdGltZToiPgogICAgICAgICAgPGRlZXMtYnV0dG9uPlN0YXJ0IExpdmU8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPGRlZXMtYnV0dG9uPlN0b3AgTGl2ZTwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kZWVzLWJ1dHRvbi1ncm91cD4KICAgICAgICAKICAgICAgICA8ZGVlcy1idXR0b24tZ3JvdXAgbGFiZWw9IkFjdGlvbnM6Ij4KICAgICAgICAgIDxkZWVzLWJ1dHRvbj5TcGlrZSBWYWx1ZXM8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGVlcy1idXR0b24tZ3JvdXA+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iY2hhcnQtY29udGFpbmVyIj4KICAgICAgICA8ZGVlcy1jaGFydC1hcmVhCiAgICAgICAgICBpZD0ibWFpbi1jaGFydCIKICAgICAgICAgIC5sYWJlbD0ke2luaXRpYWxEYXRhc2V0cy5zeXN0ZW0ubGFiZWx9CiAgICAgICAgICAuc2VyaWVzPSR7aW5pdGlhbERhdGFzZXRzLnN5c3RlbS5zZXJpZXN9CiAgICAgICAgICAueUF4aXNGb3JtYXR0ZXI9JHtpbml0aWFsRm9ybWF0dGVycy5zeXN0ZW19CiAgICAgICAgPjwvZGVlcy1jaGFydC1hcmVhPgogICAgICA8L2Rpdj4KICAgICAgCiAgICAgIDxkaXYgY2xhc3M9ImNoYXJ0LWNvbnRhaW5lciIgc3R5bGU9Im1hcmdpbi10b3A6IDIwcHg7Ij4KICAgICAgICA8ZGVlcy1jaGFydC1hcmVhCiAgICAgICAgICBpZD0iY29ubmVjdGlvbnMtY2hhcnQiCiAgICAgICAgICAubGFiZWw9JHsiQWN0aXZlIENvbm5lY3Rpb25zIn0KICAgICAgICAgIC5zZXJpZXM9JHtbewogICAgbmFtZTogIkNvbm5lY3Rpb25zIiwKICAgIGRhdGE6IFtdCiAgfV19CiAgICAgICAgICAueUF4aXNGb3JtYXR0ZXI9JHsodmFsKSA9PiBgJHt2YWx9YH0KICAgICAgICA+PC9kZWVzLWNoYXJ0LWFyZWE+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iaW5mbyI+CiAgICAgICAgUmVhbC10aW1lIG1vbml0b3Jpbmcgd2l0aCAyLW1pbnV0ZSByb2xsaW5nIHdpbmRvdyDigKIgCiAgICAgICAgVXBkYXRlcyBldmVyeSBzZWNvbmQgd2l0aCBzbW9vdGggdmFsdWUgdHJhbnNpdGlvbnMg4oCiIAogICAgICAgIENsaWNrICdTcGlrZSBWYWx1ZXMnIHRvIHNpbXVsYXRlIGxvYWQgc3Bpa2VzCiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgYDsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1jaGFydC9kZWVzLWNoYXJ0LWFyZWEvc3R5bGVzLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBjaGFydEFyZWFTdHlsZXMgPSBbCiAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogIGlgCiAgICAgIDpob3N0IHsKICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCAnUm9ib3RvJywgc2Fucy1zZXJpZjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDMuOSUpIiwgImhzbCgwIDAlIDk4JSkiKX07CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KICAgICAgLm1haW5ib3ggewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSAzLjklKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmNoYXJ0VGl0bGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgIHBhZGRpbmc6IDE2cHggMjRweDsKICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDIwJSkiLCAiaHNsKDAgMCUgNjMuOSUpIil9OwogICAgICB9CiAgICAgIC5jaGFydENvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDBweDsKICAgICAgICBib3R0b206IDBweDsKICAgICAgICByaWdodDogMHB4OwogICAgICAgIHBhZGRpbmc6IDQ0cHggMTZweCAxNnB4IDBweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyAvKiBFbnN1cmUgY29udGFpbmVyIGRvZXNuJ3Qgb3ZlcnJpZGUgY2hhcnQgYmFja2dyb3VuZCAqLwogICAgICB9CiAgICAgIAogICAgICAvKiBBcGV4Q2hhcnRzIHRoZW1lIG92ZXJyaWRlcyAqLwogICAgICAuYXBleGNoYXJ0cy1jYW52YXMgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5hcGV4Y2hhcnRzLWlubmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAuYXBleGNoYXJ0cy1ncmFwaGljYWwgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIGAKXTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1jaGFydC9kZWVzLWNoYXJ0LWFyZWEvdGVtcGxhdGUuanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIHJlbmRlckNoYXJ0QXJlYSA9IChjb21wb25lbnQpID0+IHsKICByZXR1cm4gYjJgCiAgICAgICAgPGRpdiBjbGFzcz0ibWFpbmJveCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjaGFydFRpdGxlIj4ke2NvbXBvbmVudC5sYWJlbH08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNoYXJ0Q29udGFpbmVyIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgYDsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1jaGFydC9kZWVzLWNoYXJ0LWFyZWEvY29tcG9uZW50LmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfZGlzdF90czI5KCk7CmluaXRfc2VydmljZXMoKTsKdmFyIF9fZXNEZWNvcmF0ZTUzID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM1NCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0NoYXJ0QXJlYSA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1jaGFydC1hcmVhIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfY2hhcnRfZGVjb3JhdG9yczsKICBsZXQgX2NoYXJ0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2hhcnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xhYmVsX2RlY29yYXRvcnM7CiAgbGV0IF9sYWJlbF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZXJpZXNfZGVjb3JhdG9yczsKICBsZXQgX3Nlcmllc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nlcmllc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfeUF4aXNGb3JtYXR0ZXJfZGVjb3JhdG9yczsKICBsZXQgX3lBeGlzRm9ybWF0dGVyX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfeUF4aXNGb3JtYXR0ZXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JvbGxpbmdXaW5kb3dfZGVjb3JhdG9yczsKICBsZXQgX3JvbGxpbmdXaW5kb3dfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yb2xsaW5nV2luZG93X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZWFsdGltZU1vZGVfZGVjb3JhdG9yczsKICBsZXQgX3JlYWx0aW1lTW9kZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlYWx0aW1lTW9kZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfeUF4aXNTY2FsaW5nX2RlY29yYXRvcnM7CiAgbGV0IF95QXhpc1NjYWxpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF95QXhpc1NjYWxpbmdfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3lBeGlzTWF4X2RlY29yYXRvcnM7CiAgbGV0IF95QXhpc01heF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3lBeGlzTWF4X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdXRvU2Nyb2xsSW50ZXJ2YWxfZGVjb3JhdG9yczsKICBsZXQgX2F1dG9TY3JvbGxJbnRlcnZhbF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2F1dG9TY3JvbGxJbnRlcnZhbF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzQ2hhcnRBcmVhMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2NoYXJ0X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9sYWJlbF9kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfc2VyaWVzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF95QXhpc0Zvcm1hdHRlcl9kZWNvcmF0b3JzID0gW241KHsgYXR0cmlidXRlOiBmYWxzZSB9KV07CiAgICAgIF9yb2xsaW5nV2luZG93X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfcmVhbHRpbWVNb2RlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3lBeGlzU2NhbGluZ19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3lBeGlzTWF4X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfYXV0b1Njcm9sbEludGVydmFsX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfX2VzRGVjb3JhdGU1Myh0aGlzLCBudWxsLCBfY2hhcnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY2hhcnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNoYXJ0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNoYXJ0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jaGFydCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jaGFydF9pbml0aWFsaXplcnMsIF9jaGFydF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTUzKHRoaXMsIG51bGwsIF9sYWJlbF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsYWJlbCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibGFiZWwiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubGFiZWwsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxhYmVsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xhYmVsX2luaXRpYWxpemVycywgX2xhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTModGhpcywgbnVsbCwgX3Nlcmllc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZXJpZXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlcmllcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZXJpZXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlcmllcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZXJpZXNfaW5pdGlhbGl6ZXJzLCBfc2VyaWVzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTModGhpcywgbnVsbCwgX3lBeGlzRm9ybWF0dGVyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInlBeGlzRm9ybWF0dGVyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ5QXhpc0Zvcm1hdHRlciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai55QXhpc0Zvcm1hdHRlciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoueUF4aXNGb3JtYXR0ZXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfeUF4aXNGb3JtYXR0ZXJfaW5pdGlhbGl6ZXJzLCBfeUF4aXNGb3JtYXR0ZXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Myh0aGlzLCBudWxsLCBfcm9sbGluZ1dpbmRvd19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJyb2xsaW5nV2luZG93Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJyb2xsaW5nV2luZG93IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJvbGxpbmdXaW5kb3csIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnJvbGxpbmdXaW5kb3cgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcm9sbGluZ1dpbmRvd19pbml0aWFsaXplcnMsIF9yb2xsaW5nV2luZG93X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTModGhpcywgbnVsbCwgX3JlYWx0aW1lTW9kZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJyZWFsdGltZU1vZGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInJlYWx0aW1lTW9kZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5yZWFsdGltZU1vZGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnJlYWx0aW1lTW9kZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9yZWFsdGltZU1vZGVfaW5pdGlhbGl6ZXJzLCBfcmVhbHRpbWVNb2RlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTModGhpcywgbnVsbCwgX3lBeGlzU2NhbGluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ5QXhpc1NjYWxpbmciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInlBeGlzU2NhbGluZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai55QXhpc1NjYWxpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnlBeGlzU2NhbGluZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF95QXhpc1NjYWxpbmdfaW5pdGlhbGl6ZXJzLCBfeUF4aXNTY2FsaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTModGhpcywgbnVsbCwgX3lBeGlzTWF4X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInlBeGlzTWF4Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ5QXhpc01heCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai55QXhpc01heCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoueUF4aXNNYXggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfeUF4aXNNYXhfaW5pdGlhbGl6ZXJzLCBfeUF4aXNNYXhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Myh0aGlzLCBudWxsLCBfYXV0b1Njcm9sbEludGVydmFsX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImF1dG9TY3JvbGxJbnRlcnZhbCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYXV0b1Njcm9sbEludGVydmFsIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmF1dG9TY3JvbGxJbnRlcnZhbCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYXV0b1Njcm9sbEludGVydmFsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2F1dG9TY3JvbGxJbnRlcnZhbF9pbml0aWFsaXplcnMsIF9hdXRvU2Nyb2xsSW50ZXJ2YWxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1MyhudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNDaGFydEFyZWEyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMzNjsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJDaGFydCJdOwogICAgI2NoYXJ0X2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczU0KHRoaXMsIF9jaGFydF9pbml0aWFsaXplcnMsIHZvaWQgMCk7CiAgICAvLyBpbnN0YW5jZQogICAgZ2V0IGNoYXJ0KCkgewogICAgICByZXR1cm4gdGhpcy4jY2hhcnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjaGFydCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY2hhcnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTQodGhpcywgX2NoYXJ0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1NCh0aGlzLCBfbGFiZWxfaW5pdGlhbGl6ZXJzLCAiVW50aXRsZWQgQ2hhcnQiKSk7CiAgICBnZXQgbGFiZWwoKSB7CiAgICAgIHJldHVybiB0aGlzLiNsYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxhYmVsKHZhbHVlMikgewogICAgICB0aGlzLiNsYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nlcmllc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTQodGhpcywgX2xhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1NCh0aGlzLCBfc2VyaWVzX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBzZXJpZXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZXJpZXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZXJpZXModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nlcmllc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgLy8gT3ZlcnJpZGUgZ2V0dGVyIHRvIHJldHVybiBpbnRlcm5hbCBjaGFydCBkYXRhCiAgICBnZXQgY2hhcnRTZXJpZXMoKSB7CiAgICAgIHJldHVybiB0aGlzLmludGVybmFsQ2hhcnREYXRhLmxlbmd0aCA+IDAgPyB0aGlzLmludGVybmFsQ2hhcnREYXRhIDogdGhpcy5zZXJpZXM7CiAgICB9CiAgICAjeUF4aXNGb3JtYXR0ZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU0KHRoaXMsIF9zZXJpZXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU0KHRoaXMsIF95QXhpc0Zvcm1hdHRlcl9pbml0aWFsaXplcnMsICh2YWwpID0+IGAke3ZhbH0gTWJwc2ApKTsKICAgIGdldCB5QXhpc0Zvcm1hdHRlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3lBeGlzRm9ybWF0dGVyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgeUF4aXNGb3JtYXR0ZXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3lBeGlzRm9ybWF0dGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcm9sbGluZ1dpbmRvd19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTQodGhpcywgX3lBeGlzRm9ybWF0dGVyX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1NCh0aGlzLCBfcm9sbGluZ1dpbmRvd19pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCByb2xsaW5nV2luZG93KCkgewogICAgICByZXR1cm4gdGhpcy4jcm9sbGluZ1dpbmRvd19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgLy8gMCBtZWFucyBubyByb2xsaW5nIHdpbmRvdwogICAgc2V0IHJvbGxpbmdXaW5kb3codmFsdWUyKSB7CiAgICAgIHRoaXMuI3JvbGxpbmdXaW5kb3dfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNyZWFsdGltZU1vZGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU0KHRoaXMsIF9yb2xsaW5nV2luZG93X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1NCh0aGlzLCBfcmVhbHRpbWVNb2RlX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCByZWFsdGltZU1vZGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNyZWFsdGltZU1vZGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCByZWFsdGltZU1vZGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3JlYWx0aW1lTW9kZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3lBeGlzU2NhbGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTQodGhpcywgX3JlYWx0aW1lTW9kZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTQodGhpcywgX3lBeGlzU2NhbGluZ19pbml0aWFsaXplcnMsICJkeW5hbWljIikpOwogICAgZ2V0IHlBeGlzU2NhbGluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3lBeGlzU2NhbGluZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHlBeGlzU2NhbGluZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jeUF4aXNTY2FsaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjeUF4aXNNYXhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU0KHRoaXMsIF95QXhpc1NjYWxpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU0KHRoaXMsIF95QXhpc01heF9pbml0aWFsaXplcnMsIDEwMCkpOwogICAgZ2V0IHlBeGlzTWF4KCkgewogICAgICByZXR1cm4gdGhpcy4jeUF4aXNNYXhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIC8vIFVzZWQgd2hlbiB5QXhpc1NjYWxpbmcgaXMgJ2ZpeGVkJyBvciAncGVyY2VudGFnZScKICAgIHNldCB5QXhpc01heCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jeUF4aXNNYXhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhdXRvU2Nyb2xsSW50ZXJ2YWxfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU0KHRoaXMsIF95QXhpc01heF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTQodGhpcywgX2F1dG9TY3JvbGxJbnRlcnZhbF9pbml0aWFsaXplcnMsIDFlMykpOwogICAgZ2V0IGF1dG9TY3JvbGxJbnRlcnZhbCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2F1dG9TY3JvbGxJbnRlcnZhbF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgLy8gQXV0by1zY3JvbGwgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzICgwIHRvIGRpc2FibGUpCiAgICBzZXQgYXV0b1Njcm9sbEludGVydmFsKHZhbHVlMikgewogICAgICB0aGlzLiNhdXRvU2Nyb2xsSW50ZXJ2YWxfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHJlc2l6ZU9ic2VydmVyID0gX19ydW5Jbml0aWFsaXplcnM1NCh0aGlzLCBfYXV0b1Njcm9sbEludGVydmFsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIHJlc2l6ZVRpbWVvdXQ7CiAgICBpbnRlcm5hbENoYXJ0RGF0YSA9IFtdOwogICAgYXV0b1Njcm9sbFRpbWVyID0gbnVsbDsKICAgIERFQlVHX1JFU0laRSA9IGZhbHNlOwogICAgLy8gU2V0IHRvIHRydWUgdG8gZW5hYmxlIHJlc2l6ZSBkZWJ1Z2dpbmcKICAgIC8vIENoYXJ0IGNvbG9yIHNjaGVtZXMKICAgIENIQVJUX0NPTE9SUyA9IHsKICAgICAgZGFyazogWwogICAgICAgICJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIiwKICAgICAgICAvLyBCbHVlCiAgICAgICAgImhzbCgxNzMuNCA4MC40JSA0MCUpIiwKICAgICAgICAvLyBUZWFsCiAgICAgICAgImhzbCgyODAuMyA4Ny40JSA2Ni43JSkiLAogICAgICAgIC8vIFB1cnBsZQogICAgICAgICJoc2woMjQuNiA5NSUgNTMuMSUpIgogICAgICAgIC8vIE9yYW5nZQogICAgICBdLAogICAgICBsaWdodDogWwogICAgICAgICJoc2woMjIyLjIgNDcuNCUgNTEuMiUpIiwKICAgICAgICAvLyBCbHVlIChzaGFkY24gcHJpbWFyeSkKICAgICAgICAiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlKSIsCiAgICAgICAgLy8gR3JlZW4gKHNoYWRjbiBzdWNjZXNzKQogICAgICAgICJoc2woMjgwLjMgNDcuNyUgNTAuMiUpIiwKICAgICAgICAvLyBQdXJwbGUgKG11dGVkKQogICAgICAgICJoc2woMjAuNSA5MC4yJSA0OC4yJSkiCiAgICAgICAgLy8gT3JhbmdlIChzaGFkY24gZGVzdHJ1Y3RpdmUgdmFyaWFudCkKICAgICAgXQogICAgfTsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBkb210b29sc19lbGVtZW50YmFzaWNfZXhwb3J0cy5zZXR1cCgpOwogICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgICAgICAgaWYgKHRoaXMucmVzaXplVGltZW91dCkgewogICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZW91dCk7CiAgICAgICAgfQogICAgICAgIHRoaXMucmVzaXplVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgIGlmICh0aGlzLmNoYXJ0KSB7CiAgICAgICAgICAgIGlmICh0aGlzLkRFQlVHX1JFU0laRSAmJiBlbnRyaWVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbMF07CiAgICAgICAgICAgICAgY29uc29sZS5sb2coIkRlZXNDaGFydEFyZWEgLSBSZXNpemUgZGV0ZWN0ZWQ6IiwgewogICAgICAgICAgICAgICAgd2lkdGg6IGVudHJ5LmNvbnRlbnRSZWN0LndpZHRoLAogICAgICAgICAgICAgICAgaGVpZ2h0OiBlbnRyeS5jb250ZW50UmVjdC5oZWlnaHQKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnJlc2l6ZUNoYXJ0KCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgMTAwKTsKICAgICAgfSk7CiAgICAgIHRoaXMucmVnaXN0ZXJHYXJiYWdlRnVuY3Rpb24oYXN5bmMgKCkgPT4gewogICAgICAgIGlmICh0aGlzLnJlc2l6ZVRpbWVvdXQpIHsKICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVvdXQpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlcikgewogICAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc3RvcEF1dG9TY3JvbGwoKTsKICAgICAgICBpZiAodGhpcy5jaGFydCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhpcy5jaGFydC5kZXN0cm95KCk7CiAgICAgICAgICAgIHRoaXMuY2hhcnQgPSBudWxsOwogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgZGVzdHJveWluZyBjaGFydDoiLCBlcnJvcik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBpZiAodGhpcy5jaGFydCkgewogICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlMikgPT4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlc29sdmUyKSk7CiAgICAgICAgYXdhaXQgdGhpcy5yZXNpemVDaGFydCgpOwogICAgICB9CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gY2hhcnRBcmVhU3R5bGVzOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gcmVuZGVyQ2hhcnRBcmVhKHRoaXMpOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKCkgewogICAgICBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgY29uc3QgQXBleENoYXJ0c0xpYiA9IGF3YWl0IERlZXNTZXJ2aWNlTGliTG9hZGVyLmdldEluc3RhbmNlKCkubG9hZEFwZXhDaGFydHMoKTsKICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZTIpKTsKICAgICAgY29uc3QgbWFpbmJveCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIubWFpbmJveCIpOwogICAgICBjb25zdCBjaGFydENvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuY2hhcnRDb250YWluZXIiKTsKICAgICAgaWYgKCFtYWluYm94IHx8ICFjaGFydENvbnRhaW5lcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkNoYXJ0IGNvbnRhaW5lcnMgbm90IGZvdW5kIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHN0eWxlQ2hhcnRDb250YWluZXIgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjaGFydENvbnRhaW5lcik7CiAgICAgIGNvbnN0IHBhZGRpbmdUb3AgPSBwYXJzZUludChzdHlsZUNoYXJ0Q29udGFpbmVyLnBhZGRpbmdUb3AsIDEwKTsKICAgICAgY29uc3QgcGFkZGluZ0JvdHRvbSA9IHBhcnNlSW50KHN0eWxlQ2hhcnRDb250YWluZXIucGFkZGluZ0JvdHRvbSwgMTApOwogICAgICBjb25zdCBwYWRkaW5nTGVmdCA9IHBhcnNlSW50KHN0eWxlQ2hhcnRDb250YWluZXIucGFkZGluZ0xlZnQsIDEwKTsKICAgICAgY29uc3QgcGFkZGluZ1JpZ2h0ID0gcGFyc2VJbnQoc3R5bGVDaGFydENvbnRhaW5lci5wYWRkaW5nUmlnaHQsIDEwKTsKICAgICAgY29uc3QgaW5pdGlhbFdpZHRoID0gbWFpbmJveC5jbGllbnRXaWR0aCAtIHBhZGRpbmdMZWZ0IC0gcGFkZGluZ1JpZ2h0OwogICAgICBjb25zdCBpbml0aWFsSGVpZ2h0ID0gbWFpbmJveC5vZmZzZXRIZWlnaHQgLSBwYWRkaW5nVG9wIC0gcGFkZGluZ0JvdHRvbTsKICAgICAgY29uc3QgY2hhcnRTZXJpZXMgPSB0aGlzLnNlcmllcy5sZW5ndGggPiAwID8gdGhpcy5zZXJpZXMgOiBbCiAgICAgICAgewogICAgICAgICAgbmFtZTogImNwdSIsCiAgICAgICAgICBkYXRhOiBbCiAgICAgICAgICAgIHsgeDogIjIwMjUtMDEtMTVUMDM6MDA6MDAiLCB5OiAyNSB9LAogICAgICAgICAgICB7IHg6ICIyMDI1LTAxLTE1VDA3OjAwOjAwIiwgeTogMzAgfSwKICAgICAgICAgICAgeyB4OiAiMjAyNS0wMS0xNVQxMTowMDowMCIsIHk6IDIwIH0sCiAgICAgICAgICAgIHsgeDogIjIwMjUtMDEtMTVUMTU6MDA6MDAiLCB5OiAzNSB9LAogICAgICAgICAgICB7IHg6ICIyMDI1LTAxLTE1VDE5OjAwOjAwIiwgeTogMjUgfQogICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIm1lbW9yeSIsCiAgICAgICAgICBkYXRhOiBbCiAgICAgICAgICAgIHsgeDogIjIwMjUtMDEtMTVUMDM6MDA6MDAiLCB5OiAxMCB9LAogICAgICAgICAgICB7IHg6ICIyMDI1LTAxLTE1VDA3OjAwOjAwIiwgeTogMTIgfSwKICAgICAgICAgICAgeyB4OiAiMjAyNS0wMS0xNVQxMTowMDowMCIsIHk6IDEwIH0sCiAgICAgICAgICAgIHsgeDogIjIwMjUtMDEtMTVUMTU6MDA6MDAiLCB5OiAzMCB9LAogICAgICAgICAgICB7IHg6ICIyMDI1LTAxLTE1VDE5OjAwOjAwIiwgeTogNDAgfQogICAgICAgICAgXQogICAgICAgIH0KICAgICAgXTsKICAgICAgdGhpcy5pbnRlcm5hbENoYXJ0RGF0YSA9IGNoYXJ0U2VyaWVzOwogICAgICBjb25zdCBpc0RhcmsgPSAhdGhpcy5nb0JyaWdodDsKICAgICAgY29uc3QgdGhlbWUgPSBpc0RhcmsgPyAiZGFyayIgOiAibGlnaHQiOwogICAgICB2YXIgb3B0aW9ucyA9IHsKICAgICAgICBzZXJpZXM6IGNoYXJ0U2VyaWVzLAogICAgICAgIGNoYXJ0OiB7CiAgICAgICAgICB3aWR0aDogaW5pdGlhbFdpZHRoIHx8IDEwMCwKICAgICAgICAgIC8vIFVzZSBhY3R1YWwgd2lkdGggb3IgZmFsbGJhY2sKICAgICAgICAgIGhlaWdodDogaW5pdGlhbEhlaWdodCB8fCAxMDAsCiAgICAgICAgICAvLyBVc2UgYWN0dWFsIGhlaWdodCBvciBmYWxsYmFjawogICAgICAgICAgdHlwZTogImFyZWEiLAogICAgICAgICAgYmFja2dyb3VuZDogInRyYW5zcGFyZW50IiwKICAgICAgICAgIC8vIFRyYW5zcGFyZW50IGJhY2tncm91bmQgdG8gaW5oZXJpdCBmcm9tIGNvbnRhaW5lcgogICAgICAgICAgdG9vbGJhcjogewogICAgICAgICAgICBzaG93OiBmYWxzZQogICAgICAgICAgICAvLyBUaGlzIGxpbmUgZGlzYWJsZXMgdGhlIHRvb2xiYXIKICAgICAgICAgIH0sCiAgICAgICAgICBhbmltYXRpb25zOiB7CiAgICAgICAgICAgIGVuYWJsZWQ6ICF0aGlzLnJlYWx0aW1lTW9kZSwKICAgICAgICAgICAgLy8gRGlzYWJsZSBhbmltYXRpb25zIGluIHJlYWx0aW1lIG1vZGUKICAgICAgICAgICAgc3BlZWQ6IDQwMCwKICAgICAgICAgICAgYW5pbWF0ZUdyYWR1YWxseTogewogICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgICAgICAgICAgIC8vIERpc2FibGUgZ3JhZHVhbCBhbmltYXRpb24gZm9yIGNsZWFuZXIgdXBkYXRlcwogICAgICAgICAgICAgIGRlbGF5OiAwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGR5bmFtaWNBbmltYXRpb246IHsKICAgICAgICAgICAgICBlbmFibGVkOiAhdGhpcy5yZWFsdGltZU1vZGUsCiAgICAgICAgICAgICAgc3BlZWQ6IDM1MAogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgem9vbTogewogICAgICAgICAgICBlbmFibGVkOiBmYWxzZQogICAgICAgICAgICAvLyBEaXNhYmxlIHpvb20gZm9yIGNsZWFuZXIgaW50ZXJhY3Rpb24KICAgICAgICAgIH0sCiAgICAgICAgICBzZWxlY3Rpb246IHsKICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UKICAgICAgICAgICAgLy8gRGlzYWJsZSBzZWxlY3Rpb24KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGRhdGFMYWJlbHM6IHsKICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICBzdHJva2U6IHsKICAgICAgICAgIHdpZHRoOiAyLAogICAgICAgICAgY3VydmU6ICJzbW9vdGgiCiAgICAgICAgfSwKICAgICAgICB4YXhpczogewogICAgICAgICAgdHlwZTogImRhdGV0aW1lIiwKICAgICAgICAgIC8vIFRpbWUtc2VyaWVzIGRhdGEKICAgICAgICAgIGxhYmVsczogewogICAgICAgICAgICBmb3JtYXQ6ICJISDptbTpzcyIsCiAgICAgICAgICAgIC8vIFRpbWUgZm9ybWF0dGluZyB3aXRoIHNlY29uZHMKICAgICAgICAgICAgZGF0ZXRpbWVVVEM6IGZhbHNlLAogICAgICAgICAgICBzdHlsZTogewogICAgICAgICAgICAgIGNvbG9yczogW2lzRGFyayA/ICJoc2woMCAwJSA2My45JSkiIDogImhzbCgwIDAlIDIwJSkiXSwKICAgICAgICAgICAgICAvLyBMYWJlbCBjb2xvcgogICAgICAgICAgICAgIGZvbnRTaXplOiAiMTJweCIsCiAgICAgICAgICAgICAgZm9udEZhbWlseTogJy1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgIlNlZ29lIFVJIiwgc2Fucy1zZXJpZicsCiAgICAgICAgICAgICAgZm9udFdlaWdodDogIjQwMCIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGF4aXNCb3JkZXI6IHsKICAgICAgICAgICAgc2hvdzogZmFsc2UKICAgICAgICAgICAgLy8gSGlkZSB4LWF4aXMgYm9yZGVyCiAgICAgICAgICB9LAogICAgICAgICAgYXhpc1RpY2tzOiB7CiAgICAgICAgICAgIHNob3c6IGZhbHNlCiAgICAgICAgICAgIC8vIEhpZGUgeC1heGlzIHRpY2tzCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB5YXhpczogewogICAgICAgICAgbWluOiAwLAogICAgICAgICAgbWF4OiB0aGlzLnlBeGlzU2NhbGluZyA9PT0gImR5bmFtaWMiID8gdm9pZCAwIDogdGhpcy55QXhpc01heCwKICAgICAgICAgIGxhYmVsczogewogICAgICAgICAgICBmb3JtYXR0ZXI6IHRoaXMueUF4aXNGb3JtYXR0ZXIsCiAgICAgICAgICAgIHN0eWxlOiB7CiAgICAgICAgICAgICAgY29sb3JzOiBbaXNEYXJrID8gImhzbCgwIDAlIDYzLjklKSIgOiAiaHNsKDAgMCUgMjAlKSJdLAogICAgICAgICAgICAgIC8vIExhYmVsIGNvbG9yCiAgICAgICAgICAgICAgZm9udFNpemU6ICIxMnB4IiwKICAgICAgICAgICAgICBmb250RmFtaWx5OiAnLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBzYW5zLXNlcmlmJywKICAgICAgICAgICAgICBmb250V2VpZ2h0OiAiNDAwIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgYXhpc0JvcmRlcjogewogICAgICAgICAgICBzaG93OiBmYWxzZQogICAgICAgICAgICAvLyBIaWRlIHktYXhpcyBib3JkZXIKICAgICAgICAgIH0sCiAgICAgICAgICBheGlzVGlja3M6IHsKICAgICAgICAgICAgc2hvdzogZmFsc2UKICAgICAgICAgICAgLy8gSGlkZSB5LWF4aXMgdGlja3MKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHRvb2x0aXA6IHsKICAgICAgICAgIHNoYXJlZDogdHJ1ZSwKICAgICAgICAgIC8vIEVuYWJsZXMgdGhlIHRvb2x0aXAgdG8gZGlzcGxheSBhY3Jvc3Mgc2VyaWVzCiAgICAgICAgICBpbnRlcnNlY3Q6IGZhbHNlLAogICAgICAgICAgLy8gQWxsb3dzIGhvdmVyaW5nIGFueXdoZXJlIG9uIHRoZSBjaGFydAogICAgICAgICAgZm9sbG93Q3Vyc29yOiB0cnVlLAogICAgICAgICAgLy8gTWFrZXMgdG9vbHRpcCBmb2xsb3cgbW91c2UgZXZlbiBiZXR3ZWVuIHBvaW50cwogICAgICAgICAgeDogewogICAgICAgICAgICBmb3JtYXQ6ICJkZC9NTS95eSBISDptbSIKICAgICAgICAgIH0sCiAgICAgICAgICBjdXN0b206ICh7IHNlcmllcywgZGF0YVBvaW50SW5kZXgsIHc6IHc0IH0pID0+IHsKICAgICAgICAgICAgY29uc3QgY3VycmVudFRoZW1lID0gdzQuY29uZmlnLnRoZW1lLm1vZGU7CiAgICAgICAgICAgIGNvbnN0IGlzRGFya01vZGUgPSBjdXJyZW50VGhlbWUgPT09ICJkYXJrIjsKICAgICAgICAgICAgY29uc3QgYmdDb2xvciA9IGlzRGFya01vZGUgPyAiaHNsKDAgMCUgOSUpIiA6ICJoc2woMCAwJSAxMDAlKSI7CiAgICAgICAgICAgIGNvbnN0IHRleHRDb2xvciA9IGlzRGFya01vZGUgPyAiaHNsKDAgMCUgOTUlKSIgOiAiaHNsKDAgMCUgOSUpIjsKICAgICAgICAgICAgY29uc3QgYm9yZGVyQ29sb3IgPSBpc0RhcmtNb2RlID8gImhzbCgwIDAlIDE0LjklKSIgOiAiaHNsKDAgMCUgODkuOCUpIjsKICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVyMiA9IHc0LmNvbmZpZy55YXhpc1swXT8ubGFiZWxzPy5mb3JtYXR0ZXIgfHwgKCh2YWwpID0+IHZhbC50b1N0cmluZygpKTsKICAgICAgICAgICAgbGV0IHRvb2x0aXBDb250ZW50ID0gYDxkaXYgc3R5bGU9InBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6ICR7YmdDb2xvcn07IGNvbG9yOiAke3RleHRDb2xvcn07IGJvcmRlci1yYWRpdXM6IDZweDsgYm94LXNoYWRvdzogMCAycHggOHB4IDAgaHNsKDAgMCUgMCUgLyAke2lzRGFya01vZGUgPyAiMC4yIiA6ICIwLjEifSk7IGJvcmRlcjogMXB4IHNvbGlkICR7Ym9yZGVyQ29sb3J9O2ZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJweDsiPmA7CiAgICAgICAgICAgIHNlcmllcy5mb3JFYWNoKChzMTAsIGluZGV4MikgPT4gewogICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gdzQuZ2xvYmFscy5zZXJpZXNOYW1lc1tpbmRleDJdOwogICAgICAgICAgICAgIGNvbnN0IHZhbHVlMiA9IHMxMFtkYXRhUG9pbnRJbmRleF07CiAgICAgICAgICAgICAgY29uc3QgY29sb3IyID0gdzQuZ2xvYmFscy5jb2xvcnNbaW5kZXgyXTsKICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IGZvcm1hdHRlcjIodmFsdWUyKTsKICAgICAgICAgICAgICB0b29sdGlwQ29udGVudCArPSBgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IG1hcmdpbjogJHtpbmRleDIgPiAwID8gIjZweCIgOiAiMCJ9IDA7Ij4KICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4OyBiYWNrZ3JvdW5kOiAke2NvbG9yMn07IGJvcmRlci1yYWRpdXM6IDJweDsiPjwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IDUwMDsiPiR7bGFiZWx9Ojwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IGF1dG87IGZvbnQtd2VpZ2h0OiA2MDA7Ij4ke2Zvcm1hdHRlZFZhbHVlfTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+YDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRvb2x0aXBDb250ZW50ICs9IGA8L2Rpdj5gOwogICAgICAgICAgICByZXR1cm4gdG9vbHRpcENvbnRlbnQ7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBncmlkOiB7CiAgICAgICAgICB4YXhpczogewogICAgICAgICAgICBsaW5lczogewogICAgICAgICAgICAgIHNob3c6IGZhbHNlCiAgICAgICAgICAgICAgLy8gSGlkZSB2ZXJ0aWNhbCBncmlkIGxpbmVzIGZvciBjbGVhbmVyIGxvb2sKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIHlheGlzOiB7CiAgICAgICAgICAgIGxpbmVzOiB7CiAgICAgICAgICAgICAgc2hvdzogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgYm9yZGVyQ29sb3I6IGlzRGFyayA/ICJoc2woMCAwJSAxNC45JSkiIDogImhzbCgwIDAlIDk0JSkiLAogICAgICAgICAgLy8gVmVyeSBzdWJ0bGUgZ3JpZCBsaW5lcwogICAgICAgICAgc3Ryb2tlRGFzaEFycmF5OiAwLAogICAgICAgICAgLy8gU29saWQgbGluZQogICAgICAgICAgcGFkZGluZzogewogICAgICAgICAgICB0b3A6IDEwLAogICAgICAgICAgICByaWdodDogMjAsCiAgICAgICAgICAgIGJvdHRvbTogMTAsCiAgICAgICAgICAgIGxlZnQ6IDIwCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBmaWxsOiB7CiAgICAgICAgICB0eXBlOiAiZ3JhZGllbnQiLAogICAgICAgICAgLy8gR3JhZGllbnQgZmlsbCBmb3IgdGhlIGFyZWEKICAgICAgICAgIGdyYWRpZW50OiB7CiAgICAgICAgICAgIHNoYWRlOiBpc0RhcmsgPyAiZGFyayIgOiAibGlnaHQiLAogICAgICAgICAgICB0eXBlOiAidmVydGljYWwiLAogICAgICAgICAgICBzaGFkZUludGVuc2l0eTogMC4xLAogICAgICAgICAgICBvcGFjaXR5RnJvbTogaXNEYXJrID8gMC4yIDogMC4zLAogICAgICAgICAgICBvcGFjaXR5VG86IDAsCiAgICAgICAgICAgIHN0b3BzOiBbMCwgMTAwXQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY29sb3JzOiBpc0RhcmsgPyB0aGlzLkNIQVJUX0NPTE9SUy5kYXJrIDogdGhpcy5DSEFSVF9DT0xPUlMubGlnaHQsCiAgICAgICAgdGhlbWU6IHsKICAgICAgICAgIG1vZGU6IHRoZW1lCiAgICAgICAgfQogICAgICB9OwogICAgICB0cnkgewogICAgICAgIHRoaXMuY2hhcnQgPSBuZXcgQXBleENoYXJ0c0xpYih0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmNoYXJ0Q29udGFpbmVyIiksIG9wdGlvbnMpOwogICAgICAgIGF3YWl0IHRoaXMuY2hhcnQucmVuZGVyKCk7CiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUyLCAxMDApKTsKICAgICAgICBhd2FpdCB0aGlzLnJlc2l6ZUNoYXJ0KCk7CiAgICAgICAgY29uc3QgbWFpbmJveDIgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLm1haW5ib3giKTsKICAgICAgICBpZiAobWFpbmJveDIgJiYgdGhpcy5yZXNpemVPYnNlcnZlcikgewogICAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUobWFpbmJveDIpOwogICAgICAgICAgaWYgKHRoaXMuREVCVUdfUkVTSVpFKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJEZWVzQ2hhcnRBcmVhIC0gUmVzaXplT2JzZXJ2ZXIgYXR0YWNoZWQgdG8gbWFpbmJveCIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjaGFydDoiLCBlcnJvcik7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoImdvQnJpZ2h0IikgJiYgdGhpcy5jaGFydCkgewogICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ2hhcnRUaGVtZSgpOwogICAgICB9CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoInNlcmllcyIpICYmIHRoaXMuY2hhcnQgJiYgdGhpcy5zZXJpZXMubGVuZ3RoID4gMCkgewogICAgICAgIGF3YWl0IHRoaXMudXBkYXRlU2VyaWVzKHRoaXMuc2VyaWVzKTsKICAgICAgfQogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJ5QXhpc0Zvcm1hdHRlciIpICYmIHRoaXMuY2hhcnQpIHsKICAgICAgICBhd2FpdCB0aGlzLmNoYXJ0LnVwZGF0ZU9wdGlvbnMoewogICAgICAgICAgeWF4aXM6IHsKICAgICAgICAgICAgbGFiZWxzOiB7CiAgICAgICAgICAgICAgZm9ybWF0dGVyOiB0aGlzLnlBeGlzRm9ybWF0dGVyCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJyZWFsdGltZU1vZGUiKSAmJiB0aGlzLmNoYXJ0KSB7CiAgICAgICAgYXdhaXQgdGhpcy5jaGFydC51cGRhdGVPcHRpb25zKHsKICAgICAgICAgIGNoYXJ0OiB7CiAgICAgICAgICAgIGFuaW1hdGlvbnM6IHsKICAgICAgICAgICAgICBlbmFibGVkOiAhdGhpcy5yZWFsdGltZU1vZGUsCiAgICAgICAgICAgICAgc3BlZWQ6IDQwMCwKICAgICAgICAgICAgICBhbmltYXRlR3JhZHVhbGx5OiB7CiAgICAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKICAgICAgICAgICAgICAgIGRlbGF5OiAwCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBkeW5hbWljQW5pbWF0aW9uOiB7CiAgICAgICAgICAgICAgICBlbmFibGVkOiAhdGhpcy5yZWFsdGltZU1vZGUsCiAgICAgICAgICAgICAgICBzcGVlZDogMzUwCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHRoaXMucmVhbHRpbWVNb2RlICYmIHRoaXMucm9sbGluZ1dpbmRvdyA+IDAgJiYgdGhpcy5hdXRvU2Nyb2xsSW50ZXJ2YWwgPiAwKSB7CiAgICAgICAgICB0aGlzLnN0YXJ0QXV0b1Njcm9sbCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnN0b3BBdXRvU2Nyb2xsKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoImF1dG9TY3JvbGxJbnRlcnZhbCIpICYmIHRoaXMuY2hhcnQpIHsKICAgICAgICB0aGlzLnN0b3BBdXRvU2Nyb2xsKCk7CiAgICAgICAgaWYgKHRoaXMucmVhbHRpbWVNb2RlICYmIHRoaXMucm9sbGluZ1dpbmRvdyA+IDAgJiYgdGhpcy5hdXRvU2Nyb2xsSW50ZXJ2YWwgPiAwKSB7CiAgICAgICAgICB0aGlzLnN0YXJ0QXV0b1Njcm9sbCgpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygieUF4aXNTY2FsaW5nIikgfHwgY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJ5QXhpc01heCIpKSAmJiB0aGlzLmNoYXJ0KSB7CiAgICAgICAgYXdhaXQgdGhpcy5jaGFydC51cGRhdGVPcHRpb25zKHsKICAgICAgICAgIHlheGlzOiB7CiAgICAgICAgICAgIG1pbjogMCwKICAgICAgICAgICAgbWF4OiB0aGlzLnlBeGlzU2NhbGluZyA9PT0gImR5bmFtaWMiID8gdm9pZCAwIDogdGhpcy55QXhpc01heAogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICBhc3luYyB1cGRhdGVTZXJpZXMobmV3U2VyaWVzLCBhbmltYXRlID0gdHJ1ZSkgewogICAgICBpZiAoIXRoaXMuY2hhcnQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICB0aGlzLmludGVybmFsQ2hhcnREYXRhID0gbmV3U2VyaWVzOwogICAgICAgIGlmICh0aGlzLnJvbGxpbmdXaW5kb3cgPiAwICYmIHRoaXMucmVhbHRpbWVNb2RlKSB7CiAgICAgICAgICBjb25zdCBub3cyID0gRGF0ZS5ub3coKTsKICAgICAgICAgIGNvbnN0IGN1dG9mZlRpbWUgPSBub3cyIC0gdGhpcy5yb2xsaW5nV2luZG93OwogICAgICAgICAgY29uc3QgZmlsdGVyZWRTZXJpZXMgPSBuZXdTZXJpZXMubWFwKChzZXJpZXMpID0+ICh7CiAgICAgICAgICAgIG5hbWU6IHNlcmllcy5uYW1lLAogICAgICAgICAgICBkYXRhOiBzZXJpZXMuZGF0YS5maWx0ZXIoKHBvaW50NCkgPT4gewogICAgICAgICAgICAgIGlmICh0eXBlb2YgcG9pbnQ0ID09PSAib2JqZWN0IiAmJiBwb2ludDQgIT09IG51bGwgJiYgIngiIGluIHBvaW50NCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHBvaW50NC54KS5nZXRUaW1lKCkgPiBjdXRvZmZUaW1lOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pCiAgICAgICAgICB9KSk7CiAgICAgICAgICBpZiAoZmlsdGVyZWRTZXJpZXMuc29tZSgoczEwKSA9PiBzMTAuZGF0YS5sZW5ndGggPiAwKSkgewogICAgICAgICAgICBpZiAodGhpcy55QXhpc1NjYWxpbmcgPT09ICJkeW5hbWljIikgewogICAgICAgICAgICAgIGNvbnN0IGFsbFZhbHVlcyA9IGZpbHRlcmVkU2VyaWVzLmZsYXRNYXAoKHMxMCkgPT4gczEwLmRhdGEubWFwKChkNikgPT4gZDYueSkpOwogICAgICAgICAgICAgIGlmIChhbGxWYWx1ZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY29uc3QgbWF4VmFsdWUgPSBNYXRoLm1heCguLi5hbGxWYWx1ZXMpOwogICAgICAgICAgICAgICAgY29uc3QgZHluYW1pY01heCA9IE1hdGguY2VpbChtYXhWYWx1ZSAqIDEuMSk7CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoYXJ0LnVwZGF0ZU9wdGlvbnMoewogICAgICAgICAgICAgICAgICB5YXhpczogewogICAgICAgICAgICAgICAgICAgIG1pbjogMCwKICAgICAgICAgICAgICAgICAgICBtYXg6IGR5bmFtaWNNYXgKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGFydC51cGRhdGVTZXJpZXMoZmlsdGVyZWRTZXJpZXMsIGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXdhaXQgdGhpcy5jaGFydC51cGRhdGVTZXJpZXMobmV3U2VyaWVzLCBhbmltYXRlKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHVwZGF0ZSBjaGFydCBzZXJpZXM6IiwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICAvLyBVcGRhdGUganVzdCB0aGUgeC1heGlzIGZvciBzbW9vdGggc2Nyb2xsaW5nIGluIHJlYWx0aW1lIG1vZGUKICAgIC8vIFB1YmxpYyBmb3IgYWR2YW5jZWQgdXNhZ2UgaW4gZGVtb3MsIGJ1dCB0eXBpY2FsbHkgaGFuZGxlZCBhdXRvbWF0aWNhbGx5CiAgICBhc3luYyB1cGRhdGVUaW1lV2luZG93KCkgewogICAgICBpZiAoIXRoaXMuY2hhcnQgfHwgdGhpcy5yb2xsaW5nV2luZG93IDw9IDApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgbm93MiA9IERhdGUubm93KCk7CiAgICAgIGNvbnN0IGN1dG9mZlRpbWUgPSBub3cyIC0gdGhpcy5yb2xsaW5nV2luZG93OwogICAgICBhd2FpdCB0aGlzLmNoYXJ0LnVwZGF0ZU9wdGlvbnMoewogICAgICAgIHhheGlzOiB7CiAgICAgICAgICBtaW46IGN1dG9mZlRpbWUsCiAgICAgICAgICBtYXg6IG5vdzIsCiAgICAgICAgICBsYWJlbHM6IHsKICAgICAgICAgICAgZm9ybWF0OiAiSEg6bW06c3MiLAogICAgICAgICAgICBkYXRldGltZVVUQzogZmFsc2UsCiAgICAgICAgICAgIHN0eWxlOiB7CiAgICAgICAgICAgICAgY29sb3JzOiBbIXRoaXMuZ29CcmlnaHQgPyAiaHNsKDAgMCUgNjMuOSUpIiA6ICJoc2woMCAwJSAyMCUpIl0sCiAgICAgICAgICAgICAgZm9udFNpemU6ICIxMnB4IiwKICAgICAgICAgICAgICBmb250RmFtaWx5OiAnLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBzYW5zLXNlcmlmJywKICAgICAgICAgICAgICBmb250V2VpZ2h0OiAiNDAwIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgdGlja0Ftb3VudDogNgogICAgICAgIH0KICAgICAgfSwgZmFsc2UsIGZhbHNlKTsKICAgIH0KICAgIGFzeW5jIGFwcGVuZERhdGEobmV3RGF0YSkgewogICAgICBpZiAoIXRoaXMuY2hhcnQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5jaGFydC5hcHBlbmREYXRhKG5ld0RhdGEpOwogICAgfQogICAgYXN5bmMgdXBkYXRlT3B0aW9ucyhvcHRpb25zLCByZWRyYXdQYXRocywgYW5pbWF0ZSkgewogICAgICBpZiAoIXRoaXMuY2hhcnQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuY2hhcnQudXBkYXRlT3B0aW9ucyhvcHRpb25zLCByZWRyYXdQYXRocywgYW5pbWF0ZSk7CiAgICB9CiAgICBhc3luYyByZXNpemVDaGFydCgpIHsKICAgICAgaWYgKCF0aGlzLmNoYXJ0KSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLkRFQlVHX1JFU0laRSkgewogICAgICAgIGNvbnNvbGUubG9nKCJEZWVzQ2hhcnRBcmVhIC0gcmVzaXplQ2hhcnQgY2FsbGVkIik7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBtYWluYm94ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5tYWluYm94Iik7CiAgICAgICAgY29uc3QgY2hhcnRDb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmNoYXJ0Q29udGFpbmVyIik7CiAgICAgICAgaWYgKCFtYWluYm94IHx8ICFjaGFydENvbnRhaW5lcikgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2b2lkIG1haW5ib3gub2Zmc2V0SGVpZ2h0OwogICAgICAgIGNvbnN0IHN0eWxlQ2hhcnRDb250YWluZXIgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjaGFydENvbnRhaW5lcik7CiAgICAgICAgY29uc3QgcGFkZGluZ1RvcCA9IHBhcnNlSW50KHN0eWxlQ2hhcnRDb250YWluZXIucGFkZGluZ1RvcCwgMTApOwogICAgICAgIGNvbnN0IHBhZGRpbmdCb3R0b20gPSBwYXJzZUludChzdHlsZUNoYXJ0Q29udGFpbmVyLnBhZGRpbmdCb3R0b20sIDEwKTsKICAgICAgICBjb25zdCBwYWRkaW5nTGVmdCA9IHBhcnNlSW50KHN0eWxlQ2hhcnRDb250YWluZXIucGFkZGluZ0xlZnQsIDEwKTsKICAgICAgICBjb25zdCBwYWRkaW5nUmlnaHQgPSBwYXJzZUludChzdHlsZUNoYXJ0Q29udGFpbmVyLnBhZGRpbmdSaWdodCwgMTApOwogICAgICAgIGNvbnN0IGFjdHVhbFdpZHRoID0gbWFpbmJveC5jbGllbnRXaWR0aCAtIHBhZGRpbmdMZWZ0IC0gcGFkZGluZ1JpZ2h0OwogICAgICAgIGNvbnN0IGFjdHVhbEhlaWdodCA9IG1haW5ib3gub2Zmc2V0SGVpZ2h0IC0gcGFkZGluZ1RvcCAtIHBhZGRpbmdCb3R0b207CiAgICAgICAgaWYgKGFjdHVhbFdpZHRoID4gMCAmJiBhY3R1YWxIZWlnaHQgPiAwKSB7CiAgICAgICAgICBpZiAodGhpcy5ERUJVR19SRVNJWkUpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coIkRlZXNDaGFydEFyZWEgLSBVcGRhdGluZyBjaGFydCBkaW1lbnNpb25zOiIsIHsKICAgICAgICAgICAgICB3aWR0aDogYWN0dWFsV2lkdGgsCiAgICAgICAgICAgICAgaGVpZ2h0OiBhY3R1YWxIZWlnaHQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBhd2FpdCB0aGlzLmNoYXJ0LnVwZGF0ZU9wdGlvbnMoewogICAgICAgICAgICBjaGFydDogewogICAgICAgICAgICAgIHdpZHRoOiBhY3R1YWxXaWR0aCwKICAgICAgICAgICAgICBoZWlnaHQ6IGFjdHVhbEhlaWdodAogICAgICAgICAgICB9CiAgICAgICAgICB9LCB0cnVlLCBmYWxzZSk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byByZXNpemUgY2hhcnQ6IiwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIE1hbnVhbGx5IHRyaWdnZXIgYSBjaGFydCByZXNpemUuIFVzZWZ1bCB3aGVuIGF1dG9tYXRpYyBkZXRlY3Rpb24gZG9lc24ndCB3b3JrLgogICAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNhbiBiZSBjYWxsZWQgZnJvbSBvdXRzaWRlIHRoZSBjb21wb25lbnQuCiAgICAgKi8KICAgIGFzeW5jIGZvcmNlUmVzaXplKCkgewogICAgICBhd2FpdCB0aGlzLnJlc2l6ZUNoYXJ0KCk7CiAgICB9CiAgICBzdGFydEF1dG9TY3JvbGwoKSB7CiAgICAgIGlmICh0aGlzLmF1dG9TY3JvbGxUaW1lcikgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLmF1dG9TY3JvbGxUaW1lciA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgdGhpcy51cGRhdGVUaW1lV2luZG93KCk7CiAgICAgIH0sIHRoaXMuYXV0b1Njcm9sbEludGVydmFsKTsKICAgIH0KICAgIHN0b3BBdXRvU2Nyb2xsKCkgewogICAgICBpZiAodGhpcy5hdXRvU2Nyb2xsVGltZXIpIHsKICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmF1dG9TY3JvbGxUaW1lcik7CiAgICAgICAgdGhpcy5hdXRvU2Nyb2xsVGltZXIgPSBudWxsOwogICAgICB9CiAgICB9CiAgICBhc3luYyB1cGRhdGVDaGFydFRoZW1lKCkgewogICAgICBpZiAoIXRoaXMuY2hhcnQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgaXNEYXJrID0gIXRoaXMuZ29CcmlnaHQ7CiAgICAgIGNvbnN0IHRoZW1lID0gaXNEYXJrID8gImRhcmsiIDogImxpZ2h0IjsKICAgICAgYXdhaXQgdGhpcy5jaGFydC51cGRhdGVPcHRpb25zKHsKICAgICAgICB0aGVtZTogewogICAgICAgICAgbW9kZTogdGhlbWUKICAgICAgICB9LAogICAgICAgIGNvbG9yczogaXNEYXJrID8gdGhpcy5DSEFSVF9DT0xPUlMuZGFyayA6IHRoaXMuQ0hBUlRfQ09MT1JTLmxpZ2h0LAogICAgICAgIHhheGlzOiB7CiAgICAgICAgICBsYWJlbHM6IHsKICAgICAgICAgICAgc3R5bGU6IHsKICAgICAgICAgICAgICBjb2xvcnM6IFtpc0RhcmsgPyAiaHNsKDAgMCUgNjMuOSUpIiA6ICJoc2woMCAwJSAyMCUpIl0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgeWF4aXM6IHsKICAgICAgICAgIGxhYmVsczogewogICAgICAgICAgICBzdHlsZTogewogICAgICAgICAgICAgIGNvbG9yczogW2lzRGFyayA/ICJoc2woMCAwJSA2My45JSkiIDogImhzbCgwIDAlIDIwJSkiXQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBncmlkOiB7CiAgICAgICAgICBib3JkZXJDb2xvcjogaXNEYXJrID8gImhzbCgwIDAlIDE0LjklKSIgOiAiaHNsKDAgMCUgOTQlKSIKICAgICAgICB9LAogICAgICAgIGZpbGw6IHsKICAgICAgICAgIGdyYWRpZW50OiB7CiAgICAgICAgICAgIHNoYWRlOiBpc0RhcmsgPyAiZGFyayIgOiAibGlnaHQiLAogICAgICAgICAgICBvcGFjaXR5RnJvbTogaXNEYXJrID8gMC4yIDogMC4zCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNTQoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNDaGFydEFyZWEyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1jaGFydC9kZWVzLWNoYXJ0LWxvZy9kZWVzLWNoYXJ0LWxvZy5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkZW1vRnVuYzM3ID0gKCkgPT4gewogIHJldHVybiBiMmAKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgICBjb25zdCBzdHJ1Y3R1cmVkTG9nID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjc3RydWN0dXJlZC1sb2ciKTsKICAgIGNvbnN0IHJhd0xvZyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiI3Jhdy1sb2ciKTsKICAgIGxldCBzdHJ1Y3R1cmVkSW50ZXJ2YWxJZDsKICAgIGxldCByYXdJbnRlcnZhbElkOwogICAgY29uc3Qgc2VydmVyU291cmNlcyA9IFsiU2VydmVyIiwgIkRhdGFiYXNlIiwgIkFQSSIsICJBdXRoIiwgIkNhY2hlIiwgIlF1ZXVlIiwgIldlYlNvY2tldCIsICJTY2hlZHVsZXIiXTsKICAgIGNvbnN0IGxvZ1RlbXBsYXRlcyA9IHsKICAgICAgZGVidWc6IFsKICAgICAgICAiTG9hZGluZyBtb2R1bGU6IHt7bW9kdWxlfX0iLAogICAgICAgICJDYWNoZSBoaXQgZm9yIGtleToge3trZXl9fSIsCiAgICAgICAgIlNRTCBxdWVyeSBleGVjdXRlZCBpbiB7e3RpbWV9fW1zIiwKICAgICAgICAiUmVxdWVzdCBoZWFkZXJzOiB7e2hlYWRlcnN9fSIsCiAgICAgICAgIkVudmlyb25tZW50IHZhcmlhYmxlIGxvYWRlZDoge3t2YXJ9fSIKICAgICAgXSwKICAgICAgaW5mbzogWwogICAgICAgICJSZXF1ZXN0IHJlY2VpdmVkOiB7e21ldGhvZH19IHt7cGF0aH19IiwKICAgICAgICAiVXNlciB7e3VzZXJJZH19IGF1dGhlbnRpY2F0ZWQgc3VjY2Vzc2Z1bGx5IiwKICAgICAgICAiUHJvY2Vzc2luZyBqb2Ige3tqb2JJZH19IGZyb20gcXVldWUiLAogICAgICAgICdTY2hlZHVsZWQgdGFzayAie3t0YXNrfX0iIHN0YXJ0ZWQnLAogICAgICAgICJXZWJTb2NrZXQgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCBmcm9tIHt7aXB9fSIKICAgICAgXSwKICAgICAgd2FybjogWwogICAgICAgICJTbG93IHF1ZXJ5IGRldGVjdGVkOiB7e3F1ZXJ5fX0gKHt7dGltZX19bXMpIiwKICAgICAgICAiTWVtb3J5IHVzYWdlIGF0IHt7cGVyY2VudH19JSIsCiAgICAgICAgIlJhdGUgbGltaXQgYXBwcm9hY2hpbmcgZm9yIElQIHt7aXB9fSIsCiAgICAgICAgIkRlcHJlY2F0ZWQgQVBJIGVuZHBvaW50IGNhbGxlZDoge3tlbmRwb2ludH19IiwKICAgICAgICAiQ2VydGlmaWNhdGUgZXhwaXJlcyBpbiB7e2RheXN9fSBkYXlzIgogICAgICBdLAogICAgICBlcnJvcjogWwogICAgICAgICJEYXRhYmFzZSBjb25uZWN0aW9uIGxvc3Q6IHt7ZXJyb3J9fSIsCiAgICAgICAgIkZhaWxlZCB0byBwcm9jZXNzIHJlcXVlc3Q6IHt7ZXJyb3J9fSIsCiAgICAgICAgIkF1dGhlbnRpY2F0aW9uIGZhaWxlZCBmb3IgdXNlciB7e3VzZXJ9fSIsCiAgICAgICAgIkZpbGUgbm90IGZvdW5kOiB7e3BhdGh9fSIsCiAgICAgICAgIlNlcnZpY2UgdW5hdmFpbGFibGU6IHt7c2VydmljZX19IgogICAgICBdLAogICAgICBzdWNjZXNzOiBbCiAgICAgICAgIlNlcnZlciBzdGFydGVkIHN1Y2Nlc3NmdWxseSBvbiBwb3J0IHt7cG9ydH19IiwKICAgICAgICAiRGF0YWJhc2UgbWlncmF0aW9uIGNvbXBsZXRlZCIsCiAgICAgICAgIkJhY2t1cCBjb21wbGV0ZWQ6IHt7c2l6ZX19IE1CIiwKICAgICAgICAiU1NMIGNlcnRpZmljYXRlIHJlbmV3ZWQiLAogICAgICAgICJIZWFsdGggY2hlY2sgcGFzc2VkOiBhbGwgc3lzdGVtcyBvcGVyYXRpb25hbCIKICAgICAgXQogICAgfTsKICAgIGNvbnN0IGRvY2tlckxvZ1RlbXBsYXRlcyA9IFsKICAgICAgIlx4MUJbOTBtMjAyNC0wMS0xNVQxMDoyMzo0NS4xMjNaXHgxQlswbSBceDFCWzM2bUlORk9ceDFCWzBtICBbbmdpbnhdIEdFVCAvYXBpL2hlYWx0aCAyMDAgLSAybXMiLAogICAgICAiXHgxQls5MG0yMDI0LTAxLTE1VDEwOjIzOjQ1LjQ1NlpceDFCWzBtIFx4MUJbMzNtV0FSTlx4MUJbMG0gIFtyZWRpc10gQ29ubmVjdGlvbiBwb29sIHJ1bm5pbmcgbG93OiAzLzEwIiwKICAgICAgIlx4MUJbOTBtMjAyNC0wMS0xNVQxMDoyMzo0NS43ODlaXHgxQlswbSBceDFCWzMxbUVSUk9SXHgxQlswbSBbbW9uZ29kYl0gUXVlcnkgdGltZW91dCBhZnRlciAzMDAwMG1zIiwKICAgICAgIlx4MUJbOTBtMjAyNC0wMS0xNVQxMDoyMzo0Ni4wMTJaXHgxQlswbSBceDFCWzM2bUlORk9ceDFCWzBtICBbYXBwXSBQcm9jZXNzaW5nIGJhdGNoIGpvYiAje3tqb2JJZH19IiwKICAgICAgIlx4MUJbOTBtMjAyNC0wMS0xNVQxMDoyMzo0Ni4zNDVaXHgxQlswbSBceDFCWzMybU9LXHgxQlswbSAgICBbaGVhbHRoXSBBbGwgc2VydmljZXMgaGVhbHRoeSIsCiAgICAgICJceDFCWzkwbTIwMjQtMDEtMTVUMTA6MjM6NDYuNjc4Wlx4MUJbMG0gXHgxQlszNm1JTkZPXHgxQlswbSAgW2thZmthXSBNZXNzYWdlIGNvbnN1bWVkIGZyb20gdG9waWM6IGV2ZW50cyIsCiAgICAgICJceDFCWzkwbTIwMjQtMDEtMTVUMTA6MjM6NDcuMDAxWlx4MUJbMG0gXHgxQlszNW1ERUJVR1x4MUJbMG0gW2dycGNdIFJlcXVlc3QgcmVjZWl2ZWQ6IEdldFVzZXIoaWQ9e3t1c2VySWR9fSkiLAogICAgICAiXHgxQls5MG0yMDI0LTAxLTE1VDEwOjIzOjQ3LjIzNFpceDFCWzBtIFx4MUJbMzFtRVJST1JceDFCWzBtIFthdXRoXSBUb2tlbiB2YWxpZGF0aW9uIGZhaWxlZDogZXhwaXJlZCIsCiAgICAgICJceDFCWzkwbTIwMjQtMDEtMTVUMTA6MjM6NDcuNTY3Wlx4MUJbMG0gXHgxQlszM21XQVJOXHgxQlswbSAgW3JhdGUtbGltaXRdIElQIHt7aXB9fSBhcHByb2FjaGluZyByYXRlIGxpbWl0IiwKICAgICAgIlx4MUJbOTBtMjAyNC0wMS0xNVQxMDoyMzo0Ny44OTBaXHgxQlswbSBceDFCWzM2bUlORk9ceDFCWzBtICBbd2Vic29ja2V0XSBDbGllbnQgY29ubmVjdGVkOiBzZXNzaW9uPXt7c2Vzc2lvbn19IiwKICAgICAgLy8gTXVsdGktbGluZSBsb2cgZW50cnkgbGlrZSBzdGFjayB0cmFjZXMKICAgICAgIlx4MUJbMzFtRXJyb3I6IENvbm5lY3Rpb24gcmVmdXNlZFx4MUJbMG1cbiAgICBhdCBUY3BDb25uZWN0aW9uLmNvbm5lY3QgKC9hcHAvbm9kZV9tb2R1bGVzL3BnL2xpYi9jb25uZWN0aW9uLmpzOjEyOjE1KVxuICAgIGF0IFBvb2wuY29ubmVjdCAoL2FwcC9ub2RlX21vZHVsZXMvcGcvbGliL3Bvb2wuanM6NDU6MjMpXG4gICAgYXQgYXN5bmMgRGF0YWJhc2VTZXJ2aWNlLnF1ZXJ5ICgvYXBwL3NyYy9kYi9zZXJ2aWNlLnRzOjg5OjEyKSIKICAgIF07CiAgICBjb25zdCBnZW5lcmF0ZVJhbmRvbUxvZyA9ICgpID0+IHsKICAgICAgY29uc3QgbGV2ZWxzID0gWyJkZWJ1ZyIsICJpbmZvIiwgIndhcm4iLCAiZXJyb3IiLCAic3VjY2VzcyJdOwogICAgICBjb25zdCB3ZWlnaHRzID0gWzAuMiwgMC41LCAwLjE1LCAwLjEsIDAuMDVdOwogICAgICBjb25zdCByYW5kb20gPSBNYXRoLnJhbmRvbSgpOwogICAgICBsZXQgY3VtdWxhdGl2ZSA9IDA7CiAgICAgIGxldCBsZXZlbCA9ICJpbmZvIjsKICAgICAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgd2VpZ2h0cy5sZW5ndGg7IGkxMSsrKSB7CiAgICAgICAgY3VtdWxhdGl2ZSArPSB3ZWlnaHRzW2kxMV07CiAgICAgICAgaWYgKHJhbmRvbSA8IGN1bXVsYXRpdmUpIHsKICAgICAgICAgIGxldmVsID0gbGV2ZWxzW2kxMV07CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3Qgc291cmNlID0gc2VydmVyU291cmNlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBzZXJ2ZXJTb3VyY2VzLmxlbmd0aCldOwogICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBsb2dUZW1wbGF0ZXNbbGV2ZWxdOwogICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRlbXBsYXRlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0ZW1wbGF0ZXMubGVuZ3RoKV07CiAgICAgIGNvbnN0IG1lc3NhZ2UyID0gdGVtcGxhdGUucmVwbGFjZSgie3ttb2R1bGV9fSIsIFsiZXhwcmVzcyIsICJtb25nb29zZSIsICJyZWRpcyIsICJzb2NrZXQuaW8iXVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA0KV0pLnJlcGxhY2UoInt7a2V5fX0iLCAidXNlcjoiICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMWUzKSkucmVwbGFjZSgie3t0aW1lfX0iLCBTdHJpbmcoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNTAwKSArIDUwKSkucmVwbGFjZSgie3toZWFkZXJzfX0iLCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uLCBBdXRob3JpemF0aW9uOiBCZWFyZXIgLi4uIikucmVwbGFjZSgie3t2YXJ9fSIsIFsiTk9ERV9FTlYiLCAiREFUQUJBU0VfVVJMIiwgIkFQSV9LRVkiLCAiUE9SVCJdW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDQpXSkucmVwbGFjZSgie3ttZXRob2R9fSIsIFsiR0VUIiwgIlBPU1QiLCAiUFVUIiwgIkRFTEVURSJdW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDQpXSkucmVwbGFjZSgie3twYXRofX0iLCBbIi9hcGkvdXNlcnMiLCAiL2FwaS9hdXRoL2xvZ2luIiwgIi9hcGkvcHJvZHVjdHMiLCAiL2hlYWx0aCJdW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDQpXSkucmVwbGFjZSgie3t1c2VySWR9fSIsIFN0cmluZyhNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxZTQpKSkucmVwbGFjZSgie3tqb2JJZH19IiwgImpvYl8iICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDExKSkucmVwbGFjZSgie3t0YXNrfX0iLCBbImNsZWFudXAiLCAiYmFja3VwIiwgInJlcG9ydC1nZW5lcmF0aW9uIiwgImNhY2hlLXJlZnJlc2giXVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA0KV0pLnJlcGxhY2UoInt7aXB9fSIsIGAxOTIuMTY4LjEuJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyNTUpfWApLnJlcGxhY2UoInt7cXVlcnl9fSIsICJTRUxFQ1QgKiBGUk9NIHVzZXJzIFdIRVJFIC4uLiIpLnJlcGxhY2UoInt7cGVyY2VudH19IiwgU3RyaW5nKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDMwKSArIDcwKSkucmVwbGFjZSgie3tlbmRwb2ludH19IiwgIi9hcGkvdjEvbGVnYWN5IikucmVwbGFjZSgie3tkYXlzfX0iLCBTdHJpbmcoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMzApICsgMSkpLnJlcGxhY2UoInt7ZXJyb3J9fSIsIFsiRUNPTk5SRUZVU0VEIiwgIkVUSU1FRE9VVCIsICJFTk9URk9VTkQiXVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAzKV0pLnJlcGxhY2UoInt7dXNlcn19IiwgInVzZXJfIiArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDFlMykpLnJlcGxhY2UoInt7c2VydmljZX19IiwgWyJSZWRpcyIsICJNb25nb0RCIiwgIkVsYXN0aWNTZWFyY2giXVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAzKV0pLnJlcGxhY2UoInt7cG9ydH19IiwgU3RyaW5nKDNlMyArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwKSkpLnJlcGxhY2UoInt7c2l6ZX19IiwgU3RyaW5nKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDUwMCkgKyAxMDApKTsKICAgICAgc3RydWN0dXJlZExvZy5hZGRMb2cobGV2ZWwsIG1lc3NhZ2UyLCBzb3VyY2UpOwogICAgfTsKICAgIGNvbnN0IGdlbmVyYXRlRG9ja2VyTG9nID0gKCkgPT4gewogICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY2tlckxvZ1RlbXBsYXRlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBkb2NrZXJMb2dUZW1wbGF0ZXMubGVuZ3RoKV07CiAgICAgIGNvbnN0IG5vdzIgPSAoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCk7CiAgICAgIGNvbnN0IGxvZ0xpbmUgPSB0ZW1wbGF0ZS5yZXBsYWNlKC8yMDI0LTAxLTE1VDEwOjIzOlxkezJ9XC5cZHszfVovZywgbm93MikucmVwbGFjZSgie3tqb2JJZH19IiwgU3RyaW5nKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDFlNCkpKS5yZXBsYWNlKCJ7e3VzZXJJZH19IiwgU3RyaW5nKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDFlNCkpKS5yZXBsYWNlKCJ7e2lwfX0iLCBgMTkyLjE2OC4xLiR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU1KX1gKS5yZXBsYWNlKCJ7e3Nlc3Npb259fSIsIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxMSkpOwogICAgICByYXdMb2cud3JpdGVsblJhdyhsb2dMaW5lKTsKICAgIH07CiAgICBjb25zdCBzdGFydFN0cnVjdHVyZWRTaW11bGF0aW9uID0gKCkgPT4gewogICAgICBpZiAoIXN0cnVjdHVyZWRJbnRlcnZhbElkKSB7CiAgICAgICAgY29uc3Qgc2NoZWR1bGVOZXh0ID0gKCkgPT4gewogICAgICAgICAgZ2VuZXJhdGVSYW5kb21Mb2coKTsKICAgICAgICAgIGNvbnN0IG5leHREZWxheSA9IE1hdGgucmFuZG9tKCkgKiAyZTMgKyA1MDA7CiAgICAgICAgICBzdHJ1Y3R1cmVkSW50ZXJ2YWxJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgaWYgKHN0cnVjdHVyZWRJbnRlcnZhbElkKSB7CiAgICAgICAgICAgICAgc2NoZWR1bGVOZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIG5leHREZWxheSk7CiAgICAgICAgfTsKICAgICAgICBzY2hlZHVsZU5leHQoKTsKICAgICAgfQogICAgfTsKICAgIGNvbnN0IHN0b3BTdHJ1Y3R1cmVkU2ltdWxhdGlvbiA9ICgpID0+IHsKICAgICAgaWYgKHN0cnVjdHVyZWRJbnRlcnZhbElkKSB7CiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChzdHJ1Y3R1cmVkSW50ZXJ2YWxJZCk7CiAgICAgICAgc3RydWN0dXJlZEludGVydmFsSWQgPSBudWxsOwogICAgICB9CiAgICB9OwogICAgY29uc3Qgc3RhcnRSYXdTaW11bGF0aW9uID0gKCkgPT4gewogICAgICBpZiAoIXJhd0ludGVydmFsSWQpIHsKICAgICAgICBjb25zdCBzY2hlZHVsZU5leHQgPSAoKSA9PiB7CiAgICAgICAgICBnZW5lcmF0ZURvY2tlckxvZygpOwogICAgICAgICAgY29uc3QgbmV4dERlbGF5ID0gTWF0aC5yYW5kb20oKSAqIDFlMyArIDIwMDsKICAgICAgICAgIHJhd0ludGVydmFsSWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGlmIChyYXdJbnRlcnZhbElkKSB7CiAgICAgICAgICAgICAgc2NoZWR1bGVOZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIG5leHREZWxheSk7CiAgICAgICAgfTsKICAgICAgICBzY2hlZHVsZU5leHQoKTsKICAgICAgfQogICAgfTsKICAgIGNvbnN0IHN0b3BSYXdTaW11bGF0aW9uID0gKCkgPT4gewogICAgICBpZiAocmF3SW50ZXJ2YWxJZCkgewogICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQocmF3SW50ZXJ2YWxJZCk7CiAgICAgICAgcmF3SW50ZXJ2YWxJZCA9IG51bGw7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCBidXR0b25zID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yQWxsKCJkZWVzLWJ1dHRvbiIpOwogICAgYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHsKICAgICAgY29uc3QgdGV4dDkgPSBidXR0b24udGV4dENvbnRlbnQ/LnRyaW0oKTsKICAgICAgc3dpdGNoICh0ZXh0OSkgewogICAgICAgIGNhc2UgIkFkZCBTdHJ1Y3R1cmVkIExvZyI6CiAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBnZW5lcmF0ZVJhbmRvbUxvZygpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlN0YXJ0IFN0cnVjdHVyZWQiOgogICAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gc3RhcnRTdHJ1Y3R1cmVkU2ltdWxhdGlvbigpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlN0b3AgU3RydWN0dXJlZCI6CiAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBzdG9wU3RydWN0dXJlZFNpbXVsYXRpb24oKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJBZGQgRG9ja2VyIExvZyI6CiAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBnZW5lcmF0ZURvY2tlckxvZygpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlN0YXJ0IERvY2tlciI6CiAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBzdGFydFJhd1NpbXVsYXRpb24oKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJTdG9wIERvY2tlciI6CiAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBzdG9wUmF3U2ltdWxhdGlvbigpKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9KTsKICB9fT4KICAgICAgPHN0eWxlPgogICAgICAgICR7aWAKICAgICAgICAgIC5kZW1vQm94IHsKICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTUlKSIsICJoc2woMCAwJSA1JSkiKX07CiAgICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICAgIHBhZGRpbmc6IDQwcHg7CiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICAgIGdhcDogMjRweDsKICAgICAgICAgIH0KICAgICAgICAgIC5zZWN0aW9uIHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgICAgfQogICAgICAgICAgLnNlY3Rpb24tdGl0bGUgewogICAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAnR2Vpc3QgU2FucycsIHNhbnMtc2VyaWY7CiAgICAgICAgICB9CiAgICAgICAgICAuc2VjdGlvbi1kZXNjcmlwdGlvbiB7CiAgICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNS40IDE2LjMlIDQ2LjklKSIsICJoc2woMjE1IDIwLjIlIDY1LjElKSIpfTsKICAgICAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCBzYW5zLXNlcmlmOwogICAgICAgICAgfQogICAgICAgICAgLmNvbnRyb2xzIHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgZ2FwOiAxMHB4OwogICAgICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgICB9CiAgICAgICAgYH0KICAgICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9ImRlbW9Cb3giPgogICAgICA8IS0tIFN0cnVjdHVyZWQgTG9ncyBTZWN0aW9uIC0tPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5TdHJ1Y3R1cmVkIExvZ3MgKElMb2dFbnRyeSk8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj4KICAgICAgICAgIFN0cnVjdHVyZWQgbG9nIGVudHJpZXMgd2l0aCBsZXZlbCwgbWVzc2FnZSwgYW5kIHNvdXJjZS4gU3VwcG9ydHMgc2VhcmNoIGFuZCBrZXl3b3JkIGhpZ2hsaWdodGluZy4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9scyI+CiAgICAgICAgICA8ZGVlcy1idXR0b24+QWRkIFN0cnVjdHVyZWQgTG9nPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbj5TdGFydCBTdHJ1Y3R1cmVkPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbj5TdG9wIFN0cnVjdHVyZWQ8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkZWVzLWNoYXJ0LWxvZwogICAgICAgICAgaWQ9InN0cnVjdHVyZWQtbG9nIgogICAgICAgICAgLmxhYmVsPSR7IlByb2R1Y3Rpb24gU2VydmVyIExvZ3MifQogICAgICAgICAgLmhpZ2hsaWdodEtleXdvcmRzPSR7WyJlcnJvciIsICJmYWlsZWQiLCAidGltZW91dCJdfQogICAgICAgICAgLnNob3dNZXRyaWNzPSR7dHJ1ZX0KICAgICAgICA+PC9kZWVzLWNoYXJ0LWxvZz4KICAgICAgPC9kaXY+CgogICAgICA8IS0tIFJhdyBMb2dzIFNlY3Rpb24gLS0+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlJhdyBMb2dzIChEb2NrZXIvQ29udGFpbmVyIFN0eWxlKTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPgogICAgICAgICAgUmF3IGxvZyBvdXRwdXQgd2l0aCBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgZm9yIHJlYWwgRG9ja2VyL2NvbnRhaW5lciBsb2dzLgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xzIj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbj5BZGQgRG9ja2VyIExvZzwvZGVlcy1idXR0b24+CiAgICAgICAgICA8ZGVlcy1idXR0b24+U3RhcnQgRG9ja2VyPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbj5TdG9wIERvY2tlcjwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRlZXMtY2hhcnQtbG9nCiAgICAgICAgICBpZD0icmF3LWxvZyIKICAgICAgICAgIC5sYWJlbD0keyJEb2NrZXIgQ29udGFpbmVyIExvZ3MifQogICAgICAgICAgLm1vZGU9JHsicmF3In0KICAgICAgICAgIC5zaG93TWV0cmljcz0ke2ZhbHNlfQogICAgICAgID48L2RlZXMtY2hhcnQtbG9nPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgogIGA7Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtY2hhcnQvZGVlcy1jaGFydC1sb2cvZGVlcy1jaGFydC1sb2cuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF9kaXN0X3RzMjkoKTsKaW5pdF90aGVtZSgpOwppbml0X3NlcnZpY2VzKCk7CnZhciBfX2VzRGVjb3JhdGU1NCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNTUgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNDaGFydExvZyA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1jaGFydC1sb2ciKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9sYWJlbF9kZWNvcmF0b3JzOwogIGxldCBfbGFiZWxfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sYWJlbF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW9kZV9kZWNvcmF0b3JzOwogIGxldCBfbW9kZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21vZGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xvZ0VudHJpZXNfZGVjb3JhdG9yczsKICBsZXQgX2xvZ0VudHJpZXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb2dFbnRyaWVzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdXRvU2Nyb2xsX2RlY29yYXRvcnM7CiAgbGV0IF9hdXRvU2Nyb2xsX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYXV0b1Njcm9sbF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWF4RW50cmllc19kZWNvcmF0b3JzOwogIGxldCBfbWF4RW50cmllc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21heEVudHJpZXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2hpZ2hsaWdodEtleXdvcmRzX2RlY29yYXRvcnM7CiAgbGV0IF9oaWdobGlnaHRLZXl3b3Jkc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2hpZ2hsaWdodEtleXdvcmRzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93TWV0cmljc19kZWNvcmF0b3JzOwogIGxldCBfc2hvd01ldHJpY3NfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93TWV0cmljc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VhcmNoUXVlcnlfZGVjb3JhdG9yczsKICBsZXQgX3NlYXJjaFF1ZXJ5X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VhcmNoUXVlcnlfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ZpbHRlck1vZGVfZGVjb3JhdG9yczsKICBsZXQgX2ZpbHRlck1vZGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWx0ZXJNb2RlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tZXRyaWNzX2RlY29yYXRvcnM7CiAgbGV0IF9tZXRyaWNzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWV0cmljc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGVybWluYWxSZWFkeV9kZWNvcmF0b3JzOwogIGxldCBfdGVybWluYWxSZWFkeV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Rlcm1pbmFsUmVhZHlfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0NoYXJ0TG9nMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2xhYmVsX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9tb2RlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfbG9nRW50cmllc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfYXV0b1Njcm9sbF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9tYXhFbnRyaWVzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfaGlnaGxpZ2h0S2V5d29yZHNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX3Nob3dNZXRyaWNzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3NlYXJjaFF1ZXJ5X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9maWx0ZXJNb2RlX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9tZXRyaWNzX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF90ZXJtaW5hbFJlYWR5X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTU0KHRoaXMsIG51bGwsIF9sYWJlbF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsYWJlbCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibGFiZWwiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubGFiZWwsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxhYmVsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xhYmVsX2luaXRpYWxpemVycywgX2xhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTQodGhpcywgbnVsbCwgX21vZGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibW9kZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibW9kZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tb2RlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tb2RlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21vZGVfaW5pdGlhbGl6ZXJzLCBfbW9kZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU0KHRoaXMsIG51bGwsIF9sb2dFbnRyaWVzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxvZ0VudHJpZXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImxvZ0VudHJpZXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubG9nRW50cmllcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubG9nRW50cmllcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9sb2dFbnRyaWVzX2luaXRpYWxpemVycywgX2xvZ0VudHJpZXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1NCh0aGlzLCBudWxsLCBfYXV0b1Njcm9sbF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhdXRvU2Nyb2xsIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhdXRvU2Nyb2xsIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmF1dG9TY3JvbGwsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmF1dG9TY3JvbGwgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYXV0b1Njcm9sbF9pbml0aWFsaXplcnMsIF9hdXRvU2Nyb2xsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTQodGhpcywgbnVsbCwgX21heEVudHJpZXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWF4RW50cmllcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWF4RW50cmllcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYXhFbnRyaWVzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tYXhFbnRyaWVzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21heEVudHJpZXNfaW5pdGlhbGl6ZXJzLCBfbWF4RW50cmllc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU0KHRoaXMsIG51bGwsIF9oaWdobGlnaHRLZXl3b3Jkc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJoaWdobGlnaHRLZXl3b3JkcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaGlnaGxpZ2h0S2V5d29yZHMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaGlnaGxpZ2h0S2V5d29yZHMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmhpZ2hsaWdodEtleXdvcmRzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2hpZ2hsaWdodEtleXdvcmRzX2luaXRpYWxpemVycywgX2hpZ2hsaWdodEtleXdvcmRzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTQodGhpcywgbnVsbCwgX3Nob3dNZXRyaWNzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dNZXRyaWNzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93TWV0cmljcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93TWV0cmljcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd01ldHJpY3MgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd01ldHJpY3NfaW5pdGlhbGl6ZXJzLCBfc2hvd01ldHJpY3NfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1NCh0aGlzLCBudWxsLCBfc2VhcmNoUXVlcnlfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VhcmNoUXVlcnkiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlYXJjaFF1ZXJ5IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlYXJjaFF1ZXJ5LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWFyY2hRdWVyeSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWFyY2hRdWVyeV9pbml0aWFsaXplcnMsIF9zZWFyY2hRdWVyeV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU0KHRoaXMsIG51bGwsIF9maWx0ZXJNb2RlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImZpbHRlck1vZGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZpbHRlck1vZGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZmlsdGVyTW9kZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZmlsdGVyTW9kZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9maWx0ZXJNb2RlX2luaXRpYWxpemVycywgX2ZpbHRlck1vZGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1NCh0aGlzLCBudWxsLCBfbWV0cmljc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtZXRyaWNzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtZXRyaWNzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1ldHJpY3MsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1ldHJpY3MgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWV0cmljc19pbml0aWFsaXplcnMsIF9tZXRyaWNzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTQodGhpcywgbnVsbCwgX3Rlcm1pbmFsUmVhZHlfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGVybWluYWxSZWFkeSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGVybWluYWxSZWFkeSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50ZXJtaW5hbFJlYWR5LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50ZXJtaW5hbFJlYWR5ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Rlcm1pbmFsUmVhZHlfaW5pdGlhbGl6ZXJzLCBfdGVybWluYWxSZWFkeV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU0KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0NoYXJ0TG9nMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMzc7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiQ2hhcnQiLCAiV29ya3NwYWNlIl07CiAgICAjbGFiZWxfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNTUodGhpcywgX2xhYmVsX2luaXRpYWxpemVycywgIlNlcnZlciBMb2dzIik7CiAgICBnZXQgbGFiZWwoKSB7CiAgICAgIHJldHVybiB0aGlzLiNsYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxhYmVsKHZhbHVlMikgewogICAgICB0aGlzLiNsYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21vZGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU1KHRoaXMsIF9sYWJlbF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTUodGhpcywgX21vZGVfaW5pdGlhbGl6ZXJzLCAic3RydWN0dXJlZCIpKTsKICAgIGdldCBtb2RlKCkgewogICAgICByZXR1cm4gdGhpcy4jbW9kZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1vZGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI21vZGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsb2dFbnRyaWVzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1NSh0aGlzLCBfbW9kZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTUodGhpcywgX2xvZ0VudHJpZXNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IGxvZ0VudHJpZXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNsb2dFbnRyaWVzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbG9nRW50cmllcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbG9nRW50cmllc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2F1dG9TY3JvbGxfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU1KHRoaXMsIF9sb2dFbnRyaWVzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1NSh0aGlzLCBfYXV0b1Njcm9sbF9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBhdXRvU2Nyb2xsKCkgewogICAgICByZXR1cm4gdGhpcy4jYXV0b1Njcm9sbF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGF1dG9TY3JvbGwodmFsdWUyKSB7CiAgICAgIHRoaXMuI2F1dG9TY3JvbGxfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtYXhFbnRyaWVzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1NSh0aGlzLCBfYXV0b1Njcm9sbF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTUodGhpcywgX21heEVudHJpZXNfaW5pdGlhbGl6ZXJzLCAxZTQpKTsKICAgIGdldCBtYXhFbnRyaWVzKCkgewogICAgICByZXR1cm4gdGhpcy4jbWF4RW50cmllc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1heEVudHJpZXModmFsdWUyKSB7CiAgICAgIHRoaXMuI21heEVudHJpZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNoaWdobGlnaHRLZXl3b3Jkc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTUodGhpcywgX21heEVudHJpZXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU1KHRoaXMsIF9oaWdobGlnaHRLZXl3b3Jkc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgaGlnaGxpZ2h0S2V5d29yZHMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNoaWdobGlnaHRLZXl3b3Jkc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGhpZ2hsaWdodEtleXdvcmRzKHZhbHVlMikgewogICAgICB0aGlzLiNoaWdobGlnaHRLZXl3b3Jkc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dNZXRyaWNzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1NSh0aGlzLCBfaGlnaGxpZ2h0S2V5d29yZHNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU1KHRoaXMsIF9zaG93TWV0cmljc19pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93TWV0cmljcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dNZXRyaWNzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd01ldHJpY3ModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dNZXRyaWNzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VhcmNoUXVlcnlfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU1KHRoaXMsIF9zaG93TWV0cmljc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTUodGhpcywgX3NlYXJjaFF1ZXJ5X2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBzZWFyY2hRdWVyeSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlYXJjaFF1ZXJ5X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VhcmNoUXVlcnkodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NlYXJjaFF1ZXJ5X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZmlsdGVyTW9kZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTUodGhpcywgX3NlYXJjaFF1ZXJ5X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1NSh0aGlzLCBfZmlsdGVyTW9kZV9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgZmlsdGVyTW9kZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2ZpbHRlck1vZGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBmaWx0ZXJNb2RlKHZhbHVlMikgewogICAgICB0aGlzLiNmaWx0ZXJNb2RlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWV0cmljc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTUodGhpcywgX2ZpbHRlck1vZGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU1KHRoaXMsIF9tZXRyaWNzX2luaXRpYWxpemVycywgeyBkZWJ1ZzogMCwgaW5mbzogMCwgd2FybjogMCwgZXJyb3I6IDAsIHN1Y2Nlc3M6IDAsIHRvdGFsOiAwLCByYXRlOiAwIH0pKTsKICAgIGdldCBtZXRyaWNzKCkgewogICAgICByZXR1cm4gdGhpcy4jbWV0cmljc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1ldHJpY3ModmFsdWUyKSB7CiAgICAgIHRoaXMuI21ldHJpY3NfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN0ZXJtaW5hbFJlYWR5X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1NSh0aGlzLCBfbWV0cmljc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTUodGhpcywgX3Rlcm1pbmFsUmVhZHlfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHRlcm1pbmFsUmVhZHkoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0ZXJtaW5hbFJlYWR5X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdGVybWluYWxSZWFkeSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdGVybWluYWxSZWFkeV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgLy8gQnVmZmVyIG9mIGFsbCBsb2cgZW50cmllcyBmb3IgZmlsdGVyIG1vZGUKICAgIGxvZ0J1ZmZlciA9IChfX3J1bkluaXRpYWxpemVyczU1KHRoaXMsIF90ZXJtaW5hbFJlYWR5X2V4dHJhSW5pdGlhbGl6ZXJzKSwgW10pOwogICAgLy8gVHJhY2sgdHJhaWxpbmcgaGlkZGVuIGVudHJpZXMgY291bnQgZm9yIGxpdmUgdXBkYXRlcyBpbiBmaWx0ZXIgbW9kZQogICAgdHJhaWxpbmdIaWRkZW5Db3VudCA9IDA7CiAgICAvLyB4dGVybSBpbnN0YW5jZXMKICAgIHRlcm1pbmFsID0gbnVsbDsKICAgIGZpdEFkZG9uID0gbnVsbDsKICAgIHNlYXJjaEFkZG9uID0gbnVsbDsKICAgIHJlc2l6ZU9ic2VydmVyID0gbnVsbDsKICAgIHRlcm1pbmFsVGhlbWVTdWJzY3JpcHRpb24gPSBudWxsOwogICAgZG9tdG9vbHNJbnN0YW5jZSA9IG51bGw7CiAgICAvLyBSYXRlIGNhbGN1bGF0aW9uCiAgICByYXRlQnVmZmVyID0gW107CiAgICByYXRlSW50ZXJ2YWwgPSBudWxsOwogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMy45JSkiLCAiaHNsKDAgMCUgOTglKSIpfTsKICAgICAgfQoKICAgICAgLm1haW5ib3ggewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSAzLjklKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5oZWFkZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NyUpIiwgImhzbCgwIDAlIDclKSIpfTsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTJweDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgIC50aXRsZSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5JSkiLCAiaHNsKDAgMCUgOTUlKSIpfTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAuc2VhcmNoLWJveCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNHB4OwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgICBtYXgtd2lkdGg6IDMwMHB4OwogICAgICB9CgogICAgICAuc2VhcmNoLWJveCBpbnB1dCB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDklKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5NSUpIil9OwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5zZWFyY2gtYm94IGlucHV0OmZvY3VzIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgNTEuMiUpIiwgImhzbCgyMTcuMiA5MS4yJSA1OS44JSkiKX07CiAgICAgIH0KCiAgICAgIC5zZWFyY2gtYm94IGlucHV0OjpwbGFjZWhvbGRlciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA2My45JSkiLCAiaHNsKDAgMCUgNDUuMSUpIil9OwogICAgICB9CgogICAgICAuc2VhcmNoLW5hdiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDJweDsKICAgICAgfQoKICAgICAgLnNlYXJjaC1uYXYgYnV0dG9uIHsKICAgICAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQ1LjElKSIsICJoc2woMCAwJSA2My45JSkiKX07CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICB9CgogICAgICAuc2VhcmNoLW5hdiBidXR0b246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NS4xJSkiLCAiaHNsKDAgMCUgMjAlKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDE1JSkiLCAiaHNsKDAgMCUgOTMuOSUpIil9OwogICAgICB9CgogICAgICAuZmlsdGVyLXRvZ2dsZSB7CiAgICAgICAgcGFkZGluZzogNHB4IDhweDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQ1LjElKSIsICJoc2woMCAwJSA2My45JSkiKX07CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1czsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAuZmlsdGVyLXRvZ2dsZTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk1LjElKSIsICJoc2woMCAwJSAyMCUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTUlKSIsICJoc2woMCAwJSA5My45JSkiKX07CiAgICAgIH0KCiAgICAgIC5maWx0ZXItdG9nZ2xlLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCg0NSA5MyUgNDclKSIsICJoc2woNDUgOTMlIDQ3JSkiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDQ1IDkzJSA0NyUpIiwgImhzbCg0NSA5MyUgNDclKSIpfTsKICAgICAgICBjb2xvcjogaHNsKDAgMCUgOSUpOwogICAgICB9CgogICAgICAuY29udHJvbHMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiA2cHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgcGFkZGluZzogNHB4IDEwcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NS4xJSkiLCAiaHNsKDAgMCUgNjMuOSUpIil9OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXM7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWJ1dHRvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk1LjElKSIsICJoc2woMCAwJSAyMCUpIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDc5LjglKSIsICJoc2woMCAwJSAyNSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTUlKSIsICJoc2woMCAwJSA5My45JSkiKX07CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWJ1dHRvbi5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIyLjIgNDcuNCUgNTEuMiUpIiwgImhzbCgyMTcuMiA5MS4yJSA1OS44JSkiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIyMi4yIDQ3LjQlIDUxLjIlKSIsICJoc2woMjE3LjIgOTEuMiUgNTkuOCUpIil9OwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLnRlcm1pbmFsLWNvbnRhaW5lciB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgMy45JSkiKX07CiAgICAgIH0KCiAgICAgIC50ZXJtaW5hbC1jb250YWluZXIgLnh0ZXJtIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5sb2FkaW5nLXN0YXRlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDUuMSUpIiwgImhzbCgwIDAlIDYzLjklKSIpfTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICB9CgogICAgICAubWV0cmljcy1iYXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NyUpIiwgImhzbCgwIDAlIDclKSIpfTsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg5LjglKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDE2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5tZXRyaWMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDRweDsKICAgICAgfQoKICAgICAgLm1ldHJpYzo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICB3aWR0aDogOHB4OwogICAgICAgIGhlaWdodDogOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgLm1ldHJpYy5lcnJvcjo6YmVmb3JlIHsKICAgICAgICBiYWNrZ3JvdW5kOiBoc2woMCA4NC4yJSA2MC4yJSk7CiAgICAgIH0KCiAgICAgIC5tZXRyaWMud2Fybjo6YmVmb3JlIHsKICAgICAgICBiYWNrZ3JvdW5kOiBoc2woMjUgOTUlIDUzJSk7CiAgICAgIH0KCiAgICAgIC5tZXRyaWMuaW5mbzo6YmVmb3JlIHsKICAgICAgICBiYWNrZ3JvdW5kOiBoc2woMjIyLjIgNDcuNCUgNTEuMiUpOwogICAgICB9CgogICAgICAubWV0cmljLnN1Y2Nlc3M6OmJlZm9yZSB7CiAgICAgICAgYmFja2dyb3VuZDogaHNsKDE0Mi4xIDc2LjIlIDM2LjMlKTsKICAgICAgfQoKICAgICAgLm1ldHJpYy5kZWJ1Zzo6YmVmb3JlIHsKICAgICAgICBiYWNrZ3JvdW5kOiBoc2woMCAwJSA2My45JSk7CiAgICAgIH0KCiAgICAgIC5tZXRyaWMucmF0ZSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NS4xJSkiLCAiaHNsKDAgMCUgNjMuOSUpIil9OwogICAgICB9CgogICAgICAubWV0cmljLnJhdGU6OmJlZm9yZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgYAogICAgXTsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBkb210b29sc19lbGVtZW50YmFzaWNfZXhwb3J0cy5zZXR1cCgpOwogICAgfQogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9Im1haW5ib3giPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+JHt0aGlzLmxhYmVsfTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ic2VhcmNoLWJveCI+CiAgICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICAgIHR5cGU9InRleHQiCiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IlNlYXJjaCBsb2dzLi4uIgogICAgICAgICAgICAgIC52YWx1ZT0ke3RoaXMuc2VhcmNoUXVlcnl9CiAgICAgICAgICAgICAgQGlucHV0PSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVTZWFyY2hJbnB1dChlMTEpfQogICAgICAgICAgICAgIEBrZXlkb3duPSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVTZWFyY2hLZXlkb3duKGUxMSl9CiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlYXJjaC1uYXYiPgogICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPSR7KCkgPT4gdGhpcy5zZWFyY2hQcmV2aW91cygpfSB0aXRsZT0iUHJldmlvdXMgbWF0Y2giPuKGkTwvYnV0dG9uPgogICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPSR7KCkgPT4gdGhpcy5zZWFyY2hOZXh0KCl9IHRpdGxlPSJOZXh0IG1hdGNoIj7ihpM8L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICBjbGFzcz0iZmlsdGVyLXRvZ2dsZSAke3RoaXMuZmlsdGVyTW9kZSA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMudG9nZ2xlRmlsdGVyTW9kZSgpfQogICAgICAgICAgICAgIHRpdGxlPSIke3RoaXMuZmlsdGVyTW9kZSA/ICJTd2l0Y2ggdG8gaGlnaGxpZ2h0IG1vZGUiIDogIlN3aXRjaCB0byBmaWx0ZXIgbW9kZSJ9IgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgJHt0aGlzLmZpbHRlck1vZGUgPyAiRmlsdGVyIiA6ICJIaWdobGlnaHQifQogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbHMiPgogICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgY2xhc3M9ImNvbnRyb2wtYnV0dG9uICR7dGhpcy5hdXRvU2Nyb2xsID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy50b2dnbGVBdXRvU2Nyb2xsKCl9CiAgICAgICAgICAgID4KICAgICAgICAgICAgICBBdXRvIFNjcm9sbAogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY29udHJvbC1idXR0b24iIEBjbGljaz0keygpID0+IHRoaXMuY2xlYXJMb2dzKCl9PgogICAgICAgICAgICAgIENsZWFyCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9InRlcm1pbmFsLWNvbnRhaW5lciI+CiAgICAgICAgICAkeyF0aGlzLnRlcm1pbmFsUmVhZHkgPyBiMmA8ZGl2IGNsYXNzPSJsb2FkaW5nLXN0YXRlIj5Mb2FkaW5nIHRlcm1pbmFsLi4uPC9kaXY+YCA6ICIifQogICAgICAgIDwvZGl2PgoKICAgICAgICAke3RoaXMuc2hvd01ldHJpY3MgPyBiMmAKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXRyaWNzLWJhciI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWV0cmljIGVycm9yIj5lcnJvcnM6ICR7dGhpcy5tZXRyaWNzLmVycm9yfTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtZXRyaWMgd2FybiI+d2FybnM6ICR7dGhpcy5tZXRyaWNzLndhcm59PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1ldHJpYyBpbmZvIj5pbmZvOiAke3RoaXMubWV0cmljcy5pbmZvfTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtZXRyaWMgc3VjY2VzcyI+c3VjY2VzczogJHt0aGlzLm1ldHJpY3Muc3VjY2Vzc308L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWV0cmljIGRlYnVnIj5kZWJ1ZzogJHt0aGlzLm1ldHJpY3MuZGVidWd9PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1ldHJpYyByYXRlIj4ke3RoaXMubWV0cmljcy5yYXRlLnRvRml4ZWQoMSl9IGxvZ3Mvc2VjPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgIDogIiJ9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZCgpIHsKICAgICAgdGhpcy5kb210b29sc0luc3RhbmNlID0gYXdhaXQgdGhpcy5kb210b29sc1Byb21pc2U7CiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVRlcm1pbmFsKCk7CiAgICAgIGlmICh0aGlzLmxvZ0VudHJpZXMubGVuZ3RoID4gMCAmJiB0aGlzLmxvZ0J1ZmZlci5sZW5ndGggPT09IDApIHsKICAgICAgICB0aGlzLmxvZ0J1ZmZlciA9IFsuLi50aGlzLmxvZ0VudHJpZXNdOwogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5sb2dFbnRyaWVzKSB7CiAgICAgICAgICB0aGlzLnVwZGF0ZU1ldHJpY3MoZW50cnkubGV2ZWwpOwogICAgICAgICAgdGhpcy53cml0ZUxvZ0VudHJ5KGVudHJ5KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2dFbnRyaWVzLmxlbmd0aCA+IDAgJiYgdGhpcy5sb2dCdWZmZXIubGVuZ3RoID4gMCkgewogICAgICAgIGNvbnN0IGJ1ZmZlclNldCA9IG5ldyBTZXQodGhpcy5sb2dCdWZmZXIubWFwKChlMTEpID0+IGAke2UxMS50aW1lc3RhbXB9fCR7ZTExLm1lc3NhZ2V9YCkpOwogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5sb2dFbnRyaWVzKSB7CiAgICAgICAgICBpZiAoIWJ1ZmZlclNldC5oYXMoYCR7ZW50cnkudGltZXN0YW1wfXwke2VudHJ5Lm1lc3NhZ2V9YCkpIHsKICAgICAgICAgICAgdGhpcy5sb2dCdWZmZXIucHVzaChlbnRyeSk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlTWV0cmljcyhlbnRyeS5sZXZlbCk7CiAgICAgICAgICAgIHRoaXMud3JpdGVMb2dFbnRyeShlbnRyeSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBhc3luYyBpbml0aWFsaXplVGVybWluYWwoKSB7CiAgICAgIGNvbnN0IGxpYkxvYWRlciA9IERlZXNTZXJ2aWNlTGliTG9hZGVyLmdldEluc3RhbmNlKCk7CiAgICAgIGNvbnN0IFt4dGVybUJ1bmRsZSwgZml0QnVuZGxlLCBzZWFyY2hCdW5kbGVdID0gYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgICAgIGxpYkxvYWRlci5sb2FkWHRlcm0oKSwKICAgICAgICBsaWJMb2FkZXIubG9hZFh0ZXJtRml0QWRkb24oKSwKICAgICAgICBsaWJMb2FkZXIubG9hZFh0ZXJtU2VhcmNoQWRkb24oKQogICAgICBdKTsKICAgICAgYXdhaXQgdGhpcy5pbmplY3RYdGVybVN0eWxlc0ludG9TaGFkb3coKTsKICAgICAgdGhpcy50ZXJtaW5hbCA9IG5ldyB4dGVybUJ1bmRsZS5UZXJtaW5hbCh7CiAgICAgICAgY3Vyc29yQmxpbms6IGZhbHNlLAogICAgICAgIGRpc2FibGVTdGRpbjogdHJ1ZSwKICAgICAgICBmb250U2l6ZTogMTIsCiAgICAgICAgZm9udEZhbWlseTogIidTRiBNb25vJywgJ01vbmFjbycsICdDb25zb2xhcycsICdMaWJlcmF0aW9uIE1vbm8nLCAnQ291cmllciBOZXcnLCBtb25vc3BhY2UiLAogICAgICAgIHRoZW1lOiB0aGlzLmdldFRlcm1pbmFsVGhlbWUoKSwKICAgICAgICBzY3JvbGxiYWNrOiB0aGlzLm1heEVudHJpZXMsCiAgICAgICAgY29udmVydEVvbDogdHJ1ZQogICAgICB9KTsKICAgICAgdGhpcy5maXRBZGRvbiA9IG5ldyBmaXRCdW5kbGUuRml0QWRkb24oKTsKICAgICAgdGhpcy5zZWFyY2hBZGRvbiA9IG5ldyBzZWFyY2hCdW5kbGUuU2VhcmNoQWRkb24oKTsKICAgICAgdGhpcy50ZXJtaW5hbC5sb2FkQWRkb24odGhpcy5maXRBZGRvbik7CiAgICAgIHRoaXMudGVybWluYWwubG9hZEFkZG9uKHRoaXMuc2VhcmNoQWRkb24pOwogICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLnRlcm1pbmFsLWNvbnRhaW5lciIpOwogICAgICB0aGlzLnRlcm1pbmFsLm9wZW4oY29udGFpbmVyKTsKICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZTIpKTsKICAgICAgdGhpcy5maXRBZGRvbi5maXQoKTsKICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7CiAgICAgICAgdGhpcy5maXRBZGRvbj8uZml0KCk7CiAgICAgIH0pOwogICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyKTsKICAgICAgdGhpcy50ZXJtaW5hbFRoZW1lU3Vic2NyaXB0aW9uID0gdGhpcy5kb210b29sc0luc3RhbmNlLnRoZW1lTWFuYWdlci50aGVtZU9ic2VydmFibGUuc3Vic2NyaWJlKCgpID0+IHsKICAgICAgICBpZiAodGhpcy50ZXJtaW5hbCkgewogICAgICAgICAgdGhpcy50ZXJtaW5hbC5vcHRpb25zLnRoZW1lID0gdGhpcy5nZXRUZXJtaW5hbFRoZW1lKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdGhpcy5yYXRlSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLmNhbGN1bGF0ZVJhdGUoKSwgMWUzKTsKICAgICAgdGhpcy50ZXJtaW5hbFJlYWR5ID0gdHJ1ZTsKICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmxvZ0J1ZmZlcikgewogICAgICAgIHRoaXMud3JpdGVMb2dFbnRyeShlbnRyeSk7CiAgICAgIH0KICAgIH0KICAgIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoImxvZ0VudHJpZXMiKSAmJiB0aGlzLnRlcm1pbmFsUmVhZHkgJiYgdGhpcy5sb2dFbnRyaWVzLmxlbmd0aCA+IDApIHsKICAgICAgICBjb25zdCBvbGRFbnRyaWVzID0gY2hhbmdlZFByb3BlcnRpZXMuZ2V0KCJsb2dFbnRyaWVzIikgfHwgW107CiAgICAgICAgY29uc3QgbmV3RW50cmllcyA9IHRoaXMubG9nRW50cmllczsKICAgICAgICBpZiAob2xkRW50cmllcy5sZW5ndGggPT09IG5ld0VudHJpZXMubGVuZ3RoICYmIG9sZEVudHJpZXMubGVuZ3RoID4gMCAmJiBvbGRFbnRyaWVzW29sZEVudHJpZXMubGVuZ3RoIC0gMV0udGltZXN0YW1wID09PSBuZXdFbnRyaWVzW25ld0VudHJpZXMubGVuZ3RoIC0gMV0udGltZXN0YW1wICYmIG9sZEVudHJpZXNbb2xkRW50cmllcy5sZW5ndGggLSAxXS5tZXNzYWdlID09PSBuZXdFbnRyaWVzW25ld0VudHJpZXMubGVuZ3RoIC0gMV0ubWVzc2FnZSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAobmV3RW50cmllcy5sZW5ndGggPiBvbGRFbnRyaWVzLmxlbmd0aCAmJiBvbGRFbnRyaWVzLmxlbmd0aCA+IDAgJiYgb2xkRW50cmllc1tvbGRFbnRyaWVzLmxlbmd0aCAtIDFdLnRpbWVzdGFtcCA9PT0gbmV3RW50cmllc1tvbGRFbnRyaWVzLmxlbmd0aCAtIDFdLnRpbWVzdGFtcCAmJiBvbGRFbnRyaWVzW29sZEVudHJpZXMubGVuZ3RoIC0gMV0ubWVzc2FnZSA9PT0gbmV3RW50cmllc1tvbGRFbnRyaWVzLmxlbmd0aCAtIDFdLm1lc3NhZ2UpIHsKICAgICAgICAgIGNvbnN0IHRhaWxFbnRyaWVzID0gbmV3RW50cmllcy5zbGljZShvbGRFbnRyaWVzLmxlbmd0aCk7CiAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRhaWxFbnRyaWVzKSB7CiAgICAgICAgICAgIHRoaXMubG9nQnVmZmVyLnB1c2goZW50cnkpOwogICAgICAgICAgICB0aGlzLnVwZGF0ZU1ldHJpY3MoZW50cnkubGV2ZWwpOwogICAgICAgICAgICBpZiAodGhpcy5sb2dCdWZmZXIubGVuZ3RoID4gdGhpcy5tYXhFbnRyaWVzKSB7CiAgICAgICAgICAgICAgdGhpcy5sb2dCdWZmZXIuc2hpZnQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMuZmlsdGVyTW9kZSB8fCAhdGhpcy5zZWFyY2hRdWVyeSB8fCB0aGlzLmVudHJ5TWF0Y2hlc0ZpbHRlcihlbnRyeSkpIHsKICAgICAgICAgICAgICB0aGlzLndyaXRlTG9nRW50cnkoZW50cnkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMubG9nQnVmZmVyID0gWy4uLm5ld0VudHJpZXNdOwogICAgICAgIHRoaXMucmVSZW5kZXJGaWx0ZXJlZExvZ3MoKTsKICAgICAgfQogICAgfQogICAgZ2V0VGVybWluYWxUaGVtZSgpIHsKICAgICAgY29uc3QgaXNEYXJrID0gdGhpcy5kb210b29sc0luc3RhbmNlPy50aGVtZU1hbmFnZXI/LmlzRGFya01vZGUgPz8gdHJ1ZTsKICAgICAgcmV0dXJuIGlzRGFyayA/IHsKICAgICAgICBiYWNrZ3JvdW5kOiAiIzBhMGEwYSIsCiAgICAgICAgZm9yZWdyb3VuZDogIiNlMGUwZTAiLAogICAgICAgIGN1cnNvcjogIiNlMGUwZTAiLAogICAgICAgIHNlbGVjdGlvbkJhY2tncm91bmQ6ICIjNDA0MDQwIiwKICAgICAgICBibGFjazogIiMwMDAwMDAiLAogICAgICAgIHJlZDogIiNmZjU1NTUiLAogICAgICAgIGdyZWVuOiAiIzUwZmE3YiIsCiAgICAgICAgeWVsbG93OiAiI2YxZmE4YyIsCiAgICAgICAgYmx1ZTogIiM2MjcyYTQiLAogICAgICAgIG1hZ2VudGE6ICIjZmY3OWM2IiwKICAgICAgICBjeWFuOiAiIzhiZTlmZCIsCiAgICAgICAgd2hpdGU6ICIjZjhmOGYyIiwKICAgICAgICBicmlnaHRCbGFjazogIiM2MjcyYTQiLAogICAgICAgIGJyaWdodFJlZDogIiNmZjZlNmUiLAogICAgICAgIGJyaWdodEdyZWVuOiAiIzY5ZmY5NCIsCiAgICAgICAgYnJpZ2h0WWVsbG93OiAiI2ZmZmZhNSIsCiAgICAgICAgYnJpZ2h0Qmx1ZTogIiNkNmFjZmYiLAogICAgICAgIGJyaWdodE1hZ2VudGE6ICIjZmY5MmRmIiwKICAgICAgICBicmlnaHRDeWFuOiAiI2E0ZmZmZiIsCiAgICAgICAgYnJpZ2h0V2hpdGU6ICIjZmZmZmZmIgogICAgICB9IDogewogICAgICAgIGJhY2tncm91bmQ6ICIjZmZmZmZmIiwKICAgICAgICBmb3JlZ3JvdW5kOiAiIzMzMzMzMyIsCiAgICAgICAgY3Vyc29yOiAiIzMzMzMzMyIsCiAgICAgICAgc2VsZWN0aW9uQmFja2dyb3VuZDogIiNhZGQ2ZmYiLAogICAgICAgIGJsYWNrOiAiIzAwMDAwMCIsCiAgICAgICAgcmVkOiAiI2NkMzEzMSIsCiAgICAgICAgZ3JlZW46ICIjMDBiYzAwIiwKICAgICAgICB5ZWxsb3c6ICIjOTQ5ODAwIiwKICAgICAgICBibHVlOiAiIzA0NTFhNSIsCiAgICAgICAgbWFnZW50YTogIiNiYzA1YmMiLAogICAgICAgIGN5YW46ICIjMDU5OGJjIiwKICAgICAgICB3aGl0ZTogIiM1NTU1NTUiLAogICAgICAgIGJyaWdodEJsYWNrOiAiIzY2NjY2NiIsCiAgICAgICAgYnJpZ2h0UmVkOiAiI2NkMzEzMSIsCiAgICAgICAgYnJpZ2h0R3JlZW46ICIjMTRjZTE0IiwKICAgICAgICBicmlnaHRZZWxsb3c6ICIjYjViYTAwIiwKICAgICAgICBicmlnaHRCbHVlOiAiIzA0NTFhNSIsCiAgICAgICAgYnJpZ2h0TWFnZW50YTogIiNiYzA1YmMiLAogICAgICAgIGJyaWdodEN5YW46ICIjMDU5OGJjIiwKICAgICAgICBicmlnaHRXaGl0ZTogIiNhNWE1YTUiCiAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIEluamVjdCB4dGVybSBDU1Mgc3R5bGVzIGludG8gc2hhZG93IHJvb3QKICAgICAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc2hhZG93IERPTSBkb2Vzbid0IGluaGVyaXQgc3R5bGVzIGZyb20gZG9jdW1lbnQuaGVhZAogICAgICovCiAgICBhc3luYyBpbmplY3RYdGVybVN0eWxlc0ludG9TaGFkb3coKSB7CiAgICAgIGNvbnN0IHN0eWxlSWQgPSAieHRlcm0tc2hhZG93LXN0eWxlcyI7CiAgICAgIGlmICh0aGlzLnNoYWRvd1Jvb3QuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgY3NzVXJsID0gYCR7Q0ROX0JBU0V9L3h0ZXJtQCR7Q0ROX1ZFUlNJT05TLnh0ZXJtfS9jc3MveHRlcm0uY3NzYDsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChjc3NVcmwpOwogICAgICBjb25zdCBjc3NUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpOwogICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgIHN0eWxlLmlkID0gc3R5bGVJZDsKICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBjc3NUZXh0OwogICAgICB0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoc3R5bGUpOwogICAgfQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBTdHJ1Y3R1cmVkIExvZyBNZXRob2RzCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0KICAgIC8qKgogICAgICogQWRkIGEgc2luZ2xlIHN0cnVjdHVyZWQgbG9nIGVudHJ5CiAgICAgKi8KICAgIGFkZExvZyhsZXZlbCwgbWVzc2FnZTIsIHNvdXJjZSkgewogICAgICBjb25zdCBlbnRyeSA9IHsKICAgICAgICB0aW1lc3RhbXA6ICgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKSwKICAgICAgICBsZXZlbCwKICAgICAgICBtZXNzYWdlOiBtZXNzYWdlMiwKICAgICAgICBzb3VyY2UKICAgICAgfTsKICAgICAgdGhpcy5sb2dCdWZmZXIucHVzaChlbnRyeSk7CiAgICAgIGlmICh0aGlzLmxvZ0J1ZmZlci5sZW5ndGggPiB0aGlzLm1heEVudHJpZXMpIHsKICAgICAgICB0aGlzLmxvZ0J1ZmZlci5zaGlmdCgpOwogICAgICB9CiAgICAgIGlmICghdGhpcy5maWx0ZXJNb2RlIHx8ICF0aGlzLnNlYXJjaFF1ZXJ5KSB7CiAgICAgICAgdGhpcy53cml0ZUxvZ0VudHJ5KGVudHJ5KTsKICAgICAgfSBlbHNlIGlmICh0aGlzLmVudHJ5TWF0Y2hlc0ZpbHRlcihlbnRyeSkpIHsKICAgICAgICB0aGlzLnRyYWlsaW5nSGlkZGVuQ291bnQgPSAwOwogICAgICAgIHRoaXMud3JpdGVMb2dFbnRyeShlbnRyeSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy51cGRhdGVUcmFpbGluZ1BsYWNlaG9sZGVyKCk7CiAgICAgIH0KICAgICAgdGhpcy51cGRhdGVNZXRyaWNzKGVudHJ5LmxldmVsKTsKICAgIH0KICAgIC8qKgogICAgICogQWRkIG11bHRpcGxlIHN0cnVjdHVyZWQgbG9nIGVudHJpZXMKICAgICAqLwogICAgdXBkYXRlTG9nKGVudHJpZXMpIHsKICAgICAgaWYgKCFlbnRyaWVzKQogICAgICAgIHJldHVybjsKICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7CiAgICAgICAgdGhpcy5sb2dCdWZmZXIucHVzaChlbnRyeSk7CiAgICAgICAgaWYgKHRoaXMubG9nQnVmZmVyLmxlbmd0aCA+IHRoaXMubWF4RW50cmllcykgewogICAgICAgICAgdGhpcy5sb2dCdWZmZXIuc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLmZpbHRlck1vZGUgfHwgIXRoaXMuc2VhcmNoUXVlcnkpIHsKICAgICAgICAgIHRoaXMud3JpdGVMb2dFbnRyeShlbnRyeSk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVudHJ5TWF0Y2hlc0ZpbHRlcihlbnRyeSkpIHsKICAgICAgICAgIHRoaXMudHJhaWxpbmdIaWRkZW5Db3VudCA9IDA7CiAgICAgICAgICB0aGlzLndyaXRlTG9nRW50cnkoZW50cnkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnVwZGF0ZVRyYWlsaW5nUGxhY2Vob2xkZXIoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy51cGRhdGVNZXRyaWNzKGVudHJ5LmxldmVsKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGUgdGhlIHRyYWlsaW5nIGhpZGRlbiBwbGFjZWhvbGRlciBpbiByZWFsLXRpbWUKICAgICAqIENsZWFycyB0aGUgbGFzdCBsaW5lIGlmIGEgcGxhY2Vob2xkZXIgYWxyZWFkeSBleGlzdHMsIHRoZW4gd3JpdGVzIHVwZGF0ZWQgY291bnQKICAgICAqLwogICAgdXBkYXRlVHJhaWxpbmdQbGFjZWhvbGRlcigpIHsKICAgICAgaWYgKCF0aGlzLnRlcm1pbmFsKQogICAgICAgIHJldHVybjsKICAgICAgaWYgKHRoaXMudHJhaWxpbmdIaWRkZW5Db3VudCA+IDApIHsKICAgICAgICB0aGlzLnRlcm1pbmFsLndyaXRlKCJceDFCWzFBXHgxQlsyS1xyIik7CiAgICAgIH0KICAgICAgdGhpcy50cmFpbGluZ0hpZGRlbkNvdW50Kys7CiAgICAgIHRoaXMud3JpdGVIaWRkZW5QbGFjZWhvbGRlcih0aGlzLnRyYWlsaW5nSGlkZGVuQ291bnQpOwogICAgICBpZiAodGhpcy5hdXRvU2Nyb2xsKSB7CiAgICAgICAgdGhpcy50ZXJtaW5hbC5zY3JvbGxUb0JvdHRvbSgpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrIGlmIGEgbG9nIGVudHJ5IG1hdGNoZXMgdGhlIGN1cnJlbnQgZmlsdGVyCiAgICAgKi8KICAgIGVudHJ5TWF0Y2hlc0ZpbHRlcihlbnRyeSkgewogICAgICBpZiAoIXRoaXMuc2VhcmNoUXVlcnkpCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zZWFyY2hRdWVyeS50b0xvd2VyQ2FzZSgpOwogICAgICByZXR1cm4gZW50cnkubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSB8fCBlbnRyeS5sZXZlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSB8fCAoZW50cnkuc291cmNlPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSA/PyBmYWxzZSk7CiAgICB9CiAgICB3cml0ZUxvZ0VudHJ5KGVudHJ5KSB7CiAgICAgIGlmICghdGhpcy50ZXJtaW5hbCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0TG9nRW50cnkoZW50cnkpOwogICAgICB0aGlzLnRlcm1pbmFsLndyaXRlbG4oZm9ybWF0dGVkKTsKICAgICAgaWYgKHRoaXMuYXV0b1Njcm9sbCkgewogICAgICAgIHRoaXMudGVybWluYWwuc2Nyb2xsVG9Cb3R0b20oKTsKICAgICAgfQogICAgfQogICAgZm9ybWF0TG9nRW50cnkoZW50cnkpIHsKICAgICAgY29uc3QgdGltZXN0YW1wMiA9IHRoaXMuZm9ybWF0VGltZXN0YW1wKGVudHJ5LnRpbWVzdGFtcCk7CiAgICAgIGNvbnN0IGxldmVsQ29sb3JzID0gewogICAgICAgIGRlYnVnOiAiXHgxQls5MG0iLAogICAgICAgIC8vIEdyYXkKICAgICAgICBpbmZvOiAiXHgxQlszNm0iLAogICAgICAgIC8vIEN5YW4KICAgICAgICB3YXJuOiAiXHgxQlszM20iLAogICAgICAgIC8vIFllbGxvdwogICAgICAgIGVycm9yOiAiXHgxQlszMW0iLAogICAgICAgIC8vIFJlZAogICAgICAgIHN1Y2Nlc3M6ICJceDFCWzMybSIKICAgICAgICAvLyBHcmVlbgogICAgICB9OwogICAgICBjb25zdCByZXNldCA9ICJceDFCWzBtIjsKICAgICAgY29uc3QgZGltID0gIlx4MUJbMm0iOwogICAgICBjb25zdCBsZXZlbFN0ciA9IGAke2xldmVsQ29sb3JzW2VudHJ5LmxldmVsXX1bJHtlbnRyeS5sZXZlbC50b1VwcGVyQ2FzZSgpLnBhZEVuZCg3KX1dJHtyZXNldH1gOwogICAgICBjb25zdCBzb3VyY2VTdHIgPSBlbnRyeS5zb3VyY2UgPyBgJHtkaW19WyR7ZW50cnkuc291cmNlfV0ke3Jlc2V0fSBgIDogIiI7CiAgICAgIGNvbnN0IG1lc3NhZ2VTdHIgPSB0aGlzLmFwcGx5SGlnaGxpZ2h0cyhlbnRyeS5tZXNzYWdlKTsKICAgICAgcmV0dXJuIGAke2RpbX0ke3RpbWVzdGFtcDJ9JHtyZXNldH0gJHtsZXZlbFN0cn0gJHtzb3VyY2VTdHJ9JHttZXNzYWdlU3RyfWA7CiAgICB9CiAgICBmb3JtYXRUaW1lc3RhbXAoaXNvU3RyaW5nKSB7CiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShpc29TdHJpbmcpOwogICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVRpbWVTdHJpbmcoImVuLVVTIiwgewogICAgICAgIGhvdXIxMjogZmFsc2UsCiAgICAgICAgaG91cjogIjItZGlnaXQiLAogICAgICAgIG1pbnV0ZTogIjItZGlnaXQiLAogICAgICAgIHNlY29uZDogIjItZGlnaXQiLAogICAgICAgIGZyYWN0aW9uYWxTZWNvbmREaWdpdHM6IDMKICAgICAgfSk7CiAgICB9CiAgICBhcHBseUhpZ2hsaWdodHModGV4dDkpIHsKICAgICAgY29uc3Qga2V5d29yZHMgPSBbLi4udGhpcy5oaWdobGlnaHRLZXl3b3Jkc107CiAgICAgIGlmICh0aGlzLmZpbHRlck1vZGUgJiYgdGhpcy5zZWFyY2hRdWVyeSkgewogICAgICAgIGtleXdvcmRzLnB1c2godGhpcy5zZWFyY2hRdWVyeSk7CiAgICAgIH0KICAgICAgaWYgKGtleXdvcmRzLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm4gdGV4dDk7CiAgICAgIGxldCByZXN1bHQgPSB0ZXh0OTsKICAgICAgZm9yIChjb25zdCBrZXl3b3JkIG9mIGtleXdvcmRzKSB7CiAgICAgICAgY29uc3QgZXNjYXBlZCA9IGtleXdvcmQucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICJcXCQmIik7CiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGAoJHtlc2NhcGVkfSlgLCAiZ2kiKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShyZWdleCwgIlx4MUJbNDNtXHgxQlszMG0kMVx4MUJbMG0iKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBSYXcgTG9nIE1ldGhvZHMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PQogICAgLyoqCiAgICAgKiBXcml0ZSByYXcgZGF0YSB0byB0aGUgdGVybWluYWwgKGZvciBEb2NrZXIgbG9ncywgZXRjLikKICAgICAqLwogICAgd3JpdGVSYXcoZGF0YSkgewogICAgICBpZiAoIXRoaXMudGVybWluYWwpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLnRlcm1pbmFsLndyaXRlKGRhdGEpOwogICAgICB0aGlzLnJlY29yZExvZ0V2ZW50KCk7CiAgICAgIGlmICh0aGlzLmF1dG9TY3JvbGwpIHsKICAgICAgICB0aGlzLnRlcm1pbmFsLnNjcm9sbFRvQm90dG9tKCk7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogV3JpdGUgYSByYXcgbGluZSB0byB0aGUgdGVybWluYWwKICAgICAqLwogICAgd3JpdGVsblJhdyhsaW5lKSB7CiAgICAgIGlmICghdGhpcy50ZXJtaW5hbCkKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMudGVybWluYWwud3JpdGVsbihsaW5lKTsKICAgICAgdGhpcy5yZWNvcmRMb2dFdmVudCgpOwogICAgICBpZiAodGhpcy5hdXRvU2Nyb2xsKSB7CiAgICAgICAgdGhpcy50ZXJtaW5hbC5zY3JvbGxUb0JvdHRvbSgpOwogICAgICB9CiAgICB9CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFNlYXJjaCBNZXRob2RzCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0KICAgIGhhbmRsZVNlYXJjaElucHV0KGUxMSkgewogICAgICBjb25zdCBpbnB1dCA9IGUxMS50YXJnZXQ7CiAgICAgIGNvbnN0IG5ld1F1ZXJ5ID0gaW5wdXQudmFsdWU7CiAgICAgIGNvbnN0IHF1ZXJ5Q2hhbmdlZCA9IHRoaXMuc2VhcmNoUXVlcnkgIT09IG5ld1F1ZXJ5OwogICAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gbmV3UXVlcnk7CiAgICAgIGlmICh0aGlzLmZpbHRlck1vZGUgJiYgcXVlcnlDaGFuZ2VkKSB7CiAgICAgICAgdGhpcy5yZVJlbmRlckZpbHRlcmVkTG9ncygpOwogICAgICB9IGVsc2UgaWYgKHRoaXMuc2VhcmNoUXVlcnkpIHsKICAgICAgICB0aGlzLnNlYXJjaEFkZG9uPy5maW5kTmV4dCh0aGlzLnNlYXJjaFF1ZXJ5KTsKICAgICAgfQogICAgfQogICAgaGFuZGxlU2VhcmNoS2V5ZG93bihlMTEpIHsKICAgICAgaWYgKGUxMS5rZXkgPT09ICJFbnRlciIpIHsKICAgICAgICBpZiAoZTExLnNoaWZ0S2V5KSB7CiAgICAgICAgICB0aGlzLnNlYXJjaFByZXZpb3VzKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuc2VhcmNoTmV4dCgpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChlMTEua2V5ID09PSAiRXNjYXBlIikgewogICAgICAgIHRoaXMuc2VhcmNoUXVlcnkgPSAiIjsKICAgICAgICBlMTEudGFyZ2V0LnZhbHVlID0gIiI7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2VhcmNoIGZvciBhIHF1ZXJ5IGluIHRoZSB0ZXJtaW5hbAogICAgICovCiAgICBzZWFyY2gocXVlcnkpIHsKICAgICAgdGhpcy5zZWFyY2hRdWVyeSA9IHF1ZXJ5OwogICAgICB0aGlzLnNlYXJjaEFkZG9uPy5maW5kTmV4dChxdWVyeSk7CiAgICB9CiAgICAvKioKICAgICAqIEZpbmQgbmV4dCBzZWFyY2ggbWF0Y2gKICAgICAqLwogICAgc2VhcmNoTmV4dCgpIHsKICAgICAgaWYgKHRoaXMuc2VhcmNoUXVlcnkpIHsKICAgICAgICB0aGlzLnNlYXJjaEFkZG9uPy5maW5kTmV4dCh0aGlzLnNlYXJjaFF1ZXJ5KTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBGaW5kIHByZXZpb3VzIHNlYXJjaCBtYXRjaAogICAgICovCiAgICBzZWFyY2hQcmV2aW91cygpIHsKICAgICAgaWYgKHRoaXMuc2VhcmNoUXVlcnkpIHsKICAgICAgICB0aGlzLnNlYXJjaEFkZG9uPy5maW5kUHJldmlvdXModGhpcy5zZWFyY2hRdWVyeSk7CiAgICAgIH0KICAgIH0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PQogICAgLy8gQ29udHJvbCBNZXRob2RzCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0KICAgIHRvZ2dsZUF1dG9TY3JvbGwoKSB7CiAgICAgIHRoaXMuYXV0b1Njcm9sbCA9ICF0aGlzLmF1dG9TY3JvbGw7CiAgICAgIGlmICh0aGlzLmF1dG9TY3JvbGwgJiYgdGhpcy50ZXJtaW5hbCkgewogICAgICAgIHRoaXMudGVybWluYWwuc2Nyb2xsVG9Cb3R0b20oKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBUb2dnbGUgYmV0d2VlbiBmaWx0ZXIgbW9kZSBhbmQgaGlnaGxpZ2h0IG1vZGUKICAgICAqLwogICAgdG9nZ2xlRmlsdGVyTW9kZSgpIHsKICAgICAgdGhpcy5maWx0ZXJNb2RlID0gIXRoaXMuZmlsdGVyTW9kZTsKICAgICAgdGhpcy5yZVJlbmRlckZpbHRlcmVkTG9ncygpOwogICAgfQogICAgLyoqCiAgICAgKiBSZS1yZW5kZXIgbG9ncyBiYXNlZCBvbiBjdXJyZW50IGZpbHRlciBzdGF0ZQogICAgICogSW4gZmlsdGVyIG1vZGU6IHNob3cgbWF0Y2hpbmcgbG9ncyB3aXRoIHBsYWNlaG9sZGVycyBmb3IgaGlkZGVuIGVudHJpZXMKICAgICAqIEluIGhpZ2hsaWdodCBtb2RlOiBzaG93IGFsbCBsb2dzCiAgICAgKi8KICAgIHJlUmVuZGVyRmlsdGVyZWRMb2dzKCkgewogICAgICBpZiAoIXRoaXMudGVybWluYWwpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLnRlcm1pbmFsLmNsZWFyKCk7CiAgICAgIHRoaXMudHJhaWxpbmdIaWRkZW5Db3VudCA9IDA7CiAgICAgIGlmICghdGhpcy5maWx0ZXJNb2RlIHx8ICF0aGlzLnNlYXJjaFF1ZXJ5KSB7CiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmxvZ0J1ZmZlcikgewogICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gdGhpcy5mb3JtYXRMb2dFbnRyeShlbnRyeSk7CiAgICAgICAgICB0aGlzLnRlcm1pbmFsLndyaXRlbG4oZm9ybWF0dGVkKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGV0IGhpZGRlbkNvdW50ID0gMDsKICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMubG9nQnVmZmVyKSB7CiAgICAgICAgICBpZiAodGhpcy5lbnRyeU1hdGNoZXNGaWx0ZXIoZW50cnkpKSB7CiAgICAgICAgICAgIGlmIChoaWRkZW5Db3VudCA+IDApIHsKICAgICAgICAgICAgICB0aGlzLndyaXRlSGlkZGVuUGxhY2Vob2xkZXIoaGlkZGVuQ291bnQpOwogICAgICAgICAgICAgIGhpZGRlbkNvdW50ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWQgPSB0aGlzLmZvcm1hdExvZ0VudHJ5KGVudHJ5KTsKICAgICAgICAgICAgdGhpcy50ZXJtaW5hbC53cml0ZWxuKGZvcm1hdHRlZCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoaWRkZW5Db3VudCsrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaGlkZGVuQ291bnQgPiAwKSB7CiAgICAgICAgICB0aGlzLndyaXRlSGlkZGVuUGxhY2Vob2xkZXIoaGlkZGVuQ291bnQpOwogICAgICAgICAgdGhpcy50cmFpbGluZ0hpZGRlbkNvdW50ID0gaGlkZGVuQ291bnQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0aGlzLmF1dG9TY3JvbGwpIHsKICAgICAgICB0aGlzLnRlcm1pbmFsLnNjcm9sbFRvQm90dG9tKCk7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogV3JpdGUgYSBwbGFjZWhvbGRlciBsaW5lIHNob3dpbmcgaG93IG1hbnkgbG9nIGVudHJpZXMgYXJlIGhpZGRlbiBieSBmaWx0ZXIKICAgICAqLwogICAgd3JpdGVIaWRkZW5QbGFjZWhvbGRlcihjb3VudDIpIHsKICAgICAgY29uc3QgZGltID0gIlx4MUJbMm0iOwogICAgICBjb25zdCByZXNldCA9ICJceDFCWzBtIjsKICAgICAgY29uc3QgdGV4dDkgPSBjb3VudDIgPT09IDEgPyBgWzEgbG9nIGxpbmUgaGlkZGVuIGJ5IGZpbHRlciAuLi5dYCA6IGBbJHtjb3VudDJ9IGxvZyBsaW5lcyBoaWRkZW4gYnkgZmlsdGVyIC4uLl1gOwogICAgICB0aGlzLnRlcm1pbmFsPy53cml0ZWxuKGAke2RpbX0ke3RleHQ5fSR7cmVzZXR9YCk7CiAgICB9CiAgICAvKioKICAgICAqIENsZWFyIGFsbCBsb2dzIGFuZCByZXNldCBtZXRyaWNzCiAgICAgKi8KICAgIGNsZWFyTG9ncygpIHsKICAgICAgdGhpcy50ZXJtaW5hbD8uY2xlYXIoKTsKICAgICAgdGhpcy5sb2dCdWZmZXIgPSBbXTsKICAgICAgdGhpcy50cmFpbGluZ0hpZGRlbkNvdW50ID0gMDsKICAgICAgdGhpcy5yZXNldE1ldHJpY3MoKTsKICAgIH0KICAgIC8qKgogICAgICogU2Nyb2xsIHRvIHRoZSBib3R0b20gb2YgdGhlIGxvZwogICAgICovCiAgICBzY3JvbGxUb0JvdHRvbSgpIHsKICAgICAgdGhpcy50ZXJtaW5hbD8uc2Nyb2xsVG9Cb3R0b20oKTsKICAgIH0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PQogICAgLy8gTWV0cmljcyBNZXRob2RzCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0KICAgIHVwZGF0ZU1ldHJpY3MobGV2ZWwpIHsKICAgICAgdGhpcy5tZXRyaWNzID0gewogICAgICAgIC4uLnRoaXMubWV0cmljcywKICAgICAgICBbbGV2ZWxdOiB0aGlzLm1ldHJpY3NbbGV2ZWxdICsgMSwKICAgICAgICB0b3RhbDogdGhpcy5tZXRyaWNzLnRvdGFsICsgMQogICAgICB9OwogICAgICB0aGlzLnJlY29yZExvZ0V2ZW50KCk7CiAgICB9CiAgICByZWNvcmRMb2dFdmVudCgpIHsKICAgICAgdGhpcy5yYXRlQnVmZmVyLnB1c2goRGF0ZS5ub3coKSk7CiAgICB9CiAgICBjYWxjdWxhdGVSYXRlKCkgewogICAgICBjb25zdCBub3cyID0gRGF0ZS5ub3coKTsKICAgICAgdGhpcy5yYXRlQnVmZmVyID0gdGhpcy5yYXRlQnVmZmVyLmZpbHRlcigodDkpID0+IG5vdzIgLSB0OSA8IDFlNCk7CiAgICAgIGNvbnN0IHJhdGUgPSB0aGlzLnJhdGVCdWZmZXIubGVuZ3RoIC8gMTA7CiAgICAgIGlmIChyYXRlICE9PSB0aGlzLm1ldHJpY3MucmF0ZSkgewogICAgICAgIHRoaXMubWV0cmljcyA9IHsgLi4udGhpcy5tZXRyaWNzLCByYXRlIH07CiAgICAgIH0KICAgIH0KICAgIHJlc2V0TWV0cmljcygpIHsKICAgICAgdGhpcy5tZXRyaWNzID0geyBkZWJ1ZzogMCwgaW5mbzogMCwgd2FybjogMCwgZXJyb3I6IDAsIHN1Y2Nlc3M6IDAsIHRvdGFsOiAwLCByYXRlOiAwIH07CiAgICAgIHRoaXMucmF0ZUJ1ZmZlciA9IFtdOwogICAgfQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBMaWZlY3ljbGUKICAgIC8vID09PT09PT09PT09PT09PT09PT09PQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGlmICh0aGlzLnJlc2l6ZU9ic2VydmVyKSB7CiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMudGVybWluYWxUaGVtZVN1YnNjcmlwdGlvbikgewogICAgICAgIHRoaXMudGVybWluYWxUaGVtZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICB9CiAgICAgIGlmICh0aGlzLnJhdGVJbnRlcnZhbCkgewogICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5yYXRlSW50ZXJ2YWwpOwogICAgICB9CiAgICAgIGlmICh0aGlzLnRlcm1pbmFsKSB7CiAgICAgICAgdGhpcy50ZXJtaW5hbC5kaXNwb3NlKCk7CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNTUoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNDaGFydExvZzIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWRhdGF2aWV3L2RlZXMtZGF0YXZpZXctY29kZWJveC9kZWVzLWRhdGF2aWV3LWNvZGVib3guZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmMzOCA9ICgpID0+IGIyYAogIDxzdHlsZT4KICAgIC5kZW1vV3JhcHBlciB7CiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIG1pbi1oZWlnaHQ6IDEwMHZoOwogICAgICBwYWRkaW5nOiA0OHB4OwogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y4ZjlmYSIsICIjMGEwYTBhIil9OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDMycHg7CiAgICB9CiAgICAKICAgIC5zZWN0aW9uIHsKICAgICAgbWF4LXdpZHRoOiA5MDBweDsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgfQogICAgCiAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICB9CiAgICAKICAgIC5zZWN0aW9uLWRlc2NyaXB0aW9uIHsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgIH0KICA8L3N0eWxlPgogIDxkaXYgY2xhc3M9ImRlbW9XcmFwcGVyIj4KICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5UeXBlU2NyaXB0IENvZGUgRXhhbXBsZTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5BIGNvbXByZWhlbnNpdmUgVHlwZVNjcmlwdCBjb2RlIGV4YW1wbGUgd2l0aCB2YXJpb3VzIHN5bnRheCBoaWdobGlnaHRpbmcuPC9kaXY+CiAgICAgIDxkZWVzLWRhdGF2aWV3LWNvZGVib3ggcHJvZ2xhbmc9InR5cGVzY3JpcHQiPgppbnRlcmZhY2UgVXNlciB7CiAgaWQ6IG51bWJlcjsKICBuYW1lOiBzdHJpbmc7CiAgZW1haWw6IHN0cmluZzsKICBpc0FjdGl2ZTogYm9vbGVhbjsKfQoKY2xhc3MgVXNlclNlcnZpY2UgewogIHByaXZhdGUgdXNlcnM6IFVzZXJbXSA9IFtdOwogIAogIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBpVXJsOiBzdHJpbmcpIHsKICAgIGNvbnNvbGUubG9nKCdVc2VyU2VydmljZSBpbml0aWFsaXplZCcpOwogIH0KICAKICBhc3luYyBnZXRVc2VycygpOiBQcm9taXNlPFVzZXJbXT4gewogICAgdHJ5IHsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0aGlzLmFwaVVybCk7CiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICAgIHJldHVybiBkYXRhLnVzZXJzOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZldGNoIHVzZXJzOicsIGVycm9yKTsKICAgICAgcmV0dXJuIFtdOwogICAgfQogIH0KICAKICBhZGRVc2VyKHVzZXI6IFVzZXIpOiB2b2lkIHsKICAgIHRoaXMudXNlcnMucHVzaCh1c2VyKTsKICB9Cn0KCi8vIFVzYWdlIGV4YW1wbGUKY29uc3Qgc2VydmljZSA9IG5ldyBVc2VyU2VydmljZSgnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vdXNlcnMnKTsKY29uc3QgdXNlcnMgPSBhd2FpdCBzZXJ2aWNlLmdldFVzZXJzKCk7CmNvbnNvbGUubG9nKCdGb3VuZCB1c2VyczonLCB1c2Vycy5sZW5ndGgpOwogICAgICA8L2RlZXMtZGF0YXZpZXctY29kZWJveD4KICAgIDwvZGl2PgogICAgCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+SmF2YVNjcmlwdCBFeGFtcGxlPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPk1vZGVybiBKYXZhU2NyaXB0IHdpdGggRVM2KyBmZWF0dXJlcy48L2Rpdj4KICAgICAgPGRlZXMtZGF0YXZpZXctY29kZWJveCBwcm9nbGFuZz0iamF2YXNjcmlwdCI+Ci8vIEFycmF5IG1hbmlwdWxhdGlvbiBleGFtcGxlcwpjb25zdCBudW1iZXJzID0gWzEsIDIsIDMsIDQsIDVdOwpjb25zdCBkb3VibGVkID0gbnVtYmVycy5tYXAobiA9PiBuICogMik7CmNvbnN0IGZpbHRlcmVkID0gbnVtYmVycy5maWx0ZXIobiA9PiBuID4gMyk7CgovLyBPYmplY3QgZGVzdHJ1Y3R1cmluZwpjb25zdCB1c2VyID0geyBuYW1lOiAnSm9obicsIGFnZTogMzAsIGNpdHk6ICdOZXcgWW9yaycgfTsKY29uc3QgeyBuYW1lLCBhZ2UgfSA9IHVzZXI7CgovLyBQcm9taXNlIGhhbmRsaW5nCmNvbnN0IGZldGNoRGF0YSA9IGFzeW5jICh1cmwpID0+IHsKICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7CiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTsKfTsKCi8vIE1vZGVybiBzeW50YXgKY29uc3QgZ3JlZXQgPSAobmFtZSA9ICdXb3JsZCcpID0+IFxgSGVsbG8sIFwke25hbWV9IVxgOwpjb25zb2xlLmxvZyhncmVldCgnU2hhZENOJykpOwogICAgICA8L2RlZXMtZGF0YXZpZXctY29kZWJveD4KICAgIDwvZGl2PgogICAgCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+UHl0aG9uIEV4YW1wbGU8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+UHl0aG9uIGNvZGUgd2l0aCBjbGFzc2VzIGFuZCB0eXBlIGhpbnRzLjwvZGl2PgogICAgICA8ZGVlcy1kYXRhdmlldy1jb2RlYm94IHByb2dsYW5nPSJweXRob24iPgpmcm9tIHR5cGluZyBpbXBvcnQgTGlzdCwgT3B0aW9uYWwKaW1wb3J0IGFzeW5jaW8KCmNsYXNzIERhdGFQcm9jZXNzb3I6CiAgICAiIiJBIHNpbXBsZSBkYXRhIHByb2Nlc3NvciBjbGFzcyIiIgogICAgCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZTogc3RyKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5kYXRhOiBMaXN0W2RpY3RdID0gW10KICAgIAogICAgYXN5bmMgZGVmIHByb2Nlc3NfZGF0YShzZWxmLCBpdGVtczogTGlzdFtkaWN0XSkgLT4gTGlzdFtkaWN0XToKICAgICAgICAiIiJQcm9jZXNzIGRhdGEgaXRlbXMgYXN5bmNocm9ub3VzbHkiIiIKICAgICAgICByZXN1bHRzID0gW10KICAgICAgICBmb3IgaXRlbSBpbiBpdGVtczoKICAgICAgICAgICAgIyBTaW11bGF0ZSBhc3luYyBwcm9jZXNzaW5nCiAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMC4xKQogICAgICAgICAgICByZXN1bHRzLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAnaWQnOiBpdGVtLmdldCgnaWQnKSwKICAgICAgICAgICAgICAgICdwcm9jZXNzZWQnOiBUcnVlLAogICAgICAgICAgICAgICAgJ3Byb2Nlc3Nvcic6IHNlbGYubmFtZQogICAgICAgICAgICB9KQogICAgICAgIHJldHVybiByZXN1bHRzCiAgICAKICAgIGRlZiBnZXRfc3VtbWFyeShzZWxmKSAtPiBkaWN0OgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICdwcm9jZXNzb3InOiBzZWxmLm5hbWUsCiAgICAgICAgICAgICdpdGVtc19wcm9jZXNzZWQnOiBsZW4oc2VsZi5kYXRhKQogICAgICAgIH0KCiMgVXNhZ2UKcHJvY2Vzc29yID0gRGF0YVByb2Nlc3NvcigiTWFpbiIpCmRhdGEgPSBhd2FpdCBwcm9jZXNzb3IucHJvY2Vzc19kYXRhKFt7J2lkJzogMX0sIHsnaWQnOiAyfV0pCiAgICAgIDwvZGVlcy1kYXRhdmlldy1jb2RlYm94PgogICAgPC9kaXY+CiAgICAKICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5DU1MgRXhhbXBsZTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5Nb2Rlcm4gQ1NTIHdpdGggY3VzdG9tIHByb3BlcnRpZXMgYW5kIGFuaW1hdGlvbnMuIE5vdGUgdGhlIHNob3J0ZXIgbGFuZ3VhZ2UgbGFiZWwuPC9kaXY+CiAgICAgIDxkZWVzLWRhdGF2aWV3LWNvZGVib3ggcHJvZ2xhbmc9ImNzcyI+Ci8qIE1vZGVybiBDU1Mgd2l0aCBjdXN0b20gcHJvcGVydGllcyAqLwo6cm9vdCB7CiAgLS1wcmltYXJ5LWNvbG9yOiAjM2I4MmY2OwogIC0tc2Vjb25kYXJ5LWNvbG9yOiAjMTBiOTgxOwogIC0tYmFja2dyb3VuZDogI2ZmZmZmZjsKICAtLXRleHQtY29sb3I6ICMwOTA5MGI7CiAgLS1ib3JkZXItcmFkaXVzOiA2cHg7Cn0KCi5jYXJkIHsKICBiYWNrZ3JvdW5kOiB2YXIoLS1iYWNrZ3JvdW5kKTsKICBib3JkZXI6IDFweCBzb2xpZCAjZTVlN2ViOwogIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlci1yYWRpdXMpOwogIHBhZGRpbmc6IDI0cHg7CiAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xKTsKICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwp9CgouY2FyZDpob3ZlciB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpOwogIGJveC1zaGFkb3c6IDAgNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMSk7Cn0KCkBrZXlmcmFtZXMgZmFkZUluIHsKICBmcm9tIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwcHgpOyB9CiAgdG8geyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH0KfQogICAgICA8L2RlZXMtZGF0YXZpZXctY29kZWJveD4KICAgIDwvZGl2PgogICAgCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+SlNPTiBFeGFtcGxlPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPkpTT04gY29uZmlndXJhdGlvbiB3aXRoIHByb3BlciBmb3JtYXR0aW5nLjwvZGl2PgogICAgICA8ZGVlcy1kYXRhdmlldy1jb2RlYm94IHByb2dsYW5nPSJqc29uIj4KewogICJuYW1lIjogIkBkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZyIsCiAgInZlcnNpb24iOiAiMS4xMC43IiwKICAiZGVzY3JpcHRpb24iOiAiQSBjb21wcmVoZW5zaXZlIGNhdGFsb2cgb2Ygd2ViIGNvbXBvbmVudHMiLAogICJtYWluIjogImRpc3RfdHNfd2ViL2luZGV4LmpzIiwKICAidHlwZSI6ICJtb2R1bGUiLAogICJzY3JpcHRzIjogewogICAgImJ1aWxkIjogInRzYnVpbGQgdHNmb2xkZXJzIC0tYWxsb3dpbXBsaWNpdGFueSAmJiB0c2J1bmRsZSBlbGVtZW50IC0tcHJvZHVjdGlvbiIsCiAgICAid2F0Y2giOiAidHN3YXRjaCBlbGVtZW50IiwKICAgICJ0ZXN0IjogInRzdGVzdCB0ZXN0LyAtLXdlYiAtLXZlcmJvc2UiCiAgfSwKICAiZGVwZW5kZW5jaWVzIjogewogICAgIkBkZXNpZ24uZXN0YXRlL2RlZXMtZWxlbWVudCI6ICJeMi4wLjQ1IiwKICAgICJoaWdobGlnaHQuanMiOiAiXjExLjkuMCIKICB9Cn0KICAgICAgPC9kZWVzLWRhdGF2aWV3LWNvZGVib3g+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1kYXRhdmlldy9kZWVzLWRhdGF2aWV3LWNvZGVib3gvZGVlcy1kYXRhdmlldy1jb2RlYm94LmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfZGlzdF90czEzKCk7CmluaXRfZGlzdF90czI5KCk7CmluaXRfc2VydmljZXMoKTsKdmFyIF9fZXNEZWNvcmF0ZTU1ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM1NiA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0RhdGF2aWV3Q29kZWJveCA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1kYXRhdmlldy1jb2RlYm94IildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfcHJvZ0xhbmdfZGVjb3JhdG9yczsKICBsZXQgX3Byb2dMYW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcHJvZ0xhbmdfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvZGVUb0Rpc3BsYXlfZGVjb3JhdG9yczsKICBsZXQgX2NvZGVUb0Rpc3BsYXlfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb2RlVG9EaXNwbGF5X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNEYXRhdmlld0NvZGVib3gyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfcHJvZ0xhbmdfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX2NvZGVUb0Rpc3BsYXlfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgIHJlZmxlY3Q6IHRydWUKICAgICAgfSldOwogICAgICBfX2VzRGVjb3JhdGU1NSh0aGlzLCBudWxsLCBfcHJvZ0xhbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicHJvZ0xhbmciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInByb2dMYW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnByb2dMYW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5wcm9nTGFuZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wcm9nTGFuZ19pbml0aWFsaXplcnMsIF9wcm9nTGFuZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU1KHRoaXMsIG51bGwsIF9jb2RlVG9EaXNwbGF5X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNvZGVUb0Rpc3BsYXkiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNvZGVUb0Rpc3BsYXkiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29kZVRvRGlzcGxheSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY29kZVRvRGlzcGxheSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jb2RlVG9EaXNwbGF5X2luaXRpYWxpemVycywgX2NvZGVUb0Rpc3BsYXlfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1NShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNEYXRhdmlld0NvZGVib3gyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmMzODsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJEYXRhIFZpZXciLCAiV29ya3NwYWNlIl07CiAgICAjcHJvZ0xhbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNTYodGhpcywgX3Byb2dMYW5nX2luaXRpYWxpemVycywgInR5cGVzY3JpcHQiKTsKICAgIGdldCBwcm9nTGFuZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Byb2dMYW5nX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcHJvZ0xhbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Byb2dMYW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29kZVRvRGlzcGxheV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTYodGhpcywgX3Byb2dMYW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1Nih0aGlzLCBfY29kZVRvRGlzcGxheV9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgY29kZVRvRGlzcGxheSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvZGVUb0Rpc3BsYXlfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjb2RlVG9EaXNwbGF5KHZhbHVlMikgewogICAgICB0aGlzLiNjb2RlVG9EaXNwbGF5X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgIH0KICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICAke2RvbXRvb2xzX2VsZW1lbnRiYXNpY19leHBvcnRzLnN0eWxlc30KICAgICAgPHN0eWxlPgogICAgICAgIDpob3N0IHsKICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICAgIGZvbnQtZmFtaWx5OiAke2Nzc0dlaXN0Rm9udEZhbWlseX07CiAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIH0KICAgICAgICAubWFpbmJveCB7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjA2KTsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMwOTA5MGIiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIH0KCiAgICAgICAgLmFwcGJhciB7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjlmYWZiIiwgIiMxODE4MWIiKX07CiAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgICBsaW5lLWhlaWdodDogMzJweDsKICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIH0KCiAgICAgICAgLmFwcGJhciAuZmlsZU5hbWUgewogICAgICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICBmbGV4OiAxOwogICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIH0KCiAgICAgICAgLmJvdHRvbUJhciB7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjlmYWZiIiwgIiMxODE4MWIiKX07CiAgICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgICAgIGhlaWdodDogMjhweDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICAgIGxpbmUtaGVpZ2h0OiAyOHB4OwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgICBhbGlnbi1pdGVtczogc3RyZXRjaDsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB9CgogICAgICAgIC5zcGFjZXNMYWJlbCB7CiAgICAgICAgICBwYWRkaW5nOiAwIDE2cHg7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICB9CgogICAgICAgIC5sYW5ndWFnZUxhYmVsIHsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjM2I4MmY2Iil9OwogICAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgbGluZS1oZWlnaHQ6IDI4cHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSg1OSwgMTMwLCAyNDYsIDAuMSkiLCAicmdiYSg1OSwgMTMwLCAyNDYsIDAuMSkiKX07CiAgICAgICAgICBwYWRkaW5nOiAwcHggMTZweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICB9CgogICAgICAgIC5obGpzLWtleXdvcmQgewogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZGMyNjI2IiwgIiNmODcxNzEiKX07CiAgICAgICAgfQoKICAgICAgICAuY29kZWdyaWQgewogICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNTBweCBhdXRvOwogICAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgICBmbGV4OiAxOwogICAgICAgICAgbWluLWhlaWdodDogMDsKICAgICAgICB9CgogICAgICAgIC5saW5lTnVtYmVycyB7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiIzUyNTI1YiIpfTsKICAgICAgICAgIHBhZGRpbmc6IDI0cHggMTZweCAwcHggMHB4OwogICAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgICAgIH0KCiAgICAgICAgLmxpbmVDb3VudGVyOmxhc3QtY2hpbGQgewogICAgICAgICAgb3BhY2l0eTogNTAlOwogICAgICAgIH0KCiAgICAgICAgcHJlIHsKICAgICAgICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICAgICAgICBtYXJnaW46IDBweDsKICAgICAgICAgIHBhZGRpbmc6IDI0cHggMjRweDsKICAgICAgICB9CgogICAgICAgIGNvZGUgewogICAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICAgIHBhZGRpbmc6IDBweDsKICAgICAgICAgIG1hcmdpbjogMHB4OwogICAgICAgIH0KCiAgICAgICAgY29kZSwKICAgICAgICBjb2RlICosCiAgICAgICAgLmxpbmVOdW1iZXJzIHsKICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjRlbTsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiAyMDA7CiAgICAgICAgICBmb250LWZhbWlseTogJHtjc3NNb25vRm9udEZhbWlseX07CiAgICAgICAgfQoKICAgICAgICAuaGxqcy1zdHJpbmcgewogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDU5NjY5IiwgIiMxMGI5ODEiKX07CiAgICAgICAgfQoKICAgICAgICAuaGxqcy1idWlsdF9pbiB7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM4YjVjZjYiLCAiI2E3OGJmYSIpfTsKICAgICAgICB9CgogICAgICAgIC5obGpzLWZ1bmN0aW9uIHsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjNjBhNWZhIil9OwogICAgICAgIH0KCiAgICAgICAgLmhsanMtcGFyYW1zIHsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA4OTFiMiIsICIjMDZiNmQ0Iil9OwogICAgICAgIH0KCiAgICAgICAgLmhsanMtY29tbWVudCB7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiIzcxNzE3YSIpfTsKICAgICAgICB9CgogICAgICAgIC5obGpzLW51bWJlciB7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlYTU4MGMiLCAiI2ZiOTIzYyIpfTsKICAgICAgICB9CgogICAgICAgIC5obGpzLWxpdGVyYWwgewogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZGMyNjI2IiwgIiNmODcxNzEiKX07CiAgICAgICAgfQoKICAgICAgICAuaGxqcy1hdHRyIHsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzhiNWNmNiIsICIjYTc4YmZhIil9OwogICAgICAgIH0KCiAgICAgICAgLmhsanMtdmFyaWFibGUgewogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICAgICAgfQogICAgICA8L3N0eWxlPgogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9Im1haW5ib3giCiAgICAgICAgQGNvbnRleHRtZW51PSIkeyhldmVudEFyZykgPT4gewogICAgICAgIERlZXNDb250ZXh0bWVudS5vcGVuQ29udGV4dE1lbnVXaXRoT3B0aW9ucyhldmVudEFyZywgWwogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiQWJvdXQiLAogICAgICAgICAgICBpY29uTmFtZTogImNpcmNsZUluZm8iLAogICAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIF0pOwogICAgICB9fSIKICAgICAgPgogICAgICAgIDxkaXYgY2xhc3M9ImFwcGJhciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJmaWxlTmFtZSI+aW5kZXgudHM8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlZ3JpZCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lTnVtYmVycyI+CiAgICAgICAgICAgICR7KCgpID0+IHsKICAgICAgICBsZXQgbGluZUNvdW50ZXIgPSAwOwogICAgICAgIHJldHVybiB0aGlzLmNvZGVUb0Rpc3BsYXkuc3BsaXQoIlxuIikubWFwKChsaW5lQXJnKSA9PiB7CiAgICAgICAgICBsaW5lQ291bnRlcisrOwogICAgICAgICAgcmV0dXJuIGIyYDxkaXYgY2xhc3M9ImxpbmVDb3VudGVyIj4ke2xpbmVDb3VudGVyfTwvZGl2PmA7CiAgICAgICAgfSk7CiAgICAgIH0pKCl9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxwcmU+PGNvZGU+PC9jb2RlPjwvcHJlPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImJvdHRvbUJhciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzcGFjZXNMYWJlbCI+U3BhY2VzOiAyPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsYW5ndWFnZUxhYmVsIj4ke3RoaXMucHJvZ0xhbmd9PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGNvZGVUb0Rpc3BsYXlTdG9yZSA9IChfX3J1bkluaXRpYWxpemVyczU2KHRoaXMsIF9jb2RlVG9EaXNwbGF5X2V4dHJhSW5pdGlhbGl6ZXJzKSwgIiIpOwogICAgaGlnaGxpZ2h0SnMgPSBudWxsOwogICAgYXN5bmMgdXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIudXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBjb25zb2xlLmxvZygiaGlnaGxpZ2h0aW5nIG5vdyIpOwogICAgICBjb25zb2xlLmxvZyh0aGlzLmNoaWxkTm9kZXMpOwogICAgICBjb25zdCBzbG90dGVkQ29kZU5vZGVzID0gW107CiAgICAgIHRoaXMuY2hpbGROb2Rlcy5mb3JFYWNoKChjaGlsZE5vZGUpID0+IHsKICAgICAgICBpZiAoY2hpbGROb2RlLm5vZGVOYW1lID09PSAiI3RleHQiKSB7CiAgICAgICAgICBzbG90dGVkQ29kZU5vZGVzLnB1c2goY2hpbGROb2RlKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBpZiAodGhpcy5jb2RlVG9EaXNwbGF5ICYmIHRoaXMuY29kZVRvRGlzcGxheSAhPT0gdGhpcy5jb2RlVG9EaXNwbGF5U3RvcmUpIHsKICAgICAgICB0aGlzLmNvZGVUb0Rpc3BsYXlTdG9yZSA9IHNtYXJ0c3RyaW5nX2luZGVudF9leHBvcnRzLm5vcm1hbGl6ZSh0aGlzLmNvZGVUb0Rpc3BsYXkpLnRyaW1TdGFydCgpOwogICAgICB9CiAgICAgIGlmIChzbG90dGVkQ29kZU5vZGVzWzBdICYmIHNsb3R0ZWRDb2RlTm9kZXNbMF0ud2hvbGVUZXh0ICYmICF0aGlzLmNvZGVUb0Rpc3BsYXkpIHsKICAgICAgICB0aGlzLmNvZGVUb0Rpc3BsYXlTdG9yZSA9IHNtYXJ0c3RyaW5nX2luZGVudF9leHBvcnRzLm5vcm1hbGl6ZShzbG90dGVkQ29kZU5vZGVzWzBdLndob2xlVGV4dCkudHJpbVN0YXJ0KCk7CiAgICAgICAgdGhpcy5jb2RlVG9EaXNwbGF5ID0gdGhpcy5jb2RlVG9EaXNwbGF5U3RvcmU7CiAgICAgIH0KICAgICAgYXdhaXQgZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzLnNtYXJ0ZGVsYXkuZGVsYXlGb3IoMCk7CiAgICAgIGlmICghdGhpcy5oaWdobGlnaHRKcykgewogICAgICAgIHRoaXMuaGlnaGxpZ2h0SnMgPSBhd2FpdCBEZWVzU2VydmljZUxpYkxvYWRlci5nZXRJbnN0YW5jZSgpLmxvYWRIaWdobGlnaHRKcygpOwogICAgICB9CiAgICAgIGNvbnN0IGxvY2FsQ29kZU5vZGUgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiY29kZSIpOwogICAgICBjb25zdCBoaWdobGlnaHRlZEh0bWwgPSB0aGlzLmhpZ2hsaWdodEpzLmhpZ2hsaWdodCh0aGlzLmNvZGVUb0Rpc3BsYXlTdG9yZSwgewogICAgICAgIGxhbmd1YWdlOiB0aGlzLnByb2dMYW5nLAogICAgICAgIGlnbm9yZUlsbGVnYWxzOiB0cnVlCiAgICAgIH0pOwogICAgICBsb2NhbENvZGVOb2RlLmlubmVySFRNTCA9IGhpZ2hsaWdodGVkSHRtbC52YWx1ZTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNTYoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNEYXRhdmlld0NvZGVib3gyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1kYXRhdmlldy9kZWVzLWRhdGF2aWV3LXN0YXR1c29iamVjdC9kZWVzLWRhdGF2aWV3LXN0YXR1c29iamVjdC5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkZW1vRnVuYzM5ID0gKCkgPT4gYjJgIDxzdHlsZT4KICAgIC5kZW1vIHsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmNWY1ZjUiLCAiIzBhMGEwYSIpfTsKICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIGNvbnRlbnQ6ICcnOwogICAgICBwYWRkaW5nOiA0MHB4OwogICAgfQogICAgCiAgICAuZGVtby1ncmlkIHsKICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgZ2FwOiAyNHB4OwogICAgICBtYXgtd2lkdGg6IDgwMHB4OwogICAgICBtYXJnaW46IDAgYXV0bzsKICAgIH0KICAgIAogICAgLmRlbW8tc2VjdGlvbiB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIGdhcDogMTZweDsKICAgIH0KICAgIAogICAgLmRlbW8tdGl0bGUgewogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDUuMSUpIiwgImhzbCgwIDAlIDYzLjklKSIpfTsKICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmOwogICAgfQogICAgCiAgICAuZGVtby1ub3RlIHsKICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQ1LjElKSIsICJoc2woMCAwJSA2My45JSkiKX07CiAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmOwogICAgfQogIDwvc3R5bGU+CiAgPGRpdiBjbGFzcz0iZGVtbyI+CiAgICA8ZGl2IGNsYXNzPSJkZW1vLW5vdGUiPgogICAgICBSaWdodC1jbGljayBvbiBhbnkgZGV0YWlsIHJvdyB0byBjb3B5IHRoZSB2YWx1ZSwga2V5LCBvciBrZXk6dmFsdWUgY29tYmluYXRpb24KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iZGVtby1ncmlkIj4KICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkZW1vLXRpdGxlIj5TZXJ2aWNlIEhlYWx0aCBTdGF0dXM8L2Rpdj4KICAgICAgICA8ZGVlcy1kYXRhdmlldy1zdGF0dXNvYmplY3QKICAgICAgICAgIC5zdGF0dXNPYmplY3Q9JHt7CiAgaWQ6ICIxIiwKICBuYW1lOiAiQVBJIEdhdGV3YXkgU2VydmljZSIsCiAgY29tYmluZWRTdGF0dXM6ICJvayIsCiAgY29tYmluZWRTdGF0dXNUZXh0OiAiQWxsIHN5c3RlbXMgb3BlcmF0aW9uYWwiLAogIGRldGFpbHM6IFsKICAgIHsKICAgICAgbmFtZTogIlJlc3BvbnNlIFRpbWUiLAogICAgICB2YWx1ZTogIjQ1bXMgKGF2ZykiLAogICAgICBzdGF0dXM6ICJvayIsCiAgICAgIHN0YXR1c1RleHQ6ICJXaXRoaW4gbm9ybWFsIHJhbmdlIgogICAgfSwKICAgIHsKICAgICAgbmFtZTogIlVwdGltZSIsCiAgICAgIHZhbHVlOiAiOTkuOTklICgzMCBkYXlzKSIsCiAgICAgIHN0YXR1czogIm9rIiwKICAgICAgc3RhdHVzVGV4dDogIkV4Y2VsbGVudCB1cHRpbWUiCiAgICB9LAogICAgewogICAgICBuYW1lOiAiQWN0aXZlIENvbm5lY3Rpb25zIiwKICAgICAgdmFsdWU6ICIxLDIzNCAvIDEwLDAwMCIsCiAgICAgIHN0YXR1czogIm9rIiwKICAgICAgc3RhdHVzVGV4dDogIk5vcm1hbCBsb2FkIgogICAgfSwKICAgIHsKICAgICAgbmFtZTogIlNTTCBDZXJ0aWZpY2F0ZSIsCiAgICAgIHZhbHVlOiAiVmFsaWQgdW50aWwgMjAyNC0xMi0zMSIsCiAgICAgIHN0YXR1czogIm9rIiwKICAgICAgc3RhdHVzVGV4dDogIkNlcnRpZmljYXRlIHZhbGlkIgogICAgfQogIF0KfX0KICAgICAgICA+CiAgICAgICAgPC9kZWVzLWRhdGF2aWV3LXN0YXR1c29iamVjdD4KICAgICAgPC9kaXY+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxkaXYgY2xhc3M9ImRlbW8tdGl0bGUiPkRhdGFiYXNlIENsdXN0ZXIgU3RhdHVzPC9kaXY+CiAgICAgICAgPGRlZXMtZGF0YXZpZXctc3RhdHVzb2JqZWN0CiAgICAgICAgICAuc3RhdHVzT2JqZWN0PSR7ewogIGlkOiAiMiIsCiAgbmFtZTogIlBvc3RncmVTUUwgQ2x1c3RlciIsCiAgY29tYmluZWRTdGF0dXM6ICJwYXJ0bHlfb2siLAogIGNvbWJpbmVkU3RhdHVzVGV4dDogIk1pbm9yIGlzc3VlcyBkZXRlY3RlZCIsCiAgZGV0YWlsczogWwogICAgewogICAgICBuYW1lOiAiUHJpbWFyeSBOb2RlIiwKICAgICAgdmFsdWU6ICJkYi1wcmltYXJ5LTAxIChoZWFsdGh5KSIsCiAgICAgIHN0YXR1czogIm9rIiwKICAgICAgc3RhdHVzVGV4dDogIk9wZXJhdGluZyBub3JtYWxseSIKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJSZXBsaWNhIExhZyIsCiAgICAgIHZhbHVlOiAiMi41IHNlY29uZHMiLAogICAgICBzdGF0dXM6ICJwYXJ0bHlfb2siLAogICAgICBzdGF0dXNUZXh0OiAiU2xpZ2h0bHkgZWxldmF0ZWQiCiAgICB9LAogICAgewogICAgICBuYW1lOiAiRGlzayBVc2FnZSIsCiAgICAgIHZhbHVlOiAiNzglICgzMTJHQiAvIDQwMEdCKSIsCiAgICAgIHN0YXR1czogInBhcnRseV9vayIsCiAgICAgIHN0YXR1c1RleHQ6ICJBcHByb2FjaGluZyB0aHJlc2hvbGQiCiAgICB9LAogICAgewogICAgICBuYW1lOiAiQ29ubmVjdGlvbiBQb29sIiwKICAgICAgdmFsdWU6ICI4OSAvIDEwMCBjb25uZWN0aW9ucyIsCiAgICAgIHN0YXR1czogIm9rIiwKICAgICAgc3RhdHVzVGV4dDogIldpdGhpbiBsaW1pdHMiCiAgICB9CiAgXQp9fQogICAgICAgID4KICAgICAgICA8L2RlZXMtZGF0YXZpZXctc3RhdHVzb2JqZWN0PgogICAgICA8L2Rpdj4KICAgICAgCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iZGVtby10aXRsZSI+QnVpbGQgUGlwZWxpbmUgU3RhdHVzPC9kaXY+CiAgICAgICAgPGRlZXMtZGF0YXZpZXctc3RhdHVzb2JqZWN0CiAgICAgICAgICAuc3RhdHVzT2JqZWN0PSR7ewogIGlkOiAiMyIsCiAgbmFtZTogIkNJL0NEIFBpcGVsaW5lIiwKICBjb21iaW5lZFN0YXR1czogIm5vdF9vayIsCiAgY29tYmluZWRTdGF0dXNUZXh0OiAiQnVpbGQgZmFpbHVyZSIsCiAgZGV0YWlsczogWwogICAgewogICAgICBuYW1lOiAiTGFzdCBCdWlsZCIsCiAgICAgIHZhbHVlOiAiQnVpbGQgIzEyMzQgLSBGYWlsZWQiLAogICAgICBzdGF0dXM6ICJub3Rfb2siLAogICAgICBzdGF0dXNUZXh0OiAiVGVzdCBmYWlsdXJlcyIKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICJGYWlsZWQgVGVzdHMiLAogICAgICB2YWx1ZTogIjMgdGVzdHMgZmFpbGVkOiBhdXRoLnNwZWMudHMsIHVzZXIuc3BlYy50cywgYXBpLnNwZWMudHMiLAogICAgICBzdGF0dXM6ICJub3Rfb2siLAogICAgICBzdGF0dXNUZXh0OiAiVW5pdCB0ZXN0IGZhaWx1cmVzIgogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkNvZGUgQ292ZXJhZ2UiLAogICAgICB2YWx1ZTogIjgyLjUlICh0YXJnZXQ6IDg1JSkiLAogICAgICBzdGF0dXM6ICJwYXJ0bHlfb2siLAogICAgICBzdGF0dXNUZXh0OiAiQmVsb3cgdGFyZ2V0IgogICAgfSwKICAgIHsKICAgICAgbmFtZTogIkJ1aWxkIER1cmF0aW9uIiwKICAgICAgdmFsdWU6ICIxMm0gMzRzIiwKICAgICAgc3RhdHVzOiAib2siLAogICAgICBzdGF0dXNUZXh0OiAiTm9ybWFsIGR1cmF0aW9uIgogICAgfQogIF0KfX0KICAgICAgICA+CiAgICAgICAgPC9kZWVzLWRhdGF2aWV3LXN0YXR1c29iamVjdD4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj5gOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWRhdGF2aWV3L2RlZXMtZGF0YXZpZXctc3RhdHVzb2JqZWN0L2RlZXMtZGF0YXZpZXctc3RhdHVzb2JqZWN0LmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTU2ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM1NyA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0RhdGF2aWV3U3RhdHVzb2JqZWN0ID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLWRhdGF2aWV3LXN0YXR1c29iamVjdCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3N0YXR1c09iamVjdF9kZWNvcmF0b3JzOwogIGxldCBfc3RhdHVzT2JqZWN0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc3RhdHVzT2JqZWN0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNEYXRhdmlld1N0YXR1c29iamVjdDIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9zdGF0dXNPYmplY3RfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTU2KHRoaXMsIG51bGwsIF9zdGF0dXNPYmplY3RfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic3RhdHVzT2JqZWN0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzdGF0dXNPYmplY3QiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc3RhdHVzT2JqZWN0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zdGF0dXNPYmplY3QgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc3RhdHVzT2JqZWN0X2luaXRpYWxpemVycywgX3N0YXR1c09iamVjdF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU2KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0RhdGF2aWV3U3RhdHVzb2JqZWN0MiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jMzk7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiRGF0YSBWaWV3Il07CiAgICAjc3RhdHVzT2JqZWN0X2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczU3KHRoaXMsIF9zdGF0dXNPYmplY3RfaW5pdGlhbGl6ZXJzLCB2b2lkIDApOwogICAgZ2V0IHN0YXR1c09iamVjdCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3N0YXR1c09iamVjdF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHN0YXR1c09iamVjdCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc3RhdHVzT2JqZWN0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsICdSb2JvdG8nLCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAubWFpbmJveCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSAzLjklKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggMCBoc2woMCAwJSAwJSAvIDAuMSksIDAgMXB4IDJweCAtMXB4IGhzbCgwIDAlIDAlIC8gMC4xKTsKICAgICAgICBtaW4taGVpZ2h0OiA0OHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk4JSkiKX07CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nIHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA0OHB4IGF1dG8gMTAwcHg7CiAgICAgICAgaGVpZ2h0OiA1NnB4OwogICAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTclKSIsICJoc2woMCAwJSA3JSkiKX07CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICB9CgogICAgICBoMSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luOiAwcHg7CiAgICAgICAgcGFkZGluZzogMHB4IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxNSUpIiwgImhzbCgwIDAlIDkzLjklKSIpfTsKICAgICAgfQoKICAgICAgLnN0YXR1c2RvdCB7CiAgICAgICAgaGVpZ2h0OiAxMHB4OwogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNjMuOSUpIiwgImhzbCgwIDAlIDQ1LjElKSIpfTsKICAgICAgICBtYXJnaW46IGF1dG87CiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgM3B4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA2My45JSAvIDAuMikiLCAiaHNsKDAgMCUgNDUuMSUgLyAwLjIpIil9OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5jb3B5TWFpbiB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODkuOCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDUuMSUpIiwgImhzbCgwIDAlIDYzLjklKSIpfTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5jb3B5TWFpbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk1LjElKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNzkuOCUpIiwgImhzbCgwIDAlIDIwLjklKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDE1JSkiLCAiaHNsKDAgMCUgOTMuOSUpIil9OwogICAgICB9CgogICAgICAuY29weU1haW46YWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTElKSIsICJoc2woMCAwJSAxNC45JSkiKX07CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk4KTsKICAgICAgfQoKICAgICAgLnN0YXR1c2RvdC5vayB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSkiLCAiaHNsKDE0Mi4xIDcwLjYlIDQ1LjMlKSIpfTsKICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSAvIDAuMikiLCAiaHNsKDE0Mi4xIDcwLjYlIDQ1LjMlIC8gMC4yKSIpfTsKICAgICAgfQoKICAgICAgLnN0YXR1c2RvdC5ub3Rfb2sgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA4NC4yJSA2MC4yJSkiLCAiaHNsKDAgNzIuMiUgNTAuNiUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgODQuMiUgNjAuMiUgLyAwLjIpIiwgImhzbCgwIDcyLjIlIDUwLjYlIC8gMC4yKSIpfTsKICAgICAgfQoKICAgICAgLnN0YXR1c2RvdC5wYXJ0bHlfb2sgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjUgOTUlIDUzJSkiLCAiaHNsKDI1IDk1JSA2MyUpIil9OwogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDI1IDk1JSA1MyUgLyAwLjIpIiwgImhzbCgyNSA5NSUgNjMlIC8gMC4yKSIpfTsKICAgICAgfQoKICAgICAgLmRldGFpbCB7CiAgICAgICAgbWluLWhlaWdodDogNjBweDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA0OHB4IGF1dG87CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NCUpIiwgImhzbCgwIDAlIDE0LjklKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2U7CiAgICAgICAgcGFkZGluZy1yaWdodDogMTZweDsKICAgICAgICBjdXJzb3I6IGNvbnRleHQtbWVudTsKICAgICAgfQoKICAgICAgLmRldGFpbDpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk3JSkiLCAiaHNsKDAgMCUgNyUpIil9OwogICAgICB9CgogICAgICAuZGV0YWlsOmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk1JSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICB9CgogICAgICAuZGV0YWlsIC5kZXRhaWxzVGV4dCB7CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgIH0KCiAgICAgIC5kZXRhaWwgLmRldGFpbHNUZXh0IC5sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA0NS4xJSkiLCAiaHNsKDAgMCUgNjMuOSUpIil9CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMnB4OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtOwogICAgICB9CgogICAgICAuZGV0YWlsIC5kZXRhaWxzVGV4dCAudmFsdWUgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LWZhbWlseTogJ0ludGVsIE9uZSBNb25vJywgJ0dlaXN0IE1vbm8nLCBtb25vc3BhY2U7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxNSUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJtYWluYm94Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXR1c2RvdCAke3RoaXMuc3RhdHVzT2JqZWN0Py5jb21iaW5lZFN0YXR1c30iPjwvZGl2PgogICAgICAgICAgPGgxPiR7dGhpcy5zdGF0dXNPYmplY3Q/Lm5hbWUgfHwgIk5vIHN0YXR1cyBvYmplY3QgYXNzaWduZWQifTwvaDE+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb3B5TWFpbiIgQGNsaWNrPSR7dGhpcy5oYW5kbGVDb3B5QXNKc29ufT5Db3B5IEpTT048L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICAke3RoaXMuc3RhdHVzT2JqZWN0Py5kZXRhaWxzPy5tYXAoKGRldGFpbEFyZykgPT4gewogICAgICAgIHJldHVybiBiMmAKICAgICAgICAgICAgPGRpdiAKICAgICAgICAgICAgICBjbGFzcz0iZGV0YWlsIgogICAgICAgICAgICAgIEBjb250ZXh0bWVudT0keyhldmVudCkgPT4gewogICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIERlZXNDb250ZXh0bWVudS5vcGVuQ29udGV4dE1lbnVXaXRoT3B0aW9ucyhldmVudCwgWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgbmFtZTogIkNvcHkgVmFsdWUiLAogICAgICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmNvcHkiLAogICAgICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb3B5VG9DbGlwYm9hcmQoZGV0YWlsQXJnLnZhbHVlLCAiVmFsdWUiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBuYW1lOiAiQ29weSBLZXkiLAogICAgICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmtleSIsCiAgICAgICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlUb0NsaXBib2FyZChkZXRhaWxBcmcubmFtZSwgIktleSIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgIG5hbWU6ICJDb3B5IEtleTpWYWx1ZSIsCiAgICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6Y29weS1wbHVzIiwKICAgICAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weVRvQ2xpcGJvYXJkKGAke2RldGFpbEFyZy5uYW1lfTogJHtkZXRhaWxBcmcudmFsdWV9YCwgIktleTpWYWx1ZSIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgXSk7CiAgICAgICAgfX0KICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXR1c2RvdCAke2RldGFpbEFyZy5zdGF0dXN9Ij48L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZXRhaWxzVGV4dCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+JHtkZXRhaWxBcmcubmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZhbHVlIj4ke2RldGFpbEFyZy52YWx1ZX08L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgOwogICAgICB9KX0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKCkgewogICAgfQogICAgYXN5bmMgY29weVRvQ2xpcGJvYXJkKHRleHQ5LCB0eXBlNSA9ICJUZXh0IikgewogICAgICB0cnkgewogICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQ5KTsKICAgICAgICBjb25zb2xlLmxvZyhgJHt0eXBlNX0gY29waWVkIHRvIGNsaXBib2FyZGApOwogICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY29weSAke3R5cGU1fTpgLCBlcnIpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBoYW5kbGVDb3B5QXNKc29uKCkgewogICAgICBpZiAoIXRoaXMuc3RhdHVzT2JqZWN0KQogICAgICAgIHJldHVybjsKICAgICAgdHJ5IHsKICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXR1c09iamVjdCwgbnVsbCwgMikpOwogICAgICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuY29weU1haW4iKTsKICAgICAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBidXR0b24udGV4dENvbnRlbnQ7CiAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gIkNvcGllZCEiOwogICAgICAgIGNvbnN0IGlzRGFyayA9ICF0aGlzLmdvQnJpZ2h0OwogICAgICAgIGJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kID0gaXNEYXJrID8gImhzbCgxNDIuMSA3MC42JSA0NS4zJSAvIDAuMSkiIDogImhzbCgxNDIuMSA3Ni4yJSAzNi4zJSAvIDAuMSkiOwogICAgICAgIGJ1dHRvbi5zdHlsZS5ib3JkZXJDb2xvciA9IGlzRGFyayA/ICJoc2woMTQyLjEgNzAuNiUgNDUuMyUpIiA6ICJoc2woMTQyLjEgNzYuMiUgMzYuMyUpIjsKICAgICAgICBidXR0b24uc3R5bGUuY29sb3IgPSBpc0RhcmsgPyAiaHNsKDE0Mi4xIDcwLjYlIDQ1LjMlKSIgOiAiaHNsKDE0Mi4xIDc2LjIlIDM2LjMlKSI7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICBidXR0b24udGV4dENvbnRlbnQgPSBvcmlnaW5hbFRleHQ7CiAgICAgICAgICBidXR0b24uc3R5bGUuYmFja2dyb3VuZCA9ICIiOwogICAgICAgICAgYnV0dG9uLnN0eWxlLmJvcmRlckNvbG9yID0gIiI7CiAgICAgICAgICBidXR0b24uc3R5bGUuY29sb3IgPSAiIjsKICAgICAgICB9LCAxNTAwKTsKICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGNvcHk6IiwgZXJyKTsKICAgICAgfQogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNTcodGhpcywgX3N0YXR1c09iamVjdF9leHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczU3KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzRGF0YXZpZXdTdGF0dXNvYmplY3QyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1kYXRhdmlldy9kZWVzLXN0b3JhZ2UtYnJvd3Nlci9kZWVzLXN0b3JhZ2UtYnJvd3Nlci5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBNb2NrU3RvcmFnZURhdGFQcm92aWRlciA9IGNsYXNzIHsKICBvYmplY3RzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBjb25zdHJ1Y3RvcigpIHsKICAgIGNvbnN0IG5vdzIgPSAoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCk7CiAgICB0aGlzLm9iamVjdHMuc2V0KCJkb2N1bWVudHMvcmVhZG1lLm1kIiwgewogICAgICBjb250ZW50OiBidG9hKCIjIFdlbGNvbWVcblxuVGhpcyBpcyBhIGRlbW8gU3RvcmFnZSBicm93c2VyLlxuIiksCiAgICAgIGNvbnRlbnRUeXBlOiAidGV4dC9tYXJrZG93biIsCiAgICAgIHNpemU6IDQyLAogICAgICBsYXN0TW9kaWZpZWQ6IG5vdzIKICAgIH0pOwogICAgdGhpcy5vYmplY3RzLnNldCgiZG9jdW1lbnRzL2NvbmZpZy5qc29uIiwgewogICAgICBjb250ZW50OiBidG9hKCd7XG4gICJuYW1lIjogImRlbW8iLFxuICAidmVyc2lvbiI6ICIxLjAuMCJcbn0nKSwKICAgICAgY29udGVudFR5cGU6ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgICAgc2l6ZTogNDgsCiAgICAgIGxhc3RNb2RpZmllZDogbm93MgogICAgfSk7CiAgICB0aGlzLm9iamVjdHMuc2V0KCJkb2N1bWVudHMvbm90ZXMvdG9kby50eHQiLCB7CiAgICAgIGNvbnRlbnQ6IGJ0b2EoIkJ1eSBtaWxrXG5GaXggYnVnICM0MlxuRGVwbG95IHRvIHByb2R1Y3Rpb24iKSwKICAgICAgY29udGVudFR5cGU6ICJ0ZXh0L3BsYWluIiwKICAgICAgc2l6ZTogNDUsCiAgICAgIGxhc3RNb2RpZmllZDogbm93MgogICAgfSk7CiAgICB0aGlzLm9iamVjdHMuc2V0KCJpbWFnZXMvbG9nby5wbmciLCB7CiAgICAgIGNvbnRlbnQ6IGJ0b2EoImZha2UtcG5nLWRhdGEiKSwKICAgICAgY29udGVudFR5cGU6ICJpbWFnZS9wbmciLAogICAgICBzaXplOiAyNDUwMCwKICAgICAgbGFzdE1vZGlmaWVkOiBub3cyCiAgICB9KTsKICAgIHRoaXMub2JqZWN0cy5zZXQoImltYWdlcy9iYW5uZXIuanBnIiwgewogICAgICBjb250ZW50OiBidG9hKCJmYWtlLWpwZy1kYXRhIiksCiAgICAgIGNvbnRlbnRUeXBlOiAiaW1hZ2UvanBlZyIsCiAgICAgIHNpemU6IDE1NmUzLAogICAgICBsYXN0TW9kaWZpZWQ6IG5vdzIKICAgIH0pOwogICAgdGhpcy5vYmplY3RzLnNldCgic2NyaXB0cy9kZXBsb3kuc2giLCB7CiAgICAgIGNvbnRlbnQ6IGJ0b2EoJyMhL2Jpbi9iYXNoXG5lY2hvICJEZXBsb3lpbmcuLi4iXG4nKSwKICAgICAgY29udGVudFR5cGU6ICJ0ZXh0L3BsYWluIiwKICAgICAgc2l6ZTogMzQsCiAgICAgIGxhc3RNb2RpZmllZDogbm93MgogICAgfSk7CiAgICB0aGlzLm9iamVjdHMuc2V0KCJpbmRleC5odG1sIiwgewogICAgICBjb250ZW50OiBidG9hKCI8IURPQ1RZUEUgaHRtbD5cbjxodG1sPlxuPGJvZHk+XG4gIDxoMT5IZWxsbyBXb3JsZDwvaDE+XG48L2JvZHk+XG48L2h0bWw+IiksCiAgICAgIGNvbnRlbnRUeXBlOiAidGV4dC9odG1sIiwKICAgICAgc2l6ZTogNzIsCiAgICAgIGxhc3RNb2RpZmllZDogbm93MgogICAgfSk7CiAgICB0aGlzLm9iamVjdHMuc2V0KCJzdHlsZXMuY3NzIiwgewogICAgICBjb250ZW50OiBidG9hKCJib2R5IHsgbWFyZ2luOiAwOyBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgfSIpLAogICAgICBjb250ZW50VHlwZTogInRleHQvY3NzIiwKICAgICAgc2l6ZTogNDQsCiAgICAgIGxhc3RNb2RpZmllZDogbm93MgogICAgfSk7CiAgfQogIGFzeW5jIGxpc3RPYmplY3RzKGJ1Y2tldCwgcHJlZml4NCwgZGVsaW1pdGVyKSB7CiAgICBjb25zdCBwZnggPSBwcmVmaXg0IHx8ICIiOwogICAgY29uc3Qgb2JqZWN0cyA9IFtdOwogICAgY29uc3QgcHJlZml4ZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgZm9yIChjb25zdCBba2V5MiwgZGF0YV0gb2YgdGhpcy5vYmplY3RzKSB7CiAgICAgIGlmICgha2V5Mi5zdGFydHNXaXRoKHBmeCkpCiAgICAgICAgY29udGludWU7CiAgICAgIGNvbnN0IHJlc3QgPSBrZXkyLnNsaWNlKHBmeC5sZW5ndGgpOwogICAgICBpZiAoZGVsaW1pdGVyKSB7CiAgICAgICAgY29uc3Qgc2xhc2hJbmRleCA9IHJlc3QuaW5kZXhPZihkZWxpbWl0ZXIpOwogICAgICAgIGlmIChzbGFzaEluZGV4ID49IDApIHsKICAgICAgICAgIHByZWZpeGVzLmFkZChwZnggKyByZXN0LnNsaWNlKDAsIHNsYXNoSW5kZXggKyAxKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG9iamVjdHMucHVzaCh7IGtleToga2V5Miwgc2l6ZTogZGF0YS5zaXplLCBsYXN0TW9kaWZpZWQ6IGRhdGEubGFzdE1vZGlmaWVkIH0pOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBvYmplY3RzLnB1c2goeyBrZXk6IGtleTIsIHNpemU6IGRhdGEuc2l6ZSwgbGFzdE1vZGlmaWVkOiBkYXRhLmxhc3RNb2RpZmllZCB9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHsgb2JqZWN0cywgcHJlZml4ZXM6IEFycmF5LmZyb20ocHJlZml4ZXMpLnNvcnQoKSB9OwogIH0KICBhc3luYyBnZXRPYmplY3QoYnVja2V0LCBrZXkyKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLm9iamVjdHMuZ2V0KGtleTIpOwogICAgaWYgKCFvYmopCiAgICAgIHRocm93IG5ldyBFcnJvcigiTm90IGZvdW5kIik7CiAgICByZXR1cm4geyAuLi5vYmogfTsKICB9CiAgYXN5bmMgcHV0T2JqZWN0KGJ1Y2tldCwga2V5MiwgYmFzZTY0Q29udGVudCwgY29udGVudFR5cGUpIHsKICAgIHRoaXMub2JqZWN0cy5zZXQoa2V5MiwgewogICAgICBjb250ZW50OiBiYXNlNjRDb250ZW50LAogICAgICBjb250ZW50VHlwZSwKICAgICAgc2l6ZTogYXRvYihiYXNlNjRDb250ZW50KS5sZW5ndGgsCiAgICAgIGxhc3RNb2RpZmllZDogKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpCiAgICB9KTsKICAgIHJldHVybiB0cnVlOwogIH0KICBhc3luYyBkZWxldGVPYmplY3QoYnVja2V0LCBrZXkyKSB7CiAgICByZXR1cm4gdGhpcy5vYmplY3RzLmRlbGV0ZShrZXkyKTsKICB9CiAgYXN5bmMgZGVsZXRlUHJlZml4KGJ1Y2tldCwgcHJlZml4NCkgewogICAgZm9yIChjb25zdCBrZXkyIG9mIHRoaXMub2JqZWN0cy5rZXlzKCkpIHsKICAgICAgaWYgKGtleTIuc3RhcnRzV2l0aChwcmVmaXg0KSkgewogICAgICAgIHRoaXMub2JqZWN0cy5kZWxldGUoa2V5Mik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBhc3luYyBnZXRPYmplY3RVcmwoYnVja2V0LCBrZXkyKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLm9iamVjdHMuZ2V0KGtleTIpOwogICAgaWYgKCFvYmopCiAgICAgIHJldHVybiAiIjsKICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbVWludDhBcnJheS5mcm9tKGF0b2Iob2JqLmNvbnRlbnQpLCAoYzExKSA9PiBjMTEuY2hhckNvZGVBdCgwKSldLCB7IHR5cGU6IG9iai5jb250ZW50VHlwZSB9KTsKICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogIH0KICBhc3luYyBtb3ZlT2JqZWN0KGJ1Y2tldCwgc291cmNlS2V5LCBkZXN0S2V5KSB7CiAgICBjb25zdCBvYmogPSB0aGlzLm9iamVjdHMuZ2V0KHNvdXJjZUtleSk7CiAgICBpZiAoIW9iaikKICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAiU291cmNlIG5vdCBmb3VuZCIgfTsKICAgIHRoaXMub2JqZWN0cy5zZXQoZGVzdEtleSwgeyAuLi5vYmosIGxhc3RNb2RpZmllZDogKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpIH0pOwogICAgdGhpcy5vYmplY3RzLmRlbGV0ZShzb3VyY2VLZXkpOwogICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9OwogIH0KICBhc3luYyBtb3ZlUHJlZml4KGJ1Y2tldCwgc291cmNlUHJlZml4LCBkZXN0UHJlZml4KSB7CiAgICBsZXQgY291bnQyID0gMDsKICAgIGNvbnN0IHRvTW92ZSA9IEFycmF5LmZyb20odGhpcy5vYmplY3RzLmVudHJpZXMoKSkuZmlsdGVyKChbazVdKSA9PiBrNS5zdGFydHNXaXRoKHNvdXJjZVByZWZpeCkpOwogICAgZm9yIChjb25zdCBba2V5MiwgZGF0YV0gb2YgdG9Nb3ZlKSB7CiAgICAgIGNvbnN0IG5ld0tleSA9IGRlc3RQcmVmaXggKyBrZXkyLnNsaWNlKHNvdXJjZVByZWZpeC5sZW5ndGgpOwogICAgICB0aGlzLm9iamVjdHMuc2V0KG5ld0tleSwgeyAuLi5kYXRhLCBsYXN0TW9kaWZpZWQ6ICgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKSB9KTsKICAgICAgdGhpcy5vYmplY3RzLmRlbGV0ZShrZXkyKTsKICAgICAgY291bnQyKys7CiAgICB9CiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBtb3ZlZENvdW50OiBjb3VudDIgfTsKICB9Cn07CnZhciBkZW1vRnVuYzQwID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgaGVpZ2h0OiA2MDBweDsKICAgICAgcGFkZGluZzogMTZweDsKICAgIH0KICA8L3N0eWxlPgogIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgIDxkZWVzLXN0b3JhZ2UtYnJvd3NlcgogICAgICAuZGF0YVByb3ZpZGVyPSR7bmV3IE1vY2tTdG9yYWdlRGF0YVByb3ZpZGVyKCl9CiAgICAgIC5idWNrZXROYW1lPSR7ImRlbW8tYnVja2V0In0KICAgID48L2RlZXMtc3RvcmFnZS1icm93c2VyPgogIDwvZGl2PgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWRhdGF2aWV3L2RlZXMtc3RvcmFnZS1icm93c2VyL3V0aWxpdGllcy5qcwpmdW5jdGlvbiBmb3JtYXRTaXplKGJ5dGVzKSB7CiAgaWYgKGJ5dGVzID09PSB2b2lkIDAgfHwgYnl0ZXMgPT09IG51bGwpCiAgICByZXR1cm4gIi0iOwogIGlmIChieXRlcyA9PT0gMCkKICAgIHJldHVybiAiMCBCIjsKICBjb25zdCB1bml0czMgPSBbIkIiLCAiS0IiLCAiTUIiLCAiR0IiLCAiVEIiXTsKICBsZXQgc2l6ZSA9IGJ5dGVzOwogIGxldCB1bml0SW5kZXggPSAwOwogIHdoaWxlIChzaXplID49IDEwMjQgJiYgdW5pdEluZGV4IDwgdW5pdHMzLmxlbmd0aCAtIDEpIHsKICAgIHNpemUgLz0gMTAyNDsKICAgIHVuaXRJbmRleCsrOwogIH0KICByZXR1cm4gYCR7c2l6ZS50b0ZpeGVkKHVuaXRJbmRleCA+IDAgPyAxIDogMCl9ICR7dW5pdHMzW3VuaXRJbmRleF19YDsKfQpmdW5jdGlvbiBmb3JtYXRDb3VudChjb3VudDIpIHsKICBpZiAoY291bnQyID09PSB2b2lkIDAgfHwgY291bnQyID09PSBudWxsKQogICAgcmV0dXJuICIiOwogIGlmIChjb3VudDIgPj0gMWU2KQogICAgcmV0dXJuIGAkeyhjb3VudDIgLyAxZTYpLnRvRml4ZWQoMSl9TWA7CiAgaWYgKGNvdW50MiA+PSAxZTMpCiAgICByZXR1cm4gYCR7KGNvdW50MiAvIDFlMykudG9GaXhlZCgxKX1LYDsKICByZXR1cm4gY291bnQyLnRvU3RyaW5nKCk7Cn0KZnVuY3Rpb24gZ2V0RmlsZU5hbWUocGF0aDIpIHsKICBjb25zdCBwYXJ0cyA9IHBhdGgyLnJlcGxhY2UoL1wvJC8sICIiKS5zcGxpdCgiLyIpOwogIHJldHVybiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSB8fCBwYXRoMjsKfQpmdW5jdGlvbiB2YWxpZGF0ZU1vdmUoc291cmNlS2V5LCBkZXN0UHJlZml4KSB7CiAgaWYgKHNvdXJjZUtleS5lbmRzV2l0aCgiLyIpKSB7CiAgICBpZiAoZGVzdFByZWZpeC5zdGFydHNXaXRoKHNvdXJjZUtleSkpIHsKICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogIkNhbm5vdCBtb3ZlIGEgZm9sZGVyIGludG8gaXRzZWxmIiB9OwogICAgfQogIH0KICBjb25zdCBzb3VyY2VQYXJlbnQgPSBnZXRQYXJlbnRQcmVmaXgoc291cmNlS2V5KTsKICBpZiAoc291cmNlUGFyZW50ID09PSBkZXN0UHJlZml4KSB7CiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAiSXRlbSBpcyBhbHJlYWR5IGluIHRoaXMgbG9jYXRpb24iIH07CiAgfQogIHJldHVybiB7IHZhbGlkOiB0cnVlIH07Cn0KZnVuY3Rpb24gZ2V0UGFyZW50UHJlZml4KGtleTIpIHsKICBjb25zdCB0cmltbWVkID0ga2V5Mi5lbmRzV2l0aCgiLyIpID8ga2V5Mi5zbGljZSgwLCAtMSkgOiBrZXkyOwogIGNvbnN0IGxhc3RTbGFzaCA9IHRyaW1tZWQubGFzdEluZGV4T2YoIi8iKTsKICByZXR1cm4gbGFzdFNsYXNoID49IDAgPyB0cmltbWVkLnN1YnN0cmluZygwLCBsYXN0U2xhc2ggKyAxKSA6ICIiOwp9CmZ1bmN0aW9uIGdldENvbnRlbnRUeXBlKGV4dCkgewogIGNvbnN0IGNvbnRlbnRUeXBlcyA9IHsKICAgIGpzb246ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgIHR4dDogInRleHQvcGxhaW4iLAogICAgaHRtbDogInRleHQvaHRtbCIsCiAgICBjc3M6ICJ0ZXh0L2NzcyIsCiAgICBqczogImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiLAogICAgdHM6ICJ0ZXh0L3R5cGVzY3JpcHQiLAogICAgbWQ6ICJ0ZXh0L21hcmtkb3duIiwKICAgIHhtbDogImFwcGxpY2F0aW9uL3htbCIsCiAgICB5YW1sOiAidGV4dC95YW1sIiwKICAgIHltbDogInRleHQveWFtbCIsCiAgICBjc3Y6ICJ0ZXh0L2NzdiIKICB9OwogIHJldHVybiBjb250ZW50VHlwZXNbZXh0XSB8fCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjsKfQpmdW5jdGlvbiBnZXREZWZhdWx0Q29udGVudChleHQpIHsKICBjb25zdCBkZWZhdWx0cyA9IHsKICAgIGpzb246ICJ7XG4gIFxufSIsCiAgICBodG1sOiAiPCFET0NUWVBFIGh0bWw+XG48aHRtbD5cbjxoZWFkPlxuICA8dGl0bGU+PC90aXRsZT5cbjwvaGVhZD5cbjxib2R5PlxuICBcbjwvYm9keT5cbjwvaHRtbD4iLAogICAgbWQ6ICIjIFRpdGxlXG5cbiIsCiAgICB0eHQ6ICIiCiAgfTsKICByZXR1cm4gZGVmYXVsdHNbZXh0XSB8fCAiIjsKfQpmdW5jdGlvbiBnZXRQYXRoU2VnbWVudHMocHJlZml4NCkgewogIGlmICghcHJlZml4NCkKICAgIHJldHVybiBbXTsKICBjb25zdCBwYXJ0cyA9IHByZWZpeDQuc3BsaXQoIi8iKS5maWx0ZXIoKHA4KSA9PiBwOCk7CiAgY29uc3Qgc2VnbWVudHMgPSBbXTsKICBsZXQgY3VtdWxhdGl2ZSA9ICIiOwogIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykgewogICAgY3VtdWxhdGl2ZSArPSBwYXJ0ICsgIi8iOwogICAgc2VnbWVudHMucHVzaChjdW11bGF0aXZlKTsKICB9CiAgcmV0dXJuIHNlZ21lbnRzOwp9CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZGF0YXZpZXcvZGVlcy1zdG9yYWdlLWJyb3dzZXIvZGVlcy1zdG9yYWdlLWNvbHVtbnMuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlNTcgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczU4ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzU3RvcmFnZUNvbHVtbnMgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtc3RvcmFnZS1jb2x1bW5zIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfZGF0YVByb3ZpZGVyX2RlY29yYXRvcnM7CiAgbGV0IF9kYXRhUHJvdmlkZXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kYXRhUHJvdmlkZXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2J1Y2tldE5hbWVfZGVjb3JhdG9yczsKICBsZXQgX2J1Y2tldE5hbWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9idWNrZXROYW1lX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50UHJlZml4X2RlY29yYXRvcnM7CiAgbGV0IF9jdXJyZW50UHJlZml4X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VycmVudFByZWZpeF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVmcmVzaEtleV9kZWNvcmF0b3JzOwogIGxldCBfcmVmcmVzaEtleV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlZnJlc2hLZXlfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbHVtbnNfZGVjb3JhdG9yczsKICBsZXQgX2NvbHVtbnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb2x1bW5zX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb2FkaW5nX2RlY29yYXRvcnM7CiAgbGV0IF9sb2FkaW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbG9hZGluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0NyZWF0ZURpYWxvZ19kZWNvcmF0b3JzOwogIGxldCBfc2hvd0NyZWF0ZURpYWxvZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dDcmVhdGVEaWFsb2dfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NyZWF0ZURpYWxvZ1R5cGVfZGVjb3JhdG9yczsKICBsZXQgX2NyZWF0ZURpYWxvZ1R5cGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jcmVhdGVEaWFsb2dUeXBlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jcmVhdGVEaWFsb2dQcmVmaXhfZGVjb3JhdG9yczsKICBsZXQgX2NyZWF0ZURpYWxvZ1ByZWZpeF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NyZWF0ZURpYWxvZ1ByZWZpeF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3JlYXRlRGlhbG9nTmFtZV9kZWNvcmF0b3JzOwogIGxldCBfY3JlYXRlRGlhbG9nTmFtZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NyZWF0ZURpYWxvZ05hbWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RyYWdPdmVyQ29sdW1uSW5kZXhfZGVjb3JhdG9yczsKICBsZXQgX2RyYWdPdmVyQ29sdW1uSW5kZXhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnT3ZlckNvbHVtbkluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnT3ZlckZvbGRlclByZWZpeF9kZWNvcmF0b3JzOwogIGxldCBfZHJhZ092ZXJGb2xkZXJQcmVmaXhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnT3ZlckZvbGRlclByZWZpeF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdXBsb2FkaW5nX2RlY29yYXRvcnM7CiAgbGV0IF91cGxvYWRpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF91cGxvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3VwbG9hZFByb2dyZXNzX2RlY29yYXRvcnM7CiAgbGV0IF91cGxvYWRQcm9ncmVzc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3VwbG9hZFByb2dyZXNzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93TW92ZURpYWxvZ19kZWNvcmF0b3JzOwogIGxldCBfc2hvd01vdmVEaWFsb2dfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93TW92ZURpYWxvZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW92ZVNvdXJjZV9kZWNvcmF0b3JzOwogIGxldCBfbW92ZVNvdXJjZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21vdmVTb3VyY2VfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21vdmVEZXN0aW5hdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfbW92ZURlc3RpbmF0aW9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW92ZURlc3RpbmF0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tb3ZlSW5Qcm9ncmVzc19kZWNvcmF0b3JzOwogIGxldCBfbW92ZUluUHJvZ3Jlc3NfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tb3ZlSW5Qcm9ncmVzc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW92ZUVycm9yX2RlY29yYXRvcnM7CiAgbGV0IF9tb3ZlRXJyb3JfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tb3ZlRXJyb3JfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dNb3ZlUGlja2VyRGlhbG9nX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93TW92ZVBpY2tlckRpYWxvZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dNb3ZlUGlja2VyRGlhbG9nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tb3ZlUGlja2VyU291cmNlX2RlY29yYXRvcnM7CiAgbGV0IF9tb3ZlUGlja2VyU291cmNlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW92ZVBpY2tlclNvdXJjZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW92ZVBpY2tlckN1cnJlbnRQcmVmaXhfZGVjb3JhdG9yczsKICBsZXQgX21vdmVQaWNrZXJDdXJyZW50UHJlZml4X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW92ZVBpY2tlckN1cnJlbnRQcmVmaXhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21vdmVQaWNrZXJQcmVmaXhlc19kZWNvcmF0b3JzOwogIGxldCBfbW92ZVBpY2tlclByZWZpeGVzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW92ZVBpY2tlclByZWZpeGVzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tb3ZlUGlja2VyTG9hZGluZ19kZWNvcmF0b3JzOwogIGxldCBfbW92ZVBpY2tlckxvYWRpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tb3ZlUGlja2VyTG9hZGluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1JlbmFtZURpYWxvZ19kZWNvcmF0b3JzOwogIGxldCBfc2hvd1JlbmFtZURpYWxvZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dSZW5hbWVEaWFsb2dfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlbmFtZVNvdXJjZV9kZWNvcmF0b3JzOwogIGxldCBfcmVuYW1lU291cmNlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVuYW1lU291cmNlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZW5hbWVOYW1lX2RlY29yYXRvcnM7CiAgbGV0IF9yZW5hbWVOYW1lX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVuYW1lTmFtZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVuYW1lSW5Qcm9ncmVzc19kZWNvcmF0b3JzOwogIGxldCBfcmVuYW1lSW5Qcm9ncmVzc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlbmFtZUluUHJvZ3Jlc3NfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlbmFtZUVycm9yX2RlY29yYXRvcnM7CiAgbGV0IF9yZW5hbWVFcnJvcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlbmFtZUVycm9yX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnZ2VkSXRlbV9kZWNvcmF0b3JzOwogIGxldCBfZHJhZ2dlZEl0ZW1faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kcmFnZ2VkSXRlbV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzU3RvcmFnZUNvbHVtbnMyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfZGF0YVByb3ZpZGVyX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBPYmplY3QgfSldOwogICAgICBfYnVja2V0TmFtZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2N1cnJlbnRQcmVmaXhfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9yZWZyZXNoS2V5X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfY29sdW1uc19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfbG9hZGluZ19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfc2hvd0NyZWF0ZURpYWxvZ19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfY3JlYXRlRGlhbG9nVHlwZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfY3JlYXRlRGlhbG9nUHJlZml4X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9jcmVhdGVEaWFsb2dOYW1lX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9kcmFnT3ZlckNvbHVtbkluZGV4X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9kcmFnT3ZlckZvbGRlclByZWZpeF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfdXBsb2FkaW5nX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF91cGxvYWRQcm9ncmVzc19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfc2hvd01vdmVEaWFsb2dfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX21vdmVTb3VyY2VfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX21vdmVEZXN0aW5hdGlvbl9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfbW92ZUluUHJvZ3Jlc3NfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX21vdmVFcnJvcl9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfc2hvd01vdmVQaWNrZXJEaWFsb2dfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX21vdmVQaWNrZXJTb3VyY2VfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX21vdmVQaWNrZXJDdXJyZW50UHJlZml4X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9tb3ZlUGlja2VyUHJlZml4ZXNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX21vdmVQaWNrZXJMb2FkaW5nX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9zaG93UmVuYW1lRGlhbG9nX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9yZW5hbWVTb3VyY2VfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3JlbmFtZU5hbWVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3JlbmFtZUluUHJvZ3Jlc3NfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3JlbmFtZUVycm9yX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9kcmFnZ2VkSXRlbV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGU1Nyh0aGlzLCBudWxsLCBfZGF0YVByb3ZpZGVyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImRhdGFQcm92aWRlciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZGF0YVByb3ZpZGVyIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRhdGFQcm92aWRlciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZGF0YVByb3ZpZGVyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2RhdGFQcm92aWRlcl9pbml0aWFsaXplcnMsIF9kYXRhUHJvdmlkZXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nyh0aGlzLCBudWxsLCBfYnVja2V0TmFtZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJidWNrZXROYW1lIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJidWNrZXROYW1lIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmJ1Y2tldE5hbWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmJ1Y2tldE5hbWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYnVja2V0TmFtZV9pbml0aWFsaXplcnMsIF9idWNrZXROYW1lX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTcodGhpcywgbnVsbCwgX2N1cnJlbnRQcmVmaXhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY3VycmVudFByZWZpeCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3VycmVudFByZWZpeCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jdXJyZW50UHJlZml4LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jdXJyZW50UHJlZml4ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2N1cnJlbnRQcmVmaXhfaW5pdGlhbGl6ZXJzLCBfY3VycmVudFByZWZpeF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU3KHRoaXMsIG51bGwsIF9yZWZyZXNoS2V5X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJlZnJlc2hLZXkiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInJlZnJlc2hLZXkiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucmVmcmVzaEtleSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucmVmcmVzaEtleSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9yZWZyZXNoS2V5X2luaXRpYWxpemVycywgX3JlZnJlc2hLZXlfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nyh0aGlzLCBudWxsLCBfY29sdW1uc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb2x1bW5zIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb2x1bW5zIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNvbHVtbnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvbHVtbnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29sdW1uc19pbml0aWFsaXplcnMsIF9jb2x1bW5zX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTcodGhpcywgbnVsbCwgX2xvYWRpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibG9hZGluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibG9hZGluZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sb2FkaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5sb2FkaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xvYWRpbmdfaW5pdGlhbGl6ZXJzLCBfbG9hZGluZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU3KHRoaXMsIG51bGwsIF9zaG93Q3JlYXRlRGlhbG9nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dDcmVhdGVEaWFsb2ciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNob3dDcmVhdGVEaWFsb2ciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2hvd0NyZWF0ZURpYWxvZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd0NyZWF0ZURpYWxvZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93Q3JlYXRlRGlhbG9nX2luaXRpYWxpemVycywgX3Nob3dDcmVhdGVEaWFsb2dfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nyh0aGlzLCBudWxsLCBfY3JlYXRlRGlhbG9nVHlwZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjcmVhdGVEaWFsb2dUeXBlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjcmVhdGVEaWFsb2dUeXBlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNyZWF0ZURpYWxvZ1R5cGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNyZWF0ZURpYWxvZ1R5cGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY3JlYXRlRGlhbG9nVHlwZV9pbml0aWFsaXplcnMsIF9jcmVhdGVEaWFsb2dUeXBlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTcodGhpcywgbnVsbCwgX2NyZWF0ZURpYWxvZ1ByZWZpeF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjcmVhdGVEaWFsb2dQcmVmaXgiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNyZWF0ZURpYWxvZ1ByZWZpeCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jcmVhdGVEaWFsb2dQcmVmaXgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNyZWF0ZURpYWxvZ1ByZWZpeCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jcmVhdGVEaWFsb2dQcmVmaXhfaW5pdGlhbGl6ZXJzLCBfY3JlYXRlRGlhbG9nUHJlZml4X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTcodGhpcywgbnVsbCwgX2NyZWF0ZURpYWxvZ05hbWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY3JlYXRlRGlhbG9nTmFtZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3JlYXRlRGlhbG9nTmFtZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jcmVhdGVEaWFsb2dOYW1lLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jcmVhdGVEaWFsb2dOYW1lID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NyZWF0ZURpYWxvZ05hbWVfaW5pdGlhbGl6ZXJzLCBfY3JlYXRlRGlhbG9nTmFtZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU3KHRoaXMsIG51bGwsIF9kcmFnT3ZlckNvbHVtbkluZGV4X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImRyYWdPdmVyQ29sdW1uSW5kZXgiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRyYWdPdmVyQ29sdW1uSW5kZXgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZHJhZ092ZXJDb2x1bW5JbmRleCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZHJhZ092ZXJDb2x1bW5JbmRleCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kcmFnT3ZlckNvbHVtbkluZGV4X2luaXRpYWxpemVycywgX2RyYWdPdmVyQ29sdW1uSW5kZXhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nyh0aGlzLCBudWxsLCBfZHJhZ092ZXJGb2xkZXJQcmVmaXhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZHJhZ092ZXJGb2xkZXJQcmVmaXgiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRyYWdPdmVyRm9sZGVyUHJlZml4IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRyYWdPdmVyRm9sZGVyUHJlZml4LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kcmFnT3ZlckZvbGRlclByZWZpeCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kcmFnT3ZlckZvbGRlclByZWZpeF9pbml0aWFsaXplcnMsIF9kcmFnT3ZlckZvbGRlclByZWZpeF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU3KHRoaXMsIG51bGwsIF91cGxvYWRpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidXBsb2FkaW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ1cGxvYWRpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudXBsb2FkaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai51cGxvYWRpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdXBsb2FkaW5nX2luaXRpYWxpemVycywgX3VwbG9hZGluZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU3KHRoaXMsIG51bGwsIF91cGxvYWRQcm9ncmVzc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ1cGxvYWRQcm9ncmVzcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidXBsb2FkUHJvZ3Jlc3MiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudXBsb2FkUHJvZ3Jlc3MsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnVwbG9hZFByb2dyZXNzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3VwbG9hZFByb2dyZXNzX2luaXRpYWxpemVycywgX3VwbG9hZFByb2dyZXNzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTcodGhpcywgbnVsbCwgX3Nob3dNb3ZlRGlhbG9nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dNb3ZlRGlhbG9nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93TW92ZURpYWxvZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93TW92ZURpYWxvZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd01vdmVEaWFsb2cgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd01vdmVEaWFsb2dfaW5pdGlhbGl6ZXJzLCBfc2hvd01vdmVEaWFsb2dfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nyh0aGlzLCBudWxsLCBfbW92ZVNvdXJjZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtb3ZlU291cmNlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtb3ZlU291cmNlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1vdmVTb3VyY2UsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1vdmVTb3VyY2UgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbW92ZVNvdXJjZV9pbml0aWFsaXplcnMsIF9tb3ZlU291cmNlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTcodGhpcywgbnVsbCwgX21vdmVEZXN0aW5hdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtb3ZlRGVzdGluYXRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1vdmVEZXN0aW5hdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tb3ZlRGVzdGluYXRpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1vdmVEZXN0aW5hdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tb3ZlRGVzdGluYXRpb25faW5pdGlhbGl6ZXJzLCBfbW92ZURlc3RpbmF0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTcodGhpcywgbnVsbCwgX21vdmVJblByb2dyZXNzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1vdmVJblByb2dyZXNzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtb3ZlSW5Qcm9ncmVzcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tb3ZlSW5Qcm9ncmVzcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubW92ZUluUHJvZ3Jlc3MgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbW92ZUluUHJvZ3Jlc3NfaW5pdGlhbGl6ZXJzLCBfbW92ZUluUHJvZ3Jlc3NfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nyh0aGlzLCBudWxsLCBfbW92ZUVycm9yX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1vdmVFcnJvciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibW92ZUVycm9yIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1vdmVFcnJvciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubW92ZUVycm9yID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21vdmVFcnJvcl9pbml0aWFsaXplcnMsIF9tb3ZlRXJyb3JfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nyh0aGlzLCBudWxsLCBfc2hvd01vdmVQaWNrZXJEaWFsb2dfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2hvd01vdmVQaWNrZXJEaWFsb2ciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNob3dNb3ZlUGlja2VyRGlhbG9nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dNb3ZlUGlja2VyRGlhbG9nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaG93TW92ZVBpY2tlckRpYWxvZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93TW92ZVBpY2tlckRpYWxvZ19pbml0aWFsaXplcnMsIF9zaG93TW92ZVBpY2tlckRpYWxvZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU3KHRoaXMsIG51bGwsIF9tb3ZlUGlja2VyU291cmNlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1vdmVQaWNrZXJTb3VyY2UiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1vdmVQaWNrZXJTb3VyY2UiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubW92ZVBpY2tlclNvdXJjZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubW92ZVBpY2tlclNvdXJjZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tb3ZlUGlja2VyU291cmNlX2luaXRpYWxpemVycywgX21vdmVQaWNrZXJTb3VyY2VfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nyh0aGlzLCBudWxsLCBfbW92ZVBpY2tlckN1cnJlbnRQcmVmaXhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibW92ZVBpY2tlckN1cnJlbnRQcmVmaXgiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1vdmVQaWNrZXJDdXJyZW50UHJlZml4IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1vdmVQaWNrZXJDdXJyZW50UHJlZml4LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tb3ZlUGlja2VyQ3VycmVudFByZWZpeCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tb3ZlUGlja2VyQ3VycmVudFByZWZpeF9pbml0aWFsaXplcnMsIF9tb3ZlUGlja2VyQ3VycmVudFByZWZpeF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU3KHRoaXMsIG51bGwsIF9tb3ZlUGlja2VyUHJlZml4ZXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibW92ZVBpY2tlclByZWZpeGVzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtb3ZlUGlja2VyUHJlZml4ZXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubW92ZVBpY2tlclByZWZpeGVzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tb3ZlUGlja2VyUHJlZml4ZXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbW92ZVBpY2tlclByZWZpeGVzX2luaXRpYWxpemVycywgX21vdmVQaWNrZXJQcmVmaXhlc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU3KHRoaXMsIG51bGwsIF9tb3ZlUGlja2VyTG9hZGluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtb3ZlUGlja2VyTG9hZGluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibW92ZVBpY2tlckxvYWRpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubW92ZVBpY2tlckxvYWRpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1vdmVQaWNrZXJMb2FkaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21vdmVQaWNrZXJMb2FkaW5nX2luaXRpYWxpemVycywgX21vdmVQaWNrZXJMb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTcodGhpcywgbnVsbCwgX3Nob3dSZW5hbWVEaWFsb2dfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2hvd1JlbmFtZURpYWxvZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd1JlbmFtZURpYWxvZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93UmVuYW1lRGlhbG9nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaG93UmVuYW1lRGlhbG9nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dSZW5hbWVEaWFsb2dfaW5pdGlhbGl6ZXJzLCBfc2hvd1JlbmFtZURpYWxvZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU3KHRoaXMsIG51bGwsIF9yZW5hbWVTb3VyY2VfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicmVuYW1lU291cmNlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJyZW5hbWVTb3VyY2UiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucmVuYW1lU291cmNlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yZW5hbWVTb3VyY2UgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcmVuYW1lU291cmNlX2luaXRpYWxpemVycywgX3JlbmFtZVNvdXJjZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU3KHRoaXMsIG51bGwsIF9yZW5hbWVOYW1lX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJlbmFtZU5hbWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInJlbmFtZU5hbWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucmVuYW1lTmFtZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucmVuYW1lTmFtZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9yZW5hbWVOYW1lX2luaXRpYWxpemVycywgX3JlbmFtZU5hbWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nyh0aGlzLCBudWxsLCBfcmVuYW1lSW5Qcm9ncmVzc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJyZW5hbWVJblByb2dyZXNzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJyZW5hbWVJblByb2dyZXNzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJlbmFtZUluUHJvZ3Jlc3MsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnJlbmFtZUluUHJvZ3Jlc3MgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcmVuYW1lSW5Qcm9ncmVzc19pbml0aWFsaXplcnMsIF9yZW5hbWVJblByb2dyZXNzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTcodGhpcywgbnVsbCwgX3JlbmFtZUVycm9yX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJlbmFtZUVycm9yIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJyZW5hbWVFcnJvciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5yZW5hbWVFcnJvciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucmVuYW1lRXJyb3IgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcmVuYW1lRXJyb3JfaW5pdGlhbGl6ZXJzLCBfcmVuYW1lRXJyb3JfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1Nyh0aGlzLCBudWxsLCBfZHJhZ2dlZEl0ZW1fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZHJhZ2dlZEl0ZW0iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRyYWdnZWRJdGVtIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRyYWdnZWRJdGVtLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kcmFnZ2VkSXRlbSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kcmFnZ2VkSXRlbV9pbml0aWFsaXplcnMsIF9kcmFnZ2VkSXRlbV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU3KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1N0b3JhZ2VDb2x1bW5zMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAjZGF0YVByb3ZpZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9kYXRhUHJvdmlkZXJfaW5pdGlhbGl6ZXJzLCBudWxsKTsKICAgIGdldCBkYXRhUHJvdmlkZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNkYXRhUHJvdmlkZXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkYXRhUHJvdmlkZXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI2RhdGFQcm92aWRlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2J1Y2tldE5hbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9kYXRhUHJvdmlkZXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9idWNrZXROYW1lX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBidWNrZXROYW1lKCkgewogICAgICByZXR1cm4gdGhpcy4jYnVja2V0TmFtZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGJ1Y2tldE5hbWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2J1Y2tldE5hbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjdXJyZW50UHJlZml4X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfYnVja2V0TmFtZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX2N1cnJlbnRQcmVmaXhfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGN1cnJlbnRQcmVmaXgoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjdXJyZW50UHJlZml4X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY3VycmVudFByZWZpeCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY3VycmVudFByZWZpeF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3JlZnJlc2hLZXlfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9jdXJyZW50UHJlZml4X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfcmVmcmVzaEtleV9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCByZWZyZXNoS2V5KCkgewogICAgICByZXR1cm4gdGhpcy4jcmVmcmVzaEtleV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHJlZnJlc2hLZXkodmFsdWUyKSB7CiAgICAgIHRoaXMuI3JlZnJlc2hLZXlfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjb2x1bW5zX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfcmVmcmVzaEtleV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX2NvbHVtbnNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IGNvbHVtbnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb2x1bW5zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29sdW1ucyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29sdW1uc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9jb2x1bW5zX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfbG9hZGluZ19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgbG9hZGluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsb2FkaW5nKHZhbHVlMikgewogICAgICB0aGlzLiNsb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd0NyZWF0ZURpYWxvZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX2xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9zaG93Q3JlYXRlRGlhbG9nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBzaG93Q3JlYXRlRGlhbG9nKCkgewogICAgICByZXR1cm4gdGhpcy4jc2hvd0NyZWF0ZURpYWxvZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dDcmVhdGVEaWFsb2codmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dDcmVhdGVEaWFsb2dfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjcmVhdGVEaWFsb2dUeXBlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfc2hvd0NyZWF0ZURpYWxvZ19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX2NyZWF0ZURpYWxvZ1R5cGVfaW5pdGlhbGl6ZXJzLCAiZm9sZGVyIikpOwogICAgZ2V0IGNyZWF0ZURpYWxvZ1R5cGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjcmVhdGVEaWFsb2dUeXBlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY3JlYXRlRGlhbG9nVHlwZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY3JlYXRlRGlhbG9nVHlwZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NyZWF0ZURpYWxvZ1ByZWZpeF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX2NyZWF0ZURpYWxvZ1R5cGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9jcmVhdGVEaWFsb2dQcmVmaXhfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGNyZWF0ZURpYWxvZ1ByZWZpeCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NyZWF0ZURpYWxvZ1ByZWZpeF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNyZWF0ZURpYWxvZ1ByZWZpeCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY3JlYXRlRGlhbG9nUHJlZml4X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY3JlYXRlRGlhbG9nTmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX2NyZWF0ZURpYWxvZ1ByZWZpeF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX2NyZWF0ZURpYWxvZ05hbWVfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGNyZWF0ZURpYWxvZ05hbWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjcmVhdGVEaWFsb2dOYW1lX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY3JlYXRlRGlhbG9nTmFtZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY3JlYXRlRGlhbG9nTmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2RyYWdPdmVyQ29sdW1uSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9jcmVhdGVEaWFsb2dOYW1lX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfZHJhZ092ZXJDb2x1bW5JbmRleF9pbml0aWFsaXplcnMsIC0xKSk7CiAgICBnZXQgZHJhZ092ZXJDb2x1bW5JbmRleCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2RyYWdPdmVyQ29sdW1uSW5kZXhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkcmFnT3ZlckNvbHVtbkluZGV4KHZhbHVlMikgewogICAgICB0aGlzLiNkcmFnT3ZlckNvbHVtbkluZGV4X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZHJhZ092ZXJGb2xkZXJQcmVmaXhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9kcmFnT3ZlckNvbHVtbkluZGV4X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfZHJhZ092ZXJGb2xkZXJQcmVmaXhfaW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICBnZXQgZHJhZ092ZXJGb2xkZXJQcmVmaXgoKSB7CiAgICAgIHJldHVybiB0aGlzLiNkcmFnT3ZlckZvbGRlclByZWZpeF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGRyYWdPdmVyRm9sZGVyUHJlZml4KHZhbHVlMikgewogICAgICB0aGlzLiNkcmFnT3ZlckZvbGRlclByZWZpeF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3VwbG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX2RyYWdPdmVyRm9sZGVyUHJlZml4X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfdXBsb2FkaW5nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCB1cGxvYWRpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiN1cGxvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB1cGxvYWRpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI3VwbG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3VwbG9hZFByb2dyZXNzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfdXBsb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfdXBsb2FkUHJvZ3Jlc3NfaW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICBnZXQgdXBsb2FkUHJvZ3Jlc3MoKSB7CiAgICAgIHJldHVybiB0aGlzLiN1cGxvYWRQcm9ncmVzc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHVwbG9hZFByb2dyZXNzKHZhbHVlMikgewogICAgICB0aGlzLiN1cGxvYWRQcm9ncmVzc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dNb3ZlRGlhbG9nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfdXBsb2FkUHJvZ3Jlc3NfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9zaG93TW92ZURpYWxvZ19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICAvLyBNb3ZlIGRpYWxvZyBzdGF0ZQogICAgZ2V0IHNob3dNb3ZlRGlhbG9nKCkgewogICAgICByZXR1cm4gdGhpcy4jc2hvd01vdmVEaWFsb2dfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93TW92ZURpYWxvZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2hvd01vdmVEaWFsb2dfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtb3ZlU291cmNlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfc2hvd01vdmVEaWFsb2dfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9tb3ZlU291cmNlX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IG1vdmVTb3VyY2UoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtb3ZlU291cmNlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbW92ZVNvdXJjZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbW92ZVNvdXJjZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21vdmVEZXN0aW5hdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX21vdmVTb3VyY2VfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9tb3ZlRGVzdGluYXRpb25faW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IG1vdmVEZXN0aW5hdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI21vdmVEZXN0aW5hdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1vdmVEZXN0aW5hdGlvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jbW92ZURlc3RpbmF0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbW92ZUluUHJvZ3Jlc3NfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9tb3ZlRGVzdGluYXRpb25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9tb3ZlSW5Qcm9ncmVzc19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgbW92ZUluUHJvZ3Jlc3MoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtb3ZlSW5Qcm9ncmVzc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1vdmVJblByb2dyZXNzKHZhbHVlMikgewogICAgICB0aGlzLiNtb3ZlSW5Qcm9ncmVzc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21vdmVFcnJvcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX21vdmVJblByb2dyZXNzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfbW92ZUVycm9yX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IG1vdmVFcnJvcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI21vdmVFcnJvcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1vdmVFcnJvcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jbW92ZUVycm9yX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd01vdmVQaWNrZXJEaWFsb2dfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9tb3ZlRXJyb3JfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9zaG93TW92ZVBpY2tlckRpYWxvZ19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICAvLyBNb3ZlIHBpY2tlciBkaWFsb2cgc3RhdGUKICAgIGdldCBzaG93TW92ZVBpY2tlckRpYWxvZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dNb3ZlUGlja2VyRGlhbG9nX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd01vdmVQaWNrZXJEaWFsb2codmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dNb3ZlUGlja2VyRGlhbG9nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbW92ZVBpY2tlclNvdXJjZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX3Nob3dNb3ZlUGlja2VyRGlhbG9nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfbW92ZVBpY2tlclNvdXJjZV9pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIGdldCBtb3ZlUGlja2VyU291cmNlKCkgewogICAgICByZXR1cm4gdGhpcy4jbW92ZVBpY2tlclNvdXJjZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1vdmVQaWNrZXJTb3VyY2UodmFsdWUyKSB7CiAgICAgIHRoaXMuI21vdmVQaWNrZXJTb3VyY2VfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtb3ZlUGlja2VyQ3VycmVudFByZWZpeF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX21vdmVQaWNrZXJTb3VyY2VfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9tb3ZlUGlja2VyQ3VycmVudFByZWZpeF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgbW92ZVBpY2tlckN1cnJlbnRQcmVmaXgoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtb3ZlUGlja2VyQ3VycmVudFByZWZpeF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1vdmVQaWNrZXJDdXJyZW50UHJlZml4KHZhbHVlMikgewogICAgICB0aGlzLiNtb3ZlUGlja2VyQ3VycmVudFByZWZpeF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21vdmVQaWNrZXJQcmVmaXhlc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX21vdmVQaWNrZXJDdXJyZW50UHJlZml4X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfbW92ZVBpY2tlclByZWZpeGVzX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBtb3ZlUGlja2VyUHJlZml4ZXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtb3ZlUGlja2VyUHJlZml4ZXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtb3ZlUGlja2VyUHJlZml4ZXModmFsdWUyKSB7CiAgICAgIHRoaXMuI21vdmVQaWNrZXJQcmVmaXhlc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21vdmVQaWNrZXJMb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfbW92ZVBpY2tlclByZWZpeGVzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfbW92ZVBpY2tlckxvYWRpbmdfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IG1vdmVQaWNrZXJMb2FkaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jbW92ZVBpY2tlckxvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtb3ZlUGlja2VyTG9hZGluZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbW92ZVBpY2tlckxvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93UmVuYW1lRGlhbG9nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfbW92ZVBpY2tlckxvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9zaG93UmVuYW1lRGlhbG9nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIC8vIFJlbmFtZSBkaWFsb2cgc3RhdGUKICAgIGdldCBzaG93UmVuYW1lRGlhbG9nKCkgewogICAgICByZXR1cm4gdGhpcy4jc2hvd1JlbmFtZURpYWxvZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dSZW5hbWVEaWFsb2codmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dSZW5hbWVEaWFsb2dfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNyZW5hbWVTb3VyY2VfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9zaG93UmVuYW1lRGlhbG9nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfcmVuYW1lU291cmNlX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IHJlbmFtZVNvdXJjZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3JlbmFtZVNvdXJjZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHJlbmFtZVNvdXJjZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcmVuYW1lU291cmNlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcmVuYW1lTmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX3JlbmFtZVNvdXJjZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTgodGhpcywgX3JlbmFtZU5hbWVfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IHJlbmFtZU5hbWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNyZW5hbWVOYW1lX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcmVuYW1lTmFtZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcmVuYW1lTmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3JlbmFtZUluUHJvZ3Jlc3NfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9yZW5hbWVOYW1lX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfcmVuYW1lSW5Qcm9ncmVzc19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgcmVuYW1lSW5Qcm9ncmVzcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3JlbmFtZUluUHJvZ3Jlc3NfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCByZW5hbWVJblByb2dyZXNzKHZhbHVlMikgewogICAgICB0aGlzLiNyZW5hbWVJblByb2dyZXNzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcmVuYW1lRXJyb3JfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9yZW5hbWVJblByb2dyZXNzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfcmVuYW1lRXJyb3JfaW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICBnZXQgcmVuYW1lRXJyb3IoKSB7CiAgICAgIHJldHVybiB0aGlzLiNyZW5hbWVFcnJvcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHJlbmFtZUVycm9yKHZhbHVlMikgewogICAgICB0aGlzLiNyZW5hbWVFcnJvcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2RyYWdnZWRJdGVtX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OCh0aGlzLCBfcmVuYW1lRXJyb3JfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9kcmFnZ2VkSXRlbV9pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIC8vIEludGVybmFsIGRyYWcgc3RhdGUKICAgIGdldCBkcmFnZ2VkSXRlbSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2RyYWdnZWRJdGVtX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZHJhZ2dlZEl0ZW0odmFsdWUyKSB7CiAgICAgIHRoaXMuI2RyYWdnZWRJdGVtX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICByZXNpemluZyA9IChfX3J1bkluaXRpYWxpemVyczU4KHRoaXMsIF9kcmFnZ2VkSXRlbV9leHRyYUluaXRpYWxpemVycyksIG51bGwpOwogICAgREVGQVVMVF9DT0xVTU5fV0lEVEggPSAyNTA7CiAgICBNSU5fQ09MVU1OX1dJRFRIID0gMTUwOwogICAgTUFYX0NPTFVNTl9XSURUSCA9IDUwMDsKICAgIGRyYWdDb3VudGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBmb2xkZXJIb3ZlclRpbWVyID0gbnVsbDsKICAgIGZpbGVJbnB1dEVsZW1lbnQgPSBudWxsOwogICAgZm9sZGVySW5wdXRFbGVtZW50ID0gbnVsbDsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteTogaGlkZGVuOwogICAgICB9CgogICAgICAuY29sdW1ucy1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG1pbi13aWR0aDogbWF4LWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIC5jb2x1bW4td3JhcHBlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5jb2x1bW4gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5yZXNpemUtaGFuZGxlIHsKICAgICAgICB3aWR0aDogNXB4OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBjdXJzb3I6IGNvbC1yZXNpemU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAucmVzaXplLWhhbmRsZTo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMnB4OwogICAgICAgIHdpZHRoOiAxcHg7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzMzMiKX07CiAgICAgIH0KCiAgICAgIC5yZXNpemUtaGFuZGxlOmhvdmVyOjphZnRlciwKICAgICAgLnJlc2l6ZS1oYW5kbGUuYWN0aXZlOjphZnRlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNhMWExYWEiLCAiIzQwNDA0MCIpfTsKICAgICAgICB3aWR0aDogMnB4OwogICAgICAgIGxlZnQ6IDFweDsKICAgICAgfQoKICAgICAgLmNvbHVtbi13cmFwcGVyOmxhc3QtY2hpbGQgLnJlc2l6ZS1oYW5kbGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5jb2x1bW4taGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiIzY2NiIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjAyKSIsICJyZ2JhKDAsIDAsIDAsIDAuMikiKX07CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzMzMiKX07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CgogICAgICAuY29sdW1uLWl0ZW1zIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CgogICAgICAuY29sdW1uLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXM7CiAgICAgIH0KCiAgICAgIC5jb2x1bW4taXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wNCkiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSIpfTsKICAgICAgfQoKICAgICAgLmNvbHVtbi1pdGVtLnNlbGVjdGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSg1OSwgMTMwLCAyNDYsIDAuMSkiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzFkNGVkOCIsICIjZTBlMGUwIil9OwogICAgICB9CgogICAgICAuY29sdW1uLWl0ZW0uZm9sZGVyIHsKICAgICAgICBjb2xvcjogI2ZiYmYyNDsKICAgICAgfQoKICAgICAgLmNvbHVtbi1pdGVtIC5pY29uIHsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5jb2x1bW4taXRlbSAubmFtZSB7CiAgICAgICAgZmxleDogMTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KCiAgICAgIC5jb2x1bW4taXRlbSAuY2hldnJvbiB7CiAgICAgICAgd2lkdGg6IDE0cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Q0ZDRkOCIsICIjNTU1Iil9OwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUgewogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ExYTFhYSIsICIjNjY2Iil9OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgLmxvYWRpbmcgewogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ExYTFhYSIsICIjNjY2Iil9OwogICAgICB9CgogICAgICAuY29sdW1uLmRyYWctb3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSg1OSwgMTMwLCAyNDYsIDAuMDgpOwogICAgICAgIG91dGxpbmU6IDJweCBkYXNoZWQgcmdiYSg1OSwgMTMwLCAyNDYsIDAuNCk7CiAgICAgICAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7CiAgICAgIH0KCiAgICAgIC5jb2x1bW4taXRlbS5mb2xkZXIuZHJhZy10YXJnZXQgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoNTksIDEzMCwgMjQ2LCAwLjIpICFpbXBvcnRhbnQ7CiAgICAgICAgb3V0bGluZTogMXB4IHNvbGlkIHJnYmEoNTksIDEzMCwgMjQ2LCAwLjUpOwogICAgICB9CgogICAgICAudXBsb2FkLW92ZXJsYXkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHotaW5kZXg6IDEwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgfQoKICAgICAgLnVwbG9hZC1vdmVybGF5IC51cGxvYWQtdGV4dCB7CiAgICAgICAgY29sb3I6ICNlMGUwZTA7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICB9CgogICAgICAudXBsb2FkLW92ZXJsYXkgLnVwbG9hZC1wcm9ncmVzcyB7CiAgICAgICAgY29sb3I6ICM4ODg7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICB9CgogICAgICAuZHJhZy1oaW50IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiA4cHg7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDU5LCAxMzAsIDI0NiwgMC45KTsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgcGFkZGluZzogNHB4IDEycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHotaW5kZXg6IDU7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctb3ZlcmxheSB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNyk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHotaW5kZXg6IDEwMDA7CiAgICAgIH0KCiAgICAgIC5kaWFsb2cgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMxZTFlMWUiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgIG1pbi13aWR0aDogNDAwcHg7CiAgICAgICAgYm94LXNoYWRvdzogMCAyMHB4IDQwcHggcmdiYSgwLCAwLCAwLCAwLjUpOwogICAgICB9CgogICAgICAuZGlhbG9nLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzE4MTgxYiIsICIjZmZmIil9OwogICAgICB9CgogICAgICAuZGlhbG9nLWxvY2F0aW9uIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM4ODgiKX07CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICB9CgogICAgICAuZGlhbG9nLWlucHV0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmNGY0ZjUiLCAiIzE0MTQxNCIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Q0ZDRkOCIsICIjMzMzIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxODE4MWIiLCAiI2ZmZiIpfTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctaW5wdXQ6Zm9jdXMgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ExYTFhYSIsICIjZTBlMGUwIil9OwogICAgICB9CgogICAgICAuZGlhbG9nLWhpbnQgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNhMWExYWEiLCAiIzY2NiIpfTsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICB9CgogICAgICAuZGlhbG9nLWFjdGlvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctYnRuIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4yczsKICAgICAgfQoKICAgICAgLmRpYWxvZy1idG4tY2FuY2VsIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Q0ZDRkOCIsICIjNDQ0Iil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYWFhIil9OwogICAgICB9CgogICAgICAuZGlhbG9nLWJ0bi1jYW5jZWw6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDMpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTgxODFiIiwgIiNmZmYiKX07CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctYnRuLWNyZWF0ZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzQwNDA0MCIpfTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTgxODFiIiwgIiNmZmYiKX07CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctYnRuLWNyZWF0ZTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkNGQ0ZDgiLCAiIzUwNTA1MCIpfTsKICAgICAgfQoKICAgICAgLmRpYWxvZy1idG4tY3JlYXRlOmRpc2FibGVkIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgfQoKICAgICAgLyogTW92ZSBkaWFsb2cgc3R5bGVzICovCiAgICAgIC5tb3ZlLXN1bW1hcnkgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDMpIiwgInJnYmEoMCwgMCwgMCwgMC4yKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICB9CgogICAgICAubW92ZS1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogOHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgfQoKICAgICAgLm1vdmUtaXRlbTpsYXN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICB9CgogICAgICAubW92ZS1sYWJlbCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM4ODgiKX07CiAgICAgICAgbWluLXdpZHRoOiA0MHB4OwogICAgICB9CgogICAgICAubW92ZS1wYXRoIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzZjNmNDYiLCAiI2UwZTBlMCIpfTsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgIH0KCiAgICAgIC5tb3ZlLWVycm9yIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDIzOSwgNjgsIDY4LCAwLjE1KTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDIzOSwgNjgsIDY4LCAwLjMpOwogICAgICAgIGNvbG9yOiAjZjg3MTcxOwogICAgICAgIHBhZGRpbmc6IDEycHggMTZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgIC8qIE1vdmUgcGlja2VyIGRpYWxvZyBzdHlsZXMgKi8KICAgICAgLm1vdmUtcGlja2VyLWRpYWxvZyB7CiAgICAgICAgbWluLXdpZHRoOiA0NTBweDsKICAgICAgICBtYXgtaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgLnBpY2tlci1icmVhZGNydW1iIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wMykiLCAicmdiYSgwLCAwLCAwLCAwLjIpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICB9CgogICAgICAucGlja2VyLWNydW1iIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiIzg4OCIpfTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLnBpY2tlci1jcnVtYjpob3ZlciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTgxODFiIiwgIiNmZmYiKX07CiAgICAgIH0KCiAgICAgIC5waWNrZXItc2VwYXJhdG9yIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkNGQ0ZDgiLCAiIzU1NSIpfTsKICAgICAgfQoKICAgICAgLnBpY2tlci1saXN0IHsKICAgICAgICBtYXgtaGVpZ2h0OiAyODBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzMzMiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgICAgbWluLWhlaWdodDogMTAwcHg7CiAgICAgIH0KCiAgICAgIC5waWNrZXItaXRlbSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogI2ZiYmYyNDsKICAgICAgfQoKICAgICAgLnBpY2tlci1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjAzKSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpIil9OwogICAgICB9CgogICAgICAucGlja2VyLWl0ZW0gLmljb24gewogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLnBpY2tlci1pdGVtIC5uYW1lIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLnBpY2tlci1lbXB0eSB7CiAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjYTFhMWFhIiwgIiM2NjYiKX07CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICB9CgogICAgICAuY29sdW1uLWl0ZW0uZHJhZ2dpbmcgewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgfQoKICAgICAgLmNvbHVtbi1pdGVtLmRyb3AtdGFyZ2V0IHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDU5LCAxMzAsIDI0NiwgMC4xNSkgIWltcG9ydGFudDsKICAgICAgICBvdXRsaW5lOiAxcHggZGFzaGVkIHJnYmEoNTksIDEzMCwgMjQ2LCAwLjUpOwogICAgICB9CgogICAgICAuY29sdW1uLWl0ZW0uZHJvcC1pbnZhbGlkIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDIzOSwgNjgsIDY4LCAwLjEpICFpbXBvcnRhbnQ7CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgfQogICAgYAogICAgXTsKICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBhd2FpdCB0aGlzLmxvYWRJbml0aWFsQ29sdW1uKCk7CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgdGhpcy5jbGVhckZvbGRlckhvdmVyKCk7CiAgICAgIHRoaXMuZHJhZ0NvdW50ZXJzLmNsZWFyKCk7CiAgICAgIGlmICh0aGlzLmZpbGVJbnB1dEVsZW1lbnQpIHsKICAgICAgICB0aGlzLmZpbGVJbnB1dEVsZW1lbnQucmVtb3ZlKCk7CiAgICAgICAgdGhpcy5maWxlSW5wdXRFbGVtZW50ID0gbnVsbDsKICAgICAgfQogICAgICBpZiAodGhpcy5mb2xkZXJJbnB1dEVsZW1lbnQpIHsKICAgICAgICB0aGlzLmZvbGRlcklucHV0RWxlbWVudC5yZW1vdmUoKTsKICAgICAgICB0aGlzLmZvbGRlcklucHV0RWxlbWVudCA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygiYnVja2V0TmFtZSIpIHx8IGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygiY3VycmVudFByZWZpeCIpKSB7CiAgICAgICAgdGhpcy5sb2FkSW5pdGlhbENvbHVtbigpOwogICAgICB9IGVsc2UgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygicmVmcmVzaEtleSIpKSB7CiAgICAgICAgdGhpcy5yZWZyZXNoQWxsQ29sdW1ucygpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBsb2FkSW5pdGlhbENvbHVtbigpIHsKICAgICAgaWYgKCF0aGlzLmRhdGFQcm92aWRlcikKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcGF0aFNlZ21lbnRzID0gZ2V0UGF0aFNlZ21lbnRzKHRoaXMuY3VycmVudFByZWZpeCk7CiAgICAgICAgY29uc3QgcHJlZml4ZXNUb0xvYWQgPSBbIiIsIC4uLnBhdGhTZWdtZW50c107CiAgICAgICAgY29uc3QgY29sdW1uUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByZWZpeGVzVG9Mb2FkLm1hcCgocHJlZml4NCkgPT4gdGhpcy5kYXRhUHJvdmlkZXIubGlzdE9iamVjdHModGhpcy5idWNrZXROYW1lLCBwcmVmaXg0LCAiLyIpKSk7CiAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1uUmVzdWx0cy5tYXAoKHJlc3VsdCwgaW5kZXgyKSA9PiB7CiAgICAgICAgICBjb25zdCBwcmVmaXg0ID0gcHJlZml4ZXNUb0xvYWRbaW5kZXgyXTsKICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IGluZGV4MiA8IHBhdGhTZWdtZW50cy5sZW5ndGggPyBwYXRoU2VnbWVudHNbaW5kZXgyXSA6IG51bGw7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcmVmaXg6IHByZWZpeDQsCiAgICAgICAgICAgIG9iamVjdHM6IHJlc3VsdC5vYmplY3RzLAogICAgICAgICAgICBwcmVmaXhlczogcmVzdWx0LnByZWZpeGVzLAogICAgICAgICAgICBzZWxlY3RlZEl0ZW0sCiAgICAgICAgICAgIHdpZHRoOiB0aGlzLkRFRkFVTFRfQ09MVU1OX1dJRFRICiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICAgIHRoaXMudXBkYXRlQ29tcGxldGUudGhlbigoKSA9PiB0aGlzLnNjcm9sbFRvRW5kKCkpOwogICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJFcnJvciBsb2FkaW5nIG9iamVjdHM6IiwgZXJyKTsKICAgICAgICB0aGlzLmNvbHVtbnMgPSBbXTsKICAgICAgfQogICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgIH0KICAgIGFzeW5jIHJlZnJlc2hBbGxDb2x1bW5zKCkgewogICAgICBpZiAoIXRoaXMuZGF0YVByb3ZpZGVyKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgdXBkYXRlZENvbHVtbnMgPSBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmNvbHVtbnMubWFwKGFzeW5jIChjb2wpID0+IHsKICAgICAgICB0cnkgewogICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhUHJvdmlkZXIubGlzdE9iamVjdHModGhpcy5idWNrZXROYW1lLCBjb2wucHJlZml4LCAiLyIpOwogICAgICAgICAgcmV0dXJuIHsgLi4uY29sLCBvYmplY3RzOiByZXN1bHQub2JqZWN0cywgcHJlZml4ZXM6IHJlc3VsdC5wcmVmaXhlcyB9OwogICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgcmV0dXJuIGNvbDsKICAgICAgICB9CiAgICAgIH0pKTsKICAgICAgdGhpcy5jb2x1bW5zID0gdXBkYXRlZENvbHVtbnM7CiAgICB9CiAgICBhc3luYyBzZWxlY3RGb2xkZXIoY29sdW1uSW5kZXgsIHByZWZpeDQpIHsKICAgICAgaWYgKCF0aGlzLmRhdGFQcm92aWRlcikKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoKGNvbCwgaTExKSA9PiB7CiAgICAgICAgaWYgKGkxMSA9PT0gY29sdW1uSW5kZXgpIHsKICAgICAgICAgIHJldHVybiB7IC4uLmNvbCwgc2VsZWN0ZWRJdGVtOiBwcmVmaXg0IH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb2w7CiAgICAgIH0pOwogICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuc2xpY2UoMCwgY29sdW1uSW5kZXggKyAxKTsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmRhdGFQcm92aWRlci5saXN0T2JqZWN0cyh0aGlzLmJ1Y2tldE5hbWUsIHByZWZpeDQsICIvIik7CiAgICAgICAgdGhpcy5jb2x1bW5zID0gWwogICAgICAgICAgLi4udGhpcy5jb2x1bW5zLAogICAgICAgICAgewogICAgICAgICAgICBwcmVmaXg6IHByZWZpeDQsCiAgICAgICAgICAgIG9iamVjdHM6IHJlc3VsdC5vYmplY3RzLAogICAgICAgICAgICBwcmVmaXhlczogcmVzdWx0LnByZWZpeGVzLAogICAgICAgICAgICBzZWxlY3RlZEl0ZW06IG51bGwsCiAgICAgICAgICAgIHdpZHRoOiB0aGlzLkRFRkFVTFRfQ09MVU1OX1dJRFRICiAgICAgICAgICB9CiAgICAgICAgXTsKICAgICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4gdGhpcy5zY3JvbGxUb0VuZCgpKTsKICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgbG9hZGluZyBmb2xkZXI6IiwgZXJyKTsKICAgICAgfQogICAgfQogICAgc2Nyb2xsVG9FbmQoKSB7CiAgICAgIHRoaXMuc2Nyb2xsTGVmdCA9IHRoaXMuc2Nyb2xsV2lkdGggLSB0aGlzLmNsaWVudFdpZHRoOwogICAgfQogICAgc3RhcnRSZXNpemUoZTExLCBjb2x1bW5JbmRleCkgewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy5yZXNpemluZyA9IHsKICAgICAgICBjb2x1bW5JbmRleCwKICAgICAgICBzdGFydFg6IGUxMS5jbGllbnRYLAogICAgICAgIHN0YXJ0V2lkdGg6IHRoaXMuY29sdW1uc1tjb2x1bW5JbmRleF0ud2lkdGgKICAgICAgfTsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgdGhpcy5oYW5kbGVSZXNpemUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5zdG9wUmVzaXplKTsKICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAiY29sLXJlc2l6ZSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUudXNlclNlbGVjdCA9ICJub25lIjsKICAgIH0KICAgIGhhbmRsZVJlc2l6ZSA9IChlMTEpID0+IHsKICAgICAgaWYgKCF0aGlzLnJlc2l6aW5nKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgZGVsdGEgPSBlMTEuY2xpZW50WCAtIHRoaXMucmVzaXppbmcuc3RhcnRYOwogICAgICBjb25zdCBuZXdXaWR0aCA9IE1hdGgubWluKHRoaXMuTUFYX0NPTFVNTl9XSURUSCwgTWF0aC5tYXgodGhpcy5NSU5fQ09MVU1OX1dJRFRILCB0aGlzLnJlc2l6aW5nLnN0YXJ0V2lkdGggKyBkZWx0YSkpOwogICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKChjb2wsIGkxMSkgPT4gewogICAgICAgIGlmIChpMTEgPT09IHRoaXMucmVzaXppbmcuY29sdW1uSW5kZXgpIHsKICAgICAgICAgIHJldHVybiB7IC4uLmNvbCwgd2lkdGg6IG5ld1dpZHRoIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb2w7CiAgICAgIH0pOwogICAgfTsKICAgIHN0b3BSZXNpemUgPSAoKSA9PiB7CiAgICAgIHRoaXMucmVzaXppbmcgPSBudWxsOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCB0aGlzLmhhbmRsZVJlc2l6ZSk7CiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCB0aGlzLnN0b3BSZXNpemUpOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9ICIiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnVzZXJTZWxlY3QgPSAiIjsKICAgIH07CiAgICBzZWxlY3RGaWxlKGNvbHVtbkluZGV4LCBrZXkyKSB7CiAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoKGNvbCwgaTExKSA9PiB7CiAgICAgICAgaWYgKGkxMSA9PT0gY29sdW1uSW5kZXgpIHsKICAgICAgICAgIHJldHVybiB7IC4uLmNvbCwgc2VsZWN0ZWRJdGVtOiBrZXkyIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb2w7CiAgICAgIH0pOwogICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuc2xpY2UoMCwgY29sdW1uSW5kZXggKyAxKTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgia2V5LXNlbGVjdGVkIiwgewogICAgICAgIGRldGFpbDogeyBrZXk6IGtleTIgfSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIGdldEZpbGVJY29uKGtleTIpIHsKICAgICAgY29uc3QgZXh0ID0ga2V5Mi5zcGxpdCgiLiIpLnBvcCgpPy50b0xvd2VyQ2FzZSgpIHx8ICIiOwogICAgICBjb25zdCBpY29uTWFwID0gewogICAgICAgIGpzb246ICJNMTQgMkg2YTIgMiAwIDAgMC0yIDJ2MTZhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0yVjh6IiwKICAgICAgICB0eHQ6ICJNMTQgMkg2YTIgMiAwIDAgMC0yIDJ2MTZhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0yVjh6IiwKICAgICAgICBwbmc6ICJNNSAzaDE0YTIgMiAwIDAgMSAyIDJ2MTRhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yeiIsCiAgICAgICAganBnOiAiTTUgM2gxNGEyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMnoiLAogICAgICAgIGpwZWc6ICJNNSAzaDE0YTIgMiAwIDAgMSAyIDJ2MTRhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yeiIsCiAgICAgICAgZ2lmOiAiTTUgM2gxNGEyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMnoiLAogICAgICAgIHBkZjogIk0xNCAySDZhMiAyIDAgMCAwLTIgMnYxNmEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAyLTJWOHoiCiAgICAgIH07CiAgICAgIHJldHVybiBpY29uTWFwW2V4dF0gfHwgIk0xNCAySDZhMiAyIDAgMCAwLTIgMnYxNmEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAyLTJWOHoiOwogICAgfQogICAgaGFuZGxlRm9sZGVyQ29udGV4dE1lbnUoZXZlbnQsIGNvbHVtbkluZGV4LCBwcmVmaXg0KSB7CiAgICAgIGlmICghdGhpcy5kYXRhUHJvdmlkZXIpCiAgICAgICAgcmV0dXJuOwogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBEZWVzQ29udGV4dG1lbnUub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZXZlbnQsIFsKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiT3BlbiIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpmb2xkZXJPcGVuIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICB0aGlzLnNlbGVjdEZvbGRlcihjb2x1bW5JbmRleCwgcHJlZml4NCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiQ29weSBQYXRoIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmNvcHkiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHByZWZpeDQpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIlJlbmFtZSIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpwZW5jaWwiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB0aGlzLm9wZW5SZW5hbWVEaWFsb2cocHJlZml4NCwgdHJ1ZSkKICAgICAgICB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJNb3ZlIHRvLi4uIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmZvbGRlcklucHV0IiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gdGhpcy5vcGVuTW92ZVBpY2tlckRpYWxvZyhwcmVmaXg0LCB0cnVlKQogICAgICAgIH0sCiAgICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIk5ldyBGb2xkZXIgSW5zaWRlIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmZvbGRlclBsdXMiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB0aGlzLm9wZW5DcmVhdGVEaWFsb2coImZvbGRlciIsIHByZWZpeDQpCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiTmV3IEZpbGUgSW5zaWRlIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmZpbGVQbHVzIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gdGhpcy5vcGVuQ3JlYXRlRGlhbG9nKCJmaWxlIiwgcHJlZml4NCkKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJVcGxvYWQgRmlsZXMuLi4iLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6ZmlsZSIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMudHJpZ2dlckZpbGVVcGxvYWQocHJlZml4NCwgImZpbGVzIikKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJVcGxvYWQgRm9sZGVyLi4uIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmZvbGRlclVwIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gdGhpcy50cmlnZ2VyRmlsZVVwbG9hZChwcmVmaXg0LCAiZm9sZGVyIikKICAgICAgICB9LAogICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJEZWxldGUgRm9sZGVyIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOnRyYXNoMiIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgaWYgKGNvbmZpcm0oYERlbGV0ZSBmb2xkZXIgIiR7Z2V0RmlsZU5hbWUocHJlZml4NCl9IiBhbmQgYWxsIGl0cyBjb250ZW50cz9gKSkgewogICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCB0aGlzLmRhdGFQcm92aWRlci5kZWxldGVQcmVmaXgodGhpcy5idWNrZXROYW1lLCBwcmVmaXg0KTsKICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgewogICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLnNsaWNlKDAsIGNvbHVtbkluZGV4ICsgMSk7CiAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKChjb2wsIGkxMSkgPT4gaTExID09PSBjb2x1bW5JbmRleCA/IHsgLi4uY29sLCBzZWxlY3RlZEl0ZW06IG51bGwgfSA6IGNvbCk7CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hDb2x1bW5CeVByZWZpeCh0aGlzLmNvbHVtbnNbY29sdW1uSW5kZXhdLnByZWZpeCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBdKTsKICAgIH0KICAgIGhhbmRsZUZpbGVDb250ZXh0TWVudShldmVudCwgY29sdW1uSW5kZXgsIGtleTIpIHsKICAgICAgaWYgKCF0aGlzLmRhdGFQcm92aWRlcikKICAgICAgICByZXR1cm47CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIERlZXNDb250ZXh0bWVudS5vcGVuQ29udGV4dE1lbnVXaXRoT3B0aW9ucyhldmVudCwgWwogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJQcmV2aWV3IiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmV5ZSIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RGaWxlKGNvbHVtbkluZGV4LCBrZXkyKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJEb3dubG9hZCIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpkb3dubG9hZCIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5kYXRhUHJvdmlkZXIuZ2V0T2JqZWN0VXJsKHRoaXMuYnVja2V0TmFtZSwga2V5Mik7CiAgICAgICAgICAgIGNvbnN0IGxpbmszID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwogICAgICAgICAgICBsaW5rMy5ocmVmID0gdXJsOwogICAgICAgICAgICBsaW5rMy5kb3dubG9hZCA9IGdldEZpbGVOYW1lKGtleTIpOwogICAgICAgICAgICBsaW5rMy5jbGljaygpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIkNvcHkgUGF0aCIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpjb3B5IiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChrZXkyKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJSZW5hbWUiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6cGVuY2lsIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gdGhpcy5vcGVuUmVuYW1lRGlhbG9nKGtleTIsIGZhbHNlKQogICAgICAgIH0sCiAgICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIk1vdmUgdG8uLi4iLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6Zm9sZGVySW5wdXQiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB0aGlzLm9wZW5Nb3ZlUGlja2VyRGlhbG9nKGtleTIsIGZhbHNlKQogICAgICAgIH0sCiAgICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIkRlbGV0ZSIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTp0cmFzaDIiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGlmIChjb25maXJtKGBEZWxldGUgZmlsZSAiJHtnZXRGaWxlTmFtZShrZXkyKX0iP2ApKSB7CiAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IHRoaXMuZGF0YVByb3ZpZGVyLmRlbGV0ZU9iamVjdCh0aGlzLmJ1Y2tldE5hbWUsIGtleTIpOwogICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hDb2x1bW5CeVByZWZpeCh0aGlzLmNvbHVtbnNbY29sdW1uSW5kZXhdLnByZWZpeCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBdKTsKICAgIH0KICAgIGhhbmRsZUVtcHR5U3BhY2VDb250ZXh0TWVudShldmVudCwgY29sdW1uSW5kZXgpIHsKICAgICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gZXZlbnQuY3VycmVudFRhcmdldCkKICAgICAgICByZXR1cm47CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnN0IHByZWZpeDQgPSB0aGlzLmNvbHVtbnNbY29sdW1uSW5kZXhdLnByZWZpeDsKICAgICAgRGVlc0NvbnRleHRtZW51Lm9wZW5Db250ZXh0TWVudVdpdGhPcHRpb25zKGV2ZW50LCBbCiAgICAgICAgewogICAgICAgICAgbmFtZTogIk5ldyBGb2xkZXIiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6Zm9sZGVyUGx1cyIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMub3BlbkNyZWF0ZURpYWxvZygiZm9sZGVyIiwgcHJlZml4NCkKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJOZXcgRmlsZSIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpmaWxlUGx1cyIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMub3BlbkNyZWF0ZURpYWxvZygiZmlsZSIsIHByZWZpeDQpCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiVXBsb2FkIEZpbGVzLi4uIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmZpbGUiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB0aGlzLnRyaWdnZXJGaWxlVXBsb2FkKHByZWZpeDQsICJmaWxlcyIpCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAiVXBsb2FkIEZvbGRlci4uLiIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpmb2xkZXJVcCIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMudHJpZ2dlckZpbGVVcGxvYWQocHJlZml4NCwgImZvbGRlciIpCiAgICAgICAgfQogICAgICBdKTsKICAgIH0KICAgIG9wZW5DcmVhdGVEaWFsb2codHlwZTUsIHByZWZpeDQpIHsKICAgICAgdGhpcy5jcmVhdGVEaWFsb2dUeXBlID0gdHlwZTU7CiAgICAgIHRoaXMuY3JlYXRlRGlhbG9nUHJlZml4ID0gcHJlZml4NDsKICAgICAgdGhpcy5jcmVhdGVEaWFsb2dOYW1lID0gIiI7CiAgICAgIHRoaXMuc2hvd0NyZWF0ZURpYWxvZyA9IHRydWU7CiAgICB9CiAgICAvLyAtLS0gRmlsZSB1cGxvYWQgaGVscGVycyAtLS0KICAgIGVuc3VyZUZpbGVJbnB1dHMoKSB7CiAgICAgIGlmICghdGhpcy5maWxlSW5wdXRFbGVtZW50KSB7CiAgICAgICAgdGhpcy5maWxlSW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKICAgICAgICB0aGlzLmZpbGVJbnB1dEVsZW1lbnQudHlwZSA9ICJmaWxlIjsKICAgICAgICB0aGlzLmZpbGVJbnB1dEVsZW1lbnQubXVsdGlwbGUgPSB0cnVlOwogICAgICAgIHRoaXMuZmlsZUlucHV0RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgIHRoaXMuc2hhZG93Um9vdC5hcHBlbmRDaGlsZCh0aGlzLmZpbGVJbnB1dEVsZW1lbnQpOwogICAgICB9CiAgICAgIGlmICghdGhpcy5mb2xkZXJJbnB1dEVsZW1lbnQpIHsKICAgICAgICB0aGlzLmZvbGRlcklucHV0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CiAgICAgICAgdGhpcy5mb2xkZXJJbnB1dEVsZW1lbnQudHlwZSA9ICJmaWxlIjsKICAgICAgICB0aGlzLmZvbGRlcklucHV0RWxlbWVudC5tdWx0aXBsZSA9IHRydWU7CiAgICAgICAgdGhpcy5mb2xkZXJJbnB1dEVsZW1lbnQud2Via2l0ZGlyZWN0b3J5ID0gdHJ1ZTsKICAgICAgICB0aGlzLmZvbGRlcklucHV0RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgIHRoaXMuc2hhZG93Um9vdC5hcHBlbmRDaGlsZCh0aGlzLmZvbGRlcklucHV0RWxlbWVudCk7CiAgICAgIH0KICAgIH0KICAgIHRyaWdnZXJGaWxlVXBsb2FkKHRhcmdldFByZWZpeCwgdHlwZTUpIHsKICAgICAgdGhpcy5lbnN1cmVGaWxlSW5wdXRzKCk7CiAgICAgIGNvbnN0IGlucHV0ID0gdHlwZTUgPT09ICJmb2xkZXIiID8gdGhpcy5mb2xkZXJJbnB1dEVsZW1lbnQgOiB0aGlzLmZpbGVJbnB1dEVsZW1lbnQ7CiAgICAgIGlucHV0LnZhbHVlID0gIiI7CiAgICAgIGNvbnN0IGhhbmRsZXIyID0gYXN5bmMgKCkgPT4gewogICAgICAgIGlucHV0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGhhbmRsZXIyKTsKICAgICAgICBpZiAoaW5wdXQuZmlsZXMgJiYgaW5wdXQuZmlsZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgYXdhaXQgdGhpcy51cGxvYWRGaWxlcyhBcnJheS5mcm9tKGlucHV0LmZpbGVzKSwgdGFyZ2V0UHJlZml4KTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGhhbmRsZXIyKTsKICAgICAgaW5wdXQuY2xpY2soKTsKICAgIH0KICAgIGFzeW5jIHVwbG9hZEZpbGVzKGZpbGVzLCB0YXJnZXRQcmVmaXgpIHsKICAgICAgaWYgKCF0aGlzLmRhdGFQcm92aWRlcikKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMudXBsb2FkaW5nID0gdHJ1ZTsKICAgICAgdGhpcy51cGxvYWRQcm9ncmVzcyA9IHsgY3VycmVudDogMCwgdG90YWw6IGZpbGVzLmxlbmd0aCB9OwogICAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBmaWxlcy5sZW5ndGg7IGkxMSsrKSB7CiAgICAgICAgY29uc3QgZmlsZSA9IGZpbGVzW2kxMV07CiAgICAgICAgdGhpcy51cGxvYWRQcm9ncmVzcyA9IHsgY3VycmVudDogaTExICsgMSwgdG90YWw6IGZpbGVzLmxlbmd0aCB9OwogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBiYXNlNjQyID0gYXdhaXQgdGhpcy5yZWFkRmlsZUFzQmFzZTY0KGZpbGUpOwogICAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gZmlsZS53ZWJraXRSZWxhdGl2ZVBhdGggfHwgZmlsZS5uYW1lOwogICAgICAgICAgY29uc3Qga2V5MiA9IHRhcmdldFByZWZpeCArIHJlbGF0aXZlUGF0aDsKICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gZmlsZS50eXBlIHx8IGdldENvbnRlbnRUeXBlKGZpbGUubmFtZS5zcGxpdCgiLiIpLnBvcCgpPy50b0xvd2VyQ2FzZSgpIHx8ICIiKTsKICAgICAgICAgIGF3YWl0IHRoaXMuZGF0YVByb3ZpZGVyLnB1dE9iamVjdCh0aGlzLmJ1Y2tldE5hbWUsIGtleTIsIGJhc2U2NDIsIGNvbnRlbnRUeXBlKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byB1cGxvYWQgJHtmaWxlLm5hbWV9OmAsIGVycik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMudXBsb2FkaW5nID0gZmFsc2U7CiAgICAgIHRoaXMudXBsb2FkUHJvZ3Jlc3MgPSBudWxsOwogICAgICBhd2FpdCB0aGlzLnJlZnJlc2hDb2x1bW5CeVByZWZpeCh0YXJnZXRQcmVmaXgpOwogICAgfQogICAgYXN5bmMgdXBsb2FkRmlsZXNXaXRoUGF0aHMoZmlsZXMsIHRhcmdldFByZWZpeCkgewogICAgICBpZiAoIXRoaXMuZGF0YVByb3ZpZGVyKQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy51cGxvYWRpbmcgPSB0cnVlOwogICAgICB0aGlzLnVwbG9hZFByb2dyZXNzID0geyBjdXJyZW50OiAwLCB0b3RhbDogZmlsZXMubGVuZ3RoIH07CiAgICAgIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IGZpbGVzLmxlbmd0aDsgaTExKyspIHsKICAgICAgICBjb25zdCB7IGZpbGUsIHJlbGF0aXZlUGF0aCB9ID0gZmlsZXNbaTExXTsKICAgICAgICB0aGlzLnVwbG9hZFByb2dyZXNzID0geyBjdXJyZW50OiBpMTEgKyAxLCB0b3RhbDogZmlsZXMubGVuZ3RoIH07CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IGJhc2U2NDIgPSBhd2FpdCB0aGlzLnJlYWRGaWxlQXNCYXNlNjQoZmlsZSk7CiAgICAgICAgICBjb25zdCBrZXkyID0gdGFyZ2V0UHJlZml4ICsgcmVsYXRpdmVQYXRoOwogICAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBmaWxlLnR5cGUgfHwgZ2V0Q29udGVudFR5cGUoZmlsZS5uYW1lLnNwbGl0KCIuIikucG9wKCk/LnRvTG93ZXJDYXNlKCkgfHwgIiIpOwogICAgICAgICAgYXdhaXQgdGhpcy5kYXRhUHJvdmlkZXIucHV0T2JqZWN0KHRoaXMuYnVja2V0TmFtZSwga2V5MiwgYmFzZTY0MiwgY29udGVudFR5cGUpOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHVwbG9hZCAke3JlbGF0aXZlUGF0aH06YCwgZXJyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy51cGxvYWRpbmcgPSBmYWxzZTsKICAgICAgdGhpcy51cGxvYWRQcm9ncmVzcyA9IG51bGw7CiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaENvbHVtbkJ5UHJlZml4KHRhcmdldFByZWZpeCk7CiAgICB9CiAgICByZWFkRmlsZUFzQmFzZTY0KGZpbGUpIHsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0KSA9PiB7CiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICByZWFkZXIub25sb2FkID0gKCkgPT4gewogICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVhZGVyLnJlc3VsdDsKICAgICAgICAgIHJlc29sdmUyKHJlc3VsdC5zcGxpdCgiLCIpWzFdIHx8ICIiKTsKICAgICAgICB9OwogICAgICAgIHJlYWRlci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlYWRlci5lcnJvcik7CiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7CiAgICAgIH0pOwogICAgfQogICAgYXN5bmMgcmVmcmVzaENvbHVtbkJ5UHJlZml4KHByZWZpeDQpIHsKICAgICAgaWYgKCF0aGlzLmRhdGFQcm92aWRlcikKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gdGhpcy5jb2x1bW5zLmZpbmRJbmRleCgoY29sKSA9PiBjb2wucHJlZml4ID09PSBwcmVmaXg0KTsKICAgICAgaWYgKGNvbHVtbkluZGV4ID09PSAtMSkgewogICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEFsbENvbHVtbnMoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmRhdGFQcm92aWRlci5saXN0T2JqZWN0cyh0aGlzLmJ1Y2tldE5hbWUsIHByZWZpeDQsICIvIik7CiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcCgoY29sLCBpMTEpID0+IGkxMSA9PT0gY29sdW1uSW5kZXggPyB7IC4uLmNvbCwgb2JqZWN0czogcmVzdWx0Lm9iamVjdHMsIHByZWZpeGVzOiByZXN1bHQucHJlZml4ZXMgfSA6IGNvbCk7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEFsbENvbHVtbnMoKTsKICAgICAgfQogICAgfQogICAgLy8gLS0tIERyYWctYW5kLWRyb3AgaGFuZGxlcnMgLS0tCiAgICBoYW5kbGVDb2x1bW5EcmFnRW50ZXIoZTExLCBjb2x1bW5JbmRleCkgewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBjb25zdCBjb3VudDIgPSAodGhpcy5kcmFnQ291bnRlcnMuZ2V0KGNvbHVtbkluZGV4KSB8fCAwKSArIDE7CiAgICAgIHRoaXMuZHJhZ0NvdW50ZXJzLnNldChjb2x1bW5JbmRleCwgY291bnQyKTsKICAgICAgdGhpcy5kcmFnT3ZlckNvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7CiAgICB9CiAgICBoYW5kbGVDb2x1bW5EcmFnT3ZlcihlMTEpIHsKICAgICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgaWYgKGUxMS5kYXRhVHJhbnNmZXIpIHsKICAgICAgICBlMTEuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSB0aGlzLmRyYWdnZWRJdGVtID8gIm1vdmUiIDogImNvcHkiOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVDb2x1bW5EcmFnTGVhdmUoZTExLCBjb2x1bW5JbmRleCkgewogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIGNvbnN0IGNvdW50MiA9ICh0aGlzLmRyYWdDb3VudGVycy5nZXQoY29sdW1uSW5kZXgpIHx8IDEpIC0gMTsKICAgICAgdGhpcy5kcmFnQ291bnRlcnMuc2V0KGNvbHVtbkluZGV4LCBjb3VudDIpOwogICAgICBpZiAoY291bnQyIDw9IDApIHsKICAgICAgICB0aGlzLmRyYWdDb3VudGVycy5kZWxldGUoY29sdW1uSW5kZXgpOwogICAgICAgIGlmICh0aGlzLmRyYWdPdmVyQ29sdW1uSW5kZXggPT09IGNvbHVtbkluZGV4KQogICAgICAgICAgdGhpcy5kcmFnT3ZlckNvbHVtbkluZGV4ID0gLTE7CiAgICAgICAgdGhpcy5jbGVhckZvbGRlckhvdmVyKCk7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGhhbmRsZUNvbHVtbkRyb3AoZTExLCBjb2x1bW5JbmRleCkgewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBjb25zdCB0YXJnZXRQcmVmaXggPSB0aGlzLmRyYWdPdmVyRm9sZGVyUHJlZml4ID8/IHRoaXMuY29sdW1uc1tjb2x1bW5JbmRleF0ucHJlZml4OwogICAgICBpZiAodGhpcy5kcmFnZ2VkSXRlbSkgewogICAgICAgIHRoaXMuaW5pdGlhdGVNb3ZlKHRoaXMuZHJhZ2dlZEl0ZW0ua2V5LCB0aGlzLmRyYWdnZWRJdGVtLmlzRm9sZGVyLCB0YXJnZXRQcmVmaXgpOwogICAgICAgIHRoaXMuZHJhZ2dlZEl0ZW0gPSBudWxsOwogICAgICAgIHRoaXMuY2xlYXJGb2xkZXJIb3ZlcigpOwogICAgICAgIHRoaXMuZHJhZ0NvdW50ZXJzLmNsZWFyKCk7CiAgICAgICAgdGhpcy5kcmFnT3ZlckNvbHVtbkluZGV4ID0gLTE7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuZHJhZ0NvdW50ZXJzLmNsZWFyKCk7CiAgICAgIHRoaXMuZHJhZ092ZXJDb2x1bW5JbmRleCA9IC0xOwogICAgICBjb25zdCBpdGVtcyA9IGUxMS5kYXRhVHJhbnNmZXI/Lml0ZW1zOwogICAgICBpZiAoIWl0ZW1zIHx8IGl0ZW1zLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMuY2xlYXJGb2xkZXJIb3ZlcigpOwogICAgICBjb25zdCBhbGxGaWxlcyA9IFtdOwogICAgICBjb25zdCBwcm9jZXNzRW50cnkgPSBhc3luYyAoZW50cnksIHBhdGgyKSA9PiB7CiAgICAgICAgaWYgKGVudHJ5LmlzRmlsZSkgewogICAgICAgICAgY29uc3QgZmlsZUVudHJ5ID0gZW50cnk7CiAgICAgICAgICBjb25zdCBmaWxlID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgICAgICAgICAgZmlsZUVudHJ5LmZpbGUocmVzb2x2ZTIsIHJlamVjdCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIGFsbEZpbGVzLnB1c2goeyBmaWxlLCByZWxhdGl2ZVBhdGg6IHBhdGgyICsgZmlsZS5uYW1lIH0pOwogICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHsKICAgICAgICAgIGNvbnN0IGRpckVudHJ5ID0gZW50cnk7CiAgICAgICAgICBjb25zdCByZWFkZXIgPSBkaXJFbnRyeS5jcmVhdGVSZWFkZXIoKTsKICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdCkgPT4gewogICAgICAgICAgICByZWFkZXIucmVhZEVudHJpZXMocmVzb2x2ZTIsIHJlamVjdCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIGZvciAoY29uc3QgY2hpbGRFbnRyeSBvZiBlbnRyaWVzKSB7CiAgICAgICAgICAgIGF3YWl0IHByb2Nlc3NFbnRyeShjaGlsZEVudHJ5LCBwYXRoMiArIGVudHJ5Lm5hbWUgKyAiLyIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgaXRlbXMubGVuZ3RoOyBpMTErKykgewogICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpMTFdOwogICAgICAgIGlmIChpdGVtLmtpbmQgPT09ICJmaWxlIikgewogICAgICAgICAgY29uc3QgZW50cnkgPSBpdGVtLndlYmtpdEdldEFzRW50cnkoKTsKICAgICAgICAgIGlmIChlbnRyeSkgewogICAgICAgICAgICBhd2FpdCBwcm9jZXNzRW50cnkoZW50cnksICIiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGFsbEZpbGVzLmxlbmd0aCA+IDApIHsKICAgICAgICBhd2FpdCB0aGlzLnVwbG9hZEZpbGVzV2l0aFBhdGhzKGFsbEZpbGVzLCB0YXJnZXRQcmVmaXgpOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVGb2xkZXJEcmFnRW50ZXIoZTExLCBmb2xkZXJQcmVmaXgpIHsKICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICB0aGlzLmNsZWFyRm9sZGVySG92ZXIoKTsKICAgICAgdGhpcy5mb2xkZXJIb3ZlclRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgdGhpcy5kcmFnT3ZlckZvbGRlclByZWZpeCA9IGZvbGRlclByZWZpeDsKICAgICAgfSwgNTAwKTsKICAgIH0KICAgIGhhbmRsZUZvbGRlckRyYWdMZWF2ZShlMTEsIGZvbGRlclByZWZpeCkgewogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIGNvbnN0IHRhcmdldCA9IGUxMS5jdXJyZW50VGFyZ2V0OwogICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gZTExLnJlbGF0ZWRUYXJnZXQ7CiAgICAgIGlmIChyZWxhdGVkVGFyZ2V0ICYmIHRhcmdldC5jb250YWlucyhyZWxhdGVkVGFyZ2V0KSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAodGhpcy5kcmFnT3ZlckZvbGRlclByZWZpeCA9PT0gZm9sZGVyUHJlZml4KQogICAgICAgIHRoaXMuZHJhZ092ZXJGb2xkZXJQcmVmaXggPSBudWxsOwogICAgICBpZiAodGhpcy5mb2xkZXJIb3ZlclRpbWVyKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZm9sZGVySG92ZXJUaW1lcik7CiAgICAgICAgdGhpcy5mb2xkZXJIb3ZlclRpbWVyID0gbnVsbDsKICAgICAgfQogICAgfQogICAgaGFuZGxlRm9sZGVyRHJhZ092ZXIoZTExKSB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIGlmIChlMTEuZGF0YVRyYW5zZmVyKSB7CiAgICAgICAgZTExLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gdGhpcy5kcmFnZ2VkSXRlbSA/ICJtb3ZlIiA6ICJjb3B5IjsKICAgICAgfQogICAgfQogICAgY2xlYXJGb2xkZXJIb3ZlcigpIHsKICAgICAgaWYgKHRoaXMuZm9sZGVySG92ZXJUaW1lcikgewogICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZvbGRlckhvdmVyVGltZXIpOwogICAgICAgIHRoaXMuZm9sZGVySG92ZXJUaW1lciA9IG51bGw7CiAgICAgIH0KICAgICAgdGhpcy5kcmFnT3ZlckZvbGRlclByZWZpeCA9IG51bGw7CiAgICB9CiAgICAvLyAtLS0gSW50ZXJuYWwgZHJhZyBoYW5kbGVycyBmb3IgbW92ZSAtLS0KICAgIGhhbmRsZUl0ZW1EcmFnU3RhcnQoZTExLCBrZXkyLCBpc0ZvbGRlcikgewogICAgICB0aGlzLmRyYWdnZWRJdGVtID0geyBrZXk6IGtleTIsIGlzRm9sZGVyIH07CiAgICAgIGUxMS5kYXRhVHJhbnNmZXI/LnNldERhdGEoInRleHQvcGxhaW4iLCBrZXkyKTsKICAgICAgZTExLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gImNvcHlNb3ZlIjsKICAgICAgY29uc3QgdGFyZ2V0ID0gZTExLnRhcmdldDsKICAgICAgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoImRyYWdnaW5nIik7CiAgICB9CiAgICBoYW5kbGVJdGVtRHJhZ0VuZChlMTEpIHsKICAgICAgdGhpcy5kcmFnZ2VkSXRlbSA9IG51bGw7CiAgICAgIGNvbnN0IHRhcmdldCA9IGUxMS50YXJnZXQ7CiAgICAgIHRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnZ2luZyIpOwogICAgfQogICAgLy8gLS0tIE1vdmUgcGlja2VyIGRpYWxvZyAtLS0KICAgIGFzeW5jIG9wZW5Nb3ZlUGlja2VyRGlhbG9nKGtleTIsIGlzRm9sZGVyKSB7CiAgICAgIHRoaXMubW92ZVBpY2tlclNvdXJjZSA9IHsga2V5OiBrZXkyLCBpc0ZvbGRlciB9OwogICAgICB0aGlzLm1vdmVQaWNrZXJDdXJyZW50UHJlZml4ID0gIiI7CiAgICAgIHRoaXMuc2hvd01vdmVQaWNrZXJEaWFsb2cgPSB0cnVlOwogICAgICBhd2FpdCB0aGlzLmxvYWRNb3ZlUGlja2VyUHJlZml4ZXMoIiIpOwogICAgfQogICAgYXN5bmMgbmF2aWdhdGVNb3ZlUGlja2VyKHByZWZpeDQpIHsKICAgICAgdGhpcy5tb3ZlUGlja2VyQ3VycmVudFByZWZpeCA9IHByZWZpeDQ7CiAgICAgIGF3YWl0IHRoaXMubG9hZE1vdmVQaWNrZXJQcmVmaXhlcyhwcmVmaXg0KTsKICAgIH0KICAgIGFzeW5jIGxvYWRNb3ZlUGlja2VyUHJlZml4ZXMocHJlZml4NCkgewogICAgICBpZiAoIXRoaXMuZGF0YVByb3ZpZGVyKQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5tb3ZlUGlja2VyTG9hZGluZyA9IHRydWU7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhUHJvdmlkZXIubGlzdE9iamVjdHModGhpcy5idWNrZXROYW1lLCBwcmVmaXg0LCAiLyIpOwogICAgICAgIHRoaXMubW92ZVBpY2tlclByZWZpeGVzID0gcmVzdWx0LnByZWZpeGVzOwogICAgICB9IGNhdGNoIHsKICAgICAgICB0aGlzLm1vdmVQaWNrZXJQcmVmaXhlcyA9IFtdOwogICAgICB9CiAgICAgIHRoaXMubW92ZVBpY2tlckxvYWRpbmcgPSBmYWxzZTsKICAgIH0KICAgIHNlbGVjdE1vdmVEZXN0aW5hdGlvbihkZXN0UHJlZml4KSB7CiAgICAgIGlmICghdGhpcy5tb3ZlUGlja2VyU291cmNlKQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5jbG9zZU1vdmVQaWNrZXJEaWFsb2coKTsKICAgICAgdGhpcy5pbml0aWF0ZU1vdmUodGhpcy5tb3ZlUGlja2VyU291cmNlLmtleSwgdGhpcy5tb3ZlUGlja2VyU291cmNlLmlzRm9sZGVyLCBkZXN0UHJlZml4KTsKICAgIH0KICAgIGNsb3NlTW92ZVBpY2tlckRpYWxvZygpIHsKICAgICAgdGhpcy5zaG93TW92ZVBpY2tlckRpYWxvZyA9IGZhbHNlOwogICAgICB0aGlzLm1vdmVQaWNrZXJTb3VyY2UgPSBudWxsOwogICAgICB0aGlzLm1vdmVQaWNrZXJDdXJyZW50UHJlZml4ID0gIiI7CiAgICAgIHRoaXMubW92ZVBpY2tlclByZWZpeGVzID0gW107CiAgICB9CiAgICAvLyAtLS0gTW92ZSBjb25maXJtYXRpb24gZGlhbG9nIC0tLQogICAgaW5pdGlhdGVNb3ZlKHNvdXJjZUtleSwgaXNGb2xkZXIsIGRlc3RQcmVmaXgpIHsKICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlTW92ZShzb3VyY2VLZXksIGRlc3RQcmVmaXgpOwogICAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHsKICAgICAgICB0aGlzLm1vdmVTb3VyY2UgPSB7IGtleTogc291cmNlS2V5LCBpc0ZvbGRlciB9OwogICAgICAgIHRoaXMubW92ZURlc3RpbmF0aW9uID0gZGVzdFByZWZpeDsKICAgICAgICB0aGlzLm1vdmVFcnJvciA9IHZhbGlkYXRpb24uZXJyb3I7CiAgICAgICAgdGhpcy5zaG93TW92ZURpYWxvZyA9IHRydWU7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMubW92ZVNvdXJjZSA9IHsga2V5OiBzb3VyY2VLZXksIGlzRm9sZGVyIH07CiAgICAgIHRoaXMubW92ZURlc3RpbmF0aW9uID0gZGVzdFByZWZpeDsKICAgICAgdGhpcy5tb3ZlRXJyb3IgPSBudWxsOwogICAgICB0aGlzLnNob3dNb3ZlRGlhbG9nID0gdHJ1ZTsKICAgIH0KICAgIGFzeW5jIGV4ZWN1dGVNb3ZlKCkgewogICAgICBpZiAoIXRoaXMubW92ZVNvdXJjZSB8fCAhdGhpcy5kYXRhUHJvdmlkZXIpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLm1vdmVJblByb2dyZXNzID0gdHJ1ZTsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBzb3VyY2VOYW1lID0gZ2V0RmlsZU5hbWUodGhpcy5tb3ZlU291cmNlLmtleSk7CiAgICAgICAgY29uc3QgZGVzdEtleSA9IHRoaXMubW92ZURlc3RpbmF0aW9uICsgc291cmNlTmFtZSArICh0aGlzLm1vdmVTb3VyY2UuaXNGb2xkZXIgPyAiLyIgOiAiIik7CiAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICBpZiAodGhpcy5tb3ZlU291cmNlLmlzRm9sZGVyKSB7CiAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmRhdGFQcm92aWRlci5tb3ZlUHJlZml4KHRoaXMuYnVja2V0TmFtZSwgdGhpcy5tb3ZlU291cmNlLmtleSwgZGVzdEtleSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuZGF0YVByb3ZpZGVyLm1vdmVPYmplY3QodGhpcy5idWNrZXROYW1lLCB0aGlzLm1vdmVTb3VyY2Uua2V5LCBkZXN0S2V5KTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7CiAgICAgICAgICB0aGlzLmNsb3NlTW92ZURpYWxvZygpOwogICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoQWxsQ29sdW1ucygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLm1vdmVFcnJvciA9IHJlc3VsdC5lcnJvciB8fCAiTW92ZSBvcGVyYXRpb24gZmFpbGVkIjsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIHRoaXMubW92ZUVycm9yID0gYEVycm9yOiAke2Vycn1gOwogICAgICB9CiAgICAgIHRoaXMubW92ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKICAgIH0KICAgIGNsb3NlTW92ZURpYWxvZygpIHsKICAgICAgdGhpcy5zaG93TW92ZURpYWxvZyA9IGZhbHNlOwogICAgICB0aGlzLm1vdmVTb3VyY2UgPSBudWxsOwogICAgICB0aGlzLm1vdmVEZXN0aW5hdGlvbiA9ICIiOwogICAgICB0aGlzLm1vdmVFcnJvciA9IG51bGw7CiAgICAgIHRoaXMubW92ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKICAgIH0KICAgIC8vIC0tLSBSZW5hbWUgZGlhbG9nIG1ldGhvZHMgLS0tCiAgICBvcGVuUmVuYW1lRGlhbG9nKGtleTIsIGlzRm9sZGVyKSB7CiAgICAgIHRoaXMucmVuYW1lU291cmNlID0geyBrZXk6IGtleTIsIGlzRm9sZGVyIH07CiAgICAgIHRoaXMucmVuYW1lTmFtZSA9IGdldEZpbGVOYW1lKGtleTIpOwogICAgICB0aGlzLnJlbmFtZUVycm9yID0gbnVsbDsKICAgICAgdGhpcy5zaG93UmVuYW1lRGlhbG9nID0gdHJ1ZTsKICAgICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHsKICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnJlbmFtZS1kaWFsb2ctaW5wdXQiKTsKICAgICAgICBpZiAoaW5wdXQpIHsKICAgICAgICAgIGlucHV0LmZvY3VzKCk7CiAgICAgICAgICBpZiAoIWlzRm9sZGVyKSB7CiAgICAgICAgICAgIGNvbnN0IGxhc3REb3QgPSB0aGlzLnJlbmFtZU5hbWUubGFzdEluZGV4T2YoIi4iKTsKICAgICAgICAgICAgaWYgKGxhc3REb3QgPiAwKSB7CiAgICAgICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgbGFzdERvdCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaW5wdXQuc2VsZWN0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlucHV0LnNlbGVjdCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBhc3luYyBleGVjdXRlUmVuYW1lKCkgewogICAgICBpZiAoIXRoaXMucmVuYW1lU291cmNlIHx8ICF0aGlzLnJlbmFtZU5hbWUudHJpbSgpIHx8ICF0aGlzLmRhdGFQcm92aWRlcikKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IG5ld05hbWUgPSB0aGlzLnJlbmFtZU5hbWUudHJpbSgpOwogICAgICBjb25zdCBjdXJyZW50TmFtZSA9IGdldEZpbGVOYW1lKHRoaXMucmVuYW1lU291cmNlLmtleSk7CiAgICAgIGlmIChuZXdOYW1lID09PSBjdXJyZW50TmFtZSkgewogICAgICAgIHRoaXMucmVuYW1lRXJyb3IgPSAiTmFtZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50IjsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCFuZXdOYW1lKSB7CiAgICAgICAgdGhpcy5yZW5hbWVFcnJvciA9ICJOYW1lIGNhbm5vdCBiZSBlbXB0eSI7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChuZXdOYW1lLmluY2x1ZGVzKCIvIikpIHsKICAgICAgICB0aGlzLnJlbmFtZUVycm9yID0gJ05hbWUgY2Fubm90IGNvbnRhaW4gIi8iJzsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5yZW5hbWVJblByb2dyZXNzID0gdHJ1ZTsKICAgICAgdGhpcy5yZW5hbWVFcnJvciA9IG51bGw7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcGFyZW50UHJlZml4ID0gZ2V0UGFyZW50UHJlZml4KHRoaXMucmVuYW1lU291cmNlLmtleSk7CiAgICAgICAgY29uc3QgbmV3S2V5ID0gcGFyZW50UHJlZml4ICsgbmV3TmFtZSArICh0aGlzLnJlbmFtZVNvdXJjZS5pc0ZvbGRlciA/ICIvIiA6ICIiKTsKICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgIGlmICh0aGlzLnJlbmFtZVNvdXJjZS5pc0ZvbGRlcikgewogICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhUHJvdmlkZXIubW92ZVByZWZpeCh0aGlzLmJ1Y2tldE5hbWUsIHRoaXMucmVuYW1lU291cmNlLmtleSwgbmV3S2V5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhUHJvdmlkZXIubW92ZU9iamVjdCh0aGlzLmJ1Y2tldE5hbWUsIHRoaXMucmVuYW1lU291cmNlLmtleSwgbmV3S2V5KTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7CiAgICAgICAgICB0aGlzLmNsb3NlUmVuYW1lRGlhbG9nKCk7CiAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hBbGxDb2x1bW5zKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMucmVuYW1lRXJyb3IgPSByZXN1bHQuZXJyb3IgfHwgIlJlbmFtZSBmYWlsZWQiOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgdGhpcy5yZW5hbWVFcnJvciA9IGBFcnJvcjogJHtlcnJ9YDsKICAgICAgfQogICAgICB0aGlzLnJlbmFtZUluUHJvZ3Jlc3MgPSBmYWxzZTsKICAgIH0KICAgIGNsb3NlUmVuYW1lRGlhbG9nKCkgewogICAgICB0aGlzLnNob3dSZW5hbWVEaWFsb2cgPSBmYWxzZTsKICAgICAgdGhpcy5yZW5hbWVTb3VyY2UgPSBudWxsOwogICAgICB0aGlzLnJlbmFtZU5hbWUgPSAiIjsKICAgICAgdGhpcy5yZW5hbWVFcnJvciA9IG51bGw7CiAgICAgIHRoaXMucmVuYW1lSW5Qcm9ncmVzcyA9IGZhbHNlOwogICAgfQogICAgcmVuZGVyUmVuYW1lRGlhbG9nKCkgewogICAgICBpZiAoIXRoaXMuc2hvd1JlbmFtZURpYWxvZyB8fCAhdGhpcy5yZW5hbWVTb3VyY2UpCiAgICAgICAgcmV0dXJuICIiOwogICAgICBjb25zdCBpc0ZvbGRlciA9IHRoaXMucmVuYW1lU291cmNlLmlzRm9sZGVyOwogICAgICBjb25zdCB0aXRsZSA9IGlzRm9sZGVyID8gIlJlbmFtZSBGb2xkZXIiIDogIlJlbmFtZSBGaWxlIjsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctb3ZlcmxheSIgQGNsaWNrPSR7KCkgPT4gdGhpcy5jbG9zZVJlbmFtZURpYWxvZygpfT4KICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ciIEBjbGljaz0keyhlMTEpID0+IGUxMS5zdG9wUHJvcGFnYXRpb24oKX0+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPiR7dGl0bGV9PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctbG9jYXRpb24iPgogICAgICAgICAgICBMb2NhdGlvbjogJHt0aGlzLmJ1Y2tldE5hbWV9LyR7Z2V0UGFyZW50UHJlZml4KHRoaXMucmVuYW1lU291cmNlLmtleSl9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICR7dGhpcy5yZW5hbWVFcnJvciA/IGIyYDxkaXYgY2xhc3M9Im1vdmUtZXJyb3IiPiR7dGhpcy5yZW5hbWVFcnJvcn08L2Rpdj5gIDogIiJ9CiAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgdHlwZT0idGV4dCIKICAgICAgICAgICAgY2xhc3M9ImRpYWxvZy1pbnB1dCByZW5hbWUtZGlhbG9nLWlucHV0IgogICAgICAgICAgICBwbGFjZWhvbGRlcj0ke2lzRm9sZGVyID8gImZvbGRlci1uYW1lIiA6ICJmaWxlbmFtZS5leHQifQogICAgICAgICAgICAudmFsdWU9JHt0aGlzLnJlbmFtZU5hbWV9CiAgICAgICAgICAgIEBpbnB1dD0keyhlMTEpID0+IHsKICAgICAgICB0aGlzLnJlbmFtZU5hbWUgPSBlMTEudGFyZ2V0LnZhbHVlOwogICAgICAgIHRoaXMucmVuYW1lRXJyb3IgPSBudWxsOwogICAgICB9fQogICAgICAgICAgICBAa2V5ZG93bj0keyhlMTEpID0+IHsKICAgICAgICBpZiAoZTExLmtleSA9PT0gIkVudGVyIikKICAgICAgICAgIHRoaXMuZXhlY3V0ZVJlbmFtZSgpOwogICAgICAgIGlmIChlMTEua2V5ID09PSAiRXNjYXBlIikKICAgICAgICAgIHRoaXMuY2xvc2VSZW5hbWVEaWFsb2coKTsKICAgICAgfX0KICAgICAgICAgIC8+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctYWN0aW9ucyI+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRpYWxvZy1idG4gZGlhbG9nLWJ0bi1jYW5jZWwiCiAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5jbG9zZVJlbmFtZURpYWxvZygpfQogICAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD0ke3RoaXMucmVuYW1lSW5Qcm9ncmVzc30+Q2FuY2VsPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRpYWxvZy1idG4gZGlhbG9nLWJ0bi1jcmVhdGUiCiAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5leGVjdXRlUmVuYW1lKCl9CiAgICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7dGhpcy5yZW5hbWVJblByb2dyZXNzIHx8ICF0aGlzLnJlbmFtZU5hbWUudHJpbSgpfT4KICAgICAgICAgICAgICAke3RoaXMucmVuYW1lSW5Qcm9ncmVzcyA/ICJSZW5hbWluZy4uLiIgOiAiUmVuYW1lIn0KICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgcmVuZGVyTW92ZURpYWxvZygpIHsKICAgICAgaWYgKCF0aGlzLnNob3dNb3ZlRGlhbG9nIHx8ICF0aGlzLm1vdmVTb3VyY2UpCiAgICAgICAgcmV0dXJuICIiOwogICAgICBjb25zdCBzb3VyY2VOYW1lID0gZ2V0RmlsZU5hbWUodGhpcy5tb3ZlU291cmNlLmtleSk7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLW92ZXJsYXkiIEBjbGljaz0keygpID0+IHRoaXMuY2xvc2VNb3ZlRGlhbG9nKCl9PgogICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZyIgQGNsaWNrPSR7KGUxMSkgPT4gZTExLnN0b3BQcm9wYWdhdGlvbigpfT4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+TW92ZSAke3RoaXMubW92ZVNvdXJjZS5pc0ZvbGRlciA/ICJGb2xkZXIiIDogIkZpbGUifTwvZGl2PgoKICAgICAgICAgICR7dGhpcy5tb3ZlRXJyb3IgPyBiMmAKICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW92ZS1lcnJvciI+JHt0aGlzLm1vdmVFcnJvcn08L2Rpdj4KICAgICAgICAgIGAgOiBiMmAKICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW92ZS1zdW1tYXJ5Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb3ZlLWl0ZW0iPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1vdmUtbGFiZWwiPkZyb206PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1vdmUtcGF0aCI+JHt0aGlzLm1vdmVTb3VyY2Uua2V5fTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb3ZlLWl0ZW0iPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1vdmUtbGFiZWwiPlRvOjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtb3ZlLXBhdGgiPiR7dGhpcy5tb3ZlRGVzdGluYXRpb259JHtzb3VyY2VOYW1lfTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgfQoKICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy1hY3Rpb25zIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGlhbG9nLWJ0biBkaWFsb2ctYnRuLWNhbmNlbCIKICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmNsb3NlTW92ZURpYWxvZygpfQogICAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD0ke3RoaXMubW92ZUluUHJvZ3Jlc3N9PgogICAgICAgICAgICAgIENhbmNlbAogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgJHshdGhpcy5tb3ZlRXJyb3IgPyBiMmAKICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkaWFsb2ctYnRuIGRpYWxvZy1idG4tY3JlYXRlIgogICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5leGVjdXRlTW92ZSgpfQogICAgICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7dGhpcy5tb3ZlSW5Qcm9ncmVzc30+CiAgICAgICAgICAgICAgICAke3RoaXMubW92ZUluUHJvZ3Jlc3MgPyAiTW92aW5nLi4uIiA6ICJNb3ZlIn0KICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgYCA6ICIifQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlck1vdmVQaWNrZXJEaWFsb2coKSB7CiAgICAgIGlmICghdGhpcy5zaG93TW92ZVBpY2tlckRpYWxvZyB8fCAhdGhpcy5tb3ZlUGlja2VyU291cmNlKQogICAgICAgIHJldHVybiAiIjsKICAgICAgY29uc3Qgc291cmNlTmFtZSA9IGdldEZpbGVOYW1lKHRoaXMubW92ZVBpY2tlclNvdXJjZS5rZXkpOwogICAgICBjb25zdCBzb3VyY2VQYXJlbnQgPSBnZXRQYXJlbnRQcmVmaXgodGhpcy5tb3ZlUGlja2VyU291cmNlLmtleSk7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLW92ZXJsYXkiIEBjbGljaz0keygpID0+IHRoaXMuY2xvc2VNb3ZlUGlja2VyRGlhbG9nKCl9PgogICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZyBtb3ZlLXBpY2tlci1kaWFsb2ciIEBjbGljaz0keyhlMTEpID0+IGUxMS5zdG9wUHJvcGFnYXRpb24oKX0+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPk1vdmUgIiR7c291cmNlTmFtZX0iIHRvLi4uPC9kaXY+CgogICAgICAgICAgPGRpdiBjbGFzcz0icGlja2VyLWJyZWFkY3J1bWIiPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0icGlja2VyLWNydW1iIiBAY2xpY2s9JHsoKSA9PiB0aGlzLm5hdmlnYXRlTW92ZVBpY2tlcigiIil9PgogICAgICAgICAgICAgICR7dGhpcy5idWNrZXROYW1lfQogICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICR7Z2V0UGF0aFNlZ21lbnRzKHRoaXMubW92ZVBpY2tlckN1cnJlbnRQcmVmaXgpLm1hcCgoc2VnKSA9PiBiMmAKICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icGlja2VyLXNlcGFyYXRvciI+Lzwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icGlja2VyLWNydW1iIiBAY2xpY2s9JHsoKSA9PiB0aGlzLm5hdmlnYXRlTW92ZVBpY2tlcihzZWcpfT4KICAgICAgICAgICAgICAgICR7Z2V0RmlsZU5hbWUoc2VnKX0KICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgIGApfQogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPGRpdiBjbGFzcz0icGlja2VyLWxpc3QiPgogICAgICAgICAgICAke3RoaXMubW92ZVBpY2tlckxvYWRpbmcgPyBiMmA8ZGl2IGNsYXNzPSJwaWNrZXItZW1wdHkiPkxvYWRpbmcuLi48L2Rpdj5gIDogIiJ9CiAgICAgICAgICAgICR7IXRoaXMubW92ZVBpY2tlckxvYWRpbmcgJiYgdGhpcy5tb3ZlUGlja2VyUHJlZml4ZXMuZmlsdGVyKChwOCkgPT4gcDggIT09IHRoaXMubW92ZVBpY2tlclNvdXJjZS5rZXkpLmxlbmd0aCA9PT0gMCA/IGIyYAogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBpY2tlci1lbXB0eSI+Tm8gc3ViZm9sZGVyczwvZGl2PgogICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgICR7dGhpcy5tb3ZlUGlja2VyUHJlZml4ZXMuZmlsdGVyKChwOCkgPT4gcDggIT09IHRoaXMubW92ZVBpY2tlclNvdXJjZS5rZXkpLm1hcCgocHJlZml4NCkgPT4gYjJgCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwaWNrZXItaXRlbSIKICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5uYXZpZ2F0ZU1vdmVQaWNrZXIocHJlZml4NCl9CiAgICAgICAgICAgICAgICAgICAgIEBkYmxjbGljaz0keygpID0+IHRoaXMuc2VsZWN0TW92ZURlc3RpbmF0aW9uKHByZWZpeDQpfT4KICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJjdXJyZW50Q29sb3IiPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMiAxOWEyIDIgMCAwIDEtMiAySDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoNWwyIDNoOWEyIDIgMCAwIDEgMiAyeiIvPgogICAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im5hbWUiPiR7Z2V0RmlsZU5hbWUocHJlZml4NCl9PC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgYCl9CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctYWN0aW9ucyI+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRpYWxvZy1idG4gZGlhbG9nLWJ0bi1jYW5jZWwiIEBjbGljaz0keygpID0+IHRoaXMuY2xvc2VNb3ZlUGlja2VyRGlhbG9nKCl9PgogICAgICAgICAgICAgIENhbmNlbAogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGlhbG9nLWJ0biBkaWFsb2ctYnRuLWNyZWF0ZSIKICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNlbGVjdE1vdmVEZXN0aW5hdGlvbih0aGlzLm1vdmVQaWNrZXJDdXJyZW50UHJlZml4KX0KICAgICAgICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHt0aGlzLm1vdmVQaWNrZXJDdXJyZW50UHJlZml4ID09PSBzb3VyY2VQYXJlbnR9PgogICAgICAgICAgICAgIE1vdmUgSGVyZQogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBoYW5kbGVDcmVhdGUoKSB7CiAgICAgIGlmICghdGhpcy5jcmVhdGVEaWFsb2dOYW1lLnRyaW0oKSB8fCAhdGhpcy5kYXRhUHJvdmlkZXIpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBuYW1lID0gdGhpcy5jcmVhdGVEaWFsb2dOYW1lLnRyaW0oKTsKICAgICAgbGV0IHBhdGgyOwogICAgICBpZiAodGhpcy5jcmVhdGVEaWFsb2dUeXBlID09PSAiZm9sZGVyIikgewogICAgICAgIHBhdGgyID0gdGhpcy5jcmVhdGVEaWFsb2dQcmVmaXggKyBuYW1lICsgIi8ua2VlcCI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGF0aDIgPSB0aGlzLmNyZWF0ZURpYWxvZ1ByZWZpeCArIG5hbWU7CiAgICAgIH0KICAgICAgY29uc3QgZXh0ID0gbmFtZS5zcGxpdCgiLiIpLnBvcCgpPy50b0xvd2VyQ2FzZSgpIHx8ICIiOwogICAgICBjb25zdCBjb250ZW50VHlwZSA9IHRoaXMuY3JlYXRlRGlhbG9nVHlwZSA9PT0gImZpbGUiID8gZ2V0Q29udGVudFR5cGUoZXh0KSA6ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOwogICAgICBjb25zdCBjb250ZW50MyA9IHRoaXMuY3JlYXRlRGlhbG9nVHlwZSA9PT0gImZpbGUiID8gZ2V0RGVmYXVsdENvbnRlbnQoZXh0KSA6ICIiOwogICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdGhpcy5kYXRhUHJvdmlkZXIucHV0T2JqZWN0KHRoaXMuYnVja2V0TmFtZSwgcGF0aDIsIGJ0b2EoY29udGVudDMpLCBjb250ZW50VHlwZSk7CiAgICAgIGlmIChzdWNjZXNzKSB7CiAgICAgICAgdGhpcy5zaG93Q3JlYXRlRGlhbG9nID0gZmFsc2U7CiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoQ29sdW1uQnlQcmVmaXgodGhpcy5jcmVhdGVEaWFsb2dQcmVmaXgpOwogICAgICB9CiAgICB9CiAgICByZW5kZXJDcmVhdGVEaWFsb2coKSB7CiAgICAgIGlmICghdGhpcy5zaG93Q3JlYXRlRGlhbG9nKQogICAgICAgIHJldHVybiAiIjsKICAgICAgY29uc3QgaXNGb2xkZXIgPSB0aGlzLmNyZWF0ZURpYWxvZ1R5cGUgPT09ICJmb2xkZXIiOwogICAgICBjb25zdCB0aXRsZSA9IGlzRm9sZGVyID8gIkNyZWF0ZSBOZXcgRm9sZGVyIiA6ICJDcmVhdGUgTmV3IEZpbGUiOwogICAgICBjb25zdCBwbGFjZWhvbGRlciA9IGlzRm9sZGVyID8gImZvbGRlci1uYW1lIG9yIHBhdGgvdG8vZm9sZGVyIiA6ICJmaWxlbmFtZS50eHQgb3IgcGF0aC90by9maWxlLnR4dCI7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLW92ZXJsYXkiIEBjbGljaz0keygpID0+IHRoaXMuc2hvd0NyZWF0ZURpYWxvZyA9IGZhbHNlfT4KICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ciIEBjbGljaz0keyhlMTEpID0+IGUxMS5zdG9wUHJvcGFnYXRpb24oKX0+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPiR7dGl0bGV9PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctbG9jYXRpb24iPgogICAgICAgICAgICBMb2NhdGlvbjogJHt0aGlzLmJ1Y2tldE5hbWV9LyR7dGhpcy5jcmVhdGVEaWFsb2dQcmVmaXh9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICB0eXBlPSJ0ZXh0IgogICAgICAgICAgICBjbGFzcz0iZGlhbG9nLWlucHV0IgogICAgICAgICAgICBwbGFjZWhvbGRlcj0ke3BsYWNlaG9sZGVyfQogICAgICAgICAgICAudmFsdWU9JHt0aGlzLmNyZWF0ZURpYWxvZ05hbWV9CiAgICAgICAgICAgIEBpbnB1dD0keyhlMTEpID0+IHRoaXMuY3JlYXRlRGlhbG9nTmFtZSA9IGUxMS50YXJnZXQudmFsdWV9CiAgICAgICAgICAgIEBrZXlkb3duPSR7KGUxMSkgPT4gZTExLmtleSA9PT0gIkVudGVyIiAmJiB0aGlzLmhhbmRsZUNyZWF0ZSgpfQogICAgICAgICAgLz4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy1oaW50Ij4KICAgICAgICAgICAgVXNlICIvIiB0byBjcmVhdGUgbmVzdGVkICR7aXNGb2xkZXIgPyAiZm9sZGVycyIgOiAicGF0aCJ9IChlLmcuLCAke2lzRm9sZGVyID8gInBhcmVudC9jaGlsZCIgOiAiZm9sZGVyL2ZpbGUudHh0In0pCiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy1hY3Rpb25zIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGlhbG9nLWJ0biBkaWFsb2ctYnRuLWNhbmNlbCIgQGNsaWNrPSR7KCkgPT4gdGhpcy5zaG93Q3JlYXRlRGlhbG9nID0gZmFsc2V9PgogICAgICAgICAgICAgIENhbmNlbAogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgIGNsYXNzPSJkaWFsb2ctYnRuIGRpYWxvZy1idG4tY3JlYXRlIgogICAgICAgICAgICAgID9kaXNhYmxlZD0keyF0aGlzLmNyZWF0ZURpYWxvZ05hbWUudHJpbSgpfQogICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuaGFuZGxlQ3JlYXRlKCl9CiAgICAgICAgICAgID4KICAgICAgICAgICAgICBDcmVhdGUKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgcmVuZGVyKCkgewogICAgICBpZiAodGhpcy5sb2FkaW5nICYmIHRoaXMuY29sdW1ucy5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gYjJgPGRpdiBjbGFzcz0ibG9hZGluZyI+TG9hZGluZy4uLjwvZGl2PmA7CiAgICAgIH0KICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJjb2x1bW5zLWNvbnRhaW5lciI+CiAgICAgICAgJHt0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4sIGluZGV4MikgPT4gdGhpcy5yZW5kZXJDb2x1bW5XcmFwcGVyKGNvbHVtbiwgaW5kZXgyKSl9CiAgICAgIDwvZGl2PgogICAgICAke3RoaXMucmVuZGVyQ3JlYXRlRGlhbG9nKCl9CiAgICAgICR7dGhpcy5yZW5kZXJNb3ZlRGlhbG9nKCl9CiAgICAgICR7dGhpcy5yZW5kZXJNb3ZlUGlja2VyRGlhbG9nKCl9CiAgICAgICR7dGhpcy5yZW5kZXJSZW5hbWVEaWFsb2coKX0KICAgIGA7CiAgICB9CiAgICByZW5kZXJDb2x1bW5XcmFwcGVyKGNvbHVtbiwgaW5kZXgyKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iY29sdW1uLXdyYXBwZXIiPgogICAgICAgICR7dGhpcy5yZW5kZXJDb2x1bW4oY29sdW1uLCBpbmRleDIpfQogICAgICAgIDxkaXYKICAgICAgICAgIGNsYXNzPSJyZXNpemUtaGFuZGxlICR7dGhpcy5yZXNpemluZz8uY29sdW1uSW5kZXggPT09IGluZGV4MiA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgQG1vdXNlZG93bj0keyhlMTEpID0+IHRoaXMuc3RhcnRSZXNpemUoZTExLCBpbmRleDIpfQogICAgICAgID48L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgcmVuZGVyQ29sdW1uKGNvbHVtbiwgaW5kZXgyKSB7CiAgICAgIGNvbnN0IGhlYWRlck5hbWUgPSBjb2x1bW4ucHJlZml4ID8gZ2V0RmlsZU5hbWUoY29sdW1uLnByZWZpeCkgOiB0aGlzLmJ1Y2tldE5hbWU7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdgogICAgICAgIGNsYXNzPSJjb2x1bW4gJHt0aGlzLmRyYWdPdmVyQ29sdW1uSW5kZXggPT09IGluZGV4MiA/ICJkcmFnLW92ZXIiIDogIiJ9IgogICAgICAgIHN0eWxlPSJ3aWR0aDogJHtjb2x1bW4ud2lkdGh9cHgiCiAgICAgICAgQGRyYWdlbnRlcj0keyhlMTEpID0+IHRoaXMuaGFuZGxlQ29sdW1uRHJhZ0VudGVyKGUxMSwgaW5kZXgyKX0KICAgICAgICBAZHJhZ292ZXI9JHsoZTExKSA9PiB0aGlzLmhhbmRsZUNvbHVtbkRyYWdPdmVyKGUxMSl9CiAgICAgICAgQGRyYWdsZWF2ZT0keyhlMTEpID0+IHRoaXMuaGFuZGxlQ29sdW1uRHJhZ0xlYXZlKGUxMSwgaW5kZXgyKX0KICAgICAgICBAZHJvcD0keyhlMTEpID0+IHRoaXMuaGFuZGxlQ29sdW1uRHJvcChlMTEsIGluZGV4Mil9CiAgICAgID4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2x1bW4taGVhZGVyIiB0aXRsZT0ke2NvbHVtbi5wcmVmaXggfHwgdGhpcy5idWNrZXROYW1lfT4KICAgICAgICAgICR7aGVhZGVyTmFtZX0KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2x1bW4taXRlbXMiIEBjb250ZXh0bWVudT0keyhlMTEpID0+IHRoaXMuaGFuZGxlRW1wdHlTcGFjZUNvbnRleHRNZW51KGUxMSwgaW5kZXgyKX0+CiAgICAgICAgICAke2NvbHVtbi5wcmVmaXhlcy5sZW5ndGggPT09IDAgJiYgY29sdW1uLm9iamVjdHMubGVuZ3RoID09PSAwID8gYjJgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiPkVtcHR5IGZvbGRlcjwvZGl2PmAgOiAiIn0KICAgICAgICAgICR7Y29sdW1uLnByZWZpeGVzLm1hcCgocHJlZml4NCkgPT4gYjJgCiAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgY2xhc3M9ImNvbHVtbi1pdGVtIGZvbGRlciAke2NvbHVtbi5zZWxlY3RlZEl0ZW0gPT09IHByZWZpeDQgPyAic2VsZWN0ZWQiIDogIiJ9ICR7dGhpcy5kcmFnT3ZlckZvbGRlclByZWZpeCA9PT0gcHJlZml4NCA/ICJkcmFnLXRhcmdldCIgOiAiIn0iCiAgICAgICAgICAgICAgICBkcmFnZ2FibGU9InRydWUiCiAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNlbGVjdEZvbGRlcihpbmRleDIsIHByZWZpeDQpfQogICAgICAgICAgICAgICAgQGNvbnRleHRtZW51PSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVGb2xkZXJDb250ZXh0TWVudShlMTEsIGluZGV4MiwgcHJlZml4NCl9CiAgICAgICAgICAgICAgICBAZHJhZ3N0YXJ0PSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVJdGVtRHJhZ1N0YXJ0KGUxMSwgcHJlZml4NCwgdHJ1ZSl9CiAgICAgICAgICAgICAgICBAZHJhZ2VuZD0keyhlMTEpID0+IHRoaXMuaGFuZGxlSXRlbURyYWdFbmQoZTExKX0KICAgICAgICAgICAgICAgIEBkcmFnZW50ZXI9JHsoZTExKSA9PiB0aGlzLmhhbmRsZUZvbGRlckRyYWdFbnRlcihlMTEsIHByZWZpeDQpfQogICAgICAgICAgICAgICAgQGRyYWdvdmVyPSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVGb2xkZXJEcmFnT3ZlcihlMTEpfQogICAgICAgICAgICAgICAgQGRyYWdsZWF2ZT0keyhlMTEpID0+IHRoaXMuaGFuZGxlRm9sZGVyRHJhZ0xlYXZlKGUxMSwgcHJlZml4NCl9CiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJjdXJyZW50Q29sb3IiPgogICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjIgMTlhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDVsMiAzaDlhMiAyIDAgMCAxIDIgMnoiIC8+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJuYW1lIj4ke2dldEZpbGVOYW1lKHByZWZpeDQpfTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9ImNoZXZyb24iIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+CiAgICAgICAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9IjkgMTggMTUgMTIgOSA2Ij48L3BvbHlsaW5lPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIGApfQogICAgICAgICAgJHtjb2x1bW4ub2JqZWN0cy5tYXAoKG9iaikgPT4gYjJgCiAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgY2xhc3M9ImNvbHVtbi1pdGVtICR7Y29sdW1uLnNlbGVjdGVkSXRlbSA9PT0gb2JqLmtleSA/ICJzZWxlY3RlZCIgOiAiIn0iCiAgICAgICAgICAgICAgICBkcmFnZ2FibGU9InRydWUiCiAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNlbGVjdEZpbGUoaW5kZXgyLCBvYmoua2V5KX0KICAgICAgICAgICAgICAgIEBjb250ZXh0bWVudT0keyhlMTEpID0+IHRoaXMuaGFuZGxlRmlsZUNvbnRleHRNZW51KGUxMSwgaW5kZXgyLCBvYmoua2V5KX0KICAgICAgICAgICAgICAgIEBkcmFnc3RhcnQ9JHsoZTExKSA9PiB0aGlzLmhhbmRsZUl0ZW1EcmFnU3RhcnQoZTExLCBvYmoua2V5LCBmYWxzZSl9CiAgICAgICAgICAgICAgICBAZHJhZ2VuZD0keyhlMTEpID0+IHRoaXMuaGFuZGxlSXRlbURyYWdFbmQoZTExKX0KICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPgogICAgICAgICAgICAgICAgICA8cGF0aCBkPSIke3RoaXMuZ2V0RmlsZUljb24ob2JqLmtleSl9IiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibmFtZSI+JHtnZXRGaWxlTmFtZShvYmoua2V5KX08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIGApfQogICAgICAgIDwvZGl2PgogICAgICAgICR7dGhpcy5kcmFnT3ZlckNvbHVtbkluZGV4ID09PSBpbmRleDIgPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9ImRyYWctaGludCI+CiAgICAgICAgICAgICR7dGhpcy5kcmFnZ2VkSXRlbSA/IHRoaXMuZHJhZ092ZXJGb2xkZXJQcmVmaXggPyBgTW92ZSB0byAke2dldEZpbGVOYW1lKHRoaXMuZHJhZ092ZXJGb2xkZXJQcmVmaXgpfWAgOiAiTW92ZSBoZXJlIiA6IHRoaXMuZHJhZ092ZXJGb2xkZXJQcmVmaXggPyBgRHJvcCB0byB1cGxvYWQgaW50byAke2dldEZpbGVOYW1lKHRoaXMuZHJhZ092ZXJGb2xkZXJQcmVmaXgpfWAgOiAiRHJvcCB0byB1cGxvYWQgaGVyZSJ9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgIDogIiJ9CiAgICAgICAgJHt0aGlzLnVwbG9hZGluZyA/IGIyYAogICAgICAgICAgPGRpdiBjbGFzcz0idXBsb2FkLW92ZXJsYXkiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ1cGxvYWQtdGV4dCI+VXBsb2FkaW5nLi4uPC9kaXY+CiAgICAgICAgICAgICR7dGhpcy51cGxvYWRQcm9ncmVzcyA/IGIyYAogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InVwbG9hZC1wcm9ncmVzcyI+JHt0aGlzLnVwbG9hZFByb2dyZXNzLmN1cnJlbnR9IC8gJHt0aGlzLnVwbG9hZFByb2dyZXNzLnRvdGFsfSBmaWxlczwvZGl2PgogICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgIDogIiJ9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNTgoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNTdG9yYWdlQ29sdW1uczIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWRhdGF2aWV3L2RlZXMtc3RvcmFnZS1icm93c2VyL2RlZXMtc3RvcmFnZS1rZXlzLmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTU4ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM1OSA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1N0b3JhZ2VLZXlzID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLXN0b3JhZ2Uta2V5cyIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX2RhdGFQcm92aWRlcl9kZWNvcmF0b3JzOwogIGxldCBfZGF0YVByb3ZpZGVyX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGF0YVByb3ZpZGVyX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9idWNrZXROYW1lX2RlY29yYXRvcnM7CiAgbGV0IF9idWNrZXROYW1lX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYnVja2V0TmFtZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VycmVudFByZWZpeF9kZWNvcmF0b3JzOwogIGxldCBfY3VycmVudFByZWZpeF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2N1cnJlbnRQcmVmaXhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlZnJlc2hLZXlfZGVjb3JhdG9yczsKICBsZXQgX3JlZnJlc2hLZXlfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZWZyZXNoS2V5X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hbGxLZXlzX2RlY29yYXRvcnM7CiAgbGV0IF9hbGxLZXlzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWxsS2V5c19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcHJlZml4ZXNfZGVjb3JhdG9yczsKICBsZXQgX3ByZWZpeGVzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcHJlZml4ZXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xvYWRpbmdfZGVjb3JhdG9yczsKICBsZXQgX2xvYWRpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZEtleV9kZWNvcmF0b3JzOwogIGxldCBfc2VsZWN0ZWRLZXlfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZEtleV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZmlsdGVyVGV4dF9kZWNvcmF0b3JzOwogIGxldCBfZmlsdGVyVGV4dF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ZpbHRlclRleHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dDcmVhdGVEaWFsb2dfZGVjb3JhdG9yczsKICBsZXQgX3Nob3dDcmVhdGVEaWFsb2dfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93Q3JlYXRlRGlhbG9nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jcmVhdGVEaWFsb2dUeXBlX2RlY29yYXRvcnM7CiAgbGV0IF9jcmVhdGVEaWFsb2dUeXBlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3JlYXRlRGlhbG9nVHlwZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3JlYXRlRGlhbG9nUHJlZml4X2RlY29yYXRvcnM7CiAgbGV0IF9jcmVhdGVEaWFsb2dQcmVmaXhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jcmVhdGVEaWFsb2dQcmVmaXhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NyZWF0ZURpYWxvZ05hbWVfZGVjb3JhdG9yczsKICBsZXQgX2NyZWF0ZURpYWxvZ05hbWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jcmVhdGVEaWFsb2dOYW1lX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93TW92ZURpYWxvZ19kZWNvcmF0b3JzOwogIGxldCBfc2hvd01vdmVEaWFsb2dfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93TW92ZURpYWxvZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW92ZVNvdXJjZV9kZWNvcmF0b3JzOwogIGxldCBfbW92ZVNvdXJjZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21vdmVTb3VyY2VfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21vdmVEZXN0aW5hdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfbW92ZURlc3RpbmF0aW9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW92ZURlc3RpbmF0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tb3ZlSW5Qcm9ncmVzc19kZWNvcmF0b3JzOwogIGxldCBfbW92ZUluUHJvZ3Jlc3NfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tb3ZlSW5Qcm9ncmVzc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW92ZUVycm9yX2RlY29yYXRvcnM7CiAgbGV0IF9tb3ZlRXJyb3JfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tb3ZlRXJyb3JfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dNb3ZlUGlja2VyRGlhbG9nX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93TW92ZVBpY2tlckRpYWxvZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dNb3ZlUGlja2VyRGlhbG9nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tb3ZlUGlja2VyU291cmNlX2RlY29yYXRvcnM7CiAgbGV0IF9tb3ZlUGlja2VyU291cmNlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW92ZVBpY2tlclNvdXJjZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW92ZVBpY2tlckN1cnJlbnRQcmVmaXhfZGVjb3JhdG9yczsKICBsZXQgX21vdmVQaWNrZXJDdXJyZW50UHJlZml4X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW92ZVBpY2tlckN1cnJlbnRQcmVmaXhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21vdmVQaWNrZXJQcmVmaXhlc19kZWNvcmF0b3JzOwogIGxldCBfbW92ZVBpY2tlclByZWZpeGVzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW92ZVBpY2tlclByZWZpeGVzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tb3ZlUGlja2VyTG9hZGluZ19kZWNvcmF0b3JzOwogIGxldCBfbW92ZVBpY2tlckxvYWRpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tb3ZlUGlja2VyTG9hZGluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1JlbmFtZURpYWxvZ19kZWNvcmF0b3JzOwogIGxldCBfc2hvd1JlbmFtZURpYWxvZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dSZW5hbWVEaWFsb2dfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlbmFtZVNvdXJjZV9kZWNvcmF0b3JzOwogIGxldCBfcmVuYW1lU291cmNlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVuYW1lU291cmNlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZW5hbWVOYW1lX2RlY29yYXRvcnM7CiAgbGV0IF9yZW5hbWVOYW1lX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVuYW1lTmFtZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVuYW1lSW5Qcm9ncmVzc19kZWNvcmF0b3JzOwogIGxldCBfcmVuYW1lSW5Qcm9ncmVzc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlbmFtZUluUHJvZ3Jlc3NfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlbmFtZUVycm9yX2RlY29yYXRvcnM7CiAgbGV0IF9yZW5hbWVFcnJvcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlbmFtZUVycm9yX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNTdG9yYWdlS2V5czIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9kYXRhUHJvdmlkZXJfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF9idWNrZXROYW1lX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfY3VycmVudFByZWZpeF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3JlZnJlc2hLZXlfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF9hbGxLZXlzX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9wcmVmaXhlc19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfbG9hZGluZ19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfc2VsZWN0ZWRLZXlfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2ZpbHRlclRleHRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3Nob3dDcmVhdGVEaWFsb2dfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2NyZWF0ZURpYWxvZ1R5cGVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2NyZWF0ZURpYWxvZ1ByZWZpeF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfY3JlYXRlRGlhbG9nTmFtZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfc2hvd01vdmVEaWFsb2dfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX21vdmVTb3VyY2VfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX21vdmVEZXN0aW5hdGlvbl9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfbW92ZUluUHJvZ3Jlc3NfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX21vdmVFcnJvcl9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfc2hvd01vdmVQaWNrZXJEaWFsb2dfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX21vdmVQaWNrZXJTb3VyY2VfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX21vdmVQaWNrZXJDdXJyZW50UHJlZml4X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9tb3ZlUGlja2VyUHJlZml4ZXNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX21vdmVQaWNrZXJMb2FkaW5nX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9zaG93UmVuYW1lRGlhbG9nX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9yZW5hbWVTb3VyY2VfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3JlbmFtZU5hbWVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3JlbmFtZUluUHJvZ3Jlc3NfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3JlbmFtZUVycm9yX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTU4KHRoaXMsIG51bGwsIF9kYXRhUHJvdmlkZXJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZGF0YVByb3ZpZGVyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkYXRhUHJvdmlkZXIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZGF0YVByb3ZpZGVyLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kYXRhUHJvdmlkZXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZGF0YVByb3ZpZGVyX2luaXRpYWxpemVycywgX2RhdGFQcm92aWRlcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU4KHRoaXMsIG51bGwsIF9idWNrZXROYW1lX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImJ1Y2tldE5hbWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImJ1Y2tldE5hbWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYnVja2V0TmFtZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYnVja2V0TmFtZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9idWNrZXROYW1lX2luaXRpYWxpemVycywgX2J1Y2tldE5hbWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1OCh0aGlzLCBudWxsLCBfY3VycmVudFByZWZpeF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjdXJyZW50UHJlZml4Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjdXJyZW50UHJlZml4IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmN1cnJlbnRQcmVmaXgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmN1cnJlbnRQcmVmaXggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY3VycmVudFByZWZpeF9pbml0aWFsaXplcnMsIF9jdXJyZW50UHJlZml4X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTgodGhpcywgbnVsbCwgX3JlZnJlc2hLZXlfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicmVmcmVzaEtleSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicmVmcmVzaEtleSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5yZWZyZXNoS2V5LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yZWZyZXNoS2V5ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3JlZnJlc2hLZXlfaW5pdGlhbGl6ZXJzLCBfcmVmcmVzaEtleV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU4KHRoaXMsIG51bGwsIF9hbGxLZXlzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFsbEtleXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFsbEtleXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWxsS2V5cywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYWxsS2V5cyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hbGxLZXlzX2luaXRpYWxpemVycywgX2FsbEtleXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1OCh0aGlzLCBudWxsLCBfcHJlZml4ZXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicHJlZml4ZXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInByZWZpeGVzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnByZWZpeGVzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5wcmVmaXhlcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wcmVmaXhlc19pbml0aWFsaXplcnMsIF9wcmVmaXhlc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU4KHRoaXMsIG51bGwsIF9sb2FkaW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxvYWRpbmciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImxvYWRpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubG9hZGluZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubG9hZGluZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9sb2FkaW5nX2luaXRpYWxpemVycywgX2xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1OCh0aGlzLCBudWxsLCBfc2VsZWN0ZWRLZXlfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0ZWRLZXkiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNlbGVjdGVkS2V5IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGVkS2V5LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3RlZEtleSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zZWxlY3RlZEtleV9pbml0aWFsaXplcnMsIF9zZWxlY3RlZEtleV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU4KHRoaXMsIG51bGwsIF9maWx0ZXJUZXh0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImZpbHRlclRleHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZpbHRlclRleHQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZmlsdGVyVGV4dCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZmlsdGVyVGV4dCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9maWx0ZXJUZXh0X2luaXRpYWxpemVycywgX2ZpbHRlclRleHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1OCh0aGlzLCBudWxsLCBfc2hvd0NyZWF0ZURpYWxvZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93Q3JlYXRlRGlhbG9nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93Q3JlYXRlRGlhbG9nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dDcmVhdGVEaWFsb2csIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dDcmVhdGVEaWFsb2cgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd0NyZWF0ZURpYWxvZ19pbml0aWFsaXplcnMsIF9zaG93Q3JlYXRlRGlhbG9nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTgodGhpcywgbnVsbCwgX2NyZWF0ZURpYWxvZ1R5cGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY3JlYXRlRGlhbG9nVHlwZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3JlYXRlRGlhbG9nVHlwZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jcmVhdGVEaWFsb2dUeXBlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jcmVhdGVEaWFsb2dUeXBlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NyZWF0ZURpYWxvZ1R5cGVfaW5pdGlhbGl6ZXJzLCBfY3JlYXRlRGlhbG9nVHlwZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU4KHRoaXMsIG51bGwsIF9jcmVhdGVEaWFsb2dQcmVmaXhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY3JlYXRlRGlhbG9nUHJlZml4Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjcmVhdGVEaWFsb2dQcmVmaXgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3JlYXRlRGlhbG9nUHJlZml4LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jcmVhdGVEaWFsb2dQcmVmaXggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY3JlYXRlRGlhbG9nUHJlZml4X2luaXRpYWxpemVycywgX2NyZWF0ZURpYWxvZ1ByZWZpeF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU4KHRoaXMsIG51bGwsIF9jcmVhdGVEaWFsb2dOYW1lX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNyZWF0ZURpYWxvZ05hbWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNyZWF0ZURpYWxvZ05hbWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3JlYXRlRGlhbG9nTmFtZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY3JlYXRlRGlhbG9nTmFtZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jcmVhdGVEaWFsb2dOYW1lX2luaXRpYWxpemVycywgX2NyZWF0ZURpYWxvZ05hbWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1OCh0aGlzLCBudWxsLCBfc2hvd01vdmVEaWFsb2dfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2hvd01vdmVEaWFsb2ciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNob3dNb3ZlRGlhbG9nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dNb3ZlRGlhbG9nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaG93TW92ZURpYWxvZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93TW92ZURpYWxvZ19pbml0aWFsaXplcnMsIF9zaG93TW92ZURpYWxvZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU4KHRoaXMsIG51bGwsIF9tb3ZlU291cmNlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1vdmVTb3VyY2UiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1vdmVTb3VyY2UiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubW92ZVNvdXJjZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubW92ZVNvdXJjZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tb3ZlU291cmNlX2luaXRpYWxpemVycywgX21vdmVTb3VyY2VfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1OCh0aGlzLCBudWxsLCBfbW92ZURlc3RpbmF0aW9uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1vdmVEZXN0aW5hdGlvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibW92ZURlc3RpbmF0aW9uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1vdmVEZXN0aW5hdGlvbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubW92ZURlc3RpbmF0aW9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21vdmVEZXN0aW5hdGlvbl9pbml0aWFsaXplcnMsIF9tb3ZlRGVzdGluYXRpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1OCh0aGlzLCBudWxsLCBfbW92ZUluUHJvZ3Jlc3NfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibW92ZUluUHJvZ3Jlc3MiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1vdmVJblByb2dyZXNzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1vdmVJblByb2dyZXNzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tb3ZlSW5Qcm9ncmVzcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tb3ZlSW5Qcm9ncmVzc19pbml0aWFsaXplcnMsIF9tb3ZlSW5Qcm9ncmVzc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU4KHRoaXMsIG51bGwsIF9tb3ZlRXJyb3JfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibW92ZUVycm9yIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtb3ZlRXJyb3IiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubW92ZUVycm9yLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tb3ZlRXJyb3IgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbW92ZUVycm9yX2luaXRpYWxpemVycywgX21vdmVFcnJvcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU4KHRoaXMsIG51bGwsIF9zaG93TW92ZVBpY2tlckRpYWxvZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93TW92ZVBpY2tlckRpYWxvZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd01vdmVQaWNrZXJEaWFsb2ciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2hvd01vdmVQaWNrZXJEaWFsb2csIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dNb3ZlUGlja2VyRGlhbG9nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dNb3ZlUGlja2VyRGlhbG9nX2luaXRpYWxpemVycywgX3Nob3dNb3ZlUGlja2VyRGlhbG9nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTgodGhpcywgbnVsbCwgX21vdmVQaWNrZXJTb3VyY2VfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibW92ZVBpY2tlclNvdXJjZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibW92ZVBpY2tlclNvdXJjZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tb3ZlUGlja2VyU291cmNlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tb3ZlUGlja2VyU291cmNlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21vdmVQaWNrZXJTb3VyY2VfaW5pdGlhbGl6ZXJzLCBfbW92ZVBpY2tlclNvdXJjZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU4KHRoaXMsIG51bGwsIF9tb3ZlUGlja2VyQ3VycmVudFByZWZpeF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtb3ZlUGlja2VyQ3VycmVudFByZWZpeCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibW92ZVBpY2tlckN1cnJlbnRQcmVmaXgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubW92ZVBpY2tlckN1cnJlbnRQcmVmaXgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1vdmVQaWNrZXJDdXJyZW50UHJlZml4ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21vdmVQaWNrZXJDdXJyZW50UHJlZml4X2luaXRpYWxpemVycywgX21vdmVQaWNrZXJDdXJyZW50UHJlZml4X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTgodGhpcywgbnVsbCwgX21vdmVQaWNrZXJQcmVmaXhlc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtb3ZlUGlja2VyUHJlZml4ZXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1vdmVQaWNrZXJQcmVmaXhlcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tb3ZlUGlja2VyUHJlZml4ZXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1vdmVQaWNrZXJQcmVmaXhlcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tb3ZlUGlja2VyUHJlZml4ZXNfaW5pdGlhbGl6ZXJzLCBfbW92ZVBpY2tlclByZWZpeGVzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTgodGhpcywgbnVsbCwgX21vdmVQaWNrZXJMb2FkaW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm1vdmVQaWNrZXJMb2FkaW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtb3ZlUGlja2VyTG9hZGluZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tb3ZlUGlja2VyTG9hZGluZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubW92ZVBpY2tlckxvYWRpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbW92ZVBpY2tlckxvYWRpbmdfaW5pdGlhbGl6ZXJzLCBfbW92ZVBpY2tlckxvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1OCh0aGlzLCBudWxsLCBfc2hvd1JlbmFtZURpYWxvZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93UmVuYW1lRGlhbG9nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93UmVuYW1lRGlhbG9nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dSZW5hbWVEaWFsb2csIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dSZW5hbWVEaWFsb2cgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd1JlbmFtZURpYWxvZ19pbml0aWFsaXplcnMsIF9zaG93UmVuYW1lRGlhbG9nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTgodGhpcywgbnVsbCwgX3JlbmFtZVNvdXJjZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJyZW5hbWVTb3VyY2UiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInJlbmFtZVNvdXJjZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5yZW5hbWVTb3VyY2UsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnJlbmFtZVNvdXJjZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9yZW5hbWVTb3VyY2VfaW5pdGlhbGl6ZXJzLCBfcmVuYW1lU291cmNlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTgodGhpcywgbnVsbCwgX3JlbmFtZU5hbWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicmVuYW1lTmFtZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicmVuYW1lTmFtZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5yZW5hbWVOYW1lLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yZW5hbWVOYW1lID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3JlbmFtZU5hbWVfaW5pdGlhbGl6ZXJzLCBfcmVuYW1lTmFtZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU4KHRoaXMsIG51bGwsIF9yZW5hbWVJblByb2dyZXNzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJlbmFtZUluUHJvZ3Jlc3MiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInJlbmFtZUluUHJvZ3Jlc3MiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucmVuYW1lSW5Qcm9ncmVzcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucmVuYW1lSW5Qcm9ncmVzcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9yZW5hbWVJblByb2dyZXNzX2luaXRpYWxpemVycywgX3JlbmFtZUluUHJvZ3Jlc3NfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1OCh0aGlzLCBudWxsLCBfcmVuYW1lRXJyb3JfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicmVuYW1lRXJyb3IiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInJlbmFtZUVycm9yIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJlbmFtZUVycm9yLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yZW5hbWVFcnJvciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9yZW5hbWVFcnJvcl9pbml0aWFsaXplcnMsIF9yZW5hbWVFcnJvcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU4KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1N0b3JhZ2VLZXlzMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAjZGF0YVByb3ZpZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9kYXRhUHJvdmlkZXJfaW5pdGlhbGl6ZXJzLCBudWxsKTsKICAgIGdldCBkYXRhUHJvdmlkZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNkYXRhUHJvdmlkZXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkYXRhUHJvdmlkZXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI2RhdGFQcm92aWRlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2J1Y2tldE5hbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9kYXRhUHJvdmlkZXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9idWNrZXROYW1lX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBidWNrZXROYW1lKCkgewogICAgICByZXR1cm4gdGhpcy4jYnVja2V0TmFtZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGJ1Y2tldE5hbWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2J1Y2tldE5hbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjdXJyZW50UHJlZml4X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfYnVja2V0TmFtZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX2N1cnJlbnRQcmVmaXhfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGN1cnJlbnRQcmVmaXgoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjdXJyZW50UHJlZml4X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY3VycmVudFByZWZpeCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY3VycmVudFByZWZpeF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3JlZnJlc2hLZXlfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9jdXJyZW50UHJlZml4X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfcmVmcmVzaEtleV9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCByZWZyZXNoS2V5KCkgewogICAgICByZXR1cm4gdGhpcy4jcmVmcmVzaEtleV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHJlZnJlc2hLZXkodmFsdWUyKSB7CiAgICAgIHRoaXMuI3JlZnJlc2hLZXlfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhbGxLZXlzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfcmVmcmVzaEtleV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX2FsbEtleXNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IGFsbEtleXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhbGxLZXlzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYWxsS2V5cyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYWxsS2V5c19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3ByZWZpeGVzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfYWxsS2V5c19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX3ByZWZpeGVzX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBwcmVmaXhlcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ByZWZpeGVzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcHJlZml4ZXModmFsdWUyKSB7CiAgICAgIHRoaXMuI3ByZWZpeGVzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX3ByZWZpeGVzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfbG9hZGluZ19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgbG9hZGluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsb2FkaW5nKHZhbHVlMikgewogICAgICB0aGlzLiNsb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0ZWRLZXlfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9sb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfc2VsZWN0ZWRLZXlfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IHNlbGVjdGVkS2V5KCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRLZXlfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3RlZEtleSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VsZWN0ZWRLZXlfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNmaWx0ZXJUZXh0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfc2VsZWN0ZWRLZXlfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9maWx0ZXJUZXh0X2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBmaWx0ZXJUZXh0KCkgewogICAgICByZXR1cm4gdGhpcy4jZmlsdGVyVGV4dF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGZpbHRlclRleHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2ZpbHRlclRleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93Q3JlYXRlRGlhbG9nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfZmlsdGVyVGV4dF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX3Nob3dDcmVhdGVEaWFsb2dfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHNob3dDcmVhdGVEaWFsb2coKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93Q3JlYXRlRGlhbG9nX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd0NyZWF0ZURpYWxvZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2hvd0NyZWF0ZURpYWxvZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NyZWF0ZURpYWxvZ1R5cGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9zaG93Q3JlYXRlRGlhbG9nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfY3JlYXRlRGlhbG9nVHlwZV9pbml0aWFsaXplcnMsICJmb2xkZXIiKSk7CiAgICBnZXQgY3JlYXRlRGlhbG9nVHlwZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NyZWF0ZURpYWxvZ1R5cGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjcmVhdGVEaWFsb2dUeXBlKHZhbHVlMikgewogICAgICB0aGlzLiNjcmVhdGVEaWFsb2dUeXBlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY3JlYXRlRGlhbG9nUHJlZml4X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfY3JlYXRlRGlhbG9nVHlwZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX2NyZWF0ZURpYWxvZ1ByZWZpeF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgY3JlYXRlRGlhbG9nUHJlZml4KCkgewogICAgICByZXR1cm4gdGhpcy4jY3JlYXRlRGlhbG9nUHJlZml4X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY3JlYXRlRGlhbG9nUHJlZml4KHZhbHVlMikgewogICAgICB0aGlzLiNjcmVhdGVEaWFsb2dQcmVmaXhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjcmVhdGVEaWFsb2dOYW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfY3JlYXRlRGlhbG9nUHJlZml4X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfY3JlYXRlRGlhbG9nTmFtZV9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgY3JlYXRlRGlhbG9nTmFtZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NyZWF0ZURpYWxvZ05hbWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjcmVhdGVEaWFsb2dOYW1lKHZhbHVlMikgewogICAgICB0aGlzLiNjcmVhdGVEaWFsb2dOYW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd01vdmVEaWFsb2dfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9jcmVhdGVEaWFsb2dOYW1lX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfc2hvd01vdmVEaWFsb2dfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgLy8gTW92ZSBkaWFsb2cgc3RhdGUKICAgIGdldCBzaG93TW92ZURpYWxvZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dNb3ZlRGlhbG9nX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd01vdmVEaWFsb2codmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dNb3ZlRGlhbG9nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbW92ZVNvdXJjZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX3Nob3dNb3ZlRGlhbG9nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfbW92ZVNvdXJjZV9pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIGdldCBtb3ZlU291cmNlKCkgewogICAgICByZXR1cm4gdGhpcy4jbW92ZVNvdXJjZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1vdmVTb3VyY2UodmFsdWUyKSB7CiAgICAgIHRoaXMuI21vdmVTb3VyY2VfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtb3ZlRGVzdGluYXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9tb3ZlU291cmNlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfbW92ZURlc3RpbmF0aW9uX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBtb3ZlRGVzdGluYXRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNtb3ZlRGVzdGluYXRpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtb3ZlRGVzdGluYXRpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI21vdmVEZXN0aW5hdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21vdmVJblByb2dyZXNzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfbW92ZURlc3RpbmF0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfbW92ZUluUHJvZ3Jlc3NfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IG1vdmVJblByb2dyZXNzKCkgewogICAgICByZXR1cm4gdGhpcy4jbW92ZUluUHJvZ3Jlc3NfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtb3ZlSW5Qcm9ncmVzcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbW92ZUluUHJvZ3Jlc3NfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtb3ZlRXJyb3JfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9tb3ZlSW5Qcm9ncmVzc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX21vdmVFcnJvcl9pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIGdldCBtb3ZlRXJyb3IoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtb3ZlRXJyb3JfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtb3ZlRXJyb3IodmFsdWUyKSB7CiAgICAgIHRoaXMuI21vdmVFcnJvcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dNb3ZlUGlja2VyRGlhbG9nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfbW92ZUVycm9yX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfc2hvd01vdmVQaWNrZXJEaWFsb2dfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgLy8gTW92ZSBwaWNrZXIgZGlhbG9nIHN0YXRlCiAgICBnZXQgc2hvd01vdmVQaWNrZXJEaWFsb2coKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93TW92ZVBpY2tlckRpYWxvZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dNb3ZlUGlja2VyRGlhbG9nKHZhbHVlMikgewogICAgICB0aGlzLiNzaG93TW92ZVBpY2tlckRpYWxvZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21vdmVQaWNrZXJTb3VyY2VfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9zaG93TW92ZVBpY2tlckRpYWxvZ19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX21vdmVQaWNrZXJTb3VyY2VfaW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICBnZXQgbW92ZVBpY2tlclNvdXJjZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21vdmVQaWNrZXJTb3VyY2VfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtb3ZlUGlja2VyU291cmNlKHZhbHVlMikgewogICAgICB0aGlzLiNtb3ZlUGlja2VyU291cmNlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbW92ZVBpY2tlckN1cnJlbnRQcmVmaXhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9tb3ZlUGlja2VyU291cmNlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfbW92ZVBpY2tlckN1cnJlbnRQcmVmaXhfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IG1vdmVQaWNrZXJDdXJyZW50UHJlZml4KCkgewogICAgICByZXR1cm4gdGhpcy4jbW92ZVBpY2tlckN1cnJlbnRQcmVmaXhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtb3ZlUGlja2VyQ3VycmVudFByZWZpeCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbW92ZVBpY2tlckN1cnJlbnRQcmVmaXhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtb3ZlUGlja2VyUHJlZml4ZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9tb3ZlUGlja2VyQ3VycmVudFByZWZpeF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX21vdmVQaWNrZXJQcmVmaXhlc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgbW92ZVBpY2tlclByZWZpeGVzKCkgewogICAgICByZXR1cm4gdGhpcy4jbW92ZVBpY2tlclByZWZpeGVzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbW92ZVBpY2tlclByZWZpeGVzKHZhbHVlMikgewogICAgICB0aGlzLiNtb3ZlUGlja2VyUHJlZml4ZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtb3ZlUGlja2VyTG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX21vdmVQaWNrZXJQcmVmaXhlc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX21vdmVQaWNrZXJMb2FkaW5nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBtb3ZlUGlja2VyTG9hZGluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI21vdmVQaWNrZXJMb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbW92ZVBpY2tlckxvYWRpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI21vdmVQaWNrZXJMb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd1JlbmFtZURpYWxvZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX21vdmVQaWNrZXJMb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfc2hvd1JlbmFtZURpYWxvZ19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICAvLyBSZW5hbWUgZGlhbG9nIHN0YXRlCiAgICBnZXQgc2hvd1JlbmFtZURpYWxvZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dSZW5hbWVEaWFsb2dfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93UmVuYW1lRGlhbG9nKHZhbHVlMikgewogICAgICB0aGlzLiNzaG93UmVuYW1lRGlhbG9nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcmVuYW1lU291cmNlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfc2hvd1JlbmFtZURpYWxvZ19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX3JlbmFtZVNvdXJjZV9pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIGdldCByZW5hbWVTb3VyY2UoKSB7CiAgICAgIHJldHVybiB0aGlzLiNyZW5hbWVTb3VyY2VfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCByZW5hbWVTb3VyY2UodmFsdWUyKSB7CiAgICAgIHRoaXMuI3JlbmFtZVNvdXJjZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3JlbmFtZU5hbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9yZW5hbWVTb3VyY2VfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczU5KHRoaXMsIF9yZW5hbWVOYW1lX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCByZW5hbWVOYW1lKCkgewogICAgICByZXR1cm4gdGhpcy4jcmVuYW1lTmFtZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHJlbmFtZU5hbWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3JlbmFtZU5hbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNyZW5hbWVJblByb2dyZXNzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfcmVuYW1lTmFtZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX3JlbmFtZUluUHJvZ3Jlc3NfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHJlbmFtZUluUHJvZ3Jlc3MoKSB7CiAgICAgIHJldHVybiB0aGlzLiNyZW5hbWVJblByb2dyZXNzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcmVuYW1lSW5Qcm9ncmVzcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcmVuYW1lSW5Qcm9ncmVzc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3JlbmFtZUVycm9yX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM1OSh0aGlzLCBfcmVuYW1lSW5Qcm9ncmVzc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX3JlbmFtZUVycm9yX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IHJlbmFtZUVycm9yKCkgewogICAgICByZXR1cm4gdGhpcy4jcmVuYW1lRXJyb3JfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCByZW5hbWVFcnJvcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jcmVuYW1lRXJyb3JfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5rZXlzLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmZpbHRlci1iYXIgewogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzMzMiKX07CiAgICAgIH0KCiAgICAgIC5maWx0ZXItaW5wdXQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDMpIiwgInJnYmEoMCwgMCwgMCwgMC4zKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Q0ZDRkOCIsICIjNDQ0Iil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxODE4MWIiLCAiI2ZmZiIpfTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIC5maWx0ZXItaW5wdXQ6Zm9jdXMgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ExYTFhYSIsICIjNDA0MDQwIil9OwogICAgICB9CgogICAgICAuZmlsdGVyLWlucHV0OjpwbGFjZWhvbGRlciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjYTFhMWFhIiwgIiM2NjYiKX07CiAgICAgIH0KCiAgICAgIC5rZXlzLWxpc3QgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgdGFibGUgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICAgIH0KCiAgICAgIHRoZWFkIHsKICAgICAgICBwb3NpdGlvbjogc3RpY2t5OwogICAgICAgIHRvcDogMDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZhZmFmYSIsICIjMWExYTFhIil9OwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIHRoIHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgIHBhZGRpbmc6IDEwcHggMTJweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiIzY2NiIpfTsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzMzIil9OwogICAgICB9CgogICAgICB0ZCB7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjMmEyYTNlIil9OwogICAgICB9CgogICAgICB0cjpob3ZlciB0ZCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wMikiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKSIpfTsKICAgICAgfQoKICAgICAgdHIuc2VsZWN0ZWQgdGQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDU5LCAxMzAsIDI0NiwgMC4wOCkiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSIpfTsKICAgICAgfQoKICAgICAgLmtleS1jZWxsIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAua2V5LWljb24gewogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLmZvbGRlci1pY29uIHsKICAgICAgICBjb2xvcjogI2ZiYmYyNDsKICAgICAgfQoKICAgICAgLmtleS1uYW1lIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KCiAgICAgIC5zaXplLWNlbGwgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjODg4Iil9OwogICAgICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZSB7CiAgICAgICAgcGFkZGluZzogMzJweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjYTFhMWFhIiwgIiM2NjYiKX07CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctb3ZlcmxheSB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNyk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHotaW5kZXg6IDEwMDA7CiAgICAgIH0KCiAgICAgIC5kaWFsb2cgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMxZTFlMWUiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgIG1pbi13aWR0aDogNDAwcHg7CiAgICAgICAgYm94LXNoYWRvdzogMCAyMHB4IDQwcHggcmdiYSgwLCAwLCAwLCAwLjUpOwogICAgICB9CgogICAgICAuZGlhbG9nLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzE4MTgxYiIsICIjZmZmIil9OwogICAgICB9CgogICAgICAuZGlhbG9nLWxvY2F0aW9uIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM4ODgiKX07CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICB9CgogICAgICAuZGlhbG9nLWlucHV0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmNGY0ZjUiLCAiIzE0MTQxNCIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Q0ZDRkOCIsICIjMzMzIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxODE4MWIiLCAiI2ZmZiIpfTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctaW5wdXQ6Zm9jdXMgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ExYTFhYSIsICIjZTBlMGUwIil9OwogICAgICB9CgogICAgICAuZGlhbG9nLWhpbnQgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNhMWExYWEiLCAiIzY2NiIpfTsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICB9CgogICAgICAuZGlhbG9nLWFjdGlvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctYnRuIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4yczsKICAgICAgfQoKICAgICAgLmRpYWxvZy1idG4tY2FuY2VsIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Q0ZDRkOCIsICIjNDQ0Iil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYWFhIil9OwogICAgICB9CgogICAgICAuZGlhbG9nLWJ0bi1jYW5jZWw6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDMpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTgxODFiIiwgIiNmZmYiKX07CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctYnRuLWNyZWF0ZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzQwNDA0MCIpfTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTgxODFiIiwgIiNmZmYiKX07CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctYnRuLWNyZWF0ZTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkNGQ0ZDgiLCAiIzUwNTA1MCIpfTsKICAgICAgfQoKICAgICAgLmRpYWxvZy1idG4tY3JlYXRlOmRpc2FibGVkIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgfQoKICAgICAgLyogTW92ZSBkaWFsb2cgc3R5bGVzICovCiAgICAgIC5tb3ZlLXN1bW1hcnkgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDMpIiwgInJnYmEoMCwgMCwgMCwgMC4yKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICB9CgogICAgICAubW92ZS1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogOHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgfQoKICAgICAgLm1vdmUtaXRlbTpsYXN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgICB9CgogICAgICAubW92ZS1sYWJlbCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM4ODgiKX07CiAgICAgICAgbWluLXdpZHRoOiA0MHB4OwogICAgICB9CgogICAgICAubW92ZS1wYXRoIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzZjNmNDYiLCAiI2UwZTBlMCIpfTsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgIH0KCiAgICAgIC5tb3ZlLWVycm9yIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDIzOSwgNjgsIDY4LCAwLjE1KTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDIzOSwgNjgsIDY4LCAwLjMpOwogICAgICAgIGNvbG9yOiAjZjg3MTcxOwogICAgICAgIHBhZGRpbmc6IDEycHggMTZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgIC8qIE1vdmUgcGlja2VyIGRpYWxvZyBzdHlsZXMgKi8KICAgICAgLm1vdmUtcGlja2VyLWRpYWxvZyB7CiAgICAgICAgbWluLXdpZHRoOiA0NTBweDsKICAgICAgICBtYXgtaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgLnBpY2tlci1icmVhZGNydW1iIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wMykiLCAicmdiYSgwLCAwLCAwLCAwLjIpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICB9CgogICAgICAucGlja2VyLWNydW1iIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiIzg4OCIpfTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLnBpY2tlci1jcnVtYjpob3ZlciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTgxODFiIiwgIiNmZmYiKX07CiAgICAgIH0KCiAgICAgIC5waWNrZXItc2VwYXJhdG9yIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkNGQ0ZDgiLCAiIzU1NSIpfTsKICAgICAgfQoKICAgICAgLnBpY2tlci1saXN0IHsKICAgICAgICBtYXgtaGVpZ2h0OiAyODBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzMzMiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgICAgbWluLWhlaWdodDogMTAwcHg7CiAgICAgIH0KCiAgICAgIC5waWNrZXItaXRlbSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogI2ZiYmYyNDsKICAgICAgfQoKICAgICAgLnBpY2tlci1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjAzKSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpIil9OwogICAgICB9CgogICAgICAucGlja2VyLWl0ZW0gLmljb24gewogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLnBpY2tlci1pdGVtIC5uYW1lIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLnBpY2tlci1lbXB0eSB7CiAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjYTFhMWFhIiwgIiM2NjYiKX07CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICB9CiAgICBgCiAgICBdOwogICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGF3YWl0IHRoaXMubG9hZE9iamVjdHMoKTsKICAgIH0KICAgIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygiYnVja2V0TmFtZSIpIHx8IGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygiY3VycmVudFByZWZpeCIpIHx8IGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygicmVmcmVzaEtleSIpKSB7CiAgICAgICAgdGhpcy5sb2FkT2JqZWN0cygpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBsb2FkT2JqZWN0cygpIHsKICAgICAgaWYgKCF0aGlzLmRhdGFQcm92aWRlcikKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhUHJvdmlkZXIubGlzdE9iamVjdHModGhpcy5idWNrZXROYW1lLCB0aGlzLmN1cnJlbnRQcmVmaXgsICIvIik7CiAgICAgICAgdGhpcy5hbGxLZXlzID0gcmVzdWx0Lm9iamVjdHM7CiAgICAgICAgdGhpcy5wcmVmaXhlcyA9IHJlc3VsdC5wcmVmaXhlczsKICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgbG9hZGluZyBvYmplY3RzOiIsIGVycik7CiAgICAgICAgdGhpcy5hbGxLZXlzID0gW107CiAgICAgICAgdGhpcy5wcmVmaXhlcyA9IFtdOwogICAgICB9CiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgfQogICAgaGFuZGxlRmlsdGVySW5wdXQoZTExKSB7CiAgICAgIHRoaXMuZmlsdGVyVGV4dCA9IGUxMS50YXJnZXQudmFsdWU7CiAgICB9CiAgICBzZWxlY3RLZXkoa2V5MiwgaXNGb2xkZXIpIHsKICAgICAgdGhpcy5zZWxlY3RlZEtleSA9IGtleTI7CiAgICAgIGlmIChpc0ZvbGRlcikgewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm5hdmlnYXRlIiwgewogICAgICAgICAgZGV0YWlsOiB7IHByZWZpeDoga2V5MiB9LAogICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgfSkpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImtleS1zZWxlY3RlZCIsIHsKICAgICAgICAgIGRldGFpbDogeyBrZXk6IGtleTIgfSwKICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgIH0pKTsKICAgICAgfQogICAgfQogICAgZ2V0IGZpbHRlcmVkSXRlbXMoKSB7CiAgICAgIGNvbnN0IGZpbHRlcjIgPSB0aGlzLmZpbHRlclRleHQudG9Mb3dlckNhc2UoKTsKICAgICAgY29uc3QgZm9sZGVycyA9IHRoaXMucHJlZml4ZXMuZmlsdGVyKChwOCkgPT4gIWZpbHRlcjIgfHwgZ2V0RmlsZU5hbWUocDgpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyMikpLm1hcCgocDgpID0+ICh7IGtleTogcDgsIGlzRm9sZGVyOiB0cnVlLCBzaXplOiB2b2lkIDAgfSkpOwogICAgICBjb25zdCBmaWxlcyA9IHRoaXMuYWxsS2V5cy5maWx0ZXIoKG8xMykgPT4gIWZpbHRlcjIgfHwgZ2V0RmlsZU5hbWUobzEzLmtleSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIyKSkubWFwKChvMTMpID0+ICh7IGtleTogbzEzLmtleSwgaXNGb2xkZXI6IGZhbHNlLCBzaXplOiBvMTMuc2l6ZSB9KSk7CiAgICAgIHJldHVybiBbLi4uZm9sZGVycywgLi4uZmlsZXNdOwogICAgfQogICAgaGFuZGxlSXRlbUNvbnRleHRNZW51KGV2ZW50LCBrZXkyLCBpc0ZvbGRlcikgewogICAgICBpZiAoIXRoaXMuZGF0YVByb3ZpZGVyKQogICAgICAgIHJldHVybjsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgaWYgKGlzRm9sZGVyKSB7CiAgICAgICAgRGVlc0NvbnRleHRtZW51Lm9wZW5Db250ZXh0TWVudVdpdGhPcHRpb25zKGV2ZW50LCBbCiAgICAgICAgICB7CiAgICAgICAgICAgIG5hbWU6ICJPcGVuIiwKICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6Zm9sZGVyT3BlbiIsCiAgICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0S2V5KGtleTIsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiQ29weSBQYXRoIiwKICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6Y29weSIsCiAgICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGtleTIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiUmVuYW1lIiwKICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6cGVuY2lsIiwKICAgICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB0aGlzLm9wZW5SZW5hbWVEaWFsb2coa2V5MiwgdHJ1ZSkKICAgICAgICAgIH0sCiAgICAgICAgICB7IGRpdmlkZXI6IHRydWUgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgbmFtZTogIk1vdmUgdG8uLi4iLAogICAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpmb2xkZXJJbnB1dCIsCiAgICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gdGhpcy5vcGVuTW92ZVBpY2tlckRpYWxvZyhrZXkyLCB0cnVlKQogICAgICAgICAgfSwKICAgICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiTmV3IEZvbGRlciBJbnNpZGUiLAogICAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpmb2xkZXJQbHVzIiwKICAgICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB0aGlzLm9wZW5DcmVhdGVEaWFsb2coImZvbGRlciIsIGtleTIpCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiTmV3IEZpbGUgSW5zaWRlIiwKICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6ZmlsZVBsdXMiLAogICAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMub3BlbkNyZWF0ZURpYWxvZygiZmlsZSIsIGtleTIpCiAgICAgICAgICB9LAogICAgICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIG5hbWU6ICJEZWxldGUgRm9sZGVyIiwKICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6dHJhc2gyIiwKICAgICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgICAgaWYgKGNvbmZpcm0oYERlbGV0ZSBmb2xkZXIgIiR7Z2V0RmlsZU5hbWUoa2V5Mil9IiBhbmQgYWxsIGl0cyBjb250ZW50cz9gKSkgewogICAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IHRoaXMuZGF0YVByb3ZpZGVyLmRlbGV0ZVByZWZpeCh0aGlzLmJ1Y2tldE5hbWUsIGtleTIpOwogICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkT2JqZWN0cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIF0pOwogICAgICB9IGVsc2UgewogICAgICAgIERlZXNDb250ZXh0bWVudS5vcGVuQ29udGV4dE1lbnVXaXRoT3B0aW9ucyhldmVudCwgWwogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiUHJldmlldyIsCiAgICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmV5ZSIsCiAgICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0S2V5KGtleTIsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgbmFtZTogIkRvd25sb2FkIiwKICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6ZG93bmxvYWQiLAogICAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCB0aGlzLmRhdGFQcm92aWRlci5nZXRPYmplY3RVcmwodGhpcy5idWNrZXROYW1lLCBrZXkyKTsKICAgICAgICAgICAgICBjb25zdCBsaW5rMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKICAgICAgICAgICAgICBsaW5rMy5ocmVmID0gdXJsOwogICAgICAgICAgICAgIGxpbmszLmRvd25sb2FkID0gZ2V0RmlsZU5hbWUoa2V5Mik7CiAgICAgICAgICAgICAgbGluazMuY2xpY2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgbmFtZTogIkNvcHkgUGF0aCIsCiAgICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmNvcHkiLAogICAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChrZXkyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgbmFtZTogIlJlbmFtZSIsCiAgICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOnBlbmNpbCIsCiAgICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gdGhpcy5vcGVuUmVuYW1lRGlhbG9nKGtleTIsIGZhbHNlKQogICAgICAgICAgfSwKICAgICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiTW92ZSB0by4uLiIsCiAgICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmZvbGRlcklucHV0IiwKICAgICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB0aGlzLm9wZW5Nb3ZlUGlja2VyRGlhbG9nKGtleTIsIGZhbHNlKQogICAgICAgICAgfSwKICAgICAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICAgICAgewogICAgICAgICAgICBuYW1lOiAiRGVsZXRlIiwKICAgICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6dHJhc2gyIiwKICAgICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgICAgaWYgKGNvbmZpcm0oYERlbGV0ZSBmaWxlICIke2dldEZpbGVOYW1lKGtleTIpfSI/YCkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCB0aGlzLmRhdGFQcm92aWRlci5kZWxldGVPYmplY3QodGhpcy5idWNrZXROYW1lLCBrZXkyKTsKICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZE9iamVjdHMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICBdKTsKICAgICAgfQogICAgfQogICAgaGFuZGxlRW1wdHlTcGFjZUNvbnRleHRNZW51KGV2ZW50KSB7CiAgICAgIGlmIChldmVudC50YXJnZXQuY2xvc2VzdCgidHIiKSkKICAgICAgICByZXR1cm47CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIERlZXNDb250ZXh0bWVudS5vcGVuQ29udGV4dE1lbnVXaXRoT3B0aW9ucyhldmVudCwgWwogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJOZXcgRm9sZGVyIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmZvbGRlclBsdXMiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB0aGlzLm9wZW5DcmVhdGVEaWFsb2coImZvbGRlciIsIHRoaXMuY3VycmVudFByZWZpeCkKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICJOZXcgRmlsZSIsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpmaWxlUGx1cyIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMub3BlbkNyZWF0ZURpYWxvZygiZmlsZSIsIHRoaXMuY3VycmVudFByZWZpeCkKICAgICAgICB9CiAgICAgIF0pOwogICAgfQogICAgb3BlbkNyZWF0ZURpYWxvZyh0eXBlNSwgcHJlZml4NCkgewogICAgICB0aGlzLmNyZWF0ZURpYWxvZ1R5cGUgPSB0eXBlNTsKICAgICAgdGhpcy5jcmVhdGVEaWFsb2dQcmVmaXggPSBwcmVmaXg0OwogICAgICB0aGlzLmNyZWF0ZURpYWxvZ05hbWUgPSAiIjsKICAgICAgdGhpcy5zaG93Q3JlYXRlRGlhbG9nID0gdHJ1ZTsKICAgIH0KICAgIGFzeW5jIGhhbmRsZUNyZWF0ZSgpIHsKICAgICAgaWYgKCF0aGlzLmNyZWF0ZURpYWxvZ05hbWUudHJpbSgpIHx8ICF0aGlzLmRhdGFQcm92aWRlcikKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmNyZWF0ZURpYWxvZ05hbWUudHJpbSgpOwogICAgICBsZXQgcGF0aDI7CiAgICAgIGlmICh0aGlzLmNyZWF0ZURpYWxvZ1R5cGUgPT09ICJmb2xkZXIiKSB7CiAgICAgICAgcGF0aDIgPSB0aGlzLmNyZWF0ZURpYWxvZ1ByZWZpeCArIG5hbWUgKyAiLy5rZWVwIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBwYXRoMiA9IHRoaXMuY3JlYXRlRGlhbG9nUHJlZml4ICsgbmFtZTsKICAgICAgfQogICAgICBjb25zdCBleHQgPSBuYW1lLnNwbGl0KCIuIikucG9wKCk/LnRvTG93ZXJDYXNlKCkgfHwgIiI7CiAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gdGhpcy5jcmVhdGVEaWFsb2dUeXBlID09PSAiZmlsZSIgPyBnZXRDb250ZW50VHlwZShleHQpIDogImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7CiAgICAgIGNvbnN0IGNvbnRlbnQzID0gdGhpcy5jcmVhdGVEaWFsb2dUeXBlID09PSAiZmlsZSIgPyBnZXREZWZhdWx0Q29udGVudChleHQpIDogIiI7CiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCB0aGlzLmRhdGFQcm92aWRlci5wdXRPYmplY3QodGhpcy5idWNrZXROYW1lLCBwYXRoMiwgYnRvYShjb250ZW50MyksIGNvbnRlbnRUeXBlKTsKICAgICAgaWYgKHN1Y2Nlc3MpIHsKICAgICAgICB0aGlzLnNob3dDcmVhdGVEaWFsb2cgPSBmYWxzZTsKICAgICAgICBhd2FpdCB0aGlzLmxvYWRPYmplY3RzKCk7CiAgICAgIH0KICAgIH0KICAgIHJlbmRlckNyZWF0ZURpYWxvZygpIHsKICAgICAgaWYgKCF0aGlzLnNob3dDcmVhdGVEaWFsb2cpCiAgICAgICAgcmV0dXJuICIiOwogICAgICBjb25zdCBpc0ZvbGRlciA9IHRoaXMuY3JlYXRlRGlhbG9nVHlwZSA9PT0gImZvbGRlciI7CiAgICAgIGNvbnN0IHRpdGxlID0gaXNGb2xkZXIgPyAiQ3JlYXRlIE5ldyBGb2xkZXIiIDogIkNyZWF0ZSBOZXcgRmlsZSI7CiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gaXNGb2xkZXIgPyAiZm9sZGVyLW5hbWUgb3IgcGF0aC90by9mb2xkZXIiIDogImZpbGVuYW1lLnR4dCBvciBwYXRoL3RvL2ZpbGUudHh0IjsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctb3ZlcmxheSIgQGNsaWNrPSR7KCkgPT4gdGhpcy5zaG93Q3JlYXRlRGlhbG9nID0gZmFsc2V9PgogICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZyIgQGNsaWNrPSR7KGUxMSkgPT4gZTExLnN0b3BQcm9wYWdhdGlvbigpfT4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+JHt0aXRsZX08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy1sb2NhdGlvbiI+CiAgICAgICAgICAgIExvY2F0aW9uOiAke3RoaXMuYnVja2V0TmFtZX0vJHt0aGlzLmNyZWF0ZURpYWxvZ1ByZWZpeH0KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGlucHV0CiAgICAgICAgICAgIHR5cGU9InRleHQiCiAgICAgICAgICAgIGNsYXNzPSJkaWFsb2ctaW5wdXQiCiAgICAgICAgICAgIHBsYWNlaG9sZGVyPSR7cGxhY2Vob2xkZXJ9CiAgICAgICAgICAgIC52YWx1ZT0ke3RoaXMuY3JlYXRlRGlhbG9nTmFtZX0KICAgICAgICAgICAgQGlucHV0PSR7KGUxMSkgPT4gdGhpcy5jcmVhdGVEaWFsb2dOYW1lID0gZTExLnRhcmdldC52YWx1ZX0KICAgICAgICAgICAgQGtleWRvd249JHsoZTExKSA9PiBlMTEua2V5ID09PSAiRW50ZXIiICYmIHRoaXMuaGFuZGxlQ3JlYXRlKCl9CiAgICAgICAgICAvPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLWhpbnQiPgogICAgICAgICAgICBVc2UgIi8iIHRvIGNyZWF0ZSBuZXN0ZWQgJHtpc0ZvbGRlciA/ICJmb2xkZXJzIiA6ICJwYXRoIn0gKGUuZy4sICR7aXNGb2xkZXIgPyAicGFyZW50L2NoaWxkIiA6ICJmb2xkZXIvZmlsZS50eHQifSkKICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLWFjdGlvbnMiPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkaWFsb2ctYnRuIGRpYWxvZy1idG4tY2FuY2VsIiBAY2xpY2s9JHsoKSA9PiB0aGlzLnNob3dDcmVhdGVEaWFsb2cgPSBmYWxzZX0+CiAgICAgICAgICAgICAgQ2FuY2VsCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgY2xhc3M9ImRpYWxvZy1idG4gZGlhbG9nLWJ0bi1jcmVhdGUiCiAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7IXRoaXMuY3JlYXRlRGlhbG9nTmFtZS50cmltKCl9CiAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5oYW5kbGVDcmVhdGUoKX0KICAgICAgICAgICAgPgogICAgICAgICAgICAgIENyZWF0ZQogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICAvLyAtLS0gTW92ZSBwaWNrZXIgZGlhbG9nIC0tLQogICAgYXN5bmMgb3Blbk1vdmVQaWNrZXJEaWFsb2coa2V5MiwgaXNGb2xkZXIpIHsKICAgICAgdGhpcy5tb3ZlUGlja2VyU291cmNlID0geyBrZXk6IGtleTIsIGlzRm9sZGVyIH07CiAgICAgIHRoaXMubW92ZVBpY2tlckN1cnJlbnRQcmVmaXggPSAiIjsKICAgICAgdGhpcy5zaG93TW92ZVBpY2tlckRpYWxvZyA9IHRydWU7CiAgICAgIGF3YWl0IHRoaXMubG9hZE1vdmVQaWNrZXJQcmVmaXhlcygiIik7CiAgICB9CiAgICBhc3luYyBuYXZpZ2F0ZU1vdmVQaWNrZXIocHJlZml4NCkgewogICAgICB0aGlzLm1vdmVQaWNrZXJDdXJyZW50UHJlZml4ID0gcHJlZml4NDsKICAgICAgYXdhaXQgdGhpcy5sb2FkTW92ZVBpY2tlclByZWZpeGVzKHByZWZpeDQpOwogICAgfQogICAgYXN5bmMgbG9hZE1vdmVQaWNrZXJQcmVmaXhlcyhwcmVmaXg0KSB7CiAgICAgIGlmICghdGhpcy5kYXRhUHJvdmlkZXIpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLm1vdmVQaWNrZXJMb2FkaW5nID0gdHJ1ZTsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmRhdGFQcm92aWRlci5saXN0T2JqZWN0cyh0aGlzLmJ1Y2tldE5hbWUsIHByZWZpeDQsICIvIik7CiAgICAgICAgdGhpcy5tb3ZlUGlja2VyUHJlZml4ZXMgPSByZXN1bHQucHJlZml4ZXM7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHRoaXMubW92ZVBpY2tlclByZWZpeGVzID0gW107CiAgICAgIH0KICAgICAgdGhpcy5tb3ZlUGlja2VyTG9hZGluZyA9IGZhbHNlOwogICAgfQogICAgc2VsZWN0TW92ZURlc3RpbmF0aW9uKGRlc3RQcmVmaXgpIHsKICAgICAgaWYgKCF0aGlzLm1vdmVQaWNrZXJTb3VyY2UpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLmNsb3NlTW92ZVBpY2tlckRpYWxvZygpOwogICAgICB0aGlzLmluaXRpYXRlTW92ZSh0aGlzLm1vdmVQaWNrZXJTb3VyY2Uua2V5LCB0aGlzLm1vdmVQaWNrZXJTb3VyY2UuaXNGb2xkZXIsIGRlc3RQcmVmaXgpOwogICAgfQogICAgY2xvc2VNb3ZlUGlja2VyRGlhbG9nKCkgewogICAgICB0aGlzLnNob3dNb3ZlUGlja2VyRGlhbG9nID0gZmFsc2U7CiAgICAgIHRoaXMubW92ZVBpY2tlclNvdXJjZSA9IG51bGw7CiAgICAgIHRoaXMubW92ZVBpY2tlckN1cnJlbnRQcmVmaXggPSAiIjsKICAgICAgdGhpcy5tb3ZlUGlja2VyUHJlZml4ZXMgPSBbXTsKICAgIH0KICAgIC8vIC0tLSBNb3ZlIGNvbmZpcm1hdGlvbiBkaWFsb2cgLS0tCiAgICBpbml0aWF0ZU1vdmUoc291cmNlS2V5LCBpc0ZvbGRlciwgZGVzdFByZWZpeCkgewogICAgICBjb25zdCB2YWxpZGF0aW9uID0gdmFsaWRhdGVNb3ZlKHNvdXJjZUtleSwgZGVzdFByZWZpeCk7CiAgICAgIGlmICghdmFsaWRhdGlvbi52YWxpZCkgewogICAgICAgIHRoaXMubW92ZVNvdXJjZSA9IHsga2V5OiBzb3VyY2VLZXksIGlzRm9sZGVyIH07CiAgICAgICAgdGhpcy5tb3ZlRGVzdGluYXRpb24gPSBkZXN0UHJlZml4OwogICAgICAgIHRoaXMubW92ZUVycm9yID0gdmFsaWRhdGlvbi5lcnJvcjsKICAgICAgICB0aGlzLnNob3dNb3ZlRGlhbG9nID0gdHJ1ZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5tb3ZlU291cmNlID0geyBrZXk6IHNvdXJjZUtleSwgaXNGb2xkZXIgfTsKICAgICAgdGhpcy5tb3ZlRGVzdGluYXRpb24gPSBkZXN0UHJlZml4OwogICAgICB0aGlzLm1vdmVFcnJvciA9IG51bGw7CiAgICAgIHRoaXMuc2hvd01vdmVEaWFsb2cgPSB0cnVlOwogICAgfQogICAgYXN5bmMgZXhlY3V0ZU1vdmUoKSB7CiAgICAgIGlmICghdGhpcy5tb3ZlU291cmNlIHx8ICF0aGlzLmRhdGFQcm92aWRlcikKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMubW92ZUluUHJvZ3Jlc3MgPSB0cnVlOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IHNvdXJjZU5hbWUgPSBnZXRGaWxlTmFtZSh0aGlzLm1vdmVTb3VyY2Uua2V5KTsKICAgICAgICBjb25zdCBkZXN0S2V5ID0gdGhpcy5tb3ZlRGVzdGluYXRpb24gKyBzb3VyY2VOYW1lOwogICAgICAgIGxldCByZXN1bHQ7CiAgICAgICAgaWYgKHRoaXMubW92ZVNvdXJjZS5pc0ZvbGRlcikgewogICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhUHJvdmlkZXIubW92ZVByZWZpeCh0aGlzLmJ1Y2tldE5hbWUsIHRoaXMubW92ZVNvdXJjZS5rZXksIGRlc3RLZXkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmRhdGFQcm92aWRlci5tb3ZlT2JqZWN0KHRoaXMuYnVja2V0TmFtZSwgdGhpcy5tb3ZlU291cmNlLmtleSwgZGVzdEtleSk7CiAgICAgICAgfQogICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykgewogICAgICAgICAgdGhpcy5jbG9zZU1vdmVEaWFsb2coKTsKICAgICAgICAgIGF3YWl0IHRoaXMubG9hZE9iamVjdHMoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5tb3ZlRXJyb3IgPSByZXN1bHQuZXJyb3IgfHwgIk1vdmUgb3BlcmF0aW9uIGZhaWxlZCI7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICB0aGlzLm1vdmVFcnJvciA9IGBFcnJvcjogJHtlcnJ9YDsKICAgICAgfQogICAgICB0aGlzLm1vdmVJblByb2dyZXNzID0gZmFsc2U7CiAgICB9CiAgICBjbG9zZU1vdmVEaWFsb2coKSB7CiAgICAgIHRoaXMuc2hvd01vdmVEaWFsb2cgPSBmYWxzZTsKICAgICAgdGhpcy5tb3ZlU291cmNlID0gbnVsbDsKICAgICAgdGhpcy5tb3ZlRGVzdGluYXRpb24gPSAiIjsKICAgICAgdGhpcy5tb3ZlRXJyb3IgPSBudWxsOwogICAgICB0aGlzLm1vdmVJblByb2dyZXNzID0gZmFsc2U7CiAgICB9CiAgICAvLyAtLS0gUmVuYW1lIGRpYWxvZyBtZXRob2RzIC0tLQogICAgb3BlblJlbmFtZURpYWxvZyhrZXkyLCBpc0ZvbGRlcikgewogICAgICB0aGlzLnJlbmFtZVNvdXJjZSA9IHsga2V5OiBrZXkyLCBpc0ZvbGRlciB9OwogICAgICB0aGlzLnJlbmFtZU5hbWUgPSBnZXRGaWxlTmFtZShrZXkyKTsKICAgICAgdGhpcy5yZW5hbWVFcnJvciA9IG51bGw7CiAgICAgIHRoaXMuc2hvd1JlbmFtZURpYWxvZyA9IHRydWU7CiAgICAgIHRoaXMudXBkYXRlQ29tcGxldGUudGhlbigoKSA9PiB7CiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5yZW5hbWUtZGlhbG9nLWlucHV0Iik7CiAgICAgICAgaWYgKGlucHV0KSB7CiAgICAgICAgICBpbnB1dC5mb2N1cygpOwogICAgICAgICAgaWYgKCFpc0ZvbGRlcikgewogICAgICAgICAgICBjb25zdCBsYXN0RG90ID0gdGhpcy5yZW5hbWVOYW1lLmxhc3RJbmRleE9mKCIuIik7CiAgICAgICAgICAgIGlmIChsYXN0RG90ID4gMCkgewogICAgICAgICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDAsIGxhc3REb3QpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlucHV0LnNlbGVjdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbnB1dC5zZWxlY3QoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgYXN5bmMgZXhlY3V0ZVJlbmFtZSgpIHsKICAgICAgaWYgKCF0aGlzLnJlbmFtZVNvdXJjZSB8fCAhdGhpcy5yZW5hbWVOYW1lLnRyaW0oKSB8fCAhdGhpcy5kYXRhUHJvdmlkZXIpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBuZXdOYW1lID0gdGhpcy5yZW5hbWVOYW1lLnRyaW0oKTsKICAgICAgY29uc3QgY3VycmVudE5hbWUgPSBnZXRGaWxlTmFtZSh0aGlzLnJlbmFtZVNvdXJjZS5rZXkpOwogICAgICBpZiAobmV3TmFtZSA9PT0gY3VycmVudE5hbWUpIHsKICAgICAgICB0aGlzLnJlbmFtZUVycm9yID0gIk5hbWUgaXMgdGhlIHNhbWUgYXMgY3VycmVudCI7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghbmV3TmFtZSkgewogICAgICAgIHRoaXMucmVuYW1lRXJyb3IgPSAiTmFtZSBjYW5ub3QgYmUgZW1wdHkiOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAobmV3TmFtZS5pbmNsdWRlcygiLyIpKSB7CiAgICAgICAgdGhpcy5yZW5hbWVFcnJvciA9ICdOYW1lIGNhbm5vdCBjb250YWluICIvIic7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMucmVuYW1lSW5Qcm9ncmVzcyA9IHRydWU7CiAgICAgIHRoaXMucmVuYW1lRXJyb3IgPSBudWxsOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IHBhcmVudFByZWZpeCA9IGdldFBhcmVudFByZWZpeCh0aGlzLnJlbmFtZVNvdXJjZS5rZXkpOwogICAgICAgIGNvbnN0IG5ld0tleSA9IHBhcmVudFByZWZpeCArIG5ld05hbWUgKyAodGhpcy5yZW5hbWVTb3VyY2UuaXNGb2xkZXIgPyAiLyIgOiAiIik7CiAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICBpZiAodGhpcy5yZW5hbWVTb3VyY2UuaXNGb2xkZXIpIHsKICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuZGF0YVByb3ZpZGVyLm1vdmVQcmVmaXgodGhpcy5idWNrZXROYW1lLCB0aGlzLnJlbmFtZVNvdXJjZS5rZXksIG5ld0tleSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuZGF0YVByb3ZpZGVyLm1vdmVPYmplY3QodGhpcy5idWNrZXROYW1lLCB0aGlzLnJlbmFtZVNvdXJjZS5rZXksIG5ld0tleSk7CiAgICAgICAgfQogICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykgewogICAgICAgICAgdGhpcy5jbG9zZVJlbmFtZURpYWxvZygpOwogICAgICAgICAgYXdhaXQgdGhpcy5sb2FkT2JqZWN0cygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnJlbmFtZUVycm9yID0gcmVzdWx0LmVycm9yIHx8ICJSZW5hbWUgZmFpbGVkIjsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIHRoaXMucmVuYW1lRXJyb3IgPSBgRXJyb3I6ICR7ZXJyfWA7CiAgICAgIH0KICAgICAgdGhpcy5yZW5hbWVJblByb2dyZXNzID0gZmFsc2U7CiAgICB9CiAgICBjbG9zZVJlbmFtZURpYWxvZygpIHsKICAgICAgdGhpcy5zaG93UmVuYW1lRGlhbG9nID0gZmFsc2U7CiAgICAgIHRoaXMucmVuYW1lU291cmNlID0gbnVsbDsKICAgICAgdGhpcy5yZW5hbWVOYW1lID0gIiI7CiAgICAgIHRoaXMucmVuYW1lRXJyb3IgPSBudWxsOwogICAgICB0aGlzLnJlbmFtZUluUHJvZ3Jlc3MgPSBmYWxzZTsKICAgIH0KICAgIHJlbmRlclJlbmFtZURpYWxvZygpIHsKICAgICAgaWYgKCF0aGlzLnNob3dSZW5hbWVEaWFsb2cgfHwgIXRoaXMucmVuYW1lU291cmNlKQogICAgICAgIHJldHVybiAiIjsKICAgICAgY29uc3QgaXNGb2xkZXIgPSB0aGlzLnJlbmFtZVNvdXJjZS5pc0ZvbGRlcjsKICAgICAgY29uc3QgdGl0bGUgPSBpc0ZvbGRlciA/ICJSZW5hbWUgRm9sZGVyIiA6ICJSZW5hbWUgRmlsZSI7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLW92ZXJsYXkiIEBjbGljaz0keygpID0+IHRoaXMuY2xvc2VSZW5hbWVEaWFsb2coKX0+CiAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nIiBAY2xpY2s9JHsoZTExKSA9PiBlMTEuc3RvcFByb3BhZ2F0aW9uKCl9PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj4ke3RpdGxlfTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLWxvY2F0aW9uIj4KICAgICAgICAgICAgTG9jYXRpb246ICR7dGhpcy5idWNrZXROYW1lfS8ke2dldFBhcmVudFByZWZpeCh0aGlzLnJlbmFtZVNvdXJjZS5rZXkpfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgICAke3RoaXMucmVuYW1lRXJyb3IgPyBiMmA8ZGl2IGNsYXNzPSJtb3ZlLWVycm9yIj4ke3RoaXMucmVuYW1lRXJyb3J9PC9kaXY+YCA6ICIifQogICAgICAgICAgPGlucHV0CiAgICAgICAgICAgIHR5cGU9InRleHQiCiAgICAgICAgICAgIGNsYXNzPSJkaWFsb2ctaW5wdXQgcmVuYW1lLWRpYWxvZy1pbnB1dCIKICAgICAgICAgICAgcGxhY2Vob2xkZXI9JHtpc0ZvbGRlciA/ICJmb2xkZXItbmFtZSIgOiAiZmlsZW5hbWUuZXh0In0KICAgICAgICAgICAgLnZhbHVlPSR7dGhpcy5yZW5hbWVOYW1lfQogICAgICAgICAgICBAaW5wdXQ9JHsoZTExKSA9PiB7CiAgICAgICAgdGhpcy5yZW5hbWVOYW1lID0gZTExLnRhcmdldC52YWx1ZTsKICAgICAgICB0aGlzLnJlbmFtZUVycm9yID0gbnVsbDsKICAgICAgfX0KICAgICAgICAgICAgQGtleWRvd249JHsoZTExKSA9PiB7CiAgICAgICAgaWYgKGUxMS5rZXkgPT09ICJFbnRlciIpCiAgICAgICAgICB0aGlzLmV4ZWN1dGVSZW5hbWUoKTsKICAgICAgICBpZiAoZTExLmtleSA9PT0gIkVzY2FwZSIpCiAgICAgICAgICB0aGlzLmNsb3NlUmVuYW1lRGlhbG9nKCk7CiAgICAgIH19CiAgICAgICAgICAvPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLWFjdGlvbnMiPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkaWFsb2ctYnRuIGRpYWxvZy1idG4tY2FuY2VsIgogICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuY2xvc2VSZW5hbWVEaWFsb2coKX0KICAgICAgICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHt0aGlzLnJlbmFtZUluUHJvZ3Jlc3N9PkNhbmNlbDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkaWFsb2ctYnRuIGRpYWxvZy1idG4tY3JlYXRlIgogICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuZXhlY3V0ZVJlbmFtZSgpfQogICAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD0ke3RoaXMucmVuYW1lSW5Qcm9ncmVzcyB8fCAhdGhpcy5yZW5hbWVOYW1lLnRyaW0oKX0+CiAgICAgICAgICAgICAgJHt0aGlzLnJlbmFtZUluUHJvZ3Jlc3MgPyAiUmVuYW1pbmcuLi4iIDogIlJlbmFtZSJ9CiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlck1vdmVEaWFsb2coKSB7CiAgICAgIGlmICghdGhpcy5zaG93TW92ZURpYWxvZyB8fCAhdGhpcy5tb3ZlU291cmNlKQogICAgICAgIHJldHVybiAiIjsKICAgICAgY29uc3Qgc291cmNlTmFtZSA9IGdldEZpbGVOYW1lKHRoaXMubW92ZVNvdXJjZS5rZXkpOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy1vdmVybGF5IiBAY2xpY2s9JHsoKSA9PiB0aGlzLmNsb3NlTW92ZURpYWxvZygpfT4KICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ciIEBjbGljaz0keyhlMTEpID0+IGUxMS5zdG9wUHJvcGFnYXRpb24oKX0+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPk1vdmUgJHt0aGlzLm1vdmVTb3VyY2UuaXNGb2xkZXIgPyAiRm9sZGVyIiA6ICJGaWxlIn08L2Rpdj4KCiAgICAgICAgICAke3RoaXMubW92ZUVycm9yID8gYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vdmUtZXJyb3IiPiR7dGhpcy5tb3ZlRXJyb3J9PC9kaXY+CiAgICAgICAgICBgIDogYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vdmUtc3VtbWFyeSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW92ZS1pdGVtIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtb3ZlLWxhYmVsIj5Gcm9tOjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtb3ZlLXBhdGgiPiR7dGhpcy5tb3ZlU291cmNlLmtleX08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW92ZS1pdGVtIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtb3ZlLWxhYmVsIj5Ubzo8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibW92ZS1wYXRoIj4ke3RoaXMubW92ZURlc3RpbmF0aW9ufSR7c291cmNlTmFtZX08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYH0KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctYWN0aW9ucyI+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRpYWxvZy1idG4gZGlhbG9nLWJ0bi1jYW5jZWwiCiAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5jbG9zZU1vdmVEaWFsb2coKX0KICAgICAgICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHt0aGlzLm1vdmVJblByb2dyZXNzfT4KICAgICAgICAgICAgICBDYW5jZWwKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICR7IXRoaXMubW92ZUVycm9yID8gYjJgCiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGlhbG9nLWJ0biBkaWFsb2ctYnRuLWNyZWF0ZSIKICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuZXhlY3V0ZU1vdmUoKX0KICAgICAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD0ke3RoaXMubW92ZUluUHJvZ3Jlc3N9PgogICAgICAgICAgICAgICAgJHt0aGlzLm1vdmVJblByb2dyZXNzID8gIk1vdmluZy4uLiIgOiAiTW92ZSJ9CiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICByZW5kZXJNb3ZlUGlja2VyRGlhbG9nKCkgewogICAgICBpZiAoIXRoaXMuc2hvd01vdmVQaWNrZXJEaWFsb2cgfHwgIXRoaXMubW92ZVBpY2tlclNvdXJjZSkKICAgICAgICByZXR1cm4gIiI7CiAgICAgIGNvbnN0IHNvdXJjZU5hbWUgPSBnZXRGaWxlTmFtZSh0aGlzLm1vdmVQaWNrZXJTb3VyY2Uua2V5KTsKICAgICAgY29uc3Qgc291cmNlUGFyZW50ID0gZ2V0UGFyZW50UHJlZml4KHRoaXMubW92ZVBpY2tlclNvdXJjZS5rZXkpOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy1vdmVybGF5IiBAY2xpY2s9JHsoKSA9PiB0aGlzLmNsb3NlTW92ZVBpY2tlckRpYWxvZygpfT4KICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2cgbW92ZS1waWNrZXItZGlhbG9nIiBAY2xpY2s9JHsoZTExKSA9PiBlMTEuc3RvcFByb3BhZ2F0aW9uKCl9PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj5Nb3ZlICIke3NvdXJjZU5hbWV9IiB0by4uLjwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InBpY2tlci1icmVhZGNydW1iIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InBpY2tlci1jcnVtYiIgQGNsaWNrPSR7KCkgPT4gdGhpcy5uYXZpZ2F0ZU1vdmVQaWNrZXIoIiIpfT4KICAgICAgICAgICAgICAke3RoaXMuYnVja2V0TmFtZX0KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAke2dldFBhdGhTZWdtZW50cyh0aGlzLm1vdmVQaWNrZXJDdXJyZW50UHJlZml4KS5tYXAoKHNlZykgPT4gYjJgCiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InBpY2tlci1zZXBhcmF0b3IiPi88L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InBpY2tlci1jcnVtYiIgQGNsaWNrPSR7KCkgPT4gdGhpcy5uYXZpZ2F0ZU1vdmVQaWNrZXIoc2VnKX0+CiAgICAgICAgICAgICAgICAke2dldEZpbGVOYW1lKHNlZyl9CiAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICBgKX0KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InBpY2tlci1saXN0Ij4KICAgICAgICAgICAgJHt0aGlzLm1vdmVQaWNrZXJMb2FkaW5nID8gYjJgPGRpdiBjbGFzcz0icGlja2VyLWVtcHR5Ij5Mb2FkaW5nLi4uPC9kaXY+YCA6ICIifQogICAgICAgICAgICAkeyF0aGlzLm1vdmVQaWNrZXJMb2FkaW5nICYmIHRoaXMubW92ZVBpY2tlclByZWZpeGVzLmZpbHRlcigocDgpID0+IHA4ICE9PSB0aGlzLm1vdmVQaWNrZXJTb3VyY2Uua2V5KS5sZW5ndGggPT09IDAgPyBiMmAKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwaWNrZXItZW1wdHkiPk5vIHN1YmZvbGRlcnM8L2Rpdj4KICAgICAgICAgICAgYCA6ICIifQogICAgICAgICAgICAke3RoaXMubW92ZVBpY2tlclByZWZpeGVzLmZpbHRlcigocDgpID0+IHA4ICE9PSB0aGlzLm1vdmVQaWNrZXJTb3VyY2Uua2V5KS5tYXAoKHByZWZpeDQpID0+IGIyYAogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGlja2VyLWl0ZW0iCiAgICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMubmF2aWdhdGVNb3ZlUGlja2VyKHByZWZpeDQpfQogICAgICAgICAgICAgICAgICAgICBAZGJsY2xpY2s9JHsoKSA9PiB0aGlzLnNlbGVjdE1vdmVEZXN0aW5hdGlvbihwcmVmaXg0KX0+CiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iY3VycmVudENvbG9yIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjIgMTlhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDVsMiAzaDlhMiAyIDAgMCAxIDIgMnoiLz4KICAgICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJuYW1lIj4ke2dldEZpbGVOYW1lKHByZWZpeDQpfTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIGApfQogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLWFjdGlvbnMiPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkaWFsb2ctYnRuIGRpYWxvZy1idG4tY2FuY2VsIiBAY2xpY2s9JHsoKSA9PiB0aGlzLmNsb3NlTW92ZVBpY2tlckRpYWxvZygpfT4KICAgICAgICAgICAgICBDYW5jZWwKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRpYWxvZy1idG4gZGlhbG9nLWJ0bi1jcmVhdGUiCiAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5zZWxlY3RNb3ZlRGVzdGluYXRpb24odGhpcy5tb3ZlUGlja2VyQ3VycmVudFByZWZpeCl9CiAgICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7dGhpcy5tb3ZlUGlja2VyQ3VycmVudFByZWZpeCA9PT0gc291cmNlUGFyZW50fT4KICAgICAgICAgICAgICBNb3ZlIEhlcmUKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImtleXMtY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJmaWx0ZXItYmFyIj4KICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICB0eXBlPSJ0ZXh0IgogICAgICAgICAgICBjbGFzcz0iZmlsdGVyLWlucHV0IgogICAgICAgICAgICBwbGFjZWhvbGRlcj0iRmlsdGVyIGZpbGVzLi4uIgogICAgICAgICAgICAudmFsdWU9JHt0aGlzLmZpbHRlclRleHR9CiAgICAgICAgICAgIEBpbnB1dD0ke3RoaXMuaGFuZGxlRmlsdGVySW5wdXR9CiAgICAgICAgICAvPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJrZXlzLWxpc3QiIEBjb250ZXh0bWVudT0keyhlMTEpID0+IHRoaXMuaGFuZGxlRW1wdHlTcGFjZUNvbnRleHRNZW51KGUxMSl9PgogICAgICAgICAgJHt0aGlzLmxvYWRpbmcgPyBiMmA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+TG9hZGluZy4uLjwvZGl2PmAgOiB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoID09PSAwID8gYjJgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiPk5vIG9iamVjdHMgZm91bmQ8L2Rpdj5gIDogYjJgCiAgICAgICAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5OYW1lPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDogMTAwcHg7Ij5TaXplPC90aD4KICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuZmlsdGVyZWRJdGVtcy5tYXAoKGl0ZW0pID0+IGIyYAogICAgICAgICAgICAgICAgICAgICAgICAgIDx0cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9IiR7dGhpcy5zZWxlY3RlZEtleSA9PT0gaXRlbS5rZXkgPyAic2VsZWN0ZWQiIDogIiJ9IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5zZWxlY3RLZXkoaXRlbS5rZXksIGl0ZW0uaXNGb2xkZXIpfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNvbnRleHRtZW51PSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVJdGVtQ29udGV4dE1lbnUoZTExLCBpdGVtLmtleSwgaXRlbS5pc0ZvbGRlcil9CiAgICAgICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJrZXktY2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtpdGVtLmlzRm9sZGVyID8gYjJgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz0ia2V5LWljb24gZm9sZGVyLWljb24iIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iY3VycmVudENvbG9yIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMiAxOWEyIDIgMCAwIDEtMiAySDRhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoNWwyIDNoOWEyIDIgMCAwIDEgMiAyeiIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCA6IGIyYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9ImtleS1pY29uIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE0IDJINmEyIDIgMCAwIDAtMiAydjE2YTIgMiAwIDAgMCAyIDJoMTJhMiAyIDAgMCAwIDItMlY4eiIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ia2V5LW5hbWUiPiR7Z2V0RmlsZU5hbWUoaXRlbS5rZXkpfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJzaXplLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2l0ZW0uaXNGb2xkZXIgPyAiLSIgOiBmb3JtYXRTaXplKGl0ZW0uc2l6ZSl9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIGApfQogICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICBgfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgJHt0aGlzLnJlbmRlckNyZWF0ZURpYWxvZygpfQogICAgICAke3RoaXMucmVuZGVyTW92ZURpYWxvZygpfQogICAgICAke3RoaXMucmVuZGVyTW92ZVBpY2tlckRpYWxvZygpfQogICAgICAke3RoaXMucmVuZGVyUmVuYW1lRGlhbG9nKCl9CiAgICBgOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNTkodGhpcywgX3JlbmFtZUVycm9yX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNTkoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNTdG9yYWdlS2V5czIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWRhdGF2aWV3L2RlZXMtc3RvcmFnZS1icm93c2VyL2RlZXMtc3RvcmFnZS1wcmV2aWV3LmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTU5ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM2MCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1N0b3JhZ2VQcmV2aWV3ID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLXN0b3JhZ2UtcHJldmlldyIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX2RhdGFQcm92aWRlcl9kZWNvcmF0b3JzOwogIGxldCBfZGF0YVByb3ZpZGVyX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZGF0YVByb3ZpZGVyX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9idWNrZXROYW1lX2RlY29yYXRvcnM7CiAgbGV0IF9idWNrZXROYW1lX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYnVja2V0TmFtZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfb2JqZWN0S2V5X2RlY29yYXRvcnM7CiAgbGV0IF9vYmplY3RLZXlfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vYmplY3RLZXlfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xvYWRpbmdfZGVjb3JhdG9yczsKICBsZXQgX2xvYWRpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zYXZpbmdfZGVjb3JhdG9yczsKICBsZXQgX3NhdmluZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NhdmluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29udGVudF9kZWNvcmF0b3JzOwogIGxldCBfY29udGVudF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRlbnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX29yaWdpbmFsVGV4dENvbnRlbnRfZGVjb3JhdG9yczsKICBsZXQgX29yaWdpbmFsVGV4dENvbnRlbnRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vcmlnaW5hbFRleHRDb250ZW50X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9oYXNDaGFuZ2VzX2RlY29yYXRvcnM7CiAgbGV0IF9oYXNDaGFuZ2VzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaGFzQ2hhbmdlc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZWRpdGluZ19kZWNvcmF0b3JzOwogIGxldCBfZWRpdGluZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2VkaXRpbmdfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRlbnRUeXBlX2RlY29yYXRvcnM7CiAgbGV0IF9jb250ZW50VHlwZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRlbnRUeXBlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWxlU2l6ZV9kZWNvcmF0b3JzOwogIGxldCBfZmlsZVNpemVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWxlU2l6ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGFzdE1vZGlmaWVkX2RlY29yYXRvcnM7CiAgbGV0IF9sYXN0TW9kaWZpZWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sYXN0TW9kaWZpZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Vycm9yX2RlY29yYXRvcnM7CiAgbGV0IF9lcnJvcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Vycm9yX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNTdG9yYWdlUHJldmlldzIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9kYXRhUHJvdmlkZXJfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF9idWNrZXROYW1lX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfb2JqZWN0S2V5X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfbG9hZGluZ19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfc2F2aW5nX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9jb250ZW50X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9vcmlnaW5hbFRleHRDb250ZW50X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9oYXNDaGFuZ2VzX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9lZGl0aW5nX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9jb250ZW50VHlwZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfZmlsZVNpemVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2xhc3RNb2RpZmllZF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfZXJyb3JfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlNTkodGhpcywgbnVsbCwgX2RhdGFQcm92aWRlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkYXRhUHJvdmlkZXIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRhdGFQcm92aWRlciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5kYXRhUHJvdmlkZXIsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmRhdGFQcm92aWRlciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kYXRhUHJvdmlkZXJfaW5pdGlhbGl6ZXJzLCBfZGF0YVByb3ZpZGVyX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTkodGhpcywgbnVsbCwgX2J1Y2tldE5hbWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYnVja2V0TmFtZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYnVja2V0TmFtZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5idWNrZXROYW1lLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5idWNrZXROYW1lID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2J1Y2tldE5hbWVfaW5pdGlhbGl6ZXJzLCBfYnVja2V0TmFtZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU5KHRoaXMsIG51bGwsIF9vYmplY3RLZXlfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAib2JqZWN0S2V5Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJvYmplY3RLZXkiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoub2JqZWN0S2V5LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5vYmplY3RLZXkgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfb2JqZWN0S2V5X2luaXRpYWxpemVycywgX29iamVjdEtleV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU5KHRoaXMsIG51bGwsIF9sb2FkaW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxvYWRpbmciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImxvYWRpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubG9hZGluZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubG9hZGluZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9sb2FkaW5nX2luaXRpYWxpemVycywgX2xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1OSh0aGlzLCBudWxsLCBfc2F2aW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNhdmluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2F2aW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNhdmluZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2F2aW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NhdmluZ19pbml0aWFsaXplcnMsIF9zYXZpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1OSh0aGlzLCBudWxsLCBfY29udGVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb250ZW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb250ZW50IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNvbnRlbnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvbnRlbnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29udGVudF9pbml0aWFsaXplcnMsIF9jb250ZW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTkodGhpcywgbnVsbCwgX29yaWdpbmFsVGV4dENvbnRlbnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAib3JpZ2luYWxUZXh0Q29udGVudCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAib3JpZ2luYWxUZXh0Q29udGVudCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5vcmlnaW5hbFRleHRDb250ZW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5vcmlnaW5hbFRleHRDb250ZW50ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX29yaWdpbmFsVGV4dENvbnRlbnRfaW5pdGlhbGl6ZXJzLCBfb3JpZ2luYWxUZXh0Q29udGVudF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU5KHRoaXMsIG51bGwsIF9oYXNDaGFuZ2VzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImhhc0NoYW5nZXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImhhc0NoYW5nZXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaGFzQ2hhbmdlcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaGFzQ2hhbmdlcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9oYXNDaGFuZ2VzX2luaXRpYWxpemVycywgX2hhc0NoYW5nZXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1OSh0aGlzLCBudWxsLCBfZWRpdGluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJlZGl0aW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJlZGl0aW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmVkaXRpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmVkaXRpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZWRpdGluZ19pbml0aWFsaXplcnMsIF9lZGl0aW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTkodGhpcywgbnVsbCwgX2NvbnRlbnRUeXBlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNvbnRlbnRUeXBlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb250ZW50VHlwZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jb250ZW50VHlwZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY29udGVudFR5cGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29udGVudFR5cGVfaW5pdGlhbGl6ZXJzLCBfY29udGVudFR5cGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU1OSh0aGlzLCBudWxsLCBfZmlsZVNpemVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZmlsZVNpemUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZpbGVTaXplIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmZpbGVTaXplLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5maWxlU2l6ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9maWxlU2l6ZV9pbml0aWFsaXplcnMsIF9maWxlU2l6ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU5KHRoaXMsIG51bGwsIF9sYXN0TW9kaWZpZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibGFzdE1vZGlmaWVkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsYXN0TW9kaWZpZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubGFzdE1vZGlmaWVkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5sYXN0TW9kaWZpZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbGFzdE1vZGlmaWVkX2luaXRpYWxpemVycywgX2xhc3RNb2RpZmllZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTU5KHRoaXMsIG51bGwsIF9lcnJvcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJlcnJvciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZXJyb3IiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZXJyb3IsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmVycm9yID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Vycm9yX2luaXRpYWxpemVycywgX2Vycm9yX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNTkobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzU3RvcmFnZVByZXZpZXcyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgICNkYXRhUHJvdmlkZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX2RhdGFQcm92aWRlcl9pbml0aWFsaXplcnMsIG51bGwpOwogICAgZ2V0IGRhdGFQcm92aWRlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2RhdGFQcm92aWRlcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGRhdGFQcm92aWRlcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jZGF0YVByb3ZpZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYnVja2V0TmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX2RhdGFQcm92aWRlcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX2J1Y2tldE5hbWVfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGJ1Y2tldE5hbWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNidWNrZXROYW1lX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYnVja2V0TmFtZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYnVja2V0TmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI29iamVjdEtleV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX2J1Y2tldE5hbWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczYwKHRoaXMsIF9vYmplY3RLZXlfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IG9iamVjdEtleSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI29iamVjdEtleV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG9iamVjdEtleSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jb2JqZWN0S2V5X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX29iamVjdEtleV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX2xvYWRpbmdfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGxvYWRpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNsb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbG9hZGluZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NhdmluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX2xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczYwKHRoaXMsIF9zYXZpbmdfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHNhdmluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NhdmluZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNhdmluZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2F2aW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29udGVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX3NhdmluZ19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX2NvbnRlbnRfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGNvbnRlbnQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb250ZW50X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29udGVudCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29udGVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI29yaWdpbmFsVGV4dENvbnRlbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczYwKHRoaXMsIF9jb250ZW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2MCh0aGlzLCBfb3JpZ2luYWxUZXh0Q29udGVudF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgb3JpZ2luYWxUZXh0Q29udGVudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI29yaWdpbmFsVGV4dENvbnRlbnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBvcmlnaW5hbFRleHRDb250ZW50KHZhbHVlMikgewogICAgICB0aGlzLiNvcmlnaW5hbFRleHRDb250ZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaGFzQ2hhbmdlc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX29yaWdpbmFsVGV4dENvbnRlbnRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczYwKHRoaXMsIF9oYXNDaGFuZ2VzX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBoYXNDaGFuZ2VzKCkgewogICAgICByZXR1cm4gdGhpcy4jaGFzQ2hhbmdlc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGhhc0NoYW5nZXModmFsdWUyKSB7CiAgICAgIHRoaXMuI2hhc0NoYW5nZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNlZGl0aW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2MCh0aGlzLCBfaGFzQ2hhbmdlc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX2VkaXRpbmdfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGVkaXRpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNlZGl0aW5nX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZWRpdGluZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZWRpdGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NvbnRlbnRUeXBlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2MCh0aGlzLCBfZWRpdGluZ19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX2NvbnRlbnRUeXBlX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBjb250ZW50VHlwZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NvbnRlbnRUeXBlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29udGVudFR5cGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2NvbnRlbnRUeXBlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZmlsZVNpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczYwKHRoaXMsIF9jb250ZW50VHlwZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX2ZpbGVTaXplX2luaXRpYWxpemVycywgMCkpOwogICAgZ2V0IGZpbGVTaXplKCkgewogICAgICByZXR1cm4gdGhpcy4jZmlsZVNpemVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBmaWxlU2l6ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZmlsZVNpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsYXN0TW9kaWZpZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczYwKHRoaXMsIF9maWxlU2l6ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX2xhc3RNb2RpZmllZF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgbGFzdE1vZGlmaWVkKCkgewogICAgICByZXR1cm4gdGhpcy4jbGFzdE1vZGlmaWVkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbGFzdE1vZGlmaWVkKHZhbHVlMikgewogICAgICB0aGlzLiNsYXN0TW9kaWZpZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNlcnJvcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX2xhc3RNb2RpZmllZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjAodGhpcywgX2Vycm9yX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBlcnJvcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2Vycm9yX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZXJyb3IodmFsdWUyKSB7CiAgICAgIHRoaXMuI2Vycm9yX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLnByZXZpZXctY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAucHJldmlldy1oZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzMzMiKX07CiAgICAgIH0KCiAgICAgIC5wcmV2aWV3LXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOwogICAgICB9CgogICAgICAucHJldmlldy1tZXRhIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBnYXA6IDE2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjODg4Iil9OwogICAgICB9CgogICAgICAubWV0YS1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgIH0KCiAgICAgIC5wcmV2aWV3LWNvbnRlbnQgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnByZXZpZXctY29udGVudCBkZWVzLXByZXZpZXcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLnByZXZpZXctY29udGVudC5jb2RlLWVkaXRvciB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAucHJldmlldy1jb250ZW50LmNvZGUtZWRpdG9yIGRlZXMtaW5wdXQtY29kZSB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAucHJldmlldy1hY3Rpb25zIHsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzMzIil9OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnRuIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIHBhZGRpbmc6IDhweCAxNnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDUpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Q0ZDRkOCIsICIjNDA0MDQwIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNmM2Y0NiIsICIjZTBlMGUwIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1czsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idG46aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDgpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnRuLmRhbmdlciB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyMzksIDY4LCA2OCwgMC4yKTsKICAgICAgICBib3JkZXItY29sb3I6ICNlZjQ0NDQ7CiAgICAgICAgY29sb3I6ICNmODcxNzE7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnRuLmRhbmdlcjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyMzksIDY4LCA2OCwgMC4zKTsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idG4ucHJpbWFyeSB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSg1OSwgMTMwLCAyNDYsIDAuMyk7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjM2I4MmY2OwogICAgICAgIGNvbG9yOiAjNjBhNWZhOwogICAgICB9CgogICAgICAuYWN0aW9uLWJ0bi5wcmltYXJ5OmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDU5LCAxMzAsIDI0NiwgMC40KTsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idG4ucHJpbWFyeTpkaXNhYmxlZCB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnRuLnNlY29uZGFyeSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wMykiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSIpfTsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDRkNGQ4IiwgIiM1NTUiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiNhYWEiKX07CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnRuLnNlY29uZGFyeTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wNikiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzE4MTgxYiIsICIjZmZmIil9OwogICAgICB9CgogICAgICAudW5zYXZlZC1pbmRpY2F0b3IgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDZweDsKICAgICAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1MSwgMTkxLCAzNiwgMC4xKTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1MSwgMTkxLCAzNiwgMC4zKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAjZmJiZjI0OwogICAgICB9CgogICAgICAudW5zYXZlZC1kb3QgewogICAgICAgIHdpZHRoOiA2cHg7CiAgICAgICAgaGVpZ2h0OiA2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJhY2tncm91bmQ6ICNmYmJmMjQ7CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ExYTFhYSIsICIjNjY2Iil9OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUgc3ZnIHsKICAgICAgICB3aWR0aDogNDhweDsKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIC5sb2FkaW5nLXN0YXRlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjODg4Iil9OwogICAgICB9CgogICAgICAuZXJyb3Itc3RhdGUgewogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgY29sb3I6ICNmODcxNzE7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CiAgICBgCiAgICBdOwogICAgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJvYmplY3RLZXkiKSB8fCBjaGFuZ2VkUHJvcGVydGllcy5oYXMoImJ1Y2tldE5hbWUiKSkgewogICAgICAgIGlmICh0aGlzLm9iamVjdEtleSkgewogICAgICAgICAgdGhpcy5sb2FkT2JqZWN0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuY29udGVudCA9ICIiOwogICAgICAgICAgdGhpcy5jb250ZW50VHlwZSA9ICIiOwogICAgICAgICAgdGhpcy5lcnJvciA9ICIiOwogICAgICAgICAgdGhpcy5vcmlnaW5hbFRleHRDb250ZW50ID0gIiI7CiAgICAgICAgICB0aGlzLmhhc0NoYW5nZXMgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuZWRpdGluZyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXN5bmMgbG9hZE9iamVjdCgpIHsKICAgICAgaWYgKCF0aGlzLm9iamVjdEtleSB8fCAhdGhpcy5idWNrZXROYW1lIHx8ICF0aGlzLmRhdGFQcm92aWRlcikKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7CiAgICAgIHRoaXMuZXJyb3IgPSAiIjsKICAgICAgdGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7CiAgICAgIHRoaXMuZWRpdGluZyA9IGZhbHNlOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZGF0YVByb3ZpZGVyLmdldE9iamVjdCh0aGlzLmJ1Y2tldE5hbWUsIHRoaXMub2JqZWN0S2V5KTsKICAgICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgICAgdGhpcy5lcnJvciA9ICJPYmplY3Qgbm90IGZvdW5kIjsKICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLmNvbnRlbnQgPSByZXN1bHQuY29udGVudCB8fCAiIjsKICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gcmVzdWx0LmNvbnRlbnRUeXBlIHx8ICIiOwogICAgICAgIHRoaXMuZmlsZVNpemUgPSByZXN1bHQuc2l6ZSB8fCAwOwogICAgICAgIHRoaXMubGFzdE1vZGlmaWVkID0gcmVzdWx0Lmxhc3RNb2RpZmllZCB8fCAiIjsKICAgICAgICBpZiAodGhpcy5pc1RleHQoKSkgewogICAgICAgICAgdGhpcy5vcmlnaW5hbFRleHRDb250ZW50ID0gdGhpcy5nZXRUZXh0Q29udGVudCgpOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgbG9hZGluZyBvYmplY3Q6IiwgZXJyKTsKICAgICAgICB0aGlzLmVycm9yID0gIkZhaWxlZCB0byBsb2FkIG9iamVjdCI7CiAgICAgIH0KICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICB9CiAgICBmb3JtYXREYXRlKGRhdGVTdHIpIHsKICAgICAgaWYgKCFkYXRlU3RyKQogICAgICAgIHJldHVybiAiLSI7CiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXRlU3RyKTsKICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVTdHJpbmcoKTsKICAgIH0KICAgIGlzSW1hZ2UoKSB7CiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoImltYWdlLyIpOwogICAgfQogICAgaXNUZXh0KCkgewogICAgICByZXR1cm4gdGhpcy5jb250ZW50VHlwZS5zdGFydHNXaXRoKCJ0ZXh0LyIpIHx8IHRoaXMuY29udGVudFR5cGUgPT09ICJhcHBsaWNhdGlvbi9qc29uIiB8fCB0aGlzLmNvbnRlbnRUeXBlID09PSAiYXBwbGljYXRpb24veG1sIiB8fCB0aGlzLmNvbnRlbnRUeXBlID09PSAiYXBwbGljYXRpb24vamF2YXNjcmlwdCI7CiAgICB9CiAgICBnZXRUZXh0Q29udGVudCgpIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBiaW5hcnlTdHJpbmcgPSBhdG9iKHRoaXMuY29udGVudCk7CiAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnlTdHJpbmcubGVuZ3RoKTsKICAgICAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBiaW5hcnlTdHJpbmcubGVuZ3RoOyBpMTErKykgewogICAgICAgICAgYnl0ZXNbaTExXSA9IGJpbmFyeVN0cmluZy5jaGFyQ29kZUF0KGkxMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoInV0Zi04IikuZGVjb2RlKGJ5dGVzKTsKICAgICAgfSBjYXRjaCB7CiAgICAgICAgcmV0dXJuICJVbmFibGUgdG8gZGVjb2RlIGNvbnRlbnQiOwogICAgICB9CiAgICB9CiAgICBhc3luYyBoYW5kbGVEb3dubG9hZCgpIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW1VpbnQ4QXJyYXkuZnJvbShhdG9iKHRoaXMuY29udGVudCksIChjMTEpID0+IGMxMS5jaGFyQ29kZUF0KDApKV0sIHsKICAgICAgICAgIHR5cGU6IHRoaXMuY29udGVudFR5cGUKICAgICAgICB9KTsKICAgICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgICAgIGNvbnN0IGE1ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwogICAgICAgIGE1LmhyZWYgPSB1cmw7CiAgICAgICAgYTUuZG93bmxvYWQgPSBnZXRGaWxlTmFtZSh0aGlzLm9iamVjdEtleSk7CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhNSk7CiAgICAgICAgYTUuY2xpY2soKTsKICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGE1KTsKICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGRvd25sb2FkaW5nOiIsIGVycik7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGhhbmRsZURlbGV0ZSgpIHsKICAgICAgaWYgKCF0aGlzLmRhdGFQcm92aWRlcikKICAgICAgICByZXR1cm47CiAgICAgIGlmICghY29uZmlybShgRGVsZXRlICIke2dldEZpbGVOYW1lKHRoaXMub2JqZWN0S2V5KX0iP2ApKQogICAgICAgIHJldHVybjsKICAgICAgdHJ5IHsKICAgICAgICBhd2FpdCB0aGlzLmRhdGFQcm92aWRlci5kZWxldGVPYmplY3QodGhpcy5idWNrZXROYW1lLCB0aGlzLm9iamVjdEtleSk7CiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgib2JqZWN0LWRlbGV0ZWQiLCB7CiAgICAgICAgICBkZXRhaWw6IHsga2V5OiB0aGlzLm9iamVjdEtleSB9LAogICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgfSkpOwogICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJFcnJvciBkZWxldGluZyBvYmplY3Q6IiwgZXJyKTsKICAgICAgfQogICAgfQogICAgZ2V0TGFuZ3VhZ2UoKSB7CiAgICAgIGNvbnN0IGV4dCA9IHRoaXMub2JqZWN0S2V5LnNwbGl0KCIuIikucG9wKCk/LnRvTG93ZXJDYXNlKCkgfHwgIiI7CiAgICAgIGNvbnN0IGxhbmd1YWdlTWFwID0gewogICAgICAgIHRzOiAidHlwZXNjcmlwdCIsCiAgICAgICAgdHN4OiAidHlwZXNjcmlwdCIsCiAgICAgICAganM6ICJqYXZhc2NyaXB0IiwKICAgICAgICBqc3g6ICJqYXZhc2NyaXB0IiwKICAgICAgICBtanM6ICJqYXZhc2NyaXB0IiwKICAgICAgICBjanM6ICJqYXZhc2NyaXB0IiwKICAgICAgICBqc29uOiAianNvbiIsCiAgICAgICAgaHRtbDogImh0bWwiLAogICAgICAgIGh0bTogImh0bWwiLAogICAgICAgIGNzczogImNzcyIsCiAgICAgICAgc2NzczogInNjc3MiLAogICAgICAgIHNhc3M6ICJzY3NzIiwKICAgICAgICBsZXNzOiAibGVzcyIsCiAgICAgICAgbWQ6ICJtYXJrZG93biIsCiAgICAgICAgbWFya2Rvd246ICJtYXJrZG93biIsCiAgICAgICAgeG1sOiAieG1sIiwKICAgICAgICB5YW1sOiAieWFtbCIsCiAgICAgICAgeW1sOiAieWFtbCIsCiAgICAgICAgcHk6ICJweXRob24iLAogICAgICAgIHJiOiAicnVieSIsCiAgICAgICAgZ286ICJnbyIsCiAgICAgICAgcnM6ICJydXN0IiwKICAgICAgICBqYXZhOiAiamF2YSIsCiAgICAgICAgYzogImMiLAogICAgICAgIGNwcDogImNwcCIsCiAgICAgICAgaDogImMiLAogICAgICAgIGhwcDogImNwcCIsCiAgICAgICAgY3M6ICJjc2hhcnAiLAogICAgICAgIHBocDogInBocCIsCiAgICAgICAgc2g6ICJzaGVsbCIsCiAgICAgICAgYmFzaDogInNoZWxsIiwKICAgICAgICB6c2g6ICJzaGVsbCIsCiAgICAgICAgc3FsOiAic3FsIiwKICAgICAgICBncmFwaHFsOiAiZ3JhcGhxbCIsCiAgICAgICAgZ3FsOiAiZ3JhcGhxbCIsCiAgICAgICAgZG9ja2VyZmlsZTogImRvY2tlcmZpbGUiLAogICAgICAgIHR4dDogInBsYWludGV4dCIKICAgICAgfTsKICAgICAgcmV0dXJuIGxhbmd1YWdlTWFwW2V4dF0gfHwgInBsYWludGV4dCI7CiAgICB9CiAgICBoYW5kbGVDb250ZW50Q2hhbmdlKGV2ZW50KSB7CiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZXZlbnQuZGV0YWlsOwogICAgICB0aGlzLmhhc0NoYW5nZXMgPSBuZXdWYWx1ZSAhPT0gdGhpcy5vcmlnaW5hbFRleHRDb250ZW50OwogICAgfQogICAgaGFuZGxlRWRpdCgpIHsKICAgICAgdGhpcy5lZGl0aW5nID0gdHJ1ZTsKICAgIH0KICAgIGhhbmRsZURpc2NhcmQoKSB7CiAgICAgIGNvbnN0IGNvZGVFZGl0b3IgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtY29kZSIpOwogICAgICBpZiAoY29kZUVkaXRvcikgewogICAgICAgIGNvZGVFZGl0b3IudmFsdWUgPSB0aGlzLm9yaWdpbmFsVGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgdGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7CiAgICAgIHRoaXMuZWRpdGluZyA9IGZhbHNlOwogICAgfQogICAgYXN5bmMgaGFuZGxlU2F2ZSgpIHsKICAgICAgaWYgKCF0aGlzLmhhc0NoYW5nZXMgfHwgdGhpcy5zYXZpbmcgfHwgIXRoaXMuZGF0YVByb3ZpZGVyKQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5zYXZpbmcgPSB0cnVlOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IGNvZGVFZGl0b3IgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtY29kZSIpOwogICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZW50ID0gY29kZUVkaXRvcj8udmFsdWUgPz8gIiI7CiAgICAgICAgY29uc3QgZW5jb2RlcjIgPSBuZXcgVGV4dEVuY29kZXIoKTsKICAgICAgICBjb25zdCBieXRlcyA9IGVuY29kZXIyLmVuY29kZShjdXJyZW50Q29udGVudCk7CiAgICAgICAgY29uc3QgYmFzZTY0Q29udGVudCA9IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5ieXRlcykpOwogICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCB0aGlzLmRhdGFQcm92aWRlci5wdXRPYmplY3QodGhpcy5idWNrZXROYW1lLCB0aGlzLm9iamVjdEtleSwgYmFzZTY0Q29udGVudCwgdGhpcy5jb250ZW50VHlwZSk7CiAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKICAgICAgICAgIHRoaXMub3JpZ2luYWxUZXh0Q29udGVudCA9IGN1cnJlbnRDb250ZW50OwogICAgICAgICAgdGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7CiAgICAgICAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuY29udGVudCA9IGJhc2U2NENvbnRlbnQ7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJFcnJvciBzYXZpbmcgb2JqZWN0OiIsIGVycik7CiAgICAgIH0KICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTsKICAgIH0KICAgIHJlbmRlcigpIHsKICAgICAgaWYgKCF0aGlzLm9iamVjdEtleSkgewogICAgICAgIHJldHVybiBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJwcmV2aWV3LWNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+CiAgICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQgMkg2YTIgMiAwIDAgMC0yIDJ2MTZhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0yVjh6IiAvPgogICAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9IjE0IDIgMTQgOCAyMCA4IiAvPgogICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgPHA+U2VsZWN0IGEgZmlsZSB0byBwcmV2aWV3PC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIGA7CiAgICAgIH0KICAgICAgaWYgKHRoaXMubG9hZGluZykgewogICAgICAgIHJldHVybiBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJwcmV2aWV3LWNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2FkaW5nLXN0YXRlIj5Mb2FkaW5nLi4uPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIGA7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuZXJyb3IpIHsKICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgPGRpdiBjbGFzcz0icHJldmlldy1jb250YWluZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZXJyb3Itc3RhdGUiPiR7dGhpcy5lcnJvcn08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgYDsKICAgICAgfQogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InByZXZpZXctY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJwcmV2aWV3LWhlYWRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwcmV2aWV3LXRpdGxlIj4ke2dldEZpbGVOYW1lKHRoaXMub2JqZWN0S2V5KX08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InByZXZpZXctbWV0YSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtZXRhLWl0ZW0iPiR7dGhpcy5jb250ZW50VHlwZX08L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtZXRhLWl0ZW0iPiR7Zm9ybWF0U2l6ZSh0aGlzLmZpbGVTaXplKX08L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtZXRhLWl0ZW0iPiR7dGhpcy5mb3JtYXREYXRlKHRoaXMubGFzdE1vZGlmaWVkKX08L3NwYW4+CiAgICAgICAgICAgICR7dGhpcy5oYXNDaGFuZ2VzID8gYjJgCiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InVuc2F2ZWQtaW5kaWNhdG9yIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ1bnNhdmVkLWRvdCI+PC9zcGFuPgogICAgICAgICAgICAgICAgVW5zYXZlZCBjaGFuZ2VzCiAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0icHJldmlldy1jb250ZW50ICR7dGhpcy5lZGl0aW5nID8gImNvZGUtZWRpdG9yIiA6ICIifSI+CiAgICAgICAgICAke3RoaXMuZWRpdGluZyA/IGIyYAogICAgICAgICAgICAgICAgPGRlZXMtaW5wdXQtY29kZQogICAgICAgICAgICAgICAgICAudmFsdWU9JHt0aGlzLm9yaWdpbmFsVGV4dENvbnRlbnR9CiAgICAgICAgICAgICAgICAgIC5sYW5ndWFnZT0ke3RoaXMuZ2V0TGFuZ3VhZ2UoKX0KICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIxMDAlIgogICAgICAgICAgICAgICAgICBAY29udGVudC1jaGFuZ2U9JHsoZTExKSA9PiB0aGlzLmhhbmRsZUNvbnRlbnRDaGFuZ2UoZTExKX0KICAgICAgICAgICAgICAgID48L2RlZXMtaW5wdXQtY29kZT4KICAgICAgICAgICAgICBgIDogdGhpcy5pc1RleHQoKSA/IGIyYAogICAgICAgICAgICAgICAgICA8ZGVlcy1wcmV2aWV3CiAgICAgICAgICAgICAgICAgICAgLnRleHRDb250ZW50PSR7dGhpcy5vcmlnaW5hbFRleHRDb250ZW50fQogICAgICAgICAgICAgICAgICAgIC5maWxlbmFtZT0ke2dldEZpbGVOYW1lKHRoaXMub2JqZWN0S2V5KX0KICAgICAgICAgICAgICAgICAgICAubGFuZ3VhZ2U9JHt0aGlzLmdldExhbmd1YWdlKCl9CiAgICAgICAgICAgICAgICAgICAgLnNob3dUb29sYmFyPSR7dHJ1ZX0KICAgICAgICAgICAgICAgICAgICAuc2hvd0ZpbGVuYW1lPSR7ZmFsc2V9CiAgICAgICAgICAgICAgICAgID48L2RlZXMtcHJldmlldz4KICAgICAgICAgICAgICAgIGAgOiBiMmAKICAgICAgICAgICAgICAgICAgPGRlZXMtcHJldmlldwogICAgICAgICAgICAgICAgICAgIC5iYXNlNjQ9JHt0aGlzLmNvbnRlbnR9CiAgICAgICAgICAgICAgICAgICAgLm1pbWVUeXBlPSR7dGhpcy5jb250ZW50VHlwZX0KICAgICAgICAgICAgICAgICAgICAuZmlsZW5hbWU9JHtnZXRGaWxlTmFtZSh0aGlzLm9iamVjdEtleSl9CiAgICAgICAgICAgICAgICAgICAgLnNob3dUb29sYmFyPSR7dHJ1ZX0KICAgICAgICAgICAgICAgICAgICAuc2hvd0ZpbGVuYW1lPSR7ZmFsc2V9CiAgICAgICAgICAgICAgICAgID48L2RlZXMtcHJldmlldz4KICAgICAgICAgICAgICAgIGB9CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9InByZXZpZXctYWN0aW9ucyI+CiAgICAgICAgICAke3RoaXMuZWRpdGluZyA/IGIyYAogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWN0aW9uLWJ0biBzZWNvbmRhcnkiIEBjbGljaz0ke3RoaXMuaGFuZGxlRGlzY2FyZH0+CiAgICAgICAgICAgICAgICAgICR7dGhpcy5oYXNDaGFuZ2VzID8gIkRpc2NhcmQiIDogIkNhbmNlbCJ9CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgICAgY2xhc3M9ImFjdGlvbi1idG4gcHJpbWFyeSIKICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy5oYW5kbGVTYXZlfQogICAgICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHt0aGlzLnNhdmluZyB8fCAhdGhpcy5oYXNDaGFuZ2VzfQogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAke3RoaXMuc2F2aW5nID8gIlNhdmluZy4uLiIgOiAiU2F2ZSJ9CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICBgIDogYjJgCiAgICAgICAgICAgICAgICAke3RoaXMuaXNUZXh0KCkgPyBiMmA8YnV0dG9uIGNsYXNzPSJhY3Rpb24tYnRuIiBAY2xpY2s9JHt0aGlzLmhhbmRsZUVkaXR9PkVkaXQ8L2J1dHRvbj5gIDogIiJ9CiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhY3Rpb24tYnRuIiBAY2xpY2s9JHt0aGlzLmhhbmRsZURvd25sb2FkfT5Eb3dubG9hZDwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWN0aW9uLWJ0biBkYW5nZXIiIEBjbGljaz0ke3RoaXMuaGFuZGxlRGVsZXRlfT5EZWxldGU8L2J1dHRvbj4KICAgICAgICAgICAgICBgfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnM2MCh0aGlzLCBfZXJyb3JfZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM2MChfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1N0b3JhZ2VQcmV2aWV3MiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZGF0YXZpZXcvZGVlcy1zdG9yYWdlLWJyb3dzZXIvZGVlcy1zdG9yYWdlLWJyb3dzZXIuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlNjAgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczYxID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzU3RvcmFnZUJyb3dzZXIgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtc3RvcmFnZS1icm93c2VyIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfZGF0YVByb3ZpZGVyX2RlY29yYXRvcnM7CiAgbGV0IF9kYXRhUHJvdmlkZXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kYXRhUHJvdmlkZXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2J1Y2tldE5hbWVfZGVjb3JhdG9yczsKICBsZXQgX2J1Y2tldE5hbWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9idWNrZXROYW1lX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vbkNoYW5nZUV2ZW50X2RlY29yYXRvcnM7CiAgbGV0IF9vbkNoYW5nZUV2ZW50X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfb25DaGFuZ2VFdmVudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmlld1R5cGVfZGVjb3JhdG9yczsKICBsZXQgX3ZpZXdUeXBlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmlld1R5cGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2N1cnJlbnRQcmVmaXhfZGVjb3JhdG9yczsKICBsZXQgX2N1cnJlbnRQcmVmaXhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50UHJlZml4X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZEtleV9kZWNvcmF0b3JzOwogIGxldCBfc2VsZWN0ZWRLZXlfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZEtleV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVmcmVzaEtleV9kZWNvcmF0b3JzOwogIGxldCBfcmVmcmVzaEtleV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JlZnJlc2hLZXlfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ByZXZpZXdXaWR0aF9kZWNvcmF0b3JzOwogIGxldCBfcHJldmlld1dpZHRoX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcHJldmlld1dpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc1Jlc2l6aW5nUHJldmlld19kZWNvcmF0b3JzOwogIGxldCBfaXNSZXNpemluZ1ByZXZpZXdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc1Jlc2l6aW5nUHJldmlld19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVjZW50Q2hhbmdlQ291bnRfZGVjb3JhdG9yczsKICBsZXQgX3JlY2VudENoYW5nZUNvdW50X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVjZW50Q2hhbmdlQ291bnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzU3RyZWFtQ29ubmVjdGVkX2RlY29yYXRvcnM7CiAgbGV0IF9pc1N0cmVhbUNvbm5lY3RlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzU3RyZWFtQ29ubmVjdGVkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNTdG9yYWdlQnJvd3NlcjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9kYXRhUHJvdmlkZXJfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF9idWNrZXROYW1lX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfb25DaGFuZ2VFdmVudF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogT2JqZWN0IH0pXTsKICAgICAgX3ZpZXdUeXBlX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9jdXJyZW50UHJlZml4X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9zZWxlY3RlZEtleV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfcmVmcmVzaEtleV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfcHJldmlld1dpZHRoX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pc1Jlc2l6aW5nUHJldmlld19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfcmVjZW50Q2hhbmdlQ291bnRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2lzU3RyZWFtQ29ubmVjdGVkX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTYwKHRoaXMsIG51bGwsIF9kYXRhUHJvdmlkZXJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZGF0YVByb3ZpZGVyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkYXRhUHJvdmlkZXIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZGF0YVByb3ZpZGVyLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kYXRhUHJvdmlkZXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZGF0YVByb3ZpZGVyX2luaXRpYWxpemVycywgX2RhdGFQcm92aWRlcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTYwKHRoaXMsIG51bGwsIF9idWNrZXROYW1lX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImJ1Y2tldE5hbWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImJ1Y2tldE5hbWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYnVja2V0TmFtZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYnVja2V0TmFtZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9idWNrZXROYW1lX2luaXRpYWxpemVycywgX2J1Y2tldE5hbWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2MCh0aGlzLCBudWxsLCBfb25DaGFuZ2VFdmVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJvbkNoYW5nZUV2ZW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJvbkNoYW5nZUV2ZW50IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm9uQ2hhbmdlRXZlbnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm9uQ2hhbmdlRXZlbnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfb25DaGFuZ2VFdmVudF9pbml0aWFsaXplcnMsIF9vbkNoYW5nZUV2ZW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjAodGhpcywgbnVsbCwgX3ZpZXdUeXBlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZpZXdUeXBlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ2aWV3VHlwZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai52aWV3VHlwZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudmlld1R5cGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdmlld1R5cGVfaW5pdGlhbGl6ZXJzLCBfdmlld1R5cGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2MCh0aGlzLCBudWxsLCBfY3VycmVudFByZWZpeF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjdXJyZW50UHJlZml4Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjdXJyZW50UHJlZml4IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmN1cnJlbnRQcmVmaXgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmN1cnJlbnRQcmVmaXggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY3VycmVudFByZWZpeF9pbml0aWFsaXplcnMsIF9jdXJyZW50UHJlZml4X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjAodGhpcywgbnVsbCwgX3NlbGVjdGVkS2V5X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlbGVjdGVkS2V5Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3RlZEtleSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zZWxlY3RlZEtleSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VsZWN0ZWRLZXkgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0ZWRLZXlfaW5pdGlhbGl6ZXJzLCBfc2VsZWN0ZWRLZXlfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2MCh0aGlzLCBudWxsLCBfcmVmcmVzaEtleV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJyZWZyZXNoS2V5Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJyZWZyZXNoS2V5IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJlZnJlc2hLZXksIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnJlZnJlc2hLZXkgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcmVmcmVzaEtleV9pbml0aWFsaXplcnMsIF9yZWZyZXNoS2V5X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjAodGhpcywgbnVsbCwgX3ByZXZpZXdXaWR0aF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwcmV2aWV3V2lkdGgiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInByZXZpZXdXaWR0aCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5wcmV2aWV3V2lkdGgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnByZXZpZXdXaWR0aCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wcmV2aWV3V2lkdGhfaW5pdGlhbGl6ZXJzLCBfcHJldmlld1dpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjAodGhpcywgbnVsbCwgX2lzUmVzaXppbmdQcmV2aWV3X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzUmVzaXppbmdQcmV2aWV3Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc1Jlc2l6aW5nUHJldmlldyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc1Jlc2l6aW5nUHJldmlldywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNSZXNpemluZ1ByZXZpZXcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNSZXNpemluZ1ByZXZpZXdfaW5pdGlhbGl6ZXJzLCBfaXNSZXNpemluZ1ByZXZpZXdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2MCh0aGlzLCBudWxsLCBfcmVjZW50Q2hhbmdlQ291bnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicmVjZW50Q2hhbmdlQ291bnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInJlY2VudENoYW5nZUNvdW50IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJlY2VudENoYW5nZUNvdW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yZWNlbnRDaGFuZ2VDb3VudCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9yZWNlbnRDaGFuZ2VDb3VudF9pbml0aWFsaXplcnMsIF9yZWNlbnRDaGFuZ2VDb3VudF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTYwKHRoaXMsIG51bGwsIF9pc1N0cmVhbUNvbm5lY3RlZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc1N0cmVhbUNvbm5lY3RlZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNTdHJlYW1Db25uZWN0ZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNTdHJlYW1Db25uZWN0ZWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzU3RyZWFtQ29ubmVjdGVkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzU3RyZWFtQ29ubmVjdGVkX2luaXRpYWxpemVycywgX2lzU3RyZWFtQ29ubmVjdGVkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjAobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzU3RvcmFnZUJyb3dzZXIyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmM0MDsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJEYXRhIFZpZXciXTsKICAgICNkYXRhUHJvdmlkZXJfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNjEodGhpcywgX2RhdGFQcm92aWRlcl9pbml0aWFsaXplcnMsIG51bGwpOwogICAgZ2V0IGRhdGFQcm92aWRlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2RhdGFQcm92aWRlcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGRhdGFQcm92aWRlcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jZGF0YVByb3ZpZGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYnVja2V0TmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjEodGhpcywgX2RhdGFQcm92aWRlcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjEodGhpcywgX2J1Y2tldE5hbWVfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGJ1Y2tldE5hbWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNidWNrZXROYW1lX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYnVja2V0TmFtZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYnVja2V0TmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI29uQ2hhbmdlRXZlbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczYxKHRoaXMsIF9idWNrZXROYW1lX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2MSh0aGlzLCBfb25DaGFuZ2VFdmVudF9pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIC8qKgogICAgICogT3B0aW9uYWwgY2hhbmdlIHN0cmVhbSBzdWJzY3JpcHRpb24uCiAgICAgKiBQYXNzIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGNhbGxiYWNrIGFuZCByZXR1cm5zIGFuIHVuc3Vic2NyaWJlIGZ1bmN0aW9uLgogICAgICovCiAgICBnZXQgb25DaGFuZ2VFdmVudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI29uQ2hhbmdlRXZlbnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBvbkNoYW5nZUV2ZW50KHZhbHVlMikgewogICAgICB0aGlzLiNvbkNoYW5nZUV2ZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdmlld1R5cGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczYxKHRoaXMsIF9vbkNoYW5nZUV2ZW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2MSh0aGlzLCBfdmlld1R5cGVfaW5pdGlhbGl6ZXJzLCAiY29sdW1ucyIpKTsKICAgIGdldCB2aWV3VHlwZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ZpZXdUeXBlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdmlld1R5cGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3ZpZXdUeXBlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY3VycmVudFByZWZpeF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjEodGhpcywgX3ZpZXdUeXBlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2MSh0aGlzLCBfY3VycmVudFByZWZpeF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgY3VycmVudFByZWZpeCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRQcmVmaXhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjdXJyZW50UHJlZml4KHZhbHVlMikgewogICAgICB0aGlzLiNjdXJyZW50UHJlZml4X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0ZWRLZXlfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczYxKHRoaXMsIF9jdXJyZW50UHJlZml4X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2MSh0aGlzLCBfc2VsZWN0ZWRLZXlfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IHNlbGVjdGVkS2V5KCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRLZXlfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzZWxlY3RlZEtleSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VsZWN0ZWRLZXlfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNyZWZyZXNoS2V5X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2MSh0aGlzLCBfc2VsZWN0ZWRLZXlfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczYxKHRoaXMsIF9yZWZyZXNoS2V5X2luaXRpYWxpemVycywgMCkpOwogICAgZ2V0IHJlZnJlc2hLZXkoKSB7CiAgICAgIHJldHVybiB0aGlzLiNyZWZyZXNoS2V5X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcmVmcmVzaEtleSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcmVmcmVzaEtleV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3ByZXZpZXdXaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjEodGhpcywgX3JlZnJlc2hLZXlfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczYxKHRoaXMsIF9wcmV2aWV3V2lkdGhfaW5pdGlhbGl6ZXJzLCA3MDApKTsKICAgIGdldCBwcmV2aWV3V2lkdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwcmV2aWV3V2lkdGhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwcmV2aWV3V2lkdGgodmFsdWUyKSB7CiAgICAgIHRoaXMuI3ByZXZpZXdXaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzUmVzaXppbmdQcmV2aWV3X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2MSh0aGlzLCBfcHJldmlld1dpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2MSh0aGlzLCBfaXNSZXNpemluZ1ByZXZpZXdfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGlzUmVzaXppbmdQcmV2aWV3KCkgewogICAgICByZXR1cm4gdGhpcy4jaXNSZXNpemluZ1ByZXZpZXdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc1Jlc2l6aW5nUHJldmlldyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXNSZXNpemluZ1ByZXZpZXdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNyZWNlbnRDaGFuZ2VDb3VudF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjEodGhpcywgX2lzUmVzaXppbmdQcmV2aWV3X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2MSh0aGlzLCBfcmVjZW50Q2hhbmdlQ291bnRfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgcmVjZW50Q2hhbmdlQ291bnQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNyZWNlbnRDaGFuZ2VDb3VudF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHJlY2VudENoYW5nZUNvdW50KHZhbHVlMikgewogICAgICB0aGlzLiNyZWNlbnRDaGFuZ2VDb3VudF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzU3RyZWFtQ29ubmVjdGVkX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2MSh0aGlzLCBfcmVjZW50Q2hhbmdlQ291bnRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczYxKHRoaXMsIF9pc1N0cmVhbUNvbm5lY3RlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaXNTdHJlYW1Db25uZWN0ZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc1N0cmVhbUNvbm5lY3RlZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzU3RyZWFtQ29ubmVjdGVkKHZhbHVlMikgewogICAgICB0aGlzLiNpc1N0cmVhbUNvbm5lY3RlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgY2hhbmdlVW5zdWJzY3JpYmUgPSAoX19ydW5Jbml0aWFsaXplcnM2MSh0aGlzLCBfaXNTdHJlYW1Db25uZWN0ZWRfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAuYnJvd3Nlci1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC50b29sYmFyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wMykiLCAicmdiYSgwLCAwLCAwLCAwLjIpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICB9CgogICAgICAuYnJlYWRjcnVtYiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNHB4OwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjOTk5Iil9OwogICAgICB9CgogICAgICAuYnJlYWRjcnVtYi1pdGVtIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgcGFkZGluZzogNHB4IDhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1czsKICAgICAgfQoKICAgICAgLmJyZWFkY3J1bWItaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wNSkiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzE4MTgxYiIsICIjZmZmIil9OwogICAgICB9CgogICAgICAuYnJlYWRjcnVtYi1zZXBhcmF0b3IgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Q0ZDRkOCIsICIjNTU1Iil9OwogICAgICB9CgogICAgICAudmlldy10b2dnbGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgIH0KCiAgICAgIC52aWV3LWJ0biB7CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkNGQ0ZDgiLCAiIzQ0NCIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiIzg4OCIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXM7CiAgICAgIH0KCiAgICAgIC52aWV3LWJ0bjpob3ZlciB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ExYTFhYSIsICIjNjY2Iil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNmM2Y0NiIsICIjYWFhIil9OwogICAgICB9CgogICAgICAudmlldy1idG4uYWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjA1KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ExYTFhYSIsICIjNDA0MDQwIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzE4MTgxYiIsICIjZTBlMGUwIil9OwogICAgICB9CgogICAgICAuY29udGVudCB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgICAgIGdhcDogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuY29udGVudC5oYXMtcHJldmlldyB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgNHB4IHZhcigtLXByZXZpZXctd2lkdGgsIDcwMHB4KTsKICAgICAgfQoKICAgICAgLnJlc2l6ZS1kaXZpZGVyIHsKICAgICAgICB3aWR0aDogNHB4OwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnM7CiAgICAgIH0KCiAgICAgIC5yZXNpemUtZGl2aWRlcjpob3ZlciwKICAgICAgLnJlc2l6ZS1kaXZpZGVyLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4xKSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMikiKX07CiAgICAgIH0KCiAgICAgIC5tYWluLXZpZXcgewogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDIpIiwgInJnYmEoMCwgMCwgMCwgMC4yKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgIH0KCiAgICAgIC5wcmV2aWV3LXBhbmVsIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjAyKSIsICJyZ2JhKDAsIDAsIDAsIDAuMikiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEycHg7CiAgICAgIH0KCiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiAxMDI0cHgpIHsKICAgICAgICAuY29udGVudCwKICAgICAgICAuY29udGVudC5oYXMtcHJldmlldyB7CiAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgICAgICB9CgogICAgICAgIC5wcmV2aWV3LXBhbmVsLAogICAgICAgIC5yZXNpemUtZGl2aWRlciB7CiAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLnN0cmVhbS1zdGF0dXMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDRweDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM4ODgiKX07CiAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMnB4OwogICAgICB9CgogICAgICAuc3RyZWFtLWRvdCB7CiAgICAgICAgd2lkdGg6IDZweDsKICAgICAgICBoZWlnaHQ6IDZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNhMWExYWEiLCAiIzg4OCIpfTsKICAgICAgfQoKICAgICAgLnN0cmVhbS1kb3QuY29ubmVjdGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMjJjNTVlOwogICAgICB9CgogICAgICAuY2hhbmdlLWluZGljYXRvciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNnB4OwogICAgICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNDUsIDE1OCwgMTEsIDAuMik7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogI2Y1OWUwYjsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDEycHg7CiAgICAgIH0KCiAgICAgIC5jaGFuZ2UtaW5kaWNhdG9yLnB1bHNlIHsKICAgICAgICBhbmltYXRpb246IHB1bHNlLW9yYW5nZSAxcyBlYXNlLWluLW91dDsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBwdWxzZS1vcmFuZ2UgewogICAgICAgIDAlIHsgYmFja2dyb3VuZDogcmdiYSgyNDUsIDE1OCwgMTEsIDAuNCk7IH0KICAgICAgICAxMDAlIHsgYmFja2dyb3VuZDogcmdiYSgyNDUsIDE1OCwgMTEsIDAuMik7IH0KICAgICAgfQogICAgYAogICAgXTsKICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLnN1YnNjcmliZVRvQ2hhbmdlcygpOwogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tQ2hhbmdlcygpOwogICAgfQogICAgLyoqCiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIHRyaWdnZXIgYSByZWZyZXNoIG9mIGNoaWxkIGNvbXBvbmVudHMKICAgICAqLwogICAgcmVmcmVzaCgpIHsKICAgICAgdGhpcy5yZWZyZXNoS2V5Kys7CiAgICB9CiAgICBzZXRWaWV3VHlwZSh0eXBlNSkgewogICAgICB0aGlzLnZpZXdUeXBlID0gdHlwZTU7CiAgICB9CiAgICBuYXZpZ2F0ZVRvUHJlZml4KHByZWZpeDQpIHsKICAgICAgdGhpcy5jdXJyZW50UHJlZml4ID0gcHJlZml4NDsKICAgICAgdGhpcy5zZWxlY3RlZEtleSA9ICIiOwogICAgfQogICAgaGFuZGxlS2V5U2VsZWN0ZWQoZTExKSB7CiAgICAgIHRoaXMuc2VsZWN0ZWRLZXkgPSBlMTEuZGV0YWlsLmtleTsKICAgIH0KICAgIGhhbmRsZU5hdmlnYXRlKGUxMSkgewogICAgICB0aGlzLm5hdmlnYXRlVG9QcmVmaXgoZTExLmRldGFpbC5wcmVmaXgpOwogICAgfQogICAgaGFuZGxlT2JqZWN0RGVsZXRlZChlMTEpIHsKICAgICAgdGhpcy5zZWxlY3RlZEtleSA9ICIiOwogICAgICB0aGlzLnJlZnJlc2hLZXkrKzsKICAgIH0KICAgIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygiYnVja2V0TmFtZSIpKSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZEtleSA9ICIiOwogICAgICAgIHRoaXMuY3VycmVudFByZWZpeCA9ICIiOwogICAgICAgIHRoaXMucmVjZW50Q2hhbmdlQ291bnQgPSAwOwogICAgICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tQ2hhbmdlcygpOwogICAgICAgIHRoaXMuc3Vic2NyaWJlVG9DaGFuZ2VzKCk7CiAgICAgIH0KICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygib25DaGFuZ2VFdmVudCIpKSB7CiAgICAgICAgdGhpcy51bnN1YnNjcmliZUZyb21DaGFuZ2VzKCk7CiAgICAgICAgdGhpcy5zdWJzY3JpYmVUb0NoYW5nZXMoKTsKICAgICAgfQogICAgfQogICAgc3Vic2NyaWJlVG9DaGFuZ2VzKCkgewogICAgICBpZiAoIXRoaXMub25DaGFuZ2VFdmVudCkgewogICAgICAgIHRoaXMuaXNTdHJlYW1Db25uZWN0ZWQgPSBmYWxzZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICB0aGlzLmNoYW5nZVVuc3Vic2NyaWJlID0gdGhpcy5vbkNoYW5nZUV2ZW50KChldmVudCkgPT4gewogICAgICAgICAgdGhpcy5oYW5kbGVDaGFuZ2UoZXZlbnQpOwogICAgICAgIH0pOwogICAgICAgIHRoaXMuaXNTdHJlYW1Db25uZWN0ZWQgPSB0cnVlOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUud2FybigiW1N0b3JhZ2VCcm93c2VyXSBGYWlsZWQgdG8gc3Vic2NyaWJlIHRvIGNoYW5nZXM6IiwgZXJyb3IpOwogICAgICAgIHRoaXMuaXNTdHJlYW1Db25uZWN0ZWQgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgdW5zdWJzY3JpYmVGcm9tQ2hhbmdlcygpIHsKICAgICAgaWYgKHRoaXMuY2hhbmdlVW5zdWJzY3JpYmUpIHsKICAgICAgICB0aGlzLmNoYW5nZVVuc3Vic2NyaWJlKCk7CiAgICAgICAgdGhpcy5jaGFuZ2VVbnN1YnNjcmliZSA9IG51bGw7CiAgICAgIH0KICAgICAgdGhpcy5pc1N0cmVhbUNvbm5lY3RlZCA9IGZhbHNlOwogICAgfQogICAgaGFuZGxlQ2hhbmdlKGV2ZW50KSB7CiAgICAgIHRoaXMucmVjZW50Q2hhbmdlQ291bnQrKzsKICAgICAgdGhpcy5yZWZyZXNoS2V5Kys7CiAgICB9CiAgICBzdGFydFByZXZpZXdSZXNpemUgPSAoZTExKSA9PiB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB0aGlzLmlzUmVzaXppbmdQcmV2aWV3ID0gdHJ1ZTsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgdGhpcy5oYW5kbGVQcmV2aWV3UmVzaXplKTsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIHRoaXMuZW5kUHJldmlld1Jlc2l6ZSk7CiAgICB9OwogICAgaGFuZGxlUHJldmlld1Jlc2l6ZSA9IChlMTEpID0+IHsKICAgICAgaWYgKCF0aGlzLmlzUmVzaXppbmdQcmV2aWV3KQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgY29udGVudEVsID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuY29udGVudCIpOwogICAgICBpZiAoIWNvbnRlbnRFbCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSBjb250ZW50RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IG5ld1dpZHRoID0gTWF0aC5taW4oTWF0aC5tYXgoY29udGFpbmVyUmVjdC5yaWdodCAtIGUxMS5jbGllbnRYLCAyNTApLCAxZTMpOwogICAgICB0aGlzLnByZXZpZXdXaWR0aCA9IG5ld1dpZHRoOwogICAgfTsKICAgIGVuZFByZXZpZXdSZXNpemUgPSAoKSA9PiB7CiAgICAgIHRoaXMuaXNSZXNpemluZ1ByZXZpZXcgPSBmYWxzZTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgdGhpcy5oYW5kbGVQcmV2aWV3UmVzaXplKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIHRoaXMuZW5kUHJldmlld1Jlc2l6ZSk7CiAgICB9OwogICAgcmVuZGVyKCkgewogICAgICBjb25zdCBicmVhZGNydW1iUGFydHMgPSB0aGlzLmN1cnJlbnRQcmVmaXggPyB0aGlzLmN1cnJlbnRQcmVmaXguc3BsaXQoIi8iKS5maWx0ZXIoQm9vbGVhbikgOiBbXTsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJicm93c2VyLWNvbnRhaW5lciI+CiAgICAgICAgPGRpdiBjbGFzcz0idG9vbGJhciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJicmVhZGNydW1iIj4KICAgICAgICAgICAgPHNwYW4KICAgICAgICAgICAgICBjbGFzcz0iYnJlYWRjcnVtYi1pdGVtIgogICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMubmF2aWdhdGVUb1ByZWZpeCgiIil9CiAgICAgICAgICAgID4KICAgICAgICAgICAgICAke3RoaXMuYnVja2V0TmFtZX0KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAke2JyZWFkY3J1bWJQYXJ0cy5tYXAoKHBhcnQsIGluZGV4MikgPT4gewogICAgICAgIGNvbnN0IHByZWZpeDQgPSBicmVhZGNydW1iUGFydHMuc2xpY2UoMCwgaW5kZXgyICsgMSkuam9pbigiLyIpICsgIi8iOwogICAgICAgIHJldHVybiBiMmAKICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJicmVhZGNydW1iLXNlcGFyYXRvciI+Lzwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuCiAgICAgICAgICAgICAgICAgIGNsYXNzPSJicmVhZGNydW1iLWl0ZW0iCiAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMubmF2aWdhdGVUb1ByZWZpeChwcmVmaXg0KX0KICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgJHtwYXJ0fQogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgIGA7CiAgICAgIH0pfQogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgJHt0aGlzLm9uQ2hhbmdlRXZlbnQgPyBiMmAKICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RyZWFtLXN0YXR1cyI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0cmVhbS1kb3QgJHt0aGlzLmlzU3RyZWFtQ29ubmVjdGVkID8gImNvbm5lY3RlZCIgOiAiIn0iPjwvc3Bhbj4KICAgICAgICAgICAgICAke3RoaXMuaXNTdHJlYW1Db25uZWN0ZWQgPyAiTGl2ZSIgOiAiT2ZmbGluZSJ9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYCA6ICIifQogICAgICAgICAgJHt0aGlzLnJlY2VudENoYW5nZUNvdW50ID4gMCA/IGIyYAogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2hhbmdlLWluZGljYXRvciBwdWxzZSI+CiAgICAgICAgICAgICAgICAgICR7dGhpcy5yZWNlbnRDaGFuZ2VDb3VudH0gY2hhbmdlJHt0aGlzLnJlY2VudENoYW5nZUNvdW50ID4gMSA/ICJzIiA6ICIifQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgYCA6ICIifQogICAgICAgICAgPGRpdiBjbGFzcz0idmlldy10b2dnbGUiPgogICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgY2xhc3M9InZpZXctYnRuICR7dGhpcy52aWV3VHlwZSA9PT0gImNvbHVtbnMiID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5zZXRWaWV3VHlwZSgiY29sdW1ucyIpfQogICAgICAgICAgICA+CiAgICAgICAgICAgICAgQ29sdW1ucwogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgIGNsYXNzPSJ2aWV3LWJ0biAke3RoaXMudmlld1R5cGUgPT09ICJrZXlzIiA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuc2V0Vmlld1R5cGUoImtleXMiKX0KICAgICAgICAgICAgPgogICAgICAgICAgICAgIExpc3QKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCAke3RoaXMuc2VsZWN0ZWRLZXkgPyAiaGFzLXByZXZpZXciIDogIiJ9IiBzdHlsZT0iLS1wcmV2aWV3LXdpZHRoOiAke3RoaXMucHJldmlld1dpZHRofXB4Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9Im1haW4tdmlldyI+CiAgICAgICAgICAgICR7dGhpcy52aWV3VHlwZSA9PT0gImNvbHVtbnMiID8gYjJgCiAgICAgICAgICAgICAgICAgIDxkZWVzLXN0b3JhZ2UtY29sdW1ucwogICAgICAgICAgICAgICAgICAgIC5kYXRhUHJvdmlkZXI9JHt0aGlzLmRhdGFQcm92aWRlcn0KICAgICAgICAgICAgICAgICAgICAuYnVja2V0TmFtZT0ke3RoaXMuYnVja2V0TmFtZX0KICAgICAgICAgICAgICAgICAgICAuY3VycmVudFByZWZpeD0ke3RoaXMuY3VycmVudFByZWZpeH0KICAgICAgICAgICAgICAgICAgICAucmVmcmVzaEtleT0ke3RoaXMucmVmcmVzaEtleX0KICAgICAgICAgICAgICAgICAgICBAa2V5LXNlbGVjdGVkPSR7dGhpcy5oYW5kbGVLZXlTZWxlY3RlZH0KICAgICAgICAgICAgICAgICAgICBAbmF2aWdhdGU9JHt0aGlzLmhhbmRsZU5hdmlnYXRlfQogICAgICAgICAgICAgICAgICA+PC9kZWVzLXN0b3JhZ2UtY29sdW1ucz4KICAgICAgICAgICAgICAgIGAgOiBiMmAKICAgICAgICAgICAgICAgICAgPGRlZXMtc3RvcmFnZS1rZXlzCiAgICAgICAgICAgICAgICAgICAgLmRhdGFQcm92aWRlcj0ke3RoaXMuZGF0YVByb3ZpZGVyfQogICAgICAgICAgICAgICAgICAgIC5idWNrZXROYW1lPSR7dGhpcy5idWNrZXROYW1lfQogICAgICAgICAgICAgICAgICAgIC5jdXJyZW50UHJlZml4PSR7dGhpcy5jdXJyZW50UHJlZml4fQogICAgICAgICAgICAgICAgICAgIC5yZWZyZXNoS2V5PSR7dGhpcy5yZWZyZXNoS2V5fQogICAgICAgICAgICAgICAgICAgIEBrZXktc2VsZWN0ZWQ9JHt0aGlzLmhhbmRsZUtleVNlbGVjdGVkfQogICAgICAgICAgICAgICAgICAgIEBuYXZpZ2F0ZT0ke3RoaXMuaGFuZGxlTmF2aWdhdGV9CiAgICAgICAgICAgICAgICAgID48L2RlZXMtc3RvcmFnZS1rZXlzPgogICAgICAgICAgICAgICAgYH0KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICR7dGhpcy5zZWxlY3RlZEtleSA/IGIyYAogICAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgICBjbGFzcz0icmVzaXplLWRpdmlkZXIgJHt0aGlzLmlzUmVzaXppbmdQcmV2aWV3ID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICAgICAgICAgIEBtb3VzZWRvd249JHt0aGlzLnN0YXJ0UHJldmlld1Jlc2l6ZX0KICAgICAgICAgICAgICAgID48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByZXZpZXctcGFuZWwiPgogICAgICAgICAgICAgICAgICA8ZGVlcy1zdG9yYWdlLXByZXZpZXcKICAgICAgICAgICAgICAgICAgICAuZGF0YVByb3ZpZGVyPSR7dGhpcy5kYXRhUHJvdmlkZXJ9CiAgICAgICAgICAgICAgICAgICAgLmJ1Y2tldE5hbWU9JHt0aGlzLmJ1Y2tldE5hbWV9CiAgICAgICAgICAgICAgICAgICAgLm9iamVjdEtleT0ke3RoaXMuc2VsZWN0ZWRLZXl9CiAgICAgICAgICAgICAgICAgICAgQG9iamVjdC1kZWxldGVkPSR7dGhpcy5oYW5kbGVPYmplY3REZWxldGVkfQogICAgICAgICAgICAgICAgICA+PC9kZWVzLXN0b3JhZ2UtcHJldmlldz4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM2MShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1N0b3JhZ2VCcm93c2VyMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZmVlZGJhY2svZGVlcy1hY3Rpb25iYXIvaW5kZXguanMKaW5pdF9kZWVzX2FjdGlvbmJhcigpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWZlZWRiYWNrL2RlZXMtYmFkZ2UvZGVlcy1iYWRnZS5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkZW1vRnVuYzQxID0gKCkgPT4gYjJgCiAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7Ij4KICAgIDxkZWVzLWJhZGdlIC50ZXh0PSR7IkRlZmF1bHQifT48L2RlZXMtYmFkZ2U+CiAgICA8ZGVlcy1iYWRnZSAudHlwZT0keyJwcmltYXJ5In0gLnRleHQ9JHsiUHJpbWFyeSJ9PjwvZGVlcy1iYWRnZT4KICAgIDxkZWVzLWJhZGdlIC50eXBlPSR7InN1Y2Nlc3MifSAudGV4dD0keyJTdWNjZXNzIn0+PC9kZWVzLWJhZGdlPgogICAgPGRlZXMtYmFkZ2UgLnR5cGU9JHsid2FybmluZyJ9IC50ZXh0PSR7Ildhcm5pbmcifT48L2RlZXMtYmFkZ2U+CiAgICA8ZGVlcy1iYWRnZSAudHlwZT0keyJlcnJvciJ9IC50ZXh0PSR7IkVycm9yIn0+PC9kZWVzLWJhZGdlPgogICAgPGRlZXMtYmFkZ2UgLnR5cGU9JHsicHJpbWFyeSJ9IC5yb3VuZGVkPSR7dHJ1ZX0gLnRleHQ9JHsiUm91bmRlZCJ9PjwvZGVlcy1iYWRnZT4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1mZWVkYmFjay9kZWVzLWJhZGdlL2RlZXMtYmFkZ2UuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF9kaXN0X3RzMjkoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlNjIgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczYzID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzQmFkZ2UgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtYmFkZ2UiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF90eXBlX2RlY29yYXRvcnM7CiAgbGV0IF90eXBlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdHlwZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGV4dF9kZWNvcmF0b3JzOwogIGxldCBfdGV4dF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RleHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3JvdW5kZWRfZGVjb3JhdG9yczsKICBsZXQgX3JvdW5kZWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yb3VuZGVkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNCYWRnZTIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF90eXBlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfdGV4dF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3JvdW5kZWRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfX2VzRGVjb3JhdGU2Mih0aGlzLCBudWxsLCBfdHlwZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0eXBlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0eXBlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnR5cGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnR5cGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdHlwZV9pbml0aWFsaXplcnMsIF90eXBlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjIodGhpcywgbnVsbCwgX3RleHRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGV4dCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGV4dCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50ZXh0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50ZXh0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3RleHRfaW5pdGlhbGl6ZXJzLCBfdGV4dF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTYyKHRoaXMsIG51bGwsIF9yb3VuZGVkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJvdW5kZWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInJvdW5kZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucm91bmRlZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucm91bmRlZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9yb3VuZGVkX2luaXRpYWxpemVycywgX3JvdW5kZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2MihudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNCYWRnZTIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzQxOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkZlZWRiYWNrIl07CiAgICAjdHlwZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM2Myh0aGlzLCBfdHlwZV9pbml0aWFsaXplcnMsICJkZWZhdWx0Iik7CiAgICBnZXQgdHlwZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3R5cGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0eXBlKHZhbHVlMikgewogICAgICB0aGlzLiN0eXBlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdGV4dF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjModGhpcywgX3R5cGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczYzKHRoaXMsIF90ZXh0X2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCB0ZXh0KCkgewogICAgICByZXR1cm4gdGhpcy4jdGV4dF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRleHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3RleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNyb3VuZGVkX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2Myh0aGlzLCBfdGV4dF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjModGhpcywgX3JvdW5kZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHJvdW5kZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNyb3VuZGVkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcm91bmRlZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcm91bmRlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNjModGhpcywgX3JvdW5kZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBkb210b29sc19lbGVtZW50YmFzaWNfZXhwb3J0cy5zZXR1cCgpOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIC5iYWRnZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiAycHggOHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgIC5iYWRnZS5yb3VuZGVkIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgICB9CgogICAgICAuYmFkZ2UuZGVmYXVsdCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmNWY1ZjUiLCAiIzMzMyIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2NjYiLCAiI2NjYyIpfTsKICAgICAgfQoKICAgICAgLmJhZGdlLnByaW1hcnkgewogICAgICAgIGJhY2tncm91bmQ6ICMwMDUwYjk7CiAgICAgICAgY29sb3I6ICNmZmZmZmY7CiAgICAgIH0KCiAgICAgIC5iYWRnZS5zdWNjZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMmU3ZDMyOwogICAgICAgIGNvbG9yOiAjZmZmZmZmOwogICAgICB9CgogICAgICAuYmFkZ2Uud2FybmluZyB7CiAgICAgICAgYmFja2dyb3VuZDogI2VkNmMwMjsKICAgICAgICBjb2xvcjogI2ZmZmZmZjsKICAgICAgfQoKICAgICAgLmJhZGdlLmVycm9yIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTQwMDJiOwogICAgICAgIGNvbG9yOiAjZmZmZmZmOwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImJhZGdlICR7dGhpcy50eXBlfSAke3RoaXMucm91bmRlZCA/ICJyb3VuZGVkIiA6ICIifSI+CiAgICAgICAgJHt0aGlzLnRleHR9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNjMoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNCYWRnZTIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWZlZWRiYWNrL2RlZXMtaGludC9kZWVzLWhpbnQuZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmM0MiA9ICgpID0+IGIyYAogIDxkZWVzLWhpbnQ+PC9kZWVzLWhpbnQ+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZmVlZGJhY2svZGVlcy1oaW50L2RlZXMtaGludC5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2Rpc3RfdHMyOSgpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU2MyA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNjQgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNIaW50ID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLWhpbnQiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF90eXBlX2RlY29yYXRvcnM7CiAgbGV0IF90eXBlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdHlwZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSGludDIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF90eXBlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfX2VzRGVjb3JhdGU2Myh0aGlzLCBudWxsLCBfdHlwZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0eXBlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0eXBlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnR5cGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnR5cGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdHlwZV9pbml0aWFsaXplcnMsIF90eXBlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjMobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzSGludDIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzQyOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkZlZWRiYWNrIl07CiAgICAjdHlwZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM2NCh0aGlzLCBfdHlwZV9pbml0aWFsaXplcnMsICJpbmZvIik7CiAgICBnZXQgdHlwZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3R5cGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0eXBlKHZhbHVlMikgewogICAgICB0aGlzLiN0eXBlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnM2NCh0aGlzLCBfdHlwZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIGRvbXRvb2xzX2VsZW1lbnRiYXNpY19leHBvcnRzLnNldHVwKCk7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gW3RoZW1lRGVmYXVsdFN0eWxlcywgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLCBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgYF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAgPGRpdiBjbGFzcz0ibWFpbmJveCI+PC9kaXY+IGA7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczY0KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzSGludDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWZlZWRiYWNrL2RlZXMtcHJvZ3Jlc3NiYXIvZGVlcy1wcm9ncmVzc2Jhci5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkZW1vRnVuYzQzID0gKCkgPT4gewogIHJldHVybiBiMmAKICAgIDxkZWVzLXByb2dyZXNzYmFyCiAgICAgIC5wZXJjZW50YWdlPSR7NTB9CiAgICA+PC9kZWVzLXByb2dyZXNzYmFyPgogIGA7Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZmVlZGJhY2svZGVlcy1wcm9ncmVzc2Jhci9kZWVzLXByb2dyZXNzYmFyLmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfZGlzdF90czI5KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTY0ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM2NSA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1Byb2dyZXNzYmFyID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLXByb2dyZXNzYmFyIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfcGVyY2VudGFnZV9kZWNvcmF0b3JzOwogIGxldCBfcGVyY2VudGFnZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BlcmNlbnRhZ2VfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1Byb2dyZXNzYmFyMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3BlcmNlbnRhZ2VfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogTnVtYmVyCiAgICAgIH0pXTsKICAgICAgX19lc0RlY29yYXRlNjQodGhpcywgbnVsbCwgX3BlcmNlbnRhZ2VfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicGVyY2VudGFnZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicGVyY2VudGFnZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5wZXJjZW50YWdlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5wZXJjZW50YWdlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3BlcmNlbnRhZ2VfaW5pdGlhbGl6ZXJzLCBfcGVyY2VudGFnZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY0KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1Byb2dyZXNzYmFyMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAvLyBTVEFUSUMKICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmM0MzsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJGZWVkYmFjayJdOwogICAgI3BlcmNlbnRhZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNjUodGhpcywgX3BlcmNlbnRhZ2VfaW5pdGlhbGl6ZXJzLCAwKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgcGVyY2VudGFnZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3BlcmNlbnRhZ2VfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwZXJjZW50YWdlKHZhbHVlMikgewogICAgICB0aGlzLiNwZXJjZW50YWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZShicmlnaHQudGV4dCwgZGFyay50ZXh0KX07CiAgICAgIH0KICAgICAgLnByb2dyZXNzQmFyQ29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgbWluLXdpZHRoOiAyMDBweDsKICAgICAgfQoKICAgICAgLnByb2dyZXNzQmFyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2VlZWVlYiIsICIjNDQ0Iil9OwogICAgICAgIGhlaWdodDogOHB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBib3JkZXItdG9wOiAwLjVweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgibm9uZSIsICIjNTU1Iil9OwogICAgICB9CgogICAgICAucHJvZ3Jlc3NCYXJGaWxsIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZShkYXJrLmJsdWVBY3RpdmUsIGJyaWdodC5ibHVlQWN0aXZlKX07CiAgICAgICAgaGVpZ2h0OiA4cHg7CiAgICAgICAgbWFyZ2luLXRvcDogLTAuNXB4OwogICAgICAgIHRyYW5zaXRpb246IDAuMnMgd2lkdGg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIHdpZHRoOiAwcHg7CiAgICAgICAgYm9yZGVyLXRvcDogMC41IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJub25lIiwgIiMzOThmZmYiKX07CiAgICAgIH0KCiAgICAgIC5wcm9ncmVzc1RleHQgewogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0icHJvZ3Jlc3NCYXJDb250YWluZXIiPgogICAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzQmFyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzQmFyRmlsbCI+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ncmVzc1RleHQiPgogICAgICAgICAgICAke3RoaXMucGVyY2VudGFnZX0lCiAgICAgICAgICA8ZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4gewogICAgICAgIHRoaXMudXBkYXRlUGVyY2VudGFnZSgpOwogICAgICB9KTsKICAgIH0KICAgIGFzeW5jIHVwZGF0ZVBlcmNlbnRhZ2UoKSB7CiAgICAgIGNvbnN0IHByb2dyZXNzQmFyRmlsbCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIucHJvZ3Jlc3NCYXJGaWxsIik7CiAgICAgIHByb2dyZXNzQmFyRmlsbC5zdHlsZS53aWR0aCA9IGAke3RoaXMucGVyY2VudGFnZX0lYDsKICAgIH0KICAgIHVwZGF0ZWQoKSB7CiAgICAgIHRoaXMudXBkYXRlUGVyY2VudGFnZSgpOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNjUodGhpcywgX3BlcmNlbnRhZ2VfZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM2NShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1Byb2dyZXNzYmFyMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZmVlZGJhY2svZGVlcy1zcGlubmVyL2RlZXMtc3Bpbm5lci5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2Rpc3RfdHMyOSgpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU2NSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNjYgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNTcGlubmVyID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLXNwaW5uZXIiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9zaXplX2RlY29yYXRvcnM7CiAgbGV0IF9zaXplX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2l6ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYm53X2RlY29yYXRvcnM7CiAgbGV0IF9ibndfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ibndfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3N0YXR1c19kZWNvcmF0b3JzOwogIGxldCBfc3RhdHVzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc3RhdHVzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNTcGlubmVyMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3NpemVfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogTnVtYmVyCiAgICAgIH0pXTsKICAgICAgX2Jud19kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBTdHJpbmcKICAgICAgfSldOwogICAgICBfc3RhdHVzX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTY1KHRoaXMsIG51bGwsIF9zaXplX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNpemUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNpemUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2l6ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2l6ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaXplX2luaXRpYWxpemVycywgX3NpemVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2NSh0aGlzLCBudWxsLCBfYm53X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImJudyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYm53IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmJudywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYm53ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Jud19pbml0aWFsaXplcnMsIF9ibndfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2NSh0aGlzLCBudWxsLCBfc3RhdHVzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInN0YXR1cyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic3RhdHVzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnN0YXR1cywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc3RhdHVzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3N0YXR1c19pbml0aWFsaXplcnMsIF9zdGF0dXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2NShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNTcGlubmVyMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiRmVlZGJhY2siXTsKICAgIHN0YXRpYyBkZW1vID0gKCkgPT4gYjJgCiAgICA8ZGVlcy1zcGlubmVyPjwvZGVlcy1zcGlubmVyPgogICAgPGRlZXMtc3Bpbm5lciBzdGF0dXM9InN1Y2Nlc3MiPjwvZGVlcy1zcGlubmVyPgogICAgPGRlZXMtc3Bpbm5lciBzdGF0dXM9ImVycm9yIj48L2RlZXMtc3Bpbm5lcj4KICAgIDxkZWVzLXNwaW5uZXIgc2l6ZT0kezY0fSBzdGF0dXM9InN1Y2Nlc3MiPjwvZGVlcy1zcGlubmVyPgogICAgPGRlZXMtc3Bpbm5lciAuc2l6ZT0kezY0fSBzdGF0dXM9ImVycm9yIj48L2RlZXMtc3Bpbm5lcj4KICBgOwogICAgI3NpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNjYodGhpcywgX3NpemVfaW5pdGlhbGl6ZXJzLCAyMCk7CiAgICBnZXQgc2l6ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NpemVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaXplKHZhbHVlMikgewogICAgICB0aGlzLiNzaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYm53X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2Nih0aGlzLCBfc2l6ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjYodGhpcywgX2Jud19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgYm53KCkgewogICAgICByZXR1cm4gdGhpcy4jYm53X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYm53KHZhbHVlMikgewogICAgICB0aGlzLiNibndfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzdGF0dXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY2KHRoaXMsIF9ibndfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczY2KHRoaXMsIF9zdGF0dXNfaW5pdGlhbGl6ZXJzLCAibm9ybWFsIikpOwogICAgZ2V0IHN0YXR1cygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3N0YXR1c19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHN0YXR1cyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc3RhdHVzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgX19ydW5Jbml0aWFsaXplcnM2Nih0aGlzLCBfc3RhdHVzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNsb2FkaW5nIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBiYWNrZ3JvdW5kOiAjOGJjMzRhMDA7CiAgICAgICAgYm9yZGVyOiAzcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4xKSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMykiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJvcmRlci10b3AtY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMzMzIiwgIiNmZmYiKX07CiAgICAgICAgYW5pbWF0aW9uOiBzcGluIDFzIGVhc2UtaW4tb3V0IGluZmluaXRlOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBzcGluIDFzIGVhc2UtaW4tb3V0IGluZmluaXRlOwogICAgICB9CgogICAgICAjbG9hZGluZy5zdWNjZXNzIHsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGFuaW1hdGlvbjogbm9uZTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgI2xvYWRpbmcuZXJyb3IgewogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYW5pbWF0aW9uOiBub25lOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBub25lOwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIHNwaW4gewogICAgICAgIHRvIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIHNwaW4gewogICAgICAgIHRvIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGRlZXMtaWNvbiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8c3R5bGU+CiAgICAgICAgI2xvYWRpbmcgewogICAgICAgICAgd2lkdGg6ICR7dGhpcy5zaXplfXB4OwogICAgICAgICAgaGVpZ2h0OiAke3RoaXMuc2l6ZX1weDsKICAgICAgICB9CiAgICAgICAgI2xvYWRpbmcuc3VjY2VzcyB7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUodGhpcy5ibncgPyAiIzMzMyIgOiBgIzhiYzM0YWAsIHRoaXMuYm53ID8gIiNmZmYiIDogYCM4YmMzNGFgKX07CiAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgI2xvYWRpbmcuZXJyb3IgewogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKHRoaXMuYm53ID8gIiMzMzMiIDogYCNlNjRhMTlgLCB0aGlzLmJudyA/ICIjZmZmIiA6IGAjZTY0YTE5YCl9OwogICAgICAgIH0KICAgICAgICBkZWVzLWljb24gewogICAgICAgICAgZm9udC1zaXplOiAke3RoaXMuc2l6ZX1weDsKICAgICAgICB9CiAgICAgIDwvc3R5bGU+CiAgICAgIDxkaXYgY2xhc3M9IiR7dGhpcy5zdGF0dXN9IiBpZD0ibG9hZGluZyI+CiAgICAgICAgJHsoKCkgPT4gewogICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gInN1Y2Nlc3MiKSB7CiAgICAgICAgICByZXR1cm4gYjJgPGRlZXMtaWNvbiBzdHlsZT0idHJhbnNmb3JtOiB0cmFuc2xhdGVYKDElKSB0cmFuc2xhdGVZKDMlKTsiIC5pY29uPSR7ImZhOmNpcmNsZS1jaGVjayJ9PjwvZGVlcy1pY29uPmA7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXR1cyA9PT0gImVycm9yIikgewogICAgICAgICAgcmV0dXJuIGIyYDxkZWVzLWljb24gLmljb249JHsiZmE6Y2lyY2xlLXhtYXJrIn0+PC9kZWVzLWljb24+YDsKICAgICAgICB9CiAgICAgIH0pKCl9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNjYoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNTcGlubmVyMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtZmVlZGJhY2svZGVlcy10b2FzdC9kZWVzLXRvYXN0LmRlbW8uanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIGRlbW9GdW5jNDQgPSAoKSA9PiBiMmAKICAgIDxzdHlsZT4KICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nOiAzMnB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDEwMHZoOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjhmOWZhIiwgIiMwYTBhMGEiKX07CiAgICAgIH0KCiAgICAgIC5kZW1vLXNlY3Rpb24gewogICAgICAgIG1hcmdpbi1ib3R0b206IDQ4cHg7CiAgICAgIH0KCiAgICAgIC5kZW1vLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDI0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzMzMyIsICIjZmZmIil9OwogICAgICB9CgogICAgICAuZGVtby1kZXNjcmlwdGlvbiB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzY2NiIsICIjYWFhIil9OwogICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgIH0KCiAgICAgIC5idXR0b24tZ3JpZCB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDIwMHB4LCAxZnIpKTsKICAgICAgICBnYXA6IDE2cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMzJweDsKICAgICAgfQoKICAgICAgLnRoZW1lLXRvZ2dsZSB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMTZweDsKICAgICAgICByaWdodDogMTZweDsKICAgICAgICB6LWluZGV4OiAxMDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgICA8ZGVlcy1idXR0b24gY2xhc3M9InRoZW1lLXRvZ2dsZSIgQGNsaWNrZWQ9JHsoKSA9PiB7CiAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJicmlnaHQiKTsKfX0+VG9nZ2xlIFRoZW1lPC9kZWVzLWJ1dHRvbj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgyIGNsYXNzPSJkZW1vLXRpdGxlIj5Ub2FzdCBUeXBlczwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImRlbW8tZGVzY3JpcHRpb24iPgogICAgICAgICAgRGlmZmVyZW50IHRvYXN0IHR5cGVzIGZvciB2YXJpb3VzIG5vdGlmaWNhdGlvbiBzY2VuYXJpb3MuIENsaWNrIGFueSBidXR0b24gdG8gc2hvdyBhIHRvYXN0LgogICAgICAgIDwvcD4KICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JpZCI+CiAgICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrZWQ9JHsoKSA9PiB7CiAgRGVlc1RvYXN0LmluZm8oIlRoaXMgaXMgYW4gaW5mb3JtYXRpb25hbCBtZXNzYWdlIik7Cn19PkluZm8gVG9hc3Q8L2RlZXMtYnV0dG9uPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iaGlnaGxpZ2h0ZWQiIEBjbGlja2VkPSR7KCkgPT4gewogIERlZXNUb2FzdC5zdWNjZXNzKCJPcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSEiKTsKfX0+U3VjY2VzcyBUb2FzdDwvZGVlcy1idXR0b24+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2tlZD0keygpID0+IHsKICBEZWVzVG9hc3Qud2FybmluZygiUGxlYXNlIHJldmlldyBiZWZvcmUgcHJvY2VlZGluZyIpOwp9fT5XYXJuaW5nIFRvYXN0PC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGlja2VkPSR7KCkgPT4gewogIERlZXNUb2FzdC5lcnJvcigiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyIpOwp9fT5FcnJvciBUb2FzdDwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPlRvYXN0IFBvc2l0aW9uczwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImRlbW8tZGVzY3JpcHRpb24iPgogICAgICAgICAgVG9hc3RzIGNhbiBhcHBlYXIgaW4gZGlmZmVyZW50IHBvc2l0aW9ucyBvbiB0aGUgc2NyZWVuLgogICAgICAgIDwvcD4KICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JpZCI+CiAgICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrZWQ9JHsoKSA9PiB7CiAgRGVlc1RvYXN0LnNob3coewogICAgbWVzc2FnZTogIlRvcCBSaWdodCBQb3NpdGlvbiIsCiAgICB0eXBlOiAiaW5mbyIsCiAgICBwb3NpdGlvbjogInRvcC1yaWdodCIKICB9KTsKfX0+VG9wIFJpZ2h0PC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGlja2VkPSR7KCkgPT4gewogIERlZXNUb2FzdC5zaG93KHsKICAgIG1lc3NhZ2U6ICJUb3AgTGVmdCBQb3NpdGlvbiIsCiAgICB0eXBlOiAiaW5mbyIsCiAgICBwb3NpdGlvbjogInRvcC1sZWZ0IgogIH0pOwp9fT5Ub3AgTGVmdDwvZGVlcy1idXR0b24+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2tlZD0keygpID0+IHsKICBEZWVzVG9hc3Quc2hvdyh7CiAgICBtZXNzYWdlOiAiQm90dG9tIFJpZ2h0IFBvc2l0aW9uIiwKICAgIHR5cGU6ICJpbmZvIiwKICAgIHBvc2l0aW9uOiAiYm90dG9tLXJpZ2h0IgogIH0pOwp9fT5Cb3R0b20gUmlnaHQ8L2RlZXMtYnV0dG9uPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrZWQ9JHsoKSA9PiB7CiAgRGVlc1RvYXN0LnNob3coewogICAgbWVzc2FnZTogIkJvdHRvbSBMZWZ0IFBvc2l0aW9uIiwKICAgIHR5cGU6ICJpbmZvIiwKICAgIHBvc2l0aW9uOiAiYm90dG9tLWxlZnQiCiAgfSk7Cn19PkJvdHRvbSBMZWZ0PC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGlja2VkPSR7KCkgPT4gewogIERlZXNUb2FzdC5zaG93KHsKICAgIG1lc3NhZ2U6ICJUb3AgQ2VudGVyIFBvc2l0aW9uIiwKICAgIHR5cGU6ICJpbmZvIiwKICAgIHBvc2l0aW9uOiAidG9wLWNlbnRlciIKICB9KTsKfX0+VG9wIENlbnRlcjwvZGVlcy1idXR0b24+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2tlZD0keygpID0+IHsKICBEZWVzVG9hc3Quc2hvdyh7CiAgICBtZXNzYWdlOiAiQm90dG9tIENlbnRlciBQb3NpdGlvbiIsCiAgICB0eXBlOiAiaW5mbyIsCiAgICBwb3NpdGlvbjogImJvdHRvbS1jZW50ZXIiCiAgfSk7Cn19PkJvdHRvbSBDZW50ZXI8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgyIGNsYXNzPSJkZW1vLXRpdGxlIj5EdXJhdGlvbiBPcHRpb25zPC9oMj4KICAgICAgICA8cCBjbGFzcz0iZGVtby1kZXNjcmlwdGlvbiI+CiAgICAgICAgICBDb250cm9sIGhvdyBsb25nIHRvYXN0cyBzdGF5IHZpc2libGUuIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4KICAgICAgICA8L3A+CiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9uLWdyaWQiPgogICAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGlja2VkPSR7KCkgPT4gewogIERlZXNUb2FzdC5zaG93KHsKICAgIG1lc3NhZ2U6ICJRdWljayB0b2FzdCAoMSBzZWNvbmQpIiwKICAgIHR5cGU6ICJpbmZvIiwKICAgIGR1cmF0aW9uOiAxZTMKICB9KTsKfX0+MSBTZWNvbmQ8L2RlZXMtYnV0dG9uPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrZWQ9JHsoKSA9PiB7CiAgRGVlc1RvYXN0LnNob3coewogICAgbWVzc2FnZTogIlN0YW5kYXJkIHRvYXN0ICgzIHNlY29uZHMpIiwKICAgIHR5cGU6ICJpbmZvIiwKICAgIGR1cmF0aW9uOiAzZTMKICB9KTsKfX0+MyBTZWNvbmRzIChEZWZhdWx0KTwvZGVlcy1idXR0b24+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2tlZD0keygpID0+IHsKICBEZWVzVG9hc3Quc2hvdyh7CiAgICBtZXNzYWdlOiAiTG9uZyB0b2FzdCAoNSBzZWNvbmRzKSIsCiAgICB0eXBlOiAiaW5mbyIsCiAgICBkdXJhdGlvbjogNWUzCiAgfSk7Cn19PjUgU2Vjb25kczwvZGVlcy1idXR0b24+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2tlZD0keygpID0+IHsKICBEZWVzVG9hc3Quc2hvdyh7CiAgICBtZXNzYWdlOiAiTWFudWFsIGRpc21pc3Mgb25seSAoY2xpY2sgdG8gY2xvc2UpIiwKICAgIHR5cGU6ICJ3YXJuaW5nIiwKICAgIGR1cmF0aW9uOiAwCiAgfSk7Cn19Pk5vIEF1dG8tRGlzbWlzczwvZGVlcy1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDIgY2xhc3M9ImRlbW8tdGl0bGUiPk11bHRpcGxlIFRvYXN0czwvaDI+CiAgICAgICAgPHAgY2xhc3M9ImRlbW8tZGVzY3JpcHRpb24iPgogICAgICAgICAgTXVsdGlwbGUgdG9hc3RzIHN0YWNrIGF1dG9tYXRpY2FsbHkuIFRoZXkgbWFpbnRhaW4gdGhlaXIgb3JkZXIgYW5kIGFuaW1hdGUgc21vb3RobHkuCiAgICAgICAgPC9wPgogICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbi1ncmlkIj4KICAgICAgICAgIDxkZWVzLWJ1dHRvbiBAY2xpY2tlZD0keygpID0+IHsKICBEZWVzVG9hc3QuaW5mbygiRmlyc3Qgbm90aWZpY2F0aW9uIik7CiAgc2V0VGltZW91dCgoKSA9PiBEZWVzVG9hc3Quc3VjY2VzcygiU2Vjb25kIG5vdGlmaWNhdGlvbiIpLCAyMDApOwogIHNldFRpbWVvdXQoKCkgPT4gRGVlc1RvYXN0Lndhcm5pbmcoIlRoaXJkIG5vdGlmaWNhdGlvbiIpLCA0MDApOwogIHNldFRpbWVvdXQoKCkgPT4gRGVlc1RvYXN0LmVycm9yKCJGb3VydGggbm90aWZpY2F0aW9uIiksIDYwMCk7Cn19PlNob3cgTXVsdGlwbGU8L2RlZXMtYnV0dG9uPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrZWQ9JHsoKSA9PiB7CiAgZm9yIChsZXQgaTExID0gMTsgaTExIDw9IDU7IGkxMSsrKSB7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgRGVlc1RvYXN0LnNob3coewogICAgICAgIG1lc3NhZ2U6IGBOb3RpZmljYXRpb24gIyR7aTExfWAsCiAgICAgICAgdHlwZTogaTExICUgMiA9PT0gMCA/ICJzdWNjZXNzIiA6ICJpbmZvIiwKICAgICAgICBkdXJhdGlvbjogMmUzICsgaTExICogNTAwCiAgICAgIH0pOwogICAgfSwgaTExICogMTAwKTsKICB9Cn19PlJhcGlkIEZpcmU8L2RlZXMtYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgyIGNsYXNzPSJkZW1vLXRpdGxlIj5SZWFsLVdvcmxkIEV4YW1wbGVzPC9oMj4KICAgICAgICA8cCBjbGFzcz0iZGVtby1kZXNjcmlwdGlvbiI+CiAgICAgICAgICBDb21tb24gdXNlIGNhc2VzIGZvciB0b2FzdCBub3RpZmljYXRpb25zIGluIGFwcGxpY2F0aW9ucy4KICAgICAgICA8L3A+CiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9uLWdyaWQiPgogICAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGlja2VkPSR7YXN5bmMgKCkgPT4gewogIGNvbnN0IHRvYXN0ID0gYXdhaXQgRGVlc1RvYXN0LnNob3coewogICAgbWVzc2FnZTogIlNhdmluZyBjaGFuZ2VzLi4uIiwKICAgIHR5cGU6ICJpbmZvIiwKICAgIGR1cmF0aW9uOiAwCiAgfSk7CiAgc2V0VGltZW91dCgoKSA9PiB7CiAgICB0b2FzdC5kaXNtaXNzKCk7CiAgICBEZWVzVG9hc3Quc3VjY2VzcygiQ2hhbmdlcyBzYXZlZCBzdWNjZXNzZnVsbHkhIik7CiAgfSwgMmUzKTsKfX0+U2F2ZSBPcGVyYXRpb248L2RlZXMtYnV0dG9uPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrZWQ9JHsoKSA9PiB7CiAgRGVlc1RvYXN0LmVycm9yKCJGYWlsZWQgdG8gY29ubmVjdCB0byBzZXJ2ZXIuIFBsZWFzZSBjaGVjayB5b3VyIGludGVybmV0IGNvbm5lY3Rpb24uIik7Cn19Pk5ldHdvcmsgRXJyb3I8L2RlZXMtYnV0dG9uPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1idXR0b24gQGNsaWNrZWQ9JHsoKSA9PiB7CiAgRGVlc1RvYXN0Lndhcm5pbmcoIllvdXIgc2Vzc2lvbiB3aWxsIGV4cGlyZSBpbiA1IG1pbnV0ZXMiKTsKfX0+U2Vzc2lvbiBXYXJuaW5nPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGlja2VkPSR7KCkgPT4gewogIERlZXNUb2FzdC5zdWNjZXNzKCJGaWxlIHVwbG9hZGVkIHN1Y2Nlc3NmdWxseSEiKTsKfX0+VXBsb2FkIENvbXBsZXRlPC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMiBjbGFzcz0iZGVtby10aXRsZSI+UHJvZ3JhbW1hdGljIENvbnRyb2w8L2gyPgogICAgICAgIDxwIGNsYXNzPSJkZW1vLWRlc2NyaXB0aW9uIj4KICAgICAgICAgIEFkdmFuY2VkIGNvbnRyb2wgb3ZlciB0b2FzdCBiZWhhdmlvci4KICAgICAgICA8L3A+CiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9uLWdyaWQiPgogICAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGlja2VkPSR7YXN5bmMgKCkgPT4gewogIGNvbnN0IHRvYXN0ID0gYXdhaXQgRGVlc1RvYXN0LnNob3coewogICAgbWVzc2FnZTogIlRoaXMgdG9hc3QgY2FuIGJlIGRpc21pc3NlZCBwcm9ncmFtbWF0aWNhbGx5IiwKICAgIHR5cGU6ICJpbmZvIiwKICAgIGR1cmF0aW9uOiAwCiAgfSk7CiAgc2V0VGltZW91dCgoKSA9PiB7CiAgICB0b2FzdC5kaXNtaXNzKCk7CiAgICBEZWVzVG9hc3Quc3VjY2VzcygiVG9hc3QgZGlzbWlzc2VkIGFmdGVyIDIgc2Vjb25kcyIpOwogIH0sIDJlMyk7Cn19PlByb2dyYW1tYXRpYyBEaXNtaXNzPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtYnV0dG9uIEBjbGlja2VkPSR7KCkgPT4gewogIERlZXNUb2FzdC5pbmZvKCJJbmZvIG1lc3NhZ2UiLCAyZTMpOwogIHNldFRpbWVvdXQoKCkgPT4gRGVlc1RvYXN0LnN1Y2Nlc3MoIlN1Y2Nlc3MgbWVzc2FnZSIsIDJlMyksIDUwMCk7CiAgc2V0VGltZW91dCgoKSA9PiBEZWVzVG9hc3Qud2FybmluZygiV2FybmluZyBtZXNzYWdlIiwgMmUzKSwgMWUzKTsKICBzZXRUaW1lb3V0KCgpID0+IERlZXNUb2FzdC5lcnJvcigiRXJyb3IgbWVzc2FnZSIsIDJlMyksIDE1MDApOwp9fT5Db252ZW5pZW5jZSBNZXRob2RzPC9kZWVzLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWZlZWRiYWNrL2RlZXMtdG9hc3QvZGVlcy10b2FzdC5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2Rpc3RfdHMyOSgpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU2NiA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNjcgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNUb2FzdCA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy10b2FzdCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX21lc3NhZ2VfZGVjb3JhdG9yczsKICBsZXQgX21lc3NhZ2VfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tZXNzYWdlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90eXBlX2RlY29yYXRvcnM7CiAgbGV0IF90eXBlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdHlwZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZHVyYXRpb25fZGVjb3JhdG9yczsKICBsZXQgX2R1cmF0aW9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZHVyYXRpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzVmlzaWJsZV9kZWNvcmF0b3JzOwogIGxldCBfaXNWaXNpYmxlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNWaXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNUb2FzdDIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9tZXNzYWdlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfdHlwZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2R1cmF0aW9uX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfaXNWaXNpYmxlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0pXTsKICAgICAgX19lc0RlY29yYXRlNjYodGhpcywgbnVsbCwgX21lc3NhZ2VfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWVzc2FnZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWVzc2FnZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tZXNzYWdlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tZXNzYWdlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21lc3NhZ2VfaW5pdGlhbGl6ZXJzLCBfbWVzc2FnZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY2KHRoaXMsIG51bGwsIF90eXBlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInR5cGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInR5cGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudHlwZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudHlwZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90eXBlX2luaXRpYWxpemVycywgX3R5cGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2Nih0aGlzLCBudWxsLCBfZHVyYXRpb25fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZHVyYXRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImR1cmF0aW9uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmR1cmF0aW9uLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kdXJhdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kdXJhdGlvbl9pbml0aWFsaXplcnMsIF9kdXJhdGlvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY2KHRoaXMsIG51bGwsIF9pc1Zpc2libGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNWaXNpYmxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc1Zpc2libGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNWaXNpYmxlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc1Zpc2libGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNWaXNpYmxlX2luaXRpYWxpemVycywgX2lzVmlzaWJsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY2KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1RvYXN0MiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAvLyBTVEFUSUMKICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmM0NDsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJGZWVkYmFjayIsICJPdmVybGF5Il07CiAgICBzdGF0aWMgdG9hc3RDb250YWluZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIHN0YXRpYyBnZXRPckNyZWF0ZUNvbnRhaW5lcihwb3NpdGlvbjMpIHsKICAgICAgaWYgKCF0aGlzLnRvYXN0Q29udGFpbmVycy5oYXMocG9zaXRpb24zKSkgewogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSBgdG9hc3QtY29udGFpbmVyIHRvYXN0LWNvbnRhaW5lci0ke3Bvc2l0aW9uM31gOwogICAgICAgIGNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gYAogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB6LWluZGV4OiAke3pJbmRleExheWVycy5vdmVybGF5LnRvYXN0fTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDhweDsKICAgICAgYDsKICAgICAgICBzd2l0Y2ggKHBvc2l0aW9uMykgewogICAgICAgICAgY2FzZSAidG9wLXJpZ2h0IjoKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRvcCA9ICIwIjsKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gIjAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgInRvcC1sZWZ0IjoKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRvcCA9ICIwIjsKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmxlZnQgPSAiMCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiYm90dG9tLXJpZ2h0IjoKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvdHRvbSA9ICIwIjsKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gIjAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImJvdHRvbS1sZWZ0IjoKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvdHRvbSA9ICIwIjsKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmxlZnQgPSAiMCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAidG9wLWNlbnRlciI6CiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS50b3AgPSAiMCI7CiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gIjUwJSI7CiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gPSAidHJhbnNsYXRlWCgtNTAlKSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiYm90dG9tLWNlbnRlciI6CiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSAiMCI7CiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gIjUwJSI7CiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gPSAidHJhbnNsYXRlWCgtNTAlKSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7CiAgICAgICAgdGhpcy50b2FzdENvbnRhaW5lcnMuc2V0KHBvc2l0aW9uMywgY29udGFpbmVyKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy50b2FzdENvbnRhaW5lcnMuZ2V0KHBvc2l0aW9uMyk7CiAgICB9CiAgICBzdGF0aWMgYXN5bmMgc2hvdyhvcHRpb25zKSB7CiAgICAgIGNvbnN0IG9wdHMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgPyB7IG1lc3NhZ2U6IG9wdGlvbnMgfSA6IG9wdGlvbnM7CiAgICAgIGNvbnN0IHRvYXN0ID0gbmV3IERlZXNUb2FzdDIoKTsKICAgICAgdG9hc3QubWVzc2FnZSA9IG9wdHMubWVzc2FnZTsKICAgICAgdG9hc3QudHlwZSA9IG9wdHMudHlwZSB8fCAiaW5mbyI7CiAgICAgIHRvYXN0LmR1cmF0aW9uID0gb3B0cy5kdXJhdGlvbiB8fCAzZTM7CiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZ2V0T3JDcmVhdGVDb250YWluZXIob3B0cy5wb3NpdGlvbiB8fCAidG9wLXJpZ2h0Iik7CiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b2FzdCk7CiAgICAgIGF3YWl0IHRvYXN0LnVwZGF0ZUNvbXBsZXRlOwogICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgIHRvYXN0LmlzVmlzaWJsZSA9IHRydWU7CiAgICAgIH0pOwogICAgICBpZiAodG9hc3QuZHVyYXRpb24gPiAwKSB7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICB0b2FzdC5kaXNtaXNzKCk7CiAgICAgICAgfSwgdG9hc3QuZHVyYXRpb24pOwogICAgICB9CiAgICAgIHJldHVybiB0b2FzdDsKICAgIH0KICAgIC8vIEFsaWFzIGZvciBjb25zaXN0ZW5jeSB3aXRoIERlZXNNb2RhbAogICAgc3RhdGljIGFzeW5jIGNyZWF0ZUFuZFNob3cob3B0aW9ucykgewogICAgICByZXR1cm4gdGhpcy5zaG93KG9wdGlvbnMpOwogICAgfQogICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kcwogICAgc3RhdGljIGluZm8obWVzc2FnZTIsIGR1cmF0aW9uKSB7CiAgICAgIHJldHVybiB0aGlzLnNob3coeyBtZXNzYWdlOiBtZXNzYWdlMiwgdHlwZTogImluZm8iLCBkdXJhdGlvbiB9KTsKICAgIH0KICAgIHN0YXRpYyBzdWNjZXNzKG1lc3NhZ2UyLCBkdXJhdGlvbikgewogICAgICByZXR1cm4gdGhpcy5zaG93KHsgbWVzc2FnZTogbWVzc2FnZTIsIHR5cGU6ICJzdWNjZXNzIiwgZHVyYXRpb24gfSk7CiAgICB9CiAgICBzdGF0aWMgd2FybmluZyhtZXNzYWdlMiwgZHVyYXRpb24pIHsKICAgICAgcmV0dXJuIHRoaXMuc2hvdyh7IG1lc3NhZ2U6IG1lc3NhZ2UyLCB0eXBlOiAid2FybmluZyIsIGR1cmF0aW9uIH0pOwogICAgfQogICAgc3RhdGljIGVycm9yKG1lc3NhZ2UyLCBkdXJhdGlvbikgewogICAgICByZXR1cm4gdGhpcy5zaG93KHsgbWVzc2FnZTogbWVzc2FnZTIsIHR5cGU6ICJlcnJvciIsIGR1cmF0aW9uIH0pOwogICAgfQogICAgI21lc3NhZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNjcodGhpcywgX21lc3NhZ2VfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IG1lc3NhZ2UoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtZXNzYWdlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWVzc2FnZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWVzc2FnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3R5cGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY3KHRoaXMsIF9tZXNzYWdlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2Nyh0aGlzLCBfdHlwZV9pbml0aWFsaXplcnMsICJpbmZvIikpOwogICAgZ2V0IHR5cGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0eXBlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdHlwZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdHlwZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2R1cmF0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2Nyh0aGlzLCBfdHlwZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjcodGhpcywgX2R1cmF0aW9uX2luaXRpYWxpemVycywgM2UzKSk7CiAgICBnZXQgZHVyYXRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNkdXJhdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGR1cmF0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNkdXJhdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzVmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjcodGhpcywgX2R1cmF0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2Nyh0aGlzLCBfaXNWaXNpYmxlX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc1Zpc2libGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc1Zpc2libGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc1Zpc2libGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzVmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNjcodGhpcywgX2lzVmlzaWJsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIGRvbXRvb2xzX2VsZW1lbnRiYXNpY19leHBvcnRzLnNldHVwKCk7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICAgIGZvbnQtZmFtaWx5OiAke2Nzc0dlaXN0Rm9udEZhbWlseX07CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEwcHgpOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpc3Zpc2libGVdKSB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgIH0KCiAgICAgIC50b2FzdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTJweDsKICAgICAgICBwYWRkaW5nOiAxNnB4IDIwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmIiwgIiMyMjIiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlMGUwZTAiLCAiIzMzMyIpfTsKICAgICAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsMCwwLDAuMSkiLCAicmdiYSgwLDAsMCwwLjMpIil9OwogICAgICAgIG1pbi13aWR0aDogMzAwcHg7CiAgICAgICAgbWF4LXdpZHRoOiA1MDBweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC50b2FzdDpob3ZlciB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjAyKTsKICAgICAgfQoKICAgICAgLmljb24gewogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5pY29uIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAubWVzc2FnZSB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzMzMiLCAiI2ZmZiIpfTsKICAgICAgfQoKICAgICAgLmNsb3NlIHsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7CiAgICAgIH0KCiAgICAgIC5jbG9zZTpob3ZlciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmNsb3NlIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGZpbGw6IGN1cnJlbnRDb2xvcjsKICAgICAgfQoKICAgICAgLyogVHlwZS1zcGVjaWZpYyBzdHlsZXMgKi8KICAgICAgOmhvc3QoW3R5cGU9ImluZm8iXSkgLmljb24gewogICAgICAgIGNvbG9yOiAjMDA4NGZmOwogICAgICB9CgogICAgICA6aG9zdChbdHlwZT0ic3VjY2VzcyJdKSAuaWNvbiB7CiAgICAgICAgY29sb3I6ICMyMmM1NWU7CiAgICAgIH0KCiAgICAgIDpob3N0KFt0eXBlPSJ3YXJuaW5nIl0pIC5pY29uIHsKICAgICAgICBjb2xvcjogI2Y1OWUwYjsKICAgICAgfQoKICAgICAgOmhvc3QoW3R5cGU9ImVycm9yIl0pIC5pY29uIHsKICAgICAgICBjb2xvcjogI2VmNDQ0NDsKICAgICAgfQoKICAgICAgLyogUHJvZ3Jlc3MgYmFyICovCiAgICAgIC5wcm9ncmVzcyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGhlaWdodDogM3B4OwogICAgICAgIGJhY2tncm91bmQ6IGN1cnJlbnRDb2xvcjsKICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAwIDhweCA4cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnByb2dyZXNzLWJhciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6IGN1cnJlbnRDb2xvcjsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdDsKICAgICAgICBhbmltYXRpb246IHByb2dyZXNzIGxpbmVhciBmb3J3YXJkczsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBwcm9ncmVzcyB7CiAgICAgICAgZnJvbSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKTsKICAgICAgICB9CiAgICAgICAgdG8gewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMCk7CiAgICAgICAgfQogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICBjb25zdCBpY29uczUgPSB7CiAgICAgICAgaW5mbzogYjJgPHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIGZpbGw9ImN1cnJlbnRDb2xvciI+CiAgICAgICAgPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTAgMThhOCA4IDAgMTAwLTE2IDggOCAwIDAwMCAxNnptMS0xMWExIDEgMCAxMC0yIDB2Mkg3YTEgMSAwIDEwMCAyaDJ2MmExIDEgMCAxMDIgMHYtMmgyYTEgMSAwIDEwMC0yaC0yVjd6IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz4KICAgICAgPC9zdmc+YCwKICAgICAgICBzdWNjZXNzOiBiMmA8c3ZnIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0iY3VycmVudENvbG9yIj4KICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMCAxOGE4IDggMCAxMDAtMTYgOCA4IDAgMDAwIDE2em0zLjcwNy05LjI5M2ExIDEgMCAwMC0xLjQxNC0xLjQxNEw5IDEwLjU4NiA3LjcwNyA5LjI5M2ExIDEgMCAwMC0xLjQxNCAxLjQxNGwyIDJhMSAxIDAgMDAxLjQxNCAwbDQtNHoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPgogICAgICA8L3N2Zz5gLAogICAgICAgIHdhcm5pbmc6IGIyYDxzdmcgdmlld0JveD0iMCAwIDIwIDIwIiBmaWxsPSJjdXJyZW50Q29sb3IiPgogICAgICAgIDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTguMjU3IDMuMDk5Yy43NjUtMS4zNiAyLjcyMi0xLjM2IDMuNDg2IDBsNS41OCA5LjkyYy43NSAxLjMzNC0uMjEzIDIuOTgtMS43NDIgMi45OEg0LjQyYy0xLjUzIDAtMi40OTMtMS42NDYtMS43NDMtMi45OGw1LjU4LTkuOTJ6TTExIDEzYTEgMSAwIDExLTIgMCAxIDEgMCAwMTIgMHptLTEtOGExIDEgMCAwMC0xIDF2M2ExIDEgMCAwMDIgMFY2YTEgMSAwIDAwLTEtMXoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPgogICAgICA8L3N2Zz5gLAogICAgICAgIGVycm9yOiBiMmA8c3ZnIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0iY3VycmVudENvbG9yIj4KICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMCAxOGE4IDggMCAxMDAtMTYgOCA4IDAgMDAwIDE2ek04LjcwNyA3LjI5M2ExIDEgMCAwMC0xLjQxNCAxLjQxNEw4LjU4NiAxMGwtMS4yOTMgMS4yOTNhMSAxIDAgMTAxLjQxNCAxLjQxNEwxMCAxMS40MTRsMS4yOTMgMS4yOTNhMSAxIDAgMDAxLjQxNC0xLjQxNEwxMS40MTQgMTBsMS4yOTMtMS4yOTNhMSAxIDAgMDAtMS40MTQtMS40MTRMMTAgOC41ODYgOC43MDcgNy4yOTN6IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz4KICAgICAgPC9zdmc+YAogICAgICB9OwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InRvYXN0IiBAY2xpY2s9JHt0aGlzLmRpc21pc3N9PgogICAgICAgIDxkaXYgY2xhc3M9Imljb24iPgogICAgICAgICAgJHtpY29uczVbdGhpcy50eXBlXX0KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4ke3RoaXMubWVzc2FnZX08L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjbG9zZSI+CiAgICAgICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0iY3VycmVudENvbG9yIj4KICAgICAgICAgICAgPHBhdGggZD0iTTQuNjQ2IDQuNjQ2YS41LjUgMCAwIDEgLjcwOCAwTDggNy4yOTNsMi42NDYtMi42NDdhLjUuNSAwIDAgMSAuNzA4LjcwOEw4LjcwNyA4bDIuNjQ3IDIuNjQ2YS41LjUgMCAwIDEtLjcwOC43MDhMOCA4LjcwN2wtMi42NDYgMi42NDdhLjUuNSAwIDAgMS0uNzA4LS43MDhMNy4yOTMgOCA0LjY0NiA1LjM1NGEuNS41IDAgMCAxIDAtLjcwOHoiLz4KICAgICAgICAgIDwvc3ZnPgogICAgICAgIDwvZGl2PgogICAgICAgICR7dGhpcy5kdXJhdGlvbiA+IDAgPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIiBzdHlsZT0iYW5pbWF0aW9uLWR1cmF0aW9uOiAke3RoaXMuZHVyYXRpb259bXMiPjwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgYCA6ICIifQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBkaXNtaXNzKCkgewogICAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlOwogICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHNldFRpbWVvdXQocmVzb2x2ZTIsIDMwMCkpOwogICAgICB0aGlzLnJlbW92ZSgpOwogICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnBhcmVudEVsZW1lbnQ7CiAgICAgIGlmIChjb250YWluZXIgJiYgY29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgewogICAgICAgIGNvbnRhaW5lci5yZW1vdmUoKTsKICAgICAgICBmb3IgKGNvbnN0IFtwb3NpdGlvbjMsIGNvbnRdIG9mIERlZXNUb2FzdDIudG9hc3RDb250YWluZXJzLmVudHJpZXMoKSkgewogICAgICAgICAgaWYgKGNvbnQgPT09IGNvbnRhaW5lcikgewogICAgICAgICAgICBEZWVzVG9hc3QyLnRvYXN0Q29udGFpbmVycy5kZWxldGUocG9zaXRpb24zKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJ0eXBlIiwgdGhpcy50eXBlKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNjcoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNUb2FzdDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L3Byb2ZpbGVwaWN0dXJlL3Byb2ZpbGVwaWN0dXJlLmNyb3BwZXIuanMKdmFyIEltYWdlQ3JvcHBlciA9IGNsYXNzIHsKICBvcHRpb25zOwogIGNhbnZhczsKICBjdHg7CiAgaW1nOwogIG92ZXJsYXlDYW52YXM7CiAgb3ZlcmxheUN0eDsKICAvLyBDcm9wIGFyZWEgcHJvcGVydGllcwogIGNyb3BYID0gMDsKICBjcm9wWSA9IDA7CiAgY3JvcFNpemUgPSAyMDA7CiAgbWluQ3JvcFNpemUgPSA1MDsKICAvLyBJbnRlcmFjdGlvbiBzdGF0ZQogIGlzRHJhZ2dpbmcgPSBmYWxzZTsKICBpc1Jlc2l6aW5nID0gZmFsc2U7CiAgZHJhZ1N0YXJ0WCA9IDA7CiAgZHJhZ1N0YXJ0WSA9IDA7CiAgcmVzaXplSGFuZGxlID0gIiI7CiAgLy8gSW1hZ2UgcHJvcGVydGllcwogIGltYWdlU2NhbGUgPSAxOwogIGltYWdlT2Zmc2V0WCA9IDA7CiAgaW1hZ2VPZmZzZXRZID0gMDsKICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICB0aGlzLm9wdGlvbnMgPSB7CiAgICAgIG1pblNpemU6IDUwLAogICAgICBvdXRwdXRTaXplOiA4MDAsCiAgICAgIC8vIEhpZ2hlciBkZWZhdWx0IHJlc29sdXRpb24KICAgICAgb3V0cHV0UXVhbGl0eTogMC45NSwKICAgICAgLy8gSGlnaGVyIHF1YWxpdHkKICAgICAgLi4ub3B0aW9ucwogICAgfTsKICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CiAgICB0aGlzLmN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICB0aGlzLm92ZXJsYXlDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgIHRoaXMub3ZlcmxheUN0eCA9IHRoaXMub3ZlcmxheUNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgdGhpcy5pbWcgPSBuZXcgSW1hZ2UoKTsKICB9CiAgYXN5bmMgaW5pdGlhbGl6ZSgpIHsKICAgIGF3YWl0IHRoaXMubG9hZEltYWdlKCk7CiAgICB0aGlzLnNldHVwQ2FudmFzZXMoKTsKICAgIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycygpOwogICAgdGhpcy5yZW5kZXIoKTsKICB9CiAgYXN5bmMgbG9hZEltYWdlKCkgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0KSA9PiB7CiAgICAgIHRoaXMuaW1nLm9ubG9hZCA9ICgpID0+IHJlc29sdmUyKCk7CiAgICAgIHRoaXMuaW1nLm9uZXJyb3IgPSByZWplY3Q7CiAgICAgIHRoaXMuaW1nLnNyYyA9IHRoaXMub3B0aW9ucy5pbWFnZTsKICAgIH0pOwogIH0KICBzZXR1cENhbnZhc2VzKCkgewogICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5vcHRpb25zLmNvbnRhaW5lcjsKICAgIGNvbnN0IGNvbnRhaW5lclNpemUgPSBNYXRoLm1pbihjb250YWluZXIuY2xpZW50V2lkdGgsIGNvbnRhaW5lci5jbGllbnRIZWlnaHQpOwogICAgdGhpcy5jYW52YXMud2lkdGggPSBjb250YWluZXJTaXplOwogICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gY29udGFpbmVyU2l6ZTsKICAgIHRoaXMuY2FudmFzLnN0eWxlLndpZHRoID0gIjEwMCUiOwogICAgdGhpcy5jYW52YXMuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgdGhpcy5jYW52YXMuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgdGhpcy5jYW52YXMuc3R5bGUudG9wID0gIjAiOwogICAgdGhpcy5jYW52YXMuc3R5bGUubGVmdCA9ICIwIjsKICAgIHRoaXMub3ZlcmxheUNhbnZhcy53aWR0aCA9IGNvbnRhaW5lclNpemU7CiAgICB0aGlzLm92ZXJsYXlDYW52YXMuaGVpZ2h0ID0gY29udGFpbmVyU2l6ZTsKICAgIHRoaXMub3ZlcmxheUNhbnZhcy5zdHlsZS53aWR0aCA9ICIxMDAlIjsKICAgIHRoaXMub3ZlcmxheUNhbnZhcy5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICB0aGlzLm92ZXJsYXlDYW52YXMuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgdGhpcy5vdmVybGF5Q2FudmFzLnN0eWxlLnRvcCA9ICIwIjsKICAgIHRoaXMub3ZlcmxheUNhbnZhcy5zdHlsZS5sZWZ0ID0gIjAiOwogICAgdGhpcy5vdmVybGF5Q2FudmFzLnN0eWxlLmN1cnNvciA9ICJtb3ZlIjsKICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyk7CiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5vdmVybGF5Q2FudmFzKTsKICAgIGNvbnN0IHNjYWxlID0gTWF0aC5taW4oY29udGFpbmVyU2l6ZSAvIHRoaXMuaW1nLndpZHRoLCBjb250YWluZXJTaXplIC8gdGhpcy5pbWcuaGVpZ2h0KTsKICAgIHRoaXMuaW1hZ2VTY2FsZSA9IHNjYWxlOwogICAgdGhpcy5pbWFnZU9mZnNldFggPSAoY29udGFpbmVyU2l6ZSAtIHRoaXMuaW1nLndpZHRoICogc2NhbGUpIC8gMjsKICAgIHRoaXMuaW1hZ2VPZmZzZXRZID0gKGNvbnRhaW5lclNpemUgLSB0aGlzLmltZy5oZWlnaHQgKiBzY2FsZSkgLyAyOwogICAgY29uc3Qgc2NhbGVkSW1hZ2VXaWR0aCA9IHRoaXMuaW1nLndpZHRoICogc2NhbGU7CiAgICBjb25zdCBzY2FsZWRJbWFnZUhlaWdodCA9IHRoaXMuaW1nLmhlaWdodCAqIHNjYWxlOwogICAgY29uc3QgbWF4Q3JvcFNpemUgPSBNYXRoLm1pbihzY2FsZWRJbWFnZVdpZHRoLCBzY2FsZWRJbWFnZUhlaWdodCwgY29udGFpbmVyU2l6ZSAqIDAuOCk7CiAgICB0aGlzLmNyb3BTaXplID0gbWF4Q3JvcFNpemUgKiAwLjg7CiAgICB0aGlzLmNyb3BYID0gKGNvbnRhaW5lclNpemUgLSB0aGlzLmNyb3BTaXplKSAvIDI7CiAgICB0aGlzLmNyb3BZID0gKGNvbnRhaW5lclNpemUgLSB0aGlzLmNyb3BTaXplKSAvIDI7CiAgfQogIHNldHVwRXZlbnRMaXN0ZW5lcnMoKSB7CiAgICB0aGlzLm92ZXJsYXlDYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwgdGhpcy5oYW5kbGVNb3VzZURvd24uYmluZCh0aGlzKSk7CiAgICB0aGlzLm92ZXJsYXlDYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgdGhpcy5oYW5kbGVNb3VzZU1vdmUuYmluZCh0aGlzKSk7CiAgICB0aGlzLm92ZXJsYXlDYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIHRoaXMuaGFuZGxlTW91c2VVcC5iaW5kKHRoaXMpKTsKICAgIHRoaXMub3ZlcmxheUNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwgdGhpcy5oYW5kbGVNb3VzZVVwLmJpbmQodGhpcykpOwogICAgdGhpcy5vdmVybGF5Q2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQuYmluZCh0aGlzKSk7CiAgICB0aGlzLm92ZXJsYXlDYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIiwgdGhpcy5oYW5kbGVUb3VjaE1vdmUuYmluZCh0aGlzKSk7CiAgICB0aGlzLm92ZXJsYXlDYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCB0aGlzLmhhbmRsZVRvdWNoRW5kLmJpbmQodGhpcykpOwogIH0KICBoYW5kbGVNb3VzZURvd24oZTExKSB7CiAgICBjb25zdCByZWN0ID0gdGhpcy5vdmVybGF5Q2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgY29uc3QgeDQgPSAoZTExLmNsaWVudFggLSByZWN0LmxlZnQpICogKHRoaXMub3ZlcmxheUNhbnZhcy53aWR0aCAvIHJlY3Qud2lkdGgpOwogICAgY29uc3QgeTUgPSAoZTExLmNsaWVudFkgLSByZWN0LnRvcCkgKiAodGhpcy5vdmVybGF5Q2FudmFzLmhlaWdodCAvIHJlY3QuaGVpZ2h0KTsKICAgIGNvbnN0IGhhbmRsZTMgPSB0aGlzLmdldFJlc2l6ZUhhbmRsZSh4NCwgeTUpOwogICAgaWYgKGhhbmRsZTMpIHsKICAgICAgdGhpcy5pc1Jlc2l6aW5nID0gdHJ1ZTsKICAgICAgdGhpcy5yZXNpemVIYW5kbGUgPSBoYW5kbGUzOwogICAgfSBlbHNlIGlmICh0aGlzLmlzSW5zaWRlQ3JvcEFyZWEoeDQsIHk1KSkgewogICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlOwogICAgfQogICAgdGhpcy5kcmFnU3RhcnRYID0geDQ7CiAgICB0aGlzLmRyYWdTdGFydFkgPSB5NTsKICB9CiAgaGFuZGxlTW91c2VNb3ZlKGUxMSkgewogICAgY29uc3QgcmVjdCA9IHRoaXMub3ZlcmxheUNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIGNvbnN0IHg0ID0gKGUxMS5jbGllbnRYIC0gcmVjdC5sZWZ0KSAqICh0aGlzLm92ZXJsYXlDYW52YXMud2lkdGggLyByZWN0LndpZHRoKTsKICAgIGNvbnN0IHk1ID0gKGUxMS5jbGllbnRZIC0gcmVjdC50b3ApICogKHRoaXMub3ZlcmxheUNhbnZhcy5oZWlnaHQgLyByZWN0LmhlaWdodCk7CiAgICBjb25zdCBoYW5kbGUzID0gdGhpcy5nZXRSZXNpemVIYW5kbGUoeDQsIHk1KTsKICAgIGlmIChoYW5kbGUzKSB7CiAgICAgIHRoaXMub3ZlcmxheUNhbnZhcy5zdHlsZS5jdXJzb3IgPSB0aGlzLmdldFJlc2l6ZUN1cnNvcihoYW5kbGUzKTsKICAgIH0gZWxzZSBpZiAodGhpcy5pc0luc2lkZUNyb3BBcmVhKHg0LCB5NSkpIHsKICAgICAgdGhpcy5vdmVybGF5Q2FudmFzLnN0eWxlLmN1cnNvciA9ICJtb3ZlIjsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMub3ZlcmxheUNhbnZhcy5zdHlsZS5jdXJzb3IgPSAiZGVmYXVsdCI7CiAgICB9CiAgICBpZiAodGhpcy5pc0RyYWdnaW5nKSB7CiAgICAgIGNvbnN0IGR4ID0geDQgLSB0aGlzLmRyYWdTdGFydFg7CiAgICAgIGNvbnN0IGR5ID0geTUgLSB0aGlzLmRyYWdTdGFydFk7CiAgICAgIGNvbnN0IG1pblggPSB0aGlzLmltYWdlT2Zmc2V0WDsKICAgICAgY29uc3QgbWF4WCA9IHRoaXMuaW1hZ2VPZmZzZXRYICsgdGhpcy5pbWcud2lkdGggKiB0aGlzLmltYWdlU2NhbGUgLSB0aGlzLmNyb3BTaXplOwogICAgICBjb25zdCBtaW5ZID0gdGhpcy5pbWFnZU9mZnNldFk7CiAgICAgIGNvbnN0IG1heFkgPSB0aGlzLmltYWdlT2Zmc2V0WSArIHRoaXMuaW1nLmhlaWdodCAqIHRoaXMuaW1hZ2VTY2FsZSAtIHRoaXMuY3JvcFNpemU7CiAgICAgIHRoaXMuY3JvcFggPSBNYXRoLm1heChtaW5YLCBNYXRoLm1pbihtYXhYLCB0aGlzLmNyb3BYICsgZHgpKTsKICAgICAgdGhpcy5jcm9wWSA9IE1hdGgubWF4KG1pblksIE1hdGgubWluKG1heFksIHRoaXMuY3JvcFkgKyBkeSkpOwogICAgICB0aGlzLmRyYWdTdGFydFggPSB4NDsKICAgICAgdGhpcy5kcmFnU3RhcnRZID0geTU7CiAgICAgIHRoaXMucmVuZGVyKCk7CiAgICB9CiAgICBpZiAodGhpcy5pc1Jlc2l6aW5nKSB7CiAgICAgIHRoaXMuaGFuZGxlUmVzaXplKHg0LCB5NSk7CiAgICAgIHRoaXMuZHJhZ1N0YXJ0WCA9IHg0OwogICAgICB0aGlzLmRyYWdTdGFydFkgPSB5NTsKICAgICAgdGhpcy5yZW5kZXIoKTsKICAgIH0KICB9CiAgaGFuZGxlTW91c2VVcCgpIHsKICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlOwogICAgdGhpcy5pc1Jlc2l6aW5nID0gZmFsc2U7CiAgICB0aGlzLnJlc2l6ZUhhbmRsZSA9ICIiOwogIH0KICBoYW5kbGVUb3VjaFN0YXJ0KGUxMSkgewogICAgZTExLnByZXZlbnREZWZhdWx0KCk7CiAgICBjb25zdCB0b3VjaCA9IGUxMS50b3VjaGVzWzBdOwogICAgY29uc3QgbW91c2VFdmVudCA9IG5ldyBNb3VzZUV2ZW50KCJtb3VzZWRvd24iLCB7CiAgICAgIGNsaWVudFg6IHRvdWNoLmNsaWVudFgsCiAgICAgIGNsaWVudFk6IHRvdWNoLmNsaWVudFkKICAgIH0pOwogICAgdGhpcy5oYW5kbGVNb3VzZURvd24obW91c2VFdmVudCk7CiAgfQogIGhhbmRsZVRvdWNoTW92ZShlMTEpIHsKICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgY29uc3QgdG91Y2ggPSBlMTEudG91Y2hlc1swXTsKICAgIGNvbnN0IG1vdXNlRXZlbnQgPSBuZXcgTW91c2VFdmVudCgibW91c2Vtb3ZlIiwgewogICAgICBjbGllbnRYOiB0b3VjaC5jbGllbnRYLAogICAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZCiAgICB9KTsKICAgIHRoaXMuaGFuZGxlTW91c2VNb3ZlKG1vdXNlRXZlbnQpOwogIH0KICBoYW5kbGVUb3VjaEVuZChlMTEpIHsKICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgdGhpcy5oYW5kbGVNb3VzZVVwKCk7CiAgfQogIGdldFJlc2l6ZUhhbmRsZSh4NCwgeTUpIHsKICAgIGNvbnN0IGhhbmRsZVNpemUgPSAyMDsKICAgIGNvbnN0IGhhbmRsZXMgPSB7CiAgICAgICJudyI6IHsgeDogdGhpcy5jcm9wWCwgeTogdGhpcy5jcm9wWSB9LAogICAgICAibmUiOiB7IHg6IHRoaXMuY3JvcFggKyB0aGlzLmNyb3BTaXplLCB5OiB0aGlzLmNyb3BZIH0sCiAgICAgICJzdyI6IHsgeDogdGhpcy5jcm9wWCwgeTogdGhpcy5jcm9wWSArIHRoaXMuY3JvcFNpemUgfSwKICAgICAgInNlIjogeyB4OiB0aGlzLmNyb3BYICsgdGhpcy5jcm9wU2l6ZSwgeTogdGhpcy5jcm9wWSArIHRoaXMuY3JvcFNpemUgfQogICAgfTsKICAgIGZvciAoY29uc3QgW2tleTIsIHBvc10gb2YgT2JqZWN0LmVudHJpZXMoaGFuZGxlcykpIHsKICAgICAgaWYgKE1hdGguYWJzKHg0IC0gcG9zLngpIDwgaGFuZGxlU2l6ZSAmJiBNYXRoLmFicyh5NSAtIHBvcy55KSA8IGhhbmRsZVNpemUpIHsKICAgICAgICByZXR1cm4ga2V5MjsKICAgICAgfQogICAgfQogICAgcmV0dXJuICIiOwogIH0KICBnZXRSZXNpemVDdXJzb3IoaGFuZGxlMykgewogICAgY29uc3QgY3Vyc29ycyA9IHsKICAgICAgIm53IjogIm53LXJlc2l6ZSIsCiAgICAgICJuZSI6ICJuZS1yZXNpemUiLAogICAgICAic3ciOiAic3ctcmVzaXplIiwKICAgICAgInNlIjogInNlLXJlc2l6ZSIKICAgIH07CiAgICByZXR1cm4gY3Vyc29yc1toYW5kbGUzXSB8fCAiZGVmYXVsdCI7CiAgfQogIGlzSW5zaWRlQ3JvcEFyZWEoeDQsIHk1KSB7CiAgICByZXR1cm4geDQgPj0gdGhpcy5jcm9wWCAmJiB4NCA8PSB0aGlzLmNyb3BYICsgdGhpcy5jcm9wU2l6ZSAmJiB5NSA+PSB0aGlzLmNyb3BZICYmIHk1IDw9IHRoaXMuY3JvcFkgKyB0aGlzLmNyb3BTaXplOwogIH0KICBoYW5kbGVSZXNpemUoeDQsIHk1KSB7CiAgICBjb25zdCBkeCA9IHg0IC0gdGhpcy5kcmFnU3RhcnRYOwogICAgY29uc3QgZHkgPSB5NSAtIHRoaXMuZHJhZ1N0YXJ0WTsKICAgIGNvbnN0IGltZ0xlZnQgPSB0aGlzLmltYWdlT2Zmc2V0WDsKICAgIGNvbnN0IGltZ1RvcCA9IHRoaXMuaW1hZ2VPZmZzZXRZOwogICAgY29uc3QgaW1nUmlnaHQgPSB0aGlzLmltYWdlT2Zmc2V0WCArIHRoaXMuaW1nLndpZHRoICogdGhpcy5pbWFnZVNjYWxlOwogICAgY29uc3QgaW1nQm90dG9tID0gdGhpcy5pbWFnZU9mZnNldFkgKyB0aGlzLmltZy5oZWlnaHQgKiB0aGlzLmltYWdlU2NhbGU7CiAgICBzd2l0Y2ggKHRoaXMucmVzaXplSGFuZGxlKSB7CiAgICAgIGNhc2UgInNlIjoKICAgICAgICB0aGlzLmNyb3BTaXplID0gTWF0aC5tYXgodGhpcy5taW5Dcm9wU2l6ZSwgTWF0aC5taW4odGhpcy5jcm9wU2l6ZSArIE1hdGgubWF4KGR4LCBkeSksIE1hdGgubWluKGltZ1JpZ2h0IC0gdGhpcy5jcm9wWCwgaW1nQm90dG9tIC0gdGhpcy5jcm9wWSkpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAibnciOgogICAgICAgIGNvbnN0IG5ld1NpemUgPSBNYXRoLm1heCh0aGlzLm1pbkNyb3BTaXplLCB0aGlzLmNyb3BTaXplIC0gTWF0aC5tYXgoZHgsIGR5KSk7CiAgICAgICAgY29uc3Qgc2l6ZURpZmYgPSB0aGlzLmNyb3BTaXplIC0gbmV3U2l6ZTsKICAgICAgICBjb25zdCBuZXdYID0gdGhpcy5jcm9wWCArIHNpemVEaWZmOwogICAgICAgIGNvbnN0IG5ld1kgPSB0aGlzLmNyb3BZICsgc2l6ZURpZmY7CiAgICAgICAgaWYgKG5ld1ggPj0gaW1nTGVmdCAmJiBuZXdZID49IGltZ1RvcCkgewogICAgICAgICAgdGhpcy5jcm9wWCA9IG5ld1g7CiAgICAgICAgICB0aGlzLmNyb3BZID0gbmV3WTsKICAgICAgICAgIHRoaXMuY3JvcFNpemUgPSBuZXdTaXplOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAibmUiOgogICAgICAgIGNvbnN0IG5lU2l6ZUR4ID0gTWF0aC5tYXgoZHgsIC1keSk7CiAgICAgICAgY29uc3QgbmVOZXdTaXplID0gTWF0aC5tYXgodGhpcy5taW5Dcm9wU2l6ZSwgdGhpcy5jcm9wU2l6ZSArIG5lU2l6ZUR4KTsKICAgICAgICBjb25zdCBuZVNpemVEaWZmID0gbmVOZXdTaXplIC0gdGhpcy5jcm9wU2l6ZTsKICAgICAgICBjb25zdCBuZU5ld1kgPSB0aGlzLmNyb3BZIC0gbmVTaXplRGlmZjsKICAgICAgICBpZiAobmVOZXdZID49IGltZ1RvcCAmJiB0aGlzLmNyb3BYICsgbmVOZXdTaXplIDw9IGltZ1JpZ2h0KSB7CiAgICAgICAgICB0aGlzLmNyb3BZID0gbmVOZXdZOwogICAgICAgICAgdGhpcy5jcm9wU2l6ZSA9IG5lTmV3U2l6ZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInN3IjoKICAgICAgICBjb25zdCBzd1NpemVEeCA9IE1hdGgubWF4KC1keCwgZHkpOwogICAgICAgIGNvbnN0IHN3TmV3U2l6ZSA9IE1hdGgubWF4KHRoaXMubWluQ3JvcFNpemUsIHRoaXMuY3JvcFNpemUgKyBzd1NpemVEeCk7CiAgICAgICAgY29uc3Qgc3dTaXplRGlmZiA9IHN3TmV3U2l6ZSAtIHRoaXMuY3JvcFNpemU7CiAgICAgICAgY29uc3Qgc3dOZXdYID0gdGhpcy5jcm9wWCAtIHN3U2l6ZURpZmY7CiAgICAgICAgaWYgKHN3TmV3WCA+PSBpbWdMZWZ0ICYmIHRoaXMuY3JvcFkgKyBzd05ld1NpemUgPD0gaW1nQm90dG9tKSB7CiAgICAgICAgICB0aGlzLmNyb3BYID0gc3dOZXdYOwogICAgICAgICAgdGhpcy5jcm9wU2l6ZSA9IHN3TmV3U2l6ZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHJlbmRlcigpIHsKICAgIHRoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0KTsKICAgIHRoaXMub3ZlcmxheUN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5vdmVybGF5Q2FudmFzLndpZHRoLCB0aGlzLm92ZXJsYXlDYW52YXMuaGVpZ2h0KTsKICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9ICIjMDAwMDAwIjsKICAgIHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpOwogICAgdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMuaW1nLCB0aGlzLmltYWdlT2Zmc2V0WCwgdGhpcy5pbWFnZU9mZnNldFksIHRoaXMuaW1nLndpZHRoICogdGhpcy5pbWFnZVNjYWxlLCB0aGlzLmltZy5oZWlnaHQgKiB0aGlzLmltYWdlU2NhbGUpOwogICAgdGhpcy5vdmVybGF5Q3R4LmZpbGxTdHlsZSA9ICJyZ2JhKDAsIDAsIDAsIDAuNSkiOwogICAgdGhpcy5vdmVybGF5Q3R4LmZpbGxSZWN0KHRoaXMuaW1hZ2VPZmZzZXRYLCB0aGlzLmltYWdlT2Zmc2V0WSwgdGhpcy5pbWcud2lkdGggKiB0aGlzLmltYWdlU2NhbGUsIHRoaXMuaW1nLmhlaWdodCAqIHRoaXMuaW1hZ2VTY2FsZSk7CiAgICB0aGlzLm92ZXJsYXlDdHguc2F2ZSgpOwogICAgaWYgKHRoaXMub3B0aW9ucy5zaGFwZSA9PT0gInJvdW5kIikgewogICAgICB0aGlzLm92ZXJsYXlDdHguYmVnaW5QYXRoKCk7CiAgICAgIHRoaXMub3ZlcmxheUN0eC5hcmModGhpcy5jcm9wWCArIHRoaXMuY3JvcFNpemUgLyAyLCB0aGlzLmNyb3BZICsgdGhpcy5jcm9wU2l6ZSAvIDIsIHRoaXMuY3JvcFNpemUgLyAyLCAwLCBNYXRoLlBJICogMik7CiAgICAgIHRoaXMub3ZlcmxheUN0eC5jbGlwKCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLm92ZXJsYXlDdHguYmVnaW5QYXRoKCk7CiAgICAgIHRoaXMub3ZlcmxheUN0eC5yZWN0KHRoaXMuY3JvcFgsIHRoaXMuY3JvcFksIHRoaXMuY3JvcFNpemUsIHRoaXMuY3JvcFNpemUpOwogICAgICB0aGlzLm92ZXJsYXlDdHguY2xpcCgpOwogICAgfQogICAgdGhpcy5vdmVybGF5Q3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLm92ZXJsYXlDYW52YXMud2lkdGgsIHRoaXMub3ZlcmxheUNhbnZhcy5oZWlnaHQpOwogICAgdGhpcy5vdmVybGF5Q3R4LnJlc3RvcmUoKTsKICAgIHRoaXMub3ZlcmxheUN0eC5zdHJva2VTdHlsZSA9ICJ3aGl0ZSI7CiAgICB0aGlzLm92ZXJsYXlDdHgubGluZVdpZHRoID0gMjsKICAgIGlmICh0aGlzLm9wdGlvbnMuc2hhcGUgPT09ICJyb3VuZCIpIHsKICAgICAgdGhpcy5vdmVybGF5Q3R4LmJlZ2luUGF0aCgpOwogICAgICB0aGlzLm92ZXJsYXlDdHguYXJjKHRoaXMuY3JvcFggKyB0aGlzLmNyb3BTaXplIC8gMiwgdGhpcy5jcm9wWSArIHRoaXMuY3JvcFNpemUgLyAyLCB0aGlzLmNyb3BTaXplIC8gMiwgMCwgTWF0aC5QSSAqIDIpOwogICAgICB0aGlzLm92ZXJsYXlDdHguc3Ryb2tlKCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLm92ZXJsYXlDdHguc3Ryb2tlUmVjdCh0aGlzLmNyb3BYLCB0aGlzLmNyb3BZLCB0aGlzLmNyb3BTaXplLCB0aGlzLmNyb3BTaXplKTsKICAgIH0KICAgIHRoaXMuZHJhd1Jlc2l6ZUhhbmRsZXMoKTsKICB9CiAgZHJhd1Jlc2l6ZUhhbmRsZXMoKSB7CiAgICBjb25zdCBoYW5kbGVTaXplID0gODsKICAgIGNvbnN0IGhhbmRsZXMgPSBbCiAgICAgIHsgeDogdGhpcy5jcm9wWCwgeTogdGhpcy5jcm9wWSB9LAogICAgICB7IHg6IHRoaXMuY3JvcFggKyB0aGlzLmNyb3BTaXplLCB5OiB0aGlzLmNyb3BZIH0sCiAgICAgIHsgeDogdGhpcy5jcm9wWCwgeTogdGhpcy5jcm9wWSArIHRoaXMuY3JvcFNpemUgfSwKICAgICAgeyB4OiB0aGlzLmNyb3BYICsgdGhpcy5jcm9wU2l6ZSwgeTogdGhpcy5jcm9wWSArIHRoaXMuY3JvcFNpemUgfQogICAgXTsKICAgIHRoaXMub3ZlcmxheUN0eC5maWxsU3R5bGUgPSAid2hpdGUiOwogICAgaGFuZGxlcy5mb3JFYWNoKChoYW5kbGUzKSA9PiB7CiAgICAgIHRoaXMub3ZlcmxheUN0eC5iZWdpblBhdGgoKTsKICAgICAgdGhpcy5vdmVybGF5Q3R4LmFyYyhoYW5kbGUzLngsIGhhbmRsZTMueSwgaGFuZGxlU2l6ZSwgMCwgTWF0aC5QSSAqIDIpOwogICAgICB0aGlzLm92ZXJsYXlDdHguZmlsbCgpOwogICAgfSk7CiAgfQogIGFzeW5jIGdldENyb3BwZWRJbWFnZSgpIHsKICAgIGNvbnN0IGNyb3BDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgIGNvbnN0IGNyb3BDdHggPSBjcm9wQ2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICBjb25zdCBzY2FsZSA9IDEgLyB0aGlzLmltYWdlU2NhbGU7CiAgICBjb25zdCBvcmlnaW5hbENyb3BTaXplID0gdGhpcy5jcm9wU2l6ZSAqIHNjYWxlOwogICAgY29uc3Qgb3V0cHV0U2l6ZSA9IHRoaXMub3B0aW9ucy5vdXRwdXRTaXplOwogICAgaWYgKG91dHB1dFNpemUgPiBvcmlnaW5hbENyb3BTaXplKSB7CiAgICAgIGNvbnNvbGUuaW5mbyhgUHJvZmlsZSBwaWN0dXJlOiBVcHNjYWxpbmcgZnJvbSAke01hdGgucm91bmQob3JpZ2luYWxDcm9wU2l6ZSl9cHggdG8gJHtvdXRwdXRTaXplfXB4YCk7CiAgICB9CiAgICBjcm9wQ2FudmFzLndpZHRoID0gb3V0cHV0U2l6ZTsKICAgIGNyb3BDYW52YXMuaGVpZ2h0ID0gb3V0cHV0U2l6ZTsKICAgIGNvbnN0IHN4ID0gKHRoaXMuY3JvcFggLSB0aGlzLmltYWdlT2Zmc2V0WCkgKiBzY2FsZTsKICAgIGNvbnN0IHN5ID0gKHRoaXMuY3JvcFkgLSB0aGlzLmltYWdlT2Zmc2V0WSkgKiBzY2FsZTsKICAgIGNvbnN0IHNTaXplID0gdGhpcy5jcm9wU2l6ZSAqIHNjYWxlOwogICAgaWYgKHRoaXMub3B0aW9ucy5zaGFwZSA9PT0gInJvdW5kIikgewogICAgICBjcm9wQ3R4LmJlZ2luUGF0aCgpOwogICAgICBjcm9wQ3R4LmFyYyhvdXRwdXRTaXplIC8gMiwgb3V0cHV0U2l6ZSAvIDIsIG91dHB1dFNpemUgLyAyLCAwLCBNYXRoLlBJICogMik7CiAgICAgIGNyb3BDdHguY2xpcCgpOwogICAgfQogICAgY3JvcEN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSB0cnVlOwogICAgY3JvcEN0eC5pbWFnZVNtb290aGluZ1F1YWxpdHkgPSAiaGlnaCI7CiAgICBjcm9wQ3R4LmRyYXdJbWFnZSh0aGlzLmltZywgc3gsIHN5LCBzU2l6ZSwgc1NpemUsIDAsIDAsIG91dHB1dFNpemUsIG91dHB1dFNpemUpOwogICAgY29uc3QgaXNQbmcgPSB0aGlzLm9wdGlvbnMuaW1hZ2UuaW5jbHVkZXMoImltYWdlL3BuZyIpOwogICAgY29uc3QgZm9ybWF0MiA9IGlzUG5nID8gImltYWdlL3BuZyIgOiAiaW1hZ2UvanBlZyI7CiAgICByZXR1cm4gY3JvcENhbnZhcy50b0RhdGFVUkwoZm9ybWF0MiwgdGhpcy5vcHRpb25zLm91dHB1dFF1YWxpdHkpOwogIH0KICBkZXN0cm95KCkgewogICAgdGhpcy5jYW52YXMucmVtb3ZlKCk7CiAgICB0aGlzLm92ZXJsYXlDYW52YXMucmVtb3ZlKCk7CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L3Byb2ZpbGVwaWN0dXJlL3Byb2ZpbGVwaWN0dXJlLm1vZGFsLmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfZGVlc19pY29uKCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTY3ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM2OCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgUHJvZmlsZVBpY3R1cmVNb2RhbCA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1wcm9maWxlcGljdHVyZS1tb2RhbCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX2luaXRpYWxJbWFnZV9kZWNvcmF0b3JzOwogIGxldCBfaW5pdGlhbEltYWdlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW5pdGlhbEltYWdlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaGFwZV9kZWNvcmF0b3JzOwogIGxldCBfc2hhcGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaGFwZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfb3V0cHV0U2l6ZV9kZWNvcmF0b3JzOwogIGxldCBfb3V0cHV0U2l6ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX291dHB1dFNpemVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX291dHB1dFF1YWxpdHlfZGVjb3JhdG9yczsKICBsZXQgX291dHB1dFF1YWxpdHlfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vdXRwdXRRdWFsaXR5X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50U3RlcF9kZWNvcmF0b3JzOwogIGxldCBfY3VycmVudFN0ZXBfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50U3RlcF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3JvcHBlZEltYWdlX2RlY29yYXRvcnM7CiAgbGV0IF9jcm9wcGVkSW1hZ2VfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jcm9wcGVkSW1hZ2VfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzUHJvY2Vzc2luZ19kZWNvcmF0b3JzOwogIGxldCBfaXNQcm9jZXNzaW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNQcm9jZXNzaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIFByb2ZpbGVQaWN0dXJlTW9kYWwyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfaW5pdGlhbEltYWdlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfc2hhcGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9vdXRwdXRTaXplX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfb3V0cHV0UXVhbGl0eV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX2N1cnJlbnRTdGVwX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9jcm9wcGVkSW1hZ2VfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2lzUHJvY2Vzc2luZ19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGU2Nyh0aGlzLCBudWxsLCBfaW5pdGlhbEltYWdlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImluaXRpYWxJbWFnZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaW5pdGlhbEltYWdlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmluaXRpYWxJbWFnZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaW5pdGlhbEltYWdlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2luaXRpYWxJbWFnZV9pbml0aWFsaXplcnMsIF9pbml0aWFsSW1hZ2VfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2Nyh0aGlzLCBudWxsLCBfc2hhcGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2hhcGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNoYXBlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNoYXBlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaGFwZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaGFwZV9pbml0aWFsaXplcnMsIF9zaGFwZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY3KHRoaXMsIG51bGwsIF9vdXRwdXRTaXplX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm91dHB1dFNpemUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm91dHB1dFNpemUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoub3V0cHV0U2l6ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoub3V0cHV0U2l6ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9vdXRwdXRTaXplX2luaXRpYWxpemVycywgX291dHB1dFNpemVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2Nyh0aGlzLCBudWxsLCBfb3V0cHV0UXVhbGl0eV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJvdXRwdXRRdWFsaXR5Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJvdXRwdXRRdWFsaXR5IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm91dHB1dFF1YWxpdHksIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm91dHB1dFF1YWxpdHkgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfb3V0cHV0UXVhbGl0eV9pbml0aWFsaXplcnMsIF9vdXRwdXRRdWFsaXR5X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjcodGhpcywgbnVsbCwgX2N1cnJlbnRTdGVwX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImN1cnJlbnRTdGVwIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjdXJyZW50U3RlcCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jdXJyZW50U3RlcCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY3VycmVudFN0ZXAgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY3VycmVudFN0ZXBfaW5pdGlhbGl6ZXJzLCBfY3VycmVudFN0ZXBfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2Nyh0aGlzLCBudWxsLCBfY3JvcHBlZEltYWdlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNyb3BwZWRJbWFnZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3JvcHBlZEltYWdlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNyb3BwZWRJbWFnZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY3JvcHBlZEltYWdlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Nyb3BwZWRJbWFnZV9pbml0aWFsaXplcnMsIF9jcm9wcGVkSW1hZ2VfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2Nyh0aGlzLCBudWxsLCBfaXNQcm9jZXNzaW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzUHJvY2Vzc2luZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNQcm9jZXNzaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzUHJvY2Vzc2luZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNQcm9jZXNzaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzUHJvY2Vzc2luZ19pbml0aWFsaXplcnMsIF9pc1Byb2Nlc3NpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2NyhudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIFByb2ZpbGVQaWN0dXJlTW9kYWwyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgICNpbml0aWFsSW1hZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNjgodGhpcywgX2luaXRpYWxJbWFnZV9pbml0aWFsaXplcnMsICIiKTsKICAgIGdldCBpbml0aWFsSW1hZ2UoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpbml0aWFsSW1hZ2VfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpbml0aWFsSW1hZ2UodmFsdWUyKSB7CiAgICAgIHRoaXMuI2luaXRpYWxJbWFnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NoYXBlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2OCh0aGlzLCBfaW5pdGlhbEltYWdlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2OCh0aGlzLCBfc2hhcGVfaW5pdGlhbGl6ZXJzLCAicm91bmQiKSk7CiAgICBnZXQgc2hhcGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaGFwZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNoYXBlKHZhbHVlMikgewogICAgICB0aGlzLiNzaGFwZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI291dHB1dFNpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY4KHRoaXMsIF9zaGFwZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjgodGhpcywgX291dHB1dFNpemVfaW5pdGlhbGl6ZXJzLCA4MDApKTsKICAgIGdldCBvdXRwdXRTaXplKCkgewogICAgICByZXR1cm4gdGhpcy4jb3V0cHV0U2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG91dHB1dFNpemUodmFsdWUyKSB7CiAgICAgIHRoaXMuI291dHB1dFNpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNvdXRwdXRRdWFsaXR5X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2OCh0aGlzLCBfb3V0cHV0U2l6ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjgodGhpcywgX291dHB1dFF1YWxpdHlfaW5pdGlhbGl6ZXJzLCAwLjk1KSk7CiAgICBnZXQgb3V0cHV0UXVhbGl0eSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI291dHB1dFF1YWxpdHlfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBvdXRwdXRRdWFsaXR5KHZhbHVlMikgewogICAgICB0aGlzLiNvdXRwdXRRdWFsaXR5X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY3VycmVudFN0ZXBfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY4KHRoaXMsIF9vdXRwdXRRdWFsaXR5X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2OCh0aGlzLCBfY3VycmVudFN0ZXBfaW5pdGlhbGl6ZXJzLCAiY3JvcCIpKTsKICAgIGdldCBjdXJyZW50U3RlcCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRTdGVwX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY3VycmVudFN0ZXAodmFsdWUyKSB7CiAgICAgIHRoaXMuI2N1cnJlbnRTdGVwX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY3JvcHBlZEltYWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2OCh0aGlzLCBfY3VycmVudFN0ZXBfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczY4KHRoaXMsIF9jcm9wcGVkSW1hZ2VfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGNyb3BwZWRJbWFnZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2Nyb3BwZWRJbWFnZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNyb3BwZWRJbWFnZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY3JvcHBlZEltYWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNQcm9jZXNzaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2OCh0aGlzLCBfY3JvcHBlZEltYWdlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2OCh0aGlzLCBfaXNQcm9jZXNzaW5nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc1Byb2Nlc3NpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc1Byb2Nlc3NpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc1Byb2Nlc3NpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzUHJvY2Vzc2luZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgY3JvcHBlciA9IChfX3J1bkluaXRpYWxpemVyczY4KHRoaXMsIF9pc1Byb2Nlc3NpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgIHdpbmRvd0xheWVyOwogICAgekluZGV4ID0gMDsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1mYW1pbHk6ICR7Y3NzR2Vpc3RGb250RmFtaWx5fTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzMzMiLCAiI2ZmZiIpfTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB6LWluZGV4OiB2YXIoLS16LWluZGV4KTsKICAgICAgfQoKICAgICAgLm1vZGFsLWNvbnRhaW5lciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzBhMGEwYSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDgpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkiKX07CiAgICAgICAgYm94LXNoYWRvdzogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIjAgMjBweCAyNXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDEwcHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4wNCkiLCAiMCAyMHB4IDI1cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMyksIDAgMTBweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpIil9OwogICAgICAgIHdpZHRoOiA0ODBweDsKICAgICAgICBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSAzMnB4KTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTBweCkgc2NhbGUoMC45OCk7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBhbmltYXRpb246IG1vZGFsU2hvdyAwLjI1cyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpIGZvcndhcmRzOwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIG1vZGFsU2hvdyB7CiAgICAgICAgdG8gewogICAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwcHgpIHNjYWxlKDEpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLm1vZGFsLWhlYWRlciB7CiAgICAgICAgaGVpZ2h0OiA1MnB4OwogICAgICAgIHBhZGRpbmc6IDAgMjBweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wNikiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KSIpfTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAubW9kYWwtdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtOwogICAgICB9CgogICAgICAuY2xvc2UtYnV0dG9uIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDEwcHg7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiM3MTcxN2EiKX07CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5jbG9zZS1idXR0b246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDUpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICAgIH0KCiAgICAgIC5jbG9zZS1idXR0b246YWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjA4KSIsICJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpIil9OwogICAgICB9CgogICAgICAubW9kYWwtYm9keSB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiAyMHB4OwogICAgICB9CgogICAgICAuY3JvcHBlci1jb250YWluZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1heC13aWR0aDogMzYwcHg7CiAgICAgICAgYXNwZWN0LXJhdGlvOiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMDAwMCIsICIjMDAwMDAwIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBib3gtc2hhZG93OiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaW5zZXQgMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4wNikiLCAiaW5zZXQgMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSIpfTsKICAgICAgfQoKICAgICAgLnByZXZpZXctY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5wcmV2aWV3LWltYWdlIHsKICAgICAgICB3aWR0aDogMTgwcHg7CiAgICAgICAgaGVpZ2h0OiAxODBweDsKICAgICAgICBvYmplY3QtZml0OiBjb3ZlcjsKICAgICAgICBib3JkZXI6IDRweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMTgxODFiIil9OwogICAgICAgIGJveC1zaGFkb3c6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIwIDEwcHggMTVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4xKSwgMCA0cHggNnB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjA1KSIsICIwIDEwcHggMTVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4zKSwgMCA0cHggNnB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpIil9OwogICAgICB9CgogICAgICAucHJldmlldy1pbWFnZS5yb3VuZCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICAucHJldmlldy1pbWFnZS5zcXVhcmUgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5zdWNjZXNzLW1lc3NhZ2UgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEwcHg7CiAgICAgICAgcGFkZGluZzogMTBweCAyMHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMTBiOTgxIiwgIiMxMGI5ODEiKX07CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGFuaW1hdGlvbjogc3VjY2Vzc1B1bHNlIDAuNHMgZWFzZS1vdXQ7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgc3VjY2Vzc1B1bHNlIHsKICAgICAgICAwJSB7IHRyYW5zZm9ybTogc2NhbGUoMC45KTsgb3BhY2l0eTogMDsgfQogICAgICAgIDUwJSB7IHRyYW5zZm9ybTogc2NhbGUoMS4wMik7IH0KICAgICAgICAxMDAlIHsgdHJhbnNmb3JtOiBzY2FsZSgxKTsgb3BhY2l0eTogMTsgfQogICAgICB9CgogICAgICAubW9kYWwtZm9vdGVyIHsKICAgICAgICBwYWRkaW5nOiAyMHB4IDI0cHg7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMDYpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNikiKX07CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDEwcHg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmluc3RydWN0aW9ucyB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBsaW5lLWhlaWdodDogMS41OwogICAgICAgIG1heC13aWR0aDogMzIwcHg7CiAgICAgIH0KCiAgICAgIC5sb2FkaW5nLXNwaW5uZXIgewogICAgICAgIHdpZHRoOiA0MHB4OwogICAgICAgIGhlaWdodDogNDBweDsKICAgICAgICBib3JkZXI6IDNweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjEpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSIpfTsKICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjNjBhNWZhIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBhbmltYXRpb246IHNwaW4gMC42cyBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgc3BpbiB7CiAgICAgICAgdG8gewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgewogICAgICAgIC5tb2RhbC1jb250YWluZXIgewogICAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLSAzMnB4KTsKICAgICAgICAgIG1hcmdpbjogMTZweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLm1vZGFsLWJvZHkgewogICAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICB9CiAgICAgIH0KICAgIGAKICAgIF07CiAgICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgdGhpcy53aW5kb3dMYXllciA9IGF3YWl0IERlZXNXaW5kb3dMYXllci5jcmVhdGVBbmRTaG93KHsKICAgICAgICBibHVyOiB0cnVlCiAgICAgIH0pOwogICAgICB0aGlzLndpbmRvd0xheWVyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gdGhpcy5jbG9zZSgpKTsKICAgICAgdGhpcy56SW5kZXggPSB6SW5kZXhSZWdpc3RyeS5nZXROZXh0WkluZGV4KCk7CiAgICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoIi0tei1pbmRleCIsIHRoaXMuekluZGV4LnRvU3RyaW5nKCkpOwogICAgICB6SW5kZXhSZWdpc3RyeS5yZWdpc3Rlcih0aGlzLCB0aGlzLnpJbmRleCk7CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgaWYgKHRoaXMuY3JvcHBlcikgewogICAgICAgIHRoaXMuY3JvcHBlci5kZXN0cm95KCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMud2luZG93TGF5ZXIpIHsKICAgICAgICBhd2FpdCB0aGlzLndpbmRvd0xheWVyLmRlc3Ryb3koKTsKICAgICAgfQogICAgICB6SW5kZXhSZWdpc3RyeS51bnJlZ2lzdGVyKHRoaXMpOwogICAgfQogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRhaW5lciIgQGNsaWNrPSR7KGUxMSkgPT4gZTExLnN0b3BQcm9wYWdhdGlvbigpfT4KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgICAgPGgzIGNsYXNzPSJtb2RhbC10aXRsZSI+CiAgICAgICAgICAgICR7dGhpcy5jdXJyZW50U3RlcCA9PT0gImNyb3AiID8gIkFkanVzdCBJbWFnZSIgOiAiU3VjY2VzcyJ9CiAgICAgICAgICA8L2gzPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xvc2UtYnV0dG9uIiBAY2xpY2s9JHt0aGlzLmNsb3NlfSB0aXRsZT0iQ2xvc2UiPgogICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTp4IiBpY29uU2l6ZT0iMTYiPjwvZGVlcy1pY29uPgogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+CiAgICAgICAgICAke3RoaXMuY3VycmVudFN0ZXAgPT09ICJjcm9wIiA/IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnN0cnVjdGlvbnMiPgogICAgICAgICAgICAgIFBvc2l0aW9uIGFuZCByZXNpemUgdGhlIHNxdWFyZSB0byBzZWxlY3QgeW91ciBwcm9maWxlIGFyZWEKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNyb3BwZXItY29udGFpbmVyIiBpZD0iY3JvcHBlckNvbnRhaW5lciI+PC9kaXY+CiAgICAgICAgICBgIDogYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InByZXZpZXctY29udGFpbmVyIj4KICAgICAgICAgICAgICAke3RoaXMuaXNQcm9jZXNzaW5nID8gYjJgCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2FkaW5nLXNwaW5uZXIiPjwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5zdHJ1Y3Rpb25zIj5TYXZpbmcuLi48L2Rpdj4KICAgICAgICAgICAgICBgIDogYjJgCiAgICAgICAgICAgICAgICA8aW1nIAogICAgICAgICAgICAgICAgICBjbGFzcz0icHJldmlldy1pbWFnZSAke3RoaXMuc2hhcGV9IiAKICAgICAgICAgICAgICAgICAgc3JjPSIke3RoaXMuY3JvcHBlZEltYWdlfSIgCiAgICAgICAgICAgICAgICAgIGFsdD0iQ3JvcHBlZCBwcmV2aWV3IgogICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Y2Nlc3MtbWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOmNoZWNrIiBpY29uU2l6ZT0iMTYiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgICA8c3Bhbj5Mb29raW5nIGdvb2QhPC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgYH0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgfQogICAgICAgIDwvZGl2PgogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+CiAgICAgICAgICAke3RoaXMuY3VycmVudFN0ZXAgPT09ICJjcm9wIiA/IGIyYAogICAgICAgICAgICA8ZGVlcy1idXR0b24gdHlwZT0iZGVzdHJ1Y3RpdmUiIHNpemU9InNtIiBAY2xpY2s9JHt0aGlzLmNsb3NlfT4KICAgICAgICAgICAgICBDYW5jZWwKICAgICAgICAgICAgPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uIHR5cGU9ImRlZmF1bHQiIHNpemU9InNtIiBAY2xpY2s9JHt0aGlzLmhhbmRsZUNyb3B9PgogICAgICAgICAgICAgIFNhdmUKICAgICAgICAgICAgPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIGAgOiAiIn0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKCkgewogICAgICBpZiAodGhpcy5jdXJyZW50U3RlcCA9PT0gImNyb3AiKSB7CiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplQ3JvcHBlcigpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBpbml0aWFsaXplQ3JvcHBlcigpIHsKICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290LmdldEVsZW1lbnRCeUlkKCJjcm9wcGVyQ29udGFpbmVyIik7CiAgICAgIGlmICghY29udGFpbmVyKQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5jcm9wcGVyID0gbmV3IEltYWdlQ3JvcHBlcih7CiAgICAgICAgY29udGFpbmVyLAogICAgICAgIGltYWdlOiB0aGlzLmluaXRpYWxJbWFnZSwKICAgICAgICBzaGFwZTogdGhpcy5zaGFwZSwKICAgICAgICBhc3BlY3RSYXRpbzogMSwKICAgICAgICBvdXRwdXRTaXplOiB0aGlzLm91dHB1dFNpemUsCiAgICAgICAgb3V0cHV0UXVhbGl0eTogdGhpcy5vdXRwdXRRdWFsaXR5CiAgICAgIH0pOwogICAgICBhd2FpdCB0aGlzLmNyb3BwZXIuaW5pdGlhbGl6ZSgpOwogICAgfQogICAgYXN5bmMgaGFuZGxlQ3JvcCgpIHsKICAgICAgaWYgKCF0aGlzLmNyb3BwZXIpCiAgICAgICAgcmV0dXJuOwogICAgICB0cnkgewogICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gdHJ1ZTsKICAgICAgICB0aGlzLmN1cnJlbnRTdGVwID0gInByZXZpZXciOwogICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7CiAgICAgICAgY29uc3QgY3JvcHBlZERhdGEgPSBhd2FpdCB0aGlzLmNyb3BwZXIuZ2V0Q3JvcHBlZEltYWdlKCk7CiAgICAgICAgdGhpcy5jcm9wcGVkSW1hZ2UgPSBjcm9wcGVkRGF0YTsKICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHNldFRpbWVvdXQocmVzb2x2ZTIsIDgwMCkpOwogICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgic2F2ZSIsIHsKICAgICAgICAgIGRldGFpbDogeyBjcm9wcGVkSW1hZ2U6IHRoaXMuY3JvcHBlZEltYWdlIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICB0aGlzLmNsb3NlKCk7CiAgICAgICAgfSwgMTUwMCk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgY3JvcHBpbmcgaW1hZ2U6IiwgZXJyb3IpOwogICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGNsb3NlKCkgewogICAgICB0aGlzLnJlbW92ZSgpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM2OChfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gUHJvZmlsZVBpY3R1cmVNb2RhbDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWlucHV0L3Byb2ZpbGVwaWN0dXJlL2RlZXMtaW5wdXQtcHJvZmlsZXBpY3R1cmUuZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmM0NSA9ICgpID0+IGIyYAogIDxzdHlsZT4KICAgICR7aWAKICAgICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMjAwcHg7CiAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgIH0KICAgICAgCiAgICAgIGRlZXMtcGFuZWwgewogICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgIH0KICAgICAgCiAgICAgIC5kZW1vLXJvdyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDQ4cHg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KICAgICAgCiAgICAgIC5kZW1vLW91dHB1dCB7CiAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMTA1LCAyNDIsIDAuMSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsKICAgICAgICBtYXgtaGVpZ2h0OiAxMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgIAogICAgICAuZmVhdHVyZS1saXN0IHsKICAgICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgICAgIHBhZGRpbmctbGVmdDogMjBweDsKICAgICAgfQogICAgICAKICAgICAgLmZlYXR1cmUtbGlzdCBsaSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICB9CiAgICBgfQogIDwvc3R5bGU+CiAgCiAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCByb3VuZFByb2ZpbGUgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoJ2RlZXMtaW5wdXQtcHJvZmlsZXBpY3R1cmVbc2hhcGU9InJvdW5kIl0nKTsKICBpZiAocm91bmRQcm9maWxlKSB7CiAgICByb3VuZFByb2ZpbGUuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDsKICAgICAgY29uc29sZS5sb2coIlJvdW5kIHByb2ZpbGUgcGljdHVyZSBjaGFuZ2VkOiIsIHRhcmdldC52YWx1ZT8uc3Vic3RyaW5nKDAsIDUwKSArICIuLi4iKTsKICAgIH0pOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJQcm9maWxlIFBpY3R1cmUgSW5wdXQifSAuc3VidGl0bGU9JHsiQmFzaWMgdXNhZ2Ugd2l0aCByb3VuZCBhbmQgc3F1YXJlIHNoYXBlcyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImRlbW8tcm93Ij4KICAgICAgICAgIDxkZWVzLWlucHV0LXByb2ZpbGVwaWN0dXJlCiAgICAgICAgICAgIGxhYmVsPSJQcm9maWxlIFBpY3R1cmUgKFJvdW5kKSIKICAgICAgICAgICAgZGVzY3JpcHRpb249IkNsaWNrIHRvIHVwbG9hZCBvciBkcmFnICYgZHJvcCBhbiBpbWFnZSIKICAgICAgICAgICAgc2hhcGU9InJvdW5kIgogICAgICAgICAgICBzaXplPSIxMjAiCiAgICAgICAgICA+PC9kZWVzLWlucHV0LXByb2ZpbGVwaWN0dXJlPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1wcm9maWxlcGljdHVyZQogICAgICAgICAgICBsYWJlbD0iUHJvZmlsZSBQaWN0dXJlIChTcXVhcmUpIgogICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3VwcG9ydHMgSlBFRywgUE5HLCBhbmQgV2ViUCBmb3JtYXRzIgogICAgICAgICAgICBzaGFwZT0ic3F1YXJlIgogICAgICAgICAgICBzaXplPSIxMjAiCiAgICAgICAgICA+PC9kZWVzLWlucHV0LXByb2ZpbGVwaWN0dXJlPgogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CgogICAgPGRlZXMtZGVtb3dyYXBwZXIgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKGVsZW1lbnRBcmcpID0+IHsKICBjb25zdCBwcm9maWxlcyA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvckFsbCgiZGVlcy1pbnB1dC1wcm9maWxlcGljdHVyZSIpOwogIHByb2ZpbGVzLmZvckVhY2goKHByb2ZpbGUpID0+IHsKICAgIHByb2ZpbGUuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDsKICAgICAgY29uc29sZS5sb2coYFByb2ZpbGUgKHNpemUgJHt0YXJnZXQuc2l6ZX0pIGNoYW5nZWRgKTsKICAgIH0pOwogIH0pOwp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IlNpemUgVmFyaWF0aW9ucyJ9IC5zdWJ0aXRsZT0keyJQcm9maWxlIHBpY3R1cmVzIGluIGRpZmZlcmVudCBzaXplcyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImRlbW8tcm93Ij4KICAgICAgICAgIDxkZWVzLWlucHV0LXByb2ZpbGVwaWN0dXJlCiAgICAgICAgICAgIGxhYmVsPSJTbWFsbCAoODBweCkiCiAgICAgICAgICAgIHNoYXBlPSJyb3VuZCIKICAgICAgICAgICAgc2l6ZT0iODAiCiAgICAgICAgICA+PC9kZWVzLWlucHV0LXByb2ZpbGVwaWN0dXJlPgogICAgICAgICAgCiAgICAgICAgICA8ZGVlcy1pbnB1dC1wcm9maWxlcGljdHVyZQogICAgICAgICAgICBsYWJlbD0iTWVkaXVtICgxMjBweCkiCiAgICAgICAgICAgIHNoYXBlPSJyb3VuZCIKICAgICAgICAgICAgc2l6ZT0iMTIwIgogICAgICAgICAgPjwvZGVlcy1pbnB1dC1wcm9maWxlcGljdHVyZT4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtcHJvZmlsZXBpY3R1cmUKICAgICAgICAgICAgbGFiZWw9IkxhcmdlICgxNjBweCkiCiAgICAgICAgICAgIHNoYXBlPSJyb3VuZCIKICAgICAgICAgICAgc2l6ZT0iMTYwIgogICAgICAgICAgPjwvZGVlcy1pbnB1dC1wcm9maWxlcGljdHVyZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgoKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3Qgc2FtcGxlSW1hZ2VVcmwgPSAiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTWpBd0lpQm9aV2xuYUhROUlqSXdNQ0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JajRLSUNBOFpHVm1jejRLSUNBZ0lEeHNhVzVsWVhKSGNtRmthV1Z1ZENCcFpEMGlaM0poWkdsbGJuUWlJSGd4UFNJd0pTSWdlVEU5SWpBbElpQjRNajBpTVRBd0pTSWdlVEk5SWpFd01DVWlQZ29nSUNBZ0lDQThjM1J2Y0NCdlptWnpaWFE5SWpBbElpQnpkRzl3TFdOdmJHOXlQU0lqTmpZM1pXVmhJaUF2UGdvZ0lDQWdJQ0E4YzNSdmNDQnZabVp6WlhROUlqRXdNQ1VpSUhOMGIzQXRZMjlzYjNJOUlpTTNOalJpWVRJaUlDOCtDaUFnSUNBOEwyeHBibVZoY2tkeVlXUnBaVzUwUGdvZ0lEd3ZaR1ZtY3o0S0lDQThjbVZqZENCM2FXUjBhRDBpTWpBd0lpQm9aV2xuYUhROUlqSXdNQ0lnWm1sc2JEMGlkWEpzS0NObmNtRmthV1Z1ZENraUlDOCtDaUFnUEhSbGVIUWdlRDBpTlRBbElpQjVQU0kxTUNVaUlHUnZiV2x1WVc1MExXSmhjMlZzYVc1bFBTSnRhV1JrYkdVaUlIUmxlSFF0WVc1amFHOXlQU0p0YVdSa2JHVWlJR1p2Ym5RdFptRnRhV3g1UFNKQmNtbGhiQ0lnWm05dWRDMXphWHBsUFNJNE1DSWdabWxzYkQwaWQyaHBkR1VpUGtwRVBDOTBaWGgwUGdvOEwzTjJaejQ9IjsKICBjb25zdCBwcmVmaWxsZWRQcm9maWxlID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjcHJlZmlsbGVkLXByb2ZpbGUiKTsKICBpZiAocHJlZmlsbGVkUHJvZmlsZSkgewogICAgcHJlZmlsbGVkUHJvZmlsZS52YWx1ZSA9IHNhbXBsZUltYWdlVXJsOwogICAgcHJlZmlsbGVkUHJvZmlsZS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCAoZXZlbnQpID0+IHsKICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0OwogICAgICBjb25zdCBvdXRwdXQgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoIiNwcmVmaWxsZWQtb3V0cHV0Iik7CiAgICAgIGlmIChvdXRwdXQpIHsKICAgICAgICBvdXRwdXQudGV4dENvbnRlbnQgPSB0YXJnZXQudmFsdWUgPyBgSW1hZ2UgZGF0YTogJHt0YXJnZXQudmFsdWUuc3Vic3RyaW5nKDAsIDgwKX0uLi5gIDogIk5vIGltYWdlIHNlbGVjdGVkIjsKICAgICAgfQogICAgfSk7CiAgfQp9fT4KICAgICAgPGRlZXMtcGFuZWwgLnRpdGxlPSR7IlByZS1maWxsZWQgYW5kIFZhbHVlIEJpbmRpbmcifSAuc3VidGl0bGU9JHsiUHJvZmlsZSBwaWN0dXJlIHdpdGggaW5pdGlhbCB2YWx1ZSBhbmQgY2hhbmdlIHRyYWNraW5nIn0+CiAgICAgICAgPGRlZXMtaW5wdXQtcHJvZmlsZXBpY3R1cmUKICAgICAgICAgIGlkPSJwcmVmaWxsZWQtcHJvZmlsZSIKICAgICAgICAgIGxhYmVsPSJFZGl0IEV4aXN0aW5nIFByb2ZpbGUiCiAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2xpY2sgdGhlIGVkaXQgYnV0dG9uIHRvIGNoYW5nZSBvciBkZWxldGUgdG8gcmVtb3ZlIgogICAgICAgICAgc2hhcGU9InJvdW5kIgogICAgICAgICAgc2l6ZT0iMTUwIgogICAgICAgID48L2RlZXMtaW5wdXQtcHJvZmlsZXBpY3R1cmU+CiAgICAgICAgCiAgICAgICAgPGRpdiBpZD0icHJlZmlsbGVkLW91dHB1dCIgY2xhc3M9ImRlbW8tb3V0cHV0Ij4KICAgICAgICAgIEltYWdlIGRhdGEgd2lsbCBhcHBlYXIgaGVyZSB3aGVuIGNoYW5nZWQKICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgoKICAgIDxkZWVzLWRlbW93cmFwcGVyIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChlbGVtZW50QXJnKSA9PiB7CiAgY29uc3QgZGlzYWJsZWRQcm9maWxlID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCIjZGlzYWJsZWQtcHJvZmlsZSIpOwogIGlmIChkaXNhYmxlZFByb2ZpbGUpIHsKICAgIGRpc2FibGVkUHJvZmlsZS52YWx1ZSA9ICJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlNakF3SWlCb1pXbG5hSFE5SWpJd01DSWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklqNEtJQ0E4Y21WamRDQjNhV1IwYUQwaU1qQXdJaUJvWldsbmFIUTlJakl3TUNJZ1ptbHNiRDBpSTJOalkyTmpZeUlnTHo0S0lDQThkR1Y0ZENCNFBTSTFNQ1VpSUhrOUlqVXdKU0lnWkc5dGFXNWhiblF0WW1GelpXeHBibVU5SW0xcFpHUnNaU0lnZEdWNGRDMWhibU5vYjNJOUltMXBaR1JzWlNJZ1ptOXVkQzFtWVcxcGJIazlJa0Z5YVdGc0lpQm1iMjUwTFhOcGVtVTlJall3SWlCbWFXeHNQU0ozYUdsMFpTSStUa0U4TDNSbGVIUStDand2YzNablBnPT0iOwogIH0KfX0+CiAgICAgIDxkZWVzLXBhbmVsIC50aXRsZT0keyJGb3JtIFN0YXRlcyJ9IC5zdWJ0aXRsZT0keyJEaWZmZXJlbnQgc3RhdGVzIGFuZCBjb25maWd1cmF0aW9ucyJ9PgogICAgICAgIDxkaXYgY2xhc3M9ImRlbW8tcm93Ij4KICAgICAgICAgIDxkZWVzLWlucHV0LXByb2ZpbGVwaWN0dXJlCiAgICAgICAgICAgIGxhYmVsPSJSZXF1aXJlZCBGaWVsZCIKICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQiCiAgICAgICAgICAgIHNoYXBlPSJyb3VuZCIKICAgICAgICAgICAgLnJlcXVpcmVkPSR7dHJ1ZX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtcHJvZmlsZXBpY3R1cmU+CiAgICAgICAgICAKICAgICAgICAgIDxkZWVzLWlucHV0LXByb2ZpbGVwaWN0dXJlCiAgICAgICAgICAgIGlkPSJkaXNhYmxlZC1wcm9maWxlIgogICAgICAgICAgICBsYWJlbD0iRGlzYWJsZWQgU3RhdGUiCiAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDYW5ub3QgYmUgZWRpdGVkIgogICAgICAgICAgICBzaGFwZT0ic3F1YXJlIgogICAgICAgICAgICAuZGlzYWJsZWQ9JHt0cnVlfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1wcm9maWxlcGljdHVyZT4KICAgICAgICAgIAogICAgICAgICAgPGRlZXMtaW5wdXQtcHJvZmlsZXBpY3R1cmUKICAgICAgICAgICAgbGFiZWw9IlVwbG9hZCBPbmx5IgogICAgICAgICAgICBkZXNjcmlwdGlvbj0iRGVsZXRlIG5vdCBhbGxvd2VkIgogICAgICAgICAgICBzaGFwZT0icm91bmQiCiAgICAgICAgICAgIC5hbGxvd0RlbGV0ZT0ke2ZhbHNlfQogICAgICAgICAgPjwvZGVlcy1pbnB1dC1wcm9maWxlcGljdHVyZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kZWVzLXBhbmVsPgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgoKICAgIDxkZWVzLWRlbW93cmFwcGVyPgogICAgICA8ZGVlcy1wYW5lbCAudGl0bGU9JHsiRmVhdHVyZXMifSAuc3VidGl0bGU9JHsiQ29tcGxldGUgZmVhdHVyZSBzZXQgb2YgdGhlIHByb2ZpbGUgcGljdHVyZSBpbnB1dCJ9PgogICAgICAgIDx1bCBjbGFzcz0iZmVhdHVyZS1saXN0Ij4KICAgICAgICAgIDxsaT48c3Ryb25nPkltYWdlIFVwbG9hZDo8L3N0cm9uZz4gQ2xpY2sgdG8gdXBsb2FkIG9yIGRyYWcgJiBkcm9wIGltYWdlczwvbGk+CiAgICAgICAgICA8bGk+PHN0cm9uZz5JbWFnZSBDcm9wcGluZzo8L3N0cm9uZz4gSW50ZXJhY3RpdmUgY3JvcCB0b29sIHdpdGggcmVzaXplIGhhbmRsZXM8L2xpPgogICAgICAgICAgPGxpPjxzdHJvbmc+U2hhcGUgU3VwcG9ydDo8L3N0cm9uZz4gUm91bmQgb3Igc3F1YXJlIHByb2ZpbGUgcGljdHVyZXM8L2xpPgogICAgICAgICAgPGxpPjxzdHJvbmc+U2l6ZSBDdXN0b21pemF0aW9uOjwvc3Ryb25nPiBBZGp1c3RhYmxlIGRpbWVuc2lvbnM8L2xpPgogICAgICAgICAgPGxpPjxzdHJvbmc+UHJldmlldyAmIEVkaXQ6PC9zdHJvbmc+IEhvdmVyIG92ZXJsYXkgd2l0aCBlZGl0IGFuZCBkZWxldGUgb3B0aW9uczwvbGk+CiAgICAgICAgICA8bGk+PHN0cm9uZz5GaWxlIFZhbGlkYXRpb246PC9zdHJvbmc+IEZvcm1hdCBhbmQgc2l6ZSByZXN0cmljdGlvbnM8L2xpPgogICAgICAgICAgPGxpPjxzdHJvbmc+UmVzcG9uc2l2ZSBEZXNpZ246PC9zdHJvbmc+IFdvcmtzIG9uIGRlc2t0b3AgYW5kIG1vYmlsZSBkZXZpY2VzPC9saT4KICAgICAgICAgIDxsaT48c3Ryb25nPkZvcm0gSW50ZWdyYXRpb246PC9zdHJvbmc+IFN0YW5kYXJkIGZvcm0gdmFsdWUgYmluZGluZyBhbmQgdmFsaWRhdGlvbjwvbGk+CiAgICAgICAgICA8bGk+PHN0cm9uZz5BY2Nlc3NpYmlsaXR5Ojwvc3Ryb25nPiBLZXlib2FyZCBuYXZpZ2F0aW9uIGFuZCBzY3JlZW4gcmVhZGVyIHN1cHBvcnQ8L2xpPgogICAgICAgICAgPGxpPjxzdHJvbmc+Wi1JbmRleCBNYW5hZ2VtZW50Ojwvc3Ryb25nPiBQcm9wZXIgbW9kYWwgc3RhY2tpbmcgd2l0aCByZWdpc3RyeTwvbGk+CiAgICAgICAgPC91bD4KICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAyNHB4OyI+CiAgICAgICAgICA8c3Ryb25nPlN1cHBvcnRlZCBGb3JtYXRzOjwvc3Ryb25nPiBKUEVHLCBQTkcsIFdlYlA8YnI+CiAgICAgICAgICA8c3Ryb25nPk1heCBGaWxlIFNpemU6PC9zdHJvbmc+IDVNQiAoY29uZmlndXJhYmxlKTxicj4KICAgICAgICAgIDxzdHJvbmc+T3V0cHV0IEZvcm1hdDo8L3N0cm9uZz4gQmFzZTY0IGVuY29kZWQgSlBFRwogICAgICAgIDwvZGl2PgogICAgICA8L2RlZXMtcGFuZWw+CiAgICA8L2RlZXMtZGVtb3dyYXBwZXI+CiAgPC9kaXY+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaW5wdXQvcHJvZmlsZXBpY3R1cmUvZGVlcy1pbnB1dC1wcm9maWxlcGljdHVyZS5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2RlZXNfaWNvbigpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU2OCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNjkgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNJbnB1dFByb2ZpbGVQaWN0dXJlID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLWlucHV0LXByb2ZpbGVwaWN0dXJlIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNJbnB1dEJhc2U7CiAgbGV0IF92YWx1ZV9kZWNvcmF0b3JzOwogIGxldCBfdmFsdWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF92YWx1ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hhcGVfZGVjb3JhdG9yczsKICBsZXQgX3NoYXBlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hhcGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NpemVfZGVjb3JhdG9yczsKICBsZXQgX3NpemVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaXplX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wbGFjZWhvbGRlcl9kZWNvcmF0b3JzOwogIGxldCBfcGxhY2Vob2xkZXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wbGFjZWhvbGRlcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWxsb3dVcGxvYWRfZGVjb3JhdG9yczsKICBsZXQgX2FsbG93VXBsb2FkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWxsb3dVcGxvYWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FsbG93RGVsZXRlX2RlY29yYXRvcnM7CiAgbGV0IF9hbGxvd0RlbGV0ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FsbG93RGVsZXRlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYXhGaWxlU2l6ZV9kZWNvcmF0b3JzOwogIGxldCBfbWF4RmlsZVNpemVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYXhGaWxlU2l6ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWNjZXB0ZWRGb3JtYXRzX2RlY29yYXRvcnM7CiAgbGV0IF9hY2NlcHRlZEZvcm1hdHNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY2NlcHRlZEZvcm1hdHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX291dHB1dFNpemVfZGVjb3JhdG9yczsKICBsZXQgX291dHB1dFNpemVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vdXRwdXRTaXplX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vdXRwdXRRdWFsaXR5X2RlY29yYXRvcnM7CiAgbGV0IF9vdXRwdXRRdWFsaXR5X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfb3V0cHV0UXVhbGl0eV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNIb3ZlcmVkX2RlY29yYXRvcnM7CiAgbGV0IF9pc0hvdmVyZWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0hvdmVyZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzRHJhZ2dpbmdfZGVjb3JhdG9yczsKICBsZXQgX2lzRHJhZ2dpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0RyYWdnaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0xvYWRpbmdfZGVjb3JhdG9yczsKICBsZXQgX2lzTG9hZGluZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzTG9hZGluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW5wdXRQcm9maWxlUGljdHVyZTIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF92YWx1ZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3NoYXBlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfc2l6ZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX3BsYWNlaG9sZGVyX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfYWxsb3dVcGxvYWRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfYWxsb3dEZWxldGVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfbWF4RmlsZVNpemVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF9hY2NlcHRlZEZvcm1hdHNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX291dHB1dFNpemVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF9vdXRwdXRRdWFsaXR5X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfaXNIb3ZlcmVkX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pc0RyYWdnaW5nX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pc0xvYWRpbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlNjgodGhpcywgbnVsbCwgX3ZhbHVlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZhbHVlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ2YWx1ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai52YWx1ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudmFsdWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdmFsdWVfaW5pdGlhbGl6ZXJzLCBfdmFsdWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2OCh0aGlzLCBudWxsLCBfc2hhcGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2hhcGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNoYXBlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNoYXBlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaGFwZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaGFwZV9pbml0aWFsaXplcnMsIF9zaGFwZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY4KHRoaXMsIG51bGwsIF9zaXplX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNpemUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNpemUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2l6ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2l6ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaXplX2luaXRpYWxpemVycywgX3NpemVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2OCh0aGlzLCBudWxsLCBfcGxhY2Vob2xkZXJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicGxhY2Vob2xkZXIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInBsYWNlaG9sZGVyIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnBsYWNlaG9sZGVyLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5wbGFjZWhvbGRlciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wbGFjZWhvbGRlcl9pbml0aWFsaXplcnMsIF9wbGFjZWhvbGRlcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY4KHRoaXMsIG51bGwsIF9hbGxvd1VwbG9hZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhbGxvd1VwbG9hZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYWxsb3dVcGxvYWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWxsb3dVcGxvYWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFsbG93VXBsb2FkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2FsbG93VXBsb2FkX2luaXRpYWxpemVycywgX2FsbG93VXBsb2FkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjgodGhpcywgbnVsbCwgX2FsbG93RGVsZXRlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFsbG93RGVsZXRlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhbGxvd0RlbGV0ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hbGxvd0RlbGV0ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYWxsb3dEZWxldGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYWxsb3dEZWxldGVfaW5pdGlhbGl6ZXJzLCBfYWxsb3dEZWxldGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2OCh0aGlzLCBudWxsLCBfbWF4RmlsZVNpemVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWF4RmlsZVNpemUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1heEZpbGVTaXplIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1heEZpbGVTaXplLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tYXhGaWxlU2l6ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tYXhGaWxlU2l6ZV9pbml0aWFsaXplcnMsIF9tYXhGaWxlU2l6ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY4KHRoaXMsIG51bGwsIF9hY2NlcHRlZEZvcm1hdHNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYWNjZXB0ZWRGb3JtYXRzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhY2NlcHRlZEZvcm1hdHMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWNjZXB0ZWRGb3JtYXRzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hY2NlcHRlZEZvcm1hdHMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYWNjZXB0ZWRGb3JtYXRzX2luaXRpYWxpemVycywgX2FjY2VwdGVkRm9ybWF0c19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY4KHRoaXMsIG51bGwsIF9vdXRwdXRTaXplX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm91dHB1dFNpemUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm91dHB1dFNpemUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoub3V0cHV0U2l6ZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoub3V0cHV0U2l6ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9vdXRwdXRTaXplX2luaXRpYWxpemVycywgX291dHB1dFNpemVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2OCh0aGlzLCBudWxsLCBfb3V0cHV0UXVhbGl0eV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJvdXRwdXRRdWFsaXR5Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJvdXRwdXRRdWFsaXR5IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm91dHB1dFF1YWxpdHksIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm91dHB1dFF1YWxpdHkgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfb3V0cHV0UXVhbGl0eV9pbml0aWFsaXplcnMsIF9vdXRwdXRRdWFsaXR5X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjgodGhpcywgbnVsbCwgX2lzSG92ZXJlZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc0hvdmVyZWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImlzSG92ZXJlZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc0hvdmVyZWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzSG92ZXJlZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pc0hvdmVyZWRfaW5pdGlhbGl6ZXJzLCBfaXNIb3ZlcmVkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjgodGhpcywgbnVsbCwgX2lzRHJhZ2dpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNEcmFnZ2luZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNEcmFnZ2luZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc0RyYWdnaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc0RyYWdnaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzRHJhZ2dpbmdfaW5pdGlhbGl6ZXJzLCBfaXNEcmFnZ2luZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY4KHRoaXMsIG51bGwsIF9pc0xvYWRpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNMb2FkaW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc0xvYWRpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNMb2FkaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc0xvYWRpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNMb2FkaW5nX2luaXRpYWxpemVycywgX2lzTG9hZGluZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTY4KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0lucHV0UHJvZmlsZVBpY3R1cmUyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmM0NTsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJJbnB1dCJdOwogICAgI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczY5KHRoaXMsIF92YWx1ZV9pbml0aWFsaXplcnMsICIiKTsKICAgIGdldCB2YWx1ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3ZhbHVlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICAvLyBCYXNlNjQgZW5jb2RlZCBpbWFnZSBvciBVUkwKICAgIHNldCB2YWx1ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdmFsdWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaGFwZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjkodGhpcywgX3ZhbHVlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2OSh0aGlzLCBfc2hhcGVfaW5pdGlhbGl6ZXJzLCAicm91bmQiKSk7CiAgICBnZXQgc2hhcGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaGFwZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNoYXBlKHZhbHVlMikgewogICAgICB0aGlzLiNzaGFwZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY5KHRoaXMsIF9zaGFwZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjkodGhpcywgX3NpemVfaW5pdGlhbGl6ZXJzLCAxMjApKTsKICAgIGdldCBzaXplKCkgewogICAgICByZXR1cm4gdGhpcy4jc2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNpemUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3NpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNwbGFjZWhvbGRlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjkodGhpcywgX3NpemVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczY5KHRoaXMsIF9wbGFjZWhvbGRlcl9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgcGxhY2Vob2xkZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwbGFjZWhvbGRlcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHBsYWNlaG9sZGVyKHZhbHVlMikgewogICAgICB0aGlzLiNwbGFjZWhvbGRlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2FsbG93VXBsb2FkX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2OSh0aGlzLCBfcGxhY2Vob2xkZXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczY5KHRoaXMsIF9hbGxvd1VwbG9hZF9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBhbGxvd1VwbG9hZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FsbG93VXBsb2FkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYWxsb3dVcGxvYWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2FsbG93VXBsb2FkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYWxsb3dEZWxldGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY5KHRoaXMsIF9hbGxvd1VwbG9hZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjkodGhpcywgX2FsbG93RGVsZXRlX2luaXRpYWxpemVycywgdHJ1ZSkpOwogICAgZ2V0IGFsbG93RGVsZXRlKCkgewogICAgICByZXR1cm4gdGhpcy4jYWxsb3dEZWxldGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhbGxvd0RlbGV0ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYWxsb3dEZWxldGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtYXhGaWxlU2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjkodGhpcywgX2FsbG93RGVsZXRlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2OSh0aGlzLCBfbWF4RmlsZVNpemVfaW5pdGlhbGl6ZXJzLCA1ICogMTAyNCAqIDEwMjQpKTsKICAgIGdldCBtYXhGaWxlU2l6ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21heEZpbGVTaXplX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICAvLyA1TUIKICAgIHNldCBtYXhGaWxlU2l6ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWF4RmlsZVNpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhY2NlcHRlZEZvcm1hdHNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY5KHRoaXMsIF9tYXhGaWxlU2l6ZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNjkodGhpcywgX2FjY2VwdGVkRm9ybWF0c19pbml0aWFsaXplcnMsIFsiaW1hZ2UvanBlZyIsICJpbWFnZS9wbmciLCAiaW1hZ2Uvd2VicCJdKSk7CiAgICBnZXQgYWNjZXB0ZWRGb3JtYXRzKCkgewogICAgICByZXR1cm4gdGhpcy4jYWNjZXB0ZWRGb3JtYXRzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYWNjZXB0ZWRGb3JtYXRzKHZhbHVlMikgewogICAgICB0aGlzLiNhY2NlcHRlZEZvcm1hdHNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNvdXRwdXRTaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM2OSh0aGlzLCBfYWNjZXB0ZWRGb3JtYXRzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2OSh0aGlzLCBfb3V0cHV0U2l6ZV9pbml0aWFsaXplcnMsIDgwMCkpOwogICAgZ2V0IG91dHB1dFNpemUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNvdXRwdXRTaXplX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICAvLyBPdXRwdXQgcmVzb2x1dGlvbiBpbiBwaXhlbHMKICAgIHNldCBvdXRwdXRTaXplKHZhbHVlMikgewogICAgICB0aGlzLiNvdXRwdXRTaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjb3V0cHV0UXVhbGl0eV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNjkodGhpcywgX291dHB1dFNpemVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczY5KHRoaXMsIF9vdXRwdXRRdWFsaXR5X2luaXRpYWxpemVycywgMC45NSkpOwogICAgZ2V0IG91dHB1dFF1YWxpdHkoKSB7CiAgICAgIHJldHVybiB0aGlzLiNvdXRwdXRRdWFsaXR5X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICAvLyAwLTEgcXVhbGl0eSBmb3IgSlBFRwogICAgc2V0IG91dHB1dFF1YWxpdHkodmFsdWUyKSB7CiAgICAgIHRoaXMuI291dHB1dFF1YWxpdHlfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpc0hvdmVyZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY5KHRoaXMsIF9vdXRwdXRRdWFsaXR5X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2OSh0aGlzLCBfaXNIb3ZlcmVkX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc0hvdmVyZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc0hvdmVyZWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc0hvdmVyZWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzSG92ZXJlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzRHJhZ2dpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY5KHRoaXMsIF9pc0hvdmVyZWRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczY5KHRoaXMsIF9pc0RyYWdnaW5nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc0RyYWdnaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNEcmFnZ2luZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzRHJhZ2dpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzRHJhZ2dpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpc0xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczY5KHRoaXMsIF9pc0RyYWdnaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM2OSh0aGlzLCBfaXNMb2FkaW5nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc0xvYWRpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc0xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc0xvYWRpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzTG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgbW9kYWxJbnN0YW5jZSA9IChfX3J1bkluaXRpYWxpemVyczY5KHRoaXMsIF9pc0xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgLi4uRGVlc0lucHV0QmFzZS5iYXNlU3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5pbnB1dC13cmFwcGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiAxNnB4OwogICAgICB9CgogICAgICAucHJvZmlsZS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5wcm9maWxlLWNvbnRhaW5lcjpob3ZlciB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjAyKTsKICAgICAgfQoKICAgICAgLnByb2ZpbGUtcGljdHVyZSB7CiAgICAgICAgd2lkdGg6IHZhcigtLXNpemUsIDEyMHB4KTsKICAgICAgICBoZWlnaHQ6IHZhcigtLXNpemUsIDEyMHB4KTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y1ZjVmNSIsICIjMTgxODFiIil9OwogICAgICAgIGJvcmRlcjogM3B4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5wcm9maWxlLXBpY3R1cmUucm91bmQgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgLnByb2ZpbGUtcGljdHVyZS5zcXVhcmUgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICAgIH0KCiAgICAgIC5wcm9maWxlLXBpY3R1cmUuZHJhZ2dpbmcgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzYwYTVmYSIpfTsKICAgICAgICBib3gtc2hhZG93OiAwIDAgMCA0cHggJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoNTksIDEzMCwgMjQ2LCAwLjE1KSIsICJyZ2JhKDk2LCAxNjUsIDI1MCwgMC4xNSkiKX07CiAgICAgIH0KCiAgICAgIC5wcm9maWxlLXBpY3R1cmU6aG92ZXIgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkNGQ0ZDgiLCAiIzNmM2Y0NiIpfTsKICAgICAgfQoKICAgICAgLnByb2ZpbGUtcGljdHVyZTpkaXNhYmxlZCB7CiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIC5wcm9maWxlLWltYWdlIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb2JqZWN0LWZpdDogY292ZXI7CiAgICAgIH0KCiAgICAgIC5wbGFjZWhvbGRlci1pY29uIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgICAgfQoKICAgICAgLm92ZXJsYXkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcyBlYXNlOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAucHJvZmlsZS1jb250YWluZXI6aG92ZXIgLm92ZXJsYXkgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5vdmVybGF5LWNvbnRlbnQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiAxMnB4OwogICAgICB9CgogICAgICAub3ZlcmxheS1idXR0b24gewogICAgICAgIHdpZHRoOiA0MHB4OwogICAgICAgIGhlaWdodDogNDBweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkiLCAicmdiYSgzOSwgMzksIDQyLCAwLjk1KSIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjEpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xKTsKICAgICAgfQoKICAgICAgLm92ZXJsYXktYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjM2YzZjQ2Iil9OwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTsKICAgICAgICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKICAgICAgfQoKICAgICAgLm92ZXJsYXktYnV0dG9uLmRlbGV0ZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMjM5LCA2OCwgNjgsIDAuOSkiLCAicmdiYSgyMjAsIDM4LCAzOCwgMC45KSIpfTsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgLm92ZXJsYXktYnV0dG9uLmRlbGV0ZTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlZjQ0NDQiLCAiI2RjMjYyNiIpfTsKICAgICAgfQoKICAgICAgLmRyb3Atem9uZS10ZXh0IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmhpZGRlbi1pbnB1dCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLyogTG9hZGluZyBhbmltYXRpb24gKi8KICAgICAgLmxvYWRpbmctb3ZlcmxheSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpIiwgInJnYmEoMCwgMCwgMCwgMC44KSIpfTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycyBlYXNlOwogICAgICB9CgogICAgICAubG9hZGluZy1vdmVybGF5LnNob3cgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgIH0KCiAgICAgIC5sb2FkaW5nLXNwaW5uZXIgewogICAgICAgIHdpZHRoOiA0MHB4OwogICAgICAgIGhlaWdodDogNDBweDsKICAgICAgICBib3JkZXI6IDNweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjEpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSIpfTsKICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjNjBhNWZhIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBhbmltYXRpb246IHNwaW4gMC42cyBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgc3BpbiB7CiAgICAgICAgdG8gewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgcHVsc2UgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7CiAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIH0KICAgICAgICA1MCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA1KTsKICAgICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5wcm9maWxlLXBpY3R1cmUuY2xpY2tpbmcgewogICAgICAgIGFuaW1hdGlvbjogcHVsc2UgMC4zcyBlYXNlLW91dDsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJpbnB1dC13cmFwcGVyIj4KICAgICAgICA8ZGVlcy1sYWJlbCAubGFiZWw9JHt0aGlzLmxhYmVsfSAuZGVzY3JpcHRpb249JHt0aGlzLmRlc2NyaXB0aW9ufSAucmVxdWlyZWQ9JHt0aGlzLnJlcXVpcmVkfT48L2RlZXMtbGFiZWw+CiAgICAgICAgCiAgICAgICAgPGRpdiAKICAgICAgICAgIGNsYXNzPSJwcm9maWxlLWNvbnRhaW5lciIKICAgICAgICAgIEBjbGljaz0ke3RoaXMuaGFuZGxlQ2xpY2t9CiAgICAgICAgICBAZHJhZ292ZXI9JHt0aGlzLmhhbmRsZURyYWdPdmVyfQogICAgICAgICAgQGRyYWdsZWF2ZT0ke3RoaXMuaGFuZGxlRHJhZ0xlYXZlfQogICAgICAgICAgQGRyb3A9JHt0aGlzLmhhbmRsZURyb3B9CiAgICAgICAgICBzdHlsZT0iLS1zaXplOiAke3RoaXMuc2l6ZX1weCIKICAgICAgICA+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9maWxlLXBpY3R1cmUgJHt0aGlzLnNoYXBlfSAke3RoaXMuaXNEcmFnZ2luZyA/ICJkcmFnZ2luZyIgOiAiIn0gJHt0aGlzLmlzTG9hZGluZyAmJiAhdGhpcy52YWx1ZSA/ICJjbGlja2luZyIgOiAiIn0iPgogICAgICAgICAgICAke3RoaXMudmFsdWUgPyBiMmAKICAgICAgICAgICAgICA8aW1nIGNsYXNzPSJwcm9maWxlLWltYWdlIiBzcmM9IiR7dGhpcy52YWx1ZX0iIGFsdD0iUHJvZmlsZSBwaWN0dXJlIiAvPgogICAgICAgICAgICBgIDogYjJgCiAgICAgICAgICAgICAgPGRlZXMtaWNvbiBjbGFzcz0icGxhY2Vob2xkZXItaWNvbiIgaWNvbj0ibHVjaWRlOnVzZXIiIGljb25TaXplPSIke3RoaXMuc2l6ZSAqIDAuNX0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICBgfQogICAgICAgICAgICAKICAgICAgICAgICAgJHt0aGlzLmlzRHJhZ2dpbmcgPyBiMmAKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJvdmVybGF5IiBzdHlsZT0ib3BhY2l0eTogMSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkcm9wLXpvbmUtdGV4dCI+CiAgICAgICAgICAgICAgICAgIERyb3AgaW1hZ2UgaGVyZQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgCiAgICAgICAgICAgICR7dGhpcy52YWx1ZSAmJiAhdGhpcy5kaXNhYmxlZCA/IGIyYAogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im92ZXJsYXkiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3ZlcmxheS1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgJHt0aGlzLmFsbG93VXBsb2FkID8gYjJgCiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ib3ZlcmxheS1idXR0b24iIEBjbGljaz0keyhlMTEpID0+IHsKICAgICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgdGhpcy5vcGVuTW9kYWwoKTsKICAgICAgfX0gdGl0bGU9IkNoYW5nZSBwaWN0dXJlIj4KICAgICAgICAgICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOnBlbmNpbCIgaWNvblNpemU9IjIwIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgYCA6ICIifQogICAgICAgICAgICAgICAgICAke3RoaXMuYWxsb3dEZWxldGUgPyBiMmAKICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJvdmVybGF5LWJ1dHRvbiBkZWxldGUiIEBjbGljaz0keyhlMTEpID0+IHsKICAgICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgdGhpcy5kZWxldGVQaWN0dXJlKCk7CiAgICAgIH19IHRpdGxlPSJEZWxldGUgcGljdHVyZSI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTp0cmFzaDIiIGljb25TaXplPSIyMCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgIDogIiJ9CiAgICAgICAgICAgIAogICAgICAgICAgICAke3RoaXMuaXNMb2FkaW5nICYmICF0aGlzLnZhbHVlID8gYjJgCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibG9hZGluZy1vdmVybGF5IHNob3ciPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibG9hZGluZy1zcGlubmVyIj48L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYCA6ICIifQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPGlucHV0CiAgICAgICAgICB0eXBlPSJmaWxlIgogICAgICAgICAgY2xhc3M9ImhpZGRlbi1pbnB1dCIKICAgICAgICAgIGFjY2VwdD0iJHt0aGlzLmFjY2VwdGVkRm9ybWF0cy5qb2luKCIsIil9IgogICAgICAgICAgQGNoYW5nZT0ke3RoaXMuaGFuZGxlRmlsZVNlbGVjdH0KICAgICAgICAvPgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBoYW5kbGVDbGljaygpIHsKICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgIXRoaXMuYWxsb3dVcGxvYWQpCiAgICAgICAgcmV0dXJuOwogICAgICBpZiAoIXRoaXMudmFsdWUpIHsKICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7CiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmhpZGRlbi1pbnB1dCIpOwogICAgICAgIGNvbnN0IGhhbmRsZUZvY3VzID0gKCkgPT4gewogICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGlmICghaW5wdXQuZmlsZXMgfHwgaW5wdXQuZmlsZXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXMiLCBoYW5kbGVGb2N1cyk7CiAgICAgICAgICB9LCAzMDApOwogICAgICAgIH07CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwgaGFuZGxlRm9jdXMpOwogICAgICAgIGlucHV0LmNsaWNrKCk7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZUZpbGVTZWxlY3QoZXZlbnQpIHsKICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQ7CiAgICAgIGNvbnN0IGZpbGUgPSBpbnB1dC5maWxlcz8uWzBdOwogICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlOwogICAgICBpZiAoZmlsZSkgewogICAgICAgIHRoaXMucHJvY2Vzc0ZpbGUoZmlsZSk7CiAgICAgIH0KICAgICAgaW5wdXQudmFsdWUgPSAiIjsKICAgIH0KICAgIGhhbmRsZURyYWdPdmVyKGV2ZW50KSB7CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiB0aGlzLmFsbG93VXBsb2FkKSB7CiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgaGFuZGxlRHJhZ0xlYXZlKCkgewogICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTsKICAgIH0KICAgIGhhbmRsZURyb3AoZXZlbnQpIHsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7CiAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8ICF0aGlzLmFsbG93VXBsb2FkKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgZmlsZSA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXNbMF07CiAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgdGhpcy5wcm9jZXNzRmlsZShmaWxlKTsKICAgICAgfQogICAgfQogICAgYXN5bmMgcHJvY2Vzc0ZpbGUoZmlsZSkgewogICAgICBpZiAoIXRoaXMuYWNjZXB0ZWRGb3JtYXRzLmluY2x1ZGVzKGZpbGUudHlwZSkpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJJbnZhbGlkIGZpbGUgdHlwZToiLCBmaWxlLnR5cGUpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoZmlsZS5zaXplID4gdGhpcy5tYXhGaWxlU2l6ZSkgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkZpbGUgdG9vIGxhcmdlOiIsIGZpbGUuc2l6ZSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgIHJlYWRlci5vbmxvYWQgPSBhc3luYyAoZTExKSA9PiB7CiAgICAgICAgY29uc3QgYmFzZTY0MiA9IGUxMS50YXJnZXQ/LnJlc3VsdDsKICAgICAgICBhd2FpdCB0aGlzLm9wZW5Nb2RhbChiYXNlNjQyKTsKICAgICAgfTsKICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7CiAgICB9CiAgICBhc3luYyBvcGVuTW9kYWwoaW5pdGlhbEltYWdlKSB7CiAgICAgIGNvbnN0IGltYWdlVG9FZGl0ID0gaW5pdGlhbEltYWdlIHx8IHRoaXMudmFsdWU7CiAgICAgIGlmICghaW1hZ2VUb0VkaXQpIHsKICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuaGlkZGVuLWlucHV0Iik7CiAgICAgICAgaW5wdXQuY2xpY2soKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5tb2RhbEluc3RhbmNlID0gbmV3IFByb2ZpbGVQaWN0dXJlTW9kYWwoKTsKICAgICAgdGhpcy5tb2RhbEluc3RhbmNlLnNoYXBlID0gdGhpcy5zaGFwZTsKICAgICAgdGhpcy5tb2RhbEluc3RhbmNlLmluaXRpYWxJbWFnZSA9IGltYWdlVG9FZGl0OwogICAgICB0aGlzLm1vZGFsSW5zdGFuY2Uub3V0cHV0U2l6ZSA9IHRoaXMub3V0cHV0U2l6ZTsKICAgICAgdGhpcy5tb2RhbEluc3RhbmNlLm91dHB1dFF1YWxpdHkgPSB0aGlzLm91dHB1dFF1YWxpdHk7CiAgICAgIHRoaXMubW9kYWxJbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKCJzYXZlIiwgKGV2ZW50KSA9PiB7CiAgICAgICAgdGhpcy52YWx1ZSA9IGV2ZW50LmRldGFpbC5jcm9wcGVkSW1hZ2U7CiAgICAgICAgdGhpcy5jaGFuZ2VTdWJqZWN0Lm5leHQodGhpcyk7CiAgICAgIH0pOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMubW9kYWxJbnN0YW5jZSk7CiAgICB9CiAgICBkZWxldGVQaWN0dXJlKCkgewogICAgICB0aGlzLnZhbHVlID0gIiI7CiAgICAgIHRoaXMuY2hhbmdlU3ViamVjdC5uZXh0KHRoaXMpOwogICAgfQogICAgZ2V0VmFsdWUoKSB7CiAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgfQogICAgc2V0VmFsdWUodmFsdWUyKSB7CiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTI7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczY5KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzSW5wdXRQcm9maWxlUGljdHVyZTIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWxheW91dC9kZWVzLWNoaXBzL2RlZXMtY2hpcHMuZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmM0NiA9ICgpID0+IGIyYAogIDxzdHlsZT4KICAgIC5kZW1vQ29udGFpbmVyIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgZ2FwOiAzMnB4OwogICAgICBwYWRkaW5nOiA0OHB4OwogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y4ZjlmYSIsICIjMGEwYTBhIil9OwogICAgICBtaW4taGVpZ2h0OiAxMDB2aDsKICAgIH0KICAgIAogICAgLnNlY3Rpb24gewogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMTgxODFiIil9OwogICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSk7CiAgICB9CiAgICAKICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICBmb250LXdlaWdodDogNjAwOwogICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgIH0KICAgIAogICAgLnNlY3Rpb24tZGVzY3JpcHRpb24gewogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OwogICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgfQogIDwvc3R5bGU+CiAgPGRpdiBjbGFzcz0iZGVtb0NvbnRhaW5lciI+CiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+Tm9uLVNlbGVjdGFibGUgQ2hpcHM8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+QmFzaWMgY2hpcHMgd2l0aG91dCBzZWxlY3Rpb24gY2FwYWJpbGl0eS4gVXNlIGZvciBkaXNwbGF5LW9ubHkgdGFncy48L2Rpdj4KICAgICAgPGRlZXMtY2hpcHMKICAgICAgICBzZWxlY3Rpb25Nb2RlPSJub25lIgogICAgICAgIC5zZWxlY3RhYmxlQ2hpcHM9JHtbCiAgeyBrZXk6ICJzdGF0dXMiLCB2YWx1ZTogIkFjdGl2ZSIgfSwKICB7IGtleTogInRpZXIiLCB2YWx1ZTogIlByZW1pdW0iIH0sCiAgeyBrZXk6ICJyZWdpb24iLCB2YWx1ZTogIkVVLVdlc3QiIH0sCiAgeyBrZXk6ICJ0eXBlIiwgdmFsdWU6ICJFbnRlcnByaXNlIiB9Cl19CiAgICAgID48L2RlZXMtY2hpcHM+CiAgICA8L2Rpdj4KICAgIAogICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlNpbmdsZSBTZWxlY3Rpb24gQ2hpcHM8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+Q2xpY2sgdG8gc2VsZWN0IG9uZSBjaGlwIGF0IGEgdGltZS4gVXNlZnVsIGZvciBmaWx0ZXJzIGFuZCBvcHRpb25zLjwvZGl2PgogICAgICA8ZGVlcy1jaGlwcwogICAgICAgIHNlbGVjdGlvbk1vZGU9InNpbmdsZSIKICAgICAgICAuc2VsZWN0YWJsZUNoaXBzPSR7WwogIHsga2V5OiAiYWxsIiwgdmFsdWU6ICJBbGwgUHJvamVjdHMiIH0sCiAgeyBrZXk6ICJhY3RpdmUiLCB2YWx1ZTogIkFjdGl2ZSIgfSwKICB7IGtleTogImFyY2hpdmVkIiwgdmFsdWU6ICJBcmNoaXZlZCIgfSwKICB7IGtleTogImRyYWZ0cyIsIHZhbHVlOiAiRHJhZnRzIiB9Cl19CiAgICAgID48L2RlZXMtY2hpcHM+CiAgICA8L2Rpdj4KICAgIAogICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPk11bHRpcGxlIFNlbGVjdGlvbiBDaGlwczwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5TZWxlY3QgbXVsdGlwbGUgY2hpcHMgc2ltdWx0YW5lb3VzbHkuIEdyZWF0IGZvciB0YWcgc2VsZWN0aW9uLjwvZGl2PgogICAgICA8ZGVlcy1jaGlwcwogICAgICAgIHNlbGVjdGlvbk1vZGU9Im11bHRpcGxlIgogICAgICAgIC5zZWxlY3RhYmxlQ2hpcHM9JHtbCiAgeyBrZXk6ICJqcyIsIHZhbHVlOiAiSmF2YVNjcmlwdCIgfSwKICB7IGtleTogInRzIiwgdmFsdWU6ICJUeXBlU2NyaXB0IiB9LAogIHsga2V5OiAicmVhY3QiLCB2YWx1ZTogIlJlYWN0IiB9LAogIHsga2V5OiAidnVlIiwgdmFsdWU6ICJWdWUiIH0sCiAgeyBrZXk6ICJhbmd1bGFyIiwgdmFsdWU6ICJBbmd1bGFyIiB9LAogIHsga2V5OiAibm9kZSIsIHZhbHVlOiAiTm9kZS5qcyIgfQpdfQogICAgICA+PC9kZWVzLWNoaXBzPgogICAgPC9kaXY+CiAgICAKICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5SZW1vdmFibGUgQ2hpcHMgd2l0aCBLZXlzPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPkNoaXBzIHdpdGggcmVtb3ZlIGJ1dHRvbnMgYW5kIGtleS12YWx1ZSBwYWlycy4gUGVyZmVjdCBmb3IgZHluYW1pYyBsaXN0cy48L2Rpdj4KICAgICAgPGRlZXMtY2hpcHMKICAgICAgICBzZWxlY3Rpb25Nb2RlPSJzaW5nbGUiCiAgICAgICAgY2hpcHNBcmVSZW1vdmFibGUKICAgICAgICAuc2VsZWN0YWJsZUNoaXBzPSR7WwogIHsga2V5OiAiZW52IiwgdmFsdWU6ICJQcm9kdWN0aW9uIiB9LAogIHsga2V5OiAidmVyc2lvbiIsIHZhbHVlOiAiMi40LjEiIH0sCiAgeyBrZXk6ICJicmFuY2giLCB2YWx1ZTogIm1haW4iIH0sCiAgeyBrZXk6ICJhdXRob3IiLCB2YWx1ZTogIkpvaG4gRG9lIiB9Cl19CiAgICAgID48L2RlZXMtY2hpcHM+CiAgICA8L2Rpdj4KICAgIAogICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPk1peGVkIENvbnRlbnQgRXhhbXBsZTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5Db21iaW5pbmcgZGlmZmVyZW50IGNoaXAgdHlwZXMgZm9yIGNvbXBsZXggVUlzLjwvZGl2PgogICAgICA8ZGVlcy1jaGlwcwogICAgICAgIHNlbGVjdGlvbk1vZGU9Im11bHRpcGxlIgogICAgICAgIGNoaXBzQXJlUmVtb3ZhYmxlCiAgICAgICAgLnNlbGVjdGFibGVDaGlwcz0ke1sKICB7IGtleTogInByaW9yaXR5IiwgdmFsdWU6ICJIaWdoIiB9LAogIHsga2V5OiAic3RhdHVzIiwgdmFsdWU6ICJJbiBQcm9ncmVzcyIgfSwKICB7IGtleTogImJ1ZyIsIHZhbHVlOiAiQnVnIiB9LAogIHsga2V5OiAiZmVhdHVyZSIsIHZhbHVlOiAiRmVhdHVyZSIgfSwKICB7IGtleTogInNwcmludCIsIHZhbHVlOiAiU3ByaW50IDIzIiB9LAogIHsga2V5OiAiYXNzaWduZWUiLCB2YWx1ZTogIkFsaWNlIiB9Cl19CiAgICAgID48L2RlZXMtY2hpcHM+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1jaGlwcy9kZWVzLWNoaXBzLmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfZGlzdF90czI5KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTY5ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM3MCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0NoaXBzID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLWNoaXBzIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfc2VsZWN0aW9uTW9kZV9kZWNvcmF0b3JzOwogIGxldCBfc2VsZWN0aW9uTW9kZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGlvbk1vZGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NoaXBzQXJlUmVtb3ZhYmxlX2RlY29yYXRvcnM7CiAgbGV0IF9jaGlwc0FyZVJlbW92YWJsZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NoaXBzQXJlUmVtb3ZhYmxlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RhYmxlQ2hpcHNfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGFibGVDaGlwc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGFibGVDaGlwc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRDaGlwX2RlY29yYXRvcnM7CiAgbGV0IF9zZWxlY3RlZENoaXBfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZENoaXBfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkQ2hpcHNfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkQ2hpcHNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZENoaXBzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNDaGlwczIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9zZWxlY3Rpb25Nb2RlX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9jaGlwc0FyZVJlbW92YWJsZV9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBCb29sZWFuCiAgICAgIH0pXTsKICAgICAgX3NlbGVjdGFibGVDaGlwc19kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBBcnJheQogICAgICB9KV07CiAgICAgIF9zZWxlY3RlZENoaXBfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX3NlbGVjdGVkQ2hpcHNfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogQXJyYXkKICAgICAgfSldOwogICAgICBfX2VzRGVjb3JhdGU2OSh0aGlzLCBudWxsLCBfc2VsZWN0aW9uTW9kZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWxlY3Rpb25Nb2RlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3Rpb25Nb2RlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGlvbk1vZGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlbGVjdGlvbk1vZGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0aW9uTW9kZV9pbml0aWFsaXplcnMsIF9zZWxlY3Rpb25Nb2RlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjkodGhpcywgbnVsbCwgX2NoaXBzQXJlUmVtb3ZhYmxlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNoaXBzQXJlUmVtb3ZhYmxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjaGlwc0FyZVJlbW92YWJsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jaGlwc0FyZVJlbW92YWJsZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY2hpcHNBcmVSZW1vdmFibGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY2hpcHNBcmVSZW1vdmFibGVfaW5pdGlhbGl6ZXJzLCBfY2hpcHNBcmVSZW1vdmFibGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2OSh0aGlzLCBudWxsLCBfc2VsZWN0YWJsZUNoaXBzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlbGVjdGFibGVDaGlwcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0YWJsZUNoaXBzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGFibGVDaGlwcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VsZWN0YWJsZUNoaXBzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGFibGVDaGlwc19pbml0aWFsaXplcnMsIF9zZWxlY3RhYmxlQ2hpcHNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2OSh0aGlzLCBudWxsLCBfc2VsZWN0ZWRDaGlwX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlbGVjdGVkQ2hpcCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0ZWRDaGlwIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGVkQ2hpcCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VsZWN0ZWRDaGlwID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGVkQ2hpcF9pbml0aWFsaXplcnMsIF9zZWxlY3RlZENoaXBfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU2OSh0aGlzLCBudWxsLCBfc2VsZWN0ZWRDaGlwc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzZWxlY3RlZENoaXBzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3RlZENoaXBzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGVkQ2hpcHMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNlbGVjdGVkQ2hpcHMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0ZWRDaGlwc19pbml0aWFsaXplcnMsIF9zZWxlY3RlZENoaXBzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNjkobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzQ2hpcHMyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmM0NjsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJMYXlvdXQiXTsKICAgICNzZWxlY3Rpb25Nb2RlX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczcwKHRoaXMsIF9zZWxlY3Rpb25Nb2RlX2luaXRpYWxpemVycywgInNpbmdsZSIpOwogICAgZ2V0IHNlbGVjdGlvbk1vZGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWxlY3Rpb25Nb2RlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0aW9uTW9kZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VsZWN0aW9uTW9kZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NoaXBzQXJlUmVtb3ZhYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3MCh0aGlzLCBfc2VsZWN0aW9uTW9kZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzAodGhpcywgX2NoaXBzQXJlUmVtb3ZhYmxlX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBjaGlwc0FyZVJlbW92YWJsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2NoaXBzQXJlUmVtb3ZhYmxlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY2hpcHNBcmVSZW1vdmFibGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2NoaXBzQXJlUmVtb3ZhYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0YWJsZUNoaXBzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3MCh0aGlzLCBfY2hpcHNBcmVSZW1vdmFibGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczcwKHRoaXMsIF9zZWxlY3RhYmxlQ2hpcHNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IHNlbGVjdGFibGVDaGlwcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlbGVjdGFibGVDaGlwc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNlbGVjdGFibGVDaGlwcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VsZWN0YWJsZUNoaXBzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0ZWRDaGlwX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3MCh0aGlzLCBfc2VsZWN0YWJsZUNoaXBzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3MCh0aGlzLCBfc2VsZWN0ZWRDaGlwX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IHNlbGVjdGVkQ2hpcCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkQ2hpcF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNlbGVjdGVkQ2hpcCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VsZWN0ZWRDaGlwX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0ZWRDaGlwc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzAodGhpcywgX3NlbGVjdGVkQ2hpcF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzAodGhpcywgX3NlbGVjdGVkQ2hpcHNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IHNlbGVjdGVkQ2hpcHMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZENoaXBzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0ZWRDaGlwcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VsZWN0ZWRDaGlwc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNzAodGhpcywgX3NlbGVjdGVkQ2hpcHNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAubWFpbmJveCB7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgIH0KCiAgICAgIC5jaGlwIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjMjcyNzJhIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzZjNmNDYiKX07CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgcGFkZGluZzogMHB4IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA1KTsKICAgICAgfQoKICAgICAgLmNoaXA6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMzZjNmNDYiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2QxZDVkYiIsICIjNTI1MjViIil9OwogICAgICB9CgogICAgICAuY2hpcDphY3RpdmUgewogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OCk7CiAgICAgIH0KCiAgICAgIC5jaGlwLnNlbGVjdGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjM2I4MmY2Iil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICAgICAgICBjb2xvcjogI2ZmZmZmZjsKICAgICAgfQoKICAgICAgLmNoaXAuc2VsZWN0ZWQ6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMjU2M2ViIiwgIiMyNTYzZWIiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzI1NjNlYiIsICIjMjU2M2ViIil9OwogICAgICB9CgogICAgICAuY2hpcEtleSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC4wNikiLCAicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpIil9OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtOHB4OwogICAgICAgIHBhZGRpbmc6IDBweCA4cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA4cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OwogICAgICB9CgogICAgICAuY2hpcC5zZWxlY3RlZCAuY2hpcEtleSB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpOwogICAgICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICAgIH0KCiAgICAgIGRlZXMtaWNvbiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBtYXJnaW4tbGVmdDogOHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogLTZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiNhMWExYWEiKX07CiAgICAgIH0KCiAgICAgIC5jaGlwLnNlbGVjdGVkIGRlZXMtaWNvbiB7CiAgICAgICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsKICAgICAgfQoKICAgICAgZGVlcy1pY29uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjEpIiwgInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlZjQ0NDQiLCAiI2VmNDQ0NCIpfTsKICAgICAgfQoKICAgICAgLmNoaXAuc2VsZWN0ZWQgZGVlcy1pY29uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7CiAgICAgICAgY29sb3I6ICNmZmZmZmY7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0ibWFpbmJveCI+CiAgICAgICAgJHt0aGlzLnNlbGVjdGFibGVDaGlwcy5tYXAoKGNoaXApID0+IGIyYAogICAgICAgICAgICA8ZGl2CiAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5zZWxlY3RDaGlwKGNoaXApfQogICAgICAgICAgICAgIGNsYXNzPSJjaGlwICR7dGhpcy5pc1NlbGVjdGVkKGNoaXApID8gInNlbGVjdGVkIiA6ICIifSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgICR7Y2hpcC5rZXkgPyBiMmA8ZGl2IGNsYXNzPSJjaGlwS2V5Ij4ke2NoaXAua2V5fTwvZGl2PmAgOiBiMmBgfSAke2NoaXAudmFsdWV9CiAgICAgICAgICAgICAgJHt0aGlzLmNoaXBzQXJlUmVtb3ZhYmxlID8gYjJgCiAgICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbgogICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KGV2ZW50KSA9PiB7CiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgdGhpcy5yZW1vdmVDaGlwKGNoaXApOwogICAgICB9fQogICAgICAgICAgICAgICAgICAgICAgLmljb249JHsiZmE6eG1hcmsifQogICAgICAgICAgICAgICAgICAgID48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgICAgYCA6IGIyYGB9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYCl9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZCgpIHsKICAgIH0KICAgIGlzU2VsZWN0ZWQoY2hpcCkgewogICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAic2luZ2xlIikgewogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQ2hpcCA/IHRoaXMuaXNTYW1lQ2hpcCh0aGlzLnNlbGVjdGVkQ2hpcCwgY2hpcCkgOiBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENoaXBzLnNvbWUoKHNlbGVjdGVkKSA9PiB0aGlzLmlzU2FtZUNoaXAoc2VsZWN0ZWQsIGNoaXApKTsKICAgICAgfQogICAgfQogICAgaXNTYW1lQ2hpcChjaGlwMSwgY2hpcDIpIHsKICAgICAgaWYgKGNoaXAxLmtleSAmJiBjaGlwMi5rZXkpIHsKICAgICAgICByZXR1cm4gY2hpcDEua2V5ID09PSBjaGlwMi5rZXk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNoaXAxLnZhbHVlID09PSBjaGlwMi52YWx1ZSAmJiBjaGlwMS5rZXkgPT09IGNoaXAyLmtleTsKICAgIH0KICAgIGFzeW5jIHNlbGVjdENoaXAoY2hpcCkgewogICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAibm9uZSIpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gInNpbmdsZSIpIHsKICAgICAgICBpZiAodGhpcy5pc1NlbGVjdGVkKGNoaXApKSB7CiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hpcCA9IG51bGw7CiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hpcHMgPSBbXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5zZWxlY3RlZENoaXAgPSBjaGlwOwogICAgICAgICAgdGhpcy5zZWxlY3RlZENoaXBzID0gW2NoaXBdOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICJtdWx0aXBsZSIpIHsKICAgICAgICBpZiAodGhpcy5pc1NlbGVjdGVkKGNoaXApKSB7CiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hpcHMgPSB0aGlzLnNlbGVjdGVkQ2hpcHMuZmlsdGVyKChzZWxlY3RlZCkgPT4gIXRoaXMuaXNTYW1lQ2hpcChzZWxlY3RlZCwgY2hpcCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hpcHMgPSBbLi4udGhpcy5zZWxlY3RlZENoaXBzLCBjaGlwXTsKICAgICAgICB9CiAgICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7CiAgICAgIH0KICAgICAgY29uc29sZS5sb2codGhpcy5zZWxlY3RlZENoaXBzKTsKICAgIH0KICAgIHJlbW92ZUNoaXAoY2hpcFRvUmVtb3ZlKSB7CiAgICAgIHRoaXMuc2VsZWN0YWJsZUNoaXBzID0gdGhpcy5zZWxlY3RhYmxlQ2hpcHMuZmlsdGVyKChjaGlwKSA9PiAhdGhpcy5pc1NhbWVDaGlwKGNoaXAsIGNoaXBUb1JlbW92ZSkpOwogICAgICB0aGlzLnNlbGVjdGVkQ2hpcHMgPSB0aGlzLnNlbGVjdGVkQ2hpcHMuZmlsdGVyKChjaGlwKSA9PiAhdGhpcy5pc1NhbWVDaGlwKGNoaXAsIGNoaXBUb1JlbW92ZSkpOwogICAgICBpZiAodGhpcy5zZWxlY3RlZENoaXAgJiYgdGhpcy5pc1NhbWVDaGlwKHRoaXMuc2VsZWN0ZWRDaGlwLCBjaGlwVG9SZW1vdmUpKSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZENoaXAgPSBudWxsOwogICAgICB9CiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM3MChfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0NoaXBzMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbGF5b3V0L2RlZXMtZGFzaGJvYXJkZ3JpZC9kZWVzLWRhc2hib2FyZGdyaWQuZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmM0NyA9ICgpID0+IHsKICByZXR1cm4gYjJgCiAgICA8ZGVlcy1kZW1vd3JhcHBlciAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAoZWxlbWVudEFyZykgPT4gewogICAgY29uc3QgZ3JpZCA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiI2Rhc2hib2FyZEdyaWQiKTsKICAgIGNvbnN0IHNlZWRXaWRnZXRzID0gWwogICAgICB7CiAgICAgICAgaWQ6ICJtZXRyaWNzMSIsCiAgICAgICAgeDogMCwKICAgICAgICB5OiAwLAogICAgICAgIHc6IDMsCiAgICAgICAgaDogMiwKICAgICAgICB0aXRsZTogIlJldmVudWUiLAogICAgICAgIGljb246ICJsdWNpZGU6ZG9sbGFyU2lnbiIsCiAgICAgICAgY29udGVudDogYjJgCiAgICAgICAgICAgIDxkaXYgc3R5bGU9InBhZGRpbmc6IDIwcHg7Ij4KICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6IDMycHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OyI+JDEyNCw1NjM8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJjb2xvcjogIzIyYzU1ZTsgZm9udC1zaXplOiAxNHB4OyBtYXJnaW4tdG9wOiA4cHg7Ij7ihpEgMTIuNSUgZnJvbSBsYXN0IG1vbnRoPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYAogICAgICB9LAogICAgICB7CiAgICAgICAgaWQ6ICJtZXRyaWNzMiIsCiAgICAgICAgeDogMywKICAgICAgICB5OiAwLAogICAgICAgIHc6IDMsCiAgICAgICAgaDogMiwKICAgICAgICB0aXRsZTogIlVzZXJzIiwKICAgICAgICBpY29uOiAibHVjaWRlOnVzZXJzIiwKICAgICAgICBjb250ZW50OiBiMmAKICAgICAgICAgICAgPGRpdiBzdHlsZT0icGFkZGluZzogMjBweDsiPgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZTogMzJweDsgZm9udC13ZWlnaHQ6IDcwMDsgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07Ij44LDIzNDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImNvbG9yOiAjM2I4MmY2OyBmb250LXNpemU6IDE0cHg7IG1hcmdpbi10b3A6IDhweDsiPuKGkSA1LjIlIGZyb20gbGFzdCB3ZWVrPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYAogICAgICB9LAogICAgICB7CiAgICAgICAgaWQ6ICJjaGFydDEiLAogICAgICAgIHg6IDYsCiAgICAgICAgeTogMCwKICAgICAgICB3OiA2LAogICAgICAgIGg6IDQsCiAgICAgICAgdGl0bGU6ICJBbmFseXRpY3MiLAogICAgICAgIGljb246ICJsdWNpZGU6bGluZUNoYXJ0IiwKICAgICAgICBjb250ZW50OiBiMmAKICAgICAgICAgICAgPGRpdiBzdHlsZT0icGFkZGluZzogMjBweDsgaGVpZ2h0OiAxMDAlOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsiPgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICM3MTcxN2E7Ij4KICAgICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOmxpbmVDaGFydCJ9IHN0eWxlPSJmb250LXNpemU6IDQ4cHg7IG1hcmdpbi1ib3R0b206IDE2cHg7Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgIDxkaXY+Q2hhcnQgdmlzdWFsaXphdGlvbiBhcmVhPC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYAogICAgICB9CiAgICBdOwogICAgZ3JpZC53aWRnZXRzID0gc2VlZFdpZGdldHMubWFwKCh3aWRnZXQpID0+ICh7IC4uLndpZGdldCB9KSk7CiAgICBncmlkLmNlbGxIZWlnaHQgPSA4MDsKICAgIGdyaWQubWFyZ2luID0geyB0b3A6IDEwLCByaWdodDogMTAsIGJvdHRvbTogMTAsIGxlZnQ6IDEwIH07CiAgICBncmlkLmVuYWJsZUFuaW1hdGlvbiA9IHRydWU7CiAgICBncmlkLnNob3dHcmlkTGluZXMgPSBmYWxzZTsKICAgIGNvbnN0IGJhc2VMYXlvdXQgPSBncmlkLmdldExheW91dCgpLm1hcCgoaXRlbSkgPT4gKHsgLi4uaXRlbSB9KSk7CiAgICBjb25zdCBtb2JpbGVMYXlvdXQgPSBncmlkLndpZGdldHMubWFwKCh3aWRnZXQsIGluZGV4MikgPT4gKHsKICAgICAgaWQ6IHdpZGdldC5pZCwKICAgICAgeDogMCwKICAgICAgeTogaW5kZXgyID09PSAwID8gMCA6IGdyaWQud2lkZ2V0cy5zbGljZSgwLCBpbmRleDIpLnJlZHVjZSgoYWNjLCBwcmV2KSA9PiBhY2MgKyBwcmV2LmgsIDApLAogICAgICB3OiBncmlkLmNvbHVtbnMsCiAgICAgIGg6IHdpZGdldC5oCiAgICB9KSk7CiAgICBncmlkLmxheW91dHMgPSB7CiAgICAgIGJhc2U6IGJhc2VMYXlvdXQsCiAgICAgIG1vYmlsZTogbW9iaWxlTGF5b3V0CiAgICB9OwogICAgY29uc3Qgc3RhdHVzRWwgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoIiNkYXNoYm9hcmRMYXlvdXRTdGF0dXMiKTsKICAgIGNvbnN0IHVwZGF0ZVN0YXR1cyA9ICgpID0+IHsKICAgICAgY29uc3QgbGF5b3V0ID0gZ3JpZC5nZXRMYXlvdXQoKTsKICAgICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBgQWN0aXZlIGJyZWFrcG9pbnQ6ICR7Z3JpZC5hY3RpdmVCcmVha3BvaW50fSBcdTIwMjIgVGlsZXM6ICR7bGF5b3V0Lmxlbmd0aH1gOwogICAgfTsKICAgIGNvbnN0IG1lZGlhUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYSgiKG1heC13aWR0aDogNzY4cHgpIik7CiAgICBjb25zdCBoYW5kbGVCcmVha3BvaW50ID0gKCkgPT4gewogICAgICBjb25zdCB0YXJnZXQgPSBtZWRpYVF1ZXJ5Lm1hdGNoZXMgPyAibW9iaWxlIiA6ICJiYXNlIjsKICAgICAgZ3JpZC5hcHBseUJyZWFrcG9pbnRMYXlvdXQodGFyZ2V0KTsKICAgICAgdXBkYXRlU3RhdHVzKCk7CiAgICB9OwogICAgaWYgKHR5cGVvZiBtZWRpYVF1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgbWVkaWFRdWVyeS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBoYW5kbGVCcmVha3BvaW50KTsKICAgIH0gZWxzZSB7CiAgICAgIG1lZGlhUXVlcnkuYWRkTGlzdGVuZXI/LihoYW5kbGVCcmVha3BvaW50KTsKICAgIH0KICAgIGhhbmRsZUJyZWFrcG9pbnQoKTsKICAgIGxldCB3aWRnZXRDb3VudGVyID0gNDsKICAgIGNvbnN0IGJ1dHRvbnMgPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3JBbGwoImRlZXMtYnV0dG9uIik7CiAgICBidXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4gewogICAgICBjb25zdCB0ZXh0OSA9IGJ1dHRvbi50ZXh0Q29udGVudD8udHJpbSgpOwogICAgICBzd2l0Y2ggKHRleHQ5KSB7CiAgICAgICAgY2FzZSAiVG9nZ2xlIEFuaW1hdGlvbiI6CiAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgICAgICAgIGdyaWQuZW5hYmxlQW5pbWF0aW9uID0gIWdyaWQuZW5hYmxlQW5pbWF0aW9uOwogICAgICAgICAgfSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJUb2dnbGUgR3JpZCBMaW5lcyI6CiAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgICAgICAgIGdyaWQuc2hvd0dyaWRMaW5lcyA9ICFncmlkLnNob3dHcmlkTGluZXM7CiAgICAgICAgICB9KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkFkZCBXaWRnZXQiOgogICAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgICAgICAgICBjb25zdCBuZXdXaWRnZXQgPSB7CiAgICAgICAgICAgICAgaWQ6IGB3aWRnZXQke3dpZGdldENvdW50ZXIrK31gLAogICAgICAgICAgICAgIHg6IDAsCiAgICAgICAgICAgICAgeTogMCwKICAgICAgICAgICAgICB3OiAzLAogICAgICAgICAgICAgIGg6IDIsCiAgICAgICAgICAgICAgYXV0b1Bvc2l0aW9uOiB0cnVlLAogICAgICAgICAgICAgIHRpdGxlOiBgV2lkZ2V0ICR7d2lkZ2V0Q291bnRlciAtIDF9YCwKICAgICAgICAgICAgICBpY29uOiAibHVjaWRlOnBhY2thZ2UiLAogICAgICAgICAgICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJjb2xvcjogIzcxNzE3YTsiPk5ldyB3aWRnZXQgY29udGVudDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi10b3A6IDhweDsgZm9udC1zaXplOiAyNHB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsiPiR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMWUzKX08L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICBgCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGdyaWQuYWRkV2lkZ2V0KG5ld1dpZGdldCwgdHJ1ZSk7CiAgICAgICAgICB9KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkNvbXBhY3QgR3JpZCI6CiAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgICAgICAgIGdyaWQuY29tcGFjdCgpOwogICAgICAgICAgfSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJUb2dnbGUgRWRpdCBNb2RlIjoKICAgICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgICAgICAgZ3JpZC5lZGl0YWJsZSA9ICFncmlkLmVkaXRhYmxlOwogICAgICAgICAgICBidXR0b24udGV4dENvbnRlbnQgPSBncmlkLmVkaXRhYmxlID8gIkxvY2sgR3JpZCIgOiAiVW5sb2NrIEdyaWQiOwogICAgICAgICAgfSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJSZXNldCBMYXlvdXQiOgogICAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgICAgICAgICBncmlkLmFwcGx5QnJlYWtwb2ludExheW91dChncmlkLmFjdGl2ZUJyZWFrcG9pbnQpOwogICAgICAgICAgfSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0pOwogICAgbGV0IGxhc3RQbGFjZWhvbGRlclBvc2l0aW9uID0gbnVsbDsKICAgIGxldCBtb3ZlRXZlbnRDb3VudGVyID0gMDsKICAgIGNvbnN0IGxvZ0dyaWRTdGF0ZSA9IChldmVudE5hbWUsIGRldGFpbHMpID0+IHsKICAgICAgY29uc3QgbGF5b3V0ID0gZ3JpZC5nZXRMYXlvdXQoKTsKICAgICAgY29uc29sZS5ncm91cChgXHV7MUY1MDR9ICR7ZXZlbnROYW1lfSBbRXZlbnQgIyR7Kyttb3ZlRXZlbnRDb3VudGVyfV1gKTsKICAgICAgY29uc29sZS5sb2coIlRpbWVzdGFtcDoiLCAoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCkpOwogICAgICBjb25zb2xlLmxvZygiR3JpZCBDb25maWd1cmF0aW9uOiIsIHsKICAgICAgICBjb2x1bW5zOiBncmlkLmNvbHVtbnMsCiAgICAgICAgY2VsbEhlaWdodDogZ3JpZC5jZWxsSGVpZ2h0LAogICAgICAgIG1hcmdpbjogZ3JpZC5tYXJnaW4sCiAgICAgICAgZWRpdGFibGU6IGdyaWQuZWRpdGFibGUsCiAgICAgICAgYWN0aXZlQnJlYWtwb2ludDogZ3JpZC5hY3RpdmVCcmVha3BvaW50CiAgICAgIH0pOwogICAgICBjb25zb2xlLmxvZygiQ3VycmVudCBMYXlvdXQ6IiwgbGF5b3V0KTsKICAgICAgY29uc29sZS5sb2coIldpZGdldCBDb3VudDoiLCBsYXlvdXQubGVuZ3RoKTsKICAgICAgY29uc29sZS5sb2coIkdyaWQgQm91bmRzOiIsIHsKICAgICAgICB0b3RhbFdpZGdldHM6IGdyaWQud2lkZ2V0cy5sZW5ndGgsCiAgICAgICAgbWF4WTogTWF0aC5tYXgoLi4ubGF5b3V0Lm1hcCgodzQpID0+IHc0LnkgKyB3NC5oKSksCiAgICAgICAgb2NjdXBpZWQ6IGxheW91dC5tYXAoKHc0KSA9PiBgJHt3NC5pZH06ICgke3c0Lnh9LCR7dzQueX0pICR7dzQud314JHt3NC5ofWApLmpvaW4oIiwgIikKICAgICAgfSk7CiAgICAgIGlmIChkZXRhaWxzKSB7CiAgICAgICAgY29uc29sZS5sb2coIkV2ZW50IERldGFpbHM6IiwgZGV0YWlscyk7CiAgICAgIH0KICAgICAgY29uc29sZS5ncm91cEVuZCgpOwogICAgfTsKICAgIGNvbnN0IHBsYWNlaG9sZGVyT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7CiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gZ3JpZC5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIucGxhY2Vob2xkZXIiKTsKICAgICAgaWYgKHBsYWNlaG9sZGVyKSB7CiAgICAgICAgY29uc3QgY3VycmVudFBvc2l0aW9uID0gewogICAgICAgICAgbGVmdDogcGxhY2Vob2xkZXIuc3R5bGUubGVmdCwKICAgICAgICAgIHRvcDogcGxhY2Vob2xkZXIuc3R5bGUudG9wLAogICAgICAgICAgd2lkdGg6IHBsYWNlaG9sZGVyLnN0eWxlLndpZHRoLAogICAgICAgICAgaGVpZ2h0OiBwbGFjZWhvbGRlci5zdHlsZS5oZWlnaHQKICAgICAgICB9OwogICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShjdXJyZW50UG9zaXRpb24pICE9PSBKU09OLnN0cmluZ2lmeShsYXN0UGxhY2Vob2xkZXJQb3NpdGlvbikpIHsKICAgICAgICAgIGNvbnNvbGUuZ3JvdXAoIlx1ezFGNENEfSBQbGFjZWhvbGRlciBQb3NpdGlvbiBDaGFuZ2VkIik7CiAgICAgICAgICBjb25zb2xlLmxvZygiUHJldmlvdXM6IiwgbGFzdFBsYWNlaG9sZGVyUG9zaXRpb24pOwogICAgICAgICAgY29uc29sZS5sb2coIkN1cnJlbnQ6IiwgY3VycmVudFBvc2l0aW9uKTsKICAgICAgICAgIGNvbnN0IGdyaWRJbmZvID0gZ3JpZC5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuZ3JpZC1jb250YWluZXIiKTsKICAgICAgICAgIGlmIChncmlkSW5mbykgewogICAgICAgICAgICBjb25zb2xlLmxvZygiR3JpZCBDb250YWluZXIgRGltZW5zaW9uczoiLCB7CiAgICAgICAgICAgICAgd2lkdGg6IGdyaWRJbmZvLmNsaWVudFdpZHRoLAogICAgICAgICAgICAgIGhlaWdodDogZ3JpZEluZm8uY2xpZW50SGVpZ2h0CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpOwogICAgICAgICAgbGFzdFBsYWNlaG9sZGVyUG9zaXRpb24gPSBjdXJyZW50UG9zaXRpb247CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIGlmIChncmlkLnNoYWRvd1Jvb3QpIHsKICAgICAgcGxhY2Vob2xkZXJPYnNlcnZlci5vYnNlcnZlKGdyaWQuc2hhZG93Um9vdCwgewogICAgICAgIGNoaWxkTGlzdDogdHJ1ZSwKICAgICAgICBzdWJ0cmVlOiB0cnVlLAogICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsCiAgICAgICAgYXR0cmlidXRlRmlsdGVyOiBbInN0eWxlIl0KICAgICAgfSk7CiAgICB9CiAgICBsb2dHcmlkU3RhdGUoIkluaXRpYWwgR3JpZCBTdGF0ZSIpOwogICAgZ3JpZC5hZGRFdmVudExpc3RlbmVyKCJ3aWRnZXQtbW92ZSIsIChlMTEpID0+IHsKICAgICAgbG9nR3JpZFN0YXRlKCJXaWRnZXQgTW92ZSIsIHsKICAgICAgICB3aWRnZXQ6IGUxMS5kZXRhaWwud2lkZ2V0LAogICAgICAgIGRpc3BsYWNlZDogZTExLmRldGFpbC5kaXNwbGFjZWQsCiAgICAgICAgc3dhcHBlZFdpdGg6IGUxMS5kZXRhaWwuc3dhcHBlZFdpdGgKICAgICAgfSk7CiAgICB9KTsKICAgIGdyaWQuYWRkRXZlbnRMaXN0ZW5lcigid2lkZ2V0LXJlc2l6ZSIsIChlMTEpID0+IHsKICAgICAgbG9nR3JpZFN0YXRlKCJXaWRnZXQgUmVzaXplIiwgewogICAgICAgIHdpZGdldDogZTExLmRldGFpbC53aWRnZXQsCiAgICAgICAgZGlzcGxhY2VkOiBlMTEuZGV0YWlsLmRpc3BsYWNlZCwKICAgICAgICBzd2FwcGVkV2l0aDogZTExLmRldGFpbC5zd2FwcGVkV2l0aAogICAgICB9KTsKICAgIH0pOwogICAgZ3JpZC5hZGRFdmVudExpc3RlbmVyKCJ3aWRnZXQtcmVtb3ZlIiwgKGUxMSkgPT4gewogICAgICBsb2dHcmlkU3RhdGUoIldpZGdldCBSZW1vdmUiLCB7CiAgICAgICAgcmVtb3ZlZFdpZGdldDogZTExLmRldGFpbC53aWRnZXQKICAgICAgfSk7CiAgICAgIHVwZGF0ZVN0YXR1cygpOwogICAgfSk7CiAgICBncmlkLmFkZEV2ZW50TGlzdGVuZXIoImxheW91dC1jaGFuZ2UiLCAoKSA9PiB7CiAgICAgIGxvZ0dyaWRTdGF0ZSgiTGF5b3V0IENoYW5nZSIpOwogICAgICB1cGRhdGVTdGF0dXMoKTsKICAgIH0pOwogICAgZ3JpZC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsIChlMTEpID0+IHsKICAgICAgY29uc3QgaXNIZWFkZXIgPSBlMTEudGFyZ2V0LmNsb3Nlc3QoIi53aWRnZXQtaGVhZGVyIik7CiAgICAgIGNvbnN0IGlzUmVzaXplSGFuZGxlID0gZTExLnRhcmdldC5jbG9zZXN0KCIucmVzaXplLWhhbmRsZSIpOwogICAgICBpZiAoaXNIZWFkZXIgfHwgaXNSZXNpemVIYW5kbGUpIHsKICAgICAgICBjb25zb2xlLmdyb3VwKGBcdXsxRjNBRn0gSW50ZXJhY3Rpb24gU3RhcnRlZDogJHtpc0hlYWRlciA/ICJEcmFnIiA6ICJSZXNpemUifWApOwogICAgICAgIGNvbnNvbGUubG9nKCJUYXJnZXQgV2lkZ2V0OiIsIGUxMS50YXJnZXQuY2xvc2VzdCgiLndpZGdldCIpPy5nZXRBdHRyaWJ1dGUoImRhdGEtd2lkZ2V0LWlkIikpOwogICAgICAgIGNvbnNvbGUubG9nKCJQb2ludGVyIFBvc2l0aW9uOiIsIHsgeDogZTExLmNsaWVudFgsIHk6IGUxMS5jbGllbnRZIH0pOwogICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTsKICAgICAgICBjb25zdCBoYW5kbGVQb2ludGVyTW92ZSA9IChtb3ZlRXZlbnQpID0+IHsKICAgICAgICAgIGNvbnN0IHdpZGdldCA9IGUxMS50YXJnZXQuY2xvc2VzdCgiLndpZGdldCIpOwogICAgICAgICAgaWYgKHdpZGdldCkgewogICAgICAgICAgICBjb25zb2xlLmxvZyhgXHUyMTk0XHVGRTBGIFBvaW50ZXIgTW92ZTpgLCB7CiAgICAgICAgICAgICAgd2lkZ2V0SWQ6IHdpZGdldC5nZXRBdHRyaWJ1dGUoImRhdGEtd2lkZ2V0LWlkIiksCiAgICAgICAgICAgICAgcG9zaXRpb246IHsgeDogbW92ZUV2ZW50LmNsaWVudFgsIHk6IG1vdmVFdmVudC5jbGllbnRZIH0sCiAgICAgICAgICAgICAgZGVsdGE6IHsKICAgICAgICAgICAgICAgIHg6IG1vdmVFdmVudC5jbGllbnRYIC0gZTExLmNsaWVudFgsCiAgICAgICAgICAgICAgICB5OiBtb3ZlRXZlbnQuY2xpZW50WSAtIGUxMS5jbGllbnRZCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGNvbnN0IGhhbmRsZVBvaW50ZXJVcCA9ICgpID0+IHsKICAgICAgICAgIGNvbnNvbGUuZ3JvdXAoIlx1ezFGM0MxfSBJbnRlcmFjdGlvbiBFbmRlZCIpOwogICAgICAgICAgbG9nR3JpZFN0YXRlKCJGaW5hbCBTdGF0ZSBBZnRlciBJbnRlcmFjdGlvbiIpOwogICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpOwogICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCBoYW5kbGVQb2ludGVyTW92ZSk7CiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCBoYW5kbGVQb2ludGVyVXApOwogICAgICAgIH07CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCBoYW5kbGVQb2ludGVyTW92ZSk7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgaGFuZGxlUG9pbnRlclVwKTsKICAgICAgfQogICAgfSk7CiAgICBjb25zdCBvcmlnaW5hbEFkZFdpZGdldCA9IGdyaWQuYWRkV2lkZ2V0LmJpbmQoZ3JpZCk7CiAgICBncmlkLmFkZFdpZGdldCA9ICh3aWRnZXQsIGF1dG9Qb3NpdGlvbikgPT4gewogICAgICBjb25zb2xlLmdyb3VwKCJcdTI3OTUgQWRkaW5nIFdpZGdldCIpOwogICAgICBjb25zb2xlLmxvZygiTmV3IFdpZGdldDoiLCB3aWRnZXQpOwogICAgICBjb25zb2xlLmxvZygiQXV0byBQb3NpdGlvbjoiLCBhdXRvUG9zaXRpb24pOwogICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbEFkZFdpZGdldCh3aWRnZXQsIGF1dG9Qb3NpdGlvbik7CiAgICAgIGxvZ0dyaWRTdGF0ZSgiQWZ0ZXIgV2lkZ2V0IEFkZGVkIik7CiAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CiAgICBjb25zdCBvcmlnaW5hbENvbXBhY3QgPSBncmlkLmNvbXBhY3QuYmluZChncmlkKTsKICAgIGdyaWQuY29tcGFjdCA9IChkaXJlY3Rpb24pID0+IHsKICAgICAgY29uc29sZS5ncm91cCgiXHV7MUY1REN9XHVGRTBGIENvbXBhY3RpbmcgR3JpZCIpOwogICAgICBjb25zb2xlLmxvZygiRGlyZWN0aW9uOiIsIGRpcmVjdGlvbiB8fCAidmVydGljYWwiKTsKICAgICAgbG9nR3JpZFN0YXRlKCJCZWZvcmUgQ29tcGFjdCIpOwogICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbENvbXBhY3QoZGlyZWN0aW9uKTsKICAgICAgbG9nR3JpZFN0YXRlKCJBZnRlciBDb21wYWN0Iik7CiAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CiAgICB1cGRhdGVTdGF0dXMoKTsKICB9fT4KICAgICAgPHN0eWxlPgogICAgICAgICR7aWAKICAgICAgICAgIC5kZW1vQm94IHsKICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjMDkwOTBiIil9OwogICAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICBwYWRkaW5nOiA0MHB4OwogICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgICBnYXA6IDI0cHg7CiAgICAgICAgICB9CgogICAgICAgICAgLmRlbW8tY29udHJvbHMgewogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgICAgIGdhcDogMTJweDsKICAgICAgICAgIH0KCiAgICAgICAgICAuZGVtby1jb250cm9scyBkZWVzLWJ1dHRvbiB7CiAgICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgICAgfQoKICAgICAgICAgIC5ncmlkLWNvbnRhaW5lci13cmFwcGVyIHsKICAgICAgICAgICAgZmxleDogMTsKICAgICAgICAgICAgbWluLWhlaWdodDogNjAwcHg7CiAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgIH0KCiAgICAgICAgICAuaW5mbyB7CiAgICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjNzE3MTdhIil9OwogICAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAnR2Vpc3QgU2FucycsIHNhbnMtc2VyaWY7CiAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgICAgZ2FwOiA2cHg7CiAgICAgICAgICB9CgogICAgICAgICAgI2Rhc2hib2FyZExheW91dFN0YXR1cyB7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjNjBhNWZhIil9OwogICAgICAgICAgfQogICAgICAgIGB9CiAgICAgIDwvc3R5bGU+CiAgICAgIDxkaXYgY2xhc3M9ImRlbW9Cb3giPgogICAgICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udHJvbHMiPgogICAgICAgICAgPGRlZXMtYnV0dG9uLWdyb3VwIGxhYmVsPSJBbmltYXRpb246Ij4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPlRvZ2dsZSBBbmltYXRpb248L2RlZXMtYnV0dG9uPgogICAgICAgICAgPC9kZWVzLWJ1dHRvbi1ncm91cD4KCiAgICAgICAgICA8ZGVlcy1idXR0b24tZ3JvdXAgbGFiZWw9IkRpc3BsYXk6Ij4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPlRvZ2dsZSBHcmlkIExpbmVzPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgIDwvZGVlcy1idXR0b24tZ3JvdXA+CgogICAgICAgICAgPGRlZXMtYnV0dG9uLWdyb3VwIGxhYmVsPSJBY3Rpb25zOiI+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj5BZGQgV2lkZ2V0PC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPkNvbXBhY3QgR3JpZDwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj5SZXNldCBMYXlvdXQ8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPC9kZWVzLWJ1dHRvbi1ncm91cD4KCiAgICAgICAgICA8ZGVlcy1idXR0b24tZ3JvdXAgbGFiZWw9Ik1vZGU6Ij4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPlRvZ2dsZSBFZGl0IE1vZGU8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPC9kZWVzLWJ1dHRvbi1ncm91cD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iZ3JpZC1jb250YWluZXItd3JhcHBlciI+CiAgICAgICAgICA8ZGVlcy1kYXNoYm9hcmRncmlkIGlkPSJkYXNoYm9hcmRHcmlkIj48L2RlZXMtZGFzaGJvYXJkZ3JpZD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iaW5mbyI+CiAgICAgICAgICA8ZGl2PkRyYWcgdG8gcmVwb3NpdGlvbiwgcmVzaXplIGZyb20gaGFuZGxlcywgb3IgcmlnaHQtY2xpY2sgYSBoZWFkZXIgdG8gZGVsZXRlIGEgdGlsZS48L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9ImRhc2hib2FyZExheW91dFN0YXR1cyI+PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kZWVzLWRlbW93cmFwcGVyPgogIGA7Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbGF5b3V0L2RlZXMtZGFzaGJvYXJkZ3JpZC9zdHlsZXMuanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIGRhc2hib2FyZEdyaWRTdHlsZXMgPSBbCiAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogIGlgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuZ3JpZC1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtaW4taGVpZ2h0OiA0MDBweDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAuZ3JpZC13aWRnZXQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWxsLWNoYW5nZTogYXV0bzsKICAgICAgfQogICAgICAKICAgICAgOmhvc3QoW2VuYWJsZWFuaW1hdGlvbl0pIC5ncmlkLXdpZGdldCB7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICAgICAgfQoKICAgICAgLmdyaWQtd2lkZ2V0LmRyYWdnaW5nIHsKICAgICAgICB6LWluZGV4OiAxMDAwOwogICAgICAgIHRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgICAgY3Vyc29yOiBncmFiYmluZzsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CiAgICAgIAogICAgICAuZ3JpZC13aWRnZXQucGxhY2Vob2xkZXIgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KICAgICAgCiAgICAgIC5ncmlkLXdpZGdldC5wbGFjZWhvbGRlciAud2lkZ2V0LWNvbnRlbnQgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDU5LCAxMzAsIDI0NiwgMC4xKSIsICJyZ2JhKDU5LCAxMzAsIDI0NiwgMC4xKSIpfTsKICAgICAgICBib3JkZXI6IDJweCBkYXNoZWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICAgICAgICBib3gtc2hhZG93OiBub25lOwogICAgICB9CgogICAgICAuZ3JpZC13aWRnZXQucmVzaXppbmcgewogICAgICAgIHRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLndpZGdldC1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzA5MDkwYiIpfTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBib3gtc2hhZG93OiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xKSIsICIwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjMpIil9OwogICAgICAgIHRyYW5zaXRpb246IGJveC1zaGFkb3cgMC4ycyBlYXNlOwogICAgICB9CgogICAgICAuZ3JpZC13aWRnZXQ6aG92ZXIgLndpZGdldC1jb250ZW50IHsKICAgICAgICBib3gtc2hhZG93OiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiMCA0cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuMTUpIiwgIjAgNHB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjQpIil9OwogICAgICB9CgogICAgICAuZ3JpZC13aWRnZXQuZHJhZ2dpbmcgLndpZGdldC1jb250ZW50IHsKICAgICAgICBib3gtc2hhZG93OiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiMCAxNnB4IDQ4cHggcmdiYSgwLCAwLCAwLCAwLjI1KSIsICIwIDE2cHggNDhweCByZ2JhKDAsIDAsIDAsIDAuNikiKX07CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA1KTsKICAgICAgfQoKICAgICAgLndpZGdldC1oZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDEycHggMTZweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmOWZhZmIiLCAiIzBhMGEwYSIpfTsKICAgICAgICBjdXJzb3I6IGdyYWI7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KICAgICAgCiAgICAgIC53aWRnZXQtaGVhZGVyOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjMTgxODFiIil9OwogICAgICB9CiAgICAgIAogICAgICAud2lkZ2V0LWhlYWRlcjphY3RpdmUgewogICAgICAgIGN1cnNvcjogZ3JhYmJpbmc7CiAgICAgIH0KCiAgICAgIC53aWRnZXQtaGVhZGVyLmxvY2tlZCB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CiAgICAgIAogICAgICAud2lkZ2V0LWhlYWRlci5sb2NrZWQ6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjlmYWZiIiwgIiMwYTBhMGEiKX07CiAgICAgIH0KCiAgICAgIC53aWRnZXQtaGVhZGVyIGRlZXMtaWNvbiB7CiAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjNzE3MTdhIil9OwogICAgICB9CgogICAgICAud2lkZ2V0LWJvZHkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICAgIH0KCiAgICAgIC53aWRnZXQtYm9keS5oYXMtaGVhZGVyIHsKICAgICAgICB0b3A6IDQ1cHg7CiAgICAgIH0KCiAgICAgIC5yZXNpemUtaGFuZGxlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgei1pbmRleDogMTA7CiAgICAgIH0KCiAgICAgIC5yZXNpemUtaGFuZGxlOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjM2I4MmY2Iil9OwogICAgICAgIG9wYWNpdHk6IDAuMzsKICAgICAgfQoKICAgICAgLnJlc2l6ZS1oYW5kbGUtZSB7CiAgICAgICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICAgICAgd2lkdGg6IDEycHg7CiAgICAgICAgcmlnaHQ6IC02cHg7CiAgICAgICAgdG9wOiAxMCU7CiAgICAgICAgaGVpZ2h0OiA4MCU7CiAgICAgIH0KCiAgICAgIC5yZXNpemUtaGFuZGxlLXMgewogICAgICAgIGN1cnNvcjogbnMtcmVzaXplOwogICAgICAgIGhlaWdodDogMTJweDsKICAgICAgICB3aWR0aDogODAlOwogICAgICAgIGJvdHRvbTogLTZweDsKICAgICAgICBsZWZ0OiAxMCU7CiAgICAgIH0KCiAgICAgIC5yZXNpemUtaGFuZGxlLXNlIHsKICAgICAgICBjdXJzb3I6IHNlLXJlc2l6ZTsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgcmlnaHQ6IC0ycHg7CiAgICAgICAgYm90dG9tOiAtMnB4OwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2U7CiAgICAgIH0KICAgICAgCiAgICAgIC5yZXNpemUtaGFuZGxlLXNlOjphZnRlciB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiA0cHg7CiAgICAgICAgYm90dG9tOiA0cHg7CiAgICAgICAgd2lkdGg6IDZweDsKICAgICAgICBoZWlnaHQ6IDZweDsKICAgICAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjNzE3MTdhIil9OwogICAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjNzE3MTdhIil9OwogICAgICB9CgogICAgICAuZ3JpZC13aWRnZXQ6aG92ZXIgLnJlc2l6ZS1oYW5kbGUtc2UgewogICAgICAgIG9wYWNpdHk6IDAuNzsKICAgICAgfQoKICAgICAgLnJlc2l6ZS1oYW5kbGUtc2U6aG92ZXIgewogICAgICAgIG9wYWNpdHk6IDEgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnJlc2l6ZS1oYW5kbGUtc2U6aG92ZXI6OmFmdGVyIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiMzYjgyZjYiKX07CiAgICAgIH0KCiAgICAgIC5ncmlkLXBsYWNlaG9sZGVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICAgICAgICBvcGFjaXR5OiAwLjE7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIGJvcmRlcjogMnB4IGRhc2hlZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjM2I4MmY2Iil9OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiA0MDBweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiIzcxNzE3YSIpfTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgcGFkZGluZzogMzJweDsKICAgICAgfQoKICAgICAgLmVtcHR5LXN0YXRlIGRlZXMtaWNvbiB7CiAgICAgICAgZm9udC1zaXplOiA0OHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CiAgICAgIAogICAgICAuZ3JpZC1saW5lcyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICB6LWluZGV4OiAtMTsKICAgICAgfQogICAgICAKICAgICAgLmdyaWQtbGluZS12ZXJ0aWNhbCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgd2lkdGg6IDFweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgICAgIG9wYWNpdHk6IDAuMzsKICAgICAgfQogICAgICAKICAgICAgLmdyaWQtbGluZS1ob3Jpem9udGFsIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBoZWlnaHQ6IDFweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMjcyNzJhIil9OwogICAgICAgIG9wYWNpdHk6IDAuMzsKICAgICAgfQogIGAKXTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1kYXNoYm9hcmRncmlkL2xheW91dC5qcwp2YXIgREVGQVVMVF9NQVJHSU4gPSAxMDsKdmFyIHJlc29sdmVNYXJnaW5zID0gKG1hcmdpbikgPT4gewogIGlmICh0eXBlb2YgbWFyZ2luID09PSAibnVtYmVyIikgewogICAgcmV0dXJuIHsKICAgICAgaG9yaXpvbnRhbDogbWFyZ2luLAogICAgICB2ZXJ0aWNhbDogbWFyZ2luLAogICAgICB0b3A6IG1hcmdpbiwKICAgICAgcmlnaHQ6IG1hcmdpbiwKICAgICAgYm90dG9tOiBtYXJnaW4sCiAgICAgIGxlZnQ6IG1hcmdpbgogICAgfTsKICB9CiAgY29uc3QgcmVzb2x2ZWQyID0gewogICAgdG9wOiBtYXJnaW4udG9wID8/IERFRkFVTFRfTUFSR0lOLAogICAgcmlnaHQ6IG1hcmdpbi5yaWdodCA/PyBERUZBVUxUX01BUkdJTiwKICAgIGJvdHRvbTogbWFyZ2luLmJvdHRvbSA/PyBERUZBVUxUX01BUkdJTiwKICAgIGxlZnQ6IG1hcmdpbi5sZWZ0ID8/IERFRkFVTFRfTUFSR0lOCiAgfTsKICByZXR1cm4gewogICAgLi4ucmVzb2x2ZWQyLAogICAgaG9yaXpvbnRhbDogKHJlc29sdmVkMi5sZWZ0ICsgcmVzb2x2ZWQyLnJpZ2h0KSAvIDIsCiAgICB2ZXJ0aWNhbDogKHJlc29sdmVkMi50b3AgKyByZXNvbHZlZDIuYm90dG9tKSAvIDIKICB9Owp9Owp2YXIgY2FsY3VsYXRlQ2VsbE1ldHJpY3MgPSAoY29udGFpbmVyV2lkdGgsIGNvbHVtbnMsIG1hcmdpbnMsIGNlbGxIZWlnaHQsIGNlbGxIZWlnaHRVbml0KSA9PiB7CiAgY29uc3QgdG90YWxNYXJnaW5XaWR0aCA9IG1hcmdpbnMuaG9yaXpvbnRhbCAqIChjb2x1bW5zICsgMSk7CiAgY29uc3QgYXZhaWxhYmxlV2lkdGggPSBNYXRoLm1heChjb250YWluZXJXaWR0aCAtIHRvdGFsTWFyZ2luV2lkdGgsIDApOwogIGNvbnN0IGNlbGxXaWR0aFB4ID0gY29sdW1ucyA+IDAgPyBhdmFpbGFibGVXaWR0aCAvIGNvbHVtbnMgOiAwOwogIGNvbnN0IGNlbGxIZWlnaHRQeCA9IGNlbGxIZWlnaHRVbml0ID09PSAiYXV0byIgPyBjZWxsV2lkdGhQeCA6IGNlbGxIZWlnaHQ7CiAgcmV0dXJuIHsKICAgIGNvbnRhaW5lcldpZHRoLAogICAgY2VsbFdpZHRoUHgsCiAgICBtYXJnaW5Ib3Jpem9udGFsUHg6IG1hcmdpbnMuaG9yaXpvbnRhbCwKICAgIGNlbGxIZWlnaHRQeCwKICAgIG1hcmdpblZlcnRpY2FsUHg6IG1hcmdpbnMudmVydGljYWwKICB9Owp9Owp2YXIgY2FsY3VsYXRlR3JpZEhlaWdodCA9ICh3aWRnZXRzLCBtYXJnaW5zLCBjZWxsSGVpZ2h0KSA9PiB7CiAgaWYgKHdpZGdldHMubGVuZ3RoID09PSAwKQogICAgcmV0dXJuIDA7CiAgY29uc3QgbWF4WSA9IE1hdGgubWF4KC4uLndpZGdldHMubWFwKCh3aWRnZXQpID0+IHdpZGdldC55ICsgd2lkZ2V0LmgpLCAwKTsKICByZXR1cm4gbWF4WSAqIGNlbGxIZWlnaHQgKyAobWF4WSArIDEpICogbWFyZ2lucy52ZXJ0aWNhbDsKfTsKdmFyIG92ZXJsYXBzID0gKHdpZGdldCwgeDQsIHk1LCB3NCwgaDkpID0+IHg0IDwgd2lkZ2V0LnggKyB3aWRnZXQudyAmJiB4NCArIHc0ID4gd2lkZ2V0LnggJiYgeTUgPCB3aWRnZXQueSArIHdpZGdldC5oICYmIHk1ICsgaDkgPiB3aWRnZXQueTsKdmFyIGNvbGxlY3RDb2xsaXNpb25zID0gKHdpZGdldHMsIHRhcmdldCwgbmV4dFgsIG5leHRZLCBuZXh0VyA9IHRhcmdldC53LCBuZXh0SCA9IHRhcmdldC5oKSA9PiB7CiAgcmV0dXJuIHdpZGdldHMuZmlsdGVyKCh3aWRnZXQpID0+IHsKICAgIGlmICh3aWRnZXQuaWQgPT09IHRhcmdldC5pZCkKICAgICAgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIG92ZXJsYXBzKHdpZGdldCwgbmV4dFgsIG5leHRZLCBuZXh0VywgbmV4dEgpOwogIH0pOwp9Owp2YXIgY2hlY2tDb2xsaXNpb24gPSAod2lkZ2V0cywgdGFyZ2V0LCBuZXh0WCwgbmV4dFkpID0+IGNvbGxlY3RDb2xsaXNpb25zKHdpZGdldHMsIHRhcmdldCwgbmV4dFgsIG5leHRZKS5sZW5ndGggPiAwOwp2YXIgY2xvbmVXaWRnZXQgPSAod2lkZ2V0KSA9PiAoeyAuLi53aWRnZXQgfSk7CnZhciBjbG9uZVdpZGdldHMgPSAod2lkZ2V0cykgPT4gd2lkZ2V0cy5tYXAoY2xvbmVXaWRnZXQpOwp2YXIgZmluZEF2YWlsYWJsZVBvc2l0aW9uID0gKHdpZGdldHMsIHdpZHRoLCBoZWlnaHQsIGNvbHVtbnMpID0+IHsKICBmb3IgKGxldCB5NSA9IDA7IHk1IDwgMjAwOyB5NSsrKSB7CiAgICBmb3IgKGxldCB4NCA9IDA7IHg0IDw9IGNvbHVtbnMgLSB3aWR0aDsgeDQrKykgewogICAgICBjb25zdCBpc0ZyZWUgPSAhd2lkZ2V0cy5zb21lKCh3aWRnZXQpID0+IG92ZXJsYXBzKHdpZGdldCwgeDQsIHk1LCB3aWR0aCwgaGVpZ2h0KSk7CiAgICAgIGlmIChpc0ZyZWUpIHsKICAgICAgICByZXR1cm4geyB4OiB4NCwgeTogeTUgfTsKICAgICAgfQogICAgfQogIH0KICBjb25zdCBtYXhZID0gd2lkZ2V0cy5yZWR1Y2UoKGFjYywgd2lkZ2V0KSA9PiBNYXRoLm1heChhY2MsIHdpZGdldC55ICsgd2lkZ2V0LmgpLCAwKTsKICByZXR1cm4geyB4OiAwLCB5OiBtYXhZIH07Cn07CnZhciByZXNvbHZlV2lkZ2V0UGxhY2VtZW50ID0gKHdpZGdldHMsIHdpZGdldElkLCBuZXh0MiwgY29sdW1ucywgcHJldmlvdXNQb3NpdGlvbikgPT4gewogIGNvbnN0IHNvdXJjZVdpZGdldHMgPSBjbG9uZVdpZGdldHMod2lkZ2V0cyk7CiAgY29uc3QgbW92aW5nID0gc291cmNlV2lkZ2V0cy5maW5kKCh3aWRnZXQpID0+IHdpZGdldC5pZCA9PT0gd2lkZ2V0SWQpOwogIGNvbnN0IG9yaWdpbmFsID0gd2lkZ2V0cy5maW5kKCh3aWRnZXQpID0+IHdpZGdldC5pZCA9PT0gd2lkZ2V0SWQpOwogIGlmICghbW92aW5nIHx8ICFvcmlnaW5hbCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGNvbnN0IHRhcmdldCA9IHsKICAgIHg6IG5leHQyLngsCiAgICB5OiBuZXh0Mi55LAogICAgdzogbmV4dDIudyA/PyBtb3ZpbmcudywKICAgIGg6IG5leHQyLmggPz8gbW92aW5nLmgKICB9OwogIG1vdmluZy54ID0gdGFyZ2V0Lng7CiAgbW92aW5nLnkgPSB0YXJnZXQueTsKICBtb3ZpbmcudyA9IHRhcmdldC53OwogIG1vdmluZy5oID0gdGFyZ2V0Lmg7CiAgY29uc3QgY29sbGlzaW9ucyA9IGNvbGxlY3RDb2xsaXNpb25zKHNvdXJjZVdpZGdldHMsIG1vdmluZywgdGFyZ2V0LngsIHRhcmdldC55LCB0YXJnZXQudywgdGFyZ2V0LmgpOwogIGlmIChjb2xsaXNpb25zLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIHsgd2lkZ2V0czogc291cmNlV2lkZ2V0cywgbW92ZWRXaWRnZXRzOiBbbW92aW5nLmlkXSB9OwogIH0KICBpZiAoY29sbGlzaW9ucy5sZW5ndGggPT09IDEpIHsKICAgIGNvbnN0IG90aGVyID0gY29sbGlzaW9uc1swXTsKICAgIGlmICghb3RoZXIubG9ja2VkICYmICFvdGhlci5ub01vdmUgJiYgb3RoZXIudyA9PT0gbW92aW5nLncgJiYgb3RoZXIuaCA9PT0gbW92aW5nLmgpIHsKICAgICAgY29uc3Qgb3RoZXJDbG9uZSA9IHNvdXJjZVdpZGdldHMuZmluZCgod2lkZ2V0KSA9PiB3aWRnZXQuaWQgPT09IG90aGVyLmlkKTsKICAgICAgaWYgKG90aGVyQ2xvbmUpIHsKICAgICAgICBjb25zdCBzd2FwVGFyZ2V0ID0gb3JpZ2luYWw7CiAgICAgICAgY29uc3QgcHJldmlvdXNPdGhlclBvc2l0aW9uID0geyB4OiBvdGhlckNsb25lLngsIHk6IG90aGVyQ2xvbmUueSB9OwogICAgICAgIG90aGVyQ2xvbmUueCA9IHN3YXBUYXJnZXQueDsKICAgICAgICBvdGhlckNsb25lLnkgPSBzd2FwVGFyZ2V0Lnk7CiAgICAgICAgY29uc3Qgc3dhcFZhbGlkID0gY29sbGVjdENvbGxpc2lvbnMoc291cmNlV2lkZ2V0cywgbW92aW5nLCBtb3ZpbmcueCwgbW92aW5nLnksIG1vdmluZy53LCBtb3ZpbmcuaCkubGVuZ3RoID09PSAwICYmIGNvbGxlY3RDb2xsaXNpb25zKHNvdXJjZVdpZGdldHMsIG90aGVyQ2xvbmUsIG90aGVyQ2xvbmUueCwgb3RoZXJDbG9uZS55LCBvdGhlckNsb25lLncsIG90aGVyQ2xvbmUuaCkubGVuZ3RoID09PSAwOwogICAgICAgIGlmIChzd2FwVmFsaWQpIHsKICAgICAgICAgIHJldHVybiB7IHdpZGdldHM6IHNvdXJjZVdpZGdldHMsIG1vdmVkV2lkZ2V0czogW21vdmluZy5pZCwgb3RoZXJDbG9uZS5pZF0sIHN3YXBwZWRXaXRoOiBvdGhlckNsb25lLmlkIH07CiAgICAgICAgfQogICAgICAgIG90aGVyQ2xvbmUueCA9IHByZXZpb3VzT3RoZXJQb3NpdGlvbi54OwogICAgICAgIG90aGVyQ2xvbmUueSA9IHByZXZpb3VzT3RoZXJQb3NpdGlvbi55OwogICAgICB9CiAgICB9CiAgfQogIGNvbnN0IG1vdmVkSWRzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW21vdmluZy5pZF0pOwogIGZvciAoY29uc3Qgb2ZmZW5kaW5nIG9mIGNvbGxpc2lvbnMpIHsKICAgIGlmIChvZmZlbmRpbmcubG9ja2VkIHx8IG9mZmVuZGluZy5ub01vdmUpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBjbG9uZSA9IHNvdXJjZVdpZGdldHMuZmluZCgod2lkZ2V0KSA9PiB3aWRnZXQuaWQgPT09IG9mZmVuZGluZy5pZCk7CiAgICBpZiAoIWNsb25lKQogICAgICBjb250aW51ZTsKICAgIGNvbnN0IHJlbWFpbmluZyA9IHNvdXJjZVdpZGdldHMuZmlsdGVyKCh3aWRnZXQpID0+IHdpZGdldC5pZCAhPT0gb2ZmZW5kaW5nLmlkKTsKICAgIGNvbnN0IHBvc2l0aW9uMyA9IGZpbmRBdmFpbGFibGVQb3NpdGlvbihyZW1haW5pbmcsIGNsb25lLncsIGNsb25lLmgsIGNvbHVtbnMpOwogICAgY2xvbmUueCA9IHBvc2l0aW9uMy54OwogICAgY2xvbmUueSA9IHBvc2l0aW9uMy55OwogICAgbW92ZWRJZHMuYWRkKGNsb25lLmlkKTsKICB9CiAgY29uc3QgdmVyaWZ5ID0gY29sbGVjdENvbGxpc2lvbnMoc291cmNlV2lkZ2V0cywgbW92aW5nLCBtb3ZpbmcueCwgbW92aW5nLnksIG1vdmluZy53LCBtb3ZpbmcuaCk7CiAgaWYgKHZlcmlmeS5sZW5ndGggPiAwKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgcmV0dXJuIHsgd2lkZ2V0czogc291cmNlV2lkZ2V0cywgbW92ZWRXaWRnZXRzOiBBcnJheS5mcm9tKG1vdmVkSWRzKSB9Owp9Owp2YXIgY29tcGFjdExheW91dCA9ICh3aWRnZXRzLCBkaXJlY3Rpb24gPSAidmVydGljYWwiKSA9PiB7CiAgY29uc3Qgc29ydGVkID0gWy4uLndpZGdldHNdLnNvcnQoKGE1LCBiNikgPT4gewogICAgaWYgKGRpcmVjdGlvbiA9PT0gInZlcnRpY2FsIikgewogICAgICBpZiAoYTUueSAhPT0gYjYueSkKICAgICAgICByZXR1cm4gYTUueSAtIGI2Lnk7CiAgICAgIHJldHVybiBhNS54IC0gYjYueDsKICAgIH0KICAgIGlmIChhNS54ICE9PSBiNi54KQogICAgICByZXR1cm4gYTUueCAtIGI2Lng7CiAgICByZXR1cm4gYTUueSAtIGI2Lnk7CiAgfSk7CiAgZm9yIChjb25zdCB3aWRnZXQgb2Ygc29ydGVkKSB7CiAgICBpZiAod2lkZ2V0LmxvY2tlZCB8fCB3aWRnZXQubm9Nb3ZlKQogICAgICBjb250aW51ZTsKICAgIGlmIChkaXJlY3Rpb24gPT09ICJ2ZXJ0aWNhbCIpIHsKICAgICAgd2hpbGUgKHdpZGdldC55ID4gMCAmJiAhY2hlY2tDb2xsaXNpb24od2lkZ2V0cywgd2lkZ2V0LCB3aWRnZXQueCwgd2lkZ2V0LnkgLSAxKSkgewogICAgICAgIHdpZGdldC55IC09IDE7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHdoaWxlICh3aWRnZXQueCA+IDAgJiYgIWNoZWNrQ29sbGlzaW9uKHdpZGdldHMsIHdpZGdldCwgd2lkZ2V0LnggLSAxLCB3aWRnZXQueSkpIHsKICAgICAgICB3aWRnZXQueCAtPSAxOwogICAgICB9CiAgICB9CiAgfQp9Owp2YXIgYXBwbHlMYXlvdXQgPSAod2lkZ2V0cywgbGF5b3V0KSA9PiB7CiAgcmV0dXJuIHdpZGdldHMubWFwKCh3aWRnZXQpID0+IHsKICAgIGNvbnN0IGxheW91dEl0ZW0gPSBsYXlvdXQuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gd2lkZ2V0LmlkKTsKICAgIHJldHVybiBsYXlvdXRJdGVtID8geyAuLi53aWRnZXQsIC4uLmxheW91dEl0ZW0gfSA6IHdpZGdldDsKICB9KTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1kYXNoYm9hcmRncmlkL2ludGVyYWN0aW9uLmpzCnZhciBjb21wdXRlR3JpZENvb3JkaW5hdGVzID0gKHsgcG9pbnRlciwgY29udGFpbmVyUmVjdCwgbWV0cmljcywgY29sdW1ucywgd2lkZ2V0LCBydGwsIGRyYWdPZmZzZXRYID0gMCwgZHJhZ09mZnNldFkgPSAwIH0pID0+IHsKICBjb25zdCByZWxhdGl2ZVggPSBwb2ludGVyLmNsaWVudFggLSBjb250YWluZXJSZWN0LmxlZnQgLSBkcmFnT2Zmc2V0WDsKICBjb25zdCByZWxhdGl2ZVkgPSBwb2ludGVyLmNsaWVudFkgLSBjb250YWluZXJSZWN0LnRvcCAtIGRyYWdPZmZzZXRZOwogIGNvbnN0IG1hcmdpblggPSBtZXRyaWNzLm1hcmdpbkhvcml6b250YWxQeDsKICBjb25zdCBtYXJnaW5ZID0gbWV0cmljcy5tYXJnaW5WZXJ0aWNhbFB4OwogIGNvbnN0IGNlbGxXaWR0aCA9IG1ldHJpY3MuY2VsbFdpZHRoUHg7CiAgY29uc3QgY2VsbEhlaWdodCA9IG1ldHJpY3MuY2VsbEhlaWdodFB4OwogIGNvbnN0IGNsYW1wMyA9ICh2YWx1ZTIsIG1pbjMsIG1heDMpID0+IE1hdGgubWF4KG1pbjMsIE1hdGgubWluKG1heDMsIHZhbHVlMikpOwogIGNvbnN0IGFkanVzdGVkWCA9IGNsYW1wMyhyZWxhdGl2ZVggLSBtYXJnaW5YLCAwLCBjb250YWluZXJSZWN0LndpZHRoIC0gbWFyZ2luWCk7CiAgY29uc3QgYWRqdXN0ZWRZID0gY2xhbXAzKHJlbGF0aXZlWSAtIG1hcmdpblksIDAsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7CiAgY29uc3QgY2VsbFBsdXNNYXJnaW5YID0gY2VsbFdpZHRoICsgbWFyZ2luWDsKICBjb25zdCBjZWxsUGx1c01hcmdpblkgPSBjZWxsSGVpZ2h0ICsgbWFyZ2luWTsKICBsZXQgZ3JpZFggPSBNYXRoLnJvdW5kKGFkanVzdGVkWCAvIGNlbGxQbHVzTWFyZ2luWCk7CiAgaWYgKHJ0bCkgewogICAgZ3JpZFggPSBjb2x1bW5zIC0gd2lkZ2V0LncgLSBncmlkWDsKICB9CiAgZ3JpZFggPSBjbGFtcDMoZ3JpZFgsIDAsIGNvbHVtbnMgLSB3aWRnZXQudyk7CiAgY29uc3QgZ3JpZFkgPSBjbGFtcDMoTWF0aC5yb3VuZChhZGp1c3RlZFkgLyBjZWxsUGx1c01hcmdpblkpLCAwLCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7CiAgcmV0dXJuIHsgeDogZ3JpZFgsIHk6IGdyaWRZIH07Cn07CnZhciBjb21wdXRlUmVzaXplRGltZW5zaW9ucyA9ICh7IHBvaW50ZXIsIGNvbnRhaW5lclJlY3QsIG1ldHJpY3MsIHN0YXJ0V2lkdGgsIHN0YXJ0SGVpZ2h0LCBzdGFydFBvaW50ZXIsIGhhbmRsZXI6IGhhbmRsZXIyLCB3aWRnZXQsIGNvbHVtbnMgfSkgPT4gewogIGNvbnN0IGRlbHRhWCA9IHBvaW50ZXIuY2xpZW50WCAtIHN0YXJ0UG9pbnRlci5jbGllbnRYOwogIGNvbnN0IGRlbHRhWSA9IHBvaW50ZXIuY2xpZW50WSAtIHN0YXJ0UG9pbnRlci5jbGllbnRZOwogIGxldCB3aWR0aCA9IHN0YXJ0V2lkdGg7CiAgbGV0IGhlaWdodCA9IHN0YXJ0SGVpZ2h0OwogIGNvbnN0IGNlbGxQbHVzTWFyZ2luWCA9IG1ldHJpY3MuY2VsbFdpZHRoUHggKyBtZXRyaWNzLm1hcmdpbkhvcml6b250YWxQeDsKICBjb25zdCBjZWxsUGx1c01hcmdpblkgPSBtZXRyaWNzLmNlbGxIZWlnaHRQeCArIG1ldHJpY3MubWFyZ2luVmVydGljYWxQeDsKICBpZiAoaGFuZGxlcjIuaW5jbHVkZXMoImUiKSkgewogICAgY29uc3QgZGVsdGFDb2xzID0gTWF0aC5yb3VuZChkZWx0YVggLyBjZWxsUGx1c01hcmdpblgpOwogICAgd2lkdGggPSBzdGFydFdpZHRoICsgZGVsdGFDb2xzOwogIH0KICBpZiAoaGFuZGxlcjIuaW5jbHVkZXMoInMiKSkgewogICAgY29uc3QgZGVsdGFSb3dzID0gTWF0aC5yb3VuZChkZWx0YVkgLyBjZWxsUGx1c01hcmdpblkpOwogICAgaGVpZ2h0ID0gc3RhcnRIZWlnaHQgKyBkZWx0YVJvd3M7CiAgfQogIGNvbnN0IGNsYW1wZWRXaWR0aCA9IE1hdGgubWF4KHdpZGdldC5taW5XIHx8IDEsIE1hdGgubWluKHdpZHRoLCB3aWRnZXQubWF4VyB8fCBjb2x1bW5zIC0gd2lkZ2V0LngpKTsKICBjb25zdCBjbGFtcGVkSGVpZ2h0ID0gTWF0aC5tYXgod2lkZ2V0Lm1pbkggfHwgMSwgTWF0aC5taW4oaGVpZ2h0LCB3aWRnZXQubWF4SCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikpOwogIHJldHVybiB7CiAgICB3aWR0aDogY2xhbXBlZFdpZHRoLAogICAgaGVpZ2h0OiBjbGFtcGVkSGVpZ2h0CiAgfTsKfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1kYXNoYm9hcmRncmlkL2NvbnRleHRtZW51LmpzCnZhciBvcGVuV2lkZ2V0Q29udGV4dE1lbnUgPSAoeyB3aWRnZXQsIGhvc3QsIGV2ZW50IH0pID0+IHsKICBjb25zdCBpdGVtcyA9IFsKICAgIHsKICAgICAgbmFtZTogIkRlbGV0ZSB0aWxlIiwKICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6dHJhc2gyIiwKICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgaG9zdC5yZW1vdmVXaWRnZXQod2lkZ2V0LmlkKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogIF07CiAgRGVlc0NvbnRleHRtZW51Lm9wZW5Db250ZXh0TWVudVdpdGhPcHRpb25zKGV2ZW50LCBpdGVtcyk7Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbGF5b3V0L2RlZXMtZGFzaGJvYXJkZ3JpZC9kZWVzLWRhc2hib2FyZGdyaWQuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF9kZWVzX2ljb24oKTsKdmFyIF9fZXNEZWNvcmF0ZTcwID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM3MSA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0Rhc2hib2FyZGdyaWQgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtZGFzaGJvYXJkZ3JpZCIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3dpZGdldHNfZGVjb3JhdG9yczsKICBsZXQgX3dpZGdldHNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF93aWRnZXRzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jZWxsSGVpZ2h0X2RlY29yYXRvcnM7CiAgbGV0IF9jZWxsSGVpZ2h0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2VsbEhlaWdodF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWFyZ2luX2RlY29yYXRvcnM7CiAgbGV0IF9tYXJnaW5faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYXJnaW5fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbHVtbnNfZGVjb3JhdG9yczsKICBsZXQgX2NvbHVtbnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb2x1bW5zX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lZGl0YWJsZV9kZWNvcmF0b3JzOwogIGxldCBfZWRpdGFibGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lZGl0YWJsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZW5hYmxlQW5pbWF0aW9uX2RlY29yYXRvcnM7CiAgbGV0IF9lbmFibGVBbmltYXRpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lbmFibGVBbmltYXRpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NlbGxIZWlnaHRVbml0X2RlY29yYXRvcnM7CiAgbGV0IF9jZWxsSGVpZ2h0VW5pdF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NlbGxIZWlnaHRVbml0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9ydGxfZGVjb3JhdG9yczsKICBsZXQgX3J0bF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3J0bF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0dyaWRMaW5lc19kZWNvcmF0b3JzOwogIGxldCBfc2hvd0dyaWRMaW5lc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dHcmlkTGluZXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xheW91dHNfZGVjb3JhdG9yczsKICBsZXQgX2xheW91dHNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sYXlvdXRzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY3RpdmVCcmVha3BvaW50X2RlY29yYXRvcnM7CiAgbGV0IF9hY3RpdmVCcmVha3BvaW50X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWN0aXZlQnJlYWtwb2ludF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcGxhY2Vob2xkZXJQb3NpdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfcGxhY2Vob2xkZXJQb3NpdGlvbl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BsYWNlaG9sZGVyUG9zaXRpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21ldHJpY3NfZGVjb3JhdG9yczsKICBsZXQgX21ldHJpY3NfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tZXRyaWNzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZXNvbHZlZE1hcmdpbnNfZGVjb3JhdG9yczsKICBsZXQgX3Jlc29sdmVkTWFyZ2luc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Jlc29sdmVkTWFyZ2luc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcHJldmlld1dpZGdldHNfZGVjb3JhdG9yczsKICBsZXQgX3ByZXZpZXdXaWRnZXRzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcHJldmlld1dpZGdldHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0Rhc2hib2FyZGdyaWQyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfd2lkZ2V0c19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfY2VsbEhlaWdodF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX21hcmdpbl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogT2JqZWN0IH0pXTsKICAgICAgX2NvbHVtbnNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF9lZGl0YWJsZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9lbmFibGVBbmltYXRpb25fZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSldOwogICAgICBfY2VsbEhlaWdodFVuaXRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9ydGxfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfc2hvd0dyaWRMaW5lc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9sYXlvdXRzX2RlY29yYXRvcnMgPSBbbjUoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXTsKICAgICAgX2FjdGl2ZUJyZWFrcG9pbnRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9wbGFjZWhvbGRlclBvc2l0aW9uX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9tZXRyaWNzX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9yZXNvbHZlZE1hcmdpbnNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3ByZXZpZXdXaWRnZXRzX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTcwKHRoaXMsIG51bGwsIF93aWRnZXRzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIndpZGdldHMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIndpZGdldHMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoud2lkZ2V0cywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoud2lkZ2V0cyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF93aWRnZXRzX2luaXRpYWxpemVycywgX3dpZGdldHNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3MCh0aGlzLCBudWxsLCBfY2VsbEhlaWdodF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjZWxsSGVpZ2h0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjZWxsSGVpZ2h0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNlbGxIZWlnaHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNlbGxIZWlnaHQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY2VsbEhlaWdodF9pbml0aWFsaXplcnMsIF9jZWxsSGVpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzAodGhpcywgbnVsbCwgX21hcmdpbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtYXJnaW4iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1hcmdpbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYXJnaW4sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1hcmdpbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tYXJnaW5faW5pdGlhbGl6ZXJzLCBfbWFyZ2luX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzAodGhpcywgbnVsbCwgX2NvbHVtbnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29sdW1ucyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29sdW1ucyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jb2x1bW5zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jb2x1bW5zID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbHVtbnNfaW5pdGlhbGl6ZXJzLCBfY29sdW1uc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcwKHRoaXMsIG51bGwsIF9lZGl0YWJsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJlZGl0YWJsZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZWRpdGFibGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZWRpdGFibGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmVkaXRhYmxlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2VkaXRhYmxlX2luaXRpYWxpemVycywgX2VkaXRhYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzAodGhpcywgbnVsbCwgX2VuYWJsZUFuaW1hdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJlbmFibGVBbmltYXRpb24iLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImVuYWJsZUFuaW1hdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5lbmFibGVBbmltYXRpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmVuYWJsZUFuaW1hdGlvbiA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9lbmFibGVBbmltYXRpb25faW5pdGlhbGl6ZXJzLCBfZW5hYmxlQW5pbWF0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzAodGhpcywgbnVsbCwgX2NlbGxIZWlnaHRVbml0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNlbGxIZWlnaHRVbml0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjZWxsSGVpZ2h0VW5pdCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jZWxsSGVpZ2h0VW5pdCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY2VsbEhlaWdodFVuaXQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY2VsbEhlaWdodFVuaXRfaW5pdGlhbGl6ZXJzLCBfY2VsbEhlaWdodFVuaXRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3MCh0aGlzLCBudWxsLCBfcnRsX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJ0bCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicnRsIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJ0bCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucnRsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3J0bF9pbml0aWFsaXplcnMsIF9ydGxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3MCh0aGlzLCBudWxsLCBfc2hvd0dyaWRMaW5lc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93R3JpZExpbmVzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93R3JpZExpbmVzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dHcmlkTGluZXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dHcmlkTGluZXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd0dyaWRMaW5lc19pbml0aWFsaXplcnMsIF9zaG93R3JpZExpbmVzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzAodGhpcywgbnVsbCwgX2xheW91dHNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibGF5b3V0cyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibGF5b3V0cyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sYXlvdXRzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5sYXlvdXRzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xheW91dHNfaW5pdGlhbGl6ZXJzLCBfbGF5b3V0c19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcwKHRoaXMsIG51bGwsIF9hY3RpdmVCcmVha3BvaW50X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFjdGl2ZUJyZWFrcG9pbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFjdGl2ZUJyZWFrcG9pbnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYWN0aXZlQnJlYWtwb2ludCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYWN0aXZlQnJlYWtwb2ludCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hY3RpdmVCcmVha3BvaW50X2luaXRpYWxpemVycywgX2FjdGl2ZUJyZWFrcG9pbnRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3MCh0aGlzLCBudWxsLCBfcGxhY2Vob2xkZXJQb3NpdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwbGFjZWhvbGRlclBvc2l0aW9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJwbGFjZWhvbGRlclBvc2l0aW9uIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnBsYWNlaG9sZGVyUG9zaXRpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnBsYWNlaG9sZGVyUG9zaXRpb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcGxhY2Vob2xkZXJQb3NpdGlvbl9pbml0aWFsaXplcnMsIF9wbGFjZWhvbGRlclBvc2l0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzAodGhpcywgbnVsbCwgX21ldHJpY3NfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWV0cmljcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWV0cmljcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tZXRyaWNzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tZXRyaWNzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21ldHJpY3NfaW5pdGlhbGl6ZXJzLCBfbWV0cmljc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcwKHRoaXMsIG51bGwsIF9yZXNvbHZlZE1hcmdpbnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicmVzb2x2ZWRNYXJnaW5zIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJyZXNvbHZlZE1hcmdpbnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucmVzb2x2ZWRNYXJnaW5zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yZXNvbHZlZE1hcmdpbnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcmVzb2x2ZWRNYXJnaW5zX2luaXRpYWxpemVycywgX3Jlc29sdmVkTWFyZ2luc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcwKHRoaXMsIG51bGwsIF9wcmV2aWV3V2lkZ2V0c19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJwcmV2aWV3V2lkZ2V0cyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicHJldmlld1dpZGdldHMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucHJldmlld1dpZGdldHMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnByZXZpZXdXaWRnZXRzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ByZXZpZXdXaWRnZXRzX2luaXRpYWxpemVycywgX3ByZXZpZXdXaWRnZXRzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzAobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzRGFzaGJvYXJkZ3JpZDIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzQ3OwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIkxheW91dCJdOwogICAgc3RhdGljIHN0eWxlcyA9IGRhc2hib2FyZEdyaWRTdHlsZXM7CiAgICAjd2lkZ2V0c19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM3MSh0aGlzLCBfd2lkZ2V0c19pbml0aWFsaXplcnMsIFtdKTsKICAgIGdldCB3aWRnZXRzKCkgewogICAgICByZXR1cm4gdGhpcy4jd2lkZ2V0c19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHdpZGdldHModmFsdWUyKSB7CiAgICAgIHRoaXMuI3dpZGdldHNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjZWxsSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3MSh0aGlzLCBfd2lkZ2V0c19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX2NlbGxIZWlnaHRfaW5pdGlhbGl6ZXJzLCA4MCkpOwogICAgZ2V0IGNlbGxIZWlnaHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjZWxsSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY2VsbEhlaWdodCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY2VsbEhlaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21hcmdpbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX2NlbGxIZWlnaHRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczcxKHRoaXMsIF9tYXJnaW5faW5pdGlhbGl6ZXJzLCAxMCkpOwogICAgZ2V0IG1hcmdpbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI21hcmdpbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1hcmdpbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWFyZ2luX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29sdW1uc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX21hcmdpbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX2NvbHVtbnNfaW5pdGlhbGl6ZXJzLCAxMikpOwogICAgZ2V0IGNvbHVtbnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb2x1bW5zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29sdW1ucyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29sdW1uc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2VkaXRhYmxlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3MSh0aGlzLCBfY29sdW1uc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX2VkaXRhYmxlX2luaXRpYWxpemVycywgdHJ1ZSkpOwogICAgZ2V0IGVkaXRhYmxlKCkgewogICAgICByZXR1cm4gdGhpcy4jZWRpdGFibGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBlZGl0YWJsZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZWRpdGFibGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNlbmFibGVBbmltYXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczcxKHRoaXMsIF9lZGl0YWJsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX2VuYWJsZUFuaW1hdGlvbl9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBlbmFibGVBbmltYXRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNlbmFibGVBbmltYXRpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBlbmFibGVBbmltYXRpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI2VuYWJsZUFuaW1hdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NlbGxIZWlnaHRVbml0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3MSh0aGlzLCBfZW5hYmxlQW5pbWF0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3MSh0aGlzLCBfY2VsbEhlaWdodFVuaXRfaW5pdGlhbGl6ZXJzLCAicHgiKSk7CiAgICBnZXQgY2VsbEhlaWdodFVuaXQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjZWxsSGVpZ2h0VW5pdF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGNlbGxIZWlnaHRVbml0KHZhbHVlMikgewogICAgICB0aGlzLiNjZWxsSGVpZ2h0VW5pdF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3J0bF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX2NlbGxIZWlnaHRVbml0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3MSh0aGlzLCBfcnRsX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBydGwoKSB7CiAgICAgIHJldHVybiB0aGlzLiNydGxfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBydGwodmFsdWUyKSB7CiAgICAgIHRoaXMuI3J0bF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dHcmlkTGluZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczcxKHRoaXMsIF9ydGxfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczcxKHRoaXMsIF9zaG93R3JpZExpbmVzX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBzaG93R3JpZExpbmVzKCkgewogICAgICByZXR1cm4gdGhpcy4jc2hvd0dyaWRMaW5lc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dHcmlkTGluZXModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dHcmlkTGluZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsYXlvdXRzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3MSh0aGlzLCBfc2hvd0dyaWRMaW5lc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX2xheW91dHNfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCBsYXlvdXRzKCkgewogICAgICByZXR1cm4gdGhpcy4jbGF5b3V0c19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxheW91dHModmFsdWUyKSB7CiAgICAgIHRoaXMuI2xheW91dHNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhY3RpdmVCcmVha3BvaW50X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3MSh0aGlzLCBfbGF5b3V0c19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX2FjdGl2ZUJyZWFrcG9pbnRfaW5pdGlhbGl6ZXJzLCAiYmFzZSIpKTsKICAgIGdldCBhY3RpdmVCcmVha3BvaW50KCkgewogICAgICByZXR1cm4gdGhpcy4jYWN0aXZlQnJlYWtwb2ludF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFjdGl2ZUJyZWFrcG9pbnQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2FjdGl2ZUJyZWFrcG9pbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNwbGFjZWhvbGRlclBvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3MSh0aGlzLCBfYWN0aXZlQnJlYWtwb2ludF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX3BsYWNlaG9sZGVyUG9zaXRpb25faW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICBnZXQgcGxhY2Vob2xkZXJQb3NpdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3BsYWNlaG9sZGVyUG9zaXRpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwbGFjZWhvbGRlclBvc2l0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNwbGFjZWhvbGRlclBvc2l0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbWV0cmljc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX3BsYWNlaG9sZGVyUG9zaXRpb25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczcxKHRoaXMsIF9tZXRyaWNzX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IG1ldHJpY3MoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtZXRyaWNzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbWV0cmljcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWV0cmljc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Jlc29sdmVkTWFyZ2luc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX21ldHJpY3NfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczcxKHRoaXMsIF9yZXNvbHZlZE1hcmdpbnNfaW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICBnZXQgcmVzb2x2ZWRNYXJnaW5zKCkgewogICAgICByZXR1cm4gdGhpcy4jcmVzb2x2ZWRNYXJnaW5zX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcmVzb2x2ZWRNYXJnaW5zKHZhbHVlMikgewogICAgICB0aGlzLiNyZXNvbHZlZE1hcmdpbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNwcmV2aWV3V2lkZ2V0c19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX3Jlc29sdmVkTWFyZ2luc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzEodGhpcywgX3ByZXZpZXdXaWRnZXRzX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IHByZXZpZXdXaWRnZXRzKCkgewogICAgICByZXR1cm4gdGhpcy4jcHJldmlld1dpZGdldHNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwcmV2aWV3V2lkZ2V0cyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcHJldmlld1dpZGdldHNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGNvbnRhaW5lckJvdW5kcyA9IChfX3J1bkluaXRpYWxpemVyczcxKHRoaXMsIF9wcmV2aWV3V2lkZ2V0c19leHRyYUluaXRpYWxpemVycyksIG51bGwpOwogICAgZHJhZ1N0YXRlID0gbnVsbDsKICAgIHJlc2l6ZVN0YXRlID0gbnVsbDsKICAgIHJlc2l6ZU9ic2VydmVyOwogICAgaW50ZXJhY3Rpb25BY3RpdmUgPSBmYWxzZTsKICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLmNvbXB1dGVNZXRyaWNzKCk7CiAgICAgIHRoaXMub2JzZXJ2ZVJlc2l6ZSgpOwogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuZGlzY29ubmVjdFJlc2l6ZU9ic2VydmVyKCk7CiAgICAgIHRoaXMucmVsZWFzZVBvaW50ZXJFdmVudHMoKTsKICAgIH0KICAgIHVwZGF0ZWQoY2hhbmdlZCkgewogICAgICBpZiAoY2hhbmdlZC5oYXMoIm1hcmdpbiIpIHx8IGNoYW5nZWQuaGFzKCJjb2x1bW5zIikgfHwgY2hhbmdlZC5oYXMoImNlbGxIZWlnaHQiKSB8fCBjaGFuZ2VkLmhhcygiY2VsbEhlaWdodFVuaXQiKSkgewogICAgICAgIHRoaXMuY29tcHV0ZU1ldHJpY3MoKTsKICAgICAgfQogICAgICBpZiAoY2hhbmdlZC5oYXMoIndpZGdldHMiKSAmJiAhdGhpcy5pbnRlcmFjdGlvbkFjdGl2ZSkgewogICAgICAgIHRoaXMubm90aWZ5TGF5b3V0Q2hhbmdlKCk7CiAgICAgIH0KICAgIH0KICAgIHJlbmRlcigpIHsKICAgICAgY29uc3QgYmFzZVdpZGdldHMgPSB0aGlzLndpZGdldHM7CiAgICAgIGlmIChiYXNlV2lkZ2V0cy5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiPgogICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6bGF5b3V0R3JpZCJ9PjwvZGVlcy1pY29uPgogICAgICAgICAgPGRpdj5ObyB3aWRnZXRzIGNvbmZpZ3VyZWQ8L2Rpdj4KICAgICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZTogMTRweDsgbWFyZ2luLXRvcDogOHB4OyI+QWRkIHdpZGdldHMgdG8gcG9wdWxhdGUgdGhlIGRhc2hib2FyZDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgICB9CiAgICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLmVuc3VyZU1ldHJpY3MoKTsKICAgICAgY29uc3QgbWFyZ2lucyA9IHRoaXMucmVzb2x2ZWRNYXJnaW5zID8/IHJlc29sdmVNYXJnaW5zKHRoaXMubWFyZ2luKTsKICAgICAgY29uc3QgY2VsbEhlaWdodCA9IG1ldHJpY3MuY2VsbEhlaWdodFB4OwogICAgICBjb25zdCBsYXlvdXRGb3JIZWlnaHQgPSB0aGlzLnByZXZpZXdXaWRnZXRzID8/IHRoaXMud2lkZ2V0czsKICAgICAgY29uc3QgZ3JpZEhlaWdodCA9IGNhbGN1bGF0ZUdyaWRIZWlnaHQobGF5b3V0Rm9ySGVpZ2h0LCBtYXJnaW5zLCBjZWxsSGVpZ2h0KTsKICAgICAgY29uc3QgcHJldmlld01hcCA9IHRoaXMucHJldmlld1dpZGdldHMgPyBuZXcgTWFwKHRoaXMucHJldmlld1dpZGdldHMubWFwKCh3aWRnZXQpID0+IFt3aWRnZXQuaWQsIHdpZGdldF0pKSA6IG51bGw7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iZ3JpZC1jb250YWluZXIiIHN0eWxlPSJoZWlnaHQ6ICR7Z3JpZEhlaWdodH1weDsiPgogICAgICAgICR7dGhpcy5zaG93R3JpZExpbmVzID8gdGhpcy5yZW5kZXJHcmlkTGluZXMobWV0cmljcywgZ3JpZEhlaWdodCkgOiBudWxsfQogICAgICAgICR7YmFzZVdpZGdldHMubWFwKCh3aWRnZXQpID0+IHRoaXMucmVuZGVyV2lkZ2V0KHdpZGdldCwgbWV0cmljcywgbWFyZ2lucywgcHJldmlld01hcCkpfQogICAgICAgICR7dGhpcy5wbGFjZWhvbGRlclBvc2l0aW9uID8gdGhpcy5yZW5kZXJQbGFjZWhvbGRlcihtZXRyaWNzLCBtYXJnaW5zKSA6IG51bGx9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlckdyaWRMaW5lcyhtZXRyaWNzLCBncmlkSGVpZ2h0KSB7CiAgICAgIGNvbnN0IHZlcnRpY2FsID0gW107CiAgICAgIGNvbnN0IGhvcml6b250YWwgPSBbXTsKICAgICAgY29uc3QgY2VsbFBsdXNNYXJnaW5YID0gbWV0cmljcy5jZWxsV2lkdGhQeCArIG1ldHJpY3MubWFyZ2luSG9yaXpvbnRhbFB4OwogICAgICBjb25zdCBjZWxsUGx1c01hcmdpblkgPSBtZXRyaWNzLmNlbGxIZWlnaHRQeCArIG1ldHJpY3MubWFyZ2luVmVydGljYWxQeDsKICAgICAgZm9yIChsZXQgaTExID0gMDsgaTExIDw9IHRoaXMuY29sdW1uczsgaTExKyspIHsKICAgICAgICBjb25zdCBsZWZ0UHggPSBpMTEgKiBjZWxsUGx1c01hcmdpblggKyBtZXRyaWNzLm1hcmdpbkhvcml6b250YWxQeDsKICAgICAgICBjb25zdCBsZWZ0UGVyY2VudCA9IHRoaXMucHhUb1BlcmNlbnQobGVmdFB4LCBtZXRyaWNzLmNvbnRhaW5lcldpZHRoKTsKICAgICAgICB2ZXJ0aWNhbC5wdXNoKGIyYDxkaXYgY2xhc3M9ImdyaWQtbGluZS12ZXJ0aWNhbCIgc3R5bGU9ImxlZnQ6ICR7bGVmdFBlcmNlbnR9JTsiPjwvZGl2PmApOwogICAgICB9CiAgICAgIGNvbnN0IHJvd3MgPSBNYXRoLmNlaWwoZ3JpZEhlaWdodCAvIGNlbGxQbHVzTWFyZ2luWSk7CiAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8PSByb3dzOyByb3crKykgewogICAgICAgIGNvbnN0IHRvcCA9IHJvdyAqIGNlbGxQbHVzTWFyZ2luWTsKICAgICAgICBob3Jpem9udGFsLnB1c2goYjJgPGRpdiBjbGFzcz0iZ3JpZC1saW5lLWhvcml6b250YWwiIHN0eWxlPSJ0b3A6ICR7dG9wfXB4OyI+PC9kaXY+YCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJncmlkLWxpbmVzIj4KICAgICAgICAke3ZlcnRpY2FsfQogICAgICAgICR7aG9yaXpvbnRhbH0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgcmVuZGVyV2lkZ2V0KHdpZGdldCwgbWV0cmljcywgbWFyZ2lucywgcHJldmlld01hcCkgewogICAgICBjb25zdCBpc0RyYWdnaW5nID0gdGhpcy5kcmFnU3RhdGU/LndpZGdldElkID09PSB3aWRnZXQuaWQ7CiAgICAgIGNvbnN0IGlzUmVzaXppbmcgPSB0aGlzLnJlc2l6ZVN0YXRlPy53aWRnZXRJZCA9PT0gd2lkZ2V0LmlkOwogICAgICBjb25zdCBpc0xvY2tlZCA9IHdpZGdldC5sb2NrZWQgfHwgIXRoaXMuZWRpdGFibGU7CiAgICAgIGNvbnN0IHByZXZpZXdXaWRnZXQgPSBwcmV2aWV3TWFwPy5nZXQod2lkZ2V0LmlkKSA/PyBudWxsOwogICAgICBjb25zdCBsYXlvdXRGb3JSZW5kZXIgPSBpc0RyYWdnaW5nID8gd2lkZ2V0IDogcHJldmlld1dpZGdldCA/PyB3aWRnZXQ7CiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmNvbXB1dGVXaWRnZXRSZWN0KGxheW91dEZvclJlbmRlciwgbWV0cmljcywgbWFyZ2lucyk7CiAgICAgIGNvbnN0IHNpZGVQcm9wZXJ0eSA9IHRoaXMucnRsID8gInJpZ2h0IiA6ICJsZWZ0IjsKICAgICAgY29uc3Qgc2lkZVZhbHVlID0gdGhpcy5weFRvUGVyY2VudChyZWN0LmxlZnQsIG1ldHJpY3MuY29udGFpbmVyV2lkdGgpOwogICAgICBjb25zdCB3aWR0aFBlcmNlbnQgPSB0aGlzLnB4VG9QZXJjZW50KHJlY3Qud2lkdGgsIG1ldHJpY3MuY29udGFpbmVyV2lkdGgpOwogICAgICBsZXQgdHJhbnNmb3JtMiA9ICIiOwogICAgICBpZiAoaXNEcmFnZ2luZyAmJiB0aGlzLmRyYWdTdGF0ZT8uY3VycmVudFBvaW50ZXIpIHsKICAgICAgICBjb25zdCBwb2ludGVyID0gdGhpcy5kcmFnU3RhdGUuY3VycmVudFBvaW50ZXI7CiAgICAgICAgY29uc3QgYm91bmRzID0gdGhpcy5jb250YWluZXJCb3VuZHMgPz8gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBjb25zdCB0cmFuc2xhdGVYID0gcG9pbnRlci5jbGllbnRYIC0gYm91bmRzLmxlZnQgLSB0aGlzLmRyYWdTdGF0ZS5vZmZzZXRYIC0gcmVjdC5sZWZ0OwogICAgICAgIGNvbnN0IHRyYW5zbGF0ZVkgPSBwb2ludGVyLmNsaWVudFkgLSBib3VuZHMudG9wIC0gdGhpcy5kcmFnU3RhdGUub2Zmc2V0WSAtIHJlY3QudG9wOwogICAgICAgIHRyYW5zZm9ybTIgPSBgdHJhbnNmb3JtOiB0cmFuc2xhdGUoJHt0cmFuc2xhdGVYfXB4LCAke3RyYW5zbGF0ZVl9cHgpO2A7CiAgICAgIH0KICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9ImdyaWQtd2lkZ2V0ICR7aXNEcmFnZ2luZyA/ICJkcmFnZ2luZyIgOiAiIn0gJHtpc1Jlc2l6aW5nID8gInJlc2l6aW5nIiA6ICIifSIKICAgICAgICBzdHlsZT0iCiAgICAgICAgICAke3NpZGVQcm9wZXJ0eX06ICR7c2lkZVZhbHVlfSU7CiAgICAgICAgICB0b3A6ICR7cmVjdC50b3B9cHg7CiAgICAgICAgICB3aWR0aDogJHt3aWR0aFBlcmNlbnR9JTsKICAgICAgICAgIGhlaWdodDogJHtyZWN0LmhlaWdodH1weDsKICAgICAgICAgICR7dHJhbnNmb3JtMn0KICAgICAgICAiCiAgICAgICAgZGF0YS13aWRnZXQtaWQ9JHt3aWRnZXQuaWR9CiAgICAgID4KICAgICAgICA8ZGl2IGNsYXNzPSJ3aWRnZXQtY29udGVudCI+CiAgICAgICAgICAke3dpZGdldC50aXRsZSA/IGIyYAogICAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgICBjbGFzcz0id2lkZ2V0LWhlYWRlciAke2lzTG9ja2VkID8gImxvY2tlZCIgOiAiIn0iCiAgICAgICAgICAgICAgICAgIEBwb2ludGVyZG93bj0keyFpc0xvY2tlZCAmJiAhd2lkZ2V0Lm5vTW92ZSA/IChldnQpID0+IHRoaXMuc3RhcnREcmFnKGV2dCwgd2lkZ2V0KSA6IG51bGx9CiAgICAgICAgICAgICAgICAgIEBjb250ZXh0bWVudT0keyhldnQpID0+IHRoaXMuaGFuZGxlV2lkZ2V0Q29udGV4dE1lbnUoZXZ0LCB3aWRnZXQpfQogICAgICAgICAgICAgICAgICB0YWJpbmRleD0keyFpc0xvY2tlZCAmJiAhd2lkZ2V0Lm5vTW92ZSA/IDAgOiAtMX0KICAgICAgICAgICAgICAgICAgQGtleWRvd249JHsoZXZ0KSA9PiB0aGlzLmhhbmRsZUhlYWRlcktleWRvd24oZXZ0LCB3aWRnZXQpfQogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAke3dpZGdldC5pY29uID8gYjJgPGRlZXMtaWNvbiAuaWNvbj0ke3dpZGdldC5pY29ufT48L2RlZXMtaWNvbj5gIDogbnVsbH0KICAgICAgICAgICAgICAgICAgJHt3aWRnZXQudGl0bGV9CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICBgIDogbnVsbH0KICAgICAgICAgIDxkaXYgY2xhc3M9IndpZGdldC1ib2R5ICR7d2lkZ2V0LnRpdGxlID8gImhhcy1oZWFkZXIiIDogIiJ9Ij4KICAgICAgICAgICAgJHt3aWRnZXQuY29udGVudH0KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgJHshaXNMb2NrZWQgJiYgIXdpZGdldC5ub1Jlc2l6ZSA/IGIyYAogICAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgICBjbGFzcz0icmVzaXplLWhhbmRsZSByZXNpemUtaGFuZGxlLWUiCiAgICAgICAgICAgICAgICAgIEBwb2ludGVyZG93bj0keyhldnQpID0+IHRoaXMuc3RhcnRSZXNpemUoZXZ0LCB3aWRnZXQsICJlIil9CiAgICAgICAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2CiAgICAgICAgICAgICAgICAgIGNsYXNzPSJyZXNpemUtaGFuZGxlIHJlc2l6ZS1oYW5kbGUtcyIKICAgICAgICAgICAgICAgICAgQHBvaW50ZXJkb3duPSR7KGV2dCkgPT4gdGhpcy5zdGFydFJlc2l6ZShldnQsIHdpZGdldCwgInMiKX0KICAgICAgICAgICAgICAgID48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgY2xhc3M9InJlc2l6ZS1oYW5kbGUgcmVzaXplLWhhbmRsZS1zZSIKICAgICAgICAgICAgICAgICAgQHBvaW50ZXJkb3duPSR7KGV2dCkgPT4gdGhpcy5zdGFydFJlc2l6ZShldnQsIHdpZGdldCwgInNlIil9CiAgICAgICAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICAgICAgYCA6IG51bGx9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlclBsYWNlaG9sZGVyKG1ldHJpY3MsIG1hcmdpbnMpIHsKICAgICAgaWYgKCF0aGlzLnBsYWNlaG9sZGVyUG9zaXRpb24pIHsKICAgICAgICByZXR1cm4gYjJgYDsKICAgICAgfQogICAgICBjb25zdCByZWN0ID0gdGhpcy5jb21wdXRlV2lkZ2V0UmVjdCh0aGlzLnBsYWNlaG9sZGVyUG9zaXRpb24sIG1ldHJpY3MsIG1hcmdpbnMpOwogICAgICBjb25zdCBzaWRlUHJvcGVydHkgPSB0aGlzLnJ0bCA/ICJyaWdodCIgOiAibGVmdCI7CiAgICAgIGNvbnN0IHNpZGVWYWx1ZSA9IHRoaXMucHhUb1BlcmNlbnQocmVjdC5sZWZ0LCBtZXRyaWNzLmNvbnRhaW5lcldpZHRoKTsKICAgICAgY29uc3Qgd2lkdGhQZXJjZW50ID0gdGhpcy5weFRvUGVyY2VudChyZWN0LndpZHRoLCBtZXRyaWNzLmNvbnRhaW5lcldpZHRoKTsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9ImdyaWQtd2lkZ2V0IHBsYWNlaG9sZGVyIgogICAgICAgIHN0eWxlPSIKICAgICAgICAgICR7c2lkZVByb3BlcnR5fTogJHtzaWRlVmFsdWV9JTsKICAgICAgICAgIHRvcDogJHtyZWN0LnRvcH1weDsKICAgICAgICAgIHdpZHRoOiAke3dpZHRoUGVyY2VudH0lOwogICAgICAgICAgaGVpZ2h0OiAke3JlY3QuaGVpZ2h0fXB4OwogICAgICAgICIKICAgICAgPgogICAgICAgIDxkaXYgY2xhc3M9IndpZGdldC1jb250ZW50Ij48L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgc3RhcnREcmFnKGV2ZW50LCB3aWRnZXQpIHsKICAgICAgaWYgKCF0aGlzLmVkaXRhYmxlIHx8IHdpZGdldC5ub01vdmUgfHwgd2lkZ2V0LmxvY2tlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgY29uc3Qgd2lkZ2V0RWxlbWVudCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQuY2xvc2VzdCgiLmdyaWQtd2lkZ2V0Iik7CiAgICAgIGlmICghd2lkZ2V0RWxlbWVudCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCB3aWRnZXRSZWN0ID0gd2lkZ2V0RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgdGhpcy5jb250YWluZXJCb3VuZHMgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICB0aGlzLmVuc3VyZU1ldHJpY3MoKTsKICAgICAgdGhpcy5kcmFnU3RhdGUgPSB7CiAgICAgICAgd2lkZ2V0SWQ6IHdpZGdldC5pZCwKICAgICAgICBwb2ludGVySWQ6IGV2ZW50LnBvaW50ZXJJZCwKICAgICAgICBvZmZzZXRYOiBldmVudC5jbGllbnRYIC0gd2lkZ2V0UmVjdC5sZWZ0LAogICAgICAgIG9mZnNldFk6IGV2ZW50LmNsaWVudFkgLSB3aWRnZXRSZWN0LnRvcCwKICAgICAgICBzdGFydDogeyBpZDogd2lkZ2V0LmlkLCB4OiB3aWRnZXQueCwgeTogd2lkZ2V0LnksIHc6IHdpZGdldC53LCBoOiB3aWRnZXQuaCB9LAogICAgICAgIHByZXZpb3VzUG9zaXRpb246IHsgaWQ6IHdpZGdldC5pZCwgeDogd2lkZ2V0LngsIHk6IHdpZGdldC55LCB3OiB3aWRnZXQudywgaDogd2lkZ2V0LmggfSwKICAgICAgICBjdXJyZW50UG9pbnRlcjogeyBjbGllbnRYOiBldmVudC5jbGllbnRYLCBjbGllbnRZOiBldmVudC5jbGllbnRZIH0sCiAgICAgICAgbGFzdFBsYWNlbWVudDogbnVsbAogICAgICB9OwogICAgICB0aGlzLmludGVyYWN0aW9uQWN0aXZlID0gdHJ1ZTsKICAgICAgZXZlbnQuY3VycmVudFRhcmdldC5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsIHRoaXMuaGFuZGxlRHJhZ01vdmUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCB0aGlzLmhhbmRsZURyYWdFbmQpOwogICAgICB0aGlzLnBsYWNlaG9sZGVyUG9zaXRpb24gPSB7IGlkOiB3aWRnZXQuaWQsIHg6IHdpZGdldC54LCB5OiB3aWRnZXQueSwgdzogd2lkZ2V0LncsIGg6IHdpZGdldC5oIH07CiAgICB9CiAgICBoYW5kbGVEcmFnTW92ZSA9IChldmVudCkgPT4gewogICAgICBpZiAoIXRoaXMuZHJhZ1N0YXRlKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgbWV0cmljcyA9IHRoaXMuZW5zdXJlTWV0cmljcygpOwogICAgICBjb25zdCBhY3RpdmVXaWRnZXRzID0gdGhpcy53aWRnZXRzOwogICAgICBjb25zdCB3aWRnZXQgPSBhY3RpdmVXaWRnZXRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IHRoaXMuZHJhZ1N0YXRlLndpZGdldElkKTsKICAgICAgaWYgKCF3aWRnZXQpCiAgICAgICAgcmV0dXJuOwogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb25zdCBwcmV2aW91c1Bvc2l0aW9uID0gdGhpcy5kcmFnU3RhdGUucHJldmlvdXNQb3NpdGlvbjsKICAgICAgY29uc3QgY29vcmRzID0gY29tcHV0ZUdyaWRDb29yZGluYXRlcyh7CiAgICAgICAgcG9pbnRlcjogeyBjbGllbnRYOiBldmVudC5jbGllbnRYLCBjbGllbnRZOiBldmVudC5jbGllbnRZIH0sCiAgICAgICAgY29udGFpbmVyUmVjdDogdGhpcy5jb250YWluZXJCb3VuZHMgPz8gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKICAgICAgICBtZXRyaWNzLAogICAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1ucywKICAgICAgICB3aWRnZXQsCiAgICAgICAgcnRsOiB0aGlzLnJ0bCwKICAgICAgICBkcmFnT2Zmc2V0WDogdGhpcy5kcmFnU3RhdGUub2Zmc2V0WCwKICAgICAgICBkcmFnT2Zmc2V0WTogdGhpcy5kcmFnU3RhdGUub2Zmc2V0WQogICAgICB9KTsKICAgICAgY29uc3QgcGxhY2VtZW50ID0gcmVzb2x2ZVdpZGdldFBsYWNlbWVudChhY3RpdmVXaWRnZXRzLCB3aWRnZXQuaWQsIHsgeDogY29vcmRzLngsIHk6IGNvb3Jkcy55IH0sIHRoaXMuY29sdW1ucywgcHJldmlvdXNQb3NpdGlvbik7CiAgICAgIGlmIChwbGFjZW1lbnQpIHsKICAgICAgICBjb25zdCB1cGRhdGVkV2lkZ2V0ID0gcGxhY2VtZW50LndpZGdldHMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gd2lkZ2V0LmlkKTsKICAgICAgICB0aGlzLmRyYWdTdGF0ZSA9IHsKICAgICAgICAgIC4uLnRoaXMuZHJhZ1N0YXRlLAogICAgICAgICAgY3VycmVudFBvaW50ZXI6IHsgY2xpZW50WDogZXZlbnQuY2xpZW50WCwgY2xpZW50WTogZXZlbnQuY2xpZW50WSB9LAogICAgICAgICAgbGFzdFBsYWNlbWVudDogcGxhY2VtZW50LAogICAgICAgICAgcHJldmlvdXNQb3NpdGlvbjogdXBkYXRlZFdpZGdldCA/IHsgaWQ6IHVwZGF0ZWRXaWRnZXQuaWQsIHg6IHVwZGF0ZWRXaWRnZXQueCwgeTogdXBkYXRlZFdpZGdldC55LCB3OiB1cGRhdGVkV2lkZ2V0LncsIGg6IHVwZGF0ZWRXaWRnZXQuaCB9IDogeyBpZDogd2lkZ2V0LmlkLCB4OiBjb29yZHMueCwgeTogY29vcmRzLnksIHc6IHdpZGdldC53LCBoOiB3aWRnZXQuaCB9CiAgICAgICAgfTsKICAgICAgICB0aGlzLnByZXZpZXdXaWRnZXRzID0gcGxhY2VtZW50LndpZGdldHM7CiAgICAgICAgY29uc3QgcHJldmlld1dpZGdldCA9IHBsYWNlbWVudC53aWRnZXRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IHdpZGdldC5pZCk7CiAgICAgICAgaWYgKHByZXZpZXdXaWRnZXQpIHsKICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXJQb3NpdGlvbiA9IHsKICAgICAgICAgICAgaWQ6IHByZXZpZXdXaWRnZXQuaWQsCiAgICAgICAgICAgIHg6IHByZXZpZXdXaWRnZXQueCwKICAgICAgICAgICAgeTogcHJldmlld1dpZGdldC55LAogICAgICAgICAgICB3OiBwcmV2aWV3V2lkZ2V0LncsCiAgICAgICAgICAgIGg6IHByZXZpZXdXaWRnZXQuaAogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5wbGFjZWhvbGRlclBvc2l0aW9uID0geyBpZDogd2lkZ2V0LmlkLCB4OiBjb29yZHMueCwgeTogY29vcmRzLnksIHc6IHdpZGdldC53LCBoOiB3aWRnZXQuaCB9OwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnByZXZpZXdXaWRnZXRzID0gbnVsbDsKICAgICAgICB0aGlzLnBsYWNlaG9sZGVyUG9zaXRpb24gPSBudWxsOwogICAgICB9CiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgfTsKICAgIGhhbmRsZURyYWdFbmQgPSAoZXZlbnQpID0+IHsKICAgICAgY29uc3QgZHJhZ1N0YXRlID0gdGhpcy5kcmFnU3RhdGU7CiAgICAgIGlmICghZHJhZ1N0YXRlIHx8IGV2ZW50LnBvaW50ZXJJZCAhPT0gZHJhZ1N0YXRlLnBvaW50ZXJJZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBsYXlvdXRTb3VyY2UgPSB0aGlzLndpZGdldHM7CiAgICAgIHRoaXMucHJldmlld1dpZGdldHMgPSBudWxsOwogICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnBsYWNlaG9sZGVyUG9zaXRpb24gPz8gZHJhZ1N0YXRlLnN0YXJ0OwogICAgICBjb25zdCBwbGFjZW1lbnQgPSByZXNvbHZlV2lkZ2V0UGxhY2VtZW50KGxheW91dFNvdXJjZSwgZHJhZ1N0YXRlLndpZGdldElkLCB7IHg6IHRhcmdldC54LCB5OiB0YXJnZXQueSB9LCB0aGlzLmNvbHVtbnMsIGRyYWdTdGF0ZS5wcmV2aW91c1Bvc2l0aW9uKTsKICAgICAgaWYgKHBsYWNlbWVudCkgewogICAgICAgIGNvbnN0IGZpbmFsV2lkZ2V0ID0gcGxhY2VtZW50LndpZGdldHMuZmluZCgodzQpID0+IHc0LmlkID09PSBkcmFnU3RhdGUud2lkZ2V0SWQpOwogICAgICAgIGlmIChmaW5hbFdpZGdldCkgewogICAgICAgICAgY29uc3QgaGFzT3ZlcmxhcCA9IHBsYWNlbWVudC53aWRnZXRzLnNvbWUoKHc0KSA9PiB7CiAgICAgICAgICAgIGlmICh3NC5pZCA9PT0gZHJhZ1N0YXRlLndpZGdldElkKQogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgcmV0dXJuIGZpbmFsV2lkZ2V0LnggPCB3NC54ICsgdzQudyAmJiBmaW5hbFdpZGdldC54ICsgZmluYWxXaWRnZXQudyA+IHc0LnggJiYgZmluYWxXaWRnZXQueSA8IHc0LnkgKyB3NC5oICYmIGZpbmFsV2lkZ2V0LnkgKyBmaW5hbFdpZGdldC5oID4gdzQueTsKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKCFoYXNPdmVybGFwKSB7CiAgICAgICAgICAgIHRoaXMuY29tbWl0UGxhY2VtZW50KHBsYWNlbWVudCwgZHJhZ1N0YXRlLndpZGdldElkLCAid2lkZ2V0LW1vdmUiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMud2lkZ2V0cyA9IHRoaXMud2lkZ2V0cy5tYXAoKHdpZGdldCkgPT4gd2lkZ2V0LmlkID09PSBkcmFnU3RhdGUud2lkZ2V0SWQgPyB7IC4uLndpZGdldCwgeDogZHJhZ1N0YXRlLnN0YXJ0LngsIHk6IGRyYWdTdGF0ZS5zdGFydC55IH0gOiB3aWRnZXQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLndpZGdldHMgPSB0aGlzLndpZGdldHMubWFwKCh3aWRnZXQpID0+IHdpZGdldC5pZCA9PT0gZHJhZ1N0YXRlLndpZGdldElkID8geyAuLi53aWRnZXQsIHg6IGRyYWdTdGF0ZS5zdGFydC54LCB5OiBkcmFnU3RhdGUuc3RhcnQueSB9IDogd2lkZ2V0KTsKICAgICAgfQogICAgICB0aGlzLnBsYWNlaG9sZGVyUG9zaXRpb24gPSBudWxsOwogICAgICB0aGlzLmRyYWdTdGF0ZSA9IG51bGw7CiAgICAgIHRoaXMuaW50ZXJhY3Rpb25BY3RpdmUgPSBmYWxzZTsKICAgICAgdGhpcy5yZWxlYXNlUG9pbnRlckV2ZW50cygpOwogICAgfTsKICAgIHN0YXJ0UmVzaXplKGV2ZW50LCB3aWRnZXQsIGhhbmRsZXIyKSB7CiAgICAgIGlmICghdGhpcy5lZGl0YWJsZSB8fCB3aWRnZXQubm9SZXNpemUgfHwgd2lkZ2V0LmxvY2tlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgdGhpcy5lbnN1cmVNZXRyaWNzKCk7CiAgICAgIHRoaXMucmVzaXplU3RhdGUgPSB7CiAgICAgICAgd2lkZ2V0SWQ6IHdpZGdldC5pZCwKICAgICAgICBwb2ludGVySWQ6IGV2ZW50LnBvaW50ZXJJZCwKICAgICAgICBoYW5kbGVyOiBoYW5kbGVyMiwKICAgICAgICBzdGFydFBvaW50ZXI6IHsgY2xpZW50WDogZXZlbnQuY2xpZW50WCwgY2xpZW50WTogZXZlbnQuY2xpZW50WSB9LAogICAgICAgIHN0YXJ0OiB7IGlkOiB3aWRnZXQuaWQsIHg6IHdpZGdldC54LCB5OiB3aWRnZXQueSwgdzogd2lkZ2V0LncsIGg6IHdpZGdldC5oIH0sCiAgICAgICAgc3RhcnRXaWR0aDogd2lkZ2V0LncsCiAgICAgICAgc3RhcnRIZWlnaHQ6IHdpZGdldC5oLAogICAgICAgIGxhc3RQbGFjZW1lbnQ6IG51bGwKICAgICAgfTsKICAgICAgdGhpcy5pbnRlcmFjdGlvbkFjdGl2ZSA9IHRydWU7CiAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQuc2V0UG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCB0aGlzLmhhbmRsZVJlc2l6ZU1vdmUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCB0aGlzLmhhbmRsZVJlc2l6ZUVuZCk7CiAgICAgIHRoaXMucGxhY2Vob2xkZXJQb3NpdGlvbiA9IHsgaWQ6IHdpZGdldC5pZCwgeDogd2lkZ2V0LngsIHk6IHdpZGdldC55LCB3OiB3aWRnZXQudywgaDogd2lkZ2V0LmggfTsKICAgIH0KICAgIGhhbmRsZVJlc2l6ZU1vdmUgPSAoZXZlbnQpID0+IHsKICAgICAgaWYgKCF0aGlzLnJlc2l6ZVN0YXRlKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgbWV0cmljcyA9IHRoaXMuZW5zdXJlTWV0cmljcygpOwogICAgICBjb25zdCBhY3RpdmVXaWRnZXRzID0gdGhpcy53aWRnZXRzOwogICAgICBjb25zdCB3aWRnZXQgPSBhY3RpdmVXaWRnZXRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IHRoaXMucmVzaXplU3RhdGUud2lkZ2V0SWQpOwogICAgICBpZiAoIXdpZGdldCkKICAgICAgICByZXR1cm47CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnN0IG5leHRTaXplID0gY29tcHV0ZVJlc2l6ZURpbWVuc2lvbnMoewogICAgICAgIHBvaW50ZXI6IHsgY2xpZW50WDogZXZlbnQuY2xpZW50WCwgY2xpZW50WTogZXZlbnQuY2xpZW50WSB9LAogICAgICAgIGNvbnRhaW5lclJlY3Q6IHRoaXMuY29udGFpbmVyQm91bmRzID8/IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCiAgICAgICAgbWV0cmljcywKICAgICAgICBzdGFydFdpZHRoOiB0aGlzLnJlc2l6ZVN0YXRlLnN0YXJ0V2lkdGgsCiAgICAgICAgc3RhcnRIZWlnaHQ6IHRoaXMucmVzaXplU3RhdGUuc3RhcnRIZWlnaHQsCiAgICAgICAgc3RhcnRQb2ludGVyOiB0aGlzLnJlc2l6ZVN0YXRlLnN0YXJ0UG9pbnRlciwKICAgICAgICBoYW5kbGVyOiB0aGlzLnJlc2l6ZVN0YXRlLmhhbmRsZXIsCiAgICAgICAgd2lkZ2V0LAogICAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1ucwogICAgICB9KTsKICAgICAgY29uc3QgcGxhY2VtZW50ID0gcmVzb2x2ZVdpZGdldFBsYWNlbWVudChhY3RpdmVXaWRnZXRzLCB3aWRnZXQuaWQsIHsgeDogd2lkZ2V0LngsIHk6IHdpZGdldC55LCB3OiBuZXh0U2l6ZS53aWR0aCwgaDogbmV4dFNpemUuaGVpZ2h0IH0sIHRoaXMuY29sdW1ucywgdGhpcy5yZXNpemVTdGF0ZS5zdGFydCk7CiAgICAgIGlmIChwbGFjZW1lbnQpIHsKICAgICAgICB0aGlzLnJlc2l6ZVN0YXRlID0geyAuLi50aGlzLnJlc2l6ZVN0YXRlLCBsYXN0UGxhY2VtZW50OiBwbGFjZW1lbnQgfTsKICAgICAgICB0aGlzLnByZXZpZXdXaWRnZXRzID0gcGxhY2VtZW50LndpZGdldHM7CiAgICAgICAgY29uc3QgcHJldmlld1dpZGdldCA9IHBsYWNlbWVudC53aWRnZXRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IHdpZGdldC5pZCk7CiAgICAgICAgaWYgKHByZXZpZXdXaWRnZXQpIHsKICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXJQb3NpdGlvbiA9IHsKICAgICAgICAgICAgaWQ6IHByZXZpZXdXaWRnZXQuaWQsCiAgICAgICAgICAgIHg6IHByZXZpZXdXaWRnZXQueCwKICAgICAgICAgICAgeTogcHJldmlld1dpZGdldC55LAogICAgICAgICAgICB3OiBwcmV2aWV3V2lkZ2V0LncsCiAgICAgICAgICAgIGg6IHByZXZpZXdXaWRnZXQuaAogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5wbGFjZWhvbGRlclBvc2l0aW9uID0gewogICAgICAgICAgICBpZDogd2lkZ2V0LmlkLAogICAgICAgICAgICB4OiB3aWRnZXQueCwKICAgICAgICAgICAgeTogd2lkZ2V0LnksCiAgICAgICAgICAgIHc6IG5leHRTaXplLndpZHRoLAogICAgICAgICAgICBoOiBuZXh0U2l6ZS5oZWlnaHQKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMucHJldmlld1dpZGdldHMgPSBudWxsOwogICAgICAgIHRoaXMucGxhY2Vob2xkZXJQb3NpdGlvbiA9IG51bGw7CiAgICAgIH0KICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7CiAgICB9OwogICAgaGFuZGxlUmVzaXplRW5kID0gKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHJlc2l6ZVN0YXRlID0gdGhpcy5yZXNpemVTdGF0ZTsKICAgICAgaWYgKCFyZXNpemVTdGF0ZSB8fCBldmVudC5wb2ludGVySWQgIT09IHJlc2l6ZVN0YXRlLnBvaW50ZXJJZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBsYXlvdXRTb3VyY2UgPSB0aGlzLndpZGdldHM7CiAgICAgIHRoaXMucHJldmlld1dpZGdldHMgPSBudWxsOwogICAgICBjb25zdCBwbGFjZW1lbnQgPSByZXNpemVTdGF0ZS5sYXN0UGxhY2VtZW50ID8/IHJlc29sdmVXaWRnZXRQbGFjZW1lbnQobGF5b3V0U291cmNlLCByZXNpemVTdGF0ZS53aWRnZXRJZCwgewogICAgICAgIHg6IHRoaXMucGxhY2Vob2xkZXJQb3NpdGlvbj8ueCA/PyByZXNpemVTdGF0ZS5zdGFydC54LAogICAgICAgIHk6IHRoaXMucGxhY2Vob2xkZXJQb3NpdGlvbj8ueSA/PyByZXNpemVTdGF0ZS5zdGFydC55LAogICAgICAgIHc6IHRoaXMucGxhY2Vob2xkZXJQb3NpdGlvbj8udyA/PyByZXNpemVTdGF0ZS5zdGFydC53LAogICAgICAgIGg6IHRoaXMucGxhY2Vob2xkZXJQb3NpdGlvbj8uaCA/PyByZXNpemVTdGF0ZS5zdGFydC5oCiAgICAgIH0sIHRoaXMuY29sdW1ucywgcmVzaXplU3RhdGUuc3RhcnQpOwogICAgICBpZiAocGxhY2VtZW50KSB7CiAgICAgICAgdGhpcy5jb21taXRQbGFjZW1lbnQocGxhY2VtZW50LCByZXNpemVTdGF0ZS53aWRnZXRJZCwgIndpZGdldC1yZXNpemUiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLndpZGdldHMgPSB0aGlzLndpZGdldHMubWFwKCh3aWRnZXQpID0+IHdpZGdldC5pZCA9PT0gcmVzaXplU3RhdGUud2lkZ2V0SWQgPyB7IC4uLndpZGdldCwgdzogcmVzaXplU3RhdGUuc3RhcnQudywgaDogcmVzaXplU3RhdGUuc3RhcnQuaCB9IDogd2lkZ2V0KTsKICAgICAgfQogICAgICB0aGlzLnBsYWNlaG9sZGVyUG9zaXRpb24gPSBudWxsOwogICAgICB0aGlzLnJlc2l6ZVN0YXRlID0gbnVsbDsKICAgICAgdGhpcy5pbnRlcmFjdGlvbkFjdGl2ZSA9IGZhbHNlOwogICAgICB0aGlzLnJlbGVhc2VQb2ludGVyRXZlbnRzKCk7CiAgICB9OwogICAgaGFuZGxlSGVhZGVyS2V5ZG93bihldmVudCwgd2lkZ2V0KSB7CiAgICAgIGlmICghdGhpcy5lZGl0YWJsZSB8fCB3aWRnZXQubm9Nb3ZlIHx8IHdpZGdldC5sb2NrZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qga2V5MiA9IGV2ZW50LmtleTsKICAgICAgY29uc3QgaXNSZXNpemUgPSBldmVudC5zaGlmdEtleTsKICAgICAgbGV0IHBsYWNlbWVudCA9IG51bGw7CiAgICAgIGlmIChpc1Jlc2l6ZSAmJiBbIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoa2V5MikpIHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNvbnN0IGRlbHRhMiA9IGtleTIgPT09ICJBcnJvd1JpZ2h0IiB8fCBrZXkyID09PSAiQXJyb3dEb3duIiA/IDEgOiAtMTsKICAgICAgICBpZiAoa2V5MiA9PT0gIkFycm93TGVmdCIgfHwga2V5MiA9PT0gIkFycm93UmlnaHQiKSB7CiAgICAgICAgICBjb25zdCBtYXhXaWR0aCA9IHdpZGdldC5tYXhXID8/IHRoaXMuY29sdW1ucyAtIHdpZGdldC54OwogICAgICAgICAgY29uc3QgbmV4dFdpZHRoID0gTWF0aC5tYXgod2lkZ2V0Lm1pblcgPz8gMSwgTWF0aC5taW4obWF4V2lkdGgsIHdpZGdldC53ICsgZGVsdGEyKSk7CiAgICAgICAgICBwbGFjZW1lbnQgPSByZXNvbHZlV2lkZ2V0UGxhY2VtZW50KHRoaXMud2lkZ2V0cywgd2lkZ2V0LmlkLCB7IHg6IHdpZGdldC54LCB5OiB3aWRnZXQueSwgdzogbmV4dFdpZHRoLCBoOiB3aWRnZXQuaCB9LCB0aGlzLmNvbHVtbnMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSB3aWRnZXQubWF4SCA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICAgICAgICBjb25zdCBuZXh0SGVpZ2h0ID0gTWF0aC5tYXgod2lkZ2V0Lm1pbkggPz8gMSwgTWF0aC5taW4obWF4SGVpZ2h0LCB3aWRnZXQuaCArIGRlbHRhMikpOwogICAgICAgICAgcGxhY2VtZW50ID0gcmVzb2x2ZVdpZGdldFBsYWNlbWVudCh0aGlzLndpZGdldHMsIHdpZGdldC5pZCwgeyB4OiB3aWRnZXQueCwgeTogd2lkZ2V0LnksIHc6IHdpZGdldC53LCBoOiBuZXh0SGVpZ2h0IH0sIHRoaXMuY29sdW1ucyk7CiAgICAgICAgfQogICAgICAgIGlmIChwbGFjZW1lbnQpIHsKICAgICAgICAgIHRoaXMuY29tbWl0UGxhY2VtZW50KHBsYWNlbWVudCwgd2lkZ2V0LmlkLCAid2lkZ2V0LXJlc2l6ZSIpOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgbW92ZU1hcCA9IHsKICAgICAgICBBcnJvd0xlZnQ6IHsgZHg6IC0xLCBkeTogMCB9LAogICAgICAgIEFycm93UmlnaHQ6IHsgZHg6IDEsIGR5OiAwIH0sCiAgICAgICAgQXJyb3dVcDogeyBkeDogMCwgZHk6IC0xIH0sCiAgICAgICAgQXJyb3dEb3duOiB7IGR4OiAwLCBkeTogMSB9CiAgICAgIH07CiAgICAgIGNvbnN0IGRlbHRhID0gbW92ZU1hcFtrZXkyXTsKICAgICAgaWYgKCFkZWx0YSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb25zdCB0YXJnZXRYID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5jb2x1bW5zIC0gd2lkZ2V0LncsIHdpZGdldC54ICsgZGVsdGEuZHgpKTsKICAgICAgY29uc3QgdGFyZ2V0WSA9IE1hdGgubWF4KDAsIHdpZGdldC55ICsgZGVsdGEuZHkpOwogICAgICBwbGFjZW1lbnQgPSByZXNvbHZlV2lkZ2V0UGxhY2VtZW50KHRoaXMud2lkZ2V0cywgd2lkZ2V0LmlkLCB7IHg6IHRhcmdldFgsIHk6IHRhcmdldFkgfSwgdGhpcy5jb2x1bW5zKTsKICAgICAgaWYgKHBsYWNlbWVudCkgewogICAgICAgIHRoaXMuY29tbWl0UGxhY2VtZW50KHBsYWNlbWVudCwgd2lkZ2V0LmlkLCAid2lkZ2V0LW1vdmUiKTsKICAgICAgfQogICAgfQogICAgaGFuZGxlV2lkZ2V0Q29udGV4dE1lbnUoZXZlbnQsIHdpZGdldCkgewogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgb3BlbldpZGdldENvbnRleHRNZW51KHsgd2lkZ2V0LCBob3N0OiB0aGlzLCBldmVudCB9KTsKICAgIH0KICAgIGNvbW1pdFBsYWNlbWVudChyZXN1bHQsIHdpZGdldElkLCB0eXBlNSkgewogICAgICB0aGlzLnByZXZpZXdXaWRnZXRzID0gbnVsbDsKICAgICAgdGhpcy53aWRnZXRzID0gcmVzdWx0LndpZGdldHM7CiAgICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLndpZGdldHMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gd2lkZ2V0SWQpOwogICAgICBpZiAoc3ViamVjdCkgewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQodHlwZTUsIHsKICAgICAgICAgIGRldGFpbDogewogICAgICAgICAgICB3aWRnZXQ6IHN1YmplY3QsCiAgICAgICAgICAgIGRpc3BsYWNlZDogcmVzdWx0Lm1vdmVkV2lkZ2V0cy5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gd2lkZ2V0SWQpLAogICAgICAgICAgICBzd2FwcGVkV2l0aDogcmVzdWx0LnN3YXBwZWRXaXRoCiAgICAgICAgICB9LAogICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgfSkpOwogICAgICB9CiAgICB9CiAgICByZW1vdmVXaWRnZXQod2lkZ2V0SWQpIHsKICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy53aWRnZXRzLmZpbmQoKHdpZGdldCkgPT4gd2lkZ2V0LmlkID09PSB3aWRnZXRJZCk7CiAgICAgIGlmICghdGFyZ2V0KQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy53aWRnZXRzID0gdGhpcy53aWRnZXRzLmZpbHRlcigod2lkZ2V0KSA9PiB3aWRnZXQuaWQgIT09IHdpZGdldElkKTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgid2lkZ2V0LXJlbW92ZSIsIHsKICAgICAgICBkZXRhaWw6IHsgd2lkZ2V0OiB0YXJnZXQgfSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIHVwZGF0ZVdpZGdldCh3aWRnZXRJZCwgdXBkYXRlcykgewogICAgICB0aGlzLndpZGdldHMgPSB0aGlzLndpZGdldHMubWFwKCh3aWRnZXQpID0+IHdpZGdldC5pZCA9PT0gd2lkZ2V0SWQgPyB7IC4uLndpZGdldCwgLi4udXBkYXRlcyB9IDogd2lkZ2V0KTsKICAgIH0KICAgIGdldExheW91dCgpIHsKICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0cy5tYXAoKHsgaWQsIHg6IHg0LCB5OiB5NSwgdzogdzQsIGg6IGg5IH0pID0+ICh7IGlkLCB4OiB4NCwgeTogeTUsIHc6IHc0LCBoOiBoOSB9KSk7CiAgICB9CiAgICBzZXRMYXlvdXQobGF5b3V0KSB7CiAgICAgIHRoaXMud2lkZ2V0cyA9IGFwcGx5TGF5b3V0KHRoaXMud2lkZ2V0cywgbGF5b3V0KTsKICAgIH0KICAgIGxvY2tHcmlkKCkgewogICAgICB0aGlzLmVkaXRhYmxlID0gZmFsc2U7CiAgICB9CiAgICB1bmxvY2tHcmlkKCkgewogICAgICB0aGlzLmVkaXRhYmxlID0gdHJ1ZTsKICAgIH0KICAgIGFkZFdpZGdldCh3aWRnZXQsIGF1dG9Qb3NpdGlvbiA9IGZhbHNlKSB7CiAgICAgIGNvbnN0IG5leHRXaWRnZXQgPSB7IC4uLndpZGdldCB9OwogICAgICBpZiAoYXV0b1Bvc2l0aW9uIHx8IG5leHRXaWRnZXQuYXV0b1Bvc2l0aW9uKSB7CiAgICAgICAgY29uc3QgcG9zaXRpb24zID0gZmluZEF2YWlsYWJsZVBvc2l0aW9uKHRoaXMud2lkZ2V0cywgbmV4dFdpZGdldC53LCBuZXh0V2lkZ2V0LmgsIHRoaXMuY29sdW1ucyk7CiAgICAgICAgbmV4dFdpZGdldC54ID0gcG9zaXRpb24zLng7CiAgICAgICAgbmV4dFdpZGdldC55ID0gcG9zaXRpb24zLnk7CiAgICAgIH0KICAgICAgdGhpcy53aWRnZXRzID0gWy4uLnRoaXMud2lkZ2V0cywgbmV4dFdpZGdldF07CiAgICB9CiAgICBjb21wYWN0KGRpcmVjdGlvbiA9ICJ2ZXJ0aWNhbCIpIHsKICAgICAgY29uc3QgbmV4dFdpZGdldHMgPSB0aGlzLndpZGdldHMubWFwKCh3aWRnZXQpID0+ICh7IC4uLndpZGdldCB9KSk7CiAgICAgIGNvbXBhY3RMYXlvdXQobmV4dFdpZGdldHMsIGRpcmVjdGlvbik7CiAgICAgIHRoaXMud2lkZ2V0cyA9IG5leHRXaWRnZXRzOwogICAgfQogICAgYXBwbHlCcmVha3BvaW50TGF5b3V0KGJyZWFrcG9pbnQpIHsKICAgICAgdGhpcy5hY3RpdmVCcmVha3BvaW50ID0gYnJlYWtwb2ludDsKICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5sYXlvdXRzPy5bYnJlYWtwb2ludF07CiAgICAgIGlmIChsYXlvdXQpIHsKICAgICAgICB0aGlzLnNldExheW91dChsYXlvdXQpOwogICAgICB9CiAgICB9CiAgICBub3RpZnlMYXlvdXRDaGFuZ2UoKSB7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImxheW91dC1jaGFuZ2UiLCB7CiAgICAgICAgZGV0YWlsOiB7IGxheW91dDogdGhpcy5nZXRMYXlvdXQoKSB9LAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgZW5zdXJlTWV0cmljcygpIHsKICAgICAgaWYgKCF0aGlzLm1ldHJpY3MpIHsKICAgICAgICB0aGlzLmNvbXB1dGVNZXRyaWNzKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMubWV0cmljczsKICAgIH0KICAgIGNvbXB1dGVNZXRyaWNzKCkgewogICAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBib3VuZHMgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICB0aGlzLmNvbnRhaW5lckJvdW5kcyA9IGJvdW5kczsKICAgICAgY29uc3QgbWFyZ2lucyA9IHJlc29sdmVNYXJnaW5zKHRoaXMubWFyZ2luKTsKICAgICAgdGhpcy5yZXNvbHZlZE1hcmdpbnMgPSBtYXJnaW5zOwogICAgICB0aGlzLm1ldHJpY3MgPSBjYWxjdWxhdGVDZWxsTWV0cmljcyhib3VuZHMud2lkdGgsIHRoaXMuY29sdW1ucywgbWFyZ2lucywgdGhpcy5jZWxsSGVpZ2h0LCB0aGlzLmNlbGxIZWlnaHRVbml0KTsKICAgIH0KICAgIG9ic2VydmVSZXNpemUoKSB7CiAgICAgIGlmICh0aGlzLnJlc2l6ZU9ic2VydmVyKQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7CiAgICAgICAgdGhpcy5jb21wdXRlTWV0cmljcygpOwogICAgICB9KTsKICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMpOwogICAgfQogICAgZGlzY29ubmVjdFJlc2l6ZU9ic2VydmVyKCkgewogICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7CiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSB2b2lkIDA7CiAgICB9CiAgICByZWxlYXNlUG9pbnRlckV2ZW50cygpIHsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCB0aGlzLmhhbmRsZURyYWdNb3ZlKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIiwgdGhpcy5oYW5kbGVEcmFnRW5kKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLCB0aGlzLmhhbmRsZVJlc2l6ZU1vdmUpOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCB0aGlzLmhhbmRsZVJlc2l6ZUVuZCk7CiAgICB9CiAgICBweFRvUGVyY2VudCh2YWx1ZTIsIGNvbnRhaW5lcikgewogICAgICBpZiAoIWNvbnRhaW5lcikKICAgICAgICByZXR1cm4gMDsKICAgICAgcmV0dXJuIE51bWJlcigodmFsdWUyIC8gY29udGFpbmVyICogMTAwKS50b0ZpeGVkKDQpKTsKICAgIH0KICAgIGNvbXB1dGVXaWRnZXRSZWN0KHdpZGdldCwgbWV0cmljcywgbWFyZ2lucykgewogICAgICBjb25zdCBjZWxsV2lkdGggPSBtZXRyaWNzLmNlbGxXaWR0aFB4OwogICAgICBjb25zdCBjZWxsSGVpZ2h0ID0gbWV0cmljcy5jZWxsSGVpZ2h0UHg7CiAgICAgIGNvbnN0IGxlZnQgPSB3aWRnZXQueCAqIChjZWxsV2lkdGggKyBtYXJnaW5zLmhvcml6b250YWwpICsgbWFyZ2lucy5ob3Jpem9udGFsOwogICAgICBjb25zdCB0b3AgPSB3aWRnZXQueSAqIChjZWxsSGVpZ2h0ICsgbWFyZ2lucy52ZXJ0aWNhbCkgKyBtYXJnaW5zLnZlcnRpY2FsOwogICAgICBjb25zdCB3aWR0aCA9IHdpZGdldC53ICogY2VsbFdpZHRoICsgTWF0aC5tYXgoMCwgd2lkZ2V0LncgLSAxKSAqIG1hcmdpbnMuaG9yaXpvbnRhbDsKICAgICAgY29uc3QgaGVpZ2h0ID0gd2lkZ2V0LmggKiBjZWxsSGVpZ2h0ICsgTWF0aC5tYXgoMCwgd2lkZ2V0LmggLSAxKSAqIG1hcmdpbnMudmVydGljYWw7CiAgICAgIHJldHVybiB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9OwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM3MShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0Rhc2hib2FyZGdyaWQyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1oZWFkaW5nL2RlZXMtaGVhZGluZy5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CmZ1bmN0aW9uIGRlbW9GdW5jNDgoKSB7CiAgcmV0dXJuIGIyYAogICAgPGRlZXMtaGVhZGluZyBsZXZlbD0iMSI+VGhpcyBpcyBhIEgxIGhlYWRpbmc8L2RlZXMtaGVhZGluZz4KICAgIDxkZWVzLWhlYWRpbmcgbGV2ZWw9IjIiPlRoaXMgaXMgYSBIMiBoZWFkaW5nPC9kZWVzLWhlYWRpbmc+CiAgICA8ZGVlcy1oZWFkaW5nIGxldmVsPSIzIj5UaGlzIGlzIGEgSDMgaGVhZGluZzwvZGVlcy1oZWFkaW5nPgogICAgPGRlZXMtaGVhZGluZyBsZXZlbD0iNCI+VGhpcyBpcyBhIEg0IGhlYWRpbmc8L2RlZXMtaGVhZGluZz4KICAgIDxkZWVzLWhlYWRpbmcgbGV2ZWw9IjUiPlRoaXMgaXMgYSBINSBoZWFkaW5nPC9kZWVzLWhlYWRpbmc+CiAgICA8ZGVlcy1oZWFkaW5nIGxldmVsPSI2Ij5UaGlzIGlzIGEgSDYgaGVhZGluZzwvZGVlcy1oZWFkaW5nPgogICAgPGRlZXMtaGVhZGluZyBsZXZlbD0iaHIiPlRoaXMgaXMgYW4gaHIgaGVhZGluZzwvZGVlcy1oZWFkaW5nPgogICAgPGRlZXMtaGVhZGluZyBsZXZlbD0iaHItc21hbGwiPlRoaXMgaXMgYW4gaHIgc21hbGwgaGVhZGluZzwvZGVlcy1oZWFkaW5nPgogIGA7Cn0KCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1sYXlvdXQvZGVlcy1oZWFkaW5nL2RlZXMtaGVhZGluZy5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU3MSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNzIgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNIZWFkaW5nID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLWhlYWRpbmciKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9sZXZlbF9kZWNvcmF0b3JzOwogIGxldCBfbGV2ZWxfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sZXZlbF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSGVhZGluZzIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9sZXZlbF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nLCByZWZsZWN0OiB0cnVlIH0pXTsKICAgICAgX19lc0RlY29yYXRlNzEodGhpcywgbnVsbCwgX2xldmVsX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxldmVsIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsZXZlbCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sZXZlbCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubGV2ZWwgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbGV2ZWxfaW5pdGlhbGl6ZXJzLCBfbGV2ZWxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3MShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNIZWFkaW5nMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAvLyBkZW1vCiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jNDg7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiTGF5b3V0Il07CiAgICAjbGV2ZWxfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNzIodGhpcywgX2xldmVsX2luaXRpYWxpemVycywgIjEiKTsKICAgIC8vIHByb3BlcnRpZXMKICAgIC8qKgogICAgICogSGVhZGluZyBsZXZlbDogMS02IGZvciBoMS1oNiwgb3IgJ2hyJyBmb3IgaG9yaXpvbnRhbCBydWxlIHN0eWxlCiAgICAgKi8KICAgIGdldCBsZXZlbCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xldmVsX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbGV2ZWwodmFsdWUyKSB7CiAgICAgIHRoaXMuI2xldmVsX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAvLyBTVEFUSUMgU1RZTEVTCiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgLyogSGVhZGluZyBzdHlsZXMgKi8KICAgICAgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiB7CiAgICAgICAgbWFyZ2luOiAxNnB4IDAgOHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwIiwgIiNmZmYiKX07CiAgICAgIH0KICAgICAgaDEgeyBmb250LXNpemU6IDMycHg7IGZvbnQtZmFtaWx5OiAke2Nzc0NhbFNhbnNGb250RmFtaWx5fTsgbGV0dGVyLXNwYWNpbmc6IDAuMDI1ZW07fQogICAgICBoMiB7IGZvbnQtc2l6ZTogMjhweDsgfQogICAgICBoMyB7IGZvbnQtc2l6ZTogMjRweDsgfQogICAgICBoNCB7IGZvbnQtc2l6ZTogMjBweDsgfQogICAgICBoNSB7IGZvbnQtc2l6ZTogMTZweDsgfQogICAgICBoNiB7IGZvbnQtc2l6ZTogMTRweDsgfQogICAgICAvKiBIb3Jpem9udGFsIHJ1bGUgc3R5bGUgaGVhZGluZyAqLwogICAgICAuaGVhZGluZy1ociB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDE2cHggMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAiLCAiI2ZmZiIpfTsKICAgICAgfQogICAgICAvKiBGYWRlIGxpbmVzIHRvd2FyZCBhbmQgYXdheSBmcm9tIHRleHQgZm9yIGhyIHN0eWxlICovCiAgICAgIC5oZWFkaW5nLWhyOjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgLyogZmFkZSBpbiB0b3dhcmQgY2VudGVyICovCiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImxpbmVhci1ncmFkaWVudCh0byByaWdodCwgdHJhbnNwYXJlbnQsICNjY2MpIiwgImxpbmVhci1ncmFkaWVudCh0byByaWdodCwgdHJhbnNwYXJlbnQsICMzMzMpIil9OwogICAgICAgIG1hcmdpbjogMCA4cHg7CiAgICAgIH0KICAgICAgLmhlYWRpbmctaHI6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBmbGV4OiAxOwogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIC8qIGZhZGUgb3V0IGF3YXkgZnJvbSBjZW50ZXIgKi8KICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgibGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAjY2NjLCB0cmFuc3BhcmVudCkiLCAibGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAjMzMzLCB0cmFuc3BhcmVudCkiKX07CiAgICAgICAgbWFyZ2luOiAwIDhweDsKICAgICAgfQogICAgICAvKiBTbWFsbCBociB2YXJpYW50IHdpdGggcmVkdWNlZCBtYXJnaW5zICovCiAgICAgIC5oZWFkaW5nLWhyLmhlYWRpbmctaHItc21hbGwgewogICAgICAgIG1hcmdpbjogOHB4IDA7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICB9CiAgICAgIC5oZWFkaW5nLWhyLmhlYWRpbmctaHItc21hbGw6OmJlZm9yZSwKICAgICAgLmhlYWRpbmctaHIuaGVhZGluZy1oci1zbWFsbDo6YWZ0ZXIgewogICAgICAgIG1hcmdpbjogMCA4cHg7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICAvLyBJTlNUQU5DRQogICAgcmVuZGVyKCkgewogICAgICBzd2l0Y2ggKHRoaXMubGV2ZWwpIHsKICAgICAgICBjYXNlICIxIjoKICAgICAgICAgIHJldHVybiBiMmA8aDE+PHNsb3Q+PC9zbG90PjwvaDE+YDsKICAgICAgICBjYXNlICIyIjoKICAgICAgICAgIHJldHVybiBiMmA8aDI+PHNsb3Q+PC9zbG90PjwvaDI+YDsKICAgICAgICBjYXNlICIzIjoKICAgICAgICAgIHJldHVybiBiMmA8aDM+PHNsb3Q+PC9zbG90PjwvaDM+YDsKICAgICAgICBjYXNlICI0IjoKICAgICAgICAgIHJldHVybiBiMmA8aDQ+PHNsb3Q+PC9zbG90PjwvaDQ+YDsKICAgICAgICBjYXNlICI1IjoKICAgICAgICAgIHJldHVybiBiMmA8aDU+PHNsb3Q+PC9zbG90PjwvaDU+YDsKICAgICAgICBjYXNlICI2IjoKICAgICAgICAgIHJldHVybiBiMmA8aDY+PHNsb3Q+PC9zbG90PjwvaDY+YDsKICAgICAgICBjYXNlICJociI6CiAgICAgICAgICByZXR1cm4gYjJgPGRpdiBjbGFzcz0iaGVhZGluZy1ociI+PHNsb3Q+PC9zbG90PjwvZGl2PmA7CiAgICAgICAgY2FzZSAiaHItc21hbGwiOgogICAgICAgICAgcmV0dXJuIGIyYDxkaXYgY2xhc3M9ImhlYWRpbmctaHIgaGVhZGluZy1oci1zbWFsbCI+PHNsb3Q+PC9zbG90PjwvZGl2PmA7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJldHVybiBiMmA8aDE+PHNsb3Q+PC9zbG90PjwvaDE+YDsKICAgICAgfQogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNzIodGhpcywgX2xldmVsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNzIoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNIZWFkaW5nMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbGF5b3V0L2RlZXMtcGFnaW5hdGlvbi9kZWVzLXBhZ2luYXRpb24uZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtb0Z1bmM0OSA9ICgpID0+IGIyYAogIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTZweDsiPgogICAgPCEtLSBTbWFsbCBzZXQgb2YgcGFnZXMgLS0+CiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDRweDsiPgogICAgICA8c3Bhbj41IHBhZ2VzLCBzdGFydGluZyBhdCAxOjwvc3Bhbj4KICAgICAgPGRlZXMtcGFnaW5hdGlvbgogICAgICAgIC50b3RhbD0kezV9CiAgICAgICAgLnBhZ2U9JHsxfQogICAgICAgIEBwYWdlLWNoYW5nZT0keyhlMTEpID0+IGNvbnNvbGUubG9nKCJQYWdlIGNoYW5nZWQgdG8iLCBlMTEuZGV0YWlsLnBhZ2UpfQogICAgICA+PC9kZWVzLXBhZ2luYXRpb24+CiAgICA8L2Rpdj4KCiAgICA8IS0tIExhcmdlciBzZXQgb2YgcGFnZXMgLS0+CiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDRweDsiPgogICAgICA8c3Bhbj4xNSBwYWdlcywgc3RhcnRpbmcgYXQgODo8L3NwYW4+CiAgICAgIDxkZWVzLXBhZ2luYXRpb24KICAgICAgICAudG90YWw9JHsxNX0KICAgICAgICAucGFnZT0kezh9CiAgICAgICAgQHBhZ2UtY2hhbmdlPSR7KGUxMSkgPT4gY29uc29sZS5sb2coIlBhZ2UgY2hhbmdlZCB0byIsIGUxMS5kZXRhaWwucGFnZSl9CiAgICAgID48L2RlZXMtcGFnaW5hdGlvbj4KICAgIDwvZGl2PgogIDwvZGl2PgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWxheW91dC9kZWVzLXBhZ2luYXRpb24vZGVlcy1wYWdpbmF0aW9uLmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTcyID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM3MyA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1BhZ2luYXRpb24gPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtcGFnaW5hdGlvbiIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3BhZ2VfZGVjb3JhdG9yczsKICBsZXQgX3BhZ2VfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wYWdlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90b3RhbF9kZWNvcmF0b3JzOwogIGxldCBfdG90YWxfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90b3RhbF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzUGFnaW5hdGlvbjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9wYWdlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSldOwogICAgICBfdG90YWxfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTcyKHRoaXMsIG51bGwsIF9wYWdlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInBhZ2UiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInBhZ2UiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucGFnZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucGFnZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wYWdlX2luaXRpYWxpemVycywgX3BhZ2VfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Mih0aGlzLCBudWxsLCBfdG90YWxfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidG90YWwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRvdGFsIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRvdGFsLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50b3RhbCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90b3RhbF9pbml0aWFsaXplcnMsIF90b3RhbF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTcyKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1BhZ2luYXRpb24yID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmM0OTsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJMYXlvdXQiXTsKICAgICNwYWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczczKHRoaXMsIF9wYWdlX2luaXRpYWxpemVycywgMSk7CiAgICAvKiogQ3VycmVudCBwYWdlICgxLWJhc2VkKSAqLwogICAgZ2V0IHBhZ2UoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwYWdlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcGFnZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcGFnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3RvdGFsX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Myh0aGlzLCBfcGFnZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzModGhpcywgX3RvdGFsX2luaXRpYWxpemVycywgMSkpOwogICAgLyoqIFRvdGFsIG51bWJlciBvZiBwYWdlcyAqLwogICAgZ2V0IHRvdGFsKCkgewogICAgICByZXR1cm4gdGhpcy4jdG90YWxfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0b3RhbCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdG90YWxfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQogICAgICBidXR0b24gewogICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIG1hcmdpbjogMCAycHg7CiAgICAgICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzMzMiLCAiI2NjYyIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzOwogICAgICB9CiAgICAgIGJ1dHRvbjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlZWUiLCAiIzQ0NCIpfTsKICAgICAgfQogICAgICBidXR0b246ZGlzYWJsZWQgewogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNhYWEiLCAiIzY2NiIpfTsKICAgICAgfQogICAgICBidXR0b24uY3VycmVudCB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwNTBiOTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KICAgICAgc3Bhbi5lbGxpcHNpcyB7CiAgICAgICAgbWFyZ2luOiAwIDRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzMzMiLCAiI2NjYyIpfTsKICAgICAgfQogICAgYAogICAgXTsKICAgIGdldCBwYWdlcygpIHsKICAgICAgY29uc3QgcGFnZXMgPSBbXTsKICAgICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsOwogICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5wYWdlOwogICAgICBpZiAodG90YWwgPD0gNykgewogICAgICAgIGZvciAobGV0IGkxMSA9IDE7IGkxMSA8PSB0b3RhbDsgaTExKyspIHsKICAgICAgICAgIHBhZ2VzLnB1c2goaTExKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGFnZXMucHVzaCgxKTsKICAgICAgICBpZiAoY3VycmVudCA+IDQpIHsKICAgICAgICAgIHBhZ2VzLnB1c2goIi4uLiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDIsIGN1cnJlbnQgLSAyKTsKICAgICAgICBjb25zdCBlbmQzID0gTWF0aC5taW4odG90YWwgLSAxLCBjdXJyZW50ICsgMik7CiAgICAgICAgZm9yIChsZXQgaTExID0gc3RhcnQ7IGkxMSA8PSBlbmQzOyBpMTErKykgewogICAgICAgICAgcGFnZXMucHVzaChpMTEpOwogICAgICAgIH0KICAgICAgICBpZiAoY3VycmVudCA8IHRvdGFsIC0gMykgewogICAgICAgICAgcGFnZXMucHVzaCgiLi4uIik7CiAgICAgICAgfQogICAgICAgIHBhZ2VzLnB1c2godG90YWwpOwogICAgICB9CiAgICAgIHJldHVybiBwYWdlczsKICAgIH0KICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8YnV0dG9uCiAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5jaGFuZ2VQYWdlKHRoaXMucGFnZSAtIDEpfQogICAgICAgID9kaXNhYmxlZD0ke3RoaXMucGFnZSA8PSAxfQogICAgICAgIGFyaWEtbGFiZWw9IlByZXZpb3VzIHBhZ2UiCiAgICAgID4KICAgICAgICDigLkKICAgICAgPC9idXR0b24+CiAgICAgICR7dGhpcy5wYWdlcy5tYXAoKHA4KSA9PiBwOCA9PT0gIi4uLiIgPyBiMmA8c3BhbiBjbGFzcz0iZWxsaXBzaXMiPuKApjwvc3Bhbj5gIDogYjJgCiAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgY2xhc3M9IiR7cDggPT09IHRoaXMucGFnZSA/ICJjdXJyZW50IiA6ICIifSIKICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuY2hhbmdlUGFnZShwOCl9CiAgICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHtwOCA9PT0gdGhpcy5wYWdlfQogICAgICAgICAgICAgICAgYXJpYS1sYWJlbD0iUGFnZSAke3A4fSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAke3A4fQogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICBgKX0KICAgICAgPGJ1dHRvbgogICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuY2hhbmdlUGFnZSh0aGlzLnBhZ2UgKyAxKX0KICAgICAgICA/ZGlzYWJsZWQ9JHt0aGlzLnBhZ2UgPj0gdGhpcy50b3RhbH0KICAgICAgICBhcmlhLWxhYmVsPSJOZXh0IHBhZ2UiCiAgICAgID4KICAgICAgICDigLoKICAgICAgPC9idXR0b24+CiAgICBgOwogICAgfQogICAgY2hhbmdlUGFnZShuZXdQYWdlKSB7CiAgICAgIGlmIChuZXdQYWdlIDwgMSB8fCBuZXdQYWdlID4gdGhpcy50b3RhbCB8fCBuZXdQYWdlID09PSB0aGlzLnBhZ2UpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5wYWdlID0gbmV3UGFnZTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgicGFnZS1jaGFuZ2UiLCB7CiAgICAgICAgZGV0YWlsOiB7IHBhZ2U6IHRoaXMucGFnZSB9LAogICAgICAgIGJ1YmJsZXM6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNzModGhpcywgX3RvdGFsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNzMoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNQYWdpbmF0aW9uMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbGF5b3V0L2RlZXMtc3RlcHBlci9kZWVzLXN0ZXBwZXIuZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgc3RlcHBlckRlbW8gPSAoKSA9PiBiMmAKICA8ZGVlcy1zdGVwcGVyCiAgICAuc3RlcHM9JHtbCiAgewogICAgdGl0bGU6ICJBY2NvdW50IFNldHVwIiwKICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCBrZXk9ImVtYWlsIiBsYWJlbD0iV29yayBFbWFpbCIgcmVxdWlyZWQ+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQga2V5PSJwYXNzd29yZCIgbGFiZWw9IkNyZWF0ZSBQYXNzd29yZCIgdHlwZT0icGFzc3dvcmQiIHJlcXVpcmVkPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdD5Db250aW51ZTwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICAgIDwvZGVlcy1mb3JtPgogICAgICAgIGAsCiAgICB2YWxpZGF0aW9uRnVuYzogYXN5bmMgKHN0ZXBwZXJBcmcsIGVsZW1lbnRBcmcpID0+IHsKICAgICAgY29uc3QgZGVlc0Zvcm0gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoImRlZXMtZm9ybSIpOwogICAgICBkZWVzRm9ybS5hZGRFdmVudExpc3RlbmVyKCJmb3JtRGF0YSIsICgpID0+IHN0ZXBwZXJBcmcuZ29OZXh0KCksIHsgb25jZTogdHJ1ZSB9KTsKICAgIH0KICB9LAogIHsKICAgIHRpdGxlOiAiUHJvZmlsZSBEZXRhaWxzIiwKICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCBrZXk9ImZpcnN0TmFtZSIgbGFiZWw9IkZpcnN0IE5hbWUiIHJlcXVpcmVkPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IGtleT0ibGFzdE5hbWUiIGxhYmVsPSJMYXN0IE5hbWUiIHJlcXVpcmVkPjwvZGVlcy1pbnB1dC10ZXh0PgogICAgICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdD5Db250aW51ZTwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICAgIDwvZGVlcy1mb3JtPgogICAgICAgIGAsCiAgICB2YWxpZGF0aW9uRnVuYzogYXN5bmMgKHN0ZXBwZXJBcmcsIGVsZW1lbnRBcmcpID0+IHsKICAgICAgY29uc3QgZGVlc0Zvcm0gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoImRlZXMtZm9ybSIpOwogICAgICBkZWVzRm9ybS5hZGRFdmVudExpc3RlbmVyKCJmb3JtRGF0YSIsICgpID0+IHN0ZXBwZXJBcmcuZ29OZXh0KCksIHsgb25jZTogdHJ1ZSB9KTsKICAgIH0KICB9LAogIHsKICAgIHRpdGxlOiAiQ29udGFjdCBJbmZvcm1hdGlvbiIsCiAgICBjb250ZW50OiBiMmAKICAgICAgICAgIDxkZWVzLWZvcm0+CiAgICAgICAgICAgIDxkZWVzLWlucHV0LXBob25lIGtleT0icGhvbmUiIGxhYmVsPSJNb2JpbGUgTnVtYmVyIiByZXF1aXJlZD48L2RlZXMtaW5wdXQtcGhvbmU+CiAgICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQga2V5PSJjb21wYW55IiBsYWJlbD0iQ29tcGFueSI+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICAgIDxkZWVzLWZvcm0tc3VibWl0PkNvbnRpbnVlPC9kZWVzLWZvcm0tc3VibWl0PgogICAgICAgICAgPC9kZWVzLWZvcm0+CiAgICAgICAgYCwKICAgIHZhbGlkYXRpb25GdW5jOiBhc3luYyAoc3RlcHBlckFyZywgZWxlbWVudEFyZykgPT4gewogICAgICBjb25zdCBkZWVzRm9ybSA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1mb3JtIik7CiAgICAgIGRlZXNGb3JtLmFkZEV2ZW50TGlzdGVuZXIoImZvcm1EYXRhIiwgKCkgPT4gc3RlcHBlckFyZy5nb05leHQoKSwgeyBvbmNlOiB0cnVlIH0pOwogICAgfQogIH0sCiAgewogICAgdGl0bGU6ICJUZWFtIFNpemUiLAogICAgY29udGVudDogYjJgCiAgICAgICAgICA8ZGVlcy1mb3JtPgogICAgICAgICAgICA8ZGVlcy1pbnB1dC1kcm9wZG93bgogICAgICAgICAgICAgIGtleT0idGVhbVNpemUiCiAgICAgICAgICAgICAgbGFiZWw9IkhvdyBiaWcgaXMgeW91ciB0ZWFtPyIKICAgICAgICAgICAgICAub3B0aW9ucz0ke1sKICAgICAgeyBsYWJlbDogIjEtNSIsIHZhbHVlOiAiMS01IiB9LAogICAgICB7IGxhYmVsOiAiNi0yMCIsIHZhbHVlOiAiNi0yMCIgfSwKICAgICAgeyBsYWJlbDogIjIxLTUwIiwgdmFsdWU6ICIyMS01MCIgfSwKICAgICAgeyBsYWJlbDogIjUxKyIsIHZhbHVlOiAiNTErIiB9CiAgICBdfQogICAgICAgICAgICAgIHJlcXVpcmVkCiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtZHJvcGRvd24+CiAgICAgICAgICAgIDxkZWVzLWZvcm0tc3VibWl0PkNvbnRpbnVlPC9kZWVzLWZvcm0tc3VibWl0PgogICAgICAgICAgPC9kZWVzLWZvcm0+CiAgICAgICAgYCwKICAgIHZhbGlkYXRpb25GdW5jOiBhc3luYyAoc3RlcHBlckFyZywgZWxlbWVudEFyZykgPT4gewogICAgICBjb25zdCBkZWVzRm9ybSA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1mb3JtIik7CiAgICAgIGRlZXNGb3JtLmFkZEV2ZW50TGlzdGVuZXIoImZvcm1EYXRhIiwgKCkgPT4gc3RlcHBlckFyZy5nb05leHQoKSwgeyBvbmNlOiB0cnVlIH0pOwogICAgfQogIH0sCiAgewogICAgdGl0bGU6ICJHb2FscyIsCiAgICBjb250ZW50OiBiMmAKICAgICAgICAgIDxkZWVzLWZvcm0+CiAgICAgICAgICAgIDxkZWVzLWlucHV0LW11bHRpdG9nZ2xlCiAgICAgICAgICAgICAga2V5PSJnb2FsIgogICAgICAgICAgICAgIGxhYmVsPSJNYWluIG9iamVjdGl2ZSIKICAgICAgICAgICAgICAub3B0aW9ucz0ke1sKICAgICAgeyBsYWJlbDogIk9uYm9hcmRpbmciLCB2YWx1ZTogIm9uYm9hcmRpbmciIH0sCiAgICAgIHsgbGFiZWw6ICJBbmFseXRpY3MiLCB2YWx1ZTogImFuYWx5dGljcyIgfSwKICAgICAgeyBsYWJlbDogIkF1dG9tYXRpb24iLCB2YWx1ZTogImF1dG9tYXRpb24iIH0KICAgIF19CiAgICAgICAgICAgICAgcmVxdWlyZWQKICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC1tdWx0aXRvZ2dsZT4KICAgICAgICAgICAgPGRlZXMtZm9ybS1zdWJtaXQ+Q29udGludWU8L2RlZXMtZm9ybS1zdWJtaXQ+CiAgICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgICBgLAogICAgdmFsaWRhdGlvbkZ1bmM6IGFzeW5jIChzdGVwcGVyQXJnLCBlbGVtZW50QXJnKSA9PiB7CiAgICAgIGNvbnN0IGRlZXNGb3JtID0gZWxlbWVudEFyZy5xdWVyeVNlbGVjdG9yKCJkZWVzLWZvcm0iKTsKICAgICAgZGVlc0Zvcm0uYWRkRXZlbnRMaXN0ZW5lcigiZm9ybURhdGEiLCAoKSA9PiBzdGVwcGVyQXJnLmdvTmV4dCgpLCB7IG9uY2U6IHRydWUgfSk7CiAgICB9CiAgfSwKICB7CiAgICB0aXRsZTogIkJyYW5kIFByZWZlcmVuY2VzIiwKICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgPGRlZXMtZm9ybT4KICAgICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCBrZXk9ImJyYW5kQ29sb3IiIGxhYmVsPSJQcmltYXJ5IGJyYW5kIGNvbG9yIj48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCBrZXk9InRvbmUiIGxhYmVsPSJQcmVmZXJyZWQgdG9uZSAoZS5nLiBmcmllbmRseSwgZm9ybWFsKSI+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICAgIDxkZWVzLWZvcm0tc3VibWl0PkNvbnRpbnVlPC9kZWVzLWZvcm0tc3VibWl0PgogICAgICAgICAgPC9kZWVzLWZvcm0+CiAgICAgICAgYCwKICAgIHZhbGlkYXRpb25GdW5jOiBhc3luYyAoc3RlcHBlckFyZywgZWxlbWVudEFyZykgPT4gewogICAgICBjb25zdCBkZWVzRm9ybSA9IGVsZW1lbnRBcmcucXVlcnlTZWxlY3RvcigiZGVlcy1mb3JtIik7CiAgICAgIGRlZXNGb3JtLmFkZEV2ZW50TGlzdGVuZXIoImZvcm1EYXRhIiwgKCkgPT4gc3RlcHBlckFyZy5nb05leHQoKSwgeyBvbmNlOiB0cnVlIH0pOwogICAgfQogIH0sCiAgewogICAgdGl0bGU6ICJJbnRlZ3JhdGlvbnMiLAogICAgY29udGVudDogYjJgCiAgICAgICAgICA8ZGVlcy1mb3JtPgogICAgICAgICAgICA8ZGVlcy1pbnB1dC1saXN0CiAgICAgICAgICAgICAga2V5PSJpbnRlZ3JhdGlvbnMiCiAgICAgICAgICAgICAgbGFiZWw9IkludGVncmF0aW9ucyBpbiB1c2UiCiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkFkZCBpbnRlZ3JhdGlvbiIKICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC1saXN0PgogICAgICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdD5Db250aW51ZTwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICAgIDwvZGVlcy1mb3JtPgogICAgICAgIGAsCiAgICB2YWxpZGF0aW9uRnVuYzogYXN5bmMgKHN0ZXBwZXJBcmcsIGVsZW1lbnRBcmcpID0+IHsKICAgICAgY29uc3QgZGVlc0Zvcm0gPSBlbGVtZW50QXJnLnF1ZXJ5U2VsZWN0b3IoImRlZXMtZm9ybSIpOwogICAgICBkZWVzRm9ybS5hZGRFdmVudExpc3RlbmVyKCJmb3JtRGF0YSIsICgpID0+IHN0ZXBwZXJBcmcuZ29OZXh0KCksIHsgb25jZTogdHJ1ZSB9KTsKICAgIH0KICB9LAogIHsKICAgIHRpdGxlOiAiUmV2aWV3ICYgTGF1bmNoIiwKICAgIGNvbnRlbnQ6IGIyYAogICAgICAgICAgPGRlZXMtcGFuZWw+CiAgICAgICAgICAgIDxwPkFsbW9zdCB0aGVyZSEgUmV2aWV3IHlvdXIgc2VsZWN0aW9ucyBhbmQgbGF1bmNoIHdoZW5ldmVyIHlvdSdyZSByZWFkeS48L3A+CiAgICAgICAgICA8L2RlZXMtcGFuZWw+CiAgICAgICAgYAogIH0KXX0KICA+PC9kZWVzLXN0ZXBwZXI+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbGF5b3V0L2RlZXMtc3RlcHBlci9kZWVzLXN0ZXBwZXIuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF9kaXN0X3RzMjkoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlNzMgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczc0ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzU3RlcHBlciA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1zdGVwcGVyIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfc3RlcHNfZGVjb3JhdG9yczsKICBsZXQgX3N0ZXBzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc3RlcHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkU3RlcF9kZWNvcmF0b3JzOwogIGxldCBfc2VsZWN0ZWRTdGVwX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRTdGVwX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNTdGVwcGVyMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3N0ZXBzX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IEFycmF5CiAgICAgIH0pXTsKICAgICAgX3NlbGVjdGVkU3RlcF9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBPYmplY3QKICAgICAgfSldOwogICAgICBfX2VzRGVjb3JhdGU3Myh0aGlzLCBudWxsLCBfc3RlcHNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic3RlcHMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInN0ZXBzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnN0ZXBzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zdGVwcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zdGVwc19pbml0aWFsaXplcnMsIF9zdGVwc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTczKHRoaXMsIG51bGwsIF9zZWxlY3RlZFN0ZXBfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0ZWRTdGVwIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3RlZFN0ZXAiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0ZWRTdGVwLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3RlZFN0ZXAgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0ZWRTdGVwX2luaXRpYWxpemVycywgX3NlbGVjdGVkU3RlcF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTczKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1N0ZXBwZXIyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gc3RlcHBlckRlbW87CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiTGF5b3V0IiwgIkZvcm0iXTsKICAgICNzdGVwc19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM3NCh0aGlzLCBfc3RlcHNfaW5pdGlhbGl6ZXJzLCBbXSk7CiAgICBnZXQgc3RlcHMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzdGVwc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHN0ZXBzKHZhbHVlMikgewogICAgICB0aGlzLiNzdGVwc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NlbGVjdGVkU3RlcF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzQodGhpcywgX3N0ZXBzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3NCh0aGlzLCBfc2VsZWN0ZWRTdGVwX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgc2VsZWN0ZWRTdGVwKCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRTdGVwX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0ZWRTdGVwKHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3RlZFN0ZXBfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIC5zdGVwcGVyQ29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5zdGVwIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC43cyBjdWJpYy1iZXppZXIoMC44NywgMCwgMC4xMywgMSksIGJveC1zaGFkb3cgMC43cyBjdWJpYy1iZXppZXIoMC44NywgMCwgMC4xMywgMSksIGZpbHRlciAwLjdzIGN1YmljLWJlemllcigwLjg3LCAwLCAwLjEzLCAxKSwgYm9yZGVyIDAuN3MgY3ViaWMtYmV6aWVyKDAuODcsIDAsIDAuMTMsIDEpOwogICAgICAgIG1heC13aWR0aDogNTAwcHg7CiAgICAgICAgbWluLWhlaWdodDogMzAwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMGYwZjExIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTJlOGYwIiwgIiMyNzI3MjkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMGYxNzJhIiwgIiNmNWY1ZjUiKX07CiAgICAgICAgbWFyZ2luOiBhdXRvOwogICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgICAgZmlsdGVyOiBvcGFjaXR5KDAuNTUpIHNhdHVyYXRlKDAuODUpOwogICAgICAgIGJveC1zaGFkb3c6IDAgOHB4IDMycHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICB9CgogICAgICAuc3RlcC5zZWxlY3RlZCB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDsKICAgICAgICBmaWx0ZXI6IG9wYWNpdHkoMSkgc2F0dXJhdGUoMSk7CiAgICAgICAgdXNlci1zZWxlY3Q6IGF1dG87CiAgICAgIH0KCiAgICAgIC5zdGVwLmhpZGRlblN0ZXAgewogICAgICAgIGZpbHRlcjogb3BhY2l0eSgwKTsKICAgICAgfQoKICAgICAgLnN0ZXAuZW50cmFuY2UgewogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjM1cyBlYXNlLCBib3gtc2hhZG93IDAuMzVzIGVhc2UsIGZpbHRlciAwLjM1cyBlYXNlLCBib3JkZXIgMC4zNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnN0ZXAuZW50cmFuY2UuaGlkZGVuU3RlcCB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDE2cHgpOwogICAgICB9CgogICAgICAuc3RlcDpsYXN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMDB2aDsKICAgICAgfQoKICAgICAgLnN0ZXAgLnN0ZXBDb3VudGVyIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2NDc0OGIiLCAiI2ExYTFhYSIpfTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxMnB4OwogICAgICAgIHJpZ2h0OiAxMnB4OwogICAgICAgIHBhZGRpbmc6IDZweCAxNHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgyMjYsIDIzMiwgMjQwLCAwLjUpIiwgInJnYmEoNjMsIDYzLCA3MCwgMC40NSkiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMjI2LCAyMzIsIDI0MCwgMC43KSIsICJyZ2JhKDYzLCA2MywgNzAsIDAuNikiKX07CiAgICAgIH0KCiAgICAgIC5zdGVwIC5nb0JhY2sgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDEycHg7CiAgICAgICAgbGVmdDogMTJweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNnB4OwogICAgICAgIHBhZGRpbmc6IDZweCAxMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDIyNiwgMjMyLCAyNDAsIDAuOSkiLCAicmdiYSg2MywgNjMsIDcwLCAwLjg1KSIpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpIiwgInJnYmEoMzksIDM5LCA0MiwgMC44NSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNDc1NTY5IiwgIiNkNGQ0ZDgiKX07CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGJvcmRlciAwLjJzIGVhc2UsIGNvbG9yIDAuMnMgZWFzZSwgYmFja2dyb3VuZCAwLjJzIGVhc2UsIHRyYW5zZm9ybSAwLjJzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5zdGVwIC5nb0JhY2s6aG92ZXIgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzBmMTcyYSIsICIjZmFmYWZhIil9OwogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoZGFyay5ibHVlLCBkYXJrLmJsdWUpfTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgyMjYsIDIzMiwgMjQwLCAwLjk1KSIsICJyZ2JhKDYzLCA2MywgNzAsIDAuNykiKX07CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0ycHgpOwogICAgICB9CgogICAgICAuc3RlcCAuZ29CYWNrOmFjdGl2ZSB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMGYxNzJhIiwgIiNmYWZhZmEiKX07CiAgICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZShkYXJrLmJsdWVBY3RpdmUsIGRhcmsuYmx1ZUFjdGl2ZSl9OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDIyNiwgMjMyLCAyNDAsIDAuODUpIiwgInJnYmEoNjMsIDYzLCA3MCwgMC42KSIpfTsKICAgICAgfQoKICAgICAgLnN0ZXAgLmdvQmFjayBzcGFuIHsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycyBlYXNlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLnN0ZXAgLmdvQmFjazpob3ZlciBzcGFuIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTJweCk7CiAgICAgIH0KCiAgICAgIC5zdGVwIC50aXRsZSB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHBhZGRpbmctdG9wOiA2NHB4OwogICAgICAgIGZvbnQtZmFtaWx5OiAnR2Vpc3QgU2FucycsIHNhbnMtc2VyaWY7CiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIC5zdGVwIC5jb250ZW50IHsKICAgICAgICBwYWRkaW5nOiAzMnB4OwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InN0ZXBwZXJDb250YWluZXIiPgogICAgICAgICR7dGhpcy5zdGVwcy5tYXAoKHN0ZXBBcmcpID0+IGIyYDxkaXYKICAgICAgICAgICAgICBjbGFzcz0ic3RlcCAke3N0ZXBBcmcgPT09IHRoaXMuc2VsZWN0ZWRTdGVwID8gInNlbGVjdGVkIiA6IG51bGx9ICR7dGhpcy5nZXRJbmRleE9mU3RlcChzdGVwQXJnKSA+IHRoaXMuZ2V0SW5kZXhPZlN0ZXAodGhpcy5zZWxlY3RlZFN0ZXApID8gImhpZGRlblN0ZXAiIDogIiJ9ICR7dGhpcy5nZXRJbmRleE9mU3RlcChzdGVwQXJnKSA9PT0gMCA/ICJlbnRyYW5jZSIgOiAiIn0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICAke3RoaXMuZ2V0SW5kZXhPZlN0ZXAoc3RlcEFyZykgPiAwID8gYjJgPGRpdiBjbGFzcz0iZ29CYWNrIiBAY2xpY2s9JHt0aGlzLmdvQmFja30+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBJbnRlciI+PC08L3NwYW4+IGdvIHRvIHByZXZpb3VzIHN0ZXA8L2Rpdj5gIDogYGB9CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RlcENvdW50ZXIiPgogICAgICAgICAgICAgICAgU3RlcCAke3RoaXMuc3RlcHMuZmluZEluZGV4KChlbGVtZW50QXJnKSA9PiBlbGVtZW50QXJnID09PSBzdGVwQXJnKSArIDF9IG9mCiAgICAgICAgICAgICAgICAke3RoaXMuc3RlcHMubGVuZ3RofQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4ke3N0ZXBBcmcudGl0bGV9PC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+JHtzdGVwQXJnLmNvbnRlbnR9PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PiBgKX0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgZ2V0SW5kZXhPZlN0ZXAgPSAoX19ydW5Jbml0aWFsaXplcnM3NCh0aGlzLCBfc2VsZWN0ZWRTdGVwX2V4dHJhSW5pdGlhbGl6ZXJzKSwgKHN0ZXBBcmcpID0+IHsKICAgICAgcmV0dXJuIHRoaXMuc3RlcHMuZmluZEluZGV4KChzdGVwQXJnMikgPT4gc3RlcEFyZyA9PT0gc3RlcEFyZzIpOwogICAgfSk7CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIGF3YWl0IHRoaXMuZG9tdG9vbHNQcm9taXNlOwogICAgICBhd2FpdCB0aGlzLmRvbXRvb2xzLmNvbnZlbmllbmNlLnNtYXJ0ZGVsYXkuZGVsYXlGb3IoMCk7CiAgICAgIHRoaXMuc2VsZWN0ZWRTdGVwID0gdGhpcy5zdGVwc1swXTsKICAgICAgdGhpcy5zZXRTY3JvbGxTdGF0dXMoKTsKICAgICAgYXdhaXQgdGhpcy5kb210b29scy5jb252ZW5pZW5jZS5zbWFydGRlbGF5LmRlbGF5Rm9yKDM1MCk7CiAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuc3RlcC5lbnRyYW5jZSIpPy5jbGFzc0xpc3QucmVtb3ZlKCJlbnRyYW5jZSIpOwogICAgfQogICAgYXN5bmMgdXBkYXRlZCgpIHsKICAgICAgdGhpcy5zZXRTY3JvbGxTdGF0dXMoKTsKICAgIH0KICAgIHNjcm9sbGVyOwogICAgYXN5bmMgc2V0U2Nyb2xsU3RhdHVzKCkgewogICAgICBjb25zdCBzdGVwcGVyQ29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5zdGVwcGVyQ29udGFpbmVyIik7CiAgICAgIGNvbnN0IGZpcnN0U3RlcEVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLnN0ZXAiKTsKICAgICAgY29uc3Qgc2VsZWN0ZWRTdGVwRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuc2VsZWN0ZWQiKTsKICAgICAgaWYgKCFzZWxlY3RlZFN0ZXBFbGVtZW50KSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghc3RlcHBlckNvbnRhaW5lci5zdHlsZS5wYWRkaW5nVG9wKSB7CiAgICAgICAgc3RlcHBlckNvbnRhaW5lci5zdHlsZS5wYWRkaW5nVG9wID0gYCR7c3RlcHBlckNvbnRhaW5lci5vZmZzZXRIZWlnaHQgLyAyIC0gc2VsZWN0ZWRTdGVwRWxlbWVudC5vZmZzZXRIZWlnaHQgLyAyfXB4YDsKICAgICAgfQogICAgICBjb25zb2xlLmxvZygiU2V0dGluZyBzY3JvbGwgc3RhdHVzIik7CiAgICAgIGNvbnNvbGUubG9nKHNlbGVjdGVkU3RlcEVsZW1lbnQpOwogICAgICBjb25zdCBzY3JvbGxQb3NpdGlvbiA9IHNlbGVjdGVkU3RlcEVsZW1lbnQub2Zmc2V0VG9wIC0gc3RlcHBlckNvbnRhaW5lci5vZmZzZXRIZWlnaHQgLyAyICsgc2VsZWN0ZWRTdGVwRWxlbWVudC5vZmZzZXRIZWlnaHQgLyAyOwogICAgICBjb25zb2xlLmxvZyhzY3JvbGxQb3NpdGlvbik7CiAgICAgIGNvbnN0IGRvbXRvb2xzSW5zdGFuY2UgPSBhd2FpdCBEb21Ub29scy5zZXR1cERvbVRvb2xzKCk7CiAgICAgIGlmICghdGhpcy5zY3JvbGxlcikgewogICAgICAgIHRoaXMuc2Nyb2xsZXIgPSBuZXcgZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzLlN3ZWV0U2Nyb2xsKHsKICAgICAgICAgIHZlcnRpY2FsOiB0cnVlLAogICAgICAgICAgaG9yaXpvbnRhbDogZmFsc2UsCiAgICAgICAgICBlYXNpbmc6ICJlYXNlSW5PdXRFeHBvIiwKICAgICAgICAgIGR1cmF0aW9uOiA3MDAKICAgICAgICB9LCBzdGVwcGVyQ29udGFpbmVyKTsKICAgICAgfQogICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRTdGVwLnZhbGlkYXRpb25GdW5jQ2FsbGVkICYmIHRoaXMuc2VsZWN0ZWRTdGVwLnZhbGlkYXRpb25GdW5jKSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZFN0ZXAuYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwogICAgICAgIHRoaXMuc2VsZWN0ZWRTdGVwLnZhbGlkYXRpb25GdW5jQ2FsbGVkID0gdHJ1ZTsKICAgICAgICBhd2FpdCB0aGlzLnNlbGVjdGVkU3RlcC52YWxpZGF0aW9uRnVuYyh0aGlzLCBzZWxlY3RlZFN0ZXBFbGVtZW50LCB0aGlzLnNlbGVjdGVkU3RlcC5hYm9ydENvbnRyb2xsZXIuc2lnbmFsKTsKICAgICAgfQogICAgICB0aGlzLnNjcm9sbGVyLnRvKHNjcm9sbFBvc2l0aW9uKTsKICAgIH0KICAgIGFzeW5jIGdvQmFjaygpIHsKICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5zdGVwcy5maW5kSW5kZXgoKHN0ZXBBcmcpID0+IHN0ZXBBcmcgPT09IHRoaXMuc2VsZWN0ZWRTdGVwKTsKICAgICAgaWYgKGN1cnJlbnRJbmRleCA8PSAwKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLnNlbGVjdGVkU3RlcC5hYm9ydENvbnRyb2xsZXIpIHsKICAgICAgICB0aGlzLnNlbGVjdGVkU3RlcC5hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTsKICAgICAgfQogICAgICBjb25zdCBjdXJyZW50U3RlcCA9IHRoaXMuc3RlcHNbY3VycmVudEluZGV4XTsKICAgICAgY3VycmVudFN0ZXAudmFsaWRhdGlvbkZ1bmNDYWxsZWQgPSBmYWxzZTsKICAgICAgY29uc3QgcHJldmlvdXNTdGVwID0gdGhpcy5zdGVwc1tjdXJyZW50SW5kZXggLSAxXTsKICAgICAgcHJldmlvdXNTdGVwLnZhbGlkYXRpb25GdW5jQ2FsbGVkID0gZmFsc2U7CiAgICAgIHRoaXMuc2VsZWN0ZWRTdGVwID0gcHJldmlvdXNTdGVwOwogICAgICBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgYXdhaXQgdGhpcy5kb210b29scy5jb252ZW5pZW5jZS5zbWFydGRlbGF5LmRlbGF5Rm9yKDEwMCk7CiAgICAgIHRoaXMuc2VsZWN0ZWRTdGVwLm9uUmV0dXJuVG9TdGVwRnVuYz8uKHRoaXMsIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuc2VsZWN0ZWQiKSk7CiAgICB9CiAgICBnb05leHQoKSB7CiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMuc3RlcHMuZmluZEluZGV4KChzdGVwQXJnKSA9PiBzdGVwQXJnID09PSB0aGlzLnNlbGVjdGVkU3RlcCk7CiAgICAgIGlmIChjdXJyZW50SW5kZXggPCAwIHx8IGN1cnJlbnRJbmRleCA+PSB0aGlzLnN0ZXBzLmxlbmd0aCAtIDEpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTdGVwLmFib3J0Q29udHJvbGxlcikgewogICAgICAgIHRoaXMuc2VsZWN0ZWRTdGVwLmFib3J0Q29udHJvbGxlci5hYm9ydCgpOwogICAgICB9CiAgICAgIGNvbnN0IGN1cnJlbnRTdGVwID0gdGhpcy5zdGVwc1tjdXJyZW50SW5kZXhdOwogICAgICBjdXJyZW50U3RlcC52YWxpZGF0aW9uRnVuY0NhbGxlZCA9IGZhbHNlOwogICAgICBjb25zdCBuZXh0U3RlcCA9IHRoaXMuc3RlcHNbY3VycmVudEluZGV4ICsgMV07CiAgICAgIG5leHRTdGVwLnZhbGlkYXRpb25GdW5jQ2FsbGVkID0gZmFsc2U7CiAgICAgIHRoaXMuc2VsZWN0ZWRTdGVwID0gbmV4dFN0ZXA7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczc0KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzU3RlcHBlcjIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW1lZGlhL2RlZXMtaW1hZ2Utdmlld2VyL2RlbW8uanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIGRlbW8gPSAoKSA9PiBiMmAKICA8c3R5bGU+CiAgICAuZGVtby1jb250YWluZXIgewogICAgICBwYWRkaW5nOiA0OHB4OwogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y4ZjlmYSIsICIjMGEwYTBhIil9OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDMycHg7CiAgICB9CgogICAgLnNlY3Rpb24gewogICAgICBtYXgtd2lkdGg6IDkwMHB4OwogICAgICB3aWR0aDogMTAwJTsKICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICB9CgogICAgLnNlY3Rpb24tdGl0bGUgewogICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICB9CgogICAgLnNlY3Rpb24tZGVzY3JpcHRpb24gewogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OwogICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgfQoKICAgIGRlZXMtaW1hZ2Utdmlld2VyIHsKICAgICAgaGVpZ2h0OiA0MDBweDsKICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgfQoKICAgIC5jb21wYWN0IHsKICAgICAgaGVpZ2h0OiAyNTBweDsKICAgIH0KICA8L3N0eWxlPgoKICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+SlBFRyBJbWFnZSB3aXRoIFRvb2xiYXI8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+QSBsYW5kc2NhcGUgcGhvdG8gd2l0aCB6b29tLCBwYW4sIGZpdCwgYW5kIGRvd25sb2FkIGNvbnRyb2xzLjwvZGl2PgogICAgICA8ZGVlcy1pbWFnZS12aWV3ZXIKICAgICAgICBzcmM9Imh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTA2NzQ0MDM4MTM2LTQ2MjczODM0YjNmYj93PTEyMDAiCiAgICAgICAgYWx0PSJNb3VudGFpbiBsYW5kc2NhcGUiCiAgICAgID48L2RlZXMtaW1hZ2Utdmlld2VyPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlBORyB3aXRoIFRyYW5zcGFyZW5jeTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5UcmFuc3BhcmVudCBQTkcgZGlzcGxheWVkIG9uIGEgY2hlY2tlcmJvYXJkIGJhY2tncm91bmQuPC9kaXY+CiAgICAgIDxkZWVzLWltYWdlLXZpZXdlcgogICAgICAgIHNyYz0iaHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy80LzQ3L1BOR190cmFuc3BhcmVuY3lfZGVtb25zdHJhdGlvbl8xLnBuZyIKICAgICAgICBhbHQ9IlBORyB0cmFuc3BhcmVuY3kgZGVtbyIKICAgICAgPjwvZGVlcy1pbWFnZS12aWV3ZXI+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+U1ZHIEltYWdlPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPlNjYWxhYmxlIHZlY3RvciBncmFwaGljLjwvZGl2PgogICAgICA8ZGVlcy1pbWFnZS12aWV3ZXIKICAgICAgICBzcmM9Imh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvMC8wMi9TVkdfbG9nby5zdmciCiAgICAgICAgYWx0PSJTVkcgbG9nbyIKICAgICAgICBmaXQ9ImNvbnRhaW4iCiAgICAgID48L2RlZXMtaW1hZ2Utdmlld2VyPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPk5vIFRvb2xiYXIgVmFyaWFudDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5JbWFnZSB2aWV3ZXIgd2l0aCB0aGUgdG9vbGJhciBoaWRkZW4uPC9kaXY+CiAgICAgIDxkZWVzLWltYWdlLXZpZXdlcgogICAgICAgIGNsYXNzPSJjb21wYWN0IgogICAgICAgIHNyYz0iaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0Njk0NzQ5NjgwMjgtNTY2MjNmMDJlNDJlP3c9ODAwIgogICAgICAgIGFsdD0iTmF0dXJlIHNjZW5lIgogICAgICAgIC5zaG93VG9vbGJhcj0ke2ZhbHNlfQogICAgICA+PC9kZWVzLWltYWdlLXZpZXdlcj4KICAgIDwvZGl2PgogIDwvZGl2PgpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW1lZGlhL2RlZXMtaW1hZ2Utdmlld2VyL2NvbXBvbmVudC5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2RlZXNfaWNvbigpOwp2YXIgX19lc0RlY29yYXRlNzQgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczc1ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzSW1hZ2VWaWV3ZXIgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtaW1hZ2Utdmlld2VyIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfc3JjX2RlY29yYXRvcnM7CiAgbGV0IF9zcmNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zcmNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FsdF9kZWNvcmF0b3JzOwogIGxldCBfYWx0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWx0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maXRfZGVjb3JhdG9yczsKICBsZXQgX2ZpdF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ZpdF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1Rvb2xiYXJfZGVjb3JhdG9yczsKICBsZXQgX3Nob3dUb29sYmFyX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1Rvb2xiYXJfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3pvb21fZGVjb3JhdG9yczsKICBsZXQgX3pvb21faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF96b29tX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wYW5YX2RlY29yYXRvcnM7CiAgbGV0IF9wYW5YX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcGFuWF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcGFuWV9kZWNvcmF0b3JzOwogIGxldCBfcGFuWV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BhbllfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzRHJhZ2dpbmdfZGVjb3JhdG9yczsKICBsZXQgX2lzRHJhZ2dpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0RyYWdnaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb2FkaW5nX2RlY29yYXRvcnM7CiAgbGV0IF9sb2FkaW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbG9hZGluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZXJyb3JfZGVjb3JhdG9yczsKICBsZXQgX2Vycm9yX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZXJyb3JfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ltYWdlTmF0dXJhbFdpZHRoX2RlY29yYXRvcnM7CiAgbGV0IF9pbWFnZU5hdHVyYWxXaWR0aF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ltYWdlTmF0dXJhbFdpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pbWFnZU5hdHVyYWxIZWlnaHRfZGVjb3JhdG9yczsKICBsZXQgX2ltYWdlTmF0dXJhbEhlaWdodF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ltYWdlTmF0dXJhbEhlaWdodF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzSW1hZ2VWaWV3ZXIyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfc3JjX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9hbHRfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX2ZpdF9kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfc2hvd1Rvb2xiYXJfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfem9vbV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfcGFuWF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfcGFuWV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaXNEcmFnZ2luZ19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfbG9hZGluZ19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfZXJyb3JfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2ltYWdlTmF0dXJhbFdpZHRoX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pbWFnZU5hdHVyYWxIZWlnaHRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlNzQodGhpcywgbnVsbCwgX3NyY19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzcmMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNyYyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zcmMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNyYyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zcmNfaW5pdGlhbGl6ZXJzLCBfc3JjX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzQodGhpcywgbnVsbCwgX2FsdF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhbHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFsdCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hbHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFsdCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hbHRfaW5pdGlhbGl6ZXJzLCBfYWx0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzQodGhpcywgbnVsbCwgX2ZpdF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJmaXQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZpdCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5maXQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmZpdCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9maXRfaW5pdGlhbGl6ZXJzLCBfZml0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzQodGhpcywgbnVsbCwgX3Nob3dUb29sYmFyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dUb29sYmFyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93VG9vbGJhciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93VG9vbGJhciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd1Rvb2xiYXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd1Rvb2xiYXJfaW5pdGlhbGl6ZXJzLCBfc2hvd1Rvb2xiYXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3NCh0aGlzLCBudWxsLCBfem9vbV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ6b29tIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ6b29tIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnpvb20sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnpvb20gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfem9vbV9pbml0aWFsaXplcnMsIF96b29tX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzQodGhpcywgbnVsbCwgX3BhblhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicGFuWCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicGFuWCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5wYW5YLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5wYW5YID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3BhblhfaW5pdGlhbGl6ZXJzLCBfcGFuWF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc0KHRoaXMsIG51bGwsIF9wYW5ZX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInBhblkiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInBhblkiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucGFuWSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucGFuWSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wYW5ZX2luaXRpYWxpemVycywgX3BhbllfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3NCh0aGlzLCBudWxsLCBfaXNEcmFnZ2luZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc0RyYWdnaW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc0RyYWdnaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzRHJhZ2dpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzRHJhZ2dpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNEcmFnZ2luZ19pbml0aWFsaXplcnMsIF9pc0RyYWdnaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzQodGhpcywgbnVsbCwgX2xvYWRpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibG9hZGluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibG9hZGluZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sb2FkaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5sb2FkaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xvYWRpbmdfaW5pdGlhbGl6ZXJzLCBfbG9hZGluZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc0KHRoaXMsIG51bGwsIF9lcnJvcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJlcnJvciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZXJyb3IiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZXJyb3IsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmVycm9yID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Vycm9yX2luaXRpYWxpemVycywgX2Vycm9yX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzQodGhpcywgbnVsbCwgX2ltYWdlTmF0dXJhbFdpZHRoX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImltYWdlTmF0dXJhbFdpZHRoIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpbWFnZU5hdHVyYWxXaWR0aCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pbWFnZU5hdHVyYWxXaWR0aCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaW1hZ2VOYXR1cmFsV2lkdGggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaW1hZ2VOYXR1cmFsV2lkdGhfaW5pdGlhbGl6ZXJzLCBfaW1hZ2VOYXR1cmFsV2lkdGhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3NCh0aGlzLCBudWxsLCBfaW1hZ2VOYXR1cmFsSGVpZ2h0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImltYWdlTmF0dXJhbEhlaWdodCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaW1hZ2VOYXR1cmFsSGVpZ2h0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmltYWdlTmF0dXJhbEhlaWdodCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaW1hZ2VOYXR1cmFsSGVpZ2h0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2ltYWdlTmF0dXJhbEhlaWdodF9pbml0aWFsaXplcnMsIF9pbWFnZU5hdHVyYWxIZWlnaHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3NChudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNJbWFnZVZpZXdlcjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIk1lZGlhIl07CiAgICAjc3JjX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF9zcmNfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICBnZXQgc3JjKCkgewogICAgICByZXR1cm4gdGhpcy4jc3JjX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc3JjKHZhbHVlMikgewogICAgICB0aGlzLiNzcmNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhbHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF9zcmNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF9hbHRfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGFsdCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FsdF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFsdCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYWx0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZml0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfYWx0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfZml0X2luaXRpYWxpemVycywgImNvbnRhaW4iKSk7CiAgICBnZXQgZml0KCkgewogICAgICByZXR1cm4gdGhpcy4jZml0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZml0KHZhbHVlMikgewogICAgICB0aGlzLiNmaXRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93VG9vbGJhcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzUodGhpcywgX2ZpdF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzUodGhpcywgX3Nob3dUb29sYmFyX2luaXRpYWxpemVycywgdHJ1ZSkpOwogICAgZ2V0IHNob3dUb29sYmFyKCkgewogICAgICByZXR1cm4gdGhpcy4jc2hvd1Rvb2xiYXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93VG9vbGJhcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2hvd1Rvb2xiYXJfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN6b29tX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfc2hvd1Rvb2xiYXJfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF96b29tX2luaXRpYWxpemVycywgMSkpOwogICAgZ2V0IHpvb20oKSB7CiAgICAgIHJldHVybiB0aGlzLiN6b29tX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgem9vbSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jem9vbV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3BhblhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF96b29tX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfcGFuWF9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBwYW5YKCkgewogICAgICByZXR1cm4gdGhpcy4jcGFuWF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHBhblgodmFsdWUyKSB7CiAgICAgIHRoaXMuI3BhblhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNwYW5ZX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfcGFuWF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzUodGhpcywgX3BhbllfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgcGFuWSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3BhbllfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwYW5ZKHZhbHVlMikgewogICAgICB0aGlzLiNwYW5ZX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNEcmFnZ2luZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzUodGhpcywgX3BhbllfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF9pc0RyYWdnaW5nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc0RyYWdnaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNEcmFnZ2luZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzRHJhZ2dpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzRHJhZ2dpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfaXNEcmFnZ2luZ19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzUodGhpcywgX2xvYWRpbmdfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgbG9hZGluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsb2FkaW5nKHZhbHVlMikgewogICAgICB0aGlzLiNsb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZXJyb3JfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc1KHRoaXMsIF9sb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfZXJyb3JfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGVycm9yKCkgewogICAgICByZXR1cm4gdGhpcy4jZXJyb3JfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBlcnJvcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jZXJyb3JfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpbWFnZU5hdHVyYWxXaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzUodGhpcywgX2Vycm9yX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfaW1hZ2VOYXR1cmFsV2lkdGhfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgaW1hZ2VOYXR1cmFsV2lkdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpbWFnZU5hdHVyYWxXaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGltYWdlTmF0dXJhbFdpZHRoKHZhbHVlMikgewogICAgICB0aGlzLiNpbWFnZU5hdHVyYWxXaWR0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2ltYWdlTmF0dXJhbEhlaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzUodGhpcywgX2ltYWdlTmF0dXJhbFdpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3NSh0aGlzLCBfaW1hZ2VOYXR1cmFsSGVpZ2h0X2luaXRpYWxpemVycywgMCkpOwogICAgZ2V0IGltYWdlTmF0dXJhbEhlaWdodCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2ltYWdlTmF0dXJhbEhlaWdodF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGltYWdlTmF0dXJhbEhlaWdodCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaW1hZ2VOYXR1cmFsSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBkcmFnU3RhcnRYID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzUodGhpcywgX2ltYWdlTmF0dXJhbEhlaWdodF9leHRyYUluaXRpYWxpemVycyksIDApOwogICAgZHJhZ1N0YXJ0WSA9IDA7CiAgICBkcmFnU3RhcnRQYW5YID0gMDsKICAgIGRyYWdTdGFydFBhblkgPSAwOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxzdHlsZT4KICAgICAgICA6aG9zdCB7CiAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICB9CgogICAgICAgIC52aWV3ZXItY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk3JSkiLCAiaHNsKDIxNSAyMCUgMTAlKSIpfTsKICAgICAgICB9CgogICAgICAgIC50b29sYmFyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICBnYXA6IDE2cHg7CiAgICAgICAgICBwYWRkaW5nOiAwIDE2cHg7CiAgICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICJoc2woMjE1IDIwJSAxNSUpIil9OwogICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgImhzbCgyMTcgMjUlIDIyJSkiKX07CiAgICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB9CgogICAgICAgIC50b29sYmFyLWdyb3VwIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgZ2FwOiA0cHg7CiAgICAgICAgfQoKICAgICAgICAudG9vbGJhci1idXR0b24gewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDQ1JSkiLCAiaHNsKDIxNSAxNiUgNzUlKSIpfTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIH0KCiAgICAgICAgLnRvb2xiYXItYnV0dG9uIGRlZXMtaWNvbiB7CiAgICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgfQoKICAgICAgICAudG9vbGJhci1idXR0b246aG92ZXIgewogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQgMzElIDkyJSkiLCAiaHNsKDIxNyAyNSUgMjIlKSIpfTsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICAgIH0KCiAgICAgICAgLnRvb2xiYXItYnV0dG9uOmFjdGl2ZSB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjM2YzZjQ2Iil9OwogICAgICAgIH0KCiAgICAgICAgLnpvb20tbGV2ZWwgewogICAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICAgIG1pbi13aWR0aDogNDhweDsKICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAxNiUgNDUlKSIsICJoc2woMjE1IDE2JSA3NSUpIil9OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIH0KCiAgICAgICAgLmltYWdlLWFyZWEgewogICAgICAgICAgZmxleDogMTsKICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICBjdXJzb3I6ICR7dGhpcy56b29tID4gMSA/IHRoaXMuaXNEcmFnZ2luZyA/ICJncmFiYmluZyIgOiAiZ3JhYiIgOiAiZGVmYXVsdCJ9OwogICAgICAgIH0KCiAgICAgICAgLmNoZWNrZXJib2FyZCB7CiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICBpbnNldDogMDsKICAgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6CiAgICAgICAgICAgIGxpbmVhci1ncmFkaWVudCg0NWRlZywgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmMGYwZjAiLCAiIzFhMWExYSIpfSAyNSUsIHRyYW5zcGFyZW50IDI1JSksCiAgICAgICAgICAgIGxpbmVhci1ncmFkaWVudCgtNDVkZWcsICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjBmMGYwIiwgIiMxYTFhMWEiKX0gMjUlLCB0cmFuc3BhcmVudCAyNSUpLAogICAgICAgICAgICBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHRyYW5zcGFyZW50IDc1JSwgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmMGYwZjAiLCAiIzFhMWExYSIpfSA3NSUpLAogICAgICAgICAgICBsaW5lYXItZ3JhZGllbnQoLTQ1ZGVnLCB0cmFuc3BhcmVudCA3NSUsICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjBmMGYwIiwgIiMxYTFhMWEiKX0gNzUlKTsKICAgICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTZweCAxNnB4OwogICAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwLCAwIDhweCwgOHB4IC04cHgsIC04cHggMHB4OwogICAgICAgICAgb3BhY2l0eTogMC4zOwogICAgICAgIH0KCiAgICAgICAgLmltYWdlLXdyYXBwZXIgewogICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgaW5zZXQ6IDA7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoJHt0aGlzLnBhblh9cHgsICR7dGhpcy5wYW5ZfXB4KSBzY2FsZSgke3RoaXMuem9vbX0pOwogICAgICAgICAgdHJhbnNpdGlvbjogJHt0aGlzLmlzRHJhZ2dpbmcgPyAibm9uZSIgOiAidHJhbnNmb3JtIDAuMnMgZWFzZSJ9OwogICAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICB9CgogICAgICAgIC5pbWFnZS13cmFwcGVyIGltZyB7CiAgICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgICAgICAgb2JqZWN0LWZpdDogJHt0aGlzLmZpdH07CiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAgIC13ZWJraXQtdXNlci1kcmFnOiBub25lOwogICAgICAgIH0KCiAgICAgICAgLmltYWdlLXdyYXBwZXIgaW1nLmFjdHVhbCB7CiAgICAgICAgICBtYXgtd2lkdGg6IG5vbmU7CiAgICAgICAgICBtYXgtaGVpZ2h0OiBub25lOwogICAgICAgICAgb2JqZWN0LWZpdDogbm9uZTsKICAgICAgICB9CgogICAgICAgIC5sb2FkaW5nLW92ZXJsYXkgewogICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgaW5zZXQ6IDA7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMjU1LDI1NSwyNTUsMC44KSIsICJyZ2JhKDAsMCwwLDAuNikiKX07CiAgICAgICAgfQoKICAgICAgICAubG9hZGluZy1zcGlubmVyIHsKICAgICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgICAgYm9yZGVyOiAzcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzNmM2Y0NiIpfTsKICAgICAgICAgIGJvcmRlci10b3AtY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiM2MGE1ZmEiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgICBhbmltYXRpb246IHNwaW4gMC44cyBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgfQoKICAgICAgICBAa2V5ZnJhbWVzIHNwaW4gewogICAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9CiAgICAgICAgfQoKICAgICAgICAuZXJyb3Itb3ZlcmxheSB7CiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICBpbnNldDogMDsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgICAgICB9CgogICAgICAgIC5lcnJvci1vdmVybGF5IC5lcnJvci1pY29uIHsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2RjMjYyNiIsICIjZjg3MTcxIil9OwogICAgICAgICAgZm9udC1zaXplOiAzMnB4OwogICAgICAgIH0KCiAgICAgICAgLmVycm9yLXRleHQgewogICAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIH0KCiAgICAgICAgLmltYWdlLWluZm8gewogICAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjYTFhMWFhIiwgIiM3MTcxN2EiKX07CiAgICAgICAgICBwYWRkaW5nOiAwIDRweDsKICAgICAgICB9CiAgICAgIDwvc3R5bGU+CgogICAgICA8ZGl2IGNsYXNzPSJ2aWV3ZXItY29udGFpbmVyIj4KICAgICAgICAke3RoaXMuc2hvd1Rvb2xiYXIgPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sYmFyLWdyb3VwIj4KICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJ0b29sYmFyLWJ1dHRvbiIgQGNsaWNrPSR7dGhpcy56b29tT3V0fSB0aXRsZT0iWm9vbSBvdXQiPgogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6Wm9vbU91dCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idG9vbGJhci1idXR0b24iIEBjbGljaz0ke3RoaXMucmVzZXRab29tfT4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6b29tLWxldmVsIj4ke01hdGgucm91bmQodGhpcy56b29tICogMTAwKX0lPC9zcGFuPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InRvb2xiYXItYnV0dG9uIiBAY2xpY2s9JHt0aGlzLnpvb21Jbn0gdGl0bGU9Ilpvb20gaW4iPgogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6Wm9vbUluIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItZ3JvdXAiPgogICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InRvb2xiYXItYnV0dG9uIiBAY2xpY2s9JHt0aGlzLmZpdFRvU2NyZWVufSB0aXRsZT0iRml0IHRvIHNjcmVlbiI+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpNYXhpbWl6ZSI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idG9vbGJhci1idXR0b24iIEBjbGljaz0ke3RoaXMuYWN0dWFsU2l6ZX0gdGl0bGU9IkFjdHVhbCBzaXplICgxMDAlKSI+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpTY2FuIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItZ3JvdXAiPgogICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InRvb2xiYXItYnV0dG9uIiBAY2xpY2s9JHt0aGlzLmRvd25sb2FkfSB0aXRsZT0iRG93bmxvYWQiPgogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6RG93bmxvYWQiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgJHt0aGlzLmltYWdlTmF0dXJhbFdpZHRoID4gMCA/IGIyYAogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItZ3JvdXAiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImltYWdlLWluZm8iPiR7dGhpcy5pbWFnZU5hdHVyYWxXaWR0aH0geCAke3RoaXMuaW1hZ2VOYXR1cmFsSGVpZ2h0fTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYCA6ICIifQogICAgICAgICAgPC9kaXY+CiAgICAgICAgYCA6ICIifQoKICAgICAgICA8ZGl2CiAgICAgICAgICBjbGFzcz0iaW1hZ2UtYXJlYSIKICAgICAgICAgIEB3aGVlbD0ke3RoaXMuaGFuZGxlV2hlZWx9CiAgICAgICAgICBAbW91c2Vkb3duPSR7dGhpcy5oYW5kbGVNb3VzZURvd259CiAgICAgICAgICBAbW91c2Vtb3ZlPSR7dGhpcy5oYW5kbGVNb3VzZU1vdmV9CiAgICAgICAgICBAbW91c2V1cD0ke3RoaXMuaGFuZGxlTW91c2VVcH0KICAgICAgICAgIEBtb3VzZWxlYXZlPSR7dGhpcy5oYW5kbGVNb3VzZVVwfQogICAgICAgICAgQGRibGNsaWNrPSR7dGhpcy5oYW5kbGVEb3VibGVDbGlja30KICAgICAgICA+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjaGVja2VyYm9hcmQiPjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaW1hZ2Utd3JhcHBlciI+CiAgICAgICAgICAgICR7dGhpcy5zcmMgPyBiMmAKICAgICAgICAgICAgICA8aW1nCiAgICAgICAgICAgICAgICBjbGFzcz0iJHt0aGlzLmZpdCA9PT0gImFjdHVhbCIgPyAiYWN0dWFsIiA6ICIifSIKICAgICAgICAgICAgICAgIHNyYz0iJHt0aGlzLnNyY30iCiAgICAgICAgICAgICAgICBhbHQ9IiR7dGhpcy5hbHR9IgogICAgICAgICAgICAgICAgQGxvYWQ9JHt0aGlzLmhhbmRsZUltYWdlTG9hZH0KICAgICAgICAgICAgICAgIEBlcnJvcj0ke3RoaXMuaGFuZGxlSW1hZ2VFcnJvcn0KICAgICAgICAgICAgICAgIGRyYWdnYWJsZT0iZmFsc2UiCiAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgYCA6ICIifQogICAgICAgICAgPC9kaXY+CiAgICAgICAgICAke3RoaXMubG9hZGluZyAmJiB0aGlzLnNyYyA/IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2FkaW5nLW92ZXJsYXkiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxvYWRpbmctc3Bpbm5lciI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYCA6ICIifQogICAgICAgICAgJHt0aGlzLmVycm9yID8gYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVycm9yLW92ZXJsYXkiPgogICAgICAgICAgICAgIDxkZWVzLWljb24gY2xhc3M9ImVycm9yLWljb24iIGljb249Imx1Y2lkZTpJbWFnZU9mZiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yLXRleHQiPiR7dGhpcy5lcnJvcn08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYCA6ICIifQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICB6b29tSW4oKSB7CiAgICAgIHRoaXMuem9vbSA9IE1hdGgubWluKDEwLCB0aGlzLnpvb20gKiAxLjI1KTsKICAgIH0KICAgIHpvb21PdXQoKSB7CiAgICAgIHRoaXMuem9vbSA9IE1hdGgubWF4KDAuMSwgdGhpcy56b29tIC8gMS4yNSk7CiAgICAgIGlmICh0aGlzLnpvb20gPD0gMSkgewogICAgICAgIHRoaXMucGFuWCA9IDA7CiAgICAgICAgdGhpcy5wYW5ZID0gMDsKICAgICAgfQogICAgfQogICAgcmVzZXRab29tKCkgewogICAgICB0aGlzLnpvb20gPSAxOwogICAgICB0aGlzLnBhblggPSAwOwogICAgICB0aGlzLnBhblkgPSAwOwogICAgfQogICAgZml0VG9TY3JlZW4oKSB7CiAgICAgIHRoaXMuem9vbSA9IDE7CiAgICAgIHRoaXMucGFuWCA9IDA7CiAgICAgIHRoaXMucGFuWSA9IDA7CiAgICAgIHRoaXMuZml0ID0gImNvbnRhaW4iOwogICAgfQogICAgYWN0dWFsU2l6ZSgpIHsKICAgICAgdGhpcy56b29tID0gMTsKICAgICAgdGhpcy5wYW5YID0gMDsKICAgICAgdGhpcy5wYW5ZID0gMDsKICAgICAgdGhpcy5maXQgPSAiYWN0dWFsIjsKICAgIH0KICAgIGRvd25sb2FkKCkgewogICAgICBpZiAoIXRoaXMuc3JjKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgbGluazMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CiAgICAgIGxpbmszLmhyZWYgPSB0aGlzLnNyYzsKICAgICAgbGluazMuZG93bmxvYWQgPSB0aGlzLnNyYy5zcGxpdCgiLyIpLnBvcCgpIHx8ICJpbWFnZSI7CiAgICAgIGxpbmszLmNsaWNrKCk7CiAgICB9CiAgICBoYW5kbGVJbWFnZUxvYWQoZTExKSB7CiAgICAgIGNvbnN0IGltZyA9IGUxMS50YXJnZXQ7CiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICB0aGlzLmVycm9yID0gIiI7CiAgICAgIHRoaXMuaW1hZ2VOYXR1cmFsV2lkdGggPSBpbWcubmF0dXJhbFdpZHRoOwogICAgICB0aGlzLmltYWdlTmF0dXJhbEhlaWdodCA9IGltZy5uYXR1cmFsSGVpZ2h0OwogICAgfQogICAgaGFuZGxlSW1hZ2VFcnJvcigpIHsKICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICAgIHRoaXMuZXJyb3IgPSAiRmFpbGVkIHRvIGxvYWQgaW1hZ2UiOwogICAgfQogICAgaGFuZGxlV2hlZWwoZTExKSB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb25zdCBkZWx0YSA9IGUxMS5kZWx0YVkgPiAwID8gMC45IDogMS4xOwogICAgICBjb25zdCBuZXdab29tID0gTWF0aC5taW4oMTAsIE1hdGgubWF4KDAuMSwgdGhpcy56b29tICogZGVsdGEpKTsKICAgICAgdGhpcy56b29tID0gbmV3Wm9vbTsKICAgICAgaWYgKHRoaXMuem9vbSA8PSAxKSB7CiAgICAgICAgdGhpcy5wYW5YID0gMDsKICAgICAgICB0aGlzLnBhblkgPSAwOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVNb3VzZURvd24oZTExKSB7CiAgICAgIGlmICh0aGlzLnpvb20gPD0gMSkKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7CiAgICAgIHRoaXMuZHJhZ1N0YXJ0WCA9IGUxMS5jbGllbnRYOwogICAgICB0aGlzLmRyYWdTdGFydFkgPSBlMTEuY2xpZW50WTsKICAgICAgdGhpcy5kcmFnU3RhcnRQYW5YID0gdGhpcy5wYW5YOwogICAgICB0aGlzLmRyYWdTdGFydFBhblkgPSB0aGlzLnBhblk7CiAgICB9CiAgICBoYW5kbGVNb3VzZU1vdmUoZTExKSB7CiAgICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5wYW5YID0gdGhpcy5kcmFnU3RhcnRQYW5YICsgKGUxMS5jbGllbnRYIC0gdGhpcy5kcmFnU3RhcnRYKTsKICAgICAgdGhpcy5wYW5ZID0gdGhpcy5kcmFnU3RhcnRQYW5ZICsgKGUxMS5jbGllbnRZIC0gdGhpcy5kcmFnU3RhcnRZKTsKICAgIH0KICAgIGhhbmRsZU1vdXNlVXAoKSB7CiAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlOwogICAgfQogICAgaGFuZGxlRG91YmxlQ2xpY2soKSB7CiAgICAgIGlmICh0aGlzLnpvb20gPT09IDEpIHsKICAgICAgICB0aGlzLnpvb20gPSAyOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuem9vbSA9IDE7CiAgICAgICAgdGhpcy5wYW5YID0gMDsKICAgICAgICB0aGlzLnBhblkgPSAwOwogICAgICB9CiAgICB9CiAgICB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJzcmMiKSkgewogICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7CiAgICAgICAgdGhpcy5lcnJvciA9ICIiOwogICAgICAgIHRoaXMuem9vbSA9IDE7CiAgICAgICAgdGhpcy5wYW5YID0gMDsKICAgICAgICB0aGlzLnBhblkgPSAwOwogICAgICAgIHRoaXMuaW1hZ2VOYXR1cmFsV2lkdGggPSAwOwogICAgICAgIHRoaXMuaW1hZ2VOYXR1cmFsSGVpZ2h0ID0gMDsKICAgICAgfQogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM3NShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc0ltYWdlVmlld2VyMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy1hdWRpby12aWV3ZXIvZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtbzIgPSAoKSA9PiBiMmAKICA8c3R5bGU+CiAgICAuZGVtby1jb250YWluZXIgewogICAgICBwYWRkaW5nOiA0OHB4OwogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y4ZjlmYSIsICIjMGEwYTBhIil9OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDMycHg7CiAgICB9CgogICAgLnNlY3Rpb24gewogICAgICBtYXgtd2lkdGg6IDYwMHB4OwogICAgICB3aWR0aDogMTAwJTsKICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICB9CgogICAgLnNlY3Rpb24tdGl0bGUgewogICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICB9CgogICAgLnNlY3Rpb24tZGVzY3JpcHRpb24gewogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OwogICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgfQoKICAgIGRlZXMtYXVkaW8tdmlld2VyIHsKICAgICAgaGVpZ2h0OiAyMDBweDsKICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgfQogIDwvc3R5bGU+CgogIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5BdWRpbyB3aXRoIFdhdmVmb3JtPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPkF1ZGlvIHBsYXllciB3aXRoIHdhdmVmb3JtIHZpc3VhbGl6YXRpb24gYW5kIGZ1bGwgdHJhbnNwb3J0IGNvbnRyb2xzLjwvZGl2PgogICAgICA8ZGVlcy1hdWRpby12aWV3ZXIKICAgICAgICBzcmM9Imh0dHBzOi8vd3d3LnNvdW5kaGVsaXguY29tL2V4YW1wbGVzL21wMy9Tb3VuZEhlbGl4LVNvbmctMS5tcDMiCiAgICAgICAgdGl0bGU9IlNvdW5kSGVsaXggU29uZyAxIgogICAgICAgIGFydGlzdD0iVC4gU2NodWVyZ2VyIgogICAgICA+PC9kZWVzLWF1ZGlvLXZpZXdlcj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5BdWRpbyB3aXRob3V0IFdhdmVmb3JtPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPlNpbXBsZSBhdWRpbyBwbGF5ZXIgd2l0aCBhIHNlZWtiYXIgaW5zdGVhZCBvZiBhIHdhdmVmb3JtLjwvZGl2PgogICAgICA8ZGVlcy1hdWRpby12aWV3ZXIKICAgICAgICBzcmM9Imh0dHBzOi8vd3d3LnNvdW5kaGVsaXguY29tL2V4YW1wbGVzL21wMy9Tb3VuZEhlbGl4LVNvbmctMi5tcDMiCiAgICAgICAgdGl0bGU9IlNvdW5kSGVsaXggU29uZyAyIgogICAgICAgIC5zaG93V2F2ZWZvcm09JHtmYWxzZX0KICAgICAgPjwvZGVlcy1hdWRpby12aWV3ZXI+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+TWluaW1hbCBBdWRpbyBQbGF5ZXI8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+Tm8gdGl0bGUgb3IgYXJ0aXN0IG1ldGFkYXRhIOKAlCBqdXN0IHRoZSBwbGF5ZXIuPC9kaXY+CiAgICAgIDxkZWVzLWF1ZGlvLXZpZXdlcgogICAgICAgIHNyYz0iaHR0cHM6Ly93d3cuc291bmRoZWxpeC5jb20vZXhhbXBsZXMvbXAzL1NvdW5kSGVsaXgtU29uZy0zLm1wMyIKICAgICAgPjwvZGVlcy1hdWRpby12aWV3ZXI+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLWF1ZGlvLXZpZXdlci9jb21wb25lbnQuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF9kZWVzX2ljb24oKTsKdmFyIF9fZXNEZWNvcmF0ZTc1ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM3NiA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc0F1ZGlvVmlld2VyID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLWF1ZGlvLXZpZXdlciIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3NyY19kZWNvcmF0b3JzOwogIGxldCBfc3JjX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc3JjX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90aXRsZV9kZWNvcmF0b3JzOwogIGxldCBfdGl0bGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90aXRsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYXJ0aXN0X2RlY29yYXRvcnM7CiAgbGV0IF9hcnRpc3RfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hcnRpc3RfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dXYXZlZm9ybV9kZWNvcmF0b3JzOwogIGxldCBfc2hvd1dhdmVmb3JtX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1dhdmVmb3JtX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdXRvcGxheV9kZWNvcmF0b3JzOwogIGxldCBfYXV0b3BsYXlfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdXRvcGxheV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbG9vcF9kZWNvcmF0b3JzOwogIGxldCBfbG9vcF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xvb3BfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzUGxheWluZ19kZWNvcmF0b3JzOwogIGxldCBfaXNQbGF5aW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNQbGF5aW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50VGltZV9kZWNvcmF0b3JzOwogIGxldCBfY3VycmVudFRpbWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50VGltZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZHVyYXRpb25fZGVjb3JhdG9yczsKICBsZXQgX2R1cmF0aW9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZHVyYXRpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZvbHVtZV9kZWNvcmF0b3JzOwogIGxldCBfdm9sdW1lX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdm9sdW1lX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc011dGVkX2RlY29yYXRvcnM7CiAgbGV0IF9pc011dGVkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNNdXRlZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbG9hZGluZ19kZWNvcmF0b3JzOwogIGxldCBfbG9hZGluZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Vycm9yX2RlY29yYXRvcnM7CiAgbGV0IF9lcnJvcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Vycm9yX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF93YXZlZm9ybURhdGFfZGVjb3JhdG9yczsKICBsZXQgX3dhdmVmb3JtRGF0YV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3dhdmVmb3JtRGF0YV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfd2F2ZWZvcm1SZWFkeV9kZWNvcmF0b3JzOwogIGxldCBfd2F2ZWZvcm1SZWFkeV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3dhdmVmb3JtUmVhZHlfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc0F1ZGlvVmlld2VyMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3NyY19kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfdGl0bGVfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX2FydGlzdF9kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfc2hvd1dhdmVmb3JtX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2F1dG9wbGF5X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2xvb3BfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfaXNQbGF5aW5nX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9jdXJyZW50VGltZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfZHVyYXRpb25fZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3ZvbHVtZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaXNNdXRlZF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfbG9hZGluZ19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfZXJyb3JfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3dhdmVmb3JtRGF0YV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfd2F2ZWZvcm1SZWFkeV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGU3NSh0aGlzLCBudWxsLCBfc3JjX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNyYyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic3JjIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNyYywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc3JjID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NyY19pbml0aWFsaXplcnMsIF9zcmNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3NSh0aGlzLCBudWxsLCBfdGl0bGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGl0bGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRpdGxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRpdGxlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50aXRsZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90aXRsZV9pbml0aWFsaXplcnMsIF90aXRsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc1KHRoaXMsIG51bGwsIF9hcnRpc3RfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYXJ0aXN0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhcnRpc3QiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYXJ0aXN0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hcnRpc3QgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYXJ0aXN0X2luaXRpYWxpemVycywgX2FydGlzdF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc1KHRoaXMsIG51bGwsIF9zaG93V2F2ZWZvcm1fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2hvd1dhdmVmb3JtIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93V2F2ZWZvcm0iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2hvd1dhdmVmb3JtLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaG93V2F2ZWZvcm0gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd1dhdmVmb3JtX2luaXRpYWxpemVycywgX3Nob3dXYXZlZm9ybV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc1KHRoaXMsIG51bGwsIF9hdXRvcGxheV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhdXRvcGxheSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYXV0b3BsYXkiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYXV0b3BsYXksIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmF1dG9wbGF5ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2F1dG9wbGF5X2luaXRpYWxpemVycywgX2F1dG9wbGF5X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzUodGhpcywgbnVsbCwgX2xvb3BfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibG9vcCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibG9vcCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sb29wLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5sb29wID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xvb3BfaW5pdGlhbGl6ZXJzLCBfbG9vcF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc1KHRoaXMsIG51bGwsIF9pc1BsYXlpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNQbGF5aW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc1BsYXlpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNQbGF5aW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc1BsYXlpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNQbGF5aW5nX2luaXRpYWxpemVycywgX2lzUGxheWluZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc1KHRoaXMsIG51bGwsIF9jdXJyZW50VGltZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjdXJyZW50VGltZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3VycmVudFRpbWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3VycmVudFRpbWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmN1cnJlbnRUaW1lID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2N1cnJlbnRUaW1lX2luaXRpYWxpemVycywgX2N1cnJlbnRUaW1lX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzUodGhpcywgbnVsbCwgX2R1cmF0aW9uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImR1cmF0aW9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkdXJhdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5kdXJhdGlvbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZHVyYXRpb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZHVyYXRpb25faW5pdGlhbGl6ZXJzLCBfZHVyYXRpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3NSh0aGlzLCBudWxsLCBfdm9sdW1lX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZvbHVtZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidm9sdW1lIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZvbHVtZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudm9sdW1lID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZvbHVtZV9pbml0aWFsaXplcnMsIF92b2x1bWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3NSh0aGlzLCBudWxsLCBfaXNNdXRlZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc011dGVkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc011dGVkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzTXV0ZWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzTXV0ZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNNdXRlZF9pbml0aWFsaXplcnMsIF9pc011dGVkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzUodGhpcywgbnVsbCwgX2xvYWRpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibG9hZGluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibG9hZGluZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sb2FkaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5sb2FkaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xvYWRpbmdfaW5pdGlhbGl6ZXJzLCBfbG9hZGluZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc1KHRoaXMsIG51bGwsIF9lcnJvcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJlcnJvciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZXJyb3IiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZXJyb3IsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmVycm9yID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Vycm9yX2luaXRpYWxpemVycywgX2Vycm9yX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzUodGhpcywgbnVsbCwgX3dhdmVmb3JtRGF0YV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ3YXZlZm9ybURhdGEiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIndhdmVmb3JtRGF0YSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai53YXZlZm9ybURhdGEsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLndhdmVmb3JtRGF0YSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF93YXZlZm9ybURhdGFfaW5pdGlhbGl6ZXJzLCBfd2F2ZWZvcm1EYXRhX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzUodGhpcywgbnVsbCwgX3dhdmVmb3JtUmVhZHlfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAid2F2ZWZvcm1SZWFkeSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAid2F2ZWZvcm1SZWFkeSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai53YXZlZm9ybVJlYWR5LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai53YXZlZm9ybVJlYWR5ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3dhdmVmb3JtUmVhZHlfaW5pdGlhbGl6ZXJzLCBfd2F2ZWZvcm1SZWFkeV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc1KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc0F1ZGlvVmlld2VyMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW8yOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIk1lZGlhIl07CiAgICAjc3JjX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczc2KHRoaXMsIF9zcmNfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICBnZXQgc3JjKCkgewogICAgICByZXR1cm4gdGhpcy4jc3JjX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc3JjKHZhbHVlMikgewogICAgICB0aGlzLiNzcmNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN0aXRsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzYodGhpcywgX3NyY19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzYodGhpcywgX3RpdGxlX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCB0aXRsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RpdGxlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdGl0bGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3RpdGxlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYXJ0aXN0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Nih0aGlzLCBfdGl0bGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc2KHRoaXMsIF9hcnRpc3RfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGFydGlzdCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FydGlzdF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFydGlzdCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYXJ0aXN0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd1dhdmVmb3JtX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Nih0aGlzLCBfYXJ0aXN0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Nih0aGlzLCBfc2hvd1dhdmVmb3JtX2luaXRpYWxpemVycywgdHJ1ZSkpOwogICAgZ2V0IHNob3dXYXZlZm9ybSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dXYXZlZm9ybV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNob3dXYXZlZm9ybSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2hvd1dhdmVmb3JtX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYXV0b3BsYXlfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc2KHRoaXMsIF9zaG93V2F2ZWZvcm1fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc2KHRoaXMsIF9hdXRvcGxheV9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgYXV0b3BsYXkoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhdXRvcGxheV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGF1dG9wbGF5KHZhbHVlMikgewogICAgICB0aGlzLiNhdXRvcGxheV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2xvb3BfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc2KHRoaXMsIF9hdXRvcGxheV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzYodGhpcywgX2xvb3BfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGxvb3AoKSB7CiAgICAgIHJldHVybiB0aGlzLiNsb29wX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbG9vcCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbG9vcF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzUGxheWluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzYodGhpcywgX2xvb3BfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc2KHRoaXMsIF9pc1BsYXlpbmdfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGlzUGxheWluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzUGxheWluZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzUGxheWluZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXNQbGF5aW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY3VycmVudFRpbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc2KHRoaXMsIF9pc1BsYXlpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc2KHRoaXMsIF9jdXJyZW50VGltZV9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBjdXJyZW50VGltZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRUaW1lX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY3VycmVudFRpbWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2N1cnJlbnRUaW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZHVyYXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc2KHRoaXMsIF9jdXJyZW50VGltZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzYodGhpcywgX2R1cmF0aW9uX2luaXRpYWxpemVycywgMCkpOwogICAgZ2V0IGR1cmF0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy4jZHVyYXRpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkdXJhdGlvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jZHVyYXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN2b2x1bWVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc2KHRoaXMsIF9kdXJhdGlvbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzYodGhpcywgX3ZvbHVtZV9pbml0aWFsaXplcnMsIDEpKTsKICAgIGdldCB2b2x1bWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2b2x1bWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB2b2x1bWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3ZvbHVtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzTXV0ZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc2KHRoaXMsIF92b2x1bWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc2KHRoaXMsIF9pc011dGVkX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc011dGVkKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNNdXRlZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzTXV0ZWQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzTXV0ZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Nih0aGlzLCBfaXNNdXRlZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzYodGhpcywgX2xvYWRpbmdfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGxvYWRpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNsb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbG9hZGluZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2Vycm9yX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Nih0aGlzLCBfbG9hZGluZ19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzYodGhpcywgX2Vycm9yX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBlcnJvcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2Vycm9yX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZXJyb3IodmFsdWUyKSB7CiAgICAgIHRoaXMuI2Vycm9yX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjd2F2ZWZvcm1EYXRhX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Nih0aGlzLCBfZXJyb3JfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc2KHRoaXMsIF93YXZlZm9ybURhdGFfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IHdhdmVmb3JtRGF0YSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3dhdmVmb3JtRGF0YV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHdhdmVmb3JtRGF0YSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jd2F2ZWZvcm1EYXRhX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjd2F2ZWZvcm1SZWFkeV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzYodGhpcywgX3dhdmVmb3JtRGF0YV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzYodGhpcywgX3dhdmVmb3JtUmVhZHlfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHdhdmVmb3JtUmVhZHkoKSB7CiAgICAgIHJldHVybiB0aGlzLiN3YXZlZm9ybVJlYWR5X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgd2F2ZWZvcm1SZWFkeSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jd2F2ZWZvcm1SZWFkeV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgYXVkaW9FbGVtZW50ID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzYodGhpcywgX3dhdmVmb3JtUmVhZHlfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgIGNhbnZhc0VsZW1lbnQgPSBudWxsOwogICAgYW5pbUZyYW1lSWQgPSAwOwogICAgdm9sdW1lQmVmb3JlTXV0ZSA9IDE7CiAgICByZW5kZXIoKSB7CiAgICAgIGNvbnN0IHRpdGxlVGV4dCA9IHRoaXMudGl0bGUgJiYgdGhpcy5hcnRpc3QgPyBgJHt0aGlzLnRpdGxlfSBcdTIwMTQgJHt0aGlzLmFydGlzdH1gIDogdGhpcy50aXRsZSB8fCB0aGlzLmFydGlzdCB8fCAiIjsKICAgICAgcmV0dXJuIGIyYAogICAgICA8c3R5bGU+CiAgICAgICAgOmhvc3QgewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBSb2JvdG8sIHNhbnMtc2VyaWY7CiAgICAgICAgfQoKICAgICAgICAudmlld2VyLWNvbnRhaW5lciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NyUpIiwgImhzbCgyMTUgMjAlIDEwJSkiKX07CiAgICAgICAgfQoKICAgICAgICAudG9vbGJhciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGdhcDogMTZweDsKICAgICAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgImhzbCgyMTUgMjAlIDE1JSkiKX07CiAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiaHNsKDIxNyAyNSUgMjIlKSIpfTsKICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIH0KCiAgICAgICAgLnRvb2xiYXItZ3JvdXAgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBnYXA6IDRweDsKICAgICAgICB9CgogICAgICAgIC50b29sYmFyLWdyb3VwLS1lbmQgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBnYXA6IDRweDsKICAgICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgICAgIH0KCiAgICAgICAgLnRvb2xiYXItYnV0dG9uIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDE2JSA0NSUpIiwgImhzbCgyMTUgMTYlIDc1JSkiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIH0KCiAgICAgICAgLnRvb2xiYXItYnV0dG9uIGRlZXMtaWNvbiB7CiAgICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgfQoKICAgICAgICAudG9vbGJhci1idXR0b246aG92ZXIgewogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQgMzElIDkyJSkiLCAiaHNsKDIxNyAyNSUgMjIlKSIpfTsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzA5MDkwYiIsICIjZmFmYWZhIil9OwogICAgICAgIH0KCiAgICAgICAgLnRvb2xiYXItYnV0dG9uOmFjdGl2ZSB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjM2YzZjQ2Iil9OwogICAgICAgIH0KCiAgICAgICAgLnRvb2xiYXItYnV0dG9uLmFjdGl2ZSB7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTcgOTElIDYwJSkiLCAiaHNsKDIxMyA5MyUgNjglKSIpfTsKICAgICAgICB9CgogICAgICAgIC50b29sYmFyLXRpdGxlIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDQ1JSkiLCAiaHNsKDIxNSAxNiUgNzUlKSIpfTsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgICAgfQoKICAgICAgICAudGltZS1kaXNwbGF5IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDE2JSA0NSUpIiwgImhzbCgyMTUgMTYlIDc1JSkiKX07CiAgICAgICAgICBtaW4td2lkdGg6IDkwcHg7CiAgICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB9CgogICAgICAgIC52b2x1bWUtZ3JvdXAgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBnYXA6IDRweDsKICAgICAgICB9CgogICAgICAgIC52b2x1bWUtc2xpZGVyIHsKICAgICAgICAgIHdpZHRoOiA3MHB4OwogICAgICAgICAgaGVpZ2h0OiA0cHg7CiAgICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICBhcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQgMzElIDkxJSkiLCAiaHNsKDIxNyAyNSUgMjIlKSIpfTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgfQoKICAgICAgICAudm9sdW1lLXNsaWRlcjo6LXdlYmtpdC1zbGlkZXItdGh1bWIgewogICAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgd2lkdGg6IDEycHg7CiAgICAgICAgICBoZWlnaHQ6IDEycHg7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgNjAlKSIsICJoc2woMjEzIDkzJSA2OCUpIil9OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIH0KCiAgICAgICAgLnZvbHVtZS1zbGlkZXI6Oi1tb3otcmFuZ2UtdGh1bWIgewogICAgICAgICAgd2lkdGg6IDEycHg7CiAgICAgICAgICBoZWlnaHQ6IDEycHg7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgNjAlKSIsICJoc2woMjEzIDkzJSA2OCUpIil9OwogICAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIH0KCiAgICAgICAgLmNvbnRlbnQtYXJlYSB7CiAgICAgICAgICBmbGV4OiAxOwogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgfQoKICAgICAgICAud2F2ZWZvcm0tY29udGFpbmVyIHsKICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgIGluc2V0OiAwOwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB9CgogICAgICAgIC53YXZlZm9ybS1jb250YWluZXIgY2FudmFzIHsKICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgfQoKICAgICAgICAuc2Vla2Jhci1jb250YWluZXIgewogICAgICAgICAgd2lkdGg6IDgwJTsKICAgICAgICAgIG1heC13aWR0aDogNjAwcHg7CiAgICAgICAgICBoZWlnaHQ6IDZweDsKICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0IDMxJSA5MSUpIiwgImhzbCgyMTcgMjUlIDIyJSkiKX07CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIH0KCiAgICAgICAgLnNlZWtiYXItZmlsbCB7CiAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgNjAlKSIsICJoc2woMjEzIDkzJSA2OCUpIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgICAgdHJhbnNpdGlvbjogd2lkdGggMC4xcyBsaW5lYXI7CiAgICAgICAgfQoKICAgICAgICAuZXJyb3Itb3ZlcmxheSB7CiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICBpbnNldDogMDsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgICAgICB9CgogICAgICAgIC5lcnJvci1vdmVybGF5IC5lcnJvci1pY29uIHsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2RjMjYyNiIsICIjZjg3MTcxIil9OwogICAgICAgICAgZm9udC1zaXplOiAzMnB4OwogICAgICAgIH0KCiAgICAgICAgLmVycm9yLXRleHQgewogICAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIH0KCiAgICAgICAgLmxvYWRpbmctb3ZlcmxheSB7CiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICBpbnNldDogMDsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgfQoKICAgICAgICAubG9hZGluZy1zcGlubmVyIHsKICAgICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgICAgYm9yZGVyOiAzcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQgMzElIDg2JSkiLCAiaHNsKDIxNyAyNSUgMjglKSIpfTsKICAgICAgICAgIGJvcmRlci10b3AtY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE3IDkxJSA2MCUpIiwgImhzbCgyMTMgOTMlIDY4JSkiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgICBhbmltYXRpb246IHNwaW4gMC44cyBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgfQoKICAgICAgICBAa2V5ZnJhbWVzIHNwaW4gewogICAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9CiAgICAgICAgfQogICAgICA8L3N0eWxlPgoKICAgICAgPGRpdiBjbGFzcz0idmlld2VyLWNvbnRhaW5lciI+CiAgICAgICAgPGRpdiBjbGFzcz0idG9vbGJhciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sYmFyLWdyb3VwIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idG9vbGJhci1idXR0b24iIEBjbGljaz0ke3RoaXMudG9nZ2xlUGxheX0+CiAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6JHt0aGlzLmlzUGxheWluZyA/ICJQYXVzZSIgOiAiUGxheSJ9Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0aW1lLWRpc3BsYXkiPgogICAgICAgICAgICAgICR7dGhpcy5mb3JtYXRUaW1lKHRoaXMuY3VycmVudFRpbWUpfSAvICR7dGhpcy5mb3JtYXRUaW1lKHRoaXMuZHVyYXRpb24pfQogICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAke3RpdGxlVGV4dCA/IGIyYAogICAgICAgICAgICA8c3BhbiBjbGFzcz0idG9vbGJhci10aXRsZSI+JHt0aXRsZVRleHR9PC9zcGFuPgogICAgICAgICAgYCA6ICIifQoKICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItZ3JvdXAtLWVuZCI+CiAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICBjbGFzcz0idG9vbGJhci1idXR0b24gJHt0aGlzLmxvb3AgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgICAgICBAY2xpY2s9JHt0aGlzLnRvZ2dsZUxvb3B9CiAgICAgICAgICAgICAgdGl0bGU9Ikxvb3AiCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpSZXBlYXQiPjwvZGVlcy1pY29uPgogICAgICAgICAgICA8L2J1dHRvbj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InZvbHVtZS1ncm91cCI+CiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idG9vbGJhci1idXR0b24iIEBjbGljaz0ke3RoaXMudG9nZ2xlTXV0ZX0gdGl0bGU9IiR7dGhpcy5pc011dGVkID8gIlVubXV0ZSIgOiAiTXV0ZSJ9Ij4KICAgICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOiR7dGhpcy5pc011dGVkIHx8IHRoaXMudm9sdW1lID09PSAwID8gIlZvbHVtZVgiIDogdGhpcy52b2x1bWUgPCAwLjUgPyAiVm9sdW1lMSIgOiAiVm9sdW1lMiJ9Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgICAgIGNsYXNzPSJ2b2x1bWUtc2xpZGVyIgogICAgICAgICAgICAgICAgdHlwZT0icmFuZ2UiCiAgICAgICAgICAgICAgICBtaW49IjAiCiAgICAgICAgICAgICAgICBtYXg9IjEiCiAgICAgICAgICAgICAgICBzdGVwPSIwLjAxIgogICAgICAgICAgICAgICAgLnZhbHVlPSR7U3RyaW5nKHRoaXMuaXNNdXRlZCA/IDAgOiB0aGlzLnZvbHVtZSl9CiAgICAgICAgICAgICAgICBAaW5wdXQ9JHt0aGlzLmhhbmRsZVZvbHVtZUNoYW5nZX0KICAgICAgICAgICAgICAvPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50LWFyZWEiPgogICAgICAgICAgJHt0aGlzLmVycm9yID8gYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVycm9yLW92ZXJsYXkiPgogICAgICAgICAgICAgIDxkZWVzLWljb24gY2xhc3M9ImVycm9yLWljb24iIGljb249Imx1Y2lkZTpNdXNpY09mZiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yLXRleHQiPiR7dGhpcy5lcnJvcn08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYCA6IHRoaXMubG9hZGluZyA/IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2FkaW5nLW92ZXJsYXkiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxvYWRpbmctc3Bpbm5lciI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYCA6IHRoaXMuc2hvd1dhdmVmb3JtID8gYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IndhdmVmb3JtLWNvbnRhaW5lciIgQGNsaWNrPSR7dGhpcy5oYW5kbGVXYXZlZm9ybUNsaWNrfT4KICAgICAgICAgICAgICA8Y2FudmFzPjwvY2FudmFzPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGAgOiBiMmAKICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2Vla2Jhci1jb250YWluZXIiIEBjbGljaz0ke3RoaXMuaGFuZGxlU2Vla2JhckNsaWNrfT4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWVrYmFyLWZpbGwiIHN0eWxlPSJ3aWR0aDogJHt0aGlzLmR1cmF0aW9uID8gdGhpcy5jdXJyZW50VGltZSAvIHRoaXMuZHVyYXRpb24gKiAxMDAgOiAwfSUiPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGB9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBpZiAodGhpcy5zcmMpIHsKICAgICAgICB0aGlzLmluaXRBdWRpbygpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgdGhpcy5jbGVhbnVwKCk7CiAgICB9CiAgICBhc3luYyB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJzcmMiKSAmJiB0aGlzLnNyYykgewogICAgICAgIHRoaXMuY2xlYW51cCgpOwogICAgICAgIHRoaXMuaW5pdEF1ZGlvKCk7CiAgICAgIH0KICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygid2F2ZWZvcm1EYXRhIikgfHwgY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJjdXJyZW50VGltZSIpKSB7CiAgICAgICAgdGhpcy5kcmF3V2F2ZWZvcm0oKTsKICAgICAgfQogICAgfQogICAgcGxheSgpIHsKICAgICAgdGhpcy5hdWRpb0VsZW1lbnQ/LnBsYXkoKTsKICAgIH0KICAgIHBhdXNlKCkgewogICAgICB0aGlzLmF1ZGlvRWxlbWVudD8ucGF1c2UoKTsKICAgIH0KICAgIHRvZ2dsZVBsYXkoKSB7CiAgICAgIGlmICh0aGlzLmlzUGxheWluZykgewogICAgICAgIHRoaXMucGF1c2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnBsYXkoKTsKICAgICAgfQogICAgfQogICAgc2Vlayh0aW1lKSB7CiAgICAgIGlmICh0aGlzLmF1ZGlvRWxlbWVudCkgewogICAgICAgIHRoaXMuYXVkaW9FbGVtZW50LmN1cnJlbnRUaW1lID0gdGltZTsKICAgICAgfQogICAgfQogICAgc2V0Vm9sdW1lKHY2KSB7CiAgICAgIHRoaXMudm9sdW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdjYpKTsKICAgICAgaWYgKHRoaXMuYXVkaW9FbGVtZW50KSB7CiAgICAgICAgdGhpcy5hdWRpb0VsZW1lbnQudm9sdW1lID0gdGhpcy52b2x1bWU7CiAgICAgIH0KICAgICAgaWYgKHRoaXMudm9sdW1lID4gMCkgewogICAgICAgIHRoaXMuaXNNdXRlZCA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICB0b2dnbGVNdXRlKCkgewogICAgICBpZiAodGhpcy5pc011dGVkKSB7CiAgICAgICAgdGhpcy5pc011dGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy52b2x1bWUgPSB0aGlzLnZvbHVtZUJlZm9yZU11dGUgfHwgMC41OwogICAgICAgIGlmICh0aGlzLmF1ZGlvRWxlbWVudCkgewogICAgICAgICAgdGhpcy5hdWRpb0VsZW1lbnQudm9sdW1lID0gdGhpcy52b2x1bWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMudm9sdW1lQmVmb3JlTXV0ZSA9IHRoaXMudm9sdW1lOwogICAgICAgIHRoaXMuaXNNdXRlZCA9IHRydWU7CiAgICAgICAgaWYgKHRoaXMuYXVkaW9FbGVtZW50KSB7CiAgICAgICAgICB0aGlzLmF1ZGlvRWxlbWVudC52b2x1bWUgPSAwOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdG9nZ2xlTG9vcCgpIHsKICAgICAgdGhpcy5sb29wID0gIXRoaXMubG9vcDsKICAgICAgaWYgKHRoaXMuYXVkaW9FbGVtZW50KSB7CiAgICAgICAgdGhpcy5hdWRpb0VsZW1lbnQubG9vcCA9IHRoaXMubG9vcDsKICAgICAgfQogICAgfQogICAgaW5pdEF1ZGlvKCkgewogICAgICB0aGlzLmF1ZGlvRWxlbWVudCA9IG5ldyBBdWRpbygpOwogICAgICB0aGlzLmF1ZGlvRWxlbWVudC5jcm9zc09yaWdpbiA9ICJhbm9ueW1vdXMiOwogICAgICB0aGlzLmF1ZGlvRWxlbWVudC5zcmMgPSB0aGlzLnNyYzsKICAgICAgdGhpcy5hdWRpb0VsZW1lbnQudm9sdW1lID0gdGhpcy5pc011dGVkID8gMCA6IHRoaXMudm9sdW1lOwogICAgICB0aGlzLmF1ZGlvRWxlbWVudC5sb29wID0gdGhpcy5sb29wOwogICAgICB0aGlzLmF1ZGlvRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsICgpID0+IHsKICAgICAgICB0aGlzLmR1cmF0aW9uID0gdGhpcy5hdWRpb0VsZW1lbnQuZHVyYXRpb247CiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICAgIH0pOwogICAgICB0aGlzLmF1ZGlvRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJwbGF5IiwgKCkgPT4gewogICAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTsKICAgICAgICB0aGlzLnN0YXJ0VGltZVVwZGF0ZSgpOwogICAgICB9KTsKICAgICAgdGhpcy5hdWRpb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicGF1c2UiLCAoKSA9PiB7CiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTsKICAgICAgICB0aGlzLnN0b3BUaW1lVXBkYXRlKCk7CiAgICAgIH0pOwogICAgICB0aGlzLmF1ZGlvRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsICgpID0+IHsKICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlOwogICAgICAgIHRoaXMuc3RvcFRpbWVVcGRhdGUoKTsKICAgICAgfSk7CiAgICAgIHRoaXMuYXVkaW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwgKCkgPT4gewogICAgICAgIHRoaXMuZXJyb3IgPSAiRmFpbGVkIHRvIGxvYWQgYXVkaW8iOwogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICB9KTsKICAgICAgdGhpcy5hdWRpb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsICgpID0+IHsKICAgICAgICB0aGlzLmN1cnJlbnRUaW1lID0gdGhpcy5hdWRpb0VsZW1lbnQuY3VycmVudFRpbWU7CiAgICAgIH0pOwogICAgICBpZiAodGhpcy5hdXRvcGxheSkgewogICAgICAgIHRoaXMuYXVkaW9FbGVtZW50LnBsYXkoKS5jYXRjaCgoKSA9PiB7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuc2hvd1dhdmVmb3JtKSB7CiAgICAgICAgdGhpcy5sb2FkV2F2ZWZvcm0oKTsKICAgICAgfQogICAgfQogICAgYXN5bmMgbG9hZFdhdmVmb3JtKCkgewogICAgICB0cnkgewogICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7CiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0aGlzLnNyYyk7CiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpOwogICAgICAgIGNvbnN0IGF1ZGlvQ29udGV4dCA9IG5ldyBBdWRpb0NvbnRleHQoKTsKICAgICAgICBjb25zdCBhdWRpb0J1ZmZlciA9IGF3YWl0IGF1ZGlvQ29udGV4dC5kZWNvZGVBdWRpb0RhdGEoYXJyYXlCdWZmZXIpOwogICAgICAgIGNvbnN0IGNoYW5uZWxEYXRhID0gYXVkaW9CdWZmZXIuZ2V0Q2hhbm5lbERhdGEoMCk7CiAgICAgICAgY29uc3QgYmFycyA9IDIwMDsKICAgICAgICBjb25zdCBibG9ja1NpemUgPSBNYXRoLmZsb29yKGNoYW5uZWxEYXRhLmxlbmd0aCAvIGJhcnMpOwogICAgICAgIGNvbnN0IHdhdmVmb3JtID0gW107CiAgICAgICAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgYmFyczsgaTExKyspIHsKICAgICAgICAgIGxldCBzdW0gPSAwOwogICAgICAgICAgZm9yIChsZXQgajQgPSAwOyBqNCA8IGJsb2NrU2l6ZTsgajQrKykgewogICAgICAgICAgICBzdW0gKz0gTWF0aC5hYnMoY2hhbm5lbERhdGFbaTExICogYmxvY2tTaXplICsgajRdKTsKICAgICAgICAgIH0KICAgICAgICAgIHdhdmVmb3JtLnB1c2goc3VtIC8gYmxvY2tTaXplKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWF4MyA9IE1hdGgubWF4KC4uLndhdmVmb3JtKTsKICAgICAgICB0aGlzLndhdmVmb3JtRGF0YSA9IHdhdmVmb3JtLm1hcCgodjYpID0+IG1heDMgPiAwID8gdjYgLyBtYXgzIDogMCk7CiAgICAgICAgdGhpcy53YXZlZm9ybVJlYWR5ID0gdHJ1ZTsKICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgICBhd2FpdCBhdWRpb0NvbnRleHQuY2xvc2UoKTsKICAgICAgfSBjYXRjaCB7CiAgICAgICAgdGhpcy53YXZlZm9ybVJlYWR5ID0gZmFsc2U7CiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGRyYXdXYXZlZm9ybSgpIHsKICAgICAgaWYgKCF0aGlzLnNob3dXYXZlZm9ybSB8fCAhdGhpcy53YXZlZm9ybVJlYWR5KQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCJjYW52YXMiKTsKICAgICAgaWYgKCFjYW52YXMpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLmNhbnZhc0VsZW1lbnQgPSBjYW52YXM7CiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGNhbnZhcy5wYXJlbnRFbGVtZW50OwogICAgICBjb25zdCBkcHIgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxOwogICAgICBjb25zdCB3aWR0aCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aDsKICAgICAgY29uc3QgaGVpZ2h0ID0gY29udGFpbmVyLmNsaWVudEhlaWdodDsKICAgICAgY2FudmFzLndpZHRoID0gd2lkdGggKiBkcHI7CiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBkcHI7CiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICBpZiAoIWN0eCkKICAgICAgICByZXR1cm47CiAgICAgIGN0eC5zY2FsZShkcHIsIGRwcik7CiAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7CiAgICAgIGNvbnN0IGJhcnMgPSB0aGlzLndhdmVmb3JtRGF0YS5sZW5ndGg7CiAgICAgIGlmIChiYXJzID09PSAwKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgYmFyV2lkdGggPSB3aWR0aCAvIGJhcnM7CiAgICAgIGNvbnN0IHBsYXllZFJhdGlvID0gdGhpcy5kdXJhdGlvbiA+IDAgPyB0aGlzLmN1cnJlbnRUaW1lIC8gdGhpcy5kdXJhdGlvbiA6IDA7CiAgICAgIGNvbnN0IHBsYXllZEJhcnMgPSBNYXRoLmZsb29yKHBsYXllZFJhdGlvICogYmFycyk7CiAgICAgIGNvbnN0IGlzRGFyayA9IGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0aGVtZS1kYXJrIikgfHwgd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykiKS5tYXRjaGVzOwogICAgICBjb25zdCBwbGF5ZWRDb2xvciA9IGlzRGFyayA/ICJoc2woMjEzIDkzJSA2OCUpIiA6ICJoc2woMjE3IDkxJSA2MCUpIjsKICAgICAgY29uc3QgdW5wbGF5ZWRDb2xvciA9IGlzRGFyayA/ICJoc2woMjE3IDI1JSAyMiUpIiA6ICJoc2woMjE0IDMxJSA4NiUpIjsKICAgICAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgYmFyczsgaTExKyspIHsKICAgICAgICBjb25zdCBhbXBsaXR1ZGUgPSB0aGlzLndhdmVmb3JtRGF0YVtpMTFdOwogICAgICAgIGNvbnN0IGJhckhlaWdodCA9IE1hdGgubWF4KDIsIGFtcGxpdHVkZSAqIChoZWlnaHQgLSA0KSk7CiAgICAgICAgY29uc3QgeDQgPSBpMTEgKiBiYXJXaWR0aDsKICAgICAgICBjb25zdCB5NSA9IChoZWlnaHQgLSBiYXJIZWlnaHQpIC8gMjsKICAgICAgICBjdHguZmlsbFN0eWxlID0gaTExIDwgcGxheWVkQmFycyA/IHBsYXllZENvbG9yIDogdW5wbGF5ZWRDb2xvcjsKICAgICAgICBjdHguZmlsbFJlY3QoeDQgKyAwLjUsIHk1LCBiYXJXaWR0aCAtIDEsIGJhckhlaWdodCk7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZVdhdmVmb3JtQ2xpY2soZTExKSB7CiAgICAgIGNvbnN0IHJlY3QgPSBlMTEuY3VycmVudFRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgcmF0aW8gPSAoZTExLmNsaWVudFggLSByZWN0LmxlZnQpIC8gcmVjdC53aWR0aDsKICAgICAgdGhpcy5zZWVrKHJhdGlvICogdGhpcy5kdXJhdGlvbik7CiAgICB9CiAgICBoYW5kbGVTZWVrYmFyQ2xpY2soZTExKSB7CiAgICAgIGNvbnN0IHJlY3QgPSBlMTEuY3VycmVudFRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgcmF0aW8gPSAoZTExLmNsaWVudFggLSByZWN0LmxlZnQpIC8gcmVjdC53aWR0aDsKICAgICAgdGhpcy5zZWVrKHJhdGlvICogdGhpcy5kdXJhdGlvbik7CiAgICB9CiAgICBoYW5kbGVWb2x1bWVDaGFuZ2UoZTExKSB7CiAgICAgIGNvbnN0IHZhbHVlMiA9IHBhcnNlRmxvYXQoZTExLnRhcmdldC52YWx1ZSk7CiAgICAgIHRoaXMuc2V0Vm9sdW1lKHZhbHVlMik7CiAgICB9CiAgICBzdGFydFRpbWVVcGRhdGUoKSB7CiAgICAgIHRoaXMuc3RvcFRpbWVVcGRhdGUoKTsKICAgICAgY29uc3QgdXBkYXRlID0gKCkgPT4gewogICAgICAgIGlmICh0aGlzLmF1ZGlvRWxlbWVudCAmJiB0aGlzLmlzUGxheWluZykgewogICAgICAgICAgdGhpcy5jdXJyZW50VGltZSA9IHRoaXMuYXVkaW9FbGVtZW50LmN1cnJlbnRUaW1lOwogICAgICAgICAgdGhpcy5hbmltRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh1cGRhdGUpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgdGhpcy5hbmltRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh1cGRhdGUpOwogICAgfQogICAgc3RvcFRpbWVVcGRhdGUoKSB7CiAgICAgIGlmICh0aGlzLmFuaW1GcmFtZUlkKSB7CiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5hbmltRnJhbWVJZCk7CiAgICAgICAgdGhpcy5hbmltRnJhbWVJZCA9IDA7CiAgICAgIH0KICAgIH0KICAgIGZvcm1hdFRpbWUoc2Vjb25kcykgewogICAgICBpZiAoIWlzRmluaXRlKHNlY29uZHMpIHx8IHNlY29uZHMgPCAwKQogICAgICAgIHJldHVybiAiMDowMCI7CiAgICAgIGNvbnN0IG1pbnMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7CiAgICAgIGNvbnN0IHNlY3MgPSBNYXRoLmZsb29yKHNlY29uZHMgJSA2MCk7CiAgICAgIHJldHVybiBgJHttaW5zfToke3NlY3MudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfWA7CiAgICB9CiAgICBjbGVhbnVwKCkgewogICAgICB0aGlzLnN0b3BUaW1lVXBkYXRlKCk7CiAgICAgIGlmICh0aGlzLmF1ZGlvRWxlbWVudCkgewogICAgICAgIHRoaXMuYXVkaW9FbGVtZW50LnBhdXNlKCk7CiAgICAgICAgdGhpcy5hdWRpb0VsZW1lbnQuc3JjID0gIiI7CiAgICAgICAgdGhpcy5hdWRpb0VsZW1lbnQgPSBudWxsOwogICAgICB9CiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7CiAgICAgIHRoaXMuY3VycmVudFRpbWUgPSAwOwogICAgICB0aGlzLmR1cmF0aW9uID0gMDsKICAgICAgdGhpcy53YXZlZm9ybURhdGEgPSBbXTsKICAgICAgdGhpcy53YXZlZm9ybVJlYWR5ID0gZmFsc2U7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczc2KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzQXVkaW9WaWV3ZXIyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXZpZGVvLXZpZXdlci9kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkZW1vMyA9ICgpID0+IGIyYAogIDxzdHlsZT4KICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgIHBhZGRpbmc6IDQ4cHg7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjhmOWZhIiwgIiMwYTBhMGEiKX07CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIGdhcDogMzJweDsKICAgIH0KCiAgICAuc2VjdGlvbiB7CiAgICAgIG1heC13aWR0aDogODAwcHg7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBtYXJnaW46IDAgYXV0bzsKICAgIH0KCiAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgIH0KCiAgICAuc2VjdGlvbi1kZXNjcmlwdGlvbiB7CiAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNzE3MTdhIiwgIiNhMWExYWEiKX07CiAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICB9CiAgPC9zdHlsZT4KCiAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlZpZGVvIHdpdGggQ3VzdG9tIENvbnRyb2xzPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPkEgdmlkZW8gcGxheWVyIHdpdGggb3ZlcmxheSBjb250cm9scywgc2Vla2luZywgYW5kIHZvbHVtZSBhZGp1c3RtZW50LjwvZGl2PgogICAgICA8ZGVlcy12aWRlby12aWV3ZXIKICAgICAgICBzcmM9Imh0dHBzOi8vY29tbW9uZGF0YXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZ3R2LXZpZGVvcy1idWNrZXQvc2FtcGxlL0JpZ0J1Y2tCdW5ueS5tcDQiCiAgICAgICAgcG9zdGVyPSJodHRwczovL2NvbW1vbmRhdGFzdG9yYWdlLmdvb2dsZWFwaXMuY29tL2d0di12aWRlb3MtYnVja2V0L3NhbXBsZS9pbWFnZXMvQmlnQnVja0J1bm55LmpwZyIKICAgICAgPjwvZGVlcy12aWRlby12aWV3ZXI+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+QXV0b3BsYXkgTXV0ZWQ8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+VmlkZW8gdGhhdCBhdXRvcGxheXMgbXV0ZWQsIGNvbW1vbmx5IHVzZWQgZm9yIHByZXZpZXdzLjwvZGl2PgogICAgICA8ZGVlcy12aWRlby12aWV3ZXIKICAgICAgICBzcmM9Imh0dHBzOi8vY29tbW9uZGF0YXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZ3R2LXZpZGVvcy1idWNrZXQvc2FtcGxlL0VsZXBoYW50c0RyZWFtLm1wNCIKICAgICAgICBwb3N0ZXI9Imh0dHBzOi8vY29tbW9uZGF0YXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZ3R2LXZpZGVvcy1idWNrZXQvc2FtcGxlL2ltYWdlcy9FbGVwaGFudHNEcmVhbS5qcGciCiAgICAgICAgLmF1dG9wbGF5PSR7dHJ1ZX0KICAgICAgICAubXV0ZWQ9JHt0cnVlfQogICAgICA+PC9kZWVzLXZpZGVvLXZpZXdlcj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5OYXRpdmUgQ29udHJvbHM8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+VmlkZW8gdXNpbmcgYnJvd3Nlci1uYXRpdmUgY29udHJvbHMgaW5zdGVhZCBvZiBjdXN0b20gb3ZlcmxheS48L2Rpdj4KICAgICAgPGRlZXMtdmlkZW8tdmlld2VyCiAgICAgICAgc3JjPSJodHRwczovL2NvbW1vbmRhdGFzdG9yYWdlLmdvb2dsZWFwaXMuY29tL2d0di12aWRlb3MtYnVja2V0L3NhbXBsZS9Gb3JCaWdnZXJCbGF6ZXMubXA0IgogICAgICAgIC5zaG93Q29udHJvbHM9JHtmYWxzZX0KICAgICAgPjwvZGVlcy12aWRlby12aWV3ZXI+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXZpZGVvLXZpZXdlci9jb21wb25lbnQuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF9kZWVzX2ljb24oKTsKdmFyIF9fZXNEZWNvcmF0ZTc2ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM3NyA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1ZpZGVvVmlld2VyID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLXZpZGVvLXZpZXdlciIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3NyY19kZWNvcmF0b3JzOwogIGxldCBfc3JjX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc3JjX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wb3N0ZXJfZGVjb3JhdG9yczsKICBsZXQgX3Bvc3Rlcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Bvc3Rlcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0NvbnRyb2xzX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93Q29udHJvbHNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93Q29udHJvbHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2F1dG9wbGF5X2RlY29yYXRvcnM7CiAgbGV0IF9hdXRvcGxheV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2F1dG9wbGF5X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb29wX2RlY29yYXRvcnM7CiAgbGV0IF9sb29wX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbG9vcF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbXV0ZWRfZGVjb3JhdG9yczsKICBsZXQgX211dGVkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbXV0ZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzUGxheWluZ19kZWNvcmF0b3JzOwogIGxldCBfaXNQbGF5aW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNQbGF5aW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50VGltZV9kZWNvcmF0b3JzOwogIGxldCBfY3VycmVudFRpbWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50VGltZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZHVyYXRpb25fZGVjb3JhdG9yczsKICBsZXQgX2R1cmF0aW9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZHVyYXRpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3ZvbHVtZV9kZWNvcmF0b3JzOwogIGxldCBfdm9sdW1lX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdm9sdW1lX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb2FkaW5nX2RlY29yYXRvcnM7CiAgbGV0IF9sb2FkaW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbG9hZGluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZXJyb3JfZGVjb3JhdG9yczsKICBsZXQgX2Vycm9yX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZXJyb3JfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzRnVsbHNjcmVlbl9kZWNvcmF0b3JzOwogIGxldCBfaXNGdWxsc2NyZWVuX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNGdWxsc2NyZWVuX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250cm9sc1Zpc2libGVfZGVjb3JhdG9yczsKICBsZXQgX2NvbnRyb2xzVmlzaWJsZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRyb2xzVmlzaWJsZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzVmlkZW9WaWV3ZXIyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfc3JjX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9wb3N0ZXJfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX3Nob3dDb250cm9sc19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9hdXRvcGxheV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9sb29wX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX211dGVkX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2lzUGxheWluZ19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfY3VycmVudFRpbWVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2R1cmF0aW9uX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF92b2x1bWVfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2xvYWRpbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2Vycm9yX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pc0Z1bGxzY3JlZW5fZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2NvbnRyb2xzVmlzaWJsZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGU3Nih0aGlzLCBudWxsLCBfc3JjX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNyYyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic3JjIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNyYywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc3JjID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NyY19pbml0aWFsaXplcnMsIF9zcmNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Nih0aGlzLCBudWxsLCBfcG9zdGVyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInBvc3RlciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicG9zdGVyIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnBvc3Rlciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucG9zdGVyID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Bvc3Rlcl9pbml0aWFsaXplcnMsIF9wb3N0ZXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Nih0aGlzLCBudWxsLCBfc2hvd0NvbnRyb2xzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dDb250cm9scyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd0NvbnRyb2xzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dDb250cm9scywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd0NvbnRyb2xzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dDb250cm9sc19pbml0aWFsaXplcnMsIF9zaG93Q29udHJvbHNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Nih0aGlzLCBudWxsLCBfYXV0b3BsYXlfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYXV0b3BsYXkiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImF1dG9wbGF5IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmF1dG9wbGF5LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hdXRvcGxheSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hdXRvcGxheV9pbml0aWFsaXplcnMsIF9hdXRvcGxheV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc2KHRoaXMsIG51bGwsIF9sb29wX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxvb3AiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImxvb3AiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubG9vcCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubG9vcCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9sb29wX2luaXRpYWxpemVycywgX2xvb3BfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Nih0aGlzLCBudWxsLCBfbXV0ZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibXV0ZWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm11dGVkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm11dGVkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tdXRlZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9tdXRlZF9pbml0aWFsaXplcnMsIF9tdXRlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc2KHRoaXMsIG51bGwsIF9pc1BsYXlpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNQbGF5aW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc1BsYXlpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNQbGF5aW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc1BsYXlpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNQbGF5aW5nX2luaXRpYWxpemVycywgX2lzUGxheWluZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc2KHRoaXMsIG51bGwsIF9jdXJyZW50VGltZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjdXJyZW50VGltZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3VycmVudFRpbWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3VycmVudFRpbWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmN1cnJlbnRUaW1lID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2N1cnJlbnRUaW1lX2luaXRpYWxpemVycywgX2N1cnJlbnRUaW1lX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzYodGhpcywgbnVsbCwgX2R1cmF0aW9uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImR1cmF0aW9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJkdXJhdGlvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5kdXJhdGlvbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZHVyYXRpb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZHVyYXRpb25faW5pdGlhbGl6ZXJzLCBfZHVyYXRpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Nih0aGlzLCBudWxsLCBfdm9sdW1lX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInZvbHVtZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidm9sdW1lIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnZvbHVtZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudm9sdW1lID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZvbHVtZV9pbml0aWFsaXplcnMsIF92b2x1bWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Nih0aGlzLCBudWxsLCBfbG9hZGluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsb2FkaW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsb2FkaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmxvYWRpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxvYWRpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbG9hZGluZ19pbml0aWFsaXplcnMsIF9sb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzYodGhpcywgbnVsbCwgX2Vycm9yX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImVycm9yIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJlcnJvciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5lcnJvciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZXJyb3IgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZXJyb3JfaW5pdGlhbGl6ZXJzLCBfZXJyb3JfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Nih0aGlzLCBudWxsLCBfaXNGdWxsc2NyZWVuX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzRnVsbHNjcmVlbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNGdWxsc2NyZWVuIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzRnVsbHNjcmVlbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNGdWxsc2NyZWVuID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzRnVsbHNjcmVlbl9pbml0aWFsaXplcnMsIF9pc0Z1bGxzY3JlZW5fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Nih0aGlzLCBudWxsLCBfY29udHJvbHNWaXNpYmxlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImNvbnRyb2xzVmlzaWJsZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29udHJvbHNWaXNpYmxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNvbnRyb2xzVmlzaWJsZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY29udHJvbHNWaXNpYmxlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbnRyb2xzVmlzaWJsZV9pbml0aWFsaXplcnMsIF9jb250cm9sc1Zpc2libGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3NihudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNWaWRlb1ZpZXdlcjIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vMzsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJNZWRpYSJdOwogICAgI3NyY19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM3Nyh0aGlzLCBfc3JjX2luaXRpYWxpemVycywgIiIpOwogICAgZ2V0IHNyYygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NyY19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNyYyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc3JjX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcG9zdGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Nyh0aGlzLCBfc3JjX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Nyh0aGlzLCBfcG9zdGVyX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBwb3N0ZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwb3N0ZXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwb3N0ZXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Bvc3Rlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dDb250cm9sc19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzcodGhpcywgX3Bvc3Rlcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzcodGhpcywgX3Nob3dDb250cm9sc19pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93Q29udHJvbHMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93Q29udHJvbHNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93Q29udHJvbHModmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dDb250cm9sc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2F1dG9wbGF5X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Nyh0aGlzLCBfc2hvd0NvbnRyb2xzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Nyh0aGlzLCBfYXV0b3BsYXlfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGF1dG9wbGF5KCkgewogICAgICByZXR1cm4gdGhpcy4jYXV0b3BsYXlfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhdXRvcGxheSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYXV0b3BsYXlfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsb29wX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Nyh0aGlzLCBfYXV0b3BsYXlfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc3KHRoaXMsIF9sb29wX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBsb29wKCkgewogICAgICByZXR1cm4gdGhpcy4jbG9vcF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxvb3AodmFsdWUyKSB7CiAgICAgIHRoaXMuI2xvb3BfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtdXRlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzcodGhpcywgX2xvb3BfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc3KHRoaXMsIF9tdXRlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgbXV0ZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtdXRlZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG11dGVkKHZhbHVlMikgewogICAgICB0aGlzLiNtdXRlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzUGxheWluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzcodGhpcywgX211dGVkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Nyh0aGlzLCBfaXNQbGF5aW5nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc1BsYXlpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc1BsYXlpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc1BsYXlpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzUGxheWluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2N1cnJlbnRUaW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Nyh0aGlzLCBfaXNQbGF5aW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Nyh0aGlzLCBfY3VycmVudFRpbWVfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgY3VycmVudFRpbWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjdXJyZW50VGltZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGN1cnJlbnRUaW1lKHZhbHVlMikgewogICAgICB0aGlzLiNjdXJyZW50VGltZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2R1cmF0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Nyh0aGlzLCBfY3VycmVudFRpbWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc3KHRoaXMsIF9kdXJhdGlvbl9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBkdXJhdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2R1cmF0aW9uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZHVyYXRpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI2R1cmF0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdm9sdW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Nyh0aGlzLCBfZHVyYXRpb25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc3KHRoaXMsIF92b2x1bWVfaW5pdGlhbGl6ZXJzLCAxKSk7CiAgICBnZXQgdm9sdW1lKCkgewogICAgICByZXR1cm4gdGhpcy4jdm9sdW1lX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdm9sdW1lKHZhbHVlMikgewogICAgICB0aGlzLiN2b2x1bWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3Nyh0aGlzLCBfdm9sdW1lX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Nyh0aGlzLCBfbG9hZGluZ19pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBsb2FkaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jbG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxvYWRpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNlcnJvcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzcodGhpcywgX2xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc3KHRoaXMsIF9lcnJvcl9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgZXJyb3IoKSB7CiAgICAgIHJldHVybiB0aGlzLiNlcnJvcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGVycm9yKHZhbHVlMikgewogICAgICB0aGlzLiNlcnJvcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzRnVsbHNjcmVlbl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzcodGhpcywgX2Vycm9yX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3Nyh0aGlzLCBfaXNGdWxsc2NyZWVuX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc0Z1bGxzY3JlZW4oKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc0Z1bGxzY3JlZW5fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc0Z1bGxzY3JlZW4odmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzRnVsbHNjcmVlbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NvbnRyb2xzVmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzcodGhpcywgX2lzRnVsbHNjcmVlbl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzcodGhpcywgX2NvbnRyb2xzVmlzaWJsZV9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBjb250cm9sc1Zpc2libGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb250cm9sc1Zpc2libGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjb250cm9sc1Zpc2libGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2NvbnRyb2xzVmlzaWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgaGlkZUNvbnRyb2xzVGltZXIgPSAoX19ydW5Jbml0aWFsaXplcnM3Nyh0aGlzLCBfY29udHJvbHNWaXNpYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgbnVsbCk7CiAgICB2aWRlb0VsZW1lbnQgPSBudWxsOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxzdHlsZT4KICAgICAgICA6aG9zdCB7CiAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICB9CgogICAgICAgIC52aWRlby1jb250YWluZXIgewogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICBhc3BlY3QtcmF0aW86IDE2IC8gOTsKICAgICAgICAgIGJhY2tncm91bmQ6ICMwMDAwMDA7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIH0KCiAgICAgICAgdmlkZW8gewogICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICBvYmplY3QtZml0OiBjb250YWluOwogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgfQoKICAgICAgICAub3ZlcmxheSB7CiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICBpbnNldDogMDsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB9CgogICAgICAgIC5jZW50ZXItcGxheSB7CiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICB0b3A6IDUwJTsKICAgICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgICAgICAgd2lkdGg6IDY0cHg7CiAgICAgICAgICBoZWlnaHQ6IDY0cHg7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICAgICAgICBjb2xvcjogI2ZmZmZmZjsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZSwgdHJhbnNmb3JtIDAuMnMgZWFzZTsKICAgICAgICAgIG9wYWNpdHk6ICR7dGhpcy5pc1BsYXlpbmcgPyAwIDogMX07CiAgICAgICAgICBwb2ludGVyLWV2ZW50czogJHt0aGlzLmlzUGxheWluZyA/ICJub25lIiA6ICJhdXRvIn07CiAgICAgICAgfQoKICAgICAgICAuY2VudGVyLXBsYXkgZGVlcy1pY29uIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMjhweDsKICAgICAgICB9CgogICAgICAgIC5jZW50ZXItcGxheTpob3ZlciB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuOCk7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSBzY2FsZSgxLjEpOwogICAgICAgIH0KCiAgICAgICAgLmNvbnRyb2xzLWJhciB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodHJhbnNwYXJlbnQsIHJnYmEoMCwgMCwgMCwgMC43KSk7CiAgICAgICAgICBwYWRkaW5nOiAyNHB4IDEycHggMTJweDsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgICBvcGFjaXR5OiAke3RoaXMuY29udHJvbHNWaXNpYmxlIHx8ICF0aGlzLmlzUGxheWluZyA/IDEgOiAwfTsKICAgICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcyBlYXNlOwogICAgICAgIH0KCiAgICAgICAgLnNlZWtiYXItcm93IHsKICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgaGVpZ2h0OiA0cHg7CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgfQoKICAgICAgICAuc2Vla2Jhci1yb3c6aG92ZXIgewogICAgICAgICAgaGVpZ2h0OiA2cHg7CiAgICAgICAgfQoKICAgICAgICAuc2Vla2Jhci1wcm9ncmVzcyB7CiAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjNjBhNWZhIil9OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgfQoKICAgICAgICAuY29udHJvbHMtcm93IHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgfQoKICAgICAgICAuY3RybC1idXR0b24gewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgICBjb2xvcjogI2ZmZmZmZjsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMgZWFzZTsKICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIH0KCiAgICAgICAgLmN0cmwtYnV0dG9uIGRlZXMtaWNvbiB7CiAgICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgfQoKICAgICAgICAuY3RybC1idXR0b246aG92ZXIgewogICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTsKICAgICAgICB9CgogICAgICAgIC50aW1lLWRpc3BsYXkgewogICAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgICAgICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7CiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIH0KCiAgICAgICAgLnNwYWNlciB7CiAgICAgICAgICBmbGV4OiAxOwogICAgICAgIH0KCiAgICAgICAgLnZvbHVtZS1ncm91cCB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGdhcDogNHB4OwogICAgICAgIH0KCiAgICAgICAgLnZvbHVtZS1zbGlkZXIgewogICAgICAgICAgd2lkdGg6IDYwcHg7CiAgICAgICAgICBoZWlnaHQ6IDRweDsKICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIH0KCiAgICAgICAgLnZvbHVtZS1zbGlkZXI6Oi13ZWJraXQtc2xpZGVyLXRodW1iIHsKICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgIHdpZHRoOiAxMnB4OwogICAgICAgICAgaGVpZ2h0OiAxMnB4OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjsKICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB9CgogICAgICAgIC52b2x1bWUtc2xpZGVyOjotbW96LXJhbmdlLXRodW1iIHsKICAgICAgICAgIHdpZHRoOiAxMnB4OwogICAgICAgICAgaGVpZ2h0OiAxMnB4OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjsKICAgICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB9CgogICAgICAgIC5sb2FkaW5nLW92ZXJsYXkgewogICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgaW5zZXQ6IDA7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgfQoKICAgICAgICAubG9hZGluZy1zcGlubmVyIHsKICAgICAgICAgIHdpZHRoOiA0MHB4OwogICAgICAgICAgaGVpZ2h0OiA0MHB4OwogICAgICAgICAgYm9yZGVyOiAzcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogI2ZmZmZmZjsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICAgIGFuaW1hdGlvbjogc3BpbiAwLjhzIGxpbmVhciBpbmZpbml0ZTsKICAgICAgICB9CgogICAgICAgIEBrZXlmcmFtZXMgc3BpbiB7CiAgICAgICAgICB0byB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH0KICAgICAgICB9CgogICAgICAgIC5lcnJvci1vdmVybGF5IHsKICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgIGluc2V0OiAwOwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICBnYXA6IDhweDsKICAgICAgICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7CiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICAgICAgfQoKICAgICAgICAuZXJyb3Itb3ZlcmxheSBkZWVzLWljb24gewogICAgICAgICAgY29sb3I6ICNmODcxNzE7CiAgICAgICAgICBmb250LXNpemU6IDMycHg7CiAgICAgICAgfQoKICAgICAgICAuZXJyb3ItdGV4dCB7CiAgICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgfQogICAgICA8L3N0eWxlPgoKICAgICAgPGRpdgogICAgICAgIGNsYXNzPSJ2aWRlby1jb250YWluZXIiCiAgICAgICAgQG1vdXNlbW92ZT0ke3RoaXMuaGFuZGxlTW91c2VNb3ZlfQogICAgICAgIEBtb3VzZWxlYXZlPSR7dGhpcy5oYW5kbGVNb3VzZUxlYXZlfQogICAgICA+CiAgICAgICAgPHZpZGVvCiAgICAgICAgICAuc3JjPSR7dGhpcy5zcmN9CiAgICAgICAgICAucG9zdGVyPSR7dGhpcy5wb3N0ZXJ9CiAgICAgICAgICAubXV0ZWQ9JHt0aGlzLm11dGVkfQogICAgICAgICAgLmxvb3A9JHt0aGlzLmxvb3B9CiAgICAgICAgICA/YXV0b3BsYXk9JHt0aGlzLmF1dG9wbGF5fQogICAgICAgICAgP2NvbnRyb2xzPSR7IXRoaXMuc2hvd0NvbnRyb2xzfQogICAgICAgICAgcGxheXNpbmxpbmUKICAgICAgICAgIEBsb2FkZWRtZXRhZGF0YT0ke3RoaXMuaGFuZGxlTG9hZGVkTWV0YWRhdGF9CiAgICAgICAgICBAcGxheT0ke3RoaXMuaGFuZGxlUGxheX0KICAgICAgICAgIEBwYXVzZT0ke3RoaXMuaGFuZGxlUGF1c2V9CiAgICAgICAgICBAZW5kZWQ9JHt0aGlzLmhhbmRsZUVuZGVkfQogICAgICAgICAgQHRpbWV1cGRhdGU9JHt0aGlzLmhhbmRsZVRpbWVVcGRhdGV9CiAgICAgICAgICBAZXJyb3I9JHt0aGlzLmhhbmRsZUVycm9yfQogICAgICAgICAgQHdhaXRpbmc9JHsoKSA9PiB7CiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTsKICAgICAgfX0KICAgICAgICAgIEBjYW5wbGF5PSR7KCkgPT4gewogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICB9fQogICAgICAgID48L3ZpZGVvPgoKICAgICAgICAke3RoaXMuc2hvd0NvbnRyb2xzID8gYjJgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJvdmVybGF5IiBAY2xpY2s9JHt0aGlzLmhhbmRsZU92ZXJsYXlDbGlja30+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNlbnRlci1wbGF5Ij4KICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpQbGF5Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9scy1iYXIiIEBjbGljaz0keyhlMTEpID0+IGUxMS5zdG9wUHJvcGFnYXRpb24oKX0+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2Vla2Jhci1yb3ciIEBjbGljaz0ke3RoaXMuaGFuZGxlU2Vla30+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWVrYmFyLXByb2dyZXNzIiBzdHlsZT0id2lkdGg6ICR7dGhpcy5kdXJhdGlvbiA/IHRoaXMuY3VycmVudFRpbWUgLyB0aGlzLmR1cmF0aW9uICogMTAwIDogMH0lIj48L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbHMtcm93Ij4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0cmwtYnV0dG9uIiBAY2xpY2s9JHt0aGlzLnRvZ2dsZVBsYXl9PgogICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZToke3RoaXMuaXNQbGF5aW5nID8gIlBhdXNlIiA6ICJQbGF5In0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgPC9idXR0b24+CgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRpbWUtZGlzcGxheSI+CiAgICAgICAgICAgICAgICAgICR7dGhpcy5mb3JtYXRUaW1lKHRoaXMuY3VycmVudFRpbWUpfSAvICR7dGhpcy5mb3JtYXRUaW1lKHRoaXMuZHVyYXRpb24pfQogICAgICAgICAgICAgICAgPC9zcGFuPgoKICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzcGFjZXIiPjwvc3Bhbj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ2b2x1bWUtZ3JvdXAiPgogICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjdHJsLWJ1dHRvbiIgQGNsaWNrPSR7dGhpcy50b2dnbGVNdXRlfT4KICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZToke3RoaXMubXV0ZWQgfHwgdGhpcy52b2x1bWUgPT09IDAgPyAiVm9sdW1lWCIgOiB0aGlzLnZvbHVtZSA8IDAuNSA/ICJWb2x1bWUxIiA6ICJWb2x1bWUyIn0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgICAgICAgY2xhc3M9InZvbHVtZS1zbGlkZXIiCiAgICAgICAgICAgICAgICAgICAgdHlwZT0icmFuZ2UiCiAgICAgICAgICAgICAgICAgICAgbWluPSIwIgogICAgICAgICAgICAgICAgICAgIG1heD0iMSIKICAgICAgICAgICAgICAgICAgICBzdGVwPSIwLjAxIgogICAgICAgICAgICAgICAgICAgIC52YWx1ZT0ke1N0cmluZyh0aGlzLm11dGVkID8gMCA6IHRoaXMudm9sdW1lKX0KICAgICAgICAgICAgICAgICAgICBAaW5wdXQ9JHt0aGlzLmhhbmRsZVZvbHVtZUNoYW5nZX0KICAgICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImN0cmwtYnV0dG9uIiBAY2xpY2s9JHt0aGlzLnRvZ2dsZUZ1bGxzY3JlZW59IHRpdGxlPSJGdWxsc2NyZWVuIj4KICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6JHt0aGlzLmlzRnVsbHNjcmVlbiA/ICJNaW5pbWl6ZSIgOiAiTWF4aW1pemUifSI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgIDogIiJ9CgogICAgICAgICR7dGhpcy5sb2FkaW5nICYmICF0aGlzLmVycm9yID8gYjJgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2FkaW5nLW92ZXJsYXkiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2FkaW5nLXNwaW5uZXIiPjwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgYCA6ICIifQoKICAgICAgICAke3RoaXMuZXJyb3IgPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9ImVycm9yLW92ZXJsYXkiPgogICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpWaWRlb09mZiI+PC9kZWVzLWljb24+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvci10ZXh0Ij4ke3RoaXMuZXJyb3J9PC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgYCA6ICIifQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIHRoaXMudmlkZW9FbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpIHx8IG51bGw7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZ1bGxzY3JlZW5jaGFuZ2UiLCB0aGlzLmhhbmRsZUZ1bGxzY3JlZW5DaGFuZ2UpOwogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImZ1bGxzY3JlZW5jaGFuZ2UiLCB0aGlzLmhhbmRsZUZ1bGxzY3JlZW5DaGFuZ2UpOwogICAgICBpZiAodGhpcy5oaWRlQ29udHJvbHNUaW1lcikgewogICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmhpZGVDb250cm9sc1RpbWVyKTsKICAgICAgfQogICAgfQogICAgcGxheSgpIHsKICAgICAgdGhpcy52aWRlb0VsZW1lbnQ/LnBsYXkoKTsKICAgIH0KICAgIHBhdXNlKCkgewogICAgICB0aGlzLnZpZGVvRWxlbWVudD8ucGF1c2UoKTsKICAgIH0KICAgIHRvZ2dsZVBsYXkoKSB7CiAgICAgIGlmICh0aGlzLmlzUGxheWluZykgewogICAgICAgIHRoaXMucGF1c2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnBsYXkoKTsKICAgICAgfQogICAgfQogICAgc2Vlayh0aW1lKSB7CiAgICAgIGlmICh0aGlzLnZpZGVvRWxlbWVudCkgewogICAgICAgIHRoaXMudmlkZW9FbGVtZW50LmN1cnJlbnRUaW1lID0gdGltZTsKICAgICAgfQogICAgfQogICAgc2V0Vm9sdW1lKHY2KSB7CiAgICAgIHRoaXMudm9sdW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdjYpKTsKICAgICAgaWYgKHRoaXMudmlkZW9FbGVtZW50KSB7CiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQudm9sdW1lID0gdGhpcy52b2x1bWU7CiAgICAgIH0KICAgIH0KICAgIHRvZ2dsZUZ1bGxzY3JlZW4oKSB7CiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnZpZGVvLWNvbnRhaW5lciIpOwogICAgICBpZiAoIWNvbnRhaW5lcikKICAgICAgICByZXR1cm47CiAgICAgIGlmICh0aGlzLmlzRnVsbHNjcmVlbikgewogICAgICAgIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuPy4oKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250YWluZXIucmVxdWVzdEZ1bGxzY3JlZW4/LigpOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVMb2FkZWRNZXRhZGF0YSgpIHsKICAgICAgaWYgKHRoaXMudmlkZW9FbGVtZW50KSB7CiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IHRoaXMudmlkZW9FbGVtZW50LmR1cmF0aW9uOwogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVQbGF5KCkgewogICAgICB0aGlzLmlzUGxheWluZyA9IHRydWU7CiAgICAgIHRoaXMuc2NoZWR1bGVIaWRlQ29udHJvbHMoKTsKICAgIH0KICAgIGhhbmRsZVBhdXNlKCkgewogICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlOwogICAgICB0aGlzLmNvbnRyb2xzVmlzaWJsZSA9IHRydWU7CiAgICB9CiAgICBoYW5kbGVFbmRlZCgpIHsKICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTsKICAgICAgdGhpcy5jb250cm9sc1Zpc2libGUgPSB0cnVlOwogICAgfQogICAgaGFuZGxlVGltZVVwZGF0ZSgpIHsKICAgICAgaWYgKHRoaXMudmlkZW9FbGVtZW50KSB7CiAgICAgICAgdGhpcy5jdXJyZW50VGltZSA9IHRoaXMudmlkZW9FbGVtZW50LmN1cnJlbnRUaW1lOwogICAgICB9CiAgICB9CiAgICBoYW5kbGVFcnJvcigpIHsKICAgICAgdGhpcy5lcnJvciA9ICJGYWlsZWQgdG8gbG9hZCB2aWRlbyI7CiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgfQogICAgaGFuZGxlT3ZlcmxheUNsaWNrKCkgewogICAgICB0aGlzLnRvZ2dsZVBsYXkoKTsKICAgIH0KICAgIGhhbmRsZVNlZWsoZTExKSB7CiAgICAgIGNvbnN0IHJlY3QgPSBlMTEuY3VycmVudFRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgcmF0aW8gPSAoZTExLmNsaWVudFggLSByZWN0LmxlZnQpIC8gcmVjdC53aWR0aDsKICAgICAgdGhpcy5zZWVrKHJhdGlvICogdGhpcy5kdXJhdGlvbik7CiAgICB9CiAgICBoYW5kbGVWb2x1bWVDaGFuZ2UoZTExKSB7CiAgICAgIGNvbnN0IHZhbHVlMiA9IHBhcnNlRmxvYXQoZTExLnRhcmdldC52YWx1ZSk7CiAgICAgIHRoaXMuc2V0Vm9sdW1lKHZhbHVlMik7CiAgICAgIHRoaXMubXV0ZWQgPSB2YWx1ZTIgPT09IDA7CiAgICB9CiAgICB0b2dnbGVNdXRlKCkgewogICAgICB0aGlzLm11dGVkID0gIXRoaXMubXV0ZWQ7CiAgICAgIGlmICh0aGlzLnZpZGVvRWxlbWVudCkgewogICAgICAgIHRoaXMudmlkZW9FbGVtZW50Lm11dGVkID0gdGhpcy5tdXRlZDsKICAgICAgfQogICAgfQogICAgaGFuZGxlTW91c2VNb3ZlKCkgewogICAgICB0aGlzLmNvbnRyb2xzVmlzaWJsZSA9IHRydWU7CiAgICAgIHRoaXMuc2NoZWR1bGVIaWRlQ29udHJvbHMoKTsKICAgIH0KICAgIGhhbmRsZU1vdXNlTGVhdmUoKSB7CiAgICAgIGlmICh0aGlzLmlzUGxheWluZykgewogICAgICAgIHRoaXMuY29udHJvbHNWaXNpYmxlID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHNjaGVkdWxlSGlkZUNvbnRyb2xzKCkgewogICAgICBpZiAodGhpcy5oaWRlQ29udHJvbHNUaW1lcikgewogICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmhpZGVDb250cm9sc1RpbWVyKTsKICAgICAgfQogICAgICBpZiAodGhpcy5pc1BsYXlpbmcpIHsKICAgICAgICB0aGlzLmhpZGVDb250cm9sc1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICB0aGlzLmNvbnRyb2xzVmlzaWJsZSA9IGZhbHNlOwogICAgICAgIH0sIDNlMyk7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZUZ1bGxzY3JlZW5DaGFuZ2UgPSAoKSA9PiB7CiAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gISFkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudDsKICAgIH07CiAgICBmb3JtYXRUaW1lKHNlY29uZHMpIHsKICAgICAgaWYgKCFpc0Zpbml0ZShzZWNvbmRzKSB8fCBzZWNvbmRzIDwgMCkKICAgICAgICByZXR1cm4gIjA6MDAiOwogICAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApOwogICAgICBjb25zdCBzZWNzID0gTWF0aC5mbG9vcihzZWNvbmRzICUgNjApOwogICAgICByZXR1cm4gYCR7bWluc306JHtzZWNzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKX1gOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM3NyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1ZpZGVvVmlld2VyMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy1wZGYtc2hhcmVkL1BkZk1hbmFnZXIuanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIFBkZk1hbmFnZXIgPSBjbGFzcyB7CiAgc3RhdGljIHBkZmpzTGliOwogIHN0YXRpYyBpbml0aWFsaXplZCA9IGZhbHNlOwogIHN0YXRpYyBhc3luYyBpbml0aWFsaXplKCkgewogICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpCiAgICAgIHJldHVybjsKICAgIHRoaXMucGRmanNMaWIgPSBhd2FpdCBpbXBvcnQoImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vcGRmanMtZGlzdEA0LjAuMzc5Lytlc20iKTsKICAgIHRoaXMucGRmanNMaWIuR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMgPSAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9wZGZqcy1kaXN0QDQuMC4zNzkvYnVpbGQvcGRmLndvcmtlci5tanMiOwogICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7CiAgfQogIHN0YXRpYyBhc3luYyBsb2FkRG9jdW1lbnQodXJsKSB7CiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemUoKTsKICAgIGNvbnN0IGxvYWRpbmdUYXNrID0gdGhpcy5wZGZqc0xpYi5nZXREb2N1bWVudCh1cmwpOwogICAgY29uc3QgZG9jdW1lbnQ0ID0gYXdhaXQgbG9hZGluZ1Rhc2sucHJvbWlzZTsKICAgIHJldHVybiBkb2N1bWVudDQ7CiAgfQogIHN0YXRpYyByZWxlYXNlRG9jdW1lbnQoX3VybCkgewogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXBkZi12aWV3ZXIvc3R5bGVzLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciB2aWV3ZXJTdHlsZXMgPSBbCiAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogIGlgCiAgICA6aG9zdCB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgaGVpZ2h0OiA2MDBweDsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICBmb250LWZhbWlseTogJ0dlaXN0IFNhbnMnLCBzYW5zLXNlcmlmOwogICAgICBjb250YWluOiBsYXlvdXQgc3R5bGU7CiAgICB9CgogICAgLnBkZi12aWV3ZXIgewogICAgICB3aWR0aDogMTAwJTsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTclKSIsICJoc2woMjE1IDIwJSAxMCUpIil9OwogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB9CgogICAgLnRvb2xiYXIgewogICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMjE1IDIwJSAxNSUpIil9OwogICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQgMzElIDkxJSkiLCAiaHNsKDIxNyAyNSUgMjIlKSIpfTsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgcGFkZGluZzogMCAxNnB4OwogICAgICBnYXA6IDE2cHg7CiAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgfQoKICAgIC50b29sYmFyLWdyb3VwIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgZ2FwOiA0cHg7CiAgICB9CgogICAgLnRvb2xiYXItZ3JvdXAtLWVuZCB7CiAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgfQoKICAgIC50b29sYmFyLWJ1dHRvbiB7CiAgICAgIHdpZHRoOiAzMnB4OwogICAgICBoZWlnaHQ6IDMycHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cyBlYXNlOwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDQ1JSkiLCAiaHNsKDIxNSAxNiUgNzUlKSIpfTsKICAgIH0KCiAgICAudG9vbGJhci1idXR0b246aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNCAzMSUgOTIlKSIsICJoc2woMjE3IDI1JSAyMiUpIil9OwogICAgfQoKICAgIC50b29sYmFyLWJ1dHRvbjpkaXNhYmxlZCB7CiAgICAgIG9wYWNpdHk6IDAuNDsKICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgIH0KCiAgICAudG9vbGJhci1idXR0b24gZGVlcy1pY29uIHsKICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgfQoKICAgIC5wYWdlLWluZm8gewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBnYXA6IDhweDsKICAgICAgcGFkZGluZzogMCA4cHg7CiAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDE2JSA0NSUpIiwgImhzbCgyMTUgMTYlIDc1JSkiKX07CiAgICB9CgogICAgLnBhZ2UtaW5wdXQgewogICAgICB3aWR0aDogNDhweDsKICAgICAgaGVpZ2h0OiAyOHB4OwogICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0IDMxJSA4NiUpIiwgImhzbCgyMTcgMjUlIDI4JSkiKX07CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMjE1IDIwJSAxMiUpIil9OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMjIgNDclIDExJSkiLCAiaHNsKDIxMCAyMCUgOTYlKSIpfTsKICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgICBvdXRsaW5lOiBub25lOwogICAgfQoKICAgIC5wYWdlLWlucHV0OmZvY3VzIHsKICAgICAgYm9yZGVyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgNjAlKSIsICJoc2woMjEzIDkzJSA2OCUpIil9OwogICAgfQoKICAgIC5wYWdlLXNlcGFyYXRvciB7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAxNiUgNjAlKSIsICJoc2woMjE1IDE2JSA1MCUpIil9OwogICAgfQoKICAgIC56b29tLWxldmVsIHsKICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICBmb250LXdlaWdodDogNTAwOwogICAgICBtaW4td2lkdGg6IDQ4cHg7CiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIH0KCiAgICAudmlld2VyLWNvbnRhaW5lciB7CiAgICAgIGZsZXg6IDE7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgbWluLWhlaWdodDogMDsKICAgIH0KCiAgICAuc2lkZWJhciB7CiAgICAgIHdpZHRoOiAyMDBweDsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgyMTUgMjAlIDE1JSkiKX07CiAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0IDMxJSA5MSUpIiwgImhzbCgyMTcgMjUlIDIyJSkiKX07CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIGhlaWdodDogMTAwJTsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIH0KCiAgICAuc2lkZWJhci1oZWFkZXIgewogICAgICBoZWlnaHQ6IDQwcHg7CiAgICAgIHBhZGRpbmc6IDAgMTJweDsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQgMzElIDkxJSkiLCAiaHNsKDIxNyAyNSUgMjIlKSIpfTsKICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICBmb250LXdlaWdodDogNjAwOwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDQ1JSkiLCAiaHNsKDIxNSAxNiUgNzUlKSIpfTsKICAgIH0KCiAgICAuc2lkZWJhci1jbG9zZSB7CiAgICAgIHdpZHRoOiAyNHB4OwogICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDE2JSA0NSUpIiwgImhzbCgyMTUgMTYlIDc1JSkiKX07CiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMgZWFzZTsKICAgIH0KCiAgICAuc2lkZWJhci1jbG9zZTpob3ZlciB7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0IDMxJSA5MiUpIiwgImhzbCgyMTcgMjUlIDIyJSkiKX07CiAgICB9CgogICAgLnNpZGViYXItY2xvc2UgZGVlcy1pY29uIHsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgfQoKICAgIC5zaWRlYmFyLWNvbnRlbnQgewogICAgICBmbGV4OiAxOwogICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgICBtaW4taGVpZ2h0OiAwOwogICAgfQoKICAgIC50aHVtYm5haWwgewogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICBib3JkZXI6IDJweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMTVzIGVhc2U7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NSUpIiwgImhzbCgyMTUgMjAlIDE4JSkiKX07CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgICAgLyogRGVmYXVsdCBBNCBhc3BlY3QgcmF0aW8gKDI5N21tIC8gMjEwbW0g4omIIDEuNDE0KSAqLwogICAgICBtaW4taGVpZ2h0OiBjYWxjKDE3NnB4ICogMS40MTQpOwogICAgfQoKICAgIC50aHVtYm5haWw6bGFzdC1jaGlsZCB7CiAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICB9CgogICAgLnRodW1ibmFpbDpob3ZlciB7CiAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTQgMzElIDg2JSkiLCAiaHNsKDIxNyAyNSUgMzUlKSIpfTsKICAgIH0KCiAgICAudGh1bWJuYWlsLmFjdGl2ZSB7CiAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTcgOTElIDYwJSkiLCAiaHNsKDIxMyA5MyUgNjglKSIpfTsKICAgIH0KCiAgICAudGh1bWJuYWlsLWNhbnZhcyB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICBpbWFnZS1yZW5kZXJpbmc6IC13ZWJraXQtb3B0aW1pemUtY29udHJhc3Q7CiAgICAgIGltYWdlLXJlbmRlcmluZzogY3Jpc3AtZWRnZXM7CiAgICB9CgogICAgLnRodW1ibmFpbC1udW1iZXIgewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIGJvdHRvbTogNHB4OwogICAgICByaWdodDogNHB4OwogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjcpIiwgInJnYmEoMCwgMCwgMCwgMC44KSIpfTsKICAgICAgY29sb3I6IHdoaXRlOwogICAgICBmb250LXNpemU6IDExcHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIH0KCiAgICAudmlld2VyLW1haW4gewogICAgICBmbGV4OiAxOwogICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgIHNjcm9sbC1iZWhhdmlvcjogc21vb3RoOwogICAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgICBtaW4taGVpZ2h0OiAwOwogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB9CgogICAgLmxvYWRpbmctY29udGFpbmVyIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIGhlaWdodDogMTAwJTsKICAgICAgZ2FwOiAxNnB4OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMTYlIDQ1JSkiLCAiaHNsKDIxNSAxNiUgNzUlKSIpfTsKICAgIH0KCiAgICAubG9hZGluZy1zcGlubmVyIHsKICAgICAgd2lkdGg6IDMycHg7CiAgICAgIGhlaWdodDogMzJweDsKICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICBib3JkZXI6IDNweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNCAzMSUgODYlKSIsICJoc2woMjE3IDI1JSAyOCUpIil9OwogICAgICBib3JkZXItdG9wLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgNjAlKSIsICJoc2woMjEzIDkzJSA2OCUpIil9OwogICAgICBhbmltYXRpb246IHNwaW4gMC44cyBsaW5lYXIgaW5maW5pdGU7CiAgICB9CgogICAgQGtleWZyYW1lcyBzcGluIHsKICAgICAgdG8gewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CiAgICAgIH0KICAgIH0KCiAgICAubG9hZGluZy10ZXh0IHsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICBmb250LXdlaWdodDogNTAwOwogICAgfQoKICAgIC5wYWdlcy1jb250YWluZXIgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBnYXA6IDIwcHg7CiAgICB9CgogICAgLnBhZ2Utd3JhcHBlciB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB3aWR0aDogMTAwJTsKICAgIH0KCiAgICAuY2FudmFzLWNvbnRhaW5lciB7CiAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICBib3gtc2hhZG93OiAwIDJweCAxMnB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMSkiLCAicmdiYSgwLCAwLCAwLCAwLjMpIil9OwogICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgfQoKICAgIC5wYWdlLWNhbnZhcyB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICBpbWFnZS1yZW5kZXJpbmc6IC13ZWJraXQtb3B0aW1pemUtY29udHJhc3Q7CiAgICAgIGltYWdlLXJlbmRlcmluZzogY3Jpc3AtZWRnZXM7CiAgICB9CgogICAgLyogVGV4dCBsYXllciBmb3Igc2VsZWN0aW9uICovCiAgICAudGV4dC1sYXllciB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgaW5zZXQ6IDA7CiAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgdGV4dC1zaXplLWFkanVzdDogbm9uZTsKICAgICAgZm9yY2VkLWNvbG9yLWFkanVzdDogbm9uZTsKICAgICAgdHJhbnNmb3JtLW9yaWdpbjogMCAwOwogICAgICB6LWluZGV4OiAxOwogICAgICB1c2VyLXNlbGVjdDogdGV4dDsKICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogdGV4dDsKICAgIH0KCiAgICAudGV4dC1sYXllciBzcGFuLAogICAgLnRleHQtbGF5ZXIgYnIgewogICAgICBjb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgd2hpdGUtc3BhY2U6IHByZTsKICAgICAgY3Vyc29yOiB0ZXh0OwogICAgICB0cmFuc2Zvcm0tb3JpZ2luOiAwJSAwJTsKICAgICAgdXNlci1zZWxlY3Q6IHRleHQ7CiAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IHRleHQ7CiAgICB9CgogICAgLnRleHQtbGF5ZXIgOjpzZWxlY3Rpb24gewogICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDEwMCwgMjAwLCAwLjMpOwogICAgfQoKICAgIC50ZXh0LWxheWVyIGJyOjpzZWxlY3Rpb24gewogICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIH0KCiAgICAudGV4dC1sYXllciAuZW5kT2ZDb250ZW50IHsKICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgaW5zZXQ6IDEwMCUgMCAwOwogICAgICB6LWluZGV4OiAwOwogICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgfQoKICAgIC50ZXh0LWxheWVyLnNlbGVjdGluZyAuZW5kT2ZDb250ZW50IHsKICAgICAgdG9wOiAwOwogICAgfQoKICAgIC5wZGYtdmlld2VyLndpdGgtc2lkZWJhciAudmlld2VyLW1haW4gewogICAgICBtYXJnaW4tbGVmdDogMDsKICAgIH0KICBgCl07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy1wZGYtdmlld2VyL2RlbW8uanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIGRlbW80ID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgcGFkZGluZzogNDBweDsKICAgICAgYmFja2dyb3VuZDogI2Y1ZjVmNTsKICAgIH0KCiAgICAuZGVtby1zZWN0aW9uIHsKICAgICAgbWFyZ2luLWJvdHRvbTogNDBweDsKICAgIH0KCiAgICBoMyB7CiAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIH0KCiAgICBkZWVzLXBkZi12aWV3ZXIgewogICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkOwogICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB9CgogICAgLnZpZXdlci10YWxsIHsKICAgICAgaGVpZ2h0OiA4MDBweDsKICAgIH0KCiAgICAudmlld2VyLWNvbXBhY3QgewogICAgICBoZWlnaHQ6IDUwMHB4OwogICAgfQogIDwvc3R5bGU+CgogIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgIDxoMz5GdWxsIEZlYXR1cmVkIFBERiBWaWV3ZXIgd2l0aCBUb29sYmFyPC9oMz4KICAgICAgPGRlZXMtcGRmLXZpZXdlcgogICAgICAgIGNsYXNzPSJ2aWV3ZXItdGFsbCIKICAgICAgICBwZGZVcmw9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9tb3ppbGxhL3BkZi5qcy9iYTJlZGVhZS93ZWIvY29tcHJlc3NlZC50cmFjZW1vbmtleS1wbGRpLTA5LnBkZiIKICAgICAgICBzaG93VG9vbGJhcj0idHJ1ZSIKICAgICAgICBzaG93U2lkZWJhcj0iZmFsc2UiCiAgICAgICAgaW5pdGlhbFpvb209InBhZ2UtZml0IgogICAgICA+PC9kZWVzLXBkZi12aWV3ZXI+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICA8aDM+UERGIFZpZXdlciB3aXRoIFNpZGViYXIgTmF2aWdhdGlvbjwvaDM+CiAgICAgIDxkZWVzLXBkZi12aWV3ZXIKICAgICAgICBjbGFzcz0idmlld2VyLXRhbGwiCiAgICAgICAgcGRmVXJsPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbW96aWxsYS9wZGYuanMvYmEyZWRlYWUvd2ViL2NvbXByZXNzZWQudHJhY2Vtb25rZXktcGxkaS0wOS5wZGYiCiAgICAgICAgc2hvd1Rvb2xiYXI9InRydWUiCiAgICAgICAgc2hvd1NpZGViYXI9InRydWUiCiAgICAgICAgaW5pdGlhbFpvb209InBhZ2Utd2lkdGgiCiAgICAgID48L2RlZXMtcGRmLXZpZXdlcj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgIDxoMz5Db21wYWN0IFZpZXdlciB3aXRob3V0IENvbnRyb2xzPC9oMz4KICAgICAgPGRlZXMtcGRmLXZpZXdlcgogICAgICAgIGNsYXNzPSJ2aWV3ZXItY29tcGFjdCIKICAgICAgICBwZGZVcmw9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9tb3ppbGxhL3BkZi5qcy9iYTJlZGVhZS9leGFtcGxlcy9sZWFybmluZy9oZWxsb3dvcmxkLnBkZiIKICAgICAgICBzaG93VG9vbGJhcj0iZmFsc2UiCiAgICAgICAgc2hvd1NpZGViYXI9ImZhbHNlIgogICAgICAgIGluaXRpYWxab29tPSJhdXRvIgogICAgICA+PC9kZWVzLXBkZi12aWV3ZXI+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXBkZi12aWV3ZXIvY29tcG9uZW50LmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfZGVlc19pY29uKCk7CnZhciBfX2VzRGVjb3JhdGU3NyA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNzggPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNQZGZWaWV3ZXIgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtcGRmLXZpZXdlciIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3BkZlVybF9kZWNvcmF0b3JzOwogIGxldCBfcGRmVXJsX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcGRmVXJsX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pbml0aWFsUGFnZV9kZWNvcmF0b3JzOwogIGxldCBfaW5pdGlhbFBhZ2VfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pbml0aWFsUGFnZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW5pdGlhbFpvb21fZGVjb3JhdG9yczsKICBsZXQgX2luaXRpYWxab29tX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW5pdGlhbFpvb21fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dUb29sYmFyX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93VG9vbGJhcl9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dUb29sYmFyX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93U2lkZWJhcl9kZWNvcmF0b3JzOwogIGxldCBfc2hvd1NpZGViYXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93U2lkZWJhcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VycmVudFBhZ2VfZGVjb3JhdG9yczsKICBsZXQgX2N1cnJlbnRQYWdlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VycmVudFBhZ2VfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RvdGFsUGFnZXNfZGVjb3JhdG9yczsKICBsZXQgX3RvdGFsUGFnZXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90b3RhbFBhZ2VzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50Wm9vbV9kZWNvcmF0b3JzOwogIGxldCBfY3VycmVudFpvb21faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50Wm9vbV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbG9hZGluZ19kZWNvcmF0b3JzOwogIGxldCBfbG9hZGluZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RvY3VtZW50SWRfZGVjb3JhdG9yczsKICBsZXQgX2RvY3VtZW50SWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kb2N1bWVudElkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90aHVtYm5haWxEYXRhX2RlY29yYXRvcnM7CiAgbGV0IF90aHVtYm5haWxEYXRhX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGh1bWJuYWlsRGF0YV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcGFnZURhdGFfZGVjb3JhdG9yczsKICBsZXQgX3BhZ2VEYXRhX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcGFnZURhdGFfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1BkZlZpZXdlcjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9wZGZVcmxfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9pbml0aWFsUGFnZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogTnVtYmVyIH0pXTsKICAgICAgX2luaXRpYWxab29tX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfc2hvd1Rvb2xiYXJfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfc2hvd1NpZGViYXJfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfY3VycmVudFBhZ2VfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF90b3RhbFBhZ2VzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfY3VycmVudFpvb21fZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF9sb2FkaW5nX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2RvY3VtZW50SWRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF90aHVtYm5haWxEYXRhX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBBcnJheSB9KV07CiAgICAgIF9wYWdlRGF0YV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfX2VzRGVjb3JhdGU3Nyh0aGlzLCBudWxsLCBfcGRmVXJsX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInBkZlVybCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicGRmVXJsIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnBkZlVybCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucGRmVXJsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3BkZlVybF9pbml0aWFsaXplcnMsIF9wZGZVcmxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Nyh0aGlzLCBudWxsLCBfaW5pdGlhbFBhZ2VfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaW5pdGlhbFBhZ2UiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImluaXRpYWxQYWdlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmluaXRpYWxQYWdlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pbml0aWFsUGFnZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pbml0aWFsUGFnZV9pbml0aWFsaXplcnMsIF9pbml0aWFsUGFnZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc3KHRoaXMsIG51bGwsIF9pbml0aWFsWm9vbV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpbml0aWFsWm9vbSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaW5pdGlhbFpvb20iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaW5pdGlhbFpvb20sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmluaXRpYWxab29tID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2luaXRpYWxab29tX2luaXRpYWxpemVycywgX2luaXRpYWxab29tX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzcodGhpcywgbnVsbCwgX3Nob3dUb29sYmFyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dUb29sYmFyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93VG9vbGJhciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93VG9vbGJhciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd1Rvb2xiYXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd1Rvb2xiYXJfaW5pdGlhbGl6ZXJzLCBfc2hvd1Rvb2xiYXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Nyh0aGlzLCBudWxsLCBfc2hvd1NpZGViYXJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2hvd1NpZGViYXIiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNob3dTaWRlYmFyIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dTaWRlYmFyLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaG93U2lkZWJhciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93U2lkZWJhcl9pbml0aWFsaXplcnMsIF9zaG93U2lkZWJhcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc3KHRoaXMsIG51bGwsIF9jdXJyZW50UGFnZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjdXJyZW50UGFnZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3VycmVudFBhZ2UiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3VycmVudFBhZ2UsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmN1cnJlbnRQYWdlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2N1cnJlbnRQYWdlX2luaXRpYWxpemVycywgX2N1cnJlbnRQYWdlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzcodGhpcywgbnVsbCwgX3RvdGFsUGFnZXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidG90YWxQYWdlcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidG90YWxQYWdlcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50b3RhbFBhZ2VzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50b3RhbFBhZ2VzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3RvdGFsUGFnZXNfaW5pdGlhbGl6ZXJzLCBfdG90YWxQYWdlc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc3KHRoaXMsIG51bGwsIF9jdXJyZW50Wm9vbV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjdXJyZW50Wm9vbSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3VycmVudFpvb20iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3VycmVudFpvb20sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmN1cnJlbnRab29tID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2N1cnJlbnRab29tX2luaXRpYWxpemVycywgX2N1cnJlbnRab29tX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzcodGhpcywgbnVsbCwgX2xvYWRpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibG9hZGluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibG9hZGluZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sb2FkaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5sb2FkaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xvYWRpbmdfaW5pdGlhbGl6ZXJzLCBfbG9hZGluZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc3KHRoaXMsIG51bGwsIF9kb2N1bWVudElkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImRvY3VtZW50SWQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRvY3VtZW50SWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZG9jdW1lbnRJZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZG9jdW1lbnRJZCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kb2N1bWVudElkX2luaXRpYWxpemVycywgX2RvY3VtZW50SWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3Nyh0aGlzLCBudWxsLCBfdGh1bWJuYWlsRGF0YV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0aHVtYm5haWxEYXRhIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0aHVtYm5haWxEYXRhIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRodW1ibmFpbERhdGEsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnRodW1ibmFpbERhdGEgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGh1bWJuYWlsRGF0YV9pbml0aWFsaXplcnMsIF90aHVtYm5haWxEYXRhX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzcodGhpcywgbnVsbCwgX3BhZ2VEYXRhX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInBhZ2VEYXRhIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJwYWdlRGF0YSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5wYWdlRGF0YSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucGFnZURhdGEgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcGFnZURhdGFfaW5pdGlhbGl6ZXJzLCBfcGFnZURhdGFfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3NyhudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNQZGZWaWV3ZXIyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtbzQ7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiTWVkaWEiLCAiUERGIl07CiAgICBzdGF0aWMgc3R5bGVzID0gdmlld2VyU3R5bGVzOwogICAgI3BkZlVybF9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM3OCh0aGlzLCBfcGRmVXJsX2luaXRpYWxpemVycywgIiIpOwogICAgZ2V0IHBkZlVybCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3BkZlVybF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHBkZlVybCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcGRmVXJsX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaW5pdGlhbFBhZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc4KHRoaXMsIF9wZGZVcmxfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc4KHRoaXMsIF9pbml0aWFsUGFnZV9pbml0aWFsaXplcnMsIDEpKTsKICAgIGdldCBpbml0aWFsUGFnZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2luaXRpYWxQYWdlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaW5pdGlhbFBhZ2UodmFsdWUyKSB7CiAgICAgIHRoaXMuI2luaXRpYWxQYWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaW5pdGlhbFpvb21fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc4KHRoaXMsIF9pbml0aWFsUGFnZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzgodGhpcywgX2luaXRpYWxab29tX2luaXRpYWxpemVycywgImF1dG8iKSk7CiAgICBnZXQgaW5pdGlhbFpvb20oKSB7CiAgICAgIHJldHVybiB0aGlzLiNpbml0aWFsWm9vbV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGluaXRpYWxab29tKHZhbHVlMikgewogICAgICB0aGlzLiNpbml0aWFsWm9vbV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dUb29sYmFyX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3OCh0aGlzLCBfaW5pdGlhbFpvb21fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc4KHRoaXMsIF9zaG93VG9vbGJhcl9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93VG9vbGJhcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dUb29sYmFyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd1Rvb2xiYXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dUb29sYmFyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2hvd1NpZGViYXJfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc4KHRoaXMsIF9zaG93VG9vbGJhcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzgodGhpcywgX3Nob3dTaWRlYmFyX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBzaG93U2lkZWJhcigpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Nob3dTaWRlYmFyX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd1NpZGViYXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dTaWRlYmFyX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY3VycmVudFBhZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc4KHRoaXMsIF9zaG93U2lkZWJhcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzgodGhpcywgX2N1cnJlbnRQYWdlX2luaXRpYWxpemVycywgMSkpOwogICAgZ2V0IGN1cnJlbnRQYWdlKCkgewogICAgICByZXR1cm4gdGhpcy4jY3VycmVudFBhZ2VfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjdXJyZW50UGFnZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY3VycmVudFBhZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN0b3RhbFBhZ2VzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3OCh0aGlzLCBfY3VycmVudFBhZ2VfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc4KHRoaXMsIF90b3RhbFBhZ2VzX2luaXRpYWxpemVycywgMSkpOwogICAgZ2V0IHRvdGFsUGFnZXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0b3RhbFBhZ2VzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdG90YWxQYWdlcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jdG90YWxQYWdlc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2N1cnJlbnRab29tX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3OCh0aGlzLCBfdG90YWxQYWdlc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzgodGhpcywgX2N1cnJlbnRab29tX2luaXRpYWxpemVycywgMSkpOwogICAgZ2V0IGN1cnJlbnRab29tKCkgewogICAgICByZXR1cm4gdGhpcy4jY3VycmVudFpvb21fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjdXJyZW50Wm9vbSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY3VycmVudFpvb21fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3OCh0aGlzLCBfY3VycmVudFpvb21fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc4KHRoaXMsIF9sb2FkaW5nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBsb2FkaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jbG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxvYWRpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNkb2N1bWVudElkX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3OCh0aGlzLCBfbG9hZGluZ19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzgodGhpcywgX2RvY3VtZW50SWRfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGRvY3VtZW50SWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNkb2N1bWVudElkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZG9jdW1lbnRJZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZG9jdW1lbnRJZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3RodW1ibmFpbERhdGFfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc4KHRoaXMsIF9kb2N1bWVudElkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3OCh0aGlzLCBfdGh1bWJuYWlsRGF0YV9pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgdGh1bWJuYWlsRGF0YSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RodW1ibmFpbERhdGFfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB0aHVtYm5haWxEYXRhKHZhbHVlMikgewogICAgICB0aGlzLiN0aHVtYm5haWxEYXRhX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcGFnZURhdGFfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc4KHRoaXMsIF90aHVtYm5haWxEYXRhX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3OCh0aGlzLCBfcGFnZURhdGFfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IHBhZ2VEYXRhKCkgewogICAgICByZXR1cm4gdGhpcy4jcGFnZURhdGFfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwYWdlRGF0YSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcGFnZURhdGFfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHBkZkRvY3VtZW50ID0gX19ydW5Jbml0aWFsaXplcnM3OCh0aGlzLCBfcGFnZURhdGFfZXh0cmFJbml0aWFsaXplcnMpOwogICAgcmVuZGVyU3RhdGUgPSAiaWRsZSI7CiAgICByZW5kZXJBYm9ydENvbnRyb2xsZXIgPSBudWxsOwogICAgcGFnZVJlbmRlcmluZyA9IGZhbHNlOwogICAgcGFnZU51bVBlbmRpbmcgPSBudWxsOwogICAgY3VycmVudFJlbmRlclRhc2sgPSBudWxsOwogICAgY3VycmVudFJlbmRlclByb21pc2UgPSBudWxsOwogICAgdGh1bWJuYWlsUmVuZGVyVGFza3MgPSBbXTsKICAgIHBhZ2VSZW5kZXJUYXNrcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICB0ZXh0TGF5ZXJSZW5kZXJUYXNrcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBjYW52YXM7CiAgICBjdHg7CiAgICB2aWV3ZXJNYWluID0gbnVsbDsKICAgIHJlc2l6ZU9ic2VydmVyOwogICAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXI7CiAgICBzY3JvbGxUaHJvdHRsZVRpbWVvdXQ7CiAgICB2aWV3cG9ydERpbWVuc2lvbnMgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTsKICAgIHZpZXdwb3J0TW9kZSA9ICJhdXRvIjsKICAgIE1BTlVBTF9NSU5fWk9PTSA9IDAuNTsKICAgIE1BTlVBTF9NQVhfWk9PTSA9IDM7CiAgICBBQlNPTFVURV9NSU5fWk9PTSA9IDAuMTsKICAgIEFCU09MVVRFX01BWF9aT09NID0gNDsKICAgIFBBR0VfR0FQID0gMjA7CiAgICBSRU5ERVJfQlVGRkVSID0gMzsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgfQogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InBkZi12aWV3ZXIgJHt0aGlzLnNob3dTaWRlYmFyID8gIndpdGgtc2lkZWJhciIgOiAiIn0iPgogICAgICAgICR7dGhpcy5zaG93VG9vbGJhciA/IGIyYAogICAgICAgICAgPGRpdiBjbGFzcz0idG9vbGJhciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItZ3JvdXAiPgogICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgIGNsYXNzPSJ0b29sYmFyLWJ1dHRvbiIKICAgICAgICAgICAgICAgIEBjbGljaz0ke3RoaXMucHJldmlvdXNQYWdlfQogICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7dGhpcy5jdXJyZW50UGFnZSA8PSAxfQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOkNoZXZyb25MZWZ0Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLWluZm8iPgogICAgICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgICAgIHR5cGU9Im51bWJlciIKICAgICAgICAgICAgICAgICAgbWluPSIxIgogICAgICAgICAgICAgICAgICBtYXg9IiR7dGhpcy50b3RhbFBhZ2VzfSIKICAgICAgICAgICAgICAgICAgLnZhbHVlPSR7U3RyaW5nKHRoaXMuY3VycmVudFBhZ2UpfQogICAgICAgICAgICAgICAgICBAY2hhbmdlPSR7dGhpcy5oYW5kbGVQYWdlSW5wdXR9CiAgICAgICAgICAgICAgICAgIGNsYXNzPSJwYWdlLWlucHV0IgogICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwYWdlLXNlcGFyYXRvciI+Lzwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwYWdlLXRvdGFsIj4ke3RoaXMudG90YWxQYWdlc308L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgY2xhc3M9InRvb2xiYXItYnV0dG9uIgogICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy5uZXh0UGFnZX0KICAgICAgICAgICAgICAgID9kaXNhYmxlZD0ke3RoaXMuY3VycmVudFBhZ2UgPj0gdGhpcy50b3RhbFBhZ2VzfQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOkNoZXZyb25SaWdodCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9vbGJhci1ncm91cCI+CiAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgY2xhc3M9InRvb2xiYXItYnV0dG9uIgogICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy56b29tT3V0fQogICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7IXRoaXMuY2FuWm9vbU91dH0KICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpab29tT3V0Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICBjbGFzcz0idG9vbGJhci1idXR0b24iCiAgICAgICAgICAgICAgICBAY2xpY2s9JHt0aGlzLnJlc2V0Wm9vbX0KICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iem9vbS1sZXZlbCI+JHtNYXRoLnJvdW5kKHRoaXMuY3VycmVudFpvb20gKiAxMDApfSU8L3NwYW4+CiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgY2xhc3M9InRvb2xiYXItYnV0dG9uIgogICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy56b29tSW59CiAgICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHshdGhpcy5jYW5ab29tSW59CiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6Wm9vbUluIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sYmFyLWdyb3VwIj4KICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICBjbGFzcz0idG9vbGJhci1idXR0b24iCiAgICAgICAgICAgICAgICBAY2xpY2s9JHt0aGlzLmZpdFRvUGFnZX0KICAgICAgICAgICAgICAgIHRpdGxlPSJGaXQgdG8gcGFnZSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpNYXhpbWl6ZSI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgY2xhc3M9InRvb2xiYXItYnV0dG9uIgogICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy5maXRUb1dpZHRofQogICAgICAgICAgICAgICAgdGl0bGU9IkZpdCB0byB3aWR0aCIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpBcnJvd0xlZnRSaWdodCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9vbGJhci1ncm91cCB0b29sYmFyLWdyb3VwLS1lbmQiPgogICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgIGNsYXNzPSJ0b29sYmFyLWJ1dHRvbiIKICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuc2hvd1NpZGViYXIgPSAhdGhpcy5zaG93U2lkZWJhcn0KICAgICAgICAgICAgICAgIHRpdGxlPSIke3RoaXMuc2hvd1NpZGViYXIgPyAiSGlkZSB0aHVtYm5haWxzIiA6ICJTaG93IHRodW1ibmFpbHMifSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIGljb249IiR7dGhpcy5zaG93U2lkZWJhciA/ICJsdWNpZGU6U2lkZWJhckNsb3NlIiA6ICJsdWNpZGU6U2lkZWJhciJ9Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICBjbGFzcz0idG9vbGJhci1idXR0b24iCiAgICAgICAgICAgICAgICBAY2xpY2s9JHt0aGlzLmRvd25sb2FkUGRmfQogICAgICAgICAgICAgICAgdGl0bGU9IkRvd25sb2FkIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOkRvd25sb2FkIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICBjbGFzcz0idG9vbGJhci1idXR0b24iCiAgICAgICAgICAgICAgICBAY2xpY2s9JHt0aGlzLnByaW50UGRmfQogICAgICAgICAgICAgICAgdGl0bGU9IlByaW50IgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOlByaW50ZXIiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGAgOiAiIn0KCiAgICAgICAgPGRpdiBjbGFzcz0idmlld2VyLWNvbnRhaW5lciI+CiAgICAgICAgICAke3RoaXMuc2hvd1NpZGViYXIgPyBiMmAKICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1oZWFkZXIiPgogICAgICAgICAgICAgICAgPHNwYW4+UGFnZXM8L3NwYW4+CiAgICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICAgIGNsYXNzPSJzaWRlYmFyLWNsb3NlIgogICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNob3dTaWRlYmFyID0gZmFsc2V9CiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOlgiPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1jb250ZW50Ij4KICAgICAgICAgICAgICAgICR7ZGlyZWN0aXZlc19leHBvcnRzLmtleWVkKHRoaXMuZG9jdW1lbnRJZCwgYjJgCiAgICAgICAgICAgICAgICAgICR7ZGlyZWN0aXZlc19leHBvcnRzLnJlcGVhdCh0aGlzLnRodW1ibmFpbERhdGEsIChpdGVtKSA9PiBpdGVtLnBhZ2UsIChpdGVtKSA9PiBiMmAKICAgICAgICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InRodW1ibmFpbCAke3RoaXMuY3VycmVudFBhZ2UgPT09IGl0ZW0ucGFnZSA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXBhZ2U9IiR7aXRlbS5wYWdlfSIKICAgICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy5oYW5kbGVUaHVtYm5haWxDbGlja30KICAgICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcyBjbGFzcz0idGh1bWJuYWlsLWNhbnZhcyIgZGF0YS1wYWdlPSIke2l0ZW0ucGFnZX0iPjwvY2FudmFzPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGh1bWJuYWlsLW51bWJlciI+JHtpdGVtLnBhZ2V9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgYCl9CiAgICAgICAgICAgICAgICBgKX0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgIDogIiJ9CgogICAgICAgICAgPGRpdiBjbGFzcz0idmlld2VyLW1haW4iIEBzY3JvbGw9JHt0aGlzLmhhbmRsZVNjcm9sbH0+CiAgICAgICAgICAgICR7dGhpcy5sb2FkaW5nID8gYjJgCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibG9hZGluZy1jb250YWluZXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibG9hZGluZy1zcGlubmVyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxvYWRpbmctdGV4dCI+TG9hZGluZyBQREYuLi48L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYCA6IGIyYAogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2VzLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAke2RpcmVjdGl2ZXNfZXhwb3J0cy5yZXBlYXQodGhpcy5wYWdlRGF0YSwgKGl0ZW0pID0+IGl0ZW0ucGFnZSwgKGl0ZW0pID0+IGIyYAogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2Utd3JhcHBlciIgZGF0YS1wYWdlPSIke2l0ZW0ucGFnZX0iPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FudmFzLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYW52YXMgY2xhc3M9InBhZ2UtY2FudmFzIiBkYXRhLXBhZ2U9IiR7aXRlbS5wYWdlfSI+PC9jYW52YXM+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRleHQtbGF5ZXIiIGRhdGEtcGFnZT0iJHtpdGVtLnBhZ2V9Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICBgKX0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYH0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgdGhpcy5lbnN1cmVWaWV3ZXJSZWZzKCk7CiAgICAgIGlmICh0aGlzLnBkZlVybCkgewogICAgICAgIHRoaXMuZG9jdW1lbnRJZCA9IGAke3RoaXMucGRmVXJsfS0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKX1gOwogICAgICAgIGF3YWl0IHRoaXMubG9hZFBkZigpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgdGhpcy5yZXNpemVPYnNlcnZlcj8uZGlzY29ubmVjdCgpOwogICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gdm9pZCAwOwogICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyPy5kaXNjb25uZWN0KCk7CiAgICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSB2b2lkIDA7CiAgICAgIGlmICh0aGlzLnNjcm9sbFRocm90dGxlVGltZW91dCkgewogICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbFRocm90dGxlVGltZW91dCk7CiAgICAgICAgdGhpcy5zY3JvbGxUaHJvdHRsZVRpbWVvdXQgPSB2b2lkIDA7CiAgICAgIH0KICAgICAgdGhpcy5yZW5kZXJTdGF0ZSA9ICJkaXNwb3NlZCI7CiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cERvY3VtZW50KCk7CiAgICAgIHRoaXMuY2FudmFzID0gdm9pZCAwOwogICAgICB0aGlzLmN0eCA9IHZvaWQgMDsKICAgIH0KICAgIGFzeW5jIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoInBkZlVybCIpICYmIHRoaXMucGRmVXJsKSB7CiAgICAgICAgY29uc3QgcHJldmlvdXNVcmwgPSBjaGFuZ2VkUHJvcGVydGllcy5nZXQoInBkZlVybCIpOwogICAgICAgIGlmIChwcmV2aW91c1VybCkgewogICAgICAgICAgUGRmTWFuYWdlci5yZWxlYXNlRG9jdW1lbnQocHJldmlvdXNVcmwpOwogICAgICAgIH0KICAgICAgICB0aGlzLmRvY3VtZW50SWQgPSBgJHt0aGlzLnBkZlVybH0tJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCl9YDsKICAgICAgICBhd2FpdCB0aGlzLmxvYWRQZGYoKTsKICAgICAgfQogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJzaG93U2lkZWJhciIpICYmIHRoaXMuc2hvd1NpZGViYXIgJiYgdGhpcy5wZGZEb2N1bWVudCkgewogICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlMikgPT4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlc29sdmUyKSk7CiAgICAgICAgdGhpcy50aHVtYm5haWxEYXRhLmZvckVhY2goKHRodW1iKSA9PiB0aHVtYi5yZW5kZXJlZCA9IGZhbHNlKTsKICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclRodW1ibmFpbHMoKTsKICAgICAgICB0aGlzLnNldHVwSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKTsKICAgICAgICB0aGlzLnNjcm9sbFRodW1ibmFpbEludG9WaWV3KHRoaXMuY3VycmVudFBhZ2UpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBsb2FkUGRmKCkgewogICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlOwogICAgICB0aGlzLnJlbmRlclN0YXRlID0gImxvYWRpbmciOwogICAgICB0cnkgewogICAgICAgIGF3YWl0IHRoaXMuY2xlYW51cERvY3VtZW50KCk7CiAgICAgICAgdGhpcy5yZW5kZXJBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CiAgICAgICAgY29uc3Qgc2lnbmFsID0gdGhpcy5yZW5kZXJBYm9ydENvbnRyb2xsZXIuc2lnbmFsOwogICAgICAgIHRoaXMucGRmRG9jdW1lbnQgPSBhd2FpdCBQZGZNYW5hZ2VyLmxvYWREb2N1bWVudCh0aGlzLnBkZlVybCk7CiAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIHRoaXMudG90YWxQYWdlcyA9IHRoaXMucGRmRG9jdW1lbnQubnVtUGFnZXM7CiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMuaW5pdGlhbFBhZ2U7CiAgICAgICAgdGhpcy5yZXNvbHZlSW5pdGlhbFZpZXdwb3J0TW9kZSgpOwogICAgICAgIHRoaXMudGh1bWJuYWlsRGF0YSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMudG90YWxQYWdlcyB9LCAoXzUsIGkxMSkgPT4gKHsKICAgICAgICAgIHBhZ2U6IGkxMSArIDEsCiAgICAgICAgICByZW5kZXJlZDogZmFsc2UKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5wYWdlRGF0YSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMudG90YWxQYWdlcyB9LCAoXzUsIGkxMSkgPT4gKHsKICAgICAgICAgIHBhZ2U6IGkxMSArIDEsCiAgICAgICAgICByZW5kZXJlZDogZmFsc2UsCiAgICAgICAgICByZW5kZXJpbmc6IGZhbHNlLAogICAgICAgICAgdGV4dExheWVyUmVuZGVyZWQ6IGZhbHNlCiAgICAgICAgfSkpOwogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7CiAgICAgICAgdGhpcy5lbnN1cmVWaWV3ZXJSZWZzKCk7CiAgICAgICAgdGhpcy5zZXR1cEludGVyc2VjdGlvbk9ic2VydmVyKCk7CiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZTIpKTsKICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy5yZW5kZXJTdGF0ZSA9ICJyZW5kZXJpbmctbWFpbiI7CiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJWaXNpYmxlUGFnZXMoKTsKICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbFBhZ2UgPiAxKSB7CiAgICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbFRvUGFnZSh0aGlzLmluaXRpYWxQYWdlLCBmYWxzZSk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnNob3dTaWRlYmFyKSB7CiAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlOwogICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZTIpKTsKICAgICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJUaHVtYm5haWxzKCk7CiAgICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5yZW5kZXJTdGF0ZSA9ICJyZW5kZXJlZCI7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgbG9hZGluZyBQREY6IiwgZXJyb3IpOwogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICAgIHRoaXMucmVuZGVyU3RhdGUgPSAiZXJyb3IiOwogICAgICB9CiAgICB9CiAgICBzZXR1cEludGVyc2VjdGlvbk9ic2VydmVyKCkgewogICAgICBpZiAodGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlcikgewogICAgICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICB9CiAgICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHsKICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHsKICAgICAgICAgIGNvbnN0IHBhZ2VXcmFwcGVyID0gZW50cnkudGFyZ2V0OwogICAgICAgICAgY29uc3QgcGFnZU51bSA9IHBhcnNlSW50KHBhZ2VXcmFwcGVyLmRhdGFzZXQucGFnZSB8fCAiMSIpOwogICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7CiAgICAgICAgICAgIHRoaXMucmVuZGVyUGFnZUlmTmVlZGVkKHBhZ2VOdW0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwgewogICAgICAgIHJvb3Q6IHRoaXMudmlld2VyTWFpbiwKICAgICAgICByb290TWFyZ2luOiBgJHt0aGlzLlJFTkRFUl9CVUZGRVIgKiAxMDB9cHggMHB4YCwKICAgICAgICB0aHJlc2hvbGQ6IDAuMDEKICAgICAgfSk7CiAgICAgIGNvbnN0IHBhZ2VXcmFwcGVycyA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvckFsbCgiLnBhZ2Utd3JhcHBlciIpOwogICAgICBpZiAocGFnZVdyYXBwZXJzKSB7CiAgICAgICAgcGFnZVdyYXBwZXJzLmZvckVhY2goKHdyYXBwZXIpID0+IHsKICAgICAgICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXI/Lm9ic2VydmUod3JhcHBlcik7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIHJlbmRlclZpc2libGVQYWdlcygpIHsKICAgICAgaWYgKCF0aGlzLnZpZXdlck1haW4pCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBjbGllbnRIZWlnaHQgPSB0aGlzLnZpZXdlck1haW4uY2xpZW50SGVpZ2h0OwogICAgICBmb3IgKGNvbnN0IHBhZ2VJbmZvIG9mIHRoaXMucGFnZURhdGEpIHsKICAgICAgICBjb25zdCBwYWdlV3JhcHBlciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihgLnBhZ2Utd3JhcHBlcltkYXRhLXBhZ2U9IiR7cGFnZUluZm8ucGFnZX0iXWApOwogICAgICAgIGlmICghcGFnZVdyYXBwZXIpCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjb25zdCByZWN0ID0gcGFnZVdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgY29uc3Qgdmlld2VyUmVjdCA9IHRoaXMudmlld2VyTWFpbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBjb25zdCByZWxhdGl2ZVRvcCA9IHJlY3QudG9wIC0gdmlld2VyUmVjdC50b3A7CiAgICAgICAgY29uc3QgcmVsYXRpdmVCb3R0b20gPSByZWxhdGl2ZVRvcCArIHJlY3QuaGVpZ2h0OwogICAgICAgIGNvbnN0IGJ1ZmZlcjIgPSB0aGlzLlJFTkRFUl9CVUZGRVIgKiBjbGllbnRIZWlnaHQ7CiAgICAgICAgaWYgKHJlbGF0aXZlQm90dG9tID49IC1idWZmZXIyICYmIHJlbGF0aXZlVG9wIDw9IGNsaWVudEhlaWdodCArIGJ1ZmZlcjIpIHsKICAgICAgICAgIGF3YWl0IHRoaXMucmVuZGVyUGFnZUlmTmVlZGVkKHBhZ2VJbmZvLnBhZ2UpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXN5bmMgcmVuZGVyUGFnZUlmTmVlZGVkKHBhZ2VOdW0pIHsKICAgICAgY29uc3QgcGFnZUluZm8gPSB0aGlzLnBhZ2VEYXRhLmZpbmQoKHA4KSA9PiBwOC5wYWdlID09PSBwYWdlTnVtKTsKICAgICAgaWYgKCFwYWdlSW5mbyB8fCBwYWdlSW5mby5yZW5kZXJlZCB8fCBwYWdlSW5mby5yZW5kZXJpbmcpCiAgICAgICAgcmV0dXJuOwogICAgICBwYWdlSW5mby5yZW5kZXJpbmcgPSB0cnVlOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihgLnBhZ2UtY2FudmFzW2RhdGEtcGFnZT0iJHtwYWdlTnVtfSJdYCk7CiAgICAgICAgaWYgKCFjYW52YXMpIHsKICAgICAgICAgIHBhZ2VJbmZvLnJlbmRlcmluZyA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5wZGZEb2N1bWVudC5nZXRQYWdlKHBhZ2VOdW0pOwogICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5jb21wdXRlVmlld3BvcnQocGFnZSk7CiAgICAgICAgY29uc3QgZHByID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTsKICAgICAgICBjYW52YXMud2lkdGggPSBNYXRoLmZsb29yKHZpZXdwb3J0LndpZHRoICogZHByKTsKICAgICAgICBjYW52YXMuaGVpZ2h0ID0gTWF0aC5mbG9vcih2aWV3cG9ydC5oZWlnaHQgKiBkcHIpOwogICAgICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IGAke3ZpZXdwb3J0LndpZHRofXB4YDsKICAgICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gYCR7dmlld3BvcnQuaGVpZ2h0fXB4YDsKICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgICBpZiAoIWN0eCkgewogICAgICAgICAgcGFnZS5jbGVhbnVwPy4oKTsKICAgICAgICAgIHBhZ2VJbmZvLnJlbmRlcmluZyA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjdHguc2NhbGUoZHByLCBkcHIpOwogICAgICAgIGNvbnN0IHJlbmRlckNvbnRleHQgPSB7CiAgICAgICAgICBjYW52YXNDb250ZXh0OiBjdHgsCiAgICAgICAgICB2aWV3cG9ydAogICAgICAgIH07CiAgICAgICAgY29uc3QgcmVuZGVyVGFzayA9IHBhZ2UucmVuZGVyKHJlbmRlckNvbnRleHQpOwogICAgICAgIHRoaXMucGFnZVJlbmRlclRhc2tzLnNldChwYWdlTnVtLCByZW5kZXJUYXNrKTsKICAgICAgICBhd2FpdCByZW5kZXJUYXNrLnByb21pc2U7CiAgICAgICAgcGFnZS5jbGVhbnVwPy4oKTsKICAgICAgICBwYWdlSW5mby5yZW5kZXJlZCA9IHRydWU7CiAgICAgICAgcGFnZUluZm8ucmVuZGVyaW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5wYWdlUmVuZGVyVGFza3MuZGVsZXRlKHBhZ2VOdW0pOwogICAgICAgIGF3YWl0IHRoaXMucmVuZGVyVGV4dExheWVyKHBhZ2VOdW0pOwogICAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgicGFnZURhdGEiKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBpZiAoZXJyb3I/Lm5hbWUgIT09ICJSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24iKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciByZW5kZXJpbmcgcGFnZSAke3BhZ2VOdW19OmAsIGVycm9yKTsKICAgICAgICB9CiAgICAgICAgcGFnZUluZm8ucmVuZGVyaW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5wYWdlUmVuZGVyVGFza3MuZGVsZXRlKHBhZ2VOdW0pOwogICAgICB9CiAgICB9CiAgICBhc3luYyByZW5kZXJUZXh0TGF5ZXIocGFnZU51bSkgewogICAgICBjb25zdCBwYWdlSW5mbyA9IHRoaXMucGFnZURhdGEuZmluZCgocDgpID0+IHA4LnBhZ2UgPT09IHBhZ2VOdW0pOwogICAgICBpZiAoIXBhZ2VJbmZvIHx8IHBhZ2VJbmZvLnRleHRMYXllclJlbmRlcmVkKQogICAgICAgIHJldHVybjsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCB0ZXh0TGF5ZXJEaXYgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoYC50ZXh0LWxheWVyW2RhdGEtcGFnZT0iJHtwYWdlTnVtfSJdYCk7CiAgICAgICAgaWYgKCF0ZXh0TGF5ZXJEaXYpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgdGV4dExheWVyRGl2LmlubmVySFRNTCA9ICIiOwogICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCB0aGlzLnBkZkRvY3VtZW50LmdldFBhZ2UocGFnZU51bSk7CiAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBhd2FpdCBwYWdlLmdldFRleHRDb250ZW50KCk7CiAgICAgICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLmNvbXB1dGVWaWV3cG9ydChwYWdlKTsKICAgICAgICBjb25zdCBwZGZqcyA9IGF3YWl0IGltcG9ydCgiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9wZGZqcy1kaXN0QDQuMC4zNzkvK2VzbSIpOwogICAgICAgIHRleHRMYXllckRpdi5zdHlsZS53aWR0aCA9IGAke3ZpZXdwb3J0LndpZHRofXB4YDsKICAgICAgICB0ZXh0TGF5ZXJEaXYuc3R5bGUuaGVpZ2h0ID0gYCR7dmlld3BvcnQuaGVpZ2h0fXB4YDsKICAgICAgICB0ZXh0TGF5ZXJEaXYuc3R5bGUuc2V0UHJvcGVydHkoIi0tc2NhbGUtZmFjdG9yIiwgU3RyaW5nKHZpZXdwb3J0LnNjYWxlKSk7CiAgICAgICAgY29uc3QgdGV4dExheWVyUmVuZGVyVGFzayA9IHBkZmpzLnJlbmRlclRleHRMYXllcih7CiAgICAgICAgICB0ZXh0Q29udGVudFNvdXJjZTogdGV4dENvbnRlbnQsCiAgICAgICAgICBjb250YWluZXI6IHRleHRMYXllckRpdiwKICAgICAgICAgIHZpZXdwb3J0CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrcy5zZXQocGFnZU51bSwgdGV4dExheWVyUmVuZGVyVGFzayk7CiAgICAgICAgYXdhaXQgdGV4dExheWVyUmVuZGVyVGFzay5wcm9taXNlOwogICAgICAgIGNvbnN0IGVuZE9mQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgIGVuZE9mQ29udGVudC5jbGFzc05hbWUgPSAiZW5kT2ZDb250ZW50IjsKICAgICAgICB0ZXh0TGF5ZXJEaXYuYXBwZW5kQ2hpbGQoZW5kT2ZDb250ZW50KTsKICAgICAgICBsZXQgaXNEcmFnZ2luZyA9IGZhbHNlOwogICAgICAgIGxldCBhbmNob3JOb2RlID0gbnVsbDsKICAgICAgICBsZXQgYW5jaG9yT2Zmc2V0ID0gMDsKICAgICAgICBjb25zdCBnZXRUZXh0UG9zaXRpb25Gcm9tUG9pbnQgPSAoeDQsIHk1KSA9PiB7CiAgICAgICAgICBjb25zdCBzcGFucyA9IEFycmF5LmZyb20odGV4dExheWVyRGl2LnF1ZXJ5U2VsZWN0b3JBbGwoInNwYW4iKSk7CiAgICAgICAgICBmb3IgKGNvbnN0IHNwYW4gb2Ygc3BhbnMpIHsKICAgICAgICAgICAgY29uc3QgcmVjdCA9IHNwYW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgIGlmICh4NCA+PSByZWN0LmxlZnQgJiYgeDQgPD0gcmVjdC5yaWdodCAmJiB5NSA+PSByZWN0LnRvcCAmJiB5NSA8PSByZWN0LmJvdHRvbSkgewogICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gc3Bhbi5maXJzdENoaWxkOwogICAgICAgICAgICAgIGlmICh0ZXh0Tm9kZSAmJiB0ZXh0Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHRleHQ5ID0gdGV4dE5vZGUudGV4dENvbnRlbnQgfHwgIiI7CiAgICAgICAgICAgICAgICBjb25zdCBjaGFyV2lkdGggPSByZWN0LndpZHRoIC8gdGV4dDkubGVuZ3RoOwogICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpdmVYID0geDQgLSByZWN0LmxlZnQ7CiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBNYXRoLm1pbihNYXRoLnJvdW5kKHJlbGF0aXZlWCAvIGNoYXJXaWR0aCksIHRleHQ5Lmxlbmd0aCk7CiAgICAgICAgICAgICAgICByZXR1cm4geyBub2RlOiB0ZXh0Tm9kZSwgb2Zmc2V0IH07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9OwogICAgICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSAoKSA9PiB7CiAgICAgICAgICBpZiAoaXNEcmFnZ2luZykgewogICAgICAgICAgICBpc0RyYWdnaW5nID0gZmFsc2U7CiAgICAgICAgICAgIGFuY2hvck5vZGUgPSBudWxsOwogICAgICAgICAgICB0ZXh0TGF5ZXJEaXYuY2xhc3NMaXN0LnJlbW92ZSgic2VsZWN0aW5nIik7CiAgICAgICAgICB9CiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgaGFuZGxlTW91c2VVcCk7CiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBoYW5kbGVNb3VzZU1vdmUpOwogICAgICAgIH07CiAgICAgICAgY29uc3QgaGFuZGxlTW91c2VNb3ZlID0gKGUxMSkgPT4gewogICAgICAgICAgaWYgKCFpc0RyYWdnaW5nIHx8ICFhbmNob3JOb2RlKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGNvbnN0IHBvcyA9IGdldFRleHRQb3NpdGlvbkZyb21Qb2ludChlMTEuY2xpZW50WCwgZTExLmNsaWVudFkpOwogICAgICAgICAgaWYgKHBvcykgewogICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24pIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgc2VsZWN0aW9uLnNldEJhc2VBbmRFeHRlbnQoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBwb3Mubm9kZSwgcG9zLm9mZnNldCk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB0ZXh0TGF5ZXJEaXYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwgKGUxMSkgPT4gewogICAgICAgICAgaWYgKGUxMS5idXR0b24gIT09IDApCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGNvbnN0IHBvcyA9IGdldFRleHRQb3NpdGlvbkZyb21Qb2ludChlMTEuY2xpZW50WCwgZTExLmNsaWVudFkpOwogICAgICAgICAgaWYgKHBvcykgewogICAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgaXNEcmFnZ2luZyA9IHRydWU7CiAgICAgICAgICAgIGFuY2hvck5vZGUgPSBwb3Mubm9kZTsKICAgICAgICAgICAgYW5jaG9yT2Zmc2V0ID0gcG9zLm9mZnNldDsKICAgICAgICAgICAgdGV4dExheWVyRGl2LmNsYXNzTGlzdC5hZGQoInNlbGVjdGluZyIpOwogICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHNlbGVjdGlvbj8ucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIGhhbmRsZU1vdXNlTW92ZSk7CiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCBoYW5kbGVNb3VzZVVwKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBwYWdlSW5mby50ZXh0TGF5ZXJSZW5kZXJlZCA9IHRydWU7CiAgICAgICAgcGFnZS5jbGVhbnVwPy4oKTsKICAgICAgICB0aGlzLnRleHRMYXllclJlbmRlclRhc2tzLmRlbGV0ZShwYWdlTnVtKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBpZiAoZXJyb3I/Lm5hbWUgIT09ICJSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24iKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciByZW5kZXJpbmcgdGV4dCBsYXllciBmb3IgcGFnZSAke3BhZ2VOdW19OmAsIGVycm9yKTsKICAgICAgICB9CiAgICAgICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrcy5kZWxldGUocGFnZU51bSk7CiAgICAgIH0KICAgIH0KICAgIGhhbmRsZVNjcm9sbCA9ICgpID0+IHsKICAgICAgaWYgKHRoaXMuc2Nyb2xsVGhyb3R0bGVUaW1lb3V0KSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsVGhyb3R0bGVUaW1lb3V0KTsKICAgICAgfQogICAgICB0aGlzLnNjcm9sbFRocm90dGxlVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRQYWdlKCk7CiAgICAgICAgdGhpcy5yZW5kZXJWaXNpYmxlUGFnZXMoKTsKICAgICAgfSwgNTApOwogICAgfTsKICAgIHVwZGF0ZUN1cnJlbnRQYWdlKCkgewogICAgICBpZiAoIXRoaXMudmlld2VyTWFpbikKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IHRoaXMudmlld2VyTWFpbi5zY3JvbGxUb3A7CiAgICAgIGNvbnN0IGNsaWVudEhlaWdodCA9IHRoaXMudmlld2VyTWFpbi5jbGllbnRIZWlnaHQ7CiAgICAgIGNvbnN0IGNlbnRlclkgPSBzY3JvbGxUb3AgKyBjbGllbnRIZWlnaHQgLyAyOwogICAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCB0aGlzLnBhZ2VEYXRhLmxlbmd0aDsgaTExKyspIHsKICAgICAgICBjb25zdCBwYWdlV3JhcHBlciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihgLnBhZ2Utd3JhcHBlcltkYXRhLXBhZ2U9IiR7aTExICsgMX0iXWApOwogICAgICAgIGlmICghcGFnZVdyYXBwZXIpCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjb25zdCByZWN0ID0gcGFnZVdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgY29uc3Qgdmlld2VyUmVjdCA9IHRoaXMudmlld2VyTWFpbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBjb25zdCByZWxhdGl2ZVRvcCA9IHJlY3QudG9wIC0gdmlld2VyUmVjdC50b3AgKyBzY3JvbGxUb3A7CiAgICAgICAgY29uc3QgcmVsYXRpdmVCb3R0b20gPSByZWxhdGl2ZVRvcCArIHJlY3QuaGVpZ2h0OwogICAgICAgIGlmIChjZW50ZXJZID49IHJlbGF0aXZlVG9wICYmIGNlbnRlclkgPD0gcmVsYXRpdmVCb3R0b20pIHsKICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlICE9PSBpMTEgKyAxKSB7CiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBpMTEgKyAxOwogICAgICAgICAgICBpZiAodGhpcy5zaG93U2lkZWJhcikgewogICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGh1bWJuYWlsSW50b1ZpZXcoaTExICsgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgc2Nyb2xsVGh1bWJuYWlsSW50b1ZpZXcocGFnZU51bSkgewogICAgICBjb25zdCB0aHVtYm5haWwgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoYC50aHVtYm5haWxbZGF0YS1wYWdlPSIke3BhZ2VOdW19Il1gKTsKICAgICAgY29uc3Qgc2lkZWJhckNvbnRlbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5zaWRlYmFyLWNvbnRlbnQiKTsKICAgICAgaWYgKHRodW1ibmFpbCAmJiBzaWRlYmFyQ29udGVudCkgewogICAgICAgIGNvbnN0IHRodW1ibmFpbFJlY3QgPSB0aHVtYm5haWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgY29uc3Qgc2lkZWJhclJlY3QgPSBzaWRlYmFyQ29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBjb25zdCBpc0Fib3ZlID0gdGh1bWJuYWlsUmVjdC50b3AgPCBzaWRlYmFyUmVjdC50b3A7CiAgICAgICAgY29uc3QgaXNCZWxvdyA9IHRodW1ibmFpbFJlY3QuYm90dG9tID4gc2lkZWJhclJlY3QuYm90dG9tOwogICAgICAgIGlmIChpc0Fib3ZlIHx8IGlzQmVsb3cpIHsKICAgICAgICAgIGNvbnN0IHRodW1ibmFpbE9mZnNldCA9IHRodW1ibmFpbC5vZmZzZXRUb3A7CiAgICAgICAgICBjb25zdCB0aHVtYm5haWxIZWlnaHQgPSB0aHVtYm5haWwub2Zmc2V0SGVpZ2h0OwogICAgICAgICAgY29uc3Qgc2lkZWJhckhlaWdodCA9IHNpZGViYXJDb250ZW50LmNsaWVudEhlaWdodDsKICAgICAgICAgIGNvbnN0IHRhcmdldFNjcm9sbFRvcCA9IHRodW1ibmFpbE9mZnNldCAtIHNpZGViYXJIZWlnaHQgLyAyICsgdGh1bWJuYWlsSGVpZ2h0IC8gMjsKICAgICAgICAgIHNpZGViYXJDb250ZW50LnNjcm9sbFRvKHsKICAgICAgICAgICAgdG9wOiBNYXRoLm1heCgwLCB0YXJnZXRTY3JvbGxUb3ApLAogICAgICAgICAgICBiZWhhdmlvcjogInNtb290aCIKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXN5bmMgc2Nyb2xsVG9QYWdlKHBhZ2VOdW0sIHNtb290aCA9IHRydWUpIHsKICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgY29uc3QgcGFnZVdyYXBwZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoYC5wYWdlLXdyYXBwZXJbZGF0YS1wYWdlPSIke3BhZ2VOdW19Il1gKTsKICAgICAgaWYgKHBhZ2VXcmFwcGVyICYmIHRoaXMudmlld2VyTWFpbikgewogICAgICAgIGNvbnN0IHBhZ2VSZWN0ID0gcGFnZVdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgY29uc3Qgdmlld2VyUmVjdCA9IHRoaXMudmlld2VyTWFpbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBjb25zdCBjdXJyZW50U2Nyb2xsVG9wID0gdGhpcy52aWV3ZXJNYWluLnNjcm9sbFRvcDsKICAgICAgICBjb25zdCB0YXJnZXRTY3JvbGxUb3AgPSBjdXJyZW50U2Nyb2xsVG9wICsgKHBhZ2VSZWN0LnRvcCAtIHZpZXdlclJlY3QudG9wKSAtIHRoaXMudmlld2VyTWFpbi5jbGllbnRUb3A7CiAgICAgICAgaWYgKHNtb290aCkgewogICAgICAgICAgdGhpcy52aWV3ZXJNYWluLnNjcm9sbFRvKHsKICAgICAgICAgICAgdG9wOiB0YXJnZXRTY3JvbGxUb3AsCiAgICAgICAgICAgIGJlaGF2aW9yOiAic21vb3RoIgogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMudmlld2VyTWFpbi5zY3JvbGxUb3AgPSB0YXJnZXRTY3JvbGxUb3A7CiAgICAgICAgfQogICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlTnVtOwogICAgICAgIGlmICh0aGlzLnNob3dTaWRlYmFyKSB7CiAgICAgICAgICB0aGlzLnNjcm9sbFRodW1ibmFpbEludG9WaWV3KHBhZ2VOdW0pOwogICAgICAgIH0KICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclBhZ2VJZk5lZWRlZChwYWdlTnVtKTsKICAgICAgfQogICAgfQogICAgYXN5bmMgcmVuZGVyVGh1bWJuYWlscygpIHsKICAgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLnRodW1ibmFpbERhdGEubGVuZ3RoID4gMCAmJiB0aGlzLnRodW1ibmFpbERhdGEuZXZlcnkoKHQ5KSA9PiB0OS5yZW5kZXJlZCkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHRoaXMucmVuZGVyQWJvcnRDb250cm9sbGVyPy5zaWduYWwuYWJvcnRlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBzaWduYWwgPSB0aGlzLnJlbmRlckFib3J0Q29udHJvbGxlcj8uc2lnbmFsOwogICAgICB0aGlzLnJlbmRlclN0YXRlID0gInJlbmRlcmluZy10aHVtYnMiOwogICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgdGhpcy50aHVtYm5haWxSZW5kZXJUYXNrcykgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0YXNrLmNhbmNlbCgpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMudGh1bWJuYWlsUmVuZGVyVGFza3MgPSBbXTsKICAgICAgdHJ5IHsKICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlOwogICAgICAgIGNvbnN0IHRodW1ibmFpbHMgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3JBbGwoIi50aHVtYm5haWwiKTsKICAgICAgICBjb25zdCB0aHVtYm5haWxDYW52YXNlcyA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvckFsbCgiLnRodW1ibmFpbC1jYW52YXMiKTsKICAgICAgICBjb25zdCBzaWRlYmFyQ29udGVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnNpZGViYXItY29udGVudCIpOwogICAgICAgIGNvbnN0IHNpZGViYXJTdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzaWRlYmFyQ29udGVudCk7CiAgICAgICAgY29uc3Qgc2lkZWJhclBhZGRpbmcgPSBwYXJzZUZsb2F0KHNpZGViYXJTdHlsZXMucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChzaWRlYmFyU3R5bGVzLnBhZGRpbmdSaWdodCk7CiAgICAgICAgY29uc3QgbWF4VGh1bWJuYWlsV2lkdGggPSAyMDAgLSBzaWRlYmFyUGFkZGluZyAtIDQ7CiAgICAgICAgZm9yIChjb25zdCBjYW52YXMgb2YgQXJyYXkuZnJvbSh0aHVtYm5haWxDYW52YXNlcykpIHsKICAgICAgICAgIGNvbnN0IGNvbnRleHQyID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgICBpZiAoY29udGV4dDIpIHsKICAgICAgICAgICAgY29udGV4dDIuY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IHRodW1ibmFpbENhbnZhc2VzLmxlbmd0aDsgaTExKyspIHsKICAgICAgICAgIGlmIChzaWduYWw/LmFib3J0ZWQpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IHRodW1ibmFpbENhbnZhc2VzW2kxMV07CiAgICAgICAgICBjb25zdCB0aHVtYm5haWwgPSB0aHVtYm5haWxzW2kxMV07CiAgICAgICAgICBjb25zdCBwYWdlTnVtID0gcGFyc2VJbnQoY2FudmFzLmRhdGFzZXQucGFnZSB8fCAiMSIpOwogICAgICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHRoaXMucGRmRG9jdW1lbnQuZ2V0UGFnZShwYWdlTnVtKTsKICAgICAgICAgIGNvbnN0IGluaXRpYWxWaWV3cG9ydCA9IHBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZTogMSB9KTsKICAgICAgICAgIGNvbnN0IHNjYWxlID0gbWF4VGh1bWJuYWlsV2lkdGggLyBpbml0aWFsVmlld3BvcnQud2lkdGg7CiAgICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZSB9KTsKICAgICAgICAgIGNvbnN0IGRwciA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7CiAgICAgICAgICBjYW52YXMud2lkdGggPSBNYXRoLmZsb29yKHZpZXdwb3J0LndpZHRoICogZHByKTsKICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBNYXRoLmZsb29yKHZpZXdwb3J0LmhlaWdodCAqIGRwcik7CiAgICAgICAgICBjYW52YXMuc3R5bGUud2lkdGggPSBgJHt2aWV3cG9ydC53aWR0aH1weGA7CiAgICAgICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gYCR7dmlld3BvcnQuaGVpZ2h0fXB4YDsKICAgICAgICAgIHRodW1ibmFpbC5zdHlsZS5oZWlnaHQgPSBgJHt2aWV3cG9ydC5oZWlnaHR9cHhgOwogICAgICAgICAgdGh1bWJuYWlsLnN0eWxlLm1pbkhlaWdodCA9IGAke3ZpZXdwb3J0LmhlaWdodH1weGA7CiAgICAgICAgICBjb25zdCBjb250ZXh0MiA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgICAgaWYgKCFjb250ZXh0MikgewogICAgICAgICAgICBwYWdlLmNsZWFudXA/LigpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnRleHQyLnNjYWxlKGRwciwgZHByKTsKICAgICAgICAgIGNvbnN0IHJlbmRlckNvbnRleHQgPSB7CiAgICAgICAgICAgIGNhbnZhc0NvbnRleHQ6IGNvbnRleHQyLAogICAgICAgICAgICB2aWV3cG9ydAogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHJlbmRlclRhc2sgPSBwYWdlLnJlbmRlcihyZW5kZXJDb250ZXh0KTsKICAgICAgICAgIHRoaXMudGh1bWJuYWlsUmVuZGVyVGFza3MucHVzaChyZW5kZXJUYXNrKTsKICAgICAgICAgIGF3YWl0IHJlbmRlclRhc2sucHJvbWlzZTsKICAgICAgICAgIHBhZ2UuY2xlYW51cD8uKCk7CiAgICAgICAgICBjb25zdCB0aHVtYkRhdGEgPSB0aGlzLnRodW1ibmFpbERhdGEuZmluZCgodDkpID0+IHQ5LnBhZ2UgPT09IHBhZ2VOdW0pOwogICAgICAgICAgaWYgKHRodW1iRGF0YSkgewogICAgICAgICAgICB0aHVtYkRhdGEucmVuZGVyZWQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoInRodW1ibmFpbERhdGEiKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBpZiAoZXJyb3I/Lm5hbWUgIT09ICJSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24iKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCJFcnJvciByZW5kZXJpbmcgdGh1bWJuYWlsczoiLCBlcnJvcik7CiAgICAgICAgfQogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRoaXMudGh1bWJuYWlsUmVuZGVyVGFza3MgPSBbXTsKICAgICAgfQogICAgfQogICAgcHJldmlvdXNQYWdlKCkgewogICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA+IDEpIHsKICAgICAgICB0aGlzLnNjcm9sbFRvUGFnZSh0aGlzLmN1cnJlbnRQYWdlIC0gMSk7CiAgICAgIH0KICAgIH0KICAgIG5leHRQYWdlKCkgewogICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA8IHRoaXMudG90YWxQYWdlcykgewogICAgICAgIHRoaXMuc2Nyb2xsVG9QYWdlKHRoaXMuY3VycmVudFBhZ2UgKyAxKTsKICAgICAgfQogICAgfQogICAgaGFuZGxlVGh1bWJuYWlsQ2xpY2soZTExKSB7CiAgICAgIGNvbnN0IHRhcmdldCA9IGUxMS5jdXJyZW50VGFyZ2V0OwogICAgICBjb25zdCBwYWdlTnVtID0gcGFyc2VJbnQodGFyZ2V0LmRhdGFzZXQucGFnZSB8fCAiMSIpOwogICAgICB0aGlzLnNjcm9sbFRvUGFnZShwYWdlTnVtKTsKICAgIH0KICAgIGhhbmRsZVBhZ2VJbnB1dChlMTEpIHsKICAgICAgY29uc3QgaW5wdXQgPSBlMTEudGFyZ2V0OwogICAgICBjb25zdCBwYWdlTnVtID0gcGFyc2VJbnQoaW5wdXQudmFsdWUpOwogICAgICB0aGlzLnNjcm9sbFRvUGFnZShwYWdlTnVtKTsKICAgIH0KICAgIHpvb21JbigpIHsKICAgICAgY29uc3QgbmV4dFpvb20gPSBNYXRoLm1pbih0aGlzLk1BTlVBTF9NQVhfWk9PTSwgdGhpcy5jdXJyZW50Wm9vbSAqIDEuMik7CiAgICAgIHRoaXMudmlld3BvcnRNb2RlID0gImN1c3RvbSI7CiAgICAgIGlmIChuZXh0Wm9vbSAhPT0gdGhpcy5jdXJyZW50Wm9vbSkgewogICAgICAgIHRoaXMuY3VycmVudFpvb20gPSBuZXh0Wm9vbTsKICAgICAgICB0aGlzLnJlUmVuZGVyQWxsUGFnZXMoKTsKICAgICAgfQogICAgfQogICAgem9vbU91dCgpIHsKICAgICAgY29uc3QgbmV4dFpvb20gPSBNYXRoLm1heCh0aGlzLk1BTlVBTF9NSU5fWk9PTSwgdGhpcy5jdXJyZW50Wm9vbSAvIDEuMik7CiAgICAgIHRoaXMudmlld3BvcnRNb2RlID0gImN1c3RvbSI7CiAgICAgIGlmIChuZXh0Wm9vbSAhPT0gdGhpcy5jdXJyZW50Wm9vbSkgewogICAgICAgIHRoaXMuY3VycmVudFpvb20gPSBuZXh0Wm9vbTsKICAgICAgICB0aGlzLnJlUmVuZGVyQWxsUGFnZXMoKTsKICAgICAgfQogICAgfQogICAgcmVzZXRab29tKCkgewogICAgICB0aGlzLnZpZXdwb3J0TW9kZSA9ICJjdXN0b20iOwogICAgICB0aGlzLmN1cnJlbnRab29tID0gMTsKICAgICAgdGhpcy5yZVJlbmRlckFsbFBhZ2VzKCk7CiAgICB9CiAgICBmaXRUb1BhZ2UoKSB7CiAgICAgIHRoaXMudmlld3BvcnRNb2RlID0gInBhZ2UtZml0IjsKICAgICAgdGhpcy5yZVJlbmRlckFsbFBhZ2VzKCk7CiAgICB9CiAgICBmaXRUb1dpZHRoKCkgewogICAgICB0aGlzLnZpZXdwb3J0TW9kZSA9ICJwYWdlLXdpZHRoIjsKICAgICAgdGhpcy5yZVJlbmRlckFsbFBhZ2VzKCk7CiAgICB9CiAgICByZVJlbmRlckFsbFBhZ2VzKCkgewogICAgICB0aGlzLnBhZ2VEYXRhLmZvckVhY2goKHBhZ2UpID0+IHsKICAgICAgICBwYWdlLnJlbmRlcmVkID0gZmFsc2U7CiAgICAgICAgcGFnZS5yZW5kZXJpbmcgPSBmYWxzZTsKICAgICAgICBwYWdlLnRleHRMYXllclJlbmRlcmVkID0gZmFsc2U7CiAgICAgIH0pOwogICAgICB0aGlzLnBhZ2VSZW5kZXJUYXNrcy5mb3JFYWNoKCh0YXNrKSA9PiB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRhc2suY2FuY2VsKCk7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLnBhZ2VSZW5kZXJUYXNrcy5jbGVhcigpOwogICAgICB0aGlzLnRleHRMYXllclJlbmRlclRhc2tzLmZvckVhY2goKHRhc2spID0+IHsKICAgICAgICB0cnkgewogICAgICAgICAgdGFzay5jYW5jZWw/LigpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrcy5jbGVhcigpOwogICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHsKICAgICAgICB0aGlzLnJlbmRlclZpc2libGVQYWdlcygpOwogICAgICB9KTsKICAgIH0KICAgIGFzeW5jIGRvd25sb2FkUGRmKCkgewogICAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpCiAgICAgICAgcmV0dXJuOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLnBkZkRvY3VtZW50LmdldERhdGEoKTsKICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2RhdGEuYnVmZmVyXSwgeyB0eXBlOiAiYXBwbGljYXRpb24vcGRmIiB9KTsKICAgICAgICBjb25zdCBibG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKICAgICAgICBjb25zdCBsaW5rMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKICAgICAgICBsaW5rMy5ocmVmID0gYmxvYlVybDsKICAgICAgICBsaW5rMy5kb3dubG9hZCA9IHRoaXMucGRmVXJsID8gdGhpcy5wZGZVcmwuc3BsaXQoIi8iKS5wb3AoKSB8fCAiZG9jdW1lbnQucGRmIiA6ICJkb2N1bWVudC5wZGYiOwogICAgICAgIGxpbmszLmNsaWNrKCk7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBVUkwucmV2b2tlT2JqZWN0VVJMKGJsb2JVcmwpLCAxZTMpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGRvd25sb2FkaW5nIFBERjoiLCBlcnJvcik7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIHByaW50UGRmKCkgewogICAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpCiAgICAgICAgcmV0dXJuOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLnBkZkRvY3VtZW50LmdldERhdGEoKTsKICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2RhdGEuYnVmZmVyXSwgeyB0eXBlOiAiYXBwbGljYXRpb24vcGRmIiB9KTsKICAgICAgICBjb25zdCBwZGZVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgICAgIGNvbnN0IGh0bWxDb250ZW50ID0gYAogICAgICAgIDwhRE9DVFlQRSBodG1sPgogICAgICAgIDxodG1sPgogICAgICAgIDxoZWFkPgogICAgICAgICAgPHRpdGxlPlByaW50IFBERjwvdGl0bGU+CiAgICAgICAgICA8c3R5bGU+CiAgICAgICAgICAgICogeyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IH0KICAgICAgICAgICAgaHRtbCwgYm9keSB7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IG92ZXJmbG93OiBoaWRkZW47IH0KICAgICAgICAgICAgaWZyYW1lIHsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgYm9yZGVyOiBub25lOyB9CiAgICAgICAgICAgIEBtZWRpYSBwcmludCB7CiAgICAgICAgICAgICAgaHRtbCwgYm9keSwgaWZyYW1lIHsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgfQogICAgICAgICAgICB9CiAgICAgICAgICA8L3N0eWxlPgogICAgICAgIDwvaGVhZD4KICAgICAgICA8Ym9keT4KICAgICAgICAgIDxpZnJhbWUgc3JjPSIke3BkZlVybH0iIHR5cGU9ImFwcGxpY2F0aW9uL3BkZiI+PC9pZnJhbWU+CiAgICAgICAgICA8c2NyaXB0PgogICAgICAgICAgICB3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5mb2N1cygpOwogICAgICAgICAgICAgICAgd2luZG93LnByaW50KCk7CiAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgd2luZG93Lm9uYWZ0ZXJwcmludCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHdpbmRvdy5jbG9zZSgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICAvLyBTYWZldHkgY2xvc2UgYWZ0ZXIgMiBtaW51dGVzCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHdpbmRvdy5jbG9zZSgpOyB9LCAxMjAwMDApOwogICAgICAgICAgPFwvc2NyaXB0PgogICAgICAgIDwvYm9keT4KICAgICAgICA8L2h0bWw+CiAgICAgIGA7CiAgICAgICAgY29uc3QgaHRtbEJsb2IgPSBuZXcgQmxvYihbaHRtbENvbnRlbnRdLCB7IHR5cGU6ICJ0ZXh0L2h0bWwiIH0pOwogICAgICAgIGNvbnN0IGh0bWxVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGh0bWxCbG9iKTsKICAgICAgICBjb25zdCBwcmludFdpbmRvdyA9IHdpbmRvdy5vcGVuKGh0bWxVcmwsICJfYmxhbmsiLCAid2lkdGg9ODAwLGhlaWdodD02MDAiKTsKICAgICAgICBpZiAocHJpbnRXaW5kb3cpIHsKICAgICAgICAgIGNvbnN0IGNoZWNrQ2xvc2VkID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgICAgICBpZiAocHJpbnRXaW5kb3cuY2xvc2VkKSB7CiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChjaGVja0Nsb3NlZCk7CiAgICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChwZGZVcmwpOwogICAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoaHRtbFVybCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIDUwMCk7CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChjaGVja0Nsb3NlZCk7CiAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwocGRmVXJsKTsKICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChodG1sVXJsKTsKICAgICAgICAgIH0sIDEyZTQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3aW5kb3cub3BlbihwZGZVcmwsICJfYmxhbmsiKTsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gVVJMLnJldm9rZU9iamVjdFVSTChwZGZVcmwpLCA2ZTQpOwogICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChodG1sVXJsKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgcHJpbnRpbmcgUERGOiIsIGVycm9yKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBQcm92aWRlIGNvbnRleHQgbWVudSBpdGVtcyBmb3IgcmlnaHQtY2xpY2sgZnVuY3Rpb25hbGl0eQogICAgICovCiAgICBnZXRDb250ZXh0TWVudUl0ZW1zKCkgewogICAgICBjb25zdCBpdGVtcyA9IFtdOwogICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvbj8udG9TdHJpbmcoKSB8fCAiIjsKICAgICAgaWYgKHNlbGVjdGVkVGV4dCkgewogICAgICAgIGl0ZW1zLnB1c2goewogICAgICAgICAgbmFtZTogIkNvcHkiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6Q29weSIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc2VsZWN0ZWRUZXh0KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBpdGVtcy5wdXNoKHsgZGl2aWRlcjogdHJ1ZSB9KTsKICAgICAgfQogICAgICBpdGVtcy5wdXNoKHsKICAgICAgICBuYW1lOiAiRG93bmxvYWQgUERGIiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpEb3dubG9hZCIsCiAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICBhd2FpdCB0aGlzLmRvd25sb2FkUGRmKCk7CiAgICAgICAgfQogICAgICB9LCB7CiAgICAgICAgbmFtZTogIlByaW50IFBERiIsCiAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6UHJpbnRlciIsCiAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICBhd2FpdCB0aGlzLnByaW50UGRmKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIGl0ZW1zOwogICAgfQogICAgZ2V0IGNhblpvb21JbigpIHsKICAgICAgcmV0dXJuIHRoaXMudmlld3BvcnRNb2RlICE9PSAiY3VzdG9tIiB8fCB0aGlzLmN1cnJlbnRab29tIDwgdGhpcy5NQU5VQUxfTUFYX1pPT007CiAgICB9CiAgICBnZXQgY2FuWm9vbU91dCgpIHsKICAgICAgcmV0dXJuIHRoaXMudmlld3BvcnRNb2RlICE9PSAiY3VzdG9tIiB8fCB0aGlzLmN1cnJlbnRab29tID4gdGhpcy5NQU5VQUxfTUlOX1pPT007CiAgICB9CiAgICBlbnN1cmVWaWV3ZXJSZWZzKCkgewogICAgICBpZiAoIXRoaXMudmlld2VyTWFpbikgewogICAgICAgIHRoaXMudmlld2VyTWFpbiA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnZpZXdlci1tYWluIik7CiAgICAgIH0KICAgICAgaWYgKHRoaXMudmlld2VyTWFpbiAmJiAhdGhpcy5yZXNpemVPYnNlcnZlcikgewogICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgdGhpcy5tZWFzdXJlVmlld3BvcnREaW1lbnNpb25zKCk7CiAgICAgICAgICBpZiAodGhpcy5wZGZEb2N1bWVudCkgewogICAgICAgICAgICB0aGlzLnJlUmVuZGVyQWxsUGFnZXMoKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy52aWV3ZXJNYWluKTsKICAgICAgICB0aGlzLm1lYXN1cmVWaWV3cG9ydERpbWVuc2lvbnMoKTsKICAgICAgICB0aGlzLnZpZXdlck1haW4uYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLCAoZTExKSA9PiB7CiAgICAgICAgICBjb25zdCBlbGVtZW50NCA9IGUxMS5jdXJyZW50VGFyZ2V0OwogICAgICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gZWxlbWVudDQuc2Nyb2xsVG9wOwogICAgICAgICAgY29uc3Qgc2Nyb2xsSGVpZ2h0ID0gZWxlbWVudDQuc2Nyb2xsSGVpZ2h0OwogICAgICAgICAgY29uc3QgY2xpZW50SGVpZ2h0ID0gZWxlbWVudDQuY2xpZW50SGVpZ2h0OwogICAgICAgICAgY29uc3QgZGVsdGFZID0gZTExLmRlbHRhWTsKICAgICAgICAgIGNvbnN0IGlzQXRUb3AgPSBzY3JvbGxUb3AgPT09IDA7CiAgICAgICAgICBjb25zdCBpc0F0Qm90dG9tID0gTWF0aC5hYnMoc2Nyb2xsVG9wICsgY2xpZW50SGVpZ2h0IC0gc2Nyb2xsSGVpZ2h0KSA8IDE7CiAgICAgICAgICBpZiAoZGVsdGFZIDwgMCAmJiAhaXNBdFRvcCB8fCBkZWx0YVkgPiAwICYmICFpc0F0Qm90dG9tKSB7CiAgICAgICAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgIH0gZWxzZSBpZiAoZGVsdGFZIDwgMCAmJiBpc0F0VG9wIHx8IGRlbHRhWSA+IDAgJiYgaXNBdEJvdHRvbSkgewogICAgICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgfQogICAgICAgIH0sIHsgcGFzc2l2ZTogZmFsc2UgfSk7CiAgICAgIH0KICAgIH0KICAgIG1lYXN1cmVWaWV3cG9ydERpbWVuc2lvbnMoKSB7CiAgICAgIGlmICghdGhpcy52aWV3ZXJNYWluKSB7CiAgICAgICAgdGhpcy52aWV3cG9ydERpbWVuc2lvbnMgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgc3R5bGVzMyA9IGdldENvbXB1dGVkU3R5bGUodGhpcy52aWV3ZXJNYWluKTsKICAgICAgY29uc3QgcGFkZGluZ1ggPSBwYXJzZUZsb2F0KHN0eWxlczMucGFkZGluZ0xlZnQgfHwgIjAiKSArIHBhcnNlRmxvYXQoc3R5bGVzMy5wYWRkaW5nUmlnaHQgfHwgIjAiKTsKICAgICAgY29uc3QgcGFkZGluZ1kgPSBwYXJzZUZsb2F0KHN0eWxlczMucGFkZGluZ1RvcCB8fCAiMCIpICsgcGFyc2VGbG9hdChzdHlsZXMzLnBhZGRpbmdCb3R0b20gfHwgIjAiKTsKICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCh0aGlzLnZpZXdlck1haW4uY2xpZW50V2lkdGggLSBwYWRkaW5nWCwgMCk7CiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KHRoaXMudmlld2VyTWFpbi5jbGllbnRIZWlnaHQgLSBwYWRkaW5nWSwgMCk7CiAgICAgIHRoaXMudmlld3BvcnREaW1lbnNpb25zID0geyB3aWR0aCwgaGVpZ2h0IH07CiAgICB9CiAgICByZXNvbHZlSW5pdGlhbFZpZXdwb3J0TW9kZSgpIHsKICAgICAgaWYgKHR5cGVvZiB0aGlzLmluaXRpYWxab29tID09PSAibnVtYmVyIikgewogICAgICAgIHRoaXMudmlld3BvcnRNb2RlID0gImN1c3RvbSI7CiAgICAgICAgdGhpcy5jdXJyZW50Wm9vbSA9IHRoaXMubm9ybWFsaXplWm9vbSh0aGlzLmluaXRpYWxab29tLCB0cnVlKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLmluaXRpYWxab29tID09PSAicGFnZS13aWR0aCIpIHsKICAgICAgICB0aGlzLnZpZXdwb3J0TW9kZSA9ICJwYWdlLXdpZHRoIjsKICAgICAgfSBlbHNlIGlmICh0aGlzLmluaXRpYWxab29tID09PSAicGFnZS1maXQiIHx8IHRoaXMuaW5pdGlhbFpvb20gPT09ICJhdXRvIikgewogICAgICAgIHRoaXMudmlld3BvcnRNb2RlID0gInBhZ2UtZml0IjsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnZpZXdwb3J0TW9kZSA9ICJhdXRvIjsKICAgICAgfQogICAgICBpZiAodGhpcy52aWV3cG9ydE1vZGUgIT09ICJjdXN0b20iKSB7CiAgICAgICAgdGhpcy5jdXJyZW50Wm9vbSA9IDE7CiAgICAgIH0KICAgIH0KICAgIGNvbXB1dGVWaWV3cG9ydChwYWdlKSB7CiAgICAgIHRoaXMubWVhc3VyZVZpZXdwb3J0RGltZW5zaW9ucygpOwogICAgICBjb25zdCBiYXNlVmlld3BvcnQgPSBwYWdlLmdldFZpZXdwb3J0KHsgc2NhbGU6IDEgfSk7CiAgICAgIGxldCBzY2FsZTsKICAgICAgc3dpdGNoICh0aGlzLnZpZXdwb3J0TW9kZSkgewogICAgICAgIGNhc2UgInBhZ2Utd2lkdGgiOiB7CiAgICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aCA9IHRoaXMudmlld3BvcnREaW1lbnNpb25zLndpZHRoIHx8IGJhc2VWaWV3cG9ydC53aWR0aDsKICAgICAgICAgIHNjYWxlID0gYXZhaWxhYmxlV2lkdGggLyBiYXNlVmlld3BvcnQud2lkdGg7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAicGFnZS1maXQiOgogICAgICAgIGNhc2UgImF1dG8iOiB7CiAgICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aCA9IHRoaXMudmlld3BvcnREaW1lbnNpb25zLndpZHRoIHx8IGJhc2VWaWV3cG9ydC53aWR0aDsKICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZUhlaWdodCA9IHRoaXMudmlld3BvcnREaW1lbnNpb25zLmhlaWdodCB8fCBiYXNlVmlld3BvcnQuaGVpZ2h0OwogICAgICAgICAgY29uc3Qgd2lkdGhTY2FsZSA9IGF2YWlsYWJsZVdpZHRoIC8gYmFzZVZpZXdwb3J0LndpZHRoOwogICAgICAgICAgY29uc3QgaGVpZ2h0U2NhbGUgPSBhdmFpbGFibGVIZWlnaHQgLyBiYXNlVmlld3BvcnQuaGVpZ2h0OwogICAgICAgICAgc2NhbGUgPSBNYXRoLm1pbih3aWR0aFNjYWxlLCBoZWlnaHRTY2FsZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAiY3VzdG9tIjoKICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICBzY2FsZSA9IHRoaXMubm9ybWFsaXplWm9vbSh0aGlzLmN1cnJlbnRab29tIHx8IDEsIGZhbHNlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShzY2FsZSkgfHwgc2NhbGUgPD0gMCkgewogICAgICAgIHNjYWxlID0gMTsKICAgICAgfQogICAgICBjb25zdCBjbGFtcGVkU2NhbGUgPSB0aGlzLnZpZXdwb3J0TW9kZSA9PT0gImN1c3RvbSIgPyB0aGlzLm5vcm1hbGl6ZVpvb20oc2NhbGUsIHRydWUpIDogdGhpcy5ub3JtYWxpemVab29tKHNjYWxlLCBmYWxzZSk7CiAgICAgIGlmICh0aGlzLnZpZXdwb3J0TW9kZSAhPT0gImN1c3RvbSIpIHsKICAgICAgICB0aGlzLmN1cnJlbnRab29tID0gY2xhbXBlZFNjYWxlOwogICAgICB9CiAgICAgIHJldHVybiBwYWdlLmdldFZpZXdwb3J0KHsgc2NhbGU6IGNsYW1wZWRTY2FsZSB9KTsKICAgIH0KICAgIG5vcm1hbGl6ZVpvb20odmFsdWUyLCBjbGFtcFRvTWFudWFsUmFuZ2UpIHsKICAgICAgY29uc3QgbWluMyA9IGNsYW1wVG9NYW51YWxSYW5nZSA/IHRoaXMuTUFOVUFMX01JTl9aT09NIDogdGhpcy5BQlNPTFVURV9NSU5fWk9PTTsKICAgICAgY29uc3QgbWF4MyA9IGNsYW1wVG9NYW51YWxSYW5nZSA/IHRoaXMuTUFOVUFMX01BWF9aT09NIDogdGhpcy5BQlNPTFVURV9NQVhfWk9PTTsKICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHZhbHVlMiwgbWluMyksIG1heDMpOwogICAgfQogICAgYXN5bmMgY2xlYW51cERvY3VtZW50KCkgewogICAgICBpZiAodGhpcy5yZW5kZXJBYm9ydENvbnRyb2xsZXIpIHsKICAgICAgICB0aGlzLnJlbmRlckFib3J0Q29udHJvbGxlci5hYm9ydCgpOwogICAgICAgIHRoaXMucmVuZGVyQWJvcnRDb250cm9sbGVyID0gbnVsbDsKICAgICAgfQogICAgICBpZiAodGhpcy5jdXJyZW50UmVuZGVyUHJvbWlzZSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBhd2FpdCB0aGlzLmN1cnJlbnRSZW5kZXJQcm9taXNlOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgfQogICAgICAgIHRoaXMuY3VycmVudFJlbmRlclByb21pc2UgPSBudWxsOwogICAgICB9CiAgICAgIHRoaXMuY3VycmVudFJlbmRlclRhc2sgPSBudWxsOwogICAgICB0aGlzLnBhZ2VSZW5kZXJUYXNrcy5mb3JFYWNoKCh0YXNrKSA9PiB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRhc2suY2FuY2VsKCk7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLnBhZ2VSZW5kZXJUYXNrcy5jbGVhcigpOwogICAgICB0aGlzLnRleHRMYXllclJlbmRlclRhc2tzLmZvckVhY2goKHRhc2spID0+IHsKICAgICAgICB0cnkgewogICAgICAgICAgdGFzay5jYW5jZWw/LigpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrcy5jbGVhcigpOwogICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgdGhpcy50aHVtYm5haWxSZW5kZXJUYXNrcyB8fCBbXSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0YXNrLmNhbmNlbCgpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMudGh1bWJuYWlsUmVuZGVyVGFza3MgPSBbXTsKICAgICAgdGhpcy5yZW5kZXJTdGF0ZSA9ICJpZGxlIjsKICAgICAgdGhpcy5wYWdlUmVuZGVyaW5nID0gZmFsc2U7CiAgICAgIHRoaXMucGFnZU51bVBlbmRpbmcgPSBudWxsOwogICAgICB0aGlzLnRodW1ibmFpbERhdGEgPSBbXTsKICAgICAgdGhpcy5wYWdlRGF0YSA9IFtdOwogICAgICB0aGlzLmRvY3VtZW50SWQgPSAiIjsKICAgICAgaWYgKHRoaXMuY2FudmFzICYmIHRoaXMuY3R4KSB7CiAgICAgICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpOwogICAgICB9CiAgICAgIGlmICh0aGlzLnBkZkRvY3VtZW50KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRoaXMucGRmRG9jdW1lbnQuZGVzdHJveSgpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCJFcnJvciBkZXN0cm95aW5nIFBERiBkb2N1bWVudDoiLCBlcnJvcik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMucGRmRG9jdW1lbnQgPSBudWxsOwogICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNzgoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNQZGZWaWV3ZXIyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXByZXZpZXcvZGVlcy1wcmV2aWV3LmRlbW8uanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIGRlbW9GdW5jNTAgPSAoKSA9PiBiMmAKICA8c3R5bGU+CiAgICAuZGVtby1jb250YWluZXIgewogICAgICBwYWRkaW5nOiA0OHB4OwogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y4ZjlmYSIsICIjMGEwYTBhIil9OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBnYXA6IDQwcHg7CiAgICB9CgogICAgLnNlY3Rpb24gewogICAgICBtYXgtd2lkdGg6IDkwMHB4OwogICAgICB3aWR0aDogMTAwJTsKICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICB9CgogICAgLnNlY3Rpb24tdGl0bGUgewogICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICB9CgogICAgLnNlY3Rpb24tZGVzY3JpcHRpb24gewogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OwogICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgfQoKICAgIC5wcmV2aWV3LWltYWdlIHsKICAgICAgaGVpZ2h0OiA0MDBweDsKICAgIH0KCiAgICAucHJldmlldy1wZGYgewogICAgICBoZWlnaHQ6IDYwMHB4OwogICAgfQogIDwvc3R5bGU+CgogIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5JbWFnZSBQcmV2aWV3IChVUkwpPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPkF1dG8tZGV0ZWN0cyBpbWFnZSBmcm9tIFVSTCBleHRlbnNpb24gYW5kIHJlbmRlcnMgd2l0aCB0aGUgaW1hZ2Ugdmlld2VyLjwvZGl2PgogICAgICA8ZGVlcy1wcmV2aWV3CiAgICAgICAgY2xhc3M9InByZXZpZXctaW1hZ2UiCiAgICAgICAgdXJsPSJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUwNjc0NDAzODEzNi00NjI3MzgzNGIzZmI/dz0xMjAwIgogICAgICAgIGZpbGVuYW1lPSJsYW5kc2NhcGUuanBnIgogICAgICA+PC9kZWVzLXByZXZpZXc+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+UERGIFByZXZpZXcgKFVSTCk8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+QXV0by1kZXRlY3RzIFBERiBhbmQgZGlzcGxheXMgd2l0aCB0aGUgUERGIHZpZXdlciBpbmNsdWRpbmcgdG9vbGJhci48L2Rpdj4KICAgICAgPGRlZXMtcHJldmlldwogICAgICAgIGNsYXNzPSJwcmV2aWV3LXBkZiIKICAgICAgICB1cmw9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9tb3ppbGxhL3BkZi5qcy9iYTJlZGVhZS93ZWIvY29tcHJlc3NlZC50cmFjZW1vbmtleS1wbGRpLTA5LnBkZiIKICAgICAgICBmaWxlbmFtZT0icmVzZWFyY2gtcGFwZXIucGRmIgogICAgICA+PC9kZWVzLXByZXZpZXc+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+Q29kZSBQcmV2aWV3IChUZXh0IENvbnRlbnQpPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPlR5cGVTY3JpcHQgY29kZSBkaXNwbGF5ZWQgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIHZpYSB0aGUgY29kZWJveC48L2Rpdj4KICAgICAgPGRlZXMtcHJldmlldwogICAgICAgIGZpbGVuYW1lPSJleGFtcGxlLnRzIgogICAgICAgIGxhbmd1YWdlPSJ0eXBlc2NyaXB0IgogICAgICAgIC50ZXh0Q29udGVudD0ke2BpbXBvcnQgeyBodG1sLCBjc3MgfSBmcm9tICdsaXQnOwoKZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7CiAgc3RhdGljIHN0eWxlcyA9IGNzc1xgCiAgICA6aG9zdCB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICBwYWRkaW5nOiAxNnB4OwogICAgfQogIFxgOwoKICByZW5kZXIoKSB7CiAgICByZXR1cm4gaHRtbFxgPGgxPkhlbGxvIFdvcmxkPC9oMT5cYDsKICB9Cn1gfQogICAgICA+PC9kZWVzLXByZXZpZXc+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+QXVkaW8gUHJldmlldyAoVVJMKTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5BdWRpbyBmaWxlIGRldGVjdGVkIGJ5IGV4dGVuc2lvbiwgc2hvd24gd2l0aCB3YXZlZm9ybSBwbGF5ZXIuPC9kaXY+CiAgICAgIDxkZWVzLXByZXZpZXcKICAgICAgICB1cmw9Imh0dHBzOi8vd3d3LnNvdW5kaGVsaXguY29tL2V4YW1wbGVzL21wMy9Tb3VuZEhlbGl4LVNvbmctMS5tcDMiCiAgICAgICAgZmlsZW5hbWU9InNvbmcubXAzIgogICAgICA+PC9kZWVzLXByZXZpZXc+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+VmlkZW8gUHJldmlldyAoVVJMKTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5WaWRlbyBmaWxlIGRldGVjdGVkIGZyb20gVVJMLCByZW5kZXJlZCB3aXRoIGN1c3RvbSB2aWRlbyBjb250cm9scy48L2Rpdj4KICAgICAgPGRlZXMtcHJldmlldwogICAgICAgIHVybD0iaHR0cHM6Ly9jb21tb25kYXRhc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9ndHYtdmlkZW9zLWJ1Y2tldC9zYW1wbGUvQmlnQnVja0J1bm55Lm1wNCIKICAgICAgICBmaWxlbmFtZT0iYmlnLWJ1Y2stYnVubnkubXA0IgogICAgICA+PC9kZWVzLXByZXZpZXc+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+RXhwbGljaXQgVHlwZSBPdmVycmlkZTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj5Gb3JjZSBjb250ZW50IHR5cGUgdG8gJ3RleHQnIGV2ZW4gdGhvdWdoIHRoZSBVUkwgaGFzIG5vIGV4dGVuc2lvbi48L2Rpdj4KICAgICAgPGRlZXMtcHJldmlldwogICAgICAgIGNvbnRlbnRUeXBlPSJ0ZXh0IgogICAgICAgIC50ZXh0Q29udGVudD0keyJUaGlzIGlzIHBsYWluIHRleHQgY29udGVudC5cbkl0IHByZXNlcnZlcyB3aGl0ZXNwYWNlIGFuZCBsaW5lIGJyZWFrcy5cblxuVXNlZnVsIGZvciBsb2cgZmlsZXMsIFJFQURNRXMsIGV0Yy4ifQogICAgICAgIGZpbGVuYW1lPSJub3Rlcy50eHQiCiAgICAgID48L2RlZXMtcHJldmlldz4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9InNlY3Rpb24iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5Vbmtub3duIFR5cGU8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+V2hlbiBjb250ZW50IHR5cGUgY2Fubm90IGJlIGRldGVjdGVkLCBzaG93cyBhIHBsYWNlaG9sZGVyLjwvZGl2PgogICAgICA8ZGVlcy1wcmV2aWV3CiAgICAgICAgZmlsZW5hbWU9ImRhdGEuYmluIgogICAgICAgIGNvbnRlbnRUeXBlPSJ1bmtub3duIgogICAgICA+PC9kZWVzLXByZXZpZXc+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXByZXZpZXcvZGVlcy1wcmV2aWV3LmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfZGVlc19pY29uKCk7CnZhciBfX2VzRGVjb3JhdGU3OCA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzNzkgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIEVYVEVOU0lPTl9NQVAgPSB7CiAgLy8gSW1hZ2UKICBqcGc6ICJpbWFnZSIsCiAganBlZzogImltYWdlIiwKICBwbmc6ICJpbWFnZSIsCiAgZ2lmOiAiaW1hZ2UiLAogIHdlYnA6ICJpbWFnZSIsCiAgc3ZnOiAiaW1hZ2UiLAogIGJtcDogImltYWdlIiwKICBhdmlmOiAiaW1hZ2UiLAogIGljbzogImltYWdlIiwKICAvLyBQREYKICBwZGY6ICJwZGYiLAogIC8vIEF1ZGlvCiAgbXAzOiAiYXVkaW8iLAogIHdhdjogImF1ZGlvIiwKICBvZ2c6ICJhdWRpbyIsCiAgZmxhYzogImF1ZGlvIiwKICBhYWM6ICJhdWRpbyIsCiAgbTRhOiAiYXVkaW8iLAogIG9wdXM6ICJhdWRpbyIsCiAgd2ViYTogImF1ZGlvIiwKICAvLyBWaWRlbwogIG1wNDogInZpZGVvIiwKICB3ZWJtOiAidmlkZW8iLAogIG1vdjogInZpZGVvIiwKICBhdmk6ICJ2aWRlbyIsCiAgbWt2OiAidmlkZW8iLAogIG9ndjogInZpZGVvIiwKICAvLyBDb2RlCiAgdHM6ICJjb2RlIiwKICBqczogImNvZGUiLAogIGpzeDogImNvZGUiLAogIHRzeDogImNvZGUiLAogIGpzb246ICJjb2RlIiwKICBodG1sOiAiY29kZSIsCiAgY3NzOiAiY29kZSIsCiAgc2NzczogImNvZGUiLAogIGxlc3M6ICJjb2RlIiwKICBweTogImNvZGUiLAogIGphdmE6ICJjb2RlIiwKICBnbzogImNvZGUiLAogIHJzOiAiY29kZSIsCiAgeWFtbDogImNvZGUiLAogIHltbDogImNvZGUiLAogIHhtbDogImNvZGUiLAogIHNxbDogImNvZGUiLAogIHNoOiAiY29kZSIsCiAgYmFzaDogImNvZGUiLAogIHpzaDogImNvZGUiLAogIG1kOiAiY29kZSIsCiAgYzogImNvZGUiLAogIGNwcDogImNvZGUiLAogIGg6ICJjb2RlIiwKICBocHA6ICJjb2RlIiwKICByYjogImNvZGUiLAogIHBocDogImNvZGUiLAogIHN3aWZ0OiAiY29kZSIsCiAga3Q6ICJjb2RlIiwKICAvLyBUZXh0CiAgdHh0OiAidGV4dCIsCiAgbG9nOiAidGV4dCIsCiAgY3N2OiAidGV4dCIsCiAgZW52OiAidGV4dCIKfTsKdmFyIE1JTUVfUFJFRklYX01BUCA9IHsKICAiaW1hZ2UvIjogImltYWdlIiwKICAiYXVkaW8vIjogImF1ZGlvIiwKICAidmlkZW8vIjogInZpZGVvIiwKICAiYXBwbGljYXRpb24vcGRmIjogInBkZiIKfTsKdmFyIEVYVEVOU0lPTl9MQU5HX01BUCA9IHsKICB0czogInR5cGVzY3JpcHQiLAogIHRzeDogInR5cGVzY3JpcHQiLAogIGpzOiAiamF2YXNjcmlwdCIsCiAganN4OiAiamF2YXNjcmlwdCIsCiAganNvbjogImpzb24iLAogIGh0bWw6ICJ4bWwiLAogIHhtbDogInhtbCIsCiAgY3NzOiAiY3NzIiwKICBzY3NzOiAic2NzcyIsCiAgbGVzczogImxlc3MiLAogIHB5OiAicHl0aG9uIiwKICBqYXZhOiAiamF2YSIsCiAgZ286ICJnbyIsCiAgcnM6ICJydXN0IiwKICB5YW1sOiAieWFtbCIsCiAgeW1sOiAieWFtbCIsCiAgc3FsOiAic3FsIiwKICBzaDogImJhc2giLAogIGJhc2g6ICJiYXNoIiwKICB6c2g6ICJiYXNoIiwKICBjOiAiYyIsCiAgY3BwOiAiY3BwIiwKICBoOiAiYyIsCiAgaHBwOiAiY3BwIiwKICByYjogInJ1YnkiLAogIHBocDogInBocCIsCiAgc3dpZnQ6ICJzd2lmdCIsCiAga3Q6ICJrb3RsaW4iLAogIG1kOiAibWFya2Rvd24iCn07CnZhciBUWVBFX0lDT05TID0gewogIGltYWdlOiAibHVjaWRlOkltYWdlIiwKICBwZGY6ICJsdWNpZGU6RmlsZVRleHQiLAogIGF1ZGlvOiAibHVjaWRlOk11c2ljIiwKICB2aWRlbzogImx1Y2lkZTpWaWRlbyIsCiAgY29kZTogImx1Y2lkZTpDb2RlIiwKICB0ZXh0OiAibHVjaWRlOkZpbGVUZXh0IiwKICB1bmtub3duOiAibHVjaWRlOkZpbGUiCn07CnZhciBEZWVzUHJldmlldyA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy1wcmV2aWV3IildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfdXJsX2RlY29yYXRvcnM7CiAgbGV0IF91cmxfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF91cmxfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ZpbGVfZGVjb3JhdG9yczsKICBsZXQgX2ZpbGVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWxlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9iYXNlNjRfZGVjb3JhdG9yczsKICBsZXQgX2Jhc2U2NF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2Jhc2U2NF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGV4dENvbnRlbnRfZGVjb3JhdG9yczsKICBsZXQgX3RleHRDb250ZW50X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGV4dENvbnRlbnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRlbnRUeXBlX2RlY29yYXRvcnM7CiAgbGV0IF9jb250ZW50VHlwZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NvbnRlbnRUeXBlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sYW5ndWFnZV9kZWNvcmF0b3JzOwogIGxldCBfbGFuZ3VhZ2VfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sYW5ndWFnZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWltZVR5cGVfZGVjb3JhdG9yczsKICBsZXQgX21pbWVUeXBlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbWltZVR5cGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ZpbGVuYW1lX2RlY29yYXRvcnM7CiAgbGV0IF9maWxlbmFtZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ZpbGVuYW1lX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93VG9vbGJhcl9kZWNvcmF0b3JzOwogIGxldCBfc2hvd1Rvb2xiYXJfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93VG9vbGJhcl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0ZpbGVuYW1lX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93RmlsZW5hbWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93RmlsZW5hbWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Jlc29sdmVkVHlwZV9kZWNvcmF0b3JzOwogIGxldCBfcmVzb2x2ZWRUeXBlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVzb2x2ZWRUeXBlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZXNvbHZlZFNyY19kZWNvcmF0b3JzOwogIGxldCBfcmVzb2x2ZWRTcmNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZXNvbHZlZFNyY19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVzb2x2ZWRUZXh0X2RlY29yYXRvcnM7CiAgbGV0IF9yZXNvbHZlZFRleHRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZXNvbHZlZFRleHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Jlc29sdmVkTGFuZ19kZWNvcmF0b3JzOwogIGxldCBfcmVzb2x2ZWRMYW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVzb2x2ZWRMYW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb2FkaW5nX2RlY29yYXRvcnM7CiAgbGV0IF9sb2FkaW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbG9hZGluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZXJyb3JfZGVjb3JhdG9yczsKICBsZXQgX2Vycm9yX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZXJyb3JfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1ByZXZpZXcyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfdXJsX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9maWxlX2RlY29yYXRvcnMgPSBbbjUoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXTsKICAgICAgX2Jhc2U2NF9kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfdGV4dENvbnRlbnRfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX2NvbnRlbnRUeXBlX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9sYW5ndWFnZV9kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfbWltZVR5cGVfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX2ZpbGVuYW1lX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF9zaG93VG9vbGJhcl9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9zaG93RmlsZW5hbWVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfcmVzb2x2ZWRUeXBlX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9yZXNvbHZlZFNyY19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfcmVzb2x2ZWRUZXh0X2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9yZXNvbHZlZExhbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2xvYWRpbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2Vycm9yX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTc4KHRoaXMsIG51bGwsIF91cmxfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidXJsIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ1cmwiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudXJsLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai51cmwgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdXJsX2luaXRpYWxpemVycywgX3VybF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc4KHRoaXMsIG51bGwsIF9maWxlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImZpbGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZpbGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZmlsZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZmlsZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9maWxlX2luaXRpYWxpemVycywgX2ZpbGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3OCh0aGlzLCBudWxsLCBfYmFzZTY0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImJhc2U2NCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYmFzZTY0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmJhc2U2NCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYmFzZTY0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Jhc2U2NF9pbml0aWFsaXplcnMsIF9iYXNlNjRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3OCh0aGlzLCBudWxsLCBfdGV4dENvbnRlbnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGV4dENvbnRlbnQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRleHRDb250ZW50IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRleHRDb250ZW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50ZXh0Q29udGVudCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90ZXh0Q29udGVudF9pbml0aWFsaXplcnMsIF90ZXh0Q29udGVudF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc4KHRoaXMsIG51bGwsIF9jb250ZW50VHlwZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb250ZW50VHlwZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29udGVudFR5cGUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY29udGVudFR5cGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvbnRlbnRUeXBlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbnRlbnRUeXBlX2luaXRpYWxpemVycywgX2NvbnRlbnRUeXBlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzgodGhpcywgbnVsbCwgX2xhbmd1YWdlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxhbmd1YWdlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsYW5ndWFnZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sYW5ndWFnZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubGFuZ3VhZ2UgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbGFuZ3VhZ2VfaW5pdGlhbGl6ZXJzLCBfbGFuZ3VhZ2VfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3OCh0aGlzLCBudWxsLCBfbWltZVR5cGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWltZVR5cGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm1pbWVUeXBlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1pbWVUeXBlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5taW1lVHlwZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9taW1lVHlwZV9pbml0aWFsaXplcnMsIF9taW1lVHlwZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc4KHRoaXMsIG51bGwsIF9maWxlbmFtZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJmaWxlbmFtZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZmlsZW5hbWUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZmlsZW5hbWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmZpbGVuYW1lID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2ZpbGVuYW1lX2luaXRpYWxpemVycywgX2ZpbGVuYW1lX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzgodGhpcywgbnVsbCwgX3Nob3dUb29sYmFyX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dUb29sYmFyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzaG93VG9vbGJhciIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93VG9vbGJhciwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd1Rvb2xiYXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2hvd1Rvb2xiYXJfaW5pdGlhbGl6ZXJzLCBfc2hvd1Rvb2xiYXJfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3OCh0aGlzLCBudWxsLCBfc2hvd0ZpbGVuYW1lX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dGaWxlbmFtZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd0ZpbGVuYW1lIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dGaWxlbmFtZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd0ZpbGVuYW1lID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dGaWxlbmFtZV9pbml0aWFsaXplcnMsIF9zaG93RmlsZW5hbWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3OCh0aGlzLCBudWxsLCBfcmVzb2x2ZWRUeXBlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInJlc29sdmVkVHlwZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicmVzb2x2ZWRUeXBlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJlc29sdmVkVHlwZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucmVzb2x2ZWRUeXBlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Jlc29sdmVkVHlwZV9pbml0aWFsaXplcnMsIF9yZXNvbHZlZFR5cGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3OCh0aGlzLCBudWxsLCBfcmVzb2x2ZWRTcmNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicmVzb2x2ZWRTcmMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInJlc29sdmVkU3JjIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJlc29sdmVkU3JjLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yZXNvbHZlZFNyYyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9yZXNvbHZlZFNyY19pbml0aWFsaXplcnMsIF9yZXNvbHZlZFNyY19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc4KHRoaXMsIG51bGwsIF9yZXNvbHZlZFRleHRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicmVzb2x2ZWRUZXh0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJyZXNvbHZlZFRleHQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucmVzb2x2ZWRUZXh0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yZXNvbHZlZFRleHQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcmVzb2x2ZWRUZXh0X2luaXRpYWxpemVycywgX3Jlc29sdmVkVGV4dF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc4KHRoaXMsIG51bGwsIF9yZXNvbHZlZExhbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicmVzb2x2ZWRMYW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJyZXNvbHZlZExhbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucmVzb2x2ZWRMYW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yZXNvbHZlZExhbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcmVzb2x2ZWRMYW5nX2luaXRpYWxpemVycywgX3Jlc29sdmVkTGFuZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc4KHRoaXMsIG51bGwsIF9sb2FkaW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxvYWRpbmciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImxvYWRpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubG9hZGluZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubG9hZGluZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9sb2FkaW5nX2luaXRpYWxpemVycywgX2xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU3OCh0aGlzLCBudWxsLCBfZXJyb3JfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZXJyb3IiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImVycm9yIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmVycm9yLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5lcnJvciA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9lcnJvcl9pbml0aWFsaXplcnMsIF9lcnJvcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc4KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1ByZXZpZXcyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmM1MDsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJNZWRpYSIsICJEYXRhIFZpZXciXTsKICAgICN1cmxfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzNzkodGhpcywgX3VybF9pbml0aWFsaXplcnMsICIiKTsKICAgIC8vIENvbnRlbnQgc291cmNlcyAodXNlIG9uZSkKICAgIGdldCB1cmwoKSB7CiAgICAgIHJldHVybiB0aGlzLiN1cmxfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB1cmwodmFsdWUyKSB7CiAgICAgIHRoaXMuI3VybF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2ZpbGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc5KHRoaXMsIF91cmxfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc5KHRoaXMsIF9maWxlX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgZmlsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2ZpbGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBmaWxlKHZhbHVlMikgewogICAgICB0aGlzLiNmaWxlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYmFzZTY0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3OSh0aGlzLCBfZmlsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzkodGhpcywgX2Jhc2U2NF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgYmFzZTY0KCkgewogICAgICByZXR1cm4gdGhpcy4jYmFzZTY0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYmFzZTY0KHZhbHVlMikgewogICAgICB0aGlzLiNiYXNlNjRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN0ZXh0Q29udGVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzkodGhpcywgX2Jhc2U2NF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzkodGhpcywgX3RleHRDb250ZW50X2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCB0ZXh0Q29udGVudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RleHRDb250ZW50X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdGV4dENvbnRlbnQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3RleHRDb250ZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY29udGVudFR5cGVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc5KHRoaXMsIF90ZXh0Q29udGVudF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzkodGhpcywgX2NvbnRlbnRUeXBlX2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICAvLyBIaW50cyAmIG92ZXJyaWRlcwogICAgZ2V0IGNvbnRlbnRUeXBlKCkgewogICAgICByZXR1cm4gdGhpcy4jY29udGVudFR5cGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjb250ZW50VHlwZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29udGVudFR5cGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsYW5ndWFnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzkodGhpcywgX2NvbnRlbnRUeXBlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3OSh0aGlzLCBfbGFuZ3VhZ2VfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGxhbmd1YWdlKCkgewogICAgICByZXR1cm4gdGhpcy4jbGFuZ3VhZ2VfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsYW5ndWFnZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbGFuZ3VhZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtaW1lVHlwZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzkodGhpcywgX2xhbmd1YWdlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3OSh0aGlzLCBfbWltZVR5cGVfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IG1pbWVUeXBlKCkgewogICAgICByZXR1cm4gdGhpcy4jbWltZVR5cGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtaW1lVHlwZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWltZVR5cGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNmaWxlbmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzkodGhpcywgX21pbWVUeXBlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3OSh0aGlzLCBfZmlsZW5hbWVfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGZpbGVuYW1lKCkgewogICAgICByZXR1cm4gdGhpcy4jZmlsZW5hbWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBmaWxlbmFtZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZmlsZW5hbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93VG9vbGJhcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzkodGhpcywgX2ZpbGVuYW1lX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3OSh0aGlzLCBfc2hvd1Rvb2xiYXJfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICAvLyBVSQogICAgZ2V0IHNob3dUb29sYmFyKCkgewogICAgICByZXR1cm4gdGhpcy4jc2hvd1Rvb2xiYXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93VG9vbGJhcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2hvd1Rvb2xiYXJfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93RmlsZW5hbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc5KHRoaXMsIF9zaG93VG9vbGJhcl9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzkodGhpcywgX3Nob3dGaWxlbmFtZV9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93RmlsZW5hbWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93RmlsZW5hbWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93RmlsZW5hbWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dGaWxlbmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Jlc29sdmVkVHlwZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzkodGhpcywgX3Nob3dGaWxlbmFtZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzkodGhpcywgX3Jlc29sdmVkVHlwZV9pbml0aWFsaXplcnMsICJ1bmtub3duIikpOwogICAgLy8gSW50ZXJuYWwKICAgIGdldCByZXNvbHZlZFR5cGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNyZXNvbHZlZFR5cGVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCByZXNvbHZlZFR5cGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Jlc29sdmVkVHlwZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Jlc29sdmVkU3JjX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM3OSh0aGlzLCBfcmVzb2x2ZWRUeXBlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM3OSh0aGlzLCBfcmVzb2x2ZWRTcmNfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IHJlc29sdmVkU3JjKCkgewogICAgICByZXR1cm4gdGhpcy4jcmVzb2x2ZWRTcmNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCByZXNvbHZlZFNyYyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcmVzb2x2ZWRTcmNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNyZXNvbHZlZFRleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc5KHRoaXMsIF9yZXNvbHZlZFNyY19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzNzkodGhpcywgX3Jlc29sdmVkVGV4dF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgcmVzb2x2ZWRUZXh0KCkgewogICAgICByZXR1cm4gdGhpcy4jcmVzb2x2ZWRUZXh0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcmVzb2x2ZWRUZXh0KHZhbHVlMikgewogICAgICB0aGlzLiNyZXNvbHZlZFRleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNyZXNvbHZlZExhbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc5KHRoaXMsIF9yZXNvbHZlZFRleHRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc5KHRoaXMsIF9yZXNvbHZlZExhbmdfaW5pdGlhbGl6ZXJzLCAidGV4dCIpKTsKICAgIGdldCByZXNvbHZlZExhbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNyZXNvbHZlZExhbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCByZXNvbHZlZExhbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Jlc29sdmVkTGFuZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczc5KHRoaXMsIF9yZXNvbHZlZExhbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc5KHRoaXMsIF9sb2FkaW5nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBsb2FkaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jbG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGxvYWRpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNlcnJvcl9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzkodGhpcywgX2xvYWRpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczc5KHRoaXMsIF9lcnJvcl9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgZXJyb3IoKSB7CiAgICAgIHJldHVybiB0aGlzLiNlcnJvcl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGVycm9yKHZhbHVlMikgewogICAgICB0aGlzLiNlcnJvcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgb2JqZWN0VXJsID0gKF9fcnVuSW5pdGlhbGl6ZXJzNzkodGhpcywgX2Vycm9yX2V4dHJhSW5pdGlhbGl6ZXJzKSwgIiIpOwogICAgcmVuZGVyKCkgewogICAgICBjb25zdCBkaXNwbGF5TmFtZSA9IHRoaXMuZmlsZW5hbWUgfHwgdGhpcy5maWxlPy5uYW1lIHx8IHRoaXMuZ2V0RmlsZW5hbWVGcm9tVXJsKCkgfHwgIiI7CiAgICAgIHJldHVybiBiMmAKICAgICAgPHN0eWxlPgogICAgICAgIDpob3N0IHsKICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLCBzYW5zLXNlcmlmOwogICAgICAgIH0KCiAgICAgICAgLnByZXZpZXctY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzI3MjcyYSIpfTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMDkwOTBiIil9OwogICAgICAgIH0KCiAgICAgICAgLmhlYWRlci1iYXIgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBnYXA6IDhweDsKICAgICAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgICAgIGhlaWdodDogNDBweDsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjlmYWZiIiwgImhzbCgyMTUgMjAlIDE1JSkiKX07CiAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiaHNsKDIxNyAyNSUgMjIlKSIpfTsKICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIH0KCiAgICAgICAgLmhlYWRlci1pY29uIHsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAxNiUgNDUlKSIsICJoc2woMjE1IDE2JSA3NSUpIil9OwogICAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgfQoKICAgICAgICAuaGVhZGVyLWZpbGVuYW1lIHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgICBmbGV4OiAxOwogICAgICAgIH0KCiAgICAgICAgLmhlYWRlci1iYWRnZSB7CiAgICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgICAgcGFkZGluZzogMnB4IDhweDsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDU5LCAxMzAsIDI0NiwgMC4xKSIsICJyZ2JhKDU5LCAxMzAsIDI0NiwgMC4xNSkiKX07CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzYwYTVmYSIpfTsKICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB9CgogICAgICAgIC5jb250ZW50LWFyZWEgewogICAgICAgICAgZmxleDogMTsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICBtaW4taGVpZ2h0OiAyMDBweDsKICAgICAgICB9CgogICAgICAgIC5jb250ZW50LWFyZWEgPiAqIHsKICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIH0KCiAgICAgICAgZGVlcy1pbWFnZS12aWV3ZXIgewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgfQoKICAgICAgICBkZWVzLXBkZi12aWV3ZXIgewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgfQoKICAgICAgICBkZWVzLXZpZGVvLXZpZXdlciB7CiAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB9CgogICAgICAgIGRlZXMtYXVkaW8tdmlld2VyIHsKICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIH0KCiAgICAgICAgZGVlcy1kYXRhdmlldy1jb2RlYm94IHsKICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIH0KCiAgICAgICAgLnRleHQtdmlld2VyIHsKICAgICAgICAgIG1hcmdpbjogMDsKICAgICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgICBmb250LWZhbWlseTogdWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsIG1vbm9zcGFjZTsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICB9CgogICAgICAgIC5wbGFjZWhvbGRlciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgIGdhcDogMTJweDsKICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgIG1pbi1oZWlnaHQ6IDIwMHB4OwogICAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjYTFhMWFhIiwgIiM3MTcxN2EiKX07CiAgICAgICAgfQoKICAgICAgICAucGxhY2Vob2xkZXIgZGVlcy1pY29uIHsKICAgICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICAgIGZvbnQtc2l6ZTogMzJweDsKICAgICAgICB9CgogICAgICAgIC5wbGFjZWhvbGRlci10ZXh0IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CgogICAgICAgIC5sb2FkaW5nLWNvbnRhaW5lciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgICAgbWluLWhlaWdodDogMjAwcHg7CiAgICAgICAgfQoKICAgICAgICAubG9hZGluZy1zcGlubmVyIHsKICAgICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgICAgYm9yZGVyOiAzcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlNWU3ZWIiLCAiIzNmM2Y0NiIpfTsKICAgICAgICAgIGJvcmRlci10b3AtY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiM2MGE1ZmEiKX07CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgICBhbmltYXRpb246IHNwaW4gMC44cyBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgfQoKICAgICAgICBAa2V5ZnJhbWVzIHNwaW4gewogICAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9CiAgICAgICAgfQoKICAgICAgICAuZXJyb3ItY29udGFpbmVyIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICBtaW4taGVpZ2h0OiAyMDBweDsKICAgICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2RjMjYyNiIsICIjZjg3MTcxIil9OwogICAgICAgIH0KCiAgICAgICAgLmVycm9yLWNvbnRhaW5lciBkZWVzLWljb24gewogICAgICAgICAgZm9udC1zaXplOiAzMnB4OwogICAgICAgIH0KCiAgICAgICAgLmVycm9yLXRleHQgewogICAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIH0KICAgICAgPC9zdHlsZT4KCiAgICAgIDxkaXYgY2xhc3M9InByZXZpZXctY29udGFpbmVyIj4KICAgICAgICAke3RoaXMuc2hvd0ZpbGVuYW1lICYmIGRpc3BsYXlOYW1lID8gYjJgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItYmFyIj4KICAgICAgICAgICAgPGRlZXMtaWNvbiBjbGFzcz0iaGVhZGVyLWljb24iIGljb249IiR7VFlQRV9JQ09OU1t0aGlzLnJlc29sdmVkVHlwZV19Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImhlYWRlci1maWxlbmFtZSI+JHtkaXNwbGF5TmFtZX08L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJoZWFkZXItYmFkZ2UiPiR7dGhpcy5yZXNvbHZlZFR5cGV9PC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgYCA6ICIifQoKICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50LWFyZWEiPgogICAgICAgICAgJHt0aGlzLmVycm9yID8gYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVycm9yLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6QWxlcnRUcmlhbmdsZSI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yLXRleHQiPiR7dGhpcy5lcnJvcn08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYCA6IHRoaXMubG9hZGluZyA/IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2FkaW5nLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibG9hZGluZy1zcGlubmVyIj48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgIDogdGhpcy5yZW5kZXJDb250ZW50KCl9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIHJlbmRlckNvbnRlbnQoKSB7CiAgICAgIHN3aXRjaCAodGhpcy5yZXNvbHZlZFR5cGUpIHsKICAgICAgICBjYXNlICJpbWFnZSI6CiAgICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgICA8ZGVlcy1pbWFnZS12aWV3ZXIKICAgICAgICAgICAgLnNyYz0ke3RoaXMucmVzb2x2ZWRTcmN9CiAgICAgICAgICAgIC5zaG93VG9vbGJhcj0ke3RoaXMuc2hvd1Rvb2xiYXJ9CiAgICAgICAgICAgIGFsdD0iJHt0aGlzLmZpbGVuYW1lIHx8ICIifSIKICAgICAgICAgID48L2RlZXMtaW1hZ2Utdmlld2VyPgogICAgICAgIGA7CiAgICAgICAgY2FzZSAicGRmIjoKICAgICAgICAgIHJldHVybiBiMmAKICAgICAgICAgIDxkZWVzLXBkZi12aWV3ZXIKICAgICAgICAgICAgLnBkZlVybD0ke3RoaXMucmVzb2x2ZWRTcmN9CiAgICAgICAgICAgIC5zaG93VG9vbGJhcj0ke3RoaXMuc2hvd1Rvb2xiYXJ9CiAgICAgICAgICAgIGluaXRpYWxab29tPSJwYWdlLWZpdCIKICAgICAgICAgID48L2RlZXMtcGRmLXZpZXdlcj4KICAgICAgICBgOwogICAgICAgIGNhc2UgImF1ZGlvIjoKICAgICAgICAgIHJldHVybiBiMmAKICAgICAgICAgIDxkZWVzLWF1ZGlvLXZpZXdlcgogICAgICAgICAgICAuc3JjPSR7dGhpcy5yZXNvbHZlZFNyY30KICAgICAgICAgICAgLnRpdGxlPSR7dGhpcy5maWxlbmFtZSB8fCB0aGlzLmZpbGU/Lm5hbWUgfHwgIiJ9CiAgICAgICAgICA+PC9kZWVzLWF1ZGlvLXZpZXdlcj4KICAgICAgICBgOwogICAgICAgIGNhc2UgInZpZGVvIjoKICAgICAgICAgIHJldHVybiBiMmAKICAgICAgICAgIDxkZWVzLXZpZGVvLXZpZXdlcgogICAgICAgICAgICAuc3JjPSR7dGhpcy5yZXNvbHZlZFNyY30KICAgICAgICAgID48L2RlZXMtdmlkZW8tdmlld2VyPgogICAgICAgIGA7CiAgICAgICAgY2FzZSAiY29kZSI6CiAgICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgICA8ZGVlcy1kYXRhdmlldy1jb2RlYm94CiAgICAgICAgICAgIC5wcm9nTGFuZz0ke3RoaXMucmVzb2x2ZWRMYW5nfQogICAgICAgICAgICAuY29kZVRvRGlzcGxheT0ke3RoaXMucmVzb2x2ZWRUZXh0fQogICAgICAgICAgPjwvZGVlcy1kYXRhdmlldy1jb2RlYm94PgogICAgICAgIGA7CiAgICAgICAgY2FzZSAidGV4dCI6CiAgICAgICAgICByZXR1cm4gYjJgPHByZSBjbGFzcz0idGV4dC12aWV3ZXIiPiR7dGhpcy5yZXNvbHZlZFRleHR9PC9wcmU+YDsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIGIyYAogICAgICAgICAgPGRpdiBjbGFzcz0icGxhY2Vob2xkZXIiPgogICAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpGaWxlUXVlc3Rpb24iPjwvZGVlcy1pY29uPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0icGxhY2Vob2xkZXItdGV4dCI+UHJldmlldyBub3QgYXZhaWxhYmxlPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgYDsKICAgICAgfQogICAgfQogICAgYXN5bmMgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgICBzdXBlci51cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgY29uc3QgcmVsZXZhbnQgPSBbInVybCIsICJmaWxlIiwgImJhc2U2NCIsICJ0ZXh0Q29udGVudCIsICJjb250ZW50VHlwZSIsICJsYW5ndWFnZSIsICJtaW1lVHlwZSIsICJmaWxlbmFtZSJdOwogICAgICBjb25zdCBuZWVkc1Jlc29sdmUgPSByZWxldmFudC5zb21lKChrZXkyKSA9PiBjaGFuZ2VkUHJvcGVydGllcy5oYXMoa2V5MikpOwogICAgICBpZiAobmVlZHNSZXNvbHZlKSB7CiAgICAgICAgYXdhaXQgdGhpcy5yZXNvbHZlQ29udGVudCgpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgdGhpcy5yZXZva2VPYmplY3RVcmwoKTsKICAgIH0KICAgIGFzeW5jIHJlc29sdmVDb250ZW50KCkgewogICAgICB0aGlzLmVycm9yID0gIiI7CiAgICAgIHRoaXMucmV2b2tlT2JqZWN0VXJsKCk7CiAgICAgIHRoaXMucmVzb2x2ZWRUeXBlID0gdGhpcy5kZXRlY3RUeXBlKCk7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKHRoaXMudXJsKSB7CiAgICAgICAgICB0aGlzLnJlc29sdmVkU3JjID0gdGhpcy51cmw7CiAgICAgICAgICBpZiAodGhpcy5yZXNvbHZlZFR5cGUgPT09ICJjb2RlIiB8fCB0aGlzLnJlc29sdmVkVHlwZSA9PT0gInRleHQiKSB7CiAgICAgICAgICAgIGlmICghdGhpcy50ZXh0Q29udGVudCkgewogICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7CiAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0aGlzLnVybCk7CiAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlZFRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlZFRleHQgPSB0aGlzLnRleHRDb250ZW50OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZpbGUpIHsKICAgICAgICAgIHRoaXMub2JqZWN0VXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTCh0aGlzLmZpbGUpOwogICAgICAgICAgdGhpcy5yZXNvbHZlZFNyYyA9IHRoaXMub2JqZWN0VXJsOwogICAgICAgICAgaWYgKHRoaXMucmVzb2x2ZWRUeXBlID09PSAiY29kZSIgfHwgdGhpcy5yZXNvbHZlZFR5cGUgPT09ICJ0ZXh0IikgewogICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICB0aGlzLnJlc29sdmVkVGV4dCA9IGF3YWl0IHRoaXMuZmlsZS50ZXh0KCk7CiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodGhpcy5iYXNlNjQpIHsKICAgICAgICAgIGNvbnN0IG1pbWUgPSB0aGlzLm1pbWVUeXBlIHx8ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOwogICAgICAgICAgdGhpcy5yZXNvbHZlZFNyYyA9IGBkYXRhOiR7bWltZX07YmFzZTY0LCR7dGhpcy5iYXNlNjR9YDsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGV4dENvbnRlbnQpIHsKICAgICAgICAgIHRoaXMucmVzb2x2ZWRUZXh0ID0gdGhpcy50ZXh0Q29udGVudDsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHRoaXMuZXJyb3IgPSAiRmFpbGVkIHRvIGxvYWQgY29udGVudCI7CiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICAgIH0KICAgICAgdGhpcy5yZXNvbHZlZExhbmcgPSB0aGlzLnJlc29sdmVMYW5ndWFnZSgpOwogICAgfQogICAgZGV0ZWN0VHlwZSgpIHsKICAgICAgaWYgKHRoaXMuY29udGVudFR5cGUpCiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFR5cGU7CiAgICAgIGNvbnN0IG1pbWUgPSB0aGlzLm1pbWVUeXBlIHx8IHRoaXMuZmlsZT8udHlwZSB8fCAiIjsKICAgICAgaWYgKG1pbWUpIHsKICAgICAgICBpZiAobWltZSA9PT0gImFwcGxpY2F0aW9uL3BkZiIpCiAgICAgICAgICByZXR1cm4gInBkZiI7CiAgICAgICAgZm9yIChjb25zdCBbcHJlZml4NCwgdHlwZTVdIG9mIE9iamVjdC5lbnRyaWVzKE1JTUVfUFJFRklYX01BUCkpIHsKICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGgocHJlZml4NCkpCiAgICAgICAgICAgIHJldHVybiB0eXBlNTsKICAgICAgICB9CiAgICAgICAgaWYgKG1pbWUuc3RhcnRzV2l0aCgidGV4dC8iKSkKICAgICAgICAgIHJldHVybiAidGV4dCI7CiAgICAgIH0KICAgICAgY29uc3QgZXh0ID0gdGhpcy5nZXRFeHRlbnNpb24oKTsKICAgICAgaWYgKGV4dCAmJiBFWFRFTlNJT05fTUFQW2V4dF0pCiAgICAgICAgcmV0dXJuIEVYVEVOU0lPTl9NQVBbZXh0XTsKICAgICAgaWYgKHRoaXMudGV4dENvbnRlbnQpIHsKICAgICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZSA/ICJjb2RlIiA6ICJ0ZXh0IjsKICAgICAgfQogICAgICByZXR1cm4gInVua25vd24iOwogICAgfQogICAgZ2V0RXh0ZW5zaW9uKCkgewogICAgICBjb25zdCBuYW1lID0gdGhpcy5maWxlbmFtZSB8fCB0aGlzLmZpbGU/Lm5hbWUgfHwgIiI7CiAgICAgIGlmIChuYW1lKSB7CiAgICAgICAgY29uc3QgcGFydHMgPSBuYW1lLnNwbGl0KCIuIik7CiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpCiAgICAgICAgICByZXR1cm4gcGFydHMucG9wKCkudG9Mb3dlckNhc2UoKTsKICAgICAgfQogICAgICBpZiAodGhpcy51cmwpIHsKICAgICAgICB0cnkgewogICAgICAgICAgY29uc3QgcGF0aG5hbWUgPSBuZXcgVVJMKHRoaXMudXJsLCAiaHR0cHM6Ly9wbGFjZWhvbGRlci5jb20iKS5wYXRobmFtZTsKICAgICAgICAgIGNvbnN0IHBhcnRzID0gcGF0aG5hbWUuc3BsaXQoIi4iKTsKICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKQogICAgICAgICAgICByZXR1cm4gcGFydHMucG9wKCkudG9Mb3dlckNhc2UoKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuICIiOwogICAgfQogICAgZ2V0RmlsZW5hbWVGcm9tVXJsKCkgewogICAgICBpZiAoIXRoaXMudXJsKQogICAgICAgIHJldHVybiAiIjsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBwYXRobmFtZSA9IG5ldyBVUkwodGhpcy51cmwsICJodHRwczovL3BsYWNlaG9sZGVyLmNvbSIpLnBhdGhuYW1lOwogICAgICAgIHJldHVybiBwYXRobmFtZS5zcGxpdCgiLyIpLnBvcCgpIHx8ICIiOwogICAgICB9IGNhdGNoIHsKICAgICAgICByZXR1cm4gIiI7CiAgICAgIH0KICAgIH0KICAgIHJlc29sdmVMYW5ndWFnZSgpIHsKICAgICAgaWYgKHRoaXMubGFuZ3VhZ2UpCiAgICAgICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2U7CiAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZ2V0RXh0ZW5zaW9uKCk7CiAgICAgIHJldHVybiBFWFRFTlNJT05fTEFOR19NQVBbZXh0XSB8fCAidGV4dCI7CiAgICB9CiAgICByZXZva2VPYmplY3RVcmwoKSB7CiAgICAgIGlmICh0aGlzLm9iamVjdFVybCkgewogICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodGhpcy5vYmplY3RVcmwpOwogICAgICAgIHRoaXMub2JqZWN0VXJsID0gIiI7CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzNzkoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNQcmV2aWV3MiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy1wZGYtc2hhcmVkL0NhbnZhc1Bvb2wuanMKdmFyIENhbnZhc1Bvb2wgPSBjbGFzcyB7CiAgc3RhdGljIHBvb2wgPSBbXTsKICBzdGF0aWMgbWF4UG9vbFNpemUgPSAyMDsKICBzdGF0aWMgTUlOX0NBTlZBU19TSVpFID0gMjU2OwogIHN0YXRpYyBNQVhfQ0FOVkFTX1NJWkUgPSA0MDk2OwogIHN0YXRpYyBhY3F1aXJlKHdpZHRoLCBoZWlnaHQpIHsKICAgIGNvbnN0IHN1aXRhYmxlID0gdGhpcy5wb29sLmZpbmQoKGl0ZW0pID0+ICFpdGVtLmluVXNlICYmIGl0ZW0uY2FudmFzLndpZHRoID49IHdpZHRoICYmIGl0ZW0uY2FudmFzLmhlaWdodCA+PSBoZWlnaHQgJiYgaXRlbS5jYW52YXMud2lkdGggPD0gd2lkdGggKiAxLjUgJiYgaXRlbS5jYW52YXMuaGVpZ2h0IDw9IGhlaWdodCAqIDEuNSk7CiAgICBpZiAoc3VpdGFibGUpIHsKICAgICAgc3VpdGFibGUuaW5Vc2UgPSB0cnVlOwogICAgICBzdWl0YWJsZS5sYXN0VXNlZCA9IERhdGUubm93KCk7CiAgICAgIHN1aXRhYmxlLmNhbnZhcy53aWR0aCA9IHdpZHRoOwogICAgICBzdWl0YWJsZS5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICBzdWl0YWJsZS5jdHguY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwogICAgICByZXR1cm4gc3VpdGFibGU7CiAgICB9CiAgICBpZiAodGhpcy5wb29sLmxlbmd0aCA8IHRoaXMubWF4UG9vbFNpemUpIHsKICAgICAgY29uc3QgY2FudmFzMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgICBjb25zdCBjdHgyID0gY2FudmFzMi5nZXRDb250ZXh0KCIyZCIsIHsKICAgICAgICBhbHBoYTogdHJ1ZSwKICAgICAgICBkZXN5bmNocm9uaXplZDogdHJ1ZQogICAgICB9KTsKICAgICAgY2FudmFzMi53aWR0aCA9IE1hdGgubWluKE1hdGgubWF4KHdpZHRoLCB0aGlzLk1JTl9DQU5WQVNfU0laRSksIHRoaXMuTUFYX0NBTlZBU19TSVpFKTsKICAgICAgY2FudmFzMi5oZWlnaHQgPSBNYXRoLm1pbihNYXRoLm1heChoZWlnaHQsIHRoaXMuTUlOX0NBTlZBU19TSVpFKSwgdGhpcy5NQVhfQ0FOVkFTX1NJWkUpOwogICAgICBjb25zdCBwb29sZWRDYW52YXMgPSB7CiAgICAgICAgY2FudmFzOiBjYW52YXMyLAogICAgICAgIGN0eDogY3R4MiwKICAgICAgICBpblVzZTogdHJ1ZSwKICAgICAgICBsYXN0VXNlZDogRGF0ZS5ub3coKQogICAgICB9OwogICAgICB0aGlzLnBvb2wucHVzaChwb29sZWRDYW52YXMpOwogICAgICByZXR1cm4gcG9vbGVkQ2FudmFzOwogICAgfQogICAgY29uc3QgbHJ1ID0gdGhpcy5wb29sLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaW5Vc2UpLnNvcnQoKGE1LCBiNikgPT4gYTUubGFzdFVzZWQgLSBiNi5sYXN0VXNlZClbMF07CiAgICBpZiAobHJ1KSB7CiAgICAgIGxydS5jYW52YXMud2lkdGggPSB3aWR0aDsKICAgICAgbHJ1LmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7CiAgICAgIGxydS5jdHguY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwogICAgICBscnUuaW5Vc2UgPSB0cnVlOwogICAgICBscnUubGFzdFVzZWQgPSBEYXRlLm5vdygpOwogICAgICByZXR1cm4gbHJ1OwogICAgfQogICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7CiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoOwogICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDsKICAgIHJldHVybiB7CiAgICAgIGNhbnZhcywKICAgICAgY3R4LAogICAgICBpblVzZTogdHJ1ZSwKICAgICAgbGFzdFVzZWQ6IERhdGUubm93KCkKICAgIH07CiAgfQogIHN0YXRpYyByZWxlYXNlKHBvb2xlZENhbnZhcykgewogICAgaWYgKHRoaXMucG9vbC5pbmNsdWRlcyhwb29sZWRDYW52YXMpKSB7CiAgICAgIHBvb2xlZENhbnZhcy5pblVzZSA9IGZhbHNlOwogICAgICBwb29sZWRDYW52YXMuY3R4LmNsZWFyUmVjdCgwLCAwLCBwb29sZWRDYW52YXMuY2FudmFzLndpZHRoLCBwb29sZWRDYW52YXMuY2FudmFzLmhlaWdodCk7CiAgICB9CiAgfQogIHN0YXRpYyByZWxlYXNlQWxsKCkgewogICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMucG9vbCkgewogICAgICBpdGVtLmluVXNlID0gZmFsc2U7CiAgICAgIGl0ZW0uY3R4LmNsZWFyUmVjdCgwLCAwLCBpdGVtLmNhbnZhcy53aWR0aCwgaXRlbS5jYW52YXMuaGVpZ2h0KTsKICAgIH0KICB9CiAgc3RhdGljIGRlc3Ryb3koKSB7CiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5wb29sKSB7CiAgICAgIGl0ZW0uY2FudmFzLndpZHRoID0gMDsKICAgICAgaXRlbS5jYW52YXMuaGVpZ2h0ID0gMDsKICAgIH0KICAgIHRoaXMucG9vbCA9IFtdOwogIH0KICBzdGF0aWMgZ2V0U3RhdHMoKSB7CiAgICByZXR1cm4gewogICAgICBwb29sU2l6ZTogdGhpcy5wb29sLmxlbmd0aCwKICAgICAgbWF4UG9vbFNpemU6IHRoaXMubWF4UG9vbFNpemUsCiAgICAgIGluVXNlOiB0aGlzLnBvb2wuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmluVXNlKS5sZW5ndGgsCiAgICAgIGF2YWlsYWJsZTogdGhpcy5wb29sLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaW5Vc2UpLmxlbmd0aAogICAgfTsKICB9CiAgc3RhdGljIGFkanVzdFBvb2xTaXplKG5ld1NpemUpIHsKICAgIGlmIChuZXdTaXplIDwgdGhpcy5wb29sLmxlbmd0aCkgewogICAgICBjb25zdCB0b1JlbW92ZSA9IHRoaXMucG9vbC5sZW5ndGggLSBuZXdTaXplOwogICAgICBjb25zdCByZW1vdmVkID0gdGhpcy5wb29sLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaW5Vc2UpLnNsaWNlKDAsIHRvUmVtb3ZlKTsKICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHJlbW92ZWQpIHsKICAgICAgICBjb25zdCBpbmRleDIgPSB0aGlzLnBvb2wuaW5kZXhPZihpdGVtKTsKICAgICAgICBpZiAoaW5kZXgyID4gLTEpIHsKICAgICAgICAgIHRoaXMucG9vbC5zcGxpY2UoaW5kZXgyLCAxKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRoaXMubWF4UG9vbFNpemUgPSBuZXdTaXplOwogIH0KfTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXBkZi1zaGFyZWQvdXRpbHMuanMKZnVuY3Rpb24gZGVib3VuY2UzKGZ1bmMsIHdhaXQyKSB7CiAgbGV0IHRpbWVvdXQyOwogIHJldHVybiBmdW5jdGlvbiBleGVjdXRlZEZ1bmN0aW9uKC4uLmFyZ3MpIHsKICAgIGNvbnN0IGxhdGVyID0gKCkgPT4gewogICAgICBjbGVhclRpbWVvdXQodGltZW91dDIpOwogICAgICBmdW5jKC4uLmFyZ3MpOwogICAgfTsKICAgIGNsZWFyVGltZW91dCh0aW1lb3V0Mik7CiAgICB0aW1lb3V0MiA9IHdpbmRvdy5zZXRUaW1lb3V0KGxhdGVyLCB3YWl0Mik7CiAgfTsKfQpmdW5jdGlvbiB0aHJvdHRsZTIoZnVuYywgbGltaXQpIHsKICBsZXQgaW5UaHJvdHRsZTsKICByZXR1cm4gZnVuY3Rpb24gZXhlY3V0ZWRGdW5jdGlvbiguLi5hcmdzKSB7CiAgICBpZiAoIWluVGhyb3R0bGUpIHsKICAgICAgZnVuYy5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgaW5UaHJvdHRsZSA9IHRydWU7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gaW5UaHJvdHRsZSA9IGZhbHNlLCBsaW1pdCk7CiAgICB9CiAgfTsKfQpmdW5jdGlvbiBmb3JtYXRGaWxlU2l6ZShieXRlcykgewogIGlmIChieXRlcyA9PT0gMCkKICAgIHJldHVybiAiMCBCeXRlcyI7CiAgY29uc3QgazUgPSAxMDI0OwogIGNvbnN0IHNpemVzID0gWyJCeXRlcyIsICJLQiIsICJNQiIsICJHQiJdOwogIGNvbnN0IGkxMSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coazUpKTsKICByZXR1cm4gTWF0aC5yb3VuZChieXRlcyAvIE1hdGgucG93KGs1LCBpMTEpICogMTAwKSAvIDEwMCArICIgIiArIHNpemVzW2kxMV07Cn0KZnVuY3Rpb24gaXNJblZpZXdwb3J0KGVsZW1lbnQ0LCBtYXJnaW4gPSAwKSB7CiAgY29uc3QgcmVjdCA9IGVsZW1lbnQ0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIHJldHVybiByZWN0LnRvcCA+PSAtbWFyZ2luICYmIHJlY3QubGVmdCA+PSAtbWFyZ2luICYmIHJlY3QuYm90dG9tIDw9ICh3aW5kb3cuaW5uZXJIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkgKyBtYXJnaW4gJiYgcmVjdC5yaWdodCA8PSAod2luZG93LmlubmVyV2lkdGggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSArIG1hcmdpbjsKfQp2YXIgUGVyZm9ybWFuY2VNb25pdG9yID0gY2xhc3MgewogIHN0YXRpYyBtYXJrcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgc3RhdGljIG1lYXN1cmVzID0gW107CiAgc3RhdGljIG1hcmsobmFtZSkgewogICAgdGhpcy5tYXJrcy5zZXQobmFtZSwgcGVyZm9ybWFuY2Uubm93KCkpOwogIH0KICBzdGF0aWMgbWVhc3VyZShuYW1lLCBzdGFydE1hcmspIHsKICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5tYXJrcy5nZXQoc3RhcnRNYXJrKTsKICAgIGlmIChzdGFydCkgewogICAgICBjb25zdCBkdXJhdGlvbiA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7CiAgICAgIHRoaXMubWVhc3VyZXMucHVzaCh7IG5hbWUsIGR1cmF0aW9uIH0pOwogICAgICB0aGlzLm1hcmtzLmRlbGV0ZShzdGFydE1hcmspOwogICAgICByZXR1cm4gZHVyYXRpb247CiAgICB9CiAgICByZXR1cm4gMDsKICB9CiAgc3RhdGljIGdldFJlcG9ydCgpIHsKICAgIGNvbnN0IHJlcG9ydCA9IHsKICAgICAgbWVhc3VyZXM6IFsuLi50aGlzLm1lYXN1cmVzXSwKICAgICAgYXZlcmFnZXM6IHt9CiAgICB9OwogICAgY29uc3QgZ3JvdXBlZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBmb3IgKGNvbnN0IG1lYXN1cmUgb2YgdGhpcy5tZWFzdXJlcykgewogICAgICBpZiAoIWdyb3VwZWQuaGFzKG1lYXN1cmUubmFtZSkpIHsKICAgICAgICBncm91cGVkLnNldChtZWFzdXJlLm5hbWUsIFtdKTsKICAgICAgfQogICAgICBncm91cGVkLmdldChtZWFzdXJlLm5hbWUpLnB1c2gobWVhc3VyZS5kdXJhdGlvbik7CiAgICB9CiAgICBmb3IgKGNvbnN0IFtuYW1lLCBkdXJhdGlvbnNdIG9mIGdyb3VwZWQpIHsKICAgICAgcmVwb3J0LmF2ZXJhZ2VzW25hbWVdID0gZHVyYXRpb25zLnJlZHVjZSgoYTUsIGI2KSA9PiBhNSArIGI2LCAwKSAvIGR1cmF0aW9ucy5sZW5ndGg7CiAgICB9CiAgICByZXR1cm4gcmVwb3J0OwogIH0KICBzdGF0aWMgY2xlYXIoKSB7CiAgICB0aGlzLm1hcmtzLmNsZWFyKCk7CiAgICB0aGlzLm1lYXN1cmVzID0gW107CiAgfQp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW1lZGlhL2RlZXMtdGlsZS1zaGFyZWQvc3R5bGVzLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciB0aWxlQmFzZVN0eWxlcyA9IFsKICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgaWAKICAgIDpob3N0IHsKICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB9CgogICAgLnRpbGUtY29udGFpbmVyIHsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB3aWR0aDogMjAwcHg7CiAgICAgIGhlaWdodDogMjYwcHg7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5OCUpIiwgImhzbCgyMTUgMjAlIDE0JSkiKX07CiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjJzIGVhc2U7CiAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjEyKSIsICJyZ2JhKDAsIDAsIDAsIDAuMjQpIil9OwoKICAgIH0KCiAgICAudGlsZS1jb250YWluZXIuY2xpY2thYmxlIHsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgfQoKICAgIC50aWxlLWNvbnRhaW5lci5jbGlja2FibGU6aG92ZXIgewogICAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJyZ2JhKDAsIDAsIDAsIDAuMTIpIiwgInJnYmEoMCwgMCwgMCwgMC4zKSIpfTsKICAgIH0KCiAgICAudGlsZS1jb250YWluZXIuY2xpY2thYmxlOmhvdmVyIC50aWxlLW92ZXJsYXkgewogICAgICBvcGFjaXR5OiAxOwogICAgfQoKICAgIC50aWxlLWNvbnRlbnQgewogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgfQoKICAgIC50aWxlLW92ZXJsYXkgewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHRvcDogMDsKICAgICAgbGVmdDogMDsKICAgICAgcmlnaHQ6IDA7CiAgICAgIGJvdHRvbTogMDsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMCwgMCwgMCwgMC43KSIsICJyZ2JhKDAsIDAsIDAsIDAuOCkiKX07CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICBnYXA6IDhweDsKICAgICAgb3BhY2l0eTogMDsKICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2U7CiAgICAgIHotaW5kZXg6IDIwOwogICAgfQoKICAgIC50aWxlLW92ZXJsYXkgZGVlcy1pY29uIHsKICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICBjb2xvcjogd2hpdGU7CiAgICB9CgogICAgLnRpbGUtb3ZlcmxheSBzcGFuIHsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICBmb250LXdlaWdodDogNTAwOwogICAgICBjb2xvcjogd2hpdGU7CiAgICB9CgogICAgLnRpbGUtaW5mby1iYXIgewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIGJvdHRvbTogMDsKICAgICAgbGVmdDogMDsKICAgICAgcmlnaHQ6IDA7CiAgICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlIC8gMC45NSkiLCAiaHNsKDIxNSAyMCUgMTIlIC8gMC45NSkiKX07CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGdhcDogNnB4OwogICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAxNiUgNDUlKSIsICJoc2woMjE1IDE2JSA3NSUpIil9OwogICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTJweCk7CiAgICAgIHotaW5kZXg6IDI1OwogICAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgfQoKICAgIC5pbmZvLWxhYmVsIHsKICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIG1pbi13aWR0aDogMDsKICAgIH0KCiAgICAuaW5mby1zcGFjZXIgewogICAgICBmbGV4OiAxOwogICAgfQoKICAgIC5pbmZvLWRldGFpbCB7CiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIG9wYWNpdHk6IDAuNzsKICAgICAgZmxleC1zaHJpbms6IDA7CiAgICB9CgogICAgLnRpbGUtbG9hZGluZywKICAgIC50aWxlLWVycm9yIHsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB0b3A6IDA7CiAgICAgIGxlZnQ6IDA7CiAgICAgIHJpZ2h0OiAwOwogICAgICBib3R0b206IDA7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICBnYXA6IDEycHg7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAxNiUgNDUlKSIsICJoc2woMjE1IDE2JSA3NSUpIil9OwogICAgfQoKICAgIC50aWxlLWxvYWRpbmcgewogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTklKSIsICJoc2woMjE1IDIwJSAxNCUpIil9OwogICAgfQoKICAgIC50aWxlLWVycm9yIHsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcyJSA5OCUpIiwgImhzbCgwIDYyJSAyMCUpIil9OwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcyJSA0MCUpIiwgImhzbCgwIDcwJSA2OCUpIil9OwogICAgfQoKICAgIC50aWxlLWVycm9yIGRlZXMtaWNvbiB7CiAgICAgIGZvbnQtc2l6ZTogMzJweDsKICAgIH0KCiAgICAudGlsZS1zcGlubmVyIHsKICAgICAgd2lkdGg6IDI0cHg7CiAgICAgIGhlaWdodDogMjRweDsKICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICBib3JkZXI6IDJweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNCAzMSUgODYlKSIsICJoc2woMjE3IDI1JSAyOCUpIil9OwogICAgICBib3JkZXItdG9wLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNyA5MSUgNjAlKSIsICJoc2woMjEzIDkzJSA2OCUpIil9OwogICAgICBhbmltYXRpb246IHNwaW4gMC44cyBsaW5lYXIgaW5maW5pdGU7CiAgICB9CgogICAgLnRpbGUtbG9hZGluZy10ZXh0LAogICAgLnRpbGUtZXJyb3ItdGV4dCB7CiAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIH0KCiAgICBAa2V5ZnJhbWVzIHNwaW4gewogICAgICB0byB7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgfQogICAgfQoKICAgIC8qIFNpemUgdmFyaWFudHMgKi8KICAgIDpob3N0KFtzaXplPSJzbWFsbCJdKSAudGlsZS1jb250YWluZXIgewogICAgICB3aWR0aDogMTUwcHg7CiAgICAgIGhlaWdodDogMTk1cHg7CiAgICB9CgogICAgOmhvc3QoW3NpemU9ImxhcmdlIl0pIC50aWxlLWNvbnRhaW5lciB7CiAgICAgIHdpZHRoOiAyNTBweDsKICAgICAgaGVpZ2h0OiAzMjVweDsKICAgIH0KCiAgICAvKiBHcmlkIG9wdGltaXphdGlvbnMgKi8KICAgIDpob3N0KFtncmlkLW1vZGVdKSAudGlsZS1jb250YWluZXIgewogICAgICB3aWxsLWNoYW5nZTogYXV0bzsKICAgIH0KICBgCl07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy10aWxlLXNoYXJlZC9EZWVzVGlsZUJhc2UuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF9kZWVzX2ljb24oKTsKdmFyIF9fZXNEZWNvcmF0ZTc5ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM4MCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1RpbGVCYXNlID0gKCgpID0+IHsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX2NsaWNrYWJsZV9kZWNvcmF0b3JzOwogIGxldCBfY2xpY2thYmxlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xpY2thYmxlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sb2FkaW5nX2RlY29yYXRvcnM7CiAgbGV0IF9sb2FkaW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbG9hZGluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZXJyb3JfZGVjb3JhdG9yczsKICBsZXQgX2Vycm9yX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZXJyb3JfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NpemVfZGVjb3JhdG9yczsKICBsZXQgX3NpemVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaXplX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sYWJlbF9kZWNvcmF0b3JzOwogIGxldCBfbGFiZWxfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9sYWJlbF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHJldHVybiBjbGFzcyBEZWVzVGlsZUJhc2UgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2NsaWNrYWJsZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9sb2FkaW5nX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2Vycm9yX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3NpemVfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZywgcmVmbGVjdDogdHJ1ZSB9KV07CiAgICAgIF9sYWJlbF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX19lc0RlY29yYXRlNzkodGhpcywgbnVsbCwgX2NsaWNrYWJsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjbGlja2FibGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImNsaWNrYWJsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jbGlja2FibGUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNsaWNrYWJsZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jbGlja2FibGVfaW5pdGlhbGl6ZXJzLCBfY2xpY2thYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzkodGhpcywgbnVsbCwgX2xvYWRpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibG9hZGluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibG9hZGluZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sb2FkaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5sb2FkaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xvYWRpbmdfaW5pdGlhbGl6ZXJzLCBfbG9hZGluZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc5KHRoaXMsIG51bGwsIF9lcnJvcl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJlcnJvciIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZXJyb3IiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZXJyb3IsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmVycm9yID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2Vycm9yX2luaXRpYWxpemVycywgX2Vycm9yX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlNzkodGhpcywgbnVsbCwgX3NpemVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2l6ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2l6ZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaXplLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zaXplID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NpemVfaW5pdGlhbGl6ZXJzLCBfc2l6ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTc5KHRoaXMsIG51bGwsIF9sYWJlbF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsYWJlbCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibGFiZWwiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubGFiZWwsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxhYmVsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xhYmVsX2luaXRpYWxpemVycywgX2xhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IHRpbGVCYXNlU3R5bGVzOwogICAgI2NsaWNrYWJsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM4MCh0aGlzLCBfY2xpY2thYmxlX2luaXRpYWxpemVycywgdHJ1ZSk7CiAgICBnZXQgY2xpY2thYmxlKCkgewogICAgICByZXR1cm4gdGhpcy4jY2xpY2thYmxlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY2xpY2thYmxlKHZhbHVlMikgewogICAgICB0aGlzLiNjbGlja2FibGVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4MCh0aGlzLCBfY2xpY2thYmxlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4MCh0aGlzLCBfbG9hZGluZ19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgbG9hZGluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsb2FkaW5nKHZhbHVlMikgewogICAgICB0aGlzLiNsb2FkaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZXJyb3JfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgwKHRoaXMsIF9sb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4MCh0aGlzLCBfZXJyb3JfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGVycm9yKCkgewogICAgICByZXR1cm4gdGhpcy4jZXJyb3JfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBlcnJvcih2YWx1ZTIpIHsKICAgICAgdGhpcy4jZXJyb3JfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4MCh0aGlzLCBfZXJyb3JfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczgwKHRoaXMsIF9zaXplX2luaXRpYWxpemVycywgImRlZmF1bHQiKSk7CiAgICBnZXQgc2l6ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NpemVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaXplKHZhbHVlMikgewogICAgICB0aGlzLiNzaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbGFiZWxfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgwKHRoaXMsIF9zaXplX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4MCh0aGlzLCBfbGFiZWxfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGxhYmVsKCkgewogICAgICByZXR1cm4gdGhpcy4jbGFiZWxfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsYWJlbCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbGFiZWxfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIG9ic2VydmVyID0gX19ydW5Jbml0aWFsaXplcnM4MCh0aGlzLCBfbGFiZWxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgX3Zpc2libGUgPSBmYWxzZTsKICAgIC8qKiBXaGV0aGVyIHRoaXMgdGlsZSBpcyBjdXJyZW50bHkgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnQgKi8KICAgIGdldCBpc1Zpc2libGUoKSB7CiAgICAgIHJldHVybiB0aGlzLl92aXNpYmxlOwogICAgfQogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYKICAgICAgICBjbGFzcz0idGlsZS1jb250YWluZXIgJHt0aGlzLmNsaWNrYWJsZSA/ICJjbGlja2FibGUiIDogIiJ9ICR7dGhpcy5sb2FkaW5nID8gImxvYWRpbmciIDogIiJ9ICR7dGhpcy5lcnJvciA/ICJlcnJvciIgOiAiIn0iCiAgICAgICAgQGNsaWNrPSR7dGhpcy5oYW5kbGVUaWxlQ2xpY2t9CiAgICAgICAgQG1vdXNlZW50ZXI9JHt0aGlzLm9uVGlsZU1vdXNlRW50ZXJ9CiAgICAgICAgQG1vdXNlbGVhdmU9JHt0aGlzLm9uVGlsZU1vdXNlTGVhdmV9CiAgICAgICAgQG1vdXNlbW92ZT0ke3RoaXMub25UaWxlTW91c2VNb3ZlfQogICAgICA+CiAgICAgICAgJHt0aGlzLmxvYWRpbmcgPyBiMmAKICAgICAgICAgIDxkaXYgY2xhc3M9InRpbGUtbG9hZGluZyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpbGUtc3Bpbm5lciI+PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpbGUtbG9hZGluZy10ZXh0Ij5Mb2FkaW5nLi4uPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgIDogIiJ9CgogICAgICAgICR7dGhpcy5lcnJvciA/IGIyYAogICAgICAgICAgPGRpdiBjbGFzcz0idGlsZS1lcnJvciI+CiAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOkFsZXJ0VHJpYW5nbGUiPjwvZGVlcy1pY29uPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aWxlLWVycm9yLXRleHQiPkZhaWxlZCB0byBsb2FkPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgIDogIiJ9CgogICAgICAgICR7IXRoaXMubG9hZGluZyAmJiAhdGhpcy5lcnJvciA/IHRoaXMucmVuZGVyVGlsZUNvbnRlbnQoKSA6ICIifQoKICAgICAgICAke3RoaXMucmVuZGVyQm90dG9tQmFyKCl9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIC8qKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgdG8gcmVuZGVyIGEgYm90dG9tIGluZm8gYmFyIHdpdGggbWV0YWRhdGEgKi8KICAgIHJlbmRlckJvdHRvbUJhcigpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuc2V0dXBJbnRlcnNlY3Rpb25PYnNlcnZlcigpOwogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGlmICh0aGlzLm9ic2VydmVyKSB7CiAgICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgdGhpcy5vYnNlcnZlciA9IHZvaWQgMDsKICAgICAgfQogICAgfQogICAgc2V0dXBJbnRlcnNlY3Rpb25PYnNlcnZlcigpIHsKICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZW50cmllcykgPT4gewogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykgewogICAgICAgICAgY29uc3Qgd2FzVmlzaWJsZSA9IHRoaXMuX3Zpc2libGU7CiAgICAgICAgICB0aGlzLl92aXNpYmxlID0gZW50cnkuaXNJbnRlcnNlY3Rpbmc7CiAgICAgICAgICBpZiAodGhpcy5fdmlzaWJsZSAmJiAhd2FzVmlzaWJsZSkgewogICAgICAgICAgICB0aGlzLm9uQmVjYW1lVmlzaWJsZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwgeyByb290OiBudWxsLCByb290TWFyZ2luOiAiMjAwcHgiLCB0aHJlc2hvbGQ6IDAuMDEgfSk7CiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzKTsKICAgIH0KICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgdGlsZSBmaXJzdCBlbnRlcnMgdGhlIHZpZXdwb3J0LiBPdmVycmlkZSBmb3IgbGF6eSBsb2FkaW5nLiAqLwogICAgb25CZWNhbWVWaXNpYmxlKCkgewogICAgfQogICAgLyoqIENhbGxlZCB3aGVuIG1vdXNlIGVudGVycyB0aGUgdGlsZSBjb250YWluZXIuIE92ZXJyaWRlIGluIHN1YmNsYXNzZXMuICovCiAgICBvblRpbGVNb3VzZUVudGVyKCkgewogICAgfQogICAgLyoqIENhbGxlZCB3aGVuIG1vdXNlIGxlYXZlcyB0aGUgdGlsZSBjb250YWluZXIuIE92ZXJyaWRlIGluIHN1YmNsYXNzZXMuICovCiAgICBvblRpbGVNb3VzZUxlYXZlKCkgewogICAgfQogICAgLyoqIENhbGxlZCB3aGVuIG1vdXNlIG1vdmVzIG92ZXIgdGhlIHRpbGUgY29udGFpbmVyLiBPdmVycmlkZSBpbiBzdWJjbGFzc2VzLiAqLwogICAgb25UaWxlTW91c2VNb3ZlKF9lKSB7CiAgICB9CiAgICBoYW5kbGVUaWxlQ2xpY2soKSB7CiAgICAgIGlmICghdGhpcy5jbGlja2FibGUpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJ0aWxlLWNsaWNrIiwgewogICAgICAgIGRldGFpbDogdGhpcy5nZXRUaWxlQ2xpY2tEZXRhaWwoKSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pKTsKICAgIH0KICAgIC8qKiBSZXR1cm4gdGhlIGRldGFpbCBvYmplY3QgZm9yIHRpbGUtY2xpY2sgZXZlbnRzLiBPdmVycmlkZSBpbiBzdWJjbGFzc2VzLiAqLwogICAgZ2V0VGlsZUNsaWNrRGV0YWlsKCkgewogICAgICByZXR1cm4ge307CiAgICB9CiAgfTsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXRpbGUtcGRmL3N0eWxlcy5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgdGlsZVBkZlN0eWxlcyA9IGlgCiAgLnByZXZpZXctc3RhY2sgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBwYWRkaW5nOiA4cHggOHB4IDI4cHggOHB4OwogIH0KCiAgLnByZXZpZXctc3RhY2subm9uLWE0IHsKICAgIHBhZGRpbmc6IDEycHggMTJweCAyOHB4IDEycHg7CiAgfQoKICAucHJldmlldy1jYW52YXMgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICB3aWR0aDogYXV0bzsKICAgIGhlaWdodDogYXV0bzsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47CiAgICBpbWFnZS1yZW5kZXJpbmc6IGF1dG87CiAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgwLCAwLCAwLCAwLjEpIiwgInJnYmEoMCwgMCwgMCwgMC4zKSIpfTsKICB9CgogIC5ub24tYTQgLnByZXZpZXctY2FudmFzIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE0IDMxJSA5MiUpIiwgImhzbCgyMTcgMjUlIDI0JSkiKX07CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgfQoKICAvKiBHcmlkIG9wdGltaXphdGlvbnMgKi8KICA6aG9zdChbZ3JpZC1tb2RlXSkgLnByZXZpZXctY2FudmFzIHsKICAgIGltYWdlLXJlbmRlcmluZzogLXdlYmtpdC1vcHRpbWl6ZS1jb250cmFzdDsKICAgIGltYWdlLXJlbmRlcmluZzogY3Jpc3AtZWRnZXM7CiAgfQpgOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW1lZGlhL2RlZXMtdGlsZS1wZGYvZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtbzUgPSAoKSA9PiB7CiAgY29uc3Qgc2FtcGxlUGRmcyA9IFsKICAgICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbW96aWxsYS9wZGYuanMvYmEyZWRlYWUvZXhhbXBsZXMvbGVhcm5pbmcvaGVsbG93b3JsZC5wZGYiLAogICAgImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9tb3ppbGxhL3BkZi5qcy9iYTJlZGVhZS93ZWIvY29tcHJlc3NlZC50cmFjZW1vbmtleS1wbGRpLTA5LnBkZiIKICBdOwogIGNvbnN0IGdlbmVyYXRlR3JpZEl0ZW1zID0gKGNvdW50MikgPT4gewogICAgY29uc3QgaXRlbXMgPSBbXTsKICAgIGZvciAobGV0IGkxMSA9IDA7IGkxMSA8IGNvdW50MjsgaTExKyspIHsKICAgICAgY29uc3QgcGRmVXJsID0gc2FtcGxlUGRmc1tpMTEgJSBzYW1wbGVQZGZzLmxlbmd0aF07CiAgICAgIGl0ZW1zLnB1c2goYjJgCiAgICAgICAgPGRlZXMtdGlsZS1wZGYKICAgICAgICAgIHBkZlVybD0iJHtwZGZVcmx9IgogICAgICAgICAgY2xpY2thYmxlPSJ0cnVlIgogICAgICAgICAgZ3JpZC1tb2RlCiAgICAgICAgICBAdGlsZS1jbGljaz0keyhlMTEpID0+IHsKICAgICAgICBjb25zb2xlLmxvZygiUERGIFRpbGUgY2xpY2tlZDoiLCBlMTEuZGV0YWlsKTsKICAgICAgICBhbGVydChgUERGIGNsaWNrZWQ6ICR7ZTExLmRldGFpbC5wYWdlQ291bnR9IHBhZ2VzYCk7CiAgICAgIH19CiAgICAgICAgPjwvZGVlcy10aWxlLXBkZj4KICAgICAgYCk7CiAgICB9CiAgICByZXR1cm4gaXRlbXM7CiAgfTsKICByZXR1cm4gYjJgCiAgICA8c3R5bGU+CiAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZzogNDBweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y1ZjVmNSIsICIjMGEwYTBhIil9OwogICAgICB9CgogICAgICAuZGVtby1zZWN0aW9uIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiA2MHB4OwogICAgICB9CgogICAgICBoMyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgICAgfQoKICAgICAgLnByZXZpZXctZ3JpZCB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgyMDBweCwgMWZyKSk7CiAgICAgICAgZ2FwOiAyNHB4OwogICAgICB9CgogICAgICAucHJldmlldy1yb3cgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiAyNHB4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKICAgICAgfQoKICAgICAgLnByZXZpZXctbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIG1pbi13aWR0aDogMTAwcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMz5TaW5nbGUgUERGIFRpbGU8L2gzPgogICAgICAgIDxkZWVzLXRpbGUtcGRmCiAgICAgICAgICBwZGZVcmw9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9tb3ppbGxhL3BkZi5qcy9iYTJlZGVhZS93ZWIvY29tcHJlc3NlZC50cmFjZW1vbmtleS1wbGRpLTA5LnBkZiIKICAgICAgICAgIGNsaWNrYWJsZT0idHJ1ZSIKICAgICAgICA+PC9kZWVzLXRpbGUtcGRmPgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgzPkRpZmZlcmVudCBTaXplczwvaDM+CiAgICAgICAgPGRpdiBjbGFzcz0icHJldmlldy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0icHJldmlldy1sYWJlbCI+U21hbGw6PC9kaXY+CiAgICAgICAgICA8ZGVlcy10aWxlLXBkZgogICAgICAgICAgICBzaXplPSJzbWFsbCIKICAgICAgICAgICAgcGRmVXJsPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbW96aWxsYS9wZGYuanMvYmEyZWRlYWUvZXhhbXBsZXMvbGVhcm5pbmcvaGVsbG93b3JsZC5wZGYiCiAgICAgICAgICAgIGNsaWNrYWJsZT0idHJ1ZSIKICAgICAgICAgID48L2RlZXMtdGlsZS1wZGY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9InByZXZpZXctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9InByZXZpZXctbGFiZWwiPkRlZmF1bHQ6PC9kaXY+CiAgICAgICAgICA8ZGVlcy10aWxlLXBkZgogICAgICAgICAgICBwZGZVcmw9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9tb3ppbGxhL3BkZi5qcy9iYTJlZGVhZS9leGFtcGxlcy9sZWFybmluZy9oZWxsb3dvcmxkLnBkZiIKICAgICAgICAgICAgY2xpY2thYmxlPSJ0cnVlIgogICAgICAgICAgPjwvZGVlcy10aWxlLXBkZj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0icHJldmlldy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0icHJldmlldy1sYWJlbCI+TGFyZ2U6PC9kaXY+CiAgICAgICAgICA8ZGVlcy10aWxlLXBkZgogICAgICAgICAgICBzaXplPSJsYXJnZSIKICAgICAgICAgICAgcGRmVXJsPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbW96aWxsYS9wZGYuanMvYmEyZWRlYWUvZXhhbXBsZXMvbGVhcm5pbmcvaGVsbG93b3JsZC5wZGYiCiAgICAgICAgICAgIGNsaWNrYWJsZT0idHJ1ZSIKICAgICAgICAgID48L2RlZXMtdGlsZS1wZGY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDM+V2l0aCBMYWJlbDwvaDM+CiAgICAgICAgPGRlZXMtdGlsZS1wZGYKICAgICAgICAgIHBkZlVybD0iaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL21vemlsbGEvcGRmLmpzL2JhMmVkZWFlL3dlYi9jb21wcmVzc2VkLnRyYWNlbW9ua2V5LXBsZGktMDkucGRmIgogICAgICAgICAgY2xpY2thYmxlPSJ0cnVlIgogICAgICAgICAgbGFiZWw9IlJlc2VhcmNoIFBhcGVyLnBkZiIKICAgICAgICA+PC9kZWVzLXRpbGUtcGRmPgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgzPk5vbi1DbGlja2FibGU8L2gzPgogICAgICAgIDxkZWVzLXRpbGUtcGRmCiAgICAgICAgICBwZGZVcmw9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9tb3ppbGxhL3BkZi5qcy9iYTJlZGVhZS9leGFtcGxlcy9sZWFybmluZy9oZWxsb3dvcmxkLnBkZiIKICAgICAgICAgIGNsaWNrYWJsZT0iZmFsc2UiCiAgICAgICAgPjwvZGVlcy10aWxlLXBkZj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMz5HcmlkIC0gMjAgUERGcyB3aXRoIExhenkgTG9hZGluZzwvaDM+CiAgICAgICAgPGRpdiBjbGFzcz0icHJldmlldy1ncmlkIj4KICAgICAgICAgICR7Z2VuZXJhdGVHcmlkSXRlbXMoMjApfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIGA7Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy10aWxlLXBkZi9jb21wb25lbnQuanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIF9fZXNEZWNvcmF0ZTgwID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM4MSA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1RpbGVQZGYgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtdGlsZS1wZGYiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc1RpbGVCYXNlOwogIGxldCBfcGRmVXJsX2RlY29yYXRvcnM7CiAgbGV0IF9wZGZVcmxfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wZGZVcmxfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2N1cnJlbnRQcmV2aWV3UGFnZV9kZWNvcmF0b3JzOwogIGxldCBfY3VycmVudFByZXZpZXdQYWdlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VycmVudFByZXZpZXdQYWdlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9wYWdlQ291bnRfZGVjb3JhdG9yczsKICBsZXQgX3BhZ2VDb3VudF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BhZ2VDb3VudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVuZGVyZWRfZGVjb3JhdG9yczsKICBsZXQgX3JlbmRlcmVkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcmVuZGVyZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzSG92ZXJpbmdfZGVjb3JhdG9yczsKICBsZXQgX2lzSG92ZXJpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0hvdmVyaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0E0Rm9ybWF0X2RlY29yYXRvcnM7CiAgbGV0IF9pc0E0Rm9ybWF0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNBNEZvcm1hdF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZmlsZVNpemVfZGVjb3JhdG9yczsKICBsZXQgX2ZpbGVTaXplX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZmlsZVNpemVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1RpbGVQZGYyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfcGRmVXJsX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfY3VycmVudFByZXZpZXdQYWdlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfcGFnZUNvdW50X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfcmVuZGVyZWRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEJvb2xlYW4gfSldOwogICAgICBfaXNIb3ZlcmluZ19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9pc0E0Rm9ybWF0X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX2ZpbGVTaXplX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTgwKHRoaXMsIG51bGwsIF9wZGZVcmxfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicGRmVXJsIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJwZGZVcmwiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucGRmVXJsLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5wZGZVcmwgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcGRmVXJsX2luaXRpYWxpemVycywgX3BkZlVybF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTgwKHRoaXMsIG51bGwsIF9jdXJyZW50UHJldmlld1BhZ2VfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY3VycmVudFByZXZpZXdQYWdlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjdXJyZW50UHJldmlld1BhZ2UiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3VycmVudFByZXZpZXdQYWdlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jdXJyZW50UHJldmlld1BhZ2UgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY3VycmVudFByZXZpZXdQYWdlX2luaXRpYWxpemVycywgX2N1cnJlbnRQcmV2aWV3UGFnZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTgwKHRoaXMsIG51bGwsIF9wYWdlQ291bnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicGFnZUNvdW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJwYWdlQ291bnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucGFnZUNvdW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5wYWdlQ291bnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcGFnZUNvdW50X2luaXRpYWxpemVycywgX3BhZ2VDb3VudF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTgwKHRoaXMsIG51bGwsIF9yZW5kZXJlZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJyZW5kZXJlZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicmVuZGVyZWQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucmVuZGVyZWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnJlbmRlcmVkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3JlbmRlcmVkX2luaXRpYWxpemVycywgX3JlbmRlcmVkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODAodGhpcywgbnVsbCwgX2lzSG92ZXJpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNIb3ZlcmluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNIb3ZlcmluZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc0hvdmVyaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc0hvdmVyaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzSG92ZXJpbmdfaW5pdGlhbGl6ZXJzLCBfaXNIb3ZlcmluZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTgwKHRoaXMsIG51bGwsIF9pc0E0Rm9ybWF0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzQTRGb3JtYXQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImlzQTRGb3JtYXQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNBNEZvcm1hdCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNBNEZvcm1hdCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pc0E0Rm9ybWF0X2luaXRpYWxpemVycywgX2lzQTRGb3JtYXRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4MCh0aGlzLCBudWxsLCBfZmlsZVNpemVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZmlsZVNpemUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZpbGVTaXplIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmZpbGVTaXplLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5maWxlU2l6ZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9maWxlU2l6ZV9pbml0aWFsaXplcnMsIF9maWxlU2l6ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTgwKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1RpbGVQZGYyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtbzU7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiTWVkaWEiLCAiUERGIl07CiAgICBzdGF0aWMgc3R5bGVzID0gWy4uLnRpbGVCYXNlU3R5bGVzLCB0aWxlUGRmU3R5bGVzXTsKICAgICNwZGZVcmxfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzODEodGhpcywgX3BkZlVybF9pbml0aWFsaXplcnMsICIiKTsKICAgIGdldCBwZGZVcmwoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwZGZVcmxfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwZGZVcmwodmFsdWUyKSB7CiAgICAgIHRoaXMuI3BkZlVybF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2N1cnJlbnRQcmV2aWV3UGFnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODEodGhpcywgX3BkZlVybF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODEodGhpcywgX2N1cnJlbnRQcmV2aWV3UGFnZV9pbml0aWFsaXplcnMsIDEpKTsKICAgIGdldCBjdXJyZW50UHJldmlld1BhZ2UoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjdXJyZW50UHJldmlld1BhZ2VfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjdXJyZW50UHJldmlld1BhZ2UodmFsdWUyKSB7CiAgICAgIHRoaXMuI2N1cnJlbnRQcmV2aWV3UGFnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3BhZ2VDb3VudF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODEodGhpcywgX2N1cnJlbnRQcmV2aWV3UGFnZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODEodGhpcywgX3BhZ2VDb3VudF9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBwYWdlQ291bnQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwYWdlQ291bnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwYWdlQ291bnQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3BhZ2VDb3VudF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3JlbmRlcmVkX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4MSh0aGlzLCBfcGFnZUNvdW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4MSh0aGlzLCBfcmVuZGVyZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHJlbmRlcmVkKCkgewogICAgICByZXR1cm4gdGhpcy4jcmVuZGVyZWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCByZW5kZXJlZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcmVuZGVyZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpc0hvdmVyaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4MSh0aGlzLCBfcmVuZGVyZWRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczgxKHRoaXMsIF9pc0hvdmVyaW5nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc0hvdmVyaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNIb3ZlcmluZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzSG92ZXJpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzSG92ZXJpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpc0E0Rm9ybWF0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4MSh0aGlzLCBfaXNIb3ZlcmluZ19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODEodGhpcywgX2lzQTRGb3JtYXRfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgaXNBNEZvcm1hdCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzQTRGb3JtYXRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc0E0Rm9ybWF0KHZhbHVlMikgewogICAgICB0aGlzLiNpc0E0Rm9ybWF0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZmlsZVNpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgxKHRoaXMsIF9pc0E0Rm9ybWF0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4MSh0aGlzLCBfZmlsZVNpemVfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgZmlsZVNpemUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNmaWxlU2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGZpbGVTaXplKHZhbHVlMikgewogICAgICB0aGlzLiNmaWxlU2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgcmVuZGVyUGFnZXNUYXNrID0gKF9fcnVuSW5pdGlhbGl6ZXJzODEodGhpcywgX2ZpbGVTaXplX2V4dHJhSW5pdGlhbGl6ZXJzKSwgbnVsbCk7CiAgICByZW5kZXJQYWdlc1F1ZXVlZCA9IGZhbHNlOwogICAgcGRmRG9jdW1lbnQ7CiAgICBjYW52YXNlcyA9IFtdOwogICAgcmVzaXplT2JzZXJ2ZXI7CiAgICBzdGFja0VsZW1lbnQgPSBudWxsOwogICAgbG9hZGVkUGRmVXJsID0gbnVsbDsKICAgIHJlbmRlclRpbGVDb250ZW50KCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InByZXZpZXctc3RhY2sgJHshdGhpcy5pc0E0Rm9ybWF0ID8gIm5vbi1hNCIgOiAiIn0iPgogICAgICAgIDxjYW52YXMKICAgICAgICAgIGNsYXNzPSJwcmV2aWV3LWNhbnZhcyIKICAgICAgICAgIGRhdGEtcGFnZT0iJHt0aGlzLmN1cnJlbnRQcmV2aWV3UGFnZX0iCiAgICAgICAgPjwvY2FudmFzPgogICAgICA8L2Rpdj4KCiAgICAgICR7dGhpcy5jbGlja2FibGUgPyBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJ0aWxlLW92ZXJsYXkiPgogICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6RXllIj48L2RlZXMtaWNvbj4KICAgICAgICAgIDxzcGFuPlZpZXcgUERGPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICBgIDogIiJ9CiAgICBgOwogICAgfQogICAgcmVuZGVyQm90dG9tQmFyKCkgewogICAgICBpZiAoIXRoaXMucGFnZUNvdW50ICYmICF0aGlzLmxhYmVsKQogICAgICAgIHJldHVybiAiIjsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJ0aWxlLWluZm8tYmFyIj4KICAgICAgICAke3RoaXMubGFiZWwgPyBiMmA8c3BhbiBjbGFzcz0iaW5mby1sYWJlbCIgdGl0bGU9IiR7dGhpcy5sYWJlbH0iPiR7dGhpcy5sYWJlbH08L3NwYW4+YCA6ICIifQogICAgICAgIDxzcGFuIGNsYXNzPSJpbmZvLXNwYWNlciI+PC9zcGFuPgogICAgICAgICR7dGhpcy5wYWdlQ291bnQgPiAxICYmIHRoaXMuaXNIb3ZlcmluZyA/IGIyYDxzcGFuIGNsYXNzPSJpbmZvLWRldGFpbCI+JHt0aGlzLmN1cnJlbnRQcmV2aWV3UGFnZX0vJHt0aGlzLnBhZ2VDb3VudH08L3NwYW4+YCA6IHRoaXMucGFnZUNvdW50ID4gMCA/IGIyYDxzcGFuIGNsYXNzPSJpbmZvLWRldGFpbCI+JHt0aGlzLnBhZ2VDb3VudH0gcGc8L3NwYW4+YCA6ICIifQogICAgICAgICR7dGhpcy5maWxlU2l6ZSA+IDAgPyBiMmA8c3BhbiBjbGFzcz0iaW5mby1kZXRhaWwiPiR7Zm9ybWF0RmlsZVNpemUodGhpcy5maWxlU2l6ZSl9PC9zcGFuPmAgOiAiIn0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgZ2V0VGlsZUNsaWNrRGV0YWlsKCkgewogICAgICByZXR1cm4gewogICAgICAgIHBkZlVybDogdGhpcy5wZGZVcmwsCiAgICAgICAgcGFnZUNvdW50OiB0aGlzLnBhZ2VDb3VudAogICAgICB9OwogICAgfQogICAgb25CZWNhbWVWaXNpYmxlKCkgewogICAgICBpZiAoIXRoaXMucmVuZGVyZWQgJiYgdGhpcy5wZGZVcmwpIHsKICAgICAgICB0aGlzLmxvYWRBbmRSZW5kZXJQcmV2aWV3KCk7CiAgICAgIH0KICAgIH0KICAgIG9uVGlsZU1vdXNlRW50ZXIoKSB7CiAgICAgIHRoaXMuaXNIb3ZlcmluZyA9IHRydWU7CiAgICB9CiAgICBvblRpbGVNb3VzZUxlYXZlKCkgewogICAgICB0aGlzLmlzSG92ZXJpbmcgPSBmYWxzZTsKICAgICAgaWYgKHRoaXMuY3VycmVudFByZXZpZXdQYWdlICE9PSAxKSB7CiAgICAgICAgdGhpcy5jdXJyZW50UHJldmlld1BhZ2UgPSAxOwogICAgICAgIHZvaWQgdGhpcy5zY2hlZHVsZVJlbmRlclBhZ2VzKCk7CiAgICAgIH0KICAgIH0KICAgIG9uVGlsZU1vdXNlTW92ZShlMTEpIHsKICAgICAgaWYgKCF0aGlzLmlzSG92ZXJpbmcgfHwgdGhpcy5wYWdlQ291bnQgPD0gMSkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBjb25zdCB4NCA9IGUxMS5jbGllbnRYIC0gcmVjdC5sZWZ0OwogICAgICBjb25zdCB3aWR0aCA9IHJlY3Qud2lkdGg7CiAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB4NCAvIHdpZHRoKSk7CiAgICAgIGNvbnN0IG5ld1BhZ2UgPSBNYXRoLmNlaWwocGVyY2VudGFnZSAqIHRoaXMucGFnZUNvdW50KSB8fCAxOwogICAgICBpZiAobmV3UGFnZSAhPT0gdGhpcy5jdXJyZW50UHJldmlld1BhZ2UpIHsKICAgICAgICB0aGlzLmN1cnJlbnRQcmV2aWV3UGFnZSA9IG5ld1BhZ2U7CiAgICAgICAgdm9pZCB0aGlzLnNjaGVkdWxlUmVuZGVyUGFnZXMoKTsKICAgICAgfQogICAgfQogICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7CiAgICAgIHRoaXMuY2FjaGVFbGVtZW50cygpOwogICAgICB0aGlzLnNldHVwUmVzaXplT2JzZXJ2ZXIoKTsKICAgIH0KICAgIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLmNsZWFudXAoKTsKICAgICAgdGhpcy5yZXNpemVPYnNlcnZlcj8uZGlzY29ubmVjdCgpOwogICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gdm9pZCAwOwogICAgfQogICAgYXN5bmMgbG9hZEFuZFJlbmRlclByZXZpZXcoKSB7CiAgICAgIGlmICh0aGlzLnJlbmRlcmVkIHx8IHRoaXMubG9hZGluZykKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7CiAgICAgIHRoaXMuZXJyb3IgPSBmYWxzZTsKICAgICAgUGVyZm9ybWFuY2VNb25pdG9yLm1hcmsoYHByZXZpZXctbG9hZC0ke3RoaXMucGRmVXJsfWApOwogICAgICB0cnkgewogICAgICAgIHRoaXMucGRmRG9jdW1lbnQgPSBhd2FpdCBQZGZNYW5hZ2VyLmxvYWREb2N1bWVudCh0aGlzLnBkZlVybCk7CiAgICAgICAgdGhpcy5wYWdlQ291bnQgPSB0aGlzLnBkZkRvY3VtZW50Lm51bVBhZ2VzOwogICAgICAgIHRoaXMuY3VycmVudFByZXZpZXdQYWdlID0gMTsKICAgICAgICB0cnkgewogICAgICAgICAgY29uc3QgZG93bmxvYWRJbmZvID0gYXdhaXQgdGhpcy5wZGZEb2N1bWVudC5nZXREb3dubG9hZEluZm8oKTsKICAgICAgICAgIHRoaXMuZmlsZVNpemUgPSBkb3dubG9hZEluZm8ubGVuZ3RoOwogICAgICAgIH0gY2F0Y2ggewogICAgICAgIH0KICAgICAgICB0aGlzLmxvYWRlZFBkZlVybCA9IHRoaXMucGRmVXJsOwogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7CiAgICAgICAgdGhpcy5jYWNoZUVsZW1lbnRzKCk7CiAgICAgICAgYXdhaXQgdGhpcy5zY2hlZHVsZVJlbmRlclBhZ2VzKCk7CiAgICAgICAgdGhpcy5yZW5kZXJlZCA9IHRydWU7CiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBQZXJmb3JtYW5jZU1vbml0b3IubWVhc3VyZShgcHJldmlldy1yZW5kZXItJHt0aGlzLnBkZlVybH1gLCBgcHJldmlldy1sb2FkLSR7dGhpcy5wZGZVcmx9YCk7CiAgICAgICAgY29uc29sZS5sb2coYFBERiB0aWxlIHJlbmRlcmVkIGluICR7ZHVyYXRpb259bXNgKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gbG9hZCBQREYgdGlsZToiLCBlcnJvcik7CiAgICAgICAgdGhpcy5lcnJvciA9IHRydWU7CiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHNjaGVkdWxlUmVuZGVyUGFnZXMoKSB7CiAgICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkgewogICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICAgICAgfQogICAgICBpZiAodGhpcy5yZW5kZXJQYWdlc1Rhc2spIHsKICAgICAgICB0aGlzLnJlbmRlclBhZ2VzUXVldWVkID0gdHJ1ZTsKICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJQYWdlc1Rhc2s7CiAgICAgIH0KICAgICAgdGhpcy5yZW5kZXJQYWdlc1Rhc2sgPSAoYXN5bmMgKCkgPT4gewogICAgICAgIHRyeSB7CiAgICAgICAgICBhd2FpdCB0aGlzLnBlcmZvcm1SZW5kZXJQYWdlcygpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gcmVuZGVyIFBERiB0aWxlIHBhZ2VzOiIsIGVycm9yKTsKICAgICAgICB9CiAgICAgIH0pKCkuZmluYWxseSgoKSA9PiB7CiAgICAgICAgdGhpcy5yZW5kZXJQYWdlc1Rhc2sgPSBudWxsOwogICAgICAgIGlmICh0aGlzLnJlbmRlclBhZ2VzUXVldWVkKSB7CiAgICAgICAgICB0aGlzLnJlbmRlclBhZ2VzUXVldWVkID0gZmFsc2U7CiAgICAgICAgICB2b2lkIHRoaXMuc2NoZWR1bGVSZW5kZXJQYWdlcygpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiB0aGlzLnJlbmRlclBhZ2VzVGFzazsKICAgIH0KICAgIGFzeW5jIHBlcmZvcm1SZW5kZXJQYWdlcygpIHsKICAgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KQogICAgICAgIHJldHVybjsKICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZTIpKTsKICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIucHJldmlldy1jYW52YXMiKTsKICAgICAgaWYgKCFjYW52YXMpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLmNsZWFyQ2FudmFzZXMoKTsKICAgICAgdGhpcy5jYWNoZUVsZW1lbnRzKCk7CiAgICAgIGNvbnN0IHsgYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCB9ID0gdGhpcy5nZXRBdmFpbGFibGVTaXplKCk7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcGFnZU51bSA9IHRoaXMuY3VycmVudFByZXZpZXdQYWdlOwogICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCB0aGlzLnBkZkRvY3VtZW50LmdldFBhZ2UocGFnZU51bSk7CiAgICAgICAgY29uc3QgaW5pdGlhbFZpZXdwb3J0ID0gcGFnZS5nZXRWaWV3cG9ydCh7IHNjYWxlOiAxIH0pOwogICAgICAgIGNvbnN0IGFzcGVjdFJhdGlvID0gaW5pdGlhbFZpZXdwb3J0LmhlaWdodCAvIGluaXRpYWxWaWV3cG9ydC53aWR0aDsKICAgICAgICBjb25zdCBhNFBvcnRyYWl0UmF0aW8gPSAxLjQxNDsKICAgICAgICBjb25zdCBhNExhbmRzY2FwZVJhdGlvID0gMC43MDc7CiAgICAgICAgY29uc3QgbGV0dGVyUG9ydHJhaXRSYXRpbyA9IDEuMjk0OwogICAgICAgIGNvbnN0IGxldHRlckxhbmRzY2FwZVJhdGlvID0gMC43NzM7CiAgICAgICAgY29uc3QgdG9sZXJhbmNlID0gMC4wNTsKICAgICAgICBjb25zdCBpc0E0UG9ydHJhaXQgPSBNYXRoLmFicyhhc3BlY3RSYXRpbyAtIGE0UG9ydHJhaXRSYXRpbykgPCBhNFBvcnRyYWl0UmF0aW8gKiB0b2xlcmFuY2U7CiAgICAgICAgY29uc3QgaXNBNExhbmRzY2FwZSA9IE1hdGguYWJzKGFzcGVjdFJhdGlvIC0gYTRMYW5kc2NhcGVSYXRpbykgPCBhNExhbmRzY2FwZVJhdGlvICogdG9sZXJhbmNlOwogICAgICAgIGNvbnN0IGlzTGV0dGVyUG9ydHJhaXQgPSBNYXRoLmFicyhhc3BlY3RSYXRpbyAtIGxldHRlclBvcnRyYWl0UmF0aW8pIDwgbGV0dGVyUG9ydHJhaXRSYXRpbyAqIHRvbGVyYW5jZTsKICAgICAgICBjb25zdCBpc0xldHRlckxhbmRzY2FwZSA9IE1hdGguYWJzKGFzcGVjdFJhdGlvIC0gbGV0dGVyTGFuZHNjYXBlUmF0aW8pIDwgbGV0dGVyTGFuZHNjYXBlUmF0aW8gKiB0b2xlcmFuY2U7CiAgICAgICAgdGhpcy5pc0E0Rm9ybWF0ID0gaXNBNFBvcnRyYWl0IHx8IGlzQTRMYW5kc2NhcGUgfHwgaXNMZXR0ZXJQb3J0cmFpdCB8fCBpc0xldHRlckxhbmRzY2FwZTsKICAgICAgICBjb25zdCBhZGp1c3RlZFdpZHRoID0gdGhpcy5pc0E0Rm9ybWF0ID8gYXZhaWxhYmxlV2lkdGggOiBhdmFpbGFibGVXaWR0aCAtIDI0OwogICAgICAgIGNvbnN0IGFkanVzdGVkSGVpZ2h0ID0gdGhpcy5pc0E0Rm9ybWF0ID8gYXZhaWxhYmxlSGVpZ2h0IDogYXZhaWxhYmxlSGVpZ2h0IC0gMjQ7CiAgICAgICAgY29uc3Qgc2NhbGVYID0gYWRqdXN0ZWRXaWR0aCA+IDAgPyBhZGp1c3RlZFdpZHRoIC8gaW5pdGlhbFZpZXdwb3J0LndpZHRoIDogMDsKICAgICAgICBjb25zdCBzY2FsZVkgPSBhZGp1c3RlZEhlaWdodCA+IDAgPyBhZGp1c3RlZEhlaWdodCAvIGluaXRpYWxWaWV3cG9ydC5oZWlnaHQgOiAwOwogICAgICAgIGNvbnN0IGJhc2VTY2FsZSA9IE1hdGgubWluKHNjYWxlWCB8fCAwLjUsIHNjYWxlWSB8fCBzY2FsZVggfHwgMC41KTsKICAgICAgICBjb25zdCByZW5kZXJTY2FsZSA9IE1hdGgubWluKGJhc2VTY2FsZSAqIDIsIDMpOwogICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHJlbmRlclNjYWxlKSB8fCByZW5kZXJTY2FsZSA8PSAwKSB7CiAgICAgICAgICBwYWdlLmNsZWFudXA/LigpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZTogcmVuZGVyU2NhbGUgfSk7CiAgICAgICAgY29uc3QgcG9vbGVkQ2FudmFzID0gQ2FudmFzUG9vbC5hY3F1aXJlKHZpZXdwb3J0LndpZHRoLCB2aWV3cG9ydC5oZWlnaHQpOwogICAgICAgIHRoaXMuY2FudmFzZXMucHVzaChwb29sZWRDYW52YXMpOwogICAgICAgIGNvbnN0IHJlbmRlckNvbnRleHQgPSB7CiAgICAgICAgICBjYW52YXNDb250ZXh0OiBwb29sZWRDYW52YXMuY3R4LAogICAgICAgICAgdmlld3BvcnQKICAgICAgICB9OwogICAgICAgIGF3YWl0IHBhZ2UucmVuZGVyKHJlbmRlckNvbnRleHQpLnByb21pc2U7CiAgICAgICAgY2FudmFzLndpZHRoID0gdmlld3BvcnQud2lkdGg7CiAgICAgICAgY2FudmFzLmhlaWdodCA9IHZpZXdwb3J0LmhlaWdodDsKICAgICAgICBjb25zdCBkaXNwbGF5V2lkdGggPSBhZGp1c3RlZFdpZHRoOwogICAgICAgIGNvbnN0IGRpc3BsYXlIZWlnaHQgPSB2aWV3cG9ydC5oZWlnaHQgLyB2aWV3cG9ydC53aWR0aCAqIGFkanVzdGVkV2lkdGg7CiAgICAgICAgaWYgKGRpc3BsYXlIZWlnaHQgPiBhZGp1c3RlZEhlaWdodCkgewogICAgICAgICAgY29uc3QgYWx0RGlzcGxheUhlaWdodCA9IGFkanVzdGVkSGVpZ2h0OwogICAgICAgICAgY29uc3QgYWx0RGlzcGxheVdpZHRoID0gdmlld3BvcnQud2lkdGggLyB2aWV3cG9ydC5oZWlnaHQgKiBhZGp1c3RlZEhlaWdodDsKICAgICAgICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IGAke2FsdERpc3BsYXlXaWR0aH1weGA7CiAgICAgICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gYCR7YWx0RGlzcGxheUhlaWdodH1weGA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IGAke2Rpc3BsYXlXaWR0aH1weGA7CiAgICAgICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gYCR7ZGlzcGxheUhlaWdodH1weGA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgIGlmIChjdHgpIHsKICAgICAgICAgIGN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSB0cnVlOwogICAgICAgICAgY3R4LmltYWdlU21vb3RoaW5nUXVhbGl0eSA9ICJoaWdoIjsKICAgICAgICAgIGN0eC5kcmF3SW1hZ2UocG9vbGVkQ2FudmFzLmNhbnZhcywgMCwgMCk7CiAgICAgICAgfQogICAgICAgIHBhZ2UuY2xlYW51cCgpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byByZW5kZXIgcGFnZSAke3RoaXMuY3VycmVudFByZXZpZXdQYWdlfTpgLCBlcnJvcik7CiAgICAgIH0KICAgIH0KICAgIGNsZWFyQ2FudmFzZXMoKSB7CiAgICAgIGZvciAoY29uc3QgcG9vbGVkQ2FudmFzIG9mIHRoaXMuY2FudmFzZXMpIHsKICAgICAgICBDYW52YXNQb29sLnJlbGVhc2UocG9vbGVkQ2FudmFzKTsKICAgICAgfQogICAgICB0aGlzLmNhbnZhc2VzID0gW107CiAgICB9CiAgICBjbGVhbnVwKCkgewogICAgICB0aGlzLmNsZWFyQ2FudmFzZXMoKTsKICAgICAgaWYgKHRoaXMucGRmRG9jdW1lbnQpIHsKICAgICAgICBQZGZNYW5hZ2VyLnJlbGVhc2VEb2N1bWVudCh0aGlzLmxvYWRlZFBkZlVybCA/PyB0aGlzLnBkZlVybCk7CiAgICAgICAgdGhpcy5wZGZEb2N1bWVudCA9IG51bGw7CiAgICAgIH0KICAgICAgdGhpcy5yZW5kZXJQYWdlc1F1ZXVlZCA9IGZhbHNlOwogICAgICB0aGlzLnBhZ2VDb3VudCA9IDA7CiAgICAgIHRoaXMuY3VycmVudFByZXZpZXdQYWdlID0gMTsKICAgICAgdGhpcy5pc0hvdmVyaW5nID0gZmFsc2U7CiAgICAgIHRoaXMuaXNBNEZvcm1hdCA9IHRydWU7CiAgICAgIHRoaXMuc3RhY2tFbGVtZW50ID0gbnVsbDsKICAgICAgdGhpcy5sb2FkZWRQZGZVcmwgPSBudWxsOwogICAgICB0aGlzLnJlbmRlcmVkID0gZmFsc2U7CiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICB0aGlzLmVycm9yID0gZmFsc2U7CiAgICB9CiAgICBhc3luYyB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJwZGZVcmwiKSAmJiB0aGlzLnBkZlVybCkgewogICAgICAgIGNvbnN0IHByZXZpb3VzVXJsID0gY2hhbmdlZFByb3BlcnRpZXMuZ2V0KCJwZGZVcmwiKTsKICAgICAgICBpZiAocHJldmlvdXNVcmwpIHsKICAgICAgICAgIFBkZk1hbmFnZXIucmVsZWFzZURvY3VtZW50KHByZXZpb3VzVXJsKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5jbGVhbnVwKCk7CiAgICAgICAgdGhpcy5yZW5kZXJlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuY3VycmVudFByZXZpZXdQYWdlID0gMTsKICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBpZiAocmVjdC50b3AgPCB3aW5kb3cuaW5uZXJIZWlnaHQgJiYgcmVjdC5ib3R0b20gPiAwKSB7CiAgICAgICAgICB0aGlzLmxvYWRBbmRSZW5kZXJQcmV2aWV3KCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoImN1cnJlbnRQcmV2aWV3UGFnZSIpICYmIHRoaXMucmVuZGVyZWQpIHsKICAgICAgICBhd2FpdCB0aGlzLnNjaGVkdWxlUmVuZGVyUGFnZXMoKTsKICAgICAgfQogICAgfQogICAgZ2V0Q29udGV4dE1lbnVJdGVtcygpIHsKICAgICAgY29uc3QgaXRlbXMgPSBbXTsKICAgICAgaWYgKHRoaXMuY2xpY2thYmxlKSB7CiAgICAgICAgaXRlbXMucHVzaCh7CiAgICAgICAgICBuYW1lOiAiVmlldyBQREYiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6RXllIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJ0aWxlLWNsaWNrIiwgewogICAgICAgICAgICAgIGRldGFpbDogdGhpcy5nZXRUaWxlQ2xpY2tEZXRhaWwoKSwKICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgICAgIH0pKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBpdGVtcy5wdXNoKHsgZGl2aWRlcjogdHJ1ZSB9KTsKICAgICAgfQogICAgICBpdGVtcy5wdXNoKHsKICAgICAgICBuYW1lOiAiT3BlbiBQREYgaW4gTmV3IFRhYiIsCiAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6RXh0ZXJuYWxMaW5rIiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIHdpbmRvdy5vcGVuKHRoaXMucGRmVXJsLCAiX2JsYW5rIik7CiAgICAgICAgfQogICAgICB9LCB7IGRpdmlkZXI6IHRydWUgfSwgewogICAgICAgIG5hbWU6ICJDb3B5IFBERiBVUkwiLAogICAgICAgIGljb25OYW1lOiAibHVjaWRlOkNvcHkiLAogICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGhpcy5wZGZVcmwpOwogICAgICAgIH0KICAgICAgfSwgewogICAgICAgIG5hbWU6ICJEb3dubG9hZCBQREYiLAogICAgICAgIGljb25OYW1lOiAibHVjaWRlOkRvd25sb2FkIiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIGNvbnN0IGxpbmszID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwogICAgICAgICAgbGluazMuaHJlZiA9IHRoaXMucGRmVXJsOwogICAgICAgICAgbGluazMuZG93bmxvYWQgPSB0aGlzLnBkZlVybC5zcGxpdCgiLyIpLnBvcCgpIHx8ICJkb2N1bWVudC5wZGYiOwogICAgICAgICAgbGluazMuY2xpY2soKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBpZiAodGhpcy5wYWdlQ291bnQgPiAwKSB7CiAgICAgICAgaXRlbXMucHVzaCh7IGRpdmlkZXI6IHRydWUgfSwgewogICAgICAgICAgbmFtZTogYCR7dGhpcy5wYWdlQ291bnR9IHBhZ2Uke3RoaXMucGFnZUNvdW50ID4gMSA/ICJzIiA6ICIifWAsCiAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpGaWxlVGV4dCIsCiAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBpdGVtczsKICAgIH0KICAgIGNhY2hlRWxlbWVudHMoKSB7CiAgICAgIGlmICghdGhpcy5zdGFja0VsZW1lbnQpIHsKICAgICAgICB0aGlzLnN0YWNrRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLnByZXZpZXctc3RhY2siKTsKICAgICAgfQogICAgfQogICAgc2V0dXBSZXNpemVPYnNlcnZlcigpIHsKICAgICAgaWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHsKICAgICAgICBpZiAodGhpcy5yZW5kZXJlZCAmJiB0aGlzLnBkZkRvY3VtZW50ICYmICF0aGlzLmxvYWRpbmcpIHsKICAgICAgICAgIHZvaWQgdGhpcy5zY2hlZHVsZVJlbmRlclBhZ2VzKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMpOwogICAgfQogICAgZ2V0QXZhaWxhYmxlU2l6ZSgpIHsKICAgICAgaWYgKCF0aGlzLnN0YWNrRWxlbWVudCkgewogICAgICAgIHRoaXMuc3RhY2tFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIucHJldmlldy1zdGFjayIpOwogICAgICB9CiAgICAgIGlmICghdGhpcy5zdGFja0VsZW1lbnQpIHsKICAgICAgICByZXR1cm4geyBhdmFpbGFibGVXaWR0aDogMjAwLCBhdmFpbGFibGVIZWlnaHQ6IDI2MCB9OwogICAgICB9CiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnN0YWNrRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGggPSBNYXRoLm1heChyZWN0LndpZHRoLCAwKSB8fCAyMDA7CiAgICAgIGNvbnN0IGF2YWlsYWJsZUhlaWdodCA9IE1hdGgubWF4KHJlY3QuaGVpZ2h0LCAwKSB8fCAyNjA7CiAgICAgIHJldHVybiB7IGF2YWlsYWJsZVdpZHRoLCBhdmFpbGFibGVIZWlnaHQgfTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzODEoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNUaWxlUGRmMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy10aWxlLWltYWdlL2RlbW8uanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIGRlbW82ID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgcGFkZGluZzogNDBweDsKICAgICAgYmFja2dyb3VuZDogI2Y1ZjVmNTsKICAgIH0KICAgIC5kZW1vLXNlY3Rpb24gewogICAgICBtYXJnaW4tYm90dG9tOiA2MHB4OwogICAgfQogICAgaDMgewogICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICB9CiAgICAudGlsZS1yb3cgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBnYXA6IDI0cHg7CiAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICB9CiAgPC9zdHlsZT4KCiAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgPGgzPkltYWdlIFRpbGVzPC9oMz4KICAgICAgPGRpdiBjbGFzcz0idGlsZS1yb3ciPgogICAgICAgIDxkZWVzLXRpbGUtaW1hZ2UKICAgICAgICAgIHNyYz0iaHR0cHM6Ly9waWNzdW0ucGhvdG9zLzgwMC82MDAiCiAgICAgICAgICBhbHQ9IkxhbmRzY2FwZSBwaG90byIKICAgICAgICAgIGxhYmVsPSJsYW5kc2NhcGUuanBnIgogICAgICAgICAgQHRpbGUtY2xpY2s9JHsoZTExKSA9PiBjb25zb2xlLmxvZygiSW1hZ2UgY2xpY2tlZDoiLCBlMTEuZGV0YWlsKX0KICAgICAgICA+PC9kZWVzLXRpbGUtaW1hZ2U+CgogICAgICAgIDxkZWVzLXRpbGUtaW1hZ2UKICAgICAgICAgIHNyYz0iaHR0cHM6Ly9waWNzdW0ucGhvdG9zLzQwMC80MDAiCiAgICAgICAgICBhbHQ9IlNxdWFyZSBwaG90byIKICAgICAgICAgIGxhYmVsPSJzcXVhcmUucG5nIgogICAgICAgID48L2RlZXMtdGlsZS1pbWFnZT4KCiAgICAgICAgPGRlZXMtdGlsZS1pbWFnZQogICAgICAgICAgc3JjPSJodHRwczovL3BpY3N1bS5waG90b3MvMzAwLzkwMCIKICAgICAgICAgIGFsdD0iUG9ydHJhaXQgcGhvdG8iCiAgICAgICAgICBsYWJlbD0icG9ydHJhaXQud2VicCIKICAgICAgICA+PC9kZWVzLXRpbGUtaW1hZ2U+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgPGgzPlNpemUgVmFyaWFudHM8L2gzPgogICAgICA8ZGl2IGNsYXNzPSJ0aWxlLXJvdyI+CiAgICAgICAgPGRlZXMtdGlsZS1pbWFnZQogICAgICAgICAgc2l6ZT0ic21hbGwiCiAgICAgICAgICBzcmM9Imh0dHBzOi8vcGljc3VtLnBob3Rvcy8yMDAvMjAwIgogICAgICAgICAgYWx0PSJTbWFsbCIKICAgICAgICAgIGxhYmVsPSJzbWFsbC5qcGciCiAgICAgICAgPjwvZGVlcy10aWxlLWltYWdlPgoKICAgICAgICA8ZGVlcy10aWxlLWltYWdlCiAgICAgICAgICBzcmM9Imh0dHBzOi8vcGljc3VtLnBob3Rvcy82MDAvNDAwIgogICAgICAgICAgYWx0PSJEZWZhdWx0IgogICAgICAgICAgbGFiZWw9ImRlZmF1bHQuanBnIgogICAgICAgID48L2RlZXMtdGlsZS1pbWFnZT4KCiAgICAgICAgPGRlZXMtdGlsZS1pbWFnZQogICAgICAgICAgc2l6ZT0ibGFyZ2UiCiAgICAgICAgICBzcmM9Imh0dHBzOi8vcGljc3VtLnBob3Rvcy8xMjAwLzgwMCIKICAgICAgICAgIGFsdD0iTGFyZ2UiCiAgICAgICAgICBsYWJlbD0ibGFyZ2UuanBnIgogICAgICAgID48L2RlZXMtdGlsZS1pbWFnZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICA8aDM+RXJyb3IgU3RhdGUgKGJyb2tlbiBVUkwpPC9oMz4KICAgICAgPGRlZXMtdGlsZS1pbWFnZQogICAgICAgIHNyYz0iaHR0cHM6Ly9pbnZhbGlkLXVybC10aGF0LWRvZXMtbm90LWV4aXN0LmV4YW1wbGUvaW1hZ2UucG5nIgogICAgICAgIGFsdD0iQnJva2VuIgogICAgICAgIGxhYmVsPSJicm9rZW4ucG5nIgogICAgICA+PC9kZWVzLXRpbGUtaW1hZ2U+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXRpbGUtaW1hZ2UvY29tcG9uZW50LmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBfX2VzRGVjb3JhdGU4MSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzODIgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNUaWxlSW1hZ2UgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtdGlsZS1pbWFnZSIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzVGlsZUJhc2U7CiAgbGV0IF9zcmNfZGVjb3JhdG9yczsKICBsZXQgX3NyY19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NyY19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWx0X2RlY29yYXRvcnM7CiAgbGV0IF9hbHRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hbHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ltYWdlTG9hZGVkX2RlY29yYXRvcnM7CiAgbGV0IF9pbWFnZUxvYWRlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2ltYWdlTG9hZGVkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pbWFnZVdpZHRoX2RlY29yYXRvcnM7CiAgbGV0IF9pbWFnZVdpZHRoX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW1hZ2VXaWR0aF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW1hZ2VIZWlnaHRfZGVjb3JhdG9yczsKICBsZXQgX2ltYWdlSGVpZ2h0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW1hZ2VIZWlnaHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1RpbGVJbWFnZTIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9zcmNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9hbHRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9pbWFnZUxvYWRlZF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaW1hZ2VXaWR0aF9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaW1hZ2VIZWlnaHRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlODEodGhpcywgbnVsbCwgX3NyY19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzcmMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNyYyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zcmMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNyYyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zcmNfaW5pdGlhbGl6ZXJzLCBfc3JjX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODEodGhpcywgbnVsbCwgX2FsdF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhbHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImFsdCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hbHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmFsdCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9hbHRfaW5pdGlhbGl6ZXJzLCBfYWx0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODEodGhpcywgbnVsbCwgX2ltYWdlTG9hZGVkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImltYWdlTG9hZGVkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpbWFnZUxvYWRlZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pbWFnZUxvYWRlZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaW1hZ2VMb2FkZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaW1hZ2VMb2FkZWRfaW5pdGlhbGl6ZXJzLCBfaW1hZ2VMb2FkZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4MSh0aGlzLCBudWxsLCBfaW1hZ2VXaWR0aF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpbWFnZVdpZHRoIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpbWFnZVdpZHRoIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmltYWdlV2lkdGgsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmltYWdlV2lkdGggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaW1hZ2VXaWR0aF9pbml0aWFsaXplcnMsIF9pbWFnZVdpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODEodGhpcywgbnVsbCwgX2ltYWdlSGVpZ2h0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImltYWdlSGVpZ2h0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpbWFnZUhlaWdodCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pbWFnZUhlaWdodCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaW1hZ2VIZWlnaHQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaW1hZ2VIZWlnaHRfaW5pdGlhbGl6ZXJzLCBfaW1hZ2VIZWlnaHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4MShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNUaWxlSW1hZ2UyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtbzY7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiTWVkaWEiXTsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIC4uLnRpbGVCYXNlU3R5bGVzLAogICAgICBpYAogICAgICAuaW1hZ2Utd3JhcHBlciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmVwZWF0aW5nLWNvbmljLWdyYWRpZW50KCNlOGU4ZTggMCUgMjUlLCB3aGl0ZSAwJSA1MCUpIDUwJSAvIDE2cHggMTZweCIsICJyZXBlYXRpbmctY29uaWMtZ3JhZGllbnQoaHNsKDIxNSAyMCUgMTglKSAwJSAyNSUsIGhzbCgyMTUgMjAlIDE0JSkgMCUgNTAlKSA1MCUgLyAxNnB4IDE2cHgiKX07CiAgICAgIH0KCiAgICAgIC5pbWFnZS13cmFwcGVyIGltZyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG9iamVjdC1maXQ6IGNvdmVyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcyBlYXNlOwogICAgICB9CgogICAgICAuaW1hZ2Utd3JhcHBlciBpbWcubG9hZGVkIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAuaW1hZ2Utd3JhcHBlciBpbWcubG9hZGluZyB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgIGAKICAgIF07CiAgICAjc3JjX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczgyKHRoaXMsIF9zcmNfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICBnZXQgc3JjKCkgewogICAgICByZXR1cm4gdGhpcy4jc3JjX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc3JjKHZhbHVlMikgewogICAgICB0aGlzLiNzcmNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNhbHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgyKHRoaXMsIF9zcmNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczgyKHRoaXMsIF9hbHRfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGFsdCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FsdF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFsdCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYWx0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaW1hZ2VMb2FkZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgyKHRoaXMsIF9hbHRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczgyKHRoaXMsIF9pbWFnZUxvYWRlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaW1hZ2VMb2FkZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpbWFnZUxvYWRlZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGltYWdlTG9hZGVkKHZhbHVlMikgewogICAgICB0aGlzLiNpbWFnZUxvYWRlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2ltYWdlV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgyKHRoaXMsIF9pbWFnZUxvYWRlZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODIodGhpcywgX2ltYWdlV2lkdGhfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgaW1hZ2VXaWR0aCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2ltYWdlV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpbWFnZVdpZHRoKHZhbHVlMikgewogICAgICB0aGlzLiNpbWFnZVdpZHRoX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaW1hZ2VIZWlnaHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgyKHRoaXMsIF9pbWFnZVdpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4Mih0aGlzLCBfaW1hZ2VIZWlnaHRfaW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgaW1hZ2VIZWlnaHQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpbWFnZUhlaWdodF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGltYWdlSGVpZ2h0KHZhbHVlMikgewogICAgICB0aGlzLiNpbWFnZUhlaWdodF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgaGFzU3RhcnRlZExvYWRpbmcgPSAoX19ydW5Jbml0aWFsaXplcnM4Mih0aGlzLCBfaW1hZ2VIZWlnaHRfZXh0cmFJbml0aWFsaXplcnMpLCBmYWxzZSk7CiAgICByZW5kZXJUaWxlQ29udGVudCgpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJpbWFnZS13cmFwcGVyIj4KICAgICAgICAke3RoaXMuaGFzU3RhcnRlZExvYWRpbmcgPyBiMmAKICAgICAgICAgIDxpbWcKICAgICAgICAgICAgY2xhc3M9IiR7dGhpcy5pbWFnZUxvYWRlZCA/ICJsb2FkZWQiIDogImxvYWRpbmcifSIKICAgICAgICAgICAgc3JjPSIke3RoaXMuc3JjfSIKICAgICAgICAgICAgYWx0PSIke3RoaXMuYWx0fSIKICAgICAgICAgICAgQGxvYWQ9JHt0aGlzLmhhbmRsZUltYWdlTG9hZH0KICAgICAgICAgICAgQGVycm9yPSR7dGhpcy5oYW5kbGVJbWFnZUVycm9yfQogICAgICAgICAgLz4KICAgICAgICBgIDogIiJ9CiAgICAgIDwvZGl2PgoKICAgICAgJHt0aGlzLmNsaWNrYWJsZSA/IGIyYAogICAgICAgIDxkaXYgY2xhc3M9InRpbGUtb3ZlcmxheSI+CiAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpFeWUiPjwvZGVlcy1pY29uPgogICAgICAgICAgPHNwYW4+VmlldyBJbWFnZTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgYCA6ICIifQogICAgYDsKICAgIH0KICAgIHJlbmRlckJvdHRvbUJhcigpIHsKICAgICAgaWYgKCF0aGlzLmxhYmVsICYmICEodGhpcy5pbWFnZVdpZHRoID4gMCkpCiAgICAgICAgcmV0dXJuICIiOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InRpbGUtaW5mby1iYXIiPgogICAgICAgICR7dGhpcy5sYWJlbCA/IGIyYDxzcGFuIGNsYXNzPSJpbmZvLWxhYmVsIiB0aXRsZT0iJHt0aGlzLmxhYmVsfSI+JHt0aGlzLmxhYmVsfTwvc3Bhbj5gIDogIiJ9CiAgICAgICAgPHNwYW4gY2xhc3M9ImluZm8tc3BhY2VyIj48L3NwYW4+CiAgICAgICAgJHt0aGlzLmltYWdlV2lkdGggPiAwICYmIHRoaXMuaW1hZ2VIZWlnaHQgPiAwID8gYjJgPHNwYW4gY2xhc3M9ImluZm8tZGV0YWlsIj4ke3RoaXMuaW1hZ2VXaWR0aH0gw5cgJHt0aGlzLmltYWdlSGVpZ2h0fTwvc3Bhbj5gIDogIiJ9CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGdldFRpbGVDbGlja0RldGFpbCgpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBzcmM6IHRoaXMuc3JjLAogICAgICAgIGFsdDogdGhpcy5hbHQsCiAgICAgICAgd2lkdGg6IHRoaXMuaW1hZ2VXaWR0aCwKICAgICAgICBoZWlnaHQ6IHRoaXMuaW1hZ2VIZWlnaHQKICAgICAgfTsKICAgIH0KICAgIG9uQmVjYW1lVmlzaWJsZSgpIHsKICAgICAgaWYgKCF0aGlzLmhhc1N0YXJ0ZWRMb2FkaW5nICYmIHRoaXMuc3JjKSB7CiAgICAgICAgdGhpcy5oYXNTdGFydGVkTG9hZGluZyA9IHRydWU7CiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTsKICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgICAgfQogICAgfQogICAgaGFuZGxlSW1hZ2VMb2FkKGUxMSkgewogICAgICBjb25zdCBpbWcgPSBlMTEudGFyZ2V0OwogICAgICB0aGlzLmltYWdlV2lkdGggPSBpbWcubmF0dXJhbFdpZHRoOwogICAgICB0aGlzLmltYWdlSGVpZ2h0ID0gaW1nLm5hdHVyYWxIZWlnaHQ7CiAgICAgIHRoaXMuaW1hZ2VMb2FkZWQgPSB0cnVlOwogICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgIH0KICAgIGhhbmRsZUltYWdlRXJyb3IoKSB7CiAgICAgIHRoaXMuZXJyb3IgPSB0cnVlOwogICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgIH0KICAgIGFzeW5jIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoInNyYyIpICYmIHRoaXMuc3JjICYmIHRoaXMuaXNWaXNpYmxlKSB7CiAgICAgICAgdGhpcy5oYXNTdGFydGVkTG9hZGluZyA9IHRydWU7CiAgICAgICAgdGhpcy5pbWFnZUxvYWRlZCA9IGZhbHNlOwogICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzODIoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNUaWxlSW1hZ2UyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXRpbGUtYXVkaW8vZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtbzcgPSAoKSA9PiBiMmAKICA8c3R5bGU+CiAgICAuZGVtby1jb250YWluZXIgewogICAgICBwYWRkaW5nOiA0MHB4OwogICAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1OwogICAgfQogICAgLmRlbW8tc2VjdGlvbiB7CiAgICAgIG1hcmdpbi1ib3R0b206IDYwcHg7CiAgICB9CiAgICBoMyB7CiAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIH0KICAgIC50aWxlLXJvdyB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGdhcDogMjRweDsKICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIH0KICA8L3N0eWxlPgoKICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICA8aDM+QXVkaW8gVGlsZXM8L2gzPgogICAgICA8ZGl2IGNsYXNzPSJ0aWxlLXJvdyI+CiAgICAgICAgPGRlZXMtdGlsZS1hdWRpbwogICAgICAgICAgc3JjPSJodHRwczovL3d3dy5zb3VuZGhlbGl4LmNvbS9leGFtcGxlcy9tcDMvU291bmRIZWxpeC1Tb25nLTEubXAzIgogICAgICAgICAgdGl0bGU9IlNvdW5kSGVsaXggU29uZyAxIgogICAgICAgICAgYXJ0aXN0PSJULiBTY2h1ZXJnZXIiCiAgICAgICAgICBsYWJlbD0ic291bmRoZWxpeC0xLm1wMyIKICAgICAgICAgIEB0aWxlLWNsaWNrPSR7KGUxMSkgPT4gY29uc29sZS5sb2coIkF1ZGlvIGNsaWNrZWQ6IiwgZTExLmRldGFpbCl9CiAgICAgICAgPjwvZGVlcy10aWxlLWF1ZGlvPgoKICAgICAgICA8ZGVlcy10aWxlLWF1ZGlvCiAgICAgICAgICBzcmM9Imh0dHBzOi8vd3d3LnNvdW5kaGVsaXguY29tL2V4YW1wbGVzL21wMy9Tb3VuZEhlbGl4LVNvbmctMi5tcDMiCiAgICAgICAgICB0aXRsZT0iU291bmRIZWxpeCBTb25nIDIiCiAgICAgICAgICBhcnRpc3Q9IlQuIFNjaHVlcmdlciIKICAgICAgICAgIGxhYmVsPSJzb3VuZGhlbGl4LTIubXAzIgogICAgICAgID48L2RlZXMtdGlsZS1hdWRpbz4KCiAgICAgICAgPGRlZXMtdGlsZS1hdWRpbwogICAgICAgICAgc3JjPSJodHRwczovL3d3dy5zb3VuZGhlbGl4LmNvbS9leGFtcGxlcy9tcDMvU291bmRIZWxpeC1Tb25nLTMubXAzIgogICAgICAgICAgdGl0bGU9IlNvdW5kSGVsaXggU29uZyAzIgogICAgICAgICAgbGFiZWw9InNvdW5kaGVsaXgtMy5tcDMiCiAgICAgICAgPjwvZGVlcy10aWxlLWF1ZGlvPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgIDxoMz5TaXplIFZhcmlhbnRzPC9oMz4KICAgICAgPGRpdiBjbGFzcz0idGlsZS1yb3ciPgogICAgICAgIDxkZWVzLXRpbGUtYXVkaW8KICAgICAgICAgIHNpemU9InNtYWxsIgogICAgICAgICAgc3JjPSJodHRwczovL3d3dy5zb3VuZGhlbGl4LmNvbS9leGFtcGxlcy9tcDMvU291bmRIZWxpeC1Tb25nLTEubXAzIgogICAgICAgICAgdGl0bGU9IlNtYWxsIgogICAgICAgICAgbGFiZWw9InNtYWxsLm1wMyIKICAgICAgICA+PC9kZWVzLXRpbGUtYXVkaW8+CgogICAgICAgIDxkZWVzLXRpbGUtYXVkaW8KICAgICAgICAgIHNyYz0iaHR0cHM6Ly93d3cuc291bmRoZWxpeC5jb20vZXhhbXBsZXMvbXAzL1NvdW5kSGVsaXgtU29uZy0xLm1wMyIKICAgICAgICAgIHRpdGxlPSJEZWZhdWx0IgogICAgICAgICAgbGFiZWw9ImRlZmF1bHQubXAzIgogICAgICAgID48L2RlZXMtdGlsZS1hdWRpbz4KCiAgICAgICAgPGRlZXMtdGlsZS1hdWRpbwogICAgICAgICAgc2l6ZT0ibGFyZ2UiCiAgICAgICAgICBzcmM9Imh0dHBzOi8vd3d3LnNvdW5kaGVsaXguY29tL2V4YW1wbGVzL21wMy9Tb3VuZEhlbGl4LVNvbmctMS5tcDMiCiAgICAgICAgICB0aXRsZT0iTGFyZ2UiCiAgICAgICAgICBsYWJlbD0ibGFyZ2UubXAzIgogICAgICAgID48L2RlZXMtdGlsZS1hdWRpbz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXRpbGUtYXVkaW8vY29tcG9uZW50LmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBfX2VzRGVjb3JhdGU4MiA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzODMgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNUaWxlQXVkaW8gPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtdGlsZS1hdWRpbyIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzVGlsZUJhc2U7CiAgbGV0IF9zcmNfZGVjb3JhdG9yczsKICBsZXQgX3NyY19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NyY19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGl0bGVfZGVjb3JhdG9yczsKICBsZXQgX3RpdGxlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGl0bGVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2FydGlzdF9kZWNvcmF0b3JzOwogIGxldCBfYXJ0aXN0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYXJ0aXN0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kdXJhdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfZHVyYXRpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kdXJhdGlvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfd2F2ZWZvcm1EYXRhX2RlY29yYXRvcnM7CiAgbGV0IF93YXZlZm9ybURhdGFfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF93YXZlZm9ybURhdGFfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3dhdmVmb3JtUmVhZHlfZGVjb3JhdG9yczsKICBsZXQgX3dhdmVmb3JtUmVhZHlfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF93YXZlZm9ybVJlYWR5X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc1ByZXZpZXdQbGF5aW5nX2RlY29yYXRvcnM7CiAgbGV0IF9pc1ByZXZpZXdQbGF5aW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNQcmV2aWV3UGxheWluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzVGlsZUF1ZGlvMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3NyY19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX3RpdGxlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfYXJ0aXN0X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfZHVyYXRpb25fZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3dhdmVmb3JtRGF0YV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfd2F2ZWZvcm1SZWFkeV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaXNQcmV2aWV3UGxheWluZ19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfX2VzRGVjb3JhdGU4Mih0aGlzLCBudWxsLCBfc3JjX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNyYyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic3JjIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNyYywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc3JjID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NyY19pbml0aWFsaXplcnMsIF9zcmNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4Mih0aGlzLCBudWxsLCBfdGl0bGVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAidGl0bGUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRpdGxlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnRpdGxlLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai50aXRsZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90aXRsZV9pbml0aWFsaXplcnMsIF90aXRsZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTgyKHRoaXMsIG51bGwsIF9hcnRpc3RfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiYXJ0aXN0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhcnRpc3QiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYXJ0aXN0LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5hcnRpc3QgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYXJ0aXN0X2luaXRpYWxpemVycywgX2FydGlzdF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTgyKHRoaXMsIG51bGwsIF9kdXJhdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkdXJhdGlvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZHVyYXRpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZHVyYXRpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmR1cmF0aW9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2R1cmF0aW9uX2luaXRpYWxpemVycywgX2R1cmF0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODIodGhpcywgbnVsbCwgX3dhdmVmb3JtRGF0YV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ3YXZlZm9ybURhdGEiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIndhdmVmb3JtRGF0YSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai53YXZlZm9ybURhdGEsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLndhdmVmb3JtRGF0YSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF93YXZlZm9ybURhdGFfaW5pdGlhbGl6ZXJzLCBfd2F2ZWZvcm1EYXRhX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODIodGhpcywgbnVsbCwgX3dhdmVmb3JtUmVhZHlfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAid2F2ZWZvcm1SZWFkeSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAid2F2ZWZvcm1SZWFkeSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai53YXZlZm9ybVJlYWR5LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai53YXZlZm9ybVJlYWR5ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3dhdmVmb3JtUmVhZHlfaW5pdGlhbGl6ZXJzLCBfd2F2ZWZvcm1SZWFkeV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTgyKHRoaXMsIG51bGwsIF9pc1ByZXZpZXdQbGF5aW5nX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzUHJldmlld1BsYXlpbmciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImlzUHJldmlld1BsYXlpbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNQcmV2aWV3UGxheWluZywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNQcmV2aWV3UGxheWluZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pc1ByZXZpZXdQbGF5aW5nX2luaXRpYWxpemVycywgX2lzUHJldmlld1BsYXlpbmdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4MihudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNUaWxlQXVkaW8yID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtbzc7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiTWVkaWEiXTsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIC4uLnRpbGVCYXNlU3R5bGVzLAogICAgICBpYAogICAgICAuYXVkaW8tY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBnYXA6IDE2cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImxpbmVhci1ncmFkaWVudCgxMzVkZWcsIGhzbCgyNTAgNDAlIDk2JSksIGhzbCgyODAgMzAlIDk0JSkpIiwgImxpbmVhci1ncmFkaWVudCgxMzVkZWcsIGhzbCgyNTAgMzAlIDE2JSksIGhzbCgyODAgMjUlIDE0JSkpIil9OwogICAgICB9CgogICAgICAubXVzaWMtaWNvbiB7CiAgICAgICAgZm9udC1zaXplOiA0OHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDI1MCA2MCUgNjUlKSIsICJoc2woMjUwIDYwJSA3MCUpIil9OwogICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgfQoKICAgICAgLmF1ZGlvLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyNTAgMjAlIDM1JSkiLCAiaHNsKDI1MCAyMCUgODAlKSIpfTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgcGFkZGluZzogMCAxNnB4OwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgIC5hdWRpby1hcnRpc3QgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDI1MCAxNSUgNTAlKSIsICJoc2woMjUwIDE1JSA2NSUpIil9OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiAwIDE2cHg7CiAgICAgICAgbWFyZ2luLXRvcDogLTEycHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLndhdmVmb3JtLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDMycHgpOwogICAgICAgIGhlaWdodDogNDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLndhdmVmb3JtLWNvbnRhaW5lciBjYW52YXMgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKCiAgICAgIC5wbGF5LW92ZXJsYXkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2U7CiAgICAgICAgei1pbmRleDogMTg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIC50aWxlLWNvbnRhaW5lci5jbGlja2FibGU6aG92ZXIgLnBsYXktb3ZlcmxheSB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLnBsYXktY2lyY2xlIHsKICAgICAgICB3aWR0aDogNDhweDsKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7CiAgICAgIH0KCiAgICAgIC5wbGF5LWNpcmNsZSBkZWVzLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICAjc3JjX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczgzKHRoaXMsIF9zcmNfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICBnZXQgc3JjKCkgewogICAgICByZXR1cm4gdGhpcy4jc3JjX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc3JjKHZhbHVlMikgewogICAgICB0aGlzLiNzcmNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN0aXRsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODModGhpcywgX3NyY19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODModGhpcywgX3RpdGxlX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCB0aXRsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3RpdGxlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdGl0bGUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3RpdGxlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYXJ0aXN0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4Myh0aGlzLCBfdGl0bGVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczgzKHRoaXMsIF9hcnRpc3RfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGFydGlzdCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FydGlzdF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFydGlzdCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYXJ0aXN0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZHVyYXRpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgzKHRoaXMsIF9hcnRpc3RfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczgzKHRoaXMsIF9kdXJhdGlvbl9pbml0aWFsaXplcnMsIDApKTsKICAgIGdldCBkdXJhdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuI2R1cmF0aW9uX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZHVyYXRpb24odmFsdWUyKSB7CiAgICAgIHRoaXMuI2R1cmF0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjd2F2ZWZvcm1EYXRhX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4Myh0aGlzLCBfZHVyYXRpb25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczgzKHRoaXMsIF93YXZlZm9ybURhdGFfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IHdhdmVmb3JtRGF0YSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3dhdmVmb3JtRGF0YV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHdhdmVmb3JtRGF0YSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jd2F2ZWZvcm1EYXRhX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjd2F2ZWZvcm1SZWFkeV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODModGhpcywgX3dhdmVmb3JtRGF0YV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODModGhpcywgX3dhdmVmb3JtUmVhZHlfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHdhdmVmb3JtUmVhZHkoKSB7CiAgICAgIHJldHVybiB0aGlzLiN3YXZlZm9ybVJlYWR5X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgd2F2ZWZvcm1SZWFkeSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jd2F2ZWZvcm1SZWFkeV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzUHJldmlld1BsYXlpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczgzKHRoaXMsIF93YXZlZm9ybVJlYWR5X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4Myh0aGlzLCBfaXNQcmV2aWV3UGxheWluZ19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaXNQcmV2aWV3UGxheWluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzUHJldmlld1BsYXlpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc1ByZXZpZXdQbGF5aW5nKHZhbHVlMikgewogICAgICB0aGlzLiNpc1ByZXZpZXdQbGF5aW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBhdWRpb0VsZW1lbnQgPSAoX19ydW5Jbml0aWFsaXplcnM4Myh0aGlzLCBfaXNQcmV2aWV3UGxheWluZ19leHRyYUluaXRpYWxpemVycyksIG51bGwpOwogICAgcHJldmlld1RpbWVvdXQgPSBudWxsOwogICAgaGFzTG9hZGVkV2F2ZWZvcm0gPSBmYWxzZTsKICAgIHJlbmRlclRpbGVDb250ZW50KCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9ImF1ZGlvLWNvbnRlbnQiPgogICAgICAgIDxkZWVzLWljb24gY2xhc3M9Im11c2ljLWljb24iIGljb249Imx1Y2lkZTpNdXNpYyI+PC9kZWVzLWljb24+CgogICAgICAgICR7dGhpcy50aXRsZSA/IGIyYDxkaXYgY2xhc3M9ImF1ZGlvLXRpdGxlIj4ke3RoaXMudGl0bGV9PC9kaXY+YCA6ICIifQogICAgICAgICR7dGhpcy5hcnRpc3QgPyBiMmA8ZGl2IGNsYXNzPSJhdWRpby1hcnRpc3QiPiR7dGhpcy5hcnRpc3R9PC9kaXY+YCA6ICIifQoKICAgICAgICAke3RoaXMud2F2ZWZvcm1SZWFkeSA/IGIyYAogICAgICAgICAgPGRpdiBjbGFzcz0id2F2ZWZvcm0tY29udGFpbmVyIj4KICAgICAgICAgICAgPGNhbnZhcz48L2NhbnZhcz4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGAgOiAiIn0KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJwbGF5LW92ZXJsYXkiPgogICAgICAgIDxkaXYgY2xhc3M9InBsYXktY2lyY2xlIj4KICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0ibHVjaWRlOlBsYXkiPjwvZGVlcy1pY29uPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgICR7dGhpcy5jbGlja2FibGUgPyBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJ0aWxlLW92ZXJsYXkiPgogICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6SGVhZHBob25lcyI+PC9kZWVzLWljb24+CiAgICAgICAgICA8c3Bhbj5QbGF5IEF1ZGlvPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICBgIDogIiJ9CiAgICBgOwogICAgfQogICAgcmVuZGVyQm90dG9tQmFyKCkgewogICAgICBpZiAoIXRoaXMubGFiZWwgJiYgIXRoaXMuZHVyYXRpb24pCiAgICAgICAgcmV0dXJuICIiOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InRpbGUtaW5mby1iYXIiPgogICAgICAgICR7dGhpcy5sYWJlbCA/IGIyYDxzcGFuIGNsYXNzPSJpbmZvLWxhYmVsIiB0aXRsZT0iJHt0aGlzLmxhYmVsfSI+JHt0aGlzLmxhYmVsfTwvc3Bhbj5gIDogIiJ9CiAgICAgICAgPHNwYW4gY2xhc3M9ImluZm8tc3BhY2VyIj48L3NwYW4+CiAgICAgICAgJHt0aGlzLmR1cmF0aW9uID4gMCA/IGIyYDxzcGFuIGNsYXNzPSJpbmZvLWRldGFpbCI+JHt0aGlzLmZvcm1hdFRpbWUodGhpcy5kdXJhdGlvbil9PC9zcGFuPmAgOiAiIn0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgZ2V0VGlsZUNsaWNrRGV0YWlsKCkgewogICAgICByZXR1cm4gewogICAgICAgIHNyYzogdGhpcy5zcmMsCiAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsCiAgICAgICAgYXJ0aXN0OiB0aGlzLmFydGlzdCwKICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbgogICAgICB9OwogICAgfQogICAgb25CZWNhbWVWaXNpYmxlKCkgewogICAgICBpZiAoIXRoaXMuaGFzTG9hZGVkV2F2ZWZvcm0gJiYgdGhpcy5zcmMpIHsKICAgICAgICB0aGlzLmhhc0xvYWRlZFdhdmVmb3JtID0gdHJ1ZTsKICAgICAgICB0aGlzLmxvYWRBdWRpb01ldGEoKTsKICAgICAgfQogICAgfQogICAgYXN5bmMgbG9hZEF1ZGlvTWV0YSgpIHsKICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBhdWRpbyA9IG5ldyBBdWRpbygpOwogICAgICAgIGF1ZGlvLmNyb3NzT3JpZ2luID0gImFub255bW91cyI7CiAgICAgICAgYXVkaW8ucHJlbG9hZCA9ICJtZXRhZGF0YSI7CiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgICAgICAgIGF1ZGlvLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwgKCkgPT4gewogICAgICAgICAgICB0aGlzLmR1cmF0aW9uID0gYXVkaW8uZHVyYXRpb247CiAgICAgICAgICAgIHJlc29sdmUyKCk7CiAgICAgICAgICB9LCB7IG9uY2U6IHRydWUgfSk7CiAgICAgICAgICBhdWRpby5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsICgpID0+IHJlamVjdChuZXcgRXJyb3IoIkZhaWxlZCB0byBsb2FkIGF1ZGlvIikpLCB7IG9uY2U6IHRydWUgfSk7CiAgICAgICAgICBhdWRpby5zcmMgPSB0aGlzLnNyYzsKICAgICAgICB9KTsKICAgICAgICBhd2FpdCB0aGlzLmxvYWRXYXZlZm9ybSgpOwogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICB9IGNhdGNoIHsKICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgYXN5bmMgbG9hZFdhdmVmb3JtKCkgewogICAgICB0cnkgewogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godGhpcy5zcmMpOwogICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTsKICAgICAgICBjb25zdCBhdWRpb0NvbnRleHQgPSBuZXcgQXVkaW9Db250ZXh0KCk7CiAgICAgICAgY29uc3QgYXVkaW9CdWZmZXIgPSBhd2FpdCBhdWRpb0NvbnRleHQuZGVjb2RlQXVkaW9EYXRhKGFycmF5QnVmZmVyKTsKICAgICAgICBjb25zdCBjaGFubmVsRGF0YSA9IGF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKDApOwogICAgICAgIGNvbnN0IGJhcnMgPSA4MDsKICAgICAgICBjb25zdCBibG9ja1NpemUgPSBNYXRoLmZsb29yKGNoYW5uZWxEYXRhLmxlbmd0aCAvIGJhcnMpOwogICAgICAgIGNvbnN0IHdhdmVmb3JtID0gW107CiAgICAgICAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgYmFyczsgaTExKyspIHsKICAgICAgICAgIGxldCBzdW0gPSAwOwogICAgICAgICAgZm9yIChsZXQgajQgPSAwOyBqNCA8IGJsb2NrU2l6ZTsgajQrKykgewogICAgICAgICAgICBzdW0gKz0gTWF0aC5hYnMoY2hhbm5lbERhdGFbaTExICogYmxvY2tTaXplICsgajRdKTsKICAgICAgICAgIH0KICAgICAgICAgIHdhdmVmb3JtLnB1c2goc3VtIC8gYmxvY2tTaXplKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWF4MyA9IE1hdGgubWF4KC4uLndhdmVmb3JtKTsKICAgICAgICB0aGlzLndhdmVmb3JtRGF0YSA9IHdhdmVmb3JtLm1hcCgodjYpID0+IG1heDMgPiAwID8gdjYgLyBtYXgzIDogMCk7CiAgICAgICAgdGhpcy53YXZlZm9ybVJlYWR5ID0gdHJ1ZTsKICAgICAgICBhd2FpdCBhdWRpb0NvbnRleHQuY2xvc2UoKTsKICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlOwogICAgICAgIHRoaXMuZHJhd1dhdmVmb3JtKCk7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHRoaXMud2F2ZWZvcm1SZWFkeSA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBkcmF3V2F2ZWZvcm0oKSB7CiAgICAgIGlmICghdGhpcy53YXZlZm9ybVJlYWR5KQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIud2F2ZWZvcm0tY29udGFpbmVyIGNhbnZhcyIpOwogICAgICBpZiAoIWNhbnZhcykKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGNhbnZhcy5wYXJlbnRFbGVtZW50OwogICAgICBjb25zdCBkcHIgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxOwogICAgICBjb25zdCB3aWR0aCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aDsKICAgICAgY29uc3QgaGVpZ2h0ID0gY29udGFpbmVyLmNsaWVudEhlaWdodDsKICAgICAgY2FudmFzLndpZHRoID0gd2lkdGggKiBkcHI7CiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBkcHI7CiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICBpZiAoIWN0eCkKICAgICAgICByZXR1cm47CiAgICAgIGN0eC5zY2FsZShkcHIsIGRwcik7CiAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7CiAgICAgIGNvbnN0IGJhcnMgPSB0aGlzLndhdmVmb3JtRGF0YS5sZW5ndGg7CiAgICAgIGlmIChiYXJzID09PSAwKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgYmFyV2lkdGggPSB3aWR0aCAvIGJhcnM7CiAgICAgIGNvbnN0IGlzRGFyayA9IGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0aGVtZS1kYXJrIikgfHwgd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykiKS5tYXRjaGVzOwogICAgICBjb25zdCBiYXJDb2xvciA9IGlzRGFyayA/ICJoc2woMjUwIDUwJSA2MCUpIiA6ICJoc2woMjUwIDUwJSA3MCUpIjsKICAgICAgY3R4LmZpbGxTdHlsZSA9IGJhckNvbG9yOwogICAgICBmb3IgKGxldCBpMTEgPSAwOyBpMTEgPCBiYXJzOyBpMTErKykgewogICAgICAgIGNvbnN0IGFtcGxpdHVkZSA9IHRoaXMud2F2ZWZvcm1EYXRhW2kxMV07CiAgICAgICAgY29uc3QgYmFySGVpZ2h0ID0gTWF0aC5tYXgoMiwgYW1wbGl0dWRlICogKGhlaWdodCAtIDQpKTsKICAgICAgICBjb25zdCB4NCA9IGkxMSAqIGJhcldpZHRoOwogICAgICAgIGNvbnN0IHk1ID0gKGhlaWdodCAtIGJhckhlaWdodCkgLyAyOwogICAgICAgIGN0eC5maWxsUmVjdCh4NCArIDAuNSwgeTUsIGJhcldpZHRoIC0gMSwgYmFySGVpZ2h0KTsKICAgICAgfQogICAgfQogICAgYXN5bmMgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgICBzdXBlci51cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygic3JjIikgJiYgdGhpcy5zcmMgJiYgdGhpcy5pc1Zpc2libGUpIHsKICAgICAgICB0aGlzLmhhc0xvYWRlZFdhdmVmb3JtID0gdHJ1ZTsKICAgICAgICB0aGlzLndhdmVmb3JtUmVhZHkgPSBmYWxzZTsKICAgICAgICB0aGlzLmR1cmF0aW9uID0gMDsKICAgICAgICB0aGlzLmxvYWRBdWRpb01ldGEoKTsKICAgICAgfQogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJ3YXZlZm9ybVJlYWR5IikgJiYgdGhpcy53YXZlZm9ybVJlYWR5KSB7CiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgICB0aGlzLmRyYXdXYXZlZm9ybSgpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgaWYgKHRoaXMucHJldmlld1RpbWVvdXQpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5wcmV2aWV3VGltZW91dCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuYXVkaW9FbGVtZW50KSB7CiAgICAgICAgdGhpcy5hdWRpb0VsZW1lbnQucGF1c2UoKTsKICAgICAgICB0aGlzLmF1ZGlvRWxlbWVudC5zcmMgPSAiIjsKICAgICAgICB0aGlzLmF1ZGlvRWxlbWVudCA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIGZvcm1hdFRpbWUoc2Vjb25kcykgewogICAgICBpZiAoIWlzRmluaXRlKHNlY29uZHMpIHx8IHNlY29uZHMgPCAwKQogICAgICAgIHJldHVybiAiMDowMCI7CiAgICAgIGNvbnN0IG1pbnMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7CiAgICAgIGNvbnN0IHNlY3MgPSBNYXRoLmZsb29yKHNlY29uZHMgJSA2MCk7CiAgICAgIHJldHVybiBgJHttaW5zfToke3NlY3MudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfWA7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczgzKF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzVGlsZUF1ZGlvMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy10aWxlLXZpZGVvL2RlbW8uanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIGRlbW84ID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgcGFkZGluZzogNDBweDsKICAgICAgYmFja2dyb3VuZDogI2Y1ZjVmNTsKICAgIH0KICAgIC5kZW1vLXNlY3Rpb24gewogICAgICBtYXJnaW4tYm90dG9tOiA2MHB4OwogICAgfQogICAgaDMgewogICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICB9CiAgICAudGlsZS1yb3cgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBnYXA6IDI0cHg7CiAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICB9CiAgPC9zdHlsZT4KCiAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgPGgzPlZpZGVvIFRpbGVzPC9oMz4KICAgICAgPGRpdiBjbGFzcz0idGlsZS1yb3ciPgogICAgICAgIDxkZWVzLXRpbGUtdmlkZW8KICAgICAgICAgIHNyYz0iaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS9odG1sL21vdl9iYmIubXA0IgogICAgICAgICAgbGFiZWw9ImJ1bm55Lm1wNCIKICAgICAgICAgIEB0aWxlLWNsaWNrPSR7KGUxMSkgPT4gY29uc29sZS5sb2coIlZpZGVvIGNsaWNrZWQ6IiwgZTExLmRldGFpbCl9CiAgICAgICAgPjwvZGVlcy10aWxlLXZpZGVvPgoKICAgICAgICA8ZGVlcy10aWxlLXZpZGVvCiAgICAgICAgICBzcmM9Imh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vaHRtbC9tb3ZpZS5tcDQiCiAgICAgICAgICBwb3N0ZXI9Imh0dHBzOi8vcGljc3VtLnBob3Rvcy80MDAvMzAwIgogICAgICAgICAgbGFiZWw9Im1vdmllLm1wNCIKICAgICAgICA+PC9kZWVzLXRpbGUtdmlkZW8+CgogICAgICAgIDxkZWVzLXRpbGUtdmlkZW8KICAgICAgICAgIHNyYz0iaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS9odG1sL21vdl9iYmIubXA0IgogICAgICAgICAgbGFiZWw9ImFub3RoZXItdmlkZW8ubXA0IgogICAgICAgID48L2RlZXMtdGlsZS12aWRlbz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICA8aDM+U2l6ZSBWYXJpYW50czwvaDM+CiAgICAgIDxkaXYgY2xhc3M9InRpbGUtcm93Ij4KICAgICAgICA8ZGVlcy10aWxlLXZpZGVvCiAgICAgICAgICBzaXplPSJzbWFsbCIKICAgICAgICAgIHNyYz0iaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS9odG1sL21vdl9iYmIubXA0IgogICAgICAgICAgbGFiZWw9InNtYWxsLm1wNCIKICAgICAgICA+PC9kZWVzLXRpbGUtdmlkZW8+CgogICAgICAgIDxkZWVzLXRpbGUtdmlkZW8KICAgICAgICAgIHNyYz0iaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS9odG1sL21vdl9iYmIubXA0IgogICAgICAgICAgbGFiZWw9ImRlZmF1bHQubXA0IgogICAgICAgID48L2RlZXMtdGlsZS12aWRlbz4KCiAgICAgICAgPGRlZXMtdGlsZS12aWRlbwogICAgICAgICAgc2l6ZT0ibGFyZ2UiCiAgICAgICAgICBzcmM9Imh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vaHRtbC9tb3ZfYmJiLm1wNCIKICAgICAgICAgIGxhYmVsPSJsYXJnZS5tcDQiCiAgICAgICAgPjwvZGVlcy10aWxlLXZpZGVvPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgIDxoMz5XaXRoIFBvc3RlciBJbWFnZTwvaDM+CiAgICAgIDxkZWVzLXRpbGUtdmlkZW8KICAgICAgICBzcmM9Imh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vaHRtbC9tb3ZpZS5tcDQiCiAgICAgICAgcG9zdGVyPSJodHRwczovL3BpY3N1bS5waG90b3MvNjAwLzQwMCIKICAgICAgICBsYWJlbD0icG9zdGVyLXZpZGVvLm1wNCIKICAgICAgPjwvZGVlcy10aWxlLXZpZGVvPgogICAgPC9kaXY+CiAgPC9kaXY+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy10aWxlLXZpZGVvL2NvbXBvbmVudC5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgX19lc0RlY29yYXRlODMgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczg0ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzVGlsZVZpZGVvID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLXRpbGUtdmlkZW8iKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc1RpbGVCYXNlOwogIGxldCBfc3JjX2RlY29yYXRvcnM7CiAgbGV0IF9zcmNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zcmNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Bvc3Rlcl9kZWNvcmF0b3JzOwogIGxldCBfcG9zdGVyX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfcG9zdGVyX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kdXJhdGlvbl9kZWNvcmF0b3JzOwogIGxldCBfZHVyYXRpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9kdXJhdGlvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGh1bWJuYWlsQ2FwdHVyZWRfZGVjb3JhdG9yczsKICBsZXQgX3RodW1ibmFpbENhcHR1cmVkX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGh1bWJuYWlsQ2FwdHVyZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzSG92ZXJpbmdfZGVjb3JhdG9yczsKICBsZXQgX2lzSG92ZXJpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0hvdmVyaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNUaWxlVmlkZW8yID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfc3JjX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfcG9zdGVyX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfZHVyYXRpb25fZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX3RodW1ibmFpbENhcHR1cmVkX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pc0hvdmVyaW5nX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTgzKHRoaXMsIG51bGwsIF9zcmNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic3JjIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzcmMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc3JjLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zcmMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc3JjX2luaXRpYWxpemVycywgX3NyY19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTgzKHRoaXMsIG51bGwsIF9wb3N0ZXJfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicG9zdGVyIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJwb3N0ZXIiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucG9zdGVyLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5wb3N0ZXIgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfcG9zdGVyX2luaXRpYWxpemVycywgX3Bvc3Rlcl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTgzKHRoaXMsIG51bGwsIF9kdXJhdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJkdXJhdGlvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZHVyYXRpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZHVyYXRpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmR1cmF0aW9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2R1cmF0aW9uX2luaXRpYWxpemVycywgX2R1cmF0aW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODModGhpcywgbnVsbCwgX3RodW1ibmFpbENhcHR1cmVkX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRodW1ibmFpbENhcHR1cmVkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0aHVtYm5haWxDYXB0dXJlZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50aHVtYm5haWxDYXB0dXJlZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGh1bWJuYWlsQ2FwdHVyZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGh1bWJuYWlsQ2FwdHVyZWRfaW5pdGlhbGl6ZXJzLCBfdGh1bWJuYWlsQ2FwdHVyZWRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4Myh0aGlzLCBudWxsLCBfaXNIb3ZlcmluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc0hvdmVyaW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc0hvdmVyaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzSG92ZXJpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzSG92ZXJpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNIb3ZlcmluZ19pbml0aWFsaXplcnMsIF9pc0hvdmVyaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODMobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzVGlsZVZpZGVvMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW84OwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIk1lZGlhIl07CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICAuLi50aWxlQmFzZVN0eWxlcywKICAgICAgaWAKICAgICAgLnZpZGVvLXdyYXBwZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CgogICAgICAudmlkZW8td3JhcHBlciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG9iamVjdC1maXQ6IGNvdmVyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAudmlkZW8td3JhcHBlciBjYW52YXMgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvYmplY3QtZml0OiBjb3ZlcjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgLnBvc3Rlci1pbWFnZSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG9iamVjdC1maXQ6IGNvdmVyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgoKICAgICAgLnBsYXktb3ZlcmxheSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgICB3aWR0aDogNDhweDsKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgei1pbmRleDogMTU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5wbGF5LW92ZXJsYXkgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAudGlsZS1jb250YWluZXIuY2xpY2thYmxlOmhvdmVyIC5wbGF5LW92ZXJsYXkgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC52aWRlby1ob3Zlci1wcmV2aWV3IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG9iamVjdC1maXQ6IGNvdmVyOwogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgZWFzZTsKICAgICAgfQoKICAgICAgLnZpZGVvLWhvdmVyLXByZXZpZXcuYWN0aXZlIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CiAgICBgCiAgICBdOwogICAgI3NyY19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM4NCh0aGlzLCBfc3JjX2luaXRpYWxpemVycywgIiIpOwogICAgZ2V0IHNyYygpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NyY19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNyYyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc3JjX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjcG9zdGVyX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4NCh0aGlzLCBfc3JjX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4NCh0aGlzLCBfcG9zdGVyX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBwb3N0ZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwb3N0ZXJfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBwb3N0ZXIodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Bvc3Rlcl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2R1cmF0aW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4NCh0aGlzLCBfcG9zdGVyX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4NCh0aGlzLCBfZHVyYXRpb25faW5pdGlhbGl6ZXJzLCAwKSk7CiAgICBnZXQgZHVyYXRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNkdXJhdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGR1cmF0aW9uKHZhbHVlMikgewogICAgICB0aGlzLiNkdXJhdGlvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3RodW1ibmFpbENhcHR1cmVkX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4NCh0aGlzLCBfZHVyYXRpb25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczg0KHRoaXMsIF90aHVtYm5haWxDYXB0dXJlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgdGh1bWJuYWlsQ2FwdHVyZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0aHVtYm5haWxDYXB0dXJlZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRodW1ibmFpbENhcHR1cmVkKHZhbHVlMikgewogICAgICB0aGlzLiN0aHVtYm5haWxDYXB0dXJlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzSG92ZXJpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczg0KHRoaXMsIF90aHVtYm5haWxDYXB0dXJlZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODQodGhpcywgX2lzSG92ZXJpbmdfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGlzSG92ZXJpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc0hvdmVyaW5nX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaXNIb3ZlcmluZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXNIb3ZlcmluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgdGh1bWJuYWlsQ2FudmFzID0gKF9fcnVuSW5pdGlhbGl6ZXJzODQodGhpcywgX2lzSG92ZXJpbmdfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgIGhvdmVyVmlkZW8gPSBudWxsOwogICAgaGFzU3RhcnRlZExvYWRpbmcgPSBmYWxzZTsKICAgIHJlbmRlclRpbGVDb250ZW50KCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InZpZGVvLXdyYXBwZXIiPgogICAgICAgICR7dGhpcy5wb3N0ZXIgPyBiMmAKICAgICAgICAgIDxpbWcgY2xhc3M9InBvc3Rlci1pbWFnZSIgc3JjPSIke3RoaXMucG9zdGVyfSIgYWx0PSIiIC8+CiAgICAgICAgYCA6IHRoaXMudGh1bWJuYWlsQ2FwdHVyZWQgPyBiMmAKICAgICAgICAgIDxjYW52YXM+PC9jYW52YXM+CiAgICAgICAgYCA6IGIyYAogICAgICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgYmFja2dyb3VuZDogIzAwMDsiPjwvZGl2PgogICAgICAgIGB9CgogICAgICAgICR7dGhpcy5pc0hvdmVyaW5nICYmIHRoaXMuc3JjID8gYjJgCiAgICAgICAgICA8dmlkZW8KICAgICAgICAgICAgY2xhc3M9InZpZGVvLWhvdmVyLXByZXZpZXcgJHt0aGlzLmlzSG92ZXJpbmcgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgICAgLnNyYz0ke3RoaXMuc3JjfQogICAgICAgICAgICBtdXRlZAogICAgICAgICAgICBwbGF5c2lubGluZQogICAgICAgICAgICBAbG9hZGVkZGF0YT0ke3RoaXMuaGFuZGxlSG92ZXJWaWRlb0xvYWRlZH0KICAgICAgICAgID48L3ZpZGVvPgogICAgICAgIGAgOiAiIn0KICAgICAgPC9kaXY+CgogICAgICAkeyF0aGlzLmlzSG92ZXJpbmcgPyBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJwbGF5LW92ZXJsYXkiPgogICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6UGxheSI+PC9kZWVzLWljb24+CiAgICAgICAgPC9kaXY+CiAgICAgIGAgOiAiIn0KCiAgICAgICR7dGhpcy5jbGlja2FibGUgPyBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJ0aWxlLW92ZXJsYXkiPgogICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6UGxheSI+PC9kZWVzLWljb24+CiAgICAgICAgICA8c3Bhbj5QbGF5IFZpZGVvPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICBgIDogIiJ9CiAgICBgOwogICAgfQogICAgcmVuZGVyQm90dG9tQmFyKCkgewogICAgICBpZiAoIXRoaXMubGFiZWwgJiYgIXRoaXMuZHVyYXRpb24pCiAgICAgICAgcmV0dXJuICIiOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InRpbGUtaW5mby1iYXIiPgogICAgICAgICR7dGhpcy5sYWJlbCA/IGIyYDxzcGFuIGNsYXNzPSJpbmZvLWxhYmVsIiB0aXRsZT0iJHt0aGlzLmxhYmVsfSI+JHt0aGlzLmxhYmVsfTwvc3Bhbj5gIDogIiJ9CiAgICAgICAgPHNwYW4gY2xhc3M9ImluZm8tc3BhY2VyIj48L3NwYW4+CiAgICAgICAgJHt0aGlzLmR1cmF0aW9uID4gMCA/IGIyYDxzcGFuIGNsYXNzPSJpbmZvLWRldGFpbCI+JHt0aGlzLmZvcm1hdFRpbWUodGhpcy5kdXJhdGlvbil9PC9zcGFuPmAgOiAiIn0KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgZ2V0VGlsZUNsaWNrRGV0YWlsKCkgewogICAgICByZXR1cm4gewogICAgICAgIHNyYzogdGhpcy5zcmMsCiAgICAgICAgcG9zdGVyOiB0aGlzLnBvc3RlciwKICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbgogICAgICB9OwogICAgfQogICAgb25CZWNhbWVWaXNpYmxlKCkgewogICAgICBpZiAoIXRoaXMuaGFzU3RhcnRlZExvYWRpbmcgJiYgdGhpcy5zcmMpIHsKICAgICAgICB0aGlzLmhhc1N0YXJ0ZWRMb2FkaW5nID0gdHJ1ZTsKICAgICAgICB0aGlzLmNhcHR1cmVGaXJzdEZyYW1lKCk7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGNhcHR1cmVGaXJzdEZyYW1lKCkgewogICAgICBpZiAodGhpcy5wb3N0ZXIpIHsKICAgICAgICB0aGlzLmxvYWREdXJhdGlvbigpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IHZpZGVvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTsKICAgICAgICB2aWRlby5jcm9zc09yaWdpbiA9ICJhbm9ueW1vdXMiOwogICAgICAgIHZpZGVvLm11dGVkID0gdHJ1ZTsKICAgICAgICB2aWRlby5wcmVsb2FkID0gIm1ldGFkYXRhIjsKICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIsIHJlamVjdCkgPT4gewogICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsICgpID0+IHsKICAgICAgICAgICAgdGhpcy5kdXJhdGlvbiA9IHZpZGVvLmR1cmF0aW9uOwogICAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IDAuMTsKICAgICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigic2Vla2VkIiwgKCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHZpZGVvLnZpZGVvV2lkdGg7CiAgICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IHZpZGVvLnZpZGVvSGVpZ2h0OwogICAgICAgICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgICAgICAgIGlmIChjdHgpIHsKICAgICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UodmlkZW8sIDAsIDApOwogICAgICAgICAgICAgICAgdGhpcy50aHVtYm5haWxDYW52YXMgPSBjYW52YXM7CiAgICAgICAgICAgICAgICB0aGlzLnRodW1ibmFpbENhcHR1cmVkID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmlkZW8uc3JjID0gIiI7CiAgICAgICAgICAgICAgdmlkZW8ubG9hZCgpOwogICAgICAgICAgICAgIHJlc29sdmUyKCk7CiAgICAgICAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcigiRmFpbGVkIHRvIGxvYWQgdmlkZW8iKSksIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgICAgIHZpZGVvLnNyYyA9IHRoaXMuc3JjOwogICAgICAgIH0pOwogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7CiAgICAgICAgdGhpcy5jb3B5VGh1bWJuYWlsVG9DYW52YXMoKTsKICAgICAgfSBjYXRjaCB7CiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5sb2FkRHVyYXRpb24oKTsKICAgICAgfQogICAgfQogICAgbG9hZER1cmF0aW9uKCkgewogICAgICBjb25zdCB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7CiAgICAgIHZpZGVvLnByZWxvYWQgPSAibWV0YWRhdGEiOwogICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsICgpID0+IHsKICAgICAgICB0aGlzLmR1cmF0aW9uID0gdmlkZW8uZHVyYXRpb247CiAgICAgICAgdmlkZW8uc3JjID0gIiI7CiAgICAgICAgdmlkZW8ubG9hZCgpOwogICAgICB9KTsKICAgICAgdmlkZW8uc3JjID0gdGhpcy5zcmM7CiAgICB9CiAgICBjb3B5VGh1bWJuYWlsVG9DYW52YXMoKSB7CiAgICAgIGlmICghdGhpcy50aHVtYm5haWxDYW52YXMpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBjYW52YXMgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi52aWRlby13cmFwcGVyIGNhbnZhcyIpOwogICAgICBpZiAoIWNhbnZhcykKICAgICAgICByZXR1cm47CiAgICAgIGNhbnZhcy53aWR0aCA9IHRoaXMudGh1bWJuYWlsQ2FudmFzLndpZHRoOwogICAgICBjYW52YXMuaGVpZ2h0ID0gdGhpcy50aHVtYm5haWxDYW52YXMuaGVpZ2h0OwogICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgaWYgKGN0eCkgewogICAgICAgIGN0eC5kcmF3SW1hZ2UodGhpcy50aHVtYm5haWxDYW52YXMsIDAsIDApOwogICAgICB9CiAgICB9CiAgICBvblRpbGVNb3VzZUVudGVyKCkgewogICAgICB0aGlzLmlzSG92ZXJpbmcgPSB0cnVlOwogICAgfQogICAgb25UaWxlTW91c2VMZWF2ZSgpIHsKICAgICAgdGhpcy5pc0hvdmVyaW5nID0gZmFsc2U7CiAgICAgIHRoaXMuaG92ZXJWaWRlbyA9IG51bGw7CiAgICB9CiAgICBoYW5kbGVIb3ZlclZpZGVvTG9hZGVkKGUxMSkgewogICAgICB0aGlzLmhvdmVyVmlkZW8gPSBlMTEudGFyZ2V0OwogICAgICB0aGlzLmhvdmVyVmlkZW8ucGxheSgpLmNhdGNoKCgpID0+IHsKICAgICAgfSk7CiAgICB9CiAgICBhc3luYyB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJzcmMiKSAmJiB0aGlzLnNyYyAmJiB0aGlzLmlzVmlzaWJsZSkgewogICAgICAgIHRoaXMuaGFzU3RhcnRlZExvYWRpbmcgPSB0cnVlOwogICAgICAgIHRoaXMudGh1bWJuYWlsQ2FwdHVyZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLmR1cmF0aW9uID0gMDsKICAgICAgICB0aGlzLmNhcHR1cmVGaXJzdEZyYW1lKCk7CiAgICAgIH0KICAgICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygidGh1bWJuYWlsQ2FwdHVyZWQiKSAmJiB0aGlzLnRodW1ibmFpbENhcHR1cmVkKSB7CiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgICB0aGlzLmNvcHlUaHVtYm5haWxUb0NhbnZhcygpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgaWYgKHRoaXMuaG92ZXJWaWRlbykgewogICAgICAgIHRoaXMuaG92ZXJWaWRlby5wYXVzZSgpOwogICAgICAgIHRoaXMuaG92ZXJWaWRlby5zcmMgPSAiIjsKICAgICAgICB0aGlzLmhvdmVyVmlkZW8gPSBudWxsOwogICAgICB9CiAgICAgIHRoaXMudGh1bWJuYWlsQ2FudmFzID0gbnVsbDsKICAgIH0KICAgIGZvcm1hdFRpbWUoc2Vjb25kcykgewogICAgICBpZiAoIWlzRmluaXRlKHNlY29uZHMpIHx8IHNlY29uZHMgPCAwKQogICAgICAgIHJldHVybiAiMDowMCI7CiAgICAgIGNvbnN0IG1pbnMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7CiAgICAgIGNvbnN0IHNlY3MgPSBNYXRoLmZsb29yKHNlY29uZHMgJSA2MCk7CiAgICAgIHJldHVybiBgJHttaW5zfToke3NlY3MudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpfWA7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczg0KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzVGlsZVZpZGVvMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy10aWxlLW5vdGUvZGVtby5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgZGVtbzkgPSAoKSA9PiB7CiAgY29uc3Qgc2FtcGxlQ29kZSA9IGBpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JzsKCmV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCB7CiAgcHJpdmF0ZSBpdGVtczogc3RyaW5nW10gPSBbXTsKCiAgcmVuZGVyKCkgewogICAgcmV0dXJuIGh0bWxcYAogICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgIFwke3RoaXMuaXRlbXMubWFwKGl0ZW0gPT4gaHRtbFxgCiAgICAgICAgICA8c3Bhbj5cJHtpdGVtfTwvc3Bhbj4KICAgICAgICBcYCl9CiAgICAgIDwvZGl2PgogICAgXGA7CiAgfQp9YDsKICBjb25zdCBzYW1wbGVUZXh0ID0gYE1lZXRpbmcgTm90ZXMgLSBRNCBQbGFubmluZwpEYXRlOiBKYW51YXJ5IDE1LCAyMDI2CkF0dGVuZGVlczogQWxpY2UsIEJvYiwgQ2hhcmxpZQoKS2V5IERlY2lzaW9uczoKMS4gTGF1bmNoIG5ldyBmZWF0dXJlIGJ5IE1hcmNoCjIuIEhpcmUgMiBtb3JlIGVuZ2luZWVycwozLiBNaWdyYXRlIHRvIG5ldyBDSS9DRCBwaXBlbGluZQo0LiBVcGRhdGUgZGVzaWduIHN5c3RlbSB0byB2MwoKQWN0aW9uIEl0ZW1zOgotIEFsaWNlOiBEcmFmdCBQUkQgYnkgbmV4dCB3ZWVrCi0gQm9iOiBTZXQgdXAgaW50ZXJ2aWV3IHBpcGVsaW5lCi0gQ2hhcmxpZTogRXZhbHVhdGUgSmVua2lucyB2cyBHaXRIdWIgQWN0aW9uc2A7CiAgY29uc3Qgc2FtcGxlSnNvbiA9IGB7CiAgIm5hbWUiOiAiQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nIiwKICAidmVyc2lvbiI6ICIzLjM4LjAiLAogICJkZXNjcmlwdGlvbiI6ICJEZXNpZ24gY29tcG9uZW50IGNhdGFsb2ciLAogICJkZXBlbmRlbmNpZXMiOiB7CiAgICAiQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50IjogIl4yLjAuMCIsCiAgICAibGl0IjogIl4zLjEuMCIKICB9LAogICJzY3JpcHRzIjogewogICAgImJ1aWxkIjogInRzYnVpbGQiLAogICAgInRlc3QiOiAidHN0ZXN0IgogIH0KfWA7CiAgcmV0dXJuIGIyYAogICAgPHN0eWxlPgogICAgICAuZGVtby1jb250YWluZXIgewogICAgICAgIHBhZGRpbmc6IDQwcHg7CiAgICAgICAgYmFja2dyb3VuZDogI2Y1ZjVmNTsKICAgICAgfQogICAgICAuZGVtby1zZWN0aW9uIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiA2MHB4OwogICAgICB9CiAgICAgIGgzIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICB9CiAgICAgIC50aWxlLXJvdyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDI0cHg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDM+Tm90ZSBUaWxlczwvaDM+CiAgICAgICAgPGRpdiBjbGFzcz0idGlsZS1yb3ciPgogICAgICAgICAgPGRlZXMtdGlsZS1ub3RlCiAgICAgICAgICAgIHRpdGxlPSJjb21wb25lbnQudHMiCiAgICAgICAgICAgIC5jb250ZW50PSR7c2FtcGxlQ29kZX0KICAgICAgICAgICAgbGFuZ3VhZ2U9InR5cGVzY3JpcHQiCiAgICAgICAgICAgIGxhYmVsPSJjb21wb25lbnQudHMiCiAgICAgICAgICAgIEB0aWxlLWNsaWNrPSR7KGUxMSkgPT4gY29uc29sZS5sb2coIk5vdGUgY2xpY2tlZDoiLCBlMTEuZGV0YWlsKX0KICAgICAgICAgID48L2RlZXMtdGlsZS1ub3RlPgoKICAgICAgICAgIDxkZWVzLXRpbGUtbm90ZQogICAgICAgICAgICB0aXRsZT0iTWVldGluZyBOb3RlcyIKICAgICAgICAgICAgLmNvbnRlbnQ9JHtzYW1wbGVUZXh0fQogICAgICAgICAgICBsYWJlbD0ibWVldGluZy1ub3Rlcy50eHQiCiAgICAgICAgICA+PC9kZWVzLXRpbGUtbm90ZT4KCiAgICAgICAgICA8ZGVlcy10aWxlLW5vdGUKICAgICAgICAgICAgdGl0bGU9InBhY2thZ2UuanNvbiIKICAgICAgICAgICAgLmNvbnRlbnQ9JHtzYW1wbGVKc29ufQogICAgICAgICAgICBsYW5ndWFnZT0ianNvbiIKICAgICAgICAgICAgbGFiZWw9InBhY2thZ2UuanNvbiIKICAgICAgICAgID48L2RlZXMtdGlsZS1ub3RlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgzPlNpemUgVmFyaWFudHM8L2gzPgogICAgICAgIDxkaXYgY2xhc3M9InRpbGUtcm93Ij4KICAgICAgICAgIDxkZWVzLXRpbGUtbm90ZQogICAgICAgICAgICBzaXplPSJzbWFsbCIKICAgICAgICAgICAgdGl0bGU9InNtYWxsLnRzIgogICAgICAgICAgICAuY29udGVudD0ke3NhbXBsZUNvZGV9CiAgICAgICAgICAgIGxhbmd1YWdlPSJ0cyIKICAgICAgICAgICAgbGFiZWw9InNtYWxsLnRzIgogICAgICAgICAgPjwvZGVlcy10aWxlLW5vdGU+CgogICAgICAgICAgPGRlZXMtdGlsZS1ub3RlCiAgICAgICAgICAgIHRpdGxlPSJkZWZhdWx0LnRzIgogICAgICAgICAgICAuY29udGVudD0ke3NhbXBsZUNvZGV9CiAgICAgICAgICAgIGxhbmd1YWdlPSJ0cyIKICAgICAgICAgICAgbGFiZWw9ImRlZmF1bHQudHMiCiAgICAgICAgICA+PC9kZWVzLXRpbGUtbm90ZT4KCiAgICAgICAgICA8ZGVlcy10aWxlLW5vdGUKICAgICAgICAgICAgc2l6ZT0ibGFyZ2UiCiAgICAgICAgICAgIHRpdGxlPSJsYXJnZS50cyIKICAgICAgICAgICAgLmNvbnRlbnQ9JHtzYW1wbGVDb2RlfQogICAgICAgICAgICBsYW5ndWFnZT0idHMiCiAgICAgICAgICAgIGxhYmVsPSJsYXJnZS50cyIKICAgICAgICAgID48L2RlZXMtdGlsZS1ub3RlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRlbW8tc2VjdGlvbiI+CiAgICAgICAgPGgzPldpdGhvdXQgVGl0bGU8L2gzPgogICAgICAgIDxkZWVzLXRpbGUtbm90ZQogICAgICAgICAgLmNvbnRlbnQ9JHtzYW1wbGVUZXh0fQogICAgICAgICAgbGFiZWw9InVudGl0bGVkLnR4dCIKICAgICAgICA+PC9kZWVzLXRpbGUtbm90ZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW1lZGlhL2RlZXMtdGlsZS1ub3RlL2NvbXBvbmVudC5qcwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgX19lc0RlY29yYXRlODQgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczg1ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzVGlsZU5vdGUgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtdGlsZS1ub3RlIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNUaWxlQmFzZTsKICBsZXQgX3RpdGxlX2RlY29yYXRvcnM7CiAgbGV0IF90aXRsZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RpdGxlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jb250ZW50X2RlY29yYXRvcnM7CiAgbGV0IF9jb250ZW50X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29udGVudF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGFuZ3VhZ2VfZGVjb3JhdG9yczsKICBsZXQgX2xhbmd1YWdlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGFuZ3VhZ2VfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzSG92ZXJpbmdfZGVjb3JhdG9yczsKICBsZXQgX2lzSG92ZXJpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0hvdmVyaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNUaWxlTm90ZTIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF90aXRsZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2NvbnRlbnRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9sYW5ndWFnZV9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2lzSG92ZXJpbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlODQodGhpcywgbnVsbCwgX3RpdGxlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRpdGxlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0aXRsZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50aXRsZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGl0bGUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGl0bGVfaW5pdGlhbGl6ZXJzLCBfdGl0bGVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4NCh0aGlzLCBudWxsLCBfY29udGVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjb250ZW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjb250ZW50IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmNvbnRlbnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmNvbnRlbnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY29udGVudF9pbml0aWFsaXplcnMsIF9jb250ZW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODQodGhpcywgbnVsbCwgX2xhbmd1YWdlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxhbmd1YWdlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsYW5ndWFnZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sYW5ndWFnZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubGFuZ3VhZ2UgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbGFuZ3VhZ2VfaW5pdGlhbGl6ZXJzLCBfbGFuZ3VhZ2VfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4NCh0aGlzLCBudWxsLCBfaXNIb3ZlcmluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc0hvdmVyaW5nIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc0hvdmVyaW5nIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzSG92ZXJpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzSG92ZXJpbmcgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNIb3ZlcmluZ19pbml0aWFsaXplcnMsIF9pc0hvdmVyaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODQobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzVGlsZU5vdGUyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtbzk7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiTWVkaWEiXTsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIC4uLnRpbGVCYXNlU3R5bGVzLAogICAgICBpYAogICAgICAubm90ZS1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICJoc2woNjAgNSUgOTYlKSIpfTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAubm90ZS1oZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDEycHggMTRweCA4cHg7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5ub3RlLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMjAlIDIwJSkiLCAiaHNsKDIxNSAyMCUgMjAlKSIpfTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMzsKICAgICAgfQoKICAgICAgLm5vdGUtYm9keSB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBwYWRkaW5nOiAwIDE0cHggMTRweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLm5vdGUtdGV4dCB7CiAgICAgICAgZm9udC1mYW1pbHk6IHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDEwJSA0MCUpIiwgImhzbCgyMTUgMTAlIDM1JSkiKX07CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgLm5vdGUtZmFkZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGhlaWdodDogNjBweDsKICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgICB0cmFuc3BhcmVudCwKICAgICAgICAgICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgImhzbCg2MCA1JSA5NiUpIil9CiAgICAgICAgKTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLm5vdGUtbGluZXMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgd2lkdGg6IDM0cHg7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcwJSA4NSUpIiwgImhzbCgwIDUwJSA4MCUpIil9OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBwYWRkaW5nLXRvcDogMTJweDsKICAgICAgfQoKICAgICAgLmxpbmUtbnVtYmVyIHsKICAgICAgICBmb250LWZhbWlseTogdWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsIG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDlweDsKICAgICAgICBsaW5lLWhlaWdodDogMTVweDsgLyogbWF0Y2hlcyAxMHB4ICogMS41IGxpbmUtaGVpZ2h0ICovCiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDEwJSA3NSUpIiwgImhzbCgyMTUgMTAlIDcwJSkiKX07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogNnB4OwogICAgICB9CgogICAgYAogICAgXTsKICAgICN0aXRsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM4NSh0aGlzLCBfdGl0bGVfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICBnZXQgdGl0bGUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0aXRsZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRpdGxlKHZhbHVlMikgewogICAgICB0aGlzLiN0aXRsZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2NvbnRlbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczg1KHRoaXMsIF90aXRsZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODUodGhpcywgX2NvbnRlbnRfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGNvbnRlbnQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb250ZW50X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29udGVudCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29udGVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2xhbmd1YWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4NSh0aGlzLCBfY29udGVudF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODUodGhpcywgX2xhbmd1YWdlX2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBsYW5ndWFnZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2xhbmd1YWdlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbGFuZ3VhZ2UodmFsdWUyKSB7CiAgICAgIHRoaXMuI2xhbmd1YWdlX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNIb3ZlcmluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzODUodGhpcywgX2xhbmd1YWdlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4NSh0aGlzLCBfaXNIb3ZlcmluZ19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaXNIb3ZlcmluZygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzSG92ZXJpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc0hvdmVyaW5nKHZhbHVlMikgewogICAgICB0aGlzLiNpc0hvdmVyaW5nX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBub3RlQm9keUVsZW1lbnQgPSAoX19ydW5Jbml0aWFsaXplcnM4NSh0aGlzLCBfaXNIb3ZlcmluZ19leHRyYUluaXRpYWxpemVycyksIG51bGwpOwogICAgcmVuZGVyVGlsZUNvbnRlbnQoKSB7CiAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy5jb250ZW50LnNwbGl0KCJcbiIpOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9Im5vdGUtY29udGVudCI+CiAgICAgICAgJHt0aGlzLnRpdGxlID8gYjJgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJub3RlLWhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5vdGUtdGl0bGUiPiR7dGhpcy50aXRsZX08L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGAgOiAiIn0KCiAgICAgICAgPGRpdiBjbGFzcz0ibm90ZS1ib2R5Ij4KICAgICAgICAgIDxwcmUgY2xhc3M9Im5vdGUtdGV4dCI+JHtsaW5lcy5qb2luKCJcbiIpfTwvcHJlPgogICAgICAgICAgJHshdGhpcy5pc0hvdmVyaW5nID8gYjJgPGRpdiBjbGFzcz0ibm90ZS1mYWRlIj48L2Rpdj5gIDogIiJ9CiAgICAgICAgPC9kaXY+CgogICAgICA8L2Rpdj4KCiAgICAgICR7dGhpcy5jbGlja2FibGUgPyBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJ0aWxlLW92ZXJsYXkiPgogICAgICAgICAgPGRlZXMtaWNvbiBpY29uPSJsdWNpZGU6RmlsZVRleHQiPjwvZGVlcy1pY29uPgogICAgICAgICAgPHNwYW4+T3BlbiBOb3RlPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICBgIDogIiJ9CiAgICBgOwogICAgfQogICAgcmVuZGVyQm90dG9tQmFyKCkgewogICAgICBjb25zdCBsaW5lcyA9IHRoaXMuY29udGVudC5zcGxpdCgiXG4iKTsKICAgICAgaWYgKCF0aGlzLmxhYmVsICYmICF0aGlzLmxhbmd1YWdlICYmICFsaW5lcy5sZW5ndGgpCiAgICAgICAgcmV0dXJuICIiOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InRpbGUtaW5mby1iYXIiPgogICAgICAgICR7dGhpcy5sYWJlbCA/IGIyYDxzcGFuIGNsYXNzPSJpbmZvLWxhYmVsIiB0aXRsZT0iJHt0aGlzLmxhYmVsfSI+JHt0aGlzLmxhYmVsfTwvc3Bhbj5gIDogIiJ9CiAgICAgICAgPHNwYW4gY2xhc3M9ImluZm8tc3BhY2VyIj48L3NwYW4+CiAgICAgICAgJHt0aGlzLmxhbmd1YWdlID8gYjJgPHNwYW4gY2xhc3M9ImluZm8tZGV0YWlsIj4ke3RoaXMubGFuZ3VhZ2UudG9VcHBlckNhc2UoKX08L3NwYW4+YCA6ICIifQogICAgICAgICR7dGhpcy5pc0hvdmVyaW5nICYmIGxpbmVzLmxlbmd0aCA+IDEyID8gYjJgPHNwYW4gY2xhc3M9ImluZm8tZGV0YWlsIj5MaW5lICR7dGhpcy5nZXRWaXNpYmxlTGluZVJhbmdlKGxpbmVzLmxlbmd0aCl9PC9zcGFuPmAgOiBiMmA8c3BhbiBjbGFzcz0iaW5mby1kZXRhaWwiPiR7bGluZXMubGVuZ3RofSBsaW5lczwvc3Bhbj5gfQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBnZXRUaWxlQ2xpY2tEZXRhaWwoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsCiAgICAgICAgY29udGVudDogdGhpcy5jb250ZW50LAogICAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmd1YWdlCiAgICAgIH07CiAgICB9CiAgICBvblRpbGVNb3VzZUVudGVyKCkgewogICAgICB0aGlzLmlzSG92ZXJpbmcgPSB0cnVlOwogICAgICBpZiAoIXRoaXMubm90ZUJvZHlFbGVtZW50KSB7CiAgICAgICAgdGhpcy5ub3RlQm9keUVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5ub3RlLWJvZHkiKTsKICAgICAgfQogICAgfQogICAgb25UaWxlTW91c2VMZWF2ZSgpIHsKICAgICAgdGhpcy5pc0hvdmVyaW5nID0gZmFsc2U7CiAgICAgIGlmICh0aGlzLm5vdGVCb2R5RWxlbWVudCkgewogICAgICAgIHRoaXMubm90ZUJvZHlFbGVtZW50LnNjcm9sbFRvcCA9IDA7CiAgICAgIH0KICAgIH0KICAgIG9uVGlsZU1vdXNlTW92ZShlMTEpIHsKICAgICAgaWYgKCF0aGlzLmlzSG92ZXJpbmcgfHwgIXRoaXMubm90ZUJvZHlFbGVtZW50KQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgdG90YWxMaW5lcyA9IHRoaXMuY29udGVudC5zcGxpdCgiXG4iKS5sZW5ndGg7CiAgICAgIGlmICh0b3RhbExpbmVzIDw9IDEyKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IHg0ID0gZTExLmNsaWVudFggLSByZWN0LmxlZnQ7CiAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB4NCAvIHJlY3Qud2lkdGgpKTsKICAgICAgY29uc3QgbWF4U2Nyb2xsID0gdGhpcy5ub3RlQm9keUVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gdGhpcy5ub3RlQm9keUVsZW1lbnQuY2xpZW50SGVpZ2h0OwogICAgICB0aGlzLm5vdGVCb2R5RWxlbWVudC5zY3JvbGxUb3AgPSBwZXJjZW50YWdlICogbWF4U2Nyb2xsOwogICAgfQogICAgZ2V0VmlzaWJsZUxpbmVSYW5nZSh0b3RhbExpbmVzKSB7CiAgICAgIGlmICghdGhpcy5ub3RlQm9keUVsZW1lbnQpCiAgICAgICAgcmV0dXJuIGAxXHUyMDEzMTIgb2YgJHt0b3RhbExpbmVzfWA7CiAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSAxNTsKICAgICAgY29uc3QgZmlyc3RMaW5lID0gTWF0aC5mbG9vcih0aGlzLm5vdGVCb2R5RWxlbWVudC5zY3JvbGxUb3AgLyBsaW5lSGVpZ2h0KSArIDE7CiAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguZmxvb3IodGhpcy5ub3RlQm9keUVsZW1lbnQuY2xpZW50SGVpZ2h0IC8gbGluZUhlaWdodCk7CiAgICAgIGNvbnN0IGxhc3RMaW5lID0gTWF0aC5taW4oZmlyc3RMaW5lICsgdmlzaWJsZUNvdW50IC0gMSwgdG90YWxMaW5lcyk7CiAgICAgIHJldHVybiBgJHtmaXJzdExpbmV9XHUyMDEzJHtsYXN0TGluZX0gb2YgJHt0b3RhbExpbmVzfWA7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczg1KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzVGlsZU5vdGUyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1tZWRpYS9kZWVzLXRpbGUtZm9sZGVyL2RlbW8uanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIGRlbW8xMCA9ICgpID0+IHsKICBjb25zdCBwaG90b3NGb2xkZXIgPSBbCiAgICB7IHR5cGU6ICJpbWFnZSIsIG5hbWU6ICJzdW5zZXQuanBnIiwgdGh1bWJuYWlsU3JjOiAiaHR0cHM6Ly9waWNzdW0ucGhvdG9zLzIwMC8yMDA/cmFuZG9tPTEiIH0sCiAgICB7IHR5cGU6ICJpbWFnZSIsIG5hbWU6ICJtb3VudGFpbi5qcGciLCB0aHVtYm5haWxTcmM6ICJodHRwczovL3BpY3N1bS5waG90b3MvMjAwLzIwMD9yYW5kb209MiIgfSwKICAgIHsgdHlwZTogImltYWdlIiwgbmFtZTogIm9jZWFuLmpwZyIsIHRodW1ibmFpbFNyYzogImh0dHBzOi8vcGljc3VtLnBob3Rvcy8yMDAvMjAwP3JhbmRvbT0zIiB9LAogICAgeyB0eXBlOiAiaW1hZ2UiLCBuYW1lOiAiZm9yZXN0LmpwZyIsIHRodW1ibmFpbFNyYzogImh0dHBzOi8vcGljc3VtLnBob3Rvcy8yMDAvMjAwP3JhbmRvbT00IiB9LAogICAgeyB0eXBlOiAiaW1hZ2UiLCBuYW1lOiAiY2l0eS5qcGciLCB0aHVtYm5haWxTcmM6ICJodHRwczovL3BpY3N1bS5waG90b3MvMjAwLzIwMD9yYW5kb209NSIgfSwKICAgIHsgdHlwZTogImltYWdlIiwgbmFtZTogImRlc2VydC5qcGciLCB0aHVtYm5haWxTcmM6ICJodHRwczovL3BpY3N1bS5waG90b3MvMjAwLzIwMD9yYW5kb209NiIgfQogIF07CiAgY29uc3QgcHJvamVjdEZvbGRlciA9IFsKICAgIHsgdHlwZTogIm5vdGUiLCBuYW1lOiAiUkVBRE1FLm1kIiB9LAogICAgeyB0eXBlOiAibm90ZSIsIG5hbWU6ICJwYWNrYWdlLmpzb24iIH0sCiAgICB7IHR5cGU6ICJmb2xkZXIiLCBuYW1lOiAic3JjIiB9LAogICAgeyB0eXBlOiAiZm9sZGVyIiwgbmFtZTogInRlc3QiIH0sCiAgICB7IHR5cGU6ICJub3RlIiwgbmFtZTogInRzY29uZmlnLmpzb24iIH0sCiAgICB7IHR5cGU6ICJwZGYiLCBuYW1lOiAiZG9jcy5wZGYiIH0sCiAgICB7IHR5cGU6ICJpbWFnZSIsIG5hbWU6ICJsb2dvLnBuZyIsIHRodW1ibmFpbFNyYzogImh0dHBzOi8vcGljc3VtLnBob3Rvcy8xMDAvMTAwP3JhbmRvbT0xMCIgfQogIF07CiAgY29uc3QgbWVkaWFGb2xkZXIgPSBbCiAgICB7IHR5cGU6ICJ2aWRlbyIsIG5hbWU6ICJpbnRyby5tcDQiIH0sCiAgICB7IHR5cGU6ICJhdWRpbyIsIG5hbWU6ICJiYWNrZ3JvdW5kLm1wMyIgfSwKICAgIHsgdHlwZTogImltYWdlIiwgbmFtZTogInRodW1ibmFpbC5qcGciLCB0aHVtYm5haWxTcmM6ICJodHRwczovL3BpY3N1bS5waG90b3MvMjAwLzIwMD9yYW5kb209MjAiIH0sCiAgICB7IHR5cGU6ICJwZGYiLCBuYW1lOiAic3Rvcnlib2FyZC5wZGYiIH0KICBdOwogIGNvbnN0IGVtcHR5Rm9sZGVyID0gW107CiAgY29uc3Qgc2luZ2xlSXRlbUZvbGRlciA9IFsKICAgIHsgdHlwZTogInBkZiIsIG5hbWU6ICJyZXBvcnQucGRmIiB9CiAgXTsKICByZXR1cm4gYjJgCiAgICA8c3R5bGU+CiAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZzogNDBweDsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1OwogICAgICB9CiAgICAgIC5kZW1vLXNlY3Rpb24gewogICAgICAgIG1hcmdpbi1ib3R0b206IDYwcHg7CiAgICAgIH0KICAgICAgaDMgewogICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIH0KICAgICAgLnRpbGUtcm93IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogMjRweDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMz5Gb2xkZXIgVGlsZXM8L2gzPgogICAgICAgIDxkaXYgY2xhc3M9InRpbGUtcm93Ij4KICAgICAgICAgIDxkZWVzLXRpbGUtZm9sZGVyCiAgICAgICAgICAgIG5hbWU9IlBob3RvcyIKICAgICAgICAgICAgLml0ZW1zPSR7cGhvdG9zRm9sZGVyfQogICAgICAgICAgICBsYWJlbD0iNiBwaG90b3MiCiAgICAgICAgICAgIEB0aWxlLWNsaWNrPSR7KGUxMSkgPT4gY29uc29sZS5sb2coIkZvbGRlciBjbGlja2VkOiIsIGUxMS5kZXRhaWwpfQogICAgICAgICAgPjwvZGVlcy10aWxlLWZvbGRlcj4KCiAgICAgICAgICA8ZGVlcy10aWxlLWZvbGRlcgogICAgICAgICAgICBuYW1lPSJteS1wcm9qZWN0IgogICAgICAgICAgICAuaXRlbXM9JHtwcm9qZWN0Rm9sZGVyfQogICAgICAgICAgICBsYWJlbD0iUHJvamVjdCBmaWxlcyIKICAgICAgICAgID48L2RlZXMtdGlsZS1mb2xkZXI+CgogICAgICAgICAgPGRlZXMtdGlsZS1mb2xkZXIKICAgICAgICAgICAgbmFtZT0iTWVkaWEgQXNzZXRzIgogICAgICAgICAgICAuaXRlbXM9JHttZWRpYUZvbGRlcn0KICAgICAgICAgICAgbGFiZWw9Ik1peGVkIG1lZGlhIgogICAgICAgICAgPjwvZGVlcy10aWxlLWZvbGRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJkZW1vLXNlY3Rpb24iPgogICAgICAgIDxoMz5FZGdlIENhc2VzPC9oMz4KICAgICAgICA8ZGl2IGNsYXNzPSJ0aWxlLXJvdyI+CiAgICAgICAgICA8ZGVlcy10aWxlLWZvbGRlcgogICAgICAgICAgICBuYW1lPSJFbXB0eSBGb2xkZXIiCiAgICAgICAgICAgIC5pdGVtcz0ke2VtcHR5Rm9sZGVyfQogICAgICAgICAgPjwvZGVlcy10aWxlLWZvbGRlcj4KCiAgICAgICAgICA8ZGVlcy10aWxlLWZvbGRlcgogICAgICAgICAgICBuYW1lPSJTaW5nbGUgSXRlbSIKICAgICAgICAgICAgLml0ZW1zPSR7c2luZ2xlSXRlbUZvbGRlcn0KICAgICAgICAgID48L2RlZXMtdGlsZS1mb2xkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZGVtby1zZWN0aW9uIj4KICAgICAgICA8aDM+U2l6ZSBWYXJpYW50czwvaDM+CiAgICAgICAgPGRpdiBjbGFzcz0idGlsZS1yb3ciPgogICAgICAgICAgPGRlZXMtdGlsZS1mb2xkZXIKICAgICAgICAgICAgc2l6ZT0ic21hbGwiCiAgICAgICAgICAgIG5hbWU9IlNtYWxsIgogICAgICAgICAgICAuaXRlbXM9JHtwaG90b3NGb2xkZXJ9CiAgICAgICAgICA+PC9kZWVzLXRpbGUtZm9sZGVyPgoKICAgICAgICAgIDxkZWVzLXRpbGUtZm9sZGVyCiAgICAgICAgICAgIG5hbWU9IkRlZmF1bHQiCiAgICAgICAgICAgIC5pdGVtcz0ke3Bob3Rvc0ZvbGRlcn0KICAgICAgICAgID48L2RlZXMtdGlsZS1mb2xkZXI+CgogICAgICAgICAgPGRlZXMtdGlsZS1mb2xkZXIKICAgICAgICAgICAgc2l6ZT0ibGFyZ2UiCiAgICAgICAgICAgIG5hbWU9IkxhcmdlIgogICAgICAgICAgICAuaXRlbXM9JHtwaG90b3NGb2xkZXJ9CiAgICAgICAgICA+PC9kZWVzLXRpbGUtZm9sZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIGA7Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtbWVkaWEvZGVlcy10aWxlLWZvbGRlci9jb21wb25lbnQuanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIF9fZXNEZWNvcmF0ZTg1ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM4NiA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgVFlQRV9JQ09OX01BUCA9IHsKICBwZGY6ICJsdWNpZGU6RmlsZVRleHQiLAogIGltYWdlOiAibHVjaWRlOkltYWdlIiwKICBhdWRpbzogImx1Y2lkZTpNdXNpYyIsCiAgdmlkZW86ICJsdWNpZGU6VmlkZW8iLAogIG5vdGU6ICJsdWNpZGU6RmlsZUNvZGUiLAogIGZvbGRlcjogImx1Y2lkZTpGb2xkZXIiLAogIHVua25vd246ICJsdWNpZGU6RmlsZSIKfTsKdmFyIERlZXNUaWxlRm9sZGVyID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLXRpbGUtZm9sZGVyIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNUaWxlQmFzZTsKICBsZXQgX25hbWVfZGVjb3JhdG9yczsKICBsZXQgX25hbWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9uYW1lX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pdGVtc19kZWNvcmF0b3JzOwogIGxldCBfaXRlbXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pdGVtc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzVGlsZUZvbGRlcjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9uYW1lX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfaXRlbXNfZGVjb3JhdG9ycyA9IFtuNSh7IGF0dHJpYnV0ZTogZmFsc2UgfSldOwogICAgICBfX2VzRGVjb3JhdGU4NSh0aGlzLCBudWxsLCBfbmFtZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJuYW1lIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJuYW1lIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm5hbWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm5hbWUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbmFtZV9pbml0aWFsaXplcnMsIF9uYW1lX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODUodGhpcywgbnVsbCwgX2l0ZW1zX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIml0ZW1zIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpdGVtcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pdGVtcywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXRlbXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXRlbXNfaW5pdGlhbGl6ZXJzLCBfaXRlbXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4NShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNUaWxlRm9sZGVyMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW8xMDsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJNZWRpYSJdOwogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgLi4udGlsZUJhc2VTdHlsZXMsCiAgICAgIGlgCiAgICAgIC5mb2xkZXItY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCg0MCAzMCUgOTclKSIsICJoc2woMjE1IDIwJSAxNCUpIil9OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5mb2xkZXItaGVhZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgcGFkZGluZzogMTJweCAxNHB4IDhweDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLmZvbGRlci1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woNDAgODAlIDUwJSkiLCAiaHNsKDQwIDcwJSA2MCUpIil9OwogICAgICB9CgogICAgICAuZm9sZGVyLW5hbWUgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNzAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAyMCUgMjAlKSIsICJoc2woMjE1IDE2JSA4MCUpIil9OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBmbGV4OiAxOwogICAgICB9CgogICAgICAucHJldmlldy1ncmlkIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOwogICAgICAgIGdyaWQtdGVtcGxhdGUtcm93czogMWZyIDFmcjsKICAgICAgICBnYXA6IDRweDsKICAgICAgICBwYWRkaW5nOiAwIDE0cHggMTRweDsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICB9CgogICAgICAuZ3JpZC1jZWxsIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgMjAlIDk0JSkiLCAiaHNsKDIxNSAyMCUgMTglKSIpfTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5ncmlkLWNlbGwgaW1nIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb2JqZWN0LWZpdDogY292ZXI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC5ncmlkLWNlbGwgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDE2JSA2MCUpIiwgImhzbCgyMTUgMTYlIDU1JSkiKX07CiAgICAgIH0KCiAgICAgIC5ncmlkLWNlbGwtZW1wdHkgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDE1JSA5NiUpIiwgImhzbCgyMTUgMjAlIDE2JSkiKX07CiAgICAgIH0KCiAgICBgCiAgICBdOwogICAgI25hbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzODYodGhpcywgX25hbWVfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICBnZXQgbmFtZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI25hbWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBuYW1lKHZhbHVlMikgewogICAgICB0aGlzLiNuYW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXRlbXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczg2KHRoaXMsIF9uYW1lX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4Nih0aGlzLCBfaXRlbXNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IGl0ZW1zKCkgewogICAgICByZXR1cm4gdGhpcy4jaXRlbXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpdGVtcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXRlbXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHJlbmRlclRpbGVDb250ZW50KCkgewogICAgICBjb25zdCBwcmV2aWV3SXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKDAsIDQpOwogICAgICBjb25zdCBlbXB0eUNlbGxzID0gNCAtIHByZXZpZXdJdGVtcy5sZW5ndGg7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iZm9sZGVyLWNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9ImZvbGRlci1oZWFkZXIiPgogICAgICAgICAgPGRlZXMtaWNvbiBjbGFzcz0iZm9sZGVyLWljb24iIGljb249Imx1Y2lkZTpGb2xkZXIiPjwvZGVlcy1pY29uPgogICAgICAgICAgPGRpdiBjbGFzcz0iZm9sZGVyLW5hbWUiPiR7dGhpcy5uYW1lIHx8ICJVbnRpdGxlZCBGb2xkZXIifTwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJwcmV2aWV3LWdyaWQiPgogICAgICAgICAgJHtwcmV2aWV3SXRlbXMubWFwKChpdGVtKSA9PiBiMmAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JpZC1jZWxsIj4KICAgICAgICAgICAgICAke2l0ZW0udGh1bWJuYWlsU3JjID8gYjJgCiAgICAgICAgICAgICAgICA8aW1nIHNyYz0iJHtpdGVtLnRodW1ibmFpbFNyY30iIGFsdD0iJHtpdGVtLm5hbWV9IiAvPgogICAgICAgICAgICAgIGAgOiBiMmAKICAgICAgICAgICAgICAgIDxkZWVzLWljb24gaWNvbj0iJHtUWVBFX0lDT05fTUFQW2l0ZW0udHlwZV0gfHwgVFlQRV9JQ09OX01BUC51bmtub3dufSI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgYH0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgKX0KICAgICAgICAgICR7QXJyYXkuZnJvbSh7IGxlbmd0aDogZW1wdHlDZWxscyB9KS5tYXAoKCkgPT4gYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdyaWQtY2VsbCBncmlkLWNlbGwtZW1wdHkiPjwvZGl2PgogICAgICAgICAgYCl9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgJHt0aGlzLmNsaWNrYWJsZSA/IGIyYAogICAgICAgIDxkaXYgY2xhc3M9InRpbGUtb3ZlcmxheSI+CiAgICAgICAgICA8ZGVlcy1pY29uIGljb249Imx1Y2lkZTpGb2xkZXJPcGVuIj48L2RlZXMtaWNvbj4KICAgICAgICAgIDxzcGFuPk9wZW4gRm9sZGVyPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICBgIDogIiJ9CiAgICBgOwogICAgfQogICAgcmVuZGVyQm90dG9tQmFyKCkgewogICAgICBpZiAoIXRoaXMubGFiZWwgJiYgIXRoaXMuaXRlbXMubGVuZ3RoKQogICAgICAgIHJldHVybiAiIjsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJ0aWxlLWluZm8tYmFyIj4KICAgICAgICAke3RoaXMubGFiZWwgPyBiMmA8c3BhbiBjbGFzcz0iaW5mby1sYWJlbCIgdGl0bGU9IiR7dGhpcy5sYWJlbH0iPiR7dGhpcy5sYWJlbH08L3NwYW4+YCA6ICIifQogICAgICAgIDxzcGFuIGNsYXNzPSJpbmZvLXNwYWNlciI+PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJpbmZvLWRldGFpbCI+JHt0aGlzLml0ZW1zLmxlbmd0aH0gaXRlbSR7dGhpcy5pdGVtcy5sZW5ndGggIT09IDEgPyAicyIgOiAiIn08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGdldFRpbGVDbGlja0RldGFpbCgpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBuYW1lOiB0aGlzLm5hbWUsCiAgICAgICAgaXRlbUNvdW50OiB0aGlzLml0ZW1zLmxlbmd0aCwKICAgICAgICBpdGVtczogdGhpcy5pdGVtcwogICAgICB9OwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzODYodGhpcywgX2l0ZW1zX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzODYoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNUaWxlRm9sZGVyMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtb3ZlcmxheS9kZWVzLXNwZWVjaGJ1YmJsZS9kZWVzLXNwZWVjaGJ1YmJsZS5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkZW1vRnVuYzUxID0gKCkgPT4gewogIHJldHVybiBiMmAKICAgIDxzdHlsZT4KICAgICAgLnJlZjEgewogICAgICAgIG1hcmdpbjogMjBweDsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgICBoZWlnaHQ6IDEwcHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmVkOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0icmVmMSI+PC9kaXY+CiAgICA8ZGVlcy1zcGVlY2hidWJibGUgLnRleHQ9JHtgCiAgICAgICoqVGhpcyBpcyBhIGxvbmdlciBtYXJrZG93biB0ZXh0IHRoYXQgIGNhbiBiZSB1c2VkIHRoZSB3cml0ZSoqICAKICAgICAgYSBsb25nZXIgZGVzY3JpcHRpb24gYWJvdXQgd2hhdHMgZ29pbmcgb24gdGhlIGFwcCAgCiAgCiAgICAgICoqVGhpcyBpcyBhIHN1YmhlYWRlcioqCiAgICAgIGFuZCBhbm90aGVyIHRleHQKICAgIAogICAgYH0+PC9kZWVzLXNwZWVjaGJ1YmJsZT4KICBgOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLW92ZXJsYXkvZGVlcy1zcGVlY2hidWJibGUvZGVlcy1zcGVlY2hidWJibGUuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlODYgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczg3ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzU3BlZWNoYnViYmxlID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLXNwZWVjaGJ1YmJsZSIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3JlZmZlZEVsZW1lbnRfZGVjb3JhdG9yczsKICBsZXQgX3JlZmZlZEVsZW1lbnRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yZWZmZWRFbGVtZW50X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF90ZXh0X2RlY29yYXRvcnM7CiAgbGV0IF90ZXh0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGV4dF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfd2F2ZV9kZWNvcmF0b3JzOwogIGxldCBfd2F2ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3dhdmVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21hbmlmZXN0ZWRfZGVjb3JhdG9yczsKICBsZXQgX21hbmlmZXN0ZWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9tYW5pZmVzdGVkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zdGF0dXNfZGVjb3JhdG9yczsKICBsZXQgX3N0YXR1c19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3N0YXR1c19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzU3BlZWNoYnViYmxlMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX3JlZmZlZEVsZW1lbnRfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogT2JqZWN0CiAgICAgIH0pXTsKICAgICAgX3RleHRfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgIHJlZmxlY3Q6IHRydWUKICAgICAgfSldOwogICAgICBfd2F2ZV9kZWNvcmF0b3JzID0gW241KHsKICAgICAgICB0eXBlOiBCb29sZWFuCiAgICAgIH0pXTsKICAgICAgX21hbmlmZXN0ZWRfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogQm9vbGVhbgogICAgICB9KV07CiAgICAgIF9zdGF0dXNfZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgIH0pXTsKICAgICAgX19lc0RlY29yYXRlODYodGhpcywgbnVsbCwgX3JlZmZlZEVsZW1lbnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicmVmZmVkRWxlbWVudCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAicmVmZmVkRWxlbWVudCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5yZWZmZWRFbGVtZW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yZWZmZWRFbGVtZW50ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3JlZmZlZEVsZW1lbnRfaW5pdGlhbGl6ZXJzLCBfcmVmZmVkRWxlbWVudF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTg2KHRoaXMsIG51bGwsIF90ZXh0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRleHQiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInRleHQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudGV4dCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGV4dCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF90ZXh0X2luaXRpYWxpemVycywgX3RleHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4Nih0aGlzLCBudWxsLCBfd2F2ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ3YXZlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ3YXZlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLndhdmUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLndhdmUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfd2F2ZV9pbml0aWFsaXplcnMsIF93YXZlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODYodGhpcywgbnVsbCwgX21hbmlmZXN0ZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWFuaWZlc3RlZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibWFuaWZlc3RlZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5tYW5pZmVzdGVkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tYW5pZmVzdGVkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX21hbmlmZXN0ZWRfaW5pdGlhbGl6ZXJzLCBfbWFuaWZlc3RlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTg2KHRoaXMsIG51bGwsIF9zdGF0dXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic3RhdHVzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzdGF0dXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc3RhdHVzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zdGF0dXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc3RhdHVzX2luaXRpYWxpemVycywgX3N0YXR1c19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTg2KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1NwZWVjaGJ1YmJsZTIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzUxOwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIk92ZXJsYXkiXTsKICAgIC8vIFNUQVRJQwogICAgc3RhdGljIGFzeW5jIGNyZWF0ZUFuZFNob3cocmVmRWxlbWVudCwgdGV4dEFyZykgewogICAgICBjb25zdCB3aW5kb3dMYXllciA9IGF3YWl0IERlZXNXaW5kb3dMYXllci5jcmVhdGVBbmRTaG93KHsKICAgICAgICBibHVyOiBmYWxzZQogICAgICB9KTsKICAgICAgY29uc3Qgc3BlZWNoYnViYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGVlcy1zcGVlY2hidWJibGUiKTsKICAgICAgc3BlZWNoYnViYmxlLndpbmRvd0xheWVyID0gd2luZG93TGF5ZXI7CiAgICAgIHNwZWVjaGJ1YmJsZS5yZWZmZWRFbGVtZW50ID0gcmVmRWxlbWVudDsKICAgICAgc3BlZWNoYnViYmxlLnRleHQgPSB0ZXh0QXJnOwogICAgICBzcGVlY2hidWJibGUubWFuaWZlc3RlZCA9IHRydWU7CiAgICAgIHdpbmRvd0xheWVyLmFwcGVuZENoaWxkKHNwZWVjaGJ1YmJsZSk7CiAgICAgIHdpbmRvd0xheWVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAibm9uZSI7CiAgICAgIHdpbmRvd0xheWVyLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLndpbmRvd092ZXJsYXkiKS5zdHlsZS5wb2ludGVyRXZlbnRzID0gIm5vbmUiOwogICAgICByZXR1cm4gc3BlZWNoYnViYmxlOwogICAgfQogICAgI3JlZmZlZEVsZW1lbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzODcodGhpcywgX3JlZmZlZEVsZW1lbnRfaW5pdGlhbGl6ZXJzLCB2b2lkIDApOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCByZWZmZWRFbGVtZW50KCkgewogICAgICByZXR1cm4gdGhpcy4jcmVmZmVkRWxlbWVudF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHJlZmZlZEVsZW1lbnQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3JlZmZlZEVsZW1lbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN0ZXh0X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4Nyh0aGlzLCBfcmVmZmVkRWxlbWVudF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODcodGhpcywgX3RleHRfaW5pdGlhbGl6ZXJzLCB2b2lkIDApKTsKICAgIGdldCB0ZXh0KCkgewogICAgICByZXR1cm4gdGhpcy4jdGV4dF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRleHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3RleHRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN3YXZlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4Nyh0aGlzLCBfdGV4dF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODcodGhpcywgX3dhdmVfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IHdhdmUoKSB7CiAgICAgIHJldHVybiB0aGlzLiN3YXZlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgd2F2ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jd2F2ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI21hbmlmZXN0ZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczg3KHRoaXMsIF93YXZlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM4Nyh0aGlzLCBfbWFuaWZlc3RlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgbWFuaWZlc3RlZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21hbmlmZXN0ZWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtYW5pZmVzdGVkKHZhbHVlMikgewogICAgICB0aGlzLiNtYW5pZmVzdGVkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc3RhdHVzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM4Nyh0aGlzLCBfbWFuaWZlc3RlZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzODcodGhpcywgX3N0YXR1c19pbml0aWFsaXplcnMsICJub3JtYWwiKSk7CiAgICBnZXQgc3RhdHVzKCkgewogICAgICByZXR1cm4gdGhpcy4jc3RhdHVzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc3RhdHVzKHZhbHVlMikgewogICAgICB0aGlzLiNzdGF0dXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHdpbmRvd0xheWVyID0gX19ydW5Jbml0aWFsaXplcnM4Nyh0aGlzLCBfc3RhdHVzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzMzMyIsICIjZmZmIil9OwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICB9CgogICAgICAubWFpbmNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMnM7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDBweCk7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDBweDsKICAgICAgICBmaWx0ZXI6IGRyb3Atc2hhZG93KDBweCAwcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4yczsKICAgICAgfQoKICAgICAgLmFycm93IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmIiwgIiMzMzMiKX07CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIHdpZHRoOiAxNXB4OwogICAgICAgIGxlZnQ6IDJweDsKICAgICAgICB0b3A6IDEycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICB9CgogICAgICAuc3BlZWNoYnViYmxlIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZiIsICIjMzMzIil9OwogICAgICAgIHBhZGRpbmc6IDBweCAxNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbWluLXdpZHRoOiAyNDBweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgbGVmdDogOHB4OwogICAgICB9CgogICAgICAud2F2ZSB7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IHdhdmUtYW5pbWF0aW9uOyAvKiBSZWZlcnMgdG8gdGhlIG5hbWUgb2YgeW91ciBAa2V5ZnJhbWVzIGVsZW1lbnQgYmVsb3cgKi8KICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IDIuNXM7IC8qIENoYW5nZSB0byBzcGVlZCB1cCBvciBzbG93IGRvd24gKi8KICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsgLyogTmV2ZXIgc3RvcCB3YXZpbmcgOikgKi8KICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiA3MCUgNzAlOyAvKiBQaXZvdCBhcm91bmQgdGhlIGJvdHRvbS1sZWZ0IHBhbG0gKi8KICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgd2F2ZS1hbmltYXRpb24gewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgICAgIH0KICAgICAgICAxMCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTRkZWcpOwogICAgICAgIH0gLyogVGhlIGZvbGxvd2luZyBmaXZlIHZhbHVlcyBjYW4gYmUgcGxheWVkIHdpdGggdG8gbWFrZSB0aGUgd2F2aW5nIG1vcmUgb3IgbGVzcyBleHRyZW1lICovCiAgICAgICAgMjAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC04ZGVnKTsKICAgICAgICB9CiAgICAgICAgMzAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE0ZGVnKTsKICAgICAgICB9CiAgICAgICAgNDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC00ZGVnKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDEwZGVnKTsKICAgICAgICB9CiAgICAgICAgNjAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgICAgIH0gLyogUmVzZXQgZm9yIHRoZSBsYXN0IGhhbGYgdG8gcGF1c2UgKi8KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgICAgIH0KICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICAke3RoaXMubWFuaWZlc3RlZCA/IGIyYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYWluY29udGFpbmVyIiBAY2xpY2s9JHt0aGlzLmhhbmRsZUNsaWNrfT4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhcnJvdyI+PC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3BlZWNoYnViYmxlIj4KICAgICAgICAgICAgICAgICR7dGhpcy53YXZlID8gYjJgPHNwYW4gY2xhc3M9IndhdmUiPvCfkYs8L3NwYW4+YCA6IGIyYGB9CiAgICAgICAgICAgICAgICAke2RpcmVjdGl2ZXNfZXhwb3J0cy5yZXNvbHZlKHRoaXMuZ2V0SHRtbCgpKX0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICBgIDogYjJgYH0KICAgIGA7CiAgICB9CiAgICBhc3luYyBoYW5kbGVDbGljaygpIHsKICAgICAgY29uc29sZS5sb2coInNwZWVjaGJ1YmJsZSBnb3QgY2xpY2tlZC4iKTsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZCgpIHsKICAgICAgaWYgKCF0aGlzLnJlZmZlZEVsZW1lbnQpIHsKICAgICAgICB0aGlzLnJlZmZlZEVsZW1lbnQgPSB0aGlzLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7CiAgICAgIH0KICAgICAgaWYgKHRoaXMubWFuaWZlc3RlZCkgewogICAgICAgIGF3YWl0IHRoaXMudXBkYXRlUG9zaXRpb24oKTsKICAgICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLm1haW5jb250YWluZXIiKS5zdHlsZS5vcGFjaXR5ID0gIjEiOwogICAgICB9IGVsc2UgewogICAgICAgIGxldCBzcGVlY2hidWJibGU7CiAgICAgICAgdGhpcy5yZWZmZWRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCBhc3luYyAoKSA9PiB7CiAgICAgICAgICBzcGVlY2hidWJibGUgPSBhd2FpdCBEZWVzU3BlZWNoYnViYmxlMi5jcmVhdGVBbmRTaG93KHRoaXMucmVmZmVkRWxlbWVudCwgdGhpcy50ZXh0KTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLnJlZmZlZEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsICgpID0+IHsKICAgICAgICAgIHNwZWVjaGJ1YmJsZS5kZXN0cm95KCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIHVwZGF0ZVBvc2l0aW9uKCkgewogICAgICBjb25zdCByZWZFbGVtZW50ID0gdGhpcy5yZWZmZWRFbGVtZW50OwogICAgICBjb25zdCBib3VuZGluZ0NsaWVudFJlY3QgPSByZWZFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICB0aGlzLnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIjsKICAgICAgdGhpcy5zdHlsZS50b3AgPSBgJHtib3VuZGluZ0NsaWVudFJlY3QudG9wIC0gMTN9cHhgOwogICAgICB0aGlzLnN0eWxlLmxlZnQgPSBgJHtib3VuZGluZ0NsaWVudFJlY3QubGVmdCArIHJlZkVsZW1lbnQuY2xpZW50V2lkdGggKyA0fXB4YDsKICAgICAgaWYgKGJvdW5kaW5nQ2xpZW50UmVjdC5yaWdodCA+IDI1MCkgewogICAgICAgIHRoaXMuc3R5bGUud2lkdGggPSBgMjUwcHhgOwogICAgICB9CiAgICB9CiAgICBhc3luYyBnZXRIdG1sKCkgewogICAgICBpZiAoIXRoaXMudGV4dCkgewogICAgICAgIHJldHVybiAiIjsKICAgICAgfQogICAgICBjb25zdCBub3JtYWxpemVkID0gZGlzdF90c19leHBvcnRzMjkucGx1Z2lucy5zbWFydHN0cmluZy5ub3JtYWxpemUuc3RhbmRhcmQodGhpcy50ZXh0KTsKICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGlzdF90c19leHBvcnRzMjkucGx1Z2lucy5zbWFydG1hcmtkb3duLlNtYXJ0TWFya2Rvd24uZWFzeU1hcmtkb3duVG9IdG1sKG5vcm1hbGl6ZWQpOwogICAgICByZXR1cm4gbzgocmVzdWx0KTsKICAgIH0KICAgIGFzeW5jIHNob3coKSB7CiAgICB9CiAgICBhc3luYyBkZXN0cm95KCkgewogICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLm1haW5jb250YWluZXIiKS5zdHlsZS5vcGFjaXR5ID0gIjAiOwogICAgICB0aGlzLndpbmRvd0xheWVyLmRlc3Ryb3koKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzODcoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNTcGVlY2hidWJibGUyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1zaW1wbGUvZGVlcy1zaW1wbGUtYXBwZGFzaC9kZWVzLXNpbXBsZS1hcHBkYXNoLmRlbW8uanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIF9fZXNEZWNvcmF0ZTg4ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM4OSA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVtb1ZpZXdEYXNoYm9hcmQgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlbW8tdmlldy1kYXNoYm9hcmQiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgdmFyIERlbW9WaWV3RGFzaGJvYXJkMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX19lc0RlY29yYXRlODgobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZW1vVmlld0Rhc2hib2FyZDIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNDBweDsKICAgICAgfQogICAgICBoMSB7CiAgICAgICAgbWFyZ2luOiAwIDAgMjBweCAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMCIsICIjZmZmIil9OwogICAgICB9CiAgICAgIGRlZXMtc3RhdHNncmlkIHsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICB9CiAgICBgCiAgICBdOwogICAgc3RhdHNUaWxlcyA9IFsKICAgICAgewogICAgICAgIGlkOiAidXNlcnMiLAogICAgICAgIHRpdGxlOiAiQWN0aXZlIFVzZXJzIiwKICAgICAgICB2YWx1ZTogMTIzNCwKICAgICAgICB0eXBlOiAibnVtYmVyIiwKICAgICAgICBpY29uOiAiZmFVc2VycyIsCiAgICAgICAgZGVzY3JpcHRpb246ICIrMTUlIGZyb20gbGFzdCB3ZWVrIiwKICAgICAgICBjb2xvcjogIiMyMmM1NWUiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpZDogInBhZ2V2aWV3cyIsCiAgICAgICAgdGl0bGU6ICJQYWdlIFZpZXdzIiwKICAgICAgICB2YWx1ZTogNTY3MDAsCiAgICAgICAgdHlwZTogIm51bWJlciIsCiAgICAgICAgaWNvbjogImZhRXllIiwKICAgICAgICBkZXNjcmlwdGlvbjogIjU2LjdrIHRvdGFsIHZpZXdzIiwKICAgICAgICBjb2xvcjogIiMzYjgyZjYiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpZDogInVwdGltZSIsCiAgICAgICAgdGl0bGU6ICJTeXN0ZW0gVXB0aW1lIiwKICAgICAgICB2YWx1ZTogODksCiAgICAgICAgdW5pdDogIiUiLAogICAgICAgIHR5cGU6ICJnYXVnZSIsCiAgICAgICAgaWNvbjogImZhU2VydmVyIiwKICAgICAgICBkZXNjcmlwdGlvbjogIkxhc3QgMzAgZGF5cyIsCiAgICAgICAgY29sb3I6ICIjMTBiOTgxIiwKICAgICAgICBnYXVnZU9wdGlvbnM6IHsKICAgICAgICAgIG1pbjogMCwKICAgICAgICAgIG1heDogMTAwLAogICAgICAgICAgdGhyZXNob2xkczogWwogICAgICAgICAgICB7IHZhbHVlOiA4MCwgY29sb3I6ICIjZWY0NDQ0IiB9LAogICAgICAgICAgICB7IHZhbHVlOiA5MCwgY29sb3I6ICIjZjU5ZTBiIiB9LAogICAgICAgICAgICB7IHZhbHVlOiAxMDAsIGNvbG9yOiAiIzEwYjk4MSIgfQogICAgICAgICAgXQogICAgICAgIH0KICAgICAgfSwKICAgICAgewogICAgICAgIGlkOiAicmVzcG9uc2UiLAogICAgICAgIHRpdGxlOiAiQXZnIFJlc3BvbnNlIFRpbWUiLAogICAgICAgIHZhbHVlOiAzLjIsCiAgICAgICAgdW5pdDogInMiLAogICAgICAgIHR5cGU6ICJudW1iZXIiLAogICAgICAgIGljb246ICJmYUNsb2NrIiwKICAgICAgICBkZXNjcmlwdGlvbjogIi0wLjVzIGltcHJvdmVtZW50IiwKICAgICAgICBjb2xvcjogIiNmNTllMGIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICBpZDogInJldmVudWUiLAogICAgICAgIHRpdGxlOiAiTW9udGhseSBSZXZlbnVlIiwKICAgICAgICB2YWx1ZTogNDg1MjAsCiAgICAgICAgdW5pdDogIiQiLAogICAgICAgIHR5cGU6ICJ0cmVuZCIsCiAgICAgICAgaWNvbjogImZhRG9sbGFyU2lnbiIsCiAgICAgICAgZGVzY3JpcHRpb246ICIrOC4yJSBncm93dGgiLAogICAgICAgIGNvbG9yOiAiIzIyYzU1ZSIsCiAgICAgICAgdHJlbmREYXRhOiBbMzVlMywgMzhlMywgMzc1MDAsIDQxZTMsIDM5ODAwLCA0MmUzLCA0NDEwMCwgNDMyMDAsIDQ1NjAwLCA0NzEwMCwgNDY4MDAsIDQ4NTIwXQogICAgICB9LAogICAgICB7CiAgICAgICAgaWQ6ICJ0cmFmZmljIiwKICAgICAgICB0aXRsZTogIlRyYWZmaWMgVHJlbmQiLAogICAgICAgIHZhbHVlOiAxNjgwLAogICAgICAgIHR5cGU6ICJ0cmVuZCIsCiAgICAgICAgaWNvbjogImZhQ2hhcnRMaW5lIiwKICAgICAgICBkZXNjcmlwdGlvbjogIkxhc3QgNyBkYXlzIiwKICAgICAgICBjb2xvcjogIiMzYjgyZjYiLAogICAgICAgIHRyZW5kRGF0YTogWzEyMDAsIDEzNTAsIDExMDAsIDE0NTAsIDE2MDAsIDE1NTAsIDE2ODBdCiAgICAgIH0KICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGgxPkRhc2hib2FyZDwvaDE+CiAgICAgIDxwPldlbGNvbWUgdG8geW91ciBhcHBsaWNhdGlvbiBkYXNoYm9hcmQuIEhlcmUncyBhbiBvdmVydmlldyBvZiB5b3VyIG1ldHJpY3M6PC9wPgogICAgICA8ZGVlcy1zdGF0c2dyaWQKICAgICAgICAudGlsZXM9JHt0aGlzLnN0YXRzVGlsZXN9CiAgICAgICAgQHRpbGUtYWN0aW9uPSR7KGUxMSkgPT4gewogICAgICAgIGNvbnNvbGUubG9nKCJUaWxlIGFjdGlvbjoiLCBlMTEuZGV0YWlsKTsKICAgICAgfX0KICAgICAgPjwvZGVlcy1zdGF0c2dyaWQ+CiAgICBgOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM4OShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVtb1ZpZXdEYXNoYm9hcmQyID0gX2NsYXNzVGhpczsKfSkoKTsKdmFyIERlbW9WaWV3QW5hbHl0aWNzID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZW1vLXZpZXctYW5hbHl0aWNzIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIHZhciBEZW1vVmlld0FuYWx5dGljczIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9fZXNEZWNvcmF0ZTg4KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVtb1ZpZXdBbmFseXRpY3MyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDQwcHg7CiAgICAgIH0KICAgICAgaDEgewogICAgICAgIG1hcmdpbjogMCAwIDIwcHggMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAiLCAiI2ZmZiIpfTsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8aDE+QW5hbHl0aWNzPC9oMT4KICAgICAgPHA+VGhpcyBpcyB0aGUgYW5hbHl0aWNzIHZpZXcuIFlvdSBjYW4gYWRkIGNoYXJ0cyBhbmQgbWV0cmljcyBoZXJlLjwvcD4KICAgIGA7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczg5KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZW1vVmlld0FuYWx5dGljczIgPSBfY2xhc3NUaGlzOwp9KSgpOwp2YXIgRGVtb1ZpZXdTZXR0aW5ncyA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVtby12aWV3LXNldHRpbmdzIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIHZhciBEZW1vVmlld1NldHRpbmdzMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX19lc0RlY29yYXRlODgobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZW1vVmlld1NldHRpbmdzMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiA0MHB4OwogICAgICB9CiAgICAgIGgxIHsKICAgICAgICBtYXJnaW46IDAgMCAyMHB4IDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDAwIiwgIiNmZmYiKX07CiAgICAgIH0KICAgICAgLnNldHRpbmdzLXNlY3Rpb24gewogICAgICAgIG1hcmdpbi10b3A6IDMwcHg7CiAgICAgIH0KICAgICAgLnNldHRpbmdzLXNlY3Rpb24gaDIgewogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBtYXJnaW46IDAgMCAxNXB4IDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMzMzIiwgIiNjY2MiKX07CiAgICAgIH0KICAgICAgLmhvcml6b250YWwtZm9ybS1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y1ZjVmNSIsICIjMWExYTFhIil9OwogICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIG1hcmdpbjogMTVweCAwOwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxoMT5TZXR0aW5nczwvaDE+CiAgICAgIDxwPkNvbmZpZ3VyZSB5b3VyIGFwcGxpY2F0aW9uIHNldHRpbmdzIGJlbG93OjwvcD4KICAgICAgCiAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzLXNlY3Rpb24iPgogICAgICAgIDxoMj5HZW5lcmFsIFNldHRpbmdzPC9oMj4KICAgICAgICA8ZGVlcy1mb3JtPgogICAgICAgICAgPGRlZXMtaW5wdXQtdGV4dCBrZXk9ImFwcE5hbWUiIGxhYmVsPSJBcHBsaWNhdGlvbiBOYW1lIiB2YWx1ZT0iTXkgQXBwIj48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQga2V5PSJhcGlFbmRwb2ludCIgbGFiZWw9IkFQSSBFbmRwb2ludCIgdmFsdWU9Imh0dHBzOi8vYXBpLmV4YW1wbGUuY29tIj48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgIDxkZWVzLWlucHV0LWRyb3Bkb3duCiAgICAgICAgICAgIGtleT0iZW52aXJvbm1lbnQiCiAgICAgICAgICAgIGxhYmVsPSJFbnZpcm9ubWVudCIKICAgICAgICAgICAgLm9wdGlvbnM9JHtbCiAgICAgICAgeyBvcHRpb246ICJEZXZlbG9wbWVudCIsIGtleTogImRldiIgfSwKICAgICAgICB7IG9wdGlvbjogIlN0YWdpbmciLCBrZXk6ICJzdGFnaW5nIiB9LAogICAgICAgIHsgb3B0aW9uOiAiUHJvZHVjdGlvbiIsIGtleTogInByb2QiIH0KICAgICAgXX0KICAgICAgICAgICAgLnNlbGVjdGVkT3B0aW9uPSR7eyBvcHRpb246ICJQcm9kdWN0aW9uIiwga2V5OiAicHJvZCIgfX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtZHJvcGRvd24+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCBrZXk9ImVuYWJsZU5vdGlmaWNhdGlvbnMiIGxhYmVsPSJFbmFibGUgTm90aWZpY2F0aW9ucyIgdmFsdWU9InRydWUiPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IGtleT0iZW5hYmxlQW5hbHl0aWNzIiBsYWJlbD0iRW5hYmxlIEFuYWx5dGljcyIgdmFsdWU9ImZhbHNlIj48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdD5TYXZlIEdlbmVyYWwgU2V0dGluZ3M8L2RlZXMtZm9ybS1zdWJtaXQ+CiAgICAgICAgPC9kZWVzLWZvcm0+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3Mtc2VjdGlvbiI+CiAgICAgICAgPGgyPkRpc3BsYXkgUHJlZmVyZW5jZXM8L2gyPgogICAgICAgIDxkaXYgY2xhc3M9Imhvcml6b250YWwtZm9ybS1zZWN0aW9uIj4KICAgICAgICAgIDxwIHN0eWxlPSJtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAxNnB4OyI+UXVpY2sgZGlzcGxheSBzZXR0aW5ncyB1c2luZyBob3Jpem9udGFsIGxheW91dDo8L3A+CiAgICAgICAgICA8ZGVlcy1mb3JtIGhvcml6b250YWwtbGF5b3V0PgogICAgICAgICAgICA8ZGVlcy1pbnB1dC1kcm9wZG93bgogICAgICAgICAgICAgIGtleT0idGhlbWUiCiAgICAgICAgICAgICAgbGFiZWw9IlRoZW1lIgogICAgICAgICAgICAgIC5lbmFibGVTZWFyY2g9JHtmYWxzZX0KICAgICAgICAgICAgICAub3B0aW9ucz0ke1sKICAgICAgICB7IG9wdGlvbjogIkxpZ2h0Iiwga2V5OiAibGlnaHQiIH0sCiAgICAgICAgeyBvcHRpb246ICJEYXJrIiwga2V5OiAiZGFyayIgfSwKICAgICAgICB7IG9wdGlvbjogIkF1dG8iLCBrZXk6ICJhdXRvIiB9CiAgICAgIF19CiAgICAgICAgICAgICAgLnNlbGVjdGVkT3B0aW9uPSR7eyBvcHRpb246ICJEYXJrIiwga2V5OiAiZGFyayIgfX0KICAgICAgICAgICAgPjwvZGVlcy1pbnB1dC1kcm9wZG93bj4KICAgICAgICAgICAgPGRlZXMtaW5wdXQtZHJvcGRvd24KICAgICAgICAgICAgICBrZXk9Imxhbmd1YWdlIgogICAgICAgICAgICAgIGxhYmVsPSJMYW5ndWFnZSIKICAgICAgICAgICAgICAuZW5hYmxlU2VhcmNoPSR7ZmFsc2V9CiAgICAgICAgICAgICAgLm9wdGlvbnM9JHtbCiAgICAgICAgeyBvcHRpb246ICJFbmdsaXNoIiwga2V5OiAiZW4iIH0sCiAgICAgICAgeyBvcHRpb246ICJHZXJtYW4iLCBrZXk6ICJkZSIgfSwKICAgICAgICB7IG9wdGlvbjogIlNwYW5pc2giLCBrZXk6ICJlcyIgfSwKICAgICAgICB7IG9wdGlvbjogIkZyZW5jaCIsIGtleTogImZyIiB9CiAgICAgIF19CiAgICAgICAgICAgICAgLnNlbGVjdGVkT3B0aW9uPSR7eyBvcHRpb246ICJFbmdsaXNoIiwga2V5OiAiZW4iIH19CiAgICAgICAgICAgID48L2RlZXMtaW5wdXQtZHJvcGRvd24+CiAgICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IGtleT0iY29tcGFjdE1vZGUiIGxhYmVsPSJDb21wYWN0IE1vZGUiPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICAgIDwvZGVlcy1mb3JtPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgCiAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzLXNlY3Rpb24iPgogICAgICAgIDxoMj5Ob3RpZmljYXRpb24gU2V0dGluZ3M8L2gyPgogICAgICAgIDxkZWVzLWZvcm0+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1yYWRpb2dyb3VwCiAgICAgICAgICAgIC5sYWJlbD0keyJFbWFpbCBGcmVxdWVuY3kifQogICAgICAgICAgICAub3B0aW9ucz0ke1siUmVhbC10aW1lIiwgIkRhaWx5IERpZ2VzdCIsICJXZWVrbHkgU3VtbWFyeSIsICJOZXZlciJdfQogICAgICAgICAgICAuc2VsZWN0ZWRPcHRpb249JHsiUmVhbC10aW1lIn0KICAgICAgICAgICAgLmtleT0keyJlbWFpbEZyZXF1ZW5jeSJ9CiAgICAgICAgICA+PC9kZWVzLWlucHV0LXJhZGlvZ3JvdXA+CiAgICAgICAgICA8ZGVlcy1pbnB1dC1jaGVja2JveCBrZXk9InB1c2hOb3RpZmljYXRpb25zIiBsYWJlbD0iRW5hYmxlIFB1c2ggTm90aWZpY2F0aW9ucyIgdmFsdWU9InRydWUiPjwvZGVlcy1pbnB1dC1jaGVja2JveD4KICAgICAgICAgIDxkZWVzLWlucHV0LWNoZWNrYm94IGtleT0ic291bmRBbGVydHMiIGxhYmVsPSJQbGF5IFNvdW5kIGZvciBBbGVydHMiIHZhbHVlPSJ0cnVlIj48L2RlZXMtaW5wdXQtY2hlY2tib3g+CiAgICAgICAgICA8ZGVlcy1mb3JtLXN1Ym1pdD5VcGRhdGUgTm90aWZpY2F0aW9uczwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICA8L2RlZXMtZm9ybT4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM4OShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVtb1ZpZXdTZXR0aW5nczIgPSBfY2xhc3NUaGlzOwp9KSgpOwp2YXIgZGVtb0Z1bmM1MiA9ICgpID0+IGIyYAogIDxzdHlsZT4KICAgIGJvZHkgewogICAgICBtYXJnaW46IDA7CiAgICAgIHBhZGRpbmc6IDA7CiAgICB9CiAgICAuZGVtby1jb250YWluZXIgewogICAgICB3aWR0aDogMTAwJTsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHRvcDogMDsKICAgICAgbGVmdDogMDsKICAgIH0KICA8L3N0eWxlPgogIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgIDxkZWVzLXNpbXBsZS1hcHBkYXNoCiAgICAgIG5hbWU9Ik15IEFwcGxpY2F0aW9uIgogICAgICB0ZXJtaW5hbFNldHVwQ29tbWFuZD0iZWNobyAnV2VsY29tZSB0byB0aGUgdGVybWluYWwhJyIKICAgICAgLnZpZXdUYWJzPSR7WwogIHsKICAgIG5hbWU6ICJEYXNoYm9hcmQiLAogICAgaWNvbk5hbWU6ICJsdWNpZGU6aG9tZSIsCiAgICBlbGVtZW50OiBEZW1vVmlld0Rhc2hib2FyZAogIH0sCiAgewogICAgbmFtZTogIkFuYWx5dGljcyIsCiAgICBpY29uTmFtZTogImx1Y2lkZTpsaW5lQ2hhcnQiLAogICAgZWxlbWVudDogRGVtb1ZpZXdBbmFseXRpY3MKICB9LAogIHsKICAgIG5hbWU6ICJTZXR0aW5ncyIsCiAgICBpY29uTmFtZTogImx1Y2lkZTpzZXR0aW5ncyIsCiAgICBlbGVtZW50OiBEZW1vVmlld1NldHRpbmdzCiAgfQpdfQogICAgICBAbG9nb3V0PSR7KCkgPT4gewogIGNvbnNvbGUubG9nKCJMb2dvdXQgZXZlbnQgdHJpZ2dlcmVkIik7CiAgYWxlcnQoIkxvZ291dCBjbGlja2VkISIpOwp9fQogICAgICBAdmlldy1zZWxlY3Q9JHsoZTExKSA9PiB7CiAgY29uc29sZS5sb2coIlZpZXcgc2VsZWN0ZWQ6IiwgZTExLmRldGFpbC52aWV3Lm5hbWUpOwp9fQogICAgPjwvZGVlcy1zaW1wbGUtYXBwZGFzaD4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1zaW1wbGUvZGVlcy1zaW1wbGUtYXBwZGFzaC9kZWVzLXNpbXBsZS1hcHBkYXNoLmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfZGVlc19pY29uKCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTg5ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM5MCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1NpbXBsZUFwcERhc2ggPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtc2ltcGxlLWFwcGRhc2giKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9uYW1lX2RlY29yYXRvcnM7CiAgbGV0IF9uYW1lX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbmFtZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmlld1RhYnNfZGVjb3JhdG9yczsKICBsZXQgX3ZpZXdUYWJzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdmlld1RhYnNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Rlcm1pbmFsU2V0dXBDb21tYW5kX2RlY29yYXRvcnM7CiAgbGV0IF90ZXJtaW5hbFNldHVwQ29tbWFuZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Rlcm1pbmFsU2V0dXBDb21tYW5kX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZFZpZXdfZGVjb3JhdG9yczsKICBsZXQgX3NlbGVjdGVkVmlld19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3NlbGVjdGVkVmlld19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzU2ltcGxlQXBwRGFzaDIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9uYW1lX2RlY29yYXRvcnMgPSBbbjUoKV07CiAgICAgIF92aWV3VGFic19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQXJyYXkgfSldOwogICAgICBfdGVybWluYWxTZXR1cENvbW1hbmRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9zZWxlY3RlZFZpZXdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlODkodGhpcywgbnVsbCwgX25hbWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibmFtZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibmFtZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5uYW1lLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5uYW1lID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX25hbWVfaW5pdGlhbGl6ZXJzLCBfbmFtZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTg5KHRoaXMsIG51bGwsIF92aWV3VGFic19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ2aWV3VGFicyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidmlld1RhYnMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudmlld1RhYnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnZpZXdUYWJzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3ZpZXdUYWJzX2luaXRpYWxpemVycywgX3ZpZXdUYWJzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlODkodGhpcywgbnVsbCwgX3Rlcm1pbmFsU2V0dXBDb21tYW5kX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInRlcm1pbmFsU2V0dXBDb21tYW5kIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ0ZXJtaW5hbFNldHVwQ29tbWFuZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai50ZXJtaW5hbFNldHVwQ29tbWFuZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudGVybWluYWxTZXR1cENvbW1hbmQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdGVybWluYWxTZXR1cENvbW1hbmRfaW5pdGlhbGl6ZXJzLCBfdGVybWluYWxTZXR1cENvbW1hbmRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4OSh0aGlzLCBudWxsLCBfc2VsZWN0ZWRWaWV3X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNlbGVjdGVkVmlldyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2VsZWN0ZWRWaWV3IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNlbGVjdGVkVmlldywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2VsZWN0ZWRWaWV3ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NlbGVjdGVkVmlld19pbml0aWFsaXplcnMsIF9zZWxlY3RlZFZpZXdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU4OShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNTaW1wbGVBcHBEYXNoMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAvLyBTVEFUSUMKICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmM1MjsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJTaW1wbGUiXTsKICAgICNuYW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczkwKHRoaXMsIF9uYW1lX2luaXRpYWxpemVycywgIkFwcGxpY2F0aW9uIERhc2hib2FyZCIpOwogICAgLy8gSU5TVEFOQ0UKICAgIGdldCBuYW1lKCkgewogICAgICByZXR1cm4gdGhpcy4jbmFtZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG5hbWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI25hbWVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICN2aWV3VGFic19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTAodGhpcywgX25hbWVfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczkwKHRoaXMsIF92aWV3VGFic19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgdmlld1RhYnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiN2aWV3VGFic19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHZpZXdUYWJzKHZhbHVlMikgewogICAgICB0aGlzLiN2aWV3VGFic19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Rlcm1pbmFsU2V0dXBDb21tYW5kX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5MCh0aGlzLCBfdmlld1RhYnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczkwKHRoaXMsIF90ZXJtaW5hbFNldHVwQ29tbWFuZF9pbml0aWFsaXplcnMsIGBlY2hvICJUZXJtaW5hbCByZWFkeSJgKSk7CiAgICBnZXQgdGVybWluYWxTZXR1cENvbW1hbmQoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0ZXJtaW5hbFNldHVwQ29tbWFuZF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRlcm1pbmFsU2V0dXBDb21tYW5kKHZhbHVlMikgewogICAgICB0aGlzLiN0ZXJtaW5hbFNldHVwQ29tbWFuZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3NlbGVjdGVkVmlld19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTAodGhpcywgX3Rlcm1pbmFsU2V0dXBDb21tYW5kX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5MCh0aGlzLCBfc2VsZWN0ZWRWaWV3X2luaXRpYWxpemVycywgdm9pZCAwKSk7CiAgICBnZXQgc2VsZWN0ZWRWaWV3KCkgewogICAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRWaWV3X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2VsZWN0ZWRWaWV3KHZhbHVlMikgewogICAgICB0aGlzLiNzZWxlY3RlZFZpZXdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICAvKiBUT0RPOiBNaWdyYXRlIGhhcmRjb2RlZCB2YWx1ZXMgdG8gLS1kZWVzLSogQ1NTIHZhcmlhYmxlcyAqLwogICAgICA6aG9zdCB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxNSUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAubWFpbmNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIGxlZnQ6IDBweDsKICAgICAgICByaWdodDogMHB4OwogICAgICAgIGJvdHRvbTogMHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5hcHBiYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDBweDsKICAgICAgICBsZWZ0OiAwcHg7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSAyNHB4KTsKICAgICAgICB3aWR0aDogMjQwcHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk5JSkiLCAiaHNsKDAgMCUgNyUpIil9OwogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5MSUpIiwgImhzbCgwIDAlIDEzJSkiKX07CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtZmFtaWx5OiAnR2Vpc3QgU2FucycsIHNhbnMtc2VyaWY7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byAxZnIgbWluLWNvbnRlbnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnNpZGViYXItaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAyMHB4IDE2cHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5MSUpIiwgImhzbCgwIDAlIDEzJSkiKX07CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTJweDsKICAgICAgfQoKICAgICAgLmhlYWRlci1pY29uLXdyYXBwZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB3aWR0aDogMzZweDsKICAgICAgICBoZWlnaHQ6IDM2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgibGluZWFyLWdyYWRpZW50KDEzNWRlZywgaHNsKDIxNSAyMCUgOTUlKSAwJSwgaHNsKDIxNSAyMCUgOTAlKSAxMDAlKSIsICJsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCBoc2woMjE1IDIwJSAxOCUpIDAlLCBoc2woMjE1IDIwJSAxNCUpIDEwMCUpIil9OwogICAgICAgIGJveC1zaGFkb3c6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIwIDFweCAycHggcmdiKDAgMCAwIC8gMC4wNSksIGluc2V0IDAgMXB4IDAgcmdiKDI1NSAyNTUgMjU1IC8gMC41KSIsICIwIDFweCAycHggcmdiKDAgMCAwIC8gMC4yKSwgaW5zZXQgMCAxcHggMCByZ2IoMjU1IDI1NSAyNTUgLyAwLjA1KSIpfTsKICAgICAgfQoKICAgICAgLmhlYWRlci1pY29uLXdyYXBwZXIgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjE1IDIwJSA0MCUpIiwgImhzbCgyMTUgMjAlIDcwJSkiKX07CiAgICAgIH0KCiAgICAgIC5hcHBOYW1lIHsKICAgICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDklKSIsICJoc2woMCAwJSA5OCUpIil9OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDJlbTsKICAgICAgfQoKICAgICAgLnZpZXdUYWJzLWNvbnRhaW5lciB7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBwYWRkaW5nOiAxMnB4IDhweDsKICAgICAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47CiAgICAgICAgc2Nyb2xsYmFyLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODUlKSIsICJoc2woMCAwJSAyMCUpIil9IHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAudmlld1RhYnMtY29udGFpbmVyOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICAgICAgd2lkdGg6IDZweDsKICAgICAgfQoKICAgICAgLnZpZXdUYWJzLWNvbnRhaW5lcjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAudmlld1RhYnMtY29udGFpbmVyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg1JSkiLCAiaHNsKDAgMCUgMjAlKSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgIH0KCiAgICAgIC52aWV3VGFicy1jb250YWluZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNzUlKSIsICJoc2woMCAwJSAzMCUpIil9OwogICAgICB9CgogICAgICAuc2VjdGlvbi1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNTAlKSIsICJoc2woMCAwJSA1MCUpIil9OwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4IDhweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICAgIH0KCiAgICAgIC52aWV3VGFicyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogMnB4OwogICAgICB9CgogICAgICAudmlld1RhYiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTBweDsKICAgICAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDAlKSIsICJoc2woMCAwJSA2NSUpIil9OwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgIH0KCiAgICAgIC52aWV3VGFiOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMCUgLyAwLjA0KSIsICJoc2woMCAwJSAxMDAlIC8gMC4wNSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxNSUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgIH0KCiAgICAgIC52aWV3VGFiOmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDAlIC8gMC4wNikiLCAiaHNsKDAgMCUgMTAwJSAvIDAuMDcpIil9OwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OSk7CiAgICAgIH0KCiAgICAgIC52aWV3VGFiLnNlbGVjdGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAyNSUgOTUlKSIsICJoc2woMjE1IDIwJSAxNSUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDIxNSAyNSUgMzAlKSIsICJoc2woMjE1IDI1JSA4NSUpIil9OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC52aWV3VGFiLnNlbGVjdGVkOjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHRvcDogOHB4OwogICAgICAgIGJvdHRvbTogOHB4OwogICAgICAgIHdpZHRoOiAzcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAycHggMnB4IDA7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgNzAlIDUwJSkiLCAiaHNsKDIxNSA3MCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLnZpZXdUYWIgZGVlcy1pY29uIHsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgb3BhY2l0eTogMC41NTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnZpZXdUYWI6aG92ZXIgZGVlcy1pY29uIHsKICAgICAgICBvcGFjaXR5OiAwLjc1OwogICAgICB9CgogICAgICAudmlld1RhYi5zZWxlY3RlZCBkZWVzLWljb24gewogICAgICAgIG9wYWNpdHk6IDAuOTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTUgNzAlIDQ1JSkiLCAiaHNsKDIxNSA3MCUgNjUlKSIpfTsKICAgICAgfQoKICAgICAgLnZpZXdUYWIgc3BhbiB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgIC5hcHBBY3Rpb25zIHsKICAgICAgICBwYWRkaW5nOiAxMnB4IDhweDsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDkxJSkiLCAiaHNsKDAgMCUgMTMlKSIpfTsKICAgICAgfQoKICAgICAgLmFjdGlvbiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTBweDsKICAgICAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQwJSkiLCAiaHNsKDAgMCUgNjUlKSIpfTsKICAgICAgfQoKICAgICAgLmFjdGlvbjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDg0JSA2MCUgLyAwLjA4KSIsICJoc2woMCA4NCUgNjAlIC8gMC4xMikiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA4NCUgNDUlKSIsICJoc2woMCA4NCUgNjUlKSIpfTsKICAgICAgfQoKICAgICAgLmFjdGlvbiBkZWVzLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5hY3Rpb246aG92ZXIgZGVlcy1pY29uIHsKICAgICAgICBvcGFjaXR5OiAwLjk7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA4NCUgNDUlKSIsICJoc2woMCA4NCUgNjUlKSIpfTsKICAgICAgfQoKICAgICAgLmFwcGNvbnRlbnQgewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIHJpZ2h0OiAwcHg7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSAyNHB4KTsKICAgICAgICBib3R0b206IDI0cHg7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDI0MHB4KTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTclKSIsICJoc2woMCAwJSA1JSkiKX07CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjsKICAgICAgfQoKICAgICAgLmNvbnRyb2xiYXIgewogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDBweDsKICAgICAgICBsZWZ0OiAwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAyNHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjIwIDEzJSAxOCUpIiwgImhzbCgyMjAgMTMlIDEyJSkiKX07CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAxZW07CiAgICAgIH0KCiAgICAgIC5jb250cm9sIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA2cHg7CiAgICAgICAgcGFkZGluZzogMCAxMnB4OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICBjb2xvcjogaHNsKDAgMCUgNzAlKTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIGhzbCgwIDAlIDEwMCUgLyAwLjA4KTsKICAgICAgfQoKICAgICAgLmNvbnRyb2w6Zmlyc3QtY2hpbGQgewogICAgICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgICB9CgogICAgICAuY29udHJvbDpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogaHNsKDAgMCUgMTAwJSAvIDAuMDYpOwogICAgICAgIGNvbG9yOiBoc2woMCAwJSA5NSUpOwogICAgICB9CgogICAgICAuY29udHJvbCBkZWVzLWljb24gewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgLmNvbnRyb2wuc3RhdHVzLWNvbm5lY3RlZCBkZWVzLWljb24gewogICAgICAgIGNvbG9yOiBoc2woMTQyIDcwJSA1MCUpOwogICAgICB9CgogICAgICAuY29udHJvbC5zdGF0dXMtdGVybWluYWwgZGVlcy1pY29uIHsKICAgICAgICBjb2xvcjogaHNsKDQ1IDkwJSA1NSUpOwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9Im1haW5jb250YWluZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImFwcGJhciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLWhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlci1pY29uLXdyYXBwZXIiPgogICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249IiR7Imx1Y2lkZTpsYXlvdXRHcmlkIn0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXBwTmFtZSI+JHt0aGlzLm5hbWV9PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InZpZXdUYWJzLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tbGFiZWwiPk5hdmlnYXRpb248L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idmlld1RhYnMiPgogICAgICAgICAgICAgICR7dGhpcy52aWV3VGFicy5tYXAoKHZpZXcpID0+IGIyYAogICAgICAgICAgICAgICAgICA8ZGl2CiAgICAgICAgICAgICAgICAgICAgY2xhc3M9InZpZXdUYWIgJHt0aGlzLnNlbGVjdGVkVmlldyA9PT0gdmlldyA/ICJzZWxlY3RlZCIgOiAiIn0iCiAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5sb2FkVmlldyh2aWV3KX0KICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICR7dmlldy5pY29uTmFtZSA/IGIyYAogICAgICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0iJHt2aWV3Lmljb25OYW1lLmluY2x1ZGVzKCI6IikgPyB2aWV3Lmljb25OYW1lIDogYGx1Y2lkZToke3ZpZXcuaWNvbk5hbWV9YH0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgICAgIGAgOiBiMmAKICAgICAgICAgICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249IiR7Imx1Y2lkZTpmaWxlIn0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgICAgICAgIGB9CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHt2aWV3Lm5hbWV9PC9zcGFuPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIGApfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iYXBwQWN0aW9ucyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbiIgQGNsaWNrPSR7KCkgPT4gewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImxvZ291dCIsIHsgYnViYmxlczogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSkpOwogICAgICB9fT4KICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSIkeyJsdWNpZGU6bG9nT3V0In0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICAgIDxzcGFuPlNpZ24gb3V0PC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImFwcGNvbnRlbnQiPgogICAgICAgICAgPCEtLSBDb250ZW50IGdvZXMgaGVyZSAtLT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sYmFyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wgc3RhdHVzLWNvbm5lY3RlZCI+CiAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249IiR7Imx1Y2lkZTp3aWZpIn0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICA8c3Bhbj5Db25uZWN0ZWQ8L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wgc3RhdHVzLXRlcm1pbmFsIiBAY2xpY2s9JHt0aGlzLmxhdW5jaFRlcm1pbmFsfT4KICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0iJHsibHVjaWRlOnRlcm1pbmFsIn0iPjwvZGVlcy1pY29uPgogICAgICAgICAgICA8c3Bhbj5UZXJtaW5hbDwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIGNvbnN0IGRvbXRvb2xzID0gYXdhaXQgdGhpcy5kb210b29sc1Byb21pc2U7CiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBpZiAodGhpcy52aWV3VGFicyAmJiB0aGlzLnZpZXdUYWJzLmxlbmd0aCA+IDApIHsKICAgICAgICBjb25zdCB2aWV3VG9Mb2FkID0gdGhpcy5zZWxlY3RlZFZpZXcgfHwgdGhpcy52aWV3VGFic1swXTsKICAgICAgICBhd2FpdCB0aGlzLmxvYWRWaWV3KHZpZXdUb0xvYWQpOwogICAgICB9CiAgICB9CiAgICBjdXJyZW50VGVybWluYWwgPSBfX3J1bkluaXRpYWxpemVyczkwKHRoaXMsIF9zZWxlY3RlZFZpZXdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgYXN5bmMgbGF1bmNoVGVybWluYWwoKSB7CiAgICAgIGNvbnN0IGRvbXRvb2xzID0gYXdhaXQgdGhpcy5kb210b29sc1Byb21pc2U7CiAgICAgIGlmICh0aGlzLmN1cnJlbnRUZXJtaW5hbCkgewogICAgICAgIGF3YWl0IHRoaXMuY2xvc2VUZXJtaW5hbCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBtYWluY29udGFpbmVyID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5tYWluY29udGFpbmVyIik7CiAgICAgIGNvbnN0IHsgRGVlc1dvcmtzcGFjZVRlcm1pbmFsOiBEZWVzV29ya3NwYWNlVGVybWluYWwyIH0gPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IChpbml0X2RlZXNfd29ya3NwYWNlX3Rlcm1pbmFsKCksIGRlZXNfd29ya3NwYWNlX3Rlcm1pbmFsX2V4cG9ydHMpKTsKICAgICAgY29uc3QgdGVybWluYWwgPSBuZXcgRGVlc1dvcmtzcGFjZVRlcm1pbmFsMigpOwogICAgICB0ZXJtaW5hbC5zZXR1cENvbW1hbmQgPSB0aGlzLnRlcm1pbmFsU2V0dXBDb21tYW5kOwogICAgICB0aGlzLmN1cnJlbnRUZXJtaW5hbCA9IHRlcm1pbmFsOwogICAgICBtYWluY29udGFpbmVyLmFwcGVuZENoaWxkKHRlcm1pbmFsKTsKICAgICAgdGVybWluYWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICB0ZXJtaW5hbC5zdHlsZS56SW5kZXggPSAiMTAiOwogICAgICB0ZXJtaW5hbC5zdHlsZS50b3AgPSAiMHB4IjsKICAgICAgdGVybWluYWwuc3R5bGUubGVmdCA9ICIyNDBweCI7CiAgICAgIHRlcm1pbmFsLnN0eWxlLnJpZ2h0ID0gIjBweCI7CiAgICAgIHRlcm1pbmFsLnN0eWxlLmJvdHRvbSA9ICIyNHB4IjsKICAgICAgdGVybWluYWwuc3R5bGUub3BhY2l0eSA9ICIwIjsKICAgICAgdGVybWluYWwuc3R5bGUudHJhbnNmb3JtID0gInRyYW5zbGF0ZVkoOHB4KSBzY2FsZSgwLjk5KSI7CiAgICAgIHRlcm1pbmFsLnN0eWxlLnRyYW5zaXRpb24gPSAiYWxsIDAuMjVzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSkiOwogICAgICB0ZXJtaW5hbC5zdHlsZS5ib3hTaGFkb3cgPSAiMCAyNXB4IDUwcHggLTEycHggcmdiKDAgMCAwIC8gMC41KSwgMCAwIDAgMXB4IHJnYigyNTUgMjU1IDI1NSAvIDAuMDUpIjsKICAgICAgdGVybWluYWwuc3R5bGUubWF4V2lkdGggPSBgY2FsYygke21haW5jb250YWluZXIuY2xpZW50V2lkdGh9cHggLTI0MHB4KWA7CiAgICAgIHRlcm1pbmFsLnN0eWxlLm1heEhlaWdodCA9IGBjYWxjKCR7bWFpbmNvbnRhaW5lci5jbGllbnRIZWlnaHR9cHggLSAyNHB4KWA7CiAgICAgIHRlcm1pbmFsLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwgKCkgPT4gdGhpcy5jbG9zZVRlcm1pbmFsKCkpOwogICAgICBhd2FpdCBkb210b29scy5jb252ZW5pZW5jZS5zbWFydGRlbGF5LmRlbGF5Rm9yKDApOwogICAgICB0ZXJtaW5hbC5zdHlsZS5vcGFjaXR5ID0gIjEiOwogICAgICB0ZXJtaW5hbC5zdHlsZS50cmFuc2Zvcm0gPSAidHJhbnNsYXRlWSgwKSBzY2FsZSgxKSI7CiAgICAgIHJldHVybiB0ZXJtaW5hbDsKICAgIH0KICAgIGFzeW5jIGNsb3NlVGVybWluYWwoKSB7CiAgICAgIGNvbnN0IGRvbXRvb2xzID0gYXdhaXQgdGhpcy5kb210b29sc1Byb21pc2U7CiAgICAgIGlmICh0aGlzLmN1cnJlbnRUZXJtaW5hbCkgewogICAgICAgIHRoaXMuY3VycmVudFRlcm1pbmFsLnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgICAgdGhpcy5jdXJyZW50VGVybWluYWwuc3R5bGUudHJhbnNmb3JtID0gInRyYW5zbGF0ZVkoOHB4KSBzY2FsZSgwLjk5KSI7CiAgICAgICAgYXdhaXQgZG9tdG9vbHMuY29udmVuaWVuY2Uuc21hcnRkZWxheS5kZWxheUZvcigyNTApOwogICAgICAgIHRoaXMuY3VycmVudFRlcm1pbmFsLnJlbW92ZSgpOwogICAgICAgIHRoaXMuY3VycmVudFRlcm1pbmFsID0gbnVsbDsKICAgICAgfQogICAgfQogICAgY3VycmVudFZpZXc7CiAgICBhc3luYyBsb2FkVmlldyh2aWV3QXJnKSB7CiAgICAgIGNvbnN0IGFwcGNvbnRlbnQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmFwcGNvbnRlbnQiKTsKICAgICAgY29uc3QgdmlldyA9IG5ldyB2aWV3QXJnLmVsZW1lbnQoKTsKICAgICAgaWYgKHRoaXMuY3VycmVudFZpZXcpIHsKICAgICAgICB0aGlzLmN1cnJlbnRWaWV3LnJlbW92ZSgpOwogICAgICB9CiAgICAgIGFwcGNvbnRlbnQuYXBwZW5kQ2hpbGQodmlldyk7CiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSB2aWV3OwogICAgICB0aGlzLnNlbGVjdGVkVmlldyA9IHZpZXdBcmc7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInZpZXctc2VsZWN0IiwgewogICAgICAgIGRldGFpbDogeyB2aWV3OiB2aWV3QXJnIH0sCiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczkwKF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzU2ltcGxlQXBwRGFzaDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXNpbXBsZS9kZWVzLXNpbXBsZS1sb2dpbi9kZWVzLXNpbXBsZS1sb2dpbi5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkZW1vRnVuYzUzID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgYm9keSB7CiAgICAgIG1hcmdpbjogMDsKICAgICAgcGFkZGluZzogMDsKICAgIH0KICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgdG9wOiAwOwogICAgICBsZWZ0OiAwOwogICAgfQogIDwvc3R5bGU+CiAgPGRpdiBjbGFzcz0iZGVtby1jb250YWluZXIiPgogICAgPGRlZXMtc2ltcGxlLWxvZ2luIAogICAgICBuYW1lPSJNeSBBcHBsaWNhdGlvbiIKICAgICAgQGxvZ2luPSR7KGUxMSkgPT4gewogIGNvbnNvbGUubG9nKCJMb2dpbiBldmVudCByZWNlaXZlZDoiLCBlMTEuZGV0YWlsKTsKICBjb25zdCBsb2dpbkRhdGEgPSBlMTEuZGV0YWlsPy5kYXRhIHx8IGUxMS5kZXRhaWw7CiAgaWYgKGxvZ2luRGF0YT8udXNlcm5hbWUgJiYgbG9naW5EYXRhPy5wYXNzd29yZCkgewogICAgYWxlcnQoYExvZ2luIGF0dGVtcHRlZCB3aXRoOgpVc2VybmFtZTogJHtsb2dpbkRhdGEudXNlcm5hbWV9ClBhc3N3b3JkOiAke2xvZ2luRGF0YS5wYXNzd29yZH1gKTsKICB9IGVsc2UgewogICAgY29uc29sZS5lcnJvcigiSW52YWxpZCBsb2dpbiBkYXRhIHN0cnVjdHVyZToiLCBlMTEuZGV0YWlsKTsKICB9Cn19CiAgICA+CiAgICAgIDxkaXYgc3R5bGU9InBhZGRpbmc6IDQwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsiPgogICAgICAgIDxoMT5XZWxjb21lITwvaDE+CiAgICAgICAgPHA+VGhpcyBpcyB0aGUgc2xvdHRlZCBjb250ZW50IHRoYXQgYXBwZWFycyBhZnRlciBsb2dpbi48L3A+CiAgICAgIDwvZGl2PgogICAgPC9kZWVzLXNpbXBsZS1sb2dpbj4KICA8L2Rpdj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC1zaW1wbGUvZGVlcy1zaW1wbGUtbG9naW4vZGVlcy1zaW1wbGUtbG9naW4uanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlOTAgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczkxID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzU2ltcGxlTG9naW4gPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtc2ltcGxlLWxvZ2luIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfbmFtZV9kZWNvcmF0b3JzOwogIGxldCBfbmFtZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX25hbWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1NpbXBsZUxvZ2luMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX25hbWVfZGVjb3JhdG9ycyA9IFtuNSgpXTsKICAgICAgX19lc0RlY29yYXRlOTAodGhpcywgbnVsbCwgX25hbWVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibmFtZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibmFtZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5uYW1lLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5uYW1lID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX25hbWVfaW5pdGlhbGl6ZXJzLCBfbmFtZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTkwKG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1NpbXBsZUxvZ2luMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAvLyBTVEFUSUMKICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmM1MzsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJTaW1wbGUiXTsKICAgICNuYW1lX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczkxKHRoaXMsIF9uYW1lX2luaXRpYWxpemVycywgIkFwcGxpY2F0aW9uIik7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IG5hbWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNuYW1lX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgbmFtZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbmFtZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIDpob3N0IHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDMuOSUpIiwgImhzbCgwIDAlIDk4JSkiKX07CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGZvbnQtZmFtaWx5OiAnR2Vpc3QgU2FucycsIHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC5sb2dpbkNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDEwMCUpIiwgImhzbCgwIDAlIDMuOSUpIil9OwogICAgICB9CgogICAgICAuc2xvdENvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycyBlYXNlLCB0cmFuc2Zvcm0gMC4ycyBlYXNlOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAubG9naW4gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1heC13aWR0aDogMzYwcHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogMjRweDsKICAgICAgfQoKICAgICAgLmxvZ2luLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmhlYWRlciB7CiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAyNWVtOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOSUpIiwgImhzbCgwIDAlIDk4JSkiKX07CiAgICAgIH0KCiAgICAgIC5zdWJoZWFkZXIgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQ1LjElKSIsICJoc2woMCAwJSA2My45JSkiKX07CiAgICAgIH0KCiAgICAgIC5sb2dpbi1jYXJkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4OS44JSkiLCAiaHNsKDAgMCUgMTQuOSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICB9CgogICAgICAubG9naW4tY2FyZCBkZWVzLWZvcm0gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5sb2dpbi1jYXJkIGRlZXMtaW5wdXQtdGV4dCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5sb2dpbi1jYXJkIGRlZXMtZm9ybS1zdWJtaXQgewogICAgICAgIG1hcmdpbi10b3A6IDhweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJsb2dpbkNvbnRhaW5lciI+CiAgICAgICAgPGRpdiBjbGFzcz0ibG9naW4iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibG9naW4taGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGVyIj5TaWduIGluPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1YmhlYWRlciI+RW50ZXIgeW91ciBjcmVkZW50aWFscyB0byBhY2Nlc3MgJHt0aGlzLm5hbWV9PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxvZ2luLWNhcmQiPgogICAgICAgICAgICA8ZGVlcy1mb3JtPgogICAgICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQga2V5PSJ1c2VybmFtZSIgbGFiZWw9IlVzZXJuYW1lIiByZXF1aXJlZD48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICAgICAgICA8ZGVlcy1pbnB1dC10ZXh0IGtleT0icGFzc3dvcmQiIGxhYmVsPSJQYXNzd29yZCIgaXNQYXNzd29yZEJvb2wgcmVxdWlyZWQ+PC9kZWVzLWlucHV0LXRleHQ+CiAgICAgICAgICAgICAgPGRlZXMtZm9ybS1zdWJtaXQ+U2lnbiBpbjwvZGVlcy1mb3JtLXN1Ym1pdD4KICAgICAgICAgICAgPC9kZWVzLWZvcm0+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InNsb3RDb250YWluZXIiPgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcykgewogICAgICBzdXBlci5maXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKTsKICAgICAgY29uc3QgZm9ybSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCJkZWVzLWZvcm0iKTsKICAgICAgaWYgKGZvcm0pIHsKICAgICAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoImZvcm1EYXRhIiwgKGV2ZW50KSA9PiB7CiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJsb2dpbiIsIHsKICAgICAgICAgICAgZGV0YWlsOiBldmVudC5kZXRhaWwsCiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgICB9KSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogYWxsb3dzIHN3aXRjaGluZyB0byBzbG90dGVkIGNvbnRlbnQKICAgICAqLwogICAgYXN5bmMgc3dpdGNoVG9TbG90dGVkQ29udGVudCgpIHsKICAgICAgY29uc3QgZG9tdG9vbHMgPSBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgY29uc3QgbG9naW5EaXYgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLmxvZ2luIik7CiAgICAgIGNvbnN0IGxvZ2luQ29udGFpbmVyRGl2ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5sb2dpbkNvbnRhaW5lciIpOwogICAgICBjb25zdCBzbG90Q29udGFpbmVyRGl2ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5zbG90Q29udGFpbmVyIik7CiAgICAgIGxvZ2luRGl2LnN0eWxlLm9wYWNpdHkgPSAiMCI7CiAgICAgIGxvZ2luRGl2LnN0eWxlLnRyYW5zZm9ybSA9ICJ0cmFuc2xhdGVZKDIwcHgpIjsKICAgICAgbG9naW5Db250YWluZXJEaXYuc3R5bGUucG9pbnRlckV2ZW50cyA9ICJub25lIjsKICAgICAgc2xvdENvbnRhaW5lckRpdi5zdHlsZS50cmFuc2Zvcm0gPSAidHJhbnNsYXRlWSgyMHB4KSI7CiAgICAgIGF3YWl0IGRvbXRvb2xzLmNvbnZlbmllbmNlLnNtYXJ0ZGVsYXkuZGVsYXlGb3IoMzAwKTsKICAgICAgc2xvdENvbnRhaW5lckRpdi5zdHlsZS5vcGFjaXR5ID0gIjEiOwogICAgICBzbG90Q29udGFpbmVyRGl2LnN0eWxlLnRyYW5zZm9ybSA9ICJ0cmFuc2xhdGVZKDBweCkiOwogICAgICBhd2FpdCBkb210b29scy5jb252ZW5pZW5jZS5zbWFydGRlbGF5LmRlbGF5Rm9yKDMwMCk7CiAgICAgIHNsb3RDb250YWluZXJEaXYuc3R5bGUucG9pbnRlckV2ZW50cyA9ICJhbGwiOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzOTEodGhpcywgX25hbWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM5MShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1NpbXBsZUxvZ2luMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtdXRpbGl0eS9kZWVzLWljb24vaW5kZXguanMKaW5pdF9kZWVzX2ljb24oKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC11dGlsaXR5L2RlZXMtc2VhcmNoYmFyL2RlZXMtc2VhcmNoYmFyLmRlbW8uanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIGRlbW9GdW5jNTQgPSAoKSA9PiB7CiAgY29uc3Qgb25DaGFuZ2VkID0gKGUxMSkgPT4gewogICAgY29uc3Qgd3JhcHBlciA9IGUxMS50YXJnZXQuY2xvc2VzdCgiLmRlbW9XcmFwcGVyIik7CiAgICBjb25zdCBlbCA9IHdyYXBwZXI/LnF1ZXJ5U2VsZWN0b3IoIiNjaGFuZ2VkIik7CiAgICBpZiAoZWwpCiAgICAgIGVsLnRleHRDb250ZW50ID0gYHNlYXJjaC1jaGFuZ2VkOiAke2UxMS5kZXRhaWwudmFsdWV9YDsKICB9OwogIGNvbnN0IG9uU3VibWl0ID0gKGUxMSkgPT4gewogICAgY29uc3Qgd3JhcHBlciA9IGUxMS50YXJnZXQuY2xvc2VzdCgiLmRlbW9XcmFwcGVyIik7CiAgICBjb25zdCBlbCA9IHdyYXBwZXI/LnF1ZXJ5U2VsZWN0b3IoIiNzdWJtaXR0ZWQiKTsKICAgIGlmIChlbCkKICAgICAgZWwudGV4dENvbnRlbnQgPSBgc2VhcmNoLXN1Ym1pdDogJHtlMTEuZGV0YWlsLnZhbHVlfWA7CiAgfTsKICByZXR1cm4gYjJgCiAgICA8c3R5bGU+CiAgICAgIC5kZW1vV3JhcHBlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIAogICAgICAgIGJhY2tncm91bmQ6ICM4ODg4ODg7CiAgICAgIH0KICAgICAgLmxvZ3MgewogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgd2lkdGg6IDYwMHB4OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgIH0KICAgICAgLmxvZ3MgZGl2IHsKICAgICAgICBtYXJnaW46IDRweCAwOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0iZGVtb1dyYXBwZXIiPgogICAgICA8ZGVlcy1zZWFyY2hiYXIKICAgICAgICBAc2VhcmNoLWNoYW5nZWQ9JHtvbkNoYW5nZWR9CiAgICAgICAgQHNlYXJjaC1zdWJtaXQ9JHtvblN1Ym1pdH0KICAgICAgPjwvZGVlcy1zZWFyY2hiYXI+CiAgICAgIDxkaXYgY2xhc3M9ImxvZ3MiPgogICAgICAgIDxkaXYgaWQ9ImNoYW5nZWQiPnNlYXJjaC1jaGFuZ2VkOjwvZGl2PgogICAgICAgIDxkaXYgaWQ9InN1Ym1pdHRlZCI+c2VhcmNoLXN1Ym1pdDo8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXV0aWxpdHkvZGVlcy1zZWFyY2hiYXIvZGVlcy1zZWFyY2hiYXIuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlOTEgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczkyID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzU2VhcmNoYmFyID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLXNlYXJjaGJhciIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX2ZpbHRlcnNfZGVjb3JhdG9yczsKICBsZXQgX2ZpbHRlcnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWx0ZXJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNTZWFyY2hiYXIyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfZmlsdGVyc19kZWNvcmF0b3JzID0gW241KCldOwogICAgICBfX2VzRGVjb3JhdGU5MSh0aGlzLCBudWxsLCBfZmlsdGVyc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJmaWx0ZXJzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJmaWx0ZXJzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmZpbHRlcnMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmZpbHRlcnMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZmlsdGVyc19pbml0aWFsaXplcnMsIF9maWx0ZXJzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTEobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzU2VhcmNoYmFyMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAvLyBERU1PCiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jNTQ7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiVXRpbGl0eSJdOwogICAgLy8gU1RBVElDCiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgLyogVE9ETzogTWlncmF0ZSBoYXJkY29kZWQgdmFsdWVzIHRvIC0tZGVlcy0qIENTUyB2YXJpYWJsZXMgKi8KICAgICAgOmhvc3QgewogICAgICAgIHBhZGRpbmc6IDQwcHg7CiAgICAgICAgZm9udC1mYW1pbHk6IERlZXMgU2FuczsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2VlZWVlYiIsICIjMDAwMDAwIil9OwogICAgICB9CgogICAgICAuc2VhcmNoYm94Q29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWFyZ2luOiBhdXRvOwogICAgICAgIG1heC13aWR0aDogODAwcHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAwMDAxNSIsICIjZmZmZmZmMTUiKX07CiAgICAgICAgLS1ib3hIZWlnaHQ6IDYwcHg7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1ib3hIZWlnaHQpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJveEhlaWdodCk7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxNDBweDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMDAwMDE1IiwgIiNmZmZmZmYyMCIpfTsKICAgICAgfQoKICAgICAgaW5wdXQgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMDAwMDAiLCAiI2VlZWVlYiIpfTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDI1cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAtOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICB9CgogICAgICAuc2VhcmNoQnV0dG9uIHsKICAgICAgICAtLWJ1dHRvblBhZGRpbmc6IDhweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2VlZWVlYiIsICIjMDAwMDAwIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzAwMDAwMCIsICIjZWVlZWViIil9OwogICAgICAgIGxpbmUtaGVpZ2h0OiBjYWxjKHZhcigtLWJveEhlaWdodCkgLSAodmFyKC0tYnV0dG9uUGFkZGluZykgKiAyKSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm94SGVpZ2h0KTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpIDsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiA1MCUgNTAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4xcywgYmFja2dyb3VuZCAwLjFzOwogICAgICAgIG1hcmdpbi1yaWdodDogdmFyKC0tYnV0dG9uUGFkZGluZyk7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5zZWFyY2hCdXR0b246aG92ZXIgewogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKGJyaWdodC5ibHVlLCBkYXJrLmJsdWUpfTsKICAgICAgfQoKICAgICAgLnNlYXJjaEJ1dHRvbjphY3RpdmUgewogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKGJyaWdodC5ibHVlQWN0aXZlLCBkYXJrLmJsdWVBY3RpdmUpfTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTgpOwogICAgICB9CgogICAgICAuZmlsdGVycyB7CiAgICAgICAgbWFyZ2luOiBhdXRvOwogICAgICAgIG1heC13aWR0aDogODAwcHg7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICAjZmlsdGVyc19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM5Mih0aGlzLCBfZmlsdGVyc19pbml0aWFsaXplcnMsIFtdKTsKICAgIC8vIElOU1RBTkNFCiAgICBnZXQgZmlsdGVycygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2ZpbHRlcnNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBmaWx0ZXJzKHZhbHVlMikgewogICAgICB0aGlzLiNmaWx0ZXJzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBzZWFyY2hJbnB1dCA9IF9fcnVuSW5pdGlhbGl6ZXJzOTIodGhpcywgX2ZpbHRlcnNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgc2VhcmNoQnV0dG9uOwogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICB9CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0ic2VhcmNoYm94Q29udGFpbmVyIj4KICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IllvdXIgU2tpbGxzIChlLmcuIFR5cGVTY3JpcHQsIFJ1c3QsIFByb2plY3RtYW5hZ2VtZW50KSIgLz4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWFyY2hCdXR0b24iPlNlYXJjaCAtPjwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgJHt0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCA/IGIyYAogICAgICAgIDxkaXYgY2xhc3M9ImZpbHRlcnMiPgogICAgICAgIDxkZWVzLWhlYWRpbmcgbGV2ZWw9ImhyLXNtYWxsIj5GaWx0ZXJzPC9kZWVzLWhlYWRpbmc+CiAgICAgICAgPGRlZXMtaW5wdXQtZHJvcGRvd24gLmxhYmVsPSR7ImxvY2F0aW9uIn0+PC9kZWVzLWlucHV0LWRyb3Bkb3duPgogICAgICA8L2Rpdj4gIAogICAgICBgIDogYjJgYH0KICAgIGA7CiAgICB9CiAgICAvKioKICAgICAqIExpZmVjeWNsZTogYWZ0ZXIgZmlyc3QgcmVuZGVyLCB3aXJlIHVwIGV2ZW50cyBmb3IgaW5wdXQgYW5kIHN1Ym1pdCBhY3Rpb25zCiAgICAgKi8KICAgIGZpcnN0VXBkYXRlZCgpIHsKICAgICAgdGhpcy5zZWFyY2hJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsICgpID0+IHsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJzZWFyY2gtY2hhbmdlZCIsIHsKICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSwKICAgICAgICAgIGRldGFpbDogeyB2YWx1ZTogdGhpcy5zZWFyY2hJbnB1dC52YWx1ZSB9CiAgICAgICAgfSkpOwogICAgICB9KTsKICAgICAgdGhpcy5zZWFyY2hJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgKGUxMSkgPT4gewogICAgICAgIGlmIChlMTEua2V5ID09PSAiRW50ZXIiKSB7CiAgICAgICAgICB0aGlzLl9kaXNwYXRjaFN1Ym1pdCgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMuc2VhcmNoQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gdGhpcy5fZGlzcGF0Y2hTdWJtaXQoKSk7CiAgICB9CiAgICAvKioKICAgICAqIERpc3BhdGNoIGEgc3VibWl0IGV2ZW50IHdpdGggdGhlIGN1cnJlbnQgc2VhcmNoIHZhbHVlCiAgICAgKi8KICAgIF9kaXNwYXRjaFN1Ym1pdCgpIHsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgic2VhcmNoLXN1Ym1pdCIsIHsKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlLAogICAgICAgIGRldGFpbDogeyB2YWx1ZTogdGhpcy5zZWFyY2hJbnB1dC52YWx1ZSB9CiAgICAgIH0pKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzOTIoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNTZWFyY2hiYXIyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC11dGlsaXR5L2RlZXMtdGhlbWUvZGVlcy10aGVtZS5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkZW1vRnVuYzU1ID0gKCkgPT4gYjJgCiAgPHN0eWxlPgogICAgLmRlbW8tY29udGFpbmVyIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgZ2FwOiAzMnB4OwogICAgICBwYWRkaW5nOiA0OHB4OwogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y4ZjlmYSIsICIjMGEwYTBhIil9OwogICAgICBtaW4taGVpZ2h0OiAxMDB2aDsKICAgIH0KCiAgICAuc2VjdGlvbiB7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMxODE4MWIiKX07CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZTVlN2ViIiwgIiMyNzI3MmEiKX07CiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgcGFkZGluZzogMjRweDsKICAgIH0KCiAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDkwOTBiIiwgIiNmYWZhZmEiKX07CiAgICB9CgogICAgLnNlY3Rpb24tZGVzY3JpcHRpb24gewogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OwogICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgfQoKICAgIC50b2tlbi1ncmlkIHsKICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMjAwcHgsIDFmcikpOwogICAgICBnYXA6IDE2cHg7CiAgICB9CgogICAgLnRva2VuLWl0ZW0gewogICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y0ZjRmNSIsICIjMjcyNzJhIil9OwogICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICB9CgogICAgLnRva2VuLW5hbWUgewogICAgICBmb250LWZhbWlseTogJ0ludGVsIE9uZSBNb25vJywgbW9ub3NwYWNlOwogICAgICBmb250LXNpemU6IDEycHg7CiAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzcxNzE3YSIsICIjYTFhMWFhIil9OwogICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICB9CgogICAgLnRva2VuLXZhbHVlIHsKICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICBmb250LXdlaWdodDogNTAwOwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTA5MGIiLCAiI2ZhZmFmYSIpfTsKICAgIH0KCiAgICAuc3BhY2luZy1kZW1vIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICBnYXA6IDhweDsKICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgfQoKICAgIC5zcGFjaW5nLWJveCB7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiMzYjgyZjYiKX07CiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIH0KCiAgICAucmFkaXVzLWRlbW8gewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBnYXA6IDE2cHg7CiAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIH0KCiAgICAucmFkaXVzLWJveCB7CiAgICAgIHdpZHRoOiA2MHB4OwogICAgICBoZWlnaHQ6IDYwcHg7CiAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjM2I4MmY2IiwgIiMzYjgyZjYiKX07CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICBjb2xvcjogd2hpdGU7CiAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIH0KCiAgICAuc2hhZG93LWRlbW8gewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBnYXA6IDI0cHg7CiAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIH0KCiAgICAuc2hhZG93LWJveCB7CiAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgaGVpZ2h0OiAxMDBweDsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzI3MjcyYSIpfTsKICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICBmb250LXdlaWdodDogNTAwOwogICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM3MTcxN2EiLCAiI2ExYTFhYSIpfTsKICAgIH0KCiAgICAuaGVpZ2h0LWRlbW8gewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBnYXA6IDE2cHg7CiAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgfQoKICAgIC5oZWlnaHQtYm94IHsKICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzNiODJmNiIpfTsKICAgICAgd2lkdGg6IDEyMHB4OwogICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICBjb2xvcjogd2hpdGU7CiAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIH0KICA8L3N0eWxlPgogIDxkaXYgY2xhc3M9ImRlbW8tY29udGFpbmVyIj4KICAgIDxkZWVzLXRoZW1lPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5TcGFjaW5nIFNjYWxlPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1kZXNjcmlwdGlvbiI+CiAgICAgICAgICBDU1MgdmFyaWFibGVzOiAtLWRlZXMtc3BhY2luZy14cyB0aHJvdWdoIC0tZGVlcy1zcGFjaW5nLTN4bAogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNwYWNpbmctZGVtbyI+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzcGFjaW5nLWJveCIgc3R5bGU9IndpZHRoOiB2YXIoLS1kZWVzLXNwYWNpbmcteHMpOyBoZWlnaHQ6IHZhcigtLWRlZXMtc3BhY2luZy14cyk7Ij48L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+eHMgKDRweCk8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3BhY2luZy1ib3giIHN0eWxlPSJ3aWR0aDogdmFyKC0tZGVlcy1zcGFjaW5nLXNtKTsgaGVpZ2h0OiB2YXIoLS1kZWVzLXNwYWNpbmctc20pOyI+PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLW5hbWUiPnNtICg4cHgpPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNwYWNpbmctYm94IiBzdHlsZT0id2lkdGg6IHZhcigtLWRlZXMtc3BhY2luZy1tZCk7IGhlaWdodDogdmFyKC0tZGVlcy1zcGFjaW5nLW1kKTsiPjwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj5tZCAoMTJweCk8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3BhY2luZy1ib3giIHN0eWxlPSJ3aWR0aDogdmFyKC0tZGVlcy1zcGFjaW5nLWxnKTsgaGVpZ2h0OiB2YXIoLS1kZWVzLXNwYWNpbmctbGcpOyI+PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLW5hbWUiPmxnICgxNnB4KTwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzcGFjaW5nLWJveCIgc3R5bGU9IndpZHRoOiB2YXIoLS1kZWVzLXNwYWNpbmcteGwpOyBoZWlnaHQ6IHZhcigtLWRlZXMtc3BhY2luZy14bCk7Ij48L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+eGwgKDI0cHgpPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNwYWNpbmctYm94IiBzdHlsZT0id2lkdGg6IHZhcigtLWRlZXMtc3BhY2luZy0yeGwpOyBoZWlnaHQ6IHZhcigtLWRlZXMtc3BhY2luZy0yeGwpOyI+PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLW5hbWUiPjJ4bCAoMzJweCk8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3BhY2luZy1ib3giIHN0eWxlPSJ3aWR0aDogdmFyKC0tZGVlcy1zcGFjaW5nLTN4bCk7IGhlaWdodDogdmFyKC0tZGVlcy1zcGFjaW5nLTN4bCk7Ij48L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+M3hsICg0OHB4KTwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+Qm9yZGVyIFJhZGl1cyBTY2FsZTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPgogICAgICAgICAgQ1NTIHZhcmlhYmxlczogLS1kZWVzLXJhZGl1cy14cyB0aHJvdWdoIC0tZGVlcy1yYWRpdXMtZnVsbAogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InJhZGl1cy1kZW1vIj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJhZGl1cy1ib3giIHN0eWxlPSJib3JkZXItcmFkaXVzOiB2YXIoLS1kZWVzLXJhZGl1cy14cyk7Ij54czwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj4ycHg8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icmFkaXVzLWJveCIgc3R5bGU9ImJvcmRlci1yYWRpdXM6IHZhcigtLWRlZXMtcmFkaXVzLXNtKTsiPnNtPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLW5hbWUiPjRweDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyYWRpdXMtYm94IiBzdHlsZT0iYm9yZGVyLXJhZGl1czogdmFyKC0tZGVlcy1yYWRpdXMtbWQpOyI+bWQ8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+NnB4PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJhZGl1cy1ib3giIHN0eWxlPSJib3JkZXItcmFkaXVzOiB2YXIoLS1kZWVzLXJhZGl1cy1sZyk7Ij5sZzwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj44cHg8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icmFkaXVzLWJveCIgc3R5bGU9ImJvcmRlci1yYWRpdXM6IHZhcigtLWRlZXMtcmFkaXVzLXhsKTsiPnhsPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLW5hbWUiPjEycHg8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icmFkaXVzLWJveCIgc3R5bGU9ImJvcmRlci1yYWRpdXM6IHZhcigtLWRlZXMtcmFkaXVzLWZ1bGwpOyI+ZnVsbDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj45OTlweDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+U2hhZG93IEVsZXZhdGlvbiBTY2FsZTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tZGVzY3JpcHRpb24iPgogICAgICAgICAgQ1NTIHZhcmlhYmxlczogLS1kZWVzLXNoYWRvdy14cyB0aHJvdWdoIC0tZGVlcy1zaGFkb3ctbGcKICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaGFkb3ctZGVtbyI+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaGFkb3ctYm94IiBzdHlsZT0iYm94LXNoYWRvdzogdmFyKC0tZGVlcy1zaGFkb3cteHMpOyI+eHM8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+bWluaW1hbDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaGFkb3ctYm94IiBzdHlsZT0iYm94LXNoYWRvdzogdmFyKC0tZGVlcy1zaGFkb3ctc20pOyI+c208L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+c3VidGxlPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvdy1ib3giIHN0eWxlPSJib3gtc2hhZG93OiB2YXIoLS1kZWVzLXNoYWRvdy1tZCk7Ij5tZDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj5tZWRpdW08L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2hhZG93LWJveCIgc3R5bGU9ImJveC1zaGFkb3c6IHZhcigtLWRlZXMtc2hhZG93LWxnKTsiPmxnPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLW5hbWUiPnByb21pbmVudDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+Q29udHJvbCBIZWlnaHQgU2NhbGU8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj4KICAgICAgICAgIENTUyB2YXJpYWJsZXM6IC0tZGVlcy1jb250cm9sLWhlaWdodC1zbSB0aHJvdWdoIC0tZGVlcy1jb250cm9sLWhlaWdodC14bAogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImhlaWdodC1kZW1vIj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlaWdodC1ib3giIHN0eWxlPSJoZWlnaHQ6IHZhcigtLWRlZXMtY29udHJvbC1oZWlnaHQtc20pOyI+c208L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+MzJweDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWlnaHQtYm94IiBzdHlsZT0iaGVpZ2h0OiB2YXIoLS1kZWVzLWNvbnRyb2wtaGVpZ2h0LW1kKTsiPm1kPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLW5hbWUiPjM2cHg8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVpZ2h0LWJveCIgc3R5bGU9ImhlaWdodDogdmFyKC0tZGVlcy1jb250cm9sLWhlaWdodC1sZyk7Ij5sZzwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj40MHB4PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlaWdodC1ib3giIHN0eWxlPSJoZWlnaHQ6IHZhcigtLWRlZXMtY29udHJvbC1oZWlnaHQteGwpOyI+eGw8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+NDhweDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+VHJhbnNpdGlvbiBEdXJhdGlvbnM8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWRlc2NyaXB0aW9uIj4KICAgICAgICAgIENTUyB2YXJpYWJsZXM6IC0tZGVlcy10cmFuc2l0aW9uLWZhc3QgdGhyb3VnaCAtLWRlZXMtdHJhbnNpdGlvbi1zbG93ZXIKICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1ncmlkIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLWl0ZW0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj4tLWRlZXMtdHJhbnNpdGlvbi1mYXN0PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLXZhbHVlIj4wLjFzPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLWl0ZW0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj4tLWRlZXMtdHJhbnNpdGlvbi1kZWZhdWx0PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLXZhbHVlIj4wLjE1czwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1pdGVtIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+LS1kZWVzLXRyYW5zaXRpb24tc2xvdzwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi12YWx1ZSI+MC4yczwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1pdGVtIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+LS1kZWVzLXRyYW5zaXRpb24tc2xvd2VyPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLXZhbHVlIj4wLjNzPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2RlZXMtdGhlbWU+CiAgPC9kaXY+CmA7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtdXRpbGl0eS9kZWVzLXRoZW1lL2RlZXMtdGhlbWUuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlOTIgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczkzID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzVGhlbWUgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtdGhlbWUiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9jdXN0b21TcGFjaW5nX2RlY29yYXRvcnM7CiAgbGV0IF9jdXN0b21TcGFjaW5nX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VzdG9tU3BhY2luZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VzdG9tUmFkaXVzX2RlY29yYXRvcnM7CiAgbGV0IF9jdXN0b21SYWRpdXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXN0b21SYWRpdXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2N1c3RvbVNoYWRvd3NfZGVjb3JhdG9yczsKICBsZXQgX2N1c3RvbVNoYWRvd3NfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXN0b21TaGFkb3dzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXN0b21UcmFuc2l0aW9uc19kZWNvcmF0b3JzOwogIGxldCBfY3VzdG9tVHJhbnNpdGlvbnNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXN0b21UcmFuc2l0aW9uc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VzdG9tQ29udHJvbEhlaWdodHNfZGVjb3JhdG9yczsKICBsZXQgX2N1c3RvbUNvbnRyb2xIZWlnaHRzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VzdG9tQ29udHJvbEhlaWdodHNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1RoZW1lMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2N1c3RvbVNwYWNpbmdfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF9jdXN0b21SYWRpdXNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF9jdXN0b21TaGFkb3dzX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBPYmplY3QgfSldOwogICAgICBfY3VzdG9tVHJhbnNpdGlvbnNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF9jdXN0b21Db250cm9sSGVpZ2h0c19kZWNvcmF0b3JzID0gW241KHsgdHlwZTogT2JqZWN0IH0pXTsKICAgICAgX19lc0RlY29yYXRlOTIodGhpcywgbnVsbCwgX2N1c3RvbVNwYWNpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY3VzdG9tU3BhY2luZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3VzdG9tU3BhY2luZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jdXN0b21TcGFjaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jdXN0b21TcGFjaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2N1c3RvbVNwYWNpbmdfaW5pdGlhbGl6ZXJzLCBfY3VzdG9tU3BhY2luZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTkyKHRoaXMsIG51bGwsIF9jdXN0b21SYWRpdXNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY3VzdG9tUmFkaXVzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjdXN0b21SYWRpdXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3VzdG9tUmFkaXVzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jdXN0b21SYWRpdXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY3VzdG9tUmFkaXVzX2luaXRpYWxpemVycywgX2N1c3RvbVJhZGl1c19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTkyKHRoaXMsIG51bGwsIF9jdXN0b21TaGFkb3dzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImN1c3RvbVNoYWRvd3MiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImN1c3RvbVNoYWRvd3MiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3VzdG9tU2hhZG93cywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY3VzdG9tU2hhZG93cyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jdXN0b21TaGFkb3dzX2luaXRpYWxpemVycywgX2N1c3RvbVNoYWRvd3NfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5Mih0aGlzLCBudWxsLCBfY3VzdG9tVHJhbnNpdGlvbnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY3VzdG9tVHJhbnNpdGlvbnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImN1c3RvbVRyYW5zaXRpb25zIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmN1c3RvbVRyYW5zaXRpb25zLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jdXN0b21UcmFuc2l0aW9ucyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9jdXN0b21UcmFuc2l0aW9uc19pbml0aWFsaXplcnMsIF9jdXN0b21UcmFuc2l0aW9uc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTkyKHRoaXMsIG51bGwsIF9jdXN0b21Db250cm9sSGVpZ2h0c19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjdXN0b21Db250cm9sSGVpZ2h0cyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3VzdG9tQ29udHJvbEhlaWdodHMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3VzdG9tQ29udHJvbEhlaWdodHMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmN1c3RvbUNvbnRyb2xIZWlnaHRzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2N1c3RvbUNvbnRyb2xIZWlnaHRzX2luaXRpYWxpemVycywgX2N1c3RvbUNvbnRyb2xIZWlnaHRzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTIobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzVGhlbWUyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gZGVtb0Z1bmM1NTsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJVdGlsaXR5Il07CiAgICAjY3VzdG9tU3BhY2luZ19hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM5Myh0aGlzLCBfY3VzdG9tU3BhY2luZ19pbml0aWFsaXplcnMsIG51bGwpOwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByb3BlcnRpZXMgZm9yIHRoZW1lIG92ZXJyaWRlcwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIGdldCBjdXN0b21TcGFjaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jY3VzdG9tU3BhY2luZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGN1c3RvbVNwYWNpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2N1c3RvbVNwYWNpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjdXN0b21SYWRpdXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczkzKHRoaXMsIF9jdXN0b21TcGFjaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5Myh0aGlzLCBfY3VzdG9tUmFkaXVzX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IGN1c3RvbVJhZGl1cygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2N1c3RvbVJhZGl1c19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGN1c3RvbVJhZGl1cyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY3VzdG9tUmFkaXVzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY3VzdG9tU2hhZG93c19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTModGhpcywgX2N1c3RvbVJhZGl1c19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTModGhpcywgX2N1c3RvbVNoYWRvd3NfaW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICBnZXQgY3VzdG9tU2hhZG93cygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2N1c3RvbVNoYWRvd3NfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjdXN0b21TaGFkb3dzKHZhbHVlMikgewogICAgICB0aGlzLiNjdXN0b21TaGFkb3dzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY3VzdG9tVHJhbnNpdGlvbnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczkzKHRoaXMsIF9jdXN0b21TaGFkb3dzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5Myh0aGlzLCBfY3VzdG9tVHJhbnNpdGlvbnNfaW5pdGlhbGl6ZXJzLCBudWxsKSk7CiAgICBnZXQgY3VzdG9tVHJhbnNpdGlvbnMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjdXN0b21UcmFuc2l0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGN1c3RvbVRyYW5zaXRpb25zKHZhbHVlMikgewogICAgICB0aGlzLiNjdXN0b21UcmFuc2l0aW9uc19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2N1c3RvbUNvbnRyb2xIZWlnaHRzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5Myh0aGlzLCBfY3VzdG9tVHJhbnNpdGlvbnNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczkzKHRoaXMsIF9jdXN0b21Db250cm9sSGVpZ2h0c19pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIGdldCBjdXN0b21Db250cm9sSGVpZ2h0cygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2N1c3RvbUNvbnRyb2xIZWlnaHRzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY3VzdG9tQ29udHJvbEhlaWdodHModmFsdWUyKSB7CiAgICAgIHRoaXMuI2N1c3RvbUNvbnRyb2xIZWlnaHRzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gU3R5bGVzCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBjb250ZW50czsKICAgICAgfQogICAgYAogICAgXTsKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBSZW5kZXIKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPHN0eWxlPgogICAgICAgICR7dGhpcy5nZW5lcmF0ZUN1c3RvbVN0eWxlcygpfQogICAgICA8L3N0eWxlPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICBgOwogICAgfQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByaXZhdGUgTWV0aG9kcwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIGdlbmVyYXRlQ3VzdG9tU3R5bGVzKCkgewogICAgICBjb25zdCBzdHlsZXMzID0gWyI6aG9zdCB7Il07CiAgICAgIGlmICh0aGlzLmN1c3RvbVNwYWNpbmcpIHsKICAgICAgICBmb3IgKGNvbnN0IFtrZXkyLCB2YWx1ZTJdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY3VzdG9tU3BhY2luZykpIHsKICAgICAgICAgIGlmICh2YWx1ZTIpIHsKICAgICAgICAgICAgc3R5bGVzMy5wdXNoKGAgIC0tZGVlcy1zcGFjaW5nLSR7a2V5Mn06ICR7dmFsdWUyfTtgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRoaXMuY3VzdG9tUmFkaXVzKSB7CiAgICAgICAgZm9yIChjb25zdCBba2V5MiwgdmFsdWUyXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmN1c3RvbVJhZGl1cykpIHsKICAgICAgICAgIGlmICh2YWx1ZTIpIHsKICAgICAgICAgICAgc3R5bGVzMy5wdXNoKGAgIC0tZGVlcy1yYWRpdXMtJHtrZXkyfTogJHt2YWx1ZTJ9O2ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodGhpcy5jdXN0b21TaGFkb3dzKSB7CiAgICAgICAgZm9yIChjb25zdCBba2V5MiwgdmFsdWUyXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmN1c3RvbVNoYWRvd3MpKSB7CiAgICAgICAgICBpZiAodmFsdWUyKSB7CiAgICAgICAgICAgIHN0eWxlczMucHVzaChgICAtLWRlZXMtc2hhZG93LSR7a2V5Mn06ICR7dmFsdWUyfTtgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRoaXMuY3VzdG9tVHJhbnNpdGlvbnMpIHsKICAgICAgICBmb3IgKGNvbnN0IFtrZXkyLCB2YWx1ZTJdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY3VzdG9tVHJhbnNpdGlvbnMpKSB7CiAgICAgICAgICBpZiAodmFsdWUyKSB7CiAgICAgICAgICAgIGNvbnN0IGNzc0tleSA9IGtleTIgPT09ICJkZWZhdWx0IiA/ICJkZWZhdWx0IiA6IGtleTI7CiAgICAgICAgICAgIHN0eWxlczMucHVzaChgICAtLWRlZXMtdHJhbnNpdGlvbi0ke2Nzc0tleX06ICR7dmFsdWUyfTtgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRoaXMuY3VzdG9tQ29udHJvbEhlaWdodHMpIHsKICAgICAgICBmb3IgKGNvbnN0IFtrZXkyLCB2YWx1ZTJdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY3VzdG9tQ29udHJvbEhlaWdodHMpKSB7CiAgICAgICAgICBpZiAodmFsdWUyKSB7CiAgICAgICAgICAgIHN0eWxlczMucHVzaChgICAtLWRlZXMtY29udHJvbC1oZWlnaHQtJHtrZXkyfTogJHt2YWx1ZTJ9O2ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBzdHlsZXMzLnB1c2goIn0iKTsKICAgICAgcmV0dXJuIHN0eWxlczMuam9pbigiXG4iKTsKICAgIH0KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQdWJsaWMgQVBJIE1ldGhvZHMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvKioKICAgICAqIFNldCBhIHNwYWNpbmcgdmFsdWUgZHluYW1pY2FsbHkKICAgICAqLwogICAgc2V0U3BhY2luZyhrZXkyLCB2YWx1ZTIpIHsKICAgICAgdGhpcy5jdXN0b21TcGFjaW5nID0geyAuLi50aGlzLmN1c3RvbVNwYWNpbmcsIFtrZXkyXTogdmFsdWUyIH07CiAgICB9CiAgICAvKioKICAgICAqIFNldCBhIHJhZGl1cyB2YWx1ZSBkeW5hbWljYWxseQogICAgICovCiAgICBzZXRSYWRpdXMoa2V5MiwgdmFsdWUyKSB7CiAgICAgIHRoaXMuY3VzdG9tUmFkaXVzID0geyAuLi50aGlzLmN1c3RvbVJhZGl1cywgW2tleTJdOiB2YWx1ZTIgfTsKICAgIH0KICAgIC8qKgogICAgICogU2V0IGEgc2hhZG93IHZhbHVlIGR5bmFtaWNhbGx5CiAgICAgKi8KICAgIHNldFNoYWRvdyhrZXkyLCB2YWx1ZTIpIHsKICAgICAgdGhpcy5jdXN0b21TaGFkb3dzID0geyAuLi50aGlzLmN1c3RvbVNoYWRvd3MsIFtrZXkyXTogdmFsdWUyIH07CiAgICB9CiAgICAvKioKICAgICAqIFNldCBhIHRyYW5zaXRpb24gdmFsdWUgZHluYW1pY2FsbHkKICAgICAqLwogICAgc2V0VHJhbnNpdGlvbihrZXkyLCB2YWx1ZTIpIHsKICAgICAgdGhpcy5jdXN0b21UcmFuc2l0aW9ucyA9IHsgLi4udGhpcy5jdXN0b21UcmFuc2l0aW9ucywgW2tleTJdOiB2YWx1ZTIgfTsKICAgIH0KICAgIC8qKgogICAgICogU2V0IGEgY29udHJvbCBoZWlnaHQgdmFsdWUgZHluYW1pY2FsbHkKICAgICAqLwogICAgc2V0Q29udHJvbEhlaWdodChrZXkyLCB2YWx1ZTIpIHsKICAgICAgdGhpcy5jdXN0b21Db250cm9sSGVpZ2h0cyA9IHsgLi4udGhpcy5jdXN0b21Db250cm9sSGVpZ2h0cywgW2tleTJdOiB2YWx1ZTIgfTsKICAgIH0KICAgIC8qKgogICAgICogR2V0IHRoZSBjdXJyZW50IHRoZW1lIGNvbmZpZ3VyYXRpb24gKGRlZmF1bHRzICsgb3ZlcnJpZGVzKQogICAgICovCiAgICBnZXRUaGVtZSgpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBjb2xvcnM6IHRoZW1lRGVmYXVsdHMuY29sb3JzLAogICAgICAgIHNwYWNpbmc6IHsgLi4udGhlbWVEZWZhdWx0cy5zcGFjaW5nLCAuLi50aGlzLmN1c3RvbVNwYWNpbmcgfSwKICAgICAgICByYWRpdXM6IHsgLi4udGhlbWVEZWZhdWx0cy5yYWRpdXMsIC4uLnRoaXMuY3VzdG9tUmFkaXVzIH0sCiAgICAgICAgc2hhZG93czogeyAuLi50aGVtZURlZmF1bHRzLnNoYWRvd3MsIC4uLnRoaXMuY3VzdG9tU2hhZG93cyB9LAogICAgICAgIHRyYW5zaXRpb25zOiB7IC4uLnRoZW1lRGVmYXVsdHMudHJhbnNpdGlvbnMsIC4uLnRoaXMuY3VzdG9tVHJhbnNpdGlvbnMgfSwKICAgICAgICBjb250cm9sSGVpZ2h0czogeyAuLi50aGVtZURlZmF1bHRzLmNvbnRyb2xIZWlnaHRzLCAuLi50aGlzLmN1c3RvbUNvbnRyb2xIZWlnaHRzIH0KICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogUmVzZXQgYWxsIGN1c3RvbSBvdmVycmlkZXMgdG8gZGVmYXVsdHMKICAgICAqLwogICAgcmVzZXRUb0RlZmF1bHRzKCkgewogICAgICB0aGlzLmN1c3RvbVNwYWNpbmcgPSBudWxsOwogICAgICB0aGlzLmN1c3RvbVJhZGl1cyA9IG51bGw7CiAgICAgIHRoaXMuY3VzdG9tU2hhZG93cyA9IG51bGw7CiAgICAgIHRoaXMuY3VzdG9tVHJhbnNpdGlvbnMgPSBudWxsOwogICAgICB0aGlzLmN1c3RvbUNvbnRyb2xIZWlnaHRzID0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQXBwbHkgYSBjb21wbGV0ZSB0aGVtZSBvYmplY3QKICAgICAqLwogICAgYXBwbHlUaGVtZSh0aGVtZSkgewogICAgICBpZiAodGhlbWUuc3BhY2luZykKICAgICAgICB0aGlzLmN1c3RvbVNwYWNpbmcgPSB0aGVtZS5zcGFjaW5nOwogICAgICBpZiAodGhlbWUucmFkaXVzKQogICAgICAgIHRoaXMuY3VzdG9tUmFkaXVzID0gdGhlbWUucmFkaXVzOwogICAgICBpZiAodGhlbWUuc2hhZG93cykKICAgICAgICB0aGlzLmN1c3RvbVNoYWRvd3MgPSB0aGVtZS5zaGFkb3dzOwogICAgICBpZiAodGhlbWUudHJhbnNpdGlvbnMpCiAgICAgICAgdGhpcy5jdXN0b21UcmFuc2l0aW9ucyA9IHRoZW1lLnRyYW5zaXRpb25zOwogICAgICBpZiAodGhlbWUuY29udHJvbEhlaWdodHMpCiAgICAgICAgdGhpcy5jdXN0b21Db250cm9sSGVpZ2h0cyA9IHRoZW1lLmNvbnRyb2xIZWlnaHRzOwogICAgfQogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzOTModGhpcywgX2N1c3RvbUNvbnRyb2xIZWlnaHRzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzOTMoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNUaGVtZTIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXV0aWxpdHkvZGVlcy11cGRhdGVyL2RlZXMtdXBkYXRlci5kZW1vLmpzCmluaXRfZGlzdF90czMwKCk7CnZhciBkZW1vRnVuYzU2ID0gYXN5bmMgKCkgPT4gewogIGNvbnN0IHVwZGF0ZXIgPSBhd2FpdCBEZWVzVXBkYXRlci5jcmVhdGVBbmRTaG93KCk7CiAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7CiAgICBhd2FpdCB1cGRhdGVyLmRlc3Ryb3koKTsKICB9LCAxZTQpOwp9OwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXV0aWxpdHkvZGVlcy11cGRhdGVyL2RlZXMtdXBkYXRlci5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2Rpc3RfdHMzMCgpOwppbml0X3RoZW1lKCk7CnZhciBfX2VzRGVjb3JhdGU5MyA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzOTQgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNVcGRhdGVyID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLXVwZGF0ZXIiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9jdXJyZW50VmVyc2lvbl9kZWNvcmF0b3JzOwogIGxldCBfY3VycmVudFZlcnNpb25faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50VmVyc2lvbl9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdXBkYXRlZFZlcnNpb25fZGVjb3JhdG9yczsKICBsZXQgX3VwZGF0ZWRWZXJzaW9uX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdXBkYXRlZFZlcnNpb25fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1VwZGF0ZXIyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfY3VycmVudFZlcnNpb25fZGVjb3JhdG9ycyA9IFtuNSh7CiAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgIH0pXTsKICAgICAgX3VwZGF0ZWRWZXJzaW9uX2RlY29yYXRvcnMgPSBbbjUoewogICAgICAgIHR5cGU6IFN0cmluZwogICAgICB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTkzKHRoaXMsIG51bGwsIF9jdXJyZW50VmVyc2lvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjdXJyZW50VmVyc2lvbiIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3VycmVudFZlcnNpb24iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3VycmVudFZlcnNpb24sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmN1cnJlbnRWZXJzaW9uID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2N1cnJlbnRWZXJzaW9uX2luaXRpYWxpemVycywgX2N1cnJlbnRWZXJzaW9uX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTModGhpcywgbnVsbCwgX3VwZGF0ZWRWZXJzaW9uX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInVwZGF0ZWRWZXJzaW9uIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJ1cGRhdGVkVmVyc2lvbiIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai51cGRhdGVkVmVyc2lvbiwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoudXBkYXRlZFZlcnNpb24gPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfdXBkYXRlZFZlcnNpb25faW5pdGlhbGl6ZXJzLCBfdXBkYXRlZFZlcnNpb25fZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5MyhudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNVcGRhdGVyMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9IGRlbW9GdW5jNTY7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiVXRpbGl0eSJdOwogICAgc3RhdGljIGFzeW5jIGNyZWF0ZUFuZFNob3coKSB7CiAgICAgIGNvbnN0IHVwZGF0ZXIgPSBuZXcgRGVlc1VwZGF0ZXIyKCk7CiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodXBkYXRlcik7CiAgICAgIHJldHVybiB1cGRhdGVyOwogICAgfQogICAgI2N1cnJlbnRWZXJzaW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczk0KHRoaXMsIF9jdXJyZW50VmVyc2lvbl9pbml0aWFsaXplcnMsIHZvaWQgMCk7CiAgICBnZXQgY3VycmVudFZlcnNpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLiNjdXJyZW50VmVyc2lvbl9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGN1cnJlbnRWZXJzaW9uKHZhbHVlMikgewogICAgICB0aGlzLiNjdXJyZW50VmVyc2lvbl9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3VwZGF0ZWRWZXJzaW9uX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5NCh0aGlzLCBfY3VycmVudFZlcnNpb25fZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk0KHRoaXMsIF91cGRhdGVkVmVyc2lvbl9pbml0aWFsaXplcnMsIHZvaWQgMCkpOwogICAgZ2V0IHVwZGF0ZWRWZXJzaW9uKCkgewogICAgICByZXR1cm4gdGhpcy4jdXBkYXRlZFZlcnNpb25fYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCB1cGRhdGVkVmVyc2lvbih2YWx1ZTIpIHsKICAgICAgdGhpcy4jdXBkYXRlZFZlcnNpb25fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICBfX3J1bkluaXRpYWxpemVyczk0KHRoaXMsIF91cGRhdGVkVmVyc2lvbl9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIGRpc3RfdHNfZXhwb3J0czI5LmVsZW1lbnRCYXNpYy5zZXR1cCgpOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIC8qIFRPRE86IE1pZ3JhdGUgaGFyZGNvZGVkIHZhbHVlcyB0byAtLWRlZXMtKiBDU1MgdmFyaWFibGVzICovCiAgICAgIC5tb2RhbENvbnRhaW5lciB7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlZWVlZWIiLCAiIzIyMiIpfTsKICAgICAgICBtYXgtd2lkdGg6IDgwMHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNlZWVlZWIiLCAiIzMzMyIpfTsKICAgICAgfQoKICAgICAgLmhlYWRpbmdDb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiA0MHB4IDQwcHg7CiAgICAgIH0KCiAgICAgIGgxIHsKICAgICAgICBtYXJnaW46IG5vbmU7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzMzMyIsICIjZmZmIil9OwogICAgICAgIG1hcmdpbi1sZWZ0OiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC5idXR0b25Db250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA1MCUgNTAlOwogICAgICB9CiAgICBgCiAgICBdOwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkZWVzLXdpbmRvd2xheWVyCiAgICAgICAgQGNsaWNrZWQ9IiR7dGhpcy53aW5kb3dMYXllckNsaWNrZWR9IgogICAgICAgIC5vcHRpb25zPSR7ewogICAgICAgIGJsdXI6IHRydWUKICAgICAgfX0KICAgICAgPgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsQ29udGFpbmVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmdDb250YWluZXIiPgogICAgICAgICAgICA8ZGVlcy1zcGlubmVyIC5zaXplPSR7NjB9PjwvZGVlcy1zcGlubmVyPgogICAgICAgICAgICA8aDE+VXBkYXRpbmcgdGhlIGFwcGxpY2F0aW9uLi4uPC9oMT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MiPgogICAgICAgICAgICA8ZGVlcy1wcm9ncmVzc2JhciAucHJvZ3Jlc3M9JHswLjV9PjwvZGVlcy1wcm9ncmVzc2Jhcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9uQ29udGFpbmVyIj4KICAgICAgICAgICAgPGRlZXMtYnV0dG9uPk1vcmUgaW5mbzwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDxkZWVzLWJ1dHRvbj5DaGFuZ2Vsb2c8L2RlZXMtYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+IDwvZGVlcy13aW5kb3dsYXllcgogICAgICA+PgogICAgYDsKICAgIH0KICAgIGFzeW5jIGRlc3Ryb3koKSB7CiAgICAgIHRoaXMucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzKTsKICAgIH0KICAgIHdpbmRvd0xheWVyQ2xpY2tlZCgpIHsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzOTQoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNVcGRhdGVyMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtd29ya3NwYWNlL2RlZXMtd29ya3NwYWNlLWZpbGV0cmVlL2RlZXMtd29ya3NwYWNlLWZpbGV0cmVlLmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfZGlzdF90czI5KCk7CmluaXRfdGhlbWUoKTsKaW5pdF9kZWVzX2ljb24oKTsKdmFyIF9fZXNEZWNvcmF0ZTk0ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM5NSA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1dvcmtzcGFjZUZpbGV0cmVlID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLXdvcmtzcGFjZS1maWxldHJlZSIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX2V4ZWN1dGlvbkVudmlyb25tZW50X2RlY29yYXRvcnM7CiAgbGV0IF9leGVjdXRpb25FbnZpcm9ubWVudF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2V4ZWN1dGlvbkVudmlyb25tZW50X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yb290UGF0aF9kZWNvcmF0b3JzOwogIGxldCBfcm9vdFBhdGhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9yb290UGF0aF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2VsZWN0ZWRQYXRoX2RlY29yYXRvcnM7CiAgbGV0IF9zZWxlY3RlZFBhdGhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zZWxlY3RlZFBhdGhfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RyZWVEYXRhX2RlY29yYXRvcnM7CiAgbGV0IF90cmVlRGF0YV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3RyZWVEYXRhX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0xvYWRpbmdfZGVjb3JhdG9yczsKICBsZXQgX2lzTG9hZGluZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzTG9hZGluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfZXJyb3JNZXNzYWdlX2RlY29yYXRvcnM7CiAgbGV0IF9lcnJvck1lc3NhZ2VfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9lcnJvck1lc3NhZ2VfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1dvcmtzcGFjZUZpbGV0cmVlMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2V4ZWN1dGlvbkVudmlyb25tZW50X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBPYmplY3QgfSldOwogICAgICBfcm9vdFBhdGhfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9zZWxlY3RlZFBhdGhfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF90cmVlRGF0YV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaXNMb2FkaW5nX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9lcnJvck1lc3NhZ2VfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlOTQodGhpcywgbnVsbCwgX2V4ZWN1dGlvbkVudmlyb25tZW50X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImV4ZWN1dGlvbkVudmlyb25tZW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJleGVjdXRpb25FbnZpcm9ubWVudCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5leGVjdXRpb25FbnZpcm9ubWVudCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouZXhlY3V0aW9uRW52aXJvbm1lbnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfZXhlY3V0aW9uRW52aXJvbm1lbnRfaW5pdGlhbGl6ZXJzLCBfZXhlY3V0aW9uRW52aXJvbm1lbnRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5NCh0aGlzLCBudWxsLCBfcm9vdFBhdGhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAicm9vdFBhdGgiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInJvb3RQYXRoIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnJvb3RQYXRoLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5yb290UGF0aCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9yb290UGF0aF9pbml0aWFsaXplcnMsIF9yb290UGF0aF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk0KHRoaXMsIG51bGwsIF9zZWxlY3RlZFBhdGhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2VsZWN0ZWRQYXRoIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJzZWxlY3RlZFBhdGgiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouc2VsZWN0ZWRQYXRoLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zZWxlY3RlZFBhdGggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfc2VsZWN0ZWRQYXRoX2luaXRpYWxpemVycywgX3NlbGVjdGVkUGF0aF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk0KHRoaXMsIG51bGwsIF90cmVlRGF0YV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0cmVlRGF0YSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidHJlZURhdGEiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudHJlZURhdGEsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnRyZWVEYXRhID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3RyZWVEYXRhX2luaXRpYWxpemVycywgX3RyZWVEYXRhX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTQodGhpcywgbnVsbCwgX2lzTG9hZGluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc0xvYWRpbmciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImlzTG9hZGluZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc0xvYWRpbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzTG9hZGluZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pc0xvYWRpbmdfaW5pdGlhbGl6ZXJzLCBfaXNMb2FkaW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTQodGhpcywgbnVsbCwgX2Vycm9yTWVzc2FnZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJlcnJvck1lc3NhZ2UiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImVycm9yTWVzc2FnZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5lcnJvck1lc3NhZ2UsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmVycm9yTWVzc2FnZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9lcnJvck1lc3NhZ2VfaW5pdGlhbGl6ZXJzLCBfZXJyb3JNZXNzYWdlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTQobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzV29ya3NwYWNlRmlsZXRyZWUyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIHN0YXRpYyBkZW1vID0gKCkgPT4gYjJgCiAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogMzAwcHg7IGhlaWdodDogNDAwcHg7IHBvc2l0aW9uOiByZWxhdGl2ZTsiPgogICAgICA8ZGVlcy13b3Jrc3BhY2UtZmlsZXRyZWU+PC9kZWVzLXdvcmtzcGFjZS1maWxldHJlZT4KICAgIDwvZGl2PgogIGA7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiV29ya3NwYWNlIl07CiAgICAjZXhlY3V0aW9uRW52aXJvbm1lbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzOTUodGhpcywgX2V4ZWN1dGlvbkVudmlyb25tZW50X2luaXRpYWxpemVycywgbnVsbCk7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IGV4ZWN1dGlvbkVudmlyb25tZW50KCkgewogICAgICByZXR1cm4gdGhpcy4jZXhlY3V0aW9uRW52aXJvbm1lbnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBleGVjdXRpb25FbnZpcm9ubWVudCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZXhlY3V0aW9uRW52aXJvbm1lbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNyb290UGF0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTUodGhpcywgX2V4ZWN1dGlvbkVudmlyb25tZW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5NSh0aGlzLCBfcm9vdFBhdGhfaW5pdGlhbGl6ZXJzLCAiLyIpKTsKICAgIGdldCByb290UGF0aCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Jvb3RQYXRoX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcm9vdFBhdGgodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Jvb3RQYXRoX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjc2VsZWN0ZWRQYXRoX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5NSh0aGlzLCBfcm9vdFBhdGhfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk1KHRoaXMsIF9zZWxlY3RlZFBhdGhfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IHNlbGVjdGVkUGF0aCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkUGF0aF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNlbGVjdGVkUGF0aCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jc2VsZWN0ZWRQYXRoX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdHJlZURhdGFfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk1KHRoaXMsIF9zZWxlY3RlZFBhdGhfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk1KHRoaXMsIF90cmVlRGF0YV9pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgdHJlZURhdGEoKSB7CiAgICAgIHJldHVybiB0aGlzLiN0cmVlRGF0YV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHRyZWVEYXRhKHZhbHVlMikgewogICAgICB0aGlzLiN0cmVlRGF0YV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzTG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTUodGhpcywgX3RyZWVEYXRhX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5NSh0aGlzLCBfaXNMb2FkaW5nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc0xvYWRpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc0xvYWRpbmdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc0xvYWRpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzTG9hZGluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2Vycm9yTWVzc2FnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTUodGhpcywgX2lzTG9hZGluZ19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTUodGhpcywgX2Vycm9yTWVzc2FnZV9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgZXJyb3JNZXNzYWdlKCkgewogICAgICByZXR1cm4gdGhpcy4jZXJyb3JNZXNzYWdlX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZXJyb3JNZXNzYWdlKHZhbHVlMikgewogICAgICB0aGlzLiNlcnJvck1lc3NhZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGV4cGFuZGVkUGF0aHMgPSAoX19ydW5Jbml0aWFsaXplcnM5NSh0aGlzLCBfZXJyb3JNZXNzYWdlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSk7CiAgICBsb2FkVHJlZVN0YXJ0ZWQgPSBmYWxzZTsKICAgIC8vIENsaXBib2FyZCBzdGF0ZSBmb3IgY29weS9wYXN0ZSBvcGVyYXRpb25zCiAgICBjbGlwYm9hcmRQYXRoID0gbnVsbDsKICAgIGNsaXBib2FyZE9wZXJhdGlvbiA9IG51bGw7CiAgICAvLyBGaWxlIHdhdGNoZXIgZm9yIGF1dG8tcmVmcmVzaAogICAgZmlsZVdhdGNoZXIgPSBudWxsOwogICAgcmVmcmVzaERlYm91bmNlVGltZW91dCA9IG51bGw7CiAgICBsYXN0RXhlY3V0aW9uRW52aXJvbm1lbnQgPSBudWxsOwogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5OCUpIiwgImhzbCgwIDAlIDklKSIpfTsKICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBSb2JvdG8sIHNhbnMtc2VyaWY7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICB9CgogICAgICAudHJlZS1jb250YWluZXIgewogICAgICAgIHBhZGRpbmc6IDhweCAwOwogICAgICB9CgogICAgICAudHJlZS1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgcGFkZGluZzogNHB4IDhweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIG1hcmdpbjogMXB4IDRweDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXMgZWFzZTsKICAgICAgfQoKICAgICAgLnRyZWUtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDkzJSkiLCAiaHNsKDAgMCUgMTQlKSIpfTsKICAgICAgfQoKICAgICAgLnRyZWUtaXRlbS5zZWxlY3RlZCB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgMTAwJSA5NSUpIiwgImhzbCgyMTAgNTAlIDIwJSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDEwMCUgNDAlKSIsICJoc2woMjEwIDEwMCUgNzAlKSIpfTsKICAgICAgfQoKICAgICAgLnRyZWUtaXRlbS5zZWxlY3RlZDpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgyMTAgMTAwJSA5MiUpIiwgImhzbCgyMTAgNTAlIDI1JSkiKX07CiAgICAgIH0KCiAgICAgIC5pbmRlbnQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLmV4cGFuZC1pY29uIHsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNTAlKSIsICJoc2woMCAwJSA2MCUpIil9OwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjE1cyBlYXNlOwogICAgICB9CgogICAgICAuZXhwYW5kLWljb24uZXhwYW5kZWQgewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgICAgfQoKICAgICAgLmV4cGFuZC1pY29uLmhpZGRlbiB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAuZmlsZS1pY29uIHsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA2cHg7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAuZmlsZS1pY29uIGRlZXMtaWNvbiB7CiAgICAgICAgd2lkdGg6IDE2cHg7CiAgICAgICAgaGVpZ2h0OiAxNnB4OwogICAgICB9CgogICAgICAuZmlsZS1pY29uLmZvbGRlciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woNDUgODAlIDQ1JSkiLCAiaHNsKDQ1IDcwJSA1NSUpIil9OwogICAgICB9CgogICAgICAuZmlsZS1pY29uLmZpbGUgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNTAlKSIsICJoc2woMCAwJSA2MCUpIil9OwogICAgICB9CgogICAgICAuZmlsZS1pY29uLnR5cGVzY3JpcHQgewogICAgICAgIGNvbG9yOiBoc2woMjExIDYwJSA0OCUpOwogICAgICB9CgogICAgICAuZmlsZS1pY29uLmphdmFzY3JpcHQgewogICAgICAgIGNvbG9yOiBoc2woNTMgOTMlIDU0JSk7CiAgICAgIH0KCiAgICAgIC5maWxlLWljb24uanNvbiB7CiAgICAgICAgY29sb3I6IGhzbCg0NSA4MCUgNTAlKTsKICAgICAgfQoKICAgICAgLmZpbGUtaWNvbi5odG1sIHsKICAgICAgICBjb2xvcjogaHNsKDE0IDc3JSA1MiUpOwogICAgICB9CgogICAgICAuZmlsZS1pY29uLmNzcyB7CiAgICAgICAgY29sb3I6IGhzbCgyMjggNzclIDU5JSk7CiAgICAgIH0KCiAgICAgIC5maWxlLWljb24ubWFya2Rvd24gewogICAgICAgIGNvbG9yOiBoc2woMCAwJSA1MCUpOwogICAgICB9CgogICAgICAuZmlsZS1uYW1lIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDIwJSkiLCAiaHNsKDAgMCUgODUlKSIpfTsKICAgICAgfQoKICAgICAgLmxvYWRpbmcgewogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNTAlKSIsICJoc2woMCAwJSA2MCUpIil9OwogICAgICB9CgogICAgICAuZXJyb3IgewogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGNvbG9yOiBoc2woMCA3MCUgNTAlKTsKICAgICAgfQoKICAgICAgLmVtcHR5IHsKICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDUwJSkiLCAiaHNsKDAgMCUgNjAlKSIpfTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KCiAgICAgIC5maWxldHJlZS10b29sYmFyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGhlaWdodDogMzZweDsKICAgICAgICBwYWRkaW5nOiAwIDEycHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4NSUpIiwgImhzbCgwIDAlIDE1JSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk2JSkiLCAiaHNsKDAgMCUgOCUpIil9OwogICAgICAgIHBvc2l0aW9uOiBzdGlja3k7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQwJSkiLCAiaHNsKDAgMCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItYWN0aW9ucyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDRweDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItYnV0dG9uIHsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cywgYmFja2dyb3VuZCAwLjE1czsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAzMCUpIiwgImhzbCgwIDAlIDcwJSkiKX07CiAgICAgIH0KCiAgICAgIC50b29sYmFyLWJ1dHRvbjpob3ZlciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMCUgLyAwLjA4KSIsICJoc2woMCAwJSAxMDAlIC8gMC4xKSIpfTsKICAgICAgfQogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KSB7CiAgICAgICAgcmV0dXJuIGIyYAogICAgICAgIDxkaXYgY2xhc3M9ImVtcHR5Ij4KICAgICAgICAgIE5vIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBwcm92aWRlZC4KICAgICAgICA8L2Rpdj4KICAgICAgYDsKICAgICAgfQogICAgICBpZiAodGhpcy5pc0xvYWRpbmcpIHsKICAgICAgICByZXR1cm4gYjJgCiAgICAgICAgPGRpdiBjbGFzcz0ibG9hZGluZyI+CiAgICAgICAgICBMb2FkaW5nIGZpbGVzLi4uCiAgICAgICAgPC9kaXY+CiAgICAgIGA7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuZXJyb3JNZXNzYWdlKSB7CiAgICAgICAgcmV0dXJuIGIyYAogICAgICAgIDxkaXYgY2xhc3M9ImVycm9yIj4KICAgICAgICAgICR7dGhpcy5lcnJvck1lc3NhZ2V9CiAgICAgICAgPC9kaXY+CiAgICAgIGA7CiAgICAgIH0KICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJmaWxldHJlZS10b29sYmFyIj4KICAgICAgICA8c3BhbiBjbGFzcz0idG9vbGJhci10aXRsZSI+RXhwbG9yZXI8L3NwYW4+CiAgICAgICAgPGRpdiBjbGFzcz0idG9vbGJhci1hY3Rpb25zIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItYnV0dG9uIiBAY2xpY2s9JHsoKSA9PiB0aGlzLmNyZWF0ZU5ld0ZpbGUoIi8iKX0gdGl0bGU9Ik5ldyBGaWxlIj4KICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6ZmlsZVBsdXMifSBpY29uU2l6ZT0iMTYiPjwvZGVlcy1pY29uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sYmFyLWJ1dHRvbiIgQGNsaWNrPSR7KCkgPT4gdGhpcy5jcmVhdGVOZXdGb2xkZXIoIi8iKX0gdGl0bGU9Ik5ldyBGb2xkZXIiPgogICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTpmb2xkZXJQbHVzIn0gaWNvblNpemU9IjE2Ij48L2RlZXMtaWNvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgJHt0aGlzLnRyZWVEYXRhLmxlbmd0aCA9PT0gMCA/IGIyYDxkaXYgY2xhc3M9ImVtcHR5Ij5ObyBmaWxlcyBmb3VuZC48L2Rpdj5gIDogYjJgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRyZWUtY29udGFpbmVyIiBAY29udGV4dG1lbnU9JHt0aGlzLmhhbmRsZUVtcHR5U3BhY2VDb250ZXh0TWVudX0+CiAgICAgICAgICAgICAgJHt0aGlzLnJlbmRlclRyZWUodGhpcy50cmVlRGF0YSl9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYH0KICAgIGA7CiAgICB9CiAgICByZW5kZXJUcmVlKG5vZGVzKSB7CiAgICAgIHJldHVybiBub2Rlcy5tYXAoKG5vZGUyKSA9PiB0aGlzLnJlbmRlck5vZGUobm9kZTIpKTsKICAgIH0KICAgIHJlbmRlck5vZGUobm9kZTIpIHsKICAgICAgY29uc3QgaXNEaXJlY3RvcnkgPSBub2RlMi50eXBlID09PSAiZGlyZWN0b3J5IjsKICAgICAgY29uc3QgaXNFeHBhbmRlZCA9IHRoaXMuZXhwYW5kZWRQYXRocy5oYXMobm9kZTIucGF0aCk7CiAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBub2RlMi5wYXRoID09PSB0aGlzLnNlbGVjdGVkUGF0aDsKICAgICAgY29uc3QgaWNvbkNsYXNzID0gdGhpcy5nZXRGaWxlSWNvbkNsYXNzKG5vZGUyKTsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2CiAgICAgICAgY2xhc3M9InRyZWUtaXRlbSAke2lzU2VsZWN0ZWQgPyAic2VsZWN0ZWQiIDogIiJ9IgogICAgICAgIHN0eWxlPSJwYWRkaW5nLWxlZnQ6ICR7OCArIG5vZGUyLmxldmVsICogMTZ9cHgiCiAgICAgICAgQGNsaWNrPSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVJdGVtQ2xpY2soZTExLCBub2RlMil9CiAgICAgICAgQGNvbnRleHRtZW51PSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVDb250ZXh0TWVudShlMTEsIG5vZGUyKX0KICAgICAgPgogICAgICAgIDxzcGFuIGNsYXNzPSJleHBhbmQtaWNvbiAke2lzRXhwYW5kZWQgPyAiZXhwYW5kZWQiIDogIiJ9ICR7IWlzRGlyZWN0b3J5ID8gImhpZGRlbiIgOiAiIn0iPgogICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6Y2hldnJvblJpZ2h0In0gaWNvblNpemU9IjEyIj48L2RlZXMtaWNvbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImZpbGUtaWNvbiAke2ljb25DbGFzc30iPgogICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0ke3RoaXMuZ2V0RmlsZUljb24obm9kZTIpfSBpY29uU2l6ZT0iMTYiPjwvZGVlcy1pY29uPgogICAgICAgIDwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iZmlsZS1uYW1lIj4ke25vZGUyLm5hbWV9PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgJHtpc0RpcmVjdG9yeSAmJiBpc0V4cGFuZGVkICYmIG5vZGUyLmNoaWxkcmVuID8gdGhpcy5yZW5kZXJUcmVlKG5vZGUyLmNoaWxkcmVuKSA6ICIifQogICAgYDsKICAgIH0KICAgIGdldEZpbGVJY29uKG5vZGUyKSB7CiAgICAgIGlmIChub2RlMi50eXBlID09PSAiZGlyZWN0b3J5IikgewogICAgICAgIHJldHVybiB0aGlzLmV4cGFuZGVkUGF0aHMuaGFzKG5vZGUyLnBhdGgpID8gImx1Y2lkZTpmb2xkZXJPcGVuIiA6ICJsdWNpZGU6Zm9sZGVyIjsKICAgICAgfQogICAgICBjb25zdCBleHQgPSBub2RlMi5uYW1lLnNwbGl0KCIuIikucG9wKCk/LnRvTG93ZXJDYXNlKCk7CiAgICAgIHN3aXRjaCAoZXh0KSB7CiAgICAgICAgY2FzZSAidHMiOgogICAgICAgIGNhc2UgInRzeCI6CiAgICAgICAgICByZXR1cm4gImx1Y2lkZTpmaWxlQ29kZSI7CiAgICAgICAgY2FzZSAianMiOgogICAgICAgIGNhc2UgImpzeCI6CiAgICAgICAgICByZXR1cm4gImx1Y2lkZTpmaWxlQ29kZSI7CiAgICAgICAgY2FzZSAianNvbiI6CiAgICAgICAgICByZXR1cm4gImx1Y2lkZTpmaWxlSnNvbiI7CiAgICAgICAgY2FzZSAiaHRtbCI6CiAgICAgICAgICByZXR1cm4gImx1Y2lkZTpmaWxlQ29kZSI7CiAgICAgICAgY2FzZSAiY3NzIjoKICAgICAgICBjYXNlICJzY3NzIjoKICAgICAgICBjYXNlICJsZXNzIjoKICAgICAgICAgIHJldHVybiAibHVjaWRlOmZpbGVDb2RlIjsKICAgICAgICBjYXNlICJtZCI6CiAgICAgICAgICByZXR1cm4gImx1Y2lkZTpmaWxlVGV4dCI7CiAgICAgICAgY2FzZSAicG5nIjoKICAgICAgICBjYXNlICJqcGciOgogICAgICAgIGNhc2UgImpwZWciOgogICAgICAgIGNhc2UgImdpZiI6CiAgICAgICAgY2FzZSAic3ZnIjoKICAgICAgICAgIHJldHVybiAibHVjaWRlOmltYWdlIjsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuICJsdWNpZGU6ZmlsZSI7CiAgICAgIH0KICAgIH0KICAgIGdldEZpbGVJY29uQ2xhc3Mobm9kZTIpIHsKICAgICAgaWYgKG5vZGUyLnR5cGUgPT09ICJkaXJlY3RvcnkiKQogICAgICAgIHJldHVybiAiZm9sZGVyIjsKICAgICAgY29uc3QgZXh0ID0gbm9kZTIubmFtZS5zcGxpdCgiLiIpLnBvcCgpPy50b0xvd2VyQ2FzZSgpOwogICAgICBzd2l0Y2ggKGV4dCkgewogICAgICAgIGNhc2UgInRzIjoKICAgICAgICBjYXNlICJ0c3giOgogICAgICAgICAgcmV0dXJuICJ0eXBlc2NyaXB0IjsKICAgICAgICBjYXNlICJqcyI6CiAgICAgICAgY2FzZSAianN4IjoKICAgICAgICAgIHJldHVybiAiamF2YXNjcmlwdCI7CiAgICAgICAgY2FzZSAianNvbiI6CiAgICAgICAgICByZXR1cm4gImpzb24iOwogICAgICAgIGNhc2UgImh0bWwiOgogICAgICAgICAgcmV0dXJuICJodG1sIjsKICAgICAgICBjYXNlICJjc3MiOgogICAgICAgIGNhc2UgInNjc3MiOgogICAgICAgIGNhc2UgImxlc3MiOgogICAgICAgICAgcmV0dXJuICJjc3MiOwogICAgICAgIGNhc2UgIm1kIjoKICAgICAgICAgIHJldHVybiAibWFya2Rvd24iOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gImZpbGUiOwogICAgICB9CiAgICB9CiAgICBhc3luYyBoYW5kbGVJdGVtQ2xpY2soZTExLCBub2RlMikgewogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIGlmIChub2RlMi50eXBlID09PSAiZGlyZWN0b3J5IikgewogICAgICAgIGF3YWl0IHRoaXMudG9nZ2xlRGlyZWN0b3J5KG5vZGUyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnNlbGVjdGVkUGF0aCA9IG5vZGUyLnBhdGg7CiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiZmlsZS1zZWxlY3QiLCB7CiAgICAgICAgICBkZXRhaWw6IHsgcGF0aDogbm9kZTIucGF0aCwgbmFtZTogbm9kZTIubmFtZSB9LAogICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgfSkpOwogICAgICB9CiAgICB9CiAgICBhc3luYyB0b2dnbGVEaXJlY3Rvcnkobm9kZTIpIHsKICAgICAgaWYgKHRoaXMuZXhwYW5kZWRQYXRocy5oYXMobm9kZTIucGF0aCkpIHsKICAgICAgICB0aGlzLmV4cGFuZGVkUGF0aHMuZGVsZXRlKG5vZGUyLnBhdGgpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuZXhwYW5kZWRQYXRocy5hZGQobm9kZTIucGF0aCk7CiAgICAgICAgaWYgKCFub2RlMi5jaGlsZHJlbiB8fCBub2RlMi5jaGlsZHJlbi5sZW5ndGggPT09IDApIHsKICAgICAgICAgIGF3YWl0IHRoaXMubG9hZERpcmVjdG9yeUNvbnRlbnRzKG5vZGUyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7CiAgICB9CiAgICBhc3luYyBsb2FkRGlyZWN0b3J5Q29udGVudHMobm9kZTIpIHsKICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICAgIHJldHVybjsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5yZWFkRGlyKG5vZGUyLnBhdGgpOwogICAgICAgIG5vZGUyLmNoaWxkcmVuID0gdGhpcy5zb3J0RW50cmllcyhlbnRyaWVzKS5tYXAoKGVudHJ5KSA9PiAoewogICAgICAgICAgLi4uZW50cnksCiAgICAgICAgICBsZXZlbDogbm9kZTIubGV2ZWwgKyAxLAogICAgICAgICAgZXhwYW5kZWQ6IGZhbHNlLAogICAgICAgICAgY2hpbGRyZW46IGVudHJ5LnR5cGUgPT09ICJkaXJlY3RvcnkiID8gW10gOiB2b2lkIDAKICAgICAgICB9KSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGxvYWQgZGlyZWN0b3J5ICR7bm9kZTIucGF0aH06YCwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBoYW5kbGVDb250ZXh0TWVudShlMTEsIG5vZGUyKSB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlMTEuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIGNvbnN0IG1lbnVJdGVtcyA9IFtdOwogICAgICBpZiAobm9kZTIudHlwZSA9PT0gImRpcmVjdG9yeSIpIHsKICAgICAgICBtZW51SXRlbXMucHVzaCh7CiAgICAgICAgICBuYW1lOiAiTmV3IEZpbGUiLAogICAgICAgICAgaWNvbk5hbWU6ICJmaWxlUGx1cyIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMuY3JlYXRlTmV3RmlsZShub2RlMi5wYXRoKQogICAgICAgIH0sIHsKICAgICAgICAgIG5hbWU6ICJOZXcgRm9sZGVyIiwKICAgICAgICAgIGljb25OYW1lOiAiZm9sZGVyUGx1cyIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMuY3JlYXRlTmV3Rm9sZGVyKG5vZGUyLnBhdGgpCiAgICAgICAgfSwgeyBkaXZpZGVyOiB0cnVlIH0pOwogICAgICB9CiAgICAgIG1lbnVJdGVtcy5wdXNoKHsKICAgICAgICBuYW1lOiAiUmVuYW1lIiwKICAgICAgICBpY29uTmFtZTogInBlbmNpbCIsCiAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB0aGlzLnJlbmFtZUl0ZW0obm9kZTIpCiAgICAgIH0sIHsKICAgICAgICBuYW1lOiAiRHVwbGljYXRlIiwKICAgICAgICBpY29uTmFtZTogImZpbGVzIiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMuZHVwbGljYXRlSXRlbShub2RlMikKICAgICAgfSwgewogICAgICAgIG5hbWU6ICJDb3B5IiwKICAgICAgICBpY29uTmFtZTogImNvcHkiLAogICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gdGhpcy5jb3B5SXRlbShub2RlMikKICAgICAgfSk7CiAgICAgIGlmIChub2RlMi50eXBlID09PSAiZGlyZWN0b3J5IiAmJiB0aGlzLmNsaXBib2FyZFBhdGgpIHsKICAgICAgICBtZW51SXRlbXMucHVzaCh7CiAgICAgICAgICBuYW1lOiAiUGFzdGUiLAogICAgICAgICAgaWNvbk5hbWU6ICJjbGlwYm9hcmQiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB0aGlzLnBhc3RlSXRlbShub2RlMi5wYXRoKQogICAgICAgIH0pOwogICAgICB9CiAgICAgIG1lbnVJdGVtcy5wdXNoKHsgZGl2aWRlcjogdHJ1ZSB9LCB7CiAgICAgICAgbmFtZTogIkRlbGV0ZSIsCiAgICAgICAgaWNvbk5hbWU6ICJ0cmFzaDIiLAogICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gdGhpcy5kZWxldGVJdGVtKG5vZGUyKQogICAgICB9KTsKICAgICAgYXdhaXQgRGVlc0NvbnRleHRtZW51Lm9wZW5Db250ZXh0TWVudVdpdGhPcHRpb25zKGUxMSwgbWVudUl0ZW1zKTsKICAgIH0KICAgIGFzeW5jIGhhbmRsZUVtcHR5U3BhY2VDb250ZXh0TWVudShlMTEpIHsKICAgICAgY29uc3QgdGFyZ2V0ID0gZTExLnRhcmdldDsKICAgICAgaWYgKHRhcmdldC5jbG9zZXN0KCIudHJlZS1pdGVtIikpCiAgICAgICAgcmV0dXJuOwogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBjb25zdCBtZW51SXRlbXMgPSBbCiAgICAgICAgewogICAgICAgICAgbmFtZTogIk5ldyBGaWxlIiwKICAgICAgICAgIGljb25OYW1lOiAiZmlsZVBsdXMiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB0aGlzLmNyZWF0ZU5ld0ZpbGUoIi8iKQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIk5ldyBGb2xkZXIiLAogICAgICAgICAgaWNvbk5hbWU6ICJmb2xkZXJQbHVzIiwKICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gdGhpcy5jcmVhdGVOZXdGb2xkZXIoIi8iKQogICAgICAgIH0KICAgICAgXTsKICAgICAgaWYgKHRoaXMuY2xpcGJvYXJkUGF0aCkgewogICAgICAgIG1lbnVJdGVtcy5wdXNoKHsgZGl2aWRlcjogdHJ1ZSB9LCB7CiAgICAgICAgICBuYW1lOiAiUGFzdGUiLAogICAgICAgICAgaWNvbk5hbWU6ICJjbGlwYm9hcmQiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB0aGlzLnBhc3RlSXRlbSgiLyIpCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgYXdhaXQgRGVlc0NvbnRleHRtZW51Lm9wZW5Db250ZXh0TWVudVdpdGhPcHRpb25zKGUxMSwgbWVudUl0ZW1zKTsKICAgIH0KICAgIGFzeW5jIHNob3dJbnB1dE1vZGFsKG9wdGlvbnMpIHsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlMikgPT4gewogICAgICAgIGNvbnN0IG1vZGFsID0gYXdhaXQgRGVlc01vZGFsLmNyZWF0ZUFuZFNob3coewogICAgICAgICAgaGVhZGluZzogb3B0aW9ucy5oZWFkaW5nLAogICAgICAgICAgd2lkdGg6ICJzbWFsbCIsCiAgICAgICAgICBjb250ZW50OiBiMmAKICAgICAgICAgIDxkZWVzLWlucHV0LXRleHQKICAgICAgICAgICAgLmxhYmVsPSR7b3B0aW9ucy5sYWJlbH0KICAgICAgICAgICAgLnZhbHVlPSR7b3B0aW9ucy52YWx1ZSB8fCAiIn0KICAgICAgICAgID48L2RlZXMtaW5wdXQtdGV4dD4KICAgICAgICBgLAogICAgICAgICAgbWVudU9wdGlvbnM6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgIG5hbWU6ICJDYW5jZWwiLAogICAgICAgICAgICAgIGFjdGlvbjogYXN5bmMgKG1vZGFsUmVmKSA9PiB7CiAgICAgICAgICAgICAgICBhd2FpdCBtb2RhbFJlZi5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICByZXNvbHZlMihudWxsKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zLmJ1dHRvbk5hbWUgfHwgIkNyZWF0ZSIsCiAgICAgICAgICAgICAgYWN0aW9uOiBhc3luYyAobW9kYWxSZWYpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRFbDIgPSBtb2RhbFJlZi5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIubW9kYWwgLmNvbnRlbnQiKTsKICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0RWxlbWVudCA9IGNvbnRlbnRFbDI/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtdGV4dCIpOwogICAgICAgICAgICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IGlucHV0RWxlbWVudD8udmFsdWU/LnRyaW0oKSB8fCAiIjsKICAgICAgICAgICAgICAgIGF3YWl0IG1vZGFsUmVmLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgIHJlc29sdmUyKGlucHV0VmFsdWUgfHwgbnVsbCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICBdCiAgICAgICAgfSk7CiAgICAgICAgYXdhaXQgbW9kYWwudXBkYXRlQ29tcGxldGU7CiAgICAgICAgY29uc3QgY29udGVudEVsID0gbW9kYWwuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLm1vZGFsIC5jb250ZW50Iik7CiAgICAgICAgaWYgKGNvbnRlbnRFbCkgewogICAgICAgICAgY29uc3QgaW5wdXRFbGVtZW50ID0gY29udGVudEVsLnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtdGV4dCIpOwogICAgICAgICAgaWYgKGlucHV0RWxlbWVudCkgewogICAgICAgICAgICBhd2FpdCBpbnB1dEVsZW1lbnQudXBkYXRlQ29tcGxldGU7CiAgICAgICAgICAgIGlucHV0RWxlbWVudC5mb2N1cygpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBhc3luYyBjcmVhdGVOZXdGaWxlKHBhcmVudFBhdGgpIHsKICAgICAgY29uc3QgZmlsZU5hbWUgPSBhd2FpdCB0aGlzLnNob3dJbnB1dE1vZGFsKHsKICAgICAgICBoZWFkaW5nOiAiTmV3IEZpbGUiLAogICAgICAgIGxhYmVsOiAiRmlsZSBuYW1lIgogICAgICB9KTsKICAgICAgaWYgKCFmaWxlTmFtZSB8fCAhdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IG5ld1BhdGggPSBwYXJlbnRQYXRoID09PSAiLyIgPyBgLyR7ZmlsZU5hbWV9YCA6IGAke3BhcmVudFBhdGh9LyR7ZmlsZU5hbWV9YDsKICAgICAgdHJ5IHsKICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LndyaXRlRmlsZShuZXdQYXRoLCAiIik7CiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7CiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiZmlsZS1jcmVhdGVkIiwgewogICAgICAgICAgZGV0YWlsOiB7IHBhdGg6IG5ld1BhdGggfSwKICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgIH0pKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGZpbGU6IiwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBjcmVhdGVOZXdGb2xkZXIocGFyZW50UGF0aCkgewogICAgICBjb25zdCBmb2xkZXJOYW1lID0gYXdhaXQgdGhpcy5zaG93SW5wdXRNb2RhbCh7CiAgICAgICAgaGVhZGluZzogIk5ldyBGb2xkZXIiLAogICAgICAgIGxhYmVsOiAiRm9sZGVyIG5hbWUiCiAgICAgIH0pOwogICAgICBpZiAoIWZvbGRlck5hbWUgfHwgIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBuZXdQYXRoID0gcGFyZW50UGF0aCA9PT0gIi8iID8gYC8ke2ZvbGRlck5hbWV9YCA6IGAke3BhcmVudFBhdGh9LyR7Zm9sZGVyTmFtZX1gOwogICAgICB0cnkgewogICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQubWtkaXIobmV3UGF0aCk7CiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7CiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiZm9sZGVyLWNyZWF0ZWQiLCB7CiAgICAgICAgICBkZXRhaWw6IHsgcGF0aDogbmV3UGF0aCB9LAogICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgfSkpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgZm9sZGVyOiIsIGVycm9yKTsKICAgICAgfQogICAgfQogICAgYXN5bmMgZGVsZXRlSXRlbShub2RlMikgewogICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBjb25maXJtZWQgPSBjb25maXJtKGBEZWxldGUgJHtub2RlMi5uYW1lfT9gKTsKICAgICAgaWYgKCFjb25maXJtZWQpCiAgICAgICAgcmV0dXJuOwogICAgICB0cnkgewogICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucm0obm9kZTIucGF0aCwgeyByZWN1cnNpdmU6IG5vZGUyLnR5cGUgPT09ICJkaXJlY3RvcnkiIH0pOwogICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpOwogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIml0ZW0tZGVsZXRlZCIsIHsKICAgICAgICAgIGRldGFpbDogeyBwYXRoOiBub2RlMi5wYXRoLCB0eXBlOiBub2RlMi50eXBlIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGRlbGV0ZSBpdGVtOiIsIGVycm9yKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZW5hbWUgYSBmaWxlIG9yIGZvbGRlcgogICAgICovCiAgICBhc3luYyByZW5hbWVJdGVtKG5vZGUyKSB7CiAgICAgIGlmICghdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IG5ld05hbWUgPSBhd2FpdCB0aGlzLnNob3dJbnB1dE1vZGFsKHsKICAgICAgICBoZWFkaW5nOiAiUmVuYW1lIiwKICAgICAgICBsYWJlbDogIk5ldyBuYW1lIiwKICAgICAgICB2YWx1ZTogbm9kZTIubmFtZSwKICAgICAgICBidXR0b25OYW1lOiAiUmVuYW1lIgogICAgICB9KTsKICAgICAgaWYgKCFuZXdOYW1lIHx8IG5ld05hbWUgPT09IG5vZGUyLm5hbWUpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBwYXJlbnRQYXRoID0gbm9kZTIucGF0aC5zdWJzdHJpbmcoMCwgbm9kZTIucGF0aC5sYXN0SW5kZXhPZigiLyIpKSB8fCAiLyI7CiAgICAgIGNvbnN0IG5ld1BhdGggPSBwYXJlbnRQYXRoID09PSAiLyIgPyBgLyR7bmV3TmFtZX1gIDogYCR7cGFyZW50UGF0aH0vJHtuZXdOYW1lfWA7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKG5vZGUyLnR5cGUgPT09ICJmaWxlIikgewogICAgICAgICAgY29uc3QgY29udGVudDMgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnJlYWRGaWxlKG5vZGUyLnBhdGgpOwogICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC53cml0ZUZpbGUobmV3UGF0aCwgY29udGVudDMpOwogICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5ybShub2RlMi5wYXRoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXdhaXQgdGhpcy5jb3B5RGlyZWN0b3J5Q29udGVudHMobm9kZTIucGF0aCwgbmV3UGF0aCk7CiAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnJtKG5vZGUyLnBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pOwogICAgICAgIH0KICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJpdGVtLXJlbmFtZWQiLCB7CiAgICAgICAgICBkZXRhaWw6IHsgb2xkUGF0aDogbm9kZTIucGF0aCwgbmV3UGF0aCwgdHlwZTogbm9kZTIudHlwZSB9LAogICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgfSkpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byByZW5hbWUgaXRlbToiLCBlcnJvcik7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRHVwbGljYXRlIGEgZmlsZSBvciBmb2xkZXIKICAgICAqLwogICAgYXN5bmMgZHVwbGljYXRlSXRlbShub2RlMikgewogICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBwYXJlbnRQYXRoID0gbm9kZTIucGF0aC5zdWJzdHJpbmcoMCwgbm9kZTIucGF0aC5sYXN0SW5kZXhPZigiLyIpKSB8fCAiLyI7CiAgICAgIGxldCBuZXdOYW1lOwogICAgICBpZiAobm9kZTIudHlwZSA9PT0gImZpbGUiKSB7CiAgICAgICAgY29uc3QgbGFzdERvdCA9IG5vZGUyLm5hbWUubGFzdEluZGV4T2YoIi4iKTsKICAgICAgICBpZiAobGFzdERvdCA+IDApIHsKICAgICAgICAgIGNvbnN0IGJhc2VOYW1lID0gbm9kZTIubmFtZS5zdWJzdHJpbmcoMCwgbGFzdERvdCk7CiAgICAgICAgICBjb25zdCBleHQgPSBub2RlMi5uYW1lLnN1YnN0cmluZyhsYXN0RG90KTsKICAgICAgICAgIG5ld05hbWUgPSBgJHtiYXNlTmFtZX1fY29weSR7ZXh0fWA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5ld05hbWUgPSBgJHtub2RlMi5uYW1lfV9jb3B5YDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmV3TmFtZSA9IGAke25vZGUyLm5hbWV9X2NvcHlgOwogICAgICB9CiAgICAgIGNvbnN0IG5ld1BhdGggPSBwYXJlbnRQYXRoID09PSAiLyIgPyBgLyR7bmV3TmFtZX1gIDogYCR7cGFyZW50UGF0aH0vJHtuZXdOYW1lfWA7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKG5vZGUyLnR5cGUgPT09ICJmaWxlIikgewogICAgICAgICAgY29uc3QgY29udGVudDMgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnJlYWRGaWxlKG5vZGUyLnBhdGgpOwogICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC53cml0ZUZpbGUobmV3UGF0aCwgY29udGVudDMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlEaXJlY3RvcnlDb250ZW50cyhub2RlMi5wYXRoLCBuZXdQYXRoKTsKICAgICAgICB9CiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7CiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiaXRlbS1kdXBsaWNhdGVkIiwgewogICAgICAgICAgZGV0YWlsOiB7IHNvdXJjZVBhdGg6IG5vZGUyLnBhdGgsIG5ld1BhdGgsIHR5cGU6IG5vZGUyLnR5cGUgfSwKICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgIH0pKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gZHVwbGljYXRlIGl0ZW06IiwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENvcHkgaXRlbSBwYXRoIHRvIGNsaXBib2FyZAogICAgICovCiAgICBhc3luYyBjb3B5SXRlbShub2RlMikgewogICAgICB0aGlzLmNsaXBib2FyZFBhdGggPSBub2RlMi5wYXRoOwogICAgICB0aGlzLmNsaXBib2FyZE9wZXJhdGlvbiA9ICJjb3B5IjsKICAgIH0KICAgIC8qKgogICAgICogUGFzdGUgY29waWVkIGl0ZW0gdG8gdGFyZ2V0IGRpcmVjdG9yeQogICAgICovCiAgICBhc3luYyBwYXN0ZUl0ZW0odGFyZ2V0UGF0aCkgewogICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQgfHwgIXRoaXMuY2xpcGJvYXJkUGF0aCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmNsaXBib2FyZFBhdGguc3BsaXQoIi8iKS5wb3AoKSB8fCAicGFzdGVkIjsKICAgICAgY29uc3QgbmV3UGF0aCA9IHRhcmdldFBhdGggPT09ICIvIiA/IGAvJHtuYW1lfWAgOiBgJHt0YXJnZXRQYXRofS8ke25hbWV9YDsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoIWF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQuZXhpc3RzKHRoaXMuY2xpcGJvYXJkUGF0aCkpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlNvdXJjZSBmaWxlIG5vIGxvbmdlciBleGlzdHMiKTsKICAgICAgICAgIHRoaXMuY2xpcGJvYXJkUGF0aCA9IG51bGw7CiAgICAgICAgICB0aGlzLmNsaXBib2FyZE9wZXJhdGlvbiA9IG51bGw7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBjb250ZW50MyA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZEZpbGUodGhpcy5jbGlwYm9hcmRQYXRoKTsKICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQud3JpdGVGaWxlKG5ld1BhdGgsIGNvbnRlbnQzKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIGF3YWl0IHRoaXMuY29weURpcmVjdG9yeUNvbnRlbnRzKHRoaXMuY2xpcGJvYXJkUGF0aCwgbmV3UGF0aCk7CiAgICAgICAgfQogICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpOwogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIml0ZW0tcGFzdGVkIiwgewogICAgICAgICAgZGV0YWlsOiB7IHNvdXJjZVBhdGg6IHRoaXMuY2xpcGJvYXJkUGF0aCwgdGFyZ2V0UGF0aDogbmV3UGF0aCB9LAogICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgfSkpOwogICAgICAgIHRoaXMuY2xpcGJvYXJkUGF0aCA9IG51bGw7CiAgICAgICAgdGhpcy5jbGlwYm9hcmRPcGVyYXRpb24gPSBudWxsOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBwYXN0ZSBpdGVtOiIsIGVycm9yKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZWN1cnNpdmVseSBjb3B5IGRpcmVjdG9yeSBjb250ZW50cyB0byBhIG5ldyBwYXRoCiAgICAgKi8KICAgIGFzeW5jIGNvcHlEaXJlY3RvcnlDb250ZW50cyhzb3VyY2VQYXRoLCBkZXN0UGF0aCkgewogICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpCiAgICAgICAgcmV0dXJuOwogICAgICBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50Lm1rZGlyKGRlc3RQYXRoKTsKICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZERpcihzb3VyY2VQYXRoKTsKICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7CiAgICAgICAgY29uc3Qgc3JjRW50cnlQYXRoID0gc291cmNlUGF0aCA9PT0gIi8iID8gYC8ke2VudHJ5Lm5hbWV9YCA6IGAke3NvdXJjZVBhdGh9LyR7ZW50cnkubmFtZX1gOwogICAgICAgIGNvbnN0IGRlc3RFbnRyeVBhdGggPSBkZXN0UGF0aCA9PT0gIi8iID8gYC8ke2VudHJ5Lm5hbWV9YCA6IGAke2Rlc3RQYXRofS8ke2VudHJ5Lm5hbWV9YDsKICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gImRpcmVjdG9yeSIpIHsKICAgICAgICAgIGF3YWl0IHRoaXMuY29weURpcmVjdG9yeUNvbnRlbnRzKHNyY0VudHJ5UGF0aCwgZGVzdEVudHJ5UGF0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGNvbnRlbnQzID0gYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5yZWFkRmlsZShzcmNFbnRyeVBhdGgpOwogICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC53cml0ZUZpbGUoZGVzdEVudHJ5UGF0aCwgY29udGVudDMpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKCkgewogICAgICBhd2FpdCB0aGlzLmxvYWRUcmVlKCk7CiAgICB9CiAgICBhc3luYyB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoImV4ZWN1dGlvbkVudmlyb25tZW50IikpIHsKICAgICAgICBpZiAodGhpcy5sYXN0RXhlY3V0aW9uRW52aXJvbm1lbnQgIT09IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKICAgICAgICAgIHRoaXMuc3RvcEZpbGVXYXRjaGVyKCk7CiAgICAgICAgICB0aGlzLmxhc3RFeGVjdXRpb25FbnZpcm9ubWVudCA9IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQ7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KSB7CiAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRUcmVlKCk7CiAgICAgICAgICB0aGlzLnN0YXJ0RmlsZVdhdGNoZXIoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLnN0b3BGaWxlV2F0Y2hlcigpOwogICAgICBpZiAodGhpcy5yZWZyZXNoRGVib3VuY2VUaW1lb3V0KSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVmcmVzaERlYm91bmNlVGltZW91dCk7CiAgICAgICAgdGhpcy5yZWZyZXNoRGVib3VuY2VUaW1lb3V0ID0gbnVsbDsKICAgICAgfQogICAgfQogICAgc3RhcnRGaWxlV2F0Y2hlcigpIHsKICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50IHx8IHRoaXMuZmlsZVdhdGNoZXIpCiAgICAgICAgcmV0dXJuOwogICAgICB0cnkgewogICAgICAgIHRoaXMuZmlsZVdhdGNoZXIgPSB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LndhdGNoKCIvIiwgKF9ldmVudCwgX2ZpbGVuYW1lKSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5yZWZyZXNoRGVib3VuY2VUaW1lb3V0KSB7CiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlZnJlc2hEZWJvdW5jZVRpbWVvdXQpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5yZWZyZXNoRGVib3VuY2VUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpOwogICAgICAgICAgfSwgMzAwKTsKICAgICAgICB9LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLndhcm4oIkZpbGUgd2F0Y2hpbmcgbm90IHN1cHBvcnRlZDoiLCBlcnJvcik7CiAgICAgIH0KICAgIH0KICAgIHN0b3BGaWxlV2F0Y2hlcigpIHsKICAgICAgaWYgKHRoaXMuZmlsZVdhdGNoZXIpIHsKICAgICAgICB0aGlzLmZpbGVXYXRjaGVyLnN0b3AoKTsKICAgICAgICB0aGlzLmZpbGVXYXRjaGVyID0gbnVsbDsKICAgICAgfQogICAgfQogICAgYXN5bmMgbG9hZFRyZWUoKSB7CiAgICAgIGlmICghdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCkKICAgICAgICByZXR1cm47CiAgICAgIGlmICh0aGlzLmxvYWRUcmVlU3RhcnRlZCkKICAgICAgICByZXR1cm47CiAgICAgIHRoaXMubG9hZFRyZWVTdGFydGVkID0gdHJ1ZTsKICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlOwogICAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICIiOwogICAgICB0cnkgewogICAgICAgIGlmICghdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5yZWFkeSkgewogICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5pbml0KCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnJlYWREaXIodGhpcy5yb290UGF0aCk7CiAgICAgICAgdGhpcy50cmVlRGF0YSA9IHRoaXMuc29ydEVudHJpZXMoZW50cmllcykubWFwKChlbnRyeSkgPT4gKHsKICAgICAgICAgIC4uLmVudHJ5LAogICAgICAgICAgbGV2ZWw6IDAsCiAgICAgICAgICBleHBhbmRlZDogZmFsc2UsCiAgICAgICAgICBjaGlsZHJlbjogZW50cnkudHlwZSA9PT0gImRpcmVjdG9yeSIgPyBbXSA6IHZvaWQgMAogICAgICAgIH0pKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGBGYWlsZWQgdG8gbG9hZCBmaWxlczogJHtlcnJvcn1gOwogICAgICAgIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBsb2FkIGZpbGUgdHJlZToiLCBlcnJvcik7CiAgICAgICAgdGhpcy5sb2FkVHJlZVN0YXJ0ZWQgPSBmYWxzZTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBzb3J0RW50cmllcyhlbnRyaWVzKSB7CiAgICAgIHJldHVybiBlbnRyaWVzLnNvcnQoKGE1LCBiNikgPT4gewogICAgICAgIGlmIChhNS50eXBlICE9PSBiNi50eXBlKSB7CiAgICAgICAgICByZXR1cm4gYTUudHlwZSA9PT0gImRpcmVjdG9yeSIgPyAtMSA6IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhNS5uYW1lLmxvY2FsZUNvbXBhcmUoYjYubmFtZSk7CiAgICAgIH0pOwogICAgfQogICAgYXN5bmMgcmVmcmVzaCgpIHsKICAgICAgdGhpcy5leHBhbmRlZFBhdGhzLmNsZWFyKCk7CiAgICAgIHRoaXMubG9hZFRyZWVTdGFydGVkID0gZmFsc2U7CiAgICAgIGF3YWl0IHRoaXMubG9hZFRyZWUoKTsKICAgIH0KICAgIHNlbGVjdEZpbGUocGF0aDIpIHsKICAgICAgdGhpcy5zZWxlY3RlZFBhdGggPSBwYXRoMjsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzOTUoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNXb3Jrc3BhY2VGaWxldHJlZTIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXdvcmtzcGFjZS9kZWVzLXdvcmtzcGFjZS10ZXJtaW5hbC1wcmV2aWV3L2RlZXMtd29ya3NwYWNlLXRlcm1pbmFsLXByZXZpZXcuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF90aGVtZSgpOwppbml0X3NlcnZpY2VzKCk7CnZhciBfX2VzRGVjb3JhdGU5NSA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzOTYgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNXb3Jrc3BhY2VUZXJtaW5hbFByZXZpZXcgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtd29ya3NwYWNlLXRlcm1pbmFsLXByZXZpZXciKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgbGV0IF9jb21tYW5kX2RlY29yYXRvcnM7CiAgbGV0IF9jb21tYW5kX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY29tbWFuZF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGluZXNfZGVjb3JhdG9yczsKICBsZXQgX2xpbmVzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbGluZXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICB2YXIgRGVlc1dvcmtzcGFjZVRlcm1pbmFsUHJldmlldzIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9jb21tYW5kX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfbGluZXNfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IEFycmF5IH0pXTsKICAgICAgX19lc0RlY29yYXRlOTUodGhpcywgbnVsbCwgX2NvbW1hbmRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiY29tbWFuZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY29tbWFuZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jb21tYW5kLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5jb21tYW5kID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2NvbW1hbmRfaW5pdGlhbGl6ZXJzLCBfY29tbWFuZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk1KHRoaXMsIG51bGwsIF9saW5lc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJsaW5lcyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAibGluZXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubGluZXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmxpbmVzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2xpbmVzX2luaXRpYWxpemVycywgX2xpbmVzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTUobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzV29ya3NwYWNlVGVybWluYWxQcmV2aWV3MiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9ICgpID0+IGIyYAogICAgPGRlZXMtd29ya3NwYWNlLXRlcm1pbmFsLXByZXZpZXcKICAgICAgLmNvbW1hbmQ9JHsicG5wbSBpbnN0YWxsIn0KICAgICAgLmxpbmVzPSR7WwogICAgICAiUGFja2FnZXM6ICs0MiIsCiAgICAgICJQcm9ncmVzczogcmVzb2x2ZWQgMTQyLCByZXVzZWQgMTQwLCBkb3dubG9hZGVkIDIsIGFkZGVkIDQyLCBkb25lIiwKICAgICAgIiIsCiAgICAgICJkZXBlbmRlbmNpZXM6IiwKICAgICAgIisgQHB1c2gucm9ja3Mvc21hcnRwcm9taXNlIDQuMi4zIiwKICAgICAgIisgdHlwZXNjcmlwdCA1LjMuMyIsCiAgICAgICIiLAogICAgICAiRG9uZSBpbiAyLjNzIgogICAgXX0KICAgID48L2RlZXMtd29ya3NwYWNlLXRlcm1pbmFsLXByZXZpZXc+CiAgYDsKICAgIHN0YXRpYyBkZW1vR3JvdXBzID0gWyJXb3Jrc3BhY2UiXTsKICAgICNjb21tYW5kX2FjY2Vzc29yX3N0b3JhZ2UgPSBfX3J1bkluaXRpYWxpemVyczk2KHRoaXMsIF9jb21tYW5kX2luaXRpYWxpemVycywgIiIpOwogICAgLyoqCiAgICAgKiBUaGUgY29tbWFuZCBiZWluZyBkaXNwbGF5ZWQgKHNob3duIGluIGhlYWRlcikKICAgICAqLwogICAgZ2V0IGNvbW1hbmQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNjb21tYW5kX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY29tbWFuZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY29tbWFuZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2xpbmVzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5Nih0aGlzLCBfY29tbWFuZF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTYodGhpcywgX2xpbmVzX2luaXRpYWxpemVycywgW10pKTsKICAgIC8qKgogICAgICogT3V0cHV0IGxpbmVzIHRvIGRpc3BsYXkKICAgICAqLwogICAgZ2V0IGxpbmVzKCkgewogICAgICByZXR1cm4gdGhpcy4jbGluZXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsaW5lcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbGluZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHRlcm1pbmFsID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTYodGhpcywgX2xpbmVzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgbnVsbCk7CiAgICBmaXRBZGRvbiA9IG51bGw7CiAgICBsYXN0TGluZUNvdW50ID0gMDsKICAgIHJlc2l6ZU9ic2VydmVyID0gbnVsbDsKICAgIHRlcm1pbmFsVGhlbWVTdWJzY3JpcHRpb24gPSBudWxsOwogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDIwMHB4OwogICAgICB9CgogICAgICAudGVybWluYWwtcHJldmlldyB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMwMDAwMDAiKX07CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg1JSkiLCAiaHNsKDAgMCUgMjAlKSIpfTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KCiAgICAgIC50ZXJtaW5hbC1oZWFkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTYlKSIsICJoc2woMCAwJSAxMCUpIil9OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LWZhbWlseTogJ1NGIE1vbm8nLCAnTW9uYWNvJywgJ0luY29uc29sYXRhJywgJ0ZpcmEgQ29kZScsIG1vbm9zcGFjZTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQwJSkiLCAiaHNsKDAgMCUgNjAlKSIpfTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg1JSkiLCAiaHNsKDAgMCUgMjAlKSIpfTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLnRlcm1pbmFsLWhlYWRlci1pY29uIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDUwJSkiLCAiaHNsKDAgMCUgNTAlKSIpfTsKICAgICAgfQoKICAgICAgLnRlcm1pbmFsLWhlYWRlci1jb21tYW5kIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDIwJSkiLCAiaHNsKDAgMCUgODAlKSIpfTsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICB9CgogICAgICAudGVybWluYWwtY29udGFpbmVyIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgIH0KCiAgICAgICN4dGVybS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDhweDsKICAgICAgICBsZWZ0OiA4cHg7CiAgICAgICAgcmlnaHQ6IDhweDsKICAgICAgICBib3R0b206IDhweDsKICAgICAgfQoKICAgICAgLyogeHRlcm0uanMgc3R5bGVzICovCiAgICAgIC54dGVybSB7CiAgICAgICAgZm9udC1mZWF0dXJlLXNldHRpbmdzOiAnbGlnYScgMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIC54dGVybS5mb2N1cywKICAgICAgLnh0ZXJtOmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICAueHRlcm0gLnh0ZXJtLWhlbHBlcnMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgfQoKICAgICAgLnh0ZXJtIC54dGVybS1oZWxwZXItdGV4dGFyZWEgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBsZWZ0OiAtOTk5OWVtOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWR0aDogMDsKICAgICAgICBoZWlnaHQ6IDA7CiAgICAgICAgei1pbmRleDogLTU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgfQoKICAgICAgLnh0ZXJtIC5jb21wb3NpdGlvbi12aWV3IHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjMDAwMDAwIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzMzMzMzMyIsICIjZmZmZmZmIil9OwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQoKICAgICAgLnh0ZXJtIC5jb21wb3NpdGlvbi12aWV3LmFjdGl2ZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC54dGVybSAueHRlcm0tdmlld3BvcnQgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMwMDAwMDAiKX07CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICB9CgogICAgICAueHRlcm0gLnh0ZXJtLXNjcmVlbiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAueHRlcm0gLnh0ZXJtLXNjcmVlbiBjYW52YXMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLnh0ZXJtIC54dGVybS1zY3JvbGwtYXJlYSB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAueHRlcm0tY2hhci1tZWFzdXJlLWVsZW1lbnQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAtOTk5OWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC54dGVybSB7CiAgICAgICAgY3Vyc29yOiB0ZXh0OwogICAgICB9CgogICAgICAueHRlcm0uZW5hYmxlLW1vdXNlLWV2ZW50cyB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICAueHRlcm0ueHRlcm0tY3Vyc29yLXBvaW50ZXIgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgLnh0ZXJtLmNvbHVtbi1zZWxlY3QuZm9jdXMgewogICAgICAgIGN1cnNvcjogY3Jvc3NoYWlyOwogICAgICB9CgogICAgICAueHRlcm0gLnh0ZXJtLWFjY2Vzc2liaWxpdHksCiAgICAgIC54dGVybSAueHRlcm0tbWVzc2FnZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgICBjb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIC54dGVybSAubGl2ZS1yZWdpb24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAtOTk5OXB4OwogICAgICAgIHdpZHRoOiAxcHg7CiAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnh0ZXJtLWRpbSB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAueHRlcm0tdW5kZXJsaW5lIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQoKICAgICAgLyogQ3VzdG9tIHNjcm9sbGJhciBmb3IgeHRlcm0gdmlld3BvcnQgKi8KICAgICAgLnh0ZXJtIC54dGVybS12aWV3cG9ydDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIHdpZHRoOiA4cHg7CiAgICAgIH0KCiAgICAgIC54dGVybSAueHRlcm0tdmlld3BvcnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTYlKSIsICJoc2woMCAwJSA4JSkiKX07CiAgICAgIH0KCiAgICAgIC54dGVybSAueHRlcm0tdmlld3BvcnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODAlKSIsICJoc2woMCAwJSAyNSUpIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgfQoKICAgICAgLnh0ZXJtIC54dGVybS12aWV3cG9ydDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA3MCUpIiwgImhzbCgwIDAlIDM1JSkiKX07CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0idGVybWluYWwtcHJldmlldyI+CiAgICAgICAgPGRpdiBjbGFzcz0idGVybWluYWwtaGVhZGVyIj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXJtaW5hbC1oZWFkZXItaWNvbiI+JDwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXJtaW5hbC1oZWFkZXItY29tbWFuZCI+JHt0aGlzLmNvbW1hbmQgfHwgIldhaXRpbmcuLi4ifTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXJtaW5hbC1jb250YWluZXIiPgogICAgICAgICAgPGRpdiBpZD0ieHRlcm0tY29udGFpbmVyIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGVybWluYWwgdGhlbWUgY29sb3JzIGJhc2VkIG9uIGJyaWdodC9kYXJrIG1vZGUKICAgICAqLwogICAgZ2V0VGVybWluYWxUaGVtZShpc0JyaWdodCkgewogICAgICByZXR1cm4gaXNCcmlnaHQgPyB7CiAgICAgICAgYmFja2dyb3VuZDogIiNmZmZmZmYiLAogICAgICAgIGZvcmVncm91bmQ6ICIjMzMzMzMzIiwKICAgICAgICBjdXJzb3I6ICIjMzMzMzMzIiwKICAgICAgICBjdXJzb3JBY2NlbnQ6ICIjZmZmZmZmIiwKICAgICAgICBzZWxlY3Rpb25CYWNrZ3JvdW5kOiAicmdiYSgwLCAwLCAwLCAwLjIpIgogICAgICB9IDogewogICAgICAgIGJhY2tncm91bmQ6ICIjMDAwMDAwIiwKICAgICAgICBmb3JlZ3JvdW5kOiAiI2NjY2NjYyIsCiAgICAgICAgY3Vyc29yOiAiI2NjY2NjYyIsCiAgICAgICAgY3Vyc29yQWNjZW50OiAiIzAwMDAwMCIsCiAgICAgICAgc2VsZWN0aW9uQmFja2dyb3VuZDogInJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSIKICAgICAgfTsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpIHsKICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7CiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQoInh0ZXJtLWNvbnRhaW5lciIpOwogICAgICBpZiAoIWNvbnRhaW5lcikKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGRvbXRvb2xzSW5zdGFuY2UgPSBhd2FpdCB0aGlzLmRvbXRvb2xzUHJvbWlzZTsKICAgICAgY29uc3QgaXNCcmlnaHQgPSBkb210b29sc0luc3RhbmNlLnRoZW1lTWFuYWdlci5nb0JyaWdodEJvb2xlYW47CiAgICAgIGNvbnN0IGxpYkxvYWRlciA9IERlZXNTZXJ2aWNlTGliTG9hZGVyLmdldEluc3RhbmNlKCk7CiAgICAgIGNvbnN0IFt4dGVybUJ1bmRsZSwgZml0QWRkb25CdW5kbGVdID0gYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgICAgIGxpYkxvYWRlci5sb2FkWHRlcm0oKSwKICAgICAgICBsaWJMb2FkZXIubG9hZFh0ZXJtRml0QWRkb24oKQogICAgICBdKTsKICAgICAgdGhpcy50ZXJtaW5hbCA9IG5ldyB4dGVybUJ1bmRsZS5UZXJtaW5hbCh7CiAgICAgICAgY29udmVydEVvbDogdHJ1ZSwKICAgICAgICBjdXJzb3JCbGluazogZmFsc2UsCiAgICAgICAgZGlzYWJsZVN0ZGluOiB0cnVlLAogICAgICAgIGZvbnRTaXplOiAxMiwKICAgICAgICBmb250RmFtaWx5OiAiJ1NGIE1vbm8nLCAnTW9uYWNvJywgJ0luY29uc29sYXRhJywgJ0ZpcmEgQ29kZScsIG1vbm9zcGFjZSIsCiAgICAgICAgdGhlbWU6IHRoaXMuZ2V0VGVybWluYWxUaGVtZShpc0JyaWdodCksCiAgICAgICAgc2Nyb2xsYmFjazogMWUzCiAgICAgIH0pOwogICAgICB0aGlzLnRlcm1pbmFsVGhlbWVTdWJzY3JpcHRpb24gPSBkb210b29sc0luc3RhbmNlLnRoZW1lTWFuYWdlci50aGVtZU9ic2VydmFibGUuc3Vic2NyaWJlKChnb0JyaWdodCkgPT4gewogICAgICAgIGlmICh0aGlzLnRlcm1pbmFsKSB7CiAgICAgICAgICB0aGlzLnRlcm1pbmFsLm9wdGlvbnMudGhlbWUgPSB0aGlzLmdldFRlcm1pbmFsVGhlbWUoZ29CcmlnaHQpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMuZml0QWRkb24gPSBuZXcgZml0QWRkb25CdW5kbGUuRml0QWRkb24oKTsKICAgICAgdGhpcy50ZXJtaW5hbC5sb2FkQWRkb24odGhpcy5maXRBZGRvbik7CiAgICAgIHRoaXMudGVybWluYWwub3Blbihjb250YWluZXIpOwogICAgICB0aGlzLmZpdEFkZG9uLmZpdCgpOwogICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHsKICAgICAgICBpZiAodGhpcy5maXRBZGRvbikgewogICAgICAgICAgdGhpcy5maXRBZGRvbi5maXQoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyKTsKICAgICAgdGhpcy53cml0ZU5ld0xpbmVzKCk7CiAgICB9CiAgICBhc3luYyB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIHN1cGVyLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJsaW5lcyIpKSB7CiAgICAgICAgdGhpcy53cml0ZU5ld0xpbmVzKCk7CiAgICAgIH0KICAgIH0KICAgIHdyaXRlTmV3TGluZXMoKSB7CiAgICAgIGlmICghdGhpcy50ZXJtaW5hbCkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IG5ld0xpbmVzID0gdGhpcy5saW5lcy5zbGljZSh0aGlzLmxhc3RMaW5lQ291bnQpOwogICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbmV3TGluZXMpIHsKICAgICAgICB0aGlzLnRlcm1pbmFsLndyaXRlbG4obGluZSk7CiAgICAgIH0KICAgICAgdGhpcy5sYXN0TGluZUNvdW50ID0gdGhpcy5saW5lcy5sZW5ndGg7CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgaWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpIHsKICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbnVsbDsKICAgICAgfQogICAgICBpZiAodGhpcy50ZXJtaW5hbFRoZW1lU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgdGhpcy50ZXJtaW5hbFRoZW1lU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgdGhpcy50ZXJtaW5hbFRoZW1lU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgfQogICAgICBpZiAodGhpcy50ZXJtaW5hbCkgewogICAgICAgIHRoaXMudGVybWluYWwuZGlzcG9zZSgpOwogICAgICAgIHRoaXMudGVybWluYWwgPSBudWxsOwogICAgICB9CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICB9CiAgICAvKioKICAgICAqIEFkZCBhIG5ldyBsaW5lIHRvIHRoZSBvdXRwdXQKICAgICAqLwogICAgYWRkTGluZShsaW5lKSB7CiAgICAgIHRoaXMubGluZXMgPSBbLi4udGhpcy5saW5lcywgbGluZV07CiAgICB9CiAgICAvKioKICAgICAqIENsZWFyIGFsbCBvdXRwdXQgbGluZXMKICAgICAqLwogICAgY2xlYXIoKSB7CiAgICAgIHRoaXMubGluZXMgPSBbXTsKICAgICAgdGhpcy5sYXN0TGluZUNvdW50ID0gMDsKICAgICAgaWYgKHRoaXMudGVybWluYWwpIHsKICAgICAgICB0aGlzLnRlcm1pbmFsLmNsZWFyKCk7CiAgICAgIH0KICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIF9fcnVuSW5pdGlhbGl6ZXJzOTYoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNXb3Jrc3BhY2VUZXJtaW5hbFByZXZpZXcyID0gX2NsYXNzVGhpczsKfSkoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC13b3Jrc3BhY2UvZGVlcy13b3Jrc3BhY2UtYm90dG9tYmFyL2RlZXMtd29ya3NwYWNlLWJvdHRvbWJhci5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X3RoZW1lKCk7CmluaXRfZGVlc19pY29uKCk7CnZhciBfX2VzRGVjb3JhdGU5NiA9IGZ1bmN0aW9uKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7CiAgZnVuY3Rpb24gYWNjZXB0KGY4KSB7CiAgICBpZiAoZjggIT09IHZvaWQgMCAmJiB0eXBlb2YgZjggIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uIGV4cGVjdGVkIik7CiAgICByZXR1cm4gZjg7CiAgfQogIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleTIgPSBraW5kID09PSAiZ2V0dGVyIiA/ICJnZXQiIDoga2luZCA9PT0gInNldHRlciIgPyAic2V0IiA6ICJ2YWx1ZSI7CiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJblsic3RhdGljIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsOwogIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pOwogIHZhciBfNSwgZG9uZSA9IGZhbHNlOwogIGZvciAodmFyIGkxMSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaTExID49IDA7IGkxMS0tKSB7CiAgICB2YXIgY29udGV4dDIgPSB7fTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbikgY29udGV4dDJbcDhdID0gcDggPT09ICJhY2Nlc3MiID8ge30gOiBjb250ZXh0SW5bcDhdOwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dDIuYWNjZXNzW3A4XSA9IGNvbnRleHRJbi5hY2Nlc3NbcDhdOwogICAgY29udGV4dDIuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbihmOCkgewogICAgICBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkIik7CiAgICAgIGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGY4IHx8IG51bGwpKTsKICAgIH07CiAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaTExXSkoa2luZCA9PT0gImFjY2Vzc29yIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXkyXSwgY29udGV4dDIpOwogICAgaWYgKGtpbmQgPT09ICJhY2Nlc3NvciIpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTsKICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSAib2JqZWN0IikgdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IGV4cGVjdGVkIik7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICB9IGVsc2UgaWYgKF81ID0gYWNjZXB0KHJlc3VsdCkpIHsKICAgICAgaWYgKGtpbmQgPT09ICJmaWVsZCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleTJdID0gXzU7CiAgICB9CiAgfQogIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTsKICBkb25lID0gdHJ1ZTsKfTsKdmFyIF9fcnVuSW5pdGlhbGl6ZXJzOTcgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNXb3Jrc3BhY2VCb3R0b21iYXIgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtd29ya3NwYWNlLWJvdHRvbWJhciIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX2V4ZWN1dGlvbkVudmlyb25tZW50X2RlY29yYXRvcnM7CiAgbGV0IF9leGVjdXRpb25FbnZpcm9ubWVudF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2V4ZWN1dGlvbkVudmlyb25tZW50X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zY3JpcHRzX2RlY29yYXRvcnM7CiAgbGV0IF9zY3JpcHRzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2NyaXB0c19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfcGFja2FnZVN0YXR1c19kZWNvcmF0b3JzOwogIGxldCBfcGFja2FnZVN0YXR1c19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3BhY2thZ2VTdGF0dXNfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX291dGRhdGVkUGFja2FnZXNfZGVjb3JhdG9yczsKICBsZXQgX291dGRhdGVkUGFja2FnZXNfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vdXRkYXRlZFBhY2thZ2VzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0NoZWNraW5nUGFja2FnZXNfZGVjb3JhdG9yczsKICBsZXQgX2lzQ2hlY2tpbmdQYWNrYWdlc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzQ2hlY2tpbmdQYWNrYWdlc19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzV29ya3NwYWNlQm90dG9tYmFyMiA9IGNsYXNzIGV4dGVuZHMgX2NsYXNzU3VwZXIgewogICAgc3RhdGljIHsKICAgICAgX2NsYXNzVGhpcyA9IHRoaXM7CiAgICB9CiAgICBzdGF0aWMgewogICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDsKICAgICAgX2V4ZWN1dGlvbkVudmlyb25tZW50X2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBPYmplY3QgfSldOwogICAgICBfc2NyaXB0c19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfcGFja2FnZVN0YXR1c19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfb3V0ZGF0ZWRQYWNrYWdlc19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaXNDaGVja2luZ1BhY2thZ2VzX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTk2KHRoaXMsIG51bGwsIF9leGVjdXRpb25FbnZpcm9ubWVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJleGVjdXRpb25FbnZpcm9ubWVudCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZXhlY3V0aW9uRW52aXJvbm1lbnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZXhlY3V0aW9uRW52aXJvbm1lbnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmV4ZWN1dGlvbkVudmlyb25tZW50ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2V4ZWN1dGlvbkVudmlyb25tZW50X2luaXRpYWxpemVycywgX2V4ZWN1dGlvbkVudmlyb25tZW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTYodGhpcywgbnVsbCwgX3NjcmlwdHNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic2NyaXB0cyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2NyaXB0cyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zY3JpcHRzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zY3JpcHRzID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NjcmlwdHNfaW5pdGlhbGl6ZXJzLCBfc2NyaXB0c19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk2KHRoaXMsIG51bGwsIF9wYWNrYWdlU3RhdHVzX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInBhY2thZ2VTdGF0dXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInBhY2thZ2VTdGF0dXMiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoucGFja2FnZVN0YXR1cywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoucGFja2FnZVN0YXR1cyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9wYWNrYWdlU3RhdHVzX2luaXRpYWxpemVycywgX3BhY2thZ2VTdGF0dXNfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5Nih0aGlzLCBudWxsLCBfb3V0ZGF0ZWRQYWNrYWdlc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJvdXRkYXRlZFBhY2thZ2VzIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJvdXRkYXRlZFBhY2thZ2VzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm91dGRhdGVkUGFja2FnZXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm91dGRhdGVkUGFja2FnZXMgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfb3V0ZGF0ZWRQYWNrYWdlc19pbml0aWFsaXplcnMsIF9vdXRkYXRlZFBhY2thZ2VzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTYodGhpcywgbnVsbCwgX2lzQ2hlY2tpbmdQYWNrYWdlc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc0NoZWNraW5nUGFja2FnZXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImlzQ2hlY2tpbmdQYWNrYWdlcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc0NoZWNraW5nUGFja2FnZXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzQ2hlY2tpbmdQYWNrYWdlcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pc0NoZWNraW5nUGFja2FnZXNfaW5pdGlhbGl6ZXJzLCBfaXNDaGVja2luZ1BhY2thZ2VzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTYobnVsbCwgX2NsYXNzRGVzY3JpcHRvciA9IHsgdmFsdWU6IF9jbGFzc1RoaXMgfSwgX2NsYXNzRGVjb3JhdG9ycywgeyBraW5kOiAiY2xhc3MiLCBuYW1lOiBfY2xhc3NUaGlzLm5hbWUsIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgICBEZWVzV29ya3NwYWNlQm90dG9tYmFyMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICAjZXhlY3V0aW9uRW52aXJvbm1lbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX2V4ZWN1dGlvbkVudmlyb25tZW50X2luaXRpYWxpemVycywgbnVsbCk7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IGV4ZWN1dGlvbkVudmlyb25tZW50KCkgewogICAgICByZXR1cm4gdGhpcy4jZXhlY3V0aW9uRW52aXJvbm1lbnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBleGVjdXRpb25FbnZpcm9ubWVudCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZXhlY3V0aW9uRW52aXJvbm1lbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzY3JpcHRzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5Nyh0aGlzLCBfZXhlY3V0aW9uRW52aXJvbm1lbnRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk3KHRoaXMsIF9zY3JpcHRzX2luaXRpYWxpemVycywge30pKTsKICAgIC8vIFNjcmlwdCBydW5uZXIgc3RhdGUKICAgIGdldCBzY3JpcHRzKCkgewogICAgICByZXR1cm4gdGhpcy4jc2NyaXB0c19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNjcmlwdHModmFsdWUyKSB7CiAgICAgIHRoaXMuI3NjcmlwdHNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNwYWNrYWdlU3RhdHVzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5Nyh0aGlzLCBfc2NyaXB0c19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX3BhY2thZ2VTdGF0dXNfaW5pdGlhbGl6ZXJzLCAiaWRsZSIpKTsKICAgIC8vIFBhY2thZ2UgY2hlY2tlciBzdGF0ZQogICAgZ2V0IHBhY2thZ2VTdGF0dXMoKSB7CiAgICAgIHJldHVybiB0aGlzLiNwYWNrYWdlU3RhdHVzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgcGFja2FnZVN0YXR1cyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jcGFja2FnZVN0YXR1c19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI291dGRhdGVkUGFja2FnZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk3KHRoaXMsIF9wYWNrYWdlU3RhdHVzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5Nyh0aGlzLCBfb3V0ZGF0ZWRQYWNrYWdlc19pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgb3V0ZGF0ZWRQYWNrYWdlcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI291dGRhdGVkUGFja2FnZXNfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBvdXRkYXRlZFBhY2thZ2VzKHZhbHVlMikgewogICAgICB0aGlzLiNvdXRkYXRlZFBhY2thZ2VzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNDaGVja2luZ1BhY2thZ2VzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5Nyh0aGlzLCBfb3V0ZGF0ZWRQYWNrYWdlc19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTcodGhpcywgX2lzQ2hlY2tpbmdQYWNrYWdlc19pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaXNDaGVja2luZ1BhY2thZ2VzKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNDaGVja2luZ1BhY2thZ2VzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaXNDaGVja2luZ1BhY2thZ2VzKHZhbHVlMikgewogICAgICB0aGlzLiNpc0NoZWNraW5nUGFja2FnZXNfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIC8vIFRyYWNrIGlmIHdlIGhhdmUgYSBwZW5kaW5nIHBhY2thZ2UgdXBkYXRlIHRoYXQgc2hvdWxkIHRyaWdnZXIgcmVmcmVzaAogICAgcGVuZGluZ1BhY2thZ2VVcGRhdGUgPSAoX19ydW5Jbml0aWFsaXplcnM5Nyh0aGlzLCBfaXNDaGVja2luZ1BhY2thZ2VzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgZmFsc2UpOwogICAgLy8gQm91bmQgaGFuZGxlciBmb3IgcHJvY2Vzcy1jb21wbGV0ZSBldmVudHMKICAgIGhhbmRsZVByb2Nlc3NDb21wbGV0ZSA9IChlMTEpID0+IHsKICAgICAgaWYgKHRoaXMucGVuZGluZ1BhY2thZ2VVcGRhdGUpIHsKICAgICAgICB0aGlzLnBlbmRpbmdQYWNrYWdlVXBkYXRlID0gZmFsc2U7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmNoZWNrUGFja2FnZXMoKSwgNTAwKTsKICAgICAgfQogICAgfTsKICAgIHN0YXRpYyBzdHlsZXMgPSBbCiAgICAgIHRoZW1lRGVmYXVsdFN0eWxlcywKICAgICAgY3NzTWFuYWdlci5kZWZhdWx0U3R5bGVzLAogICAgICBpYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAyNHB4OwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAuYm90dG9tLWJhciB7CiAgICAgICAgaGVpZ2h0OiAyNHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiAwIDhweDsKICAgICAgICBnYXA6IDRweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgOTQlKSIsICJoc2woMCAwJSA2JSkiKX07CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4NSUpIiwgImhzbCgwIDAlIDE1JSkiKX07CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNDAlKSIsICJoc2woMCAwJSA2MCUpIil9OwogICAgICB9CgogICAgICAud2lkZ2V0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgICAgcGFkZGluZzogMnB4IDZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMgZWFzZSwgY29sb3IgMC4xNXMgZWFzZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAud2lkZ2V0OmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODglKSIsICJoc2woMCAwJSAxMiUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMjAlKSIsICJoc2woMCAwJSA4MCUpIil9OwogICAgICB9CgogICAgICAud2lkZ2V0IGRlZXMtaWNvbiB7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC53aWRnZXQtc2VwYXJhdG9yIHsKICAgICAgICB3aWR0aDogMXB4OwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODAlKSIsICJoc2woMCAwJSAyMCUpIil9OwogICAgICAgIG1hcmdpbjogMCA0cHg7CiAgICAgIH0KCiAgICAgIC53aWRnZXQucnVubmluZyB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDEwMCUgNDUlKSIsICJoc2woMjEwIDEwMCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLndpZGdldC51cC10by1kYXRlIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgxNDIgNzAlIDM1JSkiLCAiaHNsKDE0MiA3MCUgNTAlKSIpfTsKICAgICAgfQoKICAgICAgLndpZGdldC51cGRhdGVzLWF2YWlsYWJsZSB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMzggOTIlIDQ1JSkiLCAiaHNsKDM4IDkyJSA1NSUpIil9OwogICAgICB9CgogICAgICAud2lkZ2V0LmVycm9yIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDcwJSA1MCUpIiwgImhzbCgwIDcwJSA2MCUpIil9OwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIHNwaW4gewogICAgICAgIGZyb20geyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfQogICAgICB9CgogICAgICAuc3Bpbm5pbmcgewogICAgICAgIGFuaW1hdGlvbjogc3BpbiAxcyBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIC5zcGFjZXIgewogICAgICAgIGZsZXg6IDE7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0iYm90dG9tLWJhciI+CiAgICAgICAgPCEtLSBTY3JpcHQgUnVubmVyIFdpZGdldCAtLT4KICAgICAgICA8ZGl2CiAgICAgICAgICBjbGFzcz0id2lkZ2V0IgogICAgICAgICAgQGNsaWNrPSR7dGhpcy5oYW5kbGVTY3JpcHRDbGlja30KICAgICAgICAgIHRpdGxlPSJSdW4gc2NyaXB0IgogICAgICAgID4KICAgICAgICAgIDxkZWVzLWljb24KICAgICAgICAgICAgLmljb249JHsibHVjaWRlOnBsYXkifQogICAgICAgICAgICBpY29uU2l6ZT0iMTIiCiAgICAgICAgICA+PC9kZWVzLWljb24+CiAgICAgICAgICA8c3Bhbj5TY3JpcHRzPC9zcGFuPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJ3aWRnZXQtc2VwYXJhdG9yIj48L2Rpdj4KCiAgICAgICAgPCEtLSBQYWNrYWdlIENoZWNrZXIgV2lkZ2V0IC0tPgogICAgICAgIDxkaXYKICAgICAgICAgIGNsYXNzPSJ3aWRnZXQgJHt0aGlzLmdldFBhY2thZ2VTdGF0dXNDbGFzcygpfSIKICAgICAgICAgIEBjbGljaz0ke3RoaXMuaGFuZGxlUGFja2FnZUNsaWNrfQogICAgICAgICAgdGl0bGU9IiR7dGhpcy5nZXRQYWNrYWdlVG9vbHRpcCgpfSIKICAgICAgICA+CiAgICAgICAgICA8ZGVlcy1pY29uCiAgICAgICAgICAgIC5pY29uPSR7dGhpcy5nZXRQYWNrYWdlSWNvbigpfQogICAgICAgICAgICBpY29uU2l6ZT0iMTIiCiAgICAgICAgICAgIGNsYXNzPSIke3RoaXMuaXNDaGVja2luZ1BhY2thZ2VzID8gInNwaW5uaW5nIiA6ICIifSIKICAgICAgICAgID48L2RlZXMtaWNvbj4KICAgICAgICAgIDxzcGFuPiR7dGhpcy5nZXRQYWNrYWdlU3RhdHVzVGV4dCgpfTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0ic3BhY2VyIj48L2Rpdj4KCiAgICAgICAgPCEtLSBGdXR1cmUgd2lkZ2V0cyBjYW4gYmUgYWRkZWQgaGVyZSAtLT4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwcm9jZXNzLWNvbXBsZXRlIiwgdGhpcy5oYW5kbGVQcm9jZXNzQ29tcGxldGUpOwogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJwcm9jZXNzLWNvbXBsZXRlIiwgdGhpcy5oYW5kbGVQcm9jZXNzQ29tcGxldGUpOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKCkgewogICAgICBhd2FpdCB0aGlzLmxvYWRTY3JpcHRzKCk7CiAgICAgIGF3YWl0IHRoaXMuY2hlY2tQYWNrYWdlcygpOwogICAgfQogICAgYXN5bmMgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJleGVjdXRpb25FbnZpcm9ubWVudCIpICYmIHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKICAgICAgICBhd2FpdCB0aGlzLmxvYWRTY3JpcHRzKCk7CiAgICAgICAgYXdhaXQgdGhpcy5jaGVja1BhY2thZ2VzKCk7CiAgICAgIH0KICAgIH0KICAgIC8vID09PT09PT09PT0gU2NyaXB0IFJ1bm5lciA9PT09PT09PT09CiAgICBhc3luYyBsb2FkU2NyaXB0cygpIHsKICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICAgIHJldHVybjsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBwYWNrYWdlSnNvbkV4aXN0cyA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQuZXhpc3RzKCIvcGFja2FnZS5qc29uIik7CiAgICAgICAgaWYgKCFwYWNrYWdlSnNvbkV4aXN0cykgewogICAgICAgICAgdGhpcy5zY3JpcHRzID0ge307CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNvbnRlbnQzID0gYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5yZWFkRmlsZSgiL3BhY2thZ2UuanNvbiIpOwogICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShjb250ZW50Myk7CiAgICAgICAgdGhpcy5zY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cyB8fCB7fTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLndhcm4oIkZhaWxlZCB0byBsb2FkIHNjcmlwdHMgZnJvbSBwYWNrYWdlLmpzb246IiwgZXJyb3IpOwogICAgICAgIHRoaXMuc2NyaXB0cyA9IHt9OwogICAgICB9CiAgICB9CiAgICBhc3luYyBoYW5kbGVTY3JpcHRDbGljayhlMTEpIHsKICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBjb25zdCBzY3JpcHROYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuc2NyaXB0cyk7CiAgICAgIGlmIChzY3JpcHROYW1lcy5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgbWVudUl0ZW1zID0gc2NyaXB0TmFtZXMubWFwKChuYW1lKSA9PiAoewogICAgICAgIG5hbWUsCiAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6dGVybWluYWwiLAogICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgYXdhaXQgdGhpcy5ydW5TY3JpcHQobmFtZSk7CiAgICAgICAgfQogICAgICB9KSk7CiAgICAgIGF3YWl0IERlZXNDb250ZXh0bWVudS5vcGVuQ29udGV4dE1lbnVXaXRoT3B0aW9ucyhlMTEsIG1lbnVJdGVtcyk7CiAgICB9CiAgICBhc3luYyBydW5TY3JpcHQoc2NyaXB0TmFtZSkgewogICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBkZXRhaWwgPSB7CiAgICAgICAgdHlwZTogInNjcmlwdCIsCiAgICAgICAgbGFiZWw6IHNjcmlwdE5hbWUsCiAgICAgICAgY29tbWFuZDogInBucG0iLAogICAgICAgIGFyZ3M6IFsicnVuIiwgc2NyaXB0TmFtZV0sCiAgICAgICAgbWV0YWRhdGE6IHsgc2NyaXB0TmFtZSB9CiAgICAgIH07CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInJ1bi1wcm9jZXNzIiwgewogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUsCiAgICAgICAgZGV0YWlsCiAgICAgIH0pKTsKICAgIH0KICAgIC8vID09PT09PT09PT0gUGFja2FnZSBDaGVja2VyID09PT09PT09PT0KICAgIGFzeW5jIGNoZWNrUGFja2FnZXMoKSB7CiAgICAgIGlmICghdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCkgewogICAgICAgIHRoaXMucGFja2FnZVN0YXR1cyA9ICJpZGxlIjsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBwYWNrYWdlSnNvbkV4aXN0cyA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQuZXhpc3RzKCIvcGFja2FnZS5qc29uIik7CiAgICAgICAgaWYgKCFwYWNrYWdlSnNvbkV4aXN0cykgewogICAgICAgICAgdGhpcy5wYWNrYWdlU3RhdHVzID0gImlkbGUiOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLnBhY2thZ2VTdGF0dXMgPSAiY2hlY2tpbmciOwogICAgICAgIHRoaXMuaXNDaGVja2luZ1BhY2thZ2VzID0gdHJ1ZTsKICAgICAgICBjb25zdCBwcm9jZXNzNCA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQuc3Bhd24oInBucG0iLCBbIm91dGRhdGVkIiwgIi0tanNvbiJdKTsKICAgICAgICBsZXQgb3V0cHV0ID0gIiI7CiAgICAgICAgY29uc3Qgb3V0cHV0UmVhZGVyID0gcHJvY2VzczQub3V0cHV0LmdldFJlYWRlcigpOwogICAgICAgIGNvbnN0IHJlYWRPdXRwdXQgPSBhc3luYyAoKSA9PiB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWU6IHZhbHVlMiB9ID0gYXdhaXQgb3V0cHV0UmVhZGVyLnJlYWQoKTsKICAgICAgICAgICAgICBpZiAoZG9uZSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIG91dHB1dCArPSB2YWx1ZTI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmVhZE91dHB1dCgpOwogICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgUHJvbWlzZS5yYWNlKFsKICAgICAgICAgIHByb2Nlc3M0LmV4aXQsCiAgICAgICAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZTIoLTEpLCAxZTQpKQogICAgICAgIF0pOwogICAgICAgIHRyeSB7CiAgICAgICAgICBhd2FpdCBvdXRwdXRSZWFkZXIuY2FuY2VsKCk7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgfQogICAgICAgIGlmIChleGl0Q29kZSA9PT0gLTEpIHsKICAgICAgICAgIGNvbnNvbGUud2FybigiUGFja2FnZSBjaGVjayB0aW1lZCBvdXQiKTsKICAgICAgICAgIHRoaXMucGFja2FnZVN0YXR1cyA9ICJlcnJvciI7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChleGl0Q29kZSA9PT0gMCkgewogICAgICAgICAgdGhpcy5wYWNrYWdlU3RhdHVzID0gInVwLXRvLWRhdGUiOwogICAgICAgICAgdGhpcy5vdXRkYXRlZFBhY2thZ2VzID0gW107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IG91dGRhdGVkRGF0YSA9IEpTT04ucGFyc2Uob3V0cHV0KTsKICAgICAgICAgICAgdGhpcy5vdXRkYXRlZFBhY2thZ2VzID0gdGhpcy5wYXJzZU91dGRhdGVkUGFja2FnZXMob3V0ZGF0ZWREYXRhKTsKICAgICAgICAgICAgdGhpcy5wYWNrYWdlU3RhdHVzID0gdGhpcy5vdXRkYXRlZFBhY2thZ2VzLmxlbmd0aCA+IDAgPyAidXBkYXRlcy1hdmFpbGFibGUiIDogInVwLXRvLWRhdGUiOwogICAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgIHRoaXMucGFja2FnZVN0YXR1cyA9ICJ1cGRhdGVzLWF2YWlsYWJsZSI7CiAgICAgICAgICAgIHRoaXMub3V0ZGF0ZWRQYWNrYWdlcyA9IFtdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLndhcm4oIkZhaWxlZCB0byBjaGVjayBmb3IgcGFja2FnZSB1cGRhdGVzOiIsIGVycm9yKTsKICAgICAgICB0aGlzLnBhY2thZ2VTdGF0dXMgPSAiZXJyb3IiOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHRoaXMuaXNDaGVja2luZ1BhY2thZ2VzID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHBhcnNlT3V0ZGF0ZWRQYWNrYWdlcyhkYXRhKSB7CiAgICAgIGNvbnN0IHBhY2thZ2VzID0gW107CiAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gIm9iamVjdCIgJiYgZGF0YSAhPT0gbnVsbCkgewogICAgICAgIGZvciAoY29uc3QgW25hbWUsIGluZm9dIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7CiAgICAgICAgICBjb25zdCBwa2dJbmZvID0gaW5mbzsKICAgICAgICAgIHBhY2thZ2VzLnB1c2goewogICAgICAgICAgICBuYW1lLAogICAgICAgICAgICBjdXJyZW50OiBwa2dJbmZvLmN1cnJlbnQgfHwgInVua25vd24iLAogICAgICAgICAgICB3YW50ZWQ6IHBrZ0luZm8ud2FudGVkIHx8IHBrZ0luZm8uY3VycmVudCB8fCAidW5rbm93biIsCiAgICAgICAgICAgIGxhdGVzdDogcGtnSW5mby5sYXRlc3QgfHwgcGtnSW5mby53YW50ZWQgfHwgInVua25vd24iLAogICAgICAgICAgICB0eXBlOiBwa2dJbmZvLmRlcGVuZGVuY3lUeXBlID09PSAiZGV2RGVwZW5kZW5jaWVzIiA/ICJkZXZEZXBlbmRlbmNpZXMiIDogImRlcGVuZGVuY2llcyIKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcGFja2FnZXM7CiAgICB9CiAgICBhc3luYyBoYW5kbGVQYWNrYWdlQ2xpY2soZTExKSB7CiAgICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgY29uc3QgbWVudUl0ZW1zID0gW107CiAgICAgIG1lbnVJdGVtcy5wdXNoKHsKICAgICAgICBuYW1lOiB0aGlzLmlzQ2hlY2tpbmdQYWNrYWdlcyA/ICJDaGVja2luZy4uLiIgOiAiQ2hlY2sgZm9yIHVwZGF0ZXMiLAogICAgICAgIGljb25OYW1lOiAibHVjaWRlOnJlZnJlc2hDdyIsCiAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5pc0NoZWNraW5nUGFja2FnZXMpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGNvbnN0IGRldGFpbCA9IHsKICAgICAgICAgICAgdHlwZTogInBhY2thZ2UtdXBkYXRlIiwKICAgICAgICAgICAgbGFiZWw6ICJjaGVjayBwYWNrYWdlcyIsCiAgICAgICAgICAgIGNvbW1hbmQ6ICJwbnBtIiwKICAgICAgICAgICAgYXJnczogWyJvdXRkYXRlZCJdCiAgICAgICAgICB9OwogICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgicnVuLXByb2Nlc3MiLCB7CiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLAogICAgICAgICAgICBkZXRhaWwKICAgICAgICAgIH0pKTsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jaGVja1BhY2thZ2VzKCksIDNlMyk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgaWYgKHRoaXMub3V0ZGF0ZWRQYWNrYWdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgbWVudUl0ZW1zLnB1c2goeyBkaXZpZGVyOiB0cnVlIH0pOwogICAgICAgIGNvbnN0IGRpc3BsYXlQYWNrYWdlcyA9IHRoaXMub3V0ZGF0ZWRQYWNrYWdlcy5zbGljZSgwLCAxMCk7CiAgICAgICAgZm9yIChjb25zdCBwa2cgb2YgZGlzcGxheVBhY2thZ2VzKSB7CiAgICAgICAgICBtZW51SXRlbXMucHVzaCh7CiAgICAgICAgICAgIG5hbWU6IGAke3BrZy5uYW1lfTogJHtwa2cuY3VycmVudH0gXHUyMTkyICR7cGtnLmxhdGVzdH1gLAogICAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpwYWNrYWdlIiwKICAgICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVQYWNrYWdlKHBrZy5uYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLm91dGRhdGVkUGFja2FnZXMubGVuZ3RoID4gMTApIHsKICAgICAgICAgIG1lbnVJdGVtcy5wdXNoKHsKICAgICAgICAgICAgbmFtZTogYC4uLiBhbmQgJHt0aGlzLm91dGRhdGVkUGFja2FnZXMubGVuZ3RoIC0gMTB9IG1vcmVgLAogICAgICAgICAgICBpY29uTmFtZTogImx1Y2lkZTptb3JlSG9yaXpvbnRhbCIsCiAgICAgICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgbWVudUl0ZW1zLnB1c2goeyBkaXZpZGVyOiB0cnVlIH0pOwogICAgICAgIG1lbnVJdGVtcy5wdXNoKHsKICAgICAgICAgIG5hbWU6ICJVcGRhdGUgYWxsIHBhY2thZ2VzIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOmFycm93VXBDaXJjbGUiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQWxsUGFja2FnZXMoKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICBhd2FpdCBEZWVzQ29udGV4dG1lbnUub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZTExLCBtZW51SXRlbXMpOwogICAgfQogICAgYXN5bmMgdXBkYXRlUGFja2FnZShwYWNrYWdlTmFtZSkgewogICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLnBlbmRpbmdQYWNrYWdlVXBkYXRlID0gdHJ1ZTsKICAgICAgY29uc3QgZGV0YWlsID0gewogICAgICAgIHR5cGU6ICJwYWNrYWdlLXVwZGF0ZSIsCiAgICAgICAgbGFiZWw6IGB1cGRhdGUgJHtwYWNrYWdlTmFtZX1gLAogICAgICAgIGNvbW1hbmQ6ICJwbnBtIiwKICAgICAgICBhcmdzOiBbInVwZGF0ZSIsICItLWxhdGVzdCIsIHBhY2thZ2VOYW1lXSwKICAgICAgICBtZXRhZGF0YTogeyBwYWNrYWdlTmFtZSB9CiAgICAgIH07CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInJ1bi1wcm9jZXNzIiwgewogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUsCiAgICAgICAgZGV0YWlsCiAgICAgIH0pKTsKICAgIH0KICAgIGFzeW5jIHVwZGF0ZUFsbFBhY2thZ2VzKCkgewogICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLnBlbmRpbmdQYWNrYWdlVXBkYXRlID0gdHJ1ZTsKICAgICAgY29uc3QgZGV0YWlsID0gewogICAgICAgIHR5cGU6ICJwYWNrYWdlLXVwZGF0ZSIsCiAgICAgICAgbGFiZWw6ICJ1cGRhdGUgYWxsIiwKICAgICAgICBjb21tYW5kOiAicG5wbSIsCiAgICAgICAgYXJnczogWyJ1cGRhdGUiLCAiLS1sYXRlc3QiXQogICAgICB9OwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJydW4tcHJvY2VzcyIsIHsKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlLAogICAgICAgIGRldGFpbAogICAgICB9KSk7CiAgICB9CiAgICAvLyA9PT09PT09PT09IEhlbHBlciBNZXRob2RzID09PT09PT09PT0KICAgIGdldFBhY2thZ2VTdGF0dXNDbGFzcygpIHsKICAgICAgaWYgKHRoaXMuaXNDaGVja2luZ1BhY2thZ2VzKQogICAgICAgIHJldHVybiAiIjsKICAgICAgcmV0dXJuIHRoaXMucGFja2FnZVN0YXR1czsKICAgIH0KICAgIGdldFBhY2thZ2VJY29uKCkgewogICAgICBpZiAodGhpcy5pc0NoZWNraW5nUGFja2FnZXMpCiAgICAgICAgcmV0dXJuICJsdWNpZGU6bG9hZGVyMiI7CiAgICAgIHN3aXRjaCAodGhpcy5wYWNrYWdlU3RhdHVzKSB7CiAgICAgICAgY2FzZSAidXAtdG8tZGF0ZSI6CiAgICAgICAgICByZXR1cm4gImx1Y2lkZTpjaGVja0NpcmNsZSI7CiAgICAgICAgY2FzZSAidXBkYXRlcy1hdmFpbGFibGUiOgogICAgICAgICAgcmV0dXJuICJsdWNpZGU6YWxlcnRDaXJjbGUiOwogICAgICAgIGNhc2UgImVycm9yIjoKICAgICAgICAgIHJldHVybiAibHVjaWRlOnhDaXJjbGUiOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gImx1Y2lkZTpwYWNrYWdlIjsKICAgICAgfQogICAgfQogICAgZ2V0UGFja2FnZVN0YXR1c1RleHQoKSB7CiAgICAgIGlmICh0aGlzLmlzQ2hlY2tpbmdQYWNrYWdlcykKICAgICAgICByZXR1cm4gIkNoZWNraW5nLi4uIjsKICAgICAgc3dpdGNoICh0aGlzLnBhY2thZ2VTdGF0dXMpIHsKICAgICAgICBjYXNlICJ1cC10by1kYXRlIjoKICAgICAgICAgIHJldHVybiAiVXAgdG8gZGF0ZSI7CiAgICAgICAgY2FzZSAidXBkYXRlcy1hdmFpbGFibGUiOgogICAgICAgICAgcmV0dXJuIGAke3RoaXMub3V0ZGF0ZWRQYWNrYWdlcy5sZW5ndGh9IHVwZGF0ZSR7dGhpcy5vdXRkYXRlZFBhY2thZ2VzLmxlbmd0aCAhPT0gMSA/ICJzIiA6ICIifWA7CiAgICAgICAgY2FzZSAiZXJyb3IiOgogICAgICAgICAgcmV0dXJuICJDaGVjayBmYWlsZWQiOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gIlBhY2thZ2VzIjsKICAgICAgfQogICAgfQogICAgZ2V0UGFja2FnZVRvb2x0aXAoKSB7CiAgICAgIGlmICh0aGlzLmlzQ2hlY2tpbmdQYWNrYWdlcykKICAgICAgICByZXR1cm4gIkNoZWNraW5nIGZvciBwYWNrYWdlIHVwZGF0ZXMuLi4iOwogICAgICBzd2l0Y2ggKHRoaXMucGFja2FnZVN0YXR1cykgewogICAgICAgIGNhc2UgInVwLXRvLWRhdGUiOgogICAgICAgICAgcmV0dXJuICJBbGwgcGFja2FnZXMgYXJlIHVwIHRvIGRhdGUiOwogICAgICAgIGNhc2UgInVwZGF0ZXMtYXZhaWxhYmxlIjoKICAgICAgICAgIHJldHVybiBgJHt0aGlzLm91dGRhdGVkUGFja2FnZXMubGVuZ3RofSBwYWNrYWdlIHVwZGF0ZSR7dGhpcy5vdXRkYXRlZFBhY2thZ2VzLmxlbmd0aCAhPT0gMSA/ICJzIiA6ICIifSBhdmFpbGFibGVgOwogICAgICAgIGNhc2UgImVycm9yIjoKICAgICAgICAgIHJldHVybiAiRmFpbGVkIHRvIGNoZWNrIGZvciB1cGRhdGVzLiBDbGljayB0byByZXRyeS4iOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gIkNsaWNrIHRvIGNoZWNrIGZvciBwYWNrYWdlIHVwZGF0ZXMiOwogICAgICB9CiAgICB9CiAgICAvLyA9PT09PT09PT09IFB1YmxpYyBNZXRob2RzID09PT09PT09PT0KICAgIC8qKgogICAgICogTWFudWFsbHkgdHJpZ2dlciBhIHBhY2thZ2UgY2hlY2sKICAgICAqLwogICAgYXN5bmMgcmVmcmVzaFBhY2thZ2VTdGF0dXMoKSB7CiAgICAgIGF3YWl0IHRoaXMuY2hlY2tQYWNrYWdlcygpOwogICAgfQogICAgLyoqCiAgICAgKiBNYW51YWxseSByZWxvYWQgc2NyaXB0cyBmcm9tIHBhY2thZ2UuanNvbgogICAgICovCiAgICBhc3luYyByZWZyZXNoU2NyaXB0cygpIHsKICAgICAgYXdhaXQgdGhpcy5sb2FkU2NyaXB0cygpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM5NyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1dvcmtzcGFjZUJvdHRvbWJhcjIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXdvcmtzcGFjZS9kZWVzLXdvcmtzcGFjZS90eXBlc2NyaXB0LWludGVsbGlzZW5zZS5qcwp2YXIgVHlwZVNjcmlwdEludGVsbGlTZW5zZU1hbmFnZXIgPSBjbGFzcyB7CiAgbG9hZGVkTGlicyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgbm90Rm91bmRQYWNrYWdlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgLy8gUGFja2FnZXMgY2hlY2tlZCBidXQgbm90IGZvdW5kCiAgbW9uYWNvSW5zdGFuY2UgPSBudWxsOwogIGV4ZWN1dGlvbkVudmlyb25tZW50ID0gbnVsbDsKICAvLyBDYWNoZSBvZiBmaWxlIGNvbnRlbnRzIGZvciBzeW5jaHJvbm91cyBhY2Nlc3MgYW5kIG1vZHVsZSByZXNvbHV0aW9uCiAgZmlsZUNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAvLyBUcmFjayBleHRyYSBsaWJzIGFkZGVkIGZvciBjbGVhbnVwCiAgYWRkZWRFeHRyYUxpYnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogIC8qKgogICAqIEdldCBUeXBlU2NyaXB0IEFQSSB3aXRoIHByb3BlciB0eXBpbmcgZm9yIE1vbmFjbyAwLjU1KwogICAqLwogIGdldCB0c0FwaSgpIHsKICAgIGlmICghdGhpcy5tb25hY29JbnN0YW5jZSkKICAgICAgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gdGhpcy5tb25hY29JbnN0YW5jZS5sYW5ndWFnZXMudHlwZXNjcmlwdDsKICB9CiAgLyoqCiAgICogSW5pdGlhbGl6ZSB3aXRoIE1vbmFjbyBhbmQgZXhlY3V0aW9uIGVudmlyb25tZW50CiAgICovCiAgYXN5bmMgaW5pdChtb25hY29JbnN0LCBlbnYyKSB7CiAgICB0aGlzLm1vbmFjb0luc3RhbmNlID0gbW9uYWNvSW5zdDsKICAgIHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQgPSBlbnYyOwogICAgdGhpcy5jb25maWd1cmVDb21waWxlck9wdGlvbnMoKTsKICAgIGF3YWl0IHRoaXMubG9hZEFsbFByb2plY3RGaWxlcygpOwogIH0KICAvKioKICAgKiBSZWN1cnNpdmVseSBsb2FkIGFsbCAudHMvLmpzIGZpbGVzIGZyb20gdGhlIHZpcnR1YWwgZmlsZXN5c3RlbSBpbnRvIE1vbmFjbwogICAqLwogIGFzeW5jIGxvYWRBbGxQcm9qZWN0RmlsZXMoKSB7CiAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpCiAgICAgIHJldHVybjsKICAgIGF3YWl0IHRoaXMubG9hZEZpbGVzRnJvbURpcmVjdG9yeSgiLyIpOwogIH0KICAvKioKICAgKiBSZWN1cnNpdmVseSBsb2FkIGZpbGVzIGZyb20gYSBkaXJlY3RvcnkKICAgKi8KICBhc3luYyBsb2FkRmlsZXNGcm9tRGlyZWN0b3J5KGRpclBhdGgpIHsKICAgIGlmICghdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCkKICAgICAgcmV0dXJuOwogICAgdHJ5IHsKICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZERpcihkaXJQYXRoKTsKICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7CiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBkaXJQYXRoID09PSAiLyIgPyBgLyR7ZW50cnkubmFtZX1gIDogYCR7ZGlyUGF0aH0vJHtlbnRyeS5uYW1lfWA7CiAgICAgICAgaWYgKGVudHJ5Lm5hbWUgPT09ICJub2RlX21vZHVsZXMiKQogICAgICAgICAgY29udGludWU7CiAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09ICJkaXJlY3RvcnkiKSB7CiAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRGaWxlc0Zyb21EaXJlY3RvcnkoZnVsbFBhdGgpOwogICAgICAgIH0gZWxzZSBpZiAoZW50cnkudHlwZSA9PT0gImZpbGUiKSB7CiAgICAgICAgICBjb25zdCBleHQgPSBlbnRyeS5uYW1lLnNwbGl0KCIuIikucG9wKCk/LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICBpZiAoZXh0ID09PSAidHMiIHx8IGV4dCA9PT0gInRzeCIgfHwgZXh0ID09PSAianMiIHx8IGV4dCA9PT0gImpzeCIpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBjb25zdCBjb250ZW50MyA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZEZpbGUoZnVsbFBhdGgpOwogICAgICAgICAgICAgIHRoaXMuYWRkRmlsZU1vZGVsKGZ1bGxQYXRoLCBjb250ZW50Myk7CiAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIHsKICAgIH0KICB9CiAgY29uZmlndXJlQ29tcGlsZXJPcHRpb25zKCkgewogICAgY29uc3QgdHMgPSB0aGlzLnRzQXBpOwogICAgaWYgKCF0cykKICAgICAgcmV0dXJuOwogICAgdHMudHlwZXNjcmlwdERlZmF1bHRzLnNldENvbXBpbGVyT3B0aW9ucyh7CiAgICAgIHRhcmdldDogdHMuU2NyaXB0VGFyZ2V0LkVTMjAyMCwKICAgICAgbW9kdWxlOiB0cy5Nb2R1bGVLaW5kLkVTTmV4dCwKICAgICAgLy8gVXNlIEJ1bmRsZXIgcmVzb2x1dGlvbiBpZiBhdmFpbGFibGUgKE1vbmFjbyAwLjQ1KyksIGZhbGxiYWNrIHRvIE5vZGVKcwogICAgICBtb2R1bGVSZXNvbHV0aW9uOiB0cy5Nb2R1bGVSZXNvbHV0aW9uS2luZC5CdW5kbGVyID8/IHRzLk1vZHVsZVJlc29sdXRpb25LaW5kLk5vZGVKcywKICAgICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwKICAgICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLAogICAgICBzdHJpY3Q6IHRydWUsCiAgICAgIG5vRW1pdDogdHJ1ZSwKICAgICAgYWxsb3dKczogdHJ1ZSwKICAgICAgY2hlY2tKczogZmFsc2UsCiAgICAgIGFsbG93Tm9uVHNFeHRlbnNpb25zOiB0cnVlLAogICAgICBsaWI6IFsiZXMyMDIwIiwgImRvbSIsICJkb20uaXRlcmFibGUiXSwKICAgICAgLy8gU2V0IGJhc2VVcmwgdG8gcm9vdCBmb3IgcmVzb2x2aW5nIGFic29sdXRlIGltcG9ydHMKICAgICAgYmFzZVVybDogIi8iLAogICAgICAvLyBBbGxvdyBpbXBvcnRpbmcgLnRzIGV4dGVuc2lvbnMgZGlyZWN0bHkgKHVzZWZ1bCBmb3Igc29tZSBzZXR1cHMpCiAgICAgIGFsbG93SW1wb3J0aW5nVHNFeHRlbnNpb25zOiB0cnVlLAogICAgICAvLyBSZXNvbHZlIEpTT04gbW9kdWxlcwogICAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZQogICAgfSk7CiAgICB0cy50eXBlc2NyaXB0RGVmYXVsdHMuc2V0RGlhZ25vc3RpY3NPcHRpb25zKHsKICAgICAgbm9TZW1hbnRpY1ZhbGlkYXRpb246IGZhbHNlLAogICAgICBub1N5bnRheFZhbGlkYXRpb246IGZhbHNlCiAgICB9KTsKICAgIHRzLnR5cGVzY3JpcHREZWZhdWx0cy5zZXRFYWdlck1vZGVsU3luYyh0cnVlKTsKICB9CiAgLyoqCiAgICogUGFyc2UgaW1wb3J0cyBmcm9tIFR5cGVTY3JpcHQvSmF2YVNjcmlwdCBjb250ZW50CiAgICovCiAgcGFyc2VJbXBvcnRzKGNvbnRlbnQzKSB7CiAgICBjb25zdCBpbXBvcnRzID0gW107CiAgICBjb25zdCBpbXBvcnRSZWdleCA9IC9pbXBvcnRccysoPzpbXHcqe31ccyxdK2Zyb21ccyspP1snIl0oW14nIl0rKVsnIl0vZzsKICAgIGxldCBtYXRjaDI7CiAgICB3aGlsZSAoKG1hdGNoMiA9IGltcG9ydFJlZ2V4LmV4ZWMoY29udGVudDMpKSAhPT0gbnVsbCkgewogICAgICBjb25zdCBpbXBvcnRQYXRoID0gbWF0Y2gyWzFdOwogICAgICBpZiAoIWltcG9ydFBhdGguc3RhcnRzV2l0aCgiLiIpICYmICFpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoIi8iKSkgewogICAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gaW1wb3J0UGF0aC5zdGFydHNXaXRoKCJAIikgPyBpbXBvcnRQYXRoLnNwbGl0KCIvIikuc2xpY2UoMCwgMikuam9pbigiLyIpIDogaW1wb3J0UGF0aC5zcGxpdCgiLyIpWzBdOwogICAgICAgIGltcG9ydHMucHVzaChwYWNrYWdlTmFtZSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHJlcXVpcmVSZWdleCA9IC9yZXF1aXJlXHMqXChccypbJyJdKFteJyJdKylbJyJdXHMqXCkvZzsKICAgIHdoaWxlICgobWF0Y2gyID0gcmVxdWlyZVJlZ2V4LmV4ZWMoY29udGVudDMpKSAhPT0gbnVsbCkgewogICAgICBjb25zdCBpbXBvcnRQYXRoID0gbWF0Y2gyWzFdOwogICAgICBpZiAoIWltcG9ydFBhdGguc3RhcnRzV2l0aCgiLiIpICYmICFpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoIi8iKSkgewogICAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gaW1wb3J0UGF0aC5zdGFydHNXaXRoKCJAIikgPyBpbXBvcnRQYXRoLnNwbGl0KCIvIikuc2xpY2UoMCwgMikuam9pbigiLyIpIDogaW1wb3J0UGF0aC5zcGxpdCgiLyIpWzBdOwogICAgICAgIGltcG9ydHMucHVzaChwYWNrYWdlTmFtZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBbLi4ubmV3IFNldChpbXBvcnRzKV07CiAgfQogIC8qKgogICAqIExvYWQgdHlwZSBkZWZpbml0aW9ucyBmb3IgYSBwYWNrYWdlIGZyb20gdmlydHVhbCBGUwogICAqLwogIGFzeW5jIGxvYWRUeXBlc0ZvclBhY2thZ2UocGFja2FnZU5hbWUpIHsKICAgIGlmICghdGhpcy5tb25hY29JbnN0YW5jZSB8fCAhdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCkKICAgICAgcmV0dXJuOwogICAgaWYgKHRoaXMubG9hZGVkTGlicy5oYXMocGFja2FnZU5hbWUpKQogICAgICByZXR1cm47CiAgICBpZiAodGhpcy5ub3RGb3VuZFBhY2thZ2VzLmhhcyhwYWNrYWdlTmFtZSkpCiAgICAgIHJldHVybjsKICAgIHRyeSB7CiAgICAgIGxldCB0eXBlc0xvYWRlZCA9IGF3YWl0IHRoaXMudHJ5TG9hZFBhY2thZ2VUeXBlcyhwYWNrYWdlTmFtZSk7CiAgICAgIGlmICghdHlwZXNMb2FkZWQpIHsKICAgICAgICB0eXBlc0xvYWRlZCA9IGF3YWl0IHRoaXMudHJ5TG9hZEF0VHlwZXNQYWNrYWdlKHBhY2thZ2VOYW1lKTsKICAgICAgfQogICAgICBpZiAodHlwZXNMb2FkZWQpIHsKICAgICAgICB0aGlzLmxvYWRlZExpYnMuYWRkKHBhY2thZ2VOYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLm5vdEZvdW5kUGFja2FnZXMuYWRkKHBhY2thZ2VOYW1lKTsKICAgICAgfQogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gbG9hZCB0eXBlcyBmb3IgJHtwYWNrYWdlTmFtZX06YCwgZXJyb3IpOwogICAgfQogIH0KICBhc3luYyB0cnlMb2FkUGFja2FnZVR5cGVzKHBhY2thZ2VOYW1lKSB7CiAgICBjb25zdCB0cyA9IHRoaXMudHNBcGk7CiAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQgfHwgIXRzKQogICAgICByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBiYXNlUGF0aCA9IGAvbm9kZV9tb2R1bGVzLyR7cGFja2FnZU5hbWV9YDsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGAke2Jhc2VQYXRofS9wYWNrYWdlLmpzb25gOwogICAgICBjb25zdCBwYWNrYWdlSnNvbkV4aXN0cyA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQuZXhpc3RzKHBhY2thZ2VKc29uUGF0aCk7CiAgICAgIGlmIChwYWNrYWdlSnNvbkV4aXN0cykgewogICAgICAgIGNvbnN0IHBhY2thZ2VKc29uQ29udGVudCA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZEZpbGUocGFja2FnZUpzb25QYXRoKTsKICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25Db250ZW50KTsKICAgICAgICB0cy50eXBlc2NyaXB0RGVmYXVsdHMuYWRkRXh0cmFMaWIocGFja2FnZUpzb25Db250ZW50LCBgZmlsZTovLyR7cGFja2FnZUpzb25QYXRofWApOwogICAgICAgIGNvbnN0IHR5cGVzUGF0aCA9IHBhY2thZ2VKc29uLnR5cGVzIHx8IHBhY2thZ2VKc29uLnR5cGluZ3M7CiAgICAgICAgaWYgKHR5cGVzUGF0aCkgewogICAgICAgICAgYXdhaXQgdGhpcy5sb2FkQWxsRHRzRmlsZXNGcm9tUGFja2FnZShiYXNlUGF0aCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgY29tbW9uUGF0aHMgPSBbCiAgICAgICAgYCR7YmFzZVBhdGh9L2luZGV4LmQudHNgLAogICAgICAgIGAke2Jhc2VQYXRofS9kaXN0L2luZGV4LmQudHNgLAogICAgICAgIGAke2Jhc2VQYXRofS9saWIvaW5kZXguZC50c2AKICAgICAgXTsKICAgICAgZm9yIChjb25zdCBkdHNQYXRoIG9mIGNvbW1vblBhdGhzKSB7CiAgICAgICAgaWYgKGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQuZXhpc3RzKGR0c1BhdGgpKSB7CiAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRBbGxEdHNGaWxlc0Zyb21QYWNrYWdlKGJhc2VQYXRoKTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBwYWNrYWdlIHR5cGVzIGZvciAke3BhY2thZ2VOYW1lfTpgLCBlcnJvcik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgLyoqCiAgICogUmVjdXJzaXZlbHkgbG9hZCBhbGwgLmQudHMgZmlsZXMgZnJvbSBhIHBhY2thZ2UgZGlyZWN0b3J5CiAgICovCiAgYXN5bmMgbG9hZEFsbER0c0ZpbGVzRnJvbVBhY2thZ2UoYmFzZVBhdGgpIHsKICAgIGNvbnN0IHRzID0gdGhpcy50c0FwaTsKICAgIGlmICghdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCB8fCAhdHMpCiAgICAgIHJldHVybjsKICAgIGF3YWl0IHRoaXMubG9hZER0c0ZpbGVzRnJvbURpcmVjdG9yeShiYXNlUGF0aCk7CiAgfQogIC8qKgogICAqIFJlY3Vyc2l2ZWx5IGxvYWQgLmQudHMgZmlsZXMgZnJvbSBhIGRpcmVjdG9yeQogICAqLwogIGFzeW5jIGxvYWREdHNGaWxlc0Zyb21EaXJlY3RvcnkoZGlyUGF0aCkgewogICAgY29uc3QgdHMgPSB0aGlzLnRzQXBpOwogICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50IHx8ICF0cykKICAgICAgcmV0dXJuOwogICAgdHJ5IHsKICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZERpcihkaXJQYXRoKTsKICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7CiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBkaXJQYXRoID09PSAiLyIgPyBgLyR7ZW50cnkubmFtZX1gIDogYCR7ZGlyUGF0aH0vJHtlbnRyeS5uYW1lfWA7CiAgICAgICAgaWYgKGVudHJ5Lm5hbWUgPT09ICJub2RlX21vZHVsZXMiKQogICAgICAgICAgY29udGludWU7CiAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09ICJkaXJlY3RvcnkiKSB7CiAgICAgICAgICBhd2FpdCB0aGlzLmxvYWREdHNGaWxlc0Zyb21EaXJlY3RvcnkoZnVsbFBhdGgpOwogICAgICAgIH0gZWxzZSBpZiAoZW50cnkudHlwZSA9PT0gImZpbGUiICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoIi5kLnRzIikpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQzID0gYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5yZWFkRmlsZShmdWxsUGF0aCk7CiAgICAgICAgICAgIHRzLnR5cGVzY3JpcHREZWZhdWx0cy5hZGRFeHRyYUxpYihjb250ZW50MywgYGZpbGU6Ly8ke2Z1bGxQYXRofWApOwogICAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIHsKICAgIH0KICB9CiAgYXN5bmMgdHJ5TG9hZEF0VHlwZXNQYWNrYWdlKHBhY2thZ2VOYW1lKSB7CiAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpCiAgICAgIHJldHVybiBmYWxzZTsKICAgIGNvbnN0IHR5cGVzUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZS5zdGFydHNXaXRoKCJAIikgPyBgQHR5cGVzLyR7cGFja2FnZU5hbWUuc2xpY2UoMSkucmVwbGFjZSgiLyIsICJfXyIpfWAgOiBgQHR5cGVzLyR7cGFja2FnZU5hbWV9YDsKICAgIGNvbnN0IGJhc2VQYXRoID0gYC9ub2RlX21vZHVsZXMvJHt0eXBlc1BhY2thZ2VOYW1lfWA7CiAgICB0cnkgewogICAgICBjb25zdCBpbmRleFBhdGggPSBgJHtiYXNlUGF0aH0vaW5kZXguZC50c2A7CiAgICAgIGlmIChhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LmV4aXN0cyhpbmRleFBhdGgpKSB7CiAgICAgICAgYXdhaXQgdGhpcy5sb2FkQWxsRHRzRmlsZXNGcm9tUGFja2FnZShiYXNlUGF0aCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBjYXRjaCB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgLyoqCiAgICogUHJvY2VzcyBjb250ZW50IGNoYW5nZSBhbmQgbG9hZCB0eXBlcyBmb3IgYW55IG5ldyBpbXBvcnRzCiAgICovCiAgYXN5bmMgcHJvY2Vzc0NvbnRlbnRDaGFuZ2UoY29udGVudDMpIHsKICAgIGNvbnN0IGltcG9ydHMgPSB0aGlzLnBhcnNlSW1wb3J0cyhjb250ZW50Myk7CiAgICBmb3IgKGNvbnN0IHBhY2thZ2VOYW1lIG9mIGltcG9ydHMpIHsKICAgICAgaWYgKCF0aGlzLmxvYWRlZExpYnMuaGFzKHBhY2thZ2VOYW1lKSkgewogICAgICAgIGF3YWl0IHRoaXMubG9hZFR5cGVzRm9yUGFja2FnZShwYWNrYWdlTmFtZSk7CiAgICAgIH0KICAgIH0KICB9CiAgLyoqCiAgICogU2NhbiBub2RlX21vZHVsZXMgZm9yIHBhY2thZ2VzIGFuZCBsb2FkIHR5cGVzIGZvciBhbnkgbm90IHlldCBsb2FkZWQuCiAgICogQ2FsbGVkIHdoZW4gbm9kZV9tb2R1bGVzIGNoYW5nZXMgKGUuZy4sIGFmdGVyIHBucG0gaW5zdGFsbCkuCiAgICovCiAgYXN5bmMgc2NhbkFuZExvYWROZXdQYWNrYWdlVHlwZXMoKSB7CiAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpCiAgICAgIHJldHVybjsKICAgIHRoaXMubm90Rm91bmRQYWNrYWdlcy5jbGVhcigpOwogICAgdHJ5IHsKICAgICAgaWYgKCFhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LmV4aXN0cygiL25vZGVfbW9kdWxlcyIpKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZERpcigiL25vZGVfbW9kdWxlcyIpOwogICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHsKICAgICAgICBpZiAoZW50cnkudHlwZSAhPT0gImRpcmVjdG9yeSIpCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBpZiAoZW50cnkubmFtZS5zdGFydHNXaXRoKCJAIikpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHNjb3BlZFBhdGggPSBgL25vZGVfbW9kdWxlcy8ke2VudHJ5Lm5hbWV9YDsKICAgICAgICAgICAgY29uc3Qgc2NvcGVkRW50cmllcyA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZERpcihzY29wZWRQYXRoKTsKICAgICAgICAgICAgZm9yIChjb25zdCBzY29wZWRFbnRyeSBvZiBzY29wZWRFbnRyaWVzKSB7CiAgICAgICAgICAgICAgaWYgKHNjb3BlZEVudHJ5LnR5cGUgPT09ICJkaXJlY3RvcnkiKSB7CiAgICAgICAgICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGAke2VudHJ5Lm5hbWV9LyR7c2NvcGVkRW50cnkubmFtZX1gOwogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkVHlwZXNGb3JQYWNrYWdlKHBhY2thZ2VOYW1lKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIWVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgiLiIpKSB7CiAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRUeXBlc0ZvclBhY2thZ2UoZW50cnkubmFtZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLndhcm4oIkZhaWxlZCB0byBzY2FuIG5vZGVfbW9kdWxlczoiLCBlcnJvcik7CiAgICB9CiAgfQogIC8qKgogICAqIEFkZCBhIGZpbGUgbW9kZWwgdG8gTW9uYWNvIGZvciBjcm9zcy1maWxlIEludGVsbGlTZW5zZQogICAqIEFsc28gcmVnaXN0ZXJzIHRoZSBmaWxlIHdpdGggVHlwZVNjcmlwdCB2aWEgYWRkRXh0cmFMaWIgZm9yIG1vZHVsZSByZXNvbHV0aW9uCiAgICovCiAgYWRkRmlsZU1vZGVsKHBhdGgyLCBjb250ZW50MykgewogICAgaWYgKCF0aGlzLm1vbmFjb0luc3RhbmNlKQogICAgICByZXR1cm47CiAgICB0aGlzLmZpbGVDYWNoZS5zZXQocGF0aDIsIGNvbnRlbnQzKTsKICAgIGNvbnN0IHVyaSA9IHRoaXMubW9uYWNvSW5zdGFuY2UuVXJpLnBhcnNlKGBmaWxlOi8vJHtwYXRoMn1gKTsKICAgIGNvbnN0IGV4aXN0aW5nTW9kZWwgPSB0aGlzLm1vbmFjb0luc3RhbmNlLmVkaXRvci5nZXRNb2RlbCh1cmkpOwogICAgaWYgKGV4aXN0aW5nTW9kZWwpIHsKICAgICAgaWYgKGV4aXN0aW5nTW9kZWwuZ2V0VmFsdWUoKSAhPT0gY29udGVudDMpIHsKICAgICAgICBleGlzdGluZ01vZGVsLnNldFZhbHVlKGNvbnRlbnQzKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY29uc3QgbGFuZ3VhZ2UgPSB0aGlzLmdldExhbmd1YWdlRnJvbVBhdGgocGF0aDIpOwogICAgICB0aGlzLm1vbmFjb0luc3RhbmNlLmVkaXRvci5jcmVhdGVNb2RlbChjb250ZW50MywgbGFuZ3VhZ2UsIHVyaSk7CiAgICB9CiAgICB0aGlzLmFkZEZpbGVBc0V4dHJhTGliKHBhdGgyLCBjb250ZW50Myk7CiAgfQogIC8qKgogICAqIEFkZCBhIGZpbGUgYXMgYW4gZXh0cmEgbGliIGZvciBUeXBlU2NyaXB0IG1vZHVsZSByZXNvbHV0aW9uLgogICAqIFRoaXMgZW5hYmxlcyBUeXBlU2NyaXB0IHRvIHJlc29sdmUgaW1wb3J0cyB0byBwcm9qZWN0IGZpbGVzLgogICAqLwogIGFkZEZpbGVBc0V4dHJhTGliKHBhdGgyLCBjb250ZW50MykgewogICAgY29uc3QgdHMgPSB0aGlzLnRzQXBpOwogICAgaWYgKCF0cykKICAgICAgcmV0dXJuOwogICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmFkZGVkRXh0cmFMaWJzLmdldChwYXRoMik7CiAgICBpZiAoZXhpc3RpbmcpIHsKICAgICAgZXhpc3RpbmcuZGlzcG9zZSgpOwogICAgfQogICAgY29uc3QgZmlsZVBhdGggPSBgZmlsZTovLyR7cGF0aDJ9YDsKICAgIGNvbnN0IGRpc3Bvc2FibGUgPSB0cy50eXBlc2NyaXB0RGVmYXVsdHMuYWRkRXh0cmFMaWIoY29udGVudDMsIGZpbGVQYXRoKTsKICAgIHRoaXMuYWRkZWRFeHRyYUxpYnMuc2V0KHBhdGgyLCBkaXNwb3NhYmxlKTsKICAgIGlmIChwYXRoMi5lbmRzV2l0aCgiLnRzIikgJiYgIXBhdGgyLmVuZHNXaXRoKCIuZC50cyIpKSB7CiAgICAgIGNvbnN0IGpzUGF0aCA9IHBhdGgyLnJlcGxhY2UoL1wudHMkLywgIi5qcyIpOwogICAgICBjb25zdCBqc0ZpbGVQYXRoID0gYGZpbGU6Ly8ke2pzUGF0aH1gOwogICAgICBjb25zdCBqc0Rpc3Bvc2FibGUgPSB0cy50eXBlc2NyaXB0RGVmYXVsdHMuYWRkRXh0cmFMaWIoY29udGVudDMsIGpzRmlsZVBhdGgpOwogICAgICB0aGlzLmFkZGVkRXh0cmFMaWJzLnNldChqc1BhdGgsIGpzRGlzcG9zYWJsZSk7CiAgICAgIHRoaXMuZmlsZUNhY2hlLnNldChqc1BhdGgsIGNvbnRlbnQzKTsKICAgIH0gZWxzZSBpZiAocGF0aDIuZW5kc1dpdGgoIi50c3giKSkgewogICAgICBjb25zdCBqc3hQYXRoID0gcGF0aDIucmVwbGFjZSgvXC50c3gkLywgIi5qc3giKTsKICAgICAgY29uc3QganN4RmlsZVBhdGggPSBgZmlsZTovLyR7anN4UGF0aH1gOwogICAgICBjb25zdCBqc3hEaXNwb3NhYmxlID0gdHMudHlwZXNjcmlwdERlZmF1bHRzLmFkZEV4dHJhTGliKGNvbnRlbnQzLCBqc3hGaWxlUGF0aCk7CiAgICAgIHRoaXMuYWRkZWRFeHRyYUxpYnMuc2V0KGpzeFBhdGgsIGpzeERpc3Bvc2FibGUpOwogICAgICB0aGlzLmZpbGVDYWNoZS5zZXQoanN4UGF0aCwgY29udGVudDMpOwogICAgfQogIH0KICAvKioKICAgKiBHZXQgY2FjaGVkIGZpbGUgY29udGVudCBmb3Igc3luY2hyb25vdXMgYWNjZXNzCiAgICovCiAgZ2V0RmlsZUNvbnRlbnQocGF0aDIpIHsKICAgIHJldHVybiB0aGlzLmZpbGVDYWNoZS5nZXQocGF0aDIpOwogIH0KICBnZXRMYW5ndWFnZUZyb21QYXRoKHBhdGgyKSB7CiAgICBjb25zdCBleHQgPSBwYXRoMi5zcGxpdCgiLiIpLnBvcCgpPy50b0xvd2VyQ2FzZSgpOwogICAgc3dpdGNoIChleHQpIHsKICAgICAgY2FzZSAidHMiOgogICAgICBjYXNlICJ0c3giOgogICAgICAgIHJldHVybiAidHlwZXNjcmlwdCI7CiAgICAgIGNhc2UgImpzIjoKICAgICAgY2FzZSAianN4IjoKICAgICAgICByZXR1cm4gImphdmFzY3JpcHQiOwogICAgICBjYXNlICJqc29uIjoKICAgICAgICByZXR1cm4gImpzb24iOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAicGxhaW50ZXh0IjsKICAgIH0KICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtd29ya3NwYWNlL2RlZXMtd29ya3NwYWNlLWRpZmYtZWRpdG9yL2RlZXMtd29ya3NwYWNlLWRpZmYtZWRpdG9yLmpzCmluaXRfZGlzdF90czMwKCk7CmluaXRfZGlzdF90czI5KCk7CmluaXRfdGhlbWUoKTsKdmFyIF9fZXNEZWNvcmF0ZTk3ID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnM5OCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgRGVlc1dvcmtzcGFjZURpZmZFZGl0b3IgPSAoKCkgPT4gewogIGxldCBfY2xhc3NEZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQoImRlZXMtd29ya3NwYWNlLWRpZmYtZWRpdG9yIildOwogIGxldCBfY2xhc3NEZXNjcmlwdG9yOwogIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY2xhc3NUaGlzOwogIGxldCBfY2xhc3NTdXBlciA9IERlZXNFbGVtZW50OwogIGxldCBfb3JpZ2luYWxDb250ZW50X2RlY29yYXRvcnM7CiAgbGV0IF9vcmlnaW5hbENvbnRlbnRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vcmlnaW5hbENvbnRlbnRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21vZGlmaWVkQ29udGVudF9kZWNvcmF0b3JzOwogIGxldCBfbW9kaWZpZWRDb250ZW50X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW9kaWZpZWRDb250ZW50X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9vcmlnaW5hbExhYmVsX2RlY29yYXRvcnM7CiAgbGV0IF9vcmlnaW5hbExhYmVsX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfb3JpZ2luYWxMYWJlbF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfbW9kaWZpZWRMYWJlbF9kZWNvcmF0b3JzOwogIGxldCBfbW9kaWZpZWRMYWJlbF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21vZGlmaWVkTGFiZWxfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xhbmd1YWdlX2RlY29yYXRvcnM7CiAgbGV0IF9sYW5ndWFnZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2xhbmd1YWdlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWxlUGF0aF9kZWNvcmF0b3JzOwogIGxldCBfZmlsZVBhdGhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWxlUGF0aF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIHZhciBEZWVzV29ya3NwYWNlRGlmZkVkaXRvcjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9vcmlnaW5hbENvbnRlbnRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9tb2RpZmllZENvbnRlbnRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9vcmlnaW5hbExhYmVsX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfbW9kaWZpZWRMYWJlbF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogU3RyaW5nIH0pXTsKICAgICAgX2xhbmd1YWdlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBTdHJpbmcgfSldOwogICAgICBfZmlsZVBhdGhfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IFN0cmluZyB9KV07CiAgICAgIF9fZXNEZWNvcmF0ZTk3KHRoaXMsIG51bGwsIF9vcmlnaW5hbENvbnRlbnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAib3JpZ2luYWxDb250ZW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJvcmlnaW5hbENvbnRlbnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoub3JpZ2luYWxDb250ZW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5vcmlnaW5hbENvbnRlbnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfb3JpZ2luYWxDb250ZW50X2luaXRpYWxpemVycywgX29yaWdpbmFsQ29udGVudF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk3KHRoaXMsIG51bGwsIF9tb2RpZmllZENvbnRlbnRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibW9kaWZpZWRDb250ZW50Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtb2RpZmllZENvbnRlbnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubW9kaWZpZWRDb250ZW50LCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5tb2RpZmllZENvbnRlbnQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbW9kaWZpZWRDb250ZW50X2luaXRpYWxpemVycywgX21vZGlmaWVkQ29udGVudF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk3KHRoaXMsIG51bGwsIF9vcmlnaW5hbExhYmVsX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogIm9yaWdpbmFsTGFiZWwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm9yaWdpbmFsTGFiZWwiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoub3JpZ2luYWxMYWJlbCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoub3JpZ2luYWxMYWJlbCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9vcmlnaW5hbExhYmVsX2luaXRpYWxpemVycywgX29yaWdpbmFsTGFiZWxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5Nyh0aGlzLCBudWxsLCBfbW9kaWZpZWRMYWJlbF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJtb2RpZmllZExhYmVsIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtb2RpZmllZExhYmVsIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLm1vZGlmaWVkTGFiZWwsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm1vZGlmaWVkTGFiZWwgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbW9kaWZpZWRMYWJlbF9pbml0aWFsaXplcnMsIF9tb2RpZmllZExhYmVsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTcodGhpcywgbnVsbCwgX2xhbmd1YWdlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImxhbmd1YWdlIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJsYW5ndWFnZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5sYW5ndWFnZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmoubGFuZ3VhZ2UgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbGFuZ3VhZ2VfaW5pdGlhbGl6ZXJzLCBfbGFuZ3VhZ2VfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5Nyh0aGlzLCBudWxsLCBfZmlsZVBhdGhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZmlsZVBhdGgiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImZpbGVQYXRoIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmZpbGVQYXRoLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5maWxlUGF0aCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9maWxlUGF0aF9pbml0aWFsaXplcnMsIF9maWxlUGF0aF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk3KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1dvcmtzcGFjZURpZmZFZGl0b3IyID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7CiAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3NUaGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTsKICAgIH0KICAgIC8vIERFTU8KICAgIHN0YXRpYyBkZW1vID0gKCkgPT4gYjJgCiAgICA8ZGVlcy13b3Jrc3BhY2UtZGlmZi1lZGl0b3IKICAgICAgLm9yaWdpbmFsQ29udGVudD0keydmdW5jdGlvbiBoZWxsbygpIHtcbiAgY29uc29sZS5sb2coIkhlbGxvIik7XG59J30KICAgICAgLm1vZGlmaWVkQ29udGVudD0keydmdW5jdGlvbiBoZWxsbygpIHtcbiAgY29uc29sZS5sb2coIkhlbGxvIFdvcmxkISIpO1xuICByZXR1cm4gdHJ1ZTtcbn0nfQogICAgICAubGFuZ3VhZ2U9JHsidHlwZXNjcmlwdCJ9CiAgICAgIC5maWxlUGF0aD0keyIvZGVtby9leGFtcGxlLnRzIn0KICAgID48L2RlZXMtd29ya3NwYWNlLWRpZmYtZWRpdG9yPgogIGA7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiV29ya3NwYWNlIl07CiAgICAvLyBJTlNUQU5DRQogICAgZGlmZkVkaXRvckRlZmVycmVkID0gZG9tdG9vbHNfcGx1Z2luZXhwb3J0c19leHBvcnRzLnNtYXJ0cHJvbWlzZS5kZWZlcigpOwogICAgI29yaWdpbmFsQ29udGVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM5OCh0aGlzLCBfb3JpZ2luYWxDb250ZW50X2luaXRpYWxpemVycywgIiIpOwogICAgZ2V0IG9yaWdpbmFsQ29udGVudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI29yaWdpbmFsQ29udGVudF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG9yaWdpbmFsQ29udGVudCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jb3JpZ2luYWxDb250ZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjbW9kaWZpZWRDb250ZW50X2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5OCh0aGlzLCBfb3JpZ2luYWxDb250ZW50X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5OCh0aGlzLCBfbW9kaWZpZWRDb250ZW50X2luaXRpYWxpemVycywgIiIpKTsKICAgIGdldCBtb2RpZmllZENvbnRlbnQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNtb2RpZmllZENvbnRlbnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBtb2RpZmllZENvbnRlbnQodmFsdWUyKSB7CiAgICAgIHRoaXMuI21vZGlmaWVkQ29udGVudF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI29yaWdpbmFsTGFiZWxfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk4KHRoaXMsIF9tb2RpZmllZENvbnRlbnRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk4KHRoaXMsIF9vcmlnaW5hbExhYmVsX2luaXRpYWxpemVycywgIkRpc2sgVmVyc2lvbiIpKTsKICAgIGdldCBvcmlnaW5hbExhYmVsKCkgewogICAgICByZXR1cm4gdGhpcy4jb3JpZ2luYWxMYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG9yaWdpbmFsTGFiZWwodmFsdWUyKSB7CiAgICAgIHRoaXMuI29yaWdpbmFsTGFiZWxfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtb2RpZmllZExhYmVsX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5OCh0aGlzLCBfb3JpZ2luYWxMYWJlbF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTgodGhpcywgX21vZGlmaWVkTGFiZWxfaW5pdGlhbGl6ZXJzLCAiTG9jYWwgVmVyc2lvbiIpKTsKICAgIGdldCBtb2RpZmllZExhYmVsKCkgewogICAgICByZXR1cm4gdGhpcy4jbW9kaWZpZWRMYWJlbF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1vZGlmaWVkTGFiZWwodmFsdWUyKSB7CiAgICAgIHRoaXMuI21vZGlmaWVkTGFiZWxfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNsYW5ndWFnZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTgodGhpcywgX21vZGlmaWVkTGFiZWxfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk4KHRoaXMsIF9sYW5ndWFnZV9pbml0aWFsaXplcnMsICJ0eXBlc2NyaXB0IikpOwogICAgZ2V0IGxhbmd1YWdlKCkgewogICAgICByZXR1cm4gdGhpcy4jbGFuZ3VhZ2VfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBsYW5ndWFnZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbGFuZ3VhZ2VfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNmaWxlUGF0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTgodGhpcywgX2xhbmd1YWdlX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5OCh0aGlzLCBfZmlsZVBhdGhfaW5pdGlhbGl6ZXJzLCAiIikpOwogICAgZ2V0IGZpbGVQYXRoKCkgewogICAgICByZXR1cm4gdGhpcy4jZmlsZVBhdGhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBmaWxlUGF0aCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZmlsZVBhdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGRpZmZFZGl0b3IgPSAoX19ydW5Jbml0aWFsaXplcnM5OCh0aGlzLCBfZmlsZVBhdGhfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgIG1vbmFjb1RoZW1lU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgIG9yaWdpbmFsTW9kZWwgPSBudWxsOwogICAgbW9kaWZpZWRNb2RlbCA9IG51bGw7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgRG9tVG9vbHMuc2V0dXBEb21Ub29scygpOwogICAgfQogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICB9CgogICAgICAqIHsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAuZGlmZi13cmFwcGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuZGlmZi10b29sYmFyIHsKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBwYWRkaW5nOiAwIDE2cHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk2JSkiLCAiaHNsKDAgMCUgMTIlKSIpfTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg1JSkiLCAiaHNsKDAgMCUgMjAlKSIpfTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLmRpZmYtaW5mbyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAzMCUpIiwgImhzbCgwIDAlIDgwJSkiKX07CiAgICAgIH0KCiAgICAgIC5kaWZmLWZpbGVuYW1lIHsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMjAlKSIsICJoc2woMCAwJSA5MCUpIil9OwogICAgICB9CgogICAgICAuZGlmZi1sYWJlbHMgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDUwJSkiLCAiaHNsKDAgMCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLmRpZmYtYWN0aW9ucyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICB9CgogICAgICAuZGlmZi1jb250YWluZXIgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLWhlaWdodDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLm5hdi1idXR0b25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogNHB4OwogICAgICB9CgogICAgICAuYWN0aW9uLWJ1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDE2cHg7CiAgICAgIH0KICAgIGAKICAgIF07CiAgICByZW5kZXIoKSB7CiAgICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5maWxlUGF0aC5zcGxpdCgiLyIpLnBvcCgpIHx8ICJmaWxlIjsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJkaWZmLXdyYXBwZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImRpZmYtdG9vbGJhciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWZmLWluZm8iPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGlmZi1maWxlbmFtZSI+JHtmaWxlTmFtZX08L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkaWZmLWxhYmVscyI+JHt0aGlzLm9yaWdpbmFsTGFiZWx9IOKGlCAke3RoaXMubW9kaWZpZWRMYWJlbH08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRpZmYtYWN0aW9ucyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1idXR0b25zIj4KICAgICAgICAgICAgICA8ZGVlcy1idXR0b24KICAgICAgICAgICAgICAgIHR5cGU9Im91dGxpbmUiCiAgICAgICAgICAgICAgICBAY2xpY2s9JHt0aGlzLmdvVG9QcmV2aW91c0RpZmZ9CiAgICAgICAgICAgICAgPlByZXZpb3VzPC9kZWVzLWJ1dHRvbj4KICAgICAgICAgICAgICA8ZGVlcy1idXR0b24KICAgICAgICAgICAgICAgIHR5cGU9Im91dGxpbmUiCiAgICAgICAgICAgICAgICBAY2xpY2s9JHt0aGlzLmdvVG9OZXh0RGlmZn0KICAgICAgICAgICAgICA+TmV4dDwvZGVlcy1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJhY3Rpb24tYnV0dG9ucyI+CiAgICAgICAgICAgICAgPGRlZXMtYnV0dG9uCiAgICAgICAgICAgICAgICB0eXBlPSJoaWdobGlnaHRlZCIKICAgICAgICAgICAgICAgIEBjbGljaz0ke3RoaXMuYWNjZXB0TG9jYWx9CiAgICAgICAgICAgICAgPlVzZSBMb2NhbDwvZGVlcy1idXR0b24+CiAgICAgICAgICAgICAgPGRlZXMtYnV0dG9uCiAgICAgICAgICAgICAgICB0eXBlPSJvdXRsaW5lIgogICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy5hY2NlcHREaXNrfQogICAgICAgICAgICAgID5Vc2UgRGlzazwvZGVlcy1idXR0b24+CiAgICAgICAgICAgICAgPGRlZXMtYnV0dG9uCiAgICAgICAgICAgICAgICB0eXBlPSJvdXRsaW5lIgogICAgICAgICAgICAgICAgQGNsaWNrPSR7dGhpcy5jbG9zZX0KICAgICAgICAgICAgICA+Q2xvc2U8L2RlZXMtYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImRpZmYtY29udGFpbmVyIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogICAgfQogICAgYXN5bmMgZmlyc3RVcGRhdGVkKCkgewogICAgICBhd2FpdCBzdXBlci5maXJzdFVwZGF0ZWQoLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSk7CiAgICAgIGF3YWl0IHRoaXMuaW5pdERpZmZFZGl0b3IoKTsKICAgIH0KICAgIGFzeW5jIGluaXREaWZmRWRpdG9yKCkgewogICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoIi5kaWZmLWNvbnRhaW5lciIpOwogICAgICBpZiAoIWNvbnRhaW5lcikKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IG1vbmFjb0NkbkJhc2UgPSBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9tb25hY28tZWRpdG9yQCR7TU9OQUNPX1ZFUlNJT059YDsKICAgICAgbGV0IG1vbmFjb0luc3RhbmNlID0gd2luZG93Lm1vbmFjbzsKICAgICAgaWYgKCFtb25hY29JbnN0YW5jZSkgewogICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlMikgPT4gewogICAgICAgICAgY29uc3QgY2hlY2tNb25hY28gPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgIGlmICh3aW5kb3cubW9uYWNvKSB7CiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChjaGVja01vbmFjbyk7CiAgICAgICAgICAgICAgcmVzb2x2ZTIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgMTAwKTsKICAgICAgICB9KTsKICAgICAgICBtb25hY29JbnN0YW5jZSA9IHdpbmRvdy5tb25hY287CiAgICAgIH0KICAgICAgY29uc3QgZG9tdG9vbHNJbnN0YW5jZSA9IGF3YWl0IHRoaXMuZG9tdG9vbHNQcm9taXNlOwogICAgICBjb25zdCBpc0JyaWdodCA9IGRvbXRvb2xzSW5zdGFuY2UudGhlbWVNYW5hZ2VyLmdvQnJpZ2h0Qm9vbGVhbjsKICAgICAgY29uc3QgaW5pdGlhbFRoZW1lID0gaXNCcmlnaHQgPyAidnMiIDogInZzLWRhcmsiOwogICAgICBjb25zdCB0aW1lc3RhbXAyID0gRGF0ZS5ub3coKTsKICAgICAgY29uc3Qgb3JpZ2luYWxVcmkgPSBtb25hY29JbnN0YW5jZS5VcmkucGFyc2UoYGRpZmY6Ly9vcmlnaW5hbC8ke3RpbWVzdGFtcDJ9JHt0aGlzLmZpbGVQYXRofWApOwogICAgICBjb25zdCBtb2RpZmllZFVyaSA9IG1vbmFjb0luc3RhbmNlLlVyaS5wYXJzZShgZGlmZjovL21vZGlmaWVkLyR7dGltZXN0YW1wMn0ke3RoaXMuZmlsZVBhdGh9YCk7CiAgICAgIHRoaXMub3JpZ2luYWxNb2RlbCA9IG1vbmFjb0luc3RhbmNlLmVkaXRvci5jcmVhdGVNb2RlbCh0aGlzLm9yaWdpbmFsQ29udGVudCwgdGhpcy5sYW5ndWFnZSwgb3JpZ2luYWxVcmkpOwogICAgICB0aGlzLm1vZGlmaWVkTW9kZWwgPSBtb25hY29JbnN0YW5jZS5lZGl0b3IuY3JlYXRlTW9kZWwodGhpcy5tb2RpZmllZENvbnRlbnQsIHRoaXMubGFuZ3VhZ2UsIG1vZGlmaWVkVXJpKTsKICAgICAgdGhpcy5kaWZmRWRpdG9yID0gbW9uYWNvSW5zdGFuY2UuZWRpdG9yLmNyZWF0ZURpZmZFZGl0b3IoY29udGFpbmVyLCB7CiAgICAgICAgYXV0b21hdGljTGF5b3V0OiB0cnVlLAogICAgICAgIHJlYWRPbmx5OiBmYWxzZSwKICAgICAgICAvLyBBbGxvdyBlZGl0aW5nIHRoZSBtb2RpZmllZCAobG9jYWwpIHNpZGUKICAgICAgICBvcmlnaW5hbEVkaXRhYmxlOiBmYWxzZSwKICAgICAgICAvLyBEaXNrIHZlcnNpb24gaXMgcmVhZC1vbmx5CiAgICAgICAgcmVuZGVyU2lkZUJ5U2lkZTogdHJ1ZSwKICAgICAgICBpZ25vcmVUcmltV2hpdGVzcGFjZTogZmFsc2UsCiAgICAgICAgZm9udFNpemU6IDE0LAogICAgICAgIG1pbmltYXA6IHsKICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlCiAgICAgICAgfQogICAgICB9KTsKICAgICAgbW9uYWNvSW5zdGFuY2UuZWRpdG9yLnNldFRoZW1lKGluaXRpYWxUaGVtZSk7CiAgICAgIHRoaXMuZGlmZkVkaXRvci5zZXRNb2RlbCh7CiAgICAgICAgb3JpZ2luYWw6IHRoaXMub3JpZ2luYWxNb2RlbCwKICAgICAgICBtb2RpZmllZDogdGhpcy5tb2RpZmllZE1vZGVsCiAgICAgIH0pOwogICAgICB0aGlzLm1vbmFjb1RoZW1lU3Vic2NyaXB0aW9uID0gZG9tdG9vbHNJbnN0YW5jZS50aGVtZU1hbmFnZXIudGhlbWVPYnNlcnZhYmxlLnN1YnNjcmliZSgoZ29CcmlnaHQpID0+IHsKICAgICAgICBjb25zdCBuZXdUaGVtZSA9IGdvQnJpZ2h0ID8gInZzIiA6ICJ2cy1kYXJrIjsKICAgICAgICBtb25hY29JbnN0YW5jZS5lZGl0b3Iuc2V0VGhlbWUobmV3VGhlbWUpOwogICAgICB9KTsKICAgICAgY29uc3QgY3NzSWQgPSAibW9uYWNvLWRpZmYtZWRpdG9yLWNzcyI7CiAgICAgIGlmICghdGhpcy5zaGFkb3dSb290Py5nZXRFbGVtZW50QnlJZChjc3NJZCkpIHsKICAgICAgICBjb25zdCBjc3NSZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke21vbmFjb0NkbkJhc2V9L21pbi92cy9lZGl0b3IvZWRpdG9yLm1haW4uY3NzYCk7CiAgICAgICAgY29uc3QgY3NzVGV4dCA9IGF3YWl0IGNzc1Jlc3BvbnNlLnRleHQoKTsKICAgICAgICBjb25zdCBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICAgIHN0eWxlRWxlbWVudC5pZCA9IGNzc0lkOwogICAgICAgIHN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IGNzc1RleHQ7CiAgICAgICAgdGhpcy5zaGFkb3dSb290Py5hcHBlbmQoc3R5bGVFbGVtZW50KTsKICAgICAgfQogICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICB0cnkgewogICAgICAgICAgdGhpcy5kaWZmRWRpdG9yPy5yZXZlYWxGaXJzdERpZmYoKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgIH0sIDEwMCk7CiAgICAgIHRoaXMuZGlmZkVkaXRvckRlZmVycmVkLnJlc29sdmUodGhpcy5kaWZmRWRpdG9yKTsKICAgIH0KICAgIGdvVG9OZXh0RGlmZigpIHsKICAgICAgdHJ5IHsKICAgICAgICB0aGlzLmRpZmZFZGl0b3I/LmdvVG9EaWZmKCJuZXh0Iik7CiAgICAgIH0gY2F0Y2ggewogICAgICB9CiAgICB9CiAgICBnb1RvUHJldmlvdXNEaWZmKCkgewogICAgICB0cnkgewogICAgICAgIHRoaXMuZGlmZkVkaXRvcj8uZ29Ub0RpZmYoInByZXZpb3VzIik7CiAgICAgIH0gY2F0Y2ggewogICAgICB9CiAgICB9CiAgICBhY2NlcHRMb2NhbCgpIHsKICAgICAgY29uc3QgbW9kaWZpZWRDb250ZW50ID0gdGhpcy5kaWZmRWRpdG9yPy5nZXRNb2RpZmllZEVkaXRvcigpLmdldFZhbHVlKCkgfHwgdGhpcy5tb2RpZmllZENvbnRlbnQ7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImRpZmYtcmVzb2x2ZWQiLCB7CiAgICAgICAgZGV0YWlsOiB7IGFjdGlvbjogInVzZS1sb2NhbCIsIGNvbnRlbnQ6IG1vZGlmaWVkQ29udGVudCB9LAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgYWNjZXB0RGlzaygpIHsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiZGlmZi1yZXNvbHZlZCIsIHsKICAgICAgICBkZXRhaWw6IHsgYWN0aW9uOiAidXNlLWRpc2siLCBjb250ZW50OiB0aGlzLm9yaWdpbmFsQ29udGVudCB9LAogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgY2xvc2UoKSB7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImRpZmYtY2xvc2VkIiwgewogICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgfSkpOwogICAgfQogICAgYXN5bmMgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIGlmICh0aGlzLm1vbmFjb1RoZW1lU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgdGhpcy5tb25hY29UaGVtZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgIHRoaXMubW9uYWNvVGhlbWVTdWJzY3JpcHRpb24gPSBudWxsOwogICAgICB9CiAgICAgIGlmICh0aGlzLm9yaWdpbmFsTW9kZWwpIHsKICAgICAgICB0aGlzLm9yaWdpbmFsTW9kZWwuZGlzcG9zZSgpOwogICAgICAgIHRoaXMub3JpZ2luYWxNb2RlbCA9IG51bGw7CiAgICAgIH0KICAgICAgaWYgKHRoaXMubW9kaWZpZWRNb2RlbCkgewogICAgICAgIHRoaXMubW9kaWZpZWRNb2RlbC5kaXNwb3NlKCk7CiAgICAgICAgdGhpcy5tb2RpZmllZE1vZGVsID0gbnVsbDsKICAgICAgfQogICAgICBpZiAodGhpcy5kaWZmRWRpdG9yKSB7CiAgICAgICAgdGhpcy5kaWZmRWRpdG9yLmRpc3Bvc2UoKTsKICAgICAgICB0aGlzLmRpZmZFZGl0b3IgPSBudWxsOwogICAgICB9CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczk4KF9jbGFzc1RoaXMsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgIH0KICB9OwogIHJldHVybiBEZWVzV29ya3NwYWNlRGlmZkVkaXRvcjIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXdvcmtzcGFjZS9kZWVzLXdvcmtzcGFjZS9kZWVzLXdvcmtzcGFjZS5qcwppbml0X2Rpc3RfdHMzMCgpOwppbml0X2Rpc3RfdHMyOSgpOwppbml0X3RoZW1lKCk7CmluaXRfZ3JvdXBfcnVudGltZSgpOwppbml0X2RlZXNfd29ya3NwYWNlX3Rlcm1pbmFsKCk7CmluaXRfZGVlc193b3Jrc3BhY2VfdGVybWluYWwoKTsKaW5pdF9kZWVzX2ljb24oKTsKaW5pdF9kZWVzX2FjdGlvbmJhcigpOwp2YXIgX19lc0RlY29yYXRlOTggPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczk5ID0gZnVuY3Rpb24odGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZTIpIHsKICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjsKICBmb3IgKHZhciBpMTEgPSAwOyBpMTEgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpMTErKykgewogICAgdmFsdWUyID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcsIHZhbHVlMikgOiBpbml0aWFsaXplcnNbaTExXS5jYWxsKHRoaXNBcmcpOwogIH0KICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZTIgOiB2b2lkIDA7Cn07CnZhciBEZWVzV29ya3NwYWNlID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLXdvcmtzcGFjZSIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX2V4ZWN1dGlvbkVudmlyb25tZW50X2RlY29yYXRvcnM7CiAgbGV0IF9leGVjdXRpb25FbnZpcm9ubWVudF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2V4ZWN1dGlvbkVudmlyb25tZW50X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pbml0aWFsaXphdGlvblByb21pc2VfZGVjb3JhdG9yczsKICBsZXQgX2luaXRpYWxpemF0aW9uUHJvbWlzZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2luaXRpYWxpemF0aW9uUHJvbWlzZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0ZpbGVUcmVlX2RlY29yYXRvcnM7CiAgbGV0IF9zaG93RmlsZVRyZWVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93RmlsZVRyZWVfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX3Nob3dUZXJtaW5hbF9kZWNvcmF0b3JzOwogIGxldCBfc2hvd1Rlcm1pbmFsX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd1Rlcm1pbmFsX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9maWxlVHJlZVdpZHRoX2RlY29yYXRvcnM7CiAgbGV0IF9maWxlVHJlZVdpZHRoX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfZmlsZVRyZWVXaWR0aF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGVybWluYWxIZWlnaHRfZGVjb3JhdG9yczsKICBsZXQgX3Rlcm1pbmFsSGVpZ2h0X2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfdGVybWluYWxIZWlnaHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX29wZW5GaWxlc19kZWNvcmF0b3JzOwogIGxldCBfb3BlbkZpbGVzX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfb3BlbkZpbGVzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY3RpdmVGaWxlUGF0aF9kZWNvcmF0b3JzOwogIGxldCBfYWN0aXZlRmlsZVBhdGhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hY3RpdmVGaWxlUGF0aF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNUZXJtaW5hbENvbGxhcHNlZF9kZWNvcmF0b3JzOwogIGxldCBfaXNUZXJtaW5hbENvbGxhcHNlZF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzVGVybWluYWxDb2xsYXBzZWRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzRmlsZVRyZWVDb2xsYXBzZWRfZGVjb3JhdG9yczsKICBsZXQgX2lzRmlsZVRyZWVDb2xsYXBzZWRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0ZpbGVUcmVlQ29sbGFwc2VkX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0luaXRpYWxpemluZ19kZWNvcmF0b3JzOwogIGxldCBfaXNJbml0aWFsaXppbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0luaXRpYWxpemluZ19leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWN0aXZlQm90dG9tUGFuZWxfZGVjb3JhdG9yczsKICBsZXQgX2FjdGl2ZUJvdHRvbVBhbmVsX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfYWN0aXZlQm90dG9tUGFuZWxfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RpYWdub3N0aWNNYXJrZXJzX2RlY29yYXRvcnM7CiAgbGV0IF9kaWFnbm9zdGljTWFya2Vyc19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RpYWdub3N0aWNNYXJrZXJzX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdXRvU2F2ZV9kZWNvcmF0b3JzOwogIGxldCBfYXV0b1NhdmVfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9hdXRvU2F2ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW5pdENvbW1hbmRfZGVjb3JhdG9yczsKICBsZXQgX2luaXRDb21tYW5kX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaW5pdENvbW1hbmRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2luaXRPdXRwdXRfZGVjb3JhdG9yczsKICBsZXQgX2luaXRPdXRwdXRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pbml0T3V0cHV0X2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50RmlsZVRyZWVXaWR0aF9kZWNvcmF0b3JzOwogIGxldCBfY3VycmVudEZpbGVUcmVlV2lkdGhfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50RmlsZVRyZWVXaWR0aF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VycmVudFRlcm1pbmFsSGVpZ2h0X2RlY29yYXRvcnM7CiAgbGV0IF9jdXJyZW50VGVybWluYWxIZWlnaHRfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jdXJyZW50VGVybWluYWxIZWlnaHRfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzRHJhZ2dpbmdGaWxlVHJlZV9kZWNvcmF0b3JzOwogIGxldCBfaXNEcmFnZ2luZ0ZpbGVUcmVlX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfaXNEcmFnZ2luZ0ZpbGVUcmVlX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0RyYWdnaW5nVGVybWluYWxfZGVjb3JhdG9yczsKICBsZXQgX2lzRHJhZ2dpbmdUZXJtaW5hbF9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzRHJhZ2dpbmdUZXJtaW5hbF9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfc2hvd0RpZmZWaWV3X2RlY29yYXRvcnM7CiAgbGV0IF9zaG93RGlmZlZpZXdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zaG93RGlmZlZpZXdfZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RpZmZWaWV3Q29uZmlnX2RlY29yYXRvcnM7CiAgbGV0IF9kaWZmVmlld0NvbmZpZ19pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2RpZmZWaWV3Q29uZmlnX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNXb3Jrc3BhY2UyID0gY2xhc3MgZXh0ZW5kcyBfY2xhc3NTdXBlciB7CiAgICBzdGF0aWMgewogICAgICBfY2xhc3NUaGlzID0gdGhpczsKICAgIH0KICAgIHN0YXRpYyB7CiAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwOwogICAgICBfZXhlY3V0aW9uRW52aXJvbm1lbnRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE9iamVjdCB9KV07CiAgICAgIF9pbml0aWFsaXphdGlvblByb21pc2VfZGVjb3JhdG9ycyA9IFtuNSh7IGF0dHJpYnV0ZTogZmFsc2UgfSldOwogICAgICBfc2hvd0ZpbGVUcmVlX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBCb29sZWFuIH0pXTsKICAgICAgX3Nob3dUZXJtaW5hbF9kZWNvcmF0b3JzID0gW241KHsgdHlwZTogQm9vbGVhbiB9KV07CiAgICAgIF9maWxlVHJlZVdpZHRoX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfdGVybWluYWxIZWlnaHRfZGVjb3JhdG9ycyA9IFtuNSh7IHR5cGU6IE51bWJlciB9KV07CiAgICAgIF9vcGVuRmlsZXNfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2FjdGl2ZUZpbGVQYXRoX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pc1Rlcm1pbmFsQ29sbGFwc2VkX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pc0ZpbGVUcmVlQ29sbGFwc2VkX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9pc0luaXRpYWxpemluZ19kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfYWN0aXZlQm90dG9tUGFuZWxfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2RpYWdub3N0aWNNYXJrZXJzX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9hdXRvU2F2ZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaW5pdENvbW1hbmRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2luaXRPdXRwdXRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2N1cnJlbnRGaWxlVHJlZVdpZHRoX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9jdXJyZW50VGVybWluYWxIZWlnaHRfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2lzRHJhZ2dpbmdGaWxlVHJlZV9kZWNvcmF0b3JzID0gW3I1KCldOwogICAgICBfaXNEcmFnZ2luZ1Rlcm1pbmFsX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9zaG93RGlmZlZpZXdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2RpZmZWaWV3Q29uZmlnX2RlY29yYXRvcnMgPSBbcjUoKV07CiAgICAgIF9fZXNEZWNvcmF0ZTk4KHRoaXMsIG51bGwsIF9leGVjdXRpb25FbnZpcm9ubWVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJleGVjdXRpb25FbnZpcm9ubWVudCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZXhlY3V0aW9uRW52aXJvbm1lbnQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouZXhlY3V0aW9uRW52aXJvbm1lbnQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmV4ZWN1dGlvbkVudmlyb25tZW50ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2V4ZWN1dGlvbkVudmlyb25tZW50X2luaXRpYWxpemVycywgX2V4ZWN1dGlvbkVudmlyb25tZW50X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTgodGhpcywgbnVsbCwgX2luaXRpYWxpemF0aW9uUHJvbWlzZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpbml0aWFsaXphdGlvblByb21pc2UiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImluaXRpYWxpemF0aW9uUHJvbWlzZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pbml0aWFsaXphdGlvblByb21pc2UsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmluaXRpYWxpemF0aW9uUHJvbWlzZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9pbml0aWFsaXphdGlvblByb21pc2VfaW5pdGlhbGl6ZXJzLCBfaW5pdGlhbGl6YXRpb25Qcm9taXNlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTgodGhpcywgbnVsbCwgX3Nob3dGaWxlVHJlZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93RmlsZVRyZWUiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNob3dGaWxlVHJlZSIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93RmlsZVRyZWUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dGaWxlVHJlZSA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93RmlsZVRyZWVfaW5pdGlhbGl6ZXJzLCBfc2hvd0ZpbGVUcmVlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTgodGhpcywgbnVsbCwgX3Nob3dUZXJtaW5hbF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJzaG93VGVybWluYWwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gInNob3dUZXJtaW5hbCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zaG93VGVybWluYWwsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnNob3dUZXJtaW5hbCA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9zaG93VGVybWluYWxfaW5pdGlhbGl6ZXJzLCBfc2hvd1Rlcm1pbmFsX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTgodGhpcywgbnVsbCwgX2ZpbGVUcmVlV2lkdGhfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZmlsZVRyZWVXaWR0aCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiZmlsZVRyZWVXaWR0aCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5maWxlVHJlZVdpZHRoLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5maWxlVHJlZVdpZHRoID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2ZpbGVUcmVlV2lkdGhfaW5pdGlhbGl6ZXJzLCBfZmlsZVRyZWVXaWR0aF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk4KHRoaXMsIG51bGwsIF90ZXJtaW5hbEhlaWdodF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJ0ZXJtaW5hbEhlaWdodCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAidGVybWluYWxIZWlnaHQiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoudGVybWluYWxIZWlnaHQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLnRlcm1pbmFsSGVpZ2h0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Rlcm1pbmFsSGVpZ2h0X2luaXRpYWxpemVycywgX3Rlcm1pbmFsSGVpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTgodGhpcywgbnVsbCwgX29wZW5GaWxlc19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJvcGVuRmlsZXMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gIm9wZW5GaWxlcyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5vcGVuRmlsZXMsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLm9wZW5GaWxlcyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9vcGVuRmlsZXNfaW5pdGlhbGl6ZXJzLCBfb3BlbkZpbGVzX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTgodGhpcywgbnVsbCwgX2FjdGl2ZUZpbGVQYXRoX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFjdGl2ZUZpbGVQYXRoIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhY3RpdmVGaWxlUGF0aCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hY3RpdmVGaWxlUGF0aCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYWN0aXZlRmlsZVBhdGggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYWN0aXZlRmlsZVBhdGhfaW5pdGlhbGl6ZXJzLCBfYWN0aXZlRmlsZVBhdGhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5OCh0aGlzLCBudWxsLCBfaXNUZXJtaW5hbENvbGxhcHNlZF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc1Rlcm1pbmFsQ29sbGFwc2VkIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpc1Rlcm1pbmFsQ29sbGFwc2VkIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzVGVybWluYWxDb2xsYXBzZWQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzVGVybWluYWxDb2xsYXBzZWQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaXNUZXJtaW5hbENvbGxhcHNlZF9pbml0aWFsaXplcnMsIF9pc1Rlcm1pbmFsQ29sbGFwc2VkX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTgodGhpcywgbnVsbCwgX2lzRmlsZVRyZWVDb2xsYXBzZWRfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNGaWxlVHJlZUNvbGxhcHNlZCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNGaWxlVHJlZUNvbGxhcHNlZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc0ZpbGVUcmVlQ29sbGFwc2VkLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc0ZpbGVUcmVlQ29sbGFwc2VkID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzRmlsZVRyZWVDb2xsYXBzZWRfaW5pdGlhbGl6ZXJzLCBfaXNGaWxlVHJlZUNvbGxhcHNlZF9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk4KHRoaXMsIG51bGwsIF9pc0luaXRpYWxpemluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpc0luaXRpYWxpemluZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNJbml0aWFsaXppbmciIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouaXNJbml0aWFsaXppbmcsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmlzSW5pdGlhbGl6aW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzSW5pdGlhbGl6aW5nX2luaXRpYWxpemVycywgX2lzSW5pdGlhbGl6aW5nX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTgodGhpcywgbnVsbCwgX2FjdGl2ZUJvdHRvbVBhbmVsX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImFjdGl2ZUJvdHRvbVBhbmVsIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJhY3RpdmVCb3R0b21QYW5lbCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5hY3RpdmVCb3R0b21QYW5lbCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouYWN0aXZlQm90dG9tUGFuZWwgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfYWN0aXZlQm90dG9tUGFuZWxfaW5pdGlhbGl6ZXJzLCBfYWN0aXZlQm90dG9tUGFuZWxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5OCh0aGlzLCBudWxsLCBfZGlhZ25vc3RpY01hcmtlcnNfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZGlhZ25vc3RpY01hcmtlcnMiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRpYWdub3N0aWNNYXJrZXJzIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRpYWdub3N0aWNNYXJrZXJzLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kaWFnbm9zdGljTWFya2VycyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kaWFnbm9zdGljTWFya2Vyc19pbml0aWFsaXplcnMsIF9kaWFnbm9zdGljTWFya2Vyc19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk4KHRoaXMsIG51bGwsIF9hdXRvU2F2ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJhdXRvU2F2ZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiYXV0b1NhdmUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouYXV0b1NhdmUsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmF1dG9TYXZlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2F1dG9TYXZlX2luaXRpYWxpemVycywgX2F1dG9TYXZlX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTgodGhpcywgbnVsbCwgX2luaXRDb21tYW5kX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImluaXRDb21tYW5kIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpbml0Q29tbWFuZCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pbml0Q29tbWFuZCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaW5pdENvbW1hbmQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaW5pdENvbW1hbmRfaW5pdGlhbGl6ZXJzLCBfaW5pdENvbW1hbmRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5OCh0aGlzLCBudWxsLCBfaW5pdE91dHB1dF9kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJpbml0T3V0cHV0Iiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJpbml0T3V0cHV0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmluaXRPdXRwdXQsIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmluaXRPdXRwdXQgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfaW5pdE91dHB1dF9pbml0aWFsaXplcnMsIF9pbml0T3V0cHV0X2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTgodGhpcywgbnVsbCwgX2N1cnJlbnRGaWxlVHJlZVdpZHRoX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImN1cnJlbnRGaWxlVHJlZVdpZHRoIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJjdXJyZW50RmlsZVRyZWVXaWR0aCIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5jdXJyZW50RmlsZVRyZWVXaWR0aCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY3VycmVudEZpbGVUcmVlV2lkdGggPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfY3VycmVudEZpbGVUcmVlV2lkdGhfaW5pdGlhbGl6ZXJzLCBfY3VycmVudEZpbGVUcmVlV2lkdGhfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5OCh0aGlzLCBudWxsLCBfY3VycmVudFRlcm1pbmFsSGVpZ2h0X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImN1cnJlbnRUZXJtaW5hbEhlaWdodCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3VycmVudFRlcm1pbmFsSGVpZ2h0IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmN1cnJlbnRUZXJtaW5hbEhlaWdodCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouY3VycmVudFRlcm1pbmFsSGVpZ2h0ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2N1cnJlbnRUZXJtaW5hbEhlaWdodF9pbml0aWFsaXplcnMsIF9jdXJyZW50VGVybWluYWxIZWlnaHRfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5OCh0aGlzLCBudWxsLCBfaXNEcmFnZ2luZ0ZpbGVUcmVlX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzRHJhZ2dpbmdGaWxlVHJlZSIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNEcmFnZ2luZ0ZpbGVUcmVlIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzRHJhZ2dpbmdGaWxlVHJlZSwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNEcmFnZ2luZ0ZpbGVUcmVlID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzRHJhZ2dpbmdGaWxlVHJlZV9pbml0aWFsaXplcnMsIF9pc0RyYWdnaW5nRmlsZVRyZWVfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5OCh0aGlzLCBudWxsLCBfaXNEcmFnZ2luZ1Rlcm1pbmFsX2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogImlzRHJhZ2dpbmdUZXJtaW5hbCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNEcmFnZ2luZ1Rlcm1pbmFsIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmlzRHJhZ2dpbmdUZXJtaW5hbCwgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouaXNEcmFnZ2luZ1Rlcm1pbmFsID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzRHJhZ2dpbmdUZXJtaW5hbF9pbml0aWFsaXplcnMsIF9pc0RyYWdnaW5nVGVybWluYWxfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5OCh0aGlzLCBudWxsLCBfc2hvd0RpZmZWaWV3X2RlY29yYXRvcnMsIHsga2luZDogImFjY2Vzc29yIiwgbmFtZTogInNob3dEaWZmVmlldyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic2hvd0RpZmZWaWV3IiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLnNob3dEaWZmVmlldywgc2V0OiAob2JqLCB2YWx1ZTIpID0+IHsKICAgICAgICBvYmouc2hvd0RpZmZWaWV3ID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3Nob3dEaWZmVmlld19pbml0aWFsaXplcnMsIF9zaG93RGlmZlZpZXdfZXh0cmFJbml0aWFsaXplcnMpOwogICAgICBfX2VzRGVjb3JhdGU5OCh0aGlzLCBudWxsLCBfZGlmZlZpZXdDb25maWdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiZGlmZlZpZXdDb25maWciLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogKG9iaikgPT4gImRpZmZWaWV3Q29uZmlnIiBpbiBvYmosIGdldDogKG9iaikgPT4gb2JqLmRpZmZWaWV3Q29uZmlnLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5kaWZmVmlld0NvbmZpZyA9IHZhbHVlMjsKICAgICAgfSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIF9kaWZmVmlld0NvbmZpZ19pbml0aWFsaXplcnMsIF9kaWZmVmlld0NvbmZpZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk4KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1dvcmtzcGFjZTIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgc3RhdGljIGRlbW8gPSAoKSA9PiB7CiAgICAgIGNvbnN0IGVudjIgPSBuZXcgV2ViQ29udGFpbmVyRW52aXJvbm1lbnQoKTsKICAgICAgY29uc3QgbW91bnRQcm9taXNlID0gKGFzeW5jICgpID0+IHsKICAgICAgICBhd2FpdCBlbnYyLmluaXQoKTsKICAgICAgICBjb25zdCBmaWxlVHJlZSA9IHsKICAgICAgICAgICJwYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAgIGZpbGU6IHsKICAgICAgICAgICAgICBjb250ZW50czogSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICAgICAgbmFtZTogImRlbW8tcHJvamVjdCIsCiAgICAgICAgICAgICAgICB2ZXJzaW9uOiAiMS4wLjAiLAogICAgICAgICAgICAgICAgdHlwZTogIm1vZHVsZSIsCiAgICAgICAgICAgICAgICBzY3JpcHRzOiB7CiAgICAgICAgICAgICAgICAgIGJ1aWxkOiAidHNjIiwKICAgICAgICAgICAgICAgICAgZGV2OiAidHNjIC0td2F0Y2giCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiB7CiAgICAgICAgICAgICAgICAgICJAcHVzaC5yb2Nrcy9zbWFydHByb21pc2UiOiAiXjQuMi4zIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRldkRlcGVuZGVuY2llczogewogICAgICAgICAgICAgICAgICAiQHR5cGVzL25vZGUiOiAiXjIyLjAuMCIsCiAgICAgICAgICAgICAgICAgIHR5cGVzY3JpcHQ6ICJeNS4wLjAiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwgbnVsbCwgMikKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJucG1leHRyYS5qc29uIjogewogICAgICAgICAgICBmaWxlOiB7CiAgICAgICAgICAgICAgY29udGVudHM6IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgIGRlZXNFZGl0b3JXb3Jrc3BhY2U6IHsKICAgICAgICAgICAgICAgICAgb25Jbml0OiAicG5wbSBpbnN0YWxsIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sIG51bGwsIDIpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAidHNjb25maWcuanNvbiI6IHsKICAgICAgICAgICAgZmlsZTogewogICAgICAgICAgICAgIGNvbnRlbnRzOiBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICBjb21waWxlck9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAiRVMyMDIyIiwKICAgICAgICAgICAgICAgICAgbW9kdWxlOiAiTm9kZU5leHQiLAogICAgICAgICAgICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiAiTm9kZU5leHQiLAogICAgICAgICAgICAgICAgICBzdHJpY3Q6IHRydWUsCiAgICAgICAgICAgICAgICAgIG91dERpcjogIi4vZGlzdCIsCiAgICAgICAgICAgICAgICAgIHJvb3REaXI6ICIuL3NyYyIsCiAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uOiB0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgaW5jbHVkZTogWyJzcmMvKiovKiJdCiAgICAgICAgICAgICAgfSwgbnVsbCwgMikKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIHNyYzogewogICAgICAgICAgICBkaXJlY3Rvcnk6IHsKICAgICAgICAgICAgICAiaW5kZXgudHMiOiB7CiAgICAgICAgICAgICAgICBmaWxlOiB7CiAgICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBgLy8gTWFpbiBlbnRyeSBwb2ludAppbXBvcnQgeyBncmVldCwgZm9ybWF0TmFtZSB9IGZyb20gJy4vdXRpbHMuanMnOwoKY29uc3QgbmFtZSA9IGZvcm1hdE5hbWUoJ1dvcmxkJyk7CmNvbnNvbGUubG9nKGdyZWV0KG5hbWUpKTsKCi8vIEV4YW1wbGUgYXN5bmMgZnVuY3Rpb24KYXN5bmMgZnVuY3Rpb24gbWFpbigpIHsKICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoJ0hlbGxvIGZyb20gYXN5bmMhJyk7CiAgY29uc29sZS5sb2cocmVzdWx0KTsKfQoKbWFpbigpOwpgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAidXRpbHMudHMiOiB7CiAgICAgICAgICAgICAgICBmaWxlOiB7CiAgICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBgLy8gVXRpbGl0eSBmdW5jdGlvbnMKCmV4cG9ydCBpbnRlcmZhY2UgSVVzZXIgewogIGZpcnN0TmFtZTogc3RyaW5nOwogIGxhc3ROYW1lOiBzdHJpbmc7Cn0KCmV4cG9ydCBmdW5jdGlvbiBncmVldChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgewogIHJldHVybiBcYEhlbGxvLCBcJHtuYW1lfSFcYDsKfQoKZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHsKICByZXR1cm4gbmFtZS50cmltKCkudG9VcHBlckNhc2UoKTsKfQoKZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVzZXIoZmlyc3ROYW1lOiBzdHJpbmcsIGxhc3ROYW1lOiBzdHJpbmcpOiBJVXNlciB7CiAgcmV0dXJuIHsgZmlyc3ROYW1lLCBsYXN0TmFtZSB9Owp9CmAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICJpbXBvcnR0ZXN0LnRzIjogewogICAgICAgICAgICAgICAgZmlsZTogewogICAgICAgICAgICAgICAgICBjb250ZW50czogYC8vIFRlc3QgbnBtIHBhY2thZ2UgaW1wb3J0cwppbXBvcnQgKiBhcyBzbWFydHByb21pc2UgZnJvbSAnQHB1c2gucm9ja3Mvc21hcnRwcm9taXNlJzsKCi8vIFRoaXMgc2hvdWxkIGhhdmUgSW50ZWxsaVNlbnNlIHNob3dpbmcgZGVmZXIoKSBtZXRob2QKY29uc3QgZGVmZXJyZWQgPSBzbWFydHByb21pc2UuZGVmZXI8c3RyaW5nPigpOwoKLy8gVGVzdCB1c2luZyB0aGUgZGVmZXJyZWQgcHJvbWlzZQphc3luYyBmdW5jdGlvbiB0ZXN0U21hcnRQcm9taXNlKCkgewogIHNldFRpbWVvdXQoKCkgPT4gewogICAgZGVmZXJyZWQucmVzb2x2ZSgnSGVsbG8gZnJvbSBzbWFydHByb21pc2UhJyk7CiAgfSwgMTAwKTsKCiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmZXJyZWQucHJvbWlzZTsKICBjb25zb2xlLmxvZyhyZXN1bHQpOwp9Cgp0ZXN0U21hcnRQcm9taXNlKCk7CmAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGF3YWl0IGVudjIubW91bnQoZmlsZVRyZWUpOwogICAgICB9KSgpOwogICAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgIGNvbnRhaW5lckVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9ICJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJTsgb3ZlcmZsb3c6IGhpZGRlbjsiOwogICAgICBjb25zdCB3b3Jrc3BhY2VFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGVlcy13b3Jrc3BhY2UiKTsKICAgICAgd29ya3NwYWNlRWxlbWVudC5leGVjdXRpb25FbnZpcm9ubWVudCA9IGVudjI7CiAgICAgIHdvcmtzcGFjZUVsZW1lbnQuaW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbW91bnRQcm9taXNlOwogICAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHdvcmtzcGFjZUVsZW1lbnQpOwogICAgICByZXR1cm4gYjJgCiAgICAgIDxkZWVzLWRlbW93cmFwcGVyPgogICAgICAgICR7Y29udGFpbmVyRWxlbWVudH0KICAgICAgPC9kZWVzLWRlbW93cmFwcGVyPgogICAgYDsKICAgIH07CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiV29ya3NwYWNlIl07CiAgICAjZXhlY3V0aW9uRW52aXJvbm1lbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzOTkodGhpcywgX2V4ZWN1dGlvbkVudmlyb25tZW50X2luaXRpYWxpemVycywgbnVsbCk7CiAgICAvLyBJTlNUQU5DRQogICAgZ2V0IGV4ZWN1dGlvbkVudmlyb25tZW50KCkgewogICAgICByZXR1cm4gdGhpcy4jZXhlY3V0aW9uRW52aXJvbm1lbnRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBleGVjdXRpb25FbnZpcm9ubWVudCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZXhlY3V0aW9uRW52aXJvbm1lbnRfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNpbml0aWFsaXphdGlvblByb21pc2VfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk5KHRoaXMsIF9leGVjdXRpb25FbnZpcm9ubWVudF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTkodGhpcywgX2luaXRpYWxpemF0aW9uUHJvbWlzZV9pbml0aWFsaXplcnMsIG51bGwpKTsKICAgIGdldCBpbml0aWFsaXphdGlvblByb21pc2UoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpbml0aWFsaXphdGlvblByb21pc2VfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpbml0aWFsaXphdGlvblByb21pc2UodmFsdWUyKSB7CiAgICAgIHRoaXMuI2luaXRpYWxpemF0aW9uUHJvbWlzZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dGaWxlVHJlZV9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTkodGhpcywgX2luaXRpYWxpemF0aW9uUHJvbWlzZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTkodGhpcywgX3Nob3dGaWxlVHJlZV9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93RmlsZVRyZWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93RmlsZVRyZWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93RmlsZVRyZWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dGaWxlVHJlZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI3Nob3dUZXJtaW5hbF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTkodGhpcywgX3Nob3dGaWxlVHJlZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTkodGhpcywgX3Nob3dUZXJtaW5hbF9pbml0aWFsaXplcnMsIHRydWUpKTsKICAgIGdldCBzaG93VGVybWluYWwoKSB7CiAgICAgIHJldHVybiB0aGlzLiNzaG93VGVybWluYWxfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBzaG93VGVybWluYWwodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Nob3dUZXJtaW5hbF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2ZpbGVUcmVlV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk5KHRoaXMsIF9zaG93VGVybWluYWxfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk5KHRoaXMsIF9maWxlVHJlZVdpZHRoX2luaXRpYWxpemVycywgMjUwKSk7CiAgICBnZXQgZmlsZVRyZWVXaWR0aCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2ZpbGVUcmVlV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBmaWxlVHJlZVdpZHRoKHZhbHVlMikgewogICAgICB0aGlzLiNmaWxlVHJlZVdpZHRoX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjdGVybWluYWxIZWlnaHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk5KHRoaXMsIF9maWxlVHJlZVdpZHRoX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5OSh0aGlzLCBfdGVybWluYWxIZWlnaHRfaW5pdGlhbGl6ZXJzLCAyMDApKTsKICAgIGdldCB0ZXJtaW5hbEhlaWdodCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI3Rlcm1pbmFsSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgdGVybWluYWxIZWlnaHQodmFsdWUyKSB7CiAgICAgIHRoaXMuI3Rlcm1pbmFsSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjb3BlbkZpbGVzX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5OSh0aGlzLCBfdGVybWluYWxIZWlnaHRfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk5KHRoaXMsIF9vcGVuRmlsZXNfaW5pdGlhbGl6ZXJzLCBbXSkpOwogICAgZ2V0IG9wZW5GaWxlcygpIHsKICAgICAgcmV0dXJuIHRoaXMuI29wZW5GaWxlc19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG9wZW5GaWxlcyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jb3BlbkZpbGVzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjYWN0aXZlRmlsZVBhdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk5KHRoaXMsIF9vcGVuRmlsZXNfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk5KHRoaXMsIF9hY3RpdmVGaWxlUGF0aF9pbml0aWFsaXplcnMsICIiKSk7CiAgICBnZXQgYWN0aXZlRmlsZVBhdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLiNhY3RpdmVGaWxlUGF0aF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGFjdGl2ZUZpbGVQYXRoKHZhbHVlMikgewogICAgICB0aGlzLiNhY3RpdmVGaWxlUGF0aF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzVGVybWluYWxDb2xsYXBzZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk5KHRoaXMsIF9hY3RpdmVGaWxlUGF0aF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTkodGhpcywgX2lzVGVybWluYWxDb2xsYXBzZWRfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgZ2V0IGlzVGVybWluYWxDb2xsYXBzZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc1Rlcm1pbmFsQ29sbGFwc2VkX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaXNUZXJtaW5hbENvbGxhcHNlZCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jaXNUZXJtaW5hbENvbGxhcHNlZF9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzRmlsZVRyZWVDb2xsYXBzZWRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk5KHRoaXMsIF9pc1Rlcm1pbmFsQ29sbGFwc2VkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5OSh0aGlzLCBfaXNGaWxlVHJlZUNvbGxhcHNlZF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaXNGaWxlVHJlZUNvbGxhcHNlZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2lzRmlsZVRyZWVDb2xsYXBzZWRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc0ZpbGVUcmVlQ29sbGFwc2VkKHZhbHVlMikgewogICAgICB0aGlzLiNpc0ZpbGVUcmVlQ29sbGFwc2VkX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNJbml0aWFsaXppbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk5KHRoaXMsIF9pc0ZpbGVUcmVlQ29sbGFwc2VkX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5OSh0aGlzLCBfaXNJbml0aWFsaXppbmdfaW5pdGlhbGl6ZXJzLCB0cnVlKSk7CiAgICBnZXQgaXNJbml0aWFsaXppbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc0luaXRpYWxpemluZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzSW5pdGlhbGl6aW5nKHZhbHVlMikgewogICAgICB0aGlzLiNpc0luaXRpYWxpemluZ19hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2FjdGl2ZUJvdHRvbVBhbmVsX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5OSh0aGlzLCBfaXNJbml0aWFsaXppbmdfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk5KHRoaXMsIF9hY3RpdmVCb3R0b21QYW5lbF9pbml0aWFsaXplcnMsICJ0ZXJtaW5hbCIpKTsKICAgIGdldCBhY3RpdmVCb3R0b21QYW5lbCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FjdGl2ZUJvdHRvbVBhbmVsX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgYWN0aXZlQm90dG9tUGFuZWwodmFsdWUyKSB7CiAgICAgIHRoaXMuI2FjdGl2ZUJvdHRvbVBhbmVsX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjZGlhZ25vc3RpY01hcmtlcnNfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk5KHRoaXMsIF9hY3RpdmVCb3R0b21QYW5lbF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTkodGhpcywgX2RpYWdub3N0aWNNYXJrZXJzX2luaXRpYWxpemVycywgW10pKTsKICAgIGdldCBkaWFnbm9zdGljTWFya2VycygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2RpYWdub3N0aWNNYXJrZXJzX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgZGlhZ25vc3RpY01hcmtlcnModmFsdWUyKSB7CiAgICAgIHRoaXMuI2RpYWdub3N0aWNNYXJrZXJzX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICBlZGl0b3JFbGVtZW50ID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTkodGhpcywgX2RpYWdub3N0aWNNYXJrZXJzX2V4dHJhSW5pdGlhbGl6ZXJzKSwgbnVsbCk7CiAgICBpbml0aWFsaXphdGlvblN0YXJ0ZWQgPSBmYWxzZTsKICAgIGludGVsbGlTZW5zZU1hbmFnZXIgPSBudWxsOwogICAgaW50ZWxsaVNlbnNlSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgIC8vIG5vZGVfbW9kdWxlcyB3YXRjaGVyIGZvciBhdXRvLWxvYWRpbmcgdHlwZXMKICAgIG5vZGVNb2R1bGVzV2F0Y2hlciA9IG51bGw7CiAgICBub2RlTW9kdWxlc0RlYm91bmNlVGltZW91dCA9IG51bGw7CiAgICBpbnRlbGxpU2Vuc2VEZWJvdW5jZVRpbWVvdXQgPSBudWxsOwogICAgLy8gT3BlbiBmaWxlIHdhdGNoZXJzIGZvciBleHRlcm5hbCBjaGFuZ2UgZGV0ZWN0aW9uCiAgICBvcGVuRmlsZVdhdGNoZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIGZpbGVDaGFuZ2VEZWJvdW5jZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBhY3Rpb25iYXJFbGVtZW50ID0gbnVsbDsKICAgICNhdXRvU2F2ZV9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM5OSh0aGlzLCBfYXV0b1NhdmVfaW5pdGlhbGl6ZXJzLCBmYWxzZSk7CiAgICAvLyBBdXRvLXNhdmUgZnVuY3Rpb25hbGl0eQogICAgZ2V0IGF1dG9TYXZlKCkgewogICAgICByZXR1cm4gdGhpcy4jYXV0b1NhdmVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBhdXRvU2F2ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jYXV0b1NhdmVfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIGF1dG9TYXZlSW50ZXJ2YWwgPSAoX19ydW5Jbml0aWFsaXplcnM5OSh0aGlzLCBfYXV0b1NhdmVfZXh0cmFJbml0aWFsaXplcnMpLCBudWxsKTsKICAgICNpbml0Q29tbWFuZF9hY2Nlc3Nvcl9zdG9yYWdlID0gX19ydW5Jbml0aWFsaXplcnM5OSh0aGlzLCBfaW5pdENvbW1hbmRfaW5pdGlhbGl6ZXJzLCAiIik7CiAgICAvLyBJbml0IHRlcm1pbmFsIHByZXZpZXcgc3RhdGUKICAgIGdldCBpbml0Q29tbWFuZCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2luaXRDb21tYW5kX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaW5pdENvbW1hbmQodmFsdWUyKSB7CiAgICAgIHRoaXMuI2luaXRDb21tYW5kX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaW5pdE91dHB1dF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTkodGhpcywgX2luaXRDb21tYW5kX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5OSh0aGlzLCBfaW5pdE91dHB1dF9pbml0aWFsaXplcnMsIFtdKSk7CiAgICBnZXQgaW5pdE91dHB1dCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2luaXRPdXRwdXRfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpbml0T3V0cHV0KHZhbHVlMikgewogICAgICB0aGlzLiNpbml0T3V0cHV0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY3VycmVudEZpbGVUcmVlV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk5KHRoaXMsIF9pbml0T3V0cHV0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5OSh0aGlzLCBfY3VycmVudEZpbGVUcmVlV2lkdGhfaW5pdGlhbGl6ZXJzLCAyNTApKTsKICAgIC8vIFJlc2l6ZSBzdGF0ZQogICAgZ2V0IGN1cnJlbnRGaWxlVHJlZVdpZHRoKCkgewogICAgICByZXR1cm4gdGhpcy4jY3VycmVudEZpbGVUcmVlV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBjdXJyZW50RmlsZVRyZWVXaWR0aCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY3VycmVudEZpbGVUcmVlV2lkdGhfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNjdXJyZW50VGVybWluYWxIZWlnaHRfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk5KHRoaXMsIF9jdXJyZW50RmlsZVRyZWVXaWR0aF9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTkodGhpcywgX2N1cnJlbnRUZXJtaW5hbEhlaWdodF9pbml0aWFsaXplcnMsIDIwMCkpOwogICAgZ2V0IGN1cnJlbnRUZXJtaW5hbEhlaWdodCgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRUZXJtaW5hbEhlaWdodF9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGN1cnJlbnRUZXJtaW5hbEhlaWdodCh2YWx1ZTIpIHsKICAgICAgdGhpcy4jY3VycmVudFRlcm1pbmFsSGVpZ2h0X2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNEcmFnZ2luZ0ZpbGVUcmVlX2FjY2Vzc29yX3N0b3JhZ2UgPSAoX19ydW5Jbml0aWFsaXplcnM5OSh0aGlzLCBfY3VycmVudFRlcm1pbmFsSGVpZ2h0X2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnM5OSh0aGlzLCBfaXNEcmFnZ2luZ0ZpbGVUcmVlX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc0RyYWdnaW5nRmlsZVRyZWUoKSB7CiAgICAgIHJldHVybiB0aGlzLiNpc0RyYWdnaW5nRmlsZVRyZWVfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBpc0RyYWdnaW5nRmlsZVRyZWUodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzRHJhZ2dpbmdGaWxlVHJlZV9hY2Nlc3Nvcl9zdG9yYWdlID0gdmFsdWUyOwogICAgfQogICAgI2lzRHJhZ2dpbmdUZXJtaW5hbF9hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTkodGhpcywgX2lzRHJhZ2dpbmdGaWxlVHJlZV9leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTkodGhpcywgX2lzRHJhZ2dpbmdUZXJtaW5hbF9pbml0aWFsaXplcnMsIGZhbHNlKSk7CiAgICBnZXQgaXNEcmFnZ2luZ1Rlcm1pbmFsKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNEcmFnZ2luZ1Rlcm1pbmFsX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgaXNEcmFnZ2luZ1Rlcm1pbmFsKHZhbHVlMikgewogICAgICB0aGlzLiNpc0RyYWdnaW5nVGVybWluYWxfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNzaG93RGlmZlZpZXdfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczk5KHRoaXMsIF9pc0RyYWdnaW5nVGVybWluYWxfZXh0cmFJbml0aWFsaXplcnMpLCBfX3J1bkluaXRpYWxpemVyczk5KHRoaXMsIF9zaG93RGlmZlZpZXdfaW5pdGlhbGl6ZXJzLCBmYWxzZSkpOwogICAgLy8gRGlmZiB2aWV3IHN0YXRlCiAgICBnZXQgc2hvd0RpZmZWaWV3KCkgewogICAgICByZXR1cm4gdGhpcy4jc2hvd0RpZmZWaWV3X2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgc2hvd0RpZmZWaWV3KHZhbHVlMikgewogICAgICB0aGlzLiNzaG93RGlmZlZpZXdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNkaWZmVmlld0NvbmZpZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTkodGhpcywgX3Nob3dEaWZmVmlld19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzOTkodGhpcywgX2RpZmZWaWV3Q29uZmlnX2luaXRpYWxpemVycywgbnVsbCkpOwogICAgZ2V0IGRpZmZWaWV3Q29uZmlnKCkgewogICAgICByZXR1cm4gdGhpcy4jZGlmZlZpZXdDb25maWdfYWNjZXNzb3Jfc3RvcmFnZTsKICAgIH0KICAgIHNldCBkaWZmVmlld0NvbmZpZyh2YWx1ZTIpIHsKICAgICAgdGhpcy4jZGlmZlZpZXdDb25maWdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIC8vIEtleWJvYXJkIHNob3J0Y3V0IGhhbmRsZXIgKGJvdW5kIGZvciBwcm9wZXIgY2xlYW51cCkKICAgIGtleWRvd25IYW5kbGVyID0gKF9fcnVuSW5pdGlhbGl6ZXJzOTkodGhpcywgX2RpZmZWaWV3Q29uZmlnX2V4dHJhSW5pdGlhbGl6ZXJzKSwgKGUxMSkgPT4gewogICAgICBpZiAoKGUxMS5tZXRhS2V5IHx8IGUxMS5jdHJsS2V5KSAmJiBlMTEua2V5ID09PSAicyIgJiYgIWUxMS5zaGlmdEtleSkgewogICAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMuc2F2ZUFjdGl2ZUZpbGUoKTsKICAgICAgfQogICAgICBpZiAoKGUxMS5tZXRhS2V5IHx8IGUxMS5jdHJsS2V5KSAmJiBlMTEuc2hpZnRLZXkgJiYgZTExLmtleS50b0xvd2VyQ2FzZSgpID09PSAicyIpIHsKICAgICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgICB0aGlzLnNhdmVBbGxGaWxlcygpOwogICAgICB9CiAgICB9KTsKICAgIC8vID09PT09PT09PT0gRmlsZXRyZWUgUmVzaXplIEhhbmRsZXJzID09PT09PT09PT0KICAgIGhhbmRsZUZpbGVUcmVlTW91c2VEb3duID0gKGUxMSkgPT4gewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy5pc0RyYWdnaW5nRmlsZVRyZWUgPSB0cnVlOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCB0aGlzLmhhbmRsZUZpbGVUcmVlTW91c2VNb3ZlKTsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIHRoaXMuaGFuZGxlRmlsZVRyZWVNb3VzZVVwKTsKICAgIH07CiAgICBoYW5kbGVGaWxlVHJlZU1vdXNlTW92ZSA9IChlMTEpID0+IHsKICAgICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmdGaWxlVHJlZSkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBjb25zdCBtb3VzZVggPSBlMTEuY2xpZW50WCAtIGNvbnRhaW5lclJlY3QubGVmdDsKICAgICAgY29uc3QgbWluV2lkdGggPSAxNTA7CiAgICAgIGNvbnN0IG1heFdpZHRoID0gY29udGFpbmVyUmVjdC53aWR0aCAqIDAuNTsKICAgICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1heChtaW5XaWR0aCwgTWF0aC5taW4obWF4V2lkdGgsIG1vdXNlWCkpOwogICAgICB0aGlzLmN1cnJlbnRGaWxlVHJlZVdpZHRoID0gbmV3V2lkdGg7CiAgICB9OwogICAgaGFuZGxlRmlsZVRyZWVNb3VzZVVwID0gKCkgPT4gewogICAgICB0aGlzLmlzRHJhZ2dpbmdGaWxlVHJlZSA9IGZhbHNlOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCB0aGlzLmhhbmRsZUZpbGVUcmVlTW91c2VNb3ZlKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIHRoaXMuaGFuZGxlRmlsZVRyZWVNb3VzZVVwKTsKICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSk7CiAgICB9OwogICAgLy8gPT09PT09PT09PSBUZXJtaW5hbCBSZXNpemUgSGFuZGxlcnMgPT09PT09PT09PQogICAgaGFuZGxlVGVybWluYWxNb3VzZURvd24gPSAoZTExKSA9PiB7CiAgICAgIGUxMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB0aGlzLmlzRHJhZ2dpbmdUZXJtaW5hbCA9IHRydWU7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIHRoaXMuaGFuZGxlVGVybWluYWxNb3VzZU1vdmUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5oYW5kbGVUZXJtaW5hbE1vdXNlVXApOwogICAgfTsKICAgIGhhbmRsZVRlcm1pbmFsTW91c2VNb3ZlID0gKGUxMSkgPT4gewogICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ1Rlcm1pbmFsKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGNvbnN0IG1vdXNlWSA9IGUxMS5jbGllbnRZIC0gY29udGFpbmVyUmVjdC50b3A7CiAgICAgIGNvbnN0IHRlcm1pbmFsSGVpZ2h0ID0gY29udGFpbmVyUmVjdC5oZWlnaHQgLSBtb3VzZVk7CiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IDEwMDsKICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gY29udGFpbmVyUmVjdC5oZWlnaHQgKiAwLjc7CiAgICAgIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWF4KG1pbkhlaWdodCwgTWF0aC5taW4obWF4SGVpZ2h0LCB0ZXJtaW5hbEhlaWdodCkpOwogICAgICB0aGlzLmN1cnJlbnRUZXJtaW5hbEhlaWdodCA9IG5ld0hlaWdodDsKICAgIH07CiAgICBoYW5kbGVUZXJtaW5hbE1vdXNlVXAgPSAoKSA9PiB7CiAgICAgIHRoaXMuaXNEcmFnZ2luZ1Rlcm1pbmFsID0gZmFsc2U7CiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIHRoaXMuaGFuZGxlVGVybWluYWxNb3VzZU1vdmUpOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5oYW5kbGVUZXJtaW5hbE1vdXNlVXApOwogICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlc2l6ZSIpKTsKICAgIH07CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk2JSkiLCAiaHNsKDAgMCUgNyUpIil9OwogICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgfQoKICAgICAgLndvcmtzcGFjZS1vdXRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLndvcmtzcGFjZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5lZGl0b3ItYXJlYSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5maWxldHJlZS1wYW5lbCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIH0KCiAgICAgIC5maWxldHJlZS1wYW5lbC5jb2xsYXBzZWQgewogICAgICAgIHdpZHRoOiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5lZGl0b3ItcGFuZWwgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLXdpZHRoOiAyMDBweDsKICAgICAgfQoKICAgICAgLnRlcm1pbmFsLXBhbmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA4NSUpIiwgImhzbCgwIDAlIDE1JSkiKX07CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgfQoKICAgICAgLnRlcm1pbmFsLXBhbmVsLmNvbGxhcHNlZCB7CiAgICAgICAgaGVpZ2h0OiAzMnB4ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5wYW5lbC1oZWFkZXIgewogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIHBhZGRpbmc6IDAgOHB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NSUpIiwgImhzbCgwIDAlIDglKSIpfTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg1JSkiLCAiaHNsKDAgMCUgMTUlKSIpfTsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDQwJSkiLCAiaHNsKDAgMCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLnBhbmVsLWhlYWRlci10aXRsZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNnB4OwogICAgICB9CgogICAgICAucGFuZWwtaGVhZGVyLWFjdGlvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDRweDsKICAgICAgfQoKICAgICAgLnBhbmVsLWFjdGlvbiB7CiAgICAgICAgd2lkdGg6IDI0cHg7CiAgICAgICAgaGVpZ2h0OiAyNHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNTAlKSIsICJoc2woMCAwJSA2MCUpIil9OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgICB9CgogICAgICAucGFuZWwtYWN0aW9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODglKSIsICJoc2woMCAwJSAxOCUpIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMzAlKSIsICJoc2woMCAwJSA4MCUpIil9OwogICAgICB9CgogICAgICAudGFicy1iYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICAgICAgaGVpZ2h0OiAzNnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NiUpIiwgImhzbCgwIDAlIDglKSIpfTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDg1JSkiLCAiaHNsKDAgMCUgMTUlKSIpfTsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICB9CgogICAgICAudGFiIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA2cHg7CiAgICAgICAgcGFkZGluZzogMCAxMnB4OwogICAgICAgIG1pbi13aWR0aDogMTIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMDBweDsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODglKSIsICJoc2woMCAwJSAxMiUpIil9OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA1MCUpIiwgImhzbCgwIDAlIDYwJSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDk0JSkiLCAiaHNsKDAgMCUgMTAlKSIpfTsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnRhYjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDkyJSkiLCAiaHNsKDAgMCUgMTIlKSIpfTsKICAgICAgfQoKICAgICAgLnRhYi5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAxMDAlKSIsICJoc2woMCAwJSA5JSkiKX07CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAyMCUpIiwgImhzbCgwIDAlIDkwJSkiKX07CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDEwMCUgNTAlKSIsICJoc2woMjEwIDEwMCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLnRhYi1uYW1lIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLnRhYi1jbG9zZSB7CiAgICAgICAgd2lkdGg6IDE2cHg7CiAgICAgICAgaGVpZ2h0OiAxNnB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnRhYjpob3ZlciAudGFiLWNsb3NlIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAudGFiLWNsb3NlOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgODUlKSIsICJoc2woMCAwJSAyNSUpIil9OwogICAgICB9CgogICAgICAudGFiLW1vZGlmaWVkIHsKICAgICAgICB3aWR0aDogOHB4OwogICAgICAgIGhlaWdodDogOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNTAlKSIsICJoc2woMCAwJSA2MCUpIil9OwogICAgICB9CgogICAgICAudGFicy1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleDogMTsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICB9CgogICAgICAuZWRpdG9yLW1lbnUtYnV0dG9uIHsKICAgICAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogNHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgb3BhY2l0eTogMC42OwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMsIGJhY2tncm91bmQgMC4xNXM7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAuZWRpdG9yLW1lbnUtYnV0dG9uOmhvdmVyIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAwJSAvIDAuMDgpIiwgImhzbCgwIDAlIDEwMCUgLyAwLjEpIil9OwogICAgICB9CgogICAgICAuZWRpdG9yLWNvbnRlbnQgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAudGVybWluYWwtY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMzJweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLnByb2JsZW1zLWNvbnRlbnQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDMycHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMTAwJSkiLCAiaHNsKDAgMCUgOSUpIil9OwogICAgICB9CgogICAgICAucGFuZWwtdGFicyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMDsKICAgICAgfQoKICAgICAgLnBhbmVsLXRhYiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNnB4OwogICAgICAgIHBhZGRpbmc6IDAgMTJweDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgNTAlKSIsICJoc2woMCAwJSA1NSUpIil9OwogICAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgICAgfQoKICAgICAgLnBhbmVsLXRhYjpob3ZlciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAzMCUpIiwgImhzbCgwIDAlIDc1JSkiKX07CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDkwJSkiLCAiaHNsKDAgMCUgMTIlKSIpfTsKICAgICAgfQoKICAgICAgLnBhbmVsLXRhYi5hY3RpdmUgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgMCUgMjAlKSIsICJoc2woMCAwJSA5MCUpIil9OwogICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMjEwIDEwMCUgNTAlKSIsICJoc2woMjEwIDEwMCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLnBhbmVsLXRhYi1iYWRnZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBtaW4td2lkdGg6IDE4cHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDlweDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiaHNsKDAgNzAlIDUwJSkiLCAiaHNsKDAgNzAlIDQ1JSkiKX07CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAucGFuZWwtdGFiLWJhZGdlLndhcm5pbmcgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woNDAgNzAlIDUwJSkiLCAiaHNsKDQwIDcwJSA0NSUpIil9OwogICAgICB9CgogICAgICAucGFuZWwtdGFiLWJhZGdlLm5vbmUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5wcm9ibGVtcy1saXN0IHsKICAgICAgICBwYWRkaW5nOiA0cHggMDsKICAgICAgfQoKICAgICAgLnByb2JsZW0taXRlbSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgICBnYXA6IDhweDsKICAgICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSAzMCUpIiwgImhzbCgwIDAlIDgwJSkiKX07CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5wcm9ibGVtLWl0ZW06aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA5NSUpIiwgImhzbCgwIDAlIDE1JSkiKX07CiAgICAgIH0KCiAgICAgIC5wcm9ibGVtLWljb24gewogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIG1hcmdpbi10b3A6IDJweDsKICAgICAgfQoKICAgICAgLnByb2JsZW0taWNvbi5lcnJvciB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCA3MCUgNTAlKSIsICJoc2woMCA3MCUgNjAlKSIpfTsKICAgICAgfQoKICAgICAgLnByb2JsZW0taWNvbi53YXJuaW5nIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCg0MCA3MCUgNTAlKSIsICJoc2woNDAgNzAlIDYwJSkiKX07CiAgICAgIH0KCiAgICAgIC5wcm9ibGVtLWRldGFpbHMgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICB9CgogICAgICAucHJvYmxlbS1tZXNzYWdlIHsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgICB9CgogICAgICAucHJvYmxlbS1sb2NhdGlvbiB7CiAgICAgICAgbWFyZ2luLXRvcDogMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDUwJSkiLCAiaHNsKDAgMCUgNTUlKSIpfTsKICAgICAgfQoKICAgICAgLnByb2JsZW1zLWVtcHR5IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCJoc2woMCAwJSA1NSUpIiwgImhzbCgwIDAlIDUwJSkiKX07CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGdhcDogOHB4OwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDUwJSkiLCAiaHNsKDAgMCUgNTAlKSIpfTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZSBkZWVzLWljb24gewogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgc3BpbiB7CiAgICAgICAgZnJvbSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9CiAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9CiAgICAgIH0KCiAgICAgIC5pbml0aWFsaXppbmcgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoImhzbCgwIDAlIDUwJSkiLCAiaHNsKDAgMCUgNjAlKSIpfTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZ2FwOiAxMnB4OwogICAgICB9CgogICAgICAuaW5pdGlhbGl6aW5nIGRlZXMtaWNvbiB7CiAgICAgICAgYW5pbWF0aW9uOiBzcGluIDFzIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgLmluaXRpYWxpemluZyBkZWVzLXdvcmtzcGFjZS10ZXJtaW5hbC1wcmV2aWV3IHsKICAgICAgICBtYXJnaW4tdG9wOiAyNHB4OwogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgICAgbWF4LXdpZHRoOiA2MDBweDsKICAgICAgICBoZWlnaHQ6IDIwMHB4OwogICAgICB9CgogICAgICBkZWVzLXdvcmtzcGFjZS1maWxldHJlZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgfQoKICAgICAgZGVlcy13b3Jrc3BhY2UtbW9uYWNvIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICB9CgogICAgICBkZWVzLXdvcmtzcGFjZS10ZXJtaW5hbCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLyogUmVzaXplIGhhbmRsZXMgKi8KICAgICAgLnJlc2l6ZS1oYW5kbGUtdmVydGljYWwgewogICAgICAgIHdpZHRoOiA2cHg7CiAgICAgICAgY3Vyc29yOiBjb2wtcmVzaXplOwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMgZWFzZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgei1pbmRleDogMTA7CiAgICAgIH0KCiAgICAgIC5yZXNpemUtaGFuZGxlLXZlcnRpY2FsOmhvdmVyLAogICAgICAucmVzaXplLWhhbmRsZS12ZXJ0aWNhbC5kcmFnZ2luZyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzU4YTZmZiIpfTsKICAgICAgfQoKICAgICAgLnJlc2l6ZS1oYW5kbGUtdmVydGljYWw6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgICAgIHdpZHRoOiAycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIGJhY2tncm91bmQ6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjOWNhM2FmIiwgIiM2ZTc2ODEiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogMXB4OwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cyBlYXNlOwogICAgICB9CgogICAgICAucmVzaXplLWhhbmRsZS12ZXJ0aWNhbDpob3Zlcjo6YWZ0ZXIsCiAgICAgIC5yZXNpemUtaGFuZGxlLXZlcnRpY2FsLmRyYWdnaW5nOjphZnRlciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjZmZmZmZmIil9OwogICAgICB9CgogICAgICAucmVzaXplLWhhbmRsZS1ob3Jpem9udGFsIHsKICAgICAgICBoZWlnaHQ6IDZweDsKICAgICAgICBjdXJzb3I6IHJvdy1yZXNpemU7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cyBlYXNlOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgfQoKICAgICAgLnJlc2l6ZS1oYW5kbGUtaG9yaXpvbnRhbDpob3ZlciwKICAgICAgLnJlc2l6ZS1oYW5kbGUtaG9yaXpvbnRhbC5kcmFnZ2luZyB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMzYjgyZjYiLCAiIzU4YTZmZiIpfTsKICAgICAgfQoKICAgICAgLnJlc2l6ZS1oYW5kbGUtaG9yaXpvbnRhbDo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAycHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM5Y2EzYWYiLCAiIzZlNzY4MSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiAxcHg7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5yZXNpemUtaGFuZGxlLWhvcml6b250YWw6aG92ZXI6OmFmdGVyLAogICAgICAucmVzaXplLWhhbmRsZS1ob3Jpem9udGFsLmRyYWdnaW5nOjphZnRlciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2ZmZmZmZiIsICIjZmZmZmZmIil9OwogICAgICB9CgogICAgICAvKiBQcmV2ZW50IHRleHQgc2VsZWN0aW9uIHdoaWxlIGRyYWdnaW5nICovCiAgICAgIC53b3Jrc3BhY2UtY29udGFpbmVyLmRyYWdnaW5nIHsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgLndvcmtzcGFjZS1jb250YWluZXIuZHJhZ2dpbmcgLmZpbGV0cmVlLXBhbmVsLAogICAgICAud29ya3NwYWNlLWNvbnRhaW5lci5kcmFnZ2luZyAuZWRpdG9yLXBhbmVsLAogICAgICAud29ya3NwYWNlLWNvbnRhaW5lci5kcmFnZ2luZyAudGVybWluYWwtcGFuZWwgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgYAogICAgXTsKICAgIHJlbmRlcigpIHsKICAgICAgY29uc3QgY29udGFpbmVyQ2xhc3NlcyA9IFsKICAgICAgICAid29ya3NwYWNlLWNvbnRhaW5lciIsCiAgICAgICAgdGhpcy5pc0RyYWdnaW5nRmlsZVRyZWUgfHwgdGhpcy5pc0RyYWdnaW5nVGVybWluYWwgPyAiZHJhZ2dpbmciIDogIiIKICAgICAgXS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpOwogICAgICBpZiAodGhpcy5pc0luaXRpYWxpemluZykgewogICAgICAgIHJldHVybiBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJpbml0aWFsaXppbmciPgogICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6bG9hZGVyMiJ9IGljb25TaXplPSIzMiI+PC9kZWVzLWljb24+CiAgICAgICAgICA8c3Bhbj5Jbml0aWFsaXppbmcgd29ya3NwYWNlLi4uPC9zcGFuPgogICAgICAgICAgPGRlZXMtd29ya3NwYWNlLXRlcm1pbmFsLXByZXZpZXcKICAgICAgICAgICAgLmNvbW1hbmQ9JHt0aGlzLmluaXRDb21tYW5kIHx8ICIifQogICAgICAgICAgICAubGluZXM9JHt0aGlzLmluaXRPdXRwdXR9CiAgICAgICAgICA+PC9kZWVzLXdvcmtzcGFjZS10ZXJtaW5hbC1wcmV2aWV3PgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgICB9CiAgICAgIHJldHVybiBiMmAKICAgICAgPGRpdiBjbGFzcz0id29ya3NwYWNlLW91dGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSIke2NvbnRhaW5lckNsYXNzZXN9Ij4KICAgICAgICAgIDwhLS0gRmlsZXRyZWUgcGFuZWwgKGZ1bGwgaGVpZ2h0KSAtLT4KICAgICAgICAgICR7dGhpcy5zaG93RmlsZVRyZWUgPyBiMmAKICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgIGNsYXNzPSJmaWxldHJlZS1wYW5lbCAke3RoaXMuaXNGaWxlVHJlZUNvbGxhcHNlZCA/ICJjb2xsYXBzZWQiIDogIiJ9IgogICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogJHt0aGlzLmlzRmlsZVRyZWVDb2xsYXBzZWQgPyAwIDogdGhpcy5jdXJyZW50RmlsZVRyZWVXaWR0aH1weCIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxkZWVzLXdvcmtzcGFjZS1maWxldHJlZQogICAgICAgICAgICAgICAgLmV4ZWN1dGlvbkVudmlyb25tZW50PSR7dGhpcy5leGVjdXRpb25FbnZpcm9ubWVudH0KICAgICAgICAgICAgICAgIC5zZWxlY3RlZFBhdGg9JHt0aGlzLmFjdGl2ZUZpbGVQYXRofQogICAgICAgICAgICAgICAgQGZpbGUtc2VsZWN0PSR7dGhpcy5oYW5kbGVGaWxlU2VsZWN0fQogICAgICAgICAgICAgID48L2RlZXMtd29ya3NwYWNlLWZpbGV0cmVlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgJHshdGhpcy5pc0ZpbGVUcmVlQ29sbGFwc2VkID8gYjJgCiAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgY2xhc3M9InJlc2l6ZS1oYW5kbGUtdmVydGljYWwgJHt0aGlzLmlzRHJhZ2dpbmdGaWxlVHJlZSA/ICJkcmFnZ2luZyIgOiAiIn0iCiAgICAgICAgICAgICAgICBAbW91c2Vkb3duPSR7dGhpcy5oYW5kbGVGaWxlVHJlZU1vdXNlRG93bn0KICAgICAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgIGAgOiAiIn0KCiAgICAgICAgICA8IS0tIEVkaXRvciArIFRlcm1pbmFsIGFyZWEgLS0+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJlZGl0b3ItYXJlYSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVkaXRvci1wYW5lbCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFicy1iYXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFicy1jb250YWluZXIiPgogICAgICAgICAgICAgICAgICAke3RoaXMub3BlbkZpbGVzLm1hcCgoZmlsZSkgPT4gYjJgCiAgICAgICAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InRhYiAke2ZpbGUucGF0aCA9PT0gdGhpcy5hY3RpdmVGaWxlUGF0aCA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5hY3RpdmF0ZUZpbGUoZmlsZS5wYXRoKX0KICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICAke2ZpbGUubW9kaWZpZWQgPyBiMmA8c3BhbiBjbGFzcz0idGFiLW1vZGlmaWVkIj48L3NwYW4+YCA6ICIifQogICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhYi1uYW1lIj4ke2ZpbGUubmFtZX08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idGFiLWNsb3NlIiBAY2xpY2s9JHsoZTExKSA9PiB0aGlzLmNsb3NlRmlsZShlMTEsIGZpbGUucGF0aCl9PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTp4In0gaWNvblNpemU9IjEyIj48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgYCl9CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVkaXRvci1tZW51LWJ1dHRvbiIgQGNsaWNrPSR7dGhpcy5zaG93RWRpdG9yTWVudX0gdGl0bGU9IkVkaXRvciBvcHRpb25zIj4KICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbiAuaWNvbj0keyJsdWNpZGU6bW9yZVZlcnRpY2FsIn0gaWNvblNpemU9IjE2Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVkaXRvci1jb250ZW50Ij4KICAgICAgICAgICAgICAgICR7dGhpcy5zaG93RGlmZlZpZXcgJiYgdGhpcy5kaWZmVmlld0NvbmZpZyA/IGIyYAogICAgICAgICAgICAgICAgICA8ZGVlcy13b3Jrc3BhY2UtZGlmZi1lZGl0b3IKICAgICAgICAgICAgICAgICAgICAuZmlsZVBhdGg9JHt0aGlzLmRpZmZWaWV3Q29uZmlnLmZpbGVQYXRofQogICAgICAgICAgICAgICAgICAgIC5vcmlnaW5hbENvbnRlbnQ9JHt0aGlzLmRpZmZWaWV3Q29uZmlnLm9yaWdpbmFsQ29udGVudH0KICAgICAgICAgICAgICAgICAgICAubW9kaWZpZWRDb250ZW50PSR7dGhpcy5kaWZmVmlld0NvbmZpZy5tb2RpZmllZENvbnRlbnR9CiAgICAgICAgICAgICAgICAgICAgLmxhbmd1YWdlPSR7dGhpcy5kaWZmVmlld0NvbmZpZy5sYW5ndWFnZX0KICAgICAgICAgICAgICAgICAgICBAZGlmZi1yZXNvbHZlZD0ke3RoaXMuaGFuZGxlRGlmZlJlc29sdmVkfQogICAgICAgICAgICAgICAgICAgIEBkaWZmLWNsb3NlZD0keygpID0+IHsKICAgICAgICB0aGlzLnNob3dEaWZmVmlldyA9IGZhbHNlOwogICAgICAgIHRoaXMuZGlmZlZpZXdDb25maWcgPSBudWxsOwogICAgICB9fQogICAgICAgICAgICAgICAgICA+PC9kZWVzLXdvcmtzcGFjZS1kaWZmLWVkaXRvcj4KICAgICAgICAgICAgICAgIGAgOiB0aGlzLm9wZW5GaWxlcy5sZW5ndGggPT09IDAgPyBiMmAKICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiPgogICAgICAgICAgICAgICAgICAgIDxkZWVzLWljb24gLmljb249JHsibHVjaWRlOmZpbGVDb2RlIn0gaWNvblNpemU9IjQ4Ij48L2RlZXMtaWNvbj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TZWxlY3QgYSBmaWxlIHRvIGVkaXQ8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgYCA6IGIyYAogICAgICAgICAgICAgICAgICA8ZGVlcy13b3Jrc3BhY2UtbW9uYWNvCiAgICAgICAgICAgICAgICAgICAgLmZpbGVQYXRoPSR7dGhpcy5hY3RpdmVGaWxlUGF0aH0KICAgICAgICAgICAgICAgICAgICAuY29udGVudD0ke3RoaXMuZ2V0QWN0aXZlRmlsZUNvbnRlbnQoKX0KICAgICAgICAgICAgICAgICAgICAubGFuZ3VhZ2U9JHt0aGlzLmdldExhbmd1YWdlRnJvbVBhdGgodGhpcy5hY3RpdmVGaWxlUGF0aCl9CiAgICAgICAgICAgICAgICAgICAgQGNvbnRlbnQtY2hhbmdlPSR7dGhpcy5oYW5kbGVDb250ZW50Q2hhbmdlfQogICAgICAgICAgICAgICAgICA+PC9kZWVzLXdvcmtzcGFjZS1tb25hY28+CiAgICAgICAgICAgICAgICBgfQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkZWVzLWFjdGlvbmJhcj48L2RlZXMtYWN0aW9uYmFyPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gSG9yaXpvbnRhbCByZXNpemUgaGFuZGxlIGZvciB0ZXJtaW5hbCAtLT4KICAgICAgICAgICAgJHt0aGlzLnNob3dUZXJtaW5hbCAmJiAhdGhpcy5pc1Rlcm1pbmFsQ29sbGFwc2VkID8gYjJgCiAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgY2xhc3M9InJlc2l6ZS1oYW5kbGUtaG9yaXpvbnRhbCAke3RoaXMuaXNEcmFnZ2luZ1Rlcm1pbmFsID8gImRyYWdnaW5nIiA6ICIifSIKICAgICAgICAgICAgICAgIEBtb3VzZWRvd249JHt0aGlzLmhhbmRsZVRlcm1pbmFsTW91c2VEb3dufQogICAgICAgICAgICAgID48L2Rpdj4KICAgICAgICAgICAgYCA6ICIifQoKICAgICAgICAgICAgPCEtLSBUZXJtaW5hbCBwYW5lbCAtLT4KICAgICAgICAgICAgJHt0aGlzLnNob3dUZXJtaW5hbCA/IGIyYAogICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgIGNsYXNzPSJ0ZXJtaW5hbC1wYW5lbCAke3RoaXMuaXNUZXJtaW5hbENvbGxhcHNlZCA/ICJjb2xsYXBzZWQiIDogIiJ9IgogICAgICAgICAgICAgICAgc3R5bGU9ImhlaWdodDogJHt0aGlzLmlzVGVybWluYWxDb2xsYXBzZWQgPyAzMiA6IHRoaXMuY3VycmVudFRlcm1pbmFsSGVpZ2h0fXB4IgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhbmVsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhbmVsLXRhYnMiPgogICAgICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJwYW5lbC10YWIgJHt0aGlzLmFjdGl2ZUJvdHRvbVBhbmVsID09PSAidGVybWluYWwiID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmFjdGl2ZUJvdHRvbVBhbmVsID0gInRlcm1pbmFsIn0KICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTp0ZXJtaW5hbCJ9IGljb25TaXplPSIxNCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICAgICAgICBUZXJtaW5hbAogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJwYW5lbC10YWIgJHt0aGlzLmFjdGl2ZUJvdHRvbVBhbmVsID09PSAicHJvYmxlbXMiID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmFjdGl2ZUJvdHRvbVBhbmVsID0gInByb2JsZW1zIn0KICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTpjaXJjbGVBbGVydCJ9IGljb25TaXplPSIxNCI+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICAgICAgICBQcm9ibGVtcwogICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLmRpYWdub3N0aWNNYXJrZXJzLmxlbmd0aCA+IDAgPyBiMmAKICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InBhbmVsLXRhYi1iYWRnZSAke3RoaXMuZ2V0RXJyb3JDb3VudCgpID09PSAwID8gIndhcm5pbmciIDogIiJ9Ij4ke3RoaXMuZGlhZ25vc3RpY01hcmtlcnMubGVuZ3RofTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhbmVsLWhlYWRlci1hY3Rpb25zIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbC1hY3Rpb24iIEBjbGljaz0ke3RoaXMudG9nZ2xlVGVybWluYWx9PgogICAgICAgICAgICAgICAgICAgICAgPGRlZXMtaWNvbgogICAgICAgICAgICAgICAgICAgICAgICAuaWNvbj0ke3RoaXMuaXNUZXJtaW5hbENvbGxhcHNlZCA/ICJsdWNpZGU6Y2hldnJvblVwIiA6ICJsdWNpZGU6Y2hldnJvbkRvd24ifQogICAgICAgICAgICAgICAgICAgICAgICBpY29uU2l6ZT0iMTQiCiAgICAgICAgICAgICAgICAgICAgICA+PC9kZWVzLWljb24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXJtaW5hbC1jb250ZW50IiBzdHlsZT0iZGlzcGxheTogJHt0aGlzLmFjdGl2ZUJvdHRvbVBhbmVsID09PSAidGVybWluYWwiID8gImJsb2NrIiA6ICJub25lIn0iPgogICAgICAgICAgICAgICAgICA8ZGVlcy13b3Jrc3BhY2UtdGVybWluYWwKICAgICAgICAgICAgICAgICAgICAuZXhlY3V0aW9uRW52aXJvbm1lbnQ9JHt0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50fQogICAgICAgICAgICAgICAgICAgIC5zZXR1cENvbW1hbmQ9JHsiIn0KICAgICAgICAgICAgICAgICAgPjwvZGVlcy13b3Jrc3BhY2UtdGVybWluYWw+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByb2JsZW1zLWNvbnRlbnQiIHN0eWxlPSJkaXNwbGF5OiAke3RoaXMuYWN0aXZlQm90dG9tUGFuZWwgPT09ICJwcm9ibGVtcyIgPyAiYmxvY2siIDogIm5vbmUifSI+CiAgICAgICAgICAgICAgICAgICR7dGhpcy5yZW5kZXJQcm9ibGVtc1BhbmVsKCl9CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYCA6ICIifQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDwhLS0gQm90dG9tIEJhciAoZnVsbCB3aWR0aCkgLS0+CiAgICAgICAgPGRlZXMtd29ya3NwYWNlLWJvdHRvbWJhcgogICAgICAgICAgLmV4ZWN1dGlvbkVudmlyb25tZW50PSR7dGhpcy5leGVjdXRpb25FbnZpcm9ubWVudH0KICAgICAgICAgIEBydW4tcHJvY2Vzcz0ke3RoaXMuaGFuZGxlUnVuUHJvY2Vzc30KICAgICAgICA+PC9kZWVzLXdvcmtzcGFjZS1ib3R0b21iYXI+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBhd2FpdCBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgdGhpcy5rZXlkb3duSGFuZGxlcik7CiAgICB9CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIHRoaXMua2V5ZG93bkhhbmRsZXIpOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCB0aGlzLmhhbmRsZUZpbGVUcmVlTW91c2VNb3ZlKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIHRoaXMuaGFuZGxlRmlsZVRyZWVNb3VzZVVwKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgdGhpcy5oYW5kbGVUZXJtaW5hbE1vdXNlTW92ZSk7CiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCB0aGlzLmhhbmRsZVRlcm1pbmFsTW91c2VVcCk7CiAgICAgIGlmICh0aGlzLmF1dG9TYXZlSW50ZXJ2YWwpIHsKICAgICAgICBjbGVhckludGVydmFsKHRoaXMuYXV0b1NhdmVJbnRlcnZhbCk7CiAgICAgICAgdGhpcy5hdXRvU2F2ZUludGVydmFsID0gbnVsbDsKICAgICAgfQogICAgICB0aGlzLnN0b3BOb2RlTW9kdWxlc1dhdGNoZXIoKTsKICAgICAgdGhpcy5zdG9wQWxsRmlsZVdhdGNoZXJzKCk7CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoKSB7CiAgICAgIHRoaXMuY3VycmVudEZpbGVUcmVlV2lkdGggPSB0aGlzLmZpbGVUcmVlV2lkdGg7CiAgICAgIHRoaXMuY3VycmVudFRlcm1pbmFsSGVpZ2h0ID0gdGhpcy50ZXJtaW5hbEhlaWdodDsKICAgICAgaWYgKHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVXb3Jrc3BhY2UoKTsKICAgICAgfQogICAgfQogICAgYXN5bmMgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJleGVjdXRpb25FbnZpcm9ubWVudCIpICYmIHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVXb3Jrc3BhY2UoKTsKICAgICAgfQogICAgICBpZiAoIXRoaXMuYWN0aW9uYmFyRWxlbWVudCkgewogICAgICAgIHRoaXMuYWN0aW9uYmFyRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmVkaXRvci1wYW5lbCBkZWVzLWFjdGlvbmJhciIpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBpbml0aWFsaXplV29ya3NwYWNlKCkgewogICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpCiAgICAgICAgcmV0dXJuOwogICAgICBpZiAodGhpcy5pbml0aWFsaXphdGlvblN0YXJ0ZWQpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLmluaXRpYWxpemF0aW9uU3RhcnRlZCA9IHRydWU7CiAgICAgIHRoaXMuaXNJbml0aWFsaXppbmcgPSB0cnVlOwogICAgICB0cnkgewogICAgICAgIGlmICh0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZSkgewogICAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2U7CiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5yZWFkeSkgewogICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5pbml0KCk7CiAgICAgICAgfQogICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZU9uSW5pdENvbW1hbmQoKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB3b3Jrc3BhY2U6IiwgZXJyb3IpOwogICAgICAgIHRoaXMuaW5pdGlhbGl6YXRpb25TdGFydGVkID0gZmFsc2U7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgdGhpcy5pc0luaXRpYWxpemluZyA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEV4ZWN1dGUgb25Jbml0IGNvbW1hbmQgZnJvbSBucG1leHRyYS5qc29uIGlmIHByZXNlbnQKICAgICAqIFRoaXMgYWxsb3dzIGF1dG9tYXRpYyBzZXR1cCBsaWtlIGBwbnBtIGluc3RhbGxgIG9uIHdvcmtzcGFjZSBpbml0aWFsaXphdGlvbgogICAgICovCiAgICBhc3luYyBleGVjdXRlT25Jbml0Q29tbWFuZCgpIHsKICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICAgIHJldHVybjsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5leGlzdHMoIi9ucG1leHRyYS5qc29uIikpIHsKICAgICAgICAgIGNvbnN0IGNvbnRlbnQzID0gYXdhaXQgdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudC5yZWFkRmlsZSgiL25wbWV4dHJhLmpzb24iKTsKICAgICAgICAgIGNvbnN0IGNvbmZpZzMgPSBKU09OLnBhcnNlKGNvbnRlbnQzKTsKICAgICAgICAgIGNvbnN0IG9uSW5pdCA9IGNvbmZpZzM/LmRlZXNFZGl0b3JXb3Jrc3BhY2U/Lm9uSW5pdDsKICAgICAgICAgIGlmIChvbkluaXQgJiYgdHlwZW9mIG9uSW5pdCA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coIkV4ZWN1dGluZyBvbkluaXQgY29tbWFuZDoiLCBvbkluaXQpOwogICAgICAgICAgICB0aGlzLmluaXRDb21tYW5kID0gb25Jbml0OwogICAgICAgICAgICB0aGlzLmluaXRPdXRwdXQgPSBbXTsKICAgICAgICAgICAgY29uc3QgW2NtZCwgLi4uYXJnc10gPSBvbkluaXQuc3BsaXQoIiAiKTsKICAgICAgICAgICAgY29uc3QgcHJvY2VzczQgPSBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LnNwYXduKGNtZCwgYXJncyk7CiAgICAgICAgICAgIHByb2Nlc3M0Lm91dHB1dC5waXBlVG8obmV3IFdyaXRhYmxlU3RyZWFtKHsKICAgICAgICAgICAgICB3cml0ZTogKGRhdGEpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gZGF0YS5zcGxpdCgiXG4iKTsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykgewogICAgICAgICAgICAgICAgICBpZiAobGluZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdE91dHB1dCA9IFsuLi50aGlzLmluaXRPdXRwdXQsIGxpbmVdOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcHJvY2VzczQuZXhpdDsKICAgICAgICAgICAgY29uc29sZS5sb2coIm9uSW5pdCBjb21tYW5kIGNvbXBsZXRlZCB3aXRoIGV4aXQgY29kZToiLCBleGl0Q29kZSk7CiAgICAgICAgICAgIHRoaXMuaW5pdE91dHB1dCA9IFsuLi50aGlzLmluaXRPdXRwdXQsICIiLCBgQ29tbWFuZCBjb21wbGV0ZWQgd2l0aCBleGl0IGNvZGU6ICR7ZXhpdENvZGV9YF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUud2FybigiRmFpbGVkIHRvIGV4ZWN1dGUgb25Jbml0IGNvbW1hbmQ6IiwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICBhc3luYyBpbml0aWFsaXplSW50ZWxsaVNlbnNlKCkgewogICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpCiAgICAgICAgcmV0dXJuOwogICAgICBpZiAodGhpcy5pbnRlbGxpU2Vuc2VJbml0aWFsaXplZCkKICAgICAgICByZXR1cm47CiAgICAgIGxldCBtb25hY29JbnN0YW5jZSA9IHdpbmRvdy5tb25hY287CiAgICAgIGlmICghbW9uYWNvSW5zdGFuY2UpIHsKICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHNldFRpbWVvdXQocmVzb2x2ZTIsIDEwMCkpOwogICAgICAgIG1vbmFjb0luc3RhbmNlID0gd2luZG93Lm1vbmFjbzsKICAgICAgfQogICAgICBpZiAoIW1vbmFjb0luc3RhbmNlKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJNb25hY28gbm90IHlldCBsb2FkZWQsIEludGVsbGlTZW5zZSB3aWxsIGJlIGluaXRpYWxpemVkIGxhdGVyIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuaW50ZWxsaVNlbnNlSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICB0aGlzLmludGVsbGlTZW5zZU1hbmFnZXIgPSBuZXcgVHlwZVNjcmlwdEludGVsbGlTZW5zZU1hbmFnZXIoKTsKICAgICAgYXdhaXQgdGhpcy5pbnRlbGxpU2Vuc2VNYW5hZ2VyLmluaXQobW9uYWNvSW5zdGFuY2UsIHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpOwogICAgICB0aGlzLnNldHVwTWFya2VyTGlzdGVuZXIoKTsKICAgICAgdGhpcy5zdGFydE5vZGVNb2R1bGVzV2F0Y2hlcigpOwogICAgICBhd2FpdCB0aGlzLmludGVsbGlTZW5zZU1hbmFnZXIuc2NhbkFuZExvYWROZXdQYWNrYWdlVHlwZXMoKTsKICAgIH0KICAgIC8qKgogICAgICogV2F0Y2ggbm9kZV9tb2R1bGVzIGZvciBjaGFuZ2VzIChlLmcuLCBhZnRlciBwbnBtIGluc3RhbGwpCiAgICAgKiBhbmQgYXV0b21hdGljYWxseSBsb2FkIHR5cGVzIGZvciBuZXcgcGFja2FnZXMKICAgICAqLwogICAgc3RhcnROb2RlTW9kdWxlc1dhdGNoZXIoKSB7CiAgICAgIGlmICghdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCB8fCB0aGlzLm5vZGVNb2R1bGVzV2F0Y2hlcikKICAgICAgICByZXR1cm47CiAgICAgIHRyeSB7CiAgICAgICAgdGhpcy5ub2RlTW9kdWxlc1dhdGNoZXIgPSB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LndhdGNoKCIvbm9kZV9tb2R1bGVzIiwgKF9ldmVudCwgX2ZpbGVuYW1lKSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5ub2RlTW9kdWxlc0RlYm91bmNlVGltZW91dCkgewogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ub2RlTW9kdWxlc0RlYm91bmNlVGltZW91dCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLm5vZGVNb2R1bGVzRGVib3VuY2VUaW1lb3V0ID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGlmICh0aGlzLmludGVsbGlTZW5zZU1hbmFnZXIpIHsKICAgICAgICAgICAgICBhd2FpdCB0aGlzLmludGVsbGlTZW5zZU1hbmFnZXIuc2NhbkFuZExvYWROZXdQYWNrYWdlVHlwZXMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgMmUzKTsKICAgICAgICB9LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLndhcm4oIkNvdWxkIG5vdCB3YXRjaCBub2RlX21vZHVsZXM6IiwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICBzdG9wTm9kZU1vZHVsZXNXYXRjaGVyKCkgewogICAgICBpZiAodGhpcy5ub2RlTW9kdWxlc1dhdGNoZXIpIHsKICAgICAgICB0aGlzLm5vZGVNb2R1bGVzV2F0Y2hlci5zdG9wKCk7CiAgICAgICAgdGhpcy5ub2RlTW9kdWxlc1dhdGNoZXIgPSBudWxsOwogICAgICB9CiAgICAgIGlmICh0aGlzLm5vZGVNb2R1bGVzRGVib3VuY2VUaW1lb3V0KSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubm9kZU1vZHVsZXNEZWJvdW5jZVRpbWVvdXQpOwogICAgICAgIHRoaXMubm9kZU1vZHVsZXNEZWJvdW5jZVRpbWVvdXQgPSBudWxsOwogICAgICB9CiAgICB9CiAgICAvLyA9PT09PT09PT09IE9wZW4gRmlsZSBXYXRjaGluZyBmb3IgRXh0ZXJuYWwgQ2hhbmdlcyA9PT09PT09PT09CiAgICAvKioKICAgICAqIFN0YXJ0IHdhdGNoaW5nIGFuIG9wZW4gZmlsZSBmb3IgZXh0ZXJuYWwgY2hhbmdlcwogICAgICovCiAgICBzdGFydFdhdGNoaW5nRmlsZShwYXRoMikgewogICAgICBpZiAoIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQgfHwgdGhpcy5vcGVuRmlsZVdhdGNoZXJzLmhhcyhwYXRoMikpCiAgICAgICAgcmV0dXJuOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IHdhdGNoZXIgPSB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LndhdGNoKHBhdGgyLCAoX2V2ZW50LCBfZmlsZW5hbWUpID0+IHsKICAgICAgICAgIGNvbnN0IGV4aXN0aW5nVGltZW91dCA9IHRoaXMuZmlsZUNoYW5nZURlYm91bmNlLmdldChwYXRoMik7CiAgICAgICAgICBpZiAoZXhpc3RpbmdUaW1lb3V0KSB7CiAgICAgICAgICAgIGNsZWFyVGltZW91dChleGlzdGluZ1RpbWVvdXQpOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgdGltZW91dDIgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgdGhpcy5oYW5kbGVFeHRlcm5hbEZpbGVDaGFuZ2UocGF0aDIpOwogICAgICAgICAgICB0aGlzLmZpbGVDaGFuZ2VEZWJvdW5jZS5kZWxldGUocGF0aDIpOwogICAgICAgICAgfSwgMzAwKTsKICAgICAgICAgIHRoaXMuZmlsZUNoYW5nZURlYm91bmNlLnNldChwYXRoMiwgdGltZW91dDIpOwogICAgICAgIH0pOwogICAgICAgIHRoaXMub3BlbkZpbGVXYXRjaGVycy5zZXQocGF0aDIsIHdhdGNoZXIpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUud2FybihgQ291bGQgbm90IHdhdGNoIGZpbGUgJHtwYXRoMn06YCwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFN0b3Agd2F0Y2hpbmcgYSBmaWxlIHdoZW4gaXQncyBjbG9zZWQKICAgICAqLwogICAgc3RvcFdhdGNoaW5nRmlsZShwYXRoMikgewogICAgICBjb25zdCB3YXRjaGVyID0gdGhpcy5vcGVuRmlsZVdhdGNoZXJzLmdldChwYXRoMik7CiAgICAgIGlmICh3YXRjaGVyKSB7CiAgICAgICAgd2F0Y2hlci5zdG9wKCk7CiAgICAgICAgdGhpcy5vcGVuRmlsZVdhdGNoZXJzLmRlbGV0ZShwYXRoMik7CiAgICAgIH0KICAgICAgY29uc3QgdGltZW91dDIgPSB0aGlzLmZpbGVDaGFuZ2VEZWJvdW5jZS5nZXQocGF0aDIpOwogICAgICBpZiAodGltZW91dDIpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dDIpOwogICAgICAgIHRoaXMuZmlsZUNoYW5nZURlYm91bmNlLmRlbGV0ZShwYXRoMik7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU3RvcCBhbGwgZmlsZSB3YXRjaGVycwogICAgICovCiAgICBzdG9wQWxsRmlsZVdhdGNoZXJzKCkgewogICAgICBmb3IgKGNvbnN0IHdhdGNoZXIgb2YgdGhpcy5vcGVuRmlsZVdhdGNoZXJzLnZhbHVlcygpKSB7CiAgICAgICAgd2F0Y2hlci5zdG9wKCk7CiAgICAgIH0KICAgICAgdGhpcy5vcGVuRmlsZVdhdGNoZXJzLmNsZWFyKCk7CiAgICAgIGZvciAoY29uc3QgdGltZW91dDIgb2YgdGhpcy5maWxlQ2hhbmdlRGVib3VuY2UudmFsdWVzKCkpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dDIpOwogICAgICB9CiAgICAgIHRoaXMuZmlsZUNoYW5nZURlYm91bmNlLmNsZWFyKCk7CiAgICB9CiAgICAvKioKICAgICAqIEhhbmRsZSBleHRlcm5hbCBmaWxlIGNoYW5nZSAtIHNob3cgYWN0aW9uYmFyIGlmIGZpbGUgaGFzIGxvY2FsIGNoYW5nZXMsCiAgICAgKiBvdGhlcndpc2Ugc2lsZW50bHkgdXBkYXRlIHdpdGggY3Vyc29yIHByZXNlcnZhdGlvbgogICAgICovCiAgICBhc3luYyBoYW5kbGVFeHRlcm5hbEZpbGVDaGFuZ2UocGF0aDIpIHsKICAgICAgY29uc3QgZmlsZSA9IHRoaXMub3BlbkZpbGVzLmZpbmQoKGY4KSA9PiBmOC5wYXRoID09PSBwYXRoMik7CiAgICAgIGlmICghZmlsZSB8fCAhdGhpcy5leGVjdXRpb25FbnZpcm9ubWVudCkKICAgICAgICByZXR1cm47CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZEZpbGUocGF0aDIpOwogICAgICAgIGlmIChuZXdDb250ZW50ID09PSBmaWxlLmNvbnRlbnQpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYgKGZpbGUubW9kaWZpZWQpIHsKICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWN0aW9uYmFyRWxlbWVudD8uc2hvdyh7CiAgICAgICAgICAgIG1lc3NhZ2U6IGAiJHtmaWxlLm5hbWV9IiBjaGFuZ2VkIG9uIGRpc2suIFdoYXQgZG8geW91IHdhbnQgdG8gZG8/YCwKICAgICAgICAgICAgdHlwZTogInF1ZXN0aW9uIiwKICAgICAgICAgICAgaWNvbjogImx1Y2lkZTpnaXRNZXJnZSIsCiAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICB7IGlkOiAibG9hZC1kaXNrIiwgbGFiZWw6ICJMb2FkIGZyb20gRGlzayIsIHByaW1hcnk6IHRydWUgfSwKICAgICAgICAgICAgICB7IGlkOiAic2F2ZS1sb2NhbCIsIGxhYmVsOiAiU2F2ZSBMb2NhbCB0byBEaXNrIiB9LAogICAgICAgICAgICAgIHsgaWQ6ICJjb21wYXJlIiwgbGFiZWw6ICJDb21wYXJlIiB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIHRpbWVvdXQ6IHsgZHVyYXRpb246IDE1ZTMsIGRlZmF1bHRBY3Rpb25JZDogImxvYWQtZGlzayIgfSwKICAgICAgICAgICAgZGlzbWlzc2libGU6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uSWQgPT09ICJsb2FkLWRpc2siKSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlRmlsZUNvbnRlbnQocGF0aDIsIG5ld0NvbnRlbnQsIGZhbHNlKTsKICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0Py5hY3Rpb25JZCA9PT0gInNhdmUtbG9jYWwiKSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQud3JpdGVGaWxlKHBhdGgyLCBmaWxlLmNvbnRlbnQpOwogICAgICAgICAgICB0aGlzLm9wZW5GaWxlcyA9IHRoaXMub3BlbkZpbGVzLm1hcCgoZjgpID0+IGY4LnBhdGggPT09IHBhdGgyID8geyAuLi5mOCwgbW9kaWZpZWQ6IGZhbHNlIH0gOiBmOCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdD8uYWN0aW9uSWQgPT09ICJjb21wYXJlIikgewogICAgICAgICAgICB0aGlzLm9wZW5EaWZmVmlldyhwYXRoMiwgZmlsZS5jb250ZW50LCBuZXdDb250ZW50KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVGaWxlQ29udGVudChwYXRoMiwgbmV3Q29udGVudCwgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGhhbmRsZSBleHRlcm5hbCBjaGFuZ2UgZm9yICR7cGF0aDJ9OmAsIGVycm9yKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGUgZmlsZSBjb250ZW50IGluIHN0YXRlIGFuZCBvcHRpb25hbGx5IGluIHRoZSBlZGl0b3IKICAgICAqLwogICAgYXN5bmMgdXBkYXRlRmlsZUNvbnRlbnQocGF0aDIsIG5ld0NvbnRlbnQsIHByZXNlcnZlQ3Vyc29yKSB7CiAgICAgIHRoaXMub3BlbkZpbGVzID0gdGhpcy5vcGVuRmlsZXMubWFwKChmOCkgPT4gZjgucGF0aCA9PT0gcGF0aDIgPyB7IC4uLmY4LCBjb250ZW50OiBuZXdDb250ZW50LCBtb2RpZmllZDogZmFsc2UgfSA6IGY4KTsKICAgICAgaWYgKHBhdGgyID09PSB0aGlzLmFjdGl2ZUZpbGVQYXRoKSB7CiAgICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCJkZWVzLXdvcmtzcGFjZS1tb25hY28iKTsKICAgICAgICBpZiAoZWRpdG9yKSB7CiAgICAgICAgICBhd2FpdCBlZGl0b3Iuc2V0Q29udGVudEV4dGVybmFsKG5ld0NvbnRlbnQsIHByZXNlcnZlQ3Vyc29yKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogT3BlbiB0aGUgZGlmZiB2aWV3IHRvIGNvbXBhcmUgbG9jYWwgYW5kIGRpc2sgdmVyc2lvbnMKICAgICAqLwogICAgb3BlbkRpZmZWaWV3KHBhdGgyLCBsb2NhbENvbnRlbnQsIGRpc2tDb250ZW50KSB7CiAgICAgIHRoaXMuZGlmZlZpZXdDb25maWcgPSB7CiAgICAgICAgZmlsZVBhdGg6IHBhdGgyLAogICAgICAgIG9yaWdpbmFsQ29udGVudDogZGlza0NvbnRlbnQsCiAgICAgICAgbW9kaWZpZWRDb250ZW50OiBsb2NhbENvbnRlbnQsCiAgICAgICAgbGFuZ3VhZ2U6IHRoaXMuZ2V0TGFuZ3VhZ2VGcm9tUGF0aChwYXRoMikKICAgICAgfTsKICAgICAgdGhpcy5zaG93RGlmZlZpZXcgPSB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBIYW5kbGUgZGlmZiB2aWV3IHJlc29sdXRpb24KICAgICAqLwogICAgYXN5bmMgaGFuZGxlRGlmZlJlc29sdmVkKGUxMSkgewogICAgICBjb25zdCB7IGFjdGlvbiwgY29udGVudDogY29udGVudDMgfSA9IGUxMS5kZXRhaWw7CiAgICAgIGNvbnN0IHBhdGgyID0gdGhpcy5kaWZmVmlld0NvbmZpZz8uZmlsZVBhdGg7CiAgICAgIGlmICghcGF0aDIgfHwgIXRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKICAgICAgICB0aGlzLnNob3dEaWZmVmlldyA9IGZhbHNlOwogICAgICAgIHRoaXMuZGlmZlZpZXdDb25maWcgPSBudWxsOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoYWN0aW9uID09PSAidXNlLWxvY2FsIikgewogICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQud3JpdGVGaWxlKHBhdGgyLCBjb250ZW50Myk7CiAgICAgICAgdGhpcy5vcGVuRmlsZXMgPSB0aGlzLm9wZW5GaWxlcy5tYXAoKGY4KSA9PiBmOC5wYXRoID09PSBwYXRoMiA/IHsgLi4uZjgsIGNvbnRlbnQ6IGNvbnRlbnQzLCBtb2RpZmllZDogZmFsc2UgfSA6IGY4KTsKICAgICAgICBpZiAocGF0aDIgPT09IHRoaXMuYWN0aXZlRmlsZVBhdGgpIHsKICAgICAgICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiZGVlcy13b3Jrc3BhY2UtbW9uYWNvIik7CiAgICAgICAgICBpZiAoZWRpdG9yKSB7CiAgICAgICAgICAgIGF3YWl0IGVkaXRvci5zZXRDb250ZW50RXh0ZXJuYWwoY29udGVudDMsIGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAidXNlLWRpc2siKSB7CiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVGaWxlQ29udGVudChwYXRoMiwgY29udGVudDMsIGZhbHNlKTsKICAgICAgfQogICAgICB0aGlzLnNob3dEaWZmVmlldyA9IGZhbHNlOwogICAgICB0aGlzLmRpZmZWaWV3Q29uZmlnID0gbnVsbDsKICAgIH0KICAgIGFzeW5jIGhhbmRsZUZpbGVTZWxlY3QoZTExKSB7CiAgICAgIGNvbnN0IHsgcGF0aDogcGF0aDIsIG5hbWUgfSA9IGUxMS5kZXRhaWw7CiAgICAgIGF3YWl0IHRoaXMub3BlbkZpbGUocGF0aDIsIG5hbWUpOwogICAgfQogICAgYXN5bmMgb3BlbkZpbGUocGF0aDIsIG5hbWUpIHsKICAgICAgY29uc3QgZXhpc3RpbmdGaWxlID0gdGhpcy5vcGVuRmlsZXMuZmluZCgoZjgpID0+IGY4LnBhdGggPT09IHBhdGgyKTsKICAgICAgaWYgKGV4aXN0aW5nRmlsZSkgewogICAgICAgIHRoaXMuYWN0aXZlRmlsZVBhdGggPSBwYXRoMjsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICAgIHJldHVybjsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBjb250ZW50MyA9IGF3YWl0IHRoaXMuZXhlY3V0aW9uRW52aXJvbm1lbnQucmVhZEZpbGUocGF0aDIpOwogICAgICAgIHRoaXMub3BlbkZpbGVzID0gWwogICAgICAgICAgLi4udGhpcy5vcGVuRmlsZXMsCiAgICAgICAgICB7IHBhdGg6IHBhdGgyLCBuYW1lLCBjb250ZW50OiBjb250ZW50MywgbW9kaWZpZWQ6IGZhbHNlIH0KICAgICAgICBdOwogICAgICAgIHRoaXMuYWN0aXZlRmlsZVBhdGggPSBwYXRoMjsKICAgICAgICB0aGlzLnN0YXJ0V2F0Y2hpbmdGaWxlKHBhdGgyKTsKICAgICAgICBpZiAoIXRoaXMuaW50ZWxsaVNlbnNlSW5pdGlhbGl6ZWQpIHsKICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7CiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZTIpID0+IHNldFRpbWVvdXQocmVzb2x2ZTIsIDUwMCkpOwogICAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplSW50ZWxsaVNlbnNlKCk7CiAgICAgICAgICBjb25zdCBsYW5ndWFnZSA9IHRoaXMuZ2V0TGFuZ3VhZ2VGcm9tUGF0aChwYXRoMik7CiAgICAgICAgICBpZiAodGhpcy5pbnRlbGxpU2Vuc2VNYW5hZ2VyICYmIChsYW5ndWFnZSA9PT0gInR5cGVzY3JpcHQiIHx8IGxhbmd1YWdlID09PSAiamF2YXNjcmlwdCIpKSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuaW50ZWxsaVNlbnNlTWFuYWdlci5wcm9jZXNzQ29udGVudENoYW5nZShjb250ZW50Myk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBvcGVuIGZpbGUgJHtwYXRoMn06YCwgZXJyb3IpOwogICAgICB9CiAgICB9CiAgICBhY3RpdmF0ZUZpbGUocGF0aDIpIHsKICAgICAgdGhpcy5hY3RpdmVGaWxlUGF0aCA9IHBhdGgyOwogICAgfQogICAgY2xvc2VGaWxlKGUxMSwgcGF0aDIpIHsKICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBjb25zdCBmaWxlSW5kZXggPSB0aGlzLm9wZW5GaWxlcy5maW5kSW5kZXgoKGY4KSA9PiBmOC5wYXRoID09PSBwYXRoMik7CiAgICAgIGlmIChmaWxlSW5kZXggPT09IC0xKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgZmlsZSA9IHRoaXMub3BlbkZpbGVzW2ZpbGVJbmRleF07CiAgICAgIGlmIChmaWxlLm1vZGlmaWVkKSB7CiAgICAgICAgY29uc3QgY29uZmlybWVkID0gY29uZmlybShgJHtmaWxlLm5hbWV9IGhhcyB1bnNhdmVkIGNoYW5nZXMuIENsb3NlIGFueXdheT9gKTsKICAgICAgICBpZiAoIWNvbmZpcm1lZCkKICAgICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLnN0b3BXYXRjaGluZ0ZpbGUocGF0aDIpOwogICAgICB0aGlzLm9wZW5GaWxlcyA9IHRoaXMub3BlbkZpbGVzLmZpbHRlcigoZjgpID0+IGY4LnBhdGggIT09IHBhdGgyKTsKICAgICAgaWYgKHRoaXMuYWN0aXZlRmlsZVBhdGggPT09IHBhdGgyKSB7CiAgICAgICAgaWYgKHRoaXMub3BlbkZpbGVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGNvbnN0IG5ld0luZGV4ID0gTWF0aC5taW4oZmlsZUluZGV4LCB0aGlzLm9wZW5GaWxlcy5sZW5ndGggLSAxKTsKICAgICAgICAgIHRoaXMuYWN0aXZlRmlsZVBhdGggPSB0aGlzLm9wZW5GaWxlc1tuZXdJbmRleF0ucGF0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5hY3RpdmVGaWxlUGF0aCA9ICIiOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZ2V0QWN0aXZlRmlsZUNvbnRlbnQoKSB7CiAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLm9wZW5GaWxlcy5maW5kKChmOCkgPT4gZjgucGF0aCA9PT0gdGhpcy5hY3RpdmVGaWxlUGF0aCk7CiAgICAgIHJldHVybiBmaWxlPy5jb250ZW50IHx8ICIiOwogICAgfQogICAgaGFuZGxlQ29udGVudENoYW5nZShlMTEpIHsKICAgICAgY29uc3QgbmV3Q29udGVudCA9IGUxMS5kZXRhaWw7CiAgICAgIGNvbnN0IGZpbGVJbmRleCA9IHRoaXMub3BlbkZpbGVzLmZpbmRJbmRleCgoZjgpID0+IGY4LnBhdGggPT09IHRoaXMuYWN0aXZlRmlsZVBhdGgpOwogICAgICBpZiAoZmlsZUluZGV4ID09PSAtMSkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLm9wZW5GaWxlc1tmaWxlSW5kZXhdOwogICAgICBpZiAoZmlsZS5jb250ZW50ICE9PSBuZXdDb250ZW50KSB7CiAgICAgICAgdGhpcy5vcGVuRmlsZXMgPSBbCiAgICAgICAgICAuLi50aGlzLm9wZW5GaWxlcy5zbGljZSgwLCBmaWxlSW5kZXgpLAogICAgICAgICAgeyAuLi5maWxlLCBjb250ZW50OiBuZXdDb250ZW50LCBtb2RpZmllZDogdHJ1ZSB9LAogICAgICAgICAgLi4udGhpcy5vcGVuRmlsZXMuc2xpY2UoZmlsZUluZGV4ICsgMSkKICAgICAgICBdOwogICAgICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy5nZXRMYW5ndWFnZUZyb21QYXRoKHRoaXMuYWN0aXZlRmlsZVBhdGgpOwogICAgICAgIGlmICh0aGlzLmludGVsbGlTZW5zZU1hbmFnZXIgJiYgKGxhbmd1YWdlID09PSAidHlwZXNjcmlwdCIgfHwgbGFuZ3VhZ2UgPT09ICJqYXZhc2NyaXB0IikpIHsKICAgICAgICAgIGlmICh0aGlzLmludGVsbGlTZW5zZURlYm91bmNlVGltZW91dCkgewogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5pbnRlbGxpU2Vuc2VEZWJvdW5jZVRpbWVvdXQpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5pbnRlbGxpU2Vuc2VEZWJvdW5jZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgdGhpcy5pbnRlbGxpU2Vuc2VNYW5hZ2VyPy5wcm9jZXNzQ29udGVudENoYW5nZShuZXdDb250ZW50KTsKICAgICAgICAgIH0sIDUwMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBnZXRMYW5ndWFnZUZyb21QYXRoKHBhdGgyKSB7CiAgICAgIGNvbnN0IGV4dCA9IHBhdGgyLnNwbGl0KCIuIikucG9wKCk/LnRvTG93ZXJDYXNlKCk7CiAgICAgIGNvbnN0IGxhbmd1YWdlTWFwID0gewogICAgICAgIHRzOiAidHlwZXNjcmlwdCIsCiAgICAgICAgdHN4OiAidHlwZXNjcmlwdCIsCiAgICAgICAganM6ICJqYXZhc2NyaXB0IiwKICAgICAgICBqc3g6ICJqYXZhc2NyaXB0IiwKICAgICAgICBqc29uOiAianNvbiIsCiAgICAgICAgaHRtbDogImh0bWwiLAogICAgICAgIGNzczogImNzcyIsCiAgICAgICAgc2NzczogInNjc3MiLAogICAgICAgIGxlc3M6ICJsZXNzIiwKICAgICAgICBtZDogIm1hcmtkb3duIiwKICAgICAgICB5YW1sOiAieWFtbCIsCiAgICAgICAgeW1sOiAieWFtbCIsCiAgICAgICAgeG1sOiAieG1sIiwKICAgICAgICBzcWw6ICJzcWwiLAogICAgICAgIHB5OiAicHl0aG9uIiwKICAgICAgICBzaDogInNoZWxsIiwKICAgICAgICBiYXNoOiAic2hlbGwiCiAgICAgIH07CiAgICAgIHJldHVybiBsYW5ndWFnZU1hcFtleHQgfHwgIiJdIHx8ICJwbGFpbnRleHQiOwogICAgfQogICAgdG9nZ2xlVGVybWluYWwoKSB7CiAgICAgIHRoaXMuaXNUZXJtaW5hbENvbGxhcHNlZCA9ICF0aGlzLmlzVGVybWluYWxDb2xsYXBzZWQ7CiAgICB9CiAgICAvLyA9PT09PT09PT09IFNhdmUgT3BlcmF0aW9ucyA9PT09PT09PT09CiAgICBhc3luYyBzYXZlQWN0aXZlRmlsZSgpIHsKICAgICAgY29uc3QgZmlsZSA9IHRoaXMub3BlbkZpbGVzLmZpbmQoKGY4KSA9PiBmOC5wYXRoID09PSB0aGlzLmFjdGl2ZUZpbGVQYXRoKTsKICAgICAgaWYgKCFmaWxlIHx8ICF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICAgIHJldHVybjsKICAgICAgdHJ5IHsKICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LndyaXRlRmlsZShmaWxlLnBhdGgsIGZpbGUuY29udGVudCk7CiAgICAgICAgdGhpcy5vcGVuRmlsZXMgPSB0aGlzLm9wZW5GaWxlcy5tYXAoKGY4KSA9PiBmOC5wYXRoID09PSBmaWxlLnBhdGggPyB7IC4uLmY4LCBtb2RpZmllZDogZmFsc2UgfSA6IGY4KTsKICAgICAgICBpZiAodGhpcy5pbnRlbGxpU2Vuc2VNYW5hZ2VyKSB7CiAgICAgICAgICB0aGlzLmludGVsbGlTZW5zZU1hbmFnZXIuYWRkRmlsZU1vZGVsKGZpbGUucGF0aCwgZmlsZS5jb250ZW50KTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHNhdmUgZmlsZToiLCBlcnJvcik7CiAgICAgIH0KICAgIH0KICAgIGFzeW5jIHNhdmVBbGxGaWxlcygpIHsKICAgICAgaWYgKCF0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50KQogICAgICAgIHJldHVybjsKICAgICAgZm9yIChjb25zdCBmaWxlIG9mIHRoaXMub3BlbkZpbGVzLmZpbHRlcigoZjgpID0+IGY4Lm1vZGlmaWVkKSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGlvbkVudmlyb25tZW50LndyaXRlRmlsZShmaWxlLnBhdGgsIGZpbGUuY29udGVudCk7CiAgICAgICAgICBpZiAodGhpcy5pbnRlbGxpU2Vuc2VNYW5hZ2VyKSB7CiAgICAgICAgICAgIHRoaXMuaW50ZWxsaVNlbnNlTWFuYWdlci5hZGRGaWxlTW9kZWwoZmlsZS5wYXRoLCBmaWxlLmNvbnRlbnQpOwogICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gc2F2ZSAke2ZpbGUucGF0aH06YCwgZXJyb3IpOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLm9wZW5GaWxlcyA9IHRoaXMub3BlbkZpbGVzLm1hcCgoZjgpID0+ICh7IC4uLmY4LCBtb2RpZmllZDogZmFsc2UgfSkpOwogICAgfQogICAgLy8gPT09PT09PT09PSBFZGl0b3IgTWVudSA9PT09PT09PT09CiAgICBhc3luYyBzaG93RWRpdG9yTWVudShlMTEpIHsKICAgICAgZTExLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBjb25zdCBtZW51SXRlbXMgPSBbCiAgICAgICAgewogICAgICAgICAgbmFtZTogdGhpcy5hdXRvU2F2ZSA/ICJcdTI3MTMgQXV0byBTYXZlIiA6ICJBdXRvIFNhdmUiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6c2F2ZSIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMudG9nZ2xlQXV0b1NhdmUoKQogICAgICAgIH0sCiAgICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIlNhdmUiLAogICAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6c2F2ZSIsCiAgICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHRoaXMuc2F2ZUFjdGl2ZUZpbGUoKQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgbmFtZTogIlNhdmUgQWxsIiwKICAgICAgICAgIGljb25OYW1lOiAibHVjaWRlOnNhdmUiLAogICAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB0aGlzLnNhdmVBbGxGaWxlcygpCiAgICAgICAgfQogICAgICBdOwogICAgICBhd2FpdCBEZWVzQ29udGV4dG1lbnUub3BlbkNvbnRleHRNZW51V2l0aE9wdGlvbnMoZTExLCBtZW51SXRlbXMpOwogICAgfQogICAgdG9nZ2xlQXV0b1NhdmUoKSB7CiAgICAgIHRoaXMuYXV0b1NhdmUgPSAhdGhpcy5hdXRvU2F2ZTsKICAgICAgaWYgKHRoaXMuYXV0b1NhdmUpIHsKICAgICAgICB0aGlzLmF1dG9TYXZlSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICBjb25zdCBoYXNVbnNhdmVkID0gdGhpcy5vcGVuRmlsZXMuc29tZSgoZjgpID0+IGY4Lm1vZGlmaWVkKTsKICAgICAgICAgIGlmIChoYXNVbnNhdmVkKSB7CiAgICAgICAgICAgIHRoaXMuc2F2ZUFsbEZpbGVzKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgMmUzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAodGhpcy5hdXRvU2F2ZUludGVydmFsKSB7CiAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuYXV0b1NhdmVJbnRlcnZhbCk7CiAgICAgICAgICB0aGlzLmF1dG9TYXZlSW50ZXJ2YWwgPSBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZ2V0RXJyb3JDb3VudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuZGlhZ25vc3RpY01hcmtlcnMuZmlsdGVyKChtNykgPT4gbTcuc2V2ZXJpdHkgPT09IDgpLmxlbmd0aDsKICAgIH0KICAgIHJlbmRlclByb2JsZW1zUGFuZWwoKSB7CiAgICAgIGlmICh0aGlzLmRpYWdub3N0aWNNYXJrZXJzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybiBiMmAKICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ibGVtcy1lbXB0eSI+CiAgICAgICAgICA8ZGVlcy1pY29uIC5pY29uPSR7Imx1Y2lkZTpjaGVja0NpcmNsZSJ9IGljb25TaXplPSIyNCI+PC9kZWVzLWljb24+CiAgICAgICAgICA8c3Bhbj5ObyBwcm9ibGVtcyBkZXRlY3RlZDwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgYDsKICAgICAgfQogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InByb2JsZW1zLWxpc3QiPgogICAgICAgICR7dGhpcy5kaWFnbm9zdGljTWFya2Vycy5tYXAoKG1hcmtlcikgPT4gYjJgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ibGVtLWl0ZW0iIEBjbGljaz0keygpID0+IHRoaXMubmF2aWdhdGVUb1Byb2JsZW0obWFya2VyKX0+CiAgICAgICAgICAgIDxkZWVzLWljb24KICAgICAgICAgICAgICBjbGFzcz0icHJvYmxlbS1pY29uICR7bWFya2VyLnNldmVyaXR5ID09PSA4ID8gImVycm9yIiA6ICJ3YXJuaW5nIn0iCiAgICAgICAgICAgICAgLmljb249JHttYXJrZXIuc2V2ZXJpdHkgPT09IDggPyAibHVjaWRlOmNpcmNsZVgiIDogImx1Y2lkZTp0cmlhbmdsZUFsZXJ0In0KICAgICAgICAgICAgICBpY29uU2l6ZT0iMTQiCiAgICAgICAgICAgID48L2RlZXMtaWNvbj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvYmxlbS1kZXRhaWxzIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ibGVtLW1lc3NhZ2UiPiR7bWFya2VyLm1lc3NhZ2V9PC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvYmxlbS1sb2NhdGlvbiI+CiAgICAgICAgICAgICAgICAke21hcmtlci5yZXNvdXJjZS5wYXRoLnNwbGl0KCIvIikucG9wKCl9ICgke21hcmtlci5zdGFydExpbmVOdW1iZXJ9LCAke21hcmtlci5zdGFydENvbHVtbn0pCiAgICAgICAgICAgICAgICAke21hcmtlci5zb3VyY2UgPyBgWyR7bWFya2VyLnNvdXJjZX1dYCA6ICIifQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGApfQogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBuYXZpZ2F0ZVRvUHJvYmxlbShtYXJrZXIpIHsKICAgICAgY29uc3QgZmlsZVBhdGggPSBtYXJrZXIucmVzb3VyY2UucGF0aDsKICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlUGF0aC5zcGxpdCgiLyIpLnBvcCgpIHx8ICIiOwogICAgICBjb25zdCBleGlzdGluZ0ZpbGUgPSB0aGlzLm9wZW5GaWxlcy5maW5kKChmOCkgPT4gZjgucGF0aCA9PT0gZmlsZVBhdGgpOwogICAgICBpZiAoIWV4aXN0aW5nRmlsZSkgewogICAgICAgIGF3YWl0IHRoaXMub3BlbkZpbGUoZmlsZVBhdGgsIGZpbGVOYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmFjdGl2ZUZpbGVQYXRoID0gZmlsZVBhdGg7CiAgICAgIH0KICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgY29uc3QgZWRpdG9yRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiZGVlcy13b3Jrc3BhY2UtbW9uYWNvIik7CiAgICAgIGlmIChlZGl0b3JFbGVtZW50KSB7CiAgICAgICAgY29uc3QgZWRpdG9yID0gYXdhaXQgZWRpdG9yRWxlbWVudC5lZGl0b3JEZWZlcnJlZC5wcm9taXNlOwogICAgICAgIGVkaXRvci5yZXZlYWxMaW5lSW5DZW50ZXIobWFya2VyLnN0YXJ0TGluZU51bWJlcik7CiAgICAgICAgZWRpdG9yLnNldFBvc2l0aW9uKHsKICAgICAgICAgIGxpbmVOdW1iZXI6IG1hcmtlci5zdGFydExpbmVOdW1iZXIsCiAgICAgICAgICBjb2x1bW46IG1hcmtlci5zdGFydENvbHVtbgogICAgICAgIH0pOwogICAgICAgIGVkaXRvci5mb2N1cygpOwogICAgICB9CiAgICB9CiAgICBzZXR1cE1hcmtlckxpc3RlbmVyKCkgewogICAgICBjb25zdCBtb25hY29JbnN0YW5jZSA9IHdpbmRvdy5tb25hY287CiAgICAgIGlmICghbW9uYWNvSW5zdGFuY2UpCiAgICAgICAgcmV0dXJuOwogICAgICBtb25hY29JbnN0YW5jZS5lZGl0b3Iub25EaWRDaGFuZ2VNYXJrZXJzKCh1cmlzKSA9PiB7CiAgICAgICAgdGhpcy51cGRhdGVEaWFnbm9zdGljTWFya2VycygpOwogICAgICB9KTsKICAgICAgdGhpcy51cGRhdGVEaWFnbm9zdGljTWFya2VycygpOwogICAgfQogICAgdXBkYXRlRGlhZ25vc3RpY01hcmtlcnMoKSB7CiAgICAgIGNvbnN0IG1vbmFjb0luc3RhbmNlID0gd2luZG93Lm1vbmFjbzsKICAgICAgaWYgKCFtb25hY29JbnN0YW5jZSkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IGFsbE1hcmtlcnMgPSBtb25hY29JbnN0YW5jZS5lZGl0b3IuZ2V0TW9kZWxNYXJrZXJzKHt9KTsKICAgICAgdGhpcy5kaWFnbm9zdGljTWFya2VycyA9IGFsbE1hcmtlcnMubWFwKChtNykgPT4gKHsKICAgICAgICBtZXNzYWdlOiBtNy5tZXNzYWdlLAogICAgICAgIHNldmVyaXR5OiBtNy5zZXZlcml0eSwKICAgICAgICBzdGFydExpbmVOdW1iZXI6IG03LnN0YXJ0TGluZU51bWJlciwKICAgICAgICBzdGFydENvbHVtbjogbTcuc3RhcnRDb2x1bW4sCiAgICAgICAgZW5kTGluZU51bWJlcjogbTcuZW5kTGluZU51bWJlciwKICAgICAgICBlbmRDb2x1bW46IG03LmVuZENvbHVtbiwKICAgICAgICBzb3VyY2U6IG03LnNvdXJjZSwKICAgICAgICByZXNvdXJjZTogeyBwYXRoOiBtNy5yZXNvdXJjZS5wYXRoIH0KICAgICAgfSkpOwogICAgfQogICAgLy8gPT09PT09PT09PSBCb3R0b20gQmFyIEV2ZW50IEhhbmRsZXJzID09PT09PT09PT0KICAgIC8qKgogICAgICogSGFuZGxlIHJ1bi1wcm9jZXNzIGV2ZW50cyBmcm9tIGJvdHRvbSBiYXIgd2lkZ2V0cwogICAgICogQ3JlYXRlcyBhIG5ldyB0ZXJtaW5hbCB0YWIgZm9yIHRoZSBwcm9jZXNzCiAgICAgKi8KICAgIGFzeW5jIGhhbmRsZVJ1blByb2Nlc3MoZTExKSB7CiAgICAgIGNvbnN0IGRldGFpbCA9IGUxMS5kZXRhaWw7CiAgICAgIGNvbnN0IHRlcm1pbmFsID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCJkZWVzLXdvcmtzcGFjZS10ZXJtaW5hbCIpOwogICAgICBpZiAoIXRlcm1pbmFsKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJUZXJtaW5hbCBjb21wb25lbnQgbm90IGZvdW5kIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLmlzVGVybWluYWxDb2xsYXBzZWQpIHsKICAgICAgICB0aGlzLmlzVGVybWluYWxDb2xsYXBzZWQgPSBmYWxzZTsKICAgICAgfQogICAgICB0aGlzLmFjdGl2ZUJvdHRvbVBhbmVsID0gInRlcm1pbmFsIjsKICAgICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsKICAgICAgYXdhaXQgdGVybWluYWwuY3JlYXRlUHJvY2Vzc1RhYih7CiAgICAgICAgdHlwZTogZGV0YWlsLnR5cGUsCiAgICAgICAgbGFiZWw6IGRldGFpbC5sYWJlbCwKICAgICAgICBjb21tYW5kOiBkZXRhaWwuY29tbWFuZCwKICAgICAgICBhcmdzOiBkZXRhaWwuYXJncywKICAgICAgICBtZXRhZGF0YTogZGV0YWlsLm1ldGFkYXRhLAogICAgICAgIHN3aXRjaFRvVGFiOiB0cnVlCiAgICAgIH0pOwogICAgfQogICAgLy8gPT09PT09PT09PSBQdWJsaWMgTGF5b3V0IE1ldGhvZHMgPT09PT09PT09PQogICAgLyoqCiAgICAgKiBQcm9ncmFtbWF0aWNhbGx5IHNldCB0aGUgZmlsZSB0cmVlIHdpZHRoCiAgICAgKi8KICAgIHNldEZpbGVUcmVlV2lkdGgod2lkdGgpIHsKICAgICAgY29uc3QgbWluV2lkdGggPSAxNTA7CiAgICAgIGNvbnN0IG1heFdpZHRoID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAqIDAuNTsKICAgICAgdGhpcy5jdXJyZW50RmlsZVRyZWVXaWR0aCA9IE1hdGgubWF4KG1pbldpZHRoLCBNYXRoLm1pbihtYXhXaWR0aCwgd2lkdGgpKTsKICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSk7CiAgICB9CiAgICAvKioKICAgICAqIFByb2dyYW1tYXRpY2FsbHkgc2V0IHRoZSB0ZXJtaW5hbCBoZWlnaHQKICAgICAqLwogICAgc2V0VGVybWluYWxIZWlnaHQoaGVpZ2h0KSB7CiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IDEwMDsKICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgKiAwLjc7CiAgICAgIHRoaXMuY3VycmVudFRlcm1pbmFsSGVpZ2h0ID0gTWF0aC5tYXgobWluSGVpZ2h0LCBNYXRoLm1pbihtYXhIZWlnaHQsIGhlaWdodCkpOwogICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInJlc2l6ZSIpKTsKICAgIH0KICAgIC8qKgogICAgICogUmVzZXQgbGF5b3V0IHRvIGluaXRpYWwgcHJvcGVydHkgdmFsdWVzCiAgICAgKi8KICAgIHJlc2V0TGF5b3V0KCkgewogICAgICB0aGlzLmN1cnJlbnRGaWxlVHJlZVdpZHRoID0gdGhpcy5maWxlVHJlZVdpZHRoOwogICAgICB0aGlzLmN1cnJlbnRUZXJtaW5hbEhlaWdodCA9IHRoaXMudGVybWluYWxIZWlnaHQ7CiAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgicmVzaXplIikpOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnM5OShfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1dvcmtzcGFjZTIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLXdvcmtzcGFjZS9kZWVzLXdvcmtzcGFjZS10ZXJtaW5hbC9pbmRleC5qcwppbml0X2RlZXNfd29ya3NwYWNlX3Rlcm1pbmFsKCk7CmluaXRfdGVybWluYWxfdGFiX21hbmFnZXIoKTsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC13b3Jrc3BhY2UvZGVlcy13b3Jrc3BhY2UtbWFya2Rvd24vZGVlcy13b3Jrc3BhY2UtbWFya2Rvd24uanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlOTkgPSBmdW5jdGlvbihjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykgewogIGZ1bmN0aW9uIGFjY2VwdChmOCkgewogICAgaWYgKGY4ICE9PSB2b2lkIDAgJiYgdHlwZW9mIGY4ICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbiBleHBlY3RlZCIpOwogICAgcmV0dXJuIGY4OwogIH0KICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkyID0ga2luZCA9PT0gImdldHRlciIgPyAiZ2V0IiA6IGtpbmQgPT09ICJzZXR0ZXIiID8gInNldCIgOiAidmFsdWUiOwogIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bInN0YXRpYyJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDsKICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTsKICB2YXIgXzUsIGRvbmUgPSBmYWxzZTsKICBmb3IgKHZhciBpMTEgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkxMSA+PSAwOyBpMTEtLSkgewogICAgdmFyIGNvbnRleHQyID0ge307CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4pIGNvbnRleHQyW3A4XSA9IHA4ID09PSAiYWNjZXNzIiA/IHt9IDogY29udGV4dEluW3A4XTsKICAgIGZvciAodmFyIHA4IGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQyLmFjY2Vzc1twOF0gPSBjb250ZXh0SW4uYWNjZXNzW3A4XTsKICAgIGNvbnRleHQyLmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24oZjgpIHsKICAgICAgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZCIpOwogICAgICBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmOCB8fCBudWxsKSk7CiAgICB9OwogICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2kxMV0pKGtpbmQgPT09ICJhY2Nlc3NvciIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5Ml0sIGNvbnRleHQyKTsKICAgIGlmIChraW5kID09PSAiYWNjZXNzb3IiKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7CiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gIm9iamVjdCIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZCIpOwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfNTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgfSBlbHNlIGlmIChfNSA9IGFjY2VwdChyZXN1bHQpKSB7CiAgICAgIGlmIChraW5kID09PSAiZmllbGQiKSBpbml0aWFsaXplcnMudW5zaGlmdChfNSk7CiAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXkyXSA9IF81OwogICAgfQogIH0KICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7CiAgZG9uZSA9IHRydWU7Cn07CnZhciBfX3J1bkluaXRpYWxpemVyczEwMCA9IGZ1bmN0aW9uKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUyKSB7CiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgZm9yICh2YXIgaTExID0gMDsgaTExIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaTExKyspIHsKICAgIHZhbHVlMiA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnLCB2YWx1ZTIpIDogaW5pdGlhbGl6ZXJzW2kxMV0uY2FsbCh0aGlzQXJnKTsKICB9CiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUyIDogdm9pZCAwOwp9Owp2YXIgZGVmZXJyZWQgPSBkaXN0X3RzX2V4cG9ydHMyOS5wbHVnaW5zLnNtYXJ0cHJvbWlzZS5kZWZlcigpOwp2YXIgRGVlc1dvcmtzcGFjZU1hcmtkb3duID0gKCgpID0+IHsKICBsZXQgX2NsYXNzRGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50KCJkZWVzLXdvcmtzcGFjZS1tYXJrZG93biIpXTsKICBsZXQgX2NsYXNzRGVzY3JpcHRvcjsKICBsZXQgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2NsYXNzVGhpczsKICBsZXQgX2NsYXNzU3VwZXIgPSBEZWVzRWxlbWVudDsKICBsZXQgX3NwbGl0UmF0aW9fZGVjb3JhdG9yczsKICBsZXQgX3NwbGl0UmF0aW9faW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9zcGxpdFJhdGlvX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9taW5QYW5lbFNpemVfZGVjb3JhdG9yczsKICBsZXQgX21pblBhbmVsU2l6ZV9pbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX21pblBhbmVsU2l6ZV9leHRyYUluaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VycmVudFNwbGl0UmF0aW9fZGVjb3JhdG9yczsKICBsZXQgX2N1cnJlbnRTcGxpdFJhdGlvX2luaXRpYWxpemVycyA9IFtdOwogIGxldCBfY3VycmVudFNwbGl0UmF0aW9fZXh0cmFJbml0aWFsaXplcnMgPSBbXTsKICBsZXQgX2lzRHJhZ2dpbmdfZGVjb3JhdG9yczsKICBsZXQgX2lzRHJhZ2dpbmdfaW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9pc0RyYWdnaW5nX2V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgdmFyIERlZXNXb3Jrc3BhY2VNYXJrZG93bjIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9zcGxpdFJhdGlvX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfbWluUGFuZWxTaXplX2RlY29yYXRvcnMgPSBbbjUoeyB0eXBlOiBOdW1iZXIgfSldOwogICAgICBfY3VycmVudFNwbGl0UmF0aW9fZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX2lzRHJhZ2dpbmdfZGVjb3JhdG9ycyA9IFtyNSgpXTsKICAgICAgX19lc0RlY29yYXRlOTkodGhpcywgbnVsbCwgX3NwbGl0UmF0aW9fZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAic3BsaXRSYXRpbyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAic3BsaXRSYXRpbyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5zcGxpdFJhdGlvLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5zcGxpdFJhdGlvID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX3NwbGl0UmF0aW9faW5pdGlhbGl6ZXJzLCBfc3BsaXRSYXRpb19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk5KHRoaXMsIG51bGwsIF9taW5QYW5lbFNpemVfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAibWluUGFuZWxTaXplIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IChvYmopID0+ICJtaW5QYW5lbFNpemUiIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmoubWluUGFuZWxTaXplLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5taW5QYW5lbFNpemUgPSB2YWx1ZTI7CiAgICAgIH0gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBfbWluUGFuZWxTaXplX2luaXRpYWxpemVycywgX21pblBhbmVsU2l6ZV9leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk5KHRoaXMsIG51bGwsIF9jdXJyZW50U3BsaXRSYXRpb19kZWNvcmF0b3JzLCB7IGtpbmQ6ICJhY2Nlc3NvciIsIG5hbWU6ICJjdXJyZW50U3BsaXRSYXRpbyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiY3VycmVudFNwbGl0UmF0aW8iIGluIG9iaiwgZ2V0OiAob2JqKSA9PiBvYmouY3VycmVudFNwbGl0UmF0aW8sIHNldDogKG9iaiwgdmFsdWUyKSA9PiB7CiAgICAgICAgb2JqLmN1cnJlbnRTcGxpdFJhdGlvID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2N1cnJlbnRTcGxpdFJhdGlvX2luaXRpYWxpemVycywgX2N1cnJlbnRTcGxpdFJhdGlvX2V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgX19lc0RlY29yYXRlOTkodGhpcywgbnVsbCwgX2lzRHJhZ2dpbmdfZGVjb3JhdG9ycywgeyBraW5kOiAiYWNjZXNzb3IiLCBuYW1lOiAiaXNEcmFnZ2luZyIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiAob2JqKSA9PiAiaXNEcmFnZ2luZyIgaW4gb2JqLCBnZXQ6IChvYmopID0+IG9iai5pc0RyYWdnaW5nLCBzZXQ6IChvYmosIHZhbHVlMikgPT4gewogICAgICAgIG9iai5pc0RyYWdnaW5nID0gdmFsdWUyOwogICAgICB9IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgX2lzRHJhZ2dpbmdfaW5pdGlhbGl6ZXJzLCBfaXNEcmFnZ2luZ19leHRyYUluaXRpYWxpemVycyk7CiAgICAgIF9fZXNEZWNvcmF0ZTk5KG51bGwsIF9jbGFzc0Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfY2xhc3NUaGlzIH0sIF9jbGFzc0RlY29yYXRvcnMsIHsga2luZDogImNsYXNzIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTsKICAgICAgRGVlc1dvcmtzcGFjZU1hcmtkb3duMiA9IF9jbGFzc1RoaXMgPSBfY2xhc3NEZXNjcmlwdG9yLnZhbHVlOwogICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7CiAgICB9CiAgICBzdGF0aWMgZGVtbyA9ICgpID0+IGIyYDxkZWVzLXdvcmtzcGFjZS1tYXJrZG93bj48L2RlZXMtd29ya3NwYWNlLW1hcmtkb3duPmA7CiAgICBzdGF0aWMgZGVtb0dyb3VwcyA9IFsiV29ya3NwYWNlIl07CiAgICBzdGF0aWMgc3R5bGVzID0gWwogICAgICB0aGVtZURlZmF1bHRTdHlsZXMsCiAgICAgIGNzc01hbmFnZXIuZGVmYXVsdFN0eWxlcywKICAgICAgaWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zcGxpdENvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KCiAgICAgIC5lZGl0b3JDb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgbWluLXdpZHRoOiAxMDBweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAucmVzaXplSGFuZGxlIHsKICAgICAgICB3aWR0aDogNnB4OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2U1ZTdlYiIsICIjMzAzNjNkIil9OwogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzIGVhc2U7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAucmVzaXplSGFuZGxlOmhvdmVyLAogICAgICAucmVzaXplSGFuZGxlLmRyYWdnaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzNiODJmNiIsICIjNThhNmZmIil9OwogICAgICB9CgogICAgICAucmVzaXplSGFuZGxlOjphZnRlciB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgICB3aWR0aDogMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBiYWNrZ3JvdW5kOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzljYTNhZiIsICIjNmU3NjgxIil9OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDFweDsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgIH0KCiAgICAgIC5yZXNpemVIYW5kbGU6aG92ZXI6OmFmdGVyLAogICAgICAucmVzaXplSGFuZGxlLmRyYWdnaW5nOjphZnRlciB7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiI2ZmZmZmZiIpfTsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAub3V0bGV0Q29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG1pbi13aWR0aDogMTAwcHg7CiAgICAgICAgYmFja2dyb3VuZDogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmZmZmZmYiLCAiIzBkMTExNyIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyNDI5MmYiLCAiI2U2ZWRmMyIpfTsKICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCAnTm90byBTYW5zJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsKICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQoKICAgICAgLyogUHJldmVudCB0ZXh0IHNlbGVjdGlvbiB3aGlsZSBkcmFnZ2luZyAqLwogICAgICAuc3BsaXRDb250YWluZXIuZHJhZ2dpbmcgewogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICB9CgogICAgICAuc3BsaXRDb250YWluZXIuZHJhZ2dpbmcgLmVkaXRvckNvbnRhaW5lciwKICAgICAgLnNwbGl0Q29udGFpbmVyLmRyYWdnaW5nIC5vdXRsZXRDb250YWluZXIgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICBgCiAgICBdOwogICAgI3NwbGl0UmF0aW9fYWNjZXNzb3Jfc3RvcmFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzMTAwKHRoaXMsIF9zcGxpdFJhdGlvX2luaXRpYWxpemVycywgNTApOwogICAgLyoqCiAgICAgKiBJbml0aWFsIHNwbGl0IHJhdGlvIGZvciB0aGUgZWRpdG9yIChsZWZ0KSBwYW5lbC4KICAgICAqIFZhbHVlIGZyb20gMCB0byAxMDAgcmVwcmVzZW50aW5nIHBlcmNlbnRhZ2Ugd2lkdGguCiAgICAgKiBEZWZhdWx0IGlzIDUwICg1MC81MCBzcGxpdCkuCiAgICAgKi8KICAgIGdldCBzcGxpdFJhdGlvKCkgewogICAgICByZXR1cm4gdGhpcy4jc3BsaXRSYXRpb19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IHNwbGl0UmF0aW8odmFsdWUyKSB7CiAgICAgIHRoaXMuI3NwbGl0UmF0aW9fYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgICNtaW5QYW5lbFNpemVfYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczEwMCh0aGlzLCBfc3BsaXRSYXRpb19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTAwKHRoaXMsIF9taW5QYW5lbFNpemVfaW5pdGlhbGl6ZXJzLCAxMCkpOwogICAgLyoqCiAgICAgKiBNaW5pbXVtIHdpZHRoIHBlcmNlbnRhZ2UgZm9yIGVpdGhlciBwYW5lbC4KICAgICAqLwogICAgZ2V0IG1pblBhbmVsU2l6ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuI21pblBhbmVsU2l6ZV9hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IG1pblBhbmVsU2l6ZSh2YWx1ZTIpIHsKICAgICAgdGhpcy4jbWluUGFuZWxTaXplX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjY3VycmVudFNwbGl0UmF0aW9fYWNjZXNzb3Jfc3RvcmFnZSA9IChfX3J1bkluaXRpYWxpemVyczEwMCh0aGlzLCBfbWluUGFuZWxTaXplX2V4dHJhSW5pdGlhbGl6ZXJzKSwgX19ydW5Jbml0aWFsaXplcnMxMDAodGhpcywgX2N1cnJlbnRTcGxpdFJhdGlvX2luaXRpYWxpemVycywgNTApKTsKICAgIGdldCBjdXJyZW50U3BsaXRSYXRpbygpIHsKICAgICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRTcGxpdFJhdGlvX2FjY2Vzc29yX3N0b3JhZ2U7CiAgICB9CiAgICBzZXQgY3VycmVudFNwbGl0UmF0aW8odmFsdWUyKSB7CiAgICAgIHRoaXMuI2N1cnJlbnRTcGxpdFJhdGlvX2FjY2Vzc29yX3N0b3JhZ2UgPSB2YWx1ZTI7CiAgICB9CiAgICAjaXNEcmFnZ2luZ19hY2Nlc3Nvcl9zdG9yYWdlID0gKF9fcnVuSW5pdGlhbGl6ZXJzMTAwKHRoaXMsIF9jdXJyZW50U3BsaXRSYXRpb19leHRyYUluaXRpYWxpemVycyksIF9fcnVuSW5pdGlhbGl6ZXJzMTAwKHRoaXMsIF9pc0RyYWdnaW5nX2luaXRpYWxpemVycywgZmFsc2UpKTsKICAgIGdldCBpc0RyYWdnaW5nKCkgewogICAgICByZXR1cm4gdGhpcy4jaXNEcmFnZ2luZ19hY2Nlc3Nvcl9zdG9yYWdlOwogICAgfQogICAgc2V0IGlzRHJhZ2dpbmcodmFsdWUyKSB7CiAgICAgIHRoaXMuI2lzRHJhZ2dpbmdfYWNjZXNzb3Jfc3RvcmFnZSA9IHZhbHVlMjsKICAgIH0KICAgIHJlc2l6ZUhhbmRsZUVsZW1lbnQgPSBfX3J1bkluaXRpYWxpemVyczEwMCh0aGlzLCBfaXNEcmFnZ2luZ19leHRyYUluaXRpYWxpemVycyk7CiAgICBjb250YWluZXJFbGVtZW50OwogICAgcmVuZGVyKCkgewogICAgICByZXR1cm4gYjJgCiAgICAgIDxkaXYgY2xhc3M9InNwbGl0Q29udGFpbmVyICR7dGhpcy5pc0RyYWdnaW5nID8gImRyYWdnaW5nIiA6ICIifSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZWRpdG9yQ29udGFpbmVyIiBzdHlsZT0id2lkdGg6ICR7dGhpcy5jdXJyZW50U3BsaXRSYXRpb30lIj4KICAgICAgICAgIDxkZWVzLXdvcmtzcGFjZS1tb25hY28KICAgICAgICAgICAgLmxhbmd1YWdlPSR7Im1hcmtkb3duIn0KICAgICAgICAgICAgLmNvbnRlbnQ9JHtgIyBhIHRlc3QgY29udGVudAoKVGhpcyBpcyB0ZXN0IGNvbnRlbnQgdGhhdCBpcyBvZiBsb25nZXIgZm9ybSBhbiBob3BlZnVsbHkgc3RhcnRzIHRvIHdyYXAgd2hlbiBJIG5lZWQgaXQuIEFuZCB5ZXMsIGl0IGRvZXMgcGVyZmVjdGx5LiBuaWNlLgoKVGVzdCB8IEhlbGxvCi0tLSB8IC0tLQpZZWFoIHwgU28gZ29vZAoKVGhpcyBpcyByZWFsIGFzc2V0IEkgdGhpbmsuIFdoeSB3b3VsZCB3ZSB3YW50IHRvIGxlYXZlIHRoYXQgb24gdGhlIHRhYmxlPyBDYW4geW91IHRlbGwgbXkgdGhhdD8KCldoeSBhcmUgd2UgaGVyZT8KCkRvIHlvdSBrbm93PwoKPiBub3RlOgpUaGVyZSBpcyBzb21ldGhpbmcgZ29pbmcgb24uCgpcYFxgXGB0eXBlc2NyaXB0CmNvbnN0IGhlbGxvID0gJ3llcycKXGBcYFxgCmB9CiAgICAgICAgICAgIHdvcmRXcmFwPSJib3VuZGVkIgogICAgICAgICAgPjwvZGVlcy13b3Jrc3BhY2UtbW9uYWNvPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYKICAgICAgICAgIGNsYXNzPSJyZXNpemVIYW5kbGUgJHt0aGlzLmlzRHJhZ2dpbmcgPyAiZHJhZ2dpbmciIDogIiJ9IgogICAgICAgICAgQG1vdXNlZG93bj0ke3RoaXMuaGFuZGxlTW91c2VEb3dufQogICAgICAgID48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJvdXRsZXRDb250YWluZXIiIHN0eWxlPSJ3aWR0aDogJHsxMDAgLSB0aGlzLmN1cnJlbnRTcGxpdFJhdGlvfSUiPgogICAgICAgICAgPGRlZXMtd29ya3NwYWNlLW1hcmtkb3dub3V0bGV0PjwvZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQ+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIH0KICAgIGFzeW5jIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXNBcmcpIHsKICAgICAgYXdhaXQgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllc0FyZyk7CiAgICAgIHRoaXMuY3VycmVudFNwbGl0UmF0aW8gPSB0aGlzLnNwbGl0UmF0aW87CiAgICAgIHRoaXMuY29udGFpbmVyRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIuc3BsaXRDb250YWluZXIiKTsKICAgICAgdGhpcy5yZXNpemVIYW5kbGVFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIi5yZXNpemVIYW5kbGUiKTsKICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoImRlZXMtd29ya3NwYWNlLW1vbmFjbyIpOwogICAgICBjb25zdCBtYXJrZG93bk91dGxldCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCJkZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldCIpOwogICAgICBjb25zdCBzbWFydG1hcmtkb3duSW5zdGFuY2UgPSBuZXcgZGlzdF90c19leHBvcnRzMjkucGx1Z2lucy5zbWFydG1hcmtkb3duLlNtYXJ0TWFya2Rvd24oKTsKICAgICAgY29uc3QgbWRQYXJzZWRSZXN1bHQgPSBhd2FpdCBzbWFydG1hcmtkb3duSW5zdGFuY2UuZ2V0TWRQYXJzZWRSZXN1bHRGcm9tTWFya2Rvd24oImxvYWRpbmcuLi4iKTsKICAgICAgZWRpdG9yLmNvbnRlbnRTdWJqZWN0LnN1YnNjcmliZShhc3luYyAoY29udGVudEFyZykgPT4gewogICAgICAgIGF3YWl0IG1kUGFyc2VkUmVzdWx0LnVwZGF0ZUZyb21NYXJrZG93blN0cmluZyhjb250ZW50QXJnKTsKICAgICAgICBjb25zdCBodG1sMTYgPSBtZFBhcnNlZFJlc3VsdC5odG1sOwogICAgICAgIG1hcmtkb3duT3V0bGV0LnVwZGF0ZUh0bWxUZXh0KGh0bWwxNik7CiAgICAgIH0pOwogICAgfQogICAgaGFuZGxlTW91c2VEb3duID0gKGUxMSkgPT4gewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgdGhpcy5oYW5kbGVNb3VzZU1vdmUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5oYW5kbGVNb3VzZVVwKTsKICAgIH07CiAgICBoYW5kbGVNb3VzZU1vdmUgPSAoZTExKSA9PiB7CiAgICAgIGlmICghdGhpcy5pc0RyYWdnaW5nIHx8ICF0aGlzLmNvbnRhaW5lckVsZW1lbnQpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gdGhpcy5jb250YWluZXJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IGNvbnRhaW5lclJlY3Qud2lkdGg7CiAgICAgIGNvbnN0IG1vdXNlWCA9IGUxMS5jbGllbnRYIC0gY29udGFpbmVyUmVjdC5sZWZ0OwogICAgICBsZXQgbmV3UmF0aW8gPSBtb3VzZVggLyBjb250YWluZXJXaWR0aCAqIDEwMDsKICAgICAgbmV3UmF0aW8gPSBNYXRoLm1heCh0aGlzLm1pblBhbmVsU2l6ZSwgTWF0aC5taW4oMTAwIC0gdGhpcy5taW5QYW5lbFNpemUsIG5ld1JhdGlvKSk7CiAgICAgIHRoaXMuY3VycmVudFNwbGl0UmF0aW8gPSBuZXdSYXRpbzsKICAgIH07CiAgICBoYW5kbGVNb3VzZVVwID0gKCkgPT4gewogICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgdGhpcy5oYW5kbGVNb3VzZU1vdmUpOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5oYW5kbGVNb3VzZVVwKTsKICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoImRlZXMtd29ya3NwYWNlLW1vbmFjbyIpOwogICAgICBpZiAoZWRpdG9yKSB7CiAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSk7CiAgICAgIH0KICAgIH07CiAgICBhc3luYyBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgdGhpcy5oYW5kbGVNb3VzZU1vdmUpOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5oYW5kbGVNb3VzZVVwKTsKICAgIH0KICAgIC8qKgogICAgICogUHJvZ3JhbW1hdGljYWxseSBzZXQgdGhlIHNwbGl0IHJhdGlvCiAgICAgKi8KICAgIHNldFNwbGl0UmF0aW8ocmF0aW8pIHsKICAgICAgdGhpcy5jdXJyZW50U3BsaXRSYXRpbyA9IE1hdGgubWF4KHRoaXMubWluUGFuZWxTaXplLCBNYXRoLm1pbigxMDAgLSB0aGlzLm1pblBhbmVsU2l6ZSwgcmF0aW8pKTsKICAgIH0KICAgIC8qKgogICAgICogUmVzZXQgdG8gaW5pdGlhbCBzcGxpdCByYXRpbwogICAgICovCiAgICByZXNldFNwbGl0UmF0aW8oKSB7CiAgICAgIHRoaXMuY3VycmVudFNwbGl0UmF0aW8gPSB0aGlzLnNwbGl0UmF0aW87CiAgICB9CiAgICBzdGF0aWMgewogICAgICBfX3J1bkluaXRpYWxpemVyczEwMChfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICB9CiAgfTsKICByZXR1cm4gRGVlc1dvcmtzcGFjZU1hcmtkb3duMiA9IF9jbGFzc1RoaXM7Cn0pKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtd29ya3NwYWNlL2RlZXMtd29ya3NwYWNlLW1hcmtkb3dub3V0bGV0L2RlZXMtd29ya3NwYWNlLW1hcmtkb3dub3V0bGV0LmRlbW8uanMKaW5pdF9kaXN0X3RzMzAoKTsKdmFyIGRlbW9GdW5jNTcgPSAoKSA9PiBiMmAKICA8ZGVlcy1kZW1vd3JhcHBlcj4KICAgIDxzdHlsZT4KICAgICAgJHtpYAogICAgICAgIC5kZW1vLWNvbnRhaW5lciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgIGdhcDogMjRweDsKICAgICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgICBtYXgtd2lkdGg6IDkwMHB4OwogICAgICAgICAgbWFyZ2luOiAwIGF1dG87CiAgICAgICAgfQogICAgICBgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGNsYXNzPSJkZW1vLWNvbnRhaW5lciI+CiAgICAgIDwhLS0gRGVtbyAxOiBIZWFkaW5ncyAtLT4KICAgICAgPGRlZXMtcGFuZWwKICAgICAgICAudGl0bGU9JHsiSGVhZGluZ3MifQogICAgICAgIC5zdWJ0aXRsZT0keyJBbGwgaGVhZGluZyBsZXZlbHMgZnJvbSBIMSB0byBINiJ9CiAgICAgICAgLnJ1bkFmdGVyUmVuZGVyPSR7YXN5bmMgKHBhbmVsRWwpID0+IHsKICBjb25zdCBvdXRsZXQgPSBwYW5lbEVsLnF1ZXJ5U2VsZWN0b3IoImRlZXMtd29ya3NwYWNlLW1hcmtkb3dub3V0bGV0Iik7CiAgYXdhaXQgb3V0bGV0Py51cGRhdGVIdG1sVGV4dChgCiAgICAgICAgICAgIDxoMT5IZWFkaW5nIExldmVsIDE8L2gxPgogICAgICAgICAgICA8aDI+SGVhZGluZyBMZXZlbCAyPC9oMj4KICAgICAgICAgICAgPGgzPkhlYWRpbmcgTGV2ZWwgMzwvaDM+CiAgICAgICAgICAgIDxoND5IZWFkaW5nIExldmVsIDQ8L2g0PgogICAgICAgICAgICA8aDU+SGVhZGluZyBMZXZlbCA1PC9oNT4KICAgICAgICAgICAgPGg2PkhlYWRpbmcgTGV2ZWwgNjwvaDY+CiAgICAgICAgICBgKTsKfX0KICAgICAgPgogICAgICAgIDxkZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldD48L2RlZXMtd29ya3NwYWNlLW1hcmtkb3dub3V0bGV0PgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8IS0tIERlbW8gMjogVGV4dCBGb3JtYXR0aW5nIC0tPgogICAgICA8ZGVlcy1wYW5lbAogICAgICAgIC50aXRsZT0keyJUZXh0IEZvcm1hdHRpbmcifQogICAgICAgIC5zdWJ0aXRsZT0keyJCb2xkLCBpdGFsaWMsIGxpbmtzLCBjb2RlLCBhbmQga2V5Ym9hcmQgaW5wdXQifQogICAgICAgIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChwYW5lbEVsKSA9PiB7CiAgY29uc3Qgb3V0bGV0ID0gcGFuZWxFbC5xdWVyeVNlbGVjdG9yKCJkZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldCIpOwogIGF3YWl0IG91dGxldD8udXBkYXRlSHRtbFRleHQoYAogICAgICAgICAgICA8cD5UaGlzIGlzIGEgcGFyYWdyYXBoIHdpdGggPHN0cm9uZz5ib2xkIHRleHQ8L3N0cm9uZz4gYW5kIDxlbT5pdGFsaWMgdGV4dDwvZW0+LjwvcD4KICAgICAgICAgICAgPHA+WW91IGNhbiBhbHNvIHVzZSA8c3Ryb25nPjxlbT5ib2xkIGl0YWxpYzwvZW0+PC9zdHJvbmc+IGZvciBlbXBoYXNpcy48L3A+CiAgICAgICAgICAgIDxwPkhlcmUncyBhIDxhIGhyZWY9IiMiPmxpbmsgZXhhbXBsZTwvYT4gYW5kIHNvbWUgPGNvZGU+aW5saW5lIGNvZGU8L2NvZGU+LjwvcD4KICAgICAgICAgICAgPHA+UHJlc3MgPGtiZD5DdHJsPC9rYmQ+ICsgPGtiZD5DPC9rYmQ+IHRvIGNvcHkgdGV4dC48L3A+CiAgICAgICAgICAgIDxocj4KICAgICAgICAgICAgPHA+QWJvdmUgaXMgYSBob3Jpem9udGFsIHJ1bGUgc2VwYXJhdG9yLjwvcD4KICAgICAgICAgIGApOwp9fQogICAgICA+CiAgICAgICAgPGRlZXMtd29ya3NwYWNlLW1hcmtkb3dub3V0bGV0PjwvZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQ+CiAgICAgIDwvZGVlcy1wYW5lbD4KCiAgICAgIDwhLS0gRGVtbyAzOiBMaXN0cyAtLT4KICAgICAgPGRlZXMtcGFuZWwKICAgICAgICAudGl0bGU9JHsiTGlzdHMifQogICAgICAgIC5zdWJ0aXRsZT0keyJPcmRlcmVkLCB1bm9yZGVyZWQsIGFuZCB0YXNrIGxpc3RzIn0KICAgICAgICAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAocGFuZWxFbCkgPT4gewogIGNvbnN0IG91dGxldCA9IHBhbmVsRWwucXVlcnlTZWxlY3RvcigiZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQiKTsKICBhd2FpdCBvdXRsZXQ/LnVwZGF0ZUh0bWxUZXh0KGAKICAgICAgICAgICAgPGgzPlVub3JkZXJlZCBMaXN0PC9oMz4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5GaXJzdCBpdGVtPC9saT4KICAgICAgICAgICAgICA8bGk+U2Vjb25kIGl0ZW0KICAgICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgPGxpPk5lc3RlZCBpdGVtIDE8L2xpPgogICAgICAgICAgICAgICAgICA8bGk+TmVzdGVkIGl0ZW0gMjwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgPGxpPlRoaXJkIGl0ZW08L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPGgzPk9yZGVyZWQgTGlzdDwvaDM+CiAgICAgICAgICAgIDxvbD4KICAgICAgICAgICAgICA8bGk+U3RlcCBvbmU8L2xpPgogICAgICAgICAgICAgIDxsaT5TdGVwIHR3bzwvbGk+CiAgICAgICAgICAgICAgPGxpPlN0ZXAgdGhyZWU8L2xpPgogICAgICAgICAgICA8L29sPgoKICAgICAgICAgICAgPGgzPlRhc2sgTGlzdDwvaDM+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGkgY2xhc3M9InRhc2stbGlzdC1pdGVtIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGNoZWNrZWQgZGlzYWJsZWQ+IENvbXBsZXRlZCB0YXNrPC9saT4KICAgICAgICAgICAgICA8bGkgY2xhc3M9InRhc2stbGlzdC1pdGVtIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGRpc2FibGVkPiBQZW5kaW5nIHRhc2s8L2xpPgogICAgICAgICAgICAgIDxsaSBjbGFzcz0idGFzay1saXN0LWl0ZW0iPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGlzYWJsZWQ+IEFub3RoZXIgdGFzazwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICBgKTsKfX0KICAgICAgPgogICAgICAgIDxkZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldD48L2RlZXMtd29ya3NwYWNlLW1hcmtkb3dub3V0bGV0PgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8IS0tIERlbW8gNDogQ29kZSBCbG9ja3MgLS0+CiAgICAgIDxkZWVzLXBhbmVsCiAgICAgICAgLnRpdGxlPSR7IkNvZGUgQmxvY2tzIn0KICAgICAgICAuc3VidGl0bGU9JHsiU3ludGF4IGhpZ2hsaWdodGVkIGNvZGUgZXhhbXBsZXMifQogICAgICAgIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChwYW5lbEVsKSA9PiB7CiAgY29uc3Qgb3V0bGV0ID0gcGFuZWxFbC5xdWVyeVNlbGVjdG9yKCJkZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldCIpOwogIGF3YWl0IG91dGxldD8udXBkYXRlSHRtbFRleHQoYAogICAgICAgICAgICA8cD5JbmxpbmUgY29kZTogPGNvZGU+Y29uc3QgZ3JlZXRpbmcgPSAiSGVsbG8sIFdvcmxkISI7PC9jb2RlPjwvcD4KCiAgICAgICAgICAgIDxoMz5UeXBlU2NyaXB0IEV4YW1wbGU8L2gzPgogICAgICAgICAgICA8cHJlPjxjb2RlPjxzcGFuIGNsYXNzPSJobGpzLWtleXdvcmQiPmltcG9ydDwvc3Bhbj4geyBodG1sLCBjc3MgfSA8c3BhbiBjbGFzcz0iaGxqcy1rZXl3b3JkIj5mcm9tPC9zcGFuPiA8c3BhbiBjbGFzcz0iaGxqcy1zdHJpbmciPidAZGVzaWduLmVzdGF0ZS9kZWVzLWVsZW1lbnQnPC9zcGFuPjsKCjxzcGFuIGNsYXNzPSJobGpzLWtleXdvcmQiPmludGVyZmFjZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImhsanMtdGl0bGUiPklVc2VyPC9zcGFuPiB7CiAgPHNwYW4gY2xhc3M9ImhsanMtYXR0ciI+bmFtZTwvc3Bhbj46IDxzcGFuIGNsYXNzPSJobGpzLWJ1aWx0X2luIj5zdHJpbmc8L3NwYW4+OwogIDxzcGFuIGNsYXNzPSJobGpzLWF0dHIiPmVtYWlsPC9zcGFuPjogPHNwYW4gY2xhc3M9ImhsanMtYnVpbHRfaW4iPnN0cmluZzwvc3Bhbj47CiAgPHNwYW4gY2xhc3M9ImhsanMtYXR0ciI+YWdlPC9zcGFuPj86IDxzcGFuIGNsYXNzPSJobGpzLWJ1aWx0X2luIj5udW1iZXI8L3NwYW4+Owp9Cgo8c3BhbiBjbGFzcz0iaGxqcy1rZXl3b3JkIj5jb25zdDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImhsanMtdGl0bGUiPmdldFVzZXI8L3NwYW4+ID0gPHNwYW4gY2xhc3M9ImhsanMta2V5d29yZCI+YXN5bmM8L3NwYW4+ICg8c3BhbiBjbGFzcz0iaGxqcy1hdHRyIj5pZDwvc3Bhbj46IDxzcGFuIGNsYXNzPSJobGpzLWJ1aWx0X2luIj5zdHJpbmc8L3NwYW4+KTogPHNwYW4gY2xhc3M9ImhsanMtYnVpbHRfaW4iPlByb21pc2U8L3NwYW4+Jmx0O0lVc2VyJmd0OyA9Jmd0OyB7CiAgPHNwYW4gY2xhc3M9ImhsanMta2V5d29yZCI+Y29uc3Q8L3NwYW4+IHJlc3BvbnNlID0gPHNwYW4gY2xhc3M9ImhsanMta2V5d29yZCI+YXdhaXQ8L3NwYW4+IGZldGNoKFxgL2FwaS91c2Vycy9cJHtpZH1cYCk7CiAgPHNwYW4gY2xhc3M9ImhsanMta2V5d29yZCI+cmV0dXJuPC9zcGFuPiByZXNwb25zZS5qc29uKCk7Cn07PC9jb2RlPjwvcHJlPgoKICAgICAgICAgICAgPGgzPkpTT04gRXhhbXBsZTwvaDM+CiAgICAgICAgICAgIDxwcmU+PGNvZGU+ewogIDxzcGFuIGNsYXNzPSJobGpzLWF0dHIiPiJuYW1lIjwvc3Bhbj46IDxzcGFuIGNsYXNzPSJobGpzLXN0cmluZyI+ImRlZXMtY2F0YWxvZyI8L3NwYW4+LAogIDxzcGFuIGNsYXNzPSJobGpzLWF0dHIiPiJ2ZXJzaW9uIjwvc3Bhbj46IDxzcGFuIGNsYXNzPSJobGpzLXN0cmluZyI+IjMuMC4wIjwvc3Bhbj4sCiAgPHNwYW4gY2xhc3M9ImhsanMtYXR0ciI+ImRlcGVuZGVuY2llcyI8L3NwYW4+OiB7CiAgICA8c3BhbiBjbGFzcz0iaGxqcy1hdHRyIj4iQGRlc2lnbi5lc3RhdGUvZGVlcy1lbGVtZW50Ijwvc3Bhbj46IDxzcGFuIGNsYXNzPSJobGpzLXN0cmluZyI+Il4yLjAuMCI8L3NwYW4+CiAgfQp9PC9jb2RlPjwvcHJlPgogICAgICAgICAgYCk7Cn19CiAgICAgID4KICAgICAgICA8ZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQ+PC9kZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldD4KICAgICAgPC9kZWVzLXBhbmVsPgoKICAgICAgPCEtLSBEZW1vIDU6IFRhYmxlcyAtLT4KICAgICAgPGRlZXMtcGFuZWwKICAgICAgICAudGl0bGU9JHsiVGFibGVzIn0KICAgICAgICAuc3VidGl0bGU9JHsiU3R5bGVkIHRhYmxlcyB3aXRoIGFsdGVybmF0aW5nIHJvd3MifQogICAgICAgIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChwYW5lbEVsKSA9PiB7CiAgY29uc3Qgb3V0bGV0ID0gcGFuZWxFbC5xdWVyeVNlbGVjdG9yKCJkZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldCIpOwogIGF3YWl0IG91dGxldD8udXBkYXRlSHRtbFRleHQoYAogICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGg+RmVhdHVyZTwvdGg+CiAgICAgICAgICAgICAgICAgIDx0aD5TdGF0dXM8L3RoPgogICAgICAgICAgICAgICAgICA8dGg+UHJpb3JpdHk8L3RoPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkPkRhcmsgbW9kZSBzdXBwb3J0PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPkNvbXBsZXRlZDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD5IaWdoPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD5SZXNwb25zaXZlIGRlc2lnbjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD5JbiBQcm9ncmVzczwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD5NZWRpdW08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkPkFjY2Vzc2liaWxpdHk8L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+UGxhbm5lZDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD5IaWdoPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD5Eb2N1bWVudGF0aW9uPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPkluIFByb2dyZXNzPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPkxvdzwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICBgKTsKfX0KICAgICAgPgogICAgICAgIDxkZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldD48L2RlZXMtd29ya3NwYWNlLW1hcmtkb3dub3V0bGV0PgogICAgICA8L2RlZXMtcGFuZWw+CgogICAgICA8IS0tIERlbW8gNjogQmxvY2txdW90ZXMgJiBBbGVydHMgLS0+CiAgICAgIDxkZWVzLXBhbmVsCiAgICAgICAgLnRpdGxlPSR7IkJsb2NrcXVvdGVzICYgQWxlcnRzIn0KICAgICAgICAuc3VidGl0bGU9JHsiUXVvdGVzIGFuZCBHaXRIdWItc3R5bGUgYWxlcnRzIn0KICAgICAgICAucnVuQWZ0ZXJSZW5kZXI9JHthc3luYyAocGFuZWxFbCkgPT4gewogIGNvbnN0IG91dGxldCA9IHBhbmVsRWwucXVlcnlTZWxlY3RvcigiZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQiKTsKICBhd2FpdCBvdXRsZXQ/LnVwZGF0ZUh0bWxUZXh0KGAKICAgICAgICAgICAgPGJsb2NrcXVvdGU+CiAgICAgICAgICAgICAgPHA+VGhpcyBpcyBhIHN0YW5kYXJkIGJsb2NrcXVvdGUuIEl0J3MgZ3JlYXQgZm9yIGhpZ2hsaWdodGluZyBpbXBvcnRhbnQgaW5mb3JtYXRpb24gb3IgcXVvdGVzIGZyb20gb3RoZXIgc291cmNlcy48L3A+CiAgICAgICAgICAgIDwvYmxvY2txdW90ZT4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hcmtkb3duLWFsZXJ0IG1hcmtkb3duLWFsZXJ0LW5vdGUiPgogICAgICAgICAgICAgIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhpcyBpcyBhbiBpbmZvcm1hdGlvbmFsIG5vdGUgdG8gZHJhdyBhdHRlbnRpb24gdG8gaW1wb3J0YW50IGRldGFpbHMuPC9wPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hcmtkb3duLWFsZXJ0IG1hcmtkb3duLWFsZXJ0LXRpcCI+CiAgICAgICAgICAgICAgPHA+PHN0cm9uZz5UaXA6PC9zdHJvbmc+IEhlcmUncyBhIGhlbHBmdWwgdGlwIHRvIGltcHJvdmUgeW91ciB3b3JrZmxvdy48L3A+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWFya2Rvd24tYWxlcnQgbWFya2Rvd24tYWxlcnQtaW1wb3J0YW50Ij4KICAgICAgICAgICAgICA8cD48c3Ryb25nPkltcG9ydGFudDo8L3N0cm9uZz4gVGhpcyBpbmZvcm1hdGlvbiBpcyBjcnVjaWFsIGZvciB1bmRlcnN0YW5kaW5nIHRoZSB0b3BpYy48L3A+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWFya2Rvd24tYWxlcnQgbWFya2Rvd24tYWxlcnQtd2FybmluZyI+CiAgICAgICAgICAgICAgPHA+PHN0cm9uZz5XYXJuaW5nOjwvc3Ryb25nPiBCZSBjYXJlZnVsIHdoZW4gcGVyZm9ybWluZyB0aGlzIGFjdGlvbi48L3A+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWFya2Rvd24tYWxlcnQgbWFya2Rvd24tYWxlcnQtY2F1dGlvbiI+CiAgICAgICAgICAgICAgPHA+PHN0cm9uZz5DYXV0aW9uOjwvc3Ryb25nPiBUaGlzIGFjdGlvbiBtYXkgaGF2ZSB1bmludGVuZGVkIGNvbnNlcXVlbmNlcy48L3A+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgYCk7Cn19CiAgICAgID4KICAgICAgICA8ZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQ+PC9kZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldD4KICAgICAgPC9kZWVzLXBhbmVsPgoKICAgICAgPCEtLSBEZW1vIDc6IEZ1bGwgRG9jdW1lbnQgLS0+CiAgICAgIDxkZWVzLXBhbmVsCiAgICAgICAgLnRpdGxlPSR7IkZ1bGwgRG9jdW1lbnQifQogICAgICAgIC5zdWJ0aXRsZT0keyJBIGNvbXBsZXRlIG1hcmtkb3duIGRvY3VtZW50IGV4YW1wbGUifQogICAgICAgIC5ydW5BZnRlclJlbmRlcj0ke2FzeW5jIChwYW5lbEVsKSA9PiB7CiAgY29uc3Qgb3V0bGV0ID0gcGFuZWxFbC5xdWVyeVNlbGVjdG9yKCJkZWVzLXdvcmtzcGFjZS1tYXJrZG93bm91dGxldCIpOwogIGF3YWl0IG91dGxldD8udXBkYXRlSHRtbFRleHQoYAogICAgICAgICAgICA8aDE+R2V0dGluZyBTdGFydGVkIEd1aWRlPC9oMT4KICAgICAgICAgICAgPHA+V2VsY29tZSB0byB0aGUgPHN0cm9uZz5kZWVzLWNhdGFsb2c8L3N0cm9uZz4gY29tcG9uZW50IGxpYnJhcnkuIFRoaXMgZ3VpZGUgd2lsbCBoZWxwIHlvdSBnZXQgdXAgYW5kIHJ1bm5pbmcgcXVpY2tseS48L3A+CgogICAgICAgICAgICA8aDI+SW5zdGFsbGF0aW9uPC9oMj4KICAgICAgICAgICAgPHA+SW5zdGFsbCB0aGUgcGFja2FnZSB1c2luZyB5b3VyIHByZWZlcnJlZCBwYWNrYWdlIG1hbmFnZXI6PC9wPgogICAgICAgICAgICA8cHJlPjxjb2RlPjxzcGFuIGNsYXNzPSJobGpzLWNvbW1lbnQiPiMgVXNpbmcgcG5wbSAocmVjb21tZW5kZWQpPC9zcGFuPgpwbnBtIGFkZCBAZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cKCjxzcGFuIGNsYXNzPSJobGpzLWNvbW1lbnQiPiMgVXNpbmcgbnBtPC9zcGFuPgpucG0gaW5zdGFsbCBAZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2c8L2NvZGU+PC9wcmU+CgogICAgICAgICAgICA8aDI+QmFzaWMgVXNhZ2U8L2gyPgogICAgICAgICAgICA8cD5JbXBvcnQgYW5kIHVzZSBjb21wb25lbnRzIGluIHlvdXIgVHlwZVNjcmlwdCBmaWxlczo8L3A+CiAgICAgICAgICAgIDxwcmU+PGNvZGU+PHNwYW4gY2xhc3M9ImhsanMta2V5d29yZCI+aW1wb3J0PC9zcGFuPiB7IERlZXNCdXR0b24gfSA8c3BhbiBjbGFzcz0iaGxqcy1rZXl3b3JkIj5mcm9tPC9zcGFuPiA8c3BhbiBjbGFzcz0iaGxqcy1zdHJpbmciPidAZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cnPC9zcGFuPjsKCjxzcGFuIGNsYXNzPSJobGpzLWNvbW1lbnQiPi8vIFVzZSBpbiB5b3VyIHRlbXBsYXRlczwvc3Bhbj4KaHRtbFxgJmx0O2RlZXMtYnV0dG9uJmd0O0NsaWNrIG1lJmx0Oy9kZWVzLWJ1dHRvbiZndDtcYDwvY29kZT48L3ByZT4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hcmtkb3duLWFsZXJ0IG1hcmtkb3duLWFsZXJ0LXRpcCI+CiAgICAgICAgICAgICAgPHA+PHN0cm9uZz5UaXA6PC9zdHJvbmc+IENoZWNrIHRoZSBkZW1vIHNob3djYXNlIGZvciBsaXZlIGV4YW1wbGVzIG9mIGFsbCBjb21wb25lbnRzLjwvcD4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8aDI+QXZhaWxhYmxlIENvbXBvbmVudHM8L2gyPgogICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGg+Q29tcG9uZW50PC90aD4KICAgICAgICAgICAgICAgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD48Y29kZT5kZWVzLWJ1dHRvbjwvY29kZT48L3RkPgogICAgICAgICAgICAgICAgICA8dGQ+UHJpbWFyeSBidXR0b24gY29tcG9uZW50PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD48Y29kZT5kZWVzLWlucHV0LXRleHQ8L2NvZGU+PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPlRleHQgaW5wdXQgZmllbGQ8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkPjxjb2RlPmRlZXMtdGFibGU8L2NvZGU+PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPkRhdGEgdGFibGUgd2l0aCBzb3J0aW5nPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD48Y29kZT5kZWVzLW1vZGFsPC9jb2RlPjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD5Nb2RhbCBkaWFsb2c8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICA8L3RhYmxlPgoKICAgICAgICAgICAgPGgyPk5leHQgU3RlcHM8L2gyPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPkV4cGxvcmUgdGhlIDxhIGhyZWY9IiMiPmNvbXBvbmVudCBkb2N1bWVudGF0aW9uPC9hPjwvbGk+CiAgICAgICAgICAgICAgPGxpPkNoZWNrIG91dCB0aGUgPGEgaHJlZj0iIyI+dGhlbWluZyBndWlkZTwvYT48L2xpPgogICAgICAgICAgICAgIDxsaT5Kb2luIG91ciA8YSBocmVmPSIjIj5jb21tdW5pdHkgRGlzY29yZDwvYT48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPGJsb2NrcXVvdGU+CiAgICAgICAgICAgICAgPHA+IlRoZSBiZXN0IGNvbXBvbmVudCBsaWJyYXJ5IGlzIG9uZSB0aGF0IGdldHMgb3V0IG9mIHlvdXIgd2F5LiIgXHUyMDE0IERlc2lnbiBTeXN0ZW1zIFRlYW08L3A+CiAgICAgICAgICAgIDwvYmxvY2txdW90ZT4KICAgICAgICAgIGApOwp9fQogICAgICA+CiAgICAgICAgPGRlZXMtd29ya3NwYWNlLW1hcmtkb3dub3V0bGV0PjwvZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQ+CiAgICAgIDwvZGVlcy1wYW5lbD4KICAgIDwvZGl2PgogIDwvZGVlcy1kZW1vd3JhcHBlcj4KYDsKCi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9AZGVzaWduLmVzdGF0ZStkZWVzLWNhdGFsb2dAMy40OC41X0B0aXB0YXArcG1AMi4yNy4yL25vZGVfbW9kdWxlcy9AZGVzaWduLmVzdGF0ZS9kZWVzLWNhdGFsb2cvZGlzdF90c193ZWIvZWxlbWVudHMvMDBncm91cC13b3Jrc3BhY2UvZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQvZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQuanMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF90aGVtZSgpOwp2YXIgX19lc0RlY29yYXRlMTAwID0gZnVuY3Rpb24oY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHsKICBmdW5jdGlvbiBhY2NlcHQoZjgpIHsKICAgIGlmIChmOCAhPT0gdm9pZCAwICYmIHR5cGVvZiBmOCAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24gZXhwZWN0ZWQiKTsKICAgIHJldHVybiBmODsKICB9CiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5MiA9IGtpbmQgPT09ICJnZXR0ZXIiID8gImdldCIgOiBraW5kID09PSAic2V0dGVyIiA/ICJzZXQiIDogInZhbHVlIjsKICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluWyJzdGF0aWMiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7CiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7CiAgdmFyIF81LCBkb25lID0gZmFsc2U7CiAgZm9yICh2YXIgaTExID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpMTEgPj0gMDsgaTExLS0pIHsKICAgIHZhciBjb250ZXh0MiA9IHt9OwogICAgZm9yICh2YXIgcDggaW4gY29udGV4dEluKSBjb250ZXh0MltwOF0gPSBwOCA9PT0gImFjY2VzcyIgPyB7fSA6IGNvbnRleHRJbltwOF07CiAgICBmb3IgKHZhciBwOCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0Mi5hY2Nlc3NbcDhdID0gY29udGV4dEluLmFjY2Vzc1twOF07CiAgICBjb250ZXh0Mi5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uKGY4KSB7CiAgICAgIGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWQiKTsKICAgICAgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZjggfHwgbnVsbCkpOwogICAgfTsKICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpMTFdKShraW5kID09PSAiYWNjZXNzb3IiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleTJdLCBjb250ZXh0Mik7CiAgICBpZiAoa2luZCA9PT0gImFjY2Vzc29yIikgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlOwogICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgZXhwZWN0ZWQiKTsKICAgICAgaWYgKF81ID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF81OwogICAgICBpZiAoXzUgPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXzU7CiAgICAgIGlmIChfNSA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF81KTsKICAgIH0gZWxzZSBpZiAoXzUgPSBhY2NlcHQocmVzdWx0KSkgewogICAgICBpZiAoa2luZCA9PT0gImZpZWxkIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXzUpOwogICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5Ml0gPSBfNTsKICAgIH0KICB9CiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpOwogIGRvbmUgPSB0cnVlOwp9Owp2YXIgX19ydW5Jbml0aWFsaXplcnMxMDEgPSBmdW5jdGlvbih0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlMikgewogIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyOwogIGZvciAodmFyIGkxMSA9IDA7IGkxMSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkxMSsrKSB7CiAgICB2YWx1ZTIgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZywgdmFsdWUyKSA6IGluaXRpYWxpemVyc1tpMTFdLmNhbGwodGhpc0FyZyk7CiAgfQogIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlMiA6IHZvaWQgMDsKfTsKdmFyIERlZXNXb3Jrc3BhY2VNYXJrZG93bm91dGxldCA9ICgoKSA9PiB7CiAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudCgiZGVlcy13b3Jrc3BhY2UtbWFya2Rvd25vdXRsZXQiKV07CiAgbGV0IF9jbGFzc0Rlc2NyaXB0b3I7CiAgbGV0IF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzID0gW107CiAgbGV0IF9jbGFzc1RoaXM7CiAgbGV0IF9jbGFzc1N1cGVyID0gRGVlc0VsZW1lbnQ7CiAgdmFyIERlZXNXb3Jrc3BhY2VNYXJrZG93bm91dGxldDIgPSBjbGFzcyBleHRlbmRzIF9jbGFzc1N1cGVyIHsKICAgIHN0YXRpYyB7CiAgICAgIF9jbGFzc1RoaXMgPSB0aGlzOwogICAgfQogICAgc3RhdGljIHsKICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7CiAgICAgIF9fZXNEZWNvcmF0ZTEwMChudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6ICJjbGFzcyIsIG5hbWU6IF9jbGFzc1RoaXMubmFtZSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7CiAgICAgIERlZXNXb3Jrc3BhY2VNYXJrZG93bm91dGxldDIgPSBfY2xhc3NUaGlzID0gX2NsYXNzRGVzY3JpcHRvci52YWx1ZTsKICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzc1RoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pOwogICAgfQogICAgLy8gREVNTwogICAgc3RhdGljIGRlbW8gPSBkZW1vRnVuYzU3OwogICAgc3RhdGljIGRlbW9Hcm91cHMgPSBbIldvcmtzcGFjZSJdOwogICAgc3RhdGljIHN0eWxlcyA9IFsKICAgICAgdGhlbWVEZWZhdWx0U3R5bGVzLAogICAgICBjc3NNYW5hZ2VyLmRlZmF1bHRTdHlsZXMsCiAgICAgIGlgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCAnTm90byBTYW5zJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNjsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMyNDI5MmYiLCAiI2U2ZWRmMyIpfTsKICAgICAgfQoKICAgICAgLm91dGxldCB7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICB9CgogICAgICAvKiBIZWFkaW5ncyAqLwogICAgICBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsKICAgICAgICBtYXJnaW4tdG9wOiAyNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBsaW5lLWhlaWdodDogMS4yNTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxZjIzMjgiLCAiI2YwZjZmYyIpfTsKICAgICAgfQoKICAgICAgaDEgewogICAgICAgIGZvbnQtc2l6ZTogMmVtOwogICAgICAgIHBhZGRpbmctYm90dG9tOiAwLjNlbTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkMWQ5ZTAiLCAiIzMwMzYzZCIpfTsKICAgICAgfQoKICAgICAgaDIgewogICAgICAgIGZvbnQtc2l6ZTogMS41ZW07CiAgICAgICAgcGFkZGluZy1ib3R0b206IDAuM2VtOwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2QxZDllMCIsICIjMzAzNjNkIil9OwogICAgICB9CgogICAgICBoMyB7CiAgICAgICAgZm9udC1zaXplOiAxLjI1ZW07CiAgICAgIH0KCiAgICAgIGg0IHsKICAgICAgICBmb250LXNpemU6IDFlbTsKICAgICAgfQoKICAgICAgaDUgewogICAgICAgIGZvbnQtc2l6ZTogMC44NzVlbTsKICAgICAgfQoKICAgICAgaDYgewogICAgICAgIGZvbnQtc2l6ZTogMC44NWVtOwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzY1NmQ3NiIsICIjOGI5NDllIil9OwogICAgICB9CgogICAgICAvKiBQYXJhZ3JhcGhzIGFuZCB0ZXh0ICovCiAgICAgIHAgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgfQoKICAgICAgLyogTGlua3MgKi8KICAgICAgYSB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDk2OWRhIiwgIiM1OGE2ZmYiKX07CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICBhOmhvdmVyIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQoKICAgICAgLyogU3Ryb25nIGFuZCBlbXBoYXNpcyAqLwogICAgICBzdHJvbmcgewogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMWYyMzI4IiwgIiNmMGY2ZmMiKX07CiAgICAgIH0KCiAgICAgIGVtIHsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KCiAgICAgIC8qIExpc3RzICovCiAgICAgIHVsLCBvbCB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICAgIHBhZGRpbmctbGVmdDogMmVtOwogICAgICB9CgogICAgICBsaSB7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICB9CgogICAgICBsaSArIGxpIHsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgIH0KCiAgICAgIHVsIHVsLCB1bCBvbCwgb2wgdWwsIG9sIG9sIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICAgIH0KCiAgICAgIC8qIEJsb2NrcXVvdGVzICovCiAgICAgIGJsb2NrcXVvdGUgewogICAgICAgIG1hcmdpbjogMCAwIDE2cHggMDsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiM2NTZkNzYiLCAiIzhiOTQ5ZSIpfTsKICAgICAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDFkOWUwIiwgIiMzMDM2M2QiKX07CiAgICAgIH0KCiAgICAgIGJsb2NrcXVvdGUgPiA6Zmlyc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgIH0KCiAgICAgIGJsb2NrcXVvdGUgPiA6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLyogSW5saW5lIGNvZGUgKi8KICAgICAgY29kZSB7CiAgICAgICAgcGFkZGluZzogMC4yZW0gMC40ZW07CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtc2l6ZTogODUlOwogICAgICAgIGZvbnQtZmFtaWx5OiB1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCAnU0YgTW9ubycsIE1lbmxvLCBDb25zb2xhcywgJ0xpYmVyYXRpb24gTW9ubycsIG1vbm9zcGFjZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgxNzUsIDE4NCwgMTkzLCAwLjIpIiwgInJnYmEoMTEwLCAxMTgsIDEyOSwgMC40KSIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IGJyZWFrLXNwYWNlczsKICAgICAgfQoKICAgICAgLyogQ29kZSBibG9ja3MgKi8KICAgICAgcHJlIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBmb250LXNpemU6IDg1JTsKICAgICAgICBsaW5lLWhlaWdodDogMS40NTsKICAgICAgICBmb250LWZhbWlseTogdWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgJ1NGIE1vbm8nLCBNZW5sbywgQ29uc29sYXMsICdMaWJlcmF0aW9uIE1vbm8nLCBtb25vc3BhY2U7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNmNmY4ZmEiLCAiIzE2MWIyMiIpfTsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgd29yZC13cmFwOiBub3JtYWw7CiAgICAgIH0KCiAgICAgIHByZSBjb2RlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB3b3JkLXdyYXA6IG5vcm1hbDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgZm9udC1zaXplOiAxMDAlOwogICAgICAgIHdoaXRlLXNwYWNlOiBwcmU7CiAgICAgIH0KCiAgICAgIC8qIFRhYmxlcyAqLwogICAgICB0YWJsZSB7CiAgICAgICAgd2lkdGg6IG1heC1jb250ZW50OwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgICAgYm9yZGVyLXNwYWNpbmc6IDA7CiAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgdGFibGUgdGggewogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgcGFkZGluZzogNnB4IDEzcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkMWQ5ZTAiLCAiIzMwMzYzZCIpfTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y2ZjhmYSIsICIjMTYxYjIyIil9OwogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzFmMjMyOCIsICIjZTZlZGYzIil9OwogICAgICB9CgogICAgICB0YWJsZSB0ZCB7CiAgICAgICAgcGFkZGluZzogNnB4IDEzcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkMWQ5ZTAiLCAiIzMwMzYzZCIpfTsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMxZjIzMjgiLCAiI2U2ZWRmMyIpfTsKICAgICAgfQoKICAgICAgdGFibGUgdHIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZmZmZmZmIiwgIiMwZDExMTciKX07CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDFkOWUwIiwgIiMyMTI2MmQiKX07CiAgICAgIH0KCiAgICAgIHRhYmxlIHRyOm50aC1jaGlsZCgybikgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZjZmOGZhIiwgIiMxNjFiMjIiKX07CiAgICAgIH0KCiAgICAgIC8qIEhvcml6b250YWwgcnVsZXMgKi8KICAgICAgaHIgewogICAgICAgIGhlaWdodDogNHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgbWFyZ2luOiAyNHB4IDA7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkMWQ5ZTAiLCAiIzMwMzYzZCIpfTsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICB9CgogICAgICAvKiBJbWFnZXMgKi8KICAgICAgaW1nIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgIH0KCiAgICAgIC8qIFRhc2sgbGlzdHMgKi8KICAgICAgLnRhc2stbGlzdC1pdGVtIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgIH0KCiAgICAgIC50YXNrLWxpc3QtaXRlbSBpbnB1dCB7CiAgICAgICAgbWFyZ2luOiAwIDAuMmVtIDAuMjVlbSAtMS40ZW07CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQoKICAgICAgLyogRGVmaW5pdGlvbiBsaXN0cyAqLwogICAgICBkbCB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgZGwgZHQgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgbWFyZ2luLXRvcDogMTZweDsKICAgICAgICBmb250LXNpemU6IDFlbTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgfQoKICAgICAgZGwgZGQgewogICAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgICB9CgogICAgICAvKiBLZXlib2FyZCBpbnB1dCAqLwogICAgICBrYmQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwYWRkaW5nOiAzcHggNXB4OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBmb250LWZhbWlseTogdWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgJ1NGIE1vbm8nLCBNZW5sbywgQ29uc29sYXMsICdMaWJlcmF0aW9uIE1vbm8nLCBtb25vc3BhY2U7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEwcHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMWYyMzI4IiwgIiNlNmVkZjMiKX07CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y2ZjhmYSIsICIjMTYxYjIyIil9OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDFkOWUwIiwgIiMzMDM2M2QiKX07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgLTFweCAwICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDFkOWUwIiwgIiMzMDM2M2QiKX07CiAgICAgIH0KCiAgICAgIC8qIEZvb3Rub3RlcyAqLwogICAgICAuZm9vdG5vdGVzIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNjU2ZDc2IiwgIiM4Yjk0OWUiKX07CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjZDFkOWUwIiwgIiMzMDM2M2QiKX07CiAgICAgICAgcGFkZGluZy10b3A6IDE2cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMzJweDsKICAgICAgfQoKICAgICAgLyogQWxlcnRzL0FkbW9uaXRpb25zICovCiAgICAgIC5tYXJrZG93bi1hbGVydCB7CiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgfQoKICAgICAgLm1hcmtkb3duLWFsZXJ0LW5vdGUgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwOTY5ZGEiLCAiIzU4YTZmZiIpfTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSg5LCAxMDUsIDIxOCwgMC4xKSIsICJyZ2JhKDU2LCAxMzksIDI1MywgMC4xKSIpfTsKICAgICAgfQoKICAgICAgLm1hcmtkb3duLWFsZXJ0LXdhcm5pbmcgewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNiZjg3MDAiLCAiI2QyOTkyMiIpfTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgxOTEsIDEzNSwgMCwgMC4xKSIsICJyZ2JhKDE4NywgMTI4LCA5LCAwLjEpIil9OwogICAgICB9CgogICAgICAubWFya2Rvd24tYWxlcnQtaW1wb3J0YW50IHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjODI1MGRmIiwgIiNhMzcxZjciKX07CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMTMwLCA4MCwgMjIzLCAwLjEpIiwgInJnYmEoMTYzLCAxMTMsIDI0NywgMC4xKSIpfTsKICAgICAgfQoKICAgICAgLm1hcmtkb3duLWFsZXJ0LWNhdXRpb24gewogICAgICAgIGJvcmRlci1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNjZjIyMmUiLCAiI2Y4NTE0OSIpfTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgicmdiYSgyMDcsIDM0LCA0NiwgMC4xKSIsICJyZ2JhKDI0OCwgODEsIDczLCAwLjEpIil9OwogICAgICB9CgogICAgICAubWFya2Rvd24tYWxlcnQtdGlwIHsKICAgICAgICBib3JkZXItY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMWE3ZjM3IiwgIiMzZmI5NTAiKX07CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoInJnYmEoMjYsIDEyNywgNTUsIDAuMSkiLCAicmdiYSg0NiwgMTYwLCA2NywgMC4xKSIpfTsKICAgICAgfQoKICAgICAgLyogU3ludGF4IGhpZ2hsaWdodGluZyBmb3IgY29kZSBibG9ja3MgKi8KICAgICAgLmhsanMtY29tbWVudCwKICAgICAgLmhsanMtcXVvdGUgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiIzZhNzM3ZCIsICIjOGI5NDllIil9OwogICAgICB9CgogICAgICAuaGxqcy1rZXl3b3JkLAogICAgICAuaGxqcy1zZWxlY3Rvci10YWcsCiAgICAgIC5obGpzLWFkZGl0aW9uIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiNkNzNhNDkiLCAiI2ZmN2I3MiIpfTsKICAgICAgfQoKICAgICAgLmhsanMtbnVtYmVyLAogICAgICAuaGxqcy1zdHJpbmcsCiAgICAgIC5obGpzLW1ldGEgLmhsanMtbWV0YS1zdHJpbmcsCiAgICAgIC5obGpzLWxpdGVyYWwsCiAgICAgIC5obGpzLWRvY3RhZywKICAgICAgLmhsanMtcmVnZXhwIHsKICAgICAgICBjb2xvcjogJHtjc3NNYW5hZ2VyLmJkVGhlbWUoIiMwMzJmNjIiLCAiI2E1ZDZmZiIpfTsKICAgICAgfQoKICAgICAgLmhsanMtdGl0bGUsCiAgICAgIC5obGpzLXNlY3Rpb24sCiAgICAgIC5obGpzLW5hbWUsCiAgICAgIC5obGpzLXNlbGVjdG9yLWlkLAogICAgICAuaGxqcy1zZWxlY3Rvci1jbGFzcyB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjNmY0MmMxIiwgIiNkMmE4ZmYiKX07CiAgICAgIH0KCiAgICAgIC5obGpzLWF0dHJpYnV0ZSwKICAgICAgLmhsanMtYXR0ciwKICAgICAgLmhsanMtdmFyaWFibGUsCiAgICAgIC5obGpzLXRlbXBsYXRlLXZhcmlhYmxlLAogICAgICAuaGxqcy1jbGFzcyAuaGxqcy10aXRsZSwKICAgICAgLmhsanMtdHlwZSB7CiAgICAgICAgY29sb3I6ICR7Y3NzTWFuYWdlci5iZFRoZW1lKCIjMDA1Y2M1IiwgIiM3OWMwZmYiKX07CiAgICAgIH0KCiAgICAgIC5obGpzLXN5bWJvbCwKICAgICAgLmhsanMtYnVsbGV0LAogICAgICAuaGxqcy1zdWJzdCwKICAgICAgLmhsanMtbWV0YSwKICAgICAgLmhsanMtbWV0YSAuaGxqcy1rZXl3b3JkLAogICAgICAuaGxqcy1zZWxlY3Rvci1hdHRyLAogICAgICAuaGxqcy1zZWxlY3Rvci1wc2V1ZG8sCiAgICAgIC5obGpzLWxpbmsgewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2UzNjIwOSIsICIjZmZhNjU3Iil9OwogICAgICB9CgogICAgICAuaGxqcy1idWlsdF9pbiwKICAgICAgLmhsanMtZGVsZXRpb24gewogICAgICAgIGNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2IzMWQyOCIsICIjZmZhMTk4Iil9OwogICAgICB9CgogICAgICAuaGxqcy1mb3JtdWxhIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke2Nzc01hbmFnZXIuYmRUaGVtZSgiI2Y2ZjhmYSIsICIjMTYxYjIyIil9OwogICAgICB9CgogICAgICAuaGxqcy1lbXBoYXNpcyB7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICB9CgogICAgICAuaGxqcy1zdHJvbmcgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICBgCiAgICBdOwogICAgLy8gSU5TVEFOQ0UKICAgIG91dGxldDsKICAgIHJlbmRlcigpIHsKICAgICAgcmV0dXJuIGIyYAogICAgICA8ZGl2IGNsYXNzPSJvdXRsZXQiPgogICAgICAgIDxoMT5NYXJrZG93biBQcmV2aWV3PC9oMT4KICAgICAgICA8cD5Db250ZW50IHdpbGwgYXBwZWFyIGhlcmUgd2hlbiBtYXJrZG93biBpcyBwYXJzZWQuPC9wPgogICAgICA8L2Rpdj4KICAgIGA7CiAgICB9CiAgICBhc3luYyBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICAgIGF3YWl0IHN1cGVyLmZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpOwogICAgICB0aGlzLm91dGxldCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIub3V0bGV0Iik7CiAgICB9CiAgICBhc3luYyB1cGRhdGVIdG1sVGV4dChodG1sVGV4dEFyZykgewogICAgICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlOwogICAgICBpZiAoIXRoaXMub3V0bGV0KSB7CiAgICAgICAgdGhpcy5vdXRsZXQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiLm91dGxldCIpOwogICAgICB9CiAgICAgIHRoaXMub3V0bGV0LmlubmVySFRNTCA9IGh0bWxUZXh0QXJnOwogICAgfQogICAgc3RhdGljIHsKICAgICAgX19ydW5Jbml0aWFsaXplcnMxMDEoX2NsYXNzVGhpcywgX2NsYXNzRXh0cmFJbml0aWFsaXplcnMpOwogICAgfQogIH07CiAgcmV0dXJuIERlZXNXb3Jrc3BhY2VNYXJrZG93bm91dGxldDIgPSBfY2xhc3NUaGlzOwp9KSgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BkZXNpZ24uZXN0YXRlK2RlZXMtY2F0YWxvZ0AzLjQ4LjVfQHRpcHRhcCtwbUAyLjI3LjIvbm9kZV9tb2R1bGVzL0BkZXNpZ24uZXN0YXRlL2RlZXMtY2F0YWxvZy9kaXN0X3RzX3dlYi9lbGVtZW50cy9kZWVzLXRvb2x0aXAvZGVlcy10b29sdGlwLmpzCmluaXRfZGlzdF90czMwKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViL2VsZW1lbnRzL2luZGV4LmpzCmluaXRfdGhlbWUoKTsKaW5pdF9ncm91cF9ydW50aW1lKCk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGRlc2lnbi5lc3RhdGUrZGVlcy1jYXRhbG9nQDMuNDguNV9AdGlwdGFwK3BtQDIuMjcuMi9ub2RlX21vZHVsZXMvQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nL2Rpc3RfdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS5qcwp2YXIgY29tbWl0aW5mbyA9IHsKICBuYW1lOiAiQGRlc2lnbi5lc3RhdGUvZGVlcy1jYXRhbG9nIiwKICB2ZXJzaW9uOiAiMy40OC41IiwKICBkZXNjcmlwdGlvbjogIkEgY29tcHJlaGVuc2l2ZSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgZHluYW1pYyB3ZWIgY29tcG9uZW50cyBmb3IgYnVpbGRpbmcgc29waGlzdGljYXRlZCBhbmQgbW9kZXJuIHdlYiBhcHBsaWNhdGlvbnMgdXNpbmcgSmF2YVNjcmlwdCBhbmQgVHlwZVNjcmlwdC4iCn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGFwaS5nbG9iYWwrdHlwZWRzb2NrZXRANC4xLjJfQHB1c2gucm9ja3Mrc21hcnRzZXJ2ZUAyLjAuMS9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRzb2NrZXQvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMzQgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMzQsIHsKICBUeXBlZFNvY2tldDogKCkgPT4gVHlwZWRTb2NrZXQKfSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MraXNvaGFzaEAyLjAuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvaXNvaGFzaC9kaXN0X3RzL2luZGV4LmpzCnZhciBkaXN0X3RzX2V4cG9ydHMzMyA9IHt9OwpfX2V4cG9ydChkaXN0X3RzX2V4cG9ydHMzMywgewogIHNoYTI1NkZyb21TdHJpbmc6ICgpID0+IHNoYTI1NkZyb21TdHJpbmcyCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNocm9ja3Mrc21hcnRlbnZANS4wLjUvbm9kZV9tb2R1bGVzL0BwdXNocm9ja3Mvc21hcnRlbnYvZGlzdF90cy9pbmRleC5qcwp2YXIgZGlzdF90c19leHBvcnRzMzIgPSB7fTsKX19leHBvcnQoZGlzdF90c19leHBvcnRzMzIsIHsKICBTbWFydGVudjogKCkgPT4gU21hcnRlbnYzCn0pOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BwdXNocm9ja3Mrc21hcnRlbnZANS4wLjUvbm9kZV9tb2R1bGVzL0BwdXNocm9ja3Mvc21hcnRlbnYvZGlzdF90cy9zbWFydGVudi5wbHVnaW5zLmpzCnZhciBzbWFydHByb21pc2UgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdF90czMoKSwgMSk7CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2hyb2NrcytzbWFydGVudkA1LjAuNS9ub2RlX21vZHVsZXMvQHB1c2hyb2Nrcy9zbWFydGVudi9kaXN0X3RzL3NtYXJ0ZW52LmNsYXNzZXMuc21hcnRlbnYuanMKdmFyIFNtYXJ0ZW52MyA9IGNsYXNzIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMubG9hZGVkU2NyaXB0cyA9IFtdOwogIH0KICBhc3luYyBnZXRFbnZBd2FyZU1vZHVsZShvcHRpb25zQXJnKSB7CiAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgY29uc3QgbW9kdWxlUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRTYWZlTm9kZU1vZHVsZShvcHRpb25zQXJnLm5vZGVNb2R1bGVOYW1lKTsKICAgICAgcmV0dXJuIG1vZHVsZVJlc3VsdDsKICAgIH0gZWxzZSBpZiAodGhpcy5pc0Jyb3dzZXIpIHsKICAgICAgY29uc3QgbW9kdWxlUmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRTYWZlV2ViTW9kdWxlKG9wdGlvbnNBcmcud2ViVXJsQXJnLCBvcHRpb25zQXJnLmdldEZ1bmN0aW9uKTsKICAgICAgcmV0dXJuIG1vZHVsZVJlc3VsdDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoInBsYXRmb3JtIGZvciBsb2FkaW5nIG5vdCBzdXBwb3J0ZWQgYnkgc21hcnRlbnYiKTsKICAgIH0KICB9CiAgYXN5bmMgZ2V0U2FmZU5vZGVNb2R1bGUobW9kdWxlTmFtZUFyZykgewogICAgaWYgKCF0aGlzLmlzTm9kZSkgewogICAgICBjb25zb2xlLmVycm9yKGBZb3UgdHJpZWQgdG8gbG9hZCBhIG5vZGUgbW9kdWxlIGluIGEgd3JvbmcgY29udGV4dDogJHttb2R1bGVOYW1lQXJnfWApOwogICAgICByZXR1cm47CiAgICB9CiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKGByZXR1cm4gaW1wb3J0KCcke21vZHVsZU5hbWVBcmd9JylgKSgpOwogIH0KICBhc3luYyBnZXRTYWZlV2ViTW9kdWxlKHVybEFyZywgZ2V0RnVuY3Rpb25BcmcpIHsKICAgIGlmICghdGhpcy5pc0Jyb3dzZXIpIHsKICAgICAgY29uc29sZS5lcnJvcigiWW91IHRyaWVkIHRvIGxvYWQgYSB3ZWIgbW9kdWxlIGluIGEgd3JvbmcgY29udGV4dCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5sb2FkZWRTY3JpcHRzLmluY2x1ZGVzKHVybEFyZykpIHsKICAgICAgcmV0dXJuIGdldEZ1bmN0aW9uQXJnKCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmxvYWRlZFNjcmlwdHMucHVzaCh1cmxBcmcpOwogICAgfQogICAgY29uc3QgZG9uZSA9IHNtYXJ0cHJvbWlzZS5kZWZlcigpOwogICAgaWYgKGdsb2JhbFRoaXMuaW1wb3J0U2NyaXB0cykgewogICAgICBnbG9iYWxUaGlzLmltcG9ydFNjcmlwdHModXJsQXJnKTsKICAgICAgZG9uZS5yZXNvbHZlKCk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHsKICAgICAgICBkb25lLnJlc29sdmUoKTsKICAgICAgfTsKICAgICAgc2NyaXB0LnNyYyA9IHVybEFyZzsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgfQogICAgYXdhaXQgZG9uZS5wcm9taXNlOwogICAgcmV0dXJuIGdldEZ1bmN0aW9uQXJnKCk7CiAgfQogIGdldCBydW50aW1lRW52KCkgewogICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAidW5kZWZpbmVkIikgewogICAgICByZXR1cm4gIm5vZGUiOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICJicm93c2VyIjsKICAgIH0KICB9CiAgZ2V0IGlzQnJvd3NlcigpIHsKICAgIHJldHVybiAhdGhpcy5pc05vZGU7CiAgfQogIGdldCB1c2VyQWdlbnQoKSB7CiAgICBpZiAodGhpcy5pc0Jyb3dzZXIpIHsKICAgICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gInVuZGVmaW5lZCI7CiAgICB9CiAgfQogIGdldCBpc05vZGUoKSB7CiAgICByZXR1cm4gdGhpcy5ydW50aW1lRW52ID09PSAibm9kZSI7CiAgfQogIGdldCBub2RlVmVyc2lvbigpIHsKICAgIHJldHVybiBwcm9jZXNzLnZlcnNpb247CiAgfQogIGdldCBpc0NJKCkgewogICAgaWYgKHRoaXMuaXNOb2RlKSB7CiAgICAgIGlmIChwcm9jZXNzLmVudi5DSSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICBhc3luYyBpc01hY0FzeW5jKCkgewogICAgaWYgKHRoaXMuaXNOb2RlKSB7CiAgICAgIGNvbnN0IG9zID0gYXdhaXQgdGhpcy5nZXRTYWZlTm9kZU1vZHVsZSgib3MiKTsKICAgICAgcmV0dXJuIG9zLnBsYXRmb3JtKCkgPT09ICJkYXJ3aW4iOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICBhc3luYyBpc1dpbmRvd3NBc3luYygpIHsKICAgIGlmICh0aGlzLmlzTm9kZSkgewogICAgICBjb25zdCBvcyA9IGF3YWl0IHRoaXMuZ2V0U2FmZU5vZGVNb2R1bGUoIm9zIik7CiAgICAgIHJldHVybiBvcy5wbGF0Zm9ybSgpID09PSAid2luMzIiOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICBhc3luYyBpc0xpbnV4QXN5bmMoKSB7CiAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgY29uc3Qgb3MgPSBhd2FpdCB0aGlzLmdldFNhZmVOb2RlTW9kdWxlKCJvcyIpOwogICAgICByZXR1cm4gb3MucGxhdGZvcm0oKSA9PT0gImxpbnV4IjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgLyoqCiAgICogcHJpbnRzIHRoZSBlbnZpcm9ubWVudCB0byBjb25zb2xlCiAgICovCiAgYXN5bmMgcHJpbnRFbnYoKSB7CiAgICBpZiAodGhpcy5pc05vZGUpIHsKICAgICAgY29uc29sZS5sb2coInJ1bm5pbmcgb24gTk9ERSIpOwogICAgICBjb25zb2xlLmxvZygibm9kZSB2ZXJzaW9uIGlzICIgKyB0aGlzLm5vZGVWZXJzaW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUubG9nKCJydW5uaW5nIG9uIEJST1dTRVIiKTsKICAgICAgY29uc29sZS5sb2coImJyb3dzZXIgaXMgIiArIHRoaXMudXNlckFnZW50KTsKICAgIH0KICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQHB1c2gucm9ja3MraXNvaGFzaEAyLjAuMS9ub2RlX21vZHVsZXMvQHB1c2gucm9ja3MvaXNvaGFzaC9kaXN0X3RzL2luZGV4LmpzCnZhciBoZXgyID0gKGJ1ZmZlcjIpID0+IHsKICBjb25zdCBoZXhDb2RlcyA9IFtdOwogIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyMik7CiAgZm9yIChsZXQgaTExID0gMDsgaTExIDwgdmlldy5ieXRlTGVuZ3RoOyBpMTEgKz0gNCkgewogICAgY29uc3QgdmFsdWUyID0gdmlldy5nZXRVaW50MzIoaTExKTsKICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gdmFsdWUyLnRvU3RyaW5nKDE2KTsKICAgIGNvbnN0IHBhZGRpbmcgPSAiMDAwMDAwMDAiOwogICAgY29uc3QgcGFkZGVkVmFsdWUgPSAocGFkZGluZyArIHN0cmluZ1ZhbHVlKS5zbGljZSgtcGFkZGluZy5sZW5ndGgpOwogICAgaGV4Q29kZXMucHVzaChwYWRkZWRWYWx1ZSk7CiAgfQogIHJldHVybiBoZXhDb2Rlcy5qb2luKCIiKTsKfTsKdmFyIHNoYTI1NkZyb21TdHJpbmcyID0gYXN5bmMgKHN0cmluZ0FyZykgPT4gewogIGNvbnN0IHNtYXJ0ZW52ID0gbmV3IGRpc3RfdHNfZXhwb3J0czMyLlNtYXJ0ZW52KCk7CiAgaWYgKHNtYXJ0ZW52LmlzQnJvd3NlcikgewogICAgY29uc3QgYnVmZmVyMiA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHJpbmdBcmcpOwogICAgY29uc3QgaGFzaCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCJTSEEtMjU2IiwgYnVmZmVyMik7CiAgICBjb25zdCByZXN1bHQgPSBoZXgyKGhhc2gpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9IGVsc2UgaWYgKHNtYXJ0ZW52LmlzTm9kZSkgewogICAgY29uc3Qgc21hcnRoYXNoTW9kdWxlID0gYXdhaXQgc21hcnRlbnYuZ2V0U2FmZU5vZGVNb2R1bGUoIkBwdXNocm9ja3Mvc21hcnRoYXNoIik7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzbWFydGhhc2hNb2R1bGUuc2hhMjU2RnJvbVN0cmluZyhzdHJpbmdBcmcpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn07CgovLyBub2RlX21vZHVsZXMvLnBucG0vQGFwaS5nbG9iYWwrdHlwZWRzb2NrZXRANC4xLjJfQHB1c2gucm9ja3Mrc21hcnRzZXJ2ZUAyLjAuMS9ub2RlX21vZHVsZXMvQGFwaS5nbG9iYWwvdHlwZWRzb2NrZXQvZGlzdF90cy90eXBlZHNvY2tldC5wbHVnaW5zLmpzCmluaXRfZGlzdF90czE5KCk7CmluaXRfZGlzdF90czQoKTsKaW5pdF9kaXN0X3RzMygpOwppbml0X2Rpc3RfdHMxNigpOwppbml0X2Rpc3RfdHMoKTsKaW5pdF9kaXN0X3RzMigpOwppbml0X2Rpc3RfdHMxMygpOwppbml0X2Rpc3RfdHMyNCgpOwoKLy8gbm9kZV9tb2R1bGVzLy5wbnBtL0BhcGkuZ2xvYmFsK3R5cGVkc29ja2V0QDQuMS4yX0BwdXNoLnJvY2tzK3NtYXJ0c2VydmVAMi4wLjEvbm9kZV9tb2R1bGVzL0BhcGkuZ2xvYmFsL3R5cGVkc29ja2V0L2Rpc3RfdHMvdHlwZWRzb2NrZXQuY2xhc3Nlcy50eXBlZHNvY2tldC5qcwp2YXIgVEFHX1BSRUZJWCA9ICJfX3R5cGVkc29ja2V0X3RhZ19fIjsKZnVuY3Rpb24gd3JhcFNtYXJ0U2VydmVQZWVyKHBlZXIpIHsKICByZXR1cm4gewogICAgcGVlciwKICAgIGFzeW5jIGdldFRhZ0J5SWQodGFnSWQpIHsKICAgICAgaWYgKCFwZWVyLnRhZ3MuaGFzKHRhZ0lkKSkgewogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH0KICAgICAgY29uc3QgcGF5bG9hZCA9IHBlZXIuZGF0YS5nZXQoYCR7VEFHX1BSRUZJWH0ke3RhZ0lkfWApOwogICAgICByZXR1cm4geyBpZDogdGFnSWQsIHBheWxvYWQgfTsKICAgIH0KICB9Owp9CnZhciBUeXBlZFNvY2tldCA9IGNsYXNzIF9UeXBlZFNvY2tldCB7CiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8vIFNUQVRJQyBNRVRIT0RTCiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8qKgogICAqIENyZWF0ZXMgYSBUeXBlZFNvY2tldCBjbGllbnQgdXNpbmcgbmF0aXZlIFdlYlNvY2tldC4KICAgKiBXb3JrcyBpbiBib3RoIGJyb3dzZXIgYW5kIE5vZGUuanMgZW52aXJvbm1lbnRzLgogICAqCiAgICogQHBhcmFtIHR5cGVkcm91dGVyQXJnIC0gVHlwZWRSb3V0ZXIgZm9yIGhhbmRsaW5nIHNlcnZlci1pbml0aWF0ZWQgcmVxdWVzdHMKICAgKiBAcGFyYW0gc2VydmVyVXJsQXJnIC0gU2VydmVyIFVSTCAoZS5nLiwgJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMCcgb3IgJ3dzczovL2V4YW1wbGUuY29tJykKICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbm5lY3Rpb24gb3B0aW9ucwogICAqCiAgICogQGV4YW1wbGUKICAgKiBgYGB0eXBlc2NyaXB0CiAgICogY29uc3QgdHlwZWRSb3V0ZXIgPSBuZXcgVHlwZWRSb3V0ZXIoKTsKICAgKiBjb25zdCBjbGllbnQgPSBhd2FpdCBUeXBlZFNvY2tldC5jcmVhdGVDbGllbnQoCiAgICogICB0eXBlZFJvdXRlciwKICAgKiAgICdodHRwOi8vbG9jYWxob3N0OjMwMDAnLAogICAqICAgeyBhdXRvUmVjb25uZWN0OiB0cnVlIH0KICAgKiApOwogICAqIGBgYAogICAqLwogIHN0YXRpYyBhc3luYyBjcmVhdGVDbGllbnQodHlwZWRyb3V0ZXJBcmcsIHNlcnZlclVybEFyZywgb3B0aW9ucyA9IHt9KSB7CiAgICBjb25zdCBkZWZhdWx0T3B0aW9uczIgPSB7CiAgICAgIGF1dG9SZWNvbm5lY3Q6IHRydWUsCiAgICAgIG1heFJldHJpZXM6IDEwMCwKICAgICAgaW5pdGlhbEJhY2tvZmZNczogMWUzLAogICAgICBtYXhCYWNrb2ZmTXM6IDZlNAogICAgfTsKICAgIGNvbnN0IG9wdHMgPSB7IC4uLmRlZmF1bHRPcHRpb25zMiwgLi4ub3B0aW9ucyB9OwogICAgY29uc3QgdHlwZWRTb2NrZXQgPSBuZXcgX1R5cGVkU29ja2V0KCJjbGllbnQiLCB0eXBlZHJvdXRlckFyZyk7CiAgICB0eXBlZFNvY2tldC5jbGllbnRPcHRpb25zID0gb3B0czsKICAgIHR5cGVkU29ja2V0LnNlcnZlclVybCA9IHNlcnZlclVybEFyZzsKICAgIHR5cGVkU29ja2V0LmN1cnJlbnRCYWNrb2ZmID0gb3B0cy5pbml0aWFsQmFja29mZk1zOwogICAgYXdhaXQgdHlwZWRTb2NrZXQuY29ubmVjdCgpOwogICAgcmV0dXJuIHR5cGVkU29ja2V0OwogIH0KICBzdGF0aWMgewogICAgdGhpcy51c2VXaW5kb3dMb2NhdGlvbk9yaWdpblVybCA9ICgpID0+IHsKICAgICAgcmV0dXJuIGRpc3RfdHNfZXhwb3J0czI0LlNtYXJ0dXJsLmNyZWF0ZUZyb21VcmwoZ2xvYmFsVGhpcy5sb2NhdGlvbi5vcmlnaW4pLnRvU3RyaW5nKCk7CiAgICB9OwogIH0KICAvKioKICAgKiBDcmVhdGVzIGEgVHlwZWRTb2NrZXQgc2VydmVyIGZyb20gYW4gZXhpc3RpbmcgU21hcnRTZXJ2ZSBpbnN0YW5jZS4KICAgKiBUaGlzIGlzIHRoZSBvbmx5IHdheSB0byBjcmVhdGUgYSBzZXJ2ZXItc2lkZSBUeXBlZFNvY2tldC4KICAgKgogICAqIEBwYXJhbSBzbWFydFNlcnZlQXJnIC0gU21hcnRTZXJ2ZSBpbnN0YW5jZSB3aXRoIHR5cGVkUm91dGVyIGNvbmZpZ3VyZWQgaW4gd2Vic29ja2V0IG9wdGlvbnMKICAgKiBAcGFyYW0gdHlwZWRSb3V0ZXJBcmcgLSBUeXBlZFJvdXRlciBmb3IgaGFuZGxpbmcgcmVxdWVzdHMgKG11c3QgbWF0Y2ggU21hcnRTZXJ2ZSdzIHR5cGVkUm91dGVyKQogICAqCiAgICogQGV4YW1wbGUKICAgKiBgYGB0eXBlc2NyaXB0CiAgICogY29uc3QgdHlwZWRSb3V0ZXIgPSBuZXcgVHlwZWRSb3V0ZXIoKTsKICAgKiBjb25zdCBzbWFydFNlcnZlID0gbmV3IFNtYXJ0U2VydmUoewogICAqICAgcG9ydDogMzAwMCwKICAgKiAgIHdlYnNvY2tldDogewogICAqICAgICB0eXBlZFJvdXRlciwKICAgKiAgICAgb25Db25uZWN0aW9uT3BlbjogKHBlZXIpID0+IHBlZXIudGFncy5hZGQoJ2NsaWVudCcpCiAgICogICB9CiAgICogfSk7CiAgICogYXdhaXQgc21hcnRTZXJ2ZS5zdGFydCgpOwogICAqIGNvbnN0IHR5cGVkU29ja2V0ID0gVHlwZWRTb2NrZXQuZnJvbVNtYXJ0U2VydmUoc21hcnRTZXJ2ZSwgdHlwZWRSb3V0ZXIpOwogICAqIGBgYAogICAqLwogIHN0YXRpYyBmcm9tU21hcnRTZXJ2ZShzbWFydFNlcnZlQXJnLCB0eXBlZFJvdXRlckFyZykgewogICAgY29uc3QgY29ubmVjdGlvbldyYXBwZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIF9UeXBlZFNvY2tldC5yZWdpc3RlclRhZ0hhbmRsZXJzKHR5cGVkUm91dGVyQXJnKTsKICAgIGNvbnN0IHR5cGVkU29ja2V0ID0gbmV3IF9UeXBlZFNvY2tldCgic2VydmVyIiwgdHlwZWRSb3V0ZXJBcmcpOwogICAgdHlwZWRTb2NrZXQuc21hcnRTZXJ2ZVJlZiA9IHNtYXJ0U2VydmVBcmc7CiAgICB0eXBlZFNvY2tldC5zbWFydFNlcnZlQ29ubmVjdGlvbldyYXBwZXJzID0gY29ubmVjdGlvbldyYXBwZXJzOwogICAgcmV0dXJuIHR5cGVkU29ja2V0OwogIH0KICAvKioKICAgKiBSZWdpc3RlcnMgYnVpbHQtaW4gVHlwZWRIYW5kbGVycyBmb3IgdGFnIG1hbmFnZW1lbnQKICAgKi8KICBzdGF0aWMgcmVnaXN0ZXJUYWdIYW5kbGVycyh0eXBlZFJvdXRlcikgewogICAgdHlwZWRSb3V0ZXIuYWRkVHlwZWRIYW5kbGVyKG5ldyBkaXN0X3RzX2V4cG9ydHMxOS5UeXBlZEhhbmRsZXIoIl9fdHlwZWRzb2NrZXRfc2V0VGFnIiwgYXN5bmMgKGRhdGEsIG1ldGEpID0+IHsKICAgICAgY29uc3QgcGVlciA9IG1ldGE/LmxvY2FsRGF0YT8ucGVlcjsKICAgICAgaWYgKCFwZWVyKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJzZXRUYWc6IE5vIHBlZXIgZm91bmQgaW4gcmVxdWVzdCBjb250ZXh0Iik7CiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UgfTsKICAgICAgfQogICAgICBwZWVyLnRhZ3MuYWRkKGRhdGEubmFtZSk7CiAgICAgIHBlZXIuZGF0YS5zZXQoYCR7VEFHX1BSRUZJWH0ke2RhdGEubmFtZX1gLCBkYXRhLnBheWxvYWQpOwogICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07CiAgICB9KSk7CiAgICB0eXBlZFJvdXRlci5hZGRUeXBlZEhhbmRsZXIobmV3IGRpc3RfdHNfZXhwb3J0czE5LlR5cGVkSGFuZGxlcigiX190eXBlZHNvY2tldF9yZW1vdmVUYWciLCBhc3luYyAoZGF0YSwgbWV0YSkgPT4gewogICAgICBjb25zdCBwZWVyID0gbWV0YT8ubG9jYWxEYXRhPy5wZWVyOwogICAgICBpZiAoIXBlZXIpIHsKICAgICAgICBjb25zb2xlLndhcm4oInJlbW92ZVRhZzogTm8gcGVlciBmb3VuZCBpbiByZXF1ZXN0IGNvbnRleHQiKTsKICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9OwogICAgICB9CiAgICAgIHBlZXIudGFncy5kZWxldGUoZGF0YS5uYW1lKTsKICAgICAgcGVlci5kYXRhLmRlbGV0ZShgJHtUQUdfUFJFRklYfSR7ZGF0YS5uYW1lfWApOwogICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07CiAgICB9KSk7CiAgfQogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAvLyBDT05TVFJVQ1RPUgogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBjb25zdHJ1Y3RvcihzaWRlQXJnLCB0eXBlZHJvdXRlckFyZykgewogICAgdGhpcy5zdGF0dXNTdWJqZWN0ID0gbmV3IGRpc3RfdHNfZXhwb3J0czIucnhqcy5TdWJqZWN0KCk7CiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMgPSAibmV3IjsKICAgIHRoaXMud2Vic29ja2V0ID0gbnVsbDsKICAgIHRoaXMuY2xpZW50T3B0aW9ucyA9IG51bGw7CiAgICB0aGlzLnNlcnZlclVybCA9ICIiOwogICAgdGhpcy5yZXRyeUNvdW50ID0gMDsKICAgIHRoaXMuY3VycmVudEJhY2tvZmYgPSAxZTM7CiAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICB0aGlzLnNtYXJ0U2VydmVSZWYgPSBudWxsOwogICAgdGhpcy5zbWFydFNlcnZlQ29ubmVjdGlvbldyYXBwZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIHRoaXMuc2lkZSA9IHNpZGVBcmc7CiAgICB0aGlzLnR5cGVkcm91dGVyID0gdHlwZWRyb3V0ZXJBcmc7CiAgfQogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAvLyBDTElFTlQgTUVUSE9EUwogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAvKioKICAgKiBDb25uZWN0cyB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2ZXIgdXNpbmcgbmF0aXZlIFdlYlNvY2tldAogICAqLwogIGFzeW5jIGNvbm5lY3QoKSB7CiAgICBjb25zdCBkb25lID0gZGlzdF90c19leHBvcnRzLmRlZmVyKCk7CiAgICB0aGlzLnVwZGF0ZVN0YXR1cygiY29ubmVjdGluZyIpOwogICAgY29uc3Qgd3NVcmwgPSB0aGlzLnRvV2ViU29ja2V0VXJsKHRoaXMuc2VydmVyVXJsKTsKICAgIGNvbnNvbGUubG9nKGBUeXBlZFNvY2tldCBjb25uZWN0aW5nIHRvICR7d3NVcmx9Li4uYCk7CiAgICB0aGlzLndlYnNvY2tldCA9IG5ldyBXZWJTb2NrZXQod3NVcmwpOwogICAgY29uc3QgY29ubmVjdGlvblRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXR1cyAhPT0gImNvbm5lY3RlZCIpIHsKICAgICAgICBjb25zb2xlLndhcm4oIlR5cGVkU29ja2V0IGNvbm5lY3Rpb24gdGltZW91dCIpOwogICAgICAgIHRoaXMud2Vic29ja2V0Py5jbG9zZSgpOwogICAgICAgIGRvbmUucmVqZWN0KG5ldyBFcnJvcigiQ29ubmVjdGlvbiB0aW1lb3V0IikpOwogICAgICB9CiAgICB9LCAxZTQpOwogICAgdGhpcy53ZWJzb2NrZXQub25vcGVuID0gKCkgPT4gewogICAgICBjbGVhclRpbWVvdXQoY29ubmVjdGlvblRpbWVvdXQpOwogICAgICBjb25zb2xlLmxvZygiVHlwZWRTb2NrZXQgY29ubmVjdGVkISIpOwogICAgICB0aGlzLnVwZGF0ZVN0YXR1cygiY29ubmVjdGVkIik7CiAgICAgIHRoaXMucmV0cnlDb3VudCA9IDA7CiAgICAgIHRoaXMuY3VycmVudEJhY2tvZmYgPSB0aGlzLmNsaWVudE9wdGlvbnM/LmluaXRpYWxCYWNrb2ZmTXMgPz8gMWUzOwogICAgICBkb25lLnJlc29sdmUoKTsKICAgIH07CiAgICB0aGlzLndlYnNvY2tldC5vbm1lc3NhZ2UgPSBhc3luYyAoZXZlbnQpID0+IHsKICAgICAgYXdhaXQgdGhpcy5oYW5kbGVNZXNzYWdlKGV2ZW50LmRhdGEpOwogICAgfTsKICAgIHRoaXMud2Vic29ja2V0Lm9uY2xvc2UgPSAoKSA9PiB7CiAgICAgIGNsZWFyVGltZW91dChjb25uZWN0aW9uVGltZW91dCk7CiAgICAgIHRoaXMuaGFuZGxlRGlzY29ubmVjdCgpOwogICAgfTsKICAgIHRoaXMud2Vic29ja2V0Lm9uZXJyb3IgPSAoZXJyb3IpID0+IHsKICAgICAgY29uc29sZS5lcnJvcigiVHlwZWRTb2NrZXQgV2ViU29ja2V0IGVycm9yOiIsIGVycm9yKTsKICAgIH07CiAgICB0cnkgewogICAgICBhd2FpdCBkb25lLnByb21pc2U7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY2xlYXJUaW1lb3V0KGNvbm5lY3Rpb25UaW1lb3V0KTsKICAgICAgaWYgKHRoaXMuY2xpZW50T3B0aW9ucz8uYXV0b1JlY29ubmVjdCkgewogICAgICAgIGF3YWl0IHRoaXMuc2NoZWR1bGVSZWNvbm5lY3QoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBlcnI7CiAgICAgIH0KICAgIH0KICB9CiAgLyoqCiAgICogQ29udmVydHMgYW4gSFRUUChTKSBVUkwgdG8gYSBXZWJTb2NrZXQgVVJMCiAgICovCiAgdG9XZWJTb2NrZXRVcmwodXJsKSB7CiAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHVybCk7CiAgICBjb25zdCB3c1Byb3RvY29sID0gcGFyc2VkLnByb3RvY29sID09PSAiaHR0cHM6IiA/ICJ3c3M6IiA6ICJ3czoiOwogICAgcmV0dXJuIGAke3dzUHJvdG9jb2x9Ly8ke3BhcnNlZC5ob3N0fSR7cGFyc2VkLnBhdGhuYW1lfWA7CiAgfQogIC8qKgogICAqIEhhbmRsZXMgaW5jb21pbmcgV2ViU29ja2V0IG1lc3NhZ2VzCiAgICovCiAgYXN5bmMgaGFuZGxlTWVzc2FnZShkYXRhKSB7CiAgICB0cnkgewogICAgICBjb25zdCBtZXNzYWdlVGV4dCA9IHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiA/IGRhdGEgOiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZGF0YSk7CiAgICAgIGNvbnN0IG1lc3NhZ2UyID0gZGlzdF90c19leHBvcnRzMTYucGFyc2UobWVzc2FnZVRleHQpOwogICAgICBpZiAobWVzc2FnZTIuY29ycmVsYXRpb24/LmlkICYmIHRoaXMucGVuZGluZ1JlcXVlc3RzLmhhcyhtZXNzYWdlMi5jb3JyZWxhdGlvbi5pZCkpIHsKICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nUmVxdWVzdHMuZ2V0KG1lc3NhZ2UyLmNvcnJlbGF0aW9uLmlkKTsKICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5kZWxldGUobWVzc2FnZTIuY29ycmVsYXRpb24uaWQpOwogICAgICAgIHBlbmRpbmcucmVzb2x2ZShtZXNzYWdlMik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy50eXBlZHJvdXRlci5yb3V0ZUFuZEFkZFJlc3BvbnNlKG1lc3NhZ2UyKTsKICAgICAgaWYgKHJlc3BvbnNlICYmIHRoaXMud2Vic29ja2V0Py5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikgewogICAgICAgIHRoaXMud2Vic29ja2V0LnNlbmQoZGlzdF90c19leHBvcnRzMTYuc3RyaW5naWZ5KHJlc3BvbnNlKSk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycikgewogICAgICBjb25zb2xlLmVycm9yKCJUeXBlZFNvY2tldCBmYWlsZWQgdG8gcHJvY2VzcyBtZXNzYWdlOiIsIGVycik7CiAgICB9CiAgfQogIC8qKgogICAqIEhhbmRsZXMgV2ViU29ja2V0IGRpc2Nvbm5lY3Rpb24KICAgKi8KICBoYW5kbGVEaXNjb25uZWN0KCkgewogICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXR1cyA9PT0gImRpc2Nvbm5lY3RlZCIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy51cGRhdGVTdGF0dXMoImRpc2Nvbm5lY3RlZCIpOwogICAgZm9yIChjb25zdCBbaWQsIHBlbmRpbmddIG9mIHRoaXMucGVuZGluZ1JlcXVlc3RzKSB7CiAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcigiVHlwZWRTb2NrZXQgZGlzY29ubmVjdGVkIikpOwogICAgfQogICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuY2xlYXIoKTsKICAgIGlmICh0aGlzLmNsaWVudE9wdGlvbnM/LmF1dG9SZWNvbm5lY3QgJiYgdGhpcy5yZXRyeUNvdW50IDwgdGhpcy5jbGllbnRPcHRpb25zLm1heFJldHJpZXMpIHsKICAgICAgdGhpcy5zY2hlZHVsZVJlY29ubmVjdCgpOwogICAgfQogIH0KICAvKioKICAgKiBTY2hlZHVsZXMgYSByZWNvbm5lY3Rpb24gYXR0ZW1wdCB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYKICAgKi8KICBhc3luYyBzY2hlZHVsZVJlY29ubmVjdCgpIHsKICAgIGlmICghdGhpcy5jbGllbnRPcHRpb25zKQogICAgICByZXR1cm47CiAgICB0aGlzLnVwZGF0ZVN0YXR1cygicmVjb25uZWN0aW5nIik7CiAgICB0aGlzLnJldHJ5Q291bnQrKzsKICAgIGNvbnN0IGppdHRlciA9IHRoaXMuY3VycmVudEJhY2tvZmYgKiAwLjIgKiAoTWF0aC5yYW5kb20oKSAqIDIgLSAxKTsKICAgIGNvbnN0IGRlbGF5MiA9IE1hdGgubWluKHRoaXMuY3VycmVudEJhY2tvZmYgKyBqaXR0ZXIsIHRoaXMuY2xpZW50T3B0aW9ucy5tYXhCYWNrb2ZmTXMpOwogICAgY29uc29sZS5sb2coYFR5cGVkU29ja2V0IHJlY29ubmVjdGluZyBpbiAke01hdGgucm91bmQoZGVsYXkyKX1tcyAoYXR0ZW1wdCAke3RoaXMucmV0cnlDb3VudH0vJHt0aGlzLmNsaWVudE9wdGlvbnMubWF4UmV0cmllc30pYCk7CiAgICBhd2FpdCBkaXN0X3RzX2V4cG9ydHMzLmRlbGF5Rm9yKGRlbGF5Mik7CiAgICB0aGlzLmN1cnJlbnRCYWNrb2ZmID0gTWF0aC5taW4odGhpcy5jdXJyZW50QmFja29mZiAqIDIsIHRoaXMuY2xpZW50T3B0aW9ucy5tYXhCYWNrb2ZmTXMpOwogICAgdHJ5IHsKICAgICAgYXdhaXQgdGhpcy5jb25uZWN0KCk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY29uc29sZS5lcnJvcigiVHlwZWRTb2NrZXQgcmVjb25uZWN0aW9uIGZhaWxlZDoiLCBlcnIpOwogICAgfQogIH0KICAvKioKICAgKiBVcGRhdGVzIGNvbm5lY3Rpb24gc3RhdHVzIGFuZCBub3RpZmllcyBzdWJzY3JpYmVycwogICAqLwogIHVwZGF0ZVN0YXR1cyhzdGF0dXMpIHsKICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TdGF0dXMgIT09IHN0YXR1cykgewogICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMgPSBzdGF0dXM7CiAgICAgIHRoaXMuc3RhdHVzU3ViamVjdC5uZXh0KHN0YXR1cyk7CiAgICB9CiAgfQogIC8qKgogICAqIFNlbmRzIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyIGFuZCB3YWl0cyBmb3IgcmVzcG9uc2UgKGNsaWVudC1zaWRlKQogICAqLwogIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHsKICAgIGlmICghdGhpcy53ZWJzb2NrZXQgfHwgdGhpcy53ZWJzb2NrZXQucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0Lk9QRU4pIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJXZWJTb2NrZXQgbm90IGNvbm5lY3RlZCIpOwogICAgfQogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlMiwgcmVqZWN0KSA9PiB7CiAgICAgIGNvbnN0IHRpbWVvdXQyID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuZGVsZXRlKHJlcXVlc3QuY29ycmVsYXRpb24uaWQpOwogICAgICAgIHJlamVjdChuZXcgRXJyb3IoIlJlcXVlc3QgdGltZW91dCIpKTsKICAgICAgfSwgM2U0KTsKICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuc2V0KHJlcXVlc3QuY29ycmVsYXRpb24uaWQsIHsKICAgICAgICByZXNvbHZlOiAocmVzcG9uc2UpID0+IHsKICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0Mik7CiAgICAgICAgICByZXNvbHZlMihyZXNwb25zZSk7CiAgICAgICAgfSwKICAgICAgICByZWplY3Q6IChlcnJvcikgPT4gewogICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQyKTsKICAgICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdGhpcy53ZWJzb2NrZXQuc2VuZChkaXN0X3RzX2V4cG9ydHMxNi5zdHJpbmdpZnkocmVxdWVzdCkpOwogICAgfSk7CiAgfQogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAvLyBQVUJMSUMgQVBJIC0gU0hBUkVECiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8qKgogICAqIENyZWF0ZXMgYSBUeXBlZFJlcXVlc3QgZm9yIHRoZSBzcGVjaWZpZWQgbWV0aG9kLgogICAqIE9uIGNsaWVudHMsIHNlbmRzIHRvIHRoZSBzZXJ2ZXIuCiAgICogT24gc2VydmVycywgc2VuZHMgdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQgY29ubmVjdGlvbi4KICAgKi8KICBjcmVhdGVUeXBlZFJlcXVlc3QobWV0aG9kTmFtZSwgdGFyZ2V0Q29ubmVjdGlvbikgewogICAgY29uc3QgcG9zdE1ldGhvZCA9IGFzeW5jIChyZXF1ZXN0RGF0YUFyZykgPT4gewogICAgICBpZiAodGhpcy5zaWRlID09PSAiY2xpZW50IikgewogICAgICAgIHJldHVybiB0aGlzLnNlbmRSZXF1ZXN0KHJlcXVlc3REYXRhQXJnKTsKICAgICAgfQogICAgICBpZiAoIXRoaXMuc21hcnRTZXJ2ZVJlZikgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiU2VydmVyIG5vdCBpbml0aWFsaXplZCIpOwogICAgICB9CiAgICAgIGxldCB0YXJnZXQgPSB0YXJnZXRDb25uZWN0aW9uOwogICAgICBpZiAoIXRhcmdldCkgewogICAgICAgIGNvbnN0IGFsbENvbm5lY3Rpb25zID0gdGhpcy5zbWFydFNlcnZlUmVmLmdldFdlYlNvY2tldENvbm5lY3Rpb25zKCk7CiAgICAgICAgaWYgKGFsbENvbm5lY3Rpb25zLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgY29uc3QgcGVlciA9IGFsbENvbm5lY3Rpb25zWzBdOwogICAgICAgICAgdGFyZ2V0ID0gdGhpcy5nZXRPckNyZWF0ZVdyYXBwZXIocGVlcik7CiAgICAgICAgfSBlbHNlIGlmIChhbGxDb25uZWN0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTm8gV2ViU29ja2V0IGNvbm5lY3Rpb25zIGF2YWlsYWJsZSIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk11bHRpcGxlIGNvbm5lY3Rpb25zIGF2YWlsYWJsZSAtIHNwZWNpZnkgdGFyZ2V0Q29ubmVjdGlvbiIpOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBpbnRlcmVzdCA9IGF3YWl0IHRoaXMudHlwZWRyb3V0ZXIuZmlyZUV2ZW50SW50ZXJlc3RNYXAuYWRkSW50ZXJlc3QocmVxdWVzdERhdGFBcmcuY29ycmVsYXRpb24uaWQsIHJlcXVlc3REYXRhQXJnKTsKICAgICAgdGFyZ2V0LnBlZXIuc2VuZChkaXN0X3RzX2V4cG9ydHMxNi5zdHJpbmdpZnkocmVxdWVzdERhdGFBcmcpKTsKICAgICAgcmV0dXJuIGF3YWl0IGludGVyZXN0LmludGVyZXN0RnVsbGZpbGxlZDsKICAgIH07CiAgICByZXR1cm4gbmV3IGRpc3RfdHNfZXhwb3J0czE5LlR5cGVkUmVxdWVzdChuZXcgZGlzdF90c19leHBvcnRzMTkuVHlwZWRUYXJnZXQoeyBwb3N0TWV0aG9kIH0pLCBtZXRob2ROYW1lKTsKICB9CiAgLyoqCiAgICogR2V0cyB0aGUgY3VycmVudCBjb25uZWN0aW9uIHN0YXR1cwogICAqLwogIGdldFN0YXR1cygpIHsKICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25TdGF0dXM7CiAgfQogIC8qKgogICAqIFN0b3BzIHRoZSBUeXBlZFNvY2tldCBjbGllbnQgb3IgY2xlYW5zIHVwIHNlcnZlciBzdGF0ZQogICAqLwogIGFzeW5jIHN0b3AoKSB7CiAgICBpZiAodGhpcy5zaWRlID09PSAiY2xpZW50IikgewogICAgICBpZiAodGhpcy5jbGllbnRPcHRpb25zKSB7CiAgICAgICAgdGhpcy5jbGllbnRPcHRpb25zLmF1dG9SZWNvbm5lY3QgPSBmYWxzZTsKICAgICAgfQogICAgICBpZiAodGhpcy53ZWJzb2NrZXQpIHsKICAgICAgICB0aGlzLndlYnNvY2tldC5jbG9zZSgpOwogICAgICAgIHRoaXMud2Vic29ja2V0ID0gbnVsbDsKICAgICAgfQogICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5jbGVhcigpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5zbWFydFNlcnZlQ29ubmVjdGlvbldyYXBwZXJzLmNsZWFyKCk7CiAgICB9CiAgfQogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAvLyBDTElFTlQtT05MWSBNRVRIT0RTCiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8qKgogICAqIFNldHMgYSB0YWcgb24gdGhpcyBjbGllbnQgY29ubmVjdGlvbi4KICAgKiBUYWdzIGFyZSBzdG9yZWQgb24gdGhlIHNlcnZlciBhbmQgY2FuIGJlIHVzZWQgZm9yIGZpbHRlcmluZy4KICAgKiBAY2xpZW50LW9ubHkKICAgKi8KICBhc3luYyBzZXRUYWcobmFtZSwgcGF5bG9hZCkgewogICAgaWYgKHRoaXMuc2lkZSAhPT0gImNsaWVudCIpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJzZXRUYWcgaXMgb25seSBhdmFpbGFibGUgb24gY2xpZW50cyIpOwogICAgfQogICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuY3JlYXRlVHlwZWRSZXF1ZXN0KCJfX3R5cGVkc29ja2V0X3NldFRhZyIpOwogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0LmZpcmUoeyBuYW1lLCBwYXlsb2FkIH0pOwogICAgaWYgKCFyZXNwb25zZS5zdWNjZXNzKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIHNldCB0YWcgb24gc2VydmVyIik7CiAgICB9CiAgfQogIC8qKgogICAqIFJlbW92ZXMgYSB0YWcgZnJvbSB0aGlzIGNsaWVudCBjb25uZWN0aW9uLgogICAqIEBjbGllbnQtb25seQogICAqLwogIGFzeW5jIHJlbW92ZVRhZyhuYW1lKSB7CiAgICBpZiAodGhpcy5zaWRlICE9PSAiY2xpZW50IikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoInJlbW92ZVRhZyBpcyBvbmx5IGF2YWlsYWJsZSBvbiBjbGllbnRzIik7CiAgICB9CiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5jcmVhdGVUeXBlZFJlcXVlc3QoIl9fdHlwZWRzb2NrZXRfcmVtb3ZlVGFnIik7CiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QuZmlyZSh7IG5hbWUgfSk7CiAgICBpZiAoIXJlc3BvbnNlLnN1Y2Nlc3MpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gcmVtb3ZlIHRhZyBvbiBzZXJ2ZXIiKTsKICAgIH0KICB9CiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8vIFNFUlZFUi1PTkxZIE1FVEhPRFMKICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLyoqCiAgICogR2V0cyBvciBjcmVhdGVzIGEgY29ubmVjdGlvbiB3cmFwcGVyIGZvciBhIHBlZXIKICAgKi8KICBnZXRPckNyZWF0ZVdyYXBwZXIocGVlcikgewogICAgbGV0IHdyYXBwZXIgPSB0aGlzLnNtYXJ0U2VydmVDb25uZWN0aW9uV3JhcHBlcnMuZ2V0KHBlZXIuaWQpOwogICAgaWYgKCF3cmFwcGVyKSB7CiAgICAgIHdyYXBwZXIgPSB3cmFwU21hcnRTZXJ2ZVBlZXIocGVlcik7CiAgICAgIHRoaXMuc21hcnRTZXJ2ZUNvbm5lY3Rpb25XcmFwcGVycy5zZXQocGVlci5pZCwgd3JhcHBlcik7CiAgICB9CiAgICByZXR1cm4gd3JhcHBlcjsKICB9CiAgLyoqCiAgICogRmluZHMgYWxsIGNvbm5lY3Rpb25zIG1hdGNoaW5nIHRoZSBmaWx0ZXIgZnVuY3Rpb24uCiAgICogQHNlcnZlci1vbmx5CiAgICovCiAgYXN5bmMgZmluZEFsbFRhcmdldENvbm5lY3Rpb25zKGFzeW5jRmluZEZ1bmNBcmcpIHsKICAgIGlmICh0aGlzLnNpZGUgIT09ICJzZXJ2ZXIiIHx8ICF0aGlzLnNtYXJ0U2VydmVSZWYpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJmaW5kQWxsVGFyZ2V0Q29ubmVjdGlvbnMgaXMgb25seSBhdmFpbGFibGUgb24gc2VydmVycyIpOwogICAgfQogICAgY29uc3QgbWF0Y2hpbmdDb25uZWN0aW9ucyA9IFtdOwogICAgZm9yIChjb25zdCBwZWVyIG9mIHRoaXMuc21hcnRTZXJ2ZVJlZi5nZXRXZWJTb2NrZXRDb25uZWN0aW9ucygpKSB7CiAgICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmdldE9yQ3JlYXRlV3JhcHBlcihwZWVyKTsKICAgICAgaWYgKGF3YWl0IGFzeW5jRmluZEZ1bmNBcmcod3JhcHBlcikpIHsKICAgICAgICBtYXRjaGluZ0Nvbm5lY3Rpb25zLnB1c2god3JhcHBlcik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXRjaGluZ0Nvbm5lY3Rpb25zOwogIH0KICAvKioKICAgKiBGaW5kcyB0aGUgZmlyc3QgY29ubmVjdGlvbiBtYXRjaGluZyB0aGUgZmlsdGVyIGZ1bmN0aW9uLgogICAqIEBzZXJ2ZXItb25seQogICAqLwogIGFzeW5jIGZpbmRUYXJnZXRDb25uZWN0aW9uKGFzeW5jRmluZEZ1bmNBcmcpIHsKICAgIGNvbnN0IGFsbE1hdGNoaW5nID0gYXdhaXQgdGhpcy5maW5kQWxsVGFyZ2V0Q29ubmVjdGlvbnMoYXN5bmNGaW5kRnVuY0FyZyk7CiAgICByZXR1cm4gYWxsTWF0Y2hpbmdbMF07CiAgfQogIC8qKgogICAqIEZpbmRzIGFsbCBjb25uZWN0aW9ucyB3aXRoIHRoZSBzcGVjaWZpZWQgdGFnLgogICAqIEBzZXJ2ZXItb25seQogICAqLwogIGFzeW5jIGZpbmRBbGxUYXJnZXRDb25uZWN0aW9uc0J5VGFnKGtleUFyZywgcGF5bG9hZEFyZykgewogICAgaWYgKHRoaXMuc2lkZSAhPT0gInNlcnZlciIgfHwgIXRoaXMuc21hcnRTZXJ2ZVJlZikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoImZpbmRBbGxUYXJnZXRDb25uZWN0aW9uc0J5VGFnIGlzIG9ubHkgYXZhaWxhYmxlIG9uIHNlcnZlcnMiKTsKICAgIH0KICAgIGNvbnN0IHBlZXJzID0gdGhpcy5zbWFydFNlcnZlUmVmLmdldFdlYlNvY2tldENvbm5lY3Rpb25zQnlUYWcoa2V5QXJnKTsKICAgIGNvbnN0IHJlc3VsdHMgPSBbXTsKICAgIGZvciAoY29uc3QgcGVlciBvZiBwZWVycykgewogICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5nZXRPckNyZWF0ZVdyYXBwZXIocGVlcik7CiAgICAgIGlmIChwYXlsb2FkQXJnICE9PSB2b2lkIDApIHsKICAgICAgICBjb25zdCB0YWcgPSBhd2FpdCB3cmFwcGVyLmdldFRhZ0J5SWQoa2V5QXJnKTsKICAgICAgICBpZiAoZGlzdF90c19leHBvcnRzMTYuc3RyaW5naWZ5KHRhZz8ucGF5bG9hZCkgIT09IGRpc3RfdHNfZXhwb3J0czE2LnN0cmluZ2lmeShwYXlsb2FkQXJnKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlc3VsdHMucHVzaCh3cmFwcGVyKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH0KICAvKioKICAgKiBGaW5kcyB0aGUgZmlyc3QgY29ubmVjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgdGFnLgogICAqIEBzZXJ2ZXItb25seQogICAqLwogIGFzeW5jIGZpbmRUYXJnZXRDb25uZWN0aW9uQnlUYWcoa2V5QXJnLCBwYXlsb2FkQXJnKSB7CiAgICBjb25zdCBhbGxSZXN1bHRzID0gYXdhaXQgdGhpcy5maW5kQWxsVGFyZ2V0Q29ubmVjdGlvbnNCeVRhZyhrZXlBcmcsIHBheWxvYWRBcmcpOwogICAgcmV0dXJuIGFsbFJlc3VsdHNbMF07CiAgfQp9OwoKLy8gdHNfd2ViL3BsdWdpbnMudHMKaW5pdF9kaXN0X3RzMzAoKTsKaW5pdF9kaXN0X3RzMTkoKTsKaW5pdF9kaXN0X3RzMigpOwp2YXIgaHRtbDcgPSBiMjsKdmFyIGNzczIgPSBpOwp2YXIgY3NzTWFuYWdlcjIgPSBjc3NNYW5hZ2VyOwp2YXIgY3VzdG9tRWxlbWVudDIgPSBjdXN0b21FbGVtZW50Owp2YXIgcHJvcGVydHkgPSBuNTsKdmFyIHN0YXRlID0gcjU7CnZhciBEZWVzRWxlbWVudDIgPSBEZWVzRWxlbWVudDsKCi8vIHRzX3dlYi9zZXJ2aWNlcy9hcGkuc2VydmljZS50cwp2YXIgQXBpU2VydmljZSA9IGNsYXNzIHsKICBiYXNlVXJsOwogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5iYXNlVXJsID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArICIvdHlwZWRyZXF1ZXN0IjsKICB9CiAgLyoqCiAgICogTWFrZSBhIHR5cGVkIHJlcXVlc3QgdG8gdGhlIGJhY2tlbmQKICAgKi8KICBhc3luYyByZXF1ZXN0KG1ldGhvZCwgcmVxdWVzdERhdGEpIHsKICAgIGNvbnN0IHR5cGVkUmVxdWVzdCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxOS5UeXBlZFJlcXVlc3QodGhpcy5iYXNlVXJsLCBtZXRob2QpOwogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0eXBlZFJlcXVlc3QuZmlyZShyZXF1ZXN0RGF0YSk7CiAgICByZXR1cm4gcmVzcG9uc2U7CiAgfQogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAvLyBTMyBBUEkgTWV0aG9kcwogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBhc3luYyBsaXN0QnVja2V0cygpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdCgibGlzdEJ1Y2tldHMiLCB7fSk7CiAgICByZXR1cm4gcmVzdWx0LmJ1Y2tldHM7CiAgfQogIGFzeW5jIGNyZWF0ZUJ1Y2tldChidWNrZXROYW1lKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QoCiAgICAgICJjcmVhdGVCdWNrZXQiLAogICAgICB7IGJ1Y2tldE5hbWUgfQogICAgKTsKICAgIHJldHVybiByZXN1bHQuc3VjY2VzczsKICB9CiAgYXN5bmMgZGVsZXRlQnVja2V0KGJ1Y2tldE5hbWUpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdCgKICAgICAgImRlbGV0ZUJ1Y2tldCIsCiAgICAgIHsgYnVja2V0TmFtZSB9CiAgICApOwogICAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOwogIH0KICBhc3luYyBsaXN0T2JqZWN0cyhidWNrZXROYW1lLCBwcmVmaXg0LCBkZWxpbWl0ZXIpIHsKICAgIHJldHVybiB0aGlzLnJlcXVlc3QoImxpc3RPYmplY3RzIiwgeyBidWNrZXROYW1lLCBwcmVmaXg6IHByZWZpeDQsIGRlbGltaXRlciB9KTsKICB9CiAgYXN5bmMgZ2V0T2JqZWN0KGJ1Y2tldE5hbWUsIGtleTIpIHsKICAgIHJldHVybiB0aGlzLnJlcXVlc3QoImdldE9iamVjdCIsIHsgYnVja2V0TmFtZSwga2V5OiBrZXkyIH0pOwogIH0KICBhc3luYyBnZXRPYmplY3RNZXRhZGF0YShidWNrZXROYW1lLCBrZXkyKSB7CiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCJnZXRPYmplY3RNZXRhZGF0YSIsIHsgYnVja2V0TmFtZSwga2V5OiBrZXkyIH0pOwogIH0KICBhc3luYyBwdXRPYmplY3QoYnVja2V0TmFtZSwga2V5MiwgY29udGVudDMsIGNvbnRlbnRUeXBlKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QoInB1dE9iamVjdCIsIHsgYnVja2V0TmFtZSwga2V5OiBrZXkyLCBjb250ZW50OiBjb250ZW50MywgY29udGVudFR5cGUgfSk7CiAgICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3M7CiAgfQogIGFzeW5jIGRlbGV0ZU9iamVjdChidWNrZXROYW1lLCBrZXkyKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QoImRlbGV0ZU9iamVjdCIsIHsgYnVja2V0TmFtZSwga2V5OiBrZXkyIH0pOwogICAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOwogIH0KICBhc3luYyBkZWxldGVQcmVmaXgoYnVja2V0TmFtZSwgcHJlZml4NCkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KCJkZWxldGVQcmVmaXgiLCB7IGJ1Y2tldE5hbWUsIHByZWZpeDogcHJlZml4NCB9KTsKICAgIHJldHVybiByZXN1bHQuc3VjY2VzczsKICB9CiAgYXN5bmMgZ2V0T2JqZWN0VXJsKGJ1Y2tldE5hbWUsIGtleTIpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdCgiZ2V0T2JqZWN0VXJsIiwgeyBidWNrZXROYW1lLCBrZXk6IGtleTIgfSk7CiAgICByZXR1cm4gcmVzdWx0LnVybDsKICB9CiAgYXN5bmMgY29weU9iamVjdChzb3VyY2VCdWNrZXQsIHNvdXJjZUtleSwgZGVzdEJ1Y2tldCwgZGVzdEtleSkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KCJjb3B5T2JqZWN0IiwgeyBzb3VyY2VCdWNrZXQsIHNvdXJjZUtleSwgZGVzdEJ1Y2tldCwgZGVzdEtleSB9KTsKICAgIHJldHVybiByZXN1bHQuc3VjY2VzczsKICB9CiAgYXN5bmMgbW92ZU9iamVjdChidWNrZXROYW1lLCBzb3VyY2VLZXksIGRlc3RLZXkpIHsKICAgIHJldHVybiB0aGlzLnJlcXVlc3QoIm1vdmVPYmplY3QiLCB7IGJ1Y2tldE5hbWUsIHNvdXJjZUtleSwgZGVzdEtleSB9KTsKICB9CiAgYXN5bmMgbW92ZVByZWZpeChidWNrZXROYW1lLCBzb3VyY2VQcmVmaXgsIGRlc3RQcmVmaXgpIHsKICAgIHJldHVybiB0aGlzLnJlcXVlc3QoIm1vdmVQcmVmaXgiLCB7IGJ1Y2tldE5hbWUsIHNvdXJjZVByZWZpeCwgZGVzdFByZWZpeCB9KTsKICB9CiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8vIE1vbmdvREIgQVBJIE1ldGhvZHMKICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgYXN5bmMgbGlzdERhdGFiYXNlcygpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdCgKICAgICAgImxpc3REYXRhYmFzZXMiLAogICAgICB7fQogICAgKTsKICAgIHJldHVybiByZXN1bHQuZGF0YWJhc2VzOwogIH0KICBhc3luYyBjcmVhdGVEYXRhYmFzZShkYXRhYmFzZU5hbWUpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdCgKICAgICAgImNyZWF0ZURhdGFiYXNlIiwKICAgICAgeyBkYXRhYmFzZU5hbWUgfQogICAgKTsKICAgIHJldHVybiByZXN1bHQuc3VjY2VzczsKICB9CiAgYXN5bmMgZHJvcERhdGFiYXNlKGRhdGFiYXNlTmFtZSkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KAogICAgICAiZHJvcERhdGFiYXNlIiwKICAgICAgeyBkYXRhYmFzZU5hbWUgfQogICAgKTsKICAgIHJldHVybiByZXN1bHQuc3VjY2VzczsKICB9CiAgYXN5bmMgbGlzdENvbGxlY3Rpb25zKGRhdGFiYXNlTmFtZSkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KCJsaXN0Q29sbGVjdGlvbnMiLCB7IGRhdGFiYXNlTmFtZSB9KTsKICAgIHJldHVybiByZXN1bHQuY29sbGVjdGlvbnM7CiAgfQogIGFzeW5jIGNyZWF0ZUNvbGxlY3Rpb24oZGF0YWJhc2VOYW1lLCBjb2xsZWN0aW9uTmFtZSkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KCJjcmVhdGVDb2xsZWN0aW9uIiwgeyBkYXRhYmFzZU5hbWUsIGNvbGxlY3Rpb25OYW1lIH0pOwogICAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOwogIH0KICBhc3luYyBkcm9wQ29sbGVjdGlvbihkYXRhYmFzZU5hbWUsIGNvbGxlY3Rpb25OYW1lKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QoImRyb3BDb2xsZWN0aW9uIiwgeyBkYXRhYmFzZU5hbWUsIGNvbGxlY3Rpb25OYW1lIH0pOwogICAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOwogIH0KICBhc3luYyBmaW5kRG9jdW1lbnRzKGRhdGFiYXNlTmFtZSwgY29sbGVjdGlvbk5hbWUsIG9wdGlvbnMpIHsKICAgIHJldHVybiB0aGlzLnJlcXVlc3QoImZpbmREb2N1bWVudHMiLCB7CiAgICAgIGRhdGFiYXNlTmFtZSwKICAgICAgY29sbGVjdGlvbk5hbWUsCiAgICAgIC4uLm9wdGlvbnMKICAgIH0pOwogIH0KICBhc3luYyBnZXREb2N1bWVudChkYXRhYmFzZU5hbWUsIGNvbGxlY3Rpb25OYW1lLCBkb2N1bWVudElkKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QoImdldERvY3VtZW50IiwgeyBkYXRhYmFzZU5hbWUsIGNvbGxlY3Rpb25OYW1lLCBkb2N1bWVudElkIH0pOwogICAgcmV0dXJuIHJlc3VsdC5kb2N1bWVudDsKICB9CiAgYXN5bmMgaW5zZXJ0RG9jdW1lbnQoZGF0YWJhc2VOYW1lLCBjb2xsZWN0aW9uTmFtZSwgZG9jdW1lbnQ0KSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QoImluc2VydERvY3VtZW50IiwgeyBkYXRhYmFzZU5hbWUsIGNvbGxlY3Rpb25OYW1lLCBkb2N1bWVudDogZG9jdW1lbnQ0IH0pOwogICAgcmV0dXJuIHJlc3VsdC5pbnNlcnRlZElkOwogIH0KICBhc3luYyB1cGRhdGVEb2N1bWVudChkYXRhYmFzZU5hbWUsIGNvbGxlY3Rpb25OYW1lLCBkb2N1bWVudElkLCB1cGRhdGUpIHsKICAgIHJldHVybiB0aGlzLnJlcXVlc3QoInVwZGF0ZURvY3VtZW50IiwgewogICAgICBkYXRhYmFzZU5hbWUsCiAgICAgIGNvbGxlY3Rpb25OYW1lLAogICAgICBkb2N1bWVudElkLAogICAgICB1cGRhdGUKICAgIH0pOwogIH0KICBhc3luYyBkZWxldGVEb2N1bWVudChkYXRhYmFzZU5hbWUsIGNvbGxlY3Rpb25OYW1lLCBkb2N1bWVudElkKSB7CiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCJkZWxldGVEb2N1bWVudCIsIHsgZGF0YWJhc2VOYW1lLCBjb2xsZWN0aW9uTmFtZSwgZG9jdW1lbnRJZCB9KTsKICB9CiAgYXN5bmMgcnVuQWdncmVnYXRpb24oZGF0YWJhc2VOYW1lLCBjb2xsZWN0aW9uTmFtZSwgcGlwZWxpbmUpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdCgicnVuQWdncmVnYXRpb24iLCB7IGRhdGFiYXNlTmFtZSwgY29sbGVjdGlvbk5hbWUsIHBpcGVsaW5lIH0pOwogICAgcmV0dXJuIHJlc3VsdC5yZXN1bHRzOwogIH0KICBhc3luYyBsaXN0SW5kZXhlcyhkYXRhYmFzZU5hbWUsIGNvbGxlY3Rpb25OYW1lKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3QoImxpc3RJbmRleGVzIiwgeyBkYXRhYmFzZU5hbWUsIGNvbGxlY3Rpb25OYW1lIH0pOwogICAgcmV0dXJuIHJlc3VsdC5pbmRleGVzOwogIH0KICBhc3luYyBjcmVhdGVJbmRleChkYXRhYmFzZU5hbWUsIGNvbGxlY3Rpb25OYW1lLCBrZXlzMiwgb3B0aW9ucykgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KCJjcmVhdGVJbmRleCIsIHsgZGF0YWJhc2VOYW1lLCBjb2xsZWN0aW9uTmFtZSwga2V5czoga2V5czIsIG9wdGlvbnMgfSk7CiAgICByZXR1cm4gcmVzdWx0LmluZGV4TmFtZTsKICB9CiAgYXN5bmMgZHJvcEluZGV4KGRhdGFiYXNlTmFtZSwgY29sbGVjdGlvbk5hbWUsIGluZGV4TmFtZSkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KCJkcm9wSW5kZXgiLCB7IGRhdGFiYXNlTmFtZSwgY29sbGVjdGlvbk5hbWUsIGluZGV4TmFtZSB9KTsKICAgIHJldHVybiByZXN1bHQuc3VjY2VzczsKICB9CiAgYXN5bmMgZ2V0Q29sbGVjdGlvblN0YXRzKGRhdGFiYXNlTmFtZSwgY29sbGVjdGlvbk5hbWUpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdCgiZ2V0Q29sbGVjdGlvblN0YXRzIiwgeyBkYXRhYmFzZU5hbWUsIGNvbGxlY3Rpb25OYW1lIH0pOwogICAgcmV0dXJuIHJlc3VsdC5zdGF0czsKICB9CiAgYXN5bmMgZ2V0U2VydmVyU3RhdHVzKCkgewogICAgcmV0dXJuIHRoaXMucmVxdWVzdCgiZ2V0U2VydmVyU3RhdHVzIiwge30pOwogIH0KICBhc3luYyBnZXREYXRhYmFzZVN0YXRzKGRhdGFiYXNlTmFtZSkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KCJnZXREYXRhYmFzZVN0YXRzIiwgeyBkYXRhYmFzZU5hbWUgfSk7CiAgICByZXR1cm4gcmVzdWx0LnN0YXRzOwogIH0KfTsKCi8vIHRzX3dlYi9zZXJ2aWNlcy9jaGFuZ2VzdHJlYW0uc2VydmljZS50cwp2YXIgQ2hhbmdlU3RyZWFtU2VydmljZSA9IGNsYXNzIF9DaGFuZ2VTdHJlYW1TZXJ2aWNlIHsKICB0eXBlZFNvY2tldCA9IG51bGw7CiAgaXNDb25uZWN0ZWQgPSBmYWxzZTsKICBpc0Nvbm5lY3RpbmcgPSBmYWxzZTsKICBjb25uZWN0UHJvbWlzZSA9IG51bGw7CiAgc3Vic2NyaXB0aW9ucyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgLy8gQnVmZmVyIGFjdGl2aXR5IGV2ZW50cyBzbyB0aGV5IHN1cnZpdmUgdGFiIHN3aXRjaGVzCiAgYWN0aXZpdHlCdWZmZXIgPSBbXTsKICBzdGF0aWMgQUNUSVZJVFlfQlVGRkVSX1NJWkUgPSA1MDA7CiAgLy8gUnhKUyBTdWJqZWN0cyBmb3IgVUkgY29tcG9uZW50cwogIG1vbmdvQ2hhbmdlcyQgPSBuZXcgZGlzdF90c19leHBvcnRzMi5yeGpzLlN1YmplY3QoKTsKICBzdG9yYWdlQ2hhbmdlcyQgPSBuZXcgZGlzdF90c19leHBvcnRzMi5yeGpzLlN1YmplY3QoKTsKICBhY3Rpdml0eUV2ZW50cyQgPSBuZXcgZGlzdF90c19leHBvcnRzMi5yeGpzLlN1YmplY3QoKTsKICBjb25uZWN0aW9uU3RhdHVzJCA9IG5ldyBkaXN0X3RzX2V4cG9ydHMyLnJ4anMuUmVwbGF5U3ViamVjdCgxKTsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dCgiZGlzY29ubmVjdGVkIik7CiAgfQogIC8qKgogICAqIENvbm5lY3QgdG8gdGhlIFdlYlNvY2tldCBzZXJ2ZXIuCiAgICogSWYgYSBjb25uZWN0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdhaXRzIGZvciBpdCB0byBjb21wbGV0ZS4KICAgKi8KICBhc3luYyBjb25uZWN0KCkgewogICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMuaXNDb25uZWN0aW5nICYmIHRoaXMuY29ubmVjdFByb21pc2UpIHsKICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdFByb21pc2U7CiAgICB9CiAgICB0aGlzLmlzQ29ubmVjdGluZyA9IHRydWU7CiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoImNvbm5lY3RpbmciKTsKICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSAoYXN5bmMgKCkgPT4gewogICAgICB0cnkgewogICAgICAgIGNvbnN0IGNsaWVudFJvdXRlciA9IG5ldyBkaXN0X3RzX2V4cG9ydHMxOS5UeXBlZFJvdXRlcigpOwogICAgICAgIHRoaXMucmVnaXN0ZXJQdXNoSGFuZGxlcnMoY2xpZW50Um91dGVyKTsKICAgICAgICB0aGlzLnR5cGVkU29ja2V0ID0gYXdhaXQgZGlzdF90c19leHBvcnRzMzQuVHlwZWRTb2NrZXQuY3JlYXRlQ2xpZW50KAogICAgICAgICAgY2xpZW50Um91dGVyLAogICAgICAgICAgZGlzdF90c19leHBvcnRzMzQuVHlwZWRTb2NrZXQudXNlV2luZG93TG9jYXRpb25PcmlnaW5VcmwoKQogICAgICAgICk7CiAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IHRydWU7CiAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTsKICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoImNvbm5lY3RlZCIpOwogICAgICAgIGNvbnNvbGUubG9nKCJbQ2hhbmdlU3RyZWFtXSBXZWJTb2NrZXQgY29ubmVjdGVkIik7CiAgICAgICAgdGhpcy50eXBlZFNvY2tldC5zdGF0dXNTdWJqZWN0LnN1YnNjcmliZSgoc3RhdHVzKSA9PiB7CiAgICAgICAgICBpZiAoc3RhdHVzID09PSAiZGlzY29ubmVjdGVkIikgewogICAgICAgICAgICB0aGlzLmhhbmRsZURpc2Nvbm5lY3QoKTsKICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSAiY29ubmVjdGVkIikgewogICAgICAgICAgICB0aGlzLmhhbmRsZVJlY29ubmVjdCgpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9IG51bGw7CiAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KCJkaXNjb25uZWN0ZWQiKTsKICAgICAgICBjb25zb2xlLmVycm9yKCJbQ2hhbmdlU3RyZWFtXSBGYWlsZWQgdG8gY29ubmVjdDoiLCBlcnJvcik7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgIH0KICAgIH0pKCk7CiAgICByZXR1cm4gdGhpcy5jb25uZWN0UHJvbWlzZTsKICB9CiAgLyoqCiAgICogRW5zdXJlIGEgV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuCiAgICogSWYgbm90IGNvbm5lY3RlZCwgdHJpZ2dlcnMgY29ubmVjdCgpIGFuZCByZXR1cm5zIHdoZXRoZXIgY29ubmVjdGlvbiBzdWNjZWVkZWQuCiAgICovCiAgYXN5bmMgZW5zdXJlQ29ubmVjdGVkKCkgewogICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQgJiYgdGhpcy50eXBlZFNvY2tldCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHRyeSB7CiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpOwogICAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZDsKICAgIH0gY2F0Y2ggewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIC8qKgogICAqIERpc2Nvbm5lY3QgZnJvbSB0aGUgV2ViU29ja2V0IHNlcnZlcgogICAqLwogIGFzeW5jIGRpc2Nvbm5lY3QoKSB7CiAgICBpZiAoIXRoaXMudHlwZWRTb2NrZXQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdHJ5IHsKICAgICAgYXdhaXQgdGhpcy50eXBlZFNvY2tldC5zdG9wKCk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLmVycm9yKCJbQ2hhbmdlU3RyZWFtXSBFcnJvciBkdXJpbmcgZGlzY29ubmVjdDoiLCBlcnJvcik7CiAgICB9CiAgICB0aGlzLnR5cGVkU29ja2V0ID0gbnVsbDsKICAgIHRoaXMuaXNDb25uZWN0ZWQgPSBmYWxzZTsKICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSBudWxsOwogICAgdGhpcy5zdWJzY3JpcHRpb25zLmNsZWFyKCk7CiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoImRpc2Nvbm5lY3RlZCIpOwogICAgY29uc29sZS5sb2coIltDaGFuZ2VTdHJlYW1dIFdlYlNvY2tldCBkaXNjb25uZWN0ZWQiKTsKICB9CiAgLyoqCiAgICogUmVnaXN0ZXIgaGFuZGxlcnMgZm9yIHNlcnZlciBwdXNoIGV2ZW50cwogICAqLwogIHJlZ2lzdGVyUHVzaEhhbmRsZXJzKHJvdXRlcikgewogICAgcm91dGVyLmFkZFR5cGVkSGFuZGxlcigKICAgICAgbmV3IGRpc3RfdHNfZXhwb3J0czE5LlR5cGVkSGFuZGxlcigKICAgICAgICAicHVzaE1vbmdvQ2hhbmdlIiwKICAgICAgICBhc3luYyAoZGF0YSkgPT4gewogICAgICAgICAgdGhpcy5tb25nb0NoYW5nZXMkLm5leHQoZGF0YS5ldmVudCk7CiAgICAgICAgICByZXR1cm4geyByZWNlaXZlZDogdHJ1ZSB9OwogICAgICAgIH0KICAgICAgKQogICAgKTsKICAgIHJvdXRlci5hZGRUeXBlZEhhbmRsZXIoCiAgICAgIG5ldyBkaXN0X3RzX2V4cG9ydHMxOS5UeXBlZEhhbmRsZXIoCiAgICAgICAgInB1c2hTM0NoYW5nZSIsCiAgICAgICAgYXN5bmMgKGRhdGEpID0+IHsKICAgICAgICAgIHRoaXMuc3RvcmFnZUNoYW5nZXMkLm5leHQoZGF0YS5ldmVudCk7CiAgICAgICAgICByZXR1cm4geyByZWNlaXZlZDogdHJ1ZSB9OwogICAgICAgIH0KICAgICAgKQogICAgKTsKICAgIHJvdXRlci5hZGRUeXBlZEhhbmRsZXIoCiAgICAgIG5ldyBkaXN0X3RzX2V4cG9ydHMxOS5UeXBlZEhhbmRsZXIoCiAgICAgICAgInB1c2hBY3Rpdml0eUV2ZW50IiwKICAgICAgICBhc3luYyAoZGF0YSkgPT4gewogICAgICAgICAgdGhpcy5hY3Rpdml0eUJ1ZmZlci5wdXNoKGRhdGEuZXZlbnQpOwogICAgICAgICAgaWYgKHRoaXMuYWN0aXZpdHlCdWZmZXIubGVuZ3RoID4gX0NoYW5nZVN0cmVhbVNlcnZpY2UuQUNUSVZJVFlfQlVGRkVSX1NJWkUpIHsKICAgICAgICAgICAgdGhpcy5hY3Rpdml0eUJ1ZmZlciA9IHRoaXMuYWN0aXZpdHlCdWZmZXIuc2xpY2UoLV9DaGFuZ2VTdHJlYW1TZXJ2aWNlLkFDVElWSVRZX0JVRkZFUl9TSVpFKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuYWN0aXZpdHlFdmVudHMkLm5leHQoZGF0YS5ldmVudCk7CiAgICAgICAgICByZXR1cm4geyByZWNlaXZlZDogdHJ1ZSB9OwogICAgICAgIH0KICAgICAgKQogICAgKTsKICB9CiAgLyoqCiAgICogSGFuZGxlIFdlYlNvY2tldCBkaXNjb25uZWN0aW9uCiAgICovCiAgaGFuZGxlRGlzY29ubmVjdCgpIHsKICAgIHRoaXMuaXNDb25uZWN0ZWQgPSBmYWxzZTsKICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dCgiZGlzY29ubmVjdGVkIik7CiAgICBjb25zb2xlLmxvZygiW0NoYW5nZVN0cmVhbV0gV2ViU29ja2V0IGRpc2Nvbm5lY3RlZCwgd2FpdGluZyBmb3IgcmVjb25uZWN0Li4uIik7CiAgfQogIC8qKgogICAqIEhhbmRsZSBXZWJTb2NrZXQgcmVjb25uZWN0aW9uIC0gcmVzdG9yZSBhbGwgc3Vic2NyaXB0aW9ucwogICAqLwogIGFzeW5jIGhhbmRsZVJlY29ubmVjdCgpIHsKICAgIHRoaXMuaXNDb25uZWN0ZWQgPSB0cnVlOwogICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KCJjb25uZWN0ZWQiKTsKICAgIGNvbnNvbGUubG9nKCJbQ2hhbmdlU3RyZWFtXSBXZWJTb2NrZXQgcmVjb25uZWN0ZWQsIHJlc3RvcmluZyBzdWJzY3JpcHRpb25zLi4uIik7CiAgICBjb25zdCBzdWJzY3JpcHRpb25zVG9SZXN0b3JlID0gQXJyYXkuZnJvbSh0aGlzLnN1YnNjcmlwdGlvbnMudmFsdWVzKCkpOwogICAgdGhpcy5zdWJzY3JpcHRpb25zLmNsZWFyKCk7CiAgICBmb3IgKGNvbnN0IHN1YjIgb2Ygc3Vic2NyaXB0aW9uc1RvUmVzdG9yZSkgewogICAgICB0cnkgewogICAgICAgIGlmIChzdWIyLnR5cGUgPT09ICJtb25nbyIpIHsKICAgICAgICAgIGNvbnN0IFtkYXRhYmFzZSwgY29sbGVjdGlvbl0gPSBzdWIyLmtleS5zcGxpdCgiLyIpOwogICAgICAgICAgYXdhaXQgdGhpcy5zdWJzY3JpYmVUb0NvbGxlY3Rpb24oZGF0YWJhc2UsIGNvbGxlY3Rpb24pOwogICAgICAgIH0gZWxzZSBpZiAoc3ViMi50eXBlID09PSAiczMiKSB7CiAgICAgICAgICBjb25zdCBwYXJ0cyA9IHN1YjIua2V5LnNwbGl0KCIvIik7CiAgICAgICAgICBjb25zdCBidWNrZXQgPSBwYXJ0c1swXTsKICAgICAgICAgIGNvbnN0IHByZWZpeDQgPSBwYXJ0cy5zbGljZSgxKS5qb2luKCIvIikgfHwgdm9pZCAwOwogICAgICAgICAgYXdhaXQgdGhpcy5zdWJzY3JpYmVUb0J1Y2tldChidWNrZXQsIHByZWZpeDQpOwogICAgICAgIH0gZWxzZSBpZiAoc3ViMi50eXBlID09PSAiYWN0aXZpdHkiKSB7CiAgICAgICAgICBhd2FpdCB0aGlzLnN1YnNjcmliZVRvQWN0aXZpdHkoKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcihgW0NoYW5nZVN0cmVhbV0gRmFpbGVkIHRvIHJlc3RvcmUgc3Vic2NyaXB0aW9uICR7c3ViMi5rZXl9OmAsIGVycm9yKTsKICAgICAgfQogICAgfQogIH0KICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLy8gTW9uZ29EQiBTdWJzY3JpcHRpb25zCiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIC8qKgogICAqIFN1YnNjcmliZSB0byBjaGFuZ2VzIGluIGEgTW9uZ29EQiBjb2xsZWN0aW9uCiAgICovCiAgYXN5bmMgc3Vic2NyaWJlVG9Db2xsZWN0aW9uKGRhdGFiYXNlLCBjb2xsZWN0aW9uKSB7CiAgICBpZiAoIXRoaXMudHlwZWRTb2NrZXQgfHwgIXRoaXMuaXNDb25uZWN0ZWQpIHsKICAgICAgY29uc3QgY29ubmVjdGVkID0gYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0ZWQoKTsKICAgICAgaWYgKCFjb25uZWN0ZWQpIHsKICAgICAgICBjb25zb2xlLndhcm4oIltDaGFuZ2VTdHJlYW1dIE5vdCBjb25uZWN0ZWQsIGNhbm5vdCBzdWJzY3JpYmUiKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGtleTIgPSBgJHtkYXRhYmFzZX0vJHtjb2xsZWN0aW9ufWA7CiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zLmhhcyhgbW9uZ286JHtrZXkyfWApKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgdHJ5IHsKICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMudHlwZWRTb2NrZXQuY3JlYXRlVHlwZWRSZXF1ZXN0KCJzdWJzY3JpYmVNb25nbyIpOwogICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QuZmlyZSh7IGRhdGFiYXNlLCBjb2xsZWN0aW9uIH0pOwogICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcykgewogICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5zZXQoYG1vbmdvOiR7a2V5Mn1gLCB7CiAgICAgICAgICB0eXBlOiAibW9uZ28iLAogICAgICAgICAga2V5OiBrZXkyLAogICAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHJlc3BvbnNlLnN1YnNjcmlwdGlvbklkCiAgICAgICAgfSk7CiAgICAgICAgY29uc29sZS5sb2coYFtDaGFuZ2VTdHJlYW1dIFN1YnNjcmliZWQgdG8gTW9uZ29EQiAke2tleTJ9YCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcihgW0NoYW5nZVN0cmVhbV0gRmFpbGVkIHRvIHN1YnNjcmliZSB0byBNb25nb0RCICR7a2V5Mn06YCwgZXJyb3IpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIC8qKgogICAqIFVuc3Vic2NyaWJlIGZyb20gY2hhbmdlcyBpbiBhIE1vbmdvREIgY29sbGVjdGlvbgogICAqLwogIGFzeW5jIHVuc3Vic2NyaWJlRnJvbUNvbGxlY3Rpb24oZGF0YWJhc2UsIGNvbGxlY3Rpb24pIHsKICAgIGlmICghdGhpcy50eXBlZFNvY2tldCB8fCAhdGhpcy5pc0Nvbm5lY3RlZCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBjb25zdCBrZXkyID0gYCR7ZGF0YWJhc2V9LyR7Y29sbGVjdGlvbn1gOwogICAgY29uc3Qgc3ViS2V5ID0gYG1vbmdvOiR7a2V5Mn1gOwogICAgaWYgKCF0aGlzLnN1YnNjcmlwdGlvbnMuaGFzKHN1YktleSkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB0cnkgewogICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy50eXBlZFNvY2tldC5jcmVhdGVUeXBlZFJlcXVlc3QoInVuc3Vic2NyaWJlTW9uZ28iKTsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0LmZpcmUoeyBkYXRhYmFzZSwgY29sbGVjdGlvbiB9KTsKICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHsKICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZGVsZXRlKHN1YktleSk7CiAgICAgICAgY29uc29sZS5sb2coYFtDaGFuZ2VTdHJlYW1dIFVuc3Vic2NyaWJlZCBmcm9tIE1vbmdvREIgJHtrZXkyfWApOwogICAgICB9CiAgICAgIHJldHVybiByZXNwb25zZS5zdWNjZXNzOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcihgW0NoYW5nZVN0cmVhbV0gRmFpbGVkIHRvIHVuc3Vic2NyaWJlIGZyb20gTW9uZ29EQiAke2tleTJ9OmAsIGVycm9yKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICAvKioKICAgKiBDaGVjayBpZiBzdWJzY3JpYmVkIHRvIGEgTW9uZ29EQiBjb2xsZWN0aW9uCiAgICovCiAgaXNTdWJzY3JpYmVkVG9Db2xsZWN0aW9uKGRhdGFiYXNlLCBjb2xsZWN0aW9uKSB7CiAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25zLmhhcyhgbW9uZ286JHtkYXRhYmFzZX0vJHtjb2xsZWN0aW9ufWApOwogIH0KICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLy8gUzMgU3Vic2NyaXB0aW9ucwogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAvKioKICAgKiBTdWJzY3JpYmUgdG8gY2hhbmdlcyBpbiBhbiBTMyBidWNrZXQvcHJlZml4CiAgICovCiAgYXN5bmMgc3Vic2NyaWJlVG9CdWNrZXQoYnVja2V0LCBwcmVmaXg0KSB7CiAgICBpZiAoIXRoaXMudHlwZWRTb2NrZXQgfHwgIXRoaXMuaXNDb25uZWN0ZWQpIHsKICAgICAgY29uc3QgY29ubmVjdGVkID0gYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0ZWQoKTsKICAgICAgaWYgKCFjb25uZWN0ZWQpIHsKICAgICAgICBjb25zb2xlLndhcm4oIltDaGFuZ2VTdHJlYW1dIE5vdCBjb25uZWN0ZWQsIGNhbm5vdCBzdWJzY3JpYmUiKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGtleTIgPSBwcmVmaXg0ID8gYCR7YnVja2V0fS8ke3ByZWZpeDR9YCA6IGJ1Y2tldDsKICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbnMuaGFzKGBzMzoke2tleTJ9YCkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB0cnkgewogICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy50eXBlZFNvY2tldC5jcmVhdGVUeXBlZFJlcXVlc3QoInN1YnNjcmliZVMzIik7CiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5maXJlKHsgYnVja2V0LCBwcmVmaXg6IHByZWZpeDQgfSk7CiAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7CiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnNldChgczM6JHtrZXkyfWAsIHsKICAgICAgICAgIHR5cGU6ICJzMyIsCiAgICAgICAgICBrZXk6IGtleTIsCiAgICAgICAgICBzdWJzY3JpcHRpb25JZDogcmVzcG9uc2Uuc3Vic2NyaXB0aW9uSWQKICAgICAgICB9KTsKICAgICAgICBjb25zb2xlLmxvZyhgW0NoYW5nZVN0cmVhbV0gU3Vic2NyaWJlZCB0byBTMyAke2tleTJ9YCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcihgW0NoYW5nZVN0cmVhbV0gRmFpbGVkIHRvIHN1YnNjcmliZSB0byBTMyAke2tleTJ9OmAsIGVycm9yKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICAvKioKICAgKiBVbnN1YnNjcmliZSBmcm9tIGNoYW5nZXMgaW4gYW4gUzMgYnVja2V0L3ByZWZpeAogICAqLwogIGFzeW5jIHVuc3Vic2NyaWJlRnJvbUJ1Y2tldChidWNrZXQsIHByZWZpeDQpIHsKICAgIGlmICghdGhpcy50eXBlZFNvY2tldCB8fCAhdGhpcy5pc0Nvbm5lY3RlZCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBjb25zdCBrZXkyID0gcHJlZml4NCA/IGAke2J1Y2tldH0vJHtwcmVmaXg0fWAgOiBidWNrZXQ7CiAgICBjb25zdCBzdWJLZXkgPSBgczM6JHtrZXkyfWA7CiAgICBpZiAoIXRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoc3ViS2V5KSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHRyeSB7CiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnR5cGVkU29ja2V0LmNyZWF0ZVR5cGVkUmVxdWVzdCgidW5zdWJzY3JpYmVTMyIpOwogICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QuZmlyZSh7IGJ1Y2tldCwgcHJlZml4OiBwcmVmaXg0IH0pOwogICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcykgewogICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5kZWxldGUoc3ViS2V5KTsKICAgICAgICBjb25zb2xlLmxvZyhgW0NoYW5nZVN0cmVhbV0gVW5zdWJzY3JpYmVkIGZyb20gUzMgJHtrZXkyfWApOwogICAgICB9CiAgICAgIHJldHVybiByZXNwb25zZS5zdWNjZXNzOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcihgW0NoYW5nZVN0cmVhbV0gRmFpbGVkIHRvIHVuc3Vic2NyaWJlIGZyb20gUzMgJHtrZXkyfTpgLCBlcnJvcik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgLyoqCiAgICogQ2hlY2sgaWYgc3Vic2NyaWJlZCB0byBhbiBTMyBidWNrZXQvcHJlZml4CiAgICovCiAgaXNTdWJzY3JpYmVkVG9CdWNrZXQoYnVja2V0LCBwcmVmaXg0KSB7CiAgICBjb25zdCBrZXkyID0gcHJlZml4NCA/IGAke2J1Y2tldH0vJHtwcmVmaXg0fWAgOiBidWNrZXQ7CiAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25zLmhhcyhgczM6JHtrZXkyfWApOwogIH0KICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLy8gQWN0aXZpdHkgU3RyZWFtIFN1YnNjcmlwdGlvbnMKICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLyoqCiAgICogU3Vic2NyaWJlIHRvIHRoZSBhY3Rpdml0eSBzdHJlYW0KICAgKi8KICBhc3luYyBzdWJzY3JpYmVUb0FjdGl2aXR5KCkgewogICAgaWYgKCF0aGlzLnR5cGVkU29ja2V0IHx8ICF0aGlzLmlzQ29ubmVjdGVkKSB7CiAgICAgIGNvbnN0IGNvbm5lY3RlZCA9IGF3YWl0IHRoaXMuZW5zdXJlQ29ubmVjdGVkKCk7CiAgICAgIGlmICghY29ubmVjdGVkKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJbQ2hhbmdlU3RyZWFtXSBOb3QgY29ubmVjdGVkLCBjYW5ub3Qgc3Vic2NyaWJlIik7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zLmhhcygiYWN0aXZpdHk6YWN0aXZpdHkiKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHRyeSB7CiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnR5cGVkU29ja2V0LmNyZWF0ZVR5cGVkUmVxdWVzdCgic3Vic2NyaWJlQWN0aXZpdHkiKTsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0LmZpcmUoe30pOwogICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcykgewogICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5zZXQoImFjdGl2aXR5OmFjdGl2aXR5IiwgewogICAgICAgICAgdHlwZTogImFjdGl2aXR5IiwKICAgICAgICAgIGtleTogImFjdGl2aXR5IiwKICAgICAgICAgIHN1YnNjcmlwdGlvbklkOiByZXNwb25zZS5zdWJzY3JpcHRpb25JZAogICAgICAgIH0pOwogICAgICAgIGNvbnNvbGUubG9nKCJbQ2hhbmdlU3RyZWFtXSBTdWJzY3JpYmVkIHRvIGFjdGl2aXR5IHN0cmVhbSIpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIltDaGFuZ2VTdHJlYW1dIEZhaWxlZCB0byBzdWJzY3JpYmUgdG8gYWN0aXZpdHkgc3RyZWFtOiIsIGVycm9yKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICAvKioKICAgKiBVbnN1YnNjcmliZSBmcm9tIHRoZSBhY3Rpdml0eSBzdHJlYW0KICAgKi8KICBhc3luYyB1bnN1YnNjcmliZUZyb21BY3Rpdml0eSgpIHsKICAgIGlmICghdGhpcy50eXBlZFNvY2tldCB8fCAhdGhpcy5pc0Nvbm5lY3RlZCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoIXRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoImFjdGl2aXR5OmFjdGl2aXR5IikpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB0cnkgewogICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy50eXBlZFNvY2tldC5jcmVhdGVUeXBlZFJlcXVlc3QoInVuc3Vic2NyaWJlQWN0aXZpdHkiKTsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0LmZpcmUoe30pOwogICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcykgewogICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5kZWxldGUoImFjdGl2aXR5OmFjdGl2aXR5Iik7CiAgICAgICAgY29uc29sZS5sb2coIltDaGFuZ2VTdHJlYW1dIFVuc3Vic2NyaWJlZCBmcm9tIGFjdGl2aXR5IHN0cmVhbSIpOwogICAgICB9CiAgICAgIHJldHVybiByZXNwb25zZS5zdWNjZXNzOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcigiW0NoYW5nZVN0cmVhbV0gRmFpbGVkIHRvIHVuc3Vic2NyaWJlIGZyb20gYWN0aXZpdHkgc3RyZWFtOiIsIGVycm9yKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICAvKioKICAgKiBHZXQgcmVjZW50IGFjdGl2aXR5IGV2ZW50cwogICAqLwogIGFzeW5jIGdldFJlY2VudEFjdGl2aXR5KGxpbWl0ID0gMTAwKSB7CiAgICBpZiAoIXRoaXMudHlwZWRTb2NrZXQgfHwgIXRoaXMuaXNDb25uZWN0ZWQpIHsKICAgICAgY29uc3QgY29ubmVjdGVkID0gYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0ZWQoKTsKICAgICAgaWYgKCFjb25uZWN0ZWQpIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgIH0KICAgIHRyeSB7CiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnR5cGVkU29ja2V0LmNyZWF0ZVR5cGVkUmVxdWVzdCgiZ2V0UmVjZW50QWN0aXZpdHkiKTsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0LmZpcmUoeyBsaW1pdCB9KTsKICAgICAgcmV0dXJuIHJlc3BvbnNlLmV2ZW50cyB8fCBbXTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIltDaGFuZ2VTdHJlYW1dIEZhaWxlZCB0byBnZXQgcmVjZW50IGFjdGl2aXR5OiIsIGVycm9yKTsKICAgICAgcmV0dXJuIFtdOwogICAgfQogIH0KICAvKioKICAgKiBDaGVjayBpZiBzdWJzY3JpYmVkIHRvIGFjdGl2aXR5IHN0cmVhbQogICAqLwogIGlzU3Vic2NyaWJlZFRvQWN0aXZpdHkoKSB7CiAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25zLmhhcygiYWN0aXZpdHk6YWN0aXZpdHkiKTsKICB9CiAgLyoqCiAgICogR2V0IGJ1ZmZlcmVkIGFjdGl2aXR5IGV2ZW50cyAoY2FwdHVyZWQgcmVnYXJkbGVzcyBvZiBVSSBzdWJzY3JpYmVyKQogICAqLwogIGdldEJ1ZmZlcmVkQWN0aXZpdHkoKSB7CiAgICByZXR1cm4gWy4uLnRoaXMuYWN0aXZpdHlCdWZmZXJdOwogIH0KICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLy8gT2JzZXJ2YWJsZXMgZm9yIFVJIENvbXBvbmVudHMKICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgLyoqCiAgICogR2V0IE1vbmdvREIgY2hhbmdlcyBhcyBhbiBPYnNlcnZhYmxlCiAgICovCiAgZ2V0TW9uZ29DaGFuZ2VzKCkgewogICAgcmV0dXJuIHRoaXMubW9uZ29DaGFuZ2VzJC5hc09ic2VydmFibGUoKTsKICB9CiAgLyoqCiAgICogR2V0IFMzIGNoYW5nZXMgYXMgYW4gT2JzZXJ2YWJsZQogICAqLwogIGdldFN0b3JhZ2VDaGFuZ2VzKCkgewogICAgcmV0dXJuIHRoaXMuc3RvcmFnZUNoYW5nZXMkLmFzT2JzZXJ2YWJsZSgpOwogIH0KICAvKioKICAgKiBHZXQgYWN0aXZpdHkgZXZlbnRzIGFzIGFuIE9ic2VydmFibGUKICAgKi8KICBnZXRBY3Rpdml0eVN0cmVhbSgpIHsKICAgIHJldHVybiB0aGlzLmFjdGl2aXR5RXZlbnRzJC5hc09ic2VydmFibGUoKTsKICB9CiAgLyoqCiAgICogR2V0IGZpbHRlcmVkIE1vbmdvREIgY2hhbmdlcyBmb3IgYSBzcGVjaWZpYyBjb2xsZWN0aW9uCiAgICovCiAgZ2V0Q29sbGVjdGlvbkNoYW5nZXMoZGF0YWJhc2UsIGNvbGxlY3Rpb24pIHsKICAgIHJldHVybiB0aGlzLm1vbmdvQ2hhbmdlcyQucGlwZSgKICAgICAgZGlzdF90c19leHBvcnRzMi5yeGpzLm9wcy5maWx0ZXIoCiAgICAgICAgKGV2ZW50KSA9PiBldmVudC5kYXRhYmFzZSA9PT0gZGF0YWJhc2UgJiYgZXZlbnQuY29sbGVjdGlvbiA9PT0gY29sbGVjdGlvbgogICAgICApCiAgICApOwogIH0KICAvKioKICAgKiBHZXQgZmlsdGVyZWQgUzMgY2hhbmdlcyBmb3IgYSBzcGVjaWZpYyBidWNrZXQvcHJlZml4CiAgICovCiAgZ2V0QnVja2V0Q2hhbmdlcyhidWNrZXQsIHByZWZpeDQpIHsKICAgIHJldHVybiB0aGlzLnN0b3JhZ2VDaGFuZ2VzJC5waXBlKAogICAgICBkaXN0X3RzX2V4cG9ydHMyLnJ4anMub3BzLmZpbHRlcigoZXZlbnQpID0+IHsKICAgICAgICBpZiAoZXZlbnQuYnVja2V0ICE9PSBidWNrZXQpIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAocHJlZml4NCAmJiAhZXZlbnQua2V5LnN0YXJ0c1dpdGgocHJlZml4NCkpIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSkKICAgICk7CiAgfQp9OwoKLy8gdHNfd2ViL3NlcnZpY2VzL2luZGV4LnRzCnZhciBhcGlTZXJ2aWNlID0gbmV3IEFwaVNlcnZpY2UoKTsKdmFyIGNoYW5nZVN0cmVhbVNlcnZpY2UgPSBuZXcgQ2hhbmdlU3RyZWFtU2VydmljZSgpOwoKLy8gdHNfd2ViL3N0eWxlcy90aGVtZS50cwppbml0X2Rpc3RfdHMzMCgpOwp2YXIgdGhlbWVTdHlsZXMgPSBpYAogIDpob3N0IHsKICAgIC8qIEJhY2tncm91bmQgY29sb3JzICovCiAgICAtLXRzdmlldy1iZy1wcmltYXJ5OiAjMWExYTFhOwogICAgLS10c3ZpZXctYmctc2Vjb25kYXJ5OiAjMWUxZTFlOwogICAgLS10c3ZpZXctYmctdGVydGlhcnk6ICMxNDE0MTQ7CiAgICAtLXRzdmlldy1iZy1vdmVybGF5OiByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAtLXRzdmlldy1iZy1vdmVybGF5LWRhcms6IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIC0tdHN2aWV3LWJnLWRpYWxvZy1vdmVybGF5OiByZ2JhKDAsIDAsIDAsIDAuNyk7CgogICAgLyogQm9yZGVyIGNvbG9ycyAqLwogICAgLS10c3ZpZXctYm9yZGVyLXByaW1hcnk6ICMzMzM7CiAgICAtLXRzdmlldy1ib3JkZXItc2Vjb25kYXJ5OiAjNDQ0OwogICAgLS10c3ZpZXctYm9yZGVyLXRlcnRpYXJ5OiAjMmEyYTNlOwoKICAgIC8qIFRleHQgY29sb3JzICovCiAgICAtLXRzdmlldy10ZXh0LXByaW1hcnk6ICNmZmY7CiAgICAtLXRzdmlldy10ZXh0LXNlY29uZGFyeTogI2UwZTBlMDsKICAgIC0tdHN2aWV3LXRleHQtdGVydGlhcnk6ICNjY2M7CiAgICAtLXRzdmlldy10ZXh0LW11dGVkOiAjODg4OwogICAgLS10c3ZpZXctdGV4dC1kaW06ICM2NjY7CgogICAgLyogSW50ZXJhY3RpdmUgc3RhdGVzICovCiAgICAtLXRzdmlldy1ob3Zlci1iZzogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKICAgIC0tdHN2aWV3LWhvdmVyLWJnLXN0cm9uZzogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgLS10c3ZpZXctc2VsZWN0ZWQtYmc6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICAtLXRzdmlldy1hY3RpdmUtYmc6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKCiAgICAvKiBBY2NlbnQgY29sb3JzICovCiAgICAtLXRzdmlldy1hY2NlbnQtZm9sZGVyOiAjZmJiZjI0OwoKICAgIC8qIERhbmdlci9kZXN0cnVjdGl2ZSBhY3Rpb25zICovCiAgICAtLXRzdmlldy1kYW5nZXI6ICNlZjQ0NDQ7CiAgICAtLXRzdmlldy1kYW5nZXItdGV4dDogI2Y4NzE3MTsKICAgIC0tdHN2aWV3LWRhbmdlci1iZzogcmdiYSgyMzksIDY4LCA2OCwgMC4yKTsKICAgIC0tdHN2aWV3LWRhbmdlci1iZy1ob3ZlcjogcmdiYSgyMzksIDY4LCA2OCwgMC4zKTsKCiAgICAvKiBTdWNjZXNzIHN0YXRlcyAqLwogICAgLS10c3ZpZXctc3VjY2VzczogIzIyYzU1ZTsKICAgIC0tdHN2aWV3LXN1Y2Nlc3MtYmc6IHJnYmEoMzQsIDE5NywgOTQsIDAuMik7CgogICAgLyogQm9yZGVyIHJhZGl1cyAqLwogICAgLS10c3ZpZXctcmFkaXVzLXNtOiA0cHg7CiAgICAtLXRzdmlldy1yYWRpdXMtbWQ6IDZweDsKICAgIC0tdHN2aWV3LXJhZGl1cy1sZzogOHB4OwogICAgLS10c3ZpZXctcmFkaXVzLXhsOiAxMnB4OwoKICAgIC8qIFNwYWNpbmcgKi8KICAgIC0tdHN2aWV3LXNwYWNpbmcteHM6IDRweDsKICAgIC0tdHN2aWV3LXNwYWNpbmctc206IDhweDsKICAgIC0tdHN2aWV3LXNwYWNpbmctbWQ6IDEycHg7CiAgICAtLXRzdmlldy1zcGFjaW5nLWxnOiAxNnB4OwogICAgLS10c3ZpZXctc3BhY2luZy14bDogMjRweDsKICB9CmA7CgovLyB0c193ZWIvYWRhcHRlcnMvczMtZGF0YS1wcm92aWRlci50cwp2YXIgVHN2aWV3UzNEYXRhUHJvdmlkZXIgPSBjbGFzcyB7CiAgYXN5bmMgbGlzdE9iamVjdHMoYnVja2V0LCBwcmVmaXg0LCBkZWxpbWl0ZXIpIHsKICAgIHJldHVybiBhcGlTZXJ2aWNlLmxpc3RPYmplY3RzKGJ1Y2tldCwgcHJlZml4NCwgZGVsaW1pdGVyKTsKICB9CiAgYXN5bmMgZ2V0T2JqZWN0KGJ1Y2tldCwga2V5MikgewogICAgcmV0dXJuIGFwaVNlcnZpY2UuZ2V0T2JqZWN0KGJ1Y2tldCwga2V5Mik7CiAgfQogIGFzeW5jIHB1dE9iamVjdChidWNrZXQsIGtleTIsIGJhc2U2NENvbnRlbnQsIGNvbnRlbnRUeXBlKSB7CiAgICByZXR1cm4gYXBpU2VydmljZS5wdXRPYmplY3QoYnVja2V0LCBrZXkyLCBiYXNlNjRDb250ZW50LCBjb250ZW50VHlwZSk7CiAgfQogIGFzeW5jIGRlbGV0ZU9iamVjdChidWNrZXQsIGtleTIpIHsKICAgIHJldHVybiBhcGlTZXJ2aWNlLmRlbGV0ZU9iamVjdChidWNrZXQsIGtleTIpOwogIH0KICBhc3luYyBkZWxldGVQcmVmaXgoYnVja2V0LCBwcmVmaXg0KSB7CiAgICByZXR1cm4gYXBpU2VydmljZS5kZWxldGVQcmVmaXgoYnVja2V0LCBwcmVmaXg0KTsKICB9CiAgYXN5bmMgZ2V0T2JqZWN0VXJsKGJ1Y2tldCwga2V5MikgewogICAgcmV0dXJuIGFwaVNlcnZpY2UuZ2V0T2JqZWN0VXJsKGJ1Y2tldCwga2V5Mik7CiAgfQogIGFzeW5jIG1vdmVPYmplY3QoYnVja2V0LCBzb3VyY2VLZXksIGRlc3RLZXkpIHsKICAgIHJldHVybiBhcGlTZXJ2aWNlLm1vdmVPYmplY3QoYnVja2V0LCBzb3VyY2VLZXksIGRlc3RLZXkpOwogIH0KICBhc3luYyBtb3ZlUHJlZml4KGJ1Y2tldCwgc291cmNlUHJlZml4LCBkZXN0UHJlZml4KSB7CiAgICByZXR1cm4gYXBpU2VydmljZS5tb3ZlUHJlZml4KGJ1Y2tldCwgc291cmNlUHJlZml4LCBkZXN0UHJlZml4KTsKICB9Cn07CnZhciBzM0RhdGFQcm92aWRlciA9IG5ldyBUc3ZpZXdTM0RhdGFQcm92aWRlcigpOwoKLy8gdHNfd2ViL2VsZW1lbnRzL3Rzdmlldy1hcHAudHMKdmFyIF9pc1Jlc2l6aW5nU2lkZWJhcl9kZWMsIF9zaWRlYmFyV2lkdGhfZGVjLCBfczNDcmVhdGVEaWFsb2dOYW1lX2RlYywgX3MzQ3JlYXRlRGlhbG9nQnVja2V0X2RlYywgX3MzQ3JlYXRlRGlhbG9nVHlwZV9kZWMsIF9zaG93UzNDcmVhdGVEaWFsb2dfZGVjLCBfc2hvd1N5c3RlbURhdGFiYXNlc19kZWMsIF9uZXdEYXRhYmFzZU5hbWVfZGVjLCBfc2hvd0NyZWF0ZURhdGFiYXNlRGlhbG9nX2RlYywgX25ld0NvbGxlY3Rpb25OYW1lX2RlYywgX3Nob3dDcmVhdGVDb2xsZWN0aW9uRGlhbG9nX2RlYywgX25ld0J1Y2tldE5hbWVfZGVjLCBfc2hvd0NyZWF0ZUJ1Y2tldERpYWxvZ19kZWMsIF9kYXRhYmFzZXNfZGVjLCBfYnVja2V0c19kZWMsIF9zZWxlY3RlZENvbGxlY3Rpb25fZGVjLCBfc2VsZWN0ZWREYXRhYmFzZV9kZWMsIF9zZWxlY3RlZEJ1Y2tldF9kZWMsIF92aWV3TW9kZV9kZWMsIF9hNCwgX1Rzdmlld0FwcF9kZWNvcmF0b3JzLCBfaW5pdCwgX3ZpZXdNb2RlLCBfc2VsZWN0ZWRCdWNrZXQsIF9zZWxlY3RlZERhdGFiYXNlLCBfc2VsZWN0ZWRDb2xsZWN0aW9uLCBfYnVja2V0cywgX2RhdGFiYXNlcywgX3Nob3dDcmVhdGVCdWNrZXREaWFsb2csIF9uZXdCdWNrZXROYW1lLCBfc2hvd0NyZWF0ZUNvbGxlY3Rpb25EaWFsb2csIF9uZXdDb2xsZWN0aW9uTmFtZSwgX3Nob3dDcmVhdGVEYXRhYmFzZURpYWxvZywgX25ld0RhdGFiYXNlTmFtZSwgX3Nob3dTeXN0ZW1EYXRhYmFzZXMsIF9zaG93UzNDcmVhdGVEaWFsb2csIF9zM0NyZWF0ZURpYWxvZ1R5cGUsIF9zM0NyZWF0ZURpYWxvZ0J1Y2tldCwgX3MzQ3JlYXRlRGlhbG9nTmFtZSwgX3NpZGViYXJXaWR0aCwgX2lzUmVzaXppbmdTaWRlYmFyOwp2YXIgeyBodG1sOiBodG1sOCwgY3NzOiBjc3MzLCBjc3NNYW5hZ2VyOiBjc3NNYW5hZ2VyMywgY3VzdG9tRWxlbWVudDogY3VzdG9tRWxlbWVudDMsIHN0YXRlOiBzdGF0ZTIsIERlZXNFbGVtZW50OiBEZWVzRWxlbWVudDMgfSA9IHBsdWdpbnNfZXhwb3J0czU7CnZhciB7IERlZXNDb250ZXh0bWVudTogRGVlc0NvbnRleHRtZW51MiB9ID0gZGlzdF90c193ZWJfZXhwb3J0czI7Cl9Uc3ZpZXdBcHBfZGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50MygidHN2aWV3LWFwcCIpXTsKdmFyIFRzdmlld0FwcCA9IGNsYXNzIGV4dGVuZHMgKF9hNCA9IERlZXNFbGVtZW50MywgX3ZpZXdNb2RlX2RlYyA9IFtzdGF0ZTIoKV0sIF9zZWxlY3RlZEJ1Y2tldF9kZWMgPSBbc3RhdGUyKCldLCBfc2VsZWN0ZWREYXRhYmFzZV9kZWMgPSBbc3RhdGUyKCldLCBfc2VsZWN0ZWRDb2xsZWN0aW9uX2RlYyA9IFtzdGF0ZTIoKV0sIF9idWNrZXRzX2RlYyA9IFtzdGF0ZTIoKV0sIF9kYXRhYmFzZXNfZGVjID0gW3N0YXRlMigpXSwgX3Nob3dDcmVhdGVCdWNrZXREaWFsb2dfZGVjID0gW3N0YXRlMigpXSwgX25ld0J1Y2tldE5hbWVfZGVjID0gW3N0YXRlMigpXSwgX3Nob3dDcmVhdGVDb2xsZWN0aW9uRGlhbG9nX2RlYyA9IFtzdGF0ZTIoKV0sIF9uZXdDb2xsZWN0aW9uTmFtZV9kZWMgPSBbc3RhdGUyKCldLCBfc2hvd0NyZWF0ZURhdGFiYXNlRGlhbG9nX2RlYyA9IFtzdGF0ZTIoKV0sIF9uZXdEYXRhYmFzZU5hbWVfZGVjID0gW3N0YXRlMigpXSwgX3Nob3dTeXN0ZW1EYXRhYmFzZXNfZGVjID0gW3N0YXRlMigpXSwgX3Nob3dTM0NyZWF0ZURpYWxvZ19kZWMgPSBbc3RhdGUyKCldLCBfczNDcmVhdGVEaWFsb2dUeXBlX2RlYyA9IFtzdGF0ZTIoKV0sIF9zM0NyZWF0ZURpYWxvZ0J1Y2tldF9kZWMgPSBbc3RhdGUyKCldLCBfczNDcmVhdGVEaWFsb2dOYW1lX2RlYyA9IFtzdGF0ZTIoKV0sIF9zaWRlYmFyV2lkdGhfZGVjID0gW3N0YXRlMigpXSwgX2lzUmVzaXppbmdTaWRlYmFyX2RlYyA9IFtzdGF0ZTIoKV0sIF9hNCkgewogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfdmlld01vZGUsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA4LCB0aGlzLCAiczMiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAxMSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3NlbGVjdGVkQnVja2V0LCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMTIsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAxNSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3NlbGVjdGVkRGF0YWJhc2UsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAxNiwgdGhpcywgIiIpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDE5LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfc2VsZWN0ZWRDb2xsZWN0aW9uLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMjAsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAyMywgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2J1Y2tldHMsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAyNCwgdGhpcywgW10pKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDI3LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfZGF0YWJhc2VzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMjgsIHRoaXMsIFtdKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAzMSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3Nob3dDcmVhdGVCdWNrZXREaWFsb2csIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCAzMiwgdGhpcywgZmFsc2UpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDM1LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfbmV3QnVja2V0TmFtZSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDM2LCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgMzksIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9zaG93Q3JlYXRlQ29sbGVjdGlvbkRpYWxvZywgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDQwLCB0aGlzLCBmYWxzZSkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNDMsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9uZXdDb2xsZWN0aW9uTmFtZSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDQ0LCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNDcsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9zaG93Q3JlYXRlRGF0YWJhc2VEaWFsb2csIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA0OCwgdGhpcywgZmFsc2UpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDUxLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfbmV3RGF0YWJhc2VOYW1lLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNTIsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA1NSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3Nob3dTeXN0ZW1EYXRhYmFzZXMsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA1NiwgdGhpcywgZmFsc2UpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDU5LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfc2hvd1MzQ3JlYXRlRGlhbG9nLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNjAsIHRoaXMsIGZhbHNlKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA2MywgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3MzQ3JlYXRlRGlhbG9nVHlwZSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDY0LCB0aGlzLCAiZm9sZGVyIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNjcsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9zM0NyZWF0ZURpYWxvZ0J1Y2tldCwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDY4LCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNzEsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9zM0NyZWF0ZURpYWxvZ05hbWUsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0LCA3MiwgdGhpcywgIiIpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDc1LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfc2lkZWJhcldpZHRoLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNzYsIHRoaXMsIDI0MCkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgNzksIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9pc1Jlc2l6aW5nU2lkZWJhciwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDgwLCB0aGlzLCBmYWxzZSkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdCwgODMsIHRoaXMpOwogICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiU1lTVEVNX0RBVEFCQVNFUyIsIFsiYWRtaW4iLCAiY29uZmlnIiwgImxvY2FsIl0pOwogICAgX19wdWJsaWNGaWVsZCh0aGlzLCAic3RhcnRTaWRlYmFyUmVzaXplIiwgKGUxMSkgPT4gewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy5pc1Jlc2l6aW5nU2lkZWJhciA9IHRydWU7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIHRoaXMuaGFuZGxlU2lkZWJhclJlc2l6ZSk7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCB0aGlzLmVuZFNpZGViYXJSZXNpemUpOwogICAgfSk7CiAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJoYW5kbGVTaWRlYmFyUmVzaXplIiwgKGUxMSkgPT4gewogICAgICBpZiAoIXRoaXMuaXNSZXNpemluZ1NpZGViYXIpIHJldHVybjsKICAgICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1pbihNYXRoLm1heChlMTEuY2xpZW50WCwgMTUwKSwgNTAwKTsKICAgICAgdGhpcy5zaWRlYmFyV2lkdGggPSBuZXdXaWR0aDsKICAgIH0pOwogICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiZW5kU2lkZWJhclJlc2l6ZSIsICgpID0+IHsKICAgICAgdGhpcy5pc1Jlc2l6aW5nU2lkZWJhciA9IGZhbHNlOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCB0aGlzLmhhbmRsZVNpZGViYXJSZXNpemUpOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5lbmRTaWRlYmFyUmVzaXplKTsKICAgIH0pOwogIH0KICBnZXQgdmlzaWJsZURhdGFiYXNlcygpIHsKICAgIGlmICh0aGlzLnNob3dTeXN0ZW1EYXRhYmFzZXMpIHsKICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VzOwogICAgfQogICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VzLmZpbHRlcigoZGIpID0+ICF0aGlzLlNZU1RFTV9EQVRBQkFTRVMuaW5jbHVkZXMoZGIubmFtZSkpOwogIH0KICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICB0aGlzLmluaXRpYWxpemVDaGFuZ2VTdHJlYW0oKTsKICAgIGF3YWl0IHRoaXMubG9hZERhdGEoKTsKICB9CiAgYXN5bmMgaW5pdGlhbGl6ZUNoYW5nZVN0cmVhbSgpIHsKICAgIHRyeSB7CiAgICAgIGF3YWl0IGNoYW5nZVN0cmVhbVNlcnZpY2UuY29ubmVjdCgpOwogICAgICBjb25zb2xlLmxvZygiW1Rzdmlld0FwcF0gQ2hhbmdlU3RyZWFtIGNvbm5lY3RlZCIpOwogICAgICBhd2FpdCBjaGFuZ2VTdHJlYW1TZXJ2aWNlLnN1YnNjcmliZVRvQWN0aXZpdHkoKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUud2FybigiW1Rzdmlld0FwcF0gRmFpbGVkIHRvIGNvbm5lY3QgdG8gQ2hhbmdlU3RyZWFtOiIsIGVycm9yKTsKICAgIH0KICB9CiAgYXN5bmMgbG9hZERhdGEoKSB7CiAgICB0cnkgewogICAgICB0aGlzLmJ1Y2tldHMgPSBhd2FpdCBhcGlTZXJ2aWNlLmxpc3RCdWNrZXRzKCk7CiAgICAgIHRoaXMuZGF0YWJhc2VzID0gYXdhaXQgYXBpU2VydmljZS5saXN0RGF0YWJhc2VzKCk7CiAgICAgIGlmICh0aGlzLnZpZXdNb2RlID09PSAiczMiICYmIHRoaXMuYnVja2V0cy5sZW5ndGggPiAwICYmICF0aGlzLnNlbGVjdGVkQnVja2V0KSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZEJ1Y2tldCA9IHRoaXMuYnVja2V0c1swXTsKICAgICAgfQogICAgICBpZiAodGhpcy52aWV3TW9kZSA9PT0gIm1vbmdvIiAmJiB0aGlzLmRhdGFiYXNlcy5sZW5ndGggPiAwICYmICF0aGlzLnNlbGVjdGVkRGF0YWJhc2UpIHsKICAgICAgICB0aGlzLnNlbGVjdGVkRGF0YWJhc2UgPSB0aGlzLmRhdGFiYXNlc1swXS5uYW1lOwogICAgICB9CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgbG9hZGluZyBkYXRhOiIsIGVycik7CiAgICB9CiAgfQogIHNldFZpZXdNb2RlKG1vZGUpIHsKICAgIHRoaXMudmlld01vZGUgPSBtb2RlOwogIH0KICBzZWxlY3RCdWNrZXQoYnVja2V0KSB7CiAgICB0aGlzLnNlbGVjdGVkQnVja2V0ID0gYnVja2V0OwogIH0KICBzZWxlY3REYXRhYmFzZShkYikgewogICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRhYmFzZSA9PT0gZGIpIHsKICAgICAgdGhpcy5zZWxlY3RlZERhdGFiYXNlID0gIiI7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnNlbGVjdGVkRGF0YWJhc2UgPSBkYjsKICAgICAgdGhpcy5zZWxlY3RlZENvbGxlY3Rpb24gPSAiIjsKICAgIH0KICB9CiAgc2VsZWN0Q29sbGVjdGlvbihjb2xsZWN0aW9uKSB7CiAgICB0aGlzLnNlbGVjdGVkQ29sbGVjdGlvbiA9IGNvbGxlY3Rpb247CiAgfQogIGFzeW5jIGNyZWF0ZUJ1Y2tldCgpIHsKICAgIGlmICghdGhpcy5uZXdCdWNrZXROYW1lLnRyaW0oKSkgcmV0dXJuOwogICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGFwaVNlcnZpY2UuY3JlYXRlQnVja2V0KHRoaXMubmV3QnVja2V0TmFtZS50cmltKCkpOwogICAgaWYgKHN1Y2Nlc3MpIHsKICAgICAgdGhpcy5idWNrZXRzID0gWy4uLnRoaXMuYnVja2V0cywgdGhpcy5uZXdCdWNrZXROYW1lLnRyaW0oKV07CiAgICAgIHRoaXMubmV3QnVja2V0TmFtZSA9ICIiOwogICAgICB0aGlzLnNob3dDcmVhdGVCdWNrZXREaWFsb2cgPSBmYWxzZTsKICAgIH0KICB9CiAgYXN5bmMgY3JlYXRlQ29sbGVjdGlvbigpIHsKICAgIGlmICghdGhpcy5uZXdDb2xsZWN0aW9uTmFtZS50cmltKCkgfHwgIXRoaXMuc2VsZWN0ZWREYXRhYmFzZSkgcmV0dXJuOwogICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGFwaVNlcnZpY2UuY3JlYXRlQ29sbGVjdGlvbih0aGlzLnNlbGVjdGVkRGF0YWJhc2UsIHRoaXMubmV3Q29sbGVjdGlvbk5hbWUudHJpbSgpKTsKICAgIGlmIChzdWNjZXNzKSB7CiAgICAgIHRoaXMubmV3Q29sbGVjdGlvbk5hbWUgPSAiIjsKICAgICAgdGhpcy5zaG93Q3JlYXRlQ29sbGVjdGlvbkRpYWxvZyA9IGZhbHNlOwogICAgfQogIH0KICBhc3luYyBjcmVhdGVEYXRhYmFzZSgpIHsKICAgIGlmICghdGhpcy5uZXdEYXRhYmFzZU5hbWUudHJpbSgpKSByZXR1cm47CiAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgYXBpU2VydmljZS5jcmVhdGVEYXRhYmFzZSh0aGlzLm5ld0RhdGFiYXNlTmFtZS50cmltKCkpOwogICAgaWYgKHN1Y2Nlc3MpIHsKICAgICAgdGhpcy5kYXRhYmFzZXMgPSBbLi4udGhpcy5kYXRhYmFzZXMsIHsgbmFtZTogdGhpcy5uZXdEYXRhYmFzZU5hbWUudHJpbSgpIH1dOwogICAgICB0aGlzLm5ld0RhdGFiYXNlTmFtZSA9ICIiOwogICAgICB0aGlzLnNob3dDcmVhdGVEYXRhYmFzZURpYWxvZyA9IGZhbHNlOwogICAgfQogIH0KICBhc3luYyBkZWxldGVCdWNrZXQoYnVja2V0LCBlMTEpIHsKICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgIGlmICghY29uZmlybShgRGVsZXRlIGJ1Y2tldCAiJHtidWNrZXR9Ij8gVGhpcyB3aWxsIGRlbGV0ZSBhbGwgb2JqZWN0cyBpbiB0aGUgYnVja2V0LmApKSByZXR1cm47CiAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgYXBpU2VydmljZS5kZWxldGVCdWNrZXQoYnVja2V0KTsKICAgIGlmIChzdWNjZXNzKSB7CiAgICAgIHRoaXMuYnVja2V0cyA9IHRoaXMuYnVja2V0cy5maWx0ZXIoKGI2KSA9PiBiNiAhPT0gYnVja2V0KTsKICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRCdWNrZXQgPT09IGJ1Y2tldCkgewogICAgICAgIHRoaXMuc2VsZWN0ZWRCdWNrZXQgPSB0aGlzLmJ1Y2tldHNbMF0gfHwgIiI7CiAgICAgIH0KICAgIH0KICB9CiAgYXN5bmMgZGVsZXRlRGF0YWJhc2UoZGJOYW1lLCBlMTEpIHsKICAgIGUxMS5zdG9wUHJvcGFnYXRpb24oKTsKICAgIGlmICghY29uZmlybShgRGVsZXRlIGRhdGFiYXNlICIke2RiTmFtZX0iPyBUaGlzIHdpbGwgZGVsZXRlIGFsbCBjb2xsZWN0aW9ucyBhbmQgZG9jdW1lbnRzLmApKSByZXR1cm47CiAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgYXBpU2VydmljZS5kcm9wRGF0YWJhc2UoZGJOYW1lKTsKICAgIGlmIChzdWNjZXNzKSB7CiAgICAgIHRoaXMuZGF0YWJhc2VzID0gdGhpcy5kYXRhYmFzZXMuZmlsdGVyKChkNikgPT4gZDYubmFtZSAhPT0gZGJOYW1lKTsKICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRhYmFzZSA9PT0gZGJOYW1lKSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGFiYXNlID0gdGhpcy5kYXRhYmFzZXNbMF0/Lm5hbWUgfHwgIiI7CiAgICAgICAgdGhpcy5zZWxlY3RlZENvbGxlY3Rpb24gPSAiIjsKICAgICAgfQogICAgfQogIH0KICBhc3luYyBkZWxldGVDb2xsZWN0aW9uKGRiTmFtZSwgY29sbGVjdGlvbk5hbWUpIHsKICAgIGlmICghY29uZmlybShgRGVsZXRlIGNvbGxlY3Rpb24gIiR7Y29sbGVjdGlvbk5hbWV9Ij8gVGhpcyB3aWxsIGRlbGV0ZSBhbGwgZG9jdW1lbnRzLmApKSByZXR1cm47CiAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgYXBpU2VydmljZS5kcm9wQ29sbGVjdGlvbihkYk5hbWUsIGNvbGxlY3Rpb25OYW1lKTsKICAgIGlmIChzdWNjZXNzKSB7CiAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ29sbGVjdGlvbiA9PT0gY29sbGVjdGlvbk5hbWUpIHsKICAgICAgICB0aGlzLnNlbGVjdGVkQ29sbGVjdGlvbiA9ICIiOwogICAgICB9CiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpOwogICAgfQogIH0KICBoYW5kbGVCdWNrZXRDb250ZXh0TWVudShldmVudCwgYnVja2V0KSB7CiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgRGVlc0NvbnRleHRtZW51Mi5vcGVuQ29udGV4dE1lbnVXaXRoT3B0aW9ucyhldmVudCwgWwogICAgICB7CiAgICAgICAgbmFtZTogIlZpZXcgQ29udGVudHMiLAogICAgICAgIGljb25OYW1lOiAibHVjaWRlOmZvbGRlck9wZW4iLAogICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgdGhpcy5zZWxlY3RCdWNrZXQoYnVja2V0KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICB7CiAgICAgICAgbmFtZTogIk5ldyBGb2xkZXIiLAogICAgICAgIGljb25OYW1lOiAibHVjaWRlOmZvbGRlclBsdXMiLAogICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gdGhpcy5vcGVuUzNDcmVhdGVEaWFsb2coYnVja2V0LCAiZm9sZGVyIikKICAgICAgfSwKICAgICAgewogICAgICAgIG5hbWU6ICJOZXcgRmlsZSIsCiAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6ZmlsZVBsdXMiLAogICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gdGhpcy5vcGVuUzNDcmVhdGVEaWFsb2coYnVja2V0LCAiZmlsZSIpCiAgICAgIH0sCiAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICB7CiAgICAgICAgbmFtZTogIkRlbGV0ZSBCdWNrZXQiLAogICAgICAgIGljb25OYW1lOiAibHVjaWRlOnRyYXNoMiIsCiAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICBpZiAoY29uZmlybShgRGVsZXRlIGJ1Y2tldCAiJHtidWNrZXR9Ij8gVGhpcyB3aWxsIGRlbGV0ZSBhbGwgb2JqZWN0cyBpbiB0aGUgYnVja2V0LmApKSB7CiAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBhcGlTZXJ2aWNlLmRlbGV0ZUJ1Y2tldChidWNrZXQpOwogICAgICAgICAgICBpZiAoc3VjY2VzcykgewogICAgICAgICAgICAgIHRoaXMuYnVja2V0cyA9IHRoaXMuYnVja2V0cy5maWx0ZXIoKGI2KSA9PiBiNiAhPT0gYnVja2V0KTsKICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEJ1Y2tldCA9PT0gYnVja2V0KSB7CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQnVja2V0ID0gdGhpcy5idWNrZXRzWzBdIHx8ICIiOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgXSk7CiAgfQogIG9wZW5TM0NyZWF0ZURpYWxvZyhidWNrZXQsIHR5cGU1KSB7CiAgICB0aGlzLnMzQ3JlYXRlRGlhbG9nQnVja2V0ID0gYnVja2V0OwogICAgdGhpcy5zM0NyZWF0ZURpYWxvZ1R5cGUgPSB0eXBlNTsKICAgIHRoaXMuczNDcmVhdGVEaWFsb2dOYW1lID0gIiI7CiAgICB0aGlzLnNob3dTM0NyZWF0ZURpYWxvZyA9IHRydWU7CiAgfQogIGdldENvbnRlbnRUeXBlKGV4dCkgewogICAgY29uc3QgY29udGVudFR5cGVzID0gewogICAgICBqc29uOiAiYXBwbGljYXRpb24vanNvbiIsCiAgICAgIHR4dDogInRleHQvcGxhaW4iLAogICAgICBodG1sOiAidGV4dC9odG1sIiwKICAgICAgY3NzOiAidGV4dC9jc3MiLAogICAgICBqczogImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiLAogICAgICB0czogInRleHQvdHlwZXNjcmlwdCIsCiAgICAgIG1kOiAidGV4dC9tYXJrZG93biIsCiAgICAgIHhtbDogImFwcGxpY2F0aW9uL3htbCIsCiAgICAgIHlhbWw6ICJ0ZXh0L3lhbWwiLAogICAgICB5bWw6ICJ0ZXh0L3lhbWwiLAogICAgICBjc3Y6ICJ0ZXh0L2NzdiIKICAgIH07CiAgICByZXR1cm4gY29udGVudFR5cGVzW2V4dF0gfHwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7CiAgfQogIGdldERlZmF1bHRDb250ZW50KGV4dCkgewogICAgY29uc3QgZGVmYXVsdHMgPSB7CiAgICAgIGpzb246ICJ7XG4gIFxufSIsCiAgICAgIGh0bWw6ICI8IURPQ1RZUEUgaHRtbD5cbjxodG1sPlxuPGhlYWQ+XG4gIDx0aXRsZT48L3RpdGxlPlxuPC9oZWFkPlxuPGJvZHk+XG4gIFxuPC9ib2R5PlxuPC9odG1sPiIsCiAgICAgIG1kOiAiIyBUaXRsZVxuXG4iLAogICAgICB0eHQ6ICIiCiAgICB9OwogICAgcmV0dXJuIGRlZmF1bHRzW2V4dF0gfHwgIiI7CiAgfQogIGFzeW5jIGhhbmRsZVMzQ3JlYXRlKCkgewogICAgaWYgKCF0aGlzLnMzQ3JlYXRlRGlhbG9nTmFtZS50cmltKCkpIHJldHVybjsKICAgIGNvbnN0IG5hbWUgPSB0aGlzLnMzQ3JlYXRlRGlhbG9nTmFtZS50cmltKCk7CiAgICBsZXQgcGF0aDI7CiAgICBpZiAodGhpcy5zM0NyZWF0ZURpYWxvZ1R5cGUgPT09ICJmb2xkZXIiKSB7CiAgICAgIHBhdGgyID0gbmFtZSArICIvLmtlZXAiOwogICAgfSBlbHNlIHsKICAgICAgcGF0aDIgPSBuYW1lOwogICAgfQogICAgY29uc3QgZXh0ID0gbmFtZS5zcGxpdCgiLiIpLnBvcCgpPy50b0xvd2VyQ2FzZSgpIHx8ICIiOwogICAgY29uc3QgY29udGVudFR5cGUgPSB0aGlzLnMzQ3JlYXRlRGlhbG9nVHlwZSA9PT0gImZpbGUiID8gdGhpcy5nZXRDb250ZW50VHlwZShleHQpIDogImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7CiAgICBjb25zdCBjb250ZW50MyA9IHRoaXMuczNDcmVhdGVEaWFsb2dUeXBlID09PSAiZmlsZSIgPyB0aGlzLmdldERlZmF1bHRDb250ZW50KGV4dCkgOiAiIjsKICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBhcGlTZXJ2aWNlLnB1dE9iamVjdCgKICAgICAgdGhpcy5zM0NyZWF0ZURpYWxvZ0J1Y2tldCwKICAgICAgcGF0aDIsCiAgICAgIGJ0b2EoY29udGVudDMpLAogICAgICBjb250ZW50VHlwZQogICAgKTsKICAgIGlmIChzdWNjZXNzKSB7CiAgICAgIHRoaXMuc2hvd1MzQ3JlYXRlRGlhbG9nID0gZmFsc2U7CiAgICAgIHRoaXMuc2VsZWN0ZWRCdWNrZXQgPSB0aGlzLnMzQ3JlYXRlRGlhbG9nQnVja2V0OwogICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTsKICAgIH0KICB9CiAgaGFuZGxlRGF0YWJhc2VDb250ZXh0TWVudShldmVudCwgZGJOYW1lKSB7CiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgRGVlc0NvbnRleHRtZW51Mi5vcGVuQ29udGV4dE1lbnVXaXRoT3B0aW9ucyhldmVudCwgWwogICAgICB7CiAgICAgICAgbmFtZTogIk5ldyBDb2xsZWN0aW9uIiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpmb2xkZXJQbHVzIiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRhYmFzZSA9IGRiTmFtZTsKICAgICAgICAgIHRoaXMuc2hvd0NyZWF0ZUNvbGxlY3Rpb25EaWFsb2cgPSB0cnVlOwogICAgICAgIH0KICAgICAgfSwKICAgICAgeyBkaXZpZGVyOiB0cnVlIH0sCiAgICAgIHsKICAgICAgICBuYW1lOiAiRGVsZXRlIERhdGFiYXNlIiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTp0cmFzaDIiLAogICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgaWYgKGNvbmZpcm0oYERlbGV0ZSBkYXRhYmFzZSAiJHtkYk5hbWV9Ij8gVGhpcyB3aWxsIGRlbGV0ZSBhbGwgY29sbGVjdGlvbnMgYW5kIGRvY3VtZW50cy5gKSkgewogICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgYXBpU2VydmljZS5kcm9wRGF0YWJhc2UoZGJOYW1lKTsKICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKICAgICAgICAgICAgICB0aGlzLmRhdGFiYXNlcyA9IHRoaXMuZGF0YWJhc2VzLmZpbHRlcigoZDYpID0+IGQ2Lm5hbWUgIT09IGRiTmFtZSk7CiAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRhYmFzZSA9PT0gZGJOYW1lKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0YWJhc2UgPSB0aGlzLmRhdGFiYXNlc1swXT8ubmFtZSB8fCAiIjsKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2xsZWN0aW9uID0gIiI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICBdKTsKICB9CiAgaGFuZGxlU2lkZWJhckNvbnRleHRNZW51KGV2ZW50KSB7CiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgRGVlc0NvbnRleHRtZW51Mi5vcGVuQ29udGV4dE1lbnVXaXRoT3B0aW9ucyhldmVudCwgWwogICAgICB7CiAgICAgICAgbmFtZTogdGhpcy5zaG93U3lzdGVtRGF0YWJhc2VzID8gIkhpZGUgU3lzdGVtIERhdGFiYXNlcyIgOiAiU2hvdyBTeXN0ZW0gRGF0YWJhc2VzIiwKICAgICAgICBpY29uTmFtZTogdGhpcy5zaG93U3lzdGVtRGF0YWJhc2VzID8gImx1Y2lkZTpleWVPZmYiIDogImx1Y2lkZTpleWUiLAogICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgdGhpcy5zaG93U3lzdGVtRGF0YWJhc2VzID0gIXRoaXMuc2hvd1N5c3RlbURhdGFiYXNlczsKICAgICAgICB9CiAgICAgIH0KICAgIF0pOwogIH0KICByZW5kZXIoKSB7CiAgICByZXR1cm4gaHRtbDhgCiAgICAgIDxkaXYgY2xhc3M9ImFwcC1jb250YWluZXIiPgogICAgICAgIDxoZWFkZXIgY2xhc3M9ImFwcC1oZWFkZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0iYXBwLXRpdGxlIj4KICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yIDNoNmE0IDQgMCAwIDEgNCA0djE0YTMgMyAwIDAgMC0zLTNIMnoiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMjIgM2gtNmE0IDQgMCAwIDAtNCA0djE0YTMgMyAwIDAgMSAzLTNoN3oiPjwvcGF0aD4KICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgIFRzVmlldwogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPG5hdiBjbGFzcz0ibmF2LXRhYnMiPgogICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgY2xhc3M9Im5hdi10YWIgJHt0aGlzLnZpZXdNb2RlID09PSAiczMiID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5zZXRWaWV3TW9kZSgiczMiKX0KICAgICAgICAgICAgPgogICAgICAgICAgICAgIFMzIFN0b3JhZ2UKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICBjbGFzcz0ibmF2LXRhYiAke3RoaXMudmlld01vZGUgPT09ICJtb25nbyIgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNldFZpZXdNb2RlKCJtb25nbyIpfQogICAgICAgICAgICA+CiAgICAgICAgICAgICAgTW9uZ29EQgogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgIGNsYXNzPSJuYXYtdGFiICR7dGhpcy52aWV3TW9kZSA9PT0gImFjdGl2aXR5IiA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuc2V0Vmlld01vZGUoImFjdGl2aXR5Iil9CiAgICAgICAgICAgID4KICAgICAgICAgICAgICBBY3Rpdml0eQogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgIGNsYXNzPSJuYXYtdGFiICR7dGhpcy52aWV3TW9kZSA9PT0gInNldHRpbmdzIiA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuc2V0Vmlld01vZGUoInNldHRpbmdzIil9CiAgICAgICAgICAgID4KICAgICAgICAgICAgICBTZXR0aW5ncwogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDwvbmF2PgogICAgICAgIDwvaGVhZGVyPgoKICAgICAgICA8bWFpbiBjbGFzcz0iYXBwLW1haW4iIHN0eWxlPSItLXNpZGViYXItd2lkdGg6ICR7dGhpcy5zaWRlYmFyV2lkdGh9cHgiPgogICAgICAgICAgJHt0aGlzLnJlbmRlclNpZGViYXIoKX0KICAgICAgICAgIDxkaXYKICAgICAgICAgICAgY2xhc3M9InJlc2l6ZS1kaXZpZGVyICR7dGhpcy5pc1Jlc2l6aW5nU2lkZWJhciA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICBAbW91c2Vkb3duPSR7dGhpcy5zdGFydFNpZGViYXJSZXNpemV9CiAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICAke3RoaXMucmVuZGVyQ29udGVudCgpfQogICAgICAgIDwvbWFpbj4KICAgICAgPC9kaXY+CiAgICAgICR7dGhpcy5yZW5kZXJDcmVhdGVCdWNrZXREaWFsb2coKX0KICAgICAgJHt0aGlzLnJlbmRlckNyZWF0ZUNvbGxlY3Rpb25EaWFsb2coKX0KICAgICAgJHt0aGlzLnJlbmRlckNyZWF0ZURhdGFiYXNlRGlhbG9nKCl9CiAgICAgICR7dGhpcy5yZW5kZXJTM0NyZWF0ZURpYWxvZygpfQogICAgYDsKICB9CiAgcmVuZGVyQ3JlYXRlQnVja2V0RGlhbG9nKCkgewogICAgaWYgKCF0aGlzLnNob3dDcmVhdGVCdWNrZXREaWFsb2cpIHJldHVybiAiIjsKICAgIHJldHVybiBodG1sOGAKICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLW92ZXJsYXkiIEBjbGljaz0keygpID0+IHRoaXMuc2hvd0NyZWF0ZUJ1Y2tldERpYWxvZyA9IGZhbHNlfT4KICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ciIEBjbGljaz0keyhlMTEpID0+IGUxMS5zdG9wUHJvcGFnYXRpb24oKX0+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPkNyZWF0ZSBOZXcgQnVja2V0PC9kaXY+CiAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgdHlwZT0idGV4dCIKICAgICAgICAgICAgY2xhc3M9ImRpYWxvZy1pbnB1dCIKICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkJ1Y2tldCBuYW1lIgogICAgICAgICAgICAudmFsdWU9JHt0aGlzLm5ld0J1Y2tldE5hbWV9CiAgICAgICAgICAgIEBpbnB1dD0keyhlMTEpID0+IHRoaXMubmV3QnVja2V0TmFtZSA9IGUxMS50YXJnZXQudmFsdWV9CiAgICAgICAgICAgIEBrZXlkb3duPSR7KGUxMSkgPT4gZTExLmtleSA9PT0gIkVudGVyIiAmJiB0aGlzLmNyZWF0ZUJ1Y2tldCgpfQogICAgICAgICAgLz4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy1hY3Rpb25zIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGlhbG9nLWJ0biBkaWFsb2ctYnRuLWNhbmNlbCIgQGNsaWNrPSR7KCkgPT4gdGhpcy5zaG93Q3JlYXRlQnVja2V0RGlhbG9nID0gZmFsc2V9PgogICAgICAgICAgICAgIENhbmNlbAogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgIGNsYXNzPSJkaWFsb2ctYnRuIGRpYWxvZy1idG4tY3JlYXRlIgogICAgICAgICAgICAgID9kaXNhYmxlZD0keyF0aGlzLm5ld0J1Y2tldE5hbWUudHJpbSgpfQogICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuY3JlYXRlQnVja2V0KCl9CiAgICAgICAgICAgID4KICAgICAgICAgICAgICBDcmVhdGUKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICByZW5kZXJDcmVhdGVDb2xsZWN0aW9uRGlhbG9nKCkgewogICAgaWYgKCF0aGlzLnNob3dDcmVhdGVDb2xsZWN0aW9uRGlhbG9nKSByZXR1cm4gIiI7CiAgICByZXR1cm4gaHRtbDhgCiAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy1vdmVybGF5IiBAY2xpY2s9JHsoKSA9PiB0aGlzLnNob3dDcmVhdGVDb2xsZWN0aW9uRGlhbG9nID0gZmFsc2V9PgogICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZyIgQGNsaWNrPSR7KGUxMSkgPT4gZTExLnN0b3BQcm9wYWdhdGlvbigpfT4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+Q3JlYXRlIENvbGxlY3Rpb24gaW4gJHt0aGlzLnNlbGVjdGVkRGF0YWJhc2V9PC9kaXY+CiAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgdHlwZT0idGV4dCIKICAgICAgICAgICAgY2xhc3M9ImRpYWxvZy1pbnB1dCIKICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkNvbGxlY3Rpb24gbmFtZSIKICAgICAgICAgICAgLnZhbHVlPSR7dGhpcy5uZXdDb2xsZWN0aW9uTmFtZX0KICAgICAgICAgICAgQGlucHV0PSR7KGUxMSkgPT4gdGhpcy5uZXdDb2xsZWN0aW9uTmFtZSA9IGUxMS50YXJnZXQudmFsdWV9CiAgICAgICAgICAgIEBrZXlkb3duPSR7KGUxMSkgPT4gZTExLmtleSA9PT0gIkVudGVyIiAmJiB0aGlzLmNyZWF0ZUNvbGxlY3Rpb24oKX0KICAgICAgICAgIC8+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctYWN0aW9ucyI+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRpYWxvZy1idG4gZGlhbG9nLWJ0bi1jYW5jZWwiIEBjbGljaz0keygpID0+IHRoaXMuc2hvd0NyZWF0ZUNvbGxlY3Rpb25EaWFsb2cgPSBmYWxzZX0+CiAgICAgICAgICAgICAgQ2FuY2VsCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgY2xhc3M9ImRpYWxvZy1idG4gZGlhbG9nLWJ0bi1jcmVhdGUiCiAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7IXRoaXMubmV3Q29sbGVjdGlvbk5hbWUudHJpbSgpfQogICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuY3JlYXRlQ29sbGVjdGlvbigpfQogICAgICAgICAgICA+CiAgICAgICAgICAgICAgQ3JlYXRlCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICB9CiAgcmVuZGVyQ3JlYXRlRGF0YWJhc2VEaWFsb2coKSB7CiAgICBpZiAoIXRoaXMuc2hvd0NyZWF0ZURhdGFiYXNlRGlhbG9nKSByZXR1cm4gIiI7CiAgICByZXR1cm4gaHRtbDhgCiAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy1vdmVybGF5IiBAY2xpY2s9JHsoKSA9PiB0aGlzLnNob3dDcmVhdGVEYXRhYmFzZURpYWxvZyA9IGZhbHNlfT4KICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ciIEBjbGljaz0keyhlMTEpID0+IGUxMS5zdG9wUHJvcGFnYXRpb24oKX0+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPkNyZWF0ZSBOZXcgRGF0YWJhc2U8L2Rpdj4KICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICB0eXBlPSJ0ZXh0IgogICAgICAgICAgICBjbGFzcz0iZGlhbG9nLWlucHV0IgogICAgICAgICAgICBwbGFjZWhvbGRlcj0iRGF0YWJhc2UgbmFtZSIKICAgICAgICAgICAgLnZhbHVlPSR7dGhpcy5uZXdEYXRhYmFzZU5hbWV9CiAgICAgICAgICAgIEBpbnB1dD0keyhlMTEpID0+IHRoaXMubmV3RGF0YWJhc2VOYW1lID0gZTExLnRhcmdldC52YWx1ZX0KICAgICAgICAgICAgQGtleWRvd249JHsoZTExKSA9PiBlMTEua2V5ID09PSAiRW50ZXIiICYmIHRoaXMuY3JlYXRlRGF0YWJhc2UoKX0KICAgICAgICAgIC8+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctYWN0aW9ucyI+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRpYWxvZy1idG4gZGlhbG9nLWJ0bi1jYW5jZWwiIEBjbGljaz0keygpID0+IHRoaXMuc2hvd0NyZWF0ZURhdGFiYXNlRGlhbG9nID0gZmFsc2V9PgogICAgICAgICAgICAgIENhbmNlbAogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgIGNsYXNzPSJkaWFsb2ctYnRuIGRpYWxvZy1idG4tY3JlYXRlIgogICAgICAgICAgICAgID9kaXNhYmxlZD0keyF0aGlzLm5ld0RhdGFiYXNlTmFtZS50cmltKCl9CiAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5jcmVhdGVEYXRhYmFzZSgpfQogICAgICAgICAgICA+CiAgICAgICAgICAgICAgQ3JlYXRlCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICB9CiAgcmVuZGVyUzNDcmVhdGVEaWFsb2coKSB7CiAgICBpZiAoIXRoaXMuc2hvd1MzQ3JlYXRlRGlhbG9nKSByZXR1cm4gIiI7CiAgICBjb25zdCBpc0ZvbGRlciA9IHRoaXMuczNDcmVhdGVEaWFsb2dUeXBlID09PSAiZm9sZGVyIjsKICAgIGNvbnN0IHRpdGxlID0gaXNGb2xkZXIgPyAiQ3JlYXRlIE5ldyBGb2xkZXIiIDogIkNyZWF0ZSBOZXcgRmlsZSI7CiAgICBjb25zdCBwbGFjZWhvbGRlciA9IGlzRm9sZGVyID8gImZvbGRlci1uYW1lIG9yIHBhdGgvdG8vZm9sZGVyIiA6ICJmaWxlbmFtZS50eHQgb3IgcGF0aC90by9maWxlLnR4dCI7CiAgICByZXR1cm4gaHRtbDhgCiAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy1vdmVybGF5IiBAY2xpY2s9JHsoKSA9PiB0aGlzLnNob3dTM0NyZWF0ZURpYWxvZyA9IGZhbHNlfT4KICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ciIEBjbGljaz0keyhlMTEpID0+IGUxMS5zdG9wUHJvcGFnYXRpb24oKX0+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPiR7dGl0bGV9PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctbG9jYXRpb24iPgogICAgICAgICAgICBMb2NhdGlvbjogJHt0aGlzLnMzQ3JlYXRlRGlhbG9nQnVja2V0fS8KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGlucHV0CiAgICAgICAgICAgIHR5cGU9InRleHQiCiAgICAgICAgICAgIGNsYXNzPSJkaWFsb2ctaW5wdXQiCiAgICAgICAgICAgIHBsYWNlaG9sZGVyPSR7cGxhY2Vob2xkZXJ9CiAgICAgICAgICAgIC52YWx1ZT0ke3RoaXMuczNDcmVhdGVEaWFsb2dOYW1lfQogICAgICAgICAgICBAaW5wdXQ9JHsoZTExKSA9PiB0aGlzLnMzQ3JlYXRlRGlhbG9nTmFtZSA9IGUxMS50YXJnZXQudmFsdWV9CiAgICAgICAgICAgIEBrZXlkb3duPSR7KGUxMSkgPT4gZTExLmtleSA9PT0gIkVudGVyIiAmJiB0aGlzLmhhbmRsZVMzQ3JlYXRlKCl9CiAgICAgICAgICAvPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLWhpbnQiPgogICAgICAgICAgICBVc2UgIi8iIHRvIGNyZWF0ZSBuZXN0ZWQgJHtpc0ZvbGRlciA/ICJmb2xkZXJzIiA6ICJwYXRoIn0gKGUuZy4sICR7aXNGb2xkZXIgPyAicGFyZW50L2NoaWxkIiA6ICJmb2xkZXIvZmlsZS50eHQifSkKICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLWFjdGlvbnMiPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkaWFsb2ctYnRuIGRpYWxvZy1idG4tY2FuY2VsIiBAY2xpY2s9JHsoKSA9PiB0aGlzLnNob3dTM0NyZWF0ZURpYWxvZyA9IGZhbHNlfT4KICAgICAgICAgICAgICBDYW5jZWwKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICBjbGFzcz0iZGlhbG9nLWJ0biBkaWFsb2ctYnRuLWNyZWF0ZSIKICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHshdGhpcy5zM0NyZWF0ZURpYWxvZ05hbWUudHJpbSgpfQogICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuaGFuZGxlUzNDcmVhdGUoKX0KICAgICAgICAgICAgPgogICAgICAgICAgICAgIENyZWF0ZQogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgfQogIHJlbmRlclNpZGViYXIoKSB7CiAgICBpZiAodGhpcy52aWV3TW9kZSA9PT0gInMzIikgewogICAgICByZXR1cm4gaHRtbDhgCiAgICAgICAgPGFzaWRlIGNsYXNzPSJzaWRlYmFyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItaGVhZGVyIj5CdWNrZXRzPC9kaXY+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjcmVhdGUtYnRuIiBAY2xpY2s9JHsoKSA9PiB0aGlzLnNob3dDcmVhdGVCdWNrZXREaWFsb2cgPSB0cnVlfT4KICAgICAgICAgICAgPHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+CiAgICAgICAgICAgICAgPGxpbmUgeDE9IjEyIiB5MT0iNSIgeDI9IjEyIiB5Mj0iMTkiPjwvbGluZT4KICAgICAgICAgICAgICA8bGluZSB4MT0iNSIgeTE9IjEyIiB4Mj0iMTkiIHkyPSIxMiI+PC9saW5lPgogICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgTmV3IEJ1Y2tldAogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLWxpc3QiPgogICAgICAgICAgICAke3RoaXMuYnVja2V0cy5sZW5ndGggPT09IDAgPyBodG1sOGA8ZGl2IGNsYXNzPSJzaWRlYmFyLWl0ZW0iIHN0eWxlPSJjb2xvcjogIzY2NjsgY3Vyc29yOiBkZWZhdWx0OyI+Tm8gYnVja2V0cyBmb3VuZDwvZGl2PmAgOiB0aGlzLmJ1Y2tldHMubWFwKAogICAgICAgIChidWNrZXQpID0+IGh0bWw4YAogICAgICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzaWRlYmFyLWl0ZW0gJHtidWNrZXQgPT09IHRoaXMuc2VsZWN0ZWRCdWNrZXQgPyAic2VsZWN0ZWQiIDogIiJ9IgogICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5zZWxlY3RCdWNrZXQoYnVja2V0KX0KICAgICAgICAgICAgICAgICAgICAgIEBjb250ZXh0bWVudT0keyhlMTEpID0+IHRoaXMuaGFuZGxlQnVja2V0Q29udGV4dE1lbnUoZTExLCBidWNrZXQpfQogICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzaWRlYmFyLWl0ZW0tbmFtZSI+JHtidWNrZXR9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICBgCiAgICAgICl9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2FzaWRlPgogICAgICBgOwogICAgfQogICAgaWYgKHRoaXMudmlld01vZGUgPT09ICJtb25nbyIpIHsKICAgICAgcmV0dXJuIGh0bWw4YAogICAgICAgIDxhc2lkZSBjbGFzcz0ic2lkZWJhciIgQGNvbnRleHRtZW51PSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVTaWRlYmFyQ29udGV4dE1lbnUoZTExKX0+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLWhlYWRlciI+RGF0YWJhc2VzICYgQ29sbGVjdGlvbnM8L2Rpdj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNyZWF0ZS1idG4iIEBjbGljaz0keygpID0+IHRoaXMuc2hvd0NyZWF0ZURhdGFiYXNlRGlhbG9nID0gdHJ1ZX0+CiAgICAgICAgICAgIDxzdmcgd2lkdGg9IjE0IiBoZWlnaHQ9IjE0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPgogICAgICAgICAgICAgIDxsaW5lIHgxPSIxMiIgeTE9IjUiIHgyPSIxMiIgeTI9IjE5Ij48L2xpbmU+CiAgICAgICAgICAgICAgPGxpbmUgeDE9IjUiIHkxPSIxMiIgeDI9IjE5IiB5Mj0iMTIiPjwvbGluZT4KICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgIE5ldyBEYXRhYmFzZQogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLWxpc3QiPgogICAgICAgICAgICAke3RoaXMudmlzaWJsZURhdGFiYXNlcy5sZW5ndGggPT09IDAgPyBodG1sOGA8ZGl2IGNsYXNzPSJzaWRlYmFyLWl0ZW0iIHN0eWxlPSJjb2xvcjogIzY2NjsgY3Vyc29yOiBkZWZhdWx0OyI+Tm8gZGF0YWJhc2VzIGZvdW5kPC9kaXY+YCA6IHRoaXMudmlzaWJsZURhdGFiYXNlcy5tYXAoKGRiKSA9PiB0aGlzLnJlbmRlckRhdGFiYXNlR3JvdXAoZGIpKX0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvYXNpZGU+CiAgICAgIGA7CiAgICB9CiAgICBpZiAodGhpcy52aWV3TW9kZSA9PT0gImFjdGl2aXR5IikgewogICAgICByZXR1cm4gaHRtbDhgCiAgICAgICAgPGFzaWRlIGNsYXNzPSJzaWRlYmFyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItaGVhZGVyIj5BY3Rpdml0eSBTdHJlYW08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItbGlzdCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItaXRlbSIgc3R5bGU9ImNvbG9yOiAjODg4OyBmb250LXNpemU6IDEycHg7IGN1cnNvcjogZGVmYXVsdDsiPgogICAgICAgICAgICAgIFJlYWwtdGltZSBjaGFuZ2VzIGZyb20gTW9uZ29EQiBhbmQgUzMgYXBwZWFyIGhlcmUgYXV0b21hdGljYWxseS4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2FzaWRlPgogICAgICBgOwogICAgfQogICAgcmV0dXJuIGh0bWw4YAogICAgICA8YXNpZGUgY2xhc3M9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItaGVhZGVyIj5TZXR0aW5nczwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItbGlzdCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLWl0ZW0iPkNvbm5lY3Rpb248L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItaXRlbSI+RGlzcGxheTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2FzaWRlPgogICAgYDsKICB9CiAgcmVuZGVyRGF0YWJhc2VHcm91cChkYikgewogICAgcmV0dXJuIGh0bWw4YAogICAgICA8ZGl2IGNsYXNzPSJkYi1ncm91cCI+CiAgICAgICAgPGRpdgogICAgICAgICAgY2xhc3M9ImRiLWdyb3VwLWhlYWRlciAke3RoaXMuc2VsZWN0ZWREYXRhYmFzZSA9PT0gZGIubmFtZSA/ICJzZWxlY3RlZCIgOiAiIn0iCiAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNlbGVjdERhdGFiYXNlKGRiLm5hbWUpfQogICAgICAgICAgQGNvbnRleHRtZW51PSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVEYXRhYmFzZUNvbnRleHRNZW51KGUxMSwgZGIubmFtZSl9CiAgICAgICAgPgogICAgICAgICAgPHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+CiAgICAgICAgICAgIDxlbGxpcHNlIGN4PSIxMiIgY3k9IjUiIHJ4PSI5IiByeT0iMyI+PC9lbGxpcHNlPgogICAgICAgICAgICA8cGF0aCBkPSJNMjEgMTJjMCAxLjY2LTQgMy05IDNzLTktMS4zNC05LTMiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZD0iTTMgNXYxNGMwIDEuNjYgNCAzIDkgM3M5LTEuMzQgOS0zVjUiPjwvcGF0aD4KICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgPHNwYW4gc3R5bGU9ImZsZXg6IDE7Ij4ke2RiLm5hbWV9PC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICAgICR7dGhpcy5zZWxlY3RlZERhdGFiYXNlID09PSBkYi5uYW1lID8gdGhpcy5yZW5kZXJDb2xsZWN0aW9uc0xpc3QoZGIubmFtZSkgOiAiIn0KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICByZW5kZXJDb2xsZWN0aW9uc0xpc3QoZGJOYW1lKSB7CiAgICByZXR1cm4gaHRtbDhgCiAgICAgIDx0c3ZpZXctbW9uZ28tY29sbGVjdGlvbnMKICAgICAgICAuZGF0YWJhc2VOYW1lPSR7ZGJOYW1lfQogICAgICAgIC5zZWxlY3RlZENvbGxlY3Rpb249JHt0aGlzLnNlbGVjdGVkQ29sbGVjdGlvbn0KICAgICAgICBAY29sbGVjdGlvbi1zZWxlY3RlZD0keyhlMTEpID0+IHRoaXMuc2VsZWN0Q29sbGVjdGlvbihlMTEuZGV0YWlsKX0KICAgICAgICBAY29sbGVjdGlvbi1kZWxldGVkPSR7KGUxMSkgPT4gdGhpcy5oYW5kbGVDb2xsZWN0aW9uRGVsZXRlZChlMTEpfQogICAgICA+PC90c3ZpZXctbW9uZ28tY29sbGVjdGlvbnM+CiAgICBgOwogIH0KICBoYW5kbGVDb2xsZWN0aW9uRGVsZXRlZChlMTEpIHsKICAgIGNvbnN0IHsgY29sbGVjdGlvbk5hbWUgfSA9IGUxMS5kZXRhaWw7CiAgICBpZiAodGhpcy5zZWxlY3RlZENvbGxlY3Rpb24gPT09IGNvbGxlY3Rpb25OYW1lKSB7CiAgICAgIHRoaXMuc2VsZWN0ZWRDb2xsZWN0aW9uID0gIiI7CiAgICB9CiAgfQogIHJlbmRlckNvbnRlbnQoKSB7CiAgICBpZiAodGhpcy52aWV3TW9kZSA9PT0gInMzIikgewogICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRCdWNrZXQpIHsKICAgICAgICByZXR1cm4gaHRtbDhgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50LWFyZWEiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+CiAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIyIDE5YTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmg1bDIgM2g5YTIgMiAwIDAgMSAyIDJ6Ij48L3BhdGg+CiAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPHA+U2VsZWN0IGEgYnVja2V0IHRvIGJyb3dzZTwvcD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgOwogICAgICB9CiAgICAgIHJldHVybiBodG1sOGAKICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50LWFyZWEiPgogICAgICAgICAgPGRlZXMtc3RvcmFnZS1icm93c2VyCiAgICAgICAgICAgIC5kYXRhUHJvdmlkZXI9JHtzM0RhdGFQcm92aWRlcn0KICAgICAgICAgICAgLmJ1Y2tldE5hbWU9JHt0aGlzLnNlbGVjdGVkQnVja2V0fQogICAgICAgICAgICAub25DaGFuZ2VFdmVudD0keyhjYWxsYmFjaykgPT4gewogICAgICAgIGNvbnN0IHN1YjIgPSBjaGFuZ2VTdHJlYW1TZXJ2aWNlLmdldEJ1Y2tldENoYW5nZXModGhpcy5zZWxlY3RlZEJ1Y2tldCkuc3Vic2NyaWJlKGNhbGxiYWNrKTsKICAgICAgICByZXR1cm4gKCkgPT4gc3ViMi51bnN1YnNjcmliZSgpOwogICAgICB9fQogICAgICAgICAgPjwvZGVlcy1zdG9yYWdlLWJyb3dzZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIGA7CiAgICB9CiAgICBpZiAodGhpcy52aWV3TW9kZSA9PT0gIm1vbmdvIikgewogICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2xsZWN0aW9uKSB7CiAgICAgICAgcmV0dXJuIGh0bWw4YAogICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudC1hcmVhIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiPgogICAgICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj4KICAgICAgICAgICAgICAgIDxlbGxpcHNlIGN4PSIxMiIgY3k9IjUiIHJ4PSI5IiByeT0iMyI+PC9lbGxpcHNlPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIxIDEyYzAgMS42Ni00IDMtOSAzcy05LTEuMzQtOS0zIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMyA1djE0YzAgMS42NiA0IDMgOSAzczktMS4zNCA5LTNWNSI+PC9wYXRoPgogICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDxwPlNlbGVjdCBhIGNvbGxlY3Rpb24gdG8gdmlldyBkb2N1bWVudHM8L3A+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgYDsKICAgICAgfQogICAgICBpZiAodGhpcy5zZWxlY3RlZENvbGxlY3Rpb24gPT09ICJfX292ZXJ2aWV3X18iKSB7CiAgICAgICAgcmV0dXJuIGh0bWw4YAogICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudC1hcmVhIj4KICAgICAgICAgICAgPHRzdmlldy1tb25nby1kYi1vdmVydmlldwogICAgICAgICAgICAgIC5kYXRhYmFzZU5hbWU9JHt0aGlzLnNlbGVjdGVkRGF0YWJhc2V9CiAgICAgICAgICAgID48L3Rzdmlldy1tb25nby1kYi1vdmVydmlldz4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGA7CiAgICAgIH0KICAgICAgcmV0dXJuIGh0bWw4YAogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQtYXJlYSI+CiAgICAgICAgICA8dHN2aWV3LW1vbmdvLWJyb3dzZXIKICAgICAgICAgICAgLmRhdGFiYXNlTmFtZT0ke3RoaXMuc2VsZWN0ZWREYXRhYmFzZX0KICAgICAgICAgICAgLmNvbGxlY3Rpb25OYW1lPSR7dGhpcy5zZWxlY3RlZENvbGxlY3Rpb259CiAgICAgICAgICA+PC90c3ZpZXctbW9uZ28tYnJvd3Nlcj4KICAgICAgICA8L2Rpdj4KICAgICAgYDsKICAgIH0KICAgIGlmICh0aGlzLnZpZXdNb2RlID09PSAiYWN0aXZpdHkiKSB7CiAgICAgIHJldHVybiBodG1sOGAKICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50LWFyZWEiIHN0eWxlPSJwYWRkaW5nOiAwOyI+CiAgICAgICAgICA8dHN2aWV3LWFjdGl2aXR5LXN0cmVhbQogICAgICAgICAgICBAbmF2aWdhdGUtdG8tbW9uZ289JHt0aGlzLmhhbmRsZU5hdmlnYXRlVG9Nb25nb30KICAgICAgICAgICAgQG5hdmlnYXRlLXRvLXMzPSR7dGhpcy5oYW5kbGVOYXZpZ2F0ZVRvUzN9CiAgICAgICAgICA+PC90c3ZpZXctYWN0aXZpdHktc3RyZWFtPgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgfQogICAgcmV0dXJuIGh0bWw4YAogICAgICA8ZGl2IGNsYXNzPSJjb250ZW50LWFyZWEiPgogICAgICAgIDxoMj5TZXR0aW5nczwvaDI+CiAgICAgICAgPHA+Q29uZmlndXJhdGlvbiBvcHRpb25zIGNvbWluZyBzb29uLjwvcD4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KICBoYW5kbGVOYXZpZ2F0ZVRvTW9uZ28oZTExKSB7CiAgICBjb25zdCB7IGRhdGFiYXNlLCBjb2xsZWN0aW9uLCBkb2N1bWVudElkIH0gPSBlMTEuZGV0YWlsOwogICAgdGhpcy52aWV3TW9kZSA9ICJtb25nbyI7CiAgICB0aGlzLnNlbGVjdGVkRGF0YWJhc2UgPSBkYXRhYmFzZTsKICAgIHRoaXMuc2VsZWN0ZWRDb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKICB9CiAgaGFuZGxlTmF2aWdhdGVUb1MzKGUxMSkgewogICAgY29uc3QgeyBidWNrZXQsIGtleToga2V5MiB9ID0gZTExLmRldGFpbDsKICAgIHRoaXMudmlld01vZGUgPSAiczMiOwogICAgdGhpcy5zZWxlY3RlZEJ1Y2tldCA9IGJ1Y2tldDsKICB9Cn07Cl9pbml0ID0gX19kZWNvcmF0b3JTdGFydChfYTQpOwpfdmlld01vZGUgPSBuZXcgV2Vha01hcCgpOwpfc2VsZWN0ZWRCdWNrZXQgPSBuZXcgV2Vha01hcCgpOwpfc2VsZWN0ZWREYXRhYmFzZSA9IG5ldyBXZWFrTWFwKCk7Cl9zZWxlY3RlZENvbGxlY3Rpb24gPSBuZXcgV2Vha01hcCgpOwpfYnVja2V0cyA9IG5ldyBXZWFrTWFwKCk7Cl9kYXRhYmFzZXMgPSBuZXcgV2Vha01hcCgpOwpfc2hvd0NyZWF0ZUJ1Y2tldERpYWxvZyA9IG5ldyBXZWFrTWFwKCk7Cl9uZXdCdWNrZXROYW1lID0gbmV3IFdlYWtNYXAoKTsKX3Nob3dDcmVhdGVDb2xsZWN0aW9uRGlhbG9nID0gbmV3IFdlYWtNYXAoKTsKX25ld0NvbGxlY3Rpb25OYW1lID0gbmV3IFdlYWtNYXAoKTsKX3Nob3dDcmVhdGVEYXRhYmFzZURpYWxvZyA9IG5ldyBXZWFrTWFwKCk7Cl9uZXdEYXRhYmFzZU5hbWUgPSBuZXcgV2Vha01hcCgpOwpfc2hvd1N5c3RlbURhdGFiYXNlcyA9IG5ldyBXZWFrTWFwKCk7Cl9zaG93UzNDcmVhdGVEaWFsb2cgPSBuZXcgV2Vha01hcCgpOwpfczNDcmVhdGVEaWFsb2dUeXBlID0gbmV3IFdlYWtNYXAoKTsKX3MzQ3JlYXRlRGlhbG9nQnVja2V0ID0gbmV3IFdlYWtNYXAoKTsKX3MzQ3JlYXRlRGlhbG9nTmFtZSA9IG5ldyBXZWFrTWFwKCk7Cl9zaWRlYmFyV2lkdGggPSBuZXcgV2Vha01hcCgpOwpfaXNSZXNpemluZ1NpZGViYXIgPSBuZXcgV2Vha01hcCgpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInZpZXdNb2RlIiwgX3ZpZXdNb2RlX2RlYywgVHN2aWV3QXBwLCBfdmlld01vZGUpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNlbGVjdGVkQnVja2V0IiwgX3NlbGVjdGVkQnVja2V0X2RlYywgVHN2aWV3QXBwLCBfc2VsZWN0ZWRCdWNrZXQpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNlbGVjdGVkRGF0YWJhc2UiLCBfc2VsZWN0ZWREYXRhYmFzZV9kZWMsIFRzdmlld0FwcCwgX3NlbGVjdGVkRGF0YWJhc2UpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNlbGVjdGVkQ29sbGVjdGlvbiIsIF9zZWxlY3RlZENvbGxlY3Rpb25fZGVjLCBUc3ZpZXdBcHAsIF9zZWxlY3RlZENvbGxlY3Rpb24pOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgImJ1Y2tldHMiLCBfYnVja2V0c19kZWMsIFRzdmlld0FwcCwgX2J1Y2tldHMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgImRhdGFiYXNlcyIsIF9kYXRhYmFzZXNfZGVjLCBUc3ZpZXdBcHAsIF9kYXRhYmFzZXMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNob3dDcmVhdGVCdWNrZXREaWFsb2ciLCBfc2hvd0NyZWF0ZUJ1Y2tldERpYWxvZ19kZWMsIFRzdmlld0FwcCwgX3Nob3dDcmVhdGVCdWNrZXREaWFsb2cpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgIm5ld0J1Y2tldE5hbWUiLCBfbmV3QnVja2V0TmFtZV9kZWMsIFRzdmlld0FwcCwgX25ld0J1Y2tldE5hbWUpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNob3dDcmVhdGVDb2xsZWN0aW9uRGlhbG9nIiwgX3Nob3dDcmVhdGVDb2xsZWN0aW9uRGlhbG9nX2RlYywgVHN2aWV3QXBwLCBfc2hvd0NyZWF0ZUNvbGxlY3Rpb25EaWFsb2cpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgIm5ld0NvbGxlY3Rpb25OYW1lIiwgX25ld0NvbGxlY3Rpb25OYW1lX2RlYywgVHN2aWV3QXBwLCBfbmV3Q29sbGVjdGlvbk5hbWUpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNob3dDcmVhdGVEYXRhYmFzZURpYWxvZyIsIF9zaG93Q3JlYXRlRGF0YWJhc2VEaWFsb2dfZGVjLCBUc3ZpZXdBcHAsIF9zaG93Q3JlYXRlRGF0YWJhc2VEaWFsb2cpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgIm5ld0RhdGFiYXNlTmFtZSIsIF9uZXdEYXRhYmFzZU5hbWVfZGVjLCBUc3ZpZXdBcHAsIF9uZXdEYXRhYmFzZU5hbWUpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNob3dTeXN0ZW1EYXRhYmFzZXMiLCBfc2hvd1N5c3RlbURhdGFiYXNlc19kZWMsIFRzdmlld0FwcCwgX3Nob3dTeXN0ZW1EYXRhYmFzZXMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNob3dTM0NyZWF0ZURpYWxvZyIsIF9zaG93UzNDcmVhdGVEaWFsb2dfZGVjLCBUc3ZpZXdBcHAsIF9zaG93UzNDcmVhdGVEaWFsb2cpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInMzQ3JlYXRlRGlhbG9nVHlwZSIsIF9zM0NyZWF0ZURpYWxvZ1R5cGVfZGVjLCBUc3ZpZXdBcHAsIF9zM0NyZWF0ZURpYWxvZ1R5cGUpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInMzQ3JlYXRlRGlhbG9nQnVja2V0IiwgX3MzQ3JlYXRlRGlhbG9nQnVja2V0X2RlYywgVHN2aWV3QXBwLCBfczNDcmVhdGVEaWFsb2dCdWNrZXQpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInMzQ3JlYXRlRGlhbG9nTmFtZSIsIF9zM0NyZWF0ZURpYWxvZ05hbWVfZGVjLCBUc3ZpZXdBcHAsIF9zM0NyZWF0ZURpYWxvZ05hbWUpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgInNpZGViYXJXaWR0aCIsIF9zaWRlYmFyV2lkdGhfZGVjLCBUc3ZpZXdBcHAsIF9zaWRlYmFyV2lkdGgpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgNCwgImlzUmVzaXppbmdTaWRlYmFyIiwgX2lzUmVzaXppbmdTaWRlYmFyX2RlYywgVHN2aWV3QXBwLCBfaXNSZXNpemluZ1NpZGViYXIpOwpUc3ZpZXdBcHAgPSBfX2RlY29yYXRlRWxlbWVudChfaW5pdCwgMCwgIlRzdmlld0FwcCIsIF9Uc3ZpZXdBcHBfZGVjb3JhdG9ycywgVHN2aWV3QXBwKTsKX19wdWJsaWNGaWVsZChUc3ZpZXdBcHAsICJzdHlsZXMiLCBbCiAgY3NzTWFuYWdlcjMuZGVmYXVsdFN0eWxlcywKICB0aGVtZVN0eWxlcywKICBjc3MzYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10c3ZpZXctYmctcHJpbWFyeSwgIzFhMWExYSk7CiAgICAgICAgY29sb3I6ICNlZWU7CiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuYXBwLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDQ4cHggMWZyOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmFwcC1oZWFkZXIgewogICAgICAgIGJhY2tncm91bmQ6ICMxNDE0MTQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMzMzM7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgICBnYXA6IDI0cHg7CiAgICAgIH0KCiAgICAgIC5hcHAtdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgfQoKICAgICAgLmFwcC10aXRsZSBzdmcgewogICAgICAgIHdpZHRoOiAyNHB4OwogICAgICAgIGhlaWdodDogMjRweDsKICAgICAgfQoKICAgICAgLm5hdi10YWJzIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogNHB4OwogICAgICB9CgogICAgICAubmF2LXRhYiB7CiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzOwogICAgICB9CgogICAgICAubmF2LXRhYjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKICAgICAgICBjb2xvcjogI2FhYTsKICAgICAgfQoKICAgICAgLm5hdi10YWIuYWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICAgICAgY29sb3I6ICNlMGUwZTA7CiAgICAgIH0KCiAgICAgIC5hcHAtbWFpbiB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLXNpZGViYXItd2lkdGgsIDI0MHB4KSA0cHggMWZyOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5yZXNpemUtZGl2aWRlciB7CiAgICAgICAgd2lkdGg6IDRweDsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBjdXJzb3I6IGNvbC1yZXNpemU7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzOwogICAgICB9CgogICAgICAucmVzaXplLWRpdmlkZXI6aG92ZXIsCiAgICAgIC5yZXNpemUtZGl2aWRlci5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgICAgfQoKICAgICAgLnNpZGViYXIgewogICAgICAgIGJhY2tncm91bmQ6ICMxZTFlMWU7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzMzMzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICAuc2lkZWJhci1oZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDEycHggMTZweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMzMzOwogICAgICB9CgogICAgICAuc2lkZWJhci1saXN0IHsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLWl0ZW0gewogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1czsKICAgICAgfQoKICAgICAgLnNpZGViYXItaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKICAgICAgfQoKICAgICAgLnNpZGViYXItaXRlbS5zZWxlY3RlZCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgICAgIGNvbG9yOiAjZTBlMGUwOwogICAgICB9CgogICAgICAuc2lkZWJhci1pdGVtIC5jb3VudCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgICAgICBwYWRkaW5nOiAycHggNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5jb250ZW50LWFyZWEgewogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUgc3ZnIHsKICAgICAgICB3aWR0aDogNjRweDsKICAgICAgICBoZWlnaHQ6IDY0cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIC5kYi1ncm91cCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICB9CgogICAgICAuZGItZ3JvdXAtaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICB9CgogICAgICAuZGItZ3JvdXAtaGVhZGVyOmhvdmVyIHsKICAgICAgICBjb2xvcjogI2NjYzsKICAgICAgfQoKICAgICAgLmRiLWdyb3VwLWNvbGxlY3Rpb25zIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDEycHg7CiAgICAgIH0KCiAgICAgIC5jb2xsZWN0aW9uLWl0ZW0gewogICAgICAgIHBhZGRpbmc6IDZweCAxMnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5jb2xsZWN0aW9uLWl0ZW06aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSk7CiAgICAgIH0KCiAgICAgIC5jb2xsZWN0aW9uLWl0ZW0uc2VsZWN0ZWQgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICAgICAgY29sb3I6ICNlMGUwZTA7CiAgICAgIH0KCiAgICAgIC5jcmVhdGUtYnRuIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA2cHg7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgbWFyZ2luOiA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgICAgIGJvcmRlcjogMXB4IGRhc2hlZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGNvbG9yOiAjZTBlMGUwOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7CiAgICAgIH0KCiAgICAgIC5jcmVhdGUtYnRuOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpOwogICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgICB9CgogICAgICAuZGlhbG9nLW92ZXJsYXkgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjcpOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB6LWluZGV4OiAxMDAwOwogICAgICB9CgogICAgICAuZGlhbG9nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMWUxZTFlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgICBtaW4td2lkdGg6IDQwMHB4OwogICAgICAgIGJveC1zaGFkb3c6IDAgMjBweCA0MHB4IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgICAgfQoKICAgICAgLmRpYWxvZy10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgLmRpYWxvZy1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6ICMxNDE0MTQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzMzMzsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQoKICAgICAgLmRpYWxvZy1pbnB1dDpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3JkZXItY29sb3I6ICNlMGUwZTA7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctbG9jYXRpb24gewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctaGludCB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CiAgICAgICAgbWFyZ2luLXRvcDogLThweDsKICAgICAgfQoKICAgICAgLmRpYWxvZy1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogMTJweDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAuZGlhbG9nLWJ0biB7CiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctYnRuLWNhbmNlbCB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzQ0NDsKICAgICAgICBjb2xvcjogI2FhYTsKICAgICAgfQoKICAgICAgLmRpYWxvZy1idG4tY2FuY2VsOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAuZGlhbG9nLWJ0bi1jcmVhdGUgewogICAgICAgIGJhY2tncm91bmQ6ICM0MDQwNDA7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAuZGlhbG9nLWJ0bi1jcmVhdGU6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICM1MDUwNTA7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctYnRuLWNyZWF0ZTpkaXNhYmxlZCB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctYnRuLWRlbGV0ZSB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyMzksIDY4LCA2OCwgMC4yKTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZWY0NDQ0OwogICAgICAgIGNvbG9yOiAjZjg3MTcxOwogICAgICB9CgogICAgICAuZGlhbG9nLWJ0bi1kZWxldGU6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjM5LCA2OCwgNjgsIDAuMyk7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLWl0ZW0tY29udGVudCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICB9CgogICAgICAuc2lkZWJhci1pdGVtLW5hbWUgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgYApdKTsKX19ydW5Jbml0aWFsaXplcnMoX2luaXQsIDEsIFRzdmlld0FwcCk7CgovLyB0c193ZWIvdXRpbGl0aWVzL2Zvcm1hdHRlcnMudHMKZnVuY3Rpb24gZm9ybWF0U2l6ZTIoYnl0ZXMpIHsKICBpZiAoYnl0ZXMgPT09IHZvaWQgMCB8fCBieXRlcyA9PT0gbnVsbCkgcmV0dXJuICItIjsKICBpZiAoYnl0ZXMgPT09IDApIHJldHVybiAiMCBCIjsKICBjb25zdCB1bml0czMgPSBbIkIiLCAiS0IiLCAiTUIiLCAiR0IiLCAiVEIiXTsKICBsZXQgc2l6ZSA9IGJ5dGVzOwogIGxldCB1bml0SW5kZXggPSAwOwogIHdoaWxlIChzaXplID49IDEwMjQgJiYgdW5pdEluZGV4IDwgdW5pdHMzLmxlbmd0aCAtIDEpIHsKICAgIHNpemUgLz0gMTAyNDsKICAgIHVuaXRJbmRleCsrOwogIH0KICByZXR1cm4gYCR7c2l6ZS50b0ZpeGVkKHVuaXRJbmRleCA+IDAgPyAxIDogMCl9ICR7dW5pdHMzW3VuaXRJbmRleF19YDsKfQpmdW5jdGlvbiBmb3JtYXRDb3VudDIoY291bnQyKSB7CiAgaWYgKGNvdW50MiA9PT0gdm9pZCAwIHx8IGNvdW50MiA9PT0gbnVsbCkgcmV0dXJuICIiOwogIGlmIChjb3VudDIgPj0gMWU2KSByZXR1cm4gYCR7KGNvdW50MiAvIDFlNikudG9GaXhlZCgxKX1NYDsKICBpZiAoY291bnQyID49IDFlMykgcmV0dXJuIGAkeyhjb3VudDIgLyAxZTMpLnRvRml4ZWQoMSl9S2A7CiAgcmV0dXJuIGNvdW50Mi50b1N0cmluZygpOwp9CmZ1bmN0aW9uIGdldEZpbGVOYW1lMihwYXRoMikgewogIGNvbnN0IHBhcnRzID0gcGF0aDIucmVwbGFjZSgvXC8kLywgIiIpLnNwbGl0KCIvIik7CiAgcmV0dXJuIHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdIHx8IHBhdGgyOwp9CgovLyB0c193ZWIvZWxlbWVudHMvdHN2aWV3LW1vbmdvLWJyb3dzZXIudHMKdmFyIF9pc1N0cmVhbUNvbm5lY3RlZF9kZWMsIF9yZWNlbnRDaGFuZ2VDb3VudF9kZWMsIF9pc1Jlc2l6aW5nRWRpdG9yX2RlYywgX2VkaXRvcldpZHRoX2RlYywgX3N0YXRzX2RlYywgX3NlbGVjdGVkRG9jdW1lbnRJZF9kZWMsIF9hY3RpdmVUYWJfZGVjLCBfY29sbGVjdGlvbk5hbWVfZGVjLCBfZGF0YWJhc2VOYW1lX2RlYywgX2E1LCBfVHN2aWV3TW9uZ29Ccm93c2VyX2RlY29yYXRvcnMsIF9pbml0MiwgX2RhdGFiYXNlTmFtZSwgX2NvbGxlY3Rpb25OYW1lLCBfYWN0aXZlVGFiLCBfc2VsZWN0ZWREb2N1bWVudElkLCBfc3RhdHMsIF9lZGl0b3JXaWR0aCwgX2lzUmVzaXppbmdFZGl0b3IsIF9yZWNlbnRDaGFuZ2VDb3VudCwgX2lzU3RyZWFtQ29ubmVjdGVkOwp2YXIgeyBodG1sOiBodG1sOSwgY3NzOiBjc3M0LCBjc3NNYW5hZ2VyOiBjc3NNYW5hZ2VyNCwgY3VzdG9tRWxlbWVudDogY3VzdG9tRWxlbWVudDQsIHByb3BlcnR5OiBwcm9wZXJ0eTIsIHN0YXRlOiBzdGF0ZTMsIERlZXNFbGVtZW50OiBEZWVzRWxlbWVudDQgfSA9IHBsdWdpbnNfZXhwb3J0czU7Cl9Uc3ZpZXdNb25nb0Jyb3dzZXJfZGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50NCgidHN2aWV3LW1vbmdvLWJyb3dzZXIiKV07CnZhciBUc3ZpZXdNb25nb0Jyb3dzZXIgPSBjbGFzcyBleHRlbmRzIChfYTUgPSBEZWVzRWxlbWVudDQsIF9kYXRhYmFzZU5hbWVfZGVjID0gW3Byb3BlcnR5Mih7IHR5cGU6IFN0cmluZyB9KV0sIF9jb2xsZWN0aW9uTmFtZV9kZWMgPSBbcHJvcGVydHkyKHsgdHlwZTogU3RyaW5nIH0pXSwgX2FjdGl2ZVRhYl9kZWMgPSBbc3RhdGUzKCldLCBfc2VsZWN0ZWREb2N1bWVudElkX2RlYyA9IFtzdGF0ZTMoKV0sIF9zdGF0c19kZWMgPSBbc3RhdGUzKCldLCBfZWRpdG9yV2lkdGhfZGVjID0gW3N0YXRlMygpXSwgX2lzUmVzaXppbmdFZGl0b3JfZGVjID0gW3N0YXRlMygpXSwgX3JlY2VudENoYW5nZUNvdW50X2RlYyA9IFtzdGF0ZTMoKV0sIF9pc1N0cmVhbUNvbm5lY3RlZF9kZWMgPSBbc3RhdGUzKCldLCBfYTUpIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2RhdGFiYXNlTmFtZSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQyLCA4LCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDIsIDExLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfY29sbGVjdGlvbk5hbWUsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MiwgMTIsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MiwgMTUsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9hY3RpdmVUYWIsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MiwgMTYsIHRoaXMsICJkb2N1bWVudHMiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MiwgMTksIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9zZWxlY3RlZERvY3VtZW50SWQsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MiwgMjAsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MiwgMjMsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9zdGF0cywgX19ydW5Jbml0aWFsaXplcnMoX2luaXQyLCAyNCwgdGhpcywgbnVsbCkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDIsIDI3LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfZWRpdG9yV2lkdGgsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MiwgMjgsIHRoaXMsIDcwMCkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDIsIDMxLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfaXNSZXNpemluZ0VkaXRvciwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQyLCAzMiwgdGhpcywgZmFsc2UpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQyLCAzNSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3JlY2VudENoYW5nZUNvdW50LCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDIsIDM2LCB0aGlzLCAwKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MiwgMzksIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9pc1N0cmVhbUNvbm5lY3RlZCwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQyLCA0MCwgdGhpcywgZmFsc2UpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQyLCA0MywgdGhpcyk7CiAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJjaGFuZ2VTdWJzY3JpcHRpb24iLCBudWxsKTsKICAgIF9fcHVibGljRmllbGQodGhpcywgImNvbm5lY3Rpb25TdWJzY3JpcHRpb24iLCBudWxsKTsKICAgIF9fcHVibGljRmllbGQodGhpcywgInN0YXJ0RWRpdG9yUmVzaXplIiwgKGUxMSkgPT4gewogICAgICBlMTEucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy5pc1Jlc2l6aW5nRWRpdG9yID0gdHJ1ZTsKICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgdGhpcy5oYW5kbGVFZGl0b3JSZXNpemUpOwogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5lbmRFZGl0b3JSZXNpemUpOwogICAgfSk7CiAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJoYW5kbGVFZGl0b3JSZXNpemUiLCAoZTExKSA9PiB7CiAgICAgIGlmICghdGhpcy5pc1Jlc2l6aW5nRWRpdG9yKSByZXR1cm47CiAgICAgIGNvbnN0IGNvbnRlbnRFbCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiLmNvbnRlbnQiKTsKICAgICAgaWYgKCFjb250ZW50RWwpIHJldHVybjsKICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRlbnRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1pbihNYXRoLm1heChjb250YWluZXJSZWN0LnJpZ2h0IC0gZTExLmNsaWVudFgsIDI1MCksIDFlMyk7CiAgICAgIHRoaXMuZWRpdG9yV2lkdGggPSBuZXdXaWR0aDsKICAgIH0pOwogICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiZW5kRWRpdG9yUmVzaXplIiwgKCkgPT4gewogICAgICB0aGlzLmlzUmVzaXppbmdFZGl0b3IgPSBmYWxzZTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgdGhpcy5oYW5kbGVFZGl0b3JSZXNpemUpOwogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgdGhpcy5lbmRFZGl0b3JSZXNpemUpOwogICAgfSk7CiAgfQogIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgIGF3YWl0IHRoaXMubG9hZFN0YXRzKCk7CiAgICB0aGlzLmNvbm5lY3Rpb25TdWJzY3JpcHRpb24gPSBjaGFuZ2VTdHJlYW1TZXJ2aWNlLmNvbm5lY3Rpb25TdGF0dXMkLnN1YnNjcmliZSgoc3RhdHVzKSA9PiB7CiAgICAgIHRoaXMuaXNTdHJlYW1Db25uZWN0ZWQgPSBzdGF0dXMgPT09ICJjb25uZWN0ZWQiOwogICAgfSk7CiAgfQogIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tQ2hhbmdlcygpOwogICAgaWYgKHRoaXMuY29ubmVjdGlvblN1YnNjcmlwdGlvbikgewogICAgICB0aGlzLmNvbm5lY3Rpb25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgdGhpcy5jb25uZWN0aW9uU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgIH0KICB9CiAgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygiZGF0YWJhc2VOYW1lIikgfHwgY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJjb2xsZWN0aW9uTmFtZSIpKSB7CiAgICAgIHRoaXMubG9hZFN0YXRzKCk7CiAgICAgIHRoaXMuc2VsZWN0ZWREb2N1bWVudElkID0gIiI7CiAgICAgIHRoaXMucmVjZW50Q2hhbmdlQ291bnQgPSAwOwogICAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbUNoYW5nZXMoKTsKICAgICAgdGhpcy5zdWJzY3JpYmVUb0NoYW5nZXMoKTsKICAgIH0KICB9CiAgYXN5bmMgc3Vic2NyaWJlVG9DaGFuZ2VzKCkgewogICAgaWYgKCF0aGlzLmRhdGFiYXNlTmFtZSB8fCAhdGhpcy5jb2xsZWN0aW9uTmFtZSkgcmV0dXJuOwogICAgdHJ5IHsKICAgICAgaWYgKCF0aGlzLmNoYW5nZVN1YnNjcmlwdGlvbikgewogICAgICAgIHRoaXMuY2hhbmdlU3Vic2NyaXB0aW9uID0gY2hhbmdlU3RyZWFtU2VydmljZS5nZXRDb2xsZWN0aW9uQ2hhbmdlcyh0aGlzLmRhdGFiYXNlTmFtZSwgdGhpcy5jb2xsZWN0aW9uTmFtZSkuc3Vic2NyaWJlKChldmVudCkgPT4gdGhpcy5oYW5kbGVDaGFuZ2UoZXZlbnQpKTsKICAgICAgfQogICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgY2hhbmdlU3RyZWFtU2VydmljZS5zdWJzY3JpYmVUb0NvbGxlY3Rpb24odGhpcy5kYXRhYmFzZU5hbWUsIHRoaXMuY29sbGVjdGlvbk5hbWUpOwogICAgICB0aGlzLmlzU3RyZWFtQ29ubmVjdGVkID0gc3VjY2VzczsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUud2FybigiW01vbmdvQnJvd3Nlcl0gRmFpbGVkIHRvIHN1YnNjcmliZSB0byBjaGFuZ2VzOiIsIGVycm9yKTsKICAgICAgdGhpcy5pc1N0cmVhbUNvbm5lY3RlZCA9IGZhbHNlOwogICAgfQogIH0KICB1bnN1YnNjcmliZUZyb21DaGFuZ2VzKCkgewogICAgaWYgKHRoaXMuY2hhbmdlU3Vic2NyaXB0aW9uKSB7CiAgICAgIHRoaXMuY2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgIHRoaXMuY2hhbmdlU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgIH0KICAgIGlmICh0aGlzLmRhdGFiYXNlTmFtZSAmJiB0aGlzLmNvbGxlY3Rpb25OYW1lKSB7CiAgICAgIGNoYW5nZVN0cmVhbVNlcnZpY2UudW5zdWJzY3JpYmVGcm9tQ29sbGVjdGlvbih0aGlzLmRhdGFiYXNlTmFtZSwgdGhpcy5jb2xsZWN0aW9uTmFtZSk7CiAgICB9CiAgICB0aGlzLmlzU3RyZWFtQ29ubmVjdGVkID0gZmFsc2U7CiAgfQogIGhhbmRsZUNoYW5nZShldmVudCkgewogICAgY29uc29sZS5sb2coIltNb25nb0Jyb3dzZXJdIFJlY2VpdmVkIGNoYW5nZToiLCBldmVudCk7CiAgICB0aGlzLnJlY2VudENoYW5nZUNvdW50Kys7CiAgICB0aGlzLmxvYWRTdGF0cygpOwogICAgY29uc3QgZG9jdW1lbnRzRWwgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoInRzdmlldy1tb25nby1kb2N1bWVudHMiKTsKICAgIGlmIChkb2N1bWVudHNFbD8ucmVmcmVzaCkgewogICAgICBkb2N1bWVudHNFbC5yZWZyZXNoKCk7CiAgICB9CiAgfQogIGFzeW5jIGxvYWRTdGF0cygpIHsKICAgIGlmICghdGhpcy5kYXRhYmFzZU5hbWUgfHwgIXRoaXMuY29sbGVjdGlvbk5hbWUpIHJldHVybjsKICAgIHRyeSB7CiAgICAgIHRoaXMuc3RhdHMgPSBhd2FpdCBhcGlTZXJ2aWNlLmdldENvbGxlY3Rpb25TdGF0cyh0aGlzLmRhdGFiYXNlTmFtZSwgdGhpcy5jb2xsZWN0aW9uTmFtZSk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgbG9hZGluZyBzdGF0czoiLCBlcnIpOwogICAgICB0aGlzLnN0YXRzID0gbnVsbDsKICAgIH0KICB9CiAgc2V0QWN0aXZlVGFiKHRhYjIpIHsKICAgIHRoaXMuYWN0aXZlVGFiID0gdGFiMjsKICB9CiAgaGFuZGxlRG9jdW1lbnRTZWxlY3RlZChlMTEpIHsKICAgIHRoaXMuc2VsZWN0ZWREb2N1bWVudElkID0gZTExLmRldGFpbC5kb2N1bWVudElkOwogIH0KICByZW5kZXIoKSB7CiAgICByZXR1cm4gaHRtbDlgCiAgICAgIDxkaXYgY2xhc3M9ImJyb3dzZXItY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sbGVjdGlvbi1pbmZvIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbGxlY3Rpb24tdGl0bGUiPiR7dGhpcy5jb2xsZWN0aW9uTmFtZX08L3NwYW4+CiAgICAgICAgICAgICR7dGhpcy5zdGF0cyA/IGh0bWw5YAogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsZWN0aW9uLXN0YXRzIj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC1pdGVtIj4ke2Zvcm1hdENvdW50Mih0aGlzLnN0YXRzLmNvdW50KX0gZG9jczwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC1pdGVtIj4ke2Zvcm1hdFNpemUyKHRoaXMuc3RhdHMuc2l6ZSl9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0LWl0ZW0iPiR7dGhpcy5zdGF0cy5pbmRleENvdW50fSBpbmRleGVzPC9zcGFuPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RyZWFtLXN0YXR1cyI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0cmVhbS1kb3QgJHt0aGlzLmlzU3RyZWFtQ29ubmVjdGVkID8gImNvbm5lY3RlZCIgOiAiIn0iPjwvc3Bhbj4KICAgICAgICAgICAgICAke3RoaXMuaXNTdHJlYW1Db25uZWN0ZWQgPyAiTGl2ZSIgOiAiT2ZmbGluZSJ9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAke3RoaXMucmVjZW50Q2hhbmdlQ291bnQgPiAwID8gaHRtbDlgCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNoYW5nZS1pbmRpY2F0b3IgcHVsc2UiPgogICAgICAgICAgICAgICAgICAgICR7dGhpcy5yZWNlbnRDaGFuZ2VDb3VudH0gY2hhbmdlJHt0aGlzLnJlY2VudENoYW5nZUNvdW50ID4gMSA/ICJzIiA6ICIifQogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIGAgOiAiIn0KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InRhYnMiPgogICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgY2xhc3M9InRhYiAke3RoaXMuYWN0aXZlVGFiID09PSAiZG9jdW1lbnRzIiA/ICJhY3RpdmUiIDogIiJ9IgogICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuc2V0QWN0aXZlVGFiKCJkb2N1bWVudHMiKX0KICAgICAgICAgICAgPgogICAgICAgICAgICAgIERvY3VtZW50cwogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgIGNsYXNzPSJ0YWIgJHt0aGlzLmFjdGl2ZVRhYiA9PT0gImluZGV4ZXMiID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5zZXRBY3RpdmVUYWIoImluZGV4ZXMiKX0KICAgICAgICAgICAgPgogICAgICAgICAgICAgIEluZGV4ZXMKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICBjbGFzcz0idGFiICR7dGhpcy5hY3RpdmVUYWIgPT09ICJhZ2dyZWdhdGlvbiIgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNldEFjdGl2ZVRhYigiYWdncmVnYXRpb24iKX0KICAgICAgICAgICAgPgogICAgICAgICAgICAgIEFnZ3JlZ2F0aW9uCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiIHN0eWxlPSItLWVkaXRvci13aWR0aDogJHt0aGlzLmVkaXRvcldpZHRofXB4Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9Im1haW4tcGFuZWwiPgogICAgICAgICAgICAke3RoaXMuYWN0aXZlVGFiID09PSAiZG9jdW1lbnRzIiA/IGh0bWw5YAogICAgICAgICAgICAgICAgICA8dHN2aWV3LW1vbmdvLWRvY3VtZW50cwogICAgICAgICAgICAgICAgICAgIC5kYXRhYmFzZU5hbWU9JHt0aGlzLmRhdGFiYXNlTmFtZX0KICAgICAgICAgICAgICAgICAgICAuY29sbGVjdGlvbk5hbWU9JHt0aGlzLmNvbGxlY3Rpb25OYW1lfQogICAgICAgICAgICAgICAgICAgIEBkb2N1bWVudC1zZWxlY3RlZD0ke3RoaXMuaGFuZGxlRG9jdW1lbnRTZWxlY3RlZH0KICAgICAgICAgICAgICAgICAgPjwvdHN2aWV3LW1vbmdvLWRvY3VtZW50cz4KICAgICAgICAgICAgICAgIGAgOiB0aGlzLmFjdGl2ZVRhYiA9PT0gImluZGV4ZXMiID8gaHRtbDlgCiAgICAgICAgICAgICAgICAgICAgPHRzdmlldy1tb25nby1pbmRleGVzCiAgICAgICAgICAgICAgICAgICAgICAuZGF0YWJhc2VOYW1lPSR7dGhpcy5kYXRhYmFzZU5hbWV9CiAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdGlvbk5hbWU9JHt0aGlzLmNvbGxlY3Rpb25OYW1lfQogICAgICAgICAgICAgICAgICAgID48L3Rzdmlldy1tb25nby1pbmRleGVzPgogICAgICAgICAgICAgICAgICBgIDogaHRtbDlgCiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0icGFkZGluZzogMjRweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzY2NjsiPgogICAgICAgICAgICAgICAgICAgICAgQWdncmVnYXRpb24gcGlwZWxpbmUgYnVpbGRlciBjb21pbmcgc29vbgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICBgfQogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPGRpdgogICAgICAgICAgICBjbGFzcz0icmVzaXplLWRpdmlkZXIgJHt0aGlzLmlzUmVzaXppbmdFZGl0b3IgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgICAgQG1vdXNlZG93bj0ke3RoaXMuc3RhcnRFZGl0b3JSZXNpemV9CiAgICAgICAgICA+PC9kaXY+CgogICAgICAgICAgPGRpdiBjbGFzcz0iZGV0YWlsLXBhbmVsIj4KICAgICAgICAgICAgPHRzdmlldy1tb25nby1kb2N1bWVudAogICAgICAgICAgICAgIC5kYXRhYmFzZU5hbWU9JHt0aGlzLmRhdGFiYXNlTmFtZX0KICAgICAgICAgICAgICAuY29sbGVjdGlvbk5hbWU9JHt0aGlzLmNvbGxlY3Rpb25OYW1lfQogICAgICAgICAgICAgIC5kb2N1bWVudElkPSR7dGhpcy5zZWxlY3RlZERvY3VtZW50SWR9CiAgICAgICAgICAgID48L3Rzdmlldy1tb25nby1kb2N1bWVudD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIGA7CiAgfQp9OwpfaW5pdDIgPSBfX2RlY29yYXRvclN0YXJ0KF9hNSk7Cl9kYXRhYmFzZU5hbWUgPSBuZXcgV2Vha01hcCgpOwpfY29sbGVjdGlvbk5hbWUgPSBuZXcgV2Vha01hcCgpOwpfYWN0aXZlVGFiID0gbmV3IFdlYWtNYXAoKTsKX3NlbGVjdGVkRG9jdW1lbnRJZCA9IG5ldyBXZWFrTWFwKCk7Cl9zdGF0cyA9IG5ldyBXZWFrTWFwKCk7Cl9lZGl0b3JXaWR0aCA9IG5ldyBXZWFrTWFwKCk7Cl9pc1Jlc2l6aW5nRWRpdG9yID0gbmV3IFdlYWtNYXAoKTsKX3JlY2VudENoYW5nZUNvdW50ID0gbmV3IFdlYWtNYXAoKTsKX2lzU3RyZWFtQ29ubmVjdGVkID0gbmV3IFdlYWtNYXAoKTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQyLCA0LCAiZGF0YWJhc2VOYW1lIiwgX2RhdGFiYXNlTmFtZV9kZWMsIFRzdmlld01vbmdvQnJvd3NlciwgX2RhdGFiYXNlTmFtZSk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0MiwgNCwgImNvbGxlY3Rpb25OYW1lIiwgX2NvbGxlY3Rpb25OYW1lX2RlYywgVHN2aWV3TW9uZ29Ccm93c2VyLCBfY29sbGVjdGlvbk5hbWUpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDIsIDQsICJhY3RpdmVUYWIiLCBfYWN0aXZlVGFiX2RlYywgVHN2aWV3TW9uZ29Ccm93c2VyLCBfYWN0aXZlVGFiKTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQyLCA0LCAic2VsZWN0ZWREb2N1bWVudElkIiwgX3NlbGVjdGVkRG9jdW1lbnRJZF9kZWMsIFRzdmlld01vbmdvQnJvd3NlciwgX3NlbGVjdGVkRG9jdW1lbnRJZCk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0MiwgNCwgInN0YXRzIiwgX3N0YXRzX2RlYywgVHN2aWV3TW9uZ29Ccm93c2VyLCBfc3RhdHMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDIsIDQsICJlZGl0b3JXaWR0aCIsIF9lZGl0b3JXaWR0aF9kZWMsIFRzdmlld01vbmdvQnJvd3NlciwgX2VkaXRvcldpZHRoKTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQyLCA0LCAiaXNSZXNpemluZ0VkaXRvciIsIF9pc1Jlc2l6aW5nRWRpdG9yX2RlYywgVHN2aWV3TW9uZ29Ccm93c2VyLCBfaXNSZXNpemluZ0VkaXRvcik7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0MiwgNCwgInJlY2VudENoYW5nZUNvdW50IiwgX3JlY2VudENoYW5nZUNvdW50X2RlYywgVHN2aWV3TW9uZ29Ccm93c2VyLCBfcmVjZW50Q2hhbmdlQ291bnQpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDIsIDQsICJpc1N0cmVhbUNvbm5lY3RlZCIsIF9pc1N0cmVhbUNvbm5lY3RlZF9kZWMsIFRzdmlld01vbmdvQnJvd3NlciwgX2lzU3RyZWFtQ29ubmVjdGVkKTsKVHN2aWV3TW9uZ29Ccm93c2VyID0gX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQyLCAwLCAiVHN2aWV3TW9uZ29Ccm93c2VyIiwgX1Rzdmlld01vbmdvQnJvd3Nlcl9kZWNvcmF0b3JzLCBUc3ZpZXdNb25nb0Jyb3dzZXIpOwpfX3B1YmxpY0ZpZWxkKFRzdmlld01vbmdvQnJvd3NlciwgInN0eWxlcyIsIFsKICBjc3NNYW5hZ2VyNC5kZWZhdWx0U3R5bGVzLAogIHRoZW1lU3R5bGVzLAogIGNzczRgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5icm93c2VyLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgfQoKICAgICAgLmNvbGxlY3Rpb24taW5mbyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTZweDsKICAgICAgfQoKICAgICAgLmNvbGxlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICB9CgogICAgICAuY29sbGVjdGlvbi1zdGF0cyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDE2cHg7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGNvbG9yOiAjODg4OwogICAgICB9CgogICAgICAuc3RhdC1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgIH0KCiAgICAgIC50YWJzIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogNHB4OwogICAgICB9CgogICAgICAudGFiIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTZweDsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgY29sb3I6ICM4ODg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzOwogICAgICB9CgogICAgICAudGFiOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgICAgIGNvbG9yOiAjYWFhOwogICAgICB9CgogICAgICAudGFiLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgICAgIGNvbG9yOiAjZTBlMGUwOwogICAgICB9CgogICAgICAuY29udGVudCB7CiAgICAgICAgZmxleDogMTsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDRweCB2YXIoLS1lZGl0b3Itd2lkdGgsIDcwMHB4KTsKICAgICAgICBnYXA6IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnJlc2l6ZS1kaXZpZGVyIHsKICAgICAgICB3aWR0aDogNHB4OwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnM7CiAgICAgIH0KCiAgICAgIC5yZXNpemUtZGl2aWRlcjpob3ZlciwKICAgICAgLnJlc2l6ZS1kaXZpZGVyLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpOwogICAgICB9CgogICAgICAubWFpbi1wYW5lbCB7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgfQoKICAgICAgLmRldGFpbC1wYW5lbCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxMnB4OwogICAgICB9CgogICAgICBAbWVkaWEgKG1heC13aWR0aDogMTIwMHB4KSB7CiAgICAgICAgLmNvbnRlbnQgewogICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICAgICAgfQoKICAgICAgICAuZGV0YWlsLXBhbmVsLAogICAgICAgIC5yZXNpemUtZGl2aWRlciB7CiAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLmNoYW5nZS1pbmRpY2F0b3IgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDZweDsKICAgICAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzQsIDE5NywgOTQsIDAuMik7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBjb2xvcjogIzRhZGU4MDsKICAgICAgfQoKICAgICAgLmNoYW5nZS1pbmRpY2F0b3IucHVsc2UgewogICAgICAgIGFuaW1hdGlvbjogcHVsc2UtZ3JlZW4gMXMgZWFzZS1pbi1vdXQ7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgcHVsc2UtZ3JlZW4gewogICAgICAgIDAlIHsgYmFja2dyb3VuZDogcmdiYSgzNCwgMTk3LCA5NCwgMC40KTsgfQogICAgICAgIDEwMCUgeyBiYWNrZ3JvdW5kOiByZ2JhKDM0LCAxOTcsIDk0LCAwLjIpOyB9CiAgICAgIH0KCiAgICAgIC5zdHJlYW0tc3RhdHVzIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGNvbG9yOiAjODg4OwogICAgICB9CgogICAgICAuc3RyZWFtLWRvdCB7CiAgICAgICAgd2lkdGg6IDZweDsKICAgICAgICBoZWlnaHQ6IDZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYmFja2dyb3VuZDogIzg4ODsKICAgICAgfQoKICAgICAgLnN0cmVhbS1kb3QuY29ubmVjdGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMjJjNTVlOwogICAgICB9CiAgICBgCl0pOwpfX3J1bkluaXRpYWxpemVycyhfaW5pdDIsIDEsIFRzdmlld01vbmdvQnJvd3Nlcik7CgovLyB0c193ZWIvZWxlbWVudHMvdHN2aWV3LW1vbmdvLWNvbGxlY3Rpb25zLnRzCnZhciBfbG9hZGluZ19kZWMsIF9jb2xsZWN0aW9uc19kZWMsIF9zZWxlY3RlZENvbGxlY3Rpb25fZGVjMiwgX2RhdGFiYXNlTmFtZV9kZWMyLCBfYTYsIF9Uc3ZpZXdNb25nb0NvbGxlY3Rpb25zX2RlY29yYXRvcnMsIF9pbml0MywgX2RhdGFiYXNlTmFtZTIsIF9zZWxlY3RlZENvbGxlY3Rpb24yLCBfY29sbGVjdGlvbnMsIF9sb2FkaW5nOwp2YXIgeyBodG1sOiBodG1sMTAsIGNzczogY3NzNSwgY3NzTWFuYWdlcjogY3NzTWFuYWdlcjUsIGN1c3RvbUVsZW1lbnQ6IGN1c3RvbUVsZW1lbnQ1LCBwcm9wZXJ0eTogcHJvcGVydHkzLCBzdGF0ZTogc3RhdGU0LCBEZWVzRWxlbWVudDogRGVlc0VsZW1lbnQ1IH0gPSBwbHVnaW5zX2V4cG9ydHM1Owp2YXIgeyBEZWVzQ29udGV4dG1lbnU6IERlZXNDb250ZXh0bWVudTMgfSA9IGRpc3RfdHNfd2ViX2V4cG9ydHMyOwpfVHN2aWV3TW9uZ29Db2xsZWN0aW9uc19kZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQ1KCJ0c3ZpZXctbW9uZ28tY29sbGVjdGlvbnMiKV07CnZhciBUc3ZpZXdNb25nb0NvbGxlY3Rpb25zID0gY2xhc3MgZXh0ZW5kcyAoX2E2ID0gRGVlc0VsZW1lbnQ1LCBfZGF0YWJhc2VOYW1lX2RlYzIgPSBbcHJvcGVydHkzKHsgdHlwZTogU3RyaW5nIH0pXSwgX3NlbGVjdGVkQ29sbGVjdGlvbl9kZWMyID0gW3Byb3BlcnR5Myh7IHR5cGU6IFN0cmluZyB9KV0sIF9jb2xsZWN0aW9uc19kZWMgPSBbc3RhdGU0KCldLCBfbG9hZGluZ19kZWMgPSBbc3RhdGU0KCldLCBfYTYpIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2RhdGFiYXNlTmFtZTIsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MywgOCwgdGhpcywgIiIpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQzLCAxMSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3NlbGVjdGVkQ29sbGVjdGlvbjIsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MywgMTIsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MywgMTUsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9jb2xsZWN0aW9ucywgX19ydW5Jbml0aWFsaXplcnMoX2luaXQzLCAxNiwgdGhpcywgW10pKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQzLCAxOSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2xvYWRpbmcsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MywgMjAsIHRoaXMsIGZhbHNlKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MywgMjMsIHRoaXMpOwogIH0KICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICBhd2FpdCB0aGlzLmxvYWRDb2xsZWN0aW9ucygpOwogIH0KICB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJkYXRhYmFzZU5hbWUiKSkgewogICAgICB0aGlzLmxvYWRDb2xsZWN0aW9ucygpOwogICAgfQogIH0KICBhc3luYyBsb2FkQ29sbGVjdGlvbnMoKSB7CiAgICBpZiAoIXRoaXMuZGF0YWJhc2VOYW1lKSByZXR1cm47CiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlOwogICAgdHJ5IHsKICAgICAgdGhpcy5jb2xsZWN0aW9ucyA9IGF3YWl0IGFwaVNlcnZpY2UubGlzdENvbGxlY3Rpb25zKHRoaXMuZGF0YWJhc2VOYW1lKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBjb25zb2xlLmVycm9yKCJFcnJvciBsb2FkaW5nIGNvbGxlY3Rpb25zOiIsIGVycik7CiAgICAgIHRoaXMuY29sbGVjdGlvbnMgPSBbXTsKICAgIH0KICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogIH0KICBzZWxlY3RDb2xsZWN0aW9uKG5hbWUpIHsKICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgKICAgICAgbmV3IEN1c3RvbUV2ZW50KCJjb2xsZWN0aW9uLXNlbGVjdGVkIiwgewogICAgICAgIGRldGFpbDogbmFtZSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pCiAgICApOwogIH0KICBhc3luYyBkZWxldGVDb2xsZWN0aW9uKG5hbWUpIHsKICAgIGlmICghY29uZmlybShgRGVsZXRlIGNvbGxlY3Rpb24gIiR7bmFtZX0iPyBUaGlzIHdpbGwgZGVsZXRlIGFsbCBkb2N1bWVudHMuYCkpIHJldHVybjsKICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBhcGlTZXJ2aWNlLmRyb3BDb2xsZWN0aW9uKHRoaXMuZGF0YWJhc2VOYW1lLCBuYW1lKTsKICAgIGlmIChzdWNjZXNzKSB7CiAgICAgIHRoaXMuY29sbGVjdGlvbnMgPSB0aGlzLmNvbGxlY3Rpb25zLmZpbHRlcigoYzExKSA9PiBjMTEubmFtZSAhPT0gbmFtZSk7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgKICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoImNvbGxlY3Rpb24tZGVsZXRlZCIsIHsKICAgICAgICAgIGRldGFpbDogeyBkYXRhYmFzZU5hbWU6IHRoaXMuZGF0YWJhc2VOYW1lLCBjb2xsZWN0aW9uTmFtZTogbmFtZSB9LAogICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgICAgfSkKICAgICAgKTsKICAgIH0KICB9CiAgaGFuZGxlQ29sbGVjdGlvbkNvbnRleHRNZW51KGV2ZW50LCBjb2xsZWN0aW9uKSB7CiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgRGVlc0NvbnRleHRtZW51My5vcGVuQ29udGV4dE1lbnVXaXRoT3B0aW9ucyhldmVudCwgWwogICAgICB7CiAgICAgICAgbmFtZTogIlZpZXcgRG9jdW1lbnRzIiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpmaWxlVGV4dCIsCiAgICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB7CiAgICAgICAgICB0aGlzLnNlbGVjdENvbGxlY3Rpb24oY29sbGVjdGlvbi5uYW1lKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICB7CiAgICAgICAgbmFtZTogIkRlbGV0ZSBDb2xsZWN0aW9uIiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTp0cmFzaDIiLAogICAgICAgIGFjdGlvbjogYXN5bmMgKCkgPT4gewogICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVDb2xsZWN0aW9uKGNvbGxlY3Rpb24ubmFtZSk7CiAgICAgICAgfQogICAgICB9CiAgICBdKTsKICB9CiAgYXN5bmMgcmVmcmVzaCgpIHsKICAgIGF3YWl0IHRoaXMubG9hZENvbGxlY3Rpb25zKCk7CiAgfQogIHNlbGVjdE92ZXJ2aWV3KCkgewogICAgdGhpcy5kaXNwYXRjaEV2ZW50KAogICAgICBuZXcgQ3VzdG9tRXZlbnQoImNvbGxlY3Rpb24tc2VsZWN0ZWQiLCB7CiAgICAgICAgZGV0YWlsOiAiX19vdmVydmlld19fIiwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pCiAgICApOwogIH0KICByZW5kZXIoKSB7CiAgICBpZiAodGhpcy5sb2FkaW5nKSB7CiAgICAgIHJldHVybiBodG1sMTBgPGRpdiBjbGFzcz0ibG9hZGluZy1zdGF0ZSI+TG9hZGluZyBjb2xsZWN0aW9ucy4uLjwvZGl2PmA7CiAgICB9CiAgICByZXR1cm4gaHRtbDEwYAogICAgICA8ZGl2IGNsYXNzPSJjb2xsZWN0aW9ucy1saXN0Ij4KICAgICAgICA8ZGl2CiAgICAgICAgICBjbGFzcz0ib3ZlcnZpZXctaXRlbSAke3RoaXMuc2VsZWN0ZWRDb2xsZWN0aW9uID09PSAiX19vdmVydmlld19fIiA/ICJzZWxlY3RlZCIgOiAiIn0iCiAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNlbGVjdE92ZXJ2aWV3KCl9CiAgICAgICAgPgogICAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPgogICAgICAgICAgICA8cmVjdCB4PSIzIiB5PSIzIiB3aWR0aD0iNyIgaGVpZ2h0PSI3Ij48L3JlY3Q+CiAgICAgICAgICAgIDxyZWN0IHg9IjE0IiB5PSIzIiB3aWR0aD0iNyIgaGVpZ2h0PSI3Ij48L3JlY3Q+CiAgICAgICAgICAgIDxyZWN0IHg9IjE0IiB5PSIxNCIgd2lkdGg9IjciIGhlaWdodD0iNyI+PC9yZWN0PgogICAgICAgICAgICA8cmVjdCB4PSIzIiB5PSIxNCIgd2lkdGg9IjciIGhlaWdodD0iNyI+PC9yZWN0PgogICAgICAgICAgPC9zdmc+CiAgICAgICAgICBPdmVydmlldwogICAgICAgIDwvZGl2PgogICAgICAgICR7dGhpcy5jb2xsZWN0aW9ucy5sZW5ndGggPT09IDAgPyBodG1sMTBgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiPk5vIGNvbGxlY3Rpb25zPC9kaXY+YCA6IHRoaXMuY29sbGVjdGlvbnMubWFwKAogICAgICAoY29sbCkgPT4gaHRtbDEwYAogICAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgICBjbGFzcz0iY29sbGVjdGlvbi1pdGVtICR7dGhpcy5zZWxlY3RlZENvbGxlY3Rpb24gPT09IGNvbGwubmFtZSA/ICJzZWxlY3RlZCIgOiAiIn0iCiAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuc2VsZWN0Q29sbGVjdGlvbihjb2xsLm5hbWUpfQogICAgICAgICAgICAgICAgICBAY29udGV4dG1lbnU9JHsoZTExKSA9PiB0aGlzLmhhbmRsZUNvbGxlY3Rpb25Db250ZXh0TWVudShlMTEsIGNvbGwpfQogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sbGVjdGlvbi1uYW1lIj4KICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJjb2xsZWN0aW9uLWljb24iIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+CiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjIgMTlhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDVsMiAzaDlhMiAyIDAgMCAxIDIgMnoiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgICAgICAke2NvbGwubmFtZX0KICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAke2NvbGwuY291bnQgIT09IHZvaWQgMCA/IGh0bWwxMGA8c3BhbiBjbGFzcz0iY29sbGVjdGlvbi1jb3VudCI+JHtmb3JtYXRDb3VudDIoY29sbC5jb3VudCl9PC9zcGFuPmAgOiAiIn0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIGAKICAgICl9CiAgICAgIDwvZGl2PgogICAgYDsKICB9Cn07Cl9pbml0MyA9IF9fZGVjb3JhdG9yU3RhcnQoX2E2KTsKX2RhdGFiYXNlTmFtZTIgPSBuZXcgV2Vha01hcCgpOwpfc2VsZWN0ZWRDb2xsZWN0aW9uMiA9IG5ldyBXZWFrTWFwKCk7Cl9jb2xsZWN0aW9ucyA9IG5ldyBXZWFrTWFwKCk7Cl9sb2FkaW5nID0gbmV3IFdlYWtNYXAoKTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQzLCA0LCAiZGF0YWJhc2VOYW1lIiwgX2RhdGFiYXNlTmFtZV9kZWMyLCBUc3ZpZXdNb25nb0NvbGxlY3Rpb25zLCBfZGF0YWJhc2VOYW1lMik7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0MywgNCwgInNlbGVjdGVkQ29sbGVjdGlvbiIsIF9zZWxlY3RlZENvbGxlY3Rpb25fZGVjMiwgVHN2aWV3TW9uZ29Db2xsZWN0aW9ucywgX3NlbGVjdGVkQ29sbGVjdGlvbjIpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDMsIDQsICJjb2xsZWN0aW9ucyIsIF9jb2xsZWN0aW9uc19kZWMsIFRzdmlld01vbmdvQ29sbGVjdGlvbnMsIF9jb2xsZWN0aW9ucyk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0MywgNCwgImxvYWRpbmciLCBfbG9hZGluZ19kZWMsIFRzdmlld01vbmdvQ29sbGVjdGlvbnMsIF9sb2FkaW5nKTsKVHN2aWV3TW9uZ29Db2xsZWN0aW9ucyA9IF9fZGVjb3JhdGVFbGVtZW50KF9pbml0MywgMCwgIlRzdmlld01vbmdvQ29sbGVjdGlvbnMiLCBfVHN2aWV3TW9uZ29Db2xsZWN0aW9uc19kZWNvcmF0b3JzLCBUc3ZpZXdNb25nb0NvbGxlY3Rpb25zKTsKX19wdWJsaWNGaWVsZChUc3ZpZXdNb25nb0NvbGxlY3Rpb25zLCAic3R5bGVzIiwgWwogIGNzc01hbmFnZXI1LmRlZmF1bHRTdHlsZXMsCiAgdGhlbWVTdHlsZXMsCiAgY3NzNWAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAuY29sbGVjdGlvbnMtbGlzdCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxMnB4OwogICAgICB9CgogICAgICAuY29sbGVjdGlvbi1pdGVtIHsKICAgICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xczsKICAgICAgfQoKICAgICAgLmNvbGxlY3Rpb24taXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKICAgICAgfQoKICAgICAgLmNvbGxlY3Rpb24taXRlbS5zZWxlY3RlZCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgICAgICBjb2xvcjogI2UwZTBlMDsKICAgICAgfQoKICAgICAgLmNvbGxlY3Rpb24tbmFtZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNnB4OwogICAgICB9CgogICAgICAuY29sbGVjdGlvbi1pY29uIHsKICAgICAgICB3aWR0aDogMTRweDsKICAgICAgICBoZWlnaHQ6IDE0cHg7CiAgICAgICAgY29sb3I6ICM4ODg7CiAgICAgIH0KCiAgICAgIC5jb2xsZWN0aW9uLWNvdW50IHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgfQoKICAgICAgLmxvYWRpbmctc3RhdGUgewogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgfQoKICAgICAgLmVtcHR5LXN0YXRlIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICB9CgogICAgICAub3ZlcnZpZXctaXRlbSB7CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNnB4OwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xczsKICAgICAgICBjb2xvcjogI2E1ZDZhNzsKICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICAgIH0KCiAgICAgIC5vdmVydmlldy1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgICB9CgogICAgICAub3ZlcnZpZXctaXRlbS5zZWxlY3RlZCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgxNjUsIDIxNCwgMTY3LCAwLjE1KTsKICAgICAgICBjb2xvcjogI2E1ZDZhNzsKICAgICAgfQoKICAgICAgLm92ZXJ2aWV3LWl0ZW0gc3ZnIHsKICAgICAgICB3aWR0aDogMTRweDsKICAgICAgICBoZWlnaHQ6IDE0cHg7CiAgICAgIH0KICAgIGAKXSk7Cl9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0MywgMSwgVHN2aWV3TW9uZ29Db2xsZWN0aW9ucyk7CgovLyB0c193ZWIvZWxlbWVudHMvdHN2aWV3LW1vbmdvLWRvY3VtZW50cy50cwp2YXIgX3NlbGVjdGVkSWRfZGVjLCBfZmlsdGVyVGV4dF9kZWMsIF9sb2FkaW5nX2RlYzIsIF9wYWdlU2l6ZV9kZWMsIF9wYWdlX2RlYywgX3RvdGFsX2RlYywgX2RvY3VtZW50c19kZWMsIF9jb2xsZWN0aW9uTmFtZV9kZWMyLCBfZGF0YWJhc2VOYW1lX2RlYzMsIF9hNywgX1Rzdmlld01vbmdvRG9jdW1lbnRzX2RlY29yYXRvcnMsIF9pbml0NCwgX2RhdGFiYXNlTmFtZTMsIF9jb2xsZWN0aW9uTmFtZTIsIF9kb2N1bWVudHMsIF90b3RhbCwgX3BhZ2UsIF9wYWdlU2l6ZSwgX2xvYWRpbmcyLCBfZmlsdGVyVGV4dCwgX3NlbGVjdGVkSWQ7CnZhciB7IGh0bWw6IGh0bWwxMSwgY3NzOiBjc3M2LCBjc3NNYW5hZ2VyOiBjc3NNYW5hZ2VyNiwgY3VzdG9tRWxlbWVudDogY3VzdG9tRWxlbWVudDYsIHByb3BlcnR5OiBwcm9wZXJ0eTQsIHN0YXRlOiBzdGF0ZTUsIERlZXNFbGVtZW50OiBEZWVzRWxlbWVudDYgfSA9IHBsdWdpbnNfZXhwb3J0czU7CnZhciB7IERlZXNDb250ZXh0bWVudTogRGVlc0NvbnRleHRtZW51NCB9ID0gZGlzdF90c193ZWJfZXhwb3J0czI7Cl9Uc3ZpZXdNb25nb0RvY3VtZW50c19kZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQ2KCJ0c3ZpZXctbW9uZ28tZG9jdW1lbnRzIildOwp2YXIgVHN2aWV3TW9uZ29Eb2N1bWVudHMgPSBjbGFzcyBleHRlbmRzIChfYTcgPSBEZWVzRWxlbWVudDYsIF9kYXRhYmFzZU5hbWVfZGVjMyA9IFtwcm9wZXJ0eTQoeyB0eXBlOiBTdHJpbmcgfSldLCBfY29sbGVjdGlvbk5hbWVfZGVjMiA9IFtwcm9wZXJ0eTQoeyB0eXBlOiBTdHJpbmcgfSldLCBfZG9jdW1lbnRzX2RlYyA9IFtzdGF0ZTUoKV0sIF90b3RhbF9kZWMgPSBbc3RhdGU1KCldLCBfcGFnZV9kZWMgPSBbc3RhdGU1KCldLCBfcGFnZVNpemVfZGVjID0gW3N0YXRlNSgpXSwgX2xvYWRpbmdfZGVjMiA9IFtzdGF0ZTUoKV0sIF9maWx0ZXJUZXh0X2RlYyA9IFtzdGF0ZTUoKV0sIF9zZWxlY3RlZElkX2RlYyA9IFtzdGF0ZTUoKV0sIF9hNykgewogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfZGF0YWJhc2VOYW1lMywgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ0LCA4LCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDQsIDExLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfY29sbGVjdGlvbk5hbWUyLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDQsIDEyLCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDQsIDE1LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfZG9jdW1lbnRzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDQsIDE2LCB0aGlzLCBbXSkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDQsIDE5LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfdG90YWwsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NCwgMjAsIHRoaXMsIDApKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ0LCAyMywgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3BhZ2UsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NCwgMjQsIHRoaXMsIDEpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ0LCAyNywgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3BhZ2VTaXplLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDQsIDI4LCB0aGlzLCA1MCkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDQsIDMxLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfbG9hZGluZzIsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NCwgMzIsIHRoaXMsIGZhbHNlKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NCwgMzUsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9maWx0ZXJUZXh0LCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDQsIDM2LCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDQsIDM5LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfc2VsZWN0ZWRJZCwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ0LCA0MCwgdGhpcywgIiIpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ0LCA0MywgdGhpcyk7CiAgfQogIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgIGF3YWl0IHRoaXMubG9hZERvY3VtZW50cygpOwogIH0KICB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJkYXRhYmFzZU5hbWUiKSB8fCBjaGFuZ2VkUHJvcGVydGllcy5oYXMoImNvbGxlY3Rpb25OYW1lIikpIHsKICAgICAgdGhpcy5wYWdlID0gMTsKICAgICAgdGhpcy5sb2FkRG9jdW1lbnRzKCk7CiAgICB9CiAgfQogIGFzeW5jIGxvYWREb2N1bWVudHMoKSB7CiAgICBpZiAoIXRoaXMuZGF0YWJhc2VOYW1lIHx8ICF0aGlzLmNvbGxlY3Rpb25OYW1lKSByZXR1cm47CiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlOwogICAgdHJ5IHsKICAgICAgbGV0IGZpbHRlcjIgPSB7fTsKICAgICAgaWYgKHRoaXMuZmlsdGVyVGV4dC50cmltKCkpIHsKICAgICAgICB0cnkgewogICAgICAgICAgZmlsdGVyMiA9IEpTT04ucGFyc2UodGhpcy5maWx0ZXJUZXh0KTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBpU2VydmljZS5maW5kRG9jdW1lbnRzKAogICAgICAgIHRoaXMuZGF0YWJhc2VOYW1lLAogICAgICAgIHRoaXMuY29sbGVjdGlvbk5hbWUsCiAgICAgICAgewogICAgICAgICAgZmlsdGVyOiBmaWx0ZXIyLAogICAgICAgICAgc2tpcDogKHRoaXMucGFnZSAtIDEpICogdGhpcy5wYWdlU2l6ZSwKICAgICAgICAgIGxpbWl0OiB0aGlzLnBhZ2VTaXplCiAgICAgICAgfQogICAgICApOwogICAgICB0aGlzLmRvY3VtZW50cyA9IHJlc3VsdC5kb2N1bWVudHM7CiAgICAgIHRoaXMudG90YWwgPSByZXN1bHQudG90YWw7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgbG9hZGluZyBkb2N1bWVudHM6IiwgZXJyKTsKICAgICAgdGhpcy5kb2N1bWVudHMgPSBbXTsKICAgICAgdGhpcy50b3RhbCA9IDA7CiAgICB9CiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICB9CiAgLyoqCiAgICogUHVibGljIG1ldGhvZCB0byByZWZyZXNoIGRvY3VtZW50cyAoY2FsbGVkIGJ5IHBhcmVudCBvbiBjaGFuZ2UgZXZlbnRzKQogICAqLwogIGFzeW5jIHJlZnJlc2goKSB7CiAgICBhd2FpdCB0aGlzLmxvYWREb2N1bWVudHMoKTsKICB9CiAgaGFuZGxlRmlsdGVySW5wdXQoZTExKSB7CiAgICB0aGlzLmZpbHRlclRleHQgPSBlMTEudGFyZ2V0LnZhbHVlOwogIH0KICBoYW5kbGVGaWx0ZXJTdWJtaXQoKSB7CiAgICB0aGlzLnBhZ2UgPSAxOwogICAgdGhpcy5sb2FkRG9jdW1lbnRzKCk7CiAgfQogIGhhbmRsZUtleVByZXNzKGUxMSkgewogICAgaWYgKGUxMS5rZXkgPT09ICJFbnRlciIpIHsKICAgICAgdGhpcy5oYW5kbGVGaWx0ZXJTdWJtaXQoKTsKICAgIH0KICB9CiAgc2VsZWN0RG9jdW1lbnQoZG9jKSB7CiAgICBjb25zdCBpZCA9IGRvYy5faWQgfHwgIiI7CiAgICB0aGlzLnNlbGVjdGVkSWQgPSBpZDsKICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgKICAgICAgbmV3IEN1c3RvbUV2ZW50KCJkb2N1bWVudC1zZWxlY3RlZCIsIHsKICAgICAgICBkZXRhaWw6IHsgZG9jdW1lbnRJZDogaWQsIGRvY3VtZW50OiBkb2MgfSwKICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgIGNvbXBvc2VkOiB0cnVlCiAgICAgIH0pCiAgICApOwogIH0KICBnb1RvUGFnZShwYWdlTnVtKSB7CiAgICB0aGlzLnBhZ2UgPSBwYWdlTnVtOwogICAgdGhpcy5sb2FkRG9jdW1lbnRzKCk7CiAgfQogIGdldERvY3VtZW50UHJldmlldyhkb2MpIHsKICAgIGNvbnN0IHByZXZpZXcgPSB7fTsKICAgIGNvbnN0IGtleXMyID0gT2JqZWN0LmtleXMoZG9jKS5maWx0ZXIoKGs1KSA9PiBrNSAhPT0gIl9pZCIpOwogICAgZm9yIChjb25zdCBrZXkyIG9mIGtleXMyLnNsaWNlKDAsIDMpKSB7CiAgICAgIHByZXZpZXdba2V5Ml0gPSBkb2Nba2V5Ml07CiAgICB9CiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocHJldmlldyk7CiAgfQogIGdldCB0b3RhbFBhZ2VzKCkgewogICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLnRvdGFsIC8gdGhpcy5wYWdlU2l6ZSk7CiAgfQogIGFzeW5jIGhhbmRsZUluc2VydE5ldygpIHsKICAgIGNvbnN0IG5ld0RvYyA9IHsKICAgICAgLy8gRGVmYXVsdCBlbXB0eSBkb2N1bWVudAogICAgICBjcmVhdGVkQXQ6ICgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKQogICAgfTsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGluc2VydGVkSWQgPSBhd2FpdCBhcGlTZXJ2aWNlLmluc2VydERvY3VtZW50KAogICAgICAgIHRoaXMuZGF0YWJhc2VOYW1lLAogICAgICAgIHRoaXMuY29sbGVjdGlvbk5hbWUsCiAgICAgICAgbmV3RG9jCiAgICAgICk7CiAgICAgIGF3YWl0IHRoaXMubG9hZERvY3VtZW50cygpOwogICAgICB0aGlzLnNlbGVjdGVkSWQgPSBpbnNlcnRlZElkOwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoCiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCJkb2N1bWVudC1zZWxlY3RlZCIsIHsKICAgICAgICAgIGRldGFpbDogeyBkb2N1bWVudElkOiBpbnNlcnRlZElkIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KQogICAgICApOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGluc2VydGluZyBkb2N1bWVudDoiLCBlcnIpOwogICAgfQogIH0KICBoYW5kbGVEb2N1bWVudENvbnRleHRNZW51KGV2ZW50LCBkb2MpIHsKICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICBjb25zdCBkb2NJZCA9IGRvYy5faWQ7CiAgICBEZWVzQ29udGV4dG1lbnU0Lm9wZW5Db250ZXh0TWVudVdpdGhPcHRpb25zKGV2ZW50LCBbCiAgICAgIHsKICAgICAgICBuYW1lOiAiVmlldy9FZGl0IiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTplZGl0IiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIHRoaXMuc2VsZWN0RG9jdW1lbnQoZG9jKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHsKICAgICAgICBuYW1lOiAiQ29weSBhcyBKU09OIiwKICAgICAgICBpY29uTmFtZTogImx1Y2lkZTpjb3B5IiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KEpTT04uc3RyaW5naWZ5KGRvYywgbnVsbCwgMikpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgewogICAgICAgIG5hbWU6ICJEdXBsaWNhdGUiLAogICAgICAgIGljb25OYW1lOiAibHVjaWRlOmNvcHlQbHVzIiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIGNvbnN0IHsgX2lkLCAuLi5kb2NXaXRob3V0SWQgfSA9IGRvYzsKICAgICAgICAgIGNvbnN0IG5ld0RvYyA9IHsgLi4uZG9jV2l0aG91dElkLCBjcmVhdGVkQXQ6ICgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkudG9JU09TdHJpbmcoKSB9OwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgaW5zZXJ0ZWRJZCA9IGF3YWl0IGFwaVNlcnZpY2UuaW5zZXJ0RG9jdW1lbnQoCiAgICAgICAgICAgICAgdGhpcy5kYXRhYmFzZU5hbWUsCiAgICAgICAgICAgICAgdGhpcy5jb2xsZWN0aW9uTmFtZSwKICAgICAgICAgICAgICBuZXdEb2MKICAgICAgICAgICAgKTsKICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRG9jdW1lbnRzKCk7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJZCA9IGluc2VydGVkSWQ7CiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgKICAgICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoImRvY3VtZW50LXNlbGVjdGVkIiwgewogICAgICAgICAgICAgICAgZGV0YWlsOiB7IGRvY3VtZW50SWQ6IGluc2VydGVkSWQgfSwKICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICk7CiAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgZHVwbGljYXRpbmcgZG9jdW1lbnQ6IiwgZXJyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIHsgZGl2aWRlcjogdHJ1ZSB9LAogICAgICB7CiAgICAgICAgbmFtZTogIkRlbGV0ZSIsCiAgICAgICAgaWNvbk5hbWU6ICJsdWNpZGU6dHJhc2gyIiwKICAgICAgICBhY3Rpb246IGFzeW5jICgpID0+IHsKICAgICAgICAgIGlmIChjb25maXJtKGBEZWxldGUgZG9jdW1lbnQgIiR7ZG9jSWR9Ij9gKSkgewogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcGlTZXJ2aWNlLmRlbGV0ZURvY3VtZW50KAogICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2VOYW1lLAogICAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbk5hbWUsCiAgICAgICAgICAgICAgZG9jSWQKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7CiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRG9jdW1lbnRzKCk7CiAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJZCA9PT0gZG9jSWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJZCA9ICIiOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgXSk7CiAgfQogIHJlbmRlcigpIHsKICAgIGNvbnN0IHN0YXJ0UmVjb3JkID0gKHRoaXMucGFnZSAtIDEpICogdGhpcy5wYWdlU2l6ZSArIDE7CiAgICBjb25zdCBlbmRSZWNvcmQgPSBNYXRoLm1pbih0aGlzLnBhZ2UgKiB0aGlzLnBhZ2VTaXplLCB0aGlzLnRvdGFsKTsKICAgIHJldHVybiBodG1sMTFgCiAgICAgIDxkaXYgY2xhc3M9ImRvY3VtZW50cy1jb250YWluZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImZpbHRlci1iYXIiPgogICAgICAgICAgPGlucHV0CiAgICAgICAgICAgIHR5cGU9InRleHQiCiAgICAgICAgICAgIGNsYXNzPSJmaWx0ZXItaW5wdXQiCiAgICAgICAgICAgIHBsYWNlaG9sZGVyPSdGaWx0ZXI6IHsiZmllbGQiOiAidmFsdWUifScKICAgICAgICAgICAgLnZhbHVlPSR7dGhpcy5maWx0ZXJUZXh0fQogICAgICAgICAgICBAaW5wdXQ9JHt0aGlzLmhhbmRsZUZpbHRlcklucHV0fQogICAgICAgICAgICBAa2V5cHJlc3M9JHt0aGlzLmhhbmRsZUtleVByZXNzfQogICAgICAgICAgLz4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZpbHRlci1idG4iIEBjbGljaz0ke3RoaXMuaGFuZGxlRmlsdGVyU3VibWl0fT5BcHBseTwvYnV0dG9uPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJhY3Rpb25zLWJhciI+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhY3Rpb24tYnRuIiBAY2xpY2s9JHt0aGlzLmhhbmRsZUluc2VydE5ld30+KyBJbnNlcnQgRG9jdW1lbnQ8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnRzLWxpc3QiPgogICAgICAgICAgJHt0aGlzLmxvYWRpbmcgPyBodG1sMTFgPGRpdiBjbGFzcz0ibG9hZGluZy1zdGF0ZSI+TG9hZGluZy4uLjwvZGl2PmAgOiB0aGlzLmRvY3VtZW50cy5sZW5ndGggPT09IDAgPyBodG1sMTFgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiPk5vIGRvY3VtZW50cyBmb3VuZDwvZGl2PmAgOiB0aGlzLmRvY3VtZW50cy5tYXAoCiAgICAgIChkb2MpID0+IGh0bWwxMWAKICAgICAgICAgICAgICAgICAgICA8ZGl2CiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZG9jdW1lbnQtcm93ICR7dGhpcy5zZWxlY3RlZElkID09PSBkb2MuX2lkID8gInNlbGVjdGVkIiA6ICIifSIKICAgICAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuc2VsZWN0RG9jdW1lbnQoZG9jKX0KICAgICAgICAgICAgICAgICAgICAgIEBjb250ZXh0bWVudT0keyhlMTEpID0+IHRoaXMuaGFuZGxlRG9jdW1lbnRDb250ZXh0TWVudShlMTEsIGRvYyl9CiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnQtaWQiPl9pZDogJHtkb2MuX2lkfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnQtcHJldmlldyI+JHt0aGlzLmdldERvY3VtZW50UHJldmlldyhkb2MpfTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICBgCiAgICApfQogICAgICAgIDwvZGl2PgoKICAgICAgICAke3RoaXMudG90YWwgPiAwID8gaHRtbDExYAogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luYXRpb24iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5hdGlvbi1pbmZvIj4KICAgICAgICAgICAgICAgICAgU2hvd2luZyAke3N0YXJ0UmVjb3JkfS0ke2VuZFJlY29yZH0gb2YgJHt0aGlzLnRvdGFsfQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmF0aW9uLWNvbnRyb2xzIj4KICAgICAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJwYWdlLWJ0biIKICAgICAgICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHt0aGlzLnBhZ2UgPD0gMX0KICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmdvVG9QYWdlKHRoaXMucGFnZSAtIDEpfQogICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgUHJldmlvdXMKICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgICAgICBjbGFzcz0icGFnZS1idG4iCiAgICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7dGhpcy5wYWdlID49IHRoaXMudG90YWxQYWdlc30KICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmdvVG9QYWdlKHRoaXMucGFnZSArIDEpfQogICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgTmV4dAogICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICBgIDogIiJ9CiAgICAgIDwvZGl2PgogICAgYDsKICB9Cn07Cl9pbml0NCA9IF9fZGVjb3JhdG9yU3RhcnQoX2E3KTsKX2RhdGFiYXNlTmFtZTMgPSBuZXcgV2Vha01hcCgpOwpfY29sbGVjdGlvbk5hbWUyID0gbmV3IFdlYWtNYXAoKTsKX2RvY3VtZW50cyA9IG5ldyBXZWFrTWFwKCk7Cl90b3RhbCA9IG5ldyBXZWFrTWFwKCk7Cl9wYWdlID0gbmV3IFdlYWtNYXAoKTsKX3BhZ2VTaXplID0gbmV3IFdlYWtNYXAoKTsKX2xvYWRpbmcyID0gbmV3IFdlYWtNYXAoKTsKX2ZpbHRlclRleHQgPSBuZXcgV2Vha01hcCgpOwpfc2VsZWN0ZWRJZCA9IG5ldyBXZWFrTWFwKCk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NCwgNCwgImRhdGFiYXNlTmFtZSIsIF9kYXRhYmFzZU5hbWVfZGVjMywgVHN2aWV3TW9uZ29Eb2N1bWVudHMsIF9kYXRhYmFzZU5hbWUzKTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ0LCA0LCAiY29sbGVjdGlvbk5hbWUiLCBfY29sbGVjdGlvbk5hbWVfZGVjMiwgVHN2aWV3TW9uZ29Eb2N1bWVudHMsIF9jb2xsZWN0aW9uTmFtZTIpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDQsIDQsICJkb2N1bWVudHMiLCBfZG9jdW1lbnRzX2RlYywgVHN2aWV3TW9uZ29Eb2N1bWVudHMsIF9kb2N1bWVudHMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDQsIDQsICJ0b3RhbCIsIF90b3RhbF9kZWMsIFRzdmlld01vbmdvRG9jdW1lbnRzLCBfdG90YWwpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDQsIDQsICJwYWdlIiwgX3BhZ2VfZGVjLCBUc3ZpZXdNb25nb0RvY3VtZW50cywgX3BhZ2UpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDQsIDQsICJwYWdlU2l6ZSIsIF9wYWdlU2l6ZV9kZWMsIFRzdmlld01vbmdvRG9jdW1lbnRzLCBfcGFnZVNpemUpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDQsIDQsICJsb2FkaW5nIiwgX2xvYWRpbmdfZGVjMiwgVHN2aWV3TW9uZ29Eb2N1bWVudHMsIF9sb2FkaW5nMik7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NCwgNCwgImZpbHRlclRleHQiLCBfZmlsdGVyVGV4dF9kZWMsIFRzdmlld01vbmdvRG9jdW1lbnRzLCBfZmlsdGVyVGV4dCk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NCwgNCwgInNlbGVjdGVkSWQiLCBfc2VsZWN0ZWRJZF9kZWMsIFRzdmlld01vbmdvRG9jdW1lbnRzLCBfc2VsZWN0ZWRJZCk7ClRzdmlld01vbmdvRG9jdW1lbnRzID0gX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ0LCAwLCAiVHN2aWV3TW9uZ29Eb2N1bWVudHMiLCBfVHN2aWV3TW9uZ29Eb2N1bWVudHNfZGVjb3JhdG9ycywgVHN2aWV3TW9uZ29Eb2N1bWVudHMpOwpfX3B1YmxpY0ZpZWxkKFRzdmlld01vbmdvRG9jdW1lbnRzLCAic3R5bGVzIiwgWwogIGNzc01hbmFnZXI2LmRlZmF1bHRTdHlsZXMsCiAgdGhlbWVTdHlsZXMsCiAgY3NzNmAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuZG9jdW1lbnRzLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmZpbHRlci1iYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMzMzM7CiAgICAgIH0KCiAgICAgIC5maWx0ZXItaW5wdXQgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM0NDQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICB9CgogICAgICAuZmlsdGVyLWlucHV0OmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJvcmRlci1jb2xvcjogIzQwNDA0MDsKICAgICAgfQoKICAgICAgLmZpbHRlci1pbnB1dDo6cGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAuZmlsdGVyLWJ0biB7CiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM0MDQwNDA7CiAgICAgICAgY29sb3I6ICNlMGUwZTA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgIC5maWx0ZXItYnRuOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpOwogICAgICB9CgogICAgICAuZG9jdW1lbnRzLWxpc3QgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgIH0KCiAgICAgIC5kb2N1bWVudC1yb3cgewogICAgICAgIHBhZGRpbmc6IDEwcHggMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzOwogICAgICB9CgogICAgICAuZG9jdW1lbnQtcm93OmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgICB9CgogICAgICAuZG9jdW1lbnQtcm93LnNlbGVjdGVkIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSk7CiAgICAgIH0KCiAgICAgIC5kb2N1bWVudC1pZCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAjZTBlMGUwOwogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNHB4OwogICAgICB9CgogICAgICAuZG9jdW1lbnQtcHJldmlldyB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLnBhZ2luYXRpb24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgIzMzMzsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6ICM4ODg7CiAgICAgIH0KCiAgICAgIC5wYWdpbmF0aW9uLWluZm8gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDhweDsKICAgICAgfQoKICAgICAgLnBhZ2luYXRpb24tY29udHJvbHMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiA0cHg7CiAgICAgIH0KCiAgICAgIC5wYWdlLWJ0biB7CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzQ0NDsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgfQoKICAgICAgLnBhZ2UtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgICAgICBib3JkZXItY29sb3I6ICM2NjY7CiAgICAgICAgY29sb3I6ICNhYWE7CiAgICAgIH0KCiAgICAgIC5wYWdlLWJ0bjpkaXNhYmxlZCB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAyMDBweDsKICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgfQoKICAgICAgLmxvYWRpbmctc3RhdGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBoZWlnaHQ6IDIwMHB4OwogICAgICAgIGNvbG9yOiAjODg4OwogICAgICB9CgogICAgICAuYWN0aW9ucy1iYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzMzMzsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idG4gewogICAgICAgIHBhZGRpbmc6IDZweCAxMnB4OwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzQsIDE5NywgOTQsIDAuMik7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzIyYzU1ZTsKICAgICAgICBjb2xvcjogIzRhZGU4MDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgfQoKICAgICAgLmFjdGlvbi1idG46aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzQsIDE5NywgOTQsIDAuMyk7CiAgICAgIH0KICAgIGAKXSk7Cl9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NCwgMSwgVHN2aWV3TW9uZ29Eb2N1bWVudHMpOwoKLy8gdHNfd2ViL2VsZW1lbnRzL3Rzdmlldy1tb25nby1kb2N1bWVudC50cwp2YXIgX2Vycm9yX2RlYywgX2hhc0NoYW5nZXNfZGVjLCBfb3JpZ2luYWxDb250ZW50X2RlYywgX2VkaXRpbmdfZGVjLCBfbG9hZGluZ19kZWMzLCBfZG9jdW1lbnRfZGVjLCBfZG9jdW1lbnRJZF9kZWMsIF9jb2xsZWN0aW9uTmFtZV9kZWMzLCBfZGF0YWJhc2VOYW1lX2RlYzQsIF9hOCwgX1Rzdmlld01vbmdvRG9jdW1lbnRfZGVjb3JhdG9ycywgX2luaXQ1LCBfZGF0YWJhc2VOYW1lNCwgX2NvbGxlY3Rpb25OYW1lMywgX2RvY3VtZW50SWQsIF9kb2N1bWVudCwgX2xvYWRpbmczLCBfZWRpdGluZywgX29yaWdpbmFsQ29udGVudCwgX2hhc0NoYW5nZXMsIF9lcnJvcjsKdmFyIHsgaHRtbDogaHRtbDEyLCBjc3M6IGNzczcsIGNzc01hbmFnZXI6IGNzc01hbmFnZXI3LCBjdXN0b21FbGVtZW50OiBjdXN0b21FbGVtZW50NywgcHJvcGVydHk6IHByb3BlcnR5NSwgc3RhdGU6IHN0YXRlNiwgRGVlc0VsZW1lbnQ6IERlZXNFbGVtZW50NyB9ID0gcGx1Z2luc19leHBvcnRzNTsKX1Rzdmlld01vbmdvRG9jdW1lbnRfZGVjb3JhdG9ycyA9IFtjdXN0b21FbGVtZW50NygidHN2aWV3LW1vbmdvLWRvY3VtZW50IildOwp2YXIgVHN2aWV3TW9uZ29Eb2N1bWVudCA9IGNsYXNzIGV4dGVuZHMgKF9hOCA9IERlZXNFbGVtZW50NywgX2RhdGFiYXNlTmFtZV9kZWM0ID0gW3Byb3BlcnR5NSh7IHR5cGU6IFN0cmluZyB9KV0sIF9jb2xsZWN0aW9uTmFtZV9kZWMzID0gW3Byb3BlcnR5NSh7IHR5cGU6IFN0cmluZyB9KV0sIF9kb2N1bWVudElkX2RlYyA9IFtwcm9wZXJ0eTUoeyB0eXBlOiBTdHJpbmcgfSldLCBfZG9jdW1lbnRfZGVjID0gW3N0YXRlNigpXSwgX2xvYWRpbmdfZGVjMyA9IFtzdGF0ZTYoKV0sIF9lZGl0aW5nX2RlYyA9IFtzdGF0ZTYoKV0sIF9vcmlnaW5hbENvbnRlbnRfZGVjID0gW3N0YXRlNigpXSwgX2hhc0NoYW5nZXNfZGVjID0gW3N0YXRlNigpXSwgX2Vycm9yX2RlYyA9IFtzdGF0ZTYoKV0sIF9hOCkgewogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfZGF0YWJhc2VOYW1lNCwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ1LCA4LCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDUsIDExLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfY29sbGVjdGlvbk5hbWUzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDUsIDEyLCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDUsIDE1LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfZG9jdW1lbnRJZCwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ1LCAxNiwgdGhpcywgIiIpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ1LCAxOSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2RvY3VtZW50LCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDUsIDIwLCB0aGlzLCBudWxsKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NSwgMjMsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9sb2FkaW5nMywgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ1LCAyNCwgdGhpcywgZmFsc2UpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ1LCAyNywgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2VkaXRpbmcsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NSwgMjgsIHRoaXMsIGZhbHNlKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NSwgMzEsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9vcmlnaW5hbENvbnRlbnQsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NSwgMzIsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NSwgMzUsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9oYXNDaGFuZ2VzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDUsIDM2LCB0aGlzLCBmYWxzZSkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDUsIDM5LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfZXJyb3IsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NSwgNDAsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NSwgNDMsIHRoaXMpOwogIH0KICB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJkb2N1bWVudElkIikpIHsKICAgICAgdGhpcy5lZGl0aW5nID0gZmFsc2U7CiAgICAgIHRoaXMuaGFzQ2hhbmdlcyA9IGZhbHNlOwogICAgICBpZiAodGhpcy5kb2N1bWVudElkKSB7CiAgICAgICAgdGhpcy5sb2FkRG9jdW1lbnQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmRvY3VtZW50ID0gbnVsbDsKICAgICAgICB0aGlzLm9yaWdpbmFsQ29udGVudCA9ICIiOwogICAgICB9CiAgICB9CiAgfQogIGFzeW5jIGxvYWREb2N1bWVudCgpIHsKICAgIGlmICghdGhpcy5kb2N1bWVudElkIHx8ICF0aGlzLmRhdGFiYXNlTmFtZSB8fCAhdGhpcy5jb2xsZWN0aW9uTmFtZSkgcmV0dXJuOwogICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTsKICAgIHRoaXMuZXJyb3IgPSAiIjsKICAgIHRyeSB7CiAgICAgIHRoaXMuZG9jdW1lbnQgPSBhd2FpdCBhcGlTZXJ2aWNlLmdldERvY3VtZW50KAogICAgICAgIHRoaXMuZGF0YWJhc2VOYW1lLAogICAgICAgIHRoaXMuY29sbGVjdGlvbk5hbWUsCiAgICAgICAgdGhpcy5kb2N1bWVudElkCiAgICAgICk7CiAgICAgIHRoaXMub3JpZ2luYWxDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkodGhpcy5kb2N1bWVudCwgbnVsbCwgMik7CiAgICAgIHRoaXMuaGFzQ2hhbmdlcyA9IGZhbHNlOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGxvYWRpbmcgZG9jdW1lbnQ6IiwgZXJyKTsKICAgICAgdGhpcy5lcnJvciA9ICJGYWlsZWQgdG8gbG9hZCBkb2N1bWVudCI7CiAgICB9CiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICB9CiAgc3RhcnRFZGl0aW5nKCkgewogICAgdGhpcy5lZGl0aW5nID0gdHJ1ZTsKICB9CiAgY2FuY2VsRWRpdGluZygpIHsKICAgIHRoaXMuZWRpdGluZyA9IGZhbHNlOwogICAgY29uc3QgY29kZUVkaXRvciA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcigiZGVlcy1pbnB1dC1jb2RlIik7CiAgICBpZiAoY29kZUVkaXRvcikgewogICAgICBjb2RlRWRpdG9yLnZhbHVlID0gdGhpcy5vcmlnaW5hbENvbnRlbnQ7CiAgICB9CiAgICB0aGlzLmhhc0NoYW5nZXMgPSBmYWxzZTsKICB9CiAgaGFuZGxlQ29udGVudENoYW5nZShlMTEpIHsKICAgIGNvbnN0IG5ld1ZhbHVlID0gZTExLmRldGFpbDsKICAgIHRoaXMuaGFzQ2hhbmdlcyA9IG5ld1ZhbHVlICE9PSB0aGlzLm9yaWdpbmFsQ29udGVudDsKICB9CiAgaGFuZGxlRGlzY2FyZCgpIHsKICAgIGNvbnN0IGNvZGVFZGl0b3IgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtY29kZSIpOwogICAgaWYgKGNvZGVFZGl0b3IpIHsKICAgICAgY29kZUVkaXRvci52YWx1ZSA9IHRoaXMub3JpZ2luYWxDb250ZW50OwogICAgfQogICAgdGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7CiAgfQogIGFzeW5jIHNhdmVEb2N1bWVudCgpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGNvZGVFZGl0b3IgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoImRlZXMtaW5wdXQtY29kZSIpOwogICAgICBjb25zdCBjb250ZW50MyA9IGNvZGVFZGl0b3I/LnZhbHVlIHx8IHRoaXMub3JpZ2luYWxDb250ZW50OwogICAgICBjb25zdCB1cGRhdGVkRG9jID0gSlNPTi5wYXJzZShjb250ZW50Myk7CiAgICAgIGNvbnN0IHsgX2lkLCAuLi51cGRhdGVGaWVsZHMgfSA9IHVwZGF0ZWREb2M7CiAgICAgIGF3YWl0IGFwaVNlcnZpY2UudXBkYXRlRG9jdW1lbnQoCiAgICAgICAgdGhpcy5kYXRhYmFzZU5hbWUsCiAgICAgICAgdGhpcy5jb2xsZWN0aW9uTmFtZSwKICAgICAgICB0aGlzLmRvY3VtZW50SWQsCiAgICAgICAgdXBkYXRlRmllbGRzCiAgICAgICk7CiAgICAgIHRoaXMuZWRpdGluZyA9IGZhbHNlOwogICAgICB0aGlzLmhhc0NoYW5nZXMgPSBmYWxzZTsKICAgICAgYXdhaXQgdGhpcy5sb2FkRG9jdW1lbnQoKTsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KAogICAgICAgIG5ldyBDdXN0b21FdmVudCgiZG9jdW1lbnQtdXBkYXRlZCIsIHsKICAgICAgICAgIGRldGFpbDogeyBkb2N1bWVudElkOiB0aGlzLmRvY3VtZW50SWQgfSwKICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgIH0pCiAgICAgICk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY29uc29sZS5lcnJvcigiRXJyb3Igc2F2aW5nIGRvY3VtZW50OiIsIGVycik7CiAgICAgIHRoaXMuZXJyb3IgPSAiSW52YWxpZCBKU09OIG9yIHNhdmUgZmFpbGVkIjsKICAgIH0KICB9CiAgYXN5bmMgZGVsZXRlRG9jdW1lbnQoKSB7CiAgICBpZiAoIWNvbmZpcm0oIkRlbGV0ZSB0aGlzIGRvY3VtZW50PyIpKSByZXR1cm47CiAgICB0cnkgewogICAgICBhd2FpdCBhcGlTZXJ2aWNlLmRlbGV0ZURvY3VtZW50KAogICAgICAgIHRoaXMuZGF0YWJhc2VOYW1lLAogICAgICAgIHRoaXMuY29sbGVjdGlvbk5hbWUsCiAgICAgICAgdGhpcy5kb2N1bWVudElkCiAgICAgICk7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgKICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoImRvY3VtZW50LWRlbGV0ZWQiLCB7CiAgICAgICAgICBkZXRhaWw6IHsgZG9jdW1lbnRJZDogdGhpcy5kb2N1bWVudElkIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KQogICAgICApOwogICAgICB0aGlzLmRvY3VtZW50ID0gbnVsbDsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBjb25zb2xlLmVycm9yKCJFcnJvciBkZWxldGluZyBkb2N1bWVudDoiLCBlcnIpOwogICAgICB0aGlzLmVycm9yID0gIkRlbGV0ZSBmYWlsZWQiOwogICAgfQogIH0KICByZW5kZXIoKSB7CiAgICBpZiAoIXRoaXMuZG9jdW1lbnRJZCkgewogICAgICByZXR1cm4gaHRtbDEyYAogICAgICAgIDxkaXYgY2xhc3M9ImRvY3VtZW50LWNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+CiAgICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQgMkg2YTIgMiAwIDAgMC0yIDJ2MTZhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0yVjh6IiAvPgogICAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9IjE0IDIgMTQgOCAyMCA4IiAvPgogICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgPHA+U2VsZWN0IGEgZG9jdW1lbnQgdG8gdmlldzwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgfQogICAgaWYgKHRoaXMubG9hZGluZykgewogICAgICByZXR1cm4gaHRtbDEyYAogICAgICAgIDxkaXYgY2xhc3M9ImRvY3VtZW50LWNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2FkaW5nLXN0YXRlIj5Mb2FkaW5nLi4uPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIGA7CiAgICB9CiAgICBpZiAodGhpcy5lcnJvciAmJiAhdGhpcy5kb2N1bWVudCkgewogICAgICByZXR1cm4gaHRtbDEyYAogICAgICAgIDxkaXYgY2xhc3M9ImRvY3VtZW50LWNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJlcnJvci1zdGF0ZSI+JHt0aGlzLmVycm9yfTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgfQogICAgcmV0dXJuIGh0bWwxMmAKICAgICAgPGRpdiBjbGFzcz0iZG9jdW1lbnQtY29udGFpbmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImhlYWRlci10aXRsZSI+RG9jdW1lbnQ8L3NwYW4+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItYWN0aW9ucyI+CiAgICAgICAgICAgICR7dGhpcy5lZGl0aW5nID8gdGhpcy5oYXNDaGFuZ2VzID8gaHRtbDEyYAogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImFjdGlvbi1idG4iIEBjbGljaz0ke3RoaXMuaGFuZGxlRGlzY2FyZH0+RGlzY2FyZDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImFjdGlvbi1idG4gcHJpbWFyeSIgQGNsaWNrPSR7dGhpcy5zYXZlRG9jdW1lbnR9PlNhdmU8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgYCA6IGh0bWwxMmAKICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhY3Rpb24tYnRuIiBAY2xpY2s9JHt0aGlzLmNhbmNlbEVkaXRpbmd9PkNhbmNlbDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICBgIDogaHRtbDEyYAogICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhY3Rpb24tYnRuIiBAY2xpY2s9JHt0aGlzLnN0YXJ0RWRpdGluZ30+RWRpdDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhY3Rpb24tYnRuIGRhbmdlciIgQGNsaWNrPSR7dGhpcy5kZWxldGVEb2N1bWVudH0+RGVsZXRlPC9idXR0b24+CiAgICAgICAgICAgICAgICBgfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgICAgPGRlZXMtaW5wdXQtY29kZQogICAgICAgICAgICAudmFsdWU9JHt0aGlzLm9yaWdpbmFsQ29udGVudH0KICAgICAgICAgICAgLmxhbmd1YWdlPSR7Impzb24ifQogICAgICAgICAgICAuZGlzYWJsZWQ9JHshdGhpcy5lZGl0aW5nfQogICAgICAgICAgICBAY29udGVudC1jaGFuZ2U9JHsoZTExKSA9PiB0aGlzLmhhbmRsZUNvbnRlbnRDaGFuZ2UoZTExKX0KICAgICAgICAgID48L2RlZXMtaW5wdXQtY29kZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KfTsKX2luaXQ1ID0gX19kZWNvcmF0b3JTdGFydChfYTgpOwpfZGF0YWJhc2VOYW1lNCA9IG5ldyBXZWFrTWFwKCk7Cl9jb2xsZWN0aW9uTmFtZTMgPSBuZXcgV2Vha01hcCgpOwpfZG9jdW1lbnRJZCA9IG5ldyBXZWFrTWFwKCk7Cl9kb2N1bWVudCA9IG5ldyBXZWFrTWFwKCk7Cl9sb2FkaW5nMyA9IG5ldyBXZWFrTWFwKCk7Cl9lZGl0aW5nID0gbmV3IFdlYWtNYXAoKTsKX29yaWdpbmFsQ29udGVudCA9IG5ldyBXZWFrTWFwKCk7Cl9oYXNDaGFuZ2VzID0gbmV3IFdlYWtNYXAoKTsKX2Vycm9yID0gbmV3IFdlYWtNYXAoKTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ1LCA0LCAiZGF0YWJhc2VOYW1lIiwgX2RhdGFiYXNlTmFtZV9kZWM0LCBUc3ZpZXdNb25nb0RvY3VtZW50LCBfZGF0YWJhc2VOYW1lNCk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NSwgNCwgImNvbGxlY3Rpb25OYW1lIiwgX2NvbGxlY3Rpb25OYW1lX2RlYzMsIFRzdmlld01vbmdvRG9jdW1lbnQsIF9jb2xsZWN0aW9uTmFtZTMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDUsIDQsICJkb2N1bWVudElkIiwgX2RvY3VtZW50SWRfZGVjLCBUc3ZpZXdNb25nb0RvY3VtZW50LCBfZG9jdW1lbnRJZCk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NSwgNCwgImRvY3VtZW50IiwgX2RvY3VtZW50X2RlYywgVHN2aWV3TW9uZ29Eb2N1bWVudCwgX2RvY3VtZW50KTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ1LCA0LCAibG9hZGluZyIsIF9sb2FkaW5nX2RlYzMsIFRzdmlld01vbmdvRG9jdW1lbnQsIF9sb2FkaW5nMyk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NSwgNCwgImVkaXRpbmciLCBfZWRpdGluZ19kZWMsIFRzdmlld01vbmdvRG9jdW1lbnQsIF9lZGl0aW5nKTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ1LCA0LCAib3JpZ2luYWxDb250ZW50IiwgX29yaWdpbmFsQ29udGVudF9kZWMsIFRzdmlld01vbmdvRG9jdW1lbnQsIF9vcmlnaW5hbENvbnRlbnQpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDUsIDQsICJoYXNDaGFuZ2VzIiwgX2hhc0NoYW5nZXNfZGVjLCBUc3ZpZXdNb25nb0RvY3VtZW50LCBfaGFzQ2hhbmdlcyk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NSwgNCwgImVycm9yIiwgX2Vycm9yX2RlYywgVHN2aWV3TW9uZ29Eb2N1bWVudCwgX2Vycm9yKTsKVHN2aWV3TW9uZ29Eb2N1bWVudCA9IF9fZGVjb3JhdGVFbGVtZW50KF9pbml0NSwgMCwgIlRzdmlld01vbmdvRG9jdW1lbnQiLCBfVHN2aWV3TW9uZ29Eb2N1bWVudF9kZWNvcmF0b3JzLCBUc3ZpZXdNb25nb0RvY3VtZW50KTsKX19wdWJsaWNGaWVsZChUc3ZpZXdNb25nb0RvY3VtZW50LCAic3R5bGVzIiwgWwogIGNzc01hbmFnZXI3LmRlZmF1bHRTdHlsZXMsCiAgdGhlbWVTdHlsZXMsCiAgY3NzN2AKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmRvY3VtZW50LWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmhlYWRlciB7CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzMzMzsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAuaGVhZGVyLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLmhlYWRlci1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogOHB4OwogICAgICB9CgogICAgICAuYWN0aW9uLWJ0biB7CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzQ0NDsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXM7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnRuOmhvdmVyIHsKICAgICAgICBib3JkZXItY29sb3I6ICM2NjY7CiAgICAgICAgY29sb3I6ICNhYWE7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnRuLnByaW1hcnkgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgICAgICBib3JkZXItY29sb3I6ICM0MDQwNDA7CiAgICAgICAgY29sb3I6ICNlMGUwZTA7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnRuLnByaW1hcnk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSk7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnRuLmRhbmdlciB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyMzksIDY4LCA2OCwgMC4yKTsKICAgICAgICBib3JkZXItY29sb3I6ICNlZjQ0NDQ7CiAgICAgICAgY29sb3I6ICNmODcxNzE7CiAgICAgIH0KCiAgICAgIC5hY3Rpb24tYnRuLmRhbmdlcjpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyMzksIDY4LCA2OCwgMC4zKTsKICAgICAgfQoKICAgICAgLmNvbnRlbnQgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KCiAgICAgIC5jb250ZW50IGRlZXMtaW5wdXQtY29kZSB7CiAgICAgICAgZmxleDogMTsKICAgICAgfQoKICAgICAgLmVtcHR5LXN0YXRlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZSBzdmcgewogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgfQoKICAgICAgLmxvYWRpbmctc3RhdGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgY29sb3I6ICM4ODg7CiAgICAgIH0KCiAgICAgIC5lcnJvci1zdGF0ZSB7CiAgICAgICAgcGFkZGluZzogMTZweDsKICAgICAgICBjb2xvcjogI2Y4NzE3MTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KICAgIGAKXSk7Cl9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NSwgMSwgVHN2aWV3TW9uZ29Eb2N1bWVudCk7CgovLyB0c193ZWIvZWxlbWVudHMvdHN2aWV3LW1vbmdvLWluZGV4ZXMudHMKdmFyIF9uZXdJbmRleFNwYXJzZV9kZWMsIF9uZXdJbmRleFVuaXF1ZV9kZWMsIF9uZXdJbmRleEtleXNfZGVjLCBfc2hvd0NyZWF0ZURpYWxvZ19kZWMsIF9sb2FkaW5nX2RlYzQsIF9pbmRleGVzX2RlYywgX2NvbGxlY3Rpb25OYW1lX2RlYzQsIF9kYXRhYmFzZU5hbWVfZGVjNSwgX2E5LCBfVHN2aWV3TW9uZ29JbmRleGVzX2RlY29yYXRvcnMsIF9pbml0NiwgX2RhdGFiYXNlTmFtZTUsIF9jb2xsZWN0aW9uTmFtZTQsIF9pbmRleGVzLCBfbG9hZGluZzQsIF9zaG93Q3JlYXRlRGlhbG9nLCBfbmV3SW5kZXhLZXlzLCBfbmV3SW5kZXhVbmlxdWUsIF9uZXdJbmRleFNwYXJzZTsKdmFyIHsgaHRtbDogaHRtbDEzLCBjc3M6IGNzczgsIGNzc01hbmFnZXI6IGNzc01hbmFnZXI4LCBjdXN0b21FbGVtZW50OiBjdXN0b21FbGVtZW50OCwgcHJvcGVydHk6IHByb3BlcnR5Niwgc3RhdGU6IHN0YXRlNywgRGVlc0VsZW1lbnQ6IERlZXNFbGVtZW50OCB9ID0gcGx1Z2luc19leHBvcnRzNTsKX1Rzdmlld01vbmdvSW5kZXhlc19kZWNvcmF0b3JzID0gW2N1c3RvbUVsZW1lbnQ4KCJ0c3ZpZXctbW9uZ28taW5kZXhlcyIpXTsKdmFyIFRzdmlld01vbmdvSW5kZXhlcyA9IGNsYXNzIGV4dGVuZHMgKF9hOSA9IERlZXNFbGVtZW50OCwgX2RhdGFiYXNlTmFtZV9kZWM1ID0gW3Byb3BlcnR5Nih7IHR5cGU6IFN0cmluZyB9KV0sIF9jb2xsZWN0aW9uTmFtZV9kZWM0ID0gW3Byb3BlcnR5Nih7IHR5cGU6IFN0cmluZyB9KV0sIF9pbmRleGVzX2RlYyA9IFtzdGF0ZTcoKV0sIF9sb2FkaW5nX2RlYzQgPSBbc3RhdGU3KCldLCBfc2hvd0NyZWF0ZURpYWxvZ19kZWMgPSBbc3RhdGU3KCldLCBfbmV3SW5kZXhLZXlzX2RlYyA9IFtzdGF0ZTcoKV0sIF9uZXdJbmRleFVuaXF1ZV9kZWMgPSBbc3RhdGU3KCldLCBfbmV3SW5kZXhTcGFyc2VfZGVjID0gW3N0YXRlNygpXSwgX2E5KSB7CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9kYXRhYmFzZU5hbWU1LCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDYsIDgsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NiwgMTEsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9jb2xsZWN0aW9uTmFtZTQsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NiwgMTIsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NiwgMTUsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9pbmRleGVzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDYsIDE2LCB0aGlzLCBbXSkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDYsIDE5LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfbG9hZGluZzQsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NiwgMjAsIHRoaXMsIGZhbHNlKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NiwgMjMsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9zaG93Q3JlYXRlRGlhbG9nLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDYsIDI0LCB0aGlzLCBmYWxzZSkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDYsIDI3LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfbmV3SW5kZXhLZXlzLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDYsIDI4LCB0aGlzLCAiIikpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDYsIDMxLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfbmV3SW5kZXhVbmlxdWUsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NiwgMzIsIHRoaXMsIGZhbHNlKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NiwgMzUsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9uZXdJbmRleFNwYXJzZSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ2LCAzNiwgdGhpcywgZmFsc2UpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ2LCAzOSwgdGhpcyk7CiAgfQogIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgIGF3YWl0IHRoaXMubG9hZEluZGV4ZXMoKTsKICB9CiAgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykgewogICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygiZGF0YWJhc2VOYW1lIikgfHwgY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJjb2xsZWN0aW9uTmFtZSIpKSB7CiAgICAgIHRoaXMubG9hZEluZGV4ZXMoKTsKICAgIH0KICB9CiAgYXN5bmMgbG9hZEluZGV4ZXMoKSB7CiAgICBpZiAoIXRoaXMuZGF0YWJhc2VOYW1lIHx8ICF0aGlzLmNvbGxlY3Rpb25OYW1lKSByZXR1cm47CiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlOwogICAgdHJ5IHsKICAgICAgdGhpcy5pbmRleGVzID0gYXdhaXQgYXBpU2VydmljZS5saXN0SW5kZXhlcyh0aGlzLmRhdGFiYXNlTmFtZSwgdGhpcy5jb2xsZWN0aW9uTmFtZSk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgbG9hZGluZyBpbmRleGVzOiIsIGVycik7CiAgICAgIHRoaXMuaW5kZXhlcyA9IFtdOwogICAgfQogICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgfQogIG9wZW5DcmVhdGVEaWFsb2coKSB7CiAgICB0aGlzLm5ld0luZGV4S2V5cyA9ICIiOwogICAgdGhpcy5uZXdJbmRleFVuaXF1ZSA9IGZhbHNlOwogICAgdGhpcy5uZXdJbmRleFNwYXJzZSA9IGZhbHNlOwogICAgdGhpcy5zaG93Q3JlYXRlRGlhbG9nID0gdHJ1ZTsKICB9CiAgY2xvc2VDcmVhdGVEaWFsb2coKSB7CiAgICB0aGlzLnNob3dDcmVhdGVEaWFsb2cgPSBmYWxzZTsKICB9CiAgYXN5bmMgY3JlYXRlSW5kZXgoKSB7CiAgICB0cnkgewogICAgICBjb25zdCBrZXlzMiA9IEpTT04ucGFyc2UodGhpcy5uZXdJbmRleEtleXMpOwogICAgICBhd2FpdCBhcGlTZXJ2aWNlLmNyZWF0ZUluZGV4KHRoaXMuZGF0YWJhc2VOYW1lLCB0aGlzLmNvbGxlY3Rpb25OYW1lLCBrZXlzMiwgewogICAgICAgIHVuaXF1ZTogdGhpcy5uZXdJbmRleFVuaXF1ZSwKICAgICAgICBzcGFyc2U6IHRoaXMubmV3SW5kZXhTcGFyc2UKICAgICAgfSk7CiAgICAgIHRoaXMuY2xvc2VDcmVhdGVEaWFsb2coKTsKICAgICAgYXdhaXQgdGhpcy5sb2FkSW5kZXhlcygpOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGNyZWF0aW5nIGluZGV4OiIsIGVycik7CiAgICAgIGFsZXJ0KCJJbnZhbGlkIEpTT04gb3IgaW5kZXggY3JlYXRpb24gZmFpbGVkIik7CiAgICB9CiAgfQogIGFzeW5jIGRyb3BJbmRleChpbmRleE5hbWUpIHsKICAgIGlmIChpbmRleE5hbWUgPT09ICJfaWRfIikgewogICAgICBhbGVydCgiQ2Fubm90IGRyb3AgdGhlIF9pZCBpbmRleCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIWNvbmZpcm0oYERyb3AgaW5kZXggIiR7aW5kZXhOYW1lfSI/YCkpIHJldHVybjsKICAgIHRyeSB7CiAgICAgIGF3YWl0IGFwaVNlcnZpY2UuZHJvcEluZGV4KHRoaXMuZGF0YWJhc2VOYW1lLCB0aGlzLmNvbGxlY3Rpb25OYW1lLCBpbmRleE5hbWUpOwogICAgICBhd2FpdCB0aGlzLmxvYWRJbmRleGVzKCk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY29uc29sZS5lcnJvcigiRXJyb3IgZHJvcHBpbmcgaW5kZXg6IiwgZXJyKTsKICAgIH0KICB9CiAgZm9ybWF0S2V5cyhrZXlzMikgewogICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGtleXMyKTsKICB9CiAgcmVuZGVyKCkgewogICAgcmV0dXJuIGh0bWwxM2AKICAgICAgPGRpdiBjbGFzcz0iaW5kZXhlcy1jb250YWluZXIiPgogICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXIiPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY3JlYXRlLWJ0biIgQGNsaWNrPSR7dGhpcy5vcGVuQ3JlYXRlRGlhbG9nfT4rIENyZWF0ZSBJbmRleDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJpbmRleGVzLWxpc3QiPgogICAgICAgICAgJHt0aGlzLmxvYWRpbmcgPyBodG1sMTNgPGRpdiBjbGFzcz0ibG9hZGluZy1zdGF0ZSI+TG9hZGluZy4uLjwvZGl2PmAgOiB0aGlzLmluZGV4ZXMubGVuZ3RoID09PSAwID8gaHRtbDEzYDxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlIj5ObyBpbmRleGVzIGZvdW5kPC9kaXY+YCA6IHRoaXMuaW5kZXhlcy5tYXAoCiAgICAgIChpZHgpID0+IGh0bWwxM2AKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmRleC1jYXJkIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImluZGV4LWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpbmRleC1uYW1lIj4ke2lkeC5uYW1lfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5kZXgtYmFkZ2VzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAke2lkeC51bmlxdWUgPyBodG1sMTNgPHNwYW4gY2xhc3M9ImJhZGdlIHVuaXF1ZSI+dW5pcXVlPC9zcGFuPmAgOiAiIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAke2lkeC5zcGFyc2UgPyBodG1sMTNgPHNwYW4gY2xhc3M9ImJhZGdlIHNwYXJzZSI+c3BhcnNlPC9zcGFuPmAgOiAiIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImluZGV4LWtleXMiPiR7dGhpcy5mb3JtYXRLZXlzKGlkeC5rZXlzKX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImluZGV4LWFjdGlvbnMiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImRyb3AtYnRuIgogICAgICAgICAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD0ke2lkeC5uYW1lID09PSAiX2lkXyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gdGhpcy5kcm9wSW5kZXgoaWR4Lm5hbWUpfQogICAgICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgRHJvcAogICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICBgCiAgICApfQogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgICR7dGhpcy5zaG93Q3JlYXRlRGlhbG9nID8gaHRtbDEzYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctb3ZlcmxheSIgQGNsaWNrPSR7dGhpcy5jbG9zZUNyZWF0ZURpYWxvZ30+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nIiBAY2xpY2s9JHsoZTExKSA9PiBlMTEuc3RvcFByb3BhZ2F0aW9uKCl9PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj5DcmVhdGUgSW5kZXg8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctZmllbGQiPgogICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImRpYWxvZy1sYWJlbCI+SW5kZXggS2V5cyAoSlNPTik8L2xhYmVsPgogICAgICAgICAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJkaWFsb2ctaW5wdXQiCiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9J3siZmllbGQiOiAxfScKICAgICAgICAgICAgICAgICAgICAudmFsdWU9JHt0aGlzLm5ld0luZGV4S2V5c30KICAgICAgICAgICAgICAgICAgICBAaW5wdXQ9JHsoZTExKSA9PiB0aGlzLm5ld0luZGV4S2V5cyA9IGUxMS50YXJnZXQudmFsdWV9CiAgICAgICAgICAgICAgICAgIC8+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctZmllbGQiPgogICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImRpYWxvZy1jaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICAgIC5jaGVja2VkPSR7dGhpcy5uZXdJbmRleFVuaXF1ZX0KICAgICAgICAgICAgICAgICAgICAgIEBjaGFuZ2U9JHsoZTExKSA9PiB0aGlzLm5ld0luZGV4VW5pcXVlID0gZTExLnRhcmdldC5jaGVja2VkfQogICAgICAgICAgICAgICAgICAgIC8+CiAgICAgICAgICAgICAgICAgICAgVW5pcXVlCiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctZmllbGQiPgogICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImRpYWxvZy1jaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICAgIC5jaGVja2VkPSR7dGhpcy5uZXdJbmRleFNwYXJzZX0KICAgICAgICAgICAgICAgICAgICAgIEBjaGFuZ2U9JHsoZTExKSA9PiB0aGlzLm5ld0luZGV4U3BhcnNlID0gZTExLnRhcmdldC5jaGVja2VkfQogICAgICAgICAgICAgICAgICAgIC8+CiAgICAgICAgICAgICAgICAgICAgU3BhcnNlCiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctYWN0aW9ucyI+CiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRpYWxvZy1idG4gc2Vjb25kYXJ5IiBAY2xpY2s9JHt0aGlzLmNsb3NlQ3JlYXRlRGlhbG9nfT5DYW5jZWw8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGlhbG9nLWJ0biBwcmltYXJ5IiBAY2xpY2s9JHt0aGlzLmNyZWF0ZUluZGV4fT5DcmVhdGU8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIGAgOiAiIn0KICAgIGA7CiAgfQp9OwpfaW5pdDYgPSBfX2RlY29yYXRvclN0YXJ0KF9hOSk7Cl9kYXRhYmFzZU5hbWU1ID0gbmV3IFdlYWtNYXAoKTsKX2NvbGxlY3Rpb25OYW1lNCA9IG5ldyBXZWFrTWFwKCk7Cl9pbmRleGVzID0gbmV3IFdlYWtNYXAoKTsKX2xvYWRpbmc0ID0gbmV3IFdlYWtNYXAoKTsKX3Nob3dDcmVhdGVEaWFsb2cgPSBuZXcgV2Vha01hcCgpOwpfbmV3SW5kZXhLZXlzID0gbmV3IFdlYWtNYXAoKTsKX25ld0luZGV4VW5pcXVlID0gbmV3IFdlYWtNYXAoKTsKX25ld0luZGV4U3BhcnNlID0gbmV3IFdlYWtNYXAoKTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ2LCA0LCAiZGF0YWJhc2VOYW1lIiwgX2RhdGFiYXNlTmFtZV9kZWM1LCBUc3ZpZXdNb25nb0luZGV4ZXMsIF9kYXRhYmFzZU5hbWU1KTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ2LCA0LCAiY29sbGVjdGlvbk5hbWUiLCBfY29sbGVjdGlvbk5hbWVfZGVjNCwgVHN2aWV3TW9uZ29JbmRleGVzLCBfY29sbGVjdGlvbk5hbWU0KTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ2LCA0LCAiaW5kZXhlcyIsIF9pbmRleGVzX2RlYywgVHN2aWV3TW9uZ29JbmRleGVzLCBfaW5kZXhlcyk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NiwgNCwgImxvYWRpbmciLCBfbG9hZGluZ19kZWM0LCBUc3ZpZXdNb25nb0luZGV4ZXMsIF9sb2FkaW5nNCk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NiwgNCwgInNob3dDcmVhdGVEaWFsb2ciLCBfc2hvd0NyZWF0ZURpYWxvZ19kZWMsIFRzdmlld01vbmdvSW5kZXhlcywgX3Nob3dDcmVhdGVEaWFsb2cpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDYsIDQsICJuZXdJbmRleEtleXMiLCBfbmV3SW5kZXhLZXlzX2RlYywgVHN2aWV3TW9uZ29JbmRleGVzLCBfbmV3SW5kZXhLZXlzKTsKX19kZWNvcmF0ZUVsZW1lbnQoX2luaXQ2LCA0LCAibmV3SW5kZXhVbmlxdWUiLCBfbmV3SW5kZXhVbmlxdWVfZGVjLCBUc3ZpZXdNb25nb0luZGV4ZXMsIF9uZXdJbmRleFVuaXF1ZSk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NiwgNCwgIm5ld0luZGV4U3BhcnNlIiwgX25ld0luZGV4U3BhcnNlX2RlYywgVHN2aWV3TW9uZ29JbmRleGVzLCBfbmV3SW5kZXhTcGFyc2UpOwpUc3ZpZXdNb25nb0luZGV4ZXMgPSBfX2RlY29yYXRlRWxlbWVudChfaW5pdDYsIDAsICJUc3ZpZXdNb25nb0luZGV4ZXMiLCBfVHN2aWV3TW9uZ29JbmRleGVzX2RlY29yYXRvcnMsIFRzdmlld01vbmdvSW5kZXhlcyk7Cl9fcHVibGljRmllbGQoVHN2aWV3TW9uZ29JbmRleGVzLCAic3R5bGVzIiwgWwogIGNzc01hbmFnZXI4LmRlZmF1bHRTdHlsZXMsCiAgdGhlbWVTdHlsZXMsCiAgY3NzOGAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuaW5kZXhlcy1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC50b29sYmFyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzMzMzsKICAgICAgfQoKICAgICAgLmNyZWF0ZS1idG4gewogICAgICAgIHBhZGRpbmc6IDhweCAxNnB4OwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzQsIDE5NywgOTQsIDAuMik7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzIyYzU1ZTsKICAgICAgICBjb2xvcjogIzRhZGU4MDsKICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgLmNyZWF0ZS1idG46aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzQsIDE5NywgOTQsIDAuMyk7CiAgICAgIH0KCiAgICAgIC5pbmRleGVzLWxpc3QgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICB9CgogICAgICAuaW5kZXgtY2FyZCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMzMzM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgICAgfQoKICAgICAgLmluZGV4LWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICB9CgogICAgICAuaW5kZXgtbmFtZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgIC5pbmRleC1iYWRnZXMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgIH0KCiAgICAgIC5iYWRnZSB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICAgICAgY29sb3I6ICM4ODg7CiAgICAgIH0KCiAgICAgIC5iYWRnZS51bmlxdWUgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgICAgICBjb2xvcjogI2UwZTBlMDsKICAgICAgfQoKICAgICAgLmJhZGdlLnNwYXJzZSB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTEsIDE5MSwgMzYsIDAuMik7CiAgICAgICAgY29sb3I6ICNmYmJmMjQ7CiAgICAgIH0KCiAgICAgIC5pbmRleC1rZXlzIHsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDEycHg7CiAgICAgIH0KCiAgICAgIC5pbmRleC1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5kcm9wLWJ0biB7CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2VmNDQ0NDsKICAgICAgICBjb2xvcjogI2Y4NzE3MTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgfQoKICAgICAgLmRyb3AtYnRuOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDIzOSwgNjgsIDY4LCAwLjIpOwogICAgICB9CgogICAgICAuZHJvcC1idG46ZGlzYWJsZWQgewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC5sb2FkaW5nLXN0YXRlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAyMDBweDsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgfQoKICAgICAgLyogRGlhbG9nIHN0eWxlcyAqLwogICAgICAuZGlhbG9nLW92ZXJsYXkgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjcpOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB6LWluZGV4OiAxMDAwOwogICAgICB9CgogICAgICAuZGlhbG9nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMWUxZTFlOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMzMzM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgICAgICBwYWRkaW5nOiAyNHB4OwogICAgICAgIHdpZHRoOiA0MDBweDsKICAgICAgICBtYXgtd2lkdGg6IDkwJTsKICAgICAgfQoKICAgICAgLmRpYWxvZy10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgfQoKICAgICAgLmRpYWxvZy1maWVsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICAgICAgfQoKICAgICAgLmRpYWxvZy1sYWJlbCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDZweDsKICAgICAgfQoKICAgICAgLmRpYWxvZy1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM0NDQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICB9CgogICAgICAuZGlhbG9nLWlucHV0OmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJvcmRlci1jb2xvcjogIzQwNDA0MDsKICAgICAgfQoKICAgICAgLmRpYWxvZy1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgLmRpYWxvZy1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMjRweDsKICAgICAgfQoKICAgICAgLmRpYWxvZy1idG4gewogICAgICAgIHBhZGRpbmc6IDhweCAxNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICB9CgogICAgICAuZGlhbG9nLWJ0bi5zZWNvbmRhcnkgewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM0NDQ7CiAgICAgICAgY29sb3I6ICM4ODg7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctYnRuLnNlY29uZGFyeTpob3ZlciB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjNjY2OwogICAgICAgIGNvbG9yOiAjYWFhOwogICAgICB9CgogICAgICAuZGlhbG9nLWJ0bi5wcmltYXJ5IHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzQwNDA0MDsKICAgICAgICBjb2xvcjogI2UwZTBlMDsKICAgICAgfQoKICAgICAgLmRpYWxvZy1idG4ucHJpbWFyeTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTsKICAgICAgfQogICAgYApdKTsKX19ydW5Jbml0aWFsaXplcnMoX2luaXQ2LCAxLCBUc3ZpZXdNb25nb0luZGV4ZXMpOwoKLy8gdHNfd2ViL2VsZW1lbnRzL3Rzdmlldy1tb25nby1kYi1vdmVydmlldy50cwp2YXIgX2Vycm9yX2RlYzIsIF9sb2FkaW5nX2RlYzUsIF9zdGF0c19kZWMyLCBfZGF0YWJhc2VOYW1lX2RlYzYsIF9hMTAsIF9Uc3ZpZXdNb25nb0RiT3ZlcnZpZXdfZGVjb3JhdG9ycywgX2luaXQ3LCBfZGF0YWJhc2VOYW1lNiwgX3N0YXRzMiwgX2xvYWRpbmc1LCBfZXJyb3IyOwp2YXIgeyBodG1sOiBodG1sMTQsIGNzczogY3NzOSwgY3NzTWFuYWdlcjogY3NzTWFuYWdlcjksIGN1c3RvbUVsZW1lbnQ6IGN1c3RvbUVsZW1lbnQ5LCBwcm9wZXJ0eTogcHJvcGVydHk3LCBzdGF0ZTogc3RhdGU4LCBEZWVzRWxlbWVudDogRGVlc0VsZW1lbnQ5IH0gPSBwbHVnaW5zX2V4cG9ydHM1OwpfVHN2aWV3TW9uZ29EYk92ZXJ2aWV3X2RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudDkoInRzdmlldy1tb25nby1kYi1vdmVydmlldyIpXTsKdmFyIFRzdmlld01vbmdvRGJPdmVydmlldyA9IGNsYXNzIGV4dGVuZHMgKF9hMTAgPSBEZWVzRWxlbWVudDksIF9kYXRhYmFzZU5hbWVfZGVjNiA9IFtwcm9wZXJ0eTcoeyB0eXBlOiBTdHJpbmcgfSldLCBfc3RhdHNfZGVjMiA9IFtzdGF0ZTgoKV0sIF9sb2FkaW5nX2RlYzUgPSBbc3RhdGU4KCldLCBfZXJyb3JfZGVjMiA9IFtzdGF0ZTgoKV0sIF9hMTApIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2RhdGFiYXNlTmFtZTYsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NywgOCwgdGhpcywgIiIpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ3LCAxMSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX3N0YXRzMiwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ3LCAxMiwgdGhpcywgbnVsbCkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDcsIDE1LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfbG9hZGluZzUsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NywgMTYsIHRoaXMsIGZhbHNlKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NywgMTksIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9lcnJvcjIsIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NywgMjAsIHRoaXMsICIiKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0NywgMjMsIHRoaXMpOwogIH0KICB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7CiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCJkYXRhYmFzZU5hbWUiKSAmJiB0aGlzLmRhdGFiYXNlTmFtZSkgewogICAgICB0aGlzLmxvYWRTdGF0cygpOwogICAgfQogIH0KICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICBpZiAodGhpcy5kYXRhYmFzZU5hbWUpIHsKICAgICAgYXdhaXQgdGhpcy5sb2FkU3RhdHMoKTsKICAgIH0KICB9CiAgYXN5bmMgbG9hZFN0YXRzKCkgewogICAgaWYgKCF0aGlzLmRhdGFiYXNlTmFtZSkgcmV0dXJuOwogICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTsKICAgIHRoaXMuZXJyb3IgPSAiIjsKICAgIHRyeSB7CiAgICAgIHRoaXMuc3RhdHMgPSBhd2FpdCBhcGlTZXJ2aWNlLmdldERhdGFiYXNlU3RhdHModGhpcy5kYXRhYmFzZU5hbWUpOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGxvYWRpbmcgZGF0YWJhc2Ugc3RhdHM6IiwgZXJyKTsKICAgICAgdGhpcy5lcnJvciA9ICJGYWlsZWQgdG8gbG9hZCBkYXRhYmFzZSBzdGF0aXN0aWNzIjsKICAgIH0KICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOwogIH0KICByZW5kZXIoKSB7CiAgICBpZiAoIXRoaXMuZGF0YWJhc2VOYW1lKSB7CiAgICAgIHJldHVybiBodG1sMTRgCiAgICAgICAgPGRpdiBjbGFzcz0ib3ZlcnZpZXctY29udGFpbmVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlIj4KICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPgogICAgICAgICAgICAgIDxlbGxpcHNlIGN4PSIxMiIgY3k9IjUiIHJ4PSI5IiByeT0iMyI+PC9lbGxpcHNlPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMSAxMmMwIDEuNjYtNCAzLTkgM3MtOS0xLjM0LTktMyI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zIDV2MTRjMCAxLjY2IDQgMyA5IDNzOS0xLjM0IDktM1Y1Ij48L3BhdGg+CiAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICA8cD5TZWxlY3QgYSBkYXRhYmFzZSB0byB2aWV3IG92ZXJ2aWV3PC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIGA7CiAgICB9CiAgICBpZiAodGhpcy5sb2FkaW5nKSB7CiAgICAgIHJldHVybiBodG1sMTRgCiAgICAgICAgPGRpdiBjbGFzcz0ib3ZlcnZpZXctY29udGFpbmVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxvYWRpbmctc3RhdGUiPkxvYWRpbmcgZGF0YWJhc2Ugc3RhdGlzdGljcy4uLjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgfQogICAgaWYgKHRoaXMuZXJyb3IpIHsKICAgICAgcmV0dXJuIGh0bWwxNGAKICAgICAgICA8ZGl2IGNsYXNzPSJvdmVydmlldy1jb250YWluZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZXJyb3Itc3RhdGUiPiR7dGhpcy5lcnJvcn08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgYDsKICAgIH0KICAgIGlmICghdGhpcy5zdGF0cykgewogICAgICByZXR1cm4gaHRtbDE0YAogICAgICAgIDxkaXYgY2xhc3M9Im92ZXJ2aWV3LWNvbnRhaW5lciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+CiAgICAgICAgICAgIDxwPk5vIHN0YXRpc3RpY3MgYXZhaWxhYmxlPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIGA7CiAgICB9CiAgICByZXR1cm4gaHRtbDE0YAogICAgICA8ZGl2IGNsYXNzPSJvdmVydmlldy1jb250YWluZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICA8aDEgY2xhc3M9ImhlYWRlci10aXRsZSI+CiAgICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj4KICAgICAgICAgICAgICA8ZWxsaXBzZSBjeD0iMTIiIGN5PSI1IiByeD0iOSIgcnk9IjMiPjwvZWxsaXBzZT4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMjEgMTJjMCAxLjY2LTQgMy05IDNzLTktMS4zNC05LTMiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMyA1djE0YzAgMS42NiA0IDMgOSAzczktMS4zNCA5LTNWNSI+PC9wYXRoPgogICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgJHt0aGlzLmRhdGFiYXNlTmFtZX0KICAgICAgICAgIDwvaDE+CiAgICAgICAgICA8cCBjbGFzcz0iaGVhZGVyLXN1YnRpdGxlIj5EYXRhYmFzZSBPdmVydmlldzwvcD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5TdG9yYWdlPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0cy1ncmlkIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1jYXJkIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC1sYWJlbCI+Q29sbGVjdGlvbnM8L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtdmFsdWUiPiR7dGhpcy5zdGF0cy5jb2xsZWN0aW9uc308L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtZGVzY3JpcHRpb24iPlRvdGFsIGNvbGxlY3Rpb25zIGluIGRhdGFiYXNlPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1jYXJkIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC1sYWJlbCI+RG9jdW1lbnRzPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0LXZhbHVlIj4ke2Zvcm1hdENvdW50Mih0aGlzLnN0YXRzLm9iamVjdHMpIHx8IHRoaXMuc3RhdHMub2JqZWN0c308L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtZGVzY3JpcHRpb24iPlRvdGFsIGRvY3VtZW50cyBzdG9yZWQ8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LWNhcmQiPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0LWxhYmVsIj5BdmcgRG9jdW1lbnQgU2l6ZTwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC12YWx1ZSBzbWFsbCI+JHtmb3JtYXRTaXplMih0aGlzLnN0YXRzLmF2Z09ialNpemUpfTwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC1kZXNjcmlwdGlvbiI+QXZlcmFnZSBzaXplIHBlciBkb2N1bWVudDwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtY2FyZCI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtbGFiZWwiPkRhdGEgU2l6ZTwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC12YWx1ZSBzbWFsbCI+JHtmb3JtYXRTaXplMih0aGlzLnN0YXRzLmRhdGFTaXplKX08L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtZGVzY3JpcHRpb24iPlVuY29tcHJlc3NlZCBkYXRhIHNpemU8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0LWNhcmQiPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0LWxhYmVsIj5TdG9yYWdlIFNpemU8L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtdmFsdWUgc21hbGwiPiR7Zm9ybWF0U2l6ZTIodGhpcy5zdGF0cy5zdG9yYWdlU2l6ZSl9PC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0LWRlc2NyaXB0aW9uIj5BbGxvY2F0ZWQgc3RvcmFnZTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5JbmRleGVzPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0cy1ncmlkIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdC1jYXJkIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC1sYWJlbCI+SW5kZXggQ291bnQ8L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtdmFsdWUiPiR7dGhpcy5zdGF0cy5pbmRleGVzfTwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC1kZXNjcmlwdGlvbiI+VG90YWwgaW5kZXhlcyBpbiBkYXRhYmFzZTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXQtY2FyZCI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtbGFiZWwiPkluZGV4IFNpemU8L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtdmFsdWUgc21hbGwiPiR7Zm9ybWF0U2l6ZTIodGhpcy5zdGF0cy5pbmRleFNpemUpfTwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC1kZXNjcmlwdGlvbiI+VG90YWwgaW5kZXggc3RvcmFnZTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICBgOwogIH0KfTsKX2luaXQ3ID0gX19kZWNvcmF0b3JTdGFydChfYTEwKTsKX2RhdGFiYXNlTmFtZTYgPSBuZXcgV2Vha01hcCgpOwpfc3RhdHMyID0gbmV3IFdlYWtNYXAoKTsKX2xvYWRpbmc1ID0gbmV3IFdlYWtNYXAoKTsKX2Vycm9yMiA9IG5ldyBXZWFrTWFwKCk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NywgNCwgImRhdGFiYXNlTmFtZSIsIF9kYXRhYmFzZU5hbWVfZGVjNiwgVHN2aWV3TW9uZ29EYk92ZXJ2aWV3LCBfZGF0YWJhc2VOYW1lNik7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NywgNCwgInN0YXRzIiwgX3N0YXRzX2RlYzIsIFRzdmlld01vbmdvRGJPdmVydmlldywgX3N0YXRzMik7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NywgNCwgImxvYWRpbmciLCBfbG9hZGluZ19kZWM1LCBUc3ZpZXdNb25nb0RiT3ZlcnZpZXcsIF9sb2FkaW5nNSk7Cl9fZGVjb3JhdGVFbGVtZW50KF9pbml0NywgNCwgImVycm9yIiwgX2Vycm9yX2RlYzIsIFRzdmlld01vbmdvRGJPdmVydmlldywgX2Vycm9yMik7ClRzdmlld01vbmdvRGJPdmVydmlldyA9IF9fZGVjb3JhdGVFbGVtZW50KF9pbml0NywgMCwgIlRzdmlld01vbmdvRGJPdmVydmlldyIsIF9Uc3ZpZXdNb25nb0RiT3ZlcnZpZXdfZGVjb3JhdG9ycywgVHN2aWV3TW9uZ29EYk92ZXJ2aWV3KTsKX19wdWJsaWNGaWVsZChUc3ZpZXdNb25nb0RiT3ZlcnZpZXcsICJzdHlsZXMiLCBbCiAgY3NzTWFuYWdlcjkuZGVmYXVsdFN0eWxlcywKICB0aGVtZVN0eWxlcywKICBjc3M5YAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAub3ZlcnZpZXctY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBhZGRpbmc6IDI0cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgLmhlYWRlciB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgfQoKICAgICAgLmhlYWRlci10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgbWFyZ2luOiAwIDAgOHB4IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTJweDsKICAgICAgfQoKICAgICAgLmhlYWRlci10aXRsZSBzdmcgewogICAgICAgIHdpZHRoOiAyOHB4OwogICAgICAgIGhlaWdodDogMjhweDsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgfQoKICAgICAgLmhlYWRlci1zdWJ0aXRsZSB7CiAgICAgICAgY29sb3I6ICM4ODg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CgogICAgICAuc3RhdHMtZ3JpZCB7CiAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDIwMHB4LCAxZnIpKTsKICAgICAgICBnYXA6IDE2cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMzJweDsKICAgICAgfQoKICAgICAgLnN0YXQtY2FyZCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMzMzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IDhweDsKICAgICAgfQoKICAgICAgLnN0YXQtbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgfQoKICAgICAgLnN0YXQtdmFsdWUgewogICAgICAgIGZvbnQtc2l6ZTogMjRweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAjZTBlMGUwOwogICAgICB9CgogICAgICAuc3RhdC12YWx1ZS5zbWFsbCB7CiAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICB9CgogICAgICAuc3RhdC1kZXNjcmlwdGlvbiB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAuc2VjdGlvbiB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgfQoKICAgICAgLnNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICAgIG1hcmdpbi1ib3R0b206IDEycHg7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDhweDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzMzMzsKICAgICAgfQoKICAgICAgLmxvYWRpbmctc3RhdGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgY29sb3I6ICM4ODg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CgogICAgICAuZXJyb3Itc3RhdGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBjb2xvcjogI2Y4NzE3MTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5lbXB0eS1zdGF0ZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmVtcHR5LXN0YXRlIHN2ZyB7CiAgICAgICAgd2lkdGg6IDQ4cHg7CiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDEycHg7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CiAgICBgCl0pOwpfX3J1bkluaXRpYWxpemVycyhfaW5pdDcsIDEsIFRzdmlld01vbmdvRGJPdmVydmlldyk7CgovLyB0c193ZWIvZWxlbWVudHMvdHN2aWV3LWFjdGl2aXR5LXN0cmVhbS50cwp2YXIgX25vd19kZWMsIF9hdXRvU2Nyb2xsX2RlYywgX2lzTG9hZGluZ19kZWMsIF9pc0Nvbm5lY3RlZF9kZWMsIF9maWx0ZXJNb2RlX2RlYywgX2V2ZW50c19kZWMsIF9hMTEsIF9Uc3ZpZXdBY3Rpdml0eVN0cmVhbV9kZWNvcmF0b3JzLCBfaW5pdDgsIF9ldmVudHMsIF9maWx0ZXJNb2RlLCBfaXNDb25uZWN0ZWQsIF9pc0xvYWRpbmcsIF9hdXRvU2Nyb2xsLCBfbm93Owp2YXIgeyBodG1sOiBodG1sMTUsIGNzczogY3NzMTAsIGNzc01hbmFnZXI6IGNzc01hbmFnZXIxMCwgY3VzdG9tRWxlbWVudDogY3VzdG9tRWxlbWVudDEwLCBwcm9wZXJ0eTogcHJvcGVydHk4LCBzdGF0ZTogc3RhdGU5LCBEZWVzRWxlbWVudDogRGVlc0VsZW1lbnQxMCB9ID0gcGx1Z2luc19leHBvcnRzNTsKX1Rzdmlld0FjdGl2aXR5U3RyZWFtX2RlY29yYXRvcnMgPSBbY3VzdG9tRWxlbWVudDEwKCJ0c3ZpZXctYWN0aXZpdHktc3RyZWFtIildOwp2YXIgVHN2aWV3QWN0aXZpdHlTdHJlYW0gPSBjbGFzcyBleHRlbmRzIChfYTExID0gRGVlc0VsZW1lbnQxMCwgX2V2ZW50c19kZWMgPSBbc3RhdGU5KCldLCBfZmlsdGVyTW9kZV9kZWMgPSBbc3RhdGU5KCldLCBfaXNDb25uZWN0ZWRfZGVjID0gW3N0YXRlOSgpXSwgX2lzTG9hZGluZ19kZWMgPSBbc3RhdGU5KCldLCBfYXV0b1Njcm9sbF9kZWMgPSBbc3RhdGU5KCldLCBfbm93X2RlYyA9IFtzdGF0ZTkoKV0sIF9hMTEpIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2V2ZW50cywgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ4LCA4LCB0aGlzLCBbXSkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDgsIDExLCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfZmlsdGVyTW9kZSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ4LCAxMiwgdGhpcywgImFsbCIpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ4LCAxNSwgdGhpcyk7CiAgICBfX3ByaXZhdGVBZGQodGhpcywgX2lzQ29ubmVjdGVkLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDgsIDE2LCB0aGlzLCBmYWxzZSkpLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDgsIDE5LCB0aGlzKTsKICAgIF9fcHJpdmF0ZUFkZCh0aGlzLCBfaXNMb2FkaW5nLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDgsIDIwLCB0aGlzLCB0cnVlKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0OCwgMjMsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9hdXRvU2Nyb2xsLCBfX3J1bkluaXRpYWxpemVycyhfaW5pdDgsIDI0LCB0aGlzLCB0cnVlKSksIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0OCwgMjcsIHRoaXMpOwogICAgX19wcml2YXRlQWRkKHRoaXMsIF9ub3csIF9fcnVuSW5pdGlhbGl6ZXJzKF9pbml0OCwgMjgsIHRoaXMsIERhdGUubm93KCkpKSwgX19ydW5Jbml0aWFsaXplcnMoX2luaXQ4LCAzMSwgdGhpcyk7CiAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJzdWJzY3JpcHRpb24iLCBudWxsKTsKICAgIF9fcHVibGljRmllbGQodGhpcywgImNvbm5lY3Rpb25TdWJzY3JpcHRpb24iLCBudWxsKTsKICAgIF9fcHVibGljRmllbGQodGhpcywgIm5vd0ludGVydmFsIiwgbnVsbCk7CiAgfQogIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgIHRoaXMubm93SW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgIHRoaXMubm93ID0gRGF0ZS5ub3coKTsKICAgIH0sIDFlMyk7CiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVTdHJlYW1pbmcoKTsKICB9CiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgaWYgKHRoaXMubm93SW50ZXJ2YWwpIHsKICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLm5vd0ludGVydmFsKTsKICAgICAgdGhpcy5ub3dJbnRlcnZhbCA9IG51bGw7CiAgICB9CiAgICB0aGlzLmNsZWFudXAoKTsKICB9CiAgYXN5bmMgaW5pdGlhbGl6ZVN0cmVhbWluZygpIHsKICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTsKICAgIHRoaXMuY29ubmVjdGlvblN1YnNjcmlwdGlvbiA9IGNoYW5nZVN0cmVhbVNlcnZpY2UuY29ubmVjdGlvblN0YXR1cyQuc3Vic2NyaWJlKGFzeW5jIChzdGF0dXMpID0+IHsKICAgICAgY29uc3Qgd2FzQ29ubmVjdGVkID0gdGhpcy5pc0Nvbm5lY3RlZDsKICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IHN0YXR1cyA9PT0gImNvbm5lY3RlZCI7CiAgICAgIGlmIChzdGF0dXMgPT09ICJjb25uZWN0ZWQiICYmICF3YXNDb25uZWN0ZWQpIHsKICAgICAgICBhd2FpdCB0aGlzLnNldHVwU3Vic2NyaXB0aW9ucygpOwogICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7CiAgICAgIH0KICAgIH0pOwogICAgdHJ5IHsKICAgICAgYXdhaXQgY2hhbmdlU3RyZWFtU2VydmljZS5jb25uZWN0KCk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhY3Rpdml0eSBzdHJlYW06IiwgZXJyb3IpOwogICAgICB0aGlzLmlzQ29ubmVjdGVkID0gZmFsc2U7CiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7CiAgICB9CiAgfQogIGFzeW5jIHNldHVwU3Vic2NyaXB0aW9ucygpIHsKICAgIGNvbnN0IGJ1ZmZlcmVkID0gY2hhbmdlU3RyZWFtU2VydmljZS5nZXRCdWZmZXJlZEFjdGl2aXR5KCk7CiAgICBpZiAoYnVmZmVyZWQubGVuZ3RoID4gMCkgewogICAgICB0aGlzLmV2ZW50cyA9IGJ1ZmZlcmVkOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgcmVjZW50RXZlbnRzID0gYXdhaXQgY2hhbmdlU3RyZWFtU2VydmljZS5nZXRSZWNlbnRBY3Rpdml0eSgxMDApOwogICAgICBpZiAocmVjZW50RXZlbnRzLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLmV2ZW50cyA9IHJlY2VudEV2ZW50czsKICAgICAgfQogICAgfQogICAgaWYgKCF0aGlzLnN1YnNjcmlwdGlvbikgewogICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IGNoYW5nZVN0cmVhbVNlcnZpY2UuZ2V0QWN0aXZpdHlTdHJlYW0oKS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7CiAgICAgICAgdGhpcy5ldmVudHMgPSBbLi4udGhpcy5ldmVudHMsIGV2ZW50XS5zbGljZSgtNTAwKTsKICAgICAgICBpZiAodGhpcy5hdXRvU2Nyb2xsKSB7CiAgICAgICAgICB0aGlzLnNjcm9sbFRvVG9wKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9CiAgY2xlYW51cCgpIHsKICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikgewogICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IG51bGw7CiAgICB9CiAgICBpZiAodGhpcy5jb25uZWN0aW9uU3Vic2NyaXB0aW9uKSB7CiAgICAgIHRoaXMuY29ubmVjdGlvblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICB0aGlzLmNvbm5lY3Rpb25TdWJzY3JpcHRpb24gPSBudWxsOwogICAgfQogIH0KICBzY3JvbGxUb1RvcCgpIHsKICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgIGNvbnN0IGxpc3Q1ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCIuZXZlbnRzLWxpc3QiKTsKICAgICAgaWYgKGxpc3Q1KSB7CiAgICAgICAgbGlzdDUuc2Nyb2xsVG9wID0gMDsKICAgICAgfQogICAgfSk7CiAgfQogIHNldEZpbHRlck1vZGUobW9kZSkgewogICAgdGhpcy5maWx0ZXJNb2RlID0gbW9kZTsKICB9CiAgdG9nZ2xlQXV0b1Njcm9sbCgpIHsKICAgIHRoaXMuYXV0b1Njcm9sbCA9ICF0aGlzLmF1dG9TY3JvbGw7CiAgfQogIGdldCBmaWx0ZXJlZEV2ZW50cygpIHsKICAgIGxldCBldmVudHMgPSB0aGlzLmV2ZW50czsKICAgIGlmICh0aGlzLmZpbHRlck1vZGUgIT09ICJhbGwiKSB7CiAgICAgIGV2ZW50cyA9IGV2ZW50cy5maWx0ZXIoKGUxMSkgPT4gZTExLnNvdXJjZSA9PT0gdGhpcy5maWx0ZXJNb2RlKTsKICAgIH0KICAgIHJldHVybiBldmVudHMuc29ydCgoYTUsIGI2KSA9PiBuZXcgRGF0ZShiNi50aW1lc3RhbXApLmdldFRpbWUoKSAtIG5ldyBEYXRlKGE1LnRpbWVzdGFtcCkuZ2V0VGltZSgpKTsKICB9CiAgZm9ybWF0VGltZSh0aW1lc3RhbXAyKSB7CiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGltZXN0YW1wMik7CiAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVRpbWVTdHJpbmcoImVuLVVTIiwgewogICAgICBob3VyOiAiMi1kaWdpdCIsCiAgICAgIG1pbnV0ZTogIjItZGlnaXQiLAogICAgICBzZWNvbmQ6ICIyLWRpZ2l0IgogICAgfSk7CiAgfQogIGZvcm1hdFJlbGF0aXZlVGltZSh0aW1lc3RhbXAyKSB7CiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGltZXN0YW1wMik7CiAgICBjb25zdCBkaWZmID0gdGhpcy5ub3cgLSBkYXRlLmdldFRpbWUoKTsKICAgIGlmIChkaWZmIDwgMWUzKSB7CiAgICAgIHJldHVybiAibm93IjsKICAgIH0gZWxzZSBpZiAoZGlmZiA8IDZlNCkgewogICAgICBjb25zdCBzZWNzID0gTWF0aC5mbG9vcihkaWZmIC8gMWUzKTsKICAgICAgcmV0dXJuIGAke3NlY3N9cyBhZ29gOwogICAgfSBlbHNlIGlmIChkaWZmIDwgMzZlNSkgewogICAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcihkaWZmIC8gNmU0KTsKICAgICAgcmV0dXJuIGAke21pbnN9bSBhZ29gOwogICAgfSBlbHNlIGlmIChkaWZmIDwgODY0ZTUpIHsKICAgICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKGRpZmYgLyAzNmU1KTsKICAgICAgcmV0dXJuIGAke2hvdXJzfWggYWdvYDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpOwogICAgfQogIH0KICBnZXRFdmVudFRpdGxlKGV2ZW50KSB7CiAgICBpZiAoZXZlbnQuc291cmNlID09PSAibW9uZ29kYiIpIHsKICAgICAgY29uc3QgbW9uZ29FdmVudCA9IGV2ZW50LmV2ZW50OwogICAgICByZXR1cm4gYCR7bW9uZ29FdmVudC5kYXRhYmFzZX0uJHttb25nb0V2ZW50LmNvbGxlY3Rpb259YDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHN0b3JhZ2VFdmVudCA9IGV2ZW50LmV2ZW50OwogICAgICByZXR1cm4gc3RvcmFnZUV2ZW50LmJ1Y2tldDsKICAgIH0KICB9CiAgZ2V0RXZlbnREZXRhaWxzKGV2ZW50KSB7CiAgICBpZiAoZXZlbnQuc291cmNlID09PSAibW9uZ29kYiIpIHsKICAgICAgY29uc3QgbW9uZ29FdmVudCA9IGV2ZW50LmV2ZW50OwogICAgICBpZiAobW9uZ29FdmVudC5kb2N1bWVudElkKSB7CiAgICAgICAgcmV0dXJuIGBEb2N1bWVudDogJHttb25nb0V2ZW50LmRvY3VtZW50SWR9YDsKICAgICAgfQogICAgICByZXR1cm4gIiI7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBzdG9yYWdlRXZlbnQgPSBldmVudC5ldmVudDsKICAgICAgcmV0dXJuIHN0b3JhZ2VFdmVudC5rZXk7CiAgICB9CiAgfQogIGdldEV2ZW50VHlwZShldmVudCkgewogICAgcmV0dXJuIGV2ZW50LmV2ZW50LnR5cGU7CiAgfQogIGhhbmRsZUV2ZW50Q2xpY2soZXZlbnQpIHsKICAgIGlmIChldmVudC5zb3VyY2UgPT09ICJtb25nb2RiIikgewogICAgICBjb25zdCBtb25nb0V2ZW50ID0gZXZlbnQuZXZlbnQ7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgKICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoIm5hdmlnYXRlLXRvLW1vbmdvIiwgewogICAgICAgICAgZGV0YWlsOiB7CiAgICAgICAgICAgIGRhdGFiYXNlOiBtb25nb0V2ZW50LmRhdGFiYXNlLAogICAgICAgICAgICBjb2xsZWN0aW9uOiBtb25nb0V2ZW50LmNvbGxlY3Rpb24sCiAgICAgICAgICAgIGRvY3VtZW50SWQ6IG1vbmdvRXZlbnQuZG9jdW1lbnRJZAogICAgICAgICAgfSwKICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICAgIH0pCiAgICAgICk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBzdG9yYWdlRXZlbnQgPSBldmVudC5ldmVudDsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KAogICAgICAgIG5ldyBDdXN0b21FdmVudCgibmF2aWdhdGUtdG8tczMiLCB7CiAgICAgICAgICBkZXRhaWw6IHsKICAgICAgICAgICAgYnVja2V0OiBzdG9yYWdlRXZlbnQuYnVja2V0LAogICAgICAgICAgICBrZXk6IHN0b3JhZ2VFdmVudC5rZXkKICAgICAgICAgIH0sCiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KQogICAgICApOwogICAgfQogIH0KICByZW5kZXJNb25nb0ljb24oKSB7CiAgICByZXR1cm4gaHRtbDE1YAogICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+CiAgICAgICAgPGVsbGlwc2UgY3g9IjEyIiBjeT0iNSIgcng9IjkiIHJ5PSIzIj48L2VsbGlwc2U+CiAgICAgICAgPHBhdGggZD0iTTIxIDEyYzAgMS42Ni00IDMtOSAzcy05LTEuMzQtOS0zIj48L3BhdGg+CiAgICAgICAgPHBhdGggZD0iTTMgNXYxNGMwIDEuNjYgNCAzIDkgM3M5LTEuMzQgOS0zVjUiPjwvcGF0aD4KICAgICAgPC9zdmc+CiAgICBgOwogIH0KICByZW5kZXJTM0ljb24oKSB7CiAgICByZXR1cm4gaHRtbDE1YAogICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+CiAgICAgICAgPHBhdGggZD0iTTIyIDE5YTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmg1bDIgM2g5YTIgMiAwIDAgMSAyIDJ6Ij48L3BhdGg+CiAgICAgIDwvc3ZnPgogICAgYDsKICB9CiAgZ2V0Q29ubmVjdGlvblN0YXR1c1RleHQoKSB7CiAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkgewogICAgICByZXR1cm4gIkxpdmUiOwogICAgfQogICAgcmV0dXJuICJEaXNjb25uZWN0ZWQiOwogIH0KICByZW5kZXIoKSB7CiAgICByZXR1cm4gaHRtbDE1YAogICAgICA8ZGl2IGNsYXNzPSJhY3Rpdml0eS1jb250YWluZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItdGl0bGUiPgogICAgICAgICAgICBBY3Rpdml0eSBTdHJlYW0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29ubmVjdGlvbi1zdGF0dXMiPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0dXMtZG90ICR7dGhpcy5pc0Nvbm5lY3RlZCA/ICJjb25uZWN0ZWQiIDogImRpc2Nvbm5lY3RlZCJ9Ij48L3NwYW4+CiAgICAgICAgICAgICAgJHt0aGlzLmdldENvbm5lY3Rpb25TdGF0dXNUZXh0KCl9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItY29udHJvbHMiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmaWx0ZXItdGFicyI+CiAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgY2xhc3M9ImZpbHRlci10YWIgJHt0aGlzLmZpbHRlck1vZGUgPT09ICJhbGwiID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNldEZpbHRlck1vZGUoImFsbCIpfQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIEFsbAogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgIGNsYXNzPSJmaWx0ZXItdGFiICR7dGhpcy5maWx0ZXJNb2RlID09PSAibW9uZ29kYiIgPyAiYWN0aXZlIiA6ICIifSIKICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHRoaXMuc2V0RmlsdGVyTW9kZSgibW9uZ29kYiIpfQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIE1vbmdvREIKICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICBjbGFzcz0iZmlsdGVyLXRhYiAke3RoaXMuZmlsdGVyTW9kZSA9PT0gInN0b3JhZ2UiID8gImFjdGl2ZSIgOiAiIn0iCiAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLnNldEZpbHRlck1vZGUoInN0b3JhZ2UiKX0KICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICBTMwogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJhdXRvLXNjcm9sbC10b2dnbGUiPgogICAgICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICAgICAgdHlwZT0iY2hlY2tib3giCiAgICAgICAgICAgICAgICAuY2hlY2tlZD0ke3RoaXMuYXV0b1Njcm9sbH0KICAgICAgICAgICAgICAgIEBjaGFuZ2U9JHt0aGlzLnRvZ2dsZUF1dG9TY3JvbGx9CiAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICBBdXRvLXNjcm9sbAogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9ImV2ZW50cy1saXN0Ij4KICAgICAgICAgICR7dGhpcy5pc0xvYWRpbmcgPyBodG1sMTVgPGRpdiBjbGFzcz0ibG9hZGluZy1zdGF0ZSI+Q29ubmVjdGluZyB0byBhY3Rpdml0eSBzdHJlYW0uLi48L2Rpdj5gIDogdGhpcy5maWx0ZXJlZEV2ZW50cy5sZW5ndGggPT09IDAgPyBodG1sMTVgCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlIj4KICAgICAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+CiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjIgMTJoLTRsLTMgOUw5IDNsLTMgOUgyIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgICAgICAgPHA+Tm8gYWN0aXZpdHkgeWV0LiBDaGFuZ2VzIHdpbGwgYXBwZWFyIGhlcmUgaW4gcmVhbC10aW1lLjwvcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICBgIDogdGhpcy5maWx0ZXJlZEV2ZW50cy5tYXAoCiAgICAgIChldmVudCkgPT4gaHRtbDE1YAogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV2ZW50LWl0ZW0iIEBjbGljaz0keygpID0+IHRoaXMuaGFuZGxlRXZlbnRDbGljayhldmVudCl9PgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZXZlbnQtdGltZS1jb2wiIHRpdGxlPSR7dGhpcy5mb3JtYXRUaW1lKGV2ZW50LnRpbWVzdGFtcCl9PgogICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuZm9ybWF0UmVsYXRpdmVUaW1lKGV2ZW50LnRpbWVzdGFtcCl9CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV2ZW50LWljb24gJHtldmVudC5zb3VyY2V9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgJHtldmVudC5zb3VyY2UgPT09ICJtb25nb2RiIiA/IHRoaXMucmVuZGVyTW9uZ29JY29uKCkgOiB0aGlzLnJlbmRlclMzSWNvbigpfQogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJldmVudC1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZXZlbnQtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJldmVudC10aXRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXZlbnQtdHlwZSAke3RoaXMuZ2V0RXZlbnRUeXBlKGV2ZW50KX0iPiR7dGhpcy5nZXRFdmVudFR5cGUoZXZlbnQpfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5nZXRFdmVudFRpdGxlKGV2ZW50KX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV2ZW50LWRldGFpbHMiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJldmVudC1wYXRoIj4ke3RoaXMuZ2V0RXZlbnREZXRhaWxzKGV2ZW50KX08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIGAKICAgICl9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgYDsKICB9Cn07Cl9pbml0OCA9IF9fZGVjb3JhdG9yU3RhcnQoX2ExMSk7Cl9ldmVudHMgPSBuZXcgV2Vha01hcCgpOwpfZmlsdGVyTW9kZSA9IG5ldyBXZWFrTWFwKCk7Cl9pc0Nvbm5lY3RlZCA9IG5ldyBXZWFrTWFwKCk7Cl9pc0xvYWRpbmcgPSBuZXcgV2Vha01hcCgpOwpfYXV0b1Njcm9sbCA9IG5ldyBXZWFrTWFwKCk7Cl9ub3cgPSBuZXcgV2Vha01hcCgpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDgsIDQsICJldmVudHMiLCBfZXZlbnRzX2RlYywgVHN2aWV3QWN0aXZpdHlTdHJlYW0sIF9ldmVudHMpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDgsIDQsICJmaWx0ZXJNb2RlIiwgX2ZpbHRlck1vZGVfZGVjLCBUc3ZpZXdBY3Rpdml0eVN0cmVhbSwgX2ZpbHRlck1vZGUpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDgsIDQsICJpc0Nvbm5lY3RlZCIsIF9pc0Nvbm5lY3RlZF9kZWMsIFRzdmlld0FjdGl2aXR5U3RyZWFtLCBfaXNDb25uZWN0ZWQpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDgsIDQsICJpc0xvYWRpbmciLCBfaXNMb2FkaW5nX2RlYywgVHN2aWV3QWN0aXZpdHlTdHJlYW0sIF9pc0xvYWRpbmcpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDgsIDQsICJhdXRvU2Nyb2xsIiwgX2F1dG9TY3JvbGxfZGVjLCBUc3ZpZXdBY3Rpdml0eVN0cmVhbSwgX2F1dG9TY3JvbGwpOwpfX2RlY29yYXRlRWxlbWVudChfaW5pdDgsIDQsICJub3ciLCBfbm93X2RlYywgVHN2aWV3QWN0aXZpdHlTdHJlYW0sIF9ub3cpOwpUc3ZpZXdBY3Rpdml0eVN0cmVhbSA9IF9fZGVjb3JhdGVFbGVtZW50KF9pbml0OCwgMCwgIlRzdmlld0FjdGl2aXR5U3RyZWFtIiwgX1Rzdmlld0FjdGl2aXR5U3RyZWFtX2RlY29yYXRvcnMsIFRzdmlld0FjdGl2aXR5U3RyZWFtKTsKX19wdWJsaWNGaWVsZChUc3ZpZXdBY3Rpdml0eVN0cmVhbSwgInN0eWxlcyIsIFsKICBjc3NNYW5hZ2VyMTAuZGVmYXVsdFN0eWxlcywKICB0aGVtZVN0eWxlcywKICBjc3MxMGAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuYWN0aXZpdHktY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAuaGVhZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMzMzM7CiAgICAgIH0KCiAgICAgIC5oZWFkZXItdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBnYXA6IDEycHg7CiAgICAgIH0KCiAgICAgIC5jb25uZWN0aW9uLXN0YXR1cyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICB9CgogICAgICAuc3RhdHVzLWRvdCB7CiAgICAgICAgd2lkdGg6IDhweDsKICAgICAgICBoZWlnaHQ6IDhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIH0KCiAgICAgIC5zdGF0dXMtZG90LmNvbm5lY3RlZCB7CiAgICAgICAgYmFja2dyb3VuZDogIzIyYzU1ZTsKICAgICAgICBib3gtc2hhZG93OiAwIDAgNnB4IHJnYmEoMzQsIDE5NywgOTQsIDAuNSk7CiAgICAgIH0KCiAgICAgIC5zdGF0dXMtZG90LmRpc2Nvbm5lY3RlZCB7CiAgICAgICAgYmFja2dyb3VuZDogI2VmNDQ0NDsKICAgICAgfQoKICAgICAgLnN0YXR1cy1kb3QuY29ubmVjdGluZyB7CiAgICAgICAgYmFja2dyb3VuZDogI2Y1OWUwYjsKICAgICAgICBhbmltYXRpb246IHB1bHNlIDFzIGluZmluaXRlOwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIHB1bHNlIHsKICAgICAgICAwJSwgMTAwJSB7IG9wYWNpdHk6IDE7IH0KICAgICAgICA1MCUgeyBvcGFjaXR5OiAwLjU7IH0KICAgICAgfQoKICAgICAgLmhlYWRlci1jb250cm9scyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTJweDsKICAgICAgfQoKICAgICAgLmZpbHRlci10YWJzIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogNHB4OwogICAgICB9CgogICAgICAuZmlsdGVyLXRhYiB7CiAgICAgICAgcGFkZGluZzogNnB4IDEycHg7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzQ0NDsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4yczsKICAgICAgfQoKICAgICAgLmZpbHRlci10YWI6aG92ZXIgewogICAgICAgIGJvcmRlci1jb2xvcjogIzY2NjsKICAgICAgICBjb2xvcjogI2FhYTsKICAgICAgfQoKICAgICAgLmZpbHRlci10YWIuYWN0aXZlIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjNjY2OwogICAgICAgIGNvbG9yOiAjZTBlMGUwOwogICAgICB9CgogICAgICAuYXV0by1zY3JvbGwtdG9nZ2xlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZ2FwOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgLmF1dG8tc2Nyb2xsLXRvZ2dsZSBpbnB1dCB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAuZXZlbnRzLWxpc3QgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICB9CgogICAgICAuZXZlbnQtaXRlbSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBnYXA6IDEycHg7CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzOwogICAgICB9CgogICAgICAuZXZlbnQtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKICAgICAgfQoKICAgICAgLmV2ZW50LXRpbWUtY29sIHsKICAgICAgICB3aWR0aDogNzBweDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgICAgcGFkZGluZy10b3A6IDJweDsKICAgICAgfQoKICAgICAgLmV2ZW50LWljb24gewogICAgICAgIHdpZHRoOiAzNnB4OwogICAgICAgIGhlaWdodDogMzZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAuZXZlbnQtaWNvbi5tb25nb2RiIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDE2LCAxODUsIDEyOSwgMC4yKTsKICAgICAgICBjb2xvcjogIzEwYjk4MTsKICAgICAgfQoKICAgICAgLmV2ZW50LWljb24uczMgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjQ1LCAxNTgsIDExLCAwLjIpOwogICAgICAgIGNvbG9yOiAjZjU5ZTBiOwogICAgICB9CgogICAgICAuZXZlbnQtaWNvbiBzdmcgewogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgfQoKICAgICAgLmV2ZW50LWNvbnRlbnQgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICB9CgogICAgICAuZXZlbnQtaGVhZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNHB4OwogICAgICB9CgogICAgICAuZXZlbnQtdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGNvbG9yOiAjZTBlMGUwOwogICAgICB9CgogICAgICAuZXZlbnQtZGV0YWlscyB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgIH0KCiAgICAgIC5ldmVudC10eXBlIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcGFkZGluZzogMnB4IDZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDhweDsKICAgICAgfQoKICAgICAgLmV2ZW50LXR5cGUuaW5zZXJ0LCAuZXZlbnQtdHlwZS5hZGQgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzQsIDE5NywgOTQsIDAuMik7CiAgICAgICAgY29sb3I6ICM0YWRlODA7CiAgICAgIH0KCiAgICAgIC5ldmVudC10eXBlLnVwZGF0ZSwgLmV2ZW50LXR5cGUubW9kaWZ5IHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDU5LCAxMzAsIDI0NiwgMC4yKTsKICAgICAgICBjb2xvcjogIzYwYTVmYTsKICAgICAgfQoKICAgICAgLmV2ZW50LXR5cGUuZGVsZXRlIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDIzOSwgNjgsIDY4LCAwLjIpOwogICAgICAgIGNvbG9yOiAjZjg3MTcxOwogICAgICB9CgogICAgICAuZXZlbnQtdHlwZS5yZXBsYWNlIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDE2OCwgODUsIDI0NywgMC4yKTsKICAgICAgICBjb2xvcjogI2MwODRmYzsKICAgICAgfQoKICAgICAgLmV2ZW50LXR5cGUuZHJvcCwgLmV2ZW50LXR5cGUuaW52YWxpZGF0ZSB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyMzksIDY4LCA2OCwgMC4zKTsKICAgICAgICBjb2xvcjogI2Y4NzE3MTsKICAgICAgfQoKICAgICAgLmVtcHR5LXN0YXRlIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgICAgZ2FwOiAxNnB4OwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUgc3ZnIHsKICAgICAgICB3aWR0aDogNjRweDsKICAgICAgICBoZWlnaHQ6IDY0cHg7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAuZW1wdHktc3RhdGUgcCB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CgogICAgICAubG9hZGluZy1zdGF0ZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgfQoKICAgICAgLmV2ZW50LXBhdGggewogICAgICAgIGNvbG9yOiAjYWFhOwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsKICAgICAgfQogICAgYApdKTsKX19ydW5Jbml0aWFsaXplcnMoX2luaXQ4LCAxLCBUc3ZpZXdBY3Rpdml0eVN0cmVhbSk7CgovLyB0c193ZWIvaW5kZXgudHMKdmFyIGluaXRBcHAgPSBhc3luYyAoKSA9PiB7CiAgY29uc29sZS5sb2coIlRzVmlldyBVSSBpbml0aWFsaXppbmcuLi4iKTsKICBhd2FpdCBjdXN0b21FbGVtZW50cy53aGVuRGVmaW5lZCgidHN2aWV3LWFwcCIpOwogIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcigidHN2aWV3LWFwcCIpKSB7CiAgICBjb25zdCBhcHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0c3ZpZXctYXBwIik7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGFwcCk7CiAgfQogIGNvbnNvbGUubG9nKCJUc1ZpZXcgVUkgcmVhZHkiKTsKfTsKaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJsb2FkaW5nIikgewogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBpbml0QXBwKTsKfSBlbHNlIHsKICBpbml0QXBwKCk7Cn0KLyohIEJ1bmRsZWQgbGljZW5zZSBpbmZvcm1hdGlvbjoKCkBsaXQvcmVhY3RpdmUtZWxlbWVudC9jc3MtdGFnLmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQwogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKICAgKikKCkBsaXQvcmVhY3RpdmUtZWxlbWVudC9yZWFjdGl2ZS1lbGVtZW50LmpzOgpsaXQtaHRtbC9saXQtaHRtbC5qczoKbGl0LWVsZW1lbnQvbGl0LWVsZW1lbnQuanM6CkBsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3Byb3BlcnR5LmpzOgpsaXQtaHRtbC9kaXJlY3RpdmUuanM6CmxpdC1odG1sL2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanM6CkBsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL2N1c3RvbS1lbGVtZW50LmpzOgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9zdGF0ZS5qczoKQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvZXZlbnQtb3B0aW9ucy5qczoKQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvYmFzZS5qczoKQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvcXVlcnkuanM6CkBsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3F1ZXJ5LWFsbC5qczoKQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvcXVlcnktYXN5bmMuanM6CkBsaXQvcmVhY3RpdmUtZWxlbWVudC9kZWNvcmF0b3JzL3F1ZXJ5LWFzc2lnbmVkLW5vZGVzLmpzOgpsaXQtaHRtbC9hc3luYy1kaXJlY3RpdmUuanM6CmxpdC1odG1sL2RpcmVjdGl2ZXMvdW50aWwuanM6CmxpdC1odG1sL2RpcmVjdGl2ZXMvYXN5bmMtcmVwbGFjZS5qczoKbGl0LWh0bWwvZGlyZWN0aXZlcy9hc3luYy1hcHBlbmQuanM6CmxpdC1odG1sL2RpcmVjdGl2ZXMvcmVwZWF0LmpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKICAgKikKCmxpdC1odG1sL2lzLXNlcnZlci5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMKICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCiAgICopCgpzd2VldC1zY3JvbGwvc3dlZXQtc2Nyb2xsLmpzOgogICgqISBAcHJlc2VydmUgc3dlZXQtc2Nyb2xsIHY0LjAuMCAtIHRzdXlvc2hpd2FkYSB8IE1JVCBMaWNlbnNlICopCiAgKCohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlCiAgICAgIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlCiAgICAgIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgCiAgICAgIFRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICAgICAgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRAogICAgICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLAogICAgICBNRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULgogIAogICAgICBTZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKICAgICAgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKQoKbGl0LWh0bWwvc3RhdGljLmpzOgpsaXQtaHRtbC9kaXJlY3RpdmUtaGVscGVycy5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMKICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCiAgICopCgpAbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGVjb3JhdG9ycy9xdWVyeS1hc3NpZ25lZC1lbGVtZW50cy5qczoKbGl0LWh0bWwvZGlyZWN0aXZlcy9wcml2YXRlLWFzeW5jLWhlbHBlcnMuanM6CmxpdC1odG1sL2RpcmVjdGl2ZXMva2V5ZWQuanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQogICAqKQoKQGZvcnRhd2Vzb21lL2ZvbnRhd2Vzb21lLXN2Zy1jb3JlL2luZGV4Lm1qczoKQGZvcnRhd2Vzb21lL2ZyZWUtYnJhbmRzLXN2Zy1pY29ucy9pbmRleC5tanM6CkBmb3J0YXdlc29tZS9mcmVlLXJlZ3VsYXItc3ZnLWljb25zL2luZGV4Lm1qczoKQGZvcnRhd2Vzb21lL2ZyZWUtc29saWQtc3ZnLWljb25zL2luZGV4Lm1qczoKICAoKiEKICAgKiBGb250IEF3ZXNvbWUgRnJlZSA3LjIuMCBieSBAZm9udGF3ZXNvbWUgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbQogICAqIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgKEljb25zOiBDQyBCWSA0LjAsIEZvbnRzOiBTSUwgT0ZMIDEuMSwgQ29kZTogTUlUIExpY2Vuc2UpCiAgICogQ29weXJpZ2h0IDIwMjYgRm9udGljb25zLCBJbmMuCiAgICopCgpsdWNpZGUvZGlzdC9lc20vZGVmYXVsdEF0dHJpYnV0ZXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9jcmVhdGVFbGVtZW50LmpzOgpsdWNpZGUvZGlzdC9lc20vc2hhcmVkL3NyYy91dGlscy9oYXNBMTF5UHJvcC5qczoKbHVjaWRlL2Rpc3QvZXNtL3NoYXJlZC9zcmMvdXRpbHMvbWVyZ2VDbGFzc2VzLmpzOgpsdWNpZGUvZGlzdC9lc20vc2hhcmVkL3NyYy91dGlscy90b0NhbWVsQ2FzZS5qczoKbHVjaWRlL2Rpc3QvZXNtL3NoYXJlZC9zcmMvdXRpbHMvdG9QYXNjYWxDYXNlLmpzOgpsdWNpZGUvZGlzdC9lc20vcmVwbGFjZUVsZW1lbnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hLWFycm93LWRvd24uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hLWFycm93LXVwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYS1sYXJnZS1zbWFsbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FjY2Vzc2liaWxpdHkuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hY3Rpdml0eS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fpci12ZW50LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYWlycGxheS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsYXJtLWNsb2NrLW1pbnVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxhcm0tY2xvY2stY2hlY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGFybS1jbG9jay1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGFybS1jbG9jay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsYXJtLWNsb2NrLXBsdXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGFybS1zbW9rZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsYnVtLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24tY2VudGVyLWhvcml6b250YWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi1jZW50ZXItdmVydGljYWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi1lbmQtaG9yaXpvbnRhbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLWVuZC12ZXJ0aWNhbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLWhvcml6b250YWwtZGlzdHJpYnV0ZS1jZW50ZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi1ob3Jpem9udGFsLWRpc3RyaWJ1dGUtZW5kLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24taG9yaXpvbnRhbC1kaXN0cmlidXRlLXN0YXJ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24taG9yaXpvbnRhbC1qdXN0aWZ5LWNlbnRlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLWhvcml6b250YWwtanVzdGlmeS1lbmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi1ob3Jpem9udGFsLWp1c3RpZnktc3RhcnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi1ob3Jpem9udGFsLXNwYWNlLWFyb3VuZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLWhvcml6b250YWwtc3BhY2UtYmV0d2Vlbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLXN0YXJ0LWhvcml6b250YWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi1zdGFydC12ZXJ0aWNhbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLXZlcnRpY2FsLWRpc3RyaWJ1dGUtY2VudGVyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24tdmVydGljYWwtZGlzdHJpYnV0ZS1lbmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi12ZXJ0aWNhbC1kaXN0cmlidXRlLXN0YXJ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYWxpZ24tdmVydGljYWwtanVzdGlmeS1jZW50ZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi12ZXJ0aWNhbC1qdXN0aWZ5LWVuZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FsaWduLXZlcnRpY2FsLWp1c3RpZnktc3RhcnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi12ZXJ0aWNhbC1zcGFjZS1hcm91bmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbGlnbi12ZXJ0aWNhbC1zcGFjZS1iZXR3ZWVuLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYW1wZXJzYW5kLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYW1idWxhbmNlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYW1wZXJzYW5kcy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FtcGhvcmEuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbmNob3IuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbmdyeS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fubm95ZWQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hbnRlbm5hLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYW52aWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcGVydHVyZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FwcC13aW5kb3ctbWFjLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXBwLXdpbmRvdy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FwcGxlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJjaGl2ZS1yZXN0b3JlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJjaGl2ZS14LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJjaGl2ZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2FybWNoYWlyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctYmlnLWRvd24tZGFzaC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LWJpZy1kb3duLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctYmlnLWxlZnQtZGFzaC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LWJpZy1sZWZ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctYmlnLXJpZ2h0LWRhc2guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1iaWctcmlnaHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1iaWctdXAtZGFzaC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LWRvd24tMC0xLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctYmlnLXVwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctZG93bi0xLTAuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1kb3duLWEtei5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LWRvd24tZnJvbS1saW5lLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctZG93bi1sZWZ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctZG93bi1uYXJyb3ctd2lkZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LWRvd24tcmlnaHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1kb3duLXRvLWRvdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LWRvd24tdG8tbGluZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LWRvd24tdXAuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1kb3duLXdpZGUtbmFycm93LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctZG93bi16LWEuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1kb3duLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctbGVmdC1mcm9tLWxpbmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1sZWZ0LXJpZ2h0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctbGVmdC10by1saW5lLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctbGVmdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LXJpZ2h0LWZyb20tbGluZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LXJpZ2h0LWxlZnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy1yaWdodC10by1saW5lLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctcmlnaHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC0wLTEuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC0xLTAuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC1hLXouanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC1kb3duLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctdXAtZnJvbS1kb3QuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC1mcm9tLWxpbmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC1sZWZ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3ctdXAtbmFycm93LXdpZGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC1yaWdodC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LXVwLXRvLWxpbmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hcnJvdy11cC13aWRlLW5hcnJvdy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LXVwLXotYS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Fycm93LXVwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXJyb3dzLXVwLWZyb20tbGluZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2F0LXNpZ24uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hc3Rlcmlzay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2F0b20uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9hdWRpby1saW5lcy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2F1ZGlvLXdhdmVmb3JtLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYXdhcmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9heGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9heGlzLTNkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFieS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhY2twYWNrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFkZ2UtYWxlcnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS1jZW50LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFkZ2UtY2hlY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS1ldXJvLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFkZ2UtZG9sbGFyLXNpZ24uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS1pbmRpYW4tcnVwZWUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS1pbmZvLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFkZ2UtamFwYW5lc2UteWVuLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFkZ2UtbWludXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS1wZXJjZW50LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFkZ2UtcG91bmQtc3RlcmxpbmcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS1wbHVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFkZ2UtcXVlc3Rpb24tbWFyay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZGdlLXJ1c3NpYW4tcnVibGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS1zd2lzcy1mcmFuYy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZGdlLXR1cmtpc2gtbGlyYS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZGdlLXguanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWRnZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhZ2dhZ2UtY2xhaW0uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYWxsb29uLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFuLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFuYW5hLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmFuZGFnZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jhbmtub3RlLWFycm93LWRvd24uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYW5rbm90ZS1hcnJvdy11cC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jhbmtub3RlLXguanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYW5rbm90ZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhcmNvZGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYXJyZWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYXNlbGluZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhdGguanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYXR0ZXJ5LWNoYXJnaW5nLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmF0dGVyeS1mdWxsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmF0dGVyeS1sb3cuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iYXR0ZXJ5LW1lZGl1bS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhdHRlcnktcGx1cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhdHRlcnktd2FybmluZy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JhdHRlcnkuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZWFrZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZWFuLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlYW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZWQtZG91YmxlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmVkLXNpbmdsZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlZWYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZWVyLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZWxsLWRvdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlbGwtb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmVsbC1lbGVjdHJpYy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JlbGwtbWludXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZWxsLXBsdXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZWxsLXJpbmcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iZWxsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmV0d2Vlbi1ob3Jpem9udGFsLWVuZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JldHdlZW4tdmVydGljYWwtZW5kLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmV0d2Vlbi1ob3Jpem9udGFsLXN0YXJ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmV0d2Vlbi12ZXJ0aWNhbC1zdGFydC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jpa2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iaWNlcHMtZmxleGVkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmluYXJ5LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmlvaGF6YXJkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmlub2N1bGFycy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JpcmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9iaXRjb2luLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmlyZGhvdXNlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmxlbmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ibGluZHMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ibG9ja3MuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ibHVldG9vdGgtY29ubmVjdGVkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYmx1ZXRvb3RoLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JsdWV0b290aC1zZWFyY2hpbmcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ibHVldG9vdGguanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib2xkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9sdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JvbWIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib25lLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1hLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1hbGVydC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2stYXVkaW8uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLWNoZWNrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1kYXNoZWQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLWNvcHkuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLWRvd24uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLWhlYWRwaG9uZXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLWhlYXJ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1pbWFnZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2sta2V5LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1tYXJrZWQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLWxvY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLW1pbnVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1vcGVuLWNoZWNrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9vay1vcGVuLXRleHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLW9wZW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLXBsdXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLXNlYXJjaC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2stdGV4dC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2stdXAtMi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2stdHlwZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2stdXAuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLXVzZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLXguanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9va21hcmstY2hlY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rbWFyay1taW51cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Jvb2ttYXJrLXBsdXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29rbWFyay14LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYm9va21hcmsuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib29tLWJveC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JvdC1tZXNzYWdlLXNxdWFyZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JvdC1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib3QuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib3ctYXJyb3cuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ib3R0bGUtd2luZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JveC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JveGVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYnJhY2VzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYnJhY2tldHMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9icmFpbi1jaXJjdWl0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYnJhaW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9icmFpbi1jb2cuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9icmljay13YWxsLWZpcmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9icmljay13YWxsLXNoaWVsZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JyaWNrLXdhbGwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9icmllZmNhc2UtYnVzaW5lc3MuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9icmllZmNhc2UtY29udmV5b3ItYmVsdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JyaWVmY2FzZS1tZWRpY2FsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYnJpZWZjYXNlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYnJpbmctdG8tZnJvbnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9icnVzaC1jbGVhbmluZy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2JydXNoLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvYnVnLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2J1YmJsZXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9idWctcGxheS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2J1Zy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2J1aWxkaW5nLTIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9idWlsZGluZy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2J1cy1mcm9udC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2J1cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhYmxlLWNhci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhYmxlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FrZS1zbGljZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nha2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWxjdWxhdG9yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXItMS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLWFycm93LWRvd24uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWxlbmRhci1hcnJvdy11cC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLWNoZWNrLTIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWxlbmRhci1jaGVjay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLWNsb2NrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXItY29nLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXItZGF5cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLWZvbGQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWxlbmRhci1oZWFydC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLW1pbnVzLTIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWxlbmRhci1taW51cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLXBsdXMtMi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLXBsdXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWxlbmRhci1yYW5nZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLXNlYXJjaC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbGVuZGFyLXN5bmMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWxlbmRhci14LTIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWxlbmRhci14LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FsZW5kYXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYWxlbmRhcnMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYW1lcmEtb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FtZXJhLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FuZHktY2FuZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhbmR5LW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nhbm5hYmlzLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nhbm5hYmlzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FuZHkuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYXB0aW9ucy1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYXB0aW9ucy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nhci1mcm9udC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nhci10YXhpLWZyb250LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FyYXZhbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhcnJvdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NhcmQtc2ltLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FzZS1sb3dlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nhc2Utc2Vuc2l0aXZlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FzZS11cHBlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nhc3NldHRlLXRhcGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jYXN0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2F0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2FzdGxlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2N0di5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LWFyZWEuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1iYXItYmlnLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtYmFyLWRlY3JlYXNpbmcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1iYXItaW5jcmVhc2luZy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LWJhci1zdGFja2VkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtYmFyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtY2FuZGxlc3RpY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1jb2x1bW4tYmlnLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtY29sdW1uLWRlY3JlYXNpbmcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1jb2x1bW4taW5jcmVhc2luZy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LWNvbHVtbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LWNvbHVtbi1zdGFja2VkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtZ2FudHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1saW5lLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtbmV0d29yay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LW5vLWF4ZXMtY29sdW1uLWRlY3JlYXNpbmcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1uby1heGVzLWNvbHVtbi1pbmNyZWFzaW5nLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtbm8tYXhlcy1jb2x1bW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGFydC1uby1heGVzLWNvbWJpbmVkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hhcnQtbm8tYXhlcy1nYW50dC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LXBpZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LXNwbGluZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoYXJ0LXNjYXR0ZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGVjay1jaGVjay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZWNrLWxpbmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGVjay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZWYtaGF0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hlcnJ5LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hlc3Mta2luZy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXNzLWJpc2hvcC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXNzLWtuaWdodC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXNzLXBhd24uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGVzcy1xdWVlbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXNzLXJvb2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGV2cm9uLWRvd24uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGV2cm9uLWZpcnN0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hldnJvbi1sYXN0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hldnJvbi1yaWdodC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXZyb24tbGVmdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXZyb24tdXAuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGV2cm9ucy1kb3duLXVwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hldnJvbnMtZG93bi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXZyb25zLWxlZnQtcmlnaHQtZWxsaXBzaXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGV2cm9ucy1sZWZ0LXJpZ2h0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2hldnJvbnMtbGVmdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXZyb25zLXJpZ2h0LWxlZnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGV2cm9ucy1yaWdodC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NoZXZyb25zLXVwLWRvd24uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaGV2cm9ucy11cC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nocm9taXVtLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lnYXJldHRlLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NodXJjaC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpZ2FyZXR0ZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1hbGVydC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1hcnJvdy1kb3duLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWFycm93LWxlZnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtYXJyb3ctb3V0LWRvd24tbGVmdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1hcnJvdy1vdXQtZG93bi1yaWdodC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1hcnJvdy1vdXQtdXAtbGVmdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1hcnJvdy1vdXQtdXAtcmlnaHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtYXJyb3ctcmlnaHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtYXJyb3ctdXAuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtY2hlY2stYmlnLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWNoZWNrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWNoZXZyb24tZG93bi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1jaGV2cm9uLWxlZnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtY2hldnJvbi1yaWdodC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1jaGV2cm9uLXVwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWRhc2hlZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1kaXZpZGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtZG9sbGFyLXNpZ24uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtZG90LWRhc2hlZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1kb3QuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtZWxsaXBzaXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtZXF1YWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtZmFkaW5nLWFycm93LXVwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWZhZGluZy1wbHVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLWdhdWdlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLW1pbnVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1wYXJraW5nLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXBhcmtpbmctb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXBhdXNlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXBlcmNlbnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtcGlsZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1wbGF5LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXBsdXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtcG91bmQtc3RlcmxpbmcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtcG93ZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtcXVlc3Rpb24tbWFyay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS1zbGFzaC0yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXNsYXNoLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXNtYWxsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXN0YXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUtc3RvcC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS11c2VyLXJvdW5kLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2lyY2xlLXVzZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXJjbGUteC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmNsZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NpcmN1aXQtYm9hcmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jaXRydXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbGFwcGVyYm9hcmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbGlwYm9hcmQtY2hlY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbGlwYm9hcmQtY2xvY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbGlwYm9hcmQtY29weS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NsaXBib2FyZC1saXN0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xpcGJvYXJkLW1pbnVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xpcGJvYXJkLXBhc3RlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xpcGJvYXJkLXBlbi1saW5lLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xpcGJvYXJkLXBlbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NsaXBib2FyZC1wbHVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xpcGJvYXJkLXR5cGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbGlwYm9hcmQteC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NsaXBib2FyZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb2NrLTEuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9jay0xMC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb2NrLTExLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stMTIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9jay0zLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stMi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb2NrLTQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9jay01LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stNi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb2NrLTcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9jay05LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stOC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb2NrLWFsZXJ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stYXJyb3ctZG93bi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb2NrLWFycm93LXVwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2stY2hlY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9jay1mYWRpbmcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG9jay1wbHVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC1hbGVydC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb3NlZC1jYXB0aW9uLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtYmFja3VwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtY2hlY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC1jb2cuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC1kb3dubG9hZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb3VkLWRyaXp6bGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC1mb2cuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC1oYWlsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtbGlnaHRuaW5nLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtbW9vbi1yYWluLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtbW9vbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb3VkLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb3VkLXJhaW4td2luZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nsb3VkLXJhaW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC1zbm93LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtc3VuLXJhaW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC1zeW5jLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQtc3VuLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY2xvdWQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZC11cGxvYWQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG91ZHkuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbG92ZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jbHViLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY29kZS14bWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb2RlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY29kZXBlbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvZGVzYW5kYm94LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY29mZmVlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY29nLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY29pbnMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb2x1bW5zLTIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb2x1bW5zLTMtY29nLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY29sdW1ucy0zLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY29sdW1ucy00LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY29tYmluZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvbW1hbmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb21wYXNzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY29tcG9uZW50LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY29uY2llcmdlLWJlbGwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb21wdXRlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvbmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb25zdHJ1Y3Rpb24uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb250YWN0LXJvdW5kLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY29udGFjdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvbnRhaW5lci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvbnRyYXN0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY29va2llLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY29va2luZy1wb3QuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3B5LWNoZWNrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY29weS1taW51cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvcHktcGx1cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NvcHktc2xhc2guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3B5LXguanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3B5LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY29weWxlZnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3B5cmlnaHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3JuZXItZG93bi1sZWZ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY29ybmVyLWRvd24tcmlnaHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3JuZXItbGVmdC1kb3duLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY29ybmVyLWxlZnQtdXAuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jb3JuZXItcmlnaHQtZG93bi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nvcm5lci1yaWdodC11cC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nvcm5lci11cC1sZWZ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY3B1LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY29ybmVyLXVwLXJpZ2h0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY3JlYXRpdmUtY29tbW9ucy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2NyZWRpdC1jYXJkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY3JvaXNzYW50LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY3JvcC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Nyb3NzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY3Jvc3NoYWlyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY3Jvd24uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9jdXAtc29kYS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2N1Ym9pZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2N1cnJlbmN5LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvY3lsaW5kZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9kYW0uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9kYXRhYmFzZS1iYWNrdXAuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9kYXRhYmFzZS16YXAuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9kYXRhYmFzZS1zZWFyY2guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9kZWNpbWFscy1hcnJvdy1sZWZ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZGF0YWJhc2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9kZWNpbWFscy1hcnJvdy1yaWdodC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RlbGV0ZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RpYW1ldGVyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZGVzc2VydC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RpYW1vbmQtbWludXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9kaWFtb25kLXBlcmNlbnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9kaWFtb25kLXBsdXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9kaWFtb25kLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZGljZS0xLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZGljZS0yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZGljZS0zLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZGljZS00LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZGljZS01LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZGljZS02LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZGljZXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9kaWZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZGlzYy0yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZGlzYy1hbGJ1bS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Rpc2MtMy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Rpc2MuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9kaXZpZGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9kbmEtb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZG9jay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RuYS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RvZy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RvbGxhci1zaWduLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZG9udXQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9kb29yLWNsb3NlZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Rvb3ItY2xvc2VkLWxvY2tlZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Rvb3Itb3Blbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2RvdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Rvd25sb2FkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZHJhbWEuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9kcmFmdGluZy1jb21wYXNzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZHJpYmJibGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9kcmlsbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Ryb25lLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZHJvcGxldC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Ryb3BsZXQtb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZHJvcGxldHMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9kcnVtLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZHJ1bXN0aWNrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZHVtYmJlbGwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9lYXItb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZWFyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZWFydGguanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9lYXJ0aC1sb2NrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZWNsaXBzZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2VnZy1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9lZ2ctZnJpZWQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9lZ2cuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9lbGxpcHNlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZWxsaXBzaXMtdmVydGljYWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9lbGxpcHNpcy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2VxdWFsLWFwcHJveGltYXRlbHkuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9lcXVhbC1ub3QuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9lcXVhbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2VyYXNlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2V0aGVybmV0LXBvcnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ldXJvLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZXhwYW5kLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZXYtY2hhcmdlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2V4dGVybmFsLWxpbmsuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9leWUtb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZXllLWNsb3NlZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2V5ZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZhY2Vib29rLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmFjdG9yeS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Zhbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Zhc3QtZm9yd2FyZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZlYXRoZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mZW5jZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZlcnJpcy13aGVlbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpZ21hLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1hcmNoaXZlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1heGlzLTNkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1iYWRnZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtYm94LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1icmFjZXMtY29ybmVyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1icmFjZXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWNoYXJ0LWNvbHVtbi1pbmNyZWFzaW5nLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1jaGFydC1jb2x1bW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWNoYXJ0LWxpbmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWNoYXJ0LXBpZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtY2hlY2stY29ybmVyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1jaGVjay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtY29kZS1jb3JuZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWNsb2NrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1jb2RlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1jb2cuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWRpZ2l0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1kaWZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1kb3duLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1leGNsYW1hdGlvbi1wb2ludC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtaGVhZHBob25lLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1oZWFydC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtaW1hZ2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLWlucHV0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1sb2NrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1rZXkuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLW1pbnVzLWNvcm5lci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtbWludXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLW11c2ljLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1vdXRwdXQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXBlbi1saW5lLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1wZW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXBsYXkuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXBsdXMtY29ybmVyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1wbHVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1xdWVzdGlvbi1tYXJrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1zY2FuLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1zZWFyY2gtY29ybmVyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1zZWFyY2guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXNpZ25hbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtc2xpZGVycy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtc3ByZWFkc2hlZXQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXN0YWNrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS1zeW1saW5rLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS10ZXh0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS10eXBlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS10ZXJtaW5hbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpbGUtdHlwZS1jb3JuZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXVwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS11c2VyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS12aWRlby1jYW1lcmEuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXgtY29ybmVyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZS12b2x1bWUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLXguanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlsZXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maWxtLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmluZ2VycHJpbnQtcGF0dGVybi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZpcmUtZXh0aW5ndWlzaGVyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmlzaC1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maXNoLXN5bWJvbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Zpc2guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maXNoaW5nLWhvb2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9maXNoaW5nLXJvZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZsYWctdHJpYW5nbGUtbGVmdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZsYWctb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxhZy10cmlhbmdsZS1yaWdodC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZsYWcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mbGFtZS1raW5kbGluZy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZsYW1lLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxhc2hsaWdodC1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mbGFzaGxpZ2h0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxhc2stY29uaWNhbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZsYXNrLWNvbmljYWwtb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxhc2stcm91bmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mbGlwLWhvcml6b250YWwtMi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZsaXAtdmVydGljYWwtMi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Zsb3dlci0yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZmxvd2VyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9jdXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkLWhvcml6b250YWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkLXZlcnRpY2FsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLWFyY2hpdmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItY2hlY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItY2xvY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItY2xvc2VkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLWNvZGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItY29nLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLWRvdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1kb3duLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLWdpdC0yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLWdpdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1oZWFydC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1pbnB1dC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1rYW5iYW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXIta2V5LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLWxvY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItbWludXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItb3Blbi1kb3QuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItb3Blbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1wZW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItb3V0cHV0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLXBsdXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItcm9vdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1zZWFyY2gtMi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1zZWFyY2guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItc3ltbGluay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci1zeW5jLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9sZGVyLXRyZWUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXItdXAuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb2xkZXIteC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvbGRlcnMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb290cHJpbnRzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZm9ybS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ZvcmtsaWZ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZnJhbWUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mb3J3YXJkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZnJhbWVyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZnJvd24uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mdWVsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZnVsbHNjcmVlbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2Z1bm5lbC1wbHVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZnVubmVsLXguanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9mdW5uZWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9nYWxsZXJ5LWhvcml6b250YWwtZW5kLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2FsbGVyeS1ob3Jpem9udGFsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2FsbGVyeS10aHVtYm5haWxzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2FsbGVyeS12ZXJ0aWNhbC1lbmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9nYWxsZXJ5LXZlcnRpY2FsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2FtZXBhZC0yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2FtZXBhZC1kaXJlY3Rpb25hbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dhbWVwYWQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9nYXVnZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dhdmVsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2VvcmdpYW4tbGFyaS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dlbS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dob3N0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2lmdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dpdC1icmFuY2gtbWludXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXQtYnJhbmNoLXBsdXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXQtYnJhbmNoLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0LWNvbW1pdC1ob3Jpem9udGFsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0LWNvbW1pdC12ZXJ0aWNhbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dpdC1jb21wYXJlLWFycm93cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dpdC1jb21wYXJlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0LWdyYXBoLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0LWZvcmsuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXQtbWVyZ2UtY29uZmxpY3QuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXQtbWVyZ2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXQtcHVsbC1yZXF1ZXN0LWFycm93LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0LXB1bGwtcmVxdWVzdC1jbG9zZWQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXQtcHVsbC1yZXF1ZXN0LWNyZWF0ZS1hcnJvdy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dpdC1wdWxsLXJlcXVlc3QtY3JlYXRlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2l0LXB1bGwtcmVxdWVzdC1kcmFmdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dpdC1wdWxsLXJlcXVlc3QuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXRodWIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9naXRsYWIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9nbGFzcy13YXRlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dsb2JlLWxvY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9nbGFzc2VzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ2xvYmUteC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dsb2JlLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dsb2JlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ29hbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dwdS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dyYWR1YXRpb24tY2FwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ3JpZC0yeDItY2hlY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ncmlkLTJ4Mi1wbHVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ3JhcGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ncmlkLTJ4Mi14LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ3JpZC0yeDIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ncmlkLTN4Mi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dyaWQtM3gzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ3JpcC1ob3Jpem9udGFsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvZ3JpcC12ZXJ0aWNhbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2dyaXAuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ncm91cC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2d1aXRhci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhbS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhbWJ1cmdlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhbW1lci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhbmQtY29pbnMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9oYW5kLWZpc3QuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9oYW5kLWdyYWIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9oYW5kLWhlYXJ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFuZC1oZWxwaW5nLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFuZC1tZXRhbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhbmQtcGxhdHRlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhbmRiYWcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9oYW5kLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFyZC1kcml2ZS1kb3dubG9hZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhcmQtZHJpdmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9oYW5kc2hha2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9oYXJkLWRyaXZlLXVwbG9hZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhcmQtaGF0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaGFzaC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hhdC1nbGFzc2VzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaGF6ZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaGRtaS1wb3J0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhZGluZy0xLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhZGluZy0yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhZGluZy0zLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhZGluZy00LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhZGluZy01LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhZGluZy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlYWRpbmctNi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlYWRwaG9uZXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9oZWFkcGhvbmUtb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhZHNldC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlYXJ0LWhhbmRzaGFrZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlYXJ0LWNyYWNrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhcnQtb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhcnQtbWludXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9oZWFydC1wbHVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaGVhcnQtcHVsc2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9oZWFydC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlYXRlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hlbGljb3B0ZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9oZXhhZ29uLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaGlnaGxpZ2h0ZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9oaXN0b3J5LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaG9wLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hvc3BpdGFsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaG9wLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaG90ZWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ob3VyZ2xhc3MuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ob3VzZS1oZWFydC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2hvdXNlLXBsdXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ob3VzZS1wbHVnLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaG91c2Utd2lmaS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ljZS1jcmVhbS1ib3dsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaG91c2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9pY2UtY3JlYW0tY29uZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2lkLWNhcmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9pZC1jYXJkLWxhbnlhcmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9pbWFnZS1kb3duLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaW1hZ2UtbWludXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9pbWFnZS1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9pbWFnZS1wbGF5LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaW1hZ2UtcGx1cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ltYWdlLXVwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaW1hZ2UtdXBzY2FsZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2ltYWdlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaW1hZ2VzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaW1wb3J0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaW5ib3guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9pbmZpbml0eS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2luZGlhbi1ydXBlZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2luZm8uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9pbnNwZWN0aW9uLXBhbmVsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaW5zdGFncmFtLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaXRhbGljLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaXRlcmF0aW9uLWN3LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvaXRlcmF0aW9uLWNjdy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2pveXN0aWNrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvamFwYW5lc2UteWVuLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMva2FuYmFuLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMva2F5YWsuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9rZXktc3F1YXJlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMva2V5LXJvdW5kLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMva2V5LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMva2V5Ym9hcmQtb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMva2V5Ym9hcmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9rZXlib2FyZC1tdXNpYy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xhbXAtY2VpbGluZy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xhbXAtZGVzay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xhbXAtZmxvb3IuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYW1wLXdhbGwtZG93bi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xhbXAtd2FsbC11cC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xhbmQtcGxvdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xhbXAuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYW5kbWFyay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xhbmd1YWdlcy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xhcHRvcC1taW5pbWFsLWNoZWNrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGFwdG9wLW1pbmltYWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYXB0b3AuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYXNzby1zZWxlY3QuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYXNzby5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xhdWdoLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGF5ZXJzLTIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYXllcnMtcGx1cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xheWVycy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xheW91dC1ncmlkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGF5b3V0LWRhc2hib2FyZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xheW91dC1saXN0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGF5b3V0LXBhbmVsLWxlZnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9sYXlvdXQtcGFuZWwtdG9wLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGF5b3V0LXRlbXBsYXRlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGVhZnktZ3JlZW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9sZWN0ZXJuLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGVhZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xlbnMtY29uY2F2ZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xlbnMtY29udmV4LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlicmFyeS1iaWcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9saWJyYXJ5LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlmZS1idW95LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlnYXR1cmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9saWdodGJ1bGIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9saW5lLWRvdC1yaWdodC1ob3Jpem9udGFsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlnaHRidWxiLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpbmUtc3F1aWdnbGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9saW5rLTItb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGluay0yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGluay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpbmtlZGluLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC1jaGVjay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QtY2hlY2tzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC1jaGV2cm9ucy1kb3duLXVwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC1jb2xsYXBzZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QtY2hldnJvbnMtdXAtZG93bi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QtZW5kLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC1maWx0ZXItcGx1cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QtZmlsdGVyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC1pbmRlbnQtZGVjcmVhc2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LWluZGVudC1pbmNyZWFzZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QtbXVzaWMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LW1pbnVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC1vcmRlcmVkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC1yZXN0YXJ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC1wbHVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbGlzdC1zdGFydC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QtdG9kby5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QtdHJlZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xpc3QtdmlkZW8uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LXguanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9saXN0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbG9hZGVyLWNpcmNsZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xvYWRlci1waW53aGVlbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xvYWRlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xvY2F0ZS1maXhlZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xvY2F0ZS1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9sb2NhdGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9sb2NrLWtleWhvbGUtb3Blbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xvY2sta2V5aG9sZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xvY2stb3Blbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xvZy1pbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xvY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9sb2ctb3V0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbG9ncy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL2xvbGxpcG9wLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbHVnZ2FnZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hZ25ldC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21haWwtY2hlY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYWlsLW1pbnVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFpbC1vcGVuLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFpbC1wbHVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFpbC1xdWVzdGlvbi1tYXJrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFpbC1zZWFyY2guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYWlsLXdhcm5pbmcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYWlsLXguanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYWlsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFpbGJveC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21haWxzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFwLW1pbnVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFwLXBpbi1jaGVjay1pbnNpZGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXAtcGluLWhvdXNlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFwLXBpbi1jaGVjay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcC1waW4tbWludXMtaW5zaWRlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFwLXBpbi1taW51cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcC1waW4tb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFwLXBpbi1wZW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXAtcGluLXBsdXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXAtcGluLXBsdXMtaW5zaWRlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFwLXBpbi14LWluc2lkZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcC1waW4teC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcC1waW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXAtcGlubmVkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWFwLXBsdXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXJzLXN0cm9rZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21hcnMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tYXJ0aW5pLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWF4aW1pemUtMi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21heGltaXplLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVnYXBob25lLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lZGFsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVnYXBob25lLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVoLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVudS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lbW9yeS1zdGljay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lcmdlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1jaXJjbGUtY2hlY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLWNpcmNsZS1jb2RlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1jaXJjbGUtZGFzaGVkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1jaXJjbGUtaGVhcnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLWNpcmNsZS1tb3JlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1jaXJjbGUtb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1jaXJjbGUtcGx1cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2UtY2lyY2xlLXF1ZXN0aW9uLW1hcmsuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLWNpcmNsZS1yZXBseS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2UtY2lyY2xlLXdhcm5pbmcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLWNpcmNsZS14LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1jaXJjbGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLXNxdWFyZS1jaGVjay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLWNvZGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLXNxdWFyZS1kYXNoZWQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLXNxdWFyZS1kaWZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1zcXVhcmUtZG90LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1zcXVhcmUtaGVhcnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLXNxdWFyZS1sb2NrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1zcXVhcmUtbW9yZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLXBsdXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLXNxdWFyZS1xdW90ZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLXJlcGx5LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1zcXVhcmUtc2hhcmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLXNxdWFyZS10ZXh0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWVzc2FnZS1zcXVhcmUtd2FybmluZy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2Utc3F1YXJlLXguanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tZXNzYWdlLXNxdWFyZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21lc3NhZ2VzLXNxdWFyZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21ldHJvbm9tZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21pYy1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9taWMtdm9jYWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9taWMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9taWNyb2NoaXAuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9taWNyb3dhdmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9taWxlc3RvbmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9taWNyb3Njb3BlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWlsay1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9taW5pbWl6ZS0yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWlsay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21pbmltaXplLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbWludXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9taXJyb3ItcmVjdGFuZ3VsYXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9taXJyb3Itcm91bmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb25pdG9yLWNoZWNrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbW9uaXRvci1jbG91ZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vbml0b3ItY29nLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbW9uaXRvci1kb3QuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb25pdG9yLWRvd24uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb25pdG9yLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vbml0b3ItcGF1c2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb25pdG9yLXBsYXkuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb25pdG9yLXNtYXJ0cGhvbmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb25pdG9yLXNwZWFrZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb25pdG9yLXN0b3AuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb25pdG9yLXVwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbW9uaXRvci14LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbW9uaXRvci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vb24tc3Rhci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vb24uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3RvcmJpa2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3VudGFpbi1zbm93LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbW91bnRhaW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3VzZS1sZWZ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbW91c2Utb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbW91c2UtcG9pbnRlci0yLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdXNlLXBvaW50ZXItMi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdXNlLXBvaW50ZXItYmFuLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbW91c2UtcG9pbnRlci1jbGljay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdXNlLXBvaW50ZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3VzZS1yaWdodC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdmUtM2QuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3VzZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdmUtZGlhZ29uYWwtMi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdmUtZGlhZ29uYWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3ZlLWRvd24tcmlnaHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3ZlLWRvd24tbGVmdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdmUtZG93bi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdmUtaG9yaXpvbnRhbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdmUtcmlnaHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3ZlLWxlZnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3ZlLXVwLWxlZnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3ZlLXVwLXJpZ2h0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbW92ZS11cC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL21vdmUtdmVydGljYWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tb3ZlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbXVzaWMtMi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL211c2ljLTMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9tdXNpYy00LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbXVzaWMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9uYXZpZ2F0aW9uLTItb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbmF2aWdhdGlvbi0yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbmF2aWdhdGlvbi1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9uYXZpZ2F0aW9uLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbmV0d29yay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL25mYy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL25ld3NwYXBlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL25vbi1iaW5hcnkuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ub3RlYm9vay1wZW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ub3RlYm9vay10YWJzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbm90ZWJvb2stdGV4dC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL25vdGVwYWQtdGV4dC1kYXNoZWQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ub3RlcGFkLXRleHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ub3RlYm9vay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL251dC1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9vY3RhZ29uLW1pbnVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvbnV0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvb2N0YWdvbi1hbGVydC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL29jdGFnb24tcGF1c2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9vY3RhZ29uLXguanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9vY3RhZ29uLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvb21lZ2EuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9vcHRpb24uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9vcmJpdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL29yaWdhbWkuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYWNrYWdlLTIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYWNrYWdlLWNoZWNrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFja2FnZS1taW51cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhY2thZ2Utb3Blbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhY2thZ2UtcGx1cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhY2thZ2Utc2VhcmNoLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFja2FnZS14LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFja2FnZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhaW50LWJ1Y2tldC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhaW50LXJvbGxlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhaW50YnJ1c2gtdmVydGljYWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYWludGJydXNoLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFsZXR0ZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmRhLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtYm90dG9tLWNsb3NlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtYm90dG9tLWRhc2hlZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmVsLWJvdHRvbS1vcGVuLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtYm90dG9tLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtbGVmdC1jbG9zZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmVsLWxlZnQtZGFzaGVkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtbGVmdC1vcGVuLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtbGVmdC1yaWdodC1kYXNoZWQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbC1sZWZ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtcmlnaHQtY2xvc2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbC1yaWdodC1kYXNoZWQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbC1yaWdodC1vcGVuLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtcmlnaHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbC10b3AtYm90dG9tLWRhc2hlZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmVsLXRvcC1jbG9zZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmVsLXRvcC1vcGVuLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGFuZWwtdG9wLWRhc2hlZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmVsLXRvcC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmVscy1sZWZ0LWJvdHRvbS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhbmVscy1yaWdodC1ib3R0b20uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYW5lbHMtdG9wLWxlZnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYXBlcmNsaXAuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYXJlbnRoZXNlcy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BhcmtpbmctbWV0ZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYXJ0eS1wb3BwZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wYXVzZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Bhdy1wcmludC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BjLWNhc2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wZW4tbGluZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Blbi1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wZW4tdG9vbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Blbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BlbmNpbC1saW5lLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGVuY2lsLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BlbmNpbC1ydWxlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BlbmNpbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BlcmNlbnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wZW50YWdvbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BlcnNvbi1zdGFuZGluZy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BoaWxpcHBpbmUtcGVzby5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Bob25lLWNhbGwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9waG9uZS1mb3J3YXJkZWQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9waG9uZS1pbmNvbWluZy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Bob25lLW1pc3NlZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Bob25lLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Bob25lLW91dGdvaW5nLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGhvbmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9waS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BpYW5vLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGlja2F4ZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BpY3R1cmUtaW4tcGljdHVyZS0yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGljdHVyZS1pbi1waWN0dXJlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGlnZ3ktYmFuay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BpbGNyb3ctbGVmdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BpbGNyb3ctcmlnaHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9waWxjcm93LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGlsbC1ib3R0bGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9waWxsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGluLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Bpbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BpcGV0dGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9waXp6YS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BsYW5lLWxhbmRpbmcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wbGFuZS10YWtlb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGxhbmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wbGF5LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGx1Zy0yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGx1Zy16YXAuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wbHVnLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcGx1cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BvY2tldC1rbmlmZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BvY2tldC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3BvZGNhc3QuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wb2ludGVyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcG9pbnRlci1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wb3Bjb3JuLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcG9wc2ljbGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wb3VuZC1zdGVybGluZy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Bvd2VyLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Bvd2VyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcHJlc2VudGF0aW9uLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcHJpbnRlci1jaGVjay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ByaW50ZXIteC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ByaW50ZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wcm9qZWN0b3IuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9wcm9wb3J0aW9ucy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3B1enpsZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3B5cmFtaWQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9xci1jb2RlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcmFiYml0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcXVvdGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yYWRhci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JhZGlhdGlvbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JhZGljYWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yYWRpby1yZWNlaXZlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JhZGlvLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcmFkaW8tdG93ZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yYWRpdXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yYWlsLXN5bWJvbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JhaW5ib3cuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yYXQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yYXRpby5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY2VpcHQtZXVyby5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY2VpcHQtY2VudC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY2VpcHQtaW5kaWFuLXJ1cGVlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVjZWlwdC1qYXBhbmVzZS15ZW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWNlaXB0LXBvdW5kLXN0ZXJsaW5nLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVjZWlwdC1ydXNzaWFuLXJ1YmxlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVjZWlwdC10ZXh0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVjZWlwdC1zd2lzcy1mcmFuYy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY2VpcHQtdHVya2lzaC1saXJhLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVjZWlwdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY3RhbmdsZS1jaXJjbGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWN0YW5nbGUtZWxsaXBzaXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWN0YW5nbGUtZ29nZ2xlcy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY3RhbmdsZS1ob3Jpem9udGFsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVjeWNsZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlY3RhbmdsZS12ZXJ0aWNhbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlZG8tMi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlZG8tZG90LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVkby5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlZnJlc2gtY2N3LWRvdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlZnJlc2gtY2N3LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVmcmVzaC1jdy1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZWZyZXNoLWN3LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVmcmlnZXJhdG9yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVnZXguanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZW1vdmUtZm9ybWF0dGluZy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlcGVhdC0xLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcmVwZWF0LTIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZXBlYXQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZXBsYWNlLWFsbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JlcGxhY2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZXBseS1hbGwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZXdpbmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yZXBseS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JpYmJvbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JvY2tldC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JvY2tpbmctY2hhaXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yb2xsZXItY29hc3Rlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Jvc2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yb3RhdGUtM2QuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yb3RhdGUtY2N3LWtleS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JvdGF0ZS1jY3ctc3F1YXJlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcm90YXRlLWNjdy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JvdGF0ZS1jdy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JvdGF0ZS1jdy1zcXVhcmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9yb3V0ZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JvdXRlLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3JvdXRlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Jvd3MtMi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Jvd3MtMy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Jvd3MtNC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Jzcy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3J1bGVyLWRpbWVuc2lvbi1saW5lLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvcnVsZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9ydXNzaWFuLXJ1YmxlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2FpbGJvYXQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zYWxhZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NhbmR3aWNoLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2F0ZWxsaXRlLWRpc2guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zYXRlbGxpdGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zYXVkaS1yaXlhbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NhdmUtb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2F2ZS1hbGwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zYXZlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2NhbGUtM2QuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2FsZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjYWxpbmcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2FuLWJhcmNvZGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2FuLWV5ZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjYW4tZmFjZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjYW4taGVhcnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2FuLWxpbmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2FuLXFyLWNvZGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2FuLXNlYXJjaC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjYW4tdGV4dC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjYW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2hvb2wuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY2lzc29ycy1saW5lLWRhc2hlZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjaXNzb3JzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2Nvb3Rlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NjcmVlbi1zaGFyZS1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY3JlZW4tc2hhcmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zY3JvbGwtdGV4dC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Njcm9sbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlYXJjaC1hbGVydC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlYXJjaC1jaGVjay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlYXJjaC1jb2RlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2VhcmNoLXguanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zZWFyY2gtc2xhc2guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zZWN0aW9uLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2VhcmNoLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2VuZC1ob3Jpem9udGFsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2VuZC10by1iYWNrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2VuZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlcGFyYXRvci1ob3Jpem9udGFsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2VwYXJhdG9yLXZlcnRpY2FsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2VydmVyLWNvZy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlcnZlci1jcmFzaC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NlcnZlci1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zZXJ2ZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zZXR0aW5ncy0yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2V0dGluZ3MuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaGFwZXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaGFyZS0yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hhcmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaGVldC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoZWxsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hlbHZpbmctdW5pdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaWVsZC1hbGVydC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaWVsZC1iYW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaGllbGQtZWxsaXBzaXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaGllbGQtY2hlY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaGllbGQtaGFsZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaWVsZC1taW51cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaWVsZC1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaGllbGQtcGx1cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaWVsZC1xdWVzdGlvbi1tYXJrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hpZWxkLXVzZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaGllbGQteC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NoaXAtd2hlZWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaGllbGQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaGlwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hpcnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaG9wcGluZy1iYWcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaG9wcGluZy1iYXNrZXQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaG9wcGluZy1jYXJ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hvdmVsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2hvd2VyLWhlYWQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaHJlZGRlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NocmltcC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Nocmluay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NocnViLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2h1ZmZsZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NpZ21hLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2lnbmFsLWhpZ2guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaWduYWwtbG93LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2lnbmFsLW1lZGl1bS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NpZ25hbC16ZXJvLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2lnbmFsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2lnbmF0dXJlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2lnbnBvc3QuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zaXJlbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NpZ25wb3N0LWJpZy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NraXAtYmFjay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NraXAtZm9yd2FyZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NsYWNrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2xhc2guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9za3VsbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NsaWNlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc2xpZGVycy12ZXJ0aWNhbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NsaWRlcnMtaG9yaXpvbnRhbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NtYXJ0cGhvbmUtY2hhcmdpbmcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zbWFydHBob25lLW5mYy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NtYXJ0cGhvbmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zbWlsZS1wbHVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc21pbGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zbm93Zmxha2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zb2FwLWRpc3BlbnNlci1kcm9wbGV0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc25haWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zb2ZhLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc29sYXItcGFuZWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zb3VwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3BhY2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcGFkZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NwYXJrbGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcGFya2xlcy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NwZWFrZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcGVlY2guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcGVsbC1jaGVjay0yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3BsaW5lLXBvaW50ZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcGVsbC1jaGVjay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NwbGluZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NwbGl0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3Bvb2wuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcHJheS1jYW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcG90bGlnaHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcHJvdXQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYXJyb3ctZG93bi1sZWZ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWFjdGl2aXR5LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWFycm93LWRvd24tcmlnaHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYXJyb3ctZG93bi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1hcnJvdy1sZWZ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWFycm93LW91dC1kb3duLWxlZnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYXJyb3ctb3V0LWRvd24tcmlnaHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYXJyb3ctb3V0LXVwLWxlZnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYXJyb3ctb3V0LXVwLXJpZ2h0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWFycm93LXJpZ2h0LWVudGVyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWFycm93LXJpZ2h0LWV4aXQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYXJyb3ctcmlnaHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtYXJyb3ctdXAtbGVmdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1hcnJvdy11cC1yaWdodC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1hcnJvdy11cC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1jZW50ZXJsaW5lLWRhc2hlZC1ob3Jpem9udGFsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWFzdGVyaXNrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWJvdHRvbS1kYXNoZWQtc2Npc3NvcnMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtY2VudGVybGluZS1kYXNoZWQtdmVydGljYWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtY2hhcnQtZ2FudHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtY2hlY2stYmlnLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWNoZWNrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWNoZXZyb24tZG93bi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1jaGV2cm9uLWxlZnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtY2hldnJvbi1yaWdodC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1jaGV2cm9uLXVwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWNvZGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtZGFzaGVkLWJvdHRvbS1jb2RlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWRhc2hlZC1ib3R0b20uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtZGFzaGVkLWthbmJhbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1kYXNoZWQtbW91c2UtcG9pbnRlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1kYXNoZWQtdG9wLXNvbGlkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWRhc2hlZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1kaXZpZGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtZG90LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWVxdWFsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWZ1bmN0aW9uLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLWthbmJhbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1saWJyYXJ5LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLW0uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtbWVudS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1taW51cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1tb3VzZS1wb2ludGVyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXBhcmtpbmctb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXBhcmtpbmcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtcGF1c2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtcGVuLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXBlcmNlbnQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtcGkuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtcGlsY3Jvdy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1wbGF5LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXBsdXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtcG93ZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtcmFkaWNhbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1yb3VuZC1jb3JuZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtc2Npc3NvcnMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtc2lnbWEuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtc2xhc2guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtc3BsaXQtaG9yaXpvbnRhbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1zcGxpdC12ZXJ0aWNhbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1zcXVhcmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtc3RhY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtc3Rhci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS1zdG9wLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLXVzZXItcm91bmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtdGVybWluYWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmUtdXNlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWFyZS14LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlcy1leGNsdWRlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlcy1pbnRlcnNlY3QuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVhcmVzLXN1YnRyYWN0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3F1YXJlcy11bml0ZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWlyY2xlLWRhc2hlZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3NxdWlyY2xlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3RhbXAuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zcXVpcnJlbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N0YXItaGFsZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N0YXItb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3Rhci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N0ZXAtYmFjay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N0ZXAtZm9yd2FyZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N0ZXRob3Njb3BlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3RpY2tlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N0aWNreS1ub3RlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3RvbmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdG9yZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N0cmV0Y2gtaG9yaXpvbnRhbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N0cmV0Y2gtdmVydGljYWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdHJpa2V0aHJvdWdoLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3Vic2NyaXB0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3VuLWRpbS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N1bi1tZWRpdW0uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zdW4tbW9vbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N1bi1zbm93LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3VuLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3VucmlzZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N1bnNldC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N1cGVyc2NyaXB0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3dhdGNoLWJvb2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zd2l0Y2gtY2FtZXJhLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvc3dpc3MtZnJhbmMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy9zd29yZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhYmxlLTIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWJsZS1jZWxscy1tZXJnZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N3b3Jkcy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3N5cmluZ2UuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWJsZS1jZWxscy1zcGxpdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhYmxlLWNvbHVtbnMtc3BsaXQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWJsZS1vZi1jb250ZW50cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhYmxlLXByb3BlcnRpZXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWJsZS1yb3dzLXNwbGl0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGFibGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWJsZXQtc21hcnRwaG9uZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhYmxldC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhYmxldHMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWdzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGFsbHktMS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhbGx5LTIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90YWxseS0zLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGFsbHktNC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RhbGx5LTUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90YW5nZW50LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGFyZ2V0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGVsZXNjb3BlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGVudC10cmVlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGVudC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Rlcm1pbmFsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGVzdC10dWJlLWRpYWdvbmFsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGVzdC10dWJlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGVzdC10dWJlcy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RleHQtYWxpZ24tY2VudGVyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGV4dC1hbGlnbi1lbmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90ZXh0LWFsaWduLWp1c3RpZnkuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90ZXh0LWFsaWduLXN0YXJ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGV4dC1jdXJzb3ItaW5wdXQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90ZXh0LWN1cnNvci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RleHQtaW5pdGlhbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RleHQtcXVvdGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90ZXh0LXNlYXJjaC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RleHQtc2VsZWN0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGV4dC13cmFwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGhlYXRlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RoZXJtb21ldGVyLXNub3dmbGFrZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RoZXJtb21ldGVyLXN1bi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RoZXJtb21ldGVyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGh1bWJzLWRvd24uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90aHVtYnMtdXAuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90aWNrZXQtY2hlY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90aWNrZXQtbWludXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90aWNrZXQtcGVyY2VudC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RpY2tldC1wbHVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGlja2V0LXNsYXNoLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGlja2V0LXguanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90aWNrZXQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90aWNrZXRzLXBsYW5lLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGlja2V0cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RpbWVyLXJlc2V0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGltZXItb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdGltZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90b2dnbGUtbGVmdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RvaWxldC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RvZ2dsZS1yaWdodC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Rvb2wtY2FzZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Rvb2xib3guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90b3JuYWRvLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdG9ydXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90b3VjaHBhZC1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90b3VjaHBhZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Rvd2VsLXJhY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90b3dlci1jb250cm9sLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdG95LWJyaWNrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJhY3Rvci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyYWZmaWMtY29uZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyYWluLWZyb250LXR1bm5lbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyYWluLWZyb250LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJhaW4tdHJhY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmFtLWZyb250LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJhbnNnZW5kZXIuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmFzaC0yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJhc2guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmVlLXBhbG0uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmVlLWRlY2lkdW91cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyZWUtcGluZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyZWVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJlbGxvLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJlbmRpbmctZG93bi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyZW5kaW5nLXVwLWRvd24uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmVuZGluZy11cC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RyaWFuZ2xlLWFsZXJ0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJpYW5nbGUtZGFzaGVkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJpYW5nbGUtcmlnaHQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90cmlhbmdsZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3Ryb3BoeS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3RydWNrLWVsZWN0cmljLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdHJ1Y2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90dXJraXNoLWxpcmEuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90dXJudGFibGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90dXJ0bGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90di1taW5pbWFsLXBsYXkuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90di1taW5pbWFsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdHYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90d2l0Y2guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy90d2l0dGVyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdHlwZS1vdXRsaW5lLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdHlwZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VtYnJlbGxhLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdW1icmVsbGEtb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5kZXJsaW5lLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5kby0yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5kby1kb3QuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy91bmRvLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5mb2xkLWhvcml6b250YWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy91bmZvbGQtdmVydGljYWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy91bmdyb3VwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdW5pdmVyc2l0eS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VubGluay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VucGx1Zy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VubGluay0yLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdXBsb2FkLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNiLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1jaGVjay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXItY29nLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1rZXkuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2VyLWxvY2suanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2VyLW1pbnVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1wbHVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1wZW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2VyLXJvdW5kLWNoZWNrLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1yb3VuZC1jb2cuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2VyLXJvdW5kLWtleS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXItcm91bmQtbWludXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy91c2VyLXJvdW5kLXBlbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXItcm91bmQtcGx1cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXItcm91bmQtc2VhcmNoLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1yb3VuZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXItcm91bmQteC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXItc2VhcmNoLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci1zdGFyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci14LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdXNlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXJzLXJvdW5kLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdXRlbnNpbHMtY3Jvc3NlZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3VzZXJzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdXRpbGl0eS1wb2xlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdXRlbnNpbHMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy92YW4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy92YXJpYWJsZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZlY3Rvci1zcXVhcmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy92YXVsdC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZlZ2FuLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdmVuZXRpYW4tbWFzay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZlbnVzLWFuZC1tYXJzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdmVudXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy92aWJyYXRlLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZpYnJhdGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy92aWRlby1vZmYuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy92aWRlby5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZpZGVvdGFwZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZpZXcuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy92b2ljZW1haWwuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy92b2xsZXliYWxsLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdm9sdW1lLTEuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy92b2x1bWUtMi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZvbHVtZS14LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvdm9sdW1lLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZvbHVtZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dhbGxldC1jYXJkcy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3ZvdGUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy93YWxsZXQtbWluaW1hbC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dhbGxldC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dhbGxwYXBlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dhbmQtc3BhcmtsZXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy93YW5kLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvd2FyZWhvdXNlLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvd2FzaGluZy1tYWNoaW5lLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvd2F0Y2guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy93YXZlcy1hcnJvdy1kb3duLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvd2F2ZXMtbGFkZGVyLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvd2F2ZXMtYXJyb3ctdXAuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy93YXZlcy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dheXBvaW50cy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dlYmNhbS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dlYmhvb2stb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvd2ViaG9vay5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dlaWdodC10aWxkZS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3doZWF0LW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dlaWdodC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3doZWF0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvd2hvbGUtd29yZC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dpZmktY29nLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvd2lmaS1oaWdoLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvd2lmaS1sb3cuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy93aWZpLXBlbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dpZmktb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvd2lmaS16ZXJvLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvd2lmaS1zeW5jLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvd2lmaS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dpbmQtYXJyb3ctZG93bi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dpbmQuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy93aW5lLW9mZi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dpbmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy93b3JrZmxvdy5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3dvcm0uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy93cmVuY2guanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy94LWxpbmUtdG9wLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMveC5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3lvdXR1YmUuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy96YXAtb2ZmLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvemFwLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvem9kaWFjLWFxdWFyaXVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvem9kaWFjLWFyaWVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvem9kaWFjLWNhbmNlci5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3pvZGlhYy1jYXByaWNvcm4uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy96b2RpYWMtbGVvLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvem9kaWFjLWdlbWluaS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3pvZGlhYy1saWJyYS5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3pvZGlhYy1vcGhpdWNodXMuanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy96b2RpYWMtcGlzY2VzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvem9kaWFjLXNhZ2l0dGFyaXVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvem9kaWFjLXNjb3JwaW8uanM6Cmx1Y2lkZS9kaXN0L2VzbS9pY29ucy96b2RpYWMtdGF1cnVzLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvem9kaWFjLXZpcmdvLmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnMvem9vbS1pbi5qczoKbHVjaWRlL2Rpc3QvZXNtL2ljb25zL3pvb20tb3V0LmpzOgpsdWNpZGUvZGlzdC9lc20vaWNvbnNBbmRBbGlhc2VzLmpzOgpsdWNpZGUvZGlzdC9lc20vbHVjaWRlLmpzOgogICgqKgogICAqIEBsaWNlbnNlIGx1Y2lkZSB2MC41NzcuMCAtIElTQwogICAqCiAgICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuCiAgICogU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAgICopCgppYmFudG9vbHMvanNuZXh0L2liYW50b29scy5qczoKICAoKiEKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCBTYcWhYSBKb3ZhbmnEhwogICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIuMCBvciB0aGUgTUlUIGxpY2Vuc2UsCiAgICogYXQgeW91ciBvcHRpb24uIFRoaXMgZmlsZSBtYXkgbm90IGJlIGNvcGllZCwgbW9kaWZpZWQsIG9yIGRpc3RyaWJ1dGVkCiAgICogZXhjZXB0IGFjY29yZGluZyB0byB0aG9zZSB0ZXJtcy4KICAgKiBTUERYLUZpbGVDb3B5cmlnaHRUZXh0OiBTYcWhYSBKb3ZhbmnEhwogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQgb3IgTVBMLzIuMAogICAqKQogICgqKgogICAqIFZhbGlkYXRpb24sIGV4dHJhY3Rpb24gYW5kIGNyZWF0aW9uIG9mIElCQU4sIEJCQU4sIEJJQy9TV0lGVCBudW1iZXJzIHBsdXMgc29tZSBvdGhlciBoZWxwZnVsIHN0dWZmCiAgICogQHBhY2thZ2UgRG9jdW1lbnRhdGlvbgogICAqIEBhdXRob3IgU2HFoWEgSm92YW5pxIcKICAgKiBAbW9kdWxlIGliYW50b29scwogICAqIEB2ZXJzaW9uIDQuNS4xCiAgICogQGxpY2Vuc2UgTUlUIG9yIE1QTC0yLjAKICAgKiBAcHJlZmVycmVkCiAgICopCiovCi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJ1bmRsZS0xNzczNTI4NjU5MjU1LmpzLm1hcAo=" }, { "path": "index.html", diff --git a/ts/config/classes.config.ts b/ts/config/classes.config.ts index 3563b5a..fe54f41 100644 --- a/ts/config/classes.config.ts +++ b/ts/config/classes.config.ts @@ -7,7 +7,7 @@ import type * as interfaces from '../interfaces/index.js'; * or accepts programmatic configuration. */ export class TsViewConfig { - private s3Config: interfaces.IS3Config | null = null; + private storageConfig: interfaces.IStorageConfig | null = null; private mongoConfig: interfaces.IMongoConfig | null = null; /** @@ -29,7 +29,7 @@ export class TsViewConfig { // Parse S3 config if (envConfig.S3_HOST || envConfig.S3_ENDPOINT) { - this.s3Config = { + this.storageConfig = { endpoint: envConfig.S3_ENDPOINT || envConfig.S3_HOST || '', port: envConfig.S3_PORT ? parseInt(envConfig.S3_PORT, 10) : undefined, accessKey: envConfig.S3_ACCESSKEY || '', @@ -69,8 +69,8 @@ export class TsViewConfig { /** * Set S3 configuration programmatically */ - public setS3Config(config: interfaces.IS3Config): void { - this.s3Config = config; + public setStorageConfig(config: interfaces.IStorageConfig): void { + this.storageConfig = config; } /** @@ -83,8 +83,8 @@ export class TsViewConfig { /** * Get S3 configuration */ - public getS3Config(): interfaces.IS3Config | null { - return this.s3Config; + public getStorageConfig(): interfaces.IStorageConfig | null { + return this.storageConfig; } /** @@ -97,8 +97,8 @@ export class TsViewConfig { /** * Check if S3 is configured */ - public hasS3(): boolean { - return this.s3Config !== null && !!this.s3Config.endpoint && !!this.s3Config.accessKey; + public hasStorage(): boolean { + return this.storageConfig !== null && !!this.storageConfig.endpoint && !!this.storageConfig.accessKey; } /** diff --git a/ts/interfaces/index.ts b/ts/interfaces/index.ts index be7b673..938f92b 100644 --- a/ts/interfaces/index.ts +++ b/ts/interfaces/index.ts @@ -1,9 +1,9 @@ import type * as plugins from '../plugins.js'; /** - * Configuration for S3 connection + * Configuration for storage (S3-compatible) connection */ -export interface IS3Config { +export interface IStorageConfig { endpoint: string; port?: number; accessKey: string; @@ -24,7 +24,7 @@ export interface IMongoConfig { * Combined configuration for tsview */ export interface ITsViewConfig { - s3?: IS3Config; + s3?: IStorageConfig; mongo?: IMongoConfig; } @@ -97,7 +97,7 @@ export interface IReq_DeleteBucket extends plugins.typedrequestInterfaces.implem }; } -export interface IS3Object { +export interface IStorageObject { key: string; size?: number; lastModified?: string; @@ -115,7 +115,7 @@ export interface IReq_ListObjects extends plugins.typedrequestInterfaces.impleme delimiter?: string; }; response: { - objects: IS3Object[]; + objects: IStorageObject[]; prefixes: string[]; }; } diff --git a/ts/server/classes.viewserver.ts b/ts/server/classes.viewserver.ts index fa6cf67..b197442 100644 --- a/ts/server/classes.viewserver.ts +++ b/ts/server/classes.viewserver.ts @@ -39,7 +39,7 @@ export class ViewServer { this.changeStreamManager = new ChangeStreamManager(this.tsview); // Register API handlers directly to server's router - if (this.tsview.config.hasS3()) { + if (this.tsview.config.hasStorage()) { await registerS3Handlers(this.typedServer.typedrouter, this.tsview); } @@ -107,9 +107,9 @@ export class ViewServer { ) ); - // Subscribe to S3 bucket changes + // Subscribe to storage bucket changes typedrouter.addTypedHandler( - new plugins.typedrequest.TypedHandler( + new plugins.typedrequest.TypedHandler( 'subscribeS3', async (reqData, context) => { const connectionId = this.getConnectionId(context); @@ -127,9 +127,9 @@ export class ViewServer { ) ); - // Unsubscribe from S3 bucket changes + // Unsubscribe from storage bucket changes typedrouter.addTypedHandler( - new plugins.typedrequest.TypedHandler( + new plugins.typedrequest.TypedHandler( 'unsubscribeS3', async (reqData, context) => { const connectionId = this.getConnectionId(context); diff --git a/ts/streaming/classes.changestream-manager.ts b/ts/streaming/classes.changestream-manager.ts index 5e750da..f6705db 100644 --- a/ts/streaming/classes.changestream-manager.ts +++ b/ts/streaming/classes.changestream-manager.ts @@ -1,7 +1,7 @@ import * as plugins from '../plugins.js'; import type { TsView } from '../tsview.classes.tsview.js'; import type * as interfaces from './interfaces.streaming.js'; -import type { IS3ChangeEvent } from '@push.rocks/smartbucket'; +import type { IStorageChangeEvent } from './interfaces.streaming.js'; /** * Subscription entry tracking a client's subscription to a resource @@ -21,19 +21,19 @@ interface IMongoWatcherEntry { } /** - * S3 watcher entry + * Storage watcher entry */ -interface IS3WatcherEntry { +interface IStorageWatcherEntry { watcher: plugins.smartbucket.BucketWatcher; subscriptions: Map; // connectionId -> subscription } /** - * ChangeStreamManager manages real-time change streaming for both MongoDB and S3. + * ChangeStreamManager manages real-time change streaming for both MongoDB and storage. * * Features: * - MongoDB Change Streams for real-time database updates - * - S3 BucketWatcher for polling-based S3 change detection + * - S3 BucketWatcher for polling-based storage change detection * - Subscription management per WebSocket client * - Activity stream with ring buffer for recent events * - Automatic cleanup on client disconnect @@ -45,8 +45,8 @@ export class ChangeStreamManager { // MongoDB watchers: "db/collection" -> watcher entry private mongoWatchers: Map = new Map(); - // S3 watchers: "bucket/prefix" -> watcher entry - private s3Watchers: Map = new Map(); + // Storage watchers: "bucket/prefix" -> watcher entry + private storageWatchers: Map = new Map(); // Activity subscribers: connectionId -> subscription entry private activitySubscribers: Map = new Map(); @@ -57,7 +57,7 @@ export class ChangeStreamManager { // Global watchers for the activity stream (started lazily on first subscriber) private globalMongoWatcher: plugins.mongodb.ChangeStream | null = null; - private globalS3Watchers: Map = new Map(); + private globalStorageWatchers: Map = new Map(); private globalWatchersActive: boolean = false; // Counter for generating unique subscription IDs @@ -89,9 +89,9 @@ export class ChangeStreamManager { } /** - * Get the S3 key for a bucket/prefix pair + * Get the storage key for a bucket/prefix pair */ - private getS3Key(bucket: string, prefix?: string): string { + private getStorageKey(bucket: string, prefix?: string): string { return prefix ? `${bucket}/${prefix}` : bucket; } @@ -280,24 +280,24 @@ export class ChangeStreamManager { } // =========================================== - // S3 Change Watching + // Storage Change Watching // =========================================== /** - * Subscribe a client to S3 bucket/prefix changes + * Subscribe a client to storage bucket/prefix changes */ public async subscribeToS3( connectionId: string, bucket: string, prefix?: string ): Promise<{ success: boolean; subscriptionId: string }> { - const key = this.getS3Key(bucket, prefix); + const key = this.getStorageKey(bucket, prefix); - let entry = this.s3Watchers.get(key); + let entry = this.storageWatchers.get(key); // Create watcher if it doesn't exist if (!entry) { - const watcher = await this.createS3Watcher(bucket, prefix); + const watcher = await this.createStorageWatcher(bucket, prefix); if (!watcher) { return { success: false, subscriptionId: '' }; } @@ -306,7 +306,7 @@ export class ChangeStreamManager { watcher, subscriptions: new Map(), }; - this.s3Watchers.set(key, entry); + this.storageWatchers.set(key, entry); } // Add subscription @@ -317,47 +317,47 @@ export class ChangeStreamManager { createdAt: new Date(), }); - console.log(`[ChangeStream] S3 subscription added: ${key} for connection ${connectionId}`); + console.log(`[ChangeStream] Storage subscription added: ${key} for connection ${connectionId}`); return { success: true, subscriptionId }; } /** - * Unsubscribe a client from S3 bucket/prefix changes + * Unsubscribe a client from storage bucket/prefix changes */ public async unsubscribeFromS3( connectionId: string, bucket: string, prefix?: string ): Promise { - const key = this.getS3Key(bucket, prefix); - const entry = this.s3Watchers.get(key); + const key = this.getStorageKey(bucket, prefix); + const entry = this.storageWatchers.get(key); if (!entry) { return false; } entry.subscriptions.delete(connectionId); - console.log(`[ChangeStream] S3 subscription removed: ${key} for connection ${connectionId}`); + console.log(`[ChangeStream] Storage subscription removed: ${key} for connection ${connectionId}`); // Close watcher if no more subscribers if (entry.subscriptions.size === 0) { - await this.closeS3Watcher(key); + await this.closeStorageWatcher(key); } return true; } /** - * Create an S3 bucket watcher + * Create a storage bucket watcher */ - private async createS3Watcher( + private async createStorageWatcher( bucket: string, prefix?: string ): Promise { try { const smartbucket = await this.tsview.getSmartBucket(); if (!smartbucket) { - console.error('[ChangeStream] S3 not configured'); + console.error('[ChangeStream] Storage not configured'); return null; } @@ -371,10 +371,10 @@ export class ChangeStreamManager { }); // Subscribe to change events - watcher.changeSubject.subscribe((eventOrEvents: IS3ChangeEvent | IS3ChangeEvent[]) => { + watcher.changeSubject.subscribe((eventOrEvents: IStorageChangeEvent | IStorageChangeEvent[]) => { const events = Array.isArray(eventOrEvents) ? eventOrEvents : [eventOrEvents]; for (const event of events) { - this.handleS3Change(bucket, prefix, event); + this.handleStorageChange(bucket, prefix, event); } }); @@ -382,41 +382,41 @@ export class ChangeStreamManager { await watcher.start(); await watcher.readyDeferred.promise; - console.log(`[ChangeStream] S3 watcher created for ${bucket}${prefix ? '/' + prefix : ''}`); + console.log(`[ChangeStream] Storage watcher created for ${bucket}${prefix ? '/' + prefix : ''}`); return watcher; } catch (error) { - console.error(`[ChangeStream] Failed to create S3 watcher for ${bucket}:`, error); + console.error(`[ChangeStream] Failed to create storage watcher for ${bucket}:`, error); return null; } } /** - * Handle an S3 change event + * Handle a storage change event */ - private handleS3Change(bucket: string, prefix: string | undefined, event: IS3ChangeEvent): void { - const key = this.getS3Key(bucket, prefix); - const entry = this.s3Watchers.get(key); + private handleStorageChange(bucket: string, prefix: string | undefined, event: IStorageChangeEvent): void { + const key = this.getStorageKey(bucket, prefix); + const entry = this.storageWatchers.get(key); if (!entry) return; // Only add to activity buffer if global watchers are NOT active. - // When active, the global S3 watchers already feed the activity stream. + // When active, the global storage watchers already feed the activity stream. if (!this.globalWatchersActive) { - this.addToActivityBuffer('s3', event); + this.addToActivityBuffer('storage', event); } // Push to all subscribed clients - this.pushS3ChangeToClients(key, event); + this.pushStorageChangeToClients(key, event); } /** - * Push S3 change to subscribed clients + * Push storage change to subscribed clients */ - private async pushS3ChangeToClients( + private async pushStorageChangeToClients( key: string, - event: IS3ChangeEvent + event: IStorageChangeEvent ): Promise { - const entry = this.s3Watchers.get(key); + const entry = this.storageWatchers.get(key); if (!entry || !this.typedSocket) return; for (const [connectionId, _sub] of entry.subscriptions) { @@ -426,31 +426,31 @@ export class ChangeStreamManager { }); if (connection) { - const request = this.typedSocket.createTypedRequest( + const request = this.typedSocket.createTypedRequest( 'pushS3Change', connection ); await request.fire({ event }); } } catch (error) { - console.error(`[ChangeStream] Failed to push S3 change to ${connectionId}:`, error); + console.error(`[ChangeStream] Failed to push storage change to ${connectionId}:`, error); } } } /** - * Close an S3 bucket watcher + * Close a storage bucket watcher */ - private async closeS3Watcher(key: string): Promise { - const entry = this.s3Watchers.get(key); + private async closeStorageWatcher(key: string): Promise { + const entry = this.storageWatchers.get(key); if (!entry) return; try { await entry.watcher.stop(); - this.s3Watchers.delete(key); - console.log(`[ChangeStream] S3 watcher closed for ${key}`); + this.storageWatchers.delete(key); + console.log(`[ChangeStream] Storage watcher closed for ${key}`); } catch (error) { - console.error(`[ChangeStream] Error closing S3 watcher for ${key}:`, error); + console.error(`[ChangeStream] Error closing storage watcher for ${key}:`, error); } } @@ -515,11 +515,11 @@ export class ChangeStreamManager { * Add an event to the activity buffer */ private addToActivityBuffer( - source: 'mongodb' | 's3', - event: interfaces.IMongoChangeEvent | IS3ChangeEvent + source: 'mongodb' | 'storage', + event: interfaces.IMongoChangeEvent | IStorageChangeEvent ): void { const activityEvent: interfaces.IActivityEvent = { - id: `evt_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`, + id: `evt_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`, source, event, timestamp: new Date().toISOString(), @@ -567,7 +567,7 @@ export class ChangeStreamManager { /** * Start global watchers when the first activity subscriber connects. - * These watch all MongoDB and S3 activity and feed into the activity buffer. + * These watch all MongoDB and storage activity and feed into the activity buffer. */ private async startGlobalWatchers(): Promise { if (this.globalWatchersActive) return; @@ -577,7 +577,7 @@ export class ChangeStreamManager { await Promise.all([ this.startGlobalMongoWatcher(), - this.startGlobalS3Watchers(), + this.startGlobalStorageWatchers(), ]); } @@ -628,13 +628,13 @@ export class ChangeStreamManager { } /** - * Start S3 bucket watchers — one BucketWatcher per bucket. + * Start storage bucket watchers — one BucketWatcher per bucket. */ - private async startGlobalS3Watchers(): Promise { + private async startGlobalStorageWatchers(): Promise { try { const smartbucket = await this.tsview.getSmartBucket(); if (!smartbucket) { - console.log('[ChangeStream] S3 not configured, skipping global S3 watchers'); + console.log('[ChangeStream] Storage not configured, skipping global storage watchers'); return; } @@ -652,26 +652,26 @@ export class ChangeStreamManager { bufferTimeMs: 500, }); - watcher.changeSubject.subscribe((eventOrEvents: IS3ChangeEvent | IS3ChangeEvent[]) => { + watcher.changeSubject.subscribe((eventOrEvents: IStorageChangeEvent | IStorageChangeEvent[]) => { const events = Array.isArray(eventOrEvents) ? eventOrEvents : [eventOrEvents]; for (const event of events) { - this.addToActivityBuffer('s3', event); + this.addToActivityBuffer('storage', event); } }); await watcher.start(); await watcher.readyDeferred.promise; - this.globalS3Watchers.set(bucketName, watcher); - console.log(`[ChangeStream] Global S3 watcher started for bucket: ${bucketName}`); + this.globalStorageWatchers.set(bucketName, watcher); + console.log(`[ChangeStream] Global storage watcher started for bucket: ${bucketName}`); } catch (bucketError) { - console.error(`[ChangeStream] Failed to start global S3 watcher for bucket ${bucketName}:`, bucketError); + console.error(`[ChangeStream] Failed to start global storage watcher for bucket ${bucketName}:`, bucketError); } } - console.log(`[ChangeStream] Global S3 watchers started (${this.globalS3Watchers.size}/${bucketNames.length} buckets)`); + console.log(`[ChangeStream] Global storage watchers started (${this.globalStorageWatchers.size}/${bucketNames.length} buckets)`); } catch (error) { - console.error('[ChangeStream] Failed to start global S3 watchers:', error); + console.error('[ChangeStream] Failed to start global storage watchers:', error); } } @@ -694,16 +694,16 @@ export class ChangeStreamManager { this.globalMongoWatcher = null; } - // Close all global S3 watchers - for (const [bucketName, watcher] of this.globalS3Watchers) { + // Close all global storage watchers + for (const [bucketName, watcher] of this.globalStorageWatchers) { try { await watcher.stop(); - console.log(`[ChangeStream] Global S3 watcher stopped for bucket: ${bucketName}`); + console.log(`[ChangeStream] Global storage watcher stopped for bucket: ${bucketName}`); } catch (error) { - console.error(`[ChangeStream] Error closing global S3 watcher for ${bucketName}:`, error); + console.error(`[ChangeStream] Error closing global storage watcher for ${bucketName}:`, error); } } - this.globalS3Watchers.clear(); + this.globalStorageWatchers.clear(); this.globalWatchersActive = false; console.log('[ChangeStream] Global watchers stopped'); @@ -729,12 +729,12 @@ export class ChangeStreamManager { } } - // Clean up S3 subscriptions - for (const [key, entry] of this.s3Watchers) { + // Clean up storage subscriptions + for (const [key, entry] of this.storageWatchers) { if (entry.subscriptions.has(connectionId)) { entry.subscriptions.delete(connectionId); if (entry.subscriptions.size === 0) { - await this.closeS3Watcher(key); + await this.closeStorageWatcher(key); } } } @@ -762,9 +762,9 @@ export class ChangeStreamManager { await this.closeMongoWatcher(key); } - // Close all S3 watchers - for (const key of this.s3Watchers.keys()) { - await this.closeS3Watcher(key); + // Close all storage watchers + for (const key of this.storageWatchers.keys()) { + await this.closeStorageWatcher(key); } // Clear activity buffer and subscribers diff --git a/ts/streaming/interfaces.streaming.ts b/ts/streaming/interfaces.streaming.ts index 7c69cf3..acf6b10 100644 --- a/ts/streaming/interfaces.streaming.ts +++ b/ts/streaming/interfaces.streaming.ts @@ -1,7 +1,8 @@ import type * as plugins from '../plugins.js'; -// Re-export S3 change event from smartbucket -export type { IS3ChangeEvent } from '@push.rocks/smartbucket'; +// Re-export storage change event from smartbucket +import type { IStorageChangeEvent } from '@push.rocks/smartbucket'; +export type { IStorageChangeEvent }; /** * MongoDB change event - wraps smartdata watcher output @@ -24,8 +25,8 @@ export interface IMongoChangeEvent { */ export interface IActivityEvent { id: string; - source: 'mongodb' | 's3'; - event: IMongoChangeEvent | import('@push.rocks/smartbucket').IS3ChangeEvent; + source: 'mongodb' | 'storage'; + event: IMongoChangeEvent | IStorageChangeEvent; timestamp: string; } @@ -69,11 +70,11 @@ export interface IReq_UnsubscribeMongo extends plugins.typedrequestInterfaces.im } /** - * Subscribe to S3 bucket/prefix changes + * Subscribe to storage bucket/prefix changes */ -export interface IReq_SubscribeS3 extends plugins.typedrequestInterfaces.implementsTR< +export interface IReq_SubscribeStorage extends plugins.typedrequestInterfaces.implementsTR< plugins.typedrequestInterfaces.ITypedRequest, - IReq_SubscribeS3 + IReq_SubscribeStorage > { method: 'subscribeS3'; request: { @@ -87,11 +88,11 @@ export interface IReq_SubscribeS3 extends plugins.typedrequestInterfaces.impleme } /** - * Unsubscribe from S3 bucket/prefix changes + * Unsubscribe from storage bucket/prefix changes */ -export interface IReq_UnsubscribeS3 extends plugins.typedrequestInterfaces.implementsTR< +export interface IReq_UnsubscribeStorage extends plugins.typedrequestInterfaces.implementsTR< plugins.typedrequestInterfaces.ITypedRequest, - IReq_UnsubscribeS3 + IReq_UnsubscribeStorage > { method: 'unsubscribeS3'; request: { @@ -104,7 +105,7 @@ export interface IReq_UnsubscribeS3 extends plugins.typedrequestInterfaces.imple } /** - * Subscribe to activity stream (all changes from MongoDB and S3) + * Subscribe to activity stream (all changes from MongoDB and storage) */ export interface IReq_SubscribeActivity extends plugins.typedrequestInterfaces.implementsTR< plugins.typedrequestInterfaces.ITypedRequest, @@ -169,15 +170,15 @@ export interface IReq_PushMongoChange extends plugins.typedrequestInterfaces.imp } /** - * Server pushes S3 change to client + * Server pushes storage change to client */ -export interface IReq_PushS3Change extends plugins.typedrequestInterfaces.implementsTR< +export interface IReq_PushStorageChange extends plugins.typedrequestInterfaces.implementsTR< plugins.typedrequestInterfaces.ITypedRequest, - IReq_PushS3Change + IReq_PushStorageChange > { method: 'pushS3Change'; request: { - event: import('@push.rocks/smartbucket').IS3ChangeEvent; + event: IStorageChangeEvent; }; response: { received: boolean; @@ -206,7 +207,7 @@ export interface IReq_PushActivityEvent extends plugins.typedrequestInterfaces.i export interface ISubscriptionTag extends plugins.typedrequestInterfaces.ITag { name: 'subscription'; payload: { - type: 'mongo' | 's3' | 'activity'; + type: 'mongo' | 'storage' | 'activity'; key: string; // e.g., "db/collection" or "bucket/prefix" or "activity" }; } diff --git a/ts/tsview.classes.tsview.ts b/ts/tsview.classes.tsview.ts index 56614c5..273782a 100644 --- a/ts/tsview.classes.tsview.ts +++ b/ts/tsview.classes.tsview.ts @@ -33,8 +33,8 @@ export class TsView { /** * Set S3 configuration programmatically */ - public setS3Config(config: interfaces.IS3Config): void { - this.config.setS3Config(config); + public setStorageConfig(config: interfaces.IStorageConfig): void { + this.config.setStorageConfig(config); } /** @@ -52,17 +52,17 @@ export class TsView { return this.smartbucketInstance; } - const s3Config = this.config.getS3Config(); - if (!s3Config) { + const storageConfig = this.config.getStorageConfig(); + if (!storageConfig) { return null; } this.smartbucketInstance = new plugins.smartbucket.SmartBucket({ - endpoint: s3Config.endpoint, - port: s3Config.port, - accessKey: s3Config.accessKey, - accessSecret: s3Config.accessSecret, - useSsl: s3Config.useSsl ?? true, + endpoint: storageConfig.endpoint, + port: storageConfig.port, + accessKey: storageConfig.accessKey, + accessSecret: storageConfig.accessSecret, + useSsl: storageConfig.useSsl ?? true, }); return this.smartbucketInstance; diff --git a/ts/tsview.cli.ts b/ts/tsview.cli.ts index 7212c16..95ee7c9 100644 --- a/ts/tsview.cli.ts +++ b/ts/tsview.cli.ts @@ -19,7 +19,7 @@ export class TsViewCli { this.smartcli.standardCommand().subscribe(async (argvArg) => { await this.startViewer({ port: argvArg.port as number | undefined, - s3Only: false, + storageOnly: false, mongoOnly: false, }); }); @@ -29,7 +29,7 @@ export class TsViewCli { s3Command.subscribe(async (argvArg) => { await this.startViewer({ port: argvArg.port as number | undefined, - s3Only: true, + storageOnly: true, mongoOnly: false, }); }); @@ -39,7 +39,7 @@ export class TsViewCli { mongoCommand.subscribe(async (argvArg) => { await this.startViewer({ port: argvArg.port as number | undefined, - s3Only: false, + storageOnly: false, mongoOnly: true, }); }); @@ -56,7 +56,7 @@ export class TsViewCli { */ private async startViewer(options: { port?: number; - s3Only: boolean; + storageOnly: boolean; mongoOnly: boolean; }): Promise { console.log('Starting TsView...'); @@ -67,10 +67,10 @@ export class TsViewCli { await viewer.loadConfigFromEnv(); // Check what's configured - const hasS3 = viewer.config.hasS3(); + const hasStorage = viewer.config.hasStorage(); const hasMongo = viewer.config.hasMongo(); - if (!hasS3 && !hasMongo) { + if (!hasStorage && !hasMongo) { console.error('Error: No S3 or MongoDB configuration found.'); console.error('Please create .nogit/env.json with your configuration.'); console.error(''); @@ -87,7 +87,7 @@ export class TsViewCli { process.exit(1); } - if (options.s3Only && !hasS3) { + if (options.storageOnly && !hasStorage) { console.error('Error: S3 configuration not found in .nogit/env.json'); process.exit(1); } @@ -98,7 +98,7 @@ export class TsViewCli { } // Log what's available - if (hasS3) { + if (hasStorage) { console.log('S3 storage configured'); } if (hasMongo) { diff --git a/ts_web/00_commitinfo_data.ts b/ts_web/00_commitinfo_data.ts index c18f4e6..f13e83b 100644 --- a/ts_web/00_commitinfo_data.ts +++ b/ts_web/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@git.zone/tsview', - version: '1.12.0', + version: '1.12.1', description: 'A CLI tool for viewing S3 and MongoDB data with a web UI' } diff --git a/ts_web/adapters/s3-data-provider.ts b/ts_web/adapters/s3-data-provider.ts index 8be3ae8..c3092e8 100644 --- a/ts_web/adapters/s3-data-provider.ts +++ b/ts_web/adapters/s3-data-provider.ts @@ -1,10 +1,10 @@ -import type { IS3DataProvider } from '@design.estate/dees-catalog'; +import type { IStorageDataProvider } from '@design.estate/dees-catalog'; import { apiService } from '../services/index.js'; /** - * Adapter that implements IS3DataProvider by delegating to tsview's ApiService + * Adapter that implements IStorageDataProvider by delegating to tsview's ApiService */ -export class TsviewS3DataProvider implements IS3DataProvider { +export class TsviewS3DataProvider implements IStorageDataProvider { async listObjects(bucket: string, prefix?: string, delimiter?: string) { return apiService.listObjects(bucket, prefix, delimiter); } diff --git a/ts_web/elements/tsview-activity-stream.ts b/ts_web/elements/tsview-activity-stream.ts index 0254e0a..0827753 100644 --- a/ts_web/elements/tsview-activity-stream.ts +++ b/ts_web/elements/tsview-activity-stream.ts @@ -1,10 +1,11 @@ import * as plugins from '../plugins.js'; -import { changeStreamService, type IActivityEvent, type IMongoChangeEvent, type IS3ChangeEvent } from '../services/index.js'; +import { changeStreamService, type IActivityEvent, type IMongoChangeEvent } from '../services/index.js'; +import type { IStorageChangeEvent } from '@design.estate/dees-catalog'; import { themeStyles } from '../styles/index.js'; const { html, css, cssManager, customElement, property, state, DeesElement } = plugins; -type TFilterMode = 'all' | 'mongodb' | 's3'; +type TFilterMode = 'all' | 'mongodb' | 'storage'; @customElement('tsview-activity-stream') export class TsviewActivityStream extends DeesElement { @@ -426,8 +427,8 @@ export class TsviewActivityStream extends DeesElement { const mongoEvent = event.event as IMongoChangeEvent; return `${mongoEvent.database}.${mongoEvent.collection}`; } else { - const s3Event = event.event as IS3ChangeEvent; - return s3Event.bucket; + const storageEvent = event.event as IStorageChangeEvent; + return storageEvent.bucket; } } @@ -439,8 +440,8 @@ export class TsviewActivityStream extends DeesElement { } return ''; } else { - const s3Event = event.event as IS3ChangeEvent; - return s3Event.key; + const storageEvent = event.event as IStorageChangeEvent; + return storageEvent.key; } } @@ -464,12 +465,12 @@ export class TsviewActivityStream extends DeesElement { }) ); } else { - const s3Event = event.event as IS3ChangeEvent; + const storageEvent = event.event as IStorageChangeEvent; this.dispatchEvent( new CustomEvent('navigate-to-s3', { detail: { - bucket: s3Event.bucket, - key: s3Event.key, + bucket: storageEvent.bucket, + key: storageEvent.key, }, bubbles: true, composed: true, @@ -529,8 +530,8 @@ export class TsviewActivityStream extends DeesElement { MongoDB diff --git a/ts_web/elements/tsview-app.ts b/ts_web/elements/tsview-app.ts index 2fba120..554b18a 100644 --- a/ts_web/elements/tsview-app.ts +++ b/ts_web/elements/tsview-app.ts @@ -2,7 +2,7 @@ import * as plugins from '../plugins.js'; import { apiService, changeStreamService } from '../services/index.js'; import { themeStyles } from '../styles/index.js'; import { s3DataProvider } from '../adapters/s3-data-provider.js'; -import type { IS3ChangeEvent } from '@design.estate/dees-catalog'; +import type { IStorageChangeEvent } from '@design.estate/dees-catalog'; const { html, css, cssManager, customElement, state, DeesElement } = plugins; const { DeesContextmenu } = plugins.deesCatalog; @@ -1041,16 +1041,16 @@ export class TsviewApp extends DeesElement { return html`
- void) => { + .onChangeEvent=${(callback: (event: IStorageChangeEvent) => void) => { const sub = changeStreamService .getBucketChanges(this.selectedBucket) .subscribe(callback); return () => sub.unsubscribe(); }} - > + >
`; } diff --git a/ts_web/services/api.service.ts b/ts_web/services/api.service.ts index 2cfb35a..96ec256 100644 --- a/ts_web/services/api.service.ts +++ b/ts_web/services/api.service.ts @@ -1,13 +1,6 @@ import * as plugins from '../plugins.js'; - -// Import interfaces from shared types -// Note: In bundled form these are inlined -export interface IS3Object { - key: string; - size?: number; - lastModified?: string; - isPrefix?: boolean; -} +import type { IStorageObject } from '@design.estate/dees-catalog'; +export type { IStorageObject }; export interface IMongoDatabase { name: string; @@ -100,7 +93,7 @@ export class ApiService { bucketName: string, prefix?: string, delimiter?: string - ): Promise<{ objects: IS3Object[]; prefixes: string[] }> { + ): Promise<{ objects: IStorageObject[]; prefixes: string[] }> { return this.request('listObjects', { bucketName, prefix, delimiter }); } diff --git a/ts_web/services/changestream.service.ts b/ts_web/services/changestream.service.ts index 7f19e84..100c718 100644 --- a/ts_web/services/changestream.service.ts +++ b/ts_web/services/changestream.service.ts @@ -1,4 +1,6 @@ import * as plugins from '../plugins.js'; +import type { IStorageChangeEvent } from '@design.estate/dees-catalog'; +export type { IStorageChangeEvent }; /** * MongoDB change event @@ -16,25 +18,13 @@ export interface IMongoChangeEvent { timestamp: string; } -/** - * S3 change event - */ -export interface IS3ChangeEvent { - type: 'add' | 'modify' | 'delete'; - key: string; - size?: number; - etag?: string; - lastModified?: Date; - bucket: string; -} - /** * Combined activity event */ export interface IActivityEvent { id: string; - source: 'mongodb' | 's3'; - event: IMongoChangeEvent | IS3ChangeEvent; + source: 'mongodb' | 'storage'; + event: IMongoChangeEvent | IStorageChangeEvent; timestamp: string; } @@ -42,7 +32,7 @@ export interface IActivityEvent { * Subscription info tracked by the service */ interface ISubscription { - type: 'mongo' | 's3' | 'activity'; + type: 'mongo' | 'storage' | 'activity'; key: string; // "db/collection" or "bucket/prefix" or "activity" subscriptionId: string; } @@ -69,7 +59,7 @@ export class ChangeStreamService { // RxJS Subjects for UI components public readonly mongoChanges$ = new plugins.smartrx.rxjs.Subject(); - public readonly s3Changes$ = new plugins.smartrx.rxjs.Subject(); + public readonly storageChanges$ = new plugins.smartrx.rxjs.Subject(); public readonly activityEvents$ = new plugins.smartrx.rxjs.Subject(); public readonly connectionStatus$ = new plugins.smartrx.rxjs.ReplaySubject<'connected' | 'disconnected' | 'connecting'>(1); @@ -193,8 +183,8 @@ export class ChangeStreamService { router.addTypedHandler( new plugins.typedrequest.TypedHandler( 'pushS3Change', - async (data: { event: IS3ChangeEvent }) => { - this.s3Changes$.next(data.event); + async (data: { event: IStorageChangeEvent }) => { + this.storageChanges$.next(data.event); return { received: true }; } ) @@ -540,8 +530,8 @@ export class ChangeStreamService { /** * Get S3 changes as an Observable */ - public getS3Changes(): plugins.smartrx.rxjs.Observable { - return this.s3Changes$.asObservable(); + public getStorageChanges(): plugins.smartrx.rxjs.Observable { + return this.storageChanges$.asObservable(); } /** @@ -565,8 +555,8 @@ export class ChangeStreamService { /** * Get filtered S3 changes for a specific bucket/prefix */ - public getBucketChanges(bucket: string, prefix?: string): plugins.smartrx.rxjs.Observable { - return this.s3Changes$.pipe( + public getBucketChanges(bucket: string, prefix?: string): plugins.smartrx.rxjs.Observable { + return this.storageChanges$.pipe( plugins.smartrx.rxjs.ops.filter((event) => { if (event.bucket !== bucket) return false; if (prefix && !event.key.startsWith(prefix)) return false;